<?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>6444</bug_id>
          
          <creation_ts>2006-01-09 00:01:55 -0800</creation_ts>
          <short_desc>loader.* should be split into one file per class</short_desc>
          <delta_ts>2006-01-09 02:09:19 -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>28032</commentid>
    <comment_count>0</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2006-01-09 00:01:55 -0800</bug_when>
    <thetext>loader.* should be split into one file per class

The attached patch does just that.

I used the attached script on &quot;loader.h&quot; to svn copy loader.* to a new file for each of the contained classes.  
Then I went through and manually cleaned up the headers a bit, and stripped down the .cpp files.  Finally I 
got the rest of WebCore back compiling by going through all the other .cpp files and fixing up the 
necessary includes.

This patch not only makes the code *much* easier to read, but also substantially reduces header 
dependencies between files.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>28033</commentid>
    <comment_count>1</comment_count>
      <attachid>5563</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2006-01-09 00:04:12 -0800</bug_when>
    <thetext>Created attachment 5563
my split_header script

Usage: ./split_class.pl mybigfile.h</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>28034</commentid>
    <comment_count>2</comment_count>
      <attachid>5564</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2006-01-09 00:08:52 -0800</bug_when>
    <thetext>Created attachment 5564
Splits loader.* into separate class files</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>5563</attachid>
            <date>2006-01-09 00:04:12 -0800</date>
            <delta_ts>2006-01-09 00:04:12 -0800</delta_ts>
            <desc>my split_header script</desc>
            <filename>split_class.pl</filename>
            <type>text/x-perl-script</type>
            <size>2053</size>
            <attacher name="Eric Seidel (no email)">eric</attacher>
            
              <data encoding="base64">IyEvdXNyL2Jpbi9wZXJsIC13Cgpmb3IgJGZpbGVuYW1lIChAQVJHVikgewoKICAgICRmaWxlbmFt
ZSA9fiBtL14oXHcrKVwuaCQvIG9yIGRpZSAiQ29tbWFuZCBsaW5lIGFyZ3MgbXVzdCBiZSAuaCBm
aWxlcy5cbiI7CiAgICBteSAkYmFzZW5hbWUgPSAkMTsKCiAgICBvcGVuKE9MREZJTEUsICI8Iiwg
JGZpbGVuYW1lKSBvciBkaWUgIkZpbGUgZG9lcyBub3QgZXhpc3Q6ICRmaWxlbmFtZVxuIjsKICAg
IHByaW50ICJTcGxpdHRpbmcgY2xhc3MgJGZpbGVuYW1lLntoLGNwcH06XG4iOwogICAgCiAgICBt
eSAkY3VycmVudENsYXNzTmFtZSA9ICIiOwogICAgbXkgJGNsYXNzSW5kZW50ID0gIiI7CiAgICBt
eSAkZmlsZUNvbnRlbnQgPSAiIjsKICAgIG15ICVjbGFzc0RlZnMgPSAoKTsKICAgIHdoaWxlICht
eSAkbGluZSA9IDxPTERGSUxFPikgewogICAgICAgIGlmICgkY3VycmVudENsYXNzTmFtZSkgewog
ICAgICAgICAgICAkY2xhc3NEZWZzeyRjdXJyZW50Q2xhc3NOYW1lfSAuPSAkbGluZTsKICAgICAg
ICAgICAgaWYgKCRsaW5lID1+IC9eJGNsYXNzSW5kZW50fTtccyokLykgewogICAgICAgICAgICAg
ICAgJGN1cnJlbnRDbGFzc05hbWUgPSAiIjsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7
CiAgICAgICAgICAgIGlmICgkbGluZSA9fiAvXihccyopY2xhc3NccysoXHcrKVxzK1teO10qJC8p
IHsKICAgICAgICAgICAgICAgICRjbGFzc0luZGVudCA9ICQxOwogICAgICAgICAgICAgICAgJGN1
cnJlbnRDbGFzc05hbWUgPSAkMjsKICAgICAgICAgICAgICAgICRjbGFzc0RlZnN7JGN1cnJlbnRD
bGFzc05hbWV9IC49ICRsaW5lOwogICAgICAgICAgICAgICAgJGZpbGVDb250ZW50IC49ICIjIyND
TEFTUyMjIyRjdXJyZW50Q2xhc3NOYW1lXG4iOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAg
ICAgICAgICAgJGZpbGVDb250ZW50IC49ICRsaW5lOwogICAgICAgICAgICB9CiAgICAgICAgfQog
ICAgfQogICAgCiAgICB3aGlsZSAoKCRjbGFzc05hbWUsICRjbGFzc0RlZikgPSBlYWNoKCVjbGFz
c0RlZnMpKSB7CiAgICAgICAgcHJpbnQgIlVzaW5nIFNWTiB0byBjb3B5ICRiYXNlbmFtZS57aCxj
cHB9IHRvICRjbGFzc05hbWUue2gsY3BwfVxuIjsKICAgICAgICAKICAgICAgICBzeXN0ZW0oInN2
biBybSAtLWZvcmNlICRjbGFzc05hbWUuaCIpIGlmICgtciAiJGNsYXNzTmFtZS5oIik7CiAgICAg
ICAgc3lzdGVtICJzdm4gY3AgJGJhc2VuYW1lLmggJGNsYXNzTmFtZS5oIjsKICAgICAgICAKICAg
ICAgICBzeXN0ZW0oInN2biBybSAtLWZvcmNlICRjbGFzc05hbWUuY3BwIikgaWYgKC1yICIkY2xh
c3NOYW1lLmNwcCIpOwogICAgICAgIHN5c3RlbSAic3ZuIGNwICRiYXNlbmFtZS5jcHAgJGNsYXNz
TmFtZS5jcHAiOwogICAgICAgIAogICAgICAgIAogICAgICAgIG9wZW4oTkVXSEVBREVSLCAiPiIs
ICIkY2xhc3NOYW1lLmgiKSBvciBkaWUgIkZpbGUgZG9lcyBub3QgZXhpc3Q6ICRmaWxlbmFtZVxu
IjsKICAgICAgICAKICAgICAgICBwcmludCAiRml4aW5nICRjbGFzc05hbWUuaCBhcyBtdWNoIGFz
IHBvc3NpYmxlLlxuIjsKICAgICAgICBAbGluZXMgPSBzcGxpdCgiXG4iLCAkZmlsZUNvbnRlbnQp
OwogICAgICAgIGZvcmVhY2ggbXkgJGxpbmUgKEBsaW5lcykgewogICAgICAgICAgICBpZiAoJGxp
bmUgPX4gL14jIyNDTEFTUyMjIyhcdyspLykgewogICAgICAgICAgICAgICAgaWYgKCQxIGVxICRj
bGFzc05hbWUpIHsKICAgICAgICAgICAgICAgICAgICBwcmludCBORVdIRUFERVIgJGNsYXNzRGVm
IC4gIlxuIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAg
ICAgICAgIHByaW50IE5FV0hFQURFUiAkbGluZSAuICJcbiI7CiAgICAgICAgICAgIH0KICAgICAg
ICB9CiAgICAgICAgCiAgICAgICAgY2xvc2UoTkVXSEVBREVSKTsKICAgIH0KICAgIAogICAgY2xv
c2UoT0xERklMRSk7CiAgICAKICAgIHByaW50ICJPcGVuaW5nIG5ldyBmaWxlcy4uLlxuIjsKICAg
IHN5c3RlbSgib3BlbiAiIC4gam9pbigiLiogIiwga2V5cyglY2xhc3NEZWZzKSkgLiAiLioiKTsK
fQ==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>5564</attachid>
            <date>2006-01-09 00:08:52 -0800</date>
            <delta_ts>2006-01-09 00:08:52 -0800</delta_ts>
            <desc>Splits loader.* into separate class files</desc>
            <filename>loader.patch</filename>
            <type>text/plain</type>
            <size>831205</size>
            <attacher name="Eric Seidel (no email)">eric</attacher>
            
              <data encoding="base64">SW5kZXg6IGtodG1sX3BhcnQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGtodG1sX3BhcnQuY3BwCShyZXZp
c2lvbiAxMTk0NCkKKysrIGtodG1sX3BhcnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC02OSw2ICs2
OSw5IEBAIHVzaW5nIG5hbWVzcGFjZSBIVE1MTmFtZXM7CiAjaW5jbHVkZSAiZWNtYS94bWxodHRw
cmVxdWVzdC5oIgogI2luY2x1ZGUgImtodG1sX3NldHRpbmdzLmgiCiAjaW5jbHVkZSAia2h0bWxw
YXJ0X3AuaCIKKyNpbmNsdWRlICJDYWNoZS5oIgorI2luY2x1ZGUgIkNhY2hlZENTU1N0eWxlU2hl
ZXQuaCIKKyNpbmNsdWRlICJEb2NMb2FkZXIuaCIKIAogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgog
I2luY2x1ZGUgPGFzc2VydC5oPgpAQCAtODEsOSArODQsNiBAQCB1c2luZyBuYW1lc3BhY2UgSFRN
TE5hbWVzOwogI2luY2x1ZGUgPGtsb2NhbGUuaD4KICNpbmNsdWRlIDxrY2hhcnNldHMuaD4KICNp
bmNsdWRlIDxrZ2xvYmFsc2V0dGluZ3MuaD4KLSNpZiAhZGVmaW5lZChRVF9OT19EUkFHQU5ERFJP
UCkKLSNpbmNsdWRlIDxrbXVsdGlwbGVkcmFnLmg+Ci0jZW5kaWYKIAogI2luY2x1ZGUgPHFmaWxl
Lmg+CiAjaW5jbHVkZSA8cXB0cmxpc3QuaD4KQEAgLTkxLDMwICs5MSw3IEBAIHVzaW5nIG5hbWVz
cGFjZSBIVE1MTmFtZXM7CiAjaW5jbHVkZSA8Q29yZVNlcnZpY2VzL0NvcmVTZXJ2aWNlcy5oPgog
CiB1c2luZyBuYW1lc3BhY2UgRE9NOjpFdmVudE5hbWVzOwotCi11c2luZyBraHRtbDo6QXBwbHlT
dHlsZUNvbW1hbmQ7Ci11c2luZyBraHRtbDo6Q0hBUkFDVEVSOwotdXNpbmcga2h0bWw6OkNoaWxk
RnJhbWU7Ci11c2luZyBraHRtbDo6RGVjb2RlcjsKLXVzaW5nIGtodG1sOjpEb2NMb2FkZXI7Ci11
c2luZyBraHRtbDo6RUFmZmluaXR5OwotdXNpbmcga2h0bWw6OkVkaXRBY3Rpb247Ci11c2luZyBr
aHRtbDo6RWRpdENvbW1hbmRQdHI7Ci11c2luZyBraHRtbDo6RVRleHRHcmFudWxhcml0eTsKLXVz
aW5nIGtodG1sOjpGb3JtRGF0YTsKLXVzaW5nIGtodG1sOjppc0VuZE9mRG9jdW1lbnQ7Ci11c2lu
ZyBraHRtbDo6aXNTdGFydE9mRG9jdW1lbnQ7Ci11c2luZyBraHRtbDo6UEFSQUdSQVBIOwotdXNp
bmcga2h0bWw6OnBsYWluVGV4dDsKLXVzaW5nIGtodG1sOjpSZW5kZXJPYmplY3Q7Ci11c2luZyBr
aHRtbDo6UmVuZGVyVGV4dDsKLXVzaW5nIGtodG1sOjpSZW5kZXJMYXllcjsKLXVzaW5nIGtodG1s
OjpSZW5kZXJXaWRnZXQ7Ci11c2luZyBraHRtbDo6U2VsZWN0aW9uQ29udHJvbGxlcjsKLXVzaW5n
IGtodG1sOjpUb2tlbml6ZXI7Ci11c2luZyBraHRtbDo6VHlwaW5nQ29tbWFuZDsKLXVzaW5nIGto
dG1sOjpWaXNpYmxlUG9zaXRpb247Ci11c2luZyBraHRtbDo6V09SRDsKK3VzaW5nIG5hbWVzcGFj
ZSBraHRtbDsKIAogdXNpbmcgS1BhcnRzOjpCcm93c2VySW50ZXJmYWNlOwogCkluZGV4OiBjc3Mv
Y3NzX3J1bGVpbXBsLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBjc3MvY3NzX3J1bGVpbXBsLmNwcAkocmV2
aXNpb24gMTE5NDMpCisrKyBjc3MvY3NzX3J1bGVpbXBsLmNwcAkod29ya2luZyBjb3B5KQpAQCAt
MzEsNiArMzEsOSBAQAogI2luY2x1ZGUgImNzcy9jc3NfcnVsZWltcGwuaCIKIAogI2luY2x1ZGUg
Im1pc2MvbG9hZGVyLmgiCisjaW5jbHVkZSAiQ2FjaGUuaCIKKyNpbmNsdWRlICJDYWNoZWRDU1NT
dHlsZVNoZWV0LmgiCisjaW5jbHVkZSAiRG9jTG9hZGVyLmgiCiAjaW5jbHVkZSAieG1sL2RvbV9k
b2NpbXBsLmgiCiAKICNpbmNsdWRlIDxrZGVidWcuaD4KSW5kZXg6IGNzcy9jc3NfdmFsdWVpbXBs
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBjc3MvY3NzX3ZhbHVlaW1wbC5jcHAJKHJldmlzaW9uIDExOTQz
KQorKysgY3NzL2Nzc192YWx1ZWltcGwuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zOSw3ICszOSw5
IEBACiAjaW5jbHVkZSAieG1sL2RvbV9kb2NpbXBsLmgiCiAjaW5jbHVkZSAiaHRtbC9odG1sX2Vs
ZW1lbnRpbXBsLmgiCiAKLSNpbmNsdWRlICJtaXNjL2xvYWRlci5oIgorI2luY2x1ZGUgIkNhY2hl
LmgiCisjaW5jbHVkZSAiQ2FjaGVkSW1hZ2UuaCIKKyNpbmNsdWRlICJEb2NMb2FkZXIuaCIKIAog
I2luY2x1ZGUgInJlbmRlcmluZy9mb250LmgiCiAjaW5jbHVkZSAicmVuZGVyaW5nL3JlbmRlcl9z
dHlsZS5oIgpJbmRleDogY3NzL2Nzc19jb21wdXRlZHN0eWxlLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBj
c3MvY3NzX2NvbXB1dGVkc3R5bGUuY3BwCShyZXZpc2lvbiAxMTk0MykKKysrIGNzcy9jc3NfY29t
cHV0ZWRzdHlsZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMwLDcgKzMwLDcgQEAKICNpbmNsdWRl
ICJkb21fc3RyaW5nLmgiCiAjaW5jbHVkZSAiZm9udC5oIgogI2luY2x1ZGUgImtodG1sbGF5b3V0
LmgiCi0jaW5jbHVkZSAibG9hZGVyLmgiCisjaW5jbHVkZSAiQ2FjaGVkSW1hZ2UuaCIKICNpbmNs
dWRlICJyZW5kZXJpbmcvcmVuZGVyX3N0eWxlLmgiCiAjaW5jbHVkZSAicmVuZGVyaW5nL3JlbmRl
cl9vYmplY3QuaCIKIApJbmRleDogY3NzL2Nzc3N0eWxlc2VsZWN0b3IuY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIGNzcy9jc3NzdHlsZXNlbGVjdG9yLmNwcAkocmV2aXNpb24gMTE5NDMpCisrKyBjc3MvY3Nz
c3R5bGVzZWxlY3Rvci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQ0LDYgKzQ0LDcgQEAKICNpbmNs
dWRlICJraHRtbF9zZXR0aW5ncy5oIgogI2luY2x1ZGUgIm1pc2MvaGVscGVyLmgiCiAjaW5jbHVk
ZSAibWlzYy9sb2FkZXIuaCIKKyNpbmNsdWRlICJDYWNoZWRJbWFnZS5oIgogCiAjaW5jbHVkZSAi
cmVuZGVyaW5nL2ZvbnQuaCIKICNpbmNsdWRlICJyZW5kZXJfdGhlbWUuaCIKSW5kZXg6IG1pc2Mv
Q2FjaGVkQ1NTU3R5bGVTaGVldC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIG1pc2MvQ2FjaGVkQ1NTU3R5bGVT
aGVldC5oCShyZXZpc2lvbiAxMTk0OCkKKysrIG1pc2MvQ2FjaGVkQ1NTU3R5bGVTaGVldC5oCSh3
b3JraW5nIGNvcHkpCkBAIC0yMywyMzEgKzIzLDIyIEBACiAgICAgVGhpcyBjbGFzcyBwcm92aWRl
cyBhbGwgZnVuY3Rpb25hbGl0eSBuZWVkZWQgZm9yIGxvYWRpbmcgaW1hZ2VzLCBzdHlsZSBzaGVl
dHMgYW5kIGh0bWwKICAgICBwYWdlcyBmcm9tIHRoZSB3ZWIuIEl0IGhhcyBhIG1lbW9yeSBjYWNo
ZSBmb3IgdGhlc2Ugb2JqZWN0cy4KICovCi0jaWZuZGVmIF9raHRtbF9sb2FkZXJfaAotI2RlZmlu
ZSBfa2h0bWxfbG9hZGVyX2gKKyNpZm5kZWYgS0hUTUxfQ2FjaGVkQ1NTU3R5bGVTaGVldF9oCisj
ZGVmaW5lIEtIVE1MX0NhY2hlZENTU1N0eWxlU2hlZXRfaAogCi0jaWZkZWYgSEFWRV9DT05GSUdf
SAotI2luY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDx0aW1lLmg+Ci0KLSNp
bmNsdWRlICJsb2FkZXJfY2xpZW50LmgiCi0jaWZkZWYgSEFWRV9MSUJKUEVHCi0jaW5jbHVkZSAi
bG9hZGVyX2pwZWcuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8
cXB0cmxpc3QuaD4KLSNpbmNsdWRlIDxxb2JqZWN0Lmg+Ci0jaW5jbHVkZSA8cXB0cmRpY3QuaD4K
LSNpbmNsdWRlIDxxZGljdC5oPgotI2luY2x1ZGUgPHFwaXhtYXAuaD4KLSNpbmNsdWRlIDxxYnVm
ZmVyLmg+Ci0jaW5jbHVkZSA8cXN0cmluZ2xpc3QuaD4KLSNpbmNsdWRlIDxxdGV4dGNvZGVjLmg+
CisjaW5jbHVkZSAiQ2FjaGVkT2JqZWN0LmgiCiAKLSNpbmNsdWRlIDxrdXJsLmg+CiAjaW5jbHVk
ZSA8a2lvL2dsb2JhbC5oPgotCi0jaW5jbHVkZSA8a2h0bWxfc2V0dGluZ3MuaD4KICNpbmNsdWRl
IDxkb20vZG9tX3N0cmluZy5oPgotI2luY2x1ZGUgIkRvY1B0ci5oIgotCi1jbGFzcyBLSFRNTFBh
cnQ7Ci0KLW5hbWVzcGFjZSBLSU8gewotICBjbGFzcyBKb2I7Ci0gIGNsYXNzIFRyYW5zZmVySm9i
OwotfQotCi1uYW1lc3BhY2UgRE9NCi17Ci0gICAgY2xhc3MgQ1NTU3R5bGVTaGVldEltcGw7Ci0g
ICAgY2xhc3MgRG9jdW1lbnRJbXBsOwotfTsKLQotCi1jbGFzcyBLV1FMb2FkZXI7Ci0KLSNpZiBf
X09CSkNfXwotQGNsYXNzIE5TRGF0YTsKLUBjbGFzcyBOU1VSTFJlc3BvbnNlOwotI2Vsc2UKLWNs
YXNzIE5TRGF0YTsKLWNsYXNzIE5TVVJMUmVzcG9uc2U7Ci0jZW5kaWYKIAorY2xhc3MgUUJ1ZmZl
cjsKIAogbmFtZXNwYWNlIGtodG1sCiB7CiAgICAgY2xhc3MgQ2FjaGVkT2JqZWN0OwotICAgIGNs
YXNzIFJlcXVlc3Q7CiAgICAgY2xhc3MgRG9jTG9hZGVyOwogICAgIGNsYXNzIERlY29kZXI7CiAK
LSAjZGVmaW5lIE1BWF9MUlVfTElTVFMgMjAKLSAgICAKLSAgICBzdHJ1Y3QgTFJVTGlzdCB7Ci0g
ICAgICAgIENhY2hlZE9iamVjdCogbV9oZWFkOwotICAgICAgICBDYWNoZWRPYmplY3QqIG1fdGFp
bDsKLSAgICAKLSAgICAgICAgTFJVTGlzdCgpOwotICAgICAgICB+TFJVTGlzdCgpOwotICAgIH07
Ci0gICAgCi0gICAgLyoqCi0gICAgICogQGludGVybmFsCi0gICAgICoKLSAgICAgKiBBIGNhY2hl
ZCBvYmplY3QuIENsYXNzZXMgd2hvIHdhbnQgdG8gdXNlIHRoaXMgb2JqZWN0IHNob3VsZCBkZXJp
dmUKLSAgICAgKiBmcm9tIENhY2hlZE9iamVjdENsaWVudCwgdG8gZ2V0IHRoZSBmdW5jdGlvbiBj
YWxscyBpbiBjYXNlIHRoZSByZXF1ZXN0ZWQgZGF0YSBoYXMgYXJyaXZlZC4KLSAgICAgKgotICAg
ICAqIFRoaXMgY2xhc3MgYWxzbyBkb2VzIHRoZSBhY3R1YWwgY29tbXVuaWNhdGlvbiB3aXRoIGtp
byBhbmQgbG9hZHMgdGhlIGZpbGUuCi0gICAgICovCi0gICAgY2xhc3MgQ2FjaGVkT2JqZWN0Ci0g
ICAgewotICAgIHB1YmxpYzoKLQllbnVtIFR5cGUgewotCSAgICBJbWFnZSwKLQkgICAgQ1NTU3R5
bGVTaGVldCwKLQkgICAgU2NyaXB0Ci0jaWZkZWYgS0hUTUxfWFNMVAotICAgICAgICAgICAgLCBY
U0xTdHlsZVNoZWV0Ci0jZW5kaWYKLSNpZm5kZWYgS0hUTUxfTk9fWEJMCi0gICAgICAgICAgICAs
IFhCTAotI2VuZGlmCi0JfTsKLQotCWVudW0gU3RhdHVzIHsKLQkgICAgTm90Q2FjaGVkLCAgICAv
LyB0aGlzIFVSTCBpcyBub3QgY2FjaGVkCi0JICAgIFVua25vd24sICAgICAgLy8gbGV0IGltYWdl
Y2FjaGUgZGVjaWRlIHdoYXQgdG8gZG8gd2l0aCBpdAotCSAgICBOZXcsICAgICAgICAgIC8vIGlu
c2VydGluZyBuZXcgaW1hZ2UKLSAgICAgICAgUGVuZGluZywgICAgICAvLyBvbmx5IHBhcnRpYWxs
eSBsb2FkZWQKLQkgICAgUGVyc2lzdGVudCwgICAvLyBuZXZlciBkZWxldGUgdGhpcyBwaXhtYXAK
LQkgICAgQ2FjaGVkLCAgICAgICAvLyByZWd1bGFyIGNhc2UKLQkgICAgVW5jYWNoZWFibGUgICAv
LyB0b28gYmlnIHRvIGJlIGNhY2hlZCwKLQl9OyAgCSAgICAgICAgICAvLyB3aWxsIGJlIGRlc3Ry
b3llZCBhcyBzb29uIGFzIHBvc3NpYmxlCi0KLQlDYWNoZWRPYmplY3QoY29uc3QgRE9NOjpET01T
dHJpbmcgJnVybCwgVHlwZSB0eXBlLCBLSU86OkNhY2hlQ29udHJvbCBfY2FjaGVQb2xpY3ksIHRp
bWVfdCBfZXhwaXJlRGF0ZSwgaW50IHNpemUgPSAwKQotCXsKLQkgICAgbV91cmwgPSB1cmw7Ci0J
ICAgIG1fdHlwZSA9IHR5cGU7Ci0JICAgIG1fc3RhdHVzID0gUGVuZGluZzsKLQkgICAgbV9zaXpl
ID0gc2l6ZTsKLQkgICAgbV9mcmVlID0gZmFsc2U7Ci0JICAgIG1fY2FjaGVQb2xpY3kgPSBfY2Fj
aGVQb2xpY3k7Ci0JICAgIG1fcmVxdWVzdCA9IDA7Ci0gICAgICAgIG1fcmVzcG9uc2UgPSAwOwot
ICAgICAgICBtX2FsbERhdGEgPSAwOwotCSAgICBtX2V4cGlyZURhdGUgPSBfZXhwaXJlRGF0ZTsK
LSAgICAgICAgbV9kZWxldGVkID0gZmFsc2U7Ci0gICAgICAgIG1fZXhwaXJlRGF0ZUNoYW5nZWQg
PSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIG1fYWNjZXNzQ291bnQgPSAwOwotICAgICAgICAK
LSAgICAgICAgbV9uZXh0SW5MUlVMaXN0ID0gMDsKLSAgICAgICAgbV9wcmV2SW5MUlVMaXN0ID0g
MDsKLQl9Ci0JdmlydHVhbCB+Q2FjaGVkT2JqZWN0KCk7Ci0KLQl2aXJ0dWFsIHZvaWQgc2V0Q2hh
cnNldCggY29uc3QgUVN0cmluZyAmY2hzICkge30KLQl2aXJ0dWFsIHZvaWQgZGF0YSggUUJ1ZmZl
ciAmYnVmZmVyLCBib29sIGVvZikgPSAwOwotCXZpcnR1YWwgdm9pZCBlcnJvciggaW50IGVyciwg
Y29uc3QgY2hhciAqdGV4dCApID0gMDsKLQotCWNvbnN0IERPTTo6RE9NU3RyaW5nICZ1cmwoKSBj
b25zdCB7IHJldHVybiBtX3VybDsgfQotCVR5cGUgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1fdHlw
ZTsgfQotCi0JdmlydHVhbCB2b2lkIHJlZihDYWNoZWRPYmplY3RDbGllbnQgKmNvbnN1bWVyKTsK
LQl2aXJ0dWFsIHZvaWQgZGVyZWYoQ2FjaGVkT2JqZWN0Q2xpZW50ICpjb25zdW1lcik7Ci0KLQlp
bnQgY291bnQoKSBjb25zdCB7IHJldHVybiBtX2NsaWVudHMuY291bnQoKTsgfQotCi0JU3RhdHVz
IHN0YXR1cygpIGNvbnN0IHsgcmV0dXJuIG1fc3RhdHVzOyB9Ci0KLQlpbnQgc2l6ZSgpIGNvbnN0
IHsgcmV0dXJuIG1fc2l6ZTsgfQotCi0gICAgICAgIGJvb2wgaXNMb2FkZWQoKSBjb25zdCB7IHJl
dHVybiAhbV9sb2FkaW5nOyB9Ci0gICAgICAgIAotICAgICAgICB2aXJ0dWFsIGJvb2wgaXNJbWFn
ZSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0KLSAgICBpbnQgYWNjZXNzQ291bnQoKSBjb25z
dCB7IHJldHVybiBtX2FjY2Vzc0NvdW50OyB9Ci0gICAgdm9pZCBpbmNyZWFzZUFjY2Vzc0NvdW50
KCkgeyBtX2FjY2Vzc0NvdW50Kys7IH0KLSAgICAKLQkvKioKLQkgKiBjb21wdXRlcyB0aGUgc3Rh
dHVzIG9mIGFuIG9iamVjdCBhZnRlciBsb2FkaW5nLgotCSAqIHRoZSByZXN1bHQgZGVwZW5kcyBv
biB0aGUgb2JqZWN0cyBzaXplIGFuZCB0aGUgc2l6ZSBvZiB0aGUgY2FjaGUKLQkgKiBhbHNvIHVw
ZGF0ZXMgdGhlIGV4cGlyZSBkYXRlIG9uIHRoZSBjYWNoZSBlbnRyeSBmaWxlCi0JICovCi0Jdm9p
ZCBmaW5pc2goKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIGJ5IHRoZSBjYWNo
ZSBpZiB0aGUgb2JqZWN0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgY2FjaGUgZGljdAotICAg
ICAgICAgKiB3aGlsZSBzdGlsbCBiZWluZyByZWZlcmVuY2VkLiBUaGlzIG1lYW5zIHRoZSBvYmpl
Y3Qgc2hvdWxkIGtpbGwgaXRzZWxmCi0gICAgICAgICAqIGlmIGl0cyByZWZlcmVuY2UgY291bnRl
ciBkcm9wcyBkb3duIHRvIHplcm8uCi0gICAgICAgICAqLwotICAgICAgICB2b2lkIHNldEZyZWUo
IGJvb2wgYiApIHsgbV9mcmVlID0gYjsgfQotCi0gICAgICAgIEtJTzo6Q2FjaGVDb250cm9sIGNh
Y2hlUG9saWN5KCkgY29uc3QgeyByZXR1cm4gbV9jYWNoZVBvbGljeTsgfQotCi0gICAgICAgIHZv
aWQgc2V0UmVxdWVzdChSZXF1ZXN0ICpfcmVxdWVzdCk7Ci0KLSAgICAgICAgTlNVUkxSZXNwb25z
ZSAqcmVzcG9uc2UoKSBjb25zdCB7IHJldHVybiBtX3Jlc3BvbnNlOyB9Ci0gICAgICAgIHZvaWQg
c2V0UmVzcG9uc2UoTlNVUkxSZXNwb25zZSAqcmVzcG9uc2UpOwotICAgICAgICBOU0RhdGEgKmFs
bERhdGEoKSBjb25zdCB7IHJldHVybiBtX2FsbERhdGE7IH0KLSAgICAgICAgdm9pZCBzZXRBbGxE
YXRhIChOU0RhdGEgKmRhdGEpOwotCi0gICAgICAgIGJvb2wgY2FuRGVsZXRlKCkgY29uc3QgeyBy
ZXR1cm4gKG1fY2xpZW50cy5jb3VudCgpID09IDAgJiYgIW1fcmVxdWVzdCk7IH0KLQotCXZvaWQg
c2V0RXhwaXJlRGF0ZSh0aW1lX3QgX2V4cGlyZURhdGUsIGJvb2wgY2hhbmdlSHR0cENhY2hlKTsK
LQkKLQlib29sIGlzRXhwaXJlZCgpIGNvbnN0OwotCi0gICAgICAgIHZpcnR1YWwgYm9vbCBzY2hl
ZHVsZSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAq
IExpc3Qgb2YgYWNjZXB0YWJsZSBtaW1ldHlwZXMgc2VwZXJhdGVkIGJ5ICIsIi4gQSBtaW1ldHlw
ZSBtYXkgY29udGFpbiBhIHdpbGRjYXJkLgotICAgICAgICAgKi8KLSAgICAgICAgLy8gZS5nLiAi
dGV4dC8qIgotICAgICAgICBRU3RyaW5nIGFjY2VwdCgpIGNvbnN0IHsgcmV0dXJuIG1fYWNjZXB0
OyB9Ci0gICAgICAgIHZvaWQgc2V0QWNjZXB0KGNvbnN0IFFTdHJpbmcgJl9hY2NlcHQpIHsgbV9h
Y2NlcHQgPSBfYWNjZXB0OyB9Ci0KLSAgICBwcm90ZWN0ZWQ6Ci0gICAgICAgIHZvaWQgc2V0U2l6
ZShpbnQgc2l6ZSk7Ci0gICAgICAgIAotICAgICAgICBRUHRyRGljdDxDYWNoZWRPYmplY3RDbGll
bnQ+IG1fY2xpZW50czsKLQotCURPTTo6RE9NU3RyaW5nIG1fdXJsOwotICAgICAgICBRU3RyaW5n
IG1fYWNjZXB0OwotICAgICAgICBSZXF1ZXN0ICptX3JlcXVlc3Q7Ci0gICAgICAgIE5TVVJMUmVz
cG9uc2UgKm1fcmVzcG9uc2U7Ci0gICAgICAgIE5TRGF0YSAqbV9hbGxEYXRhOwotCVR5cGUgbV90
eXBlOwotCVN0YXR1cyBtX3N0YXR1czsKLSAgICBwcml2YXRlOgotCWludCBtX3NpemU7Ci0gICAg
aW50IG1fYWNjZXNzQ291bnQ7Ci0gICAgCi0gICAgcHJvdGVjdGVkOgotCXRpbWVfdCBtX2V4cGly
ZURhdGU7Ci0JS0lPOjpDYWNoZUNvbnRyb2wgbV9jYWNoZVBvbGljeTsKLSAgICAgICAgYm9vbCBt
X2ZyZWUgOiAxOwotICAgICAgICBib29sIG1fZGVsZXRlZCA6IDE7Ci0gICAgICAgIGJvb2wgbV9s
b2FkaW5nIDogMTsKLSAgICAgICAgYm9vbCBtX2V4cGlyZURhdGVDaGFuZ2VkIDogMTsKLSAgICAK
LSAgICBwcml2YXRlOgotICAgICAgICBib29sIGFsbG93SW5MUlVMaXN0KCkgeyByZXR1cm4gY2Fu
RGVsZXRlKCkgJiYgc3RhdHVzKCkgIT0gUGVyc2lzdGVudDsgfQotICAgICAgICAKLSAgICAgICAg
Q2FjaGVkT2JqZWN0ICptX25leHRJbkxSVUxpc3Q7Ci0gICAgICAgIENhY2hlZE9iamVjdCAqbV9w
cmV2SW5MUlVMaXN0OwotICAgICAgICBmcmllbmQgY2xhc3MgQ2FjaGU7Ci0gICAgfTsKLQotCi0g
ICAgLyoqCi0gICAgICogYSBjYWNoZWQgc3R5bGUgc2hlZXQKLSAgICAgKi8KICAgICBjbGFzcyBD
YWNoZWRDU1NTdHlsZVNoZWV0IDogcHVibGljIENhY2hlZE9iamVjdAogICAgIHsKICAgICBwdWJs
aWM6CkBAIC0yNzMsNDQxICs2NCw2IEBAIG5hbWVzcGFjZSBraHRtbAogICAgICAgICBRVGV4dENv
ZGVjKiBtX2NvZGVjOwogICAgIH07CiAKLSAgICAvKioKLSAgICAgKiBhIGNhY2hlZCBzY3JpcHQK
LSAgICAgKi8KLSAgICBjbGFzcyBDYWNoZWRTY3JpcHQgOiBwdWJsaWMgQ2FjaGVkT2JqZWN0Ci0g
ICAgewotICAgIHB1YmxpYzoKLQlDYWNoZWRTY3JpcHQoRG9jTG9hZGVyKiBkbCwgY29uc3QgRE9N
OjpET01TdHJpbmcgJnVybCwgS0lPOjpDYWNoZUNvbnRyb2wgY2FjaGVQb2xpY3ksIHRpbWVfdCBf
ZXhwaXJlRGF0ZSwgY29uc3QgUVN0cmluZyYgY2hhcnNldCk7Ci0JQ2FjaGVkU2NyaXB0KGNvbnN0
IERPTTo6RE9NU3RyaW5nICZ1cmwsIGNvbnN0IFFTdHJpbmcgJnNjcmlwdF9kYXRhKTsKLQl2aXJ0
dWFsIH5DYWNoZWRTY3JpcHQoKTsKLQotCWNvbnN0IERPTTo6RE9NU3RyaW5nICZzY3JpcHQoKSBj
b25zdCB7IHJldHVybiBtX3NjcmlwdDsgfQotCi0JdmlydHVhbCB2b2lkIHJlZihDYWNoZWRPYmpl
Y3RDbGllbnQgKmNvbnN1bWVyKTsKLQl2aXJ0dWFsIHZvaWQgZGVyZWYoQ2FjaGVkT2JqZWN0Q2xp
ZW50ICpjb25zdW1lcik7Ci0KLSAgICAgICAgdmlydHVhbCB2b2lkIHNldENoYXJzZXQoIGNvbnN0
IFFTdHJpbmcgJmNocyApOwotCXZpcnR1YWwgdm9pZCBkYXRhKCBRQnVmZmVyICZidWZmZXIsIGJv
b2wgZW9mICk7Ci0JdmlydHVhbCB2b2lkIGVycm9yKCBpbnQgZXJyLCBjb25zdCBjaGFyICp0ZXh0
ICk7Ci0KLSAgICAgICAgdmlydHVhbCBib29sIHNjaGVkdWxlKCkgY29uc3QgeyByZXR1cm4gZmFs
c2U7IH0KLSAgICAgICAgCi0gICAgICAgIGJvb2wgZXJyb3JPY2N1cnJlZCgpIGNvbnN0IHsgcmV0
dXJuIG1fZXJyb3JPY2N1cnJlZDsgfQotCi0Jdm9pZCBjaGVja05vdGlmeSgpOwotCi0gICAgcHJv
dGVjdGVkOgotCURPTTo6RE9NU3RyaW5nIG1fc2NyaXB0OwotICAgICAgICBRVGV4dENvZGVjKiBt
X2NvZGVjOwotICAgICAgICBib29sIG1fZXJyb3JPY2N1cnJlZDsKLSAgICB9OwotCi0gICAgY2xh
c3MgSW1hZ2VTb3VyY2U7Ci0KLSAgICBjbGFzcyBDYWNoZWRJbWFnZTsKLSAgICAKLSAgICBjbGFz
cyBDYWNoZWRJbWFnZUNhbGxiYWNrCi0gICAgewotICAgIHB1YmxpYzoKLSAgICAgICAgQ2FjaGVk
SW1hZ2VDYWxsYmFjayAoQ2FjaGVkSW1hZ2UgKmMpIDogY2FjaGVkSW1hZ2UoYyksIHJlZkNvdW50
KDEpLCBoZWFkZXJSZWNlaXZlZChmYWxzZSkge307Ci0KLSAgICAgICAgdm9pZCByZWYoKSB7IHJl
ZkNvdW50Kys7IH0KLSAgICAgICAgdm9pZCBkZXJlZigpIHsgaWYgKC0tcmVmQ291bnQgPT0gMCkg
ZGVsZXRlIHRoaXM7IH0KLSAgICAgICAgCi0gICAgICAgIHZvaWQgbm90aWZ5VXBkYXRlKCk7Ci0g
ICAgICAgIHZvaWQgbm90aWZ5RmluaXNoZWQoKTsKLSAgICAgICAgdm9pZCBub3RpZnlEZWNvZGlu
Z0Vycm9yKCk7Ci0gICAgICAgIHZvaWQgY2xlYXIoKTsKLSAgICAgICAgdm9pZCBoYW5kbGVFcnJv
cigpOwotICAgICAgICAKLSAgICBwcml2YXRlOgotICAgICAgICBDYWNoZWRJbWFnZSAqY2FjaGVk
SW1hZ2U7Ci0gICAgICAgIHVpbnQgcmVmQ291bnQ7Ci0JYm9vbCBoZWFkZXJSZWNlaXZlZDsKLSAg
ICB9OwotICAgICAgICAKLSAgICAvKioKLSAgICAgKiBhIGNhY2hlZCBpbWFnZQotICAgICAqLwot
ICAgIGNsYXNzIENhY2hlZEltYWdlIDogcHVibGljIFFPYmplY3QsIHB1YmxpYyBDYWNoZWRPYmpl
Y3QKLSAgICB7Ci0JUV9PQkpFQ1QKLSAgICBwdWJsaWM6Ci0JQ2FjaGVkSW1hZ2UoRG9jTG9hZGVy
KiBkbCwgY29uc3QgRE9NOjpET01TdHJpbmcgJnVybCwgS0lPOjpDYWNoZUNvbnRyb2wgY2FjaGVQ
b2xpY3ksIHRpbWVfdCBfZXhwaXJlRGF0ZSk7Ci0JdmlydHVhbCB+Q2FjaGVkSW1hZ2UoKTsKLQot
CWNvbnN0IFFQaXhtYXAgJnBpeG1hcCgpIGNvbnN0OwotCWNvbnN0IFFQaXhtYXAgJnRpbGVkX3Bp
eG1hcChjb25zdCBRQ29sb3ImIGJnKTsKLQotICAgICAgICBRU2l6ZSBwaXhtYXBfc2l6ZSgpIGNv
bnN0OyAgICAvLyByZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBjb21wbGV0ZSAoaS5lLiB3aGVuIGZp
bmlzaGVkKSBsb2FkaW5nCi0gICAgICAgIFFSZWN0IHZhbGlkX3JlY3QoKSBjb25zdDsgICAgIC8v
IHJldHVybnMgdGhlIHJlY3RhbmdsZSBvZiBwaXhtYXAgdGhhdCBoYXMgYmVlbiBsb2FkZWQgYWxy
ZWFkeQotCi0gICAgICAgIHZvaWQgcmVmKENhY2hlZE9iamVjdENsaWVudCAqY29uc3VtZXIpOwot
CXZpcnR1YWwgdm9pZCBkZXJlZihDYWNoZWRPYmplY3RDbGllbnQgKmNvbnN1bWVyKTsKLQotCXZp
cnR1YWwgdm9pZCBkYXRhKCBRQnVmZmVyICZidWZmZXIsIGJvb2wgZW9mICk7Ci0JdmlydHVhbCB2
b2lkIGVycm9yKCBpbnQgZXJyLCBjb25zdCBjaGFyICp0ZXh0ICk7Ci0KLSAgICAgICAgYm9vbCBp
c1RyYW5zcGFyZW50KCkgY29uc3QgeyByZXR1cm4gaXNGdWxseVRyYW5zcGFyZW50OyB9Ci0gICAg
ICAgIGJvb2wgaXNFcnJvckltYWdlKCkgY29uc3QgeyByZXR1cm4gZXJyb3JPY2N1cmVkOyB9Ci0K
LSAgICAgICAgdm9pZCBzZXRTaG93QW5pbWF0aW9ucyggS0hUTUxTZXR0aW5nczo6S0FuaW1hdGlv
bkFkdmljZSApOwotCi0gICAgICAgIHZpcnR1YWwgYm9vbCBzY2hlZHVsZSgpIGNvbnN0IHsgcmV0
dXJuIHRydWU7IH0KLQotCXZvaWQgY2hlY2tOb3RpZnkoKTsKLSAgICAgICAgCi0gICAgICAgIHZp
cnR1YWwgYm9vbCBpc0ltYWdlKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotCi0Jdm9pZCBjbGVh
cigpOwotICAgICAgICAKLSAgICBwcml2YXRlOgotICAgICAgICB2b2lkIGRvX25vdGlmeShjb25z
dCBRUGl4bWFwJiBwLCBjb25zdCBRUmVjdCYgcik7Ci0KLSAgICAgICAgUVBpeG1hcCogcDsKLQlR
UGl4bWFwKiBiZzsKLSAgICAgICAgUVJnYiBiZ0NvbG9yOwotICAgICAgICBtdXRhYmxlIFFQaXht
YXAqIHBpeFBhcnQ7Ci0KLSAgICAgICAgSW1hZ2VTb3VyY2UqIGltZ1NvdXJjZTsKLSAgICAgICAg
Y29uc3QgY2hhciogZm9ybWF0VHlwZTsgIC8vIElzIHRoZSBuYW1lIG9mIHRoZSBtb3ZpZSBmb3Jt
YXQgdHlwZQotCi0JaW50IHdpZHRoOwotCWludCBoZWlnaHQ7Ci0KLQkvLyBJcyBzZXQgaWYgbW92
aWUgZm9ybWF0IHR5cGUgKCBpbmNyZW1lbnRhbC9hbmltYXRpb24pIHdhcyBjaGVja2VkCi0JYm9v
bCB0eXBlQ2hlY2tlZCA6IDE7Ci0gICAgICAgIGJvb2wgaXNGdWxseVRyYW5zcGFyZW50IDogMTsK
LSAgICAgICAgYm9vbCBlcnJvck9jY3VyZWQgOiAxOwotICAgICAgICBib29sIG1vbm9jaHJvbWUg
OiAxOwotICAgICAgICBLSFRNTFNldHRpbmdzOjpLQW5pbWF0aW9uQWR2aWNlIG1fc2hvd0FuaW1h
dGlvbnMgOiAyOwotCi0gICAgICAgIGZyaWVuZCBjbGFzcyBDYWNoZTsKLQotICAgIHB1YmxpYzoK
LSAgICAgICAgaW50IGRhdGFTaXplKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhU2l6ZTsgfQotCUNh
Y2hlZEltYWdlQ2FsbGJhY2sgKmRlY29kZXJDYWxsYmFjaygpIGNvbnN0IHsgcmV0dXJuIG1fZGVj
b2RlckNhbGxiYWNrOyB9Ci0gICAgcHJpdmF0ZToKLSAgICAgICAgZnJpZW5kIGNsYXNzIENhY2hl
ZEltYWdlQ2FsbGJhY2s7Ci0gICAgICAgIAotICAgICAgICBpbnQgbV9kYXRhU2l6ZTsKLSAgICAg
ICAgQ2FjaGVkSW1hZ2VDYWxsYmFjayAqbV9kZWNvZGVyQ2FsbGJhY2s7Ci0gICAgfTsKLQotI2lm
ZGVmIEtIVE1MX1hTTFQKLSAgICBjbGFzcyBDYWNoZWRYU0xTdHlsZVNoZWV0IDogcHVibGljIENh
Y2hlZE9iamVjdAotICAgIHsKLXB1YmxpYzoKLSAgICAgICAgQ2FjaGVkWFNMU3R5bGVTaGVldChE
b2NMb2FkZXIqIGRsLCBjb25zdCBET006OkRPTVN0cmluZyAmdXJsLCBLSU86OkNhY2hlQ29udHJv
bCBjYWNoZVBvbGljeSwgdGltZV90IF9leHBpcmVEYXRlKTsKLQotICAgICAgICBjb25zdCBET006
OkRPTVN0cmluZyYgc2hlZXQoKSBjb25zdCB7IHJldHVybiBtX3NoZWV0OyB9Ci0gICAgICAgIAot
ICAgICAgICB2aXJ0dWFsIHZvaWQgcmVmKENhY2hlZE9iamVjdENsaWVudCAqY29uc3VtZXIpOwot
ICAgICAgICB2aXJ0dWFsIHZvaWQgZGVyZWYoQ2FjaGVkT2JqZWN0Q2xpZW50ICpjb25zdW1lcik7
Ci0gICAgICAgIAotICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0Q2hhcnNldChjb25zdCBRU3RyaW5n
ICZjaHMpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgZGF0YShRQnVmZmVyICZidWZmZXIsIGJvb2wg
ZW9mKTsKLSAgICAgICAgdmlydHVhbCB2b2lkIGVycm9yKGludCBlcnIsIGNvbnN0IGNoYXIgKnRl
eHQpOwotICAgICAgICAKLSAgICAgICAgdmlydHVhbCBib29sIHNjaGVkdWxlKCkgY29uc3QgeyBy
ZXR1cm4gdHJ1ZTsgfQotICAgICAgICAKLSAgICAgICAgdm9pZCBjaGVja05vdGlmeSgpOwotICAg
ICAgICAKLXByb3RlY3RlZDoKLSAgICAgICAgRE9NOjpET01TdHJpbmcgbV9zaGVldDsKLSAgICAg
ICAgUmVmUHRyPERlY29kZXI+IG1fZGVjb2RlcjsKLSAgICB9OwotI2VuZGlmCi0gICAgCi0jaWZu
ZGVmIEtIVE1MX05PX1hCTAotICAgIGNsYXNzIENhY2hlZFhCTERvY3VtZW50IDogcHVibGljIENh
Y2hlZE9iamVjdAotICAgIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIENhY2hlZFhCTERvY3VtZW50
KERvY0xvYWRlciogZGwsIGNvbnN0IERPTTo6RE9NU3RyaW5nICZ1cmwsIEtJTzo6Q2FjaGVDb250
cm9sIGNhY2hlUG9saWN5LCB0aW1lX3QgX2V4cGlyZURhdGUpOwotICAgICAgICB2aXJ0dWFsIH5D
YWNoZWRYQkxEb2N1bWVudCgpOwotICAgICAgICAKLSAgICAgICAgWEJMOjpYQkxEb2N1bWVudElt
cGwqIGRvY3VtZW50KCkgY29uc3QgeyByZXR1cm4gbV9kb2N1bWVudDsgfQotICAgICAgICAKLSAg
ICAgICAgdmlydHVhbCB2b2lkIHJlZihDYWNoZWRPYmplY3RDbGllbnQgKmNvbnN1bWVyKTsKLSAg
ICAgICAgdmlydHVhbCB2b2lkIGRlcmVmKENhY2hlZE9iamVjdENsaWVudCAqY29uc3VtZXIpOwot
ICAgICAgICAKLSAgICAgICAgdmlydHVhbCB2b2lkIHNldENoYXJzZXQoIGNvbnN0IFFTdHJpbmcg
JmNocyApOwotICAgICAgICB2aXJ0dWFsIHZvaWQgZGF0YSggUUJ1ZmZlciAmYnVmZmVyLCBib29s
IGVvZiApOwotICAgICAgICB2aXJ0dWFsIHZvaWQgZXJyb3IoIGludCBlcnIsIGNvbnN0IGNoYXIg
KnRleHQgKTsKLSAgICAgICAgCi0gICAgICAgIHZpcnR1YWwgYm9vbCBzY2hlZHVsZSgpIGNvbnN0
IHsgcmV0dXJuIHRydWU7IH0KLSAgICAgICAgCi0gICAgICAgIHZvaWQgY2hlY2tOb3RpZnkoKTsK
LSAgICAgICAgCi1wcm90ZWN0ZWQ6Ci0gICAgICAgIFhCTDo6WEJMRG9jdW1lbnRJbXBsKiBtX2Rv
Y3VtZW50OwotICAgICAgICBSZWZQdHI8RGVjb2Rlcj4gbV9kZWNvZGVyOwotICAgIH07Ci0jZW5k
aWYKLQotICAgIC8qKgotICAgICAqIEBpbnRlcm5hbAotICAgICAqCi0gICAgICogTWFuYWdlcyB0
aGUgbG9hZGluZyBvZiBzY3JpcHRzL2ltYWdlcy9zdHlsZXNoZWV0cyBmb3IgYSBwYXJ0aWN1bGFy
IGRvY3VtZW50Ci0gICAgICovCi0gICAgY2xhc3MgRG9jTG9hZGVyCi0gICAgewotICAgIHB1Ymxp
YzoKLSAJRG9jTG9hZGVyKEtIVE1MUGFydCosIERPTTo6RG9jdW1lbnRJbXBsKik7Ci0gCX5Eb2NM
b2FkZXIoKTsKLQotCUNhY2hlZEltYWdlICpyZXF1ZXN0SW1hZ2UoIGNvbnN0IERPTTo6RE9NU3Ry
aW5nICZ1cmwpOwotCUNhY2hlZENTU1N0eWxlU2hlZXQgKnJlcXVlc3RTdHlsZVNoZWV0KCBjb25z
dCBET006OkRPTVN0cmluZyAmdXJsLCBjb25zdCBRU3RyaW5nJiBjaGFyc2V0KTsKLSAgICAgICAg
Q2FjaGVkU2NyaXB0ICpyZXF1ZXN0U2NyaXB0KCBjb25zdCBET006OkRPTVN0cmluZyAmdXJsLCBj
b25zdCBRU3RyaW5nJiBjaGFyc2V0KTsKLQotI2lmZGVmIEtIVE1MX1hTTFQKLSAgICAgICAgQ2Fj
aGVkWFNMU3R5bGVTaGVldCogcmVxdWVzdFhTTFN0eWxlU2hlZXQoY29uc3QgRE9NOjpET01TdHJp
bmcmIHVybCk7Ci0jZW5kaWYKLSNpZm5kZWYgS0hUTUxfTk9fWEJMCi0gICAgICAgIENhY2hlZFhC
TERvY3VtZW50KiByZXF1ZXN0WEJMRG9jdW1lbnQoY29uc3QgRE9NOjpET01TdHJpbmcgJnVybCk7
Ci0jZW5kaWYKLQotCWJvb2wgYXV0b2xvYWRJbWFnZXMoKSBjb25zdCB7IHJldHVybiBtX2JhdXRv
bG9hZEltYWdlczsgfQotICAgICAgICBLSU86OkNhY2hlQ29udHJvbCBjYWNoZVBvbGljeSgpIGNv
bnN0IHsgcmV0dXJuIG1fY2FjaGVQb2xpY3k7IH0KLSAgICAgICAgS0hUTUxTZXR0aW5nczo6S0Fu
aW1hdGlvbkFkdmljZSBzaG93QW5pbWF0aW9ucygpIGNvbnN0IHsgcmV0dXJuIG1fc2hvd0FuaW1h
dGlvbnM7IH0KLSAgICAgICAgdGltZV90IGV4cGlyZURhdGUoKSBjb25zdCB7IHJldHVybiBtX2V4
cGlyZURhdGU7IH0KLSAgICAgICAgS0hUTUxQYXJ0KiBwYXJ0KCkgY29uc3QgeyByZXR1cm4gbV9w
YXJ0OyB9Ci0gICAgICAgIERPTTo6RG9jdW1lbnRJbXBsKiBkb2MoKSBjb25zdCB7IHJldHVybiBt
X2RvYzsgfQotCi0gICAgICAgIHZvaWQgc2V0RXhwaXJlRGF0ZSggdGltZV90ICk7Ci0gICAgICAg
IHZvaWQgc2V0QXV0b2xvYWRJbWFnZXMoIGJvb2wgKTsKLSAgICAgICAgdm9pZCBzZXRDYWNoZVBv
bGljeSggS0lPOjpDYWNoZUNvbnRyb2wgY2FjaGVQb2xpY3kgKTsKLSAgICAgICAgdm9pZCBzZXRT
aG93QW5pbWF0aW9ucyggS0hUTUxTZXR0aW5nczo6S0FuaW1hdGlvbkFkdmljZSApOwotICAgICAg
ICB2b2lkIHJlbW92ZUNhY2hlZE9iamVjdCggQ2FjaGVkT2JqZWN0KikgY29uc3Q7Ci0JCQotICAg
ICAgICB2b2lkIHNldExvYWRJblByb2dyZXNzKGJvb2wpOwotICAgICAgICBib29sIGxvYWRJblBy
b2dyZXNzKCkgY29uc3QgeyByZXR1cm4gbV9sb2FkSW5Qcm9ncmVzczsgfQotCi0gICAgcHJpdmF0
ZToKLSAgICAgICAgYm9vbCBuZWVkUmVsb2FkKGNvbnN0IEtVUkwgJmZ1bGxVcmwpOwotCi0gICAg
ICAgIGZyaWVuZCBjbGFzcyBDYWNoZTsKLSAgICAgICAgZnJpZW5kIGNsYXNzIERPTTo6RG9jdW1l
bnRJbXBsOwotCi0gICAgICAgIFFTdHJpbmdMaXN0IG1fcmVsb2FkZWRVUkxzOwotICAgICAgICBt
dXRhYmxlIFFQdHJMaXN0PENhY2hlZE9iamVjdD4gbV9kb2NPYmplY3RzOwotCXRpbWVfdCBtX2V4
cGlyZURhdGU7Ci0JS0lPOjpDYWNoZUNvbnRyb2wgbV9jYWNoZVBvbGljeTsKLSAgICAgICAgYm9v
bCBtX2JhdXRvbG9hZEltYWdlcyA6IDE7Ci0gICAgICAgIEtIVE1MU2V0dGluZ3M6OktBbmltYXRp
b25BZHZpY2UgbV9zaG93QW5pbWF0aW9ucyA6IDI7Ci0gICAgICAgIEtIVE1MUGFydCogbV9wYXJ0
OwotICAgICAgICBET006OkRvY3VtZW50SW1wbCAqbV9kb2M7Ci0gICAgICAgIGJvb2wgbV9sb2Fk
SW5Qcm9ncmVzczsKLSAgICB9OwotCi0gICAgLyoqCi0gICAgICogQGludGVybmFsCi0gICAgICov
Ci0gICAgY2xhc3MgUmVxdWVzdAotICAgIHsKLSAgICBwdWJsaWM6Ci0JUmVxdWVzdChEb2NMb2Fk
ZXIqIGRsLCBDYWNoZWRPYmplY3QgKl9vYmplY3QsIGJvb2wgX2luY3JlbWVudGFsKTsKLQl+UmVx
dWVzdCgpOwotCWJvb2wgaW5jcmVtZW50YWw7Ci0JUUJ1ZmZlciBtX2J1ZmZlcjsKLQlDYWNoZWRP
YmplY3QgKm9iamVjdDsKLSAgICAgICAgRG9jTG9hZGVyKiBtX2RvY0xvYWRlcjsKLSAgICAgICAg
Ym9vbCBtdWx0aXBhcnQ7Ci0gICAgIH07Ci0KLSAgICAvKioKLSAgICAgKiBAaW50ZXJuYWwKLSAg
ICAgKi8KLSAgICBjbGFzcyBMb2FkZXIgOiBwdWJsaWMgUU9iamVjdAotICAgIHsKLQlRX09CSkVD
VAotCi0gICAgcHVibGljOgkKLQlMb2FkZXIoKTsKLQl+TG9hZGVyKCk7Ci0KLQl2b2lkIGxvYWQo
RG9jTG9hZGVyKiBkbCwgQ2FjaGVkT2JqZWN0ICpvYmplY3QsIGJvb2wgaW5jcmVtZW50YWwgPSB0
cnVlKTsKLQotICAgICAgICBpbnQgbnVtUmVxdWVzdHMoIERvY0xvYWRlciogZGwgKSBjb25zdDsK
LSAgICAgICAgdm9pZCBjYW5jZWxSZXF1ZXN0cyggRG9jTG9hZGVyKiBkbCApOwotCi0Jdm9pZCBy
ZW1vdmVCYWNrZ3JvdW5kRGVjb2RpbmdSZXF1ZXN0IChSZXF1ZXN0ICpyKTsKLQkKLSAgICAgICAg
Ly8gbWF5IHJldHVybiAwTAotICAgICAgICBLSU86OkpvYiAqam9iRm9yUmVxdWVzdCggY29uc3Qg
RE9NOjpET01TdHJpbmcgJnVybCApIGNvbnN0OwotCi0gICAgICAgIEtXUUxvYWRlciAqa3dxOwot
Ci0gICAgc2lnbmFsczoKLQlmcmllbmQgY2xhc3MgQ2FjaGVkSW1hZ2VDYWxsYmFjazsKLQotICAg
ICAgICB2b2lkIHJlcXVlc3RTdGFydGVkKCBraHRtbDo6RG9jTG9hZGVyKiBkbCwga2h0bWw6OkNh
Y2hlZE9iamVjdCogb2JqICk7Ci0Jdm9pZCByZXF1ZXN0RG9uZSgga2h0bWw6OkRvY0xvYWRlciog
ZGwsIGtodG1sOjpDYWNoZWRPYmplY3QgKm9iaiApOwotCXZvaWQgcmVxdWVzdEZhaWxlZCgga2h0
bWw6OkRvY0xvYWRlciogZGwsIGtodG1sOjpDYWNoZWRPYmplY3QgKm9iaiApOwotCi0gICAgcHJv
dGVjdGVkIHNsb3RzOgotICAgICAgICB2b2lkIHNsb3RGaW5pc2hlZCggS0lPOjpKb2IgKiAsIE5T
RGF0YSAqYWxsRGF0YSk7Ci0Jdm9pZCBzbG90RGF0YSggS0lPOjpKb2IgKiwgY29uc3QgY2hhciAq
ZGF0YSwgaW50IHNpemUgKTsKLSAgICAgICAgdm9pZCBzbG90UmVjZWl2ZWRSZXNwb25zZSAoIEtJ
Tzo6Sm9iICosIE5TVVJMUmVzcG9uc2UgKnJlc3BvbnNlICk7Ci0KLSAgICBwcml2YXRlOgotCXZv
aWQgc2VydmVQZW5kaW5nUmVxdWVzdHMoKTsKLQotICAgICAgICB2aXJ0dWFsIGJvb2wgaXNLSFRN
TExvYWRlcigpIGNvbnN0OwotCi0JUVB0ckxpc3Q8UmVxdWVzdD4gbV9yZXF1ZXN0c1BlbmRpbmc7
Ci0JUVB0ckRpY3Q8UmVxdWVzdD4gbV9yZXF1ZXN0c0xvYWRpbmc7Ci0KLQlRUHRyTGlzdDxSZXF1
ZXN0PiBtX3JlcXVlc3RzQmFja2dyb3VuZERlY29kaW5nOwotCi0jaWZkZWYgSEFWRV9MSUJKUEVH
Ci0gICAgICAgIEtKUEVHRm9ybWF0VHlwZSBtX2pwZWdsb2FkZXI7Ci0jZW5kaWYKLSAgICB9Owot
Ci0gICAgICAgIC8qKgotICAgICAqIEBpbnRlcm5hbAotICAgICAqCi0gICAgICogUHJvdmlkZXMg
YSBjYWNoZS9sb2FkZXIgZm9yIG9iamVjdHMgbmVlZGVkIGZvciBkaXNwbGF5aW5nIHRoZSBodG1s
IHBhZ2UuCi0gICAgICogQXQgdGhlIG1vbWVudCB0aGVzZSBhcmUgc3R5bGVzaGVldHMsIHNjcmlw
dHMgYW5kIGltYWdlcwotICAgICAqLwotICAgIGNsYXNzIENhY2hlCi0gICAgewotCWZyaWVuZCBj
bGFzcyBEb2NMb2FkZXI7Ci0gICAgcHVibGljOgotCS8qKgotCSAqIGluaXQgdGhlIGNhY2hlIGlu
IGNhc2UgaXQncyBub3QgYWxyZWFkeS4gVGhpcyBuZWVkcyB0byBnZXQgY2FsbGVkIG9uY2UKLQkg
KiBiZWZvcmUgdXNpbmcgaXQuCi0JICovCi0Jc3RhdGljIHZvaWQgaW5pdCgpOwotICAgICAgICAK
LQkvKioKLQkgKiBBc2sgdGhlIGNhY2hlIGZvciBzb21lIHVybC4gV2lsbCByZXR1cm4gYSBjYWNo
ZWRPYmplY3QsIGFuZAotCSAqIGxvYWQgdGhlIHJlcXVlc3RlZCBkYXRhIGluIGNhc2UgaXQncyBu
b3QgY2FoY2VkCi0gICAgICAgICAqIGlmIHRoZSBEb2NMb2FkZXIgaXMgemVybywgdGhlIHVybCBt
dXN0IGJlIGZ1bGwtcXVhbGlmaWVkLgotICAgICAgICAgKiBPdGhlcndpc2UsIGl0IGlzIGF1dG9t
YXRpY2FsbHkgYmFzZS11cmwgZXhwYW5kZWQKLQkgKi8KLQlzdGF0aWMgQ2FjaGVkSW1hZ2UgKnJl
cXVlc3RJbWFnZSggRG9jTG9hZGVyKiBsLCBjb25zdCBET006OkRPTVN0cmluZyAmdXJsLCBib29s
IHJlbG9hZD1mYWxzZSwgdGltZV90IF9leHBpcmVEYXRlPTApOwotICAgICAgICBzdGF0aWMgQ2Fj
aGVkSW1hZ2UgKnJlcXVlc3RJbWFnZSggRG9jTG9hZGVyKiBsLCBjb25zdCBLVVJMICZ1cmwsIGJv
b2wgcmVsb2FkPWZhbHNlLCB0aW1lX3QgX2V4cGlyZURhdGU9MCk7Ci0KLQkvKioKLQkgKiBBc2sg
dGhlIGNhY2hlIGZvciBzb21lIHVybC4gV2lsbCByZXR1cm4gYSBjYWNoZWRPYmplY3QsIGFuZAot
CSAqIGxvYWQgdGhlIHJlcXVlc3RlZCBkYXRhIGluIGNhc2UgaXQncyBub3QgY2FjaGVkCi0JICov
Ci0Jc3RhdGljIENhY2hlZENTU1N0eWxlU2hlZXQgKnJlcXVlc3RTdHlsZVNoZWV0KCBEb2NMb2Fk
ZXIqIGwsIGNvbnN0IERPTTo6RE9NU3RyaW5nICZ1cmwsIGJvb2wgcmVsb2FkPWZhbHNlLCB0aW1l
X3QgX2V4cGlyZURhdGU9MCwgY29uc3QgUVN0cmluZyYgY2hhcnNldCA9IFFTdHJpbmc6Om51bGwp
OwotCi0jaWZkZWYgS0hUTUxfWFNMVAotICAgICAgICAvLyBBc2sgdGhlIGNhY2hlIGZvciBhbiBY
U0wgc3R5bGVzaGVldC4KLSAgICAgICAgc3RhdGljIENhY2hlZFhTTFN0eWxlU2hlZXQqIHJlcXVl
c3RYU0xTdHlsZVNoZWV0KERvY0xvYWRlciogbCwgY29uc3QgRE9NOjpET01TdHJpbmcgJnVybCwg
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBib29sIHJlbG9hZD1mYWxzZSwgdGltZV90IF9leHBpcmVEYXRlPTApOwotI2VuZGlmCi0jaWZu
ZGVmIEtIVE1MX05PX1hCTAotICAgICAgICAvLyBBc2sgdGhlIGNhY2hlIGZvciBhbiBYQkwgZG9j
dW1lbnQuCi0gICAgICAgIHN0YXRpYyBDYWNoZWRYQkxEb2N1bWVudCogcmVxdWVzdFhCTERvY3Vt
ZW50KERvY0xvYWRlciogbCwgY29uc3QgRE9NOjpET01TdHJpbmcgJnVybCwgCi0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVsb2FkPWZh
bHNlLCB0aW1lX3QgX2V4cGlyZURhdGU9MCk7Ci0jZW5kaWYKLQotICAgICAgICAvKioKLSAgICAg
ICAgICogUHJlLWxvYWRzIGEgc3R5bGVzaGVldCBpbnRvIHRoZSBjYWNoZS4KLSAgICAgICAgICov
Ci0gICAgICAgIHN0YXRpYyB2b2lkIHByZWxvYWRTdHlsZVNoZWV0KGNvbnN0IFFTdHJpbmcgJnVy
bCwgY29uc3QgUVN0cmluZyAmc3R5bGVzaGVldF9kYXRhKTsKLQotCS8qKgotCSAqIEFzayB0aGUg
Y2FjaGUgZm9yIHNvbWUgdXJsLiBXaWxsIHJldHVybiBhIGNhY2hlZE9iamVjdCwgYW5kCi0JICog
bG9hZCB0aGUgcmVxdWVzdGVkIGRhdGEgaW4gY2FzZSBpdCdzIG5vdCBjYWhjZWQKLQkgKi8KLQlz
dGF0aWMgQ2FjaGVkU2NyaXB0ICpyZXF1ZXN0U2NyaXB0KCBEb2NMb2FkZXIqIGwsIGNvbnN0IERP
TTo6RE9NU3RyaW5nICZ1cmwsIGJvb2wgcmVsb2FkPWZhbHNlLCB0aW1lX3QgX2V4cGlyZURhdGU9
MCwgY29uc3QgUVN0cmluZyYgY2hhcnNldD1RU3RyaW5nOjpudWxsKTsKLQotICAgICAgICAvKioK
LSAgICAgICAgICogUHJlLWxvYWRzIGEgc2NyaXB0IGludG8gdGhlIGNhY2hlLgotICAgICAgICAg
Ki8KLSAgICAgICAgc3RhdGljIHZvaWQgcHJlbG9hZFNjcmlwdChjb25zdCBRU3RyaW5nICZ1cmws
IGNvbnN0IFFTdHJpbmcgJnNjcmlwdF9kYXRhKTsKLQotCS8qKgotCSAqIHNldHMgdGhlIHNpemUg
b2YgdGhlIGNhY2hlLiBUaGlzIHdpbGwgb25seSBob2QgYXBwcm94aW1hdGVseSwgc2luY2UgdGhl
IHNpemUgc29tZQotCSAqIGNhY2hlZCBvYmplY3RzIChsaWtlIHN0eWxlc2hlZXRzKSB0YWtlIHVw
IGluIG1lbW9yeSBpcyBub3QgZXhhY2x0eSBrbm93bi4KLQkgKi8KLQlzdGF0aWMgdm9pZCBzZXRT
aXplKCBpbnQgYnl0ZXMgKTsKLQkvKioKLQkgKiByZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBjYWNo
ZQotCSAqLwotCXN0YXRpYyBpbnQgc2l6ZSgpIHsgcmV0dXJuIG1heFNpemU7IH07Ci0KLSAgICAg
ICAgc3RhdGljIGludCBtYXhDYWNoZWFibGVPYmplY3RTaXplKCkgeyByZXR1cm4gbWF4Q2FjaGVh
YmxlOyB9Ci0KLQkvKioKLQkgKiBjbGVhbiB1cCBjYWNoZQotCSAqLwotCXN0YXRpYyB2b2lkIGZs
dXNoKGJvb2wgZm9yY2U9ZmFsc2UpOwotCi0JLyoqCi0JICogY2xlYXJzIHRoZSBjYWNoZQotCSAq
IFdhcm5pbmc6IGNhbGwgdGhpcyBvbmx5IGF0IHRoZSBlbmQgb2YgeW91ciBwcm9ncmFtLCB0byBj
bGVhbgotCSAqIHVwIG1lbW9yeSAodXNlZnVsIGZvciBmaW5kaW5nIG1lbW9yeSBob2xlcykKLQkg
Ki8KLQlzdGF0aWMgdm9pZCBjbGVhcigpOwotCi0Jc3RhdGljIExvYWRlciAqbG9hZGVyKCkgeyBy
ZXR1cm4gbV9sb2FkZXI7IH0KLQotICAgIAlzdGF0aWMgUVBpeG1hcCAqbnVsbFBpeG1hcDsKLSAg
ICAgICAgc3RhdGljIFFQaXhtYXAgKmJyb2tlblBpeG1hcDsKLQotICAgICAgICBzdGF0aWMgdm9p
ZCByZW1vdmVDYWNoZUVudHJ5KCBDYWNoZWRPYmplY3QgKm9iamVjdCApOwotCi0gICAgICAgIHN0
cnVjdCBUeXBlU3RhdGlzdGljIHsKLSAgICAgICAgICAgIGludCBjb3VudDsKLSAgICAgICAgICAg
IGludCBzaXplOwotICAgICAgICAgICAgVHlwZVN0YXRpc3RpYygpIDogY291bnQoMCksIHNpemUo
MCkgeyB9Ci0gICAgICAgIH07Ci0gICAgICAgIAotICAgICAgICBzdHJ1Y3QgU3RhdGlzdGljcyB7
Ci0gICAgICAgICAgICBUeXBlU3RhdGlzdGljIGltYWdlczsKLSAgICAgICAgICAgIFR5cGVTdGF0
aXN0aWMgbW92aWVzOwotICAgICAgICAgICAgVHlwZVN0YXRpc3RpYyBzdHlsZVNoZWV0czsKLSAg
ICAgICAgICAgIFR5cGVTdGF0aXN0aWMgc2NyaXB0czsKLSNpZmRlZiBLSFRNTF9YU0xUCi0gICAg
ICAgICAgICBUeXBlU3RhdGlzdGljIHhzbFN0eWxlU2hlZXRzOwotI2VuZGlmCi0jaWZuZGVmIEtI
VE1MX05PX1hCTAotICAgICAgICAgICAgVHlwZVN0YXRpc3RpYyB4YmxEb2NzOwotI2VuZGlmCi0g
ICAgICAgICAgICBUeXBlU3RhdGlzdGljIG90aGVyOwotICAgICAgICB9OwotCi0gICAgICAgIHN0
YXRpYyBTdGF0aXN0aWNzIGdldFN0YXRpc3RpY3MoKTsKLSAgICAgICAgc3RhdGljIHZvaWQgZmx1
c2hBbGwoKTsKLSAgICAgICAgc3RhdGljIHZvaWQgc2V0Q2FjaGVEaXNhYmxlZChib29sKTsKLQot
ICAgICAgICBzdGF0aWMgdm9pZCBpbnNlcnRJbkxSVUxpc3QoQ2FjaGVkT2JqZWN0ICopOwotICAg
ICAgICBzdGF0aWMgdm9pZCByZW1vdmVGcm9tTFJVTGlzdChDYWNoZWRPYmplY3QgKik7Ci0gICAg
ICAgIHN0YXRpYyBib29sIGFkanVzdFNpemUoQ2FjaGVkT2JqZWN0ICosIGludCBzaXplRGVsdGEp
OwotICAgICAgICAKLSAgICAgICAgc3RhdGljIExSVUxpc3QqIGdldExSVUxpc3RGb3IoQ2FjaGVk
T2JqZWN0KiBvKTsKLSAgICAgICAgCi0gICAgICAgIHN0YXRpYyB2b2lkIGNoZWNrTFJVQW5kVW5j
YWNoZWFibGVMaXN0SW50ZWdyaXR5KCk7Ci0KLSAgICBwcm90ZWN0ZWQ6Ci0gICAgICAgIHN0YXRp
YyBRRGljdDxDYWNoZWRPYmplY3Q+ICpjYWNoZTsKLSAgICAgICAgc3RhdGljIFFQdHJMaXN0PERv
Y0xvYWRlcj4qIGRvY2xvYWRlcjsKLSAgICAKLSAgICAgICAgc3RhdGljIGludCBtYXhTaXplOwot
ICAgICAgICBzdGF0aWMgaW50IG1heENhY2hlYWJsZTsKLSAgICAgICAgc3RhdGljIGludCBmbHVz
aENvdW50OwotICAgIAotICAgICAgICBzdGF0aWMgTG9hZGVyICptX2xvYWRlcjsKLSAgICAKLSAg
ICAgICAgc3RhdGljIHZvaWQgbW92ZVRvSGVhZE9mTFJVTGlzdChDYWNoZWRPYmplY3QgKik7Ci0g
ICAgCi0gICAgICAgIHN0YXRpYyBMUlVMaXN0ICptX0xSVUxpc3RzOwotICAgICAgICBzdGF0aWMg
aW50IG1fdG90YWxTaXplT2ZMUlVMaXN0czsKLSAgICAgICAgICAgIAotICAgICAgICBzdGF0aWMg
Q2FjaGVkT2JqZWN0ICptX2hlYWRPZlVuY2FjaGVhYmxlTGlzdDsKLSAgICAgICAgICAgIAotICAg
ICAgICBzdGF0aWMgaW50IG1fY291bnRPZkxSVUFuZFVuY2FjaGVhYmxlTGlzdHM7Ci0gICAgfTsK
LQogfTsKIAogI2VuZGlmCkluZGV4OiBtaXNjL0NhY2hlZFNjcmlwdC5oCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IG1pc2MvQ2FjaGVkU2NyaXB0LmgJKHJldmlzaW9uIDExOTQ4KQorKysgbWlzYy9DYWNoZWRTY3Jp
cHQuaAkod29ya2luZyBjb3B5KQpAQCAtMjMsMjU5ICsyMywyMSBAQAogICAgIFRoaXMgY2xhc3Mg
cHJvdmlkZXMgYWxsIGZ1bmN0aW9uYWxpdHkgbmVlZGVkIGZvciBsb2FkaW5nIGltYWdlcywgc3R5
bGUgc2hlZXRzIGFuZCBodG1sCiAgICAgcGFnZXMgZnJvbSB0aGUgd2ViLiBJdCBoYXMgYSBtZW1v
cnkgY2FjaGUgZm9yIHRoZXNlIG9iamVjdHMuCiAqLwotI2lmbmRlZiBfa2h0bWxfbG9hZGVyX2gK
LSNkZWZpbmUgX2todG1sX2xvYWRlcl9oCisjaWZuZGVmIEtIVE1MX0NhY2hlZFNjcmlwdF9oCisj
ZGVmaW5lIEtIVE1MX0NhY2hlZFNjcmlwdF9oCiAKLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5j
bHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHRpbWUuaD4KLQotI2luY2x1ZGUg
ImxvYWRlcl9jbGllbnQuaCIKLSNpZmRlZiBIQVZFX0xJQkpQRUcKLSNpbmNsdWRlICJsb2FkZXJf
anBlZy5oIgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxxcHRybGlz
dC5oPgotI2luY2x1ZGUgPHFvYmplY3QuaD4KLSNpbmNsdWRlIDxxcHRyZGljdC5oPgotI2luY2x1
ZGUgPHFkaWN0Lmg+Ci0jaW5jbHVkZSA8cXBpeG1hcC5oPgotI2luY2x1ZGUgPHFidWZmZXIuaD4K
LSNpbmNsdWRlIDxxc3RyaW5nbGlzdC5oPgotI2luY2x1ZGUgPHF0ZXh0Y29kZWMuaD4KKyNpbmNs
dWRlICJDYWNoZWRPYmplY3QuaCIKIAotI2luY2x1ZGUgPGt1cmwuaD4KICNpbmNsdWRlIDxraW8v
Z2xvYmFsLmg+Ci0KLSNpbmNsdWRlIDxraHRtbF9zZXR0aW5ncy5oPgogI2luY2x1ZGUgPGRvbS9k
b21fc3RyaW5nLmg+Ci0jaW5jbHVkZSAiRG9jUHRyLmgiCi0KLWNsYXNzIEtIVE1MUGFydDsKLQot
bmFtZXNwYWNlIEtJTyB7Ci0gIGNsYXNzIEpvYjsKLSAgY2xhc3MgVHJhbnNmZXJKb2I7Ci19Ci0K
LW5hbWVzcGFjZSBET00KLXsKLSAgICBjbGFzcyBDU1NTdHlsZVNoZWV0SW1wbDsKLSAgICBjbGFz
cyBEb2N1bWVudEltcGw7Ci19OwotCi0KLWNsYXNzIEtXUUxvYWRlcjsKLQotI2lmIF9fT0JKQ19f
Ci1AY2xhc3MgTlNEYXRhOwotQGNsYXNzIE5TVVJMUmVzcG9uc2U7Ci0jZWxzZQotY2xhc3MgTlNE
YXRhOwotY2xhc3MgTlNVUkxSZXNwb25zZTsKLSNlbmRpZgogCitjbGFzcyBRU3RyaW5nOworY2xh
c3MgUUJ1ZmZlcjsKIAogbmFtZXNwYWNlIGtodG1sCiB7Ci0gICAgY2xhc3MgQ2FjaGVkT2JqZWN0
OwotICAgIGNsYXNzIFJlcXVlc3Q7Ci0gICAgY2xhc3MgRG9jTG9hZGVyOwotICAgIGNsYXNzIERl
Y29kZXI7Ci0KLSAjZGVmaW5lIE1BWF9MUlVfTElTVFMgMjAKLSAgICAKLSAgICBzdHJ1Y3QgTFJV
TGlzdCB7Ci0gICAgICAgIENhY2hlZE9iamVjdCogbV9oZWFkOwotICAgICAgICBDYWNoZWRPYmpl
Y3QqIG1fdGFpbDsKLSAgICAKLSAgICAgICAgTFJVTGlzdCgpOwotICAgICAgICB+TFJVTGlzdCgp
OwotICAgIH07Ci0gICAgCi0gICAgLyoqCi0gICAgICogQGludGVybmFsCi0gICAgICoKLSAgICAg
KiBBIGNhY2hlZCBvYmplY3QuIENsYXNzZXMgd2hvIHdhbnQgdG8gdXNlIHRoaXMgb2JqZWN0IHNo
b3VsZCBkZXJpdmUKLSAgICAgKiBmcm9tIENhY2hlZE9iamVjdENsaWVudCwgdG8gZ2V0IHRoZSBm
dW5jdGlvbiBjYWxscyBpbiBjYXNlIHRoZSByZXF1ZXN0ZWQgZGF0YSBoYXMgYXJyaXZlZC4KLSAg
ICAgKgotICAgICAqIFRoaXMgY2xhc3MgYWxzbyBkb2VzIHRoZSBhY3R1YWwgY29tbXVuaWNhdGlv
biB3aXRoIGtpbyBhbmQgbG9hZHMgdGhlIGZpbGUuCi0gICAgICovCi0gICAgY2xhc3MgQ2FjaGVk
T2JqZWN0Ci0gICAgewotICAgIHB1YmxpYzoKLQllbnVtIFR5cGUgewotCSAgICBJbWFnZSwKLQkg
ICAgQ1NTU3R5bGVTaGVldCwKLQkgICAgU2NyaXB0Ci0jaWZkZWYgS0hUTUxfWFNMVAotICAgICAg
ICAgICAgLCBYU0xTdHlsZVNoZWV0Ci0jZW5kaWYKLSNpZm5kZWYgS0hUTUxfTk9fWEJMCi0gICAg
ICAgICAgICAsIFhCTAotI2VuZGlmCi0JfTsKLQotCWVudW0gU3RhdHVzIHsKLQkgICAgTm90Q2Fj
aGVkLCAgICAvLyB0aGlzIFVSTCBpcyBub3QgY2FjaGVkCi0JICAgIFVua25vd24sICAgICAgLy8g
bGV0IGltYWdlY2FjaGUgZGVjaWRlIHdoYXQgdG8gZG8gd2l0aCBpdAotCSAgICBOZXcsICAgICAg
ICAgIC8vIGluc2VydGluZyBuZXcgaW1hZ2UKLSAgICAgICAgUGVuZGluZywgICAgICAvLyBvbmx5
IHBhcnRpYWxseSBsb2FkZWQKLQkgICAgUGVyc2lzdGVudCwgICAvLyBuZXZlciBkZWxldGUgdGhp
cyBwaXhtYXAKLQkgICAgQ2FjaGVkLCAgICAgICAvLyByZWd1bGFyIGNhc2UKLQkgICAgVW5jYWNo
ZWFibGUgICAvLyB0b28gYmlnIHRvIGJlIGNhY2hlZCwKLQl9OyAgCSAgICAgICAgICAvLyB3aWxs
IGJlIGRlc3Ryb3llZCBhcyBzb29uIGFzIHBvc3NpYmxlCi0KLQlDYWNoZWRPYmplY3QoY29uc3Qg
RE9NOjpET01TdHJpbmcgJnVybCwgVHlwZSB0eXBlLCBLSU86OkNhY2hlQ29udHJvbCBfY2FjaGVQ
b2xpY3ksIHRpbWVfdCBfZXhwaXJlRGF0ZSwgaW50IHNpemUgPSAwKQotCXsKLQkgICAgbV91cmwg
PSB1cmw7Ci0JICAgIG1fdHlwZSA9IHR5cGU7Ci0JICAgIG1fc3RhdHVzID0gUGVuZGluZzsKLQkg
ICAgbV9zaXplID0gc2l6ZTsKLQkgICAgbV9mcmVlID0gZmFsc2U7Ci0JICAgIG1fY2FjaGVQb2xp
Y3kgPSBfY2FjaGVQb2xpY3k7Ci0JICAgIG1fcmVxdWVzdCA9IDA7Ci0gICAgICAgIG1fcmVzcG9u
c2UgPSAwOwotICAgICAgICBtX2FsbERhdGEgPSAwOwotCSAgICBtX2V4cGlyZURhdGUgPSBfZXhw
aXJlRGF0ZTsKLSAgICAgICAgbV9kZWxldGVkID0gZmFsc2U7Ci0gICAgICAgIG1fZXhwaXJlRGF0
ZUNoYW5nZWQgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIG1fYWNjZXNzQ291bnQgPSAwOwot
ICAgICAgICAKLSAgICAgICAgbV9uZXh0SW5MUlVMaXN0ID0gMDsKLSAgICAgICAgbV9wcmV2SW5M
UlVMaXN0ID0gMDsKLQl9Ci0JdmlydHVhbCB+Q2FjaGVkT2JqZWN0KCk7Ci0KLQl2aXJ0dWFsIHZv
aWQgc2V0Q2hhcnNldCggY29uc3QgUVN0cmluZyAmY2hzICkge30KLQl2aXJ0dWFsIHZvaWQgZGF0
YSggUUJ1ZmZlciAmYnVmZmVyLCBib29sIGVvZikgPSAwOwotCXZpcnR1YWwgdm9pZCBlcnJvcigg
aW50IGVyciwgY29uc3QgY2hhciAqdGV4dCApID0gMDsKLQotCWNvbnN0IERPTTo6RE9NU3RyaW5n
ICZ1cmwoKSBjb25zdCB7IHJldHVybiBtX3VybDsgfQotCVR5cGUgdHlwZSgpIGNvbnN0IHsgcmV0
dXJuIG1fdHlwZTsgfQotCi0JdmlydHVhbCB2b2lkIHJlZihDYWNoZWRPYmplY3RDbGllbnQgKmNv
bnN1bWVyKTsKLQl2aXJ0dWFsIHZvaWQgZGVyZWYoQ2FjaGVkT2JqZWN0Q2xpZW50ICpjb25zdW1l
cik7Ci0KLQlpbnQgY291bnQoKSBjb25zdCB7IHJldHVybiBtX2NsaWVudHMuY291bnQoKTsgfQot
Ci0JU3RhdHVzIHN0YXR1cygpIGNvbnN0IHsgcmV0dXJuIG1fc3RhdHVzOyB9Ci0KLQlpbnQgc2l6
ZSgpIGNvbnN0IHsgcmV0dXJuIG1fc2l6ZTsgfQotCi0gICAgICAgIGJvb2wgaXNMb2FkZWQoKSBj
b25zdCB7IHJldHVybiAhbV9sb2FkaW5nOyB9Ci0gICAgICAgIAotICAgICAgICB2aXJ0dWFsIGJv
b2wgaXNJbWFnZSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0KLSAgICBpbnQgYWNjZXNzQ291
bnQoKSBjb25zdCB7IHJldHVybiBtX2FjY2Vzc0NvdW50OyB9Ci0gICAgdm9pZCBpbmNyZWFzZUFj
Y2Vzc0NvdW50KCkgeyBtX2FjY2Vzc0NvdW50Kys7IH0KLSAgICAKLQkvKioKLQkgKiBjb21wdXRl
cyB0aGUgc3RhdHVzIG9mIGFuIG9iamVjdCBhZnRlciBsb2FkaW5nLgotCSAqIHRoZSByZXN1bHQg
ZGVwZW5kcyBvbiB0aGUgb2JqZWN0cyBzaXplIGFuZCB0aGUgc2l6ZSBvZiB0aGUgY2FjaGUKLQkg
KiBhbHNvIHVwZGF0ZXMgdGhlIGV4cGlyZSBkYXRlIG9uIHRoZSBjYWNoZSBlbnRyeSBmaWxlCi0J
ICovCi0Jdm9pZCBmaW5pc2goKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIGJ5
IHRoZSBjYWNoZSBpZiB0aGUgb2JqZWN0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgY2FjaGUg
ZGljdAotICAgICAgICAgKiB3aGlsZSBzdGlsbCBiZWluZyByZWZlcmVuY2VkLiBUaGlzIG1lYW5z
IHRoZSBvYmplY3Qgc2hvdWxkIGtpbGwgaXRzZWxmCi0gICAgICAgICAqIGlmIGl0cyByZWZlcmVu
Y2UgY291bnRlciBkcm9wcyBkb3duIHRvIHplcm8uCi0gICAgICAgICAqLwotICAgICAgICB2b2lk
IHNldEZyZWUoIGJvb2wgYiApIHsgbV9mcmVlID0gYjsgfQotCi0gICAgICAgIEtJTzo6Q2FjaGVD
b250cm9sIGNhY2hlUG9saWN5KCkgY29uc3QgeyByZXR1cm4gbV9jYWNoZVBvbGljeTsgfQotCi0g
ICAgICAgIHZvaWQgc2V0UmVxdWVzdChSZXF1ZXN0ICpfcmVxdWVzdCk7Ci0KLSAgICAgICAgTlNV
UkxSZXNwb25zZSAqcmVzcG9uc2UoKSBjb25zdCB7IHJldHVybiBtX3Jlc3BvbnNlOyB9Ci0gICAg
ICAgIHZvaWQgc2V0UmVzcG9uc2UoTlNVUkxSZXNwb25zZSAqcmVzcG9uc2UpOwotICAgICAgICBO
U0RhdGEgKmFsbERhdGEoKSBjb25zdCB7IHJldHVybiBtX2FsbERhdGE7IH0KLSAgICAgICAgdm9p
ZCBzZXRBbGxEYXRhIChOU0RhdGEgKmRhdGEpOwotCi0gICAgICAgIGJvb2wgY2FuRGVsZXRlKCkg
Y29uc3QgeyByZXR1cm4gKG1fY2xpZW50cy5jb3VudCgpID09IDAgJiYgIW1fcmVxdWVzdCk7IH0K
LQotCXZvaWQgc2V0RXhwaXJlRGF0ZSh0aW1lX3QgX2V4cGlyZURhdGUsIGJvb2wgY2hhbmdlSHR0
cENhY2hlKTsKLQkKLQlib29sIGlzRXhwaXJlZCgpIGNvbnN0OwotCi0gICAgICAgIHZpcnR1YWwg
Ym9vbCBzY2hlZHVsZSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0KLSAgICAgICAgLyoqCi0g
ICAgICAgICAqIExpc3Qgb2YgYWNjZXB0YWJsZSBtaW1ldHlwZXMgc2VwZXJhdGVkIGJ5ICIsIi4g
QSBtaW1ldHlwZSBtYXkgY29udGFpbiBhIHdpbGRjYXJkLgotICAgICAgICAgKi8KLSAgICAgICAg
Ly8gZS5nLiAidGV4dC8qIgotICAgICAgICBRU3RyaW5nIGFjY2VwdCgpIGNvbnN0IHsgcmV0dXJu
IG1fYWNjZXB0OyB9Ci0gICAgICAgIHZvaWQgc2V0QWNjZXB0KGNvbnN0IFFTdHJpbmcgJl9hY2Nl
cHQpIHsgbV9hY2NlcHQgPSBfYWNjZXB0OyB9Ci0KLSAgICBwcm90ZWN0ZWQ6Ci0gICAgICAgIHZv
aWQgc2V0U2l6ZShpbnQgc2l6ZSk7Ci0gICAgICAgIAotICAgICAgICBRUHRyRGljdDxDYWNoZWRP
YmplY3RDbGllbnQ+IG1fY2xpZW50czsKLQotCURPTTo6RE9NU3RyaW5nIG1fdXJsOwotICAgICAg
ICBRU3RyaW5nIG1fYWNjZXB0OwotICAgICAgICBSZXF1ZXN0ICptX3JlcXVlc3Q7Ci0gICAgICAg
IE5TVVJMUmVzcG9uc2UgKm1fcmVzcG9uc2U7Ci0gICAgICAgIE5TRGF0YSAqbV9hbGxEYXRhOwot
CVR5cGUgbV90eXBlOwotCVN0YXR1cyBtX3N0YXR1czsKLSAgICBwcml2YXRlOgotCWludCBtX3Np
emU7Ci0gICAgaW50IG1fYWNjZXNzQ291bnQ7Ci0gICAgCi0gICAgcHJvdGVjdGVkOgotCXRpbWVf
dCBtX2V4cGlyZURhdGU7Ci0JS0lPOjpDYWNoZUNvbnRyb2wgbV9jYWNoZVBvbGljeTsKLSAgICAg
ICAgYm9vbCBtX2ZyZWUgOiAxOwotICAgICAgICBib29sIG1fZGVsZXRlZCA6IDE7Ci0gICAgICAg
IGJvb2wgbV9sb2FkaW5nIDogMTsKLSAgICAgICAgYm9vbCBtX2V4cGlyZURhdGVDaGFuZ2VkIDog
MTsKKyAgICBjbGFzcyBDYWNoZWRPYmplY3RDbGllbnQ7CiAgICAgCi0gICAgcHJpdmF0ZToKLSAg
ICAgICAgYm9vbCBhbGxvd0luTFJVTGlzdCgpIHsgcmV0dXJuIGNhbkRlbGV0ZSgpICYmIHN0YXR1
cygpICE9IFBlcnNpc3RlbnQ7IH0KLSAgICAgICAgCi0gICAgICAgIENhY2hlZE9iamVjdCAqbV9u
ZXh0SW5MUlVMaXN0OwotICAgICAgICBDYWNoZWRPYmplY3QgKm1fcHJldkluTFJVTGlzdDsKLSAg
ICAgICAgZnJpZW5kIGNsYXNzIENhY2hlOwotICAgIH07Ci0KLQotICAgIC8qKgotICAgICAqIGEg
Y2FjaGVkIHN0eWxlIHNoZWV0Ci0gICAgICovCi0gICAgY2xhc3MgQ2FjaGVkQ1NTU3R5bGVTaGVl
dCA6IHB1YmxpYyBDYWNoZWRPYmplY3QKLSAgICB7Ci0gICAgcHVibGljOgotCUNhY2hlZENTU1N0
eWxlU2hlZXQoRG9jTG9hZGVyKiBkbCwgY29uc3QgRE9NOjpET01TdHJpbmcgJnVybCwgS0lPOjpD
YWNoZUNvbnRyb2wgY2FjaGVQb2xpY3ksIHRpbWVfdCBfZXhwaXJlRGF0ZSwgY29uc3QgUVN0cmlu
ZyYgY2hhcnNldCk7Ci0JQ2FjaGVkQ1NTU3R5bGVTaGVldChjb25zdCBET006OkRPTVN0cmluZyAm
dXJsLCBjb25zdCBRU3RyaW5nICZzdHlsZXNoZWV0X2RhdGEpOwotCXZpcnR1YWwgfkNhY2hlZENT
U1N0eWxlU2hlZXQoKTsKLQotCWNvbnN0IERPTTo6RE9NU3RyaW5nICZzaGVldCgpIGNvbnN0IHsg
cmV0dXJuIG1fc2hlZXQ7IH0KLQotCXZpcnR1YWwgdm9pZCByZWYoQ2FjaGVkT2JqZWN0Q2xpZW50
ICpjb25zdW1lcik7Ci0JdmlydHVhbCB2b2lkIGRlcmVmKENhY2hlZE9iamVjdENsaWVudCAqY29u
c3VtZXIpOwotCi0gICAgICAgIHZpcnR1YWwgdm9pZCBzZXRDaGFyc2V0KCBjb25zdCBRU3RyaW5n
ICZjaHMgKTsKLSAgICAgICAgdmlydHVhbCB2b2lkIGRhdGEoIFFCdWZmZXIgJmJ1ZmZlciwgYm9v
bCBlb2YgKTsKLQl2aXJ0dWFsIHZvaWQgZXJyb3IoIGludCBlcnIsIGNvbnN0IGNoYXIgKnRleHQg
KTsKLQotICAgICAgICB2aXJ0dWFsIGJvb2wgc2NoZWR1bGUoKSBjb25zdCB7IHJldHVybiB0cnVl
OyB9Ci0KLQl2b2lkIGNoZWNrTm90aWZ5KCk7Ci0KLSAgICBwcm90ZWN0ZWQ6Ci0JRE9NOjpET01T
dHJpbmcgbV9zaGVldDsKLSAgICAgICAgUVRleHRDb2RlYyogbV9jb2RlYzsKLSAgICB9OwotCi0g
ICAgLyoqCi0gICAgICogYSBjYWNoZWQgc2NyaXB0Ci0gICAgICovCiAgICAgY2xhc3MgQ2FjaGVk
U2NyaXB0IDogcHVibGljIENhY2hlZE9iamVjdAogICAgIHsKICAgICBwdWJsaWM6CkBAIC0zMDMs
NDExICs2NSw2IEBAIG5hbWVzcGFjZSBraHRtbAogICAgICAgICBRVGV4dENvZGVjKiBtX2NvZGVj
OwogICAgICAgICBib29sIG1fZXJyb3JPY2N1cnJlZDsKICAgICB9OwotCi0gICAgY2xhc3MgSW1h
Z2VTb3VyY2U7Ci0KLSAgICBjbGFzcyBDYWNoZWRJbWFnZTsKLSAgICAKLSAgICBjbGFzcyBDYWNo
ZWRJbWFnZUNhbGxiYWNrCi0gICAgewotICAgIHB1YmxpYzoKLSAgICAgICAgQ2FjaGVkSW1hZ2VD
YWxsYmFjayAoQ2FjaGVkSW1hZ2UgKmMpIDogY2FjaGVkSW1hZ2UoYyksIHJlZkNvdW50KDEpLCBo
ZWFkZXJSZWNlaXZlZChmYWxzZSkge307Ci0KLSAgICAgICAgdm9pZCByZWYoKSB7IHJlZkNvdW50
Kys7IH0KLSAgICAgICAgdm9pZCBkZXJlZigpIHsgaWYgKC0tcmVmQ291bnQgPT0gMCkgZGVsZXRl
IHRoaXM7IH0KLSAgICAgICAgCi0gICAgICAgIHZvaWQgbm90aWZ5VXBkYXRlKCk7Ci0gICAgICAg
IHZvaWQgbm90aWZ5RmluaXNoZWQoKTsKLSAgICAgICAgdm9pZCBub3RpZnlEZWNvZGluZ0Vycm9y
KCk7Ci0gICAgICAgIHZvaWQgY2xlYXIoKTsKLSAgICAgICAgdm9pZCBoYW5kbGVFcnJvcigpOwot
ICAgICAgICAKLSAgICBwcml2YXRlOgotICAgICAgICBDYWNoZWRJbWFnZSAqY2FjaGVkSW1hZ2U7
Ci0gICAgICAgIHVpbnQgcmVmQ291bnQ7Ci0JYm9vbCBoZWFkZXJSZWNlaXZlZDsKLSAgICB9Owot
ICAgICAgICAKLSAgICAvKioKLSAgICAgKiBhIGNhY2hlZCBpbWFnZQotICAgICAqLwotICAgIGNs
YXNzIENhY2hlZEltYWdlIDogcHVibGljIFFPYmplY3QsIHB1YmxpYyBDYWNoZWRPYmplY3QKLSAg
ICB7Ci0JUV9PQkpFQ1QKLSAgICBwdWJsaWM6Ci0JQ2FjaGVkSW1hZ2UoRG9jTG9hZGVyKiBkbCwg
Y29uc3QgRE9NOjpET01TdHJpbmcgJnVybCwgS0lPOjpDYWNoZUNvbnRyb2wgY2FjaGVQb2xpY3ks
IHRpbWVfdCBfZXhwaXJlRGF0ZSk7Ci0JdmlydHVhbCB+Q2FjaGVkSW1hZ2UoKTsKLQotCWNvbnN0
IFFQaXhtYXAgJnBpeG1hcCgpIGNvbnN0OwotCWNvbnN0IFFQaXhtYXAgJnRpbGVkX3BpeG1hcChj
b25zdCBRQ29sb3ImIGJnKTsKLQotICAgICAgICBRU2l6ZSBwaXhtYXBfc2l6ZSgpIGNvbnN0OyAg
ICAvLyByZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBjb21wbGV0ZSAoaS5lLiB3aGVuIGZpbmlzaGVk
KSBsb2FkaW5nCi0gICAgICAgIFFSZWN0IHZhbGlkX3JlY3QoKSBjb25zdDsgICAgIC8vIHJldHVy
bnMgdGhlIHJlY3RhbmdsZSBvZiBwaXhtYXAgdGhhdCBoYXMgYmVlbiBsb2FkZWQgYWxyZWFkeQot
Ci0gICAgICAgIHZvaWQgcmVmKENhY2hlZE9iamVjdENsaWVudCAqY29uc3VtZXIpOwotCXZpcnR1
YWwgdm9pZCBkZXJlZihDYWNoZWRPYmplY3RDbGllbnQgKmNvbnN1bWVyKTsKLQotCXZpcnR1YWwg
dm9pZCBkYXRhKCBRQnVmZmVyICZidWZmZXIsIGJvb2wgZW9mICk7Ci0JdmlydHVhbCB2b2lkIGVy
cm9yKCBpbnQgZXJyLCBjb25zdCBjaGFyICp0ZXh0ICk7Ci0KLSAgICAgICAgYm9vbCBpc1RyYW5z
cGFyZW50KCkgY29uc3QgeyByZXR1cm4gaXNGdWxseVRyYW5zcGFyZW50OyB9Ci0gICAgICAgIGJv
b2wgaXNFcnJvckltYWdlKCkgY29uc3QgeyByZXR1cm4gZXJyb3JPY2N1cmVkOyB9Ci0KLSAgICAg
ICAgdm9pZCBzZXRTaG93QW5pbWF0aW9ucyggS0hUTUxTZXR0aW5nczo6S0FuaW1hdGlvbkFkdmlj
ZSApOwotCi0gICAgICAgIHZpcnR1YWwgYm9vbCBzY2hlZHVsZSgpIGNvbnN0IHsgcmV0dXJuIHRy
dWU7IH0KLQotCXZvaWQgY2hlY2tOb3RpZnkoKTsKLSAgICAgICAgCi0gICAgICAgIHZpcnR1YWwg
Ym9vbCBpc0ltYWdlKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotCi0Jdm9pZCBjbGVhcigpOwot
ICAgICAgICAKLSAgICBwcml2YXRlOgotICAgICAgICB2b2lkIGRvX25vdGlmeShjb25zdCBRUGl4
bWFwJiBwLCBjb25zdCBRUmVjdCYgcik7Ci0KLSAgICAgICAgUVBpeG1hcCogcDsKLQlRUGl4bWFw
KiBiZzsKLSAgICAgICAgUVJnYiBiZ0NvbG9yOwotICAgICAgICBtdXRhYmxlIFFQaXhtYXAqIHBp
eFBhcnQ7Ci0KLSAgICAgICAgSW1hZ2VTb3VyY2UqIGltZ1NvdXJjZTsKLSAgICAgICAgY29uc3Qg
Y2hhciogZm9ybWF0VHlwZTsgIC8vIElzIHRoZSBuYW1lIG9mIHRoZSBtb3ZpZSBmb3JtYXQgdHlw
ZQotCi0JaW50IHdpZHRoOwotCWludCBoZWlnaHQ7Ci0KLQkvLyBJcyBzZXQgaWYgbW92aWUgZm9y
bWF0IHR5cGUgKCBpbmNyZW1lbnRhbC9hbmltYXRpb24pIHdhcyBjaGVja2VkCi0JYm9vbCB0eXBl
Q2hlY2tlZCA6IDE7Ci0gICAgICAgIGJvb2wgaXNGdWxseVRyYW5zcGFyZW50IDogMTsKLSAgICAg
ICAgYm9vbCBlcnJvck9jY3VyZWQgOiAxOwotICAgICAgICBib29sIG1vbm9jaHJvbWUgOiAxOwot
ICAgICAgICBLSFRNTFNldHRpbmdzOjpLQW5pbWF0aW9uQWR2aWNlIG1fc2hvd0FuaW1hdGlvbnMg
OiAyOwotCi0gICAgICAgIGZyaWVuZCBjbGFzcyBDYWNoZTsKLQotICAgIHB1YmxpYzoKLSAgICAg
ICAgaW50IGRhdGFTaXplKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhU2l6ZTsgfQotCUNhY2hlZElt
YWdlQ2FsbGJhY2sgKmRlY29kZXJDYWxsYmFjaygpIGNvbnN0IHsgcmV0dXJuIG1fZGVjb2RlckNh
bGxiYWNrOyB9Ci0gICAgcHJpdmF0ZToKLSAgICAgICAgZnJpZW5kIGNsYXNzIENhY2hlZEltYWdl
Q2FsbGJhY2s7Ci0gICAgICAgIAotICAgICAgICBpbnQgbV9kYXRhU2l6ZTsKLSAgICAgICAgQ2Fj
aGVkSW1hZ2VDYWxsYmFjayAqbV9kZWNvZGVyQ2FsbGJhY2s7Ci0gICAgfTsKLQotI2lmZGVmIEtI
VE1MX1hTTFQKLSAgICBjbGFzcyBDYWNoZWRYU0xTdHlsZVNoZWV0IDogcHVibGljIENhY2hlZE9i
amVjdAotICAgIHsKLXB1YmxpYzoKLSAgICAgICAgQ2FjaGVkWFNMU3R5bGVTaGVldChEb2NMb2Fk
ZXIqIGRsLCBjb25zdCBET006OkRPTVN0cmluZyAmdXJsLCBLSU86OkNhY2hlQ29udHJvbCBjYWNo
ZVBvbGljeSwgdGltZV90IF9leHBpcmVEYXRlKTsKLQotICAgICAgICBjb25zdCBET006OkRPTVN0
cmluZyYgc2hlZXQoKSBjb25zdCB7IHJldHVybiBtX3NoZWV0OyB9Ci0gICAgICAgIAotICAgICAg
ICB2aXJ0dWFsIHZvaWQgcmVmKENhY2hlZE9iamVjdENsaWVudCAqY29uc3VtZXIpOwotICAgICAg
ICB2aXJ0dWFsIHZvaWQgZGVyZWYoQ2FjaGVkT2JqZWN0Q2xpZW50ICpjb25zdW1lcik7Ci0gICAg
ICAgIAotICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0Q2hhcnNldChjb25zdCBRU3RyaW5nICZjaHMp
OwotICAgICAgICB2aXJ0dWFsIHZvaWQgZGF0YShRQnVmZmVyICZidWZmZXIsIGJvb2wgZW9mKTsK
LSAgICAgICAgdmlydHVhbCB2b2lkIGVycm9yKGludCBlcnIsIGNvbnN0IGNoYXIgKnRleHQpOwot
ICAgICAgICAKLSAgICAgICAgdmlydHVhbCBib29sIHNjaGVkdWxlKCkgY29uc3QgeyByZXR1cm4g
dHJ1ZTsgfQotICAgICAgICAKLSAgICAgICAgdm9pZCBjaGVja05vdGlmeSgpOwotICAgICAgICAK
LXByb3RlY3RlZDoKLSAgICAgICAgRE9NOjpET01TdHJpbmcgbV9zaGVldDsKLSAgICAgICAgUmVm
UHRyPERlY29kZXI+IG1fZGVjb2RlcjsKLSAgICB9OwotI2VuZGlmCi0gICAgCi0jaWZuZGVmIEtI
VE1MX05PX1hCTAotICAgIGNsYXNzIENhY2hlZFhCTERvY3VtZW50IDogcHVibGljIENhY2hlZE9i
amVjdAotICAgIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIENhY2hlZFhCTERvY3VtZW50KERvY0xv
YWRlciogZGwsIGNvbnN0IERPTTo6RE9NU3RyaW5nICZ1cmwsIEtJTzo6Q2FjaGVDb250cm9sIGNh
Y2hlUG9saWN5LCB0aW1lX3QgX2V4cGlyZURhdGUpOwotICAgICAgICB2aXJ0dWFsIH5DYWNoZWRY
QkxEb2N1bWVudCgpOwotICAgICAgICAKLSAgICAgICAgWEJMOjpYQkxEb2N1bWVudEltcGwqIGRv
Y3VtZW50KCkgY29uc3QgeyByZXR1cm4gbV9kb2N1bWVudDsgfQotICAgICAgICAKLSAgICAgICAg
dmlydHVhbCB2b2lkIHJlZihDYWNoZWRPYmplY3RDbGllbnQgKmNvbnN1bWVyKTsKLSAgICAgICAg
dmlydHVhbCB2b2lkIGRlcmVmKENhY2hlZE9iamVjdENsaWVudCAqY29uc3VtZXIpOwotICAgICAg
ICAKLSAgICAgICAgdmlydHVhbCB2b2lkIHNldENoYXJzZXQoIGNvbnN0IFFTdHJpbmcgJmNocyAp
OwotICAgICAgICB2aXJ0dWFsIHZvaWQgZGF0YSggUUJ1ZmZlciAmYnVmZmVyLCBib29sIGVvZiAp
OwotICAgICAgICB2aXJ0dWFsIHZvaWQgZXJyb3IoIGludCBlcnIsIGNvbnN0IGNoYXIgKnRleHQg
KTsKLSAgICAgICAgCi0gICAgICAgIHZpcnR1YWwgYm9vbCBzY2hlZHVsZSgpIGNvbnN0IHsgcmV0
dXJuIHRydWU7IH0KLSAgICAgICAgCi0gICAgICAgIHZvaWQgY2hlY2tOb3RpZnkoKTsKLSAgICAg
ICAgCi1wcm90ZWN0ZWQ6Ci0gICAgICAgIFhCTDo6WEJMRG9jdW1lbnRJbXBsKiBtX2RvY3VtZW50
OwotICAgICAgICBSZWZQdHI8RGVjb2Rlcj4gbV9kZWNvZGVyOwotICAgIH07Ci0jZW5kaWYKLQot
ICAgIC8qKgotICAgICAqIEBpbnRlcm5hbAotICAgICAqCi0gICAgICogTWFuYWdlcyB0aGUgbG9h
ZGluZyBvZiBzY3JpcHRzL2ltYWdlcy9zdHlsZXNoZWV0cyBmb3IgYSBwYXJ0aWN1bGFyIGRvY3Vt
ZW50Ci0gICAgICovCi0gICAgY2xhc3MgRG9jTG9hZGVyCi0gICAgewotICAgIHB1YmxpYzoKLSAJ
RG9jTG9hZGVyKEtIVE1MUGFydCosIERPTTo6RG9jdW1lbnRJbXBsKik7Ci0gCX5Eb2NMb2FkZXIo
KTsKLQotCUNhY2hlZEltYWdlICpyZXF1ZXN0SW1hZ2UoIGNvbnN0IERPTTo6RE9NU3RyaW5nICZ1
cmwpOwotCUNhY2hlZENTU1N0eWxlU2hlZXQgKnJlcXVlc3RTdHlsZVNoZWV0KCBjb25zdCBET006
OkRPTVN0cmluZyAmdXJsLCBjb25zdCBRU3RyaW5nJiBjaGFyc2V0KTsKLSAgICAgICAgQ2FjaGVk
U2NyaXB0ICpyZXF1ZXN0U2NyaXB0KCBjb25zdCBET006OkRPTVN0cmluZyAmdXJsLCBjb25zdCBR
U3RyaW5nJiBjaGFyc2V0KTsKLQotI2lmZGVmIEtIVE1MX1hTTFQKLSAgICAgICAgQ2FjaGVkWFNM
U3R5bGVTaGVldCogcmVxdWVzdFhTTFN0eWxlU2hlZXQoY29uc3QgRE9NOjpET01TdHJpbmcmIHVy
bCk7Ci0jZW5kaWYKLSNpZm5kZWYgS0hUTUxfTk9fWEJMCi0gICAgICAgIENhY2hlZFhCTERvY3Vt
ZW50KiByZXF1ZXN0WEJMRG9jdW1lbnQoY29uc3QgRE9NOjpET01TdHJpbmcgJnVybCk7Ci0jZW5k
aWYKLQotCWJvb2wgYXV0b2xvYWRJbWFnZXMoKSBjb25zdCB7IHJldHVybiBtX2JhdXRvbG9hZElt
YWdlczsgfQotICAgICAgICBLSU86OkNhY2hlQ29udHJvbCBjYWNoZVBvbGljeSgpIGNvbnN0IHsg
cmV0dXJuIG1fY2FjaGVQb2xpY3k7IH0KLSAgICAgICAgS0hUTUxTZXR0aW5nczo6S0FuaW1hdGlv
bkFkdmljZSBzaG93QW5pbWF0aW9ucygpIGNvbnN0IHsgcmV0dXJuIG1fc2hvd0FuaW1hdGlvbnM7
IH0KLSAgICAgICAgdGltZV90IGV4cGlyZURhdGUoKSBjb25zdCB7IHJldHVybiBtX2V4cGlyZURh
dGU7IH0KLSAgICAgICAgS0hUTUxQYXJ0KiBwYXJ0KCkgY29uc3QgeyByZXR1cm4gbV9wYXJ0OyB9
Ci0gICAgICAgIERPTTo6RG9jdW1lbnRJbXBsKiBkb2MoKSBjb25zdCB7IHJldHVybiBtX2RvYzsg
fQotCi0gICAgICAgIHZvaWQgc2V0RXhwaXJlRGF0ZSggdGltZV90ICk7Ci0gICAgICAgIHZvaWQg
c2V0QXV0b2xvYWRJbWFnZXMoIGJvb2wgKTsKLSAgICAgICAgdm9pZCBzZXRDYWNoZVBvbGljeSgg
S0lPOjpDYWNoZUNvbnRyb2wgY2FjaGVQb2xpY3kgKTsKLSAgICAgICAgdm9pZCBzZXRTaG93QW5p
bWF0aW9ucyggS0hUTUxTZXR0aW5nczo6S0FuaW1hdGlvbkFkdmljZSApOwotICAgICAgICB2b2lk
IHJlbW92ZUNhY2hlZE9iamVjdCggQ2FjaGVkT2JqZWN0KikgY29uc3Q7Ci0JCQotICAgICAgICB2
b2lkIHNldExvYWRJblByb2dyZXNzKGJvb2wpOwotICAgICAgICBib29sIGxvYWRJblByb2dyZXNz
KCkgY29uc3QgeyByZXR1cm4gbV9sb2FkSW5Qcm9ncmVzczsgfQotCi0gICAgcHJpdmF0ZToKLSAg
ICAgICAgYm9vbCBuZWVkUmVsb2FkKGNvbnN0IEtVUkwgJmZ1bGxVcmwpOwotCi0gICAgICAgIGZy
aWVuZCBjbGFzcyBDYWNoZTsKLSAgICAgICAgZnJpZW5kIGNsYXNzIERPTTo6RG9jdW1lbnRJbXBs
OwotCi0gICAgICAgIFFTdHJpbmdMaXN0IG1fcmVsb2FkZWRVUkxzOwotICAgICAgICBtdXRhYmxl
IFFQdHJMaXN0PENhY2hlZE9iamVjdD4gbV9kb2NPYmplY3RzOwotCXRpbWVfdCBtX2V4cGlyZURh
dGU7Ci0JS0lPOjpDYWNoZUNvbnRyb2wgbV9jYWNoZVBvbGljeTsKLSAgICAgICAgYm9vbCBtX2Jh
dXRvbG9hZEltYWdlcyA6IDE7Ci0gICAgICAgIEtIVE1MU2V0dGluZ3M6OktBbmltYXRpb25BZHZp
Y2UgbV9zaG93QW5pbWF0aW9ucyA6IDI7Ci0gICAgICAgIEtIVE1MUGFydCogbV9wYXJ0OwotICAg
ICAgICBET006OkRvY3VtZW50SW1wbCAqbV9kb2M7Ci0gICAgICAgIGJvb2wgbV9sb2FkSW5Qcm9n
cmVzczsKLSAgICB9OwotCi0gICAgLyoqCi0gICAgICogQGludGVybmFsCi0gICAgICovCi0gICAg
Y2xhc3MgUmVxdWVzdAotICAgIHsKLSAgICBwdWJsaWM6Ci0JUmVxdWVzdChEb2NMb2FkZXIqIGRs
LCBDYWNoZWRPYmplY3QgKl9vYmplY3QsIGJvb2wgX2luY3JlbWVudGFsKTsKLQl+UmVxdWVzdCgp
OwotCWJvb2wgaW5jcmVtZW50YWw7Ci0JUUJ1ZmZlciBtX2J1ZmZlcjsKLQlDYWNoZWRPYmplY3Qg
Km9iamVjdDsKLSAgICAgICAgRG9jTG9hZGVyKiBtX2RvY0xvYWRlcjsKLSAgICAgICAgYm9vbCBt
dWx0aXBhcnQ7Ci0gICAgIH07Ci0KLSAgICAvKioKLSAgICAgKiBAaW50ZXJuYWwKLSAgICAgKi8K
LSAgICBjbGFzcyBMb2FkZXIgOiBwdWJsaWMgUU9iamVjdAotICAgIHsKLQlRX09CSkVDVAotCi0g
ICAgcHVibGljOgkKLQlMb2FkZXIoKTsKLQl+TG9hZGVyKCk7Ci0KLQl2b2lkIGxvYWQoRG9jTG9h
ZGVyKiBkbCwgQ2FjaGVkT2JqZWN0ICpvYmplY3QsIGJvb2wgaW5jcmVtZW50YWwgPSB0cnVlKTsK
LQotICAgICAgICBpbnQgbnVtUmVxdWVzdHMoIERvY0xvYWRlciogZGwgKSBjb25zdDsKLSAgICAg
ICAgdm9pZCBjYW5jZWxSZXF1ZXN0cyggRG9jTG9hZGVyKiBkbCApOwotCi0Jdm9pZCByZW1vdmVC
YWNrZ3JvdW5kRGVjb2RpbmdSZXF1ZXN0IChSZXF1ZXN0ICpyKTsKLQkKLSAgICAgICAgLy8gbWF5
IHJldHVybiAwTAotICAgICAgICBLSU86OkpvYiAqam9iRm9yUmVxdWVzdCggY29uc3QgRE9NOjpE
T01TdHJpbmcgJnVybCApIGNvbnN0OwotCi0gICAgICAgIEtXUUxvYWRlciAqa3dxOwotCi0gICAg
c2lnbmFsczoKLQlmcmllbmQgY2xhc3MgQ2FjaGVkSW1hZ2VDYWxsYmFjazsKLQotICAgICAgICB2
b2lkIHJlcXVlc3RTdGFydGVkKCBraHRtbDo6RG9jTG9hZGVyKiBkbCwga2h0bWw6OkNhY2hlZE9i
amVjdCogb2JqICk7Ci0Jdm9pZCByZXF1ZXN0RG9uZSgga2h0bWw6OkRvY0xvYWRlciogZGwsIGto
dG1sOjpDYWNoZWRPYmplY3QgKm9iaiApOwotCXZvaWQgcmVxdWVzdEZhaWxlZCgga2h0bWw6OkRv
Y0xvYWRlciogZGwsIGtodG1sOjpDYWNoZWRPYmplY3QgKm9iaiApOwotCi0gICAgcHJvdGVjdGVk
IHNsb3RzOgotICAgICAgICB2b2lkIHNsb3RGaW5pc2hlZCggS0lPOjpKb2IgKiAsIE5TRGF0YSAq
YWxsRGF0YSk7Ci0Jdm9pZCBzbG90RGF0YSggS0lPOjpKb2IgKiwgY29uc3QgY2hhciAqZGF0YSwg
aW50IHNpemUgKTsKLSAgICAgICAgdm9pZCBzbG90UmVjZWl2ZWRSZXNwb25zZSAoIEtJTzo6Sm9i
ICosIE5TVVJMUmVzcG9uc2UgKnJlc3BvbnNlICk7Ci0KLSAgICBwcml2YXRlOgotCXZvaWQgc2Vy
dmVQZW5kaW5nUmVxdWVzdHMoKTsKLQotICAgICAgICB2aXJ0dWFsIGJvb2wgaXNLSFRNTExvYWRl
cigpIGNvbnN0OwotCi0JUVB0ckxpc3Q8UmVxdWVzdD4gbV9yZXF1ZXN0c1BlbmRpbmc7Ci0JUVB0
ckRpY3Q8UmVxdWVzdD4gbV9yZXF1ZXN0c0xvYWRpbmc7Ci0KLQlRUHRyTGlzdDxSZXF1ZXN0PiBt
X3JlcXVlc3RzQmFja2dyb3VuZERlY29kaW5nOwotCi0jaWZkZWYgSEFWRV9MSUJKUEVHCi0gICAg
ICAgIEtKUEVHRm9ybWF0VHlwZSBtX2pwZWdsb2FkZXI7Ci0jZW5kaWYKLSAgICB9OwotCi0gICAg
ICAgIC8qKgotICAgICAqIEBpbnRlcm5hbAotICAgICAqCi0gICAgICogUHJvdmlkZXMgYSBjYWNo
ZS9sb2FkZXIgZm9yIG9iamVjdHMgbmVlZGVkIGZvciBkaXNwbGF5aW5nIHRoZSBodG1sIHBhZ2Uu
Ci0gICAgICogQXQgdGhlIG1vbWVudCB0aGVzZSBhcmUgc3R5bGVzaGVldHMsIHNjcmlwdHMgYW5k
IGltYWdlcwotICAgICAqLwotICAgIGNsYXNzIENhY2hlCi0gICAgewotCWZyaWVuZCBjbGFzcyBE
b2NMb2FkZXI7Ci0gICAgcHVibGljOgotCS8qKgotCSAqIGluaXQgdGhlIGNhY2hlIGluIGNhc2Ug
aXQncyBub3QgYWxyZWFkeS4gVGhpcyBuZWVkcyB0byBnZXQgY2FsbGVkIG9uY2UKLQkgKiBiZWZv
cmUgdXNpbmcgaXQuCi0JICovCi0Jc3RhdGljIHZvaWQgaW5pdCgpOwotICAgICAgICAKLQkvKioK
LQkgKiBBc2sgdGhlIGNhY2hlIGZvciBzb21lIHVybC4gV2lsbCByZXR1cm4gYSBjYWNoZWRPYmpl
Y3QsIGFuZAotCSAqIGxvYWQgdGhlIHJlcXVlc3RlZCBkYXRhIGluIGNhc2UgaXQncyBub3QgY2Fo
Y2VkCi0gICAgICAgICAqIGlmIHRoZSBEb2NMb2FkZXIgaXMgemVybywgdGhlIHVybCBtdXN0IGJl
IGZ1bGwtcXVhbGlmaWVkLgotICAgICAgICAgKiBPdGhlcndpc2UsIGl0IGlzIGF1dG9tYXRpY2Fs
bHkgYmFzZS11cmwgZXhwYW5kZWQKLQkgKi8KLQlzdGF0aWMgQ2FjaGVkSW1hZ2UgKnJlcXVlc3RJ
bWFnZSggRG9jTG9hZGVyKiBsLCBjb25zdCBET006OkRPTVN0cmluZyAmdXJsLCBib29sIHJlbG9h
ZD1mYWxzZSwgdGltZV90IF9leHBpcmVEYXRlPTApOwotICAgICAgICBzdGF0aWMgQ2FjaGVkSW1h
Z2UgKnJlcXVlc3RJbWFnZSggRG9jTG9hZGVyKiBsLCBjb25zdCBLVVJMICZ1cmwsIGJvb2wgcmVs
b2FkPWZhbHNlLCB0aW1lX3QgX2V4cGlyZURhdGU9MCk7Ci0KLQkvKioKLQkgKiBBc2sgdGhlIGNh
Y2hlIGZvciBzb21lIHVybC4gV2lsbCByZXR1cm4gYSBjYWNoZWRPYmplY3QsIGFuZAotCSAqIGxv
YWQgdGhlIHJlcXVlc3RlZCBkYXRhIGluIGNhc2UgaXQncyBub3QgY2FjaGVkCi0JICovCi0Jc3Rh
dGljIENhY2hlZENTU1N0eWxlU2hlZXQgKnJlcXVlc3RTdHlsZVNoZWV0KCBEb2NMb2FkZXIqIGws
IGNvbnN0IERPTTo6RE9NU3RyaW5nICZ1cmwsIGJvb2wgcmVsb2FkPWZhbHNlLCB0aW1lX3QgX2V4
cGlyZURhdGU9MCwgY29uc3QgUVN0cmluZyYgY2hhcnNldCA9IFFTdHJpbmc6Om51bGwpOwotCi0j
aWZkZWYgS0hUTUxfWFNMVAotICAgICAgICAvLyBBc2sgdGhlIGNhY2hlIGZvciBhbiBYU0wgc3R5
bGVzaGVldC4KLSAgICAgICAgc3RhdGljIENhY2hlZFhTTFN0eWxlU2hlZXQqIHJlcXVlc3RYU0xT
dHlsZVNoZWV0KERvY0xvYWRlciogbCwgY29uc3QgRE9NOjpET01TdHJpbmcgJnVybCwgCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29s
IHJlbG9hZD1mYWxzZSwgdGltZV90IF9leHBpcmVEYXRlPTApOwotI2VuZGlmCi0jaWZuZGVmIEtI
VE1MX05PX1hCTAotICAgICAgICAvLyBBc2sgdGhlIGNhY2hlIGZvciBhbiBYQkwgZG9jdW1lbnQu
Ci0gICAgICAgIHN0YXRpYyBDYWNoZWRYQkxEb2N1bWVudCogcmVxdWVzdFhCTERvY3VtZW50KERv
Y0xvYWRlciogbCwgY29uc3QgRE9NOjpET01TdHJpbmcgJnVybCwgCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVsb2FkPWZhbHNlLCB0
aW1lX3QgX2V4cGlyZURhdGU9MCk7Ci0jZW5kaWYKLQotICAgICAgICAvKioKLSAgICAgICAgICog
UHJlLWxvYWRzIGEgc3R5bGVzaGVldCBpbnRvIHRoZSBjYWNoZS4KLSAgICAgICAgICovCi0gICAg
ICAgIHN0YXRpYyB2b2lkIHByZWxvYWRTdHlsZVNoZWV0KGNvbnN0IFFTdHJpbmcgJnVybCwgY29u
c3QgUVN0cmluZyAmc3R5bGVzaGVldF9kYXRhKTsKLQotCS8qKgotCSAqIEFzayB0aGUgY2FjaGUg
Zm9yIHNvbWUgdXJsLiBXaWxsIHJldHVybiBhIGNhY2hlZE9iamVjdCwgYW5kCi0JICogbG9hZCB0
aGUgcmVxdWVzdGVkIGRhdGEgaW4gY2FzZSBpdCdzIG5vdCBjYWhjZWQKLQkgKi8KLQlzdGF0aWMg
Q2FjaGVkU2NyaXB0ICpyZXF1ZXN0U2NyaXB0KCBEb2NMb2FkZXIqIGwsIGNvbnN0IERPTTo6RE9N
U3RyaW5nICZ1cmwsIGJvb2wgcmVsb2FkPWZhbHNlLCB0aW1lX3QgX2V4cGlyZURhdGU9MCwgY29u
c3QgUVN0cmluZyYgY2hhcnNldD1RU3RyaW5nOjpudWxsKTsKLQotICAgICAgICAvKioKLSAgICAg
ICAgICogUHJlLWxvYWRzIGEgc2NyaXB0IGludG8gdGhlIGNhY2hlLgotICAgICAgICAgKi8KLSAg
ICAgICAgc3RhdGljIHZvaWQgcHJlbG9hZFNjcmlwdChjb25zdCBRU3RyaW5nICZ1cmwsIGNvbnN0
IFFTdHJpbmcgJnNjcmlwdF9kYXRhKTsKLQotCS8qKgotCSAqIHNldHMgdGhlIHNpemUgb2YgdGhl
IGNhY2hlLiBUaGlzIHdpbGwgb25seSBob2QgYXBwcm94aW1hdGVseSwgc2luY2UgdGhlIHNpemUg
c29tZQotCSAqIGNhY2hlZCBvYmplY3RzIChsaWtlIHN0eWxlc2hlZXRzKSB0YWtlIHVwIGluIG1l
bW9yeSBpcyBub3QgZXhhY2x0eSBrbm93bi4KLQkgKi8KLQlzdGF0aWMgdm9pZCBzZXRTaXplKCBp
bnQgYnl0ZXMgKTsKLQkvKioKLQkgKiByZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBjYWNoZQotCSAq
LwotCXN0YXRpYyBpbnQgc2l6ZSgpIHsgcmV0dXJuIG1heFNpemU7IH07Ci0KLSAgICAgICAgc3Rh
dGljIGludCBtYXhDYWNoZWFibGVPYmplY3RTaXplKCkgeyByZXR1cm4gbWF4Q2FjaGVhYmxlOyB9
Ci0KLQkvKioKLQkgKiBjbGVhbiB1cCBjYWNoZQotCSAqLwotCXN0YXRpYyB2b2lkIGZsdXNoKGJv
b2wgZm9yY2U9ZmFsc2UpOwotCi0JLyoqCi0JICogY2xlYXJzIHRoZSBjYWNoZQotCSAqIFdhcm5p
bmc6IGNhbGwgdGhpcyBvbmx5IGF0IHRoZSBlbmQgb2YgeW91ciBwcm9ncmFtLCB0byBjbGVhbgot
CSAqIHVwIG1lbW9yeSAodXNlZnVsIGZvciBmaW5kaW5nIG1lbW9yeSBob2xlcykKLQkgKi8KLQlz
dGF0aWMgdm9pZCBjbGVhcigpOwotCi0Jc3RhdGljIExvYWRlciAqbG9hZGVyKCkgeyByZXR1cm4g
bV9sb2FkZXI7IH0KLQotICAgIAlzdGF0aWMgUVBpeG1hcCAqbnVsbFBpeG1hcDsKLSAgICAgICAg
c3RhdGljIFFQaXhtYXAgKmJyb2tlblBpeG1hcDsKLQotICAgICAgICBzdGF0aWMgdm9pZCByZW1v
dmVDYWNoZUVudHJ5KCBDYWNoZWRPYmplY3QgKm9iamVjdCApOwotCi0gICAgICAgIHN0cnVjdCBU
eXBlU3RhdGlzdGljIHsKLSAgICAgICAgICAgIGludCBjb3VudDsKLSAgICAgICAgICAgIGludCBz
aXplOwotICAgICAgICAgICAgVHlwZVN0YXRpc3RpYygpIDogY291bnQoMCksIHNpemUoMCkgeyB9
Ci0gICAgICAgIH07Ci0gICAgICAgIAotICAgICAgICBzdHJ1Y3QgU3RhdGlzdGljcyB7Ci0gICAg
ICAgICAgICBUeXBlU3RhdGlzdGljIGltYWdlczsKLSAgICAgICAgICAgIFR5cGVTdGF0aXN0aWMg
bW92aWVzOwotICAgICAgICAgICAgVHlwZVN0YXRpc3RpYyBzdHlsZVNoZWV0czsKLSAgICAgICAg
ICAgIFR5cGVTdGF0aXN0aWMgc2NyaXB0czsKLSNpZmRlZiBLSFRNTF9YU0xUCi0gICAgICAgICAg
ICBUeXBlU3RhdGlzdGljIHhzbFN0eWxlU2hlZXRzOwotI2VuZGlmCi0jaWZuZGVmIEtIVE1MX05P
X1hCTAotICAgICAgICAgICAgVHlwZVN0YXRpc3RpYyB4YmxEb2NzOwotI2VuZGlmCi0gICAgICAg
ICAgICBUeXBlU3RhdGlzdGljIG90aGVyOwotICAgICAgICB9OwotCi0gICAgICAgIHN0YXRpYyBT
dGF0aXN0aWNzIGdldFN0YXRpc3RpY3MoKTsKLSAgICAgICAgc3RhdGljIHZvaWQgZmx1c2hBbGwo
KTsKLSAgICAgICAgc3RhdGljIHZvaWQgc2V0Q2FjaGVEaXNhYmxlZChib29sKTsKLQotICAgICAg
ICBzdGF0aWMgdm9pZCBpbnNlcnRJbkxSVUxpc3QoQ2FjaGVkT2JqZWN0ICopOwotICAgICAgICBz
dGF0aWMgdm9pZCByZW1vdmVGcm9tTFJVTGlzdChDYWNoZWRPYmplY3QgKik7Ci0gICAgICAgIHN0
YXRpYyBib29sIGFkanVzdFNpemUoQ2FjaGVkT2JqZWN0ICosIGludCBzaXplRGVsdGEpOwotICAg
ICAgICAKLSAgICAgICAgc3RhdGljIExSVUxpc3QqIGdldExSVUxpc3RGb3IoQ2FjaGVkT2JqZWN0
KiBvKTsKLSAgICAgICAgCi0gICAgICAgIHN0YXRpYyB2b2lkIGNoZWNrTFJVQW5kVW5jYWNoZWFi
bGVMaXN0SW50ZWdyaXR5KCk7Ci0KLSAgICBwcm90ZWN0ZWQ6Ci0gICAgICAgIHN0YXRpYyBRRGlj
dDxDYWNoZWRPYmplY3Q+ICpjYWNoZTsKLSAgICAgICAgc3RhdGljIFFQdHJMaXN0PERvY0xvYWRl
cj4qIGRvY2xvYWRlcjsKLSAgICAKLSAgICAgICAgc3RhdGljIGludCBtYXhTaXplOwotICAgICAg
ICBzdGF0aWMgaW50IG1heENhY2hlYWJsZTsKLSAgICAgICAgc3RhdGljIGludCBmbHVzaENvdW50
OwotICAgIAotICAgICAgICBzdGF0aWMgTG9hZGVyICptX2xvYWRlcjsKLSAgICAKLSAgICAgICAg
c3RhdGljIHZvaWQgbW92ZVRvSGVhZE9mTFJVTGlzdChDYWNoZWRPYmplY3QgKik7Ci0gICAgCi0g
ICAgICAgIHN0YXRpYyBMUlVMaXN0ICptX0xSVUxpc3RzOwotICAgICAgICBzdGF0aWMgaW50IG1f
dG90YWxTaXplT2ZMUlVMaXN0czsKLSAgICAgICAgICAgIAotICAgICAgICBzdGF0aWMgQ2FjaGVk
T2JqZWN0ICptX2hlYWRPZlVuY2FjaGVhYmxlTGlzdDsKLSAgICAgICAgICAgIAotICAgICAgICBz
dGF0aWMgaW50IG1fY291bnRPZkxSVUFuZFVuY2FjaGVhYmxlTGlzdHM7Ci0gICAgfTsKLQogfTsK
IAogI2VuZGlmCkluZGV4OiBtaXNjL0NhY2hlZE9iamVjdC5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIG1pc2Mv
Q2FjaGVkT2JqZWN0LmgJKHJldmlzaW9uIDExOTQ4KQorKysgbWlzYy9DYWNoZWRPYmplY3QuaAko
d29ya2luZyBjb3B5KQpAQCAtMjMsMTkgKzIzLDEyIEBACiAgICAgVGhpcyBjbGFzcyBwcm92aWRl
cyBhbGwgZnVuY3Rpb25hbGl0eSBuZWVkZWQgZm9yIGxvYWRpbmcgaW1hZ2VzLCBzdHlsZSBzaGVl
dHMgYW5kIGh0bWwKICAgICBwYWdlcyBmcm9tIHRoZSB3ZWIuIEl0IGhhcyBhIG1lbW9yeSBjYWNo
ZSBmb3IgdGhlc2Ugb2JqZWN0cy4KICovCi0jaWZuZGVmIF9raHRtbF9sb2FkZXJfaAotI2RlZmlu
ZSBfa2h0bWxfbG9hZGVyX2gKLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlIDxjb25m
aWcuaD4KLSNlbmRpZgorI2lmbmRlZiBLSFRNTF9DYWNoZWRPYmplY3RfaAorI2RlZmluZSBLSFRN
TF9DYWNoZWRPYmplY3RfaAogCiAjaW5jbHVkZSA8dGltZS5oPgogCiAjaW5jbHVkZSAibG9hZGVy
X2NsaWVudC5oIgotI2lmZGVmIEhBVkVfTElCSlBFRwotI2luY2x1ZGUgImxvYWRlcl9qcGVnLmgi
Ci0jZW5kaWYKIAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHFwdHJsaXN0Lmg+CkBA
IC02Nyw3ICs2MCw2IEBAIG5hbWVzcGFjZSBET00KICAgICBjbGFzcyBEb2N1bWVudEltcGw7CiB9
OwogCi0KIGNsYXNzIEtXUUxvYWRlcjsKIAogI2lmIF9fT0JKQ19fCkBAIC04NSwxOSArNzcsOCBA
QCBuYW1lc3BhY2Uga2h0bWwKICAgICBjbGFzcyBSZXF1ZXN0OwogICAgIGNsYXNzIERvY0xvYWRl
cjsKICAgICBjbGFzcyBEZWNvZGVyOwotCi0gI2RlZmluZSBNQVhfTFJVX0xJU1RTIDIwCi0gICAg
Ci0gICAgc3RydWN0IExSVUxpc3QgewotICAgICAgICBDYWNoZWRPYmplY3QqIG1faGVhZDsKLSAg
ICAgICAgQ2FjaGVkT2JqZWN0KiBtX3RhaWw7Ci0gICAgCi0gICAgICAgIExSVUxpc3QoKTsKLSAg
ICAgICAgfkxSVUxpc3QoKTsKLSAgICB9OwogICAgIAogICAgIC8qKgotICAgICAqIEBpbnRlcm5h
bAogICAgICAqCiAgICAgICogQSBjYWNoZWQgb2JqZWN0LiBDbGFzc2VzIHdobyB3YW50IHRvIHVz
ZSB0aGlzIG9iamVjdCBzaG91bGQgZGVyaXZlCiAgICAgICogZnJvbSBDYWNoZWRPYmplY3RDbGll
bnQsIHRvIGdldCB0aGUgZnVuY3Rpb24gY2FsbHMgaW4gY2FzZSB0aGUgcmVxdWVzdGVkIGRhdGEg
aGFzIGFycml2ZWQuCkBAIC0xMzgsMTYgKzExOSwxNiBAQCBuYW1lc3BhY2Uga2h0bWwKIAkgICAg
bV9mcmVlID0gZmFsc2U7CiAJICAgIG1fY2FjaGVQb2xpY3kgPSBfY2FjaGVQb2xpY3k7CiAJICAg
IG1fcmVxdWVzdCA9IDA7Ci0gICAgICAgIG1fcmVzcG9uc2UgPSAwOwotICAgICAgICBtX2FsbERh
dGEgPSAwOworICAgICAgICAgICAgbV9yZXNwb25zZSA9IDA7CisgICAgICAgICAgICBtX2FsbERh
dGEgPSAwOwogCSAgICBtX2V4cGlyZURhdGUgPSBfZXhwaXJlRGF0ZTsKLSAgICAgICAgbV9kZWxl
dGVkID0gZmFsc2U7Ci0gICAgICAgIG1fZXhwaXJlRGF0ZUNoYW5nZWQgPSBmYWxzZTsKLSAgICAg
ICAgCi0gICAgICAgIG1fYWNjZXNzQ291bnQgPSAwOwotICAgICAgICAKLSAgICAgICAgbV9uZXh0
SW5MUlVMaXN0ID0gMDsKLSAgICAgICAgbV9wcmV2SW5MUlVMaXN0ID0gMDsKKyAgICAgICAgICAg
IG1fZGVsZXRlZCA9IGZhbHNlOworICAgICAgICAgICAgbV9leHBpcmVEYXRlQ2hhbmdlZCA9IGZh
bHNlOworICAgICAgICAgICAgCisgICAgICAgICAgICBtX2FjY2Vzc0NvdW50ID0gMDsKKyAgICAg
ICAgICAgIAorICAgICAgICAgICAgbV9uZXh0SW5MUlVMaXN0ID0gMDsKKyAgICAgICAgICAgIG1f
cHJldkluTFJVTGlzdCA9IDA7CiAJfQogCXZpcnR1YWwgfkNhY2hlZE9iamVjdCgpOwogCkBAIC0x
NzEsOCArMTUyLDggQEAgbmFtZXNwYWNlIGtodG1sCiAgICAgICAgIAogICAgICAgICB2aXJ0dWFs
IGJvb2wgaXNJbWFnZSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CiAKLSAgICBpbnQgYWNjZXNz
Q291bnQoKSBjb25zdCB7IHJldHVybiBtX2FjY2Vzc0NvdW50OyB9Ci0gICAgdm9pZCBpbmNyZWFz
ZUFjY2Vzc0NvdW50KCkgeyBtX2FjY2Vzc0NvdW50Kys7IH0KKyAgICAgICAgaW50IGFjY2Vzc0Nv
dW50KCkgY29uc3QgeyByZXR1cm4gbV9hY2Nlc3NDb3VudDsgfQorICAgICAgICB2b2lkIGluY3Jl
YXNlQWNjZXNzQ291bnQoKSB7IG1fYWNjZXNzQ291bnQrKzsgfQogICAgIAogCS8qKgogCSAqIGNv
bXB1dGVzIHRoZSBzdGF0dXMgb2YgYW4gb2JqZWN0IGFmdGVyIGxvYWRpbmcuCkBAIC0yMjYsNyAr
MjA3LDcgQEAgbmFtZXNwYWNlIGtodG1sCiAJU3RhdHVzIG1fc3RhdHVzOwogICAgIHByaXZhdGU6
CiAJaW50IG1fc2l6ZTsKLSAgICBpbnQgbV9hY2Nlc3NDb3VudDsKKyAgICAgICAgaW50IG1fYWNj
ZXNzQ291bnQ7CiAgICAgCiAgICAgcHJvdGVjdGVkOgogCXRpbWVfdCBtX2V4cGlyZURhdGU7CkBA
IC0yNDQsNDcwICsyMjUsNiBAQCBuYW1lc3BhY2Uga2h0bWwKICAgICAgICAgZnJpZW5kIGNsYXNz
IENhY2hlOwogICAgIH07CiAKLQotICAgIC8qKgotICAgICAqIGEgY2FjaGVkIHN0eWxlIHNoZWV0
Ci0gICAgICovCi0gICAgY2xhc3MgQ2FjaGVkQ1NTU3R5bGVTaGVldCA6IHB1YmxpYyBDYWNoZWRP
YmplY3QKLSAgICB7Ci0gICAgcHVibGljOgotCUNhY2hlZENTU1N0eWxlU2hlZXQoRG9jTG9hZGVy
KiBkbCwgY29uc3QgRE9NOjpET01TdHJpbmcgJnVybCwgS0lPOjpDYWNoZUNvbnRyb2wgY2FjaGVQ
b2xpY3ksIHRpbWVfdCBfZXhwaXJlRGF0ZSwgY29uc3QgUVN0cmluZyYgY2hhcnNldCk7Ci0JQ2Fj
aGVkQ1NTU3R5bGVTaGVldChjb25zdCBET006OkRPTVN0cmluZyAmdXJsLCBjb25zdCBRU3RyaW5n
ICZzdHlsZXNoZWV0X2RhdGEpOwotCXZpcnR1YWwgfkNhY2hlZENTU1N0eWxlU2hlZXQoKTsKLQot
CWNvbnN0IERPTTo6RE9NU3RyaW5nICZzaGVldCgpIGNvbnN0IHsgcmV0dXJuIG1fc2hlZXQ7IH0K
LQotCXZpcnR1YWwgdm9pZCByZWYoQ2FjaGVkT2JqZWN0Q2xpZW50ICpjb25zdW1lcik7Ci0Jdmly
dHVhbCB2b2lkIGRlcmVmKENhY2hlZE9iamVjdENsaWVudCAqY29uc3VtZXIpOwotCi0gICAgICAg
IHZpcnR1YWwgdm9pZCBzZXRDaGFyc2V0KCBjb25zdCBRU3RyaW5nICZjaHMgKTsKLSAgICAgICAg
dmlydHVhbCB2b2lkIGRhdGEoIFFCdWZmZXIgJmJ1ZmZlciwgYm9vbCBlb2YgKTsKLQl2aXJ0dWFs
IHZvaWQgZXJyb3IoIGludCBlcnIsIGNvbnN0IGNoYXIgKnRleHQgKTsKLQotICAgICAgICB2aXJ0
dWFsIGJvb2wgc2NoZWR1bGUoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0KLQl2b2lkIGNoZWNr
Tm90aWZ5KCk7Ci0KLSAgICBwcm90ZWN0ZWQ6Ci0JRE9NOjpET01TdHJpbmcgbV9zaGVldDsKLSAg
ICAgICAgUVRleHRDb2RlYyogbV9jb2RlYzsKLSAgICB9OwotCi0gICAgLyoqCi0gICAgICogYSBj
YWNoZWQgc2NyaXB0Ci0gICAgICovCi0gICAgY2xhc3MgQ2FjaGVkU2NyaXB0IDogcHVibGljIENh
Y2hlZE9iamVjdAotICAgIHsKLSAgICBwdWJsaWM6Ci0JQ2FjaGVkU2NyaXB0KERvY0xvYWRlciog
ZGwsIGNvbnN0IERPTTo6RE9NU3RyaW5nICZ1cmwsIEtJTzo6Q2FjaGVDb250cm9sIGNhY2hlUG9s
aWN5LCB0aW1lX3QgX2V4cGlyZURhdGUsIGNvbnN0IFFTdHJpbmcmIGNoYXJzZXQpOwotCUNhY2hl
ZFNjcmlwdChjb25zdCBET006OkRPTVN0cmluZyAmdXJsLCBjb25zdCBRU3RyaW5nICZzY3JpcHRf
ZGF0YSk7Ci0JdmlydHVhbCB+Q2FjaGVkU2NyaXB0KCk7Ci0KLQljb25zdCBET006OkRPTVN0cmlu
ZyAmc2NyaXB0KCkgY29uc3QgeyByZXR1cm4gbV9zY3JpcHQ7IH0KLQotCXZpcnR1YWwgdm9pZCBy
ZWYoQ2FjaGVkT2JqZWN0Q2xpZW50ICpjb25zdW1lcik7Ci0JdmlydHVhbCB2b2lkIGRlcmVmKENh
Y2hlZE9iamVjdENsaWVudCAqY29uc3VtZXIpOwotCi0gICAgICAgIHZpcnR1YWwgdm9pZCBzZXRD
aGFyc2V0KCBjb25zdCBRU3RyaW5nICZjaHMgKTsKLQl2aXJ0dWFsIHZvaWQgZGF0YSggUUJ1ZmZl
ciAmYnVmZmVyLCBib29sIGVvZiApOwotCXZpcnR1YWwgdm9pZCBlcnJvciggaW50IGVyciwgY29u
c3QgY2hhciAqdGV4dCApOwotCi0gICAgICAgIHZpcnR1YWwgYm9vbCBzY2hlZHVsZSgpIGNvbnN0
IHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgICAgIAotICAgICAgICBib29sIGVycm9yT2NjdXJyZWQo
KSBjb25zdCB7IHJldHVybiBtX2Vycm9yT2NjdXJyZWQ7IH0KLQotCXZvaWQgY2hlY2tOb3RpZnko
KTsKLQotICAgIHByb3RlY3RlZDoKLQlET006OkRPTVN0cmluZyBtX3NjcmlwdDsKLSAgICAgICAg
UVRleHRDb2RlYyogbV9jb2RlYzsKLSAgICAgICAgYm9vbCBtX2Vycm9yT2NjdXJyZWQ7Ci0gICAg
fTsKLQotICAgIGNsYXNzIEltYWdlU291cmNlOwotCi0gICAgY2xhc3MgQ2FjaGVkSW1hZ2U7Ci0g
ICAgCi0gICAgY2xhc3MgQ2FjaGVkSW1hZ2VDYWxsYmFjawotICAgIHsKLSAgICBwdWJsaWM6Ci0g
ICAgICAgIENhY2hlZEltYWdlQ2FsbGJhY2sgKENhY2hlZEltYWdlICpjKSA6IGNhY2hlZEltYWdl
KGMpLCByZWZDb3VudCgxKSwgaGVhZGVyUmVjZWl2ZWQoZmFsc2UpIHt9OwotCi0gICAgICAgIHZv
aWQgcmVmKCkgeyByZWZDb3VudCsrOyB9Ci0gICAgICAgIHZvaWQgZGVyZWYoKSB7IGlmICgtLXJl
ZkNvdW50ID09IDApIGRlbGV0ZSB0aGlzOyB9Ci0gICAgICAgIAotICAgICAgICB2b2lkIG5vdGlm
eVVwZGF0ZSgpOwotICAgICAgICB2b2lkIG5vdGlmeUZpbmlzaGVkKCk7Ci0gICAgICAgIHZvaWQg
bm90aWZ5RGVjb2RpbmdFcnJvcigpOwotICAgICAgICB2b2lkIGNsZWFyKCk7Ci0gICAgICAgIHZv
aWQgaGFuZGxlRXJyb3IoKTsKLSAgICAgICAgCi0gICAgcHJpdmF0ZToKLSAgICAgICAgQ2FjaGVk
SW1hZ2UgKmNhY2hlZEltYWdlOwotICAgICAgICB1aW50IHJlZkNvdW50OwotCWJvb2wgaGVhZGVy
UmVjZWl2ZWQ7Ci0gICAgfTsKLSAgICAgICAgCi0gICAgLyoqCi0gICAgICogYSBjYWNoZWQgaW1h
Z2UKLSAgICAgKi8KLSAgICBjbGFzcyBDYWNoZWRJbWFnZSA6IHB1YmxpYyBRT2JqZWN0LCBwdWJs
aWMgQ2FjaGVkT2JqZWN0Ci0gICAgewotCVFfT0JKRUNUCi0gICAgcHVibGljOgotCUNhY2hlZElt
YWdlKERvY0xvYWRlciogZGwsIGNvbnN0IERPTTo6RE9NU3RyaW5nICZ1cmwsIEtJTzo6Q2FjaGVD
b250cm9sIGNhY2hlUG9saWN5LCB0aW1lX3QgX2V4cGlyZURhdGUpOwotCXZpcnR1YWwgfkNhY2hl
ZEltYWdlKCk7Ci0KLQljb25zdCBRUGl4bWFwICZwaXhtYXAoKSBjb25zdDsKLQljb25zdCBRUGl4
bWFwICZ0aWxlZF9waXhtYXAoY29uc3QgUUNvbG9yJiBiZyk7Ci0KLSAgICAgICAgUVNpemUgcGl4
bWFwX3NpemUoKSBjb25zdDsgICAgLy8gcmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgY29tcGxldGUg
KGkuZS4gd2hlbiBmaW5pc2hlZCkgbG9hZGluZwotICAgICAgICBRUmVjdCB2YWxpZF9yZWN0KCkg
Y29uc3Q7ICAgICAvLyByZXR1cm5zIHRoZSByZWN0YW5nbGUgb2YgcGl4bWFwIHRoYXQgaGFzIGJl
ZW4gbG9hZGVkIGFscmVhZHkKLQotICAgICAgICB2b2lkIHJlZihDYWNoZWRPYmplY3RDbGllbnQg
KmNvbnN1bWVyKTsKLQl2aXJ0dWFsIHZvaWQgZGVyZWYoQ2FjaGVkT2JqZWN0Q2xpZW50ICpjb25z
dW1lcik7Ci0KLQl2aXJ0dWFsIHZvaWQgZGF0YSggUUJ1ZmZlciAmYnVmZmVyLCBib29sIGVvZiAp
OwotCXZpcnR1YWwgdm9pZCBlcnJvciggaW50IGVyciwgY29uc3QgY2hhciAqdGV4dCApOwotCi0g
ICAgICAgIGJvb2wgaXNUcmFuc3BhcmVudCgpIGNvbnN0IHsgcmV0dXJuIGlzRnVsbHlUcmFuc3Bh
cmVudDsgfQotICAgICAgICBib29sIGlzRXJyb3JJbWFnZSgpIGNvbnN0IHsgcmV0dXJuIGVycm9y
T2NjdXJlZDsgfQotCi0gICAgICAgIHZvaWQgc2V0U2hvd0FuaW1hdGlvbnMoIEtIVE1MU2V0dGlu
Z3M6OktBbmltYXRpb25BZHZpY2UgKTsKLQotICAgICAgICB2aXJ0dWFsIGJvb2wgc2NoZWR1bGUo
KSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0KLQl2b2lkIGNoZWNrTm90aWZ5KCk7Ci0gICAgICAg
IAotICAgICAgICB2aXJ0dWFsIGJvb2wgaXNJbWFnZSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0K
LQotCXZvaWQgY2xlYXIoKTsKLSAgICAgICAgCi0gICAgcHJpdmF0ZToKLSAgICAgICAgdm9pZCBk
b19ub3RpZnkoY29uc3QgUVBpeG1hcCYgcCwgY29uc3QgUVJlY3QmIHIpOwotCi0gICAgICAgIFFQ
aXhtYXAqIHA7Ci0JUVBpeG1hcCogYmc7Ci0gICAgICAgIFFSZ2IgYmdDb2xvcjsKLSAgICAgICAg
bXV0YWJsZSBRUGl4bWFwKiBwaXhQYXJ0OwotCi0gICAgICAgIEltYWdlU291cmNlKiBpbWdTb3Vy
Y2U7Ci0gICAgICAgIGNvbnN0IGNoYXIqIGZvcm1hdFR5cGU7ICAvLyBJcyB0aGUgbmFtZSBvZiB0
aGUgbW92aWUgZm9ybWF0IHR5cGUKLQotCWludCB3aWR0aDsKLQlpbnQgaGVpZ2h0OwotCi0JLy8g
SXMgc2V0IGlmIG1vdmllIGZvcm1hdCB0eXBlICggaW5jcmVtZW50YWwvYW5pbWF0aW9uKSB3YXMg
Y2hlY2tlZAotCWJvb2wgdHlwZUNoZWNrZWQgOiAxOwotICAgICAgICBib29sIGlzRnVsbHlUcmFu
c3BhcmVudCA6IDE7Ci0gICAgICAgIGJvb2wgZXJyb3JPY2N1cmVkIDogMTsKLSAgICAgICAgYm9v
bCBtb25vY2hyb21lIDogMTsKLSAgICAgICAgS0hUTUxTZXR0aW5nczo6S0FuaW1hdGlvbkFkdmlj
ZSBtX3Nob3dBbmltYXRpb25zIDogMjsKLQotICAgICAgICBmcmllbmQgY2xhc3MgQ2FjaGU7Ci0K
LSAgICBwdWJsaWM6Ci0gICAgICAgIGludCBkYXRhU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fZGF0
YVNpemU7IH0KLQlDYWNoZWRJbWFnZUNhbGxiYWNrICpkZWNvZGVyQ2FsbGJhY2soKSBjb25zdCB7
IHJldHVybiBtX2RlY29kZXJDYWxsYmFjazsgfQotICAgIHByaXZhdGU6Ci0gICAgICAgIGZyaWVu
ZCBjbGFzcyBDYWNoZWRJbWFnZUNhbGxiYWNrOwotICAgICAgICAKLSAgICAgICAgaW50IG1fZGF0
YVNpemU7Ci0gICAgICAgIENhY2hlZEltYWdlQ2FsbGJhY2sgKm1fZGVjb2RlckNhbGxiYWNrOwot
ICAgIH07Ci0KLSNpZmRlZiBLSFRNTF9YU0xUCi0gICAgY2xhc3MgQ2FjaGVkWFNMU3R5bGVTaGVl
dCA6IHB1YmxpYyBDYWNoZWRPYmplY3QKLSAgICB7Ci1wdWJsaWM6Ci0gICAgICAgIENhY2hlZFhT
TFN0eWxlU2hlZXQoRG9jTG9hZGVyKiBkbCwgY29uc3QgRE9NOjpET01TdHJpbmcgJnVybCwgS0lP
OjpDYWNoZUNvbnRyb2wgY2FjaGVQb2xpY3ksIHRpbWVfdCBfZXhwaXJlRGF0ZSk7Ci0KLSAgICAg
ICAgY29uc3QgRE9NOjpET01TdHJpbmcmIHNoZWV0KCkgY29uc3QgeyByZXR1cm4gbV9zaGVldDsg
fQotICAgICAgICAKLSAgICAgICAgdmlydHVhbCB2b2lkIHJlZihDYWNoZWRPYmplY3RDbGllbnQg
KmNvbnN1bWVyKTsKLSAgICAgICAgdmlydHVhbCB2b2lkIGRlcmVmKENhY2hlZE9iamVjdENsaWVu
dCAqY29uc3VtZXIpOwotICAgICAgICAKLSAgICAgICAgdmlydHVhbCB2b2lkIHNldENoYXJzZXQo
Y29uc3QgUVN0cmluZyAmY2hzKTsKLSAgICAgICAgdmlydHVhbCB2b2lkIGRhdGEoUUJ1ZmZlciAm
YnVmZmVyLCBib29sIGVvZik7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBlcnJvcihpbnQgZXJyLCBj
b25zdCBjaGFyICp0ZXh0KTsKLSAgICAgICAgCi0gICAgICAgIHZpcnR1YWwgYm9vbCBzY2hlZHVs
ZSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLSAgICAgICAgCi0gICAgICAgIHZvaWQgY2hlY2tO
b3RpZnkoKTsKLSAgICAgICAgCi1wcm90ZWN0ZWQ6Ci0gICAgICAgIERPTTo6RE9NU3RyaW5nIG1f
c2hlZXQ7Ci0gICAgICAgIFJlZlB0cjxEZWNvZGVyPiBtX2RlY29kZXI7Ci0gICAgfTsKLSNlbmRp
ZgotICAgIAotI2lmbmRlZiBLSFRNTF9OT19YQkwKLSAgICBjbGFzcyBDYWNoZWRYQkxEb2N1bWVu
dCA6IHB1YmxpYyBDYWNoZWRPYmplY3QKLSAgICB7Ci0gICAgcHVibGljOgotICAgICAgICBDYWNo
ZWRYQkxEb2N1bWVudChEb2NMb2FkZXIqIGRsLCBjb25zdCBET006OkRPTVN0cmluZyAmdXJsLCBL
SU86OkNhY2hlQ29udHJvbCBjYWNoZVBvbGljeSwgdGltZV90IF9leHBpcmVEYXRlKTsKLSAgICAg
ICAgdmlydHVhbCB+Q2FjaGVkWEJMRG9jdW1lbnQoKTsKLSAgICAgICAgCi0gICAgICAgIFhCTDo6
WEJMRG9jdW1lbnRJbXBsKiBkb2N1bWVudCgpIGNvbnN0IHsgcmV0dXJuIG1fZG9jdW1lbnQ7IH0K
LSAgICAgICAgCi0gICAgICAgIHZpcnR1YWwgdm9pZCByZWYoQ2FjaGVkT2JqZWN0Q2xpZW50ICpj
b25zdW1lcik7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBkZXJlZihDYWNoZWRPYmplY3RDbGllbnQg
KmNvbnN1bWVyKTsKLSAgICAgICAgCi0gICAgICAgIHZpcnR1YWwgdm9pZCBzZXRDaGFyc2V0KCBj
b25zdCBRU3RyaW5nICZjaHMgKTsKLSAgICAgICAgdmlydHVhbCB2b2lkIGRhdGEoIFFCdWZmZXIg
JmJ1ZmZlciwgYm9vbCBlb2YgKTsKLSAgICAgICAgdmlydHVhbCB2b2lkIGVycm9yKCBpbnQgZXJy
LCBjb25zdCBjaGFyICp0ZXh0ICk7Ci0gICAgICAgIAotICAgICAgICB2aXJ0dWFsIGJvb2wgc2No
ZWR1bGUoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0gICAgICAgIAotICAgICAgICB2b2lkIGNo
ZWNrTm90aWZ5KCk7Ci0gICAgICAgIAotcHJvdGVjdGVkOgotICAgICAgICBYQkw6OlhCTERvY3Vt
ZW50SW1wbCogbV9kb2N1bWVudDsKLSAgICAgICAgUmVmUHRyPERlY29kZXI+IG1fZGVjb2RlcjsK
LSAgICB9OwotI2VuZGlmCi0KLSAgICAvKioKLSAgICAgKiBAaW50ZXJuYWwKLSAgICAgKgotICAg
ICAqIE1hbmFnZXMgdGhlIGxvYWRpbmcgb2Ygc2NyaXB0cy9pbWFnZXMvc3R5bGVzaGVldHMgZm9y
IGEgcGFydGljdWxhciBkb2N1bWVudAotICAgICAqLwotICAgIGNsYXNzIERvY0xvYWRlcgotICAg
IHsKLSAgICBwdWJsaWM6Ci0gCURvY0xvYWRlcihLSFRNTFBhcnQqLCBET006OkRvY3VtZW50SW1w
bCopOwotIAl+RG9jTG9hZGVyKCk7Ci0KLQlDYWNoZWRJbWFnZSAqcmVxdWVzdEltYWdlKCBjb25z
dCBET006OkRPTVN0cmluZyAmdXJsKTsKLQlDYWNoZWRDU1NTdHlsZVNoZWV0ICpyZXF1ZXN0U3R5
bGVTaGVldCggY29uc3QgRE9NOjpET01TdHJpbmcgJnVybCwgY29uc3QgUVN0cmluZyYgY2hhcnNl
dCk7Ci0gICAgICAgIENhY2hlZFNjcmlwdCAqcmVxdWVzdFNjcmlwdCggY29uc3QgRE9NOjpET01T
dHJpbmcgJnVybCwgY29uc3QgUVN0cmluZyYgY2hhcnNldCk7Ci0KLSNpZmRlZiBLSFRNTF9YU0xU
Ci0gICAgICAgIENhY2hlZFhTTFN0eWxlU2hlZXQqIHJlcXVlc3RYU0xTdHlsZVNoZWV0KGNvbnN0
IERPTTo6RE9NU3RyaW5nJiB1cmwpOwotI2VuZGlmCi0jaWZuZGVmIEtIVE1MX05PX1hCTAotICAg
ICAgICBDYWNoZWRYQkxEb2N1bWVudCogcmVxdWVzdFhCTERvY3VtZW50KGNvbnN0IERPTTo6RE9N
U3RyaW5nICZ1cmwpOwotI2VuZGlmCi0KLQlib29sIGF1dG9sb2FkSW1hZ2VzKCkgY29uc3QgeyBy
ZXR1cm4gbV9iYXV0b2xvYWRJbWFnZXM7IH0KLSAgICAgICAgS0lPOjpDYWNoZUNvbnRyb2wgY2Fj
aGVQb2xpY3koKSBjb25zdCB7IHJldHVybiBtX2NhY2hlUG9saWN5OyB9Ci0gICAgICAgIEtIVE1M
U2V0dGluZ3M6OktBbmltYXRpb25BZHZpY2Ugc2hvd0FuaW1hdGlvbnMoKSBjb25zdCB7IHJldHVy
biBtX3Nob3dBbmltYXRpb25zOyB9Ci0gICAgICAgIHRpbWVfdCBleHBpcmVEYXRlKCkgY29uc3Qg
eyByZXR1cm4gbV9leHBpcmVEYXRlOyB9Ci0gICAgICAgIEtIVE1MUGFydCogcGFydCgpIGNvbnN0
IHsgcmV0dXJuIG1fcGFydDsgfQotICAgICAgICBET006OkRvY3VtZW50SW1wbCogZG9jKCkgY29u
c3QgeyByZXR1cm4gbV9kb2M7IH0KLQotICAgICAgICB2b2lkIHNldEV4cGlyZURhdGUoIHRpbWVf
dCApOwotICAgICAgICB2b2lkIHNldEF1dG9sb2FkSW1hZ2VzKCBib29sICk7Ci0gICAgICAgIHZv
aWQgc2V0Q2FjaGVQb2xpY3koIEtJTzo6Q2FjaGVDb250cm9sIGNhY2hlUG9saWN5ICk7Ci0gICAg
ICAgIHZvaWQgc2V0U2hvd0FuaW1hdGlvbnMoIEtIVE1MU2V0dGluZ3M6OktBbmltYXRpb25BZHZp
Y2UgKTsKLSAgICAgICAgdm9pZCByZW1vdmVDYWNoZWRPYmplY3QoIENhY2hlZE9iamVjdCopIGNv
bnN0OwotCQkKLSAgICAgICAgdm9pZCBzZXRMb2FkSW5Qcm9ncmVzcyhib29sKTsKLSAgICAgICAg
Ym9vbCBsb2FkSW5Qcm9ncmVzcygpIGNvbnN0IHsgcmV0dXJuIG1fbG9hZEluUHJvZ3Jlc3M7IH0K
LQotICAgIHByaXZhdGU6Ci0gICAgICAgIGJvb2wgbmVlZFJlbG9hZChjb25zdCBLVVJMICZmdWxs
VXJsKTsKLQotICAgICAgICBmcmllbmQgY2xhc3MgQ2FjaGU7Ci0gICAgICAgIGZyaWVuZCBjbGFz
cyBET006OkRvY3VtZW50SW1wbDsKLQotICAgICAgICBRU3RyaW5nTGlzdCBtX3JlbG9hZGVkVVJM
czsKLSAgICAgICAgbXV0YWJsZSBRUHRyTGlzdDxDYWNoZWRPYmplY3Q+IG1fZG9jT2JqZWN0czsK
LQl0aW1lX3QgbV9leHBpcmVEYXRlOwotCUtJTzo6Q2FjaGVDb250cm9sIG1fY2FjaGVQb2xpY3k7
Ci0gICAgICAgIGJvb2wgbV9iYXV0b2xvYWRJbWFnZXMgOiAxOwotICAgICAgICBLSFRNTFNldHRp
bmdzOjpLQW5pbWF0aW9uQWR2aWNlIG1fc2hvd0FuaW1hdGlvbnMgOiAyOwotICAgICAgICBLSFRN
TFBhcnQqIG1fcGFydDsKLSAgICAgICAgRE9NOjpEb2N1bWVudEltcGwgKm1fZG9jOwotICAgICAg
ICBib29sIG1fbG9hZEluUHJvZ3Jlc3M7Ci0gICAgfTsKLQotICAgIC8qKgotICAgICAqIEBpbnRl
cm5hbAotICAgICAqLwotICAgIGNsYXNzIFJlcXVlc3QKLSAgICB7Ci0gICAgcHVibGljOgotCVJl
cXVlc3QoRG9jTG9hZGVyKiBkbCwgQ2FjaGVkT2JqZWN0ICpfb2JqZWN0LCBib29sIF9pbmNyZW1l
bnRhbCk7Ci0JflJlcXVlc3QoKTsKLQlib29sIGluY3JlbWVudGFsOwotCVFCdWZmZXIgbV9idWZm
ZXI7Ci0JQ2FjaGVkT2JqZWN0ICpvYmplY3Q7Ci0gICAgICAgIERvY0xvYWRlciogbV9kb2NMb2Fk
ZXI7Ci0gICAgICAgIGJvb2wgbXVsdGlwYXJ0OwotICAgICB9OwotCi0gICAgLyoqCi0gICAgICog
QGludGVybmFsCi0gICAgICovCi0gICAgY2xhc3MgTG9hZGVyIDogcHVibGljIFFPYmplY3QKLSAg
ICB7Ci0JUV9PQkpFQ1QKLQotICAgIHB1YmxpYzoJCi0JTG9hZGVyKCk7Ci0JfkxvYWRlcigpOwot
Ci0Jdm9pZCBsb2FkKERvY0xvYWRlciogZGwsIENhY2hlZE9iamVjdCAqb2JqZWN0LCBib29sIGlu
Y3JlbWVudGFsID0gdHJ1ZSk7Ci0KLSAgICAgICAgaW50IG51bVJlcXVlc3RzKCBEb2NMb2FkZXIq
IGRsICkgY29uc3Q7Ci0gICAgICAgIHZvaWQgY2FuY2VsUmVxdWVzdHMoIERvY0xvYWRlciogZGwg
KTsKLQotCXZvaWQgcmVtb3ZlQmFja2dyb3VuZERlY29kaW5nUmVxdWVzdCAoUmVxdWVzdCAqcik7
Ci0JCi0gICAgICAgIC8vIG1heSByZXR1cm4gMEwKLSAgICAgICAgS0lPOjpKb2IgKmpvYkZvclJl
cXVlc3QoIGNvbnN0IERPTTo6RE9NU3RyaW5nICZ1cmwgKSBjb25zdDsKLQotICAgICAgICBLV1FM
b2FkZXIgKmt3cTsKLQotICAgIHNpZ25hbHM6Ci0JZnJpZW5kIGNsYXNzIENhY2hlZEltYWdlQ2Fs
bGJhY2s7Ci0KLSAgICAgICAgdm9pZCByZXF1ZXN0U3RhcnRlZCgga2h0bWw6OkRvY0xvYWRlciog
ZGwsIGtodG1sOjpDYWNoZWRPYmplY3QqIG9iaiApOwotCXZvaWQgcmVxdWVzdERvbmUoIGtodG1s
OjpEb2NMb2FkZXIqIGRsLCBraHRtbDo6Q2FjaGVkT2JqZWN0ICpvYmogKTsKLQl2b2lkIHJlcXVl
c3RGYWlsZWQoIGtodG1sOjpEb2NMb2FkZXIqIGRsLCBraHRtbDo6Q2FjaGVkT2JqZWN0ICpvYmog
KTsKLQotICAgIHByb3RlY3RlZCBzbG90czoKLSAgICAgICAgdm9pZCBzbG90RmluaXNoZWQoIEtJ
Tzo6Sm9iICogLCBOU0RhdGEgKmFsbERhdGEpOwotCXZvaWQgc2xvdERhdGEoIEtJTzo6Sm9iICos
IGNvbnN0IGNoYXIgKmRhdGEsIGludCBzaXplICk7Ci0gICAgICAgIHZvaWQgc2xvdFJlY2VpdmVk
UmVzcG9uc2UgKCBLSU86OkpvYiAqLCBOU1VSTFJlc3BvbnNlICpyZXNwb25zZSApOwotCi0gICAg
cHJpdmF0ZToKLQl2b2lkIHNlcnZlUGVuZGluZ1JlcXVlc3RzKCk7Ci0KLSAgICAgICAgdmlydHVh
bCBib29sIGlzS0hUTUxMb2FkZXIoKSBjb25zdDsKLQotCVFQdHJMaXN0PFJlcXVlc3Q+IG1fcmVx
dWVzdHNQZW5kaW5nOwotCVFQdHJEaWN0PFJlcXVlc3Q+IG1fcmVxdWVzdHNMb2FkaW5nOwotCi0J
UVB0ckxpc3Q8UmVxdWVzdD4gbV9yZXF1ZXN0c0JhY2tncm91bmREZWNvZGluZzsKLQotI2lmZGVm
IEhBVkVfTElCSlBFRwotICAgICAgICBLSlBFR0Zvcm1hdFR5cGUgbV9qcGVnbG9hZGVyOwotI2Vu
ZGlmCi0gICAgfTsKLQotICAgICAgICAvKioKLSAgICAgKiBAaW50ZXJuYWwKLSAgICAgKgotICAg
ICAqIFByb3ZpZGVzIGEgY2FjaGUvbG9hZGVyIGZvciBvYmplY3RzIG5lZWRlZCBmb3IgZGlzcGxh
eWluZyB0aGUgaHRtbCBwYWdlLgotICAgICAqIEF0IHRoZSBtb21lbnQgdGhlc2UgYXJlIHN0eWxl
c2hlZXRzLCBzY3JpcHRzIGFuZCBpbWFnZXMKLSAgICAgKi8KLSAgICBjbGFzcyBDYWNoZQotICAg
IHsKLQlmcmllbmQgY2xhc3MgRG9jTG9hZGVyOwotICAgIHB1YmxpYzoKLQkvKioKLQkgKiBpbml0
IHRoZSBjYWNoZSBpbiBjYXNlIGl0J3Mgbm90IGFscmVhZHkuIFRoaXMgbmVlZHMgdG8gZ2V0IGNh
bGxlZCBvbmNlCi0JICogYmVmb3JlIHVzaW5nIGl0LgotCSAqLwotCXN0YXRpYyB2b2lkIGluaXQo
KTsKLSAgICAgICAgCi0JLyoqCi0JICogQXNrIHRoZSBjYWNoZSBmb3Igc29tZSB1cmwuIFdpbGwg
cmV0dXJuIGEgY2FjaGVkT2JqZWN0LCBhbmQKLQkgKiBsb2FkIHRoZSByZXF1ZXN0ZWQgZGF0YSBp
biBjYXNlIGl0J3Mgbm90IGNhaGNlZAotICAgICAgICAgKiBpZiB0aGUgRG9jTG9hZGVyIGlzIHpl
cm8sIHRoZSB1cmwgbXVzdCBiZSBmdWxsLXF1YWxpZmllZC4KLSAgICAgICAgICogT3RoZXJ3aXNl
LCBpdCBpcyBhdXRvbWF0aWNhbGx5IGJhc2UtdXJsIGV4cGFuZGVkCi0JICovCi0Jc3RhdGljIENh
Y2hlZEltYWdlICpyZXF1ZXN0SW1hZ2UoIERvY0xvYWRlciogbCwgY29uc3QgRE9NOjpET01TdHJp
bmcgJnVybCwgYm9vbCByZWxvYWQ9ZmFsc2UsIHRpbWVfdCBfZXhwaXJlRGF0ZT0wKTsKLSAgICAg
ICAgc3RhdGljIENhY2hlZEltYWdlICpyZXF1ZXN0SW1hZ2UoIERvY0xvYWRlciogbCwgY29uc3Qg
S1VSTCAmdXJsLCBib29sIHJlbG9hZD1mYWxzZSwgdGltZV90IF9leHBpcmVEYXRlPTApOwotCi0J
LyoqCi0JICogQXNrIHRoZSBjYWNoZSBmb3Igc29tZSB1cmwuIFdpbGwgcmV0dXJuIGEgY2FjaGVk
T2JqZWN0LCBhbmQKLQkgKiBsb2FkIHRoZSByZXF1ZXN0ZWQgZGF0YSBpbiBjYXNlIGl0J3Mgbm90
IGNhY2hlZAotCSAqLwotCXN0YXRpYyBDYWNoZWRDU1NTdHlsZVNoZWV0ICpyZXF1ZXN0U3R5bGVT
aGVldCggRG9jTG9hZGVyKiBsLCBjb25zdCBET006OkRPTVN0cmluZyAmdXJsLCBib29sIHJlbG9h
ZD1mYWxzZSwgdGltZV90IF9leHBpcmVEYXRlPTAsIGNvbnN0IFFTdHJpbmcmIGNoYXJzZXQgPSBR
U3RyaW5nOjpudWxsKTsKLQotI2lmZGVmIEtIVE1MX1hTTFQKLSAgICAgICAgLy8gQXNrIHRoZSBj
YWNoZSBmb3IgYW4gWFNMIHN0eWxlc2hlZXQuCi0gICAgICAgIHN0YXRpYyBDYWNoZWRYU0xTdHls
ZVNoZWV0KiByZXF1ZXN0WFNMU3R5bGVTaGVldChEb2NMb2FkZXIqIGwsIGNvbnN0IERPTTo6RE9N
U3RyaW5nICZ1cmwsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgYm9vbCByZWxvYWQ9ZmFsc2UsIHRpbWVfdCBfZXhwaXJlRGF0ZT0wKTsK
LSNlbmRpZgotI2lmbmRlZiBLSFRNTF9OT19YQkwKLSAgICAgICAgLy8gQXNrIHRoZSBjYWNoZSBm
b3IgYW4gWEJMIGRvY3VtZW50LgotICAgICAgICBzdGF0aWMgQ2FjaGVkWEJMRG9jdW1lbnQqIHJl
cXVlc3RYQkxEb2N1bWVudChEb2NMb2FkZXIqIGwsIGNvbnN0IERPTTo6RE9NU3RyaW5nICZ1cmws
IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBi
b29sIHJlbG9hZD1mYWxzZSwgdGltZV90IF9leHBpcmVEYXRlPTApOwotI2VuZGlmCi0KLSAgICAg
ICAgLyoqCi0gICAgICAgICAqIFByZS1sb2FkcyBhIHN0eWxlc2hlZXQgaW50byB0aGUgY2FjaGUu
Ci0gICAgICAgICAqLwotICAgICAgICBzdGF0aWMgdm9pZCBwcmVsb2FkU3R5bGVTaGVldChjb25z
dCBRU3RyaW5nICZ1cmwsIGNvbnN0IFFTdHJpbmcgJnN0eWxlc2hlZXRfZGF0YSk7Ci0KLQkvKioK
LQkgKiBBc2sgdGhlIGNhY2hlIGZvciBzb21lIHVybC4gV2lsbCByZXR1cm4gYSBjYWNoZWRPYmpl
Y3QsIGFuZAotCSAqIGxvYWQgdGhlIHJlcXVlc3RlZCBkYXRhIGluIGNhc2UgaXQncyBub3QgY2Fo
Y2VkCi0JICovCi0Jc3RhdGljIENhY2hlZFNjcmlwdCAqcmVxdWVzdFNjcmlwdCggRG9jTG9hZGVy
KiBsLCBjb25zdCBET006OkRPTVN0cmluZyAmdXJsLCBib29sIHJlbG9hZD1mYWxzZSwgdGltZV90
IF9leHBpcmVEYXRlPTAsIGNvbnN0IFFTdHJpbmcmIGNoYXJzZXQ9UVN0cmluZzo6bnVsbCk7Ci0K
LSAgICAgICAgLyoqCi0gICAgICAgICAqIFByZS1sb2FkcyBhIHNjcmlwdCBpbnRvIHRoZSBjYWNo
ZS4KLSAgICAgICAgICovCi0gICAgICAgIHN0YXRpYyB2b2lkIHByZWxvYWRTY3JpcHQoY29uc3Qg
UVN0cmluZyAmdXJsLCBjb25zdCBRU3RyaW5nICZzY3JpcHRfZGF0YSk7Ci0KLQkvKioKLQkgKiBz
ZXRzIHRoZSBzaXplIG9mIHRoZSBjYWNoZS4gVGhpcyB3aWxsIG9ubHkgaG9kIGFwcHJveGltYXRl
bHksIHNpbmNlIHRoZSBzaXplIHNvbWUKLQkgKiBjYWNoZWQgb2JqZWN0cyAobGlrZSBzdHlsZXNo
ZWV0cykgdGFrZSB1cCBpbiBtZW1vcnkgaXMgbm90IGV4YWNsdHkga25vd24uCi0JICovCi0Jc3Rh
dGljIHZvaWQgc2V0U2l6ZSggaW50IGJ5dGVzICk7Ci0JLyoqCi0JICogcmV0dXJucyB0aGUgc2l6
ZSBvZiB0aGUgY2FjaGUKLQkgKi8KLQlzdGF0aWMgaW50IHNpemUoKSB7IHJldHVybiBtYXhTaXpl
OyB9OwotCi0gICAgICAgIHN0YXRpYyBpbnQgbWF4Q2FjaGVhYmxlT2JqZWN0U2l6ZSgpIHsgcmV0
dXJuIG1heENhY2hlYWJsZTsgfQotCi0JLyoqCi0JICogY2xlYW4gdXAgY2FjaGUKLQkgKi8KLQlz
dGF0aWMgdm9pZCBmbHVzaChib29sIGZvcmNlPWZhbHNlKTsKLQotCS8qKgotCSAqIGNsZWFycyB0
aGUgY2FjaGUKLQkgKiBXYXJuaW5nOiBjYWxsIHRoaXMgb25seSBhdCB0aGUgZW5kIG9mIHlvdXIg
cHJvZ3JhbSwgdG8gY2xlYW4KLQkgKiB1cCBtZW1vcnkgKHVzZWZ1bCBmb3IgZmluZGluZyBtZW1v
cnkgaG9sZXMpCi0JICovCi0Jc3RhdGljIHZvaWQgY2xlYXIoKTsKLQotCXN0YXRpYyBMb2FkZXIg
KmxvYWRlcigpIHsgcmV0dXJuIG1fbG9hZGVyOyB9Ci0KLSAgICAJc3RhdGljIFFQaXhtYXAgKm51
bGxQaXhtYXA7Ci0gICAgICAgIHN0YXRpYyBRUGl4bWFwICpicm9rZW5QaXhtYXA7Ci0KLSAgICAg
ICAgc3RhdGljIHZvaWQgcmVtb3ZlQ2FjaGVFbnRyeSggQ2FjaGVkT2JqZWN0ICpvYmplY3QgKTsK
LQotICAgICAgICBzdHJ1Y3QgVHlwZVN0YXRpc3RpYyB7Ci0gICAgICAgICAgICBpbnQgY291bnQ7
Ci0gICAgICAgICAgICBpbnQgc2l6ZTsKLSAgICAgICAgICAgIFR5cGVTdGF0aXN0aWMoKSA6IGNv
dW50KDApLCBzaXplKDApIHsgfQotICAgICAgICB9OwotICAgICAgICAKLSAgICAgICAgc3RydWN0
IFN0YXRpc3RpY3MgewotICAgICAgICAgICAgVHlwZVN0YXRpc3RpYyBpbWFnZXM7Ci0gICAgICAg
ICAgICBUeXBlU3RhdGlzdGljIG1vdmllczsKLSAgICAgICAgICAgIFR5cGVTdGF0aXN0aWMgc3R5
bGVTaGVldHM7Ci0gICAgICAgICAgICBUeXBlU3RhdGlzdGljIHNjcmlwdHM7Ci0jaWZkZWYgS0hU
TUxfWFNMVAotICAgICAgICAgICAgVHlwZVN0YXRpc3RpYyB4c2xTdHlsZVNoZWV0czsKLSNlbmRp
ZgotI2lmbmRlZiBLSFRNTF9OT19YQkwKLSAgICAgICAgICAgIFR5cGVTdGF0aXN0aWMgeGJsRG9j
czsKLSNlbmRpZgotICAgICAgICAgICAgVHlwZVN0YXRpc3RpYyBvdGhlcjsKLSAgICAgICAgfTsK
LQotICAgICAgICBzdGF0aWMgU3RhdGlzdGljcyBnZXRTdGF0aXN0aWNzKCk7Ci0gICAgICAgIHN0
YXRpYyB2b2lkIGZsdXNoQWxsKCk7Ci0gICAgICAgIHN0YXRpYyB2b2lkIHNldENhY2hlRGlzYWJs
ZWQoYm9vbCk7Ci0KLSAgICAgICAgc3RhdGljIHZvaWQgaW5zZXJ0SW5MUlVMaXN0KENhY2hlZE9i
amVjdCAqKTsKLSAgICAgICAgc3RhdGljIHZvaWQgcmVtb3ZlRnJvbUxSVUxpc3QoQ2FjaGVkT2Jq
ZWN0ICopOwotICAgICAgICBzdGF0aWMgYm9vbCBhZGp1c3RTaXplKENhY2hlZE9iamVjdCAqLCBp
bnQgc2l6ZURlbHRhKTsKLSAgICAgICAgCi0gICAgICAgIHN0YXRpYyBMUlVMaXN0KiBnZXRMUlVM
aXN0Rm9yKENhY2hlZE9iamVjdCogbyk7Ci0gICAgICAgIAotICAgICAgICBzdGF0aWMgdm9pZCBj
aGVja0xSVUFuZFVuY2FjaGVhYmxlTGlzdEludGVncml0eSgpOwotCi0gICAgcHJvdGVjdGVkOgot
ICAgICAgICBzdGF0aWMgUURpY3Q8Q2FjaGVkT2JqZWN0PiAqY2FjaGU7Ci0gICAgICAgIHN0YXRp
YyBRUHRyTGlzdDxEb2NMb2FkZXI+KiBkb2Nsb2FkZXI7Ci0gICAgCi0gICAgICAgIHN0YXRpYyBp
bnQgbWF4U2l6ZTsKLSAgICAgICAgc3RhdGljIGludCBtYXhDYWNoZWFibGU7Ci0gICAgICAgIHN0
YXRpYyBpbnQgZmx1c2hDb3VudDsKLSAgICAKLSAgICAgICAgc3RhdGljIExvYWRlciAqbV9sb2Fk
ZXI7Ci0gICAgCi0gICAgICAgIHN0YXRpYyB2b2lkIG1vdmVUb0hlYWRPZkxSVUxpc3QoQ2FjaGVk
T2JqZWN0ICopOwotICAgIAotICAgICAgICBzdGF0aWMgTFJVTGlzdCAqbV9MUlVMaXN0czsKLSAg
ICAgICAgc3RhdGljIGludCBtX3RvdGFsU2l6ZU9mTFJVTGlzdHM7Ci0gICAgICAgICAgICAKLSAg
ICAgICAgc3RhdGljIENhY2hlZE9iamVjdCAqbV9oZWFkT2ZVbmNhY2hlYWJsZUxpc3Q7Ci0gICAg
ICAgICAgICAKLSAgICAgICAgc3RhdGljIGludCBtX2NvdW50T2ZMUlVBbmRVbmNhY2hlYWJsZUxp
c3RzOwotICAgIH07Ci0KIH07CiAKICNlbmRpZgpJbmRleDogbWlzYy9DYWNoZS5oCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIG1pc2MvQ2FjaGUuaAkocmV2aXNpb24gMTE5NDgpCisrKyBtaXNjL0NhY2hlLmgJKHdv
cmtpbmcgY29weSkKQEAgLTIzLDcwICsyMywzMiBAQAogICAgIFRoaXMgY2xhc3MgcHJvdmlkZXMg
YWxsIGZ1bmN0aW9uYWxpdHkgbmVlZGVkIGZvciBsb2FkaW5nIGltYWdlcywgc3R5bGUgc2hlZXRz
IGFuZCBodG1sCiAgICAgcGFnZXMgZnJvbSB0aGUgd2ViLiBJdCBoYXMgYSBtZW1vcnkgY2FjaGUg
Zm9yIHRoZXNlIG9iamVjdHMuCiAqLwotI2lmbmRlZiBfa2h0bWxfbG9hZGVyX2gKLSNkZWZpbmUg
X2todG1sX2xvYWRlcl9oCisjaWZuZGVmIEtIVE1MX0NhY2hlX2gKKyNkZWZpbmUgS0hUTUxfQ2Fj
aGVfaAogCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlm
Ci0KLSNpbmNsdWRlIDx0aW1lLmg+Ci0KLSNpbmNsdWRlICJsb2FkZXJfY2xpZW50LmgiCi0jaWZk
ZWYgSEFWRV9MSUJKUEVHCi0jaW5jbHVkZSAibG9hZGVyX2pwZWcuaCIKLSNlbmRpZgotCi0jaW5j
bHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8cXB0cmxpc3QuaD4KLSNpbmNsdWRlIDxxb2JqZWN0
Lmg+CiAjaW5jbHVkZSA8cXB0cmRpY3QuaD4KKyNpbmNsdWRlIDxxcHRybGlzdC5oPgogI2luY2x1
ZGUgPHFkaWN0Lmg+Ci0jaW5jbHVkZSA8cXBpeG1hcC5oPgotI2luY2x1ZGUgPHFidWZmZXIuaD4K
LSNpbmNsdWRlIDxxc3RyaW5nbGlzdC5oPgotI2luY2x1ZGUgPHF0ZXh0Y29kZWMuaD4KKyNpbmNs
dWRlIDxxc3RyaW5nLmg+CiAKLSNpbmNsdWRlIDxrdXJsLmg+CiAjaW5jbHVkZSA8a2lvL2dsb2Jh
bC5oPgogCi0jaW5jbHVkZSA8a2h0bWxfc2V0dGluZ3MuaD4KICNpbmNsdWRlIDxkb20vZG9tX3N0
cmluZy5oPgotI2luY2x1ZGUgIkRvY1B0ci5oIgotCi1jbGFzcyBLSFRNTFBhcnQ7Ci0KLW5hbWVz
cGFjZSBLSU8gewotICBjbGFzcyBKb2I7Ci0gIGNsYXNzIFRyYW5zZmVySm9iOwotfQotCi1uYW1l
c3BhY2UgRE9NCi17Ci0gICAgY2xhc3MgQ1NTU3R5bGVTaGVldEltcGw7Ci0gICAgY2xhc3MgRG9j
dW1lbnRJbXBsOwotfTsKLQotCi1jbGFzcyBLV1FMb2FkZXI7Ci0KLSNpZiBfX09CSkNfXwotQGNs
YXNzIE5TRGF0YTsKLUBjbGFzcyBOU1VSTFJlc3BvbnNlOwotI2Vsc2UKLWNsYXNzIE5TRGF0YTsK
LWNsYXNzIE5TVVJMUmVzcG9uc2U7Ci0jZW5kaWYKIAorY2xhc3MgUVBpeG1hcDsKK2NsYXNzIEtV
Ukw7CiAKIG5hbWVzcGFjZSBraHRtbAogewogICAgIGNsYXNzIENhY2hlZE9iamVjdDsKLSAgICBj
bGFzcyBSZXF1ZXN0OworICAgIGNsYXNzIENhY2hlZEltYWdlOworICAgIGNsYXNzIENhY2hlZFNj
cmlwdDsKKyAgICBjbGFzcyBDYWNoZWRDU1NTdHlsZVNoZWV0OworICAgIGNsYXNzIENhY2hlZFhT
TFN0eWxlU2hlZXQ7CisgICAgY2xhc3MgTG9hZGVyOwogICAgIGNsYXNzIERvY0xvYWRlcjsKLSAg
ICBjbGFzcyBEZWNvZGVyOwogCi0gI2RlZmluZSBNQVhfTFJVX0xJU1RTIDIwCisjZGVmaW5lIE1B
WF9MUlVfTElTVFMgMjAKICAgICAKICAgICBzdHJ1Y3QgTFJVTGlzdCB7CiAgICAgICAgIENhY2hl
ZE9iamVjdCogbV9oZWFkOwpAQCAtOTcsNDc5ICs1OSw2IEBAIG5hbWVzcGFjZSBraHRtbAogICAg
IH07CiAgICAgCiAgICAgLyoqCi0gICAgICogQGludGVybmFsCi0gICAgICoKLSAgICAgKiBBIGNh
Y2hlZCBvYmplY3QuIENsYXNzZXMgd2hvIHdhbnQgdG8gdXNlIHRoaXMgb2JqZWN0IHNob3VsZCBk
ZXJpdmUKLSAgICAgKiBmcm9tIENhY2hlZE9iamVjdENsaWVudCwgdG8gZ2V0IHRoZSBmdW5jdGlv
biBjYWxscyBpbiBjYXNlIHRoZSByZXF1ZXN0ZWQgZGF0YSBoYXMgYXJyaXZlZC4KLSAgICAgKgot
ICAgICAqIFRoaXMgY2xhc3MgYWxzbyBkb2VzIHRoZSBhY3R1YWwgY29tbXVuaWNhdGlvbiB3aXRo
IGtpbyBhbmQgbG9hZHMgdGhlIGZpbGUuCi0gICAgICovCi0gICAgY2xhc3MgQ2FjaGVkT2JqZWN0
Ci0gICAgewotICAgIHB1YmxpYzoKLQllbnVtIFR5cGUgewotCSAgICBJbWFnZSwKLQkgICAgQ1NT
U3R5bGVTaGVldCwKLQkgICAgU2NyaXB0Ci0jaWZkZWYgS0hUTUxfWFNMVAotICAgICAgICAgICAg
LCBYU0xTdHlsZVNoZWV0Ci0jZW5kaWYKLSNpZm5kZWYgS0hUTUxfTk9fWEJMCi0gICAgICAgICAg
ICAsIFhCTAotI2VuZGlmCi0JfTsKLQotCWVudW0gU3RhdHVzIHsKLQkgICAgTm90Q2FjaGVkLCAg
ICAvLyB0aGlzIFVSTCBpcyBub3QgY2FjaGVkCi0JICAgIFVua25vd24sICAgICAgLy8gbGV0IGlt
YWdlY2FjaGUgZGVjaWRlIHdoYXQgdG8gZG8gd2l0aCBpdAotCSAgICBOZXcsICAgICAgICAgIC8v
IGluc2VydGluZyBuZXcgaW1hZ2UKLSAgICAgICAgUGVuZGluZywgICAgICAvLyBvbmx5IHBhcnRp
YWxseSBsb2FkZWQKLQkgICAgUGVyc2lzdGVudCwgICAvLyBuZXZlciBkZWxldGUgdGhpcyBwaXht
YXAKLQkgICAgQ2FjaGVkLCAgICAgICAvLyByZWd1bGFyIGNhc2UKLQkgICAgVW5jYWNoZWFibGUg
ICAvLyB0b28gYmlnIHRvIGJlIGNhY2hlZCwKLQl9OyAgCSAgICAgICAgICAvLyB3aWxsIGJlIGRl
c3Ryb3llZCBhcyBzb29uIGFzIHBvc3NpYmxlCi0KLQlDYWNoZWRPYmplY3QoY29uc3QgRE9NOjpE
T01TdHJpbmcgJnVybCwgVHlwZSB0eXBlLCBLSU86OkNhY2hlQ29udHJvbCBfY2FjaGVQb2xpY3ks
IHRpbWVfdCBfZXhwaXJlRGF0ZSwgaW50IHNpemUgPSAwKQotCXsKLQkgICAgbV91cmwgPSB1cmw7
Ci0JICAgIG1fdHlwZSA9IHR5cGU7Ci0JICAgIG1fc3RhdHVzID0gUGVuZGluZzsKLQkgICAgbV9z
aXplID0gc2l6ZTsKLQkgICAgbV9mcmVlID0gZmFsc2U7Ci0JICAgIG1fY2FjaGVQb2xpY3kgPSBf
Y2FjaGVQb2xpY3k7Ci0JICAgIG1fcmVxdWVzdCA9IDA7Ci0gICAgICAgIG1fcmVzcG9uc2UgPSAw
OwotICAgICAgICBtX2FsbERhdGEgPSAwOwotCSAgICBtX2V4cGlyZURhdGUgPSBfZXhwaXJlRGF0
ZTsKLSAgICAgICAgbV9kZWxldGVkID0gZmFsc2U7Ci0gICAgICAgIG1fZXhwaXJlRGF0ZUNoYW5n
ZWQgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIG1fYWNjZXNzQ291bnQgPSAwOwotICAgICAg
ICAKLSAgICAgICAgbV9uZXh0SW5MUlVMaXN0ID0gMDsKLSAgICAgICAgbV9wcmV2SW5MUlVMaXN0
ID0gMDsKLQl9Ci0JdmlydHVhbCB+Q2FjaGVkT2JqZWN0KCk7Ci0KLQl2aXJ0dWFsIHZvaWQgc2V0
Q2hhcnNldCggY29uc3QgUVN0cmluZyAmY2hzICkge30KLQl2aXJ0dWFsIHZvaWQgZGF0YSggUUJ1
ZmZlciAmYnVmZmVyLCBib29sIGVvZikgPSAwOwotCXZpcnR1YWwgdm9pZCBlcnJvciggaW50IGVy
ciwgY29uc3QgY2hhciAqdGV4dCApID0gMDsKLQotCWNvbnN0IERPTTo6RE9NU3RyaW5nICZ1cmwo
KSBjb25zdCB7IHJldHVybiBtX3VybDsgfQotCVR5cGUgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1f
dHlwZTsgfQotCi0JdmlydHVhbCB2b2lkIHJlZihDYWNoZWRPYmplY3RDbGllbnQgKmNvbnN1bWVy
KTsKLQl2aXJ0dWFsIHZvaWQgZGVyZWYoQ2FjaGVkT2JqZWN0Q2xpZW50ICpjb25zdW1lcik7Ci0K
LQlpbnQgY291bnQoKSBjb25zdCB7IHJldHVybiBtX2NsaWVudHMuY291bnQoKTsgfQotCi0JU3Rh
dHVzIHN0YXR1cygpIGNvbnN0IHsgcmV0dXJuIG1fc3RhdHVzOyB9Ci0KLQlpbnQgc2l6ZSgpIGNv
bnN0IHsgcmV0dXJuIG1fc2l6ZTsgfQotCi0gICAgICAgIGJvb2wgaXNMb2FkZWQoKSBjb25zdCB7
IHJldHVybiAhbV9sb2FkaW5nOyB9Ci0gICAgICAgIAotICAgICAgICB2aXJ0dWFsIGJvb2wgaXNJ
bWFnZSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0KLSAgICBpbnQgYWNjZXNzQ291bnQoKSBj
b25zdCB7IHJldHVybiBtX2FjY2Vzc0NvdW50OyB9Ci0gICAgdm9pZCBpbmNyZWFzZUFjY2Vzc0Nv
dW50KCkgeyBtX2FjY2Vzc0NvdW50Kys7IH0KLSAgICAKLQkvKioKLQkgKiBjb21wdXRlcyB0aGUg
c3RhdHVzIG9mIGFuIG9iamVjdCBhZnRlciBsb2FkaW5nLgotCSAqIHRoZSByZXN1bHQgZGVwZW5k
cyBvbiB0aGUgb2JqZWN0cyBzaXplIGFuZCB0aGUgc2l6ZSBvZiB0aGUgY2FjaGUKLQkgKiBhbHNv
IHVwZGF0ZXMgdGhlIGV4cGlyZSBkYXRlIG9uIHRoZSBjYWNoZSBlbnRyeSBmaWxlCi0JICovCi0J
dm9pZCBmaW5pc2goKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIGJ5IHRoZSBj
YWNoZSBpZiB0aGUgb2JqZWN0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgY2FjaGUgZGljdAot
ICAgICAgICAgKiB3aGlsZSBzdGlsbCBiZWluZyByZWZlcmVuY2VkLiBUaGlzIG1lYW5zIHRoZSBv
YmplY3Qgc2hvdWxkIGtpbGwgaXRzZWxmCi0gICAgICAgICAqIGlmIGl0cyByZWZlcmVuY2UgY291
bnRlciBkcm9wcyBkb3duIHRvIHplcm8uCi0gICAgICAgICAqLwotICAgICAgICB2b2lkIHNldEZy
ZWUoIGJvb2wgYiApIHsgbV9mcmVlID0gYjsgfQotCi0gICAgICAgIEtJTzo6Q2FjaGVDb250cm9s
IGNhY2hlUG9saWN5KCkgY29uc3QgeyByZXR1cm4gbV9jYWNoZVBvbGljeTsgfQotCi0gICAgICAg
IHZvaWQgc2V0UmVxdWVzdChSZXF1ZXN0ICpfcmVxdWVzdCk7Ci0KLSAgICAgICAgTlNVUkxSZXNw
b25zZSAqcmVzcG9uc2UoKSBjb25zdCB7IHJldHVybiBtX3Jlc3BvbnNlOyB9Ci0gICAgICAgIHZv
aWQgc2V0UmVzcG9uc2UoTlNVUkxSZXNwb25zZSAqcmVzcG9uc2UpOwotICAgICAgICBOU0RhdGEg
KmFsbERhdGEoKSBjb25zdCB7IHJldHVybiBtX2FsbERhdGE7IH0KLSAgICAgICAgdm9pZCBzZXRB
bGxEYXRhIChOU0RhdGEgKmRhdGEpOwotCi0gICAgICAgIGJvb2wgY2FuRGVsZXRlKCkgY29uc3Qg
eyByZXR1cm4gKG1fY2xpZW50cy5jb3VudCgpID09IDAgJiYgIW1fcmVxdWVzdCk7IH0KLQotCXZv
aWQgc2V0RXhwaXJlRGF0ZSh0aW1lX3QgX2V4cGlyZURhdGUsIGJvb2wgY2hhbmdlSHR0cENhY2hl
KTsKLQkKLQlib29sIGlzRXhwaXJlZCgpIGNvbnN0OwotCi0gICAgICAgIHZpcnR1YWwgYm9vbCBz
Y2hlZHVsZSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAg
ICAqIExpc3Qgb2YgYWNjZXB0YWJsZSBtaW1ldHlwZXMgc2VwZXJhdGVkIGJ5ICIsIi4gQSBtaW1l
dHlwZSBtYXkgY29udGFpbiBhIHdpbGRjYXJkLgotICAgICAgICAgKi8KLSAgICAgICAgLy8gZS5n
LiAidGV4dC8qIgotICAgICAgICBRU3RyaW5nIGFjY2VwdCgpIGNvbnN0IHsgcmV0dXJuIG1fYWNj
ZXB0OyB9Ci0gICAgICAgIHZvaWQgc2V0QWNjZXB0KGNvbnN0IFFTdHJpbmcgJl9hY2NlcHQpIHsg
bV9hY2NlcHQgPSBfYWNjZXB0OyB9Ci0KLSAgICBwcm90ZWN0ZWQ6Ci0gICAgICAgIHZvaWQgc2V0
U2l6ZShpbnQgc2l6ZSk7Ci0gICAgICAgIAotICAgICAgICBRUHRyRGljdDxDYWNoZWRPYmplY3RD
bGllbnQ+IG1fY2xpZW50czsKLQotCURPTTo6RE9NU3RyaW5nIG1fdXJsOwotICAgICAgICBRU3Ry
aW5nIG1fYWNjZXB0OwotICAgICAgICBSZXF1ZXN0ICptX3JlcXVlc3Q7Ci0gICAgICAgIE5TVVJM
UmVzcG9uc2UgKm1fcmVzcG9uc2U7Ci0gICAgICAgIE5TRGF0YSAqbV9hbGxEYXRhOwotCVR5cGUg
bV90eXBlOwotCVN0YXR1cyBtX3N0YXR1czsKLSAgICBwcml2YXRlOgotCWludCBtX3NpemU7Ci0g
ICAgaW50IG1fYWNjZXNzQ291bnQ7Ci0gICAgCi0gICAgcHJvdGVjdGVkOgotCXRpbWVfdCBtX2V4
cGlyZURhdGU7Ci0JS0lPOjpDYWNoZUNvbnRyb2wgbV9jYWNoZVBvbGljeTsKLSAgICAgICAgYm9v
bCBtX2ZyZWUgOiAxOwotICAgICAgICBib29sIG1fZGVsZXRlZCA6IDE7Ci0gICAgICAgIGJvb2wg
bV9sb2FkaW5nIDogMTsKLSAgICAgICAgYm9vbCBtX2V4cGlyZURhdGVDaGFuZ2VkIDogMTsKLSAg
ICAKLSAgICBwcml2YXRlOgotICAgICAgICBib29sIGFsbG93SW5MUlVMaXN0KCkgeyByZXR1cm4g
Y2FuRGVsZXRlKCkgJiYgc3RhdHVzKCkgIT0gUGVyc2lzdGVudDsgfQotICAgICAgICAKLSAgICAg
ICAgQ2FjaGVkT2JqZWN0ICptX25leHRJbkxSVUxpc3Q7Ci0gICAgICAgIENhY2hlZE9iamVjdCAq
bV9wcmV2SW5MUlVMaXN0OwotICAgICAgICBmcmllbmQgY2xhc3MgQ2FjaGU7Ci0gICAgfTsKLQot
Ci0gICAgLyoqCi0gICAgICogYSBjYWNoZWQgc3R5bGUgc2hlZXQKLSAgICAgKi8KLSAgICBjbGFz
cyBDYWNoZWRDU1NTdHlsZVNoZWV0IDogcHVibGljIENhY2hlZE9iamVjdAotICAgIHsKLSAgICBw
dWJsaWM6Ci0JQ2FjaGVkQ1NTU3R5bGVTaGVldChEb2NMb2FkZXIqIGRsLCBjb25zdCBET006OkRP
TVN0cmluZyAmdXJsLCBLSU86OkNhY2hlQ29udHJvbCBjYWNoZVBvbGljeSwgdGltZV90IF9leHBp
cmVEYXRlLCBjb25zdCBRU3RyaW5nJiBjaGFyc2V0KTsKLQlDYWNoZWRDU1NTdHlsZVNoZWV0KGNv
bnN0IERPTTo6RE9NU3RyaW5nICZ1cmwsIGNvbnN0IFFTdHJpbmcgJnN0eWxlc2hlZXRfZGF0YSk7
Ci0JdmlydHVhbCB+Q2FjaGVkQ1NTU3R5bGVTaGVldCgpOwotCi0JY29uc3QgRE9NOjpET01TdHJp
bmcgJnNoZWV0KCkgY29uc3QgeyByZXR1cm4gbV9zaGVldDsgfQotCi0JdmlydHVhbCB2b2lkIHJl
ZihDYWNoZWRPYmplY3RDbGllbnQgKmNvbnN1bWVyKTsKLQl2aXJ0dWFsIHZvaWQgZGVyZWYoQ2Fj
aGVkT2JqZWN0Q2xpZW50ICpjb25zdW1lcik7Ci0KLSAgICAgICAgdmlydHVhbCB2b2lkIHNldENo
YXJzZXQoIGNvbnN0IFFTdHJpbmcgJmNocyApOwotICAgICAgICB2aXJ0dWFsIHZvaWQgZGF0YSgg
UUJ1ZmZlciAmYnVmZmVyLCBib29sIGVvZiApOwotCXZpcnR1YWwgdm9pZCBlcnJvciggaW50IGVy
ciwgY29uc3QgY2hhciAqdGV4dCApOwotCi0gICAgICAgIHZpcnR1YWwgYm9vbCBzY2hlZHVsZSgp
IGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLQotCXZvaWQgY2hlY2tOb3RpZnkoKTsKLQotICAgIHBy
b3RlY3RlZDoKLQlET006OkRPTVN0cmluZyBtX3NoZWV0OwotICAgICAgICBRVGV4dENvZGVjKiBt
X2NvZGVjOwotICAgIH07Ci0KLSAgICAvKioKLSAgICAgKiBhIGNhY2hlZCBzY3JpcHQKLSAgICAg
Ki8KLSAgICBjbGFzcyBDYWNoZWRTY3JpcHQgOiBwdWJsaWMgQ2FjaGVkT2JqZWN0Ci0gICAgewot
ICAgIHB1YmxpYzoKLQlDYWNoZWRTY3JpcHQoRG9jTG9hZGVyKiBkbCwgY29uc3QgRE9NOjpET01T
dHJpbmcgJnVybCwgS0lPOjpDYWNoZUNvbnRyb2wgY2FjaGVQb2xpY3ksIHRpbWVfdCBfZXhwaXJl
RGF0ZSwgY29uc3QgUVN0cmluZyYgY2hhcnNldCk7Ci0JQ2FjaGVkU2NyaXB0KGNvbnN0IERPTTo6
RE9NU3RyaW5nICZ1cmwsIGNvbnN0IFFTdHJpbmcgJnNjcmlwdF9kYXRhKTsKLQl2aXJ0dWFsIH5D
YWNoZWRTY3JpcHQoKTsKLQotCWNvbnN0IERPTTo6RE9NU3RyaW5nICZzY3JpcHQoKSBjb25zdCB7
IHJldHVybiBtX3NjcmlwdDsgfQotCi0JdmlydHVhbCB2b2lkIHJlZihDYWNoZWRPYmplY3RDbGll
bnQgKmNvbnN1bWVyKTsKLQl2aXJ0dWFsIHZvaWQgZGVyZWYoQ2FjaGVkT2JqZWN0Q2xpZW50ICpj
b25zdW1lcik7Ci0KLSAgICAgICAgdmlydHVhbCB2b2lkIHNldENoYXJzZXQoIGNvbnN0IFFTdHJp
bmcgJmNocyApOwotCXZpcnR1YWwgdm9pZCBkYXRhKCBRQnVmZmVyICZidWZmZXIsIGJvb2wgZW9m
ICk7Ci0JdmlydHVhbCB2b2lkIGVycm9yKCBpbnQgZXJyLCBjb25zdCBjaGFyICp0ZXh0ICk7Ci0K
LSAgICAgICAgdmlydHVhbCBib29sIHNjaGVkdWxlKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0K
LSAgICAgICAgCi0gICAgICAgIGJvb2wgZXJyb3JPY2N1cnJlZCgpIGNvbnN0IHsgcmV0dXJuIG1f
ZXJyb3JPY2N1cnJlZDsgfQotCi0Jdm9pZCBjaGVja05vdGlmeSgpOwotCi0gICAgcHJvdGVjdGVk
OgotCURPTTo6RE9NU3RyaW5nIG1fc2NyaXB0OwotICAgICAgICBRVGV4dENvZGVjKiBtX2NvZGVj
OwotICAgICAgICBib29sIG1fZXJyb3JPY2N1cnJlZDsKLSAgICB9OwotCi0gICAgY2xhc3MgSW1h
Z2VTb3VyY2U7Ci0KLSAgICBjbGFzcyBDYWNoZWRJbWFnZTsKLSAgICAKLSAgICBjbGFzcyBDYWNo
ZWRJbWFnZUNhbGxiYWNrCi0gICAgewotICAgIHB1YmxpYzoKLSAgICAgICAgQ2FjaGVkSW1hZ2VD
YWxsYmFjayAoQ2FjaGVkSW1hZ2UgKmMpIDogY2FjaGVkSW1hZ2UoYyksIHJlZkNvdW50KDEpLCBo
ZWFkZXJSZWNlaXZlZChmYWxzZSkge307Ci0KLSAgICAgICAgdm9pZCByZWYoKSB7IHJlZkNvdW50
Kys7IH0KLSAgICAgICAgdm9pZCBkZXJlZigpIHsgaWYgKC0tcmVmQ291bnQgPT0gMCkgZGVsZXRl
IHRoaXM7IH0KLSAgICAgICAgCi0gICAgICAgIHZvaWQgbm90aWZ5VXBkYXRlKCk7Ci0gICAgICAg
IHZvaWQgbm90aWZ5RmluaXNoZWQoKTsKLSAgICAgICAgdm9pZCBub3RpZnlEZWNvZGluZ0Vycm9y
KCk7Ci0gICAgICAgIHZvaWQgY2xlYXIoKTsKLSAgICAgICAgdm9pZCBoYW5kbGVFcnJvcigpOwot
ICAgICAgICAKLSAgICBwcml2YXRlOgotICAgICAgICBDYWNoZWRJbWFnZSAqY2FjaGVkSW1hZ2U7
Ci0gICAgICAgIHVpbnQgcmVmQ291bnQ7Ci0JYm9vbCBoZWFkZXJSZWNlaXZlZDsKLSAgICB9Owot
ICAgICAgICAKLSAgICAvKioKLSAgICAgKiBhIGNhY2hlZCBpbWFnZQotICAgICAqLwotICAgIGNs
YXNzIENhY2hlZEltYWdlIDogcHVibGljIFFPYmplY3QsIHB1YmxpYyBDYWNoZWRPYmplY3QKLSAg
ICB7Ci0JUV9PQkpFQ1QKLSAgICBwdWJsaWM6Ci0JQ2FjaGVkSW1hZ2UoRG9jTG9hZGVyKiBkbCwg
Y29uc3QgRE9NOjpET01TdHJpbmcgJnVybCwgS0lPOjpDYWNoZUNvbnRyb2wgY2FjaGVQb2xpY3ks
IHRpbWVfdCBfZXhwaXJlRGF0ZSk7Ci0JdmlydHVhbCB+Q2FjaGVkSW1hZ2UoKTsKLQotCWNvbnN0
IFFQaXhtYXAgJnBpeG1hcCgpIGNvbnN0OwotCWNvbnN0IFFQaXhtYXAgJnRpbGVkX3BpeG1hcChj
b25zdCBRQ29sb3ImIGJnKTsKLQotICAgICAgICBRU2l6ZSBwaXhtYXBfc2l6ZSgpIGNvbnN0OyAg
ICAvLyByZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBjb21wbGV0ZSAoaS5lLiB3aGVuIGZpbmlzaGVk
KSBsb2FkaW5nCi0gICAgICAgIFFSZWN0IHZhbGlkX3JlY3QoKSBjb25zdDsgICAgIC8vIHJldHVy
bnMgdGhlIHJlY3RhbmdsZSBvZiBwaXhtYXAgdGhhdCBoYXMgYmVlbiBsb2FkZWQgYWxyZWFkeQot
Ci0gICAgICAgIHZvaWQgcmVmKENhY2hlZE9iamVjdENsaWVudCAqY29uc3VtZXIpOwotCXZpcnR1
YWwgdm9pZCBkZXJlZihDYWNoZWRPYmplY3RDbGllbnQgKmNvbnN1bWVyKTsKLQotCXZpcnR1YWwg
dm9pZCBkYXRhKCBRQnVmZmVyICZidWZmZXIsIGJvb2wgZW9mICk7Ci0JdmlydHVhbCB2b2lkIGVy
cm9yKCBpbnQgZXJyLCBjb25zdCBjaGFyICp0ZXh0ICk7Ci0KLSAgICAgICAgYm9vbCBpc1RyYW5z
cGFyZW50KCkgY29uc3QgeyByZXR1cm4gaXNGdWxseVRyYW5zcGFyZW50OyB9Ci0gICAgICAgIGJv
b2wgaXNFcnJvckltYWdlKCkgY29uc3QgeyByZXR1cm4gZXJyb3JPY2N1cmVkOyB9Ci0KLSAgICAg
ICAgdm9pZCBzZXRTaG93QW5pbWF0aW9ucyggS0hUTUxTZXR0aW5nczo6S0FuaW1hdGlvbkFkdmlj
ZSApOwotCi0gICAgICAgIHZpcnR1YWwgYm9vbCBzY2hlZHVsZSgpIGNvbnN0IHsgcmV0dXJuIHRy
dWU7IH0KLQotCXZvaWQgY2hlY2tOb3RpZnkoKTsKLSAgICAgICAgCi0gICAgICAgIHZpcnR1YWwg
Ym9vbCBpc0ltYWdlKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotCi0Jdm9pZCBjbGVhcigpOwot
ICAgICAgICAKLSAgICBwcml2YXRlOgotICAgICAgICB2b2lkIGRvX25vdGlmeShjb25zdCBRUGl4
bWFwJiBwLCBjb25zdCBRUmVjdCYgcik7Ci0KLSAgICAgICAgUVBpeG1hcCogcDsKLQlRUGl4bWFw
KiBiZzsKLSAgICAgICAgUVJnYiBiZ0NvbG9yOwotICAgICAgICBtdXRhYmxlIFFQaXhtYXAqIHBp
eFBhcnQ7Ci0KLSAgICAgICAgSW1hZ2VTb3VyY2UqIGltZ1NvdXJjZTsKLSAgICAgICAgY29uc3Qg
Y2hhciogZm9ybWF0VHlwZTsgIC8vIElzIHRoZSBuYW1lIG9mIHRoZSBtb3ZpZSBmb3JtYXQgdHlw
ZQotCi0JaW50IHdpZHRoOwotCWludCBoZWlnaHQ7Ci0KLQkvLyBJcyBzZXQgaWYgbW92aWUgZm9y
bWF0IHR5cGUgKCBpbmNyZW1lbnRhbC9hbmltYXRpb24pIHdhcyBjaGVja2VkCi0JYm9vbCB0eXBl
Q2hlY2tlZCA6IDE7Ci0gICAgICAgIGJvb2wgaXNGdWxseVRyYW5zcGFyZW50IDogMTsKLSAgICAg
ICAgYm9vbCBlcnJvck9jY3VyZWQgOiAxOwotICAgICAgICBib29sIG1vbm9jaHJvbWUgOiAxOwot
ICAgICAgICBLSFRNTFNldHRpbmdzOjpLQW5pbWF0aW9uQWR2aWNlIG1fc2hvd0FuaW1hdGlvbnMg
OiAyOwotCi0gICAgICAgIGZyaWVuZCBjbGFzcyBDYWNoZTsKLQotICAgIHB1YmxpYzoKLSAgICAg
ICAgaW50IGRhdGFTaXplKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhU2l6ZTsgfQotCUNhY2hlZElt
YWdlQ2FsbGJhY2sgKmRlY29kZXJDYWxsYmFjaygpIGNvbnN0IHsgcmV0dXJuIG1fZGVjb2RlckNh
bGxiYWNrOyB9Ci0gICAgcHJpdmF0ZToKLSAgICAgICAgZnJpZW5kIGNsYXNzIENhY2hlZEltYWdl
Q2FsbGJhY2s7Ci0gICAgICAgIAotICAgICAgICBpbnQgbV9kYXRhU2l6ZTsKLSAgICAgICAgQ2Fj
aGVkSW1hZ2VDYWxsYmFjayAqbV9kZWNvZGVyQ2FsbGJhY2s7Ci0gICAgfTsKLQotI2lmZGVmIEtI
VE1MX1hTTFQKLSAgICBjbGFzcyBDYWNoZWRYU0xTdHlsZVNoZWV0IDogcHVibGljIENhY2hlZE9i
amVjdAotICAgIHsKLXB1YmxpYzoKLSAgICAgICAgQ2FjaGVkWFNMU3R5bGVTaGVldChEb2NMb2Fk
ZXIqIGRsLCBjb25zdCBET006OkRPTVN0cmluZyAmdXJsLCBLSU86OkNhY2hlQ29udHJvbCBjYWNo
ZVBvbGljeSwgdGltZV90IF9leHBpcmVEYXRlKTsKLQotICAgICAgICBjb25zdCBET006OkRPTVN0
cmluZyYgc2hlZXQoKSBjb25zdCB7IHJldHVybiBtX3NoZWV0OyB9Ci0gICAgICAgIAotICAgICAg
ICB2aXJ0dWFsIHZvaWQgcmVmKENhY2hlZE9iamVjdENsaWVudCAqY29uc3VtZXIpOwotICAgICAg
ICB2aXJ0dWFsIHZvaWQgZGVyZWYoQ2FjaGVkT2JqZWN0Q2xpZW50ICpjb25zdW1lcik7Ci0gICAg
ICAgIAotICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0Q2hhcnNldChjb25zdCBRU3RyaW5nICZjaHMp
OwotICAgICAgICB2aXJ0dWFsIHZvaWQgZGF0YShRQnVmZmVyICZidWZmZXIsIGJvb2wgZW9mKTsK
LSAgICAgICAgdmlydHVhbCB2b2lkIGVycm9yKGludCBlcnIsIGNvbnN0IGNoYXIgKnRleHQpOwot
ICAgICAgICAKLSAgICAgICAgdmlydHVhbCBib29sIHNjaGVkdWxlKCkgY29uc3QgeyByZXR1cm4g
dHJ1ZTsgfQotICAgICAgICAKLSAgICAgICAgdm9pZCBjaGVja05vdGlmeSgpOwotICAgICAgICAK
LXByb3RlY3RlZDoKLSAgICAgICAgRE9NOjpET01TdHJpbmcgbV9zaGVldDsKLSAgICAgICAgUmVm
UHRyPERlY29kZXI+IG1fZGVjb2RlcjsKLSAgICB9OwotI2VuZGlmCi0gICAgCi0jaWZuZGVmIEtI
VE1MX05PX1hCTAotICAgIGNsYXNzIENhY2hlZFhCTERvY3VtZW50IDogcHVibGljIENhY2hlZE9i
amVjdAotICAgIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIENhY2hlZFhCTERvY3VtZW50KERvY0xv
YWRlciogZGwsIGNvbnN0IERPTTo6RE9NU3RyaW5nICZ1cmwsIEtJTzo6Q2FjaGVDb250cm9sIGNh
Y2hlUG9saWN5LCB0aW1lX3QgX2V4cGlyZURhdGUpOwotICAgICAgICB2aXJ0dWFsIH5DYWNoZWRY
QkxEb2N1bWVudCgpOwotICAgICAgICAKLSAgICAgICAgWEJMOjpYQkxEb2N1bWVudEltcGwqIGRv
Y3VtZW50KCkgY29uc3QgeyByZXR1cm4gbV9kb2N1bWVudDsgfQotICAgICAgICAKLSAgICAgICAg
dmlydHVhbCB2b2lkIHJlZihDYWNoZWRPYmplY3RDbGllbnQgKmNvbnN1bWVyKTsKLSAgICAgICAg
dmlydHVhbCB2b2lkIGRlcmVmKENhY2hlZE9iamVjdENsaWVudCAqY29uc3VtZXIpOwotICAgICAg
ICAKLSAgICAgICAgdmlydHVhbCB2b2lkIHNldENoYXJzZXQoIGNvbnN0IFFTdHJpbmcgJmNocyAp
OwotICAgICAgICB2aXJ0dWFsIHZvaWQgZGF0YSggUUJ1ZmZlciAmYnVmZmVyLCBib29sIGVvZiAp
OwotICAgICAgICB2aXJ0dWFsIHZvaWQgZXJyb3IoIGludCBlcnIsIGNvbnN0IGNoYXIgKnRleHQg
KTsKLSAgICAgICAgCi0gICAgICAgIHZpcnR1YWwgYm9vbCBzY2hlZHVsZSgpIGNvbnN0IHsgcmV0
dXJuIHRydWU7IH0KLSAgICAgICAgCi0gICAgICAgIHZvaWQgY2hlY2tOb3RpZnkoKTsKLSAgICAg
ICAgCi1wcm90ZWN0ZWQ6Ci0gICAgICAgIFhCTDo6WEJMRG9jdW1lbnRJbXBsKiBtX2RvY3VtZW50
OwotICAgICAgICBSZWZQdHI8RGVjb2Rlcj4gbV9kZWNvZGVyOwotICAgIH07Ci0jZW5kaWYKLQot
ICAgIC8qKgotICAgICAqIEBpbnRlcm5hbAotICAgICAqCi0gICAgICogTWFuYWdlcyB0aGUgbG9h
ZGluZyBvZiBzY3JpcHRzL2ltYWdlcy9zdHlsZXNoZWV0cyBmb3IgYSBwYXJ0aWN1bGFyIGRvY3Vt
ZW50Ci0gICAgICovCi0gICAgY2xhc3MgRG9jTG9hZGVyCi0gICAgewotICAgIHB1YmxpYzoKLSAJ
RG9jTG9hZGVyKEtIVE1MUGFydCosIERPTTo6RG9jdW1lbnRJbXBsKik7Ci0gCX5Eb2NMb2FkZXIo
KTsKLQotCUNhY2hlZEltYWdlICpyZXF1ZXN0SW1hZ2UoIGNvbnN0IERPTTo6RE9NU3RyaW5nICZ1
cmwpOwotCUNhY2hlZENTU1N0eWxlU2hlZXQgKnJlcXVlc3RTdHlsZVNoZWV0KCBjb25zdCBET006
OkRPTVN0cmluZyAmdXJsLCBjb25zdCBRU3RyaW5nJiBjaGFyc2V0KTsKLSAgICAgICAgQ2FjaGVk
U2NyaXB0ICpyZXF1ZXN0U2NyaXB0KCBjb25zdCBET006OkRPTVN0cmluZyAmdXJsLCBjb25zdCBR
U3RyaW5nJiBjaGFyc2V0KTsKLQotI2lmZGVmIEtIVE1MX1hTTFQKLSAgICAgICAgQ2FjaGVkWFNM
U3R5bGVTaGVldCogcmVxdWVzdFhTTFN0eWxlU2hlZXQoY29uc3QgRE9NOjpET01TdHJpbmcmIHVy
bCk7Ci0jZW5kaWYKLSNpZm5kZWYgS0hUTUxfTk9fWEJMCi0gICAgICAgIENhY2hlZFhCTERvY3Vt
ZW50KiByZXF1ZXN0WEJMRG9jdW1lbnQoY29uc3QgRE9NOjpET01TdHJpbmcgJnVybCk7Ci0jZW5k
aWYKLQotCWJvb2wgYXV0b2xvYWRJbWFnZXMoKSBjb25zdCB7IHJldHVybiBtX2JhdXRvbG9hZElt
YWdlczsgfQotICAgICAgICBLSU86OkNhY2hlQ29udHJvbCBjYWNoZVBvbGljeSgpIGNvbnN0IHsg
cmV0dXJuIG1fY2FjaGVQb2xpY3k7IH0KLSAgICAgICAgS0hUTUxTZXR0aW5nczo6S0FuaW1hdGlv
bkFkdmljZSBzaG93QW5pbWF0aW9ucygpIGNvbnN0IHsgcmV0dXJuIG1fc2hvd0FuaW1hdGlvbnM7
IH0KLSAgICAgICAgdGltZV90IGV4cGlyZURhdGUoKSBjb25zdCB7IHJldHVybiBtX2V4cGlyZURh
dGU7IH0KLSAgICAgICAgS0hUTUxQYXJ0KiBwYXJ0KCkgY29uc3QgeyByZXR1cm4gbV9wYXJ0OyB9
Ci0gICAgICAgIERPTTo6RG9jdW1lbnRJbXBsKiBkb2MoKSBjb25zdCB7IHJldHVybiBtX2RvYzsg
fQotCi0gICAgICAgIHZvaWQgc2V0RXhwaXJlRGF0ZSggdGltZV90ICk7Ci0gICAgICAgIHZvaWQg
c2V0QXV0b2xvYWRJbWFnZXMoIGJvb2wgKTsKLSAgICAgICAgdm9pZCBzZXRDYWNoZVBvbGljeSgg
S0lPOjpDYWNoZUNvbnRyb2wgY2FjaGVQb2xpY3kgKTsKLSAgICAgICAgdm9pZCBzZXRTaG93QW5p
bWF0aW9ucyggS0hUTUxTZXR0aW5nczo6S0FuaW1hdGlvbkFkdmljZSApOwotICAgICAgICB2b2lk
IHJlbW92ZUNhY2hlZE9iamVjdCggQ2FjaGVkT2JqZWN0KikgY29uc3Q7Ci0JCQotICAgICAgICB2
b2lkIHNldExvYWRJblByb2dyZXNzKGJvb2wpOwotICAgICAgICBib29sIGxvYWRJblByb2dyZXNz
KCkgY29uc3QgeyByZXR1cm4gbV9sb2FkSW5Qcm9ncmVzczsgfQotCi0gICAgcHJpdmF0ZToKLSAg
ICAgICAgYm9vbCBuZWVkUmVsb2FkKGNvbnN0IEtVUkwgJmZ1bGxVcmwpOwotCi0gICAgICAgIGZy
aWVuZCBjbGFzcyBDYWNoZTsKLSAgICAgICAgZnJpZW5kIGNsYXNzIERPTTo6RG9jdW1lbnRJbXBs
OwotCi0gICAgICAgIFFTdHJpbmdMaXN0IG1fcmVsb2FkZWRVUkxzOwotICAgICAgICBtdXRhYmxl
IFFQdHJMaXN0PENhY2hlZE9iamVjdD4gbV9kb2NPYmplY3RzOwotCXRpbWVfdCBtX2V4cGlyZURh
dGU7Ci0JS0lPOjpDYWNoZUNvbnRyb2wgbV9jYWNoZVBvbGljeTsKLSAgICAgICAgYm9vbCBtX2Jh
dXRvbG9hZEltYWdlcyA6IDE7Ci0gICAgICAgIEtIVE1MU2V0dGluZ3M6OktBbmltYXRpb25BZHZp
Y2UgbV9zaG93QW5pbWF0aW9ucyA6IDI7Ci0gICAgICAgIEtIVE1MUGFydCogbV9wYXJ0OwotICAg
ICAgICBET006OkRvY3VtZW50SW1wbCAqbV9kb2M7Ci0gICAgICAgIGJvb2wgbV9sb2FkSW5Qcm9n
cmVzczsKLSAgICB9OwotCi0gICAgLyoqCi0gICAgICogQGludGVybmFsCi0gICAgICovCi0gICAg
Y2xhc3MgUmVxdWVzdAotICAgIHsKLSAgICBwdWJsaWM6Ci0JUmVxdWVzdChEb2NMb2FkZXIqIGRs
LCBDYWNoZWRPYmplY3QgKl9vYmplY3QsIGJvb2wgX2luY3JlbWVudGFsKTsKLQl+UmVxdWVzdCgp
OwotCWJvb2wgaW5jcmVtZW50YWw7Ci0JUUJ1ZmZlciBtX2J1ZmZlcjsKLQlDYWNoZWRPYmplY3Qg
Km9iamVjdDsKLSAgICAgICAgRG9jTG9hZGVyKiBtX2RvY0xvYWRlcjsKLSAgICAgICAgYm9vbCBt
dWx0aXBhcnQ7Ci0gICAgIH07Ci0KLSAgICAvKioKLSAgICAgKiBAaW50ZXJuYWwKLSAgICAgKi8K
LSAgICBjbGFzcyBMb2FkZXIgOiBwdWJsaWMgUU9iamVjdAotICAgIHsKLQlRX09CSkVDVAotCi0g
ICAgcHVibGljOgkKLQlMb2FkZXIoKTsKLQl+TG9hZGVyKCk7Ci0KLQl2b2lkIGxvYWQoRG9jTG9h
ZGVyKiBkbCwgQ2FjaGVkT2JqZWN0ICpvYmplY3QsIGJvb2wgaW5jcmVtZW50YWwgPSB0cnVlKTsK
LQotICAgICAgICBpbnQgbnVtUmVxdWVzdHMoIERvY0xvYWRlciogZGwgKSBjb25zdDsKLSAgICAg
ICAgdm9pZCBjYW5jZWxSZXF1ZXN0cyggRG9jTG9hZGVyKiBkbCApOwotCi0Jdm9pZCByZW1vdmVC
YWNrZ3JvdW5kRGVjb2RpbmdSZXF1ZXN0IChSZXF1ZXN0ICpyKTsKLQkKLSAgICAgICAgLy8gbWF5
IHJldHVybiAwTAotICAgICAgICBLSU86OkpvYiAqam9iRm9yUmVxdWVzdCggY29uc3QgRE9NOjpE
T01TdHJpbmcgJnVybCApIGNvbnN0OwotCi0gICAgICAgIEtXUUxvYWRlciAqa3dxOwotCi0gICAg
c2lnbmFsczoKLQlmcmllbmQgY2xhc3MgQ2FjaGVkSW1hZ2VDYWxsYmFjazsKLQotICAgICAgICB2
b2lkIHJlcXVlc3RTdGFydGVkKCBraHRtbDo6RG9jTG9hZGVyKiBkbCwga2h0bWw6OkNhY2hlZE9i
amVjdCogb2JqICk7Ci0Jdm9pZCByZXF1ZXN0RG9uZSgga2h0bWw6OkRvY0xvYWRlciogZGwsIGto
dG1sOjpDYWNoZWRPYmplY3QgKm9iaiApOwotCXZvaWQgcmVxdWVzdEZhaWxlZCgga2h0bWw6OkRv
Y0xvYWRlciogZGwsIGtodG1sOjpDYWNoZWRPYmplY3QgKm9iaiApOwotCi0gICAgcHJvdGVjdGVk
IHNsb3RzOgotICAgICAgICB2b2lkIHNsb3RGaW5pc2hlZCggS0lPOjpKb2IgKiAsIE5TRGF0YSAq
YWxsRGF0YSk7Ci0Jdm9pZCBzbG90RGF0YSggS0lPOjpKb2IgKiwgY29uc3QgY2hhciAqZGF0YSwg
aW50IHNpemUgKTsKLSAgICAgICAgdm9pZCBzbG90UmVjZWl2ZWRSZXNwb25zZSAoIEtJTzo6Sm9i
ICosIE5TVVJMUmVzcG9uc2UgKnJlc3BvbnNlICk7Ci0KLSAgICBwcml2YXRlOgotCXZvaWQgc2Vy
dmVQZW5kaW5nUmVxdWVzdHMoKTsKLQotICAgICAgICB2aXJ0dWFsIGJvb2wgaXNLSFRNTExvYWRl
cigpIGNvbnN0OwotCi0JUVB0ckxpc3Q8UmVxdWVzdD4gbV9yZXF1ZXN0c1BlbmRpbmc7Ci0JUVB0
ckRpY3Q8UmVxdWVzdD4gbV9yZXF1ZXN0c0xvYWRpbmc7Ci0KLQlRUHRyTGlzdDxSZXF1ZXN0PiBt
X3JlcXVlc3RzQmFja2dyb3VuZERlY29kaW5nOwotCi0jaWZkZWYgSEFWRV9MSUJKUEVHCi0gICAg
ICAgIEtKUEVHRm9ybWF0VHlwZSBtX2pwZWdsb2FkZXI7Ci0jZW5kaWYKLSAgICB9OwotCi0gICAg
ICAgIC8qKgotICAgICAqIEBpbnRlcm5hbAotICAgICAqCiAgICAgICogUHJvdmlkZXMgYSBjYWNo
ZS9sb2FkZXIgZm9yIG9iamVjdHMgbmVlZGVkIGZvciBkaXNwbGF5aW5nIHRoZSBodG1sIHBhZ2Uu
CiAgICAgICogQXQgdGhlIG1vbWVudCB0aGVzZSBhcmUgc3R5bGVzaGVldHMsIHNjcmlwdHMgYW5k
IGltYWdlcwogICAgICAqLwpAQCAtNzA3LDcgKzE5Niw2IEBAIHByb3RlY3RlZDoKICAgICAgICAg
ICAgIAogICAgICAgICBzdGF0aWMgaW50IG1fY291bnRPZkxSVUFuZFVuY2FjaGVhYmxlTGlzdHM7
CiAgICAgfTsKLQogfTsKIAogI2VuZGlmCkluZGV4OiBtaXNjL0NhY2hlZE9iamVjdENsaWVudFdh
bGtlci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIG1pc2MvQ2FjaGVkT2JqZWN0Q2xpZW50V2Fsa2VyLmgJKHJl
dmlzaW9uIDExOTQ4KQorKysgbWlzYy9DYWNoZWRPYmplY3RDbGllbnRXYWxrZXIuaAkod29ya2lu
ZyBjb3B5KQpAQCAtMjMsNjg5ICsyMywyMyBAQAogICAgIFRoaXMgY2xhc3MgcHJvdmlkZXMgYWxs
IGZ1bmN0aW9uYWxpdHkgbmVlZGVkIGZvciBsb2FkaW5nIGltYWdlcywgc3R5bGUgc2hlZXRzIGFu
ZCBodG1sCiAgICAgcGFnZXMgZnJvbSB0aGUgd2ViLiBJdCBoYXMgYSBtZW1vcnkgY2FjaGUgZm9y
IHRoZXNlIG9iamVjdHMuCiAqLwotI2lmbmRlZiBfa2h0bWxfbG9hZGVyX2gKLSNkZWZpbmUgX2to
dG1sX2xvYWRlcl9oCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSA8Y29uZmlnLmg+
Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHRpbWUuaD4KKyNpZm5kZWYgS0hUTUxfQ2FjaGVkT2JqZWN0
Q2xpZW50V2Fsa2VyX2gKKyNkZWZpbmUgS0hUTUxfQ2FjaGVkT2JqZWN0Q2xpZW50V2Fsa2VyX2gK
IAogI2luY2x1ZGUgImxvYWRlcl9jbGllbnQuaCIKLSNpZmRlZiBIQVZFX0xJQkpQRUcKLSNpbmNs
dWRlICJsb2FkZXJfanBlZy5oIgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNs
dWRlIDxxcHRybGlzdC5oPgotI2luY2x1ZGUgPHFvYmplY3QuaD4KICNpbmNsdWRlIDxxcHRyZGlj
dC5oPgotI2luY2x1ZGUgPHFkaWN0Lmg+Ci0jaW5jbHVkZSA8cXBpeG1hcC5oPgotI2luY2x1ZGUg
PHFidWZmZXIuaD4KLSNpbmNsdWRlIDxxc3RyaW5nbGlzdC5oPgotI2luY2x1ZGUgPHF0ZXh0Y29k
ZWMuaD4KLQotI2luY2x1ZGUgPGt1cmwuaD4KLSNpbmNsdWRlIDxraW8vZ2xvYmFsLmg+Ci0KLSNp
bmNsdWRlIDxraHRtbF9zZXR0aW5ncy5oPgotI2luY2x1ZGUgPGRvbS9kb21fc3RyaW5nLmg+Ci0j
aW5jbHVkZSAiRG9jUHRyLmgiCi0KLWNsYXNzIEtIVE1MUGFydDsKLQotbmFtZXNwYWNlIEtJTyB7
Ci0gIGNsYXNzIEpvYjsKLSAgY2xhc3MgVHJhbnNmZXJKb2I7Ci19Ci0KLW5hbWVzcGFjZSBET00K
LXsKLSAgICBjbGFzcyBDU1NTdHlsZVNoZWV0SW1wbDsKLSAgICBjbGFzcyBEb2N1bWVudEltcGw7
Ci19OwotCi0KLWNsYXNzIEtXUUxvYWRlcjsKLQotI2lmIF9fT0JKQ19fCi1AY2xhc3MgTlNEYXRh
OwotQGNsYXNzIE5TVVJMUmVzcG9uc2U7Ci0jZWxzZQotY2xhc3MgTlNEYXRhOwotY2xhc3MgTlNV
UkxSZXNwb25zZTsKLSNlbmRpZgotCiAKIG5hbWVzcGFjZSBraHRtbAogewotICAgIGNsYXNzIENh
Y2hlZE9iamVjdDsKLSAgICBjbGFzcyBSZXF1ZXN0OwotICAgIGNsYXNzIERvY0xvYWRlcjsKLSAg
ICBjbGFzcyBEZWNvZGVyOwotCi0gI2RlZmluZSBNQVhfTFJVX0xJU1RTIDIwCi0gICAgCi0gICAg
c3RydWN0IExSVUxpc3QgewotICAgICAgICBDYWNoZWRPYmplY3QqIG1faGVhZDsKLSAgICAgICAg
Q2FjaGVkT2JqZWN0KiBtX3RhaWw7Ci0gICAgCi0gICAgICAgIExSVUxpc3QoKTsKLSAgICAgICAg
fkxSVUxpc3QoKTsKLSAgICB9OwotICAgIAotICAgIC8qKgotICAgICAqIEBpbnRlcm5hbAotICAg
ICAqCi0gICAgICogQSBjYWNoZWQgb2JqZWN0LiBDbGFzc2VzIHdobyB3YW50IHRvIHVzZSB0aGlz
IG9iamVjdCBzaG91bGQgZGVyaXZlCi0gICAgICogZnJvbSBDYWNoZWRPYmplY3RDbGllbnQsIHRv
IGdldCB0aGUgZnVuY3Rpb24gY2FsbHMgaW4gY2FzZSB0aGUgcmVxdWVzdGVkIGRhdGEgaGFzIGFy
cml2ZWQuCi0gICAgICoKLSAgICAgKiBUaGlzIGNsYXNzIGFsc28gZG9lcyB0aGUgYWN0dWFsIGNv
bW11bmljYXRpb24gd2l0aCBraW8gYW5kIGxvYWRzIHRoZSBmaWxlLgotICAgICAqLwotICAgIGNs
YXNzIENhY2hlZE9iamVjdAotICAgIHsKKyAgICAvLyBDYWxsIHRoaXMgIndhbGtlciIgaW5zdGVh
ZCBvZiBpdGVyYXRvciBzbyBwZW9wbGUgd29uJ3QgZXhwZWN0IFF0IG9yIFNUTC1zdHlsZSBpdGVy
YXRvciBpbnRlcmZhY2UuCisgICAgLy8gSnVzdCBrZWVwIGNhbGxpbmcgbmV4dCgpIG9uIHRoaXMu
IEl0J3Mgc2FmZSBmcm9tIGRlbGV0aW9ucyBvZiB0aGUgY3VycmVudCBpdGVtCisgICAgY2xhc3Mg
Q2FjaGVkT2JqZWN0Q2xpZW50V2Fsa2VyIHsKICAgICBwdWJsaWM6Ci0JZW51bSBUeXBlIHsKLQkg
ICAgSW1hZ2UsCi0JICAgIENTU1N0eWxlU2hlZXQsCi0JICAgIFNjcmlwdAotI2lmZGVmIEtIVE1M
X1hTTFQKLSAgICAgICAgICAgICwgWFNMU3R5bGVTaGVldAotI2VuZGlmCi0jaWZuZGVmIEtIVE1M
X05PX1hCTAotICAgICAgICAgICAgLCBYQkwKLSNlbmRpZgotCX07Ci0KLQllbnVtIFN0YXR1cyB7
Ci0JICAgIE5vdENhY2hlZCwgICAgLy8gdGhpcyBVUkwgaXMgbm90IGNhY2hlZAotCSAgICBVbmtu
b3duLCAgICAgIC8vIGxldCBpbWFnZWNhY2hlIGRlY2lkZSB3aGF0IHRvIGRvIHdpdGggaXQKLQkg
ICAgTmV3LCAgICAgICAgICAvLyBpbnNlcnRpbmcgbmV3IGltYWdlCi0gICAgICAgIFBlbmRpbmcs
ICAgICAgLy8gb25seSBwYXJ0aWFsbHkgbG9hZGVkCi0JICAgIFBlcnNpc3RlbnQsICAgLy8gbmV2
ZXIgZGVsZXRlIHRoaXMgcGl4bWFwCi0JICAgIENhY2hlZCwgICAgICAgLy8gcmVndWxhciBjYXNl
Ci0JICAgIFVuY2FjaGVhYmxlICAgLy8gdG9vIGJpZyB0byBiZSBjYWNoZWQsCi0JfTsgIAkgICAg
ICAgICAgLy8gd2lsbCBiZSBkZXN0cm95ZWQgYXMgc29vbiBhcyBwb3NzaWJsZQotCi0JQ2FjaGVk
T2JqZWN0KGNvbnN0IERPTTo6RE9NU3RyaW5nICZ1cmwsIFR5cGUgdHlwZSwgS0lPOjpDYWNoZUNv
bnRyb2wgX2NhY2hlUG9saWN5LCB0aW1lX3QgX2V4cGlyZURhdGUsIGludCBzaXplID0gMCkKLQl7
Ci0JICAgIG1fdXJsID0gdXJsOwotCSAgICBtX3R5cGUgPSB0eXBlOwotCSAgICBtX3N0YXR1cyA9
IFBlbmRpbmc7Ci0JICAgIG1fc2l6ZSA9IHNpemU7Ci0JICAgIG1fZnJlZSA9IGZhbHNlOwotCSAg
ICBtX2NhY2hlUG9saWN5ID0gX2NhY2hlUG9saWN5OwotCSAgICBtX3JlcXVlc3QgPSAwOwotICAg
ICAgICBtX3Jlc3BvbnNlID0gMDsKLSAgICAgICAgbV9hbGxEYXRhID0gMDsKLQkgICAgbV9leHBp
cmVEYXRlID0gX2V4cGlyZURhdGU7Ci0gICAgICAgIG1fZGVsZXRlZCA9IGZhbHNlOwotICAgICAg
ICBtX2V4cGlyZURhdGVDaGFuZ2VkID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICBtX2FjY2Vz
c0NvdW50ID0gMDsKLSAgICAgICAgCi0gICAgICAgIG1fbmV4dEluTFJVTGlzdCA9IDA7Ci0gICAg
ICAgIG1fcHJldkluTFJVTGlzdCA9IDA7Ci0JfQotCXZpcnR1YWwgfkNhY2hlZE9iamVjdCgpOwot
Ci0JdmlydHVhbCB2b2lkIHNldENoYXJzZXQoIGNvbnN0IFFTdHJpbmcgJmNocyApIHt9Ci0Jdmly
dHVhbCB2b2lkIGRhdGEoIFFCdWZmZXIgJmJ1ZmZlciwgYm9vbCBlb2YpID0gMDsKLQl2aXJ0dWFs
IHZvaWQgZXJyb3IoIGludCBlcnIsIGNvbnN0IGNoYXIgKnRleHQgKSA9IDA7Ci0KLQljb25zdCBE
T006OkRPTVN0cmluZyAmdXJsKCkgY29uc3QgeyByZXR1cm4gbV91cmw7IH0KLQlUeXBlIHR5cGUo
KSBjb25zdCB7IHJldHVybiBtX3R5cGU7IH0KLQotCXZpcnR1YWwgdm9pZCByZWYoQ2FjaGVkT2Jq
ZWN0Q2xpZW50ICpjb25zdW1lcik7Ci0JdmlydHVhbCB2b2lkIGRlcmVmKENhY2hlZE9iamVjdENs
aWVudCAqY29uc3VtZXIpOwotCi0JaW50IGNvdW50KCkgY29uc3QgeyByZXR1cm4gbV9jbGllbnRz
LmNvdW50KCk7IH0KLQotCVN0YXR1cyBzdGF0dXMoKSBjb25zdCB7IHJldHVybiBtX3N0YXR1czsg
fQotCi0JaW50IHNpemUoKSBjb25zdCB7IHJldHVybiBtX3NpemU7IH0KLQotICAgICAgICBib29s
IGlzTG9hZGVkKCkgY29uc3QgeyByZXR1cm4gIW1fbG9hZGluZzsgfQotICAgICAgICAKLSAgICAg
ICAgdmlydHVhbCBib29sIGlzSW1hZ2UoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotCi0gICAg
aW50IGFjY2Vzc0NvdW50KCkgY29uc3QgeyByZXR1cm4gbV9hY2Nlc3NDb3VudDsgfQotICAgIHZv
aWQgaW5jcmVhc2VBY2Nlc3NDb3VudCgpIHsgbV9hY2Nlc3NDb3VudCsrOyB9Ci0gICAgCi0JLyoq
Ci0JICogY29tcHV0ZXMgdGhlIHN0YXR1cyBvZiBhbiBvYmplY3QgYWZ0ZXIgbG9hZGluZy4KLQkg
KiB0aGUgcmVzdWx0IGRlcGVuZHMgb24gdGhlIG9iamVjdHMgc2l6ZSBhbmQgdGhlIHNpemUgb2Yg
dGhlIGNhY2hlCi0JICogYWxzbyB1cGRhdGVzIHRoZSBleHBpcmUgZGF0ZSBvbiB0aGUgY2FjaGUg
ZW50cnkgZmlsZQotCSAqLwotCXZvaWQgZmluaXNoKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAg
ICAqIENhbGxlZCBieSB0aGUgY2FjaGUgaWYgdGhlIG9iamVjdCBoYXMgYmVlbiByZW1vdmVkIGZy
b20gdGhlIGNhY2hlIGRpY3QKLSAgICAgICAgICogd2hpbGUgc3RpbGwgYmVpbmcgcmVmZXJlbmNl
ZC4gVGhpcyBtZWFucyB0aGUgb2JqZWN0IHNob3VsZCBraWxsIGl0c2VsZgotICAgICAgICAgKiBp
ZiBpdHMgcmVmZXJlbmNlIGNvdW50ZXIgZHJvcHMgZG93biB0byB6ZXJvLgotICAgICAgICAgKi8K
LSAgICAgICAgdm9pZCBzZXRGcmVlKCBib29sIGIgKSB7IG1fZnJlZSA9IGI7IH0KLQotICAgICAg
ICBLSU86OkNhY2hlQ29udHJvbCBjYWNoZVBvbGljeSgpIGNvbnN0IHsgcmV0dXJuIG1fY2FjaGVQ
b2xpY3k7IH0KLQotICAgICAgICB2b2lkIHNldFJlcXVlc3QoUmVxdWVzdCAqX3JlcXVlc3QpOwot
Ci0gICAgICAgIE5TVVJMUmVzcG9uc2UgKnJlc3BvbnNlKCkgY29uc3QgeyByZXR1cm4gbV9yZXNw
b25zZTsgfQotICAgICAgICB2b2lkIHNldFJlc3BvbnNlKE5TVVJMUmVzcG9uc2UgKnJlc3BvbnNl
KTsKLSAgICAgICAgTlNEYXRhICphbGxEYXRhKCkgY29uc3QgeyByZXR1cm4gbV9hbGxEYXRhOyB9
Ci0gICAgICAgIHZvaWQgc2V0QWxsRGF0YSAoTlNEYXRhICpkYXRhKTsKLQotICAgICAgICBib29s
IGNhbkRlbGV0ZSgpIGNvbnN0IHsgcmV0dXJuIChtX2NsaWVudHMuY291bnQoKSA9PSAwICYmICFt
X3JlcXVlc3QpOyB9Ci0KLQl2b2lkIHNldEV4cGlyZURhdGUodGltZV90IF9leHBpcmVEYXRlLCBi
b29sIGNoYW5nZUh0dHBDYWNoZSk7Ci0JCi0JYm9vbCBpc0V4cGlyZWQoKSBjb25zdDsKLQotICAg
ICAgICB2aXJ0dWFsIGJvb2wgc2NoZWR1bGUoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotCi0g
ICAgICAgIC8qKgotICAgICAgICAgKiBMaXN0IG9mIGFjY2VwdGFibGUgbWltZXR5cGVzIHNlcGVy
YXRlZCBieSAiLCIuIEEgbWltZXR5cGUgbWF5IGNvbnRhaW4gYSB3aWxkY2FyZC4KLSAgICAgICAg
ICovCi0gICAgICAgIC8vIGUuZy4gInRleHQvKiIKLSAgICAgICAgUVN0cmluZyBhY2NlcHQoKSBj
b25zdCB7IHJldHVybiBtX2FjY2VwdDsgfQotICAgICAgICB2b2lkIHNldEFjY2VwdChjb25zdCBR
U3RyaW5nICZfYWNjZXB0KSB7IG1fYWNjZXB0ID0gX2FjY2VwdDsgfQotCi0gICAgcHJvdGVjdGVk
OgotICAgICAgICB2b2lkIHNldFNpemUoaW50IHNpemUpOwotICAgICAgICAKLSAgICAgICAgUVB0
ckRpY3Q8Q2FjaGVkT2JqZWN0Q2xpZW50PiBtX2NsaWVudHM7Ci0KLQlET006OkRPTVN0cmluZyBt
X3VybDsKLSAgICAgICAgUVN0cmluZyBtX2FjY2VwdDsKLSAgICAgICAgUmVxdWVzdCAqbV9yZXF1
ZXN0OwotICAgICAgICBOU1VSTFJlc3BvbnNlICptX3Jlc3BvbnNlOwotICAgICAgICBOU0RhdGEg
Km1fYWxsRGF0YTsKLQlUeXBlIG1fdHlwZTsKLQlTdGF0dXMgbV9zdGF0dXM7CisgICAgICAgIENh
Y2hlZE9iamVjdENsaWVudFdhbGtlcihjb25zdCBRUHRyRGljdDxDYWNoZWRPYmplY3RDbGllbnQ+
ICZjbGllbnRzKSA6IF9jdXJyZW50KDApLCBfaXRlcmF0b3IoY2xpZW50cykgeyB9CisgICAgICAg
IENhY2hlZE9iamVjdENsaWVudCAqbmV4dCgpOwogICAgIHByaXZhdGU6Ci0JaW50IG1fc2l6ZTsK
LSAgICBpbnQgbV9hY2Nlc3NDb3VudDsKLSAgICAKLSAgICBwcm90ZWN0ZWQ6Ci0JdGltZV90IG1f
ZXhwaXJlRGF0ZTsKLQlLSU86OkNhY2hlQ29udHJvbCBtX2NhY2hlUG9saWN5OwotICAgICAgICBi
b29sIG1fZnJlZSA6IDE7Ci0gICAgICAgIGJvb2wgbV9kZWxldGVkIDogMTsKLSAgICAgICAgYm9v
bCBtX2xvYWRpbmcgOiAxOwotICAgICAgICBib29sIG1fZXhwaXJlRGF0ZUNoYW5nZWQgOiAxOwot
ICAgIAotICAgIHByaXZhdGU6Ci0gICAgICAgIGJvb2wgYWxsb3dJbkxSVUxpc3QoKSB7IHJldHVy
biBjYW5EZWxldGUoKSAmJiBzdGF0dXMoKSAhPSBQZXJzaXN0ZW50OyB9Ci0gICAgICAgIAotICAg
ICAgICBDYWNoZWRPYmplY3QgKm1fbmV4dEluTFJVTGlzdDsKLSAgICAgICAgQ2FjaGVkT2JqZWN0
ICptX3ByZXZJbkxSVUxpc3Q7Ci0gICAgICAgIGZyaWVuZCBjbGFzcyBDYWNoZTsKLSAgICB9Owot
Ci0KLSAgICAvKioKLSAgICAgKiBhIGNhY2hlZCBzdHlsZSBzaGVldAotICAgICAqLwotICAgIGNs
YXNzIENhY2hlZENTU1N0eWxlU2hlZXQgOiBwdWJsaWMgQ2FjaGVkT2JqZWN0Ci0gICAgewotICAg
IHB1YmxpYzoKLQlDYWNoZWRDU1NTdHlsZVNoZWV0KERvY0xvYWRlciogZGwsIGNvbnN0IERPTTo6
RE9NU3RyaW5nICZ1cmwsIEtJTzo6Q2FjaGVDb250cm9sIGNhY2hlUG9saWN5LCB0aW1lX3QgX2V4
cGlyZURhdGUsIGNvbnN0IFFTdHJpbmcmIGNoYXJzZXQpOwotCUNhY2hlZENTU1N0eWxlU2hlZXQo
Y29uc3QgRE9NOjpET01TdHJpbmcgJnVybCwgY29uc3QgUVN0cmluZyAmc3R5bGVzaGVldF9kYXRh
KTsKLQl2aXJ0dWFsIH5DYWNoZWRDU1NTdHlsZVNoZWV0KCk7Ci0KLQljb25zdCBET006OkRPTVN0
cmluZyAmc2hlZXQoKSBjb25zdCB7IHJldHVybiBtX3NoZWV0OyB9Ci0KLQl2aXJ0dWFsIHZvaWQg
cmVmKENhY2hlZE9iamVjdENsaWVudCAqY29uc3VtZXIpOwotCXZpcnR1YWwgdm9pZCBkZXJlZihD
YWNoZWRPYmplY3RDbGllbnQgKmNvbnN1bWVyKTsKLQotICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0
Q2hhcnNldCggY29uc3QgUVN0cmluZyAmY2hzICk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBkYXRh
KCBRQnVmZmVyICZidWZmZXIsIGJvb2wgZW9mICk7Ci0JdmlydHVhbCB2b2lkIGVycm9yKCBpbnQg
ZXJyLCBjb25zdCBjaGFyICp0ZXh0ICk7Ci0KLSAgICAgICAgdmlydHVhbCBib29sIHNjaGVkdWxl
KCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotCi0Jdm9pZCBjaGVja05vdGlmeSgpOwotCi0gICAg
cHJvdGVjdGVkOgotCURPTTo6RE9NU3RyaW5nIG1fc2hlZXQ7Ci0gICAgICAgIFFUZXh0Q29kZWMq
IG1fY29kZWM7Ci0gICAgfTsKLQotICAgIC8qKgotICAgICAqIGEgY2FjaGVkIHNjcmlwdAotICAg
ICAqLwotICAgIGNsYXNzIENhY2hlZFNjcmlwdCA6IHB1YmxpYyBDYWNoZWRPYmplY3QKLSAgICB7
Ci0gICAgcHVibGljOgotCUNhY2hlZFNjcmlwdChEb2NMb2FkZXIqIGRsLCBjb25zdCBET006OkRP
TVN0cmluZyAmdXJsLCBLSU86OkNhY2hlQ29udHJvbCBjYWNoZVBvbGljeSwgdGltZV90IF9leHBp
cmVEYXRlLCBjb25zdCBRU3RyaW5nJiBjaGFyc2V0KTsKLQlDYWNoZWRTY3JpcHQoY29uc3QgRE9N
OjpET01TdHJpbmcgJnVybCwgY29uc3QgUVN0cmluZyAmc2NyaXB0X2RhdGEpOwotCXZpcnR1YWwg
fkNhY2hlZFNjcmlwdCgpOwotCi0JY29uc3QgRE9NOjpET01TdHJpbmcgJnNjcmlwdCgpIGNvbnN0
IHsgcmV0dXJuIG1fc2NyaXB0OyB9Ci0KLQl2aXJ0dWFsIHZvaWQgcmVmKENhY2hlZE9iamVjdENs
aWVudCAqY29uc3VtZXIpOwotCXZpcnR1YWwgdm9pZCBkZXJlZihDYWNoZWRPYmplY3RDbGllbnQg
KmNvbnN1bWVyKTsKLQotICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0Q2hhcnNldCggY29uc3QgUVN0
cmluZyAmY2hzICk7Ci0JdmlydHVhbCB2b2lkIGRhdGEoIFFCdWZmZXIgJmJ1ZmZlciwgYm9vbCBl
b2YgKTsKLQl2aXJ0dWFsIHZvaWQgZXJyb3IoIGludCBlcnIsIGNvbnN0IGNoYXIgKnRleHQgKTsK
LQotICAgICAgICB2aXJ0dWFsIGJvb2wgc2NoZWR1bGUoKSBjb25zdCB7IHJldHVybiBmYWxzZTsg
fQotICAgICAgICAKLSAgICAgICAgYm9vbCBlcnJvck9jY3VycmVkKCkgY29uc3QgeyByZXR1cm4g
bV9lcnJvck9jY3VycmVkOyB9Ci0KLQl2b2lkIGNoZWNrTm90aWZ5KCk7Ci0KLSAgICBwcm90ZWN0
ZWQ6Ci0JRE9NOjpET01TdHJpbmcgbV9zY3JpcHQ7Ci0gICAgICAgIFFUZXh0Q29kZWMqIG1fY29k
ZWM7Ci0gICAgICAgIGJvb2wgbV9lcnJvck9jY3VycmVkOwotICAgIH07Ci0KLSAgICBjbGFzcyBJ
bWFnZVNvdXJjZTsKLQotICAgIGNsYXNzIENhY2hlZEltYWdlOwotICAgIAotICAgIGNsYXNzIENh
Y2hlZEltYWdlQ2FsbGJhY2sKLSAgICB7Ci0gICAgcHVibGljOgotICAgICAgICBDYWNoZWRJbWFn
ZUNhbGxiYWNrIChDYWNoZWRJbWFnZSAqYykgOiBjYWNoZWRJbWFnZShjKSwgcmVmQ291bnQoMSks
IGhlYWRlclJlY2VpdmVkKGZhbHNlKSB7fTsKLQotICAgICAgICB2b2lkIHJlZigpIHsgcmVmQ291
bnQrKzsgfQotICAgICAgICB2b2lkIGRlcmVmKCkgeyBpZiAoLS1yZWZDb3VudCA9PSAwKSBkZWxl
dGUgdGhpczsgfQotICAgICAgICAKLSAgICAgICAgdm9pZCBub3RpZnlVcGRhdGUoKTsKLSAgICAg
ICAgdm9pZCBub3RpZnlGaW5pc2hlZCgpOwotICAgICAgICB2b2lkIG5vdGlmeURlY29kaW5nRXJy
b3IoKTsKLSAgICAgICAgdm9pZCBjbGVhcigpOwotICAgICAgICB2b2lkIGhhbmRsZUVycm9yKCk7
Ci0gICAgICAgIAotICAgIHByaXZhdGU6Ci0gICAgICAgIENhY2hlZEltYWdlICpjYWNoZWRJbWFn
ZTsKLSAgICAgICAgdWludCByZWZDb3VudDsKLQlib29sIGhlYWRlclJlY2VpdmVkOwotICAgIH07
Ci0gICAgICAgIAotICAgIC8qKgotICAgICAqIGEgY2FjaGVkIGltYWdlCi0gICAgICovCi0gICAg
Y2xhc3MgQ2FjaGVkSW1hZ2UgOiBwdWJsaWMgUU9iamVjdCwgcHVibGljIENhY2hlZE9iamVjdAot
ICAgIHsKLQlRX09CSkVDVAotICAgIHB1YmxpYzoKLQlDYWNoZWRJbWFnZShEb2NMb2FkZXIqIGRs
LCBjb25zdCBET006OkRPTVN0cmluZyAmdXJsLCBLSU86OkNhY2hlQ29udHJvbCBjYWNoZVBvbGlj
eSwgdGltZV90IF9leHBpcmVEYXRlKTsKLQl2aXJ0dWFsIH5DYWNoZWRJbWFnZSgpOwotCi0JY29u
c3QgUVBpeG1hcCAmcGl4bWFwKCkgY29uc3Q7Ci0JY29uc3QgUVBpeG1hcCAmdGlsZWRfcGl4bWFw
KGNvbnN0IFFDb2xvciYgYmcpOwotCi0gICAgICAgIFFTaXplIHBpeG1hcF9zaXplKCkgY29uc3Q7
ICAgIC8vIHJldHVybnMgdGhlIHNpemUgb2YgdGhlIGNvbXBsZXRlIChpLmUuIHdoZW4gZmluaXNo
ZWQpIGxvYWRpbmcKLSAgICAgICAgUVJlY3QgdmFsaWRfcmVjdCgpIGNvbnN0OyAgICAgLy8gcmV0
dXJucyB0aGUgcmVjdGFuZ2xlIG9mIHBpeG1hcCB0aGF0IGhhcyBiZWVuIGxvYWRlZCBhbHJlYWR5
Ci0KLSAgICAgICAgdm9pZCByZWYoQ2FjaGVkT2JqZWN0Q2xpZW50ICpjb25zdW1lcik7Ci0Jdmly
dHVhbCB2b2lkIGRlcmVmKENhY2hlZE9iamVjdENsaWVudCAqY29uc3VtZXIpOwotCi0JdmlydHVh
bCB2b2lkIGRhdGEoIFFCdWZmZXIgJmJ1ZmZlciwgYm9vbCBlb2YgKTsKLQl2aXJ0dWFsIHZvaWQg
ZXJyb3IoIGludCBlcnIsIGNvbnN0IGNoYXIgKnRleHQgKTsKLQotICAgICAgICBib29sIGlzVHJh
bnNwYXJlbnQoKSBjb25zdCB7IHJldHVybiBpc0Z1bGx5VHJhbnNwYXJlbnQ7IH0KLSAgICAgICAg
Ym9vbCBpc0Vycm9ySW1hZ2UoKSBjb25zdCB7IHJldHVybiBlcnJvck9jY3VyZWQ7IH0KLQotICAg
ICAgICB2b2lkIHNldFNob3dBbmltYXRpb25zKCBLSFRNTFNldHRpbmdzOjpLQW5pbWF0aW9uQWR2
aWNlICk7Ci0KLSAgICAgICAgdmlydHVhbCBib29sIHNjaGVkdWxlKCkgY29uc3QgeyByZXR1cm4g
dHJ1ZTsgfQotCi0Jdm9pZCBjaGVja05vdGlmeSgpOwotICAgICAgICAKLSAgICAgICAgdmlydHVh
bCBib29sIGlzSW1hZ2UoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0KLQl2b2lkIGNsZWFyKCk7
Ci0gICAgICAgIAotICAgIHByaXZhdGU6Ci0gICAgICAgIHZvaWQgZG9fbm90aWZ5KGNvbnN0IFFQ
aXhtYXAmIHAsIGNvbnN0IFFSZWN0JiByKTsKLQotICAgICAgICBRUGl4bWFwKiBwOwotCVFQaXht
YXAqIGJnOwotICAgICAgICBRUmdiIGJnQ29sb3I7Ci0gICAgICAgIG11dGFibGUgUVBpeG1hcCog
cGl4UGFydDsKLQotICAgICAgICBJbWFnZVNvdXJjZSogaW1nU291cmNlOwotICAgICAgICBjb25z
dCBjaGFyKiBmb3JtYXRUeXBlOyAgLy8gSXMgdGhlIG5hbWUgb2YgdGhlIG1vdmllIGZvcm1hdCB0
eXBlCi0KLQlpbnQgd2lkdGg7Ci0JaW50IGhlaWdodDsKLQotCS8vIElzIHNldCBpZiBtb3ZpZSBm
b3JtYXQgdHlwZSAoIGluY3JlbWVudGFsL2FuaW1hdGlvbikgd2FzIGNoZWNrZWQKLQlib29sIHR5
cGVDaGVja2VkIDogMTsKLSAgICAgICAgYm9vbCBpc0Z1bGx5VHJhbnNwYXJlbnQgOiAxOwotICAg
ICAgICBib29sIGVycm9yT2NjdXJlZCA6IDE7Ci0gICAgICAgIGJvb2wgbW9ub2Nocm9tZSA6IDE7
Ci0gICAgICAgIEtIVE1MU2V0dGluZ3M6OktBbmltYXRpb25BZHZpY2UgbV9zaG93QW5pbWF0aW9u
cyA6IDI7Ci0KLSAgICAgICAgZnJpZW5kIGNsYXNzIENhY2hlOwotCi0gICAgcHVibGljOgotICAg
ICAgICBpbnQgZGF0YVNpemUoKSBjb25zdCB7IHJldHVybiBtX2RhdGFTaXplOyB9Ci0JQ2FjaGVk
SW1hZ2VDYWxsYmFjayAqZGVjb2RlckNhbGxiYWNrKCkgY29uc3QgeyByZXR1cm4gbV9kZWNvZGVy
Q2FsbGJhY2s7IH0KLSAgICBwcml2YXRlOgotICAgICAgICBmcmllbmQgY2xhc3MgQ2FjaGVkSW1h
Z2VDYWxsYmFjazsKLSAgICAgICAgCi0gICAgICAgIGludCBtX2RhdGFTaXplOwotICAgICAgICBD
YWNoZWRJbWFnZUNhbGxiYWNrICptX2RlY29kZXJDYWxsYmFjazsKLSAgICB9OwotCi0jaWZkZWYg
S0hUTUxfWFNMVAotICAgIGNsYXNzIENhY2hlZFhTTFN0eWxlU2hlZXQgOiBwdWJsaWMgQ2FjaGVk
T2JqZWN0Ci0gICAgewotcHVibGljOgotICAgICAgICBDYWNoZWRYU0xTdHlsZVNoZWV0KERvY0xv
YWRlciogZGwsIGNvbnN0IERPTTo6RE9NU3RyaW5nICZ1cmwsIEtJTzo6Q2FjaGVDb250cm9sIGNh
Y2hlUG9saWN5LCB0aW1lX3QgX2V4cGlyZURhdGUpOwotCi0gICAgICAgIGNvbnN0IERPTTo6RE9N
U3RyaW5nJiBzaGVldCgpIGNvbnN0IHsgcmV0dXJuIG1fc2hlZXQ7IH0KLSAgICAgICAgCi0gICAg
ICAgIHZpcnR1YWwgdm9pZCByZWYoQ2FjaGVkT2JqZWN0Q2xpZW50ICpjb25zdW1lcik7Ci0gICAg
ICAgIHZpcnR1YWwgdm9pZCBkZXJlZihDYWNoZWRPYmplY3RDbGllbnQgKmNvbnN1bWVyKTsKLSAg
ICAgICAgCi0gICAgICAgIHZpcnR1YWwgdm9pZCBzZXRDaGFyc2V0KGNvbnN0IFFTdHJpbmcgJmNo
cyk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBkYXRhKFFCdWZmZXIgJmJ1ZmZlciwgYm9vbCBlb2Yp
OwotICAgICAgICB2aXJ0dWFsIHZvaWQgZXJyb3IoaW50IGVyciwgY29uc3QgY2hhciAqdGV4dCk7
Ci0gICAgICAgIAotICAgICAgICB2aXJ0dWFsIGJvb2wgc2NoZWR1bGUoKSBjb25zdCB7IHJldHVy
biB0cnVlOyB9Ci0gICAgICAgIAotICAgICAgICB2b2lkIGNoZWNrTm90aWZ5KCk7Ci0gICAgICAg
IAotcHJvdGVjdGVkOgotICAgICAgICBET006OkRPTVN0cmluZyBtX3NoZWV0OwotICAgICAgICBS
ZWZQdHI8RGVjb2Rlcj4gbV9kZWNvZGVyOwotICAgIH07Ci0jZW5kaWYKLSAgICAKLSNpZm5kZWYg
S0hUTUxfTk9fWEJMCi0gICAgY2xhc3MgQ2FjaGVkWEJMRG9jdW1lbnQgOiBwdWJsaWMgQ2FjaGVk
T2JqZWN0Ci0gICAgewotICAgIHB1YmxpYzoKLSAgICAgICAgQ2FjaGVkWEJMRG9jdW1lbnQoRG9j
TG9hZGVyKiBkbCwgY29uc3QgRE9NOjpET01TdHJpbmcgJnVybCwgS0lPOjpDYWNoZUNvbnRyb2wg
Y2FjaGVQb2xpY3ksIHRpbWVfdCBfZXhwaXJlRGF0ZSk7Ci0gICAgICAgIHZpcnR1YWwgfkNhY2hl
ZFhCTERvY3VtZW50KCk7Ci0gICAgICAgIAotICAgICAgICBYQkw6OlhCTERvY3VtZW50SW1wbCog
ZG9jdW1lbnQoKSBjb25zdCB7IHJldHVybiBtX2RvY3VtZW50OyB9Ci0gICAgICAgIAotICAgICAg
ICB2aXJ0dWFsIHZvaWQgcmVmKENhY2hlZE9iamVjdENsaWVudCAqY29uc3VtZXIpOwotICAgICAg
ICB2aXJ0dWFsIHZvaWQgZGVyZWYoQ2FjaGVkT2JqZWN0Q2xpZW50ICpjb25zdW1lcik7Ci0gICAg
ICAgIAotICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0Q2hhcnNldCggY29uc3QgUVN0cmluZyAmY2hz
ICk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBkYXRhKCBRQnVmZmVyICZidWZmZXIsIGJvb2wgZW9m
ICk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBlcnJvciggaW50IGVyciwgY29uc3QgY2hhciAqdGV4
dCApOwotICAgICAgICAKLSAgICAgICAgdmlydHVhbCBib29sIHNjaGVkdWxlKCkgY29uc3QgeyBy
ZXR1cm4gdHJ1ZTsgfQotICAgICAgICAKLSAgICAgICAgdm9pZCBjaGVja05vdGlmeSgpOwotICAg
ICAgICAKLXByb3RlY3RlZDoKLSAgICAgICAgWEJMOjpYQkxEb2N1bWVudEltcGwqIG1fZG9jdW1l
bnQ7Ci0gICAgICAgIFJlZlB0cjxEZWNvZGVyPiBtX2RlY29kZXI7Ci0gICAgfTsKLSNlbmRpZgot
Ci0gICAgLyoqCi0gICAgICogQGludGVybmFsCi0gICAgICoKLSAgICAgKiBNYW5hZ2VzIHRoZSBs
b2FkaW5nIG9mIHNjcmlwdHMvaW1hZ2VzL3N0eWxlc2hlZXRzIGZvciBhIHBhcnRpY3VsYXIgZG9j
dW1lbnQKLSAgICAgKi8KLSAgICBjbGFzcyBEb2NMb2FkZXIKLSAgICB7Ci0gICAgcHVibGljOgot
IAlEb2NMb2FkZXIoS0hUTUxQYXJ0KiwgRE9NOjpEb2N1bWVudEltcGwqKTsKLSAJfkRvY0xvYWRl
cigpOwotCi0JQ2FjaGVkSW1hZ2UgKnJlcXVlc3RJbWFnZSggY29uc3QgRE9NOjpET01TdHJpbmcg
JnVybCk7Ci0JQ2FjaGVkQ1NTU3R5bGVTaGVldCAqcmVxdWVzdFN0eWxlU2hlZXQoIGNvbnN0IERP
TTo6RE9NU3RyaW5nICZ1cmwsIGNvbnN0IFFTdHJpbmcmIGNoYXJzZXQpOwotICAgICAgICBDYWNo
ZWRTY3JpcHQgKnJlcXVlc3RTY3JpcHQoIGNvbnN0IERPTTo6RE9NU3RyaW5nICZ1cmwsIGNvbnN0
IFFTdHJpbmcmIGNoYXJzZXQpOwotCi0jaWZkZWYgS0hUTUxfWFNMVAotICAgICAgICBDYWNoZWRY
U0xTdHlsZVNoZWV0KiByZXF1ZXN0WFNMU3R5bGVTaGVldChjb25zdCBET006OkRPTVN0cmluZyYg
dXJsKTsKLSNlbmRpZgotI2lmbmRlZiBLSFRNTF9OT19YQkwKLSAgICAgICAgQ2FjaGVkWEJMRG9j
dW1lbnQqIHJlcXVlc3RYQkxEb2N1bWVudChjb25zdCBET006OkRPTVN0cmluZyAmdXJsKTsKLSNl
bmRpZgotCi0JYm9vbCBhdXRvbG9hZEltYWdlcygpIGNvbnN0IHsgcmV0dXJuIG1fYmF1dG9sb2Fk
SW1hZ2VzOyB9Ci0gICAgICAgIEtJTzo6Q2FjaGVDb250cm9sIGNhY2hlUG9saWN5KCkgY29uc3Qg
eyByZXR1cm4gbV9jYWNoZVBvbGljeTsgfQotICAgICAgICBLSFRNTFNldHRpbmdzOjpLQW5pbWF0
aW9uQWR2aWNlIHNob3dBbmltYXRpb25zKCkgY29uc3QgeyByZXR1cm4gbV9zaG93QW5pbWF0aW9u
czsgfQotICAgICAgICB0aW1lX3QgZXhwaXJlRGF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1fZXhwaXJl
RGF0ZTsgfQotICAgICAgICBLSFRNTFBhcnQqIHBhcnQoKSBjb25zdCB7IHJldHVybiBtX3BhcnQ7
IH0KLSAgICAgICAgRE9NOjpEb2N1bWVudEltcGwqIGRvYygpIGNvbnN0IHsgcmV0dXJuIG1fZG9j
OyB9Ci0KLSAgICAgICAgdm9pZCBzZXRFeHBpcmVEYXRlKCB0aW1lX3QgKTsKLSAgICAgICAgdm9p
ZCBzZXRBdXRvbG9hZEltYWdlcyggYm9vbCApOwotICAgICAgICB2b2lkIHNldENhY2hlUG9saWN5
KCBLSU86OkNhY2hlQ29udHJvbCBjYWNoZVBvbGljeSApOwotICAgICAgICB2b2lkIHNldFNob3dB
bmltYXRpb25zKCBLSFRNTFNldHRpbmdzOjpLQW5pbWF0aW9uQWR2aWNlICk7Ci0gICAgICAgIHZv
aWQgcmVtb3ZlQ2FjaGVkT2JqZWN0KCBDYWNoZWRPYmplY3QqKSBjb25zdDsKLQkJCi0gICAgICAg
IHZvaWQgc2V0TG9hZEluUHJvZ3Jlc3MoYm9vbCk7Ci0gICAgICAgIGJvb2wgbG9hZEluUHJvZ3Jl
c3MoKSBjb25zdCB7IHJldHVybiBtX2xvYWRJblByb2dyZXNzOyB9Ci0KLSAgICBwcml2YXRlOgot
ICAgICAgICBib29sIG5lZWRSZWxvYWQoY29uc3QgS1VSTCAmZnVsbFVybCk7Ci0KLSAgICAgICAg
ZnJpZW5kIGNsYXNzIENhY2hlOwotICAgICAgICBmcmllbmQgY2xhc3MgRE9NOjpEb2N1bWVudElt
cGw7Ci0KLSAgICAgICAgUVN0cmluZ0xpc3QgbV9yZWxvYWRlZFVSTHM7Ci0gICAgICAgIG11dGFi
bGUgUVB0ckxpc3Q8Q2FjaGVkT2JqZWN0PiBtX2RvY09iamVjdHM7Ci0JdGltZV90IG1fZXhwaXJl
RGF0ZTsKLQlLSU86OkNhY2hlQ29udHJvbCBtX2NhY2hlUG9saWN5OwotICAgICAgICBib29sIG1f
YmF1dG9sb2FkSW1hZ2VzIDogMTsKLSAgICAgICAgS0hUTUxTZXR0aW5nczo6S0FuaW1hdGlvbkFk
dmljZSBtX3Nob3dBbmltYXRpb25zIDogMjsKLSAgICAgICAgS0hUTUxQYXJ0KiBtX3BhcnQ7Ci0g
ICAgICAgIERPTTo6RG9jdW1lbnRJbXBsICptX2RvYzsKLSAgICAgICAgYm9vbCBtX2xvYWRJblBy
b2dyZXNzOwotICAgIH07Ci0KLSAgICAvKioKLSAgICAgKiBAaW50ZXJuYWwKLSAgICAgKi8KLSAg
ICBjbGFzcyBSZXF1ZXN0Ci0gICAgewotICAgIHB1YmxpYzoKLQlSZXF1ZXN0KERvY0xvYWRlciog
ZGwsIENhY2hlZE9iamVjdCAqX29iamVjdCwgYm9vbCBfaW5jcmVtZW50YWwpOwotCX5SZXF1ZXN0
KCk7Ci0JYm9vbCBpbmNyZW1lbnRhbDsKLQlRQnVmZmVyIG1fYnVmZmVyOwotCUNhY2hlZE9iamVj
dCAqb2JqZWN0OwotICAgICAgICBEb2NMb2FkZXIqIG1fZG9jTG9hZGVyOwotICAgICAgICBib29s
IG11bHRpcGFydDsKLSAgICAgfTsKLQotICAgIC8qKgotICAgICAqIEBpbnRlcm5hbAotICAgICAq
LwotICAgIGNsYXNzIExvYWRlciA6IHB1YmxpYyBRT2JqZWN0Ci0gICAgewotCVFfT0JKRUNUCi0K
LSAgICBwdWJsaWM6CQotCUxvYWRlcigpOwotCX5Mb2FkZXIoKTsKLQotCXZvaWQgbG9hZChEb2NM
b2FkZXIqIGRsLCBDYWNoZWRPYmplY3QgKm9iamVjdCwgYm9vbCBpbmNyZW1lbnRhbCA9IHRydWUp
OwotCi0gICAgICAgIGludCBudW1SZXF1ZXN0cyggRG9jTG9hZGVyKiBkbCApIGNvbnN0OwotICAg
ICAgICB2b2lkIGNhbmNlbFJlcXVlc3RzKCBEb2NMb2FkZXIqIGRsICk7Ci0KLQl2b2lkIHJlbW92
ZUJhY2tncm91bmREZWNvZGluZ1JlcXVlc3QgKFJlcXVlc3QgKnIpOwotCQotICAgICAgICAvLyBt
YXkgcmV0dXJuIDBMCi0gICAgICAgIEtJTzo6Sm9iICpqb2JGb3JSZXF1ZXN0KCBjb25zdCBET006
OkRPTVN0cmluZyAmdXJsICkgY29uc3Q7Ci0KLSAgICAgICAgS1dRTG9hZGVyICprd3E7Ci0KLSAg
ICBzaWduYWxzOgotCWZyaWVuZCBjbGFzcyBDYWNoZWRJbWFnZUNhbGxiYWNrOwotCi0gICAgICAg
IHZvaWQgcmVxdWVzdFN0YXJ0ZWQoIGtodG1sOjpEb2NMb2FkZXIqIGRsLCBraHRtbDo6Q2FjaGVk
T2JqZWN0KiBvYmogKTsKLQl2b2lkIHJlcXVlc3REb25lKCBraHRtbDo6RG9jTG9hZGVyKiBkbCwg
a2h0bWw6OkNhY2hlZE9iamVjdCAqb2JqICk7Ci0Jdm9pZCByZXF1ZXN0RmFpbGVkKCBraHRtbDo6
RG9jTG9hZGVyKiBkbCwga2h0bWw6OkNhY2hlZE9iamVjdCAqb2JqICk7Ci0KLSAgICBwcm90ZWN0
ZWQgc2xvdHM6Ci0gICAgICAgIHZvaWQgc2xvdEZpbmlzaGVkKCBLSU86OkpvYiAqICwgTlNEYXRh
ICphbGxEYXRhKTsKLQl2b2lkIHNsb3REYXRhKCBLSU86OkpvYiAqLCBjb25zdCBjaGFyICpkYXRh
LCBpbnQgc2l6ZSApOwotICAgICAgICB2b2lkIHNsb3RSZWNlaXZlZFJlc3BvbnNlICggS0lPOjpK
b2IgKiwgTlNVUkxSZXNwb25zZSAqcmVzcG9uc2UgKTsKLQotICAgIHByaXZhdGU6Ci0Jdm9pZCBz
ZXJ2ZVBlbmRpbmdSZXF1ZXN0cygpOwotCi0gICAgICAgIHZpcnR1YWwgYm9vbCBpc0tIVE1MTG9h
ZGVyKCkgY29uc3Q7Ci0KLQlRUHRyTGlzdDxSZXF1ZXN0PiBtX3JlcXVlc3RzUGVuZGluZzsKLQlR
UHRyRGljdDxSZXF1ZXN0PiBtX3JlcXVlc3RzTG9hZGluZzsKLQotCVFQdHJMaXN0PFJlcXVlc3Q+
IG1fcmVxdWVzdHNCYWNrZ3JvdW5kRGVjb2Rpbmc7Ci0KLSNpZmRlZiBIQVZFX0xJQkpQRUcKLSAg
ICAgICAgS0pQRUdGb3JtYXRUeXBlIG1fanBlZ2xvYWRlcjsKLSNlbmRpZgotICAgIH07Ci0KLSAg
ICAgICAgLyoqCi0gICAgICogQGludGVybmFsCi0gICAgICoKLSAgICAgKiBQcm92aWRlcyBhIGNh
Y2hlL2xvYWRlciBmb3Igb2JqZWN0cyBuZWVkZWQgZm9yIGRpc3BsYXlpbmcgdGhlIGh0bWwgcGFn
ZS4KLSAgICAgKiBBdCB0aGUgbW9tZW50IHRoZXNlIGFyZSBzdHlsZXNoZWV0cywgc2NyaXB0cyBh
bmQgaW1hZ2VzCi0gICAgICovCi0gICAgY2xhc3MgQ2FjaGUKLSAgICB7Ci0JZnJpZW5kIGNsYXNz
IERvY0xvYWRlcjsKLSAgICBwdWJsaWM6Ci0JLyoqCi0JICogaW5pdCB0aGUgY2FjaGUgaW4gY2Fz
ZSBpdCdzIG5vdCBhbHJlYWR5LiBUaGlzIG5lZWRzIHRvIGdldCBjYWxsZWQgb25jZQotCSAqIGJl
Zm9yZSB1c2luZyBpdC4KLQkgKi8KLQlzdGF0aWMgdm9pZCBpbml0KCk7Ci0gICAgICAgIAotCS8q
KgotCSAqIEFzayB0aGUgY2FjaGUgZm9yIHNvbWUgdXJsLiBXaWxsIHJldHVybiBhIGNhY2hlZE9i
amVjdCwgYW5kCi0JICogbG9hZCB0aGUgcmVxdWVzdGVkIGRhdGEgaW4gY2FzZSBpdCdzIG5vdCBj
YWhjZWQKLSAgICAgICAgICogaWYgdGhlIERvY0xvYWRlciBpcyB6ZXJvLCB0aGUgdXJsIG11c3Qg
YmUgZnVsbC1xdWFsaWZpZWQuCi0gICAgICAgICAqIE90aGVyd2lzZSwgaXQgaXMgYXV0b21hdGlj
YWxseSBiYXNlLXVybCBleHBhbmRlZAotCSAqLwotCXN0YXRpYyBDYWNoZWRJbWFnZSAqcmVxdWVz
dEltYWdlKCBEb2NMb2FkZXIqIGwsIGNvbnN0IERPTTo6RE9NU3RyaW5nICZ1cmwsIGJvb2wgcmVs
b2FkPWZhbHNlLCB0aW1lX3QgX2V4cGlyZURhdGU9MCk7Ci0gICAgICAgIHN0YXRpYyBDYWNoZWRJ
bWFnZSAqcmVxdWVzdEltYWdlKCBEb2NMb2FkZXIqIGwsIGNvbnN0IEtVUkwgJnVybCwgYm9vbCBy
ZWxvYWQ9ZmFsc2UsIHRpbWVfdCBfZXhwaXJlRGF0ZT0wKTsKLQotCS8qKgotCSAqIEFzayB0aGUg
Y2FjaGUgZm9yIHNvbWUgdXJsLiBXaWxsIHJldHVybiBhIGNhY2hlZE9iamVjdCwgYW5kCi0JICog
bG9hZCB0aGUgcmVxdWVzdGVkIGRhdGEgaW4gY2FzZSBpdCdzIG5vdCBjYWNoZWQKLQkgKi8KLQlz
dGF0aWMgQ2FjaGVkQ1NTU3R5bGVTaGVldCAqcmVxdWVzdFN0eWxlU2hlZXQoIERvY0xvYWRlciog
bCwgY29uc3QgRE9NOjpET01TdHJpbmcgJnVybCwgYm9vbCByZWxvYWQ9ZmFsc2UsIHRpbWVfdCBf
ZXhwaXJlRGF0ZT0wLCBjb25zdCBRU3RyaW5nJiBjaGFyc2V0ID0gUVN0cmluZzo6bnVsbCk7Ci0K
LSNpZmRlZiBLSFRNTF9YU0xUCi0gICAgICAgIC8vIEFzayB0aGUgY2FjaGUgZm9yIGFuIFhTTCBz
dHlsZXNoZWV0LgotICAgICAgICBzdGF0aWMgQ2FjaGVkWFNMU3R5bGVTaGVldCogcmVxdWVzdFhT
TFN0eWxlU2hlZXQoRG9jTG9hZGVyKiBsLCBjb25zdCBET006OkRPTVN0cmluZyAmdXJsLCAKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJv
b2wgcmVsb2FkPWZhbHNlLCB0aW1lX3QgX2V4cGlyZURhdGU9MCk7Ci0jZW5kaWYKLSNpZm5kZWYg
S0hUTUxfTk9fWEJMCi0gICAgICAgIC8vIEFzayB0aGUgY2FjaGUgZm9yIGFuIFhCTCBkb2N1bWVu
dC4KLSAgICAgICAgc3RhdGljIENhY2hlZFhCTERvY3VtZW50KiByZXF1ZXN0WEJMRG9jdW1lbnQo
RG9jTG9hZGVyKiBsLCBjb25zdCBET006OkRPTVN0cmluZyAmdXJsLCAKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZWxvYWQ9ZmFsc2Us
IHRpbWVfdCBfZXhwaXJlRGF0ZT0wKTsKLSNlbmRpZgotCi0gICAgICAgIC8qKgotICAgICAgICAg
KiBQcmUtbG9hZHMgYSBzdHlsZXNoZWV0IGludG8gdGhlIGNhY2hlLgotICAgICAgICAgKi8KLSAg
ICAgICAgc3RhdGljIHZvaWQgcHJlbG9hZFN0eWxlU2hlZXQoY29uc3QgUVN0cmluZyAmdXJsLCBj
b25zdCBRU3RyaW5nICZzdHlsZXNoZWV0X2RhdGEpOwotCi0JLyoqCi0JICogQXNrIHRoZSBjYWNo
ZSBmb3Igc29tZSB1cmwuIFdpbGwgcmV0dXJuIGEgY2FjaGVkT2JqZWN0LCBhbmQKLQkgKiBsb2Fk
IHRoZSByZXF1ZXN0ZWQgZGF0YSBpbiBjYXNlIGl0J3Mgbm90IGNhaGNlZAotCSAqLwotCXN0YXRp
YyBDYWNoZWRTY3JpcHQgKnJlcXVlc3RTY3JpcHQoIERvY0xvYWRlciogbCwgY29uc3QgRE9NOjpE
T01TdHJpbmcgJnVybCwgYm9vbCByZWxvYWQ9ZmFsc2UsIHRpbWVfdCBfZXhwaXJlRGF0ZT0wLCBj
b25zdCBRU3RyaW5nJiBjaGFyc2V0PVFTdHJpbmc6Om51bGwpOwotCi0gICAgICAgIC8qKgotICAg
ICAgICAgKiBQcmUtbG9hZHMgYSBzY3JpcHQgaW50byB0aGUgY2FjaGUuCi0gICAgICAgICAqLwot
ICAgICAgICBzdGF0aWMgdm9pZCBwcmVsb2FkU2NyaXB0KGNvbnN0IFFTdHJpbmcgJnVybCwgY29u
c3QgUVN0cmluZyAmc2NyaXB0X2RhdGEpOwotCi0JLyoqCi0JICogc2V0cyB0aGUgc2l6ZSBvZiB0
aGUgY2FjaGUuIFRoaXMgd2lsbCBvbmx5IGhvZCBhcHByb3hpbWF0ZWx5LCBzaW5jZSB0aGUgc2l6
ZSBzb21lCi0JICogY2FjaGVkIG9iamVjdHMgKGxpa2Ugc3R5bGVzaGVldHMpIHRha2UgdXAgaW4g
bWVtb3J5IGlzIG5vdCBleGFjbHR5IGtub3duLgotCSAqLwotCXN0YXRpYyB2b2lkIHNldFNpemUo
IGludCBieXRlcyApOwotCS8qKgotCSAqIHJldHVybnMgdGhlIHNpemUgb2YgdGhlIGNhY2hlCi0J
ICovCi0Jc3RhdGljIGludCBzaXplKCkgeyByZXR1cm4gbWF4U2l6ZTsgfTsKLQotICAgICAgICBz
dGF0aWMgaW50IG1heENhY2hlYWJsZU9iamVjdFNpemUoKSB7IHJldHVybiBtYXhDYWNoZWFibGU7
IH0KLQotCS8qKgotCSAqIGNsZWFuIHVwIGNhY2hlCi0JICovCi0Jc3RhdGljIHZvaWQgZmx1c2go
Ym9vbCBmb3JjZT1mYWxzZSk7Ci0KLQkvKioKLQkgKiBjbGVhcnMgdGhlIGNhY2hlCi0JICogV2Fy
bmluZzogY2FsbCB0aGlzIG9ubHkgYXQgdGhlIGVuZCBvZiB5b3VyIHByb2dyYW0sIHRvIGNsZWFu
Ci0JICogdXAgbWVtb3J5ICh1c2VmdWwgZm9yIGZpbmRpbmcgbWVtb3J5IGhvbGVzKQotCSAqLwot
CXN0YXRpYyB2b2lkIGNsZWFyKCk7Ci0KLQlzdGF0aWMgTG9hZGVyICpsb2FkZXIoKSB7IHJldHVy
biBtX2xvYWRlcjsgfQotCi0gICAgCXN0YXRpYyBRUGl4bWFwICpudWxsUGl4bWFwOwotICAgICAg
ICBzdGF0aWMgUVBpeG1hcCAqYnJva2VuUGl4bWFwOwotCi0gICAgICAgIHN0YXRpYyB2b2lkIHJl
bW92ZUNhY2hlRW50cnkoIENhY2hlZE9iamVjdCAqb2JqZWN0ICk7Ci0KLSAgICAgICAgc3RydWN0
IFR5cGVTdGF0aXN0aWMgewotICAgICAgICAgICAgaW50IGNvdW50OwotICAgICAgICAgICAgaW50
IHNpemU7Ci0gICAgICAgICAgICBUeXBlU3RhdGlzdGljKCkgOiBjb3VudCgwKSwgc2l6ZSgwKSB7
IH0KLSAgICAgICAgfTsKLSAgICAgICAgCi0gICAgICAgIHN0cnVjdCBTdGF0aXN0aWNzIHsKLSAg
ICAgICAgICAgIFR5cGVTdGF0aXN0aWMgaW1hZ2VzOwotICAgICAgICAgICAgVHlwZVN0YXRpc3Rp
YyBtb3ZpZXM7Ci0gICAgICAgICAgICBUeXBlU3RhdGlzdGljIHN0eWxlU2hlZXRzOwotICAgICAg
ICAgICAgVHlwZVN0YXRpc3RpYyBzY3JpcHRzOwotI2lmZGVmIEtIVE1MX1hTTFQKLSAgICAgICAg
ICAgIFR5cGVTdGF0aXN0aWMgeHNsU3R5bGVTaGVldHM7Ci0jZW5kaWYKLSNpZm5kZWYgS0hUTUxf
Tk9fWEJMCi0gICAgICAgICAgICBUeXBlU3RhdGlzdGljIHhibERvY3M7Ci0jZW5kaWYKLSAgICAg
ICAgICAgIFR5cGVTdGF0aXN0aWMgb3RoZXI7Ci0gICAgICAgIH07Ci0KLSAgICAgICAgc3RhdGlj
IFN0YXRpc3RpY3MgZ2V0U3RhdGlzdGljcygpOwotICAgICAgICBzdGF0aWMgdm9pZCBmbHVzaEFs
bCgpOwotICAgICAgICBzdGF0aWMgdm9pZCBzZXRDYWNoZURpc2FibGVkKGJvb2wpOwotCi0gICAg
ICAgIHN0YXRpYyB2b2lkIGluc2VydEluTFJVTGlzdChDYWNoZWRPYmplY3QgKik7Ci0gICAgICAg
IHN0YXRpYyB2b2lkIHJlbW92ZUZyb21MUlVMaXN0KENhY2hlZE9iamVjdCAqKTsKLSAgICAgICAg
c3RhdGljIGJvb2wgYWRqdXN0U2l6ZShDYWNoZWRPYmplY3QgKiwgaW50IHNpemVEZWx0YSk7Ci0g
ICAgICAgIAotICAgICAgICBzdGF0aWMgTFJVTGlzdCogZ2V0TFJVTGlzdEZvcihDYWNoZWRPYmpl
Y3QqIG8pOwotICAgICAgICAKLSAgICAgICAgc3RhdGljIHZvaWQgY2hlY2tMUlVBbmRVbmNhY2hl
YWJsZUxpc3RJbnRlZ3JpdHkoKTsKLQotICAgIHByb3RlY3RlZDoKLSAgICAgICAgc3RhdGljIFFE
aWN0PENhY2hlZE9iamVjdD4gKmNhY2hlOwotICAgICAgICBzdGF0aWMgUVB0ckxpc3Q8RG9jTG9h
ZGVyPiogZG9jbG9hZGVyOwotICAgIAotICAgICAgICBzdGF0aWMgaW50IG1heFNpemU7Ci0gICAg
ICAgIHN0YXRpYyBpbnQgbWF4Q2FjaGVhYmxlOwotICAgICAgICBzdGF0aWMgaW50IGZsdXNoQ291
bnQ7Ci0gICAgCi0gICAgICAgIHN0YXRpYyBMb2FkZXIgKm1fbG9hZGVyOwotICAgIAotICAgICAg
ICBzdGF0aWMgdm9pZCBtb3ZlVG9IZWFkT2ZMUlVMaXN0KENhY2hlZE9iamVjdCAqKTsKLSAgICAK
LSAgICAgICAgc3RhdGljIExSVUxpc3QgKm1fTFJVTGlzdHM7Ci0gICAgICAgIHN0YXRpYyBpbnQg
bV90b3RhbFNpemVPZkxSVUxpc3RzOwotICAgICAgICAgICAgCi0gICAgICAgIHN0YXRpYyBDYWNo
ZWRPYmplY3QgKm1faGVhZE9mVW5jYWNoZWFibGVMaXN0OwotICAgICAgICAgICAgCi0gICAgICAg
IHN0YXRpYyBpbnQgbV9jb3VudE9mTFJVQW5kVW5jYWNoZWFibGVMaXN0czsKKyAgICAgICAgQ2Fj
aGVkT2JqZWN0Q2xpZW50ICpfY3VycmVudDsKKyAgICAgICAgUVB0ckRpY3RJdGVyYXRvcjxDYWNo
ZWRPYmplY3RDbGllbnQ+IF9pdGVyYXRvcjsKICAgICB9OwogCiB9OwpJbmRleDogbWlzYy9sb2Fk
ZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBtaXNjL2xvYWRlci5oCShyZXZpc2lvbiAxMTk0OCkKKysrIG1p
c2MvbG9hZGVyLmgJKHdvcmtpbmcgY29weSkKQEAgLTIzLDUxICsyMywyMyBAQAogICAgIFRoaXMg
Y2xhc3MgcHJvdmlkZXMgYWxsIGZ1bmN0aW9uYWxpdHkgbmVlZGVkIGZvciBsb2FkaW5nIGltYWdl
cywgc3R5bGUgc2hlZXRzIGFuZCBodG1sCiAgICAgcGFnZXMgZnJvbSB0aGUgd2ViLiBJdCBoYXMg
YSBtZW1vcnkgY2FjaGUgZm9yIHRoZXNlIG9iamVjdHMuCiAqLwotI2lmbmRlZiBfa2h0bWxfbG9h
ZGVyX2gKLSNkZWZpbmUgX2todG1sX2xvYWRlcl9oCisjaWZuZGVmIEtIVE1MX0xvYWRlcl9oCisj
ZGVmaW5lIEtIVE1MX0xvYWRlcl9oCiAKLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSA8
Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHRpbWUuaD4KLQotI2luY2x1ZGUgImxvYWRl
cl9jbGllbnQuaCIKLSNpZmRlZiBIQVZFX0xJQkpQRUcKLSNpbmNsdWRlICJsb2FkZXJfanBlZy5o
IgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxxcHRybGlzdC5oPgog
I2luY2x1ZGUgPHFvYmplY3QuaD4KICNpbmNsdWRlIDxxcHRyZGljdC5oPgotI2luY2x1ZGUgPHFk
aWN0Lmg+Ci0jaW5jbHVkZSA8cXBpeG1hcC5oPgotI2luY2x1ZGUgPHFidWZmZXIuaD4KLSNpbmNs
dWRlIDxxc3RyaW5nbGlzdC5oPgotI2luY2x1ZGUgPHF0ZXh0Y29kZWMuaD4KIAogI2luY2x1ZGUg
PGt1cmwuaD4KICNpbmNsdWRlIDxraW8vZ2xvYmFsLmg+CiAKLSNpbmNsdWRlIDxraHRtbF9zZXR0
aW5ncy5oPgogI2luY2x1ZGUgPGRvbS9kb21fc3RyaW5nLmg+Ci0jaW5jbHVkZSAiRG9jUHRyLmgi
Ci0KLWNsYXNzIEtIVE1MUGFydDsKKyNpbmNsdWRlICJSZXF1ZXN0LmgiCiAKIG5hbWVzcGFjZSBL
SU8gewotICBjbGFzcyBKb2I7Ci0gIGNsYXNzIFRyYW5zZmVySm9iOworICAgIGNsYXNzIEpvYjsK
IH0KIAotbmFtZXNwYWNlIERPTQotewotICAgIGNsYXNzIENTU1N0eWxlU2hlZXRJbXBsOwotICAg
IGNsYXNzIERvY3VtZW50SW1wbDsKLX07Ci0KLQogY2xhc3MgS1dRTG9hZGVyOwogCiAjaWYgX19P
QkpDX18KQEAgLTgyLDQ0OCArNTQsMTEgQEAgY2xhc3MgTlNVUkxSZXNwb25zZTsKIG5hbWVzcGFj
ZSBraHRtbAogewogICAgIGNsYXNzIENhY2hlZE9iamVjdDsKLSAgICBjbGFzcyBSZXF1ZXN0Owog
ICAgIGNsYXNzIERvY0xvYWRlcjsKICAgICBjbGFzcyBEZWNvZGVyOwogCi0gI2RlZmluZSBNQVhf
TFJVX0xJU1RTIDIwCi0gICAgCi0gICAgc3RydWN0IExSVUxpc3QgewotICAgICAgICBDYWNoZWRP
YmplY3QqIG1faGVhZDsKLSAgICAgICAgQ2FjaGVkT2JqZWN0KiBtX3RhaWw7Ci0gICAgCi0gICAg
ICAgIExSVUxpc3QoKTsKLSAgICAgICAgfkxSVUxpc3QoKTsKLSAgICB9OwotICAgIAotICAgIC8q
KgotICAgICAqIEBpbnRlcm5hbAotICAgICAqCi0gICAgICogQSBjYWNoZWQgb2JqZWN0LiBDbGFz
c2VzIHdobyB3YW50IHRvIHVzZSB0aGlzIG9iamVjdCBzaG91bGQgZGVyaXZlCi0gICAgICogZnJv
bSBDYWNoZWRPYmplY3RDbGllbnQsIHRvIGdldCB0aGUgZnVuY3Rpb24gY2FsbHMgaW4gY2FzZSB0
aGUgcmVxdWVzdGVkIGRhdGEgaGFzIGFycml2ZWQuCi0gICAgICoKLSAgICAgKiBUaGlzIGNsYXNz
IGFsc28gZG9lcyB0aGUgYWN0dWFsIGNvbW11bmljYXRpb24gd2l0aCBraW8gYW5kIGxvYWRzIHRo
ZSBmaWxlLgotICAgICAqLwotICAgIGNsYXNzIENhY2hlZE9iamVjdAotICAgIHsKLSAgICBwdWJs
aWM6Ci0JZW51bSBUeXBlIHsKLQkgICAgSW1hZ2UsCi0JICAgIENTU1N0eWxlU2hlZXQsCi0JICAg
IFNjcmlwdAotI2lmZGVmIEtIVE1MX1hTTFQKLSAgICAgICAgICAgICwgWFNMU3R5bGVTaGVldAot
I2VuZGlmCi0jaWZuZGVmIEtIVE1MX05PX1hCTAotICAgICAgICAgICAgLCBYQkwKLSNlbmRpZgot
CX07Ci0KLQllbnVtIFN0YXR1cyB7Ci0JICAgIE5vdENhY2hlZCwgICAgLy8gdGhpcyBVUkwgaXMg
bm90IGNhY2hlZAotCSAgICBVbmtub3duLCAgICAgIC8vIGxldCBpbWFnZWNhY2hlIGRlY2lkZSB3
aGF0IHRvIGRvIHdpdGggaXQKLQkgICAgTmV3LCAgICAgICAgICAvLyBpbnNlcnRpbmcgbmV3IGlt
YWdlCi0gICAgICAgIFBlbmRpbmcsICAgICAgLy8gb25seSBwYXJ0aWFsbHkgbG9hZGVkCi0JICAg
IFBlcnNpc3RlbnQsICAgLy8gbmV2ZXIgZGVsZXRlIHRoaXMgcGl4bWFwCi0JICAgIENhY2hlZCwg
ICAgICAgLy8gcmVndWxhciBjYXNlCi0JICAgIFVuY2FjaGVhYmxlICAgLy8gdG9vIGJpZyB0byBi
ZSBjYWNoZWQsCi0JfTsgIAkgICAgICAgICAgLy8gd2lsbCBiZSBkZXN0cm95ZWQgYXMgc29vbiBh
cyBwb3NzaWJsZQotCi0JQ2FjaGVkT2JqZWN0KGNvbnN0IERPTTo6RE9NU3RyaW5nICZ1cmwsIFR5
cGUgdHlwZSwgS0lPOjpDYWNoZUNvbnRyb2wgX2NhY2hlUG9saWN5LCB0aW1lX3QgX2V4cGlyZURh
dGUsIGludCBzaXplID0gMCkKLQl7Ci0JICAgIG1fdXJsID0gdXJsOwotCSAgICBtX3R5cGUgPSB0
eXBlOwotCSAgICBtX3N0YXR1cyA9IFBlbmRpbmc7Ci0JICAgIG1fc2l6ZSA9IHNpemU7Ci0JICAg
IG1fZnJlZSA9IGZhbHNlOwotCSAgICBtX2NhY2hlUG9saWN5ID0gX2NhY2hlUG9saWN5OwotCSAg
ICBtX3JlcXVlc3QgPSAwOwotICAgICAgICBtX3Jlc3BvbnNlID0gMDsKLSAgICAgICAgbV9hbGxE
YXRhID0gMDsKLQkgICAgbV9leHBpcmVEYXRlID0gX2V4cGlyZURhdGU7Ci0gICAgICAgIG1fZGVs
ZXRlZCA9IGZhbHNlOwotICAgICAgICBtX2V4cGlyZURhdGVDaGFuZ2VkID0gZmFsc2U7Ci0gICAg
ICAgIAotICAgICAgICBtX2FjY2Vzc0NvdW50ID0gMDsKLSAgICAgICAgCi0gICAgICAgIG1fbmV4
dEluTFJVTGlzdCA9IDA7Ci0gICAgICAgIG1fcHJldkluTFJVTGlzdCA9IDA7Ci0JfQotCXZpcnR1
YWwgfkNhY2hlZE9iamVjdCgpOwotCi0JdmlydHVhbCB2b2lkIHNldENoYXJzZXQoIGNvbnN0IFFT
dHJpbmcgJmNocyApIHt9Ci0JdmlydHVhbCB2b2lkIGRhdGEoIFFCdWZmZXIgJmJ1ZmZlciwgYm9v
bCBlb2YpID0gMDsKLQl2aXJ0dWFsIHZvaWQgZXJyb3IoIGludCBlcnIsIGNvbnN0IGNoYXIgKnRl
eHQgKSA9IDA7Ci0KLQljb25zdCBET006OkRPTVN0cmluZyAmdXJsKCkgY29uc3QgeyByZXR1cm4g
bV91cmw7IH0KLQlUeXBlIHR5cGUoKSBjb25zdCB7IHJldHVybiBtX3R5cGU7IH0KLQotCXZpcnR1
YWwgdm9pZCByZWYoQ2FjaGVkT2JqZWN0Q2xpZW50ICpjb25zdW1lcik7Ci0JdmlydHVhbCB2b2lk
IGRlcmVmKENhY2hlZE9iamVjdENsaWVudCAqY29uc3VtZXIpOwotCi0JaW50IGNvdW50KCkgY29u
c3QgeyByZXR1cm4gbV9jbGllbnRzLmNvdW50KCk7IH0KLQotCVN0YXR1cyBzdGF0dXMoKSBjb25z
dCB7IHJldHVybiBtX3N0YXR1czsgfQotCi0JaW50IHNpemUoKSBjb25zdCB7IHJldHVybiBtX3Np
emU7IH0KLQotICAgICAgICBib29sIGlzTG9hZGVkKCkgY29uc3QgeyByZXR1cm4gIW1fbG9hZGlu
ZzsgfQotICAgICAgICAKLSAgICAgICAgdmlydHVhbCBib29sIGlzSW1hZ2UoKSBjb25zdCB7IHJl
dHVybiBmYWxzZTsgfQotCi0gICAgaW50IGFjY2Vzc0NvdW50KCkgY29uc3QgeyByZXR1cm4gbV9h
Y2Nlc3NDb3VudDsgfQotICAgIHZvaWQgaW5jcmVhc2VBY2Nlc3NDb3VudCgpIHsgbV9hY2Nlc3ND
b3VudCsrOyB9Ci0gICAgCi0JLyoqCi0JICogY29tcHV0ZXMgdGhlIHN0YXR1cyBvZiBhbiBvYmpl
Y3QgYWZ0ZXIgbG9hZGluZy4KLQkgKiB0aGUgcmVzdWx0IGRlcGVuZHMgb24gdGhlIG9iamVjdHMg
c2l6ZSBhbmQgdGhlIHNpemUgb2YgdGhlIGNhY2hlCi0JICogYWxzbyB1cGRhdGVzIHRoZSBleHBp
cmUgZGF0ZSBvbiB0aGUgY2FjaGUgZW50cnkgZmlsZQotCSAqLwotCXZvaWQgZmluaXNoKCk7Ci0K
LSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCBieSB0aGUgY2FjaGUgaWYgdGhlIG9iamVj
dCBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIGNhY2hlIGRpY3QKLSAgICAgICAgICogd2hpbGUg
c3RpbGwgYmVpbmcgcmVmZXJlbmNlZC4gVGhpcyBtZWFucyB0aGUgb2JqZWN0IHNob3VsZCBraWxs
IGl0c2VsZgotICAgICAgICAgKiBpZiBpdHMgcmVmZXJlbmNlIGNvdW50ZXIgZHJvcHMgZG93biB0
byB6ZXJvLgotICAgICAgICAgKi8KLSAgICAgICAgdm9pZCBzZXRGcmVlKCBib29sIGIgKSB7IG1f
ZnJlZSA9IGI7IH0KLQotICAgICAgICBLSU86OkNhY2hlQ29udHJvbCBjYWNoZVBvbGljeSgpIGNv
bnN0IHsgcmV0dXJuIG1fY2FjaGVQb2xpY3k7IH0KLQotICAgICAgICB2b2lkIHNldFJlcXVlc3Qo
UmVxdWVzdCAqX3JlcXVlc3QpOwotCi0gICAgICAgIE5TVVJMUmVzcG9uc2UgKnJlc3BvbnNlKCkg
Y29uc3QgeyByZXR1cm4gbV9yZXNwb25zZTsgfQotICAgICAgICB2b2lkIHNldFJlc3BvbnNlKE5T
VVJMUmVzcG9uc2UgKnJlc3BvbnNlKTsKLSAgICAgICAgTlNEYXRhICphbGxEYXRhKCkgY29uc3Qg
eyByZXR1cm4gbV9hbGxEYXRhOyB9Ci0gICAgICAgIHZvaWQgc2V0QWxsRGF0YSAoTlNEYXRhICpk
YXRhKTsKLQotICAgICAgICBib29sIGNhbkRlbGV0ZSgpIGNvbnN0IHsgcmV0dXJuIChtX2NsaWVu
dHMuY291bnQoKSA9PSAwICYmICFtX3JlcXVlc3QpOyB9Ci0KLQl2b2lkIHNldEV4cGlyZURhdGUo
dGltZV90IF9leHBpcmVEYXRlLCBib29sIGNoYW5nZUh0dHBDYWNoZSk7Ci0JCi0JYm9vbCBpc0V4
cGlyZWQoKSBjb25zdDsKLQotICAgICAgICB2aXJ0dWFsIGJvb2wgc2NoZWR1bGUoKSBjb25zdCB7
IHJldHVybiBmYWxzZTsgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBMaXN0IG9mIGFjY2Vw
dGFibGUgbWltZXR5cGVzIHNlcGVyYXRlZCBieSAiLCIuIEEgbWltZXR5cGUgbWF5IGNvbnRhaW4g
YSB3aWxkY2FyZC4KLSAgICAgICAgICovCi0gICAgICAgIC8vIGUuZy4gInRleHQvKiIKLSAgICAg
ICAgUVN0cmluZyBhY2NlcHQoKSBjb25zdCB7IHJldHVybiBtX2FjY2VwdDsgfQotICAgICAgICB2
b2lkIHNldEFjY2VwdChjb25zdCBRU3RyaW5nICZfYWNjZXB0KSB7IG1fYWNjZXB0ID0gX2FjY2Vw
dDsgfQotCi0gICAgcHJvdGVjdGVkOgotICAgICAgICB2b2lkIHNldFNpemUoaW50IHNpemUpOwot
ICAgICAgICAKLSAgICAgICAgUVB0ckRpY3Q8Q2FjaGVkT2JqZWN0Q2xpZW50PiBtX2NsaWVudHM7
Ci0KLQlET006OkRPTVN0cmluZyBtX3VybDsKLSAgICAgICAgUVN0cmluZyBtX2FjY2VwdDsKLSAg
ICAgICAgUmVxdWVzdCAqbV9yZXF1ZXN0OwotICAgICAgICBOU1VSTFJlc3BvbnNlICptX3Jlc3Bv
bnNlOwotICAgICAgICBOU0RhdGEgKm1fYWxsRGF0YTsKLQlUeXBlIG1fdHlwZTsKLQlTdGF0dXMg
bV9zdGF0dXM7Ci0gICAgcHJpdmF0ZToKLQlpbnQgbV9zaXplOwotICAgIGludCBtX2FjY2Vzc0Nv
dW50OwotICAgIAotICAgIHByb3RlY3RlZDoKLQl0aW1lX3QgbV9leHBpcmVEYXRlOwotCUtJTzo6
Q2FjaGVDb250cm9sIG1fY2FjaGVQb2xpY3k7Ci0gICAgICAgIGJvb2wgbV9mcmVlIDogMTsKLSAg
ICAgICAgYm9vbCBtX2RlbGV0ZWQgOiAxOwotICAgICAgICBib29sIG1fbG9hZGluZyA6IDE7Ci0g
ICAgICAgIGJvb2wgbV9leHBpcmVEYXRlQ2hhbmdlZCA6IDE7Ci0gICAgCi0gICAgcHJpdmF0ZToK
LSAgICAgICAgYm9vbCBhbGxvd0luTFJVTGlzdCgpIHsgcmV0dXJuIGNhbkRlbGV0ZSgpICYmIHN0
YXR1cygpICE9IFBlcnNpc3RlbnQ7IH0KLSAgICAgICAgCi0gICAgICAgIENhY2hlZE9iamVjdCAq
bV9uZXh0SW5MUlVMaXN0OwotICAgICAgICBDYWNoZWRPYmplY3QgKm1fcHJldkluTFJVTGlzdDsK
LSAgICAgICAgZnJpZW5kIGNsYXNzIENhY2hlOwotICAgIH07Ci0KLQotICAgIC8qKgotICAgICAq
IGEgY2FjaGVkIHN0eWxlIHNoZWV0Ci0gICAgICovCi0gICAgY2xhc3MgQ2FjaGVkQ1NTU3R5bGVT
aGVldCA6IHB1YmxpYyBDYWNoZWRPYmplY3QKLSAgICB7Ci0gICAgcHVibGljOgotCUNhY2hlZENT
U1N0eWxlU2hlZXQoRG9jTG9hZGVyKiBkbCwgY29uc3QgRE9NOjpET01TdHJpbmcgJnVybCwgS0lP
OjpDYWNoZUNvbnRyb2wgY2FjaGVQb2xpY3ksIHRpbWVfdCBfZXhwaXJlRGF0ZSwgY29uc3QgUVN0
cmluZyYgY2hhcnNldCk7Ci0JQ2FjaGVkQ1NTU3R5bGVTaGVldChjb25zdCBET006OkRPTVN0cmlu
ZyAmdXJsLCBjb25zdCBRU3RyaW5nICZzdHlsZXNoZWV0X2RhdGEpOwotCXZpcnR1YWwgfkNhY2hl
ZENTU1N0eWxlU2hlZXQoKTsKLQotCWNvbnN0IERPTTo6RE9NU3RyaW5nICZzaGVldCgpIGNvbnN0
IHsgcmV0dXJuIG1fc2hlZXQ7IH0KLQotCXZpcnR1YWwgdm9pZCByZWYoQ2FjaGVkT2JqZWN0Q2xp
ZW50ICpjb25zdW1lcik7Ci0JdmlydHVhbCB2b2lkIGRlcmVmKENhY2hlZE9iamVjdENsaWVudCAq
Y29uc3VtZXIpOwotCi0gICAgICAgIHZpcnR1YWwgdm9pZCBzZXRDaGFyc2V0KCBjb25zdCBRU3Ry
aW5nICZjaHMgKTsKLSAgICAgICAgdmlydHVhbCB2b2lkIGRhdGEoIFFCdWZmZXIgJmJ1ZmZlciwg
Ym9vbCBlb2YgKTsKLQl2aXJ0dWFsIHZvaWQgZXJyb3IoIGludCBlcnIsIGNvbnN0IGNoYXIgKnRl
eHQgKTsKLQotICAgICAgICB2aXJ0dWFsIGJvb2wgc2NoZWR1bGUoKSBjb25zdCB7IHJldHVybiB0
cnVlOyB9Ci0KLQl2b2lkIGNoZWNrTm90aWZ5KCk7Ci0KLSAgICBwcm90ZWN0ZWQ6Ci0JRE9NOjpE
T01TdHJpbmcgbV9zaGVldDsKLSAgICAgICAgUVRleHRDb2RlYyogbV9jb2RlYzsKLSAgICB9Owot
Ci0gICAgLyoqCi0gICAgICogYSBjYWNoZWQgc2NyaXB0Ci0gICAgICovCi0gICAgY2xhc3MgQ2Fj
aGVkU2NyaXB0IDogcHVibGljIENhY2hlZE9iamVjdAotICAgIHsKLSAgICBwdWJsaWM6Ci0JQ2Fj
aGVkU2NyaXB0KERvY0xvYWRlciogZGwsIGNvbnN0IERPTTo6RE9NU3RyaW5nICZ1cmwsIEtJTzo6
Q2FjaGVDb250cm9sIGNhY2hlUG9saWN5LCB0aW1lX3QgX2V4cGlyZURhdGUsIGNvbnN0IFFTdHJp
bmcmIGNoYXJzZXQpOwotCUNhY2hlZFNjcmlwdChjb25zdCBET006OkRPTVN0cmluZyAmdXJsLCBj
b25zdCBRU3RyaW5nICZzY3JpcHRfZGF0YSk7Ci0JdmlydHVhbCB+Q2FjaGVkU2NyaXB0KCk7Ci0K
LQljb25zdCBET006OkRPTVN0cmluZyAmc2NyaXB0KCkgY29uc3QgeyByZXR1cm4gbV9zY3JpcHQ7
IH0KLQotCXZpcnR1YWwgdm9pZCByZWYoQ2FjaGVkT2JqZWN0Q2xpZW50ICpjb25zdW1lcik7Ci0J
dmlydHVhbCB2b2lkIGRlcmVmKENhY2hlZE9iamVjdENsaWVudCAqY29uc3VtZXIpOwotCi0gICAg
ICAgIHZpcnR1YWwgdm9pZCBzZXRDaGFyc2V0KCBjb25zdCBRU3RyaW5nICZjaHMgKTsKLQl2aXJ0
dWFsIHZvaWQgZGF0YSggUUJ1ZmZlciAmYnVmZmVyLCBib29sIGVvZiApOwotCXZpcnR1YWwgdm9p
ZCBlcnJvciggaW50IGVyciwgY29uc3QgY2hhciAqdGV4dCApOwotCi0gICAgICAgIHZpcnR1YWwg
Ym9vbCBzY2hlZHVsZSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgICAgIAotICAgICAg
ICBib29sIGVycm9yT2NjdXJyZWQoKSBjb25zdCB7IHJldHVybiBtX2Vycm9yT2NjdXJyZWQ7IH0K
LQotCXZvaWQgY2hlY2tOb3RpZnkoKTsKLQotICAgIHByb3RlY3RlZDoKLQlET006OkRPTVN0cmlu
ZyBtX3NjcmlwdDsKLSAgICAgICAgUVRleHRDb2RlYyogbV9jb2RlYzsKLSAgICAgICAgYm9vbCBt
X2Vycm9yT2NjdXJyZWQ7Ci0gICAgfTsKLQotICAgIGNsYXNzIEltYWdlU291cmNlOwotCi0gICAg
Y2xhc3MgQ2FjaGVkSW1hZ2U7Ci0gICAgCi0gICAgY2xhc3MgQ2FjaGVkSW1hZ2VDYWxsYmFjawot
ICAgIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIENhY2hlZEltYWdlQ2FsbGJhY2sgKENhY2hlZElt
YWdlICpjKSA6IGNhY2hlZEltYWdlKGMpLCByZWZDb3VudCgxKSwgaGVhZGVyUmVjZWl2ZWQoZmFs
c2UpIHt9OwotCi0gICAgICAgIHZvaWQgcmVmKCkgeyByZWZDb3VudCsrOyB9Ci0gICAgICAgIHZv
aWQgZGVyZWYoKSB7IGlmICgtLXJlZkNvdW50ID09IDApIGRlbGV0ZSB0aGlzOyB9Ci0gICAgICAg
IAotICAgICAgICB2b2lkIG5vdGlmeVVwZGF0ZSgpOwotICAgICAgICB2b2lkIG5vdGlmeUZpbmlz
aGVkKCk7Ci0gICAgICAgIHZvaWQgbm90aWZ5RGVjb2RpbmdFcnJvcigpOwotICAgICAgICB2b2lk
IGNsZWFyKCk7Ci0gICAgICAgIHZvaWQgaGFuZGxlRXJyb3IoKTsKLSAgICAgICAgCi0gICAgcHJp
dmF0ZToKLSAgICAgICAgQ2FjaGVkSW1hZ2UgKmNhY2hlZEltYWdlOwotICAgICAgICB1aW50IHJl
ZkNvdW50OwotCWJvb2wgaGVhZGVyUmVjZWl2ZWQ7Ci0gICAgfTsKLSAgICAgICAgCi0gICAgLyoq
Ci0gICAgICogYSBjYWNoZWQgaW1hZ2UKLSAgICAgKi8KLSAgICBjbGFzcyBDYWNoZWRJbWFnZSA6
IHB1YmxpYyBRT2JqZWN0LCBwdWJsaWMgQ2FjaGVkT2JqZWN0Ci0gICAgewotCVFfT0JKRUNUCi0g
ICAgcHVibGljOgotCUNhY2hlZEltYWdlKERvY0xvYWRlciogZGwsIGNvbnN0IERPTTo6RE9NU3Ry
aW5nICZ1cmwsIEtJTzo6Q2FjaGVDb250cm9sIGNhY2hlUG9saWN5LCB0aW1lX3QgX2V4cGlyZURh
dGUpOwotCXZpcnR1YWwgfkNhY2hlZEltYWdlKCk7Ci0KLQljb25zdCBRUGl4bWFwICZwaXhtYXAo
KSBjb25zdDsKLQljb25zdCBRUGl4bWFwICZ0aWxlZF9waXhtYXAoY29uc3QgUUNvbG9yJiBiZyk7
Ci0KLSAgICAgICAgUVNpemUgcGl4bWFwX3NpemUoKSBjb25zdDsgICAgLy8gcmV0dXJucyB0aGUg
c2l6ZSBvZiB0aGUgY29tcGxldGUgKGkuZS4gd2hlbiBmaW5pc2hlZCkgbG9hZGluZwotICAgICAg
ICBRUmVjdCB2YWxpZF9yZWN0KCkgY29uc3Q7ICAgICAvLyByZXR1cm5zIHRoZSByZWN0YW5nbGUg
b2YgcGl4bWFwIHRoYXQgaGFzIGJlZW4gbG9hZGVkIGFscmVhZHkKLQotICAgICAgICB2b2lkIHJl
ZihDYWNoZWRPYmplY3RDbGllbnQgKmNvbnN1bWVyKTsKLQl2aXJ0dWFsIHZvaWQgZGVyZWYoQ2Fj
aGVkT2JqZWN0Q2xpZW50ICpjb25zdW1lcik7Ci0KLQl2aXJ0dWFsIHZvaWQgZGF0YSggUUJ1ZmZl
ciAmYnVmZmVyLCBib29sIGVvZiApOwotCXZpcnR1YWwgdm9pZCBlcnJvciggaW50IGVyciwgY29u
c3QgY2hhciAqdGV4dCApOwotCi0gICAgICAgIGJvb2wgaXNUcmFuc3BhcmVudCgpIGNvbnN0IHsg
cmV0dXJuIGlzRnVsbHlUcmFuc3BhcmVudDsgfQotICAgICAgICBib29sIGlzRXJyb3JJbWFnZSgp
IGNvbnN0IHsgcmV0dXJuIGVycm9yT2NjdXJlZDsgfQotCi0gICAgICAgIHZvaWQgc2V0U2hvd0Fu
aW1hdGlvbnMoIEtIVE1MU2V0dGluZ3M6OktBbmltYXRpb25BZHZpY2UgKTsKLQotICAgICAgICB2
aXJ0dWFsIGJvb2wgc2NoZWR1bGUoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0KLQl2b2lkIGNo
ZWNrTm90aWZ5KCk7Ci0gICAgICAgIAotICAgICAgICB2aXJ0dWFsIGJvb2wgaXNJbWFnZSgpIGNv
bnN0IHsgcmV0dXJuIHRydWU7IH0KLQotCXZvaWQgY2xlYXIoKTsKLSAgICAgICAgCi0gICAgcHJp
dmF0ZToKLSAgICAgICAgdm9pZCBkb19ub3RpZnkoY29uc3QgUVBpeG1hcCYgcCwgY29uc3QgUVJl
Y3QmIHIpOwotCi0gICAgICAgIFFQaXhtYXAqIHA7Ci0JUVBpeG1hcCogYmc7Ci0gICAgICAgIFFS
Z2IgYmdDb2xvcjsKLSAgICAgICAgbXV0YWJsZSBRUGl4bWFwKiBwaXhQYXJ0OwotCi0gICAgICAg
IEltYWdlU291cmNlKiBpbWdTb3VyY2U7Ci0gICAgICAgIGNvbnN0IGNoYXIqIGZvcm1hdFR5cGU7
ICAvLyBJcyB0aGUgbmFtZSBvZiB0aGUgbW92aWUgZm9ybWF0IHR5cGUKLQotCWludCB3aWR0aDsK
LQlpbnQgaGVpZ2h0OwotCi0JLy8gSXMgc2V0IGlmIG1vdmllIGZvcm1hdCB0eXBlICggaW5jcmVt
ZW50YWwvYW5pbWF0aW9uKSB3YXMgY2hlY2tlZAotCWJvb2wgdHlwZUNoZWNrZWQgOiAxOwotICAg
ICAgICBib29sIGlzRnVsbHlUcmFuc3BhcmVudCA6IDE7Ci0gICAgICAgIGJvb2wgZXJyb3JPY2N1
cmVkIDogMTsKLSAgICAgICAgYm9vbCBtb25vY2hyb21lIDogMTsKLSAgICAgICAgS0hUTUxTZXR0
aW5nczo6S0FuaW1hdGlvbkFkdmljZSBtX3Nob3dBbmltYXRpb25zIDogMjsKLQotICAgICAgICBm
cmllbmQgY2xhc3MgQ2FjaGU7Ci0KLSAgICBwdWJsaWM6Ci0gICAgICAgIGludCBkYXRhU2l6ZSgp
IGNvbnN0IHsgcmV0dXJuIG1fZGF0YVNpemU7IH0KLQlDYWNoZWRJbWFnZUNhbGxiYWNrICpkZWNv
ZGVyQ2FsbGJhY2soKSBjb25zdCB7IHJldHVybiBtX2RlY29kZXJDYWxsYmFjazsgfQotICAgIHBy
aXZhdGU6Ci0gICAgICAgIGZyaWVuZCBjbGFzcyBDYWNoZWRJbWFnZUNhbGxiYWNrOwotICAgICAg
ICAKLSAgICAgICAgaW50IG1fZGF0YVNpemU7Ci0gICAgICAgIENhY2hlZEltYWdlQ2FsbGJhY2sg
Km1fZGVjb2RlckNhbGxiYWNrOwotICAgIH07Ci0KLSNpZmRlZiBLSFRNTF9YU0xUCi0gICAgY2xh
c3MgQ2FjaGVkWFNMU3R5bGVTaGVldCA6IHB1YmxpYyBDYWNoZWRPYmplY3QKLSAgICB7Ci1wdWJs
aWM6Ci0gICAgICAgIENhY2hlZFhTTFN0eWxlU2hlZXQoRG9jTG9hZGVyKiBkbCwgY29uc3QgRE9N
OjpET01TdHJpbmcgJnVybCwgS0lPOjpDYWNoZUNvbnRyb2wgY2FjaGVQb2xpY3ksIHRpbWVfdCBf
ZXhwaXJlRGF0ZSk7Ci0KLSAgICAgICAgY29uc3QgRE9NOjpET01TdHJpbmcmIHNoZWV0KCkgY29u
c3QgeyByZXR1cm4gbV9zaGVldDsgfQotICAgICAgICAKLSAgICAgICAgdmlydHVhbCB2b2lkIHJl
ZihDYWNoZWRPYmplY3RDbGllbnQgKmNvbnN1bWVyKTsKLSAgICAgICAgdmlydHVhbCB2b2lkIGRl
cmVmKENhY2hlZE9iamVjdENsaWVudCAqY29uc3VtZXIpOwotICAgICAgICAKLSAgICAgICAgdmly
dHVhbCB2b2lkIHNldENoYXJzZXQoY29uc3QgUVN0cmluZyAmY2hzKTsKLSAgICAgICAgdmlydHVh
bCB2b2lkIGRhdGEoUUJ1ZmZlciAmYnVmZmVyLCBib29sIGVvZik7Ci0gICAgICAgIHZpcnR1YWwg
dm9pZCBlcnJvcihpbnQgZXJyLCBjb25zdCBjaGFyICp0ZXh0KTsKLSAgICAgICAgCi0gICAgICAg
IHZpcnR1YWwgYm9vbCBzY2hlZHVsZSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLSAgICAgICAg
Ci0gICAgICAgIHZvaWQgY2hlY2tOb3RpZnkoKTsKLSAgICAgICAgCi1wcm90ZWN0ZWQ6Ci0gICAg
ICAgIERPTTo6RE9NU3RyaW5nIG1fc2hlZXQ7Ci0gICAgICAgIFJlZlB0cjxEZWNvZGVyPiBtX2Rl
Y29kZXI7Ci0gICAgfTsKLSNlbmRpZgotICAgIAotI2lmbmRlZiBLSFRNTF9OT19YQkwKLSAgICBj
bGFzcyBDYWNoZWRYQkxEb2N1bWVudCA6IHB1YmxpYyBDYWNoZWRPYmplY3QKLSAgICB7Ci0gICAg
cHVibGljOgotICAgICAgICBDYWNoZWRYQkxEb2N1bWVudChEb2NMb2FkZXIqIGRsLCBjb25zdCBE
T006OkRPTVN0cmluZyAmdXJsLCBLSU86OkNhY2hlQ29udHJvbCBjYWNoZVBvbGljeSwgdGltZV90
IF9leHBpcmVEYXRlKTsKLSAgICAgICAgdmlydHVhbCB+Q2FjaGVkWEJMRG9jdW1lbnQoKTsKLSAg
ICAgICAgCi0gICAgICAgIFhCTDo6WEJMRG9jdW1lbnRJbXBsKiBkb2N1bWVudCgpIGNvbnN0IHsg
cmV0dXJuIG1fZG9jdW1lbnQ7IH0KLSAgICAgICAgCi0gICAgICAgIHZpcnR1YWwgdm9pZCByZWYo
Q2FjaGVkT2JqZWN0Q2xpZW50ICpjb25zdW1lcik7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBkZXJl
ZihDYWNoZWRPYmplY3RDbGllbnQgKmNvbnN1bWVyKTsKLSAgICAgICAgCi0gICAgICAgIHZpcnR1
YWwgdm9pZCBzZXRDaGFyc2V0KCBjb25zdCBRU3RyaW5nICZjaHMgKTsKLSAgICAgICAgdmlydHVh
bCB2b2lkIGRhdGEoIFFCdWZmZXIgJmJ1ZmZlciwgYm9vbCBlb2YgKTsKLSAgICAgICAgdmlydHVh
bCB2b2lkIGVycm9yKCBpbnQgZXJyLCBjb25zdCBjaGFyICp0ZXh0ICk7Ci0gICAgICAgIAotICAg
ICAgICB2aXJ0dWFsIGJvb2wgc2NoZWR1bGUoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0gICAg
ICAgIAotICAgICAgICB2b2lkIGNoZWNrTm90aWZ5KCk7Ci0gICAgICAgIAotcHJvdGVjdGVkOgot
ICAgICAgICBYQkw6OlhCTERvY3VtZW50SW1wbCogbV9kb2N1bWVudDsKLSAgICAgICAgUmVmUHRy
PERlY29kZXI+IG1fZGVjb2RlcjsKLSAgICB9OwotI2VuZGlmCi0KLSAgICAvKioKLSAgICAgKiBA
aW50ZXJuYWwKLSAgICAgKgotICAgICAqIE1hbmFnZXMgdGhlIGxvYWRpbmcgb2Ygc2NyaXB0cy9p
bWFnZXMvc3R5bGVzaGVldHMgZm9yIGEgcGFydGljdWxhciBkb2N1bWVudAotICAgICAqLwotICAg
IGNsYXNzIERvY0xvYWRlcgotICAgIHsKLSAgICBwdWJsaWM6Ci0gCURvY0xvYWRlcihLSFRNTFBh
cnQqLCBET006OkRvY3VtZW50SW1wbCopOwotIAl+RG9jTG9hZGVyKCk7Ci0KLQlDYWNoZWRJbWFn
ZSAqcmVxdWVzdEltYWdlKCBjb25zdCBET006OkRPTVN0cmluZyAmdXJsKTsKLQlDYWNoZWRDU1NT
dHlsZVNoZWV0ICpyZXF1ZXN0U3R5bGVTaGVldCggY29uc3QgRE9NOjpET01TdHJpbmcgJnVybCwg
Y29uc3QgUVN0cmluZyYgY2hhcnNldCk7Ci0gICAgICAgIENhY2hlZFNjcmlwdCAqcmVxdWVzdFNj
cmlwdCggY29uc3QgRE9NOjpET01TdHJpbmcgJnVybCwgY29uc3QgUVN0cmluZyYgY2hhcnNldCk7
Ci0KLSNpZmRlZiBLSFRNTF9YU0xUCi0gICAgICAgIENhY2hlZFhTTFN0eWxlU2hlZXQqIHJlcXVl
c3RYU0xTdHlsZVNoZWV0KGNvbnN0IERPTTo6RE9NU3RyaW5nJiB1cmwpOwotI2VuZGlmCi0jaWZu
ZGVmIEtIVE1MX05PX1hCTAotICAgICAgICBDYWNoZWRYQkxEb2N1bWVudCogcmVxdWVzdFhCTERv
Y3VtZW50KGNvbnN0IERPTTo6RE9NU3RyaW5nICZ1cmwpOwotI2VuZGlmCi0KLQlib29sIGF1dG9s
b2FkSW1hZ2VzKCkgY29uc3QgeyByZXR1cm4gbV9iYXV0b2xvYWRJbWFnZXM7IH0KLSAgICAgICAg
S0lPOjpDYWNoZUNvbnRyb2wgY2FjaGVQb2xpY3koKSBjb25zdCB7IHJldHVybiBtX2NhY2hlUG9s
aWN5OyB9Ci0gICAgICAgIEtIVE1MU2V0dGluZ3M6OktBbmltYXRpb25BZHZpY2Ugc2hvd0FuaW1h
dGlvbnMoKSBjb25zdCB7IHJldHVybiBtX3Nob3dBbmltYXRpb25zOyB9Ci0gICAgICAgIHRpbWVf
dCBleHBpcmVEYXRlKCkgY29uc3QgeyByZXR1cm4gbV9leHBpcmVEYXRlOyB9Ci0gICAgICAgIEtI
VE1MUGFydCogcGFydCgpIGNvbnN0IHsgcmV0dXJuIG1fcGFydDsgfQotICAgICAgICBET006OkRv
Y3VtZW50SW1wbCogZG9jKCkgY29uc3QgeyByZXR1cm4gbV9kb2M7IH0KLQotICAgICAgICB2b2lk
IHNldEV4cGlyZURhdGUoIHRpbWVfdCApOwotICAgICAgICB2b2lkIHNldEF1dG9sb2FkSW1hZ2Vz
KCBib29sICk7Ci0gICAgICAgIHZvaWQgc2V0Q2FjaGVQb2xpY3koIEtJTzo6Q2FjaGVDb250cm9s
IGNhY2hlUG9saWN5ICk7Ci0gICAgICAgIHZvaWQgc2V0U2hvd0FuaW1hdGlvbnMoIEtIVE1MU2V0
dGluZ3M6OktBbmltYXRpb25BZHZpY2UgKTsKLSAgICAgICAgdm9pZCByZW1vdmVDYWNoZWRPYmpl
Y3QoIENhY2hlZE9iamVjdCopIGNvbnN0OwotCQkKLSAgICAgICAgdm9pZCBzZXRMb2FkSW5Qcm9n
cmVzcyhib29sKTsKLSAgICAgICAgYm9vbCBsb2FkSW5Qcm9ncmVzcygpIGNvbnN0IHsgcmV0dXJu
IG1fbG9hZEluUHJvZ3Jlc3M7IH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIGJvb2wgbmVlZFJl
bG9hZChjb25zdCBLVVJMICZmdWxsVXJsKTsKLQotICAgICAgICBmcmllbmQgY2xhc3MgQ2FjaGU7
Ci0gICAgICAgIGZyaWVuZCBjbGFzcyBET006OkRvY3VtZW50SW1wbDsKLQotICAgICAgICBRU3Ry
aW5nTGlzdCBtX3JlbG9hZGVkVVJMczsKLSAgICAgICAgbXV0YWJsZSBRUHRyTGlzdDxDYWNoZWRP
YmplY3Q+IG1fZG9jT2JqZWN0czsKLQl0aW1lX3QgbV9leHBpcmVEYXRlOwotCUtJTzo6Q2FjaGVD
b250cm9sIG1fY2FjaGVQb2xpY3k7Ci0gICAgICAgIGJvb2wgbV9iYXV0b2xvYWRJbWFnZXMgOiAx
OwotICAgICAgICBLSFRNTFNldHRpbmdzOjpLQW5pbWF0aW9uQWR2aWNlIG1fc2hvd0FuaW1hdGlv
bnMgOiAyOwotICAgICAgICBLSFRNTFBhcnQqIG1fcGFydDsKLSAgICAgICAgRE9NOjpEb2N1bWVu
dEltcGwgKm1fZG9jOwotICAgICAgICBib29sIG1fbG9hZEluUHJvZ3Jlc3M7Ci0gICAgfTsKLQot
ICAgIC8qKgotICAgICAqIEBpbnRlcm5hbAotICAgICAqLwotICAgIGNsYXNzIFJlcXVlc3QKLSAg
ICB7Ci0gICAgcHVibGljOgotCVJlcXVlc3QoRG9jTG9hZGVyKiBkbCwgQ2FjaGVkT2JqZWN0ICpf
b2JqZWN0LCBib29sIF9pbmNyZW1lbnRhbCk7Ci0JflJlcXVlc3QoKTsKLQlib29sIGluY3JlbWVu
dGFsOwotCVFCdWZmZXIgbV9idWZmZXI7Ci0JQ2FjaGVkT2JqZWN0ICpvYmplY3Q7Ci0gICAgICAg
IERvY0xvYWRlciogbV9kb2NMb2FkZXI7Ci0gICAgICAgIGJvb2wgbXVsdGlwYXJ0OwotICAgICB9
OwotCi0gICAgLyoqCi0gICAgICogQGludGVybmFsCi0gICAgICovCiAgICAgY2xhc3MgTG9hZGVy
IDogcHVibGljIFFPYmplY3QKICAgICB7Ci0JUV9PQkpFQ1QKLQogICAgIHB1YmxpYzoJCiAJTG9h
ZGVyKCk7CiAJfkxvYWRlcigpOwpAQCAtNTYxLDE1MSArOTYsNiBAQCBwcm90ZWN0ZWQ6CiAJUVB0
ckRpY3Q8UmVxdWVzdD4gbV9yZXF1ZXN0c0xvYWRpbmc7CiAKIAlRUHRyTGlzdDxSZXF1ZXN0PiBt
X3JlcXVlc3RzQmFja2dyb3VuZERlY29kaW5nOwotCi0jaWZkZWYgSEFWRV9MSUJKUEVHCi0gICAg
ICAgIEtKUEVHRm9ybWF0VHlwZSBtX2pwZWdsb2FkZXI7Ci0jZW5kaWYKLSAgICB9OwotCi0gICAg
ICAgIC8qKgotICAgICAqIEBpbnRlcm5hbAotICAgICAqCi0gICAgICogUHJvdmlkZXMgYSBjYWNo
ZS9sb2FkZXIgZm9yIG9iamVjdHMgbmVlZGVkIGZvciBkaXNwbGF5aW5nIHRoZSBodG1sIHBhZ2Uu
Ci0gICAgICogQXQgdGhlIG1vbWVudCB0aGVzZSBhcmUgc3R5bGVzaGVldHMsIHNjcmlwdHMgYW5k
IGltYWdlcwotICAgICAqLwotICAgIGNsYXNzIENhY2hlCi0gICAgewotCWZyaWVuZCBjbGFzcyBE
b2NMb2FkZXI7Ci0gICAgcHVibGljOgotCS8qKgotCSAqIGluaXQgdGhlIGNhY2hlIGluIGNhc2Ug
aXQncyBub3QgYWxyZWFkeS4gVGhpcyBuZWVkcyB0byBnZXQgY2FsbGVkIG9uY2UKLQkgKiBiZWZv
cmUgdXNpbmcgaXQuCi0JICovCi0Jc3RhdGljIHZvaWQgaW5pdCgpOwotICAgICAgICAKLQkvKioK
LQkgKiBBc2sgdGhlIGNhY2hlIGZvciBzb21lIHVybC4gV2lsbCByZXR1cm4gYSBjYWNoZWRPYmpl
Y3QsIGFuZAotCSAqIGxvYWQgdGhlIHJlcXVlc3RlZCBkYXRhIGluIGNhc2UgaXQncyBub3QgY2Fo
Y2VkCi0gICAgICAgICAqIGlmIHRoZSBEb2NMb2FkZXIgaXMgemVybywgdGhlIHVybCBtdXN0IGJl
IGZ1bGwtcXVhbGlmaWVkLgotICAgICAgICAgKiBPdGhlcndpc2UsIGl0IGlzIGF1dG9tYXRpY2Fs
bHkgYmFzZS11cmwgZXhwYW5kZWQKLQkgKi8KLQlzdGF0aWMgQ2FjaGVkSW1hZ2UgKnJlcXVlc3RJ
bWFnZSggRG9jTG9hZGVyKiBsLCBjb25zdCBET006OkRPTVN0cmluZyAmdXJsLCBib29sIHJlbG9h
ZD1mYWxzZSwgdGltZV90IF9leHBpcmVEYXRlPTApOwotICAgICAgICBzdGF0aWMgQ2FjaGVkSW1h
Z2UgKnJlcXVlc3RJbWFnZSggRG9jTG9hZGVyKiBsLCBjb25zdCBLVVJMICZ1cmwsIGJvb2wgcmVs
b2FkPWZhbHNlLCB0aW1lX3QgX2V4cGlyZURhdGU9MCk7Ci0KLQkvKioKLQkgKiBBc2sgdGhlIGNh
Y2hlIGZvciBzb21lIHVybC4gV2lsbCByZXR1cm4gYSBjYWNoZWRPYmplY3QsIGFuZAotCSAqIGxv
YWQgdGhlIHJlcXVlc3RlZCBkYXRhIGluIGNhc2UgaXQncyBub3QgY2FjaGVkCi0JICovCi0Jc3Rh
dGljIENhY2hlZENTU1N0eWxlU2hlZXQgKnJlcXVlc3RTdHlsZVNoZWV0KCBEb2NMb2FkZXIqIGws
IGNvbnN0IERPTTo6RE9NU3RyaW5nICZ1cmwsIGJvb2wgcmVsb2FkPWZhbHNlLCB0aW1lX3QgX2V4
cGlyZURhdGU9MCwgY29uc3QgUVN0cmluZyYgY2hhcnNldCA9IFFTdHJpbmc6Om51bGwpOwotCi0j
aWZkZWYgS0hUTUxfWFNMVAotICAgICAgICAvLyBBc2sgdGhlIGNhY2hlIGZvciBhbiBYU0wgc3R5
bGVzaGVldC4KLSAgICAgICAgc3RhdGljIENhY2hlZFhTTFN0eWxlU2hlZXQqIHJlcXVlc3RYU0xT
dHlsZVNoZWV0KERvY0xvYWRlciogbCwgY29uc3QgRE9NOjpET01TdHJpbmcgJnVybCwgCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29s
IHJlbG9hZD1mYWxzZSwgdGltZV90IF9leHBpcmVEYXRlPTApOwotI2VuZGlmCi0jaWZuZGVmIEtI
VE1MX05PX1hCTAotICAgICAgICAvLyBBc2sgdGhlIGNhY2hlIGZvciBhbiBYQkwgZG9jdW1lbnQu
Ci0gICAgICAgIHN0YXRpYyBDYWNoZWRYQkxEb2N1bWVudCogcmVxdWVzdFhCTERvY3VtZW50KERv
Y0xvYWRlciogbCwgY29uc3QgRE9NOjpET01TdHJpbmcgJnVybCwgCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVsb2FkPWZhbHNlLCB0
aW1lX3QgX2V4cGlyZURhdGU9MCk7Ci0jZW5kaWYKLQotICAgICAgICAvKioKLSAgICAgICAgICog
UHJlLWxvYWRzIGEgc3R5bGVzaGVldCBpbnRvIHRoZSBjYWNoZS4KLSAgICAgICAgICovCi0gICAg
ICAgIHN0YXRpYyB2b2lkIHByZWxvYWRTdHlsZVNoZWV0KGNvbnN0IFFTdHJpbmcgJnVybCwgY29u
c3QgUVN0cmluZyAmc3R5bGVzaGVldF9kYXRhKTsKLQotCS8qKgotCSAqIEFzayB0aGUgY2FjaGUg
Zm9yIHNvbWUgdXJsLiBXaWxsIHJldHVybiBhIGNhY2hlZE9iamVjdCwgYW5kCi0JICogbG9hZCB0
aGUgcmVxdWVzdGVkIGRhdGEgaW4gY2FzZSBpdCdzIG5vdCBjYWhjZWQKLQkgKi8KLQlzdGF0aWMg
Q2FjaGVkU2NyaXB0ICpyZXF1ZXN0U2NyaXB0KCBEb2NMb2FkZXIqIGwsIGNvbnN0IERPTTo6RE9N
U3RyaW5nICZ1cmwsIGJvb2wgcmVsb2FkPWZhbHNlLCB0aW1lX3QgX2V4cGlyZURhdGU9MCwgY29u
c3QgUVN0cmluZyYgY2hhcnNldD1RU3RyaW5nOjpudWxsKTsKLQotICAgICAgICAvKioKLSAgICAg
ICAgICogUHJlLWxvYWRzIGEgc2NyaXB0IGludG8gdGhlIGNhY2hlLgotICAgICAgICAgKi8KLSAg
ICAgICAgc3RhdGljIHZvaWQgcHJlbG9hZFNjcmlwdChjb25zdCBRU3RyaW5nICZ1cmwsIGNvbnN0
IFFTdHJpbmcgJnNjcmlwdF9kYXRhKTsKLQotCS8qKgotCSAqIHNldHMgdGhlIHNpemUgb2YgdGhl
IGNhY2hlLiBUaGlzIHdpbGwgb25seSBob2QgYXBwcm94aW1hdGVseSwgc2luY2UgdGhlIHNpemUg
c29tZQotCSAqIGNhY2hlZCBvYmplY3RzIChsaWtlIHN0eWxlc2hlZXRzKSB0YWtlIHVwIGluIG1l
bW9yeSBpcyBub3QgZXhhY2x0eSBrbm93bi4KLQkgKi8KLQlzdGF0aWMgdm9pZCBzZXRTaXplKCBp
bnQgYnl0ZXMgKTsKLQkvKioKLQkgKiByZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBjYWNoZQotCSAq
LwotCXN0YXRpYyBpbnQgc2l6ZSgpIHsgcmV0dXJuIG1heFNpemU7IH07Ci0KLSAgICAgICAgc3Rh
dGljIGludCBtYXhDYWNoZWFibGVPYmplY3RTaXplKCkgeyByZXR1cm4gbWF4Q2FjaGVhYmxlOyB9
Ci0KLQkvKioKLQkgKiBjbGVhbiB1cCBjYWNoZQotCSAqLwotCXN0YXRpYyB2b2lkIGZsdXNoKGJv
b2wgZm9yY2U9ZmFsc2UpOwotCi0JLyoqCi0JICogY2xlYXJzIHRoZSBjYWNoZQotCSAqIFdhcm5p
bmc6IGNhbGwgdGhpcyBvbmx5IGF0IHRoZSBlbmQgb2YgeW91ciBwcm9ncmFtLCB0byBjbGVhbgot
CSAqIHVwIG1lbW9yeSAodXNlZnVsIGZvciBmaW5kaW5nIG1lbW9yeSBob2xlcykKLQkgKi8KLQlz
dGF0aWMgdm9pZCBjbGVhcigpOwotCi0Jc3RhdGljIExvYWRlciAqbG9hZGVyKCkgeyByZXR1cm4g
bV9sb2FkZXI7IH0KLQotICAgIAlzdGF0aWMgUVBpeG1hcCAqbnVsbFBpeG1hcDsKLSAgICAgICAg
c3RhdGljIFFQaXhtYXAgKmJyb2tlblBpeG1hcDsKLQotICAgICAgICBzdGF0aWMgdm9pZCByZW1v
dmVDYWNoZUVudHJ5KCBDYWNoZWRPYmplY3QgKm9iamVjdCApOwotCi0gICAgICAgIHN0cnVjdCBU
eXBlU3RhdGlzdGljIHsKLSAgICAgICAgICAgIGludCBjb3VudDsKLSAgICAgICAgICAgIGludCBz
aXplOwotICAgICAgICAgICAgVHlwZVN0YXRpc3RpYygpIDogY291bnQoMCksIHNpemUoMCkgeyB9
Ci0gICAgICAgIH07Ci0gICAgICAgIAotICAgICAgICBzdHJ1Y3QgU3RhdGlzdGljcyB7Ci0gICAg
ICAgICAgICBUeXBlU3RhdGlzdGljIGltYWdlczsKLSAgICAgICAgICAgIFR5cGVTdGF0aXN0aWMg
bW92aWVzOwotICAgICAgICAgICAgVHlwZVN0YXRpc3RpYyBzdHlsZVNoZWV0czsKLSAgICAgICAg
ICAgIFR5cGVTdGF0aXN0aWMgc2NyaXB0czsKLSNpZmRlZiBLSFRNTF9YU0xUCi0gICAgICAgICAg
ICBUeXBlU3RhdGlzdGljIHhzbFN0eWxlU2hlZXRzOwotI2VuZGlmCi0jaWZuZGVmIEtIVE1MX05P
X1hCTAotICAgICAgICAgICAgVHlwZVN0YXRpc3RpYyB4YmxEb2NzOwotI2VuZGlmCi0gICAgICAg
ICAgICBUeXBlU3RhdGlzdGljIG90aGVyOwotICAgICAgICB9OwotCi0gICAgICAgIHN0YXRpYyBT
dGF0aXN0aWNzIGdldFN0YXRpc3RpY3MoKTsKLSAgICAgICAgc3RhdGljIHZvaWQgZmx1c2hBbGwo
KTsKLSAgICAgICAgc3RhdGljIHZvaWQgc2V0Q2FjaGVEaXNhYmxlZChib29sKTsKLQotICAgICAg
ICBzdGF0aWMgdm9pZCBpbnNlcnRJbkxSVUxpc3QoQ2FjaGVkT2JqZWN0ICopOwotICAgICAgICBz
dGF0aWMgdm9pZCByZW1vdmVGcm9tTFJVTGlzdChDYWNoZWRPYmplY3QgKik7Ci0gICAgICAgIHN0
YXRpYyBib29sIGFkanVzdFNpemUoQ2FjaGVkT2JqZWN0ICosIGludCBzaXplRGVsdGEpOwotICAg
ICAgICAKLSAgICAgICAgc3RhdGljIExSVUxpc3QqIGdldExSVUxpc3RGb3IoQ2FjaGVkT2JqZWN0
KiBvKTsKLSAgICAgICAgCi0gICAgICAgIHN0YXRpYyB2b2lkIGNoZWNrTFJVQW5kVW5jYWNoZWFi
bGVMaXN0SW50ZWdyaXR5KCk7Ci0KLSAgICBwcm90ZWN0ZWQ6Ci0gICAgICAgIHN0YXRpYyBRRGlj
dDxDYWNoZWRPYmplY3Q+ICpjYWNoZTsKLSAgICAgICAgc3RhdGljIFFQdHJMaXN0PERvY0xvYWRl
cj4qIGRvY2xvYWRlcjsKLSAgICAKLSAgICAgICAgc3RhdGljIGludCBtYXhTaXplOwotICAgICAg
ICBzdGF0aWMgaW50IG1heENhY2hlYWJsZTsKLSAgICAgICAgc3RhdGljIGludCBmbHVzaENvdW50
OwotICAgIAotICAgICAgICBzdGF0aWMgTG9hZGVyICptX2xvYWRlcjsKLSAgICAKLSAgICAgICAg
c3RhdGljIHZvaWQgbW92ZVRvSGVhZE9mTFJVTGlzdChDYWNoZWRPYmplY3QgKik7Ci0gICAgCi0g
ICAgICAgIHN0YXRpYyBMUlVMaXN0ICptX0xSVUxpc3RzOwotICAgICAgICBzdGF0aWMgaW50IG1f
dG90YWxTaXplT2ZMUlVMaXN0czsKLSAgICAgICAgICAgIAotICAgICAgICBzdGF0aWMgQ2FjaGVk
T2JqZWN0ICptX2hlYWRPZlVuY2FjaGVhYmxlTGlzdDsKLSAgICAgICAgICAgIAotICAgICAgICBz
dGF0aWMgaW50IG1fY291bnRPZkxSVUFuZFVuY2FjaGVhYmxlTGlzdHM7CiAgICAgfTsKIAogfTsK
SW5kZXg6IG1pc2MvQ2FjaGVkWFNMU3R5bGVTaGVldC5oCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIG1pc2MvQ2Fj
aGVkWFNMU3R5bGVTaGVldC5oCShyZXZpc2lvbiAxMTk0OCkKKysrIG1pc2MvQ2FjaGVkWFNMU3R5
bGVTaGVldC5oCSh3b3JraW5nIGNvcHkpCkBAIC0yMywzNzggKzIzLDIzIEBACiAgICAgVGhpcyBj
bGFzcyBwcm92aWRlcyBhbGwgZnVuY3Rpb25hbGl0eSBuZWVkZWQgZm9yIGxvYWRpbmcgaW1hZ2Vz
LCBzdHlsZSBzaGVldHMgYW5kIGh0bWwKICAgICBwYWdlcyBmcm9tIHRoZSB3ZWIuIEl0IGhhcyBh
IG1lbW9yeSBjYWNoZSBmb3IgdGhlc2Ugb2JqZWN0cy4KICovCi0jaWZuZGVmIF9raHRtbF9sb2Fk
ZXJfaAotI2RlZmluZSBfa2h0bWxfbG9hZGVyX2gKIAotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNp
bmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8dGltZS5oPgotCi0jaW5jbHVk
ZSAibG9hZGVyX2NsaWVudC5oIgotI2lmZGVmIEhBVkVfTElCSlBFRwotI2luY2x1ZGUgImxvYWRl
cl9qcGVnLmgiCi0jZW5kaWYKKyNpZm5kZWYgS0hUTUxfQ2FjaGVkWFNMU3R5bGVTaGVldF9oCisj
ZGVmaW5lIEtIVE1MX0NhY2hlZFhTTFN0eWxlU2hlZXRfaAogCi0jaW5jbHVkZSA8c3RkbGliLmg+
Ci0jaW5jbHVkZSA8cXB0cmxpc3QuaD4KLSNpbmNsdWRlIDxxb2JqZWN0Lmg+Ci0jaW5jbHVkZSA8
cXB0cmRpY3QuaD4KLSNpbmNsdWRlIDxxZGljdC5oPgotI2luY2x1ZGUgPHFwaXhtYXAuaD4KLSNp
bmNsdWRlIDxxYnVmZmVyLmg+Ci0jaW5jbHVkZSA8cXN0cmluZ2xpc3QuaD4KLSNpbmNsdWRlIDxx
dGV4dGNvZGVjLmg+CisjaW5jbHVkZSAiQ2FjaGVkT2JqZWN0LmgiCiAKLSNpbmNsdWRlIDxrdXJs
Lmg+CiAjaW5jbHVkZSA8a2lvL2dsb2JhbC5oPgotCi0jaW5jbHVkZSA8a2h0bWxfc2V0dGluZ3Mu
aD4KICNpbmNsdWRlIDxkb20vZG9tX3N0cmluZy5oPgotI2luY2x1ZGUgIkRvY1B0ci5oIgotCi1j
bGFzcyBLSFRNTFBhcnQ7Ci0KLW5hbWVzcGFjZSBLSU8gewotICBjbGFzcyBKb2I7Ci0gIGNsYXNz
IFRyYW5zZmVySm9iOwotfQotCi1uYW1lc3BhY2UgRE9NCi17Ci0gICAgY2xhc3MgQ1NTU3R5bGVT
aGVldEltcGw7Ci0gICAgY2xhc3MgRG9jdW1lbnRJbXBsOwotfTsKLQotCi1jbGFzcyBLV1FMb2Fk
ZXI7Ci0KLSNpZiBfX09CSkNfXwotQGNsYXNzIE5TRGF0YTsKLUBjbGFzcyBOU1VSTFJlc3BvbnNl
OwotI2Vsc2UKLWNsYXNzIE5TRGF0YTsKLWNsYXNzIE5TVVJMUmVzcG9uc2U7Ci0jZW5kaWYKIAor
Y2xhc3MgUVN0cmluZzsKK2NsYXNzIFFCdWZmZXI7CiAKIG5hbWVzcGFjZSBraHRtbAogewotICAg
IGNsYXNzIENhY2hlZE9iamVjdDsKLSAgICBjbGFzcyBSZXF1ZXN0OwogICAgIGNsYXNzIERvY0xv
YWRlcjsKICAgICBjbGFzcyBEZWNvZGVyOwotCi0gI2RlZmluZSBNQVhfTFJVX0xJU1RTIDIwCi0g
ICAgCi0gICAgc3RydWN0IExSVUxpc3QgewotICAgICAgICBDYWNoZWRPYmplY3QqIG1faGVhZDsK
LSAgICAgICAgQ2FjaGVkT2JqZWN0KiBtX3RhaWw7Ci0gICAgCi0gICAgICAgIExSVUxpc3QoKTsK
LSAgICAgICAgfkxSVUxpc3QoKTsKLSAgICB9OwotICAgIAotICAgIC8qKgotICAgICAqIEBpbnRl
cm5hbAotICAgICAqCi0gICAgICogQSBjYWNoZWQgb2JqZWN0LiBDbGFzc2VzIHdobyB3YW50IHRv
IHVzZSB0aGlzIG9iamVjdCBzaG91bGQgZGVyaXZlCi0gICAgICogZnJvbSBDYWNoZWRPYmplY3RD
bGllbnQsIHRvIGdldCB0aGUgZnVuY3Rpb24gY2FsbHMgaW4gY2FzZSB0aGUgcmVxdWVzdGVkIGRh
dGEgaGFzIGFycml2ZWQuCi0gICAgICoKLSAgICAgKiBUaGlzIGNsYXNzIGFsc28gZG9lcyB0aGUg
YWN0dWFsIGNvbW11bmljYXRpb24gd2l0aCBraW8gYW5kIGxvYWRzIHRoZSBmaWxlLgotICAgICAq
LwotICAgIGNsYXNzIENhY2hlZE9iamVjdAotICAgIHsKLSAgICBwdWJsaWM6Ci0JZW51bSBUeXBl
IHsKLQkgICAgSW1hZ2UsCi0JICAgIENTU1N0eWxlU2hlZXQsCi0JICAgIFNjcmlwdAotI2lmZGVm
IEtIVE1MX1hTTFQKLSAgICAgICAgICAgICwgWFNMU3R5bGVTaGVldAotI2VuZGlmCi0jaWZuZGVm
IEtIVE1MX05PX1hCTAotICAgICAgICAgICAgLCBYQkwKLSNlbmRpZgotCX07Ci0KLQllbnVtIFN0
YXR1cyB7Ci0JICAgIE5vdENhY2hlZCwgICAgLy8gdGhpcyBVUkwgaXMgbm90IGNhY2hlZAotCSAg
ICBVbmtub3duLCAgICAgIC8vIGxldCBpbWFnZWNhY2hlIGRlY2lkZSB3aGF0IHRvIGRvIHdpdGgg
aXQKLQkgICAgTmV3LCAgICAgICAgICAvLyBpbnNlcnRpbmcgbmV3IGltYWdlCi0gICAgICAgIFBl
bmRpbmcsICAgICAgLy8gb25seSBwYXJ0aWFsbHkgbG9hZGVkCi0JICAgIFBlcnNpc3RlbnQsICAg
Ly8gbmV2ZXIgZGVsZXRlIHRoaXMgcGl4bWFwCi0JICAgIENhY2hlZCwgICAgICAgLy8gcmVndWxh
ciBjYXNlCi0JICAgIFVuY2FjaGVhYmxlICAgLy8gdG9vIGJpZyB0byBiZSBjYWNoZWQsCi0JfTsg
IAkgICAgICAgICAgLy8gd2lsbCBiZSBkZXN0cm95ZWQgYXMgc29vbiBhcyBwb3NzaWJsZQotCi0J
Q2FjaGVkT2JqZWN0KGNvbnN0IERPTTo6RE9NU3RyaW5nICZ1cmwsIFR5cGUgdHlwZSwgS0lPOjpD
YWNoZUNvbnRyb2wgX2NhY2hlUG9saWN5LCB0aW1lX3QgX2V4cGlyZURhdGUsIGludCBzaXplID0g
MCkKLQl7Ci0JICAgIG1fdXJsID0gdXJsOwotCSAgICBtX3R5cGUgPSB0eXBlOwotCSAgICBtX3N0
YXR1cyA9IFBlbmRpbmc7Ci0JICAgIG1fc2l6ZSA9IHNpemU7Ci0JICAgIG1fZnJlZSA9IGZhbHNl
OwotCSAgICBtX2NhY2hlUG9saWN5ID0gX2NhY2hlUG9saWN5OwotCSAgICBtX3JlcXVlc3QgPSAw
OwotICAgICAgICBtX3Jlc3BvbnNlID0gMDsKLSAgICAgICAgbV9hbGxEYXRhID0gMDsKLQkgICAg
bV9leHBpcmVEYXRlID0gX2V4cGlyZURhdGU7Ci0gICAgICAgIG1fZGVsZXRlZCA9IGZhbHNlOwot
ICAgICAgICBtX2V4cGlyZURhdGVDaGFuZ2VkID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICBt
X2FjY2Vzc0NvdW50ID0gMDsKLSAgICAgICAgCi0gICAgICAgIG1fbmV4dEluTFJVTGlzdCA9IDA7
Ci0gICAgICAgIG1fcHJldkluTFJVTGlzdCA9IDA7Ci0JfQotCXZpcnR1YWwgfkNhY2hlZE9iamVj
dCgpOwotCi0JdmlydHVhbCB2b2lkIHNldENoYXJzZXQoIGNvbnN0IFFTdHJpbmcgJmNocyApIHt9
Ci0JdmlydHVhbCB2b2lkIGRhdGEoIFFCdWZmZXIgJmJ1ZmZlciwgYm9vbCBlb2YpID0gMDsKLQl2
aXJ0dWFsIHZvaWQgZXJyb3IoIGludCBlcnIsIGNvbnN0IGNoYXIgKnRleHQgKSA9IDA7Ci0KLQlj
b25zdCBET006OkRPTVN0cmluZyAmdXJsKCkgY29uc3QgeyByZXR1cm4gbV91cmw7IH0KLQlUeXBl
IHR5cGUoKSBjb25zdCB7IHJldHVybiBtX3R5cGU7IH0KLQotCXZpcnR1YWwgdm9pZCByZWYoQ2Fj
aGVkT2JqZWN0Q2xpZW50ICpjb25zdW1lcik7Ci0JdmlydHVhbCB2b2lkIGRlcmVmKENhY2hlZE9i
amVjdENsaWVudCAqY29uc3VtZXIpOwotCi0JaW50IGNvdW50KCkgY29uc3QgeyByZXR1cm4gbV9j
bGllbnRzLmNvdW50KCk7IH0KLQotCVN0YXR1cyBzdGF0dXMoKSBjb25zdCB7IHJldHVybiBtX3N0
YXR1czsgfQotCi0JaW50IHNpemUoKSBjb25zdCB7IHJldHVybiBtX3NpemU7IH0KLQotICAgICAg
ICBib29sIGlzTG9hZGVkKCkgY29uc3QgeyByZXR1cm4gIW1fbG9hZGluZzsgfQotICAgICAgICAK
LSAgICAgICAgdmlydHVhbCBib29sIGlzSW1hZ2UoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQot
Ci0gICAgaW50IGFjY2Vzc0NvdW50KCkgY29uc3QgeyByZXR1cm4gbV9hY2Nlc3NDb3VudDsgfQot
ICAgIHZvaWQgaW5jcmVhc2VBY2Nlc3NDb3VudCgpIHsgbV9hY2Nlc3NDb3VudCsrOyB9Ci0gICAg
Ci0JLyoqCi0JICogY29tcHV0ZXMgdGhlIHN0YXR1cyBvZiBhbiBvYmplY3QgYWZ0ZXIgbG9hZGlu
Zy4KLQkgKiB0aGUgcmVzdWx0IGRlcGVuZHMgb24gdGhlIG9iamVjdHMgc2l6ZSBhbmQgdGhlIHNp
emUgb2YgdGhlIGNhY2hlCi0JICogYWxzbyB1cGRhdGVzIHRoZSBleHBpcmUgZGF0ZSBvbiB0aGUg
Y2FjaGUgZW50cnkgZmlsZQotCSAqLwotCXZvaWQgZmluaXNoKCk7Ci0KLSAgICAgICAgLyoqCi0g
ICAgICAgICAqIENhbGxlZCBieSB0aGUgY2FjaGUgaWYgdGhlIG9iamVjdCBoYXMgYmVlbiByZW1v
dmVkIGZyb20gdGhlIGNhY2hlIGRpY3QKLSAgICAgICAgICogd2hpbGUgc3RpbGwgYmVpbmcgcmVm
ZXJlbmNlZC4gVGhpcyBtZWFucyB0aGUgb2JqZWN0IHNob3VsZCBraWxsIGl0c2VsZgotICAgICAg
ICAgKiBpZiBpdHMgcmVmZXJlbmNlIGNvdW50ZXIgZHJvcHMgZG93biB0byB6ZXJvLgotICAgICAg
ICAgKi8KLSAgICAgICAgdm9pZCBzZXRGcmVlKCBib29sIGIgKSB7IG1fZnJlZSA9IGI7IH0KLQot
ICAgICAgICBLSU86OkNhY2hlQ29udHJvbCBjYWNoZVBvbGljeSgpIGNvbnN0IHsgcmV0dXJuIG1f
Y2FjaGVQb2xpY3k7IH0KLQotICAgICAgICB2b2lkIHNldFJlcXVlc3QoUmVxdWVzdCAqX3JlcXVl
c3QpOwotCi0gICAgICAgIE5TVVJMUmVzcG9uc2UgKnJlc3BvbnNlKCkgY29uc3QgeyByZXR1cm4g
bV9yZXNwb25zZTsgfQotICAgICAgICB2b2lkIHNldFJlc3BvbnNlKE5TVVJMUmVzcG9uc2UgKnJl
c3BvbnNlKTsKLSAgICAgICAgTlNEYXRhICphbGxEYXRhKCkgY29uc3QgeyByZXR1cm4gbV9hbGxE
YXRhOyB9Ci0gICAgICAgIHZvaWQgc2V0QWxsRGF0YSAoTlNEYXRhICpkYXRhKTsKLQotICAgICAg
ICBib29sIGNhbkRlbGV0ZSgpIGNvbnN0IHsgcmV0dXJuIChtX2NsaWVudHMuY291bnQoKSA9PSAw
ICYmICFtX3JlcXVlc3QpOyB9Ci0KLQl2b2lkIHNldEV4cGlyZURhdGUodGltZV90IF9leHBpcmVE
YXRlLCBib29sIGNoYW5nZUh0dHBDYWNoZSk7Ci0JCi0JYm9vbCBpc0V4cGlyZWQoKSBjb25zdDsK
LQotICAgICAgICB2aXJ0dWFsIGJvb2wgc2NoZWR1bGUoKSBjb25zdCB7IHJldHVybiBmYWxzZTsg
fQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBMaXN0IG9mIGFjY2VwdGFibGUgbWltZXR5cGVz
IHNlcGVyYXRlZCBieSAiLCIuIEEgbWltZXR5cGUgbWF5IGNvbnRhaW4gYSB3aWxkY2FyZC4KLSAg
ICAgICAgICovCi0gICAgICAgIC8vIGUuZy4gInRleHQvKiIKLSAgICAgICAgUVN0cmluZyBhY2Nl
cHQoKSBjb25zdCB7IHJldHVybiBtX2FjY2VwdDsgfQotICAgICAgICB2b2lkIHNldEFjY2VwdChj
b25zdCBRU3RyaW5nICZfYWNjZXB0KSB7IG1fYWNjZXB0ID0gX2FjY2VwdDsgfQotCi0gICAgcHJv
dGVjdGVkOgotICAgICAgICB2b2lkIHNldFNpemUoaW50IHNpemUpOwotICAgICAgICAKLSAgICAg
ICAgUVB0ckRpY3Q8Q2FjaGVkT2JqZWN0Q2xpZW50PiBtX2NsaWVudHM7Ci0KLQlET006OkRPTVN0
cmluZyBtX3VybDsKLSAgICAgICAgUVN0cmluZyBtX2FjY2VwdDsKLSAgICAgICAgUmVxdWVzdCAq
bV9yZXF1ZXN0OwotICAgICAgICBOU1VSTFJlc3BvbnNlICptX3Jlc3BvbnNlOwotICAgICAgICBO
U0RhdGEgKm1fYWxsRGF0YTsKLQlUeXBlIG1fdHlwZTsKLQlTdGF0dXMgbV9zdGF0dXM7Ci0gICAg
cHJpdmF0ZToKLQlpbnQgbV9zaXplOwotICAgIGludCBtX2FjY2Vzc0NvdW50OwotICAgIAotICAg
IHByb3RlY3RlZDoKLQl0aW1lX3QgbV9leHBpcmVEYXRlOwotCUtJTzo6Q2FjaGVDb250cm9sIG1f
Y2FjaGVQb2xpY3k7Ci0gICAgICAgIGJvb2wgbV9mcmVlIDogMTsKLSAgICAgICAgYm9vbCBtX2Rl
bGV0ZWQgOiAxOwotICAgICAgICBib29sIG1fbG9hZGluZyA6IDE7Ci0gICAgICAgIGJvb2wgbV9l
eHBpcmVEYXRlQ2hhbmdlZCA6IDE7Ci0gICAgCi0gICAgcHJpdmF0ZToKLSAgICAgICAgYm9vbCBh
bGxvd0luTFJVTGlzdCgpIHsgcmV0dXJuIGNhbkRlbGV0ZSgpICYmIHN0YXR1cygpICE9IFBlcnNp
c3RlbnQ7IH0KLSAgICAgICAgCi0gICAgICAgIENhY2hlZE9iamVjdCAqbV9uZXh0SW5MUlVMaXN0
OwotICAgICAgICBDYWNoZWRPYmplY3QgKm1fcHJldkluTFJVTGlzdDsKLSAgICAgICAgZnJpZW5k
IGNsYXNzIENhY2hlOwotICAgIH07Ci0KLQotICAgIC8qKgotICAgICAqIGEgY2FjaGVkIHN0eWxl
IHNoZWV0Ci0gICAgICovCi0gICAgY2xhc3MgQ2FjaGVkQ1NTU3R5bGVTaGVldCA6IHB1YmxpYyBD
YWNoZWRPYmplY3QKLSAgICB7Ci0gICAgcHVibGljOgotCUNhY2hlZENTU1N0eWxlU2hlZXQoRG9j
TG9hZGVyKiBkbCwgY29uc3QgRE9NOjpET01TdHJpbmcgJnVybCwgS0lPOjpDYWNoZUNvbnRyb2wg
Y2FjaGVQb2xpY3ksIHRpbWVfdCBfZXhwaXJlRGF0ZSwgY29uc3QgUVN0cmluZyYgY2hhcnNldCk7
Ci0JQ2FjaGVkQ1NTU3R5bGVTaGVldChjb25zdCBET006OkRPTVN0cmluZyAmdXJsLCBjb25zdCBR
U3RyaW5nICZzdHlsZXNoZWV0X2RhdGEpOwotCXZpcnR1YWwgfkNhY2hlZENTU1N0eWxlU2hlZXQo
KTsKLQotCWNvbnN0IERPTTo6RE9NU3RyaW5nICZzaGVldCgpIGNvbnN0IHsgcmV0dXJuIG1fc2hl
ZXQ7IH0KLQotCXZpcnR1YWwgdm9pZCByZWYoQ2FjaGVkT2JqZWN0Q2xpZW50ICpjb25zdW1lcik7
Ci0JdmlydHVhbCB2b2lkIGRlcmVmKENhY2hlZE9iamVjdENsaWVudCAqY29uc3VtZXIpOwotCi0g
ICAgICAgIHZpcnR1YWwgdm9pZCBzZXRDaGFyc2V0KCBjb25zdCBRU3RyaW5nICZjaHMgKTsKLSAg
ICAgICAgdmlydHVhbCB2b2lkIGRhdGEoIFFCdWZmZXIgJmJ1ZmZlciwgYm9vbCBlb2YgKTsKLQl2
aXJ0dWFsIHZvaWQgZXJyb3IoIGludCBlcnIsIGNvbnN0IGNoYXIgKnRleHQgKTsKLQotICAgICAg
ICB2aXJ0dWFsIGJvb2wgc2NoZWR1bGUoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0KLQl2b2lk
IGNoZWNrTm90aWZ5KCk7Ci0KLSAgICBwcm90ZWN0ZWQ6Ci0JRE9NOjpET01TdHJpbmcgbV9zaGVl
dDsKLSAgICAgICAgUVRleHRDb2RlYyogbV9jb2RlYzsKLSAgICB9OwotCi0gICAgLyoqCi0gICAg
ICogYSBjYWNoZWQgc2NyaXB0Ci0gICAgICovCi0gICAgY2xhc3MgQ2FjaGVkU2NyaXB0IDogcHVi
bGljIENhY2hlZE9iamVjdAotICAgIHsKLSAgICBwdWJsaWM6Ci0JQ2FjaGVkU2NyaXB0KERvY0xv
YWRlciogZGwsIGNvbnN0IERPTTo6RE9NU3RyaW5nICZ1cmwsIEtJTzo6Q2FjaGVDb250cm9sIGNh
Y2hlUG9saWN5LCB0aW1lX3QgX2V4cGlyZURhdGUsIGNvbnN0IFFTdHJpbmcmIGNoYXJzZXQpOwot
CUNhY2hlZFNjcmlwdChjb25zdCBET006OkRPTVN0cmluZyAmdXJsLCBjb25zdCBRU3RyaW5nICZz
Y3JpcHRfZGF0YSk7Ci0JdmlydHVhbCB+Q2FjaGVkU2NyaXB0KCk7Ci0KLQljb25zdCBET006OkRP
TVN0cmluZyAmc2NyaXB0KCkgY29uc3QgeyByZXR1cm4gbV9zY3JpcHQ7IH0KLQotCXZpcnR1YWwg
dm9pZCByZWYoQ2FjaGVkT2JqZWN0Q2xpZW50ICpjb25zdW1lcik7Ci0JdmlydHVhbCB2b2lkIGRl
cmVmKENhY2hlZE9iamVjdENsaWVudCAqY29uc3VtZXIpOwotCi0gICAgICAgIHZpcnR1YWwgdm9p
ZCBzZXRDaGFyc2V0KCBjb25zdCBRU3RyaW5nICZjaHMgKTsKLQl2aXJ0dWFsIHZvaWQgZGF0YSgg
UUJ1ZmZlciAmYnVmZmVyLCBib29sIGVvZiApOwotCXZpcnR1YWwgdm9pZCBlcnJvciggaW50IGVy
ciwgY29uc3QgY2hhciAqdGV4dCApOwotCi0gICAgICAgIHZpcnR1YWwgYm9vbCBzY2hlZHVsZSgp
IGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgICAgIAotICAgICAgICBib29sIGVycm9yT2Nj
dXJyZWQoKSBjb25zdCB7IHJldHVybiBtX2Vycm9yT2NjdXJyZWQ7IH0KLQotCXZvaWQgY2hlY2tO
b3RpZnkoKTsKLQotICAgIHByb3RlY3RlZDoKLQlET006OkRPTVN0cmluZyBtX3NjcmlwdDsKLSAg
ICAgICAgUVRleHRDb2RlYyogbV9jb2RlYzsKLSAgICAgICAgYm9vbCBtX2Vycm9yT2NjdXJyZWQ7
Ci0gICAgfTsKLQotICAgIGNsYXNzIEltYWdlU291cmNlOwotCi0gICAgY2xhc3MgQ2FjaGVkSW1h
Z2U7Ci0gICAgCi0gICAgY2xhc3MgQ2FjaGVkSW1hZ2VDYWxsYmFjawotICAgIHsKLSAgICBwdWJs
aWM6Ci0gICAgICAgIENhY2hlZEltYWdlQ2FsbGJhY2sgKENhY2hlZEltYWdlICpjKSA6IGNhY2hl
ZEltYWdlKGMpLCByZWZDb3VudCgxKSwgaGVhZGVyUmVjZWl2ZWQoZmFsc2UpIHt9OwotCi0gICAg
ICAgIHZvaWQgcmVmKCkgeyByZWZDb3VudCsrOyB9Ci0gICAgICAgIHZvaWQgZGVyZWYoKSB7IGlm
ICgtLXJlZkNvdW50ID09IDApIGRlbGV0ZSB0aGlzOyB9Ci0gICAgICAgIAotICAgICAgICB2b2lk
IG5vdGlmeVVwZGF0ZSgpOwotICAgICAgICB2b2lkIG5vdGlmeUZpbmlzaGVkKCk7Ci0gICAgICAg
IHZvaWQgbm90aWZ5RGVjb2RpbmdFcnJvcigpOwotICAgICAgICB2b2lkIGNsZWFyKCk7Ci0gICAg
ICAgIHZvaWQgaGFuZGxlRXJyb3IoKTsKLSAgICAgICAgCi0gICAgcHJpdmF0ZToKLSAgICAgICAg
Q2FjaGVkSW1hZ2UgKmNhY2hlZEltYWdlOwotICAgICAgICB1aW50IHJlZkNvdW50OwotCWJvb2wg
aGVhZGVyUmVjZWl2ZWQ7Ci0gICAgfTsKLSAgICAgICAgCi0gICAgLyoqCi0gICAgICogYSBjYWNo
ZWQgaW1hZ2UKLSAgICAgKi8KLSAgICBjbGFzcyBDYWNoZWRJbWFnZSA6IHB1YmxpYyBRT2JqZWN0
LCBwdWJsaWMgQ2FjaGVkT2JqZWN0Ci0gICAgewotCVFfT0JKRUNUCi0gICAgcHVibGljOgotCUNh
Y2hlZEltYWdlKERvY0xvYWRlciogZGwsIGNvbnN0IERPTTo6RE9NU3RyaW5nICZ1cmwsIEtJTzo6
Q2FjaGVDb250cm9sIGNhY2hlUG9saWN5LCB0aW1lX3QgX2V4cGlyZURhdGUpOwotCXZpcnR1YWwg
fkNhY2hlZEltYWdlKCk7Ci0KLQljb25zdCBRUGl4bWFwICZwaXhtYXAoKSBjb25zdDsKLQljb25z
dCBRUGl4bWFwICZ0aWxlZF9waXhtYXAoY29uc3QgUUNvbG9yJiBiZyk7Ci0KLSAgICAgICAgUVNp
emUgcGl4bWFwX3NpemUoKSBjb25zdDsgICAgLy8gcmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgY29t
cGxldGUgKGkuZS4gd2hlbiBmaW5pc2hlZCkgbG9hZGluZwotICAgICAgICBRUmVjdCB2YWxpZF9y
ZWN0KCkgY29uc3Q7ICAgICAvLyByZXR1cm5zIHRoZSByZWN0YW5nbGUgb2YgcGl4bWFwIHRoYXQg
aGFzIGJlZW4gbG9hZGVkIGFscmVhZHkKLQotICAgICAgICB2b2lkIHJlZihDYWNoZWRPYmplY3RD
bGllbnQgKmNvbnN1bWVyKTsKLQl2aXJ0dWFsIHZvaWQgZGVyZWYoQ2FjaGVkT2JqZWN0Q2xpZW50
ICpjb25zdW1lcik7Ci0KLQl2aXJ0dWFsIHZvaWQgZGF0YSggUUJ1ZmZlciAmYnVmZmVyLCBib29s
IGVvZiApOwotCXZpcnR1YWwgdm9pZCBlcnJvciggaW50IGVyciwgY29uc3QgY2hhciAqdGV4dCAp
OwotCi0gICAgICAgIGJvb2wgaXNUcmFuc3BhcmVudCgpIGNvbnN0IHsgcmV0dXJuIGlzRnVsbHlU
cmFuc3BhcmVudDsgfQotICAgICAgICBib29sIGlzRXJyb3JJbWFnZSgpIGNvbnN0IHsgcmV0dXJu
IGVycm9yT2NjdXJlZDsgfQotCi0gICAgICAgIHZvaWQgc2V0U2hvd0FuaW1hdGlvbnMoIEtIVE1M
U2V0dGluZ3M6OktBbmltYXRpb25BZHZpY2UgKTsKLQotICAgICAgICB2aXJ0dWFsIGJvb2wgc2No
ZWR1bGUoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0KLQl2b2lkIGNoZWNrTm90aWZ5KCk7Ci0g
ICAgICAgIAotICAgICAgICB2aXJ0dWFsIGJvb2wgaXNJbWFnZSgpIGNvbnN0IHsgcmV0dXJuIHRy
dWU7IH0KLQotCXZvaWQgY2xlYXIoKTsKLSAgICAgICAgCi0gICAgcHJpdmF0ZToKLSAgICAgICAg
dm9pZCBkb19ub3RpZnkoY29uc3QgUVBpeG1hcCYgcCwgY29uc3QgUVJlY3QmIHIpOwotCi0gICAg
ICAgIFFQaXhtYXAqIHA7Ci0JUVBpeG1hcCogYmc7Ci0gICAgICAgIFFSZ2IgYmdDb2xvcjsKLSAg
ICAgICAgbXV0YWJsZSBRUGl4bWFwKiBwaXhQYXJ0OwotCi0gICAgICAgIEltYWdlU291cmNlKiBp
bWdTb3VyY2U7Ci0gICAgICAgIGNvbnN0IGNoYXIqIGZvcm1hdFR5cGU7ICAvLyBJcyB0aGUgbmFt
ZSBvZiB0aGUgbW92aWUgZm9ybWF0IHR5cGUKLQotCWludCB3aWR0aDsKLQlpbnQgaGVpZ2h0Owot
Ci0JLy8gSXMgc2V0IGlmIG1vdmllIGZvcm1hdCB0eXBlICggaW5jcmVtZW50YWwvYW5pbWF0aW9u
KSB3YXMgY2hlY2tlZAotCWJvb2wgdHlwZUNoZWNrZWQgOiAxOwotICAgICAgICBib29sIGlzRnVs
bHlUcmFuc3BhcmVudCA6IDE7Ci0gICAgICAgIGJvb2wgZXJyb3JPY2N1cmVkIDogMTsKLSAgICAg
ICAgYm9vbCBtb25vY2hyb21lIDogMTsKLSAgICAgICAgS0hUTUxTZXR0aW5nczo6S0FuaW1hdGlv
bkFkdmljZSBtX3Nob3dBbmltYXRpb25zIDogMjsKLQotICAgICAgICBmcmllbmQgY2xhc3MgQ2Fj
aGU7Ci0KLSAgICBwdWJsaWM6Ci0gICAgICAgIGludCBkYXRhU2l6ZSgpIGNvbnN0IHsgcmV0dXJu
IG1fZGF0YVNpemU7IH0KLQlDYWNoZWRJbWFnZUNhbGxiYWNrICpkZWNvZGVyQ2FsbGJhY2soKSBj
b25zdCB7IHJldHVybiBtX2RlY29kZXJDYWxsYmFjazsgfQotICAgIHByaXZhdGU6Ci0gICAgICAg
IGZyaWVuZCBjbGFzcyBDYWNoZWRJbWFnZUNhbGxiYWNrOwotICAgICAgICAKLSAgICAgICAgaW50
IG1fZGF0YVNpemU7Ci0gICAgICAgIENhY2hlZEltYWdlQ2FsbGJhY2sgKm1fZGVjb2RlckNhbGxi
YWNrOwotICAgIH07CisgICAgY2xhc3MgQ2FjaGVkT2JqZWN0Q2xpZW50OwogCiAjaWZkZWYgS0hU
TUxfWFNMVAogICAgIGNsYXNzIENhY2hlZFhTTFN0eWxlU2hlZXQgOiBwdWJsaWMgQ2FjaGVkT2Jq
ZWN0CkBAIC00MTksMjk1ICs2NCw5IEBAIHByb3RlY3RlZDoKICAgICAgICAgRE9NOjpET01TdHJp
bmcgbV9zaGVldDsKICAgICAgICAgUmVmUHRyPERlY29kZXI+IG1fZGVjb2RlcjsKICAgICB9Owot
I2VuZGlmCi0gICAgCi0jaWZuZGVmIEtIVE1MX05PX1hCTAotICAgIGNsYXNzIENhY2hlZFhCTERv
Y3VtZW50IDogcHVibGljIENhY2hlZE9iamVjdAotICAgIHsKLSAgICBwdWJsaWM6Ci0gICAgICAg
IENhY2hlZFhCTERvY3VtZW50KERvY0xvYWRlciogZGwsIGNvbnN0IERPTTo6RE9NU3RyaW5nICZ1
cmwsIEtJTzo6Q2FjaGVDb250cm9sIGNhY2hlUG9saWN5LCB0aW1lX3QgX2V4cGlyZURhdGUpOwot
ICAgICAgICB2aXJ0dWFsIH5DYWNoZWRYQkxEb2N1bWVudCgpOwotICAgICAgICAKLSAgICAgICAg
WEJMOjpYQkxEb2N1bWVudEltcGwqIGRvY3VtZW50KCkgY29uc3QgeyByZXR1cm4gbV9kb2N1bWVu
dDsgfQotICAgICAgICAKLSAgICAgICAgdmlydHVhbCB2b2lkIHJlZihDYWNoZWRPYmplY3RDbGll
bnQgKmNvbnN1bWVyKTsKLSAgICAgICAgdmlydHVhbCB2b2lkIGRlcmVmKENhY2hlZE9iamVjdENs
aWVudCAqY29uc3VtZXIpOwotICAgICAgICAKLSAgICAgICAgdmlydHVhbCB2b2lkIHNldENoYXJz
ZXQoIGNvbnN0IFFTdHJpbmcgJmNocyApOwotICAgICAgICB2aXJ0dWFsIHZvaWQgZGF0YSggUUJ1
ZmZlciAmYnVmZmVyLCBib29sIGVvZiApOwotICAgICAgICB2aXJ0dWFsIHZvaWQgZXJyb3IoIGlu
dCBlcnIsIGNvbnN0IGNoYXIgKnRleHQgKTsKLSAgICAgICAgCi0gICAgICAgIHZpcnR1YWwgYm9v
bCBzY2hlZHVsZSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLSAgICAgICAgCi0gICAgICAgIHZv
aWQgY2hlY2tOb3RpZnkoKTsKLSAgICAgICAgCi1wcm90ZWN0ZWQ6Ci0gICAgICAgIFhCTDo6WEJM
RG9jdW1lbnRJbXBsKiBtX2RvY3VtZW50OwotICAgICAgICBSZWZQdHI8RGVjb2Rlcj4gbV9kZWNv
ZGVyOwotICAgIH07Ci0jZW5kaWYKLQotICAgIC8qKgotICAgICAqIEBpbnRlcm5hbAotICAgICAq
Ci0gICAgICogTWFuYWdlcyB0aGUgbG9hZGluZyBvZiBzY3JpcHRzL2ltYWdlcy9zdHlsZXNoZWV0
cyBmb3IgYSBwYXJ0aWN1bGFyIGRvY3VtZW50Ci0gICAgICovCi0gICAgY2xhc3MgRG9jTG9hZGVy
Ci0gICAgewotICAgIHB1YmxpYzoKLSAJRG9jTG9hZGVyKEtIVE1MUGFydCosIERPTTo6RG9jdW1l
bnRJbXBsKik7Ci0gCX5Eb2NMb2FkZXIoKTsKIAotCUNhY2hlZEltYWdlICpyZXF1ZXN0SW1hZ2Uo
IGNvbnN0IERPTTo6RE9NU3RyaW5nICZ1cmwpOwotCUNhY2hlZENTU1N0eWxlU2hlZXQgKnJlcXVl
c3RTdHlsZVNoZWV0KCBjb25zdCBET006OkRPTVN0cmluZyAmdXJsLCBjb25zdCBRU3RyaW5nJiBj
aGFyc2V0KTsKLSAgICAgICAgQ2FjaGVkU2NyaXB0ICpyZXF1ZXN0U2NyaXB0KCBjb25zdCBET006
OkRPTVN0cmluZyAmdXJsLCBjb25zdCBRU3RyaW5nJiBjaGFyc2V0KTsKLQotI2lmZGVmIEtIVE1M
X1hTTFQKLSAgICAgICAgQ2FjaGVkWFNMU3R5bGVTaGVldCogcmVxdWVzdFhTTFN0eWxlU2hlZXQo
Y29uc3QgRE9NOjpET01TdHJpbmcmIHVybCk7Ci0jZW5kaWYKLSNpZm5kZWYgS0hUTUxfTk9fWEJM
Ci0gICAgICAgIENhY2hlZFhCTERvY3VtZW50KiByZXF1ZXN0WEJMRG9jdW1lbnQoY29uc3QgRE9N
OjpET01TdHJpbmcgJnVybCk7CiAjZW5kaWYKIAotCWJvb2wgYXV0b2xvYWRJbWFnZXMoKSBjb25z
dCB7IHJldHVybiBtX2JhdXRvbG9hZEltYWdlczsgfQotICAgICAgICBLSU86OkNhY2hlQ29udHJv
bCBjYWNoZVBvbGljeSgpIGNvbnN0IHsgcmV0dXJuIG1fY2FjaGVQb2xpY3k7IH0KLSAgICAgICAg
S0hUTUxTZXR0aW5nczo6S0FuaW1hdGlvbkFkdmljZSBzaG93QW5pbWF0aW9ucygpIGNvbnN0IHsg
cmV0dXJuIG1fc2hvd0FuaW1hdGlvbnM7IH0KLSAgICAgICAgdGltZV90IGV4cGlyZURhdGUoKSBj
b25zdCB7IHJldHVybiBtX2V4cGlyZURhdGU7IH0KLSAgICAgICAgS0hUTUxQYXJ0KiBwYXJ0KCkg
Y29uc3QgeyByZXR1cm4gbV9wYXJ0OyB9Ci0gICAgICAgIERPTTo6RG9jdW1lbnRJbXBsKiBkb2Mo
KSBjb25zdCB7IHJldHVybiBtX2RvYzsgfQotCi0gICAgICAgIHZvaWQgc2V0RXhwaXJlRGF0ZSgg
dGltZV90ICk7Ci0gICAgICAgIHZvaWQgc2V0QXV0b2xvYWRJbWFnZXMoIGJvb2wgKTsKLSAgICAg
ICAgdm9pZCBzZXRDYWNoZVBvbGljeSggS0lPOjpDYWNoZUNvbnRyb2wgY2FjaGVQb2xpY3kgKTsK
LSAgICAgICAgdm9pZCBzZXRTaG93QW5pbWF0aW9ucyggS0hUTUxTZXR0aW5nczo6S0FuaW1hdGlv
bkFkdmljZSApOwotICAgICAgICB2b2lkIHJlbW92ZUNhY2hlZE9iamVjdCggQ2FjaGVkT2JqZWN0
KikgY29uc3Q7Ci0JCQotICAgICAgICB2b2lkIHNldExvYWRJblByb2dyZXNzKGJvb2wpOwotICAg
ICAgICBib29sIGxvYWRJblByb2dyZXNzKCkgY29uc3QgeyByZXR1cm4gbV9sb2FkSW5Qcm9ncmVz
czsgfQotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgYm9vbCBuZWVkUmVsb2FkKGNvbnN0IEtVUkwg
JmZ1bGxVcmwpOwotCi0gICAgICAgIGZyaWVuZCBjbGFzcyBDYWNoZTsKLSAgICAgICAgZnJpZW5k
IGNsYXNzIERPTTo6RG9jdW1lbnRJbXBsOwotCi0gICAgICAgIFFTdHJpbmdMaXN0IG1fcmVsb2Fk
ZWRVUkxzOwotICAgICAgICBtdXRhYmxlIFFQdHJMaXN0PENhY2hlZE9iamVjdD4gbV9kb2NPYmpl
Y3RzOwotCXRpbWVfdCBtX2V4cGlyZURhdGU7Ci0JS0lPOjpDYWNoZUNvbnRyb2wgbV9jYWNoZVBv
bGljeTsKLSAgICAgICAgYm9vbCBtX2JhdXRvbG9hZEltYWdlcyA6IDE7Ci0gICAgICAgIEtIVE1M
U2V0dGluZ3M6OktBbmltYXRpb25BZHZpY2UgbV9zaG93QW5pbWF0aW9ucyA6IDI7Ci0gICAgICAg
IEtIVE1MUGFydCogbV9wYXJ0OwotICAgICAgICBET006OkRvY3VtZW50SW1wbCAqbV9kb2M7Ci0g
ICAgICAgIGJvb2wgbV9sb2FkSW5Qcm9ncmVzczsKLSAgICB9OwotCi0gICAgLyoqCi0gICAgICog
QGludGVybmFsCi0gICAgICovCi0gICAgY2xhc3MgUmVxdWVzdAotICAgIHsKLSAgICBwdWJsaWM6
Ci0JUmVxdWVzdChEb2NMb2FkZXIqIGRsLCBDYWNoZWRPYmplY3QgKl9vYmplY3QsIGJvb2wgX2lu
Y3JlbWVudGFsKTsKLQl+UmVxdWVzdCgpOwotCWJvb2wgaW5jcmVtZW50YWw7Ci0JUUJ1ZmZlciBt
X2J1ZmZlcjsKLQlDYWNoZWRPYmplY3QgKm9iamVjdDsKLSAgICAgICAgRG9jTG9hZGVyKiBtX2Rv
Y0xvYWRlcjsKLSAgICAgICAgYm9vbCBtdWx0aXBhcnQ7Ci0gICAgIH07Ci0KLSAgICAvKioKLSAg
ICAgKiBAaW50ZXJuYWwKLSAgICAgKi8KLSAgICBjbGFzcyBMb2FkZXIgOiBwdWJsaWMgUU9iamVj
dAotICAgIHsKLQlRX09CSkVDVAotCi0gICAgcHVibGljOgkKLQlMb2FkZXIoKTsKLQl+TG9hZGVy
KCk7Ci0KLQl2b2lkIGxvYWQoRG9jTG9hZGVyKiBkbCwgQ2FjaGVkT2JqZWN0ICpvYmplY3QsIGJv
b2wgaW5jcmVtZW50YWwgPSB0cnVlKTsKLQotICAgICAgICBpbnQgbnVtUmVxdWVzdHMoIERvY0xv
YWRlciogZGwgKSBjb25zdDsKLSAgICAgICAgdm9pZCBjYW5jZWxSZXF1ZXN0cyggRG9jTG9hZGVy
KiBkbCApOwotCi0Jdm9pZCByZW1vdmVCYWNrZ3JvdW5kRGVjb2RpbmdSZXF1ZXN0IChSZXF1ZXN0
ICpyKTsKLQkKLSAgICAgICAgLy8gbWF5IHJldHVybiAwTAotICAgICAgICBLSU86OkpvYiAqam9i
Rm9yUmVxdWVzdCggY29uc3QgRE9NOjpET01TdHJpbmcgJnVybCApIGNvbnN0OwotCi0gICAgICAg
IEtXUUxvYWRlciAqa3dxOwotCi0gICAgc2lnbmFsczoKLQlmcmllbmQgY2xhc3MgQ2FjaGVkSW1h
Z2VDYWxsYmFjazsKLQotICAgICAgICB2b2lkIHJlcXVlc3RTdGFydGVkKCBraHRtbDo6RG9jTG9h
ZGVyKiBkbCwga2h0bWw6OkNhY2hlZE9iamVjdCogb2JqICk7Ci0Jdm9pZCByZXF1ZXN0RG9uZSgg
a2h0bWw6OkRvY0xvYWRlciogZGwsIGtodG1sOjpDYWNoZWRPYmplY3QgKm9iaiApOwotCXZvaWQg
cmVxdWVzdEZhaWxlZCgga2h0bWw6OkRvY0xvYWRlciogZGwsIGtodG1sOjpDYWNoZWRPYmplY3Qg
Km9iaiApOwotCi0gICAgcHJvdGVjdGVkIHNsb3RzOgotICAgICAgICB2b2lkIHNsb3RGaW5pc2hl
ZCggS0lPOjpKb2IgKiAsIE5TRGF0YSAqYWxsRGF0YSk7Ci0Jdm9pZCBzbG90RGF0YSggS0lPOjpK
b2IgKiwgY29uc3QgY2hhciAqZGF0YSwgaW50IHNpemUgKTsKLSAgICAgICAgdm9pZCBzbG90UmVj
ZWl2ZWRSZXNwb25zZSAoIEtJTzo6Sm9iICosIE5TVVJMUmVzcG9uc2UgKnJlc3BvbnNlICk7Ci0K
LSAgICBwcml2YXRlOgotCXZvaWQgc2VydmVQZW5kaW5nUmVxdWVzdHMoKTsKLQotICAgICAgICB2
aXJ0dWFsIGJvb2wgaXNLSFRNTExvYWRlcigpIGNvbnN0OwotCi0JUVB0ckxpc3Q8UmVxdWVzdD4g
bV9yZXF1ZXN0c1BlbmRpbmc7Ci0JUVB0ckRpY3Q8UmVxdWVzdD4gbV9yZXF1ZXN0c0xvYWRpbmc7
Ci0KLQlRUHRyTGlzdDxSZXF1ZXN0PiBtX3JlcXVlc3RzQmFja2dyb3VuZERlY29kaW5nOwotCi0j
aWZkZWYgSEFWRV9MSUJKUEVHCi0gICAgICAgIEtKUEVHRm9ybWF0VHlwZSBtX2pwZWdsb2FkZXI7
Ci0jZW5kaWYKLSAgICB9OwotCi0gICAgICAgIC8qKgotICAgICAqIEBpbnRlcm5hbAotICAgICAq
Ci0gICAgICogUHJvdmlkZXMgYSBjYWNoZS9sb2FkZXIgZm9yIG9iamVjdHMgbmVlZGVkIGZvciBk
aXNwbGF5aW5nIHRoZSBodG1sIHBhZ2UuCi0gICAgICogQXQgdGhlIG1vbWVudCB0aGVzZSBhcmUg
c3R5bGVzaGVldHMsIHNjcmlwdHMgYW5kIGltYWdlcwotICAgICAqLwotICAgIGNsYXNzIENhY2hl
Ci0gICAgewotCWZyaWVuZCBjbGFzcyBEb2NMb2FkZXI7Ci0gICAgcHVibGljOgotCS8qKgotCSAq
IGluaXQgdGhlIGNhY2hlIGluIGNhc2UgaXQncyBub3QgYWxyZWFkeS4gVGhpcyBuZWVkcyB0byBn
ZXQgY2FsbGVkIG9uY2UKLQkgKiBiZWZvcmUgdXNpbmcgaXQuCi0JICovCi0Jc3RhdGljIHZvaWQg
aW5pdCgpOwotICAgICAgICAKLQkvKioKLQkgKiBBc2sgdGhlIGNhY2hlIGZvciBzb21lIHVybC4g
V2lsbCByZXR1cm4gYSBjYWNoZWRPYmplY3QsIGFuZAotCSAqIGxvYWQgdGhlIHJlcXVlc3RlZCBk
YXRhIGluIGNhc2UgaXQncyBub3QgY2FoY2VkCi0gICAgICAgICAqIGlmIHRoZSBEb2NMb2FkZXIg
aXMgemVybywgdGhlIHVybCBtdXN0IGJlIGZ1bGwtcXVhbGlmaWVkLgotICAgICAgICAgKiBPdGhl
cndpc2UsIGl0IGlzIGF1dG9tYXRpY2FsbHkgYmFzZS11cmwgZXhwYW5kZWQKLQkgKi8KLQlzdGF0
aWMgQ2FjaGVkSW1hZ2UgKnJlcXVlc3RJbWFnZSggRG9jTG9hZGVyKiBsLCBjb25zdCBET006OkRP
TVN0cmluZyAmdXJsLCBib29sIHJlbG9hZD1mYWxzZSwgdGltZV90IF9leHBpcmVEYXRlPTApOwot
ICAgICAgICBzdGF0aWMgQ2FjaGVkSW1hZ2UgKnJlcXVlc3RJbWFnZSggRG9jTG9hZGVyKiBsLCBj
b25zdCBLVVJMICZ1cmwsIGJvb2wgcmVsb2FkPWZhbHNlLCB0aW1lX3QgX2V4cGlyZURhdGU9MCk7
Ci0KLQkvKioKLQkgKiBBc2sgdGhlIGNhY2hlIGZvciBzb21lIHVybC4gV2lsbCByZXR1cm4gYSBj
YWNoZWRPYmplY3QsIGFuZAotCSAqIGxvYWQgdGhlIHJlcXVlc3RlZCBkYXRhIGluIGNhc2UgaXQn
cyBub3QgY2FjaGVkCi0JICovCi0Jc3RhdGljIENhY2hlZENTU1N0eWxlU2hlZXQgKnJlcXVlc3RT
dHlsZVNoZWV0KCBEb2NMb2FkZXIqIGwsIGNvbnN0IERPTTo6RE9NU3RyaW5nICZ1cmwsIGJvb2wg
cmVsb2FkPWZhbHNlLCB0aW1lX3QgX2V4cGlyZURhdGU9MCwgY29uc3QgUVN0cmluZyYgY2hhcnNl
dCA9IFFTdHJpbmc6Om51bGwpOwotCi0jaWZkZWYgS0hUTUxfWFNMVAotICAgICAgICAvLyBBc2sg
dGhlIGNhY2hlIGZvciBhbiBYU0wgc3R5bGVzaGVldC4KLSAgICAgICAgc3RhdGljIENhY2hlZFhT
TFN0eWxlU2hlZXQqIHJlcXVlc3RYU0xTdHlsZVNoZWV0KERvY0xvYWRlciogbCwgY29uc3QgRE9N
OjpET01TdHJpbmcgJnVybCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBib29sIHJlbG9hZD1mYWxzZSwgdGltZV90IF9leHBpcmVEYXRl
PTApOwotI2VuZGlmCi0jaWZuZGVmIEtIVE1MX05PX1hCTAotICAgICAgICAvLyBBc2sgdGhlIGNh
Y2hlIGZvciBhbiBYQkwgZG9jdW1lbnQuCi0gICAgICAgIHN0YXRpYyBDYWNoZWRYQkxEb2N1bWVu
dCogcmVxdWVzdFhCTERvY3VtZW50KERvY0xvYWRlciogbCwgY29uc3QgRE9NOjpET01TdHJpbmcg
JnVybCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGJvb2wgcmVsb2FkPWZhbHNlLCB0aW1lX3QgX2V4cGlyZURhdGU9MCk7Ci0jZW5kaWYKLQot
ICAgICAgICAvKioKLSAgICAgICAgICogUHJlLWxvYWRzIGEgc3R5bGVzaGVldCBpbnRvIHRoZSBj
YWNoZS4KLSAgICAgICAgICovCi0gICAgICAgIHN0YXRpYyB2b2lkIHByZWxvYWRTdHlsZVNoZWV0
KGNvbnN0IFFTdHJpbmcgJnVybCwgY29uc3QgUVN0cmluZyAmc3R5bGVzaGVldF9kYXRhKTsKLQot
CS8qKgotCSAqIEFzayB0aGUgY2FjaGUgZm9yIHNvbWUgdXJsLiBXaWxsIHJldHVybiBhIGNhY2hl
ZE9iamVjdCwgYW5kCi0JICogbG9hZCB0aGUgcmVxdWVzdGVkIGRhdGEgaW4gY2FzZSBpdCdzIG5v
dCBjYWhjZWQKLQkgKi8KLQlzdGF0aWMgQ2FjaGVkU2NyaXB0ICpyZXF1ZXN0U2NyaXB0KCBEb2NM
b2FkZXIqIGwsIGNvbnN0IERPTTo6RE9NU3RyaW5nICZ1cmwsIGJvb2wgcmVsb2FkPWZhbHNlLCB0
aW1lX3QgX2V4cGlyZURhdGU9MCwgY29uc3QgUVN0cmluZyYgY2hhcnNldD1RU3RyaW5nOjpudWxs
KTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogUHJlLWxvYWRzIGEgc2NyaXB0IGludG8gdGhl
IGNhY2hlLgotICAgICAgICAgKi8KLSAgICAgICAgc3RhdGljIHZvaWQgcHJlbG9hZFNjcmlwdChj
b25zdCBRU3RyaW5nICZ1cmwsIGNvbnN0IFFTdHJpbmcgJnNjcmlwdF9kYXRhKTsKLQotCS8qKgot
CSAqIHNldHMgdGhlIHNpemUgb2YgdGhlIGNhY2hlLiBUaGlzIHdpbGwgb25seSBob2QgYXBwcm94
aW1hdGVseSwgc2luY2UgdGhlIHNpemUgc29tZQotCSAqIGNhY2hlZCBvYmplY3RzIChsaWtlIHN0
eWxlc2hlZXRzKSB0YWtlIHVwIGluIG1lbW9yeSBpcyBub3QgZXhhY2x0eSBrbm93bi4KLQkgKi8K
LQlzdGF0aWMgdm9pZCBzZXRTaXplKCBpbnQgYnl0ZXMgKTsKLQkvKioKLQkgKiByZXR1cm5zIHRo
ZSBzaXplIG9mIHRoZSBjYWNoZQotCSAqLwotCXN0YXRpYyBpbnQgc2l6ZSgpIHsgcmV0dXJuIG1h
eFNpemU7IH07Ci0KLSAgICAgICAgc3RhdGljIGludCBtYXhDYWNoZWFibGVPYmplY3RTaXplKCkg
eyByZXR1cm4gbWF4Q2FjaGVhYmxlOyB9Ci0KLQkvKioKLQkgKiBjbGVhbiB1cCBjYWNoZQotCSAq
LwotCXN0YXRpYyB2b2lkIGZsdXNoKGJvb2wgZm9yY2U9ZmFsc2UpOwotCi0JLyoqCi0JICogY2xl
YXJzIHRoZSBjYWNoZQotCSAqIFdhcm5pbmc6IGNhbGwgdGhpcyBvbmx5IGF0IHRoZSBlbmQgb2Yg
eW91ciBwcm9ncmFtLCB0byBjbGVhbgotCSAqIHVwIG1lbW9yeSAodXNlZnVsIGZvciBmaW5kaW5n
IG1lbW9yeSBob2xlcykKLQkgKi8KLQlzdGF0aWMgdm9pZCBjbGVhcigpOwotCi0Jc3RhdGljIExv
YWRlciAqbG9hZGVyKCkgeyByZXR1cm4gbV9sb2FkZXI7IH0KLQotICAgIAlzdGF0aWMgUVBpeG1h
cCAqbnVsbFBpeG1hcDsKLSAgICAgICAgc3RhdGljIFFQaXhtYXAgKmJyb2tlblBpeG1hcDsKLQot
ICAgICAgICBzdGF0aWMgdm9pZCByZW1vdmVDYWNoZUVudHJ5KCBDYWNoZWRPYmplY3QgKm9iamVj
dCApOwotCi0gICAgICAgIHN0cnVjdCBUeXBlU3RhdGlzdGljIHsKLSAgICAgICAgICAgIGludCBj
b3VudDsKLSAgICAgICAgICAgIGludCBzaXplOwotICAgICAgICAgICAgVHlwZVN0YXRpc3RpYygp
IDogY291bnQoMCksIHNpemUoMCkgeyB9Ci0gICAgICAgIH07Ci0gICAgICAgIAotICAgICAgICBz
dHJ1Y3QgU3RhdGlzdGljcyB7Ci0gICAgICAgICAgICBUeXBlU3RhdGlzdGljIGltYWdlczsKLSAg
ICAgICAgICAgIFR5cGVTdGF0aXN0aWMgbW92aWVzOwotICAgICAgICAgICAgVHlwZVN0YXRpc3Rp
YyBzdHlsZVNoZWV0czsKLSAgICAgICAgICAgIFR5cGVTdGF0aXN0aWMgc2NyaXB0czsKLSNpZmRl
ZiBLSFRNTF9YU0xUCi0gICAgICAgICAgICBUeXBlU3RhdGlzdGljIHhzbFN0eWxlU2hlZXRzOwot
I2VuZGlmCi0jaWZuZGVmIEtIVE1MX05PX1hCTAotICAgICAgICAgICAgVHlwZVN0YXRpc3RpYyB4
YmxEb2NzOwotI2VuZGlmCi0gICAgICAgICAgICBUeXBlU3RhdGlzdGljIG90aGVyOwotICAgICAg
ICB9OwotCi0gICAgICAgIHN0YXRpYyBTdGF0aXN0aWNzIGdldFN0YXRpc3RpY3MoKTsKLSAgICAg
ICAgc3RhdGljIHZvaWQgZmx1c2hBbGwoKTsKLSAgICAgICAgc3RhdGljIHZvaWQgc2V0Q2FjaGVE
aXNhYmxlZChib29sKTsKLQotICAgICAgICBzdGF0aWMgdm9pZCBpbnNlcnRJbkxSVUxpc3QoQ2Fj
aGVkT2JqZWN0ICopOwotICAgICAgICBzdGF0aWMgdm9pZCByZW1vdmVGcm9tTFJVTGlzdChDYWNo
ZWRPYmplY3QgKik7Ci0gICAgICAgIHN0YXRpYyBib29sIGFkanVzdFNpemUoQ2FjaGVkT2JqZWN0
ICosIGludCBzaXplRGVsdGEpOwotICAgICAgICAKLSAgICAgICAgc3RhdGljIExSVUxpc3QqIGdl
dExSVUxpc3RGb3IoQ2FjaGVkT2JqZWN0KiBvKTsKLSAgICAgICAgCi0gICAgICAgIHN0YXRpYyB2
b2lkIGNoZWNrTFJVQW5kVW5jYWNoZWFibGVMaXN0SW50ZWdyaXR5KCk7Ci0KLSAgICBwcm90ZWN0
ZWQ6Ci0gICAgICAgIHN0YXRpYyBRRGljdDxDYWNoZWRPYmplY3Q+ICpjYWNoZTsKLSAgICAgICAg
c3RhdGljIFFQdHJMaXN0PERvY0xvYWRlcj4qIGRvY2xvYWRlcjsKLSAgICAKLSAgICAgICAgc3Rh
dGljIGludCBtYXhTaXplOwotICAgICAgICBzdGF0aWMgaW50IG1heENhY2hlYWJsZTsKLSAgICAg
ICAgc3RhdGljIGludCBmbHVzaENvdW50OwotICAgIAotICAgICAgICBzdGF0aWMgTG9hZGVyICpt
X2xvYWRlcjsKLSAgICAKLSAgICAgICAgc3RhdGljIHZvaWQgbW92ZVRvSGVhZE9mTFJVTGlzdChD
YWNoZWRPYmplY3QgKik7Ci0gICAgCi0gICAgICAgIHN0YXRpYyBMUlVMaXN0ICptX0xSVUxpc3Rz
OwotICAgICAgICBzdGF0aWMgaW50IG1fdG90YWxTaXplT2ZMUlVMaXN0czsKLSAgICAgICAgICAg
IAotICAgICAgICBzdGF0aWMgQ2FjaGVkT2JqZWN0ICptX2hlYWRPZlVuY2FjaGVhYmxlTGlzdDsK
LSAgICAgICAgICAgIAotICAgICAgICBzdGF0aWMgaW50IG1fY291bnRPZkxSVUFuZFVuY2FjaGVh
YmxlTGlzdHM7Ci0gICAgfTsKLQogfTsKIAogI2VuZGlmCkluZGV4OiBtaXNjL0NhY2hlZEltYWdl
LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gbWlzYy9DYWNoZWRJbWFnZS5oCShyZXZpc2lvbiAxMTk0OCkKKysr
IG1pc2MvQ2FjaGVkSW1hZ2UuaAkod29ya2luZyBjb3B5KQpAQCAtMjMsMzE3ICsyMywyNyBAQAog
ICAgIFRoaXMgY2xhc3MgcHJvdmlkZXMgYWxsIGZ1bmN0aW9uYWxpdHkgbmVlZGVkIGZvciBsb2Fk
aW5nIGltYWdlcywgc3R5bGUgc2hlZXRzIGFuZCBodG1sCiAgICAgcGFnZXMgZnJvbSB0aGUgd2Vi
LiBJdCBoYXMgYSBtZW1vcnkgY2FjaGUgZm9yIHRoZXNlIG9iamVjdHMuCiAqLwotI2lmbmRlZiBf
a2h0bWxfbG9hZGVyX2gKLSNkZWZpbmUgX2todG1sX2xvYWRlcl9oCiAKLSNpZmRlZiBIQVZFX0NP
TkZJR19ICi0jaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHRpbWUuaD4K
KyNpZm5kZWYgS0hUTUxfQ2FjaGVkSW1hZ2VfaAorI2RlZmluZSBLSFRNTF9DYWNoZWRJbWFnZV9o
CiAKLSNpbmNsdWRlICJsb2FkZXJfY2xpZW50LmgiCi0jaWZkZWYgSEFWRV9MSUJKUEVHCi0jaW5j
bHVkZSAibG9hZGVyX2pwZWcuaCIKLSNlbmRpZgorI2luY2x1ZGUgIkNhY2hlZE9iamVjdC5oIgog
Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8cXB0cmxpc3QuaD4KICNpbmNsdWRlIDxx
b2JqZWN0Lmg+Ci0jaW5jbHVkZSA8cXB0cmRpY3QuaD4KLSNpbmNsdWRlIDxxZGljdC5oPgogI2lu
Y2x1ZGUgPHFwaXhtYXAuaD4KICNpbmNsdWRlIDxxYnVmZmVyLmg+Ci0jaW5jbHVkZSA8cXN0cmlu
Z2xpc3QuaD4KLSNpbmNsdWRlIDxxdGV4dGNvZGVjLmg+CiAKLSNpbmNsdWRlIDxrdXJsLmg+CiAj
aW5jbHVkZSA8a2lvL2dsb2JhbC5oPgogCi0jaW5jbHVkZSA8a2h0bWxfc2V0dGluZ3MuaD4KLSNp
bmNsdWRlIDxkb20vZG9tX3N0cmluZy5oPgotI2luY2x1ZGUgIkRvY1B0ci5oIgotCi1jbGFzcyBL
SFRNTFBhcnQ7Ci0KLW5hbWVzcGFjZSBLSU8gewotICBjbGFzcyBKb2I7Ci0gIGNsYXNzIFRyYW5z
ZmVySm9iOwotfQotCi1uYW1lc3BhY2UgRE9NCi17Ci0gICAgY2xhc3MgQ1NTU3R5bGVTaGVldElt
cGw7Ci0gICAgY2xhc3MgRG9jdW1lbnRJbXBsOwotfTsKLQotCi1jbGFzcyBLV1FMb2FkZXI7Ci0K
LSNpZiBfX09CSkNfXwotQGNsYXNzIE5TRGF0YTsKLUBjbGFzcyBOU1VSTFJlc3BvbnNlOwotI2Vs
c2UKLWNsYXNzIE5TRGF0YTsKLWNsYXNzIE5TVVJMUmVzcG9uc2U7Ci0jZW5kaWYKLQotCiBuYW1l
c3BhY2Uga2h0bWwKIHsKLSAgICBjbGFzcyBDYWNoZWRPYmplY3Q7Ci0gICAgY2xhc3MgUmVxdWVz
dDsKICAgICBjbGFzcyBEb2NMb2FkZXI7Ci0gICAgY2xhc3MgRGVjb2RlcjsKLQotICNkZWZpbmUg
TUFYX0xSVV9MSVNUUyAyMAotICAgIAotICAgIHN0cnVjdCBMUlVMaXN0IHsKLSAgICAgICAgQ2Fj
aGVkT2JqZWN0KiBtX2hlYWQ7Ci0gICAgICAgIENhY2hlZE9iamVjdCogbV90YWlsOwotICAgIAot
ICAgICAgICBMUlVMaXN0KCk7Ci0gICAgICAgIH5MUlVMaXN0KCk7Ci0gICAgfTsKLSAgICAKLSAg
ICAvKioKLSAgICAgKiBAaW50ZXJuYWwKLSAgICAgKgotICAgICAqIEEgY2FjaGVkIG9iamVjdC4g
Q2xhc3NlcyB3aG8gd2FudCB0byB1c2UgdGhpcyBvYmplY3Qgc2hvdWxkIGRlcml2ZQotICAgICAq
IGZyb20gQ2FjaGVkT2JqZWN0Q2xpZW50LCB0byBnZXQgdGhlIGZ1bmN0aW9uIGNhbGxzIGluIGNh
c2UgdGhlIHJlcXVlc3RlZCBkYXRhIGhhcyBhcnJpdmVkLgotICAgICAqCi0gICAgICogVGhpcyBj
bGFzcyBhbHNvIGRvZXMgdGhlIGFjdHVhbCBjb21tdW5pY2F0aW9uIHdpdGgga2lvIGFuZCBsb2Fk
cyB0aGUgZmlsZS4KLSAgICAgKi8KLSAgICBjbGFzcyBDYWNoZWRPYmplY3QKLSAgICB7Ci0gICAg
cHVibGljOgotCWVudW0gVHlwZSB7Ci0JICAgIEltYWdlLAotCSAgICBDU1NTdHlsZVNoZWV0LAot
CSAgICBTY3JpcHQKLSNpZmRlZiBLSFRNTF9YU0xUCi0gICAgICAgICAgICAsIFhTTFN0eWxlU2hl
ZXQKLSNlbmRpZgotI2lmbmRlZiBLSFRNTF9OT19YQkwKLSAgICAgICAgICAgICwgWEJMCi0jZW5k
aWYKLQl9OwotCi0JZW51bSBTdGF0dXMgewotCSAgICBOb3RDYWNoZWQsICAgIC8vIHRoaXMgVVJM
IGlzIG5vdCBjYWNoZWQKLQkgICAgVW5rbm93biwgICAgICAvLyBsZXQgaW1hZ2VjYWNoZSBkZWNp
ZGUgd2hhdCB0byBkbyB3aXRoIGl0Ci0JICAgIE5ldywgICAgICAgICAgLy8gaW5zZXJ0aW5nIG5l
dyBpbWFnZQotICAgICAgICBQZW5kaW5nLCAgICAgIC8vIG9ubHkgcGFydGlhbGx5IGxvYWRlZAot
CSAgICBQZXJzaXN0ZW50LCAgIC8vIG5ldmVyIGRlbGV0ZSB0aGlzIHBpeG1hcAotCSAgICBDYWNo
ZWQsICAgICAgIC8vIHJlZ3VsYXIgY2FzZQotCSAgICBVbmNhY2hlYWJsZSAgIC8vIHRvbyBiaWcg
dG8gYmUgY2FjaGVkLAotCX07ICAJICAgICAgICAgIC8vIHdpbGwgYmUgZGVzdHJveWVkIGFzIHNv
b24gYXMgcG9zc2libGUKLQotCUNhY2hlZE9iamVjdChjb25zdCBET006OkRPTVN0cmluZyAmdXJs
LCBUeXBlIHR5cGUsIEtJTzo6Q2FjaGVDb250cm9sIF9jYWNoZVBvbGljeSwgdGltZV90IF9leHBp
cmVEYXRlLCBpbnQgc2l6ZSA9IDApCi0JewotCSAgICBtX3VybCA9IHVybDsKLQkgICAgbV90eXBl
ID0gdHlwZTsKLQkgICAgbV9zdGF0dXMgPSBQZW5kaW5nOwotCSAgICBtX3NpemUgPSBzaXplOwot
CSAgICBtX2ZyZWUgPSBmYWxzZTsKLQkgICAgbV9jYWNoZVBvbGljeSA9IF9jYWNoZVBvbGljeTsK
LQkgICAgbV9yZXF1ZXN0ID0gMDsKLSAgICAgICAgbV9yZXNwb25zZSA9IDA7Ci0gICAgICAgIG1f
YWxsRGF0YSA9IDA7Ci0JICAgIG1fZXhwaXJlRGF0ZSA9IF9leHBpcmVEYXRlOwotICAgICAgICBt
X2RlbGV0ZWQgPSBmYWxzZTsKLSAgICAgICAgbV9leHBpcmVEYXRlQ2hhbmdlZCA9IGZhbHNlOwot
ICAgICAgICAKLSAgICAgICAgbV9hY2Nlc3NDb3VudCA9IDA7Ci0gICAgICAgIAotICAgICAgICBt
X25leHRJbkxSVUxpc3QgPSAwOwotICAgICAgICBtX3ByZXZJbkxSVUxpc3QgPSAwOwotCX0KLQl2
aXJ0dWFsIH5DYWNoZWRPYmplY3QoKTsKLQotCXZpcnR1YWwgdm9pZCBzZXRDaGFyc2V0KCBjb25z
dCBRU3RyaW5nICZjaHMgKSB7fQotCXZpcnR1YWwgdm9pZCBkYXRhKCBRQnVmZmVyICZidWZmZXIs
IGJvb2wgZW9mKSA9IDA7Ci0JdmlydHVhbCB2b2lkIGVycm9yKCBpbnQgZXJyLCBjb25zdCBjaGFy
ICp0ZXh0ICkgPSAwOwotCi0JY29uc3QgRE9NOjpET01TdHJpbmcgJnVybCgpIGNvbnN0IHsgcmV0
dXJuIG1fdXJsOyB9Ci0JVHlwZSB0eXBlKCkgY29uc3QgeyByZXR1cm4gbV90eXBlOyB9Ci0KLQl2
aXJ0dWFsIHZvaWQgcmVmKENhY2hlZE9iamVjdENsaWVudCAqY29uc3VtZXIpOwotCXZpcnR1YWwg
dm9pZCBkZXJlZihDYWNoZWRPYmplY3RDbGllbnQgKmNvbnN1bWVyKTsKLQotCWludCBjb3VudCgp
IGNvbnN0IHsgcmV0dXJuIG1fY2xpZW50cy5jb3VudCgpOyB9Ci0KLQlTdGF0dXMgc3RhdHVzKCkg
Y29uc3QgeyByZXR1cm4gbV9zdGF0dXM7IH0KLQotCWludCBzaXplKCkgY29uc3QgeyByZXR1cm4g
bV9zaXplOyB9Ci0KLSAgICAgICAgYm9vbCBpc0xvYWRlZCgpIGNvbnN0IHsgcmV0dXJuICFtX2xv
YWRpbmc7IH0KLSAgICAgICAgCi0gICAgICAgIHZpcnR1YWwgYm9vbCBpc0ltYWdlKCkgY29uc3Qg
eyByZXR1cm4gZmFsc2U7IH0KLQotICAgIGludCBhY2Nlc3NDb3VudCgpIGNvbnN0IHsgcmV0dXJu
IG1fYWNjZXNzQ291bnQ7IH0KLSAgICB2b2lkIGluY3JlYXNlQWNjZXNzQ291bnQoKSB7IG1fYWNj
ZXNzQ291bnQrKzsgfQotICAgIAotCS8qKgotCSAqIGNvbXB1dGVzIHRoZSBzdGF0dXMgb2YgYW4g
b2JqZWN0IGFmdGVyIGxvYWRpbmcuCi0JICogdGhlIHJlc3VsdCBkZXBlbmRzIG9uIHRoZSBvYmpl
Y3RzIHNpemUgYW5kIHRoZSBzaXplIG9mIHRoZSBjYWNoZQotCSAqIGFsc28gdXBkYXRlcyB0aGUg
ZXhwaXJlIGRhdGUgb24gdGhlIGNhY2hlIGVudHJ5IGZpbGUKLQkgKi8KLQl2b2lkIGZpbmlzaCgp
OwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgYnkgdGhlIGNhY2hlIGlmIHRoZSBv
YmplY3QgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBjYWNoZSBkaWN0Ci0gICAgICAgICAqIHdo
aWxlIHN0aWxsIGJlaW5nIHJlZmVyZW5jZWQuIFRoaXMgbWVhbnMgdGhlIG9iamVjdCBzaG91bGQg
a2lsbCBpdHNlbGYKLSAgICAgICAgICogaWYgaXRzIHJlZmVyZW5jZSBjb3VudGVyIGRyb3BzIGRv
d24gdG8gemVyby4KLSAgICAgICAgICovCi0gICAgICAgIHZvaWQgc2V0RnJlZSggYm9vbCBiICkg
eyBtX2ZyZWUgPSBiOyB9Ci0KLSAgICAgICAgS0lPOjpDYWNoZUNvbnRyb2wgY2FjaGVQb2xpY3ko
KSBjb25zdCB7IHJldHVybiBtX2NhY2hlUG9saWN5OyB9Ci0KLSAgICAgICAgdm9pZCBzZXRSZXF1
ZXN0KFJlcXVlc3QgKl9yZXF1ZXN0KTsKLQotICAgICAgICBOU1VSTFJlc3BvbnNlICpyZXNwb25z
ZSgpIGNvbnN0IHsgcmV0dXJuIG1fcmVzcG9uc2U7IH0KLSAgICAgICAgdm9pZCBzZXRSZXNwb25z
ZShOU1VSTFJlc3BvbnNlICpyZXNwb25zZSk7Ci0gICAgICAgIE5TRGF0YSAqYWxsRGF0YSgpIGNv
bnN0IHsgcmV0dXJuIG1fYWxsRGF0YTsgfQotICAgICAgICB2b2lkIHNldEFsbERhdGEgKE5TRGF0
YSAqZGF0YSk7Ci0KLSAgICAgICAgYm9vbCBjYW5EZWxldGUoKSBjb25zdCB7IHJldHVybiAobV9j
bGllbnRzLmNvdW50KCkgPT0gMCAmJiAhbV9yZXF1ZXN0KTsgfQotCi0Jdm9pZCBzZXRFeHBpcmVE
YXRlKHRpbWVfdCBfZXhwaXJlRGF0ZSwgYm9vbCBjaGFuZ2VIdHRwQ2FjaGUpOwotCQotCWJvb2wg
aXNFeHBpcmVkKCkgY29uc3Q7Ci0KLSAgICAgICAgdmlydHVhbCBib29sIHNjaGVkdWxlKCkgY29u
c3QgeyByZXR1cm4gZmFsc2U7IH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogTGlzdCBvZiBh
Y2NlcHRhYmxlIG1pbWV0eXBlcyBzZXBlcmF0ZWQgYnkgIiwiLiBBIG1pbWV0eXBlIG1heSBjb250
YWluIGEgd2lsZGNhcmQuCi0gICAgICAgICAqLwotICAgICAgICAvLyBlLmcuICJ0ZXh0LyoiCi0g
ICAgICAgIFFTdHJpbmcgYWNjZXB0KCkgY29uc3QgeyByZXR1cm4gbV9hY2NlcHQ7IH0KLSAgICAg
ICAgdm9pZCBzZXRBY2NlcHQoY29uc3QgUVN0cmluZyAmX2FjY2VwdCkgeyBtX2FjY2VwdCA9IF9h
Y2NlcHQ7IH0KLQotICAgIHByb3RlY3RlZDoKLSAgICAgICAgdm9pZCBzZXRTaXplKGludCBzaXpl
KTsKLSAgICAgICAgCi0gICAgICAgIFFQdHJEaWN0PENhY2hlZE9iamVjdENsaWVudD4gbV9jbGll
bnRzOwotCi0JRE9NOjpET01TdHJpbmcgbV91cmw7Ci0gICAgICAgIFFTdHJpbmcgbV9hY2NlcHQ7
Ci0gICAgICAgIFJlcXVlc3QgKm1fcmVxdWVzdDsKLSAgICAgICAgTlNVUkxSZXNwb25zZSAqbV9y
ZXNwb25zZTsKLSAgICAgICAgTlNEYXRhICptX2FsbERhdGE7Ci0JVHlwZSBtX3R5cGU7Ci0JU3Rh
dHVzIG1fc3RhdHVzOwotICAgIHByaXZhdGU6Ci0JaW50IG1fc2l6ZTsKLSAgICBpbnQgbV9hY2Nl
c3NDb3VudDsKLSAgICAKLSAgICBwcm90ZWN0ZWQ6Ci0JdGltZV90IG1fZXhwaXJlRGF0ZTsKLQlL
SU86OkNhY2hlQ29udHJvbCBtX2NhY2hlUG9saWN5OwotICAgICAgICBib29sIG1fZnJlZSA6IDE7
Ci0gICAgICAgIGJvb2wgbV9kZWxldGVkIDogMTsKLSAgICAgICAgYm9vbCBtX2xvYWRpbmcgOiAx
OwotICAgICAgICBib29sIG1fZXhwaXJlRGF0ZUNoYW5nZWQgOiAxOwotICAgIAotICAgIHByaXZh
dGU6Ci0gICAgICAgIGJvb2wgYWxsb3dJbkxSVUxpc3QoKSB7IHJldHVybiBjYW5EZWxldGUoKSAm
JiBzdGF0dXMoKSAhPSBQZXJzaXN0ZW50OyB9Ci0gICAgICAgIAotICAgICAgICBDYWNoZWRPYmpl
Y3QgKm1fbmV4dEluTFJVTGlzdDsKLSAgICAgICAgQ2FjaGVkT2JqZWN0ICptX3ByZXZJbkxSVUxp
c3Q7Ci0gICAgICAgIGZyaWVuZCBjbGFzcyBDYWNoZTsKLSAgICB9OworICAgIGNsYXNzIENhY2hl
ZEltYWdlQ2FsbGJhY2s7CisgICAgY2xhc3MgQ2FjaGU7CisgICAgY2xhc3MgQ2FjaGVkT2JqZWN0
Q2xpZW50OwogCi0KLSAgICAvKioKLSAgICAgKiBhIGNhY2hlZCBzdHlsZSBzaGVldAotICAgICAq
LwotICAgIGNsYXNzIENhY2hlZENTU1N0eWxlU2hlZXQgOiBwdWJsaWMgQ2FjaGVkT2JqZWN0Ci0g
ICAgewotICAgIHB1YmxpYzoKLQlDYWNoZWRDU1NTdHlsZVNoZWV0KERvY0xvYWRlciogZGwsIGNv
bnN0IERPTTo6RE9NU3RyaW5nICZ1cmwsIEtJTzo6Q2FjaGVDb250cm9sIGNhY2hlUG9saWN5LCB0
aW1lX3QgX2V4cGlyZURhdGUsIGNvbnN0IFFTdHJpbmcmIGNoYXJzZXQpOwotCUNhY2hlZENTU1N0
eWxlU2hlZXQoY29uc3QgRE9NOjpET01TdHJpbmcgJnVybCwgY29uc3QgUVN0cmluZyAmc3R5bGVz
aGVldF9kYXRhKTsKLQl2aXJ0dWFsIH5DYWNoZWRDU1NTdHlsZVNoZWV0KCk7Ci0KLQljb25zdCBE
T006OkRPTVN0cmluZyAmc2hlZXQoKSBjb25zdCB7IHJldHVybiBtX3NoZWV0OyB9Ci0KLQl2aXJ0
dWFsIHZvaWQgcmVmKENhY2hlZE9iamVjdENsaWVudCAqY29uc3VtZXIpOwotCXZpcnR1YWwgdm9p
ZCBkZXJlZihDYWNoZWRPYmplY3RDbGllbnQgKmNvbnN1bWVyKTsKLQotICAgICAgICB2aXJ0dWFs
IHZvaWQgc2V0Q2hhcnNldCggY29uc3QgUVN0cmluZyAmY2hzICk7Ci0gICAgICAgIHZpcnR1YWwg
dm9pZCBkYXRhKCBRQnVmZmVyICZidWZmZXIsIGJvb2wgZW9mICk7Ci0JdmlydHVhbCB2b2lkIGVy
cm9yKCBpbnQgZXJyLCBjb25zdCBjaGFyICp0ZXh0ICk7Ci0KLSAgICAgICAgdmlydHVhbCBib29s
IHNjaGVkdWxlKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotCi0Jdm9pZCBjaGVja05vdGlmeSgp
OwotCi0gICAgcHJvdGVjdGVkOgotCURPTTo6RE9NU3RyaW5nIG1fc2hlZXQ7Ci0gICAgICAgIFFU
ZXh0Q29kZWMqIG1fY29kZWM7Ci0gICAgfTsKLQotICAgIC8qKgotICAgICAqIGEgY2FjaGVkIHNj
cmlwdAotICAgICAqLwotICAgIGNsYXNzIENhY2hlZFNjcmlwdCA6IHB1YmxpYyBDYWNoZWRPYmpl
Y3QKLSAgICB7Ci0gICAgcHVibGljOgotCUNhY2hlZFNjcmlwdChEb2NMb2FkZXIqIGRsLCBjb25z
dCBET006OkRPTVN0cmluZyAmdXJsLCBLSU86OkNhY2hlQ29udHJvbCBjYWNoZVBvbGljeSwgdGlt
ZV90IF9leHBpcmVEYXRlLCBjb25zdCBRU3RyaW5nJiBjaGFyc2V0KTsKLQlDYWNoZWRTY3JpcHQo
Y29uc3QgRE9NOjpET01TdHJpbmcgJnVybCwgY29uc3QgUVN0cmluZyAmc2NyaXB0X2RhdGEpOwot
CXZpcnR1YWwgfkNhY2hlZFNjcmlwdCgpOwotCi0JY29uc3QgRE9NOjpET01TdHJpbmcgJnNjcmlw
dCgpIGNvbnN0IHsgcmV0dXJuIG1fc2NyaXB0OyB9Ci0KLQl2aXJ0dWFsIHZvaWQgcmVmKENhY2hl
ZE9iamVjdENsaWVudCAqY29uc3VtZXIpOwotCXZpcnR1YWwgdm9pZCBkZXJlZihDYWNoZWRPYmpl
Y3RDbGllbnQgKmNvbnN1bWVyKTsKLQotICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0Q2hhcnNldCgg
Y29uc3QgUVN0cmluZyAmY2hzICk7Ci0JdmlydHVhbCB2b2lkIGRhdGEoIFFCdWZmZXIgJmJ1ZmZl
ciwgYm9vbCBlb2YgKTsKLQl2aXJ0dWFsIHZvaWQgZXJyb3IoIGludCBlcnIsIGNvbnN0IGNoYXIg
KnRleHQgKTsKLQotICAgICAgICB2aXJ0dWFsIGJvb2wgc2NoZWR1bGUoKSBjb25zdCB7IHJldHVy
biBmYWxzZTsgfQotICAgICAgICAKLSAgICAgICAgYm9vbCBlcnJvck9jY3VycmVkKCkgY29uc3Qg
eyByZXR1cm4gbV9lcnJvck9jY3VycmVkOyB9Ci0KLQl2b2lkIGNoZWNrTm90aWZ5KCk7Ci0KLSAg
ICBwcm90ZWN0ZWQ6Ci0JRE9NOjpET01TdHJpbmcgbV9zY3JpcHQ7Ci0gICAgICAgIFFUZXh0Q29k
ZWMqIG1fY29kZWM7Ci0gICAgICAgIGJvb2wgbV9lcnJvck9jY3VycmVkOwotICAgIH07Ci0KLSAg
ICBjbGFzcyBJbWFnZVNvdXJjZTsKLQotICAgIGNsYXNzIENhY2hlZEltYWdlOwotICAgIAotICAg
IGNsYXNzIENhY2hlZEltYWdlQ2FsbGJhY2sKLSAgICB7Ci0gICAgcHVibGljOgotICAgICAgICBD
YWNoZWRJbWFnZUNhbGxiYWNrIChDYWNoZWRJbWFnZSAqYykgOiBjYWNoZWRJbWFnZShjKSwgcmVm
Q291bnQoMSksIGhlYWRlclJlY2VpdmVkKGZhbHNlKSB7fTsKLQotICAgICAgICB2b2lkIHJlZigp
IHsgcmVmQ291bnQrKzsgfQotICAgICAgICB2b2lkIGRlcmVmKCkgeyBpZiAoLS1yZWZDb3VudCA9
PSAwKSBkZWxldGUgdGhpczsgfQotICAgICAgICAKLSAgICAgICAgdm9pZCBub3RpZnlVcGRhdGUo
KTsKLSAgICAgICAgdm9pZCBub3RpZnlGaW5pc2hlZCgpOwotICAgICAgICB2b2lkIG5vdGlmeURl
Y29kaW5nRXJyb3IoKTsKLSAgICAgICAgdm9pZCBjbGVhcigpOwotICAgICAgICB2b2lkIGhhbmRs
ZUVycm9yKCk7Ci0gICAgICAgIAotICAgIHByaXZhdGU6Ci0gICAgICAgIENhY2hlZEltYWdlICpj
YWNoZWRJbWFnZTsKLSAgICAgICAgdWludCByZWZDb3VudDsKLQlib29sIGhlYWRlclJlY2VpdmVk
OwotICAgIH07Ci0gICAgICAgIAotICAgIC8qKgotICAgICAqIGEgY2FjaGVkIGltYWdlCi0gICAg
ICovCiAgICAgY2xhc3MgQ2FjaGVkSW1hZ2UgOiBwdWJsaWMgUU9iamVjdCwgcHVibGljIENhY2hl
ZE9iamVjdAogICAgIHsKLQlRX09CSkVDVAogICAgIHB1YmxpYzoKIAlDYWNoZWRJbWFnZShEb2NM
b2FkZXIqIGRsLCBjb25zdCBET006OkRPTVN0cmluZyAmdXJsLCBLSU86OkNhY2hlQ29udHJvbCBj
YWNoZVBvbGljeSwgdGltZV90IF9leHBpcmVEYXRlKTsKIAl2aXJ0dWFsIH5DYWNoZWRJbWFnZSgp
OwpAQCAtMzcxLDkgKzgxLDYgQEAgbmFtZXNwYWNlIGtodG1sCiAgICAgICAgIFFSZ2IgYmdDb2xv
cjsKICAgICAgICAgbXV0YWJsZSBRUGl4bWFwKiBwaXhQYXJ0OwogCi0gICAgICAgIEltYWdlU291
cmNlKiBpbWdTb3VyY2U7Ci0gICAgICAgIGNvbnN0IGNoYXIqIGZvcm1hdFR5cGU7ICAvLyBJcyB0
aGUgbmFtZSBvZiB0aGUgbW92aWUgZm9ybWF0IHR5cGUKLQogCWludCB3aWR0aDsKIAlpbnQgaGVp
Z2h0OwogCkBAIC0zOTUsMzE5ICsxMDIsNiBAQCBuYW1lc3BhY2Uga2h0bWwKICAgICAgICAgaW50
IG1fZGF0YVNpemU7CiAgICAgICAgIENhY2hlZEltYWdlQ2FsbGJhY2sgKm1fZGVjb2RlckNhbGxi
YWNrOwogICAgIH07Ci0KLSNpZmRlZiBLSFRNTF9YU0xUCi0gICAgY2xhc3MgQ2FjaGVkWFNMU3R5
bGVTaGVldCA6IHB1YmxpYyBDYWNoZWRPYmplY3QKLSAgICB7Ci1wdWJsaWM6Ci0gICAgICAgIENh
Y2hlZFhTTFN0eWxlU2hlZXQoRG9jTG9hZGVyKiBkbCwgY29uc3QgRE9NOjpET01TdHJpbmcgJnVy
bCwgS0lPOjpDYWNoZUNvbnRyb2wgY2FjaGVQb2xpY3ksIHRpbWVfdCBfZXhwaXJlRGF0ZSk7Ci0K
LSAgICAgICAgY29uc3QgRE9NOjpET01TdHJpbmcmIHNoZWV0KCkgY29uc3QgeyByZXR1cm4gbV9z
aGVldDsgfQotICAgICAgICAKLSAgICAgICAgdmlydHVhbCB2b2lkIHJlZihDYWNoZWRPYmplY3RD
bGllbnQgKmNvbnN1bWVyKTsKLSAgICAgICAgdmlydHVhbCB2b2lkIGRlcmVmKENhY2hlZE9iamVj
dENsaWVudCAqY29uc3VtZXIpOwotICAgICAgICAKLSAgICAgICAgdmlydHVhbCB2b2lkIHNldENo
YXJzZXQoY29uc3QgUVN0cmluZyAmY2hzKTsKLSAgICAgICAgdmlydHVhbCB2b2lkIGRhdGEoUUJ1
ZmZlciAmYnVmZmVyLCBib29sIGVvZik7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBlcnJvcihpbnQg
ZXJyLCBjb25zdCBjaGFyICp0ZXh0KTsKLSAgICAgICAgCi0gICAgICAgIHZpcnR1YWwgYm9vbCBz
Y2hlZHVsZSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLSAgICAgICAgCi0gICAgICAgIHZvaWQg
Y2hlY2tOb3RpZnkoKTsKLSAgICAgICAgCi1wcm90ZWN0ZWQ6Ci0gICAgICAgIERPTTo6RE9NU3Ry
aW5nIG1fc2hlZXQ7Ci0gICAgICAgIFJlZlB0cjxEZWNvZGVyPiBtX2RlY29kZXI7Ci0gICAgfTsK
LSNlbmRpZgotICAgIAotI2lmbmRlZiBLSFRNTF9OT19YQkwKLSAgICBjbGFzcyBDYWNoZWRYQkxE
b2N1bWVudCA6IHB1YmxpYyBDYWNoZWRPYmplY3QKLSAgICB7Ci0gICAgcHVibGljOgotICAgICAg
ICBDYWNoZWRYQkxEb2N1bWVudChEb2NMb2FkZXIqIGRsLCBjb25zdCBET006OkRPTVN0cmluZyAm
dXJsLCBLSU86OkNhY2hlQ29udHJvbCBjYWNoZVBvbGljeSwgdGltZV90IF9leHBpcmVEYXRlKTsK
LSAgICAgICAgdmlydHVhbCB+Q2FjaGVkWEJMRG9jdW1lbnQoKTsKLSAgICAgICAgCi0gICAgICAg
IFhCTDo6WEJMRG9jdW1lbnRJbXBsKiBkb2N1bWVudCgpIGNvbnN0IHsgcmV0dXJuIG1fZG9jdW1l
bnQ7IH0KLSAgICAgICAgCi0gICAgICAgIHZpcnR1YWwgdm9pZCByZWYoQ2FjaGVkT2JqZWN0Q2xp
ZW50ICpjb25zdW1lcik7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBkZXJlZihDYWNoZWRPYmplY3RD
bGllbnQgKmNvbnN1bWVyKTsKLSAgICAgICAgCi0gICAgICAgIHZpcnR1YWwgdm9pZCBzZXRDaGFy
c2V0KCBjb25zdCBRU3RyaW5nICZjaHMgKTsKLSAgICAgICAgdmlydHVhbCB2b2lkIGRhdGEoIFFC
dWZmZXIgJmJ1ZmZlciwgYm9vbCBlb2YgKTsKLSAgICAgICAgdmlydHVhbCB2b2lkIGVycm9yKCBp
bnQgZXJyLCBjb25zdCBjaGFyICp0ZXh0ICk7Ci0gICAgICAgIAotICAgICAgICB2aXJ0dWFsIGJv
b2wgc2NoZWR1bGUoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0gICAgICAgIAotICAgICAgICB2
b2lkIGNoZWNrTm90aWZ5KCk7Ci0gICAgICAgIAotcHJvdGVjdGVkOgotICAgICAgICBYQkw6OlhC
TERvY3VtZW50SW1wbCogbV9kb2N1bWVudDsKLSAgICAgICAgUmVmUHRyPERlY29kZXI+IG1fZGVj
b2RlcjsKLSAgICB9OwotI2VuZGlmCi0KLSAgICAvKioKLSAgICAgKiBAaW50ZXJuYWwKLSAgICAg
KgotICAgICAqIE1hbmFnZXMgdGhlIGxvYWRpbmcgb2Ygc2NyaXB0cy9pbWFnZXMvc3R5bGVzaGVl
dHMgZm9yIGEgcGFydGljdWxhciBkb2N1bWVudAotICAgICAqLwotICAgIGNsYXNzIERvY0xvYWRl
cgotICAgIHsKLSAgICBwdWJsaWM6Ci0gCURvY0xvYWRlcihLSFRNTFBhcnQqLCBET006OkRvY3Vt
ZW50SW1wbCopOwotIAl+RG9jTG9hZGVyKCk7Ci0KLQlDYWNoZWRJbWFnZSAqcmVxdWVzdEltYWdl
KCBjb25zdCBET006OkRPTVN0cmluZyAmdXJsKTsKLQlDYWNoZWRDU1NTdHlsZVNoZWV0ICpyZXF1
ZXN0U3R5bGVTaGVldCggY29uc3QgRE9NOjpET01TdHJpbmcgJnVybCwgY29uc3QgUVN0cmluZyYg
Y2hhcnNldCk7Ci0gICAgICAgIENhY2hlZFNjcmlwdCAqcmVxdWVzdFNjcmlwdCggY29uc3QgRE9N
OjpET01TdHJpbmcgJnVybCwgY29uc3QgUVN0cmluZyYgY2hhcnNldCk7Ci0KLSNpZmRlZiBLSFRN
TF9YU0xUCi0gICAgICAgIENhY2hlZFhTTFN0eWxlU2hlZXQqIHJlcXVlc3RYU0xTdHlsZVNoZWV0
KGNvbnN0IERPTTo6RE9NU3RyaW5nJiB1cmwpOwotI2VuZGlmCi0jaWZuZGVmIEtIVE1MX05PX1hC
TAotICAgICAgICBDYWNoZWRYQkxEb2N1bWVudCogcmVxdWVzdFhCTERvY3VtZW50KGNvbnN0IERP
TTo6RE9NU3RyaW5nICZ1cmwpOwotI2VuZGlmCi0KLQlib29sIGF1dG9sb2FkSW1hZ2VzKCkgY29u
c3QgeyByZXR1cm4gbV9iYXV0b2xvYWRJbWFnZXM7IH0KLSAgICAgICAgS0lPOjpDYWNoZUNvbnRy
b2wgY2FjaGVQb2xpY3koKSBjb25zdCB7IHJldHVybiBtX2NhY2hlUG9saWN5OyB9Ci0gICAgICAg
IEtIVE1MU2V0dGluZ3M6OktBbmltYXRpb25BZHZpY2Ugc2hvd0FuaW1hdGlvbnMoKSBjb25zdCB7
IHJldHVybiBtX3Nob3dBbmltYXRpb25zOyB9Ci0gICAgICAgIHRpbWVfdCBleHBpcmVEYXRlKCkg
Y29uc3QgeyByZXR1cm4gbV9leHBpcmVEYXRlOyB9Ci0gICAgICAgIEtIVE1MUGFydCogcGFydCgp
IGNvbnN0IHsgcmV0dXJuIG1fcGFydDsgfQotICAgICAgICBET006OkRvY3VtZW50SW1wbCogZG9j
KCkgY29uc3QgeyByZXR1cm4gbV9kb2M7IH0KLQotICAgICAgICB2b2lkIHNldEV4cGlyZURhdGUo
IHRpbWVfdCApOwotICAgICAgICB2b2lkIHNldEF1dG9sb2FkSW1hZ2VzKCBib29sICk7Ci0gICAg
ICAgIHZvaWQgc2V0Q2FjaGVQb2xpY3koIEtJTzo6Q2FjaGVDb250cm9sIGNhY2hlUG9saWN5ICk7
Ci0gICAgICAgIHZvaWQgc2V0U2hvd0FuaW1hdGlvbnMoIEtIVE1MU2V0dGluZ3M6OktBbmltYXRp
b25BZHZpY2UgKTsKLSAgICAgICAgdm9pZCByZW1vdmVDYWNoZWRPYmplY3QoIENhY2hlZE9iamVj
dCopIGNvbnN0OwotCQkKLSAgICAgICAgdm9pZCBzZXRMb2FkSW5Qcm9ncmVzcyhib29sKTsKLSAg
ICAgICAgYm9vbCBsb2FkSW5Qcm9ncmVzcygpIGNvbnN0IHsgcmV0dXJuIG1fbG9hZEluUHJvZ3Jl
c3M7IH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIGJvb2wgbmVlZFJlbG9hZChjb25zdCBLVVJM
ICZmdWxsVXJsKTsKLQotICAgICAgICBmcmllbmQgY2xhc3MgQ2FjaGU7Ci0gICAgICAgIGZyaWVu
ZCBjbGFzcyBET006OkRvY3VtZW50SW1wbDsKLQotICAgICAgICBRU3RyaW5nTGlzdCBtX3JlbG9h
ZGVkVVJMczsKLSAgICAgICAgbXV0YWJsZSBRUHRyTGlzdDxDYWNoZWRPYmplY3Q+IG1fZG9jT2Jq
ZWN0czsKLQl0aW1lX3QgbV9leHBpcmVEYXRlOwotCUtJTzo6Q2FjaGVDb250cm9sIG1fY2FjaGVQ
b2xpY3k7Ci0gICAgICAgIGJvb2wgbV9iYXV0b2xvYWRJbWFnZXMgOiAxOwotICAgICAgICBLSFRN
TFNldHRpbmdzOjpLQW5pbWF0aW9uQWR2aWNlIG1fc2hvd0FuaW1hdGlvbnMgOiAyOwotICAgICAg
ICBLSFRNTFBhcnQqIG1fcGFydDsKLSAgICAgICAgRE9NOjpEb2N1bWVudEltcGwgKm1fZG9jOwot
ICAgICAgICBib29sIG1fbG9hZEluUHJvZ3Jlc3M7Ci0gICAgfTsKLQotICAgIC8qKgotICAgICAq
IEBpbnRlcm5hbAotICAgICAqLwotICAgIGNsYXNzIFJlcXVlc3QKLSAgICB7Ci0gICAgcHVibGlj
OgotCVJlcXVlc3QoRG9jTG9hZGVyKiBkbCwgQ2FjaGVkT2JqZWN0ICpfb2JqZWN0LCBib29sIF9p
bmNyZW1lbnRhbCk7Ci0JflJlcXVlc3QoKTsKLQlib29sIGluY3JlbWVudGFsOwotCVFCdWZmZXIg
bV9idWZmZXI7Ci0JQ2FjaGVkT2JqZWN0ICpvYmplY3Q7Ci0gICAgICAgIERvY0xvYWRlciogbV9k
b2NMb2FkZXI7Ci0gICAgICAgIGJvb2wgbXVsdGlwYXJ0OwotICAgICB9OwotCi0gICAgLyoqCi0g
ICAgICogQGludGVybmFsCi0gICAgICovCi0gICAgY2xhc3MgTG9hZGVyIDogcHVibGljIFFPYmpl
Y3QKLSAgICB7Ci0JUV9PQkpFQ1QKLQotICAgIHB1YmxpYzoJCi0JTG9hZGVyKCk7Ci0JfkxvYWRl
cigpOwotCi0Jdm9pZCBsb2FkKERvY0xvYWRlciogZGwsIENhY2hlZE9iamVjdCAqb2JqZWN0LCBi
b29sIGluY3JlbWVudGFsID0gdHJ1ZSk7Ci0KLSAgICAgICAgaW50IG51bVJlcXVlc3RzKCBEb2NM
b2FkZXIqIGRsICkgY29uc3Q7Ci0gICAgICAgIHZvaWQgY2FuY2VsUmVxdWVzdHMoIERvY0xvYWRl
ciogZGwgKTsKLQotCXZvaWQgcmVtb3ZlQmFja2dyb3VuZERlY29kaW5nUmVxdWVzdCAoUmVxdWVz
dCAqcik7Ci0JCi0gICAgICAgIC8vIG1heSByZXR1cm4gMEwKLSAgICAgICAgS0lPOjpKb2IgKmpv
YkZvclJlcXVlc3QoIGNvbnN0IERPTTo6RE9NU3RyaW5nICZ1cmwgKSBjb25zdDsKLQotICAgICAg
ICBLV1FMb2FkZXIgKmt3cTsKLQotICAgIHNpZ25hbHM6Ci0JZnJpZW5kIGNsYXNzIENhY2hlZElt
YWdlQ2FsbGJhY2s7Ci0KLSAgICAgICAgdm9pZCByZXF1ZXN0U3RhcnRlZCgga2h0bWw6OkRvY0xv
YWRlciogZGwsIGtodG1sOjpDYWNoZWRPYmplY3QqIG9iaiApOwotCXZvaWQgcmVxdWVzdERvbmUo
IGtodG1sOjpEb2NMb2FkZXIqIGRsLCBraHRtbDo6Q2FjaGVkT2JqZWN0ICpvYmogKTsKLQl2b2lk
IHJlcXVlc3RGYWlsZWQoIGtodG1sOjpEb2NMb2FkZXIqIGRsLCBraHRtbDo6Q2FjaGVkT2JqZWN0
ICpvYmogKTsKLQotICAgIHByb3RlY3RlZCBzbG90czoKLSAgICAgICAgdm9pZCBzbG90RmluaXNo
ZWQoIEtJTzo6Sm9iICogLCBOU0RhdGEgKmFsbERhdGEpOwotCXZvaWQgc2xvdERhdGEoIEtJTzo6
Sm9iICosIGNvbnN0IGNoYXIgKmRhdGEsIGludCBzaXplICk7Ci0gICAgICAgIHZvaWQgc2xvdFJl
Y2VpdmVkUmVzcG9uc2UgKCBLSU86OkpvYiAqLCBOU1VSTFJlc3BvbnNlICpyZXNwb25zZSApOwot
Ci0gICAgcHJpdmF0ZToKLQl2b2lkIHNlcnZlUGVuZGluZ1JlcXVlc3RzKCk7Ci0KLSAgICAgICAg
dmlydHVhbCBib29sIGlzS0hUTUxMb2FkZXIoKSBjb25zdDsKLQotCVFQdHJMaXN0PFJlcXVlc3Q+
IG1fcmVxdWVzdHNQZW5kaW5nOwotCVFQdHJEaWN0PFJlcXVlc3Q+IG1fcmVxdWVzdHNMb2FkaW5n
OwotCi0JUVB0ckxpc3Q8UmVxdWVzdD4gbV9yZXF1ZXN0c0JhY2tncm91bmREZWNvZGluZzsKLQot
I2lmZGVmIEhBVkVfTElCSlBFRwotICAgICAgICBLSlBFR0Zvcm1hdFR5cGUgbV9qcGVnbG9hZGVy
OwotI2VuZGlmCi0gICAgfTsKLQotICAgICAgICAvKioKLSAgICAgKiBAaW50ZXJuYWwKLSAgICAg
KgotICAgICAqIFByb3ZpZGVzIGEgY2FjaGUvbG9hZGVyIGZvciBvYmplY3RzIG5lZWRlZCBmb3Ig
ZGlzcGxheWluZyB0aGUgaHRtbCBwYWdlLgotICAgICAqIEF0IHRoZSBtb21lbnQgdGhlc2UgYXJl
IHN0eWxlc2hlZXRzLCBzY3JpcHRzIGFuZCBpbWFnZXMKLSAgICAgKi8KLSAgICBjbGFzcyBDYWNo
ZQotICAgIHsKLQlmcmllbmQgY2xhc3MgRG9jTG9hZGVyOwotICAgIHB1YmxpYzoKLQkvKioKLQkg
KiBpbml0IHRoZSBjYWNoZSBpbiBjYXNlIGl0J3Mgbm90IGFscmVhZHkuIFRoaXMgbmVlZHMgdG8g
Z2V0IGNhbGxlZCBvbmNlCi0JICogYmVmb3JlIHVzaW5nIGl0LgotCSAqLwotCXN0YXRpYyB2b2lk
IGluaXQoKTsKLSAgICAgICAgCi0JLyoqCi0JICogQXNrIHRoZSBjYWNoZSBmb3Igc29tZSB1cmwu
IFdpbGwgcmV0dXJuIGEgY2FjaGVkT2JqZWN0LCBhbmQKLQkgKiBsb2FkIHRoZSByZXF1ZXN0ZWQg
ZGF0YSBpbiBjYXNlIGl0J3Mgbm90IGNhaGNlZAotICAgICAgICAgKiBpZiB0aGUgRG9jTG9hZGVy
IGlzIHplcm8sIHRoZSB1cmwgbXVzdCBiZSBmdWxsLXF1YWxpZmllZC4KLSAgICAgICAgICogT3Ro
ZXJ3aXNlLCBpdCBpcyBhdXRvbWF0aWNhbGx5IGJhc2UtdXJsIGV4cGFuZGVkCi0JICovCi0Jc3Rh
dGljIENhY2hlZEltYWdlICpyZXF1ZXN0SW1hZ2UoIERvY0xvYWRlciogbCwgY29uc3QgRE9NOjpE
T01TdHJpbmcgJnVybCwgYm9vbCByZWxvYWQ9ZmFsc2UsIHRpbWVfdCBfZXhwaXJlRGF0ZT0wKTsK
LSAgICAgICAgc3RhdGljIENhY2hlZEltYWdlICpyZXF1ZXN0SW1hZ2UoIERvY0xvYWRlciogbCwg
Y29uc3QgS1VSTCAmdXJsLCBib29sIHJlbG9hZD1mYWxzZSwgdGltZV90IF9leHBpcmVEYXRlPTAp
OwotCi0JLyoqCi0JICogQXNrIHRoZSBjYWNoZSBmb3Igc29tZSB1cmwuIFdpbGwgcmV0dXJuIGEg
Y2FjaGVkT2JqZWN0LCBhbmQKLQkgKiBsb2FkIHRoZSByZXF1ZXN0ZWQgZGF0YSBpbiBjYXNlIGl0
J3Mgbm90IGNhY2hlZAotCSAqLwotCXN0YXRpYyBDYWNoZWRDU1NTdHlsZVNoZWV0ICpyZXF1ZXN0
U3R5bGVTaGVldCggRG9jTG9hZGVyKiBsLCBjb25zdCBET006OkRPTVN0cmluZyAmdXJsLCBib29s
IHJlbG9hZD1mYWxzZSwgdGltZV90IF9leHBpcmVEYXRlPTAsIGNvbnN0IFFTdHJpbmcmIGNoYXJz
ZXQgPSBRU3RyaW5nOjpudWxsKTsKLQotI2lmZGVmIEtIVE1MX1hTTFQKLSAgICAgICAgLy8gQXNr
IHRoZSBjYWNoZSBmb3IgYW4gWFNMIHN0eWxlc2hlZXQuCi0gICAgICAgIHN0YXRpYyBDYWNoZWRY
U0xTdHlsZVNoZWV0KiByZXF1ZXN0WFNMU3R5bGVTaGVldChEb2NMb2FkZXIqIGwsIGNvbnN0IERP
TTo6RE9NU3RyaW5nICZ1cmwsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgYm9vbCByZWxvYWQ9ZmFsc2UsIHRpbWVfdCBfZXhwaXJlRGF0
ZT0wKTsKLSNlbmRpZgotI2lmbmRlZiBLSFRNTF9OT19YQkwKLSAgICAgICAgLy8gQXNrIHRoZSBj
YWNoZSBmb3IgYW4gWEJMIGRvY3VtZW50LgotICAgICAgICBzdGF0aWMgQ2FjaGVkWEJMRG9jdW1l
bnQqIHJlcXVlc3RYQkxEb2N1bWVudChEb2NMb2FkZXIqIGwsIGNvbnN0IERPTTo6RE9NU3RyaW5n
ICZ1cmwsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBib29sIHJlbG9hZD1mYWxzZSwgdGltZV90IF9leHBpcmVEYXRlPTApOwotI2VuZGlmCi0K
LSAgICAgICAgLyoqCi0gICAgICAgICAqIFByZS1sb2FkcyBhIHN0eWxlc2hlZXQgaW50byB0aGUg
Y2FjaGUuCi0gICAgICAgICAqLwotICAgICAgICBzdGF0aWMgdm9pZCBwcmVsb2FkU3R5bGVTaGVl
dChjb25zdCBRU3RyaW5nICZ1cmwsIGNvbnN0IFFTdHJpbmcgJnN0eWxlc2hlZXRfZGF0YSk7Ci0K
LQkvKioKLQkgKiBBc2sgdGhlIGNhY2hlIGZvciBzb21lIHVybC4gV2lsbCByZXR1cm4gYSBjYWNo
ZWRPYmplY3QsIGFuZAotCSAqIGxvYWQgdGhlIHJlcXVlc3RlZCBkYXRhIGluIGNhc2UgaXQncyBu
b3QgY2FoY2VkCi0JICovCi0Jc3RhdGljIENhY2hlZFNjcmlwdCAqcmVxdWVzdFNjcmlwdCggRG9j
TG9hZGVyKiBsLCBjb25zdCBET006OkRPTVN0cmluZyAmdXJsLCBib29sIHJlbG9hZD1mYWxzZSwg
dGltZV90IF9leHBpcmVEYXRlPTAsIGNvbnN0IFFTdHJpbmcmIGNoYXJzZXQ9UVN0cmluZzo6bnVs
bCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFByZS1sb2FkcyBhIHNjcmlwdCBpbnRvIHRo
ZSBjYWNoZS4KLSAgICAgICAgICovCi0gICAgICAgIHN0YXRpYyB2b2lkIHByZWxvYWRTY3JpcHQo
Y29uc3QgUVN0cmluZyAmdXJsLCBjb25zdCBRU3RyaW5nICZzY3JpcHRfZGF0YSk7Ci0KLQkvKioK
LQkgKiBzZXRzIHRoZSBzaXplIG9mIHRoZSBjYWNoZS4gVGhpcyB3aWxsIG9ubHkgaG9kIGFwcHJv
eGltYXRlbHksIHNpbmNlIHRoZSBzaXplIHNvbWUKLQkgKiBjYWNoZWQgb2JqZWN0cyAobGlrZSBz
dHlsZXNoZWV0cykgdGFrZSB1cCBpbiBtZW1vcnkgaXMgbm90IGV4YWNsdHkga25vd24uCi0JICov
Ci0Jc3RhdGljIHZvaWQgc2V0U2l6ZSggaW50IGJ5dGVzICk7Ci0JLyoqCi0JICogcmV0dXJucyB0
aGUgc2l6ZSBvZiB0aGUgY2FjaGUKLQkgKi8KLQlzdGF0aWMgaW50IHNpemUoKSB7IHJldHVybiBt
YXhTaXplOyB9OwotCi0gICAgICAgIHN0YXRpYyBpbnQgbWF4Q2FjaGVhYmxlT2JqZWN0U2l6ZSgp
IHsgcmV0dXJuIG1heENhY2hlYWJsZTsgfQotCi0JLyoqCi0JICogY2xlYW4gdXAgY2FjaGUKLQkg
Ki8KLQlzdGF0aWMgdm9pZCBmbHVzaChib29sIGZvcmNlPWZhbHNlKTsKLQotCS8qKgotCSAqIGNs
ZWFycyB0aGUgY2FjaGUKLQkgKiBXYXJuaW5nOiBjYWxsIHRoaXMgb25seSBhdCB0aGUgZW5kIG9m
IHlvdXIgcHJvZ3JhbSwgdG8gY2xlYW4KLQkgKiB1cCBtZW1vcnkgKHVzZWZ1bCBmb3IgZmluZGlu
ZyBtZW1vcnkgaG9sZXMpCi0JICovCi0Jc3RhdGljIHZvaWQgY2xlYXIoKTsKLQotCXN0YXRpYyBM
b2FkZXIgKmxvYWRlcigpIHsgcmV0dXJuIG1fbG9hZGVyOyB9Ci0KLSAgICAJc3RhdGljIFFQaXht
YXAgKm51bGxQaXhtYXA7Ci0gICAgICAgIHN0YXRpYyBRUGl4bWFwICpicm9rZW5QaXhtYXA7Ci0K
LSAgICAgICAgc3RhdGljIHZvaWQgcmVtb3ZlQ2FjaGVFbnRyeSggQ2FjaGVkT2JqZWN0ICpvYmpl
Y3QgKTsKLQotICAgICAgICBzdHJ1Y3QgVHlwZVN0YXRpc3RpYyB7Ci0gICAgICAgICAgICBpbnQg
Y291bnQ7Ci0gICAgICAgICAgICBpbnQgc2l6ZTsKLSAgICAgICAgICAgIFR5cGVTdGF0aXN0aWMo
KSA6IGNvdW50KDApLCBzaXplKDApIHsgfQotICAgICAgICB9OwotICAgICAgICAKLSAgICAgICAg
c3RydWN0IFN0YXRpc3RpY3MgewotICAgICAgICAgICAgVHlwZVN0YXRpc3RpYyBpbWFnZXM7Ci0g
ICAgICAgICAgICBUeXBlU3RhdGlzdGljIG1vdmllczsKLSAgICAgICAgICAgIFR5cGVTdGF0aXN0
aWMgc3R5bGVTaGVldHM7Ci0gICAgICAgICAgICBUeXBlU3RhdGlzdGljIHNjcmlwdHM7Ci0jaWZk
ZWYgS0hUTUxfWFNMVAotICAgICAgICAgICAgVHlwZVN0YXRpc3RpYyB4c2xTdHlsZVNoZWV0czsK
LSNlbmRpZgotI2lmbmRlZiBLSFRNTF9OT19YQkwKLSAgICAgICAgICAgIFR5cGVTdGF0aXN0aWMg
eGJsRG9jczsKLSNlbmRpZgotICAgICAgICAgICAgVHlwZVN0YXRpc3RpYyBvdGhlcjsKLSAgICAg
ICAgfTsKLQotICAgICAgICBzdGF0aWMgU3RhdGlzdGljcyBnZXRTdGF0aXN0aWNzKCk7Ci0gICAg
ICAgIHN0YXRpYyB2b2lkIGZsdXNoQWxsKCk7Ci0gICAgICAgIHN0YXRpYyB2b2lkIHNldENhY2hl
RGlzYWJsZWQoYm9vbCk7Ci0KLSAgICAgICAgc3RhdGljIHZvaWQgaW5zZXJ0SW5MUlVMaXN0KENh
Y2hlZE9iamVjdCAqKTsKLSAgICAgICAgc3RhdGljIHZvaWQgcmVtb3ZlRnJvbUxSVUxpc3QoQ2Fj
aGVkT2JqZWN0ICopOwotICAgICAgICBzdGF0aWMgYm9vbCBhZGp1c3RTaXplKENhY2hlZE9iamVj
dCAqLCBpbnQgc2l6ZURlbHRhKTsKLSAgICAgICAgCi0gICAgICAgIHN0YXRpYyBMUlVMaXN0KiBn
ZXRMUlVMaXN0Rm9yKENhY2hlZE9iamVjdCogbyk7Ci0gICAgICAgIAotICAgICAgICBzdGF0aWMg
dm9pZCBjaGVja0xSVUFuZFVuY2FjaGVhYmxlTGlzdEludGVncml0eSgpOwotCi0gICAgcHJvdGVj
dGVkOgotICAgICAgICBzdGF0aWMgUURpY3Q8Q2FjaGVkT2JqZWN0PiAqY2FjaGU7Ci0gICAgICAg
IHN0YXRpYyBRUHRyTGlzdDxEb2NMb2FkZXI+KiBkb2Nsb2FkZXI7Ci0gICAgCi0gICAgICAgIHN0
YXRpYyBpbnQgbWF4U2l6ZTsKLSAgICAgICAgc3RhdGljIGludCBtYXhDYWNoZWFibGU7Ci0gICAg
ICAgIHN0YXRpYyBpbnQgZmx1c2hDb3VudDsKLSAgICAKLSAgICAgICAgc3RhdGljIExvYWRlciAq
bV9sb2FkZXI7Ci0gICAgCi0gICAgICAgIHN0YXRpYyB2b2lkIG1vdmVUb0hlYWRPZkxSVUxpc3Qo
Q2FjaGVkT2JqZWN0ICopOwotICAgIAotICAgICAgICBzdGF0aWMgTFJVTGlzdCAqbV9MUlVMaXN0
czsKLSAgICAgICAgc3RhdGljIGludCBtX3RvdGFsU2l6ZU9mTFJVTGlzdHM7Ci0gICAgICAgICAg
ICAKLSAgICAgICAgc3RhdGljIENhY2hlZE9iamVjdCAqbV9oZWFkT2ZVbmNhY2hlYWJsZUxpc3Q7
Ci0gICAgICAgICAgICAKLSAgICAgICAgc3RhdGljIGludCBtX2NvdW50T2ZMUlVBbmRVbmNhY2hl
YWJsZUxpc3RzOwotICAgIH07Ci0KIH07CiAKICNlbmRpZgpJbmRleDogbWlzYy9DYWNoZWRYQkxE
b2N1bWVudC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIG1pc2MvQ2FjaGVkWEJMRG9jdW1lbnQuaAkocmV2aXNp
b24gMTE5NDgpCisrKyBtaXNjL0NhY2hlZFhCTERvY3VtZW50LmgJKHdvcmtpbmcgY29weSkKQEAg
LTIzLDYxICsyMywxNCBAQAogICAgIFRoaXMgY2xhc3MgcHJvdmlkZXMgYWxsIGZ1bmN0aW9uYWxp
dHkgbmVlZGVkIGZvciBsb2FkaW5nIGltYWdlcywgc3R5bGUgc2hlZXRzIGFuZCBodG1sCiAgICAg
cGFnZXMgZnJvbSB0aGUgd2ViLiBJdCBoYXMgYSBtZW1vcnkgY2FjaGUgZm9yIHRoZXNlIG9iamVj
dHMuCiAqLwotI2lmbmRlZiBfa2h0bWxfbG9hZGVyX2gKLSNkZWZpbmUgX2todG1sX2xvYWRlcl9o
CiAKLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQot
I2luY2x1ZGUgPHRpbWUuaD4KLQotI2luY2x1ZGUgImxvYWRlcl9jbGllbnQuaCIKLSNpZmRlZiBI
QVZFX0xJQkpQRUcKLSNpbmNsdWRlICJsb2FkZXJfanBlZy5oIgotI2VuZGlmCisjaWZuZGVmIEtI
VE1MX0NhY2hlZFhCTERvY3VtZW50X2gKKyNkZWZpbmUgS0hUTUxfQ2FjaGVkWEJMRG9jdW1lbnRf
aAogCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8cXB0cmxpc3QuaD4KLSNpbmNsdWRl
IDxxb2JqZWN0Lmg+Ci0jaW5jbHVkZSA8cXB0cmRpY3QuaD4KLSNpbmNsdWRlIDxxZGljdC5oPgot
I2luY2x1ZGUgPHFwaXhtYXAuaD4KLSNpbmNsdWRlIDxxYnVmZmVyLmg+Ci0jaW5jbHVkZSA8cXN0
cmluZ2xpc3QuaD4KLSNpbmNsdWRlIDxxdGV4dGNvZGVjLmg+CisjaW5jbHVkZSAiQ2FjaGVkT2Jq
ZWN0LmgiCiAKLSNpbmNsdWRlIDxrdXJsLmg+CiAjaW5jbHVkZSA8a2lvL2dsb2JhbC5oPgotCi0j
aW5jbHVkZSA8a2h0bWxfc2V0dGluZ3MuaD4KICNpbmNsdWRlIDxkb20vZG9tX3N0cmluZy5oPgot
I2luY2x1ZGUgIkRvY1B0ci5oIgotCi1jbGFzcyBLSFRNTFBhcnQ7Ci0KLW5hbWVzcGFjZSBLSU8g
ewotICBjbGFzcyBKb2I7Ci0gIGNsYXNzIFRyYW5zZmVySm9iOwotfQotCi1uYW1lc3BhY2UgRE9N
Ci17Ci0gICAgY2xhc3MgQ1NTU3R5bGVTaGVldEltcGw7Ci0gICAgY2xhc3MgRG9jdW1lbnRJbXBs
OwotfTsKLQotCi1jbGFzcyBLV1FMb2FkZXI7Ci0KLSNpZiBfX09CSkNfXwotQGNsYXNzIE5TRGF0
YTsKLUBjbGFzcyBOU1VSTFJlc3BvbnNlOwotI2Vsc2UKLWNsYXNzIE5TRGF0YTsKLWNsYXNzIE5T
VVJMUmVzcG9uc2U7Ci0jZW5kaWYKLQogCiBuYW1lc3BhY2Uga2h0bWwKIHsKQEAgLTg1LDM0MSAr
MzgsNyBAQCBuYW1lc3BhY2Uga2h0bWwKICAgICBjbGFzcyBSZXF1ZXN0OwogICAgIGNsYXNzIERv
Y0xvYWRlcjsKICAgICBjbGFzcyBEZWNvZGVyOwotCi0gI2RlZmluZSBNQVhfTFJVX0xJU1RTIDIw
Ci0gICAgCi0gICAgc3RydWN0IExSVUxpc3QgewotICAgICAgICBDYWNoZWRPYmplY3QqIG1faGVh
ZDsKLSAgICAgICAgQ2FjaGVkT2JqZWN0KiBtX3RhaWw7Ci0gICAgCi0gICAgICAgIExSVUxpc3Qo
KTsKLSAgICAgICAgfkxSVUxpc3QoKTsKLSAgICB9OwotICAgIAotICAgIC8qKgotICAgICAqIEBp
bnRlcm5hbAotICAgICAqCi0gICAgICogQSBjYWNoZWQgb2JqZWN0LiBDbGFzc2VzIHdobyB3YW50
IHRvIHVzZSB0aGlzIG9iamVjdCBzaG91bGQgZGVyaXZlCi0gICAgICogZnJvbSBDYWNoZWRPYmpl
Y3RDbGllbnQsIHRvIGdldCB0aGUgZnVuY3Rpb24gY2FsbHMgaW4gY2FzZSB0aGUgcmVxdWVzdGVk
IGRhdGEgaGFzIGFycml2ZWQuCi0gICAgICoKLSAgICAgKiBUaGlzIGNsYXNzIGFsc28gZG9lcyB0
aGUgYWN0dWFsIGNvbW11bmljYXRpb24gd2l0aCBraW8gYW5kIGxvYWRzIHRoZSBmaWxlLgotICAg
ICAqLwotICAgIGNsYXNzIENhY2hlZE9iamVjdAotICAgIHsKLSAgICBwdWJsaWM6Ci0JZW51bSBU
eXBlIHsKLQkgICAgSW1hZ2UsCi0JICAgIENTU1N0eWxlU2hlZXQsCi0JICAgIFNjcmlwdAotI2lm
ZGVmIEtIVE1MX1hTTFQKLSAgICAgICAgICAgICwgWFNMU3R5bGVTaGVldAotI2VuZGlmCi0jaWZu
ZGVmIEtIVE1MX05PX1hCTAotICAgICAgICAgICAgLCBYQkwKLSNlbmRpZgotCX07Ci0KLQllbnVt
IFN0YXR1cyB7Ci0JICAgIE5vdENhY2hlZCwgICAgLy8gdGhpcyBVUkwgaXMgbm90IGNhY2hlZAot
CSAgICBVbmtub3duLCAgICAgIC8vIGxldCBpbWFnZWNhY2hlIGRlY2lkZSB3aGF0IHRvIGRvIHdp
dGggaXQKLQkgICAgTmV3LCAgICAgICAgICAvLyBpbnNlcnRpbmcgbmV3IGltYWdlCi0gICAgICAg
IFBlbmRpbmcsICAgICAgLy8gb25seSBwYXJ0aWFsbHkgbG9hZGVkCi0JICAgIFBlcnNpc3RlbnQs
ICAgLy8gbmV2ZXIgZGVsZXRlIHRoaXMgcGl4bWFwCi0JICAgIENhY2hlZCwgICAgICAgLy8gcmVn
dWxhciBjYXNlCi0JICAgIFVuY2FjaGVhYmxlICAgLy8gdG9vIGJpZyB0byBiZSBjYWNoZWQsCi0J
fTsgIAkgICAgICAgICAgLy8gd2lsbCBiZSBkZXN0cm95ZWQgYXMgc29vbiBhcyBwb3NzaWJsZQot
Ci0JQ2FjaGVkT2JqZWN0KGNvbnN0IERPTTo6RE9NU3RyaW5nICZ1cmwsIFR5cGUgdHlwZSwgS0lP
OjpDYWNoZUNvbnRyb2wgX2NhY2hlUG9saWN5LCB0aW1lX3QgX2V4cGlyZURhdGUsIGludCBzaXpl
ID0gMCkKLQl7Ci0JICAgIG1fdXJsID0gdXJsOwotCSAgICBtX3R5cGUgPSB0eXBlOwotCSAgICBt
X3N0YXR1cyA9IFBlbmRpbmc7Ci0JICAgIG1fc2l6ZSA9IHNpemU7Ci0JICAgIG1fZnJlZSA9IGZh
bHNlOwotCSAgICBtX2NhY2hlUG9saWN5ID0gX2NhY2hlUG9saWN5OwotCSAgICBtX3JlcXVlc3Qg
PSAwOwotICAgICAgICBtX3Jlc3BvbnNlID0gMDsKLSAgICAgICAgbV9hbGxEYXRhID0gMDsKLQkg
ICAgbV9leHBpcmVEYXRlID0gX2V4cGlyZURhdGU7Ci0gICAgICAgIG1fZGVsZXRlZCA9IGZhbHNl
OwotICAgICAgICBtX2V4cGlyZURhdGVDaGFuZ2VkID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAg
ICBtX2FjY2Vzc0NvdW50ID0gMDsKLSAgICAgICAgCi0gICAgICAgIG1fbmV4dEluTFJVTGlzdCA9
IDA7Ci0gICAgICAgIG1fcHJldkluTFJVTGlzdCA9IDA7Ci0JfQotCXZpcnR1YWwgfkNhY2hlZE9i
amVjdCgpOwotCi0JdmlydHVhbCB2b2lkIHNldENoYXJzZXQoIGNvbnN0IFFTdHJpbmcgJmNocyAp
IHt9Ci0JdmlydHVhbCB2b2lkIGRhdGEoIFFCdWZmZXIgJmJ1ZmZlciwgYm9vbCBlb2YpID0gMDsK
LQl2aXJ0dWFsIHZvaWQgZXJyb3IoIGludCBlcnIsIGNvbnN0IGNoYXIgKnRleHQgKSA9IDA7Ci0K
LQljb25zdCBET006OkRPTVN0cmluZyAmdXJsKCkgY29uc3QgeyByZXR1cm4gbV91cmw7IH0KLQlU
eXBlIHR5cGUoKSBjb25zdCB7IHJldHVybiBtX3R5cGU7IH0KLQotCXZpcnR1YWwgdm9pZCByZWYo
Q2FjaGVkT2JqZWN0Q2xpZW50ICpjb25zdW1lcik7Ci0JdmlydHVhbCB2b2lkIGRlcmVmKENhY2hl
ZE9iamVjdENsaWVudCAqY29uc3VtZXIpOwotCi0JaW50IGNvdW50KCkgY29uc3QgeyByZXR1cm4g
bV9jbGllbnRzLmNvdW50KCk7IH0KLQotCVN0YXR1cyBzdGF0dXMoKSBjb25zdCB7IHJldHVybiBt
X3N0YXR1czsgfQotCi0JaW50IHNpemUoKSBjb25zdCB7IHJldHVybiBtX3NpemU7IH0KLQotICAg
ICAgICBib29sIGlzTG9hZGVkKCkgY29uc3QgeyByZXR1cm4gIW1fbG9hZGluZzsgfQotICAgICAg
ICAKLSAgICAgICAgdmlydHVhbCBib29sIGlzSW1hZ2UoKSBjb25zdCB7IHJldHVybiBmYWxzZTsg
fQotCi0gICAgaW50IGFjY2Vzc0NvdW50KCkgY29uc3QgeyByZXR1cm4gbV9hY2Nlc3NDb3VudDsg
fQotICAgIHZvaWQgaW5jcmVhc2VBY2Nlc3NDb3VudCgpIHsgbV9hY2Nlc3NDb3VudCsrOyB9Ci0g
ICAgCi0JLyoqCi0JICogY29tcHV0ZXMgdGhlIHN0YXR1cyBvZiBhbiBvYmplY3QgYWZ0ZXIgbG9h
ZGluZy4KLQkgKiB0aGUgcmVzdWx0IGRlcGVuZHMgb24gdGhlIG9iamVjdHMgc2l6ZSBhbmQgdGhl
IHNpemUgb2YgdGhlIGNhY2hlCi0JICogYWxzbyB1cGRhdGVzIHRoZSBleHBpcmUgZGF0ZSBvbiB0
aGUgY2FjaGUgZW50cnkgZmlsZQotCSAqLwotCXZvaWQgZmluaXNoKCk7Ci0KLSAgICAgICAgLyoq
Ci0gICAgICAgICAqIENhbGxlZCBieSB0aGUgY2FjaGUgaWYgdGhlIG9iamVjdCBoYXMgYmVlbiBy
ZW1vdmVkIGZyb20gdGhlIGNhY2hlIGRpY3QKLSAgICAgICAgICogd2hpbGUgc3RpbGwgYmVpbmcg
cmVmZXJlbmNlZC4gVGhpcyBtZWFucyB0aGUgb2JqZWN0IHNob3VsZCBraWxsIGl0c2VsZgotICAg
ICAgICAgKiBpZiBpdHMgcmVmZXJlbmNlIGNvdW50ZXIgZHJvcHMgZG93biB0byB6ZXJvLgotICAg
ICAgICAgKi8KLSAgICAgICAgdm9pZCBzZXRGcmVlKCBib29sIGIgKSB7IG1fZnJlZSA9IGI7IH0K
LQotICAgICAgICBLSU86OkNhY2hlQ29udHJvbCBjYWNoZVBvbGljeSgpIGNvbnN0IHsgcmV0dXJu
IG1fY2FjaGVQb2xpY3k7IH0KLQotICAgICAgICB2b2lkIHNldFJlcXVlc3QoUmVxdWVzdCAqX3Jl
cXVlc3QpOwotCi0gICAgICAgIE5TVVJMUmVzcG9uc2UgKnJlc3BvbnNlKCkgY29uc3QgeyByZXR1
cm4gbV9yZXNwb25zZTsgfQotICAgICAgICB2b2lkIHNldFJlc3BvbnNlKE5TVVJMUmVzcG9uc2Ug
KnJlc3BvbnNlKTsKLSAgICAgICAgTlNEYXRhICphbGxEYXRhKCkgY29uc3QgeyByZXR1cm4gbV9h
bGxEYXRhOyB9Ci0gICAgICAgIHZvaWQgc2V0QWxsRGF0YSAoTlNEYXRhICpkYXRhKTsKLQotICAg
ICAgICBib29sIGNhbkRlbGV0ZSgpIGNvbnN0IHsgcmV0dXJuIChtX2NsaWVudHMuY291bnQoKSA9
PSAwICYmICFtX3JlcXVlc3QpOyB9Ci0KLQl2b2lkIHNldEV4cGlyZURhdGUodGltZV90IF9leHBp
cmVEYXRlLCBib29sIGNoYW5nZUh0dHBDYWNoZSk7Ci0JCi0JYm9vbCBpc0V4cGlyZWQoKSBjb25z
dDsKLQotICAgICAgICB2aXJ0dWFsIGJvb2wgc2NoZWR1bGUoKSBjb25zdCB7IHJldHVybiBmYWxz
ZTsgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBMaXN0IG9mIGFjY2VwdGFibGUgbWltZXR5
cGVzIHNlcGVyYXRlZCBieSAiLCIuIEEgbWltZXR5cGUgbWF5IGNvbnRhaW4gYSB3aWxkY2FyZC4K
LSAgICAgICAgICovCi0gICAgICAgIC8vIGUuZy4gInRleHQvKiIKLSAgICAgICAgUVN0cmluZyBh
Y2NlcHQoKSBjb25zdCB7IHJldHVybiBtX2FjY2VwdDsgfQotICAgICAgICB2b2lkIHNldEFjY2Vw
dChjb25zdCBRU3RyaW5nICZfYWNjZXB0KSB7IG1fYWNjZXB0ID0gX2FjY2VwdDsgfQotCi0gICAg
cHJvdGVjdGVkOgotICAgICAgICB2b2lkIHNldFNpemUoaW50IHNpemUpOwotICAgICAgICAKLSAg
ICAgICAgUVB0ckRpY3Q8Q2FjaGVkT2JqZWN0Q2xpZW50PiBtX2NsaWVudHM7Ci0KLQlET006OkRP
TVN0cmluZyBtX3VybDsKLSAgICAgICAgUVN0cmluZyBtX2FjY2VwdDsKLSAgICAgICAgUmVxdWVz
dCAqbV9yZXF1ZXN0OwotICAgICAgICBOU1VSTFJlc3BvbnNlICptX3Jlc3BvbnNlOwotICAgICAg
ICBOU0RhdGEgKm1fYWxsRGF0YTsKLQlUeXBlIG1fdHlwZTsKLQlTdGF0dXMgbV9zdGF0dXM7Ci0g
ICAgcHJpdmF0ZToKLQlpbnQgbV9zaXplOwotICAgIGludCBtX2FjY2Vzc0NvdW50OwotICAgIAot
ICAgIHByb3RlY3RlZDoKLQl0aW1lX3QgbV9leHBpcmVEYXRlOwotCUtJTzo6Q2FjaGVDb250cm9s
IG1fY2FjaGVQb2xpY3k7Ci0gICAgICAgIGJvb2wgbV9mcmVlIDogMTsKLSAgICAgICAgYm9vbCBt
X2RlbGV0ZWQgOiAxOwotICAgICAgICBib29sIG1fbG9hZGluZyA6IDE7Ci0gICAgICAgIGJvb2wg
bV9leHBpcmVEYXRlQ2hhbmdlZCA6IDE7Ci0gICAgCi0gICAgcHJpdmF0ZToKLSAgICAgICAgYm9v
bCBhbGxvd0luTFJVTGlzdCgpIHsgcmV0dXJuIGNhbkRlbGV0ZSgpICYmIHN0YXR1cygpICE9IFBl
cnNpc3RlbnQ7IH0KLSAgICAgICAgCi0gICAgICAgIENhY2hlZE9iamVjdCAqbV9uZXh0SW5MUlVM
aXN0OwotICAgICAgICBDYWNoZWRPYmplY3QgKm1fcHJldkluTFJVTGlzdDsKLSAgICAgICAgZnJp
ZW5kIGNsYXNzIENhY2hlOwotICAgIH07Ci0KLQotICAgIC8qKgotICAgICAqIGEgY2FjaGVkIHN0
eWxlIHNoZWV0Ci0gICAgICovCi0gICAgY2xhc3MgQ2FjaGVkQ1NTU3R5bGVTaGVldCA6IHB1Ymxp
YyBDYWNoZWRPYmplY3QKLSAgICB7Ci0gICAgcHVibGljOgotCUNhY2hlZENTU1N0eWxlU2hlZXQo
RG9jTG9hZGVyKiBkbCwgY29uc3QgRE9NOjpET01TdHJpbmcgJnVybCwgS0lPOjpDYWNoZUNvbnRy
b2wgY2FjaGVQb2xpY3ksIHRpbWVfdCBfZXhwaXJlRGF0ZSwgY29uc3QgUVN0cmluZyYgY2hhcnNl
dCk7Ci0JQ2FjaGVkQ1NTU3R5bGVTaGVldChjb25zdCBET006OkRPTVN0cmluZyAmdXJsLCBjb25z
dCBRU3RyaW5nICZzdHlsZXNoZWV0X2RhdGEpOwotCXZpcnR1YWwgfkNhY2hlZENTU1N0eWxlU2hl
ZXQoKTsKLQotCWNvbnN0IERPTTo6RE9NU3RyaW5nICZzaGVldCgpIGNvbnN0IHsgcmV0dXJuIG1f
c2hlZXQ7IH0KLQotCXZpcnR1YWwgdm9pZCByZWYoQ2FjaGVkT2JqZWN0Q2xpZW50ICpjb25zdW1l
cik7Ci0JdmlydHVhbCB2b2lkIGRlcmVmKENhY2hlZE9iamVjdENsaWVudCAqY29uc3VtZXIpOwot
Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBzZXRDaGFyc2V0KCBjb25zdCBRU3RyaW5nICZjaHMgKTsK
LSAgICAgICAgdmlydHVhbCB2b2lkIGRhdGEoIFFCdWZmZXIgJmJ1ZmZlciwgYm9vbCBlb2YgKTsK
LQl2aXJ0dWFsIHZvaWQgZXJyb3IoIGludCBlcnIsIGNvbnN0IGNoYXIgKnRleHQgKTsKLQotICAg
ICAgICB2aXJ0dWFsIGJvb2wgc2NoZWR1bGUoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0KLQl2
b2lkIGNoZWNrTm90aWZ5KCk7Ci0KLSAgICBwcm90ZWN0ZWQ6Ci0JRE9NOjpET01TdHJpbmcgbV9z
aGVldDsKLSAgICAgICAgUVRleHRDb2RlYyogbV9jb2RlYzsKLSAgICB9OwotCi0gICAgLyoqCi0g
ICAgICogYSBjYWNoZWQgc2NyaXB0Ci0gICAgICovCi0gICAgY2xhc3MgQ2FjaGVkU2NyaXB0IDog
cHVibGljIENhY2hlZE9iamVjdAotICAgIHsKLSAgICBwdWJsaWM6Ci0JQ2FjaGVkU2NyaXB0KERv
Y0xvYWRlciogZGwsIGNvbnN0IERPTTo6RE9NU3RyaW5nICZ1cmwsIEtJTzo6Q2FjaGVDb250cm9s
IGNhY2hlUG9saWN5LCB0aW1lX3QgX2V4cGlyZURhdGUsIGNvbnN0IFFTdHJpbmcmIGNoYXJzZXQp
OwotCUNhY2hlZFNjcmlwdChjb25zdCBET006OkRPTVN0cmluZyAmdXJsLCBjb25zdCBRU3RyaW5n
ICZzY3JpcHRfZGF0YSk7Ci0JdmlydHVhbCB+Q2FjaGVkU2NyaXB0KCk7Ci0KLQljb25zdCBET006
OkRPTVN0cmluZyAmc2NyaXB0KCkgY29uc3QgeyByZXR1cm4gbV9zY3JpcHQ7IH0KLQotCXZpcnR1
YWwgdm9pZCByZWYoQ2FjaGVkT2JqZWN0Q2xpZW50ICpjb25zdW1lcik7Ci0JdmlydHVhbCB2b2lk
IGRlcmVmKENhY2hlZE9iamVjdENsaWVudCAqY29uc3VtZXIpOwotCi0gICAgICAgIHZpcnR1YWwg
dm9pZCBzZXRDaGFyc2V0KCBjb25zdCBRU3RyaW5nICZjaHMgKTsKLQl2aXJ0dWFsIHZvaWQgZGF0
YSggUUJ1ZmZlciAmYnVmZmVyLCBib29sIGVvZiApOwotCXZpcnR1YWwgdm9pZCBlcnJvciggaW50
IGVyciwgY29uc3QgY2hhciAqdGV4dCApOwotCi0gICAgICAgIHZpcnR1YWwgYm9vbCBzY2hlZHVs
ZSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgICAgIAotICAgICAgICBib29sIGVycm9y
T2NjdXJyZWQoKSBjb25zdCB7IHJldHVybiBtX2Vycm9yT2NjdXJyZWQ7IH0KLQotCXZvaWQgY2hl
Y2tOb3RpZnkoKTsKLQotICAgIHByb3RlY3RlZDoKLQlET006OkRPTVN0cmluZyBtX3NjcmlwdDsK
LSAgICAgICAgUVRleHRDb2RlYyogbV9jb2RlYzsKLSAgICAgICAgYm9vbCBtX2Vycm9yT2NjdXJy
ZWQ7Ci0gICAgfTsKLQotICAgIGNsYXNzIEltYWdlU291cmNlOwotCi0gICAgY2xhc3MgQ2FjaGVk
SW1hZ2U7Ci0gICAgCi0gICAgY2xhc3MgQ2FjaGVkSW1hZ2VDYWxsYmFjawotICAgIHsKLSAgICBw
dWJsaWM6Ci0gICAgICAgIENhY2hlZEltYWdlQ2FsbGJhY2sgKENhY2hlZEltYWdlICpjKSA6IGNh
Y2hlZEltYWdlKGMpLCByZWZDb3VudCgxKSwgaGVhZGVyUmVjZWl2ZWQoZmFsc2UpIHt9OwotCi0g
ICAgICAgIHZvaWQgcmVmKCkgeyByZWZDb3VudCsrOyB9Ci0gICAgICAgIHZvaWQgZGVyZWYoKSB7
IGlmICgtLXJlZkNvdW50ID09IDApIGRlbGV0ZSB0aGlzOyB9Ci0gICAgICAgIAotICAgICAgICB2
b2lkIG5vdGlmeVVwZGF0ZSgpOwotICAgICAgICB2b2lkIG5vdGlmeUZpbmlzaGVkKCk7Ci0gICAg
ICAgIHZvaWQgbm90aWZ5RGVjb2RpbmdFcnJvcigpOwotICAgICAgICB2b2lkIGNsZWFyKCk7Ci0g
ICAgICAgIHZvaWQgaGFuZGxlRXJyb3IoKTsKLSAgICAgICAgCi0gICAgcHJpdmF0ZToKLSAgICAg
ICAgQ2FjaGVkSW1hZ2UgKmNhY2hlZEltYWdlOwotICAgICAgICB1aW50IHJlZkNvdW50OwotCWJv
b2wgaGVhZGVyUmVjZWl2ZWQ7Ci0gICAgfTsKLSAgICAgICAgCi0gICAgLyoqCi0gICAgICogYSBj
YWNoZWQgaW1hZ2UKLSAgICAgKi8KLSAgICBjbGFzcyBDYWNoZWRJbWFnZSA6IHB1YmxpYyBRT2Jq
ZWN0LCBwdWJsaWMgQ2FjaGVkT2JqZWN0Ci0gICAgewotCVFfT0JKRUNUCi0gICAgcHVibGljOgot
CUNhY2hlZEltYWdlKERvY0xvYWRlciogZGwsIGNvbnN0IERPTTo6RE9NU3RyaW5nICZ1cmwsIEtJ
Tzo6Q2FjaGVDb250cm9sIGNhY2hlUG9saWN5LCB0aW1lX3QgX2V4cGlyZURhdGUpOwotCXZpcnR1
YWwgfkNhY2hlZEltYWdlKCk7Ci0KLQljb25zdCBRUGl4bWFwICZwaXhtYXAoKSBjb25zdDsKLQlj
b25zdCBRUGl4bWFwICZ0aWxlZF9waXhtYXAoY29uc3QgUUNvbG9yJiBiZyk7Ci0KLSAgICAgICAg
UVNpemUgcGl4bWFwX3NpemUoKSBjb25zdDsgICAgLy8gcmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUg
Y29tcGxldGUgKGkuZS4gd2hlbiBmaW5pc2hlZCkgbG9hZGluZwotICAgICAgICBRUmVjdCB2YWxp
ZF9yZWN0KCkgY29uc3Q7ICAgICAvLyByZXR1cm5zIHRoZSByZWN0YW5nbGUgb2YgcGl4bWFwIHRo
YXQgaGFzIGJlZW4gbG9hZGVkIGFscmVhZHkKLQotICAgICAgICB2b2lkIHJlZihDYWNoZWRPYmpl
Y3RDbGllbnQgKmNvbnN1bWVyKTsKLQl2aXJ0dWFsIHZvaWQgZGVyZWYoQ2FjaGVkT2JqZWN0Q2xp
ZW50ICpjb25zdW1lcik7Ci0KLQl2aXJ0dWFsIHZvaWQgZGF0YSggUUJ1ZmZlciAmYnVmZmVyLCBi
b29sIGVvZiApOwotCXZpcnR1YWwgdm9pZCBlcnJvciggaW50IGVyciwgY29uc3QgY2hhciAqdGV4
dCApOwotCi0gICAgICAgIGJvb2wgaXNUcmFuc3BhcmVudCgpIGNvbnN0IHsgcmV0dXJuIGlzRnVs
bHlUcmFuc3BhcmVudDsgfQotICAgICAgICBib29sIGlzRXJyb3JJbWFnZSgpIGNvbnN0IHsgcmV0
dXJuIGVycm9yT2NjdXJlZDsgfQotCi0gICAgICAgIHZvaWQgc2V0U2hvd0FuaW1hdGlvbnMoIEtI
VE1MU2V0dGluZ3M6OktBbmltYXRpb25BZHZpY2UgKTsKLQotICAgICAgICB2aXJ0dWFsIGJvb2wg
c2NoZWR1bGUoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0KLQl2b2lkIGNoZWNrTm90aWZ5KCk7
Ci0gICAgICAgIAotICAgICAgICB2aXJ0dWFsIGJvb2wgaXNJbWFnZSgpIGNvbnN0IHsgcmV0dXJu
IHRydWU7IH0KLQotCXZvaWQgY2xlYXIoKTsKLSAgICAgICAgCi0gICAgcHJpdmF0ZToKLSAgICAg
ICAgdm9pZCBkb19ub3RpZnkoY29uc3QgUVBpeG1hcCYgcCwgY29uc3QgUVJlY3QmIHIpOwotCi0g
ICAgICAgIFFQaXhtYXAqIHA7Ci0JUVBpeG1hcCogYmc7Ci0gICAgICAgIFFSZ2IgYmdDb2xvcjsK
LSAgICAgICAgbXV0YWJsZSBRUGl4bWFwKiBwaXhQYXJ0OwotCi0gICAgICAgIEltYWdlU291cmNl
KiBpbWdTb3VyY2U7Ci0gICAgICAgIGNvbnN0IGNoYXIqIGZvcm1hdFR5cGU7ICAvLyBJcyB0aGUg
bmFtZSBvZiB0aGUgbW92aWUgZm9ybWF0IHR5cGUKLQotCWludCB3aWR0aDsKLQlpbnQgaGVpZ2h0
OwotCi0JLy8gSXMgc2V0IGlmIG1vdmllIGZvcm1hdCB0eXBlICggaW5jcmVtZW50YWwvYW5pbWF0
aW9uKSB3YXMgY2hlY2tlZAotCWJvb2wgdHlwZUNoZWNrZWQgOiAxOwotICAgICAgICBib29sIGlz
RnVsbHlUcmFuc3BhcmVudCA6IDE7Ci0gICAgICAgIGJvb2wgZXJyb3JPY2N1cmVkIDogMTsKLSAg
ICAgICAgYm9vbCBtb25vY2hyb21lIDogMTsKLSAgICAgICAgS0hUTUxTZXR0aW5nczo6S0FuaW1h
dGlvbkFkdmljZSBtX3Nob3dBbmltYXRpb25zIDogMjsKLQotICAgICAgICBmcmllbmQgY2xhc3Mg
Q2FjaGU7Ci0KLSAgICBwdWJsaWM6Ci0gICAgICAgIGludCBkYXRhU2l6ZSgpIGNvbnN0IHsgcmV0
dXJuIG1fZGF0YVNpemU7IH0KLQlDYWNoZWRJbWFnZUNhbGxiYWNrICpkZWNvZGVyQ2FsbGJhY2so
KSBjb25zdCB7IHJldHVybiBtX2RlY29kZXJDYWxsYmFjazsgfQotICAgIHByaXZhdGU6Ci0gICAg
ICAgIGZyaWVuZCBjbGFzcyBDYWNoZWRJbWFnZUNhbGxiYWNrOwotICAgICAgICAKLSAgICAgICAg
aW50IG1fZGF0YVNpemU7Ci0gICAgICAgIENhY2hlZEltYWdlQ2FsbGJhY2sgKm1fZGVjb2RlckNh
bGxiYWNrOwotICAgIH07Ci0KLSNpZmRlZiBLSFRNTF9YU0xUCi0gICAgY2xhc3MgQ2FjaGVkWFNM
U3R5bGVTaGVldCA6IHB1YmxpYyBDYWNoZWRPYmplY3QKLSAgICB7Ci1wdWJsaWM6Ci0gICAgICAg
IENhY2hlZFhTTFN0eWxlU2hlZXQoRG9jTG9hZGVyKiBkbCwgY29uc3QgRE9NOjpET01TdHJpbmcg
JnVybCwgS0lPOjpDYWNoZUNvbnRyb2wgY2FjaGVQb2xpY3ksIHRpbWVfdCBfZXhwaXJlRGF0ZSk7
Ci0KLSAgICAgICAgY29uc3QgRE9NOjpET01TdHJpbmcmIHNoZWV0KCkgY29uc3QgeyByZXR1cm4g
bV9zaGVldDsgfQotICAgICAgICAKLSAgICAgICAgdmlydHVhbCB2b2lkIHJlZihDYWNoZWRPYmpl
Y3RDbGllbnQgKmNvbnN1bWVyKTsKLSAgICAgICAgdmlydHVhbCB2b2lkIGRlcmVmKENhY2hlZE9i
amVjdENsaWVudCAqY29uc3VtZXIpOwotICAgICAgICAKLSAgICAgICAgdmlydHVhbCB2b2lkIHNl
dENoYXJzZXQoY29uc3QgUVN0cmluZyAmY2hzKTsKLSAgICAgICAgdmlydHVhbCB2b2lkIGRhdGEo
UUJ1ZmZlciAmYnVmZmVyLCBib29sIGVvZik7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBlcnJvcihp
bnQgZXJyLCBjb25zdCBjaGFyICp0ZXh0KTsKLSAgICAgICAgCi0gICAgICAgIHZpcnR1YWwgYm9v
bCBzY2hlZHVsZSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLSAgICAgICAgCi0gICAgICAgIHZv
aWQgY2hlY2tOb3RpZnkoKTsKLSAgICAgICAgCi1wcm90ZWN0ZWQ6Ci0gICAgICAgIERPTTo6RE9N
U3RyaW5nIG1fc2hlZXQ7Ci0gICAgICAgIFJlZlB0cjxEZWNvZGVyPiBtX2RlY29kZXI7Ci0gICAg
fTsKLSNlbmRpZgorICAgIGNsYXNzIENhY2hlZE9iamVjdENsaWVudDsKICAgICAKICNpZm5kZWYg
S0hUTUxfTk9fWEJMCiAgICAgY2xhc3MgQ2FjaGVkWEJMRG9jdW1lbnQgOiBwdWJsaWMgQ2FjaGVk
T2JqZWN0CkBAIC00NDUsMjY4ICs2NCw4IEBAIHByb3RlY3RlZDoKICAgICAgICAgWEJMOjpYQkxE
b2N1bWVudEltcGwqIG1fZG9jdW1lbnQ7CiAgICAgICAgIFJlZlB0cjxEZWNvZGVyPiBtX2RlY29k
ZXI7CiAgICAgfTsKLSNlbmRpZgotCi0gICAgLyoqCi0gICAgICogQGludGVybmFsCi0gICAgICoK
LSAgICAgKiBNYW5hZ2VzIHRoZSBsb2FkaW5nIG9mIHNjcmlwdHMvaW1hZ2VzL3N0eWxlc2hlZXRz
IGZvciBhIHBhcnRpY3VsYXIgZG9jdW1lbnQKLSAgICAgKi8KLSAgICBjbGFzcyBEb2NMb2FkZXIK
LSAgICB7Ci0gICAgcHVibGljOgotIAlEb2NMb2FkZXIoS0hUTUxQYXJ0KiwgRE9NOjpEb2N1bWVu
dEltcGwqKTsKLSAJfkRvY0xvYWRlcigpOwotCi0JQ2FjaGVkSW1hZ2UgKnJlcXVlc3RJbWFnZSgg
Y29uc3QgRE9NOjpET01TdHJpbmcgJnVybCk7Ci0JQ2FjaGVkQ1NTU3R5bGVTaGVldCAqcmVxdWVz
dFN0eWxlU2hlZXQoIGNvbnN0IERPTTo6RE9NU3RyaW5nICZ1cmwsIGNvbnN0IFFTdHJpbmcmIGNo
YXJzZXQpOwotICAgICAgICBDYWNoZWRTY3JpcHQgKnJlcXVlc3RTY3JpcHQoIGNvbnN0IERPTTo6
RE9NU3RyaW5nICZ1cmwsIGNvbnN0IFFTdHJpbmcmIGNoYXJzZXQpOwotCi0jaWZkZWYgS0hUTUxf
WFNMVAotICAgICAgICBDYWNoZWRYU0xTdHlsZVNoZWV0KiByZXF1ZXN0WFNMU3R5bGVTaGVldChj
b25zdCBET006OkRPTVN0cmluZyYgdXJsKTsKLSNlbmRpZgotI2lmbmRlZiBLSFRNTF9OT19YQkwK
LSAgICAgICAgQ2FjaGVkWEJMRG9jdW1lbnQqIHJlcXVlc3RYQkxEb2N1bWVudChjb25zdCBET006
OkRPTVN0cmluZyAmdXJsKTsKLSNlbmRpZgotCi0JYm9vbCBhdXRvbG9hZEltYWdlcygpIGNvbnN0
IHsgcmV0dXJuIG1fYmF1dG9sb2FkSW1hZ2VzOyB9Ci0gICAgICAgIEtJTzo6Q2FjaGVDb250cm9s
IGNhY2hlUG9saWN5KCkgY29uc3QgeyByZXR1cm4gbV9jYWNoZVBvbGljeTsgfQotICAgICAgICBL
SFRNTFNldHRpbmdzOjpLQW5pbWF0aW9uQWR2aWNlIHNob3dBbmltYXRpb25zKCkgY29uc3QgeyBy
ZXR1cm4gbV9zaG93QW5pbWF0aW9uczsgfQotICAgICAgICB0aW1lX3QgZXhwaXJlRGF0ZSgpIGNv
bnN0IHsgcmV0dXJuIG1fZXhwaXJlRGF0ZTsgfQotICAgICAgICBLSFRNTFBhcnQqIHBhcnQoKSBj
b25zdCB7IHJldHVybiBtX3BhcnQ7IH0KLSAgICAgICAgRE9NOjpEb2N1bWVudEltcGwqIGRvYygp
IGNvbnN0IHsgcmV0dXJuIG1fZG9jOyB9Ci0KLSAgICAgICAgdm9pZCBzZXRFeHBpcmVEYXRlKCB0
aW1lX3QgKTsKLSAgICAgICAgdm9pZCBzZXRBdXRvbG9hZEltYWdlcyggYm9vbCApOwotICAgICAg
ICB2b2lkIHNldENhY2hlUG9saWN5KCBLSU86OkNhY2hlQ29udHJvbCBjYWNoZVBvbGljeSApOwot
ICAgICAgICB2b2lkIHNldFNob3dBbmltYXRpb25zKCBLSFRNTFNldHRpbmdzOjpLQW5pbWF0aW9u
QWR2aWNlICk7Ci0gICAgICAgIHZvaWQgcmVtb3ZlQ2FjaGVkT2JqZWN0KCBDYWNoZWRPYmplY3Qq
KSBjb25zdDsKLQkJCi0gICAgICAgIHZvaWQgc2V0TG9hZEluUHJvZ3Jlc3MoYm9vbCk7Ci0gICAg
ICAgIGJvb2wgbG9hZEluUHJvZ3Jlc3MoKSBjb25zdCB7IHJldHVybiBtX2xvYWRJblByb2dyZXNz
OyB9Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBib29sIG5lZWRSZWxvYWQoY29uc3QgS1VSTCAm
ZnVsbFVybCk7Ci0KLSAgICAgICAgZnJpZW5kIGNsYXNzIENhY2hlOwotICAgICAgICBmcmllbmQg
Y2xhc3MgRE9NOjpEb2N1bWVudEltcGw7Ci0KLSAgICAgICAgUVN0cmluZ0xpc3QgbV9yZWxvYWRl
ZFVSTHM7Ci0gICAgICAgIG11dGFibGUgUVB0ckxpc3Q8Q2FjaGVkT2JqZWN0PiBtX2RvY09iamVj
dHM7Ci0JdGltZV90IG1fZXhwaXJlRGF0ZTsKLQlLSU86OkNhY2hlQ29udHJvbCBtX2NhY2hlUG9s
aWN5OwotICAgICAgICBib29sIG1fYmF1dG9sb2FkSW1hZ2VzIDogMTsKLSAgICAgICAgS0hUTUxT
ZXR0aW5nczo6S0FuaW1hdGlvbkFkdmljZSBtX3Nob3dBbmltYXRpb25zIDogMjsKLSAgICAgICAg
S0hUTUxQYXJ0KiBtX3BhcnQ7Ci0gICAgICAgIERPTTo6RG9jdW1lbnRJbXBsICptX2RvYzsKLSAg
ICAgICAgYm9vbCBtX2xvYWRJblByb2dyZXNzOwotICAgIH07Ci0KLSAgICAvKioKLSAgICAgKiBA
aW50ZXJuYWwKLSAgICAgKi8KLSAgICBjbGFzcyBSZXF1ZXN0Ci0gICAgewotICAgIHB1YmxpYzoK
LQlSZXF1ZXN0KERvY0xvYWRlciogZGwsIENhY2hlZE9iamVjdCAqX29iamVjdCwgYm9vbCBfaW5j
cmVtZW50YWwpOwotCX5SZXF1ZXN0KCk7Ci0JYm9vbCBpbmNyZW1lbnRhbDsKLQlRQnVmZmVyIG1f
YnVmZmVyOwotCUNhY2hlZE9iamVjdCAqb2JqZWN0OwotICAgICAgICBEb2NMb2FkZXIqIG1fZG9j
TG9hZGVyOwotICAgICAgICBib29sIG11bHRpcGFydDsKLSAgICAgfTsKLQotICAgIC8qKgotICAg
ICAqIEBpbnRlcm5hbAotICAgICAqLwotICAgIGNsYXNzIExvYWRlciA6IHB1YmxpYyBRT2JqZWN0
Ci0gICAgewotCVFfT0JKRUNUCi0KLSAgICBwdWJsaWM6CQotCUxvYWRlcigpOwotCX5Mb2FkZXIo
KTsKLQotCXZvaWQgbG9hZChEb2NMb2FkZXIqIGRsLCBDYWNoZWRPYmplY3QgKm9iamVjdCwgYm9v
bCBpbmNyZW1lbnRhbCA9IHRydWUpOwotCi0gICAgICAgIGludCBudW1SZXF1ZXN0cyggRG9jTG9h
ZGVyKiBkbCApIGNvbnN0OwotICAgICAgICB2b2lkIGNhbmNlbFJlcXVlc3RzKCBEb2NMb2FkZXIq
IGRsICk7Ci0KLQl2b2lkIHJlbW92ZUJhY2tncm91bmREZWNvZGluZ1JlcXVlc3QgKFJlcXVlc3Qg
KnIpOwotCQotICAgICAgICAvLyBtYXkgcmV0dXJuIDBMCi0gICAgICAgIEtJTzo6Sm9iICpqb2JG
b3JSZXF1ZXN0KCBjb25zdCBET006OkRPTVN0cmluZyAmdXJsICkgY29uc3Q7Ci0KLSAgICAgICAg
S1dRTG9hZGVyICprd3E7Ci0KLSAgICBzaWduYWxzOgotCWZyaWVuZCBjbGFzcyBDYWNoZWRJbWFn
ZUNhbGxiYWNrOwotCi0gICAgICAgIHZvaWQgcmVxdWVzdFN0YXJ0ZWQoIGtodG1sOjpEb2NMb2Fk
ZXIqIGRsLCBraHRtbDo6Q2FjaGVkT2JqZWN0KiBvYmogKTsKLQl2b2lkIHJlcXVlc3REb25lKCBr
aHRtbDo6RG9jTG9hZGVyKiBkbCwga2h0bWw6OkNhY2hlZE9iamVjdCAqb2JqICk7Ci0Jdm9pZCBy
ZXF1ZXN0RmFpbGVkKCBraHRtbDo6RG9jTG9hZGVyKiBkbCwga2h0bWw6OkNhY2hlZE9iamVjdCAq
b2JqICk7Ci0KLSAgICBwcm90ZWN0ZWQgc2xvdHM6Ci0gICAgICAgIHZvaWQgc2xvdEZpbmlzaGVk
KCBLSU86OkpvYiAqICwgTlNEYXRhICphbGxEYXRhKTsKLQl2b2lkIHNsb3REYXRhKCBLSU86Okpv
YiAqLCBjb25zdCBjaGFyICpkYXRhLCBpbnQgc2l6ZSApOwotICAgICAgICB2b2lkIHNsb3RSZWNl
aXZlZFJlc3BvbnNlICggS0lPOjpKb2IgKiwgTlNVUkxSZXNwb25zZSAqcmVzcG9uc2UgKTsKLQot
ICAgIHByaXZhdGU6Ci0Jdm9pZCBzZXJ2ZVBlbmRpbmdSZXF1ZXN0cygpOwotCi0gICAgICAgIHZp
cnR1YWwgYm9vbCBpc0tIVE1MTG9hZGVyKCkgY29uc3Q7Ci0KLQlRUHRyTGlzdDxSZXF1ZXN0PiBt
X3JlcXVlc3RzUGVuZGluZzsKLQlRUHRyRGljdDxSZXF1ZXN0PiBtX3JlcXVlc3RzTG9hZGluZzsK
LQotCVFQdHJMaXN0PFJlcXVlc3Q+IG1fcmVxdWVzdHNCYWNrZ3JvdW5kRGVjb2Rpbmc7Ci0KLSNp
ZmRlZiBIQVZFX0xJQkpQRUcKLSAgICAgICAgS0pQRUdGb3JtYXRUeXBlIG1fanBlZ2xvYWRlcjsK
LSNlbmRpZgotICAgIH07Ci0KLSAgICAgICAgLyoqCi0gICAgICogQGludGVybmFsCi0gICAgICoK
LSAgICAgKiBQcm92aWRlcyBhIGNhY2hlL2xvYWRlciBmb3Igb2JqZWN0cyBuZWVkZWQgZm9yIGRp
c3BsYXlpbmcgdGhlIGh0bWwgcGFnZS4KLSAgICAgKiBBdCB0aGUgbW9tZW50IHRoZXNlIGFyZSBz
dHlsZXNoZWV0cywgc2NyaXB0cyBhbmQgaW1hZ2VzCi0gICAgICovCi0gICAgY2xhc3MgQ2FjaGUK
LSAgICB7Ci0JZnJpZW5kIGNsYXNzIERvY0xvYWRlcjsKLSAgICBwdWJsaWM6Ci0JLyoqCi0JICog
aW5pdCB0aGUgY2FjaGUgaW4gY2FzZSBpdCdzIG5vdCBhbHJlYWR5LiBUaGlzIG5lZWRzIHRvIGdl
dCBjYWxsZWQgb25jZQotCSAqIGJlZm9yZSB1c2luZyBpdC4KLQkgKi8KLQlzdGF0aWMgdm9pZCBp
bml0KCk7Ci0gICAgICAgIAotCS8qKgotCSAqIEFzayB0aGUgY2FjaGUgZm9yIHNvbWUgdXJsLiBX
aWxsIHJldHVybiBhIGNhY2hlZE9iamVjdCwgYW5kCi0JICogbG9hZCB0aGUgcmVxdWVzdGVkIGRh
dGEgaW4gY2FzZSBpdCdzIG5vdCBjYWhjZWQKLSAgICAgICAgICogaWYgdGhlIERvY0xvYWRlciBp
cyB6ZXJvLCB0aGUgdXJsIG11c3QgYmUgZnVsbC1xdWFsaWZpZWQuCi0gICAgICAgICAqIE90aGVy
d2lzZSwgaXQgaXMgYXV0b21hdGljYWxseSBiYXNlLXVybCBleHBhbmRlZAotCSAqLwotCXN0YXRp
YyBDYWNoZWRJbWFnZSAqcmVxdWVzdEltYWdlKCBEb2NMb2FkZXIqIGwsIGNvbnN0IERPTTo6RE9N
U3RyaW5nICZ1cmwsIGJvb2wgcmVsb2FkPWZhbHNlLCB0aW1lX3QgX2V4cGlyZURhdGU9MCk7Ci0g
ICAgICAgIHN0YXRpYyBDYWNoZWRJbWFnZSAqcmVxdWVzdEltYWdlKCBEb2NMb2FkZXIqIGwsIGNv
bnN0IEtVUkwgJnVybCwgYm9vbCByZWxvYWQ9ZmFsc2UsIHRpbWVfdCBfZXhwaXJlRGF0ZT0wKTsK
LQotCS8qKgotCSAqIEFzayB0aGUgY2FjaGUgZm9yIHNvbWUgdXJsLiBXaWxsIHJldHVybiBhIGNh
Y2hlZE9iamVjdCwgYW5kCi0JICogbG9hZCB0aGUgcmVxdWVzdGVkIGRhdGEgaW4gY2FzZSBpdCdz
IG5vdCBjYWNoZWQKLQkgKi8KLQlzdGF0aWMgQ2FjaGVkQ1NTU3R5bGVTaGVldCAqcmVxdWVzdFN0
eWxlU2hlZXQoIERvY0xvYWRlciogbCwgY29uc3QgRE9NOjpET01TdHJpbmcgJnVybCwgYm9vbCBy
ZWxvYWQ9ZmFsc2UsIHRpbWVfdCBfZXhwaXJlRGF0ZT0wLCBjb25zdCBRU3RyaW5nJiBjaGFyc2V0
ID0gUVN0cmluZzo6bnVsbCk7CiAKLSNpZmRlZiBLSFRNTF9YU0xUCi0gICAgICAgIC8vIEFzayB0
aGUgY2FjaGUgZm9yIGFuIFhTTCBzdHlsZXNoZWV0LgotICAgICAgICBzdGF0aWMgQ2FjaGVkWFNM
U3R5bGVTaGVldCogcmVxdWVzdFhTTFN0eWxlU2hlZXQoRG9jTG9hZGVyKiBsLCBjb25zdCBET006
OkRPTVN0cmluZyAmdXJsLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGJvb2wgcmVsb2FkPWZhbHNlLCB0aW1lX3QgX2V4cGlyZURhdGU9
MCk7CiAjZW5kaWYKLSNpZm5kZWYgS0hUTUxfTk9fWEJMCi0gICAgICAgIC8vIEFzayB0aGUgY2Fj
aGUgZm9yIGFuIFhCTCBkb2N1bWVudC4KLSAgICAgICAgc3RhdGljIENhY2hlZFhCTERvY3VtZW50
KiByZXF1ZXN0WEJMRG9jdW1lbnQoRG9jTG9hZGVyKiBsLCBjb25zdCBET006OkRPTVN0cmluZyAm
dXJsLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgYm9vbCByZWxvYWQ9ZmFsc2UsIHRpbWVfdCBfZXhwaXJlRGF0ZT0wKTsKLSNlbmRpZgotCi0g
ICAgICAgIC8qKgotICAgICAgICAgKiBQcmUtbG9hZHMgYSBzdHlsZXNoZWV0IGludG8gdGhlIGNh
Y2hlLgotICAgICAgICAgKi8KLSAgICAgICAgc3RhdGljIHZvaWQgcHJlbG9hZFN0eWxlU2hlZXQo
Y29uc3QgUVN0cmluZyAmdXJsLCBjb25zdCBRU3RyaW5nICZzdHlsZXNoZWV0X2RhdGEpOwotCi0J
LyoqCi0JICogQXNrIHRoZSBjYWNoZSBmb3Igc29tZSB1cmwuIFdpbGwgcmV0dXJuIGEgY2FjaGVk
T2JqZWN0LCBhbmQKLQkgKiBsb2FkIHRoZSByZXF1ZXN0ZWQgZGF0YSBpbiBjYXNlIGl0J3Mgbm90
IGNhaGNlZAotCSAqLwotCXN0YXRpYyBDYWNoZWRTY3JpcHQgKnJlcXVlc3RTY3JpcHQoIERvY0xv
YWRlciogbCwgY29uc3QgRE9NOjpET01TdHJpbmcgJnVybCwgYm9vbCByZWxvYWQ9ZmFsc2UsIHRp
bWVfdCBfZXhwaXJlRGF0ZT0wLCBjb25zdCBRU3RyaW5nJiBjaGFyc2V0PVFTdHJpbmc6Om51bGwp
OwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBQcmUtbG9hZHMgYSBzY3JpcHQgaW50byB0aGUg
Y2FjaGUuCi0gICAgICAgICAqLwotICAgICAgICBzdGF0aWMgdm9pZCBwcmVsb2FkU2NyaXB0KGNv
bnN0IFFTdHJpbmcgJnVybCwgY29uc3QgUVN0cmluZyAmc2NyaXB0X2RhdGEpOwotCi0JLyoqCi0J
ICogc2V0cyB0aGUgc2l6ZSBvZiB0aGUgY2FjaGUuIFRoaXMgd2lsbCBvbmx5IGhvZCBhcHByb3hp
bWF0ZWx5LCBzaW5jZSB0aGUgc2l6ZSBzb21lCi0JICogY2FjaGVkIG9iamVjdHMgKGxpa2Ugc3R5
bGVzaGVldHMpIHRha2UgdXAgaW4gbWVtb3J5IGlzIG5vdCBleGFjbHR5IGtub3duLgotCSAqLwot
CXN0YXRpYyB2b2lkIHNldFNpemUoIGludCBieXRlcyApOwotCS8qKgotCSAqIHJldHVybnMgdGhl
IHNpemUgb2YgdGhlIGNhY2hlCi0JICovCi0Jc3RhdGljIGludCBzaXplKCkgeyByZXR1cm4gbWF4
U2l6ZTsgfTsKLQotICAgICAgICBzdGF0aWMgaW50IG1heENhY2hlYWJsZU9iamVjdFNpemUoKSB7
IHJldHVybiBtYXhDYWNoZWFibGU7IH0KLQotCS8qKgotCSAqIGNsZWFuIHVwIGNhY2hlCi0JICov
Ci0Jc3RhdGljIHZvaWQgZmx1c2goYm9vbCBmb3JjZT1mYWxzZSk7Ci0KLQkvKioKLQkgKiBjbGVh
cnMgdGhlIGNhY2hlCi0JICogV2FybmluZzogY2FsbCB0aGlzIG9ubHkgYXQgdGhlIGVuZCBvZiB5
b3VyIHByb2dyYW0sIHRvIGNsZWFuCi0JICogdXAgbWVtb3J5ICh1c2VmdWwgZm9yIGZpbmRpbmcg
bWVtb3J5IGhvbGVzKQotCSAqLwotCXN0YXRpYyB2b2lkIGNsZWFyKCk7Ci0KLQlzdGF0aWMgTG9h
ZGVyICpsb2FkZXIoKSB7IHJldHVybiBtX2xvYWRlcjsgfQotCi0gICAgCXN0YXRpYyBRUGl4bWFw
ICpudWxsUGl4bWFwOwotICAgICAgICBzdGF0aWMgUVBpeG1hcCAqYnJva2VuUGl4bWFwOwotCi0g
ICAgICAgIHN0YXRpYyB2b2lkIHJlbW92ZUNhY2hlRW50cnkoIENhY2hlZE9iamVjdCAqb2JqZWN0
ICk7Ci0KLSAgICAgICAgc3RydWN0IFR5cGVTdGF0aXN0aWMgewotICAgICAgICAgICAgaW50IGNv
dW50OwotICAgICAgICAgICAgaW50IHNpemU7Ci0gICAgICAgICAgICBUeXBlU3RhdGlzdGljKCkg
OiBjb3VudCgwKSwgc2l6ZSgwKSB7IH0KLSAgICAgICAgfTsKLSAgICAgICAgCi0gICAgICAgIHN0
cnVjdCBTdGF0aXN0aWNzIHsKLSAgICAgICAgICAgIFR5cGVTdGF0aXN0aWMgaW1hZ2VzOwotICAg
ICAgICAgICAgVHlwZVN0YXRpc3RpYyBtb3ZpZXM7Ci0gICAgICAgICAgICBUeXBlU3RhdGlzdGlj
IHN0eWxlU2hlZXRzOwotICAgICAgICAgICAgVHlwZVN0YXRpc3RpYyBzY3JpcHRzOwotI2lmZGVm
IEtIVE1MX1hTTFQKLSAgICAgICAgICAgIFR5cGVTdGF0aXN0aWMgeHNsU3R5bGVTaGVldHM7Ci0j
ZW5kaWYKLSNpZm5kZWYgS0hUTUxfTk9fWEJMCi0gICAgICAgICAgICBUeXBlU3RhdGlzdGljIHhi
bERvY3M7Ci0jZW5kaWYKLSAgICAgICAgICAgIFR5cGVTdGF0aXN0aWMgb3RoZXI7Ci0gICAgICAg
IH07Ci0KLSAgICAgICAgc3RhdGljIFN0YXRpc3RpY3MgZ2V0U3RhdGlzdGljcygpOwotICAgICAg
ICBzdGF0aWMgdm9pZCBmbHVzaEFsbCgpOwotICAgICAgICBzdGF0aWMgdm9pZCBzZXRDYWNoZURp
c2FibGVkKGJvb2wpOwotCi0gICAgICAgIHN0YXRpYyB2b2lkIGluc2VydEluTFJVTGlzdChDYWNo
ZWRPYmplY3QgKik7Ci0gICAgICAgIHN0YXRpYyB2b2lkIHJlbW92ZUZyb21MUlVMaXN0KENhY2hl
ZE9iamVjdCAqKTsKLSAgICAgICAgc3RhdGljIGJvb2wgYWRqdXN0U2l6ZShDYWNoZWRPYmplY3Qg
KiwgaW50IHNpemVEZWx0YSk7Ci0gICAgICAgIAotICAgICAgICBzdGF0aWMgTFJVTGlzdCogZ2V0
TFJVTGlzdEZvcihDYWNoZWRPYmplY3QqIG8pOwotICAgICAgICAKLSAgICAgICAgc3RhdGljIHZv
aWQgY2hlY2tMUlVBbmRVbmNhY2hlYWJsZUxpc3RJbnRlZ3JpdHkoKTsKLQotICAgIHByb3RlY3Rl
ZDoKLSAgICAgICAgc3RhdGljIFFEaWN0PENhY2hlZE9iamVjdD4gKmNhY2hlOwotICAgICAgICBz
dGF0aWMgUVB0ckxpc3Q8RG9jTG9hZGVyPiogZG9jbG9hZGVyOwotICAgIAotICAgICAgICBzdGF0
aWMgaW50IG1heFNpemU7Ci0gICAgICAgIHN0YXRpYyBpbnQgbWF4Q2FjaGVhYmxlOwotICAgICAg
ICBzdGF0aWMgaW50IGZsdXNoQ291bnQ7Ci0gICAgCi0gICAgICAgIHN0YXRpYyBMb2FkZXIgKm1f
bG9hZGVyOwotICAgIAotICAgICAgICBzdGF0aWMgdm9pZCBtb3ZlVG9IZWFkT2ZMUlVMaXN0KENh
Y2hlZE9iamVjdCAqKTsKLSAgICAKLSAgICAgICAgc3RhdGljIExSVUxpc3QgKm1fTFJVTGlzdHM7
Ci0gICAgICAgIHN0YXRpYyBpbnQgbV90b3RhbFNpemVPZkxSVUxpc3RzOwotICAgICAgICAgICAg
Ci0gICAgICAgIHN0YXRpYyBDYWNoZWRPYmplY3QgKm1faGVhZE9mVW5jYWNoZWFibGVMaXN0Owot
ICAgICAgICAgICAgCi0gICAgICAgIHN0YXRpYyBpbnQgbV9jb3VudE9mTFJVQW5kVW5jYWNoZWFi
bGVMaXN0czsKLSAgICB9OwogCiB9OwogCkluZGV4OiBtaXNjL0NhY2hlZENTU1N0eWxlU2hlZXQu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIG1pc2MvQ2FjaGVkQ1NTU3R5bGVTaGVldC5jcHAJKHJldmlzaW9u
IDExOTQ4KQorKysgbWlzYy9DYWNoZWRDU1NTdHlsZVNoZWV0LmNwcAkod29ya2luZyBjb3B5KQpA
QCAtMjUsMTM3ICsyNSwxNiBAQAogICAgIHBhZ2VzIGZyb20gdGhlIHdlYi4gSXQgaGFzIGEgbWVt
b3J5IGNhY2hlIGZvciB0aGVzZSBvYmplY3RzLgogKi8KIAotI3VuZGVmIENBQ0hFX0RFQlVHCi0v
LyNkZWZpbmUgQ0FDSEVfREVCVUcKICNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlIDxhc3Nl
cnQuaD4KKyNpbmNsdWRlICJDYWNoZWRDU1NTdHlsZVNoZWV0LmgiCisjaW5jbHVkZSAiQ2FjaGUu
aCIKKyNpbmNsdWRlICJDYWNoZWRPYmplY3RDbGllbnRXYWxrZXIuaCIKIAotI2luY2x1ZGUgImxv
YWRlci5oIgotCi0vLyB1cCB0byB3aGljaCBzaXplIGlzIGEgcGljdHVyZSBmb3Igc3VyZSBjYWNo
ZWFibGUKLSNkZWZpbmUgTUFYQ0FDSEVBQkxFIDQwKjEwMjQKLS8vIGRlZmF1bHQgY2FjaGUgc2l6
ZQotI2RlZmluZSBERUZDQUNIRVNJWkUgNDA5NioxMDI0Ci0KLSNpbmNsdWRlIDxxYXN5bmNpby5o
PgotI2luY2x1ZGUgPHFwYWludGVyLmg+Ci0KLSNpbmNsdWRlIDxraW8vam9iLmg+Ci0jaW5jbHVk
ZSA8a2lvL2pvYmNsYXNzZXMuaD4KLSNpbmNsdWRlIDxraW1hZ2Vpby5oPgotI2luY2x1ZGUgPGtj
aGFyc2V0cy5oPgotI2luY2x1ZGUgPGtkZWJ1Zy5oPgotI2luY2x1ZGUgImtodG1sX2ZhY3Rvcnku
aCIKLSNpbmNsdWRlICJraHRtbF9wYXJ0LmgiCi0jaW5jbHVkZSAiZGVjb2Rlci5oIgotCi0jaW5j
bHVkZSAiaHRtbC9odG1sX2RvY3VtZW50aW1wbC5oIgotI2luY2x1ZGUgImNzcy9jc3Nfc3R5bGVz
aGVldGltcGwuaCIKLQotI2lmbmRlZiBLSFRNTF9OT19YQkwKLSNpbmNsdWRlICJ4YmwveGJsX2Rv
Y2ltcGwuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8a3htbGNvcmUvQXNzZXJ0aW9ucy5oPgogI2lu
Y2x1ZGUgIktXUUxvYWRlci5oIgogCi11c2luZyBuYW1lc3BhY2Uga2h0bWw7CiB1c2luZyBuYW1l
c3BhY2UgRE9NOwogCi1zdGF0aWMgYm9vbCBjYWNoZURpc2FibGVkOwotCi0vLyBDYWxsIHRoaXMg
IndhbGtlciIgaW5zdGVhZCBvZiBpdGVyYXRvciBzbyBwZW9wbGUgd29uJ3QgZXhwZWN0IFF0IG9y
IFNUTC1zdHlsZSBpdGVyYXRvciBpbnRlcmZhY2UuCi0vLyBKdXN0IGtlZXAgY2FsbGluZyBuZXh0
KCkgb24gdGhpcy4gSXQncyBzYWZlIGZyb20gZGVsZXRpb25zIG9mIHRoZSBjdXJyZW50IGl0ZW0K
LWNsYXNzIENhY2hlZE9iamVjdENsaWVudFdhbGtlciB7Ci1wdWJsaWM6Ci0gICAgQ2FjaGVkT2Jq
ZWN0Q2xpZW50V2Fsa2VyKGNvbnN0IFFQdHJEaWN0PENhY2hlZE9iamVjdENsaWVudD4gJmNsaWVu
dHMpIDogX2N1cnJlbnQoMCksIF9pdGVyYXRvcihjbGllbnRzKSB7IH0KLSAgICBDYWNoZWRPYmpl
Y3RDbGllbnQgKm5leHQoKTsKLXByaXZhdGU6Ci0gICAgQ2FjaGVkT2JqZWN0Q2xpZW50ICpfY3Vy
cmVudDsKLSAgICBRUHRyRGljdEl0ZXJhdG9yPENhY2hlZE9iamVjdENsaWVudD4gX2l0ZXJhdG9y
OwotfTsKLQotQ2FjaGVkT2JqZWN0Ojp+Q2FjaGVkT2JqZWN0KCkKLXsKLSAgICBpZihtX2RlbGV0
ZWQpIGFib3J0KCk7Ci0gICAgQ2FjaGU6OnJlbW92ZUZyb21MUlVMaXN0KHRoaXMpOwotICAgIG1f
ZGVsZXRlZCA9IHRydWU7Ci0gICAgc2V0UmVzcG9uc2UoMCk7Ci0gICAgc2V0QWxsRGF0YSgwKTsK
LX0KLQotdm9pZCBDYWNoZWRPYmplY3Q6OmZpbmlzaCgpCi17Ci0gICAgaWYgKG1fc2l6ZSA+IENh
Y2hlOjptYXhDYWNoZWFibGVPYmplY3RTaXplKCkpCi0gICAgICAgIG1fc3RhdHVzID0gVW5jYWNo
ZWFibGU7Ci0gICAgZWxzZQotICAgICAgICBtX3N0YXR1cyA9IENhY2hlZDsKLSAgICBLVVJMIHVy
bChtX3VybC5xc3RyaW5nKCkpOwotICAgIGlmIChtX2V4cGlyZURhdGVDaGFuZ2VkICYmIHVybC5w
cm90b2NvbCgpLnN0YXJ0c1dpdGgoImh0dHAiKSkKLSAgICAgICAgbV9leHBpcmVEYXRlQ2hhbmdl
ZCA9IGZhbHNlOwotfQotCi12b2lkIENhY2hlZE9iamVjdDo6c2V0RXhwaXJlRGF0ZSh0aW1lX3Qg
X2V4cGlyZURhdGUsIGJvb2wgY2hhbmdlSHR0cENhY2hlKQotewotICAgIGlmICggX2V4cGlyZURh
dGUgPT0gbV9leHBpcmVEYXRlKQotICAgICAgICByZXR1cm47Ci0KLSAgICBpZiAobV9zdGF0dXMg
PT0gVW5jYWNoZWFibGUgfHwgbV9zdGF0dXMgPT0gQ2FjaGVkKQotICAgIHsKLSAgICAgICAgZmlu
aXNoKCk7Ci0gICAgfQotICAgIG1fZXhwaXJlRGF0ZSA9IF9leHBpcmVEYXRlOwotICAgIGlmIChj
aGFuZ2VIdHRwQ2FjaGUgJiYgbV9leHBpcmVEYXRlKQotICAgICAgIG1fZXhwaXJlRGF0ZUNoYW5n
ZWQgPSB0cnVlOwotfQotCi1ib29sIENhY2hlZE9iamVjdDo6aXNFeHBpcmVkKCkgY29uc3QKLXsK
LSAgICBpZiAoIW1fZXhwaXJlRGF0ZSkgcmV0dXJuIGZhbHNlOwotICAgIHRpbWVfdCBub3cgPSB0
aW1lKDApOwotICAgIHJldHVybiAoZGlmZnRpbWUobm93LCBtX2V4cGlyZURhdGUpID49IDApOwot
fQotCi12b2lkIENhY2hlZE9iamVjdDo6c2V0UmVxdWVzdChSZXF1ZXN0ICpfcmVxdWVzdCkKLXsK
LSAgICBpZiAoIF9yZXF1ZXN0ICYmICFtX3JlcXVlc3QgKQotICAgICAgICBtX3N0YXR1cyA9IFBl
bmRpbmc7Ci0gICAgbV9yZXF1ZXN0ID0gX3JlcXVlc3Q7Ci0gICAgaWYgKGNhbkRlbGV0ZSgpICYm
IG1fZnJlZSkKLSAgICAgICAgZGVsZXRlIHRoaXM7Ci0gICAgZWxzZSBpZiAoYWxsb3dJbkxSVUxp
c3QoKSkKLSAgICAgICAgQ2FjaGU6Omluc2VydEluTFJVTGlzdCh0aGlzKTsKLX0KLQotdm9pZCBD
YWNoZWRPYmplY3Q6OnJlZihDYWNoZWRPYmplY3RDbGllbnQgKmMpCi17Ci0gICAgbV9jbGllbnRz
Lmluc2VydChjLCBjKTsKLSAgICBDYWNoZTo6cmVtb3ZlRnJvbUxSVUxpc3QodGhpcyk7Ci0gICAg
aW5jcmVhc2VBY2Nlc3NDb3VudCgpOwotfQotCi12b2lkIENhY2hlZE9iamVjdDo6ZGVyZWYoQ2Fj
aGVkT2JqZWN0Q2xpZW50ICpjKQotewotICAgIG1fY2xpZW50cy5yZW1vdmUoYyk7Ci0gICAgaWYg
KGFsbG93SW5MUlVMaXN0KCkpCi0gICAgICAgIENhY2hlOjppbnNlcnRJbkxSVUxpc3QodGhpcyk7
Ci19Ci0KLXZvaWQgQ2FjaGVkT2JqZWN0OjpzZXRTaXplKGludCBzaXplKQotewotICAgIGJvb2wg
c2l6ZUNoYW5nZWQgPSBDYWNoZTo6YWRqdXN0U2l6ZSh0aGlzLCBzaXplIC0gbV9zaXplKTsKLQot
ICAgIC8vIFRoZSBvYmplY3QgbXVzdCBub3cgYmUgbW92ZWQgdG8gYSBkaWZmZXJlbnQgcXVldWUs
IHNpbmNlIGl0cyBzaXplIGhhcyBiZWVuIGNoYW5nZWQuCi0gICAgaWYgKHNpemVDaGFuZ2VkICYm
IGFsbG93SW5MUlVMaXN0KCkpCi0gICAgICAgIENhY2hlOjpyZW1vdmVGcm9tTFJVTGlzdCh0aGlz
KTsKLQotICAgIG1fc2l6ZSA9IHNpemU7Ci0gICAgCi0gICAgaWYgKHNpemVDaGFuZ2VkICYmIGFs
bG93SW5MUlVMaXN0KCkpCi0gICAgICAgIENhY2hlOjppbnNlcnRJbkxSVUxpc3QodGhpcyk7Ci19
Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK25hbWVzcGFjZSBraHRt
bCB7CiAKIENhY2hlZENTU1N0eWxlU2hlZXQ6OkNhY2hlZENTU1N0eWxlU2hlZXQoRG9jTG9hZGVy
KiBkbCwgY29uc3QgRE9NU3RyaW5nICZ1cmwsIEtJTzo6Q2FjaGVDb250cm9sIF9jYWNoZVBvbGlj
eSwgdGltZV90IF9leHBpcmVEYXRlLCBjb25zdCBRU3RyaW5nJiBjaGFyc2V0KQogICAgIDogQ2Fj
aGVkT2JqZWN0KHVybCwgQ1NTU3R5bGVTaGVldCwgX2NhY2hlUG9saWN5LCBfZXhwaXJlRGF0ZSks
IG1fY29kZWMoMCkKQEAgLTE4MCw3ICs1OSw2IEBAIENhY2hlZENTU1N0eWxlU2hlZXQ6OkNhY2hl
ZENTU1N0eWxlU2hlZXQKICAgICBtX3NoZWV0ID0gRE9NU3RyaW5nKHN0eWxlc2hlZXRfZGF0YSk7
CiB9CiAKLQogQ2FjaGVkQ1NTU3R5bGVTaGVldDo6fkNhY2hlZENTU1N0eWxlU2hlZXQoKQogewog
fQpAQCAtMjM1LDE2NDkgKzExMywxMCBAQCB2b2lkIENhY2hlZENTU1N0eWxlU2hlZXQ6OmNoZWNr
Tm90aWZ5KCkKICAgICB9CiB9CiAKLQogdm9pZCBDYWNoZWRDU1NTdHlsZVNoZWV0OjplcnJvcigg
aW50IC8qZXJyKi8sIGNvbnN0IGNoYXIgKi8qdGV4dCovICkKIHsKICAgICBtX2xvYWRpbmcgPSBm
YWxzZTsKICAgICBjaGVja05vdGlmeSgpOwogfQogCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tCi0KLUNhY2hlZFNjcmlwdDo6Q2FjaGVkU2NyaXB0KERvY0xvYWRlciogZGws
IGNvbnN0IERPTVN0cmluZyAmdXJsLCBLSU86OkNhY2hlQ29udHJvbCBfY2FjaGVQb2xpY3ksIHRp
bWVfdCBfZXhwaXJlRGF0ZSwgY29uc3QgUVN0cmluZyYgY2hhcnNldCkKLSAgICA6IENhY2hlZE9i
amVjdCh1cmwsIFNjcmlwdCwgX2NhY2hlUG9saWN5LCBfZXhwaXJlRGF0ZSksIG1fY29kZWMoMCkK
LXsKLSAgICAvLyBJdCdzIGphdmFzY3JpcHQgd2Ugd2FudC4KLSAgICAvLyBCdXQgc29tZSB3ZWJz
aXRlcyB0aGluayB0aGVpciBzY3JpcHRzIGFyZSA8c29tZSB3cm9uZyBtaW1ldHlwZSBoZXJlPgot
ICAgIC8vIGFuZCByZWZ1c2UgdG8gc2VydmUgdGhlbSBpZiB3ZSBvbmx5IGFjY2VwdCBhcHBsaWNh
dGlvbi94LWphdmFzY3JpcHQuCi0gICAgc2V0QWNjZXB0KCIqLyoiKTsKLSAgICBtX2Vycm9yT2Nj
dXJyZWQgPSBmYWxzZTsKLSAgICAvLyBsb2FkIHRoZSBmaWxlCi0gICAgQ2FjaGU6OmxvYWRlcigp
LT5sb2FkKGRsLCB0aGlzLCBmYWxzZSk7Ci0gICAgbV9sb2FkaW5nID0gdHJ1ZTsKLSAgICBpZiAo
IWNoYXJzZXQuaXNFbXB0eSgpKQotICAgICAgICBtX2NvZGVjID0gUVRleHRDb2RlYzo6Y29kZWNG
b3JOYW1lKGNoYXJzZXQubGF0aW4xKCkpOwotICAgIGlmICghbV9jb2RlYykKLQltX2NvZGVjID0g
UVRleHRDb2RlYzo6Y29kZWNGb3JOYW1lKCJpc284ODU5LTEiKTsKLX0KLQotQ2FjaGVkU2NyaXB0
OjpDYWNoZWRTY3JpcHQoY29uc3QgRE9NU3RyaW5nICZ1cmwsIGNvbnN0IFFTdHJpbmcgJnNjcmlw
dF9kYXRhKQotICAgIDogQ2FjaGVkT2JqZWN0KHVybCwgU2NyaXB0LCBLSU86OkNDX1ZlcmlmeSwg
MCwgc2NyaXB0X2RhdGEubGVuZ3RoKCkpCi17Ci0gICAgbV9lcnJvck9jY3VycmVkID0gZmFsc2U7
Ci0gICAgbV9sb2FkaW5nID0gZmFsc2U7Ci0gICAgbV9zdGF0dXMgPSBQZXJzaXN0ZW50OwotICAg
IG1fY29kZWMgPSAwOwotICAgIG1fc2NyaXB0ID0gRE9NU3RyaW5nKHNjcmlwdF9kYXRhKTsKLX0K
LQotQ2FjaGVkU2NyaXB0Ojp+Q2FjaGVkU2NyaXB0KCkKLXsKLX0KLQotdm9pZCBDYWNoZWRTY3Jp
cHQ6OnJlZihDYWNoZWRPYmplY3RDbGllbnQgKmMpCi17Ci0gICAgQ2FjaGVkT2JqZWN0OjpyZWYo
Yyk7Ci0KLSAgICBpZighbV9sb2FkaW5nKSBjLT5ub3RpZnlGaW5pc2hlZCh0aGlzKTsKLX0KLQot
dm9pZCBDYWNoZWRTY3JpcHQ6OmRlcmVmKENhY2hlZE9iamVjdENsaWVudCAqYykKLXsKLSAgICBD
YWNoZTo6Zmx1c2goKTsKLSAgICBDYWNoZWRPYmplY3Q6OmRlcmVmKGMpOwotICAgIGlmICggY2Fu
RGVsZXRlKCkgJiYgbV9mcmVlICkKLSAgICAgIGRlbGV0ZSB0aGlzOwotfQotCi12b2lkIENhY2hl
ZFNjcmlwdDo6c2V0Q2hhcnNldCggY29uc3QgUVN0cmluZyAmY2hzICkKLXsKLSAgICBpZiAoIWNo
cy5pc0VtcHR5KCkpIHsKLSAgICAgICAgUVRleHRDb2RlYyAqY29kZWMgPSBRVGV4dENvZGVjOjpj
b2RlY0Zvck5hbWUoY2hzLmxhdGluMSgpKTsKLSAgICAgICAgaWYgKGNvZGVjKQotICAgICAgICAg
ICAgbV9jb2RlYyA9IGNvZGVjOwotICAgIH0KLX0KLQotdm9pZCBDYWNoZWRTY3JpcHQ6OmRhdGEo
IFFCdWZmZXIgJmJ1ZmZlciwgYm9vbCBlb2YgKQotewotICAgIGlmKCFlb2YpIHJldHVybjsKLSAg
ICBidWZmZXIuY2xvc2UoKTsKLSAgICBzZXRTaXplKGJ1ZmZlci5idWZmZXIoKS5zaXplKCkpOwot
ICAgIFFTdHJpbmcgZGF0YSA9IG1fY29kZWMtPnRvVW5pY29kZSggYnVmZmVyLmJ1ZmZlcigpLmRh
dGEoKSwgc2l6ZSgpICk7Ci0gICAgbV9zY3JpcHQgPSBET01TdHJpbmcoZGF0YSk7Ci0gICAgbV9s
b2FkaW5nID0gZmFsc2U7Ci0gICAgY2hlY2tOb3RpZnkoKTsKLX0KLQotdm9pZCBDYWNoZWRTY3Jp
cHQ6OmNoZWNrTm90aWZ5KCkKLXsKLSAgICBpZihtX2xvYWRpbmcpIHJldHVybjsKLQotICAgIENh
Y2hlZE9iamVjdENsaWVudFdhbGtlciB3KG1fY2xpZW50cyk7Ci0gICAgd2hpbGUgKENhY2hlZE9i
amVjdENsaWVudCAqYyA9IHcubmV4dCgpKQotICAgICAgICBjLT5ub3RpZnlGaW5pc2hlZCh0aGlz
KTsKLX0KLQotCi12b2lkIENhY2hlZFNjcmlwdDo6ZXJyb3IoIGludCAvKmVyciovLCBjb25zdCBj
aGFyICovKnRleHQqLyApCi17Ci0gICAgbV9sb2FkaW5nID0gZmFsc2U7Ci0gICAgbV9lcnJvck9j
Y3VycmVkID0gdHJ1ZTsKLSAgICBjaGVja05vdGlmeSgpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi1zdGF0aWMgYm9vbCBjcm9zc0RvbWFpbihjb25zdCBR
U3RyaW5nICZhLCBjb25zdCBRU3RyaW5nICZiKQotewotICAgIGlmIChhID09IGIpIHJldHVybiBm
YWxzZTsKLQotICAgIFFTdHJpbmdMaXN0IGwxID0gUVN0cmluZ0xpc3Q6OnNwbGl0KCcuJywgYSk7
Ci0gICAgUVN0cmluZ0xpc3QgbDIgPSBRU3RyaW5nTGlzdDo6c3BsaXQoJy4nLCBiKTsKLQotICAg
IHdoaWxlKGwxLmNvdW50KCkgPiBsMi5jb3VudCgpKQotICAgICAgICBsMS5wb3BfZnJvbnQoKTsK
LQotICAgIHdoaWxlKGwyLmNvdW50KCkgPiBsMS5jb3VudCgpKQotICAgICAgICBsMi5wb3BfZnJv
bnQoKTsKLQotICAgIHdoaWxlKGwyLmNvdW50KCkgPj0gMikKLSAgICB7Ci0gICAgICAgIGlmIChs
MSA9PSBsMikKLSAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIGwxLnBvcF9mcm9u
dCgpOwotICAgICAgICBsMi5wb3BfZnJvbnQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19
Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXZvaWQgQ2FjaGVkSW1hZ2VDYWxs
YmFjazo6bm90aWZ5VXBkYXRlKCkgCi17IAotICAgIGlmIChjYWNoZWRJbWFnZSkgewotICAgICAg
ICBjYWNoZWRJbWFnZS0+ZG9fbm90aWZ5IChjYWNoZWRJbWFnZS0+cGl4bWFwKCksIGNhY2hlZElt
YWdlLT5waXhtYXAoKS5yZWN0KCkpOyAKLSAgICAgICAgUVNpemUgcyA9IGNhY2hlZEltYWdlLT5w
aXhtYXBfc2l6ZSgpOwotICAgICAgICBjYWNoZWRJbWFnZS0+c2V0U2l6ZShzLndpZHRoKCkgKiBz
LmhlaWdodCgpICogMik7Ci0KLSAgICAgICAgLy8gQWZ0ZXIgcmVjZWl2aW5nIHRoZSBpbWFnZSBo
ZWFkZXIgd2UgYXJlIGd1YXJhbnRlZWQgdG8ga25vdwotICAgICAgICAvLyB0aGUgaW1hZ2Ugc2l6
ZS4gIEFsdGhvdWdoIGFsbCBvZiB0aGUgZGF0YSBtYXkgbm90IGhhdmUgYXJyaXZlZCBvcgotICAg
ICAgICAvLyBiZWVuIGRlY29kZWQgd2UgY2FuIGNvbnNpZGVyIHRoZSBpbWFnZSBsb2FkZWQgZm9y
IHB1cnBvc2VkIG9mCi0gICAgICAgIC8vIGxheW91dCBhbmQgZGlzcGF0Y2hpbmcgdGhlIGltYWdl
J3Mgb25sb2FkIGhhbmRsZXIuICBSZW1vdmluZyB0aGUgcmVxdWVzdCBmcm9tCi0gICAgICAgIC8v
IHRoZSBsaXN0IG9mIGJhY2tncm91bmQgZGVjb2RpbmcgcmVxdWVzdHMgd2lsbCBlbnN1cmUgdGhh
dCBMb2FkZXI6Om51bVJlcXVlc3RzKCkgCi0gICAgICAgIC8vIGRvZXMgbm90IGNvdW50IHRoaXMg
YmFja2dyb3VuZCByZXF1ZXN0LiAgRnVydGhlciBudW1SZXF1ZXN0cygpIGNhbgotICAgICAgICAv
LyBiZSBjb3JyZWN0bHkgdXNlZCBieSB0aGUgcGFydCB0byBkZXRlcm1pbmUgaWYgbG9hZGluZyBp
cyBzdWZmaWNpZW50bHkKLSAgICAgICAgLy8gY29tcGxldGUgdG8gZGlzcGF0Y2ggdGhlIHBhZ2Un
cyBvbmxvYWQgaGFuZGxlci4KLSAgICAgICAgUmVxdWVzdCAqciA9IGNhY2hlZEltYWdlLT5tX3Jl
cXVlc3Q7Ci0gICAgICAgIERvY0xvYWRlciAqZGwgPSByLT5tX2RvY0xvYWRlcjsKLQotICAgICAg
ICBraHRtbDo6Q2FjaGU6OmxvYWRlcigpLT5yZW1vdmVCYWNrZ3JvdW5kRGVjb2RpbmdSZXF1ZXN0
KHIpOwotCi0gICAgICAgIC8vIFBva2UgdGhlIHBhcnQgdG8gZ2V0IGl0IHRvIGRvIGEgY2hlY2tD
b21wbGV0ZWQoKS4gIE9ubHkgZG8gdGhpcyBmb3IKLSAgICAgICAgLy8gdGhlIGZpcnN0IHVwZGF0
ZSB0byBtaW5pbWl6ZSB3b3JrLiAgTm90ZSB0aGF0IHdlIGFyZSBndWFyYW50ZWVkIHRvIGhhdmUK
LSAgICAgICAgLy8gcmVhZCB0aGUgaGVhZGVyIHdoZW4gd2UgcmVjZWl2ZWQgdGhpcyBmaXJzdCB1
cGRhdGUsIHdoaWNoIGlzIHRyaWdnZXJlZAotICAgICAgICAvLyBieSB0aGUgZmlyc3Qga0NHSW1h
Z2VTdGF0dXNJbmNvbXBsZXRlIHN0YXR1cyBmcm9tIENHLiBrQ0dJbWFnZVN0YXR1c0luY29tcGxl
dGUKLSAgICAgICAgLy8gcmVhbGx5IG1lYW5zIHRoYXQgdGhlIENHIGRlY29kZXIgaXMgd2FpdGlu
ZyBmb3IgbW9yZSBkYXRhLCBidXQgaGFzIGFscmVhZHkKLSAgICAgICAgLy8gcmVhZCB0aGUgaGVh
ZGVyLgotICAgICAgICBpZiAoIWhlYWRlclJlY2VpdmVkKSB7Ci0gICAgICAgICAgICBlbWl0IGto
dG1sOjpDYWNoZTo6bG9hZGVyKCktPnJlcXVlc3REb25lKCBkbCwgY2FjaGVkSW1hZ2UgKTsKLSAg
ICAgICAgICAgIGhlYWRlclJlY2VpdmVkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLX0KLQot
dm9pZCBDYWNoZWRJbWFnZUNhbGxiYWNrOjpub3RpZnlGaW5pc2hlZCgpCi17Ci0gICAgaWYgKGNh
Y2hlZEltYWdlKSB7Ci0gICAgICAgIGNhY2hlZEltYWdlLT5kb19ub3RpZnkgKGNhY2hlZEltYWdl
LT5waXhtYXAoKSwgY2FjaGVkSW1hZ2UtPnBpeG1hcCgpLnJlY3QoKSk7IAotICAgICAgICBjYWNo
ZWRJbWFnZS0+bV9sb2FkaW5nID0gZmFsc2U7Ci0gICAgICAgIGNhY2hlZEltYWdlLT5jaGVja05v
dGlmeSgpOwotICAgICAgICBRU2l6ZSBzID0gY2FjaGVkSW1hZ2UtPnBpeG1hcF9zaXplKCk7Ci0g
ICAgICAgIGNhY2hlZEltYWdlLT5zZXRTaXplKHMud2lkdGgoKSAqIHMuaGVpZ2h0KCkgKiAyKTsK
LQkKLSAgICAgICAgUmVxdWVzdCAqciA9IGNhY2hlZEltYWdlLT5tX3JlcXVlc3Q7Ci0gICAgICAg
IERvY0xvYWRlciAqZGwgPSByLT5tX2RvY0xvYWRlcjsKLQotICAgICAgICBraHRtbDo6Q2FjaGU6
OmxvYWRlcigpLT5yZW1vdmVCYWNrZ3JvdW5kRGVjb2RpbmdSZXF1ZXN0KHIpOwotCi0gICAgICAg
IC8vIFBva2UgdGhlIHBhcnQgdG8gZ2V0IGl0IHRvIGRvIGEgY2hlY2tDb21wbGV0ZWQoKS4KLSAg
ICAgICAgZW1pdCBraHRtbDo6Q2FjaGU6OmxvYWRlcigpLT5yZXF1ZXN0RG9uZSggZGwsIGNhY2hl
ZEltYWdlICk7Ci0gICAgICAgIAotICAgICAgICBkZWxldGUgcjsKLSAgICB9Ci19Ci0KLXZvaWQg
Q2FjaGVkSW1hZ2VDYWxsYmFjazo6bm90aWZ5RGVjb2RpbmdFcnJvcigpCi17Ci0gICAgaWYgKGNh
Y2hlZEltYWdlKSB7Ci0gICAgICAgIGhhbmRsZUVycm9yKCk7Ci0gICAgfQotfQotCi12b2lkIENh
Y2hlZEltYWdlQ2FsbGJhY2s6OmhhbmRsZUVycm9yKCkKLXsKLSAgICBpZiAoY2FjaGVkSW1hZ2Up
IHsKLSAgICAgICAgY2FjaGVkSW1hZ2UtPmVycm9yT2NjdXJlZCA9IHRydWU7Ci0gICAgICAgIFFQ
aXhtYXAgZXAgPSBjYWNoZWRJbWFnZS0+cGl4bWFwKCk7Ci0gICAgICAgIGNhY2hlZEltYWdlLT5k
b19ub3RpZnkgKGVwLCBlcC5yZWN0KCkpOwotICAgICAgICBDYWNoZTo6cmVtb3ZlQ2FjaGVFbnRy
eSAoY2FjaGVkSW1hZ2UpOwotCi0gICAgICAgIGNsZWFyKCk7Ci0gICAgfQotfQotCi12b2lkIENh
Y2hlZEltYWdlQ2FsbGJhY2s6OmNsZWFyKCkgCi17Ci0gICAgaWYgKGNhY2hlZEltYWdlICYmIGNh
Y2hlZEltYWdlLT5tX3JlcXVlc3QpIHsKLSAgICAgICAgUmVxdWVzdCAqciA9IGNhY2hlZEltYWdl
LT5tX3JlcXVlc3Q7Ci0gICAgICAgIERvY0xvYWRlciAqZGwgPSByLT5tX2RvY0xvYWRlcjsKLQot
ICAgICAgICBraHRtbDo6Q2FjaGU6OmxvYWRlcigpLT5yZW1vdmVCYWNrZ3JvdW5kRGVjb2RpbmdS
ZXF1ZXN0KHIpOwotCi0gICAgICAgIC8vIFBva2UgdGhlIHBhcnQgdG8gZ2V0IGl0IHRvIGRvIGEg
Y2hlY2tDb21wbGV0ZWQoKS4KLSAgICAgICAgZW1pdCBraHRtbDo6Q2FjaGU6OmxvYWRlcigpLT5y
ZXF1ZXN0RmFpbGVkKCBkbCwgY2FjaGVkSW1hZ2UgKTsKLQotICAgICAgICBkZWxldGUgcjsKLSAg
ICB9Ci0gICAgY2FjaGVkSW1hZ2UgPSAwOwotfQotCi1DYWNoZWRJbWFnZTo6Q2FjaGVkSW1hZ2Uo
RG9jTG9hZGVyKiBkbCwgY29uc3QgRE9NU3RyaW5nICZ1cmwsIEtJTzo6Q2FjaGVDb250cm9sIF9j
YWNoZVBvbGljeSwgdGltZV90IF9leHBpcmVEYXRlKQotICAgIDogUU9iamVjdCgpLCBDYWNoZWRP
YmplY3QodXJsLCBJbWFnZSwgX2NhY2hlUG9saWN5LCBfZXhwaXJlRGF0ZSkKLSAgICAsIG1fZGF0
YVNpemUoMCkKLXsKLSAgICBwID0gMDsKLSAgICBwaXhQYXJ0ID0gMDsKLSAgICBiZyA9IDA7Ci0g
ICAgaXNGdWxseVRyYW5zcGFyZW50ID0gZmFsc2U7Ci0gICAgZXJyb3JPY2N1cmVkID0gZmFsc2U7
Ci0gICAgbW9ub2Nocm9tZSA9IGZhbHNlOwotICAgIGZvcm1hdFR5cGUgPSAwOwotICAgIG1fc3Rh
dHVzID0gVW5rbm93bjsKLSAgICBpbWdTb3VyY2UgPSAwOwotICAgIG1fbG9hZGluZyA9IHRydWU7
Ci0gICAgbV9zaG93QW5pbWF0aW9ucyA9IGRsLT5zaG93QW5pbWF0aW9ucygpOwotICAgIGlmIChR
UGl4bWFwOjpzaG91bGRVc2VUaHJlYWRlZERlY29kaW5nKCkpCi0gICAgICAgIG1fZGVjb2RlckNh
bGxiYWNrID0gbmV3IENhY2hlZEltYWdlQ2FsbGJhY2sodGhpcyk7Ci0gICAgZWxzZQotICAgICAg
ICBtX2RlY29kZXJDYWxsYmFjayA9IDA7Ci19Ci0KLUNhY2hlZEltYWdlOjp+Q2FjaGVkSW1hZ2Uo
KQotewotICAgIGNsZWFyKCk7Ci19Ci0KLXZvaWQgQ2FjaGVkSW1hZ2U6OnJlZiggQ2FjaGVkT2Jq
ZWN0Q2xpZW50ICpjICkKLXsKLSAgICBDYWNoZWRPYmplY3Q6OnJlZihjKTsKLQotICAgIC8vIGZv
ciBtb3VzZW92ZXJzLCBkeW5hbWljIGNoYW5nZXMKLSAgICBpZiAoIXZhbGlkX3JlY3QoKS5pc051
bGwoKSkKLSAgICAgICAgYy0+c2V0UGl4bWFwKCBwaXhtYXAoKSwgdmFsaWRfcmVjdCgpLCB0aGlz
KTsKLQotICAgIGlmKCFtX2xvYWRpbmcpCi0gICAgICAgIGMtPm5vdGlmeUZpbmlzaGVkKHRoaXMp
OwotfQotCi12b2lkIENhY2hlZEltYWdlOjpkZXJlZiggQ2FjaGVkT2JqZWN0Q2xpZW50ICpjICkK
LXsKLSAgICBDYWNoZTo6Zmx1c2goKTsKLSAgICBDYWNoZWRPYmplY3Q6OmRlcmVmKGMpOwotICAg
IGlmICggY2FuRGVsZXRlKCkgJiYgbV9mcmVlICkKLSAgICAgICAgZGVsZXRlIHRoaXM7Ci19Ci0K
LWNvbnN0IFFQaXhtYXAgJkNhY2hlZEltYWdlOjp0aWxlZF9waXhtYXAoY29uc3QgUUNvbG9yJiBu
ZXdjKQotewotICAgIHJldHVybiBwaXhtYXAoKTsKLX0KLQotY29uc3QgUVBpeG1hcCAmQ2FjaGVk
SW1hZ2U6OnBpeG1hcCggKSBjb25zdAotewotICAgIGlmKGVycm9yT2NjdXJlZCkKLSAgICAgICAg
cmV0dXJuICpDYWNoZTo6YnJva2VuUGl4bWFwOwotCi0gICAgaWYgKHApCi0gICAgICAgIHJldHVy
biAqcDsKLQotICAgIHJldHVybiAqQ2FjaGU6Om51bGxQaXhtYXA7Ci19Ci0KLVFTaXplIENhY2hl
ZEltYWdlOjpwaXhtYXBfc2l6ZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIChwID8gcC0+c2l6ZSgp
IDogUVNpemUoKSk7Ci19Ci0KLVFSZWN0IENhY2hlZEltYWdlOjp2YWxpZF9yZWN0KCkgY29uc3QK
LXsKLSAgICByZXR1cm4gKHAgPyBwLT5yZWN0KCkgOiBRUmVjdCgpKTsKLX0KLQotdm9pZCBDYWNo
ZWRJbWFnZTo6ZG9fbm90aWZ5KGNvbnN0IFFQaXhtYXAmIHAsIGNvbnN0IFFSZWN0JiByKQotewot
ICAgIENhY2hlZE9iamVjdENsaWVudFdhbGtlciB3KG1fY2xpZW50cyk7Ci0gICAgd2hpbGUgKENh
Y2hlZE9iamVjdENsaWVudCAqYyA9IHcubmV4dCgpKQotICAgICAgICBjLT5zZXRQaXhtYXAocCwg
ciwgdGhpcyk7Ci19Ci0KLXZvaWQgQ2FjaGVkSW1hZ2U6OnNldFNob3dBbmltYXRpb25zKCBLSFRN
TFNldHRpbmdzOjpLQW5pbWF0aW9uQWR2aWNlIHNob3dBbmltYXRpb25zICkKLXsKLSAgICBtX3No
b3dBbmltYXRpb25zID0gc2hvd0FuaW1hdGlvbnM7Ci19Ci0KLXZvaWQgQ2FjaGVkSW1hZ2U6OmNs
ZWFyKCkKLXsKLSAgICBkZWxldGUgcDsgICBwID0gMDsKLSAgICBkZWxldGUgYmc7ICBiZyA9IDA7
Ci0gICAgZGVsZXRlIHBpeFBhcnQ7IHBpeFBhcnQgPSAwOwotCi0gICAgZm9ybWF0VHlwZSA9IDA7
Ci0KLSAgICBzZXRTaXplKDApOwotCi0gICAgLy8gTm8gbmVlZCB0byBkZWxldGUgaW1hZ2VTb3Vy
Y2UgLSBRTW92aWUgZG9lcyBpdCBmb3IgdXMKLSAgICBpbWdTb3VyY2UgPSAwOwotCi0gICAgaWYg
KG1fZGVjb2RlckNhbGxiYWNrKSB7Ci0gICAgICAgIG1fZGVjb2RlckNhbGxiYWNrLT5jbGVhcigp
OwotICAgICAgICBtX2RlY29kZXJDYWxsYmFjay0+ZGVyZWYoKTsKLSAgICAgICAgbV9kZWNvZGVy
Q2FsbGJhY2sgPSAwOwotICAgIH0KLX0KLQotdm9pZCBDYWNoZWRJbWFnZTo6ZGF0YSAoIFFCdWZm
ZXIgJl9idWZmZXIsIGJvb2wgZW9mICkKLXsKLSNpZmRlZiBDQUNIRV9ERUJVRwotICAgIGtkRGVi
dWcoIDYwNjAgKSA8PCB0aGlzIDw8ICJpbiBDYWNoZWRJbWFnZTo6ZGF0YShidWZmZXJzaXplICIg
PDwgX2J1ZmZlci5idWZmZXIoKS5zaXplKCkgPDwiLCBlb2Y9IiA8PCBlb2YgPDwgZW5kbDsKLSNl
bmRpZgotCi0gICAgYm9vbCBjYW5EcmF3ID0gZmFsc2U7Ci0gICAgCi0gICAgbV9kYXRhU2l6ZSA9
IF9idWZmZXIuc2l6ZSgpOwotICAgICAgICAKLSAgICAvLyBJZiB3ZSdyZSBhdCBlb2YgYW5kIGRv
bid0IGhhdmUgYSBwaXhtYXAgeWV0LCB0aGUgZGF0YQotICAgIC8vIG11c3QgaGF2ZSBhcnJpdmVk
IGluIG9uZSBjaHVuay4gIFRoaXMgYXZvaWRzIHRoZSBhdHRlbXB0Ci0gICAgLy8gdG8gcGVyZm9y
bSBpbmNyZW1lbnRhbCBkZWNvZGluZy4KLSAgICBpZiAoZW9mICYmICFwKSB7Ci0gICAgICAgIHAg
PSBuZXcgUVBpeG1hcChfYnVmZmVyLmJ1ZmZlcigpLCBLV1FSZXNwb25zZU1JTUVUeXBlKG1fcmVz
cG9uc2UpKTsKLSAgICAgICAgaWYgKG1fZGVjb2RlckNhbGxiYWNrKQotICAgICAgICAgICAgbV9k
ZWNvZGVyQ2FsbGJhY2stPm5vdGlmeUZpbmlzaGVkKCk7Ci0gICAgICAgIGNhbkRyYXcgPSB0cnVl
OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIEFsd2F5cyBhdHRlbXB0IHRvIGxvYWQgdGhlIGlt
YWdlIGluY3JlbWVudGFsbHkuCi0gICAgICAgIGlmICghcCkKLSAgICAgICAgICAgIHAgPSBuZXcg
UVBpeG1hcChLV1FSZXNwb25zZU1JTUVUeXBlKG1fcmVzcG9uc2UpKTsKLSAgICAgICAgY2FuRHJh
dyA9IHAtPnJlY2VpdmVkRGF0YShfYnVmZmVyLmJ1ZmZlcigpLCBlb2YsIG1fZGVjb2RlckNhbGxi
YWNrKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gSWYgd2UgaGF2ZSBhIGRlY29kZXIsIHdlJ2xsIGJl
IG5vdGlmaWVkIHdoZW4gZGVjb2RpbmcgaGFzIGNvbXBsZXRlZC4KLSAgICBpZiAoIW1fZGVjb2Rl
ckNhbGxiYWNrKSB7Ci0gICAgICAgIGlmIChjYW5EcmF3IHx8IGVvZikgewotICAgICAgICAgICAg
aWYgKHAtPmlzTnVsbCgpKSB7Ci0gICAgICAgICAgICAgICAgZXJyb3JPY2N1cmVkID0gdHJ1ZTsK
LSAgICAgICAgICAgICAgICBRUGl4bWFwIGVwID0gcGl4bWFwKCk7Ci0gICAgICAgICAgICAgICAg
ZG9fbm90aWZ5IChlcCwgZXAucmVjdCgpKTsKLSAgICAgICAgICAgICAgICBDYWNoZTo6cmVtb3Zl
Q2FjaGVFbnRyeSAodGhpcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAg
ICAgICAgICAgICAgZG9fbm90aWZ5KCpwLCBwLT5yZWN0KCkpOwotCi0gICAgICAgICAgICBRU2l6
ZSBzID0gcGl4bWFwX3NpemUoKTsKLSAgICAgICAgICAgIHNldFNpemUocy53aWR0aCgpICogcy5o
ZWlnaHQoKSAqIDIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChlb2YpIHsKLSAgICAgICAgICAg
IG1fbG9hZGluZyA9IGZhbHNlOwotICAgICAgICAgICAgY2hlY2tOb3RpZnkoKTsKLSAgICAgICAg
fQotICAgIH0KLX0KLQotdm9pZCBDYWNoZWRJbWFnZTo6ZXJyb3IoIGludCAvKmVyciovLCBjb25z
dCBjaGFyICovKnRleHQqLyApCi17Ci0jaWZkZWYgQ0FDSEVfREVCVUcKLSAgICBrZERlYnVnKDYw
NjApIDw8ICJDYWhjZWRJbWFnZTo6ZXJyb3IiIDw8IGVuZGw7Ci0jZW5kaWYKLQotICAgIGNsZWFy
KCk7Ci0gICAgZXJyb3JPY2N1cmVkID0gdHJ1ZTsKLSAgICBkb19ub3RpZnkocGl4bWFwKCksIFFS
ZWN0KDAsIDAsIDE2LCAxNikpOwotICAgIG1fbG9hZGluZyA9IGZhbHNlOwotICAgIGNoZWNrTm90
aWZ5KCk7Ci19Ci0KLXZvaWQgQ2FjaGVkSW1hZ2U6OmNoZWNrTm90aWZ5KCkKLXsKLSAgICBpZiht
X2xvYWRpbmcpIHJldHVybjsKLQotICAgIENhY2hlZE9iamVjdENsaWVudFdhbGtlciB3KG1fY2xp
ZW50cyk7Ci0gICAgd2hpbGUgKENhY2hlZE9iamVjdENsaWVudCAqYyA9IHcubmV4dCgpKSB7Ci0g
ICAgICAgIGMtPm5vdGlmeUZpbmlzaGVkKHRoaXMpOwotICAgIH0KLX0KLQotLy8gLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jaWZkZWYgS0hUTUxfWFNMVAotCi1DYWNoZWRY
U0xTdHlsZVNoZWV0OjpDYWNoZWRYU0xTdHlsZVNoZWV0KERvY0xvYWRlciogZGwsIGNvbnN0IERP
TVN0cmluZyAmdXJsLCBLSU86OkNhY2hlQ29udHJvbCBfY2FjaGVQb2xpY3ksIHRpbWVfdCBfZXhw
aXJlRGF0ZSkKLTogQ2FjaGVkT2JqZWN0KHVybCwgWFNMU3R5bGVTaGVldCwgX2NhY2hlUG9saWN5
LCBfZXhwaXJlRGF0ZSkKLXsKLSAgICAvLyBJdCdzIFhNTCB3ZSB3YW50LgotICAgIC8vIEZJWE1F
OiBUaGlzIHNob3VsZCBhY2NlcHQgbW9yZSBnZW5lcmFsIHhtbCBmb3JtYXRzICovKit4bWwsIGlt
YWdlL3N2Zyt4bWwgZm9yIGV4YW1wbGUuCi0gICAgc2V0QWNjZXB0KCJ0ZXh0L3htbCwgYXBwbGlj
YXRpb24veG1sLCBhcHBsaWNhdGlvbi94aHRtbCt4bWwsIHRleHQveHNsLCBhcHBsaWNhdGlvbi9y
c3MreG1sLCBhcHBsaWNhdGlvbi9hdG9tK3htbCIpOwotICAgIAotICAgIC8vIGxvYWQgdGhlIGZp
bGUKLSAgICBDYWNoZTo6bG9hZGVyKCktPmxvYWQoZGwsIHRoaXMsIGZhbHNlKTsKLSAgICBtX2xv
YWRpbmcgPSB0cnVlOwotICAgIG1fZGVjb2RlciA9IG5ldyBEZWNvZGVyOwotfQotCi12b2lkIENh
Y2hlZFhTTFN0eWxlU2hlZXQ6OnJlZihDYWNoZWRPYmplY3RDbGllbnQgKmMpCi17Ci0gICAgQ2Fj
aGVkT2JqZWN0OjpyZWYoYyk7Ci0gICAgCi0gICAgaWYgKCFtX2xvYWRpbmcpCi0gICAgICAgIGMt
PnNldFN0eWxlU2hlZXQobV91cmwsIG1fc2hlZXQpOwotfQotCi12b2lkIENhY2hlZFhTTFN0eWxl
U2hlZXQ6OmRlcmVmKENhY2hlZE9iamVjdENsaWVudCAqYykKLXsKLSAgICBDYWNoZTo6Zmx1c2go
KTsKLSAgICBDYWNoZWRPYmplY3Q6OmRlcmVmKGMpOwotICAgIGlmIChjYW5EZWxldGUoKSAmJiBt
X2ZyZWUpCi0gICAgICAgIGRlbGV0ZSB0aGlzOwotfQotCi12b2lkIENhY2hlZFhTTFN0eWxlU2hl
ZXQ6OnNldENoYXJzZXQoIGNvbnN0IFFTdHJpbmcgJmNocyApCi17Ci0gICAgaWYgKCFjaHMuaXNF
bXB0eSgpKQotICAgICAgICBtX2RlY29kZXItPnNldEVuY29kaW5nKGNocy5sYXRpbjEoKSwgRGVj
b2Rlcjo6RW5jb2RpbmdGcm9tSFRUUEhlYWRlcik7Ci19Ci0KLXZvaWQgQ2FjaGVkWFNMU3R5bGVT
aGVldDo6ZGF0YShRQnVmZmVyICZidWZmZXIsIGJvb2wgZW9mKQotewotICAgIGlmKCFlb2YpIHJl
dHVybjsKLSAgICBidWZmZXIuY2xvc2UoKTsKLSAgICBzZXRTaXplKGJ1ZmZlci5idWZmZXIoKS5z
aXplKCkpOwotICAgIFFTdHJpbmcgZGF0YSA9IG1fZGVjb2Rlci0+ZGVjb2RlKGJ1ZmZlci5idWZm
ZXIoKS5kYXRhKCksIHNpemUoKSk7Ci0gICAgbV9zaGVldCA9IERPTVN0cmluZyhkYXRhKTsKLSAg
ICBtX2xvYWRpbmcgPSBmYWxzZTsKLSAgICAKLSAgICBjaGVja05vdGlmeSgpOwotfQotCi12b2lk
IENhY2hlZFhTTFN0eWxlU2hlZXQ6OmNoZWNrTm90aWZ5KCkKLXsKLSAgICBpZiAobV9sb2FkaW5n
KQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgQ2FjaGVkT2JqZWN0Q2xpZW50V2Fsa2VyIHco
bV9jbGllbnRzKTsKLSAgICB3aGlsZSAoQ2FjaGVkT2JqZWN0Q2xpZW50ICpjID0gdy5uZXh0KCkp
Ci0gICAgICAgIGMtPnNldFN0eWxlU2hlZXQobV91cmwsIG1fc2hlZXQpOwotfQotCi0KLXZvaWQg
Q2FjaGVkWFNMU3R5bGVTaGVldDo6ZXJyb3IoIGludCAvKmVyciovLCBjb25zdCBjaGFyICovKnRl
eHQqLyApCi17Ci0gICAgbV9sb2FkaW5nID0gZmFsc2U7Ci0gICAgY2hlY2tOb3RpZnkoKTsKLX0K
LQotI2VuZGlmCi0KLSNpZm5kZWYgS0hUTUxfTk9fWEJMCi1DYWNoZWRYQkxEb2N1bWVudDo6Q2Fj
aGVkWEJMRG9jdW1lbnQoRG9jTG9hZGVyKiBkbCwgY29uc3QgRE9NU3RyaW5nICZ1cmwsIEtJTzo6
Q2FjaGVDb250cm9sIF9jYWNoZVBvbGljeSwgdGltZV90IF9leHBpcmVEYXRlKQotOiBDYWNoZWRP
YmplY3QodXJsLCBYQkwsIF9jYWNoZVBvbGljeSwgX2V4cGlyZURhdGUpLCBtX2RvY3VtZW50KDAp
Ci17Ci0gICAgLy8gSXQncyBYTUwgd2Ugd2FudC4KLSAgICBzZXRBY2NlcHQoInRleHQveG1sLCBh
cHBsaWNhdGlvbi94bWwsIGFwcGxpY2F0aW9uL3hodG1sK3htbCwgdGV4dC94c2wsIGFwcGxpY2F0
aW9uL3Jzcyt4bWwsIGFwcGxpY2F0aW9uL2F0b20reG1sIik7Ci0gICAgCi0gICAgLy8gTG9hZCB0
aGUgZmlsZQotICAgIENhY2hlOjpsb2FkZXIoKS0+bG9hZChkbCwgdGhpcywgZmFsc2UpOwotICAg
IG1fbG9hZGluZyA9IHRydWU7Ci0gICAgbV9kZWNvZGVyID0gbmV3IERlY29kZXI7Ci19Ci0KLUNh
Y2hlZFhCTERvY3VtZW50Ojp+Q2FjaGVkWEJMRG9jdW1lbnQoKQotewotICAgIGlmIChtX2RvY3Vt
ZW50KQotICAgICAgICBtX2RvY3VtZW50LT5kZXJlZigpOwotfQotCi12b2lkIENhY2hlZFhCTERv
Y3VtZW50OjpyZWYoQ2FjaGVkT2JqZWN0Q2xpZW50ICpjKQotewotICAgIENhY2hlZE9iamVjdDo6
cmVmKGMpOwotICAgIGlmICghbV9sb2FkaW5nKQotICAgICAgICBjLT5zZXRYQkxEb2N1bWVudCht
X3VybCwgbV9kb2N1bWVudCk7Ci19Ci0KLXZvaWQgQ2FjaGVkWEJMRG9jdW1lbnQ6OmRlcmVmKENh
Y2hlZE9iamVjdENsaWVudCAqYykKLXsKLSAgICBDYWNoZTo6Zmx1c2goKTsKLSAgICBDYWNoZWRP
YmplY3Q6OmRlcmVmKGMpOwotICAgIGlmIChjYW5EZWxldGUoKSAmJiBtX2ZyZWUpCi0gICAgICAg
IGRlbGV0ZSB0aGlzOwotfQotCi12b2lkIENhY2hlZFhCTERvY3VtZW50OjpzZXRDaGFyc2V0KCBj
b25zdCBRU3RyaW5nICZjaHMgKQotewotICAgIGlmICghY2hzLmlzRW1wdHkoKSkKLSAgICAgICAg
bV9kZWNvZGVyLT5zZXRFbmNvZGluZyhjaHMubGF0aW4xKCksIERlY29kZXI6OkVuY29kaW5nRnJv
bUhUVFBIZWFkZXIpOwotfQotCi12b2lkIENhY2hlZFhCTERvY3VtZW50OjpkYXRhKCBRQnVmZmVy
ICZidWZmZXIsIGJvb2wgZW9mICkKLXsKLSAgICBpZiAoIWVvZikgcmV0dXJuOwotICAgIAotICAg
IGFzc2VydCghbV9kb2N1bWVudCk7Ci0gICAgCi0gICAgbV9kb2N1bWVudCA9ICBuZXcgWEJMOjpY
QkxEb2N1bWVudEltcGwoKTsKLSAgICBtX2RvY3VtZW50LT5yZWYoKTsKLSAgICBtX2RvY3VtZW50
LT5vcGVuKCk7Ci0gICAgCi0gICAgUVN0cmluZyBkYXRhID0gbV9kZWNvZGVyLT5kZWNvZGUoYnVm
ZmVyLmJ1ZmZlcigpLmRhdGEoKSwgYnVmZmVyLmJ1ZmZlcigpLnNpemUoKSk7Ci0gICAgbV9kb2N1
bWVudC0+d3JpdGUoZGF0YSk7Ci0gICAgc2V0U2l6ZShidWZmZXIuYnVmZmVyKCkuc2l6ZSgpKTsK
LSAgICBidWZmZXIuY2xvc2UoKTsKLSAgICAKLSAgICBtX2RvY3VtZW50LT5maW5pc2hQYXJzaW5n
KCk7Ci0gICAgbV9kb2N1bWVudC0+Y2xvc2UoKTsKLSAgICBtX2xvYWRpbmcgPSBmYWxzZTsKLSAg
ICBjaGVja05vdGlmeSgpOwotfQotCi12b2lkIENhY2hlZFhCTERvY3VtZW50OjpjaGVja05vdGlm
eSgpCi17Ci0gICAgaWYobV9sb2FkaW5nKQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgQ2Fj
aGVkT2JqZWN0Q2xpZW50V2Fsa2VyIHcobV9jbGllbnRzKTsKLSAgICB3aGlsZSAoQ2FjaGVkT2Jq
ZWN0Q2xpZW50ICpjID0gdy5uZXh0KCkpCi0gICAgICAgIGMtPnNldFhCTERvY3VtZW50KG1fdXJs
LCBtX2RvY3VtZW50KTsKLX0KLQotCi12b2lkIENhY2hlZFhCTERvY3VtZW50OjplcnJvciggaW50
IC8qZXJyKi8sIGNvbnN0IGNoYXIgKi8qdGV4dCovICkKLXsKLSAgICBtX2xvYWRpbmcgPSBmYWxz
ZTsKLSAgICBjaGVja05vdGlmeSgpOwotfQotI2VuZGlmCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLQotCi1SZXF1ZXN0OjpSZXF1ZXN0KERvY0xvYWRlciogZGwsIENhY2hl
ZE9iamVjdCAqX29iamVjdCwgYm9vbCBfaW5jcmVtZW50YWwpCi17Ci0gICAgb2JqZWN0ID0gX29i
amVjdDsKLSAgICBvYmplY3QtPnNldFJlcXVlc3QodGhpcyk7Ci0gICAgaW5jcmVtZW50YWwgPSBf
aW5jcmVtZW50YWw7Ci0gICAgbV9kb2NMb2FkZXIgPSBkbDsKLSAgICBtdWx0aXBhcnQgPSBmYWxz
ZTsKLX0KLQotUmVxdWVzdDo6flJlcXVlc3QoKQotewotICAgIG9iamVjdC0+c2V0UmVxdWVzdCgw
KTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLURvY0xvYWRl
cjo6RG9jTG9hZGVyKEtIVE1MUGFydCogcGFydCwgRG9jdW1lbnRJbXBsKiBkb2MpCi17Ci0gICAg
bV9jYWNoZVBvbGljeSA9IEtJTzo6Q0NfVmVyaWZ5OwotICAgIG1fZXhwaXJlRGF0ZSA9IDA7Ci0g
ICAgbV9iYXV0b2xvYWRJbWFnZXMgPSB0cnVlOwotICAgIG1fc2hvd0FuaW1hdGlvbnMgPSBLSFRN
TFNldHRpbmdzOjpLQW5pbWF0aW9uRW5hYmxlZDsKLSAgICBtX3BhcnQgPSBwYXJ0OwotICAgIG1f
ZG9jID0gZG9jOwotICAgIG1fbG9hZEluUHJvZ3Jlc3MgPSBmYWxzZTsKLQotICAgIENhY2hlOjpp
bml0KCk7Ci0gICAgQ2FjaGU6OmRvY2xvYWRlci0+YXBwZW5kKCB0aGlzICk7Ci19Ci0KLURvY0xv
YWRlcjo6fkRvY0xvYWRlcigpCi17Ci0gICAgQ2FjaGU6OmRvY2xvYWRlci0+cmVtb3ZlKCB0aGlz
ICk7Ci19Ci0KLXZvaWQgRG9jTG9hZGVyOjpzZXRFeHBpcmVEYXRlKHRpbWVfdCBfZXhwaXJlRGF0
ZSkKLXsKLSAgICBtX2V4cGlyZURhdGUgPSBfZXhwaXJlRGF0ZTsKLX0KLQotYm9vbCBEb2NMb2Fk
ZXI6Om5lZWRSZWxvYWQoY29uc3QgS1VSTCAmZnVsbFVSTCkKLXsKLSAgICBib29sIHJlbG9hZCA9
IGZhbHNlOwotICAgIGlmIChtX2NhY2hlUG9saWN5ID09IEtJTzo6Q0NfVmVyaWZ5KQotICAgIHsK
LSAgICAgICBpZiAoIW1fcmVsb2FkZWRVUkxzLmNvbnRhaW5zKGZ1bGxVUkwudXJsKCkpKQotICAg
ICAgIHsKLSAgICAgICAgICBDYWNoZWRPYmplY3QgKmV4aXN0aW5nID0gQ2FjaGU6OmNhY2hlLT5m
aW5kKGZ1bGxVUkwudXJsKCkpOwotICAgICAgICAgIGlmIChleGlzdGluZyAmJiBleGlzdGluZy0+
aXNFeHBpcmVkKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgIENhY2hlOjpyZW1vdmVDYWNo
ZUVudHJ5KGV4aXN0aW5nKTsKLSAgICAgICAgICAgICBtX3JlbG9hZGVkVVJMcy5hcHBlbmQoZnVs
bFVSTC51cmwoKSk7Ci0gICAgICAgICAgICAgcmVsb2FkID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0g
ICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmICgobV9jYWNoZVBvbGljeSA9PSBLSU86OkNDX1Jl
bG9hZCkgfHwgKG1fY2FjaGVQb2xpY3kgPT0gS0lPOjpDQ19SZWZyZXNoKSkKLSAgICB7Ci0gICAg
ICAgaWYgKCFtX3JlbG9hZGVkVVJMcy5jb250YWlucyhmdWxsVVJMLnVybCgpKSkKLSAgICAgICB7
Ci0gICAgICAgICAgQ2FjaGVkT2JqZWN0ICpleGlzdGluZyA9IENhY2hlOjpjYWNoZS0+ZmluZChm
dWxsVVJMLnVybCgpKTsKLSAgICAgICAgICBpZiAoZXhpc3RpbmcpCi0gICAgICAgICAgewotICAg
ICAgICAgICAgIENhY2hlOjpyZW1vdmVDYWNoZUVudHJ5KGV4aXN0aW5nKTsKLSAgICAgICAgICB9
Ci0gICAgICAgICAgbV9yZWxvYWRlZFVSTHMuYXBwZW5kKGZ1bGxVUkwudXJsKCkpOwotICAgICAg
ICAgIHJlbG9hZCA9IHRydWU7Ci0gICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVsb2FkOwot
fQotCi1DYWNoZWRJbWFnZSAqRG9jTG9hZGVyOjpyZXF1ZXN0SW1hZ2UoIGNvbnN0IERPTTo6RE9N
U3RyaW5nICZ1cmwpCi17Ci0gICAgS1VSTCBmdWxsVVJMID0gbV9kb2MtPmNvbXBsZXRlVVJMKHVy
bC5xc3RyaW5nKCkpOwotICAgIGlmICggbV9wYXJ0ICYmIG1fcGFydC0+b25seUxvY2FsUmVmZXJl
bmNlcygpICYmIGZ1bGxVUkwucHJvdG9jb2woKSAhPSAiZmlsZSIpIHJldHVybiAwOwotCi0gICAg
aWYgKEtXUUNoZWNrSWZSZWxvYWRpbmcodGhpcykpIHsKLSAgICAgICAgc2V0Q2FjaGVQb2xpY3ko
S0lPOjpDQ19SZWxvYWQpOwotICAgIH0KLQotICAgIGJvb2wgcmVsb2FkID0gbmVlZFJlbG9hZChm
dWxsVVJMKTsKLQotICAgIENhY2hlZEltYWdlICpjYWNoZWRPYmplY3QgPSBDYWNoZTo6cmVxdWVz
dEltYWdlKHRoaXMsIGZ1bGxVUkwsIHJlbG9hZCwgbV9leHBpcmVEYXRlKTsKLSAgICBLV1FDaGVj
a0NhY2hlT2JqZWN0U3RhdHVzKHRoaXMsIGNhY2hlZE9iamVjdCk7Ci0gICAgcmV0dXJuIGNhY2hl
ZE9iamVjdDsKLX0KLQotQ2FjaGVkQ1NTU3R5bGVTaGVldCAqRG9jTG9hZGVyOjpyZXF1ZXN0U3R5
bGVTaGVldCggY29uc3QgRE9NOjpET01TdHJpbmcgJnVybCwgY29uc3QgUVN0cmluZyYgY2hhcnNl
dCkKLXsKLSAgICBLVVJMIGZ1bGxVUkwgPSBtX2RvYy0+Y29tcGxldGVVUkwodXJsLnFzdHJpbmco
KSk7Ci0gICAgaWYgKCBtX3BhcnQgJiYgbV9wYXJ0LT5vbmx5TG9jYWxSZWZlcmVuY2VzKCkgJiYg
ZnVsbFVSTC5wcm90b2NvbCgpICE9ICJmaWxlIikgcmV0dXJuIDA7Ci0KLSAgICBpZiAoS1dRQ2hl
Y2tJZlJlbG9hZGluZyh0aGlzKSkgewotICAgICAgICBzZXRDYWNoZVBvbGljeShLSU86OkNDX1Jl
bG9hZCk7Ci0gICAgfQotCi0gICAgYm9vbCByZWxvYWQgPSBuZWVkUmVsb2FkKGZ1bGxVUkwpOwot
Ci0gICAgQ2FjaGVkQ1NTU3R5bGVTaGVldCAqY2FjaGVkT2JqZWN0ID0gQ2FjaGU6OnJlcXVlc3RT
dHlsZVNoZWV0KHRoaXMsIHVybCwgcmVsb2FkLCBtX2V4cGlyZURhdGUsIGNoYXJzZXQpOwotICAg
IEtXUUNoZWNrQ2FjaGVPYmplY3RTdGF0dXModGhpcywgY2FjaGVkT2JqZWN0KTsKLSAgICByZXR1
cm4gY2FjaGVkT2JqZWN0OwotfQotCi1DYWNoZWRTY3JpcHQgKkRvY0xvYWRlcjo6cmVxdWVzdFNj
cmlwdCggY29uc3QgRE9NOjpET01TdHJpbmcgJnVybCwgY29uc3QgUVN0cmluZyYgY2hhcnNldCkK
LXsKLSAgICBLVVJMIGZ1bGxVUkwgPSBtX2RvYy0+Y29tcGxldGVVUkwodXJsLnFzdHJpbmcoKSk7
Ci0gICAgaWYgKCBtX3BhcnQgJiYgbV9wYXJ0LT5vbmx5TG9jYWxSZWZlcmVuY2VzKCkgJiYgZnVs
bFVSTC5wcm90b2NvbCgpICE9ICJmaWxlIikgcmV0dXJuIDA7Ci0KLSAgICBpZiAoS1dRQ2hlY2tJ
ZlJlbG9hZGluZyh0aGlzKSkgewotICAgICAgICBzZXRDYWNoZVBvbGljeShLSU86OkNDX1JlbG9h
ZCk7Ci0gICAgfQotCi0gICAgYm9vbCByZWxvYWQgPSBuZWVkUmVsb2FkKGZ1bGxVUkwpOwotCi0g
ICAgQ2FjaGVkU2NyaXB0ICpjYWNoZWRPYmplY3QgPSBDYWNoZTo6cmVxdWVzdFNjcmlwdCh0aGlz
LCB1cmwsIHJlbG9hZCwgbV9leHBpcmVEYXRlLCBjaGFyc2V0KTsKLSAgICBLV1FDaGVja0NhY2hl
T2JqZWN0U3RhdHVzKHRoaXMsIGNhY2hlZE9iamVjdCk7Ci0gICAgcmV0dXJuIGNhY2hlZE9iamVj
dDsKLX0KLQotI2lmZGVmIEtIVE1MX1hTTFQKLUNhY2hlZFhTTFN0eWxlU2hlZXQqIERvY0xvYWRl
cjo6cmVxdWVzdFhTTFN0eWxlU2hlZXQoY29uc3QgRE9NOjpET01TdHJpbmcgJnVybCkKLXsKLSAg
ICBLVVJMIGZ1bGxVUkwgPSBtX2RvYy0+Y29tcGxldGVVUkwodXJsLnFzdHJpbmcoKSk7Ci0gICAg
Ci0gICAgaWYgKG1fcGFydCAmJiBtX3BhcnQtPm9ubHlMb2NhbFJlZmVyZW5jZXMoKSAmJiBmdWxs
VVJMLnByb3RvY29sKCkgIT0gImZpbGUiKSByZXR1cm4gMDsKLSAgICAKLSAgICBpZiAoS1dRQ2hl
Y2tJZlJlbG9hZGluZyh0aGlzKSkKLSAgICAgICAgc2V0Q2FjaGVQb2xpY3koS0lPOjpDQ19SZWxv
YWQpOwotICAgIAotICAgIGJvb2wgcmVsb2FkID0gbmVlZFJlbG9hZChmdWxsVVJMKTsKLSAgICAK
LSAgICBDYWNoZWRYU0xTdHlsZVNoZWV0ICpjYWNoZWRPYmplY3QgPSBDYWNoZTo6cmVxdWVzdFhT
TFN0eWxlU2hlZXQodGhpcywgdXJsLCByZWxvYWQsIG1fZXhwaXJlRGF0ZSk7Ci0gICAgS1dRQ2hl
Y2tDYWNoZU9iamVjdFN0YXR1cyh0aGlzLCBjYWNoZWRPYmplY3QpOwotICAgIHJldHVybiBjYWNo
ZWRPYmplY3Q7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBLSFRNTF9OT19YQkwKLUNhY2hlZFhCTERv
Y3VtZW50KiBEb2NMb2FkZXI6OnJlcXVlc3RYQkxEb2N1bWVudChjb25zdCBET006OkRPTVN0cmlu
ZyAmdXJsKQotewotICAgIEtVUkwgZnVsbFVSTCA9IG1fZG9jLT5jb21wbGV0ZVVSTCh1cmwucXN0
cmluZygpKTsKLSAgICAKLSAgICAvLyBGSVhNRTogSXMgdGhpcyByaWdodCBmb3IgWEJMPwotICAg
IGlmIChtX3BhcnQgJiYgbV9wYXJ0LT5vbmx5TG9jYWxSZWZlcmVuY2VzKCkgJiYgZnVsbFVSTC5w
cm90b2NvbCgpICE9ICJmaWxlIikgcmV0dXJuIDA7Ci0gICAgCi0gICAgaWYgKEtXUUNoZWNrSWZS
ZWxvYWRpbmcodGhpcykpIHsKLSAgICAgICAgc2V0Q2FjaGVQb2xpY3koS0lPOjpDQ19SZWxvYWQp
OwotICAgIH0KLSAgICAKLSAgICBib29sIHJlbG9hZCA9IG5lZWRSZWxvYWQoZnVsbFVSTCk7Ci0g
ICAgCi0gICAgQ2FjaGVkWEJMRG9jdW1lbnQgKmNhY2hlZE9iamVjdCA9IENhY2hlOjpyZXF1ZXN0
WEJMRG9jdW1lbnQodGhpcywgdXJsLCByZWxvYWQsIG1fZXhwaXJlRGF0ZSk7Ci0gICAgS1dRQ2hl
Y2tDYWNoZU9iamVjdFN0YXR1cyh0aGlzLCBjYWNoZWRPYmplY3QpOwotICAgIHJldHVybiBjYWNo
ZWRPYmplY3Q7Ci19Ci0jZW5kaWYKLQotdm9pZCBEb2NMb2FkZXI6OnNldEF1dG9sb2FkSW1hZ2Vz
KCBib29sIGVuYWJsZSApCi17Ci0gICAgaWYgKCBlbmFibGUgPT0gbV9iYXV0b2xvYWRJbWFnZXMg
KQotICAgICAgICByZXR1cm47Ci0KLSAgICBtX2JhdXRvbG9hZEltYWdlcyA9IGVuYWJsZTsKLQot
ICAgIGlmICggIW1fYmF1dG9sb2FkSW1hZ2VzICkgcmV0dXJuOwotCi0gICAgZm9yICggY29uc3Qg
Q2FjaGVkT2JqZWN0KiBjbz1tX2RvY09iamVjdHMuZmlyc3QoKTsgY287IGNvPW1fZG9jT2JqZWN0
cy5uZXh0KCkgKQotICAgICAgICBpZiAoIGNvLT50eXBlKCkgPT0gQ2FjaGVkT2JqZWN0OjpJbWFn
ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIENhY2hlZEltYWdlICppbWcgPSBjb25zdF9jYXN0
PENhY2hlZEltYWdlKj4oIHN0YXRpY19jYXN0PGNvbnN0IENhY2hlZEltYWdlICo+KCBjbyApICk7
Ci0KLSAgICAgICAgICAgIENhY2hlZE9iamVjdDo6U3RhdHVzIHN0YXR1cyA9IGltZy0+c3RhdHVz
KCk7Ci0gICAgICAgICAgICBpZiAoIHN0YXR1cyAhPSBDYWNoZWRPYmplY3Q6OlVua25vd24gKQot
ICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICBDYWNoZTo6bG9hZGVyKCkt
PmxvYWQodGhpcywgaW1nLCB0cnVlKTsKLSAgICAgICAgfQotfQotCi12b2lkIERvY0xvYWRlcjo6
c2V0Q2FjaGVQb2xpY3koIEtJTzo6Q2FjaGVDb250cm9sIGNhY2hlUG9saWN5ICkKLXsKLSAgICBt
X2NhY2hlUG9saWN5ID0gY2FjaGVQb2xpY3k7Ci19Ci0KLXZvaWQgRG9jTG9hZGVyOjpzZXRTaG93
QW5pbWF0aW9ucyggS0hUTUxTZXR0aW5nczo6S0FuaW1hdGlvbkFkdmljZSBzaG93QW5pbWF0aW9u
cyApCi17Ci0gICAgaWYgKCBzaG93QW5pbWF0aW9ucyA9PSBtX3Nob3dBbmltYXRpb25zICkgcmV0
dXJuOwotICAgIG1fc2hvd0FuaW1hdGlvbnMgPSBzaG93QW5pbWF0aW9uczsKLQotICAgIGNvbnN0
IENhY2hlZE9iamVjdCogY287Ci0gICAgZm9yICggY289bV9kb2NPYmplY3RzLmZpcnN0KCk7IGNv
OyBjbz1tX2RvY09iamVjdHMubmV4dCgpICkKLSAgICAgICAgaWYgKCBjby0+dHlwZSgpID09IENh
Y2hlZE9iamVjdDo6SW1hZ2UgKQotICAgICAgICB7Ci0gICAgICAgICAgICBDYWNoZWRJbWFnZSAq
aW1nID0gY29uc3RfY2FzdDxDYWNoZWRJbWFnZSo+KCBzdGF0aWNfY2FzdDxjb25zdCBDYWNoZWRJ
bWFnZSAqPiggY28gKSApOwotCi0gICAgICAgICAgICBpbWctPnNldFNob3dBbmltYXRpb25zKCBz
aG93QW5pbWF0aW9ucyApOwotICAgICAgICB9Ci19Ci0KLXZvaWQgRG9jTG9hZGVyOjpyZW1vdmVD
YWNoZWRPYmplY3QoIENhY2hlZE9iamVjdCogbyApIGNvbnN0Ci17Ci0gICAgbV9kb2NPYmplY3Rz
LnJlbW92ZVJlZiggbyApOwotfQotCi12b2lkIERvY0xvYWRlcjo6c2V0TG9hZEluUHJvZ3Jlc3Mo
Ym9vbCBsb2FkKQotewotICAgIG1fbG9hZEluUHJvZ3Jlc3MgPSBsb2FkOwotfQotCi0vLyAtLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotTG9hZGVyOjpMb2FkZXIoKSA6IFFPYmpl
Y3QoKQotewotICAgIG1fcmVxdWVzdHNQZW5kaW5nLnNldEF1dG9EZWxldGUoIHRydWUgKTsKLSAg
ICBtX3JlcXVlc3RzTG9hZGluZy5zZXRBdXRvRGVsZXRlKCB0cnVlICk7Ci0gICAga3dxID0gbmV3
IEtXUUxvYWRlcih0aGlzKTsKLX0KLQotTG9hZGVyOjp+TG9hZGVyKCkKLXsKLSAgICBkZWxldGUg
a3dxOwotfQotCi12b2lkIExvYWRlcjo6bG9hZChEb2NMb2FkZXIqIGRsLCBDYWNoZWRPYmplY3Qg
Km9iamVjdCwgYm9vbCBpbmNyZW1lbnRhbCkKLXsKLSAgICBSZXF1ZXN0ICpyZXEgPSBuZXcgUmVx
dWVzdChkbCwgb2JqZWN0LCBpbmNyZW1lbnRhbCk7Ci0gICAgbV9yZXF1ZXN0c1BlbmRpbmcuYXBw
ZW5kKHJlcSk7Ci0KLSAgICBlbWl0IHJlcXVlc3RTdGFydGVkKCByZXEtPm1fZG9jTG9hZGVyLCBy
ZXEtPm9iamVjdCApOwotCi0gICAgc2VydmVQZW5kaW5nUmVxdWVzdHMoKTsKLX0KLQotdm9pZCBM
b2FkZXI6OnNlcnZlUGVuZGluZ1JlcXVlc3RzKCkKLXsKLSAgaWYgKCBtX3JlcXVlc3RzUGVuZGlu
Zy5jb3VudCgpID09IDAgKQotICAgICAgcmV0dXJuOwotCi0gIC8vIGdldCB0aGUgZmlyc3QgcGVu
ZGluZyByZXF1ZXN0Ci0gIFJlcXVlc3QgKnJlcSA9IG1fcmVxdWVzdHNQZW5kaW5nLnRha2UoMCk7
Ci0KLSAgS1VSTCB1KHJlcS0+b2JqZWN0LT51cmwoKS5xc3RyaW5nKCkpOwotICBLSU86OlRyYW5z
ZmVySm9iKiBqb2IgPSBLSU86OmdldCggdSwgZmFsc2UsIGZhbHNlIC8qbm8gR1VJKi8sIHRydWUp
OwotICAKLSAgam9iLT5hZGRNZXRhRGF0YSgiY2FjaGUiLCBnZXRDYWNoZUNvbnRyb2xTdHJpbmco
cmVxLT5vYmplY3QtPmNhY2hlUG9saWN5KCkpKTsKLSAgaWYgKCFyZXEtPm9iamVjdC0+YWNjZXB0
KCkuaXNFbXB0eSgpKQotICAgICAgam9iLT5hZGRNZXRhRGF0YSgiYWNjZXB0IiwgcmVxLT5vYmpl
Y3QtPmFjY2VwdCgpKTsKLSAgaWYgKCByZXEtPm1fZG9jTG9hZGVyICkgIHsKLSAgICAgIEtVUkwg
ciA9IHJlcS0+bV9kb2NMb2FkZXItPmRvYygpLT5VUkwoKTsKLSAgICAgIGlmICggci5wcm90b2Nv
bCgpLnN0YXJ0c1dpdGgoICJodHRwIiApICYmIHIucGF0aCgpLmlzRW1wdHkoKSApCi0gICAgICAg
ICAgci5zZXRQYXRoKCAiLyIgKTsKLQotICAgICAgam9iLT5hZGRNZXRhRGF0YSgicmVmZXJyZXIi
LCByLnVybCgpKTsKLSAgICAgIFFTdHJpbmcgZG9tYWluID0gci5ob3N0KCk7Ci0gICAgICBpZiAo
cmVxLT5tX2RvY0xvYWRlci0+ZG9jKCktPmlzSFRNTERvY3VtZW50KCkpCi0gICAgICAgICBkb21h
aW4gPSBzdGF0aWNfY2FzdDxIVE1MRG9jdW1lbnRJbXBsKj4ocmVxLT5tX2RvY0xvYWRlci0+ZG9j
KCkpLT5kb21haW4oKS5xc3RyaW5nKCk7Ci0gICAgICBpZiAoY3Jvc3NEb21haW4odS5ob3N0KCks
IGRvbWFpbikpCi0gICAgICAgICBqb2ItPmFkZE1ldGFEYXRhKCJjcm9zcy1kb21haW4iLCAidHJ1
ZSIpOwotICB9Ci0KLSAgY29ubmVjdCggam9iLCBTSUdOQUwoIHJlc3VsdCggS0lPOjpKb2IgKiwg
TlNEYXRhICopICksIHRoaXMsIFNMT1QoIHNsb3RGaW5pc2hlZCggS0lPOjpKb2IgKiwgTlNEYXRh
ICopICkgKTsKLSAgCi0gIGNvbm5lY3QoIGpvYiwgU0lHTkFMKCBkYXRhKCBLSU86OkpvYiosIGNv
bnN0IGNoYXIgKiwgaW50KSksCi0gICAgICAgICAgIFNMT1QoIHNsb3REYXRhKCBLSU86OkpvYios
IGNvbnN0IGNoYXIgKiwgaW50KSkpOwotICBjb25uZWN0KCBqb2IsIFNJR05BTCggcmVjZWl2ZWRS
ZXNwb25zZSggS0lPOjpKb2IgKiwgTlNVUkxSZXNwb25zZSAqKSksIFNMT1QoIHNsb3RSZWNlaXZl
ZFJlc3BvbnNlKCBLSU86OkpvYiAqLCBOU1VSTFJlc3BvbnNlICopKSApOwotCi0gIGlmIChLV1FT
ZXJ2ZVJlcXVlc3QodGhpcywgcmVxLCBqb2IpKSB7Ci0gICAgICBpZiAocmVxLT5vYmplY3QtPnR5
cGUoKSA9PSBDYWNoZWRPYmplY3Q6OkltYWdlKSB7Ci0JQ2FjaGVkSW1hZ2UgKmNpID0gc3RhdGlj
X2Nhc3Q8Q2FjaGVkSW1hZ2UqPihyZXEtPm9iamVjdCk7Ci0JaWYgKGNpLT5kZWNvZGVyQ2FsbGJh
Y2soKSkgewotCSAgICBtX3JlcXVlc3RzQmFja2dyb3VuZERlY29kaW5nLmFwcGVuZChyZXEpOwot
CX0KLSAgICAgIH0KLSAgICAgIG1fcmVxdWVzdHNMb2FkaW5nLmluc2VydChqb2IsIHJlcSk7Ci0g
IH0KLX0KLQotdm9pZCBMb2FkZXI6OnNsb3RGaW5pc2hlZCggS0lPOjpKb2IqIGpvYiwgTlNEYXRh
ICphbGxEYXRhKQotewotICAgIFJlcXVlc3QgKnIgPSBtX3JlcXVlc3RzTG9hZGluZy50YWtlKCBq
b2IgKTsKLSAgICBLSU86OlRyYW5zZmVySm9iKiBqID0gc3RhdGljX2Nhc3Q8S0lPOjpUcmFuc2Zl
ckpvYio+KGpvYik7Ci0KLSAgICBpZiAoICFyICkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgQ2Fj
aGVkT2JqZWN0ICpvYmplY3QgPSByLT5vYmplY3Q7Ci0gICAgRG9jTG9hZGVyICpkb2NMb2FkZXIg
PSByLT5tX2RvY0xvYWRlcjsKLSAgICAKLSAgICBib29sIGJhY2tncm91bmRJbWFnZURlY29kaW5n
ID0gKG9iamVjdC0+dHlwZSgpID09IENhY2hlZE9iamVjdDo6SW1hZ2UgJiYgCi0Jc3RhdGljX2Nh
c3Q8Q2FjaGVkSW1hZ2UqPihvYmplY3QpLT5kZWNvZGVyQ2FsbGJhY2soKSk7Ci0JCi0gICAgaWYg
KGotPmVycm9yKCkgfHwgai0+aXNFcnJvclBhZ2UoKSkgewotICAgICAgICAvLyBVc2UgdGhlIGJh
Y2tncm91bmQgaW1hZ2UgZGVjb2RlcidzIGNhbGxiYWNrIHRvIGhhbmRsZSB0aGUgZXJyb3IuCi0g
ICAgICAgIGlmIChiYWNrZ3JvdW5kSW1hZ2VEZWNvZGluZykgewotICAgICAgICAgICAgQ2FjaGVk
SW1hZ2VDYWxsYmFjayAqY2FsbGJhY2sgPSBzdGF0aWNfY2FzdDxDYWNoZWRJbWFnZSo+KG9iamVj
dCktPmRlY29kZXJDYWxsYmFjaygpOwotICAgICAgICAgICAgY2FsbGJhY2stPmhhbmRsZUVycm9y
KCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBkb2NMb2FkZXItPnNl
dExvYWRJblByb2dyZXNzKHRydWUpOwotICAgICAgICAgICAgci0+b2JqZWN0LT5lcnJvciggam9i
LT5lcnJvcigpLCBqb2ItPmVycm9yVGV4dCgpLmFzY2lpKCkgKTsKLSAgICAgICAgICAgIGRvY0xv
YWRlci0+c2V0TG9hZEluUHJvZ3Jlc3MoZmFsc2UpOwotICAgICAgICAgICAgZW1pdCByZXF1ZXN0
RmFpbGVkKCBkb2NMb2FkZXIsIG9iamVjdCApOwotICAgICAgICAgICAgQ2FjaGU6OnJlbW92ZUNh
Y2hlRW50cnkoIG9iamVjdCApOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgewotICAgICAg
ICBkb2NMb2FkZXItPnNldExvYWRJblByb2dyZXNzKHRydWUpOwotICAgICAgICBvYmplY3QtPmRh
dGEoci0+bV9idWZmZXIsIHRydWUpOwotICAgICAgICByLT5vYmplY3QtPnNldEFsbERhdGEoYWxs
RGF0YSk7Ci0gICAgICAgIGRvY0xvYWRlci0+c2V0TG9hZEluUHJvZ3Jlc3MoZmFsc2UpOwotICAg
ICAgICAKLSAgICAgICAgLy8gTGV0IHRoZSBiYWNrZ3JvdW5kIGltYWdlIGRlY29kZXIgdHJpZ2dl
ciB0aGUgZG9uZSBzaWduYWwuCi0gICAgICAgIGlmICghYmFja2dyb3VuZEltYWdlRGVjb2Rpbmcp
Ci0gICAgICAgICAgICBlbWl0IHJlcXVlc3REb25lKCBkb2NMb2FkZXIsIG9iamVjdCApOwotCi0g
ICAgICAgIG9iamVjdC0+ZmluaXNoKCk7Ci0gICAgfQotCi0gICAgLy8gTGV0IHRoZSBiYWNrZ3Jv
dW5kIGltYWdlIGRlY29kZXIgcmVsZWFzZSB0aGUgcmVxdWVzdCB3aGVuIGl0IGlzCi0gICAgLy8g
ZmluaXNoZWQuCi0gICAgaWYgKCFiYWNrZ3JvdW5kSW1hZ2VEZWNvZGluZykgewotICAgICAgICBk
ZWxldGUgcjsKLSAgICB9Ci0KLSAgICBzZXJ2ZVBlbmRpbmdSZXF1ZXN0cygpOwotfQotCi0KLXZv
aWQgTG9hZGVyOjpzbG90UmVjZWl2ZWRSZXNwb25zZShLSU86OkpvYiogam9iLCBOU1VSTFJlc3Bv
bnNlICpyZXNwb25zZSkKLXsKLSAgICBSZXF1ZXN0ICpyID0gbV9yZXF1ZXN0c0xvYWRpbmdbam9i
XTsKLSAgICBBU1NFUlQocik7Ci0gICAgQVNTRVJUKHJlc3BvbnNlKTsKLSAgICByLT5vYmplY3Qt
PnNldFJlc3BvbnNlKHJlc3BvbnNlKTsKLSAgICByLT5vYmplY3QtPnNldEV4cGlyZURhdGUoS1dR
Q2FjaGVPYmplY3RFeHBpcmVzVGltZShyLT5tX2RvY0xvYWRlciwgcmVzcG9uc2UpLCBmYWxzZSk7
Ci0gICAgCi0gICAgUVN0cmluZyBjaHMgPSBzdGF0aWNfY2FzdDxLSU86OlRyYW5zZmVySm9iKj4o
am9iKS0+cXVlcnlNZXRhRGF0YSgiY2hhcnNldCIpOwotICAgIGlmICghY2hzLmlzTnVsbCgpKQot
ICAgICAgICByLT5vYmplY3QtPnNldENoYXJzZXQoY2hzKTsKLSAgICAKLSAgICBpZiAoci0+bXVs
dGlwYXJ0KSB7Ci0gICAgICAgIEFTU0VSVChyLT5vYmplY3QtPmlzSW1hZ2UoKSk7Ci0gICAgICAg
IHN0YXRpY19jYXN0PENhY2hlZEltYWdlICo+KHItPm9iamVjdCktPmNsZWFyKCk7Ci0gICAgICAg
IHItPm1fYnVmZmVyID0gUUJ1ZmZlcigpOwotICAgICAgICBpZiAoci0+bV9kb2NMb2FkZXItPnBh
cnQoKSkKLSAgICAgICAgICAgIHItPm1fZG9jTG9hZGVyLT5wYXJ0KCktPmNoZWNrQ29tcGxldGVk
KCk7Ci0gICAgICAgIAotICAgIH0gZWxzZSBpZiAoS1dRUmVzcG9uc2VJc011bHRpcGFydChyZXNw
b25zZSkpIHsKLSAgICAgICAgci0+bXVsdGlwYXJ0ID0gdHJ1ZTsKLSAgICAgICAgaWYgKCFyLT5v
YmplY3QtPmlzSW1hZ2UoKSkKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PEtJTzo6VHJhbnNmZXJK
b2IqPihqb2IpLT5jYW5jZWwoKTsKLSAgICB9Ci19Ci0KLQotdm9pZCBMb2FkZXI6OnNsb3REYXRh
KCBLSU86OkpvYipqb2IsIGNvbnN0IGNoYXIgKmRhdGEsIGludCBzaXplICkKLXsKLSAgICBSZXF1
ZXN0ICpyID0gbV9yZXF1ZXN0c0xvYWRpbmdbam9iXTsKLSAgICBpZighcikgewotICAgICAgICBr
ZERlYnVnKCA2MDYwICkgPDwgImdvdCBkYXRhIGZvciB1bmtub3duIHJlcXVlc3QhIiA8PCBlbmRs
OwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKCAhci0+bV9idWZmZXIuaXNPcGVu
KCkgKQotICAgICAgICByLT5tX2J1ZmZlci5vcGVuKCBJT19Xcml0ZU9ubHkgKTsKLQotICAgIHIt
Pm1fYnVmZmVyLndyaXRlQmxvY2soIGRhdGEsIHNpemUgKTsKLQotICAgIGlmIChyLT5tdWx0aXBh
cnQpCi0gICAgICAgIHItPm9iamVjdC0+ZGF0YSggci0+bV9idWZmZXIsIHRydWUgKTsgLy8gdGhl
IGxvYWRlciBkZWxpdmVycyB0aGUgZGF0YSBpbiBhIG11bHRpcGFydCBzZWN0aW9uIGFsbCBhdCBv
bmNlLCBzZW5kIGVvZgotICAgIGVsc2UgaWYoci0+aW5jcmVtZW50YWwpCi0gICAgICAgIHItPm9i
amVjdC0+ZGF0YSggci0+bV9idWZmZXIsIGZhbHNlICk7Ci19Ci0KLWludCBMb2FkZXI6Om51bVJl
cXVlc3RzKCBEb2NMb2FkZXIqIGRsICkgY29uc3QKLXsKLSAgICBpbnQgcmVzID0gMDsKLQotICAg
IFFQdHJMaXN0SXRlcmF0b3I8UmVxdWVzdD4gcEl0KCBtX3JlcXVlc3RzUGVuZGluZyApOwotICAg
IGZvciAoOyBwSXQuY3VycmVudCgpOyArK3BJdCApCi0gICAgICAgIGlmICggcEl0LmN1cnJlbnQo
KS0+bV9kb2NMb2FkZXIgPT0gZGwgKQotICAgICAgICAgICAgcmVzKys7Ci0KLSAgICBRUHRyRGlj
dEl0ZXJhdG9yPFJlcXVlc3Q+IGxJdCggbV9yZXF1ZXN0c0xvYWRpbmcgKTsKLSAgICBmb3IgKDsg
bEl0LmN1cnJlbnQoKTsgKytsSXQgKQotICAgICAgICBpZiAoIGxJdC5jdXJyZW50KCktPm1fZG9j
TG9hZGVyID09IGRsICkKLSAgICAgICAgICAgIGlmICghbEl0LmN1cnJlbnQoKS0+bXVsdGlwYXJ0
KQotICAgICAgICAgICAgICAgIHJlcysrOwotCi0gICAgUVB0ckxpc3RJdGVyYXRvcjxSZXF1ZXN0
PiBiZEl0KCBtX3JlcXVlc3RzQmFja2dyb3VuZERlY29kaW5nICk7Ci0gICAgZm9yICg7IGJkSXQu
Y3VycmVudCgpOyArK2JkSXQgKQotICAgICAgICBpZiAoIGJkSXQuY3VycmVudCgpLT5tX2RvY0xv
YWRlciA9PSBkbCApCi0gICAgICAgICAgICByZXMrKzsKLQotICAgIGlmIChkbC0+bG9hZEluUHJv
Z3Jlc3MoKSkKLSAgICAgICAgcmVzKys7Ci0gICAgICAgIAotICAgIHJldHVybiByZXM7Ci19Ci0K
LXZvaWQgTG9hZGVyOjpjYW5jZWxSZXF1ZXN0cyggRG9jTG9hZGVyKiBkbCApCi17Ci0gICAgUVB0
ckxpc3RJdGVyYXRvcjxSZXF1ZXN0PiBwSXQoIG1fcmVxdWVzdHNQZW5kaW5nICk7Ci0gICAgd2hp
bGUgKCBwSXQuY3VycmVudCgpICkKLSAgICB7Ci0gICAgICAgIGlmIChwSXQuY3VycmVudCgpLT5t
X2RvY0xvYWRlciA9PSBkbCkgewotICAgICAgICAgICAgQ2FjaGU6OnJlbW92ZUNhY2hlRW50cnko
IHBJdC5jdXJyZW50KCktPm9iamVjdCApOwotICAgICAgICAgICAgbV9yZXF1ZXN0c1BlbmRpbmcu
cmVtb3ZlKCBwSXQgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICArK3BJ
dDsKLSAgICB9Ci0KLSAgICBRUHRyRGljdEl0ZXJhdG9yPFJlcXVlc3Q+IGxJdCggbV9yZXF1ZXN0
c0xvYWRpbmcgKTsKLSAgICB3aGlsZSAoIGxJdC5jdXJyZW50KCkgKQotICAgIHsKLSAgICAgICAg
aWYgKGxJdC5jdXJyZW50KCktPm1fZG9jTG9hZGVyID09IGRsKSB7Ci0gICAgICAgICAgICBLSU86
OkpvYiAqam9iID0gc3RhdGljX2Nhc3Q8S0lPOjpKb2IgKj4oIGxJdC5jdXJyZW50S2V5KCkgKTsK
LSAgICAgICAgICAgIENhY2hlOjpyZW1vdmVDYWNoZUVudHJ5KCBsSXQuY3VycmVudCgpLT5vYmpl
Y3QgKTsKLSAgICAgICAgICAgIG1fcmVxdWVzdHNMb2FkaW5nLnJlbW92ZSggbEl0LmN1cnJlbnRL
ZXkoKSApOwotICAgICAgICAgICAgam9iLT5raWxsKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxz
ZQotICAgICAgICAgICAgKytsSXQ7Ci0gICAgfQotCi0gICAgUVB0ckxpc3RJdGVyYXRvcjxSZXF1
ZXN0PiBiZEl0KCBtX3JlcXVlc3RzQmFja2dyb3VuZERlY29kaW5nICk7Ci0gICAgd2hpbGUgKGJk
SXQuY3VycmVudCgpKSB7Ci0gICAgICAgIGlmIChiZEl0LmN1cnJlbnQoKS0+bV9kb2NMb2FkZXIg
PT0gZGwpIHsKLSAgICAgICAgICAgIENhY2hlOjpyZW1vdmVDYWNoZUVudHJ5KCBiZEl0LmN1cnJl
bnQoKS0+b2JqZWN0ICk7Ci0gICAgICAgICAgICBtX3JlcXVlc3RzQmFja2dyb3VuZERlY29kaW5n
LnJlbW92ZSggYmRJdCApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgICsr
YmRJdDsKLSAgICB9Ci19Ci0KLXZvaWQgTG9hZGVyOjpyZW1vdmVCYWNrZ3JvdW5kRGVjb2RpbmdS
ZXF1ZXN0IChSZXF1ZXN0ICpyKQotewotICAgIGJvb2wgcHJlc2VudCA9IG1fcmVxdWVzdHNCYWNr
Z3JvdW5kRGVjb2RpbmcuY29udGFpbnNSZWYocik7Ci0gICAgaWYgKHByZXNlbnQpIHsKLQltX3Jl
cXVlc3RzQmFja2dyb3VuZERlY29kaW5nLnJlbW92ZSAocik7Ci0gICAgfQotfQotCi1LSU86Okpv
YiAqTG9hZGVyOjpqb2JGb3JSZXF1ZXN0KCBjb25zdCBET006OkRPTVN0cmluZyAmdXJsICkgY29u
c3QKLXsKLSAgICBRUHRyRGljdEl0ZXJhdG9yPFJlcXVlc3Q+IGl0KCBtX3JlcXVlc3RzTG9hZGlu
ZyApOwotCi0gICAgZm9yICg7IGl0LmN1cnJlbnQoKTsgKytpdCApCi0gICAgewotICAgICAgICBD
YWNoZWRPYmplY3QgKm9iaiA9IGl0LmN1cnJlbnQoKS0+b2JqZWN0OwotCi0gICAgICAgIGlmICgg
b2JqICYmIG9iai0+dXJsKCkgPT0gdXJsICkKLSAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2Fz
dDxLSU86OkpvYiAqPiggaXQuY3VycmVudEtleSgpICk7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7
Ci19Ci0KLQotYm9vbCBMb2FkZXI6OmlzS0hUTUxMb2FkZXIoKSBjb25zdAotewotICAgIHJldHVy
biB0cnVlOwotfQotCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi1MUlVMaXN0OjpMUlVM
aXN0KCkKLTptX2hlYWQoMCksIG1fdGFpbCgwKSAKLXt9Ci0KLUxSVUxpc3Q6On5MUlVMaXN0KCkK
LXt9Ci0KLVFEaWN0PENhY2hlZE9iamVjdD4gKkNhY2hlOjpjYWNoZSA9IDA7Ci1RUHRyTGlzdDxE
b2NMb2FkZXI+KiBDYWNoZTo6ZG9jbG9hZGVyID0gMDsKLUxvYWRlciAqQ2FjaGU6Om1fbG9hZGVy
ID0gMDsKLQotaW50IENhY2hlOjptYXhTaXplID0gREVGQ0FDSEVTSVpFOwotaW50IENhY2hlOjpt
YXhDYWNoZWFibGUgPSBNQVhDQUNIRUFCTEU7Ci1pbnQgQ2FjaGU6OmZsdXNoQ291bnQgPSAwOwot
Ci1RUGl4bWFwICpDYWNoZTo6bnVsbFBpeG1hcCA9IDA7Ci1RUGl4bWFwICpDYWNoZTo6YnJva2Vu
UGl4bWFwID0gMDsKLQotQ2FjaGVkT2JqZWN0ICpDYWNoZTo6bV9oZWFkT2ZVbmNhY2hlYWJsZUxp
c3QgPSAwOwotaW50IENhY2hlOjptX3RvdGFsU2l6ZU9mTFJVTGlzdHMgPSAwOwotaW50IENhY2hl
OjptX2NvdW50T2ZMUlVBbmRVbmNhY2hlYWJsZUxpc3RzOwotTFJVTGlzdCAqQ2FjaGU6Om1fTFJV
TGlzdHMgPSAwOwotCi12b2lkIENhY2hlOjppbml0KCkKLXsKLSAgICBpZiAoICFjYWNoZSApCi0g
ICAgICAgIGNhY2hlID0gbmV3IFFEaWN0PENhY2hlZE9iamVjdD4oNDAxLCB0cnVlKTsKLQotICAg
IGlmICggIWRvY2xvYWRlciApCi0gICAgICAgIGRvY2xvYWRlciA9IG5ldyBRUHRyTGlzdDxEb2NM
b2FkZXI+OwotCi0gICAgaWYgKCAhbnVsbFBpeG1hcCApCi0gICAgICAgIG51bGxQaXhtYXAgPSBu
ZXcgUVBpeG1hcDsKLQotICAgIGlmICggIWJyb2tlblBpeG1hcCApCi0gICAgICAgIGJyb2tlblBp
eG1hcCA9IEtXUUxvYWRQaXhtYXAoIm1pc3NpbmdfaW1hZ2UiKTsKLQotICAgIGlmICggIW1fbG9h
ZGVyICkKLSAgICAgICAgbV9sb2FkZXIgPSBuZXcgTG9hZGVyKCk7Ci19Ci0KLXZvaWQgQ2FjaGU6
OmNsZWFyKCkKLXsKLSAgICBpZiAoIWNhY2hlKQotICAgICAgICByZXR1cm47Ci0KLSAgICBjYWNo
ZS0+c2V0QXV0b0RlbGV0ZSggdHJ1ZSApOwotICAgIGRlbGV0ZSBjYWNoZTsgY2FjaGUgPSAwOwot
ICAgIGRlbGV0ZSBudWxsUGl4bWFwOyBudWxsUGl4bWFwID0gMDsKLSAgICBkZWxldGUgYnJva2Vu
UGl4bWFwOyBicm9rZW5QaXhtYXAgPSAwOwotICAgIGRlbGV0ZSBtX2xvYWRlcjsgICBtX2xvYWRl
ciA9IDA7Ci0gICAgZGVsZXRlIGRvY2xvYWRlcjsgZG9jbG9hZGVyID0gMDsKLX0KLQotQ2FjaGVk
SW1hZ2UgKkNhY2hlOjpyZXF1ZXN0SW1hZ2UoIERvY0xvYWRlciogZGwsIGNvbnN0IERPTVN0cmlu
ZyAmIHVybCwgYm9vbCByZWxvYWQsIHRpbWVfdCBfZXhwaXJlRGF0ZSApCi17Ci0gICAgLy8gdGhp
cyBicmluZ3MgdGhlIF91cmwgdG8gYSBzdGFuZGFyZCBmb3JtLi4uCi0gICAgS1VSTCBrdXJsOwot
ICAgIGlmIChkbCkKLSAgICAgICAga3VybCA9IGRsLT5tX2RvYy0+Y29tcGxldGVVUkwoIHVybC5x
c3RyaW5nKCkgKTsKLSAgICBlbHNlCi0gICAgICAgIGt1cmwgPSB1cmwucXN0cmluZygpOwotICAg
IHJldHVybiByZXF1ZXN0SW1hZ2UoZGwsIGt1cmwsIHJlbG9hZCwgX2V4cGlyZURhdGUpOwotfQot
Ci1DYWNoZWRJbWFnZSAqQ2FjaGU6OnJlcXVlc3RJbWFnZSggRG9jTG9hZGVyKiBkbCwgY29uc3Qg
S1VSTCAmIHVybCwgYm9vbCByZWxvYWQsIHRpbWVfdCBfZXhwaXJlRGF0ZSApCi17Ci0gICAgS0lP
OjpDYWNoZUNvbnRyb2wgY2FjaGVQb2xpY3k7Ci0gICAgaWYgKGRsKQotICAgICAgICBjYWNoZVBv
bGljeSA9IGRsLT5jYWNoZVBvbGljeSgpOwotICAgIGVsc2UKLSAgICAgICAgY2FjaGVQb2xpY3kg
PSBLSU86OkNDX1ZlcmlmeTsKLQotICAgIC8vIENoZWNraW5nIGlmIHRoZSBVUkwgaXMgbWFsZm9y
bWVkIGlzIGxvdHMgb2YgZXh0cmEgd29yayBmb3IgbGl0dGxlIGJlbmVmaXQuCi0KLSAgICBpZiAo
IWRsLT5kb2MoKS0+c2hvdWxkQ3JlYXRlUmVuZGVyZXJzKCkpewotICAgICAgICByZXR1cm4gMDsK
LSAgICB9Ci0KLSAgICBDYWNoZWRPYmplY3QgKm8gPSAwOwotICAgIGlmICghcmVsb2FkKQotICAg
ICAgICBvID0gY2FjaGUtPmZpbmQodXJsLnVybCgpKTsKLSAgICBpZighbykKLSAgICB7Ci0jaWZk
ZWYgQ0FDSEVfREVCVUcKLSAgICAgICAga2REZWJ1ZyggNjA2MCApIDw8ICJDYWNoZTogbmV3OiAi
IDw8IHVybC51cmwoKSA8PCBlbmRsOwotI2VuZGlmCi0gICAgICAgIENhY2hlZEltYWdlICppbSA9
IG5ldyBDYWNoZWRJbWFnZShkbCwgdXJsLnVybCgpLCBjYWNoZVBvbGljeSwgX2V4cGlyZURhdGUp
OwotICAgICAgICBpZiAoIGRsICYmIGRsLT5hdXRvbG9hZEltYWdlcygpICkgQ2FjaGU6OmxvYWRl
cigpLT5sb2FkKGRsLCBpbSwgdHJ1ZSk7Ci0gICAgICAgIGlmIChjYWNoZURpc2FibGVkKQotICAg
ICAgICAgICAgaW0tPnNldEZyZWUodHJ1ZSk7Ci0gICAgICAgIGVsc2UgewotICAgICAgICBjYWNo
ZS0+aW5zZXJ0KCB1cmwudXJsKCksIGltICk7Ci0gICAgICAgIG1vdmVUb0hlYWRPZkxSVUxpc3Qo
aW0pOwotICAgICAgICB9Ci0gICAgICAgIG8gPSBpbTsKLSAgICB9Ci0KLSAgICAKLSAgICBpZihv
LT50eXBlKCkgIT0gQ2FjaGVkT2JqZWN0OjpJbWFnZSkKLSAgICB7Ci0jaWZkZWYgQ0FDSEVfREVC
VUcKLSAgICAgICAga2REZWJ1ZyggNjA2MCApIDw8ICJDYWNoZTo6SW50ZXJuYWwgRXJyb3IgaW4g
cmVxdWVzdEltYWdlIHVybD0iIDw8IGt1cmwudXJsKCkgPDwgIiEiIDw8IGVuZGw7Ci0jZW5kaWYK
LSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0jaWZkZWYgQ0FDSEVfREVCVUcKLSAgICBpZigg
by0+c3RhdHVzKCkgPT0gQ2FjaGVkT2JqZWN0OjpQZW5kaW5nICkKLSAgICAgICAga2REZWJ1Zygg
NjA2MCApIDw8ICJDYWNoZTogbG9hZGluZyBpbiBwcm9ncmVzczogIiA8PCBrdXJsLnVybCgpIDw8
IGVuZGw7Ci0gICAgZWxzZQotICAgICAgICBrZERlYnVnKCA2MDYwICkgPDwgIkNhY2hlOiB1c2lu
ZyBjYWNoZWQ6ICIgPDwga3VybC51cmwoKSA8PCAiLCBzdGF0dXMgIiA8PCBvLT5zdGF0dXMoKSA8
PCBlbmRsOwotI2VuZGlmCi0KLSAgICBtb3ZlVG9IZWFkT2ZMUlVMaXN0KG8pOwotICAgIGlmICgg
ZGwgKSB7Ci0gICAgICAgIGRsLT5tX2RvY09iamVjdHMucmVtb3ZlKCBvICk7Ci0gICAgICAgIGlm
ICghY2FjaGVEaXNhYmxlZCkKLSAgICAgICAgZGwtPm1fZG9jT2JqZWN0cy5hcHBlbmQoIG8gKTsK
LSAgICB9Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PENhY2hlZEltYWdlICo+KG8pOwotfQotCi1D
YWNoZWRDU1NTdHlsZVNoZWV0ICpDYWNoZTo6cmVxdWVzdFN0eWxlU2hlZXQoIERvY0xvYWRlciog
ZGwsIGNvbnN0IERPTVN0cmluZyAmIHVybCwgYm9vbCByZWxvYWQsIHRpbWVfdCBfZXhwaXJlRGF0
ZSwgY29uc3QgUVN0cmluZyYgY2hhcnNldCkKLXsKLSAgICAvLyB0aGlzIGJyaW5ncyB0aGUgX3Vy
bCB0byBhIHN0YW5kYXJkIGZvcm0uLi4KLSAgICBLVVJMIGt1cmw7Ci0gICAgS0lPOjpDYWNoZUNv
bnRyb2wgY2FjaGVQb2xpY3k7Ci0gICAgaWYgKCBkbCApCi0gICAgewotICAgICAgICBrdXJsID0g
ZGwtPm1fZG9jLT5jb21wbGV0ZVVSTCggdXJsLnFzdHJpbmcoKSApOwotICAgICAgICBjYWNoZVBv
bGljeSA9IGRsLT5jYWNoZVBvbGljeSgpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAg
ICBrdXJsID0gdXJsLnFzdHJpbmcoKTsKLSAgICAgICAgY2FjaGVQb2xpY3kgPSBLSU86OkNDX1Zl
cmlmeTsKLSAgICB9Ci0KLSAgICAvLyBDaGVja2luZyBpZiB0aGUgVVJMIGlzIG1hbGZvcm1lZCBp
cyBsb3RzIG9mIGV4dHJhIHdvcmsgZm9yIGxpdHRsZSBiZW5lZml0LgotCi0gICAgQ2FjaGVkT2Jq
ZWN0ICpvID0gY2FjaGUtPmZpbmQoa3VybC51cmwoKSk7Ci0gICAgaWYoIW8pCi0gICAgewotI2lm
ZGVmIENBQ0hFX0RFQlVHCi0gICAgICAgIGtkRGVidWcoIDYwNjAgKSA8PCAiQ2FjaGU6IG5ldzog
IiA8PCBrdXJsLnVybCgpIDw8IGVuZGw7Ci0jZW5kaWYKLSAgICAgICAgQ2FjaGVkQ1NTU3R5bGVT
aGVldCAqc2hlZXQgPSBuZXcgQ2FjaGVkQ1NTU3R5bGVTaGVldChkbCwga3VybC51cmwoKSwgY2Fj
aGVQb2xpY3ksIF9leHBpcmVEYXRlLCBjaGFyc2V0KTsKLSAgICAgICAgaWYgKGNhY2hlRGlzYWJs
ZWQpCi0gICAgICAgICAgICBzaGVldC0+c2V0RnJlZSh0cnVlKTsKLSAgICAgICAgZWxzZSB7Ci0g
ICAgICAgIGNhY2hlLT5pbnNlcnQoIGt1cmwudXJsKCksIHNoZWV0ICk7Ci0gICAgICAgIG1vdmVU
b0hlYWRPZkxSVUxpc3Qoc2hlZXQpOwotICAgICAgICB9Ci0gICAgICAgIG8gPSBzaGVldDsKLSAg
ICB9Ci0KLSAgICAKLSAgICBpZihvLT50eXBlKCkgIT0gQ2FjaGVkT2JqZWN0OjpDU1NTdHlsZVNo
ZWV0KQotICAgIHsKLSNpZmRlZiBDQUNIRV9ERUJVRwotICAgICAgICBrZERlYnVnKCA2MDYwICkg
PDwgIkNhY2hlOjpJbnRlcm5hbCBFcnJvciBpbiByZXF1ZXN0U3R5bGVTaGVldCB1cmw9IiA8PCBr
dXJsLnVybCgpIDw8ICIhIiA8PCBlbmRsOwotI2VuZGlmCi0gICAgICAgIHJldHVybiAwOwotICAg
IH0KLQotI2lmZGVmIENBQ0hFX0RFQlVHCi0gICAgaWYoIG8tPnN0YXR1cygpID09IENhY2hlZE9i
amVjdDo6UGVuZGluZyApCi0gICAgICAgIGtkRGVidWcoIDYwNjAgKSA8PCAiQ2FjaGU6IGxvYWRp
bmcgaW4gcHJvZ3Jlc3M6ICIgPDwga3VybC51cmwoKSA8PCBlbmRsOwotICAgIGVsc2UKLSAgICAg
ICAga2REZWJ1ZyggNjA2MCApIDw8ICJDYWNoZTogdXNpbmcgY2FjaGVkOiAiIDw8IGt1cmwudXJs
KCkgPDwgZW5kbDsKLSNlbmRpZgotCi0gICAgbW92ZVRvSGVhZE9mTFJVTGlzdChvKTsKLSAgICBp
ZiAoIGRsICkgewotICAgICAgICBkbC0+bV9kb2NPYmplY3RzLnJlbW92ZSggbyApOwotICAgICAg
ICBpZiAoIWNhY2hlRGlzYWJsZWQpCi0gICAgICAgIGRsLT5tX2RvY09iamVjdHMuYXBwZW5kKCBv
ICk7Ci0gICAgfQotICAgIHJldHVybiBzdGF0aWNfY2FzdDxDYWNoZWRDU1NTdHlsZVNoZWV0ICo+
KG8pOwotfQotCi12b2lkIENhY2hlOjpwcmVsb2FkU3R5bGVTaGVldCggY29uc3QgUVN0cmluZyAm
dXJsLCBjb25zdCBRU3RyaW5nICZzdHlsZXNoZWV0X2RhdGEpCi17Ci0gICAgQ2FjaGVkT2JqZWN0
ICpvID0gY2FjaGUtPmZpbmQodXJsKTsKLSAgICBpZihvKQotICAgICAgICByZW1vdmVDYWNoZUVu
dHJ5KG8pOwotCi0gICAgQ2FjaGVkQ1NTU3R5bGVTaGVldCAqc3R5bGVzaGVldCA9IG5ldyBDYWNo
ZWRDU1NTdHlsZVNoZWV0KHVybCwgc3R5bGVzaGVldF9kYXRhKTsKLSAgICBjYWNoZS0+aW5zZXJ0
KCB1cmwsIHN0eWxlc2hlZXQgKTsKLX0KLQotQ2FjaGVkU2NyaXB0ICpDYWNoZTo6cmVxdWVzdFNj
cmlwdCggRG9jTG9hZGVyKiBkbCwgY29uc3QgRE9NOjpET01TdHJpbmcgJnVybCwgYm9vbCByZWxv
YWQsIHRpbWVfdCBfZXhwaXJlRGF0ZSwgY29uc3QgUVN0cmluZyYgY2hhcnNldCkKLXsKLSAgICAv
LyB0aGlzIGJyaW5ncyB0aGUgX3VybCB0byBhIHN0YW5kYXJkIGZvcm0uLi4KLSAgICBLVVJMIGt1
cmw7Ci0gICAgS0lPOjpDYWNoZUNvbnRyb2wgY2FjaGVQb2xpY3k7Ci0gICAgaWYgKCBkbCApCi0g
ICAgewotICAgICAgICBrdXJsID0gZGwtPm1fZG9jLT5jb21wbGV0ZVVSTCggdXJsLnFzdHJpbmco
KSApOwotICAgICAgICBjYWNoZVBvbGljeSA9IGRsLT5jYWNoZVBvbGljeSgpOwotICAgIH0KLSAg
ICBlbHNlCi0gICAgewotICAgICAgICBrdXJsID0gdXJsLnFzdHJpbmcoKTsKLSAgICAgICAgY2Fj
aGVQb2xpY3kgPSBLSU86OkNDX1ZlcmlmeTsKLSAgICB9Ci0KLSAgICAvLyBDaGVja2luZyBpZiB0
aGUgVVJMIGlzIG1hbGZvcm1lZCBpcyBsb3RzIG9mIGV4dHJhIHdvcmsgZm9yIGxpdHRsZSBiZW5l
Zml0LgotCi0gICAgQ2FjaGVkT2JqZWN0ICpvID0gY2FjaGUtPmZpbmQoa3VybC51cmwoKSk7Ci0g
ICAgaWYoIW8pCi0gICAgewotI2lmZGVmIENBQ0hFX0RFQlVHCi0gICAgICAgIGtkRGVidWcoIDYw
NjAgKSA8PCAiQ2FjaGU6IG5ldzogIiA8PCBrdXJsLnVybCgpIDw8IGVuZGw7Ci0jZW5kaWYKLSAg
ICAgICAgQ2FjaGVkU2NyaXB0ICpzY3JpcHQgPSBuZXcgQ2FjaGVkU2NyaXB0KGRsLCBrdXJsLnVy
bCgpLCBjYWNoZVBvbGljeSwgX2V4cGlyZURhdGUsIGNoYXJzZXQpOwotICAgICAgICBpZiAoY2Fj
aGVEaXNhYmxlZCkKLSAgICAgICAgICAgIHNjcmlwdC0+c2V0RnJlZSh0cnVlKTsKLSAgICAgICAg
ZWxzZSB7Ci0gICAgICAgIGNhY2hlLT5pbnNlcnQoIGt1cmwudXJsKCksIHNjcmlwdCApOwotICAg
ICAgICBtb3ZlVG9IZWFkT2ZMUlVMaXN0KHNjcmlwdCk7Ci0gICAgICAgIH0KLSAgICAgICAgbyA9
IHNjcmlwdDsKLSAgICB9Ci0KLSAgICAKLSAgICBpZighKG8tPnR5cGUoKSA9PSBDYWNoZWRPYmpl
Y3Q6OlNjcmlwdCkpCi0gICAgewotI2lmZGVmIENBQ0hFX0RFQlVHCi0gICAgICAgIGtkRGVidWco
IDYwNjAgKSA8PCAiQ2FjaGU6OkludGVybmFsIEVycm9yIGluIHJlcXVlc3RTY3JpcHQgdXJsPSIg
PDwga3VybC51cmwoKSA8PCAiISIgPDwgZW5kbDsKLSNlbmRpZgotICAgICAgICByZXR1cm4gMDsK
LSAgICB9Ci0gICAgCi0gICAgCi0jaWZkZWYgQ0FDSEVfREVCVUcKLSAgICBpZiggby0+c3RhdHVz
KCkgPT0gQ2FjaGVkT2JqZWN0OjpQZW5kaW5nICkKLSAgICAgICAga2REZWJ1ZyggNjA2MCApIDw8
ICJDYWNoZTogbG9hZGluZyBpbiBwcm9ncmVzczogIiA8PCBrdXJsLnVybCgpIDw8IGVuZGw7Ci0g
ICAgZWxzZQotICAgICAgICBrZERlYnVnKCA2MDYwICkgPDwgIkNhY2hlOiB1c2luZyBjYWNoZWQ6
ICIgPDwga3VybC51cmwoKSA8PCBlbmRsOwotI2VuZGlmCi0KLSAgICBtb3ZlVG9IZWFkT2ZMUlVM
aXN0KG8pOwotICAgIGlmICggZGwgKSB7Ci0gICAgICAgIGRsLT5tX2RvY09iamVjdHMucmVtb3Zl
KCBvICk7Ci0gICAgICAgIGlmICghY2FjaGVEaXNhYmxlZCkKLSAgICAgICAgZGwtPm1fZG9jT2Jq
ZWN0cy5hcHBlbmQoIG8gKTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PENhY2hlZFNj
cmlwdCAqPihvKTsKLX0KLQotdm9pZCBDYWNoZTo6cHJlbG9hZFNjcmlwdCggY29uc3QgUVN0cmlu
ZyAmdXJsLCBjb25zdCBRU3RyaW5nICZzY3JpcHRfZGF0YSkKLXsKLSAgICBDYWNoZWRPYmplY3Qg
Km8gPSBjYWNoZS0+ZmluZCh1cmwpOwotICAgIGlmKG8pCi0gICAgICAgIHJlbW92ZUNhY2hlRW50
cnkobyk7Ci0KLSAgICBDYWNoZWRTY3JpcHQgKnNjcmlwdCA9IG5ldyBDYWNoZWRTY3JpcHQodXJs
LCBzY3JpcHRfZGF0YSk7Ci0gICAgY2FjaGUtPmluc2VydCggdXJsLCBzY3JpcHQgKTsKLX0KLQot
I2lmZGVmIEtIVE1MX1hTTFQKLUNhY2hlZFhTTFN0eWxlU2hlZXQqIENhY2hlOjpyZXF1ZXN0WFNM
U3R5bGVTaGVldChEb2NMb2FkZXIqIGRsLCBjb25zdCBET01TdHJpbmcgJiB1cmwsIGJvb2wgcmVs
b2FkLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0
aW1lX3QgX2V4cGlyZURhdGUpCi17Ci0gICAgLy8gdGhpcyBicmluZ3MgdGhlIF91cmwgdG8gYSBz
dGFuZGFyZCBmb3JtLi4uCi0gICAgS1VSTCBrdXJsOwotICAgIEtJTzo6Q2FjaGVDb250cm9sIGNh
Y2hlUG9saWN5OwotICAgIGlmIChkbCkgewotICAgICAgICBrdXJsID0gZGwtPm1fZG9jLT5jb21w
bGV0ZVVSTCh1cmwucXN0cmluZygpKTsKLSAgICAgICAgY2FjaGVQb2xpY3kgPSBkbC0+Y2FjaGVQ
b2xpY3koKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGt1cmwgPSB1cmwucXN0cmluZygp
OwotICAgICAgICBjYWNoZVBvbGljeSA9IEtJTzo6Q0NfVmVyaWZ5OwotICAgIH0KLSAgICAKLSAg
ICAvLyBDaGVja2luZyBpZiB0aGUgVVJMIGlzIG1hbGZvcm1lZCBpcyBsb3RzIG9mIGV4dHJhIHdv
cmsgZm9yIGxpdHRsZSBiZW5lZml0LgotICAgIAotICAgIENhY2hlZE9iamVjdCAqbyA9IGNhY2hl
LT5maW5kKGt1cmwudXJsKCkpOwotICAgIGlmICghbykgewotI2lmZGVmIENBQ0hFX0RFQlVHCi0g
ICAgICAgIGtkRGVidWcoIDYwNjAgKSA8PCAiQ2FjaGU6IG5ldzogIiA8PCBrdXJsLnVybCgpIDw8
IGVuZGw7Ci0jZW5kaWYKLSAgICAgICAgQ2FjaGVkWFNMU3R5bGVTaGVldCogZG9jID0gbmV3IENh
Y2hlZFhTTFN0eWxlU2hlZXQoZGwsIGt1cmwudXJsKCksIGNhY2hlUG9saWN5LCBfZXhwaXJlRGF0
ZSk7Ci0gICAgICAgIGlmIChjYWNoZURpc2FibGVkKQotICAgICAgICAgICAgZG9jLT5zZXRGcmVl
KHRydWUpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGNhY2hlLT5pbnNlcnQoa3VybC51
cmwoKSwgZG9jKTsKLSAgICAgICAgICAgIG1vdmVUb0hlYWRPZkxSVUxpc3QoZG9jKTsKLSAgICAg
ICAgfQotICAgICAgICBvID0gZG9jOwotICAgIH0KLSAgICAKLSAgICAKLSAgICBpZiAoby0+dHlw
ZSgpICE9IENhY2hlZE9iamVjdDo6WFNMU3R5bGVTaGVldCkgewotI2lmZGVmIENBQ0hFX0RFQlVH
Ci0gICAgICAgIGtkRGVidWcoIDYwNjAgKSA8PCAiQ2FjaGU6OkludGVybmFsIEVycm9yIGluIHJl
cXVlc3RYU0xTdHlsZVNoZWV0IHVybD0iIDw8IGt1cmwudXJsKCkgPDwgIiEiIDw8IGVuZGw7Ci0j
ZW5kaWYKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIAotI2lmZGVmIENBQ0hFX0RFQlVH
Ci0gICAgaWYgKG8tPnN0YXR1cygpID09IENhY2hlZE9iamVjdDo6UGVuZGluZykKLSAgICAgICAg
a2REZWJ1ZyggNjA2MCApIDw8ICJDYWNoZTogbG9hZGluZyBpbiBwcm9ncmVzczogIiA8PCBrdXJs
LnVybCgpIDw8IGVuZGw7Ci0gICAgZWxzZQotICAgICAgICBrZERlYnVnKCA2MDYwICkgPDwgIkNh
Y2hlOiB1c2luZyBjYWNoZWQ6ICIgPDwga3VybC51cmwoKSA8PCBlbmRsOwotI2VuZGlmCi0gICAg
Ci0gICAgbW92ZVRvSGVhZE9mTFJVTGlzdChvKTsKLSAgICBpZiAoZGwpIHsKLSAgICAgICAgZGwt
Pm1fZG9jT2JqZWN0cy5yZW1vdmUoIG8gKTsKLSAgICAgICAgaWYgKCFjYWNoZURpc2FibGVkKQot
ICAgICAgICAgICAgZGwtPm1fZG9jT2JqZWN0cy5hcHBlbmQoIG8gKTsKLSAgICB9Ci0gICAgcmV0
dXJuIHN0YXRpY19jYXN0PENhY2hlZFhTTFN0eWxlU2hlZXQqPihvKTsKLX0KLSNlbmRpZgotCi0j
aWZuZGVmIEtIVE1MX05PX1hCTAotQ2FjaGVkWEJMRG9jdW1lbnQqIENhY2hlOjpyZXF1ZXN0WEJM
RG9jdW1lbnQoRG9jTG9hZGVyKiBkbCwgY29uc3QgRE9NU3RyaW5nICYgdXJsLCBib29sIHJlbG9h
ZCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lX3Qg
X2V4cGlyZURhdGUpCi17Ci0gICAgLy8gdGhpcyBicmluZ3MgdGhlIF91cmwgdG8gYSBzdGFuZGFy
ZCBmb3JtLi4uCi0gICAgS1VSTCBrdXJsOwotICAgIEtJTzo6Q2FjaGVDb250cm9sIGNhY2hlUG9s
aWN5OwotICAgIGlmIChkbCkgewotICAgICAgICBrdXJsID0gZGwtPm1fZG9jLT5jb21wbGV0ZVVS
TCh1cmwucXN0cmluZygpKTsKLSAgICAgICAgY2FjaGVQb2xpY3kgPSBkbC0+Y2FjaGVQb2xpY3ko
KTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGt1cmwgPSB1cmwucXN0cmluZygpOwotICAg
ICAgICBjYWNoZVBvbGljeSA9IEtJTzo6Q0NfVmVyaWZ5OwotICAgIH0KLSAgICAKLSAgICAvLyBD
aGVja2luZyBpZiB0aGUgVVJMIGlzIG1hbGZvcm1lZCBpcyBsb3RzIG9mIGV4dHJhIHdvcmsgZm9y
IGxpdHRsZSBiZW5lZml0LgotICAgIAotICAgIENhY2hlZE9iamVjdCAqbyA9IGNhY2hlLT5maW5k
KGt1cmwudXJsKCkpOwotICAgIGlmKCFvKQotICAgIHsKLSNpZmRlZiBDQUNIRV9ERUJVRwotICAg
ICAgICBrZERlYnVnKCA2MDYwICkgPDwgIkNhY2hlOiBuZXc6ICIgPDwga3VybC51cmwoKSA8PCBl
bmRsOwotI2VuZGlmCi0gICAgICAgIENhY2hlZFhCTERvY3VtZW50KiBkb2MgPSBuZXcgQ2FjaGVk
WEJMRG9jdW1lbnQoZGwsIGt1cmwudXJsKCksIGNhY2hlUG9saWN5LCBfZXhwaXJlRGF0ZSk7Ci0g
ICAgICAgIGlmIChjYWNoZURpc2FibGVkKQotICAgICAgICAgICAgZG9jLT5zZXRGcmVlKHRydWUp
OwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGNhY2hlLT5pbnNlcnQoa3VybC51cmwoKSwg
ZG9jKTsKLSAgICAgICAgICAgIG1vdmVUb0hlYWRPZkxSVUxpc3QoZG9jKTsKLSAgICAgICAgfQot
ICAgICAgICBvID0gZG9jOwotICAgIH0KLSAgICAKLSAgICAKLSAgICBpZihvLT50eXBlKCkgIT0g
Q2FjaGVkT2JqZWN0OjpYQkwpCi0gICAgewotI2lmZGVmIENBQ0hFX0RFQlVHCi0gICAgICAgIGtk
RGVidWcoIDYwNjAgKSA8PCAiQ2FjaGU6OkludGVybmFsIEVycm9yIGluIHJlcXVlc3RYQkxEb2N1
bWVudCB1cmw9IiA8PCBrdXJsLnVybCgpIDw8ICIhIiA8PCBlbmRsOwotI2VuZGlmCi0gICAgICAg
IHJldHVybiAwOwotICAgIH0KLSAgICAKLSNpZmRlZiBDQUNIRV9ERUJVRwotICAgIGlmKCBvLT5z
dGF0dXMoKSA9PSBDYWNoZWRPYmplY3Q6OlBlbmRpbmcgKQotICAgICAgICBrZERlYnVnKCA2MDYw
ICkgPDwgIkNhY2hlOiBsb2FkaW5nIGluIHByb2dyZXNzOiAiIDw8IGt1cmwudXJsKCkgPDwgZW5k
bDsKLSAgICBlbHNlCi0gICAgICAgIGtkRGVidWcoIDYwNjAgKSA8PCAiQ2FjaGU6IHVzaW5nIGNh
Y2hlZDogIiA8PCBrdXJsLnVybCgpIDw8IGVuZGw7Ci0jZW5kaWYKLSAgICAKLSAgICBtb3ZlVG9I
ZWFkT2ZMUlVMaXN0KG8pOwotICAgIGlmICggZGwgKSB7Ci0gICAgICAgIGRsLT5tX2RvY09iamVj
dHMucmVtb3ZlKCBvICk7Ci0gICAgICAgIGlmICghY2FjaGVEaXNhYmxlZCkKLSAgICAgICAgICAg
IGRsLT5tX2RvY09iamVjdHMuYXBwZW5kKCBvICk7Ci0gICAgfQotICAgIHJldHVybiBzdGF0aWNf
Y2FzdDxDYWNoZWRYQkxEb2N1bWVudCo+KG8pOwotfQotI2VuZGlmCi0KLXZvaWQgQ2FjaGU6OmZs
dXNoKGJvb2wgZm9yY2UpCi17Ci0gICAgaWYgKGZvcmNlKQotICAgICAgIGZsdXNoQ291bnQgPSAw
OwotICAgIC8vIERvbid0IGZsdXNoIGZvciBldmVyeSBpbWFnZS4KLSAgICBpZiAobV9jb3VudE9m
TFJVQW5kVW5jYWNoZWFibGVMaXN0cyA8IGZsdXNoQ291bnQpCi0gICAgICAgcmV0dXJuOwotCi0g
ICAgaW5pdCgpOwotCi0gICAgd2hpbGUgKG1faGVhZE9mVW5jYWNoZWFibGVMaXN0KQotICAgICAg
ICByZW1vdmVDYWNoZUVudHJ5KG1faGVhZE9mVW5jYWNoZWFibGVMaXN0KTsKLQotICAgIGZvciAo
aW50IGkgPSBNQVhfTFJVX0xJU1RTLTE7IGk+PTA7IGktLSkgewotICAgICAgICBpZiAobV90b3Rh
bFNpemVPZkxSVUxpc3RzIDw9IG1heFNpemUpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAg
ICAgIAotICAgICAgICB3aGlsZSAobV90b3RhbFNpemVPZkxSVUxpc3RzID4gbWF4U2l6ZSAmJiBt
X0xSVUxpc3RzW2ldLm1fdGFpbCkKLSAgICAgICAgICAgIHJlbW92ZUNhY2hlRW50cnkobV9MUlVM
aXN0c1tpXS5tX3RhaWwpOwotICAgIH0KLQotICAgIGZsdXNoQ291bnQgPSBtX2NvdW50T2ZMUlVB
bmRVbmNhY2hlYWJsZUxpc3RzKzEwOyAvLyBGbHVzaCBhZ2FpbiB3aGVuIHRoZSBjYWNoZSBoYXMg
Z3Jvd24uCi19Ci0KLQotdm9pZCBDYWNoZTo6c2V0U2l6ZSggaW50IGJ5dGVzICkKLXsKLSAgICBt
YXhTaXplID0gYnl0ZXM7Ci0gICAgbWF4Q2FjaGVhYmxlID0ga01heChtYXhTaXplIC8gMTI4LCBN
QVhDQUNIRUFCTEUpOwotCi0gICAgLy8gbWF5IGJlIHdlIG5lZWQgdG8gY2xlYXIgcGFydHMgb2Yg
dGhlIGNhY2hlCi0gICAgZmx1c2hDb3VudCA9IDA7Ci0gICAgZmx1c2godHJ1ZSk7Ci19Ci0KLXZv
aWQgQ2FjaGU6OnJlbW92ZUNhY2hlRW50cnkoIENhY2hlZE9iamVjdCAqb2JqZWN0ICkKLXsKLSAg
UVN0cmluZyBrZXkgPSBvYmplY3QtPnVybCgpLnFzdHJpbmcoKTsKLQotICAvLyB0aGlzIGluZGlj
YXRlcyB0aGUgZGVyZWYoKSBtZXRob2Qgb2YgQ2FjaGVkT2JqZWN0IHRvIGRlbGV0ZSBpdHNlbGYg
d2hlbiB0aGUgcmVmZXJlbmNlIGNvdW50ZXIKLSAgLy8gZHJvcHMgZG93biB0byB6ZXJvCi0gIG9i
amVjdC0+c2V0RnJlZSggdHJ1ZSApOwotCi0gIGNhY2hlLT5yZW1vdmUoIGtleSApOwotICByZW1v
dmVGcm9tTFJVTGlzdChvYmplY3QpOwotCi0gIGNvbnN0IERvY0xvYWRlciogZGw7Ci0gIGZvciAo
IGRsPWRvY2xvYWRlci0+Zmlyc3QoKTsgZGw7IGRsPWRvY2xvYWRlci0+bmV4dCgpICkKLSAgICAg
IGRsLT5yZW1vdmVDYWNoZWRPYmplY3QoIG9iamVjdCApOwotCi0gIGlmICggb2JqZWN0LT5jYW5E
ZWxldGUoKSApCi0gICAgIGRlbGV0ZSBvYmplY3Q7Ci19Ci0KLSNkZWZpbmUgRkFTVF9MT0cyKF9s
b2cyLF9uKSAgIFwKLSAgICAgIHVuc2lnbmVkIGludCBqXyA9ICh1bnNpZ25lZCBpbnQpKF9uKTsg
ICBcCi0gICAgICAoX2xvZzIpID0gMDsgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGlmICgo
al8pICYgKChqXyktMSkpICAgICAgICAgICAgXAotICAgICAgKF9sb2cyKSArPSAxOyAgICAgICAg
ICAgICAgIFwKLSAgICAgIGlmICgoal8pID4+IDE2KSAgICAgICAgICAgICAgICAgXAotICAgICAg
KF9sb2cyKSArPSAxNiwgKGpfKSA+Pj0gMTY7IFwKLSAgICAgIGlmICgoal8pID4+IDgpICAgICAg
ICAgICAgICAgICAgXAotICAgICAgKF9sb2cyKSArPSA4LCAoal8pID4+PSA4OyAgIFwKLSAgICAg
IGlmICgoal8pID4+IDQpICAgICAgICAgICAgICAgICAgXAotICAgICAgKF9sb2cyKSArPSA0LCAo
al8pID4+PSA0OyAgIFwKLSAgICAgIGlmICgoal8pID4+IDIpICAgICAgICAgICAgICAgICAgXAot
ICAgICAgKF9sb2cyKSArPSAyLCAoal8pID4+PSAyOyAgIFwKLSAgICAgIGlmICgoal8pID4+IDEp
ICAgICAgICAgICAgICAgICAgXAotICAgICAgKF9sb2cyKSArPSAxOwotCi1pbnQgRmFzdExvZzIo
dW5zaWduZWQgaW50IGkpIHsKLSAgICBpbnQgbG9nMjsKLSAgICBGQVNUX0xPRzIobG9nMixpKTsK
LSAgICByZXR1cm4gbG9nMjsKLX0KLQotTFJVTGlzdCogQ2FjaGU6OmdldExSVUxpc3RGb3IoQ2Fj
aGVkT2JqZWN0KiBvKQotewotICAgIGludCBhY2Nlc3NDb3VudCA9IG8tPmFjY2Vzc0NvdW50KCk7
Ci0gICAgaW50IHF1ZXVlSW5kZXg7Ci0gICAgaWYgKGFjY2Vzc0NvdW50ID09IDApIHsKLSAgICAg
ICAgcXVldWVJbmRleCA9IDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaW50IHNpemVMb2cgPSBG
YXN0TG9nMihvLT5zaXplKCkpOwotICAgICAgICBxdWV1ZUluZGV4ID0gc2l6ZUxvZy9vLT5hY2Nl
c3NDb3VudCgpIC0gMTsKLSAgICAgICAgaWYgKHF1ZXVlSW5kZXggPCAwKQotICAgICAgICAgICAg
cXVldWVJbmRleCA9IDA7Ci0gICAgICAgIGlmIChxdWV1ZUluZGV4ID49IE1BWF9MUlVfTElTVFMp
Ci0gICAgICAgICAgICBxdWV1ZUluZGV4ID0gTUFYX0xSVV9MSVNUUy0xOwotICAgIH0KLSAgICBp
ZiAobV9MUlVMaXN0cyA9PSAwKSB7Ci0gICAgICAgIG1fTFJVTGlzdHMgPSBuZXcgTFJVTGlzdCBb
TUFYX0xSVV9MSVNUU107Ci0gICAgfQotICAgIHJldHVybiAmbV9MUlVMaXN0c1txdWV1ZUluZGV4
XTsKLX0KLQotdm9pZCBDYWNoZTo6cmVtb3ZlRnJvbUxSVUxpc3QoQ2FjaGVkT2JqZWN0ICpvYmpl
Y3QpCi17Ci0gICAgQ2FjaGVkT2JqZWN0ICpuZXh0ID0gb2JqZWN0LT5tX25leHRJbkxSVUxpc3Q7
Ci0gICAgQ2FjaGVkT2JqZWN0ICpwcmV2ID0gb2JqZWN0LT5tX3ByZXZJbkxSVUxpc3Q7Ci0gICAg
Ym9vbCB1bmNhY2hlYWJsZSA9IG9iamVjdC0+c3RhdHVzKCkgPT0gQ2FjaGVkT2JqZWN0OjpVbmNh
Y2hlYWJsZTsKLSAgICAKLSAgICBMUlVMaXN0KiBsaXN0ID0gdW5jYWNoZWFibGUgPyAwIDogZ2V0
TFJVTGlzdEZvcihvYmplY3QpOwotICAgIENhY2hlZE9iamVjdCAqJmhlYWQgPSB1bmNhY2hlYWJs
ZSA/IG1faGVhZE9mVW5jYWNoZWFibGVMaXN0IDogbGlzdC0+bV9oZWFkOwotICAgIAotICAgIGlm
IChuZXh0ID09IDAgJiYgcHJldiA9PSAwICYmIGhlYWQgIT0gb2JqZWN0KSB7Ci0gICAgICAgIHJl
dHVybjsKLSAgICB9Ci0gICAgCi0gICAgb2JqZWN0LT5tX25leHRJbkxSVUxpc3QgPSAwOwotICAg
IG9iamVjdC0+bV9wcmV2SW5MUlVMaXN0ID0gMDsKLSAgICAKLSAgICBpZiAobmV4dCkKLSAgICAg
ICAgbmV4dC0+bV9wcmV2SW5MUlVMaXN0ID0gcHJldjsKLSAgICBlbHNlIGlmICghdW5jYWNoZWFi
bGUgJiYgbGlzdC0+bV90YWlsID09IG9iamVjdCkKLSAgICAgICAgbGlzdC0+bV90YWlsID0gcHJl
djsKLQotICAgIGlmIChwcmV2KQotICAgICAgICBwcmV2LT5tX25leHRJbkxSVUxpc3QgPSBuZXh0
OwotICAgIGVsc2UgaWYgKGhlYWQgPT0gb2JqZWN0KQotICAgICAgICBoZWFkID0gbmV4dDsKLSAg
ICAKLSAgICAtLW1fY291bnRPZkxSVUFuZFVuY2FjaGVhYmxlTGlzdHM7Ci0gICAgCi0gICAgaWYg
KCF1bmNhY2hlYWJsZSkKLSAgICAgICAgbV90b3RhbFNpemVPZkxSVUxpc3RzIC09IG9iamVjdC0+
c2l6ZSgpOwotfQotCi12b2lkIENhY2hlOjptb3ZlVG9IZWFkT2ZMUlVMaXN0KENhY2hlZE9iamVj
dCAqb2JqZWN0KQotewotICAgIGluc2VydEluTFJVTGlzdChvYmplY3QpOwotfQotCi12b2lkIENh
Y2hlOjppbnNlcnRJbkxSVUxpc3QoQ2FjaGVkT2JqZWN0ICpvYmplY3QpCi17Ci0gICAgcmVtb3Zl
RnJvbUxSVUxpc3Qob2JqZWN0KTsKLSAgICAKLSAgICBpZiAoIW9iamVjdC0+YWxsb3dJbkxSVUxp
c3QoKSkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIExSVUxpc3QqIGxpc3QgPSBnZXRMUlVM
aXN0Rm9yKG9iamVjdCk7Ci0gICAgCi0gICAgYm9vbCB1bmNhY2hlYWJsZSA9IG9iamVjdC0+c3Rh
dHVzKCkgPT0gQ2FjaGVkT2JqZWN0OjpVbmNhY2hlYWJsZTsKLSAgICBDYWNoZWRPYmplY3QgKiZo
ZWFkID0gdW5jYWNoZWFibGUgPyBtX2hlYWRPZlVuY2FjaGVhYmxlTGlzdCA6IGxpc3QtPm1faGVh
ZDsKLQotICAgIG9iamVjdC0+bV9uZXh0SW5MUlVMaXN0ID0gaGVhZDsKLSAgICBpZiAoaGVhZCkK
LSAgICAgICAgaGVhZC0+bV9wcmV2SW5MUlVMaXN0ID0gb2JqZWN0OwotICAgIGhlYWQgPSBvYmpl
Y3Q7Ci0gICAgCi0gICAgaWYgKG9iamVjdC0+bV9uZXh0SW5MUlVMaXN0ID09IDAgJiYgIXVuY2Fj
aGVhYmxlKQotICAgICAgICBsaXN0LT5tX3RhaWwgPSBvYmplY3Q7Ci0gICAgCi0gICAgKyttX2Nv
dW50T2ZMUlVBbmRVbmNhY2hlYWJsZUxpc3RzOwotICAgIAotICAgIGlmICghdW5jYWNoZWFibGUp
Ci0gICAgICAgIG1fdG90YWxTaXplT2ZMUlVMaXN0cyArPSBvYmplY3QtPnNpemUoKTsKLX0KLQot
Ym9vbCBDYWNoZTo6YWRqdXN0U2l6ZShDYWNoZWRPYmplY3QgKm9iamVjdCwgaW50IGRlbHRhKQot
ewotICAgIGlmIChvYmplY3QtPnN0YXR1cygpID09IENhY2hlZE9iamVjdDo6VW5jYWNoZWFibGUp
Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGlmIChvYmplY3QtPm1fbmV4dEluTFJVTGlz
dCA9PSAwICYmIG9iamVjdC0+bV9wcmV2SW5MUlVMaXN0ID09IDAgJiYKLSAgICAgICAgZ2V0TFJV
TGlzdEZvcihvYmplY3QpLT5tX2hlYWQgIT0gb2JqZWN0KQotICAgICAgICByZXR1cm4gZmFsc2U7
Ci0gICAgCi0gICAgbV90b3RhbFNpemVPZkxSVUxpc3RzICs9IGRlbHRhOwotICAgIHJldHVybiBk
ZWx0YSAhPSAwOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LQotCi1DYWNoZWRPYmplY3RDbGllbnQgKkNhY2hlZE9iamVjdENsaWVudFdhbGtlcjo6bmV4dCgp
Ci17Ci0gICAgLy8gT25seSBhZHZhbmNlIGlmIHdlIGFscmVhZHkgcmV0dXJuZWQgdGhpcyBpdGVt
LgotICAgIC8vIFRoaXMgaGFuZGxlcyBjYXNlcyB3aGVyZSB0aGUgY3VycmVudCBpdGVtIGlzIHJl
bW92ZWQsIGFuZCBwcmV2ZW50cyB1cyBmcm9tIHNraXBwaW5nIHRoZSBuZXh0IGl0ZW0uCi0gICAg
Ly8gVGhlIGl0ZXJhdG9yIGF1dG9tYXRpY2FsbHkgZ2V0cyBhZHZhbmNlZCB0byB0aGUgbmV4dCBp
dGVtLCBhbmQgd2UgbWFrZSBzdXJlIHdlIHJldHVybiBpdC4KLSAgICBpZiAoX2N1cnJlbnQgPT0g
X2l0ZXJhdG9yLmN1cnJlbnQoKSkKLSAgICAgICAgKytfaXRlcmF0b3I7Ci0gICAgX2N1cnJlbnQg
PSBfaXRlcmF0b3IuY3VycmVudCgpOwotICAgIHJldHVybiBfY3VycmVudDsKLX0KLQotLy8gLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQ2FjaGVkT2JqZWN0Q2xpZW50
Ojp+Q2FjaGVkT2JqZWN0Q2xpZW50KCkgeyB9Ci12b2lkIENhY2hlZE9iamVjdENsaWVudDo6c2V0
UGl4bWFwKGNvbnN0IFFQaXhtYXAgJiwgY29uc3QgUVJlY3QmLCBDYWNoZWRJbWFnZSAqKSB7fQot
dm9pZCBDYWNoZWRPYmplY3RDbGllbnQ6OnNldFN0eWxlU2hlZXQoY29uc3QgRE9NOjpET01TdHJp
bmcgJi8qdXJsKi8sIGNvbnN0IERPTTo6RE9NU3RyaW5nICYvKnNoZWV0Ki8pIHt9Ci0jaWZuZGVm
IEtIVE1MX05PX1hCTAotdm9pZCBDYWNoZWRPYmplY3RDbGllbnQ6OnNldFhCTERvY3VtZW50KGNv
bnN0IERPTTo6RE9NU3RyaW5nJiB1cmwsIFhCTDo6WEJMRG9jdW1lbnRJbXBsKiBkb2MpIHt9Ci0j
ZW5kaWYKLXZvaWQgQ2FjaGVkT2JqZWN0Q2xpZW50Ojpub3RpZnlGaW5pc2hlZChDYWNoZWRPYmpl
Y3QgKiAvKmZpbmlzaGVkT2JqKi8pIHt9Ci0KLUNhY2hlOjpTdGF0aXN0aWNzIENhY2hlOjpnZXRT
dGF0aXN0aWNzKCkKLXsKLSAgICBTdGF0aXN0aWNzIHN0YXRzOwotCi0gICAgaWYgKCFjYWNoZSkK
LSAgICAgICAgcmV0dXJuIHN0YXRzOwotCi0gICAgUURpY3RJdGVyYXRvcjxDYWNoZWRPYmplY3Q+
IGkoKmNhY2hlKTsKLSAgICBmb3IgKGkudG9GaXJzdCgpOyBpLmN1cnJlbnQoKTsgKytpKSB7Ci0g
ICAgICAgIENhY2hlZE9iamVjdCAqbyA9IGkuY3VycmVudCgpOwotICAgICAgICBzd2l0Y2ggKG8t
PnR5cGUoKSkgewotICAgICAgICAgICAgY2FzZSBDYWNoZWRPYmplY3Q6OkltYWdlOgotICAgICAg
ICAgICAgICAgIHN0YXRzLmltYWdlcy5jb3VudCsrOwotICAgICAgICAgICAgICAgIHN0YXRzLmlt
YWdlcy5zaXplICs9IG8tPnNpemUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAg
ICAgICAgY2FzZSBDYWNoZWRPYmplY3Q6OkNTU1N0eWxlU2hlZXQ6Ci0gICAgICAgICAgICAgICAg
c3RhdHMuc3R5bGVTaGVldHMuY291bnQrKzsKLSAgICAgICAgICAgICAgICBzdGF0cy5zdHlsZVNo
ZWV0cy5zaXplICs9IG8tPnNpemUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAg
ICAgICAgY2FzZSBDYWNoZWRPYmplY3Q6OlNjcmlwdDoKLSAgICAgICAgICAgICAgICBzdGF0cy5z
Y3JpcHRzLmNvdW50Kys7Ci0gICAgICAgICAgICAgICAgc3RhdHMuc2NyaXB0cy5zaXplICs9IG8t
PnNpemUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSNpZmRlZiBLSFRNTF9YU0xUCi0gICAg
ICAgICAgICBjYXNlIENhY2hlZE9iamVjdDo6WFNMU3R5bGVTaGVldDoKLSAgICAgICAgICAgICAg
ICBzdGF0cy54c2xTdHlsZVNoZWV0cy5jb3VudCsrOwotICAgICAgICAgICAgICAgIHN0YXRzLnhz
bFN0eWxlU2hlZXRzLnNpemUgKz0gby0+c2l6ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwot
I2VuZGlmCi0jaWZuZGVmIEtIVE1MX05PX1hCTAotICAgICAgICAgICAgY2FzZSBDYWNoZWRPYmpl
Y3Q6OlhCTDoKLSAgICAgICAgICAgICAgICBzdGF0cy54YmxEb2NzLmNvdW50Kys7Ci0gICAgICAg
ICAgICAgICAgc3RhdHMueGJsRG9jcy5zaXplICs9IG8tPnNpemUoKTsKLSAgICAgICAgICAgICAg
ICBicmVhazsKLSNlbmRpZgotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBz
dGF0cy5vdGhlci5jb3VudCsrOwotICAgICAgICAgICAgICAgIHN0YXRzLm90aGVyLnNpemUgKz0g
by0+c2l6ZSgpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiBzdGF0czsKLX0K
LQotdm9pZCBDYWNoZTo6Zmx1c2hBbGwoKQotewotICAgIGlmICghY2FjaGUpCi0gICAgICAgIHJl
dHVybjsKLQotICAgIGZvciAoOzspIHsKLSAgICAgICAgUURpY3RJdGVyYXRvcjxDYWNoZWRPYmpl
Y3Q+IGkoKmNhY2hlKTsKLSAgICAgICAgQ2FjaGVkT2JqZWN0ICpvID0gaS50b0ZpcnN0KCk7Ci0g
ICAgICAgIGlmICghbykKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICByZW1vdmVDYWNoZUVu
dHJ5KG8pOwotICAgIH0KLX0KLQotdm9pZCBDYWNoZTo6c2V0Q2FjaGVEaXNhYmxlZChib29sIGRp
c2FibGVkKQotewotICAgIGNhY2hlRGlzYWJsZWQgPSBkaXNhYmxlZDsKLSAgICBpZiAoZGlzYWJs
ZWQpCi0gICAgICAgIGZsdXNoQWxsKCk7Ci19Cit9OwpJbmRleDogbWlzYy9DYWNoZWRJbWFnZUNh
bGxiYWNrLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gbWlzYy9DYWNoZWRJbWFnZUNhbGxiYWNrLmgJKHJldmlz
aW9uIDExOTQ4KQorKysgbWlzYy9DYWNoZWRJbWFnZUNhbGxiYWNrLmgJKHdvcmtpbmcgY29weSkK
QEAgLTIzLDI4OSArMjMsMTIgQEAKICAgICBUaGlzIGNsYXNzIHByb3ZpZGVzIGFsbCBmdW5jdGlv
bmFsaXR5IG5lZWRlZCBmb3IgbG9hZGluZyBpbWFnZXMsIHN0eWxlIHNoZWV0cyBhbmQgaHRtbAog
ICAgIHBhZ2VzIGZyb20gdGhlIHdlYi4gSXQgaGFzIGEgbWVtb3J5IGNhY2hlIGZvciB0aGVzZSBv
YmplY3RzLgogKi8KLSNpZm5kZWYgX2todG1sX2xvYWRlcl9oCi0jZGVmaW5lIF9raHRtbF9sb2Fk
ZXJfaAotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlm
Ci0KLSNpbmNsdWRlIDx0aW1lLmg+Ci0KLSNpbmNsdWRlICJsb2FkZXJfY2xpZW50LmgiCi0jaWZk
ZWYgSEFWRV9MSUJKUEVHCi0jaW5jbHVkZSAibG9hZGVyX2pwZWcuaCIKLSNlbmRpZgotCi0jaW5j
bHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8cXB0cmxpc3QuaD4KLSNpbmNsdWRlIDxxb2JqZWN0
Lmg+Ci0jaW5jbHVkZSA8cXB0cmRpY3QuaD4KLSNpbmNsdWRlIDxxZGljdC5oPgotI2luY2x1ZGUg
PHFwaXhtYXAuaD4KLSNpbmNsdWRlIDxxYnVmZmVyLmg+Ci0jaW5jbHVkZSA8cXN0cmluZ2xpc3Qu
aD4KLSNpbmNsdWRlIDxxdGV4dGNvZGVjLmg+Ci0KLSNpbmNsdWRlIDxrdXJsLmg+Ci0jaW5jbHVk
ZSA8a2lvL2dsb2JhbC5oPgotCi0jaW5jbHVkZSA8a2h0bWxfc2V0dGluZ3MuaD4KLSNpbmNsdWRl
IDxkb20vZG9tX3N0cmluZy5oPgotI2luY2x1ZGUgIkRvY1B0ci5oIgotCi1jbGFzcyBLSFRNTFBh
cnQ7Ci0KLW5hbWVzcGFjZSBLSU8gewotICBjbGFzcyBKb2I7Ci0gIGNsYXNzIFRyYW5zZmVySm9i
OwotfQotCi1uYW1lc3BhY2UgRE9NCi17Ci0gICAgY2xhc3MgQ1NTU3R5bGVTaGVldEltcGw7Ci0g
ICAgY2xhc3MgRG9jdW1lbnRJbXBsOwotfTsKLQotCi1jbGFzcyBLV1FMb2FkZXI7Ci0KLSNpZiBf
X09CSkNfXwotQGNsYXNzIE5TRGF0YTsKLUBjbGFzcyBOU1VSTFJlc3BvbnNlOwotI2Vsc2UKLWNs
YXNzIE5TRGF0YTsKLWNsYXNzIE5TVVJMUmVzcG9uc2U7Ci0jZW5kaWYKIAorI2lmbmRlZiBLSFRN
TF9DYWNoZWRJbWFnZUNhbGxiYWNrX2gKKyNkZWZpbmUgS0hUTUxfQ2FjaGVkSW1hZ2VDYWxsYmFj
a19oCiAKIG5hbWVzcGFjZSBraHRtbAogewotICAgIGNsYXNzIENhY2hlZE9iamVjdDsKLSAgICBj
bGFzcyBSZXF1ZXN0OwotICAgIGNsYXNzIERvY0xvYWRlcjsKLSAgICBjbGFzcyBEZWNvZGVyOwot
Ci0gI2RlZmluZSBNQVhfTFJVX0xJU1RTIDIwCi0gICAgCi0gICAgc3RydWN0IExSVUxpc3Qgewot
ICAgICAgICBDYWNoZWRPYmplY3QqIG1faGVhZDsKLSAgICAgICAgQ2FjaGVkT2JqZWN0KiBtX3Rh
aWw7Ci0gICAgCi0gICAgICAgIExSVUxpc3QoKTsKLSAgICAgICAgfkxSVUxpc3QoKTsKLSAgICB9
OwotICAgIAotICAgIC8qKgotICAgICAqIEBpbnRlcm5hbAotICAgICAqCi0gICAgICogQSBjYWNo
ZWQgb2JqZWN0LiBDbGFzc2VzIHdobyB3YW50IHRvIHVzZSB0aGlzIG9iamVjdCBzaG91bGQgZGVy
aXZlCi0gICAgICogZnJvbSBDYWNoZWRPYmplY3RDbGllbnQsIHRvIGdldCB0aGUgZnVuY3Rpb24g
Y2FsbHMgaW4gY2FzZSB0aGUgcmVxdWVzdGVkIGRhdGEgaGFzIGFycml2ZWQuCi0gICAgICoKLSAg
ICAgKiBUaGlzIGNsYXNzIGFsc28gZG9lcyB0aGUgYWN0dWFsIGNvbW11bmljYXRpb24gd2l0aCBr
aW8gYW5kIGxvYWRzIHRoZSBmaWxlLgotICAgICAqLwotICAgIGNsYXNzIENhY2hlZE9iamVjdAot
ICAgIHsKLSAgICBwdWJsaWM6Ci0JZW51bSBUeXBlIHsKLQkgICAgSW1hZ2UsCi0JICAgIENTU1N0
eWxlU2hlZXQsCi0JICAgIFNjcmlwdAotI2lmZGVmIEtIVE1MX1hTTFQKLSAgICAgICAgICAgICwg
WFNMU3R5bGVTaGVldAotI2VuZGlmCi0jaWZuZGVmIEtIVE1MX05PX1hCTAotICAgICAgICAgICAg
LCBYQkwKLSNlbmRpZgotCX07Ci0KLQllbnVtIFN0YXR1cyB7Ci0JICAgIE5vdENhY2hlZCwgICAg
Ly8gdGhpcyBVUkwgaXMgbm90IGNhY2hlZAotCSAgICBVbmtub3duLCAgICAgIC8vIGxldCBpbWFn
ZWNhY2hlIGRlY2lkZSB3aGF0IHRvIGRvIHdpdGggaXQKLQkgICAgTmV3LCAgICAgICAgICAvLyBp
bnNlcnRpbmcgbmV3IGltYWdlCi0gICAgICAgIFBlbmRpbmcsICAgICAgLy8gb25seSBwYXJ0aWFs
bHkgbG9hZGVkCi0JICAgIFBlcnNpc3RlbnQsICAgLy8gbmV2ZXIgZGVsZXRlIHRoaXMgcGl4bWFw
Ci0JICAgIENhY2hlZCwgICAgICAgLy8gcmVndWxhciBjYXNlCi0JICAgIFVuY2FjaGVhYmxlICAg
Ly8gdG9vIGJpZyB0byBiZSBjYWNoZWQsCi0JfTsgIAkgICAgICAgICAgLy8gd2lsbCBiZSBkZXN0
cm95ZWQgYXMgc29vbiBhcyBwb3NzaWJsZQotCi0JQ2FjaGVkT2JqZWN0KGNvbnN0IERPTTo6RE9N
U3RyaW5nICZ1cmwsIFR5cGUgdHlwZSwgS0lPOjpDYWNoZUNvbnRyb2wgX2NhY2hlUG9saWN5LCB0
aW1lX3QgX2V4cGlyZURhdGUsIGludCBzaXplID0gMCkKLQl7Ci0JICAgIG1fdXJsID0gdXJsOwot
CSAgICBtX3R5cGUgPSB0eXBlOwotCSAgICBtX3N0YXR1cyA9IFBlbmRpbmc7Ci0JICAgIG1fc2l6
ZSA9IHNpemU7Ci0JICAgIG1fZnJlZSA9IGZhbHNlOwotCSAgICBtX2NhY2hlUG9saWN5ID0gX2Nh
Y2hlUG9saWN5OwotCSAgICBtX3JlcXVlc3QgPSAwOwotICAgICAgICBtX3Jlc3BvbnNlID0gMDsK
LSAgICAgICAgbV9hbGxEYXRhID0gMDsKLQkgICAgbV9leHBpcmVEYXRlID0gX2V4cGlyZURhdGU7
Ci0gICAgICAgIG1fZGVsZXRlZCA9IGZhbHNlOwotICAgICAgICBtX2V4cGlyZURhdGVDaGFuZ2Vk
ID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICBtX2FjY2Vzc0NvdW50ID0gMDsKLSAgICAgICAg
Ci0gICAgICAgIG1fbmV4dEluTFJVTGlzdCA9IDA7Ci0gICAgICAgIG1fcHJldkluTFJVTGlzdCA9
IDA7Ci0JfQotCXZpcnR1YWwgfkNhY2hlZE9iamVjdCgpOwotCi0JdmlydHVhbCB2b2lkIHNldENo
YXJzZXQoIGNvbnN0IFFTdHJpbmcgJmNocyApIHt9Ci0JdmlydHVhbCB2b2lkIGRhdGEoIFFCdWZm
ZXIgJmJ1ZmZlciwgYm9vbCBlb2YpID0gMDsKLQl2aXJ0dWFsIHZvaWQgZXJyb3IoIGludCBlcnIs
IGNvbnN0IGNoYXIgKnRleHQgKSA9IDA7Ci0KLQljb25zdCBET006OkRPTVN0cmluZyAmdXJsKCkg
Y29uc3QgeyByZXR1cm4gbV91cmw7IH0KLQlUeXBlIHR5cGUoKSBjb25zdCB7IHJldHVybiBtX3R5
cGU7IH0KLQotCXZpcnR1YWwgdm9pZCByZWYoQ2FjaGVkT2JqZWN0Q2xpZW50ICpjb25zdW1lcik7
Ci0JdmlydHVhbCB2b2lkIGRlcmVmKENhY2hlZE9iamVjdENsaWVudCAqY29uc3VtZXIpOwotCi0J
aW50IGNvdW50KCkgY29uc3QgeyByZXR1cm4gbV9jbGllbnRzLmNvdW50KCk7IH0KLQotCVN0YXR1
cyBzdGF0dXMoKSBjb25zdCB7IHJldHVybiBtX3N0YXR1czsgfQotCi0JaW50IHNpemUoKSBjb25z
dCB7IHJldHVybiBtX3NpemU7IH0KLQotICAgICAgICBib29sIGlzTG9hZGVkKCkgY29uc3QgeyBy
ZXR1cm4gIW1fbG9hZGluZzsgfQotICAgICAgICAKLSAgICAgICAgdmlydHVhbCBib29sIGlzSW1h
Z2UoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotCi0gICAgaW50IGFjY2Vzc0NvdW50KCkgY29u
c3QgeyByZXR1cm4gbV9hY2Nlc3NDb3VudDsgfQotICAgIHZvaWQgaW5jcmVhc2VBY2Nlc3NDb3Vu
dCgpIHsgbV9hY2Nlc3NDb3VudCsrOyB9Ci0gICAgCi0JLyoqCi0JICogY29tcHV0ZXMgdGhlIHN0
YXR1cyBvZiBhbiBvYmplY3QgYWZ0ZXIgbG9hZGluZy4KLQkgKiB0aGUgcmVzdWx0IGRlcGVuZHMg
b24gdGhlIG9iamVjdHMgc2l6ZSBhbmQgdGhlIHNpemUgb2YgdGhlIGNhY2hlCi0JICogYWxzbyB1
cGRhdGVzIHRoZSBleHBpcmUgZGF0ZSBvbiB0aGUgY2FjaGUgZW50cnkgZmlsZQotCSAqLwotCXZv
aWQgZmluaXNoKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCBieSB0aGUgY2Fj
aGUgaWYgdGhlIG9iamVjdCBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIGNhY2hlIGRpY3QKLSAg
ICAgICAgICogd2hpbGUgc3RpbGwgYmVpbmcgcmVmZXJlbmNlZC4gVGhpcyBtZWFucyB0aGUgb2Jq
ZWN0IHNob3VsZCBraWxsIGl0c2VsZgotICAgICAgICAgKiBpZiBpdHMgcmVmZXJlbmNlIGNvdW50
ZXIgZHJvcHMgZG93biB0byB6ZXJvLgotICAgICAgICAgKi8KLSAgICAgICAgdm9pZCBzZXRGcmVl
KCBib29sIGIgKSB7IG1fZnJlZSA9IGI7IH0KLQotICAgICAgICBLSU86OkNhY2hlQ29udHJvbCBj
YWNoZVBvbGljeSgpIGNvbnN0IHsgcmV0dXJuIG1fY2FjaGVQb2xpY3k7IH0KLQotICAgICAgICB2
b2lkIHNldFJlcXVlc3QoUmVxdWVzdCAqX3JlcXVlc3QpOwotCi0gICAgICAgIE5TVVJMUmVzcG9u
c2UgKnJlc3BvbnNlKCkgY29uc3QgeyByZXR1cm4gbV9yZXNwb25zZTsgfQotICAgICAgICB2b2lk
IHNldFJlc3BvbnNlKE5TVVJMUmVzcG9uc2UgKnJlc3BvbnNlKTsKLSAgICAgICAgTlNEYXRhICph
bGxEYXRhKCkgY29uc3QgeyByZXR1cm4gbV9hbGxEYXRhOyB9Ci0gICAgICAgIHZvaWQgc2V0QWxs
RGF0YSAoTlNEYXRhICpkYXRhKTsKLQotICAgICAgICBib29sIGNhbkRlbGV0ZSgpIGNvbnN0IHsg
cmV0dXJuIChtX2NsaWVudHMuY291bnQoKSA9PSAwICYmICFtX3JlcXVlc3QpOyB9Ci0KLQl2b2lk
IHNldEV4cGlyZURhdGUodGltZV90IF9leHBpcmVEYXRlLCBib29sIGNoYW5nZUh0dHBDYWNoZSk7
Ci0JCi0JYm9vbCBpc0V4cGlyZWQoKSBjb25zdDsKLQotICAgICAgICB2aXJ0dWFsIGJvb2wgc2No
ZWR1bGUoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotCi0gICAgICAgIC8qKgotICAgICAgICAg
KiBMaXN0IG9mIGFjY2VwdGFibGUgbWltZXR5cGVzIHNlcGVyYXRlZCBieSAiLCIuIEEgbWltZXR5
cGUgbWF5IGNvbnRhaW4gYSB3aWxkY2FyZC4KLSAgICAgICAgICovCi0gICAgICAgIC8vIGUuZy4g
InRleHQvKiIKLSAgICAgICAgUVN0cmluZyBhY2NlcHQoKSBjb25zdCB7IHJldHVybiBtX2FjY2Vw
dDsgfQotICAgICAgICB2b2lkIHNldEFjY2VwdChjb25zdCBRU3RyaW5nICZfYWNjZXB0KSB7IG1f
YWNjZXB0ID0gX2FjY2VwdDsgfQotCi0gICAgcHJvdGVjdGVkOgotICAgICAgICB2b2lkIHNldFNp
emUoaW50IHNpemUpOwotICAgICAgICAKLSAgICAgICAgUVB0ckRpY3Q8Q2FjaGVkT2JqZWN0Q2xp
ZW50PiBtX2NsaWVudHM7Ci0KLQlET006OkRPTVN0cmluZyBtX3VybDsKLSAgICAgICAgUVN0cmlu
ZyBtX2FjY2VwdDsKLSAgICAgICAgUmVxdWVzdCAqbV9yZXF1ZXN0OwotICAgICAgICBOU1VSTFJl
c3BvbnNlICptX3Jlc3BvbnNlOwotICAgICAgICBOU0RhdGEgKm1fYWxsRGF0YTsKLQlUeXBlIG1f
dHlwZTsKLQlTdGF0dXMgbV9zdGF0dXM7Ci0gICAgcHJpdmF0ZToKLQlpbnQgbV9zaXplOwotICAg
IGludCBtX2FjY2Vzc0NvdW50OwotICAgIAotICAgIHByb3RlY3RlZDoKLQl0aW1lX3QgbV9leHBp
cmVEYXRlOwotCUtJTzo6Q2FjaGVDb250cm9sIG1fY2FjaGVQb2xpY3k7Ci0gICAgICAgIGJvb2wg
bV9mcmVlIDogMTsKLSAgICAgICAgYm9vbCBtX2RlbGV0ZWQgOiAxOwotICAgICAgICBib29sIG1f
bG9hZGluZyA6IDE7Ci0gICAgICAgIGJvb2wgbV9leHBpcmVEYXRlQ2hhbmdlZCA6IDE7Ci0gICAg
Ci0gICAgcHJpdmF0ZToKLSAgICAgICAgYm9vbCBhbGxvd0luTFJVTGlzdCgpIHsgcmV0dXJuIGNh
bkRlbGV0ZSgpICYmIHN0YXR1cygpICE9IFBlcnNpc3RlbnQ7IH0KLSAgICAgICAgCi0gICAgICAg
IENhY2hlZE9iamVjdCAqbV9uZXh0SW5MUlVMaXN0OwotICAgICAgICBDYWNoZWRPYmplY3QgKm1f
cHJldkluTFJVTGlzdDsKLSAgICAgICAgZnJpZW5kIGNsYXNzIENhY2hlOwotICAgIH07Ci0KLQot
ICAgIC8qKgotICAgICAqIGEgY2FjaGVkIHN0eWxlIHNoZWV0Ci0gICAgICovCi0gICAgY2xhc3Mg
Q2FjaGVkQ1NTU3R5bGVTaGVldCA6IHB1YmxpYyBDYWNoZWRPYmplY3QKLSAgICB7Ci0gICAgcHVi
bGljOgotCUNhY2hlZENTU1N0eWxlU2hlZXQoRG9jTG9hZGVyKiBkbCwgY29uc3QgRE9NOjpET01T
dHJpbmcgJnVybCwgS0lPOjpDYWNoZUNvbnRyb2wgY2FjaGVQb2xpY3ksIHRpbWVfdCBfZXhwaXJl
RGF0ZSwgY29uc3QgUVN0cmluZyYgY2hhcnNldCk7Ci0JQ2FjaGVkQ1NTU3R5bGVTaGVldChjb25z
dCBET006OkRPTVN0cmluZyAmdXJsLCBjb25zdCBRU3RyaW5nICZzdHlsZXNoZWV0X2RhdGEpOwot
CXZpcnR1YWwgfkNhY2hlZENTU1N0eWxlU2hlZXQoKTsKLQotCWNvbnN0IERPTTo6RE9NU3RyaW5n
ICZzaGVldCgpIGNvbnN0IHsgcmV0dXJuIG1fc2hlZXQ7IH0KLQotCXZpcnR1YWwgdm9pZCByZWYo
Q2FjaGVkT2JqZWN0Q2xpZW50ICpjb25zdW1lcik7Ci0JdmlydHVhbCB2b2lkIGRlcmVmKENhY2hl
ZE9iamVjdENsaWVudCAqY29uc3VtZXIpOwotCi0gICAgICAgIHZpcnR1YWwgdm9pZCBzZXRDaGFy
c2V0KCBjb25zdCBRU3RyaW5nICZjaHMgKTsKLSAgICAgICAgdmlydHVhbCB2b2lkIGRhdGEoIFFC
dWZmZXIgJmJ1ZmZlciwgYm9vbCBlb2YgKTsKLQl2aXJ0dWFsIHZvaWQgZXJyb3IoIGludCBlcnIs
IGNvbnN0IGNoYXIgKnRleHQgKTsKLQotICAgICAgICB2aXJ0dWFsIGJvb2wgc2NoZWR1bGUoKSBj
b25zdCB7IHJldHVybiB0cnVlOyB9Ci0KLQl2b2lkIGNoZWNrTm90aWZ5KCk7Ci0KLSAgICBwcm90
ZWN0ZWQ6Ci0JRE9NOjpET01TdHJpbmcgbV9zaGVldDsKLSAgICAgICAgUVRleHRDb2RlYyogbV9j
b2RlYzsKLSAgICB9OwotCi0gICAgLyoqCi0gICAgICogYSBjYWNoZWQgc2NyaXB0Ci0gICAgICov
Ci0gICAgY2xhc3MgQ2FjaGVkU2NyaXB0IDogcHVibGljIENhY2hlZE9iamVjdAotICAgIHsKLSAg
ICBwdWJsaWM6Ci0JQ2FjaGVkU2NyaXB0KERvY0xvYWRlciogZGwsIGNvbnN0IERPTTo6RE9NU3Ry
aW5nICZ1cmwsIEtJTzo6Q2FjaGVDb250cm9sIGNhY2hlUG9saWN5LCB0aW1lX3QgX2V4cGlyZURh
dGUsIGNvbnN0IFFTdHJpbmcmIGNoYXJzZXQpOwotCUNhY2hlZFNjcmlwdChjb25zdCBET006OkRP
TVN0cmluZyAmdXJsLCBjb25zdCBRU3RyaW5nICZzY3JpcHRfZGF0YSk7Ci0JdmlydHVhbCB+Q2Fj
aGVkU2NyaXB0KCk7Ci0KLQljb25zdCBET006OkRPTVN0cmluZyAmc2NyaXB0KCkgY29uc3QgeyBy
ZXR1cm4gbV9zY3JpcHQ7IH0KLQotCXZpcnR1YWwgdm9pZCByZWYoQ2FjaGVkT2JqZWN0Q2xpZW50
ICpjb25zdW1lcik7Ci0JdmlydHVhbCB2b2lkIGRlcmVmKENhY2hlZE9iamVjdENsaWVudCAqY29u
c3VtZXIpOwotCi0gICAgICAgIHZpcnR1YWwgdm9pZCBzZXRDaGFyc2V0KCBjb25zdCBRU3RyaW5n
ICZjaHMgKTsKLQl2aXJ0dWFsIHZvaWQgZGF0YSggUUJ1ZmZlciAmYnVmZmVyLCBib29sIGVvZiAp
OwotCXZpcnR1YWwgdm9pZCBlcnJvciggaW50IGVyciwgY29uc3QgY2hhciAqdGV4dCApOwotCi0g
ICAgICAgIHZpcnR1YWwgYm9vbCBzY2hlZHVsZSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0g
ICAgICAgIAotICAgICAgICBib29sIGVycm9yT2NjdXJyZWQoKSBjb25zdCB7IHJldHVybiBtX2Vy
cm9yT2NjdXJyZWQ7IH0KLQotCXZvaWQgY2hlY2tOb3RpZnkoKTsKLQotICAgIHByb3RlY3RlZDoK
LQlET006OkRPTVN0cmluZyBtX3NjcmlwdDsKLSAgICAgICAgUVRleHRDb2RlYyogbV9jb2RlYzsK
LSAgICAgICAgYm9vbCBtX2Vycm9yT2NjdXJyZWQ7Ci0gICAgfTsKLQotICAgIGNsYXNzIEltYWdl
U291cmNlOwotCiAgICAgY2xhc3MgQ2FjaGVkSW1hZ2U7CiAgICAgCiAgICAgY2xhc3MgQ2FjaGVk
SW1hZ2VDYWxsYmFjawpAQCAtMzI3LDM4NiArNTAsNiBAQCBuYW1lc3BhY2Uga2h0bWwKICAgICAg
ICAgdWludCByZWZDb3VudDsKIAlib29sIGhlYWRlclJlY2VpdmVkOwogICAgIH07Ci0gICAgICAg
IAotICAgIC8qKgotICAgICAqIGEgY2FjaGVkIGltYWdlCi0gICAgICovCi0gICAgY2xhc3MgQ2Fj
aGVkSW1hZ2UgOiBwdWJsaWMgUU9iamVjdCwgcHVibGljIENhY2hlZE9iamVjdAotICAgIHsKLQlR
X09CSkVDVAotICAgIHB1YmxpYzoKLQlDYWNoZWRJbWFnZShEb2NMb2FkZXIqIGRsLCBjb25zdCBE
T006OkRPTVN0cmluZyAmdXJsLCBLSU86OkNhY2hlQ29udHJvbCBjYWNoZVBvbGljeSwgdGltZV90
IF9leHBpcmVEYXRlKTsKLQl2aXJ0dWFsIH5DYWNoZWRJbWFnZSgpOwotCi0JY29uc3QgUVBpeG1h
cCAmcGl4bWFwKCkgY29uc3Q7Ci0JY29uc3QgUVBpeG1hcCAmdGlsZWRfcGl4bWFwKGNvbnN0IFFD
b2xvciYgYmcpOwotCi0gICAgICAgIFFTaXplIHBpeG1hcF9zaXplKCkgY29uc3Q7ICAgIC8vIHJl
dHVybnMgdGhlIHNpemUgb2YgdGhlIGNvbXBsZXRlIChpLmUuIHdoZW4gZmluaXNoZWQpIGxvYWRp
bmcKLSAgICAgICAgUVJlY3QgdmFsaWRfcmVjdCgpIGNvbnN0OyAgICAgLy8gcmV0dXJucyB0aGUg
cmVjdGFuZ2xlIG9mIHBpeG1hcCB0aGF0IGhhcyBiZWVuIGxvYWRlZCBhbHJlYWR5Ci0KLSAgICAg
ICAgdm9pZCByZWYoQ2FjaGVkT2JqZWN0Q2xpZW50ICpjb25zdW1lcik7Ci0JdmlydHVhbCB2b2lk
IGRlcmVmKENhY2hlZE9iamVjdENsaWVudCAqY29uc3VtZXIpOwotCi0JdmlydHVhbCB2b2lkIGRh
dGEoIFFCdWZmZXIgJmJ1ZmZlciwgYm9vbCBlb2YgKTsKLQl2aXJ0dWFsIHZvaWQgZXJyb3IoIGlu
dCBlcnIsIGNvbnN0IGNoYXIgKnRleHQgKTsKLQotICAgICAgICBib29sIGlzVHJhbnNwYXJlbnQo
KSBjb25zdCB7IHJldHVybiBpc0Z1bGx5VHJhbnNwYXJlbnQ7IH0KLSAgICAgICAgYm9vbCBpc0Vy
cm9ySW1hZ2UoKSBjb25zdCB7IHJldHVybiBlcnJvck9jY3VyZWQ7IH0KLQotICAgICAgICB2b2lk
IHNldFNob3dBbmltYXRpb25zKCBLSFRNTFNldHRpbmdzOjpLQW5pbWF0aW9uQWR2aWNlICk7Ci0K
LSAgICAgICAgdmlydHVhbCBib29sIHNjaGVkdWxlKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQot
Ci0Jdm9pZCBjaGVja05vdGlmeSgpOwotICAgICAgICAKLSAgICAgICAgdmlydHVhbCBib29sIGlz
SW1hZ2UoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0KLQl2b2lkIGNsZWFyKCk7Ci0gICAgICAg
IAotICAgIHByaXZhdGU6Ci0gICAgICAgIHZvaWQgZG9fbm90aWZ5KGNvbnN0IFFQaXhtYXAmIHAs
IGNvbnN0IFFSZWN0JiByKTsKLQotICAgICAgICBRUGl4bWFwKiBwOwotCVFQaXhtYXAqIGJnOwot
ICAgICAgICBRUmdiIGJnQ29sb3I7Ci0gICAgICAgIG11dGFibGUgUVBpeG1hcCogcGl4UGFydDsK
LQotICAgICAgICBJbWFnZVNvdXJjZSogaW1nU291cmNlOwotICAgICAgICBjb25zdCBjaGFyKiBm
b3JtYXRUeXBlOyAgLy8gSXMgdGhlIG5hbWUgb2YgdGhlIG1vdmllIGZvcm1hdCB0eXBlCi0KLQlp
bnQgd2lkdGg7Ci0JaW50IGhlaWdodDsKLQotCS8vIElzIHNldCBpZiBtb3ZpZSBmb3JtYXQgdHlw
ZSAoIGluY3JlbWVudGFsL2FuaW1hdGlvbikgd2FzIGNoZWNrZWQKLQlib29sIHR5cGVDaGVja2Vk
IDogMTsKLSAgICAgICAgYm9vbCBpc0Z1bGx5VHJhbnNwYXJlbnQgOiAxOwotICAgICAgICBib29s
IGVycm9yT2NjdXJlZCA6IDE7Ci0gICAgICAgIGJvb2wgbW9ub2Nocm9tZSA6IDE7Ci0gICAgICAg
IEtIVE1MU2V0dGluZ3M6OktBbmltYXRpb25BZHZpY2UgbV9zaG93QW5pbWF0aW9ucyA6IDI7Ci0K
LSAgICAgICAgZnJpZW5kIGNsYXNzIENhY2hlOwotCi0gICAgcHVibGljOgotICAgICAgICBpbnQg
ZGF0YVNpemUoKSBjb25zdCB7IHJldHVybiBtX2RhdGFTaXplOyB9Ci0JQ2FjaGVkSW1hZ2VDYWxs
YmFjayAqZGVjb2RlckNhbGxiYWNrKCkgY29uc3QgeyByZXR1cm4gbV9kZWNvZGVyQ2FsbGJhY2s7
IH0KLSAgICBwcml2YXRlOgotICAgICAgICBmcmllbmQgY2xhc3MgQ2FjaGVkSW1hZ2VDYWxsYmFj
azsKLSAgICAgICAgCi0gICAgICAgIGludCBtX2RhdGFTaXplOwotICAgICAgICBDYWNoZWRJbWFn
ZUNhbGxiYWNrICptX2RlY29kZXJDYWxsYmFjazsKLSAgICB9OwotCi0jaWZkZWYgS0hUTUxfWFNM
VAotICAgIGNsYXNzIENhY2hlZFhTTFN0eWxlU2hlZXQgOiBwdWJsaWMgQ2FjaGVkT2JqZWN0Ci0g
ICAgewotcHVibGljOgotICAgICAgICBDYWNoZWRYU0xTdHlsZVNoZWV0KERvY0xvYWRlciogZGws
IGNvbnN0IERPTTo6RE9NU3RyaW5nICZ1cmwsIEtJTzo6Q2FjaGVDb250cm9sIGNhY2hlUG9saWN5
LCB0aW1lX3QgX2V4cGlyZURhdGUpOwotCi0gICAgICAgIGNvbnN0IERPTTo6RE9NU3RyaW5nJiBz
aGVldCgpIGNvbnN0IHsgcmV0dXJuIG1fc2hlZXQ7IH0KLSAgICAgICAgCi0gICAgICAgIHZpcnR1
YWwgdm9pZCByZWYoQ2FjaGVkT2JqZWN0Q2xpZW50ICpjb25zdW1lcik7Ci0gICAgICAgIHZpcnR1
YWwgdm9pZCBkZXJlZihDYWNoZWRPYmplY3RDbGllbnQgKmNvbnN1bWVyKTsKLSAgICAgICAgCi0g
ICAgICAgIHZpcnR1YWwgdm9pZCBzZXRDaGFyc2V0KGNvbnN0IFFTdHJpbmcgJmNocyk7Ci0gICAg
ICAgIHZpcnR1YWwgdm9pZCBkYXRhKFFCdWZmZXIgJmJ1ZmZlciwgYm9vbCBlb2YpOwotICAgICAg
ICB2aXJ0dWFsIHZvaWQgZXJyb3IoaW50IGVyciwgY29uc3QgY2hhciAqdGV4dCk7Ci0gICAgICAg
IAotICAgICAgICB2aXJ0dWFsIGJvb2wgc2NoZWR1bGUoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9
Ci0gICAgICAgIAotICAgICAgICB2b2lkIGNoZWNrTm90aWZ5KCk7Ci0gICAgICAgIAotcHJvdGVj
dGVkOgotICAgICAgICBET006OkRPTVN0cmluZyBtX3NoZWV0OwotICAgICAgICBSZWZQdHI8RGVj
b2Rlcj4gbV9kZWNvZGVyOwotICAgIH07Ci0jZW5kaWYKLSAgICAKLSNpZm5kZWYgS0hUTUxfTk9f
WEJMCi0gICAgY2xhc3MgQ2FjaGVkWEJMRG9jdW1lbnQgOiBwdWJsaWMgQ2FjaGVkT2JqZWN0Ci0g
ICAgewotICAgIHB1YmxpYzoKLSAgICAgICAgQ2FjaGVkWEJMRG9jdW1lbnQoRG9jTG9hZGVyKiBk
bCwgY29uc3QgRE9NOjpET01TdHJpbmcgJnVybCwgS0lPOjpDYWNoZUNvbnRyb2wgY2FjaGVQb2xp
Y3ksIHRpbWVfdCBfZXhwaXJlRGF0ZSk7Ci0gICAgICAgIHZpcnR1YWwgfkNhY2hlZFhCTERvY3Vt
ZW50KCk7Ci0gICAgICAgIAotICAgICAgICBYQkw6OlhCTERvY3VtZW50SW1wbCogZG9jdW1lbnQo
KSBjb25zdCB7IHJldHVybiBtX2RvY3VtZW50OyB9Ci0gICAgICAgIAotICAgICAgICB2aXJ0dWFs
IHZvaWQgcmVmKENhY2hlZE9iamVjdENsaWVudCAqY29uc3VtZXIpOwotICAgICAgICB2aXJ0dWFs
IHZvaWQgZGVyZWYoQ2FjaGVkT2JqZWN0Q2xpZW50ICpjb25zdW1lcik7Ci0gICAgICAgIAotICAg
ICAgICB2aXJ0dWFsIHZvaWQgc2V0Q2hhcnNldCggY29uc3QgUVN0cmluZyAmY2hzICk7Ci0gICAg
ICAgIHZpcnR1YWwgdm9pZCBkYXRhKCBRQnVmZmVyICZidWZmZXIsIGJvb2wgZW9mICk7Ci0gICAg
ICAgIHZpcnR1YWwgdm9pZCBlcnJvciggaW50IGVyciwgY29uc3QgY2hhciAqdGV4dCApOwotICAg
ICAgICAKLSAgICAgICAgdmlydHVhbCBib29sIHNjaGVkdWxlKCkgY29uc3QgeyByZXR1cm4gdHJ1
ZTsgfQotICAgICAgICAKLSAgICAgICAgdm9pZCBjaGVja05vdGlmeSgpOwotICAgICAgICAKLXBy
b3RlY3RlZDoKLSAgICAgICAgWEJMOjpYQkxEb2N1bWVudEltcGwqIG1fZG9jdW1lbnQ7Ci0gICAg
ICAgIFJlZlB0cjxEZWNvZGVyPiBtX2RlY29kZXI7Ci0gICAgfTsKLSNlbmRpZgotCi0gICAgLyoq
Ci0gICAgICogQGludGVybmFsCi0gICAgICoKLSAgICAgKiBNYW5hZ2VzIHRoZSBsb2FkaW5nIG9m
IHNjcmlwdHMvaW1hZ2VzL3N0eWxlc2hlZXRzIGZvciBhIHBhcnRpY3VsYXIgZG9jdW1lbnQKLSAg
ICAgKi8KLSAgICBjbGFzcyBEb2NMb2FkZXIKLSAgICB7Ci0gICAgcHVibGljOgotIAlEb2NMb2Fk
ZXIoS0hUTUxQYXJ0KiwgRE9NOjpEb2N1bWVudEltcGwqKTsKLSAJfkRvY0xvYWRlcigpOwotCi0J
Q2FjaGVkSW1hZ2UgKnJlcXVlc3RJbWFnZSggY29uc3QgRE9NOjpET01TdHJpbmcgJnVybCk7Ci0J
Q2FjaGVkQ1NTU3R5bGVTaGVldCAqcmVxdWVzdFN0eWxlU2hlZXQoIGNvbnN0IERPTTo6RE9NU3Ry
aW5nICZ1cmwsIGNvbnN0IFFTdHJpbmcmIGNoYXJzZXQpOwotICAgICAgICBDYWNoZWRTY3JpcHQg
KnJlcXVlc3RTY3JpcHQoIGNvbnN0IERPTTo6RE9NU3RyaW5nICZ1cmwsIGNvbnN0IFFTdHJpbmcm
IGNoYXJzZXQpOwotCi0jaWZkZWYgS0hUTUxfWFNMVAotICAgICAgICBDYWNoZWRYU0xTdHlsZVNo
ZWV0KiByZXF1ZXN0WFNMU3R5bGVTaGVldChjb25zdCBET006OkRPTVN0cmluZyYgdXJsKTsKLSNl
bmRpZgotI2lmbmRlZiBLSFRNTF9OT19YQkwKLSAgICAgICAgQ2FjaGVkWEJMRG9jdW1lbnQqIHJl
cXVlc3RYQkxEb2N1bWVudChjb25zdCBET006OkRPTVN0cmluZyAmdXJsKTsKLSNlbmRpZgotCi0J
Ym9vbCBhdXRvbG9hZEltYWdlcygpIGNvbnN0IHsgcmV0dXJuIG1fYmF1dG9sb2FkSW1hZ2VzOyB9
Ci0gICAgICAgIEtJTzo6Q2FjaGVDb250cm9sIGNhY2hlUG9saWN5KCkgY29uc3QgeyByZXR1cm4g
bV9jYWNoZVBvbGljeTsgfQotICAgICAgICBLSFRNTFNldHRpbmdzOjpLQW5pbWF0aW9uQWR2aWNl
IHNob3dBbmltYXRpb25zKCkgY29uc3QgeyByZXR1cm4gbV9zaG93QW5pbWF0aW9uczsgfQotICAg
ICAgICB0aW1lX3QgZXhwaXJlRGF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1fZXhwaXJlRGF0ZTsgfQot
ICAgICAgICBLSFRNTFBhcnQqIHBhcnQoKSBjb25zdCB7IHJldHVybiBtX3BhcnQ7IH0KLSAgICAg
ICAgRE9NOjpEb2N1bWVudEltcGwqIGRvYygpIGNvbnN0IHsgcmV0dXJuIG1fZG9jOyB9Ci0KLSAg
ICAgICAgdm9pZCBzZXRFeHBpcmVEYXRlKCB0aW1lX3QgKTsKLSAgICAgICAgdm9pZCBzZXRBdXRv
bG9hZEltYWdlcyggYm9vbCApOwotICAgICAgICB2b2lkIHNldENhY2hlUG9saWN5KCBLSU86OkNh
Y2hlQ29udHJvbCBjYWNoZVBvbGljeSApOwotICAgICAgICB2b2lkIHNldFNob3dBbmltYXRpb25z
KCBLSFRNTFNldHRpbmdzOjpLQW5pbWF0aW9uQWR2aWNlICk7Ci0gICAgICAgIHZvaWQgcmVtb3Zl
Q2FjaGVkT2JqZWN0KCBDYWNoZWRPYmplY3QqKSBjb25zdDsKLQkJCi0gICAgICAgIHZvaWQgc2V0
TG9hZEluUHJvZ3Jlc3MoYm9vbCk7Ci0gICAgICAgIGJvb2wgbG9hZEluUHJvZ3Jlc3MoKSBjb25z
dCB7IHJldHVybiBtX2xvYWRJblByb2dyZXNzOyB9Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBi
b29sIG5lZWRSZWxvYWQoY29uc3QgS1VSTCAmZnVsbFVybCk7Ci0KLSAgICAgICAgZnJpZW5kIGNs
YXNzIENhY2hlOwotICAgICAgICBmcmllbmQgY2xhc3MgRE9NOjpEb2N1bWVudEltcGw7Ci0KLSAg
ICAgICAgUVN0cmluZ0xpc3QgbV9yZWxvYWRlZFVSTHM7Ci0gICAgICAgIG11dGFibGUgUVB0ckxp
c3Q8Q2FjaGVkT2JqZWN0PiBtX2RvY09iamVjdHM7Ci0JdGltZV90IG1fZXhwaXJlRGF0ZTsKLQlL
SU86OkNhY2hlQ29udHJvbCBtX2NhY2hlUG9saWN5OwotICAgICAgICBib29sIG1fYmF1dG9sb2Fk
SW1hZ2VzIDogMTsKLSAgICAgICAgS0hUTUxTZXR0aW5nczo6S0FuaW1hdGlvbkFkdmljZSBtX3No
b3dBbmltYXRpb25zIDogMjsKLSAgICAgICAgS0hUTUxQYXJ0KiBtX3BhcnQ7Ci0gICAgICAgIERP
TTo6RG9jdW1lbnRJbXBsICptX2RvYzsKLSAgICAgICAgYm9vbCBtX2xvYWRJblByb2dyZXNzOwot
ICAgIH07Ci0KLSAgICAvKioKLSAgICAgKiBAaW50ZXJuYWwKLSAgICAgKi8KLSAgICBjbGFzcyBS
ZXF1ZXN0Ci0gICAgewotICAgIHB1YmxpYzoKLQlSZXF1ZXN0KERvY0xvYWRlciogZGwsIENhY2hl
ZE9iamVjdCAqX29iamVjdCwgYm9vbCBfaW5jcmVtZW50YWwpOwotCX5SZXF1ZXN0KCk7Ci0JYm9v
bCBpbmNyZW1lbnRhbDsKLQlRQnVmZmVyIG1fYnVmZmVyOwotCUNhY2hlZE9iamVjdCAqb2JqZWN0
OwotICAgICAgICBEb2NMb2FkZXIqIG1fZG9jTG9hZGVyOwotICAgICAgICBib29sIG11bHRpcGFy
dDsKLSAgICAgfTsKLQotICAgIC8qKgotICAgICAqIEBpbnRlcm5hbAotICAgICAqLwotICAgIGNs
YXNzIExvYWRlciA6IHB1YmxpYyBRT2JqZWN0Ci0gICAgewotCVFfT0JKRUNUCi0KLSAgICBwdWJs
aWM6CQotCUxvYWRlcigpOwotCX5Mb2FkZXIoKTsKLQotCXZvaWQgbG9hZChEb2NMb2FkZXIqIGRs
LCBDYWNoZWRPYmplY3QgKm9iamVjdCwgYm9vbCBpbmNyZW1lbnRhbCA9IHRydWUpOwotCi0gICAg
ICAgIGludCBudW1SZXF1ZXN0cyggRG9jTG9hZGVyKiBkbCApIGNvbnN0OwotICAgICAgICB2b2lk
IGNhbmNlbFJlcXVlc3RzKCBEb2NMb2FkZXIqIGRsICk7Ci0KLQl2b2lkIHJlbW92ZUJhY2tncm91
bmREZWNvZGluZ1JlcXVlc3QgKFJlcXVlc3QgKnIpOwotCQotICAgICAgICAvLyBtYXkgcmV0dXJu
IDBMCi0gICAgICAgIEtJTzo6Sm9iICpqb2JGb3JSZXF1ZXN0KCBjb25zdCBET006OkRPTVN0cmlu
ZyAmdXJsICkgY29uc3Q7Ci0KLSAgICAgICAgS1dRTG9hZGVyICprd3E7Ci0KLSAgICBzaWduYWxz
OgotCWZyaWVuZCBjbGFzcyBDYWNoZWRJbWFnZUNhbGxiYWNrOwotCi0gICAgICAgIHZvaWQgcmVx
dWVzdFN0YXJ0ZWQoIGtodG1sOjpEb2NMb2FkZXIqIGRsLCBraHRtbDo6Q2FjaGVkT2JqZWN0KiBv
YmogKTsKLQl2b2lkIHJlcXVlc3REb25lKCBraHRtbDo6RG9jTG9hZGVyKiBkbCwga2h0bWw6OkNh
Y2hlZE9iamVjdCAqb2JqICk7Ci0Jdm9pZCByZXF1ZXN0RmFpbGVkKCBraHRtbDo6RG9jTG9hZGVy
KiBkbCwga2h0bWw6OkNhY2hlZE9iamVjdCAqb2JqICk7Ci0KLSAgICBwcm90ZWN0ZWQgc2xvdHM6
Ci0gICAgICAgIHZvaWQgc2xvdEZpbmlzaGVkKCBLSU86OkpvYiAqICwgTlNEYXRhICphbGxEYXRh
KTsKLQl2b2lkIHNsb3REYXRhKCBLSU86OkpvYiAqLCBjb25zdCBjaGFyICpkYXRhLCBpbnQgc2l6
ZSApOwotICAgICAgICB2b2lkIHNsb3RSZWNlaXZlZFJlc3BvbnNlICggS0lPOjpKb2IgKiwgTlNV
UkxSZXNwb25zZSAqcmVzcG9uc2UgKTsKLQotICAgIHByaXZhdGU6Ci0Jdm9pZCBzZXJ2ZVBlbmRp
bmdSZXF1ZXN0cygpOwotCi0gICAgICAgIHZpcnR1YWwgYm9vbCBpc0tIVE1MTG9hZGVyKCkgY29u
c3Q7Ci0KLQlRUHRyTGlzdDxSZXF1ZXN0PiBtX3JlcXVlc3RzUGVuZGluZzsKLQlRUHRyRGljdDxS
ZXF1ZXN0PiBtX3JlcXVlc3RzTG9hZGluZzsKLQotCVFQdHJMaXN0PFJlcXVlc3Q+IG1fcmVxdWVz
dHNCYWNrZ3JvdW5kRGVjb2Rpbmc7Ci0KLSNpZmRlZiBIQVZFX0xJQkpQRUcKLSAgICAgICAgS0pQ
RUdGb3JtYXRUeXBlIG1fanBlZ2xvYWRlcjsKLSNlbmRpZgotICAgIH07Ci0KLSAgICAgICAgLyoq
Ci0gICAgICogQGludGVybmFsCi0gICAgICoKLSAgICAgKiBQcm92aWRlcyBhIGNhY2hlL2xvYWRl
ciBmb3Igb2JqZWN0cyBuZWVkZWQgZm9yIGRpc3BsYXlpbmcgdGhlIGh0bWwgcGFnZS4KLSAgICAg
KiBBdCB0aGUgbW9tZW50IHRoZXNlIGFyZSBzdHlsZXNoZWV0cywgc2NyaXB0cyBhbmQgaW1hZ2Vz
Ci0gICAgICovCi0gICAgY2xhc3MgQ2FjaGUKLSAgICB7Ci0JZnJpZW5kIGNsYXNzIERvY0xvYWRl
cjsKLSAgICBwdWJsaWM6Ci0JLyoqCi0JICogaW5pdCB0aGUgY2FjaGUgaW4gY2FzZSBpdCdzIG5v
dCBhbHJlYWR5LiBUaGlzIG5lZWRzIHRvIGdldCBjYWxsZWQgb25jZQotCSAqIGJlZm9yZSB1c2lu
ZyBpdC4KLQkgKi8KLQlzdGF0aWMgdm9pZCBpbml0KCk7Ci0gICAgICAgIAotCS8qKgotCSAqIEFz
ayB0aGUgY2FjaGUgZm9yIHNvbWUgdXJsLiBXaWxsIHJldHVybiBhIGNhY2hlZE9iamVjdCwgYW5k
Ci0JICogbG9hZCB0aGUgcmVxdWVzdGVkIGRhdGEgaW4gY2FzZSBpdCdzIG5vdCBjYWhjZWQKLSAg
ICAgICAgICogaWYgdGhlIERvY0xvYWRlciBpcyB6ZXJvLCB0aGUgdXJsIG11c3QgYmUgZnVsbC1x
dWFsaWZpZWQuCi0gICAgICAgICAqIE90aGVyd2lzZSwgaXQgaXMgYXV0b21hdGljYWxseSBiYXNl
LXVybCBleHBhbmRlZAotCSAqLwotCXN0YXRpYyBDYWNoZWRJbWFnZSAqcmVxdWVzdEltYWdlKCBE
b2NMb2FkZXIqIGwsIGNvbnN0IERPTTo6RE9NU3RyaW5nICZ1cmwsIGJvb2wgcmVsb2FkPWZhbHNl
LCB0aW1lX3QgX2V4cGlyZURhdGU9MCk7Ci0gICAgICAgIHN0YXRpYyBDYWNoZWRJbWFnZSAqcmVx
dWVzdEltYWdlKCBEb2NMb2FkZXIqIGwsIGNvbnN0IEtVUkwgJnVybCwgYm9vbCByZWxvYWQ9ZmFs
c2UsIHRpbWVfdCBfZXhwaXJlRGF0ZT0wKTsKLQotCS8qKgotCSAqIEFzayB0aGUgY2FjaGUgZm9y
IHNvbWUgdXJsLiBXaWxsIHJldHVybiBhIGNhY2hlZE9iamVjdCwgYW5kCi0JICogbG9hZCB0aGUg
cmVxdWVzdGVkIGRhdGEgaW4gY2FzZSBpdCdzIG5vdCBjYWNoZWQKLQkgKi8KLQlzdGF0aWMgQ2Fj
aGVkQ1NTU3R5bGVTaGVldCAqcmVxdWVzdFN0eWxlU2hlZXQoIERvY0xvYWRlciogbCwgY29uc3Qg
RE9NOjpET01TdHJpbmcgJnVybCwgYm9vbCByZWxvYWQ9ZmFsc2UsIHRpbWVfdCBfZXhwaXJlRGF0
ZT0wLCBjb25zdCBRU3RyaW5nJiBjaGFyc2V0ID0gUVN0cmluZzo6bnVsbCk7Ci0KLSNpZmRlZiBL
SFRNTF9YU0xUCi0gICAgICAgIC8vIEFzayB0aGUgY2FjaGUgZm9yIGFuIFhTTCBzdHlsZXNoZWV0
LgotICAgICAgICBzdGF0aWMgQ2FjaGVkWFNMU3R5bGVTaGVldCogcmVxdWVzdFhTTFN0eWxlU2hl
ZXQoRG9jTG9hZGVyKiBsLCBjb25zdCBET006OkRPTVN0cmluZyAmdXJsLCAKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVsb2Fk
PWZhbHNlLCB0aW1lX3QgX2V4cGlyZURhdGU9MCk7Ci0jZW5kaWYKLSNpZm5kZWYgS0hUTUxfTk9f
WEJMCi0gICAgICAgIC8vIEFzayB0aGUgY2FjaGUgZm9yIGFuIFhCTCBkb2N1bWVudC4KLSAgICAg
ICAgc3RhdGljIENhY2hlZFhCTERvY3VtZW50KiByZXF1ZXN0WEJMRG9jdW1lbnQoRG9jTG9hZGVy
KiBsLCBjb25zdCBET006OkRPTVN0cmluZyAmdXJsLCAKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZWxvYWQ9ZmFsc2UsIHRpbWVfdCBf
ZXhwaXJlRGF0ZT0wKTsKLSNlbmRpZgotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBQcmUtbG9h
ZHMgYSBzdHlsZXNoZWV0IGludG8gdGhlIGNhY2hlLgotICAgICAgICAgKi8KLSAgICAgICAgc3Rh
dGljIHZvaWQgcHJlbG9hZFN0eWxlU2hlZXQoY29uc3QgUVN0cmluZyAmdXJsLCBjb25zdCBRU3Ry
aW5nICZzdHlsZXNoZWV0X2RhdGEpOwotCi0JLyoqCi0JICogQXNrIHRoZSBjYWNoZSBmb3Igc29t
ZSB1cmwuIFdpbGwgcmV0dXJuIGEgY2FjaGVkT2JqZWN0LCBhbmQKLQkgKiBsb2FkIHRoZSByZXF1
ZXN0ZWQgZGF0YSBpbiBjYXNlIGl0J3Mgbm90IGNhaGNlZAotCSAqLwotCXN0YXRpYyBDYWNoZWRT
Y3JpcHQgKnJlcXVlc3RTY3JpcHQoIERvY0xvYWRlciogbCwgY29uc3QgRE9NOjpET01TdHJpbmcg
JnVybCwgYm9vbCByZWxvYWQ9ZmFsc2UsIHRpbWVfdCBfZXhwaXJlRGF0ZT0wLCBjb25zdCBRU3Ry
aW5nJiBjaGFyc2V0PVFTdHJpbmc6Om51bGwpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBQ
cmUtbG9hZHMgYSBzY3JpcHQgaW50byB0aGUgY2FjaGUuCi0gICAgICAgICAqLwotICAgICAgICBz
dGF0aWMgdm9pZCBwcmVsb2FkU2NyaXB0KGNvbnN0IFFTdHJpbmcgJnVybCwgY29uc3QgUVN0cmlu
ZyAmc2NyaXB0X2RhdGEpOwotCi0JLyoqCi0JICogc2V0cyB0aGUgc2l6ZSBvZiB0aGUgY2FjaGUu
IFRoaXMgd2lsbCBvbmx5IGhvZCBhcHByb3hpbWF0ZWx5LCBzaW5jZSB0aGUgc2l6ZSBzb21lCi0J
ICogY2FjaGVkIG9iamVjdHMgKGxpa2Ugc3R5bGVzaGVldHMpIHRha2UgdXAgaW4gbWVtb3J5IGlz
IG5vdCBleGFjbHR5IGtub3duLgotCSAqLwotCXN0YXRpYyB2b2lkIHNldFNpemUoIGludCBieXRl
cyApOwotCS8qKgotCSAqIHJldHVybnMgdGhlIHNpemUgb2YgdGhlIGNhY2hlCi0JICovCi0Jc3Rh
dGljIGludCBzaXplKCkgeyByZXR1cm4gbWF4U2l6ZTsgfTsKLQotICAgICAgICBzdGF0aWMgaW50
IG1heENhY2hlYWJsZU9iamVjdFNpemUoKSB7IHJldHVybiBtYXhDYWNoZWFibGU7IH0KLQotCS8q
KgotCSAqIGNsZWFuIHVwIGNhY2hlCi0JICovCi0Jc3RhdGljIHZvaWQgZmx1c2goYm9vbCBmb3Jj
ZT1mYWxzZSk7Ci0KLQkvKioKLQkgKiBjbGVhcnMgdGhlIGNhY2hlCi0JICogV2FybmluZzogY2Fs
bCB0aGlzIG9ubHkgYXQgdGhlIGVuZCBvZiB5b3VyIHByb2dyYW0sIHRvIGNsZWFuCi0JICogdXAg
bWVtb3J5ICh1c2VmdWwgZm9yIGZpbmRpbmcgbWVtb3J5IGhvbGVzKQotCSAqLwotCXN0YXRpYyB2
b2lkIGNsZWFyKCk7Ci0KLQlzdGF0aWMgTG9hZGVyICpsb2FkZXIoKSB7IHJldHVybiBtX2xvYWRl
cjsgfQotCi0gICAgCXN0YXRpYyBRUGl4bWFwICpudWxsUGl4bWFwOwotICAgICAgICBzdGF0aWMg
UVBpeG1hcCAqYnJva2VuUGl4bWFwOwotCi0gICAgICAgIHN0YXRpYyB2b2lkIHJlbW92ZUNhY2hl
RW50cnkoIENhY2hlZE9iamVjdCAqb2JqZWN0ICk7Ci0KLSAgICAgICAgc3RydWN0IFR5cGVTdGF0
aXN0aWMgewotICAgICAgICAgICAgaW50IGNvdW50OwotICAgICAgICAgICAgaW50IHNpemU7Ci0g
ICAgICAgICAgICBUeXBlU3RhdGlzdGljKCkgOiBjb3VudCgwKSwgc2l6ZSgwKSB7IH0KLSAgICAg
ICAgfTsKLSAgICAgICAgCi0gICAgICAgIHN0cnVjdCBTdGF0aXN0aWNzIHsKLSAgICAgICAgICAg
IFR5cGVTdGF0aXN0aWMgaW1hZ2VzOwotICAgICAgICAgICAgVHlwZVN0YXRpc3RpYyBtb3ZpZXM7
Ci0gICAgICAgICAgICBUeXBlU3RhdGlzdGljIHN0eWxlU2hlZXRzOwotICAgICAgICAgICAgVHlw
ZVN0YXRpc3RpYyBzY3JpcHRzOwotI2lmZGVmIEtIVE1MX1hTTFQKLSAgICAgICAgICAgIFR5cGVT
dGF0aXN0aWMgeHNsU3R5bGVTaGVldHM7Ci0jZW5kaWYKLSNpZm5kZWYgS0hUTUxfTk9fWEJMCi0g
ICAgICAgICAgICBUeXBlU3RhdGlzdGljIHhibERvY3M7Ci0jZW5kaWYKLSAgICAgICAgICAgIFR5
cGVTdGF0aXN0aWMgb3RoZXI7Ci0gICAgICAgIH07Ci0KLSAgICAgICAgc3RhdGljIFN0YXRpc3Rp
Y3MgZ2V0U3RhdGlzdGljcygpOwotICAgICAgICBzdGF0aWMgdm9pZCBmbHVzaEFsbCgpOwotICAg
ICAgICBzdGF0aWMgdm9pZCBzZXRDYWNoZURpc2FibGVkKGJvb2wpOwotCi0gICAgICAgIHN0YXRp
YyB2b2lkIGluc2VydEluTFJVTGlzdChDYWNoZWRPYmplY3QgKik7Ci0gICAgICAgIHN0YXRpYyB2
b2lkIHJlbW92ZUZyb21MUlVMaXN0KENhY2hlZE9iamVjdCAqKTsKLSAgICAgICAgc3RhdGljIGJv
b2wgYWRqdXN0U2l6ZShDYWNoZWRPYmplY3QgKiwgaW50IHNpemVEZWx0YSk7Ci0gICAgICAgIAot
ICAgICAgICBzdGF0aWMgTFJVTGlzdCogZ2V0TFJVTGlzdEZvcihDYWNoZWRPYmplY3QqIG8pOwot
ICAgICAgICAKLSAgICAgICAgc3RhdGljIHZvaWQgY2hlY2tMUlVBbmRVbmNhY2hlYWJsZUxpc3RJ
bnRlZ3JpdHkoKTsKLQotICAgIHByb3RlY3RlZDoKLSAgICAgICAgc3RhdGljIFFEaWN0PENhY2hl
ZE9iamVjdD4gKmNhY2hlOwotICAgICAgICBzdGF0aWMgUVB0ckxpc3Q8RG9jTG9hZGVyPiogZG9j
bG9hZGVyOwotICAgIAotICAgICAgICBzdGF0aWMgaW50IG1heFNpemU7Ci0gICAgICAgIHN0YXRp
YyBpbnQgbWF4Q2FjaGVhYmxlOwotICAgICAgICBzdGF0aWMgaW50IGZsdXNoQ291bnQ7Ci0gICAg
Ci0gICAgICAgIHN0YXRpYyBMb2FkZXIgKm1fbG9hZGVyOwotICAgIAotICAgICAgICBzdGF0aWMg
dm9pZCBtb3ZlVG9IZWFkT2ZMUlVMaXN0KENhY2hlZE9iamVjdCAqKTsKLSAgICAKLSAgICAgICAg
c3RhdGljIExSVUxpc3QgKm1fTFJVTGlzdHM7Ci0gICAgICAgIHN0YXRpYyBpbnQgbV90b3RhbFNp
emVPZkxSVUxpc3RzOwotICAgICAgICAgICAgCi0gICAgICAgIHN0YXRpYyBDYWNoZWRPYmplY3Qg
Km1faGVhZE9mVW5jYWNoZWFibGVMaXN0OwotICAgICAgICAgICAgCi0gICAgICAgIHN0YXRpYyBp
bnQgbV9jb3VudE9mTFJVQW5kVW5jYWNoZWFibGVMaXN0czsKLSAgICB9OwogCiB9OwogCkluZGV4
OiBtaXNjL0NhY2hlZFNjcmlwdC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gbWlzYy9DYWNoZWRTY3JpcHQu
Y3BwCShyZXZpc2lvbiAxMTk0OCkKKysrIG1pc2MvQ2FjaGVkU2NyaXB0LmNwcAkod29ya2luZyBj
b3B5KQpAQCAtMjUsMjI0ICsyNSwxOCBAQAogICAgIHBhZ2VzIGZyb20gdGhlIHdlYi4gSXQgaGFz
IGEgbWVtb3J5IGNhY2hlIGZvciB0aGVzZSBvYmplY3RzLgogKi8KIAotI3VuZGVmIENBQ0hFX0RF
QlVHCi0vLyNkZWZpbmUgQ0FDSEVfREVCVUcKICNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRl
IDxhc3NlcnQuaD4KLQotI2luY2x1ZGUgImxvYWRlci5oIgotCi0vLyB1cCB0byB3aGljaCBzaXpl
IGlzIGEgcGljdHVyZSBmb3Igc3VyZSBjYWNoZWFibGUKLSNkZWZpbmUgTUFYQ0FDSEVBQkxFIDQw
KjEwMjQKLS8vIGRlZmF1bHQgY2FjaGUgc2l6ZQotI2RlZmluZSBERUZDQUNIRVNJWkUgNDA5Niox
MDI0Ci0KLSNpbmNsdWRlIDxxYXN5bmNpby5oPgotI2luY2x1ZGUgPHFwYWludGVyLmg+CisjaW5j
bHVkZSAiQ2FjaGVkU2NyaXB0LmgiCiAKICNpbmNsdWRlIDxraW8vam9iLmg+CiAjaW5jbHVkZSA8
a2lvL2pvYmNsYXNzZXMuaD4KLSNpbmNsdWRlIDxraW1hZ2Vpby5oPgotI2luY2x1ZGUgPGtjaGFy
c2V0cy5oPgotI2luY2x1ZGUgPGtkZWJ1Zy5oPgotI2luY2x1ZGUgImtodG1sX2ZhY3RvcnkuaCIK
LSNpbmNsdWRlICJraHRtbF9wYXJ0LmgiCiAjaW5jbHVkZSAiZGVjb2Rlci5oIgogCi0jaW5jbHVk
ZSAiaHRtbC9odG1sX2RvY3VtZW50aW1wbC5oIgotI2luY2x1ZGUgImNzcy9jc3Nfc3R5bGVzaGVl
dGltcGwuaCIKLQotI2lmbmRlZiBLSFRNTF9OT19YQkwKLSNpbmNsdWRlICJ4YmwveGJsX2RvY2lt
cGwuaCIKLSNlbmRpZgotCiAjaW5jbHVkZSA8a3htbGNvcmUvQXNzZXJ0aW9ucy5oPgotI2luY2x1
ZGUgIktXUUxvYWRlci5oIgogCi11c2luZyBuYW1lc3BhY2Uga2h0bWw7CiB1c2luZyBuYW1lc3Bh
Y2UgRE9NOwogCi1zdGF0aWMgYm9vbCBjYWNoZURpc2FibGVkOwotCi0vLyBDYWxsIHRoaXMgIndh
bGtlciIgaW5zdGVhZCBvZiBpdGVyYXRvciBzbyBwZW9wbGUgd29uJ3QgZXhwZWN0IFF0IG9yIFNU
TC1zdHlsZSBpdGVyYXRvciBpbnRlcmZhY2UuCi0vLyBKdXN0IGtlZXAgY2FsbGluZyBuZXh0KCkg
b24gdGhpcy4gSXQncyBzYWZlIGZyb20gZGVsZXRpb25zIG9mIHRoZSBjdXJyZW50IGl0ZW0KLWNs
YXNzIENhY2hlZE9iamVjdENsaWVudFdhbGtlciB7Ci1wdWJsaWM6Ci0gICAgQ2FjaGVkT2JqZWN0
Q2xpZW50V2Fsa2VyKGNvbnN0IFFQdHJEaWN0PENhY2hlZE9iamVjdENsaWVudD4gJmNsaWVudHMp
IDogX2N1cnJlbnQoMCksIF9pdGVyYXRvcihjbGllbnRzKSB7IH0KLSAgICBDYWNoZWRPYmplY3RD
bGllbnQgKm5leHQoKTsKLXByaXZhdGU6Ci0gICAgQ2FjaGVkT2JqZWN0Q2xpZW50ICpfY3VycmVu
dDsKLSAgICBRUHRyRGljdEl0ZXJhdG9yPENhY2hlZE9iamVjdENsaWVudD4gX2l0ZXJhdG9yOwot
fTsKLQotQ2FjaGVkT2JqZWN0Ojp+Q2FjaGVkT2JqZWN0KCkKLXsKLSAgICBpZihtX2RlbGV0ZWQp
IGFib3J0KCk7Ci0gICAgQ2FjaGU6OnJlbW92ZUZyb21MUlVMaXN0KHRoaXMpOwotICAgIG1fZGVs
ZXRlZCA9IHRydWU7Ci0gICAgc2V0UmVzcG9uc2UoMCk7Ci0gICAgc2V0QWxsRGF0YSgwKTsKLX0K
LQotdm9pZCBDYWNoZWRPYmplY3Q6OmZpbmlzaCgpCi17Ci0gICAgaWYgKG1fc2l6ZSA+IENhY2hl
OjptYXhDYWNoZWFibGVPYmplY3RTaXplKCkpCi0gICAgICAgIG1fc3RhdHVzID0gVW5jYWNoZWFi
bGU7Ci0gICAgZWxzZQotICAgICAgICBtX3N0YXR1cyA9IENhY2hlZDsKLSAgICBLVVJMIHVybCht
X3VybC5xc3RyaW5nKCkpOwotICAgIGlmIChtX2V4cGlyZURhdGVDaGFuZ2VkICYmIHVybC5wcm90
b2NvbCgpLnN0YXJ0c1dpdGgoImh0dHAiKSkKLSAgICAgICAgbV9leHBpcmVEYXRlQ2hhbmdlZCA9
IGZhbHNlOwotfQotCi12b2lkIENhY2hlZE9iamVjdDo6c2V0RXhwaXJlRGF0ZSh0aW1lX3QgX2V4
cGlyZURhdGUsIGJvb2wgY2hhbmdlSHR0cENhY2hlKQotewotICAgIGlmICggX2V4cGlyZURhdGUg
PT0gbV9leHBpcmVEYXRlKQotICAgICAgICByZXR1cm47Ci0KLSAgICBpZiAobV9zdGF0dXMgPT0g
VW5jYWNoZWFibGUgfHwgbV9zdGF0dXMgPT0gQ2FjaGVkKQotICAgIHsKLSAgICAgICAgZmluaXNo
KCk7Ci0gICAgfQotICAgIG1fZXhwaXJlRGF0ZSA9IF9leHBpcmVEYXRlOwotICAgIGlmIChjaGFu
Z2VIdHRwQ2FjaGUgJiYgbV9leHBpcmVEYXRlKQotICAgICAgIG1fZXhwaXJlRGF0ZUNoYW5nZWQg
PSB0cnVlOwotfQotCi1ib29sIENhY2hlZE9iamVjdDo6aXNFeHBpcmVkKCkgY29uc3QKLXsKLSAg
ICBpZiAoIW1fZXhwaXJlRGF0ZSkgcmV0dXJuIGZhbHNlOwotICAgIHRpbWVfdCBub3cgPSB0aW1l
KDApOwotICAgIHJldHVybiAoZGlmZnRpbWUobm93LCBtX2V4cGlyZURhdGUpID49IDApOwotfQot
Ci12b2lkIENhY2hlZE9iamVjdDo6c2V0UmVxdWVzdChSZXF1ZXN0ICpfcmVxdWVzdCkKLXsKLSAg
ICBpZiAoIF9yZXF1ZXN0ICYmICFtX3JlcXVlc3QgKQotICAgICAgICBtX3N0YXR1cyA9IFBlbmRp
bmc7Ci0gICAgbV9yZXF1ZXN0ID0gX3JlcXVlc3Q7Ci0gICAgaWYgKGNhbkRlbGV0ZSgpICYmIG1f
ZnJlZSkKLSAgICAgICAgZGVsZXRlIHRoaXM7Ci0gICAgZWxzZSBpZiAoYWxsb3dJbkxSVUxpc3Qo
KSkKLSAgICAgICAgQ2FjaGU6Omluc2VydEluTFJVTGlzdCh0aGlzKTsKLX0KLQotdm9pZCBDYWNo
ZWRPYmplY3Q6OnJlZihDYWNoZWRPYmplY3RDbGllbnQgKmMpCi17Ci0gICAgbV9jbGllbnRzLmlu
c2VydChjLCBjKTsKLSAgICBDYWNoZTo6cmVtb3ZlRnJvbUxSVUxpc3QodGhpcyk7Ci0gICAgaW5j
cmVhc2VBY2Nlc3NDb3VudCgpOwotfQotCi12b2lkIENhY2hlZE9iamVjdDo6ZGVyZWYoQ2FjaGVk
T2JqZWN0Q2xpZW50ICpjKQotewotICAgIG1fY2xpZW50cy5yZW1vdmUoYyk7Ci0gICAgaWYgKGFs
bG93SW5MUlVMaXN0KCkpCi0gICAgICAgIENhY2hlOjppbnNlcnRJbkxSVUxpc3QodGhpcyk7Ci19
Ci0KLXZvaWQgQ2FjaGVkT2JqZWN0OjpzZXRTaXplKGludCBzaXplKQotewotICAgIGJvb2wgc2l6
ZUNoYW5nZWQgPSBDYWNoZTo6YWRqdXN0U2l6ZSh0aGlzLCBzaXplIC0gbV9zaXplKTsKLQotICAg
IC8vIFRoZSBvYmplY3QgbXVzdCBub3cgYmUgbW92ZWQgdG8gYSBkaWZmZXJlbnQgcXVldWUsIHNp
bmNlIGl0cyBzaXplIGhhcyBiZWVuIGNoYW5nZWQuCi0gICAgaWYgKHNpemVDaGFuZ2VkICYmIGFs
bG93SW5MUlVMaXN0KCkpCi0gICAgICAgIENhY2hlOjpyZW1vdmVGcm9tTFJVTGlzdCh0aGlzKTsK
LQotICAgIG1fc2l6ZSA9IHNpemU7Ci0gICAgCi0gICAgaWYgKHNpemVDaGFuZ2VkICYmIGFsbG93
SW5MUlVMaXN0KCkpCi0gICAgICAgIENhY2hlOjppbnNlcnRJbkxSVUxpc3QodGhpcyk7Ci19Ci0K
LS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQ2FjaGVkQ1NTU3R5bGVT
aGVldDo6Q2FjaGVkQ1NTU3R5bGVTaGVldChEb2NMb2FkZXIqIGRsLCBjb25zdCBET01TdHJpbmcg
JnVybCwgS0lPOjpDYWNoZUNvbnRyb2wgX2NhY2hlUG9saWN5LCB0aW1lX3QgX2V4cGlyZURhdGUs
IGNvbnN0IFFTdHJpbmcmIGNoYXJzZXQpCi0gICAgOiBDYWNoZWRPYmplY3QodXJsLCBDU1NTdHls
ZVNoZWV0LCBfY2FjaGVQb2xpY3ksIF9leHBpcmVEYXRlKSwgbV9jb2RlYygwKQotewotICAgIC8v
IEl0J3MgY3NzIHdlIHdhbnQuCi0gICAgc2V0QWNjZXB0KCJ0ZXh0L2NzcyIpOwotICAgIC8vIGxv
YWQgdGhlIGZpbGUKLSAgICBDYWNoZTo6bG9hZGVyKCktPmxvYWQoZGwsIHRoaXMsIGZhbHNlKTsK
LSAgICBtX2xvYWRpbmcgPSB0cnVlOwotICAgIGlmICghY2hhcnNldC5pc0VtcHR5KCkpCi0JbV9j
b2RlYyA9IFFUZXh0Q29kZWM6OmNvZGVjRm9yTmFtZShjaGFyc2V0LmxhdGluMSgpKTsKLSAgICBp
ZiAoIW1fY29kZWMpCi0gICAgICAgIG1fY29kZWMgPSBRVGV4dENvZGVjOjpjb2RlY0Zvck5hbWUo
Imlzbzg4NTktMSIpOwotfQotCi1DYWNoZWRDU1NTdHlsZVNoZWV0OjpDYWNoZWRDU1NTdHlsZVNo
ZWV0KGNvbnN0IERPTVN0cmluZyAmdXJsLCBjb25zdCBRU3RyaW5nICZzdHlsZXNoZWV0X2RhdGEp
Ci0gICAgOiBDYWNoZWRPYmplY3QodXJsLCBDU1NTdHlsZVNoZWV0LCBLSU86OkNDX1ZlcmlmeSwg
MCwgc3R5bGVzaGVldF9kYXRhLmxlbmd0aCgpKQotewotICAgIG1fbG9hZGluZyA9IGZhbHNlOwot
ICAgIG1fc3RhdHVzID0gUGVyc2lzdGVudDsKLSAgICBtX2NvZGVjID0gMDsKLSAgICBtX3NoZWV0
ID0gRE9NU3RyaW5nKHN0eWxlc2hlZXRfZGF0YSk7Ci19Ci0KLQotQ2FjaGVkQ1NTU3R5bGVTaGVl
dDo6fkNhY2hlZENTU1N0eWxlU2hlZXQoKQotewotfQotCi12b2lkIENhY2hlZENTU1N0eWxlU2hl
ZXQ6OnJlZihDYWNoZWRPYmplY3RDbGllbnQgKmMpCi17Ci0gICAgQ2FjaGVkT2JqZWN0OjpyZWYo
Yyk7Ci0KLSAgICBpZighbV9sb2FkaW5nKSBjLT5zZXRTdHlsZVNoZWV0KCBtX3VybCwgbV9zaGVl
dCApOwotfQotCi12b2lkIENhY2hlZENTU1N0eWxlU2hlZXQ6OmRlcmVmKENhY2hlZE9iamVjdENs
aWVudCAqYykKLXsKLSAgICBDYWNoZTo6Zmx1c2goKTsKLSAgICBDYWNoZWRPYmplY3Q6OmRlcmVm
KGMpOwotICAgIGlmICggY2FuRGVsZXRlKCkgJiYgbV9mcmVlICkKLSAgICAgIGRlbGV0ZSB0aGlz
OwotfQotCi12b2lkIENhY2hlZENTU1N0eWxlU2hlZXQ6OnNldENoYXJzZXQoIGNvbnN0IFFTdHJp
bmcgJmNocyApCi17Ci0gICAgaWYgKCFjaHMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIFFUZXh0Q29k
ZWMgKmNvZGVjID0gUVRleHRDb2RlYzo6Y29kZWNGb3JOYW1lKGNocy5sYXRpbjEoKSk7Ci0gICAg
ICAgIGlmIChjb2RlYykKLSAgICAgICAgICAgIG1fY29kZWMgPSBjb2RlYzsKLSAgICB9Ci19Ci0K
LXZvaWQgQ2FjaGVkQ1NTU3R5bGVTaGVldDo6ZGF0YSggUUJ1ZmZlciAmYnVmZmVyLCBib29sIGVv
ZiApCi17Ci0gICAgaWYoIWVvZikgcmV0dXJuOwotICAgIGJ1ZmZlci5jbG9zZSgpOwotICAgIHNl
dFNpemUoYnVmZmVyLmJ1ZmZlcigpLnNpemUoKSk7Ci0gICAgUVN0cmluZyBkYXRhID0gbV9jb2Rl
Yy0+dG9Vbmljb2RlKCBidWZmZXIuYnVmZmVyKCkuZGF0YSgpLCBzaXplKCkgKTsKLSAgICBtX3No
ZWV0ID0gRE9NU3RyaW5nKGRhdGEpOwotICAgIG1fbG9hZGluZyA9IGZhbHNlOwotCi0gICAgY2hl
Y2tOb3RpZnkoKTsKLX0KLQotdm9pZCBDYWNoZWRDU1NTdHlsZVNoZWV0OjpjaGVja05vdGlmeSgp
Ci17Ci0gICAgaWYgKG1fbG9hZGluZykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgQ2FjaGVkT2Jq
ZWN0Q2xpZW50V2Fsa2VyIHcobV9jbGllbnRzKTsKLSAgICB3aGlsZSAoQ2FjaGVkT2JqZWN0Q2xp
ZW50ICpjID0gdy5uZXh0KCkpIHsKLSAgICAgICAgaWYgKG1fcmVzcG9uc2UgJiYgIUtXUUlzUmVz
cG9uc2VVUkxFcXVhbFRvVVJMKG1fcmVzcG9uc2UsIG1fdXJsKSkKLSAgICAgICAgICAgIGMtPnNl
dFN0eWxlU2hlZXQoRE9NU3RyaW5nKEtXUVJlc3BvbnNlVVJMKG1fcmVzcG9uc2UpKSwgbV9zaGVl
dCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGMtPnNldFN0eWxlU2hlZXQobV91cmwsIG1f
c2hlZXQpOwotICAgIH0KLX0KLQotCi12b2lkIENhY2hlZENTU1N0eWxlU2hlZXQ6OmVycm9yKCBp
bnQgLyplcnIqLywgY29uc3QgY2hhciAqLyp0ZXh0Ki8gKQotewotICAgIG1fbG9hZGluZyA9IGZh
bHNlOwotICAgIGNoZWNrTm90aWZ5KCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0KK25hbWVzcGFjZSBraHRtbCB7CiAKIENhY2hlZFNjcmlwdDo6Q2FjaGVkU2Ny
aXB0KERvY0xvYWRlciogZGwsIGNvbnN0IERPTVN0cmluZyAmdXJsLCBLSU86OkNhY2hlQ29udHJv
bCBfY2FjaGVQb2xpY3ksIHRpbWVfdCBfZXhwaXJlRGF0ZSwgY29uc3QgUVN0cmluZyYgY2hhcnNl
dCkKICAgICA6IENhY2hlZE9iamVjdCh1cmwsIFNjcmlwdCwgX2NhY2hlUG9saWN5LCBfZXhwaXJl
RGF0ZSksIG1fY29kZWMoMCkKQEAgLTMyNywxNTU3ICsxMjEsNCBAQCB2b2lkIENhY2hlZFNjcmlw
dDo6ZXJyb3IoIGludCAvKmVyciovLCBjCiAgICAgY2hlY2tOb3RpZnkoKTsKIH0KIAotLy8gLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQotc3RhdGljIGJvb2wgY3Jvc3NEb21h
aW4oY29uc3QgUVN0cmluZyAmYSwgY29uc3QgUVN0cmluZyAmYikKLXsKLSAgICBpZiAoYSA9PSBi
KSByZXR1cm4gZmFsc2U7Ci0KLSAgICBRU3RyaW5nTGlzdCBsMSA9IFFTdHJpbmdMaXN0OjpzcGxp
dCgnLicsIGEpOwotICAgIFFTdHJpbmdMaXN0IGwyID0gUVN0cmluZ0xpc3Q6OnNwbGl0KCcuJywg
Yik7Ci0KLSAgICB3aGlsZShsMS5jb3VudCgpID4gbDIuY291bnQoKSkKLSAgICAgICAgbDEucG9w
X2Zyb250KCk7Ci0KLSAgICB3aGlsZShsMi5jb3VudCgpID4gbDEuY291bnQoKSkKLSAgICAgICAg
bDIucG9wX2Zyb250KCk7Ci0KLSAgICB3aGlsZShsMi5jb3VudCgpID49IDIpCi0gICAgewotICAg
ICAgICBpZiAobDEgPT0gbDIpCi0gICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBs
MS5wb3BfZnJvbnQoKTsKLSAgICAgICAgbDIucG9wX2Zyb250KCk7Ci0gICAgfQotICAgIHJldHVy
biB0cnVlOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi12b2lkIENhY2hl
ZEltYWdlQ2FsbGJhY2s6Om5vdGlmeVVwZGF0ZSgpIAoteyAKLSAgICBpZiAoY2FjaGVkSW1hZ2Up
IHsKLSAgICAgICAgY2FjaGVkSW1hZ2UtPmRvX25vdGlmeSAoY2FjaGVkSW1hZ2UtPnBpeG1hcCgp
LCBjYWNoZWRJbWFnZS0+cGl4bWFwKCkucmVjdCgpKTsgCi0gICAgICAgIFFTaXplIHMgPSBjYWNo
ZWRJbWFnZS0+cGl4bWFwX3NpemUoKTsKLSAgICAgICAgY2FjaGVkSW1hZ2UtPnNldFNpemUocy53
aWR0aCgpICogcy5oZWlnaHQoKSAqIDIpOwotCi0gICAgICAgIC8vIEFmdGVyIHJlY2VpdmluZyB0
aGUgaW1hZ2UgaGVhZGVyIHdlIGFyZSBndWFyYW50ZWVkIHRvIGtub3cKLSAgICAgICAgLy8gdGhl
IGltYWdlIHNpemUuICBBbHRob3VnaCBhbGwgb2YgdGhlIGRhdGEgbWF5IG5vdCBoYXZlIGFycml2
ZWQgb3IKLSAgICAgICAgLy8gYmVlbiBkZWNvZGVkIHdlIGNhbiBjb25zaWRlciB0aGUgaW1hZ2Ug
bG9hZGVkIGZvciBwdXJwb3NlZCBvZgotICAgICAgICAvLyBsYXlvdXQgYW5kIGRpc3BhdGNoaW5n
IHRoZSBpbWFnZSdzIG9ubG9hZCBoYW5kbGVyLiAgUmVtb3ZpbmcgdGhlIHJlcXVlc3QgZnJvbQot
ICAgICAgICAvLyB0aGUgbGlzdCBvZiBiYWNrZ3JvdW5kIGRlY29kaW5nIHJlcXVlc3RzIHdpbGwg
ZW5zdXJlIHRoYXQgTG9hZGVyOjpudW1SZXF1ZXN0cygpIAotICAgICAgICAvLyBkb2VzIG5vdCBj
b3VudCB0aGlzIGJhY2tncm91bmQgcmVxdWVzdC4gIEZ1cnRoZXIgbnVtUmVxdWVzdHMoKSBjYW4K
LSAgICAgICAgLy8gYmUgY29ycmVjdGx5IHVzZWQgYnkgdGhlIHBhcnQgdG8gZGV0ZXJtaW5lIGlm
IGxvYWRpbmcgaXMgc3VmZmljaWVudGx5Ci0gICAgICAgIC8vIGNvbXBsZXRlIHRvIGRpc3BhdGNo
IHRoZSBwYWdlJ3Mgb25sb2FkIGhhbmRsZXIuCi0gICAgICAgIFJlcXVlc3QgKnIgPSBjYWNoZWRJ
bWFnZS0+bV9yZXF1ZXN0OwotICAgICAgICBEb2NMb2FkZXIgKmRsID0gci0+bV9kb2NMb2FkZXI7
Ci0KLSAgICAgICAga2h0bWw6OkNhY2hlOjpsb2FkZXIoKS0+cmVtb3ZlQmFja2dyb3VuZERlY29k
aW5nUmVxdWVzdChyKTsKLQotICAgICAgICAvLyBQb2tlIHRoZSBwYXJ0IHRvIGdldCBpdCB0byBk
byBhIGNoZWNrQ29tcGxldGVkKCkuICBPbmx5IGRvIHRoaXMgZm9yCi0gICAgICAgIC8vIHRoZSBm
aXJzdCB1cGRhdGUgdG8gbWluaW1pemUgd29yay4gIE5vdGUgdGhhdCB3ZSBhcmUgZ3VhcmFudGVl
ZCB0byBoYXZlCi0gICAgICAgIC8vIHJlYWQgdGhlIGhlYWRlciB3aGVuIHdlIHJlY2VpdmVkIHRo
aXMgZmlyc3QgdXBkYXRlLCB3aGljaCBpcyB0cmlnZ2VyZWQKLSAgICAgICAgLy8gYnkgdGhlIGZp
cnN0IGtDR0ltYWdlU3RhdHVzSW5jb21wbGV0ZSBzdGF0dXMgZnJvbSBDRy4ga0NHSW1hZ2VTdGF0
dXNJbmNvbXBsZXRlCi0gICAgICAgIC8vIHJlYWxseSBtZWFucyB0aGF0IHRoZSBDRyBkZWNvZGVy
IGlzIHdhaXRpbmcgZm9yIG1vcmUgZGF0YSwgYnV0IGhhcyBhbHJlYWR5Ci0gICAgICAgIC8vIHJl
YWQgdGhlIGhlYWRlci4KLSAgICAgICAgaWYgKCFoZWFkZXJSZWNlaXZlZCkgewotICAgICAgICAg
ICAgZW1pdCBraHRtbDo6Q2FjaGU6OmxvYWRlcigpLT5yZXF1ZXN0RG9uZSggZGwsIGNhY2hlZElt
YWdlICk7Ci0gICAgICAgICAgICBoZWFkZXJSZWNlaXZlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAg
ICB9Ci19Ci0KLXZvaWQgQ2FjaGVkSW1hZ2VDYWxsYmFjazo6bm90aWZ5RmluaXNoZWQoKQotewot
ICAgIGlmIChjYWNoZWRJbWFnZSkgewotICAgICAgICBjYWNoZWRJbWFnZS0+ZG9fbm90aWZ5IChj
YWNoZWRJbWFnZS0+cGl4bWFwKCksIGNhY2hlZEltYWdlLT5waXhtYXAoKS5yZWN0KCkpOyAKLSAg
ICAgICAgY2FjaGVkSW1hZ2UtPm1fbG9hZGluZyA9IGZhbHNlOwotICAgICAgICBjYWNoZWRJbWFn
ZS0+Y2hlY2tOb3RpZnkoKTsKLSAgICAgICAgUVNpemUgcyA9IGNhY2hlZEltYWdlLT5waXhtYXBf
c2l6ZSgpOwotICAgICAgICBjYWNoZWRJbWFnZS0+c2V0U2l6ZShzLndpZHRoKCkgKiBzLmhlaWdo
dCgpICogMik7Ci0JCi0gICAgICAgIFJlcXVlc3QgKnIgPSBjYWNoZWRJbWFnZS0+bV9yZXF1ZXN0
OwotICAgICAgICBEb2NMb2FkZXIgKmRsID0gci0+bV9kb2NMb2FkZXI7Ci0KLSAgICAgICAga2h0
bWw6OkNhY2hlOjpsb2FkZXIoKS0+cmVtb3ZlQmFja2dyb3VuZERlY29kaW5nUmVxdWVzdChyKTsK
LQotICAgICAgICAvLyBQb2tlIHRoZSBwYXJ0IHRvIGdldCBpdCB0byBkbyBhIGNoZWNrQ29tcGxl
dGVkKCkuCi0gICAgICAgIGVtaXQga2h0bWw6OkNhY2hlOjpsb2FkZXIoKS0+cmVxdWVzdERvbmUo
IGRsLCBjYWNoZWRJbWFnZSApOwotICAgICAgICAKLSAgICAgICAgZGVsZXRlIHI7Ci0gICAgfQot
fQotCi12b2lkIENhY2hlZEltYWdlQ2FsbGJhY2s6Om5vdGlmeURlY29kaW5nRXJyb3IoKQotewot
ICAgIGlmIChjYWNoZWRJbWFnZSkgewotICAgICAgICBoYW5kbGVFcnJvcigpOwotICAgIH0KLX0K
LQotdm9pZCBDYWNoZWRJbWFnZUNhbGxiYWNrOjpoYW5kbGVFcnJvcigpCi17Ci0gICAgaWYgKGNh
Y2hlZEltYWdlKSB7Ci0gICAgICAgIGNhY2hlZEltYWdlLT5lcnJvck9jY3VyZWQgPSB0cnVlOwot
ICAgICAgICBRUGl4bWFwIGVwID0gY2FjaGVkSW1hZ2UtPnBpeG1hcCgpOwotICAgICAgICBjYWNo
ZWRJbWFnZS0+ZG9fbm90aWZ5IChlcCwgZXAucmVjdCgpKTsKLSAgICAgICAgQ2FjaGU6OnJlbW92
ZUNhY2hlRW50cnkgKGNhY2hlZEltYWdlKTsKLQotICAgICAgICBjbGVhcigpOwotICAgIH0KLX0K
LQotdm9pZCBDYWNoZWRJbWFnZUNhbGxiYWNrOjpjbGVhcigpIAotewotICAgIGlmIChjYWNoZWRJ
bWFnZSAmJiBjYWNoZWRJbWFnZS0+bV9yZXF1ZXN0KSB7Ci0gICAgICAgIFJlcXVlc3QgKnIgPSBj
YWNoZWRJbWFnZS0+bV9yZXF1ZXN0OwotICAgICAgICBEb2NMb2FkZXIgKmRsID0gci0+bV9kb2NM
b2FkZXI7Ci0KLSAgICAgICAga2h0bWw6OkNhY2hlOjpsb2FkZXIoKS0+cmVtb3ZlQmFja2dyb3Vu
ZERlY29kaW5nUmVxdWVzdChyKTsKLQotICAgICAgICAvLyBQb2tlIHRoZSBwYXJ0IHRvIGdldCBp
dCB0byBkbyBhIGNoZWNrQ29tcGxldGVkKCkuCi0gICAgICAgIGVtaXQga2h0bWw6OkNhY2hlOjps
b2FkZXIoKS0+cmVxdWVzdEZhaWxlZCggZGwsIGNhY2hlZEltYWdlICk7Ci0KLSAgICAgICAgZGVs
ZXRlIHI7Ci0gICAgfQotICAgIGNhY2hlZEltYWdlID0gMDsKLX0KLQotQ2FjaGVkSW1hZ2U6OkNh
Y2hlZEltYWdlKERvY0xvYWRlciogZGwsIGNvbnN0IERPTVN0cmluZyAmdXJsLCBLSU86OkNhY2hl
Q29udHJvbCBfY2FjaGVQb2xpY3ksIHRpbWVfdCBfZXhwaXJlRGF0ZSkKLSAgICA6IFFPYmplY3Qo
KSwgQ2FjaGVkT2JqZWN0KHVybCwgSW1hZ2UsIF9jYWNoZVBvbGljeSwgX2V4cGlyZURhdGUpCi0g
ICAgLCBtX2RhdGFTaXplKDApCi17Ci0gICAgcCA9IDA7Ci0gICAgcGl4UGFydCA9IDA7Ci0gICAg
YmcgPSAwOwotICAgIGlzRnVsbHlUcmFuc3BhcmVudCA9IGZhbHNlOwotICAgIGVycm9yT2NjdXJl
ZCA9IGZhbHNlOwotICAgIG1vbm9jaHJvbWUgPSBmYWxzZTsKLSAgICBmb3JtYXRUeXBlID0gMDsK
LSAgICBtX3N0YXR1cyA9IFVua25vd247Ci0gICAgaW1nU291cmNlID0gMDsKLSAgICBtX2xvYWRp
bmcgPSB0cnVlOwotICAgIG1fc2hvd0FuaW1hdGlvbnMgPSBkbC0+c2hvd0FuaW1hdGlvbnMoKTsK
LSAgICBpZiAoUVBpeG1hcDo6c2hvdWxkVXNlVGhyZWFkZWREZWNvZGluZygpKQotICAgICAgICBt
X2RlY29kZXJDYWxsYmFjayA9IG5ldyBDYWNoZWRJbWFnZUNhbGxiYWNrKHRoaXMpOwotICAgIGVs
c2UKLSAgICAgICAgbV9kZWNvZGVyQ2FsbGJhY2sgPSAwOwotfQotCi1DYWNoZWRJbWFnZTo6fkNh
Y2hlZEltYWdlKCkKLXsKLSAgICBjbGVhcigpOwotfQotCi12b2lkIENhY2hlZEltYWdlOjpyZWYo
IENhY2hlZE9iamVjdENsaWVudCAqYyApCi17Ci0gICAgQ2FjaGVkT2JqZWN0OjpyZWYoYyk7Ci0K
LSAgICAvLyBmb3IgbW91c2VvdmVycywgZHluYW1pYyBjaGFuZ2VzCi0gICAgaWYgKCF2YWxpZF9y
ZWN0KCkuaXNOdWxsKCkpCi0gICAgICAgIGMtPnNldFBpeG1hcCggcGl4bWFwKCksIHZhbGlkX3Jl
Y3QoKSwgdGhpcyk7Ci0KLSAgICBpZighbV9sb2FkaW5nKQotICAgICAgICBjLT5ub3RpZnlGaW5p
c2hlZCh0aGlzKTsKLX0KLQotdm9pZCBDYWNoZWRJbWFnZTo6ZGVyZWYoIENhY2hlZE9iamVjdENs
aWVudCAqYyApCi17Ci0gICAgQ2FjaGU6OmZsdXNoKCk7Ci0gICAgQ2FjaGVkT2JqZWN0OjpkZXJl
ZihjKTsKLSAgICBpZiAoIGNhbkRlbGV0ZSgpICYmIG1fZnJlZSApCi0gICAgICAgIGRlbGV0ZSB0
aGlzOwotfQotCi1jb25zdCBRUGl4bWFwICZDYWNoZWRJbWFnZTo6dGlsZWRfcGl4bWFwKGNvbnN0
IFFDb2xvciYgbmV3YykKLXsKLSAgICByZXR1cm4gcGl4bWFwKCk7Ci19Ci0KLWNvbnN0IFFQaXht
YXAgJkNhY2hlZEltYWdlOjpwaXhtYXAoICkgY29uc3QKLXsKLSAgICBpZihlcnJvck9jY3VyZWQp
Ci0gICAgICAgIHJldHVybiAqQ2FjaGU6OmJyb2tlblBpeG1hcDsKLQotICAgIGlmIChwKQotICAg
ICAgICByZXR1cm4gKnA7Ci0KLSAgICByZXR1cm4gKkNhY2hlOjpudWxsUGl4bWFwOwotfQotCi1R
U2l6ZSBDYWNoZWRJbWFnZTo6cGl4bWFwX3NpemUoKSBjb25zdAotewotICAgIHJldHVybiAocCA/
IHAtPnNpemUoKSA6IFFTaXplKCkpOwotfQotCi1RUmVjdCBDYWNoZWRJbWFnZTo6dmFsaWRfcmVj
dCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIChwID8gcC0+cmVjdCgpIDogUVJlY3QoKSk7Ci19Ci0K
LXZvaWQgQ2FjaGVkSW1hZ2U6OmRvX25vdGlmeShjb25zdCBRUGl4bWFwJiBwLCBjb25zdCBRUmVj
dCYgcikKLXsKLSAgICBDYWNoZWRPYmplY3RDbGllbnRXYWxrZXIgdyhtX2NsaWVudHMpOwotICAg
IHdoaWxlIChDYWNoZWRPYmplY3RDbGllbnQgKmMgPSB3Lm5leHQoKSkKLSAgICAgICAgYy0+c2V0
UGl4bWFwKHAsIHIsIHRoaXMpOwotfQotCi12b2lkIENhY2hlZEltYWdlOjpzZXRTaG93QW5pbWF0
aW9ucyggS0hUTUxTZXR0aW5nczo6S0FuaW1hdGlvbkFkdmljZSBzaG93QW5pbWF0aW9ucyApCi17
Ci0gICAgbV9zaG93QW5pbWF0aW9ucyA9IHNob3dBbmltYXRpb25zOwotfQotCi12b2lkIENhY2hl
ZEltYWdlOjpjbGVhcigpCi17Ci0gICAgZGVsZXRlIHA7ICAgcCA9IDA7Ci0gICAgZGVsZXRlIGJn
OyAgYmcgPSAwOwotICAgIGRlbGV0ZSBwaXhQYXJ0OyBwaXhQYXJ0ID0gMDsKLQotICAgIGZvcm1h
dFR5cGUgPSAwOwotCi0gICAgc2V0U2l6ZSgwKTsKLQotICAgIC8vIE5vIG5lZWQgdG8gZGVsZXRl
IGltYWdlU291cmNlIC0gUU1vdmllIGRvZXMgaXQgZm9yIHVzCi0gICAgaW1nU291cmNlID0gMDsK
LQotICAgIGlmIChtX2RlY29kZXJDYWxsYmFjaykgewotICAgICAgICBtX2RlY29kZXJDYWxsYmFj
ay0+Y2xlYXIoKTsKLSAgICAgICAgbV9kZWNvZGVyQ2FsbGJhY2stPmRlcmVmKCk7Ci0gICAgICAg
IG1fZGVjb2RlckNhbGxiYWNrID0gMDsKLSAgICB9Ci19Ci0KLXZvaWQgQ2FjaGVkSW1hZ2U6OmRh
dGEgKCBRQnVmZmVyICZfYnVmZmVyLCBib29sIGVvZiApCi17Ci0jaWZkZWYgQ0FDSEVfREVCVUcK
LSAgICBrZERlYnVnKCA2MDYwICkgPDwgdGhpcyA8PCAiaW4gQ2FjaGVkSW1hZ2U6OmRhdGEoYnVm
ZmVyc2l6ZSAiIDw8IF9idWZmZXIuYnVmZmVyKCkuc2l6ZSgpIDw8IiwgZW9mPSIgPDwgZW9mIDw8
IGVuZGw7Ci0jZW5kaWYKLQotICAgIGJvb2wgY2FuRHJhdyA9IGZhbHNlOwotICAgIAotICAgIG1f
ZGF0YVNpemUgPSBfYnVmZmVyLnNpemUoKTsKLSAgICAgICAgCi0gICAgLy8gSWYgd2UncmUgYXQg
ZW9mIGFuZCBkb24ndCBoYXZlIGEgcGl4bWFwIHlldCwgdGhlIGRhdGEKLSAgICAvLyBtdXN0IGhh
dmUgYXJyaXZlZCBpbiBvbmUgY2h1bmsuICBUaGlzIGF2b2lkcyB0aGUgYXR0ZW1wdAotICAgIC8v
IHRvIHBlcmZvcm0gaW5jcmVtZW50YWwgZGVjb2RpbmcuCi0gICAgaWYgKGVvZiAmJiAhcCkgewot
ICAgICAgICBwID0gbmV3IFFQaXhtYXAoX2J1ZmZlci5idWZmZXIoKSwgS1dRUmVzcG9uc2VNSU1F
VHlwZShtX3Jlc3BvbnNlKSk7Ci0gICAgICAgIGlmIChtX2RlY29kZXJDYWxsYmFjaykKLSAgICAg
ICAgICAgIG1fZGVjb2RlckNhbGxiYWNrLT5ub3RpZnlGaW5pc2hlZCgpOwotICAgICAgICBjYW5E
cmF3ID0gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyBBbHdheXMgYXR0ZW1wdCB0byBs
b2FkIHRoZSBpbWFnZSBpbmNyZW1lbnRhbGx5LgotICAgICAgICBpZiAoIXApCi0gICAgICAgICAg
ICBwID0gbmV3IFFQaXhtYXAoS1dRUmVzcG9uc2VNSU1FVHlwZShtX3Jlc3BvbnNlKSk7Ci0gICAg
ICAgIGNhbkRyYXcgPSBwLT5yZWNlaXZlZERhdGEoX2J1ZmZlci5idWZmZXIoKSwgZW9mLCBtX2Rl
Y29kZXJDYWxsYmFjayk7Ci0gICAgfQotICAgIAotICAgIC8vIElmIHdlIGhhdmUgYSBkZWNvZGVy
LCB3ZSdsbCBiZSBub3RpZmllZCB3aGVuIGRlY29kaW5nIGhhcyBjb21wbGV0ZWQuCi0gICAgaWYg
KCFtX2RlY29kZXJDYWxsYmFjaykgewotICAgICAgICBpZiAoY2FuRHJhdyB8fCBlb2YpIHsKLSAg
ICAgICAgICAgIGlmIChwLT5pc051bGwoKSkgewotICAgICAgICAgICAgICAgIGVycm9yT2NjdXJl
ZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgUVBpeG1hcCBlcCA9IHBpeG1hcCgpOwotICAgICAg
ICAgICAgICAgIGRvX25vdGlmeSAoZXAsIGVwLnJlY3QoKSk7Ci0gICAgICAgICAgICAgICAgQ2Fj
aGU6OnJlbW92ZUNhY2hlRW50cnkgKHRoaXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAg
ZWxzZQotICAgICAgICAgICAgICAgIGRvX25vdGlmeSgqcCwgcC0+cmVjdCgpKTsKLQotICAgICAg
ICAgICAgUVNpemUgcyA9IHBpeG1hcF9zaXplKCk7Ci0gICAgICAgICAgICBzZXRTaXplKHMud2lk
dGgoKSAqIHMuaGVpZ2h0KCkgKiAyKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZW9mKSB7Ci0g
ICAgICAgICAgICBtX2xvYWRpbmcgPSBmYWxzZTsKLSAgICAgICAgICAgIGNoZWNrTm90aWZ5KCk7
Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgQ2FjaGVkSW1hZ2U6OmVycm9yKCBpbnQgLypl
cnIqLywgY29uc3QgY2hhciAqLyp0ZXh0Ki8gKQotewotI2lmZGVmIENBQ0hFX0RFQlVHCi0gICAg
a2REZWJ1Zyg2MDYwKSA8PCAiQ2FoY2VkSW1hZ2U6OmVycm9yIiA8PCBlbmRsOwotI2VuZGlmCi0K
LSAgICBjbGVhcigpOwotICAgIGVycm9yT2NjdXJlZCA9IHRydWU7Ci0gICAgZG9fbm90aWZ5KHBp
eG1hcCgpLCBRUmVjdCgwLCAwLCAxNiwgMTYpKTsKLSAgICBtX2xvYWRpbmcgPSBmYWxzZTsKLSAg
ICBjaGVja05vdGlmeSgpOwotfQotCi12b2lkIENhY2hlZEltYWdlOjpjaGVja05vdGlmeSgpCi17
Ci0gICAgaWYobV9sb2FkaW5nKSByZXR1cm47Ci0KLSAgICBDYWNoZWRPYmplY3RDbGllbnRXYWxr
ZXIgdyhtX2NsaWVudHMpOwotICAgIHdoaWxlIChDYWNoZWRPYmplY3RDbGllbnQgKmMgPSB3Lm5l
eHQoKSkgewotICAgICAgICBjLT5ub3RpZnlGaW5pc2hlZCh0aGlzKTsKLSAgICB9Ci19Ci0KLS8v
IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2lmZGVmIEtIVE1MX1hTTFQK
LQotQ2FjaGVkWFNMU3R5bGVTaGVldDo6Q2FjaGVkWFNMU3R5bGVTaGVldChEb2NMb2FkZXIqIGRs
LCBjb25zdCBET01TdHJpbmcgJnVybCwgS0lPOjpDYWNoZUNvbnRyb2wgX2NhY2hlUG9saWN5LCB0
aW1lX3QgX2V4cGlyZURhdGUpCi06IENhY2hlZE9iamVjdCh1cmwsIFhTTFN0eWxlU2hlZXQsIF9j
YWNoZVBvbGljeSwgX2V4cGlyZURhdGUpCi17Ci0gICAgLy8gSXQncyBYTUwgd2Ugd2FudC4KLSAg
ICAvLyBGSVhNRTogVGhpcyBzaG91bGQgYWNjZXB0IG1vcmUgZ2VuZXJhbCB4bWwgZm9ybWF0cyAq
LyoreG1sLCBpbWFnZS9zdmcreG1sIGZvciBleGFtcGxlLgotICAgIHNldEFjY2VwdCgidGV4dC94
bWwsIGFwcGxpY2F0aW9uL3htbCwgYXBwbGljYXRpb24veGh0bWwreG1sLCB0ZXh0L3hzbCwgYXBw
bGljYXRpb24vcnNzK3htbCwgYXBwbGljYXRpb24vYXRvbSt4bWwiKTsKLSAgICAKLSAgICAvLyBs
b2FkIHRoZSBmaWxlCi0gICAgQ2FjaGU6OmxvYWRlcigpLT5sb2FkKGRsLCB0aGlzLCBmYWxzZSk7
Ci0gICAgbV9sb2FkaW5nID0gdHJ1ZTsKLSAgICBtX2RlY29kZXIgPSBuZXcgRGVjb2RlcjsKLX0K
LQotdm9pZCBDYWNoZWRYU0xTdHlsZVNoZWV0OjpyZWYoQ2FjaGVkT2JqZWN0Q2xpZW50ICpjKQot
ewotICAgIENhY2hlZE9iamVjdDo6cmVmKGMpOwotICAgIAotICAgIGlmICghbV9sb2FkaW5nKQot
ICAgICAgICBjLT5zZXRTdHlsZVNoZWV0KG1fdXJsLCBtX3NoZWV0KTsKLX0KLQotdm9pZCBDYWNo
ZWRYU0xTdHlsZVNoZWV0OjpkZXJlZihDYWNoZWRPYmplY3RDbGllbnQgKmMpCi17Ci0gICAgQ2Fj
aGU6OmZsdXNoKCk7Ci0gICAgQ2FjaGVkT2JqZWN0OjpkZXJlZihjKTsKLSAgICBpZiAoY2FuRGVs
ZXRlKCkgJiYgbV9mcmVlKQotICAgICAgICBkZWxldGUgdGhpczsKLX0KLQotdm9pZCBDYWNoZWRY
U0xTdHlsZVNoZWV0OjpzZXRDaGFyc2V0KCBjb25zdCBRU3RyaW5nICZjaHMgKQotewotICAgIGlm
ICghY2hzLmlzRW1wdHkoKSkKLSAgICAgICAgbV9kZWNvZGVyLT5zZXRFbmNvZGluZyhjaHMubGF0
aW4xKCksIERlY29kZXI6OkVuY29kaW5nRnJvbUhUVFBIZWFkZXIpOwotfQotCi12b2lkIENhY2hl
ZFhTTFN0eWxlU2hlZXQ6OmRhdGEoUUJ1ZmZlciAmYnVmZmVyLCBib29sIGVvZikKLXsKLSAgICBp
ZighZW9mKSByZXR1cm47Ci0gICAgYnVmZmVyLmNsb3NlKCk7Ci0gICAgc2V0U2l6ZShidWZmZXIu
YnVmZmVyKCkuc2l6ZSgpKTsKLSAgICBRU3RyaW5nIGRhdGEgPSBtX2RlY29kZXItPmRlY29kZShi
dWZmZXIuYnVmZmVyKCkuZGF0YSgpLCBzaXplKCkpOwotICAgIG1fc2hlZXQgPSBET01TdHJpbmco
ZGF0YSk7Ci0gICAgbV9sb2FkaW5nID0gZmFsc2U7Ci0gICAgCi0gICAgY2hlY2tOb3RpZnkoKTsK
LX0KLQotdm9pZCBDYWNoZWRYU0xTdHlsZVNoZWV0OjpjaGVja05vdGlmeSgpCi17Ci0gICAgaWYg
KG1fbG9hZGluZykKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIENhY2hlZE9iamVjdENsaWVu
dFdhbGtlciB3KG1fY2xpZW50cyk7Ci0gICAgd2hpbGUgKENhY2hlZE9iamVjdENsaWVudCAqYyA9
IHcubmV4dCgpKQotICAgICAgICBjLT5zZXRTdHlsZVNoZWV0KG1fdXJsLCBtX3NoZWV0KTsKLX0K
LQotCi12b2lkIENhY2hlZFhTTFN0eWxlU2hlZXQ6OmVycm9yKCBpbnQgLyplcnIqLywgY29uc3Qg
Y2hhciAqLyp0ZXh0Ki8gKQotewotICAgIG1fbG9hZGluZyA9IGZhbHNlOwotICAgIGNoZWNrTm90
aWZ5KCk7Ci19Ci0KLSNlbmRpZgotCi0jaWZuZGVmIEtIVE1MX05PX1hCTAotQ2FjaGVkWEJMRG9j
dW1lbnQ6OkNhY2hlZFhCTERvY3VtZW50KERvY0xvYWRlciogZGwsIGNvbnN0IERPTVN0cmluZyAm
dXJsLCBLSU86OkNhY2hlQ29udHJvbCBfY2FjaGVQb2xpY3ksIHRpbWVfdCBfZXhwaXJlRGF0ZSkK
LTogQ2FjaGVkT2JqZWN0KHVybCwgWEJMLCBfY2FjaGVQb2xpY3ksIF9leHBpcmVEYXRlKSwgbV9k
b2N1bWVudCgwKQotewotICAgIC8vIEl0J3MgWE1MIHdlIHdhbnQuCi0gICAgc2V0QWNjZXB0KCJ0
ZXh0L3htbCwgYXBwbGljYXRpb24veG1sLCBhcHBsaWNhdGlvbi94aHRtbCt4bWwsIHRleHQveHNs
LCBhcHBsaWNhdGlvbi9yc3MreG1sLCBhcHBsaWNhdGlvbi9hdG9tK3htbCIpOwotICAgIAotICAg
IC8vIExvYWQgdGhlIGZpbGUKLSAgICBDYWNoZTo6bG9hZGVyKCktPmxvYWQoZGwsIHRoaXMsIGZh
bHNlKTsKLSAgICBtX2xvYWRpbmcgPSB0cnVlOwotICAgIG1fZGVjb2RlciA9IG5ldyBEZWNvZGVy
OwotfQotCi1DYWNoZWRYQkxEb2N1bWVudDo6fkNhY2hlZFhCTERvY3VtZW50KCkKLXsKLSAgICBp
ZiAobV9kb2N1bWVudCkKLSAgICAgICAgbV9kb2N1bWVudC0+ZGVyZWYoKTsKLX0KLQotdm9pZCBD
YWNoZWRYQkxEb2N1bWVudDo6cmVmKENhY2hlZE9iamVjdENsaWVudCAqYykKLXsKLSAgICBDYWNo
ZWRPYmplY3Q6OnJlZihjKTsKLSAgICBpZiAoIW1fbG9hZGluZykKLSAgICAgICAgYy0+c2V0WEJM
RG9jdW1lbnQobV91cmwsIG1fZG9jdW1lbnQpOwotfQotCi12b2lkIENhY2hlZFhCTERvY3VtZW50
OjpkZXJlZihDYWNoZWRPYmplY3RDbGllbnQgKmMpCi17Ci0gICAgQ2FjaGU6OmZsdXNoKCk7Ci0g
ICAgQ2FjaGVkT2JqZWN0OjpkZXJlZihjKTsKLSAgICBpZiAoY2FuRGVsZXRlKCkgJiYgbV9mcmVl
KQotICAgICAgICBkZWxldGUgdGhpczsKLX0KLQotdm9pZCBDYWNoZWRYQkxEb2N1bWVudDo6c2V0
Q2hhcnNldCggY29uc3QgUVN0cmluZyAmY2hzICkKLXsKLSAgICBpZiAoIWNocy5pc0VtcHR5KCkp
Ci0gICAgICAgIG1fZGVjb2Rlci0+c2V0RW5jb2RpbmcoY2hzLmxhdGluMSgpLCBEZWNvZGVyOjpF
bmNvZGluZ0Zyb21IVFRQSGVhZGVyKTsKLX0KLQotdm9pZCBDYWNoZWRYQkxEb2N1bWVudDo6ZGF0
YSggUUJ1ZmZlciAmYnVmZmVyLCBib29sIGVvZiApCi17Ci0gICAgaWYgKCFlb2YpIHJldHVybjsK
LSAgICAKLSAgICBhc3NlcnQoIW1fZG9jdW1lbnQpOwotICAgIAotICAgIG1fZG9jdW1lbnQgPSAg
bmV3IFhCTDo6WEJMRG9jdW1lbnRJbXBsKCk7Ci0gICAgbV9kb2N1bWVudC0+cmVmKCk7Ci0gICAg
bV9kb2N1bWVudC0+b3BlbigpOwotICAgIAotICAgIFFTdHJpbmcgZGF0YSA9IG1fZGVjb2Rlci0+
ZGVjb2RlKGJ1ZmZlci5idWZmZXIoKS5kYXRhKCksIGJ1ZmZlci5idWZmZXIoKS5zaXplKCkpOwot
ICAgIG1fZG9jdW1lbnQtPndyaXRlKGRhdGEpOwotICAgIHNldFNpemUoYnVmZmVyLmJ1ZmZlcigp
LnNpemUoKSk7Ci0gICAgYnVmZmVyLmNsb3NlKCk7Ci0gICAgCi0gICAgbV9kb2N1bWVudC0+Zmlu
aXNoUGFyc2luZygpOwotICAgIG1fZG9jdW1lbnQtPmNsb3NlKCk7Ci0gICAgbV9sb2FkaW5nID0g
ZmFsc2U7Ci0gICAgY2hlY2tOb3RpZnkoKTsKLX0KLQotdm9pZCBDYWNoZWRYQkxEb2N1bWVudDo6
Y2hlY2tOb3RpZnkoKQotewotICAgIGlmKG1fbG9hZGluZykKLSAgICAgICAgcmV0dXJuOwotICAg
IAotICAgIENhY2hlZE9iamVjdENsaWVudFdhbGtlciB3KG1fY2xpZW50cyk7Ci0gICAgd2hpbGUg
KENhY2hlZE9iamVjdENsaWVudCAqYyA9IHcubmV4dCgpKQotICAgICAgICBjLT5zZXRYQkxEb2N1
bWVudChtX3VybCwgbV9kb2N1bWVudCk7Ci19Ci0KLQotdm9pZCBDYWNoZWRYQkxEb2N1bWVudDo6
ZXJyb3IoIGludCAvKmVyciovLCBjb25zdCBjaGFyICovKnRleHQqLyApCi17Ci0gICAgbV9sb2Fk
aW5nID0gZmFsc2U7Ci0gICAgY2hlY2tOb3RpZnkoKTsKLX0KLSNlbmRpZgotCi0vLyAtLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotUmVxdWVzdDo6UmVxdWVzdChEb2NMb2FkZXIq
IGRsLCBDYWNoZWRPYmplY3QgKl9vYmplY3QsIGJvb2wgX2luY3JlbWVudGFsKQotewotICAgIG9i
amVjdCA9IF9vYmplY3Q7Ci0gICAgb2JqZWN0LT5zZXRSZXF1ZXN0KHRoaXMpOwotICAgIGluY3Jl
bWVudGFsID0gX2luY3JlbWVudGFsOwotICAgIG1fZG9jTG9hZGVyID0gZGw7Ci0gICAgbXVsdGlw
YXJ0ID0gZmFsc2U7Ci19Ci0KLVJlcXVlc3Q6On5SZXF1ZXN0KCkKLXsKLSAgICBvYmplY3QtPnNl
dFJlcXVlc3QoMCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQot
Ci1Eb2NMb2FkZXI6OkRvY0xvYWRlcihLSFRNTFBhcnQqIHBhcnQsIERvY3VtZW50SW1wbCogZG9j
KQotewotICAgIG1fY2FjaGVQb2xpY3kgPSBLSU86OkNDX1ZlcmlmeTsKLSAgICBtX2V4cGlyZURh
dGUgPSAwOwotICAgIG1fYmF1dG9sb2FkSW1hZ2VzID0gdHJ1ZTsKLSAgICBtX3Nob3dBbmltYXRp
b25zID0gS0hUTUxTZXR0aW5nczo6S0FuaW1hdGlvbkVuYWJsZWQ7Ci0gICAgbV9wYXJ0ID0gcGFy
dDsKLSAgICBtX2RvYyA9IGRvYzsKLSAgICBtX2xvYWRJblByb2dyZXNzID0gZmFsc2U7Ci0KLSAg
ICBDYWNoZTo6aW5pdCgpOwotICAgIENhY2hlOjpkb2Nsb2FkZXItPmFwcGVuZCggdGhpcyApOwot
fQotCi1Eb2NMb2FkZXI6On5Eb2NMb2FkZXIoKQotewotICAgIENhY2hlOjpkb2Nsb2FkZXItPnJl
bW92ZSggdGhpcyApOwotfQotCi12b2lkIERvY0xvYWRlcjo6c2V0RXhwaXJlRGF0ZSh0aW1lX3Qg
X2V4cGlyZURhdGUpCi17Ci0gICAgbV9leHBpcmVEYXRlID0gX2V4cGlyZURhdGU7Ci19Ci0KLWJv
b2wgRG9jTG9hZGVyOjpuZWVkUmVsb2FkKGNvbnN0IEtVUkwgJmZ1bGxVUkwpCi17Ci0gICAgYm9v
bCByZWxvYWQgPSBmYWxzZTsKLSAgICBpZiAobV9jYWNoZVBvbGljeSA9PSBLSU86OkNDX1Zlcmlm
eSkKLSAgICB7Ci0gICAgICAgaWYgKCFtX3JlbG9hZGVkVVJMcy5jb250YWlucyhmdWxsVVJMLnVy
bCgpKSkKLSAgICAgICB7Ci0gICAgICAgICAgQ2FjaGVkT2JqZWN0ICpleGlzdGluZyA9IENhY2hl
OjpjYWNoZS0+ZmluZChmdWxsVVJMLnVybCgpKTsKLSAgICAgICAgICBpZiAoZXhpc3RpbmcgJiYg
ZXhpc3RpbmctPmlzRXhwaXJlZCgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgICBDYWNoZTo6
cmVtb3ZlQ2FjaGVFbnRyeShleGlzdGluZyk7Ci0gICAgICAgICAgICAgbV9yZWxvYWRlZFVSTHMu
YXBwZW5kKGZ1bGxVUkwudXJsKCkpOwotICAgICAgICAgICAgIHJlbG9hZCA9IHRydWU7Ci0gICAg
ICAgICAgfQotICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoKG1fY2FjaGVQb2xpY3kgPT0g
S0lPOjpDQ19SZWxvYWQpIHx8IChtX2NhY2hlUG9saWN5ID09IEtJTzo6Q0NfUmVmcmVzaCkpCi0g
ICAgewotICAgICAgIGlmICghbV9yZWxvYWRlZFVSTHMuY29udGFpbnMoZnVsbFVSTC51cmwoKSkp
Ci0gICAgICAgewotICAgICAgICAgIENhY2hlZE9iamVjdCAqZXhpc3RpbmcgPSBDYWNoZTo6Y2Fj
aGUtPmZpbmQoZnVsbFVSTC51cmwoKSk7Ci0gICAgICAgICAgaWYgKGV4aXN0aW5nKQotICAgICAg
ICAgIHsKLSAgICAgICAgICAgICBDYWNoZTo6cmVtb3ZlQ2FjaGVFbnRyeShleGlzdGluZyk7Ci0g
ICAgICAgICAgfQotICAgICAgICAgIG1fcmVsb2FkZWRVUkxzLmFwcGVuZChmdWxsVVJMLnVybCgp
KTsKLSAgICAgICAgICByZWxvYWQgPSB0cnVlOwotICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJu
IHJlbG9hZDsKLX0KLQotQ2FjaGVkSW1hZ2UgKkRvY0xvYWRlcjo6cmVxdWVzdEltYWdlKCBjb25z
dCBET006OkRPTVN0cmluZyAmdXJsKQotewotICAgIEtVUkwgZnVsbFVSTCA9IG1fZG9jLT5jb21w
bGV0ZVVSTCh1cmwucXN0cmluZygpKTsKLSAgICBpZiAoIG1fcGFydCAmJiBtX3BhcnQtPm9ubHlM
b2NhbFJlZmVyZW5jZXMoKSAmJiBmdWxsVVJMLnByb3RvY29sKCkgIT0gImZpbGUiKSByZXR1cm4g
MDsKLQotICAgIGlmIChLV1FDaGVja0lmUmVsb2FkaW5nKHRoaXMpKSB7Ci0gICAgICAgIHNldENh
Y2hlUG9saWN5KEtJTzo6Q0NfUmVsb2FkKTsKLSAgICB9Ci0KLSAgICBib29sIHJlbG9hZCA9IG5l
ZWRSZWxvYWQoZnVsbFVSTCk7Ci0KLSAgICBDYWNoZWRJbWFnZSAqY2FjaGVkT2JqZWN0ID0gQ2Fj
aGU6OnJlcXVlc3RJbWFnZSh0aGlzLCBmdWxsVVJMLCByZWxvYWQsIG1fZXhwaXJlRGF0ZSk7Ci0g
ICAgS1dRQ2hlY2tDYWNoZU9iamVjdFN0YXR1cyh0aGlzLCBjYWNoZWRPYmplY3QpOwotICAgIHJl
dHVybiBjYWNoZWRPYmplY3Q7Ci19Ci0KLUNhY2hlZENTU1N0eWxlU2hlZXQgKkRvY0xvYWRlcjo6
cmVxdWVzdFN0eWxlU2hlZXQoIGNvbnN0IERPTTo6RE9NU3RyaW5nICZ1cmwsIGNvbnN0IFFTdHJp
bmcmIGNoYXJzZXQpCi17Ci0gICAgS1VSTCBmdWxsVVJMID0gbV9kb2MtPmNvbXBsZXRlVVJMKHVy
bC5xc3RyaW5nKCkpOwotICAgIGlmICggbV9wYXJ0ICYmIG1fcGFydC0+b25seUxvY2FsUmVmZXJl
bmNlcygpICYmIGZ1bGxVUkwucHJvdG9jb2woKSAhPSAiZmlsZSIpIHJldHVybiAwOwotCi0gICAg
aWYgKEtXUUNoZWNrSWZSZWxvYWRpbmcodGhpcykpIHsKLSAgICAgICAgc2V0Q2FjaGVQb2xpY3ko
S0lPOjpDQ19SZWxvYWQpOwotICAgIH0KLQotICAgIGJvb2wgcmVsb2FkID0gbmVlZFJlbG9hZChm
dWxsVVJMKTsKLQotICAgIENhY2hlZENTU1N0eWxlU2hlZXQgKmNhY2hlZE9iamVjdCA9IENhY2hl
OjpyZXF1ZXN0U3R5bGVTaGVldCh0aGlzLCB1cmwsIHJlbG9hZCwgbV9leHBpcmVEYXRlLCBjaGFy
c2V0KTsKLSAgICBLV1FDaGVja0NhY2hlT2JqZWN0U3RhdHVzKHRoaXMsIGNhY2hlZE9iamVjdCk7
Ci0gICAgcmV0dXJuIGNhY2hlZE9iamVjdDsKLX0KLQotQ2FjaGVkU2NyaXB0ICpEb2NMb2FkZXI6
OnJlcXVlc3RTY3JpcHQoIGNvbnN0IERPTTo6RE9NU3RyaW5nICZ1cmwsIGNvbnN0IFFTdHJpbmcm
IGNoYXJzZXQpCi17Ci0gICAgS1VSTCBmdWxsVVJMID0gbV9kb2MtPmNvbXBsZXRlVVJMKHVybC5x
c3RyaW5nKCkpOwotICAgIGlmICggbV9wYXJ0ICYmIG1fcGFydC0+b25seUxvY2FsUmVmZXJlbmNl
cygpICYmIGZ1bGxVUkwucHJvdG9jb2woKSAhPSAiZmlsZSIpIHJldHVybiAwOwotCi0gICAgaWYg
KEtXUUNoZWNrSWZSZWxvYWRpbmcodGhpcykpIHsKLSAgICAgICAgc2V0Q2FjaGVQb2xpY3koS0lP
OjpDQ19SZWxvYWQpOwotICAgIH0KLQotICAgIGJvb2wgcmVsb2FkID0gbmVlZFJlbG9hZChmdWxs
VVJMKTsKLQotICAgIENhY2hlZFNjcmlwdCAqY2FjaGVkT2JqZWN0ID0gQ2FjaGU6OnJlcXVlc3RT
Y3JpcHQodGhpcywgdXJsLCByZWxvYWQsIG1fZXhwaXJlRGF0ZSwgY2hhcnNldCk7Ci0gICAgS1dR
Q2hlY2tDYWNoZU9iamVjdFN0YXR1cyh0aGlzLCBjYWNoZWRPYmplY3QpOwotICAgIHJldHVybiBj
YWNoZWRPYmplY3Q7Ci19Ci0KLSNpZmRlZiBLSFRNTF9YU0xUCi1DYWNoZWRYU0xTdHlsZVNoZWV0
KiBEb2NMb2FkZXI6OnJlcXVlc3RYU0xTdHlsZVNoZWV0KGNvbnN0IERPTTo6RE9NU3RyaW5nICZ1
cmwpCi17Ci0gICAgS1VSTCBmdWxsVVJMID0gbV9kb2MtPmNvbXBsZXRlVVJMKHVybC5xc3RyaW5n
KCkpOwotICAgIAotICAgIGlmIChtX3BhcnQgJiYgbV9wYXJ0LT5vbmx5TG9jYWxSZWZlcmVuY2Vz
KCkgJiYgZnVsbFVSTC5wcm90b2NvbCgpICE9ICJmaWxlIikgcmV0dXJuIDA7Ci0gICAgCi0gICAg
aWYgKEtXUUNoZWNrSWZSZWxvYWRpbmcodGhpcykpCi0gICAgICAgIHNldENhY2hlUG9saWN5KEtJ
Tzo6Q0NfUmVsb2FkKTsKLSAgICAKLSAgICBib29sIHJlbG9hZCA9IG5lZWRSZWxvYWQoZnVsbFVS
TCk7Ci0gICAgCi0gICAgQ2FjaGVkWFNMU3R5bGVTaGVldCAqY2FjaGVkT2JqZWN0ID0gQ2FjaGU6
OnJlcXVlc3RYU0xTdHlsZVNoZWV0KHRoaXMsIHVybCwgcmVsb2FkLCBtX2V4cGlyZURhdGUpOwot
ICAgIEtXUUNoZWNrQ2FjaGVPYmplY3RTdGF0dXModGhpcywgY2FjaGVkT2JqZWN0KTsKLSAgICBy
ZXR1cm4gY2FjaGVkT2JqZWN0OwotfQotI2VuZGlmCi0KLSNpZm5kZWYgS0hUTUxfTk9fWEJMCi1D
YWNoZWRYQkxEb2N1bWVudCogRG9jTG9hZGVyOjpyZXF1ZXN0WEJMRG9jdW1lbnQoY29uc3QgRE9N
OjpET01TdHJpbmcgJnVybCkKLXsKLSAgICBLVVJMIGZ1bGxVUkwgPSBtX2RvYy0+Y29tcGxldGVV
UkwodXJsLnFzdHJpbmcoKSk7Ci0gICAgCi0gICAgLy8gRklYTUU6IElzIHRoaXMgcmlnaHQgZm9y
IFhCTD8KLSAgICBpZiAobV9wYXJ0ICYmIG1fcGFydC0+b25seUxvY2FsUmVmZXJlbmNlcygpICYm
IGZ1bGxVUkwucHJvdG9jb2woKSAhPSAiZmlsZSIpIHJldHVybiAwOwotICAgIAotICAgIGlmIChL
V1FDaGVja0lmUmVsb2FkaW5nKHRoaXMpKSB7Ci0gICAgICAgIHNldENhY2hlUG9saWN5KEtJTzo6
Q0NfUmVsb2FkKTsKLSAgICB9Ci0gICAgCi0gICAgYm9vbCByZWxvYWQgPSBuZWVkUmVsb2FkKGZ1
bGxVUkwpOwotICAgIAotICAgIENhY2hlZFhCTERvY3VtZW50ICpjYWNoZWRPYmplY3QgPSBDYWNo
ZTo6cmVxdWVzdFhCTERvY3VtZW50KHRoaXMsIHVybCwgcmVsb2FkLCBtX2V4cGlyZURhdGUpOwot
ICAgIEtXUUNoZWNrQ2FjaGVPYmplY3RTdGF0dXModGhpcywgY2FjaGVkT2JqZWN0KTsKLSAgICBy
ZXR1cm4gY2FjaGVkT2JqZWN0OwotfQotI2VuZGlmCi0KLXZvaWQgRG9jTG9hZGVyOjpzZXRBdXRv
bG9hZEltYWdlcyggYm9vbCBlbmFibGUgKQotewotICAgIGlmICggZW5hYmxlID09IG1fYmF1dG9s
b2FkSW1hZ2VzICkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV9iYXV0b2xvYWRJbWFnZXMgPSBl
bmFibGU7Ci0KLSAgICBpZiAoICFtX2JhdXRvbG9hZEltYWdlcyApIHJldHVybjsKLQotICAgIGZv
ciAoIGNvbnN0IENhY2hlZE9iamVjdCogY289bV9kb2NPYmplY3RzLmZpcnN0KCk7IGNvOyBjbz1t
X2RvY09iamVjdHMubmV4dCgpICkKLSAgICAgICAgaWYgKCBjby0+dHlwZSgpID09IENhY2hlZE9i
amVjdDo6SW1hZ2UgKQotICAgICAgICB7Ci0gICAgICAgICAgICBDYWNoZWRJbWFnZSAqaW1nID0g
Y29uc3RfY2FzdDxDYWNoZWRJbWFnZSo+KCBzdGF0aWNfY2FzdDxjb25zdCBDYWNoZWRJbWFnZSAq
PiggY28gKSApOwotCi0gICAgICAgICAgICBDYWNoZWRPYmplY3Q6OlN0YXR1cyBzdGF0dXMgPSBp
bWctPnN0YXR1cygpOwotICAgICAgICAgICAgaWYgKCBzdGF0dXMgIT0gQ2FjaGVkT2JqZWN0OjpV
bmtub3duICkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgQ2FjaGU6
OmxvYWRlcigpLT5sb2FkKHRoaXMsIGltZywgdHJ1ZSk7Ci0gICAgICAgIH0KLX0KLQotdm9pZCBE
b2NMb2FkZXI6OnNldENhY2hlUG9saWN5KCBLSU86OkNhY2hlQ29udHJvbCBjYWNoZVBvbGljeSAp
Ci17Ci0gICAgbV9jYWNoZVBvbGljeSA9IGNhY2hlUG9saWN5OwotfQotCi12b2lkIERvY0xvYWRl
cjo6c2V0U2hvd0FuaW1hdGlvbnMoIEtIVE1MU2V0dGluZ3M6OktBbmltYXRpb25BZHZpY2Ugc2hv
d0FuaW1hdGlvbnMgKQotewotICAgIGlmICggc2hvd0FuaW1hdGlvbnMgPT0gbV9zaG93QW5pbWF0
aW9ucyApIHJldHVybjsKLSAgICBtX3Nob3dBbmltYXRpb25zID0gc2hvd0FuaW1hdGlvbnM7Ci0K
LSAgICBjb25zdCBDYWNoZWRPYmplY3QqIGNvOwotICAgIGZvciAoIGNvPW1fZG9jT2JqZWN0cy5m
aXJzdCgpOyBjbzsgY289bV9kb2NPYmplY3RzLm5leHQoKSApCi0gICAgICAgIGlmICggY28tPnR5
cGUoKSA9PSBDYWNoZWRPYmplY3Q6OkltYWdlICkKLSAgICAgICAgewotICAgICAgICAgICAgQ2Fj
aGVkSW1hZ2UgKmltZyA9IGNvbnN0X2Nhc3Q8Q2FjaGVkSW1hZ2UqPiggc3RhdGljX2Nhc3Q8Y29u
c3QgQ2FjaGVkSW1hZ2UgKj4oIGNvICkgKTsKLQotICAgICAgICAgICAgaW1nLT5zZXRTaG93QW5p
bWF0aW9ucyggc2hvd0FuaW1hdGlvbnMgKTsKLSAgICAgICAgfQotfQotCi12b2lkIERvY0xvYWRl
cjo6cmVtb3ZlQ2FjaGVkT2JqZWN0KCBDYWNoZWRPYmplY3QqIG8gKSBjb25zdAotewotICAgIG1f
ZG9jT2JqZWN0cy5yZW1vdmVSZWYoIG8gKTsKLX0KLQotdm9pZCBEb2NMb2FkZXI6OnNldExvYWRJ
blByb2dyZXNzKGJvb2wgbG9hZCkKLXsKLSAgICBtX2xvYWRJblByb2dyZXNzID0gbG9hZDsKLX0K
LQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUxvYWRlcjo6TG9hZGVy
KCkgOiBRT2JqZWN0KCkKLXsKLSAgICBtX3JlcXVlc3RzUGVuZGluZy5zZXRBdXRvRGVsZXRlKCB0
cnVlICk7Ci0gICAgbV9yZXF1ZXN0c0xvYWRpbmcuc2V0QXV0b0RlbGV0ZSggdHJ1ZSApOwotICAg
IGt3cSA9IG5ldyBLV1FMb2FkZXIodGhpcyk7Ci19Ci0KLUxvYWRlcjo6fkxvYWRlcigpCi17Ci0g
ICAgZGVsZXRlIGt3cTsKLX0KLQotdm9pZCBMb2FkZXI6OmxvYWQoRG9jTG9hZGVyKiBkbCwgQ2Fj
aGVkT2JqZWN0ICpvYmplY3QsIGJvb2wgaW5jcmVtZW50YWwpCi17Ci0gICAgUmVxdWVzdCAqcmVx
ID0gbmV3IFJlcXVlc3QoZGwsIG9iamVjdCwgaW5jcmVtZW50YWwpOwotICAgIG1fcmVxdWVzdHNQ
ZW5kaW5nLmFwcGVuZChyZXEpOwotCi0gICAgZW1pdCByZXF1ZXN0U3RhcnRlZCggcmVxLT5tX2Rv
Y0xvYWRlciwgcmVxLT5vYmplY3QgKTsKLQotICAgIHNlcnZlUGVuZGluZ1JlcXVlc3RzKCk7Ci19
Ci0KLXZvaWQgTG9hZGVyOjpzZXJ2ZVBlbmRpbmdSZXF1ZXN0cygpCi17Ci0gIGlmICggbV9yZXF1
ZXN0c1BlbmRpbmcuY291bnQoKSA9PSAwICkKLSAgICAgIHJldHVybjsKLQotICAvLyBnZXQgdGhl
IGZpcnN0IHBlbmRpbmcgcmVxdWVzdAotICBSZXF1ZXN0ICpyZXEgPSBtX3JlcXVlc3RzUGVuZGlu
Zy50YWtlKDApOwotCi0gIEtVUkwgdShyZXEtPm9iamVjdC0+dXJsKCkucXN0cmluZygpKTsKLSAg
S0lPOjpUcmFuc2ZlckpvYiogam9iID0gS0lPOjpnZXQoIHUsIGZhbHNlLCBmYWxzZSAvKm5vIEdV
SSovLCB0cnVlKTsKLSAgCi0gIGpvYi0+YWRkTWV0YURhdGEoImNhY2hlIiwgZ2V0Q2FjaGVDb250
cm9sU3RyaW5nKHJlcS0+b2JqZWN0LT5jYWNoZVBvbGljeSgpKSk7Ci0gIGlmICghcmVxLT5vYmpl
Y3QtPmFjY2VwdCgpLmlzRW1wdHkoKSkKLSAgICAgIGpvYi0+YWRkTWV0YURhdGEoImFjY2VwdCIs
IHJlcS0+b2JqZWN0LT5hY2NlcHQoKSk7Ci0gIGlmICggcmVxLT5tX2RvY0xvYWRlciApICB7Ci0g
ICAgICBLVVJMIHIgPSByZXEtPm1fZG9jTG9hZGVyLT5kb2MoKS0+VVJMKCk7Ci0gICAgICBpZiAo
IHIucHJvdG9jb2woKS5zdGFydHNXaXRoKCAiaHR0cCIgKSAmJiByLnBhdGgoKS5pc0VtcHR5KCkg
KQotICAgICAgICAgIHIuc2V0UGF0aCggIi8iICk7Ci0KLSAgICAgIGpvYi0+YWRkTWV0YURhdGEo
InJlZmVycmVyIiwgci51cmwoKSk7Ci0gICAgICBRU3RyaW5nIGRvbWFpbiA9IHIuaG9zdCgpOwot
ICAgICAgaWYgKHJlcS0+bV9kb2NMb2FkZXItPmRvYygpLT5pc0hUTUxEb2N1bWVudCgpKQotICAg
ICAgICAgZG9tYWluID0gc3RhdGljX2Nhc3Q8SFRNTERvY3VtZW50SW1wbCo+KHJlcS0+bV9kb2NM
b2FkZXItPmRvYygpKS0+ZG9tYWluKCkucXN0cmluZygpOwotICAgICAgaWYgKGNyb3NzRG9tYWlu
KHUuaG9zdCgpLCBkb21haW4pKQotICAgICAgICAgam9iLT5hZGRNZXRhRGF0YSgiY3Jvc3MtZG9t
YWluIiwgInRydWUiKTsKLSAgfQotCi0gIGNvbm5lY3QoIGpvYiwgU0lHTkFMKCByZXN1bHQoIEtJ
Tzo6Sm9iICosIE5TRGF0YSAqKSApLCB0aGlzLCBTTE9UKCBzbG90RmluaXNoZWQoIEtJTzo6Sm9i
ICosIE5TRGF0YSAqKSApICk7Ci0gIAotICBjb25uZWN0KCBqb2IsIFNJR05BTCggZGF0YSggS0lP
OjpKb2IqLCBjb25zdCBjaGFyICosIGludCkpLAotICAgICAgICAgICBTTE9UKCBzbG90RGF0YSgg
S0lPOjpKb2IqLCBjb25zdCBjaGFyICosIGludCkpKTsKLSAgY29ubmVjdCggam9iLCBTSUdOQUwo
IHJlY2VpdmVkUmVzcG9uc2UoIEtJTzo6Sm9iICosIE5TVVJMUmVzcG9uc2UgKikpLCBTTE9UKCBz
bG90UmVjZWl2ZWRSZXNwb25zZSggS0lPOjpKb2IgKiwgTlNVUkxSZXNwb25zZSAqKSkgKTsKLQot
ICBpZiAoS1dRU2VydmVSZXF1ZXN0KHRoaXMsIHJlcSwgam9iKSkgewotICAgICAgaWYgKHJlcS0+
b2JqZWN0LT50eXBlKCkgPT0gQ2FjaGVkT2JqZWN0OjpJbWFnZSkgewotCUNhY2hlZEltYWdlICpj
aSA9IHN0YXRpY19jYXN0PENhY2hlZEltYWdlKj4ocmVxLT5vYmplY3QpOwotCWlmIChjaS0+ZGVj
b2RlckNhbGxiYWNrKCkpIHsKLQkgICAgbV9yZXF1ZXN0c0JhY2tncm91bmREZWNvZGluZy5hcHBl
bmQocmVxKTsKLQl9Ci0gICAgICB9Ci0gICAgICBtX3JlcXVlc3RzTG9hZGluZy5pbnNlcnQoam9i
LCByZXEpOwotICB9Ci19Ci0KLXZvaWQgTG9hZGVyOjpzbG90RmluaXNoZWQoIEtJTzo6Sm9iKiBq
b2IsIE5TRGF0YSAqYWxsRGF0YSkKLXsKLSAgICBSZXF1ZXN0ICpyID0gbV9yZXF1ZXN0c0xvYWRp
bmcudGFrZSggam9iICk7Ci0gICAgS0lPOjpUcmFuc2ZlckpvYiogaiA9IHN0YXRpY19jYXN0PEtJ
Tzo6VHJhbnNmZXJKb2IqPihqb2IpOwotCi0gICAgaWYgKCAhciApCi0gICAgICAgIHJldHVybjsK
LQotICAgIENhY2hlZE9iamVjdCAqb2JqZWN0ID0gci0+b2JqZWN0OwotICAgIERvY0xvYWRlciAq
ZG9jTG9hZGVyID0gci0+bV9kb2NMb2FkZXI7Ci0gICAgCi0gICAgYm9vbCBiYWNrZ3JvdW5kSW1h
Z2VEZWNvZGluZyA9IChvYmplY3QtPnR5cGUoKSA9PSBDYWNoZWRPYmplY3Q6OkltYWdlICYmIAot
CXN0YXRpY19jYXN0PENhY2hlZEltYWdlKj4ob2JqZWN0KS0+ZGVjb2RlckNhbGxiYWNrKCkpOwot
CQotICAgIGlmIChqLT5lcnJvcigpIHx8IGotPmlzRXJyb3JQYWdlKCkpIHsKLSAgICAgICAgLy8g
VXNlIHRoZSBiYWNrZ3JvdW5kIGltYWdlIGRlY29kZXIncyBjYWxsYmFjayB0byBoYW5kbGUgdGhl
IGVycm9yLgotICAgICAgICBpZiAoYmFja2dyb3VuZEltYWdlRGVjb2RpbmcpIHsKLSAgICAgICAg
ICAgIENhY2hlZEltYWdlQ2FsbGJhY2sgKmNhbGxiYWNrID0gc3RhdGljX2Nhc3Q8Q2FjaGVkSW1h
Z2UqPihvYmplY3QpLT5kZWNvZGVyQ2FsbGJhY2soKTsKLSAgICAgICAgICAgIGNhbGxiYWNrLT5o
YW5kbGVFcnJvcigpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgZG9j
TG9hZGVyLT5zZXRMb2FkSW5Qcm9ncmVzcyh0cnVlKTsKLSAgICAgICAgICAgIHItPm9iamVjdC0+
ZXJyb3IoIGpvYi0+ZXJyb3IoKSwgam9iLT5lcnJvclRleHQoKS5hc2NpaSgpICk7Ci0gICAgICAg
ICAgICBkb2NMb2FkZXItPnNldExvYWRJblByb2dyZXNzKGZhbHNlKTsKLSAgICAgICAgICAgIGVt
aXQgcmVxdWVzdEZhaWxlZCggZG9jTG9hZGVyLCBvYmplY3QgKTsKLSAgICAgICAgICAgIENhY2hl
OjpyZW1vdmVDYWNoZUVudHJ5KCBvYmplY3QgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNl
IHsKLSAgICAgICAgZG9jTG9hZGVyLT5zZXRMb2FkSW5Qcm9ncmVzcyh0cnVlKTsKLSAgICAgICAg
b2JqZWN0LT5kYXRhKHItPm1fYnVmZmVyLCB0cnVlKTsKLSAgICAgICAgci0+b2JqZWN0LT5zZXRB
bGxEYXRhKGFsbERhdGEpOwotICAgICAgICBkb2NMb2FkZXItPnNldExvYWRJblByb2dyZXNzKGZh
bHNlKTsKLSAgICAgICAgCi0gICAgICAgIC8vIExldCB0aGUgYmFja2dyb3VuZCBpbWFnZSBkZWNv
ZGVyIHRyaWdnZXIgdGhlIGRvbmUgc2lnbmFsLgotICAgICAgICBpZiAoIWJhY2tncm91bmRJbWFn
ZURlY29kaW5nKQotICAgICAgICAgICAgZW1pdCByZXF1ZXN0RG9uZSggZG9jTG9hZGVyLCBvYmpl
Y3QgKTsKLQotICAgICAgICBvYmplY3QtPmZpbmlzaCgpOwotICAgIH0KLQotICAgIC8vIExldCB0
aGUgYmFja2dyb3VuZCBpbWFnZSBkZWNvZGVyIHJlbGVhc2UgdGhlIHJlcXVlc3Qgd2hlbiBpdCBp
cwotICAgIC8vIGZpbmlzaGVkLgotICAgIGlmICghYmFja2dyb3VuZEltYWdlRGVjb2RpbmcpIHsK
LSAgICAgICAgZGVsZXRlIHI7Ci0gICAgfQotCi0gICAgc2VydmVQZW5kaW5nUmVxdWVzdHMoKTsK
LX0KLQotCi12b2lkIExvYWRlcjo6c2xvdFJlY2VpdmVkUmVzcG9uc2UoS0lPOjpKb2IqIGpvYiwg
TlNVUkxSZXNwb25zZSAqcmVzcG9uc2UpCi17Ci0gICAgUmVxdWVzdCAqciA9IG1fcmVxdWVzdHNM
b2FkaW5nW2pvYl07Ci0gICAgQVNTRVJUKHIpOwotICAgIEFTU0VSVChyZXNwb25zZSk7Ci0gICAg
ci0+b2JqZWN0LT5zZXRSZXNwb25zZShyZXNwb25zZSk7Ci0gICAgci0+b2JqZWN0LT5zZXRFeHBp
cmVEYXRlKEtXUUNhY2hlT2JqZWN0RXhwaXJlc1RpbWUoci0+bV9kb2NMb2FkZXIsIHJlc3BvbnNl
KSwgZmFsc2UpOwotICAgIAotICAgIFFTdHJpbmcgY2hzID0gc3RhdGljX2Nhc3Q8S0lPOjpUcmFu
c2ZlckpvYio+KGpvYiktPnF1ZXJ5TWV0YURhdGEoImNoYXJzZXQiKTsKLSAgICBpZiAoIWNocy5p
c051bGwoKSkKLSAgICAgICAgci0+b2JqZWN0LT5zZXRDaGFyc2V0KGNocyk7Ci0gICAgCi0gICAg
aWYgKHItPm11bHRpcGFydCkgewotICAgICAgICBBU1NFUlQoci0+b2JqZWN0LT5pc0ltYWdlKCkp
OwotICAgICAgICBzdGF0aWNfY2FzdDxDYWNoZWRJbWFnZSAqPihyLT5vYmplY3QpLT5jbGVhcigp
OwotICAgICAgICByLT5tX2J1ZmZlciA9IFFCdWZmZXIoKTsKLSAgICAgICAgaWYgKHItPm1fZG9j
TG9hZGVyLT5wYXJ0KCkpCi0gICAgICAgICAgICByLT5tX2RvY0xvYWRlci0+cGFydCgpLT5jaGVj
a0NvbXBsZXRlZCgpOwotICAgICAgICAKLSAgICB9IGVsc2UgaWYgKEtXUVJlc3BvbnNlSXNNdWx0
aXBhcnQocmVzcG9uc2UpKSB7Ci0gICAgICAgIHItPm11bHRpcGFydCA9IHRydWU7Ci0gICAgICAg
IGlmICghci0+b2JqZWN0LT5pc0ltYWdlKCkpCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxLSU86
OlRyYW5zZmVySm9iKj4oam9iKS0+Y2FuY2VsKCk7Ci0gICAgfQotfQotCi0KLXZvaWQgTG9hZGVy
OjpzbG90RGF0YSggS0lPOjpKb2Iqam9iLCBjb25zdCBjaGFyICpkYXRhLCBpbnQgc2l6ZSApCi17
Ci0gICAgUmVxdWVzdCAqciA9IG1fcmVxdWVzdHNMb2FkaW5nW2pvYl07Ci0gICAgaWYoIXIpIHsK
LSAgICAgICAga2REZWJ1ZyggNjA2MCApIDw8ICJnb3QgZGF0YSBmb3IgdW5rbm93biByZXF1ZXN0
ISIgPDwgZW5kbDsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmICggIXItPm1fYnVm
ZmVyLmlzT3BlbigpICkKLSAgICAgICAgci0+bV9idWZmZXIub3BlbiggSU9fV3JpdGVPbmx5ICk7
Ci0KLSAgICByLT5tX2J1ZmZlci53cml0ZUJsb2NrKCBkYXRhLCBzaXplICk7Ci0KLSAgICBpZiAo
ci0+bXVsdGlwYXJ0KQotICAgICAgICByLT5vYmplY3QtPmRhdGEoIHItPm1fYnVmZmVyLCB0cnVl
ICk7IC8vIHRoZSBsb2FkZXIgZGVsaXZlcnMgdGhlIGRhdGEgaW4gYSBtdWx0aXBhcnQgc2VjdGlv
biBhbGwgYXQgb25jZSwgc2VuZCBlb2YKLSAgICBlbHNlIGlmKHItPmluY3JlbWVudGFsKQotICAg
ICAgICByLT5vYmplY3QtPmRhdGEoIHItPm1fYnVmZmVyLCBmYWxzZSApOwotfQotCi1pbnQgTG9h
ZGVyOjpudW1SZXF1ZXN0cyggRG9jTG9hZGVyKiBkbCApIGNvbnN0Ci17Ci0gICAgaW50IHJlcyA9
IDA7Ci0KLSAgICBRUHRyTGlzdEl0ZXJhdG9yPFJlcXVlc3Q+IHBJdCggbV9yZXF1ZXN0c1BlbmRp
bmcgKTsKLSAgICBmb3IgKDsgcEl0LmN1cnJlbnQoKTsgKytwSXQgKQotICAgICAgICBpZiAoIHBJ
dC5jdXJyZW50KCktPm1fZG9jTG9hZGVyID09IGRsICkKLSAgICAgICAgICAgIHJlcysrOwotCi0g
ICAgUVB0ckRpY3RJdGVyYXRvcjxSZXF1ZXN0PiBsSXQoIG1fcmVxdWVzdHNMb2FkaW5nICk7Ci0g
ICAgZm9yICg7IGxJdC5jdXJyZW50KCk7ICsrbEl0ICkKLSAgICAgICAgaWYgKCBsSXQuY3VycmVu
dCgpLT5tX2RvY0xvYWRlciA9PSBkbCApCi0gICAgICAgICAgICBpZiAoIWxJdC5jdXJyZW50KCkt
Pm11bHRpcGFydCkKLSAgICAgICAgICAgICAgICByZXMrKzsKLQotICAgIFFQdHJMaXN0SXRlcmF0
b3I8UmVxdWVzdD4gYmRJdCggbV9yZXF1ZXN0c0JhY2tncm91bmREZWNvZGluZyApOwotICAgIGZv
ciAoOyBiZEl0LmN1cnJlbnQoKTsgKytiZEl0ICkKLSAgICAgICAgaWYgKCBiZEl0LmN1cnJlbnQo
KS0+bV9kb2NMb2FkZXIgPT0gZGwgKQotICAgICAgICAgICAgcmVzKys7Ci0KLSAgICBpZiAoZGwt
PmxvYWRJblByb2dyZXNzKCkpCi0gICAgICAgIHJlcysrOwotICAgICAgICAKLSAgICByZXR1cm4g
cmVzOwotfQotCi12b2lkIExvYWRlcjo6Y2FuY2VsUmVxdWVzdHMoIERvY0xvYWRlciogZGwgKQot
ewotICAgIFFQdHJMaXN0SXRlcmF0b3I8UmVxdWVzdD4gcEl0KCBtX3JlcXVlc3RzUGVuZGluZyAp
OwotICAgIHdoaWxlICggcEl0LmN1cnJlbnQoKSApCi0gICAgewotICAgICAgICBpZiAocEl0LmN1
cnJlbnQoKS0+bV9kb2NMb2FkZXIgPT0gZGwpIHsKLSAgICAgICAgICAgIENhY2hlOjpyZW1vdmVD
YWNoZUVudHJ5KCBwSXQuY3VycmVudCgpLT5vYmplY3QgKTsKLSAgICAgICAgICAgIG1fcmVxdWVz
dHNQZW5kaW5nLnJlbW92ZSggcEl0ICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAg
ICAgICAgKytwSXQ7Ci0gICAgfQotCi0gICAgUVB0ckRpY3RJdGVyYXRvcjxSZXF1ZXN0PiBsSXQo
IG1fcmVxdWVzdHNMb2FkaW5nICk7Ci0gICAgd2hpbGUgKCBsSXQuY3VycmVudCgpICkKLSAgICB7
Ci0gICAgICAgIGlmIChsSXQuY3VycmVudCgpLT5tX2RvY0xvYWRlciA9PSBkbCkgewotICAgICAg
ICAgICAgS0lPOjpKb2IgKmpvYiA9IHN0YXRpY19jYXN0PEtJTzo6Sm9iICo+KCBsSXQuY3VycmVu
dEtleSgpICk7Ci0gICAgICAgICAgICBDYWNoZTo6cmVtb3ZlQ2FjaGVFbnRyeSggbEl0LmN1cnJl
bnQoKS0+b2JqZWN0ICk7Ci0gICAgICAgICAgICBtX3JlcXVlc3RzTG9hZGluZy5yZW1vdmUoIGxJ
dC5jdXJyZW50S2V5KCkgKTsKLSAgICAgICAgICAgIGpvYi0+a2lsbCgpOwotICAgICAgICB9Ci0g
ICAgICAgIGVsc2UKLSAgICAgICAgICAgICsrbEl0OwotICAgIH0KLQotICAgIFFQdHJMaXN0SXRl
cmF0b3I8UmVxdWVzdD4gYmRJdCggbV9yZXF1ZXN0c0JhY2tncm91bmREZWNvZGluZyApOwotICAg
IHdoaWxlIChiZEl0LmN1cnJlbnQoKSkgewotICAgICAgICBpZiAoYmRJdC5jdXJyZW50KCktPm1f
ZG9jTG9hZGVyID09IGRsKSB7Ci0gICAgICAgICAgICBDYWNoZTo6cmVtb3ZlQ2FjaGVFbnRyeSgg
YmRJdC5jdXJyZW50KCktPm9iamVjdCApOwotICAgICAgICAgICAgbV9yZXF1ZXN0c0JhY2tncm91
bmREZWNvZGluZy5yZW1vdmUoIGJkSXQgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAg
ICAgICAgICArK2JkSXQ7Ci0gICAgfQotfQotCi12b2lkIExvYWRlcjo6cmVtb3ZlQmFja2dyb3Vu
ZERlY29kaW5nUmVxdWVzdCAoUmVxdWVzdCAqcikKLXsKLSAgICBib29sIHByZXNlbnQgPSBtX3Jl
cXVlc3RzQmFja2dyb3VuZERlY29kaW5nLmNvbnRhaW5zUmVmKHIpOwotICAgIGlmIChwcmVzZW50
KSB7Ci0JbV9yZXF1ZXN0c0JhY2tncm91bmREZWNvZGluZy5yZW1vdmUgKHIpOwotICAgIH0KLX0K
LQotS0lPOjpKb2IgKkxvYWRlcjo6am9iRm9yUmVxdWVzdCggY29uc3QgRE9NOjpET01TdHJpbmcg
JnVybCApIGNvbnN0Ci17Ci0gICAgUVB0ckRpY3RJdGVyYXRvcjxSZXF1ZXN0PiBpdCggbV9yZXF1
ZXN0c0xvYWRpbmcgKTsKLQotICAgIGZvciAoOyBpdC5jdXJyZW50KCk7ICsraXQgKQotICAgIHsK
LSAgICAgICAgQ2FjaGVkT2JqZWN0ICpvYmogPSBpdC5jdXJyZW50KCktPm9iamVjdDsKLQotICAg
ICAgICBpZiAoIG9iaiAmJiBvYmotPnVybCgpID09IHVybCApCi0gICAgICAgICAgICByZXR1cm4g
c3RhdGljX2Nhc3Q8S0lPOjpKb2IgKj4oIGl0LmN1cnJlbnRLZXkoKSApOwotICAgIH0KLQotICAg
IHJldHVybiAwOwotfQotCi0KLWJvb2wgTG9hZGVyOjppc0tIVE1MTG9hZGVyKCkgY29uc3QKLXsK
LSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQotTFJV
TGlzdDo6TFJVTGlzdCgpCi06bV9oZWFkKDApLCBtX3RhaWwoMCkgCi17fQotCi1MUlVMaXN0Ojp+
TFJVTGlzdCgpCi17fQotCi1RRGljdDxDYWNoZWRPYmplY3Q+ICpDYWNoZTo6Y2FjaGUgPSAwOwot
UVB0ckxpc3Q8RG9jTG9hZGVyPiogQ2FjaGU6OmRvY2xvYWRlciA9IDA7Ci1Mb2FkZXIgKkNhY2hl
OjptX2xvYWRlciA9IDA7Ci0KLWludCBDYWNoZTo6bWF4U2l6ZSA9IERFRkNBQ0hFU0laRTsKLWlu
dCBDYWNoZTo6bWF4Q2FjaGVhYmxlID0gTUFYQ0FDSEVBQkxFOwotaW50IENhY2hlOjpmbHVzaENv
dW50ID0gMDsKLQotUVBpeG1hcCAqQ2FjaGU6Om51bGxQaXhtYXAgPSAwOwotUVBpeG1hcCAqQ2Fj
aGU6OmJyb2tlblBpeG1hcCA9IDA7Ci0KLUNhY2hlZE9iamVjdCAqQ2FjaGU6Om1faGVhZE9mVW5j
YWNoZWFibGVMaXN0ID0gMDsKLWludCBDYWNoZTo6bV90b3RhbFNpemVPZkxSVUxpc3RzID0gMDsK
LWludCBDYWNoZTo6bV9jb3VudE9mTFJVQW5kVW5jYWNoZWFibGVMaXN0czsKLUxSVUxpc3QgKkNh
Y2hlOjptX0xSVUxpc3RzID0gMDsKLQotdm9pZCBDYWNoZTo6aW5pdCgpCi17Ci0gICAgaWYgKCAh
Y2FjaGUgKQotICAgICAgICBjYWNoZSA9IG5ldyBRRGljdDxDYWNoZWRPYmplY3Q+KDQwMSwgdHJ1
ZSk7Ci0KLSAgICBpZiAoICFkb2Nsb2FkZXIgKQotICAgICAgICBkb2Nsb2FkZXIgPSBuZXcgUVB0
ckxpc3Q8RG9jTG9hZGVyPjsKLQotICAgIGlmICggIW51bGxQaXhtYXAgKQotICAgICAgICBudWxs
UGl4bWFwID0gbmV3IFFQaXhtYXA7Ci0KLSAgICBpZiAoICFicm9rZW5QaXhtYXAgKQotICAgICAg
ICBicm9rZW5QaXhtYXAgPSBLV1FMb2FkUGl4bWFwKCJtaXNzaW5nX2ltYWdlIik7Ci0KLSAgICBp
ZiAoICFtX2xvYWRlciApCi0gICAgICAgIG1fbG9hZGVyID0gbmV3IExvYWRlcigpOwotfQotCi12
b2lkIENhY2hlOjpjbGVhcigpCi17Ci0gICAgaWYgKCFjYWNoZSkKLSAgICAgICAgcmV0dXJuOwot
Ci0gICAgY2FjaGUtPnNldEF1dG9EZWxldGUoIHRydWUgKTsKLSAgICBkZWxldGUgY2FjaGU7IGNh
Y2hlID0gMDsKLSAgICBkZWxldGUgbnVsbFBpeG1hcDsgbnVsbFBpeG1hcCA9IDA7Ci0gICAgZGVs
ZXRlIGJyb2tlblBpeG1hcDsgYnJva2VuUGl4bWFwID0gMDsKLSAgICBkZWxldGUgbV9sb2FkZXI7
ICAgbV9sb2FkZXIgPSAwOwotICAgIGRlbGV0ZSBkb2Nsb2FkZXI7IGRvY2xvYWRlciA9IDA7Ci19
Ci0KLUNhY2hlZEltYWdlICpDYWNoZTo6cmVxdWVzdEltYWdlKCBEb2NMb2FkZXIqIGRsLCBjb25z
dCBET01TdHJpbmcgJiB1cmwsIGJvb2wgcmVsb2FkLCB0aW1lX3QgX2V4cGlyZURhdGUgKQotewot
ICAgIC8vIHRoaXMgYnJpbmdzIHRoZSBfdXJsIHRvIGEgc3RhbmRhcmQgZm9ybS4uLgotICAgIEtV
Ukwga3VybDsKLSAgICBpZiAoZGwpCi0gICAgICAgIGt1cmwgPSBkbC0+bV9kb2MtPmNvbXBsZXRl
VVJMKCB1cmwucXN0cmluZygpICk7Ci0gICAgZWxzZQotICAgICAgICBrdXJsID0gdXJsLnFzdHJp
bmcoKTsKLSAgICByZXR1cm4gcmVxdWVzdEltYWdlKGRsLCBrdXJsLCByZWxvYWQsIF9leHBpcmVE
YXRlKTsKLX0KLQotQ2FjaGVkSW1hZ2UgKkNhY2hlOjpyZXF1ZXN0SW1hZ2UoIERvY0xvYWRlciog
ZGwsIGNvbnN0IEtVUkwgJiB1cmwsIGJvb2wgcmVsb2FkLCB0aW1lX3QgX2V4cGlyZURhdGUgKQot
ewotICAgIEtJTzo6Q2FjaGVDb250cm9sIGNhY2hlUG9saWN5OwotICAgIGlmIChkbCkKLSAgICAg
ICAgY2FjaGVQb2xpY3kgPSBkbC0+Y2FjaGVQb2xpY3koKTsKLSAgICBlbHNlCi0gICAgICAgIGNh
Y2hlUG9saWN5ID0gS0lPOjpDQ19WZXJpZnk7Ci0KLSAgICAvLyBDaGVja2luZyBpZiB0aGUgVVJM
IGlzIG1hbGZvcm1lZCBpcyBsb3RzIG9mIGV4dHJhIHdvcmsgZm9yIGxpdHRsZSBiZW5lZml0Lgot
Ci0gICAgaWYgKCFkbC0+ZG9jKCktPnNob3VsZENyZWF0ZVJlbmRlcmVycygpKXsKLSAgICAgICAg
cmV0dXJuIDA7Ci0gICAgfQotCi0gICAgQ2FjaGVkT2JqZWN0ICpvID0gMDsKLSAgICBpZiAoIXJl
bG9hZCkKLSAgICAgICAgbyA9IGNhY2hlLT5maW5kKHVybC51cmwoKSk7Ci0gICAgaWYoIW8pCi0g
ICAgewotI2lmZGVmIENBQ0hFX0RFQlVHCi0gICAgICAgIGtkRGVidWcoIDYwNjAgKSA8PCAiQ2Fj
aGU6IG5ldzogIiA8PCB1cmwudXJsKCkgPDwgZW5kbDsKLSNlbmRpZgotICAgICAgICBDYWNoZWRJ
bWFnZSAqaW0gPSBuZXcgQ2FjaGVkSW1hZ2UoZGwsIHVybC51cmwoKSwgY2FjaGVQb2xpY3ksIF9l
eHBpcmVEYXRlKTsKLSAgICAgICAgaWYgKCBkbCAmJiBkbC0+YXV0b2xvYWRJbWFnZXMoKSApIENh
Y2hlOjpsb2FkZXIoKS0+bG9hZChkbCwgaW0sIHRydWUpOwotICAgICAgICBpZiAoY2FjaGVEaXNh
YmxlZCkKLSAgICAgICAgICAgIGltLT5zZXRGcmVlKHRydWUpOwotICAgICAgICBlbHNlIHsKLSAg
ICAgICAgY2FjaGUtPmluc2VydCggdXJsLnVybCgpLCBpbSApOwotICAgICAgICBtb3ZlVG9IZWFk
T2ZMUlVMaXN0KGltKTsKLSAgICAgICAgfQotICAgICAgICBvID0gaW07Ci0gICAgfQotCi0gICAg
Ci0gICAgaWYoby0+dHlwZSgpICE9IENhY2hlZE9iamVjdDo6SW1hZ2UpCi0gICAgewotI2lmZGVm
IENBQ0hFX0RFQlVHCi0gICAgICAgIGtkRGVidWcoIDYwNjAgKSA8PCAiQ2FjaGU6OkludGVybmFs
IEVycm9yIGluIHJlcXVlc3RJbWFnZSB1cmw9IiA8PCBrdXJsLnVybCgpIDw8ICIhIiA8PCBlbmRs
OwotI2VuZGlmCi0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotI2lmZGVmIENBQ0hFX0RFQlVH
Ci0gICAgaWYoIG8tPnN0YXR1cygpID09IENhY2hlZE9iamVjdDo6UGVuZGluZyApCi0gICAgICAg
IGtkRGVidWcoIDYwNjAgKSA8PCAiQ2FjaGU6IGxvYWRpbmcgaW4gcHJvZ3Jlc3M6ICIgPDwga3Vy
bC51cmwoKSA8PCBlbmRsOwotICAgIGVsc2UKLSAgICAgICAga2REZWJ1ZyggNjA2MCApIDw8ICJD
YWNoZTogdXNpbmcgY2FjaGVkOiAiIDw8IGt1cmwudXJsKCkgPDwgIiwgc3RhdHVzICIgPDwgby0+
c3RhdHVzKCkgPDwgZW5kbDsKLSNlbmRpZgotCi0gICAgbW92ZVRvSGVhZE9mTFJVTGlzdChvKTsK
LSAgICBpZiAoIGRsICkgewotICAgICAgICBkbC0+bV9kb2NPYmplY3RzLnJlbW92ZSggbyApOwot
ICAgICAgICBpZiAoIWNhY2hlRGlzYWJsZWQpCi0gICAgICAgIGRsLT5tX2RvY09iamVjdHMuYXBw
ZW5kKCBvICk7Ci0gICAgfQotICAgIHJldHVybiBzdGF0aWNfY2FzdDxDYWNoZWRJbWFnZSAqPihv
KTsKLX0KLQotQ2FjaGVkQ1NTU3R5bGVTaGVldCAqQ2FjaGU6OnJlcXVlc3RTdHlsZVNoZWV0KCBE
b2NMb2FkZXIqIGRsLCBjb25zdCBET01TdHJpbmcgJiB1cmwsIGJvb2wgcmVsb2FkLCB0aW1lX3Qg
X2V4cGlyZURhdGUsIGNvbnN0IFFTdHJpbmcmIGNoYXJzZXQpCi17Ci0gICAgLy8gdGhpcyBicmlu
Z3MgdGhlIF91cmwgdG8gYSBzdGFuZGFyZCBmb3JtLi4uCi0gICAgS1VSTCBrdXJsOwotICAgIEtJ
Tzo6Q2FjaGVDb250cm9sIGNhY2hlUG9saWN5OwotICAgIGlmICggZGwgKQotICAgIHsKLSAgICAg
ICAga3VybCA9IGRsLT5tX2RvYy0+Y29tcGxldGVVUkwoIHVybC5xc3RyaW5nKCkgKTsKLSAgICAg
ICAgY2FjaGVQb2xpY3kgPSBkbC0+Y2FjaGVQb2xpY3koKTsKLSAgICB9Ci0gICAgZWxzZQotICAg
IHsKLSAgICAgICAga3VybCA9IHVybC5xc3RyaW5nKCk7Ci0gICAgICAgIGNhY2hlUG9saWN5ID0g
S0lPOjpDQ19WZXJpZnk7Ci0gICAgfQotCi0gICAgLy8gQ2hlY2tpbmcgaWYgdGhlIFVSTCBpcyBt
YWxmb3JtZWQgaXMgbG90cyBvZiBleHRyYSB3b3JrIGZvciBsaXR0bGUgYmVuZWZpdC4KLQotICAg
IENhY2hlZE9iamVjdCAqbyA9IGNhY2hlLT5maW5kKGt1cmwudXJsKCkpOwotICAgIGlmKCFvKQot
ICAgIHsKLSNpZmRlZiBDQUNIRV9ERUJVRwotICAgICAgICBrZERlYnVnKCA2MDYwICkgPDwgIkNh
Y2hlOiBuZXc6ICIgPDwga3VybC51cmwoKSA8PCBlbmRsOwotI2VuZGlmCi0gICAgICAgIENhY2hl
ZENTU1N0eWxlU2hlZXQgKnNoZWV0ID0gbmV3IENhY2hlZENTU1N0eWxlU2hlZXQoZGwsIGt1cmwu
dXJsKCksIGNhY2hlUG9saWN5LCBfZXhwaXJlRGF0ZSwgY2hhcnNldCk7Ci0gICAgICAgIGlmIChj
YWNoZURpc2FibGVkKQotICAgICAgICAgICAgc2hlZXQtPnNldEZyZWUodHJ1ZSk7Ci0gICAgICAg
IGVsc2UgewotICAgICAgICBjYWNoZS0+aW5zZXJ0KCBrdXJsLnVybCgpLCBzaGVldCApOwotICAg
ICAgICBtb3ZlVG9IZWFkT2ZMUlVMaXN0KHNoZWV0KTsKLSAgICAgICAgfQotICAgICAgICBvID0g
c2hlZXQ7Ci0gICAgfQotCi0gICAgCi0gICAgaWYoby0+dHlwZSgpICE9IENhY2hlZE9iamVjdDo6
Q1NTU3R5bGVTaGVldCkKLSAgICB7Ci0jaWZkZWYgQ0FDSEVfREVCVUcKLSAgICAgICAga2REZWJ1
ZyggNjA2MCApIDw8ICJDYWNoZTo6SW50ZXJuYWwgRXJyb3IgaW4gcmVxdWVzdFN0eWxlU2hlZXQg
dXJsPSIgPDwga3VybC51cmwoKSA8PCAiISIgPDwgZW5kbDsKLSNlbmRpZgotICAgICAgICByZXR1
cm4gMDsKLSAgICB9Ci0KLSNpZmRlZiBDQUNIRV9ERUJVRwotICAgIGlmKCBvLT5zdGF0dXMoKSA9
PSBDYWNoZWRPYmplY3Q6OlBlbmRpbmcgKQotICAgICAgICBrZERlYnVnKCA2MDYwICkgPDwgIkNh
Y2hlOiBsb2FkaW5nIGluIHByb2dyZXNzOiAiIDw8IGt1cmwudXJsKCkgPDwgZW5kbDsKLSAgICBl
bHNlCi0gICAgICAgIGtkRGVidWcoIDYwNjAgKSA8PCAiQ2FjaGU6IHVzaW5nIGNhY2hlZDogIiA8
PCBrdXJsLnVybCgpIDw8IGVuZGw7Ci0jZW5kaWYKLQotICAgIG1vdmVUb0hlYWRPZkxSVUxpc3Qo
byk7Ci0gICAgaWYgKCBkbCApIHsKLSAgICAgICAgZGwtPm1fZG9jT2JqZWN0cy5yZW1vdmUoIG8g
KTsKLSAgICAgICAgaWYgKCFjYWNoZURpc2FibGVkKQotICAgICAgICBkbC0+bV9kb2NPYmplY3Rz
LmFwcGVuZCggbyApOwotICAgIH0KLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q2FjaGVkQ1NTU3R5
bGVTaGVldCAqPihvKTsKLX0KLQotdm9pZCBDYWNoZTo6cHJlbG9hZFN0eWxlU2hlZXQoIGNvbnN0
IFFTdHJpbmcgJnVybCwgY29uc3QgUVN0cmluZyAmc3R5bGVzaGVldF9kYXRhKQotewotICAgIENh
Y2hlZE9iamVjdCAqbyA9IGNhY2hlLT5maW5kKHVybCk7Ci0gICAgaWYobykKLSAgICAgICAgcmVt
b3ZlQ2FjaGVFbnRyeShvKTsKLQotICAgIENhY2hlZENTU1N0eWxlU2hlZXQgKnN0eWxlc2hlZXQg
PSBuZXcgQ2FjaGVkQ1NTU3R5bGVTaGVldCh1cmwsIHN0eWxlc2hlZXRfZGF0YSk7Ci0gICAgY2Fj
aGUtPmluc2VydCggdXJsLCBzdHlsZXNoZWV0ICk7Ci19Ci0KLUNhY2hlZFNjcmlwdCAqQ2FjaGU6
OnJlcXVlc3RTY3JpcHQoIERvY0xvYWRlciogZGwsIGNvbnN0IERPTTo6RE9NU3RyaW5nICZ1cmws
IGJvb2wgcmVsb2FkLCB0aW1lX3QgX2V4cGlyZURhdGUsIGNvbnN0IFFTdHJpbmcmIGNoYXJzZXQp
Ci17Ci0gICAgLy8gdGhpcyBicmluZ3MgdGhlIF91cmwgdG8gYSBzdGFuZGFyZCBmb3JtLi4uCi0g
ICAgS1VSTCBrdXJsOwotICAgIEtJTzo6Q2FjaGVDb250cm9sIGNhY2hlUG9saWN5OwotICAgIGlm
ICggZGwgKQotICAgIHsKLSAgICAgICAga3VybCA9IGRsLT5tX2RvYy0+Y29tcGxldGVVUkwoIHVy
bC5xc3RyaW5nKCkgKTsKLSAgICAgICAgY2FjaGVQb2xpY3kgPSBkbC0+Y2FjaGVQb2xpY3koKTsK
LSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAga3VybCA9IHVybC5xc3RyaW5nKCk7Ci0g
ICAgICAgIGNhY2hlUG9saWN5ID0gS0lPOjpDQ19WZXJpZnk7Ci0gICAgfQotCi0gICAgLy8gQ2hl
Y2tpbmcgaWYgdGhlIFVSTCBpcyBtYWxmb3JtZWQgaXMgbG90cyBvZiBleHRyYSB3b3JrIGZvciBs
aXR0bGUgYmVuZWZpdC4KLQotICAgIENhY2hlZE9iamVjdCAqbyA9IGNhY2hlLT5maW5kKGt1cmwu
dXJsKCkpOwotICAgIGlmKCFvKQotICAgIHsKLSNpZmRlZiBDQUNIRV9ERUJVRwotICAgICAgICBr
ZERlYnVnKCA2MDYwICkgPDwgIkNhY2hlOiBuZXc6ICIgPDwga3VybC51cmwoKSA8PCBlbmRsOwot
I2VuZGlmCi0gICAgICAgIENhY2hlZFNjcmlwdCAqc2NyaXB0ID0gbmV3IENhY2hlZFNjcmlwdChk
bCwga3VybC51cmwoKSwgY2FjaGVQb2xpY3ksIF9leHBpcmVEYXRlLCBjaGFyc2V0KTsKLSAgICAg
ICAgaWYgKGNhY2hlRGlzYWJsZWQpCi0gICAgICAgICAgICBzY3JpcHQtPnNldEZyZWUodHJ1ZSk7
Ci0gICAgICAgIGVsc2UgewotICAgICAgICBjYWNoZS0+aW5zZXJ0KCBrdXJsLnVybCgpLCBzY3Jp
cHQgKTsKLSAgICAgICAgbW92ZVRvSGVhZE9mTFJVTGlzdChzY3JpcHQpOwotICAgICAgICB9Ci0g
ICAgICAgIG8gPSBzY3JpcHQ7Ci0gICAgfQotCi0gICAgCi0gICAgaWYoIShvLT50eXBlKCkgPT0g
Q2FjaGVkT2JqZWN0OjpTY3JpcHQpKQotICAgIHsKLSNpZmRlZiBDQUNIRV9ERUJVRwotICAgICAg
ICBrZERlYnVnKCA2MDYwICkgPDwgIkNhY2hlOjpJbnRlcm5hbCBFcnJvciBpbiByZXF1ZXN0U2Ny
aXB0IHVybD0iIDw8IGt1cmwudXJsKCkgPDwgIiEiIDw8IGVuZGw7Ci0jZW5kaWYKLSAgICAgICAg
cmV0dXJuIDA7Ci0gICAgfQotICAgIAotICAgIAotI2lmZGVmIENBQ0hFX0RFQlVHCi0gICAgaWYo
IG8tPnN0YXR1cygpID09IENhY2hlZE9iamVjdDo6UGVuZGluZyApCi0gICAgICAgIGtkRGVidWco
IDYwNjAgKSA8PCAiQ2FjaGU6IGxvYWRpbmcgaW4gcHJvZ3Jlc3M6ICIgPDwga3VybC51cmwoKSA8
PCBlbmRsOwotICAgIGVsc2UKLSAgICAgICAga2REZWJ1ZyggNjA2MCApIDw8ICJDYWNoZTogdXNp
bmcgY2FjaGVkOiAiIDw8IGt1cmwudXJsKCkgPDwgZW5kbDsKLSNlbmRpZgotCi0gICAgbW92ZVRv
SGVhZE9mTFJVTGlzdChvKTsKLSAgICBpZiAoIGRsICkgewotICAgICAgICBkbC0+bV9kb2NPYmpl
Y3RzLnJlbW92ZSggbyApOwotICAgICAgICBpZiAoIWNhY2hlRGlzYWJsZWQpCi0gICAgICAgIGRs
LT5tX2RvY09iamVjdHMuYXBwZW5kKCBvICk7Ci0gICAgfQotICAgIHJldHVybiBzdGF0aWNfY2Fz
dDxDYWNoZWRTY3JpcHQgKj4obyk7Ci19Ci0KLXZvaWQgQ2FjaGU6OnByZWxvYWRTY3JpcHQoIGNv
bnN0IFFTdHJpbmcgJnVybCwgY29uc3QgUVN0cmluZyAmc2NyaXB0X2RhdGEpCi17Ci0gICAgQ2Fj
aGVkT2JqZWN0ICpvID0gY2FjaGUtPmZpbmQodXJsKTsKLSAgICBpZihvKQotICAgICAgICByZW1v
dmVDYWNoZUVudHJ5KG8pOwotCi0gICAgQ2FjaGVkU2NyaXB0ICpzY3JpcHQgPSBuZXcgQ2FjaGVk
U2NyaXB0KHVybCwgc2NyaXB0X2RhdGEpOwotICAgIGNhY2hlLT5pbnNlcnQoIHVybCwgc2NyaXB0
ICk7Ci19Ci0KLSNpZmRlZiBLSFRNTF9YU0xUCi1DYWNoZWRYU0xTdHlsZVNoZWV0KiBDYWNoZTo6
cmVxdWVzdFhTTFN0eWxlU2hlZXQoRG9jTG9hZGVyKiBkbCwgY29uc3QgRE9NU3RyaW5nICYgdXJs
LCBib29sIHJlbG9hZCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgdGltZV90IF9leHBpcmVEYXRlKQotewotICAgIC8vIHRoaXMgYnJpbmdzIHRoZSBf
dXJsIHRvIGEgc3RhbmRhcmQgZm9ybS4uLgotICAgIEtVUkwga3VybDsKLSAgICBLSU86OkNhY2hl
Q29udHJvbCBjYWNoZVBvbGljeTsKLSAgICBpZiAoZGwpIHsKLSAgICAgICAga3VybCA9IGRsLT5t
X2RvYy0+Y29tcGxldGVVUkwodXJsLnFzdHJpbmcoKSk7Ci0gICAgICAgIGNhY2hlUG9saWN5ID0g
ZGwtPmNhY2hlUG9saWN5KCk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBrdXJsID0gdXJs
LnFzdHJpbmcoKTsKLSAgICAgICAgY2FjaGVQb2xpY3kgPSBLSU86OkNDX1ZlcmlmeTsKLSAgICB9
Ci0gICAgCi0gICAgLy8gQ2hlY2tpbmcgaWYgdGhlIFVSTCBpcyBtYWxmb3JtZWQgaXMgbG90cyBv
ZiBleHRyYSB3b3JrIGZvciBsaXR0bGUgYmVuZWZpdC4KLSAgICAKLSAgICBDYWNoZWRPYmplY3Qg
Km8gPSBjYWNoZS0+ZmluZChrdXJsLnVybCgpKTsKLSAgICBpZiAoIW8pIHsKLSNpZmRlZiBDQUNI
RV9ERUJVRwotICAgICAgICBrZERlYnVnKCA2MDYwICkgPDwgIkNhY2hlOiBuZXc6ICIgPDwga3Vy
bC51cmwoKSA8PCBlbmRsOwotI2VuZGlmCi0gICAgICAgIENhY2hlZFhTTFN0eWxlU2hlZXQqIGRv
YyA9IG5ldyBDYWNoZWRYU0xTdHlsZVNoZWV0KGRsLCBrdXJsLnVybCgpLCBjYWNoZVBvbGljeSwg
X2V4cGlyZURhdGUpOwotICAgICAgICBpZiAoY2FjaGVEaXNhYmxlZCkKLSAgICAgICAgICAgIGRv
Yy0+c2V0RnJlZSh0cnVlKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBjYWNoZS0+aW5z
ZXJ0KGt1cmwudXJsKCksIGRvYyk7Ci0gICAgICAgICAgICBtb3ZlVG9IZWFkT2ZMUlVMaXN0KGRv
Yyk7Ci0gICAgICAgIH0KLSAgICAgICAgbyA9IGRvYzsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAg
aWYgKG8tPnR5cGUoKSAhPSBDYWNoZWRPYmplY3Q6OlhTTFN0eWxlU2hlZXQpIHsKLSNpZmRlZiBD
QUNIRV9ERUJVRwotICAgICAgICBrZERlYnVnKCA2MDYwICkgPDwgIkNhY2hlOjpJbnRlcm5hbCBF
cnJvciBpbiByZXF1ZXN0WFNMU3R5bGVTaGVldCB1cmw9IiA8PCBrdXJsLnVybCgpIDw8ICIhIiA8
PCBlbmRsOwotI2VuZGlmCi0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICAKLSNpZmRlZiBD
QUNIRV9ERUJVRwotICAgIGlmIChvLT5zdGF0dXMoKSA9PSBDYWNoZWRPYmplY3Q6OlBlbmRpbmcp
Ci0gICAgICAgIGtkRGVidWcoIDYwNjAgKSA8PCAiQ2FjaGU6IGxvYWRpbmcgaW4gcHJvZ3Jlc3M6
ICIgPDwga3VybC51cmwoKSA8PCBlbmRsOwotICAgIGVsc2UKLSAgICAgICAga2REZWJ1ZyggNjA2
MCApIDw8ICJDYWNoZTogdXNpbmcgY2FjaGVkOiAiIDw8IGt1cmwudXJsKCkgPDwgZW5kbDsKLSNl
bmRpZgotICAgIAotICAgIG1vdmVUb0hlYWRPZkxSVUxpc3Qobyk7Ci0gICAgaWYgKGRsKSB7Ci0g
ICAgICAgIGRsLT5tX2RvY09iamVjdHMucmVtb3ZlKCBvICk7Ci0gICAgICAgIGlmICghY2FjaGVE
aXNhYmxlZCkKLSAgICAgICAgICAgIGRsLT5tX2RvY09iamVjdHMuYXBwZW5kKCBvICk7Ci0gICAg
fQotICAgIHJldHVybiBzdGF0aWNfY2FzdDxDYWNoZWRYU0xTdHlsZVNoZWV0Kj4obyk7Ci19Ci0j
ZW5kaWYKLQotI2lmbmRlZiBLSFRNTF9OT19YQkwKLUNhY2hlZFhCTERvY3VtZW50KiBDYWNoZTo6
cmVxdWVzdFhCTERvY3VtZW50KERvY0xvYWRlciogZGwsIGNvbnN0IERPTVN0cmluZyAmIHVybCwg
Ym9vbCByZWxvYWQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgdGltZV90IF9leHBpcmVEYXRlKQotewotICAgIC8vIHRoaXMgYnJpbmdzIHRoZSBfdXJsIHRv
IGEgc3RhbmRhcmQgZm9ybS4uLgotICAgIEtVUkwga3VybDsKLSAgICBLSU86OkNhY2hlQ29udHJv
bCBjYWNoZVBvbGljeTsKLSAgICBpZiAoZGwpIHsKLSAgICAgICAga3VybCA9IGRsLT5tX2RvYy0+
Y29tcGxldGVVUkwodXJsLnFzdHJpbmcoKSk7Ci0gICAgICAgIGNhY2hlUG9saWN5ID0gZGwtPmNh
Y2hlUG9saWN5KCk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBrdXJsID0gdXJsLnFzdHJp
bmcoKTsKLSAgICAgICAgY2FjaGVQb2xpY3kgPSBLSU86OkNDX1ZlcmlmeTsKLSAgICB9Ci0gICAg
Ci0gICAgLy8gQ2hlY2tpbmcgaWYgdGhlIFVSTCBpcyBtYWxmb3JtZWQgaXMgbG90cyBvZiBleHRy
YSB3b3JrIGZvciBsaXR0bGUgYmVuZWZpdC4KLSAgICAKLSAgICBDYWNoZWRPYmplY3QgKm8gPSBj
YWNoZS0+ZmluZChrdXJsLnVybCgpKTsKLSAgICBpZighbykKLSAgICB7Ci0jaWZkZWYgQ0FDSEVf
REVCVUcKLSAgICAgICAga2REZWJ1ZyggNjA2MCApIDw8ICJDYWNoZTogbmV3OiAiIDw8IGt1cmwu
dXJsKCkgPDwgZW5kbDsKLSNlbmRpZgotICAgICAgICBDYWNoZWRYQkxEb2N1bWVudCogZG9jID0g
bmV3IENhY2hlZFhCTERvY3VtZW50KGRsLCBrdXJsLnVybCgpLCBjYWNoZVBvbGljeSwgX2V4cGly
ZURhdGUpOwotICAgICAgICBpZiAoY2FjaGVEaXNhYmxlZCkKLSAgICAgICAgICAgIGRvYy0+c2V0
RnJlZSh0cnVlKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBjYWNoZS0+aW5zZXJ0KGt1
cmwudXJsKCksIGRvYyk7Ci0gICAgICAgICAgICBtb3ZlVG9IZWFkT2ZMUlVMaXN0KGRvYyk7Ci0g
ICAgICAgIH0KLSAgICAgICAgbyA9IGRvYzsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgaWYoby0+
dHlwZSgpICE9IENhY2hlZE9iamVjdDo6WEJMKQotICAgIHsKLSNpZmRlZiBDQUNIRV9ERUJVRwot
ICAgICAgICBrZERlYnVnKCA2MDYwICkgPDwgIkNhY2hlOjpJbnRlcm5hbCBFcnJvciBpbiByZXF1
ZXN0WEJMRG9jdW1lbnQgdXJsPSIgPDwga3VybC51cmwoKSA8PCAiISIgPDwgZW5kbDsKLSNlbmRp
ZgotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgCi0jaWZkZWYgQ0FDSEVfREVCVUcKLSAg
ICBpZiggby0+c3RhdHVzKCkgPT0gQ2FjaGVkT2JqZWN0OjpQZW5kaW5nICkKLSAgICAgICAga2RE
ZWJ1ZyggNjA2MCApIDw8ICJDYWNoZTogbG9hZGluZyBpbiBwcm9ncmVzczogIiA8PCBrdXJsLnVy
bCgpIDw8IGVuZGw7Ci0gICAgZWxzZQotICAgICAgICBrZERlYnVnKCA2MDYwICkgPDwgIkNhY2hl
OiB1c2luZyBjYWNoZWQ6ICIgPDwga3VybC51cmwoKSA8PCBlbmRsOwotI2VuZGlmCi0gICAgCi0g
ICAgbW92ZVRvSGVhZE9mTFJVTGlzdChvKTsKLSAgICBpZiAoIGRsICkgewotICAgICAgICBkbC0+
bV9kb2NPYmplY3RzLnJlbW92ZSggbyApOwotICAgICAgICBpZiAoIWNhY2hlRGlzYWJsZWQpCi0g
ICAgICAgICAgICBkbC0+bV9kb2NPYmplY3RzLmFwcGVuZCggbyApOwotICAgIH0KLSAgICByZXR1
cm4gc3RhdGljX2Nhc3Q8Q2FjaGVkWEJMRG9jdW1lbnQqPihvKTsKLX0KLSNlbmRpZgotCi12b2lk
IENhY2hlOjpmbHVzaChib29sIGZvcmNlKQotewotICAgIGlmIChmb3JjZSkKLSAgICAgICBmbHVz
aENvdW50ID0gMDsKLSAgICAvLyBEb24ndCBmbHVzaCBmb3IgZXZlcnkgaW1hZ2UuCi0gICAgaWYg
KG1fY291bnRPZkxSVUFuZFVuY2FjaGVhYmxlTGlzdHMgPCBmbHVzaENvdW50KQotICAgICAgIHJl
dHVybjsKLQotICAgIGluaXQoKTsKLQotICAgIHdoaWxlIChtX2hlYWRPZlVuY2FjaGVhYmxlTGlz
dCkKLSAgICAgICAgcmVtb3ZlQ2FjaGVFbnRyeShtX2hlYWRPZlVuY2FjaGVhYmxlTGlzdCk7Ci0K
LSAgICBmb3IgKGludCBpID0gTUFYX0xSVV9MSVNUUy0xOyBpPj0wOyBpLS0pIHsKLSAgICAgICAg
aWYgKG1fdG90YWxTaXplT2ZMUlVMaXN0cyA8PSBtYXhTaXplKQotICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgICAgICAKLSAgICAgICAgd2hpbGUgKG1fdG90YWxTaXplT2ZMUlVMaXN0cyA+IG1h
eFNpemUgJiYgbV9MUlVMaXN0c1tpXS5tX3RhaWwpCi0gICAgICAgICAgICByZW1vdmVDYWNoZUVu
dHJ5KG1fTFJVTGlzdHNbaV0ubV90YWlsKTsKLSAgICB9Ci0KLSAgICBmbHVzaENvdW50ID0gbV9j
b3VudE9mTFJVQW5kVW5jYWNoZWFibGVMaXN0cysxMDsgLy8gRmx1c2ggYWdhaW4gd2hlbiB0aGUg
Y2FjaGUgaGFzIGdyb3duLgotfQotCi0KLXZvaWQgQ2FjaGU6OnNldFNpemUoIGludCBieXRlcyAp
Ci17Ci0gICAgbWF4U2l6ZSA9IGJ5dGVzOwotICAgIG1heENhY2hlYWJsZSA9IGtNYXgobWF4U2l6
ZSAvIDEyOCwgTUFYQ0FDSEVBQkxFKTsKLQotICAgIC8vIG1heSBiZSB3ZSBuZWVkIHRvIGNsZWFy
IHBhcnRzIG9mIHRoZSBjYWNoZQotICAgIGZsdXNoQ291bnQgPSAwOwotICAgIGZsdXNoKHRydWUp
OwotfQotCi12b2lkIENhY2hlOjpyZW1vdmVDYWNoZUVudHJ5KCBDYWNoZWRPYmplY3QgKm9iamVj
dCApCi17Ci0gIFFTdHJpbmcga2V5ID0gb2JqZWN0LT51cmwoKS5xc3RyaW5nKCk7Ci0KLSAgLy8g
dGhpcyBpbmRpY2F0ZXMgdGhlIGRlcmVmKCkgbWV0aG9kIG9mIENhY2hlZE9iamVjdCB0byBkZWxl
dGUgaXRzZWxmIHdoZW4gdGhlIHJlZmVyZW5jZSBjb3VudGVyCi0gIC8vIGRyb3BzIGRvd24gdG8g
emVybwotICBvYmplY3QtPnNldEZyZWUoIHRydWUgKTsKLQotICBjYWNoZS0+cmVtb3ZlKCBrZXkg
KTsKLSAgcmVtb3ZlRnJvbUxSVUxpc3Qob2JqZWN0KTsKLQotICBjb25zdCBEb2NMb2FkZXIqIGRs
OwotICBmb3IgKCBkbD1kb2Nsb2FkZXItPmZpcnN0KCk7IGRsOyBkbD1kb2Nsb2FkZXItPm5leHQo
KSApCi0gICAgICBkbC0+cmVtb3ZlQ2FjaGVkT2JqZWN0KCBvYmplY3QgKTsKLQotICBpZiAoIG9i
amVjdC0+Y2FuRGVsZXRlKCkgKQotICAgICBkZWxldGUgb2JqZWN0OwotfQotCi0jZGVmaW5lIEZB
U1RfTE9HMihfbG9nMixfbikgICBcCi0gICAgICB1bnNpZ25lZCBpbnQgal8gPSAodW5zaWduZWQg
aW50KShfbik7ICAgXAotICAgICAgKF9sb2cyKSA9IDA7ICAgICAgICAgICAgICAgICAgICBcCi0g
ICAgICBpZiAoKGpfKSAmICgoal8pLTEpKSAgICAgICAgICAgIFwKLSAgICAgIChfbG9nMikgKz0g
MTsgICAgICAgICAgICAgICBcCi0gICAgICBpZiAoKGpfKSA+PiAxNikgICAgICAgICAgICAgICAg
IFwKLSAgICAgIChfbG9nMikgKz0gMTYsIChqXykgPj49IDE2OyBcCi0gICAgICBpZiAoKGpfKSA+
PiA4KSAgICAgICAgICAgICAgICAgIFwKLSAgICAgIChfbG9nMikgKz0gOCwgKGpfKSA+Pj0gODsg
ICBcCi0gICAgICBpZiAoKGpfKSA+PiA0KSAgICAgICAgICAgICAgICAgIFwKLSAgICAgIChfbG9n
MikgKz0gNCwgKGpfKSA+Pj0gNDsgICBcCi0gICAgICBpZiAoKGpfKSA+PiAyKSAgICAgICAgICAg
ICAgICAgIFwKLSAgICAgIChfbG9nMikgKz0gMiwgKGpfKSA+Pj0gMjsgICBcCi0gICAgICBpZiAo
KGpfKSA+PiAxKSAgICAgICAgICAgICAgICAgIFwKLSAgICAgIChfbG9nMikgKz0gMTsKLQotaW50
IEZhc3RMb2cyKHVuc2lnbmVkIGludCBpKSB7Ci0gICAgaW50IGxvZzI7Ci0gICAgRkFTVF9MT0cy
KGxvZzIsaSk7Ci0gICAgcmV0dXJuIGxvZzI7Ci19Ci0KLUxSVUxpc3QqIENhY2hlOjpnZXRMUlVM
aXN0Rm9yKENhY2hlZE9iamVjdCogbykKLXsKLSAgICBpbnQgYWNjZXNzQ291bnQgPSBvLT5hY2Nl
c3NDb3VudCgpOwotICAgIGludCBxdWV1ZUluZGV4OwotICAgIGlmIChhY2Nlc3NDb3VudCA9PSAw
KSB7Ci0gICAgICAgIHF1ZXVlSW5kZXggPSAwOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGludCBz
aXplTG9nID0gRmFzdExvZzIoby0+c2l6ZSgpKTsKLSAgICAgICAgcXVldWVJbmRleCA9IHNpemVM
b2cvby0+YWNjZXNzQ291bnQoKSAtIDE7Ci0gICAgICAgIGlmIChxdWV1ZUluZGV4IDwgMCkKLSAg
ICAgICAgICAgIHF1ZXVlSW5kZXggPSAwOwotICAgICAgICBpZiAocXVldWVJbmRleCA+PSBNQVhf
TFJVX0xJU1RTKQotICAgICAgICAgICAgcXVldWVJbmRleCA9IE1BWF9MUlVfTElTVFMtMTsKLSAg
ICB9Ci0gICAgaWYgKG1fTFJVTGlzdHMgPT0gMCkgewotICAgICAgICBtX0xSVUxpc3RzID0gbmV3
IExSVUxpc3QgW01BWF9MUlVfTElTVFNdOwotICAgIH0KLSAgICByZXR1cm4gJm1fTFJVTGlzdHNb
cXVldWVJbmRleF07Ci19Ci0KLXZvaWQgQ2FjaGU6OnJlbW92ZUZyb21MUlVMaXN0KENhY2hlZE9i
amVjdCAqb2JqZWN0KQotewotICAgIENhY2hlZE9iamVjdCAqbmV4dCA9IG9iamVjdC0+bV9uZXh0
SW5MUlVMaXN0OwotICAgIENhY2hlZE9iamVjdCAqcHJldiA9IG9iamVjdC0+bV9wcmV2SW5MUlVM
aXN0OwotICAgIGJvb2wgdW5jYWNoZWFibGUgPSBvYmplY3QtPnN0YXR1cygpID09IENhY2hlZE9i
amVjdDo6VW5jYWNoZWFibGU7Ci0gICAgCi0gICAgTFJVTGlzdCogbGlzdCA9IHVuY2FjaGVhYmxl
ID8gMCA6IGdldExSVUxpc3RGb3Iob2JqZWN0KTsKLSAgICBDYWNoZWRPYmplY3QgKiZoZWFkID0g
dW5jYWNoZWFibGUgPyBtX2hlYWRPZlVuY2FjaGVhYmxlTGlzdCA6IGxpc3QtPm1faGVhZDsKLSAg
ICAKLSAgICBpZiAobmV4dCA9PSAwICYmIHByZXYgPT0gMCAmJiBoZWFkICE9IG9iamVjdCkgewot
ICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIAotICAgIG9iamVjdC0+bV9uZXh0SW5MUlVMaXN0
ID0gMDsKLSAgICBvYmplY3QtPm1fcHJldkluTFJVTGlzdCA9IDA7Ci0gICAgCi0gICAgaWYgKG5l
eHQpCi0gICAgICAgIG5leHQtPm1fcHJldkluTFJVTGlzdCA9IHByZXY7Ci0gICAgZWxzZSBpZiAo
IXVuY2FjaGVhYmxlICYmIGxpc3QtPm1fdGFpbCA9PSBvYmplY3QpCi0gICAgICAgIGxpc3QtPm1f
dGFpbCA9IHByZXY7Ci0KLSAgICBpZiAocHJldikKLSAgICAgICAgcHJldi0+bV9uZXh0SW5MUlVM
aXN0ID0gbmV4dDsKLSAgICBlbHNlIGlmIChoZWFkID09IG9iamVjdCkKLSAgICAgICAgaGVhZCA9
IG5leHQ7Ci0gICAgCi0gICAgLS1tX2NvdW50T2ZMUlVBbmRVbmNhY2hlYWJsZUxpc3RzOwotICAg
IAotICAgIGlmICghdW5jYWNoZWFibGUpCi0gICAgICAgIG1fdG90YWxTaXplT2ZMUlVMaXN0cyAt
PSBvYmplY3QtPnNpemUoKTsKLX0KLQotdm9pZCBDYWNoZTo6bW92ZVRvSGVhZE9mTFJVTGlzdChD
YWNoZWRPYmplY3QgKm9iamVjdCkKLXsKLSAgICBpbnNlcnRJbkxSVUxpc3Qob2JqZWN0KTsKLX0K
LQotdm9pZCBDYWNoZTo6aW5zZXJ0SW5MUlVMaXN0KENhY2hlZE9iamVjdCAqb2JqZWN0KQotewot
ICAgIHJlbW92ZUZyb21MUlVMaXN0KG9iamVjdCk7Ci0gICAgCi0gICAgaWYgKCFvYmplY3QtPmFs
bG93SW5MUlVMaXN0KCkpCi0gICAgICAgIHJldHVybjsKLSAgICAKLSAgICBMUlVMaXN0KiBsaXN0
ID0gZ2V0TFJVTGlzdEZvcihvYmplY3QpOwotICAgIAotICAgIGJvb2wgdW5jYWNoZWFibGUgPSBv
YmplY3QtPnN0YXR1cygpID09IENhY2hlZE9iamVjdDo6VW5jYWNoZWFibGU7Ci0gICAgQ2FjaGVk
T2JqZWN0IComaGVhZCA9IHVuY2FjaGVhYmxlID8gbV9oZWFkT2ZVbmNhY2hlYWJsZUxpc3QgOiBs
aXN0LT5tX2hlYWQ7Ci0KLSAgICBvYmplY3QtPm1fbmV4dEluTFJVTGlzdCA9IGhlYWQ7Ci0gICAg
aWYgKGhlYWQpCi0gICAgICAgIGhlYWQtPm1fcHJldkluTFJVTGlzdCA9IG9iamVjdDsKLSAgICBo
ZWFkID0gb2JqZWN0OwotICAgIAotICAgIGlmIChvYmplY3QtPm1fbmV4dEluTFJVTGlzdCA9PSAw
ICYmICF1bmNhY2hlYWJsZSkKLSAgICAgICAgbGlzdC0+bV90YWlsID0gb2JqZWN0OwotICAgIAot
ICAgICsrbV9jb3VudE9mTFJVQW5kVW5jYWNoZWFibGVMaXN0czsKLSAgICAKLSAgICBpZiAoIXVu
Y2FjaGVhYmxlKQotICAgICAgICBtX3RvdGFsU2l6ZU9mTFJVTGlzdHMgKz0gb2JqZWN0LT5zaXpl
KCk7Ci19Ci0KLWJvb2wgQ2FjaGU6OmFkanVzdFNpemUoQ2FjaGVkT2JqZWN0ICpvYmplY3QsIGlu
dCBkZWx0YSkKLXsKLSAgICBpZiAob2JqZWN0LT5zdGF0dXMoKSA9PSBDYWNoZWRPYmplY3Q6OlVu
Y2FjaGVhYmxlKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAob2JqZWN0LT5tX25l
eHRJbkxSVUxpc3QgPT0gMCAmJiBvYmplY3QtPm1fcHJldkluTFJVTGlzdCA9PSAwICYmCi0gICAg
ICAgIGdldExSVUxpc3RGb3Iob2JqZWN0KS0+bV9oZWFkICE9IG9iamVjdCkKLSAgICAgICAgcmV0
dXJuIGZhbHNlOwotICAgIAotICAgIG1fdG90YWxTaXplT2ZMUlVMaXN0cyArPSBkZWx0YTsKLSAg
ICByZXR1cm4gZGVsdGEgIT0gMDsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0KLQotQ2FjaGVkT2JqZWN0Q2xpZW50ICpDYWNoZWRPYmplY3RDbGllbnRXYWxr
ZXI6Om5leHQoKQotewotICAgIC8vIE9ubHkgYWR2YW5jZSBpZiB3ZSBhbHJlYWR5IHJldHVybmVk
IHRoaXMgaXRlbS4KLSAgICAvLyBUaGlzIGhhbmRsZXMgY2FzZXMgd2hlcmUgdGhlIGN1cnJlbnQg
aXRlbSBpcyByZW1vdmVkLCBhbmQgcHJldmVudHMgdXMgZnJvbSBza2lwcGluZyB0aGUgbmV4dCBp
dGVtLgotICAgIC8vIFRoZSBpdGVyYXRvciBhdXRvbWF0aWNhbGx5IGdldHMgYWR2YW5jZWQgdG8g
dGhlIG5leHQgaXRlbSwgYW5kIHdlIG1ha2Ugc3VyZSB3ZSByZXR1cm4gaXQuCi0gICAgaWYgKF9j
dXJyZW50ID09IF9pdGVyYXRvci5jdXJyZW50KCkpCi0gICAgICAgICsrX2l0ZXJhdG9yOwotICAg
IF9jdXJyZW50ID0gX2l0ZXJhdG9yLmN1cnJlbnQoKTsKLSAgICByZXR1cm4gX2N1cnJlbnQ7Ci19
Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUNhY2hlZE9i
amVjdENsaWVudDo6fkNhY2hlZE9iamVjdENsaWVudCgpIHsgfQotdm9pZCBDYWNoZWRPYmplY3RD
bGllbnQ6OnNldFBpeG1hcChjb25zdCBRUGl4bWFwICYsIGNvbnN0IFFSZWN0JiwgQ2FjaGVkSW1h
Z2UgKikge30KLXZvaWQgQ2FjaGVkT2JqZWN0Q2xpZW50OjpzZXRTdHlsZVNoZWV0KGNvbnN0IERP
TTo6RE9NU3RyaW5nICYvKnVybCovLCBjb25zdCBET006OkRPTVN0cmluZyAmLypzaGVldCovKSB7
fQotI2lmbmRlZiBLSFRNTF9OT19YQkwKLXZvaWQgQ2FjaGVkT2JqZWN0Q2xpZW50OjpzZXRYQkxE
b2N1bWVudChjb25zdCBET006OkRPTVN0cmluZyYgdXJsLCBYQkw6OlhCTERvY3VtZW50SW1wbCog
ZG9jKSB7fQotI2VuZGlmCi12b2lkIENhY2hlZE9iamVjdENsaWVudDo6bm90aWZ5RmluaXNoZWQo
Q2FjaGVkT2JqZWN0ICogLypmaW5pc2hlZE9iaiovKSB7fQotCi1DYWNoZTo6U3RhdGlzdGljcyBD
YWNoZTo6Z2V0U3RhdGlzdGljcygpCi17Ci0gICAgU3RhdGlzdGljcyBzdGF0czsKLQotICAgIGlm
ICghY2FjaGUpCi0gICAgICAgIHJldHVybiBzdGF0czsKLQotICAgIFFEaWN0SXRlcmF0b3I8Q2Fj
aGVkT2JqZWN0PiBpKCpjYWNoZSk7Ci0gICAgZm9yIChpLnRvRmlyc3QoKTsgaS5jdXJyZW50KCk7
ICsraSkgewotICAgICAgICBDYWNoZWRPYmplY3QgKm8gPSBpLmN1cnJlbnQoKTsKLSAgICAgICAg
c3dpdGNoIChvLT50eXBlKCkpIHsKLSAgICAgICAgICAgIGNhc2UgQ2FjaGVkT2JqZWN0OjpJbWFn
ZToKLSAgICAgICAgICAgICAgICBzdGF0cy5pbWFnZXMuY291bnQrKzsKLSAgICAgICAgICAgICAg
ICBzdGF0cy5pbWFnZXMuc2l6ZSArPSBvLT5zaXplKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7
Ci0KLSAgICAgICAgICAgIGNhc2UgQ2FjaGVkT2JqZWN0OjpDU1NTdHlsZVNoZWV0OgotICAgICAg
ICAgICAgICAgIHN0YXRzLnN0eWxlU2hlZXRzLmNvdW50Kys7Ci0gICAgICAgICAgICAgICAgc3Rh
dHMuc3R5bGVTaGVldHMuc2l6ZSArPSBvLT5zaXplKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7
Ci0KLSAgICAgICAgICAgIGNhc2UgQ2FjaGVkT2JqZWN0OjpTY3JpcHQ6Ci0gICAgICAgICAgICAg
ICAgc3RhdHMuc2NyaXB0cy5jb3VudCsrOwotICAgICAgICAgICAgICAgIHN0YXRzLnNjcmlwdHMu
c2l6ZSArPSBvLT5zaXplKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0jaWZkZWYgS0hUTUxf
WFNMVAotICAgICAgICAgICAgY2FzZSBDYWNoZWRPYmplY3Q6OlhTTFN0eWxlU2hlZXQ6Ci0gICAg
ICAgICAgICAgICAgc3RhdHMueHNsU3R5bGVTaGVldHMuY291bnQrKzsKLSAgICAgICAgICAgICAg
ICBzdGF0cy54c2xTdHlsZVNoZWV0cy5zaXplICs9IG8tPnNpemUoKTsKLSAgICAgICAgICAgICAg
ICBicmVhazsKLSNlbmRpZgotI2lmbmRlZiBLSFRNTF9OT19YQkwKLSAgICAgICAgICAgIGNhc2Ug
Q2FjaGVkT2JqZWN0OjpYQkw6Ci0gICAgICAgICAgICAgICAgc3RhdHMueGJsRG9jcy5jb3VudCsr
OwotICAgICAgICAgICAgICAgIHN0YXRzLnhibERvY3Muc2l6ZSArPSBvLT5zaXplKCk7Ci0gICAg
ICAgICAgICAgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAg
ICAgICAgICAgc3RhdHMub3RoZXIuY291bnQrKzsKLSAgICAgICAgICAgICAgICBzdGF0cy5vdGhl
ci5zaXplICs9IG8tPnNpemUoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4g
c3RhdHM7Ci19Ci0KLXZvaWQgQ2FjaGU6OmZsdXNoQWxsKCkKLXsKLSAgICBpZiAoIWNhY2hlKQot
ICAgICAgICByZXR1cm47Ci0KLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIFFEaWN0SXRlcmF0b3I8
Q2FjaGVkT2JqZWN0PiBpKCpjYWNoZSk7Ci0gICAgICAgIENhY2hlZE9iamVjdCAqbyA9IGkudG9G
aXJzdCgpOwotICAgICAgICBpZiAoIW8pCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgcmVt
b3ZlQ2FjaGVFbnRyeShvKTsKLSAgICB9Ci19Ci0KLXZvaWQgQ2FjaGU6OnNldENhY2hlRGlzYWJs
ZWQoYm9vbCBkaXNhYmxlZCkKLXsKLSAgICBjYWNoZURpc2FibGVkID0gZGlzYWJsZWQ7Ci0gICAg
aWYgKGRpc2FibGVkKQotICAgICAgICBmbHVzaEFsbCgpOwotfQorfTsKSW5kZXg6IG1pc2MvUmVx
dWVzdC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIG1pc2MvUmVxdWVzdC5oCShyZXZpc2lvbiAxMTk0OCkKKysr
IG1pc2MvUmVxdWVzdC5oCSh3b3JraW5nIGNvcHkpCkBAIC0yMyw0ODggKzIzLDE2IEBACiAgICAg
VGhpcyBjbGFzcyBwcm92aWRlcyBhbGwgZnVuY3Rpb25hbGl0eSBuZWVkZWQgZm9yIGxvYWRpbmcg
aW1hZ2VzLCBzdHlsZSBzaGVldHMgYW5kIGh0bWwKICAgICBwYWdlcyBmcm9tIHRoZSB3ZWIuIEl0
IGhhcyBhIG1lbW9yeSBjYWNoZSBmb3IgdGhlc2Ugb2JqZWN0cy4KICovCi0jaWZuZGVmIF9raHRt
bF9sb2FkZXJfaAotI2RlZmluZSBfa2h0bWxfbG9hZGVyX2gKKyNpZm5kZWYgS0hUTUxfUmVxdWVz
dF9oCisjZGVmaW5lIEtIVE1MX1JlcXVlc3RfaAogCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2lu
Y2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDx0aW1lLmg+Ci0KLSNpbmNsdWRl
ICJsb2FkZXJfY2xpZW50LmgiCi0jaWZkZWYgSEFWRV9MSUJKUEVHCi0jaW5jbHVkZSAibG9hZGVy
X2pwZWcuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8cXB0cmxp
c3QuaD4KLSNpbmNsdWRlIDxxb2JqZWN0Lmg+Ci0jaW5jbHVkZSA8cXB0cmRpY3QuaD4KLSNpbmNs
dWRlIDxxZGljdC5oPgotI2luY2x1ZGUgPHFwaXhtYXAuaD4KICNpbmNsdWRlIDxxYnVmZmVyLmg+
Ci0jaW5jbHVkZSA8cXN0cmluZ2xpc3QuaD4KLSNpbmNsdWRlIDxxdGV4dGNvZGVjLmg+Ci0KLSNp
bmNsdWRlIDxrdXJsLmg+Ci0jaW5jbHVkZSA8a2lvL2dsb2JhbC5oPgotCi0jaW5jbHVkZSA8a2h0
bWxfc2V0dGluZ3MuaD4KLSNpbmNsdWRlIDxkb20vZG9tX3N0cmluZy5oPgotI2luY2x1ZGUgIkRv
Y1B0ci5oIgotCi1jbGFzcyBLSFRNTFBhcnQ7Ci0KLW5hbWVzcGFjZSBLSU8gewotICBjbGFzcyBK
b2I7Ci0gIGNsYXNzIFRyYW5zZmVySm9iOwotfQotCi1uYW1lc3BhY2UgRE9NCi17Ci0gICAgY2xh
c3MgQ1NTU3R5bGVTaGVldEltcGw7Ci0gICAgY2xhc3MgRG9jdW1lbnRJbXBsOwotfTsKLQotCi1j
bGFzcyBLV1FMb2FkZXI7Ci0KLSNpZiBfX09CSkNfXwotQGNsYXNzIE5TRGF0YTsKLUBjbGFzcyBO
U1VSTFJlc3BvbnNlOwotI2Vsc2UKLWNsYXNzIE5TRGF0YTsKLWNsYXNzIE5TVVJMUmVzcG9uc2U7
Ci0jZW5kaWYKLQogCiBuYW1lc3BhY2Uga2h0bWwKIHsKICAgICBjbGFzcyBDYWNoZWRPYmplY3Q7
Ci0gICAgY2xhc3MgUmVxdWVzdDsKICAgICBjbGFzcyBEb2NMb2FkZXI7Ci0gICAgY2xhc3MgRGVj
b2RlcjsKLQotICNkZWZpbmUgTUFYX0xSVV9MSVNUUyAyMAotICAgIAotICAgIHN0cnVjdCBMUlVM
aXN0IHsKLSAgICAgICAgQ2FjaGVkT2JqZWN0KiBtX2hlYWQ7Ci0gICAgICAgIENhY2hlZE9iamVj
dCogbV90YWlsOwotICAgIAotICAgICAgICBMUlVMaXN0KCk7Ci0gICAgICAgIH5MUlVMaXN0KCk7
Ci0gICAgfTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBAaW50ZXJuYWwKLSAgICAgKgotICAgICAq
IEEgY2FjaGVkIG9iamVjdC4gQ2xhc3NlcyB3aG8gd2FudCB0byB1c2UgdGhpcyBvYmplY3Qgc2hv
dWxkIGRlcml2ZQotICAgICAqIGZyb20gQ2FjaGVkT2JqZWN0Q2xpZW50LCB0byBnZXQgdGhlIGZ1
bmN0aW9uIGNhbGxzIGluIGNhc2UgdGhlIHJlcXVlc3RlZCBkYXRhIGhhcyBhcnJpdmVkLgotICAg
ICAqCi0gICAgICogVGhpcyBjbGFzcyBhbHNvIGRvZXMgdGhlIGFjdHVhbCBjb21tdW5pY2F0aW9u
IHdpdGgga2lvIGFuZCBsb2FkcyB0aGUgZmlsZS4KLSAgICAgKi8KLSAgICBjbGFzcyBDYWNoZWRP
YmplY3QKLSAgICB7Ci0gICAgcHVibGljOgotCWVudW0gVHlwZSB7Ci0JICAgIEltYWdlLAotCSAg
ICBDU1NTdHlsZVNoZWV0LAotCSAgICBTY3JpcHQKLSNpZmRlZiBLSFRNTF9YU0xUCi0gICAgICAg
ICAgICAsIFhTTFN0eWxlU2hlZXQKLSNlbmRpZgotI2lmbmRlZiBLSFRNTF9OT19YQkwKLSAgICAg
ICAgICAgICwgWEJMCi0jZW5kaWYKLQl9OwotCi0JZW51bSBTdGF0dXMgewotCSAgICBOb3RDYWNo
ZWQsICAgIC8vIHRoaXMgVVJMIGlzIG5vdCBjYWNoZWQKLQkgICAgVW5rbm93biwgICAgICAvLyBs
ZXQgaW1hZ2VjYWNoZSBkZWNpZGUgd2hhdCB0byBkbyB3aXRoIGl0Ci0JICAgIE5ldywgICAgICAg
ICAgLy8gaW5zZXJ0aW5nIG5ldyBpbWFnZQotICAgICAgICBQZW5kaW5nLCAgICAgIC8vIG9ubHkg
cGFydGlhbGx5IGxvYWRlZAotCSAgICBQZXJzaXN0ZW50LCAgIC8vIG5ldmVyIGRlbGV0ZSB0aGlz
IHBpeG1hcAotCSAgICBDYWNoZWQsICAgICAgIC8vIHJlZ3VsYXIgY2FzZQotCSAgICBVbmNhY2hl
YWJsZSAgIC8vIHRvbyBiaWcgdG8gYmUgY2FjaGVkLAotCX07ICAJICAgICAgICAgIC8vIHdpbGwg
YmUgZGVzdHJveWVkIGFzIHNvb24gYXMgcG9zc2libGUKLQotCUNhY2hlZE9iamVjdChjb25zdCBE
T006OkRPTVN0cmluZyAmdXJsLCBUeXBlIHR5cGUsIEtJTzo6Q2FjaGVDb250cm9sIF9jYWNoZVBv
bGljeSwgdGltZV90IF9leHBpcmVEYXRlLCBpbnQgc2l6ZSA9IDApCi0JewotCSAgICBtX3VybCA9
IHVybDsKLQkgICAgbV90eXBlID0gdHlwZTsKLQkgICAgbV9zdGF0dXMgPSBQZW5kaW5nOwotCSAg
ICBtX3NpemUgPSBzaXplOwotCSAgICBtX2ZyZWUgPSBmYWxzZTsKLQkgICAgbV9jYWNoZVBvbGlj
eSA9IF9jYWNoZVBvbGljeTsKLQkgICAgbV9yZXF1ZXN0ID0gMDsKLSAgICAgICAgbV9yZXNwb25z
ZSA9IDA7Ci0gICAgICAgIG1fYWxsRGF0YSA9IDA7Ci0JICAgIG1fZXhwaXJlRGF0ZSA9IF9leHBp
cmVEYXRlOwotICAgICAgICBtX2RlbGV0ZWQgPSBmYWxzZTsKLSAgICAgICAgbV9leHBpcmVEYXRl
Q2hhbmdlZCA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgbV9hY2Nlc3NDb3VudCA9IDA7Ci0g
ICAgICAgIAotICAgICAgICBtX25leHRJbkxSVUxpc3QgPSAwOwotICAgICAgICBtX3ByZXZJbkxS
VUxpc3QgPSAwOwotCX0KLQl2aXJ0dWFsIH5DYWNoZWRPYmplY3QoKTsKLQotCXZpcnR1YWwgdm9p
ZCBzZXRDaGFyc2V0KCBjb25zdCBRU3RyaW5nICZjaHMgKSB7fQotCXZpcnR1YWwgdm9pZCBkYXRh
KCBRQnVmZmVyICZidWZmZXIsIGJvb2wgZW9mKSA9IDA7Ci0JdmlydHVhbCB2b2lkIGVycm9yKCBp
bnQgZXJyLCBjb25zdCBjaGFyICp0ZXh0ICkgPSAwOwotCi0JY29uc3QgRE9NOjpET01TdHJpbmcg
JnVybCgpIGNvbnN0IHsgcmV0dXJuIG1fdXJsOyB9Ci0JVHlwZSB0eXBlKCkgY29uc3QgeyByZXR1
cm4gbV90eXBlOyB9Ci0KLQl2aXJ0dWFsIHZvaWQgcmVmKENhY2hlZE9iamVjdENsaWVudCAqY29u
c3VtZXIpOwotCXZpcnR1YWwgdm9pZCBkZXJlZihDYWNoZWRPYmplY3RDbGllbnQgKmNvbnN1bWVy
KTsKLQotCWludCBjb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1fY2xpZW50cy5jb3VudCgpOyB9Ci0K
LQlTdGF0dXMgc3RhdHVzKCkgY29uc3QgeyByZXR1cm4gbV9zdGF0dXM7IH0KLQotCWludCBzaXpl
KCkgY29uc3QgeyByZXR1cm4gbV9zaXplOyB9Ci0KLSAgICAgICAgYm9vbCBpc0xvYWRlZCgpIGNv
bnN0IHsgcmV0dXJuICFtX2xvYWRpbmc7IH0KLSAgICAgICAgCi0gICAgICAgIHZpcnR1YWwgYm9v
bCBpc0ltYWdlKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLQotICAgIGludCBhY2Nlc3NDb3Vu
dCgpIGNvbnN0IHsgcmV0dXJuIG1fYWNjZXNzQ291bnQ7IH0KLSAgICB2b2lkIGluY3JlYXNlQWNj
ZXNzQ291bnQoKSB7IG1fYWNjZXNzQ291bnQrKzsgfQotICAgIAotCS8qKgotCSAqIGNvbXB1dGVz
IHRoZSBzdGF0dXMgb2YgYW4gb2JqZWN0IGFmdGVyIGxvYWRpbmcuCi0JICogdGhlIHJlc3VsdCBk
ZXBlbmRzIG9uIHRoZSBvYmplY3RzIHNpemUgYW5kIHRoZSBzaXplIG9mIHRoZSBjYWNoZQotCSAq
IGFsc28gdXBkYXRlcyB0aGUgZXhwaXJlIGRhdGUgb24gdGhlIGNhY2hlIGVudHJ5IGZpbGUKLQkg
Ki8KLQl2b2lkIGZpbmlzaCgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgYnkg
dGhlIGNhY2hlIGlmIHRoZSBvYmplY3QgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBjYWNoZSBk
aWN0Ci0gICAgICAgICAqIHdoaWxlIHN0aWxsIGJlaW5nIHJlZmVyZW5jZWQuIFRoaXMgbWVhbnMg
dGhlIG9iamVjdCBzaG91bGQga2lsbCBpdHNlbGYKLSAgICAgICAgICogaWYgaXRzIHJlZmVyZW5j
ZSBjb3VudGVyIGRyb3BzIGRvd24gdG8gemVyby4KLSAgICAgICAgICovCi0gICAgICAgIHZvaWQg
c2V0RnJlZSggYm9vbCBiICkgeyBtX2ZyZWUgPSBiOyB9Ci0KLSAgICAgICAgS0lPOjpDYWNoZUNv
bnRyb2wgY2FjaGVQb2xpY3koKSBjb25zdCB7IHJldHVybiBtX2NhY2hlUG9saWN5OyB9Ci0KLSAg
ICAgICAgdm9pZCBzZXRSZXF1ZXN0KFJlcXVlc3QgKl9yZXF1ZXN0KTsKLQotICAgICAgICBOU1VS
TFJlc3BvbnNlICpyZXNwb25zZSgpIGNvbnN0IHsgcmV0dXJuIG1fcmVzcG9uc2U7IH0KLSAgICAg
ICAgdm9pZCBzZXRSZXNwb25zZShOU1VSTFJlc3BvbnNlICpyZXNwb25zZSk7Ci0gICAgICAgIE5T
RGF0YSAqYWxsRGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1fYWxsRGF0YTsgfQotICAgICAgICB2b2lk
IHNldEFsbERhdGEgKE5TRGF0YSAqZGF0YSk7Ci0KLSAgICAgICAgYm9vbCBjYW5EZWxldGUoKSBj
b25zdCB7IHJldHVybiAobV9jbGllbnRzLmNvdW50KCkgPT0gMCAmJiAhbV9yZXF1ZXN0KTsgfQot
Ci0Jdm9pZCBzZXRFeHBpcmVEYXRlKHRpbWVfdCBfZXhwaXJlRGF0ZSwgYm9vbCBjaGFuZ2VIdHRw
Q2FjaGUpOwotCQotCWJvb2wgaXNFeHBpcmVkKCkgY29uc3Q7Ci0KLSAgICAgICAgdmlydHVhbCBi
b29sIHNjaGVkdWxlKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLQotICAgICAgICAvKioKLSAg
ICAgICAgICogTGlzdCBvZiBhY2NlcHRhYmxlIG1pbWV0eXBlcyBzZXBlcmF0ZWQgYnkgIiwiLiBB
IG1pbWV0eXBlIG1heSBjb250YWluIGEgd2lsZGNhcmQuCi0gICAgICAgICAqLwotICAgICAgICAv
LyBlLmcuICJ0ZXh0LyoiCi0gICAgICAgIFFTdHJpbmcgYWNjZXB0KCkgY29uc3QgeyByZXR1cm4g
bV9hY2NlcHQ7IH0KLSAgICAgICAgdm9pZCBzZXRBY2NlcHQoY29uc3QgUVN0cmluZyAmX2FjY2Vw
dCkgeyBtX2FjY2VwdCA9IF9hY2NlcHQ7IH0KLQotICAgIHByb3RlY3RlZDoKLSAgICAgICAgdm9p
ZCBzZXRTaXplKGludCBzaXplKTsKLSAgICAgICAgCi0gICAgICAgIFFQdHJEaWN0PENhY2hlZE9i
amVjdENsaWVudD4gbV9jbGllbnRzOwotCi0JRE9NOjpET01TdHJpbmcgbV91cmw7Ci0gICAgICAg
IFFTdHJpbmcgbV9hY2NlcHQ7Ci0gICAgICAgIFJlcXVlc3QgKm1fcmVxdWVzdDsKLSAgICAgICAg
TlNVUkxSZXNwb25zZSAqbV9yZXNwb25zZTsKLSAgICAgICAgTlNEYXRhICptX2FsbERhdGE7Ci0J
VHlwZSBtX3R5cGU7Ci0JU3RhdHVzIG1fc3RhdHVzOwotICAgIHByaXZhdGU6Ci0JaW50IG1fc2l6
ZTsKLSAgICBpbnQgbV9hY2Nlc3NDb3VudDsKLSAgICAKLSAgICBwcm90ZWN0ZWQ6Ci0JdGltZV90
IG1fZXhwaXJlRGF0ZTsKLQlLSU86OkNhY2hlQ29udHJvbCBtX2NhY2hlUG9saWN5OwotICAgICAg
ICBib29sIG1fZnJlZSA6IDE7Ci0gICAgICAgIGJvb2wgbV9kZWxldGVkIDogMTsKLSAgICAgICAg
Ym9vbCBtX2xvYWRpbmcgOiAxOwotICAgICAgICBib29sIG1fZXhwaXJlRGF0ZUNoYW5nZWQgOiAx
OwotICAgIAotICAgIHByaXZhdGU6Ci0gICAgICAgIGJvb2wgYWxsb3dJbkxSVUxpc3QoKSB7IHJl
dHVybiBjYW5EZWxldGUoKSAmJiBzdGF0dXMoKSAhPSBQZXJzaXN0ZW50OyB9Ci0gICAgICAgIAot
ICAgICAgICBDYWNoZWRPYmplY3QgKm1fbmV4dEluTFJVTGlzdDsKLSAgICAgICAgQ2FjaGVkT2Jq
ZWN0ICptX3ByZXZJbkxSVUxpc3Q7Ci0gICAgICAgIGZyaWVuZCBjbGFzcyBDYWNoZTsKLSAgICB9
OwotCi0KLSAgICAvKioKLSAgICAgKiBhIGNhY2hlZCBzdHlsZSBzaGVldAotICAgICAqLwotICAg
IGNsYXNzIENhY2hlZENTU1N0eWxlU2hlZXQgOiBwdWJsaWMgQ2FjaGVkT2JqZWN0Ci0gICAgewot
ICAgIHB1YmxpYzoKLQlDYWNoZWRDU1NTdHlsZVNoZWV0KERvY0xvYWRlciogZGwsIGNvbnN0IERP
TTo6RE9NU3RyaW5nICZ1cmwsIEtJTzo6Q2FjaGVDb250cm9sIGNhY2hlUG9saWN5LCB0aW1lX3Qg
X2V4cGlyZURhdGUsIGNvbnN0IFFTdHJpbmcmIGNoYXJzZXQpOwotCUNhY2hlZENTU1N0eWxlU2hl
ZXQoY29uc3QgRE9NOjpET01TdHJpbmcgJnVybCwgY29uc3QgUVN0cmluZyAmc3R5bGVzaGVldF9k
YXRhKTsKLQl2aXJ0dWFsIH5DYWNoZWRDU1NTdHlsZVNoZWV0KCk7Ci0KLQljb25zdCBET006OkRP
TVN0cmluZyAmc2hlZXQoKSBjb25zdCB7IHJldHVybiBtX3NoZWV0OyB9Ci0KLQl2aXJ0dWFsIHZv
aWQgcmVmKENhY2hlZE9iamVjdENsaWVudCAqY29uc3VtZXIpOwotCXZpcnR1YWwgdm9pZCBkZXJl
ZihDYWNoZWRPYmplY3RDbGllbnQgKmNvbnN1bWVyKTsKLQotICAgICAgICB2aXJ0dWFsIHZvaWQg
c2V0Q2hhcnNldCggY29uc3QgUVN0cmluZyAmY2hzICk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBk
YXRhKCBRQnVmZmVyICZidWZmZXIsIGJvb2wgZW9mICk7Ci0JdmlydHVhbCB2b2lkIGVycm9yKCBp
bnQgZXJyLCBjb25zdCBjaGFyICp0ZXh0ICk7Ci0KLSAgICAgICAgdmlydHVhbCBib29sIHNjaGVk
dWxlKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotCi0Jdm9pZCBjaGVja05vdGlmeSgpOwotCi0g
ICAgcHJvdGVjdGVkOgotCURPTTo6RE9NU3RyaW5nIG1fc2hlZXQ7Ci0gICAgICAgIFFUZXh0Q29k
ZWMqIG1fY29kZWM7Ci0gICAgfTsKLQotICAgIC8qKgotICAgICAqIGEgY2FjaGVkIHNjcmlwdAot
ICAgICAqLwotICAgIGNsYXNzIENhY2hlZFNjcmlwdCA6IHB1YmxpYyBDYWNoZWRPYmplY3QKLSAg
ICB7Ci0gICAgcHVibGljOgotCUNhY2hlZFNjcmlwdChEb2NMb2FkZXIqIGRsLCBjb25zdCBET006
OkRPTVN0cmluZyAmdXJsLCBLSU86OkNhY2hlQ29udHJvbCBjYWNoZVBvbGljeSwgdGltZV90IF9l
eHBpcmVEYXRlLCBjb25zdCBRU3RyaW5nJiBjaGFyc2V0KTsKLQlDYWNoZWRTY3JpcHQoY29uc3Qg
RE9NOjpET01TdHJpbmcgJnVybCwgY29uc3QgUVN0cmluZyAmc2NyaXB0X2RhdGEpOwotCXZpcnR1
YWwgfkNhY2hlZFNjcmlwdCgpOwotCi0JY29uc3QgRE9NOjpET01TdHJpbmcgJnNjcmlwdCgpIGNv
bnN0IHsgcmV0dXJuIG1fc2NyaXB0OyB9Ci0KLQl2aXJ0dWFsIHZvaWQgcmVmKENhY2hlZE9iamVj
dENsaWVudCAqY29uc3VtZXIpOwotCXZpcnR1YWwgdm9pZCBkZXJlZihDYWNoZWRPYmplY3RDbGll
bnQgKmNvbnN1bWVyKTsKLQotICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0Q2hhcnNldCggY29uc3Qg
UVN0cmluZyAmY2hzICk7Ci0JdmlydHVhbCB2b2lkIGRhdGEoIFFCdWZmZXIgJmJ1ZmZlciwgYm9v
bCBlb2YgKTsKLQl2aXJ0dWFsIHZvaWQgZXJyb3IoIGludCBlcnIsIGNvbnN0IGNoYXIgKnRleHQg
KTsKLQotICAgICAgICB2aXJ0dWFsIGJvb2wgc2NoZWR1bGUoKSBjb25zdCB7IHJldHVybiBmYWxz
ZTsgfQotICAgICAgICAKLSAgICAgICAgYm9vbCBlcnJvck9jY3VycmVkKCkgY29uc3QgeyByZXR1
cm4gbV9lcnJvck9jY3VycmVkOyB9Ci0KLQl2b2lkIGNoZWNrTm90aWZ5KCk7Ci0KLSAgICBwcm90
ZWN0ZWQ6Ci0JRE9NOjpET01TdHJpbmcgbV9zY3JpcHQ7Ci0gICAgICAgIFFUZXh0Q29kZWMqIG1f
Y29kZWM7Ci0gICAgICAgIGJvb2wgbV9lcnJvck9jY3VycmVkOwotICAgIH07Ci0KLSAgICBjbGFz
cyBJbWFnZVNvdXJjZTsKLQotICAgIGNsYXNzIENhY2hlZEltYWdlOwotICAgIAotICAgIGNsYXNz
IENhY2hlZEltYWdlQ2FsbGJhY2sKLSAgICB7Ci0gICAgcHVibGljOgotICAgICAgICBDYWNoZWRJ
bWFnZUNhbGxiYWNrIChDYWNoZWRJbWFnZSAqYykgOiBjYWNoZWRJbWFnZShjKSwgcmVmQ291bnQo
MSksIGhlYWRlclJlY2VpdmVkKGZhbHNlKSB7fTsKLQotICAgICAgICB2b2lkIHJlZigpIHsgcmVm
Q291bnQrKzsgfQotICAgICAgICB2b2lkIGRlcmVmKCkgeyBpZiAoLS1yZWZDb3VudCA9PSAwKSBk
ZWxldGUgdGhpczsgfQotICAgICAgICAKLSAgICAgICAgdm9pZCBub3RpZnlVcGRhdGUoKTsKLSAg
ICAgICAgdm9pZCBub3RpZnlGaW5pc2hlZCgpOwotICAgICAgICB2b2lkIG5vdGlmeURlY29kaW5n
RXJyb3IoKTsKLSAgICAgICAgdm9pZCBjbGVhcigpOwotICAgICAgICB2b2lkIGhhbmRsZUVycm9y
KCk7Ci0gICAgICAgIAotICAgIHByaXZhdGU6Ci0gICAgICAgIENhY2hlZEltYWdlICpjYWNoZWRJ
bWFnZTsKLSAgICAgICAgdWludCByZWZDb3VudDsKLQlib29sIGhlYWRlclJlY2VpdmVkOwotICAg
IH07Ci0gICAgICAgIAotICAgIC8qKgotICAgICAqIGEgY2FjaGVkIGltYWdlCi0gICAgICovCi0g
ICAgY2xhc3MgQ2FjaGVkSW1hZ2UgOiBwdWJsaWMgUU9iamVjdCwgcHVibGljIENhY2hlZE9iamVj
dAotICAgIHsKLQlRX09CSkVDVAotICAgIHB1YmxpYzoKLQlDYWNoZWRJbWFnZShEb2NMb2FkZXIq
IGRsLCBjb25zdCBET006OkRPTVN0cmluZyAmdXJsLCBLSU86OkNhY2hlQ29udHJvbCBjYWNoZVBv
bGljeSwgdGltZV90IF9leHBpcmVEYXRlKTsKLQl2aXJ0dWFsIH5DYWNoZWRJbWFnZSgpOwotCi0J
Y29uc3QgUVBpeG1hcCAmcGl4bWFwKCkgY29uc3Q7Ci0JY29uc3QgUVBpeG1hcCAmdGlsZWRfcGl4
bWFwKGNvbnN0IFFDb2xvciYgYmcpOwotCi0gICAgICAgIFFTaXplIHBpeG1hcF9zaXplKCkgY29u
c3Q7ICAgIC8vIHJldHVybnMgdGhlIHNpemUgb2YgdGhlIGNvbXBsZXRlIChpLmUuIHdoZW4gZmlu
aXNoZWQpIGxvYWRpbmcKLSAgICAgICAgUVJlY3QgdmFsaWRfcmVjdCgpIGNvbnN0OyAgICAgLy8g
cmV0dXJucyB0aGUgcmVjdGFuZ2xlIG9mIHBpeG1hcCB0aGF0IGhhcyBiZWVuIGxvYWRlZCBhbHJl
YWR5Ci0KLSAgICAgICAgdm9pZCByZWYoQ2FjaGVkT2JqZWN0Q2xpZW50ICpjb25zdW1lcik7Ci0J
dmlydHVhbCB2b2lkIGRlcmVmKENhY2hlZE9iamVjdENsaWVudCAqY29uc3VtZXIpOwotCi0Jdmly
dHVhbCB2b2lkIGRhdGEoIFFCdWZmZXIgJmJ1ZmZlciwgYm9vbCBlb2YgKTsKLQl2aXJ0dWFsIHZv
aWQgZXJyb3IoIGludCBlcnIsIGNvbnN0IGNoYXIgKnRleHQgKTsKIAotICAgICAgICBib29sIGlz
VHJhbnNwYXJlbnQoKSBjb25zdCB7IHJldHVybiBpc0Z1bGx5VHJhbnNwYXJlbnQ7IH0KLSAgICAg
ICAgYm9vbCBpc0Vycm9ySW1hZ2UoKSBjb25zdCB7IHJldHVybiBlcnJvck9jY3VyZWQ7IH0KLQot
ICAgICAgICB2b2lkIHNldFNob3dBbmltYXRpb25zKCBLSFRNTFNldHRpbmdzOjpLQW5pbWF0aW9u
QWR2aWNlICk7Ci0KLSAgICAgICAgdmlydHVhbCBib29sIHNjaGVkdWxlKCkgY29uc3QgeyByZXR1
cm4gdHJ1ZTsgfQotCi0Jdm9pZCBjaGVja05vdGlmeSgpOwotICAgICAgICAKLSAgICAgICAgdmly
dHVhbCBib29sIGlzSW1hZ2UoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0KLQl2b2lkIGNsZWFy
KCk7Ci0gICAgICAgIAotICAgIHByaXZhdGU6Ci0gICAgICAgIHZvaWQgZG9fbm90aWZ5KGNvbnN0
IFFQaXhtYXAmIHAsIGNvbnN0IFFSZWN0JiByKTsKLQotICAgICAgICBRUGl4bWFwKiBwOwotCVFQ
aXhtYXAqIGJnOwotICAgICAgICBRUmdiIGJnQ29sb3I7Ci0gICAgICAgIG11dGFibGUgUVBpeG1h
cCogcGl4UGFydDsKLQotICAgICAgICBJbWFnZVNvdXJjZSogaW1nU291cmNlOwotICAgICAgICBj
b25zdCBjaGFyKiBmb3JtYXRUeXBlOyAgLy8gSXMgdGhlIG5hbWUgb2YgdGhlIG1vdmllIGZvcm1h
dCB0eXBlCi0KLQlpbnQgd2lkdGg7Ci0JaW50IGhlaWdodDsKLQotCS8vIElzIHNldCBpZiBtb3Zp
ZSBmb3JtYXQgdHlwZSAoIGluY3JlbWVudGFsL2FuaW1hdGlvbikgd2FzIGNoZWNrZWQKLQlib29s
IHR5cGVDaGVja2VkIDogMTsKLSAgICAgICAgYm9vbCBpc0Z1bGx5VHJhbnNwYXJlbnQgOiAxOwot
ICAgICAgICBib29sIGVycm9yT2NjdXJlZCA6IDE7Ci0gICAgICAgIGJvb2wgbW9ub2Nocm9tZSA6
IDE7Ci0gICAgICAgIEtIVE1MU2V0dGluZ3M6OktBbmltYXRpb25BZHZpY2UgbV9zaG93QW5pbWF0
aW9ucyA6IDI7Ci0KLSAgICAgICAgZnJpZW5kIGNsYXNzIENhY2hlOwotCi0gICAgcHVibGljOgot
ICAgICAgICBpbnQgZGF0YVNpemUoKSBjb25zdCB7IHJldHVybiBtX2RhdGFTaXplOyB9Ci0JQ2Fj
aGVkSW1hZ2VDYWxsYmFjayAqZGVjb2RlckNhbGxiYWNrKCkgY29uc3QgeyByZXR1cm4gbV9kZWNv
ZGVyQ2FsbGJhY2s7IH0KLSAgICBwcml2YXRlOgotICAgICAgICBmcmllbmQgY2xhc3MgQ2FjaGVk
SW1hZ2VDYWxsYmFjazsKLSAgICAgICAgCi0gICAgICAgIGludCBtX2RhdGFTaXplOwotICAgICAg
ICBDYWNoZWRJbWFnZUNhbGxiYWNrICptX2RlY29kZXJDYWxsYmFjazsKLSAgICB9OwotCi0jaWZk
ZWYgS0hUTUxfWFNMVAotICAgIGNsYXNzIENhY2hlZFhTTFN0eWxlU2hlZXQgOiBwdWJsaWMgQ2Fj
aGVkT2JqZWN0Ci0gICAgewotcHVibGljOgotICAgICAgICBDYWNoZWRYU0xTdHlsZVNoZWV0KERv
Y0xvYWRlciogZGwsIGNvbnN0IERPTTo6RE9NU3RyaW5nICZ1cmwsIEtJTzo6Q2FjaGVDb250cm9s
IGNhY2hlUG9saWN5LCB0aW1lX3QgX2V4cGlyZURhdGUpOwotCi0gICAgICAgIGNvbnN0IERPTTo6
RE9NU3RyaW5nJiBzaGVldCgpIGNvbnN0IHsgcmV0dXJuIG1fc2hlZXQ7IH0KLSAgICAgICAgCi0g
ICAgICAgIHZpcnR1YWwgdm9pZCByZWYoQ2FjaGVkT2JqZWN0Q2xpZW50ICpjb25zdW1lcik7Ci0g
ICAgICAgIHZpcnR1YWwgdm9pZCBkZXJlZihDYWNoZWRPYmplY3RDbGllbnQgKmNvbnN1bWVyKTsK
LSAgICAgICAgCi0gICAgICAgIHZpcnR1YWwgdm9pZCBzZXRDaGFyc2V0KGNvbnN0IFFTdHJpbmcg
JmNocyk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBkYXRhKFFCdWZmZXIgJmJ1ZmZlciwgYm9vbCBl
b2YpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgZXJyb3IoaW50IGVyciwgY29uc3QgY2hhciAqdGV4
dCk7Ci0gICAgICAgIAotICAgICAgICB2aXJ0dWFsIGJvb2wgc2NoZWR1bGUoKSBjb25zdCB7IHJl
dHVybiB0cnVlOyB9Ci0gICAgICAgIAotICAgICAgICB2b2lkIGNoZWNrTm90aWZ5KCk7Ci0gICAg
ICAgIAotcHJvdGVjdGVkOgotICAgICAgICBET006OkRPTVN0cmluZyBtX3NoZWV0OwotICAgICAg
ICBSZWZQdHI8RGVjb2Rlcj4gbV9kZWNvZGVyOwotICAgIH07Ci0jZW5kaWYKLSAgICAKLSNpZm5k
ZWYgS0hUTUxfTk9fWEJMCi0gICAgY2xhc3MgQ2FjaGVkWEJMRG9jdW1lbnQgOiBwdWJsaWMgQ2Fj
aGVkT2JqZWN0Ci0gICAgewotICAgIHB1YmxpYzoKLSAgICAgICAgQ2FjaGVkWEJMRG9jdW1lbnQo
RG9jTG9hZGVyKiBkbCwgY29uc3QgRE9NOjpET01TdHJpbmcgJnVybCwgS0lPOjpDYWNoZUNvbnRy
b2wgY2FjaGVQb2xpY3ksIHRpbWVfdCBfZXhwaXJlRGF0ZSk7Ci0gICAgICAgIHZpcnR1YWwgfkNh
Y2hlZFhCTERvY3VtZW50KCk7Ci0gICAgICAgIAotICAgICAgICBYQkw6OlhCTERvY3VtZW50SW1w
bCogZG9jdW1lbnQoKSBjb25zdCB7IHJldHVybiBtX2RvY3VtZW50OyB9Ci0gICAgICAgIAotICAg
ICAgICB2aXJ0dWFsIHZvaWQgcmVmKENhY2hlZE9iamVjdENsaWVudCAqY29uc3VtZXIpOwotICAg
ICAgICB2aXJ0dWFsIHZvaWQgZGVyZWYoQ2FjaGVkT2JqZWN0Q2xpZW50ICpjb25zdW1lcik7Ci0g
ICAgICAgIAotICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0Q2hhcnNldCggY29uc3QgUVN0cmluZyAm
Y2hzICk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBkYXRhKCBRQnVmZmVyICZidWZmZXIsIGJvb2wg
ZW9mICk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBlcnJvciggaW50IGVyciwgY29uc3QgY2hhciAq
dGV4dCApOwotICAgICAgICAKLSAgICAgICAgdmlydHVhbCBib29sIHNjaGVkdWxlKCkgY29uc3Qg
eyByZXR1cm4gdHJ1ZTsgfQotICAgICAgICAKLSAgICAgICAgdm9pZCBjaGVja05vdGlmeSgpOwot
ICAgICAgICAKLXByb3RlY3RlZDoKLSAgICAgICAgWEJMOjpYQkxEb2N1bWVudEltcGwqIG1fZG9j
dW1lbnQ7Ci0gICAgICAgIFJlZlB0cjxEZWNvZGVyPiBtX2RlY29kZXI7Ci0gICAgfTsKLSNlbmRp
ZgotCi0gICAgLyoqCi0gICAgICogQGludGVybmFsCi0gICAgICoKLSAgICAgKiBNYW5hZ2VzIHRo
ZSBsb2FkaW5nIG9mIHNjcmlwdHMvaW1hZ2VzL3N0eWxlc2hlZXRzIGZvciBhIHBhcnRpY3VsYXIg
ZG9jdW1lbnQKLSAgICAgKi8KLSAgICBjbGFzcyBEb2NMb2FkZXIKLSAgICB7Ci0gICAgcHVibGlj
OgotIAlEb2NMb2FkZXIoS0hUTUxQYXJ0KiwgRE9NOjpEb2N1bWVudEltcGwqKTsKLSAJfkRvY0xv
YWRlcigpOwotCi0JQ2FjaGVkSW1hZ2UgKnJlcXVlc3RJbWFnZSggY29uc3QgRE9NOjpET01TdHJp
bmcgJnVybCk7Ci0JQ2FjaGVkQ1NTU3R5bGVTaGVldCAqcmVxdWVzdFN0eWxlU2hlZXQoIGNvbnN0
IERPTTo6RE9NU3RyaW5nICZ1cmwsIGNvbnN0IFFTdHJpbmcmIGNoYXJzZXQpOwotICAgICAgICBD
YWNoZWRTY3JpcHQgKnJlcXVlc3RTY3JpcHQoIGNvbnN0IERPTTo6RE9NU3RyaW5nICZ1cmwsIGNv
bnN0IFFTdHJpbmcmIGNoYXJzZXQpOwotCi0jaWZkZWYgS0hUTUxfWFNMVAotICAgICAgICBDYWNo
ZWRYU0xTdHlsZVNoZWV0KiByZXF1ZXN0WFNMU3R5bGVTaGVldChjb25zdCBET006OkRPTVN0cmlu
ZyYgdXJsKTsKLSNlbmRpZgotI2lmbmRlZiBLSFRNTF9OT19YQkwKLSAgICAgICAgQ2FjaGVkWEJM
RG9jdW1lbnQqIHJlcXVlc3RYQkxEb2N1bWVudChjb25zdCBET006OkRPTVN0cmluZyAmdXJsKTsK
LSNlbmRpZgotCi0JYm9vbCBhdXRvbG9hZEltYWdlcygpIGNvbnN0IHsgcmV0dXJuIG1fYmF1dG9s
b2FkSW1hZ2VzOyB9Ci0gICAgICAgIEtJTzo6Q2FjaGVDb250cm9sIGNhY2hlUG9saWN5KCkgY29u
c3QgeyByZXR1cm4gbV9jYWNoZVBvbGljeTsgfQotICAgICAgICBLSFRNTFNldHRpbmdzOjpLQW5p
bWF0aW9uQWR2aWNlIHNob3dBbmltYXRpb25zKCkgY29uc3QgeyByZXR1cm4gbV9zaG93QW5pbWF0
aW9uczsgfQotICAgICAgICB0aW1lX3QgZXhwaXJlRGF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1fZXhw
aXJlRGF0ZTsgfQotICAgICAgICBLSFRNTFBhcnQqIHBhcnQoKSBjb25zdCB7IHJldHVybiBtX3Bh
cnQ7IH0KLSAgICAgICAgRE9NOjpEb2N1bWVudEltcGwqIGRvYygpIGNvbnN0IHsgcmV0dXJuIG1f
ZG9jOyB9Ci0KLSAgICAgICAgdm9pZCBzZXRFeHBpcmVEYXRlKCB0aW1lX3QgKTsKLSAgICAgICAg
dm9pZCBzZXRBdXRvbG9hZEltYWdlcyggYm9vbCApOwotICAgICAgICB2b2lkIHNldENhY2hlUG9s
aWN5KCBLSU86OkNhY2hlQ29udHJvbCBjYWNoZVBvbGljeSApOwotICAgICAgICB2b2lkIHNldFNo
b3dBbmltYXRpb25zKCBLSFRNTFNldHRpbmdzOjpLQW5pbWF0aW9uQWR2aWNlICk7Ci0gICAgICAg
IHZvaWQgcmVtb3ZlQ2FjaGVkT2JqZWN0KCBDYWNoZWRPYmplY3QqKSBjb25zdDsKLQkJCi0gICAg
ICAgIHZvaWQgc2V0TG9hZEluUHJvZ3Jlc3MoYm9vbCk7Ci0gICAgICAgIGJvb2wgbG9hZEluUHJv
Z3Jlc3MoKSBjb25zdCB7IHJldHVybiBtX2xvYWRJblByb2dyZXNzOyB9Ci0KLSAgICBwcml2YXRl
OgotICAgICAgICBib29sIG5lZWRSZWxvYWQoY29uc3QgS1VSTCAmZnVsbFVybCk7Ci0KLSAgICAg
ICAgZnJpZW5kIGNsYXNzIENhY2hlOwotICAgICAgICBmcmllbmQgY2xhc3MgRE9NOjpEb2N1bWVu
dEltcGw7Ci0KLSAgICAgICAgUVN0cmluZ0xpc3QgbV9yZWxvYWRlZFVSTHM7Ci0gICAgICAgIG11
dGFibGUgUVB0ckxpc3Q8Q2FjaGVkT2JqZWN0PiBtX2RvY09iamVjdHM7Ci0JdGltZV90IG1fZXhw
aXJlRGF0ZTsKLQlLSU86OkNhY2hlQ29udHJvbCBtX2NhY2hlUG9saWN5OwotICAgICAgICBib29s
IG1fYmF1dG9sb2FkSW1hZ2VzIDogMTsKLSAgICAgICAgS0hUTUxTZXR0aW5nczo6S0FuaW1hdGlv
bkFkdmljZSBtX3Nob3dBbmltYXRpb25zIDogMjsKLSAgICAgICAgS0hUTUxQYXJ0KiBtX3BhcnQ7
Ci0gICAgICAgIERPTTo6RG9jdW1lbnRJbXBsICptX2RvYzsKLSAgICAgICAgYm9vbCBtX2xvYWRJ
blByb2dyZXNzOwotICAgIH07Ci0KLSAgICAvKioKLSAgICAgKiBAaW50ZXJuYWwKLSAgICAgKi8K
ICAgICBjbGFzcyBSZXF1ZXN0CiAgICAgewogICAgIHB1YmxpYzoKQEAgLTUxNiwxOTggKzQ0LDYg
QEAgcHJvdGVjdGVkOgogICAgICAgICBEb2NMb2FkZXIqIG1fZG9jTG9hZGVyOwogICAgICAgICBi
b29sIG11bHRpcGFydDsKICAgICAgfTsKLQotICAgIC8qKgotICAgICAqIEBpbnRlcm5hbAotICAg
ICAqLwotICAgIGNsYXNzIExvYWRlciA6IHB1YmxpYyBRT2JqZWN0Ci0gICAgewotCVFfT0JKRUNU
Ci0KLSAgICBwdWJsaWM6CQotCUxvYWRlcigpOwotCX5Mb2FkZXIoKTsKLQotCXZvaWQgbG9hZChE
b2NMb2FkZXIqIGRsLCBDYWNoZWRPYmplY3QgKm9iamVjdCwgYm9vbCBpbmNyZW1lbnRhbCA9IHRy
dWUpOwotCi0gICAgICAgIGludCBudW1SZXF1ZXN0cyggRG9jTG9hZGVyKiBkbCApIGNvbnN0Owot
ICAgICAgICB2b2lkIGNhbmNlbFJlcXVlc3RzKCBEb2NMb2FkZXIqIGRsICk7Ci0KLQl2b2lkIHJl
bW92ZUJhY2tncm91bmREZWNvZGluZ1JlcXVlc3QgKFJlcXVlc3QgKnIpOwotCQotICAgICAgICAv
LyBtYXkgcmV0dXJuIDBMCi0gICAgICAgIEtJTzo6Sm9iICpqb2JGb3JSZXF1ZXN0KCBjb25zdCBE
T006OkRPTVN0cmluZyAmdXJsICkgY29uc3Q7Ci0KLSAgICAgICAgS1dRTG9hZGVyICprd3E7Ci0K
LSAgICBzaWduYWxzOgotCWZyaWVuZCBjbGFzcyBDYWNoZWRJbWFnZUNhbGxiYWNrOwotCi0gICAg
ICAgIHZvaWQgcmVxdWVzdFN0YXJ0ZWQoIGtodG1sOjpEb2NMb2FkZXIqIGRsLCBraHRtbDo6Q2Fj
aGVkT2JqZWN0KiBvYmogKTsKLQl2b2lkIHJlcXVlc3REb25lKCBraHRtbDo6RG9jTG9hZGVyKiBk
bCwga2h0bWw6OkNhY2hlZE9iamVjdCAqb2JqICk7Ci0Jdm9pZCByZXF1ZXN0RmFpbGVkKCBraHRt
bDo6RG9jTG9hZGVyKiBkbCwga2h0bWw6OkNhY2hlZE9iamVjdCAqb2JqICk7Ci0KLSAgICBwcm90
ZWN0ZWQgc2xvdHM6Ci0gICAgICAgIHZvaWQgc2xvdEZpbmlzaGVkKCBLSU86OkpvYiAqICwgTlNE
YXRhICphbGxEYXRhKTsKLQl2b2lkIHNsb3REYXRhKCBLSU86OkpvYiAqLCBjb25zdCBjaGFyICpk
YXRhLCBpbnQgc2l6ZSApOwotICAgICAgICB2b2lkIHNsb3RSZWNlaXZlZFJlc3BvbnNlICggS0lP
OjpKb2IgKiwgTlNVUkxSZXNwb25zZSAqcmVzcG9uc2UgKTsKLQotICAgIHByaXZhdGU6Ci0Jdm9p
ZCBzZXJ2ZVBlbmRpbmdSZXF1ZXN0cygpOwotCi0gICAgICAgIHZpcnR1YWwgYm9vbCBpc0tIVE1M
TG9hZGVyKCkgY29uc3Q7Ci0KLQlRUHRyTGlzdDxSZXF1ZXN0PiBtX3JlcXVlc3RzUGVuZGluZzsK
LQlRUHRyRGljdDxSZXF1ZXN0PiBtX3JlcXVlc3RzTG9hZGluZzsKLQotCVFQdHJMaXN0PFJlcXVl
c3Q+IG1fcmVxdWVzdHNCYWNrZ3JvdW5kRGVjb2Rpbmc7Ci0KLSNpZmRlZiBIQVZFX0xJQkpQRUcK
LSAgICAgICAgS0pQRUdGb3JtYXRUeXBlIG1fanBlZ2xvYWRlcjsKLSNlbmRpZgotICAgIH07Ci0K
LSAgICAgICAgLyoqCi0gICAgICogQGludGVybmFsCi0gICAgICoKLSAgICAgKiBQcm92aWRlcyBh
IGNhY2hlL2xvYWRlciBmb3Igb2JqZWN0cyBuZWVkZWQgZm9yIGRpc3BsYXlpbmcgdGhlIGh0bWwg
cGFnZS4KLSAgICAgKiBBdCB0aGUgbW9tZW50IHRoZXNlIGFyZSBzdHlsZXNoZWV0cywgc2NyaXB0
cyBhbmQgaW1hZ2VzCi0gICAgICovCi0gICAgY2xhc3MgQ2FjaGUKLSAgICB7Ci0JZnJpZW5kIGNs
YXNzIERvY0xvYWRlcjsKLSAgICBwdWJsaWM6Ci0JLyoqCi0JICogaW5pdCB0aGUgY2FjaGUgaW4g
Y2FzZSBpdCdzIG5vdCBhbHJlYWR5LiBUaGlzIG5lZWRzIHRvIGdldCBjYWxsZWQgb25jZQotCSAq
IGJlZm9yZSB1c2luZyBpdC4KLQkgKi8KLQlzdGF0aWMgdm9pZCBpbml0KCk7Ci0gICAgICAgIAot
CS8qKgotCSAqIEFzayB0aGUgY2FjaGUgZm9yIHNvbWUgdXJsLiBXaWxsIHJldHVybiBhIGNhY2hl
ZE9iamVjdCwgYW5kCi0JICogbG9hZCB0aGUgcmVxdWVzdGVkIGRhdGEgaW4gY2FzZSBpdCdzIG5v
dCBjYWhjZWQKLSAgICAgICAgICogaWYgdGhlIERvY0xvYWRlciBpcyB6ZXJvLCB0aGUgdXJsIG11
c3QgYmUgZnVsbC1xdWFsaWZpZWQuCi0gICAgICAgICAqIE90aGVyd2lzZSwgaXQgaXMgYXV0b21h
dGljYWxseSBiYXNlLXVybCBleHBhbmRlZAotCSAqLwotCXN0YXRpYyBDYWNoZWRJbWFnZSAqcmVx
dWVzdEltYWdlKCBEb2NMb2FkZXIqIGwsIGNvbnN0IERPTTo6RE9NU3RyaW5nICZ1cmwsIGJvb2wg
cmVsb2FkPWZhbHNlLCB0aW1lX3QgX2V4cGlyZURhdGU9MCk7Ci0gICAgICAgIHN0YXRpYyBDYWNo
ZWRJbWFnZSAqcmVxdWVzdEltYWdlKCBEb2NMb2FkZXIqIGwsIGNvbnN0IEtVUkwgJnVybCwgYm9v
bCByZWxvYWQ9ZmFsc2UsIHRpbWVfdCBfZXhwaXJlRGF0ZT0wKTsKLQotCS8qKgotCSAqIEFzayB0
aGUgY2FjaGUgZm9yIHNvbWUgdXJsLiBXaWxsIHJldHVybiBhIGNhY2hlZE9iamVjdCwgYW5kCi0J
ICogbG9hZCB0aGUgcmVxdWVzdGVkIGRhdGEgaW4gY2FzZSBpdCdzIG5vdCBjYWNoZWQKLQkgKi8K
LQlzdGF0aWMgQ2FjaGVkQ1NTU3R5bGVTaGVldCAqcmVxdWVzdFN0eWxlU2hlZXQoIERvY0xvYWRl
ciogbCwgY29uc3QgRE9NOjpET01TdHJpbmcgJnVybCwgYm9vbCByZWxvYWQ9ZmFsc2UsIHRpbWVf
dCBfZXhwaXJlRGF0ZT0wLCBjb25zdCBRU3RyaW5nJiBjaGFyc2V0ID0gUVN0cmluZzo6bnVsbCk7
Ci0KLSNpZmRlZiBLSFRNTF9YU0xUCi0gICAgICAgIC8vIEFzayB0aGUgY2FjaGUgZm9yIGFuIFhT
TCBzdHlsZXNoZWV0LgotICAgICAgICBzdGF0aWMgQ2FjaGVkWFNMU3R5bGVTaGVldCogcmVxdWVz
dFhTTFN0eWxlU2hlZXQoRG9jTG9hZGVyKiBsLCBjb25zdCBET006OkRPTVN0cmluZyAmdXJsLCAK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGJvb2wgcmVsb2FkPWZhbHNlLCB0aW1lX3QgX2V4cGlyZURhdGU9MCk7Ci0jZW5kaWYKLSNpZm5k
ZWYgS0hUTUxfTk9fWEJMCi0gICAgICAgIC8vIEFzayB0aGUgY2FjaGUgZm9yIGFuIFhCTCBkb2N1
bWVudC4KLSAgICAgICAgc3RhdGljIENhY2hlZFhCTERvY3VtZW50KiByZXF1ZXN0WEJMRG9jdW1l
bnQoRG9jTG9hZGVyKiBsLCBjb25zdCBET006OkRPTVN0cmluZyAmdXJsLCAKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZWxvYWQ9ZmFs
c2UsIHRpbWVfdCBfZXhwaXJlRGF0ZT0wKTsKLSNlbmRpZgotCi0gICAgICAgIC8qKgotICAgICAg
ICAgKiBQcmUtbG9hZHMgYSBzdHlsZXNoZWV0IGludG8gdGhlIGNhY2hlLgotICAgICAgICAgKi8K
LSAgICAgICAgc3RhdGljIHZvaWQgcHJlbG9hZFN0eWxlU2hlZXQoY29uc3QgUVN0cmluZyAmdXJs
LCBjb25zdCBRU3RyaW5nICZzdHlsZXNoZWV0X2RhdGEpOwotCi0JLyoqCi0JICogQXNrIHRoZSBj
YWNoZSBmb3Igc29tZSB1cmwuIFdpbGwgcmV0dXJuIGEgY2FjaGVkT2JqZWN0LCBhbmQKLQkgKiBs
b2FkIHRoZSByZXF1ZXN0ZWQgZGF0YSBpbiBjYXNlIGl0J3Mgbm90IGNhaGNlZAotCSAqLwotCXN0
YXRpYyBDYWNoZWRTY3JpcHQgKnJlcXVlc3RTY3JpcHQoIERvY0xvYWRlciogbCwgY29uc3QgRE9N
OjpET01TdHJpbmcgJnVybCwgYm9vbCByZWxvYWQ9ZmFsc2UsIHRpbWVfdCBfZXhwaXJlRGF0ZT0w
LCBjb25zdCBRU3RyaW5nJiBjaGFyc2V0PVFTdHJpbmc6Om51bGwpOwotCi0gICAgICAgIC8qKgot
ICAgICAgICAgKiBQcmUtbG9hZHMgYSBzY3JpcHQgaW50byB0aGUgY2FjaGUuCi0gICAgICAgICAq
LwotICAgICAgICBzdGF0aWMgdm9pZCBwcmVsb2FkU2NyaXB0KGNvbnN0IFFTdHJpbmcgJnVybCwg
Y29uc3QgUVN0cmluZyAmc2NyaXB0X2RhdGEpOwotCi0JLyoqCi0JICogc2V0cyB0aGUgc2l6ZSBv
ZiB0aGUgY2FjaGUuIFRoaXMgd2lsbCBvbmx5IGhvZCBhcHByb3hpbWF0ZWx5LCBzaW5jZSB0aGUg
c2l6ZSBzb21lCi0JICogY2FjaGVkIG9iamVjdHMgKGxpa2Ugc3R5bGVzaGVldHMpIHRha2UgdXAg
aW4gbWVtb3J5IGlzIG5vdCBleGFjbHR5IGtub3duLgotCSAqLwotCXN0YXRpYyB2b2lkIHNldFNp
emUoIGludCBieXRlcyApOwotCS8qKgotCSAqIHJldHVybnMgdGhlIHNpemUgb2YgdGhlIGNhY2hl
Ci0JICovCi0Jc3RhdGljIGludCBzaXplKCkgeyByZXR1cm4gbWF4U2l6ZTsgfTsKLQotICAgICAg
ICBzdGF0aWMgaW50IG1heENhY2hlYWJsZU9iamVjdFNpemUoKSB7IHJldHVybiBtYXhDYWNoZWFi
bGU7IH0KLQotCS8qKgotCSAqIGNsZWFuIHVwIGNhY2hlCi0JICovCi0Jc3RhdGljIHZvaWQgZmx1
c2goYm9vbCBmb3JjZT1mYWxzZSk7Ci0KLQkvKioKLQkgKiBjbGVhcnMgdGhlIGNhY2hlCi0JICog
V2FybmluZzogY2FsbCB0aGlzIG9ubHkgYXQgdGhlIGVuZCBvZiB5b3VyIHByb2dyYW0sIHRvIGNs
ZWFuCi0JICogdXAgbWVtb3J5ICh1c2VmdWwgZm9yIGZpbmRpbmcgbWVtb3J5IGhvbGVzKQotCSAq
LwotCXN0YXRpYyB2b2lkIGNsZWFyKCk7Ci0KLQlzdGF0aWMgTG9hZGVyICpsb2FkZXIoKSB7IHJl
dHVybiBtX2xvYWRlcjsgfQotCi0gICAgCXN0YXRpYyBRUGl4bWFwICpudWxsUGl4bWFwOwotICAg
ICAgICBzdGF0aWMgUVBpeG1hcCAqYnJva2VuUGl4bWFwOwotCi0gICAgICAgIHN0YXRpYyB2b2lk
IHJlbW92ZUNhY2hlRW50cnkoIENhY2hlZE9iamVjdCAqb2JqZWN0ICk7Ci0KLSAgICAgICAgc3Ry
dWN0IFR5cGVTdGF0aXN0aWMgewotICAgICAgICAgICAgaW50IGNvdW50OwotICAgICAgICAgICAg
aW50IHNpemU7Ci0gICAgICAgICAgICBUeXBlU3RhdGlzdGljKCkgOiBjb3VudCgwKSwgc2l6ZSgw
KSB7IH0KLSAgICAgICAgfTsKLSAgICAgICAgCi0gICAgICAgIHN0cnVjdCBTdGF0aXN0aWNzIHsK
LSAgICAgICAgICAgIFR5cGVTdGF0aXN0aWMgaW1hZ2VzOwotICAgICAgICAgICAgVHlwZVN0YXRp
c3RpYyBtb3ZpZXM7Ci0gICAgICAgICAgICBUeXBlU3RhdGlzdGljIHN0eWxlU2hlZXRzOwotICAg
ICAgICAgICAgVHlwZVN0YXRpc3RpYyBzY3JpcHRzOwotI2lmZGVmIEtIVE1MX1hTTFQKLSAgICAg
ICAgICAgIFR5cGVTdGF0aXN0aWMgeHNsU3R5bGVTaGVldHM7Ci0jZW5kaWYKLSNpZm5kZWYgS0hU
TUxfTk9fWEJMCi0gICAgICAgICAgICBUeXBlU3RhdGlzdGljIHhibERvY3M7Ci0jZW5kaWYKLSAg
ICAgICAgICAgIFR5cGVTdGF0aXN0aWMgb3RoZXI7Ci0gICAgICAgIH07Ci0KLSAgICAgICAgc3Rh
dGljIFN0YXRpc3RpY3MgZ2V0U3RhdGlzdGljcygpOwotICAgICAgICBzdGF0aWMgdm9pZCBmbHVz
aEFsbCgpOwotICAgICAgICBzdGF0aWMgdm9pZCBzZXRDYWNoZURpc2FibGVkKGJvb2wpOwotCi0g
ICAgICAgIHN0YXRpYyB2b2lkIGluc2VydEluTFJVTGlzdChDYWNoZWRPYmplY3QgKik7Ci0gICAg
ICAgIHN0YXRpYyB2b2lkIHJlbW92ZUZyb21MUlVMaXN0KENhY2hlZE9iamVjdCAqKTsKLSAgICAg
ICAgc3RhdGljIGJvb2wgYWRqdXN0U2l6ZShDYWNoZWRPYmplY3QgKiwgaW50IHNpemVEZWx0YSk7
Ci0gICAgICAgIAotICAgICAgICBzdGF0aWMgTFJVTGlzdCogZ2V0TFJVTGlzdEZvcihDYWNoZWRP
YmplY3QqIG8pOwotICAgICAgICAKLSAgICAgICAgc3RhdGljIHZvaWQgY2hlY2tMUlVBbmRVbmNh
Y2hlYWJsZUxpc3RJbnRlZ3JpdHkoKTsKLQotICAgIHByb3RlY3RlZDoKLSAgICAgICAgc3RhdGlj
IFFEaWN0PENhY2hlZE9iamVjdD4gKmNhY2hlOwotICAgICAgICBzdGF0aWMgUVB0ckxpc3Q8RG9j
TG9hZGVyPiogZG9jbG9hZGVyOwotICAgIAotICAgICAgICBzdGF0aWMgaW50IG1heFNpemU7Ci0g
ICAgICAgIHN0YXRpYyBpbnQgbWF4Q2FjaGVhYmxlOwotICAgICAgICBzdGF0aWMgaW50IGZsdXNo
Q291bnQ7Ci0gICAgCi0gICAgICAgIHN0YXRpYyBMb2FkZXIgKm1fbG9hZGVyOwotICAgIAotICAg
ICAgICBzdGF0aWMgdm9pZCBtb3ZlVG9IZWFkT2ZMUlVMaXN0KENhY2hlZE9iamVjdCAqKTsKLSAg
ICAKLSAgICAgICAgc3RhdGljIExSVUxpc3QgKm1fTFJVTGlzdHM7Ci0gICAgICAgIHN0YXRpYyBp
bnQgbV90b3RhbFNpemVPZkxSVUxpc3RzOwotICAgICAgICAgICAgCi0gICAgICAgIHN0YXRpYyBD
YWNoZWRPYmplY3QgKm1faGVhZE9mVW5jYWNoZWFibGVMaXN0OwotICAgICAgICAgICAgCi0gICAg
ICAgIHN0YXRpYyBpbnQgbV9jb3VudE9mTFJVQW5kVW5jYWNoZWFibGVMaXN0czsKLSAgICB9Owot
CiB9OwogCiAjZW5kaWYKSW5kZXg6IG1pc2MvQ2FjaGVkT2JqZWN0LmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBtaXNjL0NhY2hlZE9iamVjdC5jcHAJKHJldmlzaW9uIDExOTQ4KQorKysgbWlzYy9DYWNoZWRP
YmplY3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNSw1NSArMjUsMjMgQEAKICAgICBwYWdlcyBm
cm9tIHRoZSB3ZWIuIEl0IGhhcyBhIG1lbW9yeSBjYWNoZSBmb3IgdGhlc2Ugb2JqZWN0cy4KICov
CiAKLSN1bmRlZiBDQUNIRV9ERUJVRwotLy8jZGVmaW5lIENBQ0hFX0RFQlVHCiAjaW5jbHVkZSAi
Y29uZmlnLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+CiAKLSNpbmNsdWRlICJsb2FkZXIuaCIKLQot
Ly8gdXAgdG8gd2hpY2ggc2l6ZSBpcyBhIHBpY3R1cmUgZm9yIHN1cmUgY2FjaGVhYmxlCi0jZGVm
aW5lIE1BWENBQ0hFQUJMRSA0MCoxMDI0Ci0vLyBkZWZhdWx0IGNhY2hlIHNpemUKLSNkZWZpbmUg
REVGQ0FDSEVTSVpFIDQwOTYqMTAyNAorI2luY2x1ZGUgIkNhY2hlZE9iamVjdC5oIgorI2luY2x1
ZGUgIkNhY2hlLmgiCiAKICNpbmNsdWRlIDxxYXN5bmNpby5oPgotI2luY2x1ZGUgPHFwYWludGVy
Lmg+Ci0KICNpbmNsdWRlIDxraW8vam9iLmg+CiAjaW5jbHVkZSA8a2lvL2pvYmNsYXNzZXMuaD4K
LSNpbmNsdWRlIDxraW1hZ2Vpby5oPgogI2luY2x1ZGUgPGtjaGFyc2V0cy5oPgogI2luY2x1ZGUg
PGtkZWJ1Zy5oPgotI2luY2x1ZGUgImtodG1sX2ZhY3RvcnkuaCIKLSNpbmNsdWRlICJraHRtbF9w
YXJ0LmgiCiAjaW5jbHVkZSAiZGVjb2Rlci5oIgogCi0jaW5jbHVkZSAiaHRtbC9odG1sX2RvY3Vt
ZW50aW1wbC5oIgotI2luY2x1ZGUgImNzcy9jc3Nfc3R5bGVzaGVldGltcGwuaCIKLQotI2lmbmRl
ZiBLSFRNTF9OT19YQkwKLSNpbmNsdWRlICJ4YmwveGJsX2RvY2ltcGwuaCIKLSNlbmRpZgotCiAj
aW5jbHVkZSA8a3htbGNvcmUvQXNzZXJ0aW9ucy5oPgotI2luY2x1ZGUgIktXUUxvYWRlci5oIgog
Ci11c2luZyBuYW1lc3BhY2Uga2h0bWw7CiB1c2luZyBuYW1lc3BhY2UgRE9NOwogCi1zdGF0aWMg
Ym9vbCBjYWNoZURpc2FibGVkOwotCi0vLyBDYWxsIHRoaXMgIndhbGtlciIgaW5zdGVhZCBvZiBp
dGVyYXRvciBzbyBwZW9wbGUgd29uJ3QgZXhwZWN0IFF0IG9yIFNUTC1zdHlsZSBpdGVyYXRvciBp
bnRlcmZhY2UuCi0vLyBKdXN0IGtlZXAgY2FsbGluZyBuZXh0KCkgb24gdGhpcy4gSXQncyBzYWZl
IGZyb20gZGVsZXRpb25zIG9mIHRoZSBjdXJyZW50IGl0ZW0KLWNsYXNzIENhY2hlZE9iamVjdENs
aWVudFdhbGtlciB7Ci1wdWJsaWM6Ci0gICAgQ2FjaGVkT2JqZWN0Q2xpZW50V2Fsa2VyKGNvbnN0
IFFQdHJEaWN0PENhY2hlZE9iamVjdENsaWVudD4gJmNsaWVudHMpIDogX2N1cnJlbnQoMCksIF9p
dGVyYXRvcihjbGllbnRzKSB7IH0KLSAgICBDYWNoZWRPYmplY3RDbGllbnQgKm5leHQoKTsKLXBy
aXZhdGU6Ci0gICAgQ2FjaGVkT2JqZWN0Q2xpZW50ICpfY3VycmVudDsKLSAgICBRUHRyRGljdEl0
ZXJhdG9yPENhY2hlZE9iamVjdENsaWVudD4gX2l0ZXJhdG9yOwotfTsKK25hbWVzcGFjZSBraHRt
bCB7CiAKIENhY2hlZE9iamVjdDo6fkNhY2hlZE9iamVjdCgpCiB7CkBAIC0xNTUsMTcyOSArMTIz
LDQgQEAgdm9pZCBDYWNoZWRPYmplY3Q6OnNldFNpemUoaW50IHNpemUpCiAgICAgICAgIENhY2hl
OjppbnNlcnRJbkxSVUxpc3QodGhpcyk7CiB9CiAKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0KLQotQ2FjaGVkQ1NTU3R5bGVTaGVldDo6Q2FjaGVkQ1NTU3R5bGVTaGVldChE
b2NMb2FkZXIqIGRsLCBjb25zdCBET01TdHJpbmcgJnVybCwgS0lPOjpDYWNoZUNvbnRyb2wgX2Nh
Y2hlUG9saWN5LCB0aW1lX3QgX2V4cGlyZURhdGUsIGNvbnN0IFFTdHJpbmcmIGNoYXJzZXQpCi0g
ICAgOiBDYWNoZWRPYmplY3QodXJsLCBDU1NTdHlsZVNoZWV0LCBfY2FjaGVQb2xpY3ksIF9leHBp
cmVEYXRlKSwgbV9jb2RlYygwKQotewotICAgIC8vIEl0J3MgY3NzIHdlIHdhbnQuCi0gICAgc2V0
QWNjZXB0KCJ0ZXh0L2NzcyIpOwotICAgIC8vIGxvYWQgdGhlIGZpbGUKLSAgICBDYWNoZTo6bG9h
ZGVyKCktPmxvYWQoZGwsIHRoaXMsIGZhbHNlKTsKLSAgICBtX2xvYWRpbmcgPSB0cnVlOwotICAg
IGlmICghY2hhcnNldC5pc0VtcHR5KCkpCi0JbV9jb2RlYyA9IFFUZXh0Q29kZWM6OmNvZGVjRm9y
TmFtZShjaGFyc2V0LmxhdGluMSgpKTsKLSAgICBpZiAoIW1fY29kZWMpCi0gICAgICAgIG1fY29k
ZWMgPSBRVGV4dENvZGVjOjpjb2RlY0Zvck5hbWUoImlzbzg4NTktMSIpOwotfQotCi1DYWNoZWRD
U1NTdHlsZVNoZWV0OjpDYWNoZWRDU1NTdHlsZVNoZWV0KGNvbnN0IERPTVN0cmluZyAmdXJsLCBj
b25zdCBRU3RyaW5nICZzdHlsZXNoZWV0X2RhdGEpCi0gICAgOiBDYWNoZWRPYmplY3QodXJsLCBD
U1NTdHlsZVNoZWV0LCBLSU86OkNDX1ZlcmlmeSwgMCwgc3R5bGVzaGVldF9kYXRhLmxlbmd0aCgp
KQotewotICAgIG1fbG9hZGluZyA9IGZhbHNlOwotICAgIG1fc3RhdHVzID0gUGVyc2lzdGVudDsK
LSAgICBtX2NvZGVjID0gMDsKLSAgICBtX3NoZWV0ID0gRE9NU3RyaW5nKHN0eWxlc2hlZXRfZGF0
YSk7Ci19Ci0KLQotQ2FjaGVkQ1NTU3R5bGVTaGVldDo6fkNhY2hlZENTU1N0eWxlU2hlZXQoKQot
ewotfQotCi12b2lkIENhY2hlZENTU1N0eWxlU2hlZXQ6OnJlZihDYWNoZWRPYmplY3RDbGllbnQg
KmMpCi17Ci0gICAgQ2FjaGVkT2JqZWN0OjpyZWYoYyk7Ci0KLSAgICBpZighbV9sb2FkaW5nKSBj
LT5zZXRTdHlsZVNoZWV0KCBtX3VybCwgbV9zaGVldCApOwotfQotCi12b2lkIENhY2hlZENTU1N0
eWxlU2hlZXQ6OmRlcmVmKENhY2hlZE9iamVjdENsaWVudCAqYykKLXsKLSAgICBDYWNoZTo6Zmx1
c2goKTsKLSAgICBDYWNoZWRPYmplY3Q6OmRlcmVmKGMpOwotICAgIGlmICggY2FuRGVsZXRlKCkg
JiYgbV9mcmVlICkKLSAgICAgIGRlbGV0ZSB0aGlzOwotfQotCi12b2lkIENhY2hlZENTU1N0eWxl
U2hlZXQ6OnNldENoYXJzZXQoIGNvbnN0IFFTdHJpbmcgJmNocyApCi17Ci0gICAgaWYgKCFjaHMu
aXNFbXB0eSgpKSB7Ci0gICAgICAgIFFUZXh0Q29kZWMgKmNvZGVjID0gUVRleHRDb2RlYzo6Y29k
ZWNGb3JOYW1lKGNocy5sYXRpbjEoKSk7Ci0gICAgICAgIGlmIChjb2RlYykKLSAgICAgICAgICAg
IG1fY29kZWMgPSBjb2RlYzsKLSAgICB9Ci19Ci0KLXZvaWQgQ2FjaGVkQ1NTU3R5bGVTaGVldDo6
ZGF0YSggUUJ1ZmZlciAmYnVmZmVyLCBib29sIGVvZiApCi17Ci0gICAgaWYoIWVvZikgcmV0dXJu
OwotICAgIGJ1ZmZlci5jbG9zZSgpOwotICAgIHNldFNpemUoYnVmZmVyLmJ1ZmZlcigpLnNpemUo
KSk7Ci0gICAgUVN0cmluZyBkYXRhID0gbV9jb2RlYy0+dG9Vbmljb2RlKCBidWZmZXIuYnVmZmVy
KCkuZGF0YSgpLCBzaXplKCkgKTsKLSAgICBtX3NoZWV0ID0gRE9NU3RyaW5nKGRhdGEpOwotICAg
IG1fbG9hZGluZyA9IGZhbHNlOwotCi0gICAgY2hlY2tOb3RpZnkoKTsKLX0KLQotdm9pZCBDYWNo
ZWRDU1NTdHlsZVNoZWV0OjpjaGVja05vdGlmeSgpCi17Ci0gICAgaWYgKG1fbG9hZGluZykKLSAg
ICAgICAgcmV0dXJuOwotCi0gICAgQ2FjaGVkT2JqZWN0Q2xpZW50V2Fsa2VyIHcobV9jbGllbnRz
KTsKLSAgICB3aGlsZSAoQ2FjaGVkT2JqZWN0Q2xpZW50ICpjID0gdy5uZXh0KCkpIHsKLSAgICAg
ICAgaWYgKG1fcmVzcG9uc2UgJiYgIUtXUUlzUmVzcG9uc2VVUkxFcXVhbFRvVVJMKG1fcmVzcG9u
c2UsIG1fdXJsKSkKLSAgICAgICAgICAgIGMtPnNldFN0eWxlU2hlZXQoRE9NU3RyaW5nKEtXUVJl
c3BvbnNlVVJMKG1fcmVzcG9uc2UpKSwgbV9zaGVldCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAg
ICAgIGMtPnNldFN0eWxlU2hlZXQobV91cmwsIG1fc2hlZXQpOwotICAgIH0KLX0KLQotCi12b2lk
IENhY2hlZENTU1N0eWxlU2hlZXQ6OmVycm9yKCBpbnQgLyplcnIqLywgY29uc3QgY2hhciAqLyp0
ZXh0Ki8gKQotewotICAgIG1fbG9hZGluZyA9IGZhbHNlOwotICAgIGNoZWNrTm90aWZ5KCk7Ci19
Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQ2FjaGVkU2NyaXB0
OjpDYWNoZWRTY3JpcHQoRG9jTG9hZGVyKiBkbCwgY29uc3QgRE9NU3RyaW5nICZ1cmwsIEtJTzo6
Q2FjaGVDb250cm9sIF9jYWNoZVBvbGljeSwgdGltZV90IF9leHBpcmVEYXRlLCBjb25zdCBRU3Ry
aW5nJiBjaGFyc2V0KQotICAgIDogQ2FjaGVkT2JqZWN0KHVybCwgU2NyaXB0LCBfY2FjaGVQb2xp
Y3ksIF9leHBpcmVEYXRlKSwgbV9jb2RlYygwKQotewotICAgIC8vIEl0J3MgamF2YXNjcmlwdCB3
ZSB3YW50LgotICAgIC8vIEJ1dCBzb21lIHdlYnNpdGVzIHRoaW5rIHRoZWlyIHNjcmlwdHMgYXJl
IDxzb21lIHdyb25nIG1pbWV0eXBlIGhlcmU+Ci0gICAgLy8gYW5kIHJlZnVzZSB0byBzZXJ2ZSB0
aGVtIGlmIHdlIG9ubHkgYWNjZXB0IGFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdC4KLSAgICBzZXRB
Y2NlcHQoIiovKiIpOwotICAgIG1fZXJyb3JPY2N1cnJlZCA9IGZhbHNlOwotICAgIC8vIGxvYWQg
dGhlIGZpbGUKLSAgICBDYWNoZTo6bG9hZGVyKCktPmxvYWQoZGwsIHRoaXMsIGZhbHNlKTsKLSAg
ICBtX2xvYWRpbmcgPSB0cnVlOwotICAgIGlmICghY2hhcnNldC5pc0VtcHR5KCkpCi0gICAgICAg
IG1fY29kZWMgPSBRVGV4dENvZGVjOjpjb2RlY0Zvck5hbWUoY2hhcnNldC5sYXRpbjEoKSk7Ci0g
ICAgaWYgKCFtX2NvZGVjKQotCW1fY29kZWMgPSBRVGV4dENvZGVjOjpjb2RlY0Zvck5hbWUoImlz
bzg4NTktMSIpOwotfQotCi1DYWNoZWRTY3JpcHQ6OkNhY2hlZFNjcmlwdChjb25zdCBET01TdHJp
bmcgJnVybCwgY29uc3QgUVN0cmluZyAmc2NyaXB0X2RhdGEpCi0gICAgOiBDYWNoZWRPYmplY3Qo
dXJsLCBTY3JpcHQsIEtJTzo6Q0NfVmVyaWZ5LCAwLCBzY3JpcHRfZGF0YS5sZW5ndGgoKSkKLXsK
LSAgICBtX2Vycm9yT2NjdXJyZWQgPSBmYWxzZTsKLSAgICBtX2xvYWRpbmcgPSBmYWxzZTsKLSAg
ICBtX3N0YXR1cyA9IFBlcnNpc3RlbnQ7Ci0gICAgbV9jb2RlYyA9IDA7Ci0gICAgbV9zY3JpcHQg
PSBET01TdHJpbmcoc2NyaXB0X2RhdGEpOwotfQotCi1DYWNoZWRTY3JpcHQ6On5DYWNoZWRTY3Jp
cHQoKQotewotfQotCi12b2lkIENhY2hlZFNjcmlwdDo6cmVmKENhY2hlZE9iamVjdENsaWVudCAq
YykKLXsKLSAgICBDYWNoZWRPYmplY3Q6OnJlZihjKTsKLQotICAgIGlmKCFtX2xvYWRpbmcpIGMt
Pm5vdGlmeUZpbmlzaGVkKHRoaXMpOwotfQotCi12b2lkIENhY2hlZFNjcmlwdDo6ZGVyZWYoQ2Fj
aGVkT2JqZWN0Q2xpZW50ICpjKQotewotICAgIENhY2hlOjpmbHVzaCgpOwotICAgIENhY2hlZE9i
amVjdDo6ZGVyZWYoYyk7Ci0gICAgaWYgKCBjYW5EZWxldGUoKSAmJiBtX2ZyZWUgKQotICAgICAg
ZGVsZXRlIHRoaXM7Ci19Ci0KLXZvaWQgQ2FjaGVkU2NyaXB0OjpzZXRDaGFyc2V0KCBjb25zdCBR
U3RyaW5nICZjaHMgKQotewotICAgIGlmICghY2hzLmlzRW1wdHkoKSkgewotICAgICAgICBRVGV4
dENvZGVjICpjb2RlYyA9IFFUZXh0Q29kZWM6OmNvZGVjRm9yTmFtZShjaHMubGF0aW4xKCkpOwot
ICAgICAgICBpZiAoY29kZWMpCi0gICAgICAgICAgICBtX2NvZGVjID0gY29kZWM7Ci0gICAgfQot
fQotCi12b2lkIENhY2hlZFNjcmlwdDo6ZGF0YSggUUJ1ZmZlciAmYnVmZmVyLCBib29sIGVvZiAp
Ci17Ci0gICAgaWYoIWVvZikgcmV0dXJuOwotICAgIGJ1ZmZlci5jbG9zZSgpOwotICAgIHNldFNp
emUoYnVmZmVyLmJ1ZmZlcigpLnNpemUoKSk7Ci0gICAgUVN0cmluZyBkYXRhID0gbV9jb2RlYy0+
dG9Vbmljb2RlKCBidWZmZXIuYnVmZmVyKCkuZGF0YSgpLCBzaXplKCkgKTsKLSAgICBtX3Njcmlw
dCA9IERPTVN0cmluZyhkYXRhKTsKLSAgICBtX2xvYWRpbmcgPSBmYWxzZTsKLSAgICBjaGVja05v
dGlmeSgpOwotfQotCi12b2lkIENhY2hlZFNjcmlwdDo6Y2hlY2tOb3RpZnkoKQotewotICAgIGlm
KG1fbG9hZGluZykgcmV0dXJuOwotCi0gICAgQ2FjaGVkT2JqZWN0Q2xpZW50V2Fsa2VyIHcobV9j
bGllbnRzKTsKLSAgICB3aGlsZSAoQ2FjaGVkT2JqZWN0Q2xpZW50ICpjID0gdy5uZXh0KCkpCi0g
ICAgICAgIGMtPm5vdGlmeUZpbmlzaGVkKHRoaXMpOwotfQotCi0KLXZvaWQgQ2FjaGVkU2NyaXB0
OjplcnJvciggaW50IC8qZXJyKi8sIGNvbnN0IGNoYXIgKi8qdGV4dCovICkKLXsKLSAgICBtX2xv
YWRpbmcgPSBmYWxzZTsKLSAgICBtX2Vycm9yT2NjdXJyZWQgPSB0cnVlOwotICAgIGNoZWNrTm90
aWZ5KCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLXN0
YXRpYyBib29sIGNyb3NzRG9tYWluKGNvbnN0IFFTdHJpbmcgJmEsIGNvbnN0IFFTdHJpbmcgJmIp
Ci17Ci0gICAgaWYgKGEgPT0gYikgcmV0dXJuIGZhbHNlOwotCi0gICAgUVN0cmluZ0xpc3QgbDEg
PSBRU3RyaW5nTGlzdDo6c3BsaXQoJy4nLCBhKTsKLSAgICBRU3RyaW5nTGlzdCBsMiA9IFFTdHJp
bmdMaXN0OjpzcGxpdCgnLicsIGIpOwotCi0gICAgd2hpbGUobDEuY291bnQoKSA+IGwyLmNvdW50
KCkpCi0gICAgICAgIGwxLnBvcF9mcm9udCgpOwotCi0gICAgd2hpbGUobDIuY291bnQoKSA+IGwx
LmNvdW50KCkpCi0gICAgICAgIGwyLnBvcF9mcm9udCgpOwotCi0gICAgd2hpbGUobDIuY291bnQo
KSA+PSAyKQotICAgIHsKLSAgICAgICAgaWYgKGwxID09IGwyKQotICAgICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0KLSAgICAgICAgbDEucG9wX2Zyb250KCk7Ci0gICAgICAgIGwyLnBvcF9mcm9udCgp
OwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLQotdm9pZCBDYWNoZWRJbWFnZUNhbGxiYWNrOjpub3RpZnlVcGRhdGUoKSAKLXsgCi0g
ICAgaWYgKGNhY2hlZEltYWdlKSB7Ci0gICAgICAgIGNhY2hlZEltYWdlLT5kb19ub3RpZnkgKGNh
Y2hlZEltYWdlLT5waXhtYXAoKSwgY2FjaGVkSW1hZ2UtPnBpeG1hcCgpLnJlY3QoKSk7IAotICAg
ICAgICBRU2l6ZSBzID0gY2FjaGVkSW1hZ2UtPnBpeG1hcF9zaXplKCk7Ci0gICAgICAgIGNhY2hl
ZEltYWdlLT5zZXRTaXplKHMud2lkdGgoKSAqIHMuaGVpZ2h0KCkgKiAyKTsKLQotICAgICAgICAv
LyBBZnRlciByZWNlaXZpbmcgdGhlIGltYWdlIGhlYWRlciB3ZSBhcmUgZ3VhcmFudGVlZCB0byBr
bm93Ci0gICAgICAgIC8vIHRoZSBpbWFnZSBzaXplLiAgQWx0aG91Z2ggYWxsIG9mIHRoZSBkYXRh
IG1heSBub3QgaGF2ZSBhcnJpdmVkIG9yCi0gICAgICAgIC8vIGJlZW4gZGVjb2RlZCB3ZSBjYW4g
Y29uc2lkZXIgdGhlIGltYWdlIGxvYWRlZCBmb3IgcHVycG9zZWQgb2YKLSAgICAgICAgLy8gbGF5
b3V0IGFuZCBkaXNwYXRjaGluZyB0aGUgaW1hZ2UncyBvbmxvYWQgaGFuZGxlci4gIFJlbW92aW5n
IHRoZSByZXF1ZXN0IGZyb20KLSAgICAgICAgLy8gdGhlIGxpc3Qgb2YgYmFja2dyb3VuZCBkZWNv
ZGluZyByZXF1ZXN0cyB3aWxsIGVuc3VyZSB0aGF0IExvYWRlcjo6bnVtUmVxdWVzdHMoKSAKLSAg
ICAgICAgLy8gZG9lcyBub3QgY291bnQgdGhpcyBiYWNrZ3JvdW5kIHJlcXVlc3QuICBGdXJ0aGVy
IG51bVJlcXVlc3RzKCkgY2FuCi0gICAgICAgIC8vIGJlIGNvcnJlY3RseSB1c2VkIGJ5IHRoZSBw
YXJ0IHRvIGRldGVybWluZSBpZiBsb2FkaW5nIGlzIHN1ZmZpY2llbnRseQotICAgICAgICAvLyBj
b21wbGV0ZSB0byBkaXNwYXRjaCB0aGUgcGFnZSdzIG9ubG9hZCBoYW5kbGVyLgotICAgICAgICBS
ZXF1ZXN0ICpyID0gY2FjaGVkSW1hZ2UtPm1fcmVxdWVzdDsKLSAgICAgICAgRG9jTG9hZGVyICpk
bCA9IHItPm1fZG9jTG9hZGVyOwotCi0gICAgICAgIGtodG1sOjpDYWNoZTo6bG9hZGVyKCktPnJl
bW92ZUJhY2tncm91bmREZWNvZGluZ1JlcXVlc3Qocik7Ci0KLSAgICAgICAgLy8gUG9rZSB0aGUg
cGFydCB0byBnZXQgaXQgdG8gZG8gYSBjaGVja0NvbXBsZXRlZCgpLiAgT25seSBkbyB0aGlzIGZv
cgotICAgICAgICAvLyB0aGUgZmlyc3QgdXBkYXRlIHRvIG1pbmltaXplIHdvcmsuICBOb3RlIHRo
YXQgd2UgYXJlIGd1YXJhbnRlZWQgdG8gaGF2ZQotICAgICAgICAvLyByZWFkIHRoZSBoZWFkZXIg
d2hlbiB3ZSByZWNlaXZlZCB0aGlzIGZpcnN0IHVwZGF0ZSwgd2hpY2ggaXMgdHJpZ2dlcmVkCi0g
ICAgICAgIC8vIGJ5IHRoZSBmaXJzdCBrQ0dJbWFnZVN0YXR1c0luY29tcGxldGUgc3RhdHVzIGZy
b20gQ0cuIGtDR0ltYWdlU3RhdHVzSW5jb21wbGV0ZQotICAgICAgICAvLyByZWFsbHkgbWVhbnMg
dGhhdCB0aGUgQ0cgZGVjb2RlciBpcyB3YWl0aW5nIGZvciBtb3JlIGRhdGEsIGJ1dCBoYXMgYWxy
ZWFkeQotICAgICAgICAvLyByZWFkIHRoZSBoZWFkZXIuCi0gICAgICAgIGlmICghaGVhZGVyUmVj
ZWl2ZWQpIHsKLSAgICAgICAgICAgIGVtaXQga2h0bWw6OkNhY2hlOjpsb2FkZXIoKS0+cmVxdWVz
dERvbmUoIGRsLCBjYWNoZWRJbWFnZSApOwotICAgICAgICAgICAgaGVhZGVyUmVjZWl2ZWQgPSB0
cnVlOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIENhY2hlZEltYWdlQ2FsbGJhY2s6Om5v
dGlmeUZpbmlzaGVkKCkKLXsKLSAgICBpZiAoY2FjaGVkSW1hZ2UpIHsKLSAgICAgICAgY2FjaGVk
SW1hZ2UtPmRvX25vdGlmeSAoY2FjaGVkSW1hZ2UtPnBpeG1hcCgpLCBjYWNoZWRJbWFnZS0+cGl4
bWFwKCkucmVjdCgpKTsgCi0gICAgICAgIGNhY2hlZEltYWdlLT5tX2xvYWRpbmcgPSBmYWxzZTsK
LSAgICAgICAgY2FjaGVkSW1hZ2UtPmNoZWNrTm90aWZ5KCk7Ci0gICAgICAgIFFTaXplIHMgPSBj
YWNoZWRJbWFnZS0+cGl4bWFwX3NpemUoKTsKLSAgICAgICAgY2FjaGVkSW1hZ2UtPnNldFNpemUo
cy53aWR0aCgpICogcy5oZWlnaHQoKSAqIDIpOwotCQotICAgICAgICBSZXF1ZXN0ICpyID0gY2Fj
aGVkSW1hZ2UtPm1fcmVxdWVzdDsKLSAgICAgICAgRG9jTG9hZGVyICpkbCA9IHItPm1fZG9jTG9h
ZGVyOwotCi0gICAgICAgIGtodG1sOjpDYWNoZTo6bG9hZGVyKCktPnJlbW92ZUJhY2tncm91bmRE
ZWNvZGluZ1JlcXVlc3Qocik7Ci0KLSAgICAgICAgLy8gUG9rZSB0aGUgcGFydCB0byBnZXQgaXQg
dG8gZG8gYSBjaGVja0NvbXBsZXRlZCgpLgotICAgICAgICBlbWl0IGtodG1sOjpDYWNoZTo6bG9h
ZGVyKCktPnJlcXVlc3REb25lKCBkbCwgY2FjaGVkSW1hZ2UgKTsKLSAgICAgICAgCi0gICAgICAg
IGRlbGV0ZSByOwotICAgIH0KLX0KLQotdm9pZCBDYWNoZWRJbWFnZUNhbGxiYWNrOjpub3RpZnlE
ZWNvZGluZ0Vycm9yKCkKLXsKLSAgICBpZiAoY2FjaGVkSW1hZ2UpIHsKLSAgICAgICAgaGFuZGxl
RXJyb3IoKTsKLSAgICB9Ci19Ci0KLXZvaWQgQ2FjaGVkSW1hZ2VDYWxsYmFjazo6aGFuZGxlRXJy
b3IoKQotewotICAgIGlmIChjYWNoZWRJbWFnZSkgewotICAgICAgICBjYWNoZWRJbWFnZS0+ZXJy
b3JPY2N1cmVkID0gdHJ1ZTsKLSAgICAgICAgUVBpeG1hcCBlcCA9IGNhY2hlZEltYWdlLT5waXht
YXAoKTsKLSAgICAgICAgY2FjaGVkSW1hZ2UtPmRvX25vdGlmeSAoZXAsIGVwLnJlY3QoKSk7Ci0g
ICAgICAgIENhY2hlOjpyZW1vdmVDYWNoZUVudHJ5IChjYWNoZWRJbWFnZSk7Ci0KLSAgICAgICAg
Y2xlYXIoKTsKLSAgICB9Ci19Ci0KLXZvaWQgQ2FjaGVkSW1hZ2VDYWxsYmFjazo6Y2xlYXIoKSAK
LXsKLSAgICBpZiAoY2FjaGVkSW1hZ2UgJiYgY2FjaGVkSW1hZ2UtPm1fcmVxdWVzdCkgewotICAg
ICAgICBSZXF1ZXN0ICpyID0gY2FjaGVkSW1hZ2UtPm1fcmVxdWVzdDsKLSAgICAgICAgRG9jTG9h
ZGVyICpkbCA9IHItPm1fZG9jTG9hZGVyOwotCi0gICAgICAgIGtodG1sOjpDYWNoZTo6bG9hZGVy
KCktPnJlbW92ZUJhY2tncm91bmREZWNvZGluZ1JlcXVlc3Qocik7Ci0KLSAgICAgICAgLy8gUG9r
ZSB0aGUgcGFydCB0byBnZXQgaXQgdG8gZG8gYSBjaGVja0NvbXBsZXRlZCgpLgotICAgICAgICBl
bWl0IGtodG1sOjpDYWNoZTo6bG9hZGVyKCktPnJlcXVlc3RGYWlsZWQoIGRsLCBjYWNoZWRJbWFn
ZSApOwotCi0gICAgICAgIGRlbGV0ZSByOwotICAgIH0KLSAgICBjYWNoZWRJbWFnZSA9IDA7Ci19
Ci0KLUNhY2hlZEltYWdlOjpDYWNoZWRJbWFnZShEb2NMb2FkZXIqIGRsLCBjb25zdCBET01TdHJp
bmcgJnVybCwgS0lPOjpDYWNoZUNvbnRyb2wgX2NhY2hlUG9saWN5LCB0aW1lX3QgX2V4cGlyZURh
dGUpCi0gICAgOiBRT2JqZWN0KCksIENhY2hlZE9iamVjdCh1cmwsIEltYWdlLCBfY2FjaGVQb2xp
Y3ksIF9leHBpcmVEYXRlKQotICAgICwgbV9kYXRhU2l6ZSgwKQotewotICAgIHAgPSAwOwotICAg
IHBpeFBhcnQgPSAwOwotICAgIGJnID0gMDsKLSAgICBpc0Z1bGx5VHJhbnNwYXJlbnQgPSBmYWxz
ZTsKLSAgICBlcnJvck9jY3VyZWQgPSBmYWxzZTsKLSAgICBtb25vY2hyb21lID0gZmFsc2U7Ci0g
ICAgZm9ybWF0VHlwZSA9IDA7Ci0gICAgbV9zdGF0dXMgPSBVbmtub3duOwotICAgIGltZ1NvdXJj
ZSA9IDA7Ci0gICAgbV9sb2FkaW5nID0gdHJ1ZTsKLSAgICBtX3Nob3dBbmltYXRpb25zID0gZGwt
PnNob3dBbmltYXRpb25zKCk7Ci0gICAgaWYgKFFQaXhtYXA6OnNob3VsZFVzZVRocmVhZGVkRGVj
b2RpbmcoKSkKLSAgICAgICAgbV9kZWNvZGVyQ2FsbGJhY2sgPSBuZXcgQ2FjaGVkSW1hZ2VDYWxs
YmFjayh0aGlzKTsKLSAgICBlbHNlCi0gICAgICAgIG1fZGVjb2RlckNhbGxiYWNrID0gMDsKLX0K
LQotQ2FjaGVkSW1hZ2U6On5DYWNoZWRJbWFnZSgpCi17Ci0gICAgY2xlYXIoKTsKLX0KLQotdm9p
ZCBDYWNoZWRJbWFnZTo6cmVmKCBDYWNoZWRPYmplY3RDbGllbnQgKmMgKQotewotICAgIENhY2hl
ZE9iamVjdDo6cmVmKGMpOwotCi0gICAgLy8gZm9yIG1vdXNlb3ZlcnMsIGR5bmFtaWMgY2hhbmdl
cwotICAgIGlmICghdmFsaWRfcmVjdCgpLmlzTnVsbCgpKQotICAgICAgICBjLT5zZXRQaXhtYXAo
IHBpeG1hcCgpLCB2YWxpZF9yZWN0KCksIHRoaXMpOwotCi0gICAgaWYoIW1fbG9hZGluZykKLSAg
ICAgICAgYy0+bm90aWZ5RmluaXNoZWQodGhpcyk7Ci19Ci0KLXZvaWQgQ2FjaGVkSW1hZ2U6OmRl
cmVmKCBDYWNoZWRPYmplY3RDbGllbnQgKmMgKQotewotICAgIENhY2hlOjpmbHVzaCgpOwotICAg
IENhY2hlZE9iamVjdDo6ZGVyZWYoYyk7Ci0gICAgaWYgKCBjYW5EZWxldGUoKSAmJiBtX2ZyZWUg
KQotICAgICAgICBkZWxldGUgdGhpczsKLX0KLQotY29uc3QgUVBpeG1hcCAmQ2FjaGVkSW1hZ2U6
OnRpbGVkX3BpeG1hcChjb25zdCBRQ29sb3ImIG5ld2MpCi17Ci0gICAgcmV0dXJuIHBpeG1hcCgp
OwotfQotCi1jb25zdCBRUGl4bWFwICZDYWNoZWRJbWFnZTo6cGl4bWFwKCApIGNvbnN0Ci17Ci0g
ICAgaWYoZXJyb3JPY2N1cmVkKQotICAgICAgICByZXR1cm4gKkNhY2hlOjpicm9rZW5QaXhtYXA7
Ci0KLSAgICBpZiAocCkKLSAgICAgICAgcmV0dXJuICpwOwotCi0gICAgcmV0dXJuICpDYWNoZTo6
bnVsbFBpeG1hcDsKLX0KLQotUVNpemUgQ2FjaGVkSW1hZ2U6OnBpeG1hcF9zaXplKCkgY29uc3QK
LXsKLSAgICByZXR1cm4gKHAgPyBwLT5zaXplKCkgOiBRU2l6ZSgpKTsKLX0KLQotUVJlY3QgQ2Fj
aGVkSW1hZ2U6OnZhbGlkX3JlY3QoKSBjb25zdAotewotICAgIHJldHVybiAocCA/IHAtPnJlY3Qo
KSA6IFFSZWN0KCkpOwotfQotCi12b2lkIENhY2hlZEltYWdlOjpkb19ub3RpZnkoY29uc3QgUVBp
eG1hcCYgcCwgY29uc3QgUVJlY3QmIHIpCi17Ci0gICAgQ2FjaGVkT2JqZWN0Q2xpZW50V2Fsa2Vy
IHcobV9jbGllbnRzKTsKLSAgICB3aGlsZSAoQ2FjaGVkT2JqZWN0Q2xpZW50ICpjID0gdy5uZXh0
KCkpCi0gICAgICAgIGMtPnNldFBpeG1hcChwLCByLCB0aGlzKTsKLX0KLQotdm9pZCBDYWNoZWRJ
bWFnZTo6c2V0U2hvd0FuaW1hdGlvbnMoIEtIVE1MU2V0dGluZ3M6OktBbmltYXRpb25BZHZpY2Ug
c2hvd0FuaW1hdGlvbnMgKQotewotICAgIG1fc2hvd0FuaW1hdGlvbnMgPSBzaG93QW5pbWF0aW9u
czsKLX0KLQotdm9pZCBDYWNoZWRJbWFnZTo6Y2xlYXIoKQotewotICAgIGRlbGV0ZSBwOyAgIHAg
PSAwOwotICAgIGRlbGV0ZSBiZzsgIGJnID0gMDsKLSAgICBkZWxldGUgcGl4UGFydDsgcGl4UGFy
dCA9IDA7Ci0KLSAgICBmb3JtYXRUeXBlID0gMDsKLQotICAgIHNldFNpemUoMCk7Ci0KLSAgICAv
LyBObyBuZWVkIHRvIGRlbGV0ZSBpbWFnZVNvdXJjZSAtIFFNb3ZpZSBkb2VzIGl0IGZvciB1cwot
ICAgIGltZ1NvdXJjZSA9IDA7Ci0KLSAgICBpZiAobV9kZWNvZGVyQ2FsbGJhY2spIHsKLSAgICAg
ICAgbV9kZWNvZGVyQ2FsbGJhY2stPmNsZWFyKCk7Ci0gICAgICAgIG1fZGVjb2RlckNhbGxiYWNr
LT5kZXJlZigpOwotICAgICAgICBtX2RlY29kZXJDYWxsYmFjayA9IDA7Ci0gICAgfQotfQotCi12
b2lkIENhY2hlZEltYWdlOjpkYXRhICggUUJ1ZmZlciAmX2J1ZmZlciwgYm9vbCBlb2YgKQotewot
I2lmZGVmIENBQ0hFX0RFQlVHCi0gICAga2REZWJ1ZyggNjA2MCApIDw8IHRoaXMgPDwgImluIENh
Y2hlZEltYWdlOjpkYXRhKGJ1ZmZlcnNpemUgIiA8PCBfYnVmZmVyLmJ1ZmZlcigpLnNpemUoKSA8
PCIsIGVvZj0iIDw8IGVvZiA8PCBlbmRsOwotI2VuZGlmCi0KLSAgICBib29sIGNhbkRyYXcgPSBm
YWxzZTsKLSAgICAKLSAgICBtX2RhdGFTaXplID0gX2J1ZmZlci5zaXplKCk7Ci0gICAgICAgIAot
ICAgIC8vIElmIHdlJ3JlIGF0IGVvZiBhbmQgZG9uJ3QgaGF2ZSBhIHBpeG1hcCB5ZXQsIHRoZSBk
YXRhCi0gICAgLy8gbXVzdCBoYXZlIGFycml2ZWQgaW4gb25lIGNodW5rLiAgVGhpcyBhdm9pZHMg
dGhlIGF0dGVtcHQKLSAgICAvLyB0byBwZXJmb3JtIGluY3JlbWVudGFsIGRlY29kaW5nLgotICAg
IGlmIChlb2YgJiYgIXApIHsKLSAgICAgICAgcCA9IG5ldyBRUGl4bWFwKF9idWZmZXIuYnVmZmVy
KCksIEtXUVJlc3BvbnNlTUlNRVR5cGUobV9yZXNwb25zZSkpOwotICAgICAgICBpZiAobV9kZWNv
ZGVyQ2FsbGJhY2spCi0gICAgICAgICAgICBtX2RlY29kZXJDYWxsYmFjay0+bm90aWZ5RmluaXNo
ZWQoKTsKLSAgICAgICAgY2FuRHJhdyA9IHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8g
QWx3YXlzIGF0dGVtcHQgdG8gbG9hZCB0aGUgaW1hZ2UgaW5jcmVtZW50YWxseS4KLSAgICAgICAg
aWYgKCFwKQotICAgICAgICAgICAgcCA9IG5ldyBRUGl4bWFwKEtXUVJlc3BvbnNlTUlNRVR5cGUo
bV9yZXNwb25zZSkpOwotICAgICAgICBjYW5EcmF3ID0gcC0+cmVjZWl2ZWREYXRhKF9idWZmZXIu
YnVmZmVyKCksIGVvZiwgbV9kZWNvZGVyQ2FsbGJhY2spOwotICAgIH0KLSAgICAKLSAgICAvLyBJ
ZiB3ZSBoYXZlIGEgZGVjb2Rlciwgd2UnbGwgYmUgbm90aWZpZWQgd2hlbiBkZWNvZGluZyBoYXMg
Y29tcGxldGVkLgotICAgIGlmICghbV9kZWNvZGVyQ2FsbGJhY2spIHsKLSAgICAgICAgaWYgKGNh
bkRyYXcgfHwgZW9mKSB7Ci0gICAgICAgICAgICBpZiAocC0+aXNOdWxsKCkpIHsKLSAgICAgICAg
ICAgICAgICBlcnJvck9jY3VyZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIFFQaXhtYXAgZXAg
PSBwaXhtYXAoKTsKLSAgICAgICAgICAgICAgICBkb19ub3RpZnkgKGVwLCBlcC5yZWN0KCkpOwot
ICAgICAgICAgICAgICAgIENhY2hlOjpyZW1vdmVDYWNoZUVudHJ5ICh0aGlzKTsKLSAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBkb19ub3RpZnkoKnAsIHAt
PnJlY3QoKSk7Ci0KLSAgICAgICAgICAgIFFTaXplIHMgPSBwaXhtYXBfc2l6ZSgpOwotICAgICAg
ICAgICAgc2V0U2l6ZShzLndpZHRoKCkgKiBzLmhlaWdodCgpICogMik7Ci0gICAgICAgIH0KLSAg
ICAgICAgaWYgKGVvZikgewotICAgICAgICAgICAgbV9sb2FkaW5nID0gZmFsc2U7Ci0gICAgICAg
ICAgICBjaGVja05vdGlmeSgpOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIENhY2hlZElt
YWdlOjplcnJvciggaW50IC8qZXJyKi8sIGNvbnN0IGNoYXIgKi8qdGV4dCovICkKLXsKLSNpZmRl
ZiBDQUNIRV9ERUJVRwotICAgIGtkRGVidWcoNjA2MCkgPDwgIkNhaGNlZEltYWdlOjplcnJvciIg
PDwgZW5kbDsKLSNlbmRpZgotCi0gICAgY2xlYXIoKTsKLSAgICBlcnJvck9jY3VyZWQgPSB0cnVl
OwotICAgIGRvX25vdGlmeShwaXhtYXAoKSwgUVJlY3QoMCwgMCwgMTYsIDE2KSk7Ci0gICAgbV9s
b2FkaW5nID0gZmFsc2U7Ci0gICAgY2hlY2tOb3RpZnkoKTsKLX0KLQotdm9pZCBDYWNoZWRJbWFn
ZTo6Y2hlY2tOb3RpZnkoKQotewotICAgIGlmKG1fbG9hZGluZykgcmV0dXJuOwotCi0gICAgQ2Fj
aGVkT2JqZWN0Q2xpZW50V2Fsa2VyIHcobV9jbGllbnRzKTsKLSAgICB3aGlsZSAoQ2FjaGVkT2Jq
ZWN0Q2xpZW50ICpjID0gdy5uZXh0KCkpIHsKLSAgICAgICAgYy0+bm90aWZ5RmluaXNoZWQodGhp
cyk7Ci0gICAgfQotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0K
LSNpZmRlZiBLSFRNTF9YU0xUCi0KLUNhY2hlZFhTTFN0eWxlU2hlZXQ6OkNhY2hlZFhTTFN0eWxl
U2hlZXQoRG9jTG9hZGVyKiBkbCwgY29uc3QgRE9NU3RyaW5nICZ1cmwsIEtJTzo6Q2FjaGVDb250
cm9sIF9jYWNoZVBvbGljeSwgdGltZV90IF9leHBpcmVEYXRlKQotOiBDYWNoZWRPYmplY3QodXJs
LCBYU0xTdHlsZVNoZWV0LCBfY2FjaGVQb2xpY3ksIF9leHBpcmVEYXRlKQotewotICAgIC8vIEl0
J3MgWE1MIHdlIHdhbnQuCi0gICAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIGFjY2VwdCBtb3JlIGdl
bmVyYWwgeG1sIGZvcm1hdHMgKi8qK3htbCwgaW1hZ2Uvc3ZnK3htbCBmb3IgZXhhbXBsZS4KLSAg
ICBzZXRBY2NlcHQoInRleHQveG1sLCBhcHBsaWNhdGlvbi94bWwsIGFwcGxpY2F0aW9uL3hodG1s
K3htbCwgdGV4dC94c2wsIGFwcGxpY2F0aW9uL3Jzcyt4bWwsIGFwcGxpY2F0aW9uL2F0b20reG1s
Iik7Ci0gICAgCi0gICAgLy8gbG9hZCB0aGUgZmlsZQotICAgIENhY2hlOjpsb2FkZXIoKS0+bG9h
ZChkbCwgdGhpcywgZmFsc2UpOwotICAgIG1fbG9hZGluZyA9IHRydWU7Ci0gICAgbV9kZWNvZGVy
ID0gbmV3IERlY29kZXI7Ci19Ci0KLXZvaWQgQ2FjaGVkWFNMU3R5bGVTaGVldDo6cmVmKENhY2hl
ZE9iamVjdENsaWVudCAqYykKLXsKLSAgICBDYWNoZWRPYmplY3Q6OnJlZihjKTsKLSAgICAKLSAg
ICBpZiAoIW1fbG9hZGluZykKLSAgICAgICAgYy0+c2V0U3R5bGVTaGVldChtX3VybCwgbV9zaGVl
dCk7Ci19Ci0KLXZvaWQgQ2FjaGVkWFNMU3R5bGVTaGVldDo6ZGVyZWYoQ2FjaGVkT2JqZWN0Q2xp
ZW50ICpjKQotewotICAgIENhY2hlOjpmbHVzaCgpOwotICAgIENhY2hlZE9iamVjdDo6ZGVyZWYo
Yyk7Ci0gICAgaWYgKGNhbkRlbGV0ZSgpICYmIG1fZnJlZSkKLSAgICAgICAgZGVsZXRlIHRoaXM7
Ci19Ci0KLXZvaWQgQ2FjaGVkWFNMU3R5bGVTaGVldDo6c2V0Q2hhcnNldCggY29uc3QgUVN0cmlu
ZyAmY2hzICkKLXsKLSAgICBpZiAoIWNocy5pc0VtcHR5KCkpCi0gICAgICAgIG1fZGVjb2Rlci0+
c2V0RW5jb2RpbmcoY2hzLmxhdGluMSgpLCBEZWNvZGVyOjpFbmNvZGluZ0Zyb21IVFRQSGVhZGVy
KTsKLX0KLQotdm9pZCBDYWNoZWRYU0xTdHlsZVNoZWV0OjpkYXRhKFFCdWZmZXIgJmJ1ZmZlciwg
Ym9vbCBlb2YpCi17Ci0gICAgaWYoIWVvZikgcmV0dXJuOwotICAgIGJ1ZmZlci5jbG9zZSgpOwot
ICAgIHNldFNpemUoYnVmZmVyLmJ1ZmZlcigpLnNpemUoKSk7Ci0gICAgUVN0cmluZyBkYXRhID0g
bV9kZWNvZGVyLT5kZWNvZGUoYnVmZmVyLmJ1ZmZlcigpLmRhdGEoKSwgc2l6ZSgpKTsKLSAgICBt
X3NoZWV0ID0gRE9NU3RyaW5nKGRhdGEpOwotICAgIG1fbG9hZGluZyA9IGZhbHNlOwotICAgIAot
ICAgIGNoZWNrTm90aWZ5KCk7Ci19Ci0KLXZvaWQgQ2FjaGVkWFNMU3R5bGVTaGVldDo6Y2hlY2tO
b3RpZnkoKQotewotICAgIGlmIChtX2xvYWRpbmcpCi0gICAgICAgIHJldHVybjsKLSAgICAKLSAg
ICBDYWNoZWRPYmplY3RDbGllbnRXYWxrZXIgdyhtX2NsaWVudHMpOwotICAgIHdoaWxlIChDYWNo
ZWRPYmplY3RDbGllbnQgKmMgPSB3Lm5leHQoKSkKLSAgICAgICAgYy0+c2V0U3R5bGVTaGVldCht
X3VybCwgbV9zaGVldCk7Ci19Ci0KLQotdm9pZCBDYWNoZWRYU0xTdHlsZVNoZWV0OjplcnJvcigg
aW50IC8qZXJyKi8sIGNvbnN0IGNoYXIgKi8qdGV4dCovICkKLXsKLSAgICBtX2xvYWRpbmcgPSBm
YWxzZTsKLSAgICBjaGVja05vdGlmeSgpOwotfQotCi0jZW5kaWYKLQotI2lmbmRlZiBLSFRNTF9O
T19YQkwKLUNhY2hlZFhCTERvY3VtZW50OjpDYWNoZWRYQkxEb2N1bWVudChEb2NMb2FkZXIqIGRs
LCBjb25zdCBET01TdHJpbmcgJnVybCwgS0lPOjpDYWNoZUNvbnRyb2wgX2NhY2hlUG9saWN5LCB0
aW1lX3QgX2V4cGlyZURhdGUpCi06IENhY2hlZE9iamVjdCh1cmwsIFhCTCwgX2NhY2hlUG9saWN5
LCBfZXhwaXJlRGF0ZSksIG1fZG9jdW1lbnQoMCkKLXsKLSAgICAvLyBJdCdzIFhNTCB3ZSB3YW50
LgotICAgIHNldEFjY2VwdCgidGV4dC94bWwsIGFwcGxpY2F0aW9uL3htbCwgYXBwbGljYXRpb24v
eGh0bWwreG1sLCB0ZXh0L3hzbCwgYXBwbGljYXRpb24vcnNzK3htbCwgYXBwbGljYXRpb24vYXRv
bSt4bWwiKTsKLSAgICAKLSAgICAvLyBMb2FkIHRoZSBmaWxlCi0gICAgQ2FjaGU6OmxvYWRlcigp
LT5sb2FkKGRsLCB0aGlzLCBmYWxzZSk7Ci0gICAgbV9sb2FkaW5nID0gdHJ1ZTsKLSAgICBtX2Rl
Y29kZXIgPSBuZXcgRGVjb2RlcjsKLX0KLQotQ2FjaGVkWEJMRG9jdW1lbnQ6On5DYWNoZWRYQkxE
b2N1bWVudCgpCi17Ci0gICAgaWYgKG1fZG9jdW1lbnQpCi0gICAgICAgIG1fZG9jdW1lbnQtPmRl
cmVmKCk7Ci19Ci0KLXZvaWQgQ2FjaGVkWEJMRG9jdW1lbnQ6OnJlZihDYWNoZWRPYmplY3RDbGll
bnQgKmMpCi17Ci0gICAgQ2FjaGVkT2JqZWN0OjpyZWYoYyk7Ci0gICAgaWYgKCFtX2xvYWRpbmcp
Ci0gICAgICAgIGMtPnNldFhCTERvY3VtZW50KG1fdXJsLCBtX2RvY3VtZW50KTsKLX0KLQotdm9p
ZCBDYWNoZWRYQkxEb2N1bWVudDo6ZGVyZWYoQ2FjaGVkT2JqZWN0Q2xpZW50ICpjKQotewotICAg
IENhY2hlOjpmbHVzaCgpOwotICAgIENhY2hlZE9iamVjdDo6ZGVyZWYoYyk7Ci0gICAgaWYgKGNh
bkRlbGV0ZSgpICYmIG1fZnJlZSkKLSAgICAgICAgZGVsZXRlIHRoaXM7Ci19Ci0KLXZvaWQgQ2Fj
aGVkWEJMRG9jdW1lbnQ6OnNldENoYXJzZXQoIGNvbnN0IFFTdHJpbmcgJmNocyApCi17Ci0gICAg
aWYgKCFjaHMuaXNFbXB0eSgpKQotICAgICAgICBtX2RlY29kZXItPnNldEVuY29kaW5nKGNocy5s
YXRpbjEoKSwgRGVjb2Rlcjo6RW5jb2RpbmdGcm9tSFRUUEhlYWRlcik7Ci19Ci0KLXZvaWQgQ2Fj
aGVkWEJMRG9jdW1lbnQ6OmRhdGEoIFFCdWZmZXIgJmJ1ZmZlciwgYm9vbCBlb2YgKQotewotICAg
IGlmICghZW9mKSByZXR1cm47Ci0gICAgCi0gICAgYXNzZXJ0KCFtX2RvY3VtZW50KTsKLSAgICAK
LSAgICBtX2RvY3VtZW50ID0gIG5ldyBYQkw6OlhCTERvY3VtZW50SW1wbCgpOwotICAgIG1fZG9j
dW1lbnQtPnJlZigpOwotICAgIG1fZG9jdW1lbnQtPm9wZW4oKTsKLSAgICAKLSAgICBRU3RyaW5n
IGRhdGEgPSBtX2RlY29kZXItPmRlY29kZShidWZmZXIuYnVmZmVyKCkuZGF0YSgpLCBidWZmZXIu
YnVmZmVyKCkuc2l6ZSgpKTsKLSAgICBtX2RvY3VtZW50LT53cml0ZShkYXRhKTsKLSAgICBzZXRT
aXplKGJ1ZmZlci5idWZmZXIoKS5zaXplKCkpOwotICAgIGJ1ZmZlci5jbG9zZSgpOwotICAgIAot
ICAgIG1fZG9jdW1lbnQtPmZpbmlzaFBhcnNpbmcoKTsKLSAgICBtX2RvY3VtZW50LT5jbG9zZSgp
OwotICAgIG1fbG9hZGluZyA9IGZhbHNlOwotICAgIGNoZWNrTm90aWZ5KCk7Ci19Ci0KLXZvaWQg
Q2FjaGVkWEJMRG9jdW1lbnQ6OmNoZWNrTm90aWZ5KCkKLXsKLSAgICBpZihtX2xvYWRpbmcpCi0g
ICAgICAgIHJldHVybjsKLSAgICAKLSAgICBDYWNoZWRPYmplY3RDbGllbnRXYWxrZXIgdyhtX2Ns
aWVudHMpOwotICAgIHdoaWxlIChDYWNoZWRPYmplY3RDbGllbnQgKmMgPSB3Lm5leHQoKSkKLSAg
ICAgICAgYy0+c2V0WEJMRG9jdW1lbnQobV91cmwsIG1fZG9jdW1lbnQpOwotfQotCi0KLXZvaWQg
Q2FjaGVkWEJMRG9jdW1lbnQ6OmVycm9yKCBpbnQgLyplcnIqLywgY29uc3QgY2hhciAqLyp0ZXh0
Ki8gKQotewotICAgIG1fbG9hZGluZyA9IGZhbHNlOwotICAgIGNoZWNrTm90aWZ5KCk7Ci19Ci0j
ZW5kaWYKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVJlcXVlc3Q6
OlJlcXVlc3QoRG9jTG9hZGVyKiBkbCwgQ2FjaGVkT2JqZWN0ICpfb2JqZWN0LCBib29sIF9pbmNy
ZW1lbnRhbCkKLXsKLSAgICBvYmplY3QgPSBfb2JqZWN0OwotICAgIG9iamVjdC0+c2V0UmVxdWVz
dCh0aGlzKTsKLSAgICBpbmNyZW1lbnRhbCA9IF9pbmNyZW1lbnRhbDsKLSAgICBtX2RvY0xvYWRl
ciA9IGRsOwotICAgIG11bHRpcGFydCA9IGZhbHNlOwotfQotCi1SZXF1ZXN0Ojp+UmVxdWVzdCgp
Ci17Ci0gICAgb2JqZWN0LT5zZXRSZXF1ZXN0KDApOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0KLQotRG9jTG9hZGVyOjpEb2NMb2FkZXIoS0hUTUxQYXJ0KiBwYXJ0
LCBEb2N1bWVudEltcGwqIGRvYykKLXsKLSAgICBtX2NhY2hlUG9saWN5ID0gS0lPOjpDQ19WZXJp
Znk7Ci0gICAgbV9leHBpcmVEYXRlID0gMDsKLSAgICBtX2JhdXRvbG9hZEltYWdlcyA9IHRydWU7
Ci0gICAgbV9zaG93QW5pbWF0aW9ucyA9IEtIVE1MU2V0dGluZ3M6OktBbmltYXRpb25FbmFibGVk
OwotICAgIG1fcGFydCA9IHBhcnQ7Ci0gICAgbV9kb2MgPSBkb2M7Ci0gICAgbV9sb2FkSW5Qcm9n
cmVzcyA9IGZhbHNlOwotCi0gICAgQ2FjaGU6OmluaXQoKTsKLSAgICBDYWNoZTo6ZG9jbG9hZGVy
LT5hcHBlbmQoIHRoaXMgKTsKLX0KLQotRG9jTG9hZGVyOjp+RG9jTG9hZGVyKCkKLXsKLSAgICBD
YWNoZTo6ZG9jbG9hZGVyLT5yZW1vdmUoIHRoaXMgKTsKLX0KLQotdm9pZCBEb2NMb2FkZXI6OnNl
dEV4cGlyZURhdGUodGltZV90IF9leHBpcmVEYXRlKQotewotICAgIG1fZXhwaXJlRGF0ZSA9IF9l
eHBpcmVEYXRlOwotfQotCi1ib29sIERvY0xvYWRlcjo6bmVlZFJlbG9hZChjb25zdCBLVVJMICZm
dWxsVVJMKQotewotICAgIGJvb2wgcmVsb2FkID0gZmFsc2U7Ci0gICAgaWYgKG1fY2FjaGVQb2xp
Y3kgPT0gS0lPOjpDQ19WZXJpZnkpCi0gICAgewotICAgICAgIGlmICghbV9yZWxvYWRlZFVSTHMu
Y29udGFpbnMoZnVsbFVSTC51cmwoKSkpCi0gICAgICAgewotICAgICAgICAgIENhY2hlZE9iamVj
dCAqZXhpc3RpbmcgPSBDYWNoZTo6Y2FjaGUtPmZpbmQoZnVsbFVSTC51cmwoKSk7Ci0gICAgICAg
ICAgaWYgKGV4aXN0aW5nICYmIGV4aXN0aW5nLT5pc0V4cGlyZWQoKSkKLSAgICAgICAgICB7Ci0g
ICAgICAgICAgICAgQ2FjaGU6OnJlbW92ZUNhY2hlRW50cnkoZXhpc3RpbmcpOwotICAgICAgICAg
ICAgIG1fcmVsb2FkZWRVUkxzLmFwcGVuZChmdWxsVVJMLnVybCgpKTsKLSAgICAgICAgICAgICBy
ZWxvYWQgPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYg
KChtX2NhY2hlUG9saWN5ID09IEtJTzo6Q0NfUmVsb2FkKSB8fCAobV9jYWNoZVBvbGljeSA9PSBL
SU86OkNDX1JlZnJlc2gpKQotICAgIHsKLSAgICAgICBpZiAoIW1fcmVsb2FkZWRVUkxzLmNvbnRh
aW5zKGZ1bGxVUkwudXJsKCkpKQotICAgICAgIHsKLSAgICAgICAgICBDYWNoZWRPYmplY3QgKmV4
aXN0aW5nID0gQ2FjaGU6OmNhY2hlLT5maW5kKGZ1bGxVUkwudXJsKCkpOwotICAgICAgICAgIGlm
IChleGlzdGluZykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAgQ2FjaGU6OnJlbW92ZUNhY2hl
RW50cnkoZXhpc3RpbmcpOwotICAgICAgICAgIH0KLSAgICAgICAgICBtX3JlbG9hZGVkVVJMcy5h
cHBlbmQoZnVsbFVSTC51cmwoKSk7Ci0gICAgICAgICAgcmVsb2FkID0gdHJ1ZTsKLSAgICAgICB9
Ci0gICAgfQotICAgIHJldHVybiByZWxvYWQ7Ci19Ci0KLUNhY2hlZEltYWdlICpEb2NMb2FkZXI6
OnJlcXVlc3RJbWFnZSggY29uc3QgRE9NOjpET01TdHJpbmcgJnVybCkKLXsKLSAgICBLVVJMIGZ1
bGxVUkwgPSBtX2RvYy0+Y29tcGxldGVVUkwodXJsLnFzdHJpbmcoKSk7Ci0gICAgaWYgKCBtX3Bh
cnQgJiYgbV9wYXJ0LT5vbmx5TG9jYWxSZWZlcmVuY2VzKCkgJiYgZnVsbFVSTC5wcm90b2NvbCgp
ICE9ICJmaWxlIikgcmV0dXJuIDA7Ci0KLSAgICBpZiAoS1dRQ2hlY2tJZlJlbG9hZGluZyh0aGlz
KSkgewotICAgICAgICBzZXRDYWNoZVBvbGljeShLSU86OkNDX1JlbG9hZCk7Ci0gICAgfQotCi0g
ICAgYm9vbCByZWxvYWQgPSBuZWVkUmVsb2FkKGZ1bGxVUkwpOwotCi0gICAgQ2FjaGVkSW1hZ2Ug
KmNhY2hlZE9iamVjdCA9IENhY2hlOjpyZXF1ZXN0SW1hZ2UodGhpcywgZnVsbFVSTCwgcmVsb2Fk
LCBtX2V4cGlyZURhdGUpOwotICAgIEtXUUNoZWNrQ2FjaGVPYmplY3RTdGF0dXModGhpcywgY2Fj
aGVkT2JqZWN0KTsKLSAgICByZXR1cm4gY2FjaGVkT2JqZWN0OwotfQotCi1DYWNoZWRDU1NTdHls
ZVNoZWV0ICpEb2NMb2FkZXI6OnJlcXVlc3RTdHlsZVNoZWV0KCBjb25zdCBET006OkRPTVN0cmlu
ZyAmdXJsLCBjb25zdCBRU3RyaW5nJiBjaGFyc2V0KQotewotICAgIEtVUkwgZnVsbFVSTCA9IG1f
ZG9jLT5jb21wbGV0ZVVSTCh1cmwucXN0cmluZygpKTsKLSAgICBpZiAoIG1fcGFydCAmJiBtX3Bh
cnQtPm9ubHlMb2NhbFJlZmVyZW5jZXMoKSAmJiBmdWxsVVJMLnByb3RvY29sKCkgIT0gImZpbGUi
KSByZXR1cm4gMDsKLQotICAgIGlmIChLV1FDaGVja0lmUmVsb2FkaW5nKHRoaXMpKSB7Ci0gICAg
ICAgIHNldENhY2hlUG9saWN5KEtJTzo6Q0NfUmVsb2FkKTsKLSAgICB9Ci0KLSAgICBib29sIHJl
bG9hZCA9IG5lZWRSZWxvYWQoZnVsbFVSTCk7Ci0KLSAgICBDYWNoZWRDU1NTdHlsZVNoZWV0ICpj
YWNoZWRPYmplY3QgPSBDYWNoZTo6cmVxdWVzdFN0eWxlU2hlZXQodGhpcywgdXJsLCByZWxvYWQs
IG1fZXhwaXJlRGF0ZSwgY2hhcnNldCk7Ci0gICAgS1dRQ2hlY2tDYWNoZU9iamVjdFN0YXR1cyh0
aGlzLCBjYWNoZWRPYmplY3QpOwotICAgIHJldHVybiBjYWNoZWRPYmplY3Q7Ci19Ci0KLUNhY2hl
ZFNjcmlwdCAqRG9jTG9hZGVyOjpyZXF1ZXN0U2NyaXB0KCBjb25zdCBET006OkRPTVN0cmluZyAm
dXJsLCBjb25zdCBRU3RyaW5nJiBjaGFyc2V0KQotewotICAgIEtVUkwgZnVsbFVSTCA9IG1fZG9j
LT5jb21wbGV0ZVVSTCh1cmwucXN0cmluZygpKTsKLSAgICBpZiAoIG1fcGFydCAmJiBtX3BhcnQt
Pm9ubHlMb2NhbFJlZmVyZW5jZXMoKSAmJiBmdWxsVVJMLnByb3RvY29sKCkgIT0gImZpbGUiKSBy
ZXR1cm4gMDsKLQotICAgIGlmIChLV1FDaGVja0lmUmVsb2FkaW5nKHRoaXMpKSB7Ci0gICAgICAg
IHNldENhY2hlUG9saWN5KEtJTzo6Q0NfUmVsb2FkKTsKLSAgICB9Ci0KLSAgICBib29sIHJlbG9h
ZCA9IG5lZWRSZWxvYWQoZnVsbFVSTCk7Ci0KLSAgICBDYWNoZWRTY3JpcHQgKmNhY2hlZE9iamVj
dCA9IENhY2hlOjpyZXF1ZXN0U2NyaXB0KHRoaXMsIHVybCwgcmVsb2FkLCBtX2V4cGlyZURhdGUs
IGNoYXJzZXQpOwotICAgIEtXUUNoZWNrQ2FjaGVPYmplY3RTdGF0dXModGhpcywgY2FjaGVkT2Jq
ZWN0KTsKLSAgICByZXR1cm4gY2FjaGVkT2JqZWN0OwotfQotCi0jaWZkZWYgS0hUTUxfWFNMVAot
Q2FjaGVkWFNMU3R5bGVTaGVldCogRG9jTG9hZGVyOjpyZXF1ZXN0WFNMU3R5bGVTaGVldChjb25z
dCBET006OkRPTVN0cmluZyAmdXJsKQotewotICAgIEtVUkwgZnVsbFVSTCA9IG1fZG9jLT5jb21w
bGV0ZVVSTCh1cmwucXN0cmluZygpKTsKLSAgICAKLSAgICBpZiAobV9wYXJ0ICYmIG1fcGFydC0+
b25seUxvY2FsUmVmZXJlbmNlcygpICYmIGZ1bGxVUkwucHJvdG9jb2woKSAhPSAiZmlsZSIpIHJl
dHVybiAwOwotICAgIAotICAgIGlmIChLV1FDaGVja0lmUmVsb2FkaW5nKHRoaXMpKQotICAgICAg
ICBzZXRDYWNoZVBvbGljeShLSU86OkNDX1JlbG9hZCk7Ci0gICAgCi0gICAgYm9vbCByZWxvYWQg
PSBuZWVkUmVsb2FkKGZ1bGxVUkwpOwotICAgIAotICAgIENhY2hlZFhTTFN0eWxlU2hlZXQgKmNh
Y2hlZE9iamVjdCA9IENhY2hlOjpyZXF1ZXN0WFNMU3R5bGVTaGVldCh0aGlzLCB1cmwsIHJlbG9h
ZCwgbV9leHBpcmVEYXRlKTsKLSAgICBLV1FDaGVja0NhY2hlT2JqZWN0U3RhdHVzKHRoaXMsIGNh
Y2hlZE9iamVjdCk7Ci0gICAgcmV0dXJuIGNhY2hlZE9iamVjdDsKLX0KLSNlbmRpZgotCi0jaWZu
ZGVmIEtIVE1MX05PX1hCTAotQ2FjaGVkWEJMRG9jdW1lbnQqIERvY0xvYWRlcjo6cmVxdWVzdFhC
TERvY3VtZW50KGNvbnN0IERPTTo6RE9NU3RyaW5nICZ1cmwpCi17Ci0gICAgS1VSTCBmdWxsVVJM
ID0gbV9kb2MtPmNvbXBsZXRlVVJMKHVybC5xc3RyaW5nKCkpOwotICAgIAotICAgIC8vIEZJWE1F
OiBJcyB0aGlzIHJpZ2h0IGZvciBYQkw/Ci0gICAgaWYgKG1fcGFydCAmJiBtX3BhcnQtPm9ubHlM
b2NhbFJlZmVyZW5jZXMoKSAmJiBmdWxsVVJMLnByb3RvY29sKCkgIT0gImZpbGUiKSByZXR1cm4g
MDsKLSAgICAKLSAgICBpZiAoS1dRQ2hlY2tJZlJlbG9hZGluZyh0aGlzKSkgewotICAgICAgICBz
ZXRDYWNoZVBvbGljeShLSU86OkNDX1JlbG9hZCk7Ci0gICAgfQotICAgIAotICAgIGJvb2wgcmVs
b2FkID0gbmVlZFJlbG9hZChmdWxsVVJMKTsKLSAgICAKLSAgICBDYWNoZWRYQkxEb2N1bWVudCAq
Y2FjaGVkT2JqZWN0ID0gQ2FjaGU6OnJlcXVlc3RYQkxEb2N1bWVudCh0aGlzLCB1cmwsIHJlbG9h
ZCwgbV9leHBpcmVEYXRlKTsKLSAgICBLV1FDaGVja0NhY2hlT2JqZWN0U3RhdHVzKHRoaXMsIGNh
Y2hlZE9iamVjdCk7Ci0gICAgcmV0dXJuIGNhY2hlZE9iamVjdDsKLX0KLSNlbmRpZgotCi12b2lk
IERvY0xvYWRlcjo6c2V0QXV0b2xvYWRJbWFnZXMoIGJvb2wgZW5hYmxlICkKLXsKLSAgICBpZiAo
IGVuYWJsZSA9PSBtX2JhdXRvbG9hZEltYWdlcyApCi0gICAgICAgIHJldHVybjsKLQotICAgIG1f
YmF1dG9sb2FkSW1hZ2VzID0gZW5hYmxlOwotCi0gICAgaWYgKCAhbV9iYXV0b2xvYWRJbWFnZXMg
KSByZXR1cm47Ci0KLSAgICBmb3IgKCBjb25zdCBDYWNoZWRPYmplY3QqIGNvPW1fZG9jT2JqZWN0
cy5maXJzdCgpOyBjbzsgY289bV9kb2NPYmplY3RzLm5leHQoKSApCi0gICAgICAgIGlmICggY28t
PnR5cGUoKSA9PSBDYWNoZWRPYmplY3Q6OkltYWdlICkKLSAgICAgICAgewotICAgICAgICAgICAg
Q2FjaGVkSW1hZ2UgKmltZyA9IGNvbnN0X2Nhc3Q8Q2FjaGVkSW1hZ2UqPiggc3RhdGljX2Nhc3Q8
Y29uc3QgQ2FjaGVkSW1hZ2UgKj4oIGNvICkgKTsKLQotICAgICAgICAgICAgQ2FjaGVkT2JqZWN0
OjpTdGF0dXMgc3RhdHVzID0gaW1nLT5zdGF0dXMoKTsKLSAgICAgICAgICAgIGlmICggc3RhdHVz
ICE9IENhY2hlZE9iamVjdDo6VW5rbm93biApCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0K
LSAgICAgICAgICAgIENhY2hlOjpsb2FkZXIoKS0+bG9hZCh0aGlzLCBpbWcsIHRydWUpOwotICAg
ICAgICB9Ci19Ci0KLXZvaWQgRG9jTG9hZGVyOjpzZXRDYWNoZVBvbGljeSggS0lPOjpDYWNoZUNv
bnRyb2wgY2FjaGVQb2xpY3kgKQotewotICAgIG1fY2FjaGVQb2xpY3kgPSBjYWNoZVBvbGljeTsK
LX0KLQotdm9pZCBEb2NMb2FkZXI6OnNldFNob3dBbmltYXRpb25zKCBLSFRNTFNldHRpbmdzOjpL
QW5pbWF0aW9uQWR2aWNlIHNob3dBbmltYXRpb25zICkKLXsKLSAgICBpZiAoIHNob3dBbmltYXRp
b25zID09IG1fc2hvd0FuaW1hdGlvbnMgKSByZXR1cm47Ci0gICAgbV9zaG93QW5pbWF0aW9ucyA9
IHNob3dBbmltYXRpb25zOwotCi0gICAgY29uc3QgQ2FjaGVkT2JqZWN0KiBjbzsKLSAgICBmb3Ig
KCBjbz1tX2RvY09iamVjdHMuZmlyc3QoKTsgY287IGNvPW1fZG9jT2JqZWN0cy5uZXh0KCkgKQot
ICAgICAgICBpZiAoIGNvLT50eXBlKCkgPT0gQ2FjaGVkT2JqZWN0OjpJbWFnZSApCi0gICAgICAg
IHsKLSAgICAgICAgICAgIENhY2hlZEltYWdlICppbWcgPSBjb25zdF9jYXN0PENhY2hlZEltYWdl
Kj4oIHN0YXRpY19jYXN0PGNvbnN0IENhY2hlZEltYWdlICo+KCBjbyApICk7Ci0KLSAgICAgICAg
ICAgIGltZy0+c2V0U2hvd0FuaW1hdGlvbnMoIHNob3dBbmltYXRpb25zICk7Ci0gICAgICAgIH0K
LX0KLQotdm9pZCBEb2NMb2FkZXI6OnJlbW92ZUNhY2hlZE9iamVjdCggQ2FjaGVkT2JqZWN0KiBv
ICkgY29uc3QKLXsKLSAgICBtX2RvY09iamVjdHMucmVtb3ZlUmVmKCBvICk7Ci19Ci0KLXZvaWQg
RG9jTG9hZGVyOjpzZXRMb2FkSW5Qcm9ncmVzcyhib29sIGxvYWQpCi17Ci0gICAgbV9sb2FkSW5Q
cm9ncmVzcyA9IGxvYWQ7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LQotCi1Mb2FkZXI6OkxvYWRlcigpIDogUU9iamVjdCgpCi17Ci0gICAgbV9yZXF1ZXN0c1BlbmRp
bmcuc2V0QXV0b0RlbGV0ZSggdHJ1ZSApOwotICAgIG1fcmVxdWVzdHNMb2FkaW5nLnNldEF1dG9E
ZWxldGUoIHRydWUgKTsKLSAgICBrd3EgPSBuZXcgS1dRTG9hZGVyKHRoaXMpOwotfQotCi1Mb2Fk
ZXI6On5Mb2FkZXIoKQotewotICAgIGRlbGV0ZSBrd3E7Ci19Ci0KLXZvaWQgTG9hZGVyOjpsb2Fk
KERvY0xvYWRlciogZGwsIENhY2hlZE9iamVjdCAqb2JqZWN0LCBib29sIGluY3JlbWVudGFsKQot
ewotICAgIFJlcXVlc3QgKnJlcSA9IG5ldyBSZXF1ZXN0KGRsLCBvYmplY3QsIGluY3JlbWVudGFs
KTsKLSAgICBtX3JlcXVlc3RzUGVuZGluZy5hcHBlbmQocmVxKTsKLQotICAgIGVtaXQgcmVxdWVz
dFN0YXJ0ZWQoIHJlcS0+bV9kb2NMb2FkZXIsIHJlcS0+b2JqZWN0ICk7Ci0KLSAgICBzZXJ2ZVBl
bmRpbmdSZXF1ZXN0cygpOwotfQotCi12b2lkIExvYWRlcjo6c2VydmVQZW5kaW5nUmVxdWVzdHMo
KQotewotICBpZiAoIG1fcmVxdWVzdHNQZW5kaW5nLmNvdW50KCkgPT0gMCApCi0gICAgICByZXR1
cm47Ci0KLSAgLy8gZ2V0IHRoZSBmaXJzdCBwZW5kaW5nIHJlcXVlc3QKLSAgUmVxdWVzdCAqcmVx
ID0gbV9yZXF1ZXN0c1BlbmRpbmcudGFrZSgwKTsKLQotICBLVVJMIHUocmVxLT5vYmplY3QtPnVy
bCgpLnFzdHJpbmcoKSk7Ci0gIEtJTzo6VHJhbnNmZXJKb2IqIGpvYiA9IEtJTzo6Z2V0KCB1LCBm
YWxzZSwgZmFsc2UgLypubyBHVUkqLywgdHJ1ZSk7Ci0gIAotICBqb2ItPmFkZE1ldGFEYXRhKCJj
YWNoZSIsIGdldENhY2hlQ29udHJvbFN0cmluZyhyZXEtPm9iamVjdC0+Y2FjaGVQb2xpY3koKSkp
OwotICBpZiAoIXJlcS0+b2JqZWN0LT5hY2NlcHQoKS5pc0VtcHR5KCkpCi0gICAgICBqb2ItPmFk
ZE1ldGFEYXRhKCJhY2NlcHQiLCByZXEtPm9iamVjdC0+YWNjZXB0KCkpOwotICBpZiAoIHJlcS0+
bV9kb2NMb2FkZXIgKSAgewotICAgICAgS1VSTCByID0gcmVxLT5tX2RvY0xvYWRlci0+ZG9jKCkt
PlVSTCgpOwotICAgICAgaWYgKCByLnByb3RvY29sKCkuc3RhcnRzV2l0aCggImh0dHAiICkgJiYg
ci5wYXRoKCkuaXNFbXB0eSgpICkKLSAgICAgICAgICByLnNldFBhdGgoICIvIiApOwotCi0gICAg
ICBqb2ItPmFkZE1ldGFEYXRhKCJyZWZlcnJlciIsIHIudXJsKCkpOwotICAgICAgUVN0cmluZyBk
b21haW4gPSByLmhvc3QoKTsKLSAgICAgIGlmIChyZXEtPm1fZG9jTG9hZGVyLT5kb2MoKS0+aXNI
VE1MRG9jdW1lbnQoKSkKLSAgICAgICAgIGRvbWFpbiA9IHN0YXRpY19jYXN0PEhUTUxEb2N1bWVu
dEltcGwqPihyZXEtPm1fZG9jTG9hZGVyLT5kb2MoKSktPmRvbWFpbigpLnFzdHJpbmcoKTsKLSAg
ICAgIGlmIChjcm9zc0RvbWFpbih1Lmhvc3QoKSwgZG9tYWluKSkKLSAgICAgICAgIGpvYi0+YWRk
TWV0YURhdGEoImNyb3NzLWRvbWFpbiIsICJ0cnVlIik7Ci0gIH0KLQotICBjb25uZWN0KCBqb2Is
IFNJR05BTCggcmVzdWx0KCBLSU86OkpvYiAqLCBOU0RhdGEgKikgKSwgdGhpcywgU0xPVCggc2xv
dEZpbmlzaGVkKCBLSU86OkpvYiAqLCBOU0RhdGEgKikgKSApOwotICAKLSAgY29ubmVjdCggam9i
LCBTSUdOQUwoIGRhdGEoIEtJTzo6Sm9iKiwgY29uc3QgY2hhciAqLCBpbnQpKSwKLSAgICAgICAg
ICAgU0xPVCggc2xvdERhdGEoIEtJTzo6Sm9iKiwgY29uc3QgY2hhciAqLCBpbnQpKSk7Ci0gIGNv
bm5lY3QoIGpvYiwgU0lHTkFMKCByZWNlaXZlZFJlc3BvbnNlKCBLSU86OkpvYiAqLCBOU1VSTFJl
c3BvbnNlICopKSwgU0xPVCggc2xvdFJlY2VpdmVkUmVzcG9uc2UoIEtJTzo6Sm9iICosIE5TVVJM
UmVzcG9uc2UgKikpICk7Ci0KLSAgaWYgKEtXUVNlcnZlUmVxdWVzdCh0aGlzLCByZXEsIGpvYikp
IHsKLSAgICAgIGlmIChyZXEtPm9iamVjdC0+dHlwZSgpID09IENhY2hlZE9iamVjdDo6SW1hZ2Up
IHsKLQlDYWNoZWRJbWFnZSAqY2kgPSBzdGF0aWNfY2FzdDxDYWNoZWRJbWFnZSo+KHJlcS0+b2Jq
ZWN0KTsKLQlpZiAoY2ktPmRlY29kZXJDYWxsYmFjaygpKSB7Ci0JICAgIG1fcmVxdWVzdHNCYWNr
Z3JvdW5kRGVjb2RpbmcuYXBwZW5kKHJlcSk7Ci0JfQotICAgICAgfQotICAgICAgbV9yZXF1ZXN0
c0xvYWRpbmcuaW5zZXJ0KGpvYiwgcmVxKTsKLSAgfQotfQotCi12b2lkIExvYWRlcjo6c2xvdEZp
bmlzaGVkKCBLSU86OkpvYiogam9iLCBOU0RhdGEgKmFsbERhdGEpCi17Ci0gICAgUmVxdWVzdCAq
ciA9IG1fcmVxdWVzdHNMb2FkaW5nLnRha2UoIGpvYiApOwotICAgIEtJTzo6VHJhbnNmZXJKb2Iq
IGogPSBzdGF0aWNfY2FzdDxLSU86OlRyYW5zZmVySm9iKj4oam9iKTsKLQotICAgIGlmICggIXIg
KQotICAgICAgICByZXR1cm47Ci0KLSAgICBDYWNoZWRPYmplY3QgKm9iamVjdCA9IHItPm9iamVj
dDsKLSAgICBEb2NMb2FkZXIgKmRvY0xvYWRlciA9IHItPm1fZG9jTG9hZGVyOwotICAgIAotICAg
IGJvb2wgYmFja2dyb3VuZEltYWdlRGVjb2RpbmcgPSAob2JqZWN0LT50eXBlKCkgPT0gQ2FjaGVk
T2JqZWN0OjpJbWFnZSAmJiAKLQlzdGF0aWNfY2FzdDxDYWNoZWRJbWFnZSo+KG9iamVjdCktPmRl
Y29kZXJDYWxsYmFjaygpKTsKLQkKLSAgICBpZiAoai0+ZXJyb3IoKSB8fCBqLT5pc0Vycm9yUGFn
ZSgpKSB7Ci0gICAgICAgIC8vIFVzZSB0aGUgYmFja2dyb3VuZCBpbWFnZSBkZWNvZGVyJ3MgY2Fs
bGJhY2sgdG8gaGFuZGxlIHRoZSBlcnJvci4KLSAgICAgICAgaWYgKGJhY2tncm91bmRJbWFnZURl
Y29kaW5nKSB7Ci0gICAgICAgICAgICBDYWNoZWRJbWFnZUNhbGxiYWNrICpjYWxsYmFjayA9IHN0
YXRpY19jYXN0PENhY2hlZEltYWdlKj4ob2JqZWN0KS0+ZGVjb2RlckNhbGxiYWNrKCk7Ci0gICAg
ICAgICAgICBjYWxsYmFjay0+aGFuZGxlRXJyb3IoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNl
IHsKLSAgICAgICAgICAgIGRvY0xvYWRlci0+c2V0TG9hZEluUHJvZ3Jlc3ModHJ1ZSk7Ci0gICAg
ICAgICAgICByLT5vYmplY3QtPmVycm9yKCBqb2ItPmVycm9yKCksIGpvYi0+ZXJyb3JUZXh0KCku
YXNjaWkoKSApOwotICAgICAgICAgICAgZG9jTG9hZGVyLT5zZXRMb2FkSW5Qcm9ncmVzcyhmYWxz
ZSk7Ci0gICAgICAgICAgICBlbWl0IHJlcXVlc3RGYWlsZWQoIGRvY0xvYWRlciwgb2JqZWN0ICk7
Ci0gICAgICAgICAgICBDYWNoZTo6cmVtb3ZlQ2FjaGVFbnRyeSggb2JqZWN0ICk7Ci0gICAgICAg
IH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGRvY0xvYWRlci0+c2V0TG9hZEluUHJvZ3Jl
c3ModHJ1ZSk7Ci0gICAgICAgIG9iamVjdC0+ZGF0YShyLT5tX2J1ZmZlciwgdHJ1ZSk7Ci0gICAg
ICAgIHItPm9iamVjdC0+c2V0QWxsRGF0YShhbGxEYXRhKTsKLSAgICAgICAgZG9jTG9hZGVyLT5z
ZXRMb2FkSW5Qcm9ncmVzcyhmYWxzZSk7Ci0gICAgICAgIAotICAgICAgICAvLyBMZXQgdGhlIGJh
Y2tncm91bmQgaW1hZ2UgZGVjb2RlciB0cmlnZ2VyIHRoZSBkb25lIHNpZ25hbC4KLSAgICAgICAg
aWYgKCFiYWNrZ3JvdW5kSW1hZ2VEZWNvZGluZykKLSAgICAgICAgICAgIGVtaXQgcmVxdWVzdERv
bmUoIGRvY0xvYWRlciwgb2JqZWN0ICk7Ci0KLSAgICAgICAgb2JqZWN0LT5maW5pc2goKTsKLSAg
ICB9Ci0KLSAgICAvLyBMZXQgdGhlIGJhY2tncm91bmQgaW1hZ2UgZGVjb2RlciByZWxlYXNlIHRo
ZSByZXF1ZXN0IHdoZW4gaXQgaXMKLSAgICAvLyBmaW5pc2hlZC4KLSAgICBpZiAoIWJhY2tncm91
bmRJbWFnZURlY29kaW5nKSB7Ci0gICAgICAgIGRlbGV0ZSByOwotICAgIH0KLQotICAgIHNlcnZl
UGVuZGluZ1JlcXVlc3RzKCk7Ci19Ci0KLQotdm9pZCBMb2FkZXI6OnNsb3RSZWNlaXZlZFJlc3Bv
bnNlKEtJTzo6Sm9iKiBqb2IsIE5TVVJMUmVzcG9uc2UgKnJlc3BvbnNlKQotewotICAgIFJlcXVl
c3QgKnIgPSBtX3JlcXVlc3RzTG9hZGluZ1tqb2JdOwotICAgIEFTU0VSVChyKTsKLSAgICBBU1NF
UlQocmVzcG9uc2UpOwotICAgIHItPm9iamVjdC0+c2V0UmVzcG9uc2UocmVzcG9uc2UpOwotICAg
IHItPm9iamVjdC0+c2V0RXhwaXJlRGF0ZShLV1FDYWNoZU9iamVjdEV4cGlyZXNUaW1lKHItPm1f
ZG9jTG9hZGVyLCByZXNwb25zZSksIGZhbHNlKTsKLSAgICAKLSAgICBRU3RyaW5nIGNocyA9IHN0
YXRpY19jYXN0PEtJTzo6VHJhbnNmZXJKb2IqPihqb2IpLT5xdWVyeU1ldGFEYXRhKCJjaGFyc2V0
Iik7Ci0gICAgaWYgKCFjaHMuaXNOdWxsKCkpCi0gICAgICAgIHItPm9iamVjdC0+c2V0Q2hhcnNl
dChjaHMpOwotICAgIAotICAgIGlmIChyLT5tdWx0aXBhcnQpIHsKLSAgICAgICAgQVNTRVJUKHIt
Pm9iamVjdC0+aXNJbWFnZSgpKTsKLSAgICAgICAgc3RhdGljX2Nhc3Q8Q2FjaGVkSW1hZ2UgKj4o
ci0+b2JqZWN0KS0+Y2xlYXIoKTsKLSAgICAgICAgci0+bV9idWZmZXIgPSBRQnVmZmVyKCk7Ci0g
ICAgICAgIGlmIChyLT5tX2RvY0xvYWRlci0+cGFydCgpKQotICAgICAgICAgICAgci0+bV9kb2NM
b2FkZXItPnBhcnQoKS0+Y2hlY2tDb21wbGV0ZWQoKTsKLSAgICAgICAgCi0gICAgfSBlbHNlIGlm
IChLV1FSZXNwb25zZUlzTXVsdGlwYXJ0KHJlc3BvbnNlKSkgewotICAgICAgICByLT5tdWx0aXBh
cnQgPSB0cnVlOwotICAgICAgICBpZiAoIXItPm9iamVjdC0+aXNJbWFnZSgpKQotICAgICAgICAg
ICAgc3RhdGljX2Nhc3Q8S0lPOjpUcmFuc2ZlckpvYio+KGpvYiktPmNhbmNlbCgpOwotICAgIH0K
LX0KLQotCi12b2lkIExvYWRlcjo6c2xvdERhdGEoIEtJTzo6Sm9iKmpvYiwgY29uc3QgY2hhciAq
ZGF0YSwgaW50IHNpemUgKQotewotICAgIFJlcXVlc3QgKnIgPSBtX3JlcXVlc3RzTG9hZGluZ1tq
b2JdOwotICAgIGlmKCFyKSB7Ci0gICAgICAgIGtkRGVidWcoIDYwNjAgKSA8PCAiZ290IGRhdGEg
Zm9yIHVua25vd24gcmVxdWVzdCEiIDw8IGVuZGw7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0K
LSAgICBpZiAoICFyLT5tX2J1ZmZlci5pc09wZW4oKSApCi0gICAgICAgIHItPm1fYnVmZmVyLm9w
ZW4oIElPX1dyaXRlT25seSApOwotCi0gICAgci0+bV9idWZmZXIud3JpdGVCbG9jayggZGF0YSwg
c2l6ZSApOwotCi0gICAgaWYgKHItPm11bHRpcGFydCkKLSAgICAgICAgci0+b2JqZWN0LT5kYXRh
KCByLT5tX2J1ZmZlciwgdHJ1ZSApOyAvLyB0aGUgbG9hZGVyIGRlbGl2ZXJzIHRoZSBkYXRhIGlu
IGEgbXVsdGlwYXJ0IHNlY3Rpb24gYWxsIGF0IG9uY2UsIHNlbmQgZW9mCi0gICAgZWxzZSBpZihy
LT5pbmNyZW1lbnRhbCkKLSAgICAgICAgci0+b2JqZWN0LT5kYXRhKCByLT5tX2J1ZmZlciwgZmFs
c2UgKTsKLX0KLQotaW50IExvYWRlcjo6bnVtUmVxdWVzdHMoIERvY0xvYWRlciogZGwgKSBjb25z
dAotewotICAgIGludCByZXMgPSAwOwotCi0gICAgUVB0ckxpc3RJdGVyYXRvcjxSZXF1ZXN0PiBw
SXQoIG1fcmVxdWVzdHNQZW5kaW5nICk7Ci0gICAgZm9yICg7IHBJdC5jdXJyZW50KCk7ICsrcEl0
ICkKLSAgICAgICAgaWYgKCBwSXQuY3VycmVudCgpLT5tX2RvY0xvYWRlciA9PSBkbCApCi0gICAg
ICAgICAgICByZXMrKzsKLQotICAgIFFQdHJEaWN0SXRlcmF0b3I8UmVxdWVzdD4gbEl0KCBtX3Jl
cXVlc3RzTG9hZGluZyApOwotICAgIGZvciAoOyBsSXQuY3VycmVudCgpOyArK2xJdCApCi0gICAg
ICAgIGlmICggbEl0LmN1cnJlbnQoKS0+bV9kb2NMb2FkZXIgPT0gZGwgKQotICAgICAgICAgICAg
aWYgKCFsSXQuY3VycmVudCgpLT5tdWx0aXBhcnQpCi0gICAgICAgICAgICAgICAgcmVzKys7Ci0K
LSAgICBRUHRyTGlzdEl0ZXJhdG9yPFJlcXVlc3Q+IGJkSXQoIG1fcmVxdWVzdHNCYWNrZ3JvdW5k
RGVjb2RpbmcgKTsKLSAgICBmb3IgKDsgYmRJdC5jdXJyZW50KCk7ICsrYmRJdCApCi0gICAgICAg
IGlmICggYmRJdC5jdXJyZW50KCktPm1fZG9jTG9hZGVyID09IGRsICkKLSAgICAgICAgICAgIHJl
cysrOwotCi0gICAgaWYgKGRsLT5sb2FkSW5Qcm9ncmVzcygpKQotICAgICAgICByZXMrKzsKLSAg
ICAgICAgCi0gICAgcmV0dXJuIHJlczsKLX0KLQotdm9pZCBMb2FkZXI6OmNhbmNlbFJlcXVlc3Rz
KCBEb2NMb2FkZXIqIGRsICkKLXsKLSAgICBRUHRyTGlzdEl0ZXJhdG9yPFJlcXVlc3Q+IHBJdCgg
bV9yZXF1ZXN0c1BlbmRpbmcgKTsKLSAgICB3aGlsZSAoIHBJdC5jdXJyZW50KCkgKQotICAgIHsK
LSAgICAgICAgaWYgKHBJdC5jdXJyZW50KCktPm1fZG9jTG9hZGVyID09IGRsKSB7Ci0gICAgICAg
ICAgICBDYWNoZTo6cmVtb3ZlQ2FjaGVFbnRyeSggcEl0LmN1cnJlbnQoKS0+b2JqZWN0ICk7Ci0g
ICAgICAgICAgICBtX3JlcXVlc3RzUGVuZGluZy5yZW1vdmUoIHBJdCApOwotICAgICAgICB9Ci0g
ICAgICAgIGVsc2UKLSAgICAgICAgICAgICsrcEl0OwotICAgIH0KLQotICAgIFFQdHJEaWN0SXRl
cmF0b3I8UmVxdWVzdD4gbEl0KCBtX3JlcXVlc3RzTG9hZGluZyApOwotICAgIHdoaWxlICggbEl0
LmN1cnJlbnQoKSApCi0gICAgewotICAgICAgICBpZiAobEl0LmN1cnJlbnQoKS0+bV9kb2NMb2Fk
ZXIgPT0gZGwpIHsKLSAgICAgICAgICAgIEtJTzo6Sm9iICpqb2IgPSBzdGF0aWNfY2FzdDxLSU86
OkpvYiAqPiggbEl0LmN1cnJlbnRLZXkoKSApOwotICAgICAgICAgICAgQ2FjaGU6OnJlbW92ZUNh
Y2hlRW50cnkoIGxJdC5jdXJyZW50KCktPm9iamVjdCApOwotICAgICAgICAgICAgbV9yZXF1ZXN0
c0xvYWRpbmcucmVtb3ZlKCBsSXQuY3VycmVudEtleSgpICk7Ci0gICAgICAgICAgICBqb2ItPmtp
bGwoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICArK2xJdDsKLSAgICB9
Ci0KLSAgICBRUHRyTGlzdEl0ZXJhdG9yPFJlcXVlc3Q+IGJkSXQoIG1fcmVxdWVzdHNCYWNrZ3Jv
dW5kRGVjb2RpbmcgKTsKLSAgICB3aGlsZSAoYmRJdC5jdXJyZW50KCkpIHsKLSAgICAgICAgaWYg
KGJkSXQuY3VycmVudCgpLT5tX2RvY0xvYWRlciA9PSBkbCkgewotICAgICAgICAgICAgQ2FjaGU6
OnJlbW92ZUNhY2hlRW50cnkoIGJkSXQuY3VycmVudCgpLT5vYmplY3QgKTsKLSAgICAgICAgICAg
IG1fcmVxdWVzdHNCYWNrZ3JvdW5kRGVjb2RpbmcucmVtb3ZlKCBiZEl0ICk7Ci0gICAgICAgIH0K
LSAgICAgICAgZWxzZQotICAgICAgICAgICAgKytiZEl0OwotICAgIH0KLX0KLQotdm9pZCBMb2Fk
ZXI6OnJlbW92ZUJhY2tncm91bmREZWNvZGluZ1JlcXVlc3QgKFJlcXVlc3QgKnIpCi17Ci0gICAg
Ym9vbCBwcmVzZW50ID0gbV9yZXF1ZXN0c0JhY2tncm91bmREZWNvZGluZy5jb250YWluc1JlZihy
KTsKLSAgICBpZiAocHJlc2VudCkgewotCW1fcmVxdWVzdHNCYWNrZ3JvdW5kRGVjb2RpbmcucmVt
b3ZlIChyKTsKLSAgICB9Ci19Ci0KLUtJTzo6Sm9iICpMb2FkZXI6OmpvYkZvclJlcXVlc3QoIGNv
bnN0IERPTTo6RE9NU3RyaW5nICZ1cmwgKSBjb25zdAotewotICAgIFFQdHJEaWN0SXRlcmF0b3I8
UmVxdWVzdD4gaXQoIG1fcmVxdWVzdHNMb2FkaW5nICk7Ci0KLSAgICBmb3IgKDsgaXQuY3VycmVu
dCgpOyArK2l0ICkKLSAgICB7Ci0gICAgICAgIENhY2hlZE9iamVjdCAqb2JqID0gaXQuY3VycmVu
dCgpLT5vYmplY3Q7Ci0KLSAgICAgICAgaWYgKCBvYmogJiYgb2JqLT51cmwoKSA9PSB1cmwgKQot
ICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEtJTzo6Sm9iICo+KCBpdC5jdXJyZW50S2V5
KCkgKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotCi1ib29sIExvYWRlcjo6aXNLSFRN
TExvYWRlcigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLy8gLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLQotCi0KLUxSVUxpc3Q6OkxSVUxpc3QoKQotOm1faGVhZCgwKSwgbV90YWlsKDAp
IAote30KLQotTFJVTGlzdDo6fkxSVUxpc3QoKQote30KLQotUURpY3Q8Q2FjaGVkT2JqZWN0PiAq
Q2FjaGU6OmNhY2hlID0gMDsKLVFQdHJMaXN0PERvY0xvYWRlcj4qIENhY2hlOjpkb2Nsb2FkZXIg
PSAwOwotTG9hZGVyICpDYWNoZTo6bV9sb2FkZXIgPSAwOwotCi1pbnQgQ2FjaGU6Om1heFNpemUg
PSBERUZDQUNIRVNJWkU7Ci1pbnQgQ2FjaGU6Om1heENhY2hlYWJsZSA9IE1BWENBQ0hFQUJMRTsK
LWludCBDYWNoZTo6Zmx1c2hDb3VudCA9IDA7Ci0KLVFQaXhtYXAgKkNhY2hlOjpudWxsUGl4bWFw
ID0gMDsKLVFQaXhtYXAgKkNhY2hlOjpicm9rZW5QaXhtYXAgPSAwOwotCi1DYWNoZWRPYmplY3Qg
KkNhY2hlOjptX2hlYWRPZlVuY2FjaGVhYmxlTGlzdCA9IDA7Ci1pbnQgQ2FjaGU6Om1fdG90YWxT
aXplT2ZMUlVMaXN0cyA9IDA7Ci1pbnQgQ2FjaGU6Om1fY291bnRPZkxSVUFuZFVuY2FjaGVhYmxl
TGlzdHM7Ci1MUlVMaXN0ICpDYWNoZTo6bV9MUlVMaXN0cyA9IDA7Ci0KLXZvaWQgQ2FjaGU6Omlu
aXQoKQotewotICAgIGlmICggIWNhY2hlICkKLSAgICAgICAgY2FjaGUgPSBuZXcgUURpY3Q8Q2Fj
aGVkT2JqZWN0Pig0MDEsIHRydWUpOwotCi0gICAgaWYgKCAhZG9jbG9hZGVyICkKLSAgICAgICAg
ZG9jbG9hZGVyID0gbmV3IFFQdHJMaXN0PERvY0xvYWRlcj47Ci0KLSAgICBpZiAoICFudWxsUGl4
bWFwICkKLSAgICAgICAgbnVsbFBpeG1hcCA9IG5ldyBRUGl4bWFwOwotCi0gICAgaWYgKCAhYnJv
a2VuUGl4bWFwICkKLSAgICAgICAgYnJva2VuUGl4bWFwID0gS1dRTG9hZFBpeG1hcCgibWlzc2lu
Z19pbWFnZSIpOwotCi0gICAgaWYgKCAhbV9sb2FkZXIgKQotICAgICAgICBtX2xvYWRlciA9IG5l
dyBMb2FkZXIoKTsKLX0KLQotdm9pZCBDYWNoZTo6Y2xlYXIoKQotewotICAgIGlmICghY2FjaGUp
Ci0gICAgICAgIHJldHVybjsKLQotICAgIGNhY2hlLT5zZXRBdXRvRGVsZXRlKCB0cnVlICk7Ci0g
ICAgZGVsZXRlIGNhY2hlOyBjYWNoZSA9IDA7Ci0gICAgZGVsZXRlIG51bGxQaXhtYXA7IG51bGxQ
aXhtYXAgPSAwOwotICAgIGRlbGV0ZSBicm9rZW5QaXhtYXA7IGJyb2tlblBpeG1hcCA9IDA7Ci0g
ICAgZGVsZXRlIG1fbG9hZGVyOyAgIG1fbG9hZGVyID0gMDsKLSAgICBkZWxldGUgZG9jbG9hZGVy
OyBkb2Nsb2FkZXIgPSAwOwotfQotCi1DYWNoZWRJbWFnZSAqQ2FjaGU6OnJlcXVlc3RJbWFnZSgg
RG9jTG9hZGVyKiBkbCwgY29uc3QgRE9NU3RyaW5nICYgdXJsLCBib29sIHJlbG9hZCwgdGltZV90
IF9leHBpcmVEYXRlICkKLXsKLSAgICAvLyB0aGlzIGJyaW5ncyB0aGUgX3VybCB0byBhIHN0YW5k
YXJkIGZvcm0uLi4KLSAgICBLVVJMIGt1cmw7Ci0gICAgaWYgKGRsKQotICAgICAgICBrdXJsID0g
ZGwtPm1fZG9jLT5jb21wbGV0ZVVSTCggdXJsLnFzdHJpbmcoKSApOwotICAgIGVsc2UKLSAgICAg
ICAga3VybCA9IHVybC5xc3RyaW5nKCk7Ci0gICAgcmV0dXJuIHJlcXVlc3RJbWFnZShkbCwga3Vy
bCwgcmVsb2FkLCBfZXhwaXJlRGF0ZSk7Ci19Ci0KLUNhY2hlZEltYWdlICpDYWNoZTo6cmVxdWVz
dEltYWdlKCBEb2NMb2FkZXIqIGRsLCBjb25zdCBLVVJMICYgdXJsLCBib29sIHJlbG9hZCwgdGlt
ZV90IF9leHBpcmVEYXRlICkKLXsKLSAgICBLSU86OkNhY2hlQ29udHJvbCBjYWNoZVBvbGljeTsK
LSAgICBpZiAoZGwpCi0gICAgICAgIGNhY2hlUG9saWN5ID0gZGwtPmNhY2hlUG9saWN5KCk7Ci0g
ICAgZWxzZQotICAgICAgICBjYWNoZVBvbGljeSA9IEtJTzo6Q0NfVmVyaWZ5OwotCi0gICAgLy8g
Q2hlY2tpbmcgaWYgdGhlIFVSTCBpcyBtYWxmb3JtZWQgaXMgbG90cyBvZiBleHRyYSB3b3JrIGZv
ciBsaXR0bGUgYmVuZWZpdC4KLQotICAgIGlmICghZGwtPmRvYygpLT5zaG91bGRDcmVhdGVSZW5k
ZXJlcnMoKSl7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIENhY2hlZE9iamVjdCAq
byA9IDA7Ci0gICAgaWYgKCFyZWxvYWQpCi0gICAgICAgIG8gPSBjYWNoZS0+ZmluZCh1cmwudXJs
KCkpOwotICAgIGlmKCFvKQotICAgIHsKLSNpZmRlZiBDQUNIRV9ERUJVRwotICAgICAgICBrZERl
YnVnKCA2MDYwICkgPDwgIkNhY2hlOiBuZXc6ICIgPDwgdXJsLnVybCgpIDw8IGVuZGw7Ci0jZW5k
aWYKLSAgICAgICAgQ2FjaGVkSW1hZ2UgKmltID0gbmV3IENhY2hlZEltYWdlKGRsLCB1cmwudXJs
KCksIGNhY2hlUG9saWN5LCBfZXhwaXJlRGF0ZSk7Ci0gICAgICAgIGlmICggZGwgJiYgZGwtPmF1
dG9sb2FkSW1hZ2VzKCkgKSBDYWNoZTo6bG9hZGVyKCktPmxvYWQoZGwsIGltLCB0cnVlKTsKLSAg
ICAgICAgaWYgKGNhY2hlRGlzYWJsZWQpCi0gICAgICAgICAgICBpbS0+c2V0RnJlZSh0cnVlKTsK
LSAgICAgICAgZWxzZSB7Ci0gICAgICAgIGNhY2hlLT5pbnNlcnQoIHVybC51cmwoKSwgaW0gKTsK
LSAgICAgICAgbW92ZVRvSGVhZE9mTFJVTGlzdChpbSk7Ci0gICAgICAgIH0KLSAgICAgICAgbyA9
IGltOwotICAgIH0KLQotICAgIAotICAgIGlmKG8tPnR5cGUoKSAhPSBDYWNoZWRPYmplY3Q6Oklt
YWdlKQotICAgIHsKLSNpZmRlZiBDQUNIRV9ERUJVRwotICAgICAgICBrZERlYnVnKCA2MDYwICkg
PDwgIkNhY2hlOjpJbnRlcm5hbCBFcnJvciBpbiByZXF1ZXN0SW1hZ2UgdXJsPSIgPDwga3VybC51
cmwoKSA8PCAiISIgPDwgZW5kbDsKLSNlbmRpZgotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0K
LSNpZmRlZiBDQUNIRV9ERUJVRwotICAgIGlmKCBvLT5zdGF0dXMoKSA9PSBDYWNoZWRPYmplY3Q6
OlBlbmRpbmcgKQotICAgICAgICBrZERlYnVnKCA2MDYwICkgPDwgIkNhY2hlOiBsb2FkaW5nIGlu
IHByb2dyZXNzOiAiIDw8IGt1cmwudXJsKCkgPDwgZW5kbDsKLSAgICBlbHNlCi0gICAgICAgIGtk
RGVidWcoIDYwNjAgKSA8PCAiQ2FjaGU6IHVzaW5nIGNhY2hlZDogIiA8PCBrdXJsLnVybCgpIDw8
ICIsIHN0YXR1cyAiIDw8IG8tPnN0YXR1cygpIDw8IGVuZGw7Ci0jZW5kaWYKLQotICAgIG1vdmVU
b0hlYWRPZkxSVUxpc3Qobyk7Ci0gICAgaWYgKCBkbCApIHsKLSAgICAgICAgZGwtPm1fZG9jT2Jq
ZWN0cy5yZW1vdmUoIG8gKTsKLSAgICAgICAgaWYgKCFjYWNoZURpc2FibGVkKQotICAgICAgICBk
bC0+bV9kb2NPYmplY3RzLmFwcGVuZCggbyApOwotICAgIH0KLSAgICByZXR1cm4gc3RhdGljX2Nh
c3Q8Q2FjaGVkSW1hZ2UgKj4obyk7Ci19Ci0KLUNhY2hlZENTU1N0eWxlU2hlZXQgKkNhY2hlOjpy
ZXF1ZXN0U3R5bGVTaGVldCggRG9jTG9hZGVyKiBkbCwgY29uc3QgRE9NU3RyaW5nICYgdXJsLCBi
b29sIHJlbG9hZCwgdGltZV90IF9leHBpcmVEYXRlLCBjb25zdCBRU3RyaW5nJiBjaGFyc2V0KQot
ewotICAgIC8vIHRoaXMgYnJpbmdzIHRoZSBfdXJsIHRvIGEgc3RhbmRhcmQgZm9ybS4uLgotICAg
IEtVUkwga3VybDsKLSAgICBLSU86OkNhY2hlQ29udHJvbCBjYWNoZVBvbGljeTsKLSAgICBpZiAo
IGRsICkKLSAgICB7Ci0gICAgICAgIGt1cmwgPSBkbC0+bV9kb2MtPmNvbXBsZXRlVVJMKCB1cmwu
cXN0cmluZygpICk7Ci0gICAgICAgIGNhY2hlUG9saWN5ID0gZGwtPmNhY2hlUG9saWN5KCk7Ci0g
ICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGt1cmwgPSB1cmwucXN0cmluZygpOwotICAg
ICAgICBjYWNoZVBvbGljeSA9IEtJTzo6Q0NfVmVyaWZ5OwotICAgIH0KLQotICAgIC8vIENoZWNr
aW5nIGlmIHRoZSBVUkwgaXMgbWFsZm9ybWVkIGlzIGxvdHMgb2YgZXh0cmEgd29yayBmb3IgbGl0
dGxlIGJlbmVmaXQuCi0KLSAgICBDYWNoZWRPYmplY3QgKm8gPSBjYWNoZS0+ZmluZChrdXJsLnVy
bCgpKTsKLSAgICBpZighbykKLSAgICB7Ci0jaWZkZWYgQ0FDSEVfREVCVUcKLSAgICAgICAga2RE
ZWJ1ZyggNjA2MCApIDw8ICJDYWNoZTogbmV3OiAiIDw8IGt1cmwudXJsKCkgPDwgZW5kbDsKLSNl
bmRpZgotICAgICAgICBDYWNoZWRDU1NTdHlsZVNoZWV0ICpzaGVldCA9IG5ldyBDYWNoZWRDU1NT
dHlsZVNoZWV0KGRsLCBrdXJsLnVybCgpLCBjYWNoZVBvbGljeSwgX2V4cGlyZURhdGUsIGNoYXJz
ZXQpOwotICAgICAgICBpZiAoY2FjaGVEaXNhYmxlZCkKLSAgICAgICAgICAgIHNoZWV0LT5zZXRG
cmVlKHRydWUpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgY2FjaGUtPmluc2VydCgga3VybC51
cmwoKSwgc2hlZXQgKTsKLSAgICAgICAgbW92ZVRvSGVhZE9mTFJVTGlzdChzaGVldCk7Ci0gICAg
ICAgIH0KLSAgICAgICAgbyA9IHNoZWV0OwotICAgIH0KLQotICAgIAotICAgIGlmKG8tPnR5cGUo
KSAhPSBDYWNoZWRPYmplY3Q6OkNTU1N0eWxlU2hlZXQpCi0gICAgewotI2lmZGVmIENBQ0hFX0RF
QlVHCi0gICAgICAgIGtkRGVidWcoIDYwNjAgKSA8PCAiQ2FjaGU6OkludGVybmFsIEVycm9yIGlu
IHJlcXVlc3RTdHlsZVNoZWV0IHVybD0iIDw8IGt1cmwudXJsKCkgPDwgIiEiIDw8IGVuZGw7Ci0j
ZW5kaWYKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0jaWZkZWYgQ0FDSEVfREVCVUcKLSAg
ICBpZiggby0+c3RhdHVzKCkgPT0gQ2FjaGVkT2JqZWN0OjpQZW5kaW5nICkKLSAgICAgICAga2RE
ZWJ1ZyggNjA2MCApIDw8ICJDYWNoZTogbG9hZGluZyBpbiBwcm9ncmVzczogIiA8PCBrdXJsLnVy
bCgpIDw8IGVuZGw7Ci0gICAgZWxzZQotICAgICAgICBrZERlYnVnKCA2MDYwICkgPDwgIkNhY2hl
OiB1c2luZyBjYWNoZWQ6ICIgPDwga3VybC51cmwoKSA8PCBlbmRsOwotI2VuZGlmCi0KLSAgICBt
b3ZlVG9IZWFkT2ZMUlVMaXN0KG8pOwotICAgIGlmICggZGwgKSB7Ci0gICAgICAgIGRsLT5tX2Rv
Y09iamVjdHMucmVtb3ZlKCBvICk7Ci0gICAgICAgIGlmICghY2FjaGVEaXNhYmxlZCkKLSAgICAg
ICAgZGwtPm1fZG9jT2JqZWN0cy5hcHBlbmQoIG8gKTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXRp
Y19jYXN0PENhY2hlZENTU1N0eWxlU2hlZXQgKj4obyk7Ci19Ci0KLXZvaWQgQ2FjaGU6OnByZWxv
YWRTdHlsZVNoZWV0KCBjb25zdCBRU3RyaW5nICZ1cmwsIGNvbnN0IFFTdHJpbmcgJnN0eWxlc2hl
ZXRfZGF0YSkKLXsKLSAgICBDYWNoZWRPYmplY3QgKm8gPSBjYWNoZS0+ZmluZCh1cmwpOwotICAg
IGlmKG8pCi0gICAgICAgIHJlbW92ZUNhY2hlRW50cnkobyk7Ci0KLSAgICBDYWNoZWRDU1NTdHls
ZVNoZWV0ICpzdHlsZXNoZWV0ID0gbmV3IENhY2hlZENTU1N0eWxlU2hlZXQodXJsLCBzdHlsZXNo
ZWV0X2RhdGEpOwotICAgIGNhY2hlLT5pbnNlcnQoIHVybCwgc3R5bGVzaGVldCApOwotfQotCi1D
YWNoZWRTY3JpcHQgKkNhY2hlOjpyZXF1ZXN0U2NyaXB0KCBEb2NMb2FkZXIqIGRsLCBjb25zdCBE
T006OkRPTVN0cmluZyAmdXJsLCBib29sIHJlbG9hZCwgdGltZV90IF9leHBpcmVEYXRlLCBjb25z
dCBRU3RyaW5nJiBjaGFyc2V0KQotewotICAgIC8vIHRoaXMgYnJpbmdzIHRoZSBfdXJsIHRvIGEg
c3RhbmRhcmQgZm9ybS4uLgotICAgIEtVUkwga3VybDsKLSAgICBLSU86OkNhY2hlQ29udHJvbCBj
YWNoZVBvbGljeTsKLSAgICBpZiAoIGRsICkKLSAgICB7Ci0gICAgICAgIGt1cmwgPSBkbC0+bV9k
b2MtPmNvbXBsZXRlVVJMKCB1cmwucXN0cmluZygpICk7Ci0gICAgICAgIGNhY2hlUG9saWN5ID0g
ZGwtPmNhY2hlUG9saWN5KCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGt1cmwg
PSB1cmwucXN0cmluZygpOwotICAgICAgICBjYWNoZVBvbGljeSA9IEtJTzo6Q0NfVmVyaWZ5Owot
ICAgIH0KLQotICAgIC8vIENoZWNraW5nIGlmIHRoZSBVUkwgaXMgbWFsZm9ybWVkIGlzIGxvdHMg
b2YgZXh0cmEgd29yayBmb3IgbGl0dGxlIGJlbmVmaXQuCi0KLSAgICBDYWNoZWRPYmplY3QgKm8g
PSBjYWNoZS0+ZmluZChrdXJsLnVybCgpKTsKLSAgICBpZighbykKLSAgICB7Ci0jaWZkZWYgQ0FD
SEVfREVCVUcKLSAgICAgICAga2REZWJ1ZyggNjA2MCApIDw8ICJDYWNoZTogbmV3OiAiIDw8IGt1
cmwudXJsKCkgPDwgZW5kbDsKLSNlbmRpZgotICAgICAgICBDYWNoZWRTY3JpcHQgKnNjcmlwdCA9
IG5ldyBDYWNoZWRTY3JpcHQoZGwsIGt1cmwudXJsKCksIGNhY2hlUG9saWN5LCBfZXhwaXJlRGF0
ZSwgY2hhcnNldCk7Ci0gICAgICAgIGlmIChjYWNoZURpc2FibGVkKQotICAgICAgICAgICAgc2Ny
aXB0LT5zZXRGcmVlKHRydWUpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgY2FjaGUtPmluc2Vy
dCgga3VybC51cmwoKSwgc2NyaXB0ICk7Ci0gICAgICAgIG1vdmVUb0hlYWRPZkxSVUxpc3Qoc2Ny
aXB0KTsKLSAgICAgICAgfQotICAgICAgICBvID0gc2NyaXB0OwotICAgIH0KLQotICAgIAotICAg
IGlmKCEoby0+dHlwZSgpID09IENhY2hlZE9iamVjdDo6U2NyaXB0KSkKLSAgICB7Ci0jaWZkZWYg
Q0FDSEVfREVCVUcKLSAgICAgICAga2REZWJ1ZyggNjA2MCApIDw8ICJDYWNoZTo6SW50ZXJuYWwg
RXJyb3IgaW4gcmVxdWVzdFNjcmlwdCB1cmw9IiA8PCBrdXJsLnVybCgpIDw8ICIhIiA8PCBlbmRs
OwotI2VuZGlmCi0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICAKLSAgICAKLSNpZmRlZiBD
QUNIRV9ERUJVRwotICAgIGlmKCBvLT5zdGF0dXMoKSA9PSBDYWNoZWRPYmplY3Q6OlBlbmRpbmcg
KQotICAgICAgICBrZERlYnVnKCA2MDYwICkgPDwgIkNhY2hlOiBsb2FkaW5nIGluIHByb2dyZXNz
OiAiIDw8IGt1cmwudXJsKCkgPDwgZW5kbDsKLSAgICBlbHNlCi0gICAgICAgIGtkRGVidWcoIDYw
NjAgKSA8PCAiQ2FjaGU6IHVzaW5nIGNhY2hlZDogIiA8PCBrdXJsLnVybCgpIDw8IGVuZGw7Ci0j
ZW5kaWYKLQotICAgIG1vdmVUb0hlYWRPZkxSVUxpc3Qobyk7Ci0gICAgaWYgKCBkbCApIHsKLSAg
ICAgICAgZGwtPm1fZG9jT2JqZWN0cy5yZW1vdmUoIG8gKTsKLSAgICAgICAgaWYgKCFjYWNoZURp
c2FibGVkKQotICAgICAgICBkbC0+bV9kb2NPYmplY3RzLmFwcGVuZCggbyApOwotICAgIH0KLSAg
ICByZXR1cm4gc3RhdGljX2Nhc3Q8Q2FjaGVkU2NyaXB0ICo+KG8pOwotfQotCi12b2lkIENhY2hl
OjpwcmVsb2FkU2NyaXB0KCBjb25zdCBRU3RyaW5nICZ1cmwsIGNvbnN0IFFTdHJpbmcgJnNjcmlw
dF9kYXRhKQotewotICAgIENhY2hlZE9iamVjdCAqbyA9IGNhY2hlLT5maW5kKHVybCk7Ci0gICAg
aWYobykKLSAgICAgICAgcmVtb3ZlQ2FjaGVFbnRyeShvKTsKLQotICAgIENhY2hlZFNjcmlwdCAq
c2NyaXB0ID0gbmV3IENhY2hlZFNjcmlwdCh1cmwsIHNjcmlwdF9kYXRhKTsKLSAgICBjYWNoZS0+
aW5zZXJ0KCB1cmwsIHNjcmlwdCApOwotfQotCi0jaWZkZWYgS0hUTUxfWFNMVAotQ2FjaGVkWFNM
U3R5bGVTaGVldCogQ2FjaGU6OnJlcXVlc3RYU0xTdHlsZVNoZWV0KERvY0xvYWRlciogZGwsIGNv
bnN0IERPTVN0cmluZyAmIHVybCwgYm9vbCByZWxvYWQsIAotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVfdCBfZXhwaXJlRGF0ZSkKLXsKLSAgICAv
LyB0aGlzIGJyaW5ncyB0aGUgX3VybCB0byBhIHN0YW5kYXJkIGZvcm0uLi4KLSAgICBLVVJMIGt1
cmw7Ci0gICAgS0lPOjpDYWNoZUNvbnRyb2wgY2FjaGVQb2xpY3k7Ci0gICAgaWYgKGRsKSB7Ci0g
ICAgICAgIGt1cmwgPSBkbC0+bV9kb2MtPmNvbXBsZXRlVVJMKHVybC5xc3RyaW5nKCkpOwotICAg
ICAgICBjYWNoZVBvbGljeSA9IGRsLT5jYWNoZVBvbGljeSgpOwotICAgIH0KLSAgICBlbHNlIHsK
LSAgICAgICAga3VybCA9IHVybC5xc3RyaW5nKCk7Ci0gICAgICAgIGNhY2hlUG9saWN5ID0gS0lP
OjpDQ19WZXJpZnk7Ci0gICAgfQotICAgIAotICAgIC8vIENoZWNraW5nIGlmIHRoZSBVUkwgaXMg
bWFsZm9ybWVkIGlzIGxvdHMgb2YgZXh0cmEgd29yayBmb3IgbGl0dGxlIGJlbmVmaXQuCi0gICAg
Ci0gICAgQ2FjaGVkT2JqZWN0ICpvID0gY2FjaGUtPmZpbmQoa3VybC51cmwoKSk7Ci0gICAgaWYg
KCFvKSB7Ci0jaWZkZWYgQ0FDSEVfREVCVUcKLSAgICAgICAga2REZWJ1ZyggNjA2MCApIDw8ICJD
YWNoZTogbmV3OiAiIDw8IGt1cmwudXJsKCkgPDwgZW5kbDsKLSNlbmRpZgotICAgICAgICBDYWNo
ZWRYU0xTdHlsZVNoZWV0KiBkb2MgPSBuZXcgQ2FjaGVkWFNMU3R5bGVTaGVldChkbCwga3VybC51
cmwoKSwgY2FjaGVQb2xpY3ksIF9leHBpcmVEYXRlKTsKLSAgICAgICAgaWYgKGNhY2hlRGlzYWJs
ZWQpCi0gICAgICAgICAgICBkb2MtPnNldEZyZWUodHJ1ZSk7Ci0gICAgICAgIGVsc2UgewotICAg
ICAgICAgICAgY2FjaGUtPmluc2VydChrdXJsLnVybCgpLCBkb2MpOwotICAgICAgICAgICAgbW92
ZVRvSGVhZE9mTFJVTGlzdChkb2MpOwotICAgICAgICB9Ci0gICAgICAgIG8gPSBkb2M7Ci0gICAg
fQotICAgIAotICAgIAotICAgIGlmIChvLT50eXBlKCkgIT0gQ2FjaGVkT2JqZWN0OjpYU0xTdHls
ZVNoZWV0KSB7Ci0jaWZkZWYgQ0FDSEVfREVCVUcKLSAgICAgICAga2REZWJ1ZyggNjA2MCApIDw8
ICJDYWNoZTo6SW50ZXJuYWwgRXJyb3IgaW4gcmVxdWVzdFhTTFN0eWxlU2hlZXQgdXJsPSIgPDwg
a3VybC51cmwoKSA8PCAiISIgPDwgZW5kbDsKLSNlbmRpZgotICAgICAgICByZXR1cm4gMDsKLSAg
ICB9Ci0gICAgCi0jaWZkZWYgQ0FDSEVfREVCVUcKLSAgICBpZiAoby0+c3RhdHVzKCkgPT0gQ2Fj
aGVkT2JqZWN0OjpQZW5kaW5nKQotICAgICAgICBrZERlYnVnKCA2MDYwICkgPDwgIkNhY2hlOiBs
b2FkaW5nIGluIHByb2dyZXNzOiAiIDw8IGt1cmwudXJsKCkgPDwgZW5kbDsKLSAgICBlbHNlCi0g
ICAgICAgIGtkRGVidWcoIDYwNjAgKSA8PCAiQ2FjaGU6IHVzaW5nIGNhY2hlZDogIiA8PCBrdXJs
LnVybCgpIDw8IGVuZGw7Ci0jZW5kaWYKLSAgICAKLSAgICBtb3ZlVG9IZWFkT2ZMUlVMaXN0KG8p
OwotICAgIGlmIChkbCkgewotICAgICAgICBkbC0+bV9kb2NPYmplY3RzLnJlbW92ZSggbyApOwot
ICAgICAgICBpZiAoIWNhY2hlRGlzYWJsZWQpCi0gICAgICAgICAgICBkbC0+bV9kb2NPYmplY3Rz
LmFwcGVuZCggbyApOwotICAgIH0KLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q2FjaGVkWFNMU3R5
bGVTaGVldCo+KG8pOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgS0hUTUxfTk9fWEJMCi1DYWNoZWRY
QkxEb2N1bWVudCogQ2FjaGU6OnJlcXVlc3RYQkxEb2N1bWVudChEb2NMb2FkZXIqIGRsLCBjb25z
dCBET01TdHJpbmcgJiB1cmwsIGJvb2wgcmVsb2FkLCAKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHRpbWVfdCBfZXhwaXJlRGF0ZSkKLXsKLSAgICAvLyB0aGlz
IGJyaW5ncyB0aGUgX3VybCB0byBhIHN0YW5kYXJkIGZvcm0uLi4KLSAgICBLVVJMIGt1cmw7Ci0g
ICAgS0lPOjpDYWNoZUNvbnRyb2wgY2FjaGVQb2xpY3k7Ci0gICAgaWYgKGRsKSB7Ci0gICAgICAg
IGt1cmwgPSBkbC0+bV9kb2MtPmNvbXBsZXRlVVJMKHVybC5xc3RyaW5nKCkpOwotICAgICAgICBj
YWNoZVBvbGljeSA9IGRsLT5jYWNoZVBvbGljeSgpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAg
ICAga3VybCA9IHVybC5xc3RyaW5nKCk7Ci0gICAgICAgIGNhY2hlUG9saWN5ID0gS0lPOjpDQ19W
ZXJpZnk7Ci0gICAgfQotICAgIAotICAgIC8vIENoZWNraW5nIGlmIHRoZSBVUkwgaXMgbWFsZm9y
bWVkIGlzIGxvdHMgb2YgZXh0cmEgd29yayBmb3IgbGl0dGxlIGJlbmVmaXQuCi0gICAgCi0gICAg
Q2FjaGVkT2JqZWN0ICpvID0gY2FjaGUtPmZpbmQoa3VybC51cmwoKSk7Ci0gICAgaWYoIW8pCi0g
ICAgewotI2lmZGVmIENBQ0hFX0RFQlVHCi0gICAgICAgIGtkRGVidWcoIDYwNjAgKSA8PCAiQ2Fj
aGU6IG5ldzogIiA8PCBrdXJsLnVybCgpIDw8IGVuZGw7Ci0jZW5kaWYKLSAgICAgICAgQ2FjaGVk
WEJMRG9jdW1lbnQqIGRvYyA9IG5ldyBDYWNoZWRYQkxEb2N1bWVudChkbCwga3VybC51cmwoKSwg
Y2FjaGVQb2xpY3ksIF9leHBpcmVEYXRlKTsKLSAgICAgICAgaWYgKGNhY2hlRGlzYWJsZWQpCi0g
ICAgICAgICAgICBkb2MtPnNldEZyZWUodHJ1ZSk7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAg
ICAgY2FjaGUtPmluc2VydChrdXJsLnVybCgpLCBkb2MpOwotICAgICAgICAgICAgbW92ZVRvSGVh
ZE9mTFJVTGlzdChkb2MpOwotICAgICAgICB9Ci0gICAgICAgIG8gPSBkb2M7Ci0gICAgfQotICAg
IAotICAgIAotICAgIGlmKG8tPnR5cGUoKSAhPSBDYWNoZWRPYmplY3Q6OlhCTCkKLSAgICB7Ci0j
aWZkZWYgQ0FDSEVfREVCVUcKLSAgICAgICAga2REZWJ1ZyggNjA2MCApIDw8ICJDYWNoZTo6SW50
ZXJuYWwgRXJyb3IgaW4gcmVxdWVzdFhCTERvY3VtZW50IHVybD0iIDw8IGt1cmwudXJsKCkgPDwg
IiEiIDw8IGVuZGw7Ci0jZW5kaWYKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIAotI2lm
ZGVmIENBQ0hFX0RFQlVHCi0gICAgaWYoIG8tPnN0YXR1cygpID09IENhY2hlZE9iamVjdDo6UGVu
ZGluZyApCi0gICAgICAgIGtkRGVidWcoIDYwNjAgKSA8PCAiQ2FjaGU6IGxvYWRpbmcgaW4gcHJv
Z3Jlc3M6ICIgPDwga3VybC51cmwoKSA8PCBlbmRsOwotICAgIGVsc2UKLSAgICAgICAga2REZWJ1
ZyggNjA2MCApIDw8ICJDYWNoZTogdXNpbmcgY2FjaGVkOiAiIDw8IGt1cmwudXJsKCkgPDwgZW5k
bDsKLSNlbmRpZgotICAgIAotICAgIG1vdmVUb0hlYWRPZkxSVUxpc3Qobyk7Ci0gICAgaWYgKCBk
bCApIHsKLSAgICAgICAgZGwtPm1fZG9jT2JqZWN0cy5yZW1vdmUoIG8gKTsKLSAgICAgICAgaWYg
KCFjYWNoZURpc2FibGVkKQotICAgICAgICAgICAgZGwtPm1fZG9jT2JqZWN0cy5hcHBlbmQoIG8g
KTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PENhY2hlZFhCTERvY3VtZW50Kj4obyk7
Ci19Ci0jZW5kaWYKLQotdm9pZCBDYWNoZTo6Zmx1c2goYm9vbCBmb3JjZSkKLXsKLSAgICBpZiAo
Zm9yY2UpCi0gICAgICAgZmx1c2hDb3VudCA9IDA7Ci0gICAgLy8gRG9uJ3QgZmx1c2ggZm9yIGV2
ZXJ5IGltYWdlLgotICAgIGlmIChtX2NvdW50T2ZMUlVBbmRVbmNhY2hlYWJsZUxpc3RzIDwgZmx1
c2hDb3VudCkKLSAgICAgICByZXR1cm47Ci0KLSAgICBpbml0KCk7Ci0KLSAgICB3aGlsZSAobV9o
ZWFkT2ZVbmNhY2hlYWJsZUxpc3QpCi0gICAgICAgIHJlbW92ZUNhY2hlRW50cnkobV9oZWFkT2ZV
bmNhY2hlYWJsZUxpc3QpOwotCi0gICAgZm9yIChpbnQgaSA9IE1BWF9MUlVfTElTVFMtMTsgaT49
MDsgaS0tKSB7Ci0gICAgICAgIGlmIChtX3RvdGFsU2l6ZU9mTFJVTGlzdHMgPD0gbWF4U2l6ZSkK
LSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgCi0gICAgICAgIHdoaWxlIChtX3RvdGFs
U2l6ZU9mTFJVTGlzdHMgPiBtYXhTaXplICYmIG1fTFJVTGlzdHNbaV0ubV90YWlsKQotICAgICAg
ICAgICAgcmVtb3ZlQ2FjaGVFbnRyeShtX0xSVUxpc3RzW2ldLm1fdGFpbCk7Ci0gICAgfQotCi0g
ICAgZmx1c2hDb3VudCA9IG1fY291bnRPZkxSVUFuZFVuY2FjaGVhYmxlTGlzdHMrMTA7IC8vIEZs
dXNoIGFnYWluIHdoZW4gdGhlIGNhY2hlIGhhcyBncm93bi4KLX0KLQotCi12b2lkIENhY2hlOjpz
ZXRTaXplKCBpbnQgYnl0ZXMgKQotewotICAgIG1heFNpemUgPSBieXRlczsKLSAgICBtYXhDYWNo
ZWFibGUgPSBrTWF4KG1heFNpemUgLyAxMjgsIE1BWENBQ0hFQUJMRSk7Ci0KLSAgICAvLyBtYXkg
YmUgd2UgbmVlZCB0byBjbGVhciBwYXJ0cyBvZiB0aGUgY2FjaGUKLSAgICBmbHVzaENvdW50ID0g
MDsKLSAgICBmbHVzaCh0cnVlKTsKLX0KLQotdm9pZCBDYWNoZTo6cmVtb3ZlQ2FjaGVFbnRyeSgg
Q2FjaGVkT2JqZWN0ICpvYmplY3QgKQotewotICBRU3RyaW5nIGtleSA9IG9iamVjdC0+dXJsKCku
cXN0cmluZygpOwotCi0gIC8vIHRoaXMgaW5kaWNhdGVzIHRoZSBkZXJlZigpIG1ldGhvZCBvZiBD
YWNoZWRPYmplY3QgdG8gZGVsZXRlIGl0c2VsZiB3aGVuIHRoZSByZWZlcmVuY2UgY291bnRlcgot
ICAvLyBkcm9wcyBkb3duIHRvIHplcm8KLSAgb2JqZWN0LT5zZXRGcmVlKCB0cnVlICk7Ci0KLSAg
Y2FjaGUtPnJlbW92ZSgga2V5ICk7Ci0gIHJlbW92ZUZyb21MUlVMaXN0KG9iamVjdCk7Ci0KLSAg
Y29uc3QgRG9jTG9hZGVyKiBkbDsKLSAgZm9yICggZGw9ZG9jbG9hZGVyLT5maXJzdCgpOyBkbDsg
ZGw9ZG9jbG9hZGVyLT5uZXh0KCkgKQotICAgICAgZGwtPnJlbW92ZUNhY2hlZE9iamVjdCggb2Jq
ZWN0ICk7Ci0KLSAgaWYgKCBvYmplY3QtPmNhbkRlbGV0ZSgpICkKLSAgICAgZGVsZXRlIG9iamVj
dDsKLX0KLQotI2RlZmluZSBGQVNUX0xPRzIoX2xvZzIsX24pICAgXAotICAgICAgdW5zaWduZWQg
aW50IGpfID0gKHVuc2lnbmVkIGludCkoX24pOyAgIFwKLSAgICAgIChfbG9nMikgPSAwOyAgICAg
ICAgICAgICAgICAgICAgXAotICAgICAgaWYgKChqXykgJiAoKGpfKS0xKSkgICAgICAgICAgICBc
Ci0gICAgICAoX2xvZzIpICs9IDE7ICAgICAgICAgICAgICAgXAotICAgICAgaWYgKChqXykgPj4g
MTYpICAgICAgICAgICAgICAgICBcCi0gICAgICAoX2xvZzIpICs9IDE2LCAoal8pID4+PSAxNjsg
XAotICAgICAgaWYgKChqXykgPj4gOCkgICAgICAgICAgICAgICAgICBcCi0gICAgICAoX2xvZzIp
ICs9IDgsIChqXykgPj49IDg7ICAgXAotICAgICAgaWYgKChqXykgPj4gNCkgICAgICAgICAgICAg
ICAgICBcCi0gICAgICAoX2xvZzIpICs9IDQsIChqXykgPj49IDQ7ICAgXAotICAgICAgaWYgKChq
XykgPj4gMikgICAgICAgICAgICAgICAgICBcCi0gICAgICAoX2xvZzIpICs9IDIsIChqXykgPj49
IDI7ICAgXAotICAgICAgaWYgKChqXykgPj4gMSkgICAgICAgICAgICAgICAgICBcCi0gICAgICAo
X2xvZzIpICs9IDE7Ci0KLWludCBGYXN0TG9nMih1bnNpZ25lZCBpbnQgaSkgewotICAgIGludCBs
b2cyOwotICAgIEZBU1RfTE9HMihsb2cyLGkpOwotICAgIHJldHVybiBsb2cyOwotfQotCi1MUlVM
aXN0KiBDYWNoZTo6Z2V0TFJVTGlzdEZvcihDYWNoZWRPYmplY3QqIG8pCi17Ci0gICAgaW50IGFj
Y2Vzc0NvdW50ID0gby0+YWNjZXNzQ291bnQoKTsKLSAgICBpbnQgcXVldWVJbmRleDsKLSAgICBp
ZiAoYWNjZXNzQ291bnQgPT0gMCkgewotICAgICAgICBxdWV1ZUluZGV4ID0gMDsKLSAgICB9IGVs
c2UgewotICAgICAgICBpbnQgc2l6ZUxvZyA9IEZhc3RMb2cyKG8tPnNpemUoKSk7Ci0gICAgICAg
IHF1ZXVlSW5kZXggPSBzaXplTG9nL28tPmFjY2Vzc0NvdW50KCkgLSAxOwotICAgICAgICBpZiAo
cXVldWVJbmRleCA8IDApCi0gICAgICAgICAgICBxdWV1ZUluZGV4ID0gMDsKLSAgICAgICAgaWYg
KHF1ZXVlSW5kZXggPj0gTUFYX0xSVV9MSVNUUykKLSAgICAgICAgICAgIHF1ZXVlSW5kZXggPSBN
QVhfTFJVX0xJU1RTLTE7Ci0gICAgfQotICAgIGlmIChtX0xSVUxpc3RzID09IDApIHsKLSAgICAg
ICAgbV9MUlVMaXN0cyA9IG5ldyBMUlVMaXN0IFtNQVhfTFJVX0xJU1RTXTsKLSAgICB9Ci0gICAg
cmV0dXJuICZtX0xSVUxpc3RzW3F1ZXVlSW5kZXhdOwotfQotCi12b2lkIENhY2hlOjpyZW1vdmVG
cm9tTFJVTGlzdChDYWNoZWRPYmplY3QgKm9iamVjdCkKLXsKLSAgICBDYWNoZWRPYmplY3QgKm5l
eHQgPSBvYmplY3QtPm1fbmV4dEluTFJVTGlzdDsKLSAgICBDYWNoZWRPYmplY3QgKnByZXYgPSBv
YmplY3QtPm1fcHJldkluTFJVTGlzdDsKLSAgICBib29sIHVuY2FjaGVhYmxlID0gb2JqZWN0LT5z
dGF0dXMoKSA9PSBDYWNoZWRPYmplY3Q6OlVuY2FjaGVhYmxlOwotICAgIAotICAgIExSVUxpc3Qq
IGxpc3QgPSB1bmNhY2hlYWJsZSA/IDAgOiBnZXRMUlVMaXN0Rm9yKG9iamVjdCk7Ci0gICAgQ2Fj
aGVkT2JqZWN0IComaGVhZCA9IHVuY2FjaGVhYmxlID8gbV9oZWFkT2ZVbmNhY2hlYWJsZUxpc3Qg
OiBsaXN0LT5tX2hlYWQ7Ci0gICAgCi0gICAgaWYgKG5leHQgPT0gMCAmJiBwcmV2ID09IDAgJiYg
aGVhZCAhPSBvYmplY3QpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAKLSAgICBvYmpl
Y3QtPm1fbmV4dEluTFJVTGlzdCA9IDA7Ci0gICAgb2JqZWN0LT5tX3ByZXZJbkxSVUxpc3QgPSAw
OwotICAgIAotICAgIGlmIChuZXh0KQotICAgICAgICBuZXh0LT5tX3ByZXZJbkxSVUxpc3QgPSBw
cmV2OwotICAgIGVsc2UgaWYgKCF1bmNhY2hlYWJsZSAmJiBsaXN0LT5tX3RhaWwgPT0gb2JqZWN0
KQotICAgICAgICBsaXN0LT5tX3RhaWwgPSBwcmV2OwotCi0gICAgaWYgKHByZXYpCi0gICAgICAg
IHByZXYtPm1fbmV4dEluTFJVTGlzdCA9IG5leHQ7Ci0gICAgZWxzZSBpZiAoaGVhZCA9PSBvYmpl
Y3QpCi0gICAgICAgIGhlYWQgPSBuZXh0OwotICAgIAotICAgIC0tbV9jb3VudE9mTFJVQW5kVW5j
YWNoZWFibGVMaXN0czsKLSAgICAKLSAgICBpZiAoIXVuY2FjaGVhYmxlKQotICAgICAgICBtX3Rv
dGFsU2l6ZU9mTFJVTGlzdHMgLT0gb2JqZWN0LT5zaXplKCk7Ci19Ci0KLXZvaWQgQ2FjaGU6Om1v
dmVUb0hlYWRPZkxSVUxpc3QoQ2FjaGVkT2JqZWN0ICpvYmplY3QpCi17Ci0gICAgaW5zZXJ0SW5M
UlVMaXN0KG9iamVjdCk7Ci19Ci0KLXZvaWQgQ2FjaGU6Omluc2VydEluTFJVTGlzdChDYWNoZWRP
YmplY3QgKm9iamVjdCkKLXsKLSAgICByZW1vdmVGcm9tTFJVTGlzdChvYmplY3QpOwotICAgIAot
ICAgIGlmICghb2JqZWN0LT5hbGxvd0luTFJVTGlzdCgpKQotICAgICAgICByZXR1cm47Ci0gICAg
Ci0gICAgTFJVTGlzdCogbGlzdCA9IGdldExSVUxpc3RGb3Iob2JqZWN0KTsKLSAgICAKLSAgICBi
b29sIHVuY2FjaGVhYmxlID0gb2JqZWN0LT5zdGF0dXMoKSA9PSBDYWNoZWRPYmplY3Q6OlVuY2Fj
aGVhYmxlOwotICAgIENhY2hlZE9iamVjdCAqJmhlYWQgPSB1bmNhY2hlYWJsZSA/IG1faGVhZE9m
VW5jYWNoZWFibGVMaXN0IDogbGlzdC0+bV9oZWFkOwotCi0gICAgb2JqZWN0LT5tX25leHRJbkxS
VUxpc3QgPSBoZWFkOwotICAgIGlmIChoZWFkKQotICAgICAgICBoZWFkLT5tX3ByZXZJbkxSVUxp
c3QgPSBvYmplY3Q7Ci0gICAgaGVhZCA9IG9iamVjdDsKLSAgICAKLSAgICBpZiAob2JqZWN0LT5t
X25leHRJbkxSVUxpc3QgPT0gMCAmJiAhdW5jYWNoZWFibGUpCi0gICAgICAgIGxpc3QtPm1fdGFp
bCA9IG9iamVjdDsKLSAgICAKLSAgICArK21fY291bnRPZkxSVUFuZFVuY2FjaGVhYmxlTGlzdHM7
Ci0gICAgCi0gICAgaWYgKCF1bmNhY2hlYWJsZSkKLSAgICAgICAgbV90b3RhbFNpemVPZkxSVUxp
c3RzICs9IG9iamVjdC0+c2l6ZSgpOwotfQotCi1ib29sIENhY2hlOjphZGp1c3RTaXplKENhY2hl
ZE9iamVjdCAqb2JqZWN0LCBpbnQgZGVsdGEpCi17Ci0gICAgaWYgKG9iamVjdC0+c3RhdHVzKCkg
PT0gQ2FjaGVkT2JqZWN0OjpVbmNhY2hlYWJsZSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0g
ICAgaWYgKG9iamVjdC0+bV9uZXh0SW5MUlVMaXN0ID09IDAgJiYgb2JqZWN0LT5tX3ByZXZJbkxS
VUxpc3QgPT0gMCAmJgotICAgICAgICBnZXRMUlVMaXN0Rm9yKG9iamVjdCktPm1faGVhZCAhPSBv
YmplY3QpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICBtX3RvdGFsU2l6ZU9mTFJV
TGlzdHMgKz0gZGVsdGE7Ci0gICAgcmV0dXJuIGRlbHRhICE9IDA7Ci19Ci0KLS8vIC0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUNhY2hlZE9iamVjdENsaWVudCAqQ2Fj
aGVkT2JqZWN0Q2xpZW50V2Fsa2VyOjpuZXh0KCkKLXsKLSAgICAvLyBPbmx5IGFkdmFuY2UgaWYg
d2UgYWxyZWFkeSByZXR1cm5lZCB0aGlzIGl0ZW0uCi0gICAgLy8gVGhpcyBoYW5kbGVzIGNhc2Vz
IHdoZXJlIHRoZSBjdXJyZW50IGl0ZW0gaXMgcmVtb3ZlZCwgYW5kIHByZXZlbnRzIHVzIGZyb20g
c2tpcHBpbmcgdGhlIG5leHQgaXRlbS4KLSAgICAvLyBUaGUgaXRlcmF0b3IgYXV0b21hdGljYWxs
eSBnZXRzIGFkdmFuY2VkIHRvIHRoZSBuZXh0IGl0ZW0sIGFuZCB3ZSBtYWtlIHN1cmUgd2UgcmV0
dXJuIGl0LgotICAgIGlmIChfY3VycmVudCA9PSBfaXRlcmF0b3IuY3VycmVudCgpKQotICAgICAg
ICArK19pdGVyYXRvcjsKLSAgICBfY3VycmVudCA9IF9pdGVyYXRvci5jdXJyZW50KCk7Ci0gICAg
cmV0dXJuIF9jdXJyZW50OwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLQotCi1DYWNoZWRPYmplY3RDbGllbnQ6On5DYWNoZWRPYmplY3RDbGllbnQoKSB7IH0K
LXZvaWQgQ2FjaGVkT2JqZWN0Q2xpZW50OjpzZXRQaXhtYXAoY29uc3QgUVBpeG1hcCAmLCBjb25z
dCBRUmVjdCYsIENhY2hlZEltYWdlICopIHt9Ci12b2lkIENhY2hlZE9iamVjdENsaWVudDo6c2V0
U3R5bGVTaGVldChjb25zdCBET006OkRPTVN0cmluZyAmLyp1cmwqLywgY29uc3QgRE9NOjpET01T
dHJpbmcgJi8qc2hlZXQqLykge30KLSNpZm5kZWYgS0hUTUxfTk9fWEJMCi12b2lkIENhY2hlZE9i
amVjdENsaWVudDo6c2V0WEJMRG9jdW1lbnQoY29uc3QgRE9NOjpET01TdHJpbmcmIHVybCwgWEJM
OjpYQkxEb2N1bWVudEltcGwqIGRvYykge30KLSNlbmRpZgotdm9pZCBDYWNoZWRPYmplY3RDbGll
bnQ6Om5vdGlmeUZpbmlzaGVkKENhY2hlZE9iamVjdCAqIC8qZmluaXNoZWRPYmoqLykge30KLQot
Q2FjaGU6OlN0YXRpc3RpY3MgQ2FjaGU6OmdldFN0YXRpc3RpY3MoKQotewotICAgIFN0YXRpc3Rp
Y3Mgc3RhdHM7Ci0KLSAgICBpZiAoIWNhY2hlKQotICAgICAgICByZXR1cm4gc3RhdHM7Ci0KLSAg
ICBRRGljdEl0ZXJhdG9yPENhY2hlZE9iamVjdD4gaSgqY2FjaGUpOwotICAgIGZvciAoaS50b0Zp
cnN0KCk7IGkuY3VycmVudCgpOyArK2kpIHsKLSAgICAgICAgQ2FjaGVkT2JqZWN0ICpvID0gaS5j
dXJyZW50KCk7Ci0gICAgICAgIHN3aXRjaCAoby0+dHlwZSgpKSB7Ci0gICAgICAgICAgICBjYXNl
IENhY2hlZE9iamVjdDo6SW1hZ2U6Ci0gICAgICAgICAgICAgICAgc3RhdHMuaW1hZ2VzLmNvdW50
Kys7Ci0gICAgICAgICAgICAgICAgc3RhdHMuaW1hZ2VzLnNpemUgKz0gby0+c2l6ZSgpOwotICAg
ICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIENhY2hlZE9iamVjdDo6Q1NT
U3R5bGVTaGVldDoKLSAgICAgICAgICAgICAgICBzdGF0cy5zdHlsZVNoZWV0cy5jb3VudCsrOwot
ICAgICAgICAgICAgICAgIHN0YXRzLnN0eWxlU2hlZXRzLnNpemUgKz0gby0+c2l6ZSgpOwotICAg
ICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIENhY2hlZE9iamVjdDo6U2Ny
aXB0OgotICAgICAgICAgICAgICAgIHN0YXRzLnNjcmlwdHMuY291bnQrKzsKLSAgICAgICAgICAg
ICAgICBzdGF0cy5zY3JpcHRzLnNpemUgKz0gby0+c2l6ZSgpOwotICAgICAgICAgICAgICAgIGJy
ZWFrOwotI2lmZGVmIEtIVE1MX1hTTFQKLSAgICAgICAgICAgIGNhc2UgQ2FjaGVkT2JqZWN0OjpY
U0xTdHlsZVNoZWV0OgotICAgICAgICAgICAgICAgIHN0YXRzLnhzbFN0eWxlU2hlZXRzLmNvdW50
Kys7Ci0gICAgICAgICAgICAgICAgc3RhdHMueHNsU3R5bGVTaGVldHMuc2l6ZSArPSBvLT5zaXpl
KCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZm5kZWYgS0hUTUxfTk9fWEJM
Ci0gICAgICAgICAgICBjYXNlIENhY2hlZE9iamVjdDo6WEJMOgotICAgICAgICAgICAgICAgIHN0
YXRzLnhibERvY3MuY291bnQrKzsKLSAgICAgICAgICAgICAgICBzdGF0cy54YmxEb2NzLnNpemUg
Kz0gby0+c2l6ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotI2VuZGlmCi0gICAgICAgICAg
ICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHN0YXRzLm90aGVyLmNvdW50Kys7Ci0gICAgICAg
ICAgICAgICAgc3RhdHMub3RoZXIuc2l6ZSArPSBvLT5zaXplKCk7Ci0gICAgICAgIH0KLSAgICB9
Ci0gICAgCi0gICAgcmV0dXJuIHN0YXRzOwotfQotCi12b2lkIENhY2hlOjpmbHVzaEFsbCgpCi17
Ci0gICAgaWYgKCFjYWNoZSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgZm9yICg7OykgewotICAg
ICAgICBRRGljdEl0ZXJhdG9yPENhY2hlZE9iamVjdD4gaSgqY2FjaGUpOwotICAgICAgICBDYWNo
ZWRPYmplY3QgKm8gPSBpLnRvRmlyc3QoKTsKLSAgICAgICAgaWYgKCFvKQotICAgICAgICAgICAg
YnJlYWs7Ci0gICAgICAgIHJlbW92ZUNhY2hlRW50cnkobyk7Ci0gICAgfQotfQotCi12b2lkIENh
Y2hlOjpzZXRDYWNoZURpc2FibGVkKGJvb2wgZGlzYWJsZWQpCi17Ci0gICAgY2FjaGVEaXNhYmxl
ZCA9IGRpc2FibGVkOwotICAgIGlmIChkaXNhYmxlZCkKLSAgICAgICAgZmx1c2hBbGwoKTsKLX0K
K307CkluZGV4OiBtaXNjL0RvY0xvYWRlci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIG1pc2MvRG9jTG9hZGVy
LmgJKHJldmlzaW9uIDExOTQ4KQorKysgbWlzYy9Eb2NMb2FkZXIuaAkod29ya2luZyBjb3B5KQpA
QCAtMjMsNDMzICsyMywzNyBAQAogICAgIFRoaXMgY2xhc3MgcHJvdmlkZXMgYWxsIGZ1bmN0aW9u
YWxpdHkgbmVlZGVkIGZvciBsb2FkaW5nIGltYWdlcywgc3R5bGUgc2hlZXRzIGFuZCBodG1sCiAg
ICAgcGFnZXMgZnJvbSB0aGUgd2ViLiBJdCBoYXMgYSBtZW1vcnkgY2FjaGUgZm9yIHRoZXNlIG9i
amVjdHMuCiAqLwotI2lmbmRlZiBfa2h0bWxfbG9hZGVyX2gKLSNkZWZpbmUgX2todG1sX2xvYWRl
cl9oCisjaWZuZGVmIEtIVE1MX0RvY0xvYWRlcl9oCisjZGVmaW5lIEtIVE1MX0RvY0xvYWRlcl9o
CiAKLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQot
I2luY2x1ZGUgPHRpbWUuaD4KLQotI2luY2x1ZGUgImxvYWRlcl9jbGllbnQuaCIKLSNpZmRlZiBI
QVZFX0xJQkpQRUcKLSNpbmNsdWRlICJsb2FkZXJfanBlZy5oIgotI2VuZGlmCi0KLSNpbmNsdWRl
IDxzdGRsaWIuaD4KICNpbmNsdWRlIDxxcHRybGlzdC5oPgotI2luY2x1ZGUgPHFvYmplY3QuaD4K
LSNpbmNsdWRlIDxxcHRyZGljdC5oPgogI2luY2x1ZGUgPHFkaWN0Lmg+Ci0jaW5jbHVkZSA8cXBp
eG1hcC5oPgogI2luY2x1ZGUgPHFidWZmZXIuaD4KICNpbmNsdWRlIDxxc3RyaW5nbGlzdC5oPgot
I2luY2x1ZGUgPHF0ZXh0Y29kZWMuaD4KIAotI2luY2x1ZGUgPGt1cmwuaD4KICNpbmNsdWRlIDxr
aW8vZ2xvYmFsLmg+CiAKICNpbmNsdWRlIDxraHRtbF9zZXR0aW5ncy5oPgogI2luY2x1ZGUgPGRv
bS9kb21fc3RyaW5nLmg+Ci0jaW5jbHVkZSAiRG9jUHRyLmgiCiAKIGNsYXNzIEtIVE1MUGFydDsK
K2NsYXNzIEtVUkw7CiAKLW5hbWVzcGFjZSBLSU8gewotICBjbGFzcyBKb2I7Ci0gIGNsYXNzIFRy
YW5zZmVySm9iOwotfQotCi1uYW1lc3BhY2UgRE9NCi17Ci0gICAgY2xhc3MgQ1NTU3R5bGVTaGVl
dEltcGw7CituYW1lc3BhY2UgRE9NIHsKICAgICBjbGFzcyBEb2N1bWVudEltcGw7CiB9OwogCi0K
IGNsYXNzIEtXUUxvYWRlcjsKIAotI2lmIF9fT0JKQ19fCi1AY2xhc3MgTlNEYXRhOwotQGNsYXNz
IE5TVVJMUmVzcG9uc2U7Ci0jZWxzZQotY2xhc3MgTlNEYXRhOwotY2xhc3MgTlNVUkxSZXNwb25z
ZTsKLSNlbmRpZgotCi0KIG5hbWVzcGFjZSBraHRtbAogewogICAgIGNsYXNzIENhY2hlZE9iamVj
dDsKLSAgICBjbGFzcyBSZXF1ZXN0OwotICAgIGNsYXNzIERvY0xvYWRlcjsKLSAgICBjbGFzcyBE
ZWNvZGVyOwotCi0gI2RlZmluZSBNQVhfTFJVX0xJU1RTIDIwCi0gICAgCi0gICAgc3RydWN0IExS
VUxpc3QgewotICAgICAgICBDYWNoZWRPYmplY3QqIG1faGVhZDsKLSAgICAgICAgQ2FjaGVkT2Jq
ZWN0KiBtX3RhaWw7Ci0gICAgCi0gICAgICAgIExSVUxpc3QoKTsKLSAgICAgICAgfkxSVUxpc3Qo
KTsKLSAgICB9OwotICAgIAotICAgIC8qKgotICAgICAqIEBpbnRlcm5hbAotICAgICAqCi0gICAg
ICogQSBjYWNoZWQgb2JqZWN0LiBDbGFzc2VzIHdobyB3YW50IHRvIHVzZSB0aGlzIG9iamVjdCBz
aG91bGQgZGVyaXZlCi0gICAgICogZnJvbSBDYWNoZWRPYmplY3RDbGllbnQsIHRvIGdldCB0aGUg
ZnVuY3Rpb24gY2FsbHMgaW4gY2FzZSB0aGUgcmVxdWVzdGVkIGRhdGEgaGFzIGFycml2ZWQuCi0g
ICAgICoKLSAgICAgKiBUaGlzIGNsYXNzIGFsc28gZG9lcyB0aGUgYWN0dWFsIGNvbW11bmljYXRp
b24gd2l0aCBraW8gYW5kIGxvYWRzIHRoZSBmaWxlLgotICAgICAqLwotICAgIGNsYXNzIENhY2hl
ZE9iamVjdAotICAgIHsKLSAgICBwdWJsaWM6Ci0JZW51bSBUeXBlIHsKLQkgICAgSW1hZ2UsCi0J
ICAgIENTU1N0eWxlU2hlZXQsCi0JICAgIFNjcmlwdAotI2lmZGVmIEtIVE1MX1hTTFQKLSAgICAg
ICAgICAgICwgWFNMU3R5bGVTaGVldAotI2VuZGlmCi0jaWZuZGVmIEtIVE1MX05PX1hCTAotICAg
ICAgICAgICAgLCBYQkwKLSNlbmRpZgotCX07Ci0KLQllbnVtIFN0YXR1cyB7Ci0JICAgIE5vdENh
Y2hlZCwgICAgLy8gdGhpcyBVUkwgaXMgbm90IGNhY2hlZAotCSAgICBVbmtub3duLCAgICAgIC8v
IGxldCBpbWFnZWNhY2hlIGRlY2lkZSB3aGF0IHRvIGRvIHdpdGggaXQKLQkgICAgTmV3LCAgICAg
ICAgICAvLyBpbnNlcnRpbmcgbmV3IGltYWdlCi0gICAgICAgIFBlbmRpbmcsICAgICAgLy8gb25s
eSBwYXJ0aWFsbHkgbG9hZGVkCi0JICAgIFBlcnNpc3RlbnQsICAgLy8gbmV2ZXIgZGVsZXRlIHRo
aXMgcGl4bWFwCi0JICAgIENhY2hlZCwgICAgICAgLy8gcmVndWxhciBjYXNlCi0JICAgIFVuY2Fj
aGVhYmxlICAgLy8gdG9vIGJpZyB0byBiZSBjYWNoZWQsCi0JfTsgIAkgICAgICAgICAgLy8gd2ls
bCBiZSBkZXN0cm95ZWQgYXMgc29vbiBhcyBwb3NzaWJsZQotCi0JQ2FjaGVkT2JqZWN0KGNvbnN0
IERPTTo6RE9NU3RyaW5nICZ1cmwsIFR5cGUgdHlwZSwgS0lPOjpDYWNoZUNvbnRyb2wgX2NhY2hl
UG9saWN5LCB0aW1lX3QgX2V4cGlyZURhdGUsIGludCBzaXplID0gMCkKLQl7Ci0JICAgIG1fdXJs
ID0gdXJsOwotCSAgICBtX3R5cGUgPSB0eXBlOwotCSAgICBtX3N0YXR1cyA9IFBlbmRpbmc7Ci0J
ICAgIG1fc2l6ZSA9IHNpemU7Ci0JICAgIG1fZnJlZSA9IGZhbHNlOwotCSAgICBtX2NhY2hlUG9s
aWN5ID0gX2NhY2hlUG9saWN5OwotCSAgICBtX3JlcXVlc3QgPSAwOwotICAgICAgICBtX3Jlc3Bv
bnNlID0gMDsKLSAgICAgICAgbV9hbGxEYXRhID0gMDsKLQkgICAgbV9leHBpcmVEYXRlID0gX2V4
cGlyZURhdGU7Ci0gICAgICAgIG1fZGVsZXRlZCA9IGZhbHNlOwotICAgICAgICBtX2V4cGlyZURh
dGVDaGFuZ2VkID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICBtX2FjY2Vzc0NvdW50ID0gMDsK
LSAgICAgICAgCi0gICAgICAgIG1fbmV4dEluTFJVTGlzdCA9IDA7Ci0gICAgICAgIG1fcHJldklu
TFJVTGlzdCA9IDA7Ci0JfQotCXZpcnR1YWwgfkNhY2hlZE9iamVjdCgpOwotCi0JdmlydHVhbCB2
b2lkIHNldENoYXJzZXQoIGNvbnN0IFFTdHJpbmcgJmNocyApIHt9Ci0JdmlydHVhbCB2b2lkIGRh
dGEoIFFCdWZmZXIgJmJ1ZmZlciwgYm9vbCBlb2YpID0gMDsKLQl2aXJ0dWFsIHZvaWQgZXJyb3Io
IGludCBlcnIsIGNvbnN0IGNoYXIgKnRleHQgKSA9IDA7Ci0KLQljb25zdCBET006OkRPTVN0cmlu
ZyAmdXJsKCkgY29uc3QgeyByZXR1cm4gbV91cmw7IH0KLQlUeXBlIHR5cGUoKSBjb25zdCB7IHJl
dHVybiBtX3R5cGU7IH0KLQotCXZpcnR1YWwgdm9pZCByZWYoQ2FjaGVkT2JqZWN0Q2xpZW50ICpj
b25zdW1lcik7Ci0JdmlydHVhbCB2b2lkIGRlcmVmKENhY2hlZE9iamVjdENsaWVudCAqY29uc3Vt
ZXIpOwotCi0JaW50IGNvdW50KCkgY29uc3QgeyByZXR1cm4gbV9jbGllbnRzLmNvdW50KCk7IH0K
LQotCVN0YXR1cyBzdGF0dXMoKSBjb25zdCB7IHJldHVybiBtX3N0YXR1czsgfQotCi0JaW50IHNp
emUoKSBjb25zdCB7IHJldHVybiBtX3NpemU7IH0KLQotICAgICAgICBib29sIGlzTG9hZGVkKCkg
Y29uc3QgeyByZXR1cm4gIW1fbG9hZGluZzsgfQotICAgICAgICAKLSAgICAgICAgdmlydHVhbCBi
b29sIGlzSW1hZ2UoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotCi0gICAgaW50IGFjY2Vzc0Nv
dW50KCkgY29uc3QgeyByZXR1cm4gbV9hY2Nlc3NDb3VudDsgfQotICAgIHZvaWQgaW5jcmVhc2VB
Y2Nlc3NDb3VudCgpIHsgbV9hY2Nlc3NDb3VudCsrOyB9Ci0gICAgCi0JLyoqCi0JICogY29tcHV0
ZXMgdGhlIHN0YXR1cyBvZiBhbiBvYmplY3QgYWZ0ZXIgbG9hZGluZy4KLQkgKiB0aGUgcmVzdWx0
IGRlcGVuZHMgb24gdGhlIG9iamVjdHMgc2l6ZSBhbmQgdGhlIHNpemUgb2YgdGhlIGNhY2hlCi0J
ICogYWxzbyB1cGRhdGVzIHRoZSBleHBpcmUgZGF0ZSBvbiB0aGUgY2FjaGUgZW50cnkgZmlsZQot
CSAqLwotCXZvaWQgZmluaXNoKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCBi
eSB0aGUgY2FjaGUgaWYgdGhlIG9iamVjdCBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIGNhY2hl
IGRpY3QKLSAgICAgICAgICogd2hpbGUgc3RpbGwgYmVpbmcgcmVmZXJlbmNlZC4gVGhpcyBtZWFu
cyB0aGUgb2JqZWN0IHNob3VsZCBraWxsIGl0c2VsZgotICAgICAgICAgKiBpZiBpdHMgcmVmZXJl
bmNlIGNvdW50ZXIgZHJvcHMgZG93biB0byB6ZXJvLgotICAgICAgICAgKi8KLSAgICAgICAgdm9p
ZCBzZXRGcmVlKCBib29sIGIgKSB7IG1fZnJlZSA9IGI7IH0KLQotICAgICAgICBLSU86OkNhY2hl
Q29udHJvbCBjYWNoZVBvbGljeSgpIGNvbnN0IHsgcmV0dXJuIG1fY2FjaGVQb2xpY3k7IH0KLQot
ICAgICAgICB2b2lkIHNldFJlcXVlc3QoUmVxdWVzdCAqX3JlcXVlc3QpOwotCi0gICAgICAgIE5T
VVJMUmVzcG9uc2UgKnJlc3BvbnNlKCkgY29uc3QgeyByZXR1cm4gbV9yZXNwb25zZTsgfQotICAg
ICAgICB2b2lkIHNldFJlc3BvbnNlKE5TVVJMUmVzcG9uc2UgKnJlc3BvbnNlKTsKLSAgICAgICAg
TlNEYXRhICphbGxEYXRhKCkgY29uc3QgeyByZXR1cm4gbV9hbGxEYXRhOyB9Ci0gICAgICAgIHZv
aWQgc2V0QWxsRGF0YSAoTlNEYXRhICpkYXRhKTsKLQotICAgICAgICBib29sIGNhbkRlbGV0ZSgp
IGNvbnN0IHsgcmV0dXJuIChtX2NsaWVudHMuY291bnQoKSA9PSAwICYmICFtX3JlcXVlc3QpOyB9
Ci0KLQl2b2lkIHNldEV4cGlyZURhdGUodGltZV90IF9leHBpcmVEYXRlLCBib29sIGNoYW5nZUh0
dHBDYWNoZSk7Ci0JCi0JYm9vbCBpc0V4cGlyZWQoKSBjb25zdDsKLQotICAgICAgICB2aXJ0dWFs
IGJvb2wgc2NoZWR1bGUoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotCi0gICAgICAgIC8qKgot
ICAgICAgICAgKiBMaXN0IG9mIGFjY2VwdGFibGUgbWltZXR5cGVzIHNlcGVyYXRlZCBieSAiLCIu
IEEgbWltZXR5cGUgbWF5IGNvbnRhaW4gYSB3aWxkY2FyZC4KLSAgICAgICAgICovCi0gICAgICAg
IC8vIGUuZy4gInRleHQvKiIKLSAgICAgICAgUVN0cmluZyBhY2NlcHQoKSBjb25zdCB7IHJldHVy
biBtX2FjY2VwdDsgfQotICAgICAgICB2b2lkIHNldEFjY2VwdChjb25zdCBRU3RyaW5nICZfYWNj
ZXB0KSB7IG1fYWNjZXB0ID0gX2FjY2VwdDsgfQotCi0gICAgcHJvdGVjdGVkOgotICAgICAgICB2
b2lkIHNldFNpemUoaW50IHNpemUpOwotICAgICAgICAKLSAgICAgICAgUVB0ckRpY3Q8Q2FjaGVk
T2JqZWN0Q2xpZW50PiBtX2NsaWVudHM7Ci0KLQlET006OkRPTVN0cmluZyBtX3VybDsKLSAgICAg
ICAgUVN0cmluZyBtX2FjY2VwdDsKLSAgICAgICAgUmVxdWVzdCAqbV9yZXF1ZXN0OwotICAgICAg
ICBOU1VSTFJlc3BvbnNlICptX3Jlc3BvbnNlOwotICAgICAgICBOU0RhdGEgKm1fYWxsRGF0YTsK
LQlUeXBlIG1fdHlwZTsKLQlTdGF0dXMgbV9zdGF0dXM7Ci0gICAgcHJpdmF0ZToKLQlpbnQgbV9z
aXplOwotICAgIGludCBtX2FjY2Vzc0NvdW50OwotICAgIAotICAgIHByb3RlY3RlZDoKLQl0aW1l
X3QgbV9leHBpcmVEYXRlOwotCUtJTzo6Q2FjaGVDb250cm9sIG1fY2FjaGVQb2xpY3k7Ci0gICAg
ICAgIGJvb2wgbV9mcmVlIDogMTsKLSAgICAgICAgYm9vbCBtX2RlbGV0ZWQgOiAxOwotICAgICAg
ICBib29sIG1fbG9hZGluZyA6IDE7Ci0gICAgICAgIGJvb2wgbV9leHBpcmVEYXRlQ2hhbmdlZCA6
IDE7Ci0gICAgCi0gICAgcHJpdmF0ZToKLSAgICAgICAgYm9vbCBhbGxvd0luTFJVTGlzdCgpIHsg
cmV0dXJuIGNhbkRlbGV0ZSgpICYmIHN0YXR1cygpICE9IFBlcnNpc3RlbnQ7IH0KLSAgICAgICAg
Ci0gICAgICAgIENhY2hlZE9iamVjdCAqbV9uZXh0SW5MUlVMaXN0OwotICAgICAgICBDYWNoZWRP
YmplY3QgKm1fcHJldkluTFJVTGlzdDsKLSAgICAgICAgZnJpZW5kIGNsYXNzIENhY2hlOwotICAg
IH07Ci0KLQotICAgIC8qKgotICAgICAqIGEgY2FjaGVkIHN0eWxlIHNoZWV0Ci0gICAgICovCi0g
ICAgY2xhc3MgQ2FjaGVkQ1NTU3R5bGVTaGVldCA6IHB1YmxpYyBDYWNoZWRPYmplY3QKLSAgICB7
Ci0gICAgcHVibGljOgotCUNhY2hlZENTU1N0eWxlU2hlZXQoRG9jTG9hZGVyKiBkbCwgY29uc3Qg
RE9NOjpET01TdHJpbmcgJnVybCwgS0lPOjpDYWNoZUNvbnRyb2wgY2FjaGVQb2xpY3ksIHRpbWVf
dCBfZXhwaXJlRGF0ZSwgY29uc3QgUVN0cmluZyYgY2hhcnNldCk7Ci0JQ2FjaGVkQ1NTU3R5bGVT
aGVldChjb25zdCBET006OkRPTVN0cmluZyAmdXJsLCBjb25zdCBRU3RyaW5nICZzdHlsZXNoZWV0
X2RhdGEpOwotCXZpcnR1YWwgfkNhY2hlZENTU1N0eWxlU2hlZXQoKTsKLQotCWNvbnN0IERPTTo6
RE9NU3RyaW5nICZzaGVldCgpIGNvbnN0IHsgcmV0dXJuIG1fc2hlZXQ7IH0KLQotCXZpcnR1YWwg
dm9pZCByZWYoQ2FjaGVkT2JqZWN0Q2xpZW50ICpjb25zdW1lcik7Ci0JdmlydHVhbCB2b2lkIGRl
cmVmKENhY2hlZE9iamVjdENsaWVudCAqY29uc3VtZXIpOwotCi0gICAgICAgIHZpcnR1YWwgdm9p
ZCBzZXRDaGFyc2V0KCBjb25zdCBRU3RyaW5nICZjaHMgKTsKLSAgICAgICAgdmlydHVhbCB2b2lk
IGRhdGEoIFFCdWZmZXIgJmJ1ZmZlciwgYm9vbCBlb2YgKTsKLQl2aXJ0dWFsIHZvaWQgZXJyb3Io
IGludCBlcnIsIGNvbnN0IGNoYXIgKnRleHQgKTsKLQotICAgICAgICB2aXJ0dWFsIGJvb2wgc2No
ZWR1bGUoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0KLQl2b2lkIGNoZWNrTm90aWZ5KCk7Ci0K
LSAgICBwcm90ZWN0ZWQ6Ci0JRE9NOjpET01TdHJpbmcgbV9zaGVldDsKLSAgICAgICAgUVRleHRD
b2RlYyogbV9jb2RlYzsKLSAgICB9OwotCi0gICAgLyoqCi0gICAgICogYSBjYWNoZWQgc2NyaXB0
Ci0gICAgICovCi0gICAgY2xhc3MgQ2FjaGVkU2NyaXB0IDogcHVibGljIENhY2hlZE9iamVjdAot
ICAgIHsKLSAgICBwdWJsaWM6Ci0JQ2FjaGVkU2NyaXB0KERvY0xvYWRlciogZGwsIGNvbnN0IERP
TTo6RE9NU3RyaW5nICZ1cmwsIEtJTzo6Q2FjaGVDb250cm9sIGNhY2hlUG9saWN5LCB0aW1lX3Qg
X2V4cGlyZURhdGUsIGNvbnN0IFFTdHJpbmcmIGNoYXJzZXQpOwotCUNhY2hlZFNjcmlwdChjb25z
dCBET006OkRPTVN0cmluZyAmdXJsLCBjb25zdCBRU3RyaW5nICZzY3JpcHRfZGF0YSk7Ci0Jdmly
dHVhbCB+Q2FjaGVkU2NyaXB0KCk7Ci0KLQljb25zdCBET006OkRPTVN0cmluZyAmc2NyaXB0KCkg
Y29uc3QgeyByZXR1cm4gbV9zY3JpcHQ7IH0KLQotCXZpcnR1YWwgdm9pZCByZWYoQ2FjaGVkT2Jq
ZWN0Q2xpZW50ICpjb25zdW1lcik7Ci0JdmlydHVhbCB2b2lkIGRlcmVmKENhY2hlZE9iamVjdENs
aWVudCAqY29uc3VtZXIpOwotCi0gICAgICAgIHZpcnR1YWwgdm9pZCBzZXRDaGFyc2V0KCBjb25z
dCBRU3RyaW5nICZjaHMgKTsKLQl2aXJ0dWFsIHZvaWQgZGF0YSggUUJ1ZmZlciAmYnVmZmVyLCBi
b29sIGVvZiApOwotCXZpcnR1YWwgdm9pZCBlcnJvciggaW50IGVyciwgY29uc3QgY2hhciAqdGV4
dCApOwotCi0gICAgICAgIHZpcnR1YWwgYm9vbCBzY2hlZHVsZSgpIGNvbnN0IHsgcmV0dXJuIGZh
bHNlOyB9Ci0gICAgICAgIAotICAgICAgICBib29sIGVycm9yT2NjdXJyZWQoKSBjb25zdCB7IHJl
dHVybiBtX2Vycm9yT2NjdXJyZWQ7IH0KLQotCXZvaWQgY2hlY2tOb3RpZnkoKTsKLQotICAgIHBy
b3RlY3RlZDoKLQlET006OkRPTVN0cmluZyBtX3NjcmlwdDsKLSAgICAgICAgUVRleHRDb2RlYyog
bV9jb2RlYzsKLSAgICAgICAgYm9vbCBtX2Vycm9yT2NjdXJyZWQ7Ci0gICAgfTsKLQotICAgIGNs
YXNzIEltYWdlU291cmNlOwotCisgICAgY2xhc3MgQ2FjaGVkU2NyaXB0OwogICAgIGNsYXNzIENh
Y2hlZEltYWdlOwotICAgIAotICAgIGNsYXNzIENhY2hlZEltYWdlQ2FsbGJhY2sKLSAgICB7Ci0g
ICAgcHVibGljOgotICAgICAgICBDYWNoZWRJbWFnZUNhbGxiYWNrIChDYWNoZWRJbWFnZSAqYykg
OiBjYWNoZWRJbWFnZShjKSwgcmVmQ291bnQoMSksIGhlYWRlclJlY2VpdmVkKGZhbHNlKSB7fTsK
LQotICAgICAgICB2b2lkIHJlZigpIHsgcmVmQ291bnQrKzsgfQotICAgICAgICB2b2lkIGRlcmVm
KCkgeyBpZiAoLS1yZWZDb3VudCA9PSAwKSBkZWxldGUgdGhpczsgfQotICAgICAgICAKLSAgICAg
ICAgdm9pZCBub3RpZnlVcGRhdGUoKTsKLSAgICAgICAgdm9pZCBub3RpZnlGaW5pc2hlZCgpOwot
ICAgICAgICB2b2lkIG5vdGlmeURlY29kaW5nRXJyb3IoKTsKLSAgICAgICAgdm9pZCBjbGVhcigp
OwotICAgICAgICB2b2lkIGhhbmRsZUVycm9yKCk7Ci0gICAgICAgIAotICAgIHByaXZhdGU6Ci0g
ICAgICAgIENhY2hlZEltYWdlICpjYWNoZWRJbWFnZTsKLSAgICAgICAgdWludCByZWZDb3VudDsK
LQlib29sIGhlYWRlclJlY2VpdmVkOwotICAgIH07Ci0gICAgICAgIAotICAgIC8qKgotICAgICAq
IGEgY2FjaGVkIGltYWdlCi0gICAgICovCi0gICAgY2xhc3MgQ2FjaGVkSW1hZ2UgOiBwdWJsaWMg
UU9iamVjdCwgcHVibGljIENhY2hlZE9iamVjdAotICAgIHsKLQlRX09CSkVDVAotICAgIHB1Ymxp
YzoKLQlDYWNoZWRJbWFnZShEb2NMb2FkZXIqIGRsLCBjb25zdCBET006OkRPTVN0cmluZyAmdXJs
LCBLSU86OkNhY2hlQ29udHJvbCBjYWNoZVBvbGljeSwgdGltZV90IF9leHBpcmVEYXRlKTsKLQl2
aXJ0dWFsIH5DYWNoZWRJbWFnZSgpOwotCi0JY29uc3QgUVBpeG1hcCAmcGl4bWFwKCkgY29uc3Q7
Ci0JY29uc3QgUVBpeG1hcCAmdGlsZWRfcGl4bWFwKGNvbnN0IFFDb2xvciYgYmcpOwotCi0gICAg
ICAgIFFTaXplIHBpeG1hcF9zaXplKCkgY29uc3Q7ICAgIC8vIHJldHVybnMgdGhlIHNpemUgb2Yg
dGhlIGNvbXBsZXRlIChpLmUuIHdoZW4gZmluaXNoZWQpIGxvYWRpbmcKLSAgICAgICAgUVJlY3Qg
dmFsaWRfcmVjdCgpIGNvbnN0OyAgICAgLy8gcmV0dXJucyB0aGUgcmVjdGFuZ2xlIG9mIHBpeG1h
cCB0aGF0IGhhcyBiZWVuIGxvYWRlZCBhbHJlYWR5Ci0KLSAgICAgICAgdm9pZCByZWYoQ2FjaGVk
T2JqZWN0Q2xpZW50ICpjb25zdW1lcik7Ci0JdmlydHVhbCB2b2lkIGRlcmVmKENhY2hlZE9iamVj
dENsaWVudCAqY29uc3VtZXIpOwotCi0JdmlydHVhbCB2b2lkIGRhdGEoIFFCdWZmZXIgJmJ1ZmZl
ciwgYm9vbCBlb2YgKTsKLQl2aXJ0dWFsIHZvaWQgZXJyb3IoIGludCBlcnIsIGNvbnN0IGNoYXIg
KnRleHQgKTsKLQotICAgICAgICBib29sIGlzVHJhbnNwYXJlbnQoKSBjb25zdCB7IHJldHVybiBp
c0Z1bGx5VHJhbnNwYXJlbnQ7IH0KLSAgICAgICAgYm9vbCBpc0Vycm9ySW1hZ2UoKSBjb25zdCB7
IHJldHVybiBlcnJvck9jY3VyZWQ7IH0KLQotICAgICAgICB2b2lkIHNldFNob3dBbmltYXRpb25z
KCBLSFRNTFNldHRpbmdzOjpLQW5pbWF0aW9uQWR2aWNlICk7Ci0KLSAgICAgICAgdmlydHVhbCBi
b29sIHNjaGVkdWxlKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotCi0Jdm9pZCBjaGVja05vdGlm
eSgpOwotICAgICAgICAKLSAgICAgICAgdmlydHVhbCBib29sIGlzSW1hZ2UoKSBjb25zdCB7IHJl
dHVybiB0cnVlOyB9Ci0KLQl2b2lkIGNsZWFyKCk7Ci0gICAgICAgIAotICAgIHByaXZhdGU6Ci0g
ICAgICAgIHZvaWQgZG9fbm90aWZ5KGNvbnN0IFFQaXhtYXAmIHAsIGNvbnN0IFFSZWN0JiByKTsK
LQotICAgICAgICBRUGl4bWFwKiBwOwotCVFQaXhtYXAqIGJnOwotICAgICAgICBRUmdiIGJnQ29s
b3I7Ci0gICAgICAgIG11dGFibGUgUVBpeG1hcCogcGl4UGFydDsKLQotICAgICAgICBJbWFnZVNv
dXJjZSogaW1nU291cmNlOwotICAgICAgICBjb25zdCBjaGFyKiBmb3JtYXRUeXBlOyAgLy8gSXMg
dGhlIG5hbWUgb2YgdGhlIG1vdmllIGZvcm1hdCB0eXBlCi0KLQlpbnQgd2lkdGg7Ci0JaW50IGhl
aWdodDsKLQotCS8vIElzIHNldCBpZiBtb3ZpZSBmb3JtYXQgdHlwZSAoIGluY3JlbWVudGFsL2Fu
aW1hdGlvbikgd2FzIGNoZWNrZWQKLQlib29sIHR5cGVDaGVja2VkIDogMTsKLSAgICAgICAgYm9v
bCBpc0Z1bGx5VHJhbnNwYXJlbnQgOiAxOwotICAgICAgICBib29sIGVycm9yT2NjdXJlZCA6IDE7
Ci0gICAgICAgIGJvb2wgbW9ub2Nocm9tZSA6IDE7Ci0gICAgICAgIEtIVE1MU2V0dGluZ3M6OktB
bmltYXRpb25BZHZpY2UgbV9zaG93QW5pbWF0aW9ucyA6IDI7Ci0KLSAgICAgICAgZnJpZW5kIGNs
YXNzIENhY2hlOwotCi0gICAgcHVibGljOgotICAgICAgICBpbnQgZGF0YVNpemUoKSBjb25zdCB7
IHJldHVybiBtX2RhdGFTaXplOyB9Ci0JQ2FjaGVkSW1hZ2VDYWxsYmFjayAqZGVjb2RlckNhbGxi
YWNrKCkgY29uc3QgeyByZXR1cm4gbV9kZWNvZGVyQ2FsbGJhY2s7IH0KLSAgICBwcml2YXRlOgot
ICAgICAgICBmcmllbmQgY2xhc3MgQ2FjaGVkSW1hZ2VDYWxsYmFjazsKLSAgICAgICAgCi0gICAg
ICAgIGludCBtX2RhdGFTaXplOwotICAgICAgICBDYWNoZWRJbWFnZUNhbGxiYWNrICptX2RlY29k
ZXJDYWxsYmFjazsKLSAgICB9OwotCi0jaWZkZWYgS0hUTUxfWFNMVAotICAgIGNsYXNzIENhY2hl
ZFhTTFN0eWxlU2hlZXQgOiBwdWJsaWMgQ2FjaGVkT2JqZWN0Ci0gICAgewotcHVibGljOgotICAg
ICAgICBDYWNoZWRYU0xTdHlsZVNoZWV0KERvY0xvYWRlciogZGwsIGNvbnN0IERPTTo6RE9NU3Ry
aW5nICZ1cmwsIEtJTzo6Q2FjaGVDb250cm9sIGNhY2hlUG9saWN5LCB0aW1lX3QgX2V4cGlyZURh
dGUpOwotCi0gICAgICAgIGNvbnN0IERPTTo6RE9NU3RyaW5nJiBzaGVldCgpIGNvbnN0IHsgcmV0
dXJuIG1fc2hlZXQ7IH0KLSAgICAgICAgCi0gICAgICAgIHZpcnR1YWwgdm9pZCByZWYoQ2FjaGVk
T2JqZWN0Q2xpZW50ICpjb25zdW1lcik7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBkZXJlZihDYWNo
ZWRPYmplY3RDbGllbnQgKmNvbnN1bWVyKTsKLSAgICAgICAgCi0gICAgICAgIHZpcnR1YWwgdm9p
ZCBzZXRDaGFyc2V0KGNvbnN0IFFTdHJpbmcgJmNocyk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBk
YXRhKFFCdWZmZXIgJmJ1ZmZlciwgYm9vbCBlb2YpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgZXJy
b3IoaW50IGVyciwgY29uc3QgY2hhciAqdGV4dCk7Ci0gICAgICAgIAotICAgICAgICB2aXJ0dWFs
IGJvb2wgc2NoZWR1bGUoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0gICAgICAgIAotICAgICAg
ICB2b2lkIGNoZWNrTm90aWZ5KCk7Ci0gICAgICAgIAotcHJvdGVjdGVkOgotICAgICAgICBET006
OkRPTVN0cmluZyBtX3NoZWV0OwotICAgICAgICBSZWZQdHI8RGVjb2Rlcj4gbV9kZWNvZGVyOwot
ICAgIH07Ci0jZW5kaWYKLSAgICAKLSNpZm5kZWYgS0hUTUxfTk9fWEJMCi0gICAgY2xhc3MgQ2Fj
aGVkWEJMRG9jdW1lbnQgOiBwdWJsaWMgQ2FjaGVkT2JqZWN0Ci0gICAgewotICAgIHB1YmxpYzoK
LSAgICAgICAgQ2FjaGVkWEJMRG9jdW1lbnQoRG9jTG9hZGVyKiBkbCwgY29uc3QgRE9NOjpET01T
dHJpbmcgJnVybCwgS0lPOjpDYWNoZUNvbnRyb2wgY2FjaGVQb2xpY3ksIHRpbWVfdCBfZXhwaXJl
RGF0ZSk7Ci0gICAgICAgIHZpcnR1YWwgfkNhY2hlZFhCTERvY3VtZW50KCk7Ci0gICAgICAgIAot
ICAgICAgICBYQkw6OlhCTERvY3VtZW50SW1wbCogZG9jdW1lbnQoKSBjb25zdCB7IHJldHVybiBt
X2RvY3VtZW50OyB9Ci0gICAgICAgIAotICAgICAgICB2aXJ0dWFsIHZvaWQgcmVmKENhY2hlZE9i
amVjdENsaWVudCAqY29uc3VtZXIpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgZGVyZWYoQ2FjaGVk
T2JqZWN0Q2xpZW50ICpjb25zdW1lcik7Ci0gICAgICAgIAotICAgICAgICB2aXJ0dWFsIHZvaWQg
c2V0Q2hhcnNldCggY29uc3QgUVN0cmluZyAmY2hzICk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBk
YXRhKCBRQnVmZmVyICZidWZmZXIsIGJvb2wgZW9mICk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBl
cnJvciggaW50IGVyciwgY29uc3QgY2hhciAqdGV4dCApOwotICAgICAgICAKLSAgICAgICAgdmly
dHVhbCBib29sIHNjaGVkdWxlKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotICAgICAgICAKLSAg
ICAgICAgdm9pZCBjaGVja05vdGlmeSgpOwotICAgICAgICAKLXByb3RlY3RlZDoKLSAgICAgICAg
WEJMOjpYQkxEb2N1bWVudEltcGwqIG1fZG9jdW1lbnQ7Ci0gICAgICAgIFJlZlB0cjxEZWNvZGVy
PiBtX2RlY29kZXI7Ci0gICAgfTsKLSNlbmRpZgorICAgIGNsYXNzIENhY2hlZENTU1N0eWxlU2hl
ZXQ7CisgICAgY2xhc3MgQ2FjaGVkWFNMU3R5bGVTaGVldDsKIAogICAgIC8qKgotICAgICAqIEBp
bnRlcm5hbAotICAgICAqCiAgICAgICogTWFuYWdlcyB0aGUgbG9hZGluZyBvZiBzY3JpcHRzL2lt
YWdlcy9zdHlsZXNoZWV0cyBmb3IgYSBwYXJ0aWN1bGFyIGRvY3VtZW50CiAgICAgICovCiAgICAg
Y2xhc3MgRG9jTG9hZGVyCkBAIC01MDIsMjEyICsxMDYsNiBAQCBwcm90ZWN0ZWQ6CiAgICAgICAg
IGJvb2wgbV9sb2FkSW5Qcm9ncmVzczsKICAgICB9OwogCi0gICAgLyoqCi0gICAgICogQGludGVy
bmFsCi0gICAgICovCi0gICAgY2xhc3MgUmVxdWVzdAotICAgIHsKLSAgICBwdWJsaWM6Ci0JUmVx
dWVzdChEb2NMb2FkZXIqIGRsLCBDYWNoZWRPYmplY3QgKl9vYmplY3QsIGJvb2wgX2luY3JlbWVu
dGFsKTsKLQl+UmVxdWVzdCgpOwotCWJvb2wgaW5jcmVtZW50YWw7Ci0JUUJ1ZmZlciBtX2J1ZmZl
cjsKLQlDYWNoZWRPYmplY3QgKm9iamVjdDsKLSAgICAgICAgRG9jTG9hZGVyKiBtX2RvY0xvYWRl
cjsKLSAgICAgICAgYm9vbCBtdWx0aXBhcnQ7Ci0gICAgIH07Ci0KLSAgICAvKioKLSAgICAgKiBA
aW50ZXJuYWwKLSAgICAgKi8KLSAgICBjbGFzcyBMb2FkZXIgOiBwdWJsaWMgUU9iamVjdAotICAg
IHsKLQlRX09CSkVDVAotCi0gICAgcHVibGljOgkKLQlMb2FkZXIoKTsKLQl+TG9hZGVyKCk7Ci0K
LQl2b2lkIGxvYWQoRG9jTG9hZGVyKiBkbCwgQ2FjaGVkT2JqZWN0ICpvYmplY3QsIGJvb2wgaW5j
cmVtZW50YWwgPSB0cnVlKTsKLQotICAgICAgICBpbnQgbnVtUmVxdWVzdHMoIERvY0xvYWRlciog
ZGwgKSBjb25zdDsKLSAgICAgICAgdm9pZCBjYW5jZWxSZXF1ZXN0cyggRG9jTG9hZGVyKiBkbCAp
OwotCi0Jdm9pZCByZW1vdmVCYWNrZ3JvdW5kRGVjb2RpbmdSZXF1ZXN0IChSZXF1ZXN0ICpyKTsK
LQkKLSAgICAgICAgLy8gbWF5IHJldHVybiAwTAotICAgICAgICBLSU86OkpvYiAqam9iRm9yUmVx
dWVzdCggY29uc3QgRE9NOjpET01TdHJpbmcgJnVybCApIGNvbnN0OwotCi0gICAgICAgIEtXUUxv
YWRlciAqa3dxOwotCi0gICAgc2lnbmFsczoKLQlmcmllbmQgY2xhc3MgQ2FjaGVkSW1hZ2VDYWxs
YmFjazsKLQotICAgICAgICB2b2lkIHJlcXVlc3RTdGFydGVkKCBraHRtbDo6RG9jTG9hZGVyKiBk
bCwga2h0bWw6OkNhY2hlZE9iamVjdCogb2JqICk7Ci0Jdm9pZCByZXF1ZXN0RG9uZSgga2h0bWw6
OkRvY0xvYWRlciogZGwsIGtodG1sOjpDYWNoZWRPYmplY3QgKm9iaiApOwotCXZvaWQgcmVxdWVz
dEZhaWxlZCgga2h0bWw6OkRvY0xvYWRlciogZGwsIGtodG1sOjpDYWNoZWRPYmplY3QgKm9iaiAp
OwotCi0gICAgcHJvdGVjdGVkIHNsb3RzOgotICAgICAgICB2b2lkIHNsb3RGaW5pc2hlZCggS0lP
OjpKb2IgKiAsIE5TRGF0YSAqYWxsRGF0YSk7Ci0Jdm9pZCBzbG90RGF0YSggS0lPOjpKb2IgKiwg
Y29uc3QgY2hhciAqZGF0YSwgaW50IHNpemUgKTsKLSAgICAgICAgdm9pZCBzbG90UmVjZWl2ZWRS
ZXNwb25zZSAoIEtJTzo6Sm9iICosIE5TVVJMUmVzcG9uc2UgKnJlc3BvbnNlICk7Ci0KLSAgICBw
cml2YXRlOgotCXZvaWQgc2VydmVQZW5kaW5nUmVxdWVzdHMoKTsKLQotICAgICAgICB2aXJ0dWFs
IGJvb2wgaXNLSFRNTExvYWRlcigpIGNvbnN0OwotCi0JUVB0ckxpc3Q8UmVxdWVzdD4gbV9yZXF1
ZXN0c1BlbmRpbmc7Ci0JUVB0ckRpY3Q8UmVxdWVzdD4gbV9yZXF1ZXN0c0xvYWRpbmc7Ci0KLQlR
UHRyTGlzdDxSZXF1ZXN0PiBtX3JlcXVlc3RzQmFja2dyb3VuZERlY29kaW5nOwotCi0jaWZkZWYg
SEFWRV9MSUJKUEVHCi0gICAgICAgIEtKUEVHRm9ybWF0VHlwZSBtX2pwZWdsb2FkZXI7Ci0jZW5k
aWYKLSAgICB9OwotCi0gICAgICAgIC8qKgotICAgICAqIEBpbnRlcm5hbAotICAgICAqCi0gICAg
ICogUHJvdmlkZXMgYSBjYWNoZS9sb2FkZXIgZm9yIG9iamVjdHMgbmVlZGVkIGZvciBkaXNwbGF5
aW5nIHRoZSBodG1sIHBhZ2UuCi0gICAgICogQXQgdGhlIG1vbWVudCB0aGVzZSBhcmUgc3R5bGVz
aGVldHMsIHNjcmlwdHMgYW5kIGltYWdlcwotICAgICAqLwotICAgIGNsYXNzIENhY2hlCi0gICAg
ewotCWZyaWVuZCBjbGFzcyBEb2NMb2FkZXI7Ci0gICAgcHVibGljOgotCS8qKgotCSAqIGluaXQg
dGhlIGNhY2hlIGluIGNhc2UgaXQncyBub3QgYWxyZWFkeS4gVGhpcyBuZWVkcyB0byBnZXQgY2Fs
bGVkIG9uY2UKLQkgKiBiZWZvcmUgdXNpbmcgaXQuCi0JICovCi0Jc3RhdGljIHZvaWQgaW5pdCgp
OwotICAgICAgICAKLQkvKioKLQkgKiBBc2sgdGhlIGNhY2hlIGZvciBzb21lIHVybC4gV2lsbCBy
ZXR1cm4gYSBjYWNoZWRPYmplY3QsIGFuZAotCSAqIGxvYWQgdGhlIHJlcXVlc3RlZCBkYXRhIGlu
IGNhc2UgaXQncyBub3QgY2FoY2VkCi0gICAgICAgICAqIGlmIHRoZSBEb2NMb2FkZXIgaXMgemVy
bywgdGhlIHVybCBtdXN0IGJlIGZ1bGwtcXVhbGlmaWVkLgotICAgICAgICAgKiBPdGhlcndpc2Us
IGl0IGlzIGF1dG9tYXRpY2FsbHkgYmFzZS11cmwgZXhwYW5kZWQKLQkgKi8KLQlzdGF0aWMgQ2Fj
aGVkSW1hZ2UgKnJlcXVlc3RJbWFnZSggRG9jTG9hZGVyKiBsLCBjb25zdCBET006OkRPTVN0cmlu
ZyAmdXJsLCBib29sIHJlbG9hZD1mYWxzZSwgdGltZV90IF9leHBpcmVEYXRlPTApOwotICAgICAg
ICBzdGF0aWMgQ2FjaGVkSW1hZ2UgKnJlcXVlc3RJbWFnZSggRG9jTG9hZGVyKiBsLCBjb25zdCBL
VVJMICZ1cmwsIGJvb2wgcmVsb2FkPWZhbHNlLCB0aW1lX3QgX2V4cGlyZURhdGU9MCk7Ci0KLQkv
KioKLQkgKiBBc2sgdGhlIGNhY2hlIGZvciBzb21lIHVybC4gV2lsbCByZXR1cm4gYSBjYWNoZWRP
YmplY3QsIGFuZAotCSAqIGxvYWQgdGhlIHJlcXVlc3RlZCBkYXRhIGluIGNhc2UgaXQncyBub3Qg
Y2FjaGVkCi0JICovCi0Jc3RhdGljIENhY2hlZENTU1N0eWxlU2hlZXQgKnJlcXVlc3RTdHlsZVNo
ZWV0KCBEb2NMb2FkZXIqIGwsIGNvbnN0IERPTTo6RE9NU3RyaW5nICZ1cmwsIGJvb2wgcmVsb2Fk
PWZhbHNlLCB0aW1lX3QgX2V4cGlyZURhdGU9MCwgY29uc3QgUVN0cmluZyYgY2hhcnNldCA9IFFT
dHJpbmc6Om51bGwpOwotCi0jaWZkZWYgS0hUTUxfWFNMVAotICAgICAgICAvLyBBc2sgdGhlIGNh
Y2hlIGZvciBhbiBYU0wgc3R5bGVzaGVldC4KLSAgICAgICAgc3RhdGljIENhY2hlZFhTTFN0eWxl
U2hlZXQqIHJlcXVlc3RYU0xTdHlsZVNoZWV0KERvY0xvYWRlciogbCwgY29uc3QgRE9NOjpET01T
dHJpbmcgJnVybCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBib29sIHJlbG9hZD1mYWxzZSwgdGltZV90IF9leHBpcmVEYXRlPTApOwot
I2VuZGlmCi0jaWZuZGVmIEtIVE1MX05PX1hCTAotICAgICAgICAvLyBBc2sgdGhlIGNhY2hlIGZv
ciBhbiBYQkwgZG9jdW1lbnQuCi0gICAgICAgIHN0YXRpYyBDYWNoZWRYQkxEb2N1bWVudCogcmVx
dWVzdFhCTERvY3VtZW50KERvY0xvYWRlciogbCwgY29uc3QgRE9NOjpET01TdHJpbmcgJnVybCwg
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJv
b2wgcmVsb2FkPWZhbHNlLCB0aW1lX3QgX2V4cGlyZURhdGU9MCk7Ci0jZW5kaWYKLQotICAgICAg
ICAvKioKLSAgICAgICAgICogUHJlLWxvYWRzIGEgc3R5bGVzaGVldCBpbnRvIHRoZSBjYWNoZS4K
LSAgICAgICAgICovCi0gICAgICAgIHN0YXRpYyB2b2lkIHByZWxvYWRTdHlsZVNoZWV0KGNvbnN0
IFFTdHJpbmcgJnVybCwgY29uc3QgUVN0cmluZyAmc3R5bGVzaGVldF9kYXRhKTsKLQotCS8qKgot
CSAqIEFzayB0aGUgY2FjaGUgZm9yIHNvbWUgdXJsLiBXaWxsIHJldHVybiBhIGNhY2hlZE9iamVj
dCwgYW5kCi0JICogbG9hZCB0aGUgcmVxdWVzdGVkIGRhdGEgaW4gY2FzZSBpdCdzIG5vdCBjYWhj
ZWQKLQkgKi8KLQlzdGF0aWMgQ2FjaGVkU2NyaXB0ICpyZXF1ZXN0U2NyaXB0KCBEb2NMb2FkZXIq
IGwsIGNvbnN0IERPTTo6RE9NU3RyaW5nICZ1cmwsIGJvb2wgcmVsb2FkPWZhbHNlLCB0aW1lX3Qg
X2V4cGlyZURhdGU9MCwgY29uc3QgUVN0cmluZyYgY2hhcnNldD1RU3RyaW5nOjpudWxsKTsKLQot
ICAgICAgICAvKioKLSAgICAgICAgICogUHJlLWxvYWRzIGEgc2NyaXB0IGludG8gdGhlIGNhY2hl
LgotICAgICAgICAgKi8KLSAgICAgICAgc3RhdGljIHZvaWQgcHJlbG9hZFNjcmlwdChjb25zdCBR
U3RyaW5nICZ1cmwsIGNvbnN0IFFTdHJpbmcgJnNjcmlwdF9kYXRhKTsKLQotCS8qKgotCSAqIHNl
dHMgdGhlIHNpemUgb2YgdGhlIGNhY2hlLiBUaGlzIHdpbGwgb25seSBob2QgYXBwcm94aW1hdGVs
eSwgc2luY2UgdGhlIHNpemUgc29tZQotCSAqIGNhY2hlZCBvYmplY3RzIChsaWtlIHN0eWxlc2hl
ZXRzKSB0YWtlIHVwIGluIG1lbW9yeSBpcyBub3QgZXhhY2x0eSBrbm93bi4KLQkgKi8KLQlzdGF0
aWMgdm9pZCBzZXRTaXplKCBpbnQgYnl0ZXMgKTsKLQkvKioKLQkgKiByZXR1cm5zIHRoZSBzaXpl
IG9mIHRoZSBjYWNoZQotCSAqLwotCXN0YXRpYyBpbnQgc2l6ZSgpIHsgcmV0dXJuIG1heFNpemU7
IH07Ci0KLSAgICAgICAgc3RhdGljIGludCBtYXhDYWNoZWFibGVPYmplY3RTaXplKCkgeyByZXR1
cm4gbWF4Q2FjaGVhYmxlOyB9Ci0KLQkvKioKLQkgKiBjbGVhbiB1cCBjYWNoZQotCSAqLwotCXN0
YXRpYyB2b2lkIGZsdXNoKGJvb2wgZm9yY2U9ZmFsc2UpOwotCi0JLyoqCi0JICogY2xlYXJzIHRo
ZSBjYWNoZQotCSAqIFdhcm5pbmc6IGNhbGwgdGhpcyBvbmx5IGF0IHRoZSBlbmQgb2YgeW91ciBw
cm9ncmFtLCB0byBjbGVhbgotCSAqIHVwIG1lbW9yeSAodXNlZnVsIGZvciBmaW5kaW5nIG1lbW9y
eSBob2xlcykKLQkgKi8KLQlzdGF0aWMgdm9pZCBjbGVhcigpOwotCi0Jc3RhdGljIExvYWRlciAq
bG9hZGVyKCkgeyByZXR1cm4gbV9sb2FkZXI7IH0KLQotICAgIAlzdGF0aWMgUVBpeG1hcCAqbnVs
bFBpeG1hcDsKLSAgICAgICAgc3RhdGljIFFQaXhtYXAgKmJyb2tlblBpeG1hcDsKLQotICAgICAg
ICBzdGF0aWMgdm9pZCByZW1vdmVDYWNoZUVudHJ5KCBDYWNoZWRPYmplY3QgKm9iamVjdCApOwot
Ci0gICAgICAgIHN0cnVjdCBUeXBlU3RhdGlzdGljIHsKLSAgICAgICAgICAgIGludCBjb3VudDsK
LSAgICAgICAgICAgIGludCBzaXplOwotICAgICAgICAgICAgVHlwZVN0YXRpc3RpYygpIDogY291
bnQoMCksIHNpemUoMCkgeyB9Ci0gICAgICAgIH07Ci0gICAgICAgIAotICAgICAgICBzdHJ1Y3Qg
U3RhdGlzdGljcyB7Ci0gICAgICAgICAgICBUeXBlU3RhdGlzdGljIGltYWdlczsKLSAgICAgICAg
ICAgIFR5cGVTdGF0aXN0aWMgbW92aWVzOwotICAgICAgICAgICAgVHlwZVN0YXRpc3RpYyBzdHls
ZVNoZWV0czsKLSAgICAgICAgICAgIFR5cGVTdGF0aXN0aWMgc2NyaXB0czsKLSNpZmRlZiBLSFRN
TF9YU0xUCi0gICAgICAgICAgICBUeXBlU3RhdGlzdGljIHhzbFN0eWxlU2hlZXRzOwotI2VuZGlm
Ci0jaWZuZGVmIEtIVE1MX05PX1hCTAotICAgICAgICAgICAgVHlwZVN0YXRpc3RpYyB4YmxEb2Nz
OwotI2VuZGlmCi0gICAgICAgICAgICBUeXBlU3RhdGlzdGljIG90aGVyOwotICAgICAgICB9Owot
Ci0gICAgICAgIHN0YXRpYyBTdGF0aXN0aWNzIGdldFN0YXRpc3RpY3MoKTsKLSAgICAgICAgc3Rh
dGljIHZvaWQgZmx1c2hBbGwoKTsKLSAgICAgICAgc3RhdGljIHZvaWQgc2V0Q2FjaGVEaXNhYmxl
ZChib29sKTsKLQotICAgICAgICBzdGF0aWMgdm9pZCBpbnNlcnRJbkxSVUxpc3QoQ2FjaGVkT2Jq
ZWN0ICopOwotICAgICAgICBzdGF0aWMgdm9pZCByZW1vdmVGcm9tTFJVTGlzdChDYWNoZWRPYmpl
Y3QgKik7Ci0gICAgICAgIHN0YXRpYyBib29sIGFkanVzdFNpemUoQ2FjaGVkT2JqZWN0ICosIGlu
dCBzaXplRGVsdGEpOwotICAgICAgICAKLSAgICAgICAgc3RhdGljIExSVUxpc3QqIGdldExSVUxp
c3RGb3IoQ2FjaGVkT2JqZWN0KiBvKTsKLSAgICAgICAgCi0gICAgICAgIHN0YXRpYyB2b2lkIGNo
ZWNrTFJVQW5kVW5jYWNoZWFibGVMaXN0SW50ZWdyaXR5KCk7Ci0KLSAgICBwcm90ZWN0ZWQ6Ci0g
ICAgICAgIHN0YXRpYyBRRGljdDxDYWNoZWRPYmplY3Q+ICpjYWNoZTsKLSAgICAgICAgc3RhdGlj
IFFQdHJMaXN0PERvY0xvYWRlcj4qIGRvY2xvYWRlcjsKLSAgICAKLSAgICAgICAgc3RhdGljIGlu
dCBtYXhTaXplOwotICAgICAgICBzdGF0aWMgaW50IG1heENhY2hlYWJsZTsKLSAgICAgICAgc3Rh
dGljIGludCBmbHVzaENvdW50OwotICAgIAotICAgICAgICBzdGF0aWMgTG9hZGVyICptX2xvYWRl
cjsKLSAgICAKLSAgICAgICAgc3RhdGljIHZvaWQgbW92ZVRvSGVhZE9mTFJVTGlzdChDYWNoZWRP
YmplY3QgKik7Ci0gICAgCi0gICAgICAgIHN0YXRpYyBMUlVMaXN0ICptX0xSVUxpc3RzOwotICAg
ICAgICBzdGF0aWMgaW50IG1fdG90YWxTaXplT2ZMUlVMaXN0czsKLSAgICAgICAgICAgIAotICAg
ICAgICBzdGF0aWMgQ2FjaGVkT2JqZWN0ICptX2hlYWRPZlVuY2FjaGVhYmxlTGlzdDsKLSAgICAg
ICAgICAgIAotICAgICAgICBzdGF0aWMgaW50IG1fY291bnRPZkxSVUFuZFVuY2FjaGVhYmxlTGlz
dHM7Ci0gICAgfTsKLQogfTsKIAogI2VuZGlmCkluZGV4OiBtaXNjL0NhY2hlZE9iamVjdENsaWVu
dFdhbGtlci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gbWlzYy9DYWNoZWRPYmplY3RDbGllbnRXYWxrZXIu
Y3BwCShyZXZpc2lvbiAxMTk0OCkKKysrIG1pc2MvQ2FjaGVkT2JqZWN0Q2xpZW50V2Fsa2VyLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtMjUsMTc3NCArMjUsMTAgQEAKICAgICBwYWdlcyBmcm9tIHRo
ZSB3ZWIuIEl0IGhhcyBhIG1lbW9yeSBjYWNoZSBmb3IgdGhlc2Ugb2JqZWN0cy4KICovCiAKLSN1
bmRlZiBDQUNIRV9ERUJVRwotLy8jZGVmaW5lIENBQ0hFX0RFQlVHCiAjaW5jbHVkZSAiY29uZmln
LmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSAiQ2FjaGVkT2JqZWN0Q2xpZW50V2Fs
a2VyLmgiCiAKLSNpbmNsdWRlICJsb2FkZXIuaCIKLQotLy8gdXAgdG8gd2hpY2ggc2l6ZSBpcyBh
IHBpY3R1cmUgZm9yIHN1cmUgY2FjaGVhYmxlCi0jZGVmaW5lIE1BWENBQ0hFQUJMRSA0MCoxMDI0
Ci0vLyBkZWZhdWx0IGNhY2hlIHNpemUKLSNkZWZpbmUgREVGQ0FDSEVTSVpFIDQwOTYqMTAyNAot
Ci0jaW5jbHVkZSA8cWFzeW5jaW8uaD4KLSNpbmNsdWRlIDxxcGFpbnRlci5oPgotCi0jaW5jbHVk
ZSA8a2lvL2pvYi5oPgotI2luY2x1ZGUgPGtpby9qb2JjbGFzc2VzLmg+Ci0jaW5jbHVkZSA8a2lt
YWdlaW8uaD4KLSNpbmNsdWRlIDxrY2hhcnNldHMuaD4KLSNpbmNsdWRlIDxrZGVidWcuaD4KLSNp
bmNsdWRlICJraHRtbF9mYWN0b3J5LmgiCi0jaW5jbHVkZSAia2h0bWxfcGFydC5oIgotI2luY2x1
ZGUgImRlY29kZXIuaCIKLQotI2luY2x1ZGUgImh0bWwvaHRtbF9kb2N1bWVudGltcGwuaCIKLSNp
bmNsdWRlICJjc3MvY3NzX3N0eWxlc2hlZXRpbXBsLmgiCi0KLSNpZm5kZWYgS0hUTUxfTk9fWEJM
Ci0jaW5jbHVkZSAieGJsL3hibF9kb2NpbXBsLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgPGt4bWxj
b3JlL0Fzc2VydGlvbnMuaD4KLSNpbmNsdWRlICJLV1FMb2FkZXIuaCIKLQotdXNpbmcgbmFtZXNw
YWNlIGtodG1sOwotdXNpbmcgbmFtZXNwYWNlIERPTTsKLQotc3RhdGljIGJvb2wgY2FjaGVEaXNh
YmxlZDsKLQotLy8gQ2FsbCB0aGlzICJ3YWxrZXIiIGluc3RlYWQgb2YgaXRlcmF0b3Igc28gcGVv
cGxlIHdvbid0IGV4cGVjdCBRdCBvciBTVEwtc3R5bGUgaXRlcmF0b3IgaW50ZXJmYWNlLgotLy8g
SnVzdCBrZWVwIGNhbGxpbmcgbmV4dCgpIG9uIHRoaXMuIEl0J3Mgc2FmZSBmcm9tIGRlbGV0aW9u
cyBvZiB0aGUgY3VycmVudCBpdGVtCi1jbGFzcyBDYWNoZWRPYmplY3RDbGllbnRXYWxrZXIgewot
cHVibGljOgotICAgIENhY2hlZE9iamVjdENsaWVudFdhbGtlcihjb25zdCBRUHRyRGljdDxDYWNo
ZWRPYmplY3RDbGllbnQ+ICZjbGllbnRzKSA6IF9jdXJyZW50KDApLCBfaXRlcmF0b3IoY2xpZW50
cykgeyB9Ci0gICAgQ2FjaGVkT2JqZWN0Q2xpZW50ICpuZXh0KCk7Ci1wcml2YXRlOgotICAgIENh
Y2hlZE9iamVjdENsaWVudCAqX2N1cnJlbnQ7Ci0gICAgUVB0ckRpY3RJdGVyYXRvcjxDYWNoZWRP
YmplY3RDbGllbnQ+IF9pdGVyYXRvcjsKLX07Ci0KLUNhY2hlZE9iamVjdDo6fkNhY2hlZE9iamVj
dCgpCi17Ci0gICAgaWYobV9kZWxldGVkKSBhYm9ydCgpOwotICAgIENhY2hlOjpyZW1vdmVGcm9t
TFJVTGlzdCh0aGlzKTsKLSAgICBtX2RlbGV0ZWQgPSB0cnVlOwotICAgIHNldFJlc3BvbnNlKDAp
OwotICAgIHNldEFsbERhdGEoMCk7Ci19Ci0KLXZvaWQgQ2FjaGVkT2JqZWN0OjpmaW5pc2goKQot
ewotICAgIGlmIChtX3NpemUgPiBDYWNoZTo6bWF4Q2FjaGVhYmxlT2JqZWN0U2l6ZSgpKQotICAg
ICAgICBtX3N0YXR1cyA9IFVuY2FjaGVhYmxlOwotICAgIGVsc2UKLSAgICAgICAgbV9zdGF0dXMg
PSBDYWNoZWQ7Ci0gICAgS1VSTCB1cmwobV91cmwucXN0cmluZygpKTsKLSAgICBpZiAobV9leHBp
cmVEYXRlQ2hhbmdlZCAmJiB1cmwucHJvdG9jb2woKS5zdGFydHNXaXRoKCJodHRwIikpCi0gICAg
ICAgIG1fZXhwaXJlRGF0ZUNoYW5nZWQgPSBmYWxzZTsKLX0KLQotdm9pZCBDYWNoZWRPYmplY3Q6
OnNldEV4cGlyZURhdGUodGltZV90IF9leHBpcmVEYXRlLCBib29sIGNoYW5nZUh0dHBDYWNoZSkK
LXsKLSAgICBpZiAoIF9leHBpcmVEYXRlID09IG1fZXhwaXJlRGF0ZSkKLSAgICAgICAgcmV0dXJu
OwotCi0gICAgaWYgKG1fc3RhdHVzID09IFVuY2FjaGVhYmxlIHx8IG1fc3RhdHVzID09IENhY2hl
ZCkKLSAgICB7Ci0gICAgICAgIGZpbmlzaCgpOwotICAgIH0KLSAgICBtX2V4cGlyZURhdGUgPSBf
ZXhwaXJlRGF0ZTsKLSAgICBpZiAoY2hhbmdlSHR0cENhY2hlICYmIG1fZXhwaXJlRGF0ZSkKLSAg
ICAgICBtX2V4cGlyZURhdGVDaGFuZ2VkID0gdHJ1ZTsKLX0KLQotYm9vbCBDYWNoZWRPYmplY3Q6
OmlzRXhwaXJlZCgpIGNvbnN0Ci17Ci0gICAgaWYgKCFtX2V4cGlyZURhdGUpIHJldHVybiBmYWxz
ZTsKLSAgICB0aW1lX3Qgbm93ID0gdGltZSgwKTsKLSAgICByZXR1cm4gKGRpZmZ0aW1lKG5vdywg
bV9leHBpcmVEYXRlKSA+PSAwKTsKLX0KLQotdm9pZCBDYWNoZWRPYmplY3Q6OnNldFJlcXVlc3Qo
UmVxdWVzdCAqX3JlcXVlc3QpCi17Ci0gICAgaWYgKCBfcmVxdWVzdCAmJiAhbV9yZXF1ZXN0ICkK
LSAgICAgICAgbV9zdGF0dXMgPSBQZW5kaW5nOwotICAgIG1fcmVxdWVzdCA9IF9yZXF1ZXN0Owot
ICAgIGlmIChjYW5EZWxldGUoKSAmJiBtX2ZyZWUpCi0gICAgICAgIGRlbGV0ZSB0aGlzOwotICAg
IGVsc2UgaWYgKGFsbG93SW5MUlVMaXN0KCkpCi0gICAgICAgIENhY2hlOjppbnNlcnRJbkxSVUxp
c3QodGhpcyk7Ci19Ci0KLXZvaWQgQ2FjaGVkT2JqZWN0OjpyZWYoQ2FjaGVkT2JqZWN0Q2xpZW50
ICpjKQotewotICAgIG1fY2xpZW50cy5pbnNlcnQoYywgYyk7Ci0gICAgQ2FjaGU6OnJlbW92ZUZy
b21MUlVMaXN0KHRoaXMpOwotICAgIGluY3JlYXNlQWNjZXNzQ291bnQoKTsKLX0KLQotdm9pZCBD
YWNoZWRPYmplY3Q6OmRlcmVmKENhY2hlZE9iamVjdENsaWVudCAqYykKLXsKLSAgICBtX2NsaWVu
dHMucmVtb3ZlKGMpOwotICAgIGlmIChhbGxvd0luTFJVTGlzdCgpKQotICAgICAgICBDYWNoZTo6
aW5zZXJ0SW5MUlVMaXN0KHRoaXMpOwotfQotCi12b2lkIENhY2hlZE9iamVjdDo6c2V0U2l6ZShp
bnQgc2l6ZSkKLXsKLSAgICBib29sIHNpemVDaGFuZ2VkID0gQ2FjaGU6OmFkanVzdFNpemUodGhp
cywgc2l6ZSAtIG1fc2l6ZSk7Ci0KLSAgICAvLyBUaGUgb2JqZWN0IG11c3Qgbm93IGJlIG1vdmVk
IHRvIGEgZGlmZmVyZW50IHF1ZXVlLCBzaW5jZSBpdHMgc2l6ZSBoYXMgYmVlbiBjaGFuZ2VkLgot
ICAgIGlmIChzaXplQ2hhbmdlZCAmJiBhbGxvd0luTFJVTGlzdCgpKQotICAgICAgICBDYWNoZTo6
cmVtb3ZlRnJvbUxSVUxpc3QodGhpcyk7Ci0KLSAgICBtX3NpemUgPSBzaXplOwotICAgIAotICAg
IGlmIChzaXplQ2hhbmdlZCAmJiBhbGxvd0luTFJVTGlzdCgpKQotICAgICAgICBDYWNoZTo6aW5z
ZXJ0SW5MUlVMaXN0KHRoaXMpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tCi0KLUNhY2hlZENTU1N0eWxlU2hlZXQ6OkNhY2hlZENTU1N0eWxlU2hlZXQoRG9jTG9h
ZGVyKiBkbCwgY29uc3QgRE9NU3RyaW5nICZ1cmwsIEtJTzo6Q2FjaGVDb250cm9sIF9jYWNoZVBv
bGljeSwgdGltZV90IF9leHBpcmVEYXRlLCBjb25zdCBRU3RyaW5nJiBjaGFyc2V0KQotICAgIDog
Q2FjaGVkT2JqZWN0KHVybCwgQ1NTU3R5bGVTaGVldCwgX2NhY2hlUG9saWN5LCBfZXhwaXJlRGF0
ZSksIG1fY29kZWMoMCkKLXsKLSAgICAvLyBJdCdzIGNzcyB3ZSB3YW50LgotICAgIHNldEFjY2Vw
dCgidGV4dC9jc3MiKTsKLSAgICAvLyBsb2FkIHRoZSBmaWxlCi0gICAgQ2FjaGU6OmxvYWRlcigp
LT5sb2FkKGRsLCB0aGlzLCBmYWxzZSk7Ci0gICAgbV9sb2FkaW5nID0gdHJ1ZTsKLSAgICBpZiAo
IWNoYXJzZXQuaXNFbXB0eSgpKQotCW1fY29kZWMgPSBRVGV4dENvZGVjOjpjb2RlY0Zvck5hbWUo
Y2hhcnNldC5sYXRpbjEoKSk7Ci0gICAgaWYgKCFtX2NvZGVjKQotICAgICAgICBtX2NvZGVjID0g
UVRleHRDb2RlYzo6Y29kZWNGb3JOYW1lKCJpc284ODU5LTEiKTsKLX0KLQotQ2FjaGVkQ1NTU3R5
bGVTaGVldDo6Q2FjaGVkQ1NTU3R5bGVTaGVldChjb25zdCBET01TdHJpbmcgJnVybCwgY29uc3Qg
UVN0cmluZyAmc3R5bGVzaGVldF9kYXRhKQotICAgIDogQ2FjaGVkT2JqZWN0KHVybCwgQ1NTU3R5
bGVTaGVldCwgS0lPOjpDQ19WZXJpZnksIDAsIHN0eWxlc2hlZXRfZGF0YS5sZW5ndGgoKSkKLXsK
LSAgICBtX2xvYWRpbmcgPSBmYWxzZTsKLSAgICBtX3N0YXR1cyA9IFBlcnNpc3RlbnQ7Ci0gICAg
bV9jb2RlYyA9IDA7Ci0gICAgbV9zaGVldCA9IERPTVN0cmluZyhzdHlsZXNoZWV0X2RhdGEpOwot
fQotCi0KLUNhY2hlZENTU1N0eWxlU2hlZXQ6On5DYWNoZWRDU1NTdHlsZVNoZWV0KCkKLXsKLX0K
LQotdm9pZCBDYWNoZWRDU1NTdHlsZVNoZWV0OjpyZWYoQ2FjaGVkT2JqZWN0Q2xpZW50ICpjKQot
ewotICAgIENhY2hlZE9iamVjdDo6cmVmKGMpOwotCi0gICAgaWYoIW1fbG9hZGluZykgYy0+c2V0
U3R5bGVTaGVldCggbV91cmwsIG1fc2hlZXQgKTsKLX0KLQotdm9pZCBDYWNoZWRDU1NTdHlsZVNo
ZWV0OjpkZXJlZihDYWNoZWRPYmplY3RDbGllbnQgKmMpCi17Ci0gICAgQ2FjaGU6OmZsdXNoKCk7
Ci0gICAgQ2FjaGVkT2JqZWN0OjpkZXJlZihjKTsKLSAgICBpZiAoIGNhbkRlbGV0ZSgpICYmIG1f
ZnJlZSApCi0gICAgICBkZWxldGUgdGhpczsKLX0KLQotdm9pZCBDYWNoZWRDU1NTdHlsZVNoZWV0
OjpzZXRDaGFyc2V0KCBjb25zdCBRU3RyaW5nICZjaHMgKQotewotICAgIGlmICghY2hzLmlzRW1w
dHkoKSkgewotICAgICAgICBRVGV4dENvZGVjICpjb2RlYyA9IFFUZXh0Q29kZWM6OmNvZGVjRm9y
TmFtZShjaHMubGF0aW4xKCkpOwotICAgICAgICBpZiAoY29kZWMpCi0gICAgICAgICAgICBtX2Nv
ZGVjID0gY29kZWM7Ci0gICAgfQotfQotCi12b2lkIENhY2hlZENTU1N0eWxlU2hlZXQ6OmRhdGEo
IFFCdWZmZXIgJmJ1ZmZlciwgYm9vbCBlb2YgKQotewotICAgIGlmKCFlb2YpIHJldHVybjsKLSAg
ICBidWZmZXIuY2xvc2UoKTsKLSAgICBzZXRTaXplKGJ1ZmZlci5idWZmZXIoKS5zaXplKCkpOwot
ICAgIFFTdHJpbmcgZGF0YSA9IG1fY29kZWMtPnRvVW5pY29kZSggYnVmZmVyLmJ1ZmZlcigpLmRh
dGEoKSwgc2l6ZSgpICk7Ci0gICAgbV9zaGVldCA9IERPTVN0cmluZyhkYXRhKTsKLSAgICBtX2xv
YWRpbmcgPSBmYWxzZTsKLQotICAgIGNoZWNrTm90aWZ5KCk7Ci19Ci0KLXZvaWQgQ2FjaGVkQ1NT
U3R5bGVTaGVldDo6Y2hlY2tOb3RpZnkoKQotewotICAgIGlmIChtX2xvYWRpbmcpCi0gICAgICAg
IHJldHVybjsKLQotICAgIENhY2hlZE9iamVjdENsaWVudFdhbGtlciB3KG1fY2xpZW50cyk7Ci0g
ICAgd2hpbGUgKENhY2hlZE9iamVjdENsaWVudCAqYyA9IHcubmV4dCgpKSB7Ci0gICAgICAgIGlm
IChtX3Jlc3BvbnNlICYmICFLV1FJc1Jlc3BvbnNlVVJMRXF1YWxUb1VSTChtX3Jlc3BvbnNlLCBt
X3VybCkpCi0gICAgICAgICAgICBjLT5zZXRTdHlsZVNoZWV0KERPTVN0cmluZyhLV1FSZXNwb25z
ZVVSTChtX3Jlc3BvbnNlKSksIG1fc2hlZXQpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBj
LT5zZXRTdHlsZVNoZWV0KG1fdXJsLCBtX3NoZWV0KTsKLSAgICB9Ci19Ci0KLQotdm9pZCBDYWNo
ZWRDU1NTdHlsZVNoZWV0OjplcnJvciggaW50IC8qZXJyKi8sIGNvbnN0IGNoYXIgKi8qdGV4dCov
ICkKLXsKLSAgICBtX2xvYWRpbmcgPSBmYWxzZTsKLSAgICBjaGVja05vdGlmeSgpOwotfQotCi0v
LyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUNhY2hlZFNjcmlwdDo6Q2Fj
aGVkU2NyaXB0KERvY0xvYWRlciogZGwsIGNvbnN0IERPTVN0cmluZyAmdXJsLCBLSU86OkNhY2hl
Q29udHJvbCBfY2FjaGVQb2xpY3ksIHRpbWVfdCBfZXhwaXJlRGF0ZSwgY29uc3QgUVN0cmluZyYg
Y2hhcnNldCkKLSAgICA6IENhY2hlZE9iamVjdCh1cmwsIFNjcmlwdCwgX2NhY2hlUG9saWN5LCBf
ZXhwaXJlRGF0ZSksIG1fY29kZWMoMCkKLXsKLSAgICAvLyBJdCdzIGphdmFzY3JpcHQgd2Ugd2Fu
dC4KLSAgICAvLyBCdXQgc29tZSB3ZWJzaXRlcyB0aGluayB0aGVpciBzY3JpcHRzIGFyZSA8c29t
ZSB3cm9uZyBtaW1ldHlwZSBoZXJlPgotICAgIC8vIGFuZCByZWZ1c2UgdG8gc2VydmUgdGhlbSBp
ZiB3ZSBvbmx5IGFjY2VwdCBhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQuCi0gICAgc2V0QWNjZXB0
KCIqLyoiKTsKLSAgICBtX2Vycm9yT2NjdXJyZWQgPSBmYWxzZTsKLSAgICAvLyBsb2FkIHRoZSBm
aWxlCi0gICAgQ2FjaGU6OmxvYWRlcigpLT5sb2FkKGRsLCB0aGlzLCBmYWxzZSk7Ci0gICAgbV9s
b2FkaW5nID0gdHJ1ZTsKLSAgICBpZiAoIWNoYXJzZXQuaXNFbXB0eSgpKQotICAgICAgICBtX2Nv
ZGVjID0gUVRleHRDb2RlYzo6Y29kZWNGb3JOYW1lKGNoYXJzZXQubGF0aW4xKCkpOwotICAgIGlm
ICghbV9jb2RlYykKLQltX2NvZGVjID0gUVRleHRDb2RlYzo6Y29kZWNGb3JOYW1lKCJpc284ODU5
LTEiKTsKLX0KLQotQ2FjaGVkU2NyaXB0OjpDYWNoZWRTY3JpcHQoY29uc3QgRE9NU3RyaW5nICZ1
cmwsIGNvbnN0IFFTdHJpbmcgJnNjcmlwdF9kYXRhKQotICAgIDogQ2FjaGVkT2JqZWN0KHVybCwg
U2NyaXB0LCBLSU86OkNDX1ZlcmlmeSwgMCwgc2NyaXB0X2RhdGEubGVuZ3RoKCkpCi17Ci0gICAg
bV9lcnJvck9jY3VycmVkID0gZmFsc2U7Ci0gICAgbV9sb2FkaW5nID0gZmFsc2U7Ci0gICAgbV9z
dGF0dXMgPSBQZXJzaXN0ZW50OwotICAgIG1fY29kZWMgPSAwOwotICAgIG1fc2NyaXB0ID0gRE9N
U3RyaW5nKHNjcmlwdF9kYXRhKTsKLX0KLQotQ2FjaGVkU2NyaXB0Ojp+Q2FjaGVkU2NyaXB0KCkK
LXsKLX0KLQotdm9pZCBDYWNoZWRTY3JpcHQ6OnJlZihDYWNoZWRPYmplY3RDbGllbnQgKmMpCi17
Ci0gICAgQ2FjaGVkT2JqZWN0OjpyZWYoYyk7Ci0KLSAgICBpZighbV9sb2FkaW5nKSBjLT5ub3Rp
ZnlGaW5pc2hlZCh0aGlzKTsKLX0KLQotdm9pZCBDYWNoZWRTY3JpcHQ6OmRlcmVmKENhY2hlZE9i
amVjdENsaWVudCAqYykKLXsKLSAgICBDYWNoZTo6Zmx1c2goKTsKLSAgICBDYWNoZWRPYmplY3Q6
OmRlcmVmKGMpOwotICAgIGlmICggY2FuRGVsZXRlKCkgJiYgbV9mcmVlICkKLSAgICAgIGRlbGV0
ZSB0aGlzOwotfQotCi12b2lkIENhY2hlZFNjcmlwdDo6c2V0Q2hhcnNldCggY29uc3QgUVN0cmlu
ZyAmY2hzICkKLXsKLSAgICBpZiAoIWNocy5pc0VtcHR5KCkpIHsKLSAgICAgICAgUVRleHRDb2Rl
YyAqY29kZWMgPSBRVGV4dENvZGVjOjpjb2RlY0Zvck5hbWUoY2hzLmxhdGluMSgpKTsKLSAgICAg
ICAgaWYgKGNvZGVjKQotICAgICAgICAgICAgbV9jb2RlYyA9IGNvZGVjOwotICAgIH0KLX0KLQot
dm9pZCBDYWNoZWRTY3JpcHQ6OmRhdGEoIFFCdWZmZXIgJmJ1ZmZlciwgYm9vbCBlb2YgKQotewot
ICAgIGlmKCFlb2YpIHJldHVybjsKLSAgICBidWZmZXIuY2xvc2UoKTsKLSAgICBzZXRTaXplKGJ1
ZmZlci5idWZmZXIoKS5zaXplKCkpOwotICAgIFFTdHJpbmcgZGF0YSA9IG1fY29kZWMtPnRvVW5p
Y29kZSggYnVmZmVyLmJ1ZmZlcigpLmRhdGEoKSwgc2l6ZSgpICk7Ci0gICAgbV9zY3JpcHQgPSBE
T01TdHJpbmcoZGF0YSk7Ci0gICAgbV9sb2FkaW5nID0gZmFsc2U7Ci0gICAgY2hlY2tOb3RpZnko
KTsKLX0KLQotdm9pZCBDYWNoZWRTY3JpcHQ6OmNoZWNrTm90aWZ5KCkKLXsKLSAgICBpZihtX2xv
YWRpbmcpIHJldHVybjsKLQotICAgIENhY2hlZE9iamVjdENsaWVudFdhbGtlciB3KG1fY2xpZW50
cyk7Ci0gICAgd2hpbGUgKENhY2hlZE9iamVjdENsaWVudCAqYyA9IHcubmV4dCgpKQotICAgICAg
ICBjLT5ub3RpZnlGaW5pc2hlZCh0aGlzKTsKLX0KLQotCi12b2lkIENhY2hlZFNjcmlwdDo6ZXJy
b3IoIGludCAvKmVyciovLCBjb25zdCBjaGFyICovKnRleHQqLyApCi17Ci0gICAgbV9sb2FkaW5n
ID0gZmFsc2U7Ci0gICAgbV9lcnJvck9jY3VycmVkID0gdHJ1ZTsKLSAgICBjaGVja05vdGlmeSgp
OwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi1zdGF0aWMg
Ym9vbCBjcm9zc0RvbWFpbihjb25zdCBRU3RyaW5nICZhLCBjb25zdCBRU3RyaW5nICZiKQotewot
ICAgIGlmIChhID09IGIpIHJldHVybiBmYWxzZTsKLQotICAgIFFTdHJpbmdMaXN0IGwxID0gUVN0
cmluZ0xpc3Q6OnNwbGl0KCcuJywgYSk7Ci0gICAgUVN0cmluZ0xpc3QgbDIgPSBRU3RyaW5nTGlz
dDo6c3BsaXQoJy4nLCBiKTsKLQotICAgIHdoaWxlKGwxLmNvdW50KCkgPiBsMi5jb3VudCgpKQot
ICAgICAgICBsMS5wb3BfZnJvbnQoKTsKLQotICAgIHdoaWxlKGwyLmNvdW50KCkgPiBsMS5jb3Vu
dCgpKQotICAgICAgICBsMi5wb3BfZnJvbnQoKTsKLQotICAgIHdoaWxlKGwyLmNvdW50KCkgPj0g
MikKLSAgICB7Ci0gICAgICAgIGlmIChsMSA9PSBsMikKLSAgICAgICAgICAgcmV0dXJuIGZhbHNl
OwotCi0gICAgICAgIGwxLnBvcF9mcm9udCgpOwotICAgICAgICBsMi5wb3BfZnJvbnQoKTsKLSAg
ICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0KLXZvaWQgQ2FjaGVkSW1hZ2VDYWxsYmFjazo6bm90aWZ5VXBkYXRlKCkgCi17IAotICAgIGlm
IChjYWNoZWRJbWFnZSkgewotICAgICAgICBjYWNoZWRJbWFnZS0+ZG9fbm90aWZ5IChjYWNoZWRJ
bWFnZS0+cGl4bWFwKCksIGNhY2hlZEltYWdlLT5waXhtYXAoKS5yZWN0KCkpOyAKLSAgICAgICAg
UVNpemUgcyA9IGNhY2hlZEltYWdlLT5waXhtYXBfc2l6ZSgpOwotICAgICAgICBjYWNoZWRJbWFn
ZS0+c2V0U2l6ZShzLndpZHRoKCkgKiBzLmhlaWdodCgpICogMik7Ci0KLSAgICAgICAgLy8gQWZ0
ZXIgcmVjZWl2aW5nIHRoZSBpbWFnZSBoZWFkZXIgd2UgYXJlIGd1YXJhbnRlZWQgdG8ga25vdwot
ICAgICAgICAvLyB0aGUgaW1hZ2Ugc2l6ZS4gIEFsdGhvdWdoIGFsbCBvZiB0aGUgZGF0YSBtYXkg
bm90IGhhdmUgYXJyaXZlZCBvcgotICAgICAgICAvLyBiZWVuIGRlY29kZWQgd2UgY2FuIGNvbnNp
ZGVyIHRoZSBpbWFnZSBsb2FkZWQgZm9yIHB1cnBvc2VkIG9mCi0gICAgICAgIC8vIGxheW91dCBh
bmQgZGlzcGF0Y2hpbmcgdGhlIGltYWdlJ3Mgb25sb2FkIGhhbmRsZXIuICBSZW1vdmluZyB0aGUg
cmVxdWVzdCBmcm9tCi0gICAgICAgIC8vIHRoZSBsaXN0IG9mIGJhY2tncm91bmQgZGVjb2Rpbmcg
cmVxdWVzdHMgd2lsbCBlbnN1cmUgdGhhdCBMb2FkZXI6Om51bVJlcXVlc3RzKCkgCi0gICAgICAg
IC8vIGRvZXMgbm90IGNvdW50IHRoaXMgYmFja2dyb3VuZCByZXF1ZXN0LiAgRnVydGhlciBudW1S
ZXF1ZXN0cygpIGNhbgotICAgICAgICAvLyBiZSBjb3JyZWN0bHkgdXNlZCBieSB0aGUgcGFydCB0
byBkZXRlcm1pbmUgaWYgbG9hZGluZyBpcyBzdWZmaWNpZW50bHkKLSAgICAgICAgLy8gY29tcGxl
dGUgdG8gZGlzcGF0Y2ggdGhlIHBhZ2UncyBvbmxvYWQgaGFuZGxlci4KLSAgICAgICAgUmVxdWVz
dCAqciA9IGNhY2hlZEltYWdlLT5tX3JlcXVlc3Q7Ci0gICAgICAgIERvY0xvYWRlciAqZGwgPSBy
LT5tX2RvY0xvYWRlcjsKLQotICAgICAgICBraHRtbDo6Q2FjaGU6OmxvYWRlcigpLT5yZW1vdmVC
YWNrZ3JvdW5kRGVjb2RpbmdSZXF1ZXN0KHIpOwotCi0gICAgICAgIC8vIFBva2UgdGhlIHBhcnQg
dG8gZ2V0IGl0IHRvIGRvIGEgY2hlY2tDb21wbGV0ZWQoKS4gIE9ubHkgZG8gdGhpcyBmb3IKLSAg
ICAgICAgLy8gdGhlIGZpcnN0IHVwZGF0ZSB0byBtaW5pbWl6ZSB3b3JrLiAgTm90ZSB0aGF0IHdl
IGFyZSBndWFyYW50ZWVkIHRvIGhhdmUKLSAgICAgICAgLy8gcmVhZCB0aGUgaGVhZGVyIHdoZW4g
d2UgcmVjZWl2ZWQgdGhpcyBmaXJzdCB1cGRhdGUsIHdoaWNoIGlzIHRyaWdnZXJlZAotICAgICAg
ICAvLyBieSB0aGUgZmlyc3Qga0NHSW1hZ2VTdGF0dXNJbmNvbXBsZXRlIHN0YXR1cyBmcm9tIENH
LiBrQ0dJbWFnZVN0YXR1c0luY29tcGxldGUKLSAgICAgICAgLy8gcmVhbGx5IG1lYW5zIHRoYXQg
dGhlIENHIGRlY29kZXIgaXMgd2FpdGluZyBmb3IgbW9yZSBkYXRhLCBidXQgaGFzIGFscmVhZHkK
LSAgICAgICAgLy8gcmVhZCB0aGUgaGVhZGVyLgotICAgICAgICBpZiAoIWhlYWRlclJlY2VpdmVk
KSB7Ci0gICAgICAgICAgICBlbWl0IGtodG1sOjpDYWNoZTo6bG9hZGVyKCktPnJlcXVlc3REb25l
KCBkbCwgY2FjaGVkSW1hZ2UgKTsKLSAgICAgICAgICAgIGhlYWRlclJlY2VpdmVkID0gdHJ1ZTsK
LSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBDYWNoZWRJbWFnZUNhbGxiYWNrOjpub3RpZnlG
aW5pc2hlZCgpCi17Ci0gICAgaWYgKGNhY2hlZEltYWdlKSB7Ci0gICAgICAgIGNhY2hlZEltYWdl
LT5kb19ub3RpZnkgKGNhY2hlZEltYWdlLT5waXhtYXAoKSwgY2FjaGVkSW1hZ2UtPnBpeG1hcCgp
LnJlY3QoKSk7IAotICAgICAgICBjYWNoZWRJbWFnZS0+bV9sb2FkaW5nID0gZmFsc2U7Ci0gICAg
ICAgIGNhY2hlZEltYWdlLT5jaGVja05vdGlmeSgpOwotICAgICAgICBRU2l6ZSBzID0gY2FjaGVk
SW1hZ2UtPnBpeG1hcF9zaXplKCk7Ci0gICAgICAgIGNhY2hlZEltYWdlLT5zZXRTaXplKHMud2lk
dGgoKSAqIHMuaGVpZ2h0KCkgKiAyKTsKLQkKLSAgICAgICAgUmVxdWVzdCAqciA9IGNhY2hlZElt
YWdlLT5tX3JlcXVlc3Q7Ci0gICAgICAgIERvY0xvYWRlciAqZGwgPSByLT5tX2RvY0xvYWRlcjsK
LQotICAgICAgICBraHRtbDo6Q2FjaGU6OmxvYWRlcigpLT5yZW1vdmVCYWNrZ3JvdW5kRGVjb2Rp
bmdSZXF1ZXN0KHIpOwotCi0gICAgICAgIC8vIFBva2UgdGhlIHBhcnQgdG8gZ2V0IGl0IHRvIGRv
IGEgY2hlY2tDb21wbGV0ZWQoKS4KLSAgICAgICAgZW1pdCBraHRtbDo6Q2FjaGU6OmxvYWRlcigp
LT5yZXF1ZXN0RG9uZSggZGwsIGNhY2hlZEltYWdlICk7Ci0gICAgICAgIAotICAgICAgICBkZWxl
dGUgcjsKLSAgICB9Ci19Ci0KLXZvaWQgQ2FjaGVkSW1hZ2VDYWxsYmFjazo6bm90aWZ5RGVjb2Rp
bmdFcnJvcigpCi17Ci0gICAgaWYgKGNhY2hlZEltYWdlKSB7Ci0gICAgICAgIGhhbmRsZUVycm9y
KCk7Ci0gICAgfQotfQotCi12b2lkIENhY2hlZEltYWdlQ2FsbGJhY2s6OmhhbmRsZUVycm9yKCkK
LXsKLSAgICBpZiAoY2FjaGVkSW1hZ2UpIHsKLSAgICAgICAgY2FjaGVkSW1hZ2UtPmVycm9yT2Nj
dXJlZCA9IHRydWU7Ci0gICAgICAgIFFQaXhtYXAgZXAgPSBjYWNoZWRJbWFnZS0+cGl4bWFwKCk7
Ci0gICAgICAgIGNhY2hlZEltYWdlLT5kb19ub3RpZnkgKGVwLCBlcC5yZWN0KCkpOwotICAgICAg
ICBDYWNoZTo6cmVtb3ZlQ2FjaGVFbnRyeSAoY2FjaGVkSW1hZ2UpOwotCi0gICAgICAgIGNsZWFy
KCk7Ci0gICAgfQotfQotCi12b2lkIENhY2hlZEltYWdlQ2FsbGJhY2s6OmNsZWFyKCkgCi17Ci0g
ICAgaWYgKGNhY2hlZEltYWdlICYmIGNhY2hlZEltYWdlLT5tX3JlcXVlc3QpIHsKLSAgICAgICAg
UmVxdWVzdCAqciA9IGNhY2hlZEltYWdlLT5tX3JlcXVlc3Q7Ci0gICAgICAgIERvY0xvYWRlciAq
ZGwgPSByLT5tX2RvY0xvYWRlcjsKLQotICAgICAgICBraHRtbDo6Q2FjaGU6OmxvYWRlcigpLT5y
ZW1vdmVCYWNrZ3JvdW5kRGVjb2RpbmdSZXF1ZXN0KHIpOwotCi0gICAgICAgIC8vIFBva2UgdGhl
IHBhcnQgdG8gZ2V0IGl0IHRvIGRvIGEgY2hlY2tDb21wbGV0ZWQoKS4KLSAgICAgICAgZW1pdCBr
aHRtbDo6Q2FjaGU6OmxvYWRlcigpLT5yZXF1ZXN0RmFpbGVkKCBkbCwgY2FjaGVkSW1hZ2UgKTsK
LQotICAgICAgICBkZWxldGUgcjsKLSAgICB9Ci0gICAgY2FjaGVkSW1hZ2UgPSAwOwotfQotCi1D
YWNoZWRJbWFnZTo6Q2FjaGVkSW1hZ2UoRG9jTG9hZGVyKiBkbCwgY29uc3QgRE9NU3RyaW5nICZ1
cmwsIEtJTzo6Q2FjaGVDb250cm9sIF9jYWNoZVBvbGljeSwgdGltZV90IF9leHBpcmVEYXRlKQot
ICAgIDogUU9iamVjdCgpLCBDYWNoZWRPYmplY3QodXJsLCBJbWFnZSwgX2NhY2hlUG9saWN5LCBf
ZXhwaXJlRGF0ZSkKLSAgICAsIG1fZGF0YVNpemUoMCkKLXsKLSAgICBwID0gMDsKLSAgICBwaXhQ
YXJ0ID0gMDsKLSAgICBiZyA9IDA7Ci0gICAgaXNGdWxseVRyYW5zcGFyZW50ID0gZmFsc2U7Ci0g
ICAgZXJyb3JPY2N1cmVkID0gZmFsc2U7Ci0gICAgbW9ub2Nocm9tZSA9IGZhbHNlOwotICAgIGZv
cm1hdFR5cGUgPSAwOwotICAgIG1fc3RhdHVzID0gVW5rbm93bjsKLSAgICBpbWdTb3VyY2UgPSAw
OwotICAgIG1fbG9hZGluZyA9IHRydWU7Ci0gICAgbV9zaG93QW5pbWF0aW9ucyA9IGRsLT5zaG93
QW5pbWF0aW9ucygpOwotICAgIGlmIChRUGl4bWFwOjpzaG91bGRVc2VUaHJlYWRlZERlY29kaW5n
KCkpCi0gICAgICAgIG1fZGVjb2RlckNhbGxiYWNrID0gbmV3IENhY2hlZEltYWdlQ2FsbGJhY2so
dGhpcyk7Ci0gICAgZWxzZQotICAgICAgICBtX2RlY29kZXJDYWxsYmFjayA9IDA7Ci19Ci0KLUNh
Y2hlZEltYWdlOjp+Q2FjaGVkSW1hZ2UoKQotewotICAgIGNsZWFyKCk7Ci19Ci0KLXZvaWQgQ2Fj
aGVkSW1hZ2U6OnJlZiggQ2FjaGVkT2JqZWN0Q2xpZW50ICpjICkKLXsKLSAgICBDYWNoZWRPYmpl
Y3Q6OnJlZihjKTsKLQotICAgIC8vIGZvciBtb3VzZW92ZXJzLCBkeW5hbWljIGNoYW5nZXMKLSAg
ICBpZiAoIXZhbGlkX3JlY3QoKS5pc051bGwoKSkKLSAgICAgICAgYy0+c2V0UGl4bWFwKCBwaXht
YXAoKSwgdmFsaWRfcmVjdCgpLCB0aGlzKTsKLQotICAgIGlmKCFtX2xvYWRpbmcpCi0gICAgICAg
IGMtPm5vdGlmeUZpbmlzaGVkKHRoaXMpOwotfQotCi12b2lkIENhY2hlZEltYWdlOjpkZXJlZigg
Q2FjaGVkT2JqZWN0Q2xpZW50ICpjICkKLXsKLSAgICBDYWNoZTo6Zmx1c2goKTsKLSAgICBDYWNo
ZWRPYmplY3Q6OmRlcmVmKGMpOwotICAgIGlmICggY2FuRGVsZXRlKCkgJiYgbV9mcmVlICkKLSAg
ICAgICAgZGVsZXRlIHRoaXM7Ci19Ci0KLWNvbnN0IFFQaXhtYXAgJkNhY2hlZEltYWdlOjp0aWxl
ZF9waXhtYXAoY29uc3QgUUNvbG9yJiBuZXdjKQotewotICAgIHJldHVybiBwaXhtYXAoKTsKLX0K
LQotY29uc3QgUVBpeG1hcCAmQ2FjaGVkSW1hZ2U6OnBpeG1hcCggKSBjb25zdAotewotICAgIGlm
KGVycm9yT2NjdXJlZCkKLSAgICAgICAgcmV0dXJuICpDYWNoZTo6YnJva2VuUGl4bWFwOwotCi0g
ICAgaWYgKHApCi0gICAgICAgIHJldHVybiAqcDsKLQotICAgIHJldHVybiAqQ2FjaGU6Om51bGxQ
aXhtYXA7Ci19Ci0KLVFTaXplIENhY2hlZEltYWdlOjpwaXhtYXBfc2l6ZSgpIGNvbnN0Ci17Ci0g
ICAgcmV0dXJuIChwID8gcC0+c2l6ZSgpIDogUVNpemUoKSk7Ci19Ci0KLVFSZWN0IENhY2hlZElt
YWdlOjp2YWxpZF9yZWN0KCkgY29uc3QKLXsKLSAgICByZXR1cm4gKHAgPyBwLT5yZWN0KCkgOiBR
UmVjdCgpKTsKLX0KLQotdm9pZCBDYWNoZWRJbWFnZTo6ZG9fbm90aWZ5KGNvbnN0IFFQaXhtYXAm
IHAsIGNvbnN0IFFSZWN0JiByKQotewotICAgIENhY2hlZE9iamVjdENsaWVudFdhbGtlciB3KG1f
Y2xpZW50cyk7Ci0gICAgd2hpbGUgKENhY2hlZE9iamVjdENsaWVudCAqYyA9IHcubmV4dCgpKQot
ICAgICAgICBjLT5zZXRQaXhtYXAocCwgciwgdGhpcyk7Ci19Ci0KLXZvaWQgQ2FjaGVkSW1hZ2U6
OnNldFNob3dBbmltYXRpb25zKCBLSFRNTFNldHRpbmdzOjpLQW5pbWF0aW9uQWR2aWNlIHNob3dB
bmltYXRpb25zICkKLXsKLSAgICBtX3Nob3dBbmltYXRpb25zID0gc2hvd0FuaW1hdGlvbnM7Ci19
Ci0KLXZvaWQgQ2FjaGVkSW1hZ2U6OmNsZWFyKCkKLXsKLSAgICBkZWxldGUgcDsgICBwID0gMDsK
LSAgICBkZWxldGUgYmc7ICBiZyA9IDA7Ci0gICAgZGVsZXRlIHBpeFBhcnQ7IHBpeFBhcnQgPSAw
OwotCi0gICAgZm9ybWF0VHlwZSA9IDA7Ci0KLSAgICBzZXRTaXplKDApOwotCi0gICAgLy8gTm8g
bmVlZCB0byBkZWxldGUgaW1hZ2VTb3VyY2UgLSBRTW92aWUgZG9lcyBpdCBmb3IgdXMKLSAgICBp
bWdTb3VyY2UgPSAwOwotCi0gICAgaWYgKG1fZGVjb2RlckNhbGxiYWNrKSB7Ci0gICAgICAgIG1f
ZGVjb2RlckNhbGxiYWNrLT5jbGVhcigpOwotICAgICAgICBtX2RlY29kZXJDYWxsYmFjay0+ZGVy
ZWYoKTsKLSAgICAgICAgbV9kZWNvZGVyQ2FsbGJhY2sgPSAwOwotICAgIH0KLX0KLQotdm9pZCBD
YWNoZWRJbWFnZTo6ZGF0YSAoIFFCdWZmZXIgJl9idWZmZXIsIGJvb2wgZW9mICkKLXsKLSNpZmRl
ZiBDQUNIRV9ERUJVRwotICAgIGtkRGVidWcoIDYwNjAgKSA8PCB0aGlzIDw8ICJpbiBDYWNoZWRJ
bWFnZTo6ZGF0YShidWZmZXJzaXplICIgPDwgX2J1ZmZlci5idWZmZXIoKS5zaXplKCkgPDwiLCBl
b2Y9IiA8PCBlb2YgPDwgZW5kbDsKLSNlbmRpZgotCi0gICAgYm9vbCBjYW5EcmF3ID0gZmFsc2U7
Ci0gICAgCi0gICAgbV9kYXRhU2l6ZSA9IF9idWZmZXIuc2l6ZSgpOwotICAgICAgICAKLSAgICAv
LyBJZiB3ZSdyZSBhdCBlb2YgYW5kIGRvbid0IGhhdmUgYSBwaXhtYXAgeWV0LCB0aGUgZGF0YQot
ICAgIC8vIG11c3QgaGF2ZSBhcnJpdmVkIGluIG9uZSBjaHVuay4gIFRoaXMgYXZvaWRzIHRoZSBh
dHRlbXB0Ci0gICAgLy8gdG8gcGVyZm9ybSBpbmNyZW1lbnRhbCBkZWNvZGluZy4KLSAgICBpZiAo
ZW9mICYmICFwKSB7Ci0gICAgICAgIHAgPSBuZXcgUVBpeG1hcChfYnVmZmVyLmJ1ZmZlcigpLCBL
V1FSZXNwb25zZU1JTUVUeXBlKG1fcmVzcG9uc2UpKTsKLSAgICAgICAgaWYgKG1fZGVjb2RlckNh
bGxiYWNrKQotICAgICAgICAgICAgbV9kZWNvZGVyQ2FsbGJhY2stPm5vdGlmeUZpbmlzaGVkKCk7
Ci0gICAgICAgIGNhbkRyYXcgPSB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIEFsd2F5
cyBhdHRlbXB0IHRvIGxvYWQgdGhlIGltYWdlIGluY3JlbWVudGFsbHkuCi0gICAgICAgIGlmICgh
cCkKLSAgICAgICAgICAgIHAgPSBuZXcgUVBpeG1hcChLV1FSZXNwb25zZU1JTUVUeXBlKG1fcmVz
cG9uc2UpKTsKLSAgICAgICAgY2FuRHJhdyA9IHAtPnJlY2VpdmVkRGF0YShfYnVmZmVyLmJ1ZmZl
cigpLCBlb2YsIG1fZGVjb2RlckNhbGxiYWNrKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gSWYgd2Ug
aGF2ZSBhIGRlY29kZXIsIHdlJ2xsIGJlIG5vdGlmaWVkIHdoZW4gZGVjb2RpbmcgaGFzIGNvbXBs
ZXRlZC4KLSAgICBpZiAoIW1fZGVjb2RlckNhbGxiYWNrKSB7Ci0gICAgICAgIGlmIChjYW5EcmF3
IHx8IGVvZikgewotICAgICAgICAgICAgaWYgKHAtPmlzTnVsbCgpKSB7Ci0gICAgICAgICAgICAg
ICAgZXJyb3JPY2N1cmVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBRUGl4bWFwIGVwID0gcGl4
bWFwKCk7Ci0gICAgICAgICAgICAgICAgZG9fbm90aWZ5IChlcCwgZXAucmVjdCgpKTsKLSAgICAg
ICAgICAgICAgICBDYWNoZTo6cmVtb3ZlQ2FjaGVFbnRyeSAodGhpcyk7Ci0gICAgICAgICAgICB9
Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZG9fbm90aWZ5KCpwLCBwLT5yZWN0
KCkpOwotCi0gICAgICAgICAgICBRU2l6ZSBzID0gcGl4bWFwX3NpemUoKTsKLSAgICAgICAgICAg
IHNldFNpemUocy53aWR0aCgpICogcy5oZWlnaHQoKSAqIDIpOwotICAgICAgICB9Ci0gICAgICAg
IGlmIChlb2YpIHsKLSAgICAgICAgICAgIG1fbG9hZGluZyA9IGZhbHNlOwotICAgICAgICAgICAg
Y2hlY2tOb3RpZnkoKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBDYWNoZWRJbWFnZTo6
ZXJyb3IoIGludCAvKmVyciovLCBjb25zdCBjaGFyICovKnRleHQqLyApCi17Ci0jaWZkZWYgQ0FD
SEVfREVCVUcKLSAgICBrZERlYnVnKDYwNjApIDw8ICJDYWhjZWRJbWFnZTo6ZXJyb3IiIDw8IGVu
ZGw7Ci0jZW5kaWYKLQotICAgIGNsZWFyKCk7Ci0gICAgZXJyb3JPY2N1cmVkID0gdHJ1ZTsKLSAg
ICBkb19ub3RpZnkocGl4bWFwKCksIFFSZWN0KDAsIDAsIDE2LCAxNikpOwotICAgIG1fbG9hZGlu
ZyA9IGZhbHNlOwotICAgIGNoZWNrTm90aWZ5KCk7Ci19Ci0KLXZvaWQgQ2FjaGVkSW1hZ2U6OmNo
ZWNrTm90aWZ5KCkKLXsKLSAgICBpZihtX2xvYWRpbmcpIHJldHVybjsKLQotICAgIENhY2hlZE9i
amVjdENsaWVudFdhbGtlciB3KG1fY2xpZW50cyk7Ci0gICAgd2hpbGUgKENhY2hlZE9iamVjdENs
aWVudCAqYyA9IHcubmV4dCgpKSB7Ci0gICAgICAgIGMtPm5vdGlmeUZpbmlzaGVkKHRoaXMpOwot
ICAgIH0KLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jaWZk
ZWYgS0hUTUxfWFNMVAotCi1DYWNoZWRYU0xTdHlsZVNoZWV0OjpDYWNoZWRYU0xTdHlsZVNoZWV0
KERvY0xvYWRlciogZGwsIGNvbnN0IERPTVN0cmluZyAmdXJsLCBLSU86OkNhY2hlQ29udHJvbCBf
Y2FjaGVQb2xpY3ksIHRpbWVfdCBfZXhwaXJlRGF0ZSkKLTogQ2FjaGVkT2JqZWN0KHVybCwgWFNM
U3R5bGVTaGVldCwgX2NhY2hlUG9saWN5LCBfZXhwaXJlRGF0ZSkKLXsKLSAgICAvLyBJdCdzIFhN
TCB3ZSB3YW50LgotICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBhY2NlcHQgbW9yZSBnZW5lcmFs
IHhtbCBmb3JtYXRzICovKit4bWwsIGltYWdlL3N2Zyt4bWwgZm9yIGV4YW1wbGUuCi0gICAgc2V0
QWNjZXB0KCJ0ZXh0L3htbCwgYXBwbGljYXRpb24veG1sLCBhcHBsaWNhdGlvbi94aHRtbCt4bWws
IHRleHQveHNsLCBhcHBsaWNhdGlvbi9yc3MreG1sLCBhcHBsaWNhdGlvbi9hdG9tK3htbCIpOwot
ICAgIAotICAgIC8vIGxvYWQgdGhlIGZpbGUKLSAgICBDYWNoZTo6bG9hZGVyKCktPmxvYWQoZGws
IHRoaXMsIGZhbHNlKTsKLSAgICBtX2xvYWRpbmcgPSB0cnVlOwotICAgIG1fZGVjb2RlciA9IG5l
dyBEZWNvZGVyOwotfQotCi12b2lkIENhY2hlZFhTTFN0eWxlU2hlZXQ6OnJlZihDYWNoZWRPYmpl
Y3RDbGllbnQgKmMpCi17Ci0gICAgQ2FjaGVkT2JqZWN0OjpyZWYoYyk7Ci0gICAgCi0gICAgaWYg
KCFtX2xvYWRpbmcpCi0gICAgICAgIGMtPnNldFN0eWxlU2hlZXQobV91cmwsIG1fc2hlZXQpOwot
fQotCi12b2lkIENhY2hlZFhTTFN0eWxlU2hlZXQ6OmRlcmVmKENhY2hlZE9iamVjdENsaWVudCAq
YykKLXsKLSAgICBDYWNoZTo6Zmx1c2goKTsKLSAgICBDYWNoZWRPYmplY3Q6OmRlcmVmKGMpOwot
ICAgIGlmIChjYW5EZWxldGUoKSAmJiBtX2ZyZWUpCi0gICAgICAgIGRlbGV0ZSB0aGlzOwotfQot
Ci12b2lkIENhY2hlZFhTTFN0eWxlU2hlZXQ6OnNldENoYXJzZXQoIGNvbnN0IFFTdHJpbmcgJmNo
cyApCi17Ci0gICAgaWYgKCFjaHMuaXNFbXB0eSgpKQotICAgICAgICBtX2RlY29kZXItPnNldEVu
Y29kaW5nKGNocy5sYXRpbjEoKSwgRGVjb2Rlcjo6RW5jb2RpbmdGcm9tSFRUUEhlYWRlcik7Ci19
Ci0KLXZvaWQgQ2FjaGVkWFNMU3R5bGVTaGVldDo6ZGF0YShRQnVmZmVyICZidWZmZXIsIGJvb2wg
ZW9mKQotewotICAgIGlmKCFlb2YpIHJldHVybjsKLSAgICBidWZmZXIuY2xvc2UoKTsKLSAgICBz
ZXRTaXplKGJ1ZmZlci5idWZmZXIoKS5zaXplKCkpOwotICAgIFFTdHJpbmcgZGF0YSA9IG1fZGVj
b2Rlci0+ZGVjb2RlKGJ1ZmZlci5idWZmZXIoKS5kYXRhKCksIHNpemUoKSk7Ci0gICAgbV9zaGVl
dCA9IERPTVN0cmluZyhkYXRhKTsKLSAgICBtX2xvYWRpbmcgPSBmYWxzZTsKLSAgICAKLSAgICBj
aGVja05vdGlmeSgpOwotfQotCi12b2lkIENhY2hlZFhTTFN0eWxlU2hlZXQ6OmNoZWNrTm90aWZ5
KCkKLXsKLSAgICBpZiAobV9sb2FkaW5nKQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgQ2Fj
aGVkT2JqZWN0Q2xpZW50V2Fsa2VyIHcobV9jbGllbnRzKTsKLSAgICB3aGlsZSAoQ2FjaGVkT2Jq
ZWN0Q2xpZW50ICpjID0gdy5uZXh0KCkpCi0gICAgICAgIGMtPnNldFN0eWxlU2hlZXQobV91cmws
IG1fc2hlZXQpOwotfQotCi0KLXZvaWQgQ2FjaGVkWFNMU3R5bGVTaGVldDo6ZXJyb3IoIGludCAv
KmVyciovLCBjb25zdCBjaGFyICovKnRleHQqLyApCi17Ci0gICAgbV9sb2FkaW5nID0gZmFsc2U7
Ci0gICAgY2hlY2tOb3RpZnkoKTsKLX0KLQotI2VuZGlmCi0KLSNpZm5kZWYgS0hUTUxfTk9fWEJM
Ci1DYWNoZWRYQkxEb2N1bWVudDo6Q2FjaGVkWEJMRG9jdW1lbnQoRG9jTG9hZGVyKiBkbCwgY29u
c3QgRE9NU3RyaW5nICZ1cmwsIEtJTzo6Q2FjaGVDb250cm9sIF9jYWNoZVBvbGljeSwgdGltZV90
IF9leHBpcmVEYXRlKQotOiBDYWNoZWRPYmplY3QodXJsLCBYQkwsIF9jYWNoZVBvbGljeSwgX2V4
cGlyZURhdGUpLCBtX2RvY3VtZW50KDApCi17Ci0gICAgLy8gSXQncyBYTUwgd2Ugd2FudC4KLSAg
ICBzZXRBY2NlcHQoInRleHQveG1sLCBhcHBsaWNhdGlvbi94bWwsIGFwcGxpY2F0aW9uL3hodG1s
K3htbCwgdGV4dC94c2wsIGFwcGxpY2F0aW9uL3Jzcyt4bWwsIGFwcGxpY2F0aW9uL2F0b20reG1s
Iik7Ci0gICAgCi0gICAgLy8gTG9hZCB0aGUgZmlsZQotICAgIENhY2hlOjpsb2FkZXIoKS0+bG9h
ZChkbCwgdGhpcywgZmFsc2UpOwotICAgIG1fbG9hZGluZyA9IHRydWU7Ci0gICAgbV9kZWNvZGVy
ID0gbmV3IERlY29kZXI7Ci19Ci0KLUNhY2hlZFhCTERvY3VtZW50Ojp+Q2FjaGVkWEJMRG9jdW1l
bnQoKQotewotICAgIGlmIChtX2RvY3VtZW50KQotICAgICAgICBtX2RvY3VtZW50LT5kZXJlZigp
OwotfQotCi12b2lkIENhY2hlZFhCTERvY3VtZW50OjpyZWYoQ2FjaGVkT2JqZWN0Q2xpZW50ICpj
KQotewotICAgIENhY2hlZE9iamVjdDo6cmVmKGMpOwotICAgIGlmICghbV9sb2FkaW5nKQotICAg
ICAgICBjLT5zZXRYQkxEb2N1bWVudChtX3VybCwgbV9kb2N1bWVudCk7Ci19Ci0KLXZvaWQgQ2Fj
aGVkWEJMRG9jdW1lbnQ6OmRlcmVmKENhY2hlZE9iamVjdENsaWVudCAqYykKLXsKLSAgICBDYWNo
ZTo6Zmx1c2goKTsKLSAgICBDYWNoZWRPYmplY3Q6OmRlcmVmKGMpOwotICAgIGlmIChjYW5EZWxl
dGUoKSAmJiBtX2ZyZWUpCi0gICAgICAgIGRlbGV0ZSB0aGlzOwotfQotCi12b2lkIENhY2hlZFhC
TERvY3VtZW50OjpzZXRDaGFyc2V0KCBjb25zdCBRU3RyaW5nICZjaHMgKQotewotICAgIGlmICgh
Y2hzLmlzRW1wdHkoKSkKLSAgICAgICAgbV9kZWNvZGVyLT5zZXRFbmNvZGluZyhjaHMubGF0aW4x
KCksIERlY29kZXI6OkVuY29kaW5nRnJvbUhUVFBIZWFkZXIpOwotfQotCi12b2lkIENhY2hlZFhC
TERvY3VtZW50OjpkYXRhKCBRQnVmZmVyICZidWZmZXIsIGJvb2wgZW9mICkKLXsKLSAgICBpZiAo
IWVvZikgcmV0dXJuOwotICAgIAotICAgIGFzc2VydCghbV9kb2N1bWVudCk7Ci0gICAgCi0gICAg
bV9kb2N1bWVudCA9ICBuZXcgWEJMOjpYQkxEb2N1bWVudEltcGwoKTsKLSAgICBtX2RvY3VtZW50
LT5yZWYoKTsKLSAgICBtX2RvY3VtZW50LT5vcGVuKCk7Ci0gICAgCi0gICAgUVN0cmluZyBkYXRh
ID0gbV9kZWNvZGVyLT5kZWNvZGUoYnVmZmVyLmJ1ZmZlcigpLmRhdGEoKSwgYnVmZmVyLmJ1ZmZl
cigpLnNpemUoKSk7Ci0gICAgbV9kb2N1bWVudC0+d3JpdGUoZGF0YSk7Ci0gICAgc2V0U2l6ZShi
dWZmZXIuYnVmZmVyKCkuc2l6ZSgpKTsKLSAgICBidWZmZXIuY2xvc2UoKTsKLSAgICAKLSAgICBt
X2RvY3VtZW50LT5maW5pc2hQYXJzaW5nKCk7Ci0gICAgbV9kb2N1bWVudC0+Y2xvc2UoKTsKLSAg
ICBtX2xvYWRpbmcgPSBmYWxzZTsKLSAgICBjaGVja05vdGlmeSgpOwotfQotCi12b2lkIENhY2hl
ZFhCTERvY3VtZW50OjpjaGVja05vdGlmeSgpCi17Ci0gICAgaWYobV9sb2FkaW5nKQotICAgICAg
ICByZXR1cm47Ci0gICAgCi0gICAgQ2FjaGVkT2JqZWN0Q2xpZW50V2Fsa2VyIHcobV9jbGllbnRz
KTsKLSAgICB3aGlsZSAoQ2FjaGVkT2JqZWN0Q2xpZW50ICpjID0gdy5uZXh0KCkpCi0gICAgICAg
IGMtPnNldFhCTERvY3VtZW50KG1fdXJsLCBtX2RvY3VtZW50KTsKLX0KLQotCi12b2lkIENhY2hl
ZFhCTERvY3VtZW50OjplcnJvciggaW50IC8qZXJyKi8sIGNvbnN0IGNoYXIgKi8qdGV4dCovICkK
LXsKLSAgICBtX2xvYWRpbmcgPSBmYWxzZTsKLSAgICBjaGVja05vdGlmeSgpOwotfQotI2VuZGlm
Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1SZXF1ZXN0OjpSZXF1
ZXN0KERvY0xvYWRlciogZGwsIENhY2hlZE9iamVjdCAqX29iamVjdCwgYm9vbCBfaW5jcmVtZW50
YWwpCi17Ci0gICAgb2JqZWN0ID0gX29iamVjdDsKLSAgICBvYmplY3QtPnNldFJlcXVlc3QodGhp
cyk7Ci0gICAgaW5jcmVtZW50YWwgPSBfaW5jcmVtZW50YWw7Ci0gICAgbV9kb2NMb2FkZXIgPSBk
bDsKLSAgICBtdWx0aXBhcnQgPSBmYWxzZTsKLX0KLQotUmVxdWVzdDo6flJlcXVlc3QoKQotewot
ICAgIG9iamVjdC0+c2V0UmVxdWVzdCgwKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tCi0KLURvY0xvYWRlcjo6RG9jTG9hZGVyKEtIVE1MUGFydCogcGFydCwgRG9j
dW1lbnRJbXBsKiBkb2MpCi17Ci0gICAgbV9jYWNoZVBvbGljeSA9IEtJTzo6Q0NfVmVyaWZ5Owot
ICAgIG1fZXhwaXJlRGF0ZSA9IDA7Ci0gICAgbV9iYXV0b2xvYWRJbWFnZXMgPSB0cnVlOwotICAg
IG1fc2hvd0FuaW1hdGlvbnMgPSBLSFRNTFNldHRpbmdzOjpLQW5pbWF0aW9uRW5hYmxlZDsKLSAg
ICBtX3BhcnQgPSBwYXJ0OwotICAgIG1fZG9jID0gZG9jOwotICAgIG1fbG9hZEluUHJvZ3Jlc3Mg
PSBmYWxzZTsKLQotICAgIENhY2hlOjppbml0KCk7Ci0gICAgQ2FjaGU6OmRvY2xvYWRlci0+YXBw
ZW5kKCB0aGlzICk7Ci19Ci0KLURvY0xvYWRlcjo6fkRvY0xvYWRlcigpCi17Ci0gICAgQ2FjaGU6
OmRvY2xvYWRlci0+cmVtb3ZlKCB0aGlzICk7Ci19Ci0KLXZvaWQgRG9jTG9hZGVyOjpzZXRFeHBp
cmVEYXRlKHRpbWVfdCBfZXhwaXJlRGF0ZSkKLXsKLSAgICBtX2V4cGlyZURhdGUgPSBfZXhwaXJl
RGF0ZTsKLX0KLQotYm9vbCBEb2NMb2FkZXI6Om5lZWRSZWxvYWQoY29uc3QgS1VSTCAmZnVsbFVS
TCkKLXsKLSAgICBib29sIHJlbG9hZCA9IGZhbHNlOwotICAgIGlmIChtX2NhY2hlUG9saWN5ID09
IEtJTzo6Q0NfVmVyaWZ5KQotICAgIHsKLSAgICAgICBpZiAoIW1fcmVsb2FkZWRVUkxzLmNvbnRh
aW5zKGZ1bGxVUkwudXJsKCkpKQotICAgICAgIHsKLSAgICAgICAgICBDYWNoZWRPYmplY3QgKmV4
aXN0aW5nID0gQ2FjaGU6OmNhY2hlLT5maW5kKGZ1bGxVUkwudXJsKCkpOwotICAgICAgICAgIGlm
IChleGlzdGluZyAmJiBleGlzdGluZy0+aXNFeHBpcmVkKCkpCi0gICAgICAgICAgewotICAgICAg
ICAgICAgIENhY2hlOjpyZW1vdmVDYWNoZUVudHJ5KGV4aXN0aW5nKTsKLSAgICAgICAgICAgICBt
X3JlbG9hZGVkVVJMcy5hcHBlbmQoZnVsbFVSTC51cmwoKSk7Ci0gICAgICAgICAgICAgcmVsb2Fk
ID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmICgobV9j
YWNoZVBvbGljeSA9PSBLSU86OkNDX1JlbG9hZCkgfHwgKG1fY2FjaGVQb2xpY3kgPT0gS0lPOjpD
Q19SZWZyZXNoKSkKLSAgICB7Ci0gICAgICAgaWYgKCFtX3JlbG9hZGVkVVJMcy5jb250YWlucyhm
dWxsVVJMLnVybCgpKSkKLSAgICAgICB7Ci0gICAgICAgICAgQ2FjaGVkT2JqZWN0ICpleGlzdGlu
ZyA9IENhY2hlOjpjYWNoZS0+ZmluZChmdWxsVVJMLnVybCgpKTsKLSAgICAgICAgICBpZiAoZXhp
c3RpbmcpCi0gICAgICAgICAgewotICAgICAgICAgICAgIENhY2hlOjpyZW1vdmVDYWNoZUVudHJ5
KGV4aXN0aW5nKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgbV9yZWxvYWRlZFVSTHMuYXBwZW5k
KGZ1bGxVUkwudXJsKCkpOwotICAgICAgICAgIHJlbG9hZCA9IHRydWU7Ci0gICAgICAgfQotICAg
IH0KLSAgICByZXR1cm4gcmVsb2FkOwotfQotCi1DYWNoZWRJbWFnZSAqRG9jTG9hZGVyOjpyZXF1
ZXN0SW1hZ2UoIGNvbnN0IERPTTo6RE9NU3RyaW5nICZ1cmwpCi17Ci0gICAgS1VSTCBmdWxsVVJM
ID0gbV9kb2MtPmNvbXBsZXRlVVJMKHVybC5xc3RyaW5nKCkpOwotICAgIGlmICggbV9wYXJ0ICYm
IG1fcGFydC0+b25seUxvY2FsUmVmZXJlbmNlcygpICYmIGZ1bGxVUkwucHJvdG9jb2woKSAhPSAi
ZmlsZSIpIHJldHVybiAwOwotCi0gICAgaWYgKEtXUUNoZWNrSWZSZWxvYWRpbmcodGhpcykpIHsK
LSAgICAgICAgc2V0Q2FjaGVQb2xpY3koS0lPOjpDQ19SZWxvYWQpOwotICAgIH0KLQotICAgIGJv
b2wgcmVsb2FkID0gbmVlZFJlbG9hZChmdWxsVVJMKTsKLQotICAgIENhY2hlZEltYWdlICpjYWNo
ZWRPYmplY3QgPSBDYWNoZTo6cmVxdWVzdEltYWdlKHRoaXMsIGZ1bGxVUkwsIHJlbG9hZCwgbV9l
eHBpcmVEYXRlKTsKLSAgICBLV1FDaGVja0NhY2hlT2JqZWN0U3RhdHVzKHRoaXMsIGNhY2hlZE9i
amVjdCk7Ci0gICAgcmV0dXJuIGNhY2hlZE9iamVjdDsKLX0KLQotQ2FjaGVkQ1NTU3R5bGVTaGVl
dCAqRG9jTG9hZGVyOjpyZXF1ZXN0U3R5bGVTaGVldCggY29uc3QgRE9NOjpET01TdHJpbmcgJnVy
bCwgY29uc3QgUVN0cmluZyYgY2hhcnNldCkKLXsKLSAgICBLVVJMIGZ1bGxVUkwgPSBtX2RvYy0+
Y29tcGxldGVVUkwodXJsLnFzdHJpbmcoKSk7Ci0gICAgaWYgKCBtX3BhcnQgJiYgbV9wYXJ0LT5v
bmx5TG9jYWxSZWZlcmVuY2VzKCkgJiYgZnVsbFVSTC5wcm90b2NvbCgpICE9ICJmaWxlIikgcmV0
dXJuIDA7Ci0KLSAgICBpZiAoS1dRQ2hlY2tJZlJlbG9hZGluZyh0aGlzKSkgewotICAgICAgICBz
ZXRDYWNoZVBvbGljeShLSU86OkNDX1JlbG9hZCk7Ci0gICAgfQotCi0gICAgYm9vbCByZWxvYWQg
PSBuZWVkUmVsb2FkKGZ1bGxVUkwpOwotCi0gICAgQ2FjaGVkQ1NTU3R5bGVTaGVldCAqY2FjaGVk
T2JqZWN0ID0gQ2FjaGU6OnJlcXVlc3RTdHlsZVNoZWV0KHRoaXMsIHVybCwgcmVsb2FkLCBtX2V4
cGlyZURhdGUsIGNoYXJzZXQpOwotICAgIEtXUUNoZWNrQ2FjaGVPYmplY3RTdGF0dXModGhpcywg
Y2FjaGVkT2JqZWN0KTsKLSAgICByZXR1cm4gY2FjaGVkT2JqZWN0OwotfQotCi1DYWNoZWRTY3Jp
cHQgKkRvY0xvYWRlcjo6cmVxdWVzdFNjcmlwdCggY29uc3QgRE9NOjpET01TdHJpbmcgJnVybCwg
Y29uc3QgUVN0cmluZyYgY2hhcnNldCkKLXsKLSAgICBLVVJMIGZ1bGxVUkwgPSBtX2RvYy0+Y29t
cGxldGVVUkwodXJsLnFzdHJpbmcoKSk7Ci0gICAgaWYgKCBtX3BhcnQgJiYgbV9wYXJ0LT5vbmx5
TG9jYWxSZWZlcmVuY2VzKCkgJiYgZnVsbFVSTC5wcm90b2NvbCgpICE9ICJmaWxlIikgcmV0dXJu
IDA7Ci0KLSAgICBpZiAoS1dRQ2hlY2tJZlJlbG9hZGluZyh0aGlzKSkgewotICAgICAgICBzZXRD
YWNoZVBvbGljeShLSU86OkNDX1JlbG9hZCk7Ci0gICAgfQotCi0gICAgYm9vbCByZWxvYWQgPSBu
ZWVkUmVsb2FkKGZ1bGxVUkwpOwotCi0gICAgQ2FjaGVkU2NyaXB0ICpjYWNoZWRPYmplY3QgPSBD
YWNoZTo6cmVxdWVzdFNjcmlwdCh0aGlzLCB1cmwsIHJlbG9hZCwgbV9leHBpcmVEYXRlLCBjaGFy
c2V0KTsKLSAgICBLV1FDaGVja0NhY2hlT2JqZWN0U3RhdHVzKHRoaXMsIGNhY2hlZE9iamVjdCk7
Ci0gICAgcmV0dXJuIGNhY2hlZE9iamVjdDsKLX0KLQotI2lmZGVmIEtIVE1MX1hTTFQKLUNhY2hl
ZFhTTFN0eWxlU2hlZXQqIERvY0xvYWRlcjo6cmVxdWVzdFhTTFN0eWxlU2hlZXQoY29uc3QgRE9N
OjpET01TdHJpbmcgJnVybCkKLXsKLSAgICBLVVJMIGZ1bGxVUkwgPSBtX2RvYy0+Y29tcGxldGVV
UkwodXJsLnFzdHJpbmcoKSk7Ci0gICAgCi0gICAgaWYgKG1fcGFydCAmJiBtX3BhcnQtPm9ubHlM
b2NhbFJlZmVyZW5jZXMoKSAmJiBmdWxsVVJMLnByb3RvY29sKCkgIT0gImZpbGUiKSByZXR1cm4g
MDsKLSAgICAKLSAgICBpZiAoS1dRQ2hlY2tJZlJlbG9hZGluZyh0aGlzKSkKLSAgICAgICAgc2V0
Q2FjaGVQb2xpY3koS0lPOjpDQ19SZWxvYWQpOwotICAgIAotICAgIGJvb2wgcmVsb2FkID0gbmVl
ZFJlbG9hZChmdWxsVVJMKTsKLSAgICAKLSAgICBDYWNoZWRYU0xTdHlsZVNoZWV0ICpjYWNoZWRP
YmplY3QgPSBDYWNoZTo6cmVxdWVzdFhTTFN0eWxlU2hlZXQodGhpcywgdXJsLCByZWxvYWQsIG1f
ZXhwaXJlRGF0ZSk7Ci0gICAgS1dRQ2hlY2tDYWNoZU9iamVjdFN0YXR1cyh0aGlzLCBjYWNoZWRP
YmplY3QpOwotICAgIHJldHVybiBjYWNoZWRPYmplY3Q7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBL
SFRNTF9OT19YQkwKLUNhY2hlZFhCTERvY3VtZW50KiBEb2NMb2FkZXI6OnJlcXVlc3RYQkxEb2N1
bWVudChjb25zdCBET006OkRPTVN0cmluZyAmdXJsKQotewotICAgIEtVUkwgZnVsbFVSTCA9IG1f
ZG9jLT5jb21wbGV0ZVVSTCh1cmwucXN0cmluZygpKTsKLSAgICAKLSAgICAvLyBGSVhNRTogSXMg
dGhpcyByaWdodCBmb3IgWEJMPwotICAgIGlmIChtX3BhcnQgJiYgbV9wYXJ0LT5vbmx5TG9jYWxS
ZWZlcmVuY2VzKCkgJiYgZnVsbFVSTC5wcm90b2NvbCgpICE9ICJmaWxlIikgcmV0dXJuIDA7Ci0g
ICAgCi0gICAgaWYgKEtXUUNoZWNrSWZSZWxvYWRpbmcodGhpcykpIHsKLSAgICAgICAgc2V0Q2Fj
aGVQb2xpY3koS0lPOjpDQ19SZWxvYWQpOwotICAgIH0KLSAgICAKLSAgICBib29sIHJlbG9hZCA9
IG5lZWRSZWxvYWQoZnVsbFVSTCk7Ci0gICAgCi0gICAgQ2FjaGVkWEJMRG9jdW1lbnQgKmNhY2hl
ZE9iamVjdCA9IENhY2hlOjpyZXF1ZXN0WEJMRG9jdW1lbnQodGhpcywgdXJsLCByZWxvYWQsIG1f
ZXhwaXJlRGF0ZSk7Ci0gICAgS1dRQ2hlY2tDYWNoZU9iamVjdFN0YXR1cyh0aGlzLCBjYWNoZWRP
YmplY3QpOwotICAgIHJldHVybiBjYWNoZWRPYmplY3Q7Ci19Ci0jZW5kaWYKLQotdm9pZCBEb2NM
b2FkZXI6OnNldEF1dG9sb2FkSW1hZ2VzKCBib29sIGVuYWJsZSApCi17Ci0gICAgaWYgKCBlbmFi
bGUgPT0gbV9iYXV0b2xvYWRJbWFnZXMgKQotICAgICAgICByZXR1cm47Ci0KLSAgICBtX2JhdXRv
bG9hZEltYWdlcyA9IGVuYWJsZTsKLQotICAgIGlmICggIW1fYmF1dG9sb2FkSW1hZ2VzICkgcmV0
dXJuOwotCi0gICAgZm9yICggY29uc3QgQ2FjaGVkT2JqZWN0KiBjbz1tX2RvY09iamVjdHMuZmly
c3QoKTsgY287IGNvPW1fZG9jT2JqZWN0cy5uZXh0KCkgKQotICAgICAgICBpZiAoIGNvLT50eXBl
KCkgPT0gQ2FjaGVkT2JqZWN0OjpJbWFnZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIENhY2hl
ZEltYWdlICppbWcgPSBjb25zdF9jYXN0PENhY2hlZEltYWdlKj4oIHN0YXRpY19jYXN0PGNvbnN0
IENhY2hlZEltYWdlICo+KCBjbyApICk7Ci0KLSAgICAgICAgICAgIENhY2hlZE9iamVjdDo6U3Rh
dHVzIHN0YXR1cyA9IGltZy0+c3RhdHVzKCk7Ci0gICAgICAgICAgICBpZiAoIHN0YXR1cyAhPSBD
YWNoZWRPYmplY3Q6OlVua25vd24gKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAg
ICAgICAgICBDYWNoZTo6bG9hZGVyKCktPmxvYWQodGhpcywgaW1nLCB0cnVlKTsKLSAgICAgICAg
fQotfQotCi12b2lkIERvY0xvYWRlcjo6c2V0Q2FjaGVQb2xpY3koIEtJTzo6Q2FjaGVDb250cm9s
IGNhY2hlUG9saWN5ICkKLXsKLSAgICBtX2NhY2hlUG9saWN5ID0gY2FjaGVQb2xpY3k7Ci19Ci0K
LXZvaWQgRG9jTG9hZGVyOjpzZXRTaG93QW5pbWF0aW9ucyggS0hUTUxTZXR0aW5nczo6S0FuaW1h
dGlvbkFkdmljZSBzaG93QW5pbWF0aW9ucyApCi17Ci0gICAgaWYgKCBzaG93QW5pbWF0aW9ucyA9
PSBtX3Nob3dBbmltYXRpb25zICkgcmV0dXJuOwotICAgIG1fc2hvd0FuaW1hdGlvbnMgPSBzaG93
QW5pbWF0aW9uczsKLQotICAgIGNvbnN0IENhY2hlZE9iamVjdCogY287Ci0gICAgZm9yICggY289
bV9kb2NPYmplY3RzLmZpcnN0KCk7IGNvOyBjbz1tX2RvY09iamVjdHMubmV4dCgpICkKLSAgICAg
ICAgaWYgKCBjby0+dHlwZSgpID09IENhY2hlZE9iamVjdDo6SW1hZ2UgKQotICAgICAgICB7Ci0g
ICAgICAgICAgICBDYWNoZWRJbWFnZSAqaW1nID0gY29uc3RfY2FzdDxDYWNoZWRJbWFnZSo+KCBz
dGF0aWNfY2FzdDxjb25zdCBDYWNoZWRJbWFnZSAqPiggY28gKSApOwotCi0gICAgICAgICAgICBp
bWctPnNldFNob3dBbmltYXRpb25zKCBzaG93QW5pbWF0aW9ucyApOwotICAgICAgICB9Ci19Ci0K
LXZvaWQgRG9jTG9hZGVyOjpyZW1vdmVDYWNoZWRPYmplY3QoIENhY2hlZE9iamVjdCogbyApIGNv
bnN0Ci17Ci0gICAgbV9kb2NPYmplY3RzLnJlbW92ZVJlZiggbyApOwotfQotCi12b2lkIERvY0xv
YWRlcjo6c2V0TG9hZEluUHJvZ3Jlc3MoYm9vbCBsb2FkKQotewotICAgIG1fbG9hZEluUHJvZ3Jl
c3MgPSBsb2FkOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQot
TG9hZGVyOjpMb2FkZXIoKSA6IFFPYmplY3QoKQotewotICAgIG1fcmVxdWVzdHNQZW5kaW5nLnNl
dEF1dG9EZWxldGUoIHRydWUgKTsKLSAgICBtX3JlcXVlc3RzTG9hZGluZy5zZXRBdXRvRGVsZXRl
KCB0cnVlICk7Ci0gICAga3dxID0gbmV3IEtXUUxvYWRlcih0aGlzKTsKLX0KLQotTG9hZGVyOjp+
TG9hZGVyKCkKLXsKLSAgICBkZWxldGUga3dxOwotfQotCi12b2lkIExvYWRlcjo6bG9hZChEb2NM
b2FkZXIqIGRsLCBDYWNoZWRPYmplY3QgKm9iamVjdCwgYm9vbCBpbmNyZW1lbnRhbCkKLXsKLSAg
ICBSZXF1ZXN0ICpyZXEgPSBuZXcgUmVxdWVzdChkbCwgb2JqZWN0LCBpbmNyZW1lbnRhbCk7Ci0g
ICAgbV9yZXF1ZXN0c1BlbmRpbmcuYXBwZW5kKHJlcSk7Ci0KLSAgICBlbWl0IHJlcXVlc3RTdGFy
dGVkKCByZXEtPm1fZG9jTG9hZGVyLCByZXEtPm9iamVjdCApOwotCi0gICAgc2VydmVQZW5kaW5n
UmVxdWVzdHMoKTsKLX0KLQotdm9pZCBMb2FkZXI6OnNlcnZlUGVuZGluZ1JlcXVlc3RzKCkKLXsK
LSAgaWYgKCBtX3JlcXVlc3RzUGVuZGluZy5jb3VudCgpID09IDAgKQotICAgICAgcmV0dXJuOwot
Ci0gIC8vIGdldCB0aGUgZmlyc3QgcGVuZGluZyByZXF1ZXN0Ci0gIFJlcXVlc3QgKnJlcSA9IG1f
cmVxdWVzdHNQZW5kaW5nLnRha2UoMCk7Ci0KLSAgS1VSTCB1KHJlcS0+b2JqZWN0LT51cmwoKS5x
c3RyaW5nKCkpOwotICBLSU86OlRyYW5zZmVySm9iKiBqb2IgPSBLSU86OmdldCggdSwgZmFsc2Us
IGZhbHNlIC8qbm8gR1VJKi8sIHRydWUpOwotICAKLSAgam9iLT5hZGRNZXRhRGF0YSgiY2FjaGUi
LCBnZXRDYWNoZUNvbnRyb2xTdHJpbmcocmVxLT5vYmplY3QtPmNhY2hlUG9saWN5KCkpKTsKLSAg
aWYgKCFyZXEtPm9iamVjdC0+YWNjZXB0KCkuaXNFbXB0eSgpKQotICAgICAgam9iLT5hZGRNZXRh
RGF0YSgiYWNjZXB0IiwgcmVxLT5vYmplY3QtPmFjY2VwdCgpKTsKLSAgaWYgKCByZXEtPm1fZG9j
TG9hZGVyICkgIHsKLSAgICAgIEtVUkwgciA9IHJlcS0+bV9kb2NMb2FkZXItPmRvYygpLT5VUkwo
KTsKLSAgICAgIGlmICggci5wcm90b2NvbCgpLnN0YXJ0c1dpdGgoICJodHRwIiApICYmIHIucGF0
aCgpLmlzRW1wdHkoKSApCi0gICAgICAgICAgci5zZXRQYXRoKCAiLyIgKTsKLQotICAgICAgam9i
LT5hZGRNZXRhRGF0YSgicmVmZXJyZXIiLCByLnVybCgpKTsKLSAgICAgIFFTdHJpbmcgZG9tYWlu
ID0gci5ob3N0KCk7Ci0gICAgICBpZiAocmVxLT5tX2RvY0xvYWRlci0+ZG9jKCktPmlzSFRNTERv
Y3VtZW50KCkpCi0gICAgICAgICBkb21haW4gPSBzdGF0aWNfY2FzdDxIVE1MRG9jdW1lbnRJbXBs
Kj4ocmVxLT5tX2RvY0xvYWRlci0+ZG9jKCkpLT5kb21haW4oKS5xc3RyaW5nKCk7Ci0gICAgICBp
ZiAoY3Jvc3NEb21haW4odS5ob3N0KCksIGRvbWFpbikpCi0gICAgICAgICBqb2ItPmFkZE1ldGFE
YXRhKCJjcm9zcy1kb21haW4iLCAidHJ1ZSIpOwotICB9Ci0KLSAgY29ubmVjdCggam9iLCBTSUdO
QUwoIHJlc3VsdCggS0lPOjpKb2IgKiwgTlNEYXRhICopICksIHRoaXMsIFNMT1QoIHNsb3RGaW5p
c2hlZCggS0lPOjpKb2IgKiwgTlNEYXRhICopICkgKTsKLSAgCi0gIGNvbm5lY3QoIGpvYiwgU0lH
TkFMKCBkYXRhKCBLSU86OkpvYiosIGNvbnN0IGNoYXIgKiwgaW50KSksCi0gICAgICAgICAgIFNM
T1QoIHNsb3REYXRhKCBLSU86OkpvYiosIGNvbnN0IGNoYXIgKiwgaW50KSkpOwotICBjb25uZWN0
KCBqb2IsIFNJR05BTCggcmVjZWl2ZWRSZXNwb25zZSggS0lPOjpKb2IgKiwgTlNVUkxSZXNwb25z
ZSAqKSksIFNMT1QoIHNsb3RSZWNlaXZlZFJlc3BvbnNlKCBLSU86OkpvYiAqLCBOU1VSTFJlc3Bv
bnNlICopKSApOwotCi0gIGlmIChLV1FTZXJ2ZVJlcXVlc3QodGhpcywgcmVxLCBqb2IpKSB7Ci0g
ICAgICBpZiAocmVxLT5vYmplY3QtPnR5cGUoKSA9PSBDYWNoZWRPYmplY3Q6OkltYWdlKSB7Ci0J
Q2FjaGVkSW1hZ2UgKmNpID0gc3RhdGljX2Nhc3Q8Q2FjaGVkSW1hZ2UqPihyZXEtPm9iamVjdCk7
Ci0JaWYgKGNpLT5kZWNvZGVyQ2FsbGJhY2soKSkgewotCSAgICBtX3JlcXVlc3RzQmFja2dyb3Vu
ZERlY29kaW5nLmFwcGVuZChyZXEpOwotCX0KLSAgICAgIH0KLSAgICAgIG1fcmVxdWVzdHNMb2Fk
aW5nLmluc2VydChqb2IsIHJlcSk7Ci0gIH0KLX0KLQotdm9pZCBMb2FkZXI6OnNsb3RGaW5pc2hl
ZCggS0lPOjpKb2IqIGpvYiwgTlNEYXRhICphbGxEYXRhKQotewotICAgIFJlcXVlc3QgKnIgPSBt
X3JlcXVlc3RzTG9hZGluZy50YWtlKCBqb2IgKTsKLSAgICBLSU86OlRyYW5zZmVySm9iKiBqID0g
c3RhdGljX2Nhc3Q8S0lPOjpUcmFuc2ZlckpvYio+KGpvYik7Ci0KLSAgICBpZiAoICFyICkKLSAg
ICAgICAgcmV0dXJuOwotCi0gICAgQ2FjaGVkT2JqZWN0ICpvYmplY3QgPSByLT5vYmplY3Q7Ci0g
ICAgRG9jTG9hZGVyICpkb2NMb2FkZXIgPSByLT5tX2RvY0xvYWRlcjsKLSAgICAKLSAgICBib29s
IGJhY2tncm91bmRJbWFnZURlY29kaW5nID0gKG9iamVjdC0+dHlwZSgpID09IENhY2hlZE9iamVj
dDo6SW1hZ2UgJiYgCi0Jc3RhdGljX2Nhc3Q8Q2FjaGVkSW1hZ2UqPihvYmplY3QpLT5kZWNvZGVy
Q2FsbGJhY2soKSk7Ci0JCi0gICAgaWYgKGotPmVycm9yKCkgfHwgai0+aXNFcnJvclBhZ2UoKSkg
ewotICAgICAgICAvLyBVc2UgdGhlIGJhY2tncm91bmQgaW1hZ2UgZGVjb2RlcidzIGNhbGxiYWNr
IHRvIGhhbmRsZSB0aGUgZXJyb3IuCi0gICAgICAgIGlmIChiYWNrZ3JvdW5kSW1hZ2VEZWNvZGlu
ZykgewotICAgICAgICAgICAgQ2FjaGVkSW1hZ2VDYWxsYmFjayAqY2FsbGJhY2sgPSBzdGF0aWNf
Y2FzdDxDYWNoZWRJbWFnZSo+KG9iamVjdCktPmRlY29kZXJDYWxsYmFjaygpOwotICAgICAgICAg
ICAgY2FsbGJhY2stPmhhbmRsZUVycm9yKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0g
ICAgICAgICAgICBkb2NMb2FkZXItPnNldExvYWRJblByb2dyZXNzKHRydWUpOwotICAgICAgICAg
ICAgci0+b2JqZWN0LT5lcnJvciggam9iLT5lcnJvcigpLCBqb2ItPmVycm9yVGV4dCgpLmFzY2lp
KCkgKTsKLSAgICAgICAgICAgIGRvY0xvYWRlci0+c2V0TG9hZEluUHJvZ3Jlc3MoZmFsc2UpOwot
ICAgICAgICAgICAgZW1pdCByZXF1ZXN0RmFpbGVkKCBkb2NMb2FkZXIsIG9iamVjdCApOwotICAg
ICAgICAgICAgQ2FjaGU6OnJlbW92ZUNhY2hlRW50cnkoIG9iamVjdCApOwotICAgICAgICB9Ci0g
ICAgfQotICAgIGVsc2UgewotICAgICAgICBkb2NMb2FkZXItPnNldExvYWRJblByb2dyZXNzKHRy
dWUpOwotICAgICAgICBvYmplY3QtPmRhdGEoci0+bV9idWZmZXIsIHRydWUpOwotICAgICAgICBy
LT5vYmplY3QtPnNldEFsbERhdGEoYWxsRGF0YSk7Ci0gICAgICAgIGRvY0xvYWRlci0+c2V0TG9h
ZEluUHJvZ3Jlc3MoZmFsc2UpOwotICAgICAgICAKLSAgICAgICAgLy8gTGV0IHRoZSBiYWNrZ3Jv
dW5kIGltYWdlIGRlY29kZXIgdHJpZ2dlciB0aGUgZG9uZSBzaWduYWwuCi0gICAgICAgIGlmICgh
YmFja2dyb3VuZEltYWdlRGVjb2RpbmcpCi0gICAgICAgICAgICBlbWl0IHJlcXVlc3REb25lKCBk
b2NMb2FkZXIsIG9iamVjdCApOwotCi0gICAgICAgIG9iamVjdC0+ZmluaXNoKCk7Ci0gICAgfQot
Ci0gICAgLy8gTGV0IHRoZSBiYWNrZ3JvdW5kIGltYWdlIGRlY29kZXIgcmVsZWFzZSB0aGUgcmVx
dWVzdCB3aGVuIGl0IGlzCi0gICAgLy8gZmluaXNoZWQuCi0gICAgaWYgKCFiYWNrZ3JvdW5kSW1h
Z2VEZWNvZGluZykgewotICAgICAgICBkZWxldGUgcjsKLSAgICB9Ci0KLSAgICBzZXJ2ZVBlbmRp
bmdSZXF1ZXN0cygpOwotfQotCi0KLXZvaWQgTG9hZGVyOjpzbG90UmVjZWl2ZWRSZXNwb25zZShL
SU86OkpvYiogam9iLCBOU1VSTFJlc3BvbnNlICpyZXNwb25zZSkKLXsKLSAgICBSZXF1ZXN0ICpy
ID0gbV9yZXF1ZXN0c0xvYWRpbmdbam9iXTsKLSAgICBBU1NFUlQocik7Ci0gICAgQVNTRVJUKHJl
c3BvbnNlKTsKLSAgICByLT5vYmplY3QtPnNldFJlc3BvbnNlKHJlc3BvbnNlKTsKLSAgICByLT5v
YmplY3QtPnNldEV4cGlyZURhdGUoS1dRQ2FjaGVPYmplY3RFeHBpcmVzVGltZShyLT5tX2RvY0xv
YWRlciwgcmVzcG9uc2UpLCBmYWxzZSk7Ci0gICAgCi0gICAgUVN0cmluZyBjaHMgPSBzdGF0aWNf
Y2FzdDxLSU86OlRyYW5zZmVySm9iKj4oam9iKS0+cXVlcnlNZXRhRGF0YSgiY2hhcnNldCIpOwot
ICAgIGlmICghY2hzLmlzTnVsbCgpKQotICAgICAgICByLT5vYmplY3QtPnNldENoYXJzZXQoY2hz
KTsKLSAgICAKLSAgICBpZiAoci0+bXVsdGlwYXJ0KSB7Ci0gICAgICAgIEFTU0VSVChyLT5vYmpl
Y3QtPmlzSW1hZ2UoKSk7Ci0gICAgICAgIHN0YXRpY19jYXN0PENhY2hlZEltYWdlICo+KHItPm9i
amVjdCktPmNsZWFyKCk7Ci0gICAgICAgIHItPm1fYnVmZmVyID0gUUJ1ZmZlcigpOwotICAgICAg
ICBpZiAoci0+bV9kb2NMb2FkZXItPnBhcnQoKSkKLSAgICAgICAgICAgIHItPm1fZG9jTG9hZGVy
LT5wYXJ0KCktPmNoZWNrQ29tcGxldGVkKCk7Ci0gICAgICAgIAotICAgIH0gZWxzZSBpZiAoS1dR
UmVzcG9uc2VJc011bHRpcGFydChyZXNwb25zZSkpIHsKLSAgICAgICAgci0+bXVsdGlwYXJ0ID0g
dHJ1ZTsKLSAgICAgICAgaWYgKCFyLT5vYmplY3QtPmlzSW1hZ2UoKSkKLSAgICAgICAgICAgIHN0
YXRpY19jYXN0PEtJTzo6VHJhbnNmZXJKb2IqPihqb2IpLT5jYW5jZWwoKTsKLSAgICB9Ci19Ci0K
LQotdm9pZCBMb2FkZXI6OnNsb3REYXRhKCBLSU86OkpvYipqb2IsIGNvbnN0IGNoYXIgKmRhdGEs
IGludCBzaXplICkKLXsKLSAgICBSZXF1ZXN0ICpyID0gbV9yZXF1ZXN0c0xvYWRpbmdbam9iXTsK
LSAgICBpZighcikgewotICAgICAgICBrZERlYnVnKCA2MDYwICkgPDwgImdvdCBkYXRhIGZvciB1
bmtub3duIHJlcXVlc3QhIiA8PCBlbmRsOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAg
aWYgKCAhci0+bV9idWZmZXIuaXNPcGVuKCkgKQotICAgICAgICByLT5tX2J1ZmZlci5vcGVuKCBJ
T19Xcml0ZU9ubHkgKTsKLQotICAgIHItPm1fYnVmZmVyLndyaXRlQmxvY2soIGRhdGEsIHNpemUg
KTsKLQotICAgIGlmIChyLT5tdWx0aXBhcnQpCi0gICAgICAgIHItPm9iamVjdC0+ZGF0YSggci0+
bV9idWZmZXIsIHRydWUgKTsgLy8gdGhlIGxvYWRlciBkZWxpdmVycyB0aGUgZGF0YSBpbiBhIG11
bHRpcGFydCBzZWN0aW9uIGFsbCBhdCBvbmNlLCBzZW5kIGVvZgotICAgIGVsc2UgaWYoci0+aW5j
cmVtZW50YWwpCi0gICAgICAgIHItPm9iamVjdC0+ZGF0YSggci0+bV9idWZmZXIsIGZhbHNlICk7
Ci19Ci0KLWludCBMb2FkZXI6Om51bVJlcXVlc3RzKCBEb2NMb2FkZXIqIGRsICkgY29uc3QKLXsK
LSAgICBpbnQgcmVzID0gMDsKLQotICAgIFFQdHJMaXN0SXRlcmF0b3I8UmVxdWVzdD4gcEl0KCBt
X3JlcXVlc3RzUGVuZGluZyApOwotICAgIGZvciAoOyBwSXQuY3VycmVudCgpOyArK3BJdCApCi0g
ICAgICAgIGlmICggcEl0LmN1cnJlbnQoKS0+bV9kb2NMb2FkZXIgPT0gZGwgKQotICAgICAgICAg
ICAgcmVzKys7Ci0KLSAgICBRUHRyRGljdEl0ZXJhdG9yPFJlcXVlc3Q+IGxJdCggbV9yZXF1ZXN0
c0xvYWRpbmcgKTsKLSAgICBmb3IgKDsgbEl0LmN1cnJlbnQoKTsgKytsSXQgKQotICAgICAgICBp
ZiAoIGxJdC5jdXJyZW50KCktPm1fZG9jTG9hZGVyID09IGRsICkKLSAgICAgICAgICAgIGlmICgh
bEl0LmN1cnJlbnQoKS0+bXVsdGlwYXJ0KQotICAgICAgICAgICAgICAgIHJlcysrOwotCi0gICAg
UVB0ckxpc3RJdGVyYXRvcjxSZXF1ZXN0PiBiZEl0KCBtX3JlcXVlc3RzQmFja2dyb3VuZERlY29k
aW5nICk7Ci0gICAgZm9yICg7IGJkSXQuY3VycmVudCgpOyArK2JkSXQgKQotICAgICAgICBpZiAo
IGJkSXQuY3VycmVudCgpLT5tX2RvY0xvYWRlciA9PSBkbCApCi0gICAgICAgICAgICByZXMrKzsK
LQotICAgIGlmIChkbC0+bG9hZEluUHJvZ3Jlc3MoKSkKLSAgICAgICAgcmVzKys7Ci0gICAgICAg
IAotICAgIHJldHVybiByZXM7Ci19Ci0KLXZvaWQgTG9hZGVyOjpjYW5jZWxSZXF1ZXN0cyggRG9j
TG9hZGVyKiBkbCApCi17Ci0gICAgUVB0ckxpc3RJdGVyYXRvcjxSZXF1ZXN0PiBwSXQoIG1fcmVx
dWVzdHNQZW5kaW5nICk7Ci0gICAgd2hpbGUgKCBwSXQuY3VycmVudCgpICkKLSAgICB7Ci0gICAg
ICAgIGlmIChwSXQuY3VycmVudCgpLT5tX2RvY0xvYWRlciA9PSBkbCkgewotICAgICAgICAgICAg
Q2FjaGU6OnJlbW92ZUNhY2hlRW50cnkoIHBJdC5jdXJyZW50KCktPm9iamVjdCApOwotICAgICAg
ICAgICAgbV9yZXF1ZXN0c1BlbmRpbmcucmVtb3ZlKCBwSXQgKTsKLSAgICAgICAgfQotICAgICAg
ICBlbHNlCi0gICAgICAgICAgICArK3BJdDsKLSAgICB9Ci0KLSAgICBRUHRyRGljdEl0ZXJhdG9y
PFJlcXVlc3Q+IGxJdCggbV9yZXF1ZXN0c0xvYWRpbmcgKTsKLSAgICB3aGlsZSAoIGxJdC5jdXJy
ZW50KCkgKQotICAgIHsKLSAgICAgICAgaWYgKGxJdC5jdXJyZW50KCktPm1fZG9jTG9hZGVyID09
IGRsKSB7Ci0gICAgICAgICAgICBLSU86OkpvYiAqam9iID0gc3RhdGljX2Nhc3Q8S0lPOjpKb2Ig
Kj4oIGxJdC5jdXJyZW50S2V5KCkgKTsKLSAgICAgICAgICAgIENhY2hlOjpyZW1vdmVDYWNoZUVu
dHJ5KCBsSXQuY3VycmVudCgpLT5vYmplY3QgKTsKLSAgICAgICAgICAgIG1fcmVxdWVzdHNMb2Fk
aW5nLnJlbW92ZSggbEl0LmN1cnJlbnRLZXkoKSApOwotICAgICAgICAgICAgam9iLT5raWxsKCk7
Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgKytsSXQ7Ci0gICAgfQotCi0g
ICAgUVB0ckxpc3RJdGVyYXRvcjxSZXF1ZXN0PiBiZEl0KCBtX3JlcXVlc3RzQmFja2dyb3VuZERl
Y29kaW5nICk7Ci0gICAgd2hpbGUgKGJkSXQuY3VycmVudCgpKSB7Ci0gICAgICAgIGlmIChiZEl0
LmN1cnJlbnQoKS0+bV9kb2NMb2FkZXIgPT0gZGwpIHsKLSAgICAgICAgICAgIENhY2hlOjpyZW1v
dmVDYWNoZUVudHJ5KCBiZEl0LmN1cnJlbnQoKS0+b2JqZWN0ICk7Ci0gICAgICAgICAgICBtX3Jl
cXVlc3RzQmFja2dyb3VuZERlY29kaW5nLnJlbW92ZSggYmRJdCApOwotICAgICAgICB9Ci0gICAg
ICAgIGVsc2UKLSAgICAgICAgICAgICsrYmRJdDsKLSAgICB9Ci19Ci0KLXZvaWQgTG9hZGVyOjpy
ZW1vdmVCYWNrZ3JvdW5kRGVjb2RpbmdSZXF1ZXN0IChSZXF1ZXN0ICpyKQotewotICAgIGJvb2wg
cHJlc2VudCA9IG1fcmVxdWVzdHNCYWNrZ3JvdW5kRGVjb2RpbmcuY29udGFpbnNSZWYocik7Ci0g
ICAgaWYgKHByZXNlbnQpIHsKLQltX3JlcXVlc3RzQmFja2dyb3VuZERlY29kaW5nLnJlbW92ZSAo
cik7Ci0gICAgfQotfQotCi1LSU86OkpvYiAqTG9hZGVyOjpqb2JGb3JSZXF1ZXN0KCBjb25zdCBE
T006OkRPTVN0cmluZyAmdXJsICkgY29uc3QKLXsKLSAgICBRUHRyRGljdEl0ZXJhdG9yPFJlcXVl
c3Q+IGl0KCBtX3JlcXVlc3RzTG9hZGluZyApOwotCi0gICAgZm9yICg7IGl0LmN1cnJlbnQoKTsg
KytpdCApCi0gICAgewotICAgICAgICBDYWNoZWRPYmplY3QgKm9iaiA9IGl0LmN1cnJlbnQoKS0+
b2JqZWN0OwotCi0gICAgICAgIGlmICggb2JqICYmIG9iai0+dXJsKCkgPT0gdXJsICkKLSAgICAg
ICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxLSU86OkpvYiAqPiggaXQuY3VycmVudEtleSgpICk7
Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLQotYm9vbCBMb2FkZXI6OmlzS0hUTUxMb2Fk
ZXIoKSBjb25zdAotewotICAgIHJldHVybiB0cnVlOwotfQotCi0KLS8vIC0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0KLQotCi1MUlVMaXN0OjpMUlVMaXN0KCkKLTptX2hlYWQoMCksIG1fdGFpbCgwKSAKLXt9
Ci0KLUxSVUxpc3Q6On5MUlVMaXN0KCkKLXt9Ci0KLVFEaWN0PENhY2hlZE9iamVjdD4gKkNhY2hl
OjpjYWNoZSA9IDA7Ci1RUHRyTGlzdDxEb2NMb2FkZXI+KiBDYWNoZTo6ZG9jbG9hZGVyID0gMDsK
LUxvYWRlciAqQ2FjaGU6Om1fbG9hZGVyID0gMDsKLQotaW50IENhY2hlOjptYXhTaXplID0gREVG
Q0FDSEVTSVpFOwotaW50IENhY2hlOjptYXhDYWNoZWFibGUgPSBNQVhDQUNIRUFCTEU7Ci1pbnQg
Q2FjaGU6OmZsdXNoQ291bnQgPSAwOwotCi1RUGl4bWFwICpDYWNoZTo6bnVsbFBpeG1hcCA9IDA7
Ci1RUGl4bWFwICpDYWNoZTo6YnJva2VuUGl4bWFwID0gMDsKLQotQ2FjaGVkT2JqZWN0ICpDYWNo
ZTo6bV9oZWFkT2ZVbmNhY2hlYWJsZUxpc3QgPSAwOwotaW50IENhY2hlOjptX3RvdGFsU2l6ZU9m
TFJVTGlzdHMgPSAwOwotaW50IENhY2hlOjptX2NvdW50T2ZMUlVBbmRVbmNhY2hlYWJsZUxpc3Rz
OwotTFJVTGlzdCAqQ2FjaGU6Om1fTFJVTGlzdHMgPSAwOwotCi12b2lkIENhY2hlOjppbml0KCkK
LXsKLSAgICBpZiAoICFjYWNoZSApCi0gICAgICAgIGNhY2hlID0gbmV3IFFEaWN0PENhY2hlZE9i
amVjdD4oNDAxLCB0cnVlKTsKLQotICAgIGlmICggIWRvY2xvYWRlciApCi0gICAgICAgIGRvY2xv
YWRlciA9IG5ldyBRUHRyTGlzdDxEb2NMb2FkZXI+OwotCi0gICAgaWYgKCAhbnVsbFBpeG1hcCAp
Ci0gICAgICAgIG51bGxQaXhtYXAgPSBuZXcgUVBpeG1hcDsKLQotICAgIGlmICggIWJyb2tlblBp
eG1hcCApCi0gICAgICAgIGJyb2tlblBpeG1hcCA9IEtXUUxvYWRQaXhtYXAoIm1pc3NpbmdfaW1h
Z2UiKTsKLQotICAgIGlmICggIW1fbG9hZGVyICkKLSAgICAgICAgbV9sb2FkZXIgPSBuZXcgTG9h
ZGVyKCk7Ci19Ci0KLXZvaWQgQ2FjaGU6OmNsZWFyKCkKLXsKLSAgICBpZiAoIWNhY2hlKQotICAg
ICAgICByZXR1cm47Ci0KLSAgICBjYWNoZS0+c2V0QXV0b0RlbGV0ZSggdHJ1ZSApOwotICAgIGRl
bGV0ZSBjYWNoZTsgY2FjaGUgPSAwOwotICAgIGRlbGV0ZSBudWxsUGl4bWFwOyBudWxsUGl4bWFw
ID0gMDsKLSAgICBkZWxldGUgYnJva2VuUGl4bWFwOyBicm9rZW5QaXhtYXAgPSAwOwotICAgIGRl
bGV0ZSBtX2xvYWRlcjsgICBtX2xvYWRlciA9IDA7Ci0gICAgZGVsZXRlIGRvY2xvYWRlcjsgZG9j
bG9hZGVyID0gMDsKLX0KLQotQ2FjaGVkSW1hZ2UgKkNhY2hlOjpyZXF1ZXN0SW1hZ2UoIERvY0xv
YWRlciogZGwsIGNvbnN0IERPTVN0cmluZyAmIHVybCwgYm9vbCByZWxvYWQsIHRpbWVfdCBfZXhw
aXJlRGF0ZSApCi17Ci0gICAgLy8gdGhpcyBicmluZ3MgdGhlIF91cmwgdG8gYSBzdGFuZGFyZCBm
b3JtLi4uCi0gICAgS1VSTCBrdXJsOwotICAgIGlmIChkbCkKLSAgICAgICAga3VybCA9IGRsLT5t
X2RvYy0+Y29tcGxldGVVUkwoIHVybC5xc3RyaW5nKCkgKTsKLSAgICBlbHNlCi0gICAgICAgIGt1
cmwgPSB1cmwucXN0cmluZygpOwotICAgIHJldHVybiByZXF1ZXN0SW1hZ2UoZGwsIGt1cmwsIHJl
bG9hZCwgX2V4cGlyZURhdGUpOwotfQotCi1DYWNoZWRJbWFnZSAqQ2FjaGU6OnJlcXVlc3RJbWFn
ZSggRG9jTG9hZGVyKiBkbCwgY29uc3QgS1VSTCAmIHVybCwgYm9vbCByZWxvYWQsIHRpbWVfdCBf
ZXhwaXJlRGF0ZSApCi17Ci0gICAgS0lPOjpDYWNoZUNvbnRyb2wgY2FjaGVQb2xpY3k7Ci0gICAg
aWYgKGRsKQotICAgICAgICBjYWNoZVBvbGljeSA9IGRsLT5jYWNoZVBvbGljeSgpOwotICAgIGVs
c2UKLSAgICAgICAgY2FjaGVQb2xpY3kgPSBLSU86OkNDX1ZlcmlmeTsKLQotICAgIC8vIENoZWNr
aW5nIGlmIHRoZSBVUkwgaXMgbWFsZm9ybWVkIGlzIGxvdHMgb2YgZXh0cmEgd29yayBmb3IgbGl0
dGxlIGJlbmVmaXQuCi0KLSAgICBpZiAoIWRsLT5kb2MoKS0+c2hvdWxkQ3JlYXRlUmVuZGVyZXJz
KCkpewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBDYWNoZWRPYmplY3QgKm8gPSAw
OwotICAgIGlmICghcmVsb2FkKQotICAgICAgICBvID0gY2FjaGUtPmZpbmQodXJsLnVybCgpKTsK
LSAgICBpZighbykKLSAgICB7Ci0jaWZkZWYgQ0FDSEVfREVCVUcKLSAgICAgICAga2REZWJ1Zygg
NjA2MCApIDw8ICJDYWNoZTogbmV3OiAiIDw8IHVybC51cmwoKSA8PCBlbmRsOwotI2VuZGlmCi0g
ICAgICAgIENhY2hlZEltYWdlICppbSA9IG5ldyBDYWNoZWRJbWFnZShkbCwgdXJsLnVybCgpLCBj
YWNoZVBvbGljeSwgX2V4cGlyZURhdGUpOwotICAgICAgICBpZiAoIGRsICYmIGRsLT5hdXRvbG9h
ZEltYWdlcygpICkgQ2FjaGU6OmxvYWRlcigpLT5sb2FkKGRsLCBpbSwgdHJ1ZSk7Ci0gICAgICAg
IGlmIChjYWNoZURpc2FibGVkKQotICAgICAgICAgICAgaW0tPnNldEZyZWUodHJ1ZSk7Ci0gICAg
ICAgIGVsc2UgewotICAgICAgICBjYWNoZS0+aW5zZXJ0KCB1cmwudXJsKCksIGltICk7Ci0gICAg
ICAgIG1vdmVUb0hlYWRPZkxSVUxpc3QoaW0pOwotICAgICAgICB9Ci0gICAgICAgIG8gPSBpbTsK
LSAgICB9Ci0KLSAgICAKLSAgICBpZihvLT50eXBlKCkgIT0gQ2FjaGVkT2JqZWN0OjpJbWFnZSkK
LSAgICB7Ci0jaWZkZWYgQ0FDSEVfREVCVUcKLSAgICAgICAga2REZWJ1ZyggNjA2MCApIDw8ICJD
YWNoZTo6SW50ZXJuYWwgRXJyb3IgaW4gcmVxdWVzdEltYWdlIHVybD0iIDw8IGt1cmwudXJsKCkg
PDwgIiEiIDw8IGVuZGw7Ci0jZW5kaWYKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0jaWZk
ZWYgQ0FDSEVfREVCVUcKLSAgICBpZiggby0+c3RhdHVzKCkgPT0gQ2FjaGVkT2JqZWN0OjpQZW5k
aW5nICkKLSAgICAgICAga2REZWJ1ZyggNjA2MCApIDw8ICJDYWNoZTogbG9hZGluZyBpbiBwcm9n
cmVzczogIiA8PCBrdXJsLnVybCgpIDw8IGVuZGw7Ci0gICAgZWxzZQotICAgICAgICBrZERlYnVn
KCA2MDYwICkgPDwgIkNhY2hlOiB1c2luZyBjYWNoZWQ6ICIgPDwga3VybC51cmwoKSA8PCAiLCBz
dGF0dXMgIiA8PCBvLT5zdGF0dXMoKSA8PCBlbmRsOwotI2VuZGlmCi0KLSAgICBtb3ZlVG9IZWFk
T2ZMUlVMaXN0KG8pOwotICAgIGlmICggZGwgKSB7Ci0gICAgICAgIGRsLT5tX2RvY09iamVjdHMu
cmVtb3ZlKCBvICk7Ci0gICAgICAgIGlmICghY2FjaGVEaXNhYmxlZCkKLSAgICAgICAgZGwtPm1f
ZG9jT2JqZWN0cy5hcHBlbmQoIG8gKTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PENh
Y2hlZEltYWdlICo+KG8pOwotfQotCi1DYWNoZWRDU1NTdHlsZVNoZWV0ICpDYWNoZTo6cmVxdWVz
dFN0eWxlU2hlZXQoIERvY0xvYWRlciogZGwsIGNvbnN0IERPTVN0cmluZyAmIHVybCwgYm9vbCBy
ZWxvYWQsIHRpbWVfdCBfZXhwaXJlRGF0ZSwgY29uc3QgUVN0cmluZyYgY2hhcnNldCkKLXsKLSAg
ICAvLyB0aGlzIGJyaW5ncyB0aGUgX3VybCB0byBhIHN0YW5kYXJkIGZvcm0uLi4KLSAgICBLVVJM
IGt1cmw7Ci0gICAgS0lPOjpDYWNoZUNvbnRyb2wgY2FjaGVQb2xpY3k7Ci0gICAgaWYgKCBkbCAp
Ci0gICAgewotICAgICAgICBrdXJsID0gZGwtPm1fZG9jLT5jb21wbGV0ZVVSTCggdXJsLnFzdHJp
bmcoKSApOwotICAgICAgICBjYWNoZVBvbGljeSA9IGRsLT5jYWNoZVBvbGljeSgpOwotICAgIH0K
LSAgICBlbHNlCi0gICAgewotICAgICAgICBrdXJsID0gdXJsLnFzdHJpbmcoKTsKLSAgICAgICAg
Y2FjaGVQb2xpY3kgPSBLSU86OkNDX1ZlcmlmeTsKLSAgICB9Ci0KLSAgICAvLyBDaGVja2luZyBp
ZiB0aGUgVVJMIGlzIG1hbGZvcm1lZCBpcyBsb3RzIG9mIGV4dHJhIHdvcmsgZm9yIGxpdHRsZSBi
ZW5lZml0LgotCi0gICAgQ2FjaGVkT2JqZWN0ICpvID0gY2FjaGUtPmZpbmQoa3VybC51cmwoKSk7
Ci0gICAgaWYoIW8pCi0gICAgewotI2lmZGVmIENBQ0hFX0RFQlVHCi0gICAgICAgIGtkRGVidWco
IDYwNjAgKSA8PCAiQ2FjaGU6IG5ldzogIiA8PCBrdXJsLnVybCgpIDw8IGVuZGw7Ci0jZW5kaWYK
LSAgICAgICAgQ2FjaGVkQ1NTU3R5bGVTaGVldCAqc2hlZXQgPSBuZXcgQ2FjaGVkQ1NTU3R5bGVT
aGVldChkbCwga3VybC51cmwoKSwgY2FjaGVQb2xpY3ksIF9leHBpcmVEYXRlLCBjaGFyc2V0KTsK
LSAgICAgICAgaWYgKGNhY2hlRGlzYWJsZWQpCi0gICAgICAgICAgICBzaGVldC0+c2V0RnJlZSh0
cnVlKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgIGNhY2hlLT5pbnNlcnQoIGt1cmwudXJsKCks
IHNoZWV0ICk7Ci0gICAgICAgIG1vdmVUb0hlYWRPZkxSVUxpc3Qoc2hlZXQpOwotICAgICAgICB9
Ci0gICAgICAgIG8gPSBzaGVldDsKLSAgICB9Ci0KLSAgICAKLSAgICBpZihvLT50eXBlKCkgIT0g
Q2FjaGVkT2JqZWN0OjpDU1NTdHlsZVNoZWV0KQotICAgIHsKLSNpZmRlZiBDQUNIRV9ERUJVRwot
ICAgICAgICBrZERlYnVnKCA2MDYwICkgPDwgIkNhY2hlOjpJbnRlcm5hbCBFcnJvciBpbiByZXF1
ZXN0U3R5bGVTaGVldCB1cmw9IiA8PCBrdXJsLnVybCgpIDw8ICIhIiA8PCBlbmRsOwotI2VuZGlm
Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotI2lmZGVmIENBQ0hFX0RFQlVHCi0gICAgaWYo
IG8tPnN0YXR1cygpID09IENhY2hlZE9iamVjdDo6UGVuZGluZyApCi0gICAgICAgIGtkRGVidWco
IDYwNjAgKSA8PCAiQ2FjaGU6IGxvYWRpbmcgaW4gcHJvZ3Jlc3M6ICIgPDwga3VybC51cmwoKSA8
PCBlbmRsOwotICAgIGVsc2UKLSAgICAgICAga2REZWJ1ZyggNjA2MCApIDw8ICJDYWNoZTogdXNp
bmcgY2FjaGVkOiAiIDw8IGt1cmwudXJsKCkgPDwgZW5kbDsKLSNlbmRpZgotCi0gICAgbW92ZVRv
SGVhZE9mTFJVTGlzdChvKTsKLSAgICBpZiAoIGRsICkgewotICAgICAgICBkbC0+bV9kb2NPYmpl
Y3RzLnJlbW92ZSggbyApOwotICAgICAgICBpZiAoIWNhY2hlRGlzYWJsZWQpCi0gICAgICAgIGRs
LT5tX2RvY09iamVjdHMuYXBwZW5kKCBvICk7Ci0gICAgfQotICAgIHJldHVybiBzdGF0aWNfY2Fz
dDxDYWNoZWRDU1NTdHlsZVNoZWV0ICo+KG8pOwotfQotCi12b2lkIENhY2hlOjpwcmVsb2FkU3R5
bGVTaGVldCggY29uc3QgUVN0cmluZyAmdXJsLCBjb25zdCBRU3RyaW5nICZzdHlsZXNoZWV0X2Rh
dGEpCi17Ci0gICAgQ2FjaGVkT2JqZWN0ICpvID0gY2FjaGUtPmZpbmQodXJsKTsKLSAgICBpZihv
KQotICAgICAgICByZW1vdmVDYWNoZUVudHJ5KG8pOwotCi0gICAgQ2FjaGVkQ1NTU3R5bGVTaGVl
dCAqc3R5bGVzaGVldCA9IG5ldyBDYWNoZWRDU1NTdHlsZVNoZWV0KHVybCwgc3R5bGVzaGVldF9k
YXRhKTsKLSAgICBjYWNoZS0+aW5zZXJ0KCB1cmwsIHN0eWxlc2hlZXQgKTsKLX0KLQotQ2FjaGVk
U2NyaXB0ICpDYWNoZTo6cmVxdWVzdFNjcmlwdCggRG9jTG9hZGVyKiBkbCwgY29uc3QgRE9NOjpE
T01TdHJpbmcgJnVybCwgYm9vbCByZWxvYWQsIHRpbWVfdCBfZXhwaXJlRGF0ZSwgY29uc3QgUVN0
cmluZyYgY2hhcnNldCkKLXsKLSAgICAvLyB0aGlzIGJyaW5ncyB0aGUgX3VybCB0byBhIHN0YW5k
YXJkIGZvcm0uLi4KLSAgICBLVVJMIGt1cmw7Ci0gICAgS0lPOjpDYWNoZUNvbnRyb2wgY2FjaGVQ
b2xpY3k7Ci0gICAgaWYgKCBkbCApCi0gICAgewotICAgICAgICBrdXJsID0gZGwtPm1fZG9jLT5j
b21wbGV0ZVVSTCggdXJsLnFzdHJpbmcoKSApOwotICAgICAgICBjYWNoZVBvbGljeSA9IGRsLT5j
YWNoZVBvbGljeSgpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBrdXJsID0gdXJs
LnFzdHJpbmcoKTsKLSAgICAgICAgY2FjaGVQb2xpY3kgPSBLSU86OkNDX1ZlcmlmeTsKLSAgICB9
Ci0KLSAgICAvLyBDaGVja2luZyBpZiB0aGUgVVJMIGlzIG1hbGZvcm1lZCBpcyBsb3RzIG9mIGV4
dHJhIHdvcmsgZm9yIGxpdHRsZSBiZW5lZml0LgotCi0gICAgQ2FjaGVkT2JqZWN0ICpvID0gY2Fj
aGUtPmZpbmQoa3VybC51cmwoKSk7Ci0gICAgaWYoIW8pCi0gICAgewotI2lmZGVmIENBQ0hFX0RF
QlVHCi0gICAgICAgIGtkRGVidWcoIDYwNjAgKSA8PCAiQ2FjaGU6IG5ldzogIiA8PCBrdXJsLnVy
bCgpIDw8IGVuZGw7Ci0jZW5kaWYKLSAgICAgICAgQ2FjaGVkU2NyaXB0ICpzY3JpcHQgPSBuZXcg
Q2FjaGVkU2NyaXB0KGRsLCBrdXJsLnVybCgpLCBjYWNoZVBvbGljeSwgX2V4cGlyZURhdGUsIGNo
YXJzZXQpOwotICAgICAgICBpZiAoY2FjaGVEaXNhYmxlZCkKLSAgICAgICAgICAgIHNjcmlwdC0+
c2V0RnJlZSh0cnVlKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgIGNhY2hlLT5pbnNlcnQoIGt1
cmwudXJsKCksIHNjcmlwdCApOwotICAgICAgICBtb3ZlVG9IZWFkT2ZMUlVMaXN0KHNjcmlwdCk7
Ci0gICAgICAgIH0KLSAgICAgICAgbyA9IHNjcmlwdDsKLSAgICB9Ci0KLSAgICAKLSAgICBpZigh
KG8tPnR5cGUoKSA9PSBDYWNoZWRPYmplY3Q6OlNjcmlwdCkpCi0gICAgewotI2lmZGVmIENBQ0hF
X0RFQlVHCi0gICAgICAgIGtkRGVidWcoIDYwNjAgKSA8PCAiQ2FjaGU6OkludGVybmFsIEVycm9y
IGluIHJlcXVlc3RTY3JpcHQgdXJsPSIgPDwga3VybC51cmwoKSA8PCAiISIgPDwgZW5kbDsKLSNl
bmRpZgotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgCi0gICAgCi0jaWZkZWYgQ0FDSEVf
REVCVUcKLSAgICBpZiggby0+c3RhdHVzKCkgPT0gQ2FjaGVkT2JqZWN0OjpQZW5kaW5nICkKLSAg
ICAgICAga2REZWJ1ZyggNjA2MCApIDw8ICJDYWNoZTogbG9hZGluZyBpbiBwcm9ncmVzczogIiA8
PCBrdXJsLnVybCgpIDw8IGVuZGw7Ci0gICAgZWxzZQotICAgICAgICBrZERlYnVnKCA2MDYwICkg
PDwgIkNhY2hlOiB1c2luZyBjYWNoZWQ6ICIgPDwga3VybC51cmwoKSA8PCBlbmRsOwotI2VuZGlm
Ci0KLSAgICBtb3ZlVG9IZWFkT2ZMUlVMaXN0KG8pOwotICAgIGlmICggZGwgKSB7Ci0gICAgICAg
IGRsLT5tX2RvY09iamVjdHMucmVtb3ZlKCBvICk7Ci0gICAgICAgIGlmICghY2FjaGVEaXNhYmxl
ZCkKLSAgICAgICAgZGwtPm1fZG9jT2JqZWN0cy5hcHBlbmQoIG8gKTsKLSAgICB9Ci0gICAgcmV0
dXJuIHN0YXRpY19jYXN0PENhY2hlZFNjcmlwdCAqPihvKTsKLX0KLQotdm9pZCBDYWNoZTo6cHJl
bG9hZFNjcmlwdCggY29uc3QgUVN0cmluZyAmdXJsLCBjb25zdCBRU3RyaW5nICZzY3JpcHRfZGF0
YSkKLXsKLSAgICBDYWNoZWRPYmplY3QgKm8gPSBjYWNoZS0+ZmluZCh1cmwpOwotICAgIGlmKG8p
Ci0gICAgICAgIHJlbW92ZUNhY2hlRW50cnkobyk7Ci0KLSAgICBDYWNoZWRTY3JpcHQgKnNjcmlw
dCA9IG5ldyBDYWNoZWRTY3JpcHQodXJsLCBzY3JpcHRfZGF0YSk7Ci0gICAgY2FjaGUtPmluc2Vy
dCggdXJsLCBzY3JpcHQgKTsKLX0KLQotI2lmZGVmIEtIVE1MX1hTTFQKLUNhY2hlZFhTTFN0eWxl
U2hlZXQqIENhY2hlOjpyZXF1ZXN0WFNMU3R5bGVTaGVldChEb2NMb2FkZXIqIGRsLCBjb25zdCBE
T01TdHJpbmcgJiB1cmwsIGJvb2wgcmVsb2FkLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICB0aW1lX3QgX2V4cGlyZURhdGUpCi17Ci0gICAgLy8gdGhp
cyBicmluZ3MgdGhlIF91cmwgdG8gYSBzdGFuZGFyZCBmb3JtLi4uCi0gICAgS1VSTCBrdXJsOwot
ICAgIEtJTzo6Q2FjaGVDb250cm9sIGNhY2hlUG9saWN5OwotICAgIGlmIChkbCkgewotICAgICAg
ICBrdXJsID0gZGwtPm1fZG9jLT5jb21wbGV0ZVVSTCh1cmwucXN0cmluZygpKTsKLSAgICAgICAg
Y2FjaGVQb2xpY3kgPSBkbC0+Y2FjaGVQb2xpY3koKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAg
ICAgIGt1cmwgPSB1cmwucXN0cmluZygpOwotICAgICAgICBjYWNoZVBvbGljeSA9IEtJTzo6Q0Nf
VmVyaWZ5OwotICAgIH0KLSAgICAKLSAgICAvLyBDaGVja2luZyBpZiB0aGUgVVJMIGlzIG1hbGZv
cm1lZCBpcyBsb3RzIG9mIGV4dHJhIHdvcmsgZm9yIGxpdHRsZSBiZW5lZml0LgotICAgIAotICAg
IENhY2hlZE9iamVjdCAqbyA9IGNhY2hlLT5maW5kKGt1cmwudXJsKCkpOwotICAgIGlmICghbykg
ewotI2lmZGVmIENBQ0hFX0RFQlVHCi0gICAgICAgIGtkRGVidWcoIDYwNjAgKSA8PCAiQ2FjaGU6
IG5ldzogIiA8PCBrdXJsLnVybCgpIDw8IGVuZGw7Ci0jZW5kaWYKLSAgICAgICAgQ2FjaGVkWFNM
U3R5bGVTaGVldCogZG9jID0gbmV3IENhY2hlZFhTTFN0eWxlU2hlZXQoZGwsIGt1cmwudXJsKCks
IGNhY2hlUG9saWN5LCBfZXhwaXJlRGF0ZSk7Ci0gICAgICAgIGlmIChjYWNoZURpc2FibGVkKQot
ICAgICAgICAgICAgZG9jLT5zZXRGcmVlKHRydWUpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAg
ICAgIGNhY2hlLT5pbnNlcnQoa3VybC51cmwoKSwgZG9jKTsKLSAgICAgICAgICAgIG1vdmVUb0hl
YWRPZkxSVUxpc3QoZG9jKTsKLSAgICAgICAgfQotICAgICAgICBvID0gZG9jOwotICAgIH0KLSAg
ICAKLSAgICAKLSAgICBpZiAoby0+dHlwZSgpICE9IENhY2hlZE9iamVjdDo6WFNMU3R5bGVTaGVl
dCkgewotI2lmZGVmIENBQ0hFX0RFQlVHCi0gICAgICAgIGtkRGVidWcoIDYwNjAgKSA8PCAiQ2Fj
aGU6OkludGVybmFsIEVycm9yIGluIHJlcXVlc3RYU0xTdHlsZVNoZWV0IHVybD0iIDw8IGt1cmwu
dXJsKCkgPDwgIiEiIDw8IGVuZGw7Ci0jZW5kaWYKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQot
ICAgIAotI2lmZGVmIENBQ0hFX0RFQlVHCi0gICAgaWYgKG8tPnN0YXR1cygpID09IENhY2hlZE9i
amVjdDo6UGVuZGluZykKLSAgICAgICAga2REZWJ1ZyggNjA2MCApIDw8ICJDYWNoZTogbG9hZGlu
ZyBpbiBwcm9ncmVzczogIiA8PCBrdXJsLnVybCgpIDw8IGVuZGw7Ci0gICAgZWxzZQotICAgICAg
ICBrZERlYnVnKCA2MDYwICkgPDwgIkNhY2hlOiB1c2luZyBjYWNoZWQ6ICIgPDwga3VybC51cmwo
KSA8PCBlbmRsOwotI2VuZGlmCi0gICAgCi0gICAgbW92ZVRvSGVhZE9mTFJVTGlzdChvKTsKLSAg
ICBpZiAoZGwpIHsKLSAgICAgICAgZGwtPm1fZG9jT2JqZWN0cy5yZW1vdmUoIG8gKTsKLSAgICAg
ICAgaWYgKCFjYWNoZURpc2FibGVkKQotICAgICAgICAgICAgZGwtPm1fZG9jT2JqZWN0cy5hcHBl
bmQoIG8gKTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PENhY2hlZFhTTFN0eWxlU2hl
ZXQqPihvKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIEtIVE1MX05PX1hCTAotQ2FjaGVkWEJMRG9j
dW1lbnQqIENhY2hlOjpyZXF1ZXN0WEJMRG9jdW1lbnQoRG9jTG9hZGVyKiBkbCwgY29uc3QgRE9N
U3RyaW5nICYgdXJsLCBib29sIHJlbG9hZCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICB0aW1lX3QgX2V4cGlyZURhdGUpCi17Ci0gICAgLy8gdGhpcyBicmlu
Z3MgdGhlIF91cmwgdG8gYSBzdGFuZGFyZCBmb3JtLi4uCi0gICAgS1VSTCBrdXJsOwotICAgIEtJ
Tzo6Q2FjaGVDb250cm9sIGNhY2hlUG9saWN5OwotICAgIGlmIChkbCkgewotICAgICAgICBrdXJs
ID0gZGwtPm1fZG9jLT5jb21wbGV0ZVVSTCh1cmwucXN0cmluZygpKTsKLSAgICAgICAgY2FjaGVQ
b2xpY3kgPSBkbC0+Y2FjaGVQb2xpY3koKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGt1
cmwgPSB1cmwucXN0cmluZygpOwotICAgICAgICBjYWNoZVBvbGljeSA9IEtJTzo6Q0NfVmVyaWZ5
OwotICAgIH0KLSAgICAKLSAgICAvLyBDaGVja2luZyBpZiB0aGUgVVJMIGlzIG1hbGZvcm1lZCBp
cyBsb3RzIG9mIGV4dHJhIHdvcmsgZm9yIGxpdHRsZSBiZW5lZml0LgotICAgIAotICAgIENhY2hl
ZE9iamVjdCAqbyA9IGNhY2hlLT5maW5kKGt1cmwudXJsKCkpOwotICAgIGlmKCFvKQotICAgIHsK
LSNpZmRlZiBDQUNIRV9ERUJVRwotICAgICAgICBrZERlYnVnKCA2MDYwICkgPDwgIkNhY2hlOiBu
ZXc6ICIgPDwga3VybC51cmwoKSA8PCBlbmRsOwotI2VuZGlmCi0gICAgICAgIENhY2hlZFhCTERv
Y3VtZW50KiBkb2MgPSBuZXcgQ2FjaGVkWEJMRG9jdW1lbnQoZGwsIGt1cmwudXJsKCksIGNhY2hl
UG9saWN5LCBfZXhwaXJlRGF0ZSk7Ci0gICAgICAgIGlmIChjYWNoZURpc2FibGVkKQotICAgICAg
ICAgICAgZG9jLT5zZXRGcmVlKHRydWUpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGNh
Y2hlLT5pbnNlcnQoa3VybC51cmwoKSwgZG9jKTsKLSAgICAgICAgICAgIG1vdmVUb0hlYWRPZkxS
VUxpc3QoZG9jKTsKLSAgICAgICAgfQotICAgICAgICBvID0gZG9jOwotICAgIH0KLSAgICAKLSAg
ICAKLSAgICBpZihvLT50eXBlKCkgIT0gQ2FjaGVkT2JqZWN0OjpYQkwpCi0gICAgewotI2lmZGVm
IENBQ0hFX0RFQlVHCi0gICAgICAgIGtkRGVidWcoIDYwNjAgKSA8PCAiQ2FjaGU6OkludGVybmFs
IEVycm9yIGluIHJlcXVlc3RYQkxEb2N1bWVudCB1cmw9IiA8PCBrdXJsLnVybCgpIDw8ICIhIiA8
PCBlbmRsOwotI2VuZGlmCi0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICAKLSNpZmRlZiBD
QUNIRV9ERUJVRwotICAgIGlmKCBvLT5zdGF0dXMoKSA9PSBDYWNoZWRPYmplY3Q6OlBlbmRpbmcg
KQotICAgICAgICBrZERlYnVnKCA2MDYwICkgPDwgIkNhY2hlOiBsb2FkaW5nIGluIHByb2dyZXNz
OiAiIDw8IGt1cmwudXJsKCkgPDwgZW5kbDsKLSAgICBlbHNlCi0gICAgICAgIGtkRGVidWcoIDYw
NjAgKSA8PCAiQ2FjaGU6IHVzaW5nIGNhY2hlZDogIiA8PCBrdXJsLnVybCgpIDw8IGVuZGw7Ci0j
ZW5kaWYKLSAgICAKLSAgICBtb3ZlVG9IZWFkT2ZMUlVMaXN0KG8pOwotICAgIGlmICggZGwgKSB7
Ci0gICAgICAgIGRsLT5tX2RvY09iamVjdHMucmVtb3ZlKCBvICk7Ci0gICAgICAgIGlmICghY2Fj
aGVEaXNhYmxlZCkKLSAgICAgICAgICAgIGRsLT5tX2RvY09iamVjdHMuYXBwZW5kKCBvICk7Ci0g
ICAgfQotICAgIHJldHVybiBzdGF0aWNfY2FzdDxDYWNoZWRYQkxEb2N1bWVudCo+KG8pOwotfQot
I2VuZGlmCi0KLXZvaWQgQ2FjaGU6OmZsdXNoKGJvb2wgZm9yY2UpCi17Ci0gICAgaWYgKGZvcmNl
KQotICAgICAgIGZsdXNoQ291bnQgPSAwOwotICAgIC8vIERvbid0IGZsdXNoIGZvciBldmVyeSBp
bWFnZS4KLSAgICBpZiAobV9jb3VudE9mTFJVQW5kVW5jYWNoZWFibGVMaXN0cyA8IGZsdXNoQ291
bnQpCi0gICAgICAgcmV0dXJuOwotCi0gICAgaW5pdCgpOwotCi0gICAgd2hpbGUgKG1faGVhZE9m
VW5jYWNoZWFibGVMaXN0KQotICAgICAgICByZW1vdmVDYWNoZUVudHJ5KG1faGVhZE9mVW5jYWNo
ZWFibGVMaXN0KTsKLQotICAgIGZvciAoaW50IGkgPSBNQVhfTFJVX0xJU1RTLTE7IGk+PTA7IGkt
LSkgewotICAgICAgICBpZiAobV90b3RhbFNpemVPZkxSVUxpc3RzIDw9IG1heFNpemUpCi0gICAg
ICAgICAgICBicmVhazsKLSAgICAgICAgICAgIAotICAgICAgICB3aGlsZSAobV90b3RhbFNpemVP
ZkxSVUxpc3RzID4gbWF4U2l6ZSAmJiBtX0xSVUxpc3RzW2ldLm1fdGFpbCkKLSAgICAgICAgICAg
IHJlbW92ZUNhY2hlRW50cnkobV9MUlVMaXN0c1tpXS5tX3RhaWwpOwotICAgIH0KLQotICAgIGZs
dXNoQ291bnQgPSBtX2NvdW50T2ZMUlVBbmRVbmNhY2hlYWJsZUxpc3RzKzEwOyAvLyBGbHVzaCBh
Z2FpbiB3aGVuIHRoZSBjYWNoZSBoYXMgZ3Jvd24uCi19Ci0KLQotdm9pZCBDYWNoZTo6c2V0U2l6
ZSggaW50IGJ5dGVzICkKLXsKLSAgICBtYXhTaXplID0gYnl0ZXM7Ci0gICAgbWF4Q2FjaGVhYmxl
ID0ga01heChtYXhTaXplIC8gMTI4LCBNQVhDQUNIRUFCTEUpOwotCi0gICAgLy8gbWF5IGJlIHdl
IG5lZWQgdG8gY2xlYXIgcGFydHMgb2YgdGhlIGNhY2hlCi0gICAgZmx1c2hDb3VudCA9IDA7Ci0g
ICAgZmx1c2godHJ1ZSk7Ci19Ci0KLXZvaWQgQ2FjaGU6OnJlbW92ZUNhY2hlRW50cnkoIENhY2hl
ZE9iamVjdCAqb2JqZWN0ICkKLXsKLSAgUVN0cmluZyBrZXkgPSBvYmplY3QtPnVybCgpLnFzdHJp
bmcoKTsKLQotICAvLyB0aGlzIGluZGljYXRlcyB0aGUgZGVyZWYoKSBtZXRob2Qgb2YgQ2FjaGVk
T2JqZWN0IHRvIGRlbGV0ZSBpdHNlbGYgd2hlbiB0aGUgcmVmZXJlbmNlIGNvdW50ZXIKLSAgLy8g
ZHJvcHMgZG93biB0byB6ZXJvCi0gIG9iamVjdC0+c2V0RnJlZSggdHJ1ZSApOwotCi0gIGNhY2hl
LT5yZW1vdmUoIGtleSApOwotICByZW1vdmVGcm9tTFJVTGlzdChvYmplY3QpOwotCi0gIGNvbnN0
IERvY0xvYWRlciogZGw7Ci0gIGZvciAoIGRsPWRvY2xvYWRlci0+Zmlyc3QoKTsgZGw7IGRsPWRv
Y2xvYWRlci0+bmV4dCgpICkKLSAgICAgIGRsLT5yZW1vdmVDYWNoZWRPYmplY3QoIG9iamVjdCAp
OwotCi0gIGlmICggb2JqZWN0LT5jYW5EZWxldGUoKSApCi0gICAgIGRlbGV0ZSBvYmplY3Q7Ci19
Ci0KLSNkZWZpbmUgRkFTVF9MT0cyKF9sb2cyLF9uKSAgIFwKLSAgICAgIHVuc2lnbmVkIGludCBq
XyA9ICh1bnNpZ25lZCBpbnQpKF9uKTsgICBcCi0gICAgICAoX2xvZzIpID0gMDsgICAgICAgICAg
ICAgICAgICAgIFwKLSAgICAgIGlmICgoal8pICYgKChqXyktMSkpICAgICAgICAgICAgXAotICAg
ICAgKF9sb2cyKSArPSAxOyAgICAgICAgICAgICAgIFwKLSAgICAgIGlmICgoal8pID4+IDE2KSAg
ICAgICAgICAgICAgICAgXAotICAgICAgKF9sb2cyKSArPSAxNiwgKGpfKSA+Pj0gMTY7IFwKLSAg
ICAgIGlmICgoal8pID4+IDgpICAgICAgICAgICAgICAgICAgXAotICAgICAgKF9sb2cyKSArPSA4
LCAoal8pID4+PSA4OyAgIFwKLSAgICAgIGlmICgoal8pID4+IDQpICAgICAgICAgICAgICAgICAg
XAotICAgICAgKF9sb2cyKSArPSA0LCAoal8pID4+PSA0OyAgIFwKLSAgICAgIGlmICgoal8pID4+
IDIpICAgICAgICAgICAgICAgICAgXAotICAgICAgKF9sb2cyKSArPSAyLCAoal8pID4+PSAyOyAg
IFwKLSAgICAgIGlmICgoal8pID4+IDEpICAgICAgICAgICAgICAgICAgXAotICAgICAgKF9sb2cy
KSArPSAxOwotCi1pbnQgRmFzdExvZzIodW5zaWduZWQgaW50IGkpIHsKLSAgICBpbnQgbG9nMjsK
LSAgICBGQVNUX0xPRzIobG9nMixpKTsKLSAgICByZXR1cm4gbG9nMjsKLX0KLQotTFJVTGlzdCog
Q2FjaGU6OmdldExSVUxpc3RGb3IoQ2FjaGVkT2JqZWN0KiBvKQotewotICAgIGludCBhY2Nlc3ND
b3VudCA9IG8tPmFjY2Vzc0NvdW50KCk7Ci0gICAgaW50IHF1ZXVlSW5kZXg7Ci0gICAgaWYgKGFj
Y2Vzc0NvdW50ID09IDApIHsKLSAgICAgICAgcXVldWVJbmRleCA9IDA7Ci0gICAgfSBlbHNlIHsK
LSAgICAgICAgaW50IHNpemVMb2cgPSBGYXN0TG9nMihvLT5zaXplKCkpOwotICAgICAgICBxdWV1
ZUluZGV4ID0gc2l6ZUxvZy9vLT5hY2Nlc3NDb3VudCgpIC0gMTsKLSAgICAgICAgaWYgKHF1ZXVl
SW5kZXggPCAwKQotICAgICAgICAgICAgcXVldWVJbmRleCA9IDA7Ci0gICAgICAgIGlmIChxdWV1
ZUluZGV4ID49IE1BWF9MUlVfTElTVFMpCi0gICAgICAgICAgICBxdWV1ZUluZGV4ID0gTUFYX0xS
VV9MSVNUUy0xOwotICAgIH0KLSAgICBpZiAobV9MUlVMaXN0cyA9PSAwKSB7Ci0gICAgICAgIG1f
TFJVTGlzdHMgPSBuZXcgTFJVTGlzdCBbTUFYX0xSVV9MSVNUU107Ci0gICAgfQotICAgIHJldHVy
biAmbV9MUlVMaXN0c1txdWV1ZUluZGV4XTsKLX0KLQotdm9pZCBDYWNoZTo6cmVtb3ZlRnJvbUxS
VUxpc3QoQ2FjaGVkT2JqZWN0ICpvYmplY3QpCi17Ci0gICAgQ2FjaGVkT2JqZWN0ICpuZXh0ID0g
b2JqZWN0LT5tX25leHRJbkxSVUxpc3Q7Ci0gICAgQ2FjaGVkT2JqZWN0ICpwcmV2ID0gb2JqZWN0
LT5tX3ByZXZJbkxSVUxpc3Q7Ci0gICAgYm9vbCB1bmNhY2hlYWJsZSA9IG9iamVjdC0+c3RhdHVz
KCkgPT0gQ2FjaGVkT2JqZWN0OjpVbmNhY2hlYWJsZTsKLSAgICAKLSAgICBMUlVMaXN0KiBsaXN0
ID0gdW5jYWNoZWFibGUgPyAwIDogZ2V0TFJVTGlzdEZvcihvYmplY3QpOwotICAgIENhY2hlZE9i
amVjdCAqJmhlYWQgPSB1bmNhY2hlYWJsZSA/IG1faGVhZE9mVW5jYWNoZWFibGVMaXN0IDogbGlz
dC0+bV9oZWFkOwotICAgIAotICAgIGlmIChuZXh0ID09IDAgJiYgcHJldiA9PSAwICYmIGhlYWQg
IT0gb2JqZWN0KSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgCi0gICAgb2JqZWN0LT5t
X25leHRJbkxSVUxpc3QgPSAwOwotICAgIG9iamVjdC0+bV9wcmV2SW5MUlVMaXN0ID0gMDsKLSAg
ICAKLSAgICBpZiAobmV4dCkKLSAgICAgICAgbmV4dC0+bV9wcmV2SW5MUlVMaXN0ID0gcHJldjsK
LSAgICBlbHNlIGlmICghdW5jYWNoZWFibGUgJiYgbGlzdC0+bV90YWlsID09IG9iamVjdCkKLSAg
ICAgICAgbGlzdC0+bV90YWlsID0gcHJldjsKLQotICAgIGlmIChwcmV2KQotICAgICAgICBwcmV2
LT5tX25leHRJbkxSVUxpc3QgPSBuZXh0OwotICAgIGVsc2UgaWYgKGhlYWQgPT0gb2JqZWN0KQot
ICAgICAgICBoZWFkID0gbmV4dDsKLSAgICAKLSAgICAtLW1fY291bnRPZkxSVUFuZFVuY2FjaGVh
YmxlTGlzdHM7Ci0gICAgCi0gICAgaWYgKCF1bmNhY2hlYWJsZSkKLSAgICAgICAgbV90b3RhbFNp
emVPZkxSVUxpc3RzIC09IG9iamVjdC0+c2l6ZSgpOwotfQotCi12b2lkIENhY2hlOjptb3ZlVG9I
ZWFkT2ZMUlVMaXN0KENhY2hlZE9iamVjdCAqb2JqZWN0KQotewotICAgIGluc2VydEluTFJVTGlz
dChvYmplY3QpOwotfQotCi12b2lkIENhY2hlOjppbnNlcnRJbkxSVUxpc3QoQ2FjaGVkT2JqZWN0
ICpvYmplY3QpCi17Ci0gICAgcmVtb3ZlRnJvbUxSVUxpc3Qob2JqZWN0KTsKLSAgICAKLSAgICBp
ZiAoIW9iamVjdC0+YWxsb3dJbkxSVUxpc3QoKSkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAg
IExSVUxpc3QqIGxpc3QgPSBnZXRMUlVMaXN0Rm9yKG9iamVjdCk7Ci0gICAgCi0gICAgYm9vbCB1
bmNhY2hlYWJsZSA9IG9iamVjdC0+c3RhdHVzKCkgPT0gQ2FjaGVkT2JqZWN0OjpVbmNhY2hlYWJs
ZTsKLSAgICBDYWNoZWRPYmplY3QgKiZoZWFkID0gdW5jYWNoZWFibGUgPyBtX2hlYWRPZlVuY2Fj
aGVhYmxlTGlzdCA6IGxpc3QtPm1faGVhZDsKLQotICAgIG9iamVjdC0+bV9uZXh0SW5MUlVMaXN0
ID0gaGVhZDsKLSAgICBpZiAoaGVhZCkKLSAgICAgICAgaGVhZC0+bV9wcmV2SW5MUlVMaXN0ID0g
b2JqZWN0OwotICAgIGhlYWQgPSBvYmplY3Q7Ci0gICAgCi0gICAgaWYgKG9iamVjdC0+bV9uZXh0
SW5MUlVMaXN0ID09IDAgJiYgIXVuY2FjaGVhYmxlKQotICAgICAgICBsaXN0LT5tX3RhaWwgPSBv
YmplY3Q7Ci0gICAgCi0gICAgKyttX2NvdW50T2ZMUlVBbmRVbmNhY2hlYWJsZUxpc3RzOwotICAg
IAotICAgIGlmICghdW5jYWNoZWFibGUpCi0gICAgICAgIG1fdG90YWxTaXplT2ZMUlVMaXN0cyAr
PSBvYmplY3QtPnNpemUoKTsKLX0KLQotYm9vbCBDYWNoZTo6YWRqdXN0U2l6ZShDYWNoZWRPYmpl
Y3QgKm9iamVjdCwgaW50IGRlbHRhKQotewotICAgIGlmIChvYmplY3QtPnN0YXR1cygpID09IENh
Y2hlZE9iamVjdDo6VW5jYWNoZWFibGUpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGlm
IChvYmplY3QtPm1fbmV4dEluTFJVTGlzdCA9PSAwICYmIG9iamVjdC0+bV9wcmV2SW5MUlVMaXN0
ID09IDAgJiYKLSAgICAgICAgZ2V0TFJVTGlzdEZvcihvYmplY3QpLT5tX2hlYWQgIT0gb2JqZWN0
KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgbV90b3RhbFNpemVPZkxSVUxpc3Rz
ICs9IGRlbHRhOwotICAgIHJldHVybiBkZWx0YSAhPSAwOwotfQotCi0vLyAtLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbmFtZXNwYWNlIGtodG1sIHsKIAogQ2FjaGVkT2Jq
ZWN0Q2xpZW50ICpDYWNoZWRPYmplY3RDbGllbnRXYWxrZXI6Om5leHQoKQogewpAQCAtMTgwNSw3
OSArNDEsNCBAQCBDYWNoZWRPYmplY3RDbGllbnQgKkNhY2hlZE9iamVjdENsaWVudFdhCiAgICAg
cmV0dXJuIF9jdXJyZW50OwogfQogCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLQotCi1DYWNoZWRPYmplY3RDbGllbnQ6On5DYWNoZWRPYmplY3RDbGllbnQoKSB7IH0K
LXZvaWQgQ2FjaGVkT2JqZWN0Q2xpZW50OjpzZXRQaXhtYXAoY29uc3QgUVBpeG1hcCAmLCBjb25z
dCBRUmVjdCYsIENhY2hlZEltYWdlICopIHt9Ci12b2lkIENhY2hlZE9iamVjdENsaWVudDo6c2V0
U3R5bGVTaGVldChjb25zdCBET006OkRPTVN0cmluZyAmLyp1cmwqLywgY29uc3QgRE9NOjpET01T
dHJpbmcgJi8qc2hlZXQqLykge30KLSNpZm5kZWYgS0hUTUxfTk9fWEJMCi12b2lkIENhY2hlZE9i
amVjdENsaWVudDo6c2V0WEJMRG9jdW1lbnQoY29uc3QgRE9NOjpET01TdHJpbmcmIHVybCwgWEJM
OjpYQkxEb2N1bWVudEltcGwqIGRvYykge30KLSNlbmRpZgotdm9pZCBDYWNoZWRPYmplY3RDbGll
bnQ6Om5vdGlmeUZpbmlzaGVkKENhY2hlZE9iamVjdCAqIC8qZmluaXNoZWRPYmoqLykge30KLQot
Q2FjaGU6OlN0YXRpc3RpY3MgQ2FjaGU6OmdldFN0YXRpc3RpY3MoKQotewotICAgIFN0YXRpc3Rp
Y3Mgc3RhdHM7Ci0KLSAgICBpZiAoIWNhY2hlKQotICAgICAgICByZXR1cm4gc3RhdHM7Ci0KLSAg
ICBRRGljdEl0ZXJhdG9yPENhY2hlZE9iamVjdD4gaSgqY2FjaGUpOwotICAgIGZvciAoaS50b0Zp
cnN0KCk7IGkuY3VycmVudCgpOyArK2kpIHsKLSAgICAgICAgQ2FjaGVkT2JqZWN0ICpvID0gaS5j
dXJyZW50KCk7Ci0gICAgICAgIHN3aXRjaCAoby0+dHlwZSgpKSB7Ci0gICAgICAgICAgICBjYXNl
IENhY2hlZE9iamVjdDo6SW1hZ2U6Ci0gICAgICAgICAgICAgICAgc3RhdHMuaW1hZ2VzLmNvdW50
Kys7Ci0gICAgICAgICAgICAgICAgc3RhdHMuaW1hZ2VzLnNpemUgKz0gby0+c2l6ZSgpOwotICAg
ICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIENhY2hlZE9iamVjdDo6Q1NT
U3R5bGVTaGVldDoKLSAgICAgICAgICAgICAgICBzdGF0cy5zdHlsZVNoZWV0cy5jb3VudCsrOwot
ICAgICAgICAgICAgICAgIHN0YXRzLnN0eWxlU2hlZXRzLnNpemUgKz0gby0+c2l6ZSgpOwotICAg
ICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIENhY2hlZE9iamVjdDo6U2Ny
aXB0OgotICAgICAgICAgICAgICAgIHN0YXRzLnNjcmlwdHMuY291bnQrKzsKLSAgICAgICAgICAg
ICAgICBzdGF0cy5zY3JpcHRzLnNpemUgKz0gby0+c2l6ZSgpOwotICAgICAgICAgICAgICAgIGJy
ZWFrOwotI2lmZGVmIEtIVE1MX1hTTFQKLSAgICAgICAgICAgIGNhc2UgQ2FjaGVkT2JqZWN0OjpY
U0xTdHlsZVNoZWV0OgotICAgICAgICAgICAgICAgIHN0YXRzLnhzbFN0eWxlU2hlZXRzLmNvdW50
Kys7Ci0gICAgICAgICAgICAgICAgc3RhdHMueHNsU3R5bGVTaGVldHMuc2l6ZSArPSBvLT5zaXpl
KCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZm5kZWYgS0hUTUxfTk9fWEJM
Ci0gICAgICAgICAgICBjYXNlIENhY2hlZE9iamVjdDo6WEJMOgotICAgICAgICAgICAgICAgIHN0
YXRzLnhibERvY3MuY291bnQrKzsKLSAgICAgICAgICAgICAgICBzdGF0cy54YmxEb2NzLnNpemUg
Kz0gby0+c2l6ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotI2VuZGlmCi0gICAgICAgICAg
ICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHN0YXRzLm90aGVyLmNvdW50Kys7Ci0gICAgICAg
ICAgICAgICAgc3RhdHMub3RoZXIuc2l6ZSArPSBvLT5zaXplKCk7Ci0gICAgICAgIH0KLSAgICB9
Ci0gICAgCi0gICAgcmV0dXJuIHN0YXRzOwotfQotCi12b2lkIENhY2hlOjpmbHVzaEFsbCgpCi17
Ci0gICAgaWYgKCFjYWNoZSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgZm9yICg7OykgewotICAg
ICAgICBRRGljdEl0ZXJhdG9yPENhY2hlZE9iamVjdD4gaSgqY2FjaGUpOwotICAgICAgICBDYWNo
ZWRPYmplY3QgKm8gPSBpLnRvRmlyc3QoKTsKLSAgICAgICAgaWYgKCFvKQotICAgICAgICAgICAg
YnJlYWs7Ci0gICAgICAgIHJlbW92ZUNhY2hlRW50cnkobyk7Ci0gICAgfQotfQotCi12b2lkIENh
Y2hlOjpzZXRDYWNoZURpc2FibGVkKGJvb2wgZGlzYWJsZWQpCi17Ci0gICAgY2FjaGVEaXNhYmxl
ZCA9IGRpc2FibGVkOwotICAgIGlmIChkaXNhYmxlZCkKLSAgICAgICAgZmx1c2hBbGwoKTsKLX0K
K307CkluZGV4OiBtaXNjL0NhY2hlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBtaXNjL0NhY2hlLmNwcAko
cmV2aXNpb24gMTE5NDgpCisrKyBtaXNjL0NhY2hlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjUs
MTIyOCArMjUsMzggQEAKICAgICBwYWdlcyBmcm9tIHRoZSB3ZWIuIEl0IGhhcyBhIG1lbW9yeSBj
YWNoZSBmb3IgdGhlc2Ugb2JqZWN0cy4KICovCiAKLSN1bmRlZiBDQUNIRV9ERUJVRwotLy8jZGVm
aW5lIENBQ0hFX0RFQlVHCiAjaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+
CisjaW5jbHVkZSAiQ2FjaGUuaCIKKyNpbmNsdWRlICJDYWNoZWRPYmplY3QuaCIKKyNpbmNsdWRl
ICJDYWNoZWRYU0xTdHlsZVNoZWV0LmgiCisjaW5jbHVkZSAiQ2FjaGVkQ1NTU3R5bGVTaGVldC5o
IgorI2luY2x1ZGUgIkRvY0xvYWRlci5oIgogCi0jaW5jbHVkZSAibG9hZGVyLmgiCisjaW5jbHVk
ZSA8cXBpeG1hcC5oPgogCiAvLyB1cCB0byB3aGljaCBzaXplIGlzIGEgcGljdHVyZSBmb3Igc3Vy
ZSBjYWNoZWFibGUKICNkZWZpbmUgTUFYQ0FDSEVBQkxFIDQwKjEwMjQKIC8vIGRlZmF1bHQgY2Fj
aGUgc2l6ZQogI2RlZmluZSBERUZDQUNIRVNJWkUgNDA5NioxMDI0CiAKLSNpbmNsdWRlIDxxYXN5
bmNpby5oPgotI2luY2x1ZGUgPHFwYWludGVyLmg+Ci0KICNpbmNsdWRlIDxraW8vam9iLmg+CiAj
aW5jbHVkZSA8a2lvL2pvYmNsYXNzZXMuaD4KLSNpbmNsdWRlIDxraW1hZ2Vpby5oPgotI2luY2x1
ZGUgPGtjaGFyc2V0cy5oPgotI2luY2x1ZGUgPGtkZWJ1Zy5oPgotI2luY2x1ZGUgImtodG1sX2Zh
Y3RvcnkuaCIKLSNpbmNsdWRlICJraHRtbF9wYXJ0LmgiCi0jaW5jbHVkZSAiZGVjb2Rlci5oIgot
Ci0jaW5jbHVkZSAiaHRtbC9odG1sX2RvY3VtZW50aW1wbC5oIgotI2luY2x1ZGUgImNzcy9jc3Nf
c3R5bGVzaGVldGltcGwuaCIKLQotI2lmbmRlZiBLSFRNTF9OT19YQkwKLSNpbmNsdWRlICJ4Ymwv
eGJsX2RvY2ltcGwuaCIKLSNlbmRpZgogCiAjaW5jbHVkZSA8a3htbGNvcmUvQXNzZXJ0aW9ucy5o
PgotI2luY2x1ZGUgIktXUUxvYWRlci5oIgogCiB1c2luZyBuYW1lc3BhY2Uga2h0bWw7CiB1c2lu
ZyBuYW1lc3BhY2UgRE9NOwogCiBzdGF0aWMgYm9vbCBjYWNoZURpc2FibGVkOwogCi0vLyBDYWxs
IHRoaXMgIndhbGtlciIgaW5zdGVhZCBvZiBpdGVyYXRvciBzbyBwZW9wbGUgd29uJ3QgZXhwZWN0
IFF0IG9yIFNUTC1zdHlsZSBpdGVyYXRvciBpbnRlcmZhY2UuCi0vLyBKdXN0IGtlZXAgY2FsbGlu
ZyBuZXh0KCkgb24gdGhpcy4gSXQncyBzYWZlIGZyb20gZGVsZXRpb25zIG9mIHRoZSBjdXJyZW50
IGl0ZW0KLWNsYXNzIENhY2hlZE9iamVjdENsaWVudFdhbGtlciB7Ci1wdWJsaWM6Ci0gICAgQ2Fj
aGVkT2JqZWN0Q2xpZW50V2Fsa2VyKGNvbnN0IFFQdHJEaWN0PENhY2hlZE9iamVjdENsaWVudD4g
JmNsaWVudHMpIDogX2N1cnJlbnQoMCksIF9pdGVyYXRvcihjbGllbnRzKSB7IH0KLSAgICBDYWNo
ZWRPYmplY3RDbGllbnQgKm5leHQoKTsKLXByaXZhdGU6Ci0gICAgQ2FjaGVkT2JqZWN0Q2xpZW50
ICpfY3VycmVudDsKLSAgICBRUHRyRGljdEl0ZXJhdG9yPENhY2hlZE9iamVjdENsaWVudD4gX2l0
ZXJhdG9yOwotfTsKLQotQ2FjaGVkT2JqZWN0Ojp+Q2FjaGVkT2JqZWN0KCkKLXsKLSAgICBpZiht
X2RlbGV0ZWQpIGFib3J0KCk7Ci0gICAgQ2FjaGU6OnJlbW92ZUZyb21MUlVMaXN0KHRoaXMpOwot
ICAgIG1fZGVsZXRlZCA9IHRydWU7Ci0gICAgc2V0UmVzcG9uc2UoMCk7Ci0gICAgc2V0QWxsRGF0
YSgwKTsKLX0KLQotdm9pZCBDYWNoZWRPYmplY3Q6OmZpbmlzaCgpCi17Ci0gICAgaWYgKG1fc2l6
ZSA+IENhY2hlOjptYXhDYWNoZWFibGVPYmplY3RTaXplKCkpCi0gICAgICAgIG1fc3RhdHVzID0g
VW5jYWNoZWFibGU7Ci0gICAgZWxzZQotICAgICAgICBtX3N0YXR1cyA9IENhY2hlZDsKLSAgICBL
VVJMIHVybChtX3VybC5xc3RyaW5nKCkpOwotICAgIGlmIChtX2V4cGlyZURhdGVDaGFuZ2VkICYm
IHVybC5wcm90b2NvbCgpLnN0YXJ0c1dpdGgoImh0dHAiKSkKLSAgICAgICAgbV9leHBpcmVEYXRl
Q2hhbmdlZCA9IGZhbHNlOwotfQotCi12b2lkIENhY2hlZE9iamVjdDo6c2V0RXhwaXJlRGF0ZSh0
aW1lX3QgX2V4cGlyZURhdGUsIGJvb2wgY2hhbmdlSHR0cENhY2hlKQotewotICAgIGlmICggX2V4
cGlyZURhdGUgPT0gbV9leHBpcmVEYXRlKQotICAgICAgICByZXR1cm47Ci0KLSAgICBpZiAobV9z
dGF0dXMgPT0gVW5jYWNoZWFibGUgfHwgbV9zdGF0dXMgPT0gQ2FjaGVkKQotICAgIHsKLSAgICAg
ICAgZmluaXNoKCk7Ci0gICAgfQotICAgIG1fZXhwaXJlRGF0ZSA9IF9leHBpcmVEYXRlOwotICAg
IGlmIChjaGFuZ2VIdHRwQ2FjaGUgJiYgbV9leHBpcmVEYXRlKQotICAgICAgIG1fZXhwaXJlRGF0
ZUNoYW5nZWQgPSB0cnVlOwotfQotCi1ib29sIENhY2hlZE9iamVjdDo6aXNFeHBpcmVkKCkgY29u
c3QKLXsKLSAgICBpZiAoIW1fZXhwaXJlRGF0ZSkgcmV0dXJuIGZhbHNlOwotICAgIHRpbWVfdCBu
b3cgPSB0aW1lKDApOwotICAgIHJldHVybiAoZGlmZnRpbWUobm93LCBtX2V4cGlyZURhdGUpID49
IDApOwotfQotCi12b2lkIENhY2hlZE9iamVjdDo6c2V0UmVxdWVzdChSZXF1ZXN0ICpfcmVxdWVz
dCkKLXsKLSAgICBpZiAoIF9yZXF1ZXN0ICYmICFtX3JlcXVlc3QgKQotICAgICAgICBtX3N0YXR1
cyA9IFBlbmRpbmc7Ci0gICAgbV9yZXF1ZXN0ID0gX3JlcXVlc3Q7Ci0gICAgaWYgKGNhbkRlbGV0
ZSgpICYmIG1fZnJlZSkKLSAgICAgICAgZGVsZXRlIHRoaXM7Ci0gICAgZWxzZSBpZiAoYWxsb3dJ
bkxSVUxpc3QoKSkKLSAgICAgICAgQ2FjaGU6Omluc2VydEluTFJVTGlzdCh0aGlzKTsKLX0KLQot
dm9pZCBDYWNoZWRPYmplY3Q6OnJlZihDYWNoZWRPYmplY3RDbGllbnQgKmMpCi17Ci0gICAgbV9j
bGllbnRzLmluc2VydChjLCBjKTsKLSAgICBDYWNoZTo6cmVtb3ZlRnJvbUxSVUxpc3QodGhpcyk7
Ci0gICAgaW5jcmVhc2VBY2Nlc3NDb3VudCgpOwotfQotCi12b2lkIENhY2hlZE9iamVjdDo6ZGVy
ZWYoQ2FjaGVkT2JqZWN0Q2xpZW50ICpjKQotewotICAgIG1fY2xpZW50cy5yZW1vdmUoYyk7Ci0g
ICAgaWYgKGFsbG93SW5MUlVMaXN0KCkpCi0gICAgICAgIENhY2hlOjppbnNlcnRJbkxSVUxpc3Qo
dGhpcyk7Ci19Ci0KLXZvaWQgQ2FjaGVkT2JqZWN0OjpzZXRTaXplKGludCBzaXplKQotewotICAg
IGJvb2wgc2l6ZUNoYW5nZWQgPSBDYWNoZTo6YWRqdXN0U2l6ZSh0aGlzLCBzaXplIC0gbV9zaXpl
KTsKLQotICAgIC8vIFRoZSBvYmplY3QgbXVzdCBub3cgYmUgbW92ZWQgdG8gYSBkaWZmZXJlbnQg
cXVldWUsIHNpbmNlIGl0cyBzaXplIGhhcyBiZWVuIGNoYW5nZWQuCi0gICAgaWYgKHNpemVDaGFu
Z2VkICYmIGFsbG93SW5MUlVMaXN0KCkpCi0gICAgICAgIENhY2hlOjpyZW1vdmVGcm9tTFJVTGlz
dCh0aGlzKTsKLQotICAgIG1fc2l6ZSA9IHNpemU7Ci0gICAgCi0gICAgaWYgKHNpemVDaGFuZ2Vk
ICYmIGFsbG93SW5MUlVMaXN0KCkpCi0gICAgICAgIENhY2hlOjppbnNlcnRJbkxSVUxpc3QodGhp
cyk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQ2FjaGVk
Q1NTU3R5bGVTaGVldDo6Q2FjaGVkQ1NTU3R5bGVTaGVldChEb2NMb2FkZXIqIGRsLCBjb25zdCBE
T01TdHJpbmcgJnVybCwgS0lPOjpDYWNoZUNvbnRyb2wgX2NhY2hlUG9saWN5LCB0aW1lX3QgX2V4
cGlyZURhdGUsIGNvbnN0IFFTdHJpbmcmIGNoYXJzZXQpCi0gICAgOiBDYWNoZWRPYmplY3QodXJs
LCBDU1NTdHlsZVNoZWV0LCBfY2FjaGVQb2xpY3ksIF9leHBpcmVEYXRlKSwgbV9jb2RlYygwKQot
ewotICAgIC8vIEl0J3MgY3NzIHdlIHdhbnQuCi0gICAgc2V0QWNjZXB0KCJ0ZXh0L2NzcyIpOwot
ICAgIC8vIGxvYWQgdGhlIGZpbGUKLSAgICBDYWNoZTo6bG9hZGVyKCktPmxvYWQoZGwsIHRoaXMs
IGZhbHNlKTsKLSAgICBtX2xvYWRpbmcgPSB0cnVlOwotICAgIGlmICghY2hhcnNldC5pc0VtcHR5
KCkpCi0JbV9jb2RlYyA9IFFUZXh0Q29kZWM6OmNvZGVjRm9yTmFtZShjaGFyc2V0LmxhdGluMSgp
KTsKLSAgICBpZiAoIW1fY29kZWMpCi0gICAgICAgIG1fY29kZWMgPSBRVGV4dENvZGVjOjpjb2Rl
Y0Zvck5hbWUoImlzbzg4NTktMSIpOwotfQotCi1DYWNoZWRDU1NTdHlsZVNoZWV0OjpDYWNoZWRD
U1NTdHlsZVNoZWV0KGNvbnN0IERPTVN0cmluZyAmdXJsLCBjb25zdCBRU3RyaW5nICZzdHlsZXNo
ZWV0X2RhdGEpCi0gICAgOiBDYWNoZWRPYmplY3QodXJsLCBDU1NTdHlsZVNoZWV0LCBLSU86OkND
X1ZlcmlmeSwgMCwgc3R5bGVzaGVldF9kYXRhLmxlbmd0aCgpKQotewotICAgIG1fbG9hZGluZyA9
IGZhbHNlOwotICAgIG1fc3RhdHVzID0gUGVyc2lzdGVudDsKLSAgICBtX2NvZGVjID0gMDsKLSAg
ICBtX3NoZWV0ID0gRE9NU3RyaW5nKHN0eWxlc2hlZXRfZGF0YSk7Ci19Ci0KLQotQ2FjaGVkQ1NT
U3R5bGVTaGVldDo6fkNhY2hlZENTU1N0eWxlU2hlZXQoKQotewotfQotCi12b2lkIENhY2hlZENT
U1N0eWxlU2hlZXQ6OnJlZihDYWNoZWRPYmplY3RDbGllbnQgKmMpCi17Ci0gICAgQ2FjaGVkT2Jq
ZWN0OjpyZWYoYyk7Ci0KLSAgICBpZighbV9sb2FkaW5nKSBjLT5zZXRTdHlsZVNoZWV0KCBtX3Vy
bCwgbV9zaGVldCApOwotfQotCi12b2lkIENhY2hlZENTU1N0eWxlU2hlZXQ6OmRlcmVmKENhY2hl
ZE9iamVjdENsaWVudCAqYykKLXsKLSAgICBDYWNoZTo6Zmx1c2goKTsKLSAgICBDYWNoZWRPYmpl
Y3Q6OmRlcmVmKGMpOwotICAgIGlmICggY2FuRGVsZXRlKCkgJiYgbV9mcmVlICkKLSAgICAgIGRl
bGV0ZSB0aGlzOwotfQotCi12b2lkIENhY2hlZENTU1N0eWxlU2hlZXQ6OnNldENoYXJzZXQoIGNv
bnN0IFFTdHJpbmcgJmNocyApCi17Ci0gICAgaWYgKCFjaHMuaXNFbXB0eSgpKSB7Ci0gICAgICAg
IFFUZXh0Q29kZWMgKmNvZGVjID0gUVRleHRDb2RlYzo6Y29kZWNGb3JOYW1lKGNocy5sYXRpbjEo
KSk7Ci0gICAgICAgIGlmIChjb2RlYykKLSAgICAgICAgICAgIG1fY29kZWMgPSBjb2RlYzsKLSAg
ICB9Ci19Ci0KLXZvaWQgQ2FjaGVkQ1NTU3R5bGVTaGVldDo6ZGF0YSggUUJ1ZmZlciAmYnVmZmVy
LCBib29sIGVvZiApCi17Ci0gICAgaWYoIWVvZikgcmV0dXJuOwotICAgIGJ1ZmZlci5jbG9zZSgp
OwotICAgIHNldFNpemUoYnVmZmVyLmJ1ZmZlcigpLnNpemUoKSk7Ci0gICAgUVN0cmluZyBkYXRh
ID0gbV9jb2RlYy0+dG9Vbmljb2RlKCBidWZmZXIuYnVmZmVyKCkuZGF0YSgpLCBzaXplKCkgKTsK
LSAgICBtX3NoZWV0ID0gRE9NU3RyaW5nKGRhdGEpOwotICAgIG1fbG9hZGluZyA9IGZhbHNlOwot
Ci0gICAgY2hlY2tOb3RpZnkoKTsKLX0KLQotdm9pZCBDYWNoZWRDU1NTdHlsZVNoZWV0OjpjaGVj
a05vdGlmeSgpCi17Ci0gICAgaWYgKG1fbG9hZGluZykKLSAgICAgICAgcmV0dXJuOwotCi0gICAg
Q2FjaGVkT2JqZWN0Q2xpZW50V2Fsa2VyIHcobV9jbGllbnRzKTsKLSAgICB3aGlsZSAoQ2FjaGVk
T2JqZWN0Q2xpZW50ICpjID0gdy5uZXh0KCkpIHsKLSAgICAgICAgaWYgKG1fcmVzcG9uc2UgJiYg
IUtXUUlzUmVzcG9uc2VVUkxFcXVhbFRvVVJMKG1fcmVzcG9uc2UsIG1fdXJsKSkKLSAgICAgICAg
ICAgIGMtPnNldFN0eWxlU2hlZXQoRE9NU3RyaW5nKEtXUVJlc3BvbnNlVVJMKG1fcmVzcG9uc2Up
KSwgbV9zaGVldCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGMtPnNldFN0eWxlU2hlZXQo
bV91cmwsIG1fc2hlZXQpOwotICAgIH0KLX0KLQotCi12b2lkIENhY2hlZENTU1N0eWxlU2hlZXQ6
OmVycm9yKCBpbnQgLyplcnIqLywgY29uc3QgY2hhciAqLyp0ZXh0Ki8gKQotewotICAgIG1fbG9h
ZGluZyA9IGZhbHNlOwotICAgIGNoZWNrTm90aWZ5KCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQ2FjaGVkU2NyaXB0OjpDYWNoZWRTY3JpcHQoRG9jTG9h
ZGVyKiBkbCwgY29uc3QgRE9NU3RyaW5nICZ1cmwsIEtJTzo6Q2FjaGVDb250cm9sIF9jYWNoZVBv
bGljeSwgdGltZV90IF9leHBpcmVEYXRlLCBjb25zdCBRU3RyaW5nJiBjaGFyc2V0KQotICAgIDog
Q2FjaGVkT2JqZWN0KHVybCwgU2NyaXB0LCBfY2FjaGVQb2xpY3ksIF9leHBpcmVEYXRlKSwgbV9j
b2RlYygwKQotewotICAgIC8vIEl0J3MgamF2YXNjcmlwdCB3ZSB3YW50LgotICAgIC8vIEJ1dCBz
b21lIHdlYnNpdGVzIHRoaW5rIHRoZWlyIHNjcmlwdHMgYXJlIDxzb21lIHdyb25nIG1pbWV0eXBl
IGhlcmU+Ci0gICAgLy8gYW5kIHJlZnVzZSB0byBzZXJ2ZSB0aGVtIGlmIHdlIG9ubHkgYWNjZXB0
IGFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdC4KLSAgICBzZXRBY2NlcHQoIiovKiIpOwotICAgIG1f
ZXJyb3JPY2N1cnJlZCA9IGZhbHNlOwotICAgIC8vIGxvYWQgdGhlIGZpbGUKLSAgICBDYWNoZTo6
bG9hZGVyKCktPmxvYWQoZGwsIHRoaXMsIGZhbHNlKTsKLSAgICBtX2xvYWRpbmcgPSB0cnVlOwot
ICAgIGlmICghY2hhcnNldC5pc0VtcHR5KCkpCi0gICAgICAgIG1fY29kZWMgPSBRVGV4dENvZGVj
Ojpjb2RlY0Zvck5hbWUoY2hhcnNldC5sYXRpbjEoKSk7Ci0gICAgaWYgKCFtX2NvZGVjKQotCW1f
Y29kZWMgPSBRVGV4dENvZGVjOjpjb2RlY0Zvck5hbWUoImlzbzg4NTktMSIpOwotfQotCi1DYWNo
ZWRTY3JpcHQ6OkNhY2hlZFNjcmlwdChjb25zdCBET01TdHJpbmcgJnVybCwgY29uc3QgUVN0cmlu
ZyAmc2NyaXB0X2RhdGEpCi0gICAgOiBDYWNoZWRPYmplY3QodXJsLCBTY3JpcHQsIEtJTzo6Q0Nf
VmVyaWZ5LCAwLCBzY3JpcHRfZGF0YS5sZW5ndGgoKSkKLXsKLSAgICBtX2Vycm9yT2NjdXJyZWQg
PSBmYWxzZTsKLSAgICBtX2xvYWRpbmcgPSBmYWxzZTsKLSAgICBtX3N0YXR1cyA9IFBlcnNpc3Rl
bnQ7Ci0gICAgbV9jb2RlYyA9IDA7Ci0gICAgbV9zY3JpcHQgPSBET01TdHJpbmcoc2NyaXB0X2Rh
dGEpOwotfQotCi1DYWNoZWRTY3JpcHQ6On5DYWNoZWRTY3JpcHQoKQotewotfQotCi12b2lkIENh
Y2hlZFNjcmlwdDo6cmVmKENhY2hlZE9iamVjdENsaWVudCAqYykKLXsKLSAgICBDYWNoZWRPYmpl
Y3Q6OnJlZihjKTsKLQotICAgIGlmKCFtX2xvYWRpbmcpIGMtPm5vdGlmeUZpbmlzaGVkKHRoaXMp
OwotfQotCi12b2lkIENhY2hlZFNjcmlwdDo6ZGVyZWYoQ2FjaGVkT2JqZWN0Q2xpZW50ICpjKQot
ewotICAgIENhY2hlOjpmbHVzaCgpOwotICAgIENhY2hlZE9iamVjdDo6ZGVyZWYoYyk7Ci0gICAg
aWYgKCBjYW5EZWxldGUoKSAmJiBtX2ZyZWUgKQotICAgICAgZGVsZXRlIHRoaXM7Ci19Ci0KLXZv
aWQgQ2FjaGVkU2NyaXB0OjpzZXRDaGFyc2V0KCBjb25zdCBRU3RyaW5nICZjaHMgKQotewotICAg
IGlmICghY2hzLmlzRW1wdHkoKSkgewotICAgICAgICBRVGV4dENvZGVjICpjb2RlYyA9IFFUZXh0
Q29kZWM6OmNvZGVjRm9yTmFtZShjaHMubGF0aW4xKCkpOwotICAgICAgICBpZiAoY29kZWMpCi0g
ICAgICAgICAgICBtX2NvZGVjID0gY29kZWM7Ci0gICAgfQotfQotCi12b2lkIENhY2hlZFNjcmlw
dDo6ZGF0YSggUUJ1ZmZlciAmYnVmZmVyLCBib29sIGVvZiApCi17Ci0gICAgaWYoIWVvZikgcmV0
dXJuOwotICAgIGJ1ZmZlci5jbG9zZSgpOwotICAgIHNldFNpemUoYnVmZmVyLmJ1ZmZlcigpLnNp
emUoKSk7Ci0gICAgUVN0cmluZyBkYXRhID0gbV9jb2RlYy0+dG9Vbmljb2RlKCBidWZmZXIuYnVm
ZmVyKCkuZGF0YSgpLCBzaXplKCkgKTsKLSAgICBtX3NjcmlwdCA9IERPTVN0cmluZyhkYXRhKTsK
LSAgICBtX2xvYWRpbmcgPSBmYWxzZTsKLSAgICBjaGVja05vdGlmeSgpOwotfQotCi12b2lkIENh
Y2hlZFNjcmlwdDo6Y2hlY2tOb3RpZnkoKQotewotICAgIGlmKG1fbG9hZGluZykgcmV0dXJuOwot
Ci0gICAgQ2FjaGVkT2JqZWN0Q2xpZW50V2Fsa2VyIHcobV9jbGllbnRzKTsKLSAgICB3aGlsZSAo
Q2FjaGVkT2JqZWN0Q2xpZW50ICpjID0gdy5uZXh0KCkpCi0gICAgICAgIGMtPm5vdGlmeUZpbmlz
aGVkKHRoaXMpOwotfQotCi0KLXZvaWQgQ2FjaGVkU2NyaXB0OjplcnJvciggaW50IC8qZXJyKi8s
IGNvbnN0IGNoYXIgKi8qdGV4dCovICkKLXsKLSAgICBtX2xvYWRpbmcgPSBmYWxzZTsKLSAgICBt
X2Vycm9yT2NjdXJyZWQgPSB0cnVlOwotICAgIGNoZWNrTm90aWZ5KCk7Ci19Ci0KLS8vIC0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLXN0YXRpYyBib29sIGNyb3NzRG9tYWlu
KGNvbnN0IFFTdHJpbmcgJmEsIGNvbnN0IFFTdHJpbmcgJmIpCi17Ci0gICAgaWYgKGEgPT0gYikg
cmV0dXJuIGZhbHNlOwotCi0gICAgUVN0cmluZ0xpc3QgbDEgPSBRU3RyaW5nTGlzdDo6c3BsaXQo
Jy4nLCBhKTsKLSAgICBRU3RyaW5nTGlzdCBsMiA9IFFTdHJpbmdMaXN0OjpzcGxpdCgnLicsIGIp
OwotCi0gICAgd2hpbGUobDEuY291bnQoKSA+IGwyLmNvdW50KCkpCi0gICAgICAgIGwxLnBvcF9m
cm9udCgpOwotCi0gICAgd2hpbGUobDIuY291bnQoKSA+IGwxLmNvdW50KCkpCi0gICAgICAgIGwy
LnBvcF9mcm9udCgpOwotCi0gICAgd2hpbGUobDIuY291bnQoKSA+PSAyKQotICAgIHsKLSAgICAg
ICAgaWYgKGwxID09IGwyKQotICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgbDEu
cG9wX2Zyb250KCk7Ci0gICAgICAgIGwyLnBvcF9mcm9udCgpOwotICAgIH0KLSAgICByZXR1cm4g
dHJ1ZTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotdm9pZCBDYWNoZWRJ
bWFnZUNhbGxiYWNrOjpub3RpZnlVcGRhdGUoKSAKLXsgCi0gICAgaWYgKGNhY2hlZEltYWdlKSB7
Ci0gICAgICAgIGNhY2hlZEltYWdlLT5kb19ub3RpZnkgKGNhY2hlZEltYWdlLT5waXhtYXAoKSwg
Y2FjaGVkSW1hZ2UtPnBpeG1hcCgpLnJlY3QoKSk7IAotICAgICAgICBRU2l6ZSBzID0gY2FjaGVk
SW1hZ2UtPnBpeG1hcF9zaXplKCk7Ci0gICAgICAgIGNhY2hlZEltYWdlLT5zZXRTaXplKHMud2lk
dGgoKSAqIHMuaGVpZ2h0KCkgKiAyKTsKLQotICAgICAgICAvLyBBZnRlciByZWNlaXZpbmcgdGhl
IGltYWdlIGhlYWRlciB3ZSBhcmUgZ3VhcmFudGVlZCB0byBrbm93Ci0gICAgICAgIC8vIHRoZSBp
bWFnZSBzaXplLiAgQWx0aG91Z2ggYWxsIG9mIHRoZSBkYXRhIG1heSBub3QgaGF2ZSBhcnJpdmVk
IG9yCi0gICAgICAgIC8vIGJlZW4gZGVjb2RlZCB3ZSBjYW4gY29uc2lkZXIgdGhlIGltYWdlIGxv
YWRlZCBmb3IgcHVycG9zZWQgb2YKLSAgICAgICAgLy8gbGF5b3V0IGFuZCBkaXNwYXRjaGluZyB0
aGUgaW1hZ2UncyBvbmxvYWQgaGFuZGxlci4gIFJlbW92aW5nIHRoZSByZXF1ZXN0IGZyb20KLSAg
ICAgICAgLy8gdGhlIGxpc3Qgb2YgYmFja2dyb3VuZCBkZWNvZGluZyByZXF1ZXN0cyB3aWxsIGVu
c3VyZSB0aGF0IExvYWRlcjo6bnVtUmVxdWVzdHMoKSAKLSAgICAgICAgLy8gZG9lcyBub3QgY291
bnQgdGhpcyBiYWNrZ3JvdW5kIHJlcXVlc3QuICBGdXJ0aGVyIG51bVJlcXVlc3RzKCkgY2FuCi0g
ICAgICAgIC8vIGJlIGNvcnJlY3RseSB1c2VkIGJ5IHRoZSBwYXJ0IHRvIGRldGVybWluZSBpZiBs
b2FkaW5nIGlzIHN1ZmZpY2llbnRseQotICAgICAgICAvLyBjb21wbGV0ZSB0byBkaXNwYXRjaCB0
aGUgcGFnZSdzIG9ubG9hZCBoYW5kbGVyLgotICAgICAgICBSZXF1ZXN0ICpyID0gY2FjaGVkSW1h
Z2UtPm1fcmVxdWVzdDsKLSAgICAgICAgRG9jTG9hZGVyICpkbCA9IHItPm1fZG9jTG9hZGVyOwot
Ci0gICAgICAgIGtodG1sOjpDYWNoZTo6bG9hZGVyKCktPnJlbW92ZUJhY2tncm91bmREZWNvZGlu
Z1JlcXVlc3Qocik7Ci0KLSAgICAgICAgLy8gUG9rZSB0aGUgcGFydCB0byBnZXQgaXQgdG8gZG8g
YSBjaGVja0NvbXBsZXRlZCgpLiAgT25seSBkbyB0aGlzIGZvcgotICAgICAgICAvLyB0aGUgZmly
c3QgdXBkYXRlIHRvIG1pbmltaXplIHdvcmsuICBOb3RlIHRoYXQgd2UgYXJlIGd1YXJhbnRlZWQg
dG8gaGF2ZQotICAgICAgICAvLyByZWFkIHRoZSBoZWFkZXIgd2hlbiB3ZSByZWNlaXZlZCB0aGlz
IGZpcnN0IHVwZGF0ZSwgd2hpY2ggaXMgdHJpZ2dlcmVkCi0gICAgICAgIC8vIGJ5IHRoZSBmaXJz
dCBrQ0dJbWFnZVN0YXR1c0luY29tcGxldGUgc3RhdHVzIGZyb20gQ0cuIGtDR0ltYWdlU3RhdHVz
SW5jb21wbGV0ZQotICAgICAgICAvLyByZWFsbHkgbWVhbnMgdGhhdCB0aGUgQ0cgZGVjb2RlciBp
cyB3YWl0aW5nIGZvciBtb3JlIGRhdGEsIGJ1dCBoYXMgYWxyZWFkeQotICAgICAgICAvLyByZWFk
IHRoZSBoZWFkZXIuCi0gICAgICAgIGlmICghaGVhZGVyUmVjZWl2ZWQpIHsKLSAgICAgICAgICAg
IGVtaXQga2h0bWw6OkNhY2hlOjpsb2FkZXIoKS0+cmVxdWVzdERvbmUoIGRsLCBjYWNoZWRJbWFn
ZSApOwotICAgICAgICAgICAgaGVhZGVyUmVjZWl2ZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAg
fQotfQotCi12b2lkIENhY2hlZEltYWdlQ2FsbGJhY2s6Om5vdGlmeUZpbmlzaGVkKCkKLXsKLSAg
ICBpZiAoY2FjaGVkSW1hZ2UpIHsKLSAgICAgICAgY2FjaGVkSW1hZ2UtPmRvX25vdGlmeSAoY2Fj
aGVkSW1hZ2UtPnBpeG1hcCgpLCBjYWNoZWRJbWFnZS0+cGl4bWFwKCkucmVjdCgpKTsgCi0gICAg
ICAgIGNhY2hlZEltYWdlLT5tX2xvYWRpbmcgPSBmYWxzZTsKLSAgICAgICAgY2FjaGVkSW1hZ2Ut
PmNoZWNrTm90aWZ5KCk7Ci0gICAgICAgIFFTaXplIHMgPSBjYWNoZWRJbWFnZS0+cGl4bWFwX3Np
emUoKTsKLSAgICAgICAgY2FjaGVkSW1hZ2UtPnNldFNpemUocy53aWR0aCgpICogcy5oZWlnaHQo
KSAqIDIpOwotCQotICAgICAgICBSZXF1ZXN0ICpyID0gY2FjaGVkSW1hZ2UtPm1fcmVxdWVzdDsK
LSAgICAgICAgRG9jTG9hZGVyICpkbCA9IHItPm1fZG9jTG9hZGVyOwotCi0gICAgICAgIGtodG1s
OjpDYWNoZTo6bG9hZGVyKCktPnJlbW92ZUJhY2tncm91bmREZWNvZGluZ1JlcXVlc3Qocik7Ci0K
LSAgICAgICAgLy8gUG9rZSB0aGUgcGFydCB0byBnZXQgaXQgdG8gZG8gYSBjaGVja0NvbXBsZXRl
ZCgpLgotICAgICAgICBlbWl0IGtodG1sOjpDYWNoZTo6bG9hZGVyKCktPnJlcXVlc3REb25lKCBk
bCwgY2FjaGVkSW1hZ2UgKTsKLSAgICAgICAgCi0gICAgICAgIGRlbGV0ZSByOwotICAgIH0KLX0K
LQotdm9pZCBDYWNoZWRJbWFnZUNhbGxiYWNrOjpub3RpZnlEZWNvZGluZ0Vycm9yKCkKLXsKLSAg
ICBpZiAoY2FjaGVkSW1hZ2UpIHsKLSAgICAgICAgaGFuZGxlRXJyb3IoKTsKLSAgICB9Ci19Ci0K
LXZvaWQgQ2FjaGVkSW1hZ2VDYWxsYmFjazo6aGFuZGxlRXJyb3IoKQotewotICAgIGlmIChjYWNo
ZWRJbWFnZSkgewotICAgICAgICBjYWNoZWRJbWFnZS0+ZXJyb3JPY2N1cmVkID0gdHJ1ZTsKLSAg
ICAgICAgUVBpeG1hcCBlcCA9IGNhY2hlZEltYWdlLT5waXhtYXAoKTsKLSAgICAgICAgY2FjaGVk
SW1hZ2UtPmRvX25vdGlmeSAoZXAsIGVwLnJlY3QoKSk7Ci0gICAgICAgIENhY2hlOjpyZW1vdmVD
YWNoZUVudHJ5IChjYWNoZWRJbWFnZSk7Ci0KLSAgICAgICAgY2xlYXIoKTsKLSAgICB9Ci19Ci0K
LXZvaWQgQ2FjaGVkSW1hZ2VDYWxsYmFjazo6Y2xlYXIoKSAKLXsKLSAgICBpZiAoY2FjaGVkSW1h
Z2UgJiYgY2FjaGVkSW1hZ2UtPm1fcmVxdWVzdCkgewotICAgICAgICBSZXF1ZXN0ICpyID0gY2Fj
aGVkSW1hZ2UtPm1fcmVxdWVzdDsKLSAgICAgICAgRG9jTG9hZGVyICpkbCA9IHItPm1fZG9jTG9h
ZGVyOwotCi0gICAgICAgIGtodG1sOjpDYWNoZTo6bG9hZGVyKCktPnJlbW92ZUJhY2tncm91bmRE
ZWNvZGluZ1JlcXVlc3Qocik7Ci0KLSAgICAgICAgLy8gUG9rZSB0aGUgcGFydCB0byBnZXQgaXQg
dG8gZG8gYSBjaGVja0NvbXBsZXRlZCgpLgotICAgICAgICBlbWl0IGtodG1sOjpDYWNoZTo6bG9h
ZGVyKCktPnJlcXVlc3RGYWlsZWQoIGRsLCBjYWNoZWRJbWFnZSApOwotCi0gICAgICAgIGRlbGV0
ZSByOwotICAgIH0KLSAgICBjYWNoZWRJbWFnZSA9IDA7Ci19Ci0KLUNhY2hlZEltYWdlOjpDYWNo
ZWRJbWFnZShEb2NMb2FkZXIqIGRsLCBjb25zdCBET01TdHJpbmcgJnVybCwgS0lPOjpDYWNoZUNv
bnRyb2wgX2NhY2hlUG9saWN5LCB0aW1lX3QgX2V4cGlyZURhdGUpCi0gICAgOiBRT2JqZWN0KCks
IENhY2hlZE9iamVjdCh1cmwsIEltYWdlLCBfY2FjaGVQb2xpY3ksIF9leHBpcmVEYXRlKQotICAg
ICwgbV9kYXRhU2l6ZSgwKQotewotICAgIHAgPSAwOwotICAgIHBpeFBhcnQgPSAwOwotICAgIGJn
ID0gMDsKLSAgICBpc0Z1bGx5VHJhbnNwYXJlbnQgPSBmYWxzZTsKLSAgICBlcnJvck9jY3VyZWQg
PSBmYWxzZTsKLSAgICBtb25vY2hyb21lID0gZmFsc2U7Ci0gICAgZm9ybWF0VHlwZSA9IDA7Ci0g
ICAgbV9zdGF0dXMgPSBVbmtub3duOwotICAgIGltZ1NvdXJjZSA9IDA7Ci0gICAgbV9sb2FkaW5n
ID0gdHJ1ZTsKLSAgICBtX3Nob3dBbmltYXRpb25zID0gZGwtPnNob3dBbmltYXRpb25zKCk7Ci0g
ICAgaWYgKFFQaXhtYXA6OnNob3VsZFVzZVRocmVhZGVkRGVjb2RpbmcoKSkKLSAgICAgICAgbV9k
ZWNvZGVyQ2FsbGJhY2sgPSBuZXcgQ2FjaGVkSW1hZ2VDYWxsYmFjayh0aGlzKTsKLSAgICBlbHNl
Ci0gICAgICAgIG1fZGVjb2RlckNhbGxiYWNrID0gMDsKLX0KLQotQ2FjaGVkSW1hZ2U6On5DYWNo
ZWRJbWFnZSgpCi17Ci0gICAgY2xlYXIoKTsKLX0KLQotdm9pZCBDYWNoZWRJbWFnZTo6cmVmKCBD
YWNoZWRPYmplY3RDbGllbnQgKmMgKQotewotICAgIENhY2hlZE9iamVjdDo6cmVmKGMpOwotCi0g
ICAgLy8gZm9yIG1vdXNlb3ZlcnMsIGR5bmFtaWMgY2hhbmdlcwotICAgIGlmICghdmFsaWRfcmVj
dCgpLmlzTnVsbCgpKQotICAgICAgICBjLT5zZXRQaXhtYXAoIHBpeG1hcCgpLCB2YWxpZF9yZWN0
KCksIHRoaXMpOwotCi0gICAgaWYoIW1fbG9hZGluZykKLSAgICAgICAgYy0+bm90aWZ5RmluaXNo
ZWQodGhpcyk7Ci19Ci0KLXZvaWQgQ2FjaGVkSW1hZ2U6OmRlcmVmKCBDYWNoZWRPYmplY3RDbGll
bnQgKmMgKQotewotICAgIENhY2hlOjpmbHVzaCgpOwotICAgIENhY2hlZE9iamVjdDo6ZGVyZWYo
Yyk7Ci0gICAgaWYgKCBjYW5EZWxldGUoKSAmJiBtX2ZyZWUgKQotICAgICAgICBkZWxldGUgdGhp
czsKLX0KLQotY29uc3QgUVBpeG1hcCAmQ2FjaGVkSW1hZ2U6OnRpbGVkX3BpeG1hcChjb25zdCBR
Q29sb3ImIG5ld2MpCi17Ci0gICAgcmV0dXJuIHBpeG1hcCgpOwotfQotCi1jb25zdCBRUGl4bWFw
ICZDYWNoZWRJbWFnZTo6cGl4bWFwKCApIGNvbnN0Ci17Ci0gICAgaWYoZXJyb3JPY2N1cmVkKQot
ICAgICAgICByZXR1cm4gKkNhY2hlOjpicm9rZW5QaXhtYXA7Ci0KLSAgICBpZiAocCkKLSAgICAg
ICAgcmV0dXJuICpwOwotCi0gICAgcmV0dXJuICpDYWNoZTo6bnVsbFBpeG1hcDsKLX0KLQotUVNp
emUgQ2FjaGVkSW1hZ2U6OnBpeG1hcF9zaXplKCkgY29uc3QKLXsKLSAgICByZXR1cm4gKHAgPyBw
LT5zaXplKCkgOiBRU2l6ZSgpKTsKLX0KLQotUVJlY3QgQ2FjaGVkSW1hZ2U6OnZhbGlkX3JlY3Qo
KSBjb25zdAotewotICAgIHJldHVybiAocCA/IHAtPnJlY3QoKSA6IFFSZWN0KCkpOwotfQotCi12
b2lkIENhY2hlZEltYWdlOjpkb19ub3RpZnkoY29uc3QgUVBpeG1hcCYgcCwgY29uc3QgUVJlY3Qm
IHIpCi17Ci0gICAgQ2FjaGVkT2JqZWN0Q2xpZW50V2Fsa2VyIHcobV9jbGllbnRzKTsKLSAgICB3
aGlsZSAoQ2FjaGVkT2JqZWN0Q2xpZW50ICpjID0gdy5uZXh0KCkpCi0gICAgICAgIGMtPnNldFBp
eG1hcChwLCByLCB0aGlzKTsKLX0KLQotdm9pZCBDYWNoZWRJbWFnZTo6c2V0U2hvd0FuaW1hdGlv
bnMoIEtIVE1MU2V0dGluZ3M6OktBbmltYXRpb25BZHZpY2Ugc2hvd0FuaW1hdGlvbnMgKQotewot
ICAgIG1fc2hvd0FuaW1hdGlvbnMgPSBzaG93QW5pbWF0aW9uczsKLX0KLQotdm9pZCBDYWNoZWRJ
bWFnZTo6Y2xlYXIoKQotewotICAgIGRlbGV0ZSBwOyAgIHAgPSAwOwotICAgIGRlbGV0ZSBiZzsg
IGJnID0gMDsKLSAgICBkZWxldGUgcGl4UGFydDsgcGl4UGFydCA9IDA7Ci0KLSAgICBmb3JtYXRU
eXBlID0gMDsKLQotICAgIHNldFNpemUoMCk7Ci0KLSAgICAvLyBObyBuZWVkIHRvIGRlbGV0ZSBp
bWFnZVNvdXJjZSAtIFFNb3ZpZSBkb2VzIGl0IGZvciB1cwotICAgIGltZ1NvdXJjZSA9IDA7Ci0K
LSAgICBpZiAobV9kZWNvZGVyQ2FsbGJhY2spIHsKLSAgICAgICAgbV9kZWNvZGVyQ2FsbGJhY2st
PmNsZWFyKCk7Ci0gICAgICAgIG1fZGVjb2RlckNhbGxiYWNrLT5kZXJlZigpOwotICAgICAgICBt
X2RlY29kZXJDYWxsYmFjayA9IDA7Ci0gICAgfQotfQotCi12b2lkIENhY2hlZEltYWdlOjpkYXRh
ICggUUJ1ZmZlciAmX2J1ZmZlciwgYm9vbCBlb2YgKQotewotI2lmZGVmIENBQ0hFX0RFQlVHCi0g
ICAga2REZWJ1ZyggNjA2MCApIDw8IHRoaXMgPDwgImluIENhY2hlZEltYWdlOjpkYXRhKGJ1ZmZl
cnNpemUgIiA8PCBfYnVmZmVyLmJ1ZmZlcigpLnNpemUoKSA8PCIsIGVvZj0iIDw8IGVvZiA8PCBl
bmRsOwotI2VuZGlmCi0KLSAgICBib29sIGNhbkRyYXcgPSBmYWxzZTsKLSAgICAKLSAgICBtX2Rh
dGFTaXplID0gX2J1ZmZlci5zaXplKCk7Ci0gICAgICAgIAotICAgIC8vIElmIHdlJ3JlIGF0IGVv
ZiBhbmQgZG9uJ3QgaGF2ZSBhIHBpeG1hcCB5ZXQsIHRoZSBkYXRhCi0gICAgLy8gbXVzdCBoYXZl
IGFycml2ZWQgaW4gb25lIGNodW5rLiAgVGhpcyBhdm9pZHMgdGhlIGF0dGVtcHQKLSAgICAvLyB0
byBwZXJmb3JtIGluY3JlbWVudGFsIGRlY29kaW5nLgotICAgIGlmIChlb2YgJiYgIXApIHsKLSAg
ICAgICAgcCA9IG5ldyBRUGl4bWFwKF9idWZmZXIuYnVmZmVyKCksIEtXUVJlc3BvbnNlTUlNRVR5
cGUobV9yZXNwb25zZSkpOwotICAgICAgICBpZiAobV9kZWNvZGVyQ2FsbGJhY2spCi0gICAgICAg
ICAgICBtX2RlY29kZXJDYWxsYmFjay0+bm90aWZ5RmluaXNoZWQoKTsKLSAgICAgICAgY2FuRHJh
dyA9IHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gQWx3YXlzIGF0dGVtcHQgdG8gbG9h
ZCB0aGUgaW1hZ2UgaW5jcmVtZW50YWxseS4KLSAgICAgICAgaWYgKCFwKQotICAgICAgICAgICAg
cCA9IG5ldyBRUGl4bWFwKEtXUVJlc3BvbnNlTUlNRVR5cGUobV9yZXNwb25zZSkpOwotICAgICAg
ICBjYW5EcmF3ID0gcC0+cmVjZWl2ZWREYXRhKF9idWZmZXIuYnVmZmVyKCksIGVvZiwgbV9kZWNv
ZGVyQ2FsbGJhY2spOwotICAgIH0KLSAgICAKLSAgICAvLyBJZiB3ZSBoYXZlIGEgZGVjb2Rlciwg
d2UnbGwgYmUgbm90aWZpZWQgd2hlbiBkZWNvZGluZyBoYXMgY29tcGxldGVkLgotICAgIGlmICgh
bV9kZWNvZGVyQ2FsbGJhY2spIHsKLSAgICAgICAgaWYgKGNhbkRyYXcgfHwgZW9mKSB7Ci0gICAg
ICAgICAgICBpZiAocC0+aXNOdWxsKCkpIHsKLSAgICAgICAgICAgICAgICBlcnJvck9jY3VyZWQg
PSB0cnVlOwotICAgICAgICAgICAgICAgIFFQaXhtYXAgZXAgPSBwaXhtYXAoKTsKLSAgICAgICAg
ICAgICAgICBkb19ub3RpZnkgKGVwLCBlcC5yZWN0KCkpOwotICAgICAgICAgICAgICAgIENhY2hl
OjpyZW1vdmVDYWNoZUVudHJ5ICh0aGlzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVs
c2UKLSAgICAgICAgICAgICAgICBkb19ub3RpZnkoKnAsIHAtPnJlY3QoKSk7Ci0KLSAgICAgICAg
ICAgIFFTaXplIHMgPSBwaXhtYXBfc2l6ZSgpOwotICAgICAgICAgICAgc2V0U2l6ZShzLndpZHRo
KCkgKiBzLmhlaWdodCgpICogMik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGVvZikgewotICAg
ICAgICAgICAgbV9sb2FkaW5nID0gZmFsc2U7Ci0gICAgICAgICAgICBjaGVja05vdGlmeSgpOwot
ICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIENhY2hlZEltYWdlOjplcnJvciggaW50IC8qZXJy
Ki8sIGNvbnN0IGNoYXIgKi8qdGV4dCovICkKLXsKLSNpZmRlZiBDQUNIRV9ERUJVRwotICAgIGtk
RGVidWcoNjA2MCkgPDwgIkNhaGNlZEltYWdlOjplcnJvciIgPDwgZW5kbDsKLSNlbmRpZgotCi0g
ICAgY2xlYXIoKTsKLSAgICBlcnJvck9jY3VyZWQgPSB0cnVlOwotICAgIGRvX25vdGlmeShwaXht
YXAoKSwgUVJlY3QoMCwgMCwgMTYsIDE2KSk7Ci0gICAgbV9sb2FkaW5nID0gZmFsc2U7Ci0gICAg
Y2hlY2tOb3RpZnkoKTsKLX0KLQotdm9pZCBDYWNoZWRJbWFnZTo6Y2hlY2tOb3RpZnkoKQotewot
ICAgIGlmKG1fbG9hZGluZykgcmV0dXJuOwotCi0gICAgQ2FjaGVkT2JqZWN0Q2xpZW50V2Fsa2Vy
IHcobV9jbGllbnRzKTsKLSAgICB3aGlsZSAoQ2FjaGVkT2JqZWN0Q2xpZW50ICpjID0gdy5uZXh0
KCkpIHsKLSAgICAgICAgYy0+bm90aWZ5RmluaXNoZWQodGhpcyk7Ci0gICAgfQotfQotCi0vLyAt
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNpZmRlZiBLSFRNTF9YU0xUCi0K
LUNhY2hlZFhTTFN0eWxlU2hlZXQ6OkNhY2hlZFhTTFN0eWxlU2hlZXQoRG9jTG9hZGVyKiBkbCwg
Y29uc3QgRE9NU3RyaW5nICZ1cmwsIEtJTzo6Q2FjaGVDb250cm9sIF9jYWNoZVBvbGljeSwgdGlt
ZV90IF9leHBpcmVEYXRlKQotOiBDYWNoZWRPYmplY3QodXJsLCBYU0xTdHlsZVNoZWV0LCBfY2Fj
aGVQb2xpY3ksIF9leHBpcmVEYXRlKQotewotICAgIC8vIEl0J3MgWE1MIHdlIHdhbnQuCi0gICAg
Ly8gRklYTUU6IFRoaXMgc2hvdWxkIGFjY2VwdCBtb3JlIGdlbmVyYWwgeG1sIGZvcm1hdHMgKi8q
K3htbCwgaW1hZ2Uvc3ZnK3htbCBmb3IgZXhhbXBsZS4KLSAgICBzZXRBY2NlcHQoInRleHQveG1s
LCBhcHBsaWNhdGlvbi94bWwsIGFwcGxpY2F0aW9uL3hodG1sK3htbCwgdGV4dC94c2wsIGFwcGxp
Y2F0aW9uL3Jzcyt4bWwsIGFwcGxpY2F0aW9uL2F0b20reG1sIik7Ci0gICAgCi0gICAgLy8gbG9h
ZCB0aGUgZmlsZQotICAgIENhY2hlOjpsb2FkZXIoKS0+bG9hZChkbCwgdGhpcywgZmFsc2UpOwot
ICAgIG1fbG9hZGluZyA9IHRydWU7Ci0gICAgbV9kZWNvZGVyID0gbmV3IERlY29kZXI7Ci19Ci0K
LXZvaWQgQ2FjaGVkWFNMU3R5bGVTaGVldDo6cmVmKENhY2hlZE9iamVjdENsaWVudCAqYykKLXsK
LSAgICBDYWNoZWRPYmplY3Q6OnJlZihjKTsKLSAgICAKLSAgICBpZiAoIW1fbG9hZGluZykKLSAg
ICAgICAgYy0+c2V0U3R5bGVTaGVldChtX3VybCwgbV9zaGVldCk7Ci19Ci0KLXZvaWQgQ2FjaGVk
WFNMU3R5bGVTaGVldDo6ZGVyZWYoQ2FjaGVkT2JqZWN0Q2xpZW50ICpjKQotewotICAgIENhY2hl
OjpmbHVzaCgpOwotICAgIENhY2hlZE9iamVjdDo6ZGVyZWYoYyk7Ci0gICAgaWYgKGNhbkRlbGV0
ZSgpICYmIG1fZnJlZSkKLSAgICAgICAgZGVsZXRlIHRoaXM7Ci19Ci0KLXZvaWQgQ2FjaGVkWFNM
U3R5bGVTaGVldDo6c2V0Q2hhcnNldCggY29uc3QgUVN0cmluZyAmY2hzICkKLXsKLSAgICBpZiAo
IWNocy5pc0VtcHR5KCkpCi0gICAgICAgIG1fZGVjb2Rlci0+c2V0RW5jb2RpbmcoY2hzLmxhdGlu
MSgpLCBEZWNvZGVyOjpFbmNvZGluZ0Zyb21IVFRQSGVhZGVyKTsKLX0KLQotdm9pZCBDYWNoZWRY
U0xTdHlsZVNoZWV0OjpkYXRhKFFCdWZmZXIgJmJ1ZmZlciwgYm9vbCBlb2YpCi17Ci0gICAgaWYo
IWVvZikgcmV0dXJuOwotICAgIGJ1ZmZlci5jbG9zZSgpOwotICAgIHNldFNpemUoYnVmZmVyLmJ1
ZmZlcigpLnNpemUoKSk7Ci0gICAgUVN0cmluZyBkYXRhID0gbV9kZWNvZGVyLT5kZWNvZGUoYnVm
ZmVyLmJ1ZmZlcigpLmRhdGEoKSwgc2l6ZSgpKTsKLSAgICBtX3NoZWV0ID0gRE9NU3RyaW5nKGRh
dGEpOwotICAgIG1fbG9hZGluZyA9IGZhbHNlOwotICAgIAotICAgIGNoZWNrTm90aWZ5KCk7Ci19
Ci0KLXZvaWQgQ2FjaGVkWFNMU3R5bGVTaGVldDo6Y2hlY2tOb3RpZnkoKQotewotICAgIGlmICht
X2xvYWRpbmcpCi0gICAgICAgIHJldHVybjsKLSAgICAKLSAgICBDYWNoZWRPYmplY3RDbGllbnRX
YWxrZXIgdyhtX2NsaWVudHMpOwotICAgIHdoaWxlIChDYWNoZWRPYmplY3RDbGllbnQgKmMgPSB3
Lm5leHQoKSkKLSAgICAgICAgYy0+c2V0U3R5bGVTaGVldChtX3VybCwgbV9zaGVldCk7Ci19Ci0K
LQotdm9pZCBDYWNoZWRYU0xTdHlsZVNoZWV0OjplcnJvciggaW50IC8qZXJyKi8sIGNvbnN0IGNo
YXIgKi8qdGV4dCovICkKLXsKLSAgICBtX2xvYWRpbmcgPSBmYWxzZTsKLSAgICBjaGVja05vdGlm
eSgpOwotfQotCi0jZW5kaWYKLQotI2lmbmRlZiBLSFRNTF9OT19YQkwKLUNhY2hlZFhCTERvY3Vt
ZW50OjpDYWNoZWRYQkxEb2N1bWVudChEb2NMb2FkZXIqIGRsLCBjb25zdCBET01TdHJpbmcgJnVy
bCwgS0lPOjpDYWNoZUNvbnRyb2wgX2NhY2hlUG9saWN5LCB0aW1lX3QgX2V4cGlyZURhdGUpCi06
IENhY2hlZE9iamVjdCh1cmwsIFhCTCwgX2NhY2hlUG9saWN5LCBfZXhwaXJlRGF0ZSksIG1fZG9j
dW1lbnQoMCkKLXsKLSAgICAvLyBJdCdzIFhNTCB3ZSB3YW50LgotICAgIHNldEFjY2VwdCgidGV4
dC94bWwsIGFwcGxpY2F0aW9uL3htbCwgYXBwbGljYXRpb24veGh0bWwreG1sLCB0ZXh0L3hzbCwg
YXBwbGljYXRpb24vcnNzK3htbCwgYXBwbGljYXRpb24vYXRvbSt4bWwiKTsKLSAgICAKLSAgICAv
LyBMb2FkIHRoZSBmaWxlCi0gICAgQ2FjaGU6OmxvYWRlcigpLT5sb2FkKGRsLCB0aGlzLCBmYWxz
ZSk7Ci0gICAgbV9sb2FkaW5nID0gdHJ1ZTsKLSAgICBtX2RlY29kZXIgPSBuZXcgRGVjb2RlcjsK
LX0KLQotQ2FjaGVkWEJMRG9jdW1lbnQ6On5DYWNoZWRYQkxEb2N1bWVudCgpCi17Ci0gICAgaWYg
KG1fZG9jdW1lbnQpCi0gICAgICAgIG1fZG9jdW1lbnQtPmRlcmVmKCk7Ci19Ci0KLXZvaWQgQ2Fj
aGVkWEJMRG9jdW1lbnQ6OnJlZihDYWNoZWRPYmplY3RDbGllbnQgKmMpCi17Ci0gICAgQ2FjaGVk
T2JqZWN0OjpyZWYoYyk7Ci0gICAgaWYgKCFtX2xvYWRpbmcpCi0gICAgICAgIGMtPnNldFhCTERv
Y3VtZW50KG1fdXJsLCBtX2RvY3VtZW50KTsKLX0KLQotdm9pZCBDYWNoZWRYQkxEb2N1bWVudDo6
ZGVyZWYoQ2FjaGVkT2JqZWN0Q2xpZW50ICpjKQotewotICAgIENhY2hlOjpmbHVzaCgpOwotICAg
IENhY2hlZE9iamVjdDo6ZGVyZWYoYyk7Ci0gICAgaWYgKGNhbkRlbGV0ZSgpICYmIG1fZnJlZSkK
LSAgICAgICAgZGVsZXRlIHRoaXM7Ci19Ci0KLXZvaWQgQ2FjaGVkWEJMRG9jdW1lbnQ6OnNldENo
YXJzZXQoIGNvbnN0IFFTdHJpbmcgJmNocyApCi17Ci0gICAgaWYgKCFjaHMuaXNFbXB0eSgpKQot
ICAgICAgICBtX2RlY29kZXItPnNldEVuY29kaW5nKGNocy5sYXRpbjEoKSwgRGVjb2Rlcjo6RW5j
b2RpbmdGcm9tSFRUUEhlYWRlcik7Ci19Ci0KLXZvaWQgQ2FjaGVkWEJMRG9jdW1lbnQ6OmRhdGEo
IFFCdWZmZXIgJmJ1ZmZlciwgYm9vbCBlb2YgKQotewotICAgIGlmICghZW9mKSByZXR1cm47Ci0g
ICAgCi0gICAgYXNzZXJ0KCFtX2RvY3VtZW50KTsKLSAgICAKLSAgICBtX2RvY3VtZW50ID0gIG5l
dyBYQkw6OlhCTERvY3VtZW50SW1wbCgpOwotICAgIG1fZG9jdW1lbnQtPnJlZigpOwotICAgIG1f
ZG9jdW1lbnQtPm9wZW4oKTsKLSAgICAKLSAgICBRU3RyaW5nIGRhdGEgPSBtX2RlY29kZXItPmRl
Y29kZShidWZmZXIuYnVmZmVyKCkuZGF0YSgpLCBidWZmZXIuYnVmZmVyKCkuc2l6ZSgpKTsKLSAg
ICBtX2RvY3VtZW50LT53cml0ZShkYXRhKTsKLSAgICBzZXRTaXplKGJ1ZmZlci5idWZmZXIoKS5z
aXplKCkpOwotICAgIGJ1ZmZlci5jbG9zZSgpOwotICAgIAotICAgIG1fZG9jdW1lbnQtPmZpbmlz
aFBhcnNpbmcoKTsKLSAgICBtX2RvY3VtZW50LT5jbG9zZSgpOwotICAgIG1fbG9hZGluZyA9IGZh
bHNlOwotICAgIGNoZWNrTm90aWZ5KCk7Ci19Ci0KLXZvaWQgQ2FjaGVkWEJMRG9jdW1lbnQ6OmNo
ZWNrTm90aWZ5KCkKLXsKLSAgICBpZihtX2xvYWRpbmcpCi0gICAgICAgIHJldHVybjsKLSAgICAK
LSAgICBDYWNoZWRPYmplY3RDbGllbnRXYWxrZXIgdyhtX2NsaWVudHMpOwotICAgIHdoaWxlIChD
YWNoZWRPYmplY3RDbGllbnQgKmMgPSB3Lm5leHQoKSkKLSAgICAgICAgYy0+c2V0WEJMRG9jdW1l
bnQobV91cmwsIG1fZG9jdW1lbnQpOwotfQotCi0KLXZvaWQgQ2FjaGVkWEJMRG9jdW1lbnQ6OmVy
cm9yKCBpbnQgLyplcnIqLywgY29uc3QgY2hhciAqLyp0ZXh0Ki8gKQotewotICAgIG1fbG9hZGlu
ZyA9IGZhbHNlOwotICAgIGNoZWNrTm90aWZ5KCk7Ci19Ci0jZW5kaWYKLQotLy8gLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVJlcXVlc3Q6OlJlcXVlc3QoRG9jTG9hZGVyKiBk
bCwgQ2FjaGVkT2JqZWN0ICpfb2JqZWN0LCBib29sIF9pbmNyZW1lbnRhbCkKLXsKLSAgICBvYmpl
Y3QgPSBfb2JqZWN0OwotICAgIG9iamVjdC0+c2V0UmVxdWVzdCh0aGlzKTsKLSAgICBpbmNyZW1l
bnRhbCA9IF9pbmNyZW1lbnRhbDsKLSAgICBtX2RvY0xvYWRlciA9IGRsOwotICAgIG11bHRpcGFy
dCA9IGZhbHNlOwotfQotCi1SZXF1ZXN0Ojp+UmVxdWVzdCgpCi17Ci0gICAgb2JqZWN0LT5zZXRS
ZXF1ZXN0KDApOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQot
RG9jTG9hZGVyOjpEb2NMb2FkZXIoS0hUTUxQYXJ0KiBwYXJ0LCBEb2N1bWVudEltcGwqIGRvYykK
LXsKLSAgICBtX2NhY2hlUG9saWN5ID0gS0lPOjpDQ19WZXJpZnk7Ci0gICAgbV9leHBpcmVEYXRl
ID0gMDsKLSAgICBtX2JhdXRvbG9hZEltYWdlcyA9IHRydWU7Ci0gICAgbV9zaG93QW5pbWF0aW9u
cyA9IEtIVE1MU2V0dGluZ3M6OktBbmltYXRpb25FbmFibGVkOwotICAgIG1fcGFydCA9IHBhcnQ7
Ci0gICAgbV9kb2MgPSBkb2M7Ci0gICAgbV9sb2FkSW5Qcm9ncmVzcyA9IGZhbHNlOwotCi0gICAg
Q2FjaGU6OmluaXQoKTsKLSAgICBDYWNoZTo6ZG9jbG9hZGVyLT5hcHBlbmQoIHRoaXMgKTsKLX0K
LQotRG9jTG9hZGVyOjp+RG9jTG9hZGVyKCkKLXsKLSAgICBDYWNoZTo6ZG9jbG9hZGVyLT5yZW1v
dmUoIHRoaXMgKTsKLX0KLQotdm9pZCBEb2NMb2FkZXI6OnNldEV4cGlyZURhdGUodGltZV90IF9l
eHBpcmVEYXRlKQorTFJVTGlzdDo6TFJVTGlzdCgpIDptX2hlYWQoMCksIG1fdGFpbCgwKSAKIHsK
LSAgICBtX2V4cGlyZURhdGUgPSBfZXhwaXJlRGF0ZTsKIH0KIAotYm9vbCBEb2NMb2FkZXI6Om5l
ZWRSZWxvYWQoY29uc3QgS1VSTCAmZnVsbFVSTCkKLXsKLSAgICBib29sIHJlbG9hZCA9IGZhbHNl
OwotICAgIGlmIChtX2NhY2hlUG9saWN5ID09IEtJTzo6Q0NfVmVyaWZ5KQotICAgIHsKLSAgICAg
ICBpZiAoIW1fcmVsb2FkZWRVUkxzLmNvbnRhaW5zKGZ1bGxVUkwudXJsKCkpKQotICAgICAgIHsK
LSAgICAgICAgICBDYWNoZWRPYmplY3QgKmV4aXN0aW5nID0gQ2FjaGU6OmNhY2hlLT5maW5kKGZ1
bGxVUkwudXJsKCkpOwotICAgICAgICAgIGlmIChleGlzdGluZyAmJiBleGlzdGluZy0+aXNFeHBp
cmVkKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgIENhY2hlOjpyZW1vdmVDYWNoZUVudHJ5
KGV4aXN0aW5nKTsKLSAgICAgICAgICAgICBtX3JlbG9hZGVkVVJMcy5hcHBlbmQoZnVsbFVSTC51
cmwoKSk7Ci0gICAgICAgICAgICAgcmVsb2FkID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAg
fQotICAgIH0KLSAgICBlbHNlIGlmICgobV9jYWNoZVBvbGljeSA9PSBLSU86OkNDX1JlbG9hZCkg
fHwgKG1fY2FjaGVQb2xpY3kgPT0gS0lPOjpDQ19SZWZyZXNoKSkKLSAgICB7Ci0gICAgICAgaWYg
KCFtX3JlbG9hZGVkVVJMcy5jb250YWlucyhmdWxsVVJMLnVybCgpKSkKLSAgICAgICB7Ci0gICAg
ICAgICAgQ2FjaGVkT2JqZWN0ICpleGlzdGluZyA9IENhY2hlOjpjYWNoZS0+ZmluZChmdWxsVVJM
LnVybCgpKTsKLSAgICAgICAgICBpZiAoZXhpc3RpbmcpCi0gICAgICAgICAgewotICAgICAgICAg
ICAgIENhY2hlOjpyZW1vdmVDYWNoZUVudHJ5KGV4aXN0aW5nKTsKLSAgICAgICAgICB9Ci0gICAg
ICAgICAgbV9yZWxvYWRlZFVSTHMuYXBwZW5kKGZ1bGxVUkwudXJsKCkpOwotICAgICAgICAgIHJl
bG9hZCA9IHRydWU7Ci0gICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVsb2FkOwotfQotCi1D
YWNoZWRJbWFnZSAqRG9jTG9hZGVyOjpyZXF1ZXN0SW1hZ2UoIGNvbnN0IERPTTo6RE9NU3RyaW5n
ICZ1cmwpCi17Ci0gICAgS1VSTCBmdWxsVVJMID0gbV9kb2MtPmNvbXBsZXRlVVJMKHVybC5xc3Ry
aW5nKCkpOwotICAgIGlmICggbV9wYXJ0ICYmIG1fcGFydC0+b25seUxvY2FsUmVmZXJlbmNlcygp
ICYmIGZ1bGxVUkwucHJvdG9jb2woKSAhPSAiZmlsZSIpIHJldHVybiAwOwotCi0gICAgaWYgKEtX
UUNoZWNrSWZSZWxvYWRpbmcodGhpcykpIHsKLSAgICAgICAgc2V0Q2FjaGVQb2xpY3koS0lPOjpD
Q19SZWxvYWQpOwotICAgIH0KLQotICAgIGJvb2wgcmVsb2FkID0gbmVlZFJlbG9hZChmdWxsVVJM
KTsKLQotICAgIENhY2hlZEltYWdlICpjYWNoZWRPYmplY3QgPSBDYWNoZTo6cmVxdWVzdEltYWdl
KHRoaXMsIGZ1bGxVUkwsIHJlbG9hZCwgbV9leHBpcmVEYXRlKTsKLSAgICBLV1FDaGVja0NhY2hl
T2JqZWN0U3RhdHVzKHRoaXMsIGNhY2hlZE9iamVjdCk7Ci0gICAgcmV0dXJuIGNhY2hlZE9iamVj
dDsKLX0KLQotQ2FjaGVkQ1NTU3R5bGVTaGVldCAqRG9jTG9hZGVyOjpyZXF1ZXN0U3R5bGVTaGVl
dCggY29uc3QgRE9NOjpET01TdHJpbmcgJnVybCwgY29uc3QgUVN0cmluZyYgY2hhcnNldCkKLXsK
LSAgICBLVVJMIGZ1bGxVUkwgPSBtX2RvYy0+Y29tcGxldGVVUkwodXJsLnFzdHJpbmcoKSk7Ci0g
ICAgaWYgKCBtX3BhcnQgJiYgbV9wYXJ0LT5vbmx5TG9jYWxSZWZlcmVuY2VzKCkgJiYgZnVsbFVS
TC5wcm90b2NvbCgpICE9ICJmaWxlIikgcmV0dXJuIDA7Ci0KLSAgICBpZiAoS1dRQ2hlY2tJZlJl
bG9hZGluZyh0aGlzKSkgewotICAgICAgICBzZXRDYWNoZVBvbGljeShLSU86OkNDX1JlbG9hZCk7
Ci0gICAgfQotCi0gICAgYm9vbCByZWxvYWQgPSBuZWVkUmVsb2FkKGZ1bGxVUkwpOwotCi0gICAg
Q2FjaGVkQ1NTU3R5bGVTaGVldCAqY2FjaGVkT2JqZWN0ID0gQ2FjaGU6OnJlcXVlc3RTdHlsZVNo
ZWV0KHRoaXMsIHVybCwgcmVsb2FkLCBtX2V4cGlyZURhdGUsIGNoYXJzZXQpOwotICAgIEtXUUNo
ZWNrQ2FjaGVPYmplY3RTdGF0dXModGhpcywgY2FjaGVkT2JqZWN0KTsKLSAgICByZXR1cm4gY2Fj
aGVkT2JqZWN0OwotfQotCi1DYWNoZWRTY3JpcHQgKkRvY0xvYWRlcjo6cmVxdWVzdFNjcmlwdCgg
Y29uc3QgRE9NOjpET01TdHJpbmcgJnVybCwgY29uc3QgUVN0cmluZyYgY2hhcnNldCkKLXsKLSAg
ICBLVVJMIGZ1bGxVUkwgPSBtX2RvYy0+Y29tcGxldGVVUkwodXJsLnFzdHJpbmcoKSk7Ci0gICAg
aWYgKCBtX3BhcnQgJiYgbV9wYXJ0LT5vbmx5TG9jYWxSZWZlcmVuY2VzKCkgJiYgZnVsbFVSTC5w
cm90b2NvbCgpICE9ICJmaWxlIikgcmV0dXJuIDA7Ci0KLSAgICBpZiAoS1dRQ2hlY2tJZlJlbG9h
ZGluZyh0aGlzKSkgewotICAgICAgICBzZXRDYWNoZVBvbGljeShLSU86OkNDX1JlbG9hZCk7Ci0g
ICAgfQotCi0gICAgYm9vbCByZWxvYWQgPSBuZWVkUmVsb2FkKGZ1bGxVUkwpOwotCi0gICAgQ2Fj
aGVkU2NyaXB0ICpjYWNoZWRPYmplY3QgPSBDYWNoZTo6cmVxdWVzdFNjcmlwdCh0aGlzLCB1cmws
IHJlbG9hZCwgbV9leHBpcmVEYXRlLCBjaGFyc2V0KTsKLSAgICBLV1FDaGVja0NhY2hlT2JqZWN0
U3RhdHVzKHRoaXMsIGNhY2hlZE9iamVjdCk7Ci0gICAgcmV0dXJuIGNhY2hlZE9iamVjdDsKLX0K
LQotI2lmZGVmIEtIVE1MX1hTTFQKLUNhY2hlZFhTTFN0eWxlU2hlZXQqIERvY0xvYWRlcjo6cmVx
dWVzdFhTTFN0eWxlU2hlZXQoY29uc3QgRE9NOjpET01TdHJpbmcgJnVybCkKLXsKLSAgICBLVVJM
IGZ1bGxVUkwgPSBtX2RvYy0+Y29tcGxldGVVUkwodXJsLnFzdHJpbmcoKSk7Ci0gICAgCi0gICAg
aWYgKG1fcGFydCAmJiBtX3BhcnQtPm9ubHlMb2NhbFJlZmVyZW5jZXMoKSAmJiBmdWxsVVJMLnBy
b3RvY29sKCkgIT0gImZpbGUiKSByZXR1cm4gMDsKLSAgICAKLSAgICBpZiAoS1dRQ2hlY2tJZlJl
bG9hZGluZyh0aGlzKSkKLSAgICAgICAgc2V0Q2FjaGVQb2xpY3koS0lPOjpDQ19SZWxvYWQpOwot
ICAgIAotICAgIGJvb2wgcmVsb2FkID0gbmVlZFJlbG9hZChmdWxsVVJMKTsKLSAgICAKLSAgICBD
YWNoZWRYU0xTdHlsZVNoZWV0ICpjYWNoZWRPYmplY3QgPSBDYWNoZTo6cmVxdWVzdFhTTFN0eWxl
U2hlZXQodGhpcywgdXJsLCByZWxvYWQsIG1fZXhwaXJlRGF0ZSk7Ci0gICAgS1dRQ2hlY2tDYWNo
ZU9iamVjdFN0YXR1cyh0aGlzLCBjYWNoZWRPYmplY3QpOwotICAgIHJldHVybiBjYWNoZWRPYmpl
Y3Q7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBLSFRNTF9OT19YQkwKLUNhY2hlZFhCTERvY3VtZW50
KiBEb2NMb2FkZXI6OnJlcXVlc3RYQkxEb2N1bWVudChjb25zdCBET006OkRPTVN0cmluZyAmdXJs
KQotewotICAgIEtVUkwgZnVsbFVSTCA9IG1fZG9jLT5jb21wbGV0ZVVSTCh1cmwucXN0cmluZygp
KTsKLSAgICAKLSAgICAvLyBGSVhNRTogSXMgdGhpcyByaWdodCBmb3IgWEJMPwotICAgIGlmICht
X3BhcnQgJiYgbV9wYXJ0LT5vbmx5TG9jYWxSZWZlcmVuY2VzKCkgJiYgZnVsbFVSTC5wcm90b2Nv
bCgpICE9ICJmaWxlIikgcmV0dXJuIDA7Ci0gICAgCi0gICAgaWYgKEtXUUNoZWNrSWZSZWxvYWRp
bmcodGhpcykpIHsKLSAgICAgICAgc2V0Q2FjaGVQb2xpY3koS0lPOjpDQ19SZWxvYWQpOwotICAg
IH0KLSAgICAKLSAgICBib29sIHJlbG9hZCA9IG5lZWRSZWxvYWQoZnVsbFVSTCk7Ci0gICAgCi0g
ICAgQ2FjaGVkWEJMRG9jdW1lbnQgKmNhY2hlZE9iamVjdCA9IENhY2hlOjpyZXF1ZXN0WEJMRG9j
dW1lbnQodGhpcywgdXJsLCByZWxvYWQsIG1fZXhwaXJlRGF0ZSk7Ci0gICAgS1dRQ2hlY2tDYWNo
ZU9iamVjdFN0YXR1cyh0aGlzLCBjYWNoZWRPYmplY3QpOwotICAgIHJldHVybiBjYWNoZWRPYmpl
Y3Q7Ci19Ci0jZW5kaWYKLQotdm9pZCBEb2NMb2FkZXI6OnNldEF1dG9sb2FkSW1hZ2VzKCBib29s
IGVuYWJsZSApCi17Ci0gICAgaWYgKCBlbmFibGUgPT0gbV9iYXV0b2xvYWRJbWFnZXMgKQotICAg
ICAgICByZXR1cm47Ci0KLSAgICBtX2JhdXRvbG9hZEltYWdlcyA9IGVuYWJsZTsKLQotICAgIGlm
ICggIW1fYmF1dG9sb2FkSW1hZ2VzICkgcmV0dXJuOwotCi0gICAgZm9yICggY29uc3QgQ2FjaGVk
T2JqZWN0KiBjbz1tX2RvY09iamVjdHMuZmlyc3QoKTsgY287IGNvPW1fZG9jT2JqZWN0cy5uZXh0
KCkgKQotICAgICAgICBpZiAoIGNvLT50eXBlKCkgPT0gQ2FjaGVkT2JqZWN0OjpJbWFnZSApCi0g
ICAgICAgIHsKLSAgICAgICAgICAgIENhY2hlZEltYWdlICppbWcgPSBjb25zdF9jYXN0PENhY2hl
ZEltYWdlKj4oIHN0YXRpY19jYXN0PGNvbnN0IENhY2hlZEltYWdlICo+KCBjbyApICk7Ci0KLSAg
ICAgICAgICAgIENhY2hlZE9iamVjdDo6U3RhdHVzIHN0YXR1cyA9IGltZy0+c3RhdHVzKCk7Ci0g
ICAgICAgICAgICBpZiAoIHN0YXR1cyAhPSBDYWNoZWRPYmplY3Q6OlVua25vd24gKQotICAgICAg
ICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICBDYWNoZTo6bG9hZGVyKCktPmxvYWQo
dGhpcywgaW1nLCB0cnVlKTsKLSAgICAgICAgfQotfQotCi12b2lkIERvY0xvYWRlcjo6c2V0Q2Fj
aGVQb2xpY3koIEtJTzo6Q2FjaGVDb250cm9sIGNhY2hlUG9saWN5ICkKLXsKLSAgICBtX2NhY2hl
UG9saWN5ID0gY2FjaGVQb2xpY3k7Ci19Ci0KLXZvaWQgRG9jTG9hZGVyOjpzZXRTaG93QW5pbWF0
aW9ucyggS0hUTUxTZXR0aW5nczo6S0FuaW1hdGlvbkFkdmljZSBzaG93QW5pbWF0aW9ucyApCi17
Ci0gICAgaWYgKCBzaG93QW5pbWF0aW9ucyA9PSBtX3Nob3dBbmltYXRpb25zICkgcmV0dXJuOwot
ICAgIG1fc2hvd0FuaW1hdGlvbnMgPSBzaG93QW5pbWF0aW9uczsKLQotICAgIGNvbnN0IENhY2hl
ZE9iamVjdCogY287Ci0gICAgZm9yICggY289bV9kb2NPYmplY3RzLmZpcnN0KCk7IGNvOyBjbz1t
X2RvY09iamVjdHMubmV4dCgpICkKLSAgICAgICAgaWYgKCBjby0+dHlwZSgpID09IENhY2hlZE9i
amVjdDo6SW1hZ2UgKQotICAgICAgICB7Ci0gICAgICAgICAgICBDYWNoZWRJbWFnZSAqaW1nID0g
Y29uc3RfY2FzdDxDYWNoZWRJbWFnZSo+KCBzdGF0aWNfY2FzdDxjb25zdCBDYWNoZWRJbWFnZSAq
PiggY28gKSApOwotCi0gICAgICAgICAgICBpbWctPnNldFNob3dBbmltYXRpb25zKCBzaG93QW5p
bWF0aW9ucyApOwotICAgICAgICB9Ci19Ci0KLXZvaWQgRG9jTG9hZGVyOjpyZW1vdmVDYWNoZWRP
YmplY3QoIENhY2hlZE9iamVjdCogbyApIGNvbnN0Ci17Ci0gICAgbV9kb2NPYmplY3RzLnJlbW92
ZVJlZiggbyApOwotfQotCi12b2lkIERvY0xvYWRlcjo6c2V0TG9hZEluUHJvZ3Jlc3MoYm9vbCBs
b2FkKQotewotICAgIG1fbG9hZEluUHJvZ3Jlc3MgPSBsb2FkOwotfQotCi0vLyAtLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotTG9hZGVyOjpMb2FkZXIoKSA6IFFPYmplY3QoKQot
ewotICAgIG1fcmVxdWVzdHNQZW5kaW5nLnNldEF1dG9EZWxldGUoIHRydWUgKTsKLSAgICBtX3Jl
cXVlc3RzTG9hZGluZy5zZXRBdXRvRGVsZXRlKCB0cnVlICk7Ci0gICAga3dxID0gbmV3IEtXUUxv
YWRlcih0aGlzKTsKLX0KLQotTG9hZGVyOjp+TG9hZGVyKCkKLXsKLSAgICBkZWxldGUga3dxOwot
fQotCi12b2lkIExvYWRlcjo6bG9hZChEb2NMb2FkZXIqIGRsLCBDYWNoZWRPYmplY3QgKm9iamVj
dCwgYm9vbCBpbmNyZW1lbnRhbCkKLXsKLSAgICBSZXF1ZXN0ICpyZXEgPSBuZXcgUmVxdWVzdChk
bCwgb2JqZWN0LCBpbmNyZW1lbnRhbCk7Ci0gICAgbV9yZXF1ZXN0c1BlbmRpbmcuYXBwZW5kKHJl
cSk7Ci0KLSAgICBlbWl0IHJlcXVlc3RTdGFydGVkKCByZXEtPm1fZG9jTG9hZGVyLCByZXEtPm9i
amVjdCApOwotCi0gICAgc2VydmVQZW5kaW5nUmVxdWVzdHMoKTsKLX0KLQotdm9pZCBMb2FkZXI6
OnNlcnZlUGVuZGluZ1JlcXVlc3RzKCkKLXsKLSAgaWYgKCBtX3JlcXVlc3RzUGVuZGluZy5jb3Vu
dCgpID09IDAgKQotICAgICAgcmV0dXJuOwotCi0gIC8vIGdldCB0aGUgZmlyc3QgcGVuZGluZyBy
ZXF1ZXN0Ci0gIFJlcXVlc3QgKnJlcSA9IG1fcmVxdWVzdHNQZW5kaW5nLnRha2UoMCk7Ci0KLSAg
S1VSTCB1KHJlcS0+b2JqZWN0LT51cmwoKS5xc3RyaW5nKCkpOwotICBLSU86OlRyYW5zZmVySm9i
KiBqb2IgPSBLSU86OmdldCggdSwgZmFsc2UsIGZhbHNlIC8qbm8gR1VJKi8sIHRydWUpOwotICAK
LSAgam9iLT5hZGRNZXRhRGF0YSgiY2FjaGUiLCBnZXRDYWNoZUNvbnRyb2xTdHJpbmcocmVxLT5v
YmplY3QtPmNhY2hlUG9saWN5KCkpKTsKLSAgaWYgKCFyZXEtPm9iamVjdC0+YWNjZXB0KCkuaXNF
bXB0eSgpKQotICAgICAgam9iLT5hZGRNZXRhRGF0YSgiYWNjZXB0IiwgcmVxLT5vYmplY3QtPmFj
Y2VwdCgpKTsKLSAgaWYgKCByZXEtPm1fZG9jTG9hZGVyICkgIHsKLSAgICAgIEtVUkwgciA9IHJl
cS0+bV9kb2NMb2FkZXItPmRvYygpLT5VUkwoKTsKLSAgICAgIGlmICggci5wcm90b2NvbCgpLnN0
YXJ0c1dpdGgoICJodHRwIiApICYmIHIucGF0aCgpLmlzRW1wdHkoKSApCi0gICAgICAgICAgci5z
ZXRQYXRoKCAiLyIgKTsKLQotICAgICAgam9iLT5hZGRNZXRhRGF0YSgicmVmZXJyZXIiLCByLnVy
bCgpKTsKLSAgICAgIFFTdHJpbmcgZG9tYWluID0gci5ob3N0KCk7Ci0gICAgICBpZiAocmVxLT5t
X2RvY0xvYWRlci0+ZG9jKCktPmlzSFRNTERvY3VtZW50KCkpCi0gICAgICAgICBkb21haW4gPSBz
dGF0aWNfY2FzdDxIVE1MRG9jdW1lbnRJbXBsKj4ocmVxLT5tX2RvY0xvYWRlci0+ZG9jKCkpLT5k
b21haW4oKS5xc3RyaW5nKCk7Ci0gICAgICBpZiAoY3Jvc3NEb21haW4odS5ob3N0KCksIGRvbWFp
bikpCi0gICAgICAgICBqb2ItPmFkZE1ldGFEYXRhKCJjcm9zcy1kb21haW4iLCAidHJ1ZSIpOwot
ICB9Ci0KLSAgY29ubmVjdCggam9iLCBTSUdOQUwoIHJlc3VsdCggS0lPOjpKb2IgKiwgTlNEYXRh
ICopICksIHRoaXMsIFNMT1QoIHNsb3RGaW5pc2hlZCggS0lPOjpKb2IgKiwgTlNEYXRhICopICkg
KTsKLSAgCi0gIGNvbm5lY3QoIGpvYiwgU0lHTkFMKCBkYXRhKCBLSU86OkpvYiosIGNvbnN0IGNo
YXIgKiwgaW50KSksCi0gICAgICAgICAgIFNMT1QoIHNsb3REYXRhKCBLSU86OkpvYiosIGNvbnN0
IGNoYXIgKiwgaW50KSkpOwotICBjb25uZWN0KCBqb2IsIFNJR05BTCggcmVjZWl2ZWRSZXNwb25z
ZSggS0lPOjpKb2IgKiwgTlNVUkxSZXNwb25zZSAqKSksIFNMT1QoIHNsb3RSZWNlaXZlZFJlc3Bv
bnNlKCBLSU86OkpvYiAqLCBOU1VSTFJlc3BvbnNlICopKSApOwotCi0gIGlmIChLV1FTZXJ2ZVJl
cXVlc3QodGhpcywgcmVxLCBqb2IpKSB7Ci0gICAgICBpZiAocmVxLT5vYmplY3QtPnR5cGUoKSA9
PSBDYWNoZWRPYmplY3Q6OkltYWdlKSB7Ci0JQ2FjaGVkSW1hZ2UgKmNpID0gc3RhdGljX2Nhc3Q8
Q2FjaGVkSW1hZ2UqPihyZXEtPm9iamVjdCk7Ci0JaWYgKGNpLT5kZWNvZGVyQ2FsbGJhY2soKSkg
ewotCSAgICBtX3JlcXVlc3RzQmFja2dyb3VuZERlY29kaW5nLmFwcGVuZChyZXEpOwotCX0KLSAg
ICAgIH0KLSAgICAgIG1fcmVxdWVzdHNMb2FkaW5nLmluc2VydChqb2IsIHJlcSk7Ci0gIH0KLX0K
LQotdm9pZCBMb2FkZXI6OnNsb3RGaW5pc2hlZCggS0lPOjpKb2IqIGpvYiwgTlNEYXRhICphbGxE
YXRhKQotewotICAgIFJlcXVlc3QgKnIgPSBtX3JlcXVlc3RzTG9hZGluZy50YWtlKCBqb2IgKTsK
LSAgICBLSU86OlRyYW5zZmVySm9iKiBqID0gc3RhdGljX2Nhc3Q8S0lPOjpUcmFuc2ZlckpvYio+
KGpvYik7Ci0KLSAgICBpZiAoICFyICkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgQ2FjaGVkT2Jq
ZWN0ICpvYmplY3QgPSByLT5vYmplY3Q7Ci0gICAgRG9jTG9hZGVyICpkb2NMb2FkZXIgPSByLT5t
X2RvY0xvYWRlcjsKLSAgICAKLSAgICBib29sIGJhY2tncm91bmRJbWFnZURlY29kaW5nID0gKG9i
amVjdC0+dHlwZSgpID09IENhY2hlZE9iamVjdDo6SW1hZ2UgJiYgCi0Jc3RhdGljX2Nhc3Q8Q2Fj
aGVkSW1hZ2UqPihvYmplY3QpLT5kZWNvZGVyQ2FsbGJhY2soKSk7Ci0JCi0gICAgaWYgKGotPmVy
cm9yKCkgfHwgai0+aXNFcnJvclBhZ2UoKSkgewotICAgICAgICAvLyBVc2UgdGhlIGJhY2tncm91
bmQgaW1hZ2UgZGVjb2RlcidzIGNhbGxiYWNrIHRvIGhhbmRsZSB0aGUgZXJyb3IuCi0gICAgICAg
IGlmIChiYWNrZ3JvdW5kSW1hZ2VEZWNvZGluZykgewotICAgICAgICAgICAgQ2FjaGVkSW1hZ2VD
YWxsYmFjayAqY2FsbGJhY2sgPSBzdGF0aWNfY2FzdDxDYWNoZWRJbWFnZSo+KG9iamVjdCktPmRl
Y29kZXJDYWxsYmFjaygpOwotICAgICAgICAgICAgY2FsbGJhY2stPmhhbmRsZUVycm9yKCk7Ci0g
ICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBkb2NMb2FkZXItPnNldExvYWRJ
blByb2dyZXNzKHRydWUpOwotICAgICAgICAgICAgci0+b2JqZWN0LT5lcnJvciggam9iLT5lcnJv
cigpLCBqb2ItPmVycm9yVGV4dCgpLmFzY2lpKCkgKTsKLSAgICAgICAgICAgIGRvY0xvYWRlci0+
c2V0TG9hZEluUHJvZ3Jlc3MoZmFsc2UpOwotICAgICAgICAgICAgZW1pdCByZXF1ZXN0RmFpbGVk
KCBkb2NMb2FkZXIsIG9iamVjdCApOwotICAgICAgICAgICAgQ2FjaGU6OnJlbW92ZUNhY2hlRW50
cnkoIG9iamVjdCApOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBkb2NM
b2FkZXItPnNldExvYWRJblByb2dyZXNzKHRydWUpOwotICAgICAgICBvYmplY3QtPmRhdGEoci0+
bV9idWZmZXIsIHRydWUpOwotICAgICAgICByLT5vYmplY3QtPnNldEFsbERhdGEoYWxsRGF0YSk7
Ci0gICAgICAgIGRvY0xvYWRlci0+c2V0TG9hZEluUHJvZ3Jlc3MoZmFsc2UpOwotICAgICAgICAK
LSAgICAgICAgLy8gTGV0IHRoZSBiYWNrZ3JvdW5kIGltYWdlIGRlY29kZXIgdHJpZ2dlciB0aGUg
ZG9uZSBzaWduYWwuCi0gICAgICAgIGlmICghYmFja2dyb3VuZEltYWdlRGVjb2RpbmcpCi0gICAg
ICAgICAgICBlbWl0IHJlcXVlc3REb25lKCBkb2NMb2FkZXIsIG9iamVjdCApOwotCi0gICAgICAg
IG9iamVjdC0+ZmluaXNoKCk7Ci0gICAgfQotCi0gICAgLy8gTGV0IHRoZSBiYWNrZ3JvdW5kIGlt
YWdlIGRlY29kZXIgcmVsZWFzZSB0aGUgcmVxdWVzdCB3aGVuIGl0IGlzCi0gICAgLy8gZmluaXNo
ZWQuCi0gICAgaWYgKCFiYWNrZ3JvdW5kSW1hZ2VEZWNvZGluZykgewotICAgICAgICBkZWxldGUg
cjsKLSAgICB9Ci0KLSAgICBzZXJ2ZVBlbmRpbmdSZXF1ZXN0cygpOwotfQotCi0KLXZvaWQgTG9h
ZGVyOjpzbG90UmVjZWl2ZWRSZXNwb25zZShLSU86OkpvYiogam9iLCBOU1VSTFJlc3BvbnNlICpy
ZXNwb25zZSkKLXsKLSAgICBSZXF1ZXN0ICpyID0gbV9yZXF1ZXN0c0xvYWRpbmdbam9iXTsKLSAg
ICBBU1NFUlQocik7Ci0gICAgQVNTRVJUKHJlc3BvbnNlKTsKLSAgICByLT5vYmplY3QtPnNldFJl
c3BvbnNlKHJlc3BvbnNlKTsKLSAgICByLT5vYmplY3QtPnNldEV4cGlyZURhdGUoS1dRQ2FjaGVP
YmplY3RFeHBpcmVzVGltZShyLT5tX2RvY0xvYWRlciwgcmVzcG9uc2UpLCBmYWxzZSk7Ci0gICAg
Ci0gICAgUVN0cmluZyBjaHMgPSBzdGF0aWNfY2FzdDxLSU86OlRyYW5zZmVySm9iKj4oam9iKS0+
cXVlcnlNZXRhRGF0YSgiY2hhcnNldCIpOwotICAgIGlmICghY2hzLmlzTnVsbCgpKQotICAgICAg
ICByLT5vYmplY3QtPnNldENoYXJzZXQoY2hzKTsKLSAgICAKLSAgICBpZiAoci0+bXVsdGlwYXJ0
KSB7Ci0gICAgICAgIEFTU0VSVChyLT5vYmplY3QtPmlzSW1hZ2UoKSk7Ci0gICAgICAgIHN0YXRp
Y19jYXN0PENhY2hlZEltYWdlICo+KHItPm9iamVjdCktPmNsZWFyKCk7Ci0gICAgICAgIHItPm1f
YnVmZmVyID0gUUJ1ZmZlcigpOwotICAgICAgICBpZiAoci0+bV9kb2NMb2FkZXItPnBhcnQoKSkK
LSAgICAgICAgICAgIHItPm1fZG9jTG9hZGVyLT5wYXJ0KCktPmNoZWNrQ29tcGxldGVkKCk7Ci0g
ICAgICAgIAotICAgIH0gZWxzZSBpZiAoS1dRUmVzcG9uc2VJc011bHRpcGFydChyZXNwb25zZSkp
IHsKLSAgICAgICAgci0+bXVsdGlwYXJ0ID0gdHJ1ZTsKLSAgICAgICAgaWYgKCFyLT5vYmplY3Qt
PmlzSW1hZ2UoKSkKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PEtJTzo6VHJhbnNmZXJKb2IqPihq
b2IpLT5jYW5jZWwoKTsKLSAgICB9Ci19Ci0KLQotdm9pZCBMb2FkZXI6OnNsb3REYXRhKCBLSU86
OkpvYipqb2IsIGNvbnN0IGNoYXIgKmRhdGEsIGludCBzaXplICkKLXsKLSAgICBSZXF1ZXN0ICpy
ID0gbV9yZXF1ZXN0c0xvYWRpbmdbam9iXTsKLSAgICBpZighcikgewotICAgICAgICBrZERlYnVn
KCA2MDYwICkgPDwgImdvdCBkYXRhIGZvciB1bmtub3duIHJlcXVlc3QhIiA8PCBlbmRsOwotICAg
ICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKCAhci0+bV9idWZmZXIuaXNPcGVuKCkgKQot
ICAgICAgICByLT5tX2J1ZmZlci5vcGVuKCBJT19Xcml0ZU9ubHkgKTsKLQotICAgIHItPm1fYnVm
ZmVyLndyaXRlQmxvY2soIGRhdGEsIHNpemUgKTsKLQotICAgIGlmIChyLT5tdWx0aXBhcnQpCi0g
ICAgICAgIHItPm9iamVjdC0+ZGF0YSggci0+bV9idWZmZXIsIHRydWUgKTsgLy8gdGhlIGxvYWRl
ciBkZWxpdmVycyB0aGUgZGF0YSBpbiBhIG11bHRpcGFydCBzZWN0aW9uIGFsbCBhdCBvbmNlLCBz
ZW5kIGVvZgotICAgIGVsc2UgaWYoci0+aW5jcmVtZW50YWwpCi0gICAgICAgIHItPm9iamVjdC0+
ZGF0YSggci0+bV9idWZmZXIsIGZhbHNlICk7Ci19Ci0KLWludCBMb2FkZXI6Om51bVJlcXVlc3Rz
KCBEb2NMb2FkZXIqIGRsICkgY29uc3QKLXsKLSAgICBpbnQgcmVzID0gMDsKLQotICAgIFFQdHJM
aXN0SXRlcmF0b3I8UmVxdWVzdD4gcEl0KCBtX3JlcXVlc3RzUGVuZGluZyApOwotICAgIGZvciAo
OyBwSXQuY3VycmVudCgpOyArK3BJdCApCi0gICAgICAgIGlmICggcEl0LmN1cnJlbnQoKS0+bV9k
b2NMb2FkZXIgPT0gZGwgKQotICAgICAgICAgICAgcmVzKys7Ci0KLSAgICBRUHRyRGljdEl0ZXJh
dG9yPFJlcXVlc3Q+IGxJdCggbV9yZXF1ZXN0c0xvYWRpbmcgKTsKLSAgICBmb3IgKDsgbEl0LmN1
cnJlbnQoKTsgKytsSXQgKQotICAgICAgICBpZiAoIGxJdC5jdXJyZW50KCktPm1fZG9jTG9hZGVy
ID09IGRsICkKLSAgICAgICAgICAgIGlmICghbEl0LmN1cnJlbnQoKS0+bXVsdGlwYXJ0KQotICAg
ICAgICAgICAgICAgIHJlcysrOwotCi0gICAgUVB0ckxpc3RJdGVyYXRvcjxSZXF1ZXN0PiBiZEl0
KCBtX3JlcXVlc3RzQmFja2dyb3VuZERlY29kaW5nICk7Ci0gICAgZm9yICg7IGJkSXQuY3VycmVu
dCgpOyArK2JkSXQgKQotICAgICAgICBpZiAoIGJkSXQuY3VycmVudCgpLT5tX2RvY0xvYWRlciA9
PSBkbCApCi0gICAgICAgICAgICByZXMrKzsKLQotICAgIGlmIChkbC0+bG9hZEluUHJvZ3Jlc3Mo
KSkKLSAgICAgICAgcmVzKys7Ci0gICAgICAgIAotICAgIHJldHVybiByZXM7Ci19Ci0KLXZvaWQg
TG9hZGVyOjpjYW5jZWxSZXF1ZXN0cyggRG9jTG9hZGVyKiBkbCApCi17Ci0gICAgUVB0ckxpc3RJ
dGVyYXRvcjxSZXF1ZXN0PiBwSXQoIG1fcmVxdWVzdHNQZW5kaW5nICk7Ci0gICAgd2hpbGUgKCBw
SXQuY3VycmVudCgpICkKLSAgICB7Ci0gICAgICAgIGlmIChwSXQuY3VycmVudCgpLT5tX2RvY0xv
YWRlciA9PSBkbCkgewotICAgICAgICAgICAgQ2FjaGU6OnJlbW92ZUNhY2hlRW50cnkoIHBJdC5j
dXJyZW50KCktPm9iamVjdCApOwotICAgICAgICAgICAgbV9yZXF1ZXN0c1BlbmRpbmcucmVtb3Zl
KCBwSXQgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICArK3BJdDsKLSAg
ICB9Ci0KLSAgICBRUHRyRGljdEl0ZXJhdG9yPFJlcXVlc3Q+IGxJdCggbV9yZXF1ZXN0c0xvYWRp
bmcgKTsKLSAgICB3aGlsZSAoIGxJdC5jdXJyZW50KCkgKQotICAgIHsKLSAgICAgICAgaWYgKGxJ
dC5jdXJyZW50KCktPm1fZG9jTG9hZGVyID09IGRsKSB7Ci0gICAgICAgICAgICBLSU86OkpvYiAq
am9iID0gc3RhdGljX2Nhc3Q8S0lPOjpKb2IgKj4oIGxJdC5jdXJyZW50S2V5KCkgKTsKLSAgICAg
ICAgICAgIENhY2hlOjpyZW1vdmVDYWNoZUVudHJ5KCBsSXQuY3VycmVudCgpLT5vYmplY3QgKTsK
LSAgICAgICAgICAgIG1fcmVxdWVzdHNMb2FkaW5nLnJlbW92ZSggbEl0LmN1cnJlbnRLZXkoKSAp
OwotICAgICAgICAgICAgam9iLT5raWxsKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAg
ICAgICAgICAgKytsSXQ7Ci0gICAgfQotCi0gICAgUVB0ckxpc3RJdGVyYXRvcjxSZXF1ZXN0PiBi
ZEl0KCBtX3JlcXVlc3RzQmFja2dyb3VuZERlY29kaW5nICk7Ci0gICAgd2hpbGUgKGJkSXQuY3Vy
cmVudCgpKSB7Ci0gICAgICAgIGlmIChiZEl0LmN1cnJlbnQoKS0+bV9kb2NMb2FkZXIgPT0gZGwp
IHsKLSAgICAgICAgICAgIENhY2hlOjpyZW1vdmVDYWNoZUVudHJ5KCBiZEl0LmN1cnJlbnQoKS0+
b2JqZWN0ICk7Ci0gICAgICAgICAgICBtX3JlcXVlc3RzQmFja2dyb3VuZERlY29kaW5nLnJlbW92
ZSggYmRJdCApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgICsrYmRJdDsK
LSAgICB9Ci19Ci0KLXZvaWQgTG9hZGVyOjpyZW1vdmVCYWNrZ3JvdW5kRGVjb2RpbmdSZXF1ZXN0
IChSZXF1ZXN0ICpyKQotewotICAgIGJvb2wgcHJlc2VudCA9IG1fcmVxdWVzdHNCYWNrZ3JvdW5k
RGVjb2RpbmcuY29udGFpbnNSZWYocik7Ci0gICAgaWYgKHByZXNlbnQpIHsKLQltX3JlcXVlc3Rz
QmFja2dyb3VuZERlY29kaW5nLnJlbW92ZSAocik7Ci0gICAgfQotfQotCi1LSU86OkpvYiAqTG9h
ZGVyOjpqb2JGb3JSZXF1ZXN0KCBjb25zdCBET006OkRPTVN0cmluZyAmdXJsICkgY29uc3QKLXsK
LSAgICBRUHRyRGljdEl0ZXJhdG9yPFJlcXVlc3Q+IGl0KCBtX3JlcXVlc3RzTG9hZGluZyApOwot
Ci0gICAgZm9yICg7IGl0LmN1cnJlbnQoKTsgKytpdCApCi0gICAgewotICAgICAgICBDYWNoZWRP
YmplY3QgKm9iaiA9IGl0LmN1cnJlbnQoKS0+b2JqZWN0OwotCi0gICAgICAgIGlmICggb2JqICYm
IG9iai0+dXJsKCkgPT0gdXJsICkKLSAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxLSU86
OkpvYiAqPiggaXQuY3VycmVudEtleSgpICk7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0K
LQotYm9vbCBMb2FkZXI6OmlzS0hUTUxMb2FkZXIoKSBjb25zdAorTFJVTGlzdDo6fkxSVUxpc3Qo
KQogewotICAgIHJldHVybiB0cnVlOwogfQogCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQot
Ci1MUlVMaXN0OjpMUlVMaXN0KCkKLTptX2hlYWQoMCksIG1fdGFpbCgwKSAKLXt9Ci0KLUxSVUxp
c3Q6On5MUlVMaXN0KCkKLXt9Ci0KIFFEaWN0PENhY2hlZE9iamVjdD4gKkNhY2hlOjpjYWNoZSA9
IDA7CiBRUHRyTGlzdDxEb2NMb2FkZXI+KiBDYWNoZTo6ZG9jbG9hZGVyID0gMDsKIExvYWRlciAq
Q2FjaGU6Om1fbG9hZGVyID0gMDsKQEAgLTE2OTAsNyArNTAwLDcgQEAgdm9pZCBDYWNoZTo6cmVt
b3ZlQ2FjaGVFbnRyeSggQ2FjaGVkT2JqZQogICAgICAgaWYgKChqXykgPj4gMSkgICAgICAgICAg
ICAgICAgICBcCiAgICAgICAoX2xvZzIpICs9IDE7CiAKLWludCBGYXN0TG9nMih1bnNpZ25lZCBp
bnQgaSkgeworc3RhdGljIGludCBGYXN0TG9nMih1bnNpZ25lZCBpbnQgaSkgewogICAgIGludCBs
b2cyOwogICAgIEZBU1RfTE9HMihsb2cyLGkpOwogICAgIHJldHVybiBsb2cyOwpAQCAtMTc5Miwy
OSArNjAyLDYgQEAgYm9vbCBDYWNoZTo6YWRqdXN0U2l6ZShDYWNoZWRPYmplY3QgKm9iagogICAg
IHJldHVybiBkZWx0YSAhPSAwOwogfQogCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLQotCi1DYWNoZWRPYmplY3RDbGllbnQgKkNhY2hlZE9iamVjdENsaWVudFdhbGtl
cjo6bmV4dCgpCi17Ci0gICAgLy8gT25seSBhZHZhbmNlIGlmIHdlIGFscmVhZHkgcmV0dXJuZWQg
dGhpcyBpdGVtLgotICAgIC8vIFRoaXMgaGFuZGxlcyBjYXNlcyB3aGVyZSB0aGUgY3VycmVudCBp
dGVtIGlzIHJlbW92ZWQsIGFuZCBwcmV2ZW50cyB1cyBmcm9tIHNraXBwaW5nIHRoZSBuZXh0IGl0
ZW0uCi0gICAgLy8gVGhlIGl0ZXJhdG9yIGF1dG9tYXRpY2FsbHkgZ2V0cyBhZHZhbmNlZCB0byB0
aGUgbmV4dCBpdGVtLCBhbmQgd2UgbWFrZSBzdXJlIHdlIHJldHVybiBpdC4KLSAgICBpZiAoX2N1
cnJlbnQgPT0gX2l0ZXJhdG9yLmN1cnJlbnQoKSkKLSAgICAgICAgKytfaXRlcmF0b3I7Ci0gICAg
X2N1cnJlbnQgPSBfaXRlcmF0b3IuY3VycmVudCgpOwotICAgIHJldHVybiBfY3VycmVudDsKLX0K
LQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQ2FjaGVkT2Jq
ZWN0Q2xpZW50Ojp+Q2FjaGVkT2JqZWN0Q2xpZW50KCkgeyB9Ci12b2lkIENhY2hlZE9iamVjdENs
aWVudDo6c2V0UGl4bWFwKGNvbnN0IFFQaXhtYXAgJiwgY29uc3QgUVJlY3QmLCBDYWNoZWRJbWFn
ZSAqKSB7fQotdm9pZCBDYWNoZWRPYmplY3RDbGllbnQ6OnNldFN0eWxlU2hlZXQoY29uc3QgRE9N
OjpET01TdHJpbmcgJi8qdXJsKi8sIGNvbnN0IERPTTo6RE9NU3RyaW5nICYvKnNoZWV0Ki8pIHt9
Ci0jaWZuZGVmIEtIVE1MX05PX1hCTAotdm9pZCBDYWNoZWRPYmplY3RDbGllbnQ6OnNldFhCTERv
Y3VtZW50KGNvbnN0IERPTTo6RE9NU3RyaW5nJiB1cmwsIFhCTDo6WEJMRG9jdW1lbnRJbXBsKiBk
b2MpIHt9Ci0jZW5kaWYKLXZvaWQgQ2FjaGVkT2JqZWN0Q2xpZW50Ojpub3RpZnlGaW5pc2hlZChD
YWNoZWRPYmplY3QgKiAvKmZpbmlzaGVkT2JqKi8pIHt9Ci0KIENhY2hlOjpTdGF0aXN0aWNzIENh
Y2hlOjpnZXRTdGF0aXN0aWNzKCkKIHsKICAgICBTdGF0aXN0aWNzIHN0YXRzOwpJbmRleDogbWlz
Yy9sb2FkZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIG1pc2MvbG9hZGVyLmNwcAkocmV2aXNpb24gMTE5
NDgpCisrKyBtaXNjL2xvYWRlci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI1LDk2MSArMjUsNDkg
QEAKICAgICBwYWdlcyBmcm9tIHRoZSB3ZWIuIEl0IGhhcyBhIG1lbW9yeSBjYWNoZSBmb3IgdGhl
c2Ugb2JqZWN0cy4KICovCiAKLSN1bmRlZiBDQUNIRV9ERUJVRwotLy8jZGVmaW5lIENBQ0hFX0RF
QlVHCiAjaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0KLSNpbmNsdWRl
ICJsb2FkZXIuaCIKLQotLy8gdXAgdG8gd2hpY2ggc2l6ZSBpcyBhIHBpY3R1cmUgZm9yIHN1cmUg
Y2FjaGVhYmxlCi0jZGVmaW5lIE1BWENBQ0hFQUJMRSA0MCoxMDI0Ci0vLyBkZWZhdWx0IGNhY2hl
IHNpemUKLSNkZWZpbmUgREVGQ0FDSEVTSVpFIDQwOTYqMTAyNAotCi0jaW5jbHVkZSA8cWFzeW5j
aW8uaD4KLSNpbmNsdWRlIDxxcGFpbnRlci5oPgotCi0jaW5jbHVkZSA8a2lvL2pvYi5oPgotI2lu
Y2x1ZGUgPGtpby9qb2JjbGFzc2VzLmg+Ci0jaW5jbHVkZSA8a2ltYWdlaW8uaD4KLSNpbmNsdWRl
IDxrY2hhcnNldHMuaD4KLSNpbmNsdWRlIDxrZGVidWcuaD4KLSNpbmNsdWRlICJraHRtbF9mYWN0
b3J5LmgiCi0jaW5jbHVkZSAia2h0bWxfcGFydC5oIgotI2luY2x1ZGUgImRlY29kZXIuaCIKLQot
I2luY2x1ZGUgImh0bWwvaHRtbF9kb2N1bWVudGltcGwuaCIKLSNpbmNsdWRlICJjc3MvY3NzX3N0
eWxlc2hlZXRpbXBsLmgiCi0KLSNpZm5kZWYgS0hUTUxfTk9fWEJMCi0jaW5jbHVkZSAieGJsL3hi
bF9kb2NpbXBsLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgPGt4bWxjb3JlL0Fzc2VydGlvbnMuaD4K
LSNpbmNsdWRlICJLV1FMb2FkZXIuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGtodG1sOwotdXNpbmcg
bmFtZXNwYWNlIERPTTsKLQotc3RhdGljIGJvb2wgY2FjaGVEaXNhYmxlZDsKLQotLy8gQ2FsbCB0
aGlzICJ3YWxrZXIiIGluc3RlYWQgb2YgaXRlcmF0b3Igc28gcGVvcGxlIHdvbid0IGV4cGVjdCBR
dCBvciBTVEwtc3R5bGUgaXRlcmF0b3IgaW50ZXJmYWNlLgotLy8gSnVzdCBrZWVwIGNhbGxpbmcg
bmV4dCgpIG9uIHRoaXMuIEl0J3Mgc2FmZSBmcm9tIGRlbGV0aW9ucyBvZiB0aGUgY3VycmVudCBp
dGVtCi1jbGFzcyBDYWNoZWRPYmplY3RDbGllbnRXYWxrZXIgewotcHVibGljOgotICAgIENhY2hl
ZE9iamVjdENsaWVudFdhbGtlcihjb25zdCBRUHRyRGljdDxDYWNoZWRPYmplY3RDbGllbnQ+ICZj
bGllbnRzKSA6IF9jdXJyZW50KDApLCBfaXRlcmF0b3IoY2xpZW50cykgeyB9Ci0gICAgQ2FjaGVk
T2JqZWN0Q2xpZW50ICpuZXh0KCk7Ci1wcml2YXRlOgotICAgIENhY2hlZE9iamVjdENsaWVudCAq
X2N1cnJlbnQ7Ci0gICAgUVB0ckRpY3RJdGVyYXRvcjxDYWNoZWRPYmplY3RDbGllbnQ+IF9pdGVy
YXRvcjsKLX07Ci0KLUNhY2hlZE9iamVjdDo6fkNhY2hlZE9iamVjdCgpCi17Ci0gICAgaWYobV9k
ZWxldGVkKSBhYm9ydCgpOwotICAgIENhY2hlOjpyZW1vdmVGcm9tTFJVTGlzdCh0aGlzKTsKLSAg
ICBtX2RlbGV0ZWQgPSB0cnVlOwotICAgIHNldFJlc3BvbnNlKDApOwotICAgIHNldEFsbERhdGEo
MCk7Ci19Ci0KLXZvaWQgQ2FjaGVkT2JqZWN0OjpmaW5pc2goKQotewotICAgIGlmIChtX3NpemUg
PiBDYWNoZTo6bWF4Q2FjaGVhYmxlT2JqZWN0U2l6ZSgpKQotICAgICAgICBtX3N0YXR1cyA9IFVu
Y2FjaGVhYmxlOwotICAgIGVsc2UKLSAgICAgICAgbV9zdGF0dXMgPSBDYWNoZWQ7Ci0gICAgS1VS
TCB1cmwobV91cmwucXN0cmluZygpKTsKLSAgICBpZiAobV9leHBpcmVEYXRlQ2hhbmdlZCAmJiB1
cmwucHJvdG9jb2woKS5zdGFydHNXaXRoKCJodHRwIikpCi0gICAgICAgIG1fZXhwaXJlRGF0ZUNo
YW5nZWQgPSBmYWxzZTsKLX0KLQotdm9pZCBDYWNoZWRPYmplY3Q6OnNldEV4cGlyZURhdGUodGlt
ZV90IF9leHBpcmVEYXRlLCBib29sIGNoYW5nZUh0dHBDYWNoZSkKLXsKLSAgICBpZiAoIF9leHBp
cmVEYXRlID09IG1fZXhwaXJlRGF0ZSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYgKG1fc3Rh
dHVzID09IFVuY2FjaGVhYmxlIHx8IG1fc3RhdHVzID09IENhY2hlZCkKLSAgICB7Ci0gICAgICAg
IGZpbmlzaCgpOwotICAgIH0KLSAgICBtX2V4cGlyZURhdGUgPSBfZXhwaXJlRGF0ZTsKLSAgICBp
ZiAoY2hhbmdlSHR0cENhY2hlICYmIG1fZXhwaXJlRGF0ZSkKLSAgICAgICBtX2V4cGlyZURhdGVD
aGFuZ2VkID0gdHJ1ZTsKLX0KLQotYm9vbCBDYWNoZWRPYmplY3Q6OmlzRXhwaXJlZCgpIGNvbnN0
Ci17Ci0gICAgaWYgKCFtX2V4cGlyZURhdGUpIHJldHVybiBmYWxzZTsKLSAgICB0aW1lX3Qgbm93
ID0gdGltZSgwKTsKLSAgICByZXR1cm4gKGRpZmZ0aW1lKG5vdywgbV9leHBpcmVEYXRlKSA+PSAw
KTsKLX0KLQotdm9pZCBDYWNoZWRPYmplY3Q6OnNldFJlcXVlc3QoUmVxdWVzdCAqX3JlcXVlc3Qp
Ci17Ci0gICAgaWYgKCBfcmVxdWVzdCAmJiAhbV9yZXF1ZXN0ICkKLSAgICAgICAgbV9zdGF0dXMg
PSBQZW5kaW5nOwotICAgIG1fcmVxdWVzdCA9IF9yZXF1ZXN0OwotICAgIGlmIChjYW5EZWxldGUo
KSAmJiBtX2ZyZWUpCi0gICAgICAgIGRlbGV0ZSB0aGlzOwotICAgIGVsc2UgaWYgKGFsbG93SW5M
UlVMaXN0KCkpCi0gICAgICAgIENhY2hlOjppbnNlcnRJbkxSVUxpc3QodGhpcyk7Ci19Ci0KLXZv
aWQgQ2FjaGVkT2JqZWN0OjpyZWYoQ2FjaGVkT2JqZWN0Q2xpZW50ICpjKQotewotICAgIG1fY2xp
ZW50cy5pbnNlcnQoYywgYyk7Ci0gICAgQ2FjaGU6OnJlbW92ZUZyb21MUlVMaXN0KHRoaXMpOwot
ICAgIGluY3JlYXNlQWNjZXNzQ291bnQoKTsKLX0KLQotdm9pZCBDYWNoZWRPYmplY3Q6OmRlcmVm
KENhY2hlZE9iamVjdENsaWVudCAqYykKLXsKLSAgICBtX2NsaWVudHMucmVtb3ZlKGMpOwotICAg
IGlmIChhbGxvd0luTFJVTGlzdCgpKQotICAgICAgICBDYWNoZTo6aW5zZXJ0SW5MUlVMaXN0KHRo
aXMpOwotfQotCi12b2lkIENhY2hlZE9iamVjdDo6c2V0U2l6ZShpbnQgc2l6ZSkKLXsKLSAgICBi
b29sIHNpemVDaGFuZ2VkID0gQ2FjaGU6OmFkanVzdFNpemUodGhpcywgc2l6ZSAtIG1fc2l6ZSk7
Ci0KLSAgICAvLyBUaGUgb2JqZWN0IG11c3Qgbm93IGJlIG1vdmVkIHRvIGEgZGlmZmVyZW50IHF1
ZXVlLCBzaW5jZSBpdHMgc2l6ZSBoYXMgYmVlbiBjaGFuZ2VkLgotICAgIGlmIChzaXplQ2hhbmdl
ZCAmJiBhbGxvd0luTFJVTGlzdCgpKQotICAgICAgICBDYWNoZTo6cmVtb3ZlRnJvbUxSVUxpc3Qo
dGhpcyk7Ci0KLSAgICBtX3NpemUgPSBzaXplOwotICAgIAotICAgIGlmIChzaXplQ2hhbmdlZCAm
JiBhbGxvd0luTFJVTGlzdCgpKQotICAgICAgICBDYWNoZTo6aW5zZXJ0SW5MUlVMaXN0KHRoaXMp
OwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUNhY2hlZENT
U1N0eWxlU2hlZXQ6OkNhY2hlZENTU1N0eWxlU2hlZXQoRG9jTG9hZGVyKiBkbCwgY29uc3QgRE9N
U3RyaW5nICZ1cmwsIEtJTzo6Q2FjaGVDb250cm9sIF9jYWNoZVBvbGljeSwgdGltZV90IF9leHBp
cmVEYXRlLCBjb25zdCBRU3RyaW5nJiBjaGFyc2V0KQotICAgIDogQ2FjaGVkT2JqZWN0KHVybCwg
Q1NTU3R5bGVTaGVldCwgX2NhY2hlUG9saWN5LCBfZXhwaXJlRGF0ZSksIG1fY29kZWMoMCkKLXsK
LSAgICAvLyBJdCdzIGNzcyB3ZSB3YW50LgotICAgIHNldEFjY2VwdCgidGV4dC9jc3MiKTsKLSAg
ICAvLyBsb2FkIHRoZSBmaWxlCi0gICAgQ2FjaGU6OmxvYWRlcigpLT5sb2FkKGRsLCB0aGlzLCBm
YWxzZSk7Ci0gICAgbV9sb2FkaW5nID0gdHJ1ZTsKLSAgICBpZiAoIWNoYXJzZXQuaXNFbXB0eSgp
KQotCW1fY29kZWMgPSBRVGV4dENvZGVjOjpjb2RlY0Zvck5hbWUoY2hhcnNldC5sYXRpbjEoKSk7
Ci0gICAgaWYgKCFtX2NvZGVjKQotICAgICAgICBtX2NvZGVjID0gUVRleHRDb2RlYzo6Y29kZWNG
b3JOYW1lKCJpc284ODU5LTEiKTsKLX0KLQotQ2FjaGVkQ1NTU3R5bGVTaGVldDo6Q2FjaGVkQ1NT
U3R5bGVTaGVldChjb25zdCBET01TdHJpbmcgJnVybCwgY29uc3QgUVN0cmluZyAmc3R5bGVzaGVl
dF9kYXRhKQotICAgIDogQ2FjaGVkT2JqZWN0KHVybCwgQ1NTU3R5bGVTaGVldCwgS0lPOjpDQ19W
ZXJpZnksIDAsIHN0eWxlc2hlZXRfZGF0YS5sZW5ndGgoKSkKLXsKLSAgICBtX2xvYWRpbmcgPSBm
YWxzZTsKLSAgICBtX3N0YXR1cyA9IFBlcnNpc3RlbnQ7Ci0gICAgbV9jb2RlYyA9IDA7Ci0gICAg
bV9zaGVldCA9IERPTVN0cmluZyhzdHlsZXNoZWV0X2RhdGEpOwotfQotCi0KLUNhY2hlZENTU1N0
eWxlU2hlZXQ6On5DYWNoZWRDU1NTdHlsZVNoZWV0KCkKLXsKLX0KLQotdm9pZCBDYWNoZWRDU1NT
dHlsZVNoZWV0OjpyZWYoQ2FjaGVkT2JqZWN0Q2xpZW50ICpjKQotewotICAgIENhY2hlZE9iamVj
dDo6cmVmKGMpOwotCi0gICAgaWYoIW1fbG9hZGluZykgYy0+c2V0U3R5bGVTaGVldCggbV91cmws
IG1fc2hlZXQgKTsKLX0KLQotdm9pZCBDYWNoZWRDU1NTdHlsZVNoZWV0OjpkZXJlZihDYWNoZWRP
YmplY3RDbGllbnQgKmMpCi17Ci0gICAgQ2FjaGU6OmZsdXNoKCk7Ci0gICAgQ2FjaGVkT2JqZWN0
OjpkZXJlZihjKTsKLSAgICBpZiAoIGNhbkRlbGV0ZSgpICYmIG1fZnJlZSApCi0gICAgICBkZWxl
dGUgdGhpczsKLX0KLQotdm9pZCBDYWNoZWRDU1NTdHlsZVNoZWV0OjpzZXRDaGFyc2V0KCBjb25z
dCBRU3RyaW5nICZjaHMgKQotewotICAgIGlmICghY2hzLmlzRW1wdHkoKSkgewotICAgICAgICBR
VGV4dENvZGVjICpjb2RlYyA9IFFUZXh0Q29kZWM6OmNvZGVjRm9yTmFtZShjaHMubGF0aW4xKCkp
OwotICAgICAgICBpZiAoY29kZWMpCi0gICAgICAgICAgICBtX2NvZGVjID0gY29kZWM7Ci0gICAg
fQotfQotCi12b2lkIENhY2hlZENTU1N0eWxlU2hlZXQ6OmRhdGEoIFFCdWZmZXIgJmJ1ZmZlciwg
Ym9vbCBlb2YgKQotewotICAgIGlmKCFlb2YpIHJldHVybjsKLSAgICBidWZmZXIuY2xvc2UoKTsK
LSAgICBzZXRTaXplKGJ1ZmZlci5idWZmZXIoKS5zaXplKCkpOwotICAgIFFTdHJpbmcgZGF0YSA9
IG1fY29kZWMtPnRvVW5pY29kZSggYnVmZmVyLmJ1ZmZlcigpLmRhdGEoKSwgc2l6ZSgpICk7Ci0g
ICAgbV9zaGVldCA9IERPTVN0cmluZyhkYXRhKTsKLSAgICBtX2xvYWRpbmcgPSBmYWxzZTsKLQot
ICAgIGNoZWNrTm90aWZ5KCk7Ci19Ci0KLXZvaWQgQ2FjaGVkQ1NTU3R5bGVTaGVldDo6Y2hlY2tO
b3RpZnkoKQotewotICAgIGlmIChtX2xvYWRpbmcpCi0gICAgICAgIHJldHVybjsKLQotICAgIENh
Y2hlZE9iamVjdENsaWVudFdhbGtlciB3KG1fY2xpZW50cyk7Ci0gICAgd2hpbGUgKENhY2hlZE9i
amVjdENsaWVudCAqYyA9IHcubmV4dCgpKSB7Ci0gICAgICAgIGlmIChtX3Jlc3BvbnNlICYmICFL
V1FJc1Jlc3BvbnNlVVJMRXF1YWxUb1VSTChtX3Jlc3BvbnNlLCBtX3VybCkpCi0gICAgICAgICAg
ICBjLT5zZXRTdHlsZVNoZWV0KERPTVN0cmluZyhLV1FSZXNwb25zZVVSTChtX3Jlc3BvbnNlKSks
IG1fc2hlZXQpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBjLT5zZXRTdHlsZVNoZWV0KG1f
dXJsLCBtX3NoZWV0KTsKLSAgICB9Ci19Ci0KLQotdm9pZCBDYWNoZWRDU1NTdHlsZVNoZWV0Ojpl
cnJvciggaW50IC8qZXJyKi8sIGNvbnN0IGNoYXIgKi8qdGV4dCovICkKLXsKLSAgICBtX2xvYWRp
bmcgPSBmYWxzZTsKLSAgICBjaGVja05vdGlmeSgpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tCi0KLUNhY2hlZFNjcmlwdDo6Q2FjaGVkU2NyaXB0KERvY0xvYWRl
ciogZGwsIGNvbnN0IERPTVN0cmluZyAmdXJsLCBLSU86OkNhY2hlQ29udHJvbCBfY2FjaGVQb2xp
Y3ksIHRpbWVfdCBfZXhwaXJlRGF0ZSwgY29uc3QgUVN0cmluZyYgY2hhcnNldCkKLSAgICA6IENh
Y2hlZE9iamVjdCh1cmwsIFNjcmlwdCwgX2NhY2hlUG9saWN5LCBfZXhwaXJlRGF0ZSksIG1fY29k
ZWMoMCkKLXsKLSAgICAvLyBJdCdzIGphdmFzY3JpcHQgd2Ugd2FudC4KLSAgICAvLyBCdXQgc29t
ZSB3ZWJzaXRlcyB0aGluayB0aGVpciBzY3JpcHRzIGFyZSA8c29tZSB3cm9uZyBtaW1ldHlwZSBo
ZXJlPgotICAgIC8vIGFuZCByZWZ1c2UgdG8gc2VydmUgdGhlbSBpZiB3ZSBvbmx5IGFjY2VwdCBh
cHBsaWNhdGlvbi94LWphdmFzY3JpcHQuCi0gICAgc2V0QWNjZXB0KCIqLyoiKTsKLSAgICBtX2Vy
cm9yT2NjdXJyZWQgPSBmYWxzZTsKLSAgICAvLyBsb2FkIHRoZSBmaWxlCi0gICAgQ2FjaGU6Omxv
YWRlcigpLT5sb2FkKGRsLCB0aGlzLCBmYWxzZSk7Ci0gICAgbV9sb2FkaW5nID0gdHJ1ZTsKLSAg
ICBpZiAoIWNoYXJzZXQuaXNFbXB0eSgpKQotICAgICAgICBtX2NvZGVjID0gUVRleHRDb2RlYzo6
Y29kZWNGb3JOYW1lKGNoYXJzZXQubGF0aW4xKCkpOwotICAgIGlmICghbV9jb2RlYykKLQltX2Nv
ZGVjID0gUVRleHRDb2RlYzo6Y29kZWNGb3JOYW1lKCJpc284ODU5LTEiKTsKLX0KLQotQ2FjaGVk
U2NyaXB0OjpDYWNoZWRTY3JpcHQoY29uc3QgRE9NU3RyaW5nICZ1cmwsIGNvbnN0IFFTdHJpbmcg
JnNjcmlwdF9kYXRhKQotICAgIDogQ2FjaGVkT2JqZWN0KHVybCwgU2NyaXB0LCBLSU86OkNDX1Zl
cmlmeSwgMCwgc2NyaXB0X2RhdGEubGVuZ3RoKCkpCi17Ci0gICAgbV9lcnJvck9jY3VycmVkID0g
ZmFsc2U7Ci0gICAgbV9sb2FkaW5nID0gZmFsc2U7Ci0gICAgbV9zdGF0dXMgPSBQZXJzaXN0ZW50
OwotICAgIG1fY29kZWMgPSAwOwotICAgIG1fc2NyaXB0ID0gRE9NU3RyaW5nKHNjcmlwdF9kYXRh
KTsKLX0KLQotQ2FjaGVkU2NyaXB0Ojp+Q2FjaGVkU2NyaXB0KCkKLXsKLX0KLQotdm9pZCBDYWNo
ZWRTY3JpcHQ6OnJlZihDYWNoZWRPYmplY3RDbGllbnQgKmMpCi17Ci0gICAgQ2FjaGVkT2JqZWN0
OjpyZWYoYyk7Ci0KLSAgICBpZighbV9sb2FkaW5nKSBjLT5ub3RpZnlGaW5pc2hlZCh0aGlzKTsK
LX0KLQotdm9pZCBDYWNoZWRTY3JpcHQ6OmRlcmVmKENhY2hlZE9iamVjdENsaWVudCAqYykKLXsK
LSAgICBDYWNoZTo6Zmx1c2goKTsKLSAgICBDYWNoZWRPYmplY3Q6OmRlcmVmKGMpOwotICAgIGlm
ICggY2FuRGVsZXRlKCkgJiYgbV9mcmVlICkKLSAgICAgIGRlbGV0ZSB0aGlzOwotfQotCi12b2lk
IENhY2hlZFNjcmlwdDo6c2V0Q2hhcnNldCggY29uc3QgUVN0cmluZyAmY2hzICkKLXsKLSAgICBp
ZiAoIWNocy5pc0VtcHR5KCkpIHsKLSAgICAgICAgUVRleHRDb2RlYyAqY29kZWMgPSBRVGV4dENv
ZGVjOjpjb2RlY0Zvck5hbWUoY2hzLmxhdGluMSgpKTsKLSAgICAgICAgaWYgKGNvZGVjKQotICAg
ICAgICAgICAgbV9jb2RlYyA9IGNvZGVjOwotICAgIH0KLX0KLQotdm9pZCBDYWNoZWRTY3JpcHQ6
OmRhdGEoIFFCdWZmZXIgJmJ1ZmZlciwgYm9vbCBlb2YgKQotewotICAgIGlmKCFlb2YpIHJldHVy
bjsKLSAgICBidWZmZXIuY2xvc2UoKTsKLSAgICBzZXRTaXplKGJ1ZmZlci5idWZmZXIoKS5zaXpl
KCkpOwotICAgIFFTdHJpbmcgZGF0YSA9IG1fY29kZWMtPnRvVW5pY29kZSggYnVmZmVyLmJ1ZmZl
cigpLmRhdGEoKSwgc2l6ZSgpICk7Ci0gICAgbV9zY3JpcHQgPSBET01TdHJpbmcoZGF0YSk7Ci0g
ICAgbV9sb2FkaW5nID0gZmFsc2U7Ci0gICAgY2hlY2tOb3RpZnkoKTsKLX0KLQotdm9pZCBDYWNo
ZWRTY3JpcHQ6OmNoZWNrTm90aWZ5KCkKLXsKLSAgICBpZihtX2xvYWRpbmcpIHJldHVybjsKLQot
ICAgIENhY2hlZE9iamVjdENsaWVudFdhbGtlciB3KG1fY2xpZW50cyk7Ci0gICAgd2hpbGUgKENh
Y2hlZE9iamVjdENsaWVudCAqYyA9IHcubmV4dCgpKQotICAgICAgICBjLT5ub3RpZnlGaW5pc2hl
ZCh0aGlzKTsKLX0KLQotCi12b2lkIENhY2hlZFNjcmlwdDo6ZXJyb3IoIGludCAvKmVyciovLCBj
b25zdCBjaGFyICovKnRleHQqLyApCi17Ci0gICAgbV9sb2FkaW5nID0gZmFsc2U7Ci0gICAgbV9l
cnJvck9jY3VycmVkID0gdHJ1ZTsKLSAgICBjaGVja05vdGlmeSgpOwotfQotCi0vLyAtLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi1zdGF0aWMgYm9vbCBjcm9zc0RvbWFpbihj
b25zdCBRU3RyaW5nICZhLCBjb25zdCBRU3RyaW5nICZiKQotewotICAgIGlmIChhID09IGIpIHJl
dHVybiBmYWxzZTsKLQotICAgIFFTdHJpbmdMaXN0IGwxID0gUVN0cmluZ0xpc3Q6OnNwbGl0KCcu
JywgYSk7Ci0gICAgUVN0cmluZ0xpc3QgbDIgPSBRU3RyaW5nTGlzdDo6c3BsaXQoJy4nLCBiKTsK
LQotICAgIHdoaWxlKGwxLmNvdW50KCkgPiBsMi5jb3VudCgpKQotICAgICAgICBsMS5wb3BfZnJv
bnQoKTsKLQotICAgIHdoaWxlKGwyLmNvdW50KCkgPiBsMS5jb3VudCgpKQotICAgICAgICBsMi5w
b3BfZnJvbnQoKTsKLQotICAgIHdoaWxlKGwyLmNvdW50KCkgPj0gMikKLSAgICB7Ci0gICAgICAg
IGlmIChsMSA9PSBsMikKLSAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIGwxLnBv
cF9mcm9udCgpOwotICAgICAgICBsMi5wb3BfZnJvbnQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRy
dWU7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXZvaWQgQ2FjaGVkSW1h
Z2VDYWxsYmFjazo6bm90aWZ5VXBkYXRlKCkgCi17IAotICAgIGlmIChjYWNoZWRJbWFnZSkgewot
ICAgICAgICBjYWNoZWRJbWFnZS0+ZG9fbm90aWZ5IChjYWNoZWRJbWFnZS0+cGl4bWFwKCksIGNh
Y2hlZEltYWdlLT5waXhtYXAoKS5yZWN0KCkpOyAKLSAgICAgICAgUVNpemUgcyA9IGNhY2hlZElt
YWdlLT5waXhtYXBfc2l6ZSgpOwotICAgICAgICBjYWNoZWRJbWFnZS0+c2V0U2l6ZShzLndpZHRo
KCkgKiBzLmhlaWdodCgpICogMik7Ci0KLSAgICAgICAgLy8gQWZ0ZXIgcmVjZWl2aW5nIHRoZSBp
bWFnZSBoZWFkZXIgd2UgYXJlIGd1YXJhbnRlZWQgdG8ga25vdwotICAgICAgICAvLyB0aGUgaW1h
Z2Ugc2l6ZS4gIEFsdGhvdWdoIGFsbCBvZiB0aGUgZGF0YSBtYXkgbm90IGhhdmUgYXJyaXZlZCBv
cgotICAgICAgICAvLyBiZWVuIGRlY29kZWQgd2UgY2FuIGNvbnNpZGVyIHRoZSBpbWFnZSBsb2Fk
ZWQgZm9yIHB1cnBvc2VkIG9mCi0gICAgICAgIC8vIGxheW91dCBhbmQgZGlzcGF0Y2hpbmcgdGhl
IGltYWdlJ3Mgb25sb2FkIGhhbmRsZXIuICBSZW1vdmluZyB0aGUgcmVxdWVzdCBmcm9tCi0gICAg
ICAgIC8vIHRoZSBsaXN0IG9mIGJhY2tncm91bmQgZGVjb2RpbmcgcmVxdWVzdHMgd2lsbCBlbnN1
cmUgdGhhdCBMb2FkZXI6Om51bVJlcXVlc3RzKCkgCi0gICAgICAgIC8vIGRvZXMgbm90IGNvdW50
IHRoaXMgYmFja2dyb3VuZCByZXF1ZXN0LiAgRnVydGhlciBudW1SZXF1ZXN0cygpIGNhbgotICAg
ICAgICAvLyBiZSBjb3JyZWN0bHkgdXNlZCBieSB0aGUgcGFydCB0byBkZXRlcm1pbmUgaWYgbG9h
ZGluZyBpcyBzdWZmaWNpZW50bHkKLSAgICAgICAgLy8gY29tcGxldGUgdG8gZGlzcGF0Y2ggdGhl
IHBhZ2UncyBvbmxvYWQgaGFuZGxlci4KLSAgICAgICAgUmVxdWVzdCAqciA9IGNhY2hlZEltYWdl
LT5tX3JlcXVlc3Q7Ci0gICAgICAgIERvY0xvYWRlciAqZGwgPSByLT5tX2RvY0xvYWRlcjsKLQot
ICAgICAgICBraHRtbDo6Q2FjaGU6OmxvYWRlcigpLT5yZW1vdmVCYWNrZ3JvdW5kRGVjb2RpbmdS
ZXF1ZXN0KHIpOwotCi0gICAgICAgIC8vIFBva2UgdGhlIHBhcnQgdG8gZ2V0IGl0IHRvIGRvIGEg
Y2hlY2tDb21wbGV0ZWQoKS4gIE9ubHkgZG8gdGhpcyBmb3IKLSAgICAgICAgLy8gdGhlIGZpcnN0
IHVwZGF0ZSB0byBtaW5pbWl6ZSB3b3JrLiAgTm90ZSB0aGF0IHdlIGFyZSBndWFyYW50ZWVkIHRv
IGhhdmUKLSAgICAgICAgLy8gcmVhZCB0aGUgaGVhZGVyIHdoZW4gd2UgcmVjZWl2ZWQgdGhpcyBm
aXJzdCB1cGRhdGUsIHdoaWNoIGlzIHRyaWdnZXJlZAotICAgICAgICAvLyBieSB0aGUgZmlyc3Qg
a0NHSW1hZ2VTdGF0dXNJbmNvbXBsZXRlIHN0YXR1cyBmcm9tIENHLiBrQ0dJbWFnZVN0YXR1c0lu
Y29tcGxldGUKLSAgICAgICAgLy8gcmVhbGx5IG1lYW5zIHRoYXQgdGhlIENHIGRlY29kZXIgaXMg
d2FpdGluZyBmb3IgbW9yZSBkYXRhLCBidXQgaGFzIGFscmVhZHkKLSAgICAgICAgLy8gcmVhZCB0
aGUgaGVhZGVyLgotICAgICAgICBpZiAoIWhlYWRlclJlY2VpdmVkKSB7Ci0gICAgICAgICAgICBl
bWl0IGtodG1sOjpDYWNoZTo6bG9hZGVyKCktPnJlcXVlc3REb25lKCBkbCwgY2FjaGVkSW1hZ2Ug
KTsKLSAgICAgICAgICAgIGhlYWRlclJlY2VpdmVkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0K
LX0KLQotdm9pZCBDYWNoZWRJbWFnZUNhbGxiYWNrOjpub3RpZnlGaW5pc2hlZCgpCi17Ci0gICAg
aWYgKGNhY2hlZEltYWdlKSB7Ci0gICAgICAgIGNhY2hlZEltYWdlLT5kb19ub3RpZnkgKGNhY2hl
ZEltYWdlLT5waXhtYXAoKSwgY2FjaGVkSW1hZ2UtPnBpeG1hcCgpLnJlY3QoKSk7IAotICAgICAg
ICBjYWNoZWRJbWFnZS0+bV9sb2FkaW5nID0gZmFsc2U7Ci0gICAgICAgIGNhY2hlZEltYWdlLT5j
aGVja05vdGlmeSgpOwotICAgICAgICBRU2l6ZSBzID0gY2FjaGVkSW1hZ2UtPnBpeG1hcF9zaXpl
KCk7Ci0gICAgICAgIGNhY2hlZEltYWdlLT5zZXRTaXplKHMud2lkdGgoKSAqIHMuaGVpZ2h0KCkg
KiAyKTsKLQkKLSAgICAgICAgUmVxdWVzdCAqciA9IGNhY2hlZEltYWdlLT5tX3JlcXVlc3Q7Ci0g
ICAgICAgIERvY0xvYWRlciAqZGwgPSByLT5tX2RvY0xvYWRlcjsKLQotICAgICAgICBraHRtbDo6
Q2FjaGU6OmxvYWRlcigpLT5yZW1vdmVCYWNrZ3JvdW5kRGVjb2RpbmdSZXF1ZXN0KHIpOwotCi0g
ICAgICAgIC8vIFBva2UgdGhlIHBhcnQgdG8gZ2V0IGl0IHRvIGRvIGEgY2hlY2tDb21wbGV0ZWQo
KS4KLSAgICAgICAgZW1pdCBraHRtbDo6Q2FjaGU6OmxvYWRlcigpLT5yZXF1ZXN0RG9uZSggZGws
IGNhY2hlZEltYWdlICk7Ci0gICAgICAgIAotICAgICAgICBkZWxldGUgcjsKLSAgICB9Ci19Ci0K
LXZvaWQgQ2FjaGVkSW1hZ2VDYWxsYmFjazo6bm90aWZ5RGVjb2RpbmdFcnJvcigpCi17Ci0gICAg
aWYgKGNhY2hlZEltYWdlKSB7Ci0gICAgICAgIGhhbmRsZUVycm9yKCk7Ci0gICAgfQotfQotCi12
b2lkIENhY2hlZEltYWdlQ2FsbGJhY2s6OmhhbmRsZUVycm9yKCkKLXsKLSAgICBpZiAoY2FjaGVk
SW1hZ2UpIHsKLSAgICAgICAgY2FjaGVkSW1hZ2UtPmVycm9yT2NjdXJlZCA9IHRydWU7Ci0gICAg
ICAgIFFQaXhtYXAgZXAgPSBjYWNoZWRJbWFnZS0+cGl4bWFwKCk7Ci0gICAgICAgIGNhY2hlZElt
YWdlLT5kb19ub3RpZnkgKGVwLCBlcC5yZWN0KCkpOwotICAgICAgICBDYWNoZTo6cmVtb3ZlQ2Fj
aGVFbnRyeSAoY2FjaGVkSW1hZ2UpOwotCi0gICAgICAgIGNsZWFyKCk7Ci0gICAgfQotfQotCi12
b2lkIENhY2hlZEltYWdlQ2FsbGJhY2s6OmNsZWFyKCkgCi17Ci0gICAgaWYgKGNhY2hlZEltYWdl
ICYmIGNhY2hlZEltYWdlLT5tX3JlcXVlc3QpIHsKLSAgICAgICAgUmVxdWVzdCAqciA9IGNhY2hl
ZEltYWdlLT5tX3JlcXVlc3Q7Ci0gICAgICAgIERvY0xvYWRlciAqZGwgPSByLT5tX2RvY0xvYWRl
cjsKLQotICAgICAgICBraHRtbDo6Q2FjaGU6OmxvYWRlcigpLT5yZW1vdmVCYWNrZ3JvdW5kRGVj
b2RpbmdSZXF1ZXN0KHIpOwotCi0gICAgICAgIC8vIFBva2UgdGhlIHBhcnQgdG8gZ2V0IGl0IHRv
IGRvIGEgY2hlY2tDb21wbGV0ZWQoKS4KLSAgICAgICAgZW1pdCBraHRtbDo6Q2FjaGU6OmxvYWRl
cigpLT5yZXF1ZXN0RmFpbGVkKCBkbCwgY2FjaGVkSW1hZ2UgKTsKLQotICAgICAgICBkZWxldGUg
cjsKLSAgICB9Ci0gICAgY2FjaGVkSW1hZ2UgPSAwOwotfQotCi1DYWNoZWRJbWFnZTo6Q2FjaGVk
SW1hZ2UoRG9jTG9hZGVyKiBkbCwgY29uc3QgRE9NU3RyaW5nICZ1cmwsIEtJTzo6Q2FjaGVDb250
cm9sIF9jYWNoZVBvbGljeSwgdGltZV90IF9leHBpcmVEYXRlKQotICAgIDogUU9iamVjdCgpLCBD
YWNoZWRPYmplY3QodXJsLCBJbWFnZSwgX2NhY2hlUG9saWN5LCBfZXhwaXJlRGF0ZSkKLSAgICAs
IG1fZGF0YVNpemUoMCkKLXsKLSAgICBwID0gMDsKLSAgICBwaXhQYXJ0ID0gMDsKLSAgICBiZyA9
IDA7Ci0gICAgaXNGdWxseVRyYW5zcGFyZW50ID0gZmFsc2U7Ci0gICAgZXJyb3JPY2N1cmVkID0g
ZmFsc2U7Ci0gICAgbW9ub2Nocm9tZSA9IGZhbHNlOwotICAgIGZvcm1hdFR5cGUgPSAwOwotICAg
IG1fc3RhdHVzID0gVW5rbm93bjsKLSAgICBpbWdTb3VyY2UgPSAwOwotICAgIG1fbG9hZGluZyA9
IHRydWU7Ci0gICAgbV9zaG93QW5pbWF0aW9ucyA9IGRsLT5zaG93QW5pbWF0aW9ucygpOwotICAg
IGlmIChRUGl4bWFwOjpzaG91bGRVc2VUaHJlYWRlZERlY29kaW5nKCkpCi0gICAgICAgIG1fZGVj
b2RlckNhbGxiYWNrID0gbmV3IENhY2hlZEltYWdlQ2FsbGJhY2sodGhpcyk7Ci0gICAgZWxzZQot
ICAgICAgICBtX2RlY29kZXJDYWxsYmFjayA9IDA7Ci19Ci0KLUNhY2hlZEltYWdlOjp+Q2FjaGVk
SW1hZ2UoKQotewotICAgIGNsZWFyKCk7Ci19Ci0KLXZvaWQgQ2FjaGVkSW1hZ2U6OnJlZiggQ2Fj
aGVkT2JqZWN0Q2xpZW50ICpjICkKLXsKLSAgICBDYWNoZWRPYmplY3Q6OnJlZihjKTsKLQotICAg
IC8vIGZvciBtb3VzZW92ZXJzLCBkeW5hbWljIGNoYW5nZXMKLSAgICBpZiAoIXZhbGlkX3JlY3Qo
KS5pc051bGwoKSkKLSAgICAgICAgYy0+c2V0UGl4bWFwKCBwaXhtYXAoKSwgdmFsaWRfcmVjdCgp
LCB0aGlzKTsKLQotICAgIGlmKCFtX2xvYWRpbmcpCi0gICAgICAgIGMtPm5vdGlmeUZpbmlzaGVk
KHRoaXMpOwotfQotCi12b2lkIENhY2hlZEltYWdlOjpkZXJlZiggQ2FjaGVkT2JqZWN0Q2xpZW50
ICpjICkKLXsKLSAgICBDYWNoZTo6Zmx1c2goKTsKLSAgICBDYWNoZWRPYmplY3Q6OmRlcmVmKGMp
OwotICAgIGlmICggY2FuRGVsZXRlKCkgJiYgbV9mcmVlICkKLSAgICAgICAgZGVsZXRlIHRoaXM7
Ci19Ci0KLWNvbnN0IFFQaXhtYXAgJkNhY2hlZEltYWdlOjp0aWxlZF9waXhtYXAoY29uc3QgUUNv
bG9yJiBuZXdjKQotewotICAgIHJldHVybiBwaXhtYXAoKTsKLX0KLQotY29uc3QgUVBpeG1hcCAm
Q2FjaGVkSW1hZ2U6OnBpeG1hcCggKSBjb25zdAotewotICAgIGlmKGVycm9yT2NjdXJlZCkKLSAg
ICAgICAgcmV0dXJuICpDYWNoZTo6YnJva2VuUGl4bWFwOwotCi0gICAgaWYgKHApCi0gICAgICAg
IHJldHVybiAqcDsKLQotICAgIHJldHVybiAqQ2FjaGU6Om51bGxQaXhtYXA7Ci19Ci0KLVFTaXpl
IENhY2hlZEltYWdlOjpwaXhtYXBfc2l6ZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIChwID8gcC0+
c2l6ZSgpIDogUVNpemUoKSk7Ci19Ci0KLVFSZWN0IENhY2hlZEltYWdlOjp2YWxpZF9yZWN0KCkg
Y29uc3QKLXsKLSAgICByZXR1cm4gKHAgPyBwLT5yZWN0KCkgOiBRUmVjdCgpKTsKLX0KLQotdm9p
ZCBDYWNoZWRJbWFnZTo6ZG9fbm90aWZ5KGNvbnN0IFFQaXhtYXAmIHAsIGNvbnN0IFFSZWN0JiBy
KQotewotICAgIENhY2hlZE9iamVjdENsaWVudFdhbGtlciB3KG1fY2xpZW50cyk7Ci0gICAgd2hp
bGUgKENhY2hlZE9iamVjdENsaWVudCAqYyA9IHcubmV4dCgpKQotICAgICAgICBjLT5zZXRQaXht
YXAocCwgciwgdGhpcyk7Ci19Ci0KLXZvaWQgQ2FjaGVkSW1hZ2U6OnNldFNob3dBbmltYXRpb25z
KCBLSFRNTFNldHRpbmdzOjpLQW5pbWF0aW9uQWR2aWNlIHNob3dBbmltYXRpb25zICkKLXsKLSAg
ICBtX3Nob3dBbmltYXRpb25zID0gc2hvd0FuaW1hdGlvbnM7Ci19Ci0KLXZvaWQgQ2FjaGVkSW1h
Z2U6OmNsZWFyKCkKLXsKLSAgICBkZWxldGUgcDsgICBwID0gMDsKLSAgICBkZWxldGUgYmc7ICBi
ZyA9IDA7Ci0gICAgZGVsZXRlIHBpeFBhcnQ7IHBpeFBhcnQgPSAwOwotCi0gICAgZm9ybWF0VHlw
ZSA9IDA7Ci0KLSAgICBzZXRTaXplKDApOwotCi0gICAgLy8gTm8gbmVlZCB0byBkZWxldGUgaW1h
Z2VTb3VyY2UgLSBRTW92aWUgZG9lcyBpdCBmb3IgdXMKLSAgICBpbWdTb3VyY2UgPSAwOwotCi0g
ICAgaWYgKG1fZGVjb2RlckNhbGxiYWNrKSB7Ci0gICAgICAgIG1fZGVjb2RlckNhbGxiYWNrLT5j
bGVhcigpOwotICAgICAgICBtX2RlY29kZXJDYWxsYmFjay0+ZGVyZWYoKTsKLSAgICAgICAgbV9k
ZWNvZGVyQ2FsbGJhY2sgPSAwOwotICAgIH0KLX0KLQotdm9pZCBDYWNoZWRJbWFnZTo6ZGF0YSAo
IFFCdWZmZXIgJl9idWZmZXIsIGJvb2wgZW9mICkKLXsKLSNpZmRlZiBDQUNIRV9ERUJVRwotICAg
IGtkRGVidWcoIDYwNjAgKSA8PCB0aGlzIDw8ICJpbiBDYWNoZWRJbWFnZTo6ZGF0YShidWZmZXJz
aXplICIgPDwgX2J1ZmZlci5idWZmZXIoKS5zaXplKCkgPDwiLCBlb2Y9IiA8PCBlb2YgPDwgZW5k
bDsKLSNlbmRpZgotCi0gICAgYm9vbCBjYW5EcmF3ID0gZmFsc2U7Ci0gICAgCi0gICAgbV9kYXRh
U2l6ZSA9IF9idWZmZXIuc2l6ZSgpOwotICAgICAgICAKLSAgICAvLyBJZiB3ZSdyZSBhdCBlb2Yg
YW5kIGRvbid0IGhhdmUgYSBwaXhtYXAgeWV0LCB0aGUgZGF0YQotICAgIC8vIG11c3QgaGF2ZSBh
cnJpdmVkIGluIG9uZSBjaHVuay4gIFRoaXMgYXZvaWRzIHRoZSBhdHRlbXB0Ci0gICAgLy8gdG8g
cGVyZm9ybSBpbmNyZW1lbnRhbCBkZWNvZGluZy4KLSAgICBpZiAoZW9mICYmICFwKSB7Ci0gICAg
ICAgIHAgPSBuZXcgUVBpeG1hcChfYnVmZmVyLmJ1ZmZlcigpLCBLV1FSZXNwb25zZU1JTUVUeXBl
KG1fcmVzcG9uc2UpKTsKLSAgICAgICAgaWYgKG1fZGVjb2RlckNhbGxiYWNrKQotICAgICAgICAg
ICAgbV9kZWNvZGVyQ2FsbGJhY2stPm5vdGlmeUZpbmlzaGVkKCk7Ci0gICAgICAgIGNhbkRyYXcg
PSB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIEFsd2F5cyBhdHRlbXB0IHRvIGxvYWQg
dGhlIGltYWdlIGluY3JlbWVudGFsbHkuCi0gICAgICAgIGlmICghcCkKLSAgICAgICAgICAgIHAg
PSBuZXcgUVBpeG1hcChLV1FSZXNwb25zZU1JTUVUeXBlKG1fcmVzcG9uc2UpKTsKLSAgICAgICAg
Y2FuRHJhdyA9IHAtPnJlY2VpdmVkRGF0YShfYnVmZmVyLmJ1ZmZlcigpLCBlb2YsIG1fZGVjb2Rl
ckNhbGxiYWNrKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gSWYgd2UgaGF2ZSBhIGRlY29kZXIsIHdl
J2xsIGJlIG5vdGlmaWVkIHdoZW4gZGVjb2RpbmcgaGFzIGNvbXBsZXRlZC4KLSAgICBpZiAoIW1f
ZGVjb2RlckNhbGxiYWNrKSB7Ci0gICAgICAgIGlmIChjYW5EcmF3IHx8IGVvZikgewotICAgICAg
ICAgICAgaWYgKHAtPmlzTnVsbCgpKSB7Ci0gICAgICAgICAgICAgICAgZXJyb3JPY2N1cmVkID0g
dHJ1ZTsKLSAgICAgICAgICAgICAgICBRUGl4bWFwIGVwID0gcGl4bWFwKCk7Ci0gICAgICAgICAg
ICAgICAgZG9fbm90aWZ5IChlcCwgZXAucmVjdCgpKTsKLSAgICAgICAgICAgICAgICBDYWNoZTo6
cmVtb3ZlQ2FjaGVFbnRyeSAodGhpcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNl
Ci0gICAgICAgICAgICAgICAgZG9fbm90aWZ5KCpwLCBwLT5yZWN0KCkpOwotCi0gICAgICAgICAg
ICBRU2l6ZSBzID0gcGl4bWFwX3NpemUoKTsKLSAgICAgICAgICAgIHNldFNpemUocy53aWR0aCgp
ICogcy5oZWlnaHQoKSAqIDIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChlb2YpIHsKLSAgICAg
ICAgICAgIG1fbG9hZGluZyA9IGZhbHNlOwotICAgICAgICAgICAgY2hlY2tOb3RpZnkoKTsKLSAg
ICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBDYWNoZWRJbWFnZTo6ZXJyb3IoIGludCAvKmVyciov
LCBjb25zdCBjaGFyICovKnRleHQqLyApCi17Ci0jaWZkZWYgQ0FDSEVfREVCVUcKLSAgICBrZERl
YnVnKDYwNjApIDw8ICJDYWhjZWRJbWFnZTo6ZXJyb3IiIDw8IGVuZGw7Ci0jZW5kaWYKLQotICAg
IGNsZWFyKCk7Ci0gICAgZXJyb3JPY2N1cmVkID0gdHJ1ZTsKLSAgICBkb19ub3RpZnkocGl4bWFw
KCksIFFSZWN0KDAsIDAsIDE2LCAxNikpOwotICAgIG1fbG9hZGluZyA9IGZhbHNlOwotICAgIGNo
ZWNrTm90aWZ5KCk7Ci19Ci0KLXZvaWQgQ2FjaGVkSW1hZ2U6OmNoZWNrTm90aWZ5KCkKLXsKLSAg
ICBpZihtX2xvYWRpbmcpIHJldHVybjsKLQotICAgIENhY2hlZE9iamVjdENsaWVudFdhbGtlciB3
KG1fY2xpZW50cyk7Ci0gICAgd2hpbGUgKENhY2hlZE9iamVjdENsaWVudCAqYyA9IHcubmV4dCgp
KSB7Ci0gICAgICAgIGMtPm5vdGlmeUZpbmlzaGVkKHRoaXMpOwotICAgIH0KLX0KLQotLy8gLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jaWZkZWYgS0hUTUxfWFNMVAotCi1D
YWNoZWRYU0xTdHlsZVNoZWV0OjpDYWNoZWRYU0xTdHlsZVNoZWV0KERvY0xvYWRlciogZGwsIGNv
bnN0IERPTVN0cmluZyAmdXJsLCBLSU86OkNhY2hlQ29udHJvbCBfY2FjaGVQb2xpY3ksIHRpbWVf
dCBfZXhwaXJlRGF0ZSkKLTogQ2FjaGVkT2JqZWN0KHVybCwgWFNMU3R5bGVTaGVldCwgX2NhY2hl
UG9saWN5LCBfZXhwaXJlRGF0ZSkKLXsKLSAgICAvLyBJdCdzIFhNTCB3ZSB3YW50LgotICAgIC8v
IEZJWE1FOiBUaGlzIHNob3VsZCBhY2NlcHQgbW9yZSBnZW5lcmFsIHhtbCBmb3JtYXRzICovKit4
bWwsIGltYWdlL3N2Zyt4bWwgZm9yIGV4YW1wbGUuCi0gICAgc2V0QWNjZXB0KCJ0ZXh0L3htbCwg
YXBwbGljYXRpb24veG1sLCBhcHBsaWNhdGlvbi94aHRtbCt4bWwsIHRleHQveHNsLCBhcHBsaWNh
dGlvbi9yc3MreG1sLCBhcHBsaWNhdGlvbi9hdG9tK3htbCIpOwotICAgIAotICAgIC8vIGxvYWQg
dGhlIGZpbGUKLSAgICBDYWNoZTo6bG9hZGVyKCktPmxvYWQoZGwsIHRoaXMsIGZhbHNlKTsKLSAg
ICBtX2xvYWRpbmcgPSB0cnVlOwotICAgIG1fZGVjb2RlciA9IG5ldyBEZWNvZGVyOwotfQotCi12
b2lkIENhY2hlZFhTTFN0eWxlU2hlZXQ6OnJlZihDYWNoZWRPYmplY3RDbGllbnQgKmMpCi17Ci0g
ICAgQ2FjaGVkT2JqZWN0OjpyZWYoYyk7Ci0gICAgCi0gICAgaWYgKCFtX2xvYWRpbmcpCi0gICAg
ICAgIGMtPnNldFN0eWxlU2hlZXQobV91cmwsIG1fc2hlZXQpOwotfQotCi12b2lkIENhY2hlZFhT
TFN0eWxlU2hlZXQ6OmRlcmVmKENhY2hlZE9iamVjdENsaWVudCAqYykKLXsKLSAgICBDYWNoZTo6
Zmx1c2goKTsKLSAgICBDYWNoZWRPYmplY3Q6OmRlcmVmKGMpOwotICAgIGlmIChjYW5EZWxldGUo
KSAmJiBtX2ZyZWUpCi0gICAgICAgIGRlbGV0ZSB0aGlzOwotfQotCi12b2lkIENhY2hlZFhTTFN0
eWxlU2hlZXQ6OnNldENoYXJzZXQoIGNvbnN0IFFTdHJpbmcgJmNocyApCi17Ci0gICAgaWYgKCFj
aHMuaXNFbXB0eSgpKQotICAgICAgICBtX2RlY29kZXItPnNldEVuY29kaW5nKGNocy5sYXRpbjEo
KSwgRGVjb2Rlcjo6RW5jb2RpbmdGcm9tSFRUUEhlYWRlcik7Ci19Ci0KLXZvaWQgQ2FjaGVkWFNM
U3R5bGVTaGVldDo6ZGF0YShRQnVmZmVyICZidWZmZXIsIGJvb2wgZW9mKQotewotICAgIGlmKCFl
b2YpIHJldHVybjsKLSAgICBidWZmZXIuY2xvc2UoKTsKLSAgICBzZXRTaXplKGJ1ZmZlci5idWZm
ZXIoKS5zaXplKCkpOwotICAgIFFTdHJpbmcgZGF0YSA9IG1fZGVjb2Rlci0+ZGVjb2RlKGJ1ZmZl
ci5idWZmZXIoKS5kYXRhKCksIHNpemUoKSk7Ci0gICAgbV9zaGVldCA9IERPTVN0cmluZyhkYXRh
KTsKLSAgICBtX2xvYWRpbmcgPSBmYWxzZTsKLSAgICAKLSAgICBjaGVja05vdGlmeSgpOwotfQot
Ci12b2lkIENhY2hlZFhTTFN0eWxlU2hlZXQ6OmNoZWNrTm90aWZ5KCkKLXsKLSAgICBpZiAobV9s
b2FkaW5nKQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgQ2FjaGVkT2JqZWN0Q2xpZW50V2Fs
a2VyIHcobV9jbGllbnRzKTsKLSAgICB3aGlsZSAoQ2FjaGVkT2JqZWN0Q2xpZW50ICpjID0gdy5u
ZXh0KCkpCi0gICAgICAgIGMtPnNldFN0eWxlU2hlZXQobV91cmwsIG1fc2hlZXQpOwotfQotCi0K
LXZvaWQgQ2FjaGVkWFNMU3R5bGVTaGVldDo6ZXJyb3IoIGludCAvKmVyciovLCBjb25zdCBjaGFy
ICovKnRleHQqLyApCi17Ci0gICAgbV9sb2FkaW5nID0gZmFsc2U7Ci0gICAgY2hlY2tOb3RpZnko
KTsKLX0KLQotI2VuZGlmCi0KLSNpZm5kZWYgS0hUTUxfTk9fWEJMCi1DYWNoZWRYQkxEb2N1bWVu
dDo6Q2FjaGVkWEJMRG9jdW1lbnQoRG9jTG9hZGVyKiBkbCwgY29uc3QgRE9NU3RyaW5nICZ1cmws
IEtJTzo6Q2FjaGVDb250cm9sIF9jYWNoZVBvbGljeSwgdGltZV90IF9leHBpcmVEYXRlKQotOiBD
YWNoZWRPYmplY3QodXJsLCBYQkwsIF9jYWNoZVBvbGljeSwgX2V4cGlyZURhdGUpLCBtX2RvY3Vt
ZW50KDApCi17Ci0gICAgLy8gSXQncyBYTUwgd2Ugd2FudC4KLSAgICBzZXRBY2NlcHQoInRleHQv
eG1sLCBhcHBsaWNhdGlvbi94bWwsIGFwcGxpY2F0aW9uL3hodG1sK3htbCwgdGV4dC94c2wsIGFw
cGxpY2F0aW9uL3Jzcyt4bWwsIGFwcGxpY2F0aW9uL2F0b20reG1sIik7Ci0gICAgCi0gICAgLy8g
TG9hZCB0aGUgZmlsZQotICAgIENhY2hlOjpsb2FkZXIoKS0+bG9hZChkbCwgdGhpcywgZmFsc2Up
OwotICAgIG1fbG9hZGluZyA9IHRydWU7Ci0gICAgbV9kZWNvZGVyID0gbmV3IERlY29kZXI7Ci19
Ci0KLUNhY2hlZFhCTERvY3VtZW50Ojp+Q2FjaGVkWEJMRG9jdW1lbnQoKQotewotICAgIGlmICht
X2RvY3VtZW50KQotICAgICAgICBtX2RvY3VtZW50LT5kZXJlZigpOwotfQotCi12b2lkIENhY2hl
ZFhCTERvY3VtZW50OjpyZWYoQ2FjaGVkT2JqZWN0Q2xpZW50ICpjKQotewotICAgIENhY2hlZE9i
amVjdDo6cmVmKGMpOwotICAgIGlmICghbV9sb2FkaW5nKQotICAgICAgICBjLT5zZXRYQkxEb2N1
bWVudChtX3VybCwgbV9kb2N1bWVudCk7Ci19Ci0KLXZvaWQgQ2FjaGVkWEJMRG9jdW1lbnQ6OmRl
cmVmKENhY2hlZE9iamVjdENsaWVudCAqYykKLXsKLSAgICBDYWNoZTo6Zmx1c2goKTsKLSAgICBD
YWNoZWRPYmplY3Q6OmRlcmVmKGMpOwotICAgIGlmIChjYW5EZWxldGUoKSAmJiBtX2ZyZWUpCi0g
ICAgICAgIGRlbGV0ZSB0aGlzOwotfQotCi12b2lkIENhY2hlZFhCTERvY3VtZW50OjpzZXRDaGFy
c2V0KCBjb25zdCBRU3RyaW5nICZjaHMgKQotewotICAgIGlmICghY2hzLmlzRW1wdHkoKSkKLSAg
ICAgICAgbV9kZWNvZGVyLT5zZXRFbmNvZGluZyhjaHMubGF0aW4xKCksIERlY29kZXI6OkVuY29k
aW5nRnJvbUhUVFBIZWFkZXIpOwotfQotCi12b2lkIENhY2hlZFhCTERvY3VtZW50OjpkYXRhKCBR
QnVmZmVyICZidWZmZXIsIGJvb2wgZW9mICkKLXsKLSAgICBpZiAoIWVvZikgcmV0dXJuOwotICAg
IAotICAgIGFzc2VydCghbV9kb2N1bWVudCk7Ci0gICAgCi0gICAgbV9kb2N1bWVudCA9ICBuZXcg
WEJMOjpYQkxEb2N1bWVudEltcGwoKTsKLSAgICBtX2RvY3VtZW50LT5yZWYoKTsKLSAgICBtX2Rv
Y3VtZW50LT5vcGVuKCk7Ci0gICAgCi0gICAgUVN0cmluZyBkYXRhID0gbV9kZWNvZGVyLT5kZWNv
ZGUoYnVmZmVyLmJ1ZmZlcigpLmRhdGEoKSwgYnVmZmVyLmJ1ZmZlcigpLnNpemUoKSk7Ci0gICAg
bV9kb2N1bWVudC0+d3JpdGUoZGF0YSk7Ci0gICAgc2V0U2l6ZShidWZmZXIuYnVmZmVyKCkuc2l6
ZSgpKTsKLSAgICBidWZmZXIuY2xvc2UoKTsKLSAgICAKLSAgICBtX2RvY3VtZW50LT5maW5pc2hQ
YXJzaW5nKCk7Ci0gICAgbV9kb2N1bWVudC0+Y2xvc2UoKTsKLSAgICBtX2xvYWRpbmcgPSBmYWxz
ZTsKLSAgICBjaGVja05vdGlmeSgpOwotfQotCi12b2lkIENhY2hlZFhCTERvY3VtZW50OjpjaGVj
a05vdGlmeSgpCi17Ci0gICAgaWYobV9sb2FkaW5nKQotICAgICAgICByZXR1cm47Ci0gICAgCi0g
ICAgQ2FjaGVkT2JqZWN0Q2xpZW50V2Fsa2VyIHcobV9jbGllbnRzKTsKLSAgICB3aGlsZSAoQ2Fj
aGVkT2JqZWN0Q2xpZW50ICpjID0gdy5uZXh0KCkpCi0gICAgICAgIGMtPnNldFhCTERvY3VtZW50
KG1fdXJsLCBtX2RvY3VtZW50KTsKLX0KLQotCi12b2lkIENhY2hlZFhCTERvY3VtZW50OjplcnJv
ciggaW50IC8qZXJyKi8sIGNvbnN0IGNoYXIgKi8qdGV4dCovICkKLXsKLSAgICBtX2xvYWRpbmcg
PSBmYWxzZTsKLSAgICBjaGVja05vdGlmeSgpOwotfQotI2VuZGlmCi0KLS8vIC0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1SZXF1ZXN0OjpSZXF1ZXN0KERvY0xvYWRlciogZGws
IENhY2hlZE9iamVjdCAqX29iamVjdCwgYm9vbCBfaW5jcmVtZW50YWwpCi17Ci0gICAgb2JqZWN0
ID0gX29iamVjdDsKLSAgICBvYmplY3QtPnNldFJlcXVlc3QodGhpcyk7Ci0gICAgaW5jcmVtZW50
YWwgPSBfaW5jcmVtZW50YWw7Ci0gICAgbV9kb2NMb2FkZXIgPSBkbDsKLSAgICBtdWx0aXBhcnQg
PSBmYWxzZTsKLX0KLQotUmVxdWVzdDo6flJlcXVlc3QoKQotewotICAgIG9iamVjdC0+c2V0UmVx
dWVzdCgwKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLURv
Y0xvYWRlcjo6RG9jTG9hZGVyKEtIVE1MUGFydCogcGFydCwgRG9jdW1lbnRJbXBsKiBkb2MpCi17
Ci0gICAgbV9jYWNoZVBvbGljeSA9IEtJTzo6Q0NfVmVyaWZ5OwotICAgIG1fZXhwaXJlRGF0ZSA9
IDA7Ci0gICAgbV9iYXV0b2xvYWRJbWFnZXMgPSB0cnVlOwotICAgIG1fc2hvd0FuaW1hdGlvbnMg
PSBLSFRNTFNldHRpbmdzOjpLQW5pbWF0aW9uRW5hYmxlZDsKLSAgICBtX3BhcnQgPSBwYXJ0Owot
ICAgIG1fZG9jID0gZG9jOwotICAgIG1fbG9hZEluUHJvZ3Jlc3MgPSBmYWxzZTsKLQotICAgIENh
Y2hlOjppbml0KCk7Ci0gICAgQ2FjaGU6OmRvY2xvYWRlci0+YXBwZW5kKCB0aGlzICk7Ci19Ci0K
LURvY0xvYWRlcjo6fkRvY0xvYWRlcigpCi17Ci0gICAgQ2FjaGU6OmRvY2xvYWRlci0+cmVtb3Zl
KCB0aGlzICk7Ci19Ci0KLXZvaWQgRG9jTG9hZGVyOjpzZXRFeHBpcmVEYXRlKHRpbWVfdCBfZXhw
aXJlRGF0ZSkKLXsKLSAgICBtX2V4cGlyZURhdGUgPSBfZXhwaXJlRGF0ZTsKLX0KLQotYm9vbCBE
b2NMb2FkZXI6Om5lZWRSZWxvYWQoY29uc3QgS1VSTCAmZnVsbFVSTCkKLXsKLSAgICBib29sIHJl
bG9hZCA9IGZhbHNlOwotICAgIGlmIChtX2NhY2hlUG9saWN5ID09IEtJTzo6Q0NfVmVyaWZ5KQot
ICAgIHsKLSAgICAgICBpZiAoIW1fcmVsb2FkZWRVUkxzLmNvbnRhaW5zKGZ1bGxVUkwudXJsKCkp
KQotICAgICAgIHsKLSAgICAgICAgICBDYWNoZWRPYmplY3QgKmV4aXN0aW5nID0gQ2FjaGU6OmNh
Y2hlLT5maW5kKGZ1bGxVUkwudXJsKCkpOwotICAgICAgICAgIGlmIChleGlzdGluZyAmJiBleGlz
dGluZy0+aXNFeHBpcmVkKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgIENhY2hlOjpyZW1v
dmVDYWNoZUVudHJ5KGV4aXN0aW5nKTsKLSAgICAgICAgICAgICBtX3JlbG9hZGVkVVJMcy5hcHBl
bmQoZnVsbFVSTC51cmwoKSk7Ci0gICAgICAgICAgICAgcmVsb2FkID0gdHJ1ZTsKLSAgICAgICAg
ICB9Ci0gICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmICgobV9jYWNoZVBvbGljeSA9PSBLSU86
OkNDX1JlbG9hZCkgfHwgKG1fY2FjaGVQb2xpY3kgPT0gS0lPOjpDQ19SZWZyZXNoKSkKLSAgICB7
Ci0gICAgICAgaWYgKCFtX3JlbG9hZGVkVVJMcy5jb250YWlucyhmdWxsVVJMLnVybCgpKSkKLSAg
ICAgICB7Ci0gICAgICAgICAgQ2FjaGVkT2JqZWN0ICpleGlzdGluZyA9IENhY2hlOjpjYWNoZS0+
ZmluZChmdWxsVVJMLnVybCgpKTsKLSAgICAgICAgICBpZiAoZXhpc3RpbmcpCi0gICAgICAgICAg
ewotICAgICAgICAgICAgIENhY2hlOjpyZW1vdmVDYWNoZUVudHJ5KGV4aXN0aW5nKTsKLSAgICAg
ICAgICB9Ci0gICAgICAgICAgbV9yZWxvYWRlZFVSTHMuYXBwZW5kKGZ1bGxVUkwudXJsKCkpOwot
ICAgICAgICAgIHJlbG9hZCA9IHRydWU7Ci0gICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVs
b2FkOwotfQotCi1DYWNoZWRJbWFnZSAqRG9jTG9hZGVyOjpyZXF1ZXN0SW1hZ2UoIGNvbnN0IERP
TTo6RE9NU3RyaW5nICZ1cmwpCi17Ci0gICAgS1VSTCBmdWxsVVJMID0gbV9kb2MtPmNvbXBsZXRl
VVJMKHVybC5xc3RyaW5nKCkpOwotICAgIGlmICggbV9wYXJ0ICYmIG1fcGFydC0+b25seUxvY2Fs
UmVmZXJlbmNlcygpICYmIGZ1bGxVUkwucHJvdG9jb2woKSAhPSAiZmlsZSIpIHJldHVybiAwOwot
Ci0gICAgaWYgKEtXUUNoZWNrSWZSZWxvYWRpbmcodGhpcykpIHsKLSAgICAgICAgc2V0Q2FjaGVQ
b2xpY3koS0lPOjpDQ19SZWxvYWQpOwotICAgIH0KLQotICAgIGJvb2wgcmVsb2FkID0gbmVlZFJl
bG9hZChmdWxsVVJMKTsKLQotICAgIENhY2hlZEltYWdlICpjYWNoZWRPYmplY3QgPSBDYWNoZTo6
cmVxdWVzdEltYWdlKHRoaXMsIGZ1bGxVUkwsIHJlbG9hZCwgbV9leHBpcmVEYXRlKTsKLSAgICBL
V1FDaGVja0NhY2hlT2JqZWN0U3RhdHVzKHRoaXMsIGNhY2hlZE9iamVjdCk7Ci0gICAgcmV0dXJu
IGNhY2hlZE9iamVjdDsKLX0KLQotQ2FjaGVkQ1NTU3R5bGVTaGVldCAqRG9jTG9hZGVyOjpyZXF1
ZXN0U3R5bGVTaGVldCggY29uc3QgRE9NOjpET01TdHJpbmcgJnVybCwgY29uc3QgUVN0cmluZyYg
Y2hhcnNldCkKLXsKLSAgICBLVVJMIGZ1bGxVUkwgPSBtX2RvYy0+Y29tcGxldGVVUkwodXJsLnFz
dHJpbmcoKSk7Ci0gICAgaWYgKCBtX3BhcnQgJiYgbV9wYXJ0LT5vbmx5TG9jYWxSZWZlcmVuY2Vz
KCkgJiYgZnVsbFVSTC5wcm90b2NvbCgpICE9ICJmaWxlIikgcmV0dXJuIDA7Ci0KLSAgICBpZiAo
S1dRQ2hlY2tJZlJlbG9hZGluZyh0aGlzKSkgewotICAgICAgICBzZXRDYWNoZVBvbGljeShLSU86
OkNDX1JlbG9hZCk7Ci0gICAgfQotCi0gICAgYm9vbCByZWxvYWQgPSBuZWVkUmVsb2FkKGZ1bGxV
UkwpOwotCi0gICAgQ2FjaGVkQ1NTU3R5bGVTaGVldCAqY2FjaGVkT2JqZWN0ID0gQ2FjaGU6OnJl
cXVlc3RTdHlsZVNoZWV0KHRoaXMsIHVybCwgcmVsb2FkLCBtX2V4cGlyZURhdGUsIGNoYXJzZXQp
OwotICAgIEtXUUNoZWNrQ2FjaGVPYmplY3RTdGF0dXModGhpcywgY2FjaGVkT2JqZWN0KTsKLSAg
ICByZXR1cm4gY2FjaGVkT2JqZWN0OwotfQotCi1DYWNoZWRTY3JpcHQgKkRvY0xvYWRlcjo6cmVx
dWVzdFNjcmlwdCggY29uc3QgRE9NOjpET01TdHJpbmcgJnVybCwgY29uc3QgUVN0cmluZyYgY2hh
cnNldCkKLXsKLSAgICBLVVJMIGZ1bGxVUkwgPSBtX2RvYy0+Y29tcGxldGVVUkwodXJsLnFzdHJp
bmcoKSk7Ci0gICAgaWYgKCBtX3BhcnQgJiYgbV9wYXJ0LT5vbmx5TG9jYWxSZWZlcmVuY2VzKCkg
JiYgZnVsbFVSTC5wcm90b2NvbCgpICE9ICJmaWxlIikgcmV0dXJuIDA7Ci0KLSAgICBpZiAoS1dR
Q2hlY2tJZlJlbG9hZGluZyh0aGlzKSkgewotICAgICAgICBzZXRDYWNoZVBvbGljeShLSU86OkND
X1JlbG9hZCk7Ci0gICAgfQotCi0gICAgYm9vbCByZWxvYWQgPSBuZWVkUmVsb2FkKGZ1bGxVUkwp
OwotCi0gICAgQ2FjaGVkU2NyaXB0ICpjYWNoZWRPYmplY3QgPSBDYWNoZTo6cmVxdWVzdFNjcmlw
dCh0aGlzLCB1cmwsIHJlbG9hZCwgbV9leHBpcmVEYXRlLCBjaGFyc2V0KTsKLSAgICBLV1FDaGVj
a0NhY2hlT2JqZWN0U3RhdHVzKHRoaXMsIGNhY2hlZE9iamVjdCk7Ci0gICAgcmV0dXJuIGNhY2hl
ZE9iamVjdDsKLX0KLQotI2lmZGVmIEtIVE1MX1hTTFQKLUNhY2hlZFhTTFN0eWxlU2hlZXQqIERv
Y0xvYWRlcjo6cmVxdWVzdFhTTFN0eWxlU2hlZXQoY29uc3QgRE9NOjpET01TdHJpbmcgJnVybCkK
LXsKLSAgICBLVVJMIGZ1bGxVUkwgPSBtX2RvYy0+Y29tcGxldGVVUkwodXJsLnFzdHJpbmcoKSk7
Ci0gICAgCi0gICAgaWYgKG1fcGFydCAmJiBtX3BhcnQtPm9ubHlMb2NhbFJlZmVyZW5jZXMoKSAm
JiBmdWxsVVJMLnByb3RvY29sKCkgIT0gImZpbGUiKSByZXR1cm4gMDsKLSAgICAKLSAgICBpZiAo
S1dRQ2hlY2tJZlJlbG9hZGluZyh0aGlzKSkKLSAgICAgICAgc2V0Q2FjaGVQb2xpY3koS0lPOjpD
Q19SZWxvYWQpOwotICAgIAotICAgIGJvb2wgcmVsb2FkID0gbmVlZFJlbG9hZChmdWxsVVJMKTsK
LSAgICAKLSAgICBDYWNoZWRYU0xTdHlsZVNoZWV0ICpjYWNoZWRPYmplY3QgPSBDYWNoZTo6cmVx
dWVzdFhTTFN0eWxlU2hlZXQodGhpcywgdXJsLCByZWxvYWQsIG1fZXhwaXJlRGF0ZSk7Ci0gICAg
S1dRQ2hlY2tDYWNoZU9iamVjdFN0YXR1cyh0aGlzLCBjYWNoZWRPYmplY3QpOwotICAgIHJldHVy
biBjYWNoZWRPYmplY3Q7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBLSFRNTF9OT19YQkwKLUNhY2hl
ZFhCTERvY3VtZW50KiBEb2NMb2FkZXI6OnJlcXVlc3RYQkxEb2N1bWVudChjb25zdCBET006OkRP
TVN0cmluZyAmdXJsKQotewotICAgIEtVUkwgZnVsbFVSTCA9IG1fZG9jLT5jb21wbGV0ZVVSTCh1
cmwucXN0cmluZygpKTsKLSAgICAKLSAgICAvLyBGSVhNRTogSXMgdGhpcyByaWdodCBmb3IgWEJM
PwotICAgIGlmIChtX3BhcnQgJiYgbV9wYXJ0LT5vbmx5TG9jYWxSZWZlcmVuY2VzKCkgJiYgZnVs
bFVSTC5wcm90b2NvbCgpICE9ICJmaWxlIikgcmV0dXJuIDA7Ci0gICAgCi0gICAgaWYgKEtXUUNo
ZWNrSWZSZWxvYWRpbmcodGhpcykpIHsKLSAgICAgICAgc2V0Q2FjaGVQb2xpY3koS0lPOjpDQ19S
ZWxvYWQpOwotICAgIH0KLSAgICAKLSAgICBib29sIHJlbG9hZCA9IG5lZWRSZWxvYWQoZnVsbFVS
TCk7Ci0gICAgCi0gICAgQ2FjaGVkWEJMRG9jdW1lbnQgKmNhY2hlZE9iamVjdCA9IENhY2hlOjpy
ZXF1ZXN0WEJMRG9jdW1lbnQodGhpcywgdXJsLCByZWxvYWQsIG1fZXhwaXJlRGF0ZSk7Ci0gICAg
S1dRQ2hlY2tDYWNoZU9iamVjdFN0YXR1cyh0aGlzLCBjYWNoZWRPYmplY3QpOwotICAgIHJldHVy
biBjYWNoZWRPYmplY3Q7Ci19Ci0jZW5kaWYKLQotdm9pZCBEb2NMb2FkZXI6OnNldEF1dG9sb2Fk
SW1hZ2VzKCBib29sIGVuYWJsZSApCi17Ci0gICAgaWYgKCBlbmFibGUgPT0gbV9iYXV0b2xvYWRJ
bWFnZXMgKQotICAgICAgICByZXR1cm47Ci0KLSAgICBtX2JhdXRvbG9hZEltYWdlcyA9IGVuYWJs
ZTsKLQotICAgIGlmICggIW1fYmF1dG9sb2FkSW1hZ2VzICkgcmV0dXJuOworI2luY2x1ZGUgImxv
YWRlci5oIgorI2luY2x1ZGUgIkNhY2hlLmgiCisjaW5jbHVkZSAiRG9jTG9hZGVyLmgiCisjaW5j
bHVkZSAiQ2FjaGVkT2JqZWN0LmgiCisjaW5jbHVkZSAiQ2FjaGVkSW1hZ2UuaCIKKyNpbmNsdWRl
ICJDYWNoZWRJbWFnZUNhbGxiYWNrLmgiCiAKLSAgICBmb3IgKCBjb25zdCBDYWNoZWRPYmplY3Qq
IGNvPW1fZG9jT2JqZWN0cy5maXJzdCgpOyBjbzsgY289bV9kb2NPYmplY3RzLm5leHQoKSApCi0g
ICAgICAgIGlmICggY28tPnR5cGUoKSA9PSBDYWNoZWRPYmplY3Q6OkltYWdlICkKLSAgICAgICAg
ewotICAgICAgICAgICAgQ2FjaGVkSW1hZ2UgKmltZyA9IGNvbnN0X2Nhc3Q8Q2FjaGVkSW1hZ2Uq
Piggc3RhdGljX2Nhc3Q8Y29uc3QgQ2FjaGVkSW1hZ2UgKj4oIGNvICkgKTsKKyNpbmNsdWRlIDxr
aW8vam9iLmg+CisjaW5jbHVkZSA8a2lvL2pvYmNsYXNzZXMuaD4KIAotICAgICAgICAgICAgQ2Fj
aGVkT2JqZWN0OjpTdGF0dXMgc3RhdHVzID0gaW1nLT5zdGF0dXMoKTsKLSAgICAgICAgICAgIGlm
ICggc3RhdHVzICE9IENhY2hlZE9iamVjdDo6VW5rbm93biApCi0gICAgICAgICAgICAgICAgY29u
dGludWU7CisjaW5jbHVkZSA8a3htbGNvcmUvQXNzZXJ0aW9ucy5oPgorI2luY2x1ZGUgIktXUUxv
YWRlci5oIgorI2luY2x1ZGUgImh0bWxfZG9jdW1lbnRpbXBsLmgiCisjaW5jbHVkZSAia2h0bWxf
cGFydC5oIgogCi0gICAgICAgICAgICBDYWNoZTo6bG9hZGVyKCktPmxvYWQodGhpcywgaW1nLCB0
cnVlKTsKLSAgICAgICAgfQotfQordXNpbmcgbmFtZXNwYWNlIERPTTsKIAotdm9pZCBEb2NMb2Fk
ZXI6OnNldENhY2hlUG9saWN5KCBLSU86OkNhY2hlQ29udHJvbCBjYWNoZVBvbGljeSApCitzdGF0
aWMgYm9vbCBjcm9zc0RvbWFpbihjb25zdCBRU3RyaW5nICZhLCBjb25zdCBRU3RyaW5nICZiKQog
ewotICAgIG1fY2FjaGVQb2xpY3kgPSBjYWNoZVBvbGljeTsKLX0KKyAgICBpZiAoYSA9PSBiKSBy
ZXR1cm4gZmFsc2U7CiAKLXZvaWQgRG9jTG9hZGVyOjpzZXRTaG93QW5pbWF0aW9ucyggS0hUTUxT
ZXR0aW5nczo6S0FuaW1hdGlvbkFkdmljZSBzaG93QW5pbWF0aW9ucyApCi17Ci0gICAgaWYgKCBz
aG93QW5pbWF0aW9ucyA9PSBtX3Nob3dBbmltYXRpb25zICkgcmV0dXJuOwotICAgIG1fc2hvd0Fu
aW1hdGlvbnMgPSBzaG93QW5pbWF0aW9uczsKKyAgICBRU3RyaW5nTGlzdCBsMSA9IFFTdHJpbmdM
aXN0OjpzcGxpdCgnLicsIGEpOworICAgIFFTdHJpbmdMaXN0IGwyID0gUVN0cmluZ0xpc3Q6OnNw
bGl0KCcuJywgYik7CiAKLSAgICBjb25zdCBDYWNoZWRPYmplY3QqIGNvOwotICAgIGZvciAoIGNv
PW1fZG9jT2JqZWN0cy5maXJzdCgpOyBjbzsgY289bV9kb2NPYmplY3RzLm5leHQoKSApCi0gICAg
ICAgIGlmICggY28tPnR5cGUoKSA9PSBDYWNoZWRPYmplY3Q6OkltYWdlICkKLSAgICAgICAgewot
ICAgICAgICAgICAgQ2FjaGVkSW1hZ2UgKmltZyA9IGNvbnN0X2Nhc3Q8Q2FjaGVkSW1hZ2UqPigg
c3RhdGljX2Nhc3Q8Y29uc3QgQ2FjaGVkSW1hZ2UgKj4oIGNvICkgKTsKKyAgICB3aGlsZShsMS5j
b3VudCgpID4gbDIuY291bnQoKSkKKyAgICAgICAgbDEucG9wX2Zyb250KCk7CiAKLSAgICAgICAg
ICAgIGltZy0+c2V0U2hvd0FuaW1hdGlvbnMoIHNob3dBbmltYXRpb25zICk7Ci0gICAgICAgIH0K
LX0KKyAgICB3aGlsZShsMi5jb3VudCgpID4gbDEuY291bnQoKSkKKyAgICAgICAgbDIucG9wX2Zy
b250KCk7CiAKLXZvaWQgRG9jTG9hZGVyOjpyZW1vdmVDYWNoZWRPYmplY3QoIENhY2hlZE9iamVj
dCogbyApIGNvbnN0Ci17Ci0gICAgbV9kb2NPYmplY3RzLnJlbW92ZVJlZiggbyApOwotfQorICAg
IHdoaWxlKGwyLmNvdW50KCkgPj0gMikKKyAgICB7CisgICAgICAgIGlmIChsMSA9PSBsMikKKyAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOwogCi12b2lkIERvY0xvYWRlcjo6c2V0TG9hZEluUHJvZ3Jl
c3MoYm9vbCBsb2FkKQotewotICAgIG1fbG9hZEluUHJvZ3Jlc3MgPSBsb2FkOworICAgICAgICBs
MS5wb3BfZnJvbnQoKTsKKyAgICAgICAgbDIucG9wX2Zyb250KCk7CisgICAgfQorICAgIHJldHVy
biB0cnVlOwogfQogCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK25hbWVz
cGFjZSBraHRtbCB7CiAKIExvYWRlcjo6TG9hZGVyKCkgOiBRT2JqZWN0KCkKIHsKQEAgLTExMjgs
MTAgKzIxNiw4IEBAIHZvaWQgTG9hZGVyOjpzbG90UmVjZWl2ZWRSZXNwb25zZShLSU86OkoKIHZv
aWQgTG9hZGVyOjpzbG90RGF0YSggS0lPOjpKb2Iqam9iLCBjb25zdCBjaGFyICpkYXRhLCBpbnQg
c2l6ZSApCiB7CiAgICAgUmVxdWVzdCAqciA9IG1fcmVxdWVzdHNMb2FkaW5nW2pvYl07Ci0gICAg
aWYoIXIpIHsKLSAgICAgICAga2REZWJ1ZyggNjA2MCApIDw8ICJnb3QgZGF0YSBmb3IgdW5rbm93
biByZXF1ZXN0ISIgPDwgZW5kbDsKKyAgICBpZiAoIXIpCiAgICAgICAgIHJldHVybjsKLSAgICB9
CiAKICAgICBpZiAoICFyLT5tX2J1ZmZlci5pc09wZW4oKSApCiAgICAgICAgIHItPm1fYnVmZmVy
Lm9wZW4oIElPX1dyaXRlT25seSApOwpAQCAtMTIzMCw2NTQgKzMxNiw5IEBAIEtJTzo6Sm9iICpM
b2FkZXI6OmpvYkZvclJlcXVlc3QoIGNvbnN0IEQKICAgICByZXR1cm4gMDsKIH0KIAotCiBib29s
IExvYWRlcjo6aXNLSFRNTExvYWRlcigpIGNvbnN0CiB7CiAgICAgcmV0dXJuIHRydWU7CiB9CiAK
LQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLUxSVUxpc3Q6OkxSVUxpc3QoKQotOm1faGVh
ZCgwKSwgbV90YWlsKDApIAote30KLQotTFJVTGlzdDo6fkxSVUxpc3QoKQote30KLQotUURpY3Q8
Q2FjaGVkT2JqZWN0PiAqQ2FjaGU6OmNhY2hlID0gMDsKLVFQdHJMaXN0PERvY0xvYWRlcj4qIENh
Y2hlOjpkb2Nsb2FkZXIgPSAwOwotTG9hZGVyICpDYWNoZTo6bV9sb2FkZXIgPSAwOwotCi1pbnQg
Q2FjaGU6Om1heFNpemUgPSBERUZDQUNIRVNJWkU7Ci1pbnQgQ2FjaGU6Om1heENhY2hlYWJsZSA9
IE1BWENBQ0hFQUJMRTsKLWludCBDYWNoZTo6Zmx1c2hDb3VudCA9IDA7Ci0KLVFQaXhtYXAgKkNh
Y2hlOjpudWxsUGl4bWFwID0gMDsKLVFQaXhtYXAgKkNhY2hlOjpicm9rZW5QaXhtYXAgPSAwOwot
Ci1DYWNoZWRPYmplY3QgKkNhY2hlOjptX2hlYWRPZlVuY2FjaGVhYmxlTGlzdCA9IDA7Ci1pbnQg
Q2FjaGU6Om1fdG90YWxTaXplT2ZMUlVMaXN0cyA9IDA7Ci1pbnQgQ2FjaGU6Om1fY291bnRPZkxS
VUFuZFVuY2FjaGVhYmxlTGlzdHM7Ci1MUlVMaXN0ICpDYWNoZTo6bV9MUlVMaXN0cyA9IDA7Ci0K
LXZvaWQgQ2FjaGU6OmluaXQoKQotewotICAgIGlmICggIWNhY2hlICkKLSAgICAgICAgY2FjaGUg
PSBuZXcgUURpY3Q8Q2FjaGVkT2JqZWN0Pig0MDEsIHRydWUpOwotCi0gICAgaWYgKCAhZG9jbG9h
ZGVyICkKLSAgICAgICAgZG9jbG9hZGVyID0gbmV3IFFQdHJMaXN0PERvY0xvYWRlcj47Ci0KLSAg
ICBpZiAoICFudWxsUGl4bWFwICkKLSAgICAgICAgbnVsbFBpeG1hcCA9IG5ldyBRUGl4bWFwOwot
Ci0gICAgaWYgKCAhYnJva2VuUGl4bWFwICkKLSAgICAgICAgYnJva2VuUGl4bWFwID0gS1dRTG9h
ZFBpeG1hcCgibWlzc2luZ19pbWFnZSIpOwotCi0gICAgaWYgKCAhbV9sb2FkZXIgKQotICAgICAg
ICBtX2xvYWRlciA9IG5ldyBMb2FkZXIoKTsKLX0KLQotdm9pZCBDYWNoZTo6Y2xlYXIoKQotewot
ICAgIGlmICghY2FjaGUpCi0gICAgICAgIHJldHVybjsKLQotICAgIGNhY2hlLT5zZXRBdXRvRGVs
ZXRlKCB0cnVlICk7Ci0gICAgZGVsZXRlIGNhY2hlOyBjYWNoZSA9IDA7Ci0gICAgZGVsZXRlIG51
bGxQaXhtYXA7IG51bGxQaXhtYXAgPSAwOwotICAgIGRlbGV0ZSBicm9rZW5QaXhtYXA7IGJyb2tl
blBpeG1hcCA9IDA7Ci0gICAgZGVsZXRlIG1fbG9hZGVyOyAgIG1fbG9hZGVyID0gMDsKLSAgICBk
ZWxldGUgZG9jbG9hZGVyOyBkb2Nsb2FkZXIgPSAwOwotfQotCi1DYWNoZWRJbWFnZSAqQ2FjaGU6
OnJlcXVlc3RJbWFnZSggRG9jTG9hZGVyKiBkbCwgY29uc3QgRE9NU3RyaW5nICYgdXJsLCBib29s
IHJlbG9hZCwgdGltZV90IF9leHBpcmVEYXRlICkKLXsKLSAgICAvLyB0aGlzIGJyaW5ncyB0aGUg
X3VybCB0byBhIHN0YW5kYXJkIGZvcm0uLi4KLSAgICBLVVJMIGt1cmw7Ci0gICAgaWYgKGRsKQot
ICAgICAgICBrdXJsID0gZGwtPm1fZG9jLT5jb21wbGV0ZVVSTCggdXJsLnFzdHJpbmcoKSApOwot
ICAgIGVsc2UKLSAgICAgICAga3VybCA9IHVybC5xc3RyaW5nKCk7Ci0gICAgcmV0dXJuIHJlcXVl
c3RJbWFnZShkbCwga3VybCwgcmVsb2FkLCBfZXhwaXJlRGF0ZSk7Ci19Ci0KLUNhY2hlZEltYWdl
ICpDYWNoZTo6cmVxdWVzdEltYWdlKCBEb2NMb2FkZXIqIGRsLCBjb25zdCBLVVJMICYgdXJsLCBi
b29sIHJlbG9hZCwgdGltZV90IF9leHBpcmVEYXRlICkKLXsKLSAgICBLSU86OkNhY2hlQ29udHJv
bCBjYWNoZVBvbGljeTsKLSAgICBpZiAoZGwpCi0gICAgICAgIGNhY2hlUG9saWN5ID0gZGwtPmNh
Y2hlUG9saWN5KCk7Ci0gICAgZWxzZQotICAgICAgICBjYWNoZVBvbGljeSA9IEtJTzo6Q0NfVmVy
aWZ5OwotCi0gICAgLy8gQ2hlY2tpbmcgaWYgdGhlIFVSTCBpcyBtYWxmb3JtZWQgaXMgbG90cyBv
ZiBleHRyYSB3b3JrIGZvciBsaXR0bGUgYmVuZWZpdC4KLQotICAgIGlmICghZGwtPmRvYygpLT5z
aG91bGRDcmVhdGVSZW5kZXJlcnMoKSl7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAg
IENhY2hlZE9iamVjdCAqbyA9IDA7Ci0gICAgaWYgKCFyZWxvYWQpCi0gICAgICAgIG8gPSBjYWNo
ZS0+ZmluZCh1cmwudXJsKCkpOwotICAgIGlmKCFvKQotICAgIHsKLSNpZmRlZiBDQUNIRV9ERUJV
RwotICAgICAgICBrZERlYnVnKCA2MDYwICkgPDwgIkNhY2hlOiBuZXc6ICIgPDwgdXJsLnVybCgp
IDw8IGVuZGw7Ci0jZW5kaWYKLSAgICAgICAgQ2FjaGVkSW1hZ2UgKmltID0gbmV3IENhY2hlZElt
YWdlKGRsLCB1cmwudXJsKCksIGNhY2hlUG9saWN5LCBfZXhwaXJlRGF0ZSk7Ci0gICAgICAgIGlm
ICggZGwgJiYgZGwtPmF1dG9sb2FkSW1hZ2VzKCkgKSBDYWNoZTo6bG9hZGVyKCktPmxvYWQoZGws
IGltLCB0cnVlKTsKLSAgICAgICAgaWYgKGNhY2hlRGlzYWJsZWQpCi0gICAgICAgICAgICBpbS0+
c2V0RnJlZSh0cnVlKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgIGNhY2hlLT5pbnNlcnQoIHVy
bC51cmwoKSwgaW0gKTsKLSAgICAgICAgbW92ZVRvSGVhZE9mTFJVTGlzdChpbSk7Ci0gICAgICAg
IH0KLSAgICAgICAgbyA9IGltOwotICAgIH0KLQotICAgIAotICAgIGlmKG8tPnR5cGUoKSAhPSBD
YWNoZWRPYmplY3Q6OkltYWdlKQotICAgIHsKLSNpZmRlZiBDQUNIRV9ERUJVRwotICAgICAgICBr
ZERlYnVnKCA2MDYwICkgPDwgIkNhY2hlOjpJbnRlcm5hbCBFcnJvciBpbiByZXF1ZXN0SW1hZ2Ug
dXJsPSIgPDwga3VybC51cmwoKSA8PCAiISIgPDwgZW5kbDsKLSNlbmRpZgotICAgICAgICByZXR1
cm4gMDsKLSAgICB9Ci0KLSNpZmRlZiBDQUNIRV9ERUJVRwotICAgIGlmKCBvLT5zdGF0dXMoKSA9
PSBDYWNoZWRPYmplY3Q6OlBlbmRpbmcgKQotICAgICAgICBrZERlYnVnKCA2MDYwICkgPDwgIkNh
Y2hlOiBsb2FkaW5nIGluIHByb2dyZXNzOiAiIDw8IGt1cmwudXJsKCkgPDwgZW5kbDsKLSAgICBl
bHNlCi0gICAgICAgIGtkRGVidWcoIDYwNjAgKSA8PCAiQ2FjaGU6IHVzaW5nIGNhY2hlZDogIiA8
PCBrdXJsLnVybCgpIDw8ICIsIHN0YXR1cyAiIDw8IG8tPnN0YXR1cygpIDw8IGVuZGw7Ci0jZW5k
aWYKLQotICAgIG1vdmVUb0hlYWRPZkxSVUxpc3Qobyk7Ci0gICAgaWYgKCBkbCApIHsKLSAgICAg
ICAgZGwtPm1fZG9jT2JqZWN0cy5yZW1vdmUoIG8gKTsKLSAgICAgICAgaWYgKCFjYWNoZURpc2Fi
bGVkKQotICAgICAgICBkbC0+bV9kb2NPYmplY3RzLmFwcGVuZCggbyApOwotICAgIH0KLSAgICBy
ZXR1cm4gc3RhdGljX2Nhc3Q8Q2FjaGVkSW1hZ2UgKj4obyk7Ci19Ci0KLUNhY2hlZENTU1N0eWxl
U2hlZXQgKkNhY2hlOjpyZXF1ZXN0U3R5bGVTaGVldCggRG9jTG9hZGVyKiBkbCwgY29uc3QgRE9N
U3RyaW5nICYgdXJsLCBib29sIHJlbG9hZCwgdGltZV90IF9leHBpcmVEYXRlLCBjb25zdCBRU3Ry
aW5nJiBjaGFyc2V0KQotewotICAgIC8vIHRoaXMgYnJpbmdzIHRoZSBfdXJsIHRvIGEgc3RhbmRh
cmQgZm9ybS4uLgotICAgIEtVUkwga3VybDsKLSAgICBLSU86OkNhY2hlQ29udHJvbCBjYWNoZVBv
bGljeTsKLSAgICBpZiAoIGRsICkKLSAgICB7Ci0gICAgICAgIGt1cmwgPSBkbC0+bV9kb2MtPmNv
bXBsZXRlVVJMKCB1cmwucXN0cmluZygpICk7Ci0gICAgICAgIGNhY2hlUG9saWN5ID0gZGwtPmNh
Y2hlUG9saWN5KCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGt1cmwgPSB1cmwu
cXN0cmluZygpOwotICAgICAgICBjYWNoZVBvbGljeSA9IEtJTzo6Q0NfVmVyaWZ5OwotICAgIH0K
LQotICAgIC8vIENoZWNraW5nIGlmIHRoZSBVUkwgaXMgbWFsZm9ybWVkIGlzIGxvdHMgb2YgZXh0
cmEgd29yayBmb3IgbGl0dGxlIGJlbmVmaXQuCi0KLSAgICBDYWNoZWRPYmplY3QgKm8gPSBjYWNo
ZS0+ZmluZChrdXJsLnVybCgpKTsKLSAgICBpZighbykKLSAgICB7Ci0jaWZkZWYgQ0FDSEVfREVC
VUcKLSAgICAgICAga2REZWJ1ZyggNjA2MCApIDw8ICJDYWNoZTogbmV3OiAiIDw8IGt1cmwudXJs
KCkgPDwgZW5kbDsKLSNlbmRpZgotICAgICAgICBDYWNoZWRDU1NTdHlsZVNoZWV0ICpzaGVldCA9
IG5ldyBDYWNoZWRDU1NTdHlsZVNoZWV0KGRsLCBrdXJsLnVybCgpLCBjYWNoZVBvbGljeSwgX2V4
cGlyZURhdGUsIGNoYXJzZXQpOwotICAgICAgICBpZiAoY2FjaGVEaXNhYmxlZCkKLSAgICAgICAg
ICAgIHNoZWV0LT5zZXRGcmVlKHRydWUpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgY2FjaGUt
Pmluc2VydCgga3VybC51cmwoKSwgc2hlZXQgKTsKLSAgICAgICAgbW92ZVRvSGVhZE9mTFJVTGlz
dChzaGVldCk7Ci0gICAgICAgIH0KLSAgICAgICAgbyA9IHNoZWV0OwotICAgIH0KLQotICAgIAot
ICAgIGlmKG8tPnR5cGUoKSAhPSBDYWNoZWRPYmplY3Q6OkNTU1N0eWxlU2hlZXQpCi0gICAgewot
I2lmZGVmIENBQ0hFX0RFQlVHCi0gICAgICAgIGtkRGVidWcoIDYwNjAgKSA8PCAiQ2FjaGU6Oklu
dGVybmFsIEVycm9yIGluIHJlcXVlc3RTdHlsZVNoZWV0IHVybD0iIDw8IGt1cmwudXJsKCkgPDwg
IiEiIDw8IGVuZGw7Ci0jZW5kaWYKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0jaWZkZWYg
Q0FDSEVfREVCVUcKLSAgICBpZiggby0+c3RhdHVzKCkgPT0gQ2FjaGVkT2JqZWN0OjpQZW5kaW5n
ICkKLSAgICAgICAga2REZWJ1ZyggNjA2MCApIDw8ICJDYWNoZTogbG9hZGluZyBpbiBwcm9ncmVz
czogIiA8PCBrdXJsLnVybCgpIDw8IGVuZGw7Ci0gICAgZWxzZQotICAgICAgICBrZERlYnVnKCA2
MDYwICkgPDwgIkNhY2hlOiB1c2luZyBjYWNoZWQ6ICIgPDwga3VybC51cmwoKSA8PCBlbmRsOwot
I2VuZGlmCi0KLSAgICBtb3ZlVG9IZWFkT2ZMUlVMaXN0KG8pOwotICAgIGlmICggZGwgKSB7Ci0g
ICAgICAgIGRsLT5tX2RvY09iamVjdHMucmVtb3ZlKCBvICk7Ci0gICAgICAgIGlmICghY2FjaGVE
aXNhYmxlZCkKLSAgICAgICAgZGwtPm1fZG9jT2JqZWN0cy5hcHBlbmQoIG8gKTsKLSAgICB9Ci0g
ICAgcmV0dXJuIHN0YXRpY19jYXN0PENhY2hlZENTU1N0eWxlU2hlZXQgKj4obyk7Ci19Ci0KLXZv
aWQgQ2FjaGU6OnByZWxvYWRTdHlsZVNoZWV0KCBjb25zdCBRU3RyaW5nICZ1cmwsIGNvbnN0IFFT
dHJpbmcgJnN0eWxlc2hlZXRfZGF0YSkKLXsKLSAgICBDYWNoZWRPYmplY3QgKm8gPSBjYWNoZS0+
ZmluZCh1cmwpOwotICAgIGlmKG8pCi0gICAgICAgIHJlbW92ZUNhY2hlRW50cnkobyk7Ci0KLSAg
ICBDYWNoZWRDU1NTdHlsZVNoZWV0ICpzdHlsZXNoZWV0ID0gbmV3IENhY2hlZENTU1N0eWxlU2hl
ZXQodXJsLCBzdHlsZXNoZWV0X2RhdGEpOwotICAgIGNhY2hlLT5pbnNlcnQoIHVybCwgc3R5bGVz
aGVldCApOwotfQotCi1DYWNoZWRTY3JpcHQgKkNhY2hlOjpyZXF1ZXN0U2NyaXB0KCBEb2NMb2Fk
ZXIqIGRsLCBjb25zdCBET006OkRPTVN0cmluZyAmdXJsLCBib29sIHJlbG9hZCwgdGltZV90IF9l
eHBpcmVEYXRlLCBjb25zdCBRU3RyaW5nJiBjaGFyc2V0KQotewotICAgIC8vIHRoaXMgYnJpbmdz
IHRoZSBfdXJsIHRvIGEgc3RhbmRhcmQgZm9ybS4uLgotICAgIEtVUkwga3VybDsKLSAgICBLSU86
OkNhY2hlQ29udHJvbCBjYWNoZVBvbGljeTsKLSAgICBpZiAoIGRsICkKLSAgICB7Ci0gICAgICAg
IGt1cmwgPSBkbC0+bV9kb2MtPmNvbXBsZXRlVVJMKCB1cmwucXN0cmluZygpICk7Ci0gICAgICAg
IGNhY2hlUG9saWN5ID0gZGwtPmNhY2hlUG9saWN5KCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7
Ci0gICAgICAgIGt1cmwgPSB1cmwucXN0cmluZygpOwotICAgICAgICBjYWNoZVBvbGljeSA9IEtJ
Tzo6Q0NfVmVyaWZ5OwotICAgIH0KLQotICAgIC8vIENoZWNraW5nIGlmIHRoZSBVUkwgaXMgbWFs
Zm9ybWVkIGlzIGxvdHMgb2YgZXh0cmEgd29yayBmb3IgbGl0dGxlIGJlbmVmaXQuCi0KLSAgICBD
YWNoZWRPYmplY3QgKm8gPSBjYWNoZS0+ZmluZChrdXJsLnVybCgpKTsKLSAgICBpZighbykKLSAg
ICB7Ci0jaWZkZWYgQ0FDSEVfREVCVUcKLSAgICAgICAga2REZWJ1ZyggNjA2MCApIDw8ICJDYWNo
ZTogbmV3OiAiIDw8IGt1cmwudXJsKCkgPDwgZW5kbDsKLSNlbmRpZgotICAgICAgICBDYWNoZWRT
Y3JpcHQgKnNjcmlwdCA9IG5ldyBDYWNoZWRTY3JpcHQoZGwsIGt1cmwudXJsKCksIGNhY2hlUG9s
aWN5LCBfZXhwaXJlRGF0ZSwgY2hhcnNldCk7Ci0gICAgICAgIGlmIChjYWNoZURpc2FibGVkKQot
ICAgICAgICAgICAgc2NyaXB0LT5zZXRGcmVlKHRydWUpOwotICAgICAgICBlbHNlIHsKLSAgICAg
ICAgY2FjaGUtPmluc2VydCgga3VybC51cmwoKSwgc2NyaXB0ICk7Ci0gICAgICAgIG1vdmVUb0hl
YWRPZkxSVUxpc3Qoc2NyaXB0KTsKLSAgICAgICAgfQotICAgICAgICBvID0gc2NyaXB0OwotICAg
IH0KLQotICAgIAotICAgIGlmKCEoby0+dHlwZSgpID09IENhY2hlZE9iamVjdDo6U2NyaXB0KSkK
LSAgICB7Ci0jaWZkZWYgQ0FDSEVfREVCVUcKLSAgICAgICAga2REZWJ1ZyggNjA2MCApIDw8ICJD
YWNoZTo6SW50ZXJuYWwgRXJyb3IgaW4gcmVxdWVzdFNjcmlwdCB1cmw9IiA8PCBrdXJsLnVybCgp
IDw8ICIhIiA8PCBlbmRsOwotI2VuZGlmCi0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICAK
LSAgICAKLSNpZmRlZiBDQUNIRV9ERUJVRwotICAgIGlmKCBvLT5zdGF0dXMoKSA9PSBDYWNoZWRP
YmplY3Q6OlBlbmRpbmcgKQotICAgICAgICBrZERlYnVnKCA2MDYwICkgPDwgIkNhY2hlOiBsb2Fk
aW5nIGluIHByb2dyZXNzOiAiIDw8IGt1cmwudXJsKCkgPDwgZW5kbDsKLSAgICBlbHNlCi0gICAg
ICAgIGtkRGVidWcoIDYwNjAgKSA8PCAiQ2FjaGU6IHVzaW5nIGNhY2hlZDogIiA8PCBrdXJsLnVy
bCgpIDw8IGVuZGw7Ci0jZW5kaWYKLQotICAgIG1vdmVUb0hlYWRPZkxSVUxpc3Qobyk7Ci0gICAg
aWYgKCBkbCApIHsKLSAgICAgICAgZGwtPm1fZG9jT2JqZWN0cy5yZW1vdmUoIG8gKTsKLSAgICAg
ICAgaWYgKCFjYWNoZURpc2FibGVkKQotICAgICAgICBkbC0+bV9kb2NPYmplY3RzLmFwcGVuZCgg
byApOwotICAgIH0KLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q2FjaGVkU2NyaXB0ICo+KG8pOwot
fQotCi12b2lkIENhY2hlOjpwcmVsb2FkU2NyaXB0KCBjb25zdCBRU3RyaW5nICZ1cmwsIGNvbnN0
IFFTdHJpbmcgJnNjcmlwdF9kYXRhKQotewotICAgIENhY2hlZE9iamVjdCAqbyA9IGNhY2hlLT5m
aW5kKHVybCk7Ci0gICAgaWYobykKLSAgICAgICAgcmVtb3ZlQ2FjaGVFbnRyeShvKTsKLQotICAg
IENhY2hlZFNjcmlwdCAqc2NyaXB0ID0gbmV3IENhY2hlZFNjcmlwdCh1cmwsIHNjcmlwdF9kYXRh
KTsKLSAgICBjYWNoZS0+aW5zZXJ0KCB1cmwsIHNjcmlwdCApOwotfQotCi0jaWZkZWYgS0hUTUxf
WFNMVAotQ2FjaGVkWFNMU3R5bGVTaGVldCogQ2FjaGU6OnJlcXVlc3RYU0xTdHlsZVNoZWV0KERv
Y0xvYWRlciogZGwsIGNvbnN0IERPTVN0cmluZyAmIHVybCwgYm9vbCByZWxvYWQsIAotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVfdCBfZXhwaXJl
RGF0ZSkKLXsKLSAgICAvLyB0aGlzIGJyaW5ncyB0aGUgX3VybCB0byBhIHN0YW5kYXJkIGZvcm0u
Li4KLSAgICBLVVJMIGt1cmw7Ci0gICAgS0lPOjpDYWNoZUNvbnRyb2wgY2FjaGVQb2xpY3k7Ci0g
ICAgaWYgKGRsKSB7Ci0gICAgICAgIGt1cmwgPSBkbC0+bV9kb2MtPmNvbXBsZXRlVVJMKHVybC5x
c3RyaW5nKCkpOwotICAgICAgICBjYWNoZVBvbGljeSA9IGRsLT5jYWNoZVBvbGljeSgpOwotICAg
IH0KLSAgICBlbHNlIHsKLSAgICAgICAga3VybCA9IHVybC5xc3RyaW5nKCk7Ci0gICAgICAgIGNh
Y2hlUG9saWN5ID0gS0lPOjpDQ19WZXJpZnk7Ci0gICAgfQotICAgIAotICAgIC8vIENoZWNraW5n
IGlmIHRoZSBVUkwgaXMgbWFsZm9ybWVkIGlzIGxvdHMgb2YgZXh0cmEgd29yayBmb3IgbGl0dGxl
IGJlbmVmaXQuCi0gICAgCi0gICAgQ2FjaGVkT2JqZWN0ICpvID0gY2FjaGUtPmZpbmQoa3VybC51
cmwoKSk7Ci0gICAgaWYgKCFvKSB7Ci0jaWZkZWYgQ0FDSEVfREVCVUcKLSAgICAgICAga2REZWJ1
ZyggNjA2MCApIDw8ICJDYWNoZTogbmV3OiAiIDw8IGt1cmwudXJsKCkgPDwgZW5kbDsKLSNlbmRp
ZgotICAgICAgICBDYWNoZWRYU0xTdHlsZVNoZWV0KiBkb2MgPSBuZXcgQ2FjaGVkWFNMU3R5bGVT
aGVldChkbCwga3VybC51cmwoKSwgY2FjaGVQb2xpY3ksIF9leHBpcmVEYXRlKTsKLSAgICAgICAg
aWYgKGNhY2hlRGlzYWJsZWQpCi0gICAgICAgICAgICBkb2MtPnNldEZyZWUodHJ1ZSk7Ci0gICAg
ICAgIGVsc2UgewotICAgICAgICAgICAgY2FjaGUtPmluc2VydChrdXJsLnVybCgpLCBkb2MpOwot
ICAgICAgICAgICAgbW92ZVRvSGVhZE9mTFJVTGlzdChkb2MpOwotICAgICAgICB9Ci0gICAgICAg
IG8gPSBkb2M7Ci0gICAgfQotICAgIAotICAgIAotICAgIGlmIChvLT50eXBlKCkgIT0gQ2FjaGVk
T2JqZWN0OjpYU0xTdHlsZVNoZWV0KSB7Ci0jaWZkZWYgQ0FDSEVfREVCVUcKLSAgICAgICAga2RE
ZWJ1ZyggNjA2MCApIDw8ICJDYWNoZTo6SW50ZXJuYWwgRXJyb3IgaW4gcmVxdWVzdFhTTFN0eWxl
U2hlZXQgdXJsPSIgPDwga3VybC51cmwoKSA8PCAiISIgPDwgZW5kbDsKLSNlbmRpZgotICAgICAg
ICByZXR1cm4gMDsKLSAgICB9Ci0gICAgCi0jaWZkZWYgQ0FDSEVfREVCVUcKLSAgICBpZiAoby0+
c3RhdHVzKCkgPT0gQ2FjaGVkT2JqZWN0OjpQZW5kaW5nKQotICAgICAgICBrZERlYnVnKCA2MDYw
ICkgPDwgIkNhY2hlOiBsb2FkaW5nIGluIHByb2dyZXNzOiAiIDw8IGt1cmwudXJsKCkgPDwgZW5k
bDsKLSAgICBlbHNlCi0gICAgICAgIGtkRGVidWcoIDYwNjAgKSA8PCAiQ2FjaGU6IHVzaW5nIGNh
Y2hlZDogIiA8PCBrdXJsLnVybCgpIDw8IGVuZGw7Ci0jZW5kaWYKLSAgICAKLSAgICBtb3ZlVG9I
ZWFkT2ZMUlVMaXN0KG8pOwotICAgIGlmIChkbCkgewotICAgICAgICBkbC0+bV9kb2NPYmplY3Rz
LnJlbW92ZSggbyApOwotICAgICAgICBpZiAoIWNhY2hlRGlzYWJsZWQpCi0gICAgICAgICAgICBk
bC0+bV9kb2NPYmplY3RzLmFwcGVuZCggbyApOwotICAgIH0KLSAgICByZXR1cm4gc3RhdGljX2Nh
c3Q8Q2FjaGVkWFNMU3R5bGVTaGVldCo+KG8pOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgS0hUTUxf
Tk9fWEJMCi1DYWNoZWRYQkxEb2N1bWVudCogQ2FjaGU6OnJlcXVlc3RYQkxEb2N1bWVudChEb2NM
b2FkZXIqIGRsLCBjb25zdCBET01TdHJpbmcgJiB1cmwsIGJvb2wgcmVsb2FkLCAKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVfdCBfZXhwaXJlRGF0ZSkK
LXsKLSAgICAvLyB0aGlzIGJyaW5ncyB0aGUgX3VybCB0byBhIHN0YW5kYXJkIGZvcm0uLi4KLSAg
ICBLVVJMIGt1cmw7Ci0gICAgS0lPOjpDYWNoZUNvbnRyb2wgY2FjaGVQb2xpY3k7Ci0gICAgaWYg
KGRsKSB7Ci0gICAgICAgIGt1cmwgPSBkbC0+bV9kb2MtPmNvbXBsZXRlVVJMKHVybC5xc3RyaW5n
KCkpOwotICAgICAgICBjYWNoZVBvbGljeSA9IGRsLT5jYWNoZVBvbGljeSgpOwotICAgIH0KLSAg
ICBlbHNlIHsKLSAgICAgICAga3VybCA9IHVybC5xc3RyaW5nKCk7Ci0gICAgICAgIGNhY2hlUG9s
aWN5ID0gS0lPOjpDQ19WZXJpZnk7Ci0gICAgfQotICAgIAotICAgIC8vIENoZWNraW5nIGlmIHRo
ZSBVUkwgaXMgbWFsZm9ybWVkIGlzIGxvdHMgb2YgZXh0cmEgd29yayBmb3IgbGl0dGxlIGJlbmVm
aXQuCi0gICAgCi0gICAgQ2FjaGVkT2JqZWN0ICpvID0gY2FjaGUtPmZpbmQoa3VybC51cmwoKSk7
Ci0gICAgaWYoIW8pCi0gICAgewotI2lmZGVmIENBQ0hFX0RFQlVHCi0gICAgICAgIGtkRGVidWco
IDYwNjAgKSA8PCAiQ2FjaGU6IG5ldzogIiA8PCBrdXJsLnVybCgpIDw8IGVuZGw7Ci0jZW5kaWYK
LSAgICAgICAgQ2FjaGVkWEJMRG9jdW1lbnQqIGRvYyA9IG5ldyBDYWNoZWRYQkxEb2N1bWVudChk
bCwga3VybC51cmwoKSwgY2FjaGVQb2xpY3ksIF9leHBpcmVEYXRlKTsKLSAgICAgICAgaWYgKGNh
Y2hlRGlzYWJsZWQpCi0gICAgICAgICAgICBkb2MtPnNldEZyZWUodHJ1ZSk7Ci0gICAgICAgIGVs
c2UgewotICAgICAgICAgICAgY2FjaGUtPmluc2VydChrdXJsLnVybCgpLCBkb2MpOwotICAgICAg
ICAgICAgbW92ZVRvSGVhZE9mTFJVTGlzdChkb2MpOwotICAgICAgICB9Ci0gICAgICAgIG8gPSBk
b2M7Ci0gICAgfQotICAgIAotICAgIAotICAgIGlmKG8tPnR5cGUoKSAhPSBDYWNoZWRPYmplY3Q6
OlhCTCkKLSAgICB7Ci0jaWZkZWYgQ0FDSEVfREVCVUcKLSAgICAgICAga2REZWJ1ZyggNjA2MCAp
IDw8ICJDYWNoZTo6SW50ZXJuYWwgRXJyb3IgaW4gcmVxdWVzdFhCTERvY3VtZW50IHVybD0iIDw8
IGt1cmwudXJsKCkgPDwgIiEiIDw8IGVuZGw7Ci0jZW5kaWYKLSAgICAgICAgcmV0dXJuIDA7Ci0g
ICAgfQotICAgIAotI2lmZGVmIENBQ0hFX0RFQlVHCi0gICAgaWYoIG8tPnN0YXR1cygpID09IENh
Y2hlZE9iamVjdDo6UGVuZGluZyApCi0gICAgICAgIGtkRGVidWcoIDYwNjAgKSA8PCAiQ2FjaGU6
IGxvYWRpbmcgaW4gcHJvZ3Jlc3M6ICIgPDwga3VybC51cmwoKSA8PCBlbmRsOwotICAgIGVsc2UK
LSAgICAgICAga2REZWJ1ZyggNjA2MCApIDw8ICJDYWNoZTogdXNpbmcgY2FjaGVkOiAiIDw8IGt1
cmwudXJsKCkgPDwgZW5kbDsKLSNlbmRpZgotICAgIAotICAgIG1vdmVUb0hlYWRPZkxSVUxpc3Qo
byk7Ci0gICAgaWYgKCBkbCApIHsKLSAgICAgICAgZGwtPm1fZG9jT2JqZWN0cy5yZW1vdmUoIG8g
KTsKLSAgICAgICAgaWYgKCFjYWNoZURpc2FibGVkKQotICAgICAgICAgICAgZGwtPm1fZG9jT2Jq
ZWN0cy5hcHBlbmQoIG8gKTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PENhY2hlZFhC
TERvY3VtZW50Kj4obyk7Ci19Ci0jZW5kaWYKLQotdm9pZCBDYWNoZTo6Zmx1c2goYm9vbCBmb3Jj
ZSkKLXsKLSAgICBpZiAoZm9yY2UpCi0gICAgICAgZmx1c2hDb3VudCA9IDA7Ci0gICAgLy8gRG9u
J3QgZmx1c2ggZm9yIGV2ZXJ5IGltYWdlLgotICAgIGlmIChtX2NvdW50T2ZMUlVBbmRVbmNhY2hl
YWJsZUxpc3RzIDwgZmx1c2hDb3VudCkKLSAgICAgICByZXR1cm47Ci0KLSAgICBpbml0KCk7Ci0K
LSAgICB3aGlsZSAobV9oZWFkT2ZVbmNhY2hlYWJsZUxpc3QpCi0gICAgICAgIHJlbW92ZUNhY2hl
RW50cnkobV9oZWFkT2ZVbmNhY2hlYWJsZUxpc3QpOwotCi0gICAgZm9yIChpbnQgaSA9IE1BWF9M
UlVfTElTVFMtMTsgaT49MDsgaS0tKSB7Ci0gICAgICAgIGlmIChtX3RvdGFsU2l6ZU9mTFJVTGlz
dHMgPD0gbWF4U2l6ZSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgCi0gICAgICAg
IHdoaWxlIChtX3RvdGFsU2l6ZU9mTFJVTGlzdHMgPiBtYXhTaXplICYmIG1fTFJVTGlzdHNbaV0u
bV90YWlsKQotICAgICAgICAgICAgcmVtb3ZlQ2FjaGVFbnRyeShtX0xSVUxpc3RzW2ldLm1fdGFp
bCk7Ci0gICAgfQotCi0gICAgZmx1c2hDb3VudCA9IG1fY291bnRPZkxSVUFuZFVuY2FjaGVhYmxl
TGlzdHMrMTA7IC8vIEZsdXNoIGFnYWluIHdoZW4gdGhlIGNhY2hlIGhhcyBncm93bi4KLX0KLQot
Ci12b2lkIENhY2hlOjpzZXRTaXplKCBpbnQgYnl0ZXMgKQotewotICAgIG1heFNpemUgPSBieXRl
czsKLSAgICBtYXhDYWNoZWFibGUgPSBrTWF4KG1heFNpemUgLyAxMjgsIE1BWENBQ0hFQUJMRSk7
Ci0KLSAgICAvLyBtYXkgYmUgd2UgbmVlZCB0byBjbGVhciBwYXJ0cyBvZiB0aGUgY2FjaGUKLSAg
ICBmbHVzaENvdW50ID0gMDsKLSAgICBmbHVzaCh0cnVlKTsKLX0KLQotdm9pZCBDYWNoZTo6cmVt
b3ZlQ2FjaGVFbnRyeSggQ2FjaGVkT2JqZWN0ICpvYmplY3QgKQotewotICBRU3RyaW5nIGtleSA9
IG9iamVjdC0+dXJsKCkucXN0cmluZygpOwotCi0gIC8vIHRoaXMgaW5kaWNhdGVzIHRoZSBkZXJl
ZigpIG1ldGhvZCBvZiBDYWNoZWRPYmplY3QgdG8gZGVsZXRlIGl0c2VsZiB3aGVuIHRoZSByZWZl
cmVuY2UgY291bnRlcgotICAvLyBkcm9wcyBkb3duIHRvIHplcm8KLSAgb2JqZWN0LT5zZXRGcmVl
KCB0cnVlICk7Ci0KLSAgY2FjaGUtPnJlbW92ZSgga2V5ICk7Ci0gIHJlbW92ZUZyb21MUlVMaXN0
KG9iamVjdCk7Ci0KLSAgY29uc3QgRG9jTG9hZGVyKiBkbDsKLSAgZm9yICggZGw9ZG9jbG9hZGVy
LT5maXJzdCgpOyBkbDsgZGw9ZG9jbG9hZGVyLT5uZXh0KCkgKQotICAgICAgZGwtPnJlbW92ZUNh
Y2hlZE9iamVjdCggb2JqZWN0ICk7Ci0KLSAgaWYgKCBvYmplY3QtPmNhbkRlbGV0ZSgpICkKLSAg
ICAgZGVsZXRlIG9iamVjdDsKLX0KLQotI2RlZmluZSBGQVNUX0xPRzIoX2xvZzIsX24pICAgXAot
ICAgICAgdW5zaWduZWQgaW50IGpfID0gKHVuc2lnbmVkIGludCkoX24pOyAgIFwKLSAgICAgIChf
bG9nMikgPSAwOyAgICAgICAgICAgICAgICAgICAgXAotICAgICAgaWYgKChqXykgJiAoKGpfKS0x
KSkgICAgICAgICAgICBcCi0gICAgICAoX2xvZzIpICs9IDE7ICAgICAgICAgICAgICAgXAotICAg
ICAgaWYgKChqXykgPj4gMTYpICAgICAgICAgICAgICAgICBcCi0gICAgICAoX2xvZzIpICs9IDE2
LCAoal8pID4+PSAxNjsgXAotICAgICAgaWYgKChqXykgPj4gOCkgICAgICAgICAgICAgICAgICBc
Ci0gICAgICAoX2xvZzIpICs9IDgsIChqXykgPj49IDg7ICAgXAotICAgICAgaWYgKChqXykgPj4g
NCkgICAgICAgICAgICAgICAgICBcCi0gICAgICAoX2xvZzIpICs9IDQsIChqXykgPj49IDQ7ICAg
XAotICAgICAgaWYgKChqXykgPj4gMikgICAgICAgICAgICAgICAgICBcCi0gICAgICAoX2xvZzIp
ICs9IDIsIChqXykgPj49IDI7ICAgXAotICAgICAgaWYgKChqXykgPj4gMSkgICAgICAgICAgICAg
ICAgICBcCi0gICAgICAoX2xvZzIpICs9IDE7Ci0KLWludCBGYXN0TG9nMih1bnNpZ25lZCBpbnQg
aSkgewotICAgIGludCBsb2cyOwotICAgIEZBU1RfTE9HMihsb2cyLGkpOwotICAgIHJldHVybiBs
b2cyOwotfQotCi1MUlVMaXN0KiBDYWNoZTo6Z2V0TFJVTGlzdEZvcihDYWNoZWRPYmplY3QqIG8p
Ci17Ci0gICAgaW50IGFjY2Vzc0NvdW50ID0gby0+YWNjZXNzQ291bnQoKTsKLSAgICBpbnQgcXVl
dWVJbmRleDsKLSAgICBpZiAoYWNjZXNzQ291bnQgPT0gMCkgewotICAgICAgICBxdWV1ZUluZGV4
ID0gMDsKLSAgICB9IGVsc2UgewotICAgICAgICBpbnQgc2l6ZUxvZyA9IEZhc3RMb2cyKG8tPnNp
emUoKSk7Ci0gICAgICAgIHF1ZXVlSW5kZXggPSBzaXplTG9nL28tPmFjY2Vzc0NvdW50KCkgLSAx
OwotICAgICAgICBpZiAocXVldWVJbmRleCA8IDApCi0gICAgICAgICAgICBxdWV1ZUluZGV4ID0g
MDsKLSAgICAgICAgaWYgKHF1ZXVlSW5kZXggPj0gTUFYX0xSVV9MSVNUUykKLSAgICAgICAgICAg
IHF1ZXVlSW5kZXggPSBNQVhfTFJVX0xJU1RTLTE7Ci0gICAgfQotICAgIGlmIChtX0xSVUxpc3Rz
ID09IDApIHsKLSAgICAgICAgbV9MUlVMaXN0cyA9IG5ldyBMUlVMaXN0IFtNQVhfTFJVX0xJU1RT
XTsKLSAgICB9Ci0gICAgcmV0dXJuICZtX0xSVUxpc3RzW3F1ZXVlSW5kZXhdOwotfQotCi12b2lk
IENhY2hlOjpyZW1vdmVGcm9tTFJVTGlzdChDYWNoZWRPYmplY3QgKm9iamVjdCkKLXsKLSAgICBD
YWNoZWRPYmplY3QgKm5leHQgPSBvYmplY3QtPm1fbmV4dEluTFJVTGlzdDsKLSAgICBDYWNoZWRP
YmplY3QgKnByZXYgPSBvYmplY3QtPm1fcHJldkluTFJVTGlzdDsKLSAgICBib29sIHVuY2FjaGVh
YmxlID0gb2JqZWN0LT5zdGF0dXMoKSA9PSBDYWNoZWRPYmplY3Q6OlVuY2FjaGVhYmxlOwotICAg
IAotICAgIExSVUxpc3QqIGxpc3QgPSB1bmNhY2hlYWJsZSA/IDAgOiBnZXRMUlVMaXN0Rm9yKG9i
amVjdCk7Ci0gICAgQ2FjaGVkT2JqZWN0IComaGVhZCA9IHVuY2FjaGVhYmxlID8gbV9oZWFkT2ZV
bmNhY2hlYWJsZUxpc3QgOiBsaXN0LT5tX2hlYWQ7Ci0gICAgCi0gICAgaWYgKG5leHQgPT0gMCAm
JiBwcmV2ID09IDAgJiYgaGVhZCAhPSBvYmplY3QpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0K
LSAgICAKLSAgICBvYmplY3QtPm1fbmV4dEluTFJVTGlzdCA9IDA7Ci0gICAgb2JqZWN0LT5tX3By
ZXZJbkxSVUxpc3QgPSAwOwotICAgIAotICAgIGlmIChuZXh0KQotICAgICAgICBuZXh0LT5tX3By
ZXZJbkxSVUxpc3QgPSBwcmV2OwotICAgIGVsc2UgaWYgKCF1bmNhY2hlYWJsZSAmJiBsaXN0LT5t
X3RhaWwgPT0gb2JqZWN0KQotICAgICAgICBsaXN0LT5tX3RhaWwgPSBwcmV2OwotCi0gICAgaWYg
KHByZXYpCi0gICAgICAgIHByZXYtPm1fbmV4dEluTFJVTGlzdCA9IG5leHQ7Ci0gICAgZWxzZSBp
ZiAoaGVhZCA9PSBvYmplY3QpCi0gICAgICAgIGhlYWQgPSBuZXh0OwotICAgIAotICAgIC0tbV9j
b3VudE9mTFJVQW5kVW5jYWNoZWFibGVMaXN0czsKLSAgICAKLSAgICBpZiAoIXVuY2FjaGVhYmxl
KQotICAgICAgICBtX3RvdGFsU2l6ZU9mTFJVTGlzdHMgLT0gb2JqZWN0LT5zaXplKCk7Ci19Ci0K
LXZvaWQgQ2FjaGU6Om1vdmVUb0hlYWRPZkxSVUxpc3QoQ2FjaGVkT2JqZWN0ICpvYmplY3QpCi17
Ci0gICAgaW5zZXJ0SW5MUlVMaXN0KG9iamVjdCk7Ci19Ci0KLXZvaWQgQ2FjaGU6Omluc2VydElu
TFJVTGlzdChDYWNoZWRPYmplY3QgKm9iamVjdCkKLXsKLSAgICByZW1vdmVGcm9tTFJVTGlzdChv
YmplY3QpOwotICAgIAotICAgIGlmICghb2JqZWN0LT5hbGxvd0luTFJVTGlzdCgpKQotICAgICAg
ICByZXR1cm47Ci0gICAgCi0gICAgTFJVTGlzdCogbGlzdCA9IGdldExSVUxpc3RGb3Iob2JqZWN0
KTsKLSAgICAKLSAgICBib29sIHVuY2FjaGVhYmxlID0gb2JqZWN0LT5zdGF0dXMoKSA9PSBDYWNo
ZWRPYmplY3Q6OlVuY2FjaGVhYmxlOwotICAgIENhY2hlZE9iamVjdCAqJmhlYWQgPSB1bmNhY2hl
YWJsZSA/IG1faGVhZE9mVW5jYWNoZWFibGVMaXN0IDogbGlzdC0+bV9oZWFkOwotCi0gICAgb2Jq
ZWN0LT5tX25leHRJbkxSVUxpc3QgPSBoZWFkOwotICAgIGlmIChoZWFkKQotICAgICAgICBoZWFk
LT5tX3ByZXZJbkxSVUxpc3QgPSBvYmplY3Q7Ci0gICAgaGVhZCA9IG9iamVjdDsKLSAgICAKLSAg
ICBpZiAob2JqZWN0LT5tX25leHRJbkxSVUxpc3QgPT0gMCAmJiAhdW5jYWNoZWFibGUpCi0gICAg
ICAgIGxpc3QtPm1fdGFpbCA9IG9iamVjdDsKLSAgICAKLSAgICArK21fY291bnRPZkxSVUFuZFVu
Y2FjaGVhYmxlTGlzdHM7Ci0gICAgCi0gICAgaWYgKCF1bmNhY2hlYWJsZSkKLSAgICAgICAgbV90
b3RhbFNpemVPZkxSVUxpc3RzICs9IG9iamVjdC0+c2l6ZSgpOwotfQotCi1ib29sIENhY2hlOjph
ZGp1c3RTaXplKENhY2hlZE9iamVjdCAqb2JqZWN0LCBpbnQgZGVsdGEpCi17Ci0gICAgaWYgKG9i
amVjdC0+c3RhdHVzKCkgPT0gQ2FjaGVkT2JqZWN0OjpVbmNhY2hlYWJsZSkKLSAgICAgICAgcmV0
dXJuIGZhbHNlOwotCi0gICAgaWYgKG9iamVjdC0+bV9uZXh0SW5MUlVMaXN0ID09IDAgJiYgb2Jq
ZWN0LT5tX3ByZXZJbkxSVUxpc3QgPT0gMCAmJgotICAgICAgICBnZXRMUlVMaXN0Rm9yKG9iamVj
dCktPm1faGVhZCAhPSBvYmplY3QpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICBt
X3RvdGFsU2l6ZU9mTFJVTGlzdHMgKz0gZGVsdGE7Ci0gICAgcmV0dXJuIGRlbHRhICE9IDA7Ci19
Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUNhY2hlZE9i
amVjdENsaWVudCAqQ2FjaGVkT2JqZWN0Q2xpZW50V2Fsa2VyOjpuZXh0KCkKLXsKLSAgICAvLyBP
bmx5IGFkdmFuY2UgaWYgd2UgYWxyZWFkeSByZXR1cm5lZCB0aGlzIGl0ZW0uCi0gICAgLy8gVGhp
cyBoYW5kbGVzIGNhc2VzIHdoZXJlIHRoZSBjdXJyZW50IGl0ZW0gaXMgcmVtb3ZlZCwgYW5kIHBy
ZXZlbnRzIHVzIGZyb20gc2tpcHBpbmcgdGhlIG5leHQgaXRlbS4KLSAgICAvLyBUaGUgaXRlcmF0
b3IgYXV0b21hdGljYWxseSBnZXRzIGFkdmFuY2VkIHRvIHRoZSBuZXh0IGl0ZW0sIGFuZCB3ZSBt
YWtlIHN1cmUgd2UgcmV0dXJuIGl0LgotICAgIGlmIChfY3VycmVudCA9PSBfaXRlcmF0b3IuY3Vy
cmVudCgpKQotICAgICAgICArK19pdGVyYXRvcjsKLSAgICBfY3VycmVudCA9IF9pdGVyYXRvci5j
dXJyZW50KCk7Ci0gICAgcmV0dXJuIF9jdXJyZW50OwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1DYWNoZWRPYmplY3RDbGllbnQ6On5DYWNoZWRPYmpl
Y3RDbGllbnQoKSB7IH0KLXZvaWQgQ2FjaGVkT2JqZWN0Q2xpZW50OjpzZXRQaXhtYXAoY29uc3Qg
UVBpeG1hcCAmLCBjb25zdCBRUmVjdCYsIENhY2hlZEltYWdlICopIHt9Ci12b2lkIENhY2hlZE9i
amVjdENsaWVudDo6c2V0U3R5bGVTaGVldChjb25zdCBET006OkRPTVN0cmluZyAmLyp1cmwqLywg
Y29uc3QgRE9NOjpET01TdHJpbmcgJi8qc2hlZXQqLykge30KLSNpZm5kZWYgS0hUTUxfTk9fWEJM
Ci12b2lkIENhY2hlZE9iamVjdENsaWVudDo6c2V0WEJMRG9jdW1lbnQoY29uc3QgRE9NOjpET01T
dHJpbmcmIHVybCwgWEJMOjpYQkxEb2N1bWVudEltcGwqIGRvYykge30KLSNlbmRpZgotdm9pZCBD
YWNoZWRPYmplY3RDbGllbnQ6Om5vdGlmeUZpbmlzaGVkKENhY2hlZE9iamVjdCAqIC8qZmluaXNo
ZWRPYmoqLykge30KLQotQ2FjaGU6OlN0YXRpc3RpY3MgQ2FjaGU6OmdldFN0YXRpc3RpY3MoKQot
ewotICAgIFN0YXRpc3RpY3Mgc3RhdHM7Ci0KLSAgICBpZiAoIWNhY2hlKQotICAgICAgICByZXR1
cm4gc3RhdHM7Ci0KLSAgICBRRGljdEl0ZXJhdG9yPENhY2hlZE9iamVjdD4gaSgqY2FjaGUpOwot
ICAgIGZvciAoaS50b0ZpcnN0KCk7IGkuY3VycmVudCgpOyArK2kpIHsKLSAgICAgICAgQ2FjaGVk
T2JqZWN0ICpvID0gaS5jdXJyZW50KCk7Ci0gICAgICAgIHN3aXRjaCAoby0+dHlwZSgpKSB7Ci0g
ICAgICAgICAgICBjYXNlIENhY2hlZE9iamVjdDo6SW1hZ2U6Ci0gICAgICAgICAgICAgICAgc3Rh
dHMuaW1hZ2VzLmNvdW50Kys7Ci0gICAgICAgICAgICAgICAgc3RhdHMuaW1hZ2VzLnNpemUgKz0g
by0+c2l6ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIENh
Y2hlZE9iamVjdDo6Q1NTU3R5bGVTaGVldDoKLSAgICAgICAgICAgICAgICBzdGF0cy5zdHlsZVNo
ZWV0cy5jb3VudCsrOwotICAgICAgICAgICAgICAgIHN0YXRzLnN0eWxlU2hlZXRzLnNpemUgKz0g
by0+c2l6ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIENh
Y2hlZE9iamVjdDo6U2NyaXB0OgotICAgICAgICAgICAgICAgIHN0YXRzLnNjcmlwdHMuY291bnQr
KzsKLSAgICAgICAgICAgICAgICBzdGF0cy5zY3JpcHRzLnNpemUgKz0gby0+c2l6ZSgpOwotICAg
ICAgICAgICAgICAgIGJyZWFrOwotI2lmZGVmIEtIVE1MX1hTTFQKLSAgICAgICAgICAgIGNhc2Ug
Q2FjaGVkT2JqZWN0OjpYU0xTdHlsZVNoZWV0OgotICAgICAgICAgICAgICAgIHN0YXRzLnhzbFN0
eWxlU2hlZXRzLmNvdW50Kys7Ci0gICAgICAgICAgICAgICAgc3RhdHMueHNsU3R5bGVTaGVldHMu
c2l6ZSArPSBvLT5zaXplKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZm5k
ZWYgS0hUTUxfTk9fWEJMCi0gICAgICAgICAgICBjYXNlIENhY2hlZE9iamVjdDo6WEJMOgotICAg
ICAgICAgICAgICAgIHN0YXRzLnhibERvY3MuY291bnQrKzsKLSAgICAgICAgICAgICAgICBzdGF0
cy54YmxEb2NzLnNpemUgKz0gby0+c2l6ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotI2Vu
ZGlmCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHN0YXRzLm90aGVyLmNv
dW50Kys7Ci0gICAgICAgICAgICAgICAgc3RhdHMub3RoZXIuc2l6ZSArPSBvLT5zaXplKCk7Ci0g
ICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHN0YXRzOwotfQotCi12b2lkIENhY2hl
OjpmbHVzaEFsbCgpCi17Ci0gICAgaWYgKCFjYWNoZSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAg
Zm9yICg7OykgewotICAgICAgICBRRGljdEl0ZXJhdG9yPENhY2hlZE9iamVjdD4gaSgqY2FjaGUp
OwotICAgICAgICBDYWNoZWRPYmplY3QgKm8gPSBpLnRvRmlyc3QoKTsKLSAgICAgICAgaWYgKCFv
KQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIHJlbW92ZUNhY2hlRW50cnkobyk7Ci0gICAg
fQotfQotCi12b2lkIENhY2hlOjpzZXRDYWNoZURpc2FibGVkKGJvb2wgZGlzYWJsZWQpCi17Ci0g
ICAgY2FjaGVEaXNhYmxlZCA9IGRpc2FibGVkOwotICAgIGlmIChkaXNhYmxlZCkKLSAgICAgICAg
Zmx1c2hBbGwoKTsKLX0KK307CkluZGV4OiBtaXNjL0NhY2hlZFhTTFN0eWxlU2hlZXQuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIG1pc2MvQ2FjaGVkWFNMU3R5bGVTaGVldC5jcHAJKHJldmlzaW9uIDExOTQ4
KQorKysgbWlzYy9DYWNoZWRYU0xTdHlsZVNoZWV0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjUs
NjAwICsyNSwxNSBAQAogICAgIHBhZ2VzIGZyb20gdGhlIHdlYi4gSXQgaGFzIGEgbWVtb3J5IGNh
Y2hlIGZvciB0aGVzZSBvYmplY3RzLgogKi8KIAotI3VuZGVmIENBQ0hFX0RFQlVHCi0vLyNkZWZp
bmUgQ0FDSEVfREVCVUcKICNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4K
LQotI2luY2x1ZGUgImxvYWRlci5oIgotCi0vLyB1cCB0byB3aGljaCBzaXplIGlzIGEgcGljdHVy
ZSBmb3Igc3VyZSBjYWNoZWFibGUKLSNkZWZpbmUgTUFYQ0FDSEVBQkxFIDQwKjEwMjQKLS8vIGRl
ZmF1bHQgY2FjaGUgc2l6ZQotI2RlZmluZSBERUZDQUNIRVNJWkUgNDA5NioxMDI0Ci0KLSNpbmNs
dWRlIDxxYXN5bmNpby5oPgotI2luY2x1ZGUgPHFwYWludGVyLmg+Ci0KLSNpbmNsdWRlIDxraW8v
am9iLmg+Ci0jaW5jbHVkZSA8a2lvL2pvYmNsYXNzZXMuaD4KLSNpbmNsdWRlIDxraW1hZ2Vpby5o
PgotI2luY2x1ZGUgPGtjaGFyc2V0cy5oPgotI2luY2x1ZGUgPGtkZWJ1Zy5oPgotI2luY2x1ZGUg
ImtodG1sX2ZhY3RvcnkuaCIKLSNpbmNsdWRlICJraHRtbF9wYXJ0LmgiCi0jaW5jbHVkZSAiZGVj
b2Rlci5oIgotCi0jaW5jbHVkZSAiaHRtbC9odG1sX2RvY3VtZW50aW1wbC5oIgotI2luY2x1ZGUg
ImNzcy9jc3Nfc3R5bGVzaGVldGltcGwuaCIKLQotI2lmbmRlZiBLSFRNTF9OT19YQkwKLSNpbmNs
dWRlICJ4YmwveGJsX2RvY2ltcGwuaCIKLSNlbmRpZgorI2luY2x1ZGUgIkNhY2hlZFhTTFN0eWxl
U2hlZXQuaCIKKyNpbmNsdWRlICJDYWNoZS5oIgogCiAjaW5jbHVkZSA8a3htbGNvcmUvQXNzZXJ0
aW9ucy5oPgotI2luY2x1ZGUgIktXUUxvYWRlci5oIgogCi11c2luZyBuYW1lc3BhY2Uga2h0bWw7
CiB1c2luZyBuYW1lc3BhY2UgRE9NOwogCi1zdGF0aWMgYm9vbCBjYWNoZURpc2FibGVkOwotCi0v
LyBDYWxsIHRoaXMgIndhbGtlciIgaW5zdGVhZCBvZiBpdGVyYXRvciBzbyBwZW9wbGUgd29uJ3Qg
ZXhwZWN0IFF0IG9yIFNUTC1zdHlsZSBpdGVyYXRvciBpbnRlcmZhY2UuCi0vLyBKdXN0IGtlZXAg
Y2FsbGluZyBuZXh0KCkgb24gdGhpcy4gSXQncyBzYWZlIGZyb20gZGVsZXRpb25zIG9mIHRoZSBj
dXJyZW50IGl0ZW0KLWNsYXNzIENhY2hlZE9iamVjdENsaWVudFdhbGtlciB7Ci1wdWJsaWM6Ci0g
ICAgQ2FjaGVkT2JqZWN0Q2xpZW50V2Fsa2VyKGNvbnN0IFFQdHJEaWN0PENhY2hlZE9iamVjdENs
aWVudD4gJmNsaWVudHMpIDogX2N1cnJlbnQoMCksIF9pdGVyYXRvcihjbGllbnRzKSB7IH0KLSAg
ICBDYWNoZWRPYmplY3RDbGllbnQgKm5leHQoKTsKLXByaXZhdGU6Ci0gICAgQ2FjaGVkT2JqZWN0
Q2xpZW50ICpfY3VycmVudDsKLSAgICBRUHRyRGljdEl0ZXJhdG9yPENhY2hlZE9iamVjdENsaWVu
dD4gX2l0ZXJhdG9yOwotfTsKLQotQ2FjaGVkT2JqZWN0Ojp+Q2FjaGVkT2JqZWN0KCkKLXsKLSAg
ICBpZihtX2RlbGV0ZWQpIGFib3J0KCk7Ci0gICAgQ2FjaGU6OnJlbW92ZUZyb21MUlVMaXN0KHRo
aXMpOwotICAgIG1fZGVsZXRlZCA9IHRydWU7Ci0gICAgc2V0UmVzcG9uc2UoMCk7Ci0gICAgc2V0
QWxsRGF0YSgwKTsKLX0KLQotdm9pZCBDYWNoZWRPYmplY3Q6OmZpbmlzaCgpCi17Ci0gICAgaWYg
KG1fc2l6ZSA+IENhY2hlOjptYXhDYWNoZWFibGVPYmplY3RTaXplKCkpCi0gICAgICAgIG1fc3Rh
dHVzID0gVW5jYWNoZWFibGU7Ci0gICAgZWxzZQotICAgICAgICBtX3N0YXR1cyA9IENhY2hlZDsK
LSAgICBLVVJMIHVybChtX3VybC5xc3RyaW5nKCkpOwotICAgIGlmIChtX2V4cGlyZURhdGVDaGFu
Z2VkICYmIHVybC5wcm90b2NvbCgpLnN0YXJ0c1dpdGgoImh0dHAiKSkKLSAgICAgICAgbV9leHBp
cmVEYXRlQ2hhbmdlZCA9IGZhbHNlOwotfQotCi12b2lkIENhY2hlZE9iamVjdDo6c2V0RXhwaXJl
RGF0ZSh0aW1lX3QgX2V4cGlyZURhdGUsIGJvb2wgY2hhbmdlSHR0cENhY2hlKQotewotICAgIGlm
ICggX2V4cGlyZURhdGUgPT0gbV9leHBpcmVEYXRlKQotICAgICAgICByZXR1cm47Ci0KLSAgICBp
ZiAobV9zdGF0dXMgPT0gVW5jYWNoZWFibGUgfHwgbV9zdGF0dXMgPT0gQ2FjaGVkKQotICAgIHsK
LSAgICAgICAgZmluaXNoKCk7Ci0gICAgfQotICAgIG1fZXhwaXJlRGF0ZSA9IF9leHBpcmVEYXRl
OwotICAgIGlmIChjaGFuZ2VIdHRwQ2FjaGUgJiYgbV9leHBpcmVEYXRlKQotICAgICAgIG1fZXhw
aXJlRGF0ZUNoYW5nZWQgPSB0cnVlOwotfQotCi1ib29sIENhY2hlZE9iamVjdDo6aXNFeHBpcmVk
KCkgY29uc3QKLXsKLSAgICBpZiAoIW1fZXhwaXJlRGF0ZSkgcmV0dXJuIGZhbHNlOwotICAgIHRp
bWVfdCBub3cgPSB0aW1lKDApOwotICAgIHJldHVybiAoZGlmZnRpbWUobm93LCBtX2V4cGlyZURh
dGUpID49IDApOwotfQotCi12b2lkIENhY2hlZE9iamVjdDo6c2V0UmVxdWVzdChSZXF1ZXN0ICpf
cmVxdWVzdCkKLXsKLSAgICBpZiAoIF9yZXF1ZXN0ICYmICFtX3JlcXVlc3QgKQotICAgICAgICBt
X3N0YXR1cyA9IFBlbmRpbmc7Ci0gICAgbV9yZXF1ZXN0ID0gX3JlcXVlc3Q7Ci0gICAgaWYgKGNh
bkRlbGV0ZSgpICYmIG1fZnJlZSkKLSAgICAgICAgZGVsZXRlIHRoaXM7Ci0gICAgZWxzZSBpZiAo
YWxsb3dJbkxSVUxpc3QoKSkKLSAgICAgICAgQ2FjaGU6Omluc2VydEluTFJVTGlzdCh0aGlzKTsK
LX0KLQotdm9pZCBDYWNoZWRPYmplY3Q6OnJlZihDYWNoZWRPYmplY3RDbGllbnQgKmMpCi17Ci0g
ICAgbV9jbGllbnRzLmluc2VydChjLCBjKTsKLSAgICBDYWNoZTo6cmVtb3ZlRnJvbUxSVUxpc3Qo
dGhpcyk7Ci0gICAgaW5jcmVhc2VBY2Nlc3NDb3VudCgpOwotfQotCi12b2lkIENhY2hlZE9iamVj
dDo6ZGVyZWYoQ2FjaGVkT2JqZWN0Q2xpZW50ICpjKQotewotICAgIG1fY2xpZW50cy5yZW1vdmUo
Yyk7Ci0gICAgaWYgKGFsbG93SW5MUlVMaXN0KCkpCi0gICAgICAgIENhY2hlOjppbnNlcnRJbkxS
VUxpc3QodGhpcyk7Ci19Ci0KLXZvaWQgQ2FjaGVkT2JqZWN0OjpzZXRTaXplKGludCBzaXplKQot
ewotICAgIGJvb2wgc2l6ZUNoYW5nZWQgPSBDYWNoZTo6YWRqdXN0U2l6ZSh0aGlzLCBzaXplIC0g
bV9zaXplKTsKLQotICAgIC8vIFRoZSBvYmplY3QgbXVzdCBub3cgYmUgbW92ZWQgdG8gYSBkaWZm
ZXJlbnQgcXVldWUsIHNpbmNlIGl0cyBzaXplIGhhcyBiZWVuIGNoYW5nZWQuCi0gICAgaWYgKHNp
emVDaGFuZ2VkICYmIGFsbG93SW5MUlVMaXN0KCkpCi0gICAgICAgIENhY2hlOjpyZW1vdmVGcm9t
TFJVTGlzdCh0aGlzKTsKLQotICAgIG1fc2l6ZSA9IHNpemU7Ci0gICAgCi0gICAgaWYgKHNpemVD
aGFuZ2VkICYmIGFsbG93SW5MUlVMaXN0KCkpCi0gICAgICAgIENhY2hlOjppbnNlcnRJbkxSVUxp
c3QodGhpcyk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQot
Q2FjaGVkQ1NTU3R5bGVTaGVldDo6Q2FjaGVkQ1NTU3R5bGVTaGVldChEb2NMb2FkZXIqIGRsLCBj
b25zdCBET01TdHJpbmcgJnVybCwgS0lPOjpDYWNoZUNvbnRyb2wgX2NhY2hlUG9saWN5LCB0aW1l
X3QgX2V4cGlyZURhdGUsIGNvbnN0IFFTdHJpbmcmIGNoYXJzZXQpCi0gICAgOiBDYWNoZWRPYmpl
Y3QodXJsLCBDU1NTdHlsZVNoZWV0LCBfY2FjaGVQb2xpY3ksIF9leHBpcmVEYXRlKSwgbV9jb2Rl
YygwKQotewotICAgIC8vIEl0J3MgY3NzIHdlIHdhbnQuCi0gICAgc2V0QWNjZXB0KCJ0ZXh0L2Nz
cyIpOwotICAgIC8vIGxvYWQgdGhlIGZpbGUKLSAgICBDYWNoZTo6bG9hZGVyKCktPmxvYWQoZGws
IHRoaXMsIGZhbHNlKTsKLSAgICBtX2xvYWRpbmcgPSB0cnVlOwotICAgIGlmICghY2hhcnNldC5p
c0VtcHR5KCkpCi0JbV9jb2RlYyA9IFFUZXh0Q29kZWM6OmNvZGVjRm9yTmFtZShjaGFyc2V0Lmxh
dGluMSgpKTsKLSAgICBpZiAoIW1fY29kZWMpCi0gICAgICAgIG1fY29kZWMgPSBRVGV4dENvZGVj
Ojpjb2RlY0Zvck5hbWUoImlzbzg4NTktMSIpOwotfQotCi1DYWNoZWRDU1NTdHlsZVNoZWV0OjpD
YWNoZWRDU1NTdHlsZVNoZWV0KGNvbnN0IERPTVN0cmluZyAmdXJsLCBjb25zdCBRU3RyaW5nICZz
dHlsZXNoZWV0X2RhdGEpCi0gICAgOiBDYWNoZWRPYmplY3QodXJsLCBDU1NTdHlsZVNoZWV0LCBL
SU86OkNDX1ZlcmlmeSwgMCwgc3R5bGVzaGVldF9kYXRhLmxlbmd0aCgpKQotewotICAgIG1fbG9h
ZGluZyA9IGZhbHNlOwotICAgIG1fc3RhdHVzID0gUGVyc2lzdGVudDsKLSAgICBtX2NvZGVjID0g
MDsKLSAgICBtX3NoZWV0ID0gRE9NU3RyaW5nKHN0eWxlc2hlZXRfZGF0YSk7Ci19Ci0KLQotQ2Fj
aGVkQ1NTU3R5bGVTaGVldDo6fkNhY2hlZENTU1N0eWxlU2hlZXQoKQotewotfQotCi12b2lkIENh
Y2hlZENTU1N0eWxlU2hlZXQ6OnJlZihDYWNoZWRPYmplY3RDbGllbnQgKmMpCi17Ci0gICAgQ2Fj
aGVkT2JqZWN0OjpyZWYoYyk7Ci0KLSAgICBpZighbV9sb2FkaW5nKSBjLT5zZXRTdHlsZVNoZWV0
KCBtX3VybCwgbV9zaGVldCApOwotfQotCi12b2lkIENhY2hlZENTU1N0eWxlU2hlZXQ6OmRlcmVm
KENhY2hlZE9iamVjdENsaWVudCAqYykKLXsKLSAgICBDYWNoZTo6Zmx1c2goKTsKLSAgICBDYWNo
ZWRPYmplY3Q6OmRlcmVmKGMpOwotICAgIGlmICggY2FuRGVsZXRlKCkgJiYgbV9mcmVlICkKLSAg
ICAgIGRlbGV0ZSB0aGlzOwotfQotCi12b2lkIENhY2hlZENTU1N0eWxlU2hlZXQ6OnNldENoYXJz
ZXQoIGNvbnN0IFFTdHJpbmcgJmNocyApCi17Ci0gICAgaWYgKCFjaHMuaXNFbXB0eSgpKSB7Ci0g
ICAgICAgIFFUZXh0Q29kZWMgKmNvZGVjID0gUVRleHRDb2RlYzo6Y29kZWNGb3JOYW1lKGNocy5s
YXRpbjEoKSk7Ci0gICAgICAgIGlmIChjb2RlYykKLSAgICAgICAgICAgIG1fY29kZWMgPSBjb2Rl
YzsKLSAgICB9Ci19Ci0KLXZvaWQgQ2FjaGVkQ1NTU3R5bGVTaGVldDo6ZGF0YSggUUJ1ZmZlciAm
YnVmZmVyLCBib29sIGVvZiApCi17Ci0gICAgaWYoIWVvZikgcmV0dXJuOwotICAgIGJ1ZmZlci5j
bG9zZSgpOwotICAgIHNldFNpemUoYnVmZmVyLmJ1ZmZlcigpLnNpemUoKSk7Ci0gICAgUVN0cmlu
ZyBkYXRhID0gbV9jb2RlYy0+dG9Vbmljb2RlKCBidWZmZXIuYnVmZmVyKCkuZGF0YSgpLCBzaXpl
KCkgKTsKLSAgICBtX3NoZWV0ID0gRE9NU3RyaW5nKGRhdGEpOwotICAgIG1fbG9hZGluZyA9IGZh
bHNlOwotCi0gICAgY2hlY2tOb3RpZnkoKTsKLX0KLQotdm9pZCBDYWNoZWRDU1NTdHlsZVNoZWV0
OjpjaGVja05vdGlmeSgpCi17Ci0gICAgaWYgKG1fbG9hZGluZykKLSAgICAgICAgcmV0dXJuOwot
Ci0gICAgQ2FjaGVkT2JqZWN0Q2xpZW50V2Fsa2VyIHcobV9jbGllbnRzKTsKLSAgICB3aGlsZSAo
Q2FjaGVkT2JqZWN0Q2xpZW50ICpjID0gdy5uZXh0KCkpIHsKLSAgICAgICAgaWYgKG1fcmVzcG9u
c2UgJiYgIUtXUUlzUmVzcG9uc2VVUkxFcXVhbFRvVVJMKG1fcmVzcG9uc2UsIG1fdXJsKSkKLSAg
ICAgICAgICAgIGMtPnNldFN0eWxlU2hlZXQoRE9NU3RyaW5nKEtXUVJlc3BvbnNlVVJMKG1fcmVz
cG9uc2UpKSwgbV9zaGVldCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGMtPnNldFN0eWxl
U2hlZXQobV91cmwsIG1fc2hlZXQpOwotICAgIH0KLX0KLQotCi12b2lkIENhY2hlZENTU1N0eWxl
U2hlZXQ6OmVycm9yKCBpbnQgLyplcnIqLywgY29uc3QgY2hhciAqLyp0ZXh0Ki8gKQotewotICAg
IG1fbG9hZGluZyA9IGZhbHNlOwotICAgIGNoZWNrTm90aWZ5KCk7Ci19Ci0KLS8vIC0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQ2FjaGVkU2NyaXB0OjpDYWNoZWRTY3JpcHQo
RG9jTG9hZGVyKiBkbCwgY29uc3QgRE9NU3RyaW5nICZ1cmwsIEtJTzo6Q2FjaGVDb250cm9sIF9j
YWNoZVBvbGljeSwgdGltZV90IF9leHBpcmVEYXRlLCBjb25zdCBRU3RyaW5nJiBjaGFyc2V0KQot
ICAgIDogQ2FjaGVkT2JqZWN0KHVybCwgU2NyaXB0LCBfY2FjaGVQb2xpY3ksIF9leHBpcmVEYXRl
KSwgbV9jb2RlYygwKQotewotICAgIC8vIEl0J3MgamF2YXNjcmlwdCB3ZSB3YW50LgotICAgIC8v
IEJ1dCBzb21lIHdlYnNpdGVzIHRoaW5rIHRoZWlyIHNjcmlwdHMgYXJlIDxzb21lIHdyb25nIG1p
bWV0eXBlIGhlcmU+Ci0gICAgLy8gYW5kIHJlZnVzZSB0byBzZXJ2ZSB0aGVtIGlmIHdlIG9ubHkg
YWNjZXB0IGFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdC4KLSAgICBzZXRBY2NlcHQoIiovKiIpOwot
ICAgIG1fZXJyb3JPY2N1cnJlZCA9IGZhbHNlOwotICAgIC8vIGxvYWQgdGhlIGZpbGUKLSAgICBD
YWNoZTo6bG9hZGVyKCktPmxvYWQoZGwsIHRoaXMsIGZhbHNlKTsKLSAgICBtX2xvYWRpbmcgPSB0
cnVlOwotICAgIGlmICghY2hhcnNldC5pc0VtcHR5KCkpCi0gICAgICAgIG1fY29kZWMgPSBRVGV4
dENvZGVjOjpjb2RlY0Zvck5hbWUoY2hhcnNldC5sYXRpbjEoKSk7Ci0gICAgaWYgKCFtX2NvZGVj
KQotCW1fY29kZWMgPSBRVGV4dENvZGVjOjpjb2RlY0Zvck5hbWUoImlzbzg4NTktMSIpOwotfQot
Ci1DYWNoZWRTY3JpcHQ6OkNhY2hlZFNjcmlwdChjb25zdCBET01TdHJpbmcgJnVybCwgY29uc3Qg
UVN0cmluZyAmc2NyaXB0X2RhdGEpCi0gICAgOiBDYWNoZWRPYmplY3QodXJsLCBTY3JpcHQsIEtJ
Tzo6Q0NfVmVyaWZ5LCAwLCBzY3JpcHRfZGF0YS5sZW5ndGgoKSkKLXsKLSAgICBtX2Vycm9yT2Nj
dXJyZWQgPSBmYWxzZTsKLSAgICBtX2xvYWRpbmcgPSBmYWxzZTsKLSAgICBtX3N0YXR1cyA9IFBl
cnNpc3RlbnQ7Ci0gICAgbV9jb2RlYyA9IDA7Ci0gICAgbV9zY3JpcHQgPSBET01TdHJpbmcoc2Ny
aXB0X2RhdGEpOwotfQotCi1DYWNoZWRTY3JpcHQ6On5DYWNoZWRTY3JpcHQoKQotewotfQotCi12
b2lkIENhY2hlZFNjcmlwdDo6cmVmKENhY2hlZE9iamVjdENsaWVudCAqYykKLXsKLSAgICBDYWNo
ZWRPYmplY3Q6OnJlZihjKTsKLQotICAgIGlmKCFtX2xvYWRpbmcpIGMtPm5vdGlmeUZpbmlzaGVk
KHRoaXMpOwotfQotCi12b2lkIENhY2hlZFNjcmlwdDo6ZGVyZWYoQ2FjaGVkT2JqZWN0Q2xpZW50
ICpjKQotewotICAgIENhY2hlOjpmbHVzaCgpOwotICAgIENhY2hlZE9iamVjdDo6ZGVyZWYoYyk7
Ci0gICAgaWYgKCBjYW5EZWxldGUoKSAmJiBtX2ZyZWUgKQotICAgICAgZGVsZXRlIHRoaXM7Ci19
Ci0KLXZvaWQgQ2FjaGVkU2NyaXB0OjpzZXRDaGFyc2V0KCBjb25zdCBRU3RyaW5nICZjaHMgKQot
ewotICAgIGlmICghY2hzLmlzRW1wdHkoKSkgewotICAgICAgICBRVGV4dENvZGVjICpjb2RlYyA9
IFFUZXh0Q29kZWM6OmNvZGVjRm9yTmFtZShjaHMubGF0aW4xKCkpOwotICAgICAgICBpZiAoY29k
ZWMpCi0gICAgICAgICAgICBtX2NvZGVjID0gY29kZWM7Ci0gICAgfQotfQotCi12b2lkIENhY2hl
ZFNjcmlwdDo6ZGF0YSggUUJ1ZmZlciAmYnVmZmVyLCBib29sIGVvZiApCi17Ci0gICAgaWYoIWVv
ZikgcmV0dXJuOwotICAgIGJ1ZmZlci5jbG9zZSgpOwotICAgIHNldFNpemUoYnVmZmVyLmJ1ZmZl
cigpLnNpemUoKSk7Ci0gICAgUVN0cmluZyBkYXRhID0gbV9jb2RlYy0+dG9Vbmljb2RlKCBidWZm
ZXIuYnVmZmVyKCkuZGF0YSgpLCBzaXplKCkgKTsKLSAgICBtX3NjcmlwdCA9IERPTVN0cmluZyhk
YXRhKTsKLSAgICBtX2xvYWRpbmcgPSBmYWxzZTsKLSAgICBjaGVja05vdGlmeSgpOwotfQotCi12
b2lkIENhY2hlZFNjcmlwdDo6Y2hlY2tOb3RpZnkoKQotewotICAgIGlmKG1fbG9hZGluZykgcmV0
dXJuOwotCi0gICAgQ2FjaGVkT2JqZWN0Q2xpZW50V2Fsa2VyIHcobV9jbGllbnRzKTsKLSAgICB3
aGlsZSAoQ2FjaGVkT2JqZWN0Q2xpZW50ICpjID0gdy5uZXh0KCkpCi0gICAgICAgIGMtPm5vdGlm
eUZpbmlzaGVkKHRoaXMpOwotfQotCi0KLXZvaWQgQ2FjaGVkU2NyaXB0OjplcnJvciggaW50IC8q
ZXJyKi8sIGNvbnN0IGNoYXIgKi8qdGV4dCovICkKLXsKLSAgICBtX2xvYWRpbmcgPSBmYWxzZTsK
LSAgICBtX2Vycm9yT2NjdXJyZWQgPSB0cnVlOwotICAgIGNoZWNrTm90aWZ5KCk7Ci19Ci0KLS8v
IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLXN0YXRpYyBib29sIGNyb3Nz
RG9tYWluKGNvbnN0IFFTdHJpbmcgJmEsIGNvbnN0IFFTdHJpbmcgJmIpCi17Ci0gICAgaWYgKGEg
PT0gYikgcmV0dXJuIGZhbHNlOwotCi0gICAgUVN0cmluZ0xpc3QgbDEgPSBRU3RyaW5nTGlzdDo6
c3BsaXQoJy4nLCBhKTsKLSAgICBRU3RyaW5nTGlzdCBsMiA9IFFTdHJpbmdMaXN0OjpzcGxpdCgn
LicsIGIpOwotCi0gICAgd2hpbGUobDEuY291bnQoKSA+IGwyLmNvdW50KCkpCi0gICAgICAgIGwx
LnBvcF9mcm9udCgpOwotCi0gICAgd2hpbGUobDIuY291bnQoKSA+IGwxLmNvdW50KCkpCi0gICAg
ICAgIGwyLnBvcF9mcm9udCgpOwotCi0gICAgd2hpbGUobDIuY291bnQoKSA+PSAyKQotICAgIHsK
LSAgICAgICAgaWYgKGwxID09IGwyKQotICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAg
ICAgbDEucG9wX2Zyb250KCk7Ci0gICAgICAgIGwyLnBvcF9mcm9udCgpOwotICAgIH0KLSAgICBy
ZXR1cm4gdHJ1ZTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotdm9pZCBD
YWNoZWRJbWFnZUNhbGxiYWNrOjpub3RpZnlVcGRhdGUoKSAKLXsgCi0gICAgaWYgKGNhY2hlZElt
YWdlKSB7Ci0gICAgICAgIGNhY2hlZEltYWdlLT5kb19ub3RpZnkgKGNhY2hlZEltYWdlLT5waXht
YXAoKSwgY2FjaGVkSW1hZ2UtPnBpeG1hcCgpLnJlY3QoKSk7IAotICAgICAgICBRU2l6ZSBzID0g
Y2FjaGVkSW1hZ2UtPnBpeG1hcF9zaXplKCk7Ci0gICAgICAgIGNhY2hlZEltYWdlLT5zZXRTaXpl
KHMud2lkdGgoKSAqIHMuaGVpZ2h0KCkgKiAyKTsKLQotICAgICAgICAvLyBBZnRlciByZWNlaXZp
bmcgdGhlIGltYWdlIGhlYWRlciB3ZSBhcmUgZ3VhcmFudGVlZCB0byBrbm93Ci0gICAgICAgIC8v
IHRoZSBpbWFnZSBzaXplLiAgQWx0aG91Z2ggYWxsIG9mIHRoZSBkYXRhIG1heSBub3QgaGF2ZSBh
cnJpdmVkIG9yCi0gICAgICAgIC8vIGJlZW4gZGVjb2RlZCB3ZSBjYW4gY29uc2lkZXIgdGhlIGlt
YWdlIGxvYWRlZCBmb3IgcHVycG9zZWQgb2YKLSAgICAgICAgLy8gbGF5b3V0IGFuZCBkaXNwYXRj
aGluZyB0aGUgaW1hZ2UncyBvbmxvYWQgaGFuZGxlci4gIFJlbW92aW5nIHRoZSByZXF1ZXN0IGZy
b20KLSAgICAgICAgLy8gdGhlIGxpc3Qgb2YgYmFja2dyb3VuZCBkZWNvZGluZyByZXF1ZXN0cyB3
aWxsIGVuc3VyZSB0aGF0IExvYWRlcjo6bnVtUmVxdWVzdHMoKSAKLSAgICAgICAgLy8gZG9lcyBu
b3QgY291bnQgdGhpcyBiYWNrZ3JvdW5kIHJlcXVlc3QuICBGdXJ0aGVyIG51bVJlcXVlc3RzKCkg
Y2FuCi0gICAgICAgIC8vIGJlIGNvcnJlY3RseSB1c2VkIGJ5IHRoZSBwYXJ0IHRvIGRldGVybWlu
ZSBpZiBsb2FkaW5nIGlzIHN1ZmZpY2llbnRseQotICAgICAgICAvLyBjb21wbGV0ZSB0byBkaXNw
YXRjaCB0aGUgcGFnZSdzIG9ubG9hZCBoYW5kbGVyLgotICAgICAgICBSZXF1ZXN0ICpyID0gY2Fj
aGVkSW1hZ2UtPm1fcmVxdWVzdDsKLSAgICAgICAgRG9jTG9hZGVyICpkbCA9IHItPm1fZG9jTG9h
ZGVyOwotCi0gICAgICAgIGtodG1sOjpDYWNoZTo6bG9hZGVyKCktPnJlbW92ZUJhY2tncm91bmRE
ZWNvZGluZ1JlcXVlc3Qocik7Ci0KLSAgICAgICAgLy8gUG9rZSB0aGUgcGFydCB0byBnZXQgaXQg
dG8gZG8gYSBjaGVja0NvbXBsZXRlZCgpLiAgT25seSBkbyB0aGlzIGZvcgotICAgICAgICAvLyB0
aGUgZmlyc3QgdXBkYXRlIHRvIG1pbmltaXplIHdvcmsuICBOb3RlIHRoYXQgd2UgYXJlIGd1YXJh
bnRlZWQgdG8gaGF2ZQotICAgICAgICAvLyByZWFkIHRoZSBoZWFkZXIgd2hlbiB3ZSByZWNlaXZl
ZCB0aGlzIGZpcnN0IHVwZGF0ZSwgd2hpY2ggaXMgdHJpZ2dlcmVkCi0gICAgICAgIC8vIGJ5IHRo
ZSBmaXJzdCBrQ0dJbWFnZVN0YXR1c0luY29tcGxldGUgc3RhdHVzIGZyb20gQ0cuIGtDR0ltYWdl
U3RhdHVzSW5jb21wbGV0ZQotICAgICAgICAvLyByZWFsbHkgbWVhbnMgdGhhdCB0aGUgQ0cgZGVj
b2RlciBpcyB3YWl0aW5nIGZvciBtb3JlIGRhdGEsIGJ1dCBoYXMgYWxyZWFkeQotICAgICAgICAv
LyByZWFkIHRoZSBoZWFkZXIuCi0gICAgICAgIGlmICghaGVhZGVyUmVjZWl2ZWQpIHsKLSAgICAg
ICAgICAgIGVtaXQga2h0bWw6OkNhY2hlOjpsb2FkZXIoKS0+cmVxdWVzdERvbmUoIGRsLCBjYWNo
ZWRJbWFnZSApOwotICAgICAgICAgICAgaGVhZGVyUmVjZWl2ZWQgPSB0cnVlOwotICAgICAgICB9
Ci0gICAgfQotfQotCi12b2lkIENhY2hlZEltYWdlQ2FsbGJhY2s6Om5vdGlmeUZpbmlzaGVkKCkK
LXsKLSAgICBpZiAoY2FjaGVkSW1hZ2UpIHsKLSAgICAgICAgY2FjaGVkSW1hZ2UtPmRvX25vdGlm
eSAoY2FjaGVkSW1hZ2UtPnBpeG1hcCgpLCBjYWNoZWRJbWFnZS0+cGl4bWFwKCkucmVjdCgpKTsg
Ci0gICAgICAgIGNhY2hlZEltYWdlLT5tX2xvYWRpbmcgPSBmYWxzZTsKLSAgICAgICAgY2FjaGVk
SW1hZ2UtPmNoZWNrTm90aWZ5KCk7Ci0gICAgICAgIFFTaXplIHMgPSBjYWNoZWRJbWFnZS0+cGl4
bWFwX3NpemUoKTsKLSAgICAgICAgY2FjaGVkSW1hZ2UtPnNldFNpemUocy53aWR0aCgpICogcy5o
ZWlnaHQoKSAqIDIpOwotCQotICAgICAgICBSZXF1ZXN0ICpyID0gY2FjaGVkSW1hZ2UtPm1fcmVx
dWVzdDsKLSAgICAgICAgRG9jTG9hZGVyICpkbCA9IHItPm1fZG9jTG9hZGVyOwotCi0gICAgICAg
IGtodG1sOjpDYWNoZTo6bG9hZGVyKCktPnJlbW92ZUJhY2tncm91bmREZWNvZGluZ1JlcXVlc3Qo
cik7Ci0KLSAgICAgICAgLy8gUG9rZSB0aGUgcGFydCB0byBnZXQgaXQgdG8gZG8gYSBjaGVja0Nv
bXBsZXRlZCgpLgotICAgICAgICBlbWl0IGtodG1sOjpDYWNoZTo6bG9hZGVyKCktPnJlcXVlc3RE
b25lKCBkbCwgY2FjaGVkSW1hZ2UgKTsKLSAgICAgICAgCi0gICAgICAgIGRlbGV0ZSByOwotICAg
IH0KLX0KLQotdm9pZCBDYWNoZWRJbWFnZUNhbGxiYWNrOjpub3RpZnlEZWNvZGluZ0Vycm9yKCkK
LXsKLSAgICBpZiAoY2FjaGVkSW1hZ2UpIHsKLSAgICAgICAgaGFuZGxlRXJyb3IoKTsKLSAgICB9
Ci19Ci0KLXZvaWQgQ2FjaGVkSW1hZ2VDYWxsYmFjazo6aGFuZGxlRXJyb3IoKQotewotICAgIGlm
IChjYWNoZWRJbWFnZSkgewotICAgICAgICBjYWNoZWRJbWFnZS0+ZXJyb3JPY2N1cmVkID0gdHJ1
ZTsKLSAgICAgICAgUVBpeG1hcCBlcCA9IGNhY2hlZEltYWdlLT5waXhtYXAoKTsKLSAgICAgICAg
Y2FjaGVkSW1hZ2UtPmRvX25vdGlmeSAoZXAsIGVwLnJlY3QoKSk7Ci0gICAgICAgIENhY2hlOjpy
ZW1vdmVDYWNoZUVudHJ5IChjYWNoZWRJbWFnZSk7Ci0KLSAgICAgICAgY2xlYXIoKTsKLSAgICB9
Ci19Ci0KLXZvaWQgQ2FjaGVkSW1hZ2VDYWxsYmFjazo6Y2xlYXIoKSAKLXsKLSAgICBpZiAoY2Fj
aGVkSW1hZ2UgJiYgY2FjaGVkSW1hZ2UtPm1fcmVxdWVzdCkgewotICAgICAgICBSZXF1ZXN0ICpy
ID0gY2FjaGVkSW1hZ2UtPm1fcmVxdWVzdDsKLSAgICAgICAgRG9jTG9hZGVyICpkbCA9IHItPm1f
ZG9jTG9hZGVyOwotCi0gICAgICAgIGtodG1sOjpDYWNoZTo6bG9hZGVyKCktPnJlbW92ZUJhY2tn
cm91bmREZWNvZGluZ1JlcXVlc3Qocik7Ci0KLSAgICAgICAgLy8gUG9rZSB0aGUgcGFydCB0byBn
ZXQgaXQgdG8gZG8gYSBjaGVja0NvbXBsZXRlZCgpLgotICAgICAgICBlbWl0IGtodG1sOjpDYWNo
ZTo6bG9hZGVyKCktPnJlcXVlc3RGYWlsZWQoIGRsLCBjYWNoZWRJbWFnZSApOwotCi0gICAgICAg
IGRlbGV0ZSByOwotICAgIH0KLSAgICBjYWNoZWRJbWFnZSA9IDA7Ci19Ci0KLUNhY2hlZEltYWdl
OjpDYWNoZWRJbWFnZShEb2NMb2FkZXIqIGRsLCBjb25zdCBET01TdHJpbmcgJnVybCwgS0lPOjpD
YWNoZUNvbnRyb2wgX2NhY2hlUG9saWN5LCB0aW1lX3QgX2V4cGlyZURhdGUpCi0gICAgOiBRT2Jq
ZWN0KCksIENhY2hlZE9iamVjdCh1cmwsIEltYWdlLCBfY2FjaGVQb2xpY3ksIF9leHBpcmVEYXRl
KQotICAgICwgbV9kYXRhU2l6ZSgwKQotewotICAgIHAgPSAwOwotICAgIHBpeFBhcnQgPSAwOwot
ICAgIGJnID0gMDsKLSAgICBpc0Z1bGx5VHJhbnNwYXJlbnQgPSBmYWxzZTsKLSAgICBlcnJvck9j
Y3VyZWQgPSBmYWxzZTsKLSAgICBtb25vY2hyb21lID0gZmFsc2U7Ci0gICAgZm9ybWF0VHlwZSA9
IDA7Ci0gICAgbV9zdGF0dXMgPSBVbmtub3duOwotICAgIGltZ1NvdXJjZSA9IDA7Ci0gICAgbV9s
b2FkaW5nID0gdHJ1ZTsKLSAgICBtX3Nob3dBbmltYXRpb25zID0gZGwtPnNob3dBbmltYXRpb25z
KCk7Ci0gICAgaWYgKFFQaXhtYXA6OnNob3VsZFVzZVRocmVhZGVkRGVjb2RpbmcoKSkKLSAgICAg
ICAgbV9kZWNvZGVyQ2FsbGJhY2sgPSBuZXcgQ2FjaGVkSW1hZ2VDYWxsYmFjayh0aGlzKTsKLSAg
ICBlbHNlCi0gICAgICAgIG1fZGVjb2RlckNhbGxiYWNrID0gMDsKLX0KLQotQ2FjaGVkSW1hZ2U6
On5DYWNoZWRJbWFnZSgpCi17Ci0gICAgY2xlYXIoKTsKLX0KLQotdm9pZCBDYWNoZWRJbWFnZTo6
cmVmKCBDYWNoZWRPYmplY3RDbGllbnQgKmMgKQotewotICAgIENhY2hlZE9iamVjdDo6cmVmKGMp
OwotCi0gICAgLy8gZm9yIG1vdXNlb3ZlcnMsIGR5bmFtaWMgY2hhbmdlcwotICAgIGlmICghdmFs
aWRfcmVjdCgpLmlzTnVsbCgpKQotICAgICAgICBjLT5zZXRQaXhtYXAoIHBpeG1hcCgpLCB2YWxp
ZF9yZWN0KCksIHRoaXMpOwotCi0gICAgaWYoIW1fbG9hZGluZykKLSAgICAgICAgYy0+bm90aWZ5
RmluaXNoZWQodGhpcyk7Ci19Ci0KLXZvaWQgQ2FjaGVkSW1hZ2U6OmRlcmVmKCBDYWNoZWRPYmpl
Y3RDbGllbnQgKmMgKQotewotICAgIENhY2hlOjpmbHVzaCgpOwotICAgIENhY2hlZE9iamVjdDo6
ZGVyZWYoYyk7Ci0gICAgaWYgKCBjYW5EZWxldGUoKSAmJiBtX2ZyZWUgKQotICAgICAgICBkZWxl
dGUgdGhpczsKLX0KLQotY29uc3QgUVBpeG1hcCAmQ2FjaGVkSW1hZ2U6OnRpbGVkX3BpeG1hcChj
b25zdCBRQ29sb3ImIG5ld2MpCi17Ci0gICAgcmV0dXJuIHBpeG1hcCgpOwotfQotCi1jb25zdCBR
UGl4bWFwICZDYWNoZWRJbWFnZTo6cGl4bWFwKCApIGNvbnN0Ci17Ci0gICAgaWYoZXJyb3JPY2N1
cmVkKQotICAgICAgICByZXR1cm4gKkNhY2hlOjpicm9rZW5QaXhtYXA7Ci0KLSAgICBpZiAocCkK
LSAgICAgICAgcmV0dXJuICpwOwotCi0gICAgcmV0dXJuICpDYWNoZTo6bnVsbFBpeG1hcDsKLX0K
LQotUVNpemUgQ2FjaGVkSW1hZ2U6OnBpeG1hcF9zaXplKCkgY29uc3QKLXsKLSAgICByZXR1cm4g
KHAgPyBwLT5zaXplKCkgOiBRU2l6ZSgpKTsKLX0KLQotUVJlY3QgQ2FjaGVkSW1hZ2U6OnZhbGlk
X3JlY3QoKSBjb25zdAotewotICAgIHJldHVybiAocCA/IHAtPnJlY3QoKSA6IFFSZWN0KCkpOwot
fQotCi12b2lkIENhY2hlZEltYWdlOjpkb19ub3RpZnkoY29uc3QgUVBpeG1hcCYgcCwgY29uc3Qg
UVJlY3QmIHIpCi17Ci0gICAgQ2FjaGVkT2JqZWN0Q2xpZW50V2Fsa2VyIHcobV9jbGllbnRzKTsK
LSAgICB3aGlsZSAoQ2FjaGVkT2JqZWN0Q2xpZW50ICpjID0gdy5uZXh0KCkpCi0gICAgICAgIGMt
PnNldFBpeG1hcChwLCByLCB0aGlzKTsKLX0KLQotdm9pZCBDYWNoZWRJbWFnZTo6c2V0U2hvd0Fu
aW1hdGlvbnMoIEtIVE1MU2V0dGluZ3M6OktBbmltYXRpb25BZHZpY2Ugc2hvd0FuaW1hdGlvbnMg
KQotewotICAgIG1fc2hvd0FuaW1hdGlvbnMgPSBzaG93QW5pbWF0aW9uczsKLX0KLQotdm9pZCBD
YWNoZWRJbWFnZTo6Y2xlYXIoKQotewotICAgIGRlbGV0ZSBwOyAgIHAgPSAwOwotICAgIGRlbGV0
ZSBiZzsgIGJnID0gMDsKLSAgICBkZWxldGUgcGl4UGFydDsgcGl4UGFydCA9IDA7Ci0KLSAgICBm
b3JtYXRUeXBlID0gMDsKLQotICAgIHNldFNpemUoMCk7Ci0KLSAgICAvLyBObyBuZWVkIHRvIGRl
bGV0ZSBpbWFnZVNvdXJjZSAtIFFNb3ZpZSBkb2VzIGl0IGZvciB1cwotICAgIGltZ1NvdXJjZSA9
IDA7Ci0KLSAgICBpZiAobV9kZWNvZGVyQ2FsbGJhY2spIHsKLSAgICAgICAgbV9kZWNvZGVyQ2Fs
bGJhY2stPmNsZWFyKCk7Ci0gICAgICAgIG1fZGVjb2RlckNhbGxiYWNrLT5kZXJlZigpOwotICAg
ICAgICBtX2RlY29kZXJDYWxsYmFjayA9IDA7Ci0gICAgfQotfQotCi12b2lkIENhY2hlZEltYWdl
OjpkYXRhICggUUJ1ZmZlciAmX2J1ZmZlciwgYm9vbCBlb2YgKQotewotI2lmZGVmIENBQ0hFX0RF
QlVHCi0gICAga2REZWJ1ZyggNjA2MCApIDw8IHRoaXMgPDwgImluIENhY2hlZEltYWdlOjpkYXRh
KGJ1ZmZlcnNpemUgIiA8PCBfYnVmZmVyLmJ1ZmZlcigpLnNpemUoKSA8PCIsIGVvZj0iIDw8IGVv
ZiA8PCBlbmRsOwotI2VuZGlmCi0KLSAgICBib29sIGNhbkRyYXcgPSBmYWxzZTsKLSAgICAKLSAg
ICBtX2RhdGFTaXplID0gX2J1ZmZlci5zaXplKCk7Ci0gICAgICAgIAotICAgIC8vIElmIHdlJ3Jl
IGF0IGVvZiBhbmQgZG9uJ3QgaGF2ZSBhIHBpeG1hcCB5ZXQsIHRoZSBkYXRhCi0gICAgLy8gbXVz
dCBoYXZlIGFycml2ZWQgaW4gb25lIGNodW5rLiAgVGhpcyBhdm9pZHMgdGhlIGF0dGVtcHQKLSAg
ICAvLyB0byBwZXJmb3JtIGluY3JlbWVudGFsIGRlY29kaW5nLgotICAgIGlmIChlb2YgJiYgIXAp
IHsKLSAgICAgICAgcCA9IG5ldyBRUGl4bWFwKF9idWZmZXIuYnVmZmVyKCksIEtXUVJlc3BvbnNl
TUlNRVR5cGUobV9yZXNwb25zZSkpOwotICAgICAgICBpZiAobV9kZWNvZGVyQ2FsbGJhY2spCi0g
ICAgICAgICAgICBtX2RlY29kZXJDYWxsYmFjay0+bm90aWZ5RmluaXNoZWQoKTsKLSAgICAgICAg
Y2FuRHJhdyA9IHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gQWx3YXlzIGF0dGVtcHQg
dG8gbG9hZCB0aGUgaW1hZ2UgaW5jcmVtZW50YWxseS4KLSAgICAgICAgaWYgKCFwKQotICAgICAg
ICAgICAgcCA9IG5ldyBRUGl4bWFwKEtXUVJlc3BvbnNlTUlNRVR5cGUobV9yZXNwb25zZSkpOwot
ICAgICAgICBjYW5EcmF3ID0gcC0+cmVjZWl2ZWREYXRhKF9idWZmZXIuYnVmZmVyKCksIGVvZiwg
bV9kZWNvZGVyQ2FsbGJhY2spOwotICAgIH0KLSAgICAKLSAgICAvLyBJZiB3ZSBoYXZlIGEgZGVj
b2Rlciwgd2UnbGwgYmUgbm90aWZpZWQgd2hlbiBkZWNvZGluZyBoYXMgY29tcGxldGVkLgotICAg
IGlmICghbV9kZWNvZGVyQ2FsbGJhY2spIHsKLSAgICAgICAgaWYgKGNhbkRyYXcgfHwgZW9mKSB7
Ci0gICAgICAgICAgICBpZiAocC0+aXNOdWxsKCkpIHsKLSAgICAgICAgICAgICAgICBlcnJvck9j
Y3VyZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIFFQaXhtYXAgZXAgPSBwaXhtYXAoKTsKLSAg
ICAgICAgICAgICAgICBkb19ub3RpZnkgKGVwLCBlcC5yZWN0KCkpOwotICAgICAgICAgICAgICAg
IENhY2hlOjpyZW1vdmVDYWNoZUVudHJ5ICh0aGlzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAg
ICAgIGVsc2UKLSAgICAgICAgICAgICAgICBkb19ub3RpZnkoKnAsIHAtPnJlY3QoKSk7Ci0KLSAg
ICAgICAgICAgIFFTaXplIHMgPSBwaXhtYXBfc2l6ZSgpOwotICAgICAgICAgICAgc2V0U2l6ZShz
LndpZHRoKCkgKiBzLmhlaWdodCgpICogMik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGVvZikg
ewotICAgICAgICAgICAgbV9sb2FkaW5nID0gZmFsc2U7Ci0gICAgICAgICAgICBjaGVja05vdGlm
eSgpOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIENhY2hlZEltYWdlOjplcnJvciggaW50
IC8qZXJyKi8sIGNvbnN0IGNoYXIgKi8qdGV4dCovICkKLXsKLSNpZmRlZiBDQUNIRV9ERUJVRwot
ICAgIGtkRGVidWcoNjA2MCkgPDwgIkNhaGNlZEltYWdlOjplcnJvciIgPDwgZW5kbDsKLSNlbmRp
ZgotCi0gICAgY2xlYXIoKTsKLSAgICBlcnJvck9jY3VyZWQgPSB0cnVlOwotICAgIGRvX25vdGlm
eShwaXhtYXAoKSwgUVJlY3QoMCwgMCwgMTYsIDE2KSk7Ci0gICAgbV9sb2FkaW5nID0gZmFsc2U7
Ci0gICAgY2hlY2tOb3RpZnkoKTsKLX0KLQotdm9pZCBDYWNoZWRJbWFnZTo6Y2hlY2tOb3RpZnko
KQotewotICAgIGlmKG1fbG9hZGluZykgcmV0dXJuOwotCi0gICAgQ2FjaGVkT2JqZWN0Q2xpZW50
V2Fsa2VyIHcobV9jbGllbnRzKTsKLSAgICB3aGlsZSAoQ2FjaGVkT2JqZWN0Q2xpZW50ICpjID0g
dy5uZXh0KCkpIHsKLSAgICAgICAgYy0+bm90aWZ5RmluaXNoZWQodGhpcyk7Ci0gICAgfQotfQot
Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCituYW1lc3BhY2Uga2h0bWwg
ewogCiAjaWZkZWYgS0hUTUxfWFNMVAogCkBAIC03NTksMTEyNSArMTc0LDEyIEBAIHZvaWQgQ2Fj
aGVkWEJMRG9jdW1lbnQ6OmNoZWNrTm90aWZ5KCkKICAgICAgICAgYy0+c2V0WEJMRG9jdW1lbnQo
bV91cmwsIG1fZG9jdW1lbnQpOwogfQogCi0KIHZvaWQgQ2FjaGVkWEJMRG9jdW1lbnQ6OmVycm9y
KCBpbnQgLyplcnIqLywgY29uc3QgY2hhciAqLyp0ZXh0Ki8gKQogewogICAgIG1fbG9hZGluZyA9
IGZhbHNlOwogICAgIGNoZWNrTm90aWZ5KCk7CiB9Ci0jZW5kaWYKLQotLy8gLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVJlcXVlc3Q6OlJlcXVlc3QoRG9jTG9hZGVyKiBkbCwg
Q2FjaGVkT2JqZWN0ICpfb2JqZWN0LCBib29sIF9pbmNyZW1lbnRhbCkKLXsKLSAgICBvYmplY3Qg
PSBfb2JqZWN0OwotICAgIG9iamVjdC0+c2V0UmVxdWVzdCh0aGlzKTsKLSAgICBpbmNyZW1lbnRh
bCA9IF9pbmNyZW1lbnRhbDsKLSAgICBtX2RvY0xvYWRlciA9IGRsOwotICAgIG11bHRpcGFydCA9
IGZhbHNlOwotfQotCi1SZXF1ZXN0Ojp+UmVxdWVzdCgpCi17Ci0gICAgb2JqZWN0LT5zZXRSZXF1
ZXN0KDApOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotRG9j
TG9hZGVyOjpEb2NMb2FkZXIoS0hUTUxQYXJ0KiBwYXJ0LCBEb2N1bWVudEltcGwqIGRvYykKLXsK
LSAgICBtX2NhY2hlUG9saWN5ID0gS0lPOjpDQ19WZXJpZnk7Ci0gICAgbV9leHBpcmVEYXRlID0g
MDsKLSAgICBtX2JhdXRvbG9hZEltYWdlcyA9IHRydWU7Ci0gICAgbV9zaG93QW5pbWF0aW9ucyA9
IEtIVE1MU2V0dGluZ3M6OktBbmltYXRpb25FbmFibGVkOwotICAgIG1fcGFydCA9IHBhcnQ7Ci0g
ICAgbV9kb2MgPSBkb2M7Ci0gICAgbV9sb2FkSW5Qcm9ncmVzcyA9IGZhbHNlOwotCi0gICAgQ2Fj
aGU6OmluaXQoKTsKLSAgICBDYWNoZTo6ZG9jbG9hZGVyLT5hcHBlbmQoIHRoaXMgKTsKLX0KLQot
RG9jTG9hZGVyOjp+RG9jTG9hZGVyKCkKLXsKLSAgICBDYWNoZTo6ZG9jbG9hZGVyLT5yZW1vdmUo
IHRoaXMgKTsKLX0KIAotdm9pZCBEb2NMb2FkZXI6OnNldEV4cGlyZURhdGUodGltZV90IF9leHBp
cmVEYXRlKQotewotICAgIG1fZXhwaXJlRGF0ZSA9IF9leHBpcmVEYXRlOwotfQotCi1ib29sIERv
Y0xvYWRlcjo6bmVlZFJlbG9hZChjb25zdCBLVVJMICZmdWxsVVJMKQotewotICAgIGJvb2wgcmVs
b2FkID0gZmFsc2U7Ci0gICAgaWYgKG1fY2FjaGVQb2xpY3kgPT0gS0lPOjpDQ19WZXJpZnkpCi0g
ICAgewotICAgICAgIGlmICghbV9yZWxvYWRlZFVSTHMuY29udGFpbnMoZnVsbFVSTC51cmwoKSkp
Ci0gICAgICAgewotICAgICAgICAgIENhY2hlZE9iamVjdCAqZXhpc3RpbmcgPSBDYWNoZTo6Y2Fj
aGUtPmZpbmQoZnVsbFVSTC51cmwoKSk7Ci0gICAgICAgICAgaWYgKGV4aXN0aW5nICYmIGV4aXN0
aW5nLT5pc0V4cGlyZWQoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAgQ2FjaGU6OnJlbW92
ZUNhY2hlRW50cnkoZXhpc3RpbmcpOwotICAgICAgICAgICAgIG1fcmVsb2FkZWRVUkxzLmFwcGVu
ZChmdWxsVVJMLnVybCgpKTsKLSAgICAgICAgICAgICByZWxvYWQgPSB0cnVlOwotICAgICAgICAg
IH0KLSAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKChtX2NhY2hlUG9saWN5ID09IEtJTzo6
Q0NfUmVsb2FkKSB8fCAobV9jYWNoZVBvbGljeSA9PSBLSU86OkNDX1JlZnJlc2gpKQotICAgIHsK
LSAgICAgICBpZiAoIW1fcmVsb2FkZWRVUkxzLmNvbnRhaW5zKGZ1bGxVUkwudXJsKCkpKQotICAg
ICAgIHsKLSAgICAgICAgICBDYWNoZWRPYmplY3QgKmV4aXN0aW5nID0gQ2FjaGU6OmNhY2hlLT5m
aW5kKGZ1bGxVUkwudXJsKCkpOwotICAgICAgICAgIGlmIChleGlzdGluZykKLSAgICAgICAgICB7
Ci0gICAgICAgICAgICAgQ2FjaGU6OnJlbW92ZUNhY2hlRW50cnkoZXhpc3RpbmcpOwotICAgICAg
ICAgIH0KLSAgICAgICAgICBtX3JlbG9hZGVkVVJMcy5hcHBlbmQoZnVsbFVSTC51cmwoKSk7Ci0g
ICAgICAgICAgcmVsb2FkID0gdHJ1ZTsKLSAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZWxv
YWQ7Ci19Ci0KLUNhY2hlZEltYWdlICpEb2NMb2FkZXI6OnJlcXVlc3RJbWFnZSggY29uc3QgRE9N
OjpET01TdHJpbmcgJnVybCkKLXsKLSAgICBLVVJMIGZ1bGxVUkwgPSBtX2RvYy0+Y29tcGxldGVV
UkwodXJsLnFzdHJpbmcoKSk7Ci0gICAgaWYgKCBtX3BhcnQgJiYgbV9wYXJ0LT5vbmx5TG9jYWxS
ZWZlcmVuY2VzKCkgJiYgZnVsbFVSTC5wcm90b2NvbCgpICE9ICJmaWxlIikgcmV0dXJuIDA7Ci0K
LSAgICBpZiAoS1dRQ2hlY2tJZlJlbG9hZGluZyh0aGlzKSkgewotICAgICAgICBzZXRDYWNoZVBv
bGljeShLSU86OkNDX1JlbG9hZCk7Ci0gICAgfQotCi0gICAgYm9vbCByZWxvYWQgPSBuZWVkUmVs
b2FkKGZ1bGxVUkwpOwotCi0gICAgQ2FjaGVkSW1hZ2UgKmNhY2hlZE9iamVjdCA9IENhY2hlOjpy
ZXF1ZXN0SW1hZ2UodGhpcywgZnVsbFVSTCwgcmVsb2FkLCBtX2V4cGlyZURhdGUpOwotICAgIEtX
UUNoZWNrQ2FjaGVPYmplY3RTdGF0dXModGhpcywgY2FjaGVkT2JqZWN0KTsKLSAgICByZXR1cm4g
Y2FjaGVkT2JqZWN0OwotfQotCi1DYWNoZWRDU1NTdHlsZVNoZWV0ICpEb2NMb2FkZXI6OnJlcXVl
c3RTdHlsZVNoZWV0KCBjb25zdCBET006OkRPTVN0cmluZyAmdXJsLCBjb25zdCBRU3RyaW5nJiBj
aGFyc2V0KQotewotICAgIEtVUkwgZnVsbFVSTCA9IG1fZG9jLT5jb21wbGV0ZVVSTCh1cmwucXN0
cmluZygpKTsKLSAgICBpZiAoIG1fcGFydCAmJiBtX3BhcnQtPm9ubHlMb2NhbFJlZmVyZW5jZXMo
KSAmJiBmdWxsVVJMLnByb3RvY29sKCkgIT0gImZpbGUiKSByZXR1cm4gMDsKLQotICAgIGlmIChL
V1FDaGVja0lmUmVsb2FkaW5nKHRoaXMpKSB7Ci0gICAgICAgIHNldENhY2hlUG9saWN5KEtJTzo6
Q0NfUmVsb2FkKTsKLSAgICB9Ci0KLSAgICBib29sIHJlbG9hZCA9IG5lZWRSZWxvYWQoZnVsbFVS
TCk7Ci0KLSAgICBDYWNoZWRDU1NTdHlsZVNoZWV0ICpjYWNoZWRPYmplY3QgPSBDYWNoZTo6cmVx
dWVzdFN0eWxlU2hlZXQodGhpcywgdXJsLCByZWxvYWQsIG1fZXhwaXJlRGF0ZSwgY2hhcnNldCk7
Ci0gICAgS1dRQ2hlY2tDYWNoZU9iamVjdFN0YXR1cyh0aGlzLCBjYWNoZWRPYmplY3QpOwotICAg
IHJldHVybiBjYWNoZWRPYmplY3Q7Ci19Ci0KLUNhY2hlZFNjcmlwdCAqRG9jTG9hZGVyOjpyZXF1
ZXN0U2NyaXB0KCBjb25zdCBET006OkRPTVN0cmluZyAmdXJsLCBjb25zdCBRU3RyaW5nJiBjaGFy
c2V0KQotewotICAgIEtVUkwgZnVsbFVSTCA9IG1fZG9jLT5jb21wbGV0ZVVSTCh1cmwucXN0cmlu
ZygpKTsKLSAgICBpZiAoIG1fcGFydCAmJiBtX3BhcnQtPm9ubHlMb2NhbFJlZmVyZW5jZXMoKSAm
JiBmdWxsVVJMLnByb3RvY29sKCkgIT0gImZpbGUiKSByZXR1cm4gMDsKKyNlbmRpZgogCi0gICAg
aWYgKEtXUUNoZWNrSWZSZWxvYWRpbmcodGhpcykpIHsKLSAgICAgICAgc2V0Q2FjaGVQb2xpY3ko
S0lPOjpDQ19SZWxvYWQpOwotICAgIH0KLQotICAgIGJvb2wgcmVsb2FkID0gbmVlZFJlbG9hZChm
dWxsVVJMKTsKLQotICAgIENhY2hlZFNjcmlwdCAqY2FjaGVkT2JqZWN0ID0gQ2FjaGU6OnJlcXVl
c3RTY3JpcHQodGhpcywgdXJsLCByZWxvYWQsIG1fZXhwaXJlRGF0ZSwgY2hhcnNldCk7Ci0gICAg
S1dRQ2hlY2tDYWNoZU9iamVjdFN0YXR1cyh0aGlzLCBjYWNoZWRPYmplY3QpOwotICAgIHJldHVy
biBjYWNoZWRPYmplY3Q7Ci19Ci0KLSNpZmRlZiBLSFRNTF9YU0xUCi1DYWNoZWRYU0xTdHlsZVNo
ZWV0KiBEb2NMb2FkZXI6OnJlcXVlc3RYU0xTdHlsZVNoZWV0KGNvbnN0IERPTTo6RE9NU3RyaW5n
ICZ1cmwpCi17Ci0gICAgS1VSTCBmdWxsVVJMID0gbV9kb2MtPmNvbXBsZXRlVVJMKHVybC5xc3Ry
aW5nKCkpOwotICAgIAotICAgIGlmIChtX3BhcnQgJiYgbV9wYXJ0LT5vbmx5TG9jYWxSZWZlcmVu
Y2VzKCkgJiYgZnVsbFVSTC5wcm90b2NvbCgpICE9ICJmaWxlIikgcmV0dXJuIDA7Ci0gICAgCi0g
ICAgaWYgKEtXUUNoZWNrSWZSZWxvYWRpbmcodGhpcykpCi0gICAgICAgIHNldENhY2hlUG9saWN5
KEtJTzo6Q0NfUmVsb2FkKTsKLSAgICAKLSAgICBib29sIHJlbG9hZCA9IG5lZWRSZWxvYWQoZnVs
bFVSTCk7Ci0gICAgCi0gICAgQ2FjaGVkWFNMU3R5bGVTaGVldCAqY2FjaGVkT2JqZWN0ID0gQ2Fj
aGU6OnJlcXVlc3RYU0xTdHlsZVNoZWV0KHRoaXMsIHVybCwgcmVsb2FkLCBtX2V4cGlyZURhdGUp
OwotICAgIEtXUUNoZWNrQ2FjaGVPYmplY3RTdGF0dXModGhpcywgY2FjaGVkT2JqZWN0KTsKLSAg
ICByZXR1cm4gY2FjaGVkT2JqZWN0OwotfQotI2VuZGlmCi0KLSNpZm5kZWYgS0hUTUxfTk9fWEJM
Ci1DYWNoZWRYQkxEb2N1bWVudCogRG9jTG9hZGVyOjpyZXF1ZXN0WEJMRG9jdW1lbnQoY29uc3Qg
RE9NOjpET01TdHJpbmcgJnVybCkKLXsKLSAgICBLVVJMIGZ1bGxVUkwgPSBtX2RvYy0+Y29tcGxl
dGVVUkwodXJsLnFzdHJpbmcoKSk7Ci0gICAgCi0gICAgLy8gRklYTUU6IElzIHRoaXMgcmlnaHQg
Zm9yIFhCTD8KLSAgICBpZiAobV9wYXJ0ICYmIG1fcGFydC0+b25seUxvY2FsUmVmZXJlbmNlcygp
ICYmIGZ1bGxVUkwucHJvdG9jb2woKSAhPSAiZmlsZSIpIHJldHVybiAwOwotICAgIAotICAgIGlm
IChLV1FDaGVja0lmUmVsb2FkaW5nKHRoaXMpKSB7Ci0gICAgICAgIHNldENhY2hlUG9saWN5KEtJ
Tzo6Q0NfUmVsb2FkKTsKLSAgICB9Ci0gICAgCi0gICAgYm9vbCByZWxvYWQgPSBuZWVkUmVsb2Fk
KGZ1bGxVUkwpOwotICAgIAotICAgIENhY2hlZFhCTERvY3VtZW50ICpjYWNoZWRPYmplY3QgPSBD
YWNoZTo6cmVxdWVzdFhCTERvY3VtZW50KHRoaXMsIHVybCwgcmVsb2FkLCBtX2V4cGlyZURhdGUp
OwotICAgIEtXUUNoZWNrQ2FjaGVPYmplY3RTdGF0dXModGhpcywgY2FjaGVkT2JqZWN0KTsKLSAg
ICByZXR1cm4gY2FjaGVkT2JqZWN0OwotfQotI2VuZGlmCi0KLXZvaWQgRG9jTG9hZGVyOjpzZXRB
dXRvbG9hZEltYWdlcyggYm9vbCBlbmFibGUgKQotewotICAgIGlmICggZW5hYmxlID09IG1fYmF1
dG9sb2FkSW1hZ2VzICkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV9iYXV0b2xvYWRJbWFnZXMg
PSBlbmFibGU7Ci0KLSAgICBpZiAoICFtX2JhdXRvbG9hZEltYWdlcyApIHJldHVybjsKLQotICAg
IGZvciAoIGNvbnN0IENhY2hlZE9iamVjdCogY289bV9kb2NPYmplY3RzLmZpcnN0KCk7IGNvOyBj
bz1tX2RvY09iamVjdHMubmV4dCgpICkKLSAgICAgICAgaWYgKCBjby0+dHlwZSgpID09IENhY2hl
ZE9iamVjdDo6SW1hZ2UgKQotICAgICAgICB7Ci0gICAgICAgICAgICBDYWNoZWRJbWFnZSAqaW1n
ID0gY29uc3RfY2FzdDxDYWNoZWRJbWFnZSo+KCBzdGF0aWNfY2FzdDxjb25zdCBDYWNoZWRJbWFn
ZSAqPiggY28gKSApOwotCi0gICAgICAgICAgICBDYWNoZWRPYmplY3Q6OlN0YXR1cyBzdGF0dXMg
PSBpbWctPnN0YXR1cygpOwotICAgICAgICAgICAgaWYgKCBzdGF0dXMgIT0gQ2FjaGVkT2JqZWN0
OjpVbmtub3duICkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgQ2Fj
aGU6OmxvYWRlcigpLT5sb2FkKHRoaXMsIGltZywgdHJ1ZSk7Ci0gICAgICAgIH0KLX0KLQotdm9p
ZCBEb2NMb2FkZXI6OnNldENhY2hlUG9saWN5KCBLSU86OkNhY2hlQ29udHJvbCBjYWNoZVBvbGlj
eSApCi17Ci0gICAgbV9jYWNoZVBvbGljeSA9IGNhY2hlUG9saWN5OwotfQotCi12b2lkIERvY0xv
YWRlcjo6c2V0U2hvd0FuaW1hdGlvbnMoIEtIVE1MU2V0dGluZ3M6OktBbmltYXRpb25BZHZpY2Ug
c2hvd0FuaW1hdGlvbnMgKQotewotICAgIGlmICggc2hvd0FuaW1hdGlvbnMgPT0gbV9zaG93QW5p
bWF0aW9ucyApIHJldHVybjsKLSAgICBtX3Nob3dBbmltYXRpb25zID0gc2hvd0FuaW1hdGlvbnM7
Ci0KLSAgICBjb25zdCBDYWNoZWRPYmplY3QqIGNvOwotICAgIGZvciAoIGNvPW1fZG9jT2JqZWN0
cy5maXJzdCgpOyBjbzsgY289bV9kb2NPYmplY3RzLm5leHQoKSApCi0gICAgICAgIGlmICggY28t
PnR5cGUoKSA9PSBDYWNoZWRPYmplY3Q6OkltYWdlICkKLSAgICAgICAgewotICAgICAgICAgICAg
Q2FjaGVkSW1hZ2UgKmltZyA9IGNvbnN0X2Nhc3Q8Q2FjaGVkSW1hZ2UqPiggc3RhdGljX2Nhc3Q8
Y29uc3QgQ2FjaGVkSW1hZ2UgKj4oIGNvICkgKTsKLQotICAgICAgICAgICAgaW1nLT5zZXRTaG93
QW5pbWF0aW9ucyggc2hvd0FuaW1hdGlvbnMgKTsKLSAgICAgICAgfQotfQotCi12b2lkIERvY0xv
YWRlcjo6cmVtb3ZlQ2FjaGVkT2JqZWN0KCBDYWNoZWRPYmplY3QqIG8gKSBjb25zdAotewotICAg
IG1fZG9jT2JqZWN0cy5yZW1vdmVSZWYoIG8gKTsKLX0KLQotdm9pZCBEb2NMb2FkZXI6OnNldExv
YWRJblByb2dyZXNzKGJvb2wgbG9hZCkKLXsKLSAgICBtX2xvYWRJblByb2dyZXNzID0gbG9hZDsK
LX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUxvYWRlcjo6TG9h
ZGVyKCkgOiBRT2JqZWN0KCkKLXsKLSAgICBtX3JlcXVlc3RzUGVuZGluZy5zZXRBdXRvRGVsZXRl
KCB0cnVlICk7Ci0gICAgbV9yZXF1ZXN0c0xvYWRpbmcuc2V0QXV0b0RlbGV0ZSggdHJ1ZSApOwot
ICAgIGt3cSA9IG5ldyBLV1FMb2FkZXIodGhpcyk7Ci19Ci0KLUxvYWRlcjo6fkxvYWRlcigpCi17
Ci0gICAgZGVsZXRlIGt3cTsKLX0KLQotdm9pZCBMb2FkZXI6OmxvYWQoRG9jTG9hZGVyKiBkbCwg
Q2FjaGVkT2JqZWN0ICpvYmplY3QsIGJvb2wgaW5jcmVtZW50YWwpCi17Ci0gICAgUmVxdWVzdCAq
cmVxID0gbmV3IFJlcXVlc3QoZGwsIG9iamVjdCwgaW5jcmVtZW50YWwpOwotICAgIG1fcmVxdWVz
dHNQZW5kaW5nLmFwcGVuZChyZXEpOwotCi0gICAgZW1pdCByZXF1ZXN0U3RhcnRlZCggcmVxLT5t
X2RvY0xvYWRlciwgcmVxLT5vYmplY3QgKTsKLQotICAgIHNlcnZlUGVuZGluZ1JlcXVlc3RzKCk7
Ci19Ci0KLXZvaWQgTG9hZGVyOjpzZXJ2ZVBlbmRpbmdSZXF1ZXN0cygpCi17Ci0gIGlmICggbV9y
ZXF1ZXN0c1BlbmRpbmcuY291bnQoKSA9PSAwICkKLSAgICAgIHJldHVybjsKLQotICAvLyBnZXQg
dGhlIGZpcnN0IHBlbmRpbmcgcmVxdWVzdAotICBSZXF1ZXN0ICpyZXEgPSBtX3JlcXVlc3RzUGVu
ZGluZy50YWtlKDApOwotCi0gIEtVUkwgdShyZXEtPm9iamVjdC0+dXJsKCkucXN0cmluZygpKTsK
LSAgS0lPOjpUcmFuc2ZlckpvYiogam9iID0gS0lPOjpnZXQoIHUsIGZhbHNlLCBmYWxzZSAvKm5v
IEdVSSovLCB0cnVlKTsKLSAgCi0gIGpvYi0+YWRkTWV0YURhdGEoImNhY2hlIiwgZ2V0Q2FjaGVD
b250cm9sU3RyaW5nKHJlcS0+b2JqZWN0LT5jYWNoZVBvbGljeSgpKSk7Ci0gIGlmICghcmVxLT5v
YmplY3QtPmFjY2VwdCgpLmlzRW1wdHkoKSkKLSAgICAgIGpvYi0+YWRkTWV0YURhdGEoImFjY2Vw
dCIsIHJlcS0+b2JqZWN0LT5hY2NlcHQoKSk7Ci0gIGlmICggcmVxLT5tX2RvY0xvYWRlciApICB7
Ci0gICAgICBLVVJMIHIgPSByZXEtPm1fZG9jTG9hZGVyLT5kb2MoKS0+VVJMKCk7Ci0gICAgICBp
ZiAoIHIucHJvdG9jb2woKS5zdGFydHNXaXRoKCAiaHR0cCIgKSAmJiByLnBhdGgoKS5pc0VtcHR5
KCkgKQotICAgICAgICAgIHIuc2V0UGF0aCggIi8iICk7Ci0KLSAgICAgIGpvYi0+YWRkTWV0YURh
dGEoInJlZmVycmVyIiwgci51cmwoKSk7Ci0gICAgICBRU3RyaW5nIGRvbWFpbiA9IHIuaG9zdCgp
OwotICAgICAgaWYgKHJlcS0+bV9kb2NMb2FkZXItPmRvYygpLT5pc0hUTUxEb2N1bWVudCgpKQot
ICAgICAgICAgZG9tYWluID0gc3RhdGljX2Nhc3Q8SFRNTERvY3VtZW50SW1wbCo+KHJlcS0+bV9k
b2NMb2FkZXItPmRvYygpKS0+ZG9tYWluKCkucXN0cmluZygpOwotICAgICAgaWYgKGNyb3NzRG9t
YWluKHUuaG9zdCgpLCBkb21haW4pKQotICAgICAgICAgam9iLT5hZGRNZXRhRGF0YSgiY3Jvc3Mt
ZG9tYWluIiwgInRydWUiKTsKLSAgfQotCi0gIGNvbm5lY3QoIGpvYiwgU0lHTkFMKCByZXN1bHQo
IEtJTzo6Sm9iICosIE5TRGF0YSAqKSApLCB0aGlzLCBTTE9UKCBzbG90RmluaXNoZWQoIEtJTzo6
Sm9iICosIE5TRGF0YSAqKSApICk7Ci0gIAotICBjb25uZWN0KCBqb2IsIFNJR05BTCggZGF0YSgg
S0lPOjpKb2IqLCBjb25zdCBjaGFyICosIGludCkpLAotICAgICAgICAgICBTTE9UKCBzbG90RGF0
YSggS0lPOjpKb2IqLCBjb25zdCBjaGFyICosIGludCkpKTsKLSAgY29ubmVjdCggam9iLCBTSUdO
QUwoIHJlY2VpdmVkUmVzcG9uc2UoIEtJTzo6Sm9iICosIE5TVVJMUmVzcG9uc2UgKikpLCBTTE9U
KCBzbG90UmVjZWl2ZWRSZXNwb25zZSggS0lPOjpKb2IgKiwgTlNVUkxSZXNwb25zZSAqKSkgKTsK
LQotICBpZiAoS1dRU2VydmVSZXF1ZXN0KHRoaXMsIHJlcSwgam9iKSkgewotICAgICAgaWYgKHJl
cS0+b2JqZWN0LT50eXBlKCkgPT0gQ2FjaGVkT2JqZWN0OjpJbWFnZSkgewotCUNhY2hlZEltYWdl
ICpjaSA9IHN0YXRpY19jYXN0PENhY2hlZEltYWdlKj4ocmVxLT5vYmplY3QpOwotCWlmIChjaS0+
ZGVjb2RlckNhbGxiYWNrKCkpIHsKLQkgICAgbV9yZXF1ZXN0c0JhY2tncm91bmREZWNvZGluZy5h
cHBlbmQocmVxKTsKLQl9Ci0gICAgICB9Ci0gICAgICBtX3JlcXVlc3RzTG9hZGluZy5pbnNlcnQo
am9iLCByZXEpOwotICB9Ci19Ci0KLXZvaWQgTG9hZGVyOjpzbG90RmluaXNoZWQoIEtJTzo6Sm9i
KiBqb2IsIE5TRGF0YSAqYWxsRGF0YSkKLXsKLSAgICBSZXF1ZXN0ICpyID0gbV9yZXF1ZXN0c0xv
YWRpbmcudGFrZSggam9iICk7Ci0gICAgS0lPOjpUcmFuc2ZlckpvYiogaiA9IHN0YXRpY19jYXN0
PEtJTzo6VHJhbnNmZXJKb2IqPihqb2IpOwotCi0gICAgaWYgKCAhciApCi0gICAgICAgIHJldHVy
bjsKLQotICAgIENhY2hlZE9iamVjdCAqb2JqZWN0ID0gci0+b2JqZWN0OwotICAgIERvY0xvYWRl
ciAqZG9jTG9hZGVyID0gci0+bV9kb2NMb2FkZXI7Ci0gICAgCi0gICAgYm9vbCBiYWNrZ3JvdW5k
SW1hZ2VEZWNvZGluZyA9IChvYmplY3QtPnR5cGUoKSA9PSBDYWNoZWRPYmplY3Q6OkltYWdlICYm
IAotCXN0YXRpY19jYXN0PENhY2hlZEltYWdlKj4ob2JqZWN0KS0+ZGVjb2RlckNhbGxiYWNrKCkp
OwotCQotICAgIGlmIChqLT5lcnJvcigpIHx8IGotPmlzRXJyb3JQYWdlKCkpIHsKLSAgICAgICAg
Ly8gVXNlIHRoZSBiYWNrZ3JvdW5kIGltYWdlIGRlY29kZXIncyBjYWxsYmFjayB0byBoYW5kbGUg
dGhlIGVycm9yLgotICAgICAgICBpZiAoYmFja2dyb3VuZEltYWdlRGVjb2RpbmcpIHsKLSAgICAg
ICAgICAgIENhY2hlZEltYWdlQ2FsbGJhY2sgKmNhbGxiYWNrID0gc3RhdGljX2Nhc3Q8Q2FjaGVk
SW1hZ2UqPihvYmplY3QpLT5kZWNvZGVyQ2FsbGJhY2soKTsKLSAgICAgICAgICAgIGNhbGxiYWNr
LT5oYW5kbGVFcnJvcigpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAg
ZG9jTG9hZGVyLT5zZXRMb2FkSW5Qcm9ncmVzcyh0cnVlKTsKLSAgICAgICAgICAgIHItPm9iamVj
dC0+ZXJyb3IoIGpvYi0+ZXJyb3IoKSwgam9iLT5lcnJvclRleHQoKS5hc2NpaSgpICk7Ci0gICAg
ICAgICAgICBkb2NMb2FkZXItPnNldExvYWRJblByb2dyZXNzKGZhbHNlKTsKLSAgICAgICAgICAg
IGVtaXQgcmVxdWVzdEZhaWxlZCggZG9jTG9hZGVyLCBvYmplY3QgKTsKLSAgICAgICAgICAgIENh
Y2hlOjpyZW1vdmVDYWNoZUVudHJ5KCBvYmplY3QgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBl
bHNlIHsKLSAgICAgICAgZG9jTG9hZGVyLT5zZXRMb2FkSW5Qcm9ncmVzcyh0cnVlKTsKLSAgICAg
ICAgb2JqZWN0LT5kYXRhKHItPm1fYnVmZmVyLCB0cnVlKTsKLSAgICAgICAgci0+b2JqZWN0LT5z
ZXRBbGxEYXRhKGFsbERhdGEpOwotICAgICAgICBkb2NMb2FkZXItPnNldExvYWRJblByb2dyZXNz
KGZhbHNlKTsKLSAgICAgICAgCi0gICAgICAgIC8vIExldCB0aGUgYmFja2dyb3VuZCBpbWFnZSBk
ZWNvZGVyIHRyaWdnZXIgdGhlIGRvbmUgc2lnbmFsLgotICAgICAgICBpZiAoIWJhY2tncm91bmRJ
bWFnZURlY29kaW5nKQotICAgICAgICAgICAgZW1pdCByZXF1ZXN0RG9uZSggZG9jTG9hZGVyLCBv
YmplY3QgKTsKLQotICAgICAgICBvYmplY3QtPmZpbmlzaCgpOwotICAgIH0KLQotICAgIC8vIExl
dCB0aGUgYmFja2dyb3VuZCBpbWFnZSBkZWNvZGVyIHJlbGVhc2UgdGhlIHJlcXVlc3Qgd2hlbiBp
dCBpcwotICAgIC8vIGZpbmlzaGVkLgotICAgIGlmICghYmFja2dyb3VuZEltYWdlRGVjb2Rpbmcp
IHsKLSAgICAgICAgZGVsZXRlIHI7Ci0gICAgfQotCi0gICAgc2VydmVQZW5kaW5nUmVxdWVzdHMo
KTsKLX0KLQotCi12b2lkIExvYWRlcjo6c2xvdFJlY2VpdmVkUmVzcG9uc2UoS0lPOjpKb2IqIGpv
YiwgTlNVUkxSZXNwb25zZSAqcmVzcG9uc2UpCi17Ci0gICAgUmVxdWVzdCAqciA9IG1fcmVxdWVz
dHNMb2FkaW5nW2pvYl07Ci0gICAgQVNTRVJUKHIpOwotICAgIEFTU0VSVChyZXNwb25zZSk7Ci0g
ICAgci0+b2JqZWN0LT5zZXRSZXNwb25zZShyZXNwb25zZSk7Ci0gICAgci0+b2JqZWN0LT5zZXRF
eHBpcmVEYXRlKEtXUUNhY2hlT2JqZWN0RXhwaXJlc1RpbWUoci0+bV9kb2NMb2FkZXIsIHJlc3Bv
bnNlKSwgZmFsc2UpOwotICAgIAotICAgIFFTdHJpbmcgY2hzID0gc3RhdGljX2Nhc3Q8S0lPOjpU
cmFuc2ZlckpvYio+KGpvYiktPnF1ZXJ5TWV0YURhdGEoImNoYXJzZXQiKTsKLSAgICBpZiAoIWNo
cy5pc051bGwoKSkKLSAgICAgICAgci0+b2JqZWN0LT5zZXRDaGFyc2V0KGNocyk7Ci0gICAgCi0g
ICAgaWYgKHItPm11bHRpcGFydCkgewotICAgICAgICBBU1NFUlQoci0+b2JqZWN0LT5pc0ltYWdl
KCkpOwotICAgICAgICBzdGF0aWNfY2FzdDxDYWNoZWRJbWFnZSAqPihyLT5vYmplY3QpLT5jbGVh
cigpOwotICAgICAgICByLT5tX2J1ZmZlciA9IFFCdWZmZXIoKTsKLSAgICAgICAgaWYgKHItPm1f
ZG9jTG9hZGVyLT5wYXJ0KCkpCi0gICAgICAgICAgICByLT5tX2RvY0xvYWRlci0+cGFydCgpLT5j
aGVja0NvbXBsZXRlZCgpOwotICAgICAgICAKLSAgICB9IGVsc2UgaWYgKEtXUVJlc3BvbnNlSXNN
dWx0aXBhcnQocmVzcG9uc2UpKSB7Ci0gICAgICAgIHItPm11bHRpcGFydCA9IHRydWU7Ci0gICAg
ICAgIGlmICghci0+b2JqZWN0LT5pc0ltYWdlKCkpCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxL
SU86OlRyYW5zZmVySm9iKj4oam9iKS0+Y2FuY2VsKCk7Ci0gICAgfQotfQotCi0KLXZvaWQgTG9h
ZGVyOjpzbG90RGF0YSggS0lPOjpKb2Iqam9iLCBjb25zdCBjaGFyICpkYXRhLCBpbnQgc2l6ZSAp
Ci17Ci0gICAgUmVxdWVzdCAqciA9IG1fcmVxdWVzdHNMb2FkaW5nW2pvYl07Ci0gICAgaWYoIXIp
IHsKLSAgICAgICAga2REZWJ1ZyggNjA2MCApIDw8ICJnb3QgZGF0YSBmb3IgdW5rbm93biByZXF1
ZXN0ISIgPDwgZW5kbDsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmICggIXItPm1f
YnVmZmVyLmlzT3BlbigpICkKLSAgICAgICAgci0+bV9idWZmZXIub3BlbiggSU9fV3JpdGVPbmx5
ICk7Ci0KLSAgICByLT5tX2J1ZmZlci53cml0ZUJsb2NrKCBkYXRhLCBzaXplICk7Ci0KLSAgICBp
ZiAoci0+bXVsdGlwYXJ0KQotICAgICAgICByLT5vYmplY3QtPmRhdGEoIHItPm1fYnVmZmVyLCB0
cnVlICk7IC8vIHRoZSBsb2FkZXIgZGVsaXZlcnMgdGhlIGRhdGEgaW4gYSBtdWx0aXBhcnQgc2Vj
dGlvbiBhbGwgYXQgb25jZSwgc2VuZCBlb2YKLSAgICBlbHNlIGlmKHItPmluY3JlbWVudGFsKQot
ICAgICAgICByLT5vYmplY3QtPmRhdGEoIHItPm1fYnVmZmVyLCBmYWxzZSApOwotfQotCi1pbnQg
TG9hZGVyOjpudW1SZXF1ZXN0cyggRG9jTG9hZGVyKiBkbCApIGNvbnN0Ci17Ci0gICAgaW50IHJl
cyA9IDA7Ci0KLSAgICBRUHRyTGlzdEl0ZXJhdG9yPFJlcXVlc3Q+IHBJdCggbV9yZXF1ZXN0c1Bl
bmRpbmcgKTsKLSAgICBmb3IgKDsgcEl0LmN1cnJlbnQoKTsgKytwSXQgKQotICAgICAgICBpZiAo
IHBJdC5jdXJyZW50KCktPm1fZG9jTG9hZGVyID09IGRsICkKLSAgICAgICAgICAgIHJlcysrOwot
Ci0gICAgUVB0ckRpY3RJdGVyYXRvcjxSZXF1ZXN0PiBsSXQoIG1fcmVxdWVzdHNMb2FkaW5nICk7
Ci0gICAgZm9yICg7IGxJdC5jdXJyZW50KCk7ICsrbEl0ICkKLSAgICAgICAgaWYgKCBsSXQuY3Vy
cmVudCgpLT5tX2RvY0xvYWRlciA9PSBkbCApCi0gICAgICAgICAgICBpZiAoIWxJdC5jdXJyZW50
KCktPm11bHRpcGFydCkKLSAgICAgICAgICAgICAgICByZXMrKzsKLQotICAgIFFQdHJMaXN0SXRl
cmF0b3I8UmVxdWVzdD4gYmRJdCggbV9yZXF1ZXN0c0JhY2tncm91bmREZWNvZGluZyApOwotICAg
IGZvciAoOyBiZEl0LmN1cnJlbnQoKTsgKytiZEl0ICkKLSAgICAgICAgaWYgKCBiZEl0LmN1cnJl
bnQoKS0+bV9kb2NMb2FkZXIgPT0gZGwgKQotICAgICAgICAgICAgcmVzKys7Ci0KLSAgICBpZiAo
ZGwtPmxvYWRJblByb2dyZXNzKCkpCi0gICAgICAgIHJlcysrOwotICAgICAgICAKLSAgICByZXR1
cm4gcmVzOwotfQotCi12b2lkIExvYWRlcjo6Y2FuY2VsUmVxdWVzdHMoIERvY0xvYWRlciogZGwg
KQotewotICAgIFFQdHJMaXN0SXRlcmF0b3I8UmVxdWVzdD4gcEl0KCBtX3JlcXVlc3RzUGVuZGlu
ZyApOwotICAgIHdoaWxlICggcEl0LmN1cnJlbnQoKSApCi0gICAgewotICAgICAgICBpZiAocEl0
LmN1cnJlbnQoKS0+bV9kb2NMb2FkZXIgPT0gZGwpIHsKLSAgICAgICAgICAgIENhY2hlOjpyZW1v
dmVDYWNoZUVudHJ5KCBwSXQuY3VycmVudCgpLT5vYmplY3QgKTsKLSAgICAgICAgICAgIG1fcmVx
dWVzdHNQZW5kaW5nLnJlbW92ZSggcEl0ICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAg
ICAgICAgICAgKytwSXQ7Ci0gICAgfQotCi0gICAgUVB0ckRpY3RJdGVyYXRvcjxSZXF1ZXN0PiBs
SXQoIG1fcmVxdWVzdHNMb2FkaW5nICk7Ci0gICAgd2hpbGUgKCBsSXQuY3VycmVudCgpICkKLSAg
ICB7Ci0gICAgICAgIGlmIChsSXQuY3VycmVudCgpLT5tX2RvY0xvYWRlciA9PSBkbCkgewotICAg
ICAgICAgICAgS0lPOjpKb2IgKmpvYiA9IHN0YXRpY19jYXN0PEtJTzo6Sm9iICo+KCBsSXQuY3Vy
cmVudEtleSgpICk7Ci0gICAgICAgICAgICBDYWNoZTo6cmVtb3ZlQ2FjaGVFbnRyeSggbEl0LmN1
cnJlbnQoKS0+b2JqZWN0ICk7Ci0gICAgICAgICAgICBtX3JlcXVlc3RzTG9hZGluZy5yZW1vdmUo
IGxJdC5jdXJyZW50S2V5KCkgKTsKLSAgICAgICAgICAgIGpvYi0+a2lsbCgpOwotICAgICAgICB9
Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgICsrbEl0OwotICAgIH0KLQotICAgIFFQdHJMaXN0
SXRlcmF0b3I8UmVxdWVzdD4gYmRJdCggbV9yZXF1ZXN0c0JhY2tncm91bmREZWNvZGluZyApOwot
ICAgIHdoaWxlIChiZEl0LmN1cnJlbnQoKSkgewotICAgICAgICBpZiAoYmRJdC5jdXJyZW50KCkt
Pm1fZG9jTG9hZGVyID09IGRsKSB7Ci0gICAgICAgICAgICBDYWNoZTo6cmVtb3ZlQ2FjaGVFbnRy
eSggYmRJdC5jdXJyZW50KCktPm9iamVjdCApOwotICAgICAgICAgICAgbV9yZXF1ZXN0c0JhY2tn
cm91bmREZWNvZGluZy5yZW1vdmUoIGJkSXQgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0g
ICAgICAgICAgICArK2JkSXQ7Ci0gICAgfQotfQotCi12b2lkIExvYWRlcjo6cmVtb3ZlQmFja2dy
b3VuZERlY29kaW5nUmVxdWVzdCAoUmVxdWVzdCAqcikKLXsKLSAgICBib29sIHByZXNlbnQgPSBt
X3JlcXVlc3RzQmFja2dyb3VuZERlY29kaW5nLmNvbnRhaW5zUmVmKHIpOwotICAgIGlmIChwcmVz
ZW50KSB7Ci0JbV9yZXF1ZXN0c0JhY2tncm91bmREZWNvZGluZy5yZW1vdmUgKHIpOwotICAgIH0K
LX0KLQotS0lPOjpKb2IgKkxvYWRlcjo6am9iRm9yUmVxdWVzdCggY29uc3QgRE9NOjpET01TdHJp
bmcgJnVybCApIGNvbnN0Ci17Ci0gICAgUVB0ckRpY3RJdGVyYXRvcjxSZXF1ZXN0PiBpdCggbV9y
ZXF1ZXN0c0xvYWRpbmcgKTsKLQotICAgIGZvciAoOyBpdC5jdXJyZW50KCk7ICsraXQgKQotICAg
IHsKLSAgICAgICAgQ2FjaGVkT2JqZWN0ICpvYmogPSBpdC5jdXJyZW50KCktPm9iamVjdDsKLQot
ICAgICAgICBpZiAoIG9iaiAmJiBvYmotPnVybCgpID09IHVybCApCi0gICAgICAgICAgICByZXR1
cm4gc3RhdGljX2Nhc3Q8S0lPOjpKb2IgKj4oIGl0LmN1cnJlbnRLZXkoKSApOwotICAgIH0KLQot
ICAgIHJldHVybiAwOwotfQotCi0KLWJvb2wgTG9hZGVyOjppc0tIVE1MTG9hZGVyKCkgY29uc3QK
LXsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQot
TFJVTGlzdDo6TFJVTGlzdCgpCi06bV9oZWFkKDApLCBtX3RhaWwoMCkgCi17fQotCi1MUlVMaXN0
Ojp+TFJVTGlzdCgpCi17fQotCi1RRGljdDxDYWNoZWRPYmplY3Q+ICpDYWNoZTo6Y2FjaGUgPSAw
OwotUVB0ckxpc3Q8RG9jTG9hZGVyPiogQ2FjaGU6OmRvY2xvYWRlciA9IDA7Ci1Mb2FkZXIgKkNh
Y2hlOjptX2xvYWRlciA9IDA7Ci0KLWludCBDYWNoZTo6bWF4U2l6ZSA9IERFRkNBQ0hFU0laRTsK
LWludCBDYWNoZTo6bWF4Q2FjaGVhYmxlID0gTUFYQ0FDSEVBQkxFOwotaW50IENhY2hlOjpmbHVz
aENvdW50ID0gMDsKLQotUVBpeG1hcCAqQ2FjaGU6Om51bGxQaXhtYXAgPSAwOwotUVBpeG1hcCAq
Q2FjaGU6OmJyb2tlblBpeG1hcCA9IDA7Ci0KLUNhY2hlZE9iamVjdCAqQ2FjaGU6Om1faGVhZE9m
VW5jYWNoZWFibGVMaXN0ID0gMDsKLWludCBDYWNoZTo6bV90b3RhbFNpemVPZkxSVUxpc3RzID0g
MDsKLWludCBDYWNoZTo6bV9jb3VudE9mTFJVQW5kVW5jYWNoZWFibGVMaXN0czsKLUxSVUxpc3Qg
KkNhY2hlOjptX0xSVUxpc3RzID0gMDsKLQotdm9pZCBDYWNoZTo6aW5pdCgpCi17Ci0gICAgaWYg
KCAhY2FjaGUgKQotICAgICAgICBjYWNoZSA9IG5ldyBRRGljdDxDYWNoZWRPYmplY3Q+KDQwMSwg
dHJ1ZSk7Ci0KLSAgICBpZiAoICFkb2Nsb2FkZXIgKQotICAgICAgICBkb2Nsb2FkZXIgPSBuZXcg
UVB0ckxpc3Q8RG9jTG9hZGVyPjsKLQotICAgIGlmICggIW51bGxQaXhtYXAgKQotICAgICAgICBu
dWxsUGl4bWFwID0gbmV3IFFQaXhtYXA7Ci0KLSAgICBpZiAoICFicm9rZW5QaXhtYXAgKQotICAg
ICAgICBicm9rZW5QaXhtYXAgPSBLV1FMb2FkUGl4bWFwKCJtaXNzaW5nX2ltYWdlIik7Ci0KLSAg
ICBpZiAoICFtX2xvYWRlciApCi0gICAgICAgIG1fbG9hZGVyID0gbmV3IExvYWRlcigpOwotfQot
Ci12b2lkIENhY2hlOjpjbGVhcigpCi17Ci0gICAgaWYgKCFjYWNoZSkKLSAgICAgICAgcmV0dXJu
OwotCi0gICAgY2FjaGUtPnNldEF1dG9EZWxldGUoIHRydWUgKTsKLSAgICBkZWxldGUgY2FjaGU7
IGNhY2hlID0gMDsKLSAgICBkZWxldGUgbnVsbFBpeG1hcDsgbnVsbFBpeG1hcCA9IDA7Ci0gICAg
ZGVsZXRlIGJyb2tlblBpeG1hcDsgYnJva2VuUGl4bWFwID0gMDsKLSAgICBkZWxldGUgbV9sb2Fk
ZXI7ICAgbV9sb2FkZXIgPSAwOwotICAgIGRlbGV0ZSBkb2Nsb2FkZXI7IGRvY2xvYWRlciA9IDA7
Ci19Ci0KLUNhY2hlZEltYWdlICpDYWNoZTo6cmVxdWVzdEltYWdlKCBEb2NMb2FkZXIqIGRsLCBj
b25zdCBET01TdHJpbmcgJiB1cmwsIGJvb2wgcmVsb2FkLCB0aW1lX3QgX2V4cGlyZURhdGUgKQot
ewotICAgIC8vIHRoaXMgYnJpbmdzIHRoZSBfdXJsIHRvIGEgc3RhbmRhcmQgZm9ybS4uLgotICAg
IEtVUkwga3VybDsKLSAgICBpZiAoZGwpCi0gICAgICAgIGt1cmwgPSBkbC0+bV9kb2MtPmNvbXBs
ZXRlVVJMKCB1cmwucXN0cmluZygpICk7Ci0gICAgZWxzZQotICAgICAgICBrdXJsID0gdXJsLnFz
dHJpbmcoKTsKLSAgICByZXR1cm4gcmVxdWVzdEltYWdlKGRsLCBrdXJsLCByZWxvYWQsIF9leHBp
cmVEYXRlKTsKLX0KLQotQ2FjaGVkSW1hZ2UgKkNhY2hlOjpyZXF1ZXN0SW1hZ2UoIERvY0xvYWRl
ciogZGwsIGNvbnN0IEtVUkwgJiB1cmwsIGJvb2wgcmVsb2FkLCB0aW1lX3QgX2V4cGlyZURhdGUg
KQotewotICAgIEtJTzo6Q2FjaGVDb250cm9sIGNhY2hlUG9saWN5OwotICAgIGlmIChkbCkKLSAg
ICAgICAgY2FjaGVQb2xpY3kgPSBkbC0+Y2FjaGVQb2xpY3koKTsKLSAgICBlbHNlCi0gICAgICAg
IGNhY2hlUG9saWN5ID0gS0lPOjpDQ19WZXJpZnk7Ci0KLSAgICAvLyBDaGVja2luZyBpZiB0aGUg
VVJMIGlzIG1hbGZvcm1lZCBpcyBsb3RzIG9mIGV4dHJhIHdvcmsgZm9yIGxpdHRsZSBiZW5lZml0
LgotCi0gICAgaWYgKCFkbC0+ZG9jKCktPnNob3VsZENyZWF0ZVJlbmRlcmVycygpKXsKLSAgICAg
ICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgQ2FjaGVkT2JqZWN0ICpvID0gMDsKLSAgICBpZiAo
IXJlbG9hZCkKLSAgICAgICAgbyA9IGNhY2hlLT5maW5kKHVybC51cmwoKSk7Ci0gICAgaWYoIW8p
Ci0gICAgewotI2lmZGVmIENBQ0hFX0RFQlVHCi0gICAgICAgIGtkRGVidWcoIDYwNjAgKSA8PCAi
Q2FjaGU6IG5ldzogIiA8PCB1cmwudXJsKCkgPDwgZW5kbDsKLSNlbmRpZgotICAgICAgICBDYWNo
ZWRJbWFnZSAqaW0gPSBuZXcgQ2FjaGVkSW1hZ2UoZGwsIHVybC51cmwoKSwgY2FjaGVQb2xpY3ks
IF9leHBpcmVEYXRlKTsKLSAgICAgICAgaWYgKCBkbCAmJiBkbC0+YXV0b2xvYWRJbWFnZXMoKSAp
IENhY2hlOjpsb2FkZXIoKS0+bG9hZChkbCwgaW0sIHRydWUpOwotICAgICAgICBpZiAoY2FjaGVE
aXNhYmxlZCkKLSAgICAgICAgICAgIGltLT5zZXRGcmVlKHRydWUpOwotICAgICAgICBlbHNlIHsK
LSAgICAgICAgY2FjaGUtPmluc2VydCggdXJsLnVybCgpLCBpbSApOwotICAgICAgICBtb3ZlVG9I
ZWFkT2ZMUlVMaXN0KGltKTsKLSAgICAgICAgfQotICAgICAgICBvID0gaW07Ci0gICAgfQotCi0g
ICAgCi0gICAgaWYoby0+dHlwZSgpICE9IENhY2hlZE9iamVjdDo6SW1hZ2UpCi0gICAgewotI2lm
ZGVmIENBQ0hFX0RFQlVHCi0gICAgICAgIGtkRGVidWcoIDYwNjAgKSA8PCAiQ2FjaGU6OkludGVy
bmFsIEVycm9yIGluIHJlcXVlc3RJbWFnZSB1cmw9IiA8PCBrdXJsLnVybCgpIDw8ICIhIiA8PCBl
bmRsOwotI2VuZGlmCi0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotI2lmZGVmIENBQ0hFX0RF
QlVHCi0gICAgaWYoIG8tPnN0YXR1cygpID09IENhY2hlZE9iamVjdDo6UGVuZGluZyApCi0gICAg
ICAgIGtkRGVidWcoIDYwNjAgKSA8PCAiQ2FjaGU6IGxvYWRpbmcgaW4gcHJvZ3Jlc3M6ICIgPDwg
a3VybC51cmwoKSA8PCBlbmRsOwotICAgIGVsc2UKLSAgICAgICAga2REZWJ1ZyggNjA2MCApIDw8
ICJDYWNoZTogdXNpbmcgY2FjaGVkOiAiIDw8IGt1cmwudXJsKCkgPDwgIiwgc3RhdHVzICIgPDwg
by0+c3RhdHVzKCkgPDwgZW5kbDsKLSNlbmRpZgotCi0gICAgbW92ZVRvSGVhZE9mTFJVTGlzdChv
KTsKLSAgICBpZiAoIGRsICkgewotICAgICAgICBkbC0+bV9kb2NPYmplY3RzLnJlbW92ZSggbyAp
OwotICAgICAgICBpZiAoIWNhY2hlRGlzYWJsZWQpCi0gICAgICAgIGRsLT5tX2RvY09iamVjdHMu
YXBwZW5kKCBvICk7Ci0gICAgfQotICAgIHJldHVybiBzdGF0aWNfY2FzdDxDYWNoZWRJbWFnZSAq
PihvKTsKLX0KLQotQ2FjaGVkQ1NTU3R5bGVTaGVldCAqQ2FjaGU6OnJlcXVlc3RTdHlsZVNoZWV0
KCBEb2NMb2FkZXIqIGRsLCBjb25zdCBET01TdHJpbmcgJiB1cmwsIGJvb2wgcmVsb2FkLCB0aW1l
X3QgX2V4cGlyZURhdGUsIGNvbnN0IFFTdHJpbmcmIGNoYXJzZXQpCi17Ci0gICAgLy8gdGhpcyBi
cmluZ3MgdGhlIF91cmwgdG8gYSBzdGFuZGFyZCBmb3JtLi4uCi0gICAgS1VSTCBrdXJsOwotICAg
IEtJTzo6Q2FjaGVDb250cm9sIGNhY2hlUG9saWN5OwotICAgIGlmICggZGwgKQotICAgIHsKLSAg
ICAgICAga3VybCA9IGRsLT5tX2RvYy0+Y29tcGxldGVVUkwoIHVybC5xc3RyaW5nKCkgKTsKLSAg
ICAgICAgY2FjaGVQb2xpY3kgPSBkbC0+Y2FjaGVQb2xpY3koKTsKLSAgICB9Ci0gICAgZWxzZQot
ICAgIHsKLSAgICAgICAga3VybCA9IHVybC5xc3RyaW5nKCk7Ci0gICAgICAgIGNhY2hlUG9saWN5
ID0gS0lPOjpDQ19WZXJpZnk7Ci0gICAgfQotCi0gICAgLy8gQ2hlY2tpbmcgaWYgdGhlIFVSTCBp
cyBtYWxmb3JtZWQgaXMgbG90cyBvZiBleHRyYSB3b3JrIGZvciBsaXR0bGUgYmVuZWZpdC4KLQot
ICAgIENhY2hlZE9iamVjdCAqbyA9IGNhY2hlLT5maW5kKGt1cmwudXJsKCkpOwotICAgIGlmKCFv
KQotICAgIHsKLSNpZmRlZiBDQUNIRV9ERUJVRwotICAgICAgICBrZERlYnVnKCA2MDYwICkgPDwg
IkNhY2hlOiBuZXc6ICIgPDwga3VybC51cmwoKSA8PCBlbmRsOwotI2VuZGlmCi0gICAgICAgIENh
Y2hlZENTU1N0eWxlU2hlZXQgKnNoZWV0ID0gbmV3IENhY2hlZENTU1N0eWxlU2hlZXQoZGwsIGt1
cmwudXJsKCksIGNhY2hlUG9saWN5LCBfZXhwaXJlRGF0ZSwgY2hhcnNldCk7Ci0gICAgICAgIGlm
IChjYWNoZURpc2FibGVkKQotICAgICAgICAgICAgc2hlZXQtPnNldEZyZWUodHJ1ZSk7Ci0gICAg
ICAgIGVsc2UgewotICAgICAgICBjYWNoZS0+aW5zZXJ0KCBrdXJsLnVybCgpLCBzaGVldCApOwot
ICAgICAgICBtb3ZlVG9IZWFkT2ZMUlVMaXN0KHNoZWV0KTsKLSAgICAgICAgfQotICAgICAgICBv
ID0gc2hlZXQ7Ci0gICAgfQotCi0gICAgCi0gICAgaWYoby0+dHlwZSgpICE9IENhY2hlZE9iamVj
dDo6Q1NTU3R5bGVTaGVldCkKLSAgICB7Ci0jaWZkZWYgQ0FDSEVfREVCVUcKLSAgICAgICAga2RE
ZWJ1ZyggNjA2MCApIDw8ICJDYWNoZTo6SW50ZXJuYWwgRXJyb3IgaW4gcmVxdWVzdFN0eWxlU2hl
ZXQgdXJsPSIgPDwga3VybC51cmwoKSA8PCAiISIgPDwgZW5kbDsKLSNlbmRpZgotICAgICAgICBy
ZXR1cm4gMDsKLSAgICB9Ci0KLSNpZmRlZiBDQUNIRV9ERUJVRwotICAgIGlmKCBvLT5zdGF0dXMo
KSA9PSBDYWNoZWRPYmplY3Q6OlBlbmRpbmcgKQotICAgICAgICBrZERlYnVnKCA2MDYwICkgPDwg
IkNhY2hlOiBsb2FkaW5nIGluIHByb2dyZXNzOiAiIDw8IGt1cmwudXJsKCkgPDwgZW5kbDsKLSAg
ICBlbHNlCi0gICAgICAgIGtkRGVidWcoIDYwNjAgKSA8PCAiQ2FjaGU6IHVzaW5nIGNhY2hlZDog
IiA8PCBrdXJsLnVybCgpIDw8IGVuZGw7Ci0jZW5kaWYKLQotICAgIG1vdmVUb0hlYWRPZkxSVUxp
c3Qobyk7Ci0gICAgaWYgKCBkbCApIHsKLSAgICAgICAgZGwtPm1fZG9jT2JqZWN0cy5yZW1vdmUo
IG8gKTsKLSAgICAgICAgaWYgKCFjYWNoZURpc2FibGVkKQotICAgICAgICBkbC0+bV9kb2NPYmpl
Y3RzLmFwcGVuZCggbyApOwotICAgIH0KLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q2FjaGVkQ1NT
U3R5bGVTaGVldCAqPihvKTsKLX0KLQotdm9pZCBDYWNoZTo6cHJlbG9hZFN0eWxlU2hlZXQoIGNv
bnN0IFFTdHJpbmcgJnVybCwgY29uc3QgUVN0cmluZyAmc3R5bGVzaGVldF9kYXRhKQotewotICAg
IENhY2hlZE9iamVjdCAqbyA9IGNhY2hlLT5maW5kKHVybCk7Ci0gICAgaWYobykKLSAgICAgICAg
cmVtb3ZlQ2FjaGVFbnRyeShvKTsKLQotICAgIENhY2hlZENTU1N0eWxlU2hlZXQgKnN0eWxlc2hl
ZXQgPSBuZXcgQ2FjaGVkQ1NTU3R5bGVTaGVldCh1cmwsIHN0eWxlc2hlZXRfZGF0YSk7Ci0gICAg
Y2FjaGUtPmluc2VydCggdXJsLCBzdHlsZXNoZWV0ICk7Ci19Ci0KLUNhY2hlZFNjcmlwdCAqQ2Fj
aGU6OnJlcXVlc3RTY3JpcHQoIERvY0xvYWRlciogZGwsIGNvbnN0IERPTTo6RE9NU3RyaW5nICZ1
cmwsIGJvb2wgcmVsb2FkLCB0aW1lX3QgX2V4cGlyZURhdGUsIGNvbnN0IFFTdHJpbmcmIGNoYXJz
ZXQpCi17Ci0gICAgLy8gdGhpcyBicmluZ3MgdGhlIF91cmwgdG8gYSBzdGFuZGFyZCBmb3JtLi4u
Ci0gICAgS1VSTCBrdXJsOwotICAgIEtJTzo6Q2FjaGVDb250cm9sIGNhY2hlUG9saWN5OwotICAg
IGlmICggZGwgKQotICAgIHsKLSAgICAgICAga3VybCA9IGRsLT5tX2RvYy0+Y29tcGxldGVVUkwo
IHVybC5xc3RyaW5nKCkgKTsKLSAgICAgICAgY2FjaGVQb2xpY3kgPSBkbC0+Y2FjaGVQb2xpY3ko
KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAga3VybCA9IHVybC5xc3RyaW5nKCk7
Ci0gICAgICAgIGNhY2hlUG9saWN5ID0gS0lPOjpDQ19WZXJpZnk7Ci0gICAgfQotCi0gICAgLy8g
Q2hlY2tpbmcgaWYgdGhlIFVSTCBpcyBtYWxmb3JtZWQgaXMgbG90cyBvZiBleHRyYSB3b3JrIGZv
ciBsaXR0bGUgYmVuZWZpdC4KLQotICAgIENhY2hlZE9iamVjdCAqbyA9IGNhY2hlLT5maW5kKGt1
cmwudXJsKCkpOwotICAgIGlmKCFvKQotICAgIHsKLSNpZmRlZiBDQUNIRV9ERUJVRwotICAgICAg
ICBrZERlYnVnKCA2MDYwICkgPDwgIkNhY2hlOiBuZXc6ICIgPDwga3VybC51cmwoKSA8PCBlbmRs
OwotI2VuZGlmCi0gICAgICAgIENhY2hlZFNjcmlwdCAqc2NyaXB0ID0gbmV3IENhY2hlZFNjcmlw
dChkbCwga3VybC51cmwoKSwgY2FjaGVQb2xpY3ksIF9leHBpcmVEYXRlLCBjaGFyc2V0KTsKLSAg
ICAgICAgaWYgKGNhY2hlRGlzYWJsZWQpCi0gICAgICAgICAgICBzY3JpcHQtPnNldEZyZWUodHJ1
ZSk7Ci0gICAgICAgIGVsc2UgewotICAgICAgICBjYWNoZS0+aW5zZXJ0KCBrdXJsLnVybCgpLCBz
Y3JpcHQgKTsKLSAgICAgICAgbW92ZVRvSGVhZE9mTFJVTGlzdChzY3JpcHQpOwotICAgICAgICB9
Ci0gICAgICAgIG8gPSBzY3JpcHQ7Ci0gICAgfQotCi0gICAgCi0gICAgaWYoIShvLT50eXBlKCkg
PT0gQ2FjaGVkT2JqZWN0OjpTY3JpcHQpKQotICAgIHsKLSNpZmRlZiBDQUNIRV9ERUJVRwotICAg
ICAgICBrZERlYnVnKCA2MDYwICkgPDwgIkNhY2hlOjpJbnRlcm5hbCBFcnJvciBpbiByZXF1ZXN0
U2NyaXB0IHVybD0iIDw8IGt1cmwudXJsKCkgPDwgIiEiIDw8IGVuZGw7Ci0jZW5kaWYKLSAgICAg
ICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIAotICAgIAotI2lmZGVmIENBQ0hFX0RFQlVHCi0gICAg
aWYoIG8tPnN0YXR1cygpID09IENhY2hlZE9iamVjdDo6UGVuZGluZyApCi0gICAgICAgIGtkRGVi
dWcoIDYwNjAgKSA8PCAiQ2FjaGU6IGxvYWRpbmcgaW4gcHJvZ3Jlc3M6ICIgPDwga3VybC51cmwo
KSA8PCBlbmRsOwotICAgIGVsc2UKLSAgICAgICAga2REZWJ1ZyggNjA2MCApIDw8ICJDYWNoZTog
dXNpbmcgY2FjaGVkOiAiIDw8IGt1cmwudXJsKCkgPDwgZW5kbDsKLSNlbmRpZgotCi0gICAgbW92
ZVRvSGVhZE9mTFJVTGlzdChvKTsKLSAgICBpZiAoIGRsICkgewotICAgICAgICBkbC0+bV9kb2NP
YmplY3RzLnJlbW92ZSggbyApOwotICAgICAgICBpZiAoIWNhY2hlRGlzYWJsZWQpCi0gICAgICAg
IGRsLT5tX2RvY09iamVjdHMuYXBwZW5kKCBvICk7Ci0gICAgfQotICAgIHJldHVybiBzdGF0aWNf
Y2FzdDxDYWNoZWRTY3JpcHQgKj4obyk7Ci19Ci0KLXZvaWQgQ2FjaGU6OnByZWxvYWRTY3JpcHQo
IGNvbnN0IFFTdHJpbmcgJnVybCwgY29uc3QgUVN0cmluZyAmc2NyaXB0X2RhdGEpCi17Ci0gICAg
Q2FjaGVkT2JqZWN0ICpvID0gY2FjaGUtPmZpbmQodXJsKTsKLSAgICBpZihvKQotICAgICAgICBy
ZW1vdmVDYWNoZUVudHJ5KG8pOwotCi0gICAgQ2FjaGVkU2NyaXB0ICpzY3JpcHQgPSBuZXcgQ2Fj
aGVkU2NyaXB0KHVybCwgc2NyaXB0X2RhdGEpOwotICAgIGNhY2hlLT5pbnNlcnQoIHVybCwgc2Ny
aXB0ICk7Ci19Ci0KLSNpZmRlZiBLSFRNTF9YU0xUCi1DYWNoZWRYU0xTdHlsZVNoZWV0KiBDYWNo
ZTo6cmVxdWVzdFhTTFN0eWxlU2hlZXQoRG9jTG9hZGVyKiBkbCwgY29uc3QgRE9NU3RyaW5nICYg
dXJsLCBib29sIHJlbG9hZCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgdGltZV90IF9leHBpcmVEYXRlKQotewotICAgIC8vIHRoaXMgYnJpbmdzIHRo
ZSBfdXJsIHRvIGEgc3RhbmRhcmQgZm9ybS4uLgotICAgIEtVUkwga3VybDsKLSAgICBLSU86OkNh
Y2hlQ29udHJvbCBjYWNoZVBvbGljeTsKLSAgICBpZiAoZGwpIHsKLSAgICAgICAga3VybCA9IGRs
LT5tX2RvYy0+Y29tcGxldGVVUkwodXJsLnFzdHJpbmcoKSk7Ci0gICAgICAgIGNhY2hlUG9saWN5
ID0gZGwtPmNhY2hlUG9saWN5KCk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBrdXJsID0g
dXJsLnFzdHJpbmcoKTsKLSAgICAgICAgY2FjaGVQb2xpY3kgPSBLSU86OkNDX1ZlcmlmeTsKLSAg
ICB9Ci0gICAgCi0gICAgLy8gQ2hlY2tpbmcgaWYgdGhlIFVSTCBpcyBtYWxmb3JtZWQgaXMgbG90
cyBvZiBleHRyYSB3b3JrIGZvciBsaXR0bGUgYmVuZWZpdC4KLSAgICAKLSAgICBDYWNoZWRPYmpl
Y3QgKm8gPSBjYWNoZS0+ZmluZChrdXJsLnVybCgpKTsKLSAgICBpZiAoIW8pIHsKLSNpZmRlZiBD
QUNIRV9ERUJVRwotICAgICAgICBrZERlYnVnKCA2MDYwICkgPDwgIkNhY2hlOiBuZXc6ICIgPDwg
a3VybC51cmwoKSA8PCBlbmRsOwotI2VuZGlmCi0gICAgICAgIENhY2hlZFhTTFN0eWxlU2hlZXQq
IGRvYyA9IG5ldyBDYWNoZWRYU0xTdHlsZVNoZWV0KGRsLCBrdXJsLnVybCgpLCBjYWNoZVBvbGlj
eSwgX2V4cGlyZURhdGUpOwotICAgICAgICBpZiAoY2FjaGVEaXNhYmxlZCkKLSAgICAgICAgICAg
IGRvYy0+c2V0RnJlZSh0cnVlKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBjYWNoZS0+
aW5zZXJ0KGt1cmwudXJsKCksIGRvYyk7Ci0gICAgICAgICAgICBtb3ZlVG9IZWFkT2ZMUlVMaXN0
KGRvYyk7Ci0gICAgICAgIH0KLSAgICAgICAgbyA9IGRvYzsKLSAgICB9Ci0gICAgCi0gICAgCi0g
ICAgaWYgKG8tPnR5cGUoKSAhPSBDYWNoZWRPYmplY3Q6OlhTTFN0eWxlU2hlZXQpIHsKLSNpZmRl
ZiBDQUNIRV9ERUJVRwotICAgICAgICBrZERlYnVnKCA2MDYwICkgPDwgIkNhY2hlOjpJbnRlcm5h
bCBFcnJvciBpbiByZXF1ZXN0WFNMU3R5bGVTaGVldCB1cmw9IiA8PCBrdXJsLnVybCgpIDw8ICIh
IiA8PCBlbmRsOwotI2VuZGlmCi0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICAKLSNpZmRl
ZiBDQUNIRV9ERUJVRwotICAgIGlmIChvLT5zdGF0dXMoKSA9PSBDYWNoZWRPYmplY3Q6OlBlbmRp
bmcpCi0gICAgICAgIGtkRGVidWcoIDYwNjAgKSA8PCAiQ2FjaGU6IGxvYWRpbmcgaW4gcHJvZ3Jl
c3M6ICIgPDwga3VybC51cmwoKSA8PCBlbmRsOwotICAgIGVsc2UKLSAgICAgICAga2REZWJ1Zygg
NjA2MCApIDw8ICJDYWNoZTogdXNpbmcgY2FjaGVkOiAiIDw8IGt1cmwudXJsKCkgPDwgZW5kbDsK
LSNlbmRpZgotICAgIAotICAgIG1vdmVUb0hlYWRPZkxSVUxpc3Qobyk7Ci0gICAgaWYgKGRsKSB7
Ci0gICAgICAgIGRsLT5tX2RvY09iamVjdHMucmVtb3ZlKCBvICk7Ci0gICAgICAgIGlmICghY2Fj
aGVEaXNhYmxlZCkKLSAgICAgICAgICAgIGRsLT5tX2RvY09iamVjdHMuYXBwZW5kKCBvICk7Ci0g
ICAgfQotICAgIHJldHVybiBzdGF0aWNfY2FzdDxDYWNoZWRYU0xTdHlsZVNoZWV0Kj4obyk7Ci19
Ci0jZW5kaWYKLQotI2lmbmRlZiBLSFRNTF9OT19YQkwKLUNhY2hlZFhCTERvY3VtZW50KiBDYWNo
ZTo6cmVxdWVzdFhCTERvY3VtZW50KERvY0xvYWRlciogZGwsIGNvbnN0IERPTVN0cmluZyAmIHVy
bCwgYm9vbCByZWxvYWQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgdGltZV90IF9leHBpcmVEYXRlKQotewotICAgIC8vIHRoaXMgYnJpbmdzIHRoZSBfdXJs
IHRvIGEgc3RhbmRhcmQgZm9ybS4uLgotICAgIEtVUkwga3VybDsKLSAgICBLSU86OkNhY2hlQ29u
dHJvbCBjYWNoZVBvbGljeTsKLSAgICBpZiAoZGwpIHsKLSAgICAgICAga3VybCA9IGRsLT5tX2Rv
Yy0+Y29tcGxldGVVUkwodXJsLnFzdHJpbmcoKSk7Ci0gICAgICAgIGNhY2hlUG9saWN5ID0gZGwt
PmNhY2hlUG9saWN5KCk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBrdXJsID0gdXJsLnFz
dHJpbmcoKTsKLSAgICAgICAgY2FjaGVQb2xpY3kgPSBLSU86OkNDX1ZlcmlmeTsKLSAgICB9Ci0g
ICAgCi0gICAgLy8gQ2hlY2tpbmcgaWYgdGhlIFVSTCBpcyBtYWxmb3JtZWQgaXMgbG90cyBvZiBl
eHRyYSB3b3JrIGZvciBsaXR0bGUgYmVuZWZpdC4KLSAgICAKLSAgICBDYWNoZWRPYmplY3QgKm8g
PSBjYWNoZS0+ZmluZChrdXJsLnVybCgpKTsKLSAgICBpZighbykKLSAgICB7Ci0jaWZkZWYgQ0FD
SEVfREVCVUcKLSAgICAgICAga2REZWJ1ZyggNjA2MCApIDw8ICJDYWNoZTogbmV3OiAiIDw8IGt1
cmwudXJsKCkgPDwgZW5kbDsKLSNlbmRpZgotICAgICAgICBDYWNoZWRYQkxEb2N1bWVudCogZG9j
ID0gbmV3IENhY2hlZFhCTERvY3VtZW50KGRsLCBrdXJsLnVybCgpLCBjYWNoZVBvbGljeSwgX2V4
cGlyZURhdGUpOwotICAgICAgICBpZiAoY2FjaGVEaXNhYmxlZCkKLSAgICAgICAgICAgIGRvYy0+
c2V0RnJlZSh0cnVlKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBjYWNoZS0+aW5zZXJ0
KGt1cmwudXJsKCksIGRvYyk7Ci0gICAgICAgICAgICBtb3ZlVG9IZWFkT2ZMUlVMaXN0KGRvYyk7
Ci0gICAgICAgIH0KLSAgICAgICAgbyA9IGRvYzsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgaWYo
by0+dHlwZSgpICE9IENhY2hlZE9iamVjdDo6WEJMKQotICAgIHsKLSNpZmRlZiBDQUNIRV9ERUJV
RwotICAgICAgICBrZERlYnVnKCA2MDYwICkgPDwgIkNhY2hlOjpJbnRlcm5hbCBFcnJvciBpbiBy
ZXF1ZXN0WEJMRG9jdW1lbnQgdXJsPSIgPDwga3VybC51cmwoKSA8PCAiISIgPDwgZW5kbDsKLSNl
bmRpZgotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgCi0jaWZkZWYgQ0FDSEVfREVCVUcK
LSAgICBpZiggby0+c3RhdHVzKCkgPT0gQ2FjaGVkT2JqZWN0OjpQZW5kaW5nICkKLSAgICAgICAg
a2REZWJ1ZyggNjA2MCApIDw8ICJDYWNoZTogbG9hZGluZyBpbiBwcm9ncmVzczogIiA8PCBrdXJs
LnVybCgpIDw8IGVuZGw7Ci0gICAgZWxzZQotICAgICAgICBrZERlYnVnKCA2MDYwICkgPDwgIkNh
Y2hlOiB1c2luZyBjYWNoZWQ6ICIgPDwga3VybC51cmwoKSA8PCBlbmRsOwotI2VuZGlmCi0gICAg
Ci0gICAgbW92ZVRvSGVhZE9mTFJVTGlzdChvKTsKLSAgICBpZiAoIGRsICkgewotICAgICAgICBk
bC0+bV9kb2NPYmplY3RzLnJlbW92ZSggbyApOwotICAgICAgICBpZiAoIWNhY2hlRGlzYWJsZWQp
Ci0gICAgICAgICAgICBkbC0+bV9kb2NPYmplY3RzLmFwcGVuZCggbyApOwotICAgIH0KLSAgICBy
ZXR1cm4gc3RhdGljX2Nhc3Q8Q2FjaGVkWEJMRG9jdW1lbnQqPihvKTsKLX0KLSNlbmRpZgotCi12
b2lkIENhY2hlOjpmbHVzaChib29sIGZvcmNlKQotewotICAgIGlmIChmb3JjZSkKLSAgICAgICBm
bHVzaENvdW50ID0gMDsKLSAgICAvLyBEb24ndCBmbHVzaCBmb3IgZXZlcnkgaW1hZ2UuCi0gICAg
aWYgKG1fY291bnRPZkxSVUFuZFVuY2FjaGVhYmxlTGlzdHMgPCBmbHVzaENvdW50KQotICAgICAg
IHJldHVybjsKLQotICAgIGluaXQoKTsKLQotICAgIHdoaWxlIChtX2hlYWRPZlVuY2FjaGVhYmxl
TGlzdCkKLSAgICAgICAgcmVtb3ZlQ2FjaGVFbnRyeShtX2hlYWRPZlVuY2FjaGVhYmxlTGlzdCk7
Ci0KLSAgICBmb3IgKGludCBpID0gTUFYX0xSVV9MSVNUUy0xOyBpPj0wOyBpLS0pIHsKLSAgICAg
ICAgaWYgKG1fdG90YWxTaXplT2ZMUlVMaXN0cyA8PSBtYXhTaXplKQotICAgICAgICAgICAgYnJl
YWs7Ci0gICAgICAgICAgICAKLSAgICAgICAgd2hpbGUgKG1fdG90YWxTaXplT2ZMUlVMaXN0cyA+
IG1heFNpemUgJiYgbV9MUlVMaXN0c1tpXS5tX3RhaWwpCi0gICAgICAgICAgICByZW1vdmVDYWNo
ZUVudHJ5KG1fTFJVTGlzdHNbaV0ubV90YWlsKTsKLSAgICB9Ci0KLSAgICBmbHVzaENvdW50ID0g
bV9jb3VudE9mTFJVQW5kVW5jYWNoZWFibGVMaXN0cysxMDsgLy8gRmx1c2ggYWdhaW4gd2hlbiB0
aGUgY2FjaGUgaGFzIGdyb3duLgotfQotCi0KLXZvaWQgQ2FjaGU6OnNldFNpemUoIGludCBieXRl
cyApCi17Ci0gICAgbWF4U2l6ZSA9IGJ5dGVzOwotICAgIG1heENhY2hlYWJsZSA9IGtNYXgobWF4
U2l6ZSAvIDEyOCwgTUFYQ0FDSEVBQkxFKTsKLQotICAgIC8vIG1heSBiZSB3ZSBuZWVkIHRvIGNs
ZWFyIHBhcnRzIG9mIHRoZSBjYWNoZQotICAgIGZsdXNoQ291bnQgPSAwOwotICAgIGZsdXNoKHRy
dWUpOwotfQotCi12b2lkIENhY2hlOjpyZW1vdmVDYWNoZUVudHJ5KCBDYWNoZWRPYmplY3QgKm9i
amVjdCApCi17Ci0gIFFTdHJpbmcga2V5ID0gb2JqZWN0LT51cmwoKS5xc3RyaW5nKCk7Ci0KLSAg
Ly8gdGhpcyBpbmRpY2F0ZXMgdGhlIGRlcmVmKCkgbWV0aG9kIG9mIENhY2hlZE9iamVjdCB0byBk
ZWxldGUgaXRzZWxmIHdoZW4gdGhlIHJlZmVyZW5jZSBjb3VudGVyCi0gIC8vIGRyb3BzIGRvd24g
dG8gemVybwotICBvYmplY3QtPnNldEZyZWUoIHRydWUgKTsKLQotICBjYWNoZS0+cmVtb3ZlKCBr
ZXkgKTsKLSAgcmVtb3ZlRnJvbUxSVUxpc3Qob2JqZWN0KTsKLQotICBjb25zdCBEb2NMb2FkZXIq
IGRsOwotICBmb3IgKCBkbD1kb2Nsb2FkZXItPmZpcnN0KCk7IGRsOyBkbD1kb2Nsb2FkZXItPm5l
eHQoKSApCi0gICAgICBkbC0+cmVtb3ZlQ2FjaGVkT2JqZWN0KCBvYmplY3QgKTsKLQotICBpZiAo
IG9iamVjdC0+Y2FuRGVsZXRlKCkgKQotICAgICBkZWxldGUgb2JqZWN0OwotfQotCi0jZGVmaW5l
IEZBU1RfTE9HMihfbG9nMixfbikgICBcCi0gICAgICB1bnNpZ25lZCBpbnQgal8gPSAodW5zaWdu
ZWQgaW50KShfbik7ICAgXAotICAgICAgKF9sb2cyKSA9IDA7ICAgICAgICAgICAgICAgICAgICBc
Ci0gICAgICBpZiAoKGpfKSAmICgoal8pLTEpKSAgICAgICAgICAgIFwKLSAgICAgIChfbG9nMikg
Kz0gMTsgICAgICAgICAgICAgICBcCi0gICAgICBpZiAoKGpfKSA+PiAxNikgICAgICAgICAgICAg
ICAgIFwKLSAgICAgIChfbG9nMikgKz0gMTYsIChqXykgPj49IDE2OyBcCi0gICAgICBpZiAoKGpf
KSA+PiA4KSAgICAgICAgICAgICAgICAgIFwKLSAgICAgIChfbG9nMikgKz0gOCwgKGpfKSA+Pj0g
ODsgICBcCi0gICAgICBpZiAoKGpfKSA+PiA0KSAgICAgICAgICAgICAgICAgIFwKLSAgICAgIChf
bG9nMikgKz0gNCwgKGpfKSA+Pj0gNDsgICBcCi0gICAgICBpZiAoKGpfKSA+PiAyKSAgICAgICAg
ICAgICAgICAgIFwKLSAgICAgIChfbG9nMikgKz0gMiwgKGpfKSA+Pj0gMjsgICBcCi0gICAgICBp
ZiAoKGpfKSA+PiAxKSAgICAgICAgICAgICAgICAgIFwKLSAgICAgIChfbG9nMikgKz0gMTsKLQot
aW50IEZhc3RMb2cyKHVuc2lnbmVkIGludCBpKSB7Ci0gICAgaW50IGxvZzI7Ci0gICAgRkFTVF9M
T0cyKGxvZzIsaSk7Ci0gICAgcmV0dXJuIGxvZzI7Ci19Ci0KLUxSVUxpc3QqIENhY2hlOjpnZXRM
UlVMaXN0Rm9yKENhY2hlZE9iamVjdCogbykKLXsKLSAgICBpbnQgYWNjZXNzQ291bnQgPSBvLT5h
Y2Nlc3NDb3VudCgpOwotICAgIGludCBxdWV1ZUluZGV4OwotICAgIGlmIChhY2Nlc3NDb3VudCA9
PSAwKSB7Ci0gICAgICAgIHF1ZXVlSW5kZXggPSAwOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlu
dCBzaXplTG9nID0gRmFzdExvZzIoby0+c2l6ZSgpKTsKLSAgICAgICAgcXVldWVJbmRleCA9IHNp
emVMb2cvby0+YWNjZXNzQ291bnQoKSAtIDE7Ci0gICAgICAgIGlmIChxdWV1ZUluZGV4IDwgMCkK
LSAgICAgICAgICAgIHF1ZXVlSW5kZXggPSAwOwotICAgICAgICBpZiAocXVldWVJbmRleCA+PSBN
QVhfTFJVX0xJU1RTKQotICAgICAgICAgICAgcXVldWVJbmRleCA9IE1BWF9MUlVfTElTVFMtMTsK
LSAgICB9Ci0gICAgaWYgKG1fTFJVTGlzdHMgPT0gMCkgewotICAgICAgICBtX0xSVUxpc3RzID0g
bmV3IExSVUxpc3QgW01BWF9MUlVfTElTVFNdOwotICAgIH0KLSAgICByZXR1cm4gJm1fTFJVTGlz
dHNbcXVldWVJbmRleF07Ci19Ci0KLXZvaWQgQ2FjaGU6OnJlbW92ZUZyb21MUlVMaXN0KENhY2hl
ZE9iamVjdCAqb2JqZWN0KQotewotICAgIENhY2hlZE9iamVjdCAqbmV4dCA9IG9iamVjdC0+bV9u
ZXh0SW5MUlVMaXN0OwotICAgIENhY2hlZE9iamVjdCAqcHJldiA9IG9iamVjdC0+bV9wcmV2SW5M
UlVMaXN0OwotICAgIGJvb2wgdW5jYWNoZWFibGUgPSBvYmplY3QtPnN0YXR1cygpID09IENhY2hl
ZE9iamVjdDo6VW5jYWNoZWFibGU7Ci0gICAgCi0gICAgTFJVTGlzdCogbGlzdCA9IHVuY2FjaGVh
YmxlID8gMCA6IGdldExSVUxpc3RGb3Iob2JqZWN0KTsKLSAgICBDYWNoZWRPYmplY3QgKiZoZWFk
ID0gdW5jYWNoZWFibGUgPyBtX2hlYWRPZlVuY2FjaGVhYmxlTGlzdCA6IGxpc3QtPm1faGVhZDsK
LSAgICAKLSAgICBpZiAobmV4dCA9PSAwICYmIHByZXYgPT0gMCAmJiBoZWFkICE9IG9iamVjdCkg
ewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIAotICAgIG9iamVjdC0+bV9uZXh0SW5MUlVM
aXN0ID0gMDsKLSAgICBvYmplY3QtPm1fcHJldkluTFJVTGlzdCA9IDA7Ci0gICAgCi0gICAgaWYg
KG5leHQpCi0gICAgICAgIG5leHQtPm1fcHJldkluTFJVTGlzdCA9IHByZXY7Ci0gICAgZWxzZSBp
ZiAoIXVuY2FjaGVhYmxlICYmIGxpc3QtPm1fdGFpbCA9PSBvYmplY3QpCi0gICAgICAgIGxpc3Qt
Pm1fdGFpbCA9IHByZXY7Ci0KLSAgICBpZiAocHJldikKLSAgICAgICAgcHJldi0+bV9uZXh0SW5M
UlVMaXN0ID0gbmV4dDsKLSAgICBlbHNlIGlmIChoZWFkID09IG9iamVjdCkKLSAgICAgICAgaGVh
ZCA9IG5leHQ7Ci0gICAgCi0gICAgLS1tX2NvdW50T2ZMUlVBbmRVbmNhY2hlYWJsZUxpc3RzOwot
ICAgIAotICAgIGlmICghdW5jYWNoZWFibGUpCi0gICAgICAgIG1fdG90YWxTaXplT2ZMUlVMaXN0
cyAtPSBvYmplY3QtPnNpemUoKTsKLX0KLQotdm9pZCBDYWNoZTo6bW92ZVRvSGVhZE9mTFJVTGlz
dChDYWNoZWRPYmplY3QgKm9iamVjdCkKLXsKLSAgICBpbnNlcnRJbkxSVUxpc3Qob2JqZWN0KTsK
LX0KLQotdm9pZCBDYWNoZTo6aW5zZXJ0SW5MUlVMaXN0KENhY2hlZE9iamVjdCAqb2JqZWN0KQot
ewotICAgIHJlbW92ZUZyb21MUlVMaXN0KG9iamVjdCk7Ci0gICAgCi0gICAgaWYgKCFvYmplY3Qt
PmFsbG93SW5MUlVMaXN0KCkpCi0gICAgICAgIHJldHVybjsKLSAgICAKLSAgICBMUlVMaXN0KiBs
aXN0ID0gZ2V0TFJVTGlzdEZvcihvYmplY3QpOwotICAgIAotICAgIGJvb2wgdW5jYWNoZWFibGUg
PSBvYmplY3QtPnN0YXR1cygpID09IENhY2hlZE9iamVjdDo6VW5jYWNoZWFibGU7Ci0gICAgQ2Fj
aGVkT2JqZWN0IComaGVhZCA9IHVuY2FjaGVhYmxlID8gbV9oZWFkT2ZVbmNhY2hlYWJsZUxpc3Qg
OiBsaXN0LT5tX2hlYWQ7Ci0KLSAgICBvYmplY3QtPm1fbmV4dEluTFJVTGlzdCA9IGhlYWQ7Ci0g
ICAgaWYgKGhlYWQpCi0gICAgICAgIGhlYWQtPm1fcHJldkluTFJVTGlzdCA9IG9iamVjdDsKLSAg
ICBoZWFkID0gb2JqZWN0OwotICAgIAotICAgIGlmIChvYmplY3QtPm1fbmV4dEluTFJVTGlzdCA9
PSAwICYmICF1bmNhY2hlYWJsZSkKLSAgICAgICAgbGlzdC0+bV90YWlsID0gb2JqZWN0OwotICAg
IAotICAgICsrbV9jb3VudE9mTFJVQW5kVW5jYWNoZWFibGVMaXN0czsKLSAgICAKLSAgICBpZiAo
IXVuY2FjaGVhYmxlKQotICAgICAgICBtX3RvdGFsU2l6ZU9mTFJVTGlzdHMgKz0gb2JqZWN0LT5z
aXplKCk7Ci19Ci0KLWJvb2wgQ2FjaGU6OmFkanVzdFNpemUoQ2FjaGVkT2JqZWN0ICpvYmplY3Qs
IGludCBkZWx0YSkKLXsKLSAgICBpZiAob2JqZWN0LT5zdGF0dXMoKSA9PSBDYWNoZWRPYmplY3Q6
OlVuY2FjaGVhYmxlKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAob2JqZWN0LT5t
X25leHRJbkxSVUxpc3QgPT0gMCAmJiBvYmplY3QtPm1fcHJldkluTFJVTGlzdCA9PSAwICYmCi0g
ICAgICAgIGdldExSVUxpc3RGb3Iob2JqZWN0KS0+bV9oZWFkICE9IG9iamVjdCkKLSAgICAgICAg
cmV0dXJuIGZhbHNlOwotICAgIAotICAgIG1fdG90YWxTaXplT2ZMUlVMaXN0cyArPSBkZWx0YTsK
LSAgICByZXR1cm4gZGVsdGEgIT0gMDsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0KLQotQ2FjaGVkT2JqZWN0Q2xpZW50ICpDYWNoZWRPYmplY3RDbGllbnRX
YWxrZXI6Om5leHQoKQotewotICAgIC8vIE9ubHkgYWR2YW5jZSBpZiB3ZSBhbHJlYWR5IHJldHVy
bmVkIHRoaXMgaXRlbS4KLSAgICAvLyBUaGlzIGhhbmRsZXMgY2FzZXMgd2hlcmUgdGhlIGN1cnJl
bnQgaXRlbSBpcyByZW1vdmVkLCBhbmQgcHJldmVudHMgdXMgZnJvbSBza2lwcGluZyB0aGUgbmV4
dCBpdGVtLgotICAgIC8vIFRoZSBpdGVyYXRvciBhdXRvbWF0aWNhbGx5IGdldHMgYWR2YW5jZWQg
dG8gdGhlIG5leHQgaXRlbSwgYW5kIHdlIG1ha2Ugc3VyZSB3ZSByZXR1cm4gaXQuCi0gICAgaWYg
KF9jdXJyZW50ID09IF9pdGVyYXRvci5jdXJyZW50KCkpCi0gICAgICAgICsrX2l0ZXJhdG9yOwot
ICAgIF9jdXJyZW50ID0gX2l0ZXJhdG9yLmN1cnJlbnQoKTsKLSAgICByZXR1cm4gX2N1cnJlbnQ7
Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUNhY2hl
ZE9iamVjdENsaWVudDo6fkNhY2hlZE9iamVjdENsaWVudCgpIHsgfQotdm9pZCBDYWNoZWRPYmpl
Y3RDbGllbnQ6OnNldFBpeG1hcChjb25zdCBRUGl4bWFwICYsIGNvbnN0IFFSZWN0JiwgQ2FjaGVk
SW1hZ2UgKikge30KLXZvaWQgQ2FjaGVkT2JqZWN0Q2xpZW50OjpzZXRTdHlsZVNoZWV0KGNvbnN0
IERPTTo6RE9NU3RyaW5nICYvKnVybCovLCBjb25zdCBET006OkRPTVN0cmluZyAmLypzaGVldCov
KSB7fQotI2lmbmRlZiBLSFRNTF9OT19YQkwKLXZvaWQgQ2FjaGVkT2JqZWN0Q2xpZW50OjpzZXRY
QkxEb2N1bWVudChjb25zdCBET006OkRPTVN0cmluZyYgdXJsLCBYQkw6OlhCTERvY3VtZW50SW1w
bCogZG9jKSB7fQotI2VuZGlmCi12b2lkIENhY2hlZE9iamVjdENsaWVudDo6bm90aWZ5RmluaXNo
ZWQoQ2FjaGVkT2JqZWN0ICogLypmaW5pc2hlZE9iaiovKSB7fQotCi1DYWNoZTo6U3RhdGlzdGlj
cyBDYWNoZTo6Z2V0U3RhdGlzdGljcygpCi17Ci0gICAgU3RhdGlzdGljcyBzdGF0czsKLQotICAg
IGlmICghY2FjaGUpCi0gICAgICAgIHJldHVybiBzdGF0czsKLQotICAgIFFEaWN0SXRlcmF0b3I8
Q2FjaGVkT2JqZWN0PiBpKCpjYWNoZSk7Ci0gICAgZm9yIChpLnRvRmlyc3QoKTsgaS5jdXJyZW50
KCk7ICsraSkgewotICAgICAgICBDYWNoZWRPYmplY3QgKm8gPSBpLmN1cnJlbnQoKTsKLSAgICAg
ICAgc3dpdGNoIChvLT50eXBlKCkpIHsKLSAgICAgICAgICAgIGNhc2UgQ2FjaGVkT2JqZWN0OjpJ
bWFnZToKLSAgICAgICAgICAgICAgICBzdGF0cy5pbWFnZXMuY291bnQrKzsKLSAgICAgICAgICAg
ICAgICBzdGF0cy5pbWFnZXMuc2l6ZSArPSBvLT5zaXplKCk7Ci0gICAgICAgICAgICAgICAgYnJl
YWs7Ci0KLSAgICAgICAgICAgIGNhc2UgQ2FjaGVkT2JqZWN0OjpDU1NTdHlsZVNoZWV0OgotICAg
ICAgICAgICAgICAgIHN0YXRzLnN0eWxlU2hlZXRzLmNvdW50Kys7Ci0gICAgICAgICAgICAgICAg
c3RhdHMuc3R5bGVTaGVldHMuc2l6ZSArPSBvLT5zaXplKCk7Ci0gICAgICAgICAgICAgICAgYnJl
YWs7Ci0KLSAgICAgICAgICAgIGNhc2UgQ2FjaGVkT2JqZWN0OjpTY3JpcHQ6Ci0gICAgICAgICAg
ICAgICAgc3RhdHMuc2NyaXB0cy5jb3VudCsrOwotICAgICAgICAgICAgICAgIHN0YXRzLnNjcmlw
dHMuc2l6ZSArPSBvLT5zaXplKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0jaWZkZWYgS0hU
TUxfWFNMVAotICAgICAgICAgICAgY2FzZSBDYWNoZWRPYmplY3Q6OlhTTFN0eWxlU2hlZXQ6Ci0g
ICAgICAgICAgICAgICAgc3RhdHMueHNsU3R5bGVTaGVldHMuY291bnQrKzsKLSAgICAgICAgICAg
ICAgICBzdGF0cy54c2xTdHlsZVNoZWV0cy5zaXplICs9IG8tPnNpemUoKTsKLSAgICAgICAgICAg
ICAgICBicmVhazsKLSNlbmRpZgotI2lmbmRlZiBLSFRNTF9OT19YQkwKLSAgICAgICAgICAgIGNh
c2UgQ2FjaGVkT2JqZWN0OjpYQkw6Ci0gICAgICAgICAgICAgICAgc3RhdHMueGJsRG9jcy5jb3Vu
dCsrOwotICAgICAgICAgICAgICAgIHN0YXRzLnhibERvY3Muc2l6ZSArPSBvLT5zaXplKCk7Ci0g
ICAgICAgICAgICAgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAg
ICAgICAgICAgICAgc3RhdHMub3RoZXIuY291bnQrKzsKLSAgICAgICAgICAgICAgICBzdGF0cy5v
dGhlci5zaXplICs9IG8tPnNpemUoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1
cm4gc3RhdHM7Ci19Ci0KLXZvaWQgQ2FjaGU6OmZsdXNoQWxsKCkKLXsKLSAgICBpZiAoIWNhY2hl
KQotICAgICAgICByZXR1cm47Ci0KLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIFFEaWN0SXRlcmF0
b3I8Q2FjaGVkT2JqZWN0PiBpKCpjYWNoZSk7Ci0gICAgICAgIENhY2hlZE9iamVjdCAqbyA9IGku
dG9GaXJzdCgpOwotICAgICAgICBpZiAoIW8pCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAg
cmVtb3ZlQ2FjaGVFbnRyeShvKTsKLSAgICB9Ci19Ci0KLXZvaWQgQ2FjaGU6OnNldENhY2hlRGlz
YWJsZWQoYm9vbCBkaXNhYmxlZCkKLXsKLSAgICBjYWNoZURpc2FibGVkID0gZGlzYWJsZWQ7Ci0g
ICAgaWYgKGRpc2FibGVkKQotICAgICAgICBmbHVzaEFsbCgpOwotfQorfTsKXCBObyBuZXdsaW5l
IGF0IGVuZCBvZiBmaWxlCkluZGV4OiBtaXNjL0NhY2hlZEltYWdlLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBtaXNjL0NhY2hlZEltYWdlLmNwcAkocmV2aXNpb24gMTE5NDgpCisrKyBtaXNjL0NhY2hlZElt
YWdlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjUsNDI0ICsyNSwxMyBAQAogICAgIHBhZ2VzIGZy
b20gdGhlIHdlYi4gSXQgaGFzIGEgbWVtb3J5IGNhY2hlIGZvciB0aGVzZSBvYmplY3RzLgogKi8K
IAotI3VuZGVmIENBQ0hFX0RFQlVHCi0vLyNkZWZpbmUgQ0FDSEVfREVCVUcKICNpbmNsdWRlICJj
b25maWcuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlICJDYWNoZWRJbWFnZS5oIgor
I2luY2x1ZGUgIkRvY0xvYWRlci5oIgogCi0jaW5jbHVkZSAibG9hZGVyLmgiCi0KLS8vIHVwIHRv
IHdoaWNoIHNpemUgaXMgYSBwaWN0dXJlIGZvciBzdXJlIGNhY2hlYWJsZQotI2RlZmluZSBNQVhD
QUNIRUFCTEUgNDAqMTAyNAotLy8gZGVmYXVsdCBjYWNoZSBzaXplCi0jZGVmaW5lIERFRkNBQ0hF
U0laRSA0MDk2KjEwMjQKLQotI2luY2x1ZGUgPHFhc3luY2lvLmg+Ci0jaW5jbHVkZSA8cXBhaW50
ZXIuaD4KLQotI2luY2x1ZGUgPGtpby9qb2IuaD4KLSNpbmNsdWRlIDxraW8vam9iY2xhc3Nlcy5o
PgotI2luY2x1ZGUgPGtpbWFnZWlvLmg+Ci0jaW5jbHVkZSA8a2NoYXJzZXRzLmg+Ci0jaW5jbHVk
ZSA8a2RlYnVnLmg+Ci0jaW5jbHVkZSAia2h0bWxfZmFjdG9yeS5oIgotI2luY2x1ZGUgImtodG1s
X3BhcnQuaCIKLSNpbmNsdWRlICJkZWNvZGVyLmgiCi0KLSNpbmNsdWRlICJodG1sL2h0bWxfZG9j
dW1lbnRpbXBsLmgiCi0jaW5jbHVkZSAiY3NzL2Nzc19zdHlsZXNoZWV0aW1wbC5oIgotCi0jaWZu
ZGVmIEtIVE1MX05PX1hCTAotI2luY2x1ZGUgInhibC94YmxfZG9jaW1wbC5oIgotI2VuZGlmCi0K
LSNpbmNsdWRlIDxreG1sY29yZS9Bc3NlcnRpb25zLmg+Ci0jaW5jbHVkZSAiS1dRTG9hZGVyLmgi
Ci0KLXVzaW5nIG5hbWVzcGFjZSBraHRtbDsKIHVzaW5nIG5hbWVzcGFjZSBET007CiAKLXN0YXRp
YyBib29sIGNhY2hlRGlzYWJsZWQ7Ci0KLS8vIENhbGwgdGhpcyAid2Fsa2VyIiBpbnN0ZWFkIG9m
IGl0ZXJhdG9yIHNvIHBlb3BsZSB3b24ndCBleHBlY3QgUXQgb3IgU1RMLXN0eWxlIGl0ZXJhdG9y
IGludGVyZmFjZS4KLS8vIEp1c3Qga2VlcCBjYWxsaW5nIG5leHQoKSBvbiB0aGlzLiBJdCdzIHNh
ZmUgZnJvbSBkZWxldGlvbnMgb2YgdGhlIGN1cnJlbnQgaXRlbQotY2xhc3MgQ2FjaGVkT2JqZWN0
Q2xpZW50V2Fsa2VyIHsKLXB1YmxpYzoKLSAgICBDYWNoZWRPYmplY3RDbGllbnRXYWxrZXIoY29u
c3QgUVB0ckRpY3Q8Q2FjaGVkT2JqZWN0Q2xpZW50PiAmY2xpZW50cykgOiBfY3VycmVudCgwKSwg
X2l0ZXJhdG9yKGNsaWVudHMpIHsgfQotICAgIENhY2hlZE9iamVjdENsaWVudCAqbmV4dCgpOwot
cHJpdmF0ZToKLSAgICBDYWNoZWRPYmplY3RDbGllbnQgKl9jdXJyZW50OwotICAgIFFQdHJEaWN0
SXRlcmF0b3I8Q2FjaGVkT2JqZWN0Q2xpZW50PiBfaXRlcmF0b3I7Ci19OwotCi1DYWNoZWRPYmpl
Y3Q6On5DYWNoZWRPYmplY3QoKQotewotICAgIGlmKG1fZGVsZXRlZCkgYWJvcnQoKTsKLSAgICBD
YWNoZTo6cmVtb3ZlRnJvbUxSVUxpc3QodGhpcyk7Ci0gICAgbV9kZWxldGVkID0gdHJ1ZTsKLSAg
ICBzZXRSZXNwb25zZSgwKTsKLSAgICBzZXRBbGxEYXRhKDApOwotfQotCi12b2lkIENhY2hlZE9i
amVjdDo6ZmluaXNoKCkKLXsKLSAgICBpZiAobV9zaXplID4gQ2FjaGU6Om1heENhY2hlYWJsZU9i
amVjdFNpemUoKSkKLSAgICAgICAgbV9zdGF0dXMgPSBVbmNhY2hlYWJsZTsKLSAgICBlbHNlCi0g
ICAgICAgIG1fc3RhdHVzID0gQ2FjaGVkOwotICAgIEtVUkwgdXJsKG1fdXJsLnFzdHJpbmcoKSk7
Ci0gICAgaWYgKG1fZXhwaXJlRGF0ZUNoYW5nZWQgJiYgdXJsLnByb3RvY29sKCkuc3RhcnRzV2l0
aCgiaHR0cCIpKQotICAgICAgICBtX2V4cGlyZURhdGVDaGFuZ2VkID0gZmFsc2U7Ci19Ci0KLXZv
aWQgQ2FjaGVkT2JqZWN0OjpzZXRFeHBpcmVEYXRlKHRpbWVfdCBfZXhwaXJlRGF0ZSwgYm9vbCBj
aGFuZ2VIdHRwQ2FjaGUpCi17Ci0gICAgaWYgKCBfZXhwaXJlRGF0ZSA9PSBtX2V4cGlyZURhdGUp
Ci0gICAgICAgIHJldHVybjsKLQotICAgIGlmIChtX3N0YXR1cyA9PSBVbmNhY2hlYWJsZSB8fCBt
X3N0YXR1cyA9PSBDYWNoZWQpCi0gICAgewotICAgICAgICBmaW5pc2goKTsKLSAgICB9Ci0gICAg
bV9leHBpcmVEYXRlID0gX2V4cGlyZURhdGU7Ci0gICAgaWYgKGNoYW5nZUh0dHBDYWNoZSAmJiBt
X2V4cGlyZURhdGUpCi0gICAgICAgbV9leHBpcmVEYXRlQ2hhbmdlZCA9IHRydWU7Ci19Ci0KLWJv
b2wgQ2FjaGVkT2JqZWN0Ojppc0V4cGlyZWQoKSBjb25zdAotewotICAgIGlmICghbV9leHBpcmVE
YXRlKSByZXR1cm4gZmFsc2U7Ci0gICAgdGltZV90IG5vdyA9IHRpbWUoMCk7Ci0gICAgcmV0dXJu
IChkaWZmdGltZShub3csIG1fZXhwaXJlRGF0ZSkgPj0gMCk7Ci19Ci0KLXZvaWQgQ2FjaGVkT2Jq
ZWN0OjpzZXRSZXF1ZXN0KFJlcXVlc3QgKl9yZXF1ZXN0KQotewotICAgIGlmICggX3JlcXVlc3Qg
JiYgIW1fcmVxdWVzdCApCi0gICAgICAgIG1fc3RhdHVzID0gUGVuZGluZzsKLSAgICBtX3JlcXVl
c3QgPSBfcmVxdWVzdDsKLSAgICBpZiAoY2FuRGVsZXRlKCkgJiYgbV9mcmVlKQotICAgICAgICBk
ZWxldGUgdGhpczsKLSAgICBlbHNlIGlmIChhbGxvd0luTFJVTGlzdCgpKQotICAgICAgICBDYWNo
ZTo6aW5zZXJ0SW5MUlVMaXN0KHRoaXMpOwotfQotCi12b2lkIENhY2hlZE9iamVjdDo6cmVmKENh
Y2hlZE9iamVjdENsaWVudCAqYykKLXsKLSAgICBtX2NsaWVudHMuaW5zZXJ0KGMsIGMpOwotICAg
IENhY2hlOjpyZW1vdmVGcm9tTFJVTGlzdCh0aGlzKTsKLSAgICBpbmNyZWFzZUFjY2Vzc0NvdW50
KCk7Ci19Ci0KLXZvaWQgQ2FjaGVkT2JqZWN0OjpkZXJlZihDYWNoZWRPYmplY3RDbGllbnQgKmMp
Ci17Ci0gICAgbV9jbGllbnRzLnJlbW92ZShjKTsKLSAgICBpZiAoYWxsb3dJbkxSVUxpc3QoKSkK
LSAgICAgICAgQ2FjaGU6Omluc2VydEluTFJVTGlzdCh0aGlzKTsKLX0KLQotdm9pZCBDYWNoZWRP
YmplY3Q6OnNldFNpemUoaW50IHNpemUpCi17Ci0gICAgYm9vbCBzaXplQ2hhbmdlZCA9IENhY2hl
OjphZGp1c3RTaXplKHRoaXMsIHNpemUgLSBtX3NpemUpOwotCi0gICAgLy8gVGhlIG9iamVjdCBt
dXN0IG5vdyBiZSBtb3ZlZCB0byBhIGRpZmZlcmVudCBxdWV1ZSwgc2luY2UgaXRzIHNpemUgaGFz
IGJlZW4gY2hhbmdlZC4KLSAgICBpZiAoc2l6ZUNoYW5nZWQgJiYgYWxsb3dJbkxSVUxpc3QoKSkK
LSAgICAgICAgQ2FjaGU6OnJlbW92ZUZyb21MUlVMaXN0KHRoaXMpOwotCi0gICAgbV9zaXplID0g
c2l6ZTsKLSAgICAKLSAgICBpZiAoc2l6ZUNoYW5nZWQgJiYgYWxsb3dJbkxSVUxpc3QoKSkKLSAg
ICAgICAgQ2FjaGU6Omluc2VydEluTFJVTGlzdCh0aGlzKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1DYWNoZWRDU1NTdHlsZVNoZWV0OjpDYWNoZWRDU1NT
dHlsZVNoZWV0KERvY0xvYWRlciogZGwsIGNvbnN0IERPTVN0cmluZyAmdXJsLCBLSU86OkNhY2hl
Q29udHJvbCBfY2FjaGVQb2xpY3ksIHRpbWVfdCBfZXhwaXJlRGF0ZSwgY29uc3QgUVN0cmluZyYg
Y2hhcnNldCkKLSAgICA6IENhY2hlZE9iamVjdCh1cmwsIENTU1N0eWxlU2hlZXQsIF9jYWNoZVBv
bGljeSwgX2V4cGlyZURhdGUpLCBtX2NvZGVjKDApCi17Ci0gICAgLy8gSXQncyBjc3Mgd2Ugd2Fu
dC4KLSAgICBzZXRBY2NlcHQoInRleHQvY3NzIik7Ci0gICAgLy8gbG9hZCB0aGUgZmlsZQotICAg
IENhY2hlOjpsb2FkZXIoKS0+bG9hZChkbCwgdGhpcywgZmFsc2UpOwotICAgIG1fbG9hZGluZyA9
IHRydWU7Ci0gICAgaWYgKCFjaGFyc2V0LmlzRW1wdHkoKSkKLQltX2NvZGVjID0gUVRleHRDb2Rl
Yzo6Y29kZWNGb3JOYW1lKGNoYXJzZXQubGF0aW4xKCkpOwotICAgIGlmICghbV9jb2RlYykKLSAg
ICAgICAgbV9jb2RlYyA9IFFUZXh0Q29kZWM6OmNvZGVjRm9yTmFtZSgiaXNvODg1OS0xIik7Ci19
Ci0KLUNhY2hlZENTU1N0eWxlU2hlZXQ6OkNhY2hlZENTU1N0eWxlU2hlZXQoY29uc3QgRE9NU3Ry
aW5nICZ1cmwsIGNvbnN0IFFTdHJpbmcgJnN0eWxlc2hlZXRfZGF0YSkKLSAgICA6IENhY2hlZE9i
amVjdCh1cmwsIENTU1N0eWxlU2hlZXQsIEtJTzo6Q0NfVmVyaWZ5LCAwLCBzdHlsZXNoZWV0X2Rh
dGEubGVuZ3RoKCkpCi17Ci0gICAgbV9sb2FkaW5nID0gZmFsc2U7Ci0gICAgbV9zdGF0dXMgPSBQ
ZXJzaXN0ZW50OwotICAgIG1fY29kZWMgPSAwOwotICAgIG1fc2hlZXQgPSBET01TdHJpbmcoc3R5
bGVzaGVldF9kYXRhKTsKLX0KLQotCi1DYWNoZWRDU1NTdHlsZVNoZWV0Ojp+Q2FjaGVkQ1NTU3R5
bGVTaGVldCgpCi17Ci19Ci0KLXZvaWQgQ2FjaGVkQ1NTU3R5bGVTaGVldDo6cmVmKENhY2hlZE9i
amVjdENsaWVudCAqYykKLXsKLSAgICBDYWNoZWRPYmplY3Q6OnJlZihjKTsKLQotICAgIGlmKCFt
X2xvYWRpbmcpIGMtPnNldFN0eWxlU2hlZXQoIG1fdXJsLCBtX3NoZWV0ICk7Ci19Ci0KLXZvaWQg
Q2FjaGVkQ1NTU3R5bGVTaGVldDo6ZGVyZWYoQ2FjaGVkT2JqZWN0Q2xpZW50ICpjKQotewotICAg
IENhY2hlOjpmbHVzaCgpOwotICAgIENhY2hlZE9iamVjdDo6ZGVyZWYoYyk7Ci0gICAgaWYgKCBj
YW5EZWxldGUoKSAmJiBtX2ZyZWUgKQotICAgICAgZGVsZXRlIHRoaXM7Ci19Ci0KLXZvaWQgQ2Fj
aGVkQ1NTU3R5bGVTaGVldDo6c2V0Q2hhcnNldCggY29uc3QgUVN0cmluZyAmY2hzICkKLXsKLSAg
ICBpZiAoIWNocy5pc0VtcHR5KCkpIHsKLSAgICAgICAgUVRleHRDb2RlYyAqY29kZWMgPSBRVGV4
dENvZGVjOjpjb2RlY0Zvck5hbWUoY2hzLmxhdGluMSgpKTsKLSAgICAgICAgaWYgKGNvZGVjKQot
ICAgICAgICAgICAgbV9jb2RlYyA9IGNvZGVjOwotICAgIH0KLX0KLQotdm9pZCBDYWNoZWRDU1NT
dHlsZVNoZWV0OjpkYXRhKCBRQnVmZmVyICZidWZmZXIsIGJvb2wgZW9mICkKLXsKLSAgICBpZigh
ZW9mKSByZXR1cm47Ci0gICAgYnVmZmVyLmNsb3NlKCk7Ci0gICAgc2V0U2l6ZShidWZmZXIuYnVm
ZmVyKCkuc2l6ZSgpKTsKLSAgICBRU3RyaW5nIGRhdGEgPSBtX2NvZGVjLT50b1VuaWNvZGUoIGJ1
ZmZlci5idWZmZXIoKS5kYXRhKCksIHNpemUoKSApOwotICAgIG1fc2hlZXQgPSBET01TdHJpbmco
ZGF0YSk7Ci0gICAgbV9sb2FkaW5nID0gZmFsc2U7Ci0KLSAgICBjaGVja05vdGlmeSgpOwotfQot
Ci12b2lkIENhY2hlZENTU1N0eWxlU2hlZXQ6OmNoZWNrTm90aWZ5KCkKLXsKLSAgICBpZiAobV9s
b2FkaW5nKQotICAgICAgICByZXR1cm47Ci0KLSAgICBDYWNoZWRPYmplY3RDbGllbnRXYWxrZXIg
dyhtX2NsaWVudHMpOwotICAgIHdoaWxlIChDYWNoZWRPYmplY3RDbGllbnQgKmMgPSB3Lm5leHQo
KSkgewotICAgICAgICBpZiAobV9yZXNwb25zZSAmJiAhS1dRSXNSZXNwb25zZVVSTEVxdWFsVG9V
UkwobV9yZXNwb25zZSwgbV91cmwpKQotICAgICAgICAgICAgYy0+c2V0U3R5bGVTaGVldChET01T
dHJpbmcoS1dRUmVzcG9uc2VVUkwobV9yZXNwb25zZSkpLCBtX3NoZWV0KTsKLSAgICAgICAgZWxz
ZQotICAgICAgICAgICAgYy0+c2V0U3R5bGVTaGVldChtX3VybCwgbV9zaGVldCk7Ci0gICAgfQot
fQotCi0KLXZvaWQgQ2FjaGVkQ1NTU3R5bGVTaGVldDo6ZXJyb3IoIGludCAvKmVyciovLCBjb25z
dCBjaGFyICovKnRleHQqLyApCi17Ci0gICAgbV9sb2FkaW5nID0gZmFsc2U7Ci0gICAgY2hlY2tO
b3RpZnkoKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1D
YWNoZWRTY3JpcHQ6OkNhY2hlZFNjcmlwdChEb2NMb2FkZXIqIGRsLCBjb25zdCBET01TdHJpbmcg
JnVybCwgS0lPOjpDYWNoZUNvbnRyb2wgX2NhY2hlUG9saWN5LCB0aW1lX3QgX2V4cGlyZURhdGUs
IGNvbnN0IFFTdHJpbmcmIGNoYXJzZXQpCi0gICAgOiBDYWNoZWRPYmplY3QodXJsLCBTY3JpcHQs
IF9jYWNoZVBvbGljeSwgX2V4cGlyZURhdGUpLCBtX2NvZGVjKDApCi17Ci0gICAgLy8gSXQncyBq
YXZhc2NyaXB0IHdlIHdhbnQuCi0gICAgLy8gQnV0IHNvbWUgd2Vic2l0ZXMgdGhpbmsgdGhlaXIg
c2NyaXB0cyBhcmUgPHNvbWUgd3JvbmcgbWltZXR5cGUgaGVyZT4KLSAgICAvLyBhbmQgcmVmdXNl
IHRvIHNlcnZlIHRoZW0gaWYgd2Ugb25seSBhY2NlcHQgYXBwbGljYXRpb24veC1qYXZhc2NyaXB0
LgotICAgIHNldEFjY2VwdCgiKi8qIik7Ci0gICAgbV9lcnJvck9jY3VycmVkID0gZmFsc2U7Ci0g
ICAgLy8gbG9hZCB0aGUgZmlsZQotICAgIENhY2hlOjpsb2FkZXIoKS0+bG9hZChkbCwgdGhpcywg
ZmFsc2UpOwotICAgIG1fbG9hZGluZyA9IHRydWU7Ci0gICAgaWYgKCFjaGFyc2V0LmlzRW1wdHko
KSkKLSAgICAgICAgbV9jb2RlYyA9IFFUZXh0Q29kZWM6OmNvZGVjRm9yTmFtZShjaGFyc2V0Lmxh
dGluMSgpKTsKLSAgICBpZiAoIW1fY29kZWMpCi0JbV9jb2RlYyA9IFFUZXh0Q29kZWM6OmNvZGVj
Rm9yTmFtZSgiaXNvODg1OS0xIik7Ci19Ci0KLUNhY2hlZFNjcmlwdDo6Q2FjaGVkU2NyaXB0KGNv
bnN0IERPTVN0cmluZyAmdXJsLCBjb25zdCBRU3RyaW5nICZzY3JpcHRfZGF0YSkKLSAgICA6IENh
Y2hlZE9iamVjdCh1cmwsIFNjcmlwdCwgS0lPOjpDQ19WZXJpZnksIDAsIHNjcmlwdF9kYXRhLmxl
bmd0aCgpKQotewotICAgIG1fZXJyb3JPY2N1cnJlZCA9IGZhbHNlOwotICAgIG1fbG9hZGluZyA9
IGZhbHNlOwotICAgIG1fc3RhdHVzID0gUGVyc2lzdGVudDsKLSAgICBtX2NvZGVjID0gMDsKLSAg
ICBtX3NjcmlwdCA9IERPTVN0cmluZyhzY3JpcHRfZGF0YSk7Ci19Ci0KLUNhY2hlZFNjcmlwdDo6
fkNhY2hlZFNjcmlwdCgpCi17Ci19Ci0KLXZvaWQgQ2FjaGVkU2NyaXB0OjpyZWYoQ2FjaGVkT2Jq
ZWN0Q2xpZW50ICpjKQotewotICAgIENhY2hlZE9iamVjdDo6cmVmKGMpOwotCi0gICAgaWYoIW1f
bG9hZGluZykgYy0+bm90aWZ5RmluaXNoZWQodGhpcyk7Ci19Ci0KLXZvaWQgQ2FjaGVkU2NyaXB0
OjpkZXJlZihDYWNoZWRPYmplY3RDbGllbnQgKmMpCi17Ci0gICAgQ2FjaGU6OmZsdXNoKCk7Ci0g
ICAgQ2FjaGVkT2JqZWN0OjpkZXJlZihjKTsKLSAgICBpZiAoIGNhbkRlbGV0ZSgpICYmIG1fZnJl
ZSApCi0gICAgICBkZWxldGUgdGhpczsKLX0KLQotdm9pZCBDYWNoZWRTY3JpcHQ6OnNldENoYXJz
ZXQoIGNvbnN0IFFTdHJpbmcgJmNocyApCi17Ci0gICAgaWYgKCFjaHMuaXNFbXB0eSgpKSB7Ci0g
ICAgICAgIFFUZXh0Q29kZWMgKmNvZGVjID0gUVRleHRDb2RlYzo6Y29kZWNGb3JOYW1lKGNocy5s
YXRpbjEoKSk7Ci0gICAgICAgIGlmIChjb2RlYykKLSAgICAgICAgICAgIG1fY29kZWMgPSBjb2Rl
YzsKLSAgICB9Ci19Ci0KLXZvaWQgQ2FjaGVkU2NyaXB0OjpkYXRhKCBRQnVmZmVyICZidWZmZXIs
IGJvb2wgZW9mICkKLXsKLSAgICBpZighZW9mKSByZXR1cm47Ci0gICAgYnVmZmVyLmNsb3NlKCk7
Ci0gICAgc2V0U2l6ZShidWZmZXIuYnVmZmVyKCkuc2l6ZSgpKTsKLSAgICBRU3RyaW5nIGRhdGEg
PSBtX2NvZGVjLT50b1VuaWNvZGUoIGJ1ZmZlci5idWZmZXIoKS5kYXRhKCksIHNpemUoKSApOwot
ICAgIG1fc2NyaXB0ID0gRE9NU3RyaW5nKGRhdGEpOwotICAgIG1fbG9hZGluZyA9IGZhbHNlOwot
ICAgIGNoZWNrTm90aWZ5KCk7Ci19Ci0KLXZvaWQgQ2FjaGVkU2NyaXB0OjpjaGVja05vdGlmeSgp
Ci17Ci0gICAgaWYobV9sb2FkaW5nKSByZXR1cm47Ci0KLSAgICBDYWNoZWRPYmplY3RDbGllbnRX
YWxrZXIgdyhtX2NsaWVudHMpOwotICAgIHdoaWxlIChDYWNoZWRPYmplY3RDbGllbnQgKmMgPSB3
Lm5leHQoKSkKLSAgICAgICAgYy0+bm90aWZ5RmluaXNoZWQodGhpcyk7Ci19Ci0KLQotdm9pZCBD
YWNoZWRTY3JpcHQ6OmVycm9yKCBpbnQgLyplcnIqLywgY29uc3QgY2hhciAqLyp0ZXh0Ki8gKQot
ewotICAgIG1fbG9hZGluZyA9IGZhbHNlOwotICAgIG1fZXJyb3JPY2N1cnJlZCA9IHRydWU7Ci0g
ICAgY2hlY2tOb3RpZnkoKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tCi0KLQotc3RhdGljIGJvb2wgY3Jvc3NEb21haW4oY29uc3QgUVN0cmluZyAmYSwgY29uc3Qg
UVN0cmluZyAmYikKLXsKLSAgICBpZiAoYSA9PSBiKSByZXR1cm4gZmFsc2U7Ci0KLSAgICBRU3Ry
aW5nTGlzdCBsMSA9IFFTdHJpbmdMaXN0OjpzcGxpdCgnLicsIGEpOwotICAgIFFTdHJpbmdMaXN0
IGwyID0gUVN0cmluZ0xpc3Q6OnNwbGl0KCcuJywgYik7Ci0KLSAgICB3aGlsZShsMS5jb3VudCgp
ID4gbDIuY291bnQoKSkKLSAgICAgICAgbDEucG9wX2Zyb250KCk7Ci0KLSAgICB3aGlsZShsMi5j
b3VudCgpID4gbDEuY291bnQoKSkKLSAgICAgICAgbDIucG9wX2Zyb250KCk7Ci0KLSAgICB3aGls
ZShsMi5jb3VudCgpID49IDIpCi0gICAgewotICAgICAgICBpZiAobDEgPT0gbDIpCi0gICAgICAg
ICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBsMS5wb3BfZnJvbnQoKTsKLSAgICAgICAgbDIu
cG9wX2Zyb250KCk7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi0vLyAtLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tCi12b2lkIENhY2hlZEltYWdlQ2FsbGJhY2s6Om5vdGlmeVVwZGF0
ZSgpIAoteyAKLSAgICBpZiAoY2FjaGVkSW1hZ2UpIHsKLSAgICAgICAgY2FjaGVkSW1hZ2UtPmRv
X25vdGlmeSAoY2FjaGVkSW1hZ2UtPnBpeG1hcCgpLCBjYWNoZWRJbWFnZS0+cGl4bWFwKCkucmVj
dCgpKTsgCi0gICAgICAgIFFTaXplIHMgPSBjYWNoZWRJbWFnZS0+cGl4bWFwX3NpemUoKTsKLSAg
ICAgICAgY2FjaGVkSW1hZ2UtPnNldFNpemUocy53aWR0aCgpICogcy5oZWlnaHQoKSAqIDIpOwot
Ci0gICAgICAgIC8vIEFmdGVyIHJlY2VpdmluZyB0aGUgaW1hZ2UgaGVhZGVyIHdlIGFyZSBndWFy
YW50ZWVkIHRvIGtub3cKLSAgICAgICAgLy8gdGhlIGltYWdlIHNpemUuICBBbHRob3VnaCBhbGwg
b2YgdGhlIGRhdGEgbWF5IG5vdCBoYXZlIGFycml2ZWQgb3IKLSAgICAgICAgLy8gYmVlbiBkZWNv
ZGVkIHdlIGNhbiBjb25zaWRlciB0aGUgaW1hZ2UgbG9hZGVkIGZvciBwdXJwb3NlZCBvZgotICAg
ICAgICAvLyBsYXlvdXQgYW5kIGRpc3BhdGNoaW5nIHRoZSBpbWFnZSdzIG9ubG9hZCBoYW5kbGVy
LiAgUmVtb3ZpbmcgdGhlIHJlcXVlc3QgZnJvbQotICAgICAgICAvLyB0aGUgbGlzdCBvZiBiYWNr
Z3JvdW5kIGRlY29kaW5nIHJlcXVlc3RzIHdpbGwgZW5zdXJlIHRoYXQgTG9hZGVyOjpudW1SZXF1
ZXN0cygpIAotICAgICAgICAvLyBkb2VzIG5vdCBjb3VudCB0aGlzIGJhY2tncm91bmQgcmVxdWVz
dC4gIEZ1cnRoZXIgbnVtUmVxdWVzdHMoKSBjYW4KLSAgICAgICAgLy8gYmUgY29ycmVjdGx5IHVz
ZWQgYnkgdGhlIHBhcnQgdG8gZGV0ZXJtaW5lIGlmIGxvYWRpbmcgaXMgc3VmZmljaWVudGx5Ci0g
ICAgICAgIC8vIGNvbXBsZXRlIHRvIGRpc3BhdGNoIHRoZSBwYWdlJ3Mgb25sb2FkIGhhbmRsZXIu
Ci0gICAgICAgIFJlcXVlc3QgKnIgPSBjYWNoZWRJbWFnZS0+bV9yZXF1ZXN0OwotICAgICAgICBE
b2NMb2FkZXIgKmRsID0gci0+bV9kb2NMb2FkZXI7Ci0KLSAgICAgICAga2h0bWw6OkNhY2hlOjps
b2FkZXIoKS0+cmVtb3ZlQmFja2dyb3VuZERlY29kaW5nUmVxdWVzdChyKTsKLQotICAgICAgICAv
LyBQb2tlIHRoZSBwYXJ0IHRvIGdldCBpdCB0byBkbyBhIGNoZWNrQ29tcGxldGVkKCkuICBPbmx5
IGRvIHRoaXMgZm9yCi0gICAgICAgIC8vIHRoZSBmaXJzdCB1cGRhdGUgdG8gbWluaW1pemUgd29y
ay4gIE5vdGUgdGhhdCB3ZSBhcmUgZ3VhcmFudGVlZCB0byBoYXZlCi0gICAgICAgIC8vIHJlYWQg
dGhlIGhlYWRlciB3aGVuIHdlIHJlY2VpdmVkIHRoaXMgZmlyc3QgdXBkYXRlLCB3aGljaCBpcyB0
cmlnZ2VyZWQKLSAgICAgICAgLy8gYnkgdGhlIGZpcnN0IGtDR0ltYWdlU3RhdHVzSW5jb21wbGV0
ZSBzdGF0dXMgZnJvbSBDRy4ga0NHSW1hZ2VTdGF0dXNJbmNvbXBsZXRlCi0gICAgICAgIC8vIHJl
YWxseSBtZWFucyB0aGF0IHRoZSBDRyBkZWNvZGVyIGlzIHdhaXRpbmcgZm9yIG1vcmUgZGF0YSwg
YnV0IGhhcyBhbHJlYWR5Ci0gICAgICAgIC8vIHJlYWQgdGhlIGhlYWRlci4KLSAgICAgICAgaWYg
KCFoZWFkZXJSZWNlaXZlZCkgewotICAgICAgICAgICAgZW1pdCBraHRtbDo6Q2FjaGU6OmxvYWRl
cigpLT5yZXF1ZXN0RG9uZSggZGwsIGNhY2hlZEltYWdlICk7Ci0gICAgICAgICAgICBoZWFkZXJS
ZWNlaXZlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgQ2FjaGVkSW1hZ2VD
YWxsYmFjazo6bm90aWZ5RmluaXNoZWQoKQotewotICAgIGlmIChjYWNoZWRJbWFnZSkgewotICAg
ICAgICBjYWNoZWRJbWFnZS0+ZG9fbm90aWZ5IChjYWNoZWRJbWFnZS0+cGl4bWFwKCksIGNhY2hl
ZEltYWdlLT5waXhtYXAoKS5yZWN0KCkpOyAKLSAgICAgICAgY2FjaGVkSW1hZ2UtPm1fbG9hZGlu
ZyA9IGZhbHNlOwotICAgICAgICBjYWNoZWRJbWFnZS0+Y2hlY2tOb3RpZnkoKTsKLSAgICAgICAg
UVNpemUgcyA9IGNhY2hlZEltYWdlLT5waXhtYXBfc2l6ZSgpOwotICAgICAgICBjYWNoZWRJbWFn
ZS0+c2V0U2l6ZShzLndpZHRoKCkgKiBzLmhlaWdodCgpICogMik7Ci0JCi0gICAgICAgIFJlcXVl
c3QgKnIgPSBjYWNoZWRJbWFnZS0+bV9yZXF1ZXN0OwotICAgICAgICBEb2NMb2FkZXIgKmRsID0g
ci0+bV9kb2NMb2FkZXI7Ci0KLSAgICAgICAga2h0bWw6OkNhY2hlOjpsb2FkZXIoKS0+cmVtb3Zl
QmFja2dyb3VuZERlY29kaW5nUmVxdWVzdChyKTsKLQotICAgICAgICAvLyBQb2tlIHRoZSBwYXJ0
IHRvIGdldCBpdCB0byBkbyBhIGNoZWNrQ29tcGxldGVkKCkuCi0gICAgICAgIGVtaXQga2h0bWw6
OkNhY2hlOjpsb2FkZXIoKS0+cmVxdWVzdERvbmUoIGRsLCBjYWNoZWRJbWFnZSApOwotICAgICAg
ICAKLSAgICAgICAgZGVsZXRlIHI7Ci0gICAgfQotfQotCi12b2lkIENhY2hlZEltYWdlQ2FsbGJh
Y2s6Om5vdGlmeURlY29kaW5nRXJyb3IoKQotewotICAgIGlmIChjYWNoZWRJbWFnZSkgewotICAg
ICAgICBoYW5kbGVFcnJvcigpOwotICAgIH0KLX0KLQotdm9pZCBDYWNoZWRJbWFnZUNhbGxiYWNr
OjpoYW5kbGVFcnJvcigpCi17Ci0gICAgaWYgKGNhY2hlZEltYWdlKSB7Ci0gICAgICAgIGNhY2hl
ZEltYWdlLT5lcnJvck9jY3VyZWQgPSB0cnVlOwotICAgICAgICBRUGl4bWFwIGVwID0gY2FjaGVk
SW1hZ2UtPnBpeG1hcCgpOwotICAgICAgICBjYWNoZWRJbWFnZS0+ZG9fbm90aWZ5IChlcCwgZXAu
cmVjdCgpKTsKLSAgICAgICAgQ2FjaGU6OnJlbW92ZUNhY2hlRW50cnkgKGNhY2hlZEltYWdlKTsK
LQotICAgICAgICBjbGVhcigpOwotICAgIH0KLX0KLQotdm9pZCBDYWNoZWRJbWFnZUNhbGxiYWNr
OjpjbGVhcigpIAotewotICAgIGlmIChjYWNoZWRJbWFnZSAmJiBjYWNoZWRJbWFnZS0+bV9yZXF1
ZXN0KSB7Ci0gICAgICAgIFJlcXVlc3QgKnIgPSBjYWNoZWRJbWFnZS0+bV9yZXF1ZXN0OwotICAg
ICAgICBEb2NMb2FkZXIgKmRsID0gci0+bV9kb2NMb2FkZXI7Ci0KLSAgICAgICAga2h0bWw6OkNh
Y2hlOjpsb2FkZXIoKS0+cmVtb3ZlQmFja2dyb3VuZERlY29kaW5nUmVxdWVzdChyKTsKLQotICAg
ICAgICAvLyBQb2tlIHRoZSBwYXJ0IHRvIGdldCBpdCB0byBkbyBhIGNoZWNrQ29tcGxldGVkKCku
Ci0gICAgICAgIGVtaXQga2h0bWw6OkNhY2hlOjpsb2FkZXIoKS0+cmVxdWVzdEZhaWxlZCggZGws
IGNhY2hlZEltYWdlICk7Ci0KLSAgICAgICAgZGVsZXRlIHI7Ci0gICAgfQotICAgIGNhY2hlZElt
YWdlID0gMDsKLX0KK25hbWVzcGFjZSBraHRtbCB7CiAKIENhY2hlZEltYWdlOjpDYWNoZWRJbWFn
ZShEb2NMb2FkZXIqIGRsLCBjb25zdCBET01TdHJpbmcgJnVybCwgS0lPOjpDYWNoZUNvbnRyb2wg
X2NhY2hlUG9saWN5LCB0aW1lX3QgX2V4cGlyZURhdGUpCiAgICAgOiBRT2JqZWN0KCksIENhY2hl
ZE9iamVjdCh1cmwsIEltYWdlLCBfY2FjaGVQb2xpY3ksIF9leHBpcmVEYXRlKQpAQCAtNDU0LDkg
KzQzLDcgQEAgQ2FjaGVkSW1hZ2U6OkNhY2hlZEltYWdlKERvY0xvYWRlciogZGwsIAogICAgIGlz
RnVsbHlUcmFuc3BhcmVudCA9IGZhbHNlOwogICAgIGVycm9yT2NjdXJlZCA9IGZhbHNlOwogICAg
IG1vbm9jaHJvbWUgPSBmYWxzZTsKLSAgICBmb3JtYXRUeXBlID0gMDsKICAgICBtX3N0YXR1cyA9
IFVua25vd247Ci0gICAgaW1nU291cmNlID0gMDsKICAgICBtX2xvYWRpbmcgPSB0cnVlOwogICAg
IG1fc2hvd0FuaW1hdGlvbnMgPSBkbC0+c2hvd0FuaW1hdGlvbnMoKTsKICAgICBpZiAoUVBpeG1h
cDo6c2hvdWxkVXNlVGhyZWFkZWREZWNvZGluZygpKQpAQCAtNTM0LDEzICsxMjEsOCBAQCB2b2lk
IENhY2hlZEltYWdlOjpjbGVhcigpCiAgICAgZGVsZXRlIGJnOyAgYmcgPSAwOwogICAgIGRlbGV0
ZSBwaXhQYXJ0OyBwaXhQYXJ0ID0gMDsKIAotICAgIGZvcm1hdFR5cGUgPSAwOwotCiAgICAgc2V0
U2l6ZSgwKTsKIAotICAgIC8vIE5vIG5lZWQgdG8gZGVsZXRlIGltYWdlU291cmNlIC0gUU1vdmll
IGRvZXMgaXQgZm9yIHVzCi0gICAgaW1nU291cmNlID0gMDsKLQogICAgIGlmIChtX2RlY29kZXJD
YWxsYmFjaykgewogICAgICAgICBtX2RlY29kZXJDYWxsYmFjay0+Y2xlYXIoKTsKICAgICAgICAg
bV9kZWNvZGVyQ2FsbGJhY2stPmRlcmVmKCk7CkBAIC01OTcsMTAgKzE3OSw2IEBAIHZvaWQgQ2Fj
aGVkSW1hZ2U6OmRhdGEgKCBRQnVmZmVyICZfYnVmZmUKIAogdm9pZCBDYWNoZWRJbWFnZTo6ZXJy
b3IoIGludCAvKmVyciovLCBjb25zdCBjaGFyICovKnRleHQqLyApCiB7Ci0jaWZkZWYgQ0FDSEVf
REVCVUcKLSAgICBrZERlYnVnKDYwNjApIDw8ICJDYWhjZWRJbWFnZTo6ZXJyb3IiIDw8IGVuZGw7
Ci0jZW5kaWYKLQogICAgIGNsZWFyKCk7CiAgICAgZXJyb3JPY2N1cmVkID0gdHJ1ZTsKICAgICBk
b19ub3RpZnkocGl4bWFwKCksIFFSZWN0KDAsIDAsIDE2LCAxNikpOwpAQCAtNjE4LDEyNjYgKzE5
Niw0IEBAIHZvaWQgQ2FjaGVkSW1hZ2U6OmNoZWNrTm90aWZ5KCkKICAgICB9CiB9CiAKLS8vIC0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2lmZGVmIEtIVE1MX1hTTFQKLQot
Q2FjaGVkWFNMU3R5bGVTaGVldDo6Q2FjaGVkWFNMU3R5bGVTaGVldChEb2NMb2FkZXIqIGRsLCBj
b25zdCBET01TdHJpbmcgJnVybCwgS0lPOjpDYWNoZUNvbnRyb2wgX2NhY2hlUG9saWN5LCB0aW1l
X3QgX2V4cGlyZURhdGUpCi06IENhY2hlZE9iamVjdCh1cmwsIFhTTFN0eWxlU2hlZXQsIF9jYWNo
ZVBvbGljeSwgX2V4cGlyZURhdGUpCi17Ci0gICAgLy8gSXQncyBYTUwgd2Ugd2FudC4KLSAgICAv
LyBGSVhNRTogVGhpcyBzaG91bGQgYWNjZXB0IG1vcmUgZ2VuZXJhbCB4bWwgZm9ybWF0cyAqLyor
eG1sLCBpbWFnZS9zdmcreG1sIGZvciBleGFtcGxlLgotICAgIHNldEFjY2VwdCgidGV4dC94bWws
IGFwcGxpY2F0aW9uL3htbCwgYXBwbGljYXRpb24veGh0bWwreG1sLCB0ZXh0L3hzbCwgYXBwbGlj
YXRpb24vcnNzK3htbCwgYXBwbGljYXRpb24vYXRvbSt4bWwiKTsKLSAgICAKLSAgICAvLyBsb2Fk
IHRoZSBmaWxlCi0gICAgQ2FjaGU6OmxvYWRlcigpLT5sb2FkKGRsLCB0aGlzLCBmYWxzZSk7Ci0g
ICAgbV9sb2FkaW5nID0gdHJ1ZTsKLSAgICBtX2RlY29kZXIgPSBuZXcgRGVjb2RlcjsKLX0KLQot
dm9pZCBDYWNoZWRYU0xTdHlsZVNoZWV0OjpyZWYoQ2FjaGVkT2JqZWN0Q2xpZW50ICpjKQotewot
ICAgIENhY2hlZE9iamVjdDo6cmVmKGMpOwotICAgIAotICAgIGlmICghbV9sb2FkaW5nKQotICAg
ICAgICBjLT5zZXRTdHlsZVNoZWV0KG1fdXJsLCBtX3NoZWV0KTsKLX0KLQotdm9pZCBDYWNoZWRY
U0xTdHlsZVNoZWV0OjpkZXJlZihDYWNoZWRPYmplY3RDbGllbnQgKmMpCi17Ci0gICAgQ2FjaGU6
OmZsdXNoKCk7Ci0gICAgQ2FjaGVkT2JqZWN0OjpkZXJlZihjKTsKLSAgICBpZiAoY2FuRGVsZXRl
KCkgJiYgbV9mcmVlKQotICAgICAgICBkZWxldGUgdGhpczsKLX0KLQotdm9pZCBDYWNoZWRYU0xT
dHlsZVNoZWV0OjpzZXRDaGFyc2V0KCBjb25zdCBRU3RyaW5nICZjaHMgKQotewotICAgIGlmICgh
Y2hzLmlzRW1wdHkoKSkKLSAgICAgICAgbV9kZWNvZGVyLT5zZXRFbmNvZGluZyhjaHMubGF0aW4x
KCksIERlY29kZXI6OkVuY29kaW5nRnJvbUhUVFBIZWFkZXIpOwotfQotCi12b2lkIENhY2hlZFhT
TFN0eWxlU2hlZXQ6OmRhdGEoUUJ1ZmZlciAmYnVmZmVyLCBib29sIGVvZikKLXsKLSAgICBpZigh
ZW9mKSByZXR1cm47Ci0gICAgYnVmZmVyLmNsb3NlKCk7Ci0gICAgc2V0U2l6ZShidWZmZXIuYnVm
ZmVyKCkuc2l6ZSgpKTsKLSAgICBRU3RyaW5nIGRhdGEgPSBtX2RlY29kZXItPmRlY29kZShidWZm
ZXIuYnVmZmVyKCkuZGF0YSgpLCBzaXplKCkpOwotICAgIG1fc2hlZXQgPSBET01TdHJpbmcoZGF0
YSk7Ci0gICAgbV9sb2FkaW5nID0gZmFsc2U7Ci0gICAgCi0gICAgY2hlY2tOb3RpZnkoKTsKLX0K
LQotdm9pZCBDYWNoZWRYU0xTdHlsZVNoZWV0OjpjaGVja05vdGlmeSgpCi17Ci0gICAgaWYgKG1f
bG9hZGluZykKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIENhY2hlZE9iamVjdENsaWVudFdh
bGtlciB3KG1fY2xpZW50cyk7Ci0gICAgd2hpbGUgKENhY2hlZE9iamVjdENsaWVudCAqYyA9IHcu
bmV4dCgpKQotICAgICAgICBjLT5zZXRTdHlsZVNoZWV0KG1fdXJsLCBtX3NoZWV0KTsKLX0KLQot
Ci12b2lkIENhY2hlZFhTTFN0eWxlU2hlZXQ6OmVycm9yKCBpbnQgLyplcnIqLywgY29uc3QgY2hh
ciAqLyp0ZXh0Ki8gKQotewotICAgIG1fbG9hZGluZyA9IGZhbHNlOwotICAgIGNoZWNrTm90aWZ5
KCk7Ci19Ci0KLSNlbmRpZgotCi0jaWZuZGVmIEtIVE1MX05PX1hCTAotQ2FjaGVkWEJMRG9jdW1l
bnQ6OkNhY2hlZFhCTERvY3VtZW50KERvY0xvYWRlciogZGwsIGNvbnN0IERPTVN0cmluZyAmdXJs
LCBLSU86OkNhY2hlQ29udHJvbCBfY2FjaGVQb2xpY3ksIHRpbWVfdCBfZXhwaXJlRGF0ZSkKLTog
Q2FjaGVkT2JqZWN0KHVybCwgWEJMLCBfY2FjaGVQb2xpY3ksIF9leHBpcmVEYXRlKSwgbV9kb2N1
bWVudCgwKQotewotICAgIC8vIEl0J3MgWE1MIHdlIHdhbnQuCi0gICAgc2V0QWNjZXB0KCJ0ZXh0
L3htbCwgYXBwbGljYXRpb24veG1sLCBhcHBsaWNhdGlvbi94aHRtbCt4bWwsIHRleHQveHNsLCBh
cHBsaWNhdGlvbi9yc3MreG1sLCBhcHBsaWNhdGlvbi9hdG9tK3htbCIpOwotICAgIAotICAgIC8v
IExvYWQgdGhlIGZpbGUKLSAgICBDYWNoZTo6bG9hZGVyKCktPmxvYWQoZGwsIHRoaXMsIGZhbHNl
KTsKLSAgICBtX2xvYWRpbmcgPSB0cnVlOwotICAgIG1fZGVjb2RlciA9IG5ldyBEZWNvZGVyOwot
fQotCi1DYWNoZWRYQkxEb2N1bWVudDo6fkNhY2hlZFhCTERvY3VtZW50KCkKLXsKLSAgICBpZiAo
bV9kb2N1bWVudCkKLSAgICAgICAgbV9kb2N1bWVudC0+ZGVyZWYoKTsKLX0KLQotdm9pZCBDYWNo
ZWRYQkxEb2N1bWVudDo6cmVmKENhY2hlZE9iamVjdENsaWVudCAqYykKLXsKLSAgICBDYWNoZWRP
YmplY3Q6OnJlZihjKTsKLSAgICBpZiAoIW1fbG9hZGluZykKLSAgICAgICAgYy0+c2V0WEJMRG9j
dW1lbnQobV91cmwsIG1fZG9jdW1lbnQpOwotfQotCi12b2lkIENhY2hlZFhCTERvY3VtZW50Ojpk
ZXJlZihDYWNoZWRPYmplY3RDbGllbnQgKmMpCi17Ci0gICAgQ2FjaGU6OmZsdXNoKCk7Ci0gICAg
Q2FjaGVkT2JqZWN0OjpkZXJlZihjKTsKLSAgICBpZiAoY2FuRGVsZXRlKCkgJiYgbV9mcmVlKQot
ICAgICAgICBkZWxldGUgdGhpczsKLX0KLQotdm9pZCBDYWNoZWRYQkxEb2N1bWVudDo6c2V0Q2hh
cnNldCggY29uc3QgUVN0cmluZyAmY2hzICkKLXsKLSAgICBpZiAoIWNocy5pc0VtcHR5KCkpCi0g
ICAgICAgIG1fZGVjb2Rlci0+c2V0RW5jb2RpbmcoY2hzLmxhdGluMSgpLCBEZWNvZGVyOjpFbmNv
ZGluZ0Zyb21IVFRQSGVhZGVyKTsKLX0KLQotdm9pZCBDYWNoZWRYQkxEb2N1bWVudDo6ZGF0YSgg
UUJ1ZmZlciAmYnVmZmVyLCBib29sIGVvZiApCi17Ci0gICAgaWYgKCFlb2YpIHJldHVybjsKLSAg
ICAKLSAgICBhc3NlcnQoIW1fZG9jdW1lbnQpOwotICAgIAotICAgIG1fZG9jdW1lbnQgPSAgbmV3
IFhCTDo6WEJMRG9jdW1lbnRJbXBsKCk7Ci0gICAgbV9kb2N1bWVudC0+cmVmKCk7Ci0gICAgbV9k
b2N1bWVudC0+b3BlbigpOwotICAgIAotICAgIFFTdHJpbmcgZGF0YSA9IG1fZGVjb2Rlci0+ZGVj
b2RlKGJ1ZmZlci5idWZmZXIoKS5kYXRhKCksIGJ1ZmZlci5idWZmZXIoKS5zaXplKCkpOwotICAg
IG1fZG9jdW1lbnQtPndyaXRlKGRhdGEpOwotICAgIHNldFNpemUoYnVmZmVyLmJ1ZmZlcigpLnNp
emUoKSk7Ci0gICAgYnVmZmVyLmNsb3NlKCk7Ci0gICAgCi0gICAgbV9kb2N1bWVudC0+ZmluaXNo
UGFyc2luZygpOwotICAgIG1fZG9jdW1lbnQtPmNsb3NlKCk7Ci0gICAgbV9sb2FkaW5nID0gZmFs
c2U7Ci0gICAgY2hlY2tOb3RpZnkoKTsKLX0KLQotdm9pZCBDYWNoZWRYQkxEb2N1bWVudDo6Y2hl
Y2tOb3RpZnkoKQotewotICAgIGlmKG1fbG9hZGluZykKLSAgICAgICAgcmV0dXJuOwotICAgIAot
ICAgIENhY2hlZE9iamVjdENsaWVudFdhbGtlciB3KG1fY2xpZW50cyk7Ci0gICAgd2hpbGUgKENh
Y2hlZE9iamVjdENsaWVudCAqYyA9IHcubmV4dCgpKQotICAgICAgICBjLT5zZXRYQkxEb2N1bWVu
dChtX3VybCwgbV9kb2N1bWVudCk7Ci19Ci0KLQotdm9pZCBDYWNoZWRYQkxEb2N1bWVudDo6ZXJy
b3IoIGludCAvKmVyciovLCBjb25zdCBjaGFyICovKnRleHQqLyApCi17Ci0gICAgbV9sb2FkaW5n
ID0gZmFsc2U7Ci0gICAgY2hlY2tOb3RpZnkoKTsKLX0KLSNlbmRpZgotCi0vLyAtLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotUmVxdWVzdDo6UmVxdWVzdChEb2NMb2FkZXIqIGRs
LCBDYWNoZWRPYmplY3QgKl9vYmplY3QsIGJvb2wgX2luY3JlbWVudGFsKQotewotICAgIG9iamVj
dCA9IF9vYmplY3Q7Ci0gICAgb2JqZWN0LT5zZXRSZXF1ZXN0KHRoaXMpOwotICAgIGluY3JlbWVu
dGFsID0gX2luY3JlbWVudGFsOwotICAgIG1fZG9jTG9hZGVyID0gZGw7Ci0gICAgbXVsdGlwYXJ0
ID0gZmFsc2U7Ci19Ci0KLVJlcXVlc3Q6On5SZXF1ZXN0KCkKLXsKLSAgICBvYmplY3QtPnNldFJl
cXVlc3QoMCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1E
b2NMb2FkZXI6OkRvY0xvYWRlcihLSFRNTFBhcnQqIHBhcnQsIERvY3VtZW50SW1wbCogZG9jKQot
ewotICAgIG1fY2FjaGVQb2xpY3kgPSBLSU86OkNDX1ZlcmlmeTsKLSAgICBtX2V4cGlyZURhdGUg
PSAwOwotICAgIG1fYmF1dG9sb2FkSW1hZ2VzID0gdHJ1ZTsKLSAgICBtX3Nob3dBbmltYXRpb25z
ID0gS0hUTUxTZXR0aW5nczo6S0FuaW1hdGlvbkVuYWJsZWQ7Ci0gICAgbV9wYXJ0ID0gcGFydDsK
LSAgICBtX2RvYyA9IGRvYzsKLSAgICBtX2xvYWRJblByb2dyZXNzID0gZmFsc2U7Ci0KLSAgICBD
YWNoZTo6aW5pdCgpOwotICAgIENhY2hlOjpkb2Nsb2FkZXItPmFwcGVuZCggdGhpcyApOwotfQot
Ci1Eb2NMb2FkZXI6On5Eb2NMb2FkZXIoKQotewotICAgIENhY2hlOjpkb2Nsb2FkZXItPnJlbW92
ZSggdGhpcyApOwotfQotCi12b2lkIERvY0xvYWRlcjo6c2V0RXhwaXJlRGF0ZSh0aW1lX3QgX2V4
cGlyZURhdGUpCi17Ci0gICAgbV9leHBpcmVEYXRlID0gX2V4cGlyZURhdGU7Ci19Ci0KLWJvb2wg
RG9jTG9hZGVyOjpuZWVkUmVsb2FkKGNvbnN0IEtVUkwgJmZ1bGxVUkwpCi17Ci0gICAgYm9vbCBy
ZWxvYWQgPSBmYWxzZTsKLSAgICBpZiAobV9jYWNoZVBvbGljeSA9PSBLSU86OkNDX1ZlcmlmeSkK
LSAgICB7Ci0gICAgICAgaWYgKCFtX3JlbG9hZGVkVVJMcy5jb250YWlucyhmdWxsVVJMLnVybCgp
KSkKLSAgICAgICB7Ci0gICAgICAgICAgQ2FjaGVkT2JqZWN0ICpleGlzdGluZyA9IENhY2hlOjpj
YWNoZS0+ZmluZChmdWxsVVJMLnVybCgpKTsKLSAgICAgICAgICBpZiAoZXhpc3RpbmcgJiYgZXhp
c3RpbmctPmlzRXhwaXJlZCgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgICBDYWNoZTo6cmVt
b3ZlQ2FjaGVFbnRyeShleGlzdGluZyk7Ci0gICAgICAgICAgICAgbV9yZWxvYWRlZFVSTHMuYXBw
ZW5kKGZ1bGxVUkwudXJsKCkpOwotICAgICAgICAgICAgIHJlbG9hZCA9IHRydWU7Ci0gICAgICAg
ICAgfQotICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoKG1fY2FjaGVQb2xpY3kgPT0gS0lP
OjpDQ19SZWxvYWQpIHx8IChtX2NhY2hlUG9saWN5ID09IEtJTzo6Q0NfUmVmcmVzaCkpCi0gICAg
ewotICAgICAgIGlmICghbV9yZWxvYWRlZFVSTHMuY29udGFpbnMoZnVsbFVSTC51cmwoKSkpCi0g
ICAgICAgewotICAgICAgICAgIENhY2hlZE9iamVjdCAqZXhpc3RpbmcgPSBDYWNoZTo6Y2FjaGUt
PmZpbmQoZnVsbFVSTC51cmwoKSk7Ci0gICAgICAgICAgaWYgKGV4aXN0aW5nKQotICAgICAgICAg
IHsKLSAgICAgICAgICAgICBDYWNoZTo6cmVtb3ZlQ2FjaGVFbnRyeShleGlzdGluZyk7Ci0gICAg
ICAgICAgfQotICAgICAgICAgIG1fcmVsb2FkZWRVUkxzLmFwcGVuZChmdWxsVVJMLnVybCgpKTsK
LSAgICAgICAgICByZWxvYWQgPSB0cnVlOwotICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJl
bG9hZDsKLX0KLQotQ2FjaGVkSW1hZ2UgKkRvY0xvYWRlcjo6cmVxdWVzdEltYWdlKCBjb25zdCBE
T006OkRPTVN0cmluZyAmdXJsKQotewotICAgIEtVUkwgZnVsbFVSTCA9IG1fZG9jLT5jb21wbGV0
ZVVSTCh1cmwucXN0cmluZygpKTsKLSAgICBpZiAoIG1fcGFydCAmJiBtX3BhcnQtPm9ubHlMb2Nh
bFJlZmVyZW5jZXMoKSAmJiBmdWxsVVJMLnByb3RvY29sKCkgIT0gImZpbGUiKSByZXR1cm4gMDsK
LQotICAgIGlmIChLV1FDaGVja0lmUmVsb2FkaW5nKHRoaXMpKSB7Ci0gICAgICAgIHNldENhY2hl
UG9saWN5KEtJTzo6Q0NfUmVsb2FkKTsKLSAgICB9Ci0KLSAgICBib29sIHJlbG9hZCA9IG5lZWRS
ZWxvYWQoZnVsbFVSTCk7Ci0KLSAgICBDYWNoZWRJbWFnZSAqY2FjaGVkT2JqZWN0ID0gQ2FjaGU6
OnJlcXVlc3RJbWFnZSh0aGlzLCBmdWxsVVJMLCByZWxvYWQsIG1fZXhwaXJlRGF0ZSk7Ci0gICAg
S1dRQ2hlY2tDYWNoZU9iamVjdFN0YXR1cyh0aGlzLCBjYWNoZWRPYmplY3QpOwotICAgIHJldHVy
biBjYWNoZWRPYmplY3Q7Ci19Ci0KLUNhY2hlZENTU1N0eWxlU2hlZXQgKkRvY0xvYWRlcjo6cmVx
dWVzdFN0eWxlU2hlZXQoIGNvbnN0IERPTTo6RE9NU3RyaW5nICZ1cmwsIGNvbnN0IFFTdHJpbmcm
IGNoYXJzZXQpCi17Ci0gICAgS1VSTCBmdWxsVVJMID0gbV9kb2MtPmNvbXBsZXRlVVJMKHVybC5x
c3RyaW5nKCkpOwotICAgIGlmICggbV9wYXJ0ICYmIG1fcGFydC0+b25seUxvY2FsUmVmZXJlbmNl
cygpICYmIGZ1bGxVUkwucHJvdG9jb2woKSAhPSAiZmlsZSIpIHJldHVybiAwOwotCi0gICAgaWYg
KEtXUUNoZWNrSWZSZWxvYWRpbmcodGhpcykpIHsKLSAgICAgICAgc2V0Q2FjaGVQb2xpY3koS0lP
OjpDQ19SZWxvYWQpOwotICAgIH0KLQotICAgIGJvb2wgcmVsb2FkID0gbmVlZFJlbG9hZChmdWxs
VVJMKTsKLQotICAgIENhY2hlZENTU1N0eWxlU2hlZXQgKmNhY2hlZE9iamVjdCA9IENhY2hlOjpy
ZXF1ZXN0U3R5bGVTaGVldCh0aGlzLCB1cmwsIHJlbG9hZCwgbV9leHBpcmVEYXRlLCBjaGFyc2V0
KTsKLSAgICBLV1FDaGVja0NhY2hlT2JqZWN0U3RhdHVzKHRoaXMsIGNhY2hlZE9iamVjdCk7Ci0g
ICAgcmV0dXJuIGNhY2hlZE9iamVjdDsKLX0KLQotQ2FjaGVkU2NyaXB0ICpEb2NMb2FkZXI6OnJl
cXVlc3RTY3JpcHQoIGNvbnN0IERPTTo6RE9NU3RyaW5nICZ1cmwsIGNvbnN0IFFTdHJpbmcmIGNo
YXJzZXQpCi17Ci0gICAgS1VSTCBmdWxsVVJMID0gbV9kb2MtPmNvbXBsZXRlVVJMKHVybC5xc3Ry
aW5nKCkpOwotICAgIGlmICggbV9wYXJ0ICYmIG1fcGFydC0+b25seUxvY2FsUmVmZXJlbmNlcygp
ICYmIGZ1bGxVUkwucHJvdG9jb2woKSAhPSAiZmlsZSIpIHJldHVybiAwOwotCi0gICAgaWYgKEtX
UUNoZWNrSWZSZWxvYWRpbmcodGhpcykpIHsKLSAgICAgICAgc2V0Q2FjaGVQb2xpY3koS0lPOjpD
Q19SZWxvYWQpOwotICAgIH0KLQotICAgIGJvb2wgcmVsb2FkID0gbmVlZFJlbG9hZChmdWxsVVJM
KTsKLQotICAgIENhY2hlZFNjcmlwdCAqY2FjaGVkT2JqZWN0ID0gQ2FjaGU6OnJlcXVlc3RTY3Jp
cHQodGhpcywgdXJsLCByZWxvYWQsIG1fZXhwaXJlRGF0ZSwgY2hhcnNldCk7Ci0gICAgS1dRQ2hl
Y2tDYWNoZU9iamVjdFN0YXR1cyh0aGlzLCBjYWNoZWRPYmplY3QpOwotICAgIHJldHVybiBjYWNo
ZWRPYmplY3Q7Ci19Ci0KLSNpZmRlZiBLSFRNTF9YU0xUCi1DYWNoZWRYU0xTdHlsZVNoZWV0KiBE
b2NMb2FkZXI6OnJlcXVlc3RYU0xTdHlsZVNoZWV0KGNvbnN0IERPTTo6RE9NU3RyaW5nICZ1cmwp
Ci17Ci0gICAgS1VSTCBmdWxsVVJMID0gbV9kb2MtPmNvbXBsZXRlVVJMKHVybC5xc3RyaW5nKCkp
OwotICAgIAotICAgIGlmIChtX3BhcnQgJiYgbV9wYXJ0LT5vbmx5TG9jYWxSZWZlcmVuY2VzKCkg
JiYgZnVsbFVSTC5wcm90b2NvbCgpICE9ICJmaWxlIikgcmV0dXJuIDA7Ci0gICAgCi0gICAgaWYg
KEtXUUNoZWNrSWZSZWxvYWRpbmcodGhpcykpCi0gICAgICAgIHNldENhY2hlUG9saWN5KEtJTzo6
Q0NfUmVsb2FkKTsKLSAgICAKLSAgICBib29sIHJlbG9hZCA9IG5lZWRSZWxvYWQoZnVsbFVSTCk7
Ci0gICAgCi0gICAgQ2FjaGVkWFNMU3R5bGVTaGVldCAqY2FjaGVkT2JqZWN0ID0gQ2FjaGU6OnJl
cXVlc3RYU0xTdHlsZVNoZWV0KHRoaXMsIHVybCwgcmVsb2FkLCBtX2V4cGlyZURhdGUpOwotICAg
IEtXUUNoZWNrQ2FjaGVPYmplY3RTdGF0dXModGhpcywgY2FjaGVkT2JqZWN0KTsKLSAgICByZXR1
cm4gY2FjaGVkT2JqZWN0OwotfQotI2VuZGlmCi0KLSNpZm5kZWYgS0hUTUxfTk9fWEJMCi1DYWNo
ZWRYQkxEb2N1bWVudCogRG9jTG9hZGVyOjpyZXF1ZXN0WEJMRG9jdW1lbnQoY29uc3QgRE9NOjpE
T01TdHJpbmcgJnVybCkKLXsKLSAgICBLVVJMIGZ1bGxVUkwgPSBtX2RvYy0+Y29tcGxldGVVUkwo
dXJsLnFzdHJpbmcoKSk7Ci0gICAgCi0gICAgLy8gRklYTUU6IElzIHRoaXMgcmlnaHQgZm9yIFhC
TD8KLSAgICBpZiAobV9wYXJ0ICYmIG1fcGFydC0+b25seUxvY2FsUmVmZXJlbmNlcygpICYmIGZ1
bGxVUkwucHJvdG9jb2woKSAhPSAiZmlsZSIpIHJldHVybiAwOwotICAgIAotICAgIGlmIChLV1FD
aGVja0lmUmVsb2FkaW5nKHRoaXMpKSB7Ci0gICAgICAgIHNldENhY2hlUG9saWN5KEtJTzo6Q0Nf
UmVsb2FkKTsKLSAgICB9Ci0gICAgCi0gICAgYm9vbCByZWxvYWQgPSBuZWVkUmVsb2FkKGZ1bGxV
UkwpOwotICAgIAotICAgIENhY2hlZFhCTERvY3VtZW50ICpjYWNoZWRPYmplY3QgPSBDYWNoZTo6
cmVxdWVzdFhCTERvY3VtZW50KHRoaXMsIHVybCwgcmVsb2FkLCBtX2V4cGlyZURhdGUpOwotICAg
IEtXUUNoZWNrQ2FjaGVPYmplY3RTdGF0dXModGhpcywgY2FjaGVkT2JqZWN0KTsKLSAgICByZXR1
cm4gY2FjaGVkT2JqZWN0OwotfQotI2VuZGlmCi0KLXZvaWQgRG9jTG9hZGVyOjpzZXRBdXRvbG9h
ZEltYWdlcyggYm9vbCBlbmFibGUgKQotewotICAgIGlmICggZW5hYmxlID09IG1fYmF1dG9sb2Fk
SW1hZ2VzICkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV9iYXV0b2xvYWRJbWFnZXMgPSBlbmFi
bGU7Ci0KLSAgICBpZiAoICFtX2JhdXRvbG9hZEltYWdlcyApIHJldHVybjsKLQotICAgIGZvciAo
IGNvbnN0IENhY2hlZE9iamVjdCogY289bV9kb2NPYmplY3RzLmZpcnN0KCk7IGNvOyBjbz1tX2Rv
Y09iamVjdHMubmV4dCgpICkKLSAgICAgICAgaWYgKCBjby0+dHlwZSgpID09IENhY2hlZE9iamVj
dDo6SW1hZ2UgKQotICAgICAgICB7Ci0gICAgICAgICAgICBDYWNoZWRJbWFnZSAqaW1nID0gY29u
c3RfY2FzdDxDYWNoZWRJbWFnZSo+KCBzdGF0aWNfY2FzdDxjb25zdCBDYWNoZWRJbWFnZSAqPigg
Y28gKSApOwotCi0gICAgICAgICAgICBDYWNoZWRPYmplY3Q6OlN0YXR1cyBzdGF0dXMgPSBpbWct
PnN0YXR1cygpOwotICAgICAgICAgICAgaWYgKCBzdGF0dXMgIT0gQ2FjaGVkT2JqZWN0OjpVbmtu
b3duICkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgQ2FjaGU6Omxv
YWRlcigpLT5sb2FkKHRoaXMsIGltZywgdHJ1ZSk7Ci0gICAgICAgIH0KLX0KLQotdm9pZCBEb2NM
b2FkZXI6OnNldENhY2hlUG9saWN5KCBLSU86OkNhY2hlQ29udHJvbCBjYWNoZVBvbGljeSApCi17
Ci0gICAgbV9jYWNoZVBvbGljeSA9IGNhY2hlUG9saWN5OwotfQotCi12b2lkIERvY0xvYWRlcjo6
c2V0U2hvd0FuaW1hdGlvbnMoIEtIVE1MU2V0dGluZ3M6OktBbmltYXRpb25BZHZpY2Ugc2hvd0Fu
aW1hdGlvbnMgKQotewotICAgIGlmICggc2hvd0FuaW1hdGlvbnMgPT0gbV9zaG93QW5pbWF0aW9u
cyApIHJldHVybjsKLSAgICBtX3Nob3dBbmltYXRpb25zID0gc2hvd0FuaW1hdGlvbnM7Ci0KLSAg
ICBjb25zdCBDYWNoZWRPYmplY3QqIGNvOwotICAgIGZvciAoIGNvPW1fZG9jT2JqZWN0cy5maXJz
dCgpOyBjbzsgY289bV9kb2NPYmplY3RzLm5leHQoKSApCi0gICAgICAgIGlmICggY28tPnR5cGUo
KSA9PSBDYWNoZWRPYmplY3Q6OkltYWdlICkKLSAgICAgICAgewotICAgICAgICAgICAgQ2FjaGVk
SW1hZ2UgKmltZyA9IGNvbnN0X2Nhc3Q8Q2FjaGVkSW1hZ2UqPiggc3RhdGljX2Nhc3Q8Y29uc3Qg
Q2FjaGVkSW1hZ2UgKj4oIGNvICkgKTsKLQotICAgICAgICAgICAgaW1nLT5zZXRTaG93QW5pbWF0
aW9ucyggc2hvd0FuaW1hdGlvbnMgKTsKLSAgICAgICAgfQotfQotCi12b2lkIERvY0xvYWRlcjo6
cmVtb3ZlQ2FjaGVkT2JqZWN0KCBDYWNoZWRPYmplY3QqIG8gKSBjb25zdAotewotICAgIG1fZG9j
T2JqZWN0cy5yZW1vdmVSZWYoIG8gKTsKLX0KLQotdm9pZCBEb2NMb2FkZXI6OnNldExvYWRJblBy
b2dyZXNzKGJvb2wgbG9hZCkKLXsKLSAgICBtX2xvYWRJblByb2dyZXNzID0gbG9hZDsKLX0KLQot
Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUxvYWRlcjo6TG9hZGVyKCkg
OiBRT2JqZWN0KCkKLXsKLSAgICBtX3JlcXVlc3RzUGVuZGluZy5zZXRBdXRvRGVsZXRlKCB0cnVl
ICk7Ci0gICAgbV9yZXF1ZXN0c0xvYWRpbmcuc2V0QXV0b0RlbGV0ZSggdHJ1ZSApOwotICAgIGt3
cSA9IG5ldyBLV1FMb2FkZXIodGhpcyk7Ci19Ci0KLUxvYWRlcjo6fkxvYWRlcigpCi17Ci0gICAg
ZGVsZXRlIGt3cTsKLX0KLQotdm9pZCBMb2FkZXI6OmxvYWQoRG9jTG9hZGVyKiBkbCwgQ2FjaGVk
T2JqZWN0ICpvYmplY3QsIGJvb2wgaW5jcmVtZW50YWwpCi17Ci0gICAgUmVxdWVzdCAqcmVxID0g
bmV3IFJlcXVlc3QoZGwsIG9iamVjdCwgaW5jcmVtZW50YWwpOwotICAgIG1fcmVxdWVzdHNQZW5k
aW5nLmFwcGVuZChyZXEpOwotCi0gICAgZW1pdCByZXF1ZXN0U3RhcnRlZCggcmVxLT5tX2RvY0xv
YWRlciwgcmVxLT5vYmplY3QgKTsKLQotICAgIHNlcnZlUGVuZGluZ1JlcXVlc3RzKCk7Ci19Ci0K
LXZvaWQgTG9hZGVyOjpzZXJ2ZVBlbmRpbmdSZXF1ZXN0cygpCi17Ci0gIGlmICggbV9yZXF1ZXN0
c1BlbmRpbmcuY291bnQoKSA9PSAwICkKLSAgICAgIHJldHVybjsKLQotICAvLyBnZXQgdGhlIGZp
cnN0IHBlbmRpbmcgcmVxdWVzdAotICBSZXF1ZXN0ICpyZXEgPSBtX3JlcXVlc3RzUGVuZGluZy50
YWtlKDApOwotCi0gIEtVUkwgdShyZXEtPm9iamVjdC0+dXJsKCkucXN0cmluZygpKTsKLSAgS0lP
OjpUcmFuc2ZlckpvYiogam9iID0gS0lPOjpnZXQoIHUsIGZhbHNlLCBmYWxzZSAvKm5vIEdVSSov
LCB0cnVlKTsKLSAgCi0gIGpvYi0+YWRkTWV0YURhdGEoImNhY2hlIiwgZ2V0Q2FjaGVDb250cm9s
U3RyaW5nKHJlcS0+b2JqZWN0LT5jYWNoZVBvbGljeSgpKSk7Ci0gIGlmICghcmVxLT5vYmplY3Qt
PmFjY2VwdCgpLmlzRW1wdHkoKSkKLSAgICAgIGpvYi0+YWRkTWV0YURhdGEoImFjY2VwdCIsIHJl
cS0+b2JqZWN0LT5hY2NlcHQoKSk7Ci0gIGlmICggcmVxLT5tX2RvY0xvYWRlciApICB7Ci0gICAg
ICBLVVJMIHIgPSByZXEtPm1fZG9jTG9hZGVyLT5kb2MoKS0+VVJMKCk7Ci0gICAgICBpZiAoIHIu
cHJvdG9jb2woKS5zdGFydHNXaXRoKCAiaHR0cCIgKSAmJiByLnBhdGgoKS5pc0VtcHR5KCkgKQot
ICAgICAgICAgIHIuc2V0UGF0aCggIi8iICk7Ci0KLSAgICAgIGpvYi0+YWRkTWV0YURhdGEoInJl
ZmVycmVyIiwgci51cmwoKSk7Ci0gICAgICBRU3RyaW5nIGRvbWFpbiA9IHIuaG9zdCgpOwotICAg
ICAgaWYgKHJlcS0+bV9kb2NMb2FkZXItPmRvYygpLT5pc0hUTUxEb2N1bWVudCgpKQotICAgICAg
ICAgZG9tYWluID0gc3RhdGljX2Nhc3Q8SFRNTERvY3VtZW50SW1wbCo+KHJlcS0+bV9kb2NMb2Fk
ZXItPmRvYygpKS0+ZG9tYWluKCkucXN0cmluZygpOwotICAgICAgaWYgKGNyb3NzRG9tYWluKHUu
aG9zdCgpLCBkb21haW4pKQotICAgICAgICAgam9iLT5hZGRNZXRhRGF0YSgiY3Jvc3MtZG9tYWlu
IiwgInRydWUiKTsKLSAgfQotCi0gIGNvbm5lY3QoIGpvYiwgU0lHTkFMKCByZXN1bHQoIEtJTzo6
Sm9iICosIE5TRGF0YSAqKSApLCB0aGlzLCBTTE9UKCBzbG90RmluaXNoZWQoIEtJTzo6Sm9iICos
IE5TRGF0YSAqKSApICk7Ci0gIAotICBjb25uZWN0KCBqb2IsIFNJR05BTCggZGF0YSggS0lPOjpK
b2IqLCBjb25zdCBjaGFyICosIGludCkpLAotICAgICAgICAgICBTTE9UKCBzbG90RGF0YSggS0lP
OjpKb2IqLCBjb25zdCBjaGFyICosIGludCkpKTsKLSAgY29ubmVjdCggam9iLCBTSUdOQUwoIHJl
Y2VpdmVkUmVzcG9uc2UoIEtJTzo6Sm9iICosIE5TVVJMUmVzcG9uc2UgKikpLCBTTE9UKCBzbG90
UmVjZWl2ZWRSZXNwb25zZSggS0lPOjpKb2IgKiwgTlNVUkxSZXNwb25zZSAqKSkgKTsKLQotICBp
ZiAoS1dRU2VydmVSZXF1ZXN0KHRoaXMsIHJlcSwgam9iKSkgewotICAgICAgaWYgKHJlcS0+b2Jq
ZWN0LT50eXBlKCkgPT0gQ2FjaGVkT2JqZWN0OjpJbWFnZSkgewotCUNhY2hlZEltYWdlICpjaSA9
IHN0YXRpY19jYXN0PENhY2hlZEltYWdlKj4ocmVxLT5vYmplY3QpOwotCWlmIChjaS0+ZGVjb2Rl
ckNhbGxiYWNrKCkpIHsKLQkgICAgbV9yZXF1ZXN0c0JhY2tncm91bmREZWNvZGluZy5hcHBlbmQo
cmVxKTsKLQl9Ci0gICAgICB9Ci0gICAgICBtX3JlcXVlc3RzTG9hZGluZy5pbnNlcnQoam9iLCBy
ZXEpOwotICB9Ci19Ci0KLXZvaWQgTG9hZGVyOjpzbG90RmluaXNoZWQoIEtJTzo6Sm9iKiBqb2Is
IE5TRGF0YSAqYWxsRGF0YSkKLXsKLSAgICBSZXF1ZXN0ICpyID0gbV9yZXF1ZXN0c0xvYWRpbmcu
dGFrZSggam9iICk7Ci0gICAgS0lPOjpUcmFuc2ZlckpvYiogaiA9IHN0YXRpY19jYXN0PEtJTzo6
VHJhbnNmZXJKb2IqPihqb2IpOwotCi0gICAgaWYgKCAhciApCi0gICAgICAgIHJldHVybjsKLQot
ICAgIENhY2hlZE9iamVjdCAqb2JqZWN0ID0gci0+b2JqZWN0OwotICAgIERvY0xvYWRlciAqZG9j
TG9hZGVyID0gci0+bV9kb2NMb2FkZXI7Ci0gICAgCi0gICAgYm9vbCBiYWNrZ3JvdW5kSW1hZ2VE
ZWNvZGluZyA9IChvYmplY3QtPnR5cGUoKSA9PSBDYWNoZWRPYmplY3Q6OkltYWdlICYmIAotCXN0
YXRpY19jYXN0PENhY2hlZEltYWdlKj4ob2JqZWN0KS0+ZGVjb2RlckNhbGxiYWNrKCkpOwotCQot
ICAgIGlmIChqLT5lcnJvcigpIHx8IGotPmlzRXJyb3JQYWdlKCkpIHsKLSAgICAgICAgLy8gVXNl
IHRoZSBiYWNrZ3JvdW5kIGltYWdlIGRlY29kZXIncyBjYWxsYmFjayB0byBoYW5kbGUgdGhlIGVy
cm9yLgotICAgICAgICBpZiAoYmFja2dyb3VuZEltYWdlRGVjb2RpbmcpIHsKLSAgICAgICAgICAg
IENhY2hlZEltYWdlQ2FsbGJhY2sgKmNhbGxiYWNrID0gc3RhdGljX2Nhc3Q8Q2FjaGVkSW1hZ2Uq
PihvYmplY3QpLT5kZWNvZGVyQ2FsbGJhY2soKTsKLSAgICAgICAgICAgIGNhbGxiYWNrLT5oYW5k
bGVFcnJvcigpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgZG9jTG9h
ZGVyLT5zZXRMb2FkSW5Qcm9ncmVzcyh0cnVlKTsKLSAgICAgICAgICAgIHItPm9iamVjdC0+ZXJy
b3IoIGpvYi0+ZXJyb3IoKSwgam9iLT5lcnJvclRleHQoKS5hc2NpaSgpICk7Ci0gICAgICAgICAg
ICBkb2NMb2FkZXItPnNldExvYWRJblByb2dyZXNzKGZhbHNlKTsKLSAgICAgICAgICAgIGVtaXQg
cmVxdWVzdEZhaWxlZCggZG9jTG9hZGVyLCBvYmplY3QgKTsKLSAgICAgICAgICAgIENhY2hlOjpy
ZW1vdmVDYWNoZUVudHJ5KCBvYmplY3QgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsK
LSAgICAgICAgZG9jTG9hZGVyLT5zZXRMb2FkSW5Qcm9ncmVzcyh0cnVlKTsKLSAgICAgICAgb2Jq
ZWN0LT5kYXRhKHItPm1fYnVmZmVyLCB0cnVlKTsKLSAgICAgICAgci0+b2JqZWN0LT5zZXRBbGxE
YXRhKGFsbERhdGEpOwotICAgICAgICBkb2NMb2FkZXItPnNldExvYWRJblByb2dyZXNzKGZhbHNl
KTsKLSAgICAgICAgCi0gICAgICAgIC8vIExldCB0aGUgYmFja2dyb3VuZCBpbWFnZSBkZWNvZGVy
IHRyaWdnZXIgdGhlIGRvbmUgc2lnbmFsLgotICAgICAgICBpZiAoIWJhY2tncm91bmRJbWFnZURl
Y29kaW5nKQotICAgICAgICAgICAgZW1pdCByZXF1ZXN0RG9uZSggZG9jTG9hZGVyLCBvYmplY3Qg
KTsKLQotICAgICAgICBvYmplY3QtPmZpbmlzaCgpOwotICAgIH0KLQotICAgIC8vIExldCB0aGUg
YmFja2dyb3VuZCBpbWFnZSBkZWNvZGVyIHJlbGVhc2UgdGhlIHJlcXVlc3Qgd2hlbiBpdCBpcwot
ICAgIC8vIGZpbmlzaGVkLgotICAgIGlmICghYmFja2dyb3VuZEltYWdlRGVjb2RpbmcpIHsKLSAg
ICAgICAgZGVsZXRlIHI7Ci0gICAgfQotCi0gICAgc2VydmVQZW5kaW5nUmVxdWVzdHMoKTsKLX0K
LQotCi12b2lkIExvYWRlcjo6c2xvdFJlY2VpdmVkUmVzcG9uc2UoS0lPOjpKb2IqIGpvYiwgTlNV
UkxSZXNwb25zZSAqcmVzcG9uc2UpCi17Ci0gICAgUmVxdWVzdCAqciA9IG1fcmVxdWVzdHNMb2Fk
aW5nW2pvYl07Ci0gICAgQVNTRVJUKHIpOwotICAgIEFTU0VSVChyZXNwb25zZSk7Ci0gICAgci0+
b2JqZWN0LT5zZXRSZXNwb25zZShyZXNwb25zZSk7Ci0gICAgci0+b2JqZWN0LT5zZXRFeHBpcmVE
YXRlKEtXUUNhY2hlT2JqZWN0RXhwaXJlc1RpbWUoci0+bV9kb2NMb2FkZXIsIHJlc3BvbnNlKSwg
ZmFsc2UpOwotICAgIAotICAgIFFTdHJpbmcgY2hzID0gc3RhdGljX2Nhc3Q8S0lPOjpUcmFuc2Zl
ckpvYio+KGpvYiktPnF1ZXJ5TWV0YURhdGEoImNoYXJzZXQiKTsKLSAgICBpZiAoIWNocy5pc051
bGwoKSkKLSAgICAgICAgci0+b2JqZWN0LT5zZXRDaGFyc2V0KGNocyk7Ci0gICAgCi0gICAgaWYg
KHItPm11bHRpcGFydCkgewotICAgICAgICBBU1NFUlQoci0+b2JqZWN0LT5pc0ltYWdlKCkpOwot
ICAgICAgICBzdGF0aWNfY2FzdDxDYWNoZWRJbWFnZSAqPihyLT5vYmplY3QpLT5jbGVhcigpOwot
ICAgICAgICByLT5tX2J1ZmZlciA9IFFCdWZmZXIoKTsKLSAgICAgICAgaWYgKHItPm1fZG9jTG9h
ZGVyLT5wYXJ0KCkpCi0gICAgICAgICAgICByLT5tX2RvY0xvYWRlci0+cGFydCgpLT5jaGVja0Nv
bXBsZXRlZCgpOwotICAgICAgICAKLSAgICB9IGVsc2UgaWYgKEtXUVJlc3BvbnNlSXNNdWx0aXBh
cnQocmVzcG9uc2UpKSB7Ci0gICAgICAgIHItPm11bHRpcGFydCA9IHRydWU7Ci0gICAgICAgIGlm
ICghci0+b2JqZWN0LT5pc0ltYWdlKCkpCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxLSU86OlRy
YW5zZmVySm9iKj4oam9iKS0+Y2FuY2VsKCk7Ci0gICAgfQotfQotCi0KLXZvaWQgTG9hZGVyOjpz
bG90RGF0YSggS0lPOjpKb2Iqam9iLCBjb25zdCBjaGFyICpkYXRhLCBpbnQgc2l6ZSApCi17Ci0g
ICAgUmVxdWVzdCAqciA9IG1fcmVxdWVzdHNMb2FkaW5nW2pvYl07Ci0gICAgaWYoIXIpIHsKLSAg
ICAgICAga2REZWJ1ZyggNjA2MCApIDw8ICJnb3QgZGF0YSBmb3IgdW5rbm93biByZXF1ZXN0ISIg
PDwgZW5kbDsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmICggIXItPm1fYnVmZmVy
LmlzT3BlbigpICkKLSAgICAgICAgci0+bV9idWZmZXIub3BlbiggSU9fV3JpdGVPbmx5ICk7Ci0K
LSAgICByLT5tX2J1ZmZlci53cml0ZUJsb2NrKCBkYXRhLCBzaXplICk7Ci0KLSAgICBpZiAoci0+
bXVsdGlwYXJ0KQotICAgICAgICByLT5vYmplY3QtPmRhdGEoIHItPm1fYnVmZmVyLCB0cnVlICk7
IC8vIHRoZSBsb2FkZXIgZGVsaXZlcnMgdGhlIGRhdGEgaW4gYSBtdWx0aXBhcnQgc2VjdGlvbiBh
bGwgYXQgb25jZSwgc2VuZCBlb2YKLSAgICBlbHNlIGlmKHItPmluY3JlbWVudGFsKQotICAgICAg
ICByLT5vYmplY3QtPmRhdGEoIHItPm1fYnVmZmVyLCBmYWxzZSApOwotfQotCi1pbnQgTG9hZGVy
OjpudW1SZXF1ZXN0cyggRG9jTG9hZGVyKiBkbCApIGNvbnN0Ci17Ci0gICAgaW50IHJlcyA9IDA7
Ci0KLSAgICBRUHRyTGlzdEl0ZXJhdG9yPFJlcXVlc3Q+IHBJdCggbV9yZXF1ZXN0c1BlbmRpbmcg
KTsKLSAgICBmb3IgKDsgcEl0LmN1cnJlbnQoKTsgKytwSXQgKQotICAgICAgICBpZiAoIHBJdC5j
dXJyZW50KCktPm1fZG9jTG9hZGVyID09IGRsICkKLSAgICAgICAgICAgIHJlcysrOwotCi0gICAg
UVB0ckRpY3RJdGVyYXRvcjxSZXF1ZXN0PiBsSXQoIG1fcmVxdWVzdHNMb2FkaW5nICk7Ci0gICAg
Zm9yICg7IGxJdC5jdXJyZW50KCk7ICsrbEl0ICkKLSAgICAgICAgaWYgKCBsSXQuY3VycmVudCgp
LT5tX2RvY0xvYWRlciA9PSBkbCApCi0gICAgICAgICAgICBpZiAoIWxJdC5jdXJyZW50KCktPm11
bHRpcGFydCkKLSAgICAgICAgICAgICAgICByZXMrKzsKLQotICAgIFFQdHJMaXN0SXRlcmF0b3I8
UmVxdWVzdD4gYmRJdCggbV9yZXF1ZXN0c0JhY2tncm91bmREZWNvZGluZyApOwotICAgIGZvciAo
OyBiZEl0LmN1cnJlbnQoKTsgKytiZEl0ICkKLSAgICAgICAgaWYgKCBiZEl0LmN1cnJlbnQoKS0+
bV9kb2NMb2FkZXIgPT0gZGwgKQotICAgICAgICAgICAgcmVzKys7Ci0KLSAgICBpZiAoZGwtPmxv
YWRJblByb2dyZXNzKCkpCi0gICAgICAgIHJlcysrOwotICAgICAgICAKLSAgICByZXR1cm4gcmVz
OwotfQotCi12b2lkIExvYWRlcjo6Y2FuY2VsUmVxdWVzdHMoIERvY0xvYWRlciogZGwgKQotewot
ICAgIFFQdHJMaXN0SXRlcmF0b3I8UmVxdWVzdD4gcEl0KCBtX3JlcXVlc3RzUGVuZGluZyApOwot
ICAgIHdoaWxlICggcEl0LmN1cnJlbnQoKSApCi0gICAgewotICAgICAgICBpZiAocEl0LmN1cnJl
bnQoKS0+bV9kb2NMb2FkZXIgPT0gZGwpIHsKLSAgICAgICAgICAgIENhY2hlOjpyZW1vdmVDYWNo
ZUVudHJ5KCBwSXQuY3VycmVudCgpLT5vYmplY3QgKTsKLSAgICAgICAgICAgIG1fcmVxdWVzdHNQ
ZW5kaW5nLnJlbW92ZSggcEl0ICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAg
ICAgKytwSXQ7Ci0gICAgfQotCi0gICAgUVB0ckRpY3RJdGVyYXRvcjxSZXF1ZXN0PiBsSXQoIG1f
cmVxdWVzdHNMb2FkaW5nICk7Ci0gICAgd2hpbGUgKCBsSXQuY3VycmVudCgpICkKLSAgICB7Ci0g
ICAgICAgIGlmIChsSXQuY3VycmVudCgpLT5tX2RvY0xvYWRlciA9PSBkbCkgewotICAgICAgICAg
ICAgS0lPOjpKb2IgKmpvYiA9IHN0YXRpY19jYXN0PEtJTzo6Sm9iICo+KCBsSXQuY3VycmVudEtl
eSgpICk7Ci0gICAgICAgICAgICBDYWNoZTo6cmVtb3ZlQ2FjaGVFbnRyeSggbEl0LmN1cnJlbnQo
KS0+b2JqZWN0ICk7Ci0gICAgICAgICAgICBtX3JlcXVlc3RzTG9hZGluZy5yZW1vdmUoIGxJdC5j
dXJyZW50S2V5KCkgKTsKLSAgICAgICAgICAgIGpvYi0+a2lsbCgpOwotICAgICAgICB9Ci0gICAg
ICAgIGVsc2UKLSAgICAgICAgICAgICsrbEl0OwotICAgIH0KLQotICAgIFFQdHJMaXN0SXRlcmF0
b3I8UmVxdWVzdD4gYmRJdCggbV9yZXF1ZXN0c0JhY2tncm91bmREZWNvZGluZyApOwotICAgIHdo
aWxlIChiZEl0LmN1cnJlbnQoKSkgewotICAgICAgICBpZiAoYmRJdC5jdXJyZW50KCktPm1fZG9j
TG9hZGVyID09IGRsKSB7Ci0gICAgICAgICAgICBDYWNoZTo6cmVtb3ZlQ2FjaGVFbnRyeSggYmRJ
dC5jdXJyZW50KCktPm9iamVjdCApOwotICAgICAgICAgICAgbV9yZXF1ZXN0c0JhY2tncm91bmRE
ZWNvZGluZy5yZW1vdmUoIGJkSXQgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAg
ICAgICArK2JkSXQ7Ci0gICAgfQotfQotCi12b2lkIExvYWRlcjo6cmVtb3ZlQmFja2dyb3VuZERl
Y29kaW5nUmVxdWVzdCAoUmVxdWVzdCAqcikKLXsKLSAgICBib29sIHByZXNlbnQgPSBtX3JlcXVl
c3RzQmFja2dyb3VuZERlY29kaW5nLmNvbnRhaW5zUmVmKHIpOwotICAgIGlmIChwcmVzZW50KSB7
Ci0JbV9yZXF1ZXN0c0JhY2tncm91bmREZWNvZGluZy5yZW1vdmUgKHIpOwotICAgIH0KLX0KLQot
S0lPOjpKb2IgKkxvYWRlcjo6am9iRm9yUmVxdWVzdCggY29uc3QgRE9NOjpET01TdHJpbmcgJnVy
bCApIGNvbnN0Ci17Ci0gICAgUVB0ckRpY3RJdGVyYXRvcjxSZXF1ZXN0PiBpdCggbV9yZXF1ZXN0
c0xvYWRpbmcgKTsKLQotICAgIGZvciAoOyBpdC5jdXJyZW50KCk7ICsraXQgKQotICAgIHsKLSAg
ICAgICAgQ2FjaGVkT2JqZWN0ICpvYmogPSBpdC5jdXJyZW50KCktPm9iamVjdDsKLQotICAgICAg
ICBpZiAoIG9iaiAmJiBvYmotPnVybCgpID09IHVybCApCi0gICAgICAgICAgICByZXR1cm4gc3Rh
dGljX2Nhc3Q8S0lPOjpKb2IgKj4oIGl0LmN1cnJlbnRLZXkoKSApOwotICAgIH0KLQotICAgIHJl
dHVybiAwOwotfQotCi0KLWJvb2wgTG9hZGVyOjppc0tIVE1MTG9hZGVyKCkgY29uc3QKLXsKLSAg
ICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQotTFJVTGlz
dDo6TFJVTGlzdCgpCi06bV9oZWFkKDApLCBtX3RhaWwoMCkgCi17fQotCi1MUlVMaXN0Ojp+TFJV
TGlzdCgpCi17fQotCi1RRGljdDxDYWNoZWRPYmplY3Q+ICpDYWNoZTo6Y2FjaGUgPSAwOwotUVB0
ckxpc3Q8RG9jTG9hZGVyPiogQ2FjaGU6OmRvY2xvYWRlciA9IDA7Ci1Mb2FkZXIgKkNhY2hlOjpt
X2xvYWRlciA9IDA7Ci0KLWludCBDYWNoZTo6bWF4U2l6ZSA9IERFRkNBQ0hFU0laRTsKLWludCBD
YWNoZTo6bWF4Q2FjaGVhYmxlID0gTUFYQ0FDSEVBQkxFOwotaW50IENhY2hlOjpmbHVzaENvdW50
ID0gMDsKLQotUVBpeG1hcCAqQ2FjaGU6Om51bGxQaXhtYXAgPSAwOwotUVBpeG1hcCAqQ2FjaGU6
OmJyb2tlblBpeG1hcCA9IDA7Ci0KLUNhY2hlZE9iamVjdCAqQ2FjaGU6Om1faGVhZE9mVW5jYWNo
ZWFibGVMaXN0ID0gMDsKLWludCBDYWNoZTo6bV90b3RhbFNpemVPZkxSVUxpc3RzID0gMDsKLWlu
dCBDYWNoZTo6bV9jb3VudE9mTFJVQW5kVW5jYWNoZWFibGVMaXN0czsKLUxSVUxpc3QgKkNhY2hl
OjptX0xSVUxpc3RzID0gMDsKLQotdm9pZCBDYWNoZTo6aW5pdCgpCi17Ci0gICAgaWYgKCAhY2Fj
aGUgKQotICAgICAgICBjYWNoZSA9IG5ldyBRRGljdDxDYWNoZWRPYmplY3Q+KDQwMSwgdHJ1ZSk7
Ci0KLSAgICBpZiAoICFkb2Nsb2FkZXIgKQotICAgICAgICBkb2Nsb2FkZXIgPSBuZXcgUVB0ckxp
c3Q8RG9jTG9hZGVyPjsKLQotICAgIGlmICggIW51bGxQaXhtYXAgKQotICAgICAgICBudWxsUGl4
bWFwID0gbmV3IFFQaXhtYXA7Ci0KLSAgICBpZiAoICFicm9rZW5QaXhtYXAgKQotICAgICAgICBi
cm9rZW5QaXhtYXAgPSBLV1FMb2FkUGl4bWFwKCJtaXNzaW5nX2ltYWdlIik7Ci0KLSAgICBpZiAo
ICFtX2xvYWRlciApCi0gICAgICAgIG1fbG9hZGVyID0gbmV3IExvYWRlcigpOwotfQotCi12b2lk
IENhY2hlOjpjbGVhcigpCi17Ci0gICAgaWYgKCFjYWNoZSkKLSAgICAgICAgcmV0dXJuOwotCi0g
ICAgY2FjaGUtPnNldEF1dG9EZWxldGUoIHRydWUgKTsKLSAgICBkZWxldGUgY2FjaGU7IGNhY2hl
ID0gMDsKLSAgICBkZWxldGUgbnVsbFBpeG1hcDsgbnVsbFBpeG1hcCA9IDA7Ci0gICAgZGVsZXRl
IGJyb2tlblBpeG1hcDsgYnJva2VuUGl4bWFwID0gMDsKLSAgICBkZWxldGUgbV9sb2FkZXI7ICAg
bV9sb2FkZXIgPSAwOwotICAgIGRlbGV0ZSBkb2Nsb2FkZXI7IGRvY2xvYWRlciA9IDA7Ci19Ci0K
LUNhY2hlZEltYWdlICpDYWNoZTo6cmVxdWVzdEltYWdlKCBEb2NMb2FkZXIqIGRsLCBjb25zdCBE
T01TdHJpbmcgJiB1cmwsIGJvb2wgcmVsb2FkLCB0aW1lX3QgX2V4cGlyZURhdGUgKQotewotICAg
IC8vIHRoaXMgYnJpbmdzIHRoZSBfdXJsIHRvIGEgc3RhbmRhcmQgZm9ybS4uLgotICAgIEtVUkwg
a3VybDsKLSAgICBpZiAoZGwpCi0gICAgICAgIGt1cmwgPSBkbC0+bV9kb2MtPmNvbXBsZXRlVVJM
KCB1cmwucXN0cmluZygpICk7Ci0gICAgZWxzZQotICAgICAgICBrdXJsID0gdXJsLnFzdHJpbmco
KTsKLSAgICByZXR1cm4gcmVxdWVzdEltYWdlKGRsLCBrdXJsLCByZWxvYWQsIF9leHBpcmVEYXRl
KTsKLX0KLQotQ2FjaGVkSW1hZ2UgKkNhY2hlOjpyZXF1ZXN0SW1hZ2UoIERvY0xvYWRlciogZGws
IGNvbnN0IEtVUkwgJiB1cmwsIGJvb2wgcmVsb2FkLCB0aW1lX3QgX2V4cGlyZURhdGUgKQotewot
ICAgIEtJTzo6Q2FjaGVDb250cm9sIGNhY2hlUG9saWN5OwotICAgIGlmIChkbCkKLSAgICAgICAg
Y2FjaGVQb2xpY3kgPSBkbC0+Y2FjaGVQb2xpY3koKTsKLSAgICBlbHNlCi0gICAgICAgIGNhY2hl
UG9saWN5ID0gS0lPOjpDQ19WZXJpZnk7Ci0KLSAgICAvLyBDaGVja2luZyBpZiB0aGUgVVJMIGlz
IG1hbGZvcm1lZCBpcyBsb3RzIG9mIGV4dHJhIHdvcmsgZm9yIGxpdHRsZSBiZW5lZml0LgotCi0g
ICAgaWYgKCFkbC0+ZG9jKCktPnNob3VsZENyZWF0ZVJlbmRlcmVycygpKXsKLSAgICAgICAgcmV0
dXJuIDA7Ci0gICAgfQotCi0gICAgQ2FjaGVkT2JqZWN0ICpvID0gMDsKLSAgICBpZiAoIXJlbG9h
ZCkKLSAgICAgICAgbyA9IGNhY2hlLT5maW5kKHVybC51cmwoKSk7Ci0gICAgaWYoIW8pCi0gICAg
ewotI2lmZGVmIENBQ0hFX0RFQlVHCi0gICAgICAgIGtkRGVidWcoIDYwNjAgKSA8PCAiQ2FjaGU6
IG5ldzogIiA8PCB1cmwudXJsKCkgPDwgZW5kbDsKLSNlbmRpZgotICAgICAgICBDYWNoZWRJbWFn
ZSAqaW0gPSBuZXcgQ2FjaGVkSW1hZ2UoZGwsIHVybC51cmwoKSwgY2FjaGVQb2xpY3ksIF9leHBp
cmVEYXRlKTsKLSAgICAgICAgaWYgKCBkbCAmJiBkbC0+YXV0b2xvYWRJbWFnZXMoKSApIENhY2hl
Ojpsb2FkZXIoKS0+bG9hZChkbCwgaW0sIHRydWUpOwotICAgICAgICBpZiAoY2FjaGVEaXNhYmxl
ZCkKLSAgICAgICAgICAgIGltLT5zZXRGcmVlKHRydWUpOwotICAgICAgICBlbHNlIHsKLSAgICAg
ICAgY2FjaGUtPmluc2VydCggdXJsLnVybCgpLCBpbSApOwotICAgICAgICBtb3ZlVG9IZWFkT2ZM
UlVMaXN0KGltKTsKLSAgICAgICAgfQotICAgICAgICBvID0gaW07Ci0gICAgfQotCi0gICAgCi0g
ICAgaWYoby0+dHlwZSgpICE9IENhY2hlZE9iamVjdDo6SW1hZ2UpCi0gICAgewotI2lmZGVmIENB
Q0hFX0RFQlVHCi0gICAgICAgIGtkRGVidWcoIDYwNjAgKSA8PCAiQ2FjaGU6OkludGVybmFsIEVy
cm9yIGluIHJlcXVlc3RJbWFnZSB1cmw9IiA8PCBrdXJsLnVybCgpIDw8ICIhIiA8PCBlbmRsOwot
I2VuZGlmCi0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotI2lmZGVmIENBQ0hFX0RFQlVHCi0g
ICAgaWYoIG8tPnN0YXR1cygpID09IENhY2hlZE9iamVjdDo6UGVuZGluZyApCi0gICAgICAgIGtk
RGVidWcoIDYwNjAgKSA8PCAiQ2FjaGU6IGxvYWRpbmcgaW4gcHJvZ3Jlc3M6ICIgPDwga3VybC51
cmwoKSA8PCBlbmRsOwotICAgIGVsc2UKLSAgICAgICAga2REZWJ1ZyggNjA2MCApIDw8ICJDYWNo
ZTogdXNpbmcgY2FjaGVkOiAiIDw8IGt1cmwudXJsKCkgPDwgIiwgc3RhdHVzICIgPDwgby0+c3Rh
dHVzKCkgPDwgZW5kbDsKLSNlbmRpZgotCi0gICAgbW92ZVRvSGVhZE9mTFJVTGlzdChvKTsKLSAg
ICBpZiAoIGRsICkgewotICAgICAgICBkbC0+bV9kb2NPYmplY3RzLnJlbW92ZSggbyApOwotICAg
ICAgICBpZiAoIWNhY2hlRGlzYWJsZWQpCi0gICAgICAgIGRsLT5tX2RvY09iamVjdHMuYXBwZW5k
KCBvICk7Ci0gICAgfQotICAgIHJldHVybiBzdGF0aWNfY2FzdDxDYWNoZWRJbWFnZSAqPihvKTsK
LX0KLQotQ2FjaGVkQ1NTU3R5bGVTaGVldCAqQ2FjaGU6OnJlcXVlc3RTdHlsZVNoZWV0KCBEb2NM
b2FkZXIqIGRsLCBjb25zdCBET01TdHJpbmcgJiB1cmwsIGJvb2wgcmVsb2FkLCB0aW1lX3QgX2V4
cGlyZURhdGUsIGNvbnN0IFFTdHJpbmcmIGNoYXJzZXQpCi17Ci0gICAgLy8gdGhpcyBicmluZ3Mg
dGhlIF91cmwgdG8gYSBzdGFuZGFyZCBmb3JtLi4uCi0gICAgS1VSTCBrdXJsOwotICAgIEtJTzo6
Q2FjaGVDb250cm9sIGNhY2hlUG9saWN5OwotICAgIGlmICggZGwgKQotICAgIHsKLSAgICAgICAg
a3VybCA9IGRsLT5tX2RvYy0+Y29tcGxldGVVUkwoIHVybC5xc3RyaW5nKCkgKTsKLSAgICAgICAg
Y2FjaGVQb2xpY3kgPSBkbC0+Y2FjaGVQb2xpY3koKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsK
LSAgICAgICAga3VybCA9IHVybC5xc3RyaW5nKCk7Ci0gICAgICAgIGNhY2hlUG9saWN5ID0gS0lP
OjpDQ19WZXJpZnk7Ci0gICAgfQotCi0gICAgLy8gQ2hlY2tpbmcgaWYgdGhlIFVSTCBpcyBtYWxm
b3JtZWQgaXMgbG90cyBvZiBleHRyYSB3b3JrIGZvciBsaXR0bGUgYmVuZWZpdC4KLQotICAgIENh
Y2hlZE9iamVjdCAqbyA9IGNhY2hlLT5maW5kKGt1cmwudXJsKCkpOwotICAgIGlmKCFvKQotICAg
IHsKLSNpZmRlZiBDQUNIRV9ERUJVRwotICAgICAgICBrZERlYnVnKCA2MDYwICkgPDwgIkNhY2hl
OiBuZXc6ICIgPDwga3VybC51cmwoKSA8PCBlbmRsOwotI2VuZGlmCi0gICAgICAgIENhY2hlZENT
U1N0eWxlU2hlZXQgKnNoZWV0ID0gbmV3IENhY2hlZENTU1N0eWxlU2hlZXQoZGwsIGt1cmwudXJs
KCksIGNhY2hlUG9saWN5LCBfZXhwaXJlRGF0ZSwgY2hhcnNldCk7Ci0gICAgICAgIGlmIChjYWNo
ZURpc2FibGVkKQotICAgICAgICAgICAgc2hlZXQtPnNldEZyZWUodHJ1ZSk7Ci0gICAgICAgIGVs
c2UgewotICAgICAgICBjYWNoZS0+aW5zZXJ0KCBrdXJsLnVybCgpLCBzaGVldCApOwotICAgICAg
ICBtb3ZlVG9IZWFkT2ZMUlVMaXN0KHNoZWV0KTsKLSAgICAgICAgfQotICAgICAgICBvID0gc2hl
ZXQ7Ci0gICAgfQotCi0gICAgCi0gICAgaWYoby0+dHlwZSgpICE9IENhY2hlZE9iamVjdDo6Q1NT
U3R5bGVTaGVldCkKLSAgICB7Ci0jaWZkZWYgQ0FDSEVfREVCVUcKLSAgICAgICAga2REZWJ1Zygg
NjA2MCApIDw8ICJDYWNoZTo6SW50ZXJuYWwgRXJyb3IgaW4gcmVxdWVzdFN0eWxlU2hlZXQgdXJs
PSIgPDwga3VybC51cmwoKSA8PCAiISIgPDwgZW5kbDsKLSNlbmRpZgotICAgICAgICByZXR1cm4g
MDsKLSAgICB9Ci0KLSNpZmRlZiBDQUNIRV9ERUJVRwotICAgIGlmKCBvLT5zdGF0dXMoKSA9PSBD
YWNoZWRPYmplY3Q6OlBlbmRpbmcgKQotICAgICAgICBrZERlYnVnKCA2MDYwICkgPDwgIkNhY2hl
OiBsb2FkaW5nIGluIHByb2dyZXNzOiAiIDw8IGt1cmwudXJsKCkgPDwgZW5kbDsKLSAgICBlbHNl
Ci0gICAgICAgIGtkRGVidWcoIDYwNjAgKSA8PCAiQ2FjaGU6IHVzaW5nIGNhY2hlZDogIiA8PCBr
dXJsLnVybCgpIDw8IGVuZGw7Ci0jZW5kaWYKLQotICAgIG1vdmVUb0hlYWRPZkxSVUxpc3Qobyk7
Ci0gICAgaWYgKCBkbCApIHsKLSAgICAgICAgZGwtPm1fZG9jT2JqZWN0cy5yZW1vdmUoIG8gKTsK
LSAgICAgICAgaWYgKCFjYWNoZURpc2FibGVkKQotICAgICAgICBkbC0+bV9kb2NPYmplY3RzLmFw
cGVuZCggbyApOwotICAgIH0KLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q2FjaGVkQ1NTU3R5bGVT
aGVldCAqPihvKTsKLX0KLQotdm9pZCBDYWNoZTo6cHJlbG9hZFN0eWxlU2hlZXQoIGNvbnN0IFFT
dHJpbmcgJnVybCwgY29uc3QgUVN0cmluZyAmc3R5bGVzaGVldF9kYXRhKQotewotICAgIENhY2hl
ZE9iamVjdCAqbyA9IGNhY2hlLT5maW5kKHVybCk7Ci0gICAgaWYobykKLSAgICAgICAgcmVtb3Zl
Q2FjaGVFbnRyeShvKTsKLQotICAgIENhY2hlZENTU1N0eWxlU2hlZXQgKnN0eWxlc2hlZXQgPSBu
ZXcgQ2FjaGVkQ1NTU3R5bGVTaGVldCh1cmwsIHN0eWxlc2hlZXRfZGF0YSk7Ci0gICAgY2FjaGUt
Pmluc2VydCggdXJsLCBzdHlsZXNoZWV0ICk7Ci19Ci0KLUNhY2hlZFNjcmlwdCAqQ2FjaGU6OnJl
cXVlc3RTY3JpcHQoIERvY0xvYWRlciogZGwsIGNvbnN0IERPTTo6RE9NU3RyaW5nICZ1cmwsIGJv
b2wgcmVsb2FkLCB0aW1lX3QgX2V4cGlyZURhdGUsIGNvbnN0IFFTdHJpbmcmIGNoYXJzZXQpCi17
Ci0gICAgLy8gdGhpcyBicmluZ3MgdGhlIF91cmwgdG8gYSBzdGFuZGFyZCBmb3JtLi4uCi0gICAg
S1VSTCBrdXJsOwotICAgIEtJTzo6Q2FjaGVDb250cm9sIGNhY2hlUG9saWN5OwotICAgIGlmICgg
ZGwgKQotICAgIHsKLSAgICAgICAga3VybCA9IGRsLT5tX2RvYy0+Y29tcGxldGVVUkwoIHVybC5x
c3RyaW5nKCkgKTsKLSAgICAgICAgY2FjaGVQb2xpY3kgPSBkbC0+Y2FjaGVQb2xpY3koKTsKLSAg
ICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAga3VybCA9IHVybC5xc3RyaW5nKCk7Ci0gICAg
ICAgIGNhY2hlUG9saWN5ID0gS0lPOjpDQ19WZXJpZnk7Ci0gICAgfQotCi0gICAgLy8gQ2hlY2tp
bmcgaWYgdGhlIFVSTCBpcyBtYWxmb3JtZWQgaXMgbG90cyBvZiBleHRyYSB3b3JrIGZvciBsaXR0
bGUgYmVuZWZpdC4KLQotICAgIENhY2hlZE9iamVjdCAqbyA9IGNhY2hlLT5maW5kKGt1cmwudXJs
KCkpOwotICAgIGlmKCFvKQotICAgIHsKLSNpZmRlZiBDQUNIRV9ERUJVRwotICAgICAgICBrZERl
YnVnKCA2MDYwICkgPDwgIkNhY2hlOiBuZXc6ICIgPDwga3VybC51cmwoKSA8PCBlbmRsOwotI2Vu
ZGlmCi0gICAgICAgIENhY2hlZFNjcmlwdCAqc2NyaXB0ID0gbmV3IENhY2hlZFNjcmlwdChkbCwg
a3VybC51cmwoKSwgY2FjaGVQb2xpY3ksIF9leHBpcmVEYXRlLCBjaGFyc2V0KTsKLSAgICAgICAg
aWYgKGNhY2hlRGlzYWJsZWQpCi0gICAgICAgICAgICBzY3JpcHQtPnNldEZyZWUodHJ1ZSk7Ci0g
ICAgICAgIGVsc2UgewotICAgICAgICBjYWNoZS0+aW5zZXJ0KCBrdXJsLnVybCgpLCBzY3JpcHQg
KTsKLSAgICAgICAgbW92ZVRvSGVhZE9mTFJVTGlzdChzY3JpcHQpOwotICAgICAgICB9Ci0gICAg
ICAgIG8gPSBzY3JpcHQ7Ci0gICAgfQotCi0gICAgCi0gICAgaWYoIShvLT50eXBlKCkgPT0gQ2Fj
aGVkT2JqZWN0OjpTY3JpcHQpKQotICAgIHsKLSNpZmRlZiBDQUNIRV9ERUJVRwotICAgICAgICBr
ZERlYnVnKCA2MDYwICkgPDwgIkNhY2hlOjpJbnRlcm5hbCBFcnJvciBpbiByZXF1ZXN0U2NyaXB0
IHVybD0iIDw8IGt1cmwudXJsKCkgPDwgIiEiIDw8IGVuZGw7Ci0jZW5kaWYKLSAgICAgICAgcmV0
dXJuIDA7Ci0gICAgfQotICAgIAotICAgIAotI2lmZGVmIENBQ0hFX0RFQlVHCi0gICAgaWYoIG8t
PnN0YXR1cygpID09IENhY2hlZE9iamVjdDo6UGVuZGluZyApCi0gICAgICAgIGtkRGVidWcoIDYw
NjAgKSA8PCAiQ2FjaGU6IGxvYWRpbmcgaW4gcHJvZ3Jlc3M6ICIgPDwga3VybC51cmwoKSA8PCBl
bmRsOwotICAgIGVsc2UKLSAgICAgICAga2REZWJ1ZyggNjA2MCApIDw8ICJDYWNoZTogdXNpbmcg
Y2FjaGVkOiAiIDw8IGt1cmwudXJsKCkgPDwgZW5kbDsKLSNlbmRpZgotCi0gICAgbW92ZVRvSGVh
ZE9mTFJVTGlzdChvKTsKLSAgICBpZiAoIGRsICkgewotICAgICAgICBkbC0+bV9kb2NPYmplY3Rz
LnJlbW92ZSggbyApOwotICAgICAgICBpZiAoIWNhY2hlRGlzYWJsZWQpCi0gICAgICAgIGRsLT5t
X2RvY09iamVjdHMuYXBwZW5kKCBvICk7Ci0gICAgfQotICAgIHJldHVybiBzdGF0aWNfY2FzdDxD
YWNoZWRTY3JpcHQgKj4obyk7Ci19Ci0KLXZvaWQgQ2FjaGU6OnByZWxvYWRTY3JpcHQoIGNvbnN0
IFFTdHJpbmcgJnVybCwgY29uc3QgUVN0cmluZyAmc2NyaXB0X2RhdGEpCi17Ci0gICAgQ2FjaGVk
T2JqZWN0ICpvID0gY2FjaGUtPmZpbmQodXJsKTsKLSAgICBpZihvKQotICAgICAgICByZW1vdmVD
YWNoZUVudHJ5KG8pOwotCi0gICAgQ2FjaGVkU2NyaXB0ICpzY3JpcHQgPSBuZXcgQ2FjaGVkU2Ny
aXB0KHVybCwgc2NyaXB0X2RhdGEpOwotICAgIGNhY2hlLT5pbnNlcnQoIHVybCwgc2NyaXB0ICk7
Ci19Ci0KLSNpZmRlZiBLSFRNTF9YU0xUCi1DYWNoZWRYU0xTdHlsZVNoZWV0KiBDYWNoZTo6cmVx
dWVzdFhTTFN0eWxlU2hlZXQoRG9jTG9hZGVyKiBkbCwgY29uc3QgRE9NU3RyaW5nICYgdXJsLCBi
b29sIHJlbG9hZCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgdGltZV90IF9leHBpcmVEYXRlKQotewotICAgIC8vIHRoaXMgYnJpbmdzIHRoZSBfdXJs
IHRvIGEgc3RhbmRhcmQgZm9ybS4uLgotICAgIEtVUkwga3VybDsKLSAgICBLSU86OkNhY2hlQ29u
dHJvbCBjYWNoZVBvbGljeTsKLSAgICBpZiAoZGwpIHsKLSAgICAgICAga3VybCA9IGRsLT5tX2Rv
Yy0+Y29tcGxldGVVUkwodXJsLnFzdHJpbmcoKSk7Ci0gICAgICAgIGNhY2hlUG9saWN5ID0gZGwt
PmNhY2hlUG9saWN5KCk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBrdXJsID0gdXJsLnFz
dHJpbmcoKTsKLSAgICAgICAgY2FjaGVQb2xpY3kgPSBLSU86OkNDX1ZlcmlmeTsKLSAgICB9Ci0g
ICAgCi0gICAgLy8gQ2hlY2tpbmcgaWYgdGhlIFVSTCBpcyBtYWxmb3JtZWQgaXMgbG90cyBvZiBl
eHRyYSB3b3JrIGZvciBsaXR0bGUgYmVuZWZpdC4KLSAgICAKLSAgICBDYWNoZWRPYmplY3QgKm8g
PSBjYWNoZS0+ZmluZChrdXJsLnVybCgpKTsKLSAgICBpZiAoIW8pIHsKLSNpZmRlZiBDQUNIRV9E
RUJVRwotICAgICAgICBrZERlYnVnKCA2MDYwICkgPDwgIkNhY2hlOiBuZXc6ICIgPDwga3VybC51
cmwoKSA8PCBlbmRsOwotI2VuZGlmCi0gICAgICAgIENhY2hlZFhTTFN0eWxlU2hlZXQqIGRvYyA9
IG5ldyBDYWNoZWRYU0xTdHlsZVNoZWV0KGRsLCBrdXJsLnVybCgpLCBjYWNoZVBvbGljeSwgX2V4
cGlyZURhdGUpOwotICAgICAgICBpZiAoY2FjaGVEaXNhYmxlZCkKLSAgICAgICAgICAgIGRvYy0+
c2V0RnJlZSh0cnVlKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBjYWNoZS0+aW5zZXJ0
KGt1cmwudXJsKCksIGRvYyk7Ci0gICAgICAgICAgICBtb3ZlVG9IZWFkT2ZMUlVMaXN0KGRvYyk7
Ci0gICAgICAgIH0KLSAgICAgICAgbyA9IGRvYzsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgaWYg
KG8tPnR5cGUoKSAhPSBDYWNoZWRPYmplY3Q6OlhTTFN0eWxlU2hlZXQpIHsKLSNpZmRlZiBDQUNI
RV9ERUJVRwotICAgICAgICBrZERlYnVnKCA2MDYwICkgPDwgIkNhY2hlOjpJbnRlcm5hbCBFcnJv
ciBpbiByZXF1ZXN0WFNMU3R5bGVTaGVldCB1cmw9IiA8PCBrdXJsLnVybCgpIDw8ICIhIiA8PCBl
bmRsOwotI2VuZGlmCi0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICAKLSNpZmRlZiBDQUNI
RV9ERUJVRwotICAgIGlmIChvLT5zdGF0dXMoKSA9PSBDYWNoZWRPYmplY3Q6OlBlbmRpbmcpCi0g
ICAgICAgIGtkRGVidWcoIDYwNjAgKSA8PCAiQ2FjaGU6IGxvYWRpbmcgaW4gcHJvZ3Jlc3M6ICIg
PDwga3VybC51cmwoKSA8PCBlbmRsOwotICAgIGVsc2UKLSAgICAgICAga2REZWJ1ZyggNjA2MCAp
IDw8ICJDYWNoZTogdXNpbmcgY2FjaGVkOiAiIDw8IGt1cmwudXJsKCkgPDwgZW5kbDsKLSNlbmRp
ZgotICAgIAotICAgIG1vdmVUb0hlYWRPZkxSVUxpc3Qobyk7Ci0gICAgaWYgKGRsKSB7Ci0gICAg
ICAgIGRsLT5tX2RvY09iamVjdHMucmVtb3ZlKCBvICk7Ci0gICAgICAgIGlmICghY2FjaGVEaXNh
YmxlZCkKLSAgICAgICAgICAgIGRsLT5tX2RvY09iamVjdHMuYXBwZW5kKCBvICk7Ci0gICAgfQot
ICAgIHJldHVybiBzdGF0aWNfY2FzdDxDYWNoZWRYU0xTdHlsZVNoZWV0Kj4obyk7Ci19Ci0jZW5k
aWYKLQotI2lmbmRlZiBLSFRNTF9OT19YQkwKLUNhY2hlZFhCTERvY3VtZW50KiBDYWNoZTo6cmVx
dWVzdFhCTERvY3VtZW50KERvY0xvYWRlciogZGwsIGNvbnN0IERPTVN0cmluZyAmIHVybCwgYm9v
bCByZWxvYWQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
dGltZV90IF9leHBpcmVEYXRlKQotewotICAgIC8vIHRoaXMgYnJpbmdzIHRoZSBfdXJsIHRvIGEg
c3RhbmRhcmQgZm9ybS4uLgotICAgIEtVUkwga3VybDsKLSAgICBLSU86OkNhY2hlQ29udHJvbCBj
YWNoZVBvbGljeTsKLSAgICBpZiAoZGwpIHsKLSAgICAgICAga3VybCA9IGRsLT5tX2RvYy0+Y29t
cGxldGVVUkwodXJsLnFzdHJpbmcoKSk7Ci0gICAgICAgIGNhY2hlUG9saWN5ID0gZGwtPmNhY2hl
UG9saWN5KCk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBrdXJsID0gdXJsLnFzdHJpbmco
KTsKLSAgICAgICAgY2FjaGVQb2xpY3kgPSBLSU86OkNDX1ZlcmlmeTsKLSAgICB9Ci0gICAgCi0g
ICAgLy8gQ2hlY2tpbmcgaWYgdGhlIFVSTCBpcyBtYWxmb3JtZWQgaXMgbG90cyBvZiBleHRyYSB3
b3JrIGZvciBsaXR0bGUgYmVuZWZpdC4KLSAgICAKLSAgICBDYWNoZWRPYmplY3QgKm8gPSBjYWNo
ZS0+ZmluZChrdXJsLnVybCgpKTsKLSAgICBpZighbykKLSAgICB7Ci0jaWZkZWYgQ0FDSEVfREVC
VUcKLSAgICAgICAga2REZWJ1ZyggNjA2MCApIDw8ICJDYWNoZTogbmV3OiAiIDw8IGt1cmwudXJs
KCkgPDwgZW5kbDsKLSNlbmRpZgotICAgICAgICBDYWNoZWRYQkxEb2N1bWVudCogZG9jID0gbmV3
IENhY2hlZFhCTERvY3VtZW50KGRsLCBrdXJsLnVybCgpLCBjYWNoZVBvbGljeSwgX2V4cGlyZURh
dGUpOwotICAgICAgICBpZiAoY2FjaGVEaXNhYmxlZCkKLSAgICAgICAgICAgIGRvYy0+c2V0RnJl
ZSh0cnVlKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBjYWNoZS0+aW5zZXJ0KGt1cmwu
dXJsKCksIGRvYyk7Ci0gICAgICAgICAgICBtb3ZlVG9IZWFkT2ZMUlVMaXN0KGRvYyk7Ci0gICAg
ICAgIH0KLSAgICAgICAgbyA9IGRvYzsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgaWYoby0+dHlw
ZSgpICE9IENhY2hlZE9iamVjdDo6WEJMKQotICAgIHsKLSNpZmRlZiBDQUNIRV9ERUJVRwotICAg
ICAgICBrZERlYnVnKCA2MDYwICkgPDwgIkNhY2hlOjpJbnRlcm5hbCBFcnJvciBpbiByZXF1ZXN0
WEJMRG9jdW1lbnQgdXJsPSIgPDwga3VybC51cmwoKSA8PCAiISIgPDwgZW5kbDsKLSNlbmRpZgot
ICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgCi0jaWZkZWYgQ0FDSEVfREVCVUcKLSAgICBp
Ziggby0+c3RhdHVzKCkgPT0gQ2FjaGVkT2JqZWN0OjpQZW5kaW5nICkKLSAgICAgICAga2REZWJ1
ZyggNjA2MCApIDw8ICJDYWNoZTogbG9hZGluZyBpbiBwcm9ncmVzczogIiA8PCBrdXJsLnVybCgp
IDw8IGVuZGw7Ci0gICAgZWxzZQotICAgICAgICBrZERlYnVnKCA2MDYwICkgPDwgIkNhY2hlOiB1
c2luZyBjYWNoZWQ6ICIgPDwga3VybC51cmwoKSA8PCBlbmRsOwotI2VuZGlmCi0gICAgCi0gICAg
bW92ZVRvSGVhZE9mTFJVTGlzdChvKTsKLSAgICBpZiAoIGRsICkgewotICAgICAgICBkbC0+bV9k
b2NPYmplY3RzLnJlbW92ZSggbyApOwotICAgICAgICBpZiAoIWNhY2hlRGlzYWJsZWQpCi0gICAg
ICAgICAgICBkbC0+bV9kb2NPYmplY3RzLmFwcGVuZCggbyApOwotICAgIH0KLSAgICByZXR1cm4g
c3RhdGljX2Nhc3Q8Q2FjaGVkWEJMRG9jdW1lbnQqPihvKTsKLX0KLSNlbmRpZgotCi12b2lkIENh
Y2hlOjpmbHVzaChib29sIGZvcmNlKQotewotICAgIGlmIChmb3JjZSkKLSAgICAgICBmbHVzaENv
dW50ID0gMDsKLSAgICAvLyBEb24ndCBmbHVzaCBmb3IgZXZlcnkgaW1hZ2UuCi0gICAgaWYgKG1f
Y291bnRPZkxSVUFuZFVuY2FjaGVhYmxlTGlzdHMgPCBmbHVzaENvdW50KQotICAgICAgIHJldHVy
bjsKLQotICAgIGluaXQoKTsKLQotICAgIHdoaWxlIChtX2hlYWRPZlVuY2FjaGVhYmxlTGlzdCkK
LSAgICAgICAgcmVtb3ZlQ2FjaGVFbnRyeShtX2hlYWRPZlVuY2FjaGVhYmxlTGlzdCk7Ci0KLSAg
ICBmb3IgKGludCBpID0gTUFYX0xSVV9MSVNUUy0xOyBpPj0wOyBpLS0pIHsKLSAgICAgICAgaWYg
KG1fdG90YWxTaXplT2ZMUlVMaXN0cyA8PSBtYXhTaXplKQotICAgICAgICAgICAgYnJlYWs7Ci0g
ICAgICAgICAgICAKLSAgICAgICAgd2hpbGUgKG1fdG90YWxTaXplT2ZMUlVMaXN0cyA+IG1heFNp
emUgJiYgbV9MUlVMaXN0c1tpXS5tX3RhaWwpCi0gICAgICAgICAgICByZW1vdmVDYWNoZUVudHJ5
KG1fTFJVTGlzdHNbaV0ubV90YWlsKTsKLSAgICB9Ci0KLSAgICBmbHVzaENvdW50ID0gbV9jb3Vu
dE9mTFJVQW5kVW5jYWNoZWFibGVMaXN0cysxMDsgLy8gRmx1c2ggYWdhaW4gd2hlbiB0aGUgY2Fj
aGUgaGFzIGdyb3duLgotfQotCi0KLXZvaWQgQ2FjaGU6OnNldFNpemUoIGludCBieXRlcyApCi17
Ci0gICAgbWF4U2l6ZSA9IGJ5dGVzOwotICAgIG1heENhY2hlYWJsZSA9IGtNYXgobWF4U2l6ZSAv
IDEyOCwgTUFYQ0FDSEVBQkxFKTsKLQotICAgIC8vIG1heSBiZSB3ZSBuZWVkIHRvIGNsZWFyIHBh
cnRzIG9mIHRoZSBjYWNoZQotICAgIGZsdXNoQ291bnQgPSAwOwotICAgIGZsdXNoKHRydWUpOwot
fQotCi12b2lkIENhY2hlOjpyZW1vdmVDYWNoZUVudHJ5KCBDYWNoZWRPYmplY3QgKm9iamVjdCAp
Ci17Ci0gIFFTdHJpbmcga2V5ID0gb2JqZWN0LT51cmwoKS5xc3RyaW5nKCk7Ci0KLSAgLy8gdGhp
cyBpbmRpY2F0ZXMgdGhlIGRlcmVmKCkgbWV0aG9kIG9mIENhY2hlZE9iamVjdCB0byBkZWxldGUg
aXRzZWxmIHdoZW4gdGhlIHJlZmVyZW5jZSBjb3VudGVyCi0gIC8vIGRyb3BzIGRvd24gdG8gemVy
bwotICBvYmplY3QtPnNldEZyZWUoIHRydWUgKTsKLQotICBjYWNoZS0+cmVtb3ZlKCBrZXkgKTsK
LSAgcmVtb3ZlRnJvbUxSVUxpc3Qob2JqZWN0KTsKLQotICBjb25zdCBEb2NMb2FkZXIqIGRsOwot
ICBmb3IgKCBkbD1kb2Nsb2FkZXItPmZpcnN0KCk7IGRsOyBkbD1kb2Nsb2FkZXItPm5leHQoKSAp
Ci0gICAgICBkbC0+cmVtb3ZlQ2FjaGVkT2JqZWN0KCBvYmplY3QgKTsKLQotICBpZiAoIG9iamVj
dC0+Y2FuRGVsZXRlKCkgKQotICAgICBkZWxldGUgb2JqZWN0OwotfQotCi0jZGVmaW5lIEZBU1Rf
TE9HMihfbG9nMixfbikgICBcCi0gICAgICB1bnNpZ25lZCBpbnQgal8gPSAodW5zaWduZWQgaW50
KShfbik7ICAgXAotICAgICAgKF9sb2cyKSA9IDA7ICAgICAgICAgICAgICAgICAgICBcCi0gICAg
ICBpZiAoKGpfKSAmICgoal8pLTEpKSAgICAgICAgICAgIFwKLSAgICAgIChfbG9nMikgKz0gMTsg
ICAgICAgICAgICAgICBcCi0gICAgICBpZiAoKGpfKSA+PiAxNikgICAgICAgICAgICAgICAgIFwK
LSAgICAgIChfbG9nMikgKz0gMTYsIChqXykgPj49IDE2OyBcCi0gICAgICBpZiAoKGpfKSA+PiA4
KSAgICAgICAgICAgICAgICAgIFwKLSAgICAgIChfbG9nMikgKz0gOCwgKGpfKSA+Pj0gODsgICBc
Ci0gICAgICBpZiAoKGpfKSA+PiA0KSAgICAgICAgICAgICAgICAgIFwKLSAgICAgIChfbG9nMikg
Kz0gNCwgKGpfKSA+Pj0gNDsgICBcCi0gICAgICBpZiAoKGpfKSA+PiAyKSAgICAgICAgICAgICAg
ICAgIFwKLSAgICAgIChfbG9nMikgKz0gMiwgKGpfKSA+Pj0gMjsgICBcCi0gICAgICBpZiAoKGpf
KSA+PiAxKSAgICAgICAgICAgICAgICAgIFwKLSAgICAgIChfbG9nMikgKz0gMTsKLQotaW50IEZh
c3RMb2cyKHVuc2lnbmVkIGludCBpKSB7Ci0gICAgaW50IGxvZzI7Ci0gICAgRkFTVF9MT0cyKGxv
ZzIsaSk7Ci0gICAgcmV0dXJuIGxvZzI7Ci19Ci0KLUxSVUxpc3QqIENhY2hlOjpnZXRMUlVMaXN0
Rm9yKENhY2hlZE9iamVjdCogbykKLXsKLSAgICBpbnQgYWNjZXNzQ291bnQgPSBvLT5hY2Nlc3ND
b3VudCgpOwotICAgIGludCBxdWV1ZUluZGV4OwotICAgIGlmIChhY2Nlc3NDb3VudCA9PSAwKSB7
Ci0gICAgICAgIHF1ZXVlSW5kZXggPSAwOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGludCBzaXpl
TG9nID0gRmFzdExvZzIoby0+c2l6ZSgpKTsKLSAgICAgICAgcXVldWVJbmRleCA9IHNpemVMb2cv
by0+YWNjZXNzQ291bnQoKSAtIDE7Ci0gICAgICAgIGlmIChxdWV1ZUluZGV4IDwgMCkKLSAgICAg
ICAgICAgIHF1ZXVlSW5kZXggPSAwOwotICAgICAgICBpZiAocXVldWVJbmRleCA+PSBNQVhfTFJV
X0xJU1RTKQotICAgICAgICAgICAgcXVldWVJbmRleCA9IE1BWF9MUlVfTElTVFMtMTsKLSAgICB9
Ci0gICAgaWYgKG1fTFJVTGlzdHMgPT0gMCkgewotICAgICAgICBtX0xSVUxpc3RzID0gbmV3IExS
VUxpc3QgW01BWF9MUlVfTElTVFNdOwotICAgIH0KLSAgICByZXR1cm4gJm1fTFJVTGlzdHNbcXVl
dWVJbmRleF07Ci19Ci0KLXZvaWQgQ2FjaGU6OnJlbW92ZUZyb21MUlVMaXN0KENhY2hlZE9iamVj
dCAqb2JqZWN0KQotewotICAgIENhY2hlZE9iamVjdCAqbmV4dCA9IG9iamVjdC0+bV9uZXh0SW5M
UlVMaXN0OwotICAgIENhY2hlZE9iamVjdCAqcHJldiA9IG9iamVjdC0+bV9wcmV2SW5MUlVMaXN0
OwotICAgIGJvb2wgdW5jYWNoZWFibGUgPSBvYmplY3QtPnN0YXR1cygpID09IENhY2hlZE9iamVj
dDo6VW5jYWNoZWFibGU7Ci0gICAgCi0gICAgTFJVTGlzdCogbGlzdCA9IHVuY2FjaGVhYmxlID8g
MCA6IGdldExSVUxpc3RGb3Iob2JqZWN0KTsKLSAgICBDYWNoZWRPYmplY3QgKiZoZWFkID0gdW5j
YWNoZWFibGUgPyBtX2hlYWRPZlVuY2FjaGVhYmxlTGlzdCA6IGxpc3QtPm1faGVhZDsKLSAgICAK
LSAgICBpZiAobmV4dCA9PSAwICYmIHByZXYgPT0gMCAmJiBoZWFkICE9IG9iamVjdCkgewotICAg
ICAgICByZXR1cm47Ci0gICAgfQotICAgIAotICAgIG9iamVjdC0+bV9uZXh0SW5MUlVMaXN0ID0g
MDsKLSAgICBvYmplY3QtPm1fcHJldkluTFJVTGlzdCA9IDA7Ci0gICAgCi0gICAgaWYgKG5leHQp
Ci0gICAgICAgIG5leHQtPm1fcHJldkluTFJVTGlzdCA9IHByZXY7Ci0gICAgZWxzZSBpZiAoIXVu
Y2FjaGVhYmxlICYmIGxpc3QtPm1fdGFpbCA9PSBvYmplY3QpCi0gICAgICAgIGxpc3QtPm1fdGFp
bCA9IHByZXY7Ci0KLSAgICBpZiAocHJldikKLSAgICAgICAgcHJldi0+bV9uZXh0SW5MUlVMaXN0
ID0gbmV4dDsKLSAgICBlbHNlIGlmIChoZWFkID09IG9iamVjdCkKLSAgICAgICAgaGVhZCA9IG5l
eHQ7Ci0gICAgCi0gICAgLS1tX2NvdW50T2ZMUlVBbmRVbmNhY2hlYWJsZUxpc3RzOwotICAgIAot
ICAgIGlmICghdW5jYWNoZWFibGUpCi0gICAgICAgIG1fdG90YWxTaXplT2ZMUlVMaXN0cyAtPSBv
YmplY3QtPnNpemUoKTsKLX0KLQotdm9pZCBDYWNoZTo6bW92ZVRvSGVhZE9mTFJVTGlzdChDYWNo
ZWRPYmplY3QgKm9iamVjdCkKLXsKLSAgICBpbnNlcnRJbkxSVUxpc3Qob2JqZWN0KTsKLX0KLQot
dm9pZCBDYWNoZTo6aW5zZXJ0SW5MUlVMaXN0KENhY2hlZE9iamVjdCAqb2JqZWN0KQotewotICAg
IHJlbW92ZUZyb21MUlVMaXN0KG9iamVjdCk7Ci0gICAgCi0gICAgaWYgKCFvYmplY3QtPmFsbG93
SW5MUlVMaXN0KCkpCi0gICAgICAgIHJldHVybjsKLSAgICAKLSAgICBMUlVMaXN0KiBsaXN0ID0g
Z2V0TFJVTGlzdEZvcihvYmplY3QpOwotICAgIAotICAgIGJvb2wgdW5jYWNoZWFibGUgPSBvYmpl
Y3QtPnN0YXR1cygpID09IENhY2hlZE9iamVjdDo6VW5jYWNoZWFibGU7Ci0gICAgQ2FjaGVkT2Jq
ZWN0IComaGVhZCA9IHVuY2FjaGVhYmxlID8gbV9oZWFkT2ZVbmNhY2hlYWJsZUxpc3QgOiBsaXN0
LT5tX2hlYWQ7Ci0KLSAgICBvYmplY3QtPm1fbmV4dEluTFJVTGlzdCA9IGhlYWQ7Ci0gICAgaWYg
KGhlYWQpCi0gICAgICAgIGhlYWQtPm1fcHJldkluTFJVTGlzdCA9IG9iamVjdDsKLSAgICBoZWFk
ID0gb2JqZWN0OwotICAgIAotICAgIGlmIChvYmplY3QtPm1fbmV4dEluTFJVTGlzdCA9PSAwICYm
ICF1bmNhY2hlYWJsZSkKLSAgICAgICAgbGlzdC0+bV90YWlsID0gb2JqZWN0OwotICAgIAotICAg
ICsrbV9jb3VudE9mTFJVQW5kVW5jYWNoZWFibGVMaXN0czsKLSAgICAKLSAgICBpZiAoIXVuY2Fj
aGVhYmxlKQotICAgICAgICBtX3RvdGFsU2l6ZU9mTFJVTGlzdHMgKz0gb2JqZWN0LT5zaXplKCk7
Ci19Ci0KLWJvb2wgQ2FjaGU6OmFkanVzdFNpemUoQ2FjaGVkT2JqZWN0ICpvYmplY3QsIGludCBk
ZWx0YSkKLXsKLSAgICBpZiAob2JqZWN0LT5zdGF0dXMoKSA9PSBDYWNoZWRPYmplY3Q6OlVuY2Fj
aGVhYmxlKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAob2JqZWN0LT5tX25leHRJ
bkxSVUxpc3QgPT0gMCAmJiBvYmplY3QtPm1fcHJldkluTFJVTGlzdCA9PSAwICYmCi0gICAgICAg
IGdldExSVUxpc3RGb3Iob2JqZWN0KS0+bV9oZWFkICE9IG9iamVjdCkKLSAgICAgICAgcmV0dXJu
IGZhbHNlOwotICAgIAotICAgIG1fdG90YWxTaXplT2ZMUlVMaXN0cyArPSBkZWx0YTsKLSAgICBy
ZXR1cm4gZGVsdGEgIT0gMDsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0KLQotQ2FjaGVkT2JqZWN0Q2xpZW50ICpDYWNoZWRPYmplY3RDbGllbnRXYWxrZXI6
Om5leHQoKQotewotICAgIC8vIE9ubHkgYWR2YW5jZSBpZiB3ZSBhbHJlYWR5IHJldHVybmVkIHRo
aXMgaXRlbS4KLSAgICAvLyBUaGlzIGhhbmRsZXMgY2FzZXMgd2hlcmUgdGhlIGN1cnJlbnQgaXRl
bSBpcyByZW1vdmVkLCBhbmQgcHJldmVudHMgdXMgZnJvbSBza2lwcGluZyB0aGUgbmV4dCBpdGVt
LgotICAgIC8vIFRoZSBpdGVyYXRvciBhdXRvbWF0aWNhbGx5IGdldHMgYWR2YW5jZWQgdG8gdGhl
IG5leHQgaXRlbSwgYW5kIHdlIG1ha2Ugc3VyZSB3ZSByZXR1cm4gaXQuCi0gICAgaWYgKF9jdXJy
ZW50ID09IF9pdGVyYXRvci5jdXJyZW50KCkpCi0gICAgICAgICsrX2l0ZXJhdG9yOwotICAgIF9j
dXJyZW50ID0gX2l0ZXJhdG9yLmN1cnJlbnQoKTsKLSAgICByZXR1cm4gX2N1cnJlbnQ7Ci19Ci0K
LS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUNhY2hlZE9iamVj
dENsaWVudDo6fkNhY2hlZE9iamVjdENsaWVudCgpIHsgfQotdm9pZCBDYWNoZWRPYmplY3RDbGll
bnQ6OnNldFBpeG1hcChjb25zdCBRUGl4bWFwICYsIGNvbnN0IFFSZWN0JiwgQ2FjaGVkSW1hZ2Ug
Kikge30KLXZvaWQgQ2FjaGVkT2JqZWN0Q2xpZW50OjpzZXRTdHlsZVNoZWV0KGNvbnN0IERPTTo6
RE9NU3RyaW5nICYvKnVybCovLCBjb25zdCBET006OkRPTVN0cmluZyAmLypzaGVldCovKSB7fQot
I2lmbmRlZiBLSFRNTF9OT19YQkwKLXZvaWQgQ2FjaGVkT2JqZWN0Q2xpZW50OjpzZXRYQkxEb2N1
bWVudChjb25zdCBET006OkRPTVN0cmluZyYgdXJsLCBYQkw6OlhCTERvY3VtZW50SW1wbCogZG9j
KSB7fQotI2VuZGlmCi12b2lkIENhY2hlZE9iamVjdENsaWVudDo6bm90aWZ5RmluaXNoZWQoQ2Fj
aGVkT2JqZWN0ICogLypmaW5pc2hlZE9iaiovKSB7fQotCi1DYWNoZTo6U3RhdGlzdGljcyBDYWNo
ZTo6Z2V0U3RhdGlzdGljcygpCi17Ci0gICAgU3RhdGlzdGljcyBzdGF0czsKLQotICAgIGlmICgh
Y2FjaGUpCi0gICAgICAgIHJldHVybiBzdGF0czsKLQotICAgIFFEaWN0SXRlcmF0b3I8Q2FjaGVk
T2JqZWN0PiBpKCpjYWNoZSk7Ci0gICAgZm9yIChpLnRvRmlyc3QoKTsgaS5jdXJyZW50KCk7ICsr
aSkgewotICAgICAgICBDYWNoZWRPYmplY3QgKm8gPSBpLmN1cnJlbnQoKTsKLSAgICAgICAgc3dp
dGNoIChvLT50eXBlKCkpIHsKLSAgICAgICAgICAgIGNhc2UgQ2FjaGVkT2JqZWN0OjpJbWFnZToK
LSAgICAgICAgICAgICAgICBzdGF0cy5pbWFnZXMuY291bnQrKzsKLSAgICAgICAgICAgICAgICBz
dGF0cy5pbWFnZXMuc2l6ZSArPSBvLT5zaXplKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0K
LSAgICAgICAgICAgIGNhc2UgQ2FjaGVkT2JqZWN0OjpDU1NTdHlsZVNoZWV0OgotICAgICAgICAg
ICAgICAgIHN0YXRzLnN0eWxlU2hlZXRzLmNvdW50Kys7Ci0gICAgICAgICAgICAgICAgc3RhdHMu
c3R5bGVTaGVldHMuc2l6ZSArPSBvLT5zaXplKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0K
LSAgICAgICAgICAgIGNhc2UgQ2FjaGVkT2JqZWN0OjpTY3JpcHQ6Ci0gICAgICAgICAgICAgICAg
c3RhdHMuc2NyaXB0cy5jb3VudCsrOwotICAgICAgICAgICAgICAgIHN0YXRzLnNjcmlwdHMuc2l6
ZSArPSBvLT5zaXplKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0jaWZkZWYgS0hUTUxfWFNM
VAotICAgICAgICAgICAgY2FzZSBDYWNoZWRPYmplY3Q6OlhTTFN0eWxlU2hlZXQ6Ci0gICAgICAg
ICAgICAgICAgc3RhdHMueHNsU3R5bGVTaGVldHMuY291bnQrKzsKLSAgICAgICAgICAgICAgICBz
dGF0cy54c2xTdHlsZVNoZWV0cy5zaXplICs9IG8tPnNpemUoKTsKLSAgICAgICAgICAgICAgICBi
cmVhazsKLSNlbmRpZgotI2lmbmRlZiBLSFRNTF9OT19YQkwKLSAgICAgICAgICAgIGNhc2UgQ2Fj
aGVkT2JqZWN0OjpYQkw6Ci0gICAgICAgICAgICAgICAgc3RhdHMueGJsRG9jcy5jb3VudCsrOwot
ICAgICAgICAgICAgICAgIHN0YXRzLnhibERvY3Muc2l6ZSArPSBvLT5zaXplKCk7Ci0gICAgICAg
ICAgICAgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAg
ICAgICAgc3RhdHMub3RoZXIuY291bnQrKzsKLSAgICAgICAgICAgICAgICBzdGF0cy5vdGhlci5z
aXplICs9IG8tPnNpemUoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gc3Rh
dHM7Ci19Ci0KLXZvaWQgQ2FjaGU6OmZsdXNoQWxsKCkKLXsKLSAgICBpZiAoIWNhY2hlKQotICAg
ICAgICByZXR1cm47Ci0KLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIFFEaWN0SXRlcmF0b3I8Q2Fj
aGVkT2JqZWN0PiBpKCpjYWNoZSk7Ci0gICAgICAgIENhY2hlZE9iamVjdCAqbyA9IGkudG9GaXJz
dCgpOwotICAgICAgICBpZiAoIW8pCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgcmVtb3Zl
Q2FjaGVFbnRyeShvKTsKLSAgICB9Ci19Ci0KLXZvaWQgQ2FjaGU6OnNldENhY2hlRGlzYWJsZWQo
Ym9vbCBkaXNhYmxlZCkKLXsKLSAgICBjYWNoZURpc2FibGVkID0gZGlzYWJsZWQ7Ci0gICAgaWYg
KGRpc2FibGVkKQotICAgICAgICBmbHVzaEFsbCgpOwotfQorfTsKXCBObyBuZXdsaW5lIGF0IGVu
ZCBvZiBmaWxlCkluZGV4OiBtaXNjL0NhY2hlZFhCTERvY3VtZW50LmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBtaXNjL0NhY2hlZFhCTERvY3VtZW50LmNwcAkocmV2aXNpb24gMTE5NDgpCisrKyBtaXNjL0Nh
Y2hlZFhCTERvY3VtZW50LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjUsNjAyICsyNSwxNyBAQAog
ICAgIHBhZ2VzIGZyb20gdGhlIHdlYi4gSXQgaGFzIGEgbWVtb3J5IGNhY2hlIGZvciB0aGVzZSBv
YmplY3RzLgogKi8KIAotI3VuZGVmIENBQ0hFX0RFQlVHCi0vLyNkZWZpbmUgQ0FDSEVfREVCVUcK
LSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQotI2luY2x1ZGUgImxv
YWRlci5oIgotCi0vLyB1cCB0byB3aGljaCBzaXplIGlzIGEgcGljdHVyZSBmb3Igc3VyZSBjYWNo
ZWFibGUKLSNkZWZpbmUgTUFYQ0FDSEVBQkxFIDQwKjEwMjQKLS8vIGRlZmF1bHQgY2FjaGUgc2l6
ZQotI2RlZmluZSBERUZDQUNIRVNJWkUgNDA5NioxMDI0Ci0KLSNpbmNsdWRlIDxxYXN5bmNpby5o
PgotI2luY2x1ZGUgPHFwYWludGVyLmg+Ci0KLSNpbmNsdWRlIDxraW8vam9iLmg+Ci0jaW5jbHVk
ZSA8a2lvL2pvYmNsYXNzZXMuaD4KLSNpbmNsdWRlIDxraW1hZ2Vpby5oPgotI2luY2x1ZGUgPGtj
aGFyc2V0cy5oPgotI2luY2x1ZGUgPGtkZWJ1Zy5oPgotI2luY2x1ZGUgImtodG1sX2ZhY3Rvcnku
aCIKLSNpbmNsdWRlICJraHRtbF9wYXJ0LmgiCi0jaW5jbHVkZSAiZGVjb2Rlci5oIgotCi0jaW5j
bHVkZSAiaHRtbC9odG1sX2RvY3VtZW50aW1wbC5oIgotI2luY2x1ZGUgImNzcy9jc3Nfc3R5bGVz
aGVldGltcGwuaCIKKyNpZmRlZiBLSFRNTF9YU0xUCiAKLSNpZm5kZWYgS0hUTUxfTk9fWEJMCi0j
aW5jbHVkZSAieGJsL3hibF9kb2NpbXBsLmgiCi0jZW5kaWYKKyNpbmNsdWRlICJjb25maWcuaCIK
KyNpbmNsdWRlICJDYWNoZWRYU0xTdHlsZVNoZWV0LmgiCisjaW5jbHVkZSAiQ2FjaGUuaCIKIAog
I2luY2x1ZGUgPGt4bWxjb3JlL0Fzc2VydGlvbnMuaD4KLSNpbmNsdWRlICJLV1FMb2FkZXIuaCIK
IAotdXNpbmcgbmFtZXNwYWNlIGtodG1sOwogdXNpbmcgbmFtZXNwYWNlIERPTTsKIAotc3RhdGlj
IGJvb2wgY2FjaGVEaXNhYmxlZDsKLQotLy8gQ2FsbCB0aGlzICJ3YWxrZXIiIGluc3RlYWQgb2Yg
aXRlcmF0b3Igc28gcGVvcGxlIHdvbid0IGV4cGVjdCBRdCBvciBTVEwtc3R5bGUgaXRlcmF0b3Ig
aW50ZXJmYWNlLgotLy8gSnVzdCBrZWVwIGNhbGxpbmcgbmV4dCgpIG9uIHRoaXMuIEl0J3Mgc2Fm
ZSBmcm9tIGRlbGV0aW9ucyBvZiB0aGUgY3VycmVudCBpdGVtCi1jbGFzcyBDYWNoZWRPYmplY3RD
bGllbnRXYWxrZXIgewotcHVibGljOgotICAgIENhY2hlZE9iamVjdENsaWVudFdhbGtlcihjb25z
dCBRUHRyRGljdDxDYWNoZWRPYmplY3RDbGllbnQ+ICZjbGllbnRzKSA6IF9jdXJyZW50KDApLCBf
aXRlcmF0b3IoY2xpZW50cykgeyB9Ci0gICAgQ2FjaGVkT2JqZWN0Q2xpZW50ICpuZXh0KCk7Ci1w
cml2YXRlOgotICAgIENhY2hlZE9iamVjdENsaWVudCAqX2N1cnJlbnQ7Ci0gICAgUVB0ckRpY3RJ
dGVyYXRvcjxDYWNoZWRPYmplY3RDbGllbnQ+IF9pdGVyYXRvcjsKLX07Ci0KLUNhY2hlZE9iamVj
dDo6fkNhY2hlZE9iamVjdCgpCi17Ci0gICAgaWYobV9kZWxldGVkKSBhYm9ydCgpOwotICAgIENh
Y2hlOjpyZW1vdmVGcm9tTFJVTGlzdCh0aGlzKTsKLSAgICBtX2RlbGV0ZWQgPSB0cnVlOwotICAg
IHNldFJlc3BvbnNlKDApOwotICAgIHNldEFsbERhdGEoMCk7Ci19Ci0KLXZvaWQgQ2FjaGVkT2Jq
ZWN0OjpmaW5pc2goKQotewotICAgIGlmIChtX3NpemUgPiBDYWNoZTo6bWF4Q2FjaGVhYmxlT2Jq
ZWN0U2l6ZSgpKQotICAgICAgICBtX3N0YXR1cyA9IFVuY2FjaGVhYmxlOwotICAgIGVsc2UKLSAg
ICAgICAgbV9zdGF0dXMgPSBDYWNoZWQ7Ci0gICAgS1VSTCB1cmwobV91cmwucXN0cmluZygpKTsK
LSAgICBpZiAobV9leHBpcmVEYXRlQ2hhbmdlZCAmJiB1cmwucHJvdG9jb2woKS5zdGFydHNXaXRo
KCJodHRwIikpCi0gICAgICAgIG1fZXhwaXJlRGF0ZUNoYW5nZWQgPSBmYWxzZTsKLX0KLQotdm9p
ZCBDYWNoZWRPYmplY3Q6OnNldEV4cGlyZURhdGUodGltZV90IF9leHBpcmVEYXRlLCBib29sIGNo
YW5nZUh0dHBDYWNoZSkKLXsKLSAgICBpZiAoIF9leHBpcmVEYXRlID09IG1fZXhwaXJlRGF0ZSkK
LSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYgKG1fc3RhdHVzID09IFVuY2FjaGVhYmxlIHx8IG1f
c3RhdHVzID09IENhY2hlZCkKLSAgICB7Ci0gICAgICAgIGZpbmlzaCgpOwotICAgIH0KLSAgICBt
X2V4cGlyZURhdGUgPSBfZXhwaXJlRGF0ZTsKLSAgICBpZiAoY2hhbmdlSHR0cENhY2hlICYmIG1f
ZXhwaXJlRGF0ZSkKLSAgICAgICBtX2V4cGlyZURhdGVDaGFuZ2VkID0gdHJ1ZTsKLX0KLQotYm9v
bCBDYWNoZWRPYmplY3Q6OmlzRXhwaXJlZCgpIGNvbnN0Ci17Ci0gICAgaWYgKCFtX2V4cGlyZURh
dGUpIHJldHVybiBmYWxzZTsKLSAgICB0aW1lX3Qgbm93ID0gdGltZSgwKTsKLSAgICByZXR1cm4g
KGRpZmZ0aW1lKG5vdywgbV9leHBpcmVEYXRlKSA+PSAwKTsKLX0KLQotdm9pZCBDYWNoZWRPYmpl
Y3Q6OnNldFJlcXVlc3QoUmVxdWVzdCAqX3JlcXVlc3QpCi17Ci0gICAgaWYgKCBfcmVxdWVzdCAm
JiAhbV9yZXF1ZXN0ICkKLSAgICAgICAgbV9zdGF0dXMgPSBQZW5kaW5nOwotICAgIG1fcmVxdWVz
dCA9IF9yZXF1ZXN0OwotICAgIGlmIChjYW5EZWxldGUoKSAmJiBtX2ZyZWUpCi0gICAgICAgIGRl
bGV0ZSB0aGlzOwotICAgIGVsc2UgaWYgKGFsbG93SW5MUlVMaXN0KCkpCi0gICAgICAgIENhY2hl
OjppbnNlcnRJbkxSVUxpc3QodGhpcyk7Ci19Ci0KLXZvaWQgQ2FjaGVkT2JqZWN0OjpyZWYoQ2Fj
aGVkT2JqZWN0Q2xpZW50ICpjKQotewotICAgIG1fY2xpZW50cy5pbnNlcnQoYywgYyk7Ci0gICAg
Q2FjaGU6OnJlbW92ZUZyb21MUlVMaXN0KHRoaXMpOwotICAgIGluY3JlYXNlQWNjZXNzQ291bnQo
KTsKLX0KLQotdm9pZCBDYWNoZWRPYmplY3Q6OmRlcmVmKENhY2hlZE9iamVjdENsaWVudCAqYykK
LXsKLSAgICBtX2NsaWVudHMucmVtb3ZlKGMpOwotICAgIGlmIChhbGxvd0luTFJVTGlzdCgpKQot
ICAgICAgICBDYWNoZTo6aW5zZXJ0SW5MUlVMaXN0KHRoaXMpOwotfQotCi12b2lkIENhY2hlZE9i
amVjdDo6c2V0U2l6ZShpbnQgc2l6ZSkKLXsKLSAgICBib29sIHNpemVDaGFuZ2VkID0gQ2FjaGU6
OmFkanVzdFNpemUodGhpcywgc2l6ZSAtIG1fc2l6ZSk7Ci0KLSAgICAvLyBUaGUgb2JqZWN0IG11
c3Qgbm93IGJlIG1vdmVkIHRvIGEgZGlmZmVyZW50IHF1ZXVlLCBzaW5jZSBpdHMgc2l6ZSBoYXMg
YmVlbiBjaGFuZ2VkLgotICAgIGlmIChzaXplQ2hhbmdlZCAmJiBhbGxvd0luTFJVTGlzdCgpKQot
ICAgICAgICBDYWNoZTo6cmVtb3ZlRnJvbUxSVUxpc3QodGhpcyk7Ci0KLSAgICBtX3NpemUgPSBz
aXplOwotICAgIAotICAgIGlmIChzaXplQ2hhbmdlZCAmJiBhbGxvd0luTFJVTGlzdCgpKQotICAg
ICAgICBDYWNoZTo6aW5zZXJ0SW5MUlVMaXN0KHRoaXMpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUNhY2hlZENTU1N0eWxlU2hlZXQ6OkNhY2hlZENTU1N0
eWxlU2hlZXQoRG9jTG9hZGVyKiBkbCwgY29uc3QgRE9NU3RyaW5nICZ1cmwsIEtJTzo6Q2FjaGVD
b250cm9sIF9jYWNoZVBvbGljeSwgdGltZV90IF9leHBpcmVEYXRlLCBjb25zdCBRU3RyaW5nJiBj
aGFyc2V0KQotICAgIDogQ2FjaGVkT2JqZWN0KHVybCwgQ1NTU3R5bGVTaGVldCwgX2NhY2hlUG9s
aWN5LCBfZXhwaXJlRGF0ZSksIG1fY29kZWMoMCkKLXsKLSAgICAvLyBJdCdzIGNzcyB3ZSB3YW50
LgotICAgIHNldEFjY2VwdCgidGV4dC9jc3MiKTsKLSAgICAvLyBsb2FkIHRoZSBmaWxlCi0gICAg
Q2FjaGU6OmxvYWRlcigpLT5sb2FkKGRsLCB0aGlzLCBmYWxzZSk7Ci0gICAgbV9sb2FkaW5nID0g
dHJ1ZTsKLSAgICBpZiAoIWNoYXJzZXQuaXNFbXB0eSgpKQotCW1fY29kZWMgPSBRVGV4dENvZGVj
Ojpjb2RlY0Zvck5hbWUoY2hhcnNldC5sYXRpbjEoKSk7Ci0gICAgaWYgKCFtX2NvZGVjKQotICAg
ICAgICBtX2NvZGVjID0gUVRleHRDb2RlYzo6Y29kZWNGb3JOYW1lKCJpc284ODU5LTEiKTsKLX0K
LQotQ2FjaGVkQ1NTU3R5bGVTaGVldDo6Q2FjaGVkQ1NTU3R5bGVTaGVldChjb25zdCBET01TdHJp
bmcgJnVybCwgY29uc3QgUVN0cmluZyAmc3R5bGVzaGVldF9kYXRhKQotICAgIDogQ2FjaGVkT2Jq
ZWN0KHVybCwgQ1NTU3R5bGVTaGVldCwgS0lPOjpDQ19WZXJpZnksIDAsIHN0eWxlc2hlZXRfZGF0
YS5sZW5ndGgoKSkKLXsKLSAgICBtX2xvYWRpbmcgPSBmYWxzZTsKLSAgICBtX3N0YXR1cyA9IFBl
cnNpc3RlbnQ7Ci0gICAgbV9jb2RlYyA9IDA7Ci0gICAgbV9zaGVldCA9IERPTVN0cmluZyhzdHls
ZXNoZWV0X2RhdGEpOwotfQotCi0KLUNhY2hlZENTU1N0eWxlU2hlZXQ6On5DYWNoZWRDU1NTdHls
ZVNoZWV0KCkKLXsKLX0KLQotdm9pZCBDYWNoZWRDU1NTdHlsZVNoZWV0OjpyZWYoQ2FjaGVkT2Jq
ZWN0Q2xpZW50ICpjKQotewotICAgIENhY2hlZE9iamVjdDo6cmVmKGMpOwotCi0gICAgaWYoIW1f
bG9hZGluZykgYy0+c2V0U3R5bGVTaGVldCggbV91cmwsIG1fc2hlZXQgKTsKLX0KLQotdm9pZCBD
YWNoZWRDU1NTdHlsZVNoZWV0OjpkZXJlZihDYWNoZWRPYmplY3RDbGllbnQgKmMpCi17Ci0gICAg
Q2FjaGU6OmZsdXNoKCk7Ci0gICAgQ2FjaGVkT2JqZWN0OjpkZXJlZihjKTsKLSAgICBpZiAoIGNh
bkRlbGV0ZSgpICYmIG1fZnJlZSApCi0gICAgICBkZWxldGUgdGhpczsKLX0KLQotdm9pZCBDYWNo
ZWRDU1NTdHlsZVNoZWV0OjpzZXRDaGFyc2V0KCBjb25zdCBRU3RyaW5nICZjaHMgKQotewotICAg
IGlmICghY2hzLmlzRW1wdHkoKSkgewotICAgICAgICBRVGV4dENvZGVjICpjb2RlYyA9IFFUZXh0
Q29kZWM6OmNvZGVjRm9yTmFtZShjaHMubGF0aW4xKCkpOwotICAgICAgICBpZiAoY29kZWMpCi0g
ICAgICAgICAgICBtX2NvZGVjID0gY29kZWM7Ci0gICAgfQotfQotCi12b2lkIENhY2hlZENTU1N0
eWxlU2hlZXQ6OmRhdGEoIFFCdWZmZXIgJmJ1ZmZlciwgYm9vbCBlb2YgKQotewotICAgIGlmKCFl
b2YpIHJldHVybjsKLSAgICBidWZmZXIuY2xvc2UoKTsKLSAgICBzZXRTaXplKGJ1ZmZlci5idWZm
ZXIoKS5zaXplKCkpOwotICAgIFFTdHJpbmcgZGF0YSA9IG1fY29kZWMtPnRvVW5pY29kZSggYnVm
ZmVyLmJ1ZmZlcigpLmRhdGEoKSwgc2l6ZSgpICk7Ci0gICAgbV9zaGVldCA9IERPTVN0cmluZyhk
YXRhKTsKLSAgICBtX2xvYWRpbmcgPSBmYWxzZTsKLQotICAgIGNoZWNrTm90aWZ5KCk7Ci19Ci0K
LXZvaWQgQ2FjaGVkQ1NTU3R5bGVTaGVldDo6Y2hlY2tOb3RpZnkoKQotewotICAgIGlmIChtX2xv
YWRpbmcpCi0gICAgICAgIHJldHVybjsKLQotICAgIENhY2hlZE9iamVjdENsaWVudFdhbGtlciB3
KG1fY2xpZW50cyk7Ci0gICAgd2hpbGUgKENhY2hlZE9iamVjdENsaWVudCAqYyA9IHcubmV4dCgp
KSB7Ci0gICAgICAgIGlmIChtX3Jlc3BvbnNlICYmICFLV1FJc1Jlc3BvbnNlVVJMRXF1YWxUb1VS
TChtX3Jlc3BvbnNlLCBtX3VybCkpCi0gICAgICAgICAgICBjLT5zZXRTdHlsZVNoZWV0KERPTVN0
cmluZyhLV1FSZXNwb25zZVVSTChtX3Jlc3BvbnNlKSksIG1fc2hlZXQpOwotICAgICAgICBlbHNl
Ci0gICAgICAgICAgICBjLT5zZXRTdHlsZVNoZWV0KG1fdXJsLCBtX3NoZWV0KTsKLSAgICB9Ci19
Ci0KLQotdm9pZCBDYWNoZWRDU1NTdHlsZVNoZWV0OjplcnJvciggaW50IC8qZXJyKi8sIGNvbnN0
IGNoYXIgKi8qdGV4dCovICkKLXsKLSAgICBtX2xvYWRpbmcgPSBmYWxzZTsKLSAgICBjaGVja05v
dGlmeSgpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUNh
Y2hlZFNjcmlwdDo6Q2FjaGVkU2NyaXB0KERvY0xvYWRlciogZGwsIGNvbnN0IERPTVN0cmluZyAm
dXJsLCBLSU86OkNhY2hlQ29udHJvbCBfY2FjaGVQb2xpY3ksIHRpbWVfdCBfZXhwaXJlRGF0ZSwg
Y29uc3QgUVN0cmluZyYgY2hhcnNldCkKLSAgICA6IENhY2hlZE9iamVjdCh1cmwsIFNjcmlwdCwg
X2NhY2hlUG9saWN5LCBfZXhwaXJlRGF0ZSksIG1fY29kZWMoMCkKLXsKLSAgICAvLyBJdCdzIGph
dmFzY3JpcHQgd2Ugd2FudC4KLSAgICAvLyBCdXQgc29tZSB3ZWJzaXRlcyB0aGluayB0aGVpciBz
Y3JpcHRzIGFyZSA8c29tZSB3cm9uZyBtaW1ldHlwZSBoZXJlPgotICAgIC8vIGFuZCByZWZ1c2Ug
dG8gc2VydmUgdGhlbSBpZiB3ZSBvbmx5IGFjY2VwdCBhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQu
Ci0gICAgc2V0QWNjZXB0KCIqLyoiKTsKLSAgICBtX2Vycm9yT2NjdXJyZWQgPSBmYWxzZTsKLSAg
ICAvLyBsb2FkIHRoZSBmaWxlCi0gICAgQ2FjaGU6OmxvYWRlcigpLT5sb2FkKGRsLCB0aGlzLCBm
YWxzZSk7Ci0gICAgbV9sb2FkaW5nID0gdHJ1ZTsKLSAgICBpZiAoIWNoYXJzZXQuaXNFbXB0eSgp
KQotICAgICAgICBtX2NvZGVjID0gUVRleHRDb2RlYzo6Y29kZWNGb3JOYW1lKGNoYXJzZXQubGF0
aW4xKCkpOwotICAgIGlmICghbV9jb2RlYykKLQltX2NvZGVjID0gUVRleHRDb2RlYzo6Y29kZWNG
b3JOYW1lKCJpc284ODU5LTEiKTsKLX0KLQotQ2FjaGVkU2NyaXB0OjpDYWNoZWRTY3JpcHQoY29u
c3QgRE9NU3RyaW5nICZ1cmwsIGNvbnN0IFFTdHJpbmcgJnNjcmlwdF9kYXRhKQotICAgIDogQ2Fj
aGVkT2JqZWN0KHVybCwgU2NyaXB0LCBLSU86OkNDX1ZlcmlmeSwgMCwgc2NyaXB0X2RhdGEubGVu
Z3RoKCkpCi17Ci0gICAgbV9lcnJvck9jY3VycmVkID0gZmFsc2U7Ci0gICAgbV9sb2FkaW5nID0g
ZmFsc2U7Ci0gICAgbV9zdGF0dXMgPSBQZXJzaXN0ZW50OwotICAgIG1fY29kZWMgPSAwOwotICAg
IG1fc2NyaXB0ID0gRE9NU3RyaW5nKHNjcmlwdF9kYXRhKTsKLX0KLQotQ2FjaGVkU2NyaXB0Ojp+
Q2FjaGVkU2NyaXB0KCkKLXsKLX0KLQotdm9pZCBDYWNoZWRTY3JpcHQ6OnJlZihDYWNoZWRPYmpl
Y3RDbGllbnQgKmMpCi17Ci0gICAgQ2FjaGVkT2JqZWN0OjpyZWYoYyk7Ci0KLSAgICBpZighbV9s
b2FkaW5nKSBjLT5ub3RpZnlGaW5pc2hlZCh0aGlzKTsKLX0KLQotdm9pZCBDYWNoZWRTY3JpcHQ6
OmRlcmVmKENhY2hlZE9iamVjdENsaWVudCAqYykKLXsKLSAgICBDYWNoZTo6Zmx1c2goKTsKLSAg
ICBDYWNoZWRPYmplY3Q6OmRlcmVmKGMpOwotICAgIGlmICggY2FuRGVsZXRlKCkgJiYgbV9mcmVl
ICkKLSAgICAgIGRlbGV0ZSB0aGlzOwotfQotCi12b2lkIENhY2hlZFNjcmlwdDo6c2V0Q2hhcnNl
dCggY29uc3QgUVN0cmluZyAmY2hzICkKLXsKLSAgICBpZiAoIWNocy5pc0VtcHR5KCkpIHsKLSAg
ICAgICAgUVRleHRDb2RlYyAqY29kZWMgPSBRVGV4dENvZGVjOjpjb2RlY0Zvck5hbWUoY2hzLmxh
dGluMSgpKTsKLSAgICAgICAgaWYgKGNvZGVjKQotICAgICAgICAgICAgbV9jb2RlYyA9IGNvZGVj
OwotICAgIH0KLX0KLQotdm9pZCBDYWNoZWRTY3JpcHQ6OmRhdGEoIFFCdWZmZXIgJmJ1ZmZlciwg
Ym9vbCBlb2YgKQotewotICAgIGlmKCFlb2YpIHJldHVybjsKLSAgICBidWZmZXIuY2xvc2UoKTsK
LSAgICBzZXRTaXplKGJ1ZmZlci5idWZmZXIoKS5zaXplKCkpOwotICAgIFFTdHJpbmcgZGF0YSA9
IG1fY29kZWMtPnRvVW5pY29kZSggYnVmZmVyLmJ1ZmZlcigpLmRhdGEoKSwgc2l6ZSgpICk7Ci0g
ICAgbV9zY3JpcHQgPSBET01TdHJpbmcoZGF0YSk7Ci0gICAgbV9sb2FkaW5nID0gZmFsc2U7Ci0g
ICAgY2hlY2tOb3RpZnkoKTsKLX0KLQotdm9pZCBDYWNoZWRTY3JpcHQ6OmNoZWNrTm90aWZ5KCkK
LXsKLSAgICBpZihtX2xvYWRpbmcpIHJldHVybjsKLQotICAgIENhY2hlZE9iamVjdENsaWVudFdh
bGtlciB3KG1fY2xpZW50cyk7Ci0gICAgd2hpbGUgKENhY2hlZE9iamVjdENsaWVudCAqYyA9IHcu
bmV4dCgpKQotICAgICAgICBjLT5ub3RpZnlGaW5pc2hlZCh0aGlzKTsKLX0KLQotCi12b2lkIENh
Y2hlZFNjcmlwdDo6ZXJyb3IoIGludCAvKmVyciovLCBjb25zdCBjaGFyICovKnRleHQqLyApCi17
Ci0gICAgbV9sb2FkaW5nID0gZmFsc2U7Ci0gICAgbV9lcnJvck9jY3VycmVkID0gdHJ1ZTsKLSAg
ICBjaGVja05vdGlmeSgpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0KLQotCi1zdGF0aWMgYm9vbCBjcm9zc0RvbWFpbihjb25zdCBRU3RyaW5nICZhLCBjb25zdCBR
U3RyaW5nICZiKQotewotICAgIGlmIChhID09IGIpIHJldHVybiBmYWxzZTsKLQotICAgIFFTdHJp
bmdMaXN0IGwxID0gUVN0cmluZ0xpc3Q6OnNwbGl0KCcuJywgYSk7Ci0gICAgUVN0cmluZ0xpc3Qg
bDIgPSBRU3RyaW5nTGlzdDo6c3BsaXQoJy4nLCBiKTsKLQotICAgIHdoaWxlKGwxLmNvdW50KCkg
PiBsMi5jb3VudCgpKQotICAgICAgICBsMS5wb3BfZnJvbnQoKTsKLQotICAgIHdoaWxlKGwyLmNv
dW50KCkgPiBsMS5jb3VudCgpKQotICAgICAgICBsMi5wb3BfZnJvbnQoKTsKLQotICAgIHdoaWxl
KGwyLmNvdW50KCkgPj0gMikKLSAgICB7Ci0gICAgICAgIGlmIChsMSA9PSBsMikKLSAgICAgICAg
ICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIGwxLnBvcF9mcm9udCgpOwotICAgICAgICBsMi5w
b3BfZnJvbnQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIC0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0KLXZvaWQgQ2FjaGVkSW1hZ2VDYWxsYmFjazo6bm90aWZ5VXBkYXRl
KCkgCi17IAotICAgIGlmIChjYWNoZWRJbWFnZSkgewotICAgICAgICBjYWNoZWRJbWFnZS0+ZG9f
bm90aWZ5IChjYWNoZWRJbWFnZS0+cGl4bWFwKCksIGNhY2hlZEltYWdlLT5waXhtYXAoKS5yZWN0
KCkpOyAKLSAgICAgICAgUVNpemUgcyA9IGNhY2hlZEltYWdlLT5waXhtYXBfc2l6ZSgpOwotICAg
ICAgICBjYWNoZWRJbWFnZS0+c2V0U2l6ZShzLndpZHRoKCkgKiBzLmhlaWdodCgpICogMik7Ci0K
LSAgICAgICAgLy8gQWZ0ZXIgcmVjZWl2aW5nIHRoZSBpbWFnZSBoZWFkZXIgd2UgYXJlIGd1YXJh
bnRlZWQgdG8ga25vdwotICAgICAgICAvLyB0aGUgaW1hZ2Ugc2l6ZS4gIEFsdGhvdWdoIGFsbCBv
ZiB0aGUgZGF0YSBtYXkgbm90IGhhdmUgYXJyaXZlZCBvcgotICAgICAgICAvLyBiZWVuIGRlY29k
ZWQgd2UgY2FuIGNvbnNpZGVyIHRoZSBpbWFnZSBsb2FkZWQgZm9yIHB1cnBvc2VkIG9mCi0gICAg
ICAgIC8vIGxheW91dCBhbmQgZGlzcGF0Y2hpbmcgdGhlIGltYWdlJ3Mgb25sb2FkIGhhbmRsZXIu
ICBSZW1vdmluZyB0aGUgcmVxdWVzdCBmcm9tCi0gICAgICAgIC8vIHRoZSBsaXN0IG9mIGJhY2tn
cm91bmQgZGVjb2RpbmcgcmVxdWVzdHMgd2lsbCBlbnN1cmUgdGhhdCBMb2FkZXI6Om51bVJlcXVl
c3RzKCkgCi0gICAgICAgIC8vIGRvZXMgbm90IGNvdW50IHRoaXMgYmFja2dyb3VuZCByZXF1ZXN0
LiAgRnVydGhlciBudW1SZXF1ZXN0cygpIGNhbgotICAgICAgICAvLyBiZSBjb3JyZWN0bHkgdXNl
ZCBieSB0aGUgcGFydCB0byBkZXRlcm1pbmUgaWYgbG9hZGluZyBpcyBzdWZmaWNpZW50bHkKLSAg
ICAgICAgLy8gY29tcGxldGUgdG8gZGlzcGF0Y2ggdGhlIHBhZ2UncyBvbmxvYWQgaGFuZGxlci4K
LSAgICAgICAgUmVxdWVzdCAqciA9IGNhY2hlZEltYWdlLT5tX3JlcXVlc3Q7Ci0gICAgICAgIERv
Y0xvYWRlciAqZGwgPSByLT5tX2RvY0xvYWRlcjsKLQotICAgICAgICBraHRtbDo6Q2FjaGU6Omxv
YWRlcigpLT5yZW1vdmVCYWNrZ3JvdW5kRGVjb2RpbmdSZXF1ZXN0KHIpOwotCi0gICAgICAgIC8v
IFBva2UgdGhlIHBhcnQgdG8gZ2V0IGl0IHRvIGRvIGEgY2hlY2tDb21wbGV0ZWQoKS4gIE9ubHkg
ZG8gdGhpcyBmb3IKLSAgICAgICAgLy8gdGhlIGZpcnN0IHVwZGF0ZSB0byBtaW5pbWl6ZSB3b3Jr
LiAgTm90ZSB0aGF0IHdlIGFyZSBndWFyYW50ZWVkIHRvIGhhdmUKLSAgICAgICAgLy8gcmVhZCB0
aGUgaGVhZGVyIHdoZW4gd2UgcmVjZWl2ZWQgdGhpcyBmaXJzdCB1cGRhdGUsIHdoaWNoIGlzIHRy
aWdnZXJlZAotICAgICAgICAvLyBieSB0aGUgZmlyc3Qga0NHSW1hZ2VTdGF0dXNJbmNvbXBsZXRl
IHN0YXR1cyBmcm9tIENHLiBrQ0dJbWFnZVN0YXR1c0luY29tcGxldGUKLSAgICAgICAgLy8gcmVh
bGx5IG1lYW5zIHRoYXQgdGhlIENHIGRlY29kZXIgaXMgd2FpdGluZyBmb3IgbW9yZSBkYXRhLCBi
dXQgaGFzIGFscmVhZHkKLSAgICAgICAgLy8gcmVhZCB0aGUgaGVhZGVyLgotICAgICAgICBpZiAo
IWhlYWRlclJlY2VpdmVkKSB7Ci0gICAgICAgICAgICBlbWl0IGtodG1sOjpDYWNoZTo6bG9hZGVy
KCktPnJlcXVlc3REb25lKCBkbCwgY2FjaGVkSW1hZ2UgKTsKLSAgICAgICAgICAgIGhlYWRlclJl
Y2VpdmVkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBDYWNoZWRJbWFnZUNh
bGxiYWNrOjpub3RpZnlGaW5pc2hlZCgpCi17Ci0gICAgaWYgKGNhY2hlZEltYWdlKSB7Ci0gICAg
ICAgIGNhY2hlZEltYWdlLT5kb19ub3RpZnkgKGNhY2hlZEltYWdlLT5waXhtYXAoKSwgY2FjaGVk
SW1hZ2UtPnBpeG1hcCgpLnJlY3QoKSk7IAotICAgICAgICBjYWNoZWRJbWFnZS0+bV9sb2FkaW5n
ID0gZmFsc2U7Ci0gICAgICAgIGNhY2hlZEltYWdlLT5jaGVja05vdGlmeSgpOwotICAgICAgICBR
U2l6ZSBzID0gY2FjaGVkSW1hZ2UtPnBpeG1hcF9zaXplKCk7Ci0gICAgICAgIGNhY2hlZEltYWdl
LT5zZXRTaXplKHMud2lkdGgoKSAqIHMuaGVpZ2h0KCkgKiAyKTsKLQkKLSAgICAgICAgUmVxdWVz
dCAqciA9IGNhY2hlZEltYWdlLT5tX3JlcXVlc3Q7Ci0gICAgICAgIERvY0xvYWRlciAqZGwgPSBy
LT5tX2RvY0xvYWRlcjsKLQotICAgICAgICBraHRtbDo6Q2FjaGU6OmxvYWRlcigpLT5yZW1vdmVC
YWNrZ3JvdW5kRGVjb2RpbmdSZXF1ZXN0KHIpOwotCi0gICAgICAgIC8vIFBva2UgdGhlIHBhcnQg
dG8gZ2V0IGl0IHRvIGRvIGEgY2hlY2tDb21wbGV0ZWQoKS4KLSAgICAgICAgZW1pdCBraHRtbDo6
Q2FjaGU6OmxvYWRlcigpLT5yZXF1ZXN0RG9uZSggZGwsIGNhY2hlZEltYWdlICk7Ci0gICAgICAg
IAotICAgICAgICBkZWxldGUgcjsKLSAgICB9Ci19Ci0KLXZvaWQgQ2FjaGVkSW1hZ2VDYWxsYmFj
azo6bm90aWZ5RGVjb2RpbmdFcnJvcigpCi17Ci0gICAgaWYgKGNhY2hlZEltYWdlKSB7Ci0gICAg
ICAgIGhhbmRsZUVycm9yKCk7Ci0gICAgfQotfQotCi12b2lkIENhY2hlZEltYWdlQ2FsbGJhY2s6
OmhhbmRsZUVycm9yKCkKLXsKLSAgICBpZiAoY2FjaGVkSW1hZ2UpIHsKLSAgICAgICAgY2FjaGVk
SW1hZ2UtPmVycm9yT2NjdXJlZCA9IHRydWU7Ci0gICAgICAgIFFQaXhtYXAgZXAgPSBjYWNoZWRJ
bWFnZS0+cGl4bWFwKCk7Ci0gICAgICAgIGNhY2hlZEltYWdlLT5kb19ub3RpZnkgKGVwLCBlcC5y
ZWN0KCkpOwotICAgICAgICBDYWNoZTo6cmVtb3ZlQ2FjaGVFbnRyeSAoY2FjaGVkSW1hZ2UpOwot
Ci0gICAgICAgIGNsZWFyKCk7Ci0gICAgfQotfQotCi12b2lkIENhY2hlZEltYWdlQ2FsbGJhY2s6
OmNsZWFyKCkgCi17Ci0gICAgaWYgKGNhY2hlZEltYWdlICYmIGNhY2hlZEltYWdlLT5tX3JlcXVl
c3QpIHsKLSAgICAgICAgUmVxdWVzdCAqciA9IGNhY2hlZEltYWdlLT5tX3JlcXVlc3Q7Ci0gICAg
ICAgIERvY0xvYWRlciAqZGwgPSByLT5tX2RvY0xvYWRlcjsKLQotICAgICAgICBraHRtbDo6Q2Fj
aGU6OmxvYWRlcigpLT5yZW1vdmVCYWNrZ3JvdW5kRGVjb2RpbmdSZXF1ZXN0KHIpOwotCi0gICAg
ICAgIC8vIFBva2UgdGhlIHBhcnQgdG8gZ2V0IGl0IHRvIGRvIGEgY2hlY2tDb21wbGV0ZWQoKS4K
LSAgICAgICAgZW1pdCBraHRtbDo6Q2FjaGU6OmxvYWRlcigpLT5yZXF1ZXN0RmFpbGVkKCBkbCwg
Y2FjaGVkSW1hZ2UgKTsKLQotICAgICAgICBkZWxldGUgcjsKLSAgICB9Ci0gICAgY2FjaGVkSW1h
Z2UgPSAwOwotfQotCi1DYWNoZWRJbWFnZTo6Q2FjaGVkSW1hZ2UoRG9jTG9hZGVyKiBkbCwgY29u
c3QgRE9NU3RyaW5nICZ1cmwsIEtJTzo6Q2FjaGVDb250cm9sIF9jYWNoZVBvbGljeSwgdGltZV90
IF9leHBpcmVEYXRlKQotICAgIDogUU9iamVjdCgpLCBDYWNoZWRPYmplY3QodXJsLCBJbWFnZSwg
X2NhY2hlUG9saWN5LCBfZXhwaXJlRGF0ZSkKLSAgICAsIG1fZGF0YVNpemUoMCkKLXsKLSAgICBw
ID0gMDsKLSAgICBwaXhQYXJ0ID0gMDsKLSAgICBiZyA9IDA7Ci0gICAgaXNGdWxseVRyYW5zcGFy
ZW50ID0gZmFsc2U7Ci0gICAgZXJyb3JPY2N1cmVkID0gZmFsc2U7Ci0gICAgbW9ub2Nocm9tZSA9
IGZhbHNlOwotICAgIGZvcm1hdFR5cGUgPSAwOwotICAgIG1fc3RhdHVzID0gVW5rbm93bjsKLSAg
ICBpbWdTb3VyY2UgPSAwOwotICAgIG1fbG9hZGluZyA9IHRydWU7Ci0gICAgbV9zaG93QW5pbWF0
aW9ucyA9IGRsLT5zaG93QW5pbWF0aW9ucygpOwotICAgIGlmIChRUGl4bWFwOjpzaG91bGRVc2VU
aHJlYWRlZERlY29kaW5nKCkpCi0gICAgICAgIG1fZGVjb2RlckNhbGxiYWNrID0gbmV3IENhY2hl
ZEltYWdlQ2FsbGJhY2sodGhpcyk7Ci0gICAgZWxzZQotICAgICAgICBtX2RlY29kZXJDYWxsYmFj
ayA9IDA7Ci19Ci0KLUNhY2hlZEltYWdlOjp+Q2FjaGVkSW1hZ2UoKQotewotICAgIGNsZWFyKCk7
Ci19Ci0KLXZvaWQgQ2FjaGVkSW1hZ2U6OnJlZiggQ2FjaGVkT2JqZWN0Q2xpZW50ICpjICkKLXsK
LSAgICBDYWNoZWRPYmplY3Q6OnJlZihjKTsKLQotICAgIC8vIGZvciBtb3VzZW92ZXJzLCBkeW5h
bWljIGNoYW5nZXMKLSAgICBpZiAoIXZhbGlkX3JlY3QoKS5pc051bGwoKSkKLSAgICAgICAgYy0+
c2V0UGl4bWFwKCBwaXhtYXAoKSwgdmFsaWRfcmVjdCgpLCB0aGlzKTsKLQotICAgIGlmKCFtX2xv
YWRpbmcpCi0gICAgICAgIGMtPm5vdGlmeUZpbmlzaGVkKHRoaXMpOwotfQotCi12b2lkIENhY2hl
ZEltYWdlOjpkZXJlZiggQ2FjaGVkT2JqZWN0Q2xpZW50ICpjICkKLXsKLSAgICBDYWNoZTo6Zmx1
c2goKTsKLSAgICBDYWNoZWRPYmplY3Q6OmRlcmVmKGMpOwotICAgIGlmICggY2FuRGVsZXRlKCkg
JiYgbV9mcmVlICkKLSAgICAgICAgZGVsZXRlIHRoaXM7Ci19Ci0KLWNvbnN0IFFQaXhtYXAgJkNh
Y2hlZEltYWdlOjp0aWxlZF9waXhtYXAoY29uc3QgUUNvbG9yJiBuZXdjKQotewotICAgIHJldHVy
biBwaXhtYXAoKTsKLX0KLQotY29uc3QgUVBpeG1hcCAmQ2FjaGVkSW1hZ2U6OnBpeG1hcCggKSBj
b25zdAotewotICAgIGlmKGVycm9yT2NjdXJlZCkKLSAgICAgICAgcmV0dXJuICpDYWNoZTo6YnJv
a2VuUGl4bWFwOwotCi0gICAgaWYgKHApCi0gICAgICAgIHJldHVybiAqcDsKLQotICAgIHJldHVy
biAqQ2FjaGU6Om51bGxQaXhtYXA7Ci19Ci0KLVFTaXplIENhY2hlZEltYWdlOjpwaXhtYXBfc2l6
ZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIChwID8gcC0+c2l6ZSgpIDogUVNpemUoKSk7Ci19Ci0K
LVFSZWN0IENhY2hlZEltYWdlOjp2YWxpZF9yZWN0KCkgY29uc3QKLXsKLSAgICByZXR1cm4gKHAg
PyBwLT5yZWN0KCkgOiBRUmVjdCgpKTsKLX0KLQotdm9pZCBDYWNoZWRJbWFnZTo6ZG9fbm90aWZ5
KGNvbnN0IFFQaXhtYXAmIHAsIGNvbnN0IFFSZWN0JiByKQotewotICAgIENhY2hlZE9iamVjdENs
aWVudFdhbGtlciB3KG1fY2xpZW50cyk7Ci0gICAgd2hpbGUgKENhY2hlZE9iamVjdENsaWVudCAq
YyA9IHcubmV4dCgpKQotICAgICAgICBjLT5zZXRQaXhtYXAocCwgciwgdGhpcyk7Ci19Ci0KLXZv
aWQgQ2FjaGVkSW1hZ2U6OnNldFNob3dBbmltYXRpb25zKCBLSFRNTFNldHRpbmdzOjpLQW5pbWF0
aW9uQWR2aWNlIHNob3dBbmltYXRpb25zICkKLXsKLSAgICBtX3Nob3dBbmltYXRpb25zID0gc2hv
d0FuaW1hdGlvbnM7Ci19Ci0KLXZvaWQgQ2FjaGVkSW1hZ2U6OmNsZWFyKCkKLXsKLSAgICBkZWxl
dGUgcDsgICBwID0gMDsKLSAgICBkZWxldGUgYmc7ICBiZyA9IDA7Ci0gICAgZGVsZXRlIHBpeFBh
cnQ7IHBpeFBhcnQgPSAwOwotCi0gICAgZm9ybWF0VHlwZSA9IDA7Ci0KLSAgICBzZXRTaXplKDAp
OwotCi0gICAgLy8gTm8gbmVlZCB0byBkZWxldGUgaW1hZ2VTb3VyY2UgLSBRTW92aWUgZG9lcyBp
dCBmb3IgdXMKLSAgICBpbWdTb3VyY2UgPSAwOwotCi0gICAgaWYgKG1fZGVjb2RlckNhbGxiYWNr
KSB7Ci0gICAgICAgIG1fZGVjb2RlckNhbGxiYWNrLT5jbGVhcigpOwotICAgICAgICBtX2RlY29k
ZXJDYWxsYmFjay0+ZGVyZWYoKTsKLSAgICAgICAgbV9kZWNvZGVyQ2FsbGJhY2sgPSAwOwotICAg
IH0KLX0KLQotdm9pZCBDYWNoZWRJbWFnZTo6ZGF0YSAoIFFCdWZmZXIgJl9idWZmZXIsIGJvb2wg
ZW9mICkKLXsKLSNpZmRlZiBDQUNIRV9ERUJVRwotICAgIGtkRGVidWcoIDYwNjAgKSA8PCB0aGlz
IDw8ICJpbiBDYWNoZWRJbWFnZTo6ZGF0YShidWZmZXJzaXplICIgPDwgX2J1ZmZlci5idWZmZXIo
KS5zaXplKCkgPDwiLCBlb2Y9IiA8PCBlb2YgPDwgZW5kbDsKLSNlbmRpZgotCi0gICAgYm9vbCBj
YW5EcmF3ID0gZmFsc2U7Ci0gICAgCi0gICAgbV9kYXRhU2l6ZSA9IF9idWZmZXIuc2l6ZSgpOwot
ICAgICAgICAKLSAgICAvLyBJZiB3ZSdyZSBhdCBlb2YgYW5kIGRvbid0IGhhdmUgYSBwaXhtYXAg
eWV0LCB0aGUgZGF0YQotICAgIC8vIG11c3QgaGF2ZSBhcnJpdmVkIGluIG9uZSBjaHVuay4gIFRo
aXMgYXZvaWRzIHRoZSBhdHRlbXB0Ci0gICAgLy8gdG8gcGVyZm9ybSBpbmNyZW1lbnRhbCBkZWNv
ZGluZy4KLSAgICBpZiAoZW9mICYmICFwKSB7Ci0gICAgICAgIHAgPSBuZXcgUVBpeG1hcChfYnVm
ZmVyLmJ1ZmZlcigpLCBLV1FSZXNwb25zZU1JTUVUeXBlKG1fcmVzcG9uc2UpKTsKLSAgICAgICAg
aWYgKG1fZGVjb2RlckNhbGxiYWNrKQotICAgICAgICAgICAgbV9kZWNvZGVyQ2FsbGJhY2stPm5v
dGlmeUZpbmlzaGVkKCk7Ci0gICAgICAgIGNhbkRyYXcgPSB0cnVlOwotICAgIH0gZWxzZSB7Ci0g
ICAgICAgIC8vIEFsd2F5cyBhdHRlbXB0IHRvIGxvYWQgdGhlIGltYWdlIGluY3JlbWVudGFsbHku
Ci0gICAgICAgIGlmICghcCkKLSAgICAgICAgICAgIHAgPSBuZXcgUVBpeG1hcChLV1FSZXNwb25z
ZU1JTUVUeXBlKG1fcmVzcG9uc2UpKTsKLSAgICAgICAgY2FuRHJhdyA9IHAtPnJlY2VpdmVkRGF0
YShfYnVmZmVyLmJ1ZmZlcigpLCBlb2YsIG1fZGVjb2RlckNhbGxiYWNrKTsKLSAgICB9Ci0gICAg
Ci0gICAgLy8gSWYgd2UgaGF2ZSBhIGRlY29kZXIsIHdlJ2xsIGJlIG5vdGlmaWVkIHdoZW4gZGVj
b2RpbmcgaGFzIGNvbXBsZXRlZC4KLSAgICBpZiAoIW1fZGVjb2RlckNhbGxiYWNrKSB7Ci0gICAg
ICAgIGlmIChjYW5EcmF3IHx8IGVvZikgewotICAgICAgICAgICAgaWYgKHAtPmlzTnVsbCgpKSB7
Ci0gICAgICAgICAgICAgICAgZXJyb3JPY2N1cmVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBR
UGl4bWFwIGVwID0gcGl4bWFwKCk7Ci0gICAgICAgICAgICAgICAgZG9fbm90aWZ5IChlcCwgZXAu
cmVjdCgpKTsKLSAgICAgICAgICAgICAgICBDYWNoZTo6cmVtb3ZlQ2FjaGVFbnRyeSAodGhpcyk7
Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZG9fbm90
aWZ5KCpwLCBwLT5yZWN0KCkpOwotCi0gICAgICAgICAgICBRU2l6ZSBzID0gcGl4bWFwX3NpemUo
KTsKLSAgICAgICAgICAgIHNldFNpemUocy53aWR0aCgpICogcy5oZWlnaHQoKSAqIDIpOwotICAg
ICAgICB9Ci0gICAgICAgIGlmIChlb2YpIHsKLSAgICAgICAgICAgIG1fbG9hZGluZyA9IGZhbHNl
OwotICAgICAgICAgICAgY2hlY2tOb3RpZnkoKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9p
ZCBDYWNoZWRJbWFnZTo6ZXJyb3IoIGludCAvKmVyciovLCBjb25zdCBjaGFyICovKnRleHQqLyAp
Ci17Ci0jaWZkZWYgQ0FDSEVfREVCVUcKLSAgICBrZERlYnVnKDYwNjApIDw8ICJDYWhjZWRJbWFn
ZTo6ZXJyb3IiIDw8IGVuZGw7Ci0jZW5kaWYKLQotICAgIGNsZWFyKCk7Ci0gICAgZXJyb3JPY2N1
cmVkID0gdHJ1ZTsKLSAgICBkb19ub3RpZnkocGl4bWFwKCksIFFSZWN0KDAsIDAsIDE2LCAxNikp
OwotICAgIG1fbG9hZGluZyA9IGZhbHNlOwotICAgIGNoZWNrTm90aWZ5KCk7Ci19Ci0KLXZvaWQg
Q2FjaGVkSW1hZ2U6OmNoZWNrTm90aWZ5KCkKLXsKLSAgICBpZihtX2xvYWRpbmcpIHJldHVybjsK
LQotICAgIENhY2hlZE9iamVjdENsaWVudFdhbGtlciB3KG1fY2xpZW50cyk7Ci0gICAgd2hpbGUg
KENhY2hlZE9iamVjdENsaWVudCAqYyA9IHcubmV4dCgpKSB7Ci0gICAgICAgIGMtPm5vdGlmeUZp
bmlzaGVkKHRoaXMpOwotICAgIH0KLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLQotCi0jaWZkZWYgS0hUTUxfWFNMVAorbmFtZXNwYWNlIGtodG1sIHsKIAogQ2FjaGVk
WFNMU3R5bGVTaGVldDo6Q2FjaGVkWFNMU3R5bGVTaGVldChEb2NMb2FkZXIqIGRsLCBjb25zdCBE
T01TdHJpbmcgJnVybCwgS0lPOjpDYWNoZUNvbnRyb2wgX2NhY2hlUG9saWN5LCB0aW1lX3QgX2V4
cGlyZURhdGUpCiA6IENhY2hlZE9iamVjdCh1cmwsIFhTTFN0eWxlU2hlZXQsIF9jYWNoZVBvbGlj
eSwgX2V4cGlyZURhdGUpCkBAIC03NTksMTEyNSArMTc0LDEyIEBAIHZvaWQgQ2FjaGVkWEJMRG9j
dW1lbnQ6OmNoZWNrTm90aWZ5KCkKICAgICAgICAgYy0+c2V0WEJMRG9jdW1lbnQobV91cmwsIG1f
ZG9jdW1lbnQpOwogfQogCi0KIHZvaWQgQ2FjaGVkWEJMRG9jdW1lbnQ6OmVycm9yKCBpbnQgLypl
cnIqLywgY29uc3QgY2hhciAqLyp0ZXh0Ki8gKQogewogICAgIG1fbG9hZGluZyA9IGZhbHNlOwog
ICAgIGNoZWNrTm90aWZ5KCk7CiB9Ci0jZW5kaWYKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tCi0KLVJlcXVlc3Q6OlJlcXVlc3QoRG9jTG9hZGVyKiBkbCwgQ2FjaGVkT2Jq
ZWN0ICpfb2JqZWN0LCBib29sIF9pbmNyZW1lbnRhbCkKLXsKLSAgICBvYmplY3QgPSBfb2JqZWN0
OwotICAgIG9iamVjdC0+c2V0UmVxdWVzdCh0aGlzKTsKLSAgICBpbmNyZW1lbnRhbCA9IF9pbmNy
ZW1lbnRhbDsKLSAgICBtX2RvY0xvYWRlciA9IGRsOwotICAgIG11bHRpcGFydCA9IGZhbHNlOwot
fQotCi1SZXF1ZXN0Ojp+UmVxdWVzdCgpCi17Ci0gICAgb2JqZWN0LT5zZXRSZXF1ZXN0KDApOwot
fQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotRG9jTG9hZGVyOjpE
b2NMb2FkZXIoS0hUTUxQYXJ0KiBwYXJ0LCBEb2N1bWVudEltcGwqIGRvYykKLXsKLSAgICBtX2Nh
Y2hlUG9saWN5ID0gS0lPOjpDQ19WZXJpZnk7Ci0gICAgbV9leHBpcmVEYXRlID0gMDsKLSAgICBt
X2JhdXRvbG9hZEltYWdlcyA9IHRydWU7Ci0gICAgbV9zaG93QW5pbWF0aW9ucyA9IEtIVE1MU2V0
dGluZ3M6OktBbmltYXRpb25FbmFibGVkOwotICAgIG1fcGFydCA9IHBhcnQ7Ci0gICAgbV9kb2Mg
PSBkb2M7Ci0gICAgbV9sb2FkSW5Qcm9ncmVzcyA9IGZhbHNlOwotCi0gICAgQ2FjaGU6OmluaXQo
KTsKLSAgICBDYWNoZTo6ZG9jbG9hZGVyLT5hcHBlbmQoIHRoaXMgKTsKLX0KLQotRG9jTG9hZGVy
Ojp+RG9jTG9hZGVyKCkKLXsKLSAgICBDYWNoZTo6ZG9jbG9hZGVyLT5yZW1vdmUoIHRoaXMgKTsK
LX0KLQotdm9pZCBEb2NMb2FkZXI6OnNldEV4cGlyZURhdGUodGltZV90IF9leHBpcmVEYXRlKQot
ewotICAgIG1fZXhwaXJlRGF0ZSA9IF9leHBpcmVEYXRlOwotfQogCi1ib29sIERvY0xvYWRlcjo6
bmVlZFJlbG9hZChjb25zdCBLVVJMICZmdWxsVVJMKQotewotICAgIGJvb2wgcmVsb2FkID0gZmFs
c2U7Ci0gICAgaWYgKG1fY2FjaGVQb2xpY3kgPT0gS0lPOjpDQ19WZXJpZnkpCi0gICAgewotICAg
ICAgIGlmICghbV9yZWxvYWRlZFVSTHMuY29udGFpbnMoZnVsbFVSTC51cmwoKSkpCi0gICAgICAg
ewotICAgICAgICAgIENhY2hlZE9iamVjdCAqZXhpc3RpbmcgPSBDYWNoZTo6Y2FjaGUtPmZpbmQo
ZnVsbFVSTC51cmwoKSk7Ci0gICAgICAgICAgaWYgKGV4aXN0aW5nICYmIGV4aXN0aW5nLT5pc0V4
cGlyZWQoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAgQ2FjaGU6OnJlbW92ZUNhY2hlRW50
cnkoZXhpc3RpbmcpOwotICAgICAgICAgICAgIG1fcmVsb2FkZWRVUkxzLmFwcGVuZChmdWxsVVJM
LnVybCgpKTsKLSAgICAgICAgICAgICByZWxvYWQgPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAg
ICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKChtX2NhY2hlUG9saWN5ID09IEtJTzo6Q0NfUmVsb2Fk
KSB8fCAobV9jYWNoZVBvbGljeSA9PSBLSU86OkNDX1JlZnJlc2gpKQotICAgIHsKLSAgICAgICBp
ZiAoIW1fcmVsb2FkZWRVUkxzLmNvbnRhaW5zKGZ1bGxVUkwudXJsKCkpKQotICAgICAgIHsKLSAg
ICAgICAgICBDYWNoZWRPYmplY3QgKmV4aXN0aW5nID0gQ2FjaGU6OmNhY2hlLT5maW5kKGZ1bGxV
UkwudXJsKCkpOwotICAgICAgICAgIGlmIChleGlzdGluZykKLSAgICAgICAgICB7Ci0gICAgICAg
ICAgICAgQ2FjaGU6OnJlbW92ZUNhY2hlRW50cnkoZXhpc3RpbmcpOwotICAgICAgICAgIH0KLSAg
ICAgICAgICBtX3JlbG9hZGVkVVJMcy5hcHBlbmQoZnVsbFVSTC51cmwoKSk7Ci0gICAgICAgICAg
cmVsb2FkID0gdHJ1ZTsKLSAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZWxvYWQ7Ci19Ci0K
LUNhY2hlZEltYWdlICpEb2NMb2FkZXI6OnJlcXVlc3RJbWFnZSggY29uc3QgRE9NOjpET01TdHJp
bmcgJnVybCkKLXsKLSAgICBLVVJMIGZ1bGxVUkwgPSBtX2RvYy0+Y29tcGxldGVVUkwodXJsLnFz
dHJpbmcoKSk7Ci0gICAgaWYgKCBtX3BhcnQgJiYgbV9wYXJ0LT5vbmx5TG9jYWxSZWZlcmVuY2Vz
KCkgJiYgZnVsbFVSTC5wcm90b2NvbCgpICE9ICJmaWxlIikgcmV0dXJuIDA7Ci0KLSAgICBpZiAo
S1dRQ2hlY2tJZlJlbG9hZGluZyh0aGlzKSkgewotICAgICAgICBzZXRDYWNoZVBvbGljeShLSU86
OkNDX1JlbG9hZCk7Ci0gICAgfQotCi0gICAgYm9vbCByZWxvYWQgPSBuZWVkUmVsb2FkKGZ1bGxV
UkwpOwotCi0gICAgQ2FjaGVkSW1hZ2UgKmNhY2hlZE9iamVjdCA9IENhY2hlOjpyZXF1ZXN0SW1h
Z2UodGhpcywgZnVsbFVSTCwgcmVsb2FkLCBtX2V4cGlyZURhdGUpOwotICAgIEtXUUNoZWNrQ2Fj
aGVPYmplY3RTdGF0dXModGhpcywgY2FjaGVkT2JqZWN0KTsKLSAgICByZXR1cm4gY2FjaGVkT2Jq
ZWN0OwotfQorfTsKIAotQ2FjaGVkQ1NTU3R5bGVTaGVldCAqRG9jTG9hZGVyOjpyZXF1ZXN0U3R5
bGVTaGVldCggY29uc3QgRE9NOjpET01TdHJpbmcgJnVybCwgY29uc3QgUVN0cmluZyYgY2hhcnNl
dCkKLXsKLSAgICBLVVJMIGZ1bGxVUkwgPSBtX2RvYy0+Y29tcGxldGVVUkwodXJsLnFzdHJpbmco
KSk7Ci0gICAgaWYgKCBtX3BhcnQgJiYgbV9wYXJ0LT5vbmx5TG9jYWxSZWZlcmVuY2VzKCkgJiYg
ZnVsbFVSTC5wcm90b2NvbCgpICE9ICJmaWxlIikgcmV0dXJuIDA7Ci0KLSAgICBpZiAoS1dRQ2hl
Y2tJZlJlbG9hZGluZyh0aGlzKSkgewotICAgICAgICBzZXRDYWNoZVBvbGljeShLSU86OkNDX1Jl
bG9hZCk7Ci0gICAgfQotCi0gICAgYm9vbCByZWxvYWQgPSBuZWVkUmVsb2FkKGZ1bGxVUkwpOwot
Ci0gICAgQ2FjaGVkQ1NTU3R5bGVTaGVldCAqY2FjaGVkT2JqZWN0ID0gQ2FjaGU6OnJlcXVlc3RT
dHlsZVNoZWV0KHRoaXMsIHVybCwgcmVsb2FkLCBtX2V4cGlyZURhdGUsIGNoYXJzZXQpOwotICAg
IEtXUUNoZWNrQ2FjaGVPYmplY3RTdGF0dXModGhpcywgY2FjaGVkT2JqZWN0KTsKLSAgICByZXR1
cm4gY2FjaGVkT2JqZWN0OwotfQotCi1DYWNoZWRTY3JpcHQgKkRvY0xvYWRlcjo6cmVxdWVzdFNj
cmlwdCggY29uc3QgRE9NOjpET01TdHJpbmcgJnVybCwgY29uc3QgUVN0cmluZyYgY2hhcnNldCkK
LXsKLSAgICBLVVJMIGZ1bGxVUkwgPSBtX2RvYy0+Y29tcGxldGVVUkwodXJsLnFzdHJpbmcoKSk7
Ci0gICAgaWYgKCBtX3BhcnQgJiYgbV9wYXJ0LT5vbmx5TG9jYWxSZWZlcmVuY2VzKCkgJiYgZnVs
bFVSTC5wcm90b2NvbCgpICE9ICJmaWxlIikgcmV0dXJuIDA7Ci0KLSAgICBpZiAoS1dRQ2hlY2tJ
ZlJlbG9hZGluZyh0aGlzKSkgewotICAgICAgICBzZXRDYWNoZVBvbGljeShLSU86OkNDX1JlbG9h
ZCk7Ci0gICAgfQotCi0gICAgYm9vbCByZWxvYWQgPSBuZWVkUmVsb2FkKGZ1bGxVUkwpOwotCi0g
ICAgQ2FjaGVkU2NyaXB0ICpjYWNoZWRPYmplY3QgPSBDYWNoZTo6cmVxdWVzdFNjcmlwdCh0aGlz
LCB1cmwsIHJlbG9hZCwgbV9leHBpcmVEYXRlLCBjaGFyc2V0KTsKLSAgICBLV1FDaGVja0NhY2hl
T2JqZWN0U3RhdHVzKHRoaXMsIGNhY2hlZE9iamVjdCk7Ci0gICAgcmV0dXJuIGNhY2hlZE9iamVj
dDsKLX0KLQotI2lmZGVmIEtIVE1MX1hTTFQKLUNhY2hlZFhTTFN0eWxlU2hlZXQqIERvY0xvYWRl
cjo6cmVxdWVzdFhTTFN0eWxlU2hlZXQoY29uc3QgRE9NOjpET01TdHJpbmcgJnVybCkKLXsKLSAg
ICBLVVJMIGZ1bGxVUkwgPSBtX2RvYy0+Y29tcGxldGVVUkwodXJsLnFzdHJpbmcoKSk7Ci0gICAg
Ci0gICAgaWYgKG1fcGFydCAmJiBtX3BhcnQtPm9ubHlMb2NhbFJlZmVyZW5jZXMoKSAmJiBmdWxs
VVJMLnByb3RvY29sKCkgIT0gImZpbGUiKSByZXR1cm4gMDsKLSAgICAKLSAgICBpZiAoS1dRQ2hl
Y2tJZlJlbG9hZGluZyh0aGlzKSkKLSAgICAgICAgc2V0Q2FjaGVQb2xpY3koS0lPOjpDQ19SZWxv
YWQpOwotICAgIAotICAgIGJvb2wgcmVsb2FkID0gbmVlZFJlbG9hZChmdWxsVVJMKTsKLSAgICAK
LSAgICBDYWNoZWRYU0xTdHlsZVNoZWV0ICpjYWNoZWRPYmplY3QgPSBDYWNoZTo6cmVxdWVzdFhT
TFN0eWxlU2hlZXQodGhpcywgdXJsLCByZWxvYWQsIG1fZXhwaXJlRGF0ZSk7Ci0gICAgS1dRQ2hl
Y2tDYWNoZU9iamVjdFN0YXR1cyh0aGlzLCBjYWNoZWRPYmplY3QpOwotICAgIHJldHVybiBjYWNo
ZWRPYmplY3Q7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBLSFRNTF9OT19YQkwKLUNhY2hlZFhCTERv
Y3VtZW50KiBEb2NMb2FkZXI6OnJlcXVlc3RYQkxEb2N1bWVudChjb25zdCBET006OkRPTVN0cmlu
ZyAmdXJsKQotewotICAgIEtVUkwgZnVsbFVSTCA9IG1fZG9jLT5jb21wbGV0ZVVSTCh1cmwucXN0
cmluZygpKTsKLSAgICAKLSAgICAvLyBGSVhNRTogSXMgdGhpcyByaWdodCBmb3IgWEJMPwotICAg
IGlmIChtX3BhcnQgJiYgbV9wYXJ0LT5vbmx5TG9jYWxSZWZlcmVuY2VzKCkgJiYgZnVsbFVSTC5w
cm90b2NvbCgpICE9ICJmaWxlIikgcmV0dXJuIDA7Ci0gICAgCi0gICAgaWYgKEtXUUNoZWNrSWZS
ZWxvYWRpbmcodGhpcykpIHsKLSAgICAgICAgc2V0Q2FjaGVQb2xpY3koS0lPOjpDQ19SZWxvYWQp
OwotICAgIH0KLSAgICAKLSAgICBib29sIHJlbG9hZCA9IG5lZWRSZWxvYWQoZnVsbFVSTCk7Ci0g
ICAgCi0gICAgQ2FjaGVkWEJMRG9jdW1lbnQgKmNhY2hlZE9iamVjdCA9IENhY2hlOjpyZXF1ZXN0
WEJMRG9jdW1lbnQodGhpcywgdXJsLCByZWxvYWQsIG1fZXhwaXJlRGF0ZSk7Ci0gICAgS1dRQ2hl
Y2tDYWNoZU9iamVjdFN0YXR1cyh0aGlzLCBjYWNoZWRPYmplY3QpOwotICAgIHJldHVybiBjYWNo
ZWRPYmplY3Q7Ci19Ci0jZW5kaWYKLQotdm9pZCBEb2NMb2FkZXI6OnNldEF1dG9sb2FkSW1hZ2Vz
KCBib29sIGVuYWJsZSApCi17Ci0gICAgaWYgKCBlbmFibGUgPT0gbV9iYXV0b2xvYWRJbWFnZXMg
KQotICAgICAgICByZXR1cm47Ci0KLSAgICBtX2JhdXRvbG9hZEltYWdlcyA9IGVuYWJsZTsKLQot
ICAgIGlmICggIW1fYmF1dG9sb2FkSW1hZ2VzICkgcmV0dXJuOwotCi0gICAgZm9yICggY29uc3Qg
Q2FjaGVkT2JqZWN0KiBjbz1tX2RvY09iamVjdHMuZmlyc3QoKTsgY287IGNvPW1fZG9jT2JqZWN0
cy5uZXh0KCkgKQotICAgICAgICBpZiAoIGNvLT50eXBlKCkgPT0gQ2FjaGVkT2JqZWN0OjpJbWFn
ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIENhY2hlZEltYWdlICppbWcgPSBjb25zdF9jYXN0
PENhY2hlZEltYWdlKj4oIHN0YXRpY19jYXN0PGNvbnN0IENhY2hlZEltYWdlICo+KCBjbyApICk7
Ci0KLSAgICAgICAgICAgIENhY2hlZE9iamVjdDo6U3RhdHVzIHN0YXR1cyA9IGltZy0+c3RhdHVz
KCk7Ci0gICAgICAgICAgICBpZiAoIHN0YXR1cyAhPSBDYWNoZWRPYmplY3Q6OlVua25vd24gKQot
ICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICBDYWNoZTo6bG9hZGVyKCkt
PmxvYWQodGhpcywgaW1nLCB0cnVlKTsKLSAgICAgICAgfQotfQotCi12b2lkIERvY0xvYWRlcjo6
c2V0Q2FjaGVQb2xpY3koIEtJTzo6Q2FjaGVDb250cm9sIGNhY2hlUG9saWN5ICkKLXsKLSAgICBt
X2NhY2hlUG9saWN5ID0gY2FjaGVQb2xpY3k7Ci19Ci0KLXZvaWQgRG9jTG9hZGVyOjpzZXRTaG93
QW5pbWF0aW9ucyggS0hUTUxTZXR0aW5nczo6S0FuaW1hdGlvbkFkdmljZSBzaG93QW5pbWF0aW9u
cyApCi17Ci0gICAgaWYgKCBzaG93QW5pbWF0aW9ucyA9PSBtX3Nob3dBbmltYXRpb25zICkgcmV0
dXJuOwotICAgIG1fc2hvd0FuaW1hdGlvbnMgPSBzaG93QW5pbWF0aW9uczsKLQotICAgIGNvbnN0
IENhY2hlZE9iamVjdCogY287Ci0gICAgZm9yICggY289bV9kb2NPYmplY3RzLmZpcnN0KCk7IGNv
OyBjbz1tX2RvY09iamVjdHMubmV4dCgpICkKLSAgICAgICAgaWYgKCBjby0+dHlwZSgpID09IENh
Y2hlZE9iamVjdDo6SW1hZ2UgKQotICAgICAgICB7Ci0gICAgICAgICAgICBDYWNoZWRJbWFnZSAq
aW1nID0gY29uc3RfY2FzdDxDYWNoZWRJbWFnZSo+KCBzdGF0aWNfY2FzdDxjb25zdCBDYWNoZWRJ
bWFnZSAqPiggY28gKSApOwotCi0gICAgICAgICAgICBpbWctPnNldFNob3dBbmltYXRpb25zKCBz
aG93QW5pbWF0aW9ucyApOwotICAgICAgICB9Ci19Ci0KLXZvaWQgRG9jTG9hZGVyOjpyZW1vdmVD
YWNoZWRPYmplY3QoIENhY2hlZE9iamVjdCogbyApIGNvbnN0Ci17Ci0gICAgbV9kb2NPYmplY3Rz
LnJlbW92ZVJlZiggbyApOwotfQotCi12b2lkIERvY0xvYWRlcjo6c2V0TG9hZEluUHJvZ3Jlc3Mo
Ym9vbCBsb2FkKQotewotICAgIG1fbG9hZEluUHJvZ3Jlc3MgPSBsb2FkOwotfQotCi0vLyAtLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotTG9hZGVyOjpMb2FkZXIoKSA6IFFPYmpl
Y3QoKQotewotICAgIG1fcmVxdWVzdHNQZW5kaW5nLnNldEF1dG9EZWxldGUoIHRydWUgKTsKLSAg
ICBtX3JlcXVlc3RzTG9hZGluZy5zZXRBdXRvRGVsZXRlKCB0cnVlICk7Ci0gICAga3dxID0gbmV3
IEtXUUxvYWRlcih0aGlzKTsKLX0KLQotTG9hZGVyOjp+TG9hZGVyKCkKLXsKLSAgICBkZWxldGUg
a3dxOwotfQotCi12b2lkIExvYWRlcjo6bG9hZChEb2NMb2FkZXIqIGRsLCBDYWNoZWRPYmplY3Qg
Km9iamVjdCwgYm9vbCBpbmNyZW1lbnRhbCkKLXsKLSAgICBSZXF1ZXN0ICpyZXEgPSBuZXcgUmVx
dWVzdChkbCwgb2JqZWN0LCBpbmNyZW1lbnRhbCk7Ci0gICAgbV9yZXF1ZXN0c1BlbmRpbmcuYXBw
ZW5kKHJlcSk7Ci0KLSAgICBlbWl0IHJlcXVlc3RTdGFydGVkKCByZXEtPm1fZG9jTG9hZGVyLCBy
ZXEtPm9iamVjdCApOwotCi0gICAgc2VydmVQZW5kaW5nUmVxdWVzdHMoKTsKLX0KLQotdm9pZCBM
b2FkZXI6OnNlcnZlUGVuZGluZ1JlcXVlc3RzKCkKLXsKLSAgaWYgKCBtX3JlcXVlc3RzUGVuZGlu
Zy5jb3VudCgpID09IDAgKQotICAgICAgcmV0dXJuOwotCi0gIC8vIGdldCB0aGUgZmlyc3QgcGVu
ZGluZyByZXF1ZXN0Ci0gIFJlcXVlc3QgKnJlcSA9IG1fcmVxdWVzdHNQZW5kaW5nLnRha2UoMCk7
Ci0KLSAgS1VSTCB1KHJlcS0+b2JqZWN0LT51cmwoKS5xc3RyaW5nKCkpOwotICBLSU86OlRyYW5z
ZmVySm9iKiBqb2IgPSBLSU86OmdldCggdSwgZmFsc2UsIGZhbHNlIC8qbm8gR1VJKi8sIHRydWUp
OwotICAKLSAgam9iLT5hZGRNZXRhRGF0YSgiY2FjaGUiLCBnZXRDYWNoZUNvbnRyb2xTdHJpbmco
cmVxLT5vYmplY3QtPmNhY2hlUG9saWN5KCkpKTsKLSAgaWYgKCFyZXEtPm9iamVjdC0+YWNjZXB0
KCkuaXNFbXB0eSgpKQotICAgICAgam9iLT5hZGRNZXRhRGF0YSgiYWNjZXB0IiwgcmVxLT5vYmpl
Y3QtPmFjY2VwdCgpKTsKLSAgaWYgKCByZXEtPm1fZG9jTG9hZGVyICkgIHsKLSAgICAgIEtVUkwg
ciA9IHJlcS0+bV9kb2NMb2FkZXItPmRvYygpLT5VUkwoKTsKLSAgICAgIGlmICggci5wcm90b2Nv
bCgpLnN0YXJ0c1dpdGgoICJodHRwIiApICYmIHIucGF0aCgpLmlzRW1wdHkoKSApCi0gICAgICAg
ICAgci5zZXRQYXRoKCAiLyIgKTsKLQotICAgICAgam9iLT5hZGRNZXRhRGF0YSgicmVmZXJyZXIi
LCByLnVybCgpKTsKLSAgICAgIFFTdHJpbmcgZG9tYWluID0gci5ob3N0KCk7Ci0gICAgICBpZiAo
cmVxLT5tX2RvY0xvYWRlci0+ZG9jKCktPmlzSFRNTERvY3VtZW50KCkpCi0gICAgICAgICBkb21h
aW4gPSBzdGF0aWNfY2FzdDxIVE1MRG9jdW1lbnRJbXBsKj4ocmVxLT5tX2RvY0xvYWRlci0+ZG9j
KCkpLT5kb21haW4oKS5xc3RyaW5nKCk7Ci0gICAgICBpZiAoY3Jvc3NEb21haW4odS5ob3N0KCks
IGRvbWFpbikpCi0gICAgICAgICBqb2ItPmFkZE1ldGFEYXRhKCJjcm9zcy1kb21haW4iLCAidHJ1
ZSIpOwotICB9Ci0KLSAgY29ubmVjdCggam9iLCBTSUdOQUwoIHJlc3VsdCggS0lPOjpKb2IgKiwg
TlNEYXRhICopICksIHRoaXMsIFNMT1QoIHNsb3RGaW5pc2hlZCggS0lPOjpKb2IgKiwgTlNEYXRh
ICopICkgKTsKLSAgCi0gIGNvbm5lY3QoIGpvYiwgU0lHTkFMKCBkYXRhKCBLSU86OkpvYiosIGNv
bnN0IGNoYXIgKiwgaW50KSksCi0gICAgICAgICAgIFNMT1QoIHNsb3REYXRhKCBLSU86OkpvYios
IGNvbnN0IGNoYXIgKiwgaW50KSkpOwotICBjb25uZWN0KCBqb2IsIFNJR05BTCggcmVjZWl2ZWRS
ZXNwb25zZSggS0lPOjpKb2IgKiwgTlNVUkxSZXNwb25zZSAqKSksIFNMT1QoIHNsb3RSZWNlaXZl
ZFJlc3BvbnNlKCBLSU86OkpvYiAqLCBOU1VSTFJlc3BvbnNlICopKSApOwotCi0gIGlmIChLV1FT
ZXJ2ZVJlcXVlc3QodGhpcywgcmVxLCBqb2IpKSB7Ci0gICAgICBpZiAocmVxLT5vYmplY3QtPnR5
cGUoKSA9PSBDYWNoZWRPYmplY3Q6OkltYWdlKSB7Ci0JQ2FjaGVkSW1hZ2UgKmNpID0gc3RhdGlj
X2Nhc3Q8Q2FjaGVkSW1hZ2UqPihyZXEtPm9iamVjdCk7Ci0JaWYgKGNpLT5kZWNvZGVyQ2FsbGJh
Y2soKSkgewotCSAgICBtX3JlcXVlc3RzQmFja2dyb3VuZERlY29kaW5nLmFwcGVuZChyZXEpOwot
CX0KLSAgICAgIH0KLSAgICAgIG1fcmVxdWVzdHNMb2FkaW5nLmluc2VydChqb2IsIHJlcSk7Ci0g
IH0KLX0KLQotdm9pZCBMb2FkZXI6OnNsb3RGaW5pc2hlZCggS0lPOjpKb2IqIGpvYiwgTlNEYXRh
ICphbGxEYXRhKQotewotICAgIFJlcXVlc3QgKnIgPSBtX3JlcXVlc3RzTG9hZGluZy50YWtlKCBq
b2IgKTsKLSAgICBLSU86OlRyYW5zZmVySm9iKiBqID0gc3RhdGljX2Nhc3Q8S0lPOjpUcmFuc2Zl
ckpvYio+KGpvYik7Ci0KLSAgICBpZiAoICFyICkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgQ2Fj
aGVkT2JqZWN0ICpvYmplY3QgPSByLT5vYmplY3Q7Ci0gICAgRG9jTG9hZGVyICpkb2NMb2FkZXIg
PSByLT5tX2RvY0xvYWRlcjsKLSAgICAKLSAgICBib29sIGJhY2tncm91bmRJbWFnZURlY29kaW5n
ID0gKG9iamVjdC0+dHlwZSgpID09IENhY2hlZE9iamVjdDo6SW1hZ2UgJiYgCi0Jc3RhdGljX2Nh
c3Q8Q2FjaGVkSW1hZ2UqPihvYmplY3QpLT5kZWNvZGVyQ2FsbGJhY2soKSk7Ci0JCi0gICAgaWYg
KGotPmVycm9yKCkgfHwgai0+aXNFcnJvclBhZ2UoKSkgewotICAgICAgICAvLyBVc2UgdGhlIGJh
Y2tncm91bmQgaW1hZ2UgZGVjb2RlcidzIGNhbGxiYWNrIHRvIGhhbmRsZSB0aGUgZXJyb3IuCi0g
ICAgICAgIGlmIChiYWNrZ3JvdW5kSW1hZ2VEZWNvZGluZykgewotICAgICAgICAgICAgQ2FjaGVk
SW1hZ2VDYWxsYmFjayAqY2FsbGJhY2sgPSBzdGF0aWNfY2FzdDxDYWNoZWRJbWFnZSo+KG9iamVj
dCktPmRlY29kZXJDYWxsYmFjaygpOwotICAgICAgICAgICAgY2FsbGJhY2stPmhhbmRsZUVycm9y
KCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBkb2NMb2FkZXItPnNl
dExvYWRJblByb2dyZXNzKHRydWUpOwotICAgICAgICAgICAgci0+b2JqZWN0LT5lcnJvciggam9i
LT5lcnJvcigpLCBqb2ItPmVycm9yVGV4dCgpLmFzY2lpKCkgKTsKLSAgICAgICAgICAgIGRvY0xv
YWRlci0+c2V0TG9hZEluUHJvZ3Jlc3MoZmFsc2UpOwotICAgICAgICAgICAgZW1pdCByZXF1ZXN0
RmFpbGVkKCBkb2NMb2FkZXIsIG9iamVjdCApOwotICAgICAgICAgICAgQ2FjaGU6OnJlbW92ZUNh
Y2hlRW50cnkoIG9iamVjdCApOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgewotICAgICAg
ICBkb2NMb2FkZXItPnNldExvYWRJblByb2dyZXNzKHRydWUpOwotICAgICAgICBvYmplY3QtPmRh
dGEoci0+bV9idWZmZXIsIHRydWUpOwotICAgICAgICByLT5vYmplY3QtPnNldEFsbERhdGEoYWxs
RGF0YSk7Ci0gICAgICAgIGRvY0xvYWRlci0+c2V0TG9hZEluUHJvZ3Jlc3MoZmFsc2UpOwotICAg
ICAgICAKLSAgICAgICAgLy8gTGV0IHRoZSBiYWNrZ3JvdW5kIGltYWdlIGRlY29kZXIgdHJpZ2dl
ciB0aGUgZG9uZSBzaWduYWwuCi0gICAgICAgIGlmICghYmFja2dyb3VuZEltYWdlRGVjb2Rpbmcp
Ci0gICAgICAgICAgICBlbWl0IHJlcXVlc3REb25lKCBkb2NMb2FkZXIsIG9iamVjdCApOwotCi0g
ICAgICAgIG9iamVjdC0+ZmluaXNoKCk7Ci0gICAgfQotCi0gICAgLy8gTGV0IHRoZSBiYWNrZ3Jv
dW5kIGltYWdlIGRlY29kZXIgcmVsZWFzZSB0aGUgcmVxdWVzdCB3aGVuIGl0IGlzCi0gICAgLy8g
ZmluaXNoZWQuCi0gICAgaWYgKCFiYWNrZ3JvdW5kSW1hZ2VEZWNvZGluZykgewotICAgICAgICBk
ZWxldGUgcjsKLSAgICB9Ci0KLSAgICBzZXJ2ZVBlbmRpbmdSZXF1ZXN0cygpOwotfQotCi0KLXZv
aWQgTG9hZGVyOjpzbG90UmVjZWl2ZWRSZXNwb25zZShLSU86OkpvYiogam9iLCBOU1VSTFJlc3Bv
bnNlICpyZXNwb25zZSkKLXsKLSAgICBSZXF1ZXN0ICpyID0gbV9yZXF1ZXN0c0xvYWRpbmdbam9i
XTsKLSAgICBBU1NFUlQocik7Ci0gICAgQVNTRVJUKHJlc3BvbnNlKTsKLSAgICByLT5vYmplY3Qt
PnNldFJlc3BvbnNlKHJlc3BvbnNlKTsKLSAgICByLT5vYmplY3QtPnNldEV4cGlyZURhdGUoS1dR
Q2FjaGVPYmplY3RFeHBpcmVzVGltZShyLT5tX2RvY0xvYWRlciwgcmVzcG9uc2UpLCBmYWxzZSk7
Ci0gICAgCi0gICAgUVN0cmluZyBjaHMgPSBzdGF0aWNfY2FzdDxLSU86OlRyYW5zZmVySm9iKj4o
am9iKS0+cXVlcnlNZXRhRGF0YSgiY2hhcnNldCIpOwotICAgIGlmICghY2hzLmlzTnVsbCgpKQot
ICAgICAgICByLT5vYmplY3QtPnNldENoYXJzZXQoY2hzKTsKLSAgICAKLSAgICBpZiAoci0+bXVs
dGlwYXJ0KSB7Ci0gICAgICAgIEFTU0VSVChyLT5vYmplY3QtPmlzSW1hZ2UoKSk7Ci0gICAgICAg
IHN0YXRpY19jYXN0PENhY2hlZEltYWdlICo+KHItPm9iamVjdCktPmNsZWFyKCk7Ci0gICAgICAg
IHItPm1fYnVmZmVyID0gUUJ1ZmZlcigpOwotICAgICAgICBpZiAoci0+bV9kb2NMb2FkZXItPnBh
cnQoKSkKLSAgICAgICAgICAgIHItPm1fZG9jTG9hZGVyLT5wYXJ0KCktPmNoZWNrQ29tcGxldGVk
KCk7Ci0gICAgICAgIAotICAgIH0gZWxzZSBpZiAoS1dRUmVzcG9uc2VJc011bHRpcGFydChyZXNw
b25zZSkpIHsKLSAgICAgICAgci0+bXVsdGlwYXJ0ID0gdHJ1ZTsKLSAgICAgICAgaWYgKCFyLT5v
YmplY3QtPmlzSW1hZ2UoKSkKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PEtJTzo6VHJhbnNmZXJK
b2IqPihqb2IpLT5jYW5jZWwoKTsKLSAgICB9Ci19Ci0KLQotdm9pZCBMb2FkZXI6OnNsb3REYXRh
KCBLSU86OkpvYipqb2IsIGNvbnN0IGNoYXIgKmRhdGEsIGludCBzaXplICkKLXsKLSAgICBSZXF1
ZXN0ICpyID0gbV9yZXF1ZXN0c0xvYWRpbmdbam9iXTsKLSAgICBpZighcikgewotICAgICAgICBr
ZERlYnVnKCA2MDYwICkgPDwgImdvdCBkYXRhIGZvciB1bmtub3duIHJlcXVlc3QhIiA8PCBlbmRs
OwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKCAhci0+bV9idWZmZXIuaXNPcGVu
KCkgKQotICAgICAgICByLT5tX2J1ZmZlci5vcGVuKCBJT19Xcml0ZU9ubHkgKTsKLQotICAgIHIt
Pm1fYnVmZmVyLndyaXRlQmxvY2soIGRhdGEsIHNpemUgKTsKLQotICAgIGlmIChyLT5tdWx0aXBh
cnQpCi0gICAgICAgIHItPm9iamVjdC0+ZGF0YSggci0+bV9idWZmZXIsIHRydWUgKTsgLy8gdGhl
IGxvYWRlciBkZWxpdmVycyB0aGUgZGF0YSBpbiBhIG11bHRpcGFydCBzZWN0aW9uIGFsbCBhdCBv
bmNlLCBzZW5kIGVvZgotICAgIGVsc2UgaWYoci0+aW5jcmVtZW50YWwpCi0gICAgICAgIHItPm9i
amVjdC0+ZGF0YSggci0+bV9idWZmZXIsIGZhbHNlICk7Ci19Ci0KLWludCBMb2FkZXI6Om51bVJl
cXVlc3RzKCBEb2NMb2FkZXIqIGRsICkgY29uc3QKLXsKLSAgICBpbnQgcmVzID0gMDsKLQotICAg
IFFQdHJMaXN0SXRlcmF0b3I8UmVxdWVzdD4gcEl0KCBtX3JlcXVlc3RzUGVuZGluZyApOwotICAg
IGZvciAoOyBwSXQuY3VycmVudCgpOyArK3BJdCApCi0gICAgICAgIGlmICggcEl0LmN1cnJlbnQo
KS0+bV9kb2NMb2FkZXIgPT0gZGwgKQotICAgICAgICAgICAgcmVzKys7Ci0KLSAgICBRUHRyRGlj
dEl0ZXJhdG9yPFJlcXVlc3Q+IGxJdCggbV9yZXF1ZXN0c0xvYWRpbmcgKTsKLSAgICBmb3IgKDsg
bEl0LmN1cnJlbnQoKTsgKytsSXQgKQotICAgICAgICBpZiAoIGxJdC5jdXJyZW50KCktPm1fZG9j
TG9hZGVyID09IGRsICkKLSAgICAgICAgICAgIGlmICghbEl0LmN1cnJlbnQoKS0+bXVsdGlwYXJ0
KQotICAgICAgICAgICAgICAgIHJlcysrOwotCi0gICAgUVB0ckxpc3RJdGVyYXRvcjxSZXF1ZXN0
PiBiZEl0KCBtX3JlcXVlc3RzQmFja2dyb3VuZERlY29kaW5nICk7Ci0gICAgZm9yICg7IGJkSXQu
Y3VycmVudCgpOyArK2JkSXQgKQotICAgICAgICBpZiAoIGJkSXQuY3VycmVudCgpLT5tX2RvY0xv
YWRlciA9PSBkbCApCi0gICAgICAgICAgICByZXMrKzsKLQotICAgIGlmIChkbC0+bG9hZEluUHJv
Z3Jlc3MoKSkKLSAgICAgICAgcmVzKys7Ci0gICAgICAgIAotICAgIHJldHVybiByZXM7Ci19Ci0K
LXZvaWQgTG9hZGVyOjpjYW5jZWxSZXF1ZXN0cyggRG9jTG9hZGVyKiBkbCApCi17Ci0gICAgUVB0
ckxpc3RJdGVyYXRvcjxSZXF1ZXN0PiBwSXQoIG1fcmVxdWVzdHNQZW5kaW5nICk7Ci0gICAgd2hp
bGUgKCBwSXQuY3VycmVudCgpICkKLSAgICB7Ci0gICAgICAgIGlmIChwSXQuY3VycmVudCgpLT5t
X2RvY0xvYWRlciA9PSBkbCkgewotICAgICAgICAgICAgQ2FjaGU6OnJlbW92ZUNhY2hlRW50cnko
IHBJdC5jdXJyZW50KCktPm9iamVjdCApOwotICAgICAgICAgICAgbV9yZXF1ZXN0c1BlbmRpbmcu
cmVtb3ZlKCBwSXQgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICArK3BJ
dDsKLSAgICB9Ci0KLSAgICBRUHRyRGljdEl0ZXJhdG9yPFJlcXVlc3Q+IGxJdCggbV9yZXF1ZXN0
c0xvYWRpbmcgKTsKLSAgICB3aGlsZSAoIGxJdC5jdXJyZW50KCkgKQotICAgIHsKLSAgICAgICAg
aWYgKGxJdC5jdXJyZW50KCktPm1fZG9jTG9hZGVyID09IGRsKSB7Ci0gICAgICAgICAgICBLSU86
OkpvYiAqam9iID0gc3RhdGljX2Nhc3Q8S0lPOjpKb2IgKj4oIGxJdC5jdXJyZW50S2V5KCkgKTsK
LSAgICAgICAgICAgIENhY2hlOjpyZW1vdmVDYWNoZUVudHJ5KCBsSXQuY3VycmVudCgpLT5vYmpl
Y3QgKTsKLSAgICAgICAgICAgIG1fcmVxdWVzdHNMb2FkaW5nLnJlbW92ZSggbEl0LmN1cnJlbnRL
ZXkoKSApOwotICAgICAgICAgICAgam9iLT5raWxsKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxz
ZQotICAgICAgICAgICAgKytsSXQ7Ci0gICAgfQotCi0gICAgUVB0ckxpc3RJdGVyYXRvcjxSZXF1
ZXN0PiBiZEl0KCBtX3JlcXVlc3RzQmFja2dyb3VuZERlY29kaW5nICk7Ci0gICAgd2hpbGUgKGJk
SXQuY3VycmVudCgpKSB7Ci0gICAgICAgIGlmIChiZEl0LmN1cnJlbnQoKS0+bV9kb2NMb2FkZXIg
PT0gZGwpIHsKLSAgICAgICAgICAgIENhY2hlOjpyZW1vdmVDYWNoZUVudHJ5KCBiZEl0LmN1cnJl
bnQoKS0+b2JqZWN0ICk7Ci0gICAgICAgICAgICBtX3JlcXVlc3RzQmFja2dyb3VuZERlY29kaW5n
LnJlbW92ZSggYmRJdCApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgICsr
YmRJdDsKLSAgICB9Ci19Ci0KLXZvaWQgTG9hZGVyOjpyZW1vdmVCYWNrZ3JvdW5kRGVjb2RpbmdS
ZXF1ZXN0IChSZXF1ZXN0ICpyKQotewotICAgIGJvb2wgcHJlc2VudCA9IG1fcmVxdWVzdHNCYWNr
Z3JvdW5kRGVjb2RpbmcuY29udGFpbnNSZWYocik7Ci0gICAgaWYgKHByZXNlbnQpIHsKLQltX3Jl
cXVlc3RzQmFja2dyb3VuZERlY29kaW5nLnJlbW92ZSAocik7Ci0gICAgfQotfQotCi1LSU86Okpv
YiAqTG9hZGVyOjpqb2JGb3JSZXF1ZXN0KCBjb25zdCBET006OkRPTVN0cmluZyAmdXJsICkgY29u
c3QKLXsKLSAgICBRUHRyRGljdEl0ZXJhdG9yPFJlcXVlc3Q+IGl0KCBtX3JlcXVlc3RzTG9hZGlu
ZyApOwotCi0gICAgZm9yICg7IGl0LmN1cnJlbnQoKTsgKytpdCApCi0gICAgewotICAgICAgICBD
YWNoZWRPYmplY3QgKm9iaiA9IGl0LmN1cnJlbnQoKS0+b2JqZWN0OwotCi0gICAgICAgIGlmICgg
b2JqICYmIG9iai0+dXJsKCkgPT0gdXJsICkKLSAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2Fz
dDxLSU86OkpvYiAqPiggaXQuY3VycmVudEtleSgpICk7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7
Ci19Ci0KLQotYm9vbCBMb2FkZXI6OmlzS0hUTUxMb2FkZXIoKSBjb25zdAotewotICAgIHJldHVy
biB0cnVlOwotfQotCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi1MUlVMaXN0OjpMUlVM
aXN0KCkKLTptX2hlYWQoMCksIG1fdGFpbCgwKSAKLXt9Ci0KLUxSVUxpc3Q6On5MUlVMaXN0KCkK
LXt9Ci0KLVFEaWN0PENhY2hlZE9iamVjdD4gKkNhY2hlOjpjYWNoZSA9IDA7Ci1RUHRyTGlzdDxE
b2NMb2FkZXI+KiBDYWNoZTo6ZG9jbG9hZGVyID0gMDsKLUxvYWRlciAqQ2FjaGU6Om1fbG9hZGVy
ID0gMDsKLQotaW50IENhY2hlOjptYXhTaXplID0gREVGQ0FDSEVTSVpFOwotaW50IENhY2hlOjpt
YXhDYWNoZWFibGUgPSBNQVhDQUNIRUFCTEU7Ci1pbnQgQ2FjaGU6OmZsdXNoQ291bnQgPSAwOwot
Ci1RUGl4bWFwICpDYWNoZTo6bnVsbFBpeG1hcCA9IDA7Ci1RUGl4bWFwICpDYWNoZTo6YnJva2Vu
UGl4bWFwID0gMDsKLQotQ2FjaGVkT2JqZWN0ICpDYWNoZTo6bV9oZWFkT2ZVbmNhY2hlYWJsZUxp
c3QgPSAwOwotaW50IENhY2hlOjptX3RvdGFsU2l6ZU9mTFJVTGlzdHMgPSAwOwotaW50IENhY2hl
OjptX2NvdW50T2ZMUlVBbmRVbmNhY2hlYWJsZUxpc3RzOwotTFJVTGlzdCAqQ2FjaGU6Om1fTFJV
TGlzdHMgPSAwOwotCi12b2lkIENhY2hlOjppbml0KCkKLXsKLSAgICBpZiAoICFjYWNoZSApCi0g
ICAgICAgIGNhY2hlID0gbmV3IFFEaWN0PENhY2hlZE9iamVjdD4oNDAxLCB0cnVlKTsKLQotICAg
IGlmICggIWRvY2xvYWRlciApCi0gICAgICAgIGRvY2xvYWRlciA9IG5ldyBRUHRyTGlzdDxEb2NM
b2FkZXI+OwotCi0gICAgaWYgKCAhbnVsbFBpeG1hcCApCi0gICAgICAgIG51bGxQaXhtYXAgPSBu
ZXcgUVBpeG1hcDsKLQotICAgIGlmICggIWJyb2tlblBpeG1hcCApCi0gICAgICAgIGJyb2tlblBp
eG1hcCA9IEtXUUxvYWRQaXhtYXAoIm1pc3NpbmdfaW1hZ2UiKTsKLQotICAgIGlmICggIW1fbG9h
ZGVyICkKLSAgICAgICAgbV9sb2FkZXIgPSBuZXcgTG9hZGVyKCk7Ci19Ci0KLXZvaWQgQ2FjaGU6
OmNsZWFyKCkKLXsKLSAgICBpZiAoIWNhY2hlKQotICAgICAgICByZXR1cm47Ci0KLSAgICBjYWNo
ZS0+c2V0QXV0b0RlbGV0ZSggdHJ1ZSApOwotICAgIGRlbGV0ZSBjYWNoZTsgY2FjaGUgPSAwOwot
ICAgIGRlbGV0ZSBudWxsUGl4bWFwOyBudWxsUGl4bWFwID0gMDsKLSAgICBkZWxldGUgYnJva2Vu
UGl4bWFwOyBicm9rZW5QaXhtYXAgPSAwOwotICAgIGRlbGV0ZSBtX2xvYWRlcjsgICBtX2xvYWRl
ciA9IDA7Ci0gICAgZGVsZXRlIGRvY2xvYWRlcjsgZG9jbG9hZGVyID0gMDsKLX0KLQotQ2FjaGVk
SW1hZ2UgKkNhY2hlOjpyZXF1ZXN0SW1hZ2UoIERvY0xvYWRlciogZGwsIGNvbnN0IERPTVN0cmlu
ZyAmIHVybCwgYm9vbCByZWxvYWQsIHRpbWVfdCBfZXhwaXJlRGF0ZSApCi17Ci0gICAgLy8gdGhp
cyBicmluZ3MgdGhlIF91cmwgdG8gYSBzdGFuZGFyZCBmb3JtLi4uCi0gICAgS1VSTCBrdXJsOwot
ICAgIGlmIChkbCkKLSAgICAgICAga3VybCA9IGRsLT5tX2RvYy0+Y29tcGxldGVVUkwoIHVybC5x
c3RyaW5nKCkgKTsKLSAgICBlbHNlCi0gICAgICAgIGt1cmwgPSB1cmwucXN0cmluZygpOwotICAg
IHJldHVybiByZXF1ZXN0SW1hZ2UoZGwsIGt1cmwsIHJlbG9hZCwgX2V4cGlyZURhdGUpOwotfQot
Ci1DYWNoZWRJbWFnZSAqQ2FjaGU6OnJlcXVlc3RJbWFnZSggRG9jTG9hZGVyKiBkbCwgY29uc3Qg
S1VSTCAmIHVybCwgYm9vbCByZWxvYWQsIHRpbWVfdCBfZXhwaXJlRGF0ZSApCi17Ci0gICAgS0lP
OjpDYWNoZUNvbnRyb2wgY2FjaGVQb2xpY3k7Ci0gICAgaWYgKGRsKQotICAgICAgICBjYWNoZVBv
bGljeSA9IGRsLT5jYWNoZVBvbGljeSgpOwotICAgIGVsc2UKLSAgICAgICAgY2FjaGVQb2xpY3kg
PSBLSU86OkNDX1ZlcmlmeTsKLQotICAgIC8vIENoZWNraW5nIGlmIHRoZSBVUkwgaXMgbWFsZm9y
bWVkIGlzIGxvdHMgb2YgZXh0cmEgd29yayBmb3IgbGl0dGxlIGJlbmVmaXQuCi0KLSAgICBpZiAo
IWRsLT5kb2MoKS0+c2hvdWxkQ3JlYXRlUmVuZGVyZXJzKCkpewotICAgICAgICByZXR1cm4gMDsK
LSAgICB9Ci0KLSAgICBDYWNoZWRPYmplY3QgKm8gPSAwOwotICAgIGlmICghcmVsb2FkKQotICAg
ICAgICBvID0gY2FjaGUtPmZpbmQodXJsLnVybCgpKTsKLSAgICBpZighbykKLSAgICB7Ci0jaWZk
ZWYgQ0FDSEVfREVCVUcKLSAgICAgICAga2REZWJ1ZyggNjA2MCApIDw8ICJDYWNoZTogbmV3OiAi
IDw8IHVybC51cmwoKSA8PCBlbmRsOwotI2VuZGlmCi0gICAgICAgIENhY2hlZEltYWdlICppbSA9
IG5ldyBDYWNoZWRJbWFnZShkbCwgdXJsLnVybCgpLCBjYWNoZVBvbGljeSwgX2V4cGlyZURhdGUp
OwotICAgICAgICBpZiAoIGRsICYmIGRsLT5hdXRvbG9hZEltYWdlcygpICkgQ2FjaGU6OmxvYWRl
cigpLT5sb2FkKGRsLCBpbSwgdHJ1ZSk7Ci0gICAgICAgIGlmIChjYWNoZURpc2FibGVkKQotICAg
ICAgICAgICAgaW0tPnNldEZyZWUodHJ1ZSk7Ci0gICAgICAgIGVsc2UgewotICAgICAgICBjYWNo
ZS0+aW5zZXJ0KCB1cmwudXJsKCksIGltICk7Ci0gICAgICAgIG1vdmVUb0hlYWRPZkxSVUxpc3Qo
aW0pOwotICAgICAgICB9Ci0gICAgICAgIG8gPSBpbTsKLSAgICB9Ci0KLSAgICAKLSAgICBpZihv
LT50eXBlKCkgIT0gQ2FjaGVkT2JqZWN0OjpJbWFnZSkKLSAgICB7Ci0jaWZkZWYgQ0FDSEVfREVC
VUcKLSAgICAgICAga2REZWJ1ZyggNjA2MCApIDw8ICJDYWNoZTo6SW50ZXJuYWwgRXJyb3IgaW4g
cmVxdWVzdEltYWdlIHVybD0iIDw8IGt1cmwudXJsKCkgPDwgIiEiIDw8IGVuZGw7Ci0jZW5kaWYK
LSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0jaWZkZWYgQ0FDSEVfREVCVUcKLSAgICBpZigg
by0+c3RhdHVzKCkgPT0gQ2FjaGVkT2JqZWN0OjpQZW5kaW5nICkKLSAgICAgICAga2REZWJ1Zygg
NjA2MCApIDw8ICJDYWNoZTogbG9hZGluZyBpbiBwcm9ncmVzczogIiA8PCBrdXJsLnVybCgpIDw8
IGVuZGw7Ci0gICAgZWxzZQotICAgICAgICBrZERlYnVnKCA2MDYwICkgPDwgIkNhY2hlOiB1c2lu
ZyBjYWNoZWQ6ICIgPDwga3VybC51cmwoKSA8PCAiLCBzdGF0dXMgIiA8PCBvLT5zdGF0dXMoKSA8
PCBlbmRsOwotI2VuZGlmCi0KLSAgICBtb3ZlVG9IZWFkT2ZMUlVMaXN0KG8pOwotICAgIGlmICgg
ZGwgKSB7Ci0gICAgICAgIGRsLT5tX2RvY09iamVjdHMucmVtb3ZlKCBvICk7Ci0gICAgICAgIGlm
ICghY2FjaGVEaXNhYmxlZCkKLSAgICAgICAgZGwtPm1fZG9jT2JqZWN0cy5hcHBlbmQoIG8gKTsK
LSAgICB9Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PENhY2hlZEltYWdlICo+KG8pOwotfQotCi1D
YWNoZWRDU1NTdHlsZVNoZWV0ICpDYWNoZTo6cmVxdWVzdFN0eWxlU2hlZXQoIERvY0xvYWRlciog
ZGwsIGNvbnN0IERPTVN0cmluZyAmIHVybCwgYm9vbCByZWxvYWQsIHRpbWVfdCBfZXhwaXJlRGF0
ZSwgY29uc3QgUVN0cmluZyYgY2hhcnNldCkKLXsKLSAgICAvLyB0aGlzIGJyaW5ncyB0aGUgX3Vy
bCB0byBhIHN0YW5kYXJkIGZvcm0uLi4KLSAgICBLVVJMIGt1cmw7Ci0gICAgS0lPOjpDYWNoZUNv
bnRyb2wgY2FjaGVQb2xpY3k7Ci0gICAgaWYgKCBkbCApCi0gICAgewotICAgICAgICBrdXJsID0g
ZGwtPm1fZG9jLT5jb21wbGV0ZVVSTCggdXJsLnFzdHJpbmcoKSApOwotICAgICAgICBjYWNoZVBv
bGljeSA9IGRsLT5jYWNoZVBvbGljeSgpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAg
ICBrdXJsID0gdXJsLnFzdHJpbmcoKTsKLSAgICAgICAgY2FjaGVQb2xpY3kgPSBLSU86OkNDX1Zl
cmlmeTsKLSAgICB9Ci0KLSAgICAvLyBDaGVja2luZyBpZiB0aGUgVVJMIGlzIG1hbGZvcm1lZCBp
cyBsb3RzIG9mIGV4dHJhIHdvcmsgZm9yIGxpdHRsZSBiZW5lZml0LgotCi0gICAgQ2FjaGVkT2Jq
ZWN0ICpvID0gY2FjaGUtPmZpbmQoa3VybC51cmwoKSk7Ci0gICAgaWYoIW8pCi0gICAgewotI2lm
ZGVmIENBQ0hFX0RFQlVHCi0gICAgICAgIGtkRGVidWcoIDYwNjAgKSA8PCAiQ2FjaGU6IG5ldzog
IiA8PCBrdXJsLnVybCgpIDw8IGVuZGw7Ci0jZW5kaWYKLSAgICAgICAgQ2FjaGVkQ1NTU3R5bGVT
aGVldCAqc2hlZXQgPSBuZXcgQ2FjaGVkQ1NTU3R5bGVTaGVldChkbCwga3VybC51cmwoKSwgY2Fj
aGVQb2xpY3ksIF9leHBpcmVEYXRlLCBjaGFyc2V0KTsKLSAgICAgICAgaWYgKGNhY2hlRGlzYWJs
ZWQpCi0gICAgICAgICAgICBzaGVldC0+c2V0RnJlZSh0cnVlKTsKLSAgICAgICAgZWxzZSB7Ci0g
ICAgICAgIGNhY2hlLT5pbnNlcnQoIGt1cmwudXJsKCksIHNoZWV0ICk7Ci0gICAgICAgIG1vdmVU
b0hlYWRPZkxSVUxpc3Qoc2hlZXQpOwotICAgICAgICB9Ci0gICAgICAgIG8gPSBzaGVldDsKLSAg
ICB9Ci0KLSAgICAKLSAgICBpZihvLT50eXBlKCkgIT0gQ2FjaGVkT2JqZWN0OjpDU1NTdHlsZVNo
ZWV0KQotICAgIHsKLSNpZmRlZiBDQUNIRV9ERUJVRwotICAgICAgICBrZERlYnVnKCA2MDYwICkg
PDwgIkNhY2hlOjpJbnRlcm5hbCBFcnJvciBpbiByZXF1ZXN0U3R5bGVTaGVldCB1cmw9IiA8PCBr
dXJsLnVybCgpIDw8ICIhIiA8PCBlbmRsOwotI2VuZGlmCi0gICAgICAgIHJldHVybiAwOwotICAg
IH0KLQotI2lmZGVmIENBQ0hFX0RFQlVHCi0gICAgaWYoIG8tPnN0YXR1cygpID09IENhY2hlZE9i
amVjdDo6UGVuZGluZyApCi0gICAgICAgIGtkRGVidWcoIDYwNjAgKSA8PCAiQ2FjaGU6IGxvYWRp
bmcgaW4gcHJvZ3Jlc3M6ICIgPDwga3VybC51cmwoKSA8PCBlbmRsOwotICAgIGVsc2UKLSAgICAg
ICAga2REZWJ1ZyggNjA2MCApIDw8ICJDYWNoZTogdXNpbmcgY2FjaGVkOiAiIDw8IGt1cmwudXJs
KCkgPDwgZW5kbDsKLSNlbmRpZgotCi0gICAgbW92ZVRvSGVhZE9mTFJVTGlzdChvKTsKLSAgICBp
ZiAoIGRsICkgewotICAgICAgICBkbC0+bV9kb2NPYmplY3RzLnJlbW92ZSggbyApOwotICAgICAg
ICBpZiAoIWNhY2hlRGlzYWJsZWQpCi0gICAgICAgIGRsLT5tX2RvY09iamVjdHMuYXBwZW5kKCBv
ICk7Ci0gICAgfQotICAgIHJldHVybiBzdGF0aWNfY2FzdDxDYWNoZWRDU1NTdHlsZVNoZWV0ICo+
KG8pOwotfQotCi12b2lkIENhY2hlOjpwcmVsb2FkU3R5bGVTaGVldCggY29uc3QgUVN0cmluZyAm
dXJsLCBjb25zdCBRU3RyaW5nICZzdHlsZXNoZWV0X2RhdGEpCi17Ci0gICAgQ2FjaGVkT2JqZWN0
ICpvID0gY2FjaGUtPmZpbmQodXJsKTsKLSAgICBpZihvKQotICAgICAgICByZW1vdmVDYWNoZUVu
dHJ5KG8pOwotCi0gICAgQ2FjaGVkQ1NTU3R5bGVTaGVldCAqc3R5bGVzaGVldCA9IG5ldyBDYWNo
ZWRDU1NTdHlsZVNoZWV0KHVybCwgc3R5bGVzaGVldF9kYXRhKTsKLSAgICBjYWNoZS0+aW5zZXJ0
KCB1cmwsIHN0eWxlc2hlZXQgKTsKLX0KLQotQ2FjaGVkU2NyaXB0ICpDYWNoZTo6cmVxdWVzdFNj
cmlwdCggRG9jTG9hZGVyKiBkbCwgY29uc3QgRE9NOjpET01TdHJpbmcgJnVybCwgYm9vbCByZWxv
YWQsIHRpbWVfdCBfZXhwaXJlRGF0ZSwgY29uc3QgUVN0cmluZyYgY2hhcnNldCkKLXsKLSAgICAv
LyB0aGlzIGJyaW5ncyB0aGUgX3VybCB0byBhIHN0YW5kYXJkIGZvcm0uLi4KLSAgICBLVVJMIGt1
cmw7Ci0gICAgS0lPOjpDYWNoZUNvbnRyb2wgY2FjaGVQb2xpY3k7Ci0gICAgaWYgKCBkbCApCi0g
ICAgewotICAgICAgICBrdXJsID0gZGwtPm1fZG9jLT5jb21wbGV0ZVVSTCggdXJsLnFzdHJpbmco
KSApOwotICAgICAgICBjYWNoZVBvbGljeSA9IGRsLT5jYWNoZVBvbGljeSgpOwotICAgIH0KLSAg
ICBlbHNlCi0gICAgewotICAgICAgICBrdXJsID0gdXJsLnFzdHJpbmcoKTsKLSAgICAgICAgY2Fj
aGVQb2xpY3kgPSBLSU86OkNDX1ZlcmlmeTsKLSAgICB9Ci0KLSAgICAvLyBDaGVja2luZyBpZiB0
aGUgVVJMIGlzIG1hbGZvcm1lZCBpcyBsb3RzIG9mIGV4dHJhIHdvcmsgZm9yIGxpdHRsZSBiZW5l
Zml0LgotCi0gICAgQ2FjaGVkT2JqZWN0ICpvID0gY2FjaGUtPmZpbmQoa3VybC51cmwoKSk7Ci0g
ICAgaWYoIW8pCi0gICAgewotI2lmZGVmIENBQ0hFX0RFQlVHCi0gICAgICAgIGtkRGVidWcoIDYw
NjAgKSA8PCAiQ2FjaGU6IG5ldzogIiA8PCBrdXJsLnVybCgpIDw8IGVuZGw7Ci0jZW5kaWYKLSAg
ICAgICAgQ2FjaGVkU2NyaXB0ICpzY3JpcHQgPSBuZXcgQ2FjaGVkU2NyaXB0KGRsLCBrdXJsLnVy
bCgpLCBjYWNoZVBvbGljeSwgX2V4cGlyZURhdGUsIGNoYXJzZXQpOwotICAgICAgICBpZiAoY2Fj
aGVEaXNhYmxlZCkKLSAgICAgICAgICAgIHNjcmlwdC0+c2V0RnJlZSh0cnVlKTsKLSAgICAgICAg
ZWxzZSB7Ci0gICAgICAgIGNhY2hlLT5pbnNlcnQoIGt1cmwudXJsKCksIHNjcmlwdCApOwotICAg
ICAgICBtb3ZlVG9IZWFkT2ZMUlVMaXN0KHNjcmlwdCk7Ci0gICAgICAgIH0KLSAgICAgICAgbyA9
IHNjcmlwdDsKLSAgICB9Ci0KLSAgICAKLSAgICBpZighKG8tPnR5cGUoKSA9PSBDYWNoZWRPYmpl
Y3Q6OlNjcmlwdCkpCi0gICAgewotI2lmZGVmIENBQ0hFX0RFQlVHCi0gICAgICAgIGtkRGVidWco
IDYwNjAgKSA8PCAiQ2FjaGU6OkludGVybmFsIEVycm9yIGluIHJlcXVlc3RTY3JpcHQgdXJsPSIg
PDwga3VybC51cmwoKSA8PCAiISIgPDwgZW5kbDsKLSNlbmRpZgotICAgICAgICByZXR1cm4gMDsK
LSAgICB9Ci0gICAgCi0gICAgCi0jaWZkZWYgQ0FDSEVfREVCVUcKLSAgICBpZiggby0+c3RhdHVz
KCkgPT0gQ2FjaGVkT2JqZWN0OjpQZW5kaW5nICkKLSAgICAgICAga2REZWJ1ZyggNjA2MCApIDw8
ICJDYWNoZTogbG9hZGluZyBpbiBwcm9ncmVzczogIiA8PCBrdXJsLnVybCgpIDw8IGVuZGw7Ci0g
ICAgZWxzZQotICAgICAgICBrZERlYnVnKCA2MDYwICkgPDwgIkNhY2hlOiB1c2luZyBjYWNoZWQ6
ICIgPDwga3VybC51cmwoKSA8PCBlbmRsOwotI2VuZGlmCi0KLSAgICBtb3ZlVG9IZWFkT2ZMUlVM
aXN0KG8pOwotICAgIGlmICggZGwgKSB7Ci0gICAgICAgIGRsLT5tX2RvY09iamVjdHMucmVtb3Zl
KCBvICk7Ci0gICAgICAgIGlmICghY2FjaGVEaXNhYmxlZCkKLSAgICAgICAgZGwtPm1fZG9jT2Jq
ZWN0cy5hcHBlbmQoIG8gKTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PENhY2hlZFNj
cmlwdCAqPihvKTsKLX0KLQotdm9pZCBDYWNoZTo6cHJlbG9hZFNjcmlwdCggY29uc3QgUVN0cmlu
ZyAmdXJsLCBjb25zdCBRU3RyaW5nICZzY3JpcHRfZGF0YSkKLXsKLSAgICBDYWNoZWRPYmplY3Qg
Km8gPSBjYWNoZS0+ZmluZCh1cmwpOwotICAgIGlmKG8pCi0gICAgICAgIHJlbW92ZUNhY2hlRW50
cnkobyk7Ci0KLSAgICBDYWNoZWRTY3JpcHQgKnNjcmlwdCA9IG5ldyBDYWNoZWRTY3JpcHQodXJs
LCBzY3JpcHRfZGF0YSk7Ci0gICAgY2FjaGUtPmluc2VydCggdXJsLCBzY3JpcHQgKTsKLX0KLQot
I2lmZGVmIEtIVE1MX1hTTFQKLUNhY2hlZFhTTFN0eWxlU2hlZXQqIENhY2hlOjpyZXF1ZXN0WFNM
U3R5bGVTaGVldChEb2NMb2FkZXIqIGRsLCBjb25zdCBET01TdHJpbmcgJiB1cmwsIGJvb2wgcmVs
b2FkLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0
aW1lX3QgX2V4cGlyZURhdGUpCi17Ci0gICAgLy8gdGhpcyBicmluZ3MgdGhlIF91cmwgdG8gYSBz
dGFuZGFyZCBmb3JtLi4uCi0gICAgS1VSTCBrdXJsOwotICAgIEtJTzo6Q2FjaGVDb250cm9sIGNh
Y2hlUG9saWN5OwotICAgIGlmIChkbCkgewotICAgICAgICBrdXJsID0gZGwtPm1fZG9jLT5jb21w
bGV0ZVVSTCh1cmwucXN0cmluZygpKTsKLSAgICAgICAgY2FjaGVQb2xpY3kgPSBkbC0+Y2FjaGVQ
b2xpY3koKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGt1cmwgPSB1cmwucXN0cmluZygp
OwotICAgICAgICBjYWNoZVBvbGljeSA9IEtJTzo6Q0NfVmVyaWZ5OwotICAgIH0KLSAgICAKLSAg
ICAvLyBDaGVja2luZyBpZiB0aGUgVVJMIGlzIG1hbGZvcm1lZCBpcyBsb3RzIG9mIGV4dHJhIHdv
cmsgZm9yIGxpdHRsZSBiZW5lZml0LgotICAgIAotICAgIENhY2hlZE9iamVjdCAqbyA9IGNhY2hl
LT5maW5kKGt1cmwudXJsKCkpOwotICAgIGlmICghbykgewotI2lmZGVmIENBQ0hFX0RFQlVHCi0g
ICAgICAgIGtkRGVidWcoIDYwNjAgKSA8PCAiQ2FjaGU6IG5ldzogIiA8PCBrdXJsLnVybCgpIDw8
IGVuZGw7Ci0jZW5kaWYKLSAgICAgICAgQ2FjaGVkWFNMU3R5bGVTaGVldCogZG9jID0gbmV3IENh
Y2hlZFhTTFN0eWxlU2hlZXQoZGwsIGt1cmwudXJsKCksIGNhY2hlUG9saWN5LCBfZXhwaXJlRGF0
ZSk7Ci0gICAgICAgIGlmIChjYWNoZURpc2FibGVkKQotICAgICAgICAgICAgZG9jLT5zZXRGcmVl
KHRydWUpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGNhY2hlLT5pbnNlcnQoa3VybC51
cmwoKSwgZG9jKTsKLSAgICAgICAgICAgIG1vdmVUb0hlYWRPZkxSVUxpc3QoZG9jKTsKLSAgICAg
ICAgfQotICAgICAgICBvID0gZG9jOwotICAgIH0KLSAgICAKLSAgICAKLSAgICBpZiAoby0+dHlw
ZSgpICE9IENhY2hlZE9iamVjdDo6WFNMU3R5bGVTaGVldCkgewotI2lmZGVmIENBQ0hFX0RFQlVH
Ci0gICAgICAgIGtkRGVidWcoIDYwNjAgKSA8PCAiQ2FjaGU6OkludGVybmFsIEVycm9yIGluIHJl
cXVlc3RYU0xTdHlsZVNoZWV0IHVybD0iIDw8IGt1cmwudXJsKCkgPDwgIiEiIDw8IGVuZGw7Ci0j
ZW5kaWYKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIAotI2lmZGVmIENBQ0hFX0RFQlVH
Ci0gICAgaWYgKG8tPnN0YXR1cygpID09IENhY2hlZE9iamVjdDo6UGVuZGluZykKLSAgICAgICAg
a2REZWJ1ZyggNjA2MCApIDw8ICJDYWNoZTogbG9hZGluZyBpbiBwcm9ncmVzczogIiA8PCBrdXJs
LnVybCgpIDw8IGVuZGw7Ci0gICAgZWxzZQotICAgICAgICBrZERlYnVnKCA2MDYwICkgPDwgIkNh
Y2hlOiB1c2luZyBjYWNoZWQ6ICIgPDwga3VybC51cmwoKSA8PCBlbmRsOwotI2VuZGlmCi0gICAg
Ci0gICAgbW92ZVRvSGVhZE9mTFJVTGlzdChvKTsKLSAgICBpZiAoZGwpIHsKLSAgICAgICAgZGwt
Pm1fZG9jT2JqZWN0cy5yZW1vdmUoIG8gKTsKLSAgICAgICAgaWYgKCFjYWNoZURpc2FibGVkKQot
ICAgICAgICAgICAgZGwtPm1fZG9jT2JqZWN0cy5hcHBlbmQoIG8gKTsKLSAgICB9Ci0gICAgcmV0
dXJuIHN0YXRpY19jYXN0PENhY2hlZFhTTFN0eWxlU2hlZXQqPihvKTsKLX0KLSNlbmRpZgotCi0j
aWZuZGVmIEtIVE1MX05PX1hCTAotQ2FjaGVkWEJMRG9jdW1lbnQqIENhY2hlOjpyZXF1ZXN0WEJM
RG9jdW1lbnQoRG9jTG9hZGVyKiBkbCwgY29uc3QgRE9NU3RyaW5nICYgdXJsLCBib29sIHJlbG9h
ZCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lX3Qg
X2V4cGlyZURhdGUpCi17Ci0gICAgLy8gdGhpcyBicmluZ3MgdGhlIF91cmwgdG8gYSBzdGFuZGFy
ZCBmb3JtLi4uCi0gICAgS1VSTCBrdXJsOwotICAgIEtJTzo6Q2FjaGVDb250cm9sIGNhY2hlUG9s
aWN5OwotICAgIGlmIChkbCkgewotICAgICAgICBrdXJsID0gZGwtPm1fZG9jLT5jb21wbGV0ZVVS
TCh1cmwucXN0cmluZygpKTsKLSAgICAgICAgY2FjaGVQb2xpY3kgPSBkbC0+Y2FjaGVQb2xpY3ko
KTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGt1cmwgPSB1cmwucXN0cmluZygpOwotICAg
ICAgICBjYWNoZVBvbGljeSA9IEtJTzo6Q0NfVmVyaWZ5OwotICAgIH0KLSAgICAKLSAgICAvLyBD
aGVja2luZyBpZiB0aGUgVVJMIGlzIG1hbGZvcm1lZCBpcyBsb3RzIG9mIGV4dHJhIHdvcmsgZm9y
IGxpdHRsZSBiZW5lZml0LgotICAgIAotICAgIENhY2hlZE9iamVjdCAqbyA9IGNhY2hlLT5maW5k
KGt1cmwudXJsKCkpOwotICAgIGlmKCFvKQotICAgIHsKLSNpZmRlZiBDQUNIRV9ERUJVRwotICAg
ICAgICBrZERlYnVnKCA2MDYwICkgPDwgIkNhY2hlOiBuZXc6ICIgPDwga3VybC51cmwoKSA8PCBl
bmRsOwotI2VuZGlmCi0gICAgICAgIENhY2hlZFhCTERvY3VtZW50KiBkb2MgPSBuZXcgQ2FjaGVk
WEJMRG9jdW1lbnQoZGwsIGt1cmwudXJsKCksIGNhY2hlUG9saWN5LCBfZXhwaXJlRGF0ZSk7Ci0g
ICAgICAgIGlmIChjYWNoZURpc2FibGVkKQotICAgICAgICAgICAgZG9jLT5zZXRGcmVlKHRydWUp
OwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGNhY2hlLT5pbnNlcnQoa3VybC51cmwoKSwg
ZG9jKTsKLSAgICAgICAgICAgIG1vdmVUb0hlYWRPZkxSVUxpc3QoZG9jKTsKLSAgICAgICAgfQot
ICAgICAgICBvID0gZG9jOwotICAgIH0KLSAgICAKLSAgICAKLSAgICBpZihvLT50eXBlKCkgIT0g
Q2FjaGVkT2JqZWN0OjpYQkwpCi0gICAgewotI2lmZGVmIENBQ0hFX0RFQlVHCi0gICAgICAgIGtk
RGVidWcoIDYwNjAgKSA8PCAiQ2FjaGU6OkludGVybmFsIEVycm9yIGluIHJlcXVlc3RYQkxEb2N1
bWVudCB1cmw9IiA8PCBrdXJsLnVybCgpIDw8ICIhIiA8PCBlbmRsOwotI2VuZGlmCi0gICAgICAg
IHJldHVybiAwOwotICAgIH0KLSAgICAKLSNpZmRlZiBDQUNIRV9ERUJVRwotICAgIGlmKCBvLT5z
dGF0dXMoKSA9PSBDYWNoZWRPYmplY3Q6OlBlbmRpbmcgKQotICAgICAgICBrZERlYnVnKCA2MDYw
ICkgPDwgIkNhY2hlOiBsb2FkaW5nIGluIHByb2dyZXNzOiAiIDw8IGt1cmwudXJsKCkgPDwgZW5k
bDsKLSAgICBlbHNlCi0gICAgICAgIGtkRGVidWcoIDYwNjAgKSA8PCAiQ2FjaGU6IHVzaW5nIGNh
Y2hlZDogIiA8PCBrdXJsLnVybCgpIDw8IGVuZGw7Ci0jZW5kaWYKLSAgICAKLSAgICBtb3ZlVG9I
ZWFkT2ZMUlVMaXN0KG8pOwotICAgIGlmICggZGwgKSB7Ci0gICAgICAgIGRsLT5tX2RvY09iamVj
dHMucmVtb3ZlKCBvICk7Ci0gICAgICAgIGlmICghY2FjaGVEaXNhYmxlZCkKLSAgICAgICAgICAg
IGRsLT5tX2RvY09iamVjdHMuYXBwZW5kKCBvICk7Ci0gICAgfQotICAgIHJldHVybiBzdGF0aWNf
Y2FzdDxDYWNoZWRYQkxEb2N1bWVudCo+KG8pOwotfQotI2VuZGlmCi0KLXZvaWQgQ2FjaGU6OmZs
dXNoKGJvb2wgZm9yY2UpCi17Ci0gICAgaWYgKGZvcmNlKQotICAgICAgIGZsdXNoQ291bnQgPSAw
OwotICAgIC8vIERvbid0IGZsdXNoIGZvciBldmVyeSBpbWFnZS4KLSAgICBpZiAobV9jb3VudE9m
TFJVQW5kVW5jYWNoZWFibGVMaXN0cyA8IGZsdXNoQ291bnQpCi0gICAgICAgcmV0dXJuOwotCi0g
ICAgaW5pdCgpOwotCi0gICAgd2hpbGUgKG1faGVhZE9mVW5jYWNoZWFibGVMaXN0KQotICAgICAg
ICByZW1vdmVDYWNoZUVudHJ5KG1faGVhZE9mVW5jYWNoZWFibGVMaXN0KTsKLQotICAgIGZvciAo
aW50IGkgPSBNQVhfTFJVX0xJU1RTLTE7IGk+PTA7IGktLSkgewotICAgICAgICBpZiAobV90b3Rh
bFNpemVPZkxSVUxpc3RzIDw9IG1heFNpemUpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAg
ICAgIAotICAgICAgICB3aGlsZSAobV90b3RhbFNpemVPZkxSVUxpc3RzID4gbWF4U2l6ZSAmJiBt
X0xSVUxpc3RzW2ldLm1fdGFpbCkKLSAgICAgICAgICAgIHJlbW92ZUNhY2hlRW50cnkobV9MUlVM
aXN0c1tpXS5tX3RhaWwpOwotICAgIH0KLQotICAgIGZsdXNoQ291bnQgPSBtX2NvdW50T2ZMUlVB
bmRVbmNhY2hlYWJsZUxpc3RzKzEwOyAvLyBGbHVzaCBhZ2FpbiB3aGVuIHRoZSBjYWNoZSBoYXMg
Z3Jvd24uCi19Ci0KLQotdm9pZCBDYWNoZTo6c2V0U2l6ZSggaW50IGJ5dGVzICkKLXsKLSAgICBt
YXhTaXplID0gYnl0ZXM7Ci0gICAgbWF4Q2FjaGVhYmxlID0ga01heChtYXhTaXplIC8gMTI4LCBN
QVhDQUNIRUFCTEUpOwotCi0gICAgLy8gbWF5IGJlIHdlIG5lZWQgdG8gY2xlYXIgcGFydHMgb2Yg
dGhlIGNhY2hlCi0gICAgZmx1c2hDb3VudCA9IDA7Ci0gICAgZmx1c2godHJ1ZSk7Ci19Ci0KLXZv
aWQgQ2FjaGU6OnJlbW92ZUNhY2hlRW50cnkoIENhY2hlZE9iamVjdCAqb2JqZWN0ICkKLXsKLSAg
UVN0cmluZyBrZXkgPSBvYmplY3QtPnVybCgpLnFzdHJpbmcoKTsKLQotICAvLyB0aGlzIGluZGlj
YXRlcyB0aGUgZGVyZWYoKSBtZXRob2Qgb2YgQ2FjaGVkT2JqZWN0IHRvIGRlbGV0ZSBpdHNlbGYg
d2hlbiB0aGUgcmVmZXJlbmNlIGNvdW50ZXIKLSAgLy8gZHJvcHMgZG93biB0byB6ZXJvCi0gIG9i
amVjdC0+c2V0RnJlZSggdHJ1ZSApOwotCi0gIGNhY2hlLT5yZW1vdmUoIGtleSApOwotICByZW1v
dmVGcm9tTFJVTGlzdChvYmplY3QpOwotCi0gIGNvbnN0IERvY0xvYWRlciogZGw7Ci0gIGZvciAo
IGRsPWRvY2xvYWRlci0+Zmlyc3QoKTsgZGw7IGRsPWRvY2xvYWRlci0+bmV4dCgpICkKLSAgICAg
IGRsLT5yZW1vdmVDYWNoZWRPYmplY3QoIG9iamVjdCApOwotCi0gIGlmICggb2JqZWN0LT5jYW5E
ZWxldGUoKSApCi0gICAgIGRlbGV0ZSBvYmplY3Q7Ci19Ci0KLSNkZWZpbmUgRkFTVF9MT0cyKF9s
b2cyLF9uKSAgIFwKLSAgICAgIHVuc2lnbmVkIGludCBqXyA9ICh1bnNpZ25lZCBpbnQpKF9uKTsg
ICBcCi0gICAgICAoX2xvZzIpID0gMDsgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGlmICgo
al8pICYgKChqXyktMSkpICAgICAgICAgICAgXAotICAgICAgKF9sb2cyKSArPSAxOyAgICAgICAg
ICAgICAgIFwKLSAgICAgIGlmICgoal8pID4+IDE2KSAgICAgICAgICAgICAgICAgXAotICAgICAg
KF9sb2cyKSArPSAxNiwgKGpfKSA+Pj0gMTY7IFwKLSAgICAgIGlmICgoal8pID4+IDgpICAgICAg
ICAgICAgICAgICAgXAotICAgICAgKF9sb2cyKSArPSA4LCAoal8pID4+PSA4OyAgIFwKLSAgICAg
IGlmICgoal8pID4+IDQpICAgICAgICAgICAgICAgICAgXAotICAgICAgKF9sb2cyKSArPSA0LCAo
al8pID4+PSA0OyAgIFwKLSAgICAgIGlmICgoal8pID4+IDIpICAgICAgICAgICAgICAgICAgXAot
ICAgICAgKF9sb2cyKSArPSAyLCAoal8pID4+PSAyOyAgIFwKLSAgICAgIGlmICgoal8pID4+IDEp
ICAgICAgICAgICAgICAgICAgXAotICAgICAgKF9sb2cyKSArPSAxOwotCi1pbnQgRmFzdExvZzIo
dW5zaWduZWQgaW50IGkpIHsKLSAgICBpbnQgbG9nMjsKLSAgICBGQVNUX0xPRzIobG9nMixpKTsK
LSAgICByZXR1cm4gbG9nMjsKLX0KLQotTFJVTGlzdCogQ2FjaGU6OmdldExSVUxpc3RGb3IoQ2Fj
aGVkT2JqZWN0KiBvKQotewotICAgIGludCBhY2Nlc3NDb3VudCA9IG8tPmFjY2Vzc0NvdW50KCk7
Ci0gICAgaW50IHF1ZXVlSW5kZXg7Ci0gICAgaWYgKGFjY2Vzc0NvdW50ID09IDApIHsKLSAgICAg
ICAgcXVldWVJbmRleCA9IDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaW50IHNpemVMb2cgPSBG
YXN0TG9nMihvLT5zaXplKCkpOwotICAgICAgICBxdWV1ZUluZGV4ID0gc2l6ZUxvZy9vLT5hY2Nl
c3NDb3VudCgpIC0gMTsKLSAgICAgICAgaWYgKHF1ZXVlSW5kZXggPCAwKQotICAgICAgICAgICAg
cXVldWVJbmRleCA9IDA7Ci0gICAgICAgIGlmIChxdWV1ZUluZGV4ID49IE1BWF9MUlVfTElTVFMp
Ci0gICAgICAgICAgICBxdWV1ZUluZGV4ID0gTUFYX0xSVV9MSVNUUy0xOwotICAgIH0KLSAgICBp
ZiAobV9MUlVMaXN0cyA9PSAwKSB7Ci0gICAgICAgIG1fTFJVTGlzdHMgPSBuZXcgTFJVTGlzdCBb
TUFYX0xSVV9MSVNUU107Ci0gICAgfQotICAgIHJldHVybiAmbV9MUlVMaXN0c1txdWV1ZUluZGV4
XTsKLX0KLQotdm9pZCBDYWNoZTo6cmVtb3ZlRnJvbUxSVUxpc3QoQ2FjaGVkT2JqZWN0ICpvYmpl
Y3QpCi17Ci0gICAgQ2FjaGVkT2JqZWN0ICpuZXh0ID0gb2JqZWN0LT5tX25leHRJbkxSVUxpc3Q7
Ci0gICAgQ2FjaGVkT2JqZWN0ICpwcmV2ID0gb2JqZWN0LT5tX3ByZXZJbkxSVUxpc3Q7Ci0gICAg
Ym9vbCB1bmNhY2hlYWJsZSA9IG9iamVjdC0+c3RhdHVzKCkgPT0gQ2FjaGVkT2JqZWN0OjpVbmNh
Y2hlYWJsZTsKLSAgICAKLSAgICBMUlVMaXN0KiBsaXN0ID0gdW5jYWNoZWFibGUgPyAwIDogZ2V0
TFJVTGlzdEZvcihvYmplY3QpOwotICAgIENhY2hlZE9iamVjdCAqJmhlYWQgPSB1bmNhY2hlYWJs
ZSA/IG1faGVhZE9mVW5jYWNoZWFibGVMaXN0IDogbGlzdC0+bV9oZWFkOwotICAgIAotICAgIGlm
IChuZXh0ID09IDAgJiYgcHJldiA9PSAwICYmIGhlYWQgIT0gb2JqZWN0KSB7Ci0gICAgICAgIHJl
dHVybjsKLSAgICB9Ci0gICAgCi0gICAgb2JqZWN0LT5tX25leHRJbkxSVUxpc3QgPSAwOwotICAg
IG9iamVjdC0+bV9wcmV2SW5MUlVMaXN0ID0gMDsKLSAgICAKLSAgICBpZiAobmV4dCkKLSAgICAg
ICAgbmV4dC0+bV9wcmV2SW5MUlVMaXN0ID0gcHJldjsKLSAgICBlbHNlIGlmICghdW5jYWNoZWFi
bGUgJiYgbGlzdC0+bV90YWlsID09IG9iamVjdCkKLSAgICAgICAgbGlzdC0+bV90YWlsID0gcHJl
djsKLQotICAgIGlmIChwcmV2KQotICAgICAgICBwcmV2LT5tX25leHRJbkxSVUxpc3QgPSBuZXh0
OwotICAgIGVsc2UgaWYgKGhlYWQgPT0gb2JqZWN0KQotICAgICAgICBoZWFkID0gbmV4dDsKLSAg
ICAKLSAgICAtLW1fY291bnRPZkxSVUFuZFVuY2FjaGVhYmxlTGlzdHM7Ci0gICAgCi0gICAgaWYg
KCF1bmNhY2hlYWJsZSkKLSAgICAgICAgbV90b3RhbFNpemVPZkxSVUxpc3RzIC09IG9iamVjdC0+
c2l6ZSgpOwotfQotCi12b2lkIENhY2hlOjptb3ZlVG9IZWFkT2ZMUlVMaXN0KENhY2hlZE9iamVj
dCAqb2JqZWN0KQotewotICAgIGluc2VydEluTFJVTGlzdChvYmplY3QpOwotfQotCi12b2lkIENh
Y2hlOjppbnNlcnRJbkxSVUxpc3QoQ2FjaGVkT2JqZWN0ICpvYmplY3QpCi17Ci0gICAgcmVtb3Zl
RnJvbUxSVUxpc3Qob2JqZWN0KTsKLSAgICAKLSAgICBpZiAoIW9iamVjdC0+YWxsb3dJbkxSVUxp
c3QoKSkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIExSVUxpc3QqIGxpc3QgPSBnZXRMUlVM
aXN0Rm9yKG9iamVjdCk7Ci0gICAgCi0gICAgYm9vbCB1bmNhY2hlYWJsZSA9IG9iamVjdC0+c3Rh
dHVzKCkgPT0gQ2FjaGVkT2JqZWN0OjpVbmNhY2hlYWJsZTsKLSAgICBDYWNoZWRPYmplY3QgKiZo
ZWFkID0gdW5jYWNoZWFibGUgPyBtX2hlYWRPZlVuY2FjaGVhYmxlTGlzdCA6IGxpc3QtPm1faGVh
ZDsKLQotICAgIG9iamVjdC0+bV9uZXh0SW5MUlVMaXN0ID0gaGVhZDsKLSAgICBpZiAoaGVhZCkK
LSAgICAgICAgaGVhZC0+bV9wcmV2SW5MUlVMaXN0ID0gb2JqZWN0OwotICAgIGhlYWQgPSBvYmpl
Y3Q7Ci0gICAgCi0gICAgaWYgKG9iamVjdC0+bV9uZXh0SW5MUlVMaXN0ID09IDAgJiYgIXVuY2Fj
aGVhYmxlKQotICAgICAgICBsaXN0LT5tX3RhaWwgPSBvYmplY3Q7Ci0gICAgCi0gICAgKyttX2Nv
dW50T2ZMUlVBbmRVbmNhY2hlYWJsZUxpc3RzOwotICAgIAotICAgIGlmICghdW5jYWNoZWFibGUp
Ci0gICAgICAgIG1fdG90YWxTaXplT2ZMUlVMaXN0cyArPSBvYmplY3QtPnNpemUoKTsKLX0KLQot
Ym9vbCBDYWNoZTo6YWRqdXN0U2l6ZShDYWNoZWRPYmplY3QgKm9iamVjdCwgaW50IGRlbHRhKQot
ewotICAgIGlmIChvYmplY3QtPnN0YXR1cygpID09IENhY2hlZE9iamVjdDo6VW5jYWNoZWFibGUp
Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGlmIChvYmplY3QtPm1fbmV4dEluTFJVTGlz
dCA9PSAwICYmIG9iamVjdC0+bV9wcmV2SW5MUlVMaXN0ID09IDAgJiYKLSAgICAgICAgZ2V0TFJV
TGlzdEZvcihvYmplY3QpLT5tX2hlYWQgIT0gb2JqZWN0KQotICAgICAgICByZXR1cm4gZmFsc2U7
Ci0gICAgCi0gICAgbV90b3RhbFNpemVPZkxSVUxpc3RzICs9IGRlbHRhOwotICAgIHJldHVybiBk
ZWx0YSAhPSAwOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LQotCi1DYWNoZWRPYmplY3RDbGllbnQgKkNhY2hlZE9iamVjdENsaWVudFdhbGtlcjo6bmV4dCgp
Ci17Ci0gICAgLy8gT25seSBhZHZhbmNlIGlmIHdlIGFscmVhZHkgcmV0dXJuZWQgdGhpcyBpdGVt
LgotICAgIC8vIFRoaXMgaGFuZGxlcyBjYXNlcyB3aGVyZSB0aGUgY3VycmVudCBpdGVtIGlzIHJl
bW92ZWQsIGFuZCBwcmV2ZW50cyB1cyBmcm9tIHNraXBwaW5nIHRoZSBuZXh0IGl0ZW0uCi0gICAg
Ly8gVGhlIGl0ZXJhdG9yIGF1dG9tYXRpY2FsbHkgZ2V0cyBhZHZhbmNlZCB0byB0aGUgbmV4dCBp
dGVtLCBhbmQgd2UgbWFrZSBzdXJlIHdlIHJldHVybiBpdC4KLSAgICBpZiAoX2N1cnJlbnQgPT0g
X2l0ZXJhdG9yLmN1cnJlbnQoKSkKLSAgICAgICAgKytfaXRlcmF0b3I7Ci0gICAgX2N1cnJlbnQg
PSBfaXRlcmF0b3IuY3VycmVudCgpOwotICAgIHJldHVybiBfY3VycmVudDsKLX0KLQotLy8gLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQ2FjaGVkT2JqZWN0Q2xpZW50
Ojp+Q2FjaGVkT2JqZWN0Q2xpZW50KCkgeyB9Ci12b2lkIENhY2hlZE9iamVjdENsaWVudDo6c2V0
UGl4bWFwKGNvbnN0IFFQaXhtYXAgJiwgY29uc3QgUVJlY3QmLCBDYWNoZWRJbWFnZSAqKSB7fQot
dm9pZCBDYWNoZWRPYmplY3RDbGllbnQ6OnNldFN0eWxlU2hlZXQoY29uc3QgRE9NOjpET01TdHJp
bmcgJi8qdXJsKi8sIGNvbnN0IERPTTo6RE9NU3RyaW5nICYvKnNoZWV0Ki8pIHt9Ci0jaWZuZGVm
IEtIVE1MX05PX1hCTAotdm9pZCBDYWNoZWRPYmplY3RDbGllbnQ6OnNldFhCTERvY3VtZW50KGNv
bnN0IERPTTo6RE9NU3RyaW5nJiB1cmwsIFhCTDo6WEJMRG9jdW1lbnRJbXBsKiBkb2MpIHt9Ci0j
ZW5kaWYKLXZvaWQgQ2FjaGVkT2JqZWN0Q2xpZW50Ojpub3RpZnlGaW5pc2hlZChDYWNoZWRPYmpl
Y3QgKiAvKmZpbmlzaGVkT2JqKi8pIHt9Ci0KLUNhY2hlOjpTdGF0aXN0aWNzIENhY2hlOjpnZXRT
dGF0aXN0aWNzKCkKLXsKLSAgICBTdGF0aXN0aWNzIHN0YXRzOwotCi0gICAgaWYgKCFjYWNoZSkK
LSAgICAgICAgcmV0dXJuIHN0YXRzOwotCi0gICAgUURpY3RJdGVyYXRvcjxDYWNoZWRPYmplY3Q+
IGkoKmNhY2hlKTsKLSAgICBmb3IgKGkudG9GaXJzdCgpOyBpLmN1cnJlbnQoKTsgKytpKSB7Ci0g
ICAgICAgIENhY2hlZE9iamVjdCAqbyA9IGkuY3VycmVudCgpOwotICAgICAgICBzd2l0Y2ggKG8t
PnR5cGUoKSkgewotICAgICAgICAgICAgY2FzZSBDYWNoZWRPYmplY3Q6OkltYWdlOgotICAgICAg
ICAgICAgICAgIHN0YXRzLmltYWdlcy5jb3VudCsrOwotICAgICAgICAgICAgICAgIHN0YXRzLmlt
YWdlcy5zaXplICs9IG8tPnNpemUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAg
ICAgICAgY2FzZSBDYWNoZWRPYmplY3Q6OkNTU1N0eWxlU2hlZXQ6Ci0gICAgICAgICAgICAgICAg
c3RhdHMuc3R5bGVTaGVldHMuY291bnQrKzsKLSAgICAgICAgICAgICAgICBzdGF0cy5zdHlsZVNo
ZWV0cy5zaXplICs9IG8tPnNpemUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAg
ICAgICAgY2FzZSBDYWNoZWRPYmplY3Q6OlNjcmlwdDoKLSAgICAgICAgICAgICAgICBzdGF0cy5z
Y3JpcHRzLmNvdW50Kys7Ci0gICAgICAgICAgICAgICAgc3RhdHMuc2NyaXB0cy5zaXplICs9IG8t
PnNpemUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSNpZmRlZiBLSFRNTF9YU0xUCi0gICAg
ICAgICAgICBjYXNlIENhY2hlZE9iamVjdDo6WFNMU3R5bGVTaGVldDoKLSAgICAgICAgICAgICAg
ICBzdGF0cy54c2xTdHlsZVNoZWV0cy5jb3VudCsrOwotICAgICAgICAgICAgICAgIHN0YXRzLnhz
bFN0eWxlU2hlZXRzLnNpemUgKz0gby0+c2l6ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwog
I2VuZGlmCi0jaWZuZGVmIEtIVE1MX05PX1hCTAotICAgICAgICAgICAgY2FzZSBDYWNoZWRPYmpl
Y3Q6OlhCTDoKLSAgICAgICAgICAgICAgICBzdGF0cy54YmxEb2NzLmNvdW50Kys7Ci0gICAgICAg
ICAgICAgICAgc3RhdHMueGJsRG9jcy5zaXplICs9IG8tPnNpemUoKTsKLSAgICAgICAgICAgICAg
ICBicmVhazsKLSNlbmRpZgotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBz
dGF0cy5vdGhlci5jb3VudCsrOwotICAgICAgICAgICAgICAgIHN0YXRzLm90aGVyLnNpemUgKz0g
by0+c2l6ZSgpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiBzdGF0czsKLX0K
LQotdm9pZCBDYWNoZTo6Zmx1c2hBbGwoKQotewotICAgIGlmICghY2FjaGUpCi0gICAgICAgIHJl
dHVybjsKLQotICAgIGZvciAoOzspIHsKLSAgICAgICAgUURpY3RJdGVyYXRvcjxDYWNoZWRPYmpl
Y3Q+IGkoKmNhY2hlKTsKLSAgICAgICAgQ2FjaGVkT2JqZWN0ICpvID0gaS50b0ZpcnN0KCk7Ci0g
ICAgICAgIGlmICghbykKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICByZW1vdmVDYWNoZUVu
dHJ5KG8pOwotICAgIH0KLX0KLQotdm9pZCBDYWNoZTo6c2V0Q2FjaGVEaXNhYmxlZChib29sIGRp
c2FibGVkKQotewotICAgIGNhY2hlRGlzYWJsZWQgPSBkaXNhYmxlZDsKLSAgICBpZiAoZGlzYWJs
ZWQpCi0gICAgICAgIGZsdXNoQWxsKCk7Ci19CkluZGV4OiBtaXNjL0NhY2hlZEltYWdlQ2FsbGJh
Y2suY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIG1pc2MvQ2FjaGVkSW1hZ2VDYWxsYmFjay5jcHAJKHJldmlz
aW9uIDExOTQ4KQorKysgbWlzYy9DYWNoZWRJbWFnZUNhbGxiYWNrLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtMjUsMTcgKzI1LDEyIEBACiAgICAgcGFnZXMgZnJvbSB0aGUgd2ViLiBJdCBoYXMgYSBt
ZW1vcnkgY2FjaGUgZm9yIHRoZXNlIG9iamVjdHMuCiAqLwogCi0jdW5kZWYgQ0FDSEVfREVCVUcK
LS8vI2RlZmluZSBDQUNIRV9ERUJVRwogI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgPGFz
c2VydC5oPgotCisjaW5jbHVkZSAiQ2FjaGVkSW1hZ2VDYWxsYmFjay5oIgorI2luY2x1ZGUgIkNh
Y2hlLmgiCiAjaW5jbHVkZSAibG9hZGVyLmgiCi0KLS8vIHVwIHRvIHdoaWNoIHNpemUgaXMgYSBw
aWN0dXJlIGZvciBzdXJlIGNhY2hlYWJsZQotI2RlZmluZSBNQVhDQUNIRUFCTEUgNDAqMTAyNAot
Ly8gZGVmYXVsdCBjYWNoZSBzaXplCi0jZGVmaW5lIERFRkNBQ0hFU0laRSA0MDk2KjEwMjQKKyNp
bmNsdWRlICJDYWNoZWRJbWFnZS5oIgorI2luY2x1ZGUgIlJlcXVlc3QuaCIKIAogI2luY2x1ZGUg
PHFhc3luY2lvLmg+CiAjaW5jbHVkZSA8cXBhaW50ZXIuaD4KQEAgLTQzLDMxOCArMzgsMTMgQEAK
ICNpbmNsdWRlIDxraW8vam9iLmg+CiAjaW5jbHVkZSA8a2lvL2pvYmNsYXNzZXMuaD4KICNpbmNs
dWRlIDxraW1hZ2Vpby5oPgotI2luY2x1ZGUgPGtjaGFyc2V0cy5oPgogI2luY2x1ZGUgPGtkZWJ1
Zy5oPgotI2luY2x1ZGUgImtodG1sX2ZhY3RvcnkuaCIKLSNpbmNsdWRlICJraHRtbF9wYXJ0Lmgi
CiAjaW5jbHVkZSAiZGVjb2Rlci5oIgogCi0jaW5jbHVkZSAiaHRtbC9odG1sX2RvY3VtZW50aW1w
bC5oIgotI2luY2x1ZGUgImNzcy9jc3Nfc3R5bGVzaGVldGltcGwuaCIKLQotI2lmbmRlZiBLSFRN
TF9OT19YQkwKLSNpbmNsdWRlICJ4YmwveGJsX2RvY2ltcGwuaCIKLSNlbmRpZgotCi0jaW5jbHVk
ZSA8a3htbGNvcmUvQXNzZXJ0aW9ucy5oPgotI2luY2x1ZGUgIktXUUxvYWRlci5oIgotCi11c2lu
ZyBuYW1lc3BhY2Uga2h0bWw7CiB1c2luZyBuYW1lc3BhY2UgRE9NOwogCi1zdGF0aWMgYm9vbCBj
YWNoZURpc2FibGVkOwotCi0vLyBDYWxsIHRoaXMgIndhbGtlciIgaW5zdGVhZCBvZiBpdGVyYXRv
ciBzbyBwZW9wbGUgd29uJ3QgZXhwZWN0IFF0IG9yIFNUTC1zdHlsZSBpdGVyYXRvciBpbnRlcmZh
Y2UuCi0vLyBKdXN0IGtlZXAgY2FsbGluZyBuZXh0KCkgb24gdGhpcy4gSXQncyBzYWZlIGZyb20g
ZGVsZXRpb25zIG9mIHRoZSBjdXJyZW50IGl0ZW0KLWNsYXNzIENhY2hlZE9iamVjdENsaWVudFdh
bGtlciB7Ci1wdWJsaWM6Ci0gICAgQ2FjaGVkT2JqZWN0Q2xpZW50V2Fsa2VyKGNvbnN0IFFQdHJE
aWN0PENhY2hlZE9iamVjdENsaWVudD4gJmNsaWVudHMpIDogX2N1cnJlbnQoMCksIF9pdGVyYXRv
cihjbGllbnRzKSB7IH0KLSAgICBDYWNoZWRPYmplY3RDbGllbnQgKm5leHQoKTsKLXByaXZhdGU6
Ci0gICAgQ2FjaGVkT2JqZWN0Q2xpZW50ICpfY3VycmVudDsKLSAgICBRUHRyRGljdEl0ZXJhdG9y
PENhY2hlZE9iamVjdENsaWVudD4gX2l0ZXJhdG9yOwotfTsKLQotQ2FjaGVkT2JqZWN0Ojp+Q2Fj
aGVkT2JqZWN0KCkKLXsKLSAgICBpZihtX2RlbGV0ZWQpIGFib3J0KCk7Ci0gICAgQ2FjaGU6OnJl
bW92ZUZyb21MUlVMaXN0KHRoaXMpOwotICAgIG1fZGVsZXRlZCA9IHRydWU7Ci0gICAgc2V0UmVz
cG9uc2UoMCk7Ci0gICAgc2V0QWxsRGF0YSgwKTsKLX0KLQotdm9pZCBDYWNoZWRPYmplY3Q6OmZp
bmlzaCgpCi17Ci0gICAgaWYgKG1fc2l6ZSA+IENhY2hlOjptYXhDYWNoZWFibGVPYmplY3RTaXpl
KCkpCi0gICAgICAgIG1fc3RhdHVzID0gVW5jYWNoZWFibGU7Ci0gICAgZWxzZQotICAgICAgICBt
X3N0YXR1cyA9IENhY2hlZDsKLSAgICBLVVJMIHVybChtX3VybC5xc3RyaW5nKCkpOwotICAgIGlm
IChtX2V4cGlyZURhdGVDaGFuZ2VkICYmIHVybC5wcm90b2NvbCgpLnN0YXJ0c1dpdGgoImh0dHAi
KSkKLSAgICAgICAgbV9leHBpcmVEYXRlQ2hhbmdlZCA9IGZhbHNlOwotfQotCi12b2lkIENhY2hl
ZE9iamVjdDo6c2V0RXhwaXJlRGF0ZSh0aW1lX3QgX2V4cGlyZURhdGUsIGJvb2wgY2hhbmdlSHR0
cENhY2hlKQotewotICAgIGlmICggX2V4cGlyZURhdGUgPT0gbV9leHBpcmVEYXRlKQotICAgICAg
ICByZXR1cm47Ci0KLSAgICBpZiAobV9zdGF0dXMgPT0gVW5jYWNoZWFibGUgfHwgbV9zdGF0dXMg
PT0gQ2FjaGVkKQotICAgIHsKLSAgICAgICAgZmluaXNoKCk7Ci0gICAgfQotICAgIG1fZXhwaXJl
RGF0ZSA9IF9leHBpcmVEYXRlOwotICAgIGlmIChjaGFuZ2VIdHRwQ2FjaGUgJiYgbV9leHBpcmVE
YXRlKQotICAgICAgIG1fZXhwaXJlRGF0ZUNoYW5nZWQgPSB0cnVlOwotfQotCi1ib29sIENhY2hl
ZE9iamVjdDo6aXNFeHBpcmVkKCkgY29uc3QKLXsKLSAgICBpZiAoIW1fZXhwaXJlRGF0ZSkgcmV0
dXJuIGZhbHNlOwotICAgIHRpbWVfdCBub3cgPSB0aW1lKDApOwotICAgIHJldHVybiAoZGlmZnRp
bWUobm93LCBtX2V4cGlyZURhdGUpID49IDApOwotfQotCi12b2lkIENhY2hlZE9iamVjdDo6c2V0
UmVxdWVzdChSZXF1ZXN0ICpfcmVxdWVzdCkKLXsKLSAgICBpZiAoIF9yZXF1ZXN0ICYmICFtX3Jl
cXVlc3QgKQotICAgICAgICBtX3N0YXR1cyA9IFBlbmRpbmc7Ci0gICAgbV9yZXF1ZXN0ID0gX3Jl
cXVlc3Q7Ci0gICAgaWYgKGNhbkRlbGV0ZSgpICYmIG1fZnJlZSkKLSAgICAgICAgZGVsZXRlIHRo
aXM7Ci0gICAgZWxzZSBpZiAoYWxsb3dJbkxSVUxpc3QoKSkKLSAgICAgICAgQ2FjaGU6Omluc2Vy
dEluTFJVTGlzdCh0aGlzKTsKLX0KLQotdm9pZCBDYWNoZWRPYmplY3Q6OnJlZihDYWNoZWRPYmpl
Y3RDbGllbnQgKmMpCi17Ci0gICAgbV9jbGllbnRzLmluc2VydChjLCBjKTsKLSAgICBDYWNoZTo6
cmVtb3ZlRnJvbUxSVUxpc3QodGhpcyk7Ci0gICAgaW5jcmVhc2VBY2Nlc3NDb3VudCgpOwotfQot
Ci12b2lkIENhY2hlZE9iamVjdDo6ZGVyZWYoQ2FjaGVkT2JqZWN0Q2xpZW50ICpjKQotewotICAg
IG1fY2xpZW50cy5yZW1vdmUoYyk7Ci0gICAgaWYgKGFsbG93SW5MUlVMaXN0KCkpCi0gICAgICAg
IENhY2hlOjppbnNlcnRJbkxSVUxpc3QodGhpcyk7Ci19Ci0KLXZvaWQgQ2FjaGVkT2JqZWN0Ojpz
ZXRTaXplKGludCBzaXplKQotewotICAgIGJvb2wgc2l6ZUNoYW5nZWQgPSBDYWNoZTo6YWRqdXN0
U2l6ZSh0aGlzLCBzaXplIC0gbV9zaXplKTsKLQotICAgIC8vIFRoZSBvYmplY3QgbXVzdCBub3cg
YmUgbW92ZWQgdG8gYSBkaWZmZXJlbnQgcXVldWUsIHNpbmNlIGl0cyBzaXplIGhhcyBiZWVuIGNo
YW5nZWQuCi0gICAgaWYgKHNpemVDaGFuZ2VkICYmIGFsbG93SW5MUlVMaXN0KCkpCi0gICAgICAg
IENhY2hlOjpyZW1vdmVGcm9tTFJVTGlzdCh0aGlzKTsKLQotICAgIG1fc2l6ZSA9IHNpemU7Ci0g
ICAgCi0gICAgaWYgKHNpemVDaGFuZ2VkICYmIGFsbG93SW5MUlVMaXN0KCkpCi0gICAgICAgIENh
Y2hlOjppbnNlcnRJbkxSVUxpc3QodGhpcyk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0KLQotQ2FjaGVkQ1NTU3R5bGVTaGVldDo6Q2FjaGVkQ1NTU3R5bGVTaGVl
dChEb2NMb2FkZXIqIGRsLCBjb25zdCBET01TdHJpbmcgJnVybCwgS0lPOjpDYWNoZUNvbnRyb2wg
X2NhY2hlUG9saWN5LCB0aW1lX3QgX2V4cGlyZURhdGUsIGNvbnN0IFFTdHJpbmcmIGNoYXJzZXQp
Ci0gICAgOiBDYWNoZWRPYmplY3QodXJsLCBDU1NTdHlsZVNoZWV0LCBfY2FjaGVQb2xpY3ksIF9l
eHBpcmVEYXRlKSwgbV9jb2RlYygwKQotewotICAgIC8vIEl0J3MgY3NzIHdlIHdhbnQuCi0gICAg
c2V0QWNjZXB0KCJ0ZXh0L2NzcyIpOwotICAgIC8vIGxvYWQgdGhlIGZpbGUKLSAgICBDYWNoZTo6
bG9hZGVyKCktPmxvYWQoZGwsIHRoaXMsIGZhbHNlKTsKLSAgICBtX2xvYWRpbmcgPSB0cnVlOwot
ICAgIGlmICghY2hhcnNldC5pc0VtcHR5KCkpCi0JbV9jb2RlYyA9IFFUZXh0Q29kZWM6OmNvZGVj
Rm9yTmFtZShjaGFyc2V0LmxhdGluMSgpKTsKLSAgICBpZiAoIW1fY29kZWMpCi0gICAgICAgIG1f
Y29kZWMgPSBRVGV4dENvZGVjOjpjb2RlY0Zvck5hbWUoImlzbzg4NTktMSIpOwotfQotCi1DYWNo
ZWRDU1NTdHlsZVNoZWV0OjpDYWNoZWRDU1NTdHlsZVNoZWV0KGNvbnN0IERPTVN0cmluZyAmdXJs
LCBjb25zdCBRU3RyaW5nICZzdHlsZXNoZWV0X2RhdGEpCi0gICAgOiBDYWNoZWRPYmplY3QodXJs
LCBDU1NTdHlsZVNoZWV0LCBLSU86OkNDX1ZlcmlmeSwgMCwgc3R5bGVzaGVldF9kYXRhLmxlbmd0
aCgpKQotewotICAgIG1fbG9hZGluZyA9IGZhbHNlOwotICAgIG1fc3RhdHVzID0gUGVyc2lzdGVu
dDsKLSAgICBtX2NvZGVjID0gMDsKLSAgICBtX3NoZWV0ID0gRE9NU3RyaW5nKHN0eWxlc2hlZXRf
ZGF0YSk7Ci19Ci0KLQotQ2FjaGVkQ1NTU3R5bGVTaGVldDo6fkNhY2hlZENTU1N0eWxlU2hlZXQo
KQotewotfQotCi12b2lkIENhY2hlZENTU1N0eWxlU2hlZXQ6OnJlZihDYWNoZWRPYmplY3RDbGll
bnQgKmMpCi17Ci0gICAgQ2FjaGVkT2JqZWN0OjpyZWYoYyk7Ci0KLSAgICBpZighbV9sb2FkaW5n
KSBjLT5zZXRTdHlsZVNoZWV0KCBtX3VybCwgbV9zaGVldCApOwotfQotCi12b2lkIENhY2hlZENT
U1N0eWxlU2hlZXQ6OmRlcmVmKENhY2hlZE9iamVjdENsaWVudCAqYykKLXsKLSAgICBDYWNoZTo6
Zmx1c2goKTsKLSAgICBDYWNoZWRPYmplY3Q6OmRlcmVmKGMpOwotICAgIGlmICggY2FuRGVsZXRl
KCkgJiYgbV9mcmVlICkKLSAgICAgIGRlbGV0ZSB0aGlzOwotfQotCi12b2lkIENhY2hlZENTU1N0
eWxlU2hlZXQ6OnNldENoYXJzZXQoIGNvbnN0IFFTdHJpbmcgJmNocyApCi17Ci0gICAgaWYgKCFj
aHMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIFFUZXh0Q29kZWMgKmNvZGVjID0gUVRleHRDb2RlYzo6
Y29kZWNGb3JOYW1lKGNocy5sYXRpbjEoKSk7Ci0gICAgICAgIGlmIChjb2RlYykKLSAgICAgICAg
ICAgIG1fY29kZWMgPSBjb2RlYzsKLSAgICB9Ci19Ci0KLXZvaWQgQ2FjaGVkQ1NTU3R5bGVTaGVl
dDo6ZGF0YSggUUJ1ZmZlciAmYnVmZmVyLCBib29sIGVvZiApCi17Ci0gICAgaWYoIWVvZikgcmV0
dXJuOwotICAgIGJ1ZmZlci5jbG9zZSgpOwotICAgIHNldFNpemUoYnVmZmVyLmJ1ZmZlcigpLnNp
emUoKSk7Ci0gICAgUVN0cmluZyBkYXRhID0gbV9jb2RlYy0+dG9Vbmljb2RlKCBidWZmZXIuYnVm
ZmVyKCkuZGF0YSgpLCBzaXplKCkgKTsKLSAgICBtX3NoZWV0ID0gRE9NU3RyaW5nKGRhdGEpOwot
ICAgIG1fbG9hZGluZyA9IGZhbHNlOwotCi0gICAgY2hlY2tOb3RpZnkoKTsKLX0KLQotdm9pZCBD
YWNoZWRDU1NTdHlsZVNoZWV0OjpjaGVja05vdGlmeSgpCi17Ci0gICAgaWYgKG1fbG9hZGluZykK
LSAgICAgICAgcmV0dXJuOwotCi0gICAgQ2FjaGVkT2JqZWN0Q2xpZW50V2Fsa2VyIHcobV9jbGll
bnRzKTsKLSAgICB3aGlsZSAoQ2FjaGVkT2JqZWN0Q2xpZW50ICpjID0gdy5uZXh0KCkpIHsKLSAg
ICAgICAgaWYgKG1fcmVzcG9uc2UgJiYgIUtXUUlzUmVzcG9uc2VVUkxFcXVhbFRvVVJMKG1fcmVz
cG9uc2UsIG1fdXJsKSkKLSAgICAgICAgICAgIGMtPnNldFN0eWxlU2hlZXQoRE9NU3RyaW5nKEtX
UVJlc3BvbnNlVVJMKG1fcmVzcG9uc2UpKSwgbV9zaGVldCk7Ci0gICAgICAgIGVsc2UKLSAgICAg
ICAgICAgIGMtPnNldFN0eWxlU2hlZXQobV91cmwsIG1fc2hlZXQpOwotICAgIH0KLX0KLQotCi12
b2lkIENhY2hlZENTU1N0eWxlU2hlZXQ6OmVycm9yKCBpbnQgLyplcnIqLywgY29uc3QgY2hhciAq
Lyp0ZXh0Ki8gKQotewotICAgIG1fbG9hZGluZyA9IGZhbHNlOwotICAgIGNoZWNrTm90aWZ5KCk7
Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQ2FjaGVkU2Ny
aXB0OjpDYWNoZWRTY3JpcHQoRG9jTG9hZGVyKiBkbCwgY29uc3QgRE9NU3RyaW5nICZ1cmwsIEtJ
Tzo6Q2FjaGVDb250cm9sIF9jYWNoZVBvbGljeSwgdGltZV90IF9leHBpcmVEYXRlLCBjb25zdCBR
U3RyaW5nJiBjaGFyc2V0KQotICAgIDogQ2FjaGVkT2JqZWN0KHVybCwgU2NyaXB0LCBfY2FjaGVQ
b2xpY3ksIF9leHBpcmVEYXRlKSwgbV9jb2RlYygwKQotewotICAgIC8vIEl0J3MgamF2YXNjcmlw
dCB3ZSB3YW50LgotICAgIC8vIEJ1dCBzb21lIHdlYnNpdGVzIHRoaW5rIHRoZWlyIHNjcmlwdHMg
YXJlIDxzb21lIHdyb25nIG1pbWV0eXBlIGhlcmU+Ci0gICAgLy8gYW5kIHJlZnVzZSB0byBzZXJ2
ZSB0aGVtIGlmIHdlIG9ubHkgYWNjZXB0IGFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdC4KLSAgICBz
ZXRBY2NlcHQoIiovKiIpOwotICAgIG1fZXJyb3JPY2N1cnJlZCA9IGZhbHNlOwotICAgIC8vIGxv
YWQgdGhlIGZpbGUKLSAgICBDYWNoZTo6bG9hZGVyKCktPmxvYWQoZGwsIHRoaXMsIGZhbHNlKTsK
LSAgICBtX2xvYWRpbmcgPSB0cnVlOwotICAgIGlmICghY2hhcnNldC5pc0VtcHR5KCkpCi0gICAg
ICAgIG1fY29kZWMgPSBRVGV4dENvZGVjOjpjb2RlY0Zvck5hbWUoY2hhcnNldC5sYXRpbjEoKSk7
Ci0gICAgaWYgKCFtX2NvZGVjKQotCW1fY29kZWMgPSBRVGV4dENvZGVjOjpjb2RlY0Zvck5hbWUo
Imlzbzg4NTktMSIpOwotfQotCi1DYWNoZWRTY3JpcHQ6OkNhY2hlZFNjcmlwdChjb25zdCBET01T
dHJpbmcgJnVybCwgY29uc3QgUVN0cmluZyAmc2NyaXB0X2RhdGEpCi0gICAgOiBDYWNoZWRPYmpl
Y3QodXJsLCBTY3JpcHQsIEtJTzo6Q0NfVmVyaWZ5LCAwLCBzY3JpcHRfZGF0YS5sZW5ndGgoKSkK
LXsKLSAgICBtX2Vycm9yT2NjdXJyZWQgPSBmYWxzZTsKLSAgICBtX2xvYWRpbmcgPSBmYWxzZTsK
LSAgICBtX3N0YXR1cyA9IFBlcnNpc3RlbnQ7Ci0gICAgbV9jb2RlYyA9IDA7Ci0gICAgbV9zY3Jp
cHQgPSBET01TdHJpbmcoc2NyaXB0X2RhdGEpOwotfQotCi1DYWNoZWRTY3JpcHQ6On5DYWNoZWRT
Y3JpcHQoKQotewotfQotCi12b2lkIENhY2hlZFNjcmlwdDo6cmVmKENhY2hlZE9iamVjdENsaWVu
dCAqYykKLXsKLSAgICBDYWNoZWRPYmplY3Q6OnJlZihjKTsKLQotICAgIGlmKCFtX2xvYWRpbmcp
IGMtPm5vdGlmeUZpbmlzaGVkKHRoaXMpOwotfQotCi12b2lkIENhY2hlZFNjcmlwdDo6ZGVyZWYo
Q2FjaGVkT2JqZWN0Q2xpZW50ICpjKQotewotICAgIENhY2hlOjpmbHVzaCgpOwotICAgIENhY2hl
ZE9iamVjdDo6ZGVyZWYoYyk7Ci0gICAgaWYgKCBjYW5EZWxldGUoKSAmJiBtX2ZyZWUgKQotICAg
ICAgZGVsZXRlIHRoaXM7Ci19Ci0KLXZvaWQgQ2FjaGVkU2NyaXB0OjpzZXRDaGFyc2V0KCBjb25z
dCBRU3RyaW5nICZjaHMgKQotewotICAgIGlmICghY2hzLmlzRW1wdHkoKSkgewotICAgICAgICBR
VGV4dENvZGVjICpjb2RlYyA9IFFUZXh0Q29kZWM6OmNvZGVjRm9yTmFtZShjaHMubGF0aW4xKCkp
OwotICAgICAgICBpZiAoY29kZWMpCi0gICAgICAgICAgICBtX2NvZGVjID0gY29kZWM7Ci0gICAg
fQotfQotCi12b2lkIENhY2hlZFNjcmlwdDo6ZGF0YSggUUJ1ZmZlciAmYnVmZmVyLCBib29sIGVv
ZiApCi17Ci0gICAgaWYoIWVvZikgcmV0dXJuOwotICAgIGJ1ZmZlci5jbG9zZSgpOwotICAgIHNl
dFNpemUoYnVmZmVyLmJ1ZmZlcigpLnNpemUoKSk7Ci0gICAgUVN0cmluZyBkYXRhID0gbV9jb2Rl
Yy0+dG9Vbmljb2RlKCBidWZmZXIuYnVmZmVyKCkuZGF0YSgpLCBzaXplKCkgKTsKLSAgICBtX3Nj
cmlwdCA9IERPTVN0cmluZyhkYXRhKTsKLSAgICBtX2xvYWRpbmcgPSBmYWxzZTsKLSAgICBjaGVj
a05vdGlmeSgpOwotfQotCi12b2lkIENhY2hlZFNjcmlwdDo6Y2hlY2tOb3RpZnkoKQotewotICAg
IGlmKG1fbG9hZGluZykgcmV0dXJuOwotCi0gICAgQ2FjaGVkT2JqZWN0Q2xpZW50V2Fsa2VyIHco
bV9jbGllbnRzKTsKLSAgICB3aGlsZSAoQ2FjaGVkT2JqZWN0Q2xpZW50ICpjID0gdy5uZXh0KCkp
Ci0gICAgICAgIGMtPm5vdGlmeUZpbmlzaGVkKHRoaXMpOwotfQotCi0KLXZvaWQgQ2FjaGVkU2Ny
aXB0OjplcnJvciggaW50IC8qZXJyKi8sIGNvbnN0IGNoYXIgKi8qdGV4dCovICkKLXsKLSAgICBt
X2xvYWRpbmcgPSBmYWxzZTsKLSAgICBtX2Vycm9yT2NjdXJyZWQgPSB0cnVlOwotICAgIGNoZWNr
Tm90aWZ5KCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0K
LXN0YXRpYyBib29sIGNyb3NzRG9tYWluKGNvbnN0IFFTdHJpbmcgJmEsIGNvbnN0IFFTdHJpbmcg
JmIpCi17Ci0gICAgaWYgKGEgPT0gYikgcmV0dXJuIGZhbHNlOwotCi0gICAgUVN0cmluZ0xpc3Qg
bDEgPSBRU3RyaW5nTGlzdDo6c3BsaXQoJy4nLCBhKTsKLSAgICBRU3RyaW5nTGlzdCBsMiA9IFFT
dHJpbmdMaXN0OjpzcGxpdCgnLicsIGIpOwotCi0gICAgd2hpbGUobDEuY291bnQoKSA+IGwyLmNv
dW50KCkpCi0gICAgICAgIGwxLnBvcF9mcm9udCgpOwotCi0gICAgd2hpbGUobDIuY291bnQoKSA+
IGwxLmNvdW50KCkpCi0gICAgICAgIGwyLnBvcF9mcm9udCgpOwotCi0gICAgd2hpbGUobDIuY291
bnQoKSA+PSAyKQotICAgIHsKLSAgICAgICAgaWYgKGwxID09IGwyKQotICAgICAgICAgICByZXR1
cm4gZmFsc2U7Ci0KLSAgICAgICAgbDEucG9wX2Zyb250KCk7Ci0gICAgICAgIGwyLnBvcF9mcm9u
dCgpOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KK25hbWVzcGFjZSBraHRtbCB7CiAKLS8v
IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIHZvaWQgQ2FjaGVkSW1hZ2VDYWxsYmFjazo6
bm90aWZ5VXBkYXRlKCkgCiB7IAogICAgIGlmIChjYWNoZWRJbWFnZSkgewpAQCAtNDQ0LDE0NDAg
KzEzNCw0IEBAIHZvaWQgQ2FjaGVkSW1hZ2VDYWxsYmFjazo6Y2xlYXIoKSAKICAgICBjYWNoZWRJ
bWFnZSA9IDA7CiB9CiAKLUNhY2hlZEltYWdlOjpDYWNoZWRJbWFnZShEb2NMb2FkZXIqIGRsLCBj
b25zdCBET01TdHJpbmcgJnVybCwgS0lPOjpDYWNoZUNvbnRyb2wgX2NhY2hlUG9saWN5LCB0aW1l
X3QgX2V4cGlyZURhdGUpCi0gICAgOiBRT2JqZWN0KCksIENhY2hlZE9iamVjdCh1cmwsIEltYWdl
LCBfY2FjaGVQb2xpY3ksIF9leHBpcmVEYXRlKQotICAgICwgbV9kYXRhU2l6ZSgwKQotewotICAg
IHAgPSAwOwotICAgIHBpeFBhcnQgPSAwOwotICAgIGJnID0gMDsKLSAgICBpc0Z1bGx5VHJhbnNw
YXJlbnQgPSBmYWxzZTsKLSAgICBlcnJvck9jY3VyZWQgPSBmYWxzZTsKLSAgICBtb25vY2hyb21l
ID0gZmFsc2U7Ci0gICAgZm9ybWF0VHlwZSA9IDA7Ci0gICAgbV9zdGF0dXMgPSBVbmtub3duOwot
ICAgIGltZ1NvdXJjZSA9IDA7Ci0gICAgbV9sb2FkaW5nID0gdHJ1ZTsKLSAgICBtX3Nob3dBbmlt
YXRpb25zID0gZGwtPnNob3dBbmltYXRpb25zKCk7Ci0gICAgaWYgKFFQaXhtYXA6OnNob3VsZFVz
ZVRocmVhZGVkRGVjb2RpbmcoKSkKLSAgICAgICAgbV9kZWNvZGVyQ2FsbGJhY2sgPSBuZXcgQ2Fj
aGVkSW1hZ2VDYWxsYmFjayh0aGlzKTsKLSAgICBlbHNlCi0gICAgICAgIG1fZGVjb2RlckNhbGxi
YWNrID0gMDsKLX0KLQotQ2FjaGVkSW1hZ2U6On5DYWNoZWRJbWFnZSgpCi17Ci0gICAgY2xlYXIo
KTsKLX0KLQotdm9pZCBDYWNoZWRJbWFnZTo6cmVmKCBDYWNoZWRPYmplY3RDbGllbnQgKmMgKQot
ewotICAgIENhY2hlZE9iamVjdDo6cmVmKGMpOwotCi0gICAgLy8gZm9yIG1vdXNlb3ZlcnMsIGR5
bmFtaWMgY2hhbmdlcwotICAgIGlmICghdmFsaWRfcmVjdCgpLmlzTnVsbCgpKQotICAgICAgICBj
LT5zZXRQaXhtYXAoIHBpeG1hcCgpLCB2YWxpZF9yZWN0KCksIHRoaXMpOwotCi0gICAgaWYoIW1f
bG9hZGluZykKLSAgICAgICAgYy0+bm90aWZ5RmluaXNoZWQodGhpcyk7Ci19Ci0KLXZvaWQgQ2Fj
aGVkSW1hZ2U6OmRlcmVmKCBDYWNoZWRPYmplY3RDbGllbnQgKmMgKQotewotICAgIENhY2hlOjpm
bHVzaCgpOwotICAgIENhY2hlZE9iamVjdDo6ZGVyZWYoYyk7Ci0gICAgaWYgKCBjYW5EZWxldGUo
KSAmJiBtX2ZyZWUgKQotICAgICAgICBkZWxldGUgdGhpczsKLX0KLQotY29uc3QgUVBpeG1hcCAm
Q2FjaGVkSW1hZ2U6OnRpbGVkX3BpeG1hcChjb25zdCBRQ29sb3ImIG5ld2MpCi17Ci0gICAgcmV0
dXJuIHBpeG1hcCgpOwotfQotCi1jb25zdCBRUGl4bWFwICZDYWNoZWRJbWFnZTo6cGl4bWFwKCAp
IGNvbnN0Ci17Ci0gICAgaWYoZXJyb3JPY2N1cmVkKQotICAgICAgICByZXR1cm4gKkNhY2hlOjpi
cm9rZW5QaXhtYXA7Ci0KLSAgICBpZiAocCkKLSAgICAgICAgcmV0dXJuICpwOwotCi0gICAgcmV0
dXJuICpDYWNoZTo6bnVsbFBpeG1hcDsKLX0KLQotUVNpemUgQ2FjaGVkSW1hZ2U6OnBpeG1hcF9z
aXplKCkgY29uc3QKLXsKLSAgICByZXR1cm4gKHAgPyBwLT5zaXplKCkgOiBRU2l6ZSgpKTsKLX0K
LQotUVJlY3QgQ2FjaGVkSW1hZ2U6OnZhbGlkX3JlY3QoKSBjb25zdAotewotICAgIHJldHVybiAo
cCA/IHAtPnJlY3QoKSA6IFFSZWN0KCkpOwotfQotCi12b2lkIENhY2hlZEltYWdlOjpkb19ub3Rp
ZnkoY29uc3QgUVBpeG1hcCYgcCwgY29uc3QgUVJlY3QmIHIpCi17Ci0gICAgQ2FjaGVkT2JqZWN0
Q2xpZW50V2Fsa2VyIHcobV9jbGllbnRzKTsKLSAgICB3aGlsZSAoQ2FjaGVkT2JqZWN0Q2xpZW50
ICpjID0gdy5uZXh0KCkpCi0gICAgICAgIGMtPnNldFBpeG1hcChwLCByLCB0aGlzKTsKLX0KLQot
dm9pZCBDYWNoZWRJbWFnZTo6c2V0U2hvd0FuaW1hdGlvbnMoIEtIVE1MU2V0dGluZ3M6OktBbmlt
YXRpb25BZHZpY2Ugc2hvd0FuaW1hdGlvbnMgKQotewotICAgIG1fc2hvd0FuaW1hdGlvbnMgPSBz
aG93QW5pbWF0aW9uczsKLX0KLQotdm9pZCBDYWNoZWRJbWFnZTo6Y2xlYXIoKQotewotICAgIGRl
bGV0ZSBwOyAgIHAgPSAwOwotICAgIGRlbGV0ZSBiZzsgIGJnID0gMDsKLSAgICBkZWxldGUgcGl4
UGFydDsgcGl4UGFydCA9IDA7Ci0KLSAgICBmb3JtYXRUeXBlID0gMDsKLQotICAgIHNldFNpemUo
MCk7Ci0KLSAgICAvLyBObyBuZWVkIHRvIGRlbGV0ZSBpbWFnZVNvdXJjZSAtIFFNb3ZpZSBkb2Vz
IGl0IGZvciB1cwotICAgIGltZ1NvdXJjZSA9IDA7Ci0KLSAgICBpZiAobV9kZWNvZGVyQ2FsbGJh
Y2spIHsKLSAgICAgICAgbV9kZWNvZGVyQ2FsbGJhY2stPmNsZWFyKCk7Ci0gICAgICAgIG1fZGVj
b2RlckNhbGxiYWNrLT5kZXJlZigpOwotICAgICAgICBtX2RlY29kZXJDYWxsYmFjayA9IDA7Ci0g
ICAgfQotfQotCi12b2lkIENhY2hlZEltYWdlOjpkYXRhICggUUJ1ZmZlciAmX2J1ZmZlciwgYm9v
bCBlb2YgKQotewotI2lmZGVmIENBQ0hFX0RFQlVHCi0gICAga2REZWJ1ZyggNjA2MCApIDw8IHRo
aXMgPDwgImluIENhY2hlZEltYWdlOjpkYXRhKGJ1ZmZlcnNpemUgIiA8PCBfYnVmZmVyLmJ1ZmZl
cigpLnNpemUoKSA8PCIsIGVvZj0iIDw8IGVvZiA8PCBlbmRsOwotI2VuZGlmCi0KLSAgICBib29s
IGNhbkRyYXcgPSBmYWxzZTsKLSAgICAKLSAgICBtX2RhdGFTaXplID0gX2J1ZmZlci5zaXplKCk7
Ci0gICAgICAgIAotICAgIC8vIElmIHdlJ3JlIGF0IGVvZiBhbmQgZG9uJ3QgaGF2ZSBhIHBpeG1h
cCB5ZXQsIHRoZSBkYXRhCi0gICAgLy8gbXVzdCBoYXZlIGFycml2ZWQgaW4gb25lIGNodW5rLiAg
VGhpcyBhdm9pZHMgdGhlIGF0dGVtcHQKLSAgICAvLyB0byBwZXJmb3JtIGluY3JlbWVudGFsIGRl
Y29kaW5nLgotICAgIGlmIChlb2YgJiYgIXApIHsKLSAgICAgICAgcCA9IG5ldyBRUGl4bWFwKF9i
dWZmZXIuYnVmZmVyKCksIEtXUVJlc3BvbnNlTUlNRVR5cGUobV9yZXNwb25zZSkpOwotICAgICAg
ICBpZiAobV9kZWNvZGVyQ2FsbGJhY2spCi0gICAgICAgICAgICBtX2RlY29kZXJDYWxsYmFjay0+
bm90aWZ5RmluaXNoZWQoKTsKLSAgICAgICAgY2FuRHJhdyA9IHRydWU7Ci0gICAgfSBlbHNlIHsK
LSAgICAgICAgLy8gQWx3YXlzIGF0dGVtcHQgdG8gbG9hZCB0aGUgaW1hZ2UgaW5jcmVtZW50YWxs
eS4KLSAgICAgICAgaWYgKCFwKQotICAgICAgICAgICAgcCA9IG5ldyBRUGl4bWFwKEtXUVJlc3Bv
bnNlTUlNRVR5cGUobV9yZXNwb25zZSkpOwotICAgICAgICBjYW5EcmF3ID0gcC0+cmVjZWl2ZWRE
YXRhKF9idWZmZXIuYnVmZmVyKCksIGVvZiwgbV9kZWNvZGVyQ2FsbGJhY2spOwotICAgIH0KLSAg
ICAKLSAgICAvLyBJZiB3ZSBoYXZlIGEgZGVjb2Rlciwgd2UnbGwgYmUgbm90aWZpZWQgd2hlbiBk
ZWNvZGluZyBoYXMgY29tcGxldGVkLgotICAgIGlmICghbV9kZWNvZGVyQ2FsbGJhY2spIHsKLSAg
ICAgICAgaWYgKGNhbkRyYXcgfHwgZW9mKSB7Ci0gICAgICAgICAgICBpZiAocC0+aXNOdWxsKCkp
IHsKLSAgICAgICAgICAgICAgICBlcnJvck9jY3VyZWQgPSB0cnVlOwotICAgICAgICAgICAgICAg
IFFQaXhtYXAgZXAgPSBwaXhtYXAoKTsKLSAgICAgICAgICAgICAgICBkb19ub3RpZnkgKGVwLCBl
cC5yZWN0KCkpOwotICAgICAgICAgICAgICAgIENhY2hlOjpyZW1vdmVDYWNoZUVudHJ5ICh0aGlz
KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBkb19u
b3RpZnkoKnAsIHAtPnJlY3QoKSk7Ci0KLSAgICAgICAgICAgIFFTaXplIHMgPSBwaXhtYXBfc2l6
ZSgpOwotICAgICAgICAgICAgc2V0U2l6ZShzLndpZHRoKCkgKiBzLmhlaWdodCgpICogMik7Ci0g
ICAgICAgIH0KLSAgICAgICAgaWYgKGVvZikgewotICAgICAgICAgICAgbV9sb2FkaW5nID0gZmFs
c2U7Ci0gICAgICAgICAgICBjaGVja05vdGlmeSgpOwotICAgICAgICB9Ci0gICAgfQotfQotCi12
b2lkIENhY2hlZEltYWdlOjplcnJvciggaW50IC8qZXJyKi8sIGNvbnN0IGNoYXIgKi8qdGV4dCov
ICkKLXsKLSNpZmRlZiBDQUNIRV9ERUJVRwotICAgIGtkRGVidWcoNjA2MCkgPDwgIkNhaGNlZElt
YWdlOjplcnJvciIgPDwgZW5kbDsKLSNlbmRpZgotCi0gICAgY2xlYXIoKTsKLSAgICBlcnJvck9j
Y3VyZWQgPSB0cnVlOwotICAgIGRvX25vdGlmeShwaXhtYXAoKSwgUVJlY3QoMCwgMCwgMTYsIDE2
KSk7Ci0gICAgbV9sb2FkaW5nID0gZmFsc2U7Ci0gICAgY2hlY2tOb3RpZnkoKTsKLX0KLQotdm9p
ZCBDYWNoZWRJbWFnZTo6Y2hlY2tOb3RpZnkoKQotewotICAgIGlmKG1fbG9hZGluZykgcmV0dXJu
OwotCi0gICAgQ2FjaGVkT2JqZWN0Q2xpZW50V2Fsa2VyIHcobV9jbGllbnRzKTsKLSAgICB3aGls
ZSAoQ2FjaGVkT2JqZWN0Q2xpZW50ICpjID0gdy5uZXh0KCkpIHsKLSAgICAgICAgYy0+bm90aWZ5
RmluaXNoZWQodGhpcyk7Ci0gICAgfQotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tCi0KLSNpZmRlZiBLSFRNTF9YU0xUCi0KLUNhY2hlZFhTTFN0eWxlU2hlZXQ6OkNh
Y2hlZFhTTFN0eWxlU2hlZXQoRG9jTG9hZGVyKiBkbCwgY29uc3QgRE9NU3RyaW5nICZ1cmwsIEtJ
Tzo6Q2FjaGVDb250cm9sIF9jYWNoZVBvbGljeSwgdGltZV90IF9leHBpcmVEYXRlKQotOiBDYWNo
ZWRPYmplY3QodXJsLCBYU0xTdHlsZVNoZWV0LCBfY2FjaGVQb2xpY3ksIF9leHBpcmVEYXRlKQot
ewotICAgIC8vIEl0J3MgWE1MIHdlIHdhbnQuCi0gICAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIGFj
Y2VwdCBtb3JlIGdlbmVyYWwgeG1sIGZvcm1hdHMgKi8qK3htbCwgaW1hZ2Uvc3ZnK3htbCBmb3Ig
ZXhhbXBsZS4KLSAgICBzZXRBY2NlcHQoInRleHQveG1sLCBhcHBsaWNhdGlvbi94bWwsIGFwcGxp
Y2F0aW9uL3hodG1sK3htbCwgdGV4dC94c2wsIGFwcGxpY2F0aW9uL3Jzcyt4bWwsIGFwcGxpY2F0
aW9uL2F0b20reG1sIik7Ci0gICAgCi0gICAgLy8gbG9hZCB0aGUgZmlsZQotICAgIENhY2hlOjps
b2FkZXIoKS0+bG9hZChkbCwgdGhpcywgZmFsc2UpOwotICAgIG1fbG9hZGluZyA9IHRydWU7Ci0g
ICAgbV9kZWNvZGVyID0gbmV3IERlY29kZXI7Ci19Ci0KLXZvaWQgQ2FjaGVkWFNMU3R5bGVTaGVl
dDo6cmVmKENhY2hlZE9iamVjdENsaWVudCAqYykKLXsKLSAgICBDYWNoZWRPYmplY3Q6OnJlZihj
KTsKLSAgICAKLSAgICBpZiAoIW1fbG9hZGluZykKLSAgICAgICAgYy0+c2V0U3R5bGVTaGVldCht
X3VybCwgbV9zaGVldCk7Ci19Ci0KLXZvaWQgQ2FjaGVkWFNMU3R5bGVTaGVldDo6ZGVyZWYoQ2Fj
aGVkT2JqZWN0Q2xpZW50ICpjKQotewotICAgIENhY2hlOjpmbHVzaCgpOwotICAgIENhY2hlZE9i
amVjdDo6ZGVyZWYoYyk7Ci0gICAgaWYgKGNhbkRlbGV0ZSgpICYmIG1fZnJlZSkKLSAgICAgICAg
ZGVsZXRlIHRoaXM7Ci19Ci0KLXZvaWQgQ2FjaGVkWFNMU3R5bGVTaGVldDo6c2V0Q2hhcnNldCgg
Y29uc3QgUVN0cmluZyAmY2hzICkKLXsKLSAgICBpZiAoIWNocy5pc0VtcHR5KCkpCi0gICAgICAg
IG1fZGVjb2Rlci0+c2V0RW5jb2RpbmcoY2hzLmxhdGluMSgpLCBEZWNvZGVyOjpFbmNvZGluZ0Zy
b21IVFRQSGVhZGVyKTsKLX0KLQotdm9pZCBDYWNoZWRYU0xTdHlsZVNoZWV0OjpkYXRhKFFCdWZm
ZXIgJmJ1ZmZlciwgYm9vbCBlb2YpCi17Ci0gICAgaWYoIWVvZikgcmV0dXJuOwotICAgIGJ1ZmZl
ci5jbG9zZSgpOwotICAgIHNldFNpemUoYnVmZmVyLmJ1ZmZlcigpLnNpemUoKSk7Ci0gICAgUVN0
cmluZyBkYXRhID0gbV9kZWNvZGVyLT5kZWNvZGUoYnVmZmVyLmJ1ZmZlcigpLmRhdGEoKSwgc2l6
ZSgpKTsKLSAgICBtX3NoZWV0ID0gRE9NU3RyaW5nKGRhdGEpOwotICAgIG1fbG9hZGluZyA9IGZh
bHNlOwotICAgIAotICAgIGNoZWNrTm90aWZ5KCk7Ci19Ci0KLXZvaWQgQ2FjaGVkWFNMU3R5bGVT
aGVldDo6Y2hlY2tOb3RpZnkoKQotewotICAgIGlmIChtX2xvYWRpbmcpCi0gICAgICAgIHJldHVy
bjsKLSAgICAKLSAgICBDYWNoZWRPYmplY3RDbGllbnRXYWxrZXIgdyhtX2NsaWVudHMpOwotICAg
IHdoaWxlIChDYWNoZWRPYmplY3RDbGllbnQgKmMgPSB3Lm5leHQoKSkKLSAgICAgICAgYy0+c2V0
U3R5bGVTaGVldChtX3VybCwgbV9zaGVldCk7Ci19Ci0KLQotdm9pZCBDYWNoZWRYU0xTdHlsZVNo
ZWV0OjplcnJvciggaW50IC8qZXJyKi8sIGNvbnN0IGNoYXIgKi8qdGV4dCovICkKLXsKLSAgICBt
X2xvYWRpbmcgPSBmYWxzZTsKLSAgICBjaGVja05vdGlmeSgpOwotfQotCi0jZW5kaWYKLQotI2lm
bmRlZiBLSFRNTF9OT19YQkwKLUNhY2hlZFhCTERvY3VtZW50OjpDYWNoZWRYQkxEb2N1bWVudChE
b2NMb2FkZXIqIGRsLCBjb25zdCBET01TdHJpbmcgJnVybCwgS0lPOjpDYWNoZUNvbnRyb2wgX2Nh
Y2hlUG9saWN5LCB0aW1lX3QgX2V4cGlyZURhdGUpCi06IENhY2hlZE9iamVjdCh1cmwsIFhCTCwg
X2NhY2hlUG9saWN5LCBfZXhwaXJlRGF0ZSksIG1fZG9jdW1lbnQoMCkKLXsKLSAgICAvLyBJdCdz
IFhNTCB3ZSB3YW50LgotICAgIHNldEFjY2VwdCgidGV4dC94bWwsIGFwcGxpY2F0aW9uL3htbCwg
YXBwbGljYXRpb24veGh0bWwreG1sLCB0ZXh0L3hzbCwgYXBwbGljYXRpb24vcnNzK3htbCwgYXBw
bGljYXRpb24vYXRvbSt4bWwiKTsKLSAgICAKLSAgICAvLyBMb2FkIHRoZSBmaWxlCi0gICAgQ2Fj
aGU6OmxvYWRlcigpLT5sb2FkKGRsLCB0aGlzLCBmYWxzZSk7Ci0gICAgbV9sb2FkaW5nID0gdHJ1
ZTsKLSAgICBtX2RlY29kZXIgPSBuZXcgRGVjb2RlcjsKLX0KLQotQ2FjaGVkWEJMRG9jdW1lbnQ6
On5DYWNoZWRYQkxEb2N1bWVudCgpCi17Ci0gICAgaWYgKG1fZG9jdW1lbnQpCi0gICAgICAgIG1f
ZG9jdW1lbnQtPmRlcmVmKCk7Ci19Ci0KLXZvaWQgQ2FjaGVkWEJMRG9jdW1lbnQ6OnJlZihDYWNo
ZWRPYmplY3RDbGllbnQgKmMpCi17Ci0gICAgQ2FjaGVkT2JqZWN0OjpyZWYoYyk7Ci0gICAgaWYg
KCFtX2xvYWRpbmcpCi0gICAgICAgIGMtPnNldFhCTERvY3VtZW50KG1fdXJsLCBtX2RvY3VtZW50
KTsKLX0KLQotdm9pZCBDYWNoZWRYQkxEb2N1bWVudDo6ZGVyZWYoQ2FjaGVkT2JqZWN0Q2xpZW50
ICpjKQotewotICAgIENhY2hlOjpmbHVzaCgpOwotICAgIENhY2hlZE9iamVjdDo6ZGVyZWYoYyk7
Ci0gICAgaWYgKGNhbkRlbGV0ZSgpICYmIG1fZnJlZSkKLSAgICAgICAgZGVsZXRlIHRoaXM7Ci19
Ci0KLXZvaWQgQ2FjaGVkWEJMRG9jdW1lbnQ6OnNldENoYXJzZXQoIGNvbnN0IFFTdHJpbmcgJmNo
cyApCi17Ci0gICAgaWYgKCFjaHMuaXNFbXB0eSgpKQotICAgICAgICBtX2RlY29kZXItPnNldEVu
Y29kaW5nKGNocy5sYXRpbjEoKSwgRGVjb2Rlcjo6RW5jb2RpbmdGcm9tSFRUUEhlYWRlcik7Ci19
Ci0KLXZvaWQgQ2FjaGVkWEJMRG9jdW1lbnQ6OmRhdGEoIFFCdWZmZXIgJmJ1ZmZlciwgYm9vbCBl
b2YgKQotewotICAgIGlmICghZW9mKSByZXR1cm47Ci0gICAgCi0gICAgYXNzZXJ0KCFtX2RvY3Vt
ZW50KTsKLSAgICAKLSAgICBtX2RvY3VtZW50ID0gIG5ldyBYQkw6OlhCTERvY3VtZW50SW1wbCgp
OwotICAgIG1fZG9jdW1lbnQtPnJlZigpOwotICAgIG1fZG9jdW1lbnQtPm9wZW4oKTsKLSAgICAK
LSAgICBRU3RyaW5nIGRhdGEgPSBtX2RlY29kZXItPmRlY29kZShidWZmZXIuYnVmZmVyKCkuZGF0
YSgpLCBidWZmZXIuYnVmZmVyKCkuc2l6ZSgpKTsKLSAgICBtX2RvY3VtZW50LT53cml0ZShkYXRh
KTsKLSAgICBzZXRTaXplKGJ1ZmZlci5idWZmZXIoKS5zaXplKCkpOwotICAgIGJ1ZmZlci5jbG9z
ZSgpOwotICAgIAotICAgIG1fZG9jdW1lbnQtPmZpbmlzaFBhcnNpbmcoKTsKLSAgICBtX2RvY3Vt
ZW50LT5jbG9zZSgpOwotICAgIG1fbG9hZGluZyA9IGZhbHNlOwotICAgIGNoZWNrTm90aWZ5KCk7
Ci19Ci0KLXZvaWQgQ2FjaGVkWEJMRG9jdW1lbnQ6OmNoZWNrTm90aWZ5KCkKLXsKLSAgICBpZiht
X2xvYWRpbmcpCi0gICAgICAgIHJldHVybjsKLSAgICAKLSAgICBDYWNoZWRPYmplY3RDbGllbnRX
YWxrZXIgdyhtX2NsaWVudHMpOwotICAgIHdoaWxlIChDYWNoZWRPYmplY3RDbGllbnQgKmMgPSB3
Lm5leHQoKSkKLSAgICAgICAgYy0+c2V0WEJMRG9jdW1lbnQobV91cmwsIG1fZG9jdW1lbnQpOwot
fQotCi0KLXZvaWQgQ2FjaGVkWEJMRG9jdW1lbnQ6OmVycm9yKCBpbnQgLyplcnIqLywgY29uc3Qg
Y2hhciAqLyp0ZXh0Ki8gKQotewotICAgIG1fbG9hZGluZyA9IGZhbHNlOwotICAgIGNoZWNrTm90
aWZ5KCk7Ci19Ci0jZW5kaWYKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
Ci0KLVJlcXVlc3Q6OlJlcXVlc3QoRG9jTG9hZGVyKiBkbCwgQ2FjaGVkT2JqZWN0ICpfb2JqZWN0
LCBib29sIF9pbmNyZW1lbnRhbCkKLXsKLSAgICBvYmplY3QgPSBfb2JqZWN0OwotICAgIG9iamVj
dC0+c2V0UmVxdWVzdCh0aGlzKTsKLSAgICBpbmNyZW1lbnRhbCA9IF9pbmNyZW1lbnRhbDsKLSAg
ICBtX2RvY0xvYWRlciA9IGRsOwotICAgIG11bHRpcGFydCA9IGZhbHNlOwotfQotCi1SZXF1ZXN0
Ojp+UmVxdWVzdCgpCi17Ci0gICAgb2JqZWN0LT5zZXRSZXF1ZXN0KDApOwotfQotCi0vLyAtLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotRG9jTG9hZGVyOjpEb2NMb2FkZXIoS0hU
TUxQYXJ0KiBwYXJ0LCBEb2N1bWVudEltcGwqIGRvYykKLXsKLSAgICBtX2NhY2hlUG9saWN5ID0g
S0lPOjpDQ19WZXJpZnk7Ci0gICAgbV9leHBpcmVEYXRlID0gMDsKLSAgICBtX2JhdXRvbG9hZElt
YWdlcyA9IHRydWU7Ci0gICAgbV9zaG93QW5pbWF0aW9ucyA9IEtIVE1MU2V0dGluZ3M6OktBbmlt
YXRpb25FbmFibGVkOwotICAgIG1fcGFydCA9IHBhcnQ7Ci0gICAgbV9kb2MgPSBkb2M7Ci0gICAg
bV9sb2FkSW5Qcm9ncmVzcyA9IGZhbHNlOwotCi0gICAgQ2FjaGU6OmluaXQoKTsKLSAgICBDYWNo
ZTo6ZG9jbG9hZGVyLT5hcHBlbmQoIHRoaXMgKTsKLX0KLQotRG9jTG9hZGVyOjp+RG9jTG9hZGVy
KCkKLXsKLSAgICBDYWNoZTo6ZG9jbG9hZGVyLT5yZW1vdmUoIHRoaXMgKTsKLX0KLQotdm9pZCBE
b2NMb2FkZXI6OnNldEV4cGlyZURhdGUodGltZV90IF9leHBpcmVEYXRlKQotewotICAgIG1fZXhw
aXJlRGF0ZSA9IF9leHBpcmVEYXRlOwotfQotCi1ib29sIERvY0xvYWRlcjo6bmVlZFJlbG9hZChj
b25zdCBLVVJMICZmdWxsVVJMKQotewotICAgIGJvb2wgcmVsb2FkID0gZmFsc2U7Ci0gICAgaWYg
KG1fY2FjaGVQb2xpY3kgPT0gS0lPOjpDQ19WZXJpZnkpCi0gICAgewotICAgICAgIGlmICghbV9y
ZWxvYWRlZFVSTHMuY29udGFpbnMoZnVsbFVSTC51cmwoKSkpCi0gICAgICAgewotICAgICAgICAg
IENhY2hlZE9iamVjdCAqZXhpc3RpbmcgPSBDYWNoZTo6Y2FjaGUtPmZpbmQoZnVsbFVSTC51cmwo
KSk7Ci0gICAgICAgICAgaWYgKGV4aXN0aW5nICYmIGV4aXN0aW5nLT5pc0V4cGlyZWQoKSkKLSAg
ICAgICAgICB7Ci0gICAgICAgICAgICAgQ2FjaGU6OnJlbW92ZUNhY2hlRW50cnkoZXhpc3Rpbmcp
OwotICAgICAgICAgICAgIG1fcmVsb2FkZWRVUkxzLmFwcGVuZChmdWxsVVJMLnVybCgpKTsKLSAg
ICAgICAgICAgICByZWxvYWQgPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgfQot
ICAgIGVsc2UgaWYgKChtX2NhY2hlUG9saWN5ID09IEtJTzo6Q0NfUmVsb2FkKSB8fCAobV9jYWNo
ZVBvbGljeSA9PSBLSU86OkNDX1JlZnJlc2gpKQotICAgIHsKLSAgICAgICBpZiAoIW1fcmVsb2Fk
ZWRVUkxzLmNvbnRhaW5zKGZ1bGxVUkwudXJsKCkpKQotICAgICAgIHsKLSAgICAgICAgICBDYWNo
ZWRPYmplY3QgKmV4aXN0aW5nID0gQ2FjaGU6OmNhY2hlLT5maW5kKGZ1bGxVUkwudXJsKCkpOwot
ICAgICAgICAgIGlmIChleGlzdGluZykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAgQ2FjaGU6
OnJlbW92ZUNhY2hlRW50cnkoZXhpc3RpbmcpOwotICAgICAgICAgIH0KLSAgICAgICAgICBtX3Jl
bG9hZGVkVVJMcy5hcHBlbmQoZnVsbFVSTC51cmwoKSk7Ci0gICAgICAgICAgcmVsb2FkID0gdHJ1
ZTsKLSAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZWxvYWQ7Ci19Ci0KLUNhY2hlZEltYWdl
ICpEb2NMb2FkZXI6OnJlcXVlc3RJbWFnZSggY29uc3QgRE9NOjpET01TdHJpbmcgJnVybCkKLXsK
LSAgICBLVVJMIGZ1bGxVUkwgPSBtX2RvYy0+Y29tcGxldGVVUkwodXJsLnFzdHJpbmcoKSk7Ci0g
ICAgaWYgKCBtX3BhcnQgJiYgbV9wYXJ0LT5vbmx5TG9jYWxSZWZlcmVuY2VzKCkgJiYgZnVsbFVS
TC5wcm90b2NvbCgpICE9ICJmaWxlIikgcmV0dXJuIDA7Ci0KLSAgICBpZiAoS1dRQ2hlY2tJZlJl
bG9hZGluZyh0aGlzKSkgewotICAgICAgICBzZXRDYWNoZVBvbGljeShLSU86OkNDX1JlbG9hZCk7
Ci0gICAgfQotCi0gICAgYm9vbCByZWxvYWQgPSBuZWVkUmVsb2FkKGZ1bGxVUkwpOwotCi0gICAg
Q2FjaGVkSW1hZ2UgKmNhY2hlZE9iamVjdCA9IENhY2hlOjpyZXF1ZXN0SW1hZ2UodGhpcywgZnVs
bFVSTCwgcmVsb2FkLCBtX2V4cGlyZURhdGUpOwotICAgIEtXUUNoZWNrQ2FjaGVPYmplY3RTdGF0
dXModGhpcywgY2FjaGVkT2JqZWN0KTsKLSAgICByZXR1cm4gY2FjaGVkT2JqZWN0OwotfQotCi1D
YWNoZWRDU1NTdHlsZVNoZWV0ICpEb2NMb2FkZXI6OnJlcXVlc3RTdHlsZVNoZWV0KCBjb25zdCBE
T006OkRPTVN0cmluZyAmdXJsLCBjb25zdCBRU3RyaW5nJiBjaGFyc2V0KQotewotICAgIEtVUkwg
ZnVsbFVSTCA9IG1fZG9jLT5jb21wbGV0ZVVSTCh1cmwucXN0cmluZygpKTsKLSAgICBpZiAoIG1f
cGFydCAmJiBtX3BhcnQtPm9ubHlMb2NhbFJlZmVyZW5jZXMoKSAmJiBmdWxsVVJMLnByb3RvY29s
KCkgIT0gImZpbGUiKSByZXR1cm4gMDsKLQotICAgIGlmIChLV1FDaGVja0lmUmVsb2FkaW5nKHRo
aXMpKSB7Ci0gICAgICAgIHNldENhY2hlUG9saWN5KEtJTzo6Q0NfUmVsb2FkKTsKLSAgICB9Ci0K
LSAgICBib29sIHJlbG9hZCA9IG5lZWRSZWxvYWQoZnVsbFVSTCk7Ci0KLSAgICBDYWNoZWRDU1NT
dHlsZVNoZWV0ICpjYWNoZWRPYmplY3QgPSBDYWNoZTo6cmVxdWVzdFN0eWxlU2hlZXQodGhpcywg
dXJsLCByZWxvYWQsIG1fZXhwaXJlRGF0ZSwgY2hhcnNldCk7Ci0gICAgS1dRQ2hlY2tDYWNoZU9i
amVjdFN0YXR1cyh0aGlzLCBjYWNoZWRPYmplY3QpOwotICAgIHJldHVybiBjYWNoZWRPYmplY3Q7
Ci19Ci0KLUNhY2hlZFNjcmlwdCAqRG9jTG9hZGVyOjpyZXF1ZXN0U2NyaXB0KCBjb25zdCBET006
OkRPTVN0cmluZyAmdXJsLCBjb25zdCBRU3RyaW5nJiBjaGFyc2V0KQotewotICAgIEtVUkwgZnVs
bFVSTCA9IG1fZG9jLT5jb21wbGV0ZVVSTCh1cmwucXN0cmluZygpKTsKLSAgICBpZiAoIG1fcGFy
dCAmJiBtX3BhcnQtPm9ubHlMb2NhbFJlZmVyZW5jZXMoKSAmJiBmdWxsVVJMLnByb3RvY29sKCkg
IT0gImZpbGUiKSByZXR1cm4gMDsKLQotICAgIGlmIChLV1FDaGVja0lmUmVsb2FkaW5nKHRoaXMp
KSB7Ci0gICAgICAgIHNldENhY2hlUG9saWN5KEtJTzo6Q0NfUmVsb2FkKTsKLSAgICB9Ci0KLSAg
ICBib29sIHJlbG9hZCA9IG5lZWRSZWxvYWQoZnVsbFVSTCk7Ci0KLSAgICBDYWNoZWRTY3JpcHQg
KmNhY2hlZE9iamVjdCA9IENhY2hlOjpyZXF1ZXN0U2NyaXB0KHRoaXMsIHVybCwgcmVsb2FkLCBt
X2V4cGlyZURhdGUsIGNoYXJzZXQpOwotICAgIEtXUUNoZWNrQ2FjaGVPYmplY3RTdGF0dXModGhp
cywgY2FjaGVkT2JqZWN0KTsKLSAgICByZXR1cm4gY2FjaGVkT2JqZWN0OwotfQotCi0jaWZkZWYg
S0hUTUxfWFNMVAotQ2FjaGVkWFNMU3R5bGVTaGVldCogRG9jTG9hZGVyOjpyZXF1ZXN0WFNMU3R5
bGVTaGVldChjb25zdCBET006OkRPTVN0cmluZyAmdXJsKQotewotICAgIEtVUkwgZnVsbFVSTCA9
IG1fZG9jLT5jb21wbGV0ZVVSTCh1cmwucXN0cmluZygpKTsKLSAgICAKLSAgICBpZiAobV9wYXJ0
ICYmIG1fcGFydC0+b25seUxvY2FsUmVmZXJlbmNlcygpICYmIGZ1bGxVUkwucHJvdG9jb2woKSAh
PSAiZmlsZSIpIHJldHVybiAwOwotICAgIAotICAgIGlmIChLV1FDaGVja0lmUmVsb2FkaW5nKHRo
aXMpKQotICAgICAgICBzZXRDYWNoZVBvbGljeShLSU86OkNDX1JlbG9hZCk7Ci0gICAgCi0gICAg
Ym9vbCByZWxvYWQgPSBuZWVkUmVsb2FkKGZ1bGxVUkwpOwotICAgIAotICAgIENhY2hlZFhTTFN0
eWxlU2hlZXQgKmNhY2hlZE9iamVjdCA9IENhY2hlOjpyZXF1ZXN0WFNMU3R5bGVTaGVldCh0aGlz
LCB1cmwsIHJlbG9hZCwgbV9leHBpcmVEYXRlKTsKLSAgICBLV1FDaGVja0NhY2hlT2JqZWN0U3Rh
dHVzKHRoaXMsIGNhY2hlZE9iamVjdCk7Ci0gICAgcmV0dXJuIGNhY2hlZE9iamVjdDsKLX0KLSNl
bmRpZgotCi0jaWZuZGVmIEtIVE1MX05PX1hCTAotQ2FjaGVkWEJMRG9jdW1lbnQqIERvY0xvYWRl
cjo6cmVxdWVzdFhCTERvY3VtZW50KGNvbnN0IERPTTo6RE9NU3RyaW5nICZ1cmwpCi17Ci0gICAg
S1VSTCBmdWxsVVJMID0gbV9kb2MtPmNvbXBsZXRlVVJMKHVybC5xc3RyaW5nKCkpOwotICAgIAot
ICAgIC8vIEZJWE1FOiBJcyB0aGlzIHJpZ2h0IGZvciBYQkw/Ci0gICAgaWYgKG1fcGFydCAmJiBt
X3BhcnQtPm9ubHlMb2NhbFJlZmVyZW5jZXMoKSAmJiBmdWxsVVJMLnByb3RvY29sKCkgIT0gImZp
bGUiKSByZXR1cm4gMDsKLSAgICAKLSAgICBpZiAoS1dRQ2hlY2tJZlJlbG9hZGluZyh0aGlzKSkg
ewotICAgICAgICBzZXRDYWNoZVBvbGljeShLSU86OkNDX1JlbG9hZCk7Ci0gICAgfQotICAgIAot
ICAgIGJvb2wgcmVsb2FkID0gbmVlZFJlbG9hZChmdWxsVVJMKTsKLSAgICAKLSAgICBDYWNoZWRY
QkxEb2N1bWVudCAqY2FjaGVkT2JqZWN0ID0gQ2FjaGU6OnJlcXVlc3RYQkxEb2N1bWVudCh0aGlz
LCB1cmwsIHJlbG9hZCwgbV9leHBpcmVEYXRlKTsKLSAgICBLV1FDaGVja0NhY2hlT2JqZWN0U3Rh
dHVzKHRoaXMsIGNhY2hlZE9iamVjdCk7Ci0gICAgcmV0dXJuIGNhY2hlZE9iamVjdDsKLX0KLSNl
bmRpZgotCi12b2lkIERvY0xvYWRlcjo6c2V0QXV0b2xvYWRJbWFnZXMoIGJvb2wgZW5hYmxlICkK
LXsKLSAgICBpZiAoIGVuYWJsZSA9PSBtX2JhdXRvbG9hZEltYWdlcyApCi0gICAgICAgIHJldHVy
bjsKLQotICAgIG1fYmF1dG9sb2FkSW1hZ2VzID0gZW5hYmxlOwotCi0gICAgaWYgKCAhbV9iYXV0
b2xvYWRJbWFnZXMgKSByZXR1cm47Ci0KLSAgICBmb3IgKCBjb25zdCBDYWNoZWRPYmplY3QqIGNv
PW1fZG9jT2JqZWN0cy5maXJzdCgpOyBjbzsgY289bV9kb2NPYmplY3RzLm5leHQoKSApCi0gICAg
ICAgIGlmICggY28tPnR5cGUoKSA9PSBDYWNoZWRPYmplY3Q6OkltYWdlICkKLSAgICAgICAgewot
ICAgICAgICAgICAgQ2FjaGVkSW1hZ2UgKmltZyA9IGNvbnN0X2Nhc3Q8Q2FjaGVkSW1hZ2UqPigg
c3RhdGljX2Nhc3Q8Y29uc3QgQ2FjaGVkSW1hZ2UgKj4oIGNvICkgKTsKLQotICAgICAgICAgICAg
Q2FjaGVkT2JqZWN0OjpTdGF0dXMgc3RhdHVzID0gaW1nLT5zdGF0dXMoKTsKLSAgICAgICAgICAg
IGlmICggc3RhdHVzICE9IENhY2hlZE9iamVjdDo6VW5rbm93biApCi0gICAgICAgICAgICAgICAg
Y29udGludWU7Ci0KLSAgICAgICAgICAgIENhY2hlOjpsb2FkZXIoKS0+bG9hZCh0aGlzLCBpbWcs
IHRydWUpOwotICAgICAgICB9Ci19Ci0KLXZvaWQgRG9jTG9hZGVyOjpzZXRDYWNoZVBvbGljeSgg
S0lPOjpDYWNoZUNvbnRyb2wgY2FjaGVQb2xpY3kgKQotewotICAgIG1fY2FjaGVQb2xpY3kgPSBj
YWNoZVBvbGljeTsKLX0KLQotdm9pZCBEb2NMb2FkZXI6OnNldFNob3dBbmltYXRpb25zKCBLSFRN
TFNldHRpbmdzOjpLQW5pbWF0aW9uQWR2aWNlIHNob3dBbmltYXRpb25zICkKLXsKLSAgICBpZiAo
IHNob3dBbmltYXRpb25zID09IG1fc2hvd0FuaW1hdGlvbnMgKSByZXR1cm47Ci0gICAgbV9zaG93
QW5pbWF0aW9ucyA9IHNob3dBbmltYXRpb25zOwotCi0gICAgY29uc3QgQ2FjaGVkT2JqZWN0KiBj
bzsKLSAgICBmb3IgKCBjbz1tX2RvY09iamVjdHMuZmlyc3QoKTsgY287IGNvPW1fZG9jT2JqZWN0
cy5uZXh0KCkgKQotICAgICAgICBpZiAoIGNvLT50eXBlKCkgPT0gQ2FjaGVkT2JqZWN0OjpJbWFn
ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIENhY2hlZEltYWdlICppbWcgPSBjb25zdF9jYXN0
PENhY2hlZEltYWdlKj4oIHN0YXRpY19jYXN0PGNvbnN0IENhY2hlZEltYWdlICo+KCBjbyApICk7
Ci0KLSAgICAgICAgICAgIGltZy0+c2V0U2hvd0FuaW1hdGlvbnMoIHNob3dBbmltYXRpb25zICk7
Ci0gICAgICAgIH0KLX0KLQotdm9pZCBEb2NMb2FkZXI6OnJlbW92ZUNhY2hlZE9iamVjdCggQ2Fj
aGVkT2JqZWN0KiBvICkgY29uc3QKLXsKLSAgICBtX2RvY09iamVjdHMucmVtb3ZlUmVmKCBvICk7
Ci19Ci0KLXZvaWQgRG9jTG9hZGVyOjpzZXRMb2FkSW5Qcm9ncmVzcyhib29sIGxvYWQpCi17Ci0g
ICAgbV9sb2FkSW5Qcm9ncmVzcyA9IGxvYWQ7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLQotCi1Mb2FkZXI6OkxvYWRlcigpIDogUU9iamVjdCgpCi17Ci0gICAgbV9y
ZXF1ZXN0c1BlbmRpbmcuc2V0QXV0b0RlbGV0ZSggdHJ1ZSApOwotICAgIG1fcmVxdWVzdHNMb2Fk
aW5nLnNldEF1dG9EZWxldGUoIHRydWUgKTsKLSAgICBrd3EgPSBuZXcgS1dRTG9hZGVyKHRoaXMp
OwotfQotCi1Mb2FkZXI6On5Mb2FkZXIoKQotewotICAgIGRlbGV0ZSBrd3E7Ci19Ci0KLXZvaWQg
TG9hZGVyOjpsb2FkKERvY0xvYWRlciogZGwsIENhY2hlZE9iamVjdCAqb2JqZWN0LCBib29sIGlu
Y3JlbWVudGFsKQotewotICAgIFJlcXVlc3QgKnJlcSA9IG5ldyBSZXF1ZXN0KGRsLCBvYmplY3Qs
IGluY3JlbWVudGFsKTsKLSAgICBtX3JlcXVlc3RzUGVuZGluZy5hcHBlbmQocmVxKTsKLQotICAg
IGVtaXQgcmVxdWVzdFN0YXJ0ZWQoIHJlcS0+bV9kb2NMb2FkZXIsIHJlcS0+b2JqZWN0ICk7Ci0K
LSAgICBzZXJ2ZVBlbmRpbmdSZXF1ZXN0cygpOwotfQotCi12b2lkIExvYWRlcjo6c2VydmVQZW5k
aW5nUmVxdWVzdHMoKQotewotICBpZiAoIG1fcmVxdWVzdHNQZW5kaW5nLmNvdW50KCkgPT0gMCAp
Ci0gICAgICByZXR1cm47Ci0KLSAgLy8gZ2V0IHRoZSBmaXJzdCBwZW5kaW5nIHJlcXVlc3QKLSAg
UmVxdWVzdCAqcmVxID0gbV9yZXF1ZXN0c1BlbmRpbmcudGFrZSgwKTsKLQotICBLVVJMIHUocmVx
LT5vYmplY3QtPnVybCgpLnFzdHJpbmcoKSk7Ci0gIEtJTzo6VHJhbnNmZXJKb2IqIGpvYiA9IEtJ
Tzo6Z2V0KCB1LCBmYWxzZSwgZmFsc2UgLypubyBHVUkqLywgdHJ1ZSk7Ci0gIAotICBqb2ItPmFk
ZE1ldGFEYXRhKCJjYWNoZSIsIGdldENhY2hlQ29udHJvbFN0cmluZyhyZXEtPm9iamVjdC0+Y2Fj
aGVQb2xpY3koKSkpOwotICBpZiAoIXJlcS0+b2JqZWN0LT5hY2NlcHQoKS5pc0VtcHR5KCkpCi0g
ICAgICBqb2ItPmFkZE1ldGFEYXRhKCJhY2NlcHQiLCByZXEtPm9iamVjdC0+YWNjZXB0KCkpOwot
ICBpZiAoIHJlcS0+bV9kb2NMb2FkZXIgKSAgewotICAgICAgS1VSTCByID0gcmVxLT5tX2RvY0xv
YWRlci0+ZG9jKCktPlVSTCgpOwotICAgICAgaWYgKCByLnByb3RvY29sKCkuc3RhcnRzV2l0aCgg
Imh0dHAiICkgJiYgci5wYXRoKCkuaXNFbXB0eSgpICkKLSAgICAgICAgICByLnNldFBhdGgoICIv
IiApOwotCi0gICAgICBqb2ItPmFkZE1ldGFEYXRhKCJyZWZlcnJlciIsIHIudXJsKCkpOwotICAg
ICAgUVN0cmluZyBkb21haW4gPSByLmhvc3QoKTsKLSAgICAgIGlmIChyZXEtPm1fZG9jTG9hZGVy
LT5kb2MoKS0+aXNIVE1MRG9jdW1lbnQoKSkKLSAgICAgICAgIGRvbWFpbiA9IHN0YXRpY19jYXN0
PEhUTUxEb2N1bWVudEltcGwqPihyZXEtPm1fZG9jTG9hZGVyLT5kb2MoKSktPmRvbWFpbigpLnFz
dHJpbmcoKTsKLSAgICAgIGlmIChjcm9zc0RvbWFpbih1Lmhvc3QoKSwgZG9tYWluKSkKLSAgICAg
ICAgIGpvYi0+YWRkTWV0YURhdGEoImNyb3NzLWRvbWFpbiIsICJ0cnVlIik7Ci0gIH0KLQotICBj
b25uZWN0KCBqb2IsIFNJR05BTCggcmVzdWx0KCBLSU86OkpvYiAqLCBOU0RhdGEgKikgKSwgdGhp
cywgU0xPVCggc2xvdEZpbmlzaGVkKCBLSU86OkpvYiAqLCBOU0RhdGEgKikgKSApOwotICAKLSAg
Y29ubmVjdCggam9iLCBTSUdOQUwoIGRhdGEoIEtJTzo6Sm9iKiwgY29uc3QgY2hhciAqLCBpbnQp
KSwKLSAgICAgICAgICAgU0xPVCggc2xvdERhdGEoIEtJTzo6Sm9iKiwgY29uc3QgY2hhciAqLCBp
bnQpKSk7Ci0gIGNvbm5lY3QoIGpvYiwgU0lHTkFMKCByZWNlaXZlZFJlc3BvbnNlKCBLSU86Okpv
YiAqLCBOU1VSTFJlc3BvbnNlICopKSwgU0xPVCggc2xvdFJlY2VpdmVkUmVzcG9uc2UoIEtJTzo6
Sm9iICosIE5TVVJMUmVzcG9uc2UgKikpICk7Ci0KLSAgaWYgKEtXUVNlcnZlUmVxdWVzdCh0aGlz
LCByZXEsIGpvYikpIHsKLSAgICAgIGlmIChyZXEtPm9iamVjdC0+dHlwZSgpID09IENhY2hlZE9i
amVjdDo6SW1hZ2UpIHsKLQlDYWNoZWRJbWFnZSAqY2kgPSBzdGF0aWNfY2FzdDxDYWNoZWRJbWFn
ZSo+KHJlcS0+b2JqZWN0KTsKLQlpZiAoY2ktPmRlY29kZXJDYWxsYmFjaygpKSB7Ci0JICAgIG1f
cmVxdWVzdHNCYWNrZ3JvdW5kRGVjb2RpbmcuYXBwZW5kKHJlcSk7Ci0JfQotICAgICAgfQotICAg
ICAgbV9yZXF1ZXN0c0xvYWRpbmcuaW5zZXJ0KGpvYiwgcmVxKTsKLSAgfQotfQotCi12b2lkIExv
YWRlcjo6c2xvdEZpbmlzaGVkKCBLSU86OkpvYiogam9iLCBOU0RhdGEgKmFsbERhdGEpCi17Ci0g
ICAgUmVxdWVzdCAqciA9IG1fcmVxdWVzdHNMb2FkaW5nLnRha2UoIGpvYiApOwotICAgIEtJTzo6
VHJhbnNmZXJKb2IqIGogPSBzdGF0aWNfY2FzdDxLSU86OlRyYW5zZmVySm9iKj4oam9iKTsKLQot
ICAgIGlmICggIXIgKQotICAgICAgICByZXR1cm47Ci0KLSAgICBDYWNoZWRPYmplY3QgKm9iamVj
dCA9IHItPm9iamVjdDsKLSAgICBEb2NMb2FkZXIgKmRvY0xvYWRlciA9IHItPm1fZG9jTG9hZGVy
OwotICAgIAotICAgIGJvb2wgYmFja2dyb3VuZEltYWdlRGVjb2RpbmcgPSAob2JqZWN0LT50eXBl
KCkgPT0gQ2FjaGVkT2JqZWN0OjpJbWFnZSAmJiAKLQlzdGF0aWNfY2FzdDxDYWNoZWRJbWFnZSo+
KG9iamVjdCktPmRlY29kZXJDYWxsYmFjaygpKTsKLQkKLSAgICBpZiAoai0+ZXJyb3IoKSB8fCBq
LT5pc0Vycm9yUGFnZSgpKSB7Ci0gICAgICAgIC8vIFVzZSB0aGUgYmFja2dyb3VuZCBpbWFnZSBk
ZWNvZGVyJ3MgY2FsbGJhY2sgdG8gaGFuZGxlIHRoZSBlcnJvci4KLSAgICAgICAgaWYgKGJhY2tn
cm91bmRJbWFnZURlY29kaW5nKSB7Ci0gICAgICAgICAgICBDYWNoZWRJbWFnZUNhbGxiYWNrICpj
YWxsYmFjayA9IHN0YXRpY19jYXN0PENhY2hlZEltYWdlKj4ob2JqZWN0KS0+ZGVjb2RlckNhbGxi
YWNrKCk7Ci0gICAgICAgICAgICBjYWxsYmFjay0+aGFuZGxlRXJyb3IoKTsKLSAgICAgICAgfQot
ICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGRvY0xvYWRlci0+c2V0TG9hZEluUHJvZ3Jlc3Mo
dHJ1ZSk7Ci0gICAgICAgICAgICByLT5vYmplY3QtPmVycm9yKCBqb2ItPmVycm9yKCksIGpvYi0+
ZXJyb3JUZXh0KCkuYXNjaWkoKSApOwotICAgICAgICAgICAgZG9jTG9hZGVyLT5zZXRMb2FkSW5Q
cm9ncmVzcyhmYWxzZSk7Ci0gICAgICAgICAgICBlbWl0IHJlcXVlc3RGYWlsZWQoIGRvY0xvYWRl
ciwgb2JqZWN0ICk7Ci0gICAgICAgICAgICBDYWNoZTo6cmVtb3ZlQ2FjaGVFbnRyeSggb2JqZWN0
ICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGRvY0xvYWRlci0+c2V0
TG9hZEluUHJvZ3Jlc3ModHJ1ZSk7Ci0gICAgICAgIG9iamVjdC0+ZGF0YShyLT5tX2J1ZmZlciwg
dHJ1ZSk7Ci0gICAgICAgIHItPm9iamVjdC0+c2V0QWxsRGF0YShhbGxEYXRhKTsKLSAgICAgICAg
ZG9jTG9hZGVyLT5zZXRMb2FkSW5Qcm9ncmVzcyhmYWxzZSk7Ci0gICAgICAgIAotICAgICAgICAv
LyBMZXQgdGhlIGJhY2tncm91bmQgaW1hZ2UgZGVjb2RlciB0cmlnZ2VyIHRoZSBkb25lIHNpZ25h
bC4KLSAgICAgICAgaWYgKCFiYWNrZ3JvdW5kSW1hZ2VEZWNvZGluZykKLSAgICAgICAgICAgIGVt
aXQgcmVxdWVzdERvbmUoIGRvY0xvYWRlciwgb2JqZWN0ICk7Ci0KLSAgICAgICAgb2JqZWN0LT5m
aW5pc2goKTsKLSAgICB9Ci0KLSAgICAvLyBMZXQgdGhlIGJhY2tncm91bmQgaW1hZ2UgZGVjb2Rl
ciByZWxlYXNlIHRoZSByZXF1ZXN0IHdoZW4gaXQgaXMKLSAgICAvLyBmaW5pc2hlZC4KLSAgICBp
ZiAoIWJhY2tncm91bmRJbWFnZURlY29kaW5nKSB7Ci0gICAgICAgIGRlbGV0ZSByOwotICAgIH0K
LQotICAgIHNlcnZlUGVuZGluZ1JlcXVlc3RzKCk7Ci19Ci0KLQotdm9pZCBMb2FkZXI6OnNsb3RS
ZWNlaXZlZFJlc3BvbnNlKEtJTzo6Sm9iKiBqb2IsIE5TVVJMUmVzcG9uc2UgKnJlc3BvbnNlKQot
ewotICAgIFJlcXVlc3QgKnIgPSBtX3JlcXVlc3RzTG9hZGluZ1tqb2JdOwotICAgIEFTU0VSVChy
KTsKLSAgICBBU1NFUlQocmVzcG9uc2UpOwotICAgIHItPm9iamVjdC0+c2V0UmVzcG9uc2UocmVz
cG9uc2UpOwotICAgIHItPm9iamVjdC0+c2V0RXhwaXJlRGF0ZShLV1FDYWNoZU9iamVjdEV4cGly
ZXNUaW1lKHItPm1fZG9jTG9hZGVyLCByZXNwb25zZSksIGZhbHNlKTsKLSAgICAKLSAgICBRU3Ry
aW5nIGNocyA9IHN0YXRpY19jYXN0PEtJTzo6VHJhbnNmZXJKb2IqPihqb2IpLT5xdWVyeU1ldGFE
YXRhKCJjaGFyc2V0Iik7Ci0gICAgaWYgKCFjaHMuaXNOdWxsKCkpCi0gICAgICAgIHItPm9iamVj
dC0+c2V0Q2hhcnNldChjaHMpOwotICAgIAotICAgIGlmIChyLT5tdWx0aXBhcnQpIHsKLSAgICAg
ICAgQVNTRVJUKHItPm9iamVjdC0+aXNJbWFnZSgpKTsKLSAgICAgICAgc3RhdGljX2Nhc3Q8Q2Fj
aGVkSW1hZ2UgKj4oci0+b2JqZWN0KS0+Y2xlYXIoKTsKLSAgICAgICAgci0+bV9idWZmZXIgPSBR
QnVmZmVyKCk7Ci0gICAgICAgIGlmIChyLT5tX2RvY0xvYWRlci0+cGFydCgpKQotICAgICAgICAg
ICAgci0+bV9kb2NMb2FkZXItPnBhcnQoKS0+Y2hlY2tDb21wbGV0ZWQoKTsKLSAgICAgICAgCi0g
ICAgfSBlbHNlIGlmIChLV1FSZXNwb25zZUlzTXVsdGlwYXJ0KHJlc3BvbnNlKSkgewotICAgICAg
ICByLT5tdWx0aXBhcnQgPSB0cnVlOwotICAgICAgICBpZiAoIXItPm9iamVjdC0+aXNJbWFnZSgp
KQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8S0lPOjpUcmFuc2ZlckpvYio+KGpvYiktPmNhbmNl
bCgpOwotICAgIH0KLX0KLQotCi12b2lkIExvYWRlcjo6c2xvdERhdGEoIEtJTzo6Sm9iKmpvYiwg
Y29uc3QgY2hhciAqZGF0YSwgaW50IHNpemUgKQotewotICAgIFJlcXVlc3QgKnIgPSBtX3JlcXVl
c3RzTG9hZGluZ1tqb2JdOwotICAgIGlmKCFyKSB7Ci0gICAgICAgIGtkRGVidWcoIDYwNjAgKSA8
PCAiZ290IGRhdGEgZm9yIHVua25vd24gcmVxdWVzdCEiIDw8IGVuZGw7Ci0gICAgICAgIHJldHVy
bjsKLSAgICB9Ci0KLSAgICBpZiAoICFyLT5tX2J1ZmZlci5pc09wZW4oKSApCi0gICAgICAgIHIt
Pm1fYnVmZmVyLm9wZW4oIElPX1dyaXRlT25seSApOwotCi0gICAgci0+bV9idWZmZXIud3JpdGVC
bG9jayggZGF0YSwgc2l6ZSApOwotCi0gICAgaWYgKHItPm11bHRpcGFydCkKLSAgICAgICAgci0+
b2JqZWN0LT5kYXRhKCByLT5tX2J1ZmZlciwgdHJ1ZSApOyAvLyB0aGUgbG9hZGVyIGRlbGl2ZXJz
IHRoZSBkYXRhIGluIGEgbXVsdGlwYXJ0IHNlY3Rpb24gYWxsIGF0IG9uY2UsIHNlbmQgZW9mCi0g
ICAgZWxzZSBpZihyLT5pbmNyZW1lbnRhbCkKLSAgICAgICAgci0+b2JqZWN0LT5kYXRhKCByLT5t
X2J1ZmZlciwgZmFsc2UgKTsKLX0KLQotaW50IExvYWRlcjo6bnVtUmVxdWVzdHMoIERvY0xvYWRl
ciogZGwgKSBjb25zdAotewotICAgIGludCByZXMgPSAwOwotCi0gICAgUVB0ckxpc3RJdGVyYXRv
cjxSZXF1ZXN0PiBwSXQoIG1fcmVxdWVzdHNQZW5kaW5nICk7Ci0gICAgZm9yICg7IHBJdC5jdXJy
ZW50KCk7ICsrcEl0ICkKLSAgICAgICAgaWYgKCBwSXQuY3VycmVudCgpLT5tX2RvY0xvYWRlciA9
PSBkbCApCi0gICAgICAgICAgICByZXMrKzsKLQotICAgIFFQdHJEaWN0SXRlcmF0b3I8UmVxdWVz
dD4gbEl0KCBtX3JlcXVlc3RzTG9hZGluZyApOwotICAgIGZvciAoOyBsSXQuY3VycmVudCgpOyAr
K2xJdCApCi0gICAgICAgIGlmICggbEl0LmN1cnJlbnQoKS0+bV9kb2NMb2FkZXIgPT0gZGwgKQot
ICAgICAgICAgICAgaWYgKCFsSXQuY3VycmVudCgpLT5tdWx0aXBhcnQpCi0gICAgICAgICAgICAg
ICAgcmVzKys7Ci0KLSAgICBRUHRyTGlzdEl0ZXJhdG9yPFJlcXVlc3Q+IGJkSXQoIG1fcmVxdWVz
dHNCYWNrZ3JvdW5kRGVjb2RpbmcgKTsKLSAgICBmb3IgKDsgYmRJdC5jdXJyZW50KCk7ICsrYmRJ
dCApCi0gICAgICAgIGlmICggYmRJdC5jdXJyZW50KCktPm1fZG9jTG9hZGVyID09IGRsICkKLSAg
ICAgICAgICAgIHJlcysrOwotCi0gICAgaWYgKGRsLT5sb2FkSW5Qcm9ncmVzcygpKQotICAgICAg
ICByZXMrKzsKLSAgICAgICAgCi0gICAgcmV0dXJuIHJlczsKLX0KLQotdm9pZCBMb2FkZXI6OmNh
bmNlbFJlcXVlc3RzKCBEb2NMb2FkZXIqIGRsICkKLXsKLSAgICBRUHRyTGlzdEl0ZXJhdG9yPFJl
cXVlc3Q+IHBJdCggbV9yZXF1ZXN0c1BlbmRpbmcgKTsKLSAgICB3aGlsZSAoIHBJdC5jdXJyZW50
KCkgKQotICAgIHsKLSAgICAgICAgaWYgKHBJdC5jdXJyZW50KCktPm1fZG9jTG9hZGVyID09IGRs
KSB7Ci0gICAgICAgICAgICBDYWNoZTo6cmVtb3ZlQ2FjaGVFbnRyeSggcEl0LmN1cnJlbnQoKS0+
b2JqZWN0ICk7Ci0gICAgICAgICAgICBtX3JlcXVlc3RzUGVuZGluZy5yZW1vdmUoIHBJdCApOwot
ICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgICsrcEl0OwotICAgIH0KLQotICAg
IFFQdHJEaWN0SXRlcmF0b3I8UmVxdWVzdD4gbEl0KCBtX3JlcXVlc3RzTG9hZGluZyApOwotICAg
IHdoaWxlICggbEl0LmN1cnJlbnQoKSApCi0gICAgewotICAgICAgICBpZiAobEl0LmN1cnJlbnQo
KS0+bV9kb2NMb2FkZXIgPT0gZGwpIHsKLSAgICAgICAgICAgIEtJTzo6Sm9iICpqb2IgPSBzdGF0
aWNfY2FzdDxLSU86OkpvYiAqPiggbEl0LmN1cnJlbnRLZXkoKSApOwotICAgICAgICAgICAgQ2Fj
aGU6OnJlbW92ZUNhY2hlRW50cnkoIGxJdC5jdXJyZW50KCktPm9iamVjdCApOwotICAgICAgICAg
ICAgbV9yZXF1ZXN0c0xvYWRpbmcucmVtb3ZlKCBsSXQuY3VycmVudEtleSgpICk7Ci0gICAgICAg
ICAgICBqb2ItPmtpbGwoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICAr
K2xJdDsKLSAgICB9Ci0KLSAgICBRUHRyTGlzdEl0ZXJhdG9yPFJlcXVlc3Q+IGJkSXQoIG1fcmVx
dWVzdHNCYWNrZ3JvdW5kRGVjb2RpbmcgKTsKLSAgICB3aGlsZSAoYmRJdC5jdXJyZW50KCkpIHsK
LSAgICAgICAgaWYgKGJkSXQuY3VycmVudCgpLT5tX2RvY0xvYWRlciA9PSBkbCkgewotICAgICAg
ICAgICAgQ2FjaGU6OnJlbW92ZUNhY2hlRW50cnkoIGJkSXQuY3VycmVudCgpLT5vYmplY3QgKTsK
LSAgICAgICAgICAgIG1fcmVxdWVzdHNCYWNrZ3JvdW5kRGVjb2RpbmcucmVtb3ZlKCBiZEl0ICk7
Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgKytiZEl0OwotICAgIH0KLX0K
LQotdm9pZCBMb2FkZXI6OnJlbW92ZUJhY2tncm91bmREZWNvZGluZ1JlcXVlc3QgKFJlcXVlc3Qg
KnIpCi17Ci0gICAgYm9vbCBwcmVzZW50ID0gbV9yZXF1ZXN0c0JhY2tncm91bmREZWNvZGluZy5j
b250YWluc1JlZihyKTsKLSAgICBpZiAocHJlc2VudCkgewotCW1fcmVxdWVzdHNCYWNrZ3JvdW5k
RGVjb2RpbmcucmVtb3ZlIChyKTsKLSAgICB9Ci19Ci0KLUtJTzo6Sm9iICpMb2FkZXI6OmpvYkZv
clJlcXVlc3QoIGNvbnN0IERPTTo6RE9NU3RyaW5nICZ1cmwgKSBjb25zdAotewotICAgIFFQdHJE
aWN0SXRlcmF0b3I8UmVxdWVzdD4gaXQoIG1fcmVxdWVzdHNMb2FkaW5nICk7Ci0KLSAgICBmb3Ig
KDsgaXQuY3VycmVudCgpOyArK2l0ICkKLSAgICB7Ci0gICAgICAgIENhY2hlZE9iamVjdCAqb2Jq
ID0gaXQuY3VycmVudCgpLT5vYmplY3Q7Ci0KLSAgICAgICAgaWYgKCBvYmogJiYgb2JqLT51cmwo
KSA9PSB1cmwgKQotICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEtJTzo6Sm9iICo+KCBp
dC5jdXJyZW50S2V5KCkgKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotCi1ib29sIExv
YWRlcjo6aXNLSFRNTExvYWRlcigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLQot
Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLUxSVUxpc3Q6OkxSVUxpc3QoKQotOm1faGVhZCgw
KSwgbV90YWlsKDApIAote30KLQotTFJVTGlzdDo6fkxSVUxpc3QoKQote30KLQotUURpY3Q8Q2Fj
aGVkT2JqZWN0PiAqQ2FjaGU6OmNhY2hlID0gMDsKLVFQdHJMaXN0PERvY0xvYWRlcj4qIENhY2hl
Ojpkb2Nsb2FkZXIgPSAwOwotTG9hZGVyICpDYWNoZTo6bV9sb2FkZXIgPSAwOwotCi1pbnQgQ2Fj
aGU6Om1heFNpemUgPSBERUZDQUNIRVNJWkU7Ci1pbnQgQ2FjaGU6Om1heENhY2hlYWJsZSA9IE1B
WENBQ0hFQUJMRTsKLWludCBDYWNoZTo6Zmx1c2hDb3VudCA9IDA7Ci0KLVFQaXhtYXAgKkNhY2hl
OjpudWxsUGl4bWFwID0gMDsKLVFQaXhtYXAgKkNhY2hlOjpicm9rZW5QaXhtYXAgPSAwOwotCi1D
YWNoZWRPYmplY3QgKkNhY2hlOjptX2hlYWRPZlVuY2FjaGVhYmxlTGlzdCA9IDA7Ci1pbnQgQ2Fj
aGU6Om1fdG90YWxTaXplT2ZMUlVMaXN0cyA9IDA7Ci1pbnQgQ2FjaGU6Om1fY291bnRPZkxSVUFu
ZFVuY2FjaGVhYmxlTGlzdHM7Ci1MUlVMaXN0ICpDYWNoZTo6bV9MUlVMaXN0cyA9IDA7Ci0KLXZv
aWQgQ2FjaGU6OmluaXQoKQotewotICAgIGlmICggIWNhY2hlICkKLSAgICAgICAgY2FjaGUgPSBu
ZXcgUURpY3Q8Q2FjaGVkT2JqZWN0Pig0MDEsIHRydWUpOwotCi0gICAgaWYgKCAhZG9jbG9hZGVy
ICkKLSAgICAgICAgZG9jbG9hZGVyID0gbmV3IFFQdHJMaXN0PERvY0xvYWRlcj47Ci0KLSAgICBp
ZiAoICFudWxsUGl4bWFwICkKLSAgICAgICAgbnVsbFBpeG1hcCA9IG5ldyBRUGl4bWFwOwotCi0g
ICAgaWYgKCAhYnJva2VuUGl4bWFwICkKLSAgICAgICAgYnJva2VuUGl4bWFwID0gS1dRTG9hZFBp
eG1hcCgibWlzc2luZ19pbWFnZSIpOwotCi0gICAgaWYgKCAhbV9sb2FkZXIgKQotICAgICAgICBt
X2xvYWRlciA9IG5ldyBMb2FkZXIoKTsKLX0KLQotdm9pZCBDYWNoZTo6Y2xlYXIoKQotewotICAg
IGlmICghY2FjaGUpCi0gICAgICAgIHJldHVybjsKLQotICAgIGNhY2hlLT5zZXRBdXRvRGVsZXRl
KCB0cnVlICk7Ci0gICAgZGVsZXRlIGNhY2hlOyBjYWNoZSA9IDA7Ci0gICAgZGVsZXRlIG51bGxQ
aXhtYXA7IG51bGxQaXhtYXAgPSAwOwotICAgIGRlbGV0ZSBicm9rZW5QaXhtYXA7IGJyb2tlblBp
eG1hcCA9IDA7Ci0gICAgZGVsZXRlIG1fbG9hZGVyOyAgIG1fbG9hZGVyID0gMDsKLSAgICBkZWxl
dGUgZG9jbG9hZGVyOyBkb2Nsb2FkZXIgPSAwOwotfQotCi1DYWNoZWRJbWFnZSAqQ2FjaGU6OnJl
cXVlc3RJbWFnZSggRG9jTG9hZGVyKiBkbCwgY29uc3QgRE9NU3RyaW5nICYgdXJsLCBib29sIHJl
bG9hZCwgdGltZV90IF9leHBpcmVEYXRlICkKLXsKLSAgICAvLyB0aGlzIGJyaW5ncyB0aGUgX3Vy
bCB0byBhIHN0YW5kYXJkIGZvcm0uLi4KLSAgICBLVVJMIGt1cmw7Ci0gICAgaWYgKGRsKQotICAg
ICAgICBrdXJsID0gZGwtPm1fZG9jLT5jb21wbGV0ZVVSTCggdXJsLnFzdHJpbmcoKSApOwotICAg
IGVsc2UKLSAgICAgICAga3VybCA9IHVybC5xc3RyaW5nKCk7Ci0gICAgcmV0dXJuIHJlcXVlc3RJ
bWFnZShkbCwga3VybCwgcmVsb2FkLCBfZXhwaXJlRGF0ZSk7Ci19Ci0KLUNhY2hlZEltYWdlICpD
YWNoZTo6cmVxdWVzdEltYWdlKCBEb2NMb2FkZXIqIGRsLCBjb25zdCBLVVJMICYgdXJsLCBib29s
IHJlbG9hZCwgdGltZV90IF9leHBpcmVEYXRlICkKLXsKLSAgICBLSU86OkNhY2hlQ29udHJvbCBj
YWNoZVBvbGljeTsKLSAgICBpZiAoZGwpCi0gICAgICAgIGNhY2hlUG9saWN5ID0gZGwtPmNhY2hl
UG9saWN5KCk7Ci0gICAgZWxzZQotICAgICAgICBjYWNoZVBvbGljeSA9IEtJTzo6Q0NfVmVyaWZ5
OwotCi0gICAgLy8gQ2hlY2tpbmcgaWYgdGhlIFVSTCBpcyBtYWxmb3JtZWQgaXMgbG90cyBvZiBl
eHRyYSB3b3JrIGZvciBsaXR0bGUgYmVuZWZpdC4KLQotICAgIGlmICghZGwtPmRvYygpLT5zaG91
bGRDcmVhdGVSZW5kZXJlcnMoKSl7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIENh
Y2hlZE9iamVjdCAqbyA9IDA7Ci0gICAgaWYgKCFyZWxvYWQpCi0gICAgICAgIG8gPSBjYWNoZS0+
ZmluZCh1cmwudXJsKCkpOwotICAgIGlmKCFvKQotICAgIHsKLSNpZmRlZiBDQUNIRV9ERUJVRwot
ICAgICAgICBrZERlYnVnKCA2MDYwICkgPDwgIkNhY2hlOiBuZXc6ICIgPDwgdXJsLnVybCgpIDw8
IGVuZGw7Ci0jZW5kaWYKLSAgICAgICAgQ2FjaGVkSW1hZ2UgKmltID0gbmV3IENhY2hlZEltYWdl
KGRsLCB1cmwudXJsKCksIGNhY2hlUG9saWN5LCBfZXhwaXJlRGF0ZSk7Ci0gICAgICAgIGlmICgg
ZGwgJiYgZGwtPmF1dG9sb2FkSW1hZ2VzKCkgKSBDYWNoZTo6bG9hZGVyKCktPmxvYWQoZGwsIGlt
LCB0cnVlKTsKLSAgICAgICAgaWYgKGNhY2hlRGlzYWJsZWQpCi0gICAgICAgICAgICBpbS0+c2V0
RnJlZSh0cnVlKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgIGNhY2hlLT5pbnNlcnQoIHVybC51
cmwoKSwgaW0gKTsKLSAgICAgICAgbW92ZVRvSGVhZE9mTFJVTGlzdChpbSk7Ci0gICAgICAgIH0K
LSAgICAgICAgbyA9IGltOwotICAgIH0KLQotICAgIAotICAgIGlmKG8tPnR5cGUoKSAhPSBDYWNo
ZWRPYmplY3Q6OkltYWdlKQotICAgIHsKLSNpZmRlZiBDQUNIRV9ERUJVRwotICAgICAgICBrZERl
YnVnKCA2MDYwICkgPDwgIkNhY2hlOjpJbnRlcm5hbCBFcnJvciBpbiByZXF1ZXN0SW1hZ2UgdXJs
PSIgPDwga3VybC51cmwoKSA8PCAiISIgPDwgZW5kbDsKLSNlbmRpZgotICAgICAgICByZXR1cm4g
MDsKLSAgICB9Ci0KLSNpZmRlZiBDQUNIRV9ERUJVRwotICAgIGlmKCBvLT5zdGF0dXMoKSA9PSBD
YWNoZWRPYmplY3Q6OlBlbmRpbmcgKQotICAgICAgICBrZERlYnVnKCA2MDYwICkgPDwgIkNhY2hl
OiBsb2FkaW5nIGluIHByb2dyZXNzOiAiIDw8IGt1cmwudXJsKCkgPDwgZW5kbDsKLSAgICBlbHNl
Ci0gICAgICAgIGtkRGVidWcoIDYwNjAgKSA8PCAiQ2FjaGU6IHVzaW5nIGNhY2hlZDogIiA8PCBr
dXJsLnVybCgpIDw8ICIsIHN0YXR1cyAiIDw8IG8tPnN0YXR1cygpIDw8IGVuZGw7Ci0jZW5kaWYK
LQotICAgIG1vdmVUb0hlYWRPZkxSVUxpc3Qobyk7Ci0gICAgaWYgKCBkbCApIHsKLSAgICAgICAg
ZGwtPm1fZG9jT2JqZWN0cy5yZW1vdmUoIG8gKTsKLSAgICAgICAgaWYgKCFjYWNoZURpc2FibGVk
KQotICAgICAgICBkbC0+bV9kb2NPYmplY3RzLmFwcGVuZCggbyApOwotICAgIH0KLSAgICByZXR1
cm4gc3RhdGljX2Nhc3Q8Q2FjaGVkSW1hZ2UgKj4obyk7Ci19Ci0KLUNhY2hlZENTU1N0eWxlU2hl
ZXQgKkNhY2hlOjpyZXF1ZXN0U3R5bGVTaGVldCggRG9jTG9hZGVyKiBkbCwgY29uc3QgRE9NU3Ry
aW5nICYgdXJsLCBib29sIHJlbG9hZCwgdGltZV90IF9leHBpcmVEYXRlLCBjb25zdCBRU3RyaW5n
JiBjaGFyc2V0KQotewotICAgIC8vIHRoaXMgYnJpbmdzIHRoZSBfdXJsIHRvIGEgc3RhbmRhcmQg
Zm9ybS4uLgotICAgIEtVUkwga3VybDsKLSAgICBLSU86OkNhY2hlQ29udHJvbCBjYWNoZVBvbGlj
eTsKLSAgICBpZiAoIGRsICkKLSAgICB7Ci0gICAgICAgIGt1cmwgPSBkbC0+bV9kb2MtPmNvbXBs
ZXRlVVJMKCB1cmwucXN0cmluZygpICk7Ci0gICAgICAgIGNhY2hlUG9saWN5ID0gZGwtPmNhY2hl
UG9saWN5KCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGt1cmwgPSB1cmwucXN0
cmluZygpOwotICAgICAgICBjYWNoZVBvbGljeSA9IEtJTzo6Q0NfVmVyaWZ5OwotICAgIH0KLQot
ICAgIC8vIENoZWNraW5nIGlmIHRoZSBVUkwgaXMgbWFsZm9ybWVkIGlzIGxvdHMgb2YgZXh0cmEg
d29yayBmb3IgbGl0dGxlIGJlbmVmaXQuCi0KLSAgICBDYWNoZWRPYmplY3QgKm8gPSBjYWNoZS0+
ZmluZChrdXJsLnVybCgpKTsKLSAgICBpZighbykKLSAgICB7Ci0jaWZkZWYgQ0FDSEVfREVCVUcK
LSAgICAgICAga2REZWJ1ZyggNjA2MCApIDw8ICJDYWNoZTogbmV3OiAiIDw8IGt1cmwudXJsKCkg
PDwgZW5kbDsKLSNlbmRpZgotICAgICAgICBDYWNoZWRDU1NTdHlsZVNoZWV0ICpzaGVldCA9IG5l
dyBDYWNoZWRDU1NTdHlsZVNoZWV0KGRsLCBrdXJsLnVybCgpLCBjYWNoZVBvbGljeSwgX2V4cGly
ZURhdGUsIGNoYXJzZXQpOwotICAgICAgICBpZiAoY2FjaGVEaXNhYmxlZCkKLSAgICAgICAgICAg
IHNoZWV0LT5zZXRGcmVlKHRydWUpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgY2FjaGUtPmlu
c2VydCgga3VybC51cmwoKSwgc2hlZXQgKTsKLSAgICAgICAgbW92ZVRvSGVhZE9mTFJVTGlzdChz
aGVldCk7Ci0gICAgICAgIH0KLSAgICAgICAgbyA9IHNoZWV0OwotICAgIH0KLQotICAgIAotICAg
IGlmKG8tPnR5cGUoKSAhPSBDYWNoZWRPYmplY3Q6OkNTU1N0eWxlU2hlZXQpCi0gICAgewotI2lm
ZGVmIENBQ0hFX0RFQlVHCi0gICAgICAgIGtkRGVidWcoIDYwNjAgKSA8PCAiQ2FjaGU6OkludGVy
bmFsIEVycm9yIGluIHJlcXVlc3RTdHlsZVNoZWV0IHVybD0iIDw8IGt1cmwudXJsKCkgPDwgIiEi
IDw8IGVuZGw7Ci0jZW5kaWYKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0jaWZkZWYgQ0FD
SEVfREVCVUcKLSAgICBpZiggby0+c3RhdHVzKCkgPT0gQ2FjaGVkT2JqZWN0OjpQZW5kaW5nICkK
LSAgICAgICAga2REZWJ1ZyggNjA2MCApIDw8ICJDYWNoZTogbG9hZGluZyBpbiBwcm9ncmVzczog
IiA8PCBrdXJsLnVybCgpIDw8IGVuZGw7Ci0gICAgZWxzZQotICAgICAgICBrZERlYnVnKCA2MDYw
ICkgPDwgIkNhY2hlOiB1c2luZyBjYWNoZWQ6ICIgPDwga3VybC51cmwoKSA8PCBlbmRsOwotI2Vu
ZGlmCi0KLSAgICBtb3ZlVG9IZWFkT2ZMUlVMaXN0KG8pOwotICAgIGlmICggZGwgKSB7Ci0gICAg
ICAgIGRsLT5tX2RvY09iamVjdHMucmVtb3ZlKCBvICk7Ci0gICAgICAgIGlmICghY2FjaGVEaXNh
YmxlZCkKLSAgICAgICAgZGwtPm1fZG9jT2JqZWN0cy5hcHBlbmQoIG8gKTsKLSAgICB9Ci0gICAg
cmV0dXJuIHN0YXRpY19jYXN0PENhY2hlZENTU1N0eWxlU2hlZXQgKj4obyk7Ci19Ci0KLXZvaWQg
Q2FjaGU6OnByZWxvYWRTdHlsZVNoZWV0KCBjb25zdCBRU3RyaW5nICZ1cmwsIGNvbnN0IFFTdHJp
bmcgJnN0eWxlc2hlZXRfZGF0YSkKLXsKLSAgICBDYWNoZWRPYmplY3QgKm8gPSBjYWNoZS0+Zmlu
ZCh1cmwpOwotICAgIGlmKG8pCi0gICAgICAgIHJlbW92ZUNhY2hlRW50cnkobyk7Ci0KLSAgICBD
YWNoZWRDU1NTdHlsZVNoZWV0ICpzdHlsZXNoZWV0ID0gbmV3IENhY2hlZENTU1N0eWxlU2hlZXQo
dXJsLCBzdHlsZXNoZWV0X2RhdGEpOwotICAgIGNhY2hlLT5pbnNlcnQoIHVybCwgc3R5bGVzaGVl
dCApOwotfQotCi1DYWNoZWRTY3JpcHQgKkNhY2hlOjpyZXF1ZXN0U2NyaXB0KCBEb2NMb2FkZXIq
IGRsLCBjb25zdCBET006OkRPTVN0cmluZyAmdXJsLCBib29sIHJlbG9hZCwgdGltZV90IF9leHBp
cmVEYXRlLCBjb25zdCBRU3RyaW5nJiBjaGFyc2V0KQotewotICAgIC8vIHRoaXMgYnJpbmdzIHRo
ZSBfdXJsIHRvIGEgc3RhbmRhcmQgZm9ybS4uLgotICAgIEtVUkwga3VybDsKLSAgICBLSU86OkNh
Y2hlQ29udHJvbCBjYWNoZVBvbGljeTsKLSAgICBpZiAoIGRsICkKLSAgICB7Ci0gICAgICAgIGt1
cmwgPSBkbC0+bV9kb2MtPmNvbXBsZXRlVVJMKCB1cmwucXN0cmluZygpICk7Ci0gICAgICAgIGNh
Y2hlUG9saWN5ID0gZGwtPmNhY2hlUG9saWN5KCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0g
ICAgICAgIGt1cmwgPSB1cmwucXN0cmluZygpOwotICAgICAgICBjYWNoZVBvbGljeSA9IEtJTzo6
Q0NfVmVyaWZ5OwotICAgIH0KLQotICAgIC8vIENoZWNraW5nIGlmIHRoZSBVUkwgaXMgbWFsZm9y
bWVkIGlzIGxvdHMgb2YgZXh0cmEgd29yayBmb3IgbGl0dGxlIGJlbmVmaXQuCi0KLSAgICBDYWNo
ZWRPYmplY3QgKm8gPSBjYWNoZS0+ZmluZChrdXJsLnVybCgpKTsKLSAgICBpZighbykKLSAgICB7
Ci0jaWZkZWYgQ0FDSEVfREVCVUcKLSAgICAgICAga2REZWJ1ZyggNjA2MCApIDw8ICJDYWNoZTog
bmV3OiAiIDw8IGt1cmwudXJsKCkgPDwgZW5kbDsKLSNlbmRpZgotICAgICAgICBDYWNoZWRTY3Jp
cHQgKnNjcmlwdCA9IG5ldyBDYWNoZWRTY3JpcHQoZGwsIGt1cmwudXJsKCksIGNhY2hlUG9saWN5
LCBfZXhwaXJlRGF0ZSwgY2hhcnNldCk7Ci0gICAgICAgIGlmIChjYWNoZURpc2FibGVkKQotICAg
ICAgICAgICAgc2NyaXB0LT5zZXRGcmVlKHRydWUpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAg
Y2FjaGUtPmluc2VydCgga3VybC51cmwoKSwgc2NyaXB0ICk7Ci0gICAgICAgIG1vdmVUb0hlYWRP
ZkxSVUxpc3Qoc2NyaXB0KTsKLSAgICAgICAgfQotICAgICAgICBvID0gc2NyaXB0OwotICAgIH0K
LQotICAgIAotICAgIGlmKCEoby0+dHlwZSgpID09IENhY2hlZE9iamVjdDo6U2NyaXB0KSkKLSAg
ICB7Ci0jaWZkZWYgQ0FDSEVfREVCVUcKLSAgICAgICAga2REZWJ1ZyggNjA2MCApIDw8ICJDYWNo
ZTo6SW50ZXJuYWwgRXJyb3IgaW4gcmVxdWVzdFNjcmlwdCB1cmw9IiA8PCBrdXJsLnVybCgpIDw8
ICIhIiA8PCBlbmRsOwotI2VuZGlmCi0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICAKLSAg
ICAKLSNpZmRlZiBDQUNIRV9ERUJVRwotICAgIGlmKCBvLT5zdGF0dXMoKSA9PSBDYWNoZWRPYmpl
Y3Q6OlBlbmRpbmcgKQotICAgICAgICBrZERlYnVnKCA2MDYwICkgPDwgIkNhY2hlOiBsb2FkaW5n
IGluIHByb2dyZXNzOiAiIDw8IGt1cmwudXJsKCkgPDwgZW5kbDsKLSAgICBlbHNlCi0gICAgICAg
IGtkRGVidWcoIDYwNjAgKSA8PCAiQ2FjaGU6IHVzaW5nIGNhY2hlZDogIiA8PCBrdXJsLnVybCgp
IDw8IGVuZGw7Ci0jZW5kaWYKLQotICAgIG1vdmVUb0hlYWRPZkxSVUxpc3Qobyk7Ci0gICAgaWYg
KCBkbCApIHsKLSAgICAgICAgZGwtPm1fZG9jT2JqZWN0cy5yZW1vdmUoIG8gKTsKLSAgICAgICAg
aWYgKCFjYWNoZURpc2FibGVkKQotICAgICAgICBkbC0+bV9kb2NPYmplY3RzLmFwcGVuZCggbyAp
OwotICAgIH0KLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q2FjaGVkU2NyaXB0ICo+KG8pOwotfQot
Ci12b2lkIENhY2hlOjpwcmVsb2FkU2NyaXB0KCBjb25zdCBRU3RyaW5nICZ1cmwsIGNvbnN0IFFT
dHJpbmcgJnNjcmlwdF9kYXRhKQotewotICAgIENhY2hlZE9iamVjdCAqbyA9IGNhY2hlLT5maW5k
KHVybCk7Ci0gICAgaWYobykKLSAgICAgICAgcmVtb3ZlQ2FjaGVFbnRyeShvKTsKLQotICAgIENh
Y2hlZFNjcmlwdCAqc2NyaXB0ID0gbmV3IENhY2hlZFNjcmlwdCh1cmwsIHNjcmlwdF9kYXRhKTsK
LSAgICBjYWNoZS0+aW5zZXJ0KCB1cmwsIHNjcmlwdCApOwotfQotCi0jaWZkZWYgS0hUTUxfWFNM
VAotQ2FjaGVkWFNMU3R5bGVTaGVldCogQ2FjaGU6OnJlcXVlc3RYU0xTdHlsZVNoZWV0KERvY0xv
YWRlciogZGwsIGNvbnN0IERPTVN0cmluZyAmIHVybCwgYm9vbCByZWxvYWQsIAotICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVfdCBfZXhwaXJlRGF0
ZSkKLXsKLSAgICAvLyB0aGlzIGJyaW5ncyB0aGUgX3VybCB0byBhIHN0YW5kYXJkIGZvcm0uLi4K
LSAgICBLVVJMIGt1cmw7Ci0gICAgS0lPOjpDYWNoZUNvbnRyb2wgY2FjaGVQb2xpY3k7Ci0gICAg
aWYgKGRsKSB7Ci0gICAgICAgIGt1cmwgPSBkbC0+bV9kb2MtPmNvbXBsZXRlVVJMKHVybC5xc3Ry
aW5nKCkpOwotICAgICAgICBjYWNoZVBvbGljeSA9IGRsLT5jYWNoZVBvbGljeSgpOwotICAgIH0K
LSAgICBlbHNlIHsKLSAgICAgICAga3VybCA9IHVybC5xc3RyaW5nKCk7Ci0gICAgICAgIGNhY2hl
UG9saWN5ID0gS0lPOjpDQ19WZXJpZnk7Ci0gICAgfQotICAgIAotICAgIC8vIENoZWNraW5nIGlm
IHRoZSBVUkwgaXMgbWFsZm9ybWVkIGlzIGxvdHMgb2YgZXh0cmEgd29yayBmb3IgbGl0dGxlIGJl
bmVmaXQuCi0gICAgCi0gICAgQ2FjaGVkT2JqZWN0ICpvID0gY2FjaGUtPmZpbmQoa3VybC51cmwo
KSk7Ci0gICAgaWYgKCFvKSB7Ci0jaWZkZWYgQ0FDSEVfREVCVUcKLSAgICAgICAga2REZWJ1Zygg
NjA2MCApIDw8ICJDYWNoZTogbmV3OiAiIDw8IGt1cmwudXJsKCkgPDwgZW5kbDsKLSNlbmRpZgot
ICAgICAgICBDYWNoZWRYU0xTdHlsZVNoZWV0KiBkb2MgPSBuZXcgQ2FjaGVkWFNMU3R5bGVTaGVl
dChkbCwga3VybC51cmwoKSwgY2FjaGVQb2xpY3ksIF9leHBpcmVEYXRlKTsKLSAgICAgICAgaWYg
KGNhY2hlRGlzYWJsZWQpCi0gICAgICAgICAgICBkb2MtPnNldEZyZWUodHJ1ZSk7Ci0gICAgICAg
IGVsc2UgewotICAgICAgICAgICAgY2FjaGUtPmluc2VydChrdXJsLnVybCgpLCBkb2MpOwotICAg
ICAgICAgICAgbW92ZVRvSGVhZE9mTFJVTGlzdChkb2MpOwotICAgICAgICB9Ci0gICAgICAgIG8g
PSBkb2M7Ci0gICAgfQotICAgIAotICAgIAotICAgIGlmIChvLT50eXBlKCkgIT0gQ2FjaGVkT2Jq
ZWN0OjpYU0xTdHlsZVNoZWV0KSB7Ci0jaWZkZWYgQ0FDSEVfREVCVUcKLSAgICAgICAga2REZWJ1
ZyggNjA2MCApIDw8ICJDYWNoZTo6SW50ZXJuYWwgRXJyb3IgaW4gcmVxdWVzdFhTTFN0eWxlU2hl
ZXQgdXJsPSIgPDwga3VybC51cmwoKSA8PCAiISIgPDwgZW5kbDsKLSNlbmRpZgotICAgICAgICBy
ZXR1cm4gMDsKLSAgICB9Ci0gICAgCi0jaWZkZWYgQ0FDSEVfREVCVUcKLSAgICBpZiAoby0+c3Rh
dHVzKCkgPT0gQ2FjaGVkT2JqZWN0OjpQZW5kaW5nKQotICAgICAgICBrZERlYnVnKCA2MDYwICkg
PDwgIkNhY2hlOiBsb2FkaW5nIGluIHByb2dyZXNzOiAiIDw8IGt1cmwudXJsKCkgPDwgZW5kbDsK
LSAgICBlbHNlCi0gICAgICAgIGtkRGVidWcoIDYwNjAgKSA8PCAiQ2FjaGU6IHVzaW5nIGNhY2hl
ZDogIiA8PCBrdXJsLnVybCgpIDw8IGVuZGw7Ci0jZW5kaWYKLSAgICAKLSAgICBtb3ZlVG9IZWFk
T2ZMUlVMaXN0KG8pOwotICAgIGlmIChkbCkgewotICAgICAgICBkbC0+bV9kb2NPYmplY3RzLnJl
bW92ZSggbyApOwotICAgICAgICBpZiAoIWNhY2hlRGlzYWJsZWQpCi0gICAgICAgICAgICBkbC0+
bV9kb2NPYmplY3RzLmFwcGVuZCggbyApOwotICAgIH0KLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8
Q2FjaGVkWFNMU3R5bGVTaGVldCo+KG8pOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgS0hUTUxfTk9f
WEJMCi1DYWNoZWRYQkxEb2N1bWVudCogQ2FjaGU6OnJlcXVlc3RYQkxEb2N1bWVudChEb2NMb2Fk
ZXIqIGRsLCBjb25zdCBET01TdHJpbmcgJiB1cmwsIGJvb2wgcmVsb2FkLCAKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVfdCBfZXhwaXJlRGF0ZSkKLXsK
LSAgICAvLyB0aGlzIGJyaW5ncyB0aGUgX3VybCB0byBhIHN0YW5kYXJkIGZvcm0uLi4KLSAgICBL
VVJMIGt1cmw7Ci0gICAgS0lPOjpDYWNoZUNvbnRyb2wgY2FjaGVQb2xpY3k7Ci0gICAgaWYgKGRs
KSB7Ci0gICAgICAgIGt1cmwgPSBkbC0+bV9kb2MtPmNvbXBsZXRlVVJMKHVybC5xc3RyaW5nKCkp
OwotICAgICAgICBjYWNoZVBvbGljeSA9IGRsLT5jYWNoZVBvbGljeSgpOwotICAgIH0KLSAgICBl
bHNlIHsKLSAgICAgICAga3VybCA9IHVybC5xc3RyaW5nKCk7Ci0gICAgICAgIGNhY2hlUG9saWN5
ID0gS0lPOjpDQ19WZXJpZnk7Ci0gICAgfQotICAgIAotICAgIC8vIENoZWNraW5nIGlmIHRoZSBV
UkwgaXMgbWFsZm9ybWVkIGlzIGxvdHMgb2YgZXh0cmEgd29yayBmb3IgbGl0dGxlIGJlbmVmaXQu
Ci0gICAgCi0gICAgQ2FjaGVkT2JqZWN0ICpvID0gY2FjaGUtPmZpbmQoa3VybC51cmwoKSk7Ci0g
ICAgaWYoIW8pCi0gICAgewotI2lmZGVmIENBQ0hFX0RFQlVHCi0gICAgICAgIGtkRGVidWcoIDYw
NjAgKSA8PCAiQ2FjaGU6IG5ldzogIiA8PCBrdXJsLnVybCgpIDw8IGVuZGw7Ci0jZW5kaWYKLSAg
ICAgICAgQ2FjaGVkWEJMRG9jdW1lbnQqIGRvYyA9IG5ldyBDYWNoZWRYQkxEb2N1bWVudChkbCwg
a3VybC51cmwoKSwgY2FjaGVQb2xpY3ksIF9leHBpcmVEYXRlKTsKLSAgICAgICAgaWYgKGNhY2hl
RGlzYWJsZWQpCi0gICAgICAgICAgICBkb2MtPnNldEZyZWUodHJ1ZSk7Ci0gICAgICAgIGVsc2Ug
ewotICAgICAgICAgICAgY2FjaGUtPmluc2VydChrdXJsLnVybCgpLCBkb2MpOwotICAgICAgICAg
ICAgbW92ZVRvSGVhZE9mTFJVTGlzdChkb2MpOwotICAgICAgICB9Ci0gICAgICAgIG8gPSBkb2M7
Ci0gICAgfQotICAgIAotICAgIAotICAgIGlmKG8tPnR5cGUoKSAhPSBDYWNoZWRPYmplY3Q6OlhC
TCkKLSAgICB7Ci0jaWZkZWYgQ0FDSEVfREVCVUcKLSAgICAgICAga2REZWJ1ZyggNjA2MCApIDw8
ICJDYWNoZTo6SW50ZXJuYWwgRXJyb3IgaW4gcmVxdWVzdFhCTERvY3VtZW50IHVybD0iIDw8IGt1
cmwudXJsKCkgPDwgIiEiIDw8IGVuZGw7Ci0jZW5kaWYKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAg
fQotICAgIAotI2lmZGVmIENBQ0hFX0RFQlVHCi0gICAgaWYoIG8tPnN0YXR1cygpID09IENhY2hl
ZE9iamVjdDo6UGVuZGluZyApCi0gICAgICAgIGtkRGVidWcoIDYwNjAgKSA8PCAiQ2FjaGU6IGxv
YWRpbmcgaW4gcHJvZ3Jlc3M6ICIgPDwga3VybC51cmwoKSA8PCBlbmRsOwotICAgIGVsc2UKLSAg
ICAgICAga2REZWJ1ZyggNjA2MCApIDw8ICJDYWNoZTogdXNpbmcgY2FjaGVkOiAiIDw8IGt1cmwu
dXJsKCkgPDwgZW5kbDsKLSNlbmRpZgotICAgIAotICAgIG1vdmVUb0hlYWRPZkxSVUxpc3Qobyk7
Ci0gICAgaWYgKCBkbCApIHsKLSAgICAgICAgZGwtPm1fZG9jT2JqZWN0cy5yZW1vdmUoIG8gKTsK
LSAgICAgICAgaWYgKCFjYWNoZURpc2FibGVkKQotICAgICAgICAgICAgZGwtPm1fZG9jT2JqZWN0
cy5hcHBlbmQoIG8gKTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PENhY2hlZFhCTERv
Y3VtZW50Kj4obyk7Ci19Ci0jZW5kaWYKLQotdm9pZCBDYWNoZTo6Zmx1c2goYm9vbCBmb3JjZSkK
LXsKLSAgICBpZiAoZm9yY2UpCi0gICAgICAgZmx1c2hDb3VudCA9IDA7Ci0gICAgLy8gRG9uJ3Qg
Zmx1c2ggZm9yIGV2ZXJ5IGltYWdlLgotICAgIGlmIChtX2NvdW50T2ZMUlVBbmRVbmNhY2hlYWJs
ZUxpc3RzIDwgZmx1c2hDb3VudCkKLSAgICAgICByZXR1cm47Ci0KLSAgICBpbml0KCk7Ci0KLSAg
ICB3aGlsZSAobV9oZWFkT2ZVbmNhY2hlYWJsZUxpc3QpCi0gICAgICAgIHJlbW92ZUNhY2hlRW50
cnkobV9oZWFkT2ZVbmNhY2hlYWJsZUxpc3QpOwotCi0gICAgZm9yIChpbnQgaSA9IE1BWF9MUlVf
TElTVFMtMTsgaT49MDsgaS0tKSB7Ci0gICAgICAgIGlmIChtX3RvdGFsU2l6ZU9mTFJVTGlzdHMg
PD0gbWF4U2l6ZSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgCi0gICAgICAgIHdo
aWxlIChtX3RvdGFsU2l6ZU9mTFJVTGlzdHMgPiBtYXhTaXplICYmIG1fTFJVTGlzdHNbaV0ubV90
YWlsKQotICAgICAgICAgICAgcmVtb3ZlQ2FjaGVFbnRyeShtX0xSVUxpc3RzW2ldLm1fdGFpbCk7
Ci0gICAgfQotCi0gICAgZmx1c2hDb3VudCA9IG1fY291bnRPZkxSVUFuZFVuY2FjaGVhYmxlTGlz
dHMrMTA7IC8vIEZsdXNoIGFnYWluIHdoZW4gdGhlIGNhY2hlIGhhcyBncm93bi4KLX0KLQotCi12
b2lkIENhY2hlOjpzZXRTaXplKCBpbnQgYnl0ZXMgKQotewotICAgIG1heFNpemUgPSBieXRlczsK
LSAgICBtYXhDYWNoZWFibGUgPSBrTWF4KG1heFNpemUgLyAxMjgsIE1BWENBQ0hFQUJMRSk7Ci0K
LSAgICAvLyBtYXkgYmUgd2UgbmVlZCB0byBjbGVhciBwYXJ0cyBvZiB0aGUgY2FjaGUKLSAgICBm
bHVzaENvdW50ID0gMDsKLSAgICBmbHVzaCh0cnVlKTsKLX0KLQotdm9pZCBDYWNoZTo6cmVtb3Zl
Q2FjaGVFbnRyeSggQ2FjaGVkT2JqZWN0ICpvYmplY3QgKQotewotICBRU3RyaW5nIGtleSA9IG9i
amVjdC0+dXJsKCkucXN0cmluZygpOwotCi0gIC8vIHRoaXMgaW5kaWNhdGVzIHRoZSBkZXJlZigp
IG1ldGhvZCBvZiBDYWNoZWRPYmplY3QgdG8gZGVsZXRlIGl0c2VsZiB3aGVuIHRoZSByZWZlcmVu
Y2UgY291bnRlcgotICAvLyBkcm9wcyBkb3duIHRvIHplcm8KLSAgb2JqZWN0LT5zZXRGcmVlKCB0
cnVlICk7Ci0KLSAgY2FjaGUtPnJlbW92ZSgga2V5ICk7Ci0gIHJlbW92ZUZyb21MUlVMaXN0KG9i
amVjdCk7Ci0KLSAgY29uc3QgRG9jTG9hZGVyKiBkbDsKLSAgZm9yICggZGw9ZG9jbG9hZGVyLT5m
aXJzdCgpOyBkbDsgZGw9ZG9jbG9hZGVyLT5uZXh0KCkgKQotICAgICAgZGwtPnJlbW92ZUNhY2hl
ZE9iamVjdCggb2JqZWN0ICk7Ci0KLSAgaWYgKCBvYmplY3QtPmNhbkRlbGV0ZSgpICkKLSAgICAg
ZGVsZXRlIG9iamVjdDsKLX0KLQotI2RlZmluZSBGQVNUX0xPRzIoX2xvZzIsX24pICAgXAotICAg
ICAgdW5zaWduZWQgaW50IGpfID0gKHVuc2lnbmVkIGludCkoX24pOyAgIFwKLSAgICAgIChfbG9n
MikgPSAwOyAgICAgICAgICAgICAgICAgICAgXAotICAgICAgaWYgKChqXykgJiAoKGpfKS0xKSkg
ICAgICAgICAgICBcCi0gICAgICAoX2xvZzIpICs9IDE7ICAgICAgICAgICAgICAgXAotICAgICAg
aWYgKChqXykgPj4gMTYpICAgICAgICAgICAgICAgICBcCi0gICAgICAoX2xvZzIpICs9IDE2LCAo
al8pID4+PSAxNjsgXAotICAgICAgaWYgKChqXykgPj4gOCkgICAgICAgICAgICAgICAgICBcCi0g
ICAgICAoX2xvZzIpICs9IDgsIChqXykgPj49IDg7ICAgXAotICAgICAgaWYgKChqXykgPj4gNCkg
ICAgICAgICAgICAgICAgICBcCi0gICAgICAoX2xvZzIpICs9IDQsIChqXykgPj49IDQ7ICAgXAot
ICAgICAgaWYgKChqXykgPj4gMikgICAgICAgICAgICAgICAgICBcCi0gICAgICAoX2xvZzIpICs9
IDIsIChqXykgPj49IDI7ICAgXAotICAgICAgaWYgKChqXykgPj4gMSkgICAgICAgICAgICAgICAg
ICBcCi0gICAgICAoX2xvZzIpICs9IDE7Ci0KLWludCBGYXN0TG9nMih1bnNpZ25lZCBpbnQgaSkg
ewotICAgIGludCBsb2cyOwotICAgIEZBU1RfTE9HMihsb2cyLGkpOwotICAgIHJldHVybiBsb2cy
OwotfQotCi1MUlVMaXN0KiBDYWNoZTo6Z2V0TFJVTGlzdEZvcihDYWNoZWRPYmplY3QqIG8pCi17
Ci0gICAgaW50IGFjY2Vzc0NvdW50ID0gby0+YWNjZXNzQ291bnQoKTsKLSAgICBpbnQgcXVldWVJ
bmRleDsKLSAgICBpZiAoYWNjZXNzQ291bnQgPT0gMCkgewotICAgICAgICBxdWV1ZUluZGV4ID0g
MDsKLSAgICB9IGVsc2UgewotICAgICAgICBpbnQgc2l6ZUxvZyA9IEZhc3RMb2cyKG8tPnNpemUo
KSk7Ci0gICAgICAgIHF1ZXVlSW5kZXggPSBzaXplTG9nL28tPmFjY2Vzc0NvdW50KCkgLSAxOwot
ICAgICAgICBpZiAocXVldWVJbmRleCA8IDApCi0gICAgICAgICAgICBxdWV1ZUluZGV4ID0gMDsK
LSAgICAgICAgaWYgKHF1ZXVlSW5kZXggPj0gTUFYX0xSVV9MSVNUUykKLSAgICAgICAgICAgIHF1
ZXVlSW5kZXggPSBNQVhfTFJVX0xJU1RTLTE7Ci0gICAgfQotICAgIGlmIChtX0xSVUxpc3RzID09
IDApIHsKLSAgICAgICAgbV9MUlVMaXN0cyA9IG5ldyBMUlVMaXN0IFtNQVhfTFJVX0xJU1RTXTsK
LSAgICB9Ci0gICAgcmV0dXJuICZtX0xSVUxpc3RzW3F1ZXVlSW5kZXhdOwotfQotCi12b2lkIENh
Y2hlOjpyZW1vdmVGcm9tTFJVTGlzdChDYWNoZWRPYmplY3QgKm9iamVjdCkKLXsKLSAgICBDYWNo
ZWRPYmplY3QgKm5leHQgPSBvYmplY3QtPm1fbmV4dEluTFJVTGlzdDsKLSAgICBDYWNoZWRPYmpl
Y3QgKnByZXYgPSBvYmplY3QtPm1fcHJldkluTFJVTGlzdDsKLSAgICBib29sIHVuY2FjaGVhYmxl
ID0gb2JqZWN0LT5zdGF0dXMoKSA9PSBDYWNoZWRPYmplY3Q6OlVuY2FjaGVhYmxlOwotICAgIAot
ICAgIExSVUxpc3QqIGxpc3QgPSB1bmNhY2hlYWJsZSA/IDAgOiBnZXRMUlVMaXN0Rm9yKG9iamVj
dCk7Ci0gICAgQ2FjaGVkT2JqZWN0IComaGVhZCA9IHVuY2FjaGVhYmxlID8gbV9oZWFkT2ZVbmNh
Y2hlYWJsZUxpc3QgOiBsaXN0LT5tX2hlYWQ7Ci0gICAgCi0gICAgaWYgKG5leHQgPT0gMCAmJiBw
cmV2ID09IDAgJiYgaGVhZCAhPSBvYmplY3QpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAg
ICAKLSAgICBvYmplY3QtPm1fbmV4dEluTFJVTGlzdCA9IDA7Ci0gICAgb2JqZWN0LT5tX3ByZXZJ
bkxSVUxpc3QgPSAwOwotICAgIAotICAgIGlmIChuZXh0KQotICAgICAgICBuZXh0LT5tX3ByZXZJ
bkxSVUxpc3QgPSBwcmV2OwotICAgIGVsc2UgaWYgKCF1bmNhY2hlYWJsZSAmJiBsaXN0LT5tX3Rh
aWwgPT0gb2JqZWN0KQotICAgICAgICBsaXN0LT5tX3RhaWwgPSBwcmV2OwotCi0gICAgaWYgKHBy
ZXYpCi0gICAgICAgIHByZXYtPm1fbmV4dEluTFJVTGlzdCA9IG5leHQ7Ci0gICAgZWxzZSBpZiAo
aGVhZCA9PSBvYmplY3QpCi0gICAgICAgIGhlYWQgPSBuZXh0OwotICAgIAotICAgIC0tbV9jb3Vu
dE9mTFJVQW5kVW5jYWNoZWFibGVMaXN0czsKLSAgICAKLSAgICBpZiAoIXVuY2FjaGVhYmxlKQot
ICAgICAgICBtX3RvdGFsU2l6ZU9mTFJVTGlzdHMgLT0gb2JqZWN0LT5zaXplKCk7Ci19Ci0KLXZv
aWQgQ2FjaGU6Om1vdmVUb0hlYWRPZkxSVUxpc3QoQ2FjaGVkT2JqZWN0ICpvYmplY3QpCi17Ci0g
ICAgaW5zZXJ0SW5MUlVMaXN0KG9iamVjdCk7Ci19Ci0KLXZvaWQgQ2FjaGU6Omluc2VydEluTFJV
TGlzdChDYWNoZWRPYmplY3QgKm9iamVjdCkKLXsKLSAgICByZW1vdmVGcm9tTFJVTGlzdChvYmpl
Y3QpOwotICAgIAotICAgIGlmICghb2JqZWN0LT5hbGxvd0luTFJVTGlzdCgpKQotICAgICAgICBy
ZXR1cm47Ci0gICAgCi0gICAgTFJVTGlzdCogbGlzdCA9IGdldExSVUxpc3RGb3Iob2JqZWN0KTsK
LSAgICAKLSAgICBib29sIHVuY2FjaGVhYmxlID0gb2JqZWN0LT5zdGF0dXMoKSA9PSBDYWNoZWRP
YmplY3Q6OlVuY2FjaGVhYmxlOwotICAgIENhY2hlZE9iamVjdCAqJmhlYWQgPSB1bmNhY2hlYWJs
ZSA/IG1faGVhZE9mVW5jYWNoZWFibGVMaXN0IDogbGlzdC0+bV9oZWFkOwotCi0gICAgb2JqZWN0
LT5tX25leHRJbkxSVUxpc3QgPSBoZWFkOwotICAgIGlmIChoZWFkKQotICAgICAgICBoZWFkLT5t
X3ByZXZJbkxSVUxpc3QgPSBvYmplY3Q7Ci0gICAgaGVhZCA9IG9iamVjdDsKLSAgICAKLSAgICBp
ZiAob2JqZWN0LT5tX25leHRJbkxSVUxpc3QgPT0gMCAmJiAhdW5jYWNoZWFibGUpCi0gICAgICAg
IGxpc3QtPm1fdGFpbCA9IG9iamVjdDsKLSAgICAKLSAgICArK21fY291bnRPZkxSVUFuZFVuY2Fj
aGVhYmxlTGlzdHM7Ci0gICAgCi0gICAgaWYgKCF1bmNhY2hlYWJsZSkKLSAgICAgICAgbV90b3Rh
bFNpemVPZkxSVUxpc3RzICs9IG9iamVjdC0+c2l6ZSgpOwotfQotCi1ib29sIENhY2hlOjphZGp1
c3RTaXplKENhY2hlZE9iamVjdCAqb2JqZWN0LCBpbnQgZGVsdGEpCi17Ci0gICAgaWYgKG9iamVj
dC0+c3RhdHVzKCkgPT0gQ2FjaGVkT2JqZWN0OjpVbmNhY2hlYWJsZSkKLSAgICAgICAgcmV0dXJu
IGZhbHNlOwotCi0gICAgaWYgKG9iamVjdC0+bV9uZXh0SW5MUlVMaXN0ID09IDAgJiYgb2JqZWN0
LT5tX3ByZXZJbkxSVUxpc3QgPT0gMCAmJgotICAgICAgICBnZXRMUlVMaXN0Rm9yKG9iamVjdCkt
Pm1faGVhZCAhPSBvYmplY3QpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICBtX3Rv
dGFsU2l6ZU9mTFJVTGlzdHMgKz0gZGVsdGE7Ci0gICAgcmV0dXJuIGRlbHRhICE9IDA7Ci19Ci0K
LS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUNhY2hlZE9iamVj
dENsaWVudCAqQ2FjaGVkT2JqZWN0Q2xpZW50V2Fsa2VyOjpuZXh0KCkKLXsKLSAgICAvLyBPbmx5
IGFkdmFuY2UgaWYgd2UgYWxyZWFkeSByZXR1cm5lZCB0aGlzIGl0ZW0uCi0gICAgLy8gVGhpcyBo
YW5kbGVzIGNhc2VzIHdoZXJlIHRoZSBjdXJyZW50IGl0ZW0gaXMgcmVtb3ZlZCwgYW5kIHByZXZl
bnRzIHVzIGZyb20gc2tpcHBpbmcgdGhlIG5leHQgaXRlbS4KLSAgICAvLyBUaGUgaXRlcmF0b3Ig
YXV0b21hdGljYWxseSBnZXRzIGFkdmFuY2VkIHRvIHRoZSBuZXh0IGl0ZW0sIGFuZCB3ZSBtYWtl
IHN1cmUgd2UgcmV0dXJuIGl0LgotICAgIGlmIChfY3VycmVudCA9PSBfaXRlcmF0b3IuY3VycmVu
dCgpKQotICAgICAgICArK19pdGVyYXRvcjsKLSAgICBfY3VycmVudCA9IF9pdGVyYXRvci5jdXJy
ZW50KCk7Ci0gICAgcmV0dXJuIF9jdXJyZW50OwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLQotCi1DYWNoZWRPYmplY3RDbGllbnQ6On5DYWNoZWRPYmplY3RD
bGllbnQoKSB7IH0KLXZvaWQgQ2FjaGVkT2JqZWN0Q2xpZW50OjpzZXRQaXhtYXAoY29uc3QgUVBp
eG1hcCAmLCBjb25zdCBRUmVjdCYsIENhY2hlZEltYWdlICopIHt9Ci12b2lkIENhY2hlZE9iamVj
dENsaWVudDo6c2V0U3R5bGVTaGVldChjb25zdCBET006OkRPTVN0cmluZyAmLyp1cmwqLywgY29u
c3QgRE9NOjpET01TdHJpbmcgJi8qc2hlZXQqLykge30KLSNpZm5kZWYgS0hUTUxfTk9fWEJMCi12
b2lkIENhY2hlZE9iamVjdENsaWVudDo6c2V0WEJMRG9jdW1lbnQoY29uc3QgRE9NOjpET01TdHJp
bmcmIHVybCwgWEJMOjpYQkxEb2N1bWVudEltcGwqIGRvYykge30KLSNlbmRpZgotdm9pZCBDYWNo
ZWRPYmplY3RDbGllbnQ6Om5vdGlmeUZpbmlzaGVkKENhY2hlZE9iamVjdCAqIC8qZmluaXNoZWRP
YmoqLykge30KLQotQ2FjaGU6OlN0YXRpc3RpY3MgQ2FjaGU6OmdldFN0YXRpc3RpY3MoKQotewot
ICAgIFN0YXRpc3RpY3Mgc3RhdHM7Ci0KLSAgICBpZiAoIWNhY2hlKQotICAgICAgICByZXR1cm4g
c3RhdHM7Ci0KLSAgICBRRGljdEl0ZXJhdG9yPENhY2hlZE9iamVjdD4gaSgqY2FjaGUpOwotICAg
IGZvciAoaS50b0ZpcnN0KCk7IGkuY3VycmVudCgpOyArK2kpIHsKLSAgICAgICAgQ2FjaGVkT2Jq
ZWN0ICpvID0gaS5jdXJyZW50KCk7Ci0gICAgICAgIHN3aXRjaCAoby0+dHlwZSgpKSB7Ci0gICAg
ICAgICAgICBjYXNlIENhY2hlZE9iamVjdDo6SW1hZ2U6Ci0gICAgICAgICAgICAgICAgc3RhdHMu
aW1hZ2VzLmNvdW50Kys7Ci0gICAgICAgICAgICAgICAgc3RhdHMuaW1hZ2VzLnNpemUgKz0gby0+
c2l6ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIENhY2hl
ZE9iamVjdDo6Q1NTU3R5bGVTaGVldDoKLSAgICAgICAgICAgICAgICBzdGF0cy5zdHlsZVNoZWV0
cy5jb3VudCsrOwotICAgICAgICAgICAgICAgIHN0YXRzLnN0eWxlU2hlZXRzLnNpemUgKz0gby0+
c2l6ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIENhY2hl
ZE9iamVjdDo6U2NyaXB0OgotICAgICAgICAgICAgICAgIHN0YXRzLnNjcmlwdHMuY291bnQrKzsK
LSAgICAgICAgICAgICAgICBzdGF0cy5zY3JpcHRzLnNpemUgKz0gby0+c2l6ZSgpOwotICAgICAg
ICAgICAgICAgIGJyZWFrOwotI2lmZGVmIEtIVE1MX1hTTFQKLSAgICAgICAgICAgIGNhc2UgQ2Fj
aGVkT2JqZWN0OjpYU0xTdHlsZVNoZWV0OgotICAgICAgICAgICAgICAgIHN0YXRzLnhzbFN0eWxl
U2hlZXRzLmNvdW50Kys7Ci0gICAgICAgICAgICAgICAgc3RhdHMueHNsU3R5bGVTaGVldHMuc2l6
ZSArPSBvLT5zaXplKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZm5kZWYg
S0hUTUxfTk9fWEJMCi0gICAgICAgICAgICBjYXNlIENhY2hlZE9iamVjdDo6WEJMOgotICAgICAg
ICAgICAgICAgIHN0YXRzLnhibERvY3MuY291bnQrKzsKLSAgICAgICAgICAgICAgICBzdGF0cy54
YmxEb2NzLnNpemUgKz0gby0+c2l6ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotI2VuZGlm
Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHN0YXRzLm90aGVyLmNvdW50
Kys7Ci0gICAgICAgICAgICAgICAgc3RhdHMub3RoZXIuc2l6ZSArPSBvLT5zaXplKCk7Ci0gICAg
ICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHN0YXRzOwotfQotCi12b2lkIENhY2hlOjpm
bHVzaEFsbCgpCi17Ci0gICAgaWYgKCFjYWNoZSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgZm9y
ICg7OykgewotICAgICAgICBRRGljdEl0ZXJhdG9yPENhY2hlZE9iamVjdD4gaSgqY2FjaGUpOwot
ICAgICAgICBDYWNoZWRPYmplY3QgKm8gPSBpLnRvRmlyc3QoKTsKLSAgICAgICAgaWYgKCFvKQot
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIHJlbW92ZUNhY2hlRW50cnkobyk7Ci0gICAgfQot
fQotCi12b2lkIENhY2hlOjpzZXRDYWNoZURpc2FibGVkKGJvb2wgZGlzYWJsZWQpCi17Ci0gICAg
Y2FjaGVEaXNhYmxlZCA9IGRpc2FibGVkOwotICAgIGlmIChkaXNhYmxlZCkKLSAgICAgICAgZmx1
c2hBbGwoKTsKLX0KK307ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpJbmRleDogbWlzYy9S
ZXF1ZXN0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBtaXNjL1JlcXVlc3QuY3BwCShyZXZpc2lvbiAxMTk0
OCkKKysrIG1pc2MvUmVxdWVzdC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI1LDc0OSArMjUsMTEg
QEAKICAgICBwYWdlcyBmcm9tIHRoZSB3ZWIuIEl0IGhhcyBhIG1lbW9yeSBjYWNoZSBmb3IgdGhl
c2Ugb2JqZWN0cy4KICovCiAKLSN1bmRlZiBDQUNIRV9ERUJVRwotLy8jZGVmaW5lIENBQ0hFX0RF
QlVHCiAjaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSAi
UmVxdWVzdC5oIgorI2luY2x1ZGUgIkNhY2hlZE9iamVjdC5oIgogCi0jaW5jbHVkZSAibG9hZGVy
LmgiCi0KLS8vIHVwIHRvIHdoaWNoIHNpemUgaXMgYSBwaWN0dXJlIGZvciBzdXJlIGNhY2hlYWJs
ZQotI2RlZmluZSBNQVhDQUNIRUFCTEUgNDAqMTAyNAotLy8gZGVmYXVsdCBjYWNoZSBzaXplCi0j
ZGVmaW5lIERFRkNBQ0hFU0laRSA0MDk2KjEwMjQKLQotI2luY2x1ZGUgPHFhc3luY2lvLmg+Ci0j
aW5jbHVkZSA8cXBhaW50ZXIuaD4KLQotI2luY2x1ZGUgPGtpby9qb2IuaD4KLSNpbmNsdWRlIDxr
aW8vam9iY2xhc3Nlcy5oPgotI2luY2x1ZGUgPGtpbWFnZWlvLmg+Ci0jaW5jbHVkZSA8a2NoYXJz
ZXRzLmg+Ci0jaW5jbHVkZSA8a2RlYnVnLmg+Ci0jaW5jbHVkZSAia2h0bWxfZmFjdG9yeS5oIgot
I2luY2x1ZGUgImtodG1sX3BhcnQuaCIKLSNpbmNsdWRlICJkZWNvZGVyLmgiCi0KLSNpbmNsdWRl
ICJodG1sL2h0bWxfZG9jdW1lbnRpbXBsLmgiCi0jaW5jbHVkZSAiY3NzL2Nzc19zdHlsZXNoZWV0
aW1wbC5oIgotCi0jaWZuZGVmIEtIVE1MX05PX1hCTAotI2luY2x1ZGUgInhibC94YmxfZG9jaW1w
bC5oIgotI2VuZGlmCi0KLSNpbmNsdWRlIDxreG1sY29yZS9Bc3NlcnRpb25zLmg+Ci0jaW5jbHVk
ZSAiS1dRTG9hZGVyLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBraHRtbDsKLXVzaW5nIG5hbWVzcGFj
ZSBET007Ci0KLXN0YXRpYyBib29sIGNhY2hlRGlzYWJsZWQ7Ci0KLS8vIENhbGwgdGhpcyAid2Fs
a2VyIiBpbnN0ZWFkIG9mIGl0ZXJhdG9yIHNvIHBlb3BsZSB3b24ndCBleHBlY3QgUXQgb3IgU1RM
LXN0eWxlIGl0ZXJhdG9yIGludGVyZmFjZS4KLS8vIEp1c3Qga2VlcCBjYWxsaW5nIG5leHQoKSBv
biB0aGlzLiBJdCdzIHNhZmUgZnJvbSBkZWxldGlvbnMgb2YgdGhlIGN1cnJlbnQgaXRlbQotY2xh
c3MgQ2FjaGVkT2JqZWN0Q2xpZW50V2Fsa2VyIHsKLXB1YmxpYzoKLSAgICBDYWNoZWRPYmplY3RD
bGllbnRXYWxrZXIoY29uc3QgUVB0ckRpY3Q8Q2FjaGVkT2JqZWN0Q2xpZW50PiAmY2xpZW50cykg
OiBfY3VycmVudCgwKSwgX2l0ZXJhdG9yKGNsaWVudHMpIHsgfQotICAgIENhY2hlZE9iamVjdENs
aWVudCAqbmV4dCgpOwotcHJpdmF0ZToKLSAgICBDYWNoZWRPYmplY3RDbGllbnQgKl9jdXJyZW50
OwotICAgIFFQdHJEaWN0SXRlcmF0b3I8Q2FjaGVkT2JqZWN0Q2xpZW50PiBfaXRlcmF0b3I7Ci19
OwotCi1DYWNoZWRPYmplY3Q6On5DYWNoZWRPYmplY3QoKQotewotICAgIGlmKG1fZGVsZXRlZCkg
YWJvcnQoKTsKLSAgICBDYWNoZTo6cmVtb3ZlRnJvbUxSVUxpc3QodGhpcyk7Ci0gICAgbV9kZWxl
dGVkID0gdHJ1ZTsKLSAgICBzZXRSZXNwb25zZSgwKTsKLSAgICBzZXRBbGxEYXRhKDApOwotfQot
Ci12b2lkIENhY2hlZE9iamVjdDo6ZmluaXNoKCkKLXsKLSAgICBpZiAobV9zaXplID4gQ2FjaGU6
Om1heENhY2hlYWJsZU9iamVjdFNpemUoKSkKLSAgICAgICAgbV9zdGF0dXMgPSBVbmNhY2hlYWJs
ZTsKLSAgICBlbHNlCi0gICAgICAgIG1fc3RhdHVzID0gQ2FjaGVkOwotICAgIEtVUkwgdXJsKG1f
dXJsLnFzdHJpbmcoKSk7Ci0gICAgaWYgKG1fZXhwaXJlRGF0ZUNoYW5nZWQgJiYgdXJsLnByb3Rv
Y29sKCkuc3RhcnRzV2l0aCgiaHR0cCIpKQotICAgICAgICBtX2V4cGlyZURhdGVDaGFuZ2VkID0g
ZmFsc2U7Ci19Ci0KLXZvaWQgQ2FjaGVkT2JqZWN0OjpzZXRFeHBpcmVEYXRlKHRpbWVfdCBfZXhw
aXJlRGF0ZSwgYm9vbCBjaGFuZ2VIdHRwQ2FjaGUpCi17Ci0gICAgaWYgKCBfZXhwaXJlRGF0ZSA9
PSBtX2V4cGlyZURhdGUpCi0gICAgICAgIHJldHVybjsKLQotICAgIGlmIChtX3N0YXR1cyA9PSBV
bmNhY2hlYWJsZSB8fCBtX3N0YXR1cyA9PSBDYWNoZWQpCi0gICAgewotICAgICAgICBmaW5pc2go
KTsKLSAgICB9Ci0gICAgbV9leHBpcmVEYXRlID0gX2V4cGlyZURhdGU7Ci0gICAgaWYgKGNoYW5n
ZUh0dHBDYWNoZSAmJiBtX2V4cGlyZURhdGUpCi0gICAgICAgbV9leHBpcmVEYXRlQ2hhbmdlZCA9
IHRydWU7Ci19Ci0KLWJvb2wgQ2FjaGVkT2JqZWN0Ojppc0V4cGlyZWQoKSBjb25zdAotewotICAg
IGlmICghbV9leHBpcmVEYXRlKSByZXR1cm4gZmFsc2U7Ci0gICAgdGltZV90IG5vdyA9IHRpbWUo
MCk7Ci0gICAgcmV0dXJuIChkaWZmdGltZShub3csIG1fZXhwaXJlRGF0ZSkgPj0gMCk7Ci19Ci0K
LXZvaWQgQ2FjaGVkT2JqZWN0OjpzZXRSZXF1ZXN0KFJlcXVlc3QgKl9yZXF1ZXN0KQotewotICAg
IGlmICggX3JlcXVlc3QgJiYgIW1fcmVxdWVzdCApCi0gICAgICAgIG1fc3RhdHVzID0gUGVuZGlu
ZzsKLSAgICBtX3JlcXVlc3QgPSBfcmVxdWVzdDsKLSAgICBpZiAoY2FuRGVsZXRlKCkgJiYgbV9m
cmVlKQotICAgICAgICBkZWxldGUgdGhpczsKLSAgICBlbHNlIGlmIChhbGxvd0luTFJVTGlzdCgp
KQotICAgICAgICBDYWNoZTo6aW5zZXJ0SW5MUlVMaXN0KHRoaXMpOwotfQotCi12b2lkIENhY2hl
ZE9iamVjdDo6cmVmKENhY2hlZE9iamVjdENsaWVudCAqYykKLXsKLSAgICBtX2NsaWVudHMuaW5z
ZXJ0KGMsIGMpOwotICAgIENhY2hlOjpyZW1vdmVGcm9tTFJVTGlzdCh0aGlzKTsKLSAgICBpbmNy
ZWFzZUFjY2Vzc0NvdW50KCk7Ci19Ci0KLXZvaWQgQ2FjaGVkT2JqZWN0OjpkZXJlZihDYWNoZWRP
YmplY3RDbGllbnQgKmMpCi17Ci0gICAgbV9jbGllbnRzLnJlbW92ZShjKTsKLSAgICBpZiAoYWxs
b3dJbkxSVUxpc3QoKSkKLSAgICAgICAgQ2FjaGU6Omluc2VydEluTFJVTGlzdCh0aGlzKTsKLX0K
LQotdm9pZCBDYWNoZWRPYmplY3Q6OnNldFNpemUoaW50IHNpemUpCi17Ci0gICAgYm9vbCBzaXpl
Q2hhbmdlZCA9IENhY2hlOjphZGp1c3RTaXplKHRoaXMsIHNpemUgLSBtX3NpemUpOwotCi0gICAg
Ly8gVGhlIG9iamVjdCBtdXN0IG5vdyBiZSBtb3ZlZCB0byBhIGRpZmZlcmVudCBxdWV1ZSwgc2lu
Y2UgaXRzIHNpemUgaGFzIGJlZW4gY2hhbmdlZC4KLSAgICBpZiAoc2l6ZUNoYW5nZWQgJiYgYWxs
b3dJbkxSVUxpc3QoKSkKLSAgICAgICAgQ2FjaGU6OnJlbW92ZUZyb21MUlVMaXN0KHRoaXMpOwot
Ci0gICAgbV9zaXplID0gc2l6ZTsKLSAgICAKLSAgICBpZiAoc2l6ZUNoYW5nZWQgJiYgYWxsb3dJ
bkxSVUxpc3QoKSkKLSAgICAgICAgQ2FjaGU6Omluc2VydEluTFJVTGlzdCh0aGlzKTsKLX0KLQot
Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1DYWNoZWRDU1NTdHlsZVNo
ZWV0OjpDYWNoZWRDU1NTdHlsZVNoZWV0KERvY0xvYWRlciogZGwsIGNvbnN0IERPTVN0cmluZyAm
dXJsLCBLSU86OkNhY2hlQ29udHJvbCBfY2FjaGVQb2xpY3ksIHRpbWVfdCBfZXhwaXJlRGF0ZSwg
Y29uc3QgUVN0cmluZyYgY2hhcnNldCkKLSAgICA6IENhY2hlZE9iamVjdCh1cmwsIENTU1N0eWxl
U2hlZXQsIF9jYWNoZVBvbGljeSwgX2V4cGlyZURhdGUpLCBtX2NvZGVjKDApCi17Ci0gICAgLy8g
SXQncyBjc3Mgd2Ugd2FudC4KLSAgICBzZXRBY2NlcHQoInRleHQvY3NzIik7Ci0gICAgLy8gbG9h
ZCB0aGUgZmlsZQotICAgIENhY2hlOjpsb2FkZXIoKS0+bG9hZChkbCwgdGhpcywgZmFsc2UpOwot
ICAgIG1fbG9hZGluZyA9IHRydWU7Ci0gICAgaWYgKCFjaGFyc2V0LmlzRW1wdHkoKSkKLQltX2Nv
ZGVjID0gUVRleHRDb2RlYzo6Y29kZWNGb3JOYW1lKGNoYXJzZXQubGF0aW4xKCkpOwotICAgIGlm
ICghbV9jb2RlYykKLSAgICAgICAgbV9jb2RlYyA9IFFUZXh0Q29kZWM6OmNvZGVjRm9yTmFtZSgi
aXNvODg1OS0xIik7Ci19Ci0KLUNhY2hlZENTU1N0eWxlU2hlZXQ6OkNhY2hlZENTU1N0eWxlU2hl
ZXQoY29uc3QgRE9NU3RyaW5nICZ1cmwsIGNvbnN0IFFTdHJpbmcgJnN0eWxlc2hlZXRfZGF0YSkK
LSAgICA6IENhY2hlZE9iamVjdCh1cmwsIENTU1N0eWxlU2hlZXQsIEtJTzo6Q0NfVmVyaWZ5LCAw
LCBzdHlsZXNoZWV0X2RhdGEubGVuZ3RoKCkpCi17Ci0gICAgbV9sb2FkaW5nID0gZmFsc2U7Ci0g
ICAgbV9zdGF0dXMgPSBQZXJzaXN0ZW50OwotICAgIG1fY29kZWMgPSAwOwotICAgIG1fc2hlZXQg
PSBET01TdHJpbmcoc3R5bGVzaGVldF9kYXRhKTsKLX0KLQotCi1DYWNoZWRDU1NTdHlsZVNoZWV0
Ojp+Q2FjaGVkQ1NTU3R5bGVTaGVldCgpCi17Ci19Ci0KLXZvaWQgQ2FjaGVkQ1NTU3R5bGVTaGVl
dDo6cmVmKENhY2hlZE9iamVjdENsaWVudCAqYykKLXsKLSAgICBDYWNoZWRPYmplY3Q6OnJlZihj
KTsKLQotICAgIGlmKCFtX2xvYWRpbmcpIGMtPnNldFN0eWxlU2hlZXQoIG1fdXJsLCBtX3NoZWV0
ICk7Ci19Ci0KLXZvaWQgQ2FjaGVkQ1NTU3R5bGVTaGVldDo6ZGVyZWYoQ2FjaGVkT2JqZWN0Q2xp
ZW50ICpjKQotewotICAgIENhY2hlOjpmbHVzaCgpOwotICAgIENhY2hlZE9iamVjdDo6ZGVyZWYo
Yyk7Ci0gICAgaWYgKCBjYW5EZWxldGUoKSAmJiBtX2ZyZWUgKQotICAgICAgZGVsZXRlIHRoaXM7
Ci19Ci0KLXZvaWQgQ2FjaGVkQ1NTU3R5bGVTaGVldDo6c2V0Q2hhcnNldCggY29uc3QgUVN0cmlu
ZyAmY2hzICkKLXsKLSAgICBpZiAoIWNocy5pc0VtcHR5KCkpIHsKLSAgICAgICAgUVRleHRDb2Rl
YyAqY29kZWMgPSBRVGV4dENvZGVjOjpjb2RlY0Zvck5hbWUoY2hzLmxhdGluMSgpKTsKLSAgICAg
ICAgaWYgKGNvZGVjKQotICAgICAgICAgICAgbV9jb2RlYyA9IGNvZGVjOwotICAgIH0KLX0KLQot
dm9pZCBDYWNoZWRDU1NTdHlsZVNoZWV0OjpkYXRhKCBRQnVmZmVyICZidWZmZXIsIGJvb2wgZW9m
ICkKLXsKLSAgICBpZighZW9mKSByZXR1cm47Ci0gICAgYnVmZmVyLmNsb3NlKCk7Ci0gICAgc2V0
U2l6ZShidWZmZXIuYnVmZmVyKCkuc2l6ZSgpKTsKLSAgICBRU3RyaW5nIGRhdGEgPSBtX2NvZGVj
LT50b1VuaWNvZGUoIGJ1ZmZlci5idWZmZXIoKS5kYXRhKCksIHNpemUoKSApOwotICAgIG1fc2hl
ZXQgPSBET01TdHJpbmcoZGF0YSk7Ci0gICAgbV9sb2FkaW5nID0gZmFsc2U7Ci0KLSAgICBjaGVj
a05vdGlmeSgpOwotfQotCi12b2lkIENhY2hlZENTU1N0eWxlU2hlZXQ6OmNoZWNrTm90aWZ5KCkK
LXsKLSAgICBpZiAobV9sb2FkaW5nKQotICAgICAgICByZXR1cm47Ci0KLSAgICBDYWNoZWRPYmpl
Y3RDbGllbnRXYWxrZXIgdyhtX2NsaWVudHMpOwotICAgIHdoaWxlIChDYWNoZWRPYmplY3RDbGll
bnQgKmMgPSB3Lm5leHQoKSkgewotICAgICAgICBpZiAobV9yZXNwb25zZSAmJiAhS1dRSXNSZXNw
b25zZVVSTEVxdWFsVG9VUkwobV9yZXNwb25zZSwgbV91cmwpKQotICAgICAgICAgICAgYy0+c2V0
U3R5bGVTaGVldChET01TdHJpbmcoS1dRUmVzcG9uc2VVUkwobV9yZXNwb25zZSkpLCBtX3NoZWV0
KTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgYy0+c2V0U3R5bGVTaGVldChtX3VybCwgbV9z
aGVldCk7Ci0gICAgfQotfQotCi0KLXZvaWQgQ2FjaGVkQ1NTU3R5bGVTaGVldDo6ZXJyb3IoIGlu
dCAvKmVyciovLCBjb25zdCBjaGFyICovKnRleHQqLyApCi17Ci0gICAgbV9sb2FkaW5nID0gZmFs
c2U7Ci0gICAgY2hlY2tOb3RpZnkoKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLQotCi1DYWNoZWRTY3JpcHQ6OkNhY2hlZFNjcmlwdChEb2NMb2FkZXIqIGRsLCBj
b25zdCBET01TdHJpbmcgJnVybCwgS0lPOjpDYWNoZUNvbnRyb2wgX2NhY2hlUG9saWN5LCB0aW1l
X3QgX2V4cGlyZURhdGUsIGNvbnN0IFFTdHJpbmcmIGNoYXJzZXQpCi0gICAgOiBDYWNoZWRPYmpl
Y3QodXJsLCBTY3JpcHQsIF9jYWNoZVBvbGljeSwgX2V4cGlyZURhdGUpLCBtX2NvZGVjKDApCi17
Ci0gICAgLy8gSXQncyBqYXZhc2NyaXB0IHdlIHdhbnQuCi0gICAgLy8gQnV0IHNvbWUgd2Vic2l0
ZXMgdGhpbmsgdGhlaXIgc2NyaXB0cyBhcmUgPHNvbWUgd3JvbmcgbWltZXR5cGUgaGVyZT4KLSAg
ICAvLyBhbmQgcmVmdXNlIHRvIHNlcnZlIHRoZW0gaWYgd2Ugb25seSBhY2NlcHQgYXBwbGljYXRp
b24veC1qYXZhc2NyaXB0LgotICAgIHNldEFjY2VwdCgiKi8qIik7Ci0gICAgbV9lcnJvck9jY3Vy
cmVkID0gZmFsc2U7Ci0gICAgLy8gbG9hZCB0aGUgZmlsZQotICAgIENhY2hlOjpsb2FkZXIoKS0+
bG9hZChkbCwgdGhpcywgZmFsc2UpOwotICAgIG1fbG9hZGluZyA9IHRydWU7Ci0gICAgaWYgKCFj
aGFyc2V0LmlzRW1wdHkoKSkKLSAgICAgICAgbV9jb2RlYyA9IFFUZXh0Q29kZWM6OmNvZGVjRm9y
TmFtZShjaGFyc2V0LmxhdGluMSgpKTsKLSAgICBpZiAoIW1fY29kZWMpCi0JbV9jb2RlYyA9IFFU
ZXh0Q29kZWM6OmNvZGVjRm9yTmFtZSgiaXNvODg1OS0xIik7Ci19Ci0KLUNhY2hlZFNjcmlwdDo6
Q2FjaGVkU2NyaXB0KGNvbnN0IERPTVN0cmluZyAmdXJsLCBjb25zdCBRU3RyaW5nICZzY3JpcHRf
ZGF0YSkKLSAgICA6IENhY2hlZE9iamVjdCh1cmwsIFNjcmlwdCwgS0lPOjpDQ19WZXJpZnksIDAs
IHNjcmlwdF9kYXRhLmxlbmd0aCgpKQotewotICAgIG1fZXJyb3JPY2N1cnJlZCA9IGZhbHNlOwot
ICAgIG1fbG9hZGluZyA9IGZhbHNlOwotICAgIG1fc3RhdHVzID0gUGVyc2lzdGVudDsKLSAgICBt
X2NvZGVjID0gMDsKLSAgICBtX3NjcmlwdCA9IERPTVN0cmluZyhzY3JpcHRfZGF0YSk7Ci19Ci0K
LUNhY2hlZFNjcmlwdDo6fkNhY2hlZFNjcmlwdCgpCi17Ci19Ci0KLXZvaWQgQ2FjaGVkU2NyaXB0
OjpyZWYoQ2FjaGVkT2JqZWN0Q2xpZW50ICpjKQotewotICAgIENhY2hlZE9iamVjdDo6cmVmKGMp
OwotCi0gICAgaWYoIW1fbG9hZGluZykgYy0+bm90aWZ5RmluaXNoZWQodGhpcyk7Ci19Ci0KLXZv
aWQgQ2FjaGVkU2NyaXB0OjpkZXJlZihDYWNoZWRPYmplY3RDbGllbnQgKmMpCi17Ci0gICAgQ2Fj
aGU6OmZsdXNoKCk7Ci0gICAgQ2FjaGVkT2JqZWN0OjpkZXJlZihjKTsKLSAgICBpZiAoIGNhbkRl
bGV0ZSgpICYmIG1fZnJlZSApCi0gICAgICBkZWxldGUgdGhpczsKLX0KLQotdm9pZCBDYWNoZWRT
Y3JpcHQ6OnNldENoYXJzZXQoIGNvbnN0IFFTdHJpbmcgJmNocyApCi17Ci0gICAgaWYgKCFjaHMu
aXNFbXB0eSgpKSB7Ci0gICAgICAgIFFUZXh0Q29kZWMgKmNvZGVjID0gUVRleHRDb2RlYzo6Y29k
ZWNGb3JOYW1lKGNocy5sYXRpbjEoKSk7Ci0gICAgICAgIGlmIChjb2RlYykKLSAgICAgICAgICAg
IG1fY29kZWMgPSBjb2RlYzsKLSAgICB9Ci19Ci0KLXZvaWQgQ2FjaGVkU2NyaXB0OjpkYXRhKCBR
QnVmZmVyICZidWZmZXIsIGJvb2wgZW9mICkKLXsKLSAgICBpZighZW9mKSByZXR1cm47Ci0gICAg
YnVmZmVyLmNsb3NlKCk7Ci0gICAgc2V0U2l6ZShidWZmZXIuYnVmZmVyKCkuc2l6ZSgpKTsKLSAg
ICBRU3RyaW5nIGRhdGEgPSBtX2NvZGVjLT50b1VuaWNvZGUoIGJ1ZmZlci5idWZmZXIoKS5kYXRh
KCksIHNpemUoKSApOwotICAgIG1fc2NyaXB0ID0gRE9NU3RyaW5nKGRhdGEpOwotICAgIG1fbG9h
ZGluZyA9IGZhbHNlOwotICAgIGNoZWNrTm90aWZ5KCk7Ci19Ci0KLXZvaWQgQ2FjaGVkU2NyaXB0
OjpjaGVja05vdGlmeSgpCi17Ci0gICAgaWYobV9sb2FkaW5nKSByZXR1cm47Ci0KLSAgICBDYWNo
ZWRPYmplY3RDbGllbnRXYWxrZXIgdyhtX2NsaWVudHMpOwotICAgIHdoaWxlIChDYWNoZWRPYmpl
Y3RDbGllbnQgKmMgPSB3Lm5leHQoKSkKLSAgICAgICAgYy0+bm90aWZ5RmluaXNoZWQodGhpcyk7
Ci19Ci0KLQotdm9pZCBDYWNoZWRTY3JpcHQ6OmVycm9yKCBpbnQgLyplcnIqLywgY29uc3QgY2hh
ciAqLyp0ZXh0Ki8gKQotewotICAgIG1fbG9hZGluZyA9IGZhbHNlOwotICAgIG1fZXJyb3JPY2N1
cnJlZCA9IHRydWU7Ci0gICAgY2hlY2tOb3RpZnkoKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tCi0KLQotc3RhdGljIGJvb2wgY3Jvc3NEb21haW4oY29uc3QgUVN0
cmluZyAmYSwgY29uc3QgUVN0cmluZyAmYikKLXsKLSAgICBpZiAoYSA9PSBiKSByZXR1cm4gZmFs
c2U7Ci0KLSAgICBRU3RyaW5nTGlzdCBsMSA9IFFTdHJpbmdMaXN0OjpzcGxpdCgnLicsIGEpOwot
ICAgIFFTdHJpbmdMaXN0IGwyID0gUVN0cmluZ0xpc3Q6OnNwbGl0KCcuJywgYik7Ci0KLSAgICB3
aGlsZShsMS5jb3VudCgpID4gbDIuY291bnQoKSkKLSAgICAgICAgbDEucG9wX2Zyb250KCk7Ci0K
LSAgICB3aGlsZShsMi5jb3VudCgpID4gbDEuY291bnQoKSkKLSAgICAgICAgbDIucG9wX2Zyb250
KCk7Ci0KLSAgICB3aGlsZShsMi5jb3VudCgpID49IDIpCi0gICAgewotICAgICAgICBpZiAobDEg
PT0gbDIpCi0gICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBsMS5wb3BfZnJvbnQo
KTsKLSAgICAgICAgbDIucG9wX2Zyb250KCk7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQot
Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi12b2lkIENhY2hlZEltYWdlQ2FsbGJh
Y2s6Om5vdGlmeVVwZGF0ZSgpIAoteyAKLSAgICBpZiAoY2FjaGVkSW1hZ2UpIHsKLSAgICAgICAg
Y2FjaGVkSW1hZ2UtPmRvX25vdGlmeSAoY2FjaGVkSW1hZ2UtPnBpeG1hcCgpLCBjYWNoZWRJbWFn
ZS0+cGl4bWFwKCkucmVjdCgpKTsgCi0gICAgICAgIFFTaXplIHMgPSBjYWNoZWRJbWFnZS0+cGl4
bWFwX3NpemUoKTsKLSAgICAgICAgY2FjaGVkSW1hZ2UtPnNldFNpemUocy53aWR0aCgpICogcy5o
ZWlnaHQoKSAqIDIpOwotCi0gICAgICAgIC8vIEFmdGVyIHJlY2VpdmluZyB0aGUgaW1hZ2UgaGVh
ZGVyIHdlIGFyZSBndWFyYW50ZWVkIHRvIGtub3cKLSAgICAgICAgLy8gdGhlIGltYWdlIHNpemUu
ICBBbHRob3VnaCBhbGwgb2YgdGhlIGRhdGEgbWF5IG5vdCBoYXZlIGFycml2ZWQgb3IKLSAgICAg
ICAgLy8gYmVlbiBkZWNvZGVkIHdlIGNhbiBjb25zaWRlciB0aGUgaW1hZ2UgbG9hZGVkIGZvciBw
dXJwb3NlZCBvZgotICAgICAgICAvLyBsYXlvdXQgYW5kIGRpc3BhdGNoaW5nIHRoZSBpbWFnZSdz
IG9ubG9hZCBoYW5kbGVyLiAgUmVtb3ZpbmcgdGhlIHJlcXVlc3QgZnJvbQotICAgICAgICAvLyB0
aGUgbGlzdCBvZiBiYWNrZ3JvdW5kIGRlY29kaW5nIHJlcXVlc3RzIHdpbGwgZW5zdXJlIHRoYXQg
TG9hZGVyOjpudW1SZXF1ZXN0cygpIAotICAgICAgICAvLyBkb2VzIG5vdCBjb3VudCB0aGlzIGJh
Y2tncm91bmQgcmVxdWVzdC4gIEZ1cnRoZXIgbnVtUmVxdWVzdHMoKSBjYW4KLSAgICAgICAgLy8g
YmUgY29ycmVjdGx5IHVzZWQgYnkgdGhlIHBhcnQgdG8gZGV0ZXJtaW5lIGlmIGxvYWRpbmcgaXMg
c3VmZmljaWVudGx5Ci0gICAgICAgIC8vIGNvbXBsZXRlIHRvIGRpc3BhdGNoIHRoZSBwYWdlJ3Mg
b25sb2FkIGhhbmRsZXIuCi0gICAgICAgIFJlcXVlc3QgKnIgPSBjYWNoZWRJbWFnZS0+bV9yZXF1
ZXN0OwotICAgICAgICBEb2NMb2FkZXIgKmRsID0gci0+bV9kb2NMb2FkZXI7Ci0KLSAgICAgICAg
a2h0bWw6OkNhY2hlOjpsb2FkZXIoKS0+cmVtb3ZlQmFja2dyb3VuZERlY29kaW5nUmVxdWVzdChy
KTsKLQotICAgICAgICAvLyBQb2tlIHRoZSBwYXJ0IHRvIGdldCBpdCB0byBkbyBhIGNoZWNrQ29t
cGxldGVkKCkuICBPbmx5IGRvIHRoaXMgZm9yCi0gICAgICAgIC8vIHRoZSBmaXJzdCB1cGRhdGUg
dG8gbWluaW1pemUgd29yay4gIE5vdGUgdGhhdCB3ZSBhcmUgZ3VhcmFudGVlZCB0byBoYXZlCi0g
ICAgICAgIC8vIHJlYWQgdGhlIGhlYWRlciB3aGVuIHdlIHJlY2VpdmVkIHRoaXMgZmlyc3QgdXBk
YXRlLCB3aGljaCBpcyB0cmlnZ2VyZWQKLSAgICAgICAgLy8gYnkgdGhlIGZpcnN0IGtDR0ltYWdl
U3RhdHVzSW5jb21wbGV0ZSBzdGF0dXMgZnJvbSBDRy4ga0NHSW1hZ2VTdGF0dXNJbmNvbXBsZXRl
Ci0gICAgICAgIC8vIHJlYWxseSBtZWFucyB0aGF0IHRoZSBDRyBkZWNvZGVyIGlzIHdhaXRpbmcg
Zm9yIG1vcmUgZGF0YSwgYnV0IGhhcyBhbHJlYWR5Ci0gICAgICAgIC8vIHJlYWQgdGhlIGhlYWRl
ci4KLSAgICAgICAgaWYgKCFoZWFkZXJSZWNlaXZlZCkgewotICAgICAgICAgICAgZW1pdCBraHRt
bDo6Q2FjaGU6OmxvYWRlcigpLT5yZXF1ZXN0RG9uZSggZGwsIGNhY2hlZEltYWdlICk7Ci0gICAg
ICAgICAgICBoZWFkZXJSZWNlaXZlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZv
aWQgQ2FjaGVkSW1hZ2VDYWxsYmFjazo6bm90aWZ5RmluaXNoZWQoKQotewotICAgIGlmIChjYWNo
ZWRJbWFnZSkgewotICAgICAgICBjYWNoZWRJbWFnZS0+ZG9fbm90aWZ5IChjYWNoZWRJbWFnZS0+
cGl4bWFwKCksIGNhY2hlZEltYWdlLT5waXhtYXAoKS5yZWN0KCkpOyAKLSAgICAgICAgY2FjaGVk
SW1hZ2UtPm1fbG9hZGluZyA9IGZhbHNlOwotICAgICAgICBjYWNoZWRJbWFnZS0+Y2hlY2tOb3Rp
ZnkoKTsKLSAgICAgICAgUVNpemUgcyA9IGNhY2hlZEltYWdlLT5waXhtYXBfc2l6ZSgpOwotICAg
ICAgICBjYWNoZWRJbWFnZS0+c2V0U2l6ZShzLndpZHRoKCkgKiBzLmhlaWdodCgpICogMik7Ci0J
Ci0gICAgICAgIFJlcXVlc3QgKnIgPSBjYWNoZWRJbWFnZS0+bV9yZXF1ZXN0OwotICAgICAgICBE
b2NMb2FkZXIgKmRsID0gci0+bV9kb2NMb2FkZXI7Ci0KLSAgICAgICAga2h0bWw6OkNhY2hlOjps
b2FkZXIoKS0+cmVtb3ZlQmFja2dyb3VuZERlY29kaW5nUmVxdWVzdChyKTsKLQotICAgICAgICAv
LyBQb2tlIHRoZSBwYXJ0IHRvIGdldCBpdCB0byBkbyBhIGNoZWNrQ29tcGxldGVkKCkuCi0gICAg
ICAgIGVtaXQga2h0bWw6OkNhY2hlOjpsb2FkZXIoKS0+cmVxdWVzdERvbmUoIGRsLCBjYWNoZWRJ
bWFnZSApOwotICAgICAgICAKLSAgICAgICAgZGVsZXRlIHI7Ci0gICAgfQotfQotCi12b2lkIENh
Y2hlZEltYWdlQ2FsbGJhY2s6Om5vdGlmeURlY29kaW5nRXJyb3IoKQotewotICAgIGlmIChjYWNo
ZWRJbWFnZSkgewotICAgICAgICBoYW5kbGVFcnJvcigpOwotICAgIH0KLX0KLQotdm9pZCBDYWNo
ZWRJbWFnZUNhbGxiYWNrOjpoYW5kbGVFcnJvcigpCi17Ci0gICAgaWYgKGNhY2hlZEltYWdlKSB7
Ci0gICAgICAgIGNhY2hlZEltYWdlLT5lcnJvck9jY3VyZWQgPSB0cnVlOwotICAgICAgICBRUGl4
bWFwIGVwID0gY2FjaGVkSW1hZ2UtPnBpeG1hcCgpOwotICAgICAgICBjYWNoZWRJbWFnZS0+ZG9f
bm90aWZ5IChlcCwgZXAucmVjdCgpKTsKLSAgICAgICAgQ2FjaGU6OnJlbW92ZUNhY2hlRW50cnkg
KGNhY2hlZEltYWdlKTsKLQotICAgICAgICBjbGVhcigpOwotICAgIH0KLX0KLQotdm9pZCBDYWNo
ZWRJbWFnZUNhbGxiYWNrOjpjbGVhcigpIAotewotICAgIGlmIChjYWNoZWRJbWFnZSAmJiBjYWNo
ZWRJbWFnZS0+bV9yZXF1ZXN0KSB7Ci0gICAgICAgIFJlcXVlc3QgKnIgPSBjYWNoZWRJbWFnZS0+
bV9yZXF1ZXN0OwotICAgICAgICBEb2NMb2FkZXIgKmRsID0gci0+bV9kb2NMb2FkZXI7Ci0KLSAg
ICAgICAga2h0bWw6OkNhY2hlOjpsb2FkZXIoKS0+cmVtb3ZlQmFja2dyb3VuZERlY29kaW5nUmVx
dWVzdChyKTsKLQotICAgICAgICAvLyBQb2tlIHRoZSBwYXJ0IHRvIGdldCBpdCB0byBkbyBhIGNo
ZWNrQ29tcGxldGVkKCkuCi0gICAgICAgIGVtaXQga2h0bWw6OkNhY2hlOjpsb2FkZXIoKS0+cmVx
dWVzdEZhaWxlZCggZGwsIGNhY2hlZEltYWdlICk7Ci0KLSAgICAgICAgZGVsZXRlIHI7Ci0gICAg
fQotICAgIGNhY2hlZEltYWdlID0gMDsKLX0KLQotQ2FjaGVkSW1hZ2U6OkNhY2hlZEltYWdlKERv
Y0xvYWRlciogZGwsIGNvbnN0IERPTVN0cmluZyAmdXJsLCBLSU86OkNhY2hlQ29udHJvbCBfY2Fj
aGVQb2xpY3ksIHRpbWVfdCBfZXhwaXJlRGF0ZSkKLSAgICA6IFFPYmplY3QoKSwgQ2FjaGVkT2Jq
ZWN0KHVybCwgSW1hZ2UsIF9jYWNoZVBvbGljeSwgX2V4cGlyZURhdGUpCi0gICAgLCBtX2RhdGFT
aXplKDApCi17Ci0gICAgcCA9IDA7Ci0gICAgcGl4UGFydCA9IDA7Ci0gICAgYmcgPSAwOwotICAg
IGlzRnVsbHlUcmFuc3BhcmVudCA9IGZhbHNlOwotICAgIGVycm9yT2NjdXJlZCA9IGZhbHNlOwot
ICAgIG1vbm9jaHJvbWUgPSBmYWxzZTsKLSAgICBmb3JtYXRUeXBlID0gMDsKLSAgICBtX3N0YXR1
cyA9IFVua25vd247Ci0gICAgaW1nU291cmNlID0gMDsKLSAgICBtX2xvYWRpbmcgPSB0cnVlOwot
ICAgIG1fc2hvd0FuaW1hdGlvbnMgPSBkbC0+c2hvd0FuaW1hdGlvbnMoKTsKLSAgICBpZiAoUVBp
eG1hcDo6c2hvdWxkVXNlVGhyZWFkZWREZWNvZGluZygpKQotICAgICAgICBtX2RlY29kZXJDYWxs
YmFjayA9IG5ldyBDYWNoZWRJbWFnZUNhbGxiYWNrKHRoaXMpOwotICAgIGVsc2UKLSAgICAgICAg
bV9kZWNvZGVyQ2FsbGJhY2sgPSAwOwotfQotCi1DYWNoZWRJbWFnZTo6fkNhY2hlZEltYWdlKCkK
LXsKLSAgICBjbGVhcigpOwotfQotCi12b2lkIENhY2hlZEltYWdlOjpyZWYoIENhY2hlZE9iamVj
dENsaWVudCAqYyApCi17Ci0gICAgQ2FjaGVkT2JqZWN0OjpyZWYoYyk7Ci0KLSAgICAvLyBmb3Ig
bW91c2VvdmVycywgZHluYW1pYyBjaGFuZ2VzCi0gICAgaWYgKCF2YWxpZF9yZWN0KCkuaXNOdWxs
KCkpCi0gICAgICAgIGMtPnNldFBpeG1hcCggcGl4bWFwKCksIHZhbGlkX3JlY3QoKSwgdGhpcyk7
Ci0KLSAgICBpZighbV9sb2FkaW5nKQotICAgICAgICBjLT5ub3RpZnlGaW5pc2hlZCh0aGlzKTsK
LX0KLQotdm9pZCBDYWNoZWRJbWFnZTo6ZGVyZWYoIENhY2hlZE9iamVjdENsaWVudCAqYyApCi17
Ci0gICAgQ2FjaGU6OmZsdXNoKCk7Ci0gICAgQ2FjaGVkT2JqZWN0OjpkZXJlZihjKTsKLSAgICBp
ZiAoIGNhbkRlbGV0ZSgpICYmIG1fZnJlZSApCi0gICAgICAgIGRlbGV0ZSB0aGlzOwotfQotCi1j
b25zdCBRUGl4bWFwICZDYWNoZWRJbWFnZTo6dGlsZWRfcGl4bWFwKGNvbnN0IFFDb2xvciYgbmV3
YykKLXsKLSAgICByZXR1cm4gcGl4bWFwKCk7Ci19Ci0KLWNvbnN0IFFQaXhtYXAgJkNhY2hlZElt
YWdlOjpwaXhtYXAoICkgY29uc3QKLXsKLSAgICBpZihlcnJvck9jY3VyZWQpCi0gICAgICAgIHJl
dHVybiAqQ2FjaGU6OmJyb2tlblBpeG1hcDsKLQotICAgIGlmIChwKQotICAgICAgICByZXR1cm4g
KnA7Ci0KLSAgICByZXR1cm4gKkNhY2hlOjpudWxsUGl4bWFwOwotfQotCi1RU2l6ZSBDYWNoZWRJ
bWFnZTo6cGl4bWFwX3NpemUoKSBjb25zdAotewotICAgIHJldHVybiAocCA/IHAtPnNpemUoKSA6
IFFTaXplKCkpOwotfQotCi1RUmVjdCBDYWNoZWRJbWFnZTo6dmFsaWRfcmVjdCgpIGNvbnN0Ci17
Ci0gICAgcmV0dXJuIChwID8gcC0+cmVjdCgpIDogUVJlY3QoKSk7Ci19Ci0KLXZvaWQgQ2FjaGVk
SW1hZ2U6OmRvX25vdGlmeShjb25zdCBRUGl4bWFwJiBwLCBjb25zdCBRUmVjdCYgcikKLXsKLSAg
ICBDYWNoZWRPYmplY3RDbGllbnRXYWxrZXIgdyhtX2NsaWVudHMpOwotICAgIHdoaWxlIChDYWNo
ZWRPYmplY3RDbGllbnQgKmMgPSB3Lm5leHQoKSkKLSAgICAgICAgYy0+c2V0UGl4bWFwKHAsIHIs
IHRoaXMpOwotfQotCi12b2lkIENhY2hlZEltYWdlOjpzZXRTaG93QW5pbWF0aW9ucyggS0hUTUxT
ZXR0aW5nczo6S0FuaW1hdGlvbkFkdmljZSBzaG93QW5pbWF0aW9ucyApCi17Ci0gICAgbV9zaG93
QW5pbWF0aW9ucyA9IHNob3dBbmltYXRpb25zOwotfQotCi12b2lkIENhY2hlZEltYWdlOjpjbGVh
cigpCi17Ci0gICAgZGVsZXRlIHA7ICAgcCA9IDA7Ci0gICAgZGVsZXRlIGJnOyAgYmcgPSAwOwot
ICAgIGRlbGV0ZSBwaXhQYXJ0OyBwaXhQYXJ0ID0gMDsKLQotICAgIGZvcm1hdFR5cGUgPSAwOwot
Ci0gICAgc2V0U2l6ZSgwKTsKLQotICAgIC8vIE5vIG5lZWQgdG8gZGVsZXRlIGltYWdlU291cmNl
IC0gUU1vdmllIGRvZXMgaXQgZm9yIHVzCi0gICAgaW1nU291cmNlID0gMDsKLQotICAgIGlmICht
X2RlY29kZXJDYWxsYmFjaykgewotICAgICAgICBtX2RlY29kZXJDYWxsYmFjay0+Y2xlYXIoKTsK
LSAgICAgICAgbV9kZWNvZGVyQ2FsbGJhY2stPmRlcmVmKCk7Ci0gICAgICAgIG1fZGVjb2RlckNh
bGxiYWNrID0gMDsKLSAgICB9Ci19Ci0KLXZvaWQgQ2FjaGVkSW1hZ2U6OmRhdGEgKCBRQnVmZmVy
ICZfYnVmZmVyLCBib29sIGVvZiApCi17Ci0jaWZkZWYgQ0FDSEVfREVCVUcKLSAgICBrZERlYnVn
KCA2MDYwICkgPDwgdGhpcyA8PCAiaW4gQ2FjaGVkSW1hZ2U6OmRhdGEoYnVmZmVyc2l6ZSAiIDw8
IF9idWZmZXIuYnVmZmVyKCkuc2l6ZSgpIDw8IiwgZW9mPSIgPDwgZW9mIDw8IGVuZGw7Ci0jZW5k
aWYKLQotICAgIGJvb2wgY2FuRHJhdyA9IGZhbHNlOwotICAgIAotICAgIG1fZGF0YVNpemUgPSBf
YnVmZmVyLnNpemUoKTsKLSAgICAgICAgCi0gICAgLy8gSWYgd2UncmUgYXQgZW9mIGFuZCBkb24n
dCBoYXZlIGEgcGl4bWFwIHlldCwgdGhlIGRhdGEKLSAgICAvLyBtdXN0IGhhdmUgYXJyaXZlZCBp
biBvbmUgY2h1bmsuICBUaGlzIGF2b2lkcyB0aGUgYXR0ZW1wdAotICAgIC8vIHRvIHBlcmZvcm0g
aW5jcmVtZW50YWwgZGVjb2RpbmcuCi0gICAgaWYgKGVvZiAmJiAhcCkgewotICAgICAgICBwID0g
bmV3IFFQaXhtYXAoX2J1ZmZlci5idWZmZXIoKSwgS1dRUmVzcG9uc2VNSU1FVHlwZShtX3Jlc3Bv
bnNlKSk7Ci0gICAgICAgIGlmIChtX2RlY29kZXJDYWxsYmFjaykKLSAgICAgICAgICAgIG1fZGVj
b2RlckNhbGxiYWNrLT5ub3RpZnlGaW5pc2hlZCgpOwotICAgICAgICBjYW5EcmF3ID0gdHJ1ZTsK
LSAgICB9IGVsc2UgewotICAgICAgICAvLyBBbHdheXMgYXR0ZW1wdCB0byBsb2FkIHRoZSBpbWFn
ZSBpbmNyZW1lbnRhbGx5LgotICAgICAgICBpZiAoIXApCi0gICAgICAgICAgICBwID0gbmV3IFFQ
aXhtYXAoS1dRUmVzcG9uc2VNSU1FVHlwZShtX3Jlc3BvbnNlKSk7Ci0gICAgICAgIGNhbkRyYXcg
PSBwLT5yZWNlaXZlZERhdGEoX2J1ZmZlci5idWZmZXIoKSwgZW9mLCBtX2RlY29kZXJDYWxsYmFj
ayk7Ci0gICAgfQotICAgIAotICAgIC8vIElmIHdlIGhhdmUgYSBkZWNvZGVyLCB3ZSdsbCBiZSBu
b3RpZmllZCB3aGVuIGRlY29kaW5nIGhhcyBjb21wbGV0ZWQuCi0gICAgaWYgKCFtX2RlY29kZXJD
YWxsYmFjaykgewotICAgICAgICBpZiAoY2FuRHJhdyB8fCBlb2YpIHsKLSAgICAgICAgICAgIGlm
IChwLT5pc051bGwoKSkgewotICAgICAgICAgICAgICAgIGVycm9yT2NjdXJlZCA9IHRydWU7Ci0g
ICAgICAgICAgICAgICAgUVBpeG1hcCBlcCA9IHBpeG1hcCgpOwotICAgICAgICAgICAgICAgIGRv
X25vdGlmeSAoZXAsIGVwLnJlY3QoKSk7Ci0gICAgICAgICAgICAgICAgQ2FjaGU6OnJlbW92ZUNh
Y2hlRW50cnkgKHRoaXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAg
ICAgICAgICAgIGRvX25vdGlmeSgqcCwgcC0+cmVjdCgpKTsKLQotICAgICAgICAgICAgUVNpemUg
cyA9IHBpeG1hcF9zaXplKCk7Ci0gICAgICAgICAgICBzZXRTaXplKHMud2lkdGgoKSAqIHMuaGVp
Z2h0KCkgKiAyKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZW9mKSB7Ci0gICAgICAgICAgICBt
X2xvYWRpbmcgPSBmYWxzZTsKLSAgICAgICAgICAgIGNoZWNrTm90aWZ5KCk7Ci0gICAgICAgIH0K
LSAgICB9Ci19Ci0KLXZvaWQgQ2FjaGVkSW1hZ2U6OmVycm9yKCBpbnQgLyplcnIqLywgY29uc3Qg
Y2hhciAqLyp0ZXh0Ki8gKQotewotI2lmZGVmIENBQ0hFX0RFQlVHCi0gICAga2REZWJ1Zyg2MDYw
KSA8PCAiQ2FoY2VkSW1hZ2U6OmVycm9yIiA8PCBlbmRsOwotI2VuZGlmCi0KLSAgICBjbGVhcigp
OwotICAgIGVycm9yT2NjdXJlZCA9IHRydWU7Ci0gICAgZG9fbm90aWZ5KHBpeG1hcCgpLCBRUmVj
dCgwLCAwLCAxNiwgMTYpKTsKLSAgICBtX2xvYWRpbmcgPSBmYWxzZTsKLSAgICBjaGVja05vdGlm
eSgpOwotfQotCi12b2lkIENhY2hlZEltYWdlOjpjaGVja05vdGlmeSgpCi17Ci0gICAgaWYobV9s
b2FkaW5nKSByZXR1cm47Ci0KLSAgICBDYWNoZWRPYmplY3RDbGllbnRXYWxrZXIgdyhtX2NsaWVu
dHMpOwotICAgIHdoaWxlIChDYWNoZWRPYmplY3RDbGllbnQgKmMgPSB3Lm5leHQoKSkgewotICAg
ICAgICBjLT5ub3RpZnlGaW5pc2hlZCh0aGlzKTsKLSAgICB9Ci19Ci0KLS8vIC0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2lmZGVmIEtIVE1MX1hTTFQKLQotQ2FjaGVkWFNM
U3R5bGVTaGVldDo6Q2FjaGVkWFNMU3R5bGVTaGVldChEb2NMb2FkZXIqIGRsLCBjb25zdCBET01T
dHJpbmcgJnVybCwgS0lPOjpDYWNoZUNvbnRyb2wgX2NhY2hlUG9saWN5LCB0aW1lX3QgX2V4cGly
ZURhdGUpCi06IENhY2hlZE9iamVjdCh1cmwsIFhTTFN0eWxlU2hlZXQsIF9jYWNoZVBvbGljeSwg
X2V4cGlyZURhdGUpCi17Ci0gICAgLy8gSXQncyBYTUwgd2Ugd2FudC4KLSAgICAvLyBGSVhNRTog
VGhpcyBzaG91bGQgYWNjZXB0IG1vcmUgZ2VuZXJhbCB4bWwgZm9ybWF0cyAqLyoreG1sLCBpbWFn
ZS9zdmcreG1sIGZvciBleGFtcGxlLgotICAgIHNldEFjY2VwdCgidGV4dC94bWwsIGFwcGxpY2F0
aW9uL3htbCwgYXBwbGljYXRpb24veGh0bWwreG1sLCB0ZXh0L3hzbCwgYXBwbGljYXRpb24vcnNz
K3htbCwgYXBwbGljYXRpb24vYXRvbSt4bWwiKTsKLSAgICAKLSAgICAvLyBsb2FkIHRoZSBmaWxl
Ci0gICAgQ2FjaGU6OmxvYWRlcigpLT5sb2FkKGRsLCB0aGlzLCBmYWxzZSk7Ci0gICAgbV9sb2Fk
aW5nID0gdHJ1ZTsKLSAgICBtX2RlY29kZXIgPSBuZXcgRGVjb2RlcjsKLX0KLQotdm9pZCBDYWNo
ZWRYU0xTdHlsZVNoZWV0OjpyZWYoQ2FjaGVkT2JqZWN0Q2xpZW50ICpjKQotewotICAgIENhY2hl
ZE9iamVjdDo6cmVmKGMpOwotICAgIAotICAgIGlmICghbV9sb2FkaW5nKQotICAgICAgICBjLT5z
ZXRTdHlsZVNoZWV0KG1fdXJsLCBtX3NoZWV0KTsKLX0KLQotdm9pZCBDYWNoZWRYU0xTdHlsZVNo
ZWV0OjpkZXJlZihDYWNoZWRPYmplY3RDbGllbnQgKmMpCi17Ci0gICAgQ2FjaGU6OmZsdXNoKCk7
Ci0gICAgQ2FjaGVkT2JqZWN0OjpkZXJlZihjKTsKLSAgICBpZiAoY2FuRGVsZXRlKCkgJiYgbV9m
cmVlKQotICAgICAgICBkZWxldGUgdGhpczsKLX0KLQotdm9pZCBDYWNoZWRYU0xTdHlsZVNoZWV0
OjpzZXRDaGFyc2V0KCBjb25zdCBRU3RyaW5nICZjaHMgKQotewotICAgIGlmICghY2hzLmlzRW1w
dHkoKSkKLSAgICAgICAgbV9kZWNvZGVyLT5zZXRFbmNvZGluZyhjaHMubGF0aW4xKCksIERlY29k
ZXI6OkVuY29kaW5nRnJvbUhUVFBIZWFkZXIpOwotfQotCi12b2lkIENhY2hlZFhTTFN0eWxlU2hl
ZXQ6OmRhdGEoUUJ1ZmZlciAmYnVmZmVyLCBib29sIGVvZikKLXsKLSAgICBpZighZW9mKSByZXR1
cm47Ci0gICAgYnVmZmVyLmNsb3NlKCk7Ci0gICAgc2V0U2l6ZShidWZmZXIuYnVmZmVyKCkuc2l6
ZSgpKTsKLSAgICBRU3RyaW5nIGRhdGEgPSBtX2RlY29kZXItPmRlY29kZShidWZmZXIuYnVmZmVy
KCkuZGF0YSgpLCBzaXplKCkpOwotICAgIG1fc2hlZXQgPSBET01TdHJpbmcoZGF0YSk7Ci0gICAg
bV9sb2FkaW5nID0gZmFsc2U7Ci0gICAgCi0gICAgY2hlY2tOb3RpZnkoKTsKLX0KLQotdm9pZCBD
YWNoZWRYU0xTdHlsZVNoZWV0OjpjaGVja05vdGlmeSgpCi17Ci0gICAgaWYgKG1fbG9hZGluZykK
LSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIENhY2hlZE9iamVjdENsaWVudFdhbGtlciB3KG1f
Y2xpZW50cyk7Ci0gICAgd2hpbGUgKENhY2hlZE9iamVjdENsaWVudCAqYyA9IHcubmV4dCgpKQot
ICAgICAgICBjLT5zZXRTdHlsZVNoZWV0KG1fdXJsLCBtX3NoZWV0KTsKLX0KLQotCi12b2lkIENh
Y2hlZFhTTFN0eWxlU2hlZXQ6OmVycm9yKCBpbnQgLyplcnIqLywgY29uc3QgY2hhciAqLyp0ZXh0
Ki8gKQotewotICAgIG1fbG9hZGluZyA9IGZhbHNlOwotICAgIGNoZWNrTm90aWZ5KCk7Ci19Ci0K
LSNlbmRpZgotCi0jaWZuZGVmIEtIVE1MX05PX1hCTAotQ2FjaGVkWEJMRG9jdW1lbnQ6OkNhY2hl
ZFhCTERvY3VtZW50KERvY0xvYWRlciogZGwsIGNvbnN0IERPTVN0cmluZyAmdXJsLCBLSU86OkNh
Y2hlQ29udHJvbCBfY2FjaGVQb2xpY3ksIHRpbWVfdCBfZXhwaXJlRGF0ZSkKLTogQ2FjaGVkT2Jq
ZWN0KHVybCwgWEJMLCBfY2FjaGVQb2xpY3ksIF9leHBpcmVEYXRlKSwgbV9kb2N1bWVudCgwKQot
ewotICAgIC8vIEl0J3MgWE1MIHdlIHdhbnQuCi0gICAgc2V0QWNjZXB0KCJ0ZXh0L3htbCwgYXBw
bGljYXRpb24veG1sLCBhcHBsaWNhdGlvbi94aHRtbCt4bWwsIHRleHQveHNsLCBhcHBsaWNhdGlv
bi9yc3MreG1sLCBhcHBsaWNhdGlvbi9hdG9tK3htbCIpOwotICAgIAotICAgIC8vIExvYWQgdGhl
IGZpbGUKLSAgICBDYWNoZTo6bG9hZGVyKCktPmxvYWQoZGwsIHRoaXMsIGZhbHNlKTsKLSAgICBt
X2xvYWRpbmcgPSB0cnVlOwotICAgIG1fZGVjb2RlciA9IG5ldyBEZWNvZGVyOwotfQotCi1DYWNo
ZWRYQkxEb2N1bWVudDo6fkNhY2hlZFhCTERvY3VtZW50KCkKLXsKLSAgICBpZiAobV9kb2N1bWVu
dCkKLSAgICAgICAgbV9kb2N1bWVudC0+ZGVyZWYoKTsKLX0KLQotdm9pZCBDYWNoZWRYQkxEb2N1
bWVudDo6cmVmKENhY2hlZE9iamVjdENsaWVudCAqYykKLXsKLSAgICBDYWNoZWRPYmplY3Q6OnJl
ZihjKTsKLSAgICBpZiAoIW1fbG9hZGluZykKLSAgICAgICAgYy0+c2V0WEJMRG9jdW1lbnQobV91
cmwsIG1fZG9jdW1lbnQpOwotfQotCi12b2lkIENhY2hlZFhCTERvY3VtZW50OjpkZXJlZihDYWNo
ZWRPYmplY3RDbGllbnQgKmMpCi17Ci0gICAgQ2FjaGU6OmZsdXNoKCk7Ci0gICAgQ2FjaGVkT2Jq
ZWN0OjpkZXJlZihjKTsKLSAgICBpZiAoY2FuRGVsZXRlKCkgJiYgbV9mcmVlKQotICAgICAgICBk
ZWxldGUgdGhpczsKLX0KLQotdm9pZCBDYWNoZWRYQkxEb2N1bWVudDo6c2V0Q2hhcnNldCggY29u
c3QgUVN0cmluZyAmY2hzICkKLXsKLSAgICBpZiAoIWNocy5pc0VtcHR5KCkpCi0gICAgICAgIG1f
ZGVjb2Rlci0+c2V0RW5jb2RpbmcoY2hzLmxhdGluMSgpLCBEZWNvZGVyOjpFbmNvZGluZ0Zyb21I
VFRQSGVhZGVyKTsKLX0KLQotdm9pZCBDYWNoZWRYQkxEb2N1bWVudDo6ZGF0YSggUUJ1ZmZlciAm
YnVmZmVyLCBib29sIGVvZiApCi17Ci0gICAgaWYgKCFlb2YpIHJldHVybjsKLSAgICAKLSAgICBh
c3NlcnQoIW1fZG9jdW1lbnQpOwotICAgIAotICAgIG1fZG9jdW1lbnQgPSAgbmV3IFhCTDo6WEJM
RG9jdW1lbnRJbXBsKCk7Ci0gICAgbV9kb2N1bWVudC0+cmVmKCk7Ci0gICAgbV9kb2N1bWVudC0+
b3BlbigpOwotICAgIAotICAgIFFTdHJpbmcgZGF0YSA9IG1fZGVjb2Rlci0+ZGVjb2RlKGJ1ZmZl
ci5idWZmZXIoKS5kYXRhKCksIGJ1ZmZlci5idWZmZXIoKS5zaXplKCkpOwotICAgIG1fZG9jdW1l
bnQtPndyaXRlKGRhdGEpOwotICAgIHNldFNpemUoYnVmZmVyLmJ1ZmZlcigpLnNpemUoKSk7Ci0g
ICAgYnVmZmVyLmNsb3NlKCk7Ci0gICAgCi0gICAgbV9kb2N1bWVudC0+ZmluaXNoUGFyc2luZygp
OwotICAgIG1fZG9jdW1lbnQtPmNsb3NlKCk7Ci0gICAgbV9sb2FkaW5nID0gZmFsc2U7Ci0gICAg
Y2hlY2tOb3RpZnkoKTsKLX0KLQotdm9pZCBDYWNoZWRYQkxEb2N1bWVudDo6Y2hlY2tOb3RpZnko
KQotewotICAgIGlmKG1fbG9hZGluZykKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIENhY2hl
ZE9iamVjdENsaWVudFdhbGtlciB3KG1fY2xpZW50cyk7Ci0gICAgd2hpbGUgKENhY2hlZE9iamVj
dENsaWVudCAqYyA9IHcubmV4dCgpKQotICAgICAgICBjLT5zZXRYQkxEb2N1bWVudChtX3VybCwg
bV9kb2N1bWVudCk7Ci19Ci0KLQotdm9pZCBDYWNoZWRYQkxEb2N1bWVudDo6ZXJyb3IoIGludCAv
KmVyciovLCBjb25zdCBjaGFyICovKnRleHQqLyApCi17Ci0gICAgbV9sb2FkaW5nID0gZmFsc2U7
Ci0gICAgY2hlY2tOb3RpZnkoKTsKLX0KLSNlbmRpZgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0KK25hbWVzcGFjZSBraHRtbCB7CiAKIFJlcXVlc3Q6OlJlcXVlc3QoRG9j
TG9hZGVyKiBkbCwgQ2FjaGVkT2JqZWN0ICpfb2JqZWN0LCBib29sIF9pbmNyZW1lbnRhbCkKIHsK
QEAgLTc4MywxMTAxICs0NSw0IEBAIFJlcXVlc3Q6On5SZXF1ZXN0KCkKICAgICBvYmplY3QtPnNl
dFJlcXVlc3QoMCk7CiB9CiAKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQot
Ci1Eb2NMb2FkZXI6OkRvY0xvYWRlcihLSFRNTFBhcnQqIHBhcnQsIERvY3VtZW50SW1wbCogZG9j
KQotewotICAgIG1fY2FjaGVQb2xpY3kgPSBLSU86OkNDX1ZlcmlmeTsKLSAgICBtX2V4cGlyZURh
dGUgPSAwOwotICAgIG1fYmF1dG9sb2FkSW1hZ2VzID0gdHJ1ZTsKLSAgICBtX3Nob3dBbmltYXRp
b25zID0gS0hUTUxTZXR0aW5nczo6S0FuaW1hdGlvbkVuYWJsZWQ7Ci0gICAgbV9wYXJ0ID0gcGFy
dDsKLSAgICBtX2RvYyA9IGRvYzsKLSAgICBtX2xvYWRJblByb2dyZXNzID0gZmFsc2U7Ci0KLSAg
ICBDYWNoZTo6aW5pdCgpOwotICAgIENhY2hlOjpkb2Nsb2FkZXItPmFwcGVuZCggdGhpcyApOwot
fQotCi1Eb2NMb2FkZXI6On5Eb2NMb2FkZXIoKQotewotICAgIENhY2hlOjpkb2Nsb2FkZXItPnJl
bW92ZSggdGhpcyApOwotfQotCi12b2lkIERvY0xvYWRlcjo6c2V0RXhwaXJlRGF0ZSh0aW1lX3Qg
X2V4cGlyZURhdGUpCi17Ci0gICAgbV9leHBpcmVEYXRlID0gX2V4cGlyZURhdGU7Ci19Ci0KLWJv
b2wgRG9jTG9hZGVyOjpuZWVkUmVsb2FkKGNvbnN0IEtVUkwgJmZ1bGxVUkwpCi17Ci0gICAgYm9v
bCByZWxvYWQgPSBmYWxzZTsKLSAgICBpZiAobV9jYWNoZVBvbGljeSA9PSBLSU86OkNDX1Zlcmlm
eSkKLSAgICB7Ci0gICAgICAgaWYgKCFtX3JlbG9hZGVkVVJMcy5jb250YWlucyhmdWxsVVJMLnVy
bCgpKSkKLSAgICAgICB7Ci0gICAgICAgICAgQ2FjaGVkT2JqZWN0ICpleGlzdGluZyA9IENhY2hl
OjpjYWNoZS0+ZmluZChmdWxsVVJMLnVybCgpKTsKLSAgICAgICAgICBpZiAoZXhpc3RpbmcgJiYg
ZXhpc3RpbmctPmlzRXhwaXJlZCgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgICBDYWNoZTo6
cmVtb3ZlQ2FjaGVFbnRyeShleGlzdGluZyk7Ci0gICAgICAgICAgICAgbV9yZWxvYWRlZFVSTHMu
YXBwZW5kKGZ1bGxVUkwudXJsKCkpOwotICAgICAgICAgICAgIHJlbG9hZCA9IHRydWU7Ci0gICAg
ICAgICAgfQotICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoKG1fY2FjaGVQb2xpY3kgPT0g
S0lPOjpDQ19SZWxvYWQpIHx8IChtX2NhY2hlUG9saWN5ID09IEtJTzo6Q0NfUmVmcmVzaCkpCi0g
ICAgewotICAgICAgIGlmICghbV9yZWxvYWRlZFVSTHMuY29udGFpbnMoZnVsbFVSTC51cmwoKSkp
Ci0gICAgICAgewotICAgICAgICAgIENhY2hlZE9iamVjdCAqZXhpc3RpbmcgPSBDYWNoZTo6Y2Fj
aGUtPmZpbmQoZnVsbFVSTC51cmwoKSk7Ci0gICAgICAgICAgaWYgKGV4aXN0aW5nKQotICAgICAg
ICAgIHsKLSAgICAgICAgICAgICBDYWNoZTo6cmVtb3ZlQ2FjaGVFbnRyeShleGlzdGluZyk7Ci0g
ICAgICAgICAgfQotICAgICAgICAgIG1fcmVsb2FkZWRVUkxzLmFwcGVuZChmdWxsVVJMLnVybCgp
KTsKLSAgICAgICAgICByZWxvYWQgPSB0cnVlOwotICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJu
IHJlbG9hZDsKLX0KLQotQ2FjaGVkSW1hZ2UgKkRvY0xvYWRlcjo6cmVxdWVzdEltYWdlKCBjb25z
dCBET006OkRPTVN0cmluZyAmdXJsKQotewotICAgIEtVUkwgZnVsbFVSTCA9IG1fZG9jLT5jb21w
bGV0ZVVSTCh1cmwucXN0cmluZygpKTsKLSAgICBpZiAoIG1fcGFydCAmJiBtX3BhcnQtPm9ubHlM
b2NhbFJlZmVyZW5jZXMoKSAmJiBmdWxsVVJMLnByb3RvY29sKCkgIT0gImZpbGUiKSByZXR1cm4g
MDsKLQotICAgIGlmIChLV1FDaGVja0lmUmVsb2FkaW5nKHRoaXMpKSB7Ci0gICAgICAgIHNldENh
Y2hlUG9saWN5KEtJTzo6Q0NfUmVsb2FkKTsKLSAgICB9Ci0KLSAgICBib29sIHJlbG9hZCA9IG5l
ZWRSZWxvYWQoZnVsbFVSTCk7Ci0KLSAgICBDYWNoZWRJbWFnZSAqY2FjaGVkT2JqZWN0ID0gQ2Fj
aGU6OnJlcXVlc3RJbWFnZSh0aGlzLCBmdWxsVVJMLCByZWxvYWQsIG1fZXhwaXJlRGF0ZSk7Ci0g
ICAgS1dRQ2hlY2tDYWNoZU9iamVjdFN0YXR1cyh0aGlzLCBjYWNoZWRPYmplY3QpOwotICAgIHJl
dHVybiBjYWNoZWRPYmplY3Q7Ci19Ci0KLUNhY2hlZENTU1N0eWxlU2hlZXQgKkRvY0xvYWRlcjo6
cmVxdWVzdFN0eWxlU2hlZXQoIGNvbnN0IERPTTo6RE9NU3RyaW5nICZ1cmwsIGNvbnN0IFFTdHJp
bmcmIGNoYXJzZXQpCi17Ci0gICAgS1VSTCBmdWxsVVJMID0gbV9kb2MtPmNvbXBsZXRlVVJMKHVy
bC5xc3RyaW5nKCkpOwotICAgIGlmICggbV9wYXJ0ICYmIG1fcGFydC0+b25seUxvY2FsUmVmZXJl
bmNlcygpICYmIGZ1bGxVUkwucHJvdG9jb2woKSAhPSAiZmlsZSIpIHJldHVybiAwOwotCi0gICAg
aWYgKEtXUUNoZWNrSWZSZWxvYWRpbmcodGhpcykpIHsKLSAgICAgICAgc2V0Q2FjaGVQb2xpY3ko
S0lPOjpDQ19SZWxvYWQpOwotICAgIH0KLQotICAgIGJvb2wgcmVsb2FkID0gbmVlZFJlbG9hZChm
dWxsVVJMKTsKLQotICAgIENhY2hlZENTU1N0eWxlU2hlZXQgKmNhY2hlZE9iamVjdCA9IENhY2hl
OjpyZXF1ZXN0U3R5bGVTaGVldCh0aGlzLCB1cmwsIHJlbG9hZCwgbV9leHBpcmVEYXRlLCBjaGFy
c2V0KTsKLSAgICBLV1FDaGVja0NhY2hlT2JqZWN0U3RhdHVzKHRoaXMsIGNhY2hlZE9iamVjdCk7
Ci0gICAgcmV0dXJuIGNhY2hlZE9iamVjdDsKLX0KLQotQ2FjaGVkU2NyaXB0ICpEb2NMb2FkZXI6
OnJlcXVlc3RTY3JpcHQoIGNvbnN0IERPTTo6RE9NU3RyaW5nICZ1cmwsIGNvbnN0IFFTdHJpbmcm
IGNoYXJzZXQpCi17Ci0gICAgS1VSTCBmdWxsVVJMID0gbV9kb2MtPmNvbXBsZXRlVVJMKHVybC5x
c3RyaW5nKCkpOwotICAgIGlmICggbV9wYXJ0ICYmIG1fcGFydC0+b25seUxvY2FsUmVmZXJlbmNl
cygpICYmIGZ1bGxVUkwucHJvdG9jb2woKSAhPSAiZmlsZSIpIHJldHVybiAwOwotCi0gICAgaWYg
KEtXUUNoZWNrSWZSZWxvYWRpbmcodGhpcykpIHsKLSAgICAgICAgc2V0Q2FjaGVQb2xpY3koS0lP
OjpDQ19SZWxvYWQpOwotICAgIH0KLQotICAgIGJvb2wgcmVsb2FkID0gbmVlZFJlbG9hZChmdWxs
VVJMKTsKLQotICAgIENhY2hlZFNjcmlwdCAqY2FjaGVkT2JqZWN0ID0gQ2FjaGU6OnJlcXVlc3RT
Y3JpcHQodGhpcywgdXJsLCByZWxvYWQsIG1fZXhwaXJlRGF0ZSwgY2hhcnNldCk7Ci0gICAgS1dR
Q2hlY2tDYWNoZU9iamVjdFN0YXR1cyh0aGlzLCBjYWNoZWRPYmplY3QpOwotICAgIHJldHVybiBj
YWNoZWRPYmplY3Q7Ci19Ci0KLSNpZmRlZiBLSFRNTF9YU0xUCi1DYWNoZWRYU0xTdHlsZVNoZWV0
KiBEb2NMb2FkZXI6OnJlcXVlc3RYU0xTdHlsZVNoZWV0KGNvbnN0IERPTTo6RE9NU3RyaW5nICZ1
cmwpCi17Ci0gICAgS1VSTCBmdWxsVVJMID0gbV9kb2MtPmNvbXBsZXRlVVJMKHVybC5xc3RyaW5n
KCkpOwotICAgIAotICAgIGlmIChtX3BhcnQgJiYgbV9wYXJ0LT5vbmx5TG9jYWxSZWZlcmVuY2Vz
KCkgJiYgZnVsbFVSTC5wcm90b2NvbCgpICE9ICJmaWxlIikgcmV0dXJuIDA7Ci0gICAgCi0gICAg
aWYgKEtXUUNoZWNrSWZSZWxvYWRpbmcodGhpcykpCi0gICAgICAgIHNldENhY2hlUG9saWN5KEtJ
Tzo6Q0NfUmVsb2FkKTsKLSAgICAKLSAgICBib29sIHJlbG9hZCA9IG5lZWRSZWxvYWQoZnVsbFVS
TCk7Ci0gICAgCi0gICAgQ2FjaGVkWFNMU3R5bGVTaGVldCAqY2FjaGVkT2JqZWN0ID0gQ2FjaGU6
OnJlcXVlc3RYU0xTdHlsZVNoZWV0KHRoaXMsIHVybCwgcmVsb2FkLCBtX2V4cGlyZURhdGUpOwot
ICAgIEtXUUNoZWNrQ2FjaGVPYmplY3RTdGF0dXModGhpcywgY2FjaGVkT2JqZWN0KTsKLSAgICBy
ZXR1cm4gY2FjaGVkT2JqZWN0OwotfQotI2VuZGlmCi0KLSNpZm5kZWYgS0hUTUxfTk9fWEJMCi1D
YWNoZWRYQkxEb2N1bWVudCogRG9jTG9hZGVyOjpyZXF1ZXN0WEJMRG9jdW1lbnQoY29uc3QgRE9N
OjpET01TdHJpbmcgJnVybCkKLXsKLSAgICBLVVJMIGZ1bGxVUkwgPSBtX2RvYy0+Y29tcGxldGVV
UkwodXJsLnFzdHJpbmcoKSk7Ci0gICAgCi0gICAgLy8gRklYTUU6IElzIHRoaXMgcmlnaHQgZm9y
IFhCTD8KLSAgICBpZiAobV9wYXJ0ICYmIG1fcGFydC0+b25seUxvY2FsUmVmZXJlbmNlcygpICYm
IGZ1bGxVUkwucHJvdG9jb2woKSAhPSAiZmlsZSIpIHJldHVybiAwOwotICAgIAotICAgIGlmIChL
V1FDaGVja0lmUmVsb2FkaW5nKHRoaXMpKSB7Ci0gICAgICAgIHNldENhY2hlUG9saWN5KEtJTzo6
Q0NfUmVsb2FkKTsKLSAgICB9Ci0gICAgCi0gICAgYm9vbCByZWxvYWQgPSBuZWVkUmVsb2FkKGZ1
bGxVUkwpOwotICAgIAotICAgIENhY2hlZFhCTERvY3VtZW50ICpjYWNoZWRPYmplY3QgPSBDYWNo
ZTo6cmVxdWVzdFhCTERvY3VtZW50KHRoaXMsIHVybCwgcmVsb2FkLCBtX2V4cGlyZURhdGUpOwot
ICAgIEtXUUNoZWNrQ2FjaGVPYmplY3RTdGF0dXModGhpcywgY2FjaGVkT2JqZWN0KTsKLSAgICBy
ZXR1cm4gY2FjaGVkT2JqZWN0OwotfQotI2VuZGlmCi0KLXZvaWQgRG9jTG9hZGVyOjpzZXRBdXRv
bG9hZEltYWdlcyggYm9vbCBlbmFibGUgKQotewotICAgIGlmICggZW5hYmxlID09IG1fYmF1dG9s
b2FkSW1hZ2VzICkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV9iYXV0b2xvYWRJbWFnZXMgPSBl
bmFibGU7Ci0KLSAgICBpZiAoICFtX2JhdXRvbG9hZEltYWdlcyApIHJldHVybjsKLQotICAgIGZv
ciAoIGNvbnN0IENhY2hlZE9iamVjdCogY289bV9kb2NPYmplY3RzLmZpcnN0KCk7IGNvOyBjbz1t
X2RvY09iamVjdHMubmV4dCgpICkKLSAgICAgICAgaWYgKCBjby0+dHlwZSgpID09IENhY2hlZE9i
amVjdDo6SW1hZ2UgKQotICAgICAgICB7Ci0gICAgICAgICAgICBDYWNoZWRJbWFnZSAqaW1nID0g
Y29uc3RfY2FzdDxDYWNoZWRJbWFnZSo+KCBzdGF0aWNfY2FzdDxjb25zdCBDYWNoZWRJbWFnZSAq
PiggY28gKSApOwotCi0gICAgICAgICAgICBDYWNoZWRPYmplY3Q6OlN0YXR1cyBzdGF0dXMgPSBp
bWctPnN0YXR1cygpOwotICAgICAgICAgICAgaWYgKCBzdGF0dXMgIT0gQ2FjaGVkT2JqZWN0OjpV
bmtub3duICkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgQ2FjaGU6
OmxvYWRlcigpLT5sb2FkKHRoaXMsIGltZywgdHJ1ZSk7Ci0gICAgICAgIH0KLX0KLQotdm9pZCBE
b2NMb2FkZXI6OnNldENhY2hlUG9saWN5KCBLSU86OkNhY2hlQ29udHJvbCBjYWNoZVBvbGljeSAp
Ci17Ci0gICAgbV9jYWNoZVBvbGljeSA9IGNhY2hlUG9saWN5OwotfQotCi12b2lkIERvY0xvYWRl
cjo6c2V0U2hvd0FuaW1hdGlvbnMoIEtIVE1MU2V0dGluZ3M6OktBbmltYXRpb25BZHZpY2Ugc2hv
d0FuaW1hdGlvbnMgKQotewotICAgIGlmICggc2hvd0FuaW1hdGlvbnMgPT0gbV9zaG93QW5pbWF0
aW9ucyApIHJldHVybjsKLSAgICBtX3Nob3dBbmltYXRpb25zID0gc2hvd0FuaW1hdGlvbnM7Ci0K
LSAgICBjb25zdCBDYWNoZWRPYmplY3QqIGNvOwotICAgIGZvciAoIGNvPW1fZG9jT2JqZWN0cy5m
aXJzdCgpOyBjbzsgY289bV9kb2NPYmplY3RzLm5leHQoKSApCi0gICAgICAgIGlmICggY28tPnR5
cGUoKSA9PSBDYWNoZWRPYmplY3Q6OkltYWdlICkKLSAgICAgICAgewotICAgICAgICAgICAgQ2Fj
aGVkSW1hZ2UgKmltZyA9IGNvbnN0X2Nhc3Q8Q2FjaGVkSW1hZ2UqPiggc3RhdGljX2Nhc3Q8Y29u
c3QgQ2FjaGVkSW1hZ2UgKj4oIGNvICkgKTsKLQotICAgICAgICAgICAgaW1nLT5zZXRTaG93QW5p
bWF0aW9ucyggc2hvd0FuaW1hdGlvbnMgKTsKLSAgICAgICAgfQotfQotCi12b2lkIERvY0xvYWRl
cjo6cmVtb3ZlQ2FjaGVkT2JqZWN0KCBDYWNoZWRPYmplY3QqIG8gKSBjb25zdAotewotICAgIG1f
ZG9jT2JqZWN0cy5yZW1vdmVSZWYoIG8gKTsKLX0KLQotdm9pZCBEb2NMb2FkZXI6OnNldExvYWRJ
blByb2dyZXNzKGJvb2wgbG9hZCkKLXsKLSAgICBtX2xvYWRJblByb2dyZXNzID0gbG9hZDsKLX0K
LQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUxvYWRlcjo6TG9hZGVy
KCkgOiBRT2JqZWN0KCkKLXsKLSAgICBtX3JlcXVlc3RzUGVuZGluZy5zZXRBdXRvRGVsZXRlKCB0
cnVlICk7Ci0gICAgbV9yZXF1ZXN0c0xvYWRpbmcuc2V0QXV0b0RlbGV0ZSggdHJ1ZSApOwotICAg
IGt3cSA9IG5ldyBLV1FMb2FkZXIodGhpcyk7Ci19Ci0KLUxvYWRlcjo6fkxvYWRlcigpCi17Ci0g
ICAgZGVsZXRlIGt3cTsKLX0KLQotdm9pZCBMb2FkZXI6OmxvYWQoRG9jTG9hZGVyKiBkbCwgQ2Fj
aGVkT2JqZWN0ICpvYmplY3QsIGJvb2wgaW5jcmVtZW50YWwpCi17Ci0gICAgUmVxdWVzdCAqcmVx
ID0gbmV3IFJlcXVlc3QoZGwsIG9iamVjdCwgaW5jcmVtZW50YWwpOwotICAgIG1fcmVxdWVzdHNQ
ZW5kaW5nLmFwcGVuZChyZXEpOwotCi0gICAgZW1pdCByZXF1ZXN0U3RhcnRlZCggcmVxLT5tX2Rv
Y0xvYWRlciwgcmVxLT5vYmplY3QgKTsKLQotICAgIHNlcnZlUGVuZGluZ1JlcXVlc3RzKCk7Ci19
Ci0KLXZvaWQgTG9hZGVyOjpzZXJ2ZVBlbmRpbmdSZXF1ZXN0cygpCi17Ci0gIGlmICggbV9yZXF1
ZXN0c1BlbmRpbmcuY291bnQoKSA9PSAwICkKLSAgICAgIHJldHVybjsKLQotICAvLyBnZXQgdGhl
IGZpcnN0IHBlbmRpbmcgcmVxdWVzdAotICBSZXF1ZXN0ICpyZXEgPSBtX3JlcXVlc3RzUGVuZGlu
Zy50YWtlKDApOwotCi0gIEtVUkwgdShyZXEtPm9iamVjdC0+dXJsKCkucXN0cmluZygpKTsKLSAg
S0lPOjpUcmFuc2ZlckpvYiogam9iID0gS0lPOjpnZXQoIHUsIGZhbHNlLCBmYWxzZSAvKm5vIEdV
SSovLCB0cnVlKTsKLSAgCi0gIGpvYi0+YWRkTWV0YURhdGEoImNhY2hlIiwgZ2V0Q2FjaGVDb250
cm9sU3RyaW5nKHJlcS0+b2JqZWN0LT5jYWNoZVBvbGljeSgpKSk7Ci0gIGlmICghcmVxLT5vYmpl
Y3QtPmFjY2VwdCgpLmlzRW1wdHkoKSkKLSAgICAgIGpvYi0+YWRkTWV0YURhdGEoImFjY2VwdCIs
IHJlcS0+b2JqZWN0LT5hY2NlcHQoKSk7Ci0gIGlmICggcmVxLT5tX2RvY0xvYWRlciApICB7Ci0g
ICAgICBLVVJMIHIgPSByZXEtPm1fZG9jTG9hZGVyLT5kb2MoKS0+VVJMKCk7Ci0gICAgICBpZiAo
IHIucHJvdG9jb2woKS5zdGFydHNXaXRoKCAiaHR0cCIgKSAmJiByLnBhdGgoKS5pc0VtcHR5KCkg
KQotICAgICAgICAgIHIuc2V0UGF0aCggIi8iICk7Ci0KLSAgICAgIGpvYi0+YWRkTWV0YURhdGEo
InJlZmVycmVyIiwgci51cmwoKSk7Ci0gICAgICBRU3RyaW5nIGRvbWFpbiA9IHIuaG9zdCgpOwot
ICAgICAgaWYgKHJlcS0+bV9kb2NMb2FkZXItPmRvYygpLT5pc0hUTUxEb2N1bWVudCgpKQotICAg
ICAgICAgZG9tYWluID0gc3RhdGljX2Nhc3Q8SFRNTERvY3VtZW50SW1wbCo+KHJlcS0+bV9kb2NM
b2FkZXItPmRvYygpKS0+ZG9tYWluKCkucXN0cmluZygpOwotICAgICAgaWYgKGNyb3NzRG9tYWlu
KHUuaG9zdCgpLCBkb21haW4pKQotICAgICAgICAgam9iLT5hZGRNZXRhRGF0YSgiY3Jvc3MtZG9t
YWluIiwgInRydWUiKTsKLSAgfQotCi0gIGNvbm5lY3QoIGpvYiwgU0lHTkFMKCByZXN1bHQoIEtJ
Tzo6Sm9iICosIE5TRGF0YSAqKSApLCB0aGlzLCBTTE9UKCBzbG90RmluaXNoZWQoIEtJTzo6Sm9i
ICosIE5TRGF0YSAqKSApICk7Ci0gIAotICBjb25uZWN0KCBqb2IsIFNJR05BTCggZGF0YSggS0lP
OjpKb2IqLCBjb25zdCBjaGFyICosIGludCkpLAotICAgICAgICAgICBTTE9UKCBzbG90RGF0YSgg
S0lPOjpKb2IqLCBjb25zdCBjaGFyICosIGludCkpKTsKLSAgY29ubmVjdCggam9iLCBTSUdOQUwo
IHJlY2VpdmVkUmVzcG9uc2UoIEtJTzo6Sm9iICosIE5TVVJMUmVzcG9uc2UgKikpLCBTTE9UKCBz
bG90UmVjZWl2ZWRSZXNwb25zZSggS0lPOjpKb2IgKiwgTlNVUkxSZXNwb25zZSAqKSkgKTsKLQot
ICBpZiAoS1dRU2VydmVSZXF1ZXN0KHRoaXMsIHJlcSwgam9iKSkgewotICAgICAgaWYgKHJlcS0+
b2JqZWN0LT50eXBlKCkgPT0gQ2FjaGVkT2JqZWN0OjpJbWFnZSkgewotCUNhY2hlZEltYWdlICpj
aSA9IHN0YXRpY19jYXN0PENhY2hlZEltYWdlKj4ocmVxLT5vYmplY3QpOwotCWlmIChjaS0+ZGVj
b2RlckNhbGxiYWNrKCkpIHsKLQkgICAgbV9yZXF1ZXN0c0JhY2tncm91bmREZWNvZGluZy5hcHBl
bmQocmVxKTsKLQl9Ci0gICAgICB9Ci0gICAgICBtX3JlcXVlc3RzTG9hZGluZy5pbnNlcnQoam9i
LCByZXEpOwotICB9Ci19Ci0KLXZvaWQgTG9hZGVyOjpzbG90RmluaXNoZWQoIEtJTzo6Sm9iKiBq
b2IsIE5TRGF0YSAqYWxsRGF0YSkKLXsKLSAgICBSZXF1ZXN0ICpyID0gbV9yZXF1ZXN0c0xvYWRp
bmcudGFrZSggam9iICk7Ci0gICAgS0lPOjpUcmFuc2ZlckpvYiogaiA9IHN0YXRpY19jYXN0PEtJ
Tzo6VHJhbnNmZXJKb2IqPihqb2IpOwotCi0gICAgaWYgKCAhciApCi0gICAgICAgIHJldHVybjsK
LQotICAgIENhY2hlZE9iamVjdCAqb2JqZWN0ID0gci0+b2JqZWN0OwotICAgIERvY0xvYWRlciAq
ZG9jTG9hZGVyID0gci0+bV9kb2NMb2FkZXI7Ci0gICAgCi0gICAgYm9vbCBiYWNrZ3JvdW5kSW1h
Z2VEZWNvZGluZyA9IChvYmplY3QtPnR5cGUoKSA9PSBDYWNoZWRPYmplY3Q6OkltYWdlICYmIAot
CXN0YXRpY19jYXN0PENhY2hlZEltYWdlKj4ob2JqZWN0KS0+ZGVjb2RlckNhbGxiYWNrKCkpOwot
CQotICAgIGlmIChqLT5lcnJvcigpIHx8IGotPmlzRXJyb3JQYWdlKCkpIHsKLSAgICAgICAgLy8g
VXNlIHRoZSBiYWNrZ3JvdW5kIGltYWdlIGRlY29kZXIncyBjYWxsYmFjayB0byBoYW5kbGUgdGhl
IGVycm9yLgotICAgICAgICBpZiAoYmFja2dyb3VuZEltYWdlRGVjb2RpbmcpIHsKLSAgICAgICAg
ICAgIENhY2hlZEltYWdlQ2FsbGJhY2sgKmNhbGxiYWNrID0gc3RhdGljX2Nhc3Q8Q2FjaGVkSW1h
Z2UqPihvYmplY3QpLT5kZWNvZGVyQ2FsbGJhY2soKTsKLSAgICAgICAgICAgIGNhbGxiYWNrLT5o
YW5kbGVFcnJvcigpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgZG9j
TG9hZGVyLT5zZXRMb2FkSW5Qcm9ncmVzcyh0cnVlKTsKLSAgICAgICAgICAgIHItPm9iamVjdC0+
ZXJyb3IoIGpvYi0+ZXJyb3IoKSwgam9iLT5lcnJvclRleHQoKS5hc2NpaSgpICk7Ci0gICAgICAg
ICAgICBkb2NMb2FkZXItPnNldExvYWRJblByb2dyZXNzKGZhbHNlKTsKLSAgICAgICAgICAgIGVt
aXQgcmVxdWVzdEZhaWxlZCggZG9jTG9hZGVyLCBvYmplY3QgKTsKLSAgICAgICAgICAgIENhY2hl
OjpyZW1vdmVDYWNoZUVudHJ5KCBvYmplY3QgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNl
IHsKLSAgICAgICAgZG9jTG9hZGVyLT5zZXRMb2FkSW5Qcm9ncmVzcyh0cnVlKTsKLSAgICAgICAg
b2JqZWN0LT5kYXRhKHItPm1fYnVmZmVyLCB0cnVlKTsKLSAgICAgICAgci0+b2JqZWN0LT5zZXRB
bGxEYXRhKGFsbERhdGEpOwotICAgICAgICBkb2NMb2FkZXItPnNldExvYWRJblByb2dyZXNzKGZh
bHNlKTsKLSAgICAgICAgCi0gICAgICAgIC8vIExldCB0aGUgYmFja2dyb3VuZCBpbWFnZSBkZWNv
ZGVyIHRyaWdnZXIgdGhlIGRvbmUgc2lnbmFsLgotICAgICAgICBpZiAoIWJhY2tncm91bmRJbWFn
ZURlY29kaW5nKQotICAgICAgICAgICAgZW1pdCByZXF1ZXN0RG9uZSggZG9jTG9hZGVyLCBvYmpl
Y3QgKTsKLQotICAgICAgICBvYmplY3QtPmZpbmlzaCgpOwotICAgIH0KLQotICAgIC8vIExldCB0
aGUgYmFja2dyb3VuZCBpbWFnZSBkZWNvZGVyIHJlbGVhc2UgdGhlIHJlcXVlc3Qgd2hlbiBpdCBp
cwotICAgIC8vIGZpbmlzaGVkLgotICAgIGlmICghYmFja2dyb3VuZEltYWdlRGVjb2RpbmcpIHsK
LSAgICAgICAgZGVsZXRlIHI7Ci0gICAgfQotCi0gICAgc2VydmVQZW5kaW5nUmVxdWVzdHMoKTsK
LX0KLQotCi12b2lkIExvYWRlcjo6c2xvdFJlY2VpdmVkUmVzcG9uc2UoS0lPOjpKb2IqIGpvYiwg
TlNVUkxSZXNwb25zZSAqcmVzcG9uc2UpCi17Ci0gICAgUmVxdWVzdCAqciA9IG1fcmVxdWVzdHNM
b2FkaW5nW2pvYl07Ci0gICAgQVNTRVJUKHIpOwotICAgIEFTU0VSVChyZXNwb25zZSk7Ci0gICAg
ci0+b2JqZWN0LT5zZXRSZXNwb25zZShyZXNwb25zZSk7Ci0gICAgci0+b2JqZWN0LT5zZXRFeHBp
cmVEYXRlKEtXUUNhY2hlT2JqZWN0RXhwaXJlc1RpbWUoci0+bV9kb2NMb2FkZXIsIHJlc3BvbnNl
KSwgZmFsc2UpOwotICAgIAotICAgIFFTdHJpbmcgY2hzID0gc3RhdGljX2Nhc3Q8S0lPOjpUcmFu
c2ZlckpvYio+KGpvYiktPnF1ZXJ5TWV0YURhdGEoImNoYXJzZXQiKTsKLSAgICBpZiAoIWNocy5p
c051bGwoKSkKLSAgICAgICAgci0+b2JqZWN0LT5zZXRDaGFyc2V0KGNocyk7Ci0gICAgCi0gICAg
aWYgKHItPm11bHRpcGFydCkgewotICAgICAgICBBU1NFUlQoci0+b2JqZWN0LT5pc0ltYWdlKCkp
OwotICAgICAgICBzdGF0aWNfY2FzdDxDYWNoZWRJbWFnZSAqPihyLT5vYmplY3QpLT5jbGVhcigp
OwotICAgICAgICByLT5tX2J1ZmZlciA9IFFCdWZmZXIoKTsKLSAgICAgICAgaWYgKHItPm1fZG9j
TG9hZGVyLT5wYXJ0KCkpCi0gICAgICAgICAgICByLT5tX2RvY0xvYWRlci0+cGFydCgpLT5jaGVj
a0NvbXBsZXRlZCgpOwotICAgICAgICAKLSAgICB9IGVsc2UgaWYgKEtXUVJlc3BvbnNlSXNNdWx0
aXBhcnQocmVzcG9uc2UpKSB7Ci0gICAgICAgIHItPm11bHRpcGFydCA9IHRydWU7Ci0gICAgICAg
IGlmICghci0+b2JqZWN0LT5pc0ltYWdlKCkpCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxLSU86
OlRyYW5zZmVySm9iKj4oam9iKS0+Y2FuY2VsKCk7Ci0gICAgfQotfQotCi0KLXZvaWQgTG9hZGVy
OjpzbG90RGF0YSggS0lPOjpKb2Iqam9iLCBjb25zdCBjaGFyICpkYXRhLCBpbnQgc2l6ZSApCi17
Ci0gICAgUmVxdWVzdCAqciA9IG1fcmVxdWVzdHNMb2FkaW5nW2pvYl07Ci0gICAgaWYoIXIpIHsK
LSAgICAgICAga2REZWJ1ZyggNjA2MCApIDw8ICJnb3QgZGF0YSBmb3IgdW5rbm93biByZXF1ZXN0
ISIgPDwgZW5kbDsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmICggIXItPm1fYnVm
ZmVyLmlzT3BlbigpICkKLSAgICAgICAgci0+bV9idWZmZXIub3BlbiggSU9fV3JpdGVPbmx5ICk7
Ci0KLSAgICByLT5tX2J1ZmZlci53cml0ZUJsb2NrKCBkYXRhLCBzaXplICk7Ci0KLSAgICBpZiAo
ci0+bXVsdGlwYXJ0KQotICAgICAgICByLT5vYmplY3QtPmRhdGEoIHItPm1fYnVmZmVyLCB0cnVl
ICk7IC8vIHRoZSBsb2FkZXIgZGVsaXZlcnMgdGhlIGRhdGEgaW4gYSBtdWx0aXBhcnQgc2VjdGlv
biBhbGwgYXQgb25jZSwgc2VuZCBlb2YKLSAgICBlbHNlIGlmKHItPmluY3JlbWVudGFsKQotICAg
ICAgICByLT5vYmplY3QtPmRhdGEoIHItPm1fYnVmZmVyLCBmYWxzZSApOwotfQotCi1pbnQgTG9h
ZGVyOjpudW1SZXF1ZXN0cyggRG9jTG9hZGVyKiBkbCApIGNvbnN0Ci17Ci0gICAgaW50IHJlcyA9
IDA7Ci0KLSAgICBRUHRyTGlzdEl0ZXJhdG9yPFJlcXVlc3Q+IHBJdCggbV9yZXF1ZXN0c1BlbmRp
bmcgKTsKLSAgICBmb3IgKDsgcEl0LmN1cnJlbnQoKTsgKytwSXQgKQotICAgICAgICBpZiAoIHBJ
dC5jdXJyZW50KCktPm1fZG9jTG9hZGVyID09IGRsICkKLSAgICAgICAgICAgIHJlcysrOwotCi0g
ICAgUVB0ckRpY3RJdGVyYXRvcjxSZXF1ZXN0PiBsSXQoIG1fcmVxdWVzdHNMb2FkaW5nICk7Ci0g
ICAgZm9yICg7IGxJdC5jdXJyZW50KCk7ICsrbEl0ICkKLSAgICAgICAgaWYgKCBsSXQuY3VycmVu
dCgpLT5tX2RvY0xvYWRlciA9PSBkbCApCi0gICAgICAgICAgICBpZiAoIWxJdC5jdXJyZW50KCkt
Pm11bHRpcGFydCkKLSAgICAgICAgICAgICAgICByZXMrKzsKLQotICAgIFFQdHJMaXN0SXRlcmF0
b3I8UmVxdWVzdD4gYmRJdCggbV9yZXF1ZXN0c0JhY2tncm91bmREZWNvZGluZyApOwotICAgIGZv
ciAoOyBiZEl0LmN1cnJlbnQoKTsgKytiZEl0ICkKLSAgICAgICAgaWYgKCBiZEl0LmN1cnJlbnQo
KS0+bV9kb2NMb2FkZXIgPT0gZGwgKQotICAgICAgICAgICAgcmVzKys7Ci0KLSAgICBpZiAoZGwt
PmxvYWRJblByb2dyZXNzKCkpCi0gICAgICAgIHJlcysrOwotICAgICAgICAKLSAgICByZXR1cm4g
cmVzOwotfQotCi12b2lkIExvYWRlcjo6Y2FuY2VsUmVxdWVzdHMoIERvY0xvYWRlciogZGwgKQot
ewotICAgIFFQdHJMaXN0SXRlcmF0b3I8UmVxdWVzdD4gcEl0KCBtX3JlcXVlc3RzUGVuZGluZyAp
OwotICAgIHdoaWxlICggcEl0LmN1cnJlbnQoKSApCi0gICAgewotICAgICAgICBpZiAocEl0LmN1
cnJlbnQoKS0+bV9kb2NMb2FkZXIgPT0gZGwpIHsKLSAgICAgICAgICAgIENhY2hlOjpyZW1vdmVD
YWNoZUVudHJ5KCBwSXQuY3VycmVudCgpLT5vYmplY3QgKTsKLSAgICAgICAgICAgIG1fcmVxdWVz
dHNQZW5kaW5nLnJlbW92ZSggcEl0ICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAg
ICAgICAgKytwSXQ7Ci0gICAgfQotCi0gICAgUVB0ckRpY3RJdGVyYXRvcjxSZXF1ZXN0PiBsSXQo
IG1fcmVxdWVzdHNMb2FkaW5nICk7Ci0gICAgd2hpbGUgKCBsSXQuY3VycmVudCgpICkKLSAgICB7
Ci0gICAgICAgIGlmIChsSXQuY3VycmVudCgpLT5tX2RvY0xvYWRlciA9PSBkbCkgewotICAgICAg
ICAgICAgS0lPOjpKb2IgKmpvYiA9IHN0YXRpY19jYXN0PEtJTzo6Sm9iICo+KCBsSXQuY3VycmVu
dEtleSgpICk7Ci0gICAgICAgICAgICBDYWNoZTo6cmVtb3ZlQ2FjaGVFbnRyeSggbEl0LmN1cnJl
bnQoKS0+b2JqZWN0ICk7Ci0gICAgICAgICAgICBtX3JlcXVlc3RzTG9hZGluZy5yZW1vdmUoIGxJ
dC5jdXJyZW50S2V5KCkgKTsKLSAgICAgICAgICAgIGpvYi0+a2lsbCgpOwotICAgICAgICB9Ci0g
ICAgICAgIGVsc2UKLSAgICAgICAgICAgICsrbEl0OwotICAgIH0KLQotICAgIFFQdHJMaXN0SXRl
cmF0b3I8UmVxdWVzdD4gYmRJdCggbV9yZXF1ZXN0c0JhY2tncm91bmREZWNvZGluZyApOwotICAg
IHdoaWxlIChiZEl0LmN1cnJlbnQoKSkgewotICAgICAgICBpZiAoYmRJdC5jdXJyZW50KCktPm1f
ZG9jTG9hZGVyID09IGRsKSB7Ci0gICAgICAgICAgICBDYWNoZTo6cmVtb3ZlQ2FjaGVFbnRyeSgg
YmRJdC5jdXJyZW50KCktPm9iamVjdCApOwotICAgICAgICAgICAgbV9yZXF1ZXN0c0JhY2tncm91
bmREZWNvZGluZy5yZW1vdmUoIGJkSXQgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAg
ICAgICAgICArK2JkSXQ7Ci0gICAgfQotfQotCi12b2lkIExvYWRlcjo6cmVtb3ZlQmFja2dyb3Vu
ZERlY29kaW5nUmVxdWVzdCAoUmVxdWVzdCAqcikKLXsKLSAgICBib29sIHByZXNlbnQgPSBtX3Jl
cXVlc3RzQmFja2dyb3VuZERlY29kaW5nLmNvbnRhaW5zUmVmKHIpOwotICAgIGlmIChwcmVzZW50
KSB7Ci0JbV9yZXF1ZXN0c0JhY2tncm91bmREZWNvZGluZy5yZW1vdmUgKHIpOwotICAgIH0KLX0K
LQotS0lPOjpKb2IgKkxvYWRlcjo6am9iRm9yUmVxdWVzdCggY29uc3QgRE9NOjpET01TdHJpbmcg
JnVybCApIGNvbnN0Ci17Ci0gICAgUVB0ckRpY3RJdGVyYXRvcjxSZXF1ZXN0PiBpdCggbV9yZXF1
ZXN0c0xvYWRpbmcgKTsKLQotICAgIGZvciAoOyBpdC5jdXJyZW50KCk7ICsraXQgKQotICAgIHsK
LSAgICAgICAgQ2FjaGVkT2JqZWN0ICpvYmogPSBpdC5jdXJyZW50KCktPm9iamVjdDsKLQotICAg
ICAgICBpZiAoIG9iaiAmJiBvYmotPnVybCgpID09IHVybCApCi0gICAgICAgICAgICByZXR1cm4g
c3RhdGljX2Nhc3Q8S0lPOjpKb2IgKj4oIGl0LmN1cnJlbnRLZXkoKSApOwotICAgIH0KLQotICAg
IHJldHVybiAwOwotfQotCi0KLWJvb2wgTG9hZGVyOjppc0tIVE1MTG9hZGVyKCkgY29uc3QKLXsK
LSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQotTFJV
TGlzdDo6TFJVTGlzdCgpCi06bV9oZWFkKDApLCBtX3RhaWwoMCkgCi17fQotCi1MUlVMaXN0Ojp+
TFJVTGlzdCgpCi17fQotCi1RRGljdDxDYWNoZWRPYmplY3Q+ICpDYWNoZTo6Y2FjaGUgPSAwOwot
UVB0ckxpc3Q8RG9jTG9hZGVyPiogQ2FjaGU6OmRvY2xvYWRlciA9IDA7Ci1Mb2FkZXIgKkNhY2hl
OjptX2xvYWRlciA9IDA7Ci0KLWludCBDYWNoZTo6bWF4U2l6ZSA9IERFRkNBQ0hFU0laRTsKLWlu
dCBDYWNoZTo6bWF4Q2FjaGVhYmxlID0gTUFYQ0FDSEVBQkxFOwotaW50IENhY2hlOjpmbHVzaENv
dW50ID0gMDsKLQotUVBpeG1hcCAqQ2FjaGU6Om51bGxQaXhtYXAgPSAwOwotUVBpeG1hcCAqQ2Fj
aGU6OmJyb2tlblBpeG1hcCA9IDA7Ci0KLUNhY2hlZE9iamVjdCAqQ2FjaGU6Om1faGVhZE9mVW5j
YWNoZWFibGVMaXN0ID0gMDsKLWludCBDYWNoZTo6bV90b3RhbFNpemVPZkxSVUxpc3RzID0gMDsK
LWludCBDYWNoZTo6bV9jb3VudE9mTFJVQW5kVW5jYWNoZWFibGVMaXN0czsKLUxSVUxpc3QgKkNh
Y2hlOjptX0xSVUxpc3RzID0gMDsKLQotdm9pZCBDYWNoZTo6aW5pdCgpCi17Ci0gICAgaWYgKCAh
Y2FjaGUgKQotICAgICAgICBjYWNoZSA9IG5ldyBRRGljdDxDYWNoZWRPYmplY3Q+KDQwMSwgdHJ1
ZSk7Ci0KLSAgICBpZiAoICFkb2Nsb2FkZXIgKQotICAgICAgICBkb2Nsb2FkZXIgPSBuZXcgUVB0
ckxpc3Q8RG9jTG9hZGVyPjsKLQotICAgIGlmICggIW51bGxQaXhtYXAgKQotICAgICAgICBudWxs
UGl4bWFwID0gbmV3IFFQaXhtYXA7Ci0KLSAgICBpZiAoICFicm9rZW5QaXhtYXAgKQotICAgICAg
ICBicm9rZW5QaXhtYXAgPSBLV1FMb2FkUGl4bWFwKCJtaXNzaW5nX2ltYWdlIik7Ci0KLSAgICBp
ZiAoICFtX2xvYWRlciApCi0gICAgICAgIG1fbG9hZGVyID0gbmV3IExvYWRlcigpOwotfQotCi12
b2lkIENhY2hlOjpjbGVhcigpCi17Ci0gICAgaWYgKCFjYWNoZSkKLSAgICAgICAgcmV0dXJuOwot
Ci0gICAgY2FjaGUtPnNldEF1dG9EZWxldGUoIHRydWUgKTsKLSAgICBkZWxldGUgY2FjaGU7IGNh
Y2hlID0gMDsKLSAgICBkZWxldGUgbnVsbFBpeG1hcDsgbnVsbFBpeG1hcCA9IDA7Ci0gICAgZGVs
ZXRlIGJyb2tlblBpeG1hcDsgYnJva2VuUGl4bWFwID0gMDsKLSAgICBkZWxldGUgbV9sb2FkZXI7
ICAgbV9sb2FkZXIgPSAwOwotICAgIGRlbGV0ZSBkb2Nsb2FkZXI7IGRvY2xvYWRlciA9IDA7Ci19
Ci0KLUNhY2hlZEltYWdlICpDYWNoZTo6cmVxdWVzdEltYWdlKCBEb2NMb2FkZXIqIGRsLCBjb25z
dCBET01TdHJpbmcgJiB1cmwsIGJvb2wgcmVsb2FkLCB0aW1lX3QgX2V4cGlyZURhdGUgKQotewot
ICAgIC8vIHRoaXMgYnJpbmdzIHRoZSBfdXJsIHRvIGEgc3RhbmRhcmQgZm9ybS4uLgotICAgIEtV
Ukwga3VybDsKLSAgICBpZiAoZGwpCi0gICAgICAgIGt1cmwgPSBkbC0+bV9kb2MtPmNvbXBsZXRl
VVJMKCB1cmwucXN0cmluZygpICk7Ci0gICAgZWxzZQotICAgICAgICBrdXJsID0gdXJsLnFzdHJp
bmcoKTsKLSAgICByZXR1cm4gcmVxdWVzdEltYWdlKGRsLCBrdXJsLCByZWxvYWQsIF9leHBpcmVE
YXRlKTsKLX0KLQotQ2FjaGVkSW1hZ2UgKkNhY2hlOjpyZXF1ZXN0SW1hZ2UoIERvY0xvYWRlciog
ZGwsIGNvbnN0IEtVUkwgJiB1cmwsIGJvb2wgcmVsb2FkLCB0aW1lX3QgX2V4cGlyZURhdGUgKQot
ewotICAgIEtJTzo6Q2FjaGVDb250cm9sIGNhY2hlUG9saWN5OwotICAgIGlmIChkbCkKLSAgICAg
ICAgY2FjaGVQb2xpY3kgPSBkbC0+Y2FjaGVQb2xpY3koKTsKLSAgICBlbHNlCi0gICAgICAgIGNh
Y2hlUG9saWN5ID0gS0lPOjpDQ19WZXJpZnk7Ci0KLSAgICAvLyBDaGVja2luZyBpZiB0aGUgVVJM
IGlzIG1hbGZvcm1lZCBpcyBsb3RzIG9mIGV4dHJhIHdvcmsgZm9yIGxpdHRsZSBiZW5lZml0Lgot
Ci0gICAgaWYgKCFkbC0+ZG9jKCktPnNob3VsZENyZWF0ZVJlbmRlcmVycygpKXsKLSAgICAgICAg
cmV0dXJuIDA7Ci0gICAgfQotCi0gICAgQ2FjaGVkT2JqZWN0ICpvID0gMDsKLSAgICBpZiAoIXJl
bG9hZCkKLSAgICAgICAgbyA9IGNhY2hlLT5maW5kKHVybC51cmwoKSk7Ci0gICAgaWYoIW8pCi0g
ICAgewotI2lmZGVmIENBQ0hFX0RFQlVHCi0gICAgICAgIGtkRGVidWcoIDYwNjAgKSA8PCAiQ2Fj
aGU6IG5ldzogIiA8PCB1cmwudXJsKCkgPDwgZW5kbDsKLSNlbmRpZgotICAgICAgICBDYWNoZWRJ
bWFnZSAqaW0gPSBuZXcgQ2FjaGVkSW1hZ2UoZGwsIHVybC51cmwoKSwgY2FjaGVQb2xpY3ksIF9l
eHBpcmVEYXRlKTsKLSAgICAgICAgaWYgKCBkbCAmJiBkbC0+YXV0b2xvYWRJbWFnZXMoKSApIENh
Y2hlOjpsb2FkZXIoKS0+bG9hZChkbCwgaW0sIHRydWUpOwotICAgICAgICBpZiAoY2FjaGVEaXNh
YmxlZCkKLSAgICAgICAgICAgIGltLT5zZXRGcmVlKHRydWUpOwotICAgICAgICBlbHNlIHsKLSAg
ICAgICAgY2FjaGUtPmluc2VydCggdXJsLnVybCgpLCBpbSApOwotICAgICAgICBtb3ZlVG9IZWFk
T2ZMUlVMaXN0KGltKTsKLSAgICAgICAgfQotICAgICAgICBvID0gaW07Ci0gICAgfQotCi0gICAg
Ci0gICAgaWYoby0+dHlwZSgpICE9IENhY2hlZE9iamVjdDo6SW1hZ2UpCi0gICAgewotI2lmZGVm
IENBQ0hFX0RFQlVHCi0gICAgICAgIGtkRGVidWcoIDYwNjAgKSA8PCAiQ2FjaGU6OkludGVybmFs
IEVycm9yIGluIHJlcXVlc3RJbWFnZSB1cmw9IiA8PCBrdXJsLnVybCgpIDw8ICIhIiA8PCBlbmRs
OwotI2VuZGlmCi0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotI2lmZGVmIENBQ0hFX0RFQlVH
Ci0gICAgaWYoIG8tPnN0YXR1cygpID09IENhY2hlZE9iamVjdDo6UGVuZGluZyApCi0gICAgICAg
IGtkRGVidWcoIDYwNjAgKSA8PCAiQ2FjaGU6IGxvYWRpbmcgaW4gcHJvZ3Jlc3M6ICIgPDwga3Vy
bC51cmwoKSA8PCBlbmRsOwotICAgIGVsc2UKLSAgICAgICAga2REZWJ1ZyggNjA2MCApIDw8ICJD
YWNoZTogdXNpbmcgY2FjaGVkOiAiIDw8IGt1cmwudXJsKCkgPDwgIiwgc3RhdHVzICIgPDwgby0+
c3RhdHVzKCkgPDwgZW5kbDsKLSNlbmRpZgotCi0gICAgbW92ZVRvSGVhZE9mTFJVTGlzdChvKTsK
LSAgICBpZiAoIGRsICkgewotICAgICAgICBkbC0+bV9kb2NPYmplY3RzLnJlbW92ZSggbyApOwot
ICAgICAgICBpZiAoIWNhY2hlRGlzYWJsZWQpCi0gICAgICAgIGRsLT5tX2RvY09iamVjdHMuYXBw
ZW5kKCBvICk7Ci0gICAgfQotICAgIHJldHVybiBzdGF0aWNfY2FzdDxDYWNoZWRJbWFnZSAqPihv
KTsKLX0KLQotQ2FjaGVkQ1NTU3R5bGVTaGVldCAqQ2FjaGU6OnJlcXVlc3RTdHlsZVNoZWV0KCBE
b2NMb2FkZXIqIGRsLCBjb25zdCBET01TdHJpbmcgJiB1cmwsIGJvb2wgcmVsb2FkLCB0aW1lX3Qg
X2V4cGlyZURhdGUsIGNvbnN0IFFTdHJpbmcmIGNoYXJzZXQpCi17Ci0gICAgLy8gdGhpcyBicmlu
Z3MgdGhlIF91cmwgdG8gYSBzdGFuZGFyZCBmb3JtLi4uCi0gICAgS1VSTCBrdXJsOwotICAgIEtJ
Tzo6Q2FjaGVDb250cm9sIGNhY2hlUG9saWN5OwotICAgIGlmICggZGwgKQotICAgIHsKLSAgICAg
ICAga3VybCA9IGRsLT5tX2RvYy0+Y29tcGxldGVVUkwoIHVybC5xc3RyaW5nKCkgKTsKLSAgICAg
ICAgY2FjaGVQb2xpY3kgPSBkbC0+Y2FjaGVQb2xpY3koKTsKLSAgICB9Ci0gICAgZWxzZQotICAg
IHsKLSAgICAgICAga3VybCA9IHVybC5xc3RyaW5nKCk7Ci0gICAgICAgIGNhY2hlUG9saWN5ID0g
S0lPOjpDQ19WZXJpZnk7Ci0gICAgfQotCi0gICAgLy8gQ2hlY2tpbmcgaWYgdGhlIFVSTCBpcyBt
YWxmb3JtZWQgaXMgbG90cyBvZiBleHRyYSB3b3JrIGZvciBsaXR0bGUgYmVuZWZpdC4KLQotICAg
IENhY2hlZE9iamVjdCAqbyA9IGNhY2hlLT5maW5kKGt1cmwudXJsKCkpOwotICAgIGlmKCFvKQot
ICAgIHsKLSNpZmRlZiBDQUNIRV9ERUJVRwotICAgICAgICBrZERlYnVnKCA2MDYwICkgPDwgIkNh
Y2hlOiBuZXc6ICIgPDwga3VybC51cmwoKSA8PCBlbmRsOwotI2VuZGlmCi0gICAgICAgIENhY2hl
ZENTU1N0eWxlU2hlZXQgKnNoZWV0ID0gbmV3IENhY2hlZENTU1N0eWxlU2hlZXQoZGwsIGt1cmwu
dXJsKCksIGNhY2hlUG9saWN5LCBfZXhwaXJlRGF0ZSwgY2hhcnNldCk7Ci0gICAgICAgIGlmIChj
YWNoZURpc2FibGVkKQotICAgICAgICAgICAgc2hlZXQtPnNldEZyZWUodHJ1ZSk7Ci0gICAgICAg
IGVsc2UgewotICAgICAgICBjYWNoZS0+aW5zZXJ0KCBrdXJsLnVybCgpLCBzaGVldCApOwotICAg
ICAgICBtb3ZlVG9IZWFkT2ZMUlVMaXN0KHNoZWV0KTsKLSAgICAgICAgfQotICAgICAgICBvID0g
c2hlZXQ7Ci0gICAgfQotCi0gICAgCi0gICAgaWYoby0+dHlwZSgpICE9IENhY2hlZE9iamVjdDo6
Q1NTU3R5bGVTaGVldCkKLSAgICB7Ci0jaWZkZWYgQ0FDSEVfREVCVUcKLSAgICAgICAga2REZWJ1
ZyggNjA2MCApIDw8ICJDYWNoZTo6SW50ZXJuYWwgRXJyb3IgaW4gcmVxdWVzdFN0eWxlU2hlZXQg
dXJsPSIgPDwga3VybC51cmwoKSA8PCAiISIgPDwgZW5kbDsKLSNlbmRpZgotICAgICAgICByZXR1
cm4gMDsKLSAgICB9Ci0KLSNpZmRlZiBDQUNIRV9ERUJVRwotICAgIGlmKCBvLT5zdGF0dXMoKSA9
PSBDYWNoZWRPYmplY3Q6OlBlbmRpbmcgKQotICAgICAgICBrZERlYnVnKCA2MDYwICkgPDwgIkNh
Y2hlOiBsb2FkaW5nIGluIHByb2dyZXNzOiAiIDw8IGt1cmwudXJsKCkgPDwgZW5kbDsKLSAgICBl
bHNlCi0gICAgICAgIGtkRGVidWcoIDYwNjAgKSA8PCAiQ2FjaGU6IHVzaW5nIGNhY2hlZDogIiA8
PCBrdXJsLnVybCgpIDw8IGVuZGw7Ci0jZW5kaWYKLQotICAgIG1vdmVUb0hlYWRPZkxSVUxpc3Qo
byk7Ci0gICAgaWYgKCBkbCApIHsKLSAgICAgICAgZGwtPm1fZG9jT2JqZWN0cy5yZW1vdmUoIG8g
KTsKLSAgICAgICAgaWYgKCFjYWNoZURpc2FibGVkKQotICAgICAgICBkbC0+bV9kb2NPYmplY3Rz
LmFwcGVuZCggbyApOwotICAgIH0KLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q2FjaGVkQ1NTU3R5
bGVTaGVldCAqPihvKTsKLX0KLQotdm9pZCBDYWNoZTo6cHJlbG9hZFN0eWxlU2hlZXQoIGNvbnN0
IFFTdHJpbmcgJnVybCwgY29uc3QgUVN0cmluZyAmc3R5bGVzaGVldF9kYXRhKQotewotICAgIENh
Y2hlZE9iamVjdCAqbyA9IGNhY2hlLT5maW5kKHVybCk7Ci0gICAgaWYobykKLSAgICAgICAgcmVt
b3ZlQ2FjaGVFbnRyeShvKTsKLQotICAgIENhY2hlZENTU1N0eWxlU2hlZXQgKnN0eWxlc2hlZXQg
PSBuZXcgQ2FjaGVkQ1NTU3R5bGVTaGVldCh1cmwsIHN0eWxlc2hlZXRfZGF0YSk7Ci0gICAgY2Fj
aGUtPmluc2VydCggdXJsLCBzdHlsZXNoZWV0ICk7Ci19Ci0KLUNhY2hlZFNjcmlwdCAqQ2FjaGU6
OnJlcXVlc3RTY3JpcHQoIERvY0xvYWRlciogZGwsIGNvbnN0IERPTTo6RE9NU3RyaW5nICZ1cmws
IGJvb2wgcmVsb2FkLCB0aW1lX3QgX2V4cGlyZURhdGUsIGNvbnN0IFFTdHJpbmcmIGNoYXJzZXQp
Ci17Ci0gICAgLy8gdGhpcyBicmluZ3MgdGhlIF91cmwgdG8gYSBzdGFuZGFyZCBmb3JtLi4uCi0g
ICAgS1VSTCBrdXJsOwotICAgIEtJTzo6Q2FjaGVDb250cm9sIGNhY2hlUG9saWN5OwotICAgIGlm
ICggZGwgKQotICAgIHsKLSAgICAgICAga3VybCA9IGRsLT5tX2RvYy0+Y29tcGxldGVVUkwoIHVy
bC5xc3RyaW5nKCkgKTsKLSAgICAgICAgY2FjaGVQb2xpY3kgPSBkbC0+Y2FjaGVQb2xpY3koKTsK
LSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAga3VybCA9IHVybC5xc3RyaW5nKCk7Ci0g
ICAgICAgIGNhY2hlUG9saWN5ID0gS0lPOjpDQ19WZXJpZnk7Ci0gICAgfQotCi0gICAgLy8gQ2hl
Y2tpbmcgaWYgdGhlIFVSTCBpcyBtYWxmb3JtZWQgaXMgbG90cyBvZiBleHRyYSB3b3JrIGZvciBs
aXR0bGUgYmVuZWZpdC4KLQotICAgIENhY2hlZE9iamVjdCAqbyA9IGNhY2hlLT5maW5kKGt1cmwu
dXJsKCkpOwotICAgIGlmKCFvKQotICAgIHsKLSNpZmRlZiBDQUNIRV9ERUJVRwotICAgICAgICBr
ZERlYnVnKCA2MDYwICkgPDwgIkNhY2hlOiBuZXc6ICIgPDwga3VybC51cmwoKSA8PCBlbmRsOwot
I2VuZGlmCi0gICAgICAgIENhY2hlZFNjcmlwdCAqc2NyaXB0ID0gbmV3IENhY2hlZFNjcmlwdChk
bCwga3VybC51cmwoKSwgY2FjaGVQb2xpY3ksIF9leHBpcmVEYXRlLCBjaGFyc2V0KTsKLSAgICAg
ICAgaWYgKGNhY2hlRGlzYWJsZWQpCi0gICAgICAgICAgICBzY3JpcHQtPnNldEZyZWUodHJ1ZSk7
Ci0gICAgICAgIGVsc2UgewotICAgICAgICBjYWNoZS0+aW5zZXJ0KCBrdXJsLnVybCgpLCBzY3Jp
cHQgKTsKLSAgICAgICAgbW92ZVRvSGVhZE9mTFJVTGlzdChzY3JpcHQpOwotICAgICAgICB9Ci0g
ICAgICAgIG8gPSBzY3JpcHQ7Ci0gICAgfQotCi0gICAgCi0gICAgaWYoIShvLT50eXBlKCkgPT0g
Q2FjaGVkT2JqZWN0OjpTY3JpcHQpKQotICAgIHsKLSNpZmRlZiBDQUNIRV9ERUJVRwotICAgICAg
ICBrZERlYnVnKCA2MDYwICkgPDwgIkNhY2hlOjpJbnRlcm5hbCBFcnJvciBpbiByZXF1ZXN0U2Ny
aXB0IHVybD0iIDw8IGt1cmwudXJsKCkgPDwgIiEiIDw8IGVuZGw7Ci0jZW5kaWYKLSAgICAgICAg
cmV0dXJuIDA7Ci0gICAgfQotICAgIAotICAgIAotI2lmZGVmIENBQ0hFX0RFQlVHCi0gICAgaWYo
IG8tPnN0YXR1cygpID09IENhY2hlZE9iamVjdDo6UGVuZGluZyApCi0gICAgICAgIGtkRGVidWco
IDYwNjAgKSA8PCAiQ2FjaGU6IGxvYWRpbmcgaW4gcHJvZ3Jlc3M6ICIgPDwga3VybC51cmwoKSA8
PCBlbmRsOwotICAgIGVsc2UKLSAgICAgICAga2REZWJ1ZyggNjA2MCApIDw8ICJDYWNoZTogdXNp
bmcgY2FjaGVkOiAiIDw8IGt1cmwudXJsKCkgPDwgZW5kbDsKLSNlbmRpZgotCi0gICAgbW92ZVRv
SGVhZE9mTFJVTGlzdChvKTsKLSAgICBpZiAoIGRsICkgewotICAgICAgICBkbC0+bV9kb2NPYmpl
Y3RzLnJlbW92ZSggbyApOwotICAgICAgICBpZiAoIWNhY2hlRGlzYWJsZWQpCi0gICAgICAgIGRs
LT5tX2RvY09iamVjdHMuYXBwZW5kKCBvICk7Ci0gICAgfQotICAgIHJldHVybiBzdGF0aWNfY2Fz
dDxDYWNoZWRTY3JpcHQgKj4obyk7Ci19Ci0KLXZvaWQgQ2FjaGU6OnByZWxvYWRTY3JpcHQoIGNv
bnN0IFFTdHJpbmcgJnVybCwgY29uc3QgUVN0cmluZyAmc2NyaXB0X2RhdGEpCi17Ci0gICAgQ2Fj
aGVkT2JqZWN0ICpvID0gY2FjaGUtPmZpbmQodXJsKTsKLSAgICBpZihvKQotICAgICAgICByZW1v
dmVDYWNoZUVudHJ5KG8pOwotCi0gICAgQ2FjaGVkU2NyaXB0ICpzY3JpcHQgPSBuZXcgQ2FjaGVk
U2NyaXB0KHVybCwgc2NyaXB0X2RhdGEpOwotICAgIGNhY2hlLT5pbnNlcnQoIHVybCwgc2NyaXB0
ICk7Ci19Ci0KLSNpZmRlZiBLSFRNTF9YU0xUCi1DYWNoZWRYU0xTdHlsZVNoZWV0KiBDYWNoZTo6
cmVxdWVzdFhTTFN0eWxlU2hlZXQoRG9jTG9hZGVyKiBkbCwgY29uc3QgRE9NU3RyaW5nICYgdXJs
LCBib29sIHJlbG9hZCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgdGltZV90IF9leHBpcmVEYXRlKQotewotICAgIC8vIHRoaXMgYnJpbmdzIHRoZSBf
dXJsIHRvIGEgc3RhbmRhcmQgZm9ybS4uLgotICAgIEtVUkwga3VybDsKLSAgICBLSU86OkNhY2hl
Q29udHJvbCBjYWNoZVBvbGljeTsKLSAgICBpZiAoZGwpIHsKLSAgICAgICAga3VybCA9IGRsLT5t
X2RvYy0+Y29tcGxldGVVUkwodXJsLnFzdHJpbmcoKSk7Ci0gICAgICAgIGNhY2hlUG9saWN5ID0g
ZGwtPmNhY2hlUG9saWN5KCk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBrdXJsID0gdXJs
LnFzdHJpbmcoKTsKLSAgICAgICAgY2FjaGVQb2xpY3kgPSBLSU86OkNDX1ZlcmlmeTsKLSAgICB9
Ci0gICAgCi0gICAgLy8gQ2hlY2tpbmcgaWYgdGhlIFVSTCBpcyBtYWxmb3JtZWQgaXMgbG90cyBv
ZiBleHRyYSB3b3JrIGZvciBsaXR0bGUgYmVuZWZpdC4KLSAgICAKLSAgICBDYWNoZWRPYmplY3Qg
Km8gPSBjYWNoZS0+ZmluZChrdXJsLnVybCgpKTsKLSAgICBpZiAoIW8pIHsKLSNpZmRlZiBDQUNI
RV9ERUJVRwotICAgICAgICBrZERlYnVnKCA2MDYwICkgPDwgIkNhY2hlOiBuZXc6ICIgPDwga3Vy
bC51cmwoKSA8PCBlbmRsOwotI2VuZGlmCi0gICAgICAgIENhY2hlZFhTTFN0eWxlU2hlZXQqIGRv
YyA9IG5ldyBDYWNoZWRYU0xTdHlsZVNoZWV0KGRsLCBrdXJsLnVybCgpLCBjYWNoZVBvbGljeSwg
X2V4cGlyZURhdGUpOwotICAgICAgICBpZiAoY2FjaGVEaXNhYmxlZCkKLSAgICAgICAgICAgIGRv
Yy0+c2V0RnJlZSh0cnVlKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBjYWNoZS0+aW5z
ZXJ0KGt1cmwudXJsKCksIGRvYyk7Ci0gICAgICAgICAgICBtb3ZlVG9IZWFkT2ZMUlVMaXN0KGRv
Yyk7Ci0gICAgICAgIH0KLSAgICAgICAgbyA9IGRvYzsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAg
aWYgKG8tPnR5cGUoKSAhPSBDYWNoZWRPYmplY3Q6OlhTTFN0eWxlU2hlZXQpIHsKLSNpZmRlZiBD
QUNIRV9ERUJVRwotICAgICAgICBrZERlYnVnKCA2MDYwICkgPDwgIkNhY2hlOjpJbnRlcm5hbCBF
cnJvciBpbiByZXF1ZXN0WFNMU3R5bGVTaGVldCB1cmw9IiA8PCBrdXJsLnVybCgpIDw8ICIhIiA8
PCBlbmRsOwotI2VuZGlmCi0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICAKLSNpZmRlZiBD
QUNIRV9ERUJVRwotICAgIGlmIChvLT5zdGF0dXMoKSA9PSBDYWNoZWRPYmplY3Q6OlBlbmRpbmcp
Ci0gICAgICAgIGtkRGVidWcoIDYwNjAgKSA8PCAiQ2FjaGU6IGxvYWRpbmcgaW4gcHJvZ3Jlc3M6
ICIgPDwga3VybC51cmwoKSA8PCBlbmRsOwotICAgIGVsc2UKLSAgICAgICAga2REZWJ1ZyggNjA2
MCApIDw8ICJDYWNoZTogdXNpbmcgY2FjaGVkOiAiIDw8IGt1cmwudXJsKCkgPDwgZW5kbDsKLSNl
bmRpZgotICAgIAotICAgIG1vdmVUb0hlYWRPZkxSVUxpc3Qobyk7Ci0gICAgaWYgKGRsKSB7Ci0g
ICAgICAgIGRsLT5tX2RvY09iamVjdHMucmVtb3ZlKCBvICk7Ci0gICAgICAgIGlmICghY2FjaGVE
aXNhYmxlZCkKLSAgICAgICAgICAgIGRsLT5tX2RvY09iamVjdHMuYXBwZW5kKCBvICk7Ci0gICAg
fQotICAgIHJldHVybiBzdGF0aWNfY2FzdDxDYWNoZWRYU0xTdHlsZVNoZWV0Kj4obyk7Ci19Ci0j
ZW5kaWYKLQotI2lmbmRlZiBLSFRNTF9OT19YQkwKLUNhY2hlZFhCTERvY3VtZW50KiBDYWNoZTo6
cmVxdWVzdFhCTERvY3VtZW50KERvY0xvYWRlciogZGwsIGNvbnN0IERPTVN0cmluZyAmIHVybCwg
Ym9vbCByZWxvYWQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgdGltZV90IF9leHBpcmVEYXRlKQotewotICAgIC8vIHRoaXMgYnJpbmdzIHRoZSBfdXJsIHRv
IGEgc3RhbmRhcmQgZm9ybS4uLgotICAgIEtVUkwga3VybDsKLSAgICBLSU86OkNhY2hlQ29udHJv
bCBjYWNoZVBvbGljeTsKLSAgICBpZiAoZGwpIHsKLSAgICAgICAga3VybCA9IGRsLT5tX2RvYy0+
Y29tcGxldGVVUkwodXJsLnFzdHJpbmcoKSk7Ci0gICAgICAgIGNhY2hlUG9saWN5ID0gZGwtPmNh
Y2hlUG9saWN5KCk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBrdXJsID0gdXJsLnFzdHJp
bmcoKTsKLSAgICAgICAgY2FjaGVQb2xpY3kgPSBLSU86OkNDX1ZlcmlmeTsKLSAgICB9Ci0gICAg
Ci0gICAgLy8gQ2hlY2tpbmcgaWYgdGhlIFVSTCBpcyBtYWxmb3JtZWQgaXMgbG90cyBvZiBleHRy
YSB3b3JrIGZvciBsaXR0bGUgYmVuZWZpdC4KLSAgICAKLSAgICBDYWNoZWRPYmplY3QgKm8gPSBj
YWNoZS0+ZmluZChrdXJsLnVybCgpKTsKLSAgICBpZighbykKLSAgICB7Ci0jaWZkZWYgQ0FDSEVf
REVCVUcKLSAgICAgICAga2REZWJ1ZyggNjA2MCApIDw8ICJDYWNoZTogbmV3OiAiIDw8IGt1cmwu
dXJsKCkgPDwgZW5kbDsKLSNlbmRpZgotICAgICAgICBDYWNoZWRYQkxEb2N1bWVudCogZG9jID0g
bmV3IENhY2hlZFhCTERvY3VtZW50KGRsLCBrdXJsLnVybCgpLCBjYWNoZVBvbGljeSwgX2V4cGly
ZURhdGUpOwotICAgICAgICBpZiAoY2FjaGVEaXNhYmxlZCkKLSAgICAgICAgICAgIGRvYy0+c2V0
RnJlZSh0cnVlKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBjYWNoZS0+aW5zZXJ0KGt1
cmwudXJsKCksIGRvYyk7Ci0gICAgICAgICAgICBtb3ZlVG9IZWFkT2ZMUlVMaXN0KGRvYyk7Ci0g
ICAgICAgIH0KLSAgICAgICAgbyA9IGRvYzsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgaWYoby0+
dHlwZSgpICE9IENhY2hlZE9iamVjdDo6WEJMKQotICAgIHsKLSNpZmRlZiBDQUNIRV9ERUJVRwot
ICAgICAgICBrZERlYnVnKCA2MDYwICkgPDwgIkNhY2hlOjpJbnRlcm5hbCBFcnJvciBpbiByZXF1
ZXN0WEJMRG9jdW1lbnQgdXJsPSIgPDwga3VybC51cmwoKSA8PCAiISIgPDwgZW5kbDsKLSNlbmRp
ZgotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgCi0jaWZkZWYgQ0FDSEVfREVCVUcKLSAg
ICBpZiggby0+c3RhdHVzKCkgPT0gQ2FjaGVkT2JqZWN0OjpQZW5kaW5nICkKLSAgICAgICAga2RE
ZWJ1ZyggNjA2MCApIDw8ICJDYWNoZTogbG9hZGluZyBpbiBwcm9ncmVzczogIiA8PCBrdXJsLnVy
bCgpIDw8IGVuZGw7Ci0gICAgZWxzZQotICAgICAgICBrZERlYnVnKCA2MDYwICkgPDwgIkNhY2hl
OiB1c2luZyBjYWNoZWQ6ICIgPDwga3VybC51cmwoKSA8PCBlbmRsOwotI2VuZGlmCi0gICAgCi0g
ICAgbW92ZVRvSGVhZE9mTFJVTGlzdChvKTsKLSAgICBpZiAoIGRsICkgewotICAgICAgICBkbC0+
bV9kb2NPYmplY3RzLnJlbW92ZSggbyApOwotICAgICAgICBpZiAoIWNhY2hlRGlzYWJsZWQpCi0g
ICAgICAgICAgICBkbC0+bV9kb2NPYmplY3RzLmFwcGVuZCggbyApOwotICAgIH0KLSAgICByZXR1
cm4gc3RhdGljX2Nhc3Q8Q2FjaGVkWEJMRG9jdW1lbnQqPihvKTsKLX0KLSNlbmRpZgotCi12b2lk
IENhY2hlOjpmbHVzaChib29sIGZvcmNlKQotewotICAgIGlmIChmb3JjZSkKLSAgICAgICBmbHVz
aENvdW50ID0gMDsKLSAgICAvLyBEb24ndCBmbHVzaCBmb3IgZXZlcnkgaW1hZ2UuCi0gICAgaWYg
KG1fY291bnRPZkxSVUFuZFVuY2FjaGVhYmxlTGlzdHMgPCBmbHVzaENvdW50KQotICAgICAgIHJl
dHVybjsKLQotICAgIGluaXQoKTsKLQotICAgIHdoaWxlIChtX2hlYWRPZlVuY2FjaGVhYmxlTGlz
dCkKLSAgICAgICAgcmVtb3ZlQ2FjaGVFbnRyeShtX2hlYWRPZlVuY2FjaGVhYmxlTGlzdCk7Ci0K
LSAgICBmb3IgKGludCBpID0gTUFYX0xSVV9MSVNUUy0xOyBpPj0wOyBpLS0pIHsKLSAgICAgICAg
aWYgKG1fdG90YWxTaXplT2ZMUlVMaXN0cyA8PSBtYXhTaXplKQotICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgICAgICAKLSAgICAgICAgd2hpbGUgKG1fdG90YWxTaXplT2ZMUlVMaXN0cyA+IG1h
eFNpemUgJiYgbV9MUlVMaXN0c1tpXS5tX3RhaWwpCi0gICAgICAgICAgICByZW1vdmVDYWNoZUVu
dHJ5KG1fTFJVTGlzdHNbaV0ubV90YWlsKTsKLSAgICB9Ci0KLSAgICBmbHVzaENvdW50ID0gbV9j
b3VudE9mTFJVQW5kVW5jYWNoZWFibGVMaXN0cysxMDsgLy8gRmx1c2ggYWdhaW4gd2hlbiB0aGUg
Y2FjaGUgaGFzIGdyb3duLgotfQotCi0KLXZvaWQgQ2FjaGU6OnNldFNpemUoIGludCBieXRlcyAp
Ci17Ci0gICAgbWF4U2l6ZSA9IGJ5dGVzOwotICAgIG1heENhY2hlYWJsZSA9IGtNYXgobWF4U2l6
ZSAvIDEyOCwgTUFYQ0FDSEVBQkxFKTsKLQotICAgIC8vIG1heSBiZSB3ZSBuZWVkIHRvIGNsZWFy
IHBhcnRzIG9mIHRoZSBjYWNoZQotICAgIGZsdXNoQ291bnQgPSAwOwotICAgIGZsdXNoKHRydWUp
OwotfQotCi12b2lkIENhY2hlOjpyZW1vdmVDYWNoZUVudHJ5KCBDYWNoZWRPYmplY3QgKm9iamVj
dCApCi17Ci0gIFFTdHJpbmcga2V5ID0gb2JqZWN0LT51cmwoKS5xc3RyaW5nKCk7Ci0KLSAgLy8g
dGhpcyBpbmRpY2F0ZXMgdGhlIGRlcmVmKCkgbWV0aG9kIG9mIENhY2hlZE9iamVjdCB0byBkZWxl
dGUgaXRzZWxmIHdoZW4gdGhlIHJlZmVyZW5jZSBjb3VudGVyCi0gIC8vIGRyb3BzIGRvd24gdG8g
emVybwotICBvYmplY3QtPnNldEZyZWUoIHRydWUgKTsKLQotICBjYWNoZS0+cmVtb3ZlKCBrZXkg
KTsKLSAgcmVtb3ZlRnJvbUxSVUxpc3Qob2JqZWN0KTsKLQotICBjb25zdCBEb2NMb2FkZXIqIGRs
OwotICBmb3IgKCBkbD1kb2Nsb2FkZXItPmZpcnN0KCk7IGRsOyBkbD1kb2Nsb2FkZXItPm5leHQo
KSApCi0gICAgICBkbC0+cmVtb3ZlQ2FjaGVkT2JqZWN0KCBvYmplY3QgKTsKLQotICBpZiAoIG9i
amVjdC0+Y2FuRGVsZXRlKCkgKQotICAgICBkZWxldGUgb2JqZWN0OwotfQotCi0jZGVmaW5lIEZB
U1RfTE9HMihfbG9nMixfbikgICBcCi0gICAgICB1bnNpZ25lZCBpbnQgal8gPSAodW5zaWduZWQg
aW50KShfbik7ICAgXAotICAgICAgKF9sb2cyKSA9IDA7ICAgICAgICAgICAgICAgICAgICBcCi0g
ICAgICBpZiAoKGpfKSAmICgoal8pLTEpKSAgICAgICAgICAgIFwKLSAgICAgIChfbG9nMikgKz0g
MTsgICAgICAgICAgICAgICBcCi0gICAgICBpZiAoKGpfKSA+PiAxNikgICAgICAgICAgICAgICAg
IFwKLSAgICAgIChfbG9nMikgKz0gMTYsIChqXykgPj49IDE2OyBcCi0gICAgICBpZiAoKGpfKSA+
PiA4KSAgICAgICAgICAgICAgICAgIFwKLSAgICAgIChfbG9nMikgKz0gOCwgKGpfKSA+Pj0gODsg
ICBcCi0gICAgICBpZiAoKGpfKSA+PiA0KSAgICAgICAgICAgICAgICAgIFwKLSAgICAgIChfbG9n
MikgKz0gNCwgKGpfKSA+Pj0gNDsgICBcCi0gICAgICBpZiAoKGpfKSA+PiAyKSAgICAgICAgICAg
ICAgICAgIFwKLSAgICAgIChfbG9nMikgKz0gMiwgKGpfKSA+Pj0gMjsgICBcCi0gICAgICBpZiAo
KGpfKSA+PiAxKSAgICAgICAgICAgICAgICAgIFwKLSAgICAgIChfbG9nMikgKz0gMTsKLQotaW50
IEZhc3RMb2cyKHVuc2lnbmVkIGludCBpKSB7Ci0gICAgaW50IGxvZzI7Ci0gICAgRkFTVF9MT0cy
KGxvZzIsaSk7Ci0gICAgcmV0dXJuIGxvZzI7Ci19Ci0KLUxSVUxpc3QqIENhY2hlOjpnZXRMUlVM
aXN0Rm9yKENhY2hlZE9iamVjdCogbykKLXsKLSAgICBpbnQgYWNjZXNzQ291bnQgPSBvLT5hY2Nl
c3NDb3VudCgpOwotICAgIGludCBxdWV1ZUluZGV4OwotICAgIGlmIChhY2Nlc3NDb3VudCA9PSAw
KSB7Ci0gICAgICAgIHF1ZXVlSW5kZXggPSAwOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGludCBz
aXplTG9nID0gRmFzdExvZzIoby0+c2l6ZSgpKTsKLSAgICAgICAgcXVldWVJbmRleCA9IHNpemVM
b2cvby0+YWNjZXNzQ291bnQoKSAtIDE7Ci0gICAgICAgIGlmIChxdWV1ZUluZGV4IDwgMCkKLSAg
ICAgICAgICAgIHF1ZXVlSW5kZXggPSAwOwotICAgICAgICBpZiAocXVldWVJbmRleCA+PSBNQVhf
TFJVX0xJU1RTKQotICAgICAgICAgICAgcXVldWVJbmRleCA9IE1BWF9MUlVfTElTVFMtMTsKLSAg
ICB9Ci0gICAgaWYgKG1fTFJVTGlzdHMgPT0gMCkgewotICAgICAgICBtX0xSVUxpc3RzID0gbmV3
IExSVUxpc3QgW01BWF9MUlVfTElTVFNdOwotICAgIH0KLSAgICByZXR1cm4gJm1fTFJVTGlzdHNb
cXVldWVJbmRleF07Ci19Ci0KLXZvaWQgQ2FjaGU6OnJlbW92ZUZyb21MUlVMaXN0KENhY2hlZE9i
amVjdCAqb2JqZWN0KQotewotICAgIENhY2hlZE9iamVjdCAqbmV4dCA9IG9iamVjdC0+bV9uZXh0
SW5MUlVMaXN0OwotICAgIENhY2hlZE9iamVjdCAqcHJldiA9IG9iamVjdC0+bV9wcmV2SW5MUlVM
aXN0OwotICAgIGJvb2wgdW5jYWNoZWFibGUgPSBvYmplY3QtPnN0YXR1cygpID09IENhY2hlZE9i
amVjdDo6VW5jYWNoZWFibGU7Ci0gICAgCi0gICAgTFJVTGlzdCogbGlzdCA9IHVuY2FjaGVhYmxl
ID8gMCA6IGdldExSVUxpc3RGb3Iob2JqZWN0KTsKLSAgICBDYWNoZWRPYmplY3QgKiZoZWFkID0g
dW5jYWNoZWFibGUgPyBtX2hlYWRPZlVuY2FjaGVhYmxlTGlzdCA6IGxpc3QtPm1faGVhZDsKLSAg
ICAKLSAgICBpZiAobmV4dCA9PSAwICYmIHByZXYgPT0gMCAmJiBoZWFkICE9IG9iamVjdCkgewot
ICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIAotICAgIG9iamVjdC0+bV9uZXh0SW5MUlVMaXN0
ID0gMDsKLSAgICBvYmplY3QtPm1fcHJldkluTFJVTGlzdCA9IDA7Ci0gICAgCi0gICAgaWYgKG5l
eHQpCi0gICAgICAgIG5leHQtPm1fcHJldkluTFJVTGlzdCA9IHByZXY7Ci0gICAgZWxzZSBpZiAo
IXVuY2FjaGVhYmxlICYmIGxpc3QtPm1fdGFpbCA9PSBvYmplY3QpCi0gICAgICAgIGxpc3QtPm1f
dGFpbCA9IHByZXY7Ci0KLSAgICBpZiAocHJldikKLSAgICAgICAgcHJldi0+bV9uZXh0SW5MUlVM
aXN0ID0gbmV4dDsKLSAgICBlbHNlIGlmIChoZWFkID09IG9iamVjdCkKLSAgICAgICAgaGVhZCA9
IG5leHQ7Ci0gICAgCi0gICAgLS1tX2NvdW50T2ZMUlVBbmRVbmNhY2hlYWJsZUxpc3RzOwotICAg
IAotICAgIGlmICghdW5jYWNoZWFibGUpCi0gICAgICAgIG1fdG90YWxTaXplT2ZMUlVMaXN0cyAt
PSBvYmplY3QtPnNpemUoKTsKLX0KLQotdm9pZCBDYWNoZTo6bW92ZVRvSGVhZE9mTFJVTGlzdChD
YWNoZWRPYmplY3QgKm9iamVjdCkKLXsKLSAgICBpbnNlcnRJbkxSVUxpc3Qob2JqZWN0KTsKLX0K
LQotdm9pZCBDYWNoZTo6aW5zZXJ0SW5MUlVMaXN0KENhY2hlZE9iamVjdCAqb2JqZWN0KQotewot
ICAgIHJlbW92ZUZyb21MUlVMaXN0KG9iamVjdCk7Ci0gICAgCi0gICAgaWYgKCFvYmplY3QtPmFs
bG93SW5MUlVMaXN0KCkpCi0gICAgICAgIHJldHVybjsKLSAgICAKLSAgICBMUlVMaXN0KiBsaXN0
ID0gZ2V0TFJVTGlzdEZvcihvYmplY3QpOwotICAgIAotICAgIGJvb2wgdW5jYWNoZWFibGUgPSBv
YmplY3QtPnN0YXR1cygpID09IENhY2hlZE9iamVjdDo6VW5jYWNoZWFibGU7Ci0gICAgQ2FjaGVk
T2JqZWN0IComaGVhZCA9IHVuY2FjaGVhYmxlID8gbV9oZWFkT2ZVbmNhY2hlYWJsZUxpc3QgOiBs
aXN0LT5tX2hlYWQ7Ci0KLSAgICBvYmplY3QtPm1fbmV4dEluTFJVTGlzdCA9IGhlYWQ7Ci0gICAg
aWYgKGhlYWQpCi0gICAgICAgIGhlYWQtPm1fcHJldkluTFJVTGlzdCA9IG9iamVjdDsKLSAgICBo
ZWFkID0gb2JqZWN0OwotICAgIAotICAgIGlmIChvYmplY3QtPm1fbmV4dEluTFJVTGlzdCA9PSAw
ICYmICF1bmNhY2hlYWJsZSkKLSAgICAgICAgbGlzdC0+bV90YWlsID0gb2JqZWN0OwotICAgIAot
ICAgICsrbV9jb3VudE9mTFJVQW5kVW5jYWNoZWFibGVMaXN0czsKLSAgICAKLSAgICBpZiAoIXVu
Y2FjaGVhYmxlKQotICAgICAgICBtX3RvdGFsU2l6ZU9mTFJVTGlzdHMgKz0gb2JqZWN0LT5zaXpl
KCk7Ci19Ci0KLWJvb2wgQ2FjaGU6OmFkanVzdFNpemUoQ2FjaGVkT2JqZWN0ICpvYmplY3QsIGlu
dCBkZWx0YSkKLXsKLSAgICBpZiAob2JqZWN0LT5zdGF0dXMoKSA9PSBDYWNoZWRPYmplY3Q6OlVu
Y2FjaGVhYmxlKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAob2JqZWN0LT5tX25l
eHRJbkxSVUxpc3QgPT0gMCAmJiBvYmplY3QtPm1fcHJldkluTFJVTGlzdCA9PSAwICYmCi0gICAg
ICAgIGdldExSVUxpc3RGb3Iob2JqZWN0KS0+bV9oZWFkICE9IG9iamVjdCkKLSAgICAgICAgcmV0
dXJuIGZhbHNlOwotICAgIAotICAgIG1fdG90YWxTaXplT2ZMUlVMaXN0cyArPSBkZWx0YTsKLSAg
ICByZXR1cm4gZGVsdGEgIT0gMDsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0KLQotQ2FjaGVkT2JqZWN0Q2xpZW50ICpDYWNoZWRPYmplY3RDbGllbnRXYWxr
ZXI6Om5leHQoKQotewotICAgIC8vIE9ubHkgYWR2YW5jZSBpZiB3ZSBhbHJlYWR5IHJldHVybmVk
IHRoaXMgaXRlbS4KLSAgICAvLyBUaGlzIGhhbmRsZXMgY2FzZXMgd2hlcmUgdGhlIGN1cnJlbnQg
aXRlbSBpcyByZW1vdmVkLCBhbmQgcHJldmVudHMgdXMgZnJvbSBza2lwcGluZyB0aGUgbmV4dCBp
dGVtLgotICAgIC8vIFRoZSBpdGVyYXRvciBhdXRvbWF0aWNhbGx5IGdldHMgYWR2YW5jZWQgdG8g
dGhlIG5leHQgaXRlbSwgYW5kIHdlIG1ha2Ugc3VyZSB3ZSByZXR1cm4gaXQuCi0gICAgaWYgKF9j
dXJyZW50ID09IF9pdGVyYXRvci5jdXJyZW50KCkpCi0gICAgICAgICsrX2l0ZXJhdG9yOwotICAg
IF9jdXJyZW50ID0gX2l0ZXJhdG9yLmN1cnJlbnQoKTsKLSAgICByZXR1cm4gX2N1cnJlbnQ7Ci19
Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUNhY2hlZE9i
amVjdENsaWVudDo6fkNhY2hlZE9iamVjdENsaWVudCgpIHsgfQotdm9pZCBDYWNoZWRPYmplY3RD
bGllbnQ6OnNldFBpeG1hcChjb25zdCBRUGl4bWFwICYsIGNvbnN0IFFSZWN0JiwgQ2FjaGVkSW1h
Z2UgKikge30KLXZvaWQgQ2FjaGVkT2JqZWN0Q2xpZW50OjpzZXRTdHlsZVNoZWV0KGNvbnN0IERP
TTo6RE9NU3RyaW5nICYvKnVybCovLCBjb25zdCBET006OkRPTVN0cmluZyAmLypzaGVldCovKSB7
fQotI2lmbmRlZiBLSFRNTF9OT19YQkwKLXZvaWQgQ2FjaGVkT2JqZWN0Q2xpZW50OjpzZXRYQkxE
b2N1bWVudChjb25zdCBET006OkRPTVN0cmluZyYgdXJsLCBYQkw6OlhCTERvY3VtZW50SW1wbCog
ZG9jKSB7fQotI2VuZGlmCi12b2lkIENhY2hlZE9iamVjdENsaWVudDo6bm90aWZ5RmluaXNoZWQo
Q2FjaGVkT2JqZWN0ICogLypmaW5pc2hlZE9iaiovKSB7fQotCi1DYWNoZTo6U3RhdGlzdGljcyBD
YWNoZTo6Z2V0U3RhdGlzdGljcygpCi17Ci0gICAgU3RhdGlzdGljcyBzdGF0czsKLQotICAgIGlm
ICghY2FjaGUpCi0gICAgICAgIHJldHVybiBzdGF0czsKLQotICAgIFFEaWN0SXRlcmF0b3I8Q2Fj
aGVkT2JqZWN0PiBpKCpjYWNoZSk7Ci0gICAgZm9yIChpLnRvRmlyc3QoKTsgaS5jdXJyZW50KCk7
ICsraSkgewotICAgICAgICBDYWNoZWRPYmplY3QgKm8gPSBpLmN1cnJlbnQoKTsKLSAgICAgICAg
c3dpdGNoIChvLT50eXBlKCkpIHsKLSAgICAgICAgICAgIGNhc2UgQ2FjaGVkT2JqZWN0OjpJbWFn
ZToKLSAgICAgICAgICAgICAgICBzdGF0cy5pbWFnZXMuY291bnQrKzsKLSAgICAgICAgICAgICAg
ICBzdGF0cy5pbWFnZXMuc2l6ZSArPSBvLT5zaXplKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7
Ci0KLSAgICAgICAgICAgIGNhc2UgQ2FjaGVkT2JqZWN0OjpDU1NTdHlsZVNoZWV0OgotICAgICAg
ICAgICAgICAgIHN0YXRzLnN0eWxlU2hlZXRzLmNvdW50Kys7Ci0gICAgICAgICAgICAgICAgc3Rh
dHMuc3R5bGVTaGVldHMuc2l6ZSArPSBvLT5zaXplKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7
Ci0KLSAgICAgICAgICAgIGNhc2UgQ2FjaGVkT2JqZWN0OjpTY3JpcHQ6Ci0gICAgICAgICAgICAg
ICAgc3RhdHMuc2NyaXB0cy5jb3VudCsrOwotICAgICAgICAgICAgICAgIHN0YXRzLnNjcmlwdHMu
c2l6ZSArPSBvLT5zaXplKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0jaWZkZWYgS0hUTUxf
WFNMVAotICAgICAgICAgICAgY2FzZSBDYWNoZWRPYmplY3Q6OlhTTFN0eWxlU2hlZXQ6Ci0gICAg
ICAgICAgICAgICAgc3RhdHMueHNsU3R5bGVTaGVldHMuY291bnQrKzsKLSAgICAgICAgICAgICAg
ICBzdGF0cy54c2xTdHlsZVNoZWV0cy5zaXplICs9IG8tPnNpemUoKTsKLSAgICAgICAgICAgICAg
ICBicmVhazsKLSNlbmRpZgotI2lmbmRlZiBLSFRNTF9OT19YQkwKLSAgICAgICAgICAgIGNhc2Ug
Q2FjaGVkT2JqZWN0OjpYQkw6Ci0gICAgICAgICAgICAgICAgc3RhdHMueGJsRG9jcy5jb3VudCsr
OwotICAgICAgICAgICAgICAgIHN0YXRzLnhibERvY3Muc2l6ZSArPSBvLT5zaXplKCk7Ci0gICAg
ICAgICAgICAgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAg
ICAgICAgICAgc3RhdHMub3RoZXIuY291bnQrKzsKLSAgICAgICAgICAgICAgICBzdGF0cy5vdGhl
ci5zaXplICs9IG8tPnNpemUoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4g
c3RhdHM7Ci19Ci0KLXZvaWQgQ2FjaGU6OmZsdXNoQWxsKCkKLXsKLSAgICBpZiAoIWNhY2hlKQot
ICAgICAgICByZXR1cm47Ci0KLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIFFEaWN0SXRlcmF0b3I8
Q2FjaGVkT2JqZWN0PiBpKCpjYWNoZSk7Ci0gICAgICAgIENhY2hlZE9iamVjdCAqbyA9IGkudG9G
aXJzdCgpOwotICAgICAgICBpZiAoIW8pCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgcmVt
b3ZlQ2FjaGVFbnRyeShvKTsKLSAgICB9Ci19Ci0KLXZvaWQgQ2FjaGU6OnNldENhY2hlRGlzYWJs
ZWQoYm9vbCBkaXNhYmxlZCkKLXsKLSAgICBjYWNoZURpc2FibGVkID0gZGlzYWJsZWQ7Ci0gICAg
aWYgKGRpc2FibGVkKQotICAgICAgICBmbHVzaEFsbCgpOwotfQorfTsKSW5kZXg6IG1pc2MvRG9j
TG9hZGVyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBtaXNjL0RvY0xvYWRlci5jcHAJKHJldmlzaW9uIDEx
OTQ4KQorKysgbWlzYy9Eb2NMb2FkZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNSwxODU5ICsy
NSwyMDYgQEAKICAgICBwYWdlcyBmcm9tIHRoZSB3ZWIuIEl0IGhhcyBhIG1lbW9yeSBjYWNoZSBm
b3IgdGhlc2Ugb2JqZWN0cy4KICovCiAKLSN1bmRlZiBDQUNIRV9ERUJVRwotLy8jZGVmaW5lIENB
Q0hFX0RFQlVHCiAjaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5j
bHVkZSAiRG9jTG9hZGVyLmgiCisjaW5jbHVkZSAiQ2FjaGUuaCIKIAotI2luY2x1ZGUgImxvYWRl
ci5oIgotCi0vLyB1cCB0byB3aGljaCBzaXplIGlzIGEgcGljdHVyZSBmb3Igc3VyZSBjYWNoZWFi
bGUKLSNkZWZpbmUgTUFYQ0FDSEVBQkxFIDQwKjEwMjQKLS8vIGRlZmF1bHQgY2FjaGUgc2l6ZQot
I2RlZmluZSBERUZDQUNIRVNJWkUgNDA5NioxMDI0Ci0KLSNpbmNsdWRlIDxxYXN5bmNpby5oPgot
I2luY2x1ZGUgPHFwYWludGVyLmg+Ci0KLSNpbmNsdWRlIDxraW8vam9iLmg+Ci0jaW5jbHVkZSA8
a2lvL2pvYmNsYXNzZXMuaD4KLSNpbmNsdWRlIDxraW1hZ2Vpby5oPgotI2luY2x1ZGUgPGtjaGFy
c2V0cy5oPgotI2luY2x1ZGUgPGtkZWJ1Zy5oPgotI2luY2x1ZGUgImtodG1sX2ZhY3RvcnkuaCIK
LSNpbmNsdWRlICJraHRtbF9wYXJ0LmgiCi0jaW5jbHVkZSAiZGVjb2Rlci5oIgotCi0jaW5jbHVk
ZSAiaHRtbC9odG1sX2RvY3VtZW50aW1wbC5oIgotI2luY2x1ZGUgImNzcy9jc3Nfc3R5bGVzaGVl
dGltcGwuaCIKLQotI2lmbmRlZiBLSFRNTF9OT19YQkwKLSNpbmNsdWRlICJ4YmwveGJsX2RvY2lt
cGwuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8a3htbGNvcmUvQXNzZXJ0aW9ucy5oPgotI2luY2x1
ZGUgIktXUUxvYWRlci5oIgotCi11c2luZyBuYW1lc3BhY2Uga2h0bWw7Ci11c2luZyBuYW1lc3Bh
Y2UgRE9NOwotCi1zdGF0aWMgYm9vbCBjYWNoZURpc2FibGVkOwotCi0vLyBDYWxsIHRoaXMgIndh
bGtlciIgaW5zdGVhZCBvZiBpdGVyYXRvciBzbyBwZW9wbGUgd29uJ3QgZXhwZWN0IFF0IG9yIFNU
TC1zdHlsZSBpdGVyYXRvciBpbnRlcmZhY2UuCi0vLyBKdXN0IGtlZXAgY2FsbGluZyBuZXh0KCkg
b24gdGhpcy4gSXQncyBzYWZlIGZyb20gZGVsZXRpb25zIG9mIHRoZSBjdXJyZW50IGl0ZW0KLWNs
YXNzIENhY2hlZE9iamVjdENsaWVudFdhbGtlciB7Ci1wdWJsaWM6Ci0gICAgQ2FjaGVkT2JqZWN0
Q2xpZW50V2Fsa2VyKGNvbnN0IFFQdHJEaWN0PENhY2hlZE9iamVjdENsaWVudD4gJmNsaWVudHMp
IDogX2N1cnJlbnQoMCksIF9pdGVyYXRvcihjbGllbnRzKSB7IH0KLSAgICBDYWNoZWRPYmplY3RD
bGllbnQgKm5leHQoKTsKLXByaXZhdGU6Ci0gICAgQ2FjaGVkT2JqZWN0Q2xpZW50ICpfY3VycmVu
dDsKLSAgICBRUHRyRGljdEl0ZXJhdG9yPENhY2hlZE9iamVjdENsaWVudD4gX2l0ZXJhdG9yOwot
fTsKLQotQ2FjaGVkT2JqZWN0Ojp+Q2FjaGVkT2JqZWN0KCkKLXsKLSAgICBpZihtX2RlbGV0ZWQp
IGFib3J0KCk7Ci0gICAgQ2FjaGU6OnJlbW92ZUZyb21MUlVMaXN0KHRoaXMpOwotICAgIG1fZGVs
ZXRlZCA9IHRydWU7Ci0gICAgc2V0UmVzcG9uc2UoMCk7Ci0gICAgc2V0QWxsRGF0YSgwKTsKLX0K
LQotdm9pZCBDYWNoZWRPYmplY3Q6OmZpbmlzaCgpCi17Ci0gICAgaWYgKG1fc2l6ZSA+IENhY2hl
OjptYXhDYWNoZWFibGVPYmplY3RTaXplKCkpCi0gICAgICAgIG1fc3RhdHVzID0gVW5jYWNoZWFi
bGU7Ci0gICAgZWxzZQotICAgICAgICBtX3N0YXR1cyA9IENhY2hlZDsKLSAgICBLVVJMIHVybCht
X3VybC5xc3RyaW5nKCkpOwotICAgIGlmIChtX2V4cGlyZURhdGVDaGFuZ2VkICYmIHVybC5wcm90
b2NvbCgpLnN0YXJ0c1dpdGgoImh0dHAiKSkKLSAgICAgICAgbV9leHBpcmVEYXRlQ2hhbmdlZCA9
IGZhbHNlOwotfQotCi12b2lkIENhY2hlZE9iamVjdDo6c2V0RXhwaXJlRGF0ZSh0aW1lX3QgX2V4
cGlyZURhdGUsIGJvb2wgY2hhbmdlSHR0cENhY2hlKQotewotICAgIGlmICggX2V4cGlyZURhdGUg
PT0gbV9leHBpcmVEYXRlKQotICAgICAgICByZXR1cm47Ci0KLSAgICBpZiAobV9zdGF0dXMgPT0g
VW5jYWNoZWFibGUgfHwgbV9zdGF0dXMgPT0gQ2FjaGVkKQotICAgIHsKLSAgICAgICAgZmluaXNo
KCk7Ci0gICAgfQotICAgIG1fZXhwaXJlRGF0ZSA9IF9leHBpcmVEYXRlOwotICAgIGlmIChjaGFu
Z2VIdHRwQ2FjaGUgJiYgbV9leHBpcmVEYXRlKQotICAgICAgIG1fZXhwaXJlRGF0ZUNoYW5nZWQg
PSB0cnVlOwotfQotCi1ib29sIENhY2hlZE9iamVjdDo6aXNFeHBpcmVkKCkgY29uc3QKLXsKLSAg
ICBpZiAoIW1fZXhwaXJlRGF0ZSkgcmV0dXJuIGZhbHNlOwotICAgIHRpbWVfdCBub3cgPSB0aW1l
KDApOwotICAgIHJldHVybiAoZGlmZnRpbWUobm93LCBtX2V4cGlyZURhdGUpID49IDApOwotfQot
Ci12b2lkIENhY2hlZE9iamVjdDo6c2V0UmVxdWVzdChSZXF1ZXN0ICpfcmVxdWVzdCkKLXsKLSAg
ICBpZiAoIF9yZXF1ZXN0ICYmICFtX3JlcXVlc3QgKQotICAgICAgICBtX3N0YXR1cyA9IFBlbmRp
bmc7Ci0gICAgbV9yZXF1ZXN0ID0gX3JlcXVlc3Q7Ci0gICAgaWYgKGNhbkRlbGV0ZSgpICYmIG1f
ZnJlZSkKLSAgICAgICAgZGVsZXRlIHRoaXM7Ci0gICAgZWxzZSBpZiAoYWxsb3dJbkxSVUxpc3Qo
KSkKLSAgICAgICAgQ2FjaGU6Omluc2VydEluTFJVTGlzdCh0aGlzKTsKLX0KLQotdm9pZCBDYWNo
ZWRPYmplY3Q6OnJlZihDYWNoZWRPYmplY3RDbGllbnQgKmMpCi17Ci0gICAgbV9jbGllbnRzLmlu
c2VydChjLCBjKTsKLSAgICBDYWNoZTo6cmVtb3ZlRnJvbUxSVUxpc3QodGhpcyk7Ci0gICAgaW5j
cmVhc2VBY2Nlc3NDb3VudCgpOwotfQotCi12b2lkIENhY2hlZE9iamVjdDo6ZGVyZWYoQ2FjaGVk
T2JqZWN0Q2xpZW50ICpjKQotewotICAgIG1fY2xpZW50cy5yZW1vdmUoYyk7Ci0gICAgaWYgKGFs
bG93SW5MUlVMaXN0KCkpCi0gICAgICAgIENhY2hlOjppbnNlcnRJbkxSVUxpc3QodGhpcyk7Ci19
Ci0KLXZvaWQgQ2FjaGVkT2JqZWN0OjpzZXRTaXplKGludCBzaXplKQotewotICAgIGJvb2wgc2l6
ZUNoYW5nZWQgPSBDYWNoZTo6YWRqdXN0U2l6ZSh0aGlzLCBzaXplIC0gbV9zaXplKTsKLQotICAg
IC8vIFRoZSBvYmplY3QgbXVzdCBub3cgYmUgbW92ZWQgdG8gYSBkaWZmZXJlbnQgcXVldWUsIHNp
bmNlIGl0cyBzaXplIGhhcyBiZWVuIGNoYW5nZWQuCi0gICAgaWYgKHNpemVDaGFuZ2VkICYmIGFs
bG93SW5MUlVMaXN0KCkpCi0gICAgICAgIENhY2hlOjpyZW1vdmVGcm9tTFJVTGlzdCh0aGlzKTsK
LQotICAgIG1fc2l6ZSA9IHNpemU7Ci0gICAgCi0gICAgaWYgKHNpemVDaGFuZ2VkICYmIGFsbG93
SW5MUlVMaXN0KCkpCi0gICAgICAgIENhY2hlOjppbnNlcnRJbkxSVUxpc3QodGhpcyk7Ci19Ci0K
LS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQ2FjaGVkQ1NTU3R5bGVT
aGVldDo6Q2FjaGVkQ1NTU3R5bGVTaGVldChEb2NMb2FkZXIqIGRsLCBjb25zdCBET01TdHJpbmcg
JnVybCwgS0lPOjpDYWNoZUNvbnRyb2wgX2NhY2hlUG9saWN5LCB0aW1lX3QgX2V4cGlyZURhdGUs
IGNvbnN0IFFTdHJpbmcmIGNoYXJzZXQpCi0gICAgOiBDYWNoZWRPYmplY3QodXJsLCBDU1NTdHls
ZVNoZWV0LCBfY2FjaGVQb2xpY3ksIF9leHBpcmVEYXRlKSwgbV9jb2RlYygwKQotewotICAgIC8v
IEl0J3MgY3NzIHdlIHdhbnQuCi0gICAgc2V0QWNjZXB0KCJ0ZXh0L2NzcyIpOwotICAgIC8vIGxv
YWQgdGhlIGZpbGUKLSAgICBDYWNoZTo6bG9hZGVyKCktPmxvYWQoZGwsIHRoaXMsIGZhbHNlKTsK
LSAgICBtX2xvYWRpbmcgPSB0cnVlOwotICAgIGlmICghY2hhcnNldC5pc0VtcHR5KCkpCi0JbV9j
b2RlYyA9IFFUZXh0Q29kZWM6OmNvZGVjRm9yTmFtZShjaGFyc2V0LmxhdGluMSgpKTsKLSAgICBp
ZiAoIW1fY29kZWMpCi0gICAgICAgIG1fY29kZWMgPSBRVGV4dENvZGVjOjpjb2RlY0Zvck5hbWUo
Imlzbzg4NTktMSIpOwotfQotCi1DYWNoZWRDU1NTdHlsZVNoZWV0OjpDYWNoZWRDU1NTdHlsZVNo
ZWV0KGNvbnN0IERPTVN0cmluZyAmdXJsLCBjb25zdCBRU3RyaW5nICZzdHlsZXNoZWV0X2RhdGEp
Ci0gICAgOiBDYWNoZWRPYmplY3QodXJsLCBDU1NTdHlsZVNoZWV0LCBLSU86OkNDX1ZlcmlmeSwg
MCwgc3R5bGVzaGVldF9kYXRhLmxlbmd0aCgpKQotewotICAgIG1fbG9hZGluZyA9IGZhbHNlOwot
ICAgIG1fc3RhdHVzID0gUGVyc2lzdGVudDsKLSAgICBtX2NvZGVjID0gMDsKLSAgICBtX3NoZWV0
ID0gRE9NU3RyaW5nKHN0eWxlc2hlZXRfZGF0YSk7Ci19Ci0KLQotQ2FjaGVkQ1NTU3R5bGVTaGVl
dDo6fkNhY2hlZENTU1N0eWxlU2hlZXQoKQotewotfQotCi12b2lkIENhY2hlZENTU1N0eWxlU2hl
ZXQ6OnJlZihDYWNoZWRPYmplY3RDbGllbnQgKmMpCi17Ci0gICAgQ2FjaGVkT2JqZWN0OjpyZWYo
Yyk7Ci0KLSAgICBpZighbV9sb2FkaW5nKSBjLT5zZXRTdHlsZVNoZWV0KCBtX3VybCwgbV9zaGVl
dCApOwotfQotCi12b2lkIENhY2hlZENTU1N0eWxlU2hlZXQ6OmRlcmVmKENhY2hlZE9iamVjdENs
aWVudCAqYykKLXsKLSAgICBDYWNoZTo6Zmx1c2goKTsKLSAgICBDYWNoZWRPYmplY3Q6OmRlcmVm
KGMpOwotICAgIGlmICggY2FuRGVsZXRlKCkgJiYgbV9mcmVlICkKLSAgICAgIGRlbGV0ZSB0aGlz
OwotfQotCi12b2lkIENhY2hlZENTU1N0eWxlU2hlZXQ6OnNldENoYXJzZXQoIGNvbnN0IFFTdHJp
bmcgJmNocyApCi17Ci0gICAgaWYgKCFjaHMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIFFUZXh0Q29k
ZWMgKmNvZGVjID0gUVRleHRDb2RlYzo6Y29kZWNGb3JOYW1lKGNocy5sYXRpbjEoKSk7Ci0gICAg
ICAgIGlmIChjb2RlYykKLSAgICAgICAgICAgIG1fY29kZWMgPSBjb2RlYzsKLSAgICB9Ci19Ci0K
LXZvaWQgQ2FjaGVkQ1NTU3R5bGVTaGVldDo6ZGF0YSggUUJ1ZmZlciAmYnVmZmVyLCBib29sIGVv
ZiApCi17Ci0gICAgaWYoIWVvZikgcmV0dXJuOwotICAgIGJ1ZmZlci5jbG9zZSgpOwotICAgIHNl
dFNpemUoYnVmZmVyLmJ1ZmZlcigpLnNpemUoKSk7Ci0gICAgUVN0cmluZyBkYXRhID0gbV9jb2Rl
Yy0+dG9Vbmljb2RlKCBidWZmZXIuYnVmZmVyKCkuZGF0YSgpLCBzaXplKCkgKTsKLSAgICBtX3No
ZWV0ID0gRE9NU3RyaW5nKGRhdGEpOwotICAgIG1fbG9hZGluZyA9IGZhbHNlOwotCi0gICAgY2hl
Y2tOb3RpZnkoKTsKLX0KLQotdm9pZCBDYWNoZWRDU1NTdHlsZVNoZWV0OjpjaGVja05vdGlmeSgp
Ci17Ci0gICAgaWYgKG1fbG9hZGluZykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgQ2FjaGVkT2Jq
ZWN0Q2xpZW50V2Fsa2VyIHcobV9jbGllbnRzKTsKLSAgICB3aGlsZSAoQ2FjaGVkT2JqZWN0Q2xp
ZW50ICpjID0gdy5uZXh0KCkpIHsKLSAgICAgICAgaWYgKG1fcmVzcG9uc2UgJiYgIUtXUUlzUmVz
cG9uc2VVUkxFcXVhbFRvVVJMKG1fcmVzcG9uc2UsIG1fdXJsKSkKLSAgICAgICAgICAgIGMtPnNl
dFN0eWxlU2hlZXQoRE9NU3RyaW5nKEtXUVJlc3BvbnNlVVJMKG1fcmVzcG9uc2UpKSwgbV9zaGVl
dCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGMtPnNldFN0eWxlU2hlZXQobV91cmwsIG1f
c2hlZXQpOwotICAgIH0KLX0KLQotCi12b2lkIENhY2hlZENTU1N0eWxlU2hlZXQ6OmVycm9yKCBp
bnQgLyplcnIqLywgY29uc3QgY2hhciAqLyp0ZXh0Ki8gKQotewotICAgIG1fbG9hZGluZyA9IGZh
bHNlOwotICAgIGNoZWNrTm90aWZ5KCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0KLQotQ2FjaGVkU2NyaXB0OjpDYWNoZWRTY3JpcHQoRG9jTG9hZGVyKiBkbCwg
Y29uc3QgRE9NU3RyaW5nICZ1cmwsIEtJTzo6Q2FjaGVDb250cm9sIF9jYWNoZVBvbGljeSwgdGlt
ZV90IF9leHBpcmVEYXRlLCBjb25zdCBRU3RyaW5nJiBjaGFyc2V0KQotICAgIDogQ2FjaGVkT2Jq
ZWN0KHVybCwgU2NyaXB0LCBfY2FjaGVQb2xpY3ksIF9leHBpcmVEYXRlKSwgbV9jb2RlYygwKQot
ewotICAgIC8vIEl0J3MgamF2YXNjcmlwdCB3ZSB3YW50LgotICAgIC8vIEJ1dCBzb21lIHdlYnNp
dGVzIHRoaW5rIHRoZWlyIHNjcmlwdHMgYXJlIDxzb21lIHdyb25nIG1pbWV0eXBlIGhlcmU+Ci0g
ICAgLy8gYW5kIHJlZnVzZSB0byBzZXJ2ZSB0aGVtIGlmIHdlIG9ubHkgYWNjZXB0IGFwcGxpY2F0
aW9uL3gtamF2YXNjcmlwdC4KLSAgICBzZXRBY2NlcHQoIiovKiIpOwotICAgIG1fZXJyb3JPY2N1
cnJlZCA9IGZhbHNlOwotICAgIC8vIGxvYWQgdGhlIGZpbGUKLSAgICBDYWNoZTo6bG9hZGVyKCkt
PmxvYWQoZGwsIHRoaXMsIGZhbHNlKTsKLSAgICBtX2xvYWRpbmcgPSB0cnVlOwotICAgIGlmICgh
Y2hhcnNldC5pc0VtcHR5KCkpCi0gICAgICAgIG1fY29kZWMgPSBRVGV4dENvZGVjOjpjb2RlY0Zv
ck5hbWUoY2hhcnNldC5sYXRpbjEoKSk7Ci0gICAgaWYgKCFtX2NvZGVjKQotCW1fY29kZWMgPSBR
VGV4dENvZGVjOjpjb2RlY0Zvck5hbWUoImlzbzg4NTktMSIpOwotfQotCi1DYWNoZWRTY3JpcHQ6
OkNhY2hlZFNjcmlwdChjb25zdCBET01TdHJpbmcgJnVybCwgY29uc3QgUVN0cmluZyAmc2NyaXB0
X2RhdGEpCi0gICAgOiBDYWNoZWRPYmplY3QodXJsLCBTY3JpcHQsIEtJTzo6Q0NfVmVyaWZ5LCAw
LCBzY3JpcHRfZGF0YS5sZW5ndGgoKSkKLXsKLSAgICBtX2Vycm9yT2NjdXJyZWQgPSBmYWxzZTsK
LSAgICBtX2xvYWRpbmcgPSBmYWxzZTsKLSAgICBtX3N0YXR1cyA9IFBlcnNpc3RlbnQ7Ci0gICAg
bV9jb2RlYyA9IDA7Ci0gICAgbV9zY3JpcHQgPSBET01TdHJpbmcoc2NyaXB0X2RhdGEpOwotfQot
Ci1DYWNoZWRTY3JpcHQ6On5DYWNoZWRTY3JpcHQoKQotewotfQotCi12b2lkIENhY2hlZFNjcmlw
dDo6cmVmKENhY2hlZE9iamVjdENsaWVudCAqYykKLXsKLSAgICBDYWNoZWRPYmplY3Q6OnJlZihj
KTsKLQotICAgIGlmKCFtX2xvYWRpbmcpIGMtPm5vdGlmeUZpbmlzaGVkKHRoaXMpOwotfQotCi12
b2lkIENhY2hlZFNjcmlwdDo6ZGVyZWYoQ2FjaGVkT2JqZWN0Q2xpZW50ICpjKQotewotICAgIENh
Y2hlOjpmbHVzaCgpOwotICAgIENhY2hlZE9iamVjdDo6ZGVyZWYoYyk7Ci0gICAgaWYgKCBjYW5E
ZWxldGUoKSAmJiBtX2ZyZWUgKQotICAgICAgZGVsZXRlIHRoaXM7Ci19Ci0KLXZvaWQgQ2FjaGVk
U2NyaXB0OjpzZXRDaGFyc2V0KCBjb25zdCBRU3RyaW5nICZjaHMgKQotewotICAgIGlmICghY2hz
LmlzRW1wdHkoKSkgewotICAgICAgICBRVGV4dENvZGVjICpjb2RlYyA9IFFUZXh0Q29kZWM6OmNv
ZGVjRm9yTmFtZShjaHMubGF0aW4xKCkpOwotICAgICAgICBpZiAoY29kZWMpCi0gICAgICAgICAg
ICBtX2NvZGVjID0gY29kZWM7Ci0gICAgfQotfQotCi12b2lkIENhY2hlZFNjcmlwdDo6ZGF0YSgg
UUJ1ZmZlciAmYnVmZmVyLCBib29sIGVvZiApCi17Ci0gICAgaWYoIWVvZikgcmV0dXJuOwotICAg
IGJ1ZmZlci5jbG9zZSgpOwotICAgIHNldFNpemUoYnVmZmVyLmJ1ZmZlcigpLnNpemUoKSk7Ci0g
ICAgUVN0cmluZyBkYXRhID0gbV9jb2RlYy0+dG9Vbmljb2RlKCBidWZmZXIuYnVmZmVyKCkuZGF0
YSgpLCBzaXplKCkgKTsKLSAgICBtX3NjcmlwdCA9IERPTVN0cmluZyhkYXRhKTsKLSAgICBtX2xv
YWRpbmcgPSBmYWxzZTsKLSAgICBjaGVja05vdGlmeSgpOwotfQotCi12b2lkIENhY2hlZFNjcmlw
dDo6Y2hlY2tOb3RpZnkoKQotewotICAgIGlmKG1fbG9hZGluZykgcmV0dXJuOwotCi0gICAgQ2Fj
aGVkT2JqZWN0Q2xpZW50V2Fsa2VyIHcobV9jbGllbnRzKTsKLSAgICB3aGlsZSAoQ2FjaGVkT2Jq
ZWN0Q2xpZW50ICpjID0gdy5uZXh0KCkpCi0gICAgICAgIGMtPm5vdGlmeUZpbmlzaGVkKHRoaXMp
OwotfQotCi0KLXZvaWQgQ2FjaGVkU2NyaXB0OjplcnJvciggaW50IC8qZXJyKi8sIGNvbnN0IGNo
YXIgKi8qdGV4dCovICkKLXsKLSAgICBtX2xvYWRpbmcgPSBmYWxzZTsKLSAgICBtX2Vycm9yT2Nj
dXJyZWQgPSB0cnVlOwotICAgIGNoZWNrTm90aWZ5KCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLXN0YXRpYyBib29sIGNyb3NzRG9tYWluKGNvbnN0IFFT
dHJpbmcgJmEsIGNvbnN0IFFTdHJpbmcgJmIpCi17Ci0gICAgaWYgKGEgPT0gYikgcmV0dXJuIGZh
bHNlOwotCi0gICAgUVN0cmluZ0xpc3QgbDEgPSBRU3RyaW5nTGlzdDo6c3BsaXQoJy4nLCBhKTsK
LSAgICBRU3RyaW5nTGlzdCBsMiA9IFFTdHJpbmdMaXN0OjpzcGxpdCgnLicsIGIpOwotCi0gICAg
d2hpbGUobDEuY291bnQoKSA+IGwyLmNvdW50KCkpCi0gICAgICAgIGwxLnBvcF9mcm9udCgpOwot
Ci0gICAgd2hpbGUobDIuY291bnQoKSA+IGwxLmNvdW50KCkpCi0gICAgICAgIGwyLnBvcF9mcm9u
dCgpOwotCi0gICAgd2hpbGUobDIuY291bnQoKSA+PSAyKQotICAgIHsKLSAgICAgICAgaWYgKGwx
ID09IGwyKQotICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgbDEucG9wX2Zyb250
KCk7Ci0gICAgICAgIGwyLnBvcF9mcm9udCgpOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0K
LQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotdm9pZCBDYWNoZWRJbWFnZUNhbGxi
YWNrOjpub3RpZnlVcGRhdGUoKSAKLXsgCi0gICAgaWYgKGNhY2hlZEltYWdlKSB7Ci0gICAgICAg
IGNhY2hlZEltYWdlLT5kb19ub3RpZnkgKGNhY2hlZEltYWdlLT5waXhtYXAoKSwgY2FjaGVkSW1h
Z2UtPnBpeG1hcCgpLnJlY3QoKSk7IAotICAgICAgICBRU2l6ZSBzID0gY2FjaGVkSW1hZ2UtPnBp
eG1hcF9zaXplKCk7Ci0gICAgICAgIGNhY2hlZEltYWdlLT5zZXRTaXplKHMud2lkdGgoKSAqIHMu
aGVpZ2h0KCkgKiAyKTsKLQotICAgICAgICAvLyBBZnRlciByZWNlaXZpbmcgdGhlIGltYWdlIGhl
YWRlciB3ZSBhcmUgZ3VhcmFudGVlZCB0byBrbm93Ci0gICAgICAgIC8vIHRoZSBpbWFnZSBzaXpl
LiAgQWx0aG91Z2ggYWxsIG9mIHRoZSBkYXRhIG1heSBub3QgaGF2ZSBhcnJpdmVkIG9yCi0gICAg
ICAgIC8vIGJlZW4gZGVjb2RlZCB3ZSBjYW4gY29uc2lkZXIgdGhlIGltYWdlIGxvYWRlZCBmb3Ig
cHVycG9zZWQgb2YKLSAgICAgICAgLy8gbGF5b3V0IGFuZCBkaXNwYXRjaGluZyB0aGUgaW1hZ2Un
cyBvbmxvYWQgaGFuZGxlci4gIFJlbW92aW5nIHRoZSByZXF1ZXN0IGZyb20KLSAgICAgICAgLy8g
dGhlIGxpc3Qgb2YgYmFja2dyb3VuZCBkZWNvZGluZyByZXF1ZXN0cyB3aWxsIGVuc3VyZSB0aGF0
IExvYWRlcjo6bnVtUmVxdWVzdHMoKSAKLSAgICAgICAgLy8gZG9lcyBub3QgY291bnQgdGhpcyBi
YWNrZ3JvdW5kIHJlcXVlc3QuICBGdXJ0aGVyIG51bVJlcXVlc3RzKCkgY2FuCi0gICAgICAgIC8v
IGJlIGNvcnJlY3RseSB1c2VkIGJ5IHRoZSBwYXJ0IHRvIGRldGVybWluZSBpZiBsb2FkaW5nIGlz
IHN1ZmZpY2llbnRseQotICAgICAgICAvLyBjb21wbGV0ZSB0byBkaXNwYXRjaCB0aGUgcGFnZSdz
IG9ubG9hZCBoYW5kbGVyLgotICAgICAgICBSZXF1ZXN0ICpyID0gY2FjaGVkSW1hZ2UtPm1fcmVx
dWVzdDsKLSAgICAgICAgRG9jTG9hZGVyICpkbCA9IHItPm1fZG9jTG9hZGVyOwotCi0gICAgICAg
IGtodG1sOjpDYWNoZTo6bG9hZGVyKCktPnJlbW92ZUJhY2tncm91bmREZWNvZGluZ1JlcXVlc3Qo
cik7Ci0KLSAgICAgICAgLy8gUG9rZSB0aGUgcGFydCB0byBnZXQgaXQgdG8gZG8gYSBjaGVja0Nv
bXBsZXRlZCgpLiAgT25seSBkbyB0aGlzIGZvcgotICAgICAgICAvLyB0aGUgZmlyc3QgdXBkYXRl
IHRvIG1pbmltaXplIHdvcmsuICBOb3RlIHRoYXQgd2UgYXJlIGd1YXJhbnRlZWQgdG8gaGF2ZQot
ICAgICAgICAvLyByZWFkIHRoZSBoZWFkZXIgd2hlbiB3ZSByZWNlaXZlZCB0aGlzIGZpcnN0IHVw
ZGF0ZSwgd2hpY2ggaXMgdHJpZ2dlcmVkCi0gICAgICAgIC8vIGJ5IHRoZSBmaXJzdCBrQ0dJbWFn
ZVN0YXR1c0luY29tcGxldGUgc3RhdHVzIGZyb20gQ0cuIGtDR0ltYWdlU3RhdHVzSW5jb21wbGV0
ZQotICAgICAgICAvLyByZWFsbHkgbWVhbnMgdGhhdCB0aGUgQ0cgZGVjb2RlciBpcyB3YWl0aW5n
IGZvciBtb3JlIGRhdGEsIGJ1dCBoYXMgYWxyZWFkeQotICAgICAgICAvLyByZWFkIHRoZSBoZWFk
ZXIuCi0gICAgICAgIGlmICghaGVhZGVyUmVjZWl2ZWQpIHsKLSAgICAgICAgICAgIGVtaXQga2h0
bWw6OkNhY2hlOjpsb2FkZXIoKS0+cmVxdWVzdERvbmUoIGRsLCBjYWNoZWRJbWFnZSApOwotICAg
ICAgICAgICAgaGVhZGVyUmVjZWl2ZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotfQotCi12
b2lkIENhY2hlZEltYWdlQ2FsbGJhY2s6Om5vdGlmeUZpbmlzaGVkKCkKLXsKLSAgICBpZiAoY2Fj
aGVkSW1hZ2UpIHsKLSAgICAgICAgY2FjaGVkSW1hZ2UtPmRvX25vdGlmeSAoY2FjaGVkSW1hZ2Ut
PnBpeG1hcCgpLCBjYWNoZWRJbWFnZS0+cGl4bWFwKCkucmVjdCgpKTsgCi0gICAgICAgIGNhY2hl
ZEltYWdlLT5tX2xvYWRpbmcgPSBmYWxzZTsKLSAgICAgICAgY2FjaGVkSW1hZ2UtPmNoZWNrTm90
aWZ5KCk7Ci0gICAgICAgIFFTaXplIHMgPSBjYWNoZWRJbWFnZS0+cGl4bWFwX3NpemUoKTsKLSAg
ICAgICAgY2FjaGVkSW1hZ2UtPnNldFNpemUocy53aWR0aCgpICogcy5oZWlnaHQoKSAqIDIpOwot
CQotICAgICAgICBSZXF1ZXN0ICpyID0gY2FjaGVkSW1hZ2UtPm1fcmVxdWVzdDsKLSAgICAgICAg
RG9jTG9hZGVyICpkbCA9IHItPm1fZG9jTG9hZGVyOwotCi0gICAgICAgIGtodG1sOjpDYWNoZTo6
bG9hZGVyKCktPnJlbW92ZUJhY2tncm91bmREZWNvZGluZ1JlcXVlc3Qocik7Ci0KLSAgICAgICAg
Ly8gUG9rZSB0aGUgcGFydCB0byBnZXQgaXQgdG8gZG8gYSBjaGVja0NvbXBsZXRlZCgpLgotICAg
ICAgICBlbWl0IGtodG1sOjpDYWNoZTo6bG9hZGVyKCktPnJlcXVlc3REb25lKCBkbCwgY2FjaGVk
SW1hZ2UgKTsKLSAgICAgICAgCi0gICAgICAgIGRlbGV0ZSByOwotICAgIH0KLX0KLQotdm9pZCBD
YWNoZWRJbWFnZUNhbGxiYWNrOjpub3RpZnlEZWNvZGluZ0Vycm9yKCkKLXsKLSAgICBpZiAoY2Fj
aGVkSW1hZ2UpIHsKLSAgICAgICAgaGFuZGxlRXJyb3IoKTsKLSAgICB9Ci19Ci0KLXZvaWQgQ2Fj
aGVkSW1hZ2VDYWxsYmFjazo6aGFuZGxlRXJyb3IoKQotewotICAgIGlmIChjYWNoZWRJbWFnZSkg
ewotICAgICAgICBjYWNoZWRJbWFnZS0+ZXJyb3JPY2N1cmVkID0gdHJ1ZTsKLSAgICAgICAgUVBp
eG1hcCBlcCA9IGNhY2hlZEltYWdlLT5waXhtYXAoKTsKLSAgICAgICAgY2FjaGVkSW1hZ2UtPmRv
X25vdGlmeSAoZXAsIGVwLnJlY3QoKSk7Ci0gICAgICAgIENhY2hlOjpyZW1vdmVDYWNoZUVudHJ5
IChjYWNoZWRJbWFnZSk7Ci0KLSAgICAgICAgY2xlYXIoKTsKLSAgICB9Ci19Ci0KLXZvaWQgQ2Fj
aGVkSW1hZ2VDYWxsYmFjazo6Y2xlYXIoKSAKLXsKLSAgICBpZiAoY2FjaGVkSW1hZ2UgJiYgY2Fj
aGVkSW1hZ2UtPm1fcmVxdWVzdCkgewotICAgICAgICBSZXF1ZXN0ICpyID0gY2FjaGVkSW1hZ2Ut
Pm1fcmVxdWVzdDsKLSAgICAgICAgRG9jTG9hZGVyICpkbCA9IHItPm1fZG9jTG9hZGVyOwotCi0g
ICAgICAgIGtodG1sOjpDYWNoZTo6bG9hZGVyKCktPnJlbW92ZUJhY2tncm91bmREZWNvZGluZ1Jl
cXVlc3Qocik7Ci0KLSAgICAgICAgLy8gUG9rZSB0aGUgcGFydCB0byBnZXQgaXQgdG8gZG8gYSBj
aGVja0NvbXBsZXRlZCgpLgotICAgICAgICBlbWl0IGtodG1sOjpDYWNoZTo6bG9hZGVyKCktPnJl
cXVlc3RGYWlsZWQoIGRsLCBjYWNoZWRJbWFnZSApOwotCi0gICAgICAgIGRlbGV0ZSByOwotICAg
IH0KLSAgICBjYWNoZWRJbWFnZSA9IDA7Ci19Ci0KLUNhY2hlZEltYWdlOjpDYWNoZWRJbWFnZShE
b2NMb2FkZXIqIGRsLCBjb25zdCBET01TdHJpbmcgJnVybCwgS0lPOjpDYWNoZUNvbnRyb2wgX2Nh
Y2hlUG9saWN5LCB0aW1lX3QgX2V4cGlyZURhdGUpCi0gICAgOiBRT2JqZWN0KCksIENhY2hlZE9i
amVjdCh1cmwsIEltYWdlLCBfY2FjaGVQb2xpY3ksIF9leHBpcmVEYXRlKQotICAgICwgbV9kYXRh
U2l6ZSgwKQotewotICAgIHAgPSAwOwotICAgIHBpeFBhcnQgPSAwOwotICAgIGJnID0gMDsKLSAg
ICBpc0Z1bGx5VHJhbnNwYXJlbnQgPSBmYWxzZTsKLSAgICBlcnJvck9jY3VyZWQgPSBmYWxzZTsK
LSAgICBtb25vY2hyb21lID0gZmFsc2U7Ci0gICAgZm9ybWF0VHlwZSA9IDA7Ci0gICAgbV9zdGF0
dXMgPSBVbmtub3duOwotICAgIGltZ1NvdXJjZSA9IDA7Ci0gICAgbV9sb2FkaW5nID0gdHJ1ZTsK
LSAgICBtX3Nob3dBbmltYXRpb25zID0gZGwtPnNob3dBbmltYXRpb25zKCk7Ci0gICAgaWYgKFFQ
aXhtYXA6OnNob3VsZFVzZVRocmVhZGVkRGVjb2RpbmcoKSkKLSAgICAgICAgbV9kZWNvZGVyQ2Fs
bGJhY2sgPSBuZXcgQ2FjaGVkSW1hZ2VDYWxsYmFjayh0aGlzKTsKLSAgICBlbHNlCi0gICAgICAg
IG1fZGVjb2RlckNhbGxiYWNrID0gMDsKLX0KLQotQ2FjaGVkSW1hZ2U6On5DYWNoZWRJbWFnZSgp
Ci17Ci0gICAgY2xlYXIoKTsKLX0KLQotdm9pZCBDYWNoZWRJbWFnZTo6cmVmKCBDYWNoZWRPYmpl
Y3RDbGllbnQgKmMgKQotewotICAgIENhY2hlZE9iamVjdDo6cmVmKGMpOwotCi0gICAgLy8gZm9y
IG1vdXNlb3ZlcnMsIGR5bmFtaWMgY2hhbmdlcwotICAgIGlmICghdmFsaWRfcmVjdCgpLmlzTnVs
bCgpKQotICAgICAgICBjLT5zZXRQaXhtYXAoIHBpeG1hcCgpLCB2YWxpZF9yZWN0KCksIHRoaXMp
OwotCi0gICAgaWYoIW1fbG9hZGluZykKLSAgICAgICAgYy0+bm90aWZ5RmluaXNoZWQodGhpcyk7
Ci19Ci0KLXZvaWQgQ2FjaGVkSW1hZ2U6OmRlcmVmKCBDYWNoZWRPYmplY3RDbGllbnQgKmMgKQot
ewotICAgIENhY2hlOjpmbHVzaCgpOwotICAgIENhY2hlZE9iamVjdDo6ZGVyZWYoYyk7Ci0gICAg
aWYgKCBjYW5EZWxldGUoKSAmJiBtX2ZyZWUgKQotICAgICAgICBkZWxldGUgdGhpczsKLX0KLQot
Y29uc3QgUVBpeG1hcCAmQ2FjaGVkSW1hZ2U6OnRpbGVkX3BpeG1hcChjb25zdCBRQ29sb3ImIG5l
d2MpCi17Ci0gICAgcmV0dXJuIHBpeG1hcCgpOwotfQotCi1jb25zdCBRUGl4bWFwICZDYWNoZWRJ
bWFnZTo6cGl4bWFwKCApIGNvbnN0Ci17Ci0gICAgaWYoZXJyb3JPY2N1cmVkKQotICAgICAgICBy
ZXR1cm4gKkNhY2hlOjpicm9rZW5QaXhtYXA7Ci0KLSAgICBpZiAocCkKLSAgICAgICAgcmV0dXJu
ICpwOwotCi0gICAgcmV0dXJuICpDYWNoZTo6bnVsbFBpeG1hcDsKLX0KLQotUVNpemUgQ2FjaGVk
SW1hZ2U6OnBpeG1hcF9zaXplKCkgY29uc3QKLXsKLSAgICByZXR1cm4gKHAgPyBwLT5zaXplKCkg
OiBRU2l6ZSgpKTsKLX0KLQotUVJlY3QgQ2FjaGVkSW1hZ2U6OnZhbGlkX3JlY3QoKSBjb25zdAot
ewotICAgIHJldHVybiAocCA/IHAtPnJlY3QoKSA6IFFSZWN0KCkpOwotfQotCi12b2lkIENhY2hl
ZEltYWdlOjpkb19ub3RpZnkoY29uc3QgUVBpeG1hcCYgcCwgY29uc3QgUVJlY3QmIHIpCi17Ci0g
ICAgQ2FjaGVkT2JqZWN0Q2xpZW50V2Fsa2VyIHcobV9jbGllbnRzKTsKLSAgICB3aGlsZSAoQ2Fj
aGVkT2JqZWN0Q2xpZW50ICpjID0gdy5uZXh0KCkpCi0gICAgICAgIGMtPnNldFBpeG1hcChwLCBy
LCB0aGlzKTsKLX0KLQotdm9pZCBDYWNoZWRJbWFnZTo6c2V0U2hvd0FuaW1hdGlvbnMoIEtIVE1M
U2V0dGluZ3M6OktBbmltYXRpb25BZHZpY2Ugc2hvd0FuaW1hdGlvbnMgKQotewotICAgIG1fc2hv
d0FuaW1hdGlvbnMgPSBzaG93QW5pbWF0aW9uczsKLX0KLQotdm9pZCBDYWNoZWRJbWFnZTo6Y2xl
YXIoKQotewotICAgIGRlbGV0ZSBwOyAgIHAgPSAwOwotICAgIGRlbGV0ZSBiZzsgIGJnID0gMDsK
LSAgICBkZWxldGUgcGl4UGFydDsgcGl4UGFydCA9IDA7Ci0KLSAgICBmb3JtYXRUeXBlID0gMDsK
LQotICAgIHNldFNpemUoMCk7Ci0KLSAgICAvLyBObyBuZWVkIHRvIGRlbGV0ZSBpbWFnZVNvdXJj
ZSAtIFFNb3ZpZSBkb2VzIGl0IGZvciB1cwotICAgIGltZ1NvdXJjZSA9IDA7Ci0KLSAgICBpZiAo
bV9kZWNvZGVyQ2FsbGJhY2spIHsKLSAgICAgICAgbV9kZWNvZGVyQ2FsbGJhY2stPmNsZWFyKCk7
Ci0gICAgICAgIG1fZGVjb2RlckNhbGxiYWNrLT5kZXJlZigpOwotICAgICAgICBtX2RlY29kZXJD
YWxsYmFjayA9IDA7Ci0gICAgfQotfQotCi12b2lkIENhY2hlZEltYWdlOjpkYXRhICggUUJ1ZmZl
ciAmX2J1ZmZlciwgYm9vbCBlb2YgKQotewotI2lmZGVmIENBQ0hFX0RFQlVHCi0gICAga2REZWJ1
ZyggNjA2MCApIDw8IHRoaXMgPDwgImluIENhY2hlZEltYWdlOjpkYXRhKGJ1ZmZlcnNpemUgIiA8
PCBfYnVmZmVyLmJ1ZmZlcigpLnNpemUoKSA8PCIsIGVvZj0iIDw8IGVvZiA8PCBlbmRsOwotI2Vu
ZGlmCi0KLSAgICBib29sIGNhbkRyYXcgPSBmYWxzZTsKLSAgICAKLSAgICBtX2RhdGFTaXplID0g
X2J1ZmZlci5zaXplKCk7Ci0gICAgICAgIAotICAgIC8vIElmIHdlJ3JlIGF0IGVvZiBhbmQgZG9u
J3QgaGF2ZSBhIHBpeG1hcCB5ZXQsIHRoZSBkYXRhCi0gICAgLy8gbXVzdCBoYXZlIGFycml2ZWQg
aW4gb25lIGNodW5rLiAgVGhpcyBhdm9pZHMgdGhlIGF0dGVtcHQKLSAgICAvLyB0byBwZXJmb3Jt
IGluY3JlbWVudGFsIGRlY29kaW5nLgotICAgIGlmIChlb2YgJiYgIXApIHsKLSAgICAgICAgcCA9
IG5ldyBRUGl4bWFwKF9idWZmZXIuYnVmZmVyKCksIEtXUVJlc3BvbnNlTUlNRVR5cGUobV9yZXNw
b25zZSkpOwotICAgICAgICBpZiAobV9kZWNvZGVyQ2FsbGJhY2spCi0gICAgICAgICAgICBtX2Rl
Y29kZXJDYWxsYmFjay0+bm90aWZ5RmluaXNoZWQoKTsKLSAgICAgICAgY2FuRHJhdyA9IHRydWU7
Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gQWx3YXlzIGF0dGVtcHQgdG8gbG9hZCB0aGUgaW1h
Z2UgaW5jcmVtZW50YWxseS4KLSAgICAgICAgaWYgKCFwKQotICAgICAgICAgICAgcCA9IG5ldyBR
UGl4bWFwKEtXUVJlc3BvbnNlTUlNRVR5cGUobV9yZXNwb25zZSkpOwotICAgICAgICBjYW5EcmF3
ID0gcC0+cmVjZWl2ZWREYXRhKF9idWZmZXIuYnVmZmVyKCksIGVvZiwgbV9kZWNvZGVyQ2FsbGJh
Y2spOwotICAgIH0KLSAgICAKLSAgICAvLyBJZiB3ZSBoYXZlIGEgZGVjb2Rlciwgd2UnbGwgYmUg
bm90aWZpZWQgd2hlbiBkZWNvZGluZyBoYXMgY29tcGxldGVkLgotICAgIGlmICghbV9kZWNvZGVy
Q2FsbGJhY2spIHsKLSAgICAgICAgaWYgKGNhbkRyYXcgfHwgZW9mKSB7Ci0gICAgICAgICAgICBp
ZiAocC0+aXNOdWxsKCkpIHsKLSAgICAgICAgICAgICAgICBlcnJvck9jY3VyZWQgPSB0cnVlOwot
ICAgICAgICAgICAgICAgIFFQaXhtYXAgZXAgPSBwaXhtYXAoKTsKLSAgICAgICAgICAgICAgICBk
b19ub3RpZnkgKGVwLCBlcC5yZWN0KCkpOwotICAgICAgICAgICAgICAgIENhY2hlOjpyZW1vdmVD
YWNoZUVudHJ5ICh0aGlzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAg
ICAgICAgICAgICBkb19ub3RpZnkoKnAsIHAtPnJlY3QoKSk7Ci0KLSAgICAgICAgICAgIFFTaXpl
IHMgPSBwaXhtYXBfc2l6ZSgpOwotICAgICAgICAgICAgc2V0U2l6ZShzLndpZHRoKCkgKiBzLmhl
aWdodCgpICogMik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGVvZikgewotICAgICAgICAgICAg
bV9sb2FkaW5nID0gZmFsc2U7Ci0gICAgICAgICAgICBjaGVja05vdGlmeSgpOwotICAgICAgICB9
Ci0gICAgfQotfQotCi12b2lkIENhY2hlZEltYWdlOjplcnJvciggaW50IC8qZXJyKi8sIGNvbnN0
IGNoYXIgKi8qdGV4dCovICkKLXsKLSNpZmRlZiBDQUNIRV9ERUJVRwotICAgIGtkRGVidWcoNjA2
MCkgPDwgIkNhaGNlZEltYWdlOjplcnJvciIgPDwgZW5kbDsKLSNlbmRpZgotCi0gICAgY2xlYXIo
KTsKLSAgICBlcnJvck9jY3VyZWQgPSB0cnVlOwotICAgIGRvX25vdGlmeShwaXhtYXAoKSwgUVJl
Y3QoMCwgMCwgMTYsIDE2KSk7Ci0gICAgbV9sb2FkaW5nID0gZmFsc2U7Ci0gICAgY2hlY2tOb3Rp
ZnkoKTsKLX0KLQotdm9pZCBDYWNoZWRJbWFnZTo6Y2hlY2tOb3RpZnkoKQotewotICAgIGlmKG1f
bG9hZGluZykgcmV0dXJuOwotCi0gICAgQ2FjaGVkT2JqZWN0Q2xpZW50V2Fsa2VyIHcobV9jbGll
bnRzKTsKLSAgICB3aGlsZSAoQ2FjaGVkT2JqZWN0Q2xpZW50ICpjID0gdy5uZXh0KCkpIHsKLSAg
ICAgICAgYy0+bm90aWZ5RmluaXNoZWQodGhpcyk7Ci0gICAgfQotfQotCi0vLyAtLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNpZmRlZiBLSFRNTF9YU0xUCi0KLUNhY2hlZFhT
TFN0eWxlU2hlZXQ6OkNhY2hlZFhTTFN0eWxlU2hlZXQoRG9jTG9hZGVyKiBkbCwgY29uc3QgRE9N
U3RyaW5nICZ1cmwsIEtJTzo6Q2FjaGVDb250cm9sIF9jYWNoZVBvbGljeSwgdGltZV90IF9leHBp
cmVEYXRlKQotOiBDYWNoZWRPYmplY3QodXJsLCBYU0xTdHlsZVNoZWV0LCBfY2FjaGVQb2xpY3ks
IF9leHBpcmVEYXRlKQotewotICAgIC8vIEl0J3MgWE1MIHdlIHdhbnQuCi0gICAgLy8gRklYTUU6
IFRoaXMgc2hvdWxkIGFjY2VwdCBtb3JlIGdlbmVyYWwgeG1sIGZvcm1hdHMgKi8qK3htbCwgaW1h
Z2Uvc3ZnK3htbCBmb3IgZXhhbXBsZS4KLSAgICBzZXRBY2NlcHQoInRleHQveG1sLCBhcHBsaWNh
dGlvbi94bWwsIGFwcGxpY2F0aW9uL3hodG1sK3htbCwgdGV4dC94c2wsIGFwcGxpY2F0aW9uL3Jz
cyt4bWwsIGFwcGxpY2F0aW9uL2F0b20reG1sIik7Ci0gICAgCi0gICAgLy8gbG9hZCB0aGUgZmls
ZQotICAgIENhY2hlOjpsb2FkZXIoKS0+bG9hZChkbCwgdGhpcywgZmFsc2UpOwotICAgIG1fbG9h
ZGluZyA9IHRydWU7Ci0gICAgbV9kZWNvZGVyID0gbmV3IERlY29kZXI7Ci19Ci0KLXZvaWQgQ2Fj
aGVkWFNMU3R5bGVTaGVldDo6cmVmKENhY2hlZE9iamVjdENsaWVudCAqYykKLXsKLSAgICBDYWNo
ZWRPYmplY3Q6OnJlZihjKTsKLSAgICAKLSAgICBpZiAoIW1fbG9hZGluZykKLSAgICAgICAgYy0+
c2V0U3R5bGVTaGVldChtX3VybCwgbV9zaGVldCk7Ci19Ci0KLXZvaWQgQ2FjaGVkWFNMU3R5bGVT
aGVldDo6ZGVyZWYoQ2FjaGVkT2JqZWN0Q2xpZW50ICpjKQotewotICAgIENhY2hlOjpmbHVzaCgp
OwotICAgIENhY2hlZE9iamVjdDo6ZGVyZWYoYyk7Ci0gICAgaWYgKGNhbkRlbGV0ZSgpICYmIG1f
ZnJlZSkKLSAgICAgICAgZGVsZXRlIHRoaXM7Ci19Ci0KLXZvaWQgQ2FjaGVkWFNMU3R5bGVTaGVl
dDo6c2V0Q2hhcnNldCggY29uc3QgUVN0cmluZyAmY2hzICkKLXsKLSAgICBpZiAoIWNocy5pc0Vt
cHR5KCkpCi0gICAgICAgIG1fZGVjb2Rlci0+c2V0RW5jb2RpbmcoY2hzLmxhdGluMSgpLCBEZWNv
ZGVyOjpFbmNvZGluZ0Zyb21IVFRQSGVhZGVyKTsKLX0KLQotdm9pZCBDYWNoZWRYU0xTdHlsZVNo
ZWV0OjpkYXRhKFFCdWZmZXIgJmJ1ZmZlciwgYm9vbCBlb2YpCi17Ci0gICAgaWYoIWVvZikgcmV0
dXJuOwotICAgIGJ1ZmZlci5jbG9zZSgpOwotICAgIHNldFNpemUoYnVmZmVyLmJ1ZmZlcigpLnNp
emUoKSk7Ci0gICAgUVN0cmluZyBkYXRhID0gbV9kZWNvZGVyLT5kZWNvZGUoYnVmZmVyLmJ1ZmZl
cigpLmRhdGEoKSwgc2l6ZSgpKTsKLSAgICBtX3NoZWV0ID0gRE9NU3RyaW5nKGRhdGEpOwotICAg
IG1fbG9hZGluZyA9IGZhbHNlOwotICAgIAotICAgIGNoZWNrTm90aWZ5KCk7Ci19Ci0KLXZvaWQg
Q2FjaGVkWFNMU3R5bGVTaGVldDo6Y2hlY2tOb3RpZnkoKQotewotICAgIGlmIChtX2xvYWRpbmcp
Ci0gICAgICAgIHJldHVybjsKLSAgICAKLSAgICBDYWNoZWRPYmplY3RDbGllbnRXYWxrZXIgdyht
X2NsaWVudHMpOwotICAgIHdoaWxlIChDYWNoZWRPYmplY3RDbGllbnQgKmMgPSB3Lm5leHQoKSkK
LSAgICAgICAgYy0+c2V0U3R5bGVTaGVldChtX3VybCwgbV9zaGVldCk7Ci19Ci0KLQotdm9pZCBD
YWNoZWRYU0xTdHlsZVNoZWV0OjplcnJvciggaW50IC8qZXJyKi8sIGNvbnN0IGNoYXIgKi8qdGV4
dCovICkKLXsKLSAgICBtX2xvYWRpbmcgPSBmYWxzZTsKLSAgICBjaGVja05vdGlmeSgpOwotfQot
Ci0jZW5kaWYKLQotI2lmbmRlZiBLSFRNTF9OT19YQkwKLUNhY2hlZFhCTERvY3VtZW50OjpDYWNo
ZWRYQkxEb2N1bWVudChEb2NMb2FkZXIqIGRsLCBjb25zdCBET01TdHJpbmcgJnVybCwgS0lPOjpD
YWNoZUNvbnRyb2wgX2NhY2hlUG9saWN5LCB0aW1lX3QgX2V4cGlyZURhdGUpCi06IENhY2hlZE9i
amVjdCh1cmwsIFhCTCwgX2NhY2hlUG9saWN5LCBfZXhwaXJlRGF0ZSksIG1fZG9jdW1lbnQoMCkK
LXsKLSAgICAvLyBJdCdzIFhNTCB3ZSB3YW50LgotICAgIHNldEFjY2VwdCgidGV4dC94bWwsIGFw
cGxpY2F0aW9uL3htbCwgYXBwbGljYXRpb24veGh0bWwreG1sLCB0ZXh0L3hzbCwgYXBwbGljYXRp
b24vcnNzK3htbCwgYXBwbGljYXRpb24vYXRvbSt4bWwiKTsKLSAgICAKLSAgICAvLyBMb2FkIHRo
ZSBmaWxlCi0gICAgQ2FjaGU6OmxvYWRlcigpLT5sb2FkKGRsLCB0aGlzLCBmYWxzZSk7Ci0gICAg
bV9sb2FkaW5nID0gdHJ1ZTsKLSAgICBtX2RlY29kZXIgPSBuZXcgRGVjb2RlcjsKLX0KLQotQ2Fj
aGVkWEJMRG9jdW1lbnQ6On5DYWNoZWRYQkxEb2N1bWVudCgpCi17Ci0gICAgaWYgKG1fZG9jdW1l
bnQpCi0gICAgICAgIG1fZG9jdW1lbnQtPmRlcmVmKCk7Ci19Ci0KLXZvaWQgQ2FjaGVkWEJMRG9j
dW1lbnQ6OnJlZihDYWNoZWRPYmplY3RDbGllbnQgKmMpCi17Ci0gICAgQ2FjaGVkT2JqZWN0Ojpy
ZWYoYyk7Ci0gICAgaWYgKCFtX2xvYWRpbmcpCi0gICAgICAgIGMtPnNldFhCTERvY3VtZW50KG1f
dXJsLCBtX2RvY3VtZW50KTsKLX0KLQotdm9pZCBDYWNoZWRYQkxEb2N1bWVudDo6ZGVyZWYoQ2Fj
aGVkT2JqZWN0Q2xpZW50ICpjKQotewotICAgIENhY2hlOjpmbHVzaCgpOwotICAgIENhY2hlZE9i
amVjdDo6ZGVyZWYoYyk7Ci0gICAgaWYgKGNhbkRlbGV0ZSgpICYmIG1fZnJlZSkKLSAgICAgICAg
ZGVsZXRlIHRoaXM7Ci19Ci0KLXZvaWQgQ2FjaGVkWEJMRG9jdW1lbnQ6OnNldENoYXJzZXQoIGNv
bnN0IFFTdHJpbmcgJmNocyApCi17Ci0gICAgaWYgKCFjaHMuaXNFbXB0eSgpKQotICAgICAgICBt
X2RlY29kZXItPnNldEVuY29kaW5nKGNocy5sYXRpbjEoKSwgRGVjb2Rlcjo6RW5jb2RpbmdGcm9t
SFRUUEhlYWRlcik7Ci19Ci0KLXZvaWQgQ2FjaGVkWEJMRG9jdW1lbnQ6OmRhdGEoIFFCdWZmZXIg
JmJ1ZmZlciwgYm9vbCBlb2YgKQotewotICAgIGlmICghZW9mKSByZXR1cm47Ci0gICAgCi0gICAg
YXNzZXJ0KCFtX2RvY3VtZW50KTsKLSAgICAKLSAgICBtX2RvY3VtZW50ID0gIG5ldyBYQkw6OlhC
TERvY3VtZW50SW1wbCgpOwotICAgIG1fZG9jdW1lbnQtPnJlZigpOwotICAgIG1fZG9jdW1lbnQt
Pm9wZW4oKTsKLSAgICAKLSAgICBRU3RyaW5nIGRhdGEgPSBtX2RlY29kZXItPmRlY29kZShidWZm
ZXIuYnVmZmVyKCkuZGF0YSgpLCBidWZmZXIuYnVmZmVyKCkuc2l6ZSgpKTsKLSAgICBtX2RvY3Vt
ZW50LT53cml0ZShkYXRhKTsKLSAgICBzZXRTaXplKGJ1ZmZlci5idWZmZXIoKS5zaXplKCkpOwot
ICAgIGJ1ZmZlci5jbG9zZSgpOwotICAgIAotICAgIG1fZG9jdW1lbnQtPmZpbmlzaFBhcnNpbmco
KTsKLSAgICBtX2RvY3VtZW50LT5jbG9zZSgpOwotICAgIG1fbG9hZGluZyA9IGZhbHNlOwotICAg
IGNoZWNrTm90aWZ5KCk7Ci19Ci0KLXZvaWQgQ2FjaGVkWEJMRG9jdW1lbnQ6OmNoZWNrTm90aWZ5
KCkKLXsKLSAgICBpZihtX2xvYWRpbmcpCi0gICAgICAgIHJldHVybjsKLSAgICAKLSAgICBDYWNo
ZWRPYmplY3RDbGllbnRXYWxrZXIgdyhtX2NsaWVudHMpOwotICAgIHdoaWxlIChDYWNoZWRPYmpl
Y3RDbGllbnQgKmMgPSB3Lm5leHQoKSkKLSAgICAgICAgYy0+c2V0WEJMRG9jdW1lbnQobV91cmws
IG1fZG9jdW1lbnQpOwotfQotCi0KLXZvaWQgQ2FjaGVkWEJMRG9jdW1lbnQ6OmVycm9yKCBpbnQg
LyplcnIqLywgY29uc3QgY2hhciAqLyp0ZXh0Ki8gKQotewotICAgIG1fbG9hZGluZyA9IGZhbHNl
OwotICAgIGNoZWNrTm90aWZ5KCk7Ci19Ci0jZW5kaWYKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tCi0KLVJlcXVlc3Q6OlJlcXVlc3QoRG9jTG9hZGVyKiBkbCwgQ2FjaGVk
T2JqZWN0ICpfb2JqZWN0LCBib29sIF9pbmNyZW1lbnRhbCkKLXsKLSAgICBvYmplY3QgPSBfb2Jq
ZWN0OwotICAgIG9iamVjdC0+c2V0UmVxdWVzdCh0aGlzKTsKLSAgICBpbmNyZW1lbnRhbCA9IF9p
bmNyZW1lbnRhbDsKLSAgICBtX2RvY0xvYWRlciA9IGRsOwotICAgIG11bHRpcGFydCA9IGZhbHNl
OwotfQotCi1SZXF1ZXN0Ojp+UmVxdWVzdCgpCi17Ci0gICAgb2JqZWN0LT5zZXRSZXF1ZXN0KDAp
OwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotRG9jTG9hZGVy
OjpEb2NMb2FkZXIoS0hUTUxQYXJ0KiBwYXJ0LCBEb2N1bWVudEltcGwqIGRvYykKLXsKLSAgICBt
X2NhY2hlUG9saWN5ID0gS0lPOjpDQ19WZXJpZnk7Ci0gICAgbV9leHBpcmVEYXRlID0gMDsKLSAg
ICBtX2JhdXRvbG9hZEltYWdlcyA9IHRydWU7Ci0gICAgbV9zaG93QW5pbWF0aW9ucyA9IEtIVE1M
U2V0dGluZ3M6OktBbmltYXRpb25FbmFibGVkOwotICAgIG1fcGFydCA9IHBhcnQ7Ci0gICAgbV9k
b2MgPSBkb2M7Ci0gICAgbV9sb2FkSW5Qcm9ncmVzcyA9IGZhbHNlOwotCi0gICAgQ2FjaGU6Omlu
aXQoKTsKLSAgICBDYWNoZTo6ZG9jbG9hZGVyLT5hcHBlbmQoIHRoaXMgKTsKLX0KLQotRG9jTG9h
ZGVyOjp+RG9jTG9hZGVyKCkKLXsKLSAgICBDYWNoZTo6ZG9jbG9hZGVyLT5yZW1vdmUoIHRoaXMg
KTsKLX0KLQotdm9pZCBEb2NMb2FkZXI6OnNldEV4cGlyZURhdGUodGltZV90IF9leHBpcmVEYXRl
KQotewotICAgIG1fZXhwaXJlRGF0ZSA9IF9leHBpcmVEYXRlOwotfQotCi1ib29sIERvY0xvYWRl
cjo6bmVlZFJlbG9hZChjb25zdCBLVVJMICZmdWxsVVJMKQotewotICAgIGJvb2wgcmVsb2FkID0g
ZmFsc2U7Ci0gICAgaWYgKG1fY2FjaGVQb2xpY3kgPT0gS0lPOjpDQ19WZXJpZnkpCi0gICAgewot
ICAgICAgIGlmICghbV9yZWxvYWRlZFVSTHMuY29udGFpbnMoZnVsbFVSTC51cmwoKSkpCi0gICAg
ICAgewotICAgICAgICAgIENhY2hlZE9iamVjdCAqZXhpc3RpbmcgPSBDYWNoZTo6Y2FjaGUtPmZp
bmQoZnVsbFVSTC51cmwoKSk7Ci0gICAgICAgICAgaWYgKGV4aXN0aW5nICYmIGV4aXN0aW5nLT5p
c0V4cGlyZWQoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAgQ2FjaGU6OnJlbW92ZUNhY2hl
RW50cnkoZXhpc3RpbmcpOwotICAgICAgICAgICAgIG1fcmVsb2FkZWRVUkxzLmFwcGVuZChmdWxs
VVJMLnVybCgpKTsKLSAgICAgICAgICAgICByZWxvYWQgPSB0cnVlOwotICAgICAgICAgIH0KLSAg
ICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKChtX2NhY2hlUG9saWN5ID09IEtJTzo6Q0NfUmVs
b2FkKSB8fCAobV9jYWNoZVBvbGljeSA9PSBLSU86OkNDX1JlZnJlc2gpKQotICAgIHsKLSAgICAg
ICBpZiAoIW1fcmVsb2FkZWRVUkxzLmNvbnRhaW5zKGZ1bGxVUkwudXJsKCkpKQotICAgICAgIHsK
LSAgICAgICAgICBDYWNoZWRPYmplY3QgKmV4aXN0aW5nID0gQ2FjaGU6OmNhY2hlLT5maW5kKGZ1
bGxVUkwudXJsKCkpOwotICAgICAgICAgIGlmIChleGlzdGluZykKLSAgICAgICAgICB7Ci0gICAg
ICAgICAgICAgQ2FjaGU6OnJlbW92ZUNhY2hlRW50cnkoZXhpc3RpbmcpOwotICAgICAgICAgIH0K
LSAgICAgICAgICBtX3JlbG9hZGVkVVJMcy5hcHBlbmQoZnVsbFVSTC51cmwoKSk7Ci0gICAgICAg
ICAgcmVsb2FkID0gdHJ1ZTsKLSAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZWxvYWQ7Ci19
Ci0KLUNhY2hlZEltYWdlICpEb2NMb2FkZXI6OnJlcXVlc3RJbWFnZSggY29uc3QgRE9NOjpET01T
dHJpbmcgJnVybCkKLXsKLSAgICBLVVJMIGZ1bGxVUkwgPSBtX2RvYy0+Y29tcGxldGVVUkwodXJs
LnFzdHJpbmcoKSk7Ci0gICAgaWYgKCBtX3BhcnQgJiYgbV9wYXJ0LT5vbmx5TG9jYWxSZWZlcmVu
Y2VzKCkgJiYgZnVsbFVSTC5wcm90b2NvbCgpICE9ICJmaWxlIikgcmV0dXJuIDA7Ci0KLSAgICBp
ZiAoS1dRQ2hlY2tJZlJlbG9hZGluZyh0aGlzKSkgewotICAgICAgICBzZXRDYWNoZVBvbGljeShL
SU86OkNDX1JlbG9hZCk7Ci0gICAgfQotCi0gICAgYm9vbCByZWxvYWQgPSBuZWVkUmVsb2FkKGZ1
bGxVUkwpOwotCi0gICAgQ2FjaGVkSW1hZ2UgKmNhY2hlZE9iamVjdCA9IENhY2hlOjpyZXF1ZXN0
SW1hZ2UodGhpcywgZnVsbFVSTCwgcmVsb2FkLCBtX2V4cGlyZURhdGUpOwotICAgIEtXUUNoZWNr
Q2FjaGVPYmplY3RTdGF0dXModGhpcywgY2FjaGVkT2JqZWN0KTsKLSAgICByZXR1cm4gY2FjaGVk
T2JqZWN0OwotfQotCi1DYWNoZWRDU1NTdHlsZVNoZWV0ICpEb2NMb2FkZXI6OnJlcXVlc3RTdHls
ZVNoZWV0KCBjb25zdCBET006OkRPTVN0cmluZyAmdXJsLCBjb25zdCBRU3RyaW5nJiBjaGFyc2V0
KQotewotICAgIEtVUkwgZnVsbFVSTCA9IG1fZG9jLT5jb21wbGV0ZVVSTCh1cmwucXN0cmluZygp
KTsKLSAgICBpZiAoIG1fcGFydCAmJiBtX3BhcnQtPm9ubHlMb2NhbFJlZmVyZW5jZXMoKSAmJiBm
dWxsVVJMLnByb3RvY29sKCkgIT0gImZpbGUiKSByZXR1cm4gMDsKLQotICAgIGlmIChLV1FDaGVj
a0lmUmVsb2FkaW5nKHRoaXMpKSB7Ci0gICAgICAgIHNldENhY2hlUG9saWN5KEtJTzo6Q0NfUmVs
b2FkKTsKLSAgICB9Ci0KLSAgICBib29sIHJlbG9hZCA9IG5lZWRSZWxvYWQoZnVsbFVSTCk7Ci0K
LSAgICBDYWNoZWRDU1NTdHlsZVNoZWV0ICpjYWNoZWRPYmplY3QgPSBDYWNoZTo6cmVxdWVzdFN0
eWxlU2hlZXQodGhpcywgdXJsLCByZWxvYWQsIG1fZXhwaXJlRGF0ZSwgY2hhcnNldCk7Ci0gICAg
S1dRQ2hlY2tDYWNoZU9iamVjdFN0YXR1cyh0aGlzLCBjYWNoZWRPYmplY3QpOwotICAgIHJldHVy
biBjYWNoZWRPYmplY3Q7Ci19Ci0KLUNhY2hlZFNjcmlwdCAqRG9jTG9hZGVyOjpyZXF1ZXN0U2Ny
aXB0KCBjb25zdCBET006OkRPTVN0cmluZyAmdXJsLCBjb25zdCBRU3RyaW5nJiBjaGFyc2V0KQot
ewotICAgIEtVUkwgZnVsbFVSTCA9IG1fZG9jLT5jb21wbGV0ZVVSTCh1cmwucXN0cmluZygpKTsK
LSAgICBpZiAoIG1fcGFydCAmJiBtX3BhcnQtPm9ubHlMb2NhbFJlZmVyZW5jZXMoKSAmJiBmdWxs
VVJMLnByb3RvY29sKCkgIT0gImZpbGUiKSByZXR1cm4gMDsKLQotICAgIGlmIChLV1FDaGVja0lm
UmVsb2FkaW5nKHRoaXMpKSB7Ci0gICAgICAgIHNldENhY2hlUG9saWN5KEtJTzo6Q0NfUmVsb2Fk
KTsKLSAgICB9Ci0KLSAgICBib29sIHJlbG9hZCA9IG5lZWRSZWxvYWQoZnVsbFVSTCk7Ci0KLSAg
ICBDYWNoZWRTY3JpcHQgKmNhY2hlZE9iamVjdCA9IENhY2hlOjpyZXF1ZXN0U2NyaXB0KHRoaXMs
IHVybCwgcmVsb2FkLCBtX2V4cGlyZURhdGUsIGNoYXJzZXQpOwotICAgIEtXUUNoZWNrQ2FjaGVP
YmplY3RTdGF0dXModGhpcywgY2FjaGVkT2JqZWN0KTsKLSAgICByZXR1cm4gY2FjaGVkT2JqZWN0
OwotfQotCi0jaWZkZWYgS0hUTUxfWFNMVAotQ2FjaGVkWFNMU3R5bGVTaGVldCogRG9jTG9hZGVy
OjpyZXF1ZXN0WFNMU3R5bGVTaGVldChjb25zdCBET006OkRPTVN0cmluZyAmdXJsKQotewotICAg
IEtVUkwgZnVsbFVSTCA9IG1fZG9jLT5jb21wbGV0ZVVSTCh1cmwucXN0cmluZygpKTsKLSAgICAK
LSAgICBpZiAobV9wYXJ0ICYmIG1fcGFydC0+b25seUxvY2FsUmVmZXJlbmNlcygpICYmIGZ1bGxV
UkwucHJvdG9jb2woKSAhPSAiZmlsZSIpIHJldHVybiAwOwotICAgIAotICAgIGlmIChLV1FDaGVj
a0lmUmVsb2FkaW5nKHRoaXMpKQotICAgICAgICBzZXRDYWNoZVBvbGljeShLSU86OkNDX1JlbG9h
ZCk7Ci0gICAgCi0gICAgYm9vbCByZWxvYWQgPSBuZWVkUmVsb2FkKGZ1bGxVUkwpOwotICAgIAot
ICAgIENhY2hlZFhTTFN0eWxlU2hlZXQgKmNhY2hlZE9iamVjdCA9IENhY2hlOjpyZXF1ZXN0WFNM
U3R5bGVTaGVldCh0aGlzLCB1cmwsIHJlbG9hZCwgbV9leHBpcmVEYXRlKTsKLSAgICBLV1FDaGVj
a0NhY2hlT2JqZWN0U3RhdHVzKHRoaXMsIGNhY2hlZE9iamVjdCk7Ci0gICAgcmV0dXJuIGNhY2hl
ZE9iamVjdDsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIEtIVE1MX05PX1hCTAotQ2FjaGVkWEJMRG9j
dW1lbnQqIERvY0xvYWRlcjo6cmVxdWVzdFhCTERvY3VtZW50KGNvbnN0IERPTTo6RE9NU3RyaW5n
ICZ1cmwpCi17Ci0gICAgS1VSTCBmdWxsVVJMID0gbV9kb2MtPmNvbXBsZXRlVVJMKHVybC5xc3Ry
aW5nKCkpOwotICAgIAotICAgIC8vIEZJWE1FOiBJcyB0aGlzIHJpZ2h0IGZvciBYQkw/Ci0gICAg
aWYgKG1fcGFydCAmJiBtX3BhcnQtPm9ubHlMb2NhbFJlZmVyZW5jZXMoKSAmJiBmdWxsVVJMLnBy
b3RvY29sKCkgIT0gImZpbGUiKSByZXR1cm4gMDsKLSAgICAKLSAgICBpZiAoS1dRQ2hlY2tJZlJl
bG9hZGluZyh0aGlzKSkgewotICAgICAgICBzZXRDYWNoZVBvbGljeShLSU86OkNDX1JlbG9hZCk7
Ci0gICAgfQotICAgIAotICAgIGJvb2wgcmVsb2FkID0gbmVlZFJlbG9hZChmdWxsVVJMKTsKLSAg
ICAKLSAgICBDYWNoZWRYQkxEb2N1bWVudCAqY2FjaGVkT2JqZWN0ID0gQ2FjaGU6OnJlcXVlc3RY
QkxEb2N1bWVudCh0aGlzLCB1cmwsIHJlbG9hZCwgbV9leHBpcmVEYXRlKTsKLSAgICBLV1FDaGVj
a0NhY2hlT2JqZWN0U3RhdHVzKHRoaXMsIGNhY2hlZE9iamVjdCk7Ci0gICAgcmV0dXJuIGNhY2hl
ZE9iamVjdDsKLX0KLSNlbmRpZgotCi12b2lkIERvY0xvYWRlcjo6c2V0QXV0b2xvYWRJbWFnZXMo
IGJvb2wgZW5hYmxlICkKLXsKLSAgICBpZiAoIGVuYWJsZSA9PSBtX2JhdXRvbG9hZEltYWdlcyAp
Ci0gICAgICAgIHJldHVybjsKLQotICAgIG1fYmF1dG9sb2FkSW1hZ2VzID0gZW5hYmxlOwotCi0g
ICAgaWYgKCAhbV9iYXV0b2xvYWRJbWFnZXMgKSByZXR1cm47Ci0KLSAgICBmb3IgKCBjb25zdCBD
YWNoZWRPYmplY3QqIGNvPW1fZG9jT2JqZWN0cy5maXJzdCgpOyBjbzsgY289bV9kb2NPYmplY3Rz
Lm5leHQoKSApCi0gICAgICAgIGlmICggY28tPnR5cGUoKSA9PSBDYWNoZWRPYmplY3Q6OkltYWdl
ICkKLSAgICAgICAgewotICAgICAgICAgICAgQ2FjaGVkSW1hZ2UgKmltZyA9IGNvbnN0X2Nhc3Q8
Q2FjaGVkSW1hZ2UqPiggc3RhdGljX2Nhc3Q8Y29uc3QgQ2FjaGVkSW1hZ2UgKj4oIGNvICkgKTsK
LQotICAgICAgICAgICAgQ2FjaGVkT2JqZWN0OjpTdGF0dXMgc3RhdHVzID0gaW1nLT5zdGF0dXMo
KTsKLSAgICAgICAgICAgIGlmICggc3RhdHVzICE9IENhY2hlZE9iamVjdDo6VW5rbm93biApCi0g
ICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgIENhY2hlOjpsb2FkZXIoKS0+
bG9hZCh0aGlzLCBpbWcsIHRydWUpOwotICAgICAgICB9Ci19Ci0KLXZvaWQgRG9jTG9hZGVyOjpz
ZXRDYWNoZVBvbGljeSggS0lPOjpDYWNoZUNvbnRyb2wgY2FjaGVQb2xpY3kgKQotewotICAgIG1f
Y2FjaGVQb2xpY3kgPSBjYWNoZVBvbGljeTsKLX0KLQotdm9pZCBEb2NMb2FkZXI6OnNldFNob3dB
bmltYXRpb25zKCBLSFRNTFNldHRpbmdzOjpLQW5pbWF0aW9uQWR2aWNlIHNob3dBbmltYXRpb25z
ICkKLXsKLSAgICBpZiAoIHNob3dBbmltYXRpb25zID09IG1fc2hvd0FuaW1hdGlvbnMgKSByZXR1
cm47Ci0gICAgbV9zaG93QW5pbWF0aW9ucyA9IHNob3dBbmltYXRpb25zOwotCi0gICAgY29uc3Qg
Q2FjaGVkT2JqZWN0KiBjbzsKLSAgICBmb3IgKCBjbz1tX2RvY09iamVjdHMuZmlyc3QoKTsgY287
IGNvPW1fZG9jT2JqZWN0cy5uZXh0KCkgKQotICAgICAgICBpZiAoIGNvLT50eXBlKCkgPT0gQ2Fj
aGVkT2JqZWN0OjpJbWFnZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIENhY2hlZEltYWdlICpp
bWcgPSBjb25zdF9jYXN0PENhY2hlZEltYWdlKj4oIHN0YXRpY19jYXN0PGNvbnN0IENhY2hlZElt
YWdlICo+KCBjbyApICk7Ci0KLSAgICAgICAgICAgIGltZy0+c2V0U2hvd0FuaW1hdGlvbnMoIHNo
b3dBbmltYXRpb25zICk7Ci0gICAgICAgIH0KLX0KLQotdm9pZCBEb2NMb2FkZXI6OnJlbW92ZUNh
Y2hlZE9iamVjdCggQ2FjaGVkT2JqZWN0KiBvICkgY29uc3QKLXsKLSAgICBtX2RvY09iamVjdHMu
cmVtb3ZlUmVmKCBvICk7Ci19Ci0KLXZvaWQgRG9jTG9hZGVyOjpzZXRMb2FkSW5Qcm9ncmVzcyhi
b29sIGxvYWQpCi17Ci0gICAgbV9sb2FkSW5Qcm9ncmVzcyA9IGxvYWQ7Ci19Ci0KLS8vIC0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1Mb2FkZXI6OkxvYWRlcigpIDogUU9iamVj
dCgpCi17Ci0gICAgbV9yZXF1ZXN0c1BlbmRpbmcuc2V0QXV0b0RlbGV0ZSggdHJ1ZSApOwotICAg
IG1fcmVxdWVzdHNMb2FkaW5nLnNldEF1dG9EZWxldGUoIHRydWUgKTsKLSAgICBrd3EgPSBuZXcg
S1dRTG9hZGVyKHRoaXMpOwotfQotCi1Mb2FkZXI6On5Mb2FkZXIoKQotewotICAgIGRlbGV0ZSBr
d3E7Ci19Ci0KLXZvaWQgTG9hZGVyOjpsb2FkKERvY0xvYWRlciogZGwsIENhY2hlZE9iamVjdCAq
b2JqZWN0LCBib29sIGluY3JlbWVudGFsKQotewotICAgIFJlcXVlc3QgKnJlcSA9IG5ldyBSZXF1
ZXN0KGRsLCBvYmplY3QsIGluY3JlbWVudGFsKTsKLSAgICBtX3JlcXVlc3RzUGVuZGluZy5hcHBl
bmQocmVxKTsKLQotICAgIGVtaXQgcmVxdWVzdFN0YXJ0ZWQoIHJlcS0+bV9kb2NMb2FkZXIsIHJl
cS0+b2JqZWN0ICk7Ci0KLSAgICBzZXJ2ZVBlbmRpbmdSZXF1ZXN0cygpOwotfQotCi12b2lkIExv
YWRlcjo6c2VydmVQZW5kaW5nUmVxdWVzdHMoKQotewotICBpZiAoIG1fcmVxdWVzdHNQZW5kaW5n
LmNvdW50KCkgPT0gMCApCi0gICAgICByZXR1cm47Ci0KLSAgLy8gZ2V0IHRoZSBmaXJzdCBwZW5k
aW5nIHJlcXVlc3QKLSAgUmVxdWVzdCAqcmVxID0gbV9yZXF1ZXN0c1BlbmRpbmcudGFrZSgwKTsK
LQotICBLVVJMIHUocmVxLT5vYmplY3QtPnVybCgpLnFzdHJpbmcoKSk7Ci0gIEtJTzo6VHJhbnNm
ZXJKb2IqIGpvYiA9IEtJTzo6Z2V0KCB1LCBmYWxzZSwgZmFsc2UgLypubyBHVUkqLywgdHJ1ZSk7
Ci0gIAotICBqb2ItPmFkZE1ldGFEYXRhKCJjYWNoZSIsIGdldENhY2hlQ29udHJvbFN0cmluZyhy
ZXEtPm9iamVjdC0+Y2FjaGVQb2xpY3koKSkpOwotICBpZiAoIXJlcS0+b2JqZWN0LT5hY2NlcHQo
KS5pc0VtcHR5KCkpCi0gICAgICBqb2ItPmFkZE1ldGFEYXRhKCJhY2NlcHQiLCByZXEtPm9iamVj
dC0+YWNjZXB0KCkpOwotICBpZiAoIHJlcS0+bV9kb2NMb2FkZXIgKSAgewotICAgICAgS1VSTCBy
ID0gcmVxLT5tX2RvY0xvYWRlci0+ZG9jKCktPlVSTCgpOwotICAgICAgaWYgKCByLnByb3RvY29s
KCkuc3RhcnRzV2l0aCggImh0dHAiICkgJiYgci5wYXRoKCkuaXNFbXB0eSgpICkKLSAgICAgICAg
ICByLnNldFBhdGgoICIvIiApOwotCi0gICAgICBqb2ItPmFkZE1ldGFEYXRhKCJyZWZlcnJlciIs
IHIudXJsKCkpOwotICAgICAgUVN0cmluZyBkb21haW4gPSByLmhvc3QoKTsKLSAgICAgIGlmIChy
ZXEtPm1fZG9jTG9hZGVyLT5kb2MoKS0+aXNIVE1MRG9jdW1lbnQoKSkKLSAgICAgICAgIGRvbWFp
biA9IHN0YXRpY19jYXN0PEhUTUxEb2N1bWVudEltcGwqPihyZXEtPm1fZG9jTG9hZGVyLT5kb2Mo
KSktPmRvbWFpbigpLnFzdHJpbmcoKTsKLSAgICAgIGlmIChjcm9zc0RvbWFpbih1Lmhvc3QoKSwg
ZG9tYWluKSkKLSAgICAgICAgIGpvYi0+YWRkTWV0YURhdGEoImNyb3NzLWRvbWFpbiIsICJ0cnVl
Iik7Ci0gIH0KLQotICBjb25uZWN0KCBqb2IsIFNJR05BTCggcmVzdWx0KCBLSU86OkpvYiAqLCBO
U0RhdGEgKikgKSwgdGhpcywgU0xPVCggc2xvdEZpbmlzaGVkKCBLSU86OkpvYiAqLCBOU0RhdGEg
KikgKSApOwotICAKLSAgY29ubmVjdCggam9iLCBTSUdOQUwoIGRhdGEoIEtJTzo6Sm9iKiwgY29u
c3QgY2hhciAqLCBpbnQpKSwKLSAgICAgICAgICAgU0xPVCggc2xvdERhdGEoIEtJTzo6Sm9iKiwg
Y29uc3QgY2hhciAqLCBpbnQpKSk7Ci0gIGNvbm5lY3QoIGpvYiwgU0lHTkFMKCByZWNlaXZlZFJl
c3BvbnNlKCBLSU86OkpvYiAqLCBOU1VSTFJlc3BvbnNlICopKSwgU0xPVCggc2xvdFJlY2VpdmVk
UmVzcG9uc2UoIEtJTzo6Sm9iICosIE5TVVJMUmVzcG9uc2UgKikpICk7Ci0KLSAgaWYgKEtXUVNl
cnZlUmVxdWVzdCh0aGlzLCByZXEsIGpvYikpIHsKLSAgICAgIGlmIChyZXEtPm9iamVjdC0+dHlw
ZSgpID09IENhY2hlZE9iamVjdDo6SW1hZ2UpIHsKLQlDYWNoZWRJbWFnZSAqY2kgPSBzdGF0aWNf
Y2FzdDxDYWNoZWRJbWFnZSo+KHJlcS0+b2JqZWN0KTsKLQlpZiAoY2ktPmRlY29kZXJDYWxsYmFj
aygpKSB7Ci0JICAgIG1fcmVxdWVzdHNCYWNrZ3JvdW5kRGVjb2RpbmcuYXBwZW5kKHJlcSk7Ci0J
fQotICAgICAgfQotICAgICAgbV9yZXF1ZXN0c0xvYWRpbmcuaW5zZXJ0KGpvYiwgcmVxKTsKLSAg
fQotfQotCi12b2lkIExvYWRlcjo6c2xvdEZpbmlzaGVkKCBLSU86OkpvYiogam9iLCBOU0RhdGEg
KmFsbERhdGEpCi17Ci0gICAgUmVxdWVzdCAqciA9IG1fcmVxdWVzdHNMb2FkaW5nLnRha2UoIGpv
YiApOwotICAgIEtJTzo6VHJhbnNmZXJKb2IqIGogPSBzdGF0aWNfY2FzdDxLSU86OlRyYW5zZmVy
Sm9iKj4oam9iKTsKLQotICAgIGlmICggIXIgKQotICAgICAgICByZXR1cm47Ci0KLSAgICBDYWNo
ZWRPYmplY3QgKm9iamVjdCA9IHItPm9iamVjdDsKLSAgICBEb2NMb2FkZXIgKmRvY0xvYWRlciA9
IHItPm1fZG9jTG9hZGVyOwotICAgIAotICAgIGJvb2wgYmFja2dyb3VuZEltYWdlRGVjb2Rpbmcg
PSAob2JqZWN0LT50eXBlKCkgPT0gQ2FjaGVkT2JqZWN0OjpJbWFnZSAmJiAKLQlzdGF0aWNfY2Fz
dDxDYWNoZWRJbWFnZSo+KG9iamVjdCktPmRlY29kZXJDYWxsYmFjaygpKTsKLQkKLSAgICBpZiAo
ai0+ZXJyb3IoKSB8fCBqLT5pc0Vycm9yUGFnZSgpKSB7Ci0gICAgICAgIC8vIFVzZSB0aGUgYmFj
a2dyb3VuZCBpbWFnZSBkZWNvZGVyJ3MgY2FsbGJhY2sgdG8gaGFuZGxlIHRoZSBlcnJvci4KLSAg
ICAgICAgaWYgKGJhY2tncm91bmRJbWFnZURlY29kaW5nKSB7Ci0gICAgICAgICAgICBDYWNoZWRJ
bWFnZUNhbGxiYWNrICpjYWxsYmFjayA9IHN0YXRpY19jYXN0PENhY2hlZEltYWdlKj4ob2JqZWN0
KS0+ZGVjb2RlckNhbGxiYWNrKCk7Ci0gICAgICAgICAgICBjYWxsYmFjay0+aGFuZGxlRXJyb3Io
KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGRvY0xvYWRlci0+c2V0
TG9hZEluUHJvZ3Jlc3ModHJ1ZSk7Ci0gICAgICAgICAgICByLT5vYmplY3QtPmVycm9yKCBqb2It
PmVycm9yKCksIGpvYi0+ZXJyb3JUZXh0KCkuYXNjaWkoKSApOwotICAgICAgICAgICAgZG9jTG9h
ZGVyLT5zZXRMb2FkSW5Qcm9ncmVzcyhmYWxzZSk7Ci0gICAgICAgICAgICBlbWl0IHJlcXVlc3RG
YWlsZWQoIGRvY0xvYWRlciwgb2JqZWN0ICk7Ci0gICAgICAgICAgICBDYWNoZTo6cmVtb3ZlQ2Fj
aGVFbnRyeSggb2JqZWN0ICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAg
IGRvY0xvYWRlci0+c2V0TG9hZEluUHJvZ3Jlc3ModHJ1ZSk7Ci0gICAgICAgIG9iamVjdC0+ZGF0
YShyLT5tX2J1ZmZlciwgdHJ1ZSk7Ci0gICAgICAgIHItPm9iamVjdC0+c2V0QWxsRGF0YShhbGxE
YXRhKTsKLSAgICAgICAgZG9jTG9hZGVyLT5zZXRMb2FkSW5Qcm9ncmVzcyhmYWxzZSk7Ci0gICAg
ICAgIAotICAgICAgICAvLyBMZXQgdGhlIGJhY2tncm91bmQgaW1hZ2UgZGVjb2RlciB0cmlnZ2Vy
IHRoZSBkb25lIHNpZ25hbC4KLSAgICAgICAgaWYgKCFiYWNrZ3JvdW5kSW1hZ2VEZWNvZGluZykK
LSAgICAgICAgICAgIGVtaXQgcmVxdWVzdERvbmUoIGRvY0xvYWRlciwgb2JqZWN0ICk7Ci0KLSAg
ICAgICAgb2JqZWN0LT5maW5pc2goKTsKLSAgICB9Ci0KLSAgICAvLyBMZXQgdGhlIGJhY2tncm91
bmQgaW1hZ2UgZGVjb2RlciByZWxlYXNlIHRoZSByZXF1ZXN0IHdoZW4gaXQgaXMKLSAgICAvLyBm
aW5pc2hlZC4KLSAgICBpZiAoIWJhY2tncm91bmRJbWFnZURlY29kaW5nKSB7Ci0gICAgICAgIGRl
bGV0ZSByOwotICAgIH0KLQotICAgIHNlcnZlUGVuZGluZ1JlcXVlc3RzKCk7Ci19Ci0KLQotdm9p
ZCBMb2FkZXI6OnNsb3RSZWNlaXZlZFJlc3BvbnNlKEtJTzo6Sm9iKiBqb2IsIE5TVVJMUmVzcG9u
c2UgKnJlc3BvbnNlKQotewotICAgIFJlcXVlc3QgKnIgPSBtX3JlcXVlc3RzTG9hZGluZ1tqb2Jd
OwotICAgIEFTU0VSVChyKTsKLSAgICBBU1NFUlQocmVzcG9uc2UpOwotICAgIHItPm9iamVjdC0+
c2V0UmVzcG9uc2UocmVzcG9uc2UpOwotICAgIHItPm9iamVjdC0+c2V0RXhwaXJlRGF0ZShLV1FD
YWNoZU9iamVjdEV4cGlyZXNUaW1lKHItPm1fZG9jTG9hZGVyLCByZXNwb25zZSksIGZhbHNlKTsK
LSAgICAKLSAgICBRU3RyaW5nIGNocyA9IHN0YXRpY19jYXN0PEtJTzo6VHJhbnNmZXJKb2IqPihq
b2IpLT5xdWVyeU1ldGFEYXRhKCJjaGFyc2V0Iik7Ci0gICAgaWYgKCFjaHMuaXNOdWxsKCkpCi0g
ICAgICAgIHItPm9iamVjdC0+c2V0Q2hhcnNldChjaHMpOwotICAgIAotICAgIGlmIChyLT5tdWx0
aXBhcnQpIHsKLSAgICAgICAgQVNTRVJUKHItPm9iamVjdC0+aXNJbWFnZSgpKTsKLSAgICAgICAg
c3RhdGljX2Nhc3Q8Q2FjaGVkSW1hZ2UgKj4oci0+b2JqZWN0KS0+Y2xlYXIoKTsKLSAgICAgICAg
ci0+bV9idWZmZXIgPSBRQnVmZmVyKCk7Ci0gICAgICAgIGlmIChyLT5tX2RvY0xvYWRlci0+cGFy
dCgpKQotICAgICAgICAgICAgci0+bV9kb2NMb2FkZXItPnBhcnQoKS0+Y2hlY2tDb21wbGV0ZWQo
KTsKLSAgICAgICAgCi0gICAgfSBlbHNlIGlmIChLV1FSZXNwb25zZUlzTXVsdGlwYXJ0KHJlc3Bv
bnNlKSkgewotICAgICAgICByLT5tdWx0aXBhcnQgPSB0cnVlOwotICAgICAgICBpZiAoIXItPm9i
amVjdC0+aXNJbWFnZSgpKQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8S0lPOjpUcmFuc2Zlckpv
Yio+KGpvYiktPmNhbmNlbCgpOwotICAgIH0KLX0KLQotCi12b2lkIExvYWRlcjo6c2xvdERhdGEo
IEtJTzo6Sm9iKmpvYiwgY29uc3QgY2hhciAqZGF0YSwgaW50IHNpemUgKQotewotICAgIFJlcXVl
c3QgKnIgPSBtX3JlcXVlc3RzTG9hZGluZ1tqb2JdOwotICAgIGlmKCFyKSB7Ci0gICAgICAgIGtk
RGVidWcoIDYwNjAgKSA8PCAiZ290IGRhdGEgZm9yIHVua25vd24gcmVxdWVzdCEiIDw8IGVuZGw7
Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoICFyLT5tX2J1ZmZlci5pc09wZW4o
KSApCi0gICAgICAgIHItPm1fYnVmZmVyLm9wZW4oIElPX1dyaXRlT25seSApOwotCi0gICAgci0+
bV9idWZmZXIud3JpdGVCbG9jayggZGF0YSwgc2l6ZSApOwotCi0gICAgaWYgKHItPm11bHRpcGFy
dCkKLSAgICAgICAgci0+b2JqZWN0LT5kYXRhKCByLT5tX2J1ZmZlciwgdHJ1ZSApOyAvLyB0aGUg
bG9hZGVyIGRlbGl2ZXJzIHRoZSBkYXRhIGluIGEgbXVsdGlwYXJ0IHNlY3Rpb24gYWxsIGF0IG9u
Y2UsIHNlbmQgZW9mCi0gICAgZWxzZSBpZihyLT5pbmNyZW1lbnRhbCkKLSAgICAgICAgci0+b2Jq
ZWN0LT5kYXRhKCByLT5tX2J1ZmZlciwgZmFsc2UgKTsKLX0KLQotaW50IExvYWRlcjo6bnVtUmVx
dWVzdHMoIERvY0xvYWRlciogZGwgKSBjb25zdAotewotICAgIGludCByZXMgPSAwOwotCi0gICAg
UVB0ckxpc3RJdGVyYXRvcjxSZXF1ZXN0PiBwSXQoIG1fcmVxdWVzdHNQZW5kaW5nICk7Ci0gICAg
Zm9yICg7IHBJdC5jdXJyZW50KCk7ICsrcEl0ICkKLSAgICAgICAgaWYgKCBwSXQuY3VycmVudCgp
LT5tX2RvY0xvYWRlciA9PSBkbCApCi0gICAgICAgICAgICByZXMrKzsKLQotICAgIFFQdHJEaWN0
SXRlcmF0b3I8UmVxdWVzdD4gbEl0KCBtX3JlcXVlc3RzTG9hZGluZyApOwotICAgIGZvciAoOyBs
SXQuY3VycmVudCgpOyArK2xJdCApCi0gICAgICAgIGlmICggbEl0LmN1cnJlbnQoKS0+bV9kb2NM
b2FkZXIgPT0gZGwgKQotICAgICAgICAgICAgaWYgKCFsSXQuY3VycmVudCgpLT5tdWx0aXBhcnQp
Ci0gICAgICAgICAgICAgICAgcmVzKys7Ci0KLSAgICBRUHRyTGlzdEl0ZXJhdG9yPFJlcXVlc3Q+
IGJkSXQoIG1fcmVxdWVzdHNCYWNrZ3JvdW5kRGVjb2RpbmcgKTsKLSAgICBmb3IgKDsgYmRJdC5j
dXJyZW50KCk7ICsrYmRJdCApCi0gICAgICAgIGlmICggYmRJdC5jdXJyZW50KCktPm1fZG9jTG9h
ZGVyID09IGRsICkKLSAgICAgICAgICAgIHJlcysrOwotCi0gICAgaWYgKGRsLT5sb2FkSW5Qcm9n
cmVzcygpKQotICAgICAgICByZXMrKzsKLSAgICAgICAgCi0gICAgcmV0dXJuIHJlczsKLX0KLQot
dm9pZCBMb2FkZXI6OmNhbmNlbFJlcXVlc3RzKCBEb2NMb2FkZXIqIGRsICkKLXsKLSAgICBRUHRy
TGlzdEl0ZXJhdG9yPFJlcXVlc3Q+IHBJdCggbV9yZXF1ZXN0c1BlbmRpbmcgKTsKLSAgICB3aGls
ZSAoIHBJdC5jdXJyZW50KCkgKQotICAgIHsKLSAgICAgICAgaWYgKHBJdC5jdXJyZW50KCktPm1f
ZG9jTG9hZGVyID09IGRsKSB7Ci0gICAgICAgICAgICBDYWNoZTo6cmVtb3ZlQ2FjaGVFbnRyeSgg
cEl0LmN1cnJlbnQoKS0+b2JqZWN0ICk7Ci0gICAgICAgICAgICBtX3JlcXVlc3RzUGVuZGluZy5y
ZW1vdmUoIHBJdCApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgICsrcEl0
OwotICAgIH0KLQotICAgIFFQdHJEaWN0SXRlcmF0b3I8UmVxdWVzdD4gbEl0KCBtX3JlcXVlc3Rz
TG9hZGluZyApOwotICAgIHdoaWxlICggbEl0LmN1cnJlbnQoKSApCi0gICAgewotICAgICAgICBp
ZiAobEl0LmN1cnJlbnQoKS0+bV9kb2NMb2FkZXIgPT0gZGwpIHsKLSAgICAgICAgICAgIEtJTzo6
Sm9iICpqb2IgPSBzdGF0aWNfY2FzdDxLSU86OkpvYiAqPiggbEl0LmN1cnJlbnRLZXkoKSApOwot
ICAgICAgICAgICAgQ2FjaGU6OnJlbW92ZUNhY2hlRW50cnkoIGxJdC5jdXJyZW50KCktPm9iamVj
dCApOwotICAgICAgICAgICAgbV9yZXF1ZXN0c0xvYWRpbmcucmVtb3ZlKCBsSXQuY3VycmVudEtl
eSgpICk7Ci0gICAgICAgICAgICBqb2ItPmtpbGwoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNl
Ci0gICAgICAgICAgICArK2xJdDsKLSAgICB9Ci0KLSAgICBRUHRyTGlzdEl0ZXJhdG9yPFJlcXVl
c3Q+IGJkSXQoIG1fcmVxdWVzdHNCYWNrZ3JvdW5kRGVjb2RpbmcgKTsKLSAgICB3aGlsZSAoYmRJ
dC5jdXJyZW50KCkpIHsKLSAgICAgICAgaWYgKGJkSXQuY3VycmVudCgpLT5tX2RvY0xvYWRlciA9
PSBkbCkgewotICAgICAgICAgICAgQ2FjaGU6OnJlbW92ZUNhY2hlRW50cnkoIGJkSXQuY3VycmVu
dCgpLT5vYmplY3QgKTsKLSAgICAgICAgICAgIG1fcmVxdWVzdHNCYWNrZ3JvdW5kRGVjb2Rpbmcu
cmVtb3ZlKCBiZEl0ICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgKyti
ZEl0OwotICAgIH0KLX0KLQotdm9pZCBMb2FkZXI6OnJlbW92ZUJhY2tncm91bmREZWNvZGluZ1Jl
cXVlc3QgKFJlcXVlc3QgKnIpCi17Ci0gICAgYm9vbCBwcmVzZW50ID0gbV9yZXF1ZXN0c0JhY2tn
cm91bmREZWNvZGluZy5jb250YWluc1JlZihyKTsKLSAgICBpZiAocHJlc2VudCkgewotCW1fcmVx
dWVzdHNCYWNrZ3JvdW5kRGVjb2RpbmcucmVtb3ZlIChyKTsKLSAgICB9Ci19Ci0KLUtJTzo6Sm9i
ICpMb2FkZXI6OmpvYkZvclJlcXVlc3QoIGNvbnN0IERPTTo6RE9NU3RyaW5nICZ1cmwgKSBjb25z
dAotewotICAgIFFQdHJEaWN0SXRlcmF0b3I8UmVxdWVzdD4gaXQoIG1fcmVxdWVzdHNMb2FkaW5n
ICk7Ci0KLSAgICBmb3IgKDsgaXQuY3VycmVudCgpOyArK2l0ICkKLSAgICB7Ci0gICAgICAgIENh
Y2hlZE9iamVjdCAqb2JqID0gaXQuY3VycmVudCgpLT5vYmplY3Q7Ci0KLSAgICAgICAgaWYgKCBv
YmogJiYgb2JqLT51cmwoKSA9PSB1cmwgKQotICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0
PEtJTzo6Sm9iICo+KCBpdC5jdXJyZW50S2V5KCkgKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsK
LX0KLQotCi1ib29sIExvYWRlcjo6aXNLSFRNTExvYWRlcigpIGNvbnN0Ci17Ci0gICAgcmV0dXJu
IHRydWU7Ci19Ci0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLUxSVUxpc3Q6OkxSVUxp
c3QoKQotOm1faGVhZCgwKSwgbV90YWlsKDApIAote30KLQotTFJVTGlzdDo6fkxSVUxpc3QoKQot
e30KLQotUURpY3Q8Q2FjaGVkT2JqZWN0PiAqQ2FjaGU6OmNhY2hlID0gMDsKLVFQdHJMaXN0PERv
Y0xvYWRlcj4qIENhY2hlOjpkb2Nsb2FkZXIgPSAwOwotTG9hZGVyICpDYWNoZTo6bV9sb2FkZXIg
PSAwOwotCi1pbnQgQ2FjaGU6Om1heFNpemUgPSBERUZDQUNIRVNJWkU7Ci1pbnQgQ2FjaGU6Om1h
eENhY2hlYWJsZSA9IE1BWENBQ0hFQUJMRTsKLWludCBDYWNoZTo6Zmx1c2hDb3VudCA9IDA7Ci0K
LVFQaXhtYXAgKkNhY2hlOjpudWxsUGl4bWFwID0gMDsKLVFQaXhtYXAgKkNhY2hlOjpicm9rZW5Q
aXhtYXAgPSAwOwordXNpbmcgbmFtZXNwYWNlIERPTTsKIAotQ2FjaGVkT2JqZWN0ICpDYWNoZTo6
bV9oZWFkT2ZVbmNhY2hlYWJsZUxpc3QgPSAwOwotaW50IENhY2hlOjptX3RvdGFsU2l6ZU9mTFJV
TGlzdHMgPSAwOwotaW50IENhY2hlOjptX2NvdW50T2ZMUlVBbmRVbmNhY2hlYWJsZUxpc3RzOwot
TFJVTGlzdCAqQ2FjaGU6Om1fTFJVTGlzdHMgPSAwOworbmFtZXNwYWNlIGtodG1sIHsKIAotdm9p
ZCBDYWNoZTo6aW5pdCgpCitEb2NMb2FkZXI6OkRvY0xvYWRlcihLSFRNTFBhcnQqIHBhcnQsIERv
Y3VtZW50SW1wbCogZG9jKQogewotICAgIGlmICggIWNhY2hlICkKLSAgICAgICAgY2FjaGUgPSBu
ZXcgUURpY3Q8Q2FjaGVkT2JqZWN0Pig0MDEsIHRydWUpOwotCi0gICAgaWYgKCAhZG9jbG9hZGVy
ICkKLSAgICAgICAgZG9jbG9hZGVyID0gbmV3IFFQdHJMaXN0PERvY0xvYWRlcj47Ci0KLSAgICBp
ZiAoICFudWxsUGl4bWFwICkKLSAgICAgICAgbnVsbFBpeG1hcCA9IG5ldyBRUGl4bWFwOwotCi0g
ICAgaWYgKCAhYnJva2VuUGl4bWFwICkKLSAgICAgICAgYnJva2VuUGl4bWFwID0gS1dRTG9hZFBp
eG1hcCgibWlzc2luZ19pbWFnZSIpOworICAgIG1fY2FjaGVQb2xpY3kgPSBLSU86OkNDX1Zlcmlm
eTsKKyAgICBtX2V4cGlyZURhdGUgPSAwOworICAgIG1fYmF1dG9sb2FkSW1hZ2VzID0gdHJ1ZTsK
KyAgICBtX3Nob3dBbmltYXRpb25zID0gS0hUTUxTZXR0aW5nczo6S0FuaW1hdGlvbkVuYWJsZWQ7
CisgICAgbV9wYXJ0ID0gcGFydDsKKyAgICBtX2RvYyA9IGRvYzsKKyAgICBtX2xvYWRJblByb2dy
ZXNzID0gZmFsc2U7CiAKLSAgICBpZiAoICFtX2xvYWRlciApCi0gICAgICAgIG1fbG9hZGVyID0g
bmV3IExvYWRlcigpOworICAgIENhY2hlOjppbml0KCk7CisgICAgQ2FjaGU6OmRvY2xvYWRlci0+
YXBwZW5kKCB0aGlzICk7CiB9CiAKLXZvaWQgQ2FjaGU6OmNsZWFyKCkKK0RvY0xvYWRlcjo6fkRv
Y0xvYWRlcigpCiB7Ci0gICAgaWYgKCFjYWNoZSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgY2Fj
aGUtPnNldEF1dG9EZWxldGUoIHRydWUgKTsKLSAgICBkZWxldGUgY2FjaGU7IGNhY2hlID0gMDsK
LSAgICBkZWxldGUgbnVsbFBpeG1hcDsgbnVsbFBpeG1hcCA9IDA7Ci0gICAgZGVsZXRlIGJyb2tl
blBpeG1hcDsgYnJva2VuUGl4bWFwID0gMDsKLSAgICBkZWxldGUgbV9sb2FkZXI7ICAgbV9sb2Fk
ZXIgPSAwOwotICAgIGRlbGV0ZSBkb2Nsb2FkZXI7IGRvY2xvYWRlciA9IDA7CisgICAgQ2FjaGU6
OmRvY2xvYWRlci0+cmVtb3ZlKCB0aGlzICk7CiB9CiAKLUNhY2hlZEltYWdlICpDYWNoZTo6cmVx
dWVzdEltYWdlKCBEb2NMb2FkZXIqIGRsLCBjb25zdCBET01TdHJpbmcgJiB1cmwsIGJvb2wgcmVs
b2FkLCB0aW1lX3QgX2V4cGlyZURhdGUgKQordm9pZCBEb2NMb2FkZXI6OnNldEV4cGlyZURhdGUo
dGltZV90IF9leHBpcmVEYXRlKQogewotICAgIC8vIHRoaXMgYnJpbmdzIHRoZSBfdXJsIHRvIGEg
c3RhbmRhcmQgZm9ybS4uLgotICAgIEtVUkwga3VybDsKLSAgICBpZiAoZGwpCi0gICAgICAgIGt1
cmwgPSBkbC0+bV9kb2MtPmNvbXBsZXRlVVJMKCB1cmwucXN0cmluZygpICk7Ci0gICAgZWxzZQot
ICAgICAgICBrdXJsID0gdXJsLnFzdHJpbmcoKTsKLSAgICByZXR1cm4gcmVxdWVzdEltYWdlKGRs
LCBrdXJsLCByZWxvYWQsIF9leHBpcmVEYXRlKTsKKyAgICBtX2V4cGlyZURhdGUgPSBfZXhwaXJl
RGF0ZTsKIH0KIAotQ2FjaGVkSW1hZ2UgKkNhY2hlOjpyZXF1ZXN0SW1hZ2UoIERvY0xvYWRlciog
ZGwsIGNvbnN0IEtVUkwgJiB1cmwsIGJvb2wgcmVsb2FkLCB0aW1lX3QgX2V4cGlyZURhdGUgKQor
Ym9vbCBEb2NMb2FkZXI6Om5lZWRSZWxvYWQoY29uc3QgS1VSTCAmZnVsbFVSTCkKIHsKLSAgICBL
SU86OkNhY2hlQ29udHJvbCBjYWNoZVBvbGljeTsKLSAgICBpZiAoZGwpCi0gICAgICAgIGNhY2hl
UG9saWN5ID0gZGwtPmNhY2hlUG9saWN5KCk7Ci0gICAgZWxzZQotICAgICAgICBjYWNoZVBvbGlj
eSA9IEtJTzo6Q0NfVmVyaWZ5OwotCi0gICAgLy8gQ2hlY2tpbmcgaWYgdGhlIFVSTCBpcyBtYWxm
b3JtZWQgaXMgbG90cyBvZiBleHRyYSB3b3JrIGZvciBsaXR0bGUgYmVuZWZpdC4KLQotICAgIGlm
ICghZGwtPmRvYygpLT5zaG91bGRDcmVhdGVSZW5kZXJlcnMoKSl7Ci0gICAgICAgIHJldHVybiAw
OwotICAgIH0KLQotICAgIENhY2hlZE9iamVjdCAqbyA9IDA7Ci0gICAgaWYgKCFyZWxvYWQpCi0g
ICAgICAgIG8gPSBjYWNoZS0+ZmluZCh1cmwudXJsKCkpOwotICAgIGlmKCFvKQorICAgIGJvb2wg
cmVsb2FkID0gZmFsc2U7CisgICAgaWYgKG1fY2FjaGVQb2xpY3kgPT0gS0lPOjpDQ19WZXJpZnkp
CiAgICAgewotI2lmZGVmIENBQ0hFX0RFQlVHCi0gICAgICAgIGtkRGVidWcoIDYwNjAgKSA8PCAi
Q2FjaGU6IG5ldzogIiA8PCB1cmwudXJsKCkgPDwgZW5kbDsKLSNlbmRpZgotICAgICAgICBDYWNo
ZWRJbWFnZSAqaW0gPSBuZXcgQ2FjaGVkSW1hZ2UoZGwsIHVybC51cmwoKSwgY2FjaGVQb2xpY3ks
IF9leHBpcmVEYXRlKTsKLSAgICAgICAgaWYgKCBkbCAmJiBkbC0+YXV0b2xvYWRJbWFnZXMoKSAp
IENhY2hlOjpsb2FkZXIoKS0+bG9hZChkbCwgaW0sIHRydWUpOwotICAgICAgICBpZiAoY2FjaGVE
aXNhYmxlZCkKLSAgICAgICAgICAgIGltLT5zZXRGcmVlKHRydWUpOwotICAgICAgICBlbHNlIHsK
LSAgICAgICAgY2FjaGUtPmluc2VydCggdXJsLnVybCgpLCBpbSApOwotICAgICAgICBtb3ZlVG9I
ZWFkT2ZMUlVMaXN0KGltKTsKLSAgICAgICAgfQotICAgICAgICBvID0gaW07CisgICAgICAgaWYg
KCFtX3JlbG9hZGVkVVJMcy5jb250YWlucyhmdWxsVVJMLnVybCgpKSkKKyAgICAgICB7CisgICAg
ICAgICAgQ2FjaGVkT2JqZWN0ICpleGlzdGluZyA9IENhY2hlOjpjYWNoZS0+ZmluZChmdWxsVVJM
LnVybCgpKTsKKyAgICAgICAgICBpZiAoZXhpc3RpbmcgJiYgZXhpc3RpbmctPmlzRXhwaXJlZCgp
KQorICAgICAgICAgIHsKKyAgICAgICAgICAgICBDYWNoZTo6cmVtb3ZlQ2FjaGVFbnRyeShleGlz
dGluZyk7CisgICAgICAgICAgICAgbV9yZWxvYWRlZFVSTHMuYXBwZW5kKGZ1bGxVUkwudXJsKCkp
OworICAgICAgICAgICAgIHJlbG9hZCA9IHRydWU7CisgICAgICAgICAgfQorICAgICAgIH0KICAg
ICB9Ci0KLSAgICAKLSAgICBpZihvLT50eXBlKCkgIT0gQ2FjaGVkT2JqZWN0OjpJbWFnZSkKKyAg
ICBlbHNlIGlmICgobV9jYWNoZVBvbGljeSA9PSBLSU86OkNDX1JlbG9hZCkgfHwgKG1fY2FjaGVQ
b2xpY3kgPT0gS0lPOjpDQ19SZWZyZXNoKSkKICAgICB7Ci0jaWZkZWYgQ0FDSEVfREVCVUcKLSAg
ICAgICAga2REZWJ1ZyggNjA2MCApIDw8ICJDYWNoZTo6SW50ZXJuYWwgRXJyb3IgaW4gcmVxdWVz
dEltYWdlIHVybD0iIDw8IGt1cmwudXJsKCkgPDwgIiEiIDw8IGVuZGw7Ci0jZW5kaWYKLSAgICAg
ICAgcmV0dXJuIDA7Ci0gICAgfQotCi0jaWZkZWYgQ0FDSEVfREVCVUcKLSAgICBpZiggby0+c3Rh
dHVzKCkgPT0gQ2FjaGVkT2JqZWN0OjpQZW5kaW5nICkKLSAgICAgICAga2REZWJ1ZyggNjA2MCAp
IDw8ICJDYWNoZTogbG9hZGluZyBpbiBwcm9ncmVzczogIiA8PCBrdXJsLnVybCgpIDw8IGVuZGw7
Ci0gICAgZWxzZQotICAgICAgICBrZERlYnVnKCA2MDYwICkgPDwgIkNhY2hlOiB1c2luZyBjYWNo
ZWQ6ICIgPDwga3VybC51cmwoKSA8PCAiLCBzdGF0dXMgIiA8PCBvLT5zdGF0dXMoKSA8PCBlbmRs
OwotI2VuZGlmCi0KLSAgICBtb3ZlVG9IZWFkT2ZMUlVMaXN0KG8pOwotICAgIGlmICggZGwgKSB7
Ci0gICAgICAgIGRsLT5tX2RvY09iamVjdHMucmVtb3ZlKCBvICk7Ci0gICAgICAgIGlmICghY2Fj
aGVEaXNhYmxlZCkKLSAgICAgICAgZGwtPm1fZG9jT2JqZWN0cy5hcHBlbmQoIG8gKTsKKyAgICAg
ICBpZiAoIW1fcmVsb2FkZWRVUkxzLmNvbnRhaW5zKGZ1bGxVUkwudXJsKCkpKQorICAgICAgIHsK
KyAgICAgICAgICBDYWNoZWRPYmplY3QgKmV4aXN0aW5nID0gQ2FjaGU6OmNhY2hlLT5maW5kKGZ1
bGxVUkwudXJsKCkpOworICAgICAgICAgIGlmIChleGlzdGluZykKKyAgICAgICAgICB7CisgICAg
ICAgICAgICAgQ2FjaGU6OnJlbW92ZUNhY2hlRW50cnkoZXhpc3RpbmcpOworICAgICAgICAgIH0K
KyAgICAgICAgICBtX3JlbG9hZGVkVVJMcy5hcHBlbmQoZnVsbFVSTC51cmwoKSk7CisgICAgICAg
ICAgcmVsb2FkID0gdHJ1ZTsKKyAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBzdGF0aWNfY2Fz
dDxDYWNoZWRJbWFnZSAqPihvKTsKKyAgICByZXR1cm4gcmVsb2FkOwogfQogCi1DYWNoZWRDU1NT
dHlsZVNoZWV0ICpDYWNoZTo6cmVxdWVzdFN0eWxlU2hlZXQoIERvY0xvYWRlciogZGwsIGNvbnN0
IERPTVN0cmluZyAmIHVybCwgYm9vbCByZWxvYWQsIHRpbWVfdCBfZXhwaXJlRGF0ZSwgY29uc3Qg
UVN0cmluZyYgY2hhcnNldCkKK0NhY2hlZEltYWdlICpEb2NMb2FkZXI6OnJlcXVlc3RJbWFnZSgg
Y29uc3QgRE9NOjpET01TdHJpbmcgJnVybCkKIHsKLSAgICAvLyB0aGlzIGJyaW5ncyB0aGUgX3Vy
bCB0byBhIHN0YW5kYXJkIGZvcm0uLi4KLSAgICBLVVJMIGt1cmw7Ci0gICAgS0lPOjpDYWNoZUNv
bnRyb2wgY2FjaGVQb2xpY3k7Ci0gICAgaWYgKCBkbCApCi0gICAgewotICAgICAgICBrdXJsID0g
ZGwtPm1fZG9jLT5jb21wbGV0ZVVSTCggdXJsLnFzdHJpbmcoKSApOwotICAgICAgICBjYWNoZVBv
bGljeSA9IGRsLT5jYWNoZVBvbGljeSgpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAg
ICBrdXJsID0gdXJsLnFzdHJpbmcoKTsKLSAgICAgICAgY2FjaGVQb2xpY3kgPSBLSU86OkNDX1Zl
cmlmeTsKLSAgICB9Ci0KLSAgICAvLyBDaGVja2luZyBpZiB0aGUgVVJMIGlzIG1hbGZvcm1lZCBp
cyBsb3RzIG9mIGV4dHJhIHdvcmsgZm9yIGxpdHRsZSBiZW5lZml0LgotCi0gICAgQ2FjaGVkT2Jq
ZWN0ICpvID0gY2FjaGUtPmZpbmQoa3VybC51cmwoKSk7Ci0gICAgaWYoIW8pCi0gICAgewotI2lm
ZGVmIENBQ0hFX0RFQlVHCi0gICAgICAgIGtkRGVidWcoIDYwNjAgKSA8PCAiQ2FjaGU6IG5ldzog
IiA8PCBrdXJsLnVybCgpIDw8IGVuZGw7Ci0jZW5kaWYKLSAgICAgICAgQ2FjaGVkQ1NTU3R5bGVT
aGVldCAqc2hlZXQgPSBuZXcgQ2FjaGVkQ1NTU3R5bGVTaGVldChkbCwga3VybC51cmwoKSwgY2Fj
aGVQb2xpY3ksIF9leHBpcmVEYXRlLCBjaGFyc2V0KTsKLSAgICAgICAgaWYgKGNhY2hlRGlzYWJs
ZWQpCi0gICAgICAgICAgICBzaGVldC0+c2V0RnJlZSh0cnVlKTsKLSAgICAgICAgZWxzZSB7Ci0g
ICAgICAgIGNhY2hlLT5pbnNlcnQoIGt1cmwudXJsKCksIHNoZWV0ICk7Ci0gICAgICAgIG1vdmVU
b0hlYWRPZkxSVUxpc3Qoc2hlZXQpOwotICAgICAgICB9Ci0gICAgICAgIG8gPSBzaGVldDsKLSAg
ICB9CisgICAgS1VSTCBmdWxsVVJMID0gbV9kb2MtPmNvbXBsZXRlVVJMKHVybC5xc3RyaW5nKCkp
OworICAgIGlmICggbV9wYXJ0ICYmIG1fcGFydC0+b25seUxvY2FsUmVmZXJlbmNlcygpICYmIGZ1
bGxVUkwucHJvdG9jb2woKSAhPSAiZmlsZSIpIHJldHVybiAwOwogCi0gICAgCi0gICAgaWYoby0+
dHlwZSgpICE9IENhY2hlZE9iamVjdDo6Q1NTU3R5bGVTaGVldCkKLSAgICB7Ci0jaWZkZWYgQ0FD
SEVfREVCVUcKLSAgICAgICAga2REZWJ1ZyggNjA2MCApIDw8ICJDYWNoZTo6SW50ZXJuYWwgRXJy
b3IgaW4gcmVxdWVzdFN0eWxlU2hlZXQgdXJsPSIgPDwga3VybC51cmwoKSA8PCAiISIgPDwgZW5k
bDsKLSNlbmRpZgotICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoS1dRQ2hlY2tJZlJlbG9hZGlu
Zyh0aGlzKSkgeworICAgICAgICBzZXRDYWNoZVBvbGljeShLSU86OkNDX1JlbG9hZCk7CiAgICAg
fQogCi0jaWZkZWYgQ0FDSEVfREVCVUcKLSAgICBpZiggby0+c3RhdHVzKCkgPT0gQ2FjaGVkT2Jq
ZWN0OjpQZW5kaW5nICkKLSAgICAgICAga2REZWJ1ZyggNjA2MCApIDw8ICJDYWNoZTogbG9hZGlu
ZyBpbiBwcm9ncmVzczogIiA8PCBrdXJsLnVybCgpIDw8IGVuZGw7Ci0gICAgZWxzZQotICAgICAg
ICBrZERlYnVnKCA2MDYwICkgPDwgIkNhY2hlOiB1c2luZyBjYWNoZWQ6ICIgPDwga3VybC51cmwo
KSA8PCBlbmRsOwotI2VuZGlmCisgICAgYm9vbCByZWxvYWQgPSBuZWVkUmVsb2FkKGZ1bGxVUkwp
OwogCi0gICAgbW92ZVRvSGVhZE9mTFJVTGlzdChvKTsKLSAgICBpZiAoIGRsICkgewotICAgICAg
ICBkbC0+bV9kb2NPYmplY3RzLnJlbW92ZSggbyApOwotICAgICAgICBpZiAoIWNhY2hlRGlzYWJs
ZWQpCi0gICAgICAgIGRsLT5tX2RvY09iamVjdHMuYXBwZW5kKCBvICk7Ci0gICAgfQotICAgIHJl
dHVybiBzdGF0aWNfY2FzdDxDYWNoZWRDU1NTdHlsZVNoZWV0ICo+KG8pOworICAgIENhY2hlZElt
YWdlICpjYWNoZWRPYmplY3QgPSBDYWNoZTo6cmVxdWVzdEltYWdlKHRoaXMsIGZ1bGxVUkwsIHJl
bG9hZCwgbV9leHBpcmVEYXRlKTsKKyAgICBLV1FDaGVja0NhY2hlT2JqZWN0U3RhdHVzKHRoaXMs
IGNhY2hlZE9iamVjdCk7CisgICAgcmV0dXJuIGNhY2hlZE9iamVjdDsKIH0KIAotdm9pZCBDYWNo
ZTo6cHJlbG9hZFN0eWxlU2hlZXQoIGNvbnN0IFFTdHJpbmcgJnVybCwgY29uc3QgUVN0cmluZyAm
c3R5bGVzaGVldF9kYXRhKQorQ2FjaGVkQ1NTU3R5bGVTaGVldCAqRG9jTG9hZGVyOjpyZXF1ZXN0
U3R5bGVTaGVldCggY29uc3QgRE9NOjpET01TdHJpbmcgJnVybCwgY29uc3QgUVN0cmluZyYgY2hh
cnNldCkKIHsKLSAgICBDYWNoZWRPYmplY3QgKm8gPSBjYWNoZS0+ZmluZCh1cmwpOwotICAgIGlm
KG8pCi0gICAgICAgIHJlbW92ZUNhY2hlRW50cnkobyk7Ci0KLSAgICBDYWNoZWRDU1NTdHlsZVNo
ZWV0ICpzdHlsZXNoZWV0ID0gbmV3IENhY2hlZENTU1N0eWxlU2hlZXQodXJsLCBzdHlsZXNoZWV0
X2RhdGEpOwotICAgIGNhY2hlLT5pbnNlcnQoIHVybCwgc3R5bGVzaGVldCApOwotfQorICAgIEtV
UkwgZnVsbFVSTCA9IG1fZG9jLT5jb21wbGV0ZVVSTCh1cmwucXN0cmluZygpKTsKKyAgICBpZiAo
IG1fcGFydCAmJiBtX3BhcnQtPm9ubHlMb2NhbFJlZmVyZW5jZXMoKSAmJiBmdWxsVVJMLnByb3Rv
Y29sKCkgIT0gImZpbGUiKSByZXR1cm4gMDsKIAotQ2FjaGVkU2NyaXB0ICpDYWNoZTo6cmVxdWVz
dFNjcmlwdCggRG9jTG9hZGVyKiBkbCwgY29uc3QgRE9NOjpET01TdHJpbmcgJnVybCwgYm9vbCBy
ZWxvYWQsIHRpbWVfdCBfZXhwaXJlRGF0ZSwgY29uc3QgUVN0cmluZyYgY2hhcnNldCkKLXsKLSAg
ICAvLyB0aGlzIGJyaW5ncyB0aGUgX3VybCB0byBhIHN0YW5kYXJkIGZvcm0uLi4KLSAgICBLVVJM
IGt1cmw7Ci0gICAgS0lPOjpDYWNoZUNvbnRyb2wgY2FjaGVQb2xpY3k7Ci0gICAgaWYgKCBkbCAp
Ci0gICAgewotICAgICAgICBrdXJsID0gZGwtPm1fZG9jLT5jb21wbGV0ZVVSTCggdXJsLnFzdHJp
bmcoKSApOwotICAgICAgICBjYWNoZVBvbGljeSA9IGRsLT5jYWNoZVBvbGljeSgpOwotICAgIH0K
LSAgICBlbHNlCi0gICAgewotICAgICAgICBrdXJsID0gdXJsLnFzdHJpbmcoKTsKLSAgICAgICAg
Y2FjaGVQb2xpY3kgPSBLSU86OkNDX1ZlcmlmeTsKKyAgICBpZiAoS1dRQ2hlY2tJZlJlbG9hZGlu
Zyh0aGlzKSkgeworICAgICAgICBzZXRDYWNoZVBvbGljeShLSU86OkNDX1JlbG9hZCk7CiAgICAg
fQogCi0gICAgLy8gQ2hlY2tpbmcgaWYgdGhlIFVSTCBpcyBtYWxmb3JtZWQgaXMgbG90cyBvZiBl
eHRyYSB3b3JrIGZvciBsaXR0bGUgYmVuZWZpdC4KKyAgICBib29sIHJlbG9hZCA9IG5lZWRSZWxv
YWQoZnVsbFVSTCk7CiAKLSAgICBDYWNoZWRPYmplY3QgKm8gPSBjYWNoZS0+ZmluZChrdXJsLnVy
bCgpKTsKLSAgICBpZighbykKLSAgICB7Ci0jaWZkZWYgQ0FDSEVfREVCVUcKLSAgICAgICAga2RE
ZWJ1ZyggNjA2MCApIDw8ICJDYWNoZTogbmV3OiAiIDw8IGt1cmwudXJsKCkgPDwgZW5kbDsKLSNl
bmRpZgotICAgICAgICBDYWNoZWRTY3JpcHQgKnNjcmlwdCA9IG5ldyBDYWNoZWRTY3JpcHQoZGws
IGt1cmwudXJsKCksIGNhY2hlUG9saWN5LCBfZXhwaXJlRGF0ZSwgY2hhcnNldCk7Ci0gICAgICAg
IGlmIChjYWNoZURpc2FibGVkKQotICAgICAgICAgICAgc2NyaXB0LT5zZXRGcmVlKHRydWUpOwot
ICAgICAgICBlbHNlIHsKLSAgICAgICAgY2FjaGUtPmluc2VydCgga3VybC51cmwoKSwgc2NyaXB0
ICk7Ci0gICAgICAgIG1vdmVUb0hlYWRPZkxSVUxpc3Qoc2NyaXB0KTsKLSAgICAgICAgfQotICAg
ICAgICBvID0gc2NyaXB0OwotICAgIH0KKyAgICBDYWNoZWRDU1NTdHlsZVNoZWV0ICpjYWNoZWRP
YmplY3QgPSBDYWNoZTo6cmVxdWVzdFN0eWxlU2hlZXQodGhpcywgdXJsLCByZWxvYWQsIG1fZXhw
aXJlRGF0ZSwgY2hhcnNldCk7CisgICAgS1dRQ2hlY2tDYWNoZU9iamVjdFN0YXR1cyh0aGlzLCBj
YWNoZWRPYmplY3QpOworICAgIHJldHVybiBjYWNoZWRPYmplY3Q7Cit9CiAKLSAgICAKLSAgICBp
ZighKG8tPnR5cGUoKSA9PSBDYWNoZWRPYmplY3Q6OlNjcmlwdCkpCi0gICAgewotI2lmZGVmIENB
Q0hFX0RFQlVHCi0gICAgICAgIGtkRGVidWcoIDYwNjAgKSA8PCAiQ2FjaGU6OkludGVybmFsIEVy
cm9yIGluIHJlcXVlc3RTY3JpcHQgdXJsPSIgPDwga3VybC51cmwoKSA8PCAiISIgPDwgZW5kbDsK
LSNlbmRpZgotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgCi0gICAgCi0jaWZkZWYgQ0FD
SEVfREVCVUcKLSAgICBpZiggby0+c3RhdHVzKCkgPT0gQ2FjaGVkT2JqZWN0OjpQZW5kaW5nICkK
LSAgICAgICAga2REZWJ1ZyggNjA2MCApIDw8ICJDYWNoZTogbG9hZGluZyBpbiBwcm9ncmVzczog
IiA8PCBrdXJsLnVybCgpIDw8IGVuZGw7Ci0gICAgZWxzZQotICAgICAgICBrZERlYnVnKCA2MDYw
ICkgPDwgIkNhY2hlOiB1c2luZyBjYWNoZWQ6ICIgPDwga3VybC51cmwoKSA8PCBlbmRsOwotI2Vu
ZGlmCitDYWNoZWRTY3JpcHQgKkRvY0xvYWRlcjo6cmVxdWVzdFNjcmlwdCggY29uc3QgRE9NOjpE
T01TdHJpbmcgJnVybCwgY29uc3QgUVN0cmluZyYgY2hhcnNldCkKK3sKKyAgICBLVVJMIGZ1bGxV
UkwgPSBtX2RvYy0+Y29tcGxldGVVUkwodXJsLnFzdHJpbmcoKSk7CisgICAgaWYgKCBtX3BhcnQg
JiYgbV9wYXJ0LT5vbmx5TG9jYWxSZWZlcmVuY2VzKCkgJiYgZnVsbFVSTC5wcm90b2NvbCgpICE9
ICJmaWxlIikgcmV0dXJuIDA7CiAKLSAgICBtb3ZlVG9IZWFkT2ZMUlVMaXN0KG8pOwotICAgIGlm
ICggZGwgKSB7Ci0gICAgICAgIGRsLT5tX2RvY09iamVjdHMucmVtb3ZlKCBvICk7Ci0gICAgICAg
IGlmICghY2FjaGVEaXNhYmxlZCkKLSAgICAgICAgZGwtPm1fZG9jT2JqZWN0cy5hcHBlbmQoIG8g
KTsKKyAgICBpZiAoS1dRQ2hlY2tJZlJlbG9hZGluZyh0aGlzKSkgeworICAgICAgICBzZXRDYWNo
ZVBvbGljeShLSU86OkNDX1JlbG9hZCk7CiAgICAgfQotICAgIHJldHVybiBzdGF0aWNfY2FzdDxD
YWNoZWRTY3JpcHQgKj4obyk7Ci19CiAKLXZvaWQgQ2FjaGU6OnByZWxvYWRTY3JpcHQoIGNvbnN0
IFFTdHJpbmcgJnVybCwgY29uc3QgUVN0cmluZyAmc2NyaXB0X2RhdGEpCi17Ci0gICAgQ2FjaGVk
T2JqZWN0ICpvID0gY2FjaGUtPmZpbmQodXJsKTsKLSAgICBpZihvKQotICAgICAgICByZW1vdmVD
YWNoZUVudHJ5KG8pOworICAgIGJvb2wgcmVsb2FkID0gbmVlZFJlbG9hZChmdWxsVVJMKTsKIAot
ICAgIENhY2hlZFNjcmlwdCAqc2NyaXB0ID0gbmV3IENhY2hlZFNjcmlwdCh1cmwsIHNjcmlwdF9k
YXRhKTsKLSAgICBjYWNoZS0+aW5zZXJ0KCB1cmwsIHNjcmlwdCApOworICAgIENhY2hlZFNjcmlw
dCAqY2FjaGVkT2JqZWN0ID0gQ2FjaGU6OnJlcXVlc3RTY3JpcHQodGhpcywgdXJsLCByZWxvYWQs
IG1fZXhwaXJlRGF0ZSwgY2hhcnNldCk7CisgICAgS1dRQ2hlY2tDYWNoZU9iamVjdFN0YXR1cyh0
aGlzLCBjYWNoZWRPYmplY3QpOworICAgIHJldHVybiBjYWNoZWRPYmplY3Q7CiB9CiAKICNpZmRl
ZiBLSFRNTF9YU0xUCi1DYWNoZWRYU0xTdHlsZVNoZWV0KiBDYWNoZTo6cmVxdWVzdFhTTFN0eWxl
U2hlZXQoRG9jTG9hZGVyKiBkbCwgY29uc3QgRE9NU3RyaW5nICYgdXJsLCBib29sIHJlbG9hZCwg
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZV90
IF9leHBpcmVEYXRlKQorQ2FjaGVkWFNMU3R5bGVTaGVldCogRG9jTG9hZGVyOjpyZXF1ZXN0WFNM
U3R5bGVTaGVldChjb25zdCBET006OkRPTVN0cmluZyAmdXJsKQogewotICAgIC8vIHRoaXMgYnJp
bmdzIHRoZSBfdXJsIHRvIGEgc3RhbmRhcmQgZm9ybS4uLgotICAgIEtVUkwga3VybDsKLSAgICBL
SU86OkNhY2hlQ29udHJvbCBjYWNoZVBvbGljeTsKLSAgICBpZiAoZGwpIHsKLSAgICAgICAga3Vy
bCA9IGRsLT5tX2RvYy0+Y29tcGxldGVVUkwodXJsLnFzdHJpbmcoKSk7Ci0gICAgICAgIGNhY2hl
UG9saWN5ID0gZGwtPmNhY2hlUG9saWN5KCk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBr
dXJsID0gdXJsLnFzdHJpbmcoKTsKLSAgICAgICAgY2FjaGVQb2xpY3kgPSBLSU86OkNDX1Zlcmlm
eTsKLSAgICB9Ci0gICAgCi0gICAgLy8gQ2hlY2tpbmcgaWYgdGhlIFVSTCBpcyBtYWxmb3JtZWQg
aXMgbG90cyBvZiBleHRyYSB3b3JrIGZvciBsaXR0bGUgYmVuZWZpdC4KLSAgICAKLSAgICBDYWNo
ZWRPYmplY3QgKm8gPSBjYWNoZS0+ZmluZChrdXJsLnVybCgpKTsKLSAgICBpZiAoIW8pIHsKLSNp
ZmRlZiBDQUNIRV9ERUJVRwotICAgICAgICBrZERlYnVnKCA2MDYwICkgPDwgIkNhY2hlOiBuZXc6
ICIgPDwga3VybC51cmwoKSA8PCBlbmRsOwotI2VuZGlmCi0gICAgICAgIENhY2hlZFhTTFN0eWxl
U2hlZXQqIGRvYyA9IG5ldyBDYWNoZWRYU0xTdHlsZVNoZWV0KGRsLCBrdXJsLnVybCgpLCBjYWNo
ZVBvbGljeSwgX2V4cGlyZURhdGUpOwotICAgICAgICBpZiAoY2FjaGVEaXNhYmxlZCkKLSAgICAg
ICAgICAgIGRvYy0+c2V0RnJlZSh0cnVlKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBj
YWNoZS0+aW5zZXJ0KGt1cmwudXJsKCksIGRvYyk7Ci0gICAgICAgICAgICBtb3ZlVG9IZWFkT2ZM
UlVMaXN0KGRvYyk7Ci0gICAgICAgIH0KLSAgICAgICAgbyA9IGRvYzsKLSAgICB9CisgICAgS1VS
TCBmdWxsVVJMID0gbV9kb2MtPmNvbXBsZXRlVVJMKHVybC5xc3RyaW5nKCkpOwogICAgIAorICAg
IGlmIChtX3BhcnQgJiYgbV9wYXJ0LT5vbmx5TG9jYWxSZWZlcmVuY2VzKCkgJiYgZnVsbFVSTC5w
cm90b2NvbCgpICE9ICJmaWxlIikgcmV0dXJuIDA7CiAgICAgCi0gICAgaWYgKG8tPnR5cGUoKSAh
PSBDYWNoZWRPYmplY3Q6OlhTTFN0eWxlU2hlZXQpIHsKLSNpZmRlZiBDQUNIRV9ERUJVRwotICAg
ICAgICBrZERlYnVnKCA2MDYwICkgPDwgIkNhY2hlOjpJbnRlcm5hbCBFcnJvciBpbiByZXF1ZXN0
WFNMU3R5bGVTaGVldCB1cmw9IiA8PCBrdXJsLnVybCgpIDw8ICIhIiA8PCBlbmRsOwotI2VuZGlm
Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KKyAgICBpZiAoS1dRQ2hlY2tJZlJlbG9hZGluZyh0
aGlzKSkKKyAgICAgICAgc2V0Q2FjaGVQb2xpY3koS0lPOjpDQ19SZWxvYWQpOwogICAgIAotI2lm
ZGVmIENBQ0hFX0RFQlVHCi0gICAgaWYgKG8tPnN0YXR1cygpID09IENhY2hlZE9iamVjdDo6UGVu
ZGluZykKLSAgICAgICAga2REZWJ1ZyggNjA2MCApIDw8ICJDYWNoZTogbG9hZGluZyBpbiBwcm9n
cmVzczogIiA8PCBrdXJsLnVybCgpIDw8IGVuZGw7Ci0gICAgZWxzZQotICAgICAgICBrZERlYnVn
KCA2MDYwICkgPDwgIkNhY2hlOiB1c2luZyBjYWNoZWQ6ICIgPDwga3VybC51cmwoKSA8PCBlbmRs
OwotI2VuZGlmCisgICAgYm9vbCByZWxvYWQgPSBuZWVkUmVsb2FkKGZ1bGxVUkwpOwogICAgIAot
ICAgIG1vdmVUb0hlYWRPZkxSVUxpc3Qobyk7Ci0gICAgaWYgKGRsKSB7Ci0gICAgICAgIGRsLT5t
X2RvY09iamVjdHMucmVtb3ZlKCBvICk7Ci0gICAgICAgIGlmICghY2FjaGVEaXNhYmxlZCkKLSAg
ICAgICAgICAgIGRsLT5tX2RvY09iamVjdHMuYXBwZW5kKCBvICk7Ci0gICAgfQotICAgIHJldHVy
biBzdGF0aWNfY2FzdDxDYWNoZWRYU0xTdHlsZVNoZWV0Kj4obyk7CisgICAgQ2FjaGVkWFNMU3R5
bGVTaGVldCAqY2FjaGVkT2JqZWN0ID0gQ2FjaGU6OnJlcXVlc3RYU0xTdHlsZVNoZWV0KHRoaXMs
IHVybCwgcmVsb2FkLCBtX2V4cGlyZURhdGUpOworICAgIEtXUUNoZWNrQ2FjaGVPYmplY3RTdGF0
dXModGhpcywgY2FjaGVkT2JqZWN0KTsKKyAgICByZXR1cm4gY2FjaGVkT2JqZWN0OwogfQogI2Vu
ZGlmCiAKICNpZm5kZWYgS0hUTUxfTk9fWEJMCi1DYWNoZWRYQkxEb2N1bWVudCogQ2FjaGU6OnJl
cXVlc3RYQkxEb2N1bWVudChEb2NMb2FkZXIqIGRsLCBjb25zdCBET01TdHJpbmcgJiB1cmwsIGJv
b2wgcmVsb2FkLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHRpbWVfdCBfZXhwaXJlRGF0ZSkKK0NhY2hlZFhCTERvY3VtZW50KiBEb2NMb2FkZXI6OnJlcXVl
c3RYQkxEb2N1bWVudChjb25zdCBET006OkRPTVN0cmluZyAmdXJsKQogewotICAgIC8vIHRoaXMg
YnJpbmdzIHRoZSBfdXJsIHRvIGEgc3RhbmRhcmQgZm9ybS4uLgotICAgIEtVUkwga3VybDsKLSAg
ICBLSU86OkNhY2hlQ29udHJvbCBjYWNoZVBvbGljeTsKLSAgICBpZiAoZGwpIHsKLSAgICAgICAg
a3VybCA9IGRsLT5tX2RvYy0+Y29tcGxldGVVUkwodXJsLnFzdHJpbmcoKSk7Ci0gICAgICAgIGNh
Y2hlUG9saWN5ID0gZGwtPmNhY2hlUG9saWN5KCk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAg
ICBrdXJsID0gdXJsLnFzdHJpbmcoKTsKLSAgICAgICAgY2FjaGVQb2xpY3kgPSBLSU86OkNDX1Zl
cmlmeTsKLSAgICB9Ci0gICAgCi0gICAgLy8gQ2hlY2tpbmcgaWYgdGhlIFVSTCBpcyBtYWxmb3Jt
ZWQgaXMgbG90cyBvZiBleHRyYSB3b3JrIGZvciBsaXR0bGUgYmVuZWZpdC4KLSAgICAKLSAgICBD
YWNoZWRPYmplY3QgKm8gPSBjYWNoZS0+ZmluZChrdXJsLnVybCgpKTsKLSAgICBpZighbykKLSAg
ICB7Ci0jaWZkZWYgQ0FDSEVfREVCVUcKLSAgICAgICAga2REZWJ1ZyggNjA2MCApIDw8ICJDYWNo
ZTogbmV3OiAiIDw8IGt1cmwudXJsKCkgPDwgZW5kbDsKLSNlbmRpZgotICAgICAgICBDYWNoZWRY
QkxEb2N1bWVudCogZG9jID0gbmV3IENhY2hlZFhCTERvY3VtZW50KGRsLCBrdXJsLnVybCgpLCBj
YWNoZVBvbGljeSwgX2V4cGlyZURhdGUpOwotICAgICAgICBpZiAoY2FjaGVEaXNhYmxlZCkKLSAg
ICAgICAgICAgIGRvYy0+c2V0RnJlZSh0cnVlKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAg
ICBjYWNoZS0+aW5zZXJ0KGt1cmwudXJsKCksIGRvYyk7Ci0gICAgICAgICAgICBtb3ZlVG9IZWFk
T2ZMUlVMaXN0KGRvYyk7Ci0gICAgICAgIH0KLSAgICAgICAgbyA9IGRvYzsKLSAgICB9CisgICAg
S1VSTCBmdWxsVVJMID0gbV9kb2MtPmNvbXBsZXRlVVJMKHVybC5xc3RyaW5nKCkpOwogICAgIAor
ICAgIC8vIEZJWE1FOiBJcyB0aGlzIHJpZ2h0IGZvciBYQkw/CisgICAgaWYgKG1fcGFydCAmJiBt
X3BhcnQtPm9ubHlMb2NhbFJlZmVyZW5jZXMoKSAmJiBmdWxsVVJMLnByb3RvY29sKCkgIT0gImZp
bGUiKSByZXR1cm4gMDsKICAgICAKLSAgICBpZihvLT50eXBlKCkgIT0gQ2FjaGVkT2JqZWN0OjpY
QkwpCi0gICAgewotI2lmZGVmIENBQ0hFX0RFQlVHCi0gICAgICAgIGtkRGVidWcoIDYwNjAgKSA8
PCAiQ2FjaGU6OkludGVybmFsIEVycm9yIGluIHJlcXVlc3RYQkxEb2N1bWVudCB1cmw9IiA8PCBr
dXJsLnVybCgpIDw8ICIhIiA8PCBlbmRsOwotI2VuZGlmCi0gICAgICAgIHJldHVybiAwOworICAg
IGlmIChLV1FDaGVja0lmUmVsb2FkaW5nKHRoaXMpKSB7CisgICAgICAgIHNldENhY2hlUG9saWN5
KEtJTzo6Q0NfUmVsb2FkKTsKICAgICB9CiAgICAgCi0jaWZkZWYgQ0FDSEVfREVCVUcKLSAgICBp
Ziggby0+c3RhdHVzKCkgPT0gQ2FjaGVkT2JqZWN0OjpQZW5kaW5nICkKLSAgICAgICAga2REZWJ1
ZyggNjA2MCApIDw8ICJDYWNoZTogbG9hZGluZyBpbiBwcm9ncmVzczogIiA8PCBrdXJsLnVybCgp
IDw8IGVuZGw7Ci0gICAgZWxzZQotICAgICAgICBrZERlYnVnKCA2MDYwICkgPDwgIkNhY2hlOiB1
c2luZyBjYWNoZWQ6ICIgPDwga3VybC51cmwoKSA8PCBlbmRsOwotI2VuZGlmCisgICAgYm9vbCBy
ZWxvYWQgPSBuZWVkUmVsb2FkKGZ1bGxVUkwpOwogICAgIAotICAgIG1vdmVUb0hlYWRPZkxSVUxp
c3Qobyk7Ci0gICAgaWYgKCBkbCApIHsKLSAgICAgICAgZGwtPm1fZG9jT2JqZWN0cy5yZW1vdmUo
IG8gKTsKLSAgICAgICAgaWYgKCFjYWNoZURpc2FibGVkKQotICAgICAgICAgICAgZGwtPm1fZG9j
T2JqZWN0cy5hcHBlbmQoIG8gKTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PENhY2hl
ZFhCTERvY3VtZW50Kj4obyk7CisgICAgQ2FjaGVkWEJMRG9jdW1lbnQgKmNhY2hlZE9iamVjdCA9
IENhY2hlOjpyZXF1ZXN0WEJMRG9jdW1lbnQodGhpcywgdXJsLCByZWxvYWQsIG1fZXhwaXJlRGF0
ZSk7CisgICAgS1dRQ2hlY2tDYWNoZU9iamVjdFN0YXR1cyh0aGlzLCBjYWNoZWRPYmplY3QpOwor
ICAgIHJldHVybiBjYWNoZWRPYmplY3Q7CiB9CiAjZW5kaWYKIAotdm9pZCBDYWNoZTo6Zmx1c2go
Ym9vbCBmb3JjZSkKLXsKLSAgICBpZiAoZm9yY2UpCi0gICAgICAgZmx1c2hDb3VudCA9IDA7Ci0g
ICAgLy8gRG9uJ3QgZmx1c2ggZm9yIGV2ZXJ5IGltYWdlLgotICAgIGlmIChtX2NvdW50T2ZMUlVB
bmRVbmNhY2hlYWJsZUxpc3RzIDwgZmx1c2hDb3VudCkKLSAgICAgICByZXR1cm47Ci0KLSAgICBp
bml0KCk7Ci0KLSAgICB3aGlsZSAobV9oZWFkT2ZVbmNhY2hlYWJsZUxpc3QpCi0gICAgICAgIHJl
bW92ZUNhY2hlRW50cnkobV9oZWFkT2ZVbmNhY2hlYWJsZUxpc3QpOwotCi0gICAgZm9yIChpbnQg
aSA9IE1BWF9MUlVfTElTVFMtMTsgaT49MDsgaS0tKSB7Ci0gICAgICAgIGlmIChtX3RvdGFsU2l6
ZU9mTFJVTGlzdHMgPD0gbWF4U2l6ZSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAg
Ci0gICAgICAgIHdoaWxlIChtX3RvdGFsU2l6ZU9mTFJVTGlzdHMgPiBtYXhTaXplICYmIG1fTFJV
TGlzdHNbaV0ubV90YWlsKQotICAgICAgICAgICAgcmVtb3ZlQ2FjaGVFbnRyeShtX0xSVUxpc3Rz
W2ldLm1fdGFpbCk7Ci0gICAgfQotCi0gICAgZmx1c2hDb3VudCA9IG1fY291bnRPZkxSVUFuZFVu
Y2FjaGVhYmxlTGlzdHMrMTA7IC8vIEZsdXNoIGFnYWluIHdoZW4gdGhlIGNhY2hlIGhhcyBncm93
bi4KLX0KLQotCi12b2lkIENhY2hlOjpzZXRTaXplKCBpbnQgYnl0ZXMgKQotewotICAgIG1heFNp
emUgPSBieXRlczsKLSAgICBtYXhDYWNoZWFibGUgPSBrTWF4KG1heFNpemUgLyAxMjgsIE1BWENB
Q0hFQUJMRSk7Ci0KLSAgICAvLyBtYXkgYmUgd2UgbmVlZCB0byBjbGVhciBwYXJ0cyBvZiB0aGUg
Y2FjaGUKLSAgICBmbHVzaENvdW50ID0gMDsKLSAgICBmbHVzaCh0cnVlKTsKLX0KLQotdm9pZCBD
YWNoZTo6cmVtb3ZlQ2FjaGVFbnRyeSggQ2FjaGVkT2JqZWN0ICpvYmplY3QgKQotewotICBRU3Ry
aW5nIGtleSA9IG9iamVjdC0+dXJsKCkucXN0cmluZygpOwotCi0gIC8vIHRoaXMgaW5kaWNhdGVz
IHRoZSBkZXJlZigpIG1ldGhvZCBvZiBDYWNoZWRPYmplY3QgdG8gZGVsZXRlIGl0c2VsZiB3aGVu
IHRoZSByZWZlcmVuY2UgY291bnRlcgotICAvLyBkcm9wcyBkb3duIHRvIHplcm8KLSAgb2JqZWN0
LT5zZXRGcmVlKCB0cnVlICk7Ci0KLSAgY2FjaGUtPnJlbW92ZSgga2V5ICk7Ci0gIHJlbW92ZUZy
b21MUlVMaXN0KG9iamVjdCk7Ci0KLSAgY29uc3QgRG9jTG9hZGVyKiBkbDsKLSAgZm9yICggZGw9
ZG9jbG9hZGVyLT5maXJzdCgpOyBkbDsgZGw9ZG9jbG9hZGVyLT5uZXh0KCkgKQotICAgICAgZGwt
PnJlbW92ZUNhY2hlZE9iamVjdCggb2JqZWN0ICk7Ci0KLSAgaWYgKCBvYmplY3QtPmNhbkRlbGV0
ZSgpICkKLSAgICAgZGVsZXRlIG9iamVjdDsKLX0KLQotI2RlZmluZSBGQVNUX0xPRzIoX2xvZzIs
X24pICAgXAotICAgICAgdW5zaWduZWQgaW50IGpfID0gKHVuc2lnbmVkIGludCkoX24pOyAgIFwK
LSAgICAgIChfbG9nMikgPSAwOyAgICAgICAgICAgICAgICAgICAgXAotICAgICAgaWYgKChqXykg
JiAoKGpfKS0xKSkgICAgICAgICAgICBcCi0gICAgICAoX2xvZzIpICs9IDE7ICAgICAgICAgICAg
ICAgXAotICAgICAgaWYgKChqXykgPj4gMTYpICAgICAgICAgICAgICAgICBcCi0gICAgICAoX2xv
ZzIpICs9IDE2LCAoal8pID4+PSAxNjsgXAotICAgICAgaWYgKChqXykgPj4gOCkgICAgICAgICAg
ICAgICAgICBcCi0gICAgICAoX2xvZzIpICs9IDgsIChqXykgPj49IDg7ICAgXAotICAgICAgaWYg
KChqXykgPj4gNCkgICAgICAgICAgICAgICAgICBcCi0gICAgICAoX2xvZzIpICs9IDQsIChqXykg
Pj49IDQ7ICAgXAotICAgICAgaWYgKChqXykgPj4gMikgICAgICAgICAgICAgICAgICBcCi0gICAg
ICAoX2xvZzIpICs9IDIsIChqXykgPj49IDI7ICAgXAotICAgICAgaWYgKChqXykgPj4gMSkgICAg
ICAgICAgICAgICAgICBcCi0gICAgICAoX2xvZzIpICs9IDE7Ci0KLWludCBGYXN0TG9nMih1bnNp
Z25lZCBpbnQgaSkgewotICAgIGludCBsb2cyOwotICAgIEZBU1RfTE9HMihsb2cyLGkpOwotICAg
IHJldHVybiBsb2cyOwotfQotCi1MUlVMaXN0KiBDYWNoZTo6Z2V0TFJVTGlzdEZvcihDYWNoZWRP
YmplY3QqIG8pCi17Ci0gICAgaW50IGFjY2Vzc0NvdW50ID0gby0+YWNjZXNzQ291bnQoKTsKLSAg
ICBpbnQgcXVldWVJbmRleDsKLSAgICBpZiAoYWNjZXNzQ291bnQgPT0gMCkgewotICAgICAgICBx
dWV1ZUluZGV4ID0gMDsKLSAgICB9IGVsc2UgewotICAgICAgICBpbnQgc2l6ZUxvZyA9IEZhc3RM
b2cyKG8tPnNpemUoKSk7Ci0gICAgICAgIHF1ZXVlSW5kZXggPSBzaXplTG9nL28tPmFjY2Vzc0Nv
dW50KCkgLSAxOwotICAgICAgICBpZiAocXVldWVJbmRleCA8IDApCi0gICAgICAgICAgICBxdWV1
ZUluZGV4ID0gMDsKLSAgICAgICAgaWYgKHF1ZXVlSW5kZXggPj0gTUFYX0xSVV9MSVNUUykKLSAg
ICAgICAgICAgIHF1ZXVlSW5kZXggPSBNQVhfTFJVX0xJU1RTLTE7Ci0gICAgfQotICAgIGlmICht
X0xSVUxpc3RzID09IDApIHsKLSAgICAgICAgbV9MUlVMaXN0cyA9IG5ldyBMUlVMaXN0IFtNQVhf
TFJVX0xJU1RTXTsKLSAgICB9Ci0gICAgcmV0dXJuICZtX0xSVUxpc3RzW3F1ZXVlSW5kZXhdOwot
fQotCi12b2lkIENhY2hlOjpyZW1vdmVGcm9tTFJVTGlzdChDYWNoZWRPYmplY3QgKm9iamVjdCkK
K3ZvaWQgRG9jTG9hZGVyOjpzZXRBdXRvbG9hZEltYWdlcyggYm9vbCBlbmFibGUgKQogewotICAg
IENhY2hlZE9iamVjdCAqbmV4dCA9IG9iamVjdC0+bV9uZXh0SW5MUlVMaXN0OwotICAgIENhY2hl
ZE9iamVjdCAqcHJldiA9IG9iamVjdC0+bV9wcmV2SW5MUlVMaXN0OwotICAgIGJvb2wgdW5jYWNo
ZWFibGUgPSBvYmplY3QtPnN0YXR1cygpID09IENhY2hlZE9iamVjdDo6VW5jYWNoZWFibGU7Ci0g
ICAgCi0gICAgTFJVTGlzdCogbGlzdCA9IHVuY2FjaGVhYmxlID8gMCA6IGdldExSVUxpc3RGb3Io
b2JqZWN0KTsKLSAgICBDYWNoZWRPYmplY3QgKiZoZWFkID0gdW5jYWNoZWFibGUgPyBtX2hlYWRP
ZlVuY2FjaGVhYmxlTGlzdCA6IGxpc3QtPm1faGVhZDsKLSAgICAKLSAgICBpZiAobmV4dCA9PSAw
ICYmIHByZXYgPT0gMCAmJiBoZWFkICE9IG9iamVjdCkgeworICAgIGlmICggZW5hYmxlID09IG1f
YmF1dG9sb2FkSW1hZ2VzICkKICAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAKLSAgICBvYmpl
Y3QtPm1fbmV4dEluTFJVTGlzdCA9IDA7Ci0gICAgb2JqZWN0LT5tX3ByZXZJbkxSVUxpc3QgPSAw
OwotICAgIAotICAgIGlmIChuZXh0KQotICAgICAgICBuZXh0LT5tX3ByZXZJbkxSVUxpc3QgPSBw
cmV2OwotICAgIGVsc2UgaWYgKCF1bmNhY2hlYWJsZSAmJiBsaXN0LT5tX3RhaWwgPT0gb2JqZWN0
KQotICAgICAgICBsaXN0LT5tX3RhaWwgPSBwcmV2OwotCi0gICAgaWYgKHByZXYpCi0gICAgICAg
IHByZXYtPm1fbmV4dEluTFJVTGlzdCA9IG5leHQ7Ci0gICAgZWxzZSBpZiAoaGVhZCA9PSBvYmpl
Y3QpCi0gICAgICAgIGhlYWQgPSBuZXh0OwotICAgIAotICAgIC0tbV9jb3VudE9mTFJVQW5kVW5j
YWNoZWFibGVMaXN0czsKLSAgICAKLSAgICBpZiAoIXVuY2FjaGVhYmxlKQotICAgICAgICBtX3Rv
dGFsU2l6ZU9mTFJVTGlzdHMgLT0gb2JqZWN0LT5zaXplKCk7Ci19CiAKLXZvaWQgQ2FjaGU6Om1v
dmVUb0hlYWRPZkxSVUxpc3QoQ2FjaGVkT2JqZWN0ICpvYmplY3QpCi17Ci0gICAgaW5zZXJ0SW5M
UlVMaXN0KG9iamVjdCk7Ci19CisgICAgbV9iYXV0b2xvYWRJbWFnZXMgPSBlbmFibGU7CiAKLXZv
aWQgQ2FjaGU6Omluc2VydEluTFJVTGlzdChDYWNoZWRPYmplY3QgKm9iamVjdCkKLXsKLSAgICBy
ZW1vdmVGcm9tTFJVTGlzdChvYmplY3QpOwotICAgIAotICAgIGlmICghb2JqZWN0LT5hbGxvd0lu
TFJVTGlzdCgpKQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgTFJVTGlzdCogbGlzdCA9IGdl
dExSVUxpc3RGb3Iob2JqZWN0KTsKLSAgICAKLSAgICBib29sIHVuY2FjaGVhYmxlID0gb2JqZWN0
LT5zdGF0dXMoKSA9PSBDYWNoZWRPYmplY3Q6OlVuY2FjaGVhYmxlOwotICAgIENhY2hlZE9iamVj
dCAqJmhlYWQgPSB1bmNhY2hlYWJsZSA/IG1faGVhZE9mVW5jYWNoZWFibGVMaXN0IDogbGlzdC0+
bV9oZWFkOworICAgIGlmICggIW1fYmF1dG9sb2FkSW1hZ2VzICkgcmV0dXJuOwogCi0gICAgb2Jq
ZWN0LT5tX25leHRJbkxSVUxpc3QgPSBoZWFkOwotICAgIGlmIChoZWFkKQotICAgICAgICBoZWFk
LT5tX3ByZXZJbkxSVUxpc3QgPSBvYmplY3Q7Ci0gICAgaGVhZCA9IG9iamVjdDsKLSAgICAKLSAg
ICBpZiAob2JqZWN0LT5tX25leHRJbkxSVUxpc3QgPT0gMCAmJiAhdW5jYWNoZWFibGUpCi0gICAg
ICAgIGxpc3QtPm1fdGFpbCA9IG9iamVjdDsKLSAgICAKLSAgICArK21fY291bnRPZkxSVUFuZFVu
Y2FjaGVhYmxlTGlzdHM7Ci0gICAgCi0gICAgaWYgKCF1bmNhY2hlYWJsZSkKLSAgICAgICAgbV90
b3RhbFNpemVPZkxSVUxpc3RzICs9IG9iamVjdC0+c2l6ZSgpOwotfQorICAgIGZvciAoIGNvbnN0
IENhY2hlZE9iamVjdCogY289bV9kb2NPYmplY3RzLmZpcnN0KCk7IGNvOyBjbz1tX2RvY09iamVj
dHMubmV4dCgpICkKKyAgICAgICAgaWYgKCBjby0+dHlwZSgpID09IENhY2hlZE9iamVjdDo6SW1h
Z2UgKQorICAgICAgICB7CisgICAgICAgICAgICBDYWNoZWRJbWFnZSAqaW1nID0gY29uc3RfY2Fz
dDxDYWNoZWRJbWFnZSo+KCBzdGF0aWNfY2FzdDxjb25zdCBDYWNoZWRJbWFnZSAqPiggY28gKSAp
OwogCi1ib29sIENhY2hlOjphZGp1c3RTaXplKENhY2hlZE9iamVjdCAqb2JqZWN0LCBpbnQgZGVs
dGEpCi17Ci0gICAgaWYgKG9iamVjdC0+c3RhdHVzKCkgPT0gQ2FjaGVkT2JqZWN0OjpVbmNhY2hl
YWJsZSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgQ2FjaGVkT2JqZWN0OjpT
dGF0dXMgc3RhdHVzID0gaW1nLT5zdGF0dXMoKTsKKyAgICAgICAgICAgIGlmICggc3RhdHVzICE9
IENhY2hlZE9iamVjdDo6VW5rbm93biApCisgICAgICAgICAgICAgICAgY29udGludWU7CiAKLSAg
ICBpZiAob2JqZWN0LT5tX25leHRJbkxSVUxpc3QgPT0gMCAmJiBvYmplY3QtPm1fcHJldkluTFJV
TGlzdCA9PSAwICYmCi0gICAgICAgIGdldExSVUxpc3RGb3Iob2JqZWN0KS0+bV9oZWFkICE9IG9i
amVjdCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgIG1fdG90YWxTaXplT2ZMUlVM
aXN0cyArPSBkZWx0YTsKLSAgICByZXR1cm4gZGVsdGEgIT0gMDsKKyAgICAgICAgICAgIENhY2hl
Ojpsb2FkZXIoKS0+bG9hZCh0aGlzLCBpbWcsIHRydWUpOworICAgICAgICB9CiB9CiAKLS8vIC0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUNhY2hlZE9iamVjdENsaWVu
dCAqQ2FjaGVkT2JqZWN0Q2xpZW50V2Fsa2VyOjpuZXh0KCkKK3ZvaWQgRG9jTG9hZGVyOjpzZXRD
YWNoZVBvbGljeSggS0lPOjpDYWNoZUNvbnRyb2wgY2FjaGVQb2xpY3kgKQogewotICAgIC8vIE9u
bHkgYWR2YW5jZSBpZiB3ZSBhbHJlYWR5IHJldHVybmVkIHRoaXMgaXRlbS4KLSAgICAvLyBUaGlz
IGhhbmRsZXMgY2FzZXMgd2hlcmUgdGhlIGN1cnJlbnQgaXRlbSBpcyByZW1vdmVkLCBhbmQgcHJl
dmVudHMgdXMgZnJvbSBza2lwcGluZyB0aGUgbmV4dCBpdGVtLgotICAgIC8vIFRoZSBpdGVyYXRv
ciBhdXRvbWF0aWNhbGx5IGdldHMgYWR2YW5jZWQgdG8gdGhlIG5leHQgaXRlbSwgYW5kIHdlIG1h
a2Ugc3VyZSB3ZSByZXR1cm4gaXQuCi0gICAgaWYgKF9jdXJyZW50ID09IF9pdGVyYXRvci5jdXJy
ZW50KCkpCi0gICAgICAgICsrX2l0ZXJhdG9yOwotICAgIF9jdXJyZW50ID0gX2l0ZXJhdG9yLmN1
cnJlbnQoKTsKLSAgICByZXR1cm4gX2N1cnJlbnQ7CisgICAgbV9jYWNoZVBvbGljeSA9IGNhY2hl
UG9saWN5OwogfQogCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQot
Ci1DYWNoZWRPYmplY3RDbGllbnQ6On5DYWNoZWRPYmplY3RDbGllbnQoKSB7IH0KLXZvaWQgQ2Fj
aGVkT2JqZWN0Q2xpZW50OjpzZXRQaXhtYXAoY29uc3QgUVBpeG1hcCAmLCBjb25zdCBRUmVjdCYs
IENhY2hlZEltYWdlICopIHt9Ci12b2lkIENhY2hlZE9iamVjdENsaWVudDo6c2V0U3R5bGVTaGVl
dChjb25zdCBET006OkRPTVN0cmluZyAmLyp1cmwqLywgY29uc3QgRE9NOjpET01TdHJpbmcgJi8q
c2hlZXQqLykge30KLSNpZm5kZWYgS0hUTUxfTk9fWEJMCi12b2lkIENhY2hlZE9iamVjdENsaWVu
dDo6c2V0WEJMRG9jdW1lbnQoY29uc3QgRE9NOjpET01TdHJpbmcmIHVybCwgWEJMOjpYQkxEb2N1
bWVudEltcGwqIGRvYykge30KLSNlbmRpZgotdm9pZCBDYWNoZWRPYmplY3RDbGllbnQ6Om5vdGlm
eUZpbmlzaGVkKENhY2hlZE9iamVjdCAqIC8qZmluaXNoZWRPYmoqLykge30KLQotQ2FjaGU6OlN0
YXRpc3RpY3MgQ2FjaGU6OmdldFN0YXRpc3RpY3MoKQordm9pZCBEb2NMb2FkZXI6OnNldFNob3dB
bmltYXRpb25zKCBLSFRNTFNldHRpbmdzOjpLQW5pbWF0aW9uQWR2aWNlIHNob3dBbmltYXRpb25z
ICkKIHsKLSAgICBTdGF0aXN0aWNzIHN0YXRzOworICAgIGlmICggc2hvd0FuaW1hdGlvbnMgPT0g
bV9zaG93QW5pbWF0aW9ucyApIHJldHVybjsKKyAgICBtX3Nob3dBbmltYXRpb25zID0gc2hvd0Fu
aW1hdGlvbnM7CiAKLSAgICBpZiAoIWNhY2hlKQotICAgICAgICByZXR1cm4gc3RhdHM7CisgICAg
Y29uc3QgQ2FjaGVkT2JqZWN0KiBjbzsKKyAgICBmb3IgKCBjbz1tX2RvY09iamVjdHMuZmlyc3Qo
KTsgY287IGNvPW1fZG9jT2JqZWN0cy5uZXh0KCkgKQorICAgICAgICBpZiAoIGNvLT50eXBlKCkg
PT0gQ2FjaGVkT2JqZWN0OjpJbWFnZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIENhY2hlZElt
YWdlICppbWcgPSBjb25zdF9jYXN0PENhY2hlZEltYWdlKj4oIHN0YXRpY19jYXN0PGNvbnN0IENh
Y2hlZEltYWdlICo+KCBjbyApICk7CiAKLSAgICBRRGljdEl0ZXJhdG9yPENhY2hlZE9iamVjdD4g
aSgqY2FjaGUpOwotICAgIGZvciAoaS50b0ZpcnN0KCk7IGkuY3VycmVudCgpOyArK2kpIHsKLSAg
ICAgICAgQ2FjaGVkT2JqZWN0ICpvID0gaS5jdXJyZW50KCk7Ci0gICAgICAgIHN3aXRjaCAoby0+
dHlwZSgpKSB7Ci0gICAgICAgICAgICBjYXNlIENhY2hlZE9iamVjdDo6SW1hZ2U6Ci0gICAgICAg
ICAgICAgICAgc3RhdHMuaW1hZ2VzLmNvdW50Kys7Ci0gICAgICAgICAgICAgICAgc3RhdHMuaW1h
Z2VzLnNpemUgKz0gby0+c2l6ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAg
ICAgICBjYXNlIENhY2hlZE9iamVjdDo6Q1NTU3R5bGVTaGVldDoKLSAgICAgICAgICAgICAgICBz
dGF0cy5zdHlsZVNoZWV0cy5jb3VudCsrOwotICAgICAgICAgICAgICAgIHN0YXRzLnN0eWxlU2hl
ZXRzLnNpemUgKz0gby0+c2l6ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAg
ICAgICBjYXNlIENhY2hlZE9iamVjdDo6U2NyaXB0OgotICAgICAgICAgICAgICAgIHN0YXRzLnNj
cmlwdHMuY291bnQrKzsKLSAgICAgICAgICAgICAgICBzdGF0cy5zY3JpcHRzLnNpemUgKz0gby0+
c2l6ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotI2lmZGVmIEtIVE1MX1hTTFQKLSAgICAg
ICAgICAgIGNhc2UgQ2FjaGVkT2JqZWN0OjpYU0xTdHlsZVNoZWV0OgotICAgICAgICAgICAgICAg
IHN0YXRzLnhzbFN0eWxlU2hlZXRzLmNvdW50Kys7Ci0gICAgICAgICAgICAgICAgc3RhdHMueHNs
U3R5bGVTaGVldHMuc2l6ZSArPSBvLT5zaXplKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0j
ZW5kaWYKLSNpZm5kZWYgS0hUTUxfTk9fWEJMCi0gICAgICAgICAgICBjYXNlIENhY2hlZE9iamVj
dDo6WEJMOgotICAgICAgICAgICAgICAgIHN0YXRzLnhibERvY3MuY291bnQrKzsKLSAgICAgICAg
ICAgICAgICBzdGF0cy54YmxEb2NzLnNpemUgKz0gby0+c2l6ZSgpOwotICAgICAgICAgICAgICAg
IGJyZWFrOwotI2VuZGlmCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHN0
YXRzLm90aGVyLmNvdW50Kys7Ci0gICAgICAgICAgICAgICAgc3RhdHMub3RoZXIuc2l6ZSArPSBv
LT5zaXplKCk7CisgICAgICAgICAgICBpbWctPnNldFNob3dBbmltYXRpb25zKCBzaG93QW5pbWF0
aW9ucyApOwogICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiBzdGF0czsKIH0KIAot
dm9pZCBDYWNoZTo6Zmx1c2hBbGwoKQordm9pZCBEb2NMb2FkZXI6OnJlbW92ZUNhY2hlZE9iamVj
dCggQ2FjaGVkT2JqZWN0KiBvICkgY29uc3QKIHsKLSAgICBpZiAoIWNhY2hlKQotICAgICAgICBy
ZXR1cm47Ci0KLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIFFEaWN0SXRlcmF0b3I8Q2FjaGVkT2Jq
ZWN0PiBpKCpjYWNoZSk7Ci0gICAgICAgIENhY2hlZE9iamVjdCAqbyA9IGkudG9GaXJzdCgpOwot
ICAgICAgICBpZiAoIW8pCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgcmVtb3ZlQ2FjaGVF
bnRyeShvKTsKLSAgICB9CisgICAgbV9kb2NPYmplY3RzLnJlbW92ZVJlZiggbyApOwogfQogCi12
b2lkIENhY2hlOjpzZXRDYWNoZURpc2FibGVkKGJvb2wgZGlzYWJsZWQpCit2b2lkIERvY0xvYWRl
cjo6c2V0TG9hZEluUHJvZ3Jlc3MoYm9vbCBsb2FkKQogewotICAgIGNhY2hlRGlzYWJsZWQgPSBk
aXNhYmxlZDsKLSAgICBpZiAoZGlzYWJsZWQpCi0gICAgICAgIGZsdXNoQWxsKCk7CisgICAgbV9s
b2FkSW5Qcm9ncmVzcyA9IGxvYWQ7CiB9CisKK307CkluZGV4OiBraHRtbHZpZXcuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIGtodG1sdmlldy5jcHAJKHJldmlzaW9uIDExOTQ0KQorKysga2h0bWx2aWV3LmNw
cAkod29ya2luZyBjb3B5KQpAQCAtNTcsNiArNTcsOCBAQAogCiAjaW5jbHVkZSAiS1dRQWNjT2Jq
ZWN0Q2FjaGUuaCIKIAorI2luY2x1ZGUgIkNhY2hlZEltYWdlLmgiCisKIC8vICNkZWZpbmUgSU5T
VFJVTUVOVF9MQVlPVVRfU0NIRURVTElORyAxCiAKIHVzaW5nIG5hbWVzcGFjZSBET007CkluZGV4
OiB4bWwvZG9tX3htbGltcGwuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHhtbC9kb21feG1saW1wbC5jcHAJ
KHJldmlzaW9uIDExOTQzKQorKysgeG1sL2RvbV94bWxpbXBsLmNwcAkod29ya2luZyBjb3B5KQpA
QCAtMjksNyArMjksOSBAQAogI2lmZGVmIEtIVE1MX1hTTFQKICNpbmNsdWRlICJ4c2xfc3R5bGVz
aGVldGltcGwuaCIKICNlbmRpZgotI2luY2x1ZGUgIm1pc2MvbG9hZGVyLmgiCisjaW5jbHVkZSAi
Q2FjaGVkWFNMU3R5bGVTaGVldC5oIgorI2luY2x1ZGUgIkNhY2hlZENTU1N0eWxlU2hlZXQuaCIK
KyNpbmNsdWRlICJEb2NMb2FkZXIuaCIKICNpbmNsdWRlICJ4bWwveG1sX3Rva2VuaXplci5oIgog
CiB1c2luZyBraHRtbDo6cGFyc2VBdHRyaWJ1dGVzOwpJbmRleDogeG1sL2RvbV9kb2NpbXBsLmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSB4bWwvZG9tX2RvY2ltcGwuY3BwCShyZXZpc2lvbiAxMTk0NCkKKysr
IHhtbC9kb21fZG9jaW1wbC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQxLDYgKzQxLDcgQEAKICNp
bmNsdWRlICJjc3MvY3NzX3N0eWxlc2hlZXRpbXBsLmgiCiAjaW5jbHVkZSAiY3NzL2Nzc192YWx1
ZWltcGwuaCIKICNpbmNsdWRlICJtaXNjL2hlbHBlci5oIgorI2luY2x1ZGUgIkRvY0xvYWRlci5o
IgogI2luY2x1ZGUgImVjbWEva2pzX3Byb3h5LmgiCiAjaW5jbHVkZSAiZWNtYS9ranNfYmluZGlu
Zy5oIgogCkluZGV4OiB4bWwveG1sX3Rva2VuaXplci5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0geG1sL3ht
bF90b2tlbml6ZXIuY3BwCShyZXZpc2lvbiAxMTk0MykKKysrIHhtbC94bWxfdG9rZW5pemVyLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtMzEsNyArMzEsOCBAQAogI2luY2x1ZGUgImh0bWwvaHRtbF9o
ZWFkaW1wbC5oIgogI2luY2x1ZGUgImh0bWwvaHRtbF90YWJsZWltcGwuaCIKICNpbmNsdWRlICJo
dG1sbmFtZXMuaCIKLSNpbmNsdWRlICJtaXNjL2xvYWRlci5oIgorI2luY2x1ZGUgIkNhY2hlZFNj
cmlwdC5oIgorI2luY2x1ZGUgIkRvY0xvYWRlci5oIgogI2luY2x1ZGUgPGt4bWxjb3JlL0hhc2hN
YXAuaD4KIAogI2luY2x1ZGUgImtodG1sdmlldy5oIgpJbmRleDogaHRtbC9odG1sdG9rZW5pemVy
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBodG1sL2h0bWx0b2tlbml6ZXIuY3BwCShyZXZpc2lvbiAxMTk0
MykKKysrIGh0bWwvaHRtbHRva2VuaXplci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM4LDcgKzM4
LDggQEAKICNpbmNsdWRlICJodG1sL2h0bWxfZG9jdW1lbnRpbXBsLmgiCiAjaW5jbHVkZSAiaHRt
bC9odG1scGFyc2VyLmgiCiAKLSNpbmNsdWRlICJtaXNjL2xvYWRlci5oIgorI2luY2x1ZGUgIkRv
Y0xvYWRlci5oIgorI2luY2x1ZGUgIkNhY2hlZFNjcmlwdC5oIgogCiAjaW5jbHVkZSAia2h0bWx2
aWV3LmgiCiAjaW5jbHVkZSAia2h0bWxfcGFydC5oIgpAQCAtNTYsMTkgKzU3LDcgQEAKIHVzaW5n
IG5hbWVzcGFjZSBET006OkhUTUxOYW1lczsKIHVzaW5nIG5hbWVzcGFjZSBET006OkV2ZW50TmFt
ZXM7CiAKLXVzaW5nIERPTTo6QXRvbWljU3RyaW5nOwotdXNpbmcgRE9NOjpBdHRyaWJ1dGVJbXBs
OwotdXNpbmcgRE9NOjpET01TdHJpbmc7Ci11c2luZyBET006OkRPTVN0cmluZ0ltcGw7Ci11c2lu
ZyBET006OkRvY3VtZW50SW1wbDsKLXVzaW5nIERPTTo6ZW1wdHlBdG9tOwotdXNpbmcgRE9NOjpj
b21tZW50QXRvbTsKLXVzaW5nIERPTTo6bnVsbEF0b207Ci11c2luZyBET006OnRleHRBdG9tOwot
dXNpbmcgRE9NOjpRdWFsaWZpZWROYW1lOwotdXNpbmcgRE9NOjpNYXBwZWRBdHRyaWJ1dGVJbXBs
OwotdXNpbmcgRE9NOjpOYW1lZE1hcHBlZEF0dHJNYXBJbXBsOwotdXNpbmcgRE9NOjpOb2RlSW1w
bDsKK3VzaW5nIG5hbWVzcGFjZSBET007CiAKICNpbmNsdWRlICJrZW50aXRpZXMuYyIKIApJbmRl
eDogaHRtbC9odG1sX2hlYWRpbXBsLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBodG1sL2h0bWxfaGVhZGlt
cGwuY3BwCShyZXZpc2lvbiAxMTk0MykKKysrIGh0bWwvaHRtbF9oZWFkaW1wbC5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTM0LDcgKzM0LDkgQEAKICNpbmNsdWRlICJraHRtbF9wYXJ0LmgiCiAjaW5j
bHVkZSAia2pzX3Byb3h5LmgiCiAKLSNpbmNsdWRlICJtaXNjL2xvYWRlci5oIgorI2luY2x1ZGUg
IkNhY2hlZENTU1N0eWxlU2hlZXQuaCIKKyNpbmNsdWRlICJDYWNoZWRTY3JpcHQuaCIKKyNpbmNs
dWRlICJEb2NMb2FkZXIuaCIKICNpbmNsdWRlICJtaXNjL2hlbHBlci5oIgogCiAjaW5jbHVkZSAi
Y3NzL2Nzc3N0eWxlc2VsZWN0b3IuaCIKSW5kZXg6IGh0bWwvaHRtbF9pbWFnZWltcGwuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIGh0bWwvaHRtbF9pbWFnZWltcGwuY3BwCShyZXZpc2lvbiAxMTk0MykKKysr
IGh0bWwvaHRtbF9pbWFnZWltcGwuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00MCw2ICs0MCw3IEBA
CiAjaW5jbHVkZSAiY3NzL2Nzc2hlbHBlci5oIgogI2luY2x1ZGUgInhtbC9kb20yX2V2ZW50c2lt
cGwuaCIKICNpbmNsdWRlICJ4bWwvRXZlbnROYW1lcy5oIgorI2luY2x1ZGUgIkRvY0xvYWRlci5o
IgogCiAjaW5jbHVkZSA8cXN0cmluZy5oPgogI2luY2x1ZGUgPHFyZWdpb24uaD4KSW5kZXg6IGh0
bWwvaHRtbF9pbWFnZWltcGwuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBodG1sL2h0bWxfaW1hZ2VpbXBsLmgJ
KHJldmlzaW9uIDExOTQzKQorKysgaHRtbC9odG1sX2ltYWdlaW1wbC5oCSh3b3JraW5nIGNvcHkp
CkBAIC0yOSwxMyArMjksMTMgQEAKICNpbmNsdWRlICJyZW5kZXJpbmcvcmVuZGVyX29iamVjdC5o
IgogCiAjaW5jbHVkZSA8bG9hZGVyLmg+CisjaW5jbHVkZSAiQ2FjaGVkSW1hZ2UuaCIKIAogI2lu
Y2x1ZGUgPHFyZWdpb24uaD4KICNpbmNsdWRlIDxxbWFwLmg+CiAjaW5jbHVkZSA8cXBpeG1hcC5o
PgogCiBuYW1lc3BhY2Uga2h0bWwgewotICAgIGNsYXNzIENhY2hlZEltYWdlOwogICAgIGNsYXNz
IENhY2hlZE9iamVjdENsaWVudDsKIH0KIApJbmRleDogZWNtYS94bWxodHRwcmVxdWVzdC5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gZWNtYS94bWxodHRwcmVxdWVzdC5jcHAJKHJldmlzaW9uIDExOTQzKQor
KysgZWNtYS94bWxodHRwcmVxdWVzdC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI2LDcgKzI2LDcg
QEAKIAogI2luY2x1ZGUgImRvbS9kb21fZXhjZXB0aW9uLmgiCiAjaW5jbHVkZSAiZG9tL2RvbV9z
dHJpbmcuaCIKLSNpbmNsdWRlICJtaXNjL2xvYWRlci5oIgorI2luY2x1ZGUgIkNhY2hlLmgiCiAj
aW5jbHVkZSAiaHRtbC9odG1sX2RvY3VtZW50aW1wbC5oIgogI2luY2x1ZGUgInhtbC9kb20yX2V2
ZW50c2ltcGwuaCIKICNpbmNsdWRlICJ4bWwvRXZlbnROYW1lcy5oIgpAQCAtMzgsNiArMzgsNyBA
QAogI2luY2x1ZGUgPGtpby9qb2IuaD4KICNpbmNsdWRlIDxxb2JqZWN0Lmg+CiAjaW5jbHVkZSA8
cXJlZ2V4cC5oPgorI2luY2x1ZGUgPHF0ZXh0Y29kZWMuaD4KIAogI2luY2x1ZGUgIktXUUxvYWRl
ci5oIgogCkluZGV4OiBlY21hL2tqc19ldmVudHMuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGVjbWEva2pz
X2V2ZW50cy5jcHAJKHJldmlzaW9uIDExOTQzKQorKysgZWNtYS9ranNfZXZlbnRzLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtMzIsNyArMzIsNyBAQAogI2luY2x1ZGUgInhtbC9kb20yX3ZpZXdzaW1w
bC5oIgogI2luY2x1ZGUgInhtbC9FdmVudE5hbWVzLmgiCiAjaW5jbHVkZSAicmVuZGVyaW5nL3Jl
bmRlcl9vYmplY3QuaCIKLSNpbmNsdWRlICJtaXNjL2xvYWRlci5oIgorI2luY2x1ZGUgIkNhY2hl
ZEltYWdlLmgiCiAKICNpbmNsdWRlIDxrZGVidWcuaD4KIApJbmRleDogZWNtYS9ranNfaHRtbC5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gZWNtYS9ranNfaHRtbC5jcHAJKHJldmlzaW9uIDExOTQzKQorKysg
ZWNtYS9ranNfaHRtbC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTIyLDcgKzIyLDcgQEAKICNpbmNs
dWRlICJjb25maWcuaCIKICNpbmNsdWRlICJranNfaHRtbC5oIgogCi0jaW5jbHVkZSAibWlzYy9s
b2FkZXIuaCIKKyNpbmNsdWRlICJEb2NMb2FkZXIuaCIKICNpbmNsdWRlICJkb20vZG9tX2V4Y2Vw
dGlvbi5oIgogI2luY2x1ZGUgInhtbC9kb21fYXRvbWljc3RyaW5nLmgiCiAjaW5jbHVkZSAieG1s
L2RvbTJfZXZlbnRzaW1wbC5oIgpJbmRleDogeHNsL3hzbF9zdHlsZXNoZWV0aW1wbC5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0geHNsL3hzbF9zdHlsZXNoZWV0aW1wbC5jcHAJKHJldmlzaW9uIDExOTQzKQor
KysgeHNsL3hzbF9zdHlsZXNoZWV0aW1wbC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI4LDYgKzI4
LDggQEAKICNpbmNsdWRlICJ4bWwvZG9tX25vZGVpbXBsLmgiCiAjaW5jbHVkZSAiaHRtbC9odG1s
X2RvY3VtZW50aW1wbC5oIgogI2luY2x1ZGUgIm1pc2MvbG9hZGVyLmgiCisjaW5jbHVkZSAiQ2Fj
aGVkWFNMU3R5bGVTaGVldC5oIgorI2luY2x1ZGUgIkRvY0xvYWRlci5oIgogI2luY2x1ZGUgInhz
bF9zdHlsZXNoZWV0aW1wbC5oIgogCiAjaW5jbHVkZSA8a2RlYnVnLmg+CkluZGV4OiB4c2wveHNs
X3N0eWxlc2hlZXRpbXBsLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0geHNsL3hzbF9zdHlsZXNoZWV0aW1wbC5o
CShyZXZpc2lvbiAxMTk0MykKKysrIHhzbC94c2xfc3R5bGVzaGVldGltcGwuaAkod29ya2luZyBj
b3B5KQpAQCAtMjUsMTMgKzI1LDE1IEBACiAjaWZkZWYgS0hUTUxfWFNMVAogCiAjaW5jbHVkZSAi
Y3NzL2Nzc19zdHlsZXNoZWV0aW1wbC5oIgotI2luY2x1ZGUgIm1pc2MvbG9hZGVyLmgiCi0KICNp
bmNsdWRlIDxsaWJ4bWwvcGFyc2VyLmg+CiAjaW5jbHVkZSA8bGlieG1sL3BhcnNlckludGVybmFs
cy5oPgogCiAjaW5jbHVkZSA8bGlieHNsdC90cmFuc2Zvcm0uaD4KIAorbmFtZXNwYWNlIGtodG1s
IHsKKyAgICBjbGFzcyBDYWNoZWRYU0xTdHlsZVNoZWV0OworfTsKKwogbmFtZXNwYWNlIERPTSB7
CiAKIGNsYXNzIFhTTEltcG9ydFJ1bGVJbXBsOwpJbmRleDogeHNsL3hzbHRfcHJvY2Vzc29yaW1w
bC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0geHNsL3hzbHRfcHJvY2Vzc29yaW1wbC5jcHAJKHJldmlzaW9u
IDExOTQzKQorKysgeHNsL3hzbHRfcHJvY2Vzc29yaW1wbC5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTI5LDYgKzI5LDggQEAKICNpbmNsdWRlICJodG1sdG9rZW5pemVyLmgiCiAjaW5jbHVkZSAiaHRt
bF9kb2N1bWVudGltcGwuaCIKICNpbmNsdWRlICJsb2FkZXIuaCIKKyNpbmNsdWRlICJDYWNoZS5o
IgorI2luY2x1ZGUgIkRvY0xvYWRlci5oIgogI2luY2x1ZGUgIm1hcmt1cC5oIgogI2luY2x1ZGUg
ImtodG1sdmlldy5oIgogI2luY2x1ZGUgImtodG1sX3BhcnQuaCIKSW5kZXg6IHJlbmRlcmluZy9y
ZW5kZXJfbGluZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gcmVuZGVyaW5nL3JlbmRlcl9saW5lLmNwcAko
cmV2aXNpb24gMTE5NDQpCisrKyByZW5kZXJpbmcvcmVuZGVyX2xpbmUuY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSAicmVuZGVyaW5nL3JlbmRlcl90YWJsZS5o
IgogI2luY2x1ZGUgInhtbC9kb21fbm9kZWltcGwuaCIKICNpbmNsdWRlICJ4bWwvZG9tX2RvY2lt
cGwuaCIKKyNpbmNsdWRlICJDYWNoZWRJbWFnZS5oIgogI2luY2x1ZGUgImh0bWwvaHRtbF9mb3Jt
aW1wbC5oIgogI2luY2x1ZGUgInJlbmRlcl9pbmxpbmUuaCIKICNpbmNsdWRlICJyZW5kZXJfYmxv
Y2suaCIKSW5kZXg6IHJlbmRlcmluZy9yZW5kZXJfYm94LmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSByZW5k
ZXJpbmcvcmVuZGVyX2JveC5jcHAJKHJldmlzaW9uIDExOTQzKQorKysgcmVuZGVyaW5nL3JlbmRl
cl9ib3guY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00Miw2ICs0Miw3IEBACiAjaW5jbHVkZSAieG1s
L2RvbV9ub2RlaW1wbC5oIgogI2luY2x1ZGUgInhtbC9kb21fZG9jaW1wbC5oIgogI2luY2x1ZGUg
Imh0bWwvaHRtbF9lbGVtZW50aW1wbC5oIgorI2luY2x1ZGUgIkNhY2hlZEltYWdlLmgiCiAKICNp
bmNsdWRlICJyZW5kZXJfbGluZS5oIgogCkluZGV4OiByZW5kZXJpbmcvcmVuZGVyX2xpc3QuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIHJlbmRlcmluZy9yZW5kZXJfbGlzdC5jcHAJKHJldmlzaW9uIDExOTQz
KQorKysgcmVuZGVyaW5nL3JlbmRlcl9saXN0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjcsNiAr
MjcsNyBAQAogI2luY2x1ZGUgInJlbmRlcmluZy9yZW5kZXJfY2FudmFzLmgiCiAKICNpbmNsdWRl
ICJ4bWwvZG9tX2RvY2ltcGwuaCIKKyNpbmNsdWRlICJDYWNoZWRJbWFnZS5oIgogCiAjaW5jbHVk
ZSAiaHRtbG5hbWVzLmgiCiAKSW5kZXg6IHJlbmRlcmluZy9yZW5kZXJfb2JqZWN0LmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSByZW5kZXJpbmcvcmVuZGVyX29iamVjdC5jcHAJKHJldmlzaW9uIDExOTQ0KQor
KysgcmVuZGVyaW5nL3JlbmRlcl9vYmplY3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zNSw2ICsz
NSw3IEBACiAjaW5jbHVkZSAieG1sL2RvbV9kb2NpbXBsLmgiCiAjaW5jbHVkZSAieG1sL2RvbV9w
b3NpdGlvbi5oIgogI2luY2x1ZGUgInhtbC9FdmVudE5hbWVzLmgiCisjaW5jbHVkZSAiQ2FjaGVk
SW1hZ2UuaCIKICNpbmNsdWRlICJjc3MvY3Nzc3R5bGVzZWxlY3Rvci5oIgogI2luY2x1ZGUgPGtk
ZWJ1Zy5oPgogI2luY2x1ZGUgPHFwYWludGVyLmg+Cg==
</data>

          </attachment>
      

    </bug>

</bugzilla>