<?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>6683</bug_id>
          
          <creation_ts>2006-01-20 00:02:19 -0800</creation_ts>
          <short_desc>break render_table out into separate files (one per class)</short_desc>
          <delta_ts>2006-01-21 11:21:22 -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>28959</commentid>
    <comment_count>0</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2006-01-20 00:02:19 -0800</bug_when>
    <thetext>break render_table out into separate files (one per class)

I also am moving render_container to RenderContainer and render_block to RenderBlock at the same time.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>28960</commentid>
    <comment_count>1</comment_count>
      <attachid>5795</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2006-01-20 00:03:19 -0800</bug_when>
    <thetext>Created attachment 5795
proposed patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>28961</commentid>
    <comment_count>2</comment_count>
      <attachid>5795</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2006-01-20 00:04:27 -0800</bug_when>
    <thetext>Comment on attachment 5795
proposed patch.

More of the same.  This patch breaks render_table out into separate files (one
per class) and moves render_block to RenderBlock and render_container to
RenderContainer.  I used my split_class.pl script like always, then just went
through and cleaned up the headers.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>28991</commentid>
    <comment_count>3</comment_count>
      <attachid>5795</attachid>
    <who name="Beth Dakin">bdakin</who>
    <bug_when>2006-01-20 10:25:03 -0800</bug_when>
    <thetext>Comment on attachment 5795
proposed patch.

Part of me likes having all of the table classes in one file, but this is
probably better. It does seem much cleaner this way. So r=me!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>29272</commentid>
    <comment_count>4</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2006-01-21 11:21:22 -0800</bug_when>
    <thetext>Eric landed this Thursday.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>5795</attachid>
            <date>2006-01-20 00:03:19 -0800</date>
            <delta_ts>2006-01-20 10:25:03 -0800</delta_ts>
            <desc>proposed patch.</desc>
            <filename>rendertable.patch</filename>
            <type>text/plain</type>
            <size>694160</size>
            <attacher name="Eric Seidel (no email)">eric</attacher>
            
              <data encoding="base64">SW5kZXg6IGtodG1sL3htbC9kb20yX3JhbmdlaW1wbC5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga2h0bWwv
eG1sL2RvbTJfcmFuZ2VpbXBsLmNwcAkocmV2aXNpb24gMTIyNTMpCisrKyBraHRtbC94bWwvZG9t
Ml9yYW5nZWltcGwuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zNyw3ICszNyw3IEBACiAjaW5jbHVk
ZSAiZWRpdGluZy92aXNpYmxlX3RleHQuaCIKICNpbmNsdWRlICJ4bWwvZG9tX3Bvc2l0aW9uLmgi
CiAKLSNpbmNsdWRlICJyZW5kZXJfYmxvY2suaCIKKyNpbmNsdWRlICJSZW5kZXJCbG9jay5oIgog
CiB1c2luZyBraHRtbDo6Y3JlYXRlTWFya3VwOwogdXNpbmcga2h0bWw6OlJlbmRlckJsb2NrOwpJ
bmRleDoga2h0bWwveG1sL2RvbV9wb3NpdGlvbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga2h0bWwveG1s
L2RvbV9wb3NpdGlvbi5jcHAJKHJldmlzaW9uIDEyMjUzKQorKysga2h0bWwveG1sL2RvbV9wb3Np
dGlvbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM5LDEyICszOSwxMiBAQAogI2luY2x1ZGUgInRl
eHRfYWZmaW5pdHkuaCIKICNpbmNsdWRlICJ2aXNpYmxlX3Bvc2l0aW9uLmgiCiAjaW5jbHVkZSAi
dmlzaWJsZV91bml0cy5oIgotI2luY2x1ZGUgInJlbmRlcmluZy9yZW5kZXJfYmxvY2suaCIKLSNp
bmNsdWRlICJyZW5kZXJpbmcvcmVuZGVyX2Zsb3cuaCIKLSNpbmNsdWRlICJyZW5kZXJpbmcvcmVu
ZGVyX2xpbmUuaCIKLSNpbmNsdWRlICJyZW5kZXJpbmcvcmVuZGVyX3N0eWxlLmgiCisjaW5jbHVk
ZSAiUmVuZGVyQmxvY2suaCIKKyNpbmNsdWRlICJyZW5kZXJfZmxvdy5oIgorI2luY2x1ZGUgInJl
bmRlcl9saW5lLmgiCisjaW5jbHVkZSAicmVuZGVyX3N0eWxlLmgiCiAjaW5jbHVkZSAiSW5saW5l
VGV4dEJveC5oIgotI2luY2x1ZGUgImVkaXRpbmcvdmlzaWJsZV90ZXh0LmgiCisjaW5jbHVkZSAi
dmlzaWJsZV90ZXh0LmgiCiAjaW5jbHVkZSAiaHRtbG5hbWVzLmgiCiAKICNpbmNsdWRlIDxreG1s
Y29yZS9Bc3NlcnRpb25zLmg+CkluZGV4OiBraHRtbC9lZGl0aW5nL3Zpc2libGVfdW5pdHMuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIGtodG1sL2VkaXRpbmcvdmlzaWJsZV91bml0cy5jcHAJKHJldmlzaW9u
IDEyMjUzKQorKysga2h0bWwvZWRpdGluZy92aXNpYmxlX3VuaXRzLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtMzEsNyArMzEsNyBAQAogI2luY2x1ZGUgImh0bWxuYW1lcy5oIgogI2luY2x1ZGUgImhl
bHBlci5oIgogI2luY2x1ZGUgIklubGluZVRleHRCb3guaCIKLSNpbmNsdWRlICJyZW5kZXJpbmcv
cmVuZGVyX2Jsb2NrLmgiCisjaW5jbHVkZSAiUmVuZGVyQmxvY2suaCIKICNpbmNsdWRlICJ2aXNp
YmxlX3Bvc2l0aW9uLmgiCiAjaW5jbHVkZSAidmlzaWJsZV90ZXh0LmgiCiAjaW5jbHVkZSAiRG9j
dW1lbnRJbXBsLmgiCkluZGV4OiBraHRtbC9odG1sL2h0bWxfdGFibGVpbXBsLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBraHRtbC9odG1sL2h0bWxfdGFibGVpbXBsLmNwcAkocmV2aXNpb24gMTIyNTMpCisr
KyBraHRtbC9odG1sL2h0bWxfdGFibGVpbXBsLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzcsNyAr
MzcsOSBAQAogI2luY2x1ZGUgImRvbV9leGNlcHRpb24uaCIKICNpbmNsdWRlICJkb21fbm9kZS5o
IgogI2luY2x1ZGUgImh0bWxfZG9jdW1lbnRpbXBsLmgiCi0jaW5jbHVkZSAicmVuZGVyX3RhYmxl
LmgiCisjaW5jbHVkZSAiUmVuZGVyVGFibGUuaCIKKyNpbmNsdWRlICJSZW5kZXJUYWJsZUNlbGwu
aCIKKyNpbmNsdWRlICJSZW5kZXJUYWJsZUNvbC5oIgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAK
QEAgLTIyMiw3ICsyMjQsNiBAQCBIVE1MRWxlbWVudEltcGwgKkhUTUxUYWJsZUVsZW1lbnRJbXBs
OjppCiAgICAgaWYoIWZpcnN0Qm9keSAmJiAhaGVhZCAmJiAhZm9vdCkKICAgICAgICAgc2V0VEJv
ZHkoIG5ldyBIVE1MVGFibGVTZWN0aW9uRWxlbWVudEltcGwodGJvZHlUYWcsIGdldERvY3VtZW50
KCksIHRydWUgLyogaW1wbGljaXQgKi8pICk7CiAKLSAgICAvL2tkRGVidWcoNjAzMCkgPDwga19m
dW5jaW5mbyA8PCBpbmRleCA8PCBlbmRsOwogICAgIC8vIElFIHRyZWF0cyBpbmRleD0tMSBhcyBk
ZWZhdWx0IHZhbHVlIG1lYW5pbmcgJ2FwcGVuZCBhZnRlciBsYXN0JwogICAgIC8vIFRoaXMgaXNu
J3QgaW4gdGhlIERPTS4gU28sIG5vdCBpbXBsZW1lbnRlZCB5ZXQuCiAgICAgSFRNTFRhYmxlU2Vj
dGlvbkVsZW1lbnRJbXBsKiBzZWN0aW9uID0gMEw7CkBAIC0yMzgsMTYgKzIzOSwxMyBAQCBIVE1M
RWxlbWVudEltcGwgKkhUTUxUYWJsZUVsZW1lbnRJbXBsOjppCiAgICAgICAgIHsKICAgICAgICAg
ICAgIHNlY3Rpb24gPSBzdGF0aWNfY2FzdDxIVE1MVGFibGVTZWN0aW9uRWxlbWVudEltcGwgKj4o
bm9kZSk7CiAgICAgICAgICAgICBsYXN0U2VjdGlvbiA9IHNlY3Rpb247Ci0gICAgICAgICAgICAv
L2tkRGVidWcoNjAzMCkgPDwga19mdW5jaW5mbyA8PCAic2VjdGlvbiBpZD0iIDw8IG5vZGUtPmlk
KCkgPDwgIiByb3dzOiIgPDwgc2VjdGlvbi0+bnVtUm93cygpIDw8IGVuZGw7Ci0gICAgICAgICAg
ICBpZiAoICFhcHBlbmQgKQotICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCFhcHBlbmQp
IHsKICAgICAgICAgICAgICAgICBpbnQgcm93cyA9IHNlY3Rpb24tPm51bVJvd3MoKTsKICAgICAg
ICAgICAgICAgICBpZiAocm93cyA+PSBpbmRleCkgewogICAgICAgICAgICAgICAgICAgICBmb3Vu
ZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0g
ZWxzZQogICAgICAgICAgICAgICAgICAgICBpbmRleCAtPSByb3dzOwotICAgICAgICAgICAgICAg
IC8va2REZWJ1Zyg2MDMwKSA8PCAiICAgICAgIGluZGV4IGlzIG5vdyAiIDw8IGluZGV4IDw8IGVu
ZGw7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0yNjEsMTAgKzI1OSw5IEBA
IEhUTUxFbGVtZW50SW1wbCAqSFRNTFRhYmxlRWxlbWVudEltcGw6OmkKICAgICAgICAgc2VjdGlv
biA9IGxhc3RTZWN0aW9uOwogICAgICAgICBpbmRleCA9IHNlY3Rpb24gPyBzZWN0aW9uLT5udW1S
b3dzKCkgOiAwOwogICAgIH0KLSAgICBpZiAoIHNlY3Rpb24gJiYgKGluZGV4ID49IDAgfHwgYXBw
ZW5kKSApIHsKLSAgICAgICAgLy9rZERlYnVnKDYwMzApIDw8ICJJbnNlcnRpbmcgcm93IGludG8g
c2VjdGlvbiAiIDw8IHNlY3Rpb24gPDwgIiBhdCBpbmRleCAiIDw8IGluZGV4IDw8IGVuZGw7Ci0g
ICAgICAgIHJldHVybiBzZWN0aW9uLT5pbnNlcnRSb3coIGluZGV4LCBleGNlcHRpb25jb2RlICk7
Ci0gICAgfSBlbHNlIHsKKyAgICBpZiAoc2VjdGlvbiAmJiAoaW5kZXggPj0gMCB8fCBhcHBlbmQp
KQorICAgICAgICByZXR1cm4gc2VjdGlvbi0+aW5zZXJ0Um93KGluZGV4LCBleGNlcHRpb25jb2Rl
KTsKKyAgICBlbHNlIHsKICAgICAgICAgLy8gTm8gbW9yZSBzZWN0aW9ucyA9PiBpbmRleCBpcyB0
b28gYmlnCiAgICAgICAgIGV4Y2VwdGlvbmNvZGUgPSBET01FeGNlcHRpb246OklOREVYX1NJWkVf
RVJSOwogICAgICAgICByZXR1cm4gMEw7CkluZGV4OiByZW5kZXJpbmcvcmVuZGVyX2Zvcm0uaAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSByZW5kZXJpbmcvcmVuZGVyX2Zvcm0uaAkocmV2aXNpb24gMTIyNTMpCisr
KyByZW5kZXJpbmcvcmVuZGVyX2Zvcm0uaAkod29ya2luZyBjb3B5KQpAQCAtMjUsOSArMjUsOSBA
QAogI2lmbmRlZiBSRU5ERVJfRk9STV9ICiAjZGVmaW5lIFJFTkRFUl9GT1JNX0gKIAotI2luY2x1
ZGUgInJlbmRlcmluZy9yZW5kZXJfcmVwbGFjZWQuaCIKLSNpbmNsdWRlICJyZW5kZXJpbmcvcmVu
ZGVyX2ltYWdlLmgiCi0jaW5jbHVkZSAicmVuZGVyaW5nL3JlbmRlcl9ibG9jay5oIgorI2luY2x1
ZGUgInJlbmRlcl9yZXBsYWNlZC5oIgorI2luY2x1ZGUgInJlbmRlcl9pbWFnZS5oIgorI2luY2x1
ZGUgIlJlbmRlckJsb2NrLmgiCiAKIGNsYXNzIFFXaWRnZXQ7CiBjbGFzcyBRTGlzdGJveEl0ZW07
CkBAIC00MSwxMyArNDEsMTAgQEAgY2xhc3MgUUxpc3RCb3g7CiAjaW5jbHVkZSAiSFRNTFNlbGVj
dEVsZW1lbnRJbXBsLmgiCiAjaW5jbHVkZSAiSFRNTFRleHRBcmVhRWxlbWVudEltcGwuaCIKIAot
bmFtZXNwYWNlIERPTSB7Ci0gICAgY2xhc3MgSFRNTEZvcm1FbGVtZW50SW1wbDsKLSAgICBjbGFz
cyBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDsKLX07Ci0KLW5hbWVzcGFjZSBraHRtbCB7Citu
YW1lc3BhY2UgV2ViQ29yZSB7CiAKK2NsYXNzIEhUTUxGb3JtRWxlbWVudEltcGw7CitjbGFzcyBI
VE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDsKIGNsYXNzIERvY0xvYWRlcjsKIAogLy8gLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLQpJbmRleDogcmVuZGVyaW5nL2JpZGkuY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHJlbmRl
cmluZy9iaWRpLmNwcAkocmV2aXNpb24gMTIyNTMpCisrKyByZW5kZXJpbmcvYmlkaS5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTI4LDcgKzI4LDcgQEAKICNpbmNsdWRlICJGcmFtZVZpZXcuaCIKICNp
bmNsdWRlIDxreG1sY29yZS9BbHdheXNJbmxpbmUuaD4KICNpbmNsdWRlICJyZW5kZXJfYXJlbmEu
aCIKLSNpbmNsdWRlICJyZW5kZXJfYmxvY2suaCIKKyNpbmNsdWRlICJSZW5kZXJCbG9jay5oIgog
I2luY2x1ZGUgInJlbmRlcl9jYW52YXMuaCIKICNpbmNsdWRlICJJbmxpbmVUZXh0Qm94LmgiCiAK
SW5kZXg6IHJlbmRlcmluZy9yZW5kZXJfZmxleGJveC5oCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHJlbmRlcmlu
Zy9yZW5kZXJfZmxleGJveC5oCShyZXZpc2lvbiAxMjI1MykKKysrIHJlbmRlcmluZy9yZW5kZXJf
ZmxleGJveC5oCSh3b3JraW5nIGNvcHkpCkBAIC0yMyw3ICsyMyw3IEBACiAjaWZuZGVmIFJFTkRF
Ul9GTEVYSUJMRV9CT1hfSAogI2RlZmluZSBSRU5ERVJfRkxFWElCTEVfQk9YX0gKIAotI2luY2x1
ZGUgInJlbmRlcl9ibG9jay5oIgorI2luY2x1ZGUgIlJlbmRlckJsb2NrLmgiCiAjaW5jbHVkZSAi
cmVuZGVyX3N0eWxlLmgiCiAKIG5hbWVzcGFjZSBraHRtbCB7CkluZGV4OiByZW5kZXJpbmcvUmVu
ZGVyVGFibGVTZWN0aW9uLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSByZW5kZXJpbmcvUmVuZGVyVGFibGVT
ZWN0aW9uLmNwcAkocmV2aXNpb24gMTIyNTMpCisrKyByZW5kZXJpbmcvUmVuZGVyVGFibGVTZWN0
aW9uLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNiw3ICs2LDcgQEAKICAqICAgICAgICAgICAoQykg
MTk5OCBXYWxkbyBCYXN0aWFuIChiYXN0aWFuQGtkZS5vcmcpCiAgKiAgICAgICAgICAgKEMpIDE5
OTkgTGFycyBLbm9sbCAoa25vbGxAa2RlLm9yZykKICAqICAgICAgICAgICAoQykgMTk5OSBBbnR0
aSBLb2l2aXN0byAoa29pdmlzdG9Aa2RlLm9yZykKLSAqIENvcHlyaWdodCAoQykgMjAwMyBBcHBs
ZSBDb21wdXRlciwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2
IEFwcGxlIENvbXB1dGVyLCBJbmMuCiAgKgogICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdh
cmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICogbW9kaWZ5IGl0IHVuZGVyIHRo
ZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKQEAgLTI0LDczMiArMjQs
MTkgQEAKICAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgogICovCiAKLS8vI2RlZmluZSBU
QUJMRV9ERUJVRwotLy8jZGVmaW5lIFRBQkxFX1BSSU5UCi0vLyNkZWZpbmUgREVCVUdfTEFZT1VU
Ci0vLyNkZWZpbmUgQk9YX0RFQlVHCiAjaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAicmVu
ZGVyaW5nL3JlbmRlcl90YWJsZS5oIgotI2luY2x1ZGUgInJlbmRlcmluZy90YWJsZV9sYXlvdXQu
aCIKLSNpbmNsdWRlICJodG1sL2h0bWxfdGFibGVpbXBsLmgiCi0jaW5jbHVkZSAiaHRtbG5hbWVz
LmgiCisjaW5jbHVkZSAiUmVuZGVyVGFibGVTZWN0aW9uLmgiCisjaW5jbHVkZSAiUmVuZGVyVGFi
bGVDZWxsLmgiCisjaW5jbHVkZSAiUmVuZGVyVGFibGVSb3cuaCIKICNpbmNsdWRlICJEb2N1bWVu
dEltcGwuaCIKKyNpbmNsdWRlICJodG1sbmFtZXMuaCIKKyNpbmNsdWRlIDxxdGV4dHN0cmVhbS5o
PgogCi0jaW5jbHVkZSA8cWFwcGxpY2F0aW9uLmg+Ci0jaW5jbHVkZSA8cXN0eWxlLmg+Ci0KLSNp
bmNsdWRlIDxrZGVidWcuaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KK25hbWVzcGFjZSBXZWJDb3Jl
IHsKIAotdXNpbmcgbmFtZXNwYWNlIGtodG1sOwotdXNpbmcgbmFtZXNwYWNlIERPTTsKIHVzaW5n
IG5hbWVzcGFjZSBIVE1MTmFtZXM7CiAKLVJlbmRlclRhYmxlOjpSZW5kZXJUYWJsZShET006Ok5v
ZGVJbXBsKiBub2RlKQotICAgIDogUmVuZGVyQmxvY2sobm9kZSkKLXsKLSAgICB0Q2FwdGlvbiA9
IDA7Ci0gICAgaGVhZCA9IGZvb3QgPSBmaXJzdEJvZHkgPSAwOwotICAgIHRhYmxlTGF5b3V0ID0g
MDsKLSAgICBtX2N1cnJlbnRCb3JkZXIgPSAwOwotICAgIAotICAgIHJ1bGVzID0gTm9uZTsKLSAg
ICBmcmFtZSA9IFZvaWQ7Ci0gICAgaGFzX2NvbF9lbGVtcyA9IGZhbHNlOwotICAgIGhzcGFjaW5n
ID0gMDsKLSAgICB2c3BhY2luZyA9IDA7Ci0gICAgcGFkZGluZyA9IDA7Ci0gICAgbmVlZFNlY3Rp
b25SZWNhbGMgPSBmYWxzZTsKLSAgICBwYWRkaW5nID0gMDsKLQotICAgIGNvbHVtblBvcy5yZXNp
emUoMik7Ci0gICAgY29sdW1uUG9zLmZpbGwoMCk7Ci0gICAgY29sdW1ucy5yZXNpemUoMSk7Ci0g
ICAgY29sdW1ucy5maWxsKENvbHVtblN0cnVjdCgpKTsKLQotICAgIGNvbHVtblBvc1swXSA9IDA7
Ci19Ci0KLVJlbmRlclRhYmxlOjp+UmVuZGVyVGFibGUoKQotewotICAgIGRlbGV0ZSB0YWJsZUxh
eW91dDsKLX0KLQotdm9pZCBSZW5kZXJUYWJsZTo6c2V0U3R5bGUoUmVuZGVyU3R5bGUgKl9zdHls
ZSkKLXsKLSAgICBFVGFibGVMYXlvdXQgb2xkVGFibGVMYXlvdXQgPSBzdHlsZSgpID8gc3R5bGUo
KS0+dGFibGVMYXlvdXQoKSA6IFRBVVRPOwotICAgIFJlbmRlckJsb2NrOjpzZXRTdHlsZShfc3R5
bGUpOwotCi0gICAgLy8gSW4gdGhlIGNvbGxhcHNlZCBib3JkZXIgbW9kZWwsIHRoZXJlIGlzIG5v
IGNlbGwgc3BhY2luZy4KLSAgICBoc3BhY2luZyA9IGNvbGxhcHNlQm9yZGVycygpID8gMCA6IHN0
eWxlKCktPmhvcml6b250YWxCb3JkZXJTcGFjaW5nKCk7Ci0gICAgdnNwYWNpbmcgPSBjb2xsYXBz
ZUJvcmRlcnMoKSA/IDAgOiBzdHlsZSgpLT52ZXJ0aWNhbEJvcmRlclNwYWNpbmcoKTsKLSAgICBj
b2x1bW5Qb3NbMF0gPSBoc3BhY2luZzsKLQotICAgIGlmICghdGFibGVMYXlvdXQgfHwgc3R5bGUo
KS0+dGFibGVMYXlvdXQoKSAhPSBvbGRUYWJsZUxheW91dCkgewotCWRlbGV0ZSB0YWJsZUxheW91
dDsKLQotICAgICAgICAvLyBBY2NvcmRpbmcgdG8gdGhlIENTUzIgc3BlYywgeW91IG9ubHkgdXNl
IGZpeGVkIHRhYmxlIGxheW91dCBpZiBhbgotICAgICAgICAvLyBleHBsaWNpdCB3aWR0aCBpcyBz
cGVjaWZpZWQgb24gdGhlIHRhYmxlLiAgQXV0byB3aWR0aCBpbXBsaWVzIGF1dG8gdGFibGUgbGF5
b3V0LgotCWlmIChzdHlsZSgpLT50YWJsZUxheW91dCgpID09IFRGSVhFRCAmJiAhc3R5bGUoKS0+
d2lkdGgoKS5pc0F1dG8oKSkKLQkgICAgdGFibGVMYXlvdXQgPSBuZXcgRml4ZWRUYWJsZUxheW91
dCh0aGlzKTsKLQllbHNlCi0JICAgIHRhYmxlTGF5b3V0ID0gbmV3IEF1dG9UYWJsZUxheW91dCh0
aGlzKTsKLSAgICB9Ci19Ci0KLXZvaWQgUmVuZGVyVGFibGU6OmFkZENoaWxkKFJlbmRlck9iamVj
dCAqY2hpbGQsIFJlbmRlck9iamVjdCAqYmVmb3JlQ2hpbGQpCi17Ci0gICAgUmVuZGVyT2JqZWN0
ICpvID0gY2hpbGQ7Ci0KLSAgICBpZiAoY2hpbGQtPmVsZW1lbnQoKSAmJiBjaGlsZC0+ZWxlbWVu
dCgpLT5oYXNUYWdOYW1lKGZvcm1UYWcpKSB7Ci0gICAgICAgIFJlbmRlckNvbnRhaW5lcjo6YWRk
Q2hpbGQoY2hpbGQsYmVmb3JlQ2hpbGQpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAg
c3dpdGNoIChjaGlsZC0+c3R5bGUoKS0+ZGlzcGxheSgpKSB7Ci0gICAgICAgIGNhc2UgVEFCTEVf
Q0FQVElPTjoKLSAgICAgICAgICAgIHRDYXB0aW9uID0gc3RhdGljX2Nhc3Q8UmVuZGVyQmxvY2sg
Kj4oY2hpbGQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVEFCTEVfQ09MVU1O
OgotICAgICAgICBjYXNlIFRBQkxFX0NPTFVNTl9HUk9VUDoKLSAgICAgICAgICAgIGhhc19jb2xf
ZWxlbXMgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVEFCTEVfSEVB
REVSX0dST1VQOgotICAgICAgICAgICAgaWYgKCFoZWFkKQotICAgICAgICAgICAgICAgIGhlYWQg
PSBzdGF0aWNfY2FzdDxSZW5kZXJUYWJsZVNlY3Rpb24gKj4oY2hpbGQpOwotICAgICAgICAgICAg
ZWxzZSBpZiAoIWZpcnN0Qm9keSkKLSAgICAgICAgICAgICAgICBmaXJzdEJvZHkgPSBzdGF0aWNf
Y2FzdDxSZW5kZXJUYWJsZVNlY3Rpb24gKj4oY2hpbGQpOwotICAgICAgICAgICAgYnJlYWs7Ci0g
ICAgICAgIGNhc2UgVEFCTEVfRk9PVEVSX0dST1VQOgotICAgICAgICAgICAgaWYgKCFmb290KSB7
Ci0gICAgICAgICAgICAgICAgZm9vdCA9IHN0YXRpY19jYXN0PFJlbmRlclRhYmxlU2VjdGlvbiAq
PihjaGlsZCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAg
ICAgICAvLyBmYWxsIHRocm91Z2gKLSAgICAgICAgY2FzZSBUQUJMRV9ST1dfR1JPVVA6Ci0gICAg
ICAgICAgICBpZiAoIWZpcnN0Qm9keSkKLSAgICAgICAgICAgICAgICBmaXJzdEJvZHkgPSBzdGF0
aWNfY2FzdDxSZW5kZXJUYWJsZVNlY3Rpb24gKj4oY2hpbGQpOwotICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpZiAoIWJlZm9yZUNoaWxkICYmIGxhc3RD
aGlsZCgpICYmCi0gICAgICAgICAgICAgICAgbGFzdENoaWxkKCktPmlzVGFibGVTZWN0aW9uKCkg
JiYgbGFzdENoaWxkKCktPmlzQW5vbnltb3VzKCkpIHsKLSAgICAgICAgICAgICAgICBvID0gbGFz
dENoaWxkKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFJlbmRlck9i
amVjdCAqbGFzdEJveCA9IGJlZm9yZUNoaWxkOwotICAgICAgICAgICAgICAgIFJlbmRlck9iamVj
dCAqbmV4dFRvTGFzdEJveCA9IGJlZm9yZUNoaWxkOwotICAgICAgICAgICAgICAgIHdoaWxlIChs
YXN0Qm94ICYmIGxhc3RCb3gtPnBhcmVudCgpLT5pc0Fub255bW91cygpICYmCi0gICAgICAgICAg
ICAgICAgICAgICAgICAhbGFzdEJveC0+aXNUYWJsZVNlY3Rpb24oKSAmJiBsYXN0Qm94LT5zdHls
ZSgpLT5kaXNwbGF5KCkgIT0gVEFCTEVfQ0FQVElPTikgewotICAgICAgICAgICAgICAgICAgICBu
ZXh0VG9MYXN0Qm94ID0gbGFzdEJveDsKLSAgICAgICAgICAgICAgICAgICAgbGFzdEJveCA9IGxh
c3RCb3gtPnBhcmVudCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAo
bGFzdEJveCAmJiBsYXN0Qm94LT5pc0Fub255bW91cygpKSB7Ci0gICAgICAgICAgICAgICAgICAg
IGxhc3RCb3gtPmFkZENoaWxkKGNoaWxkLCBuZXh0VG9MYXN0Qm94KTsKLSAgICAgICAgICAgICAg
ICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAg
ICAgIGlmIChiZWZvcmVDaGlsZCAmJiAhYmVmb3JlQ2hpbGQtPmlzVGFibGVTZWN0aW9uKCkpCi0g
ICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmVDaGlsZCA9IDA7Ci0gICAgICAgICAgICAgICAg
ICAgIG8gPSBuZXcgKHJlbmRlckFyZW5hKCkpIFJlbmRlclRhYmxlU2VjdGlvbihkb2N1bWVudCgp
IC8qIGFub255bW91cyAqLyk7Ci0gICAgICAgICAgICAgICAgICAgIFJlbmRlclN0eWxlICpuZXdT
dHlsZSA9IG5ldyAocmVuZGVyQXJlbmEoKSkgUmVuZGVyU3R5bGUoKTsKLSAgICAgICAgICAgICAg
ICAgICAgbmV3U3R5bGUtPmluaGVyaXRGcm9tKHN0eWxlKCkpOwotICAgICAgICAgICAgICAgICAg
ICBuZXdTdHlsZS0+c2V0RGlzcGxheShUQUJMRV9ST1dfR1JPVVApOwotICAgICAgICAgICAgICAg
ICAgICBvLT5zZXRTdHlsZShuZXdTdHlsZSk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZENoaWxk
KG8sIGJlZm9yZUNoaWxkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAg
ICAgICAgICBvLT5hZGRDaGlsZChjaGlsZCk7Ci0gICAgICAgICAgICBjaGlsZC0+c2V0TmVlZHNM
YXlvdXRBbmRNaW5NYXhSZWNhbGMoKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAg
UmVuZGVyQ29udGFpbmVyOjphZGRDaGlsZChjaGlsZCxiZWZvcmVDaGlsZCk7Ci19Ci0KLQotCi12
b2lkIFJlbmRlclRhYmxlOjpjYWxjV2lkdGgoKQotewotICAgIGlmIChpc1Bvc2l0aW9uZWQoKSkK
LSAgICAgICAgY2FsY0Fic29sdXRlSG9yaXpvbnRhbCgpOwotCi0gICAgUmVuZGVyQmxvY2sgKmNi
ID0gY29udGFpbmluZ0Jsb2NrKCk7Ci0gICAgaW50IGF2YWlsYWJsZVdpZHRoID0gY2ItPmNvbnRl
bnRXaWR0aCgpOwotCi0gICAgTGVuZ3RoVHlwZSB3aWR0aFR5cGUgPSBzdHlsZSgpLT53aWR0aCgp
LnR5cGU7Ci0gICAgaWYgKHdpZHRoVHlwZSA+IFJlbGF0aXZlICYmIHN0eWxlKCktPndpZHRoKCku
dmFsdWUgPiAwKSB7Ci0JLy8gUGVyY2VudCBvciBmaXhlZCB0YWJsZQotICAgICAgICBtX3dpZHRo
ID0gc3R5bGUoKS0+d2lkdGgoKS5taW5XaWR0aChhdmFpbGFibGVXaWR0aCk7Ci0gICAgICAgIGlm
IChtX21pbldpZHRoID4gbV93aWR0aCkgbV93aWR0aCA9IG1fbWluV2lkdGg7Ci0gICAgfSBlbHNl
IHsKLSAgICAgICAgLy8gQW4gYXV0byB3aWR0aCB0YWJsZSBzaG91bGQgc2hyaW5rIHRvIGZpdCB3
aXRoaW4gdGhlIGxpbmUgd2lkdGggaWYgbmVjZXNzYXJ5IGluIG9yZGVyIHRvIAotICAgICAgICAv
LyBhdm9pZCBvdmVybGFwcGluZyBmbG9hdHMuCi0gICAgICAgIGF2YWlsYWJsZVdpZHRoID0gY2It
PmxpbmVXaWR0aChtX3kpOwotICAgICAgICAKLSAgICAgICAgLy8gU3VidHJhY3Qgb3V0IGFueSBm
aXhlZCBtYXJnaW5zIGZyb20gb3VyIGF2YWlsYWJsZSB3aWR0aCBmb3IgYXV0byB3aWR0aCB0YWJs
ZXMuCi0gICAgICAgIGludCBtYXJnaW5Ub3RhbCA9IDA7Ci0gICAgICAgIGlmIChzdHlsZSgpLT5t
YXJnaW5MZWZ0KCkudHlwZSAhPSBBdXRvKQotICAgICAgICAgICAgbWFyZ2luVG90YWwgKz0gc3R5
bGUoKS0+bWFyZ2luTGVmdCgpLndpZHRoKGF2YWlsYWJsZVdpZHRoKTsKLSAgICAgICAgaWYgKHN0
eWxlKCktPm1hcmdpblJpZ2h0KCkudHlwZSAhPSBBdXRvKQotICAgICAgICAgICAgbWFyZ2luVG90
YWwgKz0gc3R5bGUoKS0+bWFyZ2luUmlnaHQoKS53aWR0aChhdmFpbGFibGVXaWR0aCk7Ci0gICAg
ICAgICAgICAKLSAgICAgICAgLy8gU3VidHJhY3Qgb3V0IG91ciBtYXJnaW5zIHRvIGdldCB0aGUg
YXZhaWxhYmxlIGNvbnRlbnQgd2lkdGguCi0gICAgICAgIGludCBhdmFpbENvbnRlbnRXaWR0aCA9
IGtNYXgoMCwgYXZhaWxhYmxlV2lkdGggLSBtYXJnaW5Ub3RhbCk7Ci0gICAgICAgIAotICAgICAg
ICAvLyBFbnN1cmUgd2UgYXJlbid0IGJpZ2dlciB0aGFuIG91ciBtYXggd2lkdGggb3Igc21hbGxl
ciB0aGFuIG91ciBtaW4gd2lkdGguCi0gICAgICAgIG1fd2lkdGggPSBrTWluKGF2YWlsQ29udGVu
dFdpZHRoLCBtX21heFdpZHRoKTsKLSAgICB9Ci0gICAgCi0gICAgbV93aWR0aCA9IGtNYXgobV93
aWR0aCwgbV9taW5XaWR0aCk7Ci0KLSAgICAvLyBGaW5hbGx5LCB3aXRoIG91ciB0cnVlIHdpZHRo
IGRldGVybWluZWQsIGNvbXB1dGUgb3VyIG1hcmdpbnMgZm9yIHJlYWwuCi0gICAgbV9tYXJnaW5S
aWdodCA9IDA7Ci0gICAgbV9tYXJnaW5MZWZ0ID0gMDsKLSAgICBjYWxjSG9yaXpvbnRhbE1hcmdp
bnMoc3R5bGUoKS0+bWFyZ2luTGVmdCgpLHN0eWxlKCktPm1hcmdpblJpZ2h0KCksYXZhaWxhYmxl
V2lkdGgpOwotfQotCi12b2lkIFJlbmRlclRhYmxlOjpsYXlvdXQoKQotewotICAgIEtIVE1MQXNz
ZXJ0KG5lZWRzTGF5b3V0KCkpOwotICAgIEtIVE1MQXNzZXJ0KG1pbk1heEtub3duKCkpOwotICAg
IEtIVE1MQXNzZXJ0KCFuZWVkU2VjdGlvblJlY2FsYyk7Ci0KLSAgICBpZiAocG9zQ2hpbGROZWVk
c0xheW91dCgpICYmICFub3JtYWxDaGlsZE5lZWRzTGF5b3V0KCkgJiYgIXNlbGZOZWVkc0xheW91
dCgpKSB7Ci0gICAgICAgIC8vIEFsbCB3ZSBoYXZlIHRvIGlzIGxheSBvdXQgb3VyIHBvc2l0aW9u
ZWQgb2JqZWN0cy4KLSAgICAgICAgbGF5b3V0UG9zaXRpb25lZE9iamVjdHModHJ1ZSk7Ci0gICAg
ICAgIHNldE5lZWRzTGF5b3V0KGZhbHNlKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAg
IEludFJlY3Qgb2xkQm91bmRzLCBvbGRGdWxsQm91bmRzOwotICAgIGJvb2wgY2hlY2tGb3JSZXBh
aW50ID0gY2hlY2tGb3JSZXBhaW50RHVyaW5nTGF5b3V0KCk7Ci0gICAgaWYgKGNoZWNrRm9yUmVw
YWludCkKLSAgICAgICAgZ2V0QWJzb2x1dGVSZXBhaW50UmVjdEluY2x1ZGluZ0Zsb2F0cyhvbGRC
b3VuZHMsIG9sZEZ1bGxCb3VuZHMpOwotICAgIAotICAgIG1faGVpZ2h0ID0gbV9vdmVyZmxvd0hl
aWdodCA9IDA7Ci0gICAgaW5pdE1heE1hcmdpblZhbHVlcygpOwotICAgIAotICAgIC8vaW50IG9s
ZFdpZHRoID0gbV93aWR0aDsKLSAgICBjYWxjV2lkdGgoKTsKLSAgICBtX292ZXJmbG93V2lkdGgg
PSBtX3dpZHRoOwotCi0gICAgLy8gdGhlIG9wdGltaXNhdGlvbiBiZWxvdyBkb2Vzbid0IHdvcmsg
c2luY2UgdGhlIGludGVybmFsIHRhYmxlCi0gICAgLy8gbGF5b3V0IGNvdWxkIGhhdmUgY2hhbmdl
ZC4gIHdlIG5lZWQgdG8gYWRkIGEgZmxhZyB0byB0aGUgdGFibGUKLSAgICAvLyBsYXlvdXQgdGhh
dCB0ZWxscyB1cyBpZiBzb21ldGhpbmcgaGFzIGNoYW5nZWQgaW4gdGhlIG1pbiBtYXgKLSAgICAv
LyBjYWxjdWxhdGlvbnMgdG8gZG8gaXQgY29ycmVjdGx5LgotLy8gICAgIGlmICggb2xkV2lkdGgg
IT0gbV93aWR0aCB8fCBjb2x1bW5zLnNpemUoKSArIDEgIT0gY29sdW1uUG9zLnNpemUoKSApCi0g
ICAgdGFibGVMYXlvdXQtPmxheW91dCgpOwotCi0gICAgc2V0Q2VsbFdpZHRocygpOwotCi0gICAg
Ly8gbGF5b3V0IGNoaWxkIG9iamVjdHMKLSAgICBpbnQgY2FsY3VsYXRlZEhlaWdodCA9IDA7Ci0K
LSAgICBSZW5kZXJPYmplY3QgKmNoaWxkID0gZmlyc3RDaGlsZCgpOwotICAgIHdoaWxlKGNoaWxk
KSB7Ci0JaWYgKGNoaWxkLT5uZWVkc0xheW91dCgpICYmICEoY2hpbGQtPmVsZW1lbnQoKSAmJiBj
aGlsZC0+ZWxlbWVudCgpLT5oYXNUYWdOYW1lKGZvcm1UYWcpKSkKLQkgICAgY2hpbGQtPmxheW91
dCgpOwotCWlmIChjaGlsZC0+aXNUYWJsZVNlY3Rpb24oKSkgewotCSAgICBzdGF0aWNfY2FzdDxS
ZW5kZXJUYWJsZVNlY3Rpb24gKj4oY2hpbGQpLT5jYWxjUm93SGVpZ2h0KCk7Ci0JICAgIGNhbGN1
bGF0ZWRIZWlnaHQgKz0gc3RhdGljX2Nhc3Q8UmVuZGVyVGFibGVTZWN0aW9uICo+KGNoaWxkKS0+
bGF5b3V0Um93cygwKTsKLQl9Ci0JY2hpbGQgPSBjaGlsZC0+bmV4dFNpYmxpbmcoKTsKLSAgICB9
Ci0KLSAgICAvLyAjIyMgY29sbGFwc2UgY2FwdGlvbiBtYXJnaW4KLSAgICBpZiAodENhcHRpb24g
JiYgdENhcHRpb24tPnN0eWxlKCktPmNhcHRpb25TaWRlKCkgIT0gQ0FQQk9UVE9NKSB7Ci0gICAg
ICAgIHRDYXB0aW9uLT5zZXRQb3ModENhcHRpb24tPm1hcmdpbkxlZnQoKSwgbV9oZWlnaHQpOwot
ICAgICAgICBtX2hlaWdodCArPSB0Q2FwdGlvbi0+aGVpZ2h0KCkgKyB0Q2FwdGlvbi0+bWFyZ2lu
VG9wKCkgKyB0Q2FwdGlvbi0+bWFyZ2luQm90dG9tKCk7Ci0gICAgfQotCi0gICAgaW50IGJwVG9w
ID0gYm9yZGVyVG9wKCkgKyAoY29sbGFwc2VCb3JkZXJzKCkgPyAwIDogcGFkZGluZ1RvcCgpKTsK
LSAgICBpbnQgYnBCb3R0b20gPSBib3JkZXJCb3R0b20oKSArIChjb2xsYXBzZUJvcmRlcnMoKSA/
IDAgOiBwYWRkaW5nQm90dG9tKCkpOwotICAgIAotICAgIG1faGVpZ2h0ICs9IGJwVG9wOwotCi0g
ICAgaW50IG9sZEhlaWdodCA9IG1faGVpZ2h0OwotICAgIGNhbGNIZWlnaHQoKTsKLSAgICBpbnQg
bmV3SGVpZ2h0ID0gbV9oZWlnaHQ7Ci0gICAgbV9oZWlnaHQgPSBvbGRIZWlnaHQ7Ci0KLSAgICBM
ZW5ndGggaCA9IHN0eWxlKCktPmhlaWdodCgpOwotICAgIGludCB0aCA9IDA7Ci0gICAgaWYgKGlz
UG9zaXRpb25lZCgpKQotICAgICAgICB0aCA9IG5ld0hlaWdodDsgLy8gRklYTUU6IExlYXZlIHRo
aXMgYWxvbmUgZm9yIG5vdyBidXQgaW52ZXN0aWdhdGUgbGF0ZXIuCi0gICAgZWxzZSBpZiAoaC5p
c0ZpeGVkKCkpCi0gICAgICAgIHRoID0gaC52YWx1ZSAtIChicFRvcCArIGJwQm90dG9tKTsgIC8v
IFRhYmxlcyBzaXplIGFzIHRob3VnaCBDU1MgaGVpZ2h0IGluY2x1ZGVzIGJvcmRlci9wYWRkaW5n
LgotICAgIGVsc2UgaWYgKGguaXNQZXJjZW50KCkpCi0gICAgICAgIHRoID0gY2FsY1BlcmNlbnRh
Z2VIZWlnaHQoaCk7Ci0gICAgdGggPSBrTWF4KDAsIHRoKTsKLQotICAgIC8vIGxheW91dCByb3dz
Ci0gICAgaWYgKHRoID4gY2FsY3VsYXRlZEhlaWdodCkgewotCS8vIHdlIGhhdmUgdG8gcmVkaXN0
cmlidXRlIHRoYXQgaGVpZ2h0IHRvIGdldCB0aGUgY29uc3RyYWludCBjb3JyZWN0bHkKLQkvLyBq
dXN0IGZvcmNlIHRoZSBmaXJzdCBib2R5IHRvIHRoZSBoZWlnaHQgbmVlZGVkCi0JLy8gIyMjIEZJ
WE1FIFRoaXMgc2hvdWxkIHRha2UgaGVpZ2h0IGNvbnN0cmFpbnRzIG9uIGFsbCB0YWJsZSBzZWN0
aW9ucyBpbnRvIGFjY291bnQgYW5kIGRpc3RyaWJ1dGUKLQkvLyBhY2NvcmRpbmdseS4gRm9yIG5v
dyB0aGlzIHNob3VsZCBiZSBnb29kIGVub3VnaAotICAgICAgICBpZiAoZmlyc3RCb2R5KSB7Ci0g
ICAgICAgICAgICBmaXJzdEJvZHktPmNhbGNSb3dIZWlnaHQoKTsKLSAgICAgICAgICAgIGZpcnN0
Qm9keS0+bGF5b3V0Um93cyh0aCAtIGNhbGN1bGF0ZWRIZWlnaHQpOwotICAgICAgICB9Ci0gICAg
ICAgIGVsc2UgaWYgKCFzdHlsZSgpLT5odG1sSGFja3MoKSkgewotICAgICAgICAgICAgLy8gQ29t
cGxldGVseSBlbXB0eSB0YWJsZXMgKHdpdGggbm8gc2VjdGlvbnMgb3IgYW55dGhpbmcpIHNob3Vs
ZCBhdCBsZWFzdCBob25vciBzcGVjaWZpZWQgaGVpZ2h0Ci0gICAgICAgICAgICAvLyBpbiBzdHJp
Y3QgbW9kZS4KLSAgICAgICAgICAgIG1faGVpZ2h0ICs9IHRoOwotICAgICAgICB9Ci0gICAgfQot
ICAgIAotICAgIGludCBibCA9IGJvcmRlckxlZnQoKTsKLSAgICBpZiAoIWNvbGxhcHNlQm9yZGVy
cygpKQotICAgICAgICBibCArPSBwYWRkaW5nTGVmdCgpOwotCi0gICAgLy8gcG9zaXRpb24gdGhl
IHRhYmxlIHNlY3Rpb25zCi0gICAgaWYgKGhlYWQpIHsKLQloZWFkLT5zZXRQb3MoYmwsIG1faGVp
Z2h0KTsKLQltX2hlaWdodCArPSBoZWFkLT5oZWlnaHQoKTsKLSAgICB9Ci0gICAgZm9yIChSZW5k
ZXJPYmplY3QgKmJvZHkgPSBmaXJzdEJvZHk7IGJvZHk7IGJvZHkgPSBib2R5LT5uZXh0U2libGlu
ZygpKSB7Ci0JaWYgKGJvZHkgIT0gaGVhZCAmJiBib2R5ICE9IGZvb3QgJiYgYm9keS0+aXNUYWJs
ZVNlY3Rpb24oKSkgewotCSAgICBib2R5LT5zZXRQb3MoYmwsIG1faGVpZ2h0KTsKLQkgICAgbV9o
ZWlnaHQgKz0gYm9keS0+aGVpZ2h0KCk7Ci0JfQotICAgIH0KLSAgICBpZiAoZm9vdCkgewotCWZv
b3QtPnNldFBvcyhibCwgbV9oZWlnaHQpOwotCW1faGVpZ2h0ICs9IGZvb3QtPmhlaWdodCgpOwot
ICAgIH0KLQotICAgIG1faGVpZ2h0ICs9IGJwQm90dG9tOwotICAgICAgICAgICAgICAgCi0gICAg
aWYgKHRDYXB0aW9uICYmIHRDYXB0aW9uLT5zdHlsZSgpLT5jYXB0aW9uU2lkZSgpPT1DQVBCT1RU
T00pIHsKLSAgICAgICAgdENhcHRpb24tPnNldFBvcyh0Q2FwdGlvbi0+bWFyZ2luTGVmdCgpLCBt
X2hlaWdodCk7Ci0gICAgICAgIG1faGVpZ2h0ICs9IHRDYXB0aW9uLT5oZWlnaHQoKSArIHRDYXB0
aW9uLT5tYXJnaW5Ub3AoKSArIHRDYXB0aW9uLT5tYXJnaW5Cb3R0b20oKTsKLSAgICB9Ci0KLSAg
ICAvLyB0YWJsZSBjYW4gYmUgY29udGFpbmluZyBibG9jayBvZiBwb3NpdGlvbmVkIGVsZW1lbnRz
LgotICAgIC8vICMjIyBvbmx5IHBhc3MgdHJ1ZSBpZiB3aWR0aCBvciBoZWlnaHQgY2hhbmdlZC4K
LSAgICBsYXlvdXRQb3NpdGlvbmVkT2JqZWN0cyggdHJ1ZSApOwotCi0gICAgLy8gUmVwYWludCB3
aXRoIG91ciBuZXcgYm91bmRzIGlmIHRoZXkgYXJlIGRpZmZlcmVudCBmcm9tIG91ciBvbGQgYm91
bmRzLgotICAgIGlmIChjaGVja0ZvclJlcGFpbnQpCi0gICAgICAgIHJlcGFpbnRBZnRlckxheW91
dElmTmVlZGVkKG9sZEJvdW5kcywgb2xkRnVsbEJvdW5kcyk7Ci0gICAgCi0gICAgbV9vdmVyZmxv
d0hlaWdodCA9IGtNYXgobV9vdmVyZmxvd0hlaWdodCwgbV9oZWlnaHQpOwotICAgIG1fb3ZlcmZs
b3dXaWR0aCA9IGtNYXgobV9vdmVyZmxvd1dpZHRoLCBtX3dpZHRoKTsKLQotICAgIHNldE5lZWRz
TGF5b3V0KGZhbHNlKTsKLX0KLQotdm9pZCBSZW5kZXJUYWJsZTo6c2V0Q2VsbFdpZHRocygpCi17
Ci0gICAgZm9yIChSZW5kZXJPYmplY3QgKmNoaWxkID0gZmlyc3RDaGlsZCgpOyBjaGlsZDsgY2hp
bGQgPSBjaGlsZC0+bmV4dFNpYmxpbmcoKSkKLQlpZiAoIGNoaWxkLT5pc1RhYmxlU2VjdGlvbigp
ICkKLQkgICAgc3RhdGljX2Nhc3Q8UmVuZGVyVGFibGVTZWN0aW9uICo+KGNoaWxkKS0+c2V0Q2Vs
bFdpZHRocygpOwotfQotCi12b2lkIFJlbmRlclRhYmxlOjpwYWludChQYWludEluZm8mIGksIGlu
dCBfdHgsIGludCBfdHkpCi17Ci0gICAgX3R4ICs9IHhQb3MoKTsKLSAgICBfdHkgKz0geVBvcygp
OwotCi0gICAgUGFpbnRBY3Rpb24gcGFpbnRBY3Rpb24gPSBpLnBoYXNlOwotICAgIAotICAgIGlu
dCBvcyA9IDIqbWF4aW1hbE91dGxpbmVTaXplKHBhaW50QWN0aW9uKTsKLSAgICBpZiAoKF90eSA+
PSBpLnIueSgpICsgaS5yLmhlaWdodCgpICsgb3MpIHx8IChfdHkgKyBoZWlnaHQoKSA8PSBpLnIu
eSgpIC0gb3MpKQotICAgICAgICByZXR1cm47Ci0gICAgaWYgKChfdHggPj0gaS5yLngoKSArIGku
ci53aWR0aCgpICsgb3MpIHx8IChfdHggKyB3aWR0aCgpIDw9IGkuci54KCkgLSBvcykpCi0gICAg
ICAgIHJldHVybjsKLQotICAgIGlmICgocGFpbnRBY3Rpb24gPT0gUGFpbnRBY3Rpb25CbG9ja0Jh
Y2tncm91bmQgfHwgcGFpbnRBY3Rpb24gPT0gUGFpbnRBY3Rpb25DaGlsZEJsb2NrQmFja2dyb3Vu
ZCkKLSAgICAgICAgJiYgc2hvdWxkUGFpbnRCYWNrZ3JvdW5kT3JCb3JkZXIoKSAmJiBzdHlsZSgp
LT52aXNpYmlsaXR5KCkgPT0gVklTSUJMRSkKLSAgICAgICAgcGFpbnRCb3hEZWNvcmF0aW9ucyhp
LCBfdHgsIF90eSk7Ci0KLSAgICAvLyBXZSdyZSBkb25lLiAgV2UgZG9uJ3QgYm90aGVyIHBhaW50
aW5nIGFueSBjaGlsZHJlbi4KLSAgICBpZiAocGFpbnRBY3Rpb24gPT0gUGFpbnRBY3Rpb25CbG9j
a0JhY2tncm91bmQpCi0gICAgICAgIHJldHVybjsKLSAgICAvLyBXZSBkb24ndCBwYWludCBvdXIg
b3duIGJhY2tncm91bmQsIGJ1dCB3ZSBkbyBsZXQgdGhlIGtpZHMgcGFpbnQgdGhlaXIgYmFja2dy
b3VuZHMuCi0gICAgaWYgKHBhaW50QWN0aW9uID09IFBhaW50QWN0aW9uQ2hpbGRCbG9ja0JhY2tn
cm91bmRzKQotICAgICAgICBwYWludEFjdGlvbiA9IFBhaW50QWN0aW9uQ2hpbGRCbG9ja0JhY2tn
cm91bmQ7Ci0gICAgUGFpbnRJbmZvIHBhaW50SW5mbyhpLnAsIGkuciwgcGFpbnRBY3Rpb24sIHBh
aW50aW5nUm9vdEZvckNoaWxkcmVuKGkpKTsKLSAgICAKLSAgICBmb3IgKFJlbmRlck9iamVjdCAq
Y2hpbGQgPSBmaXJzdENoaWxkKCk7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0U2libGluZygp
KQotICAgICAgICBpZiAoY2hpbGQtPmlzVGFibGVTZWN0aW9uKCkgfHwgY2hpbGQgPT0gdENhcHRp
b24pCi0JICAgIGNoaWxkLT5wYWludChwYWludEluZm8sIF90eCwgX3R5KTsKLQotICAgIGlmIChj
b2xsYXBzZUJvcmRlcnMoKSAmJiBwYWludEFjdGlvbiA9PSBQYWludEFjdGlvbkNoaWxkQmxvY2tC
YWNrZ3JvdW5kICYmIHN0eWxlKCktPnZpc2liaWxpdHkoKSA9PSBWSVNJQkxFKSB7Ci0gICAgICAg
IC8vIENvbGxlY3QgYWxsIHRoZSB1bmlxdWUgYm9yZGVyIHN0eWxlcyB0aGF0IHdlIHdhbnQgdG8g
cGFpbnQgaW4gYSBzb3J0ZWQgbGlzdC4gIE9uY2Ugd2UKLSAgICAgICAgLy8gaGF2ZSBhbGwgdGhl
IHN0eWxlcyBzb3J0ZWQsIHdlIHRoZW4gZG8gaW5kaXZpZHVhbCBwYXNzZXMsIHBhaW50aW5nIGVh
Y2ggc3R5bGUgb2YgYm9yZGVyCi0gICAgICAgIC8vIGZyb20gbG93ZXN0IHByZWNlZGVuY2UgdG8g
aGlnaGVzdCBwcmVjZWRlbmNlLgotICAgICAgICBwYWludEluZm8ucGhhc2UgPSBQYWludEFjdGlv
bkNvbGxhcHNlZFRhYmxlQm9yZGVyczsKLSAgICAgICAgUVZhbHVlTGlzdDxDb2xsYXBzZWRCb3Jk
ZXJWYWx1ZT4gYm9yZGVyU3R5bGVzOwotICAgICAgICBjb2xsZWN0Qm9yZGVycyhib3JkZXJTdHls
ZXMpOwotICAgICAgICBRVmFsdWVMaXN0SXRlcmF0b3I8Q29sbGFwc2VkQm9yZGVyVmFsdWU+IGl0
ID0gYm9yZGVyU3R5bGVzLmJlZ2luKCk7Ci0gICAgICAgIFFWYWx1ZUxpc3RJdGVyYXRvcjxDb2xs
YXBzZWRCb3JkZXJWYWx1ZT4gZW5kID0gYm9yZGVyU3R5bGVzLmVuZCgpOwotICAgICAgICBmb3Ig
KDsgaXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgICAgICAgICBtX2N1cnJlbnRCb3JkZXIgPSAmKCpp
dCk7Ci0gICAgICAgICAgICBmb3IgKFJlbmRlck9iamVjdCogY2hpbGQgPSBmaXJzdENoaWxkKCk7
IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0U2libGluZygpKQotICAgICAgICAgICAgICAgIGlm
IChjaGlsZC0+aXNUYWJsZVNlY3Rpb24oKSkKLSAgICAgICAgICAgICAgICAgICAgY2hpbGQtPnBh
aW50KHBhaW50SW5mbywgX3R4LCBfdHkpOwotICAgICAgICB9Ci0gICAgfQotICAgICAgICAKLSNp
ZmRlZiBCT1hfREVCVUcKLSAgICBvdXRsaW5lQm94KGkucCwgX3R4LCBfdHksICJibHVlIik7Ci0j
ZW5kaWYKLX0KLQotdm9pZCBSZW5kZXJUYWJsZTo6cGFpbnRCb3hEZWNvcmF0aW9ucyhQYWludElu
Zm8mIGksIGludCBfdHgsIGludCBfdHkpCi17Ci0gICAgaW50IHcgPSB3aWR0aCgpOwotICAgIGlu
dCBoID0gaGVpZ2h0KCk7Ci0gICAgCi0gICAgLy8gQWNjb3VudCBmb3IgdGhlIGNhcHRpb24uCi0g
ICAgaWYgKHRDYXB0aW9uKSB7Ci0gICAgICAgIGludCBjYXB0aW9uSGVpZ2h0ID0gKHRDYXB0aW9u
LT5oZWlnaHQoKSArIHRDYXB0aW9uLT5tYXJnaW5Cb3R0b20oKSArICB0Q2FwdGlvbi0+bWFyZ2lu
VG9wKCkpOwotICAgICAgICBoIC09IGNhcHRpb25IZWlnaHQ7Ci0gICAgICAgIGlmICh0Q2FwdGlv
bi0+c3R5bGUoKS0+Y2FwdGlvblNpZGUoKSAhPSBDQVBCT1RUT00pCi0gICAgICAgICAgICBfdHkg
Kz0gY2FwdGlvbkhlaWdodDsKLSAgICB9Ci0KLSAgICBpbnQgbXkgPSBrTWF4KF90eSwgaS5yLnko
KSk7Ci0gICAgaW50IG1oOwotICAgIGlmIChfdHkgPCBpLnIueSgpKQotICAgICAgICBtaD0ga01h
eCgwLCBoIC0gKGkuci55KCkgLSBfdHkpKTsKLSAgICBlbHNlCi0gICAgICAgIG1oID0ga01pbihp
LnIuaGVpZ2h0KCksIGgpOwotICAgIAotICAgIHBhaW50QmFja2dyb3VuZChpLnAsIHN0eWxlKCkt
PmJhY2tncm91bmRDb2xvcigpLCBzdHlsZSgpLT5iYWNrZ3JvdW5kTGF5ZXJzKCksIG15LCBtaCwg
X3R4LCBfdHksIHcsIGgpOwotICAgIAotICAgIGlmIChzdHlsZSgpLT5oYXNCb3JkZXIoKSAmJiAh
Y29sbGFwc2VCb3JkZXJzKCkpCi0gICAgICAgIHBhaW50Qm9yZGVyKGkucCwgX3R4LCBfdHksIHcs
IGgsIHN0eWxlKCkpOwotfQotCi12b2lkIFJlbmRlclRhYmxlOjpjYWxjTWluTWF4V2lkdGgoKQot
ewotICAgIEtIVE1MQXNzZXJ0KCFtaW5NYXhLbm93bigpKTsKLQotICAgIGlmIChuZWVkU2VjdGlv
blJlY2FsYykKLQlyZWNhbGNTZWN0aW9ucygpOwotCi0gICAgdGFibGVMYXlvdXQtPmNhbGNNaW5N
YXhXaWR0aCgpOwotCi0gICAgaWYgKHRDYXB0aW9uICYmIHRDYXB0aW9uLT5taW5XaWR0aCgpID4g
bV9taW5XaWR0aCkKLSAgICAgICAgbV9taW5XaWR0aCA9IHRDYXB0aW9uLT5taW5XaWR0aCgpOwot
Ci0gICAgc2V0TWluTWF4S25vd24oKTsKLX0KLQotdm9pZCBSZW5kZXJUYWJsZTo6c3BsaXRDb2x1
bW4oaW50IHBvcywgaW50IGZpcnN0U3BhbikKLXsKLSAgICAvLyB3ZSBuZWVkIHRvIGFkZCBhIG5l
dyBjb2x1bW5TdHJ1Y3QKLSAgICBpbnQgb2xkU2l6ZSA9IGNvbHVtbnMuc2l6ZSgpOwotICAgIGNv
bHVtbnMucmVzaXplKG9sZFNpemUgKyAxKTsKLSAgICBpbnQgb2xkU3BhbiA9IGNvbHVtbnNbcG9z
XS5zcGFuOwotLy8gICAgIHFEZWJ1Zygic3BsaXRDb2x1bW4oICVkLCVkICksIG9sZFNpemU9JWQs
IG9sZFNwYW49JWQiLCBwb3MsIGZpcnN0U3Bhbiwgb2xkU2l6ZSwgb2xkU3BhbiApOwotICAgIEtI
VE1MQXNzZXJ0KG9sZFNwYW4gPiBmaXJzdFNwYW4pOwotICAgIGNvbHVtbnNbcG9zXS5zcGFuID0g
Zmlyc3RTcGFuOwotICAgIG1lbW1vdmUoY29sdW1ucy5kYXRhKCkgKyBwb3MgKyAxLCBjb2x1bW5z
LmRhdGEoKSArIHBvcywgKG9sZFNpemUtcG9zKSpzaXplb2YoQ29sdW1uU3RydWN0KSk7Ci0gICAg
Y29sdW1uc1twb3MrMV0uc3BhbiA9IG9sZFNwYW4gLSBmaXJzdFNwYW47Ci0KLSAgICAvLyBjaGFu
Z2Ugd2lkdGggb2YgYWxsIHJvd3MuCi0gICAgZm9yIChSZW5kZXJPYmplY3QgKmNoaWxkID0gZmly
c3RDaGlsZCgpOyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4dFNpYmxpbmcoKSkgewotCWlmIChj
aGlsZC0+aXNUYWJsZVNlY3Rpb24oKSkgewotCSAgICBSZW5kZXJUYWJsZVNlY3Rpb24gKnNlY3Rp
b24gPSBzdGF0aWNfY2FzdDxSZW5kZXJUYWJsZVNlY3Rpb24gKj4oY2hpbGQpOwotCSAgICBpZiAo
c2VjdGlvbi0+Y0NvbCA+IHBvcykKLQkJc2VjdGlvbi0+Y0NvbCsrOwotCSAgICBpbnQgc2l6ZSA9
IHNlY3Rpb24tPm51bVJvd3MoKTsKLQkgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgc2l6ZTsg
Kytyb3cpIHsKLQkJc2VjdGlvbi0+Z3JpZFtyb3ddLnJvdy0+cmVzaXplKG9sZFNpemUgKyAxKTsK
LQkJUmVuZGVyVGFibGVTZWN0aW9uOjpSb3cgJnIgPSAqc2VjdGlvbi0+Z3JpZFtyb3ddLnJvdzsK
LQkJbWVtbW92ZShyLmRhdGEoKSArIHBvcyArIDEsIHIuZGF0YSgpICsgcG9zLCAob2xkU2l6ZSAt
IHBvcykgKiBzaXplb2YoUmVuZGVyVGFibGVTZWN0aW9uOjpDZWxsU3RydWN0KSk7Ci0JCXJbcG9z
ICsgMV0uY2VsbCA9IDA7Ci0gICAgICAgICAgICAgICAgcltwb3MgKyAxXS5pbkNvbFNwYW4gPSBy
W3Bvc10uaW5Db2xTcGFuIHx8IHJbcG9zXS5jZWxsOwotCSAgICB9Ci0JfQotICAgIH0KLSAgICBj
b2x1bW5Qb3MucmVzaXplKG51bUVmZkNvbHMoKSArIDEpOwotICAgIHNldE5lZWRzTGF5b3V0QW5k
TWluTWF4UmVjYWxjKCk7Ci19Ci0KLXZvaWQgUmVuZGVyVGFibGU6OmFwcGVuZENvbHVtbihpbnQg
c3BhbikKLXsKLSAgICAvLyBlYXN5IGNhc2UuCi0gICAgaW50IHBvcyA9IGNvbHVtbnMuc2l6ZSgp
OwotICAgIGludCBuZXdTaXplID0gcG9zICsgMTsKLSAgICBjb2x1bW5zLnJlc2l6ZShuZXdTaXpl
KTsKLSAgICBjb2x1bW5zW3Bvc10uc3BhbiA9IHNwYW47Ci0KLSAgICAvLyBjaGFuZ2Ugd2lkdGgg
b2YgYWxsIHJvd3MuCi0gICAgZm9yIChSZW5kZXJPYmplY3QgKmNoaWxkID0gZmlyc3RDaGlsZCgp
OyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4dFNpYmxpbmcoKSkgewotCWlmIChjaGlsZC0+aXNU
YWJsZVNlY3Rpb24oKSkgewotCSAgICBSZW5kZXJUYWJsZVNlY3Rpb24gKnNlY3Rpb24gPSBzdGF0
aWNfY2FzdDxSZW5kZXJUYWJsZVNlY3Rpb24gKj4oY2hpbGQpOwotCSAgICBpbnQgc2l6ZSA9IHNl
Y3Rpb24tPm51bVJvd3MoKTsKLQkgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgc2l6ZTsgKyty
b3cpIHsKLQkJc2VjdGlvbi0+Z3JpZFtyb3ddLnJvdy0+cmVzaXplKG5ld1NpemUpOwotICAgICAg
ICAgICAgICAgIFJlbmRlclRhYmxlU2VjdGlvbjo6Q2VsbFN0cnVjdCYgYyA9IHNlY3Rpb24tPmNl
bGxBdChyb3csIHBvcyk7Ci0JCWMuY2VsbCA9IDA7Ci0JCWMuaW5Db2xTcGFuID0gZmFsc2U7Ci0J
ICAgIH0KLQl9Ci0gICAgfQotICAgIGNvbHVtblBvcy5yZXNpemUobnVtRWZmQ29scygpICsgMSk7
Ci0gICAgc2V0TmVlZHNMYXlvdXRBbmRNaW5NYXhSZWNhbGMoKTsKLX0KLQotUmVuZGVyVGFibGVD
b2wgKlJlbmRlclRhYmxlOjpjb2xFbGVtZW50KGludCBjb2wpIHsKLSAgICBpZiAoIWhhc19jb2xf
ZWxlbXMpCi0JcmV0dXJuIDA7Ci0gICAgUmVuZGVyT2JqZWN0ICpjaGlsZCA9IGZpcnN0Q2hpbGQo
KTsKLSAgICBpbnQgY0NvbCA9IDA7Ci0gICAgd2hpbGUgKGNoaWxkKSB7Ci0JaWYgKGNoaWxkLT5p
c1RhYmxlQ29sKCkpIHsKLQkgICAgUmVuZGVyVGFibGVDb2wgKmNvbEVsZW0gPSBzdGF0aWNfY2Fz
dDxSZW5kZXJUYWJsZUNvbCAqPihjaGlsZCk7Ci0JICAgIGludCBzcGFuID0gY29sRWxlbS0+c3Bh
bigpOwotCSAgICBpZiAoIWNvbEVsZW0tPmZpcnN0Q2hpbGQoKSkgewotCQljQ29sICs9IHNwYW47
Ci0JCWlmIChjQ29sID4gY29sKQotCQkgICAgcmV0dXJuIGNvbEVsZW07Ci0JICAgIH0KLQotCSAg
ICBSZW5kZXJPYmplY3QgKm5leHQgPSBjaGlsZC0+Zmlyc3RDaGlsZCgpOwotCSAgICBpZiAoIW5l
eHQpCi0JCW5leHQgPSBjaGlsZC0+bmV4dFNpYmxpbmcoKTsKLQkgICAgaWYgKCFuZXh0ICYmIGNo
aWxkLT5wYXJlbnQoKS0+aXNUYWJsZUNvbCgpKQotCQluZXh0ID0gY2hpbGQtPnBhcmVudCgpLT5u
ZXh0U2libGluZygpOwotCSAgICBjaGlsZCA9IG5leHQ7Ci0JfSBlbHNlIGlmIChjaGlsZCA9PSB0
Q2FwdGlvbikKLSAgICAgICAgICAgIGNoaWxkID0gY2hpbGQtPm5leHRTaWJsaW5nKCk7Ci0gICAg
ICAgIGVsc2UKLQkgICAgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi12b2lkIFJl
bmRlclRhYmxlOjpyZWNhbGNTZWN0aW9ucygpCi17Ci0gICAgdENhcHRpb24gPSAwOwotICAgIGhl
YWQgPSBmb290ID0gZmlyc3RCb2R5ID0gMDsKLSAgICBoYXNfY29sX2VsZW1zID0gZmFsc2U7Ci0K
LSAgICAvLyBXZSBuZWVkIHRvIGdldCB2YWxpZCBwb2ludGVycyB0byBjYXB0aW9uLCBoZWFkLCBm
b290IGFuZCBmaXJzdGJvZHkgYWdhaW4KLSAgICBmb3IgKFJlbmRlck9iamVjdCAqY2hpbGQgPSBm
aXJzdENoaWxkKCk7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0U2libGluZygpKSB7Ci0Jc3dp
dGNoIChjaGlsZC0+c3R5bGUoKS0+ZGlzcGxheSgpKSB7Ci0gICAgICAgICAgICBjYXNlIFRBQkxF
X0NBUFRJT046Ci0gICAgICAgICAgICAgICAgaWYgKCF0Q2FwdGlvbikgewotICAgICAgICAgICAg
ICAgICAgICB0Q2FwdGlvbiA9IHN0YXRpY19jYXN0PFJlbmRlckJsb2NrKj4oY2hpbGQpOwotICAg
ICAgICAgICAgICAgICAgICB0Q2FwdGlvbi0+c2V0TmVlZHNMYXlvdXQodHJ1ZSk7Ci0gICAgICAg
ICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBUQUJM
RV9DT0xVTU46Ci0gICAgICAgICAgICBjYXNlIFRBQkxFX0NPTFVNTl9HUk9VUDoKLSAgICAgICAg
ICAgICAgICBoYXNfY29sX2VsZW1zID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAg
ICAgICAgICAgIGNhc2UgVEFCTEVfSEVBREVSX0dST1VQOiB7Ci0gICAgICAgICAgICAgICAgUmVu
ZGVyVGFibGVTZWN0aW9uICpzZWN0aW9uID0gc3RhdGljX2Nhc3Q8UmVuZGVyVGFibGVTZWN0aW9u
ICo+KGNoaWxkKTsKLSAgICAgICAgICAgICAgICBpZiAoIWhlYWQpCi0gICAgICAgICAgICAgICAg
ICAgIGhlYWQgPSBzZWN0aW9uOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFmaXJzdEJvZHkp
Ci0gICAgICAgICAgICAgICAgICAgIGZpcnN0Qm9keSA9IHNlY3Rpb247Ci0gICAgICAgICAgICAg
ICAgaWYgKHNlY3Rpb24tPm5lZWRDZWxsUmVjYWxjKQotICAgICAgICAgICAgICAgICAgICBzZWN0
aW9uLT5yZWNhbGNDZWxscygpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAg
fQotICAgICAgICAgICAgY2FzZSBUQUJMRV9GT09URVJfR1JPVVA6IHsKLSAgICAgICAgICAgICAg
ICBSZW5kZXJUYWJsZVNlY3Rpb24gKnNlY3Rpb24gPSBzdGF0aWNfY2FzdDxSZW5kZXJUYWJsZVNl
Y3Rpb24gKj4oY2hpbGQpOwotICAgICAgICAgICAgICAgIGlmICghZm9vdCkKLSAgICAgICAgICAg
ICAgICAgICAgZm9vdCA9IHNlY3Rpb247Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIWZpcnN0
Qm9keSkKLSAgICAgICAgICAgICAgICAgICAgZmlyc3RCb2R5ID0gc2VjdGlvbjsKLSAgICAgICAg
ICAgICAgICBpZiAoc2VjdGlvbi0+bmVlZENlbGxSZWNhbGMpCi0gICAgICAgICAgICAgICAgICAg
IHNlY3Rpb24tPnJlY2FsY0NlbGxzKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAg
ICAgICB9Ci0gICAgICAgICAgICBjYXNlIFRBQkxFX1JPV19HUk9VUDogewotICAgICAgICAgICAg
ICAgIFJlbmRlclRhYmxlU2VjdGlvbiAqc2VjdGlvbiA9IHN0YXRpY19jYXN0PFJlbmRlclRhYmxl
U2VjdGlvbiAqPihjaGlsZCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFmaXJzdEJvZHkpCi0gICAg
ICAgICAgICAgICAgICAgIGZpcnN0Qm9keSA9IHNlY3Rpb247Ci0gICAgICAgICAgICAgICAgaWYg
KHNlY3Rpb24tPm5lZWRDZWxsUmVjYWxjKQotICAgICAgICAgICAgICAgICAgICBzZWN0aW9uLT5y
ZWNhbGNDZWxscygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAg
ICAgICAgICAgICBicmVhazsKLQl9Ci0gICAgfQotICAgIG5lZWRTZWN0aW9uUmVjYWxjID0gZmFs
c2U7Ci0gICAgc2V0TmVlZHNMYXlvdXQodHJ1ZSk7Ci19Ci0KLVJlbmRlck9iamVjdCogUmVuZGVy
VGFibGU6OnJlbW92ZUNoaWxkTm9kZShSZW5kZXJPYmplY3QqIGNoaWxkKQotewotICAgIHNldE5l
ZWRTZWN0aW9uUmVjYWxjKCk7Ci0gICAgcmV0dXJuIFJlbmRlckNvbnRhaW5lcjo6cmVtb3ZlQ2hp
bGROb2RlKGNoaWxkKTsKLX0KLQotaW50IFJlbmRlclRhYmxlOjpib3JkZXJMZWZ0KCkgY29uc3QK
LXsKLSAgICBpZiAoY29sbGFwc2VCb3JkZXJzKCkpIHsKLSAgICAgICAgLy8gRklYTUU6IEZvciBz
dHJpY3QgbW9kZSwgcmV0dXJuaW5nIDAgaXMgY29ycmVjdCwgc2luY2UgdGhlIHRhYmxlIGJvcmRl
ciBoYWxmIHNwaWxscyBpbnRvIHRoZSBtYXJnaW4sCi0gICAgICAgIC8vIGJ1dCBJJ20gd29ya2lu
ZyB0byBnZXQgdGhpcyBjaGFuZ2VkLiAgRm9yIG5vdywgZm9sbG93IHRoZSBzcGVjLgotICAgICAg
ICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIFJlbmRlckJsb2NrOjpib3JkZXJMZWZ0KCk7
Ci19Ci0gICAgCi1pbnQgUmVuZGVyVGFibGU6OmJvcmRlclJpZ2h0KCkgY29uc3QKLXsKLSAgICBp
ZiAoY29sbGFwc2VCb3JkZXJzKCkpIHsKLSAgICAgICAgLy8gRklYTUU6IEZvciBzdHJpY3QgbW9k
ZSwgcmV0dXJuaW5nIDAgaXMgY29ycmVjdCwgc2luY2UgdGhlIHRhYmxlIGJvcmRlciBoYWxmIHNw
aWxscyBpbnRvIHRoZSBtYXJnaW4sCi0gICAgICAgIC8vIGJ1dCBJJ20gd29ya2luZyB0byBnZXQg
dGhpcyBjaGFuZ2VkLiAgRm9yIG5vdywgZm9sbG93IHRoZSBzcGVjLgotICAgICAgICByZXR1cm4g
MDsKLSAgICB9Ci0gICAgcmV0dXJuIFJlbmRlckJsb2NrOjpib3JkZXJSaWdodCgpOwotfQotCi1p
bnQgUmVuZGVyVGFibGU6OmJvcmRlclRvcCgpIGNvbnN0Ci17Ci0gICAgaWYgKGNvbGxhcHNlQm9y
ZGVycygpKSB7Ci0gICAgICAgIC8vIEZJWE1FOiBGb3Igc3RyaWN0IG1vZGUsIHJldHVybmluZyAw
IGlzIGNvcnJlY3QsIHNpbmNlIHRoZSB0YWJsZSBib3JkZXIgaGFsZiBzcGlsbHMgaW50byB0aGUg
bWFyZ2luLAotICAgICAgICAvLyBidXQgSSdtIHdvcmtpbmcgdG8gZ2V0IHRoaXMgY2hhbmdlZC4g
IEZvciBub3csIGZvbGxvdyB0aGUgc3BlYy4KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAg
IHJldHVybiBSZW5kZXJCbG9jazo6Ym9yZGVyVG9wKCk7Ci19Ci0KLWludCBSZW5kZXJUYWJsZTo6
Ym9yZGVyQm90dG9tKCkgY29uc3QKLXsKLSAgICBpZiAoY29sbGFwc2VCb3JkZXJzKCkpIHsKLSAg
ICAgICAgLy8gRklYTUU6IEZvciBzdHJpY3QgbW9kZSwgcmV0dXJuaW5nIDAgaXMgY29ycmVjdCwg
c2luY2UgdGhlIHRhYmxlIGJvcmRlciBoYWxmIHNwaWxscyBpbnRvIHRoZSBtYXJnaW4sCi0gICAg
ICAgIC8vIGJ1dCBJJ20gd29ya2luZyB0byBnZXQgdGhpcyBjaGFuZ2VkLiAgRm9yIG5vdywgZm9s
bG93IHRoZSBzcGVjLgotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIFJlbmRl
ckJsb2NrOjpib3JkZXJCb3R0b20oKTsKLX0KLQotUmVuZGVyVGFibGVDZWxsKiBSZW5kZXJUYWJs
ZTo6Y2VsbEFib3ZlKGNvbnN0IFJlbmRlclRhYmxlQ2VsbCogY2VsbCkgY29uc3QKLXsKLSAgICAv
LyBGaW5kIHRoZSBzZWN0aW9uIGFuZCByb3cgdG8gbG9vayBpbgotICAgIGludCByID0gY2VsbC0+
cm93KCk7Ci0gICAgUmVuZGVyVGFibGVTZWN0aW9uKiBzZWN0aW9uID0gMDsKLSAgICBpbnQgckFi
b3ZlID0gLTE7Ci0gICAgaWYgKHIgPiAwKSB7Ci0gICAgICAgIC8vIGNlbGwgaXMgbm90IGluIHRo
ZSBmaXJzdCByb3csIHNvIHVzZSB0aGUgYWJvdmUgcm93IGluIGl0cyBvd24gc2VjdGlvbgotICAg
ICAgICBzZWN0aW9uID0gY2VsbC0+c2VjdGlvbigpOwotICAgICAgICByQWJvdmUgPSByLTE7Ci0g
ICAgfSBlbHNlIHsKLSAgICAgICAgLy8gY2VsbCBpcyBhdCB0b3Agb2YgYSBzZWN0aW9uLCB1c2Ug
bGFzdCByb3cgaW4gcHJldmlvdXMgc2VjdGlvbgotICAgICAgICBmb3IgKFJlbmRlck9iamVjdCAq
cHJldlNlY3Rpb24gPSBjZWxsLT5zZWN0aW9uKCktPnByZXZpb3VzU2libGluZygpOwotICAgICAg
ICAgICAgIHByZXZTZWN0aW9uICYmIHJBYm92ZSA8IDA7Ci0gICAgICAgICAgICAgcHJldlNlY3Rp
b24gPSBwcmV2U2VjdGlvbi0+cHJldmlvdXNTaWJsaW5nKCkpIHsKLSAgICAgICAgICAgIGlmIChw
cmV2U2VjdGlvbi0+aXNUYWJsZVNlY3Rpb24oKSkgewotICAgICAgICAgICAgICAgIHNlY3Rpb24g
PSBzdGF0aWNfY2FzdDxSZW5kZXJUYWJsZVNlY3Rpb24gKj4ocHJldlNlY3Rpb24pOwotICAgICAg
ICAgICAgICAgIGlmIChzZWN0aW9uLT5udW1Sb3dzKCkgPiAwKQotICAgICAgICAgICAgICAgICAg
ICByQWJvdmUgPSBzZWN0aW9uLT5udW1Sb3dzKCktMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAg
fQotICAgIH0KLQotICAgIC8vIExvb2sgdXAgdGhlIGNlbGwgaW4gdGhlIHNlY3Rpb24ncyBncmlk
LCB3aGljaCByZXF1aXJlcyBlZmZlY3RpdmUgY29sIGluZGV4Ci0gICAgaWYgKHNlY3Rpb24gJiYg
ckFib3ZlID49IDApIHsKLSAgICAgICAgaW50IGVmZkNvbCA9IGNvbFRvRWZmQ29sKGNlbGwtPmNv
bCgpKTsKLSAgICAgICAgUmVuZGVyVGFibGVTZWN0aW9uOjpDZWxsU3RydWN0IGFib3ZlQ2VsbDsK
LSAgICAgICAgLy8gSWYgd2UgaGl0IGEgc3BhbiBiYWNrIHVwIHRvIGEgcmVhbCBjZWxsLgotICAg
ICAgICBkbyB7Ci0gICAgICAgICAgICBhYm92ZUNlbGwgPSBzZWN0aW9uLT5jZWxsQXQockFib3Zl
LCBlZmZDb2wpOwotICAgICAgICAgICAgZWZmQ29sLS07Ci0gICAgICAgIH0gd2hpbGUgKCFhYm92
ZUNlbGwuY2VsbCAmJiBhYm92ZUNlbGwuaW5Db2xTcGFuICYmIGVmZkNvbCA+PTApOwotICAgICAg
ICByZXR1cm4gYWJvdmVDZWxsLmNlbGw7Ci0gICAgfSBlbHNlCi0gICAgICAgIHJldHVybiAwOwot
fQotCi1SZW5kZXJUYWJsZUNlbGwqIFJlbmRlclRhYmxlOjpjZWxsQmVsb3coY29uc3QgUmVuZGVy
VGFibGVDZWxsKiBjZWxsKSBjb25zdAotewotICAgIC8vIEZpbmQgdGhlIHNlY3Rpb24gYW5kIHJv
dyB0byBsb29rIGluCi0gICAgaW50IHIgPSBjZWxsLT5yb3coKSArIGNlbGwtPnJvd1NwYW4oKSAt
IDE7Ci0gICAgUmVuZGVyVGFibGVTZWN0aW9uKiBzZWN0aW9uID0gMDsKLSAgICBpbnQgckJlbG93
ID0gLTE7Ci0gICAgaWYgKHIgPCBjZWxsLT5zZWN0aW9uKCktPm51bVJvd3MoKSAtIDEpIHsKLSAg
ICAgICAgLy8gVGhlIGNlbGwgaXMgbm90IGluIHRoZSBsYXN0IHJvdywgc28gdXNlIHRoZSBuZXh0
IHJvdyBpbiB0aGUgc2VjdGlvbi4KLSAgICAgICAgc2VjdGlvbiA9IGNlbGwtPnNlY3Rpb24oKTsK
LSAgICAgICAgckJlbG93PSByKzE7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gVGhlIGNlbGwg
aXMgYXQgdGhlIGJvdHRvbSBvZiBhIHNlY3Rpb24uIFVzZSB0aGUgZmlyc3Qgcm93IGluIHRoZSBu
ZXh0IHNlY3Rpb24uCi0gICAgICAgIGZvciAoUmVuZGVyT2JqZWN0KiBuZXh0U2VjdGlvbiA9IGNl
bGwtPnNlY3Rpb24oKS0+bmV4dFNpYmxpbmcoKTsKLSAgICAgICAgICAgICBuZXh0U2VjdGlvbiAm
JiByQmVsb3cgPCAwOwotICAgICAgICAgICAgIG5leHRTZWN0aW9uID0gbmV4dFNlY3Rpb24tPm5l
eHRTaWJsaW5nKCkpIHsKLSAgICAgICAgICAgIGlmIChuZXh0U2VjdGlvbi0+aXNUYWJsZVNlY3Rp
b24oKSkgewotICAgICAgICAgICAgICAgIHNlY3Rpb24gPSBzdGF0aWNfY2FzdDxSZW5kZXJUYWJs
ZVNlY3Rpb24gKj4obmV4dFNlY3Rpb24pOwotICAgICAgICAgICAgICAgIGlmIChzZWN0aW9uLT5u
dW1Sb3dzKCkgPiAwKQotICAgICAgICAgICAgICAgICAgICByQmVsb3cgPSAwOwotICAgICAgICAg
ICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8vIExvb2sgdXAgdGhlIGNlbGwgaW4g
dGhlIHNlY3Rpb24ncyBncmlkLCB3aGljaCByZXF1aXJlcyBlZmZlY3RpdmUgY29sIGluZGV4Ci0g
ICAgaWYgKHNlY3Rpb24gJiYgckJlbG93ID49IDApIHsKLSAgICAgICAgaW50IGVmZkNvbCA9IGNv
bFRvRWZmQ29sKGNlbGwtPmNvbCgpKTsKLSAgICAgICAgUmVuZGVyVGFibGVTZWN0aW9uOjpDZWxs
U3RydWN0IGJlbG93Q2VsbDsKLSAgICAgICAgLy8gSWYgd2UgaGl0IGEgY29sc3BhbiBiYWNrIHVw
IHRvIGEgcmVhbCBjZWxsLgotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBiZWxvd0NlbGwgPSBz
ZWN0aW9uLT5jZWxsQXQockJlbG93LCBlZmZDb2wpOwotICAgICAgICAgICAgZWZmQ29sLS07Ci0g
ICAgICAgIH0gd2hpbGUgKCFiZWxvd0NlbGwuY2VsbCAmJiBiZWxvd0NlbGwuaW5Db2xTcGFuICYm
IGVmZkNvbCA+PTApOwotICAgICAgICByZXR1cm4gYmVsb3dDZWxsLmNlbGw7Ci0gICAgfSBlbHNl
Ci0gICAgICAgIHJldHVybiAwOwotfQotCi1SZW5kZXJUYWJsZUNlbGwqIFJlbmRlclRhYmxlOjpj
ZWxsTGVmdChjb25zdCBSZW5kZXJUYWJsZUNlbGwqIGNlbGwpIGNvbnN0Ci17Ci0gICAgUmVuZGVy
VGFibGVTZWN0aW9uKiBzZWN0aW9uID0gY2VsbC0+c2VjdGlvbigpOwotICAgIGludCBlZmZDb2wg
PSBjb2xUb0VmZkNvbChjZWxsLT5jb2woKSk7Ci0gICAgaWYgKGVmZkNvbCA9PSAwKQotICAgICAg
ICByZXR1cm4gMDsKLSAgICAKLSAgICAvLyBJZiB3ZSBoaXQgYSBjb2xzcGFuIGJhY2sgdXAgdG8g
YSByZWFsIGNlbGwuCi0gICAgUmVuZGVyVGFibGVTZWN0aW9uOjpDZWxsU3RydWN0IHByZXZDZWxs
OwotICAgIGRvIHsKLSAgICAgICAgcHJldkNlbGwgPSBzZWN0aW9uLT5jZWxsQXQoY2VsbC0+cm93
KCksIGVmZkNvbC0xKTsKLSAgICAgICAgZWZmQ29sLS07Ci0gICAgfSB3aGlsZSAoIXByZXZDZWxs
LmNlbGwgJiYgcHJldkNlbGwuaW5Db2xTcGFuICYmIGVmZkNvbCA+PTApOwotICAgIHJldHVybiBw
cmV2Q2VsbC5jZWxsOwotfQotCi1SZW5kZXJUYWJsZUNlbGwqIFJlbmRlclRhYmxlOjpjZWxsUmln
aHQoY29uc3QgUmVuZGVyVGFibGVDZWxsKiBjZWxsKSBjb25zdAotewotICAgIGludCBlZmZDb2wg
PSBjb2xUb0VmZkNvbChjZWxsLT5jb2woKSArIGNlbGwtPmNvbFNwYW4oKSk7Ci0gICAgaWYgKGVm
ZkNvbCA+PSBudW1FZmZDb2xzKCkpCi0gICAgICAgIHJldHVybiAwOwotICAgIHJldHVybiBjZWxs
LT5zZWN0aW9uKCktPmNlbGxBdChjZWxsLT5yb3coKSwgZWZmQ29sKS5jZWxsOwotfQotCi1SZW5k
ZXJCbG9jayogUmVuZGVyVGFibGU6OmZpcnN0TGluZUJsb2NrKCkgY29uc3QKLXsKLSAgICByZXR1
cm4gMDsKLX0KLQotdm9pZCBSZW5kZXJUYWJsZTo6dXBkYXRlRmlyc3RMZXR0ZXIoKQote30KLQot
I2lmbmRlZiBOREVCVUcKLXZvaWQgUmVuZGVyVGFibGU6OmR1bXAoUVRleHRTdHJlYW0gKnN0cmVh
bSwgUVN0cmluZyBpbmQpIGNvbnN0Ci17Ci0gICAgaWYgKHRDYXB0aW9uKQotCSpzdHJlYW0gPDwg
IiB0Q2FwdGlvbiI7Ci0gICAgaWYgKGhlYWQpCi0JKnN0cmVhbSA8PCAiIGhlYWQiOwotICAgIGlm
IChmb290KQotCSpzdHJlYW0gPDwgIiBmb290IjsKLQotICAgICpzdHJlYW0gPDwgZW5kbCA8PCBp
bmQgPDwgImNzcGFuczoiOwotICAgIGZvciAoIHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGNvbHVt
bnMuc2l6ZSgpOyBpKysgKQotCSpzdHJlYW0gPDwgIiAiIDw8IGNvbHVtbnNbaV0uc3BhbjsKLSAg
ICAqc3RyZWFtIDw8IGVuZGwgPDwgaW5kOwotCi0gICAgUmVuZGVyQmxvY2s6OmR1bXAoc3RyZWFt
LGluZCk7Ci19Ci0jZW5kaWYKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotUmVuZGVyVGFibGVT
ZWN0aW9uOjpSZW5kZXJUYWJsZVNlY3Rpb24oRE9NOjpOb2RlSW1wbCogbm9kZSkKK1JlbmRlclRh
YmxlU2VjdGlvbjo6UmVuZGVyVGFibGVTZWN0aW9uKE5vZGVJbXBsKiBub2RlKQogICAgIDogUmVu
ZGVyQ29udGFpbmVyKG5vZGUpCiB7CiAgICAgLy8gaW5pdCBSZW5kZXJPYmplY3QgYXR0cmlidXRl
cwpAQCAtMTM2MCw4OTkgKzY0Nyw0IEBAIHZvaWQgUmVuZGVyVGFibGVTZWN0aW9uOjpkdW1wKFFU
ZXh0U3RyZWEKIH0KICNlbmRpZgogCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVJlbmRlclRhYmxl
Um93OjpSZW5kZXJUYWJsZVJvdyhET006Ok5vZGVJbXBsKiBub2RlKQotICAgIDogUmVuZGVyQ29u
dGFpbmVyKG5vZGUpCi17Ci0gICAgLy8gaW5pdCBSZW5kZXJPYmplY3QgYXR0cmlidXRlcwotICAg
IHNldElubGluZShmYWxzZSk7ICAgLy8gb3VyIG9iamVjdCBpcyBub3QgSW5saW5lCi19Ci0KLXZv
aWQgUmVuZGVyVGFibGVSb3c6OmRlc3Ryb3koKQotewotICAgIFJlbmRlclRhYmxlU2VjdGlvbiAq
cyA9IHNlY3Rpb24oKTsKLSAgICBpZiAocykKLSAgICAgICAgcy0+c2V0TmVlZENlbGxSZWNhbGMo
KTsKLSAgICAKLSAgICBSZW5kZXJDb250YWluZXI6OmRlc3Ryb3koKTsKLX0KLQotdm9pZCBSZW5k
ZXJUYWJsZVJvdzo6c2V0U3R5bGUoUmVuZGVyU3R5bGUqIHN0eWxlKQotewotICAgIHN0eWxlLT5z
ZXREaXNwbGF5KFRBQkxFX1JPVyk7Ci0gICAgUmVuZGVyQ29udGFpbmVyOjpzZXRTdHlsZShzdHls
ZSk7Ci19Ci0KLXZvaWQgUmVuZGVyVGFibGVSb3c6OmFkZENoaWxkKFJlbmRlck9iamVjdCAqY2hp
bGQsIFJlbmRlck9iamVjdCAqYmVmb3JlQ2hpbGQpCi17Ci0gICAgaWYgKGNoaWxkLT5lbGVtZW50
KCkgJiYgY2hpbGQtPmVsZW1lbnQoKS0+aGFzVGFnTmFtZShmb3JtVGFnKSkgewotICAgICAgICBS
ZW5kZXJDb250YWluZXI6OmFkZENoaWxkKGNoaWxkLGJlZm9yZUNoaWxkKTsKLSAgICAgICAgcmV0
dXJuOwotICAgIH0KLQotICAgIFJlbmRlclRhYmxlQ2VsbCAqY2VsbDsKLQotICAgIGlmICghY2hp
bGQtPmlzVGFibGVDZWxsKCkpIHsKLQlSZW5kZXJPYmplY3QgKmxhc3QgPSBiZWZvcmVDaGlsZDsK
LSAgICAgICAgaWYgKCFsYXN0KQotICAgICAgICAgICAgbGFzdCA9IGxhc3RDaGlsZCgpOwotICAg
ICAgICBSZW5kZXJUYWJsZUNlbGwgKmNlbGwgPSAwOwotICAgICAgICBpZiAobGFzdCAmJiBsYXN0
LT5pc0Fub255bW91cygpICYmIGxhc3QtPmlzVGFibGVDZWxsKCkpCi0gICAgICAgICAgICBjZWxs
ID0gc3RhdGljX2Nhc3Q8UmVuZGVyVGFibGVDZWxsICo+KGxhc3QpOwotICAgICAgICBlbHNlIHsK
LQkgICAgY2VsbCA9IG5ldyAocmVuZGVyQXJlbmEoKSkgUmVuZGVyVGFibGVDZWxsKGRvY3VtZW50
KCkgLyogYW5vbnltb3VzIG9iamVjdCAqLyk7Ci0JICAgIFJlbmRlclN0eWxlICpuZXdTdHlsZSA9
IG5ldyAocmVuZGVyQXJlbmEoKSkgUmVuZGVyU3R5bGUoKTsKLQkgICAgbmV3U3R5bGUtPmluaGVy
aXRGcm9tKHN0eWxlKCkpOwotCSAgICBuZXdTdHlsZS0+c2V0RGlzcGxheShUQUJMRV9DRUxMKTsK
LQkgICAgY2VsbC0+c2V0U3R5bGUobmV3U3R5bGUpOwotCSAgICBhZGRDaGlsZChjZWxsLCBiZWZv
cmVDaGlsZCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2VsbC0+YWRkQ2hpbGQoY2hpbGQpOwotICAg
ICAgICBjaGlsZC0+c2V0TmVlZHNMYXlvdXRBbmRNaW5NYXhSZWNhbGMoKTsKLSAgICAgICAgcmV0
dXJuOwotICAgIH0gZWxzZQotICAgICAgICBjZWxsID0gc3RhdGljX2Nhc3Q8UmVuZGVyVGFibGVD
ZWxsICo+KGNoaWxkKTsKLQotICAgIHN0YXRpY19jYXN0PFJlbmRlclRhYmxlU2VjdGlvbiAqPihw
YXJlbnQoKSktPmFkZENlbGwoY2VsbCk7Ci0KLSAgICBSZW5kZXJDb250YWluZXI6OmFkZENoaWxk
KGNlbGwsYmVmb3JlQ2hpbGQpOwotCi0gICAgaWYgKChiZWZvcmVDaGlsZCB8fCBuZXh0U2libGlu
ZygpKSAmJiBzZWN0aW9uKCkpCi0Jc2VjdGlvbigpLT5zZXROZWVkQ2VsbFJlY2FsYygpOwotfQot
Ci1SZW5kZXJPYmplY3QqIFJlbmRlclRhYmxlUm93OjpyZW1vdmVDaGlsZE5vZGUoUmVuZGVyT2Jq
ZWN0KiBjaGlsZCkKLXsKLS8vIFJlbmRlclRhYmxlQ2VsbCBkZXN0cm95IHNob3VsZCBkbyBpdAot
Ly8gICAgIGlmICggc2VjdGlvbigpICkKLS8vIAlzZWN0aW9uKCktPnNldE5lZWRDZWxsUmVjYWxj
KCk7Ci0gICAgcmV0dXJuIFJlbmRlckNvbnRhaW5lcjo6cmVtb3ZlQ2hpbGROb2RlKGNoaWxkKTsK
LX0KLQotI2lmbmRlZiBOREVCVUcKLXZvaWQgUmVuZGVyVGFibGVSb3c6OmR1bXAoUVRleHRTdHJl
YW0gKnN0cmVhbSwgUVN0cmluZyBpbmQpIGNvbnN0Ci17Ci0gICAgUmVuZGVyQ29udGFpbmVyOjpk
dW1wKHN0cmVhbSxpbmQpOwotfQotI2VuZGlmCi0KLXZvaWQgUmVuZGVyVGFibGVSb3c6OmxheW91
dCgpCi17Ci0gICAgS0hUTUxBc3NlcnQobmVlZHNMYXlvdXQoKSk7Ci0gICAgS0hUTUxBc3NlcnQo
bWluTWF4S25vd24oKSk7Ci0KLSAgICBmb3IgKFJlbmRlck9iamVjdCAqY2hpbGQgPSBmaXJzdENo
aWxkKCk7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0U2libGluZygpKSB7Ci0gICAgICAgIGlm
IChjaGlsZC0+aXNUYWJsZUNlbGwoKSkgewotICAgICAgICAgICAgUmVuZGVyVGFibGVDZWxsICpj
ZWxsID0gc3RhdGljX2Nhc3Q8UmVuZGVyVGFibGVDZWxsICo+KGNoaWxkKTsKLSAgICAgICAgICAg
IGlmIChjaGlsZC0+bmVlZHNMYXlvdXQoKSkgewotICAgICAgICAgICAgICAgIGNlbGwtPmNhbGNW
ZXJ0aWNhbE1hcmdpbnMoKTsKLSAgICAgICAgICAgICAgICBjZWxsLT5sYXlvdXQoKTsKLSAgICAg
ICAgICAgICAgICBjZWxsLT5zZXRDZWxsVG9wRXh0cmEoMCk7Ci0gICAgICAgICAgICAgICAgY2Vs
bC0+c2V0Q2VsbEJvdHRvbUV4dHJhKDApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAg
fQotICAgIHNldE5lZWRzTGF5b3V0KGZhbHNlKTsKLX0KLQotSW50UmVjdCBSZW5kZXJUYWJsZVJv
dzo6Z2V0QWJzb2x1dGVSZXBhaW50UmVjdCgpCi17Ci0gICAgLy8gRm9yIG5vdywganVzdCByZXBh
aW50IHRoZSB3aG9sZSB0YWJsZS4KLSAgICAvLyBGSVhNRTogRmluZCBhIGJldHRlciB3YXkgdG8g
ZG8gdGhpcy4KLSAgICBSZW5kZXJUYWJsZSogcGFyZW50VGFibGUgPSB0YWJsZSgpOwotICAgIGlm
IChwYXJlbnRUYWJsZSkKLSAgICAgICAgcmV0dXJuIHBhcmVudFRhYmxlLT5nZXRBYnNvbHV0ZVJl
cGFpbnRSZWN0KCk7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gSW50UmVjdCgpOwotfQotCi0v
LyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tCi0KLVJlbmRlclRhYmxlQ2VsbDo6UmVuZGVyVGFibGVDZWxsKERP
TTo6Tm9kZUltcGwqIF9ub2RlKQotICA6IFJlbmRlckJsb2NrKF9ub2RlKQotewotICBfY29sID0g
LTE7Ci0gIF9yb3cgPSAtMTsKLSAgY1NwYW4gPSByU3BhbiA9IDE7Ci0gIHVwZGF0ZUZyb21FbGVt
ZW50KCk7Ci0gIHNldFNob3VsZFBhaW50QmFja2dyb3VuZE9yQm9yZGVyKHRydWUpOwotICBfdG9w
RXh0cmEgPSAwOwotICBfYm90dG9tRXh0cmEgPSAwOwotICBtX3BlcmNlbnRhZ2VIZWlnaHQgPSAw
OwotfQotCi12b2lkIFJlbmRlclRhYmxlQ2VsbDo6ZGVzdHJveSgpCi17Ci0gICAgaWYgKHBhcmVu
dCgpICYmIHNlY3Rpb24oKSkKLSAgICAgICAgc2VjdGlvbigpLT5zZXROZWVkQ2VsbFJlY2FsYygp
OwotCi0gICAgUmVuZGVyQmxvY2s6OmRlc3Ryb3koKTsKLX0KLQotdm9pZCBSZW5kZXJUYWJsZUNl
bGw6OnVwZGF0ZUZyb21FbGVtZW50KCkKLXsKLSAgICBpbnQgb2xkUlNwYW4gPSByU3BhbjsKLSAg
ICBpbnQgb2xkQ1NwYW4gPSBjU3BhbjsKLSAgICBET006Ok5vZGVJbXBsKiBub2RlID0gZWxlbWVu
dCgpOwotICAgIGlmIChub2RlICYmIChub2RlLT5oYXNUYWdOYW1lKHRkVGFnKSB8fCBub2RlLT5o
YXNUYWdOYW1lKHRoVGFnKSkpIHsKLSAgICAgICAgRE9NOjpIVE1MVGFibGVDZWxsRWxlbWVudElt
cGwgKnRjID0gc3RhdGljX2Nhc3Q8RE9NOjpIVE1MVGFibGVDZWxsRWxlbWVudEltcGwgKj4obm9k
ZSk7Ci0gICAgICAgIGNTcGFuID0gdGMtPmNvbFNwYW4oKTsKLSAgICAgICAgclNwYW4gPSB0Yy0+
cm93U3BhbigpOwotICAgIH0KLSAgICBpZiAoKG9sZFJTcGFuICE9IHJTcGFuIHx8IG9sZENTcGFu
ICE9IGNTcGFuKSAmJiBzdHlsZSgpICYmIHBhcmVudCgpKQotICAgICAgICBzZXROZWVkc0xheW91
dEFuZE1pbk1heFJlY2FsYygpOwotfQotICAgIAotTGVuZ3RoIFJlbmRlclRhYmxlQ2VsbDo6c3R5
bGVPckNvbFdpZHRoKCkKLXsKLSAgICBMZW5ndGggdyA9IHN0eWxlKCktPndpZHRoKCk7Ci0gICAg
aWYgKGNvbFNwYW4oKSA+IDEgfHwgIXcuaXNBdXRvKCkpCi0gICAgICAgIHJldHVybiB3OwotICAg
IFJlbmRlclRhYmxlQ29sKiBjb2wgPSB0YWJsZSgpLT5jb2xFbGVtZW50KF9jb2wpOwotICAgIGlm
IChjb2wpCi0gICAgICAgIHcgPSBjb2wtPnN0eWxlKCktPndpZHRoKCk7Ci0gICAgcmV0dXJuIHc7
Ci19Ci0KLXZvaWQgUmVuZGVyVGFibGVDZWxsOjpjYWxjTWluTWF4V2lkdGgoKQotewotICAgIFJl
bmRlckJsb2NrOjpjYWxjTWluTWF4V2lkdGgoKTsKLSAgICBpZiAoZWxlbWVudCgpICYmIHN0eWxl
KCktPmF1dG9XcmFwKCkpIHsKLSAgICAgICAgLy8gU2VlIGlmIG5vd3JhcCB3YXMgc2V0LgotICAg
ICAgICBMZW5ndGggdyA9IHN0eWxlT3JDb2xXaWR0aCgpOwotICAgICAgICBET01TdHJpbmcgbm93
cmFwID0gc3RhdGljX2Nhc3Q8RWxlbWVudEltcGwqPihlbGVtZW50KCkpLT5nZXRBdHRyaWJ1dGUo
bm93cmFwQXR0cik7Ci0gICAgICAgIGlmICghbm93cmFwLmlzTnVsbCgpICYmIHcuaXNGaXhlZCgp
KQotICAgICAgICAgICAgLy8gTm93cmFwIGlzIHNldCwgYnV0IHdlIGRpZG4ndCBhY3R1YWxseSB1
c2UgaXQgYmVjYXVzZSBvZiB0aGUKLSAgICAgICAgICAgIC8vIGZpeGVkIHdpZHRoIHNldCBvbiB0
aGUgY2VsbC4gIEV2ZW4gc28sIGl0IGlzIGEgV2luSUUvTW96IHRyYWl0Ci0gICAgICAgICAgICAv
LyB0byBtYWtlIHRoZSBtaW53aWR0aCBvZiB0aGUgY2VsbCBpbnRvIHRoZSBmaXhlZCB3aWR0aC4g
IFRoZXkgZG8gdGhpcwotICAgICAgICAgICAgLy8gZXZlbiBpbiBzdHJpY3QgbW9kZSwgc28gZG8g
bm90IG1ha2UgdGhpcyBhIHF1aXJrLiAgQWZmZWN0ZWQgdGhlIHRvcAotICAgICAgICAgICAgLy8g
b2YgaGlwdG9wLmNvbS4KLSAgICAgICAgICAgIGlmIChtX21pbldpZHRoIDwgdy52YWx1ZSkKLSAg
ICAgICAgICAgICAgICBtX21pbldpZHRoID0gdy52YWx1ZTsKLSAgICB9Ci19Ci0KLXZvaWQgUmVu
ZGVyVGFibGVDZWxsOjpjYWxjV2lkdGgoKQotewotfQotCi12b2lkIFJlbmRlclRhYmxlQ2VsbDo6
c2V0V2lkdGgoaW50IHdpZHRoKQotewotICAgIGlmICh3aWR0aCAhPSBtX3dpZHRoKSB7Ci0JbV93
aWR0aCA9IHdpZHRoOwotCW1fd2lkdGhDaGFuZ2VkID0gdHJ1ZTsKLSAgICB9Ci19Ci0KLXZvaWQg
UmVuZGVyVGFibGVDZWxsOjpsYXlvdXQoKQotewotICAgIGxheW91dEJsb2NrKG1fd2lkdGhDaGFu
Z2VkKTsKLSAgICBtX3dpZHRoQ2hhbmdlZCA9IGZhbHNlOwotfQotCi12b2lkIFJlbmRlclRhYmxl
Q2VsbDo6Y29tcHV0ZUFic29sdXRlUmVwYWludFJlY3QoSW50UmVjdCYgciwgYm9vbCBmKQotewot
ICAgIHIuc2V0WShyLnkoKSArIF90b3BFeHRyYSk7Ci0gICAgUmVuZGVyQmxvY2s6OmNvbXB1dGVB
YnNvbHV0ZVJlcGFpbnRSZWN0KHIsIGYpOwotfQotCi1ib29sIFJlbmRlclRhYmxlQ2VsbDo6YWJz
b2x1dGVQb3NpdGlvbihpbnQgJnhQb3MsIGludCAmeVBvcywgYm9vbCBmKQotewotICAgIGJvb2wg
cmV0ID0gUmVuZGVyQmxvY2s6OmFic29sdXRlUG9zaXRpb24oeFBvcywgeVBvcywgZik7Ci0gICAg
aWYgKHJldCkKLSAgICAgIHlQb3MgKz0gX3RvcEV4dHJhOwotICAgIHJldHVybiByZXQ7Ci19Ci0K
LXNob3J0IFJlbmRlclRhYmxlQ2VsbDo6YmFzZWxpbmVQb3NpdGlvbihib29sKSBjb25zdAotewot
ICAgIFJlbmRlck9iamVjdCogbyA9IGZpcnN0Q2hpbGQoKTsKLSAgICBpbnQgb2Zmc2V0ID0gcGFk
ZGluZ1RvcCgpICsgYm9yZGVyVG9wKCk7Ci0gICAgCi0gICAgaWYgKCFvKQotICAgICAgICByZXR1
cm4gb2Zmc2V0ICsgY29udGVudEhlaWdodCgpOwotICAgIHdoaWxlIChvLT5maXJzdENoaWxkKCkp
IHsKLQlpZiAoIW8tPmlzSW5saW5lKCkpCi0JICAgIG9mZnNldCArPSBvLT5wYWRkaW5nVG9wKCkg
KyBvLT5ib3JkZXJUb3AoKTsKLQlvID0gby0+Zmlyc3RDaGlsZCgpOwotICAgIH0KLSAgICAKLSAg
ICBpZiAoIW8tPmlzSW5saW5lKCkpCi0gICAgICAgIHJldHVybiBwYWRkaW5nVG9wKCkgKyBib3Jk
ZXJUb3AoKSArIGNvbnRlbnRIZWlnaHQoKTsKLQotICAgIG9mZnNldCArPSBvLT5iYXNlbGluZVBv
c2l0aW9uKHRydWUpOwotICAgIHJldHVybiBvZmZzZXQ7Ci19Ci0KLQotdm9pZCBSZW5kZXJUYWJs
ZUNlbGw6OnNldFN0eWxlKFJlbmRlclN0eWxlICpzdHlsZSkKLXsKLSAgICBzdHlsZS0+c2V0RGlz
cGxheShUQUJMRV9DRUxMKTsKLQotICAgIGlmIChzdHlsZS0+d2hpdGVTcGFjZSgpID09IEtIVE1M
X05PV1JBUCkgewotICAgICAgICAvLyBGaWd1cmUgb3V0IGlmIHdlIGFyZSByZWFsbHkgbm93cmFw
cGluZyBvciBpZiB3ZSBzaG91bGQganVzdAotICAgICAgICAvLyB1c2Ugbm9ybWFsIGluc3RlYWQu
ICBJZiB0aGUgd2lkdGggb2YgdGhlIGNlbGwgaXMgZml4ZWQsIHRoZW4KLSAgICAgICAgLy8gd2Ug
ZG9uJ3QgYWN0dWFsbHkgdXNlIE5PV1JBUC4gCi0gICAgICAgIGlmIChzdHlsZS0+d2lkdGgoKS5p
c0ZpeGVkKCkpCi0gICAgICAgICAgICBzdHlsZS0+c2V0V2hpdGVTcGFjZShOT1JNQUwpOwotICAg
ICAgICBlbHNlCi0gICAgICAgICAgICBzdHlsZS0+c2V0V2hpdGVTcGFjZShOT1dSQVApOwotICAg
IH0KLQotICAgIFJlbmRlckJsb2NrOjpzZXRTdHlsZShzdHlsZSk7Ci0gICAgc2V0U2hvdWxkUGFp
bnRCYWNrZ3JvdW5kT3JCb3JkZXIodHJ1ZSk7Ci19Ci0KLWJvb2wgUmVuZGVyVGFibGVDZWxsOjpy
ZXF1aXJlc0xheWVyKCkgewotICAgIHJldHVybiBpc1Bvc2l0aW9uZWQoKSB8fCBzdHlsZSgpLT5v
cGFjaXR5KCkgPCAxLjBmIHx8IGhhc092ZXJmbG93Q2xpcCgpOwotfQotCi0vLyBUaGUgZm9sbG93
aW5nIHJ1bGVzIGFwcGx5IGZvciByZXNvbHZpbmcgY29uZmxpY3RzIGFuZCBmaWd1cmluZyBvdXQg
d2hpY2ggYm9yZGVyCi0vLyB0byB1c2UuCi0vLyAoMSkgQm9yZGVycyB3aXRoIHRoZSAnYm9yZGVy
LXN0eWxlJyBvZiAnaGlkZGVuJyB0YWtlIHByZWNlZGVuY2Ugb3ZlciBhbGwgb3RoZXIgY29uZmxp
Y3RpbmcgCi0vLyBib3JkZXJzLiBBbnkgYm9yZGVyIHdpdGggdGhpcyB2YWx1ZSBzdXBwcmVzc2Vz
IGFsbCBib3JkZXJzIGF0IHRoaXMgbG9jYXRpb24uCi0vLyAoMikgQm9yZGVycyB3aXRoIGEgc3R5
bGUgb2YgJ25vbmUnIGhhdmUgdGhlIGxvd2VzdCBwcmlvcml0eS4gT25seSBpZiB0aGUgYm9yZGVy
IHByb3BlcnRpZXMgb2YgYWxsIAotLy8gdGhlIGVsZW1lbnRzIG1lZXRpbmcgYXQgdGhpcyBlZGdl
IGFyZSAnbm9uZScgd2lsbCB0aGUgYm9yZGVyIGJlIG9taXR0ZWQgKGJ1dCBub3RlIHRoYXQgJ25v
bmUnIGlzIAotLy8gdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBib3JkZXIgc3R5bGUuKQotLy8g
KDMpIElmIG5vbmUgb2YgdGhlIHN0eWxlcyBhcmUgJ2hpZGRlbicgYW5kIGF0IGxlYXN0IG9uZSBv
ZiB0aGVtIGlzIG5vdCAnbm9uZScsIHRoZW4gbmFycm93IGJvcmRlcnMgCi0vLyBhcmUgZGlzY2Fy
ZGVkIGluIGZhdm9yIG9mIHdpZGVyIG9uZXMuIElmIHNldmVyYWwgaGF2ZSB0aGUgc2FtZSAnYm9y
ZGVyLXdpZHRoJyB0aGVuIHN0eWxlcyBhcmUgcHJlZmVycmVkIAotLy8gaW4gdGhpcyBvcmRlcjog
J2RvdWJsZScsICdzb2xpZCcsICdkYXNoZWQnLCAnZG90dGVkJywgJ3JpZGdlJywgJ291dHNldCcs
ICdncm9vdmUnLCBhbmQgdGhlIGxvd2VzdDogJ2luc2V0Jy4KLS8vICg0KSBJZiBib3JkZXIgc3R5
bGVzIGRpZmZlciBvbmx5IGluIGNvbG9yLCB0aGVuIGEgc3R5bGUgc2V0IG9uIGEgY2VsbCB3aW5z
IG92ZXIgb25lIG9uIGEgcm93LCAKLS8vIHdoaWNoIHdpbnMgb3ZlciBhIHJvdyBncm91cCwgY29s
dW1uLCBjb2x1bW4gZ3JvdXAgYW5kLCBsYXN0bHksIHRhYmxlLiBJdCBpcyB1bmRlZmluZWQgd2hp
Y2ggY29sb3IgCi0vLyBpcyB1c2VkIHdoZW4gdHdvIGVsZW1lbnRzIG9mIHRoZSBzYW1lIHR5cGUg
ZGlzYWdyZWUuCi1zdGF0aWMgQ29sbGFwc2VkQm9yZGVyVmFsdWUgY29tcGFyZUJvcmRlcnMoY29u
c3QgQ29sbGFwc2VkQm9yZGVyVmFsdWUmIGJvcmRlcjEsIAotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbGxhcHNlZEJvcmRlclZhbHVlJiBib3JkZXIy
KQotewotICAgIC8vIFNhbml0eSBjaGVjayB0aGUgdmFsdWVzIHBhc3NlZCBpbi4gIElmIGVpdGhl
ciBpcyBudWxsLCByZXR1cm4gdGhlIG90aGVyLgotICAgIGlmICghYm9yZGVyMi5leGlzdHMoKSkg
cmV0dXJuIGJvcmRlcjE7Ci0gICAgaWYgKCFib3JkZXIxLmV4aXN0cygpKSByZXR1cm4gYm9yZGVy
MjsKLSAgICAKLSAgICAvLyBSdWxlICMxIGFib3ZlLgotICAgIGlmIChib3JkZXIxLnN0eWxlKCkg
PT0gQkhJRERFTiB8fCBib3JkZXIyLnN0eWxlKCkgPT0gQkhJRERFTikKLSAgICAgICAgcmV0dXJu
IENvbGxhcHNlZEJvcmRlclZhbHVlKCk7IC8vIE5vIGJvcmRlciBzaG91bGQgZXhpc3QgYXQgdGhp
cyBsb2NhdGlvbi4KLSAgICAKLSAgICAvLyBSdWxlICMyIGFib3ZlLiAgQSBzdHlsZSBvZiAnbm9u
ZScgaGFzIGxvd2VzdCBwcmlvcml0eSBhbmQgYWx3YXlzIGxvc2VzIHRvIGFueSBvdGhlciBib3Jk
ZXIuCi0gICAgaWYgKGJvcmRlcjIuc3R5bGUoKSA9PSBCTk9ORSkgcmV0dXJuIGJvcmRlcjE7Ci0g
ICAgaWYgKGJvcmRlcjEuc3R5bGUoKSA9PSBCTk9ORSkgcmV0dXJuIGJvcmRlcjI7Ci0gICAgCi0g
ICAgLy8gVGhlIGZpcnN0IHBhcnQgb2YgcnVsZSAjMyBhYm92ZS4gV2lkZXIgYm9yZGVycyB3aW4u
Ci0gICAgaWYgKGJvcmRlcjEud2lkdGgoKSAhPSBib3JkZXIyLndpZHRoKCkpCi0gICAgICAgIHJl
dHVybiBib3JkZXIxLndpZHRoKCkgPiBib3JkZXIyLndpZHRoKCkgPyBib3JkZXIxIDogYm9yZGVy
MjsKLSAgICAKLSAgICAvLyBUaGUgYm9yZGVycyBoYXZlIGVxdWFsIHdpZHRoLiAgU29ydCBieSBi
b3JkZXIgc3R5bGUuCi0gICAgaWYgKGJvcmRlcjEuc3R5bGUoKSAhPSBib3JkZXIyLnN0eWxlKCkp
Ci0gICAgICAgIHJldHVybiBib3JkZXIxLnN0eWxlKCkgPiBib3JkZXIyLnN0eWxlKCkgPyBib3Jk
ZXIxIDogYm9yZGVyMjsKLSAgICAKLSAgICAvLyBUaGUgYm9yZGVyIGhhdmUgdGhlIHNhbWUgd2lk
dGggYW5kIHN0eWxlLiAgUmVseSBvbiBwcmVjZWRlbmNlIChjZWxsIG92ZXIgcm93IG92ZXIgcm93
IGdyb3VwLCBldGMuKQotICAgIHJldHVybiBib3JkZXIxLnByZWNlZGVuY2UgPj0gYm9yZGVyMi5w
cmVjZWRlbmNlID8gYm9yZGVyMSA6IGJvcmRlcjI7Ci19Ci0KLUNvbGxhcHNlZEJvcmRlclZhbHVl
IFJlbmRlclRhYmxlQ2VsbDo6Y29sbGFwc2VkTGVmdEJvcmRlcigpIGNvbnN0Ci17Ci0gICAgLy8g
Rm9yIGJvcmRlciBsZWZ0LCB3ZSBuZWVkIHRvIGNoZWNrLCBpbiBvcmRlciBvZiBwcmVjZWRlbmNl
OgotICAgIC8vICgxKSBPdXIgbGVmdCBib3JkZXIuCi0gICAgQ29sbGFwc2VkQm9yZGVyVmFsdWUg
cmVzdWx0KCZzdHlsZSgpLT5ib3JkZXJMZWZ0KCksIEJDRUxMKTsKLSAgICAKLSAgICAvLyAoMikg
VGhlIHByZXZpb3VzIGNlbGwncyByaWdodCBib3JkZXIuCi0gICAgUmVuZGVyVGFibGVDZWxsKiBw
cmV2Q2VsbCA9IHRhYmxlKCktPmNlbGxMZWZ0KHRoaXMpOwotICAgIGlmIChwcmV2Q2VsbCkgewot
ICAgICAgICByZXN1bHQgPSBjb21wYXJlQm9yZGVycyhyZXN1bHQsIENvbGxhcHNlZEJvcmRlclZh
bHVlKCZwcmV2Q2VsbC0+c3R5bGUoKS0+Ym9yZGVyUmlnaHQoKSwgQkNFTEwpKTsKLSAgICAgICAg
aWYgKCFyZXN1bHQuZXhpc3RzKCkpCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0K
LSAgICBlbHNlIGlmIChjb2woKSA9PSAwKSB7Ci0gICAgICAgIC8vICgzKSBPdXIgcm93J3MgbGVm
dCBib3JkZXIuCi0gICAgICAgIHJlc3VsdCA9IGNvbXBhcmVCb3JkZXJzKHJlc3VsdCwgQ29sbGFw
c2VkQm9yZGVyVmFsdWUoJnBhcmVudCgpLT5zdHlsZSgpLT5ib3JkZXJMZWZ0KCksIEJST1cpKTsK
LSAgICAgICAgaWYgKCFyZXN1bHQuZXhpc3RzKCkpCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0
OwotICAgICAgICAKLSAgICAgICAgLy8gKDQpIE91ciByb3cgZ3JvdXAncyBsZWZ0IGJvcmRlci4K
LSAgICAgICAgcmVzdWx0ID0gY29tcGFyZUJvcmRlcnMocmVzdWx0LCBDb2xsYXBzZWRCb3JkZXJW
YWx1ZSgmc2VjdGlvbigpLT5zdHlsZSgpLT5ib3JkZXJMZWZ0KCksIEJST1dHUk9VUCkpOwotICAg
ICAgICBpZiAoIXJlc3VsdC5leGlzdHMoKSkKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0g
ICAgfQotICAgIAotICAgIC8vICg1KSBPdXIgY29sdW1uJ3MgbGVmdCBib3JkZXIuCi0gICAgUmVu
ZGVyVGFibGVDb2wqIGNvbEVsdCA9IHRhYmxlKCktPmNvbEVsZW1lbnQoY29sKCkpOwotICAgIGlm
IChjb2xFbHQpIHsKLSAgICAgICAgcmVzdWx0ID0gY29tcGFyZUJvcmRlcnMocmVzdWx0LCBDb2xs
YXBzZWRCb3JkZXJWYWx1ZSgmY29sRWx0LT5zdHlsZSgpLT5ib3JkZXJMZWZ0KCksIEJDT0wpKTsK
LSAgICAgICAgaWYgKCFyZXN1bHQuZXhpc3RzKCkpCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0
OwotICAgIH0KLSAgICAKLSAgICAvLyAoNikgVGhlIHByZXZpb3VzIGNvbHVtbidzIHJpZ2h0IGJv
cmRlci4KLSAgICBpZiAoY29sKCkgPiAwKSB7Ci0gICAgICAgIGNvbEVsdCA9IHRhYmxlKCktPmNv
bEVsZW1lbnQoY29sKCkgLSAxKTsKLSAgICAgICAgaWYgKGNvbEVsdCkgewotICAgICAgICAgICAg
cmVzdWx0ID0gY29tcGFyZUJvcmRlcnMocmVzdWx0LCBDb2xsYXBzZWRCb3JkZXJWYWx1ZSgmY29s
RWx0LT5zdHlsZSgpLT5ib3JkZXJSaWdodCgpLCBCQ09MKSk7Ci0gICAgICAgICAgICBpZiAoIXJl
c3VsdC5leGlzdHMoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9
Ci0gICAgfQotICAgIAotICAgIGlmIChjb2woKSA9PSAwKSB7Ci0gICAgICAgIC8vICg3KSBUaGUg
dGFibGUncyBsZWZ0IGJvcmRlci4KLSAgICAgICAgcmVzdWx0ID0gY29tcGFyZUJvcmRlcnMocmVz
dWx0LCBDb2xsYXBzZWRCb3JkZXJWYWx1ZSgmdGFibGUoKS0+c3R5bGUoKS0+Ym9yZGVyTGVmdCgp
LCBCVEFCTEUpKTsKLSAgICAgICAgaWYgKCFyZXN1bHQuZXhpc3RzKCkpCi0gICAgICAgICAgICBy
ZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1Db2xs
YXBzZWRCb3JkZXJWYWx1ZSBSZW5kZXJUYWJsZUNlbGw6OmNvbGxhcHNlZFJpZ2h0Qm9yZGVyKCkg
Y29uc3QKLXsKLSAgICBSZW5kZXJUYWJsZSogdGFibGVFbHQgPSB0YWJsZSgpOwotICAgIGJvb2wg
aW5MYXN0Q29sdW1uID0gZmFsc2U7Ci0gICAgaW50IGVmZkNvbCA9IHRhYmxlRWx0LT5jb2xUb0Vm
ZkNvbChjb2woKSArIGNvbFNwYW4oKSAtIDEpOwotICAgIGlmIChlZmZDb2wgPT0gdGFibGVFbHQt
Pm51bUVmZkNvbHMoKSAtIDEpCi0gICAgICAgIGluTGFzdENvbHVtbiA9IHRydWU7Ci0gICAgCi0g
ICAgLy8gRm9yIGJvcmRlciByaWdodCwgd2UgbmVlZCB0byBjaGVjaywgaW4gb3JkZXIgb2YgcHJl
Y2VkZW5jZToKLSAgICAvLyAoMSkgT3VyIHJpZ2h0IGJvcmRlci4KLSAgICBDb2xsYXBzZWRCb3Jk
ZXJWYWx1ZSByZXN1bHQgPSBDb2xsYXBzZWRCb3JkZXJWYWx1ZSgmc3R5bGUoKS0+Ym9yZGVyUmln
aHQoKSwgQkNFTEwpOwotICAgIAotICAgIC8vICgyKSBUaGUgbmV4dCBjZWxsJ3MgbGVmdCBib3Jk
ZXIuCi0gICAgaWYgKCFpbkxhc3RDb2x1bW4pIHsKLSAgICAgICAgUmVuZGVyVGFibGVDZWxsKiBu
ZXh0Q2VsbCA9IHRhYmxlRWx0LT5jZWxsUmlnaHQodGhpcyk7Ci0gICAgICAgIGlmIChuZXh0Q2Vs
bCAmJiBuZXh0Q2VsbC0+c3R5bGUoKSkgewotICAgICAgICAgICAgcmVzdWx0ID0gY29tcGFyZUJv
cmRlcnMocmVzdWx0LCBDb2xsYXBzZWRCb3JkZXJWYWx1ZSgmbmV4dENlbGwtPnN0eWxlKCktPmJv
cmRlckxlZnQoKSwgQkNFTEwpKTsKLSAgICAgICAgICAgIGlmICghcmVzdWx0LmV4aXN0cygpKQot
ICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICB9IGVsc2Ugewot
ICAgICAgICAvLyAoMykgT3VyIHJvdydzIHJpZ2h0IGJvcmRlci4KLSAgICAgICAgcmVzdWx0ID0g
Y29tcGFyZUJvcmRlcnMocmVzdWx0LCBDb2xsYXBzZWRCb3JkZXJWYWx1ZSgmcGFyZW50KCktPnN0
eWxlKCktPmJvcmRlclJpZ2h0KCksIEJST1cpKTsKLSAgICAgICAgaWYgKCFyZXN1bHQuZXhpc3Rz
KCkpCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAKLSAgICAgICAgLy8gKDQp
IE91ciByb3cgZ3JvdXAncyByaWdodCBib3JkZXIuCi0gICAgICAgIHJlc3VsdCA9IGNvbXBhcmVC
b3JkZXJzKHJlc3VsdCwgQ29sbGFwc2VkQm9yZGVyVmFsdWUoJnNlY3Rpb24oKS0+c3R5bGUoKS0+
Ym9yZGVyUmlnaHQoKSwgQlJPV0dST1VQKSk7Ci0gICAgICAgIGlmICghcmVzdWx0LmV4aXN0cygp
KQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgCi0gICAgLy8gKDUpIE91
ciBjb2x1bW4ncyByaWdodCBib3JkZXIuCi0gICAgUmVuZGVyVGFibGVDb2wqIGNvbEVsdCA9IHRh
YmxlKCktPmNvbEVsZW1lbnQoY29sKCkrY29sU3BhbigpIC0gMSk7Ci0gICAgaWYgKGNvbEVsdCkg
ewotICAgICAgICByZXN1bHQgPSBjb21wYXJlQm9yZGVycyhyZXN1bHQsIENvbGxhcHNlZEJvcmRl
clZhbHVlKCZjb2xFbHQtPnN0eWxlKCktPmJvcmRlclJpZ2h0KCksIEJDT0wpKTsKLSAgICAgICAg
aWYgKCFyZXN1bHQuZXhpc3RzKCkpCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0K
LSAgICAKLSAgICAvLyAoNikgVGhlIG5leHQgY29sdW1uJ3MgbGVmdCBib3JkZXIuCi0gICAgaWYg
KCFpbkxhc3RDb2x1bW4pIHsKLSAgICAgICAgY29sRWx0ID0gdGFibGVFbHQtPmNvbEVsZW1lbnQo
Y29sKCkrY29sU3BhbigpKTsKLSAgICAgICAgaWYgKGNvbEVsdCkgewotICAgICAgICAgICAgcmVz
dWx0ID0gY29tcGFyZUJvcmRlcnMocmVzdWx0LCBDb2xsYXBzZWRCb3JkZXJWYWx1ZSgmY29sRWx0
LT5zdHlsZSgpLT5ib3JkZXJMZWZ0KCksIEJDT0wpKTsKLSAgICAgICAgICAgIGlmICghcmVzdWx0
LmV4aXN0cygpKQotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAg
ICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIC8vICg3KSBUaGUgdGFibGUncyByaWdodCBib3JkZXIu
Ci0gICAgICAgIHJlc3VsdCA9IGNvbXBhcmVCb3JkZXJzKHJlc3VsdCwgQ29sbGFwc2VkQm9yZGVy
VmFsdWUoJnRhYmxlRWx0LT5zdHlsZSgpLT5ib3JkZXJSaWdodCgpLCBCVEFCTEUpKTsKLSAgICAg
ICAgaWYgKCFyZXN1bHQuZXhpc3RzKCkpCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAg
IH0KLSAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1Db2xsYXBzZWRCb3JkZXJWYWx1ZSBS
ZW5kZXJUYWJsZUNlbGw6OmNvbGxhcHNlZFRvcEJvcmRlcigpIGNvbnN0Ci17Ci0gICAgLy8gRm9y
IGJvcmRlciB0b3AsIHdlIG5lZWQgdG8gY2hlY2ssIGluIG9yZGVyIG9mIHByZWNlZGVuY2U6Ci0g
ICAgLy8gKDEpIE91ciB0b3AgYm9yZGVyLgotICAgIENvbGxhcHNlZEJvcmRlclZhbHVlIHJlc3Vs
dCA9IENvbGxhcHNlZEJvcmRlclZhbHVlKCZzdHlsZSgpLT5ib3JkZXJUb3AoKSwgQkNFTEwpOwot
ICAgIAotICAgIFJlbmRlclRhYmxlQ2VsbCogcHJldkNlbGwgPSB0YWJsZSgpLT5jZWxsQWJvdmUo
dGhpcyk7Ci0gICAgaWYgKHByZXZDZWxsKSB7Ci0gICAgICAgIC8vICgyKSBBIHByZXZpb3VzIGNl
bGwncyBib3R0b20gYm9yZGVyLgotICAgICAgICByZXN1bHQgPSBjb21wYXJlQm9yZGVycyhyZXN1
bHQsIENvbGxhcHNlZEJvcmRlclZhbHVlKCZwcmV2Q2VsbC0+c3R5bGUoKS0+Ym9yZGVyQm90dG9t
KCksIEJDRUxMKSk7Ci0gICAgICAgIGlmICghcmVzdWx0LmV4aXN0cygpKSAKLSAgICAgICAgICAg
IHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIAotICAgIC8vICgzKSBPdXIgcm93J3MgdG9wIGJv
cmRlci4KLSAgICByZXN1bHQgPSBjb21wYXJlQm9yZGVycyhyZXN1bHQsIENvbGxhcHNlZEJvcmRl
clZhbHVlKCZwYXJlbnQoKS0+c3R5bGUoKS0+Ym9yZGVyVG9wKCksIEJST1cpKTsKLSAgICBpZiAo
IXJlc3VsdC5leGlzdHMoKSkKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAKLSAgICAvLyAo
NCkgVGhlIHByZXZpb3VzIHJvdydzIGJvdHRvbSBib3JkZXIuCi0gICAgaWYgKHByZXZDZWxsKSB7
Ci0gICAgICAgIFJlbmRlck9iamVjdCogcHJldlJvdyA9IDA7Ci0gICAgICAgIGlmIChwcmV2Q2Vs
bC0+c2VjdGlvbigpID09IHNlY3Rpb24oKSkKLSAgICAgICAgICAgIHByZXZSb3cgPSBwYXJlbnQo
KS0+cHJldmlvdXNTaWJsaW5nKCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHByZXZSb3cg
PSBwcmV2Q2VsbC0+c2VjdGlvbigpLT5sYXN0Q2hpbGQoKTsKLSAgICAKLSAgICAgICAgaWYgKHBy
ZXZSb3cpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGNvbXBhcmVCb3JkZXJzKHJlc3VsdCwgQ29s
bGFwc2VkQm9yZGVyVmFsdWUoJnByZXZSb3ctPnN0eWxlKCktPmJvcmRlckJvdHRvbSgpLCBCUk9X
KSk7Ci0gICAgICAgICAgICBpZiAoIXJlc3VsdC5leGlzdHMoKSkKLSAgICAgICAgICAgICAgICBy
ZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8vIE5vdyBjaGVjayBy
b3cgZ3JvdXBzLgotICAgIFJlbmRlck9iamVjdCogY3VyclNlY3Rpb24gPSBwYXJlbnQoKS0+cGFy
ZW50KCk7Ci0gICAgaWYgKHJvdygpID09IDApIHsKLSAgICAgICAgLy8gKDUpIE91ciByb3cgZ3Jv
dXAncyB0b3AgYm9yZGVyLgotICAgICAgICByZXN1bHQgPSBjb21wYXJlQm9yZGVycyhyZXN1bHQs
IENvbGxhcHNlZEJvcmRlclZhbHVlKCZjdXJyU2VjdGlvbi0+c3R5bGUoKS0+Ym9yZGVyVG9wKCks
IEJST1dHUk9VUCkpOwotICAgICAgICBpZiAoIXJlc3VsdC5leGlzdHMoKSkKLSAgICAgICAgICAg
IHJldHVybiByZXN1bHQ7Ci0gICAgICAgIAotICAgICAgICAvLyAoNikgUHJldmlvdXMgcm93IGdy
b3VwJ3MgYm90dG9tIGJvcmRlci4KLSAgICAgICAgZm9yIChjdXJyU2VjdGlvbiA9IGN1cnJTZWN0
aW9uLT5wcmV2aW91c1NpYmxpbmcoKTsgY3VyclNlY3Rpb247Ci0gICAgICAgICAgICAgY3VyclNl
Y3Rpb24gPSBjdXJyU2VjdGlvbi0+cHJldmlvdXNTaWJsaW5nKCkpIHsKLSAgICAgICAgICAgIGlm
IChjdXJyU2VjdGlvbi0+aXNUYWJsZVNlY3Rpb24oKSkgewotICAgICAgICAgICAgICAgIFJlbmRl
clRhYmxlU2VjdGlvbiogc2VjdGlvbiA9IHN0YXRpY19jYXN0PFJlbmRlclRhYmxlU2VjdGlvbio+
KGN1cnJTZWN0aW9uKTsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBjb21wYXJlQm9yZGVycyhy
ZXN1bHQsIENvbGxhcHNlZEJvcmRlclZhbHVlKCZzZWN0aW9uLT5zdHlsZSgpLT5ib3JkZXJCb3R0
b20oKSwgQlJPV0dST1VQKSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQuZXhpc3RzKCkp
Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAg
ICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaWYgKCFjdXJyU2VjdGlvbikgewotICAgICAgICAvLyAo
OCkgT3VyIGNvbHVtbidzIHRvcCBib3JkZXIuCi0gICAgICAgIFJlbmRlclRhYmxlQ29sKiBjb2xF
bHQgPSB0YWJsZSgpLT5jb2xFbGVtZW50KGNvbCgpKTsKLSAgICAgICAgaWYgKGNvbEVsdCkgewot
ICAgICAgICAgICAgcmVzdWx0ID0gY29tcGFyZUJvcmRlcnMocmVzdWx0LCBDb2xsYXBzZWRCb3Jk
ZXJWYWx1ZSgmY29sRWx0LT5zdHlsZSgpLT5ib3JkZXJUb3AoKSwgQkNPTCkpOwotICAgICAgICAg
ICAgaWYgKCFyZXN1bHQuZXhpc3RzKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsK
LSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gKDkpIFRoZSB0YWJsZSdzIHRvcCBib3Jk
ZXIuCi0gICAgICAgIHJlc3VsdCA9IGNvbXBhcmVCb3JkZXJzKHJlc3VsdCwgQ29sbGFwc2VkQm9y
ZGVyVmFsdWUoJnRhYmxlKCktPnN0eWxlKCktPmJvcmRlclRvcCgpLCBCVEFCTEUpKTsKLSAgICAg
ICAgaWYgKCFyZXN1bHQuZXhpc3RzKCkpCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAg
IH0KLSAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1Db2xsYXBzZWRCb3JkZXJWYWx1ZSBS
ZW5kZXJUYWJsZUNlbGw6OmNvbGxhcHNlZEJvdHRvbUJvcmRlcigpIGNvbnN0Ci17Ci0gICAgLy8g
Rm9yIGJvcmRlciB0b3AsIHdlIG5lZWQgdG8gY2hlY2ssIGluIG9yZGVyIG9mIHByZWNlZGVuY2U6
Ci0gICAgLy8gKDEpIE91ciBib3R0b20gYm9yZGVyLgotICAgIENvbGxhcHNlZEJvcmRlclZhbHVl
IHJlc3VsdCA9IENvbGxhcHNlZEJvcmRlclZhbHVlKCZzdHlsZSgpLT5ib3JkZXJCb3R0b20oKSwg
QkNFTEwpOwotICAgIAotICAgIFJlbmRlclRhYmxlQ2VsbCogbmV4dENlbGwgPSB0YWJsZSgpLT5j
ZWxsQmVsb3codGhpcyk7Ci0gICAgaWYgKG5leHRDZWxsKSB7Ci0gICAgICAgIC8vICgyKSBBIGZv
bGxvd2luZyBjZWxsJ3MgdG9wIGJvcmRlci4KLSAgICAgICAgcmVzdWx0ID0gY29tcGFyZUJvcmRl
cnMocmVzdWx0LCBDb2xsYXBzZWRCb3JkZXJWYWx1ZSgmbmV4dENlbGwtPnN0eWxlKCktPmJvcmRl
clRvcCgpLCBCQ0VMTCkpOwotICAgICAgICBpZiAoIXJlc3VsdC5leGlzdHMoKSkKLSAgICAgICAg
ICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIAotICAgIC8vICgzKSBPdXIgcm93J3MgYm90
dG9tIGJvcmRlci4gKEZJWE1FOiBEZWFsIHdpdGggcm93c3BhbiEpCi0gICAgcmVzdWx0ID0gY29t
cGFyZUJvcmRlcnMocmVzdWx0LCBDb2xsYXBzZWRCb3JkZXJWYWx1ZSgmcGFyZW50KCktPnN0eWxl
KCktPmJvcmRlckJvdHRvbSgpLCBCUk9XKSk7Ci0gICAgaWYgKCFyZXN1bHQuZXhpc3RzKCkpCi0g
ICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgCi0gICAgLy8gKDQpIFRoZSBuZXh0IHJvdydzIHRv
cCBib3JkZXIuCi0gICAgaWYgKG5leHRDZWxsKSB7Ci0gICAgICAgIHJlc3VsdCA9IGNvbXBhcmVC
b3JkZXJzKHJlc3VsdCwgQ29sbGFwc2VkQm9yZGVyVmFsdWUoJm5leHRDZWxsLT5wYXJlbnQoKS0+
c3R5bGUoKS0+Ym9yZGVyVG9wKCksIEJST1cpKTsKLSAgICAgICAgaWYgKCFyZXN1bHQuZXhpc3Rz
KCkpCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICAKLSAgICAvLyBOb3cg
Y2hlY2sgcm93IGdyb3Vwcy4KLSAgICBSZW5kZXJPYmplY3QqIGN1cnJTZWN0aW9uID0gcGFyZW50
KCktPnBhcmVudCgpOwotICAgIGlmIChyb3coKSArIHJvd1NwYW4oKSA+PSBzdGF0aWNfY2FzdDxS
ZW5kZXJUYWJsZVNlY3Rpb24qPihjdXJyU2VjdGlvbiktPm51bVJvd3MoKSkgewotICAgICAgICAv
LyAoNSkgT3VyIHJvdyBncm91cCdzIGJvdHRvbSBib3JkZXIuCi0gICAgICAgIHJlc3VsdCA9IGNv
bXBhcmVCb3JkZXJzKHJlc3VsdCwgQ29sbGFwc2VkQm9yZGVyVmFsdWUoJmN1cnJTZWN0aW9uLT5z
dHlsZSgpLT5ib3JkZXJCb3R0b20oKSwgQlJPV0dST1VQKSk7Ci0gICAgICAgIGlmICghcmVzdWx0
LmV4aXN0cygpKQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgCi0gICAgICAg
IC8vICg2KSBGb2xsb3dpbmcgcm93IGdyb3VwJ3MgdG9wIGJvcmRlci4KLSAgICAgICAgZm9yIChj
dXJyU2VjdGlvbiA9IGN1cnJTZWN0aW9uLT5uZXh0U2libGluZygpOyBjdXJyU2VjdGlvbjsKLSAg
ICAgICAgICAgICBjdXJyU2VjdGlvbiA9IGN1cnJTZWN0aW9uLT5uZXh0U2libGluZygpKSB7Ci0g
ICAgICAgICAgICBpZiAoY3VyclNlY3Rpb24tPmlzVGFibGVTZWN0aW9uKCkpIHsKLSAgICAgICAg
ICAgICAgICBSZW5kZXJUYWJsZVNlY3Rpb24qIHNlY3Rpb24gPSBzdGF0aWNfY2FzdDxSZW5kZXJU
YWJsZVNlY3Rpb24qPihjdXJyU2VjdGlvbik7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gY29t
cGFyZUJvcmRlcnMocmVzdWx0LCBDb2xsYXBzZWRCb3JkZXJWYWx1ZSgmc2VjdGlvbi0+c3R5bGUo
KS0+Ym9yZGVyVG9wKCksIEJST1dHUk9VUCkpOwotICAgICAgICAgICAgICAgIGlmICghcmVzdWx0
LmV4aXN0cygpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAg
ICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIGlmICghY3VyclNlY3Rpb24pIHsKLSAg
ICAgICAgLy8gKDgpIE91ciBjb2x1bW4ncyBib3R0b20gYm9yZGVyLgotICAgICAgICBSZW5kZXJU
YWJsZUNvbCogY29sRWx0ID0gdGFibGUoKS0+Y29sRWxlbWVudChjb2woKSk7Ci0gICAgICAgIGlm
IChjb2xFbHQpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGNvbXBhcmVCb3JkZXJzKHJlc3VsdCwg
Q29sbGFwc2VkQm9yZGVyVmFsdWUoJmNvbEVsdC0+c3R5bGUoKS0+Ym9yZGVyQm90dG9tKCksIEJD
T0wpKTsKLSAgICAgICAgICAgIGlmICghcmVzdWx0LmV4aXN0cygpKSByZXR1cm4gcmVzdWx0Owot
ICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyAoOSkgVGhlIHRhYmxlJ3MgYm90dG9tIGJv
cmRlci4KLSAgICAgICAgcmVzdWx0ID0gY29tcGFyZUJvcmRlcnMocmVzdWx0LCBDb2xsYXBzZWRC
b3JkZXJWYWx1ZSgmdGFibGUoKS0+c3R5bGUoKS0+Ym9yZGVyQm90dG9tKCksIEJUQUJMRSkpOwot
ICAgICAgICBpZiAoIXJlc3VsdC5leGlzdHMoKSkKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7
Ci0gICAgfQotICAgIAotICAgIHJldHVybiByZXN1bHQ7ICAgIAotfQotCi1pbnQgUmVuZGVyVGFi
bGVDZWxsOjpib3JkZXJMZWZ0KCkgY29uc3QKLXsKLSAgICBpZiAodGFibGUoKS0+Y29sbGFwc2VC
b3JkZXJzKCkpIHsKLSAgICAgICAgQ29sbGFwc2VkQm9yZGVyVmFsdWUgYm9yZGVyID0gY29sbGFw
c2VkTGVmdEJvcmRlcigpOwotICAgICAgICBpZiAoYm9yZGVyLmV4aXN0cygpKQotICAgICAgICAg
ICAgcmV0dXJuIGludChib3JkZXIud2lkdGgoKSAvIDIuMCArIDAuNSk7IC8vIEdpdmUgdGhlIGV4
dHJhIHBpeGVsIHRvIHRvcCBhbmQgbGVmdC4KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAg
IHJldHVybiBSZW5kZXJCbG9jazo6Ym9yZGVyTGVmdCgpOwotfQotICAgIAotaW50IFJlbmRlclRh
YmxlQ2VsbDo6Ym9yZGVyUmlnaHQoKSBjb25zdAotewotICAgIGlmICh0YWJsZSgpLT5jb2xsYXBz
ZUJvcmRlcnMoKSkgewotICAgICAgICBDb2xsYXBzZWRCb3JkZXJWYWx1ZSBib3JkZXIgPSBjb2xs
YXBzZWRSaWdodEJvcmRlcigpOwotICAgICAgICBpZiAoYm9yZGVyLmV4aXN0cygpKQotICAgICAg
ICAgICAgcmV0dXJuIGJvcmRlci53aWR0aCgpIC8gMjsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAg
fQotICAgIHJldHVybiBSZW5kZXJCbG9jazo6Ym9yZGVyUmlnaHQoKTsKLX0KLQotaW50IFJlbmRl
clRhYmxlQ2VsbDo6Ym9yZGVyVG9wKCkgY29uc3QKLXsKLSAgICBpZiAodGFibGUoKS0+Y29sbGFw
c2VCb3JkZXJzKCkpIHsKLSAgICAgICAgQ29sbGFwc2VkQm9yZGVyVmFsdWUgYm9yZGVyID0gY29s
bGFwc2VkVG9wQm9yZGVyKCk7Ci0gICAgICAgIGlmIChib3JkZXIuZXhpc3RzKCkpCi0gICAgICAg
ICAgICByZXR1cm4gaW50KGJvcmRlci53aWR0aCgpIC8gMi4wICsgMC41KTsgLy8gR2l2ZSB0aGUg
ZXh0cmEgcGl4ZWwgdG8gdG9wIGFuZCBsZWZ0LgotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0g
ICAgcmV0dXJuIFJlbmRlckJsb2NrOjpib3JkZXJUb3AoKTsKLX0KLQotaW50IFJlbmRlclRhYmxl
Q2VsbDo6Ym9yZGVyQm90dG9tKCkgY29uc3QKLXsKLSAgICBpZiAodGFibGUoKS0+Y29sbGFwc2VC
b3JkZXJzKCkpIHsKLSAgICAgICAgQ29sbGFwc2VkQm9yZGVyVmFsdWUgYm9yZGVyID0gY29sbGFw
c2VkQm90dG9tQm9yZGVyKCk7Ci0gICAgICAgIGlmIChib3JkZXIuZXhpc3RzKCkpCi0gICAgICAg
ICAgICByZXR1cm4gYm9yZGVyLndpZHRoKCkgLyAyOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9
Ci0gICAgcmV0dXJuIFJlbmRlckJsb2NrOjpib3JkZXJCb3R0b20oKTsKLX0KLQotI2lmZGVmIEJP
WF9ERUJVRwotI2luY2x1ZGUgPHFwYWludGVyLmg+Ci0KLXN0YXRpYyB2b2lkIG91dGxpbmVCb3go
UVBhaW50ZXIgKnAsIGludCBfdHgsIGludCBfdHksIGludCB3LCBpbnQgaCkKLXsKLSAgICBwLT5z
ZXRQZW4oUVBlbihRQ29sb3IoInllbGxvdyIpLCAzLCBRdDo6RG90TGluZSkpOwotICAgIHAtPnNl
dEJydXNoKFF0OjpOb0JydXNoKTsKLSAgICBwLT5kcmF3UmVjdChfdHgsIF90eSwgdywgaCk7Ci19
Ci0jZW5kaWYKLQotdm9pZCBSZW5kZXJUYWJsZUNlbGw6OnBhaW50KFBhaW50SW5mbyYgaSwgaW50
IF90eCwgaW50IF90eSkKLXsKLSAgICBfdHggKz0gbV94OwotICAgIF90eSArPSBtX3k7Ci0KLSAg
ICAvLyBjaGVjayBpZiB3ZSBuZWVkIHRvIGRvIGFueXRoaW5nIGF0IGFsbC4uLgotICAgIGludCBv
cyA9IDIqbWF4aW1hbE91dGxpbmVTaXplKGkucGhhc2UpOwotICAgIGlmICgoX3R5ID49IGkuci55
KCkgKyBpLnIuaGVpZ2h0KCkgKyBvcykgfHwgKF90eSArIF90b3BFeHRyYSArIG1faGVpZ2h0ICsg
X2JvdHRvbUV4dHJhIDw9IGkuci55KCkgLSBvcykpCi0gICAgICAgIHJldHVybjsKLQotICAgIGlm
IChpLnBoYXNlID09IFBhaW50QWN0aW9uQ29sbGFwc2VkVGFibGVCb3JkZXJzICYmIHN0eWxlKCkt
PnZpc2liaWxpdHkoKSA9PSBWSVNJQkxFKSB7Ci0gICAgICAgIGludCB3ID0gd2lkdGgoKTsKLSAg
ICAgICAgaW50IGggPSBoZWlnaHQoKSArIGJvcmRlclRvcEV4dHJhKCkgKyBib3JkZXJCb3R0b21F
eHRyYSgpOwotICAgICAgICBwYWludENvbGxhcHNlZEJvcmRlcihpLnAsIF90eCwgX3R5LCB3LCBo
KTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICBSZW5kZXJCbG9jazo6cGFpbnRPYmplY3QoaSwg
X3R4LCBfdHkgKyBfdG9wRXh0cmEpOwotCi0jaWZkZWYgQk9YX0RFQlVHCi0gICAgOjpvdXRsaW5l
Qm94KCBpLnAsIF90eCwgX3R5LCB3aWR0aCgpLCBoZWlnaHQoKSArIGJvcmRlclRvcEV4dHJhKCkg
KyBib3JkZXJCb3R0b21FeHRyYSgpKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgRUJvcmRlclN0eWxl
IGNvbGxhcHNlZEJvcmRlclN0eWxlKEVCb3JkZXJTdHlsZSBzdHlsZSkKLXsKLSAgICBpZiAoc3R5
bGUgPT0gT1VUU0VUKQotICAgICAgICBzdHlsZSA9IEdST09WRTsKLSAgICBlbHNlIGlmIChzdHls
ZSA9PSBJTlNFVCkKLSAgICAgICAgc3R5bGUgPSBSSURHRTsKLSAgICByZXR1cm4gc3R5bGU7CiB9
Ci0KLXN0cnVjdCBDb2xsYXBzZWRCb3JkZXIgewotICAgIENvbGxhcHNlZEJvcmRlcigpe30KLSAg
ICAKLSAgICBDb2xsYXBzZWRCb3JkZXJWYWx1ZSBib3JkZXI7Ci0gICAgUmVuZGVyT2JqZWN0OjpC
b3JkZXJTaWRlIHNpZGU7Ci0gICAgYm9vbCBzaG91bGRQYWludDsKLSAgICBpbnQgeDE7Ci0gICAg
aW50IHkxOwotICAgIGludCB4MjsKLSAgICBpbnQgeTI7Ci0gICAgRUJvcmRlclN0eWxlIHN0eWxl
OwotfTsKLQotY2xhc3MgQ29sbGFwc2VkQm9yZGVycwotewotcHVibGljOgotICAgIENvbGxhcHNl
ZEJvcmRlcnMoaW50IGkpIDpjb3VudCgwKSB7fQotICAgIAotICAgIHZvaWQgYWRkQm9yZGVyKGNv
bnN0IENvbGxhcHNlZEJvcmRlclZhbHVlJiBiLCBSZW5kZXJPYmplY3Q6OkJvcmRlclNpZGUgcywg
Ym9vbCBwYWludCwgCi0gICAgICAgICAgICAgICAgICAgaW50IF94MSwgaW50IF95MSwgaW50IF94
MiwgaW50IF95MiwKLSAgICAgICAgICAgICAgICAgICBFQm9yZGVyU3R5bGUgX3N0eWxlKQotICAg
IHsKLSAgICAgICAgaWYgKGIuZXhpc3RzKCkgJiYgcGFpbnQpIHsKLSAgICAgICAgICAgIGJvcmRl
cnNbY291bnRdLmJvcmRlciA9IGI7Ci0gICAgICAgICAgICBib3JkZXJzW2NvdW50XS5zaWRlID0g
czsKLSAgICAgICAgICAgIGJvcmRlcnNbY291bnRdLnNob3VsZFBhaW50ID0gcGFpbnQ7Ci0gICAg
ICAgICAgICBib3JkZXJzW2NvdW50XS54MSA9IF94MTsKLSAgICAgICAgICAgIGJvcmRlcnNbY291
bnRdLngyID0gX3gyOwotICAgICAgICAgICAgYm9yZGVyc1tjb3VudF0ueTEgPSBfeTE7Ci0gICAg
ICAgICAgICBib3JkZXJzW2NvdW50XS55MiA9IF95MjsKLSAgICAgICAgICAgIGJvcmRlcnNbY291
bnRdLnN0eWxlID0gX3N0eWxlOwotICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgfQotICAg
IH0KLQotICAgIENvbGxhcHNlZEJvcmRlciogbmV4dEJvcmRlcigpIHsKLSAgICAgICAgZm9yIChp
bnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoYm9yZGVyc1tpXS5i
b3JkZXIuZXhpc3RzKCkgJiYgYm9yZGVyc1tpXS5zaG91bGRQYWludCkgewotICAgICAgICAgICAg
ICAgIGJvcmRlcnNbaV0uc2hvdWxkUGFpbnQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICByZXR1
cm4gJmJvcmRlcnNbaV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAg
ICAgIHJldHVybiAwOwotICAgIH0KLSAgICAKLSAgICBDb2xsYXBzZWRCb3JkZXIgYm9yZGVyc1s0
XTsKLSAgICBpbnQgY291bnQ7Ci19OwotCi1zdGF0aWMgdm9pZCBhZGRCb3JkZXJTdHlsZShRVmFs
dWVMaXN0PENvbGxhcHNlZEJvcmRlclZhbHVlPiYgYm9yZGVyU3R5bGVzLCBDb2xsYXBzZWRCb3Jk
ZXJWYWx1ZSBib3JkZXJWYWx1ZSkKLXsKLSAgICBpZiAoIWJvcmRlclZhbHVlLmV4aXN0cygpIHx8
IGJvcmRlclN0eWxlcy5jb250YWlucyhib3JkZXJWYWx1ZSkpCi0gICAgICAgIHJldHVybjsKLSAg
ICAKLSAgICBRVmFsdWVMaXN0SXRlcmF0b3I8Q29sbGFwc2VkQm9yZGVyVmFsdWU+IGl0ID0gYm9y
ZGVyU3R5bGVzLmJlZ2luKCk7Ci0gICAgUVZhbHVlTGlzdEl0ZXJhdG9yPENvbGxhcHNlZEJvcmRl
clZhbHVlPiBlbmQgPSBib3JkZXJTdHlsZXMuZW5kKCk7Ci0gICAgZm9yICg7IGl0ICE9IGVuZDsg
KytpdCkgewotICAgICAgICBDb2xsYXBzZWRCb3JkZXJWYWx1ZSByZXN1bHQgPSBjb21wYXJlQm9y
ZGVycygqaXQsIGJvcmRlclZhbHVlKTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSAqaXQpIHsKLSAg
ICAgICAgICAgIGJvcmRlclN0eWxlcy5pbnNlcnQoaXQsIGJvcmRlclZhbHVlKTsKLSAgICAgICAg
ICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGJvcmRlclN0eWxlcy5hcHBlbmQo
Ym9yZGVyVmFsdWUpOwotfQotCi12b2lkIFJlbmRlclRhYmxlQ2VsbDo6Y29sbGVjdEJvcmRlcnMo
UVZhbHVlTGlzdDxDb2xsYXBzZWRCb3JkZXJWYWx1ZT4mIGJvcmRlclN0eWxlcykKLXsKLSAgICBh
ZGRCb3JkZXJTdHlsZShib3JkZXJTdHlsZXMsIGNvbGxhcHNlZExlZnRCb3JkZXIoKSk7Ci0gICAg
YWRkQm9yZGVyU3R5bGUoYm9yZGVyU3R5bGVzLCBjb2xsYXBzZWRSaWdodEJvcmRlcigpKTsKLSAg
ICBhZGRCb3JkZXJTdHlsZShib3JkZXJTdHlsZXMsIGNvbGxhcHNlZFRvcEJvcmRlcigpKTsKLSAg
ICBhZGRCb3JkZXJTdHlsZShib3JkZXJTdHlsZXMsIGNvbGxhcHNlZEJvdHRvbUJvcmRlcigpKTsK
LX0KLQotdm9pZCBSZW5kZXJUYWJsZUNlbGw6OnBhaW50Q29sbGFwc2VkQm9yZGVyKFFQYWludGVy
KiBwLCBpbnQgX3R4LCBpbnQgX3R5LCBpbnQgdywgaW50IGgpCi17Ci0gICAgaWYgKCF0YWJsZSgp
LT5jdXJyZW50Qm9yZGVyU3R5bGUoKSkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIENvbGxh
cHNlZEJvcmRlclZhbHVlIGxlZnRWYWwgPSBjb2xsYXBzZWRMZWZ0Qm9yZGVyKCk7Ci0gICAgQ29s
bGFwc2VkQm9yZGVyVmFsdWUgcmlnaHRWYWwgPSBjb2xsYXBzZWRSaWdodEJvcmRlcigpOwotICAg
IENvbGxhcHNlZEJvcmRlclZhbHVlIHRvcFZhbCA9IGNvbGxhcHNlZFRvcEJvcmRlcigpOwotICAg
IENvbGxhcHNlZEJvcmRlclZhbHVlIGJvdHRvbVZhbCA9IGNvbGxhcHNlZEJvdHRvbUJvcmRlcigp
OwotICAgICAKLSAgICAvLyBBZGp1c3Qgb3VyIHgveS93aWR0aC9oZWlnaHQgc28gdGhhdCB3ZSBw
YWludCB0aGUgY29sbGFwc2VkIGJvcmRlcnMgYXQgdGhlIGNvcnJlY3QgbG9jYXRpb24uCi0gICAg
aW50IHRvcFdpZHRoID0gdG9wVmFsLndpZHRoKCk7Ci0gICAgaW50IGJvdHRvbVdpZHRoID0gYm90
dG9tVmFsLndpZHRoKCk7Ci0gICAgaW50IGxlZnRXaWR0aCA9IGxlZnRWYWwud2lkdGgoKTsKLSAg
ICBpbnQgcmlnaHRXaWR0aCA9IHJpZ2h0VmFsLndpZHRoKCk7Ci0gICAgCi0gICAgX3R4IC09IGxl
ZnRXaWR0aCAvIDI7Ci0gICAgX3R5IC09IHRvcFdpZHRoIC8gMjsKLSAgICB3ICs9IGxlZnRXaWR0
aCAvIDIgKyBpbnQocmlnaHRXaWR0aCAvIDIuMCArIDAuNSk7Ci0gICAgaCArPSB0b3BXaWR0aCAv
IDIgKyBpbnQoYm90dG9tV2lkdGggLyAyLjAgKyAwLjUpOwotICAgIAotICAgIGJvb2wgdHQgPSB0
b3BWYWwuaXNUcmFuc3BhcmVudCgpOwotICAgIGJvb2wgYnQgPSBib3R0b21WYWwuaXNUcmFuc3Bh
cmVudCgpOwotICAgIGJvb2wgcnQgPSByaWdodFZhbC5pc1RyYW5zcGFyZW50KCk7Ci0gICAgYm9v
bCBsdCA9IGxlZnRWYWwuaXNUcmFuc3BhcmVudCgpOwotICAgIAotICAgIEVCb3JkZXJTdHlsZSB0
cyA9IGNvbGxhcHNlZEJvcmRlclN0eWxlKHRvcFZhbC5zdHlsZSgpKTsKLSAgICBFQm9yZGVyU3R5
bGUgYnMgPSBjb2xsYXBzZWRCb3JkZXJTdHlsZShib3R0b21WYWwuc3R5bGUoKSk7Ci0gICAgRUJv
cmRlclN0eWxlIGxzID0gY29sbGFwc2VkQm9yZGVyU3R5bGUobGVmdFZhbC5zdHlsZSgpKTsKLSAg
ICBFQm9yZGVyU3R5bGUgcnMgPSBjb2xsYXBzZWRCb3JkZXJTdHlsZShyaWdodFZhbC5zdHlsZSgp
KTsKLSAgICAKLSAgICBib29sIHJlbmRlcl90ID0gdHMgPiBCSElEREVOICYmICF0dDsKLSAgICBi
b29sIHJlbmRlcl9sID0gbHMgPiBCSElEREVOICYmICFsdDsKLSAgICBib29sIHJlbmRlcl9yID0g
cnMgPiBCSElEREVOICYmICFydDsKLSAgICBib29sIHJlbmRlcl9iID0gYnMgPiBCSElEREVOICYm
ICFidDsKLQotICAgIC8vIFdlIG5ldmVyIHBhaW50IGRpYWdvbmFscyBhdCB0aGUgam9pbnMuICBX
ZSBzaW1wbHkgbGV0IHRoZSBib3JkZXIgd2l0aCB0aGUgaGlnaGVzdAotICAgIC8vIHByZWNlZGVu
Y2UgcGFpbnQgb24gdG9wIG9mIGJvcmRlcnMgd2l0aCBsb3dlciBwcmVjZWRlbmNlLiAgCi0gICAg
Q29sbGFwc2VkQm9yZGVycyBib3JkZXJzKDQpOwotICAgIGJvcmRlcnMuYWRkQm9yZGVyKHRvcFZh
bCwgQlNUb3AsIHJlbmRlcl90LCBfdHgsIF90eSwgX3R4ICsgdywgX3R5ICsgdG9wV2lkdGgsIHRz
KTsKLSAgICBib3JkZXJzLmFkZEJvcmRlcihib3R0b21WYWwsIEJTQm90dG9tLCByZW5kZXJfYiwg
X3R4LCBfdHkgKyBoIC0gYm90dG9tV2lkdGgsIF90eCArIHcsIF90eSArIGgsIGJzKTsKLSAgICBi
b3JkZXJzLmFkZEJvcmRlcihsZWZ0VmFsLCBCU0xlZnQsIHJlbmRlcl9sLCBfdHgsIF90eSwgX3R4
ICsgbGVmdFdpZHRoLCBfdHkgKyBoLCBscyk7Ci0gICAgYm9yZGVycy5hZGRCb3JkZXIocmlnaHRW
YWwsIEJTUmlnaHQsIHJlbmRlcl9yLCBfdHggKyB3IC0gcmlnaHRXaWR0aCwgX3R5LCBfdHggKyB3
LCBfdHkgKyBoLCBycyk7Ci0gICAgCi0gICAgZm9yIChDb2xsYXBzZWRCb3JkZXIqIGJvcmRlciA9
IGJvcmRlcnMubmV4dEJvcmRlcigpOyBib3JkZXI7IGJvcmRlciA9IGJvcmRlcnMubmV4dEJvcmRl
cigpKSB7Ci0gICAgICAgIGlmIChib3JkZXItPmJvcmRlciA9PSAqdGFibGUoKS0+Y3VycmVudEJv
cmRlclN0eWxlKCkpCi0gICAgICAgICAgICBkcmF3Qm9yZGVyKHAsIGJvcmRlci0+eDEsIGJvcmRl
ci0+eTEsIGJvcmRlci0+eDIsIGJvcmRlci0+eTIsIGJvcmRlci0+c2lkZSwgCi0gICAgICAgICAg
ICAgICAgICAgICAgIGJvcmRlci0+Ym9yZGVyLmNvbG9yKCksIHN0eWxlKCktPmNvbG9yKCksIGJv
cmRlci0+c3R5bGUsIDAsIDApOwotICAgIH0KLX0KLQotSW50UmVjdCBSZW5kZXJUYWJsZUNlbGw6
OmdldEFic29sdXRlUmVwYWludFJlY3QoKQotewotICAgIGludCBvdyA9IHN0eWxlKCkgPyBzdHls
ZSgpLT5vdXRsaW5lU2l6ZSgpIDogMDsKLSAgICBJbnRSZWN0IHIoLW93LCAtb3cgLSBib3JkZXJU
b3BFeHRyYSgpLCAKLSAgICAgICAgICAgIG92ZXJmbG93V2lkdGgoZmFsc2UpICsgb3cgKiAyLCBv
dmVyZmxvd0hlaWdodChmYWxzZSkgKyBib3JkZXJUb3BFeHRyYSgpICsgYm9yZGVyQm90dG9tRXh0
cmEoKSArIG93ICogMik7Ci0gICAgY29tcHV0ZUFic29sdXRlUmVwYWludFJlY3Qocik7Ci0gICAg
cmV0dXJuIHI7Ci19Ci0KLXZvaWQgUmVuZGVyVGFibGVDZWxsOjpwYWludEJveERlY29yYXRpb25z
KFBhaW50SW5mbyYgaSwgaW50IF90eCwgaW50IF90eSkKLXsKLSAgICBSZW5kZXJUYWJsZSogdGFi
bGVFbHQgPSB0YWJsZSgpOwotICAgIGlmICghdGFibGVFbHQtPmNvbGxhcHNlQm9yZGVycygpICYm
IHN0eWxlKCktPmVtcHR5Q2VsbHMoKSA9PSBISURFICYmICFmaXJzdENoaWxkKCkpCi0gICAgICAg
IHJldHVybjsKLSAgICAKLSAgICBpbnQgdyA9IHdpZHRoKCk7Ci0gICAgaW50IGggPSBoZWlnaHQo
KSArIGJvcmRlclRvcEV4dHJhKCkgKyBib3JkZXJCb3R0b21FeHRyYSgpOwotICAgIF90eSAtPSBi
b3JkZXJUb3BFeHRyYSgpOwotCi0gICAgUUNvbG9yIGMgPSBzdHlsZSgpLT5iYWNrZ3JvdW5kQ29s
b3IoKTsKLSAgICBpZiAoIWMuaXNWYWxpZCgpICYmIHBhcmVudCgpKSAvLyB0YWtlIGZyb20gcm93
Ci0gICAgICAgIGMgPSBwYXJlbnQoKS0+c3R5bGUoKS0+YmFja2dyb3VuZENvbG9yKCk7Ci0gICAg
aWYgKCFjLmlzVmFsaWQoKSAmJiBwYXJlbnQoKSAmJiBwYXJlbnQoKS0+cGFyZW50KCkpIC8vIHRh
a2UgZnJvbSByb3dncm91cAotICAgICAgICBjID0gcGFyZW50KCktPnBhcmVudCgpLT5zdHlsZSgp
LT5iYWNrZ3JvdW5kQ29sb3IoKTsKLSAgICBpZiAoIWMuaXNWYWxpZCgpKSB7Ci0JLy8gc2VlIGlm
IHdlIGhhdmUgYSBjb2wgb3IgY29sZ3JvdXAgZm9yIHRoaXMKLQlSZW5kZXJUYWJsZUNvbCAqY29s
ID0gdGFibGUoKS0+Y29sRWxlbWVudChfY29sKTsKLQlpZiAoY29sKSB7Ci0JICAgIGMgPSBjb2wt
PnN0eWxlKCktPmJhY2tncm91bmRDb2xvcigpOwotCSAgICBpZiAoIWMuaXNWYWxpZCgpKSB7Ci0J
CS8vIHRyeSBjb2x1bW4gZ3JvdXAKLQkJUmVuZGVyU3R5bGUgKnN0eWxlID0gY29sLT5wYXJlbnQo
KS0+c3R5bGUoKTsKLQkJaWYgKHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEVfQ09MVU1OX0dST1VQ
KQotCQkgICAgYyA9IHN0eWxlLT5iYWNrZ3JvdW5kQ29sb3IoKTsKLQkgICAgfQotCX0KLSAgICB9
Ci0KLSAgICAvLyBGSVhNRTogVGhpcyBjb2RlIGlzIGp1c3QgcGxhaW4gd3JvbmcuICBSb3dzIGFu
ZCBjb2x1bW5zIHNob3VsZCBwYWludCB0aGVpciBiYWNrZ3JvdW5kcwotICAgIC8vIGluZGVwZW5k
ZW50IGZyb20gdGhlIGNlbGwuCi0gICAgLy8gIyMjIGdldCBvZmZzZXRzIHJpZ2h0IGluIGNhc2Ug
dGhlIGJnaW1hZ2UgaXMgaW5oZXJpdGVkLgotICAgIGNvbnN0IEJhY2tncm91bmRMYXllciogYmdM
YXllciA9IHN0eWxlKCktPmJhY2tncm91bmRMYXllcnMoKTsKLSAgICBpZiAoIWJnTGF5ZXItPmhh
c0ltYWdlKCkgJiYgcGFyZW50KCkpCi0gICAgICAgIGJnTGF5ZXIgPSBwYXJlbnQoKS0+c3R5bGUo
KS0+YmFja2dyb3VuZExheWVycygpOwotICAgIGlmICghYmdMYXllci0+aGFzSW1hZ2UoKSAmJiBw
YXJlbnQoKSAmJiBwYXJlbnQoKS0+cGFyZW50KCkpCi0gICAgICAgIGJnTGF5ZXIgPSBwYXJlbnQo
KS0+cGFyZW50KCktPnN0eWxlKCktPmJhY2tncm91bmRMYXllcnMoKTsKLSAgICBpZiAoIWJnTGF5
ZXItPmhhc0ltYWdlKCkpIHsKLQkvLyBzZWUgaWYgd2UgaGF2ZSBhIGNvbCBvciBjb2xncm91cCBm
b3IgdGhpcwotCVJlbmRlclRhYmxlQ29sKiBjb2wgPSB0YWJsZSgpLT5jb2xFbGVtZW50KF9jb2wp
OwotCWlmIChjb2wpIHsKLQkgICAgYmdMYXllciA9IGNvbC0+c3R5bGUoKS0+YmFja2dyb3VuZExh
eWVycygpOwotCSAgICBpZiAoIWJnTGF5ZXItPmhhc0ltYWdlKCkpIHsKLQkJLy8gdHJ5IGNvbHVt
biBncm91cAotCQlSZW5kZXJTdHlsZSAqc3R5bGUgPSBjb2wtPnBhcmVudCgpLT5zdHlsZSgpOwot
CQlpZiAoc3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRV9DT0xVTU5fR1JPVVApCi0JCSAgICBiZ0xh
eWVyID0gc3R5bGUtPmJhY2tncm91bmRMYXllcnMoKTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAg
ICBpbnQgbXkgPSBrTWF4KF90eSwgaS5yLnkoKSk7Ci0gICAgaW50IGVuZCA9IGtNaW4oaS5yLnko
KSArIGkuci5oZWlnaHQoKSwgX3R5ICsgaCk7Ci0gICAgaW50IG1oID0gZW5kIC0gbXk7Ci0KLSAg
ICBpZiAoYmdMYXllci0+aGFzSW1hZ2UoKSB8fCBjLmlzVmFsaWQoKSkgewotCS8vIFdlIGhhdmUg
dG8gY2xpcCBoZXJlIGJlY2F1c2UgdGhlIGJhY2tyb3VuZCB3b3VsZCBwYWludAotICAgICAgICAv
LyBvbiB0b3Agb2YgdGhlIGJvcmRlcnMgb3RoZXJ3aXNlLgotICAgICAgICBpZiAobV9sYXllciAm
JiB0YWJsZUVsdC0+Y29sbGFwc2VCb3JkZXJzKCkpIHsKLSAgICAgICAgICAgIEludFJlY3QgY2xp
cFJlY3QoX3R4ICsgYm9yZGVyTGVmdCgpLCBfdHkgKyBib3JkZXJUb3AoKSwgdyAtIGJvcmRlckxl
ZnQoKSAtIGJvcmRlclJpZ2h0KCksIGggLSBib3JkZXJUb3AoKSAtIGJvcmRlckJvdHRvbSgpKTsK
LSAgICAgICAgICAgIGNsaXBSZWN0ID0gaS5wLT54Rm9ybShjbGlwUmVjdCk7Ci0gICAgICAgICAg
ICBpLnAtPnNhdmUoKTsKLSAgICAgICAgICAgIGkucC0+YWRkQ2xpcChjbGlwUmVjdCk7Ci0gICAg
ICAgIH0KLSAgICAgICAgcGFpbnRCYWNrZ3JvdW5kKGkucCwgYywgYmdMYXllciwgbXksIG1oLCBf
dHgsIF90eSwgdywgaCk7Ci0gICAgICAgIGlmIChtX2xheWVyICYmIHRhYmxlRWx0LT5jb2xsYXBz
ZUJvcmRlcnMoKSkKLSAgICAgICAgICAgIGkucC0+cmVzdG9yZSgpOwotICAgIH0KLQotICAgIGlm
IChzdHlsZSgpLT5oYXNCb3JkZXIoKSAmJiAhdGFibGVFbHQtPmNvbGxhcHNlQm9yZGVycygpKQot
ICAgICAgICBwYWludEJvcmRlcihpLnAsIF90eCwgX3R5LCB3LCBoLCBzdHlsZSgpKTsKLX0KLQot
Ci0jaWZuZGVmIE5ERUJVRwotdm9pZCBSZW5kZXJUYWJsZUNlbGw6OmR1bXAoUVRleHRTdHJlYW0g
KnN0cmVhbSwgUVN0cmluZyBpbmQpIGNvbnN0Ci17Ci0gICAgKnN0cmVhbSA8PCAiIHJvdz0iIDw8
IF9yb3c7Ci0gICAgKnN0cmVhbSA8PCAiIGNvbD0iIDw8IF9jb2w7Ci0gICAgKnN0cmVhbSA8PCAi
IHJTcGFuPSIgPDwgclNwYW47Ci0gICAgKnN0cmVhbSA8PCAiIGNTcGFuPSIgPDwgY1NwYW47Ci0v
LyAgICAqc3RyZWFtIDw8ICIgbldyYXA9IiA8PCBuV3JhcDsKLQotICAgIFJlbmRlckJsb2NrOjpk
dW1wKHN0cmVhbSxpbmQpOwotfQotI2VuZGlmCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotUmVu
ZGVyVGFibGVDb2w6OlJlbmRlclRhYmxlQ29sKERPTTo6Tm9kZUltcGwqIG5vZGUpCi0gICAgOiBS
ZW5kZXJDb250YWluZXIobm9kZSkKLXsKLSAgICAvLyBpbml0IFJlbmRlck9iamVjdCBhdHRyaWJ1
dGVzCi0gICAgc2V0SW5saW5lKHRydWUpOyAgIC8vIG91ciBvYmplY3QgaXMgbm90IElubGluZQot
Ci0gICAgX3NwYW4gPSAxOwotICAgIHVwZGF0ZUZyb21FbGVtZW50KCk7Ci19Ci0KLXZvaWQgUmVu
ZGVyVGFibGVDb2w6OnVwZGF0ZUZyb21FbGVtZW50KCkKLXsKLSAgICBpbnQgb2xkU3BhbiA9IF9z
cGFuOwotICAgIERPTTo6Tm9kZUltcGwgKm5vZGUgPSBlbGVtZW50KCk7Ci0gICAgaWYgKG5vZGUg
JiYgKG5vZGUtPmhhc1RhZ05hbWUoY29sVGFnKSB8fCBub2RlLT5oYXNUYWdOYW1lKGNvbGdyb3Vw
VGFnKSkpIHsKLSAgICAgICAgRE9NOjpIVE1MVGFibGVDb2xFbGVtZW50SW1wbCAqdGMgPSBzdGF0
aWNfY2FzdDxET006OkhUTUxUYWJsZUNvbEVsZW1lbnRJbXBsICo+KG5vZGUpOwotICAgICAgICBf
c3BhbiA9IHRjLT5zcGFuKCk7Ci0gICAgfSBlbHNlCi0gICAgICBfc3BhbiA9ICEoc3R5bGUoKSAm
JiBzdHlsZSgpLT5kaXNwbGF5KCkgPT0gVEFCTEVfQ09MVU1OX0dST1VQKTsKLSAgICBpZiAoX3Nw
YW4gIT0gb2xkU3BhbiAmJiBzdHlsZSgpICYmIHBhcmVudCgpKQotICAgICAgICBzZXROZWVkc0xh
eW91dEFuZE1pbk1heFJlY2FsYygpOwotfQotCi1ib29sIFJlbmRlclRhYmxlQ29sOjpjYW5IYXZl
Q2hpbGRyZW4oKSBjb25zdAotewotICAgIC8vIGNvbHMgY2Fubm90IGhhdmUgY2hpbGRyZW4uICBU
aGlzIGlzIGFjdHVhbGx5IG5lY2Vzc2FyeSB0byBmaXggYSBidWcKLSAgICAvLyB3aXRoIGxpYnJh
cmllcy51Yy5lZHUsIHdoaWNoIG1ha2VzIGEgPHA+IGJlIGEgdGFibGUtY29sdW1uLgotICAgIHJl
dHVybiBzdHlsZSgpLT5kaXNwbGF5KCkgPT0gVEFCTEVfQ09MVU1OX0dST1VQOwotfQotCi12b2lk
IFJlbmRlclRhYmxlQ29sOjphZGRDaGlsZChSZW5kZXJPYmplY3QgKmNoaWxkLCBSZW5kZXJPYmpl
Y3QgKmJlZm9yZUNoaWxkKQotewotICAgIEtIVE1MQXNzZXJ0KGNoaWxkLT5zdHlsZSgpLT5kaXNw
bGF5KCkgPT0gVEFCTEVfQ09MVU1OKTsKLQotICAgIC8vIHRoZXNlIGhhdmUgdG8gY29tZSBiZWZv
cmUgdGhlIHRhYmxlIGRlZmluaXRpb24hCi0gICAgUmVuZGVyQ29udGFpbmVyOjphZGRDaGlsZChj
aGlsZCwgYmVmb3JlQ2hpbGQpOwotfQotCi0jaWZuZGVmIE5ERUJVRwotdm9pZCBSZW5kZXJUYWJs
ZUNvbDo6ZHVtcChRVGV4dFN0cmVhbSAqc3RyZWFtLCBRU3RyaW5nIGluZCkgY29uc3QKLXsKLSAg
ICAqc3RyZWFtIDw8ICIgX3NwYW49IiA8PCBfc3BhbjsKLSAgICBSZW5kZXJDb250YWluZXI6OmR1
bXAoc3RyZWFtLCBpbmQpOwotfQotI2VuZGlmCi0KLSN1bmRlZiBUQUJMRV9ERUJVRwotI3VuZGVm
IERFQlVHX0xBWU9VVAotI3VuZGVmIEJPWF9ERUJVRwpJbmRleDogcmVuZGVyaW5nL3JlbmRlcl9j
YW52YXMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSByZW5kZXJpbmcvcmVuZGVyX2NhbnZhcy5oCShyZXZpc2lv
biAxMjI1MykKKysrIHJlbmRlcmluZy9yZW5kZXJfY2FudmFzLmgJKHdvcmtpbmcgY29weSkKQEAg
LTIyLDcgKzIyLDcgQEAKICNpZm5kZWYgcmVuZGVyX2NhbnZhc19oCiAjZGVmaW5lIHJlbmRlcl9j
YW52YXNfaAogCi0jaW5jbHVkZSAicmVuZGVyX2Jsb2NrLmgiCisjaW5jbHVkZSAiUmVuZGVyQmxv
Y2suaCIKICNpbmNsdWRlIDxreG1sY29yZS9IYXNoU2V0Lmg+CiAKIGNsYXNzIEZyYW1lVmlldzsK
SW5kZXg6IHJlbmRlcmluZy9yZW5kZXJfcmVwbGFjZWQuaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSByZW5kZXJp
bmcvcmVuZGVyX3JlcGxhY2VkLmgJKHJldmlzaW9uIDEyMjUzKQorKysgcmVuZGVyaW5nL3JlbmRl
cl9yZXBsYWNlZC5oCSh3b3JraW5nIGNvcHkpCkBAIC0yMiwxNiArMjIsMTUgQEAKICNpZm5kZWYg
cmVuZGVyX3JlcGxhY2VkX2gKICNkZWZpbmUgcmVuZGVyX3JlcGxhY2VkX2gKIAotI2luY2x1ZGUg
InJlbmRlcl9jb250YWluZXIuaCIKKyNpbmNsdWRlICJyZW5kZXJfYm94LmgiCiAjaW5jbHVkZSA8
cW9iamVjdC5oPgorCiBjbGFzcyBGcmFtZVZpZXc7CiBjbGFzcyBRV2lkZ2V0OwogCi1uYW1lc3Bh
Y2UgRE9NIHsKLSAgICBjbGFzcyBQb3NpdGlvbjsKLX0KK25hbWVzcGFjZSBXZWJDb3JlIHsKIAot
bmFtZXNwYWNlIGtodG1sIHsKKyAgICBjbGFzcyBQb3NpdGlvbjsKIAogY2xhc3MgUmVuZGVyUmVw
bGFjZWQgOiBwdWJsaWMgUmVuZGVyQm94CiB7CkluZGV4OiByZW5kZXJpbmcvcmVuZGVyX2NvbnRh
aW5lci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIHJlbmRlcmluZy9yZW5kZXJfY29udGFpbmVyLmgJKHJldmlz
aW9uIDEyMjUzKQorKysgcmVuZGVyaW5nL3JlbmRlcl9jb250YWluZXIuaAkod29ya2luZyBjb3B5
KQpAQCAtMSw3OCArMCwwIEBACi0vKgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGh0bWwg
cmVuZGVyZXIgZm9yIEtERS4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEgQW50dGkgS29pdmlz
dG8gKGtvaXZpc3RvQGtkZS5vcmcpCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdh
cmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRo
ZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMg
cHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVy
c2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJz
aW9uLgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0
IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0
IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBMaWJyYXJ5IEdl
bmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxk
IGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBM
aWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcu
TElCLiAgSWYgbm90LCB3cml0ZSB0bwotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwg
SW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotICogQm9zdG9uLCBNQSAwMjExMS0x
MzA3LCBVU0EuCi0gKgotICovCi0jaWZuZGVmIHJlbmRlcl9jb250YWluZXJfaAotI2RlZmluZSBy
ZW5kZXJfY29udGFpbmVyX2gKLQotI2luY2x1ZGUgInJlbmRlcl9ib3guaCIKLQotbmFtZXNwYWNl
IERPTSB7Ci0gICAgY2xhc3MgUG9zaXRpb247Ci19OwotCi1uYW1lc3BhY2Uga2h0bWwKLXsKLQot
Ci0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIHJlbmRlcmluZyBvYmplY3RzIHRoYXQgY2FuIGhhdmUg
Y2hpbGRyZW4KLSAqLwotY2xhc3MgUmVuZGVyQ29udGFpbmVyIDogcHVibGljIFJlbmRlckJveAot
ewotcHVibGljOgotICAgIFJlbmRlckNvbnRhaW5lcihET006Ok5vZGVJbXBsKiBub2RlKTsKLSAg
ICB2aXJ0dWFsIH5SZW5kZXJDb250YWluZXIoKTsKLQotICAgIFJlbmRlck9iamVjdCAqZmlyc3RD
aGlsZCgpIGNvbnN0IHsgcmV0dXJuIG1fZmlyc3Q7IH0KLSAgICBSZW5kZXJPYmplY3QgKmxhc3RD
aGlsZCgpIGNvbnN0IHsgcmV0dXJuIG1fbGFzdDsgfQotCi0gICAgdmlydHVhbCBib29sIGNhbkhh
dmVDaGlsZHJlbigpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCBhZGRDaGlsZChSZW5kZXJPYmpl
Y3QgKm5ld0NoaWxkLCBSZW5kZXJPYmplY3QgKmJlZm9yZUNoaWxkID0gMCk7Ci0gICAgdmlydHVh
bCB2b2lkIHJlbW92ZUNoaWxkKFJlbmRlck9iamVjdCAqb2xkQ2hpbGQpOwotCi0gICAgdmlydHVh
bCB2b2lkIGRlc3Ryb3koKTsKLSAgICB2b2lkIGRlc3Ryb3lMZWZ0b3ZlckNoaWxkcmVuKCk7Ci0g
ICAgCi0gICAgdmlydHVhbCBSZW5kZXJPYmplY3QqIHJlbW92ZUNoaWxkTm9kZShSZW5kZXJPYmpl
Y3QqIGNoaWxkKTsKLSAgICB2aXJ0dWFsIHZvaWQgYXBwZW5kQ2hpbGROb2RlKFJlbmRlck9iamVj
dCogY2hpbGQpOwotICAgIHZpcnR1YWwgdm9pZCBpbnNlcnRDaGlsZE5vZGUoUmVuZGVyT2JqZWN0
KiBjaGlsZCwgUmVuZGVyT2JqZWN0KiBiZWZvcmUpOwotCi0gICAgdmlydHVhbCB2b2lkIGxheW91
dCgpOwotICAgIHZpcnR1YWwgdm9pZCBjYWxjTWluTWF4V2lkdGgoKSB7IHNldE1pbk1heEtub3du
KCB0cnVlICk7IH0KLQotICAgIHZpcnR1YWwgdm9pZCByZW1vdmVMZWZ0b3ZlckFub255bW91c0Jv
eGVzKCk7Ci0KLSAgICB2b2lkIHVwZGF0ZVBzZXVkb0NoaWxkKFJlbmRlclN0eWxlOjpQc2V1ZG9J
ZCB0eXBlLCBSZW5kZXJPYmplY3QqIGNoaWxkKTsKLQotICAgIHZpcnR1YWwgVmlzaWJsZVBvc2l0
aW9uIHBvc2l0aW9uRm9yQ29vcmRpbmF0ZXMoaW50IHgsIGludCB5KTsKLSAgICAKLSAgICB2aXJ0
dWFsIFFWYWx1ZUxpc3Q8SW50UmVjdD4gbGluZUJveFJlY3RzKCk7Ci0KLXByb3RlY3RlZDoKLSAg
ICB2b2lkIHNldEZpcnN0Q2hpbGQoUmVuZGVyT2JqZWN0ICpmaXJzdCkgeyBtX2ZpcnN0ID0gZmly
c3Q7IH0KLSAgICB2b2lkIHNldExhc3RDaGlsZChSZW5kZXJPYmplY3QgKmxhc3QpIHsgbV9sYXN0
ID0gbGFzdDsgfQotCi1wcm90ZWN0ZWQ6Ci0gICAgUmVuZGVyT2JqZWN0ICptX2ZpcnN0OwotICAg
IFJlbmRlck9iamVjdCAqbV9sYXN0OwotfTsKLX07Ci0jZW5kaWYKSW5kZXg6IHJlbmRlcmluZy9y
ZW5kZXJfbGluZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gcmVuZGVyaW5nL3JlbmRlcl9saW5lLmNwcAko
cmV2aXNpb24gMTIyNTMpCisrKyByZW5kZXJpbmcvcmVuZGVyX2xpbmUuY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC0yMSwyOCArMjEsMjQgQEAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogI2luY2x1ZGUg
ImNvbmZpZy5oIgotI2luY2x1ZGUgPGtkZWJ1Zy5oPgogI2luY2x1ZGUgPGFzc2VydC5oPgogI2lu
Y2x1ZGUgPHFwYWludGVyLmg+CiAjaW5jbHVkZSA8cXBlbi5oPgogCi0jaW5jbHVkZSAicmVuZGVy
aW5nL3JlbmRlcl9mbG93LmgiCiAjaW5jbHVkZSAiSW5saW5lVGV4dEJveC5oIgotI2luY2x1ZGUg
InJlbmRlcmluZy9yZW5kZXJfdGFibGUuaCIKICNpbmNsdWRlICJEb2N1bWVudEltcGwuaCIKICNp
bmNsdWRlICJDYWNoZWRJbWFnZS5oIgogI2luY2x1ZGUgInJlbmRlcl9pbmxpbmUuaCIKLSNpbmNs
dWRlICJyZW5kZXJfYmxvY2suaCIKKyNpbmNsdWRlICJSZW5kZXJCbG9jay5oIgogI2luY2x1ZGUg
InJlbmRlcl9hcmVuYS5oIgogI2luY2x1ZGUgInJlbmRlcl9saW5lLmgiCi0KLXVzaW5nIG5hbWVz
cGFjZSBET007CisjaW5jbHVkZSAiUmVuZGVyVGFibGVDZWxsLmgiCiAKICNpZm5kZWYgTkRFQlVH
CiBzdGF0aWMgYm9vbCBpbklubGluZUJveERldGFjaDsKICNlbmRpZgogCi1uYW1lc3BhY2Uga2h0
bWwgeworbmFtZXNwYWNlIFdlYkNvcmUgewogICAgIAogY2xhc3MgRWxsaXBzaXNCb3ggOiBwdWJs
aWMgSW5saW5lQm94CiB7CkluZGV4OiByZW5kZXJpbmcvUmVuZGVyVGFibGVDZWxsLmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSByZW5kZXJpbmcvUmVuZGVyVGFibGVDZWxsLmNwcAkocmV2aXNpb24gMTIyNTMp
CisrKyByZW5kZXJpbmcvUmVuZGVyVGFibGVDZWxsLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNiw3
ICs2LDcgQEAKICAqICAgICAgICAgICAoQykgMTk5OCBXYWxkbyBCYXN0aWFuIChiYXN0aWFuQGtk
ZS5vcmcpCiAgKiAgICAgICAgICAgKEMpIDE5OTkgTGFycyBLbm9sbCAoa25vbGxAa2RlLm9yZykK
ICAqICAgICAgICAgICAoQykgMTk5OSBBbnR0aSBLb2l2aXN0byAoa29pdmlzdG9Aa2RlLm9yZykK
LSAqIENvcHlyaWdodCAoQykgMjAwMyBBcHBsZSBDb21wdXRlciwgSW5jLgorICogQ29weXJpZ2h0
IChDKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2IEFwcGxlIENvbXB1dGVyLCBJbmMuCiAgKgogICog
VGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFu
ZC9vcgogICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2Vu
ZXJhbCBQdWJsaWMKQEAgLTI0LDE0NTIgKzI0LDE4IEBACiAgKiBCb3N0b24sIE1BIDAyMTExLTEz
MDcsIFVTQS4KICAqLwogCi0vLyNkZWZpbmUgVEFCTEVfREVCVUcKLS8vI2RlZmluZSBUQUJMRV9Q
UklOVAotLy8jZGVmaW5lIERFQlVHX0xBWU9VVAotLy8jZGVmaW5lIEJPWF9ERUJVRwogI2luY2x1
ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgInJlbmRlcmluZy9yZW5kZXJfdGFibGUuaCIKLSNpbmNs
dWRlICJyZW5kZXJpbmcvdGFibGVfbGF5b3V0LmgiCi0jaW5jbHVkZSAiaHRtbC9odG1sX3RhYmxl
aW1wbC5oIgorI2luY2x1ZGUgIlJlbmRlclRhYmxlQ2VsbC5oIgorI2luY2x1ZGUgIlJlbmRlclRh
YmxlQ29sLmgiCiAjaW5jbHVkZSAiaHRtbG5hbWVzLmgiCi0jaW5jbHVkZSAiRG9jdW1lbnRJbXBs
LmgiCisjaW5jbHVkZSAiaHRtbF90YWJsZWltcGwuaCIKKyNpbmNsdWRlIDxxdGV4dHN0cmVhbS5o
PgogCi0jaW5jbHVkZSA8cWFwcGxpY2F0aW9uLmg+Ci0jaW5jbHVkZSA8cXN0eWxlLmg+CituYW1l
c3BhY2UgV2ViQ29yZSB7CiAKLSNpbmNsdWRlIDxrZGVidWcuaD4KLSNpbmNsdWRlIDxhc3NlcnQu
aD4KLQotdXNpbmcgbmFtZXNwYWNlIGtodG1sOwotdXNpbmcgbmFtZXNwYWNlIERPTTsKIHVzaW5n
IG5hbWVzcGFjZSBIVE1MTmFtZXM7CiAKLVJlbmRlclRhYmxlOjpSZW5kZXJUYWJsZShET006Ok5v
ZGVJbXBsKiBub2RlKQotICAgIDogUmVuZGVyQmxvY2sobm9kZSkKLXsKLSAgICB0Q2FwdGlvbiA9
IDA7Ci0gICAgaGVhZCA9IGZvb3QgPSBmaXJzdEJvZHkgPSAwOwotICAgIHRhYmxlTGF5b3V0ID0g
MDsKLSAgICBtX2N1cnJlbnRCb3JkZXIgPSAwOwotICAgIAotICAgIHJ1bGVzID0gTm9uZTsKLSAg
ICBmcmFtZSA9IFZvaWQ7Ci0gICAgaGFzX2NvbF9lbGVtcyA9IGZhbHNlOwotICAgIGhzcGFjaW5n
ID0gMDsKLSAgICB2c3BhY2luZyA9IDA7Ci0gICAgcGFkZGluZyA9IDA7Ci0gICAgbmVlZFNlY3Rp
b25SZWNhbGMgPSBmYWxzZTsKLSAgICBwYWRkaW5nID0gMDsKLQotICAgIGNvbHVtblBvcy5yZXNp
emUoMik7Ci0gICAgY29sdW1uUG9zLmZpbGwoMCk7Ci0gICAgY29sdW1ucy5yZXNpemUoMSk7Ci0g
ICAgY29sdW1ucy5maWxsKENvbHVtblN0cnVjdCgpKTsKLQotICAgIGNvbHVtblBvc1swXSA9IDA7
Ci19Ci0KLVJlbmRlclRhYmxlOjp+UmVuZGVyVGFibGUoKQotewotICAgIGRlbGV0ZSB0YWJsZUxh
eW91dDsKLX0KLQotdm9pZCBSZW5kZXJUYWJsZTo6c2V0U3R5bGUoUmVuZGVyU3R5bGUgKl9zdHls
ZSkKLXsKLSAgICBFVGFibGVMYXlvdXQgb2xkVGFibGVMYXlvdXQgPSBzdHlsZSgpID8gc3R5bGUo
KS0+dGFibGVMYXlvdXQoKSA6IFRBVVRPOwotICAgIFJlbmRlckJsb2NrOjpzZXRTdHlsZShfc3R5
bGUpOwotCi0gICAgLy8gSW4gdGhlIGNvbGxhcHNlZCBib3JkZXIgbW9kZWwsIHRoZXJlIGlzIG5v
IGNlbGwgc3BhY2luZy4KLSAgICBoc3BhY2luZyA9IGNvbGxhcHNlQm9yZGVycygpID8gMCA6IHN0
eWxlKCktPmhvcml6b250YWxCb3JkZXJTcGFjaW5nKCk7Ci0gICAgdnNwYWNpbmcgPSBjb2xsYXBz
ZUJvcmRlcnMoKSA/IDAgOiBzdHlsZSgpLT52ZXJ0aWNhbEJvcmRlclNwYWNpbmcoKTsKLSAgICBj
b2x1bW5Qb3NbMF0gPSBoc3BhY2luZzsKLQotICAgIGlmICghdGFibGVMYXlvdXQgfHwgc3R5bGUo
KS0+dGFibGVMYXlvdXQoKSAhPSBvbGRUYWJsZUxheW91dCkgewotCWRlbGV0ZSB0YWJsZUxheW91
dDsKLQotICAgICAgICAvLyBBY2NvcmRpbmcgdG8gdGhlIENTUzIgc3BlYywgeW91IG9ubHkgdXNl
IGZpeGVkIHRhYmxlIGxheW91dCBpZiBhbgotICAgICAgICAvLyBleHBsaWNpdCB3aWR0aCBpcyBz
cGVjaWZpZWQgb24gdGhlIHRhYmxlLiAgQXV0byB3aWR0aCBpbXBsaWVzIGF1dG8gdGFibGUgbGF5
b3V0LgotCWlmIChzdHlsZSgpLT50YWJsZUxheW91dCgpID09IFRGSVhFRCAmJiAhc3R5bGUoKS0+
d2lkdGgoKS5pc0F1dG8oKSkKLQkgICAgdGFibGVMYXlvdXQgPSBuZXcgRml4ZWRUYWJsZUxheW91
dCh0aGlzKTsKLQllbHNlCi0JICAgIHRhYmxlTGF5b3V0ID0gbmV3IEF1dG9UYWJsZUxheW91dCh0
aGlzKTsKLSAgICB9Ci19Ci0KLXZvaWQgUmVuZGVyVGFibGU6OmFkZENoaWxkKFJlbmRlck9iamVj
dCAqY2hpbGQsIFJlbmRlck9iamVjdCAqYmVmb3JlQ2hpbGQpCi17Ci0gICAgUmVuZGVyT2JqZWN0
ICpvID0gY2hpbGQ7Ci0KLSAgICBpZiAoY2hpbGQtPmVsZW1lbnQoKSAmJiBjaGlsZC0+ZWxlbWVu
dCgpLT5oYXNUYWdOYW1lKGZvcm1UYWcpKSB7Ci0gICAgICAgIFJlbmRlckNvbnRhaW5lcjo6YWRk
Q2hpbGQoY2hpbGQsYmVmb3JlQ2hpbGQpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAg
c3dpdGNoIChjaGlsZC0+c3R5bGUoKS0+ZGlzcGxheSgpKSB7Ci0gICAgICAgIGNhc2UgVEFCTEVf
Q0FQVElPTjoKLSAgICAgICAgICAgIHRDYXB0aW9uID0gc3RhdGljX2Nhc3Q8UmVuZGVyQmxvY2sg
Kj4oY2hpbGQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVEFCTEVfQ09MVU1O
OgotICAgICAgICBjYXNlIFRBQkxFX0NPTFVNTl9HUk9VUDoKLSAgICAgICAgICAgIGhhc19jb2xf
ZWxlbXMgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVEFCTEVfSEVB
REVSX0dST1VQOgotICAgICAgICAgICAgaWYgKCFoZWFkKQotICAgICAgICAgICAgICAgIGhlYWQg
PSBzdGF0aWNfY2FzdDxSZW5kZXJUYWJsZVNlY3Rpb24gKj4oY2hpbGQpOwotICAgICAgICAgICAg
ZWxzZSBpZiAoIWZpcnN0Qm9keSkKLSAgICAgICAgICAgICAgICBmaXJzdEJvZHkgPSBzdGF0aWNf
Y2FzdDxSZW5kZXJUYWJsZVNlY3Rpb24gKj4oY2hpbGQpOwotICAgICAgICAgICAgYnJlYWs7Ci0g
ICAgICAgIGNhc2UgVEFCTEVfRk9PVEVSX0dST1VQOgotICAgICAgICAgICAgaWYgKCFmb290KSB7
Ci0gICAgICAgICAgICAgICAgZm9vdCA9IHN0YXRpY19jYXN0PFJlbmRlclRhYmxlU2VjdGlvbiAq
PihjaGlsZCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAg
ICAgICAvLyBmYWxsIHRocm91Z2gKLSAgICAgICAgY2FzZSBUQUJMRV9ST1dfR1JPVVA6Ci0gICAg
ICAgICAgICBpZiAoIWZpcnN0Qm9keSkKLSAgICAgICAgICAgICAgICBmaXJzdEJvZHkgPSBzdGF0
aWNfY2FzdDxSZW5kZXJUYWJsZVNlY3Rpb24gKj4oY2hpbGQpOwotICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpZiAoIWJlZm9yZUNoaWxkICYmIGxhc3RD
aGlsZCgpICYmCi0gICAgICAgICAgICAgICAgbGFzdENoaWxkKCktPmlzVGFibGVTZWN0aW9uKCkg
JiYgbGFzdENoaWxkKCktPmlzQW5vbnltb3VzKCkpIHsKLSAgICAgICAgICAgICAgICBvID0gbGFz
dENoaWxkKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFJlbmRlck9i
amVjdCAqbGFzdEJveCA9IGJlZm9yZUNoaWxkOwotICAgICAgICAgICAgICAgIFJlbmRlck9iamVj
dCAqbmV4dFRvTGFzdEJveCA9IGJlZm9yZUNoaWxkOwotICAgICAgICAgICAgICAgIHdoaWxlIChs
YXN0Qm94ICYmIGxhc3RCb3gtPnBhcmVudCgpLT5pc0Fub255bW91cygpICYmCi0gICAgICAgICAg
ICAgICAgICAgICAgICAhbGFzdEJveC0+aXNUYWJsZVNlY3Rpb24oKSAmJiBsYXN0Qm94LT5zdHls
ZSgpLT5kaXNwbGF5KCkgIT0gVEFCTEVfQ0FQVElPTikgewotICAgICAgICAgICAgICAgICAgICBu
ZXh0VG9MYXN0Qm94ID0gbGFzdEJveDsKLSAgICAgICAgICAgICAgICAgICAgbGFzdEJveCA9IGxh
c3RCb3gtPnBhcmVudCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAo
bGFzdEJveCAmJiBsYXN0Qm94LT5pc0Fub255bW91cygpKSB7Ci0gICAgICAgICAgICAgICAgICAg
IGxhc3RCb3gtPmFkZENoaWxkKGNoaWxkLCBuZXh0VG9MYXN0Qm94KTsKLSAgICAgICAgICAgICAg
ICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAg
ICAgIGlmIChiZWZvcmVDaGlsZCAmJiAhYmVmb3JlQ2hpbGQtPmlzVGFibGVTZWN0aW9uKCkpCi0g
ICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmVDaGlsZCA9IDA7Ci0gICAgICAgICAgICAgICAg
ICAgIG8gPSBuZXcgKHJlbmRlckFyZW5hKCkpIFJlbmRlclRhYmxlU2VjdGlvbihkb2N1bWVudCgp
IC8qIGFub255bW91cyAqLyk7Ci0gICAgICAgICAgICAgICAgICAgIFJlbmRlclN0eWxlICpuZXdT
dHlsZSA9IG5ldyAocmVuZGVyQXJlbmEoKSkgUmVuZGVyU3R5bGUoKTsKLSAgICAgICAgICAgICAg
ICAgICAgbmV3U3R5bGUtPmluaGVyaXRGcm9tKHN0eWxlKCkpOwotICAgICAgICAgICAgICAgICAg
ICBuZXdTdHlsZS0+c2V0RGlzcGxheShUQUJMRV9ST1dfR1JPVVApOwotICAgICAgICAgICAgICAg
ICAgICBvLT5zZXRTdHlsZShuZXdTdHlsZSk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZENoaWxk
KG8sIGJlZm9yZUNoaWxkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAg
ICAgICAgICBvLT5hZGRDaGlsZChjaGlsZCk7Ci0gICAgICAgICAgICBjaGlsZC0+c2V0TmVlZHNM
YXlvdXRBbmRNaW5NYXhSZWNhbGMoKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAg
UmVuZGVyQ29udGFpbmVyOjphZGRDaGlsZChjaGlsZCxiZWZvcmVDaGlsZCk7Ci19Ci0KLQotCi12
b2lkIFJlbmRlclRhYmxlOjpjYWxjV2lkdGgoKQotewotICAgIGlmIChpc1Bvc2l0aW9uZWQoKSkK
LSAgICAgICAgY2FsY0Fic29sdXRlSG9yaXpvbnRhbCgpOwotCi0gICAgUmVuZGVyQmxvY2sgKmNi
ID0gY29udGFpbmluZ0Jsb2NrKCk7Ci0gICAgaW50IGF2YWlsYWJsZVdpZHRoID0gY2ItPmNvbnRl
bnRXaWR0aCgpOwotCi0gICAgTGVuZ3RoVHlwZSB3aWR0aFR5cGUgPSBzdHlsZSgpLT53aWR0aCgp
LnR5cGU7Ci0gICAgaWYgKHdpZHRoVHlwZSA+IFJlbGF0aXZlICYmIHN0eWxlKCktPndpZHRoKCku
dmFsdWUgPiAwKSB7Ci0JLy8gUGVyY2VudCBvciBmaXhlZCB0YWJsZQotICAgICAgICBtX3dpZHRo
ID0gc3R5bGUoKS0+d2lkdGgoKS5taW5XaWR0aChhdmFpbGFibGVXaWR0aCk7Ci0gICAgICAgIGlm
IChtX21pbldpZHRoID4gbV93aWR0aCkgbV93aWR0aCA9IG1fbWluV2lkdGg7Ci0gICAgfSBlbHNl
IHsKLSAgICAgICAgLy8gQW4gYXV0byB3aWR0aCB0YWJsZSBzaG91bGQgc2hyaW5rIHRvIGZpdCB3
aXRoaW4gdGhlIGxpbmUgd2lkdGggaWYgbmVjZXNzYXJ5IGluIG9yZGVyIHRvIAotICAgICAgICAv
LyBhdm9pZCBvdmVybGFwcGluZyBmbG9hdHMuCi0gICAgICAgIGF2YWlsYWJsZVdpZHRoID0gY2It
PmxpbmVXaWR0aChtX3kpOwotICAgICAgICAKLSAgICAgICAgLy8gU3VidHJhY3Qgb3V0IGFueSBm
aXhlZCBtYXJnaW5zIGZyb20gb3VyIGF2YWlsYWJsZSB3aWR0aCBmb3IgYXV0byB3aWR0aCB0YWJs
ZXMuCi0gICAgICAgIGludCBtYXJnaW5Ub3RhbCA9IDA7Ci0gICAgICAgIGlmIChzdHlsZSgpLT5t
YXJnaW5MZWZ0KCkudHlwZSAhPSBBdXRvKQotICAgICAgICAgICAgbWFyZ2luVG90YWwgKz0gc3R5
bGUoKS0+bWFyZ2luTGVmdCgpLndpZHRoKGF2YWlsYWJsZVdpZHRoKTsKLSAgICAgICAgaWYgKHN0
eWxlKCktPm1hcmdpblJpZ2h0KCkudHlwZSAhPSBBdXRvKQotICAgICAgICAgICAgbWFyZ2luVG90
YWwgKz0gc3R5bGUoKS0+bWFyZ2luUmlnaHQoKS53aWR0aChhdmFpbGFibGVXaWR0aCk7Ci0gICAg
ICAgICAgICAKLSAgICAgICAgLy8gU3VidHJhY3Qgb3V0IG91ciBtYXJnaW5zIHRvIGdldCB0aGUg
YXZhaWxhYmxlIGNvbnRlbnQgd2lkdGguCi0gICAgICAgIGludCBhdmFpbENvbnRlbnRXaWR0aCA9
IGtNYXgoMCwgYXZhaWxhYmxlV2lkdGggLSBtYXJnaW5Ub3RhbCk7Ci0gICAgICAgIAotICAgICAg
ICAvLyBFbnN1cmUgd2UgYXJlbid0IGJpZ2dlciB0aGFuIG91ciBtYXggd2lkdGggb3Igc21hbGxl
ciB0aGFuIG91ciBtaW4gd2lkdGguCi0gICAgICAgIG1fd2lkdGggPSBrTWluKGF2YWlsQ29udGVu
dFdpZHRoLCBtX21heFdpZHRoKTsKLSAgICB9Ci0gICAgCi0gICAgbV93aWR0aCA9IGtNYXgobV93
aWR0aCwgbV9taW5XaWR0aCk7Ci0KLSAgICAvLyBGaW5hbGx5LCB3aXRoIG91ciB0cnVlIHdpZHRo
IGRldGVybWluZWQsIGNvbXB1dGUgb3VyIG1hcmdpbnMgZm9yIHJlYWwuCi0gICAgbV9tYXJnaW5S
aWdodCA9IDA7Ci0gICAgbV9tYXJnaW5MZWZ0ID0gMDsKLSAgICBjYWxjSG9yaXpvbnRhbE1hcmdp
bnMoc3R5bGUoKS0+bWFyZ2luTGVmdCgpLHN0eWxlKCktPm1hcmdpblJpZ2h0KCksYXZhaWxhYmxl
V2lkdGgpOwotfQotCi12b2lkIFJlbmRlclRhYmxlOjpsYXlvdXQoKQotewotICAgIEtIVE1MQXNz
ZXJ0KG5lZWRzTGF5b3V0KCkpOwotICAgIEtIVE1MQXNzZXJ0KG1pbk1heEtub3duKCkpOwotICAg
IEtIVE1MQXNzZXJ0KCFuZWVkU2VjdGlvblJlY2FsYyk7Ci0KLSAgICBpZiAocG9zQ2hpbGROZWVk
c0xheW91dCgpICYmICFub3JtYWxDaGlsZE5lZWRzTGF5b3V0KCkgJiYgIXNlbGZOZWVkc0xheW91
dCgpKSB7Ci0gICAgICAgIC8vIEFsbCB3ZSBoYXZlIHRvIGlzIGxheSBvdXQgb3VyIHBvc2l0aW9u
ZWQgb2JqZWN0cy4KLSAgICAgICAgbGF5b3V0UG9zaXRpb25lZE9iamVjdHModHJ1ZSk7Ci0gICAg
ICAgIHNldE5lZWRzTGF5b3V0KGZhbHNlKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAg
IEludFJlY3Qgb2xkQm91bmRzLCBvbGRGdWxsQm91bmRzOwotICAgIGJvb2wgY2hlY2tGb3JSZXBh
aW50ID0gY2hlY2tGb3JSZXBhaW50RHVyaW5nTGF5b3V0KCk7Ci0gICAgaWYgKGNoZWNrRm9yUmVw
YWludCkKLSAgICAgICAgZ2V0QWJzb2x1dGVSZXBhaW50UmVjdEluY2x1ZGluZ0Zsb2F0cyhvbGRC
b3VuZHMsIG9sZEZ1bGxCb3VuZHMpOwotICAgIAotICAgIG1faGVpZ2h0ID0gbV9vdmVyZmxvd0hl
aWdodCA9IDA7Ci0gICAgaW5pdE1heE1hcmdpblZhbHVlcygpOwotICAgIAotICAgIC8vaW50IG9s
ZFdpZHRoID0gbV93aWR0aDsKLSAgICBjYWxjV2lkdGgoKTsKLSAgICBtX292ZXJmbG93V2lkdGgg
PSBtX3dpZHRoOwotCi0gICAgLy8gdGhlIG9wdGltaXNhdGlvbiBiZWxvdyBkb2Vzbid0IHdvcmsg
c2luY2UgdGhlIGludGVybmFsIHRhYmxlCi0gICAgLy8gbGF5b3V0IGNvdWxkIGhhdmUgY2hhbmdl
ZC4gIHdlIG5lZWQgdG8gYWRkIGEgZmxhZyB0byB0aGUgdGFibGUKLSAgICAvLyBsYXlvdXQgdGhh
dCB0ZWxscyB1cyBpZiBzb21ldGhpbmcgaGFzIGNoYW5nZWQgaW4gdGhlIG1pbiBtYXgKLSAgICAv
LyBjYWxjdWxhdGlvbnMgdG8gZG8gaXQgY29ycmVjdGx5LgotLy8gICAgIGlmICggb2xkV2lkdGgg
IT0gbV93aWR0aCB8fCBjb2x1bW5zLnNpemUoKSArIDEgIT0gY29sdW1uUG9zLnNpemUoKSApCi0g
ICAgdGFibGVMYXlvdXQtPmxheW91dCgpOwotCi0gICAgc2V0Q2VsbFdpZHRocygpOwotCi0gICAg
Ly8gbGF5b3V0IGNoaWxkIG9iamVjdHMKLSAgICBpbnQgY2FsY3VsYXRlZEhlaWdodCA9IDA7Ci0K
LSAgICBSZW5kZXJPYmplY3QgKmNoaWxkID0gZmlyc3RDaGlsZCgpOwotICAgIHdoaWxlKGNoaWxk
KSB7Ci0JaWYgKGNoaWxkLT5uZWVkc0xheW91dCgpICYmICEoY2hpbGQtPmVsZW1lbnQoKSAmJiBj
aGlsZC0+ZWxlbWVudCgpLT5oYXNUYWdOYW1lKGZvcm1UYWcpKSkKLQkgICAgY2hpbGQtPmxheW91
dCgpOwotCWlmIChjaGlsZC0+aXNUYWJsZVNlY3Rpb24oKSkgewotCSAgICBzdGF0aWNfY2FzdDxS
ZW5kZXJUYWJsZVNlY3Rpb24gKj4oY2hpbGQpLT5jYWxjUm93SGVpZ2h0KCk7Ci0JICAgIGNhbGN1
bGF0ZWRIZWlnaHQgKz0gc3RhdGljX2Nhc3Q8UmVuZGVyVGFibGVTZWN0aW9uICo+KGNoaWxkKS0+
bGF5b3V0Um93cygwKTsKLQl9Ci0JY2hpbGQgPSBjaGlsZC0+bmV4dFNpYmxpbmcoKTsKLSAgICB9
Ci0KLSAgICAvLyAjIyMgY29sbGFwc2UgY2FwdGlvbiBtYXJnaW4KLSAgICBpZiAodENhcHRpb24g
JiYgdENhcHRpb24tPnN0eWxlKCktPmNhcHRpb25TaWRlKCkgIT0gQ0FQQk9UVE9NKSB7Ci0gICAg
ICAgIHRDYXB0aW9uLT5zZXRQb3ModENhcHRpb24tPm1hcmdpbkxlZnQoKSwgbV9oZWlnaHQpOwot
ICAgICAgICBtX2hlaWdodCArPSB0Q2FwdGlvbi0+aGVpZ2h0KCkgKyB0Q2FwdGlvbi0+bWFyZ2lu
VG9wKCkgKyB0Q2FwdGlvbi0+bWFyZ2luQm90dG9tKCk7Ci0gICAgfQotCi0gICAgaW50IGJwVG9w
ID0gYm9yZGVyVG9wKCkgKyAoY29sbGFwc2VCb3JkZXJzKCkgPyAwIDogcGFkZGluZ1RvcCgpKTsK
LSAgICBpbnQgYnBCb3R0b20gPSBib3JkZXJCb3R0b20oKSArIChjb2xsYXBzZUJvcmRlcnMoKSA/
IDAgOiBwYWRkaW5nQm90dG9tKCkpOwotICAgIAotICAgIG1faGVpZ2h0ICs9IGJwVG9wOwotCi0g
ICAgaW50IG9sZEhlaWdodCA9IG1faGVpZ2h0OwotICAgIGNhbGNIZWlnaHQoKTsKLSAgICBpbnQg
bmV3SGVpZ2h0ID0gbV9oZWlnaHQ7Ci0gICAgbV9oZWlnaHQgPSBvbGRIZWlnaHQ7Ci0KLSAgICBM
ZW5ndGggaCA9IHN0eWxlKCktPmhlaWdodCgpOwotICAgIGludCB0aCA9IDA7Ci0gICAgaWYgKGlz
UG9zaXRpb25lZCgpKQotICAgICAgICB0aCA9IG5ld0hlaWdodDsgLy8gRklYTUU6IExlYXZlIHRo
aXMgYWxvbmUgZm9yIG5vdyBidXQgaW52ZXN0aWdhdGUgbGF0ZXIuCi0gICAgZWxzZSBpZiAoaC5p
c0ZpeGVkKCkpCi0gICAgICAgIHRoID0gaC52YWx1ZSAtIChicFRvcCArIGJwQm90dG9tKTsgIC8v
IFRhYmxlcyBzaXplIGFzIHRob3VnaCBDU1MgaGVpZ2h0IGluY2x1ZGVzIGJvcmRlci9wYWRkaW5n
LgotICAgIGVsc2UgaWYgKGguaXNQZXJjZW50KCkpCi0gICAgICAgIHRoID0gY2FsY1BlcmNlbnRh
Z2VIZWlnaHQoaCk7Ci0gICAgdGggPSBrTWF4KDAsIHRoKTsKLQotICAgIC8vIGxheW91dCByb3dz
Ci0gICAgaWYgKHRoID4gY2FsY3VsYXRlZEhlaWdodCkgewotCS8vIHdlIGhhdmUgdG8gcmVkaXN0
cmlidXRlIHRoYXQgaGVpZ2h0IHRvIGdldCB0aGUgY29uc3RyYWludCBjb3JyZWN0bHkKLQkvLyBq
dXN0IGZvcmNlIHRoZSBmaXJzdCBib2R5IHRvIHRoZSBoZWlnaHQgbmVlZGVkCi0JLy8gIyMjIEZJ
WE1FIFRoaXMgc2hvdWxkIHRha2UgaGVpZ2h0IGNvbnN0cmFpbnRzIG9uIGFsbCB0YWJsZSBzZWN0
aW9ucyBpbnRvIGFjY291bnQgYW5kIGRpc3RyaWJ1dGUKLQkvLyBhY2NvcmRpbmdseS4gRm9yIG5v
dyB0aGlzIHNob3VsZCBiZSBnb29kIGVub3VnaAotICAgICAgICBpZiAoZmlyc3RCb2R5KSB7Ci0g
ICAgICAgICAgICBmaXJzdEJvZHktPmNhbGNSb3dIZWlnaHQoKTsKLSAgICAgICAgICAgIGZpcnN0
Qm9keS0+bGF5b3V0Um93cyh0aCAtIGNhbGN1bGF0ZWRIZWlnaHQpOwotICAgICAgICB9Ci0gICAg
ICAgIGVsc2UgaWYgKCFzdHlsZSgpLT5odG1sSGFja3MoKSkgewotICAgICAgICAgICAgLy8gQ29t
cGxldGVseSBlbXB0eSB0YWJsZXMgKHdpdGggbm8gc2VjdGlvbnMgb3IgYW55dGhpbmcpIHNob3Vs
ZCBhdCBsZWFzdCBob25vciBzcGVjaWZpZWQgaGVpZ2h0Ci0gICAgICAgICAgICAvLyBpbiBzdHJp
Y3QgbW9kZS4KLSAgICAgICAgICAgIG1faGVpZ2h0ICs9IHRoOwotICAgICAgICB9Ci0gICAgfQot
ICAgIAotICAgIGludCBibCA9IGJvcmRlckxlZnQoKTsKLSAgICBpZiAoIWNvbGxhcHNlQm9yZGVy
cygpKQotICAgICAgICBibCArPSBwYWRkaW5nTGVmdCgpOwotCi0gICAgLy8gcG9zaXRpb24gdGhl
IHRhYmxlIHNlY3Rpb25zCi0gICAgaWYgKGhlYWQpIHsKLQloZWFkLT5zZXRQb3MoYmwsIG1faGVp
Z2h0KTsKLQltX2hlaWdodCArPSBoZWFkLT5oZWlnaHQoKTsKLSAgICB9Ci0gICAgZm9yIChSZW5k
ZXJPYmplY3QgKmJvZHkgPSBmaXJzdEJvZHk7IGJvZHk7IGJvZHkgPSBib2R5LT5uZXh0U2libGlu
ZygpKSB7Ci0JaWYgKGJvZHkgIT0gaGVhZCAmJiBib2R5ICE9IGZvb3QgJiYgYm9keS0+aXNUYWJs
ZVNlY3Rpb24oKSkgewotCSAgICBib2R5LT5zZXRQb3MoYmwsIG1faGVpZ2h0KTsKLQkgICAgbV9o
ZWlnaHQgKz0gYm9keS0+aGVpZ2h0KCk7Ci0JfQotICAgIH0KLSAgICBpZiAoZm9vdCkgewotCWZv
b3QtPnNldFBvcyhibCwgbV9oZWlnaHQpOwotCW1faGVpZ2h0ICs9IGZvb3QtPmhlaWdodCgpOwot
ICAgIH0KLQotICAgIG1faGVpZ2h0ICs9IGJwQm90dG9tOwotICAgICAgICAgICAgICAgCi0gICAg
aWYgKHRDYXB0aW9uICYmIHRDYXB0aW9uLT5zdHlsZSgpLT5jYXB0aW9uU2lkZSgpPT1DQVBCT1RU
T00pIHsKLSAgICAgICAgdENhcHRpb24tPnNldFBvcyh0Q2FwdGlvbi0+bWFyZ2luTGVmdCgpLCBt
X2hlaWdodCk7Ci0gICAgICAgIG1faGVpZ2h0ICs9IHRDYXB0aW9uLT5oZWlnaHQoKSArIHRDYXB0
aW9uLT5tYXJnaW5Ub3AoKSArIHRDYXB0aW9uLT5tYXJnaW5Cb3R0b20oKTsKLSAgICB9Ci0KLSAg
ICAvLyB0YWJsZSBjYW4gYmUgY29udGFpbmluZyBibG9jayBvZiBwb3NpdGlvbmVkIGVsZW1lbnRz
LgotICAgIC8vICMjIyBvbmx5IHBhc3MgdHJ1ZSBpZiB3aWR0aCBvciBoZWlnaHQgY2hhbmdlZC4K
LSAgICBsYXlvdXRQb3NpdGlvbmVkT2JqZWN0cyggdHJ1ZSApOwotCi0gICAgLy8gUmVwYWludCB3
aXRoIG91ciBuZXcgYm91bmRzIGlmIHRoZXkgYXJlIGRpZmZlcmVudCBmcm9tIG91ciBvbGQgYm91
bmRzLgotICAgIGlmIChjaGVja0ZvclJlcGFpbnQpCi0gICAgICAgIHJlcGFpbnRBZnRlckxheW91
dElmTmVlZGVkKG9sZEJvdW5kcywgb2xkRnVsbEJvdW5kcyk7Ci0gICAgCi0gICAgbV9vdmVyZmxv
d0hlaWdodCA9IGtNYXgobV9vdmVyZmxvd0hlaWdodCwgbV9oZWlnaHQpOwotICAgIG1fb3ZlcmZs
b3dXaWR0aCA9IGtNYXgobV9vdmVyZmxvd1dpZHRoLCBtX3dpZHRoKTsKLQotICAgIHNldE5lZWRz
TGF5b3V0KGZhbHNlKTsKLX0KLQotdm9pZCBSZW5kZXJUYWJsZTo6c2V0Q2VsbFdpZHRocygpCi17
Ci0gICAgZm9yIChSZW5kZXJPYmplY3QgKmNoaWxkID0gZmlyc3RDaGlsZCgpOyBjaGlsZDsgY2hp
bGQgPSBjaGlsZC0+bmV4dFNpYmxpbmcoKSkKLQlpZiAoIGNoaWxkLT5pc1RhYmxlU2VjdGlvbigp
ICkKLQkgICAgc3RhdGljX2Nhc3Q8UmVuZGVyVGFibGVTZWN0aW9uICo+KGNoaWxkKS0+c2V0Q2Vs
bFdpZHRocygpOwotfQotCi12b2lkIFJlbmRlclRhYmxlOjpwYWludChQYWludEluZm8mIGksIGlu
dCBfdHgsIGludCBfdHkpCi17Ci0gICAgX3R4ICs9IHhQb3MoKTsKLSAgICBfdHkgKz0geVBvcygp
OwotCi0gICAgUGFpbnRBY3Rpb24gcGFpbnRBY3Rpb24gPSBpLnBoYXNlOwotICAgIAotICAgIGlu
dCBvcyA9IDIqbWF4aW1hbE91dGxpbmVTaXplKHBhaW50QWN0aW9uKTsKLSAgICBpZiAoKF90eSA+
PSBpLnIueSgpICsgaS5yLmhlaWdodCgpICsgb3MpIHx8IChfdHkgKyBoZWlnaHQoKSA8PSBpLnIu
eSgpIC0gb3MpKQotICAgICAgICByZXR1cm47Ci0gICAgaWYgKChfdHggPj0gaS5yLngoKSArIGku
ci53aWR0aCgpICsgb3MpIHx8IChfdHggKyB3aWR0aCgpIDw9IGkuci54KCkgLSBvcykpCi0gICAg
ICAgIHJldHVybjsKLQotICAgIGlmICgocGFpbnRBY3Rpb24gPT0gUGFpbnRBY3Rpb25CbG9ja0Jh
Y2tncm91bmQgfHwgcGFpbnRBY3Rpb24gPT0gUGFpbnRBY3Rpb25DaGlsZEJsb2NrQmFja2dyb3Vu
ZCkKLSAgICAgICAgJiYgc2hvdWxkUGFpbnRCYWNrZ3JvdW5kT3JCb3JkZXIoKSAmJiBzdHlsZSgp
LT52aXNpYmlsaXR5KCkgPT0gVklTSUJMRSkKLSAgICAgICAgcGFpbnRCb3hEZWNvcmF0aW9ucyhp
LCBfdHgsIF90eSk7Ci0KLSAgICAvLyBXZSdyZSBkb25lLiAgV2UgZG9uJ3QgYm90aGVyIHBhaW50
aW5nIGFueSBjaGlsZHJlbi4KLSAgICBpZiAocGFpbnRBY3Rpb24gPT0gUGFpbnRBY3Rpb25CbG9j
a0JhY2tncm91bmQpCi0gICAgICAgIHJldHVybjsKLSAgICAvLyBXZSBkb24ndCBwYWludCBvdXIg
b3duIGJhY2tncm91bmQsIGJ1dCB3ZSBkbyBsZXQgdGhlIGtpZHMgcGFpbnQgdGhlaXIgYmFja2dy
b3VuZHMuCi0gICAgaWYgKHBhaW50QWN0aW9uID09IFBhaW50QWN0aW9uQ2hpbGRCbG9ja0JhY2tn
cm91bmRzKQotICAgICAgICBwYWludEFjdGlvbiA9IFBhaW50QWN0aW9uQ2hpbGRCbG9ja0JhY2tn
cm91bmQ7Ci0gICAgUGFpbnRJbmZvIHBhaW50SW5mbyhpLnAsIGkuciwgcGFpbnRBY3Rpb24sIHBh
aW50aW5nUm9vdEZvckNoaWxkcmVuKGkpKTsKLSAgICAKLSAgICBmb3IgKFJlbmRlck9iamVjdCAq
Y2hpbGQgPSBmaXJzdENoaWxkKCk7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0U2libGluZygp
KQotICAgICAgICBpZiAoY2hpbGQtPmlzVGFibGVTZWN0aW9uKCkgfHwgY2hpbGQgPT0gdENhcHRp
b24pCi0JICAgIGNoaWxkLT5wYWludChwYWludEluZm8sIF90eCwgX3R5KTsKLQotICAgIGlmIChj
b2xsYXBzZUJvcmRlcnMoKSAmJiBwYWludEFjdGlvbiA9PSBQYWludEFjdGlvbkNoaWxkQmxvY2tC
YWNrZ3JvdW5kICYmIHN0eWxlKCktPnZpc2liaWxpdHkoKSA9PSBWSVNJQkxFKSB7Ci0gICAgICAg
IC8vIENvbGxlY3QgYWxsIHRoZSB1bmlxdWUgYm9yZGVyIHN0eWxlcyB0aGF0IHdlIHdhbnQgdG8g
cGFpbnQgaW4gYSBzb3J0ZWQgbGlzdC4gIE9uY2Ugd2UKLSAgICAgICAgLy8gaGF2ZSBhbGwgdGhl
IHN0eWxlcyBzb3J0ZWQsIHdlIHRoZW4gZG8gaW5kaXZpZHVhbCBwYXNzZXMsIHBhaW50aW5nIGVh
Y2ggc3R5bGUgb2YgYm9yZGVyCi0gICAgICAgIC8vIGZyb20gbG93ZXN0IHByZWNlZGVuY2UgdG8g
aGlnaGVzdCBwcmVjZWRlbmNlLgotICAgICAgICBwYWludEluZm8ucGhhc2UgPSBQYWludEFjdGlv
bkNvbGxhcHNlZFRhYmxlQm9yZGVyczsKLSAgICAgICAgUVZhbHVlTGlzdDxDb2xsYXBzZWRCb3Jk
ZXJWYWx1ZT4gYm9yZGVyU3R5bGVzOwotICAgICAgICBjb2xsZWN0Qm9yZGVycyhib3JkZXJTdHls
ZXMpOwotICAgICAgICBRVmFsdWVMaXN0SXRlcmF0b3I8Q29sbGFwc2VkQm9yZGVyVmFsdWU+IGl0
ID0gYm9yZGVyU3R5bGVzLmJlZ2luKCk7Ci0gICAgICAgIFFWYWx1ZUxpc3RJdGVyYXRvcjxDb2xs
YXBzZWRCb3JkZXJWYWx1ZT4gZW5kID0gYm9yZGVyU3R5bGVzLmVuZCgpOwotICAgICAgICBmb3Ig
KDsgaXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgICAgICAgICBtX2N1cnJlbnRCb3JkZXIgPSAmKCpp
dCk7Ci0gICAgICAgICAgICBmb3IgKFJlbmRlck9iamVjdCogY2hpbGQgPSBmaXJzdENoaWxkKCk7
IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0U2libGluZygpKQotICAgICAgICAgICAgICAgIGlm
IChjaGlsZC0+aXNUYWJsZVNlY3Rpb24oKSkKLSAgICAgICAgICAgICAgICAgICAgY2hpbGQtPnBh
aW50KHBhaW50SW5mbywgX3R4LCBfdHkpOwotICAgICAgICB9Ci0gICAgfQotICAgICAgICAKLSNp
ZmRlZiBCT1hfREVCVUcKLSAgICBvdXRsaW5lQm94KGkucCwgX3R4LCBfdHksICJibHVlIik7Ci0j
ZW5kaWYKLX0KLQotdm9pZCBSZW5kZXJUYWJsZTo6cGFpbnRCb3hEZWNvcmF0aW9ucyhQYWludElu
Zm8mIGksIGludCBfdHgsIGludCBfdHkpCi17Ci0gICAgaW50IHcgPSB3aWR0aCgpOwotICAgIGlu
dCBoID0gaGVpZ2h0KCk7Ci0gICAgCi0gICAgLy8gQWNjb3VudCBmb3IgdGhlIGNhcHRpb24uCi0g
ICAgaWYgKHRDYXB0aW9uKSB7Ci0gICAgICAgIGludCBjYXB0aW9uSGVpZ2h0ID0gKHRDYXB0aW9u
LT5oZWlnaHQoKSArIHRDYXB0aW9uLT5tYXJnaW5Cb3R0b20oKSArICB0Q2FwdGlvbi0+bWFyZ2lu
VG9wKCkpOwotICAgICAgICBoIC09IGNhcHRpb25IZWlnaHQ7Ci0gICAgICAgIGlmICh0Q2FwdGlv
bi0+c3R5bGUoKS0+Y2FwdGlvblNpZGUoKSAhPSBDQVBCT1RUT00pCi0gICAgICAgICAgICBfdHkg
Kz0gY2FwdGlvbkhlaWdodDsKLSAgICB9Ci0KLSAgICBpbnQgbXkgPSBrTWF4KF90eSwgaS5yLnko
KSk7Ci0gICAgaW50IG1oOwotICAgIGlmIChfdHkgPCBpLnIueSgpKQotICAgICAgICBtaD0ga01h
eCgwLCBoIC0gKGkuci55KCkgLSBfdHkpKTsKLSAgICBlbHNlCi0gICAgICAgIG1oID0ga01pbihp
LnIuaGVpZ2h0KCksIGgpOwotICAgIAotICAgIHBhaW50QmFja2dyb3VuZChpLnAsIHN0eWxlKCkt
PmJhY2tncm91bmRDb2xvcigpLCBzdHlsZSgpLT5iYWNrZ3JvdW5kTGF5ZXJzKCksIG15LCBtaCwg
X3R4LCBfdHksIHcsIGgpOwotICAgIAotICAgIGlmIChzdHlsZSgpLT5oYXNCb3JkZXIoKSAmJiAh
Y29sbGFwc2VCb3JkZXJzKCkpCi0gICAgICAgIHBhaW50Qm9yZGVyKGkucCwgX3R4LCBfdHksIHcs
IGgsIHN0eWxlKCkpOwotfQotCi12b2lkIFJlbmRlclRhYmxlOjpjYWxjTWluTWF4V2lkdGgoKQot
ewotICAgIEtIVE1MQXNzZXJ0KCFtaW5NYXhLbm93bigpKTsKLQotICAgIGlmIChuZWVkU2VjdGlv
blJlY2FsYykKLQlyZWNhbGNTZWN0aW9ucygpOwotCi0gICAgdGFibGVMYXlvdXQtPmNhbGNNaW5N
YXhXaWR0aCgpOwotCi0gICAgaWYgKHRDYXB0aW9uICYmIHRDYXB0aW9uLT5taW5XaWR0aCgpID4g
bV9taW5XaWR0aCkKLSAgICAgICAgbV9taW5XaWR0aCA9IHRDYXB0aW9uLT5taW5XaWR0aCgpOwot
Ci0gICAgc2V0TWluTWF4S25vd24oKTsKLX0KLQotdm9pZCBSZW5kZXJUYWJsZTo6c3BsaXRDb2x1
bW4oaW50IHBvcywgaW50IGZpcnN0U3BhbikKLXsKLSAgICAvLyB3ZSBuZWVkIHRvIGFkZCBhIG5l
dyBjb2x1bW5TdHJ1Y3QKLSAgICBpbnQgb2xkU2l6ZSA9IGNvbHVtbnMuc2l6ZSgpOwotICAgIGNv
bHVtbnMucmVzaXplKG9sZFNpemUgKyAxKTsKLSAgICBpbnQgb2xkU3BhbiA9IGNvbHVtbnNbcG9z
XS5zcGFuOwotLy8gICAgIHFEZWJ1Zygic3BsaXRDb2x1bW4oICVkLCVkICksIG9sZFNpemU9JWQs
IG9sZFNwYW49JWQiLCBwb3MsIGZpcnN0U3Bhbiwgb2xkU2l6ZSwgb2xkU3BhbiApOwotICAgIEtI
VE1MQXNzZXJ0KG9sZFNwYW4gPiBmaXJzdFNwYW4pOwotICAgIGNvbHVtbnNbcG9zXS5zcGFuID0g
Zmlyc3RTcGFuOwotICAgIG1lbW1vdmUoY29sdW1ucy5kYXRhKCkgKyBwb3MgKyAxLCBjb2x1bW5z
LmRhdGEoKSArIHBvcywgKG9sZFNpemUtcG9zKSpzaXplb2YoQ29sdW1uU3RydWN0KSk7Ci0gICAg
Y29sdW1uc1twb3MrMV0uc3BhbiA9IG9sZFNwYW4gLSBmaXJzdFNwYW47Ci0KLSAgICAvLyBjaGFu
Z2Ugd2lkdGggb2YgYWxsIHJvd3MuCi0gICAgZm9yIChSZW5kZXJPYmplY3QgKmNoaWxkID0gZmly
c3RDaGlsZCgpOyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4dFNpYmxpbmcoKSkgewotCWlmIChj
aGlsZC0+aXNUYWJsZVNlY3Rpb24oKSkgewotCSAgICBSZW5kZXJUYWJsZVNlY3Rpb24gKnNlY3Rp
b24gPSBzdGF0aWNfY2FzdDxSZW5kZXJUYWJsZVNlY3Rpb24gKj4oY2hpbGQpOwotCSAgICBpZiAo
c2VjdGlvbi0+Y0NvbCA+IHBvcykKLQkJc2VjdGlvbi0+Y0NvbCsrOwotCSAgICBpbnQgc2l6ZSA9
IHNlY3Rpb24tPm51bVJvd3MoKTsKLQkgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgc2l6ZTsg
Kytyb3cpIHsKLQkJc2VjdGlvbi0+Z3JpZFtyb3ddLnJvdy0+cmVzaXplKG9sZFNpemUgKyAxKTsK
LQkJUmVuZGVyVGFibGVTZWN0aW9uOjpSb3cgJnIgPSAqc2VjdGlvbi0+Z3JpZFtyb3ddLnJvdzsK
LQkJbWVtbW92ZShyLmRhdGEoKSArIHBvcyArIDEsIHIuZGF0YSgpICsgcG9zLCAob2xkU2l6ZSAt
IHBvcykgKiBzaXplb2YoUmVuZGVyVGFibGVTZWN0aW9uOjpDZWxsU3RydWN0KSk7Ci0JCXJbcG9z
ICsgMV0uY2VsbCA9IDA7Ci0gICAgICAgICAgICAgICAgcltwb3MgKyAxXS5pbkNvbFNwYW4gPSBy
W3Bvc10uaW5Db2xTcGFuIHx8IHJbcG9zXS5jZWxsOwotCSAgICB9Ci0JfQotICAgIH0KLSAgICBj
b2x1bW5Qb3MucmVzaXplKG51bUVmZkNvbHMoKSArIDEpOwotICAgIHNldE5lZWRzTGF5b3V0QW5k
TWluTWF4UmVjYWxjKCk7Ci19Ci0KLXZvaWQgUmVuZGVyVGFibGU6OmFwcGVuZENvbHVtbihpbnQg
c3BhbikKLXsKLSAgICAvLyBlYXN5IGNhc2UuCi0gICAgaW50IHBvcyA9IGNvbHVtbnMuc2l6ZSgp
OwotICAgIGludCBuZXdTaXplID0gcG9zICsgMTsKLSAgICBjb2x1bW5zLnJlc2l6ZShuZXdTaXpl
KTsKLSAgICBjb2x1bW5zW3Bvc10uc3BhbiA9IHNwYW47Ci0KLSAgICAvLyBjaGFuZ2Ugd2lkdGgg
b2YgYWxsIHJvd3MuCi0gICAgZm9yIChSZW5kZXJPYmplY3QgKmNoaWxkID0gZmlyc3RDaGlsZCgp
OyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4dFNpYmxpbmcoKSkgewotCWlmIChjaGlsZC0+aXNU
YWJsZVNlY3Rpb24oKSkgewotCSAgICBSZW5kZXJUYWJsZVNlY3Rpb24gKnNlY3Rpb24gPSBzdGF0
aWNfY2FzdDxSZW5kZXJUYWJsZVNlY3Rpb24gKj4oY2hpbGQpOwotCSAgICBpbnQgc2l6ZSA9IHNl
Y3Rpb24tPm51bVJvd3MoKTsKLQkgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgc2l6ZTsgKyty
b3cpIHsKLQkJc2VjdGlvbi0+Z3JpZFtyb3ddLnJvdy0+cmVzaXplKG5ld1NpemUpOwotICAgICAg
ICAgICAgICAgIFJlbmRlclRhYmxlU2VjdGlvbjo6Q2VsbFN0cnVjdCYgYyA9IHNlY3Rpb24tPmNl
bGxBdChyb3csIHBvcyk7Ci0JCWMuY2VsbCA9IDA7Ci0JCWMuaW5Db2xTcGFuID0gZmFsc2U7Ci0J
ICAgIH0KLQl9Ci0gICAgfQotICAgIGNvbHVtblBvcy5yZXNpemUobnVtRWZmQ29scygpICsgMSk7
Ci0gICAgc2V0TmVlZHNMYXlvdXRBbmRNaW5NYXhSZWNhbGMoKTsKLX0KLQotUmVuZGVyVGFibGVD
b2wgKlJlbmRlclRhYmxlOjpjb2xFbGVtZW50KGludCBjb2wpIHsKLSAgICBpZiAoIWhhc19jb2xf
ZWxlbXMpCi0JcmV0dXJuIDA7Ci0gICAgUmVuZGVyT2JqZWN0ICpjaGlsZCA9IGZpcnN0Q2hpbGQo
KTsKLSAgICBpbnQgY0NvbCA9IDA7Ci0gICAgd2hpbGUgKGNoaWxkKSB7Ci0JaWYgKGNoaWxkLT5p
c1RhYmxlQ29sKCkpIHsKLQkgICAgUmVuZGVyVGFibGVDb2wgKmNvbEVsZW0gPSBzdGF0aWNfY2Fz
dDxSZW5kZXJUYWJsZUNvbCAqPihjaGlsZCk7Ci0JICAgIGludCBzcGFuID0gY29sRWxlbS0+c3Bh
bigpOwotCSAgICBpZiAoIWNvbEVsZW0tPmZpcnN0Q2hpbGQoKSkgewotCQljQ29sICs9IHNwYW47
Ci0JCWlmIChjQ29sID4gY29sKQotCQkgICAgcmV0dXJuIGNvbEVsZW07Ci0JICAgIH0KLQotCSAg
ICBSZW5kZXJPYmplY3QgKm5leHQgPSBjaGlsZC0+Zmlyc3RDaGlsZCgpOwotCSAgICBpZiAoIW5l
eHQpCi0JCW5leHQgPSBjaGlsZC0+bmV4dFNpYmxpbmcoKTsKLQkgICAgaWYgKCFuZXh0ICYmIGNo
aWxkLT5wYXJlbnQoKS0+aXNUYWJsZUNvbCgpKQotCQluZXh0ID0gY2hpbGQtPnBhcmVudCgpLT5u
ZXh0U2libGluZygpOwotCSAgICBjaGlsZCA9IG5leHQ7Ci0JfSBlbHNlIGlmIChjaGlsZCA9PSB0
Q2FwdGlvbikKLSAgICAgICAgICAgIGNoaWxkID0gY2hpbGQtPm5leHRTaWJsaW5nKCk7Ci0gICAg
ICAgIGVsc2UKLQkgICAgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi12b2lkIFJl
bmRlclRhYmxlOjpyZWNhbGNTZWN0aW9ucygpCi17Ci0gICAgdENhcHRpb24gPSAwOwotICAgIGhl
YWQgPSBmb290ID0gZmlyc3RCb2R5ID0gMDsKLSAgICBoYXNfY29sX2VsZW1zID0gZmFsc2U7Ci0K
LSAgICAvLyBXZSBuZWVkIHRvIGdldCB2YWxpZCBwb2ludGVycyB0byBjYXB0aW9uLCBoZWFkLCBm
b290IGFuZCBmaXJzdGJvZHkgYWdhaW4KLSAgICBmb3IgKFJlbmRlck9iamVjdCAqY2hpbGQgPSBm
aXJzdENoaWxkKCk7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0U2libGluZygpKSB7Ci0Jc3dp
dGNoIChjaGlsZC0+c3R5bGUoKS0+ZGlzcGxheSgpKSB7Ci0gICAgICAgICAgICBjYXNlIFRBQkxF
X0NBUFRJT046Ci0gICAgICAgICAgICAgICAgaWYgKCF0Q2FwdGlvbikgewotICAgICAgICAgICAg
ICAgICAgICB0Q2FwdGlvbiA9IHN0YXRpY19jYXN0PFJlbmRlckJsb2NrKj4oY2hpbGQpOwotICAg
ICAgICAgICAgICAgICAgICB0Q2FwdGlvbi0+c2V0TmVlZHNMYXlvdXQodHJ1ZSk7Ci0gICAgICAg
ICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBUQUJM
RV9DT0xVTU46Ci0gICAgICAgICAgICBjYXNlIFRBQkxFX0NPTFVNTl9HUk9VUDoKLSAgICAgICAg
ICAgICAgICBoYXNfY29sX2VsZW1zID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAg
ICAgICAgICAgIGNhc2UgVEFCTEVfSEVBREVSX0dST1VQOiB7Ci0gICAgICAgICAgICAgICAgUmVu
ZGVyVGFibGVTZWN0aW9uICpzZWN0aW9uID0gc3RhdGljX2Nhc3Q8UmVuZGVyVGFibGVTZWN0aW9u
ICo+KGNoaWxkKTsKLSAgICAgICAgICAgICAgICBpZiAoIWhlYWQpCi0gICAgICAgICAgICAgICAg
ICAgIGhlYWQgPSBzZWN0aW9uOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFmaXJzdEJvZHkp
Ci0gICAgICAgICAgICAgICAgICAgIGZpcnN0Qm9keSA9IHNlY3Rpb247Ci0gICAgICAgICAgICAg
ICAgaWYgKHNlY3Rpb24tPm5lZWRDZWxsUmVjYWxjKQotICAgICAgICAgICAgICAgICAgICBzZWN0
aW9uLT5yZWNhbGNDZWxscygpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAg
fQotICAgICAgICAgICAgY2FzZSBUQUJMRV9GT09URVJfR1JPVVA6IHsKLSAgICAgICAgICAgICAg
ICBSZW5kZXJUYWJsZVNlY3Rpb24gKnNlY3Rpb24gPSBzdGF0aWNfY2FzdDxSZW5kZXJUYWJsZVNl
Y3Rpb24gKj4oY2hpbGQpOwotICAgICAgICAgICAgICAgIGlmICghZm9vdCkKLSAgICAgICAgICAg
ICAgICAgICAgZm9vdCA9IHNlY3Rpb247Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIWZpcnN0
Qm9keSkKLSAgICAgICAgICAgICAgICAgICAgZmlyc3RCb2R5ID0gc2VjdGlvbjsKLSAgICAgICAg
ICAgICAgICBpZiAoc2VjdGlvbi0+bmVlZENlbGxSZWNhbGMpCi0gICAgICAgICAgICAgICAgICAg
IHNlY3Rpb24tPnJlY2FsY0NlbGxzKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAg
ICAgICB9Ci0gICAgICAgICAgICBjYXNlIFRBQkxFX1JPV19HUk9VUDogewotICAgICAgICAgICAg
ICAgIFJlbmRlclRhYmxlU2VjdGlvbiAqc2VjdGlvbiA9IHN0YXRpY19jYXN0PFJlbmRlclRhYmxl
U2VjdGlvbiAqPihjaGlsZCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFmaXJzdEJvZHkpCi0gICAg
ICAgICAgICAgICAgICAgIGZpcnN0Qm9keSA9IHNlY3Rpb247Ci0gICAgICAgICAgICAgICAgaWYg
KHNlY3Rpb24tPm5lZWRDZWxsUmVjYWxjKQotICAgICAgICAgICAgICAgICAgICBzZWN0aW9uLT5y
ZWNhbGNDZWxscygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAg
ICAgICAgICAgICBicmVhazsKLQl9Ci0gICAgfQotICAgIG5lZWRTZWN0aW9uUmVjYWxjID0gZmFs
c2U7Ci0gICAgc2V0TmVlZHNMYXlvdXQodHJ1ZSk7Ci19Ci0KLVJlbmRlck9iamVjdCogUmVuZGVy
VGFibGU6OnJlbW92ZUNoaWxkTm9kZShSZW5kZXJPYmplY3QqIGNoaWxkKQotewotICAgIHNldE5l
ZWRTZWN0aW9uUmVjYWxjKCk7Ci0gICAgcmV0dXJuIFJlbmRlckNvbnRhaW5lcjo6cmVtb3ZlQ2hp
bGROb2RlKGNoaWxkKTsKLX0KLQotaW50IFJlbmRlclRhYmxlOjpib3JkZXJMZWZ0KCkgY29uc3QK
LXsKLSAgICBpZiAoY29sbGFwc2VCb3JkZXJzKCkpIHsKLSAgICAgICAgLy8gRklYTUU6IEZvciBz
dHJpY3QgbW9kZSwgcmV0dXJuaW5nIDAgaXMgY29ycmVjdCwgc2luY2UgdGhlIHRhYmxlIGJvcmRl
ciBoYWxmIHNwaWxscyBpbnRvIHRoZSBtYXJnaW4sCi0gICAgICAgIC8vIGJ1dCBJJ20gd29ya2lu
ZyB0byBnZXQgdGhpcyBjaGFuZ2VkLiAgRm9yIG5vdywgZm9sbG93IHRoZSBzcGVjLgotICAgICAg
ICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIFJlbmRlckJsb2NrOjpib3JkZXJMZWZ0KCk7
Ci19Ci0gICAgCi1pbnQgUmVuZGVyVGFibGU6OmJvcmRlclJpZ2h0KCkgY29uc3QKLXsKLSAgICBp
ZiAoY29sbGFwc2VCb3JkZXJzKCkpIHsKLSAgICAgICAgLy8gRklYTUU6IEZvciBzdHJpY3QgbW9k
ZSwgcmV0dXJuaW5nIDAgaXMgY29ycmVjdCwgc2luY2UgdGhlIHRhYmxlIGJvcmRlciBoYWxmIHNw
aWxscyBpbnRvIHRoZSBtYXJnaW4sCi0gICAgICAgIC8vIGJ1dCBJJ20gd29ya2luZyB0byBnZXQg
dGhpcyBjaGFuZ2VkLiAgRm9yIG5vdywgZm9sbG93IHRoZSBzcGVjLgotICAgICAgICByZXR1cm4g
MDsKLSAgICB9Ci0gICAgcmV0dXJuIFJlbmRlckJsb2NrOjpib3JkZXJSaWdodCgpOwotfQotCi1p
bnQgUmVuZGVyVGFibGU6OmJvcmRlclRvcCgpIGNvbnN0Ci17Ci0gICAgaWYgKGNvbGxhcHNlQm9y
ZGVycygpKSB7Ci0gICAgICAgIC8vIEZJWE1FOiBGb3Igc3RyaWN0IG1vZGUsIHJldHVybmluZyAw
IGlzIGNvcnJlY3QsIHNpbmNlIHRoZSB0YWJsZSBib3JkZXIgaGFsZiBzcGlsbHMgaW50byB0aGUg
bWFyZ2luLAotICAgICAgICAvLyBidXQgSSdtIHdvcmtpbmcgdG8gZ2V0IHRoaXMgY2hhbmdlZC4g
IEZvciBub3csIGZvbGxvdyB0aGUgc3BlYy4KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAg
IHJldHVybiBSZW5kZXJCbG9jazo6Ym9yZGVyVG9wKCk7Ci19Ci0KLWludCBSZW5kZXJUYWJsZTo6
Ym9yZGVyQm90dG9tKCkgY29uc3QKLXsKLSAgICBpZiAoY29sbGFwc2VCb3JkZXJzKCkpIHsKLSAg
ICAgICAgLy8gRklYTUU6IEZvciBzdHJpY3QgbW9kZSwgcmV0dXJuaW5nIDAgaXMgY29ycmVjdCwg
c2luY2UgdGhlIHRhYmxlIGJvcmRlciBoYWxmIHNwaWxscyBpbnRvIHRoZSBtYXJnaW4sCi0gICAg
ICAgIC8vIGJ1dCBJJ20gd29ya2luZyB0byBnZXQgdGhpcyBjaGFuZ2VkLiAgRm9yIG5vdywgZm9s
bG93IHRoZSBzcGVjLgotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIFJlbmRl
ckJsb2NrOjpib3JkZXJCb3R0b20oKTsKLX0KLQotUmVuZGVyVGFibGVDZWxsKiBSZW5kZXJUYWJs
ZTo6Y2VsbEFib3ZlKGNvbnN0IFJlbmRlclRhYmxlQ2VsbCogY2VsbCkgY29uc3QKLXsKLSAgICAv
LyBGaW5kIHRoZSBzZWN0aW9uIGFuZCByb3cgdG8gbG9vayBpbgotICAgIGludCByID0gY2VsbC0+
cm93KCk7Ci0gICAgUmVuZGVyVGFibGVTZWN0aW9uKiBzZWN0aW9uID0gMDsKLSAgICBpbnQgckFi
b3ZlID0gLTE7Ci0gICAgaWYgKHIgPiAwKSB7Ci0gICAgICAgIC8vIGNlbGwgaXMgbm90IGluIHRo
ZSBmaXJzdCByb3csIHNvIHVzZSB0aGUgYWJvdmUgcm93IGluIGl0cyBvd24gc2VjdGlvbgotICAg
ICAgICBzZWN0aW9uID0gY2VsbC0+c2VjdGlvbigpOwotICAgICAgICByQWJvdmUgPSByLTE7Ci0g
ICAgfSBlbHNlIHsKLSAgICAgICAgLy8gY2VsbCBpcyBhdCB0b3Agb2YgYSBzZWN0aW9uLCB1c2Ug
bGFzdCByb3cgaW4gcHJldmlvdXMgc2VjdGlvbgotICAgICAgICBmb3IgKFJlbmRlck9iamVjdCAq
cHJldlNlY3Rpb24gPSBjZWxsLT5zZWN0aW9uKCktPnByZXZpb3VzU2libGluZygpOwotICAgICAg
ICAgICAgIHByZXZTZWN0aW9uICYmIHJBYm92ZSA8IDA7Ci0gICAgICAgICAgICAgcHJldlNlY3Rp
b24gPSBwcmV2U2VjdGlvbi0+cHJldmlvdXNTaWJsaW5nKCkpIHsKLSAgICAgICAgICAgIGlmIChw
cmV2U2VjdGlvbi0+aXNUYWJsZVNlY3Rpb24oKSkgewotICAgICAgICAgICAgICAgIHNlY3Rpb24g
PSBzdGF0aWNfY2FzdDxSZW5kZXJUYWJsZVNlY3Rpb24gKj4ocHJldlNlY3Rpb24pOwotICAgICAg
ICAgICAgICAgIGlmIChzZWN0aW9uLT5udW1Sb3dzKCkgPiAwKQotICAgICAgICAgICAgICAgICAg
ICByQWJvdmUgPSBzZWN0aW9uLT5udW1Sb3dzKCktMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAg
fQotICAgIH0KLQotICAgIC8vIExvb2sgdXAgdGhlIGNlbGwgaW4gdGhlIHNlY3Rpb24ncyBncmlk
LCB3aGljaCByZXF1aXJlcyBlZmZlY3RpdmUgY29sIGluZGV4Ci0gICAgaWYgKHNlY3Rpb24gJiYg
ckFib3ZlID49IDApIHsKLSAgICAgICAgaW50IGVmZkNvbCA9IGNvbFRvRWZmQ29sKGNlbGwtPmNv
bCgpKTsKLSAgICAgICAgUmVuZGVyVGFibGVTZWN0aW9uOjpDZWxsU3RydWN0IGFib3ZlQ2VsbDsK
LSAgICAgICAgLy8gSWYgd2UgaGl0IGEgc3BhbiBiYWNrIHVwIHRvIGEgcmVhbCBjZWxsLgotICAg
ICAgICBkbyB7Ci0gICAgICAgICAgICBhYm92ZUNlbGwgPSBzZWN0aW9uLT5jZWxsQXQockFib3Zl
LCBlZmZDb2wpOwotICAgICAgICAgICAgZWZmQ29sLS07Ci0gICAgICAgIH0gd2hpbGUgKCFhYm92
ZUNlbGwuY2VsbCAmJiBhYm92ZUNlbGwuaW5Db2xTcGFuICYmIGVmZkNvbCA+PTApOwotICAgICAg
ICByZXR1cm4gYWJvdmVDZWxsLmNlbGw7Ci0gICAgfSBlbHNlCi0gICAgICAgIHJldHVybiAwOwot
fQotCi1SZW5kZXJUYWJsZUNlbGwqIFJlbmRlclRhYmxlOjpjZWxsQmVsb3coY29uc3QgUmVuZGVy
VGFibGVDZWxsKiBjZWxsKSBjb25zdAotewotICAgIC8vIEZpbmQgdGhlIHNlY3Rpb24gYW5kIHJv
dyB0byBsb29rIGluCi0gICAgaW50IHIgPSBjZWxsLT5yb3coKSArIGNlbGwtPnJvd1NwYW4oKSAt
IDE7Ci0gICAgUmVuZGVyVGFibGVTZWN0aW9uKiBzZWN0aW9uID0gMDsKLSAgICBpbnQgckJlbG93
ID0gLTE7Ci0gICAgaWYgKHIgPCBjZWxsLT5zZWN0aW9uKCktPm51bVJvd3MoKSAtIDEpIHsKLSAg
ICAgICAgLy8gVGhlIGNlbGwgaXMgbm90IGluIHRoZSBsYXN0IHJvdywgc28gdXNlIHRoZSBuZXh0
IHJvdyBpbiB0aGUgc2VjdGlvbi4KLSAgICAgICAgc2VjdGlvbiA9IGNlbGwtPnNlY3Rpb24oKTsK
LSAgICAgICAgckJlbG93PSByKzE7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gVGhlIGNlbGwg
aXMgYXQgdGhlIGJvdHRvbSBvZiBhIHNlY3Rpb24uIFVzZSB0aGUgZmlyc3Qgcm93IGluIHRoZSBu
ZXh0IHNlY3Rpb24uCi0gICAgICAgIGZvciAoUmVuZGVyT2JqZWN0KiBuZXh0U2VjdGlvbiA9IGNl
bGwtPnNlY3Rpb24oKS0+bmV4dFNpYmxpbmcoKTsKLSAgICAgICAgICAgICBuZXh0U2VjdGlvbiAm
JiByQmVsb3cgPCAwOwotICAgICAgICAgICAgIG5leHRTZWN0aW9uID0gbmV4dFNlY3Rpb24tPm5l
eHRTaWJsaW5nKCkpIHsKLSAgICAgICAgICAgIGlmIChuZXh0U2VjdGlvbi0+aXNUYWJsZVNlY3Rp
b24oKSkgewotICAgICAgICAgICAgICAgIHNlY3Rpb24gPSBzdGF0aWNfY2FzdDxSZW5kZXJUYWJs
ZVNlY3Rpb24gKj4obmV4dFNlY3Rpb24pOwotICAgICAgICAgICAgICAgIGlmIChzZWN0aW9uLT5u
dW1Sb3dzKCkgPiAwKQotICAgICAgICAgICAgICAgICAgICByQmVsb3cgPSAwOwotICAgICAgICAg
ICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8vIExvb2sgdXAgdGhlIGNlbGwgaW4g
dGhlIHNlY3Rpb24ncyBncmlkLCB3aGljaCByZXF1aXJlcyBlZmZlY3RpdmUgY29sIGluZGV4Ci0g
ICAgaWYgKHNlY3Rpb24gJiYgckJlbG93ID49IDApIHsKLSAgICAgICAgaW50IGVmZkNvbCA9IGNv
bFRvRWZmQ29sKGNlbGwtPmNvbCgpKTsKLSAgICAgICAgUmVuZGVyVGFibGVTZWN0aW9uOjpDZWxs
U3RydWN0IGJlbG93Q2VsbDsKLSAgICAgICAgLy8gSWYgd2UgaGl0IGEgY29sc3BhbiBiYWNrIHVw
IHRvIGEgcmVhbCBjZWxsLgotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBiZWxvd0NlbGwgPSBz
ZWN0aW9uLT5jZWxsQXQockJlbG93LCBlZmZDb2wpOwotICAgICAgICAgICAgZWZmQ29sLS07Ci0g
ICAgICAgIH0gd2hpbGUgKCFiZWxvd0NlbGwuY2VsbCAmJiBiZWxvd0NlbGwuaW5Db2xTcGFuICYm
IGVmZkNvbCA+PTApOwotICAgICAgICByZXR1cm4gYmVsb3dDZWxsLmNlbGw7Ci0gICAgfSBlbHNl
Ci0gICAgICAgIHJldHVybiAwOwotfQotCi1SZW5kZXJUYWJsZUNlbGwqIFJlbmRlclRhYmxlOjpj
ZWxsTGVmdChjb25zdCBSZW5kZXJUYWJsZUNlbGwqIGNlbGwpIGNvbnN0Ci17Ci0gICAgUmVuZGVy
VGFibGVTZWN0aW9uKiBzZWN0aW9uID0gY2VsbC0+c2VjdGlvbigpOwotICAgIGludCBlZmZDb2wg
PSBjb2xUb0VmZkNvbChjZWxsLT5jb2woKSk7Ci0gICAgaWYgKGVmZkNvbCA9PSAwKQotICAgICAg
ICByZXR1cm4gMDsKLSAgICAKLSAgICAvLyBJZiB3ZSBoaXQgYSBjb2xzcGFuIGJhY2sgdXAgdG8g
YSByZWFsIGNlbGwuCi0gICAgUmVuZGVyVGFibGVTZWN0aW9uOjpDZWxsU3RydWN0IHByZXZDZWxs
OwotICAgIGRvIHsKLSAgICAgICAgcHJldkNlbGwgPSBzZWN0aW9uLT5jZWxsQXQoY2VsbC0+cm93
KCksIGVmZkNvbC0xKTsKLSAgICAgICAgZWZmQ29sLS07Ci0gICAgfSB3aGlsZSAoIXByZXZDZWxs
LmNlbGwgJiYgcHJldkNlbGwuaW5Db2xTcGFuICYmIGVmZkNvbCA+PTApOwotICAgIHJldHVybiBw
cmV2Q2VsbC5jZWxsOwotfQotCi1SZW5kZXJUYWJsZUNlbGwqIFJlbmRlclRhYmxlOjpjZWxsUmln
aHQoY29uc3QgUmVuZGVyVGFibGVDZWxsKiBjZWxsKSBjb25zdAotewotICAgIGludCBlZmZDb2wg
PSBjb2xUb0VmZkNvbChjZWxsLT5jb2woKSArIGNlbGwtPmNvbFNwYW4oKSk7Ci0gICAgaWYgKGVm
ZkNvbCA+PSBudW1FZmZDb2xzKCkpCi0gICAgICAgIHJldHVybiAwOwotICAgIHJldHVybiBjZWxs
LT5zZWN0aW9uKCktPmNlbGxBdChjZWxsLT5yb3coKSwgZWZmQ29sKS5jZWxsOwotfQotCi1SZW5k
ZXJCbG9jayogUmVuZGVyVGFibGU6OmZpcnN0TGluZUJsb2NrKCkgY29uc3QKLXsKLSAgICByZXR1
cm4gMDsKLX0KLQotdm9pZCBSZW5kZXJUYWJsZTo6dXBkYXRlRmlyc3RMZXR0ZXIoKQote30KLQot
I2lmbmRlZiBOREVCVUcKLXZvaWQgUmVuZGVyVGFibGU6OmR1bXAoUVRleHRTdHJlYW0gKnN0cmVh
bSwgUVN0cmluZyBpbmQpIGNvbnN0Ci17Ci0gICAgaWYgKHRDYXB0aW9uKQotCSpzdHJlYW0gPDwg
IiB0Q2FwdGlvbiI7Ci0gICAgaWYgKGhlYWQpCi0JKnN0cmVhbSA8PCAiIGhlYWQiOwotICAgIGlm
IChmb290KQotCSpzdHJlYW0gPDwgIiBmb290IjsKLQotICAgICpzdHJlYW0gPDwgZW5kbCA8PCBp
bmQgPDwgImNzcGFuczoiOwotICAgIGZvciAoIHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGNvbHVt
bnMuc2l6ZSgpOyBpKysgKQotCSpzdHJlYW0gPDwgIiAiIDw8IGNvbHVtbnNbaV0uc3BhbjsKLSAg
ICAqc3RyZWFtIDw8IGVuZGwgPDwgaW5kOwotCi0gICAgUmVuZGVyQmxvY2s6OmR1bXAoc3RyZWFt
LGluZCk7Ci19Ci0jZW5kaWYKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotUmVuZGVyVGFibGVT
ZWN0aW9uOjpSZW5kZXJUYWJsZVNlY3Rpb24oRE9NOjpOb2RlSW1wbCogbm9kZSkKLSAgICA6IFJl
bmRlckNvbnRhaW5lcihub2RlKQotewotICAgIC8vIGluaXQgUmVuZGVyT2JqZWN0IGF0dHJpYnV0
ZXMKLSAgICBzZXRJbmxpbmUoZmFsc2UpOyAgIC8vIG91ciBvYmplY3QgaXMgbm90IElubGluZQot
ICAgIGdyaWRSb3dzID0gMDsKLSAgICBjQ29sID0gMDsKLSAgICBjUm93ID0gLTE7Ci0gICAgbmVl
ZENlbGxSZWNhbGMgPSBmYWxzZTsKLX0KLQotUmVuZGVyVGFibGVTZWN0aW9uOjp+UmVuZGVyVGFi
bGVTZWN0aW9uKCkKLXsKLSAgICBjbGVhckdyaWQoKTsKLX0KLQotdm9pZCBSZW5kZXJUYWJsZVNl
Y3Rpb246OmRlc3Ryb3koKQotewotICAgIC8vIHJlY2FsYyBjZWxsIGluZm8gYmVjYXVzZSBSZW5k
ZXJUYWJsZSBoYXMgdW5ndWFyZGVkIHBvaW50ZXJzCi0gICAgLy8gc3RvcmVkIHRoYXQgcG9pbnQg
dG8gdGhpcyBSZW5kZXJUYWJsZVNlY3Rpb24uCi0gICAgaWYgKHRhYmxlKCkpCi0gICAgICAgIHRh
YmxlKCktPnNldE5lZWRTZWN0aW9uUmVjYWxjKCk7Ci0KLSAgICBSZW5kZXJDb250YWluZXI6OmRl
c3Ryb3koKTsKLX0KLQotdm9pZCBSZW5kZXJUYWJsZVNlY3Rpb246OnNldFN0eWxlKFJlbmRlclN0
eWxlKiBfc3R5bGUpCi17Ci0gICAgLy8gd2UgZG9uJ3QgYWxsb3cgY2hhbmdpbmcgdGhpcyBvbmUK
LSAgICBpZiAoc3R5bGUoKSkKLSAgICAgICAgX3N0eWxlLT5zZXREaXNwbGF5KHN0eWxlKCktPmRp
c3BsYXkoKSk7Ci0gICAgZWxzZSBpZiAoX3N0eWxlLT5kaXNwbGF5KCkgIT0gVEFCTEVfRk9PVEVS
X0dST1VQICYmIF9zdHlsZS0+ZGlzcGxheSgpICE9IFRBQkxFX0hFQURFUl9HUk9VUCkKLSAgICAg
ICAgX3N0eWxlLT5zZXREaXNwbGF5KFRBQkxFX1JPV19HUk9VUCk7Ci0KLSAgICBSZW5kZXJDb250
YWluZXI6OnNldFN0eWxlKF9zdHlsZSk7Ci19Ci0KLXZvaWQgUmVuZGVyVGFibGVTZWN0aW9uOjph
ZGRDaGlsZChSZW5kZXJPYmplY3QgKmNoaWxkLCBSZW5kZXJPYmplY3QgKmJlZm9yZUNoaWxkKQot
ewotICAgIFJlbmRlck9iamVjdCAqcm93ID0gY2hpbGQ7Ci0KLSAgICBpZiAoY2hpbGQtPmVsZW1l
bnQoKSAmJiBjaGlsZC0+ZWxlbWVudCgpLT5oYXNUYWdOYW1lKGZvcm1UYWcpKSB7Ci0gICAgICAg
IFJlbmRlckNvbnRhaW5lcjo6YWRkQ2hpbGQoY2hpbGQsYmVmb3JlQ2hpbGQpOwotICAgICAgICBy
ZXR1cm47Ci0gICAgfQotICAgIAotICAgIGlmICghY2hpbGQtPmlzVGFibGVSb3coKSkgewotCi0g
ICAgICAgIGlmICghYmVmb3JlQ2hpbGQpCi0gICAgICAgICAgICBiZWZvcmVDaGlsZCA9IGxhc3RD
aGlsZCgpOwotCi0gICAgICAgIGlmIChiZWZvcmVDaGlsZCAmJiBiZWZvcmVDaGlsZC0+aXNBbm9u
eW1vdXMoKSkKLSAgICAgICAgICAgIHJvdyA9IGJlZm9yZUNoaWxkOwotICAgICAgICBlbHNlIHsK
LQkgICAgUmVuZGVyT2JqZWN0ICpsYXN0Qm94ID0gYmVmb3JlQ2hpbGQ7Ci0JICAgIHdoaWxlIChs
YXN0Qm94ICYmIGxhc3RCb3gtPnBhcmVudCgpLT5pc0Fub255bW91cygpICYmICFsYXN0Qm94LT5p
c1RhYmxlUm93KCkpCi0JCWxhc3RCb3ggPSBsYXN0Qm94LT5wYXJlbnQoKTsKLQkgICAgaWYgKGxh
c3RCb3ggJiYgbGFzdEJveC0+aXNBbm9ueW1vdXMoKSkgewotCQlsYXN0Qm94LT5hZGRDaGlsZCgg
Y2hpbGQsIGJlZm9yZUNoaWxkICk7Ci0JCXJldHVybjsKLQkgICAgfSBlbHNlIHsKLQkJcm93ID0g
bmV3IChyZW5kZXJBcmVuYSgpKSBSZW5kZXJUYWJsZVJvdyhkb2N1bWVudCgpIC8qIGFub255bW91
cyB0YWJsZSAqLyk7Ci0JCVJlbmRlclN0eWxlICpuZXdTdHlsZSA9IG5ldyAocmVuZGVyQXJlbmEo
KSkgUmVuZGVyU3R5bGUoKTsKLQkJbmV3U3R5bGUtPmluaGVyaXRGcm9tKHN0eWxlKCkpOwotCQlu
ZXdTdHlsZS0+c2V0RGlzcGxheShUQUJMRV9ST1cpOwotCQlyb3ctPnNldFN0eWxlKG5ld1N0eWxl
KTsKLQkJYWRkQ2hpbGQocm93LCBiZWZvcmVDaGlsZCk7Ci0JICAgIH0KLSAgICAgICAgfQotICAg
ICAgICByb3ctPmFkZENoaWxkKGNoaWxkKTsKLSAgICAgICAgY2hpbGQtPnNldE5lZWRzTGF5b3V0
QW5kTWluTWF4UmVjYWxjKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoYmVm
b3JlQ2hpbGQpCi0Jc2V0TmVlZENlbGxSZWNhbGMoKTsKLQotICAgIGNSb3crKzsKLSAgICBjQ29s
ID0gMDsKLQotICAgIGVuc3VyZVJvd3MoY1JvdysxKTsKLQotICAgIGlmICghYmVmb3JlQ2hpbGQp
IHsKLSAgICAgICAgZ3JpZFtjUm93XS5oZWlnaHQgPSBjaGlsZC0+c3R5bGUoKS0+aGVpZ2h0KCk7
Ci0gICAgICAgIGlmIChncmlkW2NSb3ddLmhlaWdodC50eXBlID09IFJlbGF0aXZlKQotICAgICAg
ICAgICAgZ3JpZFtjUm93XS5oZWlnaHQgPSBMZW5ndGgoKTsKLSAgICB9Ci0KLQotICAgIFJlbmRl
ckNvbnRhaW5lcjo6YWRkQ2hpbGQoY2hpbGQsYmVmb3JlQ2hpbGQpOwotfQotCi1ib29sIFJlbmRl
clRhYmxlU2VjdGlvbjo6ZW5zdXJlUm93cyhpbnQgbnVtUm93cykKLXsKLSAgICBpbnQgblJvd3Mg
PSBncmlkUm93czsKLSAgICBpZiAobnVtUm93cyA+IG5Sb3dzKSB7Ci0gICAgICAgIGlmIChudW1S
b3dzID4gc3RhdGljX2Nhc3Q8aW50PihncmlkLnNpemUoKSkpCi0gICAgICAgICAgICBpZiAoIWdy
aWQucmVzaXplKG51bVJvd3MqMisxKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0K
LSAgICAgICAgZ3JpZFJvd3MgPSBudW1Sb3dzOwotICAgICAgICBpbnQgbkNvbHMgPSB0YWJsZSgp
LT5udW1FZmZDb2xzKCk7Ci0gICAgICAgIENlbGxTdHJ1Y3QgZW1wdHlDZWxsU3RydWN0OwotICAg
ICAgICBlbXB0eUNlbGxTdHJ1Y3QuY2VsbCA9IDA7Ci0gICAgICAgIGVtcHR5Q2VsbFN0cnVjdC5p
bkNvbFNwYW4gPSBmYWxzZTsKLQlmb3IgKGludCByID0gblJvd3M7IHIgPCBudW1Sb3dzOyByKysp
IHsKLQkgICAgZ3JpZFtyXS5yb3cgPSBuZXcgUm93KG5Db2xzKTsKLQkgICAgZ3JpZFtyXS5yb3ct
PmZpbGwoZW1wdHlDZWxsU3RydWN0KTsKLQkgICAgZ3JpZFtyXS5iYXNlTGluZSA9IDA7Ci0JICAg
IGdyaWRbcl0uaGVpZ2h0ID0gTGVuZ3RoKCk7Ci0JfQotICAgIH0KLQotICAgIHJldHVybiB0cnVl
OwotfQotCi12b2lkIFJlbmRlclRhYmxlU2VjdGlvbjo6YWRkQ2VsbChSZW5kZXJUYWJsZUNlbGwg
KmNlbGwpCi17Ci0gICAgaW50IHJTcGFuID0gY2VsbC0+cm93U3BhbigpOwotICAgIGludCBjU3Bh
biA9IGNlbGwtPmNvbFNwYW4oKTsKLSAgICBBcnJheTxSZW5kZXJUYWJsZTo6Q29sdW1uU3RydWN0
PiAmY29sdW1ucyA9IHRhYmxlKCktPmNvbHVtbnM7Ci0gICAgaW50IG5Db2xzID0gY29sdW1ucy5z
aXplKCk7Ci0KLSAgICAvLyAjIyMgbW96aWxsYSBzdGlsbCBzZWVtcyB0byBkbyB0aGUgb2xkIEhU
TUwgd2F5LCBldmVuIGZvciBzdHJpY3QgRFRECi0gICAgLy8gKHNlZSB0aGUgYW5ub3RhdGlvbiBv
biB0YWJsZSBjZWxsIGxheW91dGluZyBpbiB0aGUgQ1NTIHNwZWNzIGFuZCB0aGUgdGVzdGNhc2Ug
YmVsb3c6Ci0gICAgLy8gPFRBQkxFIGJvcmRlcj4KLSAgICAvLyA8VFI+PFREPjEgPFREIHJvd3Nw
YW49IjIiPjIgPFREPjMgPFREPjQKLSAgICAvLyA8VFI+PFREIGNvbHNwYW49IjIiPjUKLSAgICAv
LyA8L1RBQkxFPgotCi0gICAgd2hpbGUgKGNDb2wgPCBuQ29scyAmJiAoY2VsbEF0KGNSb3csIGND
b2wpLmNlbGwgfHwgY2VsbEF0KGNSb3csIGNDb2wpLmluQ29sU3BhbikpCi0JY0NvbCsrOwotCi0g
ICAgaWYgKHJTcGFuID09IDEpIHsKLQkvLyB3ZSBpZ25vcmUgaGVpZ2h0IHNldHRpbmdzIG9uIHJv
d3NwYW4gY2VsbHMKLQlMZW5ndGggaGVpZ2h0ID0gY2VsbC0+c3R5bGUoKS0+aGVpZ2h0KCk7Ci0J
aWYgKGhlaWdodC52YWx1ZSA+IDAgfHwgKGhlaWdodC50eXBlID09IFJlbGF0aXZlICYmIGhlaWdo
dC52YWx1ZSA+PSAwKSkgewotCSAgICBMZW5ndGggY1Jvd0hlaWdodCA9IGdyaWRbY1Jvd10uaGVp
Z2h0OwotCSAgICBzd2l0Y2ggKGhlaWdodC50eXBlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBQ
ZXJjZW50OgotICAgICAgICAgICAgICAgICAgICBpZiAoIShjUm93SGVpZ2h0LnR5cGUgPT0gUGVy
Y2VudCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIChjUm93SGVpZ2h0LnR5cGUgPT0gUGVy
Y2VudCAmJiBjUm93SGVpZ2h0LnZhbHVlIDwgaGVpZ2h0LnZhbHVlKSkKLSAgICAgICAgICAgICAg
ICAgICAgICAgIGdyaWRbY1Jvd10uaGVpZ2h0ID0gaGVpZ2h0OwotICAgICAgICAgICAgICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBGaXhlZDoKLSAgICAgICAgICAgICAg
ICAgICAgaWYgKGNSb3dIZWlnaHQudHlwZSA8IFBlcmNlbnQgfHwKLSAgICAgICAgICAgICAgICAg
ICAgICAgIChjUm93SGVpZ2h0LnR5cGUgPT0gRml4ZWQgJiYgY1Jvd0hlaWdodC52YWx1ZSA8IGhl
aWdodC52YWx1ZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBncmlkW2NSb3ddLmhlaWdodCA9
IGhlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2Fz
ZSBSZWxhdGl2ZToKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAg
ICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgICAvLyBtYWtlIHN1cmUgd2UgaGF2ZSBl
bm91Z2ggcm93cwotICAgIGlmICghZW5zdXJlUm93cyhjUm93ICsgclNwYW4pKQotICAgICAgICBy
ZXR1cm47Ci0KLSAgICBpbnQgY29sID0gY0NvbDsKLSAgICAvLyB0ZWxsIHRoZSBjZWxsIHdoZXJl
IGl0IGlzCi0gICAgQ2VsbFN0cnVjdCBjdXJyZW50Q2VsbDsKLSAgICBjdXJyZW50Q2VsbC5jZWxs
ID0gY2VsbDsKLSAgICBjdXJyZW50Q2VsbC5pbkNvbFNwYW4gPSBmYWxzZTsKLSAgICB3aGlsZSAo
Y1NwYW4pIHsKLQlpbnQgY3VycmVudFNwYW47Ci0JaWYgKGNDb2wgPj0gbkNvbHMpIHsKLQkgICAg
dGFibGUoKS0+YXBwZW5kQ29sdW1uKGNTcGFuKTsKLQkgICAgY3VycmVudFNwYW4gPSBjU3BhbjsK
LQl9IGVsc2UgewotCSAgICBpZiAoY1NwYW4gPCBjb2x1bW5zW2NDb2xdLnNwYW4pCi0JCXRhYmxl
KCktPnNwbGl0Q29sdW1uKGNDb2wsIGNTcGFuKTsKLQkgICAgY3VycmVudFNwYW4gPSBjb2x1bW5z
W2NDb2xdLnNwYW47Ci0JfQotCi0JZm9yIChpbnQgciA9IDA7IHIgPCByU3BhbjsgcisrKSB7Ci0g
ICAgICAgICAgICBDZWxsU3RydWN0JiBjID0gY2VsbEF0KGNSb3cgKyByLCBjQ29sKTsKLSAgICAg
ICAgICAgIGlmIChjdXJyZW50Q2VsbC5jZWxsICYmICFjLmNlbGwpCi0gICAgICAgICAgICAgICAg
Yy5jZWxsID0gY3VycmVudENlbGwuY2VsbDsKLSAgICAgICAgICAgIGlmIChjdXJyZW50Q2VsbC5p
bkNvbFNwYW4pCi0gICAgICAgICAgICAgICAgYy5pbkNvbFNwYW4gPSB0cnVlOwotCX0KLQljQ29s
Kys7Ci0JY1NwYW4gLT0gY3VycmVudFNwYW47Ci0gICAgICAgIGN1cnJlbnRDZWxsLmNlbGwgPSAw
OwotCWN1cnJlbnRDZWxsLmluQ29sU3BhbiA9IHRydWU7Ci0gICAgfQotICAgIGlmIChjZWxsKSB7
Ci0JY2VsbC0+c2V0Um93KGNSb3cpOwotCWNlbGwtPnNldENvbCh0YWJsZSgpLT5lZmZDb2xUb0Nv
bChjb2wpKTsKLSAgICB9Ci19Ci0KLQotCi12b2lkIFJlbmRlclRhYmxlU2VjdGlvbjo6c2V0Q2Vs
bFdpZHRocygpCi17Ci0gICAgQXJyYXk8aW50PiAmY29sdW1uUG9zID0gdGFibGUoKS0+Y29sdW1u
UG9zOwotCi0gICAgaW50IHJvd3MgPSBncmlkUm93czsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8
IHJvd3M7IGkrKykgewotCVJvdyAmcm93ID0gKmdyaWRbaV0ucm93OwotCWludCBjb2xzID0gcm93
LnNpemUoKTsKLQlmb3IgKGludCBqID0gMDsgaiA8IGNvbHM7IGorKykgewotCSAgICBDZWxsU3Ry
dWN0IGN1cnJlbnQgPSByb3dbal07Ci0gICAgICAgICAgICBSZW5kZXJUYWJsZUNlbGwgKmNlbGwg
PSBjdXJyZW50LmNlbGw7Ci0KLQkgICAgaWYgKCFjZWxsKQotCQljb250aW51ZTsKLQkgICAgaW50
IGVuZENvbCA9IGo7Ci0JICAgIGludCBjc3BhbiA9IGNlbGwtPmNvbFNwYW4oKTsKLQkgICAgd2hp
bGUgKGNzcGFuICYmIGVuZENvbCA8IGNvbHMpIHsKLQkJY3NwYW4gLT0gdGFibGUoKS0+Y29sdW1u
c1tlbmRDb2xdLnNwYW47Ci0JCWVuZENvbCsrOwotCSAgICB9Ci0JICAgIGludCB3ID0gY29sdW1u
UG9zW2VuZENvbF0gLSBjb2x1bW5Qb3Nbal0gLSB0YWJsZSgpLT5oQm9yZGVyU3BhY2luZygpOwot
CSAgICBpbnQgb2xkV2lkdGggPSBjZWxsLT53aWR0aCgpOwotCSAgICBpZiAodyAhPSBvbGRXaWR0
aCkgewotCQljZWxsLT5zZXROZWVkc0xheW91dCh0cnVlKTsKLQkJY2VsbC0+c2V0V2lkdGgodyk7
Ci0JICAgIH0KLQl9Ci0gICAgfQotfQotCi0KLXZvaWQgUmVuZGVyVGFibGVTZWN0aW9uOjpjYWxj
Um93SGVpZ2h0KCkKLXsKLSAgICBpbnQgaW5keDsKLSAgICBSZW5kZXJUYWJsZUNlbGwgKmNlbGw7
Ci0KLSAgICBpbnQgdG90YWxSb3dzID0gZ3JpZFJvd3M7Ci0gICAgaW50IHNwYWNpbmcgPSB0YWJs
ZSgpLT52Qm9yZGVyU3BhY2luZygpOwotCi0gICAgcm93UG9zLnJlc2l6ZSh0b3RhbFJvd3MgKyAx
KTsKLSAgICByb3dQb3NbMF0gPSBzcGFjaW5nOwotCi0gICAgZm9yIChpbnQgciA9IDA7IHIgPCB0
b3RhbFJvd3M7IHIrKykgewotCXJvd1Bvc1tyICsgMV0gPSAwOwotCi0JaW50IGJhc2VsaW5lID0g
MDsKLQlpbnQgYmRlc2MgPSAwOwotCWludCBjaCA9IGdyaWRbcl0uaGVpZ2h0Lm1pbldpZHRoKDAp
OwotCWludCBwb3MgPSByb3dQb3NbciArIDFdICsgY2ggKyBzcGFjaW5nOwotCi0JaWYgKHBvcyA+
IHJvd1Bvc1tyICsgMV0pCi0JICAgIHJvd1Bvc1tyICsgMV0gPSBwb3M7Ci0KLQlSb3cgKnJvdyA9
IGdyaWRbcl0ucm93OwotCWludCB0b3RhbENvbHMgPSByb3ctPnNpemUoKTsKLQlpbnQgdG90YWxS
b3dzID0gZ3JpZFJvd3M7Ci0KLQlmb3IgKGludCBjID0gMDsgYyA8IHRvdGFsQ29sczsgYysrKSB7
Ci0JICAgIENlbGxTdHJ1Y3QgY3VycmVudCA9IGNlbGxBdChyLCBjKTsKLSAgICAgICAgICAgIGNl
bGwgPSBjdXJyZW50LmNlbGw7Ci0JICAgIGlmICghY2VsbCB8fCBjdXJyZW50LmluQ29sU3BhbikK
LQkJY29udGludWU7Ci0JICAgIGlmIChyIDwgdG90YWxSb3dzIC0gMSAmJiBjZWxsQXQociArIDEs
IGMpLmNlbGwgPT0gY2VsbCkKLQkJY29udGludWU7Ci0KLQkgICAgaWYgKChpbmR4ID0gciAtIGNl
bGwtPnJvd1NwYW4oKSArIDEpIDwgMCkKLQkJaW5keCA9IDA7Ci0KLSAgICAgICAgICAgIGlmIChj
ZWxsLT5vdmVycmlkZVNpemUoKSAhPSAtMSkgewotICAgICAgICAgICAgICAgIGNlbGwtPnNldE92
ZXJyaWRlU2l6ZSgtMSk7Ci0gICAgICAgICAgICAgICAgY2VsbC0+c2V0Q2hpbGROZWVkc0xheW91
dCh0cnVlLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgY2VsbC0+bGF5b3V0SWZOZWVkZWQoKTsK
LSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gRXhwbGljaXQgaGVp
Z2h0cyB1c2UgdGhlIGJvcmRlciBib3ggaW4gcXVpcmtzIG1vZGUuICBJbiBzdHJpY3QgbW9kZSBk
byB0aGUgcmlnaHQKLSAgICAgICAgICAgIC8vIHRoaW5nIGFuZCBhY3R1YWxseSBhZGQgaW4gdGhl
IGJvcmRlciBhbmQgcGFkZGluZy4KLQkgICAgY2ggPSBjZWxsLT5zdHlsZSgpLT5oZWlnaHQoKS53
aWR0aCgwKSArIAotICAgICAgICAgICAgICAgIChjZWxsLT5zdHlsZSgpLT5odG1sSGFja3MoKSA/
IDAgOiAoY2VsbC0+cGFkZGluZ1RvcCgpICsgY2VsbC0+cGFkZGluZ0JvdHRvbSgpICsKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGwtPmJvcmRl
clRvcCgpICsgY2VsbC0+Ym9yZGVyQm90dG9tKCkpKTsKLQkgICAgaWYgKGNlbGwtPmhlaWdodCgp
ID4gY2gpCi0JCWNoID0gY2VsbC0+aGVpZ2h0KCk7Ci0KLSAgICAgICAgICAgIHBvcyA9IHJvd1Bv
c1sgaW5keCBdICsgY2ggKyBzcGFjaW5nOwotCi0JICAgIGlmIChwb3MgPiByb3dQb3NbciArIDFd
KQotCQlyb3dQb3NbciArIDFdID0gcG9zOwotCi0JICAgIC8vIGZpbmQgb3V0IHRoZSBiYXNlbGlu
ZQotCSAgICBFVmVydGljYWxBbGlnbiB2YSA9IGNlbGwtPnN0eWxlKCktPnZlcnRpY2FsQWxpZ24o
KTsKLQkgICAgaWYgKHZhID09IEJBU0VMSU5FIHx8IHZhID09IFRFWFRfQk9UVE9NIHx8IHZhID09
IFRFWFRfVE9QCi0JCXx8IHZhID09IFNVUEVSIHx8IHZhID09IFNVQikgewotCQlpbnQgYiA9IGNl
bGwtPmJhc2VsaW5lUG9zaXRpb24oKTsKLSAgICAgICAgICAgICAgICBpZiAoYiA+IGNlbGwtPmJv
cmRlclRvcCgpICsgY2VsbC0+cGFkZGluZ1RvcCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlm
IChiID4gYmFzZWxpbmUpCi0gICAgICAgICAgICAgICAgICAgICAgICBiYXNlbGluZSA9IGI7Ci0K
LSAgICAgICAgICAgICAgICAgICAgaW50IHRkID0gcm93UG9zW2luZHhdICsgY2ggLSBiOwotICAg
ICAgICAgICAgICAgICAgICBpZiAodGQgPiBiZGVzYykKLSAgICAgICAgICAgICAgICAgICAgICAg
IGJkZXNjID0gdGQ7Ci0gICAgICAgICAgICAgICAgfQotCSAgICB9Ci0JfQotCi0JLy9kbyB3ZSBo
YXZlIGJhc2VsaW5lIGFsaWduZWQgZWxlbWVudHM/Ci0JaWYgKGJhc2VsaW5lKSB7Ci0JICAgIC8v
IGluY3JlYXNlIHJvd2hlaWdodCBpZiBiYXNlbGluZSByZXF1aXJlcwotCSAgICBpbnQgYlJvd1Bv
cyA9IGJhc2VsaW5lICsgYmRlc2MgICsgc3BhY2luZyA7IC8vICsgMipwYWRkaW5nCi0JICAgIGlm
IChyb3dQb3NbciArIDFdIDwgYlJvd1BvcykKLQkJcm93UG9zW3IgKyAxXSA9IGJSb3dQb3M7Ci0K
LQkgICAgZ3JpZFtyXS5iYXNlTGluZSA9IGJhc2VsaW5lOwotCX0KLQotCWlmIChyb3dQb3NbciAr
IDFdIDwgcm93UG9zW3JdKQotCSAgICByb3dQb3NbciArIDFdID0gcm93UG9zW3JdOwotICAgIH0K
LX0KLQotaW50IFJlbmRlclRhYmxlU2VjdGlvbjo6bGF5b3V0Um93cyhpbnQgdG9BZGQpCi17Ci0g
ICAgaW50IHJIZWlnaHQ7Ci0gICAgaW50IHJpbmR4OwotICAgIGludCB0b3RhbFJvd3MgPSBncmlk
Um93czsKLSAgICBpbnQgaHNwYWNpbmcgPSB0YWJsZSgpLT5oQm9yZGVyU3BhY2luZygpOwotICAg
IGludCB2c3BhY2luZyA9IHRhYmxlKCktPnZCb3JkZXJTcGFjaW5nKCk7Ci0gICAgCi0gICAgaWYg
KHRvQWRkICYmIHRvdGFsUm93cyAmJiAocm93UG9zW3RvdGFsUm93c10gfHwgIW5leHRTaWJsaW5n
KCkpKSB7Ci0KLQlpbnQgdG90YWxIZWlnaHQgPSByb3dQb3NbdG90YWxSb3dzXSArIHRvQWRkOwot
Ci0gICAgICAgIGludCBkaCA9IHRvQWRkOwotCWludCB0b3RhbFBlcmNlbnQgPSAwOwotCWludCBu
dW1BdXRvID0gMDsKLQlmb3IgKGludCByID0gMDsgciA8IHRvdGFsUm93czsgcisrKSB7Ci0JICAg
IGlmIChncmlkW3JdLmhlaWdodC50eXBlID09IEF1dG8pCi0JCW51bUF1dG8rKzsKLQkgICAgZWxz
ZSBpZiAoZ3JpZFtyXS5oZWlnaHQudHlwZSA9PSBQZXJjZW50KQotCQl0b3RhbFBlcmNlbnQgKz0g
Z3JpZFtyXS5oZWlnaHQudmFsdWU7Ci0JfQotCWlmICh0b3RhbFBlcmNlbnQpIHsKLQkgICAgLy8g
dHJ5IHRvIHNhdGlzZnkgcGVyY2VudAotCSAgICBpbnQgYWRkID0gMDsKLQkgICAgaWYgKHRvdGFs
UGVyY2VudCA+IDEwMCkKLQkJdG90YWxQZXJjZW50ID0gMTAwOwotCSAgICBpbnQgcmggPSByb3dQ
b3NbMV0gLSByb3dQb3NbMF07Ci0JICAgIGZvciAoaW50IHIgPSAwOyByIDwgdG90YWxSb3dzOyBy
KyspIHsKLQkJaWYgKHRvdGFsUGVyY2VudCA+IDAgJiYgZ3JpZFtyXS5oZWlnaHQudHlwZSA9PSBQ
ZXJjZW50KSB7Ci0JCSAgICBpbnQgdG9BZGQgPSBrTWluKGRoLCAodG90YWxIZWlnaHQgKiBncmlk
W3JdLmhlaWdodC52YWx1ZSAvIDEwMCkgLSByaCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIElm
IHRvQWRkIGlzIG5lZ2F0aXZlLCB0aGVuIHdlIGRvbid0IHdhbnQgdG8gc2hyaW5rIHRoZSByb3cg
KHRoaXMgYnVnCi0gICAgICAgICAgICAgICAgICAgIC8vIGFmZmVjdGVkIE91dGxvb2sgV2ViIEFj
Y2VzcykuCi0gICAgICAgICAgICAgICAgICAgIHRvQWRkID0ga01heCgwLCB0b0FkZCk7Ci0JCSAg
ICBhZGQgKz0gdG9BZGQ7Ci0JCSAgICBkaCAtPSB0b0FkZDsKLQkJICAgIHRvdGFsUGVyY2VudCAt
PSBncmlkW3JdLmhlaWdodC52YWx1ZTsKLQkJfQotCQlpZiAociA8IHRvdGFsUm93cyAtIDEpCi0J
CSAgICByaCA9IHJvd1Bvc1tyICsgMl0gLSByb3dQb3NbciArIDFdOwotICAgICAgICAgICAgICAg
IHJvd1Bvc1tyICsgMV0gKz0gYWRkOwotCSAgICB9Ci0JfQotCWlmIChudW1BdXRvKSB7Ci0JICAg
IC8vIGRpc3RyaWJ1dGUgb3ZlciB2YXJpYWJsZSBjb2xzCi0JICAgIGludCBhZGQgPSAwOwotCSAg
ICBmb3IgKGludCByID0gMDsgciA8IHRvdGFsUm93czsgcisrKSB7Ci0JCWlmIChudW1BdXRvID4g
MCAmJiBncmlkW3JdLmhlaWdodC50eXBlID09IEF1dG8pIHsKLQkJICAgIGludCB0b0FkZCA9IGRo
L251bUF1dG87Ci0JCSAgICBhZGQgKz0gdG9BZGQ7Ci0JCSAgICBkaCAtPSB0b0FkZDsKLSAgICAg
ICAgICAgICAgICAgICAgbnVtQXV0by0tOwotCQl9Ci0gICAgICAgICAgICAgICAgcm93UG9zW3Ig
KyAxXSArPSBhZGQ7Ci0JICAgIH0KLQl9Ci0gICAgICAgIGlmIChkaCA+IDAgJiYgcm93UG9zW3Rv
dGFsUm93c10pIHsKLQkgICAgLy8gaWYgc29tZSBsZWZ0IG92ZXJzLCBkaXN0cmlidXRlIGVxdWFs
bHkuCi0gICAgICAgICAgICBpbnQgdG90ID0gcm93UG9zW3RvdGFsUm93c107Ci0gICAgICAgICAg
ICBpbnQgYWRkID0gMDsKLSAgICAgICAgICAgIGludCBwcmV2ID0gcm93UG9zWzBdOwotICAgICAg
ICAgICAgZm9yIChpbnQgciA9IDA7IHIgPCB0b3RhbFJvd3M7IHIrKykgewotICAgICAgICAgICAg
ICAgIC8vd2VpZ2h0IHdpdGggdGhlIG9yaWdpbmFsIGhlaWdodAotICAgICAgICAgICAgICAgIGFk
ZCArPSBkaCAqIChyb3dQb3NbciArIDFdIC0gcHJldikgLyB0b3Q7Ci0gICAgICAgICAgICAgICAg
cHJldiA9IHJvd1Bvc1tyICsgMV07Ci0gICAgICAgICAgICAgICAgcm93UG9zW3IgKyAxXSArPSBh
ZGQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpbnQgbGVmdE9mZnNl
dCA9IGhzcGFjaW5nOwotCi0gICAgaW50IG5FZmZDb2xzID0gdGFibGUoKS0+bnVtRWZmQ29scygp
OwotICAgIGZvciAoaW50IHIgPSAwOyByIDwgdG90YWxSb3dzOyByKyspIHsKLQlSb3cgKnJvdyA9
IGdyaWRbcl0ucm93OwotCWludCB0b3RhbENvbHMgPSByb3ctPnNpemUoKTsKLSAgICAgICAgZm9y
IChpbnQgYyA9IDA7IGMgPCBuRWZmQ29sczsgYysrKSB7Ci0gICAgICAgICAgICBDZWxsU3RydWN0
IGN1cnJlbnQgPSBjZWxsQXQociwgYyk7Ci0gICAgICAgICAgICBSZW5kZXJUYWJsZUNlbGwqIGNl
bGwgPSBjdXJyZW50LmNlbGw7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICghY2VsbCkK
LSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIGlmIChyIDwgdG90YWxSb3dz
IC0gMSAmJiBjZWxsID09IGNlbGxBdChyICsgMSwgYykuY2VsbCkKLQkJY29udGludWU7Ci0KLSAg
ICAgICAgICAgIGlmICgocmluZHggPSByLWNlbGwtPnJvd1NwYW4oKSArIDEpIDwgMCkKLSAgICAg
ICAgICAgICAgICByaW5keCA9IDA7Ci0KLSAgICAgICAgICAgIHJIZWlnaHQgPSByb3dQb3NbciAr
IDFdIC0gcm93UG9zW3JpbmR4XSAtIHZzcGFjaW5nOwotICAgICAgICAgICAgCi0gICAgICAgICAg
ICAvLyBGb3JjZSBwZXJjZW50IGhlaWdodCBjaGlsZHJlbiB0byBsYXkgdGhlbXNlbHZlcyBvdXQg
YWdhaW4uCi0gICAgICAgICAgICAvLyBUaGlzIHdpbGwgY2F1c2UgdGhlc2UgY2hpbGRyZW4gdG8g
Z3JvdyB0byBmaWxsIHRoZSBjZWxsLgotICAgICAgICAgICAgLy8gRklYTUU6IFRoZXJlIGlzIHN0
aWxsIG1vcmUgd29yayB0byBkbyBoZXJlIHRvIGZ1bGx5IG1hdGNoIFdpbklFIChzaG91bGQKLSAg
ICAgICAgICAgIC8vIGl0IGJlY29tZSBuZWNlc3NhcnkgdG8gZG8gc28pLiAgSW4gcXVpcmtzIG1v
ZGUsIFdpbklFIGJlaGF2ZXMgbGlrZSB3ZQotICAgICAgICAgICAgLy8gZG8sIGJ1dCBpdCB3aWxs
IGNsaXAgdGhlIGNlbGxzIHRoYXQgc3BpbGwgb3V0IG9mIHRoZSB0YWJsZSBzZWN0aW9uLiAgSW4K
LSAgICAgICAgICAgIC8vIHN0cmljdCBtb2RlLCBNb3ppbGxhIGFuZCBXaW5JRSBib3RoIHJlZ3Jv
dyB0aGUgdGFibGUgdG8gYWNjb21tb2RhdGUgdGhlCi0gICAgICAgICAgICAvLyBuZXcgaGVpZ2h0
IG9mIHRoZSBjZWxsICh0aHVzIGxldHRpbmcgdGhlIHBlcmNlbnRhZ2VzIGNhdXNlIGdyb3d0aCBv
bmUKLSAgICAgICAgICAgIC8vIHRpbWUgb25seSkuICBXZSBtYXkgYWxzbyBub3QgYmUgaGFuZGxp
bmcgcm93LXNwYW5uaW5nIGNlbGxzIGNvcnJlY3RseS4KLSAgICAgICAgICAgIC8vCi0gICAgICAg
ICAgICAvLyBOb3RlIGFsc28gdGhlIG9kZGl0eSB3aGVyZSByZXBsYWNlZCBlbGVtZW50cyBhbHdh
eXMgZmxleCwgYW5kIHlldCBibG9ja3MvdGFibGVzIGRvCi0gICAgICAgICAgICAvLyBub3QgbmVj
ZXNzYXJpbHkgZmxleC4gIFdpbklFIGlzIGNyYXp5IGFuZCBpbmNvbnNpc3RlbnQsIGFuZCB3ZSBj
YW4ndCBob3BlIHRvCi0gICAgICAgICAgICAvLyBtYXRjaCB0aGUgYmVoYXZpb3IgcGVyZmVjdGx5
LCBidXQgd2UnbGwgY29udGludWUgdG8gcmVmaW5lIGl0IGFzIHdlIGRpc2NvdmVyIG5ldwotICAg
ICAgICAgICAgLy8gYnVncy4gOikKLSAgICAgICAgICAgIGJvb2wgY2VsbENoaWxkcmVuRmxleCA9
IGZhbHNlOwotICAgICAgICAgICAgYm9vbCBmbGV4QWxsQ2hpbGRyZW4gPSBjZWxsLT5zdHlsZSgp
LT5oZWlnaHQoKS5pc0ZpeGVkKCkgfHwgCi0gICAgICAgICAgICAgICAgKCF0YWJsZSgpLT5zdHls
ZSgpLT5oZWlnaHQoKS5pc0F1dG8oKSAmJiBySGVpZ2h0ICE9IGNlbGwtPmhlaWdodCgpKTsKLQot
ICAgICAgICAgICAgZm9yIChSZW5kZXJPYmplY3QqIG8gPSBjZWxsLT5maXJzdENoaWxkKCk7IG87
IG8gPSBvLT5uZXh0U2libGluZygpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFvLT5pc1RleHQo
KSAmJiBvLT5zdHlsZSgpLT5oZWlnaHQoKS5pc1BlcmNlbnQoKSAmJiAoby0+aXNSZXBsYWNlZCgp
IHx8IG8tPnNjcm9sbHNPdmVyZmxvdygpIHx8IGZsZXhBbGxDaGlsZHJlbikpIHsKLSAgICAgICAg
ICAgICAgICAgICAgLy8gVGFibGVzIHdpdGggbm8gc2VjdGlvbnMgZG8gbm90IGZsZXguCi0gICAg
ICAgICAgICAgICAgICAgIGlmICghby0+aXNUYWJsZSgpIHx8IHN0YXRpY19jYXN0PFJlbmRlclRh
YmxlKj4obyktPmhhc1NlY3Rpb25zKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG8tPnNl
dE5lZWRzTGF5b3V0KHRydWUsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNlbGwt
PnNldENoaWxkTmVlZHNMYXlvdXQodHJ1ZSwgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAg
ICAgY2VsbENoaWxkcmVuRmxleCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY2VsbENoaWxkcmVu
RmxleCkgewotICAgICAgICAgICAgICAgIGNlbGwtPnNldE92ZXJyaWRlU2l6ZShrTWF4KDAsIAot
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJIZWlnaHQgLSBjZWxs
LT5ib3JkZXJUb3AoKSAtIGNlbGwtPnBhZGRpbmdUb3AoKSAtIAotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsLT5ib3JkZXJCb3R0b20oKSAt
IGNlbGwtPnBhZGRpbmdCb3R0b20oKSkpOwotICAgICAgICAgICAgICAgIGNlbGwtPmxheW91dElm
TmVlZGVkKCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBBbGlnbm1lbnQgd2l0aGluIGEgY2VsbCBp
cyBiYXNlZCBvZmYgdGhlIGNhbGN1bGF0ZWQKLSAgICAgICAgICAgICAgICAvLyBoZWlnaHQsIHdo
aWNoIGJlY29tZXMgaXJyZWxldmFudCBvbmNlIHRoZSBjZWxsIGhhcwotICAgICAgICAgICAgICAg
IC8vIGJlZW4gcmVzaXplZCBiYXNlZCBvZmYgaXRzIHBlcmNlbnRhZ2UuIC1kd2gKLSAgICAgICAg
ICAgICAgICBjZWxsLT5zZXRDZWxsVG9wRXh0cmEoMCk7Ci0gICAgICAgICAgICAgICAgY2VsbC0+
c2V0Q2VsbEJvdHRvbUV4dHJhKDApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7
Ci0gICAgICAgICAgICAgICAgRVZlcnRpY2FsQWxpZ24gdmEgPSBjZWxsLT5zdHlsZSgpLT52ZXJ0
aWNhbEFsaWduKCk7Ci0gICAgICAgICAgICAgICAgaW50IHRlID0gMDsKLSAgICAgICAgICAgICAg
ICBzd2l0Y2ggKHZhKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU1VCOgotICAgICAgICAg
ICAgICAgICAgICBjYXNlIFNVUEVSOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFRFWFRfVE9Q
OgotICAgICAgICAgICAgICAgICAgICBjYXNlIFRFWFRfQk9UVE9NOgotICAgICAgICAgICAgICAg
ICAgICBjYXNlIEJBU0VMSU5FOgotICAgICAgICAgICAgICAgICAgICAgICAgdGUgPSBnZXRCYXNl
bGluZShyKSAtIGNlbGwtPmJhc2VsaW5lUG9zaXRpb24oKSA7Ci0gICAgICAgICAgICAgICAgICAg
ICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBUT1A6Ci0gICAgICAgICAgICAg
ICAgICAgICAgICB0ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAg
ICAgICAgICAgICAgICAgY2FzZSBNSURETEU6Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZSA9
IChySGVpZ2h0IC0gY2VsbC0+aGVpZ2h0KCkpLzI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBi
cmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBCT1RUT006Ci0gICAgICAgICAgICAgICAg
ICAgICAgICB0ZSA9IHJIZWlnaHQgLSBjZWxsLT5oZWlnaHQoKTsKLSAgICAgICAgICAgICAgICAg
ICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAg
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAot
ICAgICAgICAgICAgICAgIGNlbGwtPnNldENlbGxUb3BFeHRyYSh0ZSk7Ci0gICAgICAgICAgICAg
ICAgY2VsbC0+c2V0Q2VsbEJvdHRvbUV4dHJhKHJIZWlnaHQgLSBjZWxsLT5oZWlnaHQoKSAtIHRl
KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaW50IG9sZENlbGxY
ID0gY2VsbC0+eFBvcygpOwotICAgICAgICAgICAgaW50IG9sZENlbGxZID0gY2VsbC0+eVBvcygp
OwotICAgICAgICAKLSAgICAgICAgICAgIGlmIChzdHlsZSgpLT5kaXJlY3Rpb24oKSA9PSBSVEwp
IHsKLSAgICAgICAgICAgICAgICBjZWxsLT5zZXRQb3MoCi0JCSAgICB0YWJsZSgpLT5jb2x1bW5Q
b3NbKGludCl0b3RhbENvbHNdIC0KLQkJICAgIHRhYmxlKCktPmNvbHVtblBvc1t0YWJsZSgpLT5j
b2xUb0VmZkNvbChjZWxsLT5jb2woKStjZWxsLT5jb2xTcGFuKCkpXSArCi0JCSAgICBsZWZ0T2Zm
c2V0LAotICAgICAgICAgICAgICAgICAgICByb3dQb3NbcmluZHhdKTsKLSAgICAgICAgICAgIH0g
ZWxzZQotICAgICAgICAgICAgICAgIGNlbGwtPnNldFBvcyh0YWJsZSgpLT5jb2x1bW5Qb3NbY10g
KyBsZWZ0T2Zmc2V0LCByb3dQb3NbcmluZHhdKTsKLQotICAgICAgICAgICAgLy8gSWYgdGhlIGNl
bGwgbW92ZWQsIHdlIGhhdmUgdG8gcmVwYWludCBpdCBhcyB3ZWxsIGFzIGFueSBmbG9hdGluZy9w
b3NpdGlvbmVkCi0gICAgICAgICAgICAvLyBkZXNjZW5kYW50cy4gIEFuIGV4Y2VwdGlvbiBpcyBp
ZiB3ZSBuZWVkIGEgbGF5b3V0LiAgSW4gdGhpcyBjYXNlLCB3ZSBrbm93IHdlJ3JlIGdvaW5nIHRv
Ci0gICAgICAgICAgICAvLyByZXBhaW50IG91cnNlbHZlcyAoYW5kIHRoZSBjZWxsKSBhbnl3YXku
Ci0gICAgICAgICAgICBpZiAoIXRhYmxlKCktPnNlbGZOZWVkc0xheW91dCgpICYmIGNlbGwtPmNo
ZWNrRm9yUmVwYWludER1cmluZ0xheW91dCgpKQotICAgICAgICAgICAgICAgIGNlbGwtPnJlcGFp
bnREdXJpbmdMYXlvdXRJZk1vdmVkKG9sZENlbGxYLCBvbGRDZWxsWSk7Ci0gICAgICAgIH0KLSAg
ICB9Ci0KLSAgICBtX2hlaWdodCA9IHJvd1Bvc1t0b3RhbFJvd3NdOwotICAgIHJldHVybiBtX2hl
aWdodDsKLX0KLQotCi12b2lkIFJlbmRlclRhYmxlU2VjdGlvbjo6cGFpbnQoUGFpbnRJbmZvJiBp
LCBpbnQgdHgsIGludCB0eSkKLXsKLSAgICB1bnNpZ25lZCBpbnQgdG90YWxSb3dzID0gZ3JpZFJv
d3M7Ci0gICAgdW5zaWduZWQgaW50IHRvdGFsQ29scyA9IHRhYmxlKCktPmNvbHVtbnMuc2l6ZSgp
OwotCi0gICAgdHggKz0gbV94OwotICAgIHR5ICs9IG1feTsKLQotICAgIC8vIGNoZWNrIHdoaWNo
IHJvd3MgYW5kIGNvbHMgYXJlIHZpc2libGUgYW5kIG9ubHkgcGFpbnQgdGhlc2UKLSAgICAvLyAj
IyMgZml4bWU6IGNvdWxkIHVzZSBhIGJpbmFyeSBzZWFyY2ggaGVyZQotICAgIFBhaW50QWN0aW9u
IHBhaW50QWN0aW9uID0gaS5waGFzZTsKLSAgICBpbnQgeCA9IGkuci54KCk7Ci0gICAgaW50IHkg
PSBpLnIueSgpOwotICAgIGludCB3ID0gaS5yLndpZHRoKCk7Ci0gICAgaW50IGggPSBpLnIuaGVp
Z2h0KCk7Ci0KLSAgICBpbnQgb3MgPSAyICogbWF4aW1hbE91dGxpbmVTaXplKHBhaW50QWN0aW9u
KTsKLSAgICB1bnNpZ25lZCBpbnQgc3RhcnRyb3cgPSAwOwotICAgIHVuc2lnbmVkIGludCBlbmRy
b3cgPSB0b3RhbFJvd3M7Ci0gICAgZm9yICg7IHN0YXJ0cm93IDwgdG90YWxSb3dzOyBzdGFydHJv
dysrKQotCWlmICh0eSArIHJvd1Bvc1tzdGFydHJvdysxXSA+PSB5IC0gb3MpCi0JICAgIGJyZWFr
OwotCi0gICAgZm9yICg7IGVuZHJvdyA+IDA7IGVuZHJvdy0tKQotCWlmICggdHkgKyByb3dQb3Nb
ZW5kcm93LTFdIDw9IHkgKyBoICsgb3MpCi0gICAgICAgICAgICBicmVhazsKLQotICAgIHVuc2ln
bmVkIGludCBzdGFydGNvbCA9IDA7Ci0gICAgdW5zaWduZWQgaW50IGVuZGNvbCA9IHRvdGFsQ29s
czsKLSAgICBpZiAoc3R5bGUoKS0+ZGlyZWN0aW9uKCkgPT0gTFRSKSB7Ci0JZm9yICg7IHN0YXJ0
Y29sIDwgdG90YWxDb2xzOyBzdGFydGNvbCsrKSB7Ci0JICAgIGlmICh0eCArIHRhYmxlKCktPmNv
bHVtblBvc1tzdGFydGNvbCArIDFdID49IHggLSBvcykKLSAgICAgICAgICAgICAgICBicmVhazsK
LQl9Ci0JZm9yICg7IGVuZGNvbCA+IDA7IGVuZGNvbC0tKSB7Ci0JICAgIGlmICh0eCArIHRhYmxl
KCktPmNvbHVtblBvc1tlbmRjb2wgLSAxXSA8PSB4ICsgdyArIG9zKQotCQlicmVhazsKLQl9Ci0g
ICAgfQotCi0gICAgaWYgKHN0YXJ0Y29sIDwgZW5kY29sKSB7Ci0JLy8gZHJhdyB0aGUgY2VsbHMK
LQlmb3IgKHVuc2lnbmVkIGludCByID0gc3RhcnRyb3c7IHIgPCBlbmRyb3c7IHIrKykgewotCSAg
ICB1bnNpZ25lZCBpbnQgYyA9IHN0YXJ0Y29sOwotCSAgICAvLyBzaW5jZSBhIGNlbGwgY2FuIGJl
IC0xIChpbmRpY2F0aW5nIGEgY29sc3Bhbikgd2UgbWlnaHQgaGF2ZSB0byBzZWFyY2ggYmFja3dh
cmRzIHRvIGluY2x1ZGUgaXQKLQkgICAgd2hpbGUgKGMgJiYgY2VsbEF0KHIsIGMpLmluQ29sU3Bh
bikKLQkJYy0tOwotCSAgICBmb3IgKDsgYyA8IGVuZGNvbDsgYysrKSB7Ci0gICAgICAgICAgICAg
ICAgQ2VsbFN0cnVjdCBjdXJyZW50ID0gY2VsbEF0KHIsIGMpOwotICAgICAgICAgICAgICAgIFJl
bmRlclRhYmxlQ2VsbCAqY2VsbCA9IGN1cnJlbnQuY2VsbDsKLQkJCi0gICAgICAgICAgICAgICAg
aWYgKCFjZWxsIHx8IChjZWxsLT5sYXllcigpICYmIGkucGhhc2UgIT0gUGFpbnRBY3Rpb25Db2xs
YXBzZWRUYWJsZUJvcmRlcnMpKSAKLQkJICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIAot
ICAgICAgICAgICAgICAgIC8vIENlbGxzIG11c3QgYWx3YXlzIHBhaW50IGluIHRoZSBvcmRlciBp
biB3aGljaCB0aGV5IGFwcGVhciB0YWtpbmcgaW50byBhY2NvdW50Ci0gICAgICAgICAgICAgICAg
Ly8gdGhlaXIgdXBwZXIgbGVmdCBvcmlnaW5hdGluZyByb3cvY29sdW1uLiAgRm9yIGNlbGxzIHdp
dGggcm93c3BhbnMsIGF2b2lkIHJlcGFpbnRpbmcKLSAgICAgICAgICAgICAgICAvLyBpZiB3ZSd2
ZSBhbHJlYWR5IHNlZW4gdGhlIGNlbGwuCi0JCWlmIChyID4gc3RhcnRyb3cgJiYgKGNlbGxBdChy
LTEsIGMpLmNlbGwgPT0gY2VsbCkpCi0JCSAgICBjb250aW51ZTsKLQotCQljZWxsLT5wYWludChp
LCB0eCwgdHkpOwotCSAgICB9Ci0JfQotICAgIH0KLX0KLQotdm9pZCBSZW5kZXJUYWJsZVNlY3Rp
b246OnJlY2FsY0NlbGxzKCkKLXsKLSAgICBjQ29sID0gMDsKLSAgICBjUm93ID0gLTE7Ci0gICAg
Y2xlYXJHcmlkKCk7Ci0gICAgZ3JpZFJvd3MgPSAwOwotCi0gICAgZm9yIChSZW5kZXJPYmplY3Qg
KnJvdyA9IGZpcnN0Q2hpbGQoKTsgcm93OyByb3cgPSByb3ctPm5leHRTaWJsaW5nKCkpIHsKLQlj
Um93Kys7Ci0JY0NvbCA9IDA7Ci0JZW5zdXJlUm93cyhjUm93ICsgMSk7Ci0JZm9yIChSZW5kZXJP
YmplY3QgKmNlbGwgPSByb3ctPmZpcnN0Q2hpbGQoKTsgY2VsbDsgY2VsbCA9IGNlbGwtPm5leHRT
aWJsaW5nKCkpCi0JICAgIGlmIChjZWxsLT5pc1RhYmxlQ2VsbCgpKQotCQlhZGRDZWxsKHN0YXRp
Y19jYXN0PFJlbmRlclRhYmxlQ2VsbCAqPihjZWxsKSk7Ci0gICAgfQotICAgIG5lZWRDZWxsUmVj
YWxjID0gZmFsc2U7Ci0gICAgc2V0TmVlZHNMYXlvdXQodHJ1ZSk7Ci19Ci0KLXZvaWQgUmVuZGVy
VGFibGVTZWN0aW9uOjpjbGVhckdyaWQoKQotewotICAgIGludCByb3dzID0gZ3JpZFJvd3M7Ci0g
ICAgd2hpbGUgKHJvd3MtLSkKLQlkZWxldGUgZ3JpZFtyb3dzXS5yb3c7Ci19Ci0KLVJlbmRlck9i
amVjdCogUmVuZGVyVGFibGVTZWN0aW9uOjpyZW1vdmVDaGlsZE5vZGUoUmVuZGVyT2JqZWN0KiBj
aGlsZCkKLXsKLSAgICBzZXROZWVkQ2VsbFJlY2FsYygpOwotICAgIHJldHVybiBSZW5kZXJDb250
YWluZXI6OnJlbW92ZUNoaWxkTm9kZShjaGlsZCk7Ci19Ci0KLSNpZm5kZWYgTkRFQlVHCi12b2lk
IFJlbmRlclRhYmxlU2VjdGlvbjo6ZHVtcChRVGV4dFN0cmVhbSAqc3RyZWFtLCBRU3RyaW5nIGlu
ZCkgY29uc3QKLXsKLSAgICAqc3RyZWFtIDw8IGVuZGwgPDwgaW5kIDw8ICJncmlkPSgiIDw8IGdy
aWQuc2l6ZSgpIDw8ICIsIiA8PCB0YWJsZSgpLT5udW1FZmZDb2xzKCkgPDwgIikiIDw8IGVuZGwg
PDwgaW5kOwotICAgIGZvciAodW5zaWduZWQgaW50IHIgPSAwOyByIDwgZ3JpZC5zaXplKCk7IHIr
KykgewotCWZvciAoaW50IGMgPSAwOyBjIDwgdGFibGUoKS0+bnVtRWZmQ29scygpOyBjKyspIHsK
LQkgICAgaWYgKGNlbGxBdCggciwgYykuY2VsbCAmJiAhY2VsbEF0KHIsIGMpLmluQ29sU3BhbikK
LQkJKnN0cmVhbSA8PCAiKCIgPDwgY2VsbEF0KHIsIGMpLmNlbGwtPnJvdygpIDw8ICIsIiA8PCBj
ZWxsQXQociwgYykuY2VsbC0+Y29sKCkgPDwgIiwiCi0JCQk8PCBjZWxsQXQociwgYykuY2VsbC0+
cm93U3BhbigpIDw8ICIsIiA8PCBjZWxsQXQociwgYykuY2VsbC0+Y29sU3BhbigpIDw8ICIpICI7
Ci0JICAgIGVsc2UKLQkJKnN0cmVhbSA8PCBjZWxsQXQociwgYykuY2VsbCA8PCAibnVsbCBjZWxs
ICI7Ci0JfQotCSpzdHJlYW0gPDwgZW5kbCA8PCBpbmQ7Ci0gICAgfQotICAgIFJlbmRlckNvbnRh
aW5lcjo6ZHVtcChzdHJlYW0saW5kKTsKLX0KLSNlbmRpZgotCi0vLyAtLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
Ci0KLVJlbmRlclRhYmxlUm93OjpSZW5kZXJUYWJsZVJvdyhET006Ok5vZGVJbXBsKiBub2RlKQot
ICAgIDogUmVuZGVyQ29udGFpbmVyKG5vZGUpCi17Ci0gICAgLy8gaW5pdCBSZW5kZXJPYmplY3Qg
YXR0cmlidXRlcwotICAgIHNldElubGluZShmYWxzZSk7ICAgLy8gb3VyIG9iamVjdCBpcyBub3Qg
SW5saW5lCi19Ci0KLXZvaWQgUmVuZGVyVGFibGVSb3c6OmRlc3Ryb3koKQotewotICAgIFJlbmRl
clRhYmxlU2VjdGlvbiAqcyA9IHNlY3Rpb24oKTsKLSAgICBpZiAocykKLSAgICAgICAgcy0+c2V0
TmVlZENlbGxSZWNhbGMoKTsKLSAgICAKLSAgICBSZW5kZXJDb250YWluZXI6OmRlc3Ryb3koKTsK
LX0KLQotdm9pZCBSZW5kZXJUYWJsZVJvdzo6c2V0U3R5bGUoUmVuZGVyU3R5bGUqIHN0eWxlKQot
ewotICAgIHN0eWxlLT5zZXREaXNwbGF5KFRBQkxFX1JPVyk7Ci0gICAgUmVuZGVyQ29udGFpbmVy
OjpzZXRTdHlsZShzdHlsZSk7Ci19Ci0KLXZvaWQgUmVuZGVyVGFibGVSb3c6OmFkZENoaWxkKFJl
bmRlck9iamVjdCAqY2hpbGQsIFJlbmRlck9iamVjdCAqYmVmb3JlQ2hpbGQpCi17Ci0gICAgaWYg
KGNoaWxkLT5lbGVtZW50KCkgJiYgY2hpbGQtPmVsZW1lbnQoKS0+aGFzVGFnTmFtZShmb3JtVGFn
KSkgewotICAgICAgICBSZW5kZXJDb250YWluZXI6OmFkZENoaWxkKGNoaWxkLGJlZm9yZUNoaWxk
KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIFJlbmRlclRhYmxlQ2VsbCAqY2VsbDsK
LQotICAgIGlmICghY2hpbGQtPmlzVGFibGVDZWxsKCkpIHsKLQlSZW5kZXJPYmplY3QgKmxhc3Qg
PSBiZWZvcmVDaGlsZDsKLSAgICAgICAgaWYgKCFsYXN0KQotICAgICAgICAgICAgbGFzdCA9IGxh
c3RDaGlsZCgpOwotICAgICAgICBSZW5kZXJUYWJsZUNlbGwgKmNlbGwgPSAwOwotICAgICAgICBp
ZiAobGFzdCAmJiBsYXN0LT5pc0Fub255bW91cygpICYmIGxhc3QtPmlzVGFibGVDZWxsKCkpCi0g
ICAgICAgICAgICBjZWxsID0gc3RhdGljX2Nhc3Q8UmVuZGVyVGFibGVDZWxsICo+KGxhc3QpOwot
ICAgICAgICBlbHNlIHsKLQkgICAgY2VsbCA9IG5ldyAocmVuZGVyQXJlbmEoKSkgUmVuZGVyVGFi
bGVDZWxsKGRvY3VtZW50KCkgLyogYW5vbnltb3VzIG9iamVjdCAqLyk7Ci0JICAgIFJlbmRlclN0
eWxlICpuZXdTdHlsZSA9IG5ldyAocmVuZGVyQXJlbmEoKSkgUmVuZGVyU3R5bGUoKTsKLQkgICAg
bmV3U3R5bGUtPmluaGVyaXRGcm9tKHN0eWxlKCkpOwotCSAgICBuZXdTdHlsZS0+c2V0RGlzcGxh
eShUQUJMRV9DRUxMKTsKLQkgICAgY2VsbC0+c2V0U3R5bGUobmV3U3R5bGUpOwotCSAgICBhZGRD
aGlsZChjZWxsLCBiZWZvcmVDaGlsZCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2VsbC0+YWRkQ2hp
bGQoY2hpbGQpOwotICAgICAgICBjaGlsZC0+c2V0TmVlZHNMYXlvdXRBbmRNaW5NYXhSZWNhbGMo
KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0gZWxzZQotICAgICAgICBjZWxsID0gc3RhdGljX2Nh
c3Q8UmVuZGVyVGFibGVDZWxsICo+KGNoaWxkKTsKLQotICAgIHN0YXRpY19jYXN0PFJlbmRlclRh
YmxlU2VjdGlvbiAqPihwYXJlbnQoKSktPmFkZENlbGwoY2VsbCk7Ci0KLSAgICBSZW5kZXJDb250
YWluZXI6OmFkZENoaWxkKGNlbGwsYmVmb3JlQ2hpbGQpOwotCi0gICAgaWYgKChiZWZvcmVDaGls
ZCB8fCBuZXh0U2libGluZygpKSAmJiBzZWN0aW9uKCkpCi0Jc2VjdGlvbigpLT5zZXROZWVkQ2Vs
bFJlY2FsYygpOwotfQotCi1SZW5kZXJPYmplY3QqIFJlbmRlclRhYmxlUm93OjpyZW1vdmVDaGls
ZE5vZGUoUmVuZGVyT2JqZWN0KiBjaGlsZCkKLXsKLS8vIFJlbmRlclRhYmxlQ2VsbCBkZXN0cm95
IHNob3VsZCBkbyBpdAotLy8gICAgIGlmICggc2VjdGlvbigpICkKLS8vIAlzZWN0aW9uKCktPnNl
dE5lZWRDZWxsUmVjYWxjKCk7Ci0gICAgcmV0dXJuIFJlbmRlckNvbnRhaW5lcjo6cmVtb3ZlQ2hp
bGROb2RlKGNoaWxkKTsKLX0KLQotI2lmbmRlZiBOREVCVUcKLXZvaWQgUmVuZGVyVGFibGVSb3c6
OmR1bXAoUVRleHRTdHJlYW0gKnN0cmVhbSwgUVN0cmluZyBpbmQpIGNvbnN0Ci17Ci0gICAgUmVu
ZGVyQ29udGFpbmVyOjpkdW1wKHN0cmVhbSxpbmQpOwotfQotI2VuZGlmCi0KLXZvaWQgUmVuZGVy
VGFibGVSb3c6OmxheW91dCgpCi17Ci0gICAgS0hUTUxBc3NlcnQobmVlZHNMYXlvdXQoKSk7Ci0g
ICAgS0hUTUxBc3NlcnQobWluTWF4S25vd24oKSk7Ci0KLSAgICBmb3IgKFJlbmRlck9iamVjdCAq
Y2hpbGQgPSBmaXJzdENoaWxkKCk7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0U2libGluZygp
KSB7Ci0gICAgICAgIGlmIChjaGlsZC0+aXNUYWJsZUNlbGwoKSkgewotICAgICAgICAgICAgUmVu
ZGVyVGFibGVDZWxsICpjZWxsID0gc3RhdGljX2Nhc3Q8UmVuZGVyVGFibGVDZWxsICo+KGNoaWxk
KTsKLSAgICAgICAgICAgIGlmIChjaGlsZC0+bmVlZHNMYXlvdXQoKSkgewotICAgICAgICAgICAg
ICAgIGNlbGwtPmNhbGNWZXJ0aWNhbE1hcmdpbnMoKTsKLSAgICAgICAgICAgICAgICBjZWxsLT5s
YXlvdXQoKTsKLSAgICAgICAgICAgICAgICBjZWxsLT5zZXRDZWxsVG9wRXh0cmEoMCk7Ci0gICAg
ICAgICAgICAgICAgY2VsbC0+c2V0Q2VsbEJvdHRvbUV4dHJhKDApOwotICAgICAgICAgICAgfQot
ICAgICAgICB9Ci0gICAgfQotICAgIHNldE5lZWRzTGF5b3V0KGZhbHNlKTsKLX0KLQotSW50UmVj
dCBSZW5kZXJUYWJsZVJvdzo6Z2V0QWJzb2x1dGVSZXBhaW50UmVjdCgpCi17Ci0gICAgLy8gRm9y
IG5vdywganVzdCByZXBhaW50IHRoZSB3aG9sZSB0YWJsZS4KLSAgICAvLyBGSVhNRTogRmluZCBh
IGJldHRlciB3YXkgdG8gZG8gdGhpcy4KLSAgICBSZW5kZXJUYWJsZSogcGFyZW50VGFibGUgPSB0
YWJsZSgpOwotICAgIGlmIChwYXJlbnRUYWJsZSkKLSAgICAgICAgcmV0dXJuIHBhcmVudFRhYmxl
LT5nZXRBYnNvbHV0ZVJlcGFpbnRSZWN0KCk7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gSW50
UmVjdCgpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVJlbmRlclRhYmxlQ2VsbDo6UmVu
ZGVyVGFibGVDZWxsKERPTTo6Tm9kZUltcGwqIF9ub2RlKQorUmVuZGVyVGFibGVDZWxsOjpSZW5k
ZXJUYWJsZUNlbGwoTm9kZUltcGwqIF9ub2RlKQogICA6IFJlbmRlckJsb2NrKF9ub2RlKQogewog
ICBfY29sID0gLTE7CkBAIC0xNDk0LDE2ICs2MCwxNiBAQCB2b2lkIFJlbmRlclRhYmxlQ2VsbDo6
dXBkYXRlRnJvbUVsZW1lbnQoCiB7CiAgICAgaW50IG9sZFJTcGFuID0gclNwYW47CiAgICAgaW50
IG9sZENTcGFuID0gY1NwYW47Ci0gICAgRE9NOjpOb2RlSW1wbCogbm9kZSA9IGVsZW1lbnQoKTsK
KyAgICBOb2RlSW1wbCogbm9kZSA9IGVsZW1lbnQoKTsKICAgICBpZiAobm9kZSAmJiAobm9kZS0+
aGFzVGFnTmFtZSh0ZFRhZykgfHwgbm9kZS0+aGFzVGFnTmFtZSh0aFRhZykpKSB7Ci0gICAgICAg
IERPTTo6SFRNTFRhYmxlQ2VsbEVsZW1lbnRJbXBsICp0YyA9IHN0YXRpY19jYXN0PERPTTo6SFRN
TFRhYmxlQ2VsbEVsZW1lbnRJbXBsICo+KG5vZGUpOworICAgICAgICBIVE1MVGFibGVDZWxsRWxl
bWVudEltcGwgKnRjID0gc3RhdGljX2Nhc3Q8SFRNTFRhYmxlQ2VsbEVsZW1lbnRJbXBsICo+KG5v
ZGUpOwogICAgICAgICBjU3BhbiA9IHRjLT5jb2xTcGFuKCk7CiAgICAgICAgIHJTcGFuID0gdGMt
PnJvd1NwYW4oKTsKICAgICB9CiAgICAgaWYgKChvbGRSU3BhbiAhPSByU3BhbiB8fCBvbGRDU3Bh
biAhPSBjU3BhbikgJiYgc3R5bGUoKSAmJiBwYXJlbnQoKSkKICAgICAgICAgc2V0TmVlZHNMYXlv
dXRBbmRNaW5NYXhSZWNhbGMoKTsKIH0KLSAgICAKKwogTGVuZ3RoIFJlbmRlclRhYmxlQ2VsbDo6
c3R5bGVPckNvbFdpZHRoKCkKIHsKICAgICBMZW5ndGggdyA9IHN0eWxlKCktPndpZHRoKCk7CkBA
IC0xNTg1LDcgKzE1MSw2IEBAIHNob3J0IFJlbmRlclRhYmxlQ2VsbDo6YmFzZWxpbmVQb3NpdGlv
bigKICAgICByZXR1cm4gb2Zmc2V0OwogfQogCi0KIHZvaWQgUmVuZGVyVGFibGVDZWxsOjpzZXRT
dHlsZShSZW5kZXJTdHlsZSAqc3R5bGUpCiB7CiAgICAgc3R5bGUtPnNldERpc3BsYXkoVEFCTEVf
Q0VMTCk7CkBAIC0xOTQwLDggKzUwNSw2IEBAIGludCBSZW5kZXJUYWJsZUNlbGw6OmJvcmRlckJv
dHRvbSgpIGNvbnMKIH0KIAogI2lmZGVmIEJPWF9ERUJVRwotI2luY2x1ZGUgPHFwYWludGVyLmg+
Ci0KIHN0YXRpYyB2b2lkIG91dGxpbmVCb3goUVBhaW50ZXIgKnAsIGludCBfdHgsIGludCBfdHks
IGludCB3LCBpbnQgaCkKIHsKICAgICBwLT5zZXRQZW4oUVBlbihRQ29sb3IoInllbGxvdyIpLCAz
LCBRdDo6RG90TGluZSkpOwpAQCAtMjE5MSw3ICs3NTQsNiBAQCB2b2lkIFJlbmRlclRhYmxlQ2Vs
bDo6cGFpbnRCb3hEZWNvcmF0aW9uCiAgICAgICAgIHBhaW50Qm9yZGVyKGkucCwgX3R4LCBfdHks
IHcsIGgsIHN0eWxlKCkpOwogfQogCi0KICNpZm5kZWYgTkRFQlVHCiB2b2lkIFJlbmRlclRhYmxl
Q2VsbDo6ZHVtcChRVGV4dFN0cmVhbSAqc3RyZWFtLCBRU3RyaW5nIGluZCkgY29uc3QKIHsKQEAg
LTIyMDUsNTQgKzc2Nyw0IEBAIHZvaWQgUmVuZGVyVGFibGVDZWxsOjpkdW1wKFFUZXh0U3RyZWFt
ICoKIH0KICNlbmRpZgogCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVJlbmRlclRhYmxlQ29sOjpS
ZW5kZXJUYWJsZUNvbChET006Ok5vZGVJbXBsKiBub2RlKQotICAgIDogUmVuZGVyQ29udGFpbmVy
KG5vZGUpCi17Ci0gICAgLy8gaW5pdCBSZW5kZXJPYmplY3QgYXR0cmlidXRlcwotICAgIHNldElu
bGluZSh0cnVlKTsgICAvLyBvdXIgb2JqZWN0IGlzIG5vdCBJbmxpbmUKLQotICAgIF9zcGFuID0g
MTsKLSAgICB1cGRhdGVGcm9tRWxlbWVudCgpOwotfQotCi12b2lkIFJlbmRlclRhYmxlQ29sOjp1
cGRhdGVGcm9tRWxlbWVudCgpCi17Ci0gICAgaW50IG9sZFNwYW4gPSBfc3BhbjsKLSAgICBET006
Ok5vZGVJbXBsICpub2RlID0gZWxlbWVudCgpOwotICAgIGlmIChub2RlICYmIChub2RlLT5oYXNU
YWdOYW1lKGNvbFRhZykgfHwgbm9kZS0+aGFzVGFnTmFtZShjb2xncm91cFRhZykpKSB7Ci0gICAg
ICAgIERPTTo6SFRNTFRhYmxlQ29sRWxlbWVudEltcGwgKnRjID0gc3RhdGljX2Nhc3Q8RE9NOjpI
VE1MVGFibGVDb2xFbGVtZW50SW1wbCAqPihub2RlKTsKLSAgICAgICAgX3NwYW4gPSB0Yy0+c3Bh
bigpOwotICAgIH0gZWxzZQotICAgICAgX3NwYW4gPSAhKHN0eWxlKCkgJiYgc3R5bGUoKS0+ZGlz
cGxheSgpID09IFRBQkxFX0NPTFVNTl9HUk9VUCk7Ci0gICAgaWYgKF9zcGFuICE9IG9sZFNwYW4g
JiYgc3R5bGUoKSAmJiBwYXJlbnQoKSkKLSAgICAgICAgc2V0TmVlZHNMYXlvdXRBbmRNaW5NYXhS
ZWNhbGMoKTsKLX0KLQotYm9vbCBSZW5kZXJUYWJsZUNvbDo6Y2FuSGF2ZUNoaWxkcmVuKCkgY29u
c3QKLXsKLSAgICAvLyBjb2xzIGNhbm5vdCBoYXZlIGNoaWxkcmVuLiAgVGhpcyBpcyBhY3R1YWxs
eSBuZWNlc3NhcnkgdG8gZml4IGEgYnVnCi0gICAgLy8gd2l0aCBsaWJyYXJpZXMudWMuZWR1LCB3
aGljaCBtYWtlcyBhIDxwPiBiZSBhIHRhYmxlLWNvbHVtbi4KLSAgICByZXR1cm4gc3R5bGUoKS0+
ZGlzcGxheSgpID09IFRBQkxFX0NPTFVNTl9HUk9VUDsKLX0KLQotdm9pZCBSZW5kZXJUYWJsZUNv
bDo6YWRkQ2hpbGQoUmVuZGVyT2JqZWN0ICpjaGlsZCwgUmVuZGVyT2JqZWN0ICpiZWZvcmVDaGls
ZCkKLXsKLSAgICBLSFRNTEFzc2VydChjaGlsZC0+c3R5bGUoKS0+ZGlzcGxheSgpID09IFRBQkxF
X0NPTFVNTik7Ci0KLSAgICAvLyB0aGVzZSBoYXZlIHRvIGNvbWUgYmVmb3JlIHRoZSB0YWJsZSBk
ZWZpbml0aW9uIQotICAgIFJlbmRlckNvbnRhaW5lcjo6YWRkQ2hpbGQoY2hpbGQsIGJlZm9yZUNo
aWxkKTsKIH0KLQotI2lmbmRlZiBOREVCVUcKLXZvaWQgUmVuZGVyVGFibGVDb2w6OmR1bXAoUVRl
eHRTdHJlYW0gKnN0cmVhbSwgUVN0cmluZyBpbmQpIGNvbnN0Ci17Ci0gICAgKnN0cmVhbSA8PCAi
IF9zcGFuPSIgPDwgX3NwYW47Ci0gICAgUmVuZGVyQ29udGFpbmVyOjpkdW1wKHN0cmVhbSwgaW5k
KTsKLX0KLSNlbmRpZgotCi0jdW5kZWYgVEFCTEVfREVCVUcKLSN1bmRlZiBERUJVR19MQVlPVVQK
LSN1bmRlZiBCT1hfREVCVUcKSW5kZXg6IHJlbmRlcmluZy9SZW5kZXJUYWJsZS5oCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIHJlbmRlcmluZy9SZW5kZXJUYWJsZS5oCShyZXZpc2lvbiAxMjI1MykKKysrIHJlbmRl
cmluZy9SZW5kZXJUYWJsZS5oCSh3b3JraW5nIGNvcHkpCkBAIC02LDcgKzYsNyBAQAogICogICAg
ICAgICAgIChDKSAxOTk4IFdhbGRvIEJhc3RpYW4gKGJhc3RpYW5Aa2RlLm9yZykKICAqICAgICAg
ICAgICAoQykgMTk5OSBMYXJzIEtub2xsIChrbm9sbEBrZGUub3JnKQogICogICAgICAgICAgIChD
KSAxOTk5IEFudHRpIEtvaXZpc3RvIChrb2l2aXN0b0BrZGUub3JnKQotICogQ29weXJpZ2h0IChD
KSAyMDAzIEFwcGxlIENvbXB1dGVyLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQs
IDIwMDUsIDIwMDYgQXBwbGUgQ29tcHV0ZXIsIEluYy4KICAqCiAgKiBUaGlzIGxpYnJhcnkgaXMg
ZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgKiBtb2RpZnkg
aXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwpAQCAt
MjMsMjYgKzIzLDE2IEBACiAgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1
OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCiAgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVT
QS4KICAqLwotI2lmbmRlZiBSRU5ERVJfVEFCTEVfSAotI2RlZmluZSBSRU5ERVJfVEFCTEVfSAor
I2lmbmRlZiBSZW5kZXJUYWJsZV9ICisjZGVmaW5lIFJlbmRlclRhYmxlX0gKIAotI2luY2x1ZGUg
PHFjb2xvci5oPgorI2luY2x1ZGUgIlJlbmRlckJsb2NrLmgiCiAKLSNpbmNsdWRlICJyZW5kZXJf
YmxvY2suaCIKLSNpbmNsdWRlICJyZW5kZXJfc3R5bGUuaCIKLSNpbmNsdWRlICJraHRtbGxheW91
dC5oIgorbmFtZXNwYWNlIFdlYkNvcmUgewogCi1uYW1lc3BhY2UgRE9NIHsKLSAgICBjbGFzcyBE
T01TdHJpbmc7Ci19OwotCi1uYW1lc3BhY2Uga2h0bWwgewotCi1jbGFzcyBSZW5kZXJUYWJsZTsK
LWNsYXNzIFJlbmRlclRhYmxlU2VjdGlvbjsKLWNsYXNzIFJlbmRlclRhYmxlUm93OwotY2xhc3Mg
UmVuZGVyVGFibGVDZWxsOwogY2xhc3MgUmVuZGVyVGFibGVDb2w7CitjbGFzcyBSZW5kZXJUYWJs
ZUNlbGw7CitjbGFzcyBSZW5kZXJUYWJsZVNlY3Rpb247CiBjbGFzcyBUYWJsZUxheW91dDsKIAog
Y2xhc3MgUmVuZGVyVGFibGUgOiBwdWJsaWMgUmVuZGVyQmxvY2sKQEAgLTE5NywyNDIgKzE4Nyw1
IEBAIHByb3RlY3RlZDoKICAgICBzaG9ydCB2c3BhY2luZzsKIH07CiAKLS8vIC0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0KLQotY2xhc3MgUmVuZGVyVGFibGVTZWN0aW9uIDogcHVibGljIFJlbmRlckNvbnRhaW5l
cgotewotcHVibGljOgotICAgIFJlbmRlclRhYmxlU2VjdGlvbihET006Ok5vZGVJbXBsKiBub2Rl
KTsKLSAgICB+UmVuZGVyVGFibGVTZWN0aW9uKCk7Ci0gICAgdmlydHVhbCB2b2lkIGRlc3Ryb3ko
KTsKLQotICAgIHZpcnR1YWwgdm9pZCBzZXRTdHlsZShSZW5kZXJTdHlsZSAqc3R5bGUpOwotCi0g
ICAgdmlydHVhbCBjb25zdCBjaGFyICpyZW5kZXJOYW1lKCkgY29uc3QgeyByZXR1cm4gIlJlbmRl
clRhYmxlU2VjdGlvbiI7IH0KLQotICAgIC8vIG92ZXJyaWRlcwotICAgIHZpcnR1YWwgdm9pZCBh
ZGRDaGlsZChSZW5kZXJPYmplY3QgKmNoaWxkLCBSZW5kZXJPYmplY3QgKmJlZm9yZUNoaWxkID0g
MCk7Ci0gICAgdmlydHVhbCBib29sIGlzVGFibGVTZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gdHJ1
ZTsgfQotCi0gICAgdmlydHVhbCBzaG9ydCBsaW5lSGVpZ2h0KGJvb2wpIGNvbnN0IHsgcmV0dXJu
IDA7IH0KLSAgICB2aXJ0dWFsIHZvaWQgcG9zaXRpb24oaW50LCBpbnQsIGludCwgaW50LCBpbnQs
IGJvb2wsIGJvb2wsIGludCkge30KLQotI2lmbmRlZiBOREVCVUcKLSAgICB2aXJ0dWFsIHZvaWQg
ZHVtcChRVGV4dFN0cmVhbSAqc3RyZWFtLCBRU3RyaW5nIGluZCA9ICIiKSBjb25zdDsKLSNlbmRp
ZgotCi0gICAgdm9pZCBhZGRDZWxsKFJlbmRlclRhYmxlQ2VsbCAqY2VsbCk7Ci0KLSAgICB2b2lk
IHNldENlbGxXaWR0aHMoKTsKLSAgICB2b2lkIGNhbGNSb3dIZWlnaHQoKTsKLSAgICBpbnQgbGF5
b3V0Um93cyhpbnQgaGVpZ2h0KTsKLQotICAgIFJlbmRlclRhYmxlICp0YWJsZSgpIGNvbnN0IHsg
cmV0dXJuIHN0YXRpY19jYXN0PFJlbmRlclRhYmxlICo+KHBhcmVudCgpKTsgfQotCi0gICAgc3Ry
dWN0IENlbGxTdHJ1Y3QgewotICAgICAgICBSZW5kZXJUYWJsZUNlbGwgKmNlbGw7Ci0gICAgICAg
IGJvb2wgaW5Db2xTcGFuOyAvLyB0cnVlIGZvciBjb2x1bW5zIGFmdGVyIHRoZSBmaXJzdCBpbiBh
IGNvbHNwYW4KLSAgICB9OwotICAgIHR5cGVkZWYgQXJyYXk8Q2VsbFN0cnVjdD4gUm93OwotICAg
IHN0cnVjdCBSb3dTdHJ1Y3QgewotCVJvdyAqcm93OwotCWludCBiYXNlTGluZTsKLQlMZW5ndGgg
aGVpZ2h0OwotICAgIH07Ci0KLSAgICBDZWxsU3RydWN0JiBjZWxsQXQoaW50IHJvdywgIGludCBj
b2wpIHsKLQlyZXR1cm4gKCpncmlkW3Jvd10ucm93KVtjb2xdOwotICAgIH0KLSAgICBjb25zdCBD
ZWxsU3RydWN0JiBjZWxsQXQoaW50IHJvdywgaW50IGNvbCkgY29uc3QgewotCXJldHVybiAoKmdy
aWRbcm93XS5yb3cpW2NvbF07Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIHBhaW50KFBhaW50
SW5mbyYgaSwgaW50IHR4LCBpbnQgdHkpOwotCi0gICAgaW50IG51bVJvd3MoKSBjb25zdCB7IHJl
dHVybiBncmlkUm93czsgfQotICAgIGludCBnZXRCYXNlbGluZShpbnQgcm93KSB7cmV0dXJuIGdy
aWRbcm93XS5iYXNlTGluZTt9Ci0KLSAgICB2b2lkIHNldE5lZWRDZWxsUmVjYWxjKCkgewotICAg
ICAgICBuZWVkQ2VsbFJlY2FsYyA9IHRydWU7Ci0gICAgICAgIHRhYmxlKCktPnNldE5lZWRTZWN0
aW9uUmVjYWxjKCk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBSZW5kZXJPYmplY3QqIHJlbW92ZUNo
aWxkTm9kZShSZW5kZXJPYmplY3QqIGNoaWxkKTsKLQotICAgIC8vIHRoaXMgZ2V0cyBhIGNlbGwg
Z3JpZCBkYXRhIHN0cnVjdHVyZS4gY2hhbmdpbmcgdGhlIG51bWJlciBvZgotICAgIC8vIGNvbHVt
bnMgaXMgZG9uZSBieSB0aGUgdGFibGUKLSAgICBBcnJheTxSb3dTdHJ1Y3Q+IGdyaWQ7Ci0gICAg
aW50IGdyaWRSb3dzOwotICAgIEFycmF5PGludD4gcm93UG9zOwotCi0gICAgaW50IGNDb2w7Ci0g
ICAgaW50IGNSb3c7Ci0gICAgYm9vbCBuZWVkQ2VsbFJlY2FsYzsKLQotICAgIHZvaWQgcmVjYWxj
Q2VsbHMoKTsKLXByb3RlY3RlZDoKLSAgICBib29sIGVuc3VyZVJvd3MoaW50IG51bVJvd3MpOwot
ICAgIHZvaWQgY2xlYXJHcmlkKCk7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNz
IFJlbmRlclRhYmxlUm93IDogcHVibGljIFJlbmRlckNvbnRhaW5lcgotewotcHVibGljOgotICAg
IFJlbmRlclRhYmxlUm93KERPTTo6Tm9kZUltcGwqIG5vZGUpOwotCi0gICAgdmlydHVhbCB2b2lk
IGRlc3Ryb3koKTsKLQotICAgIHZpcnR1YWwgdm9pZCBzZXRTdHlsZShSZW5kZXJTdHlsZSopOwot
ICAgIHZpcnR1YWwgY29uc3QgY2hhciAqcmVuZGVyTmFtZSgpIGNvbnN0IHsgcmV0dXJuICJSZW5k
ZXJUYWJsZVJvdyI7IH0KLQotICAgIHZpcnR1YWwgYm9vbCBpc1RhYmxlUm93KCkgY29uc3QgeyBy
ZXR1cm4gdHJ1ZTsgfQotCi0gICAgLy8gb3ZlcnJpZGVzCi0gICAgdmlydHVhbCB2b2lkIGFkZENo
aWxkKFJlbmRlck9iamVjdCAqY2hpbGQsIFJlbmRlck9iamVjdCAqYmVmb3JlQ2hpbGQgPSAwKTsK
LSAgICB2aXJ0dWFsIFJlbmRlck9iamVjdCogcmVtb3ZlQ2hpbGROb2RlKFJlbmRlck9iamVjdCog
Y2hpbGQpOwotCi0gICAgdmlydHVhbCBzaG9ydCBsaW5lSGVpZ2h0KGJvb2wpIGNvbnN0IHsgcmV0
dXJuIDA7IH0KLSAgICB2aXJ0dWFsIHZvaWQgcG9zaXRpb24oaW50LCBpbnQsIGludCwgaW50LCBp
bnQsIGJvb2wsIGJvb2wsIGludCkge30KLQotICAgIHZpcnR1YWwgdm9pZCBsYXlvdXQoKTsKLSAg
ICB2aXJ0dWFsIEludFJlY3QgZ2V0QWJzb2x1dGVSZXBhaW50UmVjdCgpOwotICAgIAotICAgIFJl
bmRlclRhYmxlICp0YWJsZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PFJlbmRlclRhYmxl
ICo+KHBhcmVudCgpLT5wYXJlbnQoKSk7IH0KLSAgICBSZW5kZXJUYWJsZVNlY3Rpb24gKnNlY3Rp
b24oKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxSZW5kZXJUYWJsZVNlY3Rpb24gKj4ocGFy
ZW50KCkpOyB9Ci0KLSNpZm5kZWYgTkRFQlVHCi0gICAgdmlydHVhbCB2b2lkIGR1bXAoUVRleHRT
dHJlYW0gKnN0cmVhbSwgUVN0cmluZyBpbmQgPSAiIikgY29uc3Q7Ci0jZW5kaWYKLX07Ci0KLS8v
IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgUmVuZGVyVGFibGVDZWxsIDogcHVibGljIFJlbmRl
ckJsb2NrCi17Ci1wdWJsaWM6Ci0gICAgUmVuZGVyVGFibGVDZWxsKERPTTo6Tm9kZUltcGwqIG5v
ZGUpOwotCi0gICAgdmlydHVhbCB2b2lkIGRlc3Ryb3koKTsKLQotICAgIHZpcnR1YWwgY29uc3Qg
Y2hhciAqcmVuZGVyTmFtZSgpIGNvbnN0IHsgcmV0dXJuICJSZW5kZXJUYWJsZUNlbGwiOyB9Ci0g
ICAgdmlydHVhbCBib29sIGlzVGFibGVDZWxsKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotCi0g
ICAgLy8gb3ZlcnJpZGVzIFJlbmRlck9iamVjdAotICAgIHZpcnR1YWwgYm9vbCByZXF1aXJlc0xh
eWVyKCk7Ci0KLSAgICAvLyAjIyMgRklYIHRoZXNlIHR3by4uLgotICAgIGludCBjZWxsSW5kZXgo
KSBjb25zdCB7IHJldHVybiAwOyB9Ci0gICAgdm9pZCBzZXRDZWxsSW5kZXgoaW50KSB7IH0KLQot
ICAgIGludCBjb2xTcGFuKCkgY29uc3QgeyByZXR1cm4gY1NwYW47IH0KLSAgICB2b2lkIHNldENv
bFNwYW4oaW50IGMpIHsgY1NwYW4gPSBjOyB9Ci0KLSAgICBpbnQgcm93U3BhbigpIGNvbnN0IHsg
cmV0dXJuIHJTcGFuOyB9Ci0gICAgdm9pZCBzZXRSb3dTcGFuKGludCByKSB7IHJTcGFuID0gcjsg
fQotCi0gICAgaW50IGNvbCgpIGNvbnN0IHsgcmV0dXJuIF9jb2w7IH0KLSAgICB2b2lkIHNldENv
bChpbnQgY29sKSB7IF9jb2wgPSBjb2w7IH0KLSAgICBpbnQgcm93KCkgY29uc3QgeyByZXR1cm4g
X3JvdzsgfQotICAgIHZvaWQgc2V0Um93KGludCByKSB7IF9yb3cgPSByOyB9Ci0KLSAgICBMZW5n
dGggc3R5bGVPckNvbFdpZHRoKCk7Ci0KLSAgICAvLyBvdmVycmlkZXMKLSAgICB2aXJ0dWFsIHZv
aWQgY2FsY01pbk1heFdpZHRoKCk7Ci0gICAgdmlydHVhbCB2b2lkIGNhbGNXaWR0aCgpOwotICAg
IHZpcnR1YWwgdm9pZCBzZXRXaWR0aChpbnQgd2lkdGgpOwotICAgIHZpcnR1YWwgdm9pZCBzZXRT
dHlsZShSZW5kZXJTdHlsZSAqc3R5bGUpOwotCi0gICAgaW50IGJvcmRlckxlZnQoKSBjb25zdDsK
LSAgICBpbnQgYm9yZGVyUmlnaHQoKSBjb25zdDsKLSAgICBpbnQgYm9yZGVyVG9wKCkgY29uc3Q7
Ci0gICAgaW50IGJvcmRlckJvdHRvbSgpIGNvbnN0OwotCi0gICAgQ29sbGFwc2VkQm9yZGVyVmFs
dWUgY29sbGFwc2VkTGVmdEJvcmRlcigpIGNvbnN0OwotICAgIENvbGxhcHNlZEJvcmRlclZhbHVl
IGNvbGxhcHNlZFJpZ2h0Qm9yZGVyKCkgY29uc3Q7Ci0gICAgQ29sbGFwc2VkQm9yZGVyVmFsdWUg
Y29sbGFwc2VkVG9wQm9yZGVyKCkgY29uc3Q7Ci0gICAgQ29sbGFwc2VkQm9yZGVyVmFsdWUgY29s
bGFwc2VkQm90dG9tQm9yZGVyKCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIGNvbGxlY3RCb3Jk
ZXJzKFFWYWx1ZUxpc3Q8Q29sbGFwc2VkQm9yZGVyVmFsdWU+JiBib3JkZXJTdHlsZXMpOwotCi0g
ICAgdmlydHVhbCB2b2lkIHVwZGF0ZUZyb21FbGVtZW50KCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQg
bGF5b3V0KCk7Ci0gICAgCi0gICAgdm9pZCBzZXRDZWxsVG9wRXh0cmEoaW50IHApIHsgX3RvcEV4
dHJhID0gcDsgfQotICAgIHZvaWQgc2V0Q2VsbEJvdHRvbUV4dHJhKGludCBwKSB7IF9ib3R0b21F
eHRyYSA9IHA7IH0KLQotICAgIHZpcnR1YWwgdm9pZCBwYWludChQYWludEluZm8mIGksIGludCB0
eCwgaW50IHR5KTsKLQotICAgIHZvaWQgcGFpbnRDb2xsYXBzZWRCb3JkZXIoUVBhaW50ZXIqIHAs
IGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoKTsKLSAgICAKLSAgICAvLyBsaWUgcG9zaXRpb24g
dG8gb3V0c2lkZSBvYnNlcnZlcnMKLSAgICB2aXJ0dWFsIGludCB5UG9zKCkgY29uc3QgeyByZXR1
cm4gbV95ICsgX3RvcEV4dHJhOyB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgY29tcHV0ZUFic29sdXRl
UmVwYWludFJlY3QoSW50UmVjdCYgciwgYm9vbCBmPWZhbHNlKTsKLSAgICB2aXJ0dWFsIGJvb2wg
YWJzb2x1dGVQb3NpdGlvbihpbnQgJnhQb3MsIGludCAmeVBvcywgYm9vbCBmID0gZmFsc2UpOwot
Ci0gICAgdmlydHVhbCBzaG9ydCBiYXNlbGluZVBvc2l0aW9uKGJvb2wgPSBmYWxzZSkgY29uc3Q7
Ci0KLSAgICB2aXJ0dWFsIGludCBib3JkZXJUb3BFeHRyYSgpIGNvbnN0IHsgcmV0dXJuIF90b3BF
eHRyYTsgfQotICAgIHZpcnR1YWwgaW50IGJvcmRlckJvdHRvbUV4dHJhKCkgY29uc3QgeyByZXR1
cm4gX2JvdHRvbUV4dHJhOyB9Ci0KLSAgICBSZW5kZXJUYWJsZSAqdGFibGUoKSBjb25zdCB7IHJl
dHVybiBzdGF0aWNfY2FzdDxSZW5kZXJUYWJsZSAqPihwYXJlbnQoKS0+cGFyZW50KCktPnBhcmVu
dCgpKTsgfQotICAgIFJlbmRlclRhYmxlU2VjdGlvbiAqc2VjdGlvbigpIGNvbnN0IHsgcmV0dXJu
IHN0YXRpY19jYXN0PFJlbmRlclRhYmxlU2VjdGlvbiAqPihwYXJlbnQoKS0+cGFyZW50KCkpOyB9
Ci0KLSNpZm5kZWYgTkRFQlVHCi0gICAgdmlydHVhbCB2b2lkIGR1bXAoUVRleHRTdHJlYW0gKnN0
cmVhbSwgUVN0cmluZyBpbmQgPSAiIikgY29uc3Q7Ci0jZW5kaWYKLQotICAgIHZpcnR1YWwgSW50
UmVjdCBnZXRBYnNvbHV0ZVJlcGFpbnRSZWN0KCk7Ci0gICAgCi1wcm90ZWN0ZWQ6Ci0gICAgdmly
dHVhbCB2b2lkIHBhaW50Qm94RGVjb3JhdGlvbnMoUGFpbnRJbmZvJiBpLCBpbnQgX3R4LCBpbnQg
X3R5KTsKLSAgICAKLSAgICBpbnQgX3JvdzsKLSAgICBpbnQgX2NvbDsKLSAgICBpbnQgclNwYW47
Ci0gICAgaW50IGNTcGFuOwotICAgIGludCBfdG9wRXh0cmEgOiAzMTsKLSAgICBib29sIG5XcmFw
IDogMTsKLSAgICBpbnQgX2JvdHRvbUV4dHJhIDogMzE7Ci0gICAgYm9vbCBtX3dpZHRoQ2hhbmdl
ZCA6IDE7Ci0gICAgCi0gICAgaW50IG1fcGVyY2VudGFnZUhlaWdodDsKLX07Ci0KLQotLy8gLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLQotCi1jbGFzcyBSZW5kZXJUYWJsZUNvbCA6IHB1YmxpYyBSZW5kZXJDb250
YWluZXIKLXsKLXB1YmxpYzoKLSAgICBSZW5kZXJUYWJsZUNvbChET006Ok5vZGVJbXBsKiBub2Rl
KTsKLQotICAgIHZpcnR1YWwgY29uc3QgY2hhciAqcmVuZGVyTmFtZSgpIGNvbnN0IHsgcmV0dXJu
ICJSZW5kZXJUYWJsZUNvbCI7IH0KLQotICAgIGludCBzcGFuKCkgY29uc3QgeyByZXR1cm4gX3Nw
YW47IH0KLSAgICB2b2lkIHNldFNwYW4oaW50IHMpIHsgX3NwYW4gPSBzOyB9Ci0KLSAgICB2aXJ0
dWFsIHZvaWQgYWRkQ2hpbGQoUmVuZGVyT2JqZWN0ICpjaGlsZCwgUmVuZGVyT2JqZWN0ICpiZWZv
cmVDaGlsZCA9IDApOwotCi0gICAgdmlydHVhbCBib29sIGlzVGFibGVDb2woKSBjb25zdCB7IHJl
dHVybiB0cnVlOyB9Ci0KLSAgICB2aXJ0dWFsIHNob3J0IGxpbmVIZWlnaHQoYm9vbCkgY29uc3Qg
eyByZXR1cm4gMDsgfQotCi0gICAgdmlydHVhbCB2b2lkIHVwZGF0ZUZyb21FbGVtZW50KCk7Ci0K
LSAgICB2aXJ0dWFsIGJvb2wgY2FuSGF2ZUNoaWxkcmVuKCkgY29uc3Q7Ci0gICAgCi0jaWZuZGVm
IE5ERUJVRwotICAgIHZpcnR1YWwgdm9pZCBkdW1wKFFUZXh0U3RyZWFtICpzdHJlYW0sIFFTdHJp
bmcgaW5kID0gIiIpIGNvbnN0OwotI2VuZGlmCi0KLXByb3RlY3RlZDoKLSAgICBpbnQgX3NwYW47
Ci19OwotCi19OworfQogI2VuZGlmCi0KSW5kZXg6IHJlbmRlcmluZy9SZW5kZXJCbG9jay5oCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIHJlbmRlcmluZy9SZW5kZXJCbG9jay5oCShyZXZpc2lvbiAxMjI1MykKKysr
IHJlbmRlcmluZy9SZW5kZXJCbG9jay5oCSh3b3JraW5nIGNvcHkpCkBAIC0zLDcgKzMsNyBAQAog
ICoKICAqIENvcHlyaWdodCAoQykgMTk5OSBMYXJzIEtub2xsIChrbm9sbEBrZGUub3JnKQogICog
ICAgICAgICAgIChDKSAxOTk5IEFudHRpIEtvaXZpc3RvIChrb2l2aXN0b0BrZGUub3JnKQotICog
Q29weXJpZ2h0IChDKSAyMDAzIEFwcGxlIENvbXB1dGVyLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMp
IDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYgQXBwbGUgQ29tcHV0ZXIsIEluYy4KICAqCiAgKiBUaGlz
IGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29y
CiAgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFs
IFB1YmxpYwpAQCAtMTksMTEgKzE5LDEwIEBACiAgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsg
c2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bwogICogdGhlIEZyZWUg
U29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAog
ICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgogICovCiAKLSNpZm5kZWYgUkVOREVS
X0JMT0NLX0gKLSNkZWZpbmUgUkVOREVSX0JMT0NLX0gKKyNpZm5kZWYgUmVuZGVyQmxvY2tfSAor
I2RlZmluZSBSZW5kZXJCbG9ja19ICiAKICNpbmNsdWRlIDxxcHRybGlzdC5oPgogCkBAIC0zNCwx
MSArMzMsOSBAQCB0eXBlZGVmIGVudW0gewogICAgIERyYWdDYXJldCwKIH0gQ2FyZXRUeXBlOwog
Ci1uYW1lc3BhY2UgRE9NIHsKLSAgICBjbGFzcyBQb3NpdGlvbjsKLX0KK25hbWVzcGFjZSBXZWJD
b3JlIHsKIAotbmFtZXNwYWNlIGtodG1sIHsKK2NsYXNzIFBvc2l0aW9uOwogCiBjbGFzcyBSZW5k
ZXJCbG9jayA6IHB1YmxpYyBSZW5kZXJGbG93CiB7CkluZGV4OiByZW5kZXJpbmcvcmVuZGVyX2Nv
bnRhaW5lci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gcmVuZGVyaW5nL3JlbmRlcl9jb250YWluZXIuY3Bw
CShyZXZpc2lvbiAxMjI1MykKKysrIHJlbmRlcmluZy9yZW5kZXJfY29udGFpbmVyLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtMSw1MjQgKzAsMCBAQAotLyoqCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBv
ZiB0aGUgaHRtbCByZW5kZXJlciBmb3IgS0RFLgotICoKLSAqIENvcHlyaWdodCAoQykgMTk5OSBM
YXJzIEtub2xsIChrbm9sbEBrZGUub3JnKQotICogICAgICAgICAgIChDKSAxOTk5IEFudHRpIEtv
aXZpc3RvIChrb2l2aXN0b0BrZGUub3JnKQotICogICAgICAgICAgIChDKSAyMDAwIERpcmsgTXVl
bGxlciAobXVlbGxlckBrZGUub3JnKQotICogQ29weXJpZ2h0IChDKSAyMDAzIEFwcGxlIENvbXB1
dGVyLCBJbmMuCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4g
cmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0
aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5
IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyIG9mIHRo
ZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAq
IFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUg
dXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGlt
cGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGlj
IExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2
ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBh
bG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90
LCB3cml0ZSB0bwotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVt
cGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0g
KgotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJyZW5kZXJfY29udGFpbmVy
LmgiCi0jaW5jbHVkZSAicmVuZGVyX3RhYmxlLmgiCi0jaW5jbHVkZSAiUmVuZGVyVGV4dEZyYWdt
ZW50LmgiCi0jaW5jbHVkZSAicmVuZGVyX2ltYWdlLmgiCi0jaW5jbHVkZSAicmVuZGVyX2NhbnZh
cy5oIgotI2luY2x1ZGUgIkRvY3VtZW50SW1wbC5oIgotI2luY2x1ZGUgInhtbC9kb21fcG9zaXRp
b24uaCIKLSNpbmNsdWRlICJ2aXNpYmxlX3Bvc2l0aW9uLmgiCi0KLSNpbmNsdWRlIDxrZGVidWcu
aD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQotLy8gRm9yIGFjY2Vzc2liaWxpdHkKLSNpbmNsdWRl
ICJLV1FBY2NPYmplY3RDYWNoZS5oIiAKLQotdXNpbmcgRE9NOjpQb3NpdGlvbjsKLXVzaW5nIG5h
bWVzcGFjZSBraHRtbDsKLQotUmVuZGVyQ29udGFpbmVyOjpSZW5kZXJDb250YWluZXIoRE9NOjpO
b2RlSW1wbCogbm9kZSkKLSAgICA6IFJlbmRlckJveChub2RlKQotewotICAgIG1fZmlyc3QgPSAw
OwotICAgIG1fbGFzdCA9IDA7Ci19Ci0KLQotUmVuZGVyQ29udGFpbmVyOjp+UmVuZGVyQ29udGFp
bmVyKCkKLXsKLX0KLQotdm9pZCBSZW5kZXJDb250YWluZXI6OmRlc3Ryb3koKQotewotICAgIGRl
c3Ryb3lMZWZ0b3ZlckNoaWxkcmVuKCk7Ci0gICAgUmVuZGVyQm94OjpkZXN0cm95KCk7Ci19Ci0K
LXZvaWQgUmVuZGVyQ29udGFpbmVyOjpkZXN0cm95TGVmdG92ZXJDaGlsZHJlbigpCi17Ci0gICAg
d2hpbGUgKG1fZmlyc3QpIHsKLSAgICAgICAgaWYgKG1fZmlyc3QtPmlzTGlzdE1hcmtlcigpKQot
ICAgICAgICAgICAgbV9maXJzdC0+cmVtb3ZlKCk7ICAvLyBMaXN0IG1hcmtlcnMgYXJlIG93bmVk
IGJ5IHRoZWlyIGVuY2xvc2luZyBsaXN0IGFuZCBzbyBkb24ndCBnZXQgZGVzdHJveWVkIGJ5IHRo
aXMgY29udGFpbmVyLgotICAgICAgICBlbHNlIHsKLSAgICAgICAgLy8gRGVzdHJveSBhbnkgYW5v
bnltb3VzIGNoaWxkcmVuIHJlbWFpbmluZyBpbiB0aGUgcmVuZGVyIHRyZWUsIGFzIHdlbGwgYXMg
aW1wbGljaXQgKHNoYWRvdykgRE9NIGVsZW1lbnRzIGxpa2UgdGhvc2UgdXNlZCBpbiB0aGUgZW5n
aW5lLWJhc2VkIHRleHRmaWVsZHMuCi0gICAgICAgICAgICBpZiAobV9maXJzdC0+ZWxlbWVudCgp
KQotICAgICAgICAgICAgICAgIG1fZmlyc3QtPmVsZW1lbnQoKS0+c2V0UmVuZGVyZXIoMCk7Ci0g
ICAgICAgICAgICBtX2ZpcnN0LT5kZXN0cm95KCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLWJv
b2wgUmVuZGVyQ29udGFpbmVyOjpjYW5IYXZlQ2hpbGRyZW4oKSBjb25zdAotewotICAgIHJldHVy
biB0cnVlOwotfQotCi12b2lkIFJlbmRlckNvbnRhaW5lcjo6YWRkQ2hpbGQoUmVuZGVyT2JqZWN0
ICpuZXdDaGlsZCwgUmVuZGVyT2JqZWN0ICpiZWZvcmVDaGlsZCkKLXsKLSNpZmRlZiBERUJVR19M
QVlPVVQKLSAgICBrZERlYnVnKCA2MDQwICkgPDwgdGhpcyA8PCAiOiAiIDw8ICByZW5kZXJOYW1l
KCkgPDwgIihSZW5kZXJPYmplY3QpOjphZGRDaGlsZCggIiA8PCBuZXdDaGlsZCA8PCAiOiAiIDw8
Ci0gICAgICAgIG5ld0NoaWxkLT5yZW5kZXJOYW1lKCkgPDwgIiwgIiA8PCAoYmVmb3JlQ2hpbGQg
PyBiZWZvcmVDaGlsZC0+cmVuZGVyTmFtZSgpIDogIjAiKSA8PCAiICkiIDw8IGVuZGw7Ci0jZW5k
aWYKLQotICAgIGJvb2wgbmVlZHNUYWJsZSA9IGZhbHNlOwotCi0gICAgaWYoIW5ld0NoaWxkLT5p
c1RleHQoKSAmJiAhbmV3Q2hpbGQtPmlzUmVwbGFjZWQoKSkgewotICAgICAgICBzd2l0Y2gobmV3
Q2hpbGQtPnN0eWxlKCktPmRpc3BsYXkoKSkgewotICAgICAgICBjYXNlIElOTElORToKLSAgICAg
ICAgY2FzZSBCTE9DSzoKLSAgICAgICAgY2FzZSBJTkxJTkVfQkxPQ0s6Ci0gICAgICAgIGNhc2Ug
TElTVF9JVEVNOgotICAgICAgICBjYXNlIFJVTl9JTjoKLSAgICAgICAgY2FzZSBDT01QQUNUOgot
ICAgICAgICBjYXNlIEJPWDoKLSAgICAgICAgY2FzZSBJTkxJTkVfQk9YOgotICAgICAgICBjYXNl
IFRBQkxFOgotICAgICAgICBjYXNlIElOTElORV9UQUJMRToKLSAgICAgICAgY2FzZSBUQUJMRV9D
T0xVTU46Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUQUJMRV9DT0xVTU5fR1JP
VVA6Ci0gICAgICAgIGNhc2UgVEFCTEVfQ0FQVElPTjoKLSAgICAgICAgY2FzZSBUQUJMRV9ST1df
R1JPVVA6Ci0gICAgICAgIGNhc2UgVEFCTEVfSEVBREVSX0dST1VQOgotICAgICAgICBjYXNlIFRB
QkxFX0ZPT1RFUl9HUk9VUDoKLQotICAgICAgICAgICAgLy9rZERlYnVnKCA2MDQwICkgPDwgImFk
ZGluZyBzZWN0aW9uIiA8PCBlbmRsOwotICAgICAgICAgICAgaWYgKCAhaXNUYWJsZSgpICkKLSAg
ICAgICAgICAgICAgICBuZWVkc1RhYmxlID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAg
ICAgICBjYXNlIFRBQkxFX1JPVzoKLSAgICAgICAgICAgIC8va2REZWJ1ZyggNjA0MCApIDw8ICJh
ZGRpbmcgcm93IiA8PCBlbmRsOwotICAgICAgICAgICAgaWYgKCAhaXNUYWJsZVNlY3Rpb24oKSAp
Ci0gICAgICAgICAgICAgICAgbmVlZHNUYWJsZSA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsK
LSAgICAgICAgY2FzZSBUQUJMRV9DRUxMOgotICAgICAgICAgICAgLy9rZERlYnVnKCA2MDQwICkg
PDwgImFkZGluZyBjZWxsIiA8PCBlbmRsOwotICAgICAgICAgICAgaWYgKCAhaXNUYWJsZVJvdygp
ICkKLSAgICAgICAgICAgICAgICBuZWVkc1RhYmxlID0gdHJ1ZTsKLSAgICAgICAgICAgIC8vIEkn
bSBub3QgMTAwJSBzdXJlIHRoaXMgaXMgdGhlIGJlc3Qgd2F5IHRvIGZpeCB0aGlzLCBidXQgd2l0
aG91dCB0aGlzCi0gICAgICAgICAgICAvLyBjaGFuZ2Ugd2UgcmVjdXJzZSBpbmZpbml0ZWx5IHdo
ZW4gdHJ5aW5nIHRvIHJlbmRlciB0aGUgQ1NTMiB0ZXN0IHBhZ2U6Ci0gICAgICAgICAgICAvLyBo
dHRwOi8vd3d3LmJhdGguYWMudWsvJTdFcHk4aWVoL2ludGVybmV0L2V2aWx0ZXN0cy9odG1sYm9k
eWhlYWRyZW5kZXJpbmcyLmh0bWwuCi0gICAgICAgICAgICAvLyBTZWUgUmFkYXIgMjkyNTI5MS4K
LSAgICAgICAgICAgIGlmICggaXNUYWJsZUNlbGwoKSAmJiAhZmlyc3RDaGlsZCgpICYmICFuZXdD
aGlsZC0+aXNUYWJsZUNlbGwoKSApCi0gICAgICAgICAgICAgICAgbmVlZHNUYWJsZSA9IGZhbHNl
OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTk9ORToKLSAgICAgICAgICAgIGtk
RGVidWcoIDYwMDAgKSA8PCAiZXJyb3IgaW4gUmVuZGVyT2JqZWN0OjphZGRDaGlsZCgpISEhISIg
PDwgZW5kbDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYg
KCBuZWVkc1RhYmxlICkgewotICAgICAgICBSZW5kZXJUYWJsZSAqdGFibGU7Ci0gICAgICAgIGlm
KCAhYmVmb3JlQ2hpbGQgKQotICAgICAgICAgICAgYmVmb3JlQ2hpbGQgPSBsYXN0Q2hpbGQoKTsK
LSAgICAgICAgaWYoIGJlZm9yZUNoaWxkICYmIGJlZm9yZUNoaWxkLT5pc0Fub255bW91cygpICYm
IGJlZm9yZUNoaWxkLT5pc1RhYmxlKCkgKQotICAgICAgICAgICAgdGFibGUgPSBzdGF0aWNfY2Fz
dDxSZW5kZXJUYWJsZSAqPihiZWZvcmVDaGlsZCk7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAg
ICAgLy9rZERlYnVnKCA2MDQwICkgPDwgImNyZWF0aW5nIGFub255bW91cyB0YWJsZSIgPDwgZW5k
bDsKLSAgICAgICAgICAgIHRhYmxlID0gbmV3IChyZW5kZXJBcmVuYSgpKSBSZW5kZXJUYWJsZShk
b2N1bWVudCgpIC8qIGlzIGFub255bW91cyAqLyk7Ci0gICAgICAgICAgICBSZW5kZXJTdHlsZSAq
bmV3U3R5bGUgPSBuZXcgKHJlbmRlckFyZW5hKCkpIFJlbmRlclN0eWxlKCk7Ci0gICAgICAgICAg
ICBuZXdTdHlsZS0+aW5oZXJpdEZyb20oc3R5bGUoKSk7Ci0gICAgICAgICAgICBuZXdTdHlsZS0+
c2V0RGlzcGxheShUQUJMRSk7Ci0gICAgICAgICAgICB0YWJsZS0+c2V0U3R5bGUobmV3U3R5bGUp
OwotICAgICAgICAgICAgYWRkQ2hpbGQodGFibGUsIGJlZm9yZUNoaWxkKTsKLSAgICAgICAgfQot
ICAgICAgICB0YWJsZS0+YWRkQ2hpbGQobmV3Q2hpbGQpOwotICAgIH0gZWxzZSB7Ci0JLy8ganVz
dCBhZGQgaXQuLi4KLQlpbnNlcnRDaGlsZE5vZGUobmV3Q2hpbGQsIGJlZm9yZUNoaWxkKTsKLSAg
ICB9Ci19Ci0KLVJlbmRlck9iamVjdCogUmVuZGVyQ29udGFpbmVyOjpyZW1vdmVDaGlsZE5vZGUo
UmVuZGVyT2JqZWN0KiBvbGRDaGlsZCkKLXsKLSAgICBLSFRNTEFzc2VydChvbGRDaGlsZC0+cGFy
ZW50KCkgPT0gdGhpcyk7Ci0KLSAgICAvLyBTbyB0aGF0IHdlJ2xsIGdldCB0aGUgYXBwcm9wcmlh
dGUgZGlydHkgYml0IHNldCAoZWl0aGVyIHRoYXQgYSBub3JtYWwgZmxvdyBjaGlsZCBnb3QgeWFu
a2VkIG9yCi0gICAgLy8gdGhhdCBhIHBvc2l0aW9uZWQgY2hpbGQgZ290IHlhbmtlZCkuICBXZSBh
bHNvIHJlcGFpbnQsIHNvIHRoYXQgdGhlIGFyZWEgZXhwb3NlZCB3aGVuIHRoZSBjaGlsZAotICAg
IC8vIGRpc2FwcGVhcnMgZ2V0cyByZXBhaW50ZWQgcHJvcGVybHkuCi0gICAgaWYgKCFkb2N1bWVu
dEJlaW5nRGVzdHJveWVkKCkpIHsKLSAgICAgICAgb2xkQ2hpbGQtPnNldE5lZWRzTGF5b3V0QW5k
TWluTWF4UmVjYWxjKCk7Ci0gICAgICAgIG9sZENoaWxkLT5yZXBhaW50KCk7Ci0gICAgICAgIAot
ICAgICAgICAvLyBLZWVwIG91ciBsYXllciBoaWVyYXJjaHkgdXBkYXRlZC4KLSAgICAgICAgb2xk
Q2hpbGQtPnJlbW92ZUxheWVycyhlbmNsb3NpbmdMYXllcigpKTsKLSAgICAKLSAgICAgICAgLy8g
aWYgb2xkQ2hpbGQgaXMgdGhlIHN0YXJ0IG9yIGVuZCBvZiB0aGUgc2VsZWN0aW9uLCB0aGVuIGNs
ZWFyIHRoZSBzZWxlY3Rpb24gdG8KLSAgICAgICAgLy8gYXZvaWQgcHJvYmxlbXMgb2YgaW52YWxp
ZCBwb2ludGVycwotICAgIAotICAgICAgICAvLyAjIyMgVGhpcyBpcyBub3QgdGhlICJwcm9wZXIi
IHNvbHV0aW9uLi4uIGlkZWFsbHkgdGhlIHNlbGVjdGlvbiBzaG91bGQgYmUgbWFpbnRhaW5lZAot
ICAgICAgICAvLyBiYXNlZCBvbiBET00gTm9kZXMgYW5kIGEgUmFuZ2UsIHdoaWNoIGdldHMgYWRq
dXN0ZWQgYXBwcm9wcmlhdGVseSB3aGVuIG5vZGVzIGFyZQotICAgICAgICAvLyBkZWxldGVkL2lu
c2VydGVkIG5lYXIgZXRjLiBCdXQgdGhpcyBhdCBsZWFzdCBwcmV2ZW50cyBjcmFzaGVzIGNhdXNl
ZCB3aGVuIHRoZSBzdGFydAotICAgICAgICAvLyBvciBlbmQgb2YgdGhlIHNlbGVjdGlvbiBpcyBk
ZWxldGVkIGFuZCB0aGVuIGFjY2Vzc2VkIHdoZW4gdGhlIHVzZXIgbmV4dCBzZWxlY3RzCi0gICAg
ICAgIC8vIHNvbWV0aGluZy4KLSAgICAKLSAgICAgICAgaWYgKG9sZENoaWxkLT5pc1NlbGVjdGlv
bkJvcmRlcigpKQotICAgICAgICAgICAgY2FudmFzKCktPmNsZWFyU2VsZWN0aW9uKCk7Ci0gICAg
fQotICAgIAotICAgIC8vIHJlbW92ZSB0aGUgY2hpbGQKLSAgICBpZiAob2xkQ2hpbGQtPnByZXZp
b3VzU2libGluZygpKQotICAgICAgICBvbGRDaGlsZC0+cHJldmlvdXNTaWJsaW5nKCktPnNldE5l
eHRTaWJsaW5nKG9sZENoaWxkLT5uZXh0U2libGluZygpKTsKLSAgICBpZiAob2xkQ2hpbGQtPm5l
eHRTaWJsaW5nKCkpCi0gICAgICAgIG9sZENoaWxkLT5uZXh0U2libGluZygpLT5zZXRQcmV2aW91
c1NpYmxpbmcob2xkQ2hpbGQtPnByZXZpb3VzU2libGluZygpKTsKLQotICAgIGlmIChtX2ZpcnN0
ID09IG9sZENoaWxkKQotICAgICAgICBtX2ZpcnN0ID0gb2xkQ2hpbGQtPm5leHRTaWJsaW5nKCk7
Ci0gICAgaWYgKG1fbGFzdCA9PSBvbGRDaGlsZCkKLSAgICAgICAgbV9sYXN0ID0gb2xkQ2hpbGQt
PnByZXZpb3VzU2libGluZygpOwotCi0gICAgb2xkQ2hpbGQtPnNldFByZXZpb3VzU2libGluZygw
KTsKLSAgICBvbGRDaGlsZC0+c2V0TmV4dFNpYmxpbmcoMCk7Ci0gICAgb2xkQ2hpbGQtPnNldFBh
cmVudCgwKTsKLQotI2lmIF9fQVBQTEVfXwotICAgIGlmIChLV1FBY2NPYmplY3RDYWNoZTo6YWNj
ZXNzaWJpbGl0eUVuYWJsZWQoKSkKLSAgICAgICAgZG9jdW1lbnQoKS0+Z2V0QWNjT2JqZWN0Q2Fj
aGUoKS0+Y2hpbGRyZW5DaGFuZ2VkKHRoaXMpOwotI2VuZGlmCi0KLSAgICByZXR1cm4gb2xkQ2hp
bGQ7Ci19Ci0KLXZvaWQgUmVuZGVyQ29udGFpbmVyOjpyZW1vdmVDaGlsZChSZW5kZXJPYmplY3Qg
Km9sZENoaWxkKQotewotICAgIHJlbW92ZUNoaWxkTm9kZShvbGRDaGlsZCk7Ci19Ci0KLXZvaWQg
UmVuZGVyQ29udGFpbmVyOjp1cGRhdGVQc2V1ZG9DaGlsZChSZW5kZXJTdHlsZTo6UHNldWRvSWQg
dHlwZSwgUmVuZGVyT2JqZWN0KiBjaGlsZCkKLXsKLSAgICAvLyBJbiBDU1MyLCBiZWZvcmUvYWZ0
ZXIgcHNldWRvLWNvbnRlbnQgY2Fubm90IG5lc3QuICBDaGVjayB0aGlzIGZpcnN0LgotICAgIGlm
IChzdHlsZSgpLT5zdHlsZVR5cGUoKSA9PSBSZW5kZXJTdHlsZTo6QkVGT1JFIHx8IHN0eWxlKCkt
PnN0eWxlVHlwZSgpID09IFJlbmRlclN0eWxlOjpBRlRFUikKLSAgICAgICAgcmV0dXJuOwotICAg
IAotICAgIFJlbmRlclN0eWxlKiBwc2V1ZG8gPSBnZXRQc2V1ZG9TdHlsZSh0eXBlKTsKLQotICAg
IC8vIFdoZXRoZXIgb3Igbm90IHdlIGN1cnJlbnRseSBoYXZlIGdlbmVyYXRlZCBjb250ZW50IGF0
dGFjaGVkLgotICAgIGJvb2wgb2xkQ29udGVudFByZXNlbnQgPSBjaGlsZCAmJiAoY2hpbGQtPnN0
eWxlKCktPnN0eWxlVHlwZSgpID09IHR5cGUpOwotCi0gICAgLy8gV2hldGhlciBvciBub3Qgd2Ug
bm93IHdhbnQgZ2VuZXJhdGVkIGNvbnRlbnQuICAKLSAgICBib29sIG5ld0NvbnRlbnRXYW50ZWQg
PSBwc2V1ZG8gJiYgcHNldWRvLT5kaXNwbGF5KCkgIT0gTk9ORTsKLQotICAgIC8vIEZvciA8cT48
cC8+PC9xPiwgaWYgdGhpcyBvYmplY3QgaXMgdGhlIGlubGluZSBjb250aW51YXRpb24gb2YgdGhl
IDxxPiwgd2Ugb25seSB3YW50IHRvIGdlbmVyYXRlCi0gICAgLy8gOmFmdGVyIGNvbnRlbnQgYW5k
IG5vdCA6YmVmb3JlIGNvbnRlbnQuCi0gICAgaWYgKG5ld0NvbnRlbnRXYW50ZWQgJiYgdHlwZSA9
PSBSZW5kZXJTdHlsZTo6QkVGT1JFICYmIGlzSW5saW5lQ29udGludWF0aW9uKCkpCi0gICAgICAg
IG5ld0NvbnRlbnRXYW50ZWQgPSBmYWxzZTsKLQotICAgIC8vIFNpbWlsYXJseSwgaWYgd2UncmUg
dGhlIGJlZ2lubmluZyBvZiBhIDxxPiwgYW5kIHRoZXJlJ3MgYW4gaW5saW5lIGNvbnRpbnVhdGlv
biBmb3Igb3VyIG9iamVjdCwKLSAgICAvLyB0aGVuIHdlIGRvbid0IGdlbmVyYXRlIHRoZSA6YWZ0
ZXIgY29udGVudC4KLSAgICBpZiAobmV3Q29udGVudFdhbnRlZCAmJiB0eXBlID09IFJlbmRlclN0
eWxlOjpBRlRFUiAmJiBpc1JlbmRlcklubGluZSgpICYmIGNvbnRpbnVhdGlvbigpKQotICAgICAg
ICBuZXdDb250ZW50V2FudGVkID0gZmFsc2U7Ci0gICAgCi0gICAgLy8gSWYgd2UgZG9uJ3Qgd2Fu
dCBnZW5lcmF0ZWQgY29udGVudCBhbnkgbG9uZ2VyLCBvciBpZiB3ZSBoYXZlIGdlbmVyYXRlZCBj
b250ZW50LCBidXQgaXQncyBubyBsb25nZXIKLSAgICAvLyBpZGVudGljYWwgdG8gdGhlIG5ldyBj
b250ZW50IGRhdGEgd2Ugd2FudCB0byBidWlsZCByZW5kZXIgb2JqZWN0cyBmb3IsIHRoZW4gd2Ug
bnVrZSBhbGwKLSAgICAvLyBvZiB0aGUgb2xkIGdlbmVyYXRlZCBjb250ZW50LgotICAgIGlmICgh
bmV3Q29udGVudFdhbnRlZCB8fAotICAgICAgICAob2xkQ29udGVudFByZXNlbnQgJiYgIWNoaWxk
LT5zdHlsZSgpLT5jb250ZW50RGF0YUVxdWl2YWxlbnQocHNldWRvKSkpIHsKLSAgICAgICAgLy8g
TnVrZSB0aGUgY2hpbGQuIAotICAgICAgICBpZiAoY2hpbGQgJiYgY2hpbGQtPnN0eWxlKCktPnN0
eWxlVHlwZSgpID09IHR5cGUpIHsKLSAgICAgICAgICAgIG9sZENvbnRlbnRQcmVzZW50ID0gZmFs
c2U7Ci0gICAgICAgICAgICBjaGlsZC0+ZGVzdHJveSgpOwotICAgICAgICAgICAgY2hpbGQgPSAo
dHlwZSA9PSBSZW5kZXJTdHlsZTo6QkVGT1JFKSA/IGZpcnN0Q2hpbGQoKSA6IGxhc3RDaGlsZCgp
OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gSWYgd2UgaGF2ZSBubyBwc2V1ZG8tc3R5bGUg
b3IgaWYgdGhlIHBzZXVkbydzIGRpc3BsYXkgdHlwZSBpcyBOT05FLCB0aGVuIHdlCi0gICAgLy8g
aGF2ZSBubyBnZW5lcmF0ZWQgY29udGVudCBhbmQgY2FuIG5vdyByZXR1cm4uCi0gICAgaWYgKCFu
ZXdDb250ZW50V2FudGVkKQotICAgICAgICByZXR1cm47Ci0KLSAgICBpZiAoaXNJbmxpbmVGbG93
KCkgJiYgcHNldWRvLT5kaXNwbGF5KCkgIT0gSU5MSU5FKQotICAgICAgICAvLyBBY2NvcmRpbmcg
dG8gdGhlIENTUzIgc3BlYyAodGhlIGVuZCBvZiBzZWN0aW9uIDEyLjEpLCB0aGUgb25seSBhbGxv
d2VkCi0gICAgICAgIC8vIGRpc3BsYXkgdmFsdWVzIGZvciB0aGUgcHNldWRvIHN0eWxlIGFyZSBO
T05FIGFuZCBJTkxJTkUuICBTaW5jZSB3ZSBhbHJlYWR5Ci0gICAgICAgIC8vIGRldGVybWluZWQg
dGhhdCB0aGUgcHNldWRvIGlzIG5vdCBkaXNwbGF5IE5PTkUsIGFueSBkaXNwbGF5IG90aGVyIHRo
YW4KLSAgICAgICAgLy8gaW5saW5lIHNob3VsZCBiZSBtdXRhdGVkIHRvIElOTElORS4KLSAgICAg
ICAgcHNldWRvLT5zZXREaXNwbGF5KElOTElORSk7Ci0gICAgCi0gICAgaWYgKG9sZENvbnRlbnRQ
cmVzZW50KSB7Ci0gICAgICAgIGlmIChjaGlsZCAmJiBjaGlsZC0+c3R5bGUoKS0+c3R5bGVUeXBl
KCkgPT0gdHlwZSkgewotICAgICAgICAgICAgLy8gV2UgaGF2ZSBnZW5lcmF0ZWQgY29udGVudCBw
cmVzZW50IHN0aWxsLiAgV2Ugd2FudCB0byB3YWxrIHRoaXMgY29udGVudCBhbmQgdXBkYXRlIG91
cgotICAgICAgICAgICAgLy8gc3R5bGUgaW5mb3JtYXRpb24gd2l0aCB0aGUgbmV3IHBzZXVkbyBz
dHlsZS4KLSAgICAgICAgICAgIGNoaWxkLT5zZXRTdHlsZShwc2V1ZG8pOwotCi0gICAgICAgICAg
ICAvLyBOb3RlIHRoYXQgaWYgd2UgZXZlciBzdXBwb3J0IGFkZGl0aW9uYWwgdHlwZXMgb2YgZ2Vu
ZXJhdGVkIGNvbnRlbnQgKHdoaWNoIHNob3VsZCBiZSB3YXkgb2ZmCi0gICAgICAgICAgICAvLyBp
biB0aGUgZnV0dXJlKSwgdGhpcyBjb2RlIHdpbGwgbmVlZCB0byBiZSBwYXRjaGVkLgotICAgICAg
ICAgICAgZm9yIChSZW5kZXJPYmplY3QqIGdlbkNoaWxkID0gY2hpbGQtPmZpcnN0Q2hpbGQoKTsg
Z2VuQ2hpbGQ7IGdlbkNoaWxkID0gZ2VuQ2hpbGQtPm5leHRTaWJsaW5nKCkpIHsKLSAgICAgICAg
ICAgICAgICBpZiAoZ2VuQ2hpbGQtPmlzVGV4dCgpKQotICAgICAgICAgICAgICAgICAgICAvLyBH
ZW5lcmF0ZWQgdGV4dCBjb250ZW50IGlzIGEgY2hpbGQgd2hvc2Ugc3R5bGUgYWxzbyBuZWVkcyB0
byBiZSBzZXQgdG8gdGhlIHBzZXVkbwotICAgICAgICAgICAgICAgICAgICAvLyBzdHlsZS4KLSAg
ICAgICAgICAgICAgICAgICAgZ2VuQ2hpbGQtPnNldFN0eWxlKHBzZXVkbyk7Ci0gICAgICAgICAg
ICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEltYWdlcyBnZXQgYW4gZW1wdHkg
c3R5bGUgdGhhdCBpbmhlcml0cyBmcm9tIHRoZSBwc2V1ZG8uCi0gICAgICAgICAgICAgICAgICAg
IFJlbmRlclN0eWxlKiBzdHlsZSA9IG5ldyAocmVuZGVyQXJlbmEoKSkgUmVuZGVyU3R5bGUoKTsK
LSAgICAgICAgICAgICAgICAgICAgc3R5bGUtPmluaGVyaXRGcm9tKHBzZXVkbyk7Ci0gICAgICAg
ICAgICAgICAgICAgIGdlbkNoaWxkLT5zZXRTdHlsZShzdHlsZSk7Ci0gICAgICAgICAgICAgICAg
fQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsgLy8gV2UndmUgdXBk
YXRlZCB0aGUgZ2VuZXJhdGVkIGNvbnRlbnQuIFRoYXQncyBhbGwgd2UgbmVlZGVkIHRvIGRvLgot
ICAgIH0KLSAgICAKLSAgICBSZW5kZXJPYmplY3QqIGluc2VydEJlZm9yZSA9ICh0eXBlID09IFJl
bmRlclN0eWxlOjpCRUZPUkUpID8gY2hpbGQgOiAwOwotCi0gICAgLy8gR2VuZXJhdGVkIGNvbnRl
bnQgY29uc2lzdHMgb2YgYSBzaW5nbGUgY29udGFpbmVyIHRoYXQgaG91c2VzIG11bHRpcGxlIGNo
aWxkcmVuIChzcGVjaWZpZWQKLSAgICAvLyBieSB0aGUgY29udGVudCBwcm9wZXJ0eSkuICBUaGlz
IHBzZXVkbyBjb250YWluZXIgZ2V0cyB0aGUgcHNldWRvIHN0eWxlIHNldCBvbiBpdC4KLSAgICBS
ZW5kZXJPYmplY3QqIHBzZXVkb0NvbnRhaW5lciA9IDA7Ci0gICAgCi0gICAgLy8gTm93IHdhbGsg
b3VyIGxpc3Qgb2YgZ2VuZXJhdGVkIGNvbnRlbnQgYW5kIGNyZWF0ZSByZW5kZXIgb2JqZWN0cyBm
b3IgZXZlcnkgdHlwZQotICAgIC8vIHdlIGVuY291bnRlci4KLSAgICBmb3IgKENvbnRlbnREYXRh
KiBjb250ZW50RGF0YSA9IHBzZXVkby0+Y29udGVudERhdGEoKTsKLSAgICAgICAgIGNvbnRlbnRE
YXRhOyBjb250ZW50RGF0YSA9IGNvbnRlbnREYXRhLT5fbmV4dENvbnRlbnQpIHsKLSAgICAgICAg
aWYgKCFwc2V1ZG9Db250YWluZXIpCi0gICAgICAgICAgICBwc2V1ZG9Db250YWluZXIgPSBSZW5k
ZXJGbG93OjpjcmVhdGVBbm9ueW1vdXNGbG93KGRvY3VtZW50KCksIHBzZXVkbyk7IC8qIGFub255
bW91cyBib3ggKi8KLSAgICAgICAgCi0gICAgICAgIGlmIChjb250ZW50RGF0YS0+Y29udGVudFR5
cGUoKSA9PSBDT05URU5UX1RFWFQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJlbmRlclRleHQq
IHQgPSBuZXcgKHJlbmRlckFyZW5hKCkpIFJlbmRlclRleHRGcmFnbWVudChkb2N1bWVudCgpIC8q
YW5vbnltb3VzIG9iamVjdCAqLywgY29udGVudERhdGEtPmNvbnRlbnRUZXh0KCkpOwotICAgICAg
ICAgICAgdC0+c2V0U3R5bGUocHNldWRvKTsKLSAgICAgICAgICAgIHBzZXVkb0NvbnRhaW5lci0+
YWRkQ2hpbGQodCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoY29udGVudERhdGEtPmNv
bnRlbnRUeXBlKCkgPT0gQ09OVEVOVF9PQkpFQ1QpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJl
bmRlckltYWdlKiBpbWcgPSBuZXcgKHJlbmRlckFyZW5hKCkpIFJlbmRlckltYWdlKGRvY3VtZW50
KCkpOyAvKiBBbm9ueW1vdXMgb2JqZWN0ICovCi0gICAgICAgICAgICBSZW5kZXJTdHlsZSogc3R5
bGUgPSBuZXcgKHJlbmRlckFyZW5hKCkpIFJlbmRlclN0eWxlKCk7Ci0gICAgICAgICAgICBzdHls
ZS0+aW5oZXJpdEZyb20ocHNldWRvKTsKLSAgICAgICAgICAgIGltZy0+c2V0U3R5bGUoc3R5bGUp
OwotICAgICAgICAgICAgaW1nLT5zZXRDb250ZW50T2JqZWN0KGNvbnRlbnREYXRhLT5jb250ZW50
T2JqZWN0KCkpOwotICAgICAgICAgICAgcHNldWRvQ29udGFpbmVyLT5hZGRDaGlsZChpbWcpOwot
ICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHBzZXVkb0NvbnRhaW5lcikgewotICAgICAgICAv
LyBBZGQgdGhlIHBzZXVkbyBhZnRlciB3ZSd2ZSBpbnN0YWxsZWQgYWxsIG91ciBjb250ZW50LCBz
byB0aGF0IGFkZENoaWxkIHdpbGwgYmUgYWJsZSB0byBmaW5kIHRoZSB0ZXh0Ci0gICAgICAgIC8v
IGluc2lkZSB0aGUgaW5saW5lIGZvciBlLmcuLCBmaXJzdC1sZXR0ZXIgc3R5bGluZy4KLSAgICAg
ICAgYWRkQ2hpbGQocHNldWRvQ29udGFpbmVyLCBpbnNlcnRCZWZvcmUpOwotICAgIH0KLX0KLQot
Ci12b2lkIFJlbmRlckNvbnRhaW5lcjo6YXBwZW5kQ2hpbGROb2RlKFJlbmRlck9iamVjdCogbmV3
Q2hpbGQpCi17Ci0gICAgS0hUTUxBc3NlcnQobmV3Q2hpbGQtPnBhcmVudCgpID09IDApOwotCi0g
ICAgbmV3Q2hpbGQtPnNldFBhcmVudCh0aGlzKTsKLSAgICBSZW5kZXJPYmplY3QqIGxDaGlsZCA9
IGxhc3RDaGlsZCgpOwotCi0gICAgaWYobENoaWxkKQotICAgIHsKLSAgICAgICAgbmV3Q2hpbGQt
PnNldFByZXZpb3VzU2libGluZyhsQ2hpbGQpOwotICAgICAgICBsQ2hpbGQtPnNldE5leHRTaWJs
aW5nKG5ld0NoaWxkKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICBzZXRGaXJzdENoaWxkKG5l
d0NoaWxkKTsKLQotICAgIHNldExhc3RDaGlsZChuZXdDaGlsZCk7Ci0gICAgCi0gICAgLy8gS2Vl
cCBvdXIgbGF5ZXIgaGllcmFyY2h5IHVwZGF0ZWQuICBPcHRpbWl6ZSBmb3IgdGhlIGNvbW1vbiBj
YXNlIHdoZXJlIHdlIGRvbid0IGhhdmUgYW55IGNoaWxkcmVuCi0gICAgLy8gYW5kIGRvbid0IGhh
dmUgYSBsYXllciBhdHRhY2hlZCB0byBvdXJzZWx2ZXMuCi0gICAgaWYgKG5ld0NoaWxkLT5maXJz
dENoaWxkKCkgfHwgbmV3Q2hpbGQtPmxheWVyKCkpIHsKLSAgICAgICAgUmVuZGVyTGF5ZXIqIGxh
eWVyID0gZW5jbG9zaW5nTGF5ZXIoKTsKLSAgICAgICAgbmV3Q2hpbGQtPmFkZExheWVycyhsYXll
ciwgbmV3Q2hpbGQpOwotICAgIH0KLSAgICAKLSAgICBuZXdDaGlsZC0+c2V0TmVlZHNMYXlvdXRB
bmRNaW5NYXhSZWNhbGMoKTsgLy8gR29lcyB1cCB0aGUgY29udGFpbmluZyBibG9jayBoaWVyYXJj
aHkuCi0gICAgaWYgKCFub3JtYWxDaGlsZE5lZWRzTGF5b3V0KCkpCi0gICAgICAgIHNldENoaWxk
TmVlZHNMYXlvdXQodHJ1ZSk7IC8vIFdlIG1heSBzdXBwbHkgdGhlIHN0YXRpYyBwb3NpdGlvbiBm
b3IgYW4gYWJzb2x1dGUgcG9zaXRpb25lZCBjaGlsZC4KLSAgICAKLSAgICBpZiAoIW5ld0NoaWxk
LT5pc0Zsb2F0aW5nT3JQb3NpdGlvbmVkKCkgJiYgY2hpbGRyZW5JbmxpbmUoKSkKLSAgICAgICAg
ZGlydHlMaW5lc0Zyb21DaGFuZ2VkQ2hpbGQobmV3Q2hpbGQpOwotICAgIAotI2lmIF9fQVBQTEVf
XwotICAgIGlmIChLV1FBY2NPYmplY3RDYWNoZTo6YWNjZXNzaWJpbGl0eUVuYWJsZWQoKSkKLSAg
ICAgICAgZG9jdW1lbnQoKS0+Z2V0QWNjT2JqZWN0Q2FjaGUoKS0+Y2hpbGRyZW5DaGFuZ2VkKHRo
aXMpOwotI2VuZGlmCi19Ci0KLXZvaWQgUmVuZGVyQ29udGFpbmVyOjppbnNlcnRDaGlsZE5vZGUo
UmVuZGVyT2JqZWN0KiBjaGlsZCwgUmVuZGVyT2JqZWN0KiBiZWZvcmVDaGlsZCkKLXsKLSAgICBp
ZighYmVmb3JlQ2hpbGQpIHsKLSAgICAgICAgYXBwZW5kQ2hpbGROb2RlKGNoaWxkKTsKLSAgICAg
ICAgcmV0dXJuOwotICAgIH0KLQotICAgIEtIVE1MQXNzZXJ0KCFjaGlsZC0+cGFyZW50KCkpOwot
ICAgIHdoaWxlICggYmVmb3JlQ2hpbGQtPnBhcmVudCgpICE9IHRoaXMgJiYgYmVmb3JlQ2hpbGQt
PnBhcmVudCgpLT5pc0Fub255bW91c0Jsb2NrKCkgKQotCWJlZm9yZUNoaWxkID0gYmVmb3JlQ2hp
bGQtPnBhcmVudCgpOwotICAgIEtIVE1MQXNzZXJ0KGJlZm9yZUNoaWxkLT5wYXJlbnQoKSA9PSB0
aGlzKTsKLQotICAgIGlmKGJlZm9yZUNoaWxkID09IGZpcnN0Q2hpbGQoKSkKLSAgICAgICAgc2V0
Rmlyc3RDaGlsZChjaGlsZCk7Ci0KLSAgICBSZW5kZXJPYmplY3QqIHByZXYgPSBiZWZvcmVDaGls
ZC0+cHJldmlvdXNTaWJsaW5nKCk7Ci0gICAgY2hpbGQtPnNldE5leHRTaWJsaW5nKGJlZm9yZUNo
aWxkKTsKLSAgICBiZWZvcmVDaGlsZC0+c2V0UHJldmlvdXNTaWJsaW5nKGNoaWxkKTsKLSAgICBp
ZihwcmV2KSBwcmV2LT5zZXROZXh0U2libGluZyhjaGlsZCk7Ci0gICAgY2hpbGQtPnNldFByZXZp
b3VzU2libGluZyhwcmV2KTsKLQotICAgIGNoaWxkLT5zZXRQYXJlbnQodGhpcyk7Ci0gICAgCi0g
ICAgLy8gS2VlcCBvdXIgbGF5ZXIgaGllcmFyY2h5IHVwZGF0ZWQuCi0gICAgUmVuZGVyTGF5ZXIq
IGxheWVyID0gZW5jbG9zaW5nTGF5ZXIoKTsKLSAgICBjaGlsZC0+YWRkTGF5ZXJzKGxheWVyLCBj
aGlsZCk7Ci0KLSAgICBjaGlsZC0+c2V0TmVlZHNMYXlvdXRBbmRNaW5NYXhSZWNhbGMoKTsKLSAg
ICBpZiAoIW5vcm1hbENoaWxkTmVlZHNMYXlvdXQoKSkKLSAgICAgICAgc2V0Q2hpbGROZWVkc0xh
eW91dCh0cnVlKTsgLy8gV2UgbWF5IHN1cHBseSB0aGUgc3RhdGljIHBvc2l0aW9uIGZvciBhbiBh
YnNvbHV0ZSBwb3NpdGlvbmVkIGNoaWxkLgotICAgIAotICAgIGlmICghY2hpbGQtPmlzRmxvYXRp
bmdPclBvc2l0aW9uZWQoKSAmJiBjaGlsZHJlbklubGluZSgpKQotICAgICAgICBkaXJ0eUxpbmVz
RnJvbUNoYW5nZWRDaGlsZChjaGlsZCk7Ci0gICAgCi0jaWYgX19BUFBMRV9fCi0gICAgaWYgKEtX
UUFjY09iamVjdENhY2hlOjphY2Nlc3NpYmlsaXR5RW5hYmxlZCgpKQotICAgICAgICBkb2N1bWVu
dCgpLT5nZXRBY2NPYmplY3RDYWNoZSgpLT5jaGlsZHJlbkNoYW5nZWQodGhpcyk7Ci0jZW5kaWYK
LX0KLQotdm9pZCBSZW5kZXJDb250YWluZXI6OmxheW91dCgpCi17Ci0gICAgS0hUTUxBc3NlcnQo
IG5lZWRzTGF5b3V0KCkgKTsKLSAgICBLSFRNTEFzc2VydCggbWluTWF4S25vd24oKSApOwotCi0g
ICAgUmVuZGVyT2JqZWN0ICpjaGlsZCA9IGZpcnN0Q2hpbGQoKTsKLSAgICB3aGlsZSggY2hpbGQg
KSB7Ci0gICAgICAgIGNoaWxkLT5sYXlvdXRJZk5lZWRlZCgpOwotICAgICAgICBjaGlsZCA9IGNo
aWxkLT5uZXh0U2libGluZygpOwotICAgIH0KLSAgICBzZXROZWVkc0xheW91dChmYWxzZSk7Ci19
Ci0KLXZvaWQgUmVuZGVyQ29udGFpbmVyOjpyZW1vdmVMZWZ0b3ZlckFub255bW91c0JveGVzKCkK
LXsKLSAgICAvLyB3ZSBoYXZlIHRvIGdvIG92ZXIgYWxsIGNoaWxkIG5vZGVzIGFuZCByZW1vdmUg
YW5vbnltb3VzIGJveGVzLCB0aGF0IGRvIF9ub3RfCi0gICAgLy8gaGF2ZSBpbmxpbmUgY2hpbGRy
ZW4gdG8ga2VlcCB0aGUgdHJlZSBmbGF0Ci0gICAgUmVuZGVyT2JqZWN0ICpjaGlsZCA9IGZpcnN0
Q2hpbGQoKTsKLSAgICB3aGlsZSggY2hpbGQgKSB7Ci0JUmVuZGVyT2JqZWN0ICpuZXh0ID0gY2hp
bGQtPm5leHRTaWJsaW5nKCk7Ci0JCi0JaWYgKCBjaGlsZC0+aXNSZW5kZXJCbG9jaygpICYmIGNo
aWxkLT5pc0Fub255bW91c0Jsb2NrKCkgJiYgIWNoaWxkLT5jb250aW51YXRpb24oKSAmJiAhY2hp
bGQtPmNoaWxkcmVuSW5saW5lKCkgJiYgIWNoaWxkLT5pc1RhYmxlQ2VsbCgpICkgewotCSAgICBS
ZW5kZXJPYmplY3QgKmZpcnN0QW5DaGlsZCA9IGNoaWxkLT5maXJzdENoaWxkKCk7Ci0JICAgIFJl
bmRlck9iamVjdCAqbGFzdEFuQ2hpbGQgPSBjaGlsZC0+bGFzdENoaWxkKCk7Ci0JICAgIGlmICgg
Zmlyc3RBbkNoaWxkICkgewotCQlSZW5kZXJPYmplY3QgKm8gPSBmaXJzdEFuQ2hpbGQ7Ci0JCXdo
aWxlKCBvICkgewotCQkgICAgby0+c2V0UGFyZW50KCB0aGlzICk7Ci0JCSAgICBvID0gby0+bmV4
dFNpYmxpbmcoKTsKLQkJfQotCQlmaXJzdEFuQ2hpbGQtPnNldFByZXZpb3VzU2libGluZyggY2hp
bGQtPnByZXZpb3VzU2libGluZygpICk7Ci0JCWxhc3RBbkNoaWxkLT5zZXROZXh0U2libGluZygg
Y2hpbGQtPm5leHRTaWJsaW5nKCkgKTsKLQkJaWYgKCBjaGlsZC0+cHJldmlvdXNTaWJsaW5nKCkg
KQotCQkgICAgY2hpbGQtPnByZXZpb3VzU2libGluZygpLT5zZXROZXh0U2libGluZyggZmlyc3RB
bkNoaWxkICk7Ci0JCWlmICggY2hpbGQtPm5leHRTaWJsaW5nKCkgKQotCQkgICAgY2hpbGQtPm5l
eHRTaWJsaW5nKCktPnNldFByZXZpb3VzU2libGluZyggbGFzdEFuQ2hpbGQgKTsKLQkgICAgfSBl
bHNlIHsKLQkJaWYgKCBjaGlsZC0+cHJldmlvdXNTaWJsaW5nKCkgKQotCQkgICAgY2hpbGQtPnBy
ZXZpb3VzU2libGluZygpLT5zZXROZXh0U2libGluZyggY2hpbGQtPm5leHRTaWJsaW5nKCkgKTsK
LQkJaWYgKCBjaGlsZC0+bmV4dFNpYmxpbmcoKSApCi0JCSAgICBjaGlsZC0+bmV4dFNpYmxpbmco
KS0+c2V0UHJldmlvdXNTaWJsaW5nKCBjaGlsZC0+cHJldmlvdXNTaWJsaW5nKCkgKTsKLQkJCi0J
ICAgIH0KLQkgICAgaWYgKCBjaGlsZCA9PSBmaXJzdENoaWxkKCkgKQotCQltX2ZpcnN0ID0gZmly
c3RBbkNoaWxkOwotCSAgICBpZiAoIGNoaWxkID09IGxhc3RDaGlsZCgpICkKLQkJbV9sYXN0ID0g
bGFzdEFuQ2hpbGQ7Ci0JICAgIGNoaWxkLT5zZXRQYXJlbnQoIDAgKTsKLQkgICAgY2hpbGQtPnNl
dFByZXZpb3VzU2libGluZyggMCApOwotCSAgICBjaGlsZC0+c2V0TmV4dFNpYmxpbmcoIDAgKTsK
LQkgICAgaWYgKCAhY2hpbGQtPmlzVGV4dCgpICkgewotCQlSZW5kZXJDb250YWluZXIgKmMgPSBz
dGF0aWNfY2FzdDxSZW5kZXJDb250YWluZXIgKj4oY2hpbGQpOwotCQljLT5tX2ZpcnN0ID0gMDsK
LQkJYy0+bV9uZXh0ID0gMDsKLQkgICAgfQotCSAgICBjaGlsZC0+ZGVzdHJveSgpOwotCX0KLQlj
aGlsZCA9IG5leHQ7Ci0gICAgfQotICAgIGlmICggcGFyZW50KCkgKQotCXBhcmVudCgpLT5yZW1v
dmVMZWZ0b3ZlckFub255bW91c0JveGVzKCk7Ci19Ci0KLVZpc2libGVQb3NpdGlvbiBSZW5kZXJD
b250YWluZXI6OnBvc2l0aW9uRm9yQ29vcmRpbmF0ZXMoaW50IF94LCBpbnQgX3kpCi17Ci0gICAg
Ly8gbm8gY2hpbGRyZW4uLi5yZXR1cm4gdGhpcyByZW5kZXIgb2JqZWN0J3MgZWxlbWVudCwgaWYg
dGhlcmUgaXMgb25lLCBhbmQgb2Zmc2V0IDAKLSAgICBpZiAoIWZpcnN0Q2hpbGQoKSkKLSAgICAg
ICAgcmV0dXJuIFZpc2libGVQb3NpdGlvbihlbGVtZW50KCksIDAsIERPV05TVFJFQU0pOwotCi0g
ICAgLy8gbG9vayBmb3IgdGhlIGdlb21ldHJpY2FsbHktY2xvc2VzdCBjaGlsZCBhbmQgcGFzcyBv
ZmYgdG8gdGhhdCBjaGlsZAotICAgIGludCBtaW4gPSBJTlRfTUFYOwotICAgIFJlbmRlck9iamVj
dCAqY2xvc2VzdFJlbmRlcmVyID0gMDsKLSAgICBmb3IgKFJlbmRlck9iamVjdCAqcmVuZGVyZXIg
PSBmaXJzdENoaWxkKCk7IHJlbmRlcmVyOyByZW5kZXJlciA9IHJlbmRlcmVyLT5uZXh0U2libGlu
ZygpKSB7Ci0gICAgICAgIGlmICghcmVuZGVyZXItPmZpcnN0Q2hpbGQoKSAmJiAhcmVuZGVyZXIt
PmlzSW5saW5lKCkgJiYgIXJlbmRlcmVyLT5pc0Jsb2NrRmxvdygpKQotICAgICAgICAgICAgY29u
dGludWU7Ci0KLSAgICAgICAgaW50IGFic3gsIGFic3k7Ci0gICAgICAgIHJlbmRlcmVyLT5hYnNv
bHV0ZVBvc2l0aW9uKGFic3gsIGFic3kpOwotICAgICAgICAKLSAgICAgICAgaW50IHRvcCA9IGFi
c3kgKyBib3JkZXJUb3AoKSArIHBhZGRpbmdUb3AoKTsKLSAgICAgICAgaW50IGJvdHRvbSA9IHRv
cCArIHJlbmRlcmVyLT5jb250ZW50SGVpZ2h0KCk7Ci0gICAgICAgIGludCBsZWZ0ID0gYWJzeCAr
IGJvcmRlckxlZnQoKSArIHBhZGRpbmdMZWZ0KCk7Ci0gICAgICAgIGludCByaWdodCA9IGxlZnQg
KyByZW5kZXJlci0+Y29udGVudFdpZHRoKCk7Ci0gICAgICAgIAotICAgICAgICBpbnQgY21wOwot
ICAgICAgICBjbXAgPSBhYnMoX3kgLSB0b3ApOyAgICBpZiAoY21wIDwgbWluKSB7IGNsb3Nlc3RS
ZW5kZXJlciA9IHJlbmRlcmVyOyBtaW4gPSBjbXA7IH0KLSAgICAgICAgY21wID0gYWJzKF95IC0g
Ym90dG9tKTsgaWYgKGNtcCA8IG1pbikgeyBjbG9zZXN0UmVuZGVyZXIgPSByZW5kZXJlcjsgbWlu
ID0gY21wOyB9Ci0gICAgICAgIGNtcCA9IGFicyhfeCAtIGxlZnQpOyAgIGlmIChjbXAgPCBtaW4p
IHsgY2xvc2VzdFJlbmRlcmVyID0gcmVuZGVyZXI7IG1pbiA9IGNtcDsgfQotICAgICAgICBjbXAg
PSBhYnMoX3ggLSByaWdodCk7ICBpZiAoY21wIDwgbWluKSB7IGNsb3Nlc3RSZW5kZXJlciA9IHJl
bmRlcmVyOyBtaW4gPSBjbXA7IH0KLSAgICB9Ci0gICAgCi0gICAgaWYgKGNsb3Nlc3RSZW5kZXJl
cikKLSAgICAgICAgcmV0dXJuIGNsb3Nlc3RSZW5kZXJlci0+cG9zaXRpb25Gb3JDb29yZGluYXRl
cyhfeCwgX3kpOwotICAgIAotICAgIHJldHVybiBWaXNpYmxlUG9zaXRpb24oZWxlbWVudCgpLCAw
LCBET1dOU1RSRUFNKTsKLX0KLQotUVZhbHVlTGlzdDxJbnRSZWN0PiBSZW5kZXJDb250YWluZXI6
OmxpbmVCb3hSZWN0cygpCi17Ci0gICAgaWYgKCFmaXJzdENoaWxkKCkgJiYgKGlzSW5saW5lKCkg
fHwgaXNBbm9ueW1vdXNCbG9jaygpKSkgewotICAgICAgICBRVmFsdWVMaXN0PEludFJlY3Q+IHJl
Y3RzOwotICAgICAgICBpbnQgeCA9IDAsIHkgPSAwOwotICAgICAgICBhYnNvbHV0ZVBvc2l0aW9u
KHgsIHkpOwotICAgICAgICBhYnNvbHV0ZVJlY3RzKHJlY3RzLCB4LCB5KTsKLSAgICAgICAgcmV0
dXJuIHJlY3RzOwotICAgIH0KLQotICAgIGlmICghZmlyc3RDaGlsZCgpKQotICAgICAgICByZXR1
cm4gUVZhbHVlTGlzdDxJbnRSZWN0PigpOwotCi0gICAgUVZhbHVlTGlzdDxJbnRSZWN0PiByZWN0
czsKLSAgICBmb3IgKFJlbmRlck9iamVjdCAqY2hpbGQgPSBmaXJzdENoaWxkKCk7IGNoaWxkOyBj
aGlsZCA9IGNoaWxkLT5uZXh0U2libGluZygpKSB7Ci0gICAgICAgIGlmIChjaGlsZC0+aXNUZXh0
KCkgfHwgY2hpbGQtPmlzSW5saW5lKCkgfHwgY2hpbGQtPmlzQW5vbnltb3VzQmxvY2soKSkgewot
ICAgICAgICAgICAgaW50IHggPSAwLCB5ID0gMDsKLSAgICAgICAgICAgIGNoaWxkLT5hYnNvbHV0
ZVBvc2l0aW9uKHgsIHkpOwotICAgICAgICAgICAgY2hpbGQtPmFic29sdXRlUmVjdHMocmVjdHMs
IHgsIHkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlY3RzOwotfQotCi0jdW5k
ZWYgREVCVUdfTEFZT1VUCkluZGV4OiByZW5kZXJpbmcvUmVuZGVyVGFibGVTZWN0aW9uLmgKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gcmVuZGVyaW5nL1JlbmRlclRhYmxlU2VjdGlvbi5oCShyZXZpc2lvbiAxMjI1
MykKKysrIHJlbmRlcmluZy9SZW5kZXJUYWJsZVNlY3Rpb24uaAkod29ya2luZyBjb3B5KQpAQCAt
Niw3ICs2LDcgQEAKICAqICAgICAgICAgICAoQykgMTk5OCBXYWxkbyBCYXN0aWFuIChiYXN0aWFu
QGtkZS5vcmcpCiAgKiAgICAgICAgICAgKEMpIDE5OTkgTGFycyBLbm9sbCAoa25vbGxAa2RlLm9y
ZykKICAqICAgICAgICAgICAoQykgMTk5OSBBbnR0aSBLb2l2aXN0byAoa29pdmlzdG9Aa2RlLm9y
ZykKLSAqIENvcHlyaWdodCAoQykgMjAwMyBBcHBsZSBDb21wdXRlciwgSW5jLgorICogQ29weXJp
Z2h0IChDKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2IEFwcGxlIENvbXB1dGVyLCBJbmMuCiAgKgog
ICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0
IGFuZC9vcgogICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkg
R2VuZXJhbCBQdWJsaWMKQEAgLTIzLDE4MSArMjMsMTUgQEAKICAqIHRoZSBGcmVlIFNvZnR3YXJl
IEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKICAqIEJvc3Rv
biwgTUEgMDIxMTEtMTMwNywgVVNBLgogICovCi0jaWZuZGVmIFJFTkRFUl9UQUJMRV9ICi0jZGVm
aW5lIFJFTkRFUl9UQUJMRV9ICisjaWZuZGVmIFJlbmRlclRhYmxlU2VjdGlvbl9ICisjZGVmaW5l
IFJlbmRlclRhYmxlU2VjdGlvbl9ICiAKLSNpbmNsdWRlIDxxY29sb3IuaD4KKyNpbmNsdWRlICJS
ZW5kZXJDb250YWluZXIuaCIKKyNpbmNsdWRlICJSZW5kZXJUYWJsZS5oIgogCi0jaW5jbHVkZSAi
cmVuZGVyX2Jsb2NrLmgiCi0jaW5jbHVkZSAicmVuZGVyX3N0eWxlLmgiCi0jaW5jbHVkZSAia2h0
bWxsYXlvdXQuaCIKK25hbWVzcGFjZSBXZWJDb3JlIHsKIAotbmFtZXNwYWNlIERPTSB7Ci0gICAg
Y2xhc3MgRE9NU3RyaW5nOwotfTsKLQotbmFtZXNwYWNlIGtodG1sIHsKLQotY2xhc3MgUmVuZGVy
VGFibGU7Ci1jbGFzcyBSZW5kZXJUYWJsZVNlY3Rpb247Ci1jbGFzcyBSZW5kZXJUYWJsZVJvdzsK
IGNsYXNzIFJlbmRlclRhYmxlQ2VsbDsKLWNsYXNzIFJlbmRlclRhYmxlQ29sOwotY2xhc3MgVGFi
bGVMYXlvdXQ7Ci0KLWNsYXNzIFJlbmRlclRhYmxlIDogcHVibGljIFJlbmRlckJsb2NrCi17Ci1w
dWJsaWM6Ci0gICAgZW51bSBSdWxlcyB7Ci0gICAgICAgIE5vbmUgICAgPSAweDAwLAotICAgICAg
ICBSR3JvdXBzID0gMHgwMSwKLSAgICAgICAgQ0dyb3VwcyA9IDB4MDIsCi0gICAgICAgIEdyb3Vw
cyAgPSAweDAzLAotICAgICAgICBSb3dzICAgID0gMHgwNSwKLSAgICAgICAgQ29scyAgICA9IDB4
MGEsCi0gICAgICAgIEFsbCAgICAgPSAweDBmCi0gICAgfTsKLSAgICBlbnVtIEZyYW1lIHsKLSAg
ICAgICAgVm9pZCAgID0gMHgwMCwKLSAgICAgICAgQWJvdmUgID0gMHgwMSwKLSAgICAgICAgQmVs
b3cgID0gMHgwMiwKLSAgICAgICAgTGhzICAgID0gMHgwNCwKLSAgICAgICAgUmhzICAgID0gMHgw
OCwKLSAgICAgICAgSHNpZGVzID0gMHgwMywKLSAgICAgICAgVnNpZGVzID0gMHgwYywKLSAgICAg
ICAgQm94ICAgID0gMHgwZgotICAgIH07Ci0KLSAgICBSZW5kZXJUYWJsZShET006Ok5vZGVJbXBs
KiBub2RlKTsKLSAgICB+UmVuZGVyVGFibGUoKTsKLQotICAgIHZpcnR1YWwgY29uc3QgY2hhciAq
cmVuZGVyTmFtZSgpIGNvbnN0IHsgcmV0dXJuICJSZW5kZXJUYWJsZSI7IH0KLQotICAgIHZpcnR1
YWwgdm9pZCBzZXRTdHlsZShSZW5kZXJTdHlsZSAqc3R5bGUpOwotCi0gICAgdmlydHVhbCBib29s
IGlzVGFibGUoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0KLSAgICBpbnQgZ2V0Q29sdW1uUG9z
KGludCBjb2wpIGNvbnN0Ci0gICAgICAgIHsgcmV0dXJuIGNvbHVtblBvc1tjb2xdOyB9Ci0KLSAg
ICBpbnQgaEJvcmRlclNwYWNpbmcoKSBjb25zdCB7IHJldHVybiBoc3BhY2luZzsgfQotICAgIGlu
dCB2Qm9yZGVyU3BhY2luZygpIGNvbnN0IHsgcmV0dXJuIHZzcGFjaW5nOyB9Ci0gICAgCi0gICAg
Ym9vbCBjb2xsYXBzZUJvcmRlcnMoKSBjb25zdCB7IHJldHVybiBzdHlsZSgpLT5ib3JkZXJDb2xs
YXBzZSgpOyB9Ci0gICAgaW50IGJvcmRlckxlZnQoKSBjb25zdDsKLSAgICBpbnQgYm9yZGVyUmln
aHQoKSBjb25zdDsKLSAgICBpbnQgYm9yZGVyVG9wKCkgY29uc3Q7Ci0gICAgaW50IGJvcmRlckJv
dHRvbSgpIGNvbnN0OwotICAgIAotICAgIFJ1bGVzIGdldFJ1bGVzKCkgY29uc3QgeyByZXR1cm4g
cnVsZXM7IH0KLQotICAgIGNvbnN0IFFDb2xvciAmYmdDb2xvcigpIGNvbnN0IHsgcmV0dXJuIHN0
eWxlKCktPmJhY2tncm91bmRDb2xvcigpOyB9Ci0KLSAgICB1aW50IGNlbGxQYWRkaW5nKCkgY29u
c3QgeyByZXR1cm4gcGFkZGluZzsgfQotICAgIHZvaWQgc2V0Q2VsbFBhZGRpbmcodWludCBwKSB7
IHBhZGRpbmcgPSBwOyB9Ci0KLSAgICAvLyBvdmVycmlkZXMKLSAgICB2aXJ0dWFsIGludCBvdmVy
Zmxvd0hlaWdodChib29sIGluY2x1ZGVJbnRlcmlvciA9IHRydWUpIGNvbnN0IHsgcmV0dXJuIGhl
aWdodCgpOyB9Ci0gICAgdmlydHVhbCBpbnQgb3ZlcmZsb3dXaWR0aChib29sIGluY2x1ZGVJbnRl
cmlvciA9IHRydWUpIGNvbnN0IHsgcmV0dXJuIHdpZHRoKCk7IH0KLSAgICB2aXJ0dWFsIHZvaWQg
YWRkQ2hpbGQoUmVuZGVyT2JqZWN0ICpjaGlsZCwgUmVuZGVyT2JqZWN0ICpiZWZvcmVDaGlsZCA9
IDApOwotICAgIHZpcnR1YWwgdm9pZCBwYWludChQYWludEluZm8mIGksIGludCB0eCwgaW50IHR5
KTsKLSAgICB2aXJ0dWFsIHZvaWQgcGFpbnRCb3hEZWNvcmF0aW9ucyhQYWludEluZm8mIGksIGlu
dCBfdHgsIGludCBfdHkpOwotICAgIHZpcnR1YWwgdm9pZCBsYXlvdXQoKTsKLSAgICB2aXJ0dWFs
IHZvaWQgY2FsY01pbk1heFdpZHRoKCk7Ci0KLSAgICB2aXJ0dWFsIFJlbmRlckJsb2NrKiBmaXJz
dExpbmVCbG9jaygpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVGaXJzdExldHRlcigp
OwotICAgIAotICAgIHZpcnR1YWwgdm9pZCBzZXRDZWxsV2lkdGhzKCk7Ci0KLSAgICB2aXJ0dWFs
IHZvaWQgY2FsY1dpZHRoKCk7Ci0KLSNpZm5kZWYgTkRFQlVHCi0gICAgdmlydHVhbCB2b2lkIGR1
bXAoUVRleHRTdHJlYW0gKnN0cmVhbSwgUVN0cmluZyBpbmQgPSAiIikgY29uc3Q7Ci0jZW5kaWYK
LSAgICBzdHJ1Y3QgQ29sdW1uU3RydWN0IHsKLQllbnVtIHsKLQkgICAgV2lkdGhVbmRlZmluZWQg
PSAweGZmZmYKLQl9OwotCUNvbHVtblN0cnVjdCgpIHsKLQkgICAgc3BhbiA9IDE7Ci0JICAgIHdp
ZHRoID0gV2lkdGhVbmRlZmluZWQ7Ci0JfQotCXVzaG9ydCBzcGFuOwotCXVpbnQgd2lkdGg7IC8v
IHRoZSBjYWxjdWxhdGVkIHBvc2l0aW9uIG9mIHRoZSBjb2x1bW4KLSAgICB9OwotCi0gICAgQXJy
YXk8aW50PiBjb2x1bW5Qb3M7Ci0gICAgQXJyYXk8Q29sdW1uU3RydWN0PiBjb2x1bW5zOwotCi0g
ICAgdm9pZCBzcGxpdENvbHVtbihpbnQgcG9zLCBpbnQgZmlyc3RTcGFuKTsKLSAgICB2b2lkIGFw
cGVuZENvbHVtbihpbnQgc3Bhbik7Ci0gICAgaW50IG51bUVmZkNvbHMoKSBjb25zdCB7IHJldHVy
biBjb2x1bW5zLnNpemUoKTsgfQotICAgIGludCBzcGFuT2ZFZmZDb2woaW50IGVmZkNvbCkgY29u
c3QgeyByZXR1cm4gY29sdW1uc1tlZmZDb2xdLnNwYW47IH0KLSAgICBpbnQgY29sVG9FZmZDb2wo
aW50IGNvbCkgY29uc3QgewotCWludCBjID0gMDsKLQlpbnQgaSA9IDA7Ci0Jd2hpbGUgKGMgPCBj
b2wgJiYgaSA8IChpbnQpY29sdW1ucy5zaXplKCkpIHsKLQkgICAgYyArPSBjb2x1bW5zW2ldLnNw
YW47Ci0JICAgIGkrKzsKLQl9Ci0JcmV0dXJuIGk7Ci0gICAgfQotICAgIGludCBlZmZDb2xUb0Nv
bChpbnQgZWZmQ29sKSBjb25zdCB7Ci0JaW50IGMgPSAwOwotCWZvciAoaW50IGkgPSAwOyBpIDwg
ZWZmQ29sOyBpKyspCi0JICAgIGMgKz0gY29sdW1uc1tpXS5zcGFuOwotCXJldHVybiBjOwotICAg
IH0KLQotICAgIGludCBib3JkZXJzUGFkZGluZ0FuZFNwYWNpbmcoKSBjb25zdCB7Ci0JcmV0dXJu
IGJvcmRlckxlZnQoKSArIGJvcmRlclJpZ2h0KCkgKyAKLSAgICAgICAgICAgICAgIChjb2xsYXBz
ZUJvcmRlcnMoKSA/IDAgOiAocGFkZGluZ0xlZnQoKSArIHBhZGRpbmdSaWdodCgpICsgKG51bUVm
ZkNvbHMoKSArIDEpICogaEJvcmRlclNwYWNpbmcoKSkpOwotICAgIH0KLQotICAgIFJlbmRlclRh
YmxlQ29sICpjb2xFbGVtZW50KGludCBjb2wpOwotCi0gICAgdm9pZCBzZXROZWVkU2VjdGlvblJl
Y2FsYygpIHsgbmVlZFNlY3Rpb25SZWNhbGMgPSB0cnVlOyB9Ci0KLSAgICB2aXJ0dWFsIFJlbmRl
ck9iamVjdCogcmVtb3ZlQ2hpbGROb2RlKFJlbmRlck9iamVjdCogY2hpbGQpOwotCi0gICAgUmVu
ZGVyVGFibGVDZWxsKiBjZWxsQWJvdmUoY29uc3QgUmVuZGVyVGFibGVDZWxsKiBjZWxsKSBjb25z
dDsKLSAgICBSZW5kZXJUYWJsZUNlbGwqIGNlbGxCZWxvdyhjb25zdCBSZW5kZXJUYWJsZUNlbGwq
IGNlbGwpIGNvbnN0OwotICAgIFJlbmRlclRhYmxlQ2VsbCogY2VsbExlZnQoY29uc3QgUmVuZGVy
VGFibGVDZWxsKiBjZWxsKSBjb25zdDsKLSAgICBSZW5kZXJUYWJsZUNlbGwqIGNlbGxSaWdodChj
b25zdCBSZW5kZXJUYWJsZUNlbGwqIGNlbGwpIGNvbnN0OwotIAotICAgIENvbGxhcHNlZEJvcmRl
clZhbHVlKiBjdXJyZW50Qm9yZGVyU3R5bGUoKSB7IHJldHVybiBtX2N1cnJlbnRCb3JkZXI7IH0K
LSAgICAKLSAgICBib29sIGhhc1NlY3Rpb25zKCkgY29uc3QgeyByZXR1cm4gaGVhZCB8fCBmb290
IHx8IGZpcnN0Qm9keTsgfQotCi1wcm90ZWN0ZWQ6Ci0KLSAgICB2b2lkIHJlY2FsY1NlY3Rpb25z
KCk7Ci0KLSAgICBmcmllbmQgY2xhc3MgQXV0b1RhYmxlTGF5b3V0OwotICAgIGZyaWVuZCBjbGFz
cyBGaXhlZFRhYmxlTGF5b3V0OwotCi0gICAgUmVuZGVyQmxvY2sgKnRDYXB0aW9uOwotICAgIFJl
bmRlclRhYmxlU2VjdGlvbiAqaGVhZDsKLSAgICBSZW5kZXJUYWJsZVNlY3Rpb24gKmZvb3Q7Ci0g
ICAgUmVuZGVyVGFibGVTZWN0aW9uICpmaXJzdEJvZHk7Ci0KLSAgICBUYWJsZUxheW91dCAqdGFi
bGVMYXlvdXQ7Ci0KLSAgICBDb2xsYXBzZWRCb3JkZXJWYWx1ZSogbV9jdXJyZW50Qm9yZGVyOwot
ICAgIAotICAgIEZyYW1lIGZyYW1lICAgICAgICAgICAgICAgICA6IDQ7Ci0gICAgUnVsZXMgcnVs
ZXMgICAgICAgICAgICAgICAgIDogNDsKLQotICAgIGJvb2wgaGFzX2NvbF9lbGVtcwkJOiAxOwot
ICAgIHVpbnQgcGFkZGluZwkJOiAyMjsKLSAgICB1aW50IG5lZWRTZWN0aW9uUmVjYWxjCTogMTsK
LSAgICAKLSAgICBzaG9ydCBoc3BhY2luZzsKLSAgICBzaG9ydCB2c3BhY2luZzsKLX07Ci0KLS8v
IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0KIAogY2xhc3MgUmVuZGVyVGFibGVTZWN0aW9uIDogcHVibGljIFJl
bmRlckNvbnRhaW5lcgogewpAQCAtMjc1LDE2NCArMTA5LDUgQEAgcHJvdGVjdGVkOgogICAgIHZv
aWQgY2xlYXJHcmlkKCk7CiB9OwogCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIFJlbmRl
clRhYmxlUm93IDogcHVibGljIFJlbmRlckNvbnRhaW5lcgotewotcHVibGljOgotICAgIFJlbmRl
clRhYmxlUm93KERPTTo6Tm9kZUltcGwqIG5vZGUpOwotCi0gICAgdmlydHVhbCB2b2lkIGRlc3Ry
b3koKTsKLQotICAgIHZpcnR1YWwgdm9pZCBzZXRTdHlsZShSZW5kZXJTdHlsZSopOwotICAgIHZp
cnR1YWwgY29uc3QgY2hhciAqcmVuZGVyTmFtZSgpIGNvbnN0IHsgcmV0dXJuICJSZW5kZXJUYWJs
ZVJvdyI7IH0KLQotICAgIHZpcnR1YWwgYm9vbCBpc1RhYmxlUm93KCkgY29uc3QgeyByZXR1cm4g
dHJ1ZTsgfQotCi0gICAgLy8gb3ZlcnJpZGVzCi0gICAgdmlydHVhbCB2b2lkIGFkZENoaWxkKFJl
bmRlck9iamVjdCAqY2hpbGQsIFJlbmRlck9iamVjdCAqYmVmb3JlQ2hpbGQgPSAwKTsKLSAgICB2
aXJ0dWFsIFJlbmRlck9iamVjdCogcmVtb3ZlQ2hpbGROb2RlKFJlbmRlck9iamVjdCogY2hpbGQp
OwotCi0gICAgdmlydHVhbCBzaG9ydCBsaW5lSGVpZ2h0KGJvb2wpIGNvbnN0IHsgcmV0dXJuIDA7
IH0KLSAgICB2aXJ0dWFsIHZvaWQgcG9zaXRpb24oaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGJv
b2wsIGJvb2wsIGludCkge30KLQotICAgIHZpcnR1YWwgdm9pZCBsYXlvdXQoKTsKLSAgICB2aXJ0
dWFsIEludFJlY3QgZ2V0QWJzb2x1dGVSZXBhaW50UmVjdCgpOwotICAgIAotICAgIFJlbmRlclRh
YmxlICp0YWJsZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PFJlbmRlclRhYmxlICo+KHBh
cmVudCgpLT5wYXJlbnQoKSk7IH0KLSAgICBSZW5kZXJUYWJsZVNlY3Rpb24gKnNlY3Rpb24oKSBj
b25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxSZW5kZXJUYWJsZVNlY3Rpb24gKj4ocGFyZW50KCkp
OyB9Ci0KLSNpZm5kZWYgTkRFQlVHCi0gICAgdmlydHVhbCB2b2lkIGR1bXAoUVRleHRTdHJlYW0g
KnN0cmVhbSwgUVN0cmluZyBpbmQgPSAiIikgY29uc3Q7Cit9CiAjZW5kaWYKLX07Ci0KLS8vIC0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgUmVuZGVyVGFibGVDZWxsIDogcHVibGljIFJlbmRlckJs
b2NrCi17Ci1wdWJsaWM6Ci0gICAgUmVuZGVyVGFibGVDZWxsKERPTTo6Tm9kZUltcGwqIG5vZGUp
OwotCi0gICAgdmlydHVhbCB2b2lkIGRlc3Ryb3koKTsKLQotICAgIHZpcnR1YWwgY29uc3QgY2hh
ciAqcmVuZGVyTmFtZSgpIGNvbnN0IHsgcmV0dXJuICJSZW5kZXJUYWJsZUNlbGwiOyB9Ci0gICAg
dmlydHVhbCBib29sIGlzVGFibGVDZWxsKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotCi0gICAg
Ly8gb3ZlcnJpZGVzIFJlbmRlck9iamVjdAotICAgIHZpcnR1YWwgYm9vbCByZXF1aXJlc0xheWVy
KCk7Ci0KLSAgICAvLyAjIyMgRklYIHRoZXNlIHR3by4uLgotICAgIGludCBjZWxsSW5kZXgoKSBj
b25zdCB7IHJldHVybiAwOyB9Ci0gICAgdm9pZCBzZXRDZWxsSW5kZXgoaW50KSB7IH0KLQotICAg
IGludCBjb2xTcGFuKCkgY29uc3QgeyByZXR1cm4gY1NwYW47IH0KLSAgICB2b2lkIHNldENvbFNw
YW4oaW50IGMpIHsgY1NwYW4gPSBjOyB9Ci0KLSAgICBpbnQgcm93U3BhbigpIGNvbnN0IHsgcmV0
dXJuIHJTcGFuOyB9Ci0gICAgdm9pZCBzZXRSb3dTcGFuKGludCByKSB7IHJTcGFuID0gcjsgfQot
Ci0gICAgaW50IGNvbCgpIGNvbnN0IHsgcmV0dXJuIF9jb2w7IH0KLSAgICB2b2lkIHNldENvbChp
bnQgY29sKSB7IF9jb2wgPSBjb2w7IH0KLSAgICBpbnQgcm93KCkgY29uc3QgeyByZXR1cm4gX3Jv
dzsgfQotICAgIHZvaWQgc2V0Um93KGludCByKSB7IF9yb3cgPSByOyB9Ci0KLSAgICBMZW5ndGgg
c3R5bGVPckNvbFdpZHRoKCk7Ci0KLSAgICAvLyBvdmVycmlkZXMKLSAgICB2aXJ0dWFsIHZvaWQg
Y2FsY01pbk1heFdpZHRoKCk7Ci0gICAgdmlydHVhbCB2b2lkIGNhbGNXaWR0aCgpOwotICAgIHZp
cnR1YWwgdm9pZCBzZXRXaWR0aChpbnQgd2lkdGgpOwotICAgIHZpcnR1YWwgdm9pZCBzZXRTdHls
ZShSZW5kZXJTdHlsZSAqc3R5bGUpOwotCi0gICAgaW50IGJvcmRlckxlZnQoKSBjb25zdDsKLSAg
ICBpbnQgYm9yZGVyUmlnaHQoKSBjb25zdDsKLSAgICBpbnQgYm9yZGVyVG9wKCkgY29uc3Q7Ci0g
ICAgaW50IGJvcmRlckJvdHRvbSgpIGNvbnN0OwotCi0gICAgQ29sbGFwc2VkQm9yZGVyVmFsdWUg
Y29sbGFwc2VkTGVmdEJvcmRlcigpIGNvbnN0OwotICAgIENvbGxhcHNlZEJvcmRlclZhbHVlIGNv
bGxhcHNlZFJpZ2h0Qm9yZGVyKCkgY29uc3Q7Ci0gICAgQ29sbGFwc2VkQm9yZGVyVmFsdWUgY29s
bGFwc2VkVG9wQm9yZGVyKCkgY29uc3Q7Ci0gICAgQ29sbGFwc2VkQm9yZGVyVmFsdWUgY29sbGFw
c2VkQm90dG9tQm9yZGVyKCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIGNvbGxlY3RCb3JkZXJz
KFFWYWx1ZUxpc3Q8Q29sbGFwc2VkQm9yZGVyVmFsdWU+JiBib3JkZXJTdHlsZXMpOwotCi0gICAg
dmlydHVhbCB2b2lkIHVwZGF0ZUZyb21FbGVtZW50KCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgbGF5
b3V0KCk7Ci0gICAgCi0gICAgdm9pZCBzZXRDZWxsVG9wRXh0cmEoaW50IHApIHsgX3RvcEV4dHJh
ID0gcDsgfQotICAgIHZvaWQgc2V0Q2VsbEJvdHRvbUV4dHJhKGludCBwKSB7IF9ib3R0b21FeHRy
YSA9IHA7IH0KLQotICAgIHZpcnR1YWwgdm9pZCBwYWludChQYWludEluZm8mIGksIGludCB0eCwg
aW50IHR5KTsKLQotICAgIHZvaWQgcGFpbnRDb2xsYXBzZWRCb3JkZXIoUVBhaW50ZXIqIHAsIGlu
dCB4LCBpbnQgeSwgaW50IHcsIGludCBoKTsKLSAgICAKLSAgICAvLyBsaWUgcG9zaXRpb24gdG8g
b3V0c2lkZSBvYnNlcnZlcnMKLSAgICB2aXJ0dWFsIGludCB5UG9zKCkgY29uc3QgeyByZXR1cm4g
bV95ICsgX3RvcEV4dHJhOyB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgY29tcHV0ZUFic29sdXRlUmVw
YWludFJlY3QoSW50UmVjdCYgciwgYm9vbCBmPWZhbHNlKTsKLSAgICB2aXJ0dWFsIGJvb2wgYWJz
b2x1dGVQb3NpdGlvbihpbnQgJnhQb3MsIGludCAmeVBvcywgYm9vbCBmID0gZmFsc2UpOwotCi0g
ICAgdmlydHVhbCBzaG9ydCBiYXNlbGluZVBvc2l0aW9uKGJvb2wgPSBmYWxzZSkgY29uc3Q7Ci0K
LSAgICB2aXJ0dWFsIGludCBib3JkZXJUb3BFeHRyYSgpIGNvbnN0IHsgcmV0dXJuIF90b3BFeHRy
YTsgfQotICAgIHZpcnR1YWwgaW50IGJvcmRlckJvdHRvbUV4dHJhKCkgY29uc3QgeyByZXR1cm4g
X2JvdHRvbUV4dHJhOyB9Ci0KLSAgICBSZW5kZXJUYWJsZSAqdGFibGUoKSBjb25zdCB7IHJldHVy
biBzdGF0aWNfY2FzdDxSZW5kZXJUYWJsZSAqPihwYXJlbnQoKS0+cGFyZW50KCktPnBhcmVudCgp
KTsgfQotICAgIFJlbmRlclRhYmxlU2VjdGlvbiAqc2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuIHN0
YXRpY19jYXN0PFJlbmRlclRhYmxlU2VjdGlvbiAqPihwYXJlbnQoKS0+cGFyZW50KCkpOyB9Ci0K
LSNpZm5kZWYgTkRFQlVHCi0gICAgdmlydHVhbCB2b2lkIGR1bXAoUVRleHRTdHJlYW0gKnN0cmVh
bSwgUVN0cmluZyBpbmQgPSAiIikgY29uc3Q7Ci0jZW5kaWYKLQotICAgIHZpcnR1YWwgSW50UmVj
dCBnZXRBYnNvbHV0ZVJlcGFpbnRSZWN0KCk7Ci0gICAgCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVh
bCB2b2lkIHBhaW50Qm94RGVjb3JhdGlvbnMoUGFpbnRJbmZvJiBpLCBpbnQgX3R4LCBpbnQgX3R5
KTsKLSAgICAKLSAgICBpbnQgX3JvdzsKLSAgICBpbnQgX2NvbDsKLSAgICBpbnQgclNwYW47Ci0g
ICAgaW50IGNTcGFuOwotICAgIGludCBfdG9wRXh0cmEgOiAzMTsKLSAgICBib29sIG5XcmFwIDog
MTsKLSAgICBpbnQgX2JvdHRvbUV4dHJhIDogMzE7Ci0gICAgYm9vbCBtX3dpZHRoQ2hhbmdlZCA6
IDE7Ci0gICAgCi0gICAgaW50IG1fcGVyY2VudGFnZUhlaWdodDsKLX07Ci0KLQotLy8gLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLQotCi1jbGFzcyBSZW5kZXJUYWJsZUNvbCA6IHB1YmxpYyBSZW5kZXJDb250YWlu
ZXIKLXsKLXB1YmxpYzoKLSAgICBSZW5kZXJUYWJsZUNvbChET006Ok5vZGVJbXBsKiBub2RlKTsK
LQotICAgIHZpcnR1YWwgY29uc3QgY2hhciAqcmVuZGVyTmFtZSgpIGNvbnN0IHsgcmV0dXJuICJS
ZW5kZXJUYWJsZUNvbCI7IH0KLQotICAgIGludCBzcGFuKCkgY29uc3QgeyByZXR1cm4gX3NwYW47
IH0KLSAgICB2b2lkIHNldFNwYW4oaW50IHMpIHsgX3NwYW4gPSBzOyB9Ci0KLSAgICB2aXJ0dWFs
IHZvaWQgYWRkQ2hpbGQoUmVuZGVyT2JqZWN0ICpjaGlsZCwgUmVuZGVyT2JqZWN0ICpiZWZvcmVD
aGlsZCA9IDApOwotCi0gICAgdmlydHVhbCBib29sIGlzVGFibGVDb2woKSBjb25zdCB7IHJldHVy
biB0cnVlOyB9Ci0KLSAgICB2aXJ0dWFsIHNob3J0IGxpbmVIZWlnaHQoYm9vbCkgY29uc3QgeyBy
ZXR1cm4gMDsgfQotCi0gICAgdmlydHVhbCB2b2lkIHVwZGF0ZUZyb21FbGVtZW50KCk7Ci0KLSAg
ICB2aXJ0dWFsIGJvb2wgY2FuSGF2ZUNoaWxkcmVuKCkgY29uc3Q7Ci0gICAgCi0jaWZuZGVmIE5E
RUJVRwotICAgIHZpcnR1YWwgdm9pZCBkdW1wKFFUZXh0U3RyZWFtICpzdHJlYW0sIFFTdHJpbmcg
aW5kID0gIiIpIGNvbnN0OwotI2VuZGlmCi0KLXByb3RlY3RlZDoKLSAgICBpbnQgX3NwYW47Ci19
OwotCi19OwotI2VuZGlmCi0KSW5kZXg6IHJlbmRlcmluZy9yZW5kZXJfaW5saW5lLmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gcmVuZGVyaW5nL3JlbmRlcl9pbmxpbmUuaAkocmV2aXNpb24gMTIyNTMpCisrKyBy
ZW5kZXJpbmcvcmVuZGVyX2lubGluZS5oCSh3b3JraW5nIGNvcHkpCkBAIC04Niw3ICs4Niw3IEBA
IHByaXZhdGU6CiAgICAgYm9vbCBtX2lzQ29udGludWF0aW9uIDogMTsgLy8gV2hldGhlciBvciBu
b3Qgd2UncmUgYSBjb250aW51YXRpb24gb2YgYW4gaW5saW5lLgogfTsKIAotfTsgLy8gbmFtZXNw
YWNlCit9IC8vIG5hbWVzcGFjZQogCi0jZW5kaWYgLy8gUkVOREVSX0JMT0NLX0gKKyNlbmRpZgog
CkluZGV4OiByZW5kZXJpbmcvUmVuZGVyQ29udGFpbmVyLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSByZW5k
ZXJpbmcvUmVuZGVyQ29udGFpbmVyLmNwcAkocmV2aXNpb24gMTIyNTMpCisrKyByZW5kZXJpbmcv
UmVuZGVyQ29udGFpbmVyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNCw3ICs0LDcgQEAKICAqIENv
cHlyaWdodCAoQykgMTk5OSBMYXJzIEtub2xsIChrbm9sbEBrZGUub3JnKQogICogICAgICAgICAg
IChDKSAxOTk5IEFudHRpIEtvaXZpc3RvIChrb2l2aXN0b0BrZGUub3JnKQogICogICAgICAgICAg
IChDKSAyMDAwIERpcmsgTXVlbGxlciAobXVlbGxlckBrZGUub3JnKQotICogQ29weXJpZ2h0IChD
KSAyMDAzIEFwcGxlIENvbXB1dGVyLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQs
IDIwMDUsIDIwMDYgQXBwbGUgQ29tcHV0ZXIsIEluYy4KICAqCiAgKiBUaGlzIGxpYnJhcnkgaXMg
ZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgKiBtb2RpZnkg
aXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwpAQCAt
MjQsOCArMjQsOCBAQAogICovCiAKICNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJyZW5k
ZXJfY29udGFpbmVyLmgiCi0jaW5jbHVkZSAicmVuZGVyX3RhYmxlLmgiCisjaW5jbHVkZSAiUmVu
ZGVyQ29udGFpbmVyLmgiCisjaW5jbHVkZSAiUmVuZGVyVGFibGUuaCIKICNpbmNsdWRlICJSZW5k
ZXJUZXh0RnJhZ21lbnQuaCIKICNpbmNsdWRlICJyZW5kZXJfaW1hZ2UuaCIKICNpbmNsdWRlICJy
ZW5kZXJfY2FudmFzLmgiCkBAIC0zMywxNCArMzMsMTMgQEAKICNpbmNsdWRlICJ4bWwvZG9tX3Bv
c2l0aW9uLmgiCiAjaW5jbHVkZSAidmlzaWJsZV9wb3NpdGlvbi5oIgogCi0jaW5jbHVkZSA8a2Rl
YnVnLmg+CiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAKIC8vIEZvciBhY2Nlc3NpYmlsaXR5CiAjaW5j
bHVkZSAiS1dRQWNjT2JqZWN0Q2FjaGUuaCIgCiAKIHVzaW5nIERPTTo6UG9zaXRpb247Ci11c2lu
ZyBuYW1lc3BhY2Uga2h0bWw7CituYW1lc3BhY2UgV2ViQ29yZSB7CiAKIFJlbmRlckNvbnRhaW5l
cjo6UmVuZGVyQ29udGFpbmVyKERPTTo6Tm9kZUltcGwqIG5vZGUpCiAgICAgOiBSZW5kZXJCb3go
bm9kZSkKQEAgLTEyOSw3ICsxMjgsNiBAQCB2b2lkIFJlbmRlckNvbnRhaW5lcjo6YWRkQ2hpbGQo
UmVuZGVyT2JqCiAgICAgICAgICAgICAgICAgbmVlZHNUYWJsZSA9IGZhbHNlOwogICAgICAgICAg
ICAgYnJlYWs7CiAgICAgICAgIGNhc2UgTk9ORToKLSAgICAgICAgICAgIGtkRGVidWcoIDYwMDAg
KSA8PCAiZXJyb3IgaW4gUmVuZGVyT2JqZWN0OjphZGRDaGlsZCgpISEhISIgPDwgZW5kbDsKICAg
ICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQpAQCAtNTIyLDMgKzUyMCw1IEBAIFFW
YWx1ZUxpc3Q8SW50UmVjdD4gUmVuZGVyQ29udGFpbmVyOjpsaW4KIH0KIAogI3VuZGVmIERFQlVH
X0xBWU9VVAorCit9CkluZGV4OiByZW5kZXJpbmcvUmVuZGVyVGFibGVSb3cuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSByZW5kZXJpbmcvUmVuZGVyVGFibGVSb3cuaAkocmV2aXNpb24gMTIyNTMpCisrKyByZW5k
ZXJpbmcvUmVuZGVyVGFibGVSb3cuaAkod29ya2luZyBjb3B5KQpAQCAtNiw3ICs2LDcgQEAKICAq
ICAgICAgICAgICAoQykgMTk5OCBXYWxkbyBCYXN0aWFuIChiYXN0aWFuQGtkZS5vcmcpCiAgKiAg
ICAgICAgICAgKEMpIDE5OTkgTGFycyBLbm9sbCAoa25vbGxAa2RlLm9yZykKICAqICAgICAgICAg
ICAoQykgMTk5OSBBbnR0aSBLb2l2aXN0byAoa29pdmlzdG9Aa2RlLm9yZykKLSAqIENvcHlyaWdo
dCAoQykgMjAwMyBBcHBsZSBDb21wdXRlciwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDAzLCAy
MDA0LCAyMDA1LCAyMDA2IEFwcGxlIENvbXB1dGVyLCBJbmMuCiAgKgogICogVGhpcyBsaWJyYXJ5
IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICogbW9k
aWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMK
QEAgLTIzLDI1OSArMjMsMTMgQEAKICAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIElu
Yy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKICAqIEJvc3RvbiwgTUEgMDIxMTEtMTMw
NywgVVNBLgogICovCi0jaWZuZGVmIFJFTkRFUl9UQUJMRV9ICi0jZGVmaW5lIFJFTkRFUl9UQUJM
RV9ICisjaWZuZGVmIFJlbmRlclRhYmxlUm93X0gKKyNkZWZpbmUgUmVuZGVyVGFibGVSb3dfSAog
Ci0jaW5jbHVkZSA8cWNvbG9yLmg+CisjaW5jbHVkZSAiUmVuZGVyQ29udGFpbmVyLmgiCisjaW5j
bHVkZSAiUmVuZGVyVGFibGVTZWN0aW9uLmgiCiAKLSNpbmNsdWRlICJyZW5kZXJfYmxvY2suaCIK
LSNpbmNsdWRlICJyZW5kZXJfc3R5bGUuaCIKLSNpbmNsdWRlICJraHRtbGxheW91dC5oIgotCi1u
YW1lc3BhY2UgRE9NIHsKLSAgICBjbGFzcyBET01TdHJpbmc7Ci19OwotCi1uYW1lc3BhY2Uga2h0
bWwgewotCi1jbGFzcyBSZW5kZXJUYWJsZTsKLWNsYXNzIFJlbmRlclRhYmxlU2VjdGlvbjsKLWNs
YXNzIFJlbmRlclRhYmxlUm93OwotY2xhc3MgUmVuZGVyVGFibGVDZWxsOwotY2xhc3MgUmVuZGVy
VGFibGVDb2w7Ci1jbGFzcyBUYWJsZUxheW91dDsKLQotY2xhc3MgUmVuZGVyVGFibGUgOiBwdWJs
aWMgUmVuZGVyQmxvY2sKLXsKLXB1YmxpYzoKLSAgICBlbnVtIFJ1bGVzIHsKLSAgICAgICAgTm9u
ZSAgICA9IDB4MDAsCi0gICAgICAgIFJHcm91cHMgPSAweDAxLAotICAgICAgICBDR3JvdXBzID0g
MHgwMiwKLSAgICAgICAgR3JvdXBzICA9IDB4MDMsCi0gICAgICAgIFJvd3MgICAgPSAweDA1LAot
ICAgICAgICBDb2xzICAgID0gMHgwYSwKLSAgICAgICAgQWxsICAgICA9IDB4MGYKLSAgICB9Owot
ICAgIGVudW0gRnJhbWUgewotICAgICAgICBWb2lkICAgPSAweDAwLAotICAgICAgICBBYm92ZSAg
PSAweDAxLAotICAgICAgICBCZWxvdyAgPSAweDAyLAotICAgICAgICBMaHMgICAgPSAweDA0LAot
ICAgICAgICBSaHMgICAgPSAweDA4LAotICAgICAgICBIc2lkZXMgPSAweDAzLAotICAgICAgICBW
c2lkZXMgPSAweDBjLAotICAgICAgICBCb3ggICAgPSAweDBmCi0gICAgfTsKLQotICAgIFJlbmRl
clRhYmxlKERPTTo6Tm9kZUltcGwqIG5vZGUpOwotICAgIH5SZW5kZXJUYWJsZSgpOwotCi0gICAg
dmlydHVhbCBjb25zdCBjaGFyICpyZW5kZXJOYW1lKCkgY29uc3QgeyByZXR1cm4gIlJlbmRlclRh
YmxlIjsgfQotCi0gICAgdmlydHVhbCB2b2lkIHNldFN0eWxlKFJlbmRlclN0eWxlICpzdHlsZSk7
Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNUYWJsZSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLQot
ICAgIGludCBnZXRDb2x1bW5Qb3MoaW50IGNvbCkgY29uc3QKLSAgICAgICAgeyByZXR1cm4gY29s
dW1uUG9zW2NvbF07IH0KLQotICAgIGludCBoQm9yZGVyU3BhY2luZygpIGNvbnN0IHsgcmV0dXJu
IGhzcGFjaW5nOyB9Ci0gICAgaW50IHZCb3JkZXJTcGFjaW5nKCkgY29uc3QgeyByZXR1cm4gdnNw
YWNpbmc7IH0KLSAgICAKLSAgICBib29sIGNvbGxhcHNlQm9yZGVycygpIGNvbnN0IHsgcmV0dXJu
IHN0eWxlKCktPmJvcmRlckNvbGxhcHNlKCk7IH0KLSAgICBpbnQgYm9yZGVyTGVmdCgpIGNvbnN0
OwotICAgIGludCBib3JkZXJSaWdodCgpIGNvbnN0OwotICAgIGludCBib3JkZXJUb3AoKSBjb25z
dDsKLSAgICBpbnQgYm9yZGVyQm90dG9tKCkgY29uc3Q7Ci0gICAgCi0gICAgUnVsZXMgZ2V0UnVs
ZXMoKSBjb25zdCB7IHJldHVybiBydWxlczsgfQotCi0gICAgY29uc3QgUUNvbG9yICZiZ0NvbG9y
KCkgY29uc3QgeyByZXR1cm4gc3R5bGUoKS0+YmFja2dyb3VuZENvbG9yKCk7IH0KLQotICAgIHVp
bnQgY2VsbFBhZGRpbmcoKSBjb25zdCB7IHJldHVybiBwYWRkaW5nOyB9Ci0gICAgdm9pZCBzZXRD
ZWxsUGFkZGluZyh1aW50IHApIHsgcGFkZGluZyA9IHA7IH0KLQotICAgIC8vIG92ZXJyaWRlcwot
ICAgIHZpcnR1YWwgaW50IG92ZXJmbG93SGVpZ2h0KGJvb2wgaW5jbHVkZUludGVyaW9yID0gdHJ1
ZSkgY29uc3QgeyByZXR1cm4gaGVpZ2h0KCk7IH0KLSAgICB2aXJ0dWFsIGludCBvdmVyZmxvd1dp
ZHRoKGJvb2wgaW5jbHVkZUludGVyaW9yID0gdHJ1ZSkgY29uc3QgeyByZXR1cm4gd2lkdGgoKTsg
fQotICAgIHZpcnR1YWwgdm9pZCBhZGRDaGlsZChSZW5kZXJPYmplY3QgKmNoaWxkLCBSZW5kZXJP
YmplY3QgKmJlZm9yZUNoaWxkID0gMCk7Ci0gICAgdmlydHVhbCB2b2lkIHBhaW50KFBhaW50SW5m
byYgaSwgaW50IHR4LCBpbnQgdHkpOwotICAgIHZpcnR1YWwgdm9pZCBwYWludEJveERlY29yYXRp
b25zKFBhaW50SW5mbyYgaSwgaW50IF90eCwgaW50IF90eSk7Ci0gICAgdmlydHVhbCB2b2lkIGxh
eW91dCgpOwotICAgIHZpcnR1YWwgdm9pZCBjYWxjTWluTWF4V2lkdGgoKTsKLQotICAgIHZpcnR1
YWwgUmVuZGVyQmxvY2sqIGZpcnN0TGluZUJsb2NrKCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lk
IHVwZGF0ZUZpcnN0TGV0dGVyKCk7Ci0gICAgCi0gICAgdmlydHVhbCB2b2lkIHNldENlbGxXaWR0
aHMoKTsKLQotICAgIHZpcnR1YWwgdm9pZCBjYWxjV2lkdGgoKTsKLQotI2lmbmRlZiBOREVCVUcK
LSAgICB2aXJ0dWFsIHZvaWQgZHVtcChRVGV4dFN0cmVhbSAqc3RyZWFtLCBRU3RyaW5nIGluZCA9
ICIiKSBjb25zdDsKLSNlbmRpZgotICAgIHN0cnVjdCBDb2x1bW5TdHJ1Y3QgewotCWVudW0gewot
CSAgICBXaWR0aFVuZGVmaW5lZCA9IDB4ZmZmZgotCX07Ci0JQ29sdW1uU3RydWN0KCkgewotCSAg
ICBzcGFuID0gMTsKLQkgICAgd2lkdGggPSBXaWR0aFVuZGVmaW5lZDsKLQl9Ci0JdXNob3J0IHNw
YW47Ci0JdWludCB3aWR0aDsgLy8gdGhlIGNhbGN1bGF0ZWQgcG9zaXRpb24gb2YgdGhlIGNvbHVt
bgotICAgIH07Ci0KLSAgICBBcnJheTxpbnQ+IGNvbHVtblBvczsKLSAgICBBcnJheTxDb2x1bW5T
dHJ1Y3Q+IGNvbHVtbnM7Ci0KLSAgICB2b2lkIHNwbGl0Q29sdW1uKGludCBwb3MsIGludCBmaXJz
dFNwYW4pOwotICAgIHZvaWQgYXBwZW5kQ29sdW1uKGludCBzcGFuKTsKLSAgICBpbnQgbnVtRWZm
Q29scygpIGNvbnN0IHsgcmV0dXJuIGNvbHVtbnMuc2l6ZSgpOyB9Ci0gICAgaW50IHNwYW5PZkVm
ZkNvbChpbnQgZWZmQ29sKSBjb25zdCB7IHJldHVybiBjb2x1bW5zW2VmZkNvbF0uc3BhbjsgfQot
ICAgIGludCBjb2xUb0VmZkNvbChpbnQgY29sKSBjb25zdCB7Ci0JaW50IGMgPSAwOwotCWludCBp
ID0gMDsKLQl3aGlsZSAoYyA8IGNvbCAmJiBpIDwgKGludCljb2x1bW5zLnNpemUoKSkgewotCSAg
ICBjICs9IGNvbHVtbnNbaV0uc3BhbjsKLQkgICAgaSsrOwotCX0KLQlyZXR1cm4gaTsKLSAgICB9
Ci0gICAgaW50IGVmZkNvbFRvQ29sKGludCBlZmZDb2wpIGNvbnN0IHsKLQlpbnQgYyA9IDA7Ci0J
Zm9yIChpbnQgaSA9IDA7IGkgPCBlZmZDb2w7IGkrKykKLQkgICAgYyArPSBjb2x1bW5zW2ldLnNw
YW47Ci0JcmV0dXJuIGM7Ci0gICAgfQotCi0gICAgaW50IGJvcmRlcnNQYWRkaW5nQW5kU3BhY2lu
ZygpIGNvbnN0IHsKLQlyZXR1cm4gYm9yZGVyTGVmdCgpICsgYm9yZGVyUmlnaHQoKSArIAotICAg
ICAgICAgICAgICAgKGNvbGxhcHNlQm9yZGVycygpID8gMCA6IChwYWRkaW5nTGVmdCgpICsgcGFk
ZGluZ1JpZ2h0KCkgKyAobnVtRWZmQ29scygpICsgMSkgKiBoQm9yZGVyU3BhY2luZygpKSk7Ci0g
ICAgfQotCi0gICAgUmVuZGVyVGFibGVDb2wgKmNvbEVsZW1lbnQoaW50IGNvbCk7Ci0KLSAgICB2
b2lkIHNldE5lZWRTZWN0aW9uUmVjYWxjKCkgeyBuZWVkU2VjdGlvblJlY2FsYyA9IHRydWU7IH0K
LQotICAgIHZpcnR1YWwgUmVuZGVyT2JqZWN0KiByZW1vdmVDaGlsZE5vZGUoUmVuZGVyT2JqZWN0
KiBjaGlsZCk7Ci0KLSAgICBSZW5kZXJUYWJsZUNlbGwqIGNlbGxBYm92ZShjb25zdCBSZW5kZXJU
YWJsZUNlbGwqIGNlbGwpIGNvbnN0OwotICAgIFJlbmRlclRhYmxlQ2VsbCogY2VsbEJlbG93KGNv
bnN0IFJlbmRlclRhYmxlQ2VsbCogY2VsbCkgY29uc3Q7Ci0gICAgUmVuZGVyVGFibGVDZWxsKiBj
ZWxsTGVmdChjb25zdCBSZW5kZXJUYWJsZUNlbGwqIGNlbGwpIGNvbnN0OwotICAgIFJlbmRlclRh
YmxlQ2VsbCogY2VsbFJpZ2h0KGNvbnN0IFJlbmRlclRhYmxlQ2VsbCogY2VsbCkgY29uc3Q7Ci0g
Ci0gICAgQ29sbGFwc2VkQm9yZGVyVmFsdWUqIGN1cnJlbnRCb3JkZXJTdHlsZSgpIHsgcmV0dXJu
IG1fY3VycmVudEJvcmRlcjsgfQotICAgIAotICAgIGJvb2wgaGFzU2VjdGlvbnMoKSBjb25zdCB7
IHJldHVybiBoZWFkIHx8IGZvb3QgfHwgZmlyc3RCb2R5OyB9Ci0KLXByb3RlY3RlZDoKLQotICAg
IHZvaWQgcmVjYWxjU2VjdGlvbnMoKTsKLQotICAgIGZyaWVuZCBjbGFzcyBBdXRvVGFibGVMYXlv
dXQ7Ci0gICAgZnJpZW5kIGNsYXNzIEZpeGVkVGFibGVMYXlvdXQ7Ci0KLSAgICBSZW5kZXJCbG9j
ayAqdENhcHRpb247Ci0gICAgUmVuZGVyVGFibGVTZWN0aW9uICpoZWFkOwotICAgIFJlbmRlclRh
YmxlU2VjdGlvbiAqZm9vdDsKLSAgICBSZW5kZXJUYWJsZVNlY3Rpb24gKmZpcnN0Qm9keTsKLQot
ICAgIFRhYmxlTGF5b3V0ICp0YWJsZUxheW91dDsKLQotICAgIENvbGxhcHNlZEJvcmRlclZhbHVl
KiBtX2N1cnJlbnRCb3JkZXI7Ci0gICAgCi0gICAgRnJhbWUgZnJhbWUgICAgICAgICAgICAgICAg
IDogNDsKLSAgICBSdWxlcyBydWxlcyAgICAgICAgICAgICAgICAgOiA0OwotCi0gICAgYm9vbCBo
YXNfY29sX2VsZW1zCQk6IDE7Ci0gICAgdWludCBwYWRkaW5nCQk6IDIyOwotICAgIHVpbnQgbmVl
ZFNlY3Rpb25SZWNhbGMJOiAxOwotICAgIAotICAgIHNob3J0IGhzcGFjaW5nOwotICAgIHNob3J0
IHZzcGFjaW5nOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBSZW5kZXJUYWJs
ZVNlY3Rpb24gOiBwdWJsaWMgUmVuZGVyQ29udGFpbmVyCi17Ci1wdWJsaWM6Ci0gICAgUmVuZGVy
VGFibGVTZWN0aW9uKERPTTo6Tm9kZUltcGwqIG5vZGUpOwotICAgIH5SZW5kZXJUYWJsZVNlY3Rp
b24oKTsKLSAgICB2aXJ0dWFsIHZvaWQgZGVzdHJveSgpOwotCi0gICAgdmlydHVhbCB2b2lkIHNl
dFN0eWxlKFJlbmRlclN0eWxlICpzdHlsZSk7Ci0KLSAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKnJl
bmRlck5hbWUoKSBjb25zdCB7IHJldHVybiAiUmVuZGVyVGFibGVTZWN0aW9uIjsgfQotCi0gICAg
Ly8gb3ZlcnJpZGVzCi0gICAgdmlydHVhbCB2b2lkIGFkZENoaWxkKFJlbmRlck9iamVjdCAqY2hp
bGQsIFJlbmRlck9iamVjdCAqYmVmb3JlQ2hpbGQgPSAwKTsKLSAgICB2aXJ0dWFsIGJvb2wgaXNU
YWJsZVNlY3Rpb24oKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0KLSAgICB2aXJ0dWFsIHNob3J0
IGxpbmVIZWlnaHQoYm9vbCkgY29uc3QgeyByZXR1cm4gMDsgfQotICAgIHZpcnR1YWwgdm9pZCBw
b3NpdGlvbihpbnQsIGludCwgaW50LCBpbnQsIGludCwgYm9vbCwgYm9vbCwgaW50KSB7fQotCi0j
aWZuZGVmIE5ERUJVRwotICAgIHZpcnR1YWwgdm9pZCBkdW1wKFFUZXh0U3RyZWFtICpzdHJlYW0s
IFFTdHJpbmcgaW5kID0gIiIpIGNvbnN0OwotI2VuZGlmCi0KLSAgICB2b2lkIGFkZENlbGwoUmVu
ZGVyVGFibGVDZWxsICpjZWxsKTsKLQotICAgIHZvaWQgc2V0Q2VsbFdpZHRocygpOwotICAgIHZv
aWQgY2FsY1Jvd0hlaWdodCgpOwotICAgIGludCBsYXlvdXRSb3dzKGludCBoZWlnaHQpOwotCi0g
ICAgUmVuZGVyVGFibGUgKnRhYmxlKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8UmVuZGVy
VGFibGUgKj4ocGFyZW50KCkpOyB9Ci0KLSAgICBzdHJ1Y3QgQ2VsbFN0cnVjdCB7Ci0gICAgICAg
IFJlbmRlclRhYmxlQ2VsbCAqY2VsbDsKLSAgICAgICAgYm9vbCBpbkNvbFNwYW47IC8vIHRydWUg
Zm9yIGNvbHVtbnMgYWZ0ZXIgdGhlIGZpcnN0IGluIGEgY29sc3BhbgotICAgIH07Ci0gICAgdHlw
ZWRlZiBBcnJheTxDZWxsU3RydWN0PiBSb3c7Ci0gICAgc3RydWN0IFJvd1N0cnVjdCB7Ci0JUm93
ICpyb3c7Ci0JaW50IGJhc2VMaW5lOwotCUxlbmd0aCBoZWlnaHQ7Ci0gICAgfTsKLQotICAgIENl
bGxTdHJ1Y3QmIGNlbGxBdChpbnQgcm93LCAgaW50IGNvbCkgewotCXJldHVybiAoKmdyaWRbcm93
XS5yb3cpW2NvbF07Ci0gICAgfQotICAgIGNvbnN0IENlbGxTdHJ1Y3QmIGNlbGxBdChpbnQgcm93
LCBpbnQgY29sKSBjb25zdCB7Ci0JcmV0dXJuICgqZ3JpZFtyb3ddLnJvdylbY29sXTsKLSAgICB9
Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcGFpbnQoUGFpbnRJbmZvJiBpLCBpbnQgdHgsIGludCB0eSk7
Ci0KLSAgICBpbnQgbnVtUm93cygpIGNvbnN0IHsgcmV0dXJuIGdyaWRSb3dzOyB9Ci0gICAgaW50
IGdldEJhc2VsaW5lKGludCByb3cpIHtyZXR1cm4gZ3JpZFtyb3ddLmJhc2VMaW5lO30KLQotICAg
IHZvaWQgc2V0TmVlZENlbGxSZWNhbGMoKSB7Ci0gICAgICAgIG5lZWRDZWxsUmVjYWxjID0gdHJ1
ZTsKLSAgICAgICAgdGFibGUoKS0+c2V0TmVlZFNlY3Rpb25SZWNhbGMoKTsKLSAgICB9Ci0KLSAg
ICB2aXJ0dWFsIFJlbmRlck9iamVjdCogcmVtb3ZlQ2hpbGROb2RlKFJlbmRlck9iamVjdCogY2hp
bGQpOwotCi0gICAgLy8gdGhpcyBnZXRzIGEgY2VsbCBncmlkIGRhdGEgc3RydWN0dXJlLiBjaGFu
Z2luZyB0aGUgbnVtYmVyIG9mCi0gICAgLy8gY29sdW1ucyBpcyBkb25lIGJ5IHRoZSB0YWJsZQot
ICAgIEFycmF5PFJvd1N0cnVjdD4gZ3JpZDsKLSAgICBpbnQgZ3JpZFJvd3M7Ci0gICAgQXJyYXk8
aW50PiByb3dQb3M7Ci0KLSAgICBpbnQgY0NvbDsKLSAgICBpbnQgY1JvdzsKLSAgICBib29sIG5l
ZWRDZWxsUmVjYWxjOwotCi0gICAgdm9pZCByZWNhbGNDZWxscygpOwotcHJvdGVjdGVkOgotICAg
IGJvb2wgZW5zdXJlUm93cyhpbnQgbnVtUm93cyk7Ci0gICAgdm9pZCBjbGVhckdyaWQoKTsKLX07
Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK25hbWVzcGFjZSBXZWJDb3JlIHsKIAogY2xhc3MgUmVu
ZGVyVGFibGVSb3cgOiBwdWJsaWMgUmVuZGVyQ29udGFpbmVyCiB7CkBAIC0zMDcsMTMyICs2MSw1
IEBAIHB1YmxpYzoKICNlbmRpZgogfTsKIAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBS
ZW5kZXJUYWJsZUNlbGwgOiBwdWJsaWMgUmVuZGVyQmxvY2sKLXsKLXB1YmxpYzoKLSAgICBSZW5k
ZXJUYWJsZUNlbGwoRE9NOjpOb2RlSW1wbCogbm9kZSk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgZGVz
dHJveSgpOwotCi0gICAgdmlydHVhbCBjb25zdCBjaGFyICpyZW5kZXJOYW1lKCkgY29uc3QgeyBy
ZXR1cm4gIlJlbmRlclRhYmxlQ2VsbCI7IH0KLSAgICB2aXJ0dWFsIGJvb2wgaXNUYWJsZUNlbGwo
KSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0KLSAgICAvLyBvdmVycmlkZXMgUmVuZGVyT2JqZWN0
Ci0gICAgdmlydHVhbCBib29sIHJlcXVpcmVzTGF5ZXIoKTsKLQotICAgIC8vICMjIyBGSVggdGhl
c2UgdHdvLi4uCi0gICAgaW50IGNlbGxJbmRleCgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KLSAgICB2
b2lkIHNldENlbGxJbmRleChpbnQpIHsgfQotCi0gICAgaW50IGNvbFNwYW4oKSBjb25zdCB7IHJl
dHVybiBjU3BhbjsgfQotICAgIHZvaWQgc2V0Q29sU3BhbihpbnQgYykgeyBjU3BhbiA9IGM7IH0K
LQotICAgIGludCByb3dTcGFuKCkgY29uc3QgeyByZXR1cm4gclNwYW47IH0KLSAgICB2b2lkIHNl
dFJvd1NwYW4oaW50IHIpIHsgclNwYW4gPSByOyB9Ci0KLSAgICBpbnQgY29sKCkgY29uc3QgeyBy
ZXR1cm4gX2NvbDsgfQotICAgIHZvaWQgc2V0Q29sKGludCBjb2wpIHsgX2NvbCA9IGNvbDsgfQot
ICAgIGludCByb3coKSBjb25zdCB7IHJldHVybiBfcm93OyB9Ci0gICAgdm9pZCBzZXRSb3coaW50
IHIpIHsgX3JvdyA9IHI7IH0KLQotICAgIExlbmd0aCBzdHlsZU9yQ29sV2lkdGgoKTsKLQotICAg
IC8vIG92ZXJyaWRlcwotICAgIHZpcnR1YWwgdm9pZCBjYWxjTWluTWF4V2lkdGgoKTsKLSAgICB2
aXJ0dWFsIHZvaWQgY2FsY1dpZHRoKCk7Ci0gICAgdmlydHVhbCB2b2lkIHNldFdpZHRoKGludCB3
aWR0aCk7Ci0gICAgdmlydHVhbCB2b2lkIHNldFN0eWxlKFJlbmRlclN0eWxlICpzdHlsZSk7Ci0K
LSAgICBpbnQgYm9yZGVyTGVmdCgpIGNvbnN0OwotICAgIGludCBib3JkZXJSaWdodCgpIGNvbnN0
OwotICAgIGludCBib3JkZXJUb3AoKSBjb25zdDsKLSAgICBpbnQgYm9yZGVyQm90dG9tKCkgY29u
c3Q7Ci0KLSAgICBDb2xsYXBzZWRCb3JkZXJWYWx1ZSBjb2xsYXBzZWRMZWZ0Qm9yZGVyKCkgY29u
c3Q7Ci0gICAgQ29sbGFwc2VkQm9yZGVyVmFsdWUgY29sbGFwc2VkUmlnaHRCb3JkZXIoKSBjb25z
dDsKLSAgICBDb2xsYXBzZWRCb3JkZXJWYWx1ZSBjb2xsYXBzZWRUb3BCb3JkZXIoKSBjb25zdDsK
LSAgICBDb2xsYXBzZWRCb3JkZXJWYWx1ZSBjb2xsYXBzZWRCb3R0b21Cb3JkZXIoKSBjb25zdDsK
LSAgICB2aXJ0dWFsIHZvaWQgY29sbGVjdEJvcmRlcnMoUVZhbHVlTGlzdDxDb2xsYXBzZWRCb3Jk
ZXJWYWx1ZT4mIGJvcmRlclN0eWxlcyk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlRnJvbUVs
ZW1lbnQoKTsKLQotICAgIHZpcnR1YWwgdm9pZCBsYXlvdXQoKTsKLSAgICAKLSAgICB2b2lkIHNl
dENlbGxUb3BFeHRyYShpbnQgcCkgeyBfdG9wRXh0cmEgPSBwOyB9Ci0gICAgdm9pZCBzZXRDZWxs
Qm90dG9tRXh0cmEoaW50IHApIHsgX2JvdHRvbUV4dHJhID0gcDsgfQotCi0gICAgdmlydHVhbCB2
b2lkIHBhaW50KFBhaW50SW5mbyYgaSwgaW50IHR4LCBpbnQgdHkpOwotCi0gICAgdm9pZCBwYWlu
dENvbGxhcHNlZEJvcmRlcihRUGFpbnRlciogcCwgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgp
OwotICAgIAotICAgIC8vIGxpZSBwb3NpdGlvbiB0byBvdXRzaWRlIG9ic2VydmVycwotICAgIHZp
cnR1YWwgaW50IHlQb3MoKSBjb25zdCB7IHJldHVybiBtX3kgKyBfdG9wRXh0cmE7IH0KLQotICAg
IHZpcnR1YWwgdm9pZCBjb21wdXRlQWJzb2x1dGVSZXBhaW50UmVjdChJbnRSZWN0JiByLCBib29s
IGY9ZmFsc2UpOwotICAgIHZpcnR1YWwgYm9vbCBhYnNvbHV0ZVBvc2l0aW9uKGludCAmeFBvcywg
aW50ICZ5UG9zLCBib29sIGYgPSBmYWxzZSk7Ci0KLSAgICB2aXJ0dWFsIHNob3J0IGJhc2VsaW5l
UG9zaXRpb24oYm9vbCA9IGZhbHNlKSBjb25zdDsKLQotICAgIHZpcnR1YWwgaW50IGJvcmRlclRv
cEV4dHJhKCkgY29uc3QgeyByZXR1cm4gX3RvcEV4dHJhOyB9Ci0gICAgdmlydHVhbCBpbnQgYm9y
ZGVyQm90dG9tRXh0cmEoKSBjb25zdCB7IHJldHVybiBfYm90dG9tRXh0cmE7IH0KLQotICAgIFJl
bmRlclRhYmxlICp0YWJsZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PFJlbmRlclRhYmxl
ICo+KHBhcmVudCgpLT5wYXJlbnQoKS0+cGFyZW50KCkpOyB9Ci0gICAgUmVuZGVyVGFibGVTZWN0
aW9uICpzZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8UmVuZGVyVGFibGVTZWN0
aW9uICo+KHBhcmVudCgpLT5wYXJlbnQoKSk7IH0KLQotI2lmbmRlZiBOREVCVUcKLSAgICB2aXJ0
dWFsIHZvaWQgZHVtcChRVGV4dFN0cmVhbSAqc3RyZWFtLCBRU3RyaW5nIGluZCA9ICIiKSBjb25z
dDsKK30KICNlbmRpZgotCi0gICAgdmlydHVhbCBJbnRSZWN0IGdldEFic29sdXRlUmVwYWludFJl
Y3QoKTsKLSAgICAKLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIHZvaWQgcGFpbnRCb3hEZWNvcmF0
aW9ucyhQYWludEluZm8mIGksIGludCBfdHgsIGludCBfdHkpOwotICAgIAotICAgIGludCBfcm93
OwotICAgIGludCBfY29sOwotICAgIGludCByU3BhbjsKLSAgICBpbnQgY1NwYW47Ci0gICAgaW50
IF90b3BFeHRyYSA6IDMxOwotICAgIGJvb2wgbldyYXAgOiAxOwotICAgIGludCBfYm90dG9tRXh0
cmEgOiAzMTsKLSAgICBib29sIG1fd2lkdGhDaGFuZ2VkIDogMTsKLSAgICAKLSAgICBpbnQgbV9w
ZXJjZW50YWdlSGVpZ2h0OwotfTsKLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIFJl
bmRlclRhYmxlQ29sIDogcHVibGljIFJlbmRlckNvbnRhaW5lcgotewotcHVibGljOgotICAgIFJl
bmRlclRhYmxlQ29sKERPTTo6Tm9kZUltcGwqIG5vZGUpOwotCi0gICAgdmlydHVhbCBjb25zdCBj
aGFyICpyZW5kZXJOYW1lKCkgY29uc3QgeyByZXR1cm4gIlJlbmRlclRhYmxlQ29sIjsgfQotCi0g
ICAgaW50IHNwYW4oKSBjb25zdCB7IHJldHVybiBfc3BhbjsgfQotICAgIHZvaWQgc2V0U3Bhbihp
bnQgcykgeyBfc3BhbiA9IHM7IH0KLQotICAgIHZpcnR1YWwgdm9pZCBhZGRDaGlsZChSZW5kZXJP
YmplY3QgKmNoaWxkLCBSZW5kZXJPYmplY3QgKmJlZm9yZUNoaWxkID0gMCk7Ci0KLSAgICB2aXJ0
dWFsIGJvb2wgaXNUYWJsZUNvbCgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLQotICAgIHZpcnR1
YWwgc2hvcnQgbGluZUhlaWdodChib29sKSBjb25zdCB7IHJldHVybiAwOyB9Ci0KLSAgICB2aXJ0
dWFsIHZvaWQgdXBkYXRlRnJvbUVsZW1lbnQoKTsKLQotICAgIHZpcnR1YWwgYm9vbCBjYW5IYXZl
Q2hpbGRyZW4oKSBjb25zdDsKLSAgICAKLSNpZm5kZWYgTkRFQlVHCi0gICAgdmlydHVhbCB2b2lk
IGR1bXAoUVRleHRTdHJlYW0gKnN0cmVhbSwgUVN0cmluZyBpbmQgPSAiIikgY29uc3Q7Ci0jZW5k
aWYKLQotcHJvdGVjdGVkOgotICAgIGludCBfc3BhbjsKLX07Ci0KLX07Ci0jZW5kaWYKLQpJbmRl
eDogcmVuZGVyaW5nL3JlbmRlcl90YWJsZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gcmVuZGVyaW5nL3Jl
bmRlcl90YWJsZS5jcHAJKHJldmlzaW9uIDEyMjUzKQorKysgcmVuZGVyaW5nL3JlbmRlcl90YWJs
ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEsMjI1OCArMCwwIEBACi0vKioKLSAqIFRoaXMgZmls
ZSBpcyBwYXJ0IG9mIHRoZSBET00gaW1wbGVtZW50YXRpb24gZm9yIEtERS4KLSAqCi0gKiBDb3B5
cmlnaHQgKEMpIDE5OTcgTWFydGluIEpvbmVzIChtam9uZXNAa2RlLm9yZykKLSAqICAgICAgICAg
ICAoQykgMTk5NyBUb3JiZW4gV2VpcyAod2Vpc0BrZGUub3JnKQotICogICAgICAgICAgIChDKSAx
OTk4IFdhbGRvIEJhc3RpYW4gKGJhc3RpYW5Aa2RlLm9yZykKLSAqICAgICAgICAgICAoQykgMTk5
OSBMYXJzIEtub2xsIChrbm9sbEBrZGUub3JnKQotICogICAgICAgICAgIChDKSAxOTk5IEFudHRp
IEtvaXZpc3RvIChrb2l2aXN0b0BrZGUub3JnKQotICogQ29weXJpZ2h0IChDKSAyMDAzIEFwcGxl
IENvbXB1dGVyLCBJbmMuCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlv
dSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJt
cyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlz
aGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAy
IG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgot
ICoKLSAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdp
bGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4g
dGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBMaWJyYXJ5IEdlbmVyYWwg
UHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUg
cmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl
Ci0gKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAg
SWYgbm90LCB3cml0ZSB0bwotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwg
NTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBV
U0EuCi0gKi8KLQotLy8jZGVmaW5lIFRBQkxFX0RFQlVHCi0vLyNkZWZpbmUgVEFCTEVfUFJJTlQK
LS8vI2RlZmluZSBERUJVR19MQVlPVVQKLS8vI2RlZmluZSBCT1hfREVCVUcKLSNpbmNsdWRlICJj
b25maWcuaCIKLSNpbmNsdWRlICJyZW5kZXJpbmcvcmVuZGVyX3RhYmxlLmgiCi0jaW5jbHVkZSAi
cmVuZGVyaW5nL3RhYmxlX2xheW91dC5oIgotI2luY2x1ZGUgImh0bWwvaHRtbF90YWJsZWltcGwu
aCIKLSNpbmNsdWRlICJodG1sbmFtZXMuaCIKLSNpbmNsdWRlICJEb2N1bWVudEltcGwuaCIKLQot
I2luY2x1ZGUgPHFhcHBsaWNhdGlvbi5oPgotI2luY2x1ZGUgPHFzdHlsZS5oPgotCi0jaW5jbHVk
ZSA8a2RlYnVnLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0KLXVzaW5nIG5hbWVzcGFjZSBraHRt
bDsKLXVzaW5nIG5hbWVzcGFjZSBET007Ci11c2luZyBuYW1lc3BhY2UgSFRNTE5hbWVzOwotCi1S
ZW5kZXJUYWJsZTo6UmVuZGVyVGFibGUoRE9NOjpOb2RlSW1wbCogbm9kZSkKLSAgICA6IFJlbmRl
ckJsb2NrKG5vZGUpCi17Ci0gICAgdENhcHRpb24gPSAwOwotICAgIGhlYWQgPSBmb290ID0gZmly
c3RCb2R5ID0gMDsKLSAgICB0YWJsZUxheW91dCA9IDA7Ci0gICAgbV9jdXJyZW50Qm9yZGVyID0g
MDsKLSAgICAKLSAgICBydWxlcyA9IE5vbmU7Ci0gICAgZnJhbWUgPSBWb2lkOwotICAgIGhhc19j
b2xfZWxlbXMgPSBmYWxzZTsKLSAgICBoc3BhY2luZyA9IDA7Ci0gICAgdnNwYWNpbmcgPSAwOwot
ICAgIHBhZGRpbmcgPSAwOwotICAgIG5lZWRTZWN0aW9uUmVjYWxjID0gZmFsc2U7Ci0gICAgcGFk
ZGluZyA9IDA7Ci0KLSAgICBjb2x1bW5Qb3MucmVzaXplKDIpOwotICAgIGNvbHVtblBvcy5maWxs
KDApOwotICAgIGNvbHVtbnMucmVzaXplKDEpOwotICAgIGNvbHVtbnMuZmlsbChDb2x1bW5TdHJ1
Y3QoKSk7Ci0KLSAgICBjb2x1bW5Qb3NbMF0gPSAwOwotfQotCi1SZW5kZXJUYWJsZTo6flJlbmRl
clRhYmxlKCkKLXsKLSAgICBkZWxldGUgdGFibGVMYXlvdXQ7Ci19Ci0KLXZvaWQgUmVuZGVyVGFi
bGU6OnNldFN0eWxlKFJlbmRlclN0eWxlICpfc3R5bGUpCi17Ci0gICAgRVRhYmxlTGF5b3V0IG9s
ZFRhYmxlTGF5b3V0ID0gc3R5bGUoKSA/IHN0eWxlKCktPnRhYmxlTGF5b3V0KCkgOiBUQVVUTzsK
LSAgICBSZW5kZXJCbG9jazo6c2V0U3R5bGUoX3N0eWxlKTsKLQotICAgIC8vIEluIHRoZSBjb2xs
YXBzZWQgYm9yZGVyIG1vZGVsLCB0aGVyZSBpcyBubyBjZWxsIHNwYWNpbmcuCi0gICAgaHNwYWNp
bmcgPSBjb2xsYXBzZUJvcmRlcnMoKSA/IDAgOiBzdHlsZSgpLT5ob3Jpem9udGFsQm9yZGVyU3Bh
Y2luZygpOwotICAgIHZzcGFjaW5nID0gY29sbGFwc2VCb3JkZXJzKCkgPyAwIDogc3R5bGUoKS0+
dmVydGljYWxCb3JkZXJTcGFjaW5nKCk7Ci0gICAgY29sdW1uUG9zWzBdID0gaHNwYWNpbmc7Ci0K
LSAgICBpZiAoIXRhYmxlTGF5b3V0IHx8IHN0eWxlKCktPnRhYmxlTGF5b3V0KCkgIT0gb2xkVGFi
bGVMYXlvdXQpIHsKLQlkZWxldGUgdGFibGVMYXlvdXQ7Ci0KLSAgICAgICAgLy8gQWNjb3JkaW5n
IHRvIHRoZSBDU1MyIHNwZWMsIHlvdSBvbmx5IHVzZSBmaXhlZCB0YWJsZSBsYXlvdXQgaWYgYW4K
LSAgICAgICAgLy8gZXhwbGljaXQgd2lkdGggaXMgc3BlY2lmaWVkIG9uIHRoZSB0YWJsZS4gIEF1
dG8gd2lkdGggaW1wbGllcyBhdXRvIHRhYmxlIGxheW91dC4KLQlpZiAoc3R5bGUoKS0+dGFibGVM
YXlvdXQoKSA9PSBURklYRUQgJiYgIXN0eWxlKCktPndpZHRoKCkuaXNBdXRvKCkpCi0JICAgIHRh
YmxlTGF5b3V0ID0gbmV3IEZpeGVkVGFibGVMYXlvdXQodGhpcyk7Ci0JZWxzZQotCSAgICB0YWJs
ZUxheW91dCA9IG5ldyBBdXRvVGFibGVMYXlvdXQodGhpcyk7Ci0gICAgfQotfQotCi12b2lkIFJl
bmRlclRhYmxlOjphZGRDaGlsZChSZW5kZXJPYmplY3QgKmNoaWxkLCBSZW5kZXJPYmplY3QgKmJl
Zm9yZUNoaWxkKQotewotICAgIFJlbmRlck9iamVjdCAqbyA9IGNoaWxkOwotCi0gICAgaWYgKGNo
aWxkLT5lbGVtZW50KCkgJiYgY2hpbGQtPmVsZW1lbnQoKS0+aGFzVGFnTmFtZShmb3JtVGFnKSkg
ewotICAgICAgICBSZW5kZXJDb250YWluZXI6OmFkZENoaWxkKGNoaWxkLGJlZm9yZUNoaWxkKTsK
LSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHN3aXRjaCAoY2hpbGQtPnN0eWxlKCktPmRp
c3BsYXkoKSkgewotICAgICAgICBjYXNlIFRBQkxFX0NBUFRJT046Ci0gICAgICAgICAgICB0Q2Fw
dGlvbiA9IHN0YXRpY19jYXN0PFJlbmRlckJsb2NrICo+KGNoaWxkKTsKLSAgICAgICAgICAgIGJy
ZWFrOwotICAgICAgICBjYXNlIFRBQkxFX0NPTFVNTjoKLSAgICAgICAgY2FzZSBUQUJMRV9DT0xV
TU5fR1JPVVA6Ci0gICAgICAgICAgICBoYXNfY29sX2VsZW1zID0gdHJ1ZTsKLSAgICAgICAgICAg
IGJyZWFrOwotICAgICAgICBjYXNlIFRBQkxFX0hFQURFUl9HUk9VUDoKLSAgICAgICAgICAgIGlm
ICghaGVhZCkKLSAgICAgICAgICAgICAgICBoZWFkID0gc3RhdGljX2Nhc3Q8UmVuZGVyVGFibGVT
ZWN0aW9uICo+KGNoaWxkKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKCFmaXJzdEJvZHkpCi0gICAg
ICAgICAgICAgICAgZmlyc3RCb2R5ID0gc3RhdGljX2Nhc3Q8UmVuZGVyVGFibGVTZWN0aW9uICo+
KGNoaWxkKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRBQkxFX0ZPT1RFUl9H
Uk9VUDoKLSAgICAgICAgICAgIGlmICghZm9vdCkgewotICAgICAgICAgICAgICAgIGZvb3QgPSBz
dGF0aWNfY2FzdDxSZW5kZXJUYWJsZVNlY3Rpb24gKj4oY2hpbGQpOwotICAgICAgICAgICAgICAg
IGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCi0gICAg
ICAgIGNhc2UgVEFCTEVfUk9XX0dST1VQOgotICAgICAgICAgICAgaWYgKCFmaXJzdEJvZHkpCi0g
ICAgICAgICAgICAgICAgZmlyc3RCb2R5ID0gc3RhdGljX2Nhc3Q8UmVuZGVyVGFibGVTZWN0aW9u
ICo+KGNoaWxkKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAg
ICAgICAgaWYgKCFiZWZvcmVDaGlsZCAmJiBsYXN0Q2hpbGQoKSAmJgotICAgICAgICAgICAgICAg
IGxhc3RDaGlsZCgpLT5pc1RhYmxlU2VjdGlvbigpICYmIGxhc3RDaGlsZCgpLT5pc0Fub255bW91
cygpKSB7Ci0gICAgICAgICAgICAgICAgbyA9IGxhc3RDaGlsZCgpOwotICAgICAgICAgICAgfSBl
bHNlIHsKLSAgICAgICAgICAgICAgICBSZW5kZXJPYmplY3QgKmxhc3RCb3ggPSBiZWZvcmVDaGls
ZDsKLSAgICAgICAgICAgICAgICBSZW5kZXJPYmplY3QgKm5leHRUb0xhc3RCb3ggPSBiZWZvcmVD
aGlsZDsKLSAgICAgICAgICAgICAgICB3aGlsZSAobGFzdEJveCAmJiBsYXN0Qm94LT5wYXJlbnQo
KS0+aXNBbm9ueW1vdXMoKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIWxhc3RCb3gtPmlz
VGFibGVTZWN0aW9uKCkgJiYgbGFzdEJveC0+c3R5bGUoKS0+ZGlzcGxheSgpICE9IFRBQkxFX0NB
UFRJT04pIHsKLSAgICAgICAgICAgICAgICAgICAgbmV4dFRvTGFzdEJveCA9IGxhc3RCb3g7Ci0g
ICAgICAgICAgICAgICAgICAgIGxhc3RCb3ggPSBsYXN0Qm94LT5wYXJlbnQoKTsKLSAgICAgICAg
ICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGxhc3RCb3ggJiYgbGFzdEJveC0+aXNBbm9u
eW1vdXMoKSkgewotICAgICAgICAgICAgICAgICAgICBsYXN0Qm94LT5hZGRDaGlsZChjaGlsZCwg
bmV4dFRvTGFzdEJveCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAg
ICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoYmVmb3JlQ2hpbGQgJiYgIWJl
Zm9yZUNoaWxkLT5pc1RhYmxlU2VjdGlvbigpKQotICAgICAgICAgICAgICAgICAgICAgICAgYmVm
b3JlQ2hpbGQgPSAwOwotICAgICAgICAgICAgICAgICAgICBvID0gbmV3IChyZW5kZXJBcmVuYSgp
KSBSZW5kZXJUYWJsZVNlY3Rpb24oZG9jdW1lbnQoKSAvKiBhbm9ueW1vdXMgKi8pOwotICAgICAg
ICAgICAgICAgICAgICBSZW5kZXJTdHlsZSAqbmV3U3R5bGUgPSBuZXcgKHJlbmRlckFyZW5hKCkp
IFJlbmRlclN0eWxlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG5ld1N0eWxlLT5pbmhlcml0RnJv
bShzdHlsZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgbmV3U3R5bGUtPnNldERpc3BsYXkoVEFC
TEVfUk9XX0dST1VQKTsKLSAgICAgICAgICAgICAgICAgICAgby0+c2V0U3R5bGUobmV3U3R5bGUp
OwotICAgICAgICAgICAgICAgICAgICBhZGRDaGlsZChvLCBiZWZvcmVDaGlsZCk7Ci0gICAgICAg
ICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgby0+YWRkQ2hpbGQoY2hpbGQp
OwotICAgICAgICAgICAgY2hpbGQtPnNldE5lZWRzTGF5b3V0QW5kTWluTWF4UmVjYWxjKCk7Ci0g
ICAgICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIFJlbmRlckNvbnRhaW5lcjo6YWRkQ2hpbGQo
Y2hpbGQsYmVmb3JlQ2hpbGQpOwotfQotCi0KLQotdm9pZCBSZW5kZXJUYWJsZTo6Y2FsY1dpZHRo
KCkKLXsKLSAgICBpZiAoaXNQb3NpdGlvbmVkKCkpCi0gICAgICAgIGNhbGNBYnNvbHV0ZUhvcml6
b250YWwoKTsKLQotICAgIFJlbmRlckJsb2NrICpjYiA9IGNvbnRhaW5pbmdCbG9jaygpOwotICAg
IGludCBhdmFpbGFibGVXaWR0aCA9IGNiLT5jb250ZW50V2lkdGgoKTsKLQotICAgIExlbmd0aFR5
cGUgd2lkdGhUeXBlID0gc3R5bGUoKS0+d2lkdGgoKS50eXBlOwotICAgIGlmICh3aWR0aFR5cGUg
PiBSZWxhdGl2ZSAmJiBzdHlsZSgpLT53aWR0aCgpLnZhbHVlID4gMCkgewotCS8vIFBlcmNlbnQg
b3IgZml4ZWQgdGFibGUKLSAgICAgICAgbV93aWR0aCA9IHN0eWxlKCktPndpZHRoKCkubWluV2lk
dGgoYXZhaWxhYmxlV2lkdGgpOwotICAgICAgICBpZiAobV9taW5XaWR0aCA+IG1fd2lkdGgpIG1f
d2lkdGggPSBtX21pbldpZHRoOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIEFuIGF1dG8gd2lk
dGggdGFibGUgc2hvdWxkIHNocmluayB0byBmaXQgd2l0aGluIHRoZSBsaW5lIHdpZHRoIGlmIG5l
Y2Vzc2FyeSBpbiBvcmRlciB0byAKLSAgICAgICAgLy8gYXZvaWQgb3ZlcmxhcHBpbmcgZmxvYXRz
LgotICAgICAgICBhdmFpbGFibGVXaWR0aCA9IGNiLT5saW5lV2lkdGgobV95KTsKLSAgICAgICAg
Ci0gICAgICAgIC8vIFN1YnRyYWN0IG91dCBhbnkgZml4ZWQgbWFyZ2lucyBmcm9tIG91ciBhdmFp
bGFibGUgd2lkdGggZm9yIGF1dG8gd2lkdGggdGFibGVzLgotICAgICAgICBpbnQgbWFyZ2luVG90
YWwgPSAwOwotICAgICAgICBpZiAoc3R5bGUoKS0+bWFyZ2luTGVmdCgpLnR5cGUgIT0gQXV0bykK
LSAgICAgICAgICAgIG1hcmdpblRvdGFsICs9IHN0eWxlKCktPm1hcmdpbkxlZnQoKS53aWR0aChh
dmFpbGFibGVXaWR0aCk7Ci0gICAgICAgIGlmIChzdHlsZSgpLT5tYXJnaW5SaWdodCgpLnR5cGUg
IT0gQXV0bykKLSAgICAgICAgICAgIG1hcmdpblRvdGFsICs9IHN0eWxlKCktPm1hcmdpblJpZ2h0
KCkud2lkdGgoYXZhaWxhYmxlV2lkdGgpOwotICAgICAgICAgICAgCi0gICAgICAgIC8vIFN1YnRy
YWN0IG91dCBvdXIgbWFyZ2lucyB0byBnZXQgdGhlIGF2YWlsYWJsZSBjb250ZW50IHdpZHRoLgot
ICAgICAgICBpbnQgYXZhaWxDb250ZW50V2lkdGggPSBrTWF4KDAsIGF2YWlsYWJsZVdpZHRoIC0g
bWFyZ2luVG90YWwpOwotICAgICAgICAKLSAgICAgICAgLy8gRW5zdXJlIHdlIGFyZW4ndCBiaWdn
ZXIgdGhhbiBvdXIgbWF4IHdpZHRoIG9yIHNtYWxsZXIgdGhhbiBvdXIgbWluIHdpZHRoLgotICAg
ICAgICBtX3dpZHRoID0ga01pbihhdmFpbENvbnRlbnRXaWR0aCwgbV9tYXhXaWR0aCk7Ci0gICAg
fQotICAgIAotICAgIG1fd2lkdGggPSBrTWF4KG1fd2lkdGgsIG1fbWluV2lkdGgpOwotCi0gICAg
Ly8gRmluYWxseSwgd2l0aCBvdXIgdHJ1ZSB3aWR0aCBkZXRlcm1pbmVkLCBjb21wdXRlIG91ciBt
YXJnaW5zIGZvciByZWFsLgotICAgIG1fbWFyZ2luUmlnaHQgPSAwOwotICAgIG1fbWFyZ2luTGVm
dCA9IDA7Ci0gICAgY2FsY0hvcml6b250YWxNYXJnaW5zKHN0eWxlKCktPm1hcmdpbkxlZnQoKSxz
dHlsZSgpLT5tYXJnaW5SaWdodCgpLGF2YWlsYWJsZVdpZHRoKTsKLX0KLQotdm9pZCBSZW5kZXJU
YWJsZTo6bGF5b3V0KCkKLXsKLSAgICBLSFRNTEFzc2VydChuZWVkc0xheW91dCgpKTsKLSAgICBL
SFRNTEFzc2VydChtaW5NYXhLbm93bigpKTsKLSAgICBLSFRNTEFzc2VydCghbmVlZFNlY3Rpb25S
ZWNhbGMpOwotCi0gICAgaWYgKHBvc0NoaWxkTmVlZHNMYXlvdXQoKSAmJiAhbm9ybWFsQ2hpbGRO
ZWVkc0xheW91dCgpICYmICFzZWxmTmVlZHNMYXlvdXQoKSkgewotICAgICAgICAvLyBBbGwgd2Ug
aGF2ZSB0byBpcyBsYXkgb3V0IG91ciBwb3NpdGlvbmVkIG9iamVjdHMuCi0gICAgICAgIGxheW91
dFBvc2l0aW9uZWRPYmplY3RzKHRydWUpOwotICAgICAgICBzZXROZWVkc0xheW91dChmYWxzZSk7
Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBJbnRSZWN0IG9sZEJvdW5kcywgb2xkRnVs
bEJvdW5kczsKLSAgICBib29sIGNoZWNrRm9yUmVwYWludCA9IGNoZWNrRm9yUmVwYWludER1cmlu
Z0xheW91dCgpOwotICAgIGlmIChjaGVja0ZvclJlcGFpbnQpCi0gICAgICAgIGdldEFic29sdXRl
UmVwYWludFJlY3RJbmNsdWRpbmdGbG9hdHMob2xkQm91bmRzLCBvbGRGdWxsQm91bmRzKTsKLSAg
ICAKLSAgICBtX2hlaWdodCA9IG1fb3ZlcmZsb3dIZWlnaHQgPSAwOwotICAgIGluaXRNYXhNYXJn
aW5WYWx1ZXMoKTsKLSAgICAKLSAgICAvL2ludCBvbGRXaWR0aCA9IG1fd2lkdGg7Ci0gICAgY2Fs
Y1dpZHRoKCk7Ci0gICAgbV9vdmVyZmxvd1dpZHRoID0gbV93aWR0aDsKLQotICAgIC8vIHRoZSBv
cHRpbWlzYXRpb24gYmVsb3cgZG9lc24ndCB3b3JrIHNpbmNlIHRoZSBpbnRlcm5hbCB0YWJsZQot
ICAgIC8vIGxheW91dCBjb3VsZCBoYXZlIGNoYW5nZWQuICB3ZSBuZWVkIHRvIGFkZCBhIGZsYWcg
dG8gdGhlIHRhYmxlCi0gICAgLy8gbGF5b3V0IHRoYXQgdGVsbHMgdXMgaWYgc29tZXRoaW5nIGhh
cyBjaGFuZ2VkIGluIHRoZSBtaW4gbWF4Ci0gICAgLy8gY2FsY3VsYXRpb25zIHRvIGRvIGl0IGNv
cnJlY3RseS4KLS8vICAgICBpZiAoIG9sZFdpZHRoICE9IG1fd2lkdGggfHwgY29sdW1ucy5zaXpl
KCkgKyAxICE9IGNvbHVtblBvcy5zaXplKCkgKQotICAgIHRhYmxlTGF5b3V0LT5sYXlvdXQoKTsK
LQotICAgIHNldENlbGxXaWR0aHMoKTsKLQotICAgIC8vIGxheW91dCBjaGlsZCBvYmplY3RzCi0g
ICAgaW50IGNhbGN1bGF0ZWRIZWlnaHQgPSAwOwotCi0gICAgUmVuZGVyT2JqZWN0ICpjaGlsZCA9
IGZpcnN0Q2hpbGQoKTsKLSAgICB3aGlsZShjaGlsZCkgewotCWlmIChjaGlsZC0+bmVlZHNMYXlv
dXQoKSAmJiAhKGNoaWxkLT5lbGVtZW50KCkgJiYgY2hpbGQtPmVsZW1lbnQoKS0+aGFzVGFnTmFt
ZShmb3JtVGFnKSkpCi0JICAgIGNoaWxkLT5sYXlvdXQoKTsKLQlpZiAoY2hpbGQtPmlzVGFibGVT
ZWN0aW9uKCkpIHsKLQkgICAgc3RhdGljX2Nhc3Q8UmVuZGVyVGFibGVTZWN0aW9uICo+KGNoaWxk
KS0+Y2FsY1Jvd0hlaWdodCgpOwotCSAgICBjYWxjdWxhdGVkSGVpZ2h0ICs9IHN0YXRpY19jYXN0
PFJlbmRlclRhYmxlU2VjdGlvbiAqPihjaGlsZCktPmxheW91dFJvd3MoMCk7Ci0JfQotCWNoaWxk
ID0gY2hpbGQtPm5leHRTaWJsaW5nKCk7Ci0gICAgfQotCi0gICAgLy8gIyMjIGNvbGxhcHNlIGNh
cHRpb24gbWFyZ2luCi0gICAgaWYgKHRDYXB0aW9uICYmIHRDYXB0aW9uLT5zdHlsZSgpLT5jYXB0
aW9uU2lkZSgpICE9IENBUEJPVFRPTSkgewotICAgICAgICB0Q2FwdGlvbi0+c2V0UG9zKHRDYXB0
aW9uLT5tYXJnaW5MZWZ0KCksIG1faGVpZ2h0KTsKLSAgICAgICAgbV9oZWlnaHQgKz0gdENhcHRp
b24tPmhlaWdodCgpICsgdENhcHRpb24tPm1hcmdpblRvcCgpICsgdENhcHRpb24tPm1hcmdpbkJv
dHRvbSgpOwotICAgIH0KLQotICAgIGludCBicFRvcCA9IGJvcmRlclRvcCgpICsgKGNvbGxhcHNl
Qm9yZGVycygpID8gMCA6IHBhZGRpbmdUb3AoKSk7Ci0gICAgaW50IGJwQm90dG9tID0gYm9yZGVy
Qm90dG9tKCkgKyAoY29sbGFwc2VCb3JkZXJzKCkgPyAwIDogcGFkZGluZ0JvdHRvbSgpKTsKLSAg
ICAKLSAgICBtX2hlaWdodCArPSBicFRvcDsKLQotICAgIGludCBvbGRIZWlnaHQgPSBtX2hlaWdo
dDsKLSAgICBjYWxjSGVpZ2h0KCk7Ci0gICAgaW50IG5ld0hlaWdodCA9IG1faGVpZ2h0OwotICAg
IG1faGVpZ2h0ID0gb2xkSGVpZ2h0OwotCi0gICAgTGVuZ3RoIGggPSBzdHlsZSgpLT5oZWlnaHQo
KTsKLSAgICBpbnQgdGggPSAwOwotICAgIGlmIChpc1Bvc2l0aW9uZWQoKSkKLSAgICAgICAgdGgg
PSBuZXdIZWlnaHQ7IC8vIEZJWE1FOiBMZWF2ZSB0aGlzIGFsb25lIGZvciBub3cgYnV0IGludmVz
dGlnYXRlIGxhdGVyLgotICAgIGVsc2UgaWYgKGguaXNGaXhlZCgpKQotICAgICAgICB0aCA9IGgu
dmFsdWUgLSAoYnBUb3AgKyBicEJvdHRvbSk7ICAvLyBUYWJsZXMgc2l6ZSBhcyB0aG91Z2ggQ1NT
IGhlaWdodCBpbmNsdWRlcyBib3JkZXIvcGFkZGluZy4KLSAgICBlbHNlIGlmIChoLmlzUGVyY2Vu
dCgpKQotICAgICAgICB0aCA9IGNhbGNQZXJjZW50YWdlSGVpZ2h0KGgpOwotICAgIHRoID0ga01h
eCgwLCB0aCk7Ci0KLSAgICAvLyBsYXlvdXQgcm93cwotICAgIGlmICh0aCA+IGNhbGN1bGF0ZWRI
ZWlnaHQpIHsKLQkvLyB3ZSBoYXZlIHRvIHJlZGlzdHJpYnV0ZSB0aGF0IGhlaWdodCB0byBnZXQg
dGhlIGNvbnN0cmFpbnQgY29ycmVjdGx5Ci0JLy8ganVzdCBmb3JjZSB0aGUgZmlyc3QgYm9keSB0
byB0aGUgaGVpZ2h0IG5lZWRlZAotCS8vICMjIyBGSVhNRSBUaGlzIHNob3VsZCB0YWtlIGhlaWdo
dCBjb25zdHJhaW50cyBvbiBhbGwgdGFibGUgc2VjdGlvbnMgaW50byBhY2NvdW50IGFuZCBkaXN0
cmlidXRlCi0JLy8gYWNjb3JkaW5nbHkuIEZvciBub3cgdGhpcyBzaG91bGQgYmUgZ29vZCBlbm91
Z2gKLSAgICAgICAgaWYgKGZpcnN0Qm9keSkgewotICAgICAgICAgICAgZmlyc3RCb2R5LT5jYWxj
Um93SGVpZ2h0KCk7Ci0gICAgICAgICAgICBmaXJzdEJvZHktPmxheW91dFJvd3ModGggLSBjYWxj
dWxhdGVkSGVpZ2h0KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICghc3R5bGUoKS0+aHRt
bEhhY2tzKCkpIHsKLSAgICAgICAgICAgIC8vIENvbXBsZXRlbHkgZW1wdHkgdGFibGVzICh3aXRo
IG5vIHNlY3Rpb25zIG9yIGFueXRoaW5nKSBzaG91bGQgYXQgbGVhc3QgaG9ub3Igc3BlY2lmaWVk
IGhlaWdodAotICAgICAgICAgICAgLy8gaW4gc3RyaWN0IG1vZGUuCi0gICAgICAgICAgICBtX2hl
aWdodCArPSB0aDsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBpbnQgYmwgPSBib3JkZXJM
ZWZ0KCk7Ci0gICAgaWYgKCFjb2xsYXBzZUJvcmRlcnMoKSkKLSAgICAgICAgYmwgKz0gcGFkZGlu
Z0xlZnQoKTsKLQotICAgIC8vIHBvc2l0aW9uIHRoZSB0YWJsZSBzZWN0aW9ucwotICAgIGlmICho
ZWFkKSB7Ci0JaGVhZC0+c2V0UG9zKGJsLCBtX2hlaWdodCk7Ci0JbV9oZWlnaHQgKz0gaGVhZC0+
aGVpZ2h0KCk7Ci0gICAgfQotICAgIGZvciAoUmVuZGVyT2JqZWN0ICpib2R5ID0gZmlyc3RCb2R5
OyBib2R5OyBib2R5ID0gYm9keS0+bmV4dFNpYmxpbmcoKSkgewotCWlmIChib2R5ICE9IGhlYWQg
JiYgYm9keSAhPSBmb290ICYmIGJvZHktPmlzVGFibGVTZWN0aW9uKCkpIHsKLQkgICAgYm9keS0+
c2V0UG9zKGJsLCBtX2hlaWdodCk7Ci0JICAgIG1faGVpZ2h0ICs9IGJvZHktPmhlaWdodCgpOwot
CX0KLSAgICB9Ci0gICAgaWYgKGZvb3QpIHsKLQlmb290LT5zZXRQb3MoYmwsIG1faGVpZ2h0KTsK
LQltX2hlaWdodCArPSBmb290LT5oZWlnaHQoKTsKLSAgICB9Ci0KLSAgICBtX2hlaWdodCArPSBi
cEJvdHRvbTsKLSAgICAgICAgICAgICAgIAotICAgIGlmICh0Q2FwdGlvbiAmJiB0Q2FwdGlvbi0+
c3R5bGUoKS0+Y2FwdGlvblNpZGUoKT09Q0FQQk9UVE9NKSB7Ci0gICAgICAgIHRDYXB0aW9uLT5z
ZXRQb3ModENhcHRpb24tPm1hcmdpbkxlZnQoKSwgbV9oZWlnaHQpOwotICAgICAgICBtX2hlaWdo
dCArPSB0Q2FwdGlvbi0+aGVpZ2h0KCkgKyB0Q2FwdGlvbi0+bWFyZ2luVG9wKCkgKyB0Q2FwdGlv
bi0+bWFyZ2luQm90dG9tKCk7Ci0gICAgfQotCi0gICAgLy8gdGFibGUgY2FuIGJlIGNvbnRhaW5p
bmcgYmxvY2sgb2YgcG9zaXRpb25lZCBlbGVtZW50cy4KLSAgICAvLyAjIyMgb25seSBwYXNzIHRy
dWUgaWYgd2lkdGggb3IgaGVpZ2h0IGNoYW5nZWQuCi0gICAgbGF5b3V0UG9zaXRpb25lZE9iamVj
dHMoIHRydWUgKTsKLQotICAgIC8vIFJlcGFpbnQgd2l0aCBvdXIgbmV3IGJvdW5kcyBpZiB0aGV5
IGFyZSBkaWZmZXJlbnQgZnJvbSBvdXIgb2xkIGJvdW5kcy4KLSAgICBpZiAoY2hlY2tGb3JSZXBh
aW50KQotICAgICAgICByZXBhaW50QWZ0ZXJMYXlvdXRJZk5lZWRlZChvbGRCb3VuZHMsIG9sZEZ1
bGxCb3VuZHMpOwotICAgIAotICAgIG1fb3ZlcmZsb3dIZWlnaHQgPSBrTWF4KG1fb3ZlcmZsb3dI
ZWlnaHQsIG1faGVpZ2h0KTsKLSAgICBtX292ZXJmbG93V2lkdGggPSBrTWF4KG1fb3ZlcmZsb3dX
aWR0aCwgbV93aWR0aCk7Ci0KLSAgICBzZXROZWVkc0xheW91dChmYWxzZSk7Ci19Ci0KLXZvaWQg
UmVuZGVyVGFibGU6OnNldENlbGxXaWR0aHMoKQotewotICAgIGZvciAoUmVuZGVyT2JqZWN0ICpj
aGlsZCA9IGZpcnN0Q2hpbGQoKTsgY2hpbGQ7IGNoaWxkID0gY2hpbGQtPm5leHRTaWJsaW5nKCkp
Ci0JaWYgKCBjaGlsZC0+aXNUYWJsZVNlY3Rpb24oKSApCi0JICAgIHN0YXRpY19jYXN0PFJlbmRl
clRhYmxlU2VjdGlvbiAqPihjaGlsZCktPnNldENlbGxXaWR0aHMoKTsKLX0KLQotdm9pZCBSZW5k
ZXJUYWJsZTo6cGFpbnQoUGFpbnRJbmZvJiBpLCBpbnQgX3R4LCBpbnQgX3R5KQotewotICAgIF90
eCArPSB4UG9zKCk7Ci0gICAgX3R5ICs9IHlQb3MoKTsKLQotICAgIFBhaW50QWN0aW9uIHBhaW50
QWN0aW9uID0gaS5waGFzZTsKLSAgICAKLSAgICBpbnQgb3MgPSAyKm1heGltYWxPdXRsaW5lU2l6
ZShwYWludEFjdGlvbik7Ci0gICAgaWYgKChfdHkgPj0gaS5yLnkoKSArIGkuci5oZWlnaHQoKSAr
IG9zKSB8fCAoX3R5ICsgaGVpZ2h0KCkgPD0gaS5yLnkoKSAtIG9zKSkKLSAgICAgICAgcmV0dXJu
OwotICAgIGlmICgoX3R4ID49IGkuci54KCkgKyBpLnIud2lkdGgoKSArIG9zKSB8fCAoX3R4ICsg
d2lkdGgoKSA8PSBpLnIueCgpIC0gb3MpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBpZiAoKHBh
aW50QWN0aW9uID09IFBhaW50QWN0aW9uQmxvY2tCYWNrZ3JvdW5kIHx8IHBhaW50QWN0aW9uID09
IFBhaW50QWN0aW9uQ2hpbGRCbG9ja0JhY2tncm91bmQpCi0gICAgICAgICYmIHNob3VsZFBhaW50
QmFja2dyb3VuZE9yQm9yZGVyKCkgJiYgc3R5bGUoKS0+dmlzaWJpbGl0eSgpID09IFZJU0lCTEUp
Ci0gICAgICAgIHBhaW50Qm94RGVjb3JhdGlvbnMoaSwgX3R4LCBfdHkpOwotCi0gICAgLy8gV2Un
cmUgZG9uZS4gIFdlIGRvbid0IGJvdGhlciBwYWludGluZyBhbnkgY2hpbGRyZW4uCi0gICAgaWYg
KHBhaW50QWN0aW9uID09IFBhaW50QWN0aW9uQmxvY2tCYWNrZ3JvdW5kKQotICAgICAgICByZXR1
cm47Ci0gICAgLy8gV2UgZG9uJ3QgcGFpbnQgb3VyIG93biBiYWNrZ3JvdW5kLCBidXQgd2UgZG8g
bGV0IHRoZSBraWRzIHBhaW50IHRoZWlyIGJhY2tncm91bmRzLgotICAgIGlmIChwYWludEFjdGlv
biA9PSBQYWludEFjdGlvbkNoaWxkQmxvY2tCYWNrZ3JvdW5kcykKLSAgICAgICAgcGFpbnRBY3Rp
b24gPSBQYWludEFjdGlvbkNoaWxkQmxvY2tCYWNrZ3JvdW5kOwotICAgIFBhaW50SW5mbyBwYWlu
dEluZm8oaS5wLCBpLnIsIHBhaW50QWN0aW9uLCBwYWludGluZ1Jvb3RGb3JDaGlsZHJlbihpKSk7
Ci0gICAgCi0gICAgZm9yIChSZW5kZXJPYmplY3QgKmNoaWxkID0gZmlyc3RDaGlsZCgpOyBjaGls
ZDsgY2hpbGQgPSBjaGlsZC0+bmV4dFNpYmxpbmcoKSkKLSAgICAgICAgaWYgKGNoaWxkLT5pc1Rh
YmxlU2VjdGlvbigpIHx8IGNoaWxkID09IHRDYXB0aW9uKQotCSAgICBjaGlsZC0+cGFpbnQocGFp
bnRJbmZvLCBfdHgsIF90eSk7Ci0KLSAgICBpZiAoY29sbGFwc2VCb3JkZXJzKCkgJiYgcGFpbnRB
Y3Rpb24gPT0gUGFpbnRBY3Rpb25DaGlsZEJsb2NrQmFja2dyb3VuZCAmJiBzdHlsZSgpLT52aXNp
YmlsaXR5KCkgPT0gVklTSUJMRSkgewotICAgICAgICAvLyBDb2xsZWN0IGFsbCB0aGUgdW5pcXVl
IGJvcmRlciBzdHlsZXMgdGhhdCB3ZSB3YW50IHRvIHBhaW50IGluIGEgc29ydGVkIGxpc3QuICBP
bmNlIHdlCi0gICAgICAgIC8vIGhhdmUgYWxsIHRoZSBzdHlsZXMgc29ydGVkLCB3ZSB0aGVuIGRv
IGluZGl2aWR1YWwgcGFzc2VzLCBwYWludGluZyBlYWNoIHN0eWxlIG9mIGJvcmRlcgotICAgICAg
ICAvLyBmcm9tIGxvd2VzdCBwcmVjZWRlbmNlIHRvIGhpZ2hlc3QgcHJlY2VkZW5jZS4KLSAgICAg
ICAgcGFpbnRJbmZvLnBoYXNlID0gUGFpbnRBY3Rpb25Db2xsYXBzZWRUYWJsZUJvcmRlcnM7Ci0g
ICAgICAgIFFWYWx1ZUxpc3Q8Q29sbGFwc2VkQm9yZGVyVmFsdWU+IGJvcmRlclN0eWxlczsKLSAg
ICAgICAgY29sbGVjdEJvcmRlcnMoYm9yZGVyU3R5bGVzKTsKLSAgICAgICAgUVZhbHVlTGlzdEl0
ZXJhdG9yPENvbGxhcHNlZEJvcmRlclZhbHVlPiBpdCA9IGJvcmRlclN0eWxlcy5iZWdpbigpOwot
ICAgICAgICBRVmFsdWVMaXN0SXRlcmF0b3I8Q29sbGFwc2VkQm9yZGVyVmFsdWU+IGVuZCA9IGJv
cmRlclN0eWxlcy5lbmQoKTsKLSAgICAgICAgZm9yICg7IGl0ICE9IGVuZDsgKytpdCkgewotICAg
ICAgICAgICAgbV9jdXJyZW50Qm9yZGVyID0gJigqaXQpOwotICAgICAgICAgICAgZm9yIChSZW5k
ZXJPYmplY3QqIGNoaWxkID0gZmlyc3RDaGlsZCgpOyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4
dFNpYmxpbmcoKSkKLSAgICAgICAgICAgICAgICBpZiAoY2hpbGQtPmlzVGFibGVTZWN0aW9uKCkp
Ci0gICAgICAgICAgICAgICAgICAgIGNoaWxkLT5wYWludChwYWludEluZm8sIF90eCwgX3R5KTsK
LSAgICAgICAgfQotICAgIH0KLSAgICAgICAgCi0jaWZkZWYgQk9YX0RFQlVHCi0gICAgb3V0bGlu
ZUJveChpLnAsIF90eCwgX3R5LCAiYmx1ZSIpOwotI2VuZGlmCi19Ci0KLXZvaWQgUmVuZGVyVGFi
bGU6OnBhaW50Qm94RGVjb3JhdGlvbnMoUGFpbnRJbmZvJiBpLCBpbnQgX3R4LCBpbnQgX3R5KQot
ewotICAgIGludCB3ID0gd2lkdGgoKTsKLSAgICBpbnQgaCA9IGhlaWdodCgpOwotICAgIAotICAg
IC8vIEFjY291bnQgZm9yIHRoZSBjYXB0aW9uLgotICAgIGlmICh0Q2FwdGlvbikgewotICAgICAg
ICBpbnQgY2FwdGlvbkhlaWdodCA9ICh0Q2FwdGlvbi0+aGVpZ2h0KCkgKyB0Q2FwdGlvbi0+bWFy
Z2luQm90dG9tKCkgKyAgdENhcHRpb24tPm1hcmdpblRvcCgpKTsKLSAgICAgICAgaCAtPSBjYXB0
aW9uSGVpZ2h0OwotICAgICAgICBpZiAodENhcHRpb24tPnN0eWxlKCktPmNhcHRpb25TaWRlKCkg
IT0gQ0FQQk9UVE9NKQotICAgICAgICAgICAgX3R5ICs9IGNhcHRpb25IZWlnaHQ7Ci0gICAgfQot
Ci0gICAgaW50IG15ID0ga01heChfdHksIGkuci55KCkpOwotICAgIGludCBtaDsKLSAgICBpZiAo
X3R5IDwgaS5yLnkoKSkKLSAgICAgICAgbWg9IGtNYXgoMCwgaCAtIChpLnIueSgpIC0gX3R5KSk7
Ci0gICAgZWxzZQotICAgICAgICBtaCA9IGtNaW4oaS5yLmhlaWdodCgpLCBoKTsKLSAgICAKLSAg
ICBwYWludEJhY2tncm91bmQoaS5wLCBzdHlsZSgpLT5iYWNrZ3JvdW5kQ29sb3IoKSwgc3R5bGUo
KS0+YmFja2dyb3VuZExheWVycygpLCBteSwgbWgsIF90eCwgX3R5LCB3LCBoKTsKLSAgICAKLSAg
ICBpZiAoc3R5bGUoKS0+aGFzQm9yZGVyKCkgJiYgIWNvbGxhcHNlQm9yZGVycygpKQotICAgICAg
ICBwYWludEJvcmRlcihpLnAsIF90eCwgX3R5LCB3LCBoLCBzdHlsZSgpKTsKLX0KLQotdm9pZCBS
ZW5kZXJUYWJsZTo6Y2FsY01pbk1heFdpZHRoKCkKLXsKLSAgICBLSFRNTEFzc2VydCghbWluTWF4
S25vd24oKSk7Ci0KLSAgICBpZiAobmVlZFNlY3Rpb25SZWNhbGMpCi0JcmVjYWxjU2VjdGlvbnMo
KTsKLQotICAgIHRhYmxlTGF5b3V0LT5jYWxjTWluTWF4V2lkdGgoKTsKLQotICAgIGlmICh0Q2Fw
dGlvbiAmJiB0Q2FwdGlvbi0+bWluV2lkdGgoKSA+IG1fbWluV2lkdGgpCi0gICAgICAgIG1fbWlu
V2lkdGggPSB0Q2FwdGlvbi0+bWluV2lkdGgoKTsKLQotICAgIHNldE1pbk1heEtub3duKCk7Ci19
Ci0KLXZvaWQgUmVuZGVyVGFibGU6OnNwbGl0Q29sdW1uKGludCBwb3MsIGludCBmaXJzdFNwYW4p
Ci17Ci0gICAgLy8gd2UgbmVlZCB0byBhZGQgYSBuZXcgY29sdW1uU3RydWN0Ci0gICAgaW50IG9s
ZFNpemUgPSBjb2x1bW5zLnNpemUoKTsKLSAgICBjb2x1bW5zLnJlc2l6ZShvbGRTaXplICsgMSk7
Ci0gICAgaW50IG9sZFNwYW4gPSBjb2x1bW5zW3Bvc10uc3BhbjsKLS8vICAgICBxRGVidWcoInNw
bGl0Q29sdW1uKCAlZCwlZCApLCBvbGRTaXplPSVkLCBvbGRTcGFuPSVkIiwgcG9zLCBmaXJzdFNw
YW4sIG9sZFNpemUsIG9sZFNwYW4gKTsKLSAgICBLSFRNTEFzc2VydChvbGRTcGFuID4gZmlyc3RT
cGFuKTsKLSAgICBjb2x1bW5zW3Bvc10uc3BhbiA9IGZpcnN0U3BhbjsKLSAgICBtZW1tb3ZlKGNv
bHVtbnMuZGF0YSgpICsgcG9zICsgMSwgY29sdW1ucy5kYXRhKCkgKyBwb3MsIChvbGRTaXplLXBv
cykqc2l6ZW9mKENvbHVtblN0cnVjdCkpOwotICAgIGNvbHVtbnNbcG9zKzFdLnNwYW4gPSBvbGRT
cGFuIC0gZmlyc3RTcGFuOwotCi0gICAgLy8gY2hhbmdlIHdpZHRoIG9mIGFsbCByb3dzLgotICAg
IGZvciAoUmVuZGVyT2JqZWN0ICpjaGlsZCA9IGZpcnN0Q2hpbGQoKTsgY2hpbGQ7IGNoaWxkID0g
Y2hpbGQtPm5leHRTaWJsaW5nKCkpIHsKLQlpZiAoY2hpbGQtPmlzVGFibGVTZWN0aW9uKCkpIHsK
LQkgICAgUmVuZGVyVGFibGVTZWN0aW9uICpzZWN0aW9uID0gc3RhdGljX2Nhc3Q8UmVuZGVyVGFi
bGVTZWN0aW9uICo+KGNoaWxkKTsKLQkgICAgaWYgKHNlY3Rpb24tPmNDb2wgPiBwb3MpCi0JCXNl
Y3Rpb24tPmNDb2wrKzsKLQkgICAgaW50IHNpemUgPSBzZWN0aW9uLT5udW1Sb3dzKCk7Ci0JICAg
IGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IHNpemU7ICsrcm93KSB7Ci0JCXNlY3Rpb24tPmdyaWRb
cm93XS5yb3ctPnJlc2l6ZShvbGRTaXplICsgMSk7Ci0JCVJlbmRlclRhYmxlU2VjdGlvbjo6Um93
ICZyID0gKnNlY3Rpb24tPmdyaWRbcm93XS5yb3c7Ci0JCW1lbW1vdmUoci5kYXRhKCkgKyBwb3Mg
KyAxLCByLmRhdGEoKSArIHBvcywgKG9sZFNpemUgLSBwb3MpICogc2l6ZW9mKFJlbmRlclRhYmxl
U2VjdGlvbjo6Q2VsbFN0cnVjdCkpOwotCQlyW3BvcyArIDFdLmNlbGwgPSAwOwotICAgICAgICAg
ICAgICAgIHJbcG9zICsgMV0uaW5Db2xTcGFuID0gcltwb3NdLmluQ29sU3BhbiB8fCByW3Bvc10u
Y2VsbDsKLQkgICAgfQotCX0KLSAgICB9Ci0gICAgY29sdW1uUG9zLnJlc2l6ZShudW1FZmZDb2xz
KCkgKyAxKTsKLSAgICBzZXROZWVkc0xheW91dEFuZE1pbk1heFJlY2FsYygpOwotfQotCi12b2lk
IFJlbmRlclRhYmxlOjphcHBlbmRDb2x1bW4oaW50IHNwYW4pCi17Ci0gICAgLy8gZWFzeSBjYXNl
LgotICAgIGludCBwb3MgPSBjb2x1bW5zLnNpemUoKTsKLSAgICBpbnQgbmV3U2l6ZSA9IHBvcyAr
IDE7Ci0gICAgY29sdW1ucy5yZXNpemUobmV3U2l6ZSk7Ci0gICAgY29sdW1uc1twb3NdLnNwYW4g
PSBzcGFuOwotCi0gICAgLy8gY2hhbmdlIHdpZHRoIG9mIGFsbCByb3dzLgotICAgIGZvciAoUmVu
ZGVyT2JqZWN0ICpjaGlsZCA9IGZpcnN0Q2hpbGQoKTsgY2hpbGQ7IGNoaWxkID0gY2hpbGQtPm5l
eHRTaWJsaW5nKCkpIHsKLQlpZiAoY2hpbGQtPmlzVGFibGVTZWN0aW9uKCkpIHsKLQkgICAgUmVu
ZGVyVGFibGVTZWN0aW9uICpzZWN0aW9uID0gc3RhdGljX2Nhc3Q8UmVuZGVyVGFibGVTZWN0aW9u
ICo+KGNoaWxkKTsKLQkgICAgaW50IHNpemUgPSBzZWN0aW9uLT5udW1Sb3dzKCk7Ci0JICAgIGZv
ciAoaW50IHJvdyA9IDA7IHJvdyA8IHNpemU7ICsrcm93KSB7Ci0JCXNlY3Rpb24tPmdyaWRbcm93
XS5yb3ctPnJlc2l6ZShuZXdTaXplKTsKLSAgICAgICAgICAgICAgICBSZW5kZXJUYWJsZVNlY3Rp
b246OkNlbGxTdHJ1Y3QmIGMgPSBzZWN0aW9uLT5jZWxsQXQocm93LCBwb3MpOwotCQljLmNlbGwg
PSAwOwotCQljLmluQ29sU3BhbiA9IGZhbHNlOwotCSAgICB9Ci0JfQotICAgIH0KLSAgICBjb2x1
bW5Qb3MucmVzaXplKG51bUVmZkNvbHMoKSArIDEpOwotICAgIHNldE5lZWRzTGF5b3V0QW5kTWlu
TWF4UmVjYWxjKCk7Ci19Ci0KLVJlbmRlclRhYmxlQ29sICpSZW5kZXJUYWJsZTo6Y29sRWxlbWVu
dChpbnQgY29sKSB7Ci0gICAgaWYgKCFoYXNfY29sX2VsZW1zKQotCXJldHVybiAwOwotICAgIFJl
bmRlck9iamVjdCAqY2hpbGQgPSBmaXJzdENoaWxkKCk7Ci0gICAgaW50IGNDb2wgPSAwOwotICAg
IHdoaWxlIChjaGlsZCkgewotCWlmIChjaGlsZC0+aXNUYWJsZUNvbCgpKSB7Ci0JICAgIFJlbmRl
clRhYmxlQ29sICpjb2xFbGVtID0gc3RhdGljX2Nhc3Q8UmVuZGVyVGFibGVDb2wgKj4oY2hpbGQp
OwotCSAgICBpbnQgc3BhbiA9IGNvbEVsZW0tPnNwYW4oKTsKLQkgICAgaWYgKCFjb2xFbGVtLT5m
aXJzdENoaWxkKCkpIHsKLQkJY0NvbCArPSBzcGFuOwotCQlpZiAoY0NvbCA+IGNvbCkKLQkJICAg
IHJldHVybiBjb2xFbGVtOwotCSAgICB9Ci0KLQkgICAgUmVuZGVyT2JqZWN0ICpuZXh0ID0gY2hp
bGQtPmZpcnN0Q2hpbGQoKTsKLQkgICAgaWYgKCFuZXh0KQotCQluZXh0ID0gY2hpbGQtPm5leHRT
aWJsaW5nKCk7Ci0JICAgIGlmICghbmV4dCAmJiBjaGlsZC0+cGFyZW50KCktPmlzVGFibGVDb2wo
KSkKLQkJbmV4dCA9IGNoaWxkLT5wYXJlbnQoKS0+bmV4dFNpYmxpbmcoKTsKLQkgICAgY2hpbGQg
PSBuZXh0OwotCX0gZWxzZSBpZiAoY2hpbGQgPT0gdENhcHRpb24pCi0gICAgICAgICAgICBjaGls
ZCA9IGNoaWxkLT5uZXh0U2libGluZygpOwotICAgICAgICBlbHNlCi0JICAgIGJyZWFrOwotICAg
IH0KLSAgICByZXR1cm4gMDsKLX0KLQotdm9pZCBSZW5kZXJUYWJsZTo6cmVjYWxjU2VjdGlvbnMo
KQotewotICAgIHRDYXB0aW9uID0gMDsKLSAgICBoZWFkID0gZm9vdCA9IGZpcnN0Qm9keSA9IDA7
Ci0gICAgaGFzX2NvbF9lbGVtcyA9IGZhbHNlOwotCi0gICAgLy8gV2UgbmVlZCB0byBnZXQgdmFs
aWQgcG9pbnRlcnMgdG8gY2FwdGlvbiwgaGVhZCwgZm9vdCBhbmQgZmlyc3Rib2R5IGFnYWluCi0g
ICAgZm9yIChSZW5kZXJPYmplY3QgKmNoaWxkID0gZmlyc3RDaGlsZCgpOyBjaGlsZDsgY2hpbGQg
PSBjaGlsZC0+bmV4dFNpYmxpbmcoKSkgewotCXN3aXRjaCAoY2hpbGQtPnN0eWxlKCktPmRpc3Bs
YXkoKSkgewotICAgICAgICAgICAgY2FzZSBUQUJMRV9DQVBUSU9OOgotICAgICAgICAgICAgICAg
IGlmICghdENhcHRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgdENhcHRpb24gPSBzdGF0aWNf
Y2FzdDxSZW5kZXJCbG9jayo+KGNoaWxkKTsKLSAgICAgICAgICAgICAgICAgICAgdENhcHRpb24t
PnNldE5lZWRzTGF5b3V0KHRydWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVEFCTEVfQ09MVU1OOgotICAgICAgICAgICAgY2Fz
ZSBUQUJMRV9DT0xVTU5fR1JPVVA6Ci0gICAgICAgICAgICAgICAgaGFzX2NvbF9lbGVtcyA9IHRy
dWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFRBQkxFX0hFQURF
Ul9HUk9VUDogewotICAgICAgICAgICAgICAgIFJlbmRlclRhYmxlU2VjdGlvbiAqc2VjdGlvbiA9
IHN0YXRpY19jYXN0PFJlbmRlclRhYmxlU2VjdGlvbiAqPihjaGlsZCk7Ci0gICAgICAgICAgICAg
ICAgaWYgKCFoZWFkKQotICAgICAgICAgICAgICAgICAgICBoZWFkID0gc2VjdGlvbjsKLSAgICAg
ICAgICAgICAgICBlbHNlIGlmICghZmlyc3RCb2R5KQotICAgICAgICAgICAgICAgICAgICBmaXJz
dEJvZHkgPSBzZWN0aW9uOwotICAgICAgICAgICAgICAgIGlmIChzZWN0aW9uLT5uZWVkQ2VsbFJl
Y2FsYykKLSAgICAgICAgICAgICAgICAgICAgc2VjdGlvbi0+cmVjYWxjQ2VsbHMoKTsKLSAgICAg
ICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgVEFCTEVf
Rk9PVEVSX0dST1VQOiB7Ci0gICAgICAgICAgICAgICAgUmVuZGVyVGFibGVTZWN0aW9uICpzZWN0
aW9uID0gc3RhdGljX2Nhc3Q8UmVuZGVyVGFibGVTZWN0aW9uICo+KGNoaWxkKTsKLSAgICAgICAg
ICAgICAgICBpZiAoIWZvb3QpCi0gICAgICAgICAgICAgICAgICAgIGZvb3QgPSBzZWN0aW9uOwot
ICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFmaXJzdEJvZHkpCi0gICAgICAgICAgICAgICAgICAg
IGZpcnN0Qm9keSA9IHNlY3Rpb247Ci0gICAgICAgICAgICAgICAgaWYgKHNlY3Rpb24tPm5lZWRD
ZWxsUmVjYWxjKQotICAgICAgICAgICAgICAgICAgICBzZWN0aW9uLT5yZWNhbGNDZWxscygpOwot
ICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBU
QUJMRV9ST1dfR1JPVVA6IHsKLSAgICAgICAgICAgICAgICBSZW5kZXJUYWJsZVNlY3Rpb24gKnNl
Y3Rpb24gPSBzdGF0aWNfY2FzdDxSZW5kZXJUYWJsZVNlY3Rpb24gKj4oY2hpbGQpOwotICAgICAg
ICAgICAgICAgIGlmICghZmlyc3RCb2R5KQotICAgICAgICAgICAgICAgICAgICBmaXJzdEJvZHkg
PSBzZWN0aW9uOwotICAgICAgICAgICAgICAgIGlmIChzZWN0aW9uLT5uZWVkQ2VsbFJlY2FsYykK
LSAgICAgICAgICAgICAgICAgICAgc2VjdGlvbi0+cmVjYWxjQ2VsbHMoKTsKLSAgICAgICAgICAg
IH0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0JfQotICAg
IH0KLSAgICBuZWVkU2VjdGlvblJlY2FsYyA9IGZhbHNlOwotICAgIHNldE5lZWRzTGF5b3V0KHRy
dWUpOwotfQotCi1SZW5kZXJPYmplY3QqIFJlbmRlclRhYmxlOjpyZW1vdmVDaGlsZE5vZGUoUmVu
ZGVyT2JqZWN0KiBjaGlsZCkKLXsKLSAgICBzZXROZWVkU2VjdGlvblJlY2FsYygpOwotICAgIHJl
dHVybiBSZW5kZXJDb250YWluZXI6OnJlbW92ZUNoaWxkTm9kZShjaGlsZCk7Ci19Ci0KLWludCBS
ZW5kZXJUYWJsZTo6Ym9yZGVyTGVmdCgpIGNvbnN0Ci17Ci0gICAgaWYgKGNvbGxhcHNlQm9yZGVy
cygpKSB7Ci0gICAgICAgIC8vIEZJWE1FOiBGb3Igc3RyaWN0IG1vZGUsIHJldHVybmluZyAwIGlz
IGNvcnJlY3QsIHNpbmNlIHRoZSB0YWJsZSBib3JkZXIgaGFsZiBzcGlsbHMgaW50byB0aGUgbWFy
Z2luLAotICAgICAgICAvLyBidXQgSSdtIHdvcmtpbmcgdG8gZ2V0IHRoaXMgY2hhbmdlZC4gIEZv
ciBub3csIGZvbGxvdyB0aGUgc3BlYy4KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJl
dHVybiBSZW5kZXJCbG9jazo6Ym9yZGVyTGVmdCgpOwotfQotICAgIAotaW50IFJlbmRlclRhYmxl
Ojpib3JkZXJSaWdodCgpIGNvbnN0Ci17Ci0gICAgaWYgKGNvbGxhcHNlQm9yZGVycygpKSB7Ci0g
ICAgICAgIC8vIEZJWE1FOiBGb3Igc3RyaWN0IG1vZGUsIHJldHVybmluZyAwIGlzIGNvcnJlY3Qs
IHNpbmNlIHRoZSB0YWJsZSBib3JkZXIgaGFsZiBzcGlsbHMgaW50byB0aGUgbWFyZ2luLAotICAg
ICAgICAvLyBidXQgSSdtIHdvcmtpbmcgdG8gZ2V0IHRoaXMgY2hhbmdlZC4gIEZvciBub3csIGZv
bGxvdyB0aGUgc3BlYy4KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBSZW5k
ZXJCbG9jazo6Ym9yZGVyUmlnaHQoKTsKLX0KLQotaW50IFJlbmRlclRhYmxlOjpib3JkZXJUb3Ao
KSBjb25zdAotewotICAgIGlmIChjb2xsYXBzZUJvcmRlcnMoKSkgewotICAgICAgICAvLyBGSVhN
RTogRm9yIHN0cmljdCBtb2RlLCByZXR1cm5pbmcgMCBpcyBjb3JyZWN0LCBzaW5jZSB0aGUgdGFi
bGUgYm9yZGVyIGhhbGYgc3BpbGxzIGludG8gdGhlIG1hcmdpbiwKLSAgICAgICAgLy8gYnV0IEkn
bSB3b3JraW5nIHRvIGdldCB0aGlzIGNoYW5nZWQuICBGb3Igbm93LCBmb2xsb3cgdGhlIHNwZWMu
Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gUmVuZGVyQmxvY2s6OmJvcmRl
clRvcCgpOwotfQotCi1pbnQgUmVuZGVyVGFibGU6OmJvcmRlckJvdHRvbSgpIGNvbnN0Ci17Ci0g
ICAgaWYgKGNvbGxhcHNlQm9yZGVycygpKSB7Ci0gICAgICAgIC8vIEZJWE1FOiBGb3Igc3RyaWN0
IG1vZGUsIHJldHVybmluZyAwIGlzIGNvcnJlY3QsIHNpbmNlIHRoZSB0YWJsZSBib3JkZXIgaGFs
ZiBzcGlsbHMgaW50byB0aGUgbWFyZ2luLAotICAgICAgICAvLyBidXQgSSdtIHdvcmtpbmcgdG8g
Z2V0IHRoaXMgY2hhbmdlZC4gIEZvciBub3csIGZvbGxvdyB0aGUgc3BlYy4KLSAgICAgICAgcmV0
dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBSZW5kZXJCbG9jazo6Ym9yZGVyQm90dG9tKCk7Ci19
Ci0KLVJlbmRlclRhYmxlQ2VsbCogUmVuZGVyVGFibGU6OmNlbGxBYm92ZShjb25zdCBSZW5kZXJU
YWJsZUNlbGwqIGNlbGwpIGNvbnN0Ci17Ci0gICAgLy8gRmluZCB0aGUgc2VjdGlvbiBhbmQgcm93
IHRvIGxvb2sgaW4KLSAgICBpbnQgciA9IGNlbGwtPnJvdygpOwotICAgIFJlbmRlclRhYmxlU2Vj
dGlvbiogc2VjdGlvbiA9IDA7Ci0gICAgaW50IHJBYm92ZSA9IC0xOwotICAgIGlmIChyID4gMCkg
ewotICAgICAgICAvLyBjZWxsIGlzIG5vdCBpbiB0aGUgZmlyc3Qgcm93LCBzbyB1c2UgdGhlIGFi
b3ZlIHJvdyBpbiBpdHMgb3duIHNlY3Rpb24KLSAgICAgICAgc2VjdGlvbiA9IGNlbGwtPnNlY3Rp
b24oKTsKLSAgICAgICAgckFib3ZlID0gci0xOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIGNl
bGwgaXMgYXQgdG9wIG9mIGEgc2VjdGlvbiwgdXNlIGxhc3Qgcm93IGluIHByZXZpb3VzIHNlY3Rp
b24KLSAgICAgICAgZm9yIChSZW5kZXJPYmplY3QgKnByZXZTZWN0aW9uID0gY2VsbC0+c2VjdGlv
bigpLT5wcmV2aW91c1NpYmxpbmcoKTsKLSAgICAgICAgICAgICBwcmV2U2VjdGlvbiAmJiByQWJv
dmUgPCAwOwotICAgICAgICAgICAgIHByZXZTZWN0aW9uID0gcHJldlNlY3Rpb24tPnByZXZpb3Vz
U2libGluZygpKSB7Ci0gICAgICAgICAgICBpZiAocHJldlNlY3Rpb24tPmlzVGFibGVTZWN0aW9u
KCkpIHsKLSAgICAgICAgICAgICAgICBzZWN0aW9uID0gc3RhdGljX2Nhc3Q8UmVuZGVyVGFibGVT
ZWN0aW9uICo+KHByZXZTZWN0aW9uKTsKLSAgICAgICAgICAgICAgICBpZiAoc2VjdGlvbi0+bnVt
Um93cygpID4gMCkKLSAgICAgICAgICAgICAgICAgICAgckFib3ZlID0gc2VjdGlvbi0+bnVtUm93
cygpLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBMb29rIHVw
IHRoZSBjZWxsIGluIHRoZSBzZWN0aW9uJ3MgZ3JpZCwgd2hpY2ggcmVxdWlyZXMgZWZmZWN0aXZl
IGNvbCBpbmRleAotICAgIGlmIChzZWN0aW9uICYmIHJBYm92ZSA+PSAwKSB7Ci0gICAgICAgIGlu
dCBlZmZDb2wgPSBjb2xUb0VmZkNvbChjZWxsLT5jb2woKSk7Ci0gICAgICAgIFJlbmRlclRhYmxl
U2VjdGlvbjo6Q2VsbFN0cnVjdCBhYm92ZUNlbGw7Ci0gICAgICAgIC8vIElmIHdlIGhpdCBhIHNw
YW4gYmFjayB1cCB0byBhIHJlYWwgY2VsbC4KLSAgICAgICAgZG8gewotICAgICAgICAgICAgYWJv
dmVDZWxsID0gc2VjdGlvbi0+Y2VsbEF0KHJBYm92ZSwgZWZmQ29sKTsKLSAgICAgICAgICAgIGVm
ZkNvbC0tOwotICAgICAgICB9IHdoaWxlICghYWJvdmVDZWxsLmNlbGwgJiYgYWJvdmVDZWxsLmlu
Q29sU3BhbiAmJiBlZmZDb2wgPj0wKTsKLSAgICAgICAgcmV0dXJuIGFib3ZlQ2VsbC5jZWxsOwot
ICAgIH0gZWxzZQotICAgICAgICByZXR1cm4gMDsKLX0KLQotUmVuZGVyVGFibGVDZWxsKiBSZW5k
ZXJUYWJsZTo6Y2VsbEJlbG93KGNvbnN0IFJlbmRlclRhYmxlQ2VsbCogY2VsbCkgY29uc3QKLXsK
LSAgICAvLyBGaW5kIHRoZSBzZWN0aW9uIGFuZCByb3cgdG8gbG9vayBpbgotICAgIGludCByID0g
Y2VsbC0+cm93KCkgKyBjZWxsLT5yb3dTcGFuKCkgLSAxOwotICAgIFJlbmRlclRhYmxlU2VjdGlv
biogc2VjdGlvbiA9IDA7Ci0gICAgaW50IHJCZWxvdyA9IC0xOwotICAgIGlmIChyIDwgY2VsbC0+
c2VjdGlvbigpLT5udW1Sb3dzKCkgLSAxKSB7Ci0gICAgICAgIC8vIFRoZSBjZWxsIGlzIG5vdCBp
biB0aGUgbGFzdCByb3csIHNvIHVzZSB0aGUgbmV4dCByb3cgaW4gdGhlIHNlY3Rpb24uCi0gICAg
ICAgIHNlY3Rpb24gPSBjZWxsLT5zZWN0aW9uKCk7Ci0gICAgICAgIHJCZWxvdz0gcisxOwotICAg
IH0gZWxzZSB7Ci0gICAgICAgIC8vIFRoZSBjZWxsIGlzIGF0IHRoZSBib3R0b20gb2YgYSBzZWN0
aW9uLiBVc2UgdGhlIGZpcnN0IHJvdyBpbiB0aGUgbmV4dCBzZWN0aW9uLgotICAgICAgICBmb3Ig
KFJlbmRlck9iamVjdCogbmV4dFNlY3Rpb24gPSBjZWxsLT5zZWN0aW9uKCktPm5leHRTaWJsaW5n
KCk7Ci0gICAgICAgICAgICAgbmV4dFNlY3Rpb24gJiYgckJlbG93IDwgMDsKLSAgICAgICAgICAg
ICBuZXh0U2VjdGlvbiA9IG5leHRTZWN0aW9uLT5uZXh0U2libGluZygpKSB7Ci0gICAgICAgICAg
ICBpZiAobmV4dFNlY3Rpb24tPmlzVGFibGVTZWN0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICBz
ZWN0aW9uID0gc3RhdGljX2Nhc3Q8UmVuZGVyVGFibGVTZWN0aW9uICo+KG5leHRTZWN0aW9uKTsK
LSAgICAgICAgICAgICAgICBpZiAoc2VjdGlvbi0+bnVtUm93cygpID4gMCkKLSAgICAgICAgICAg
ICAgICAgICAgckJlbG93ID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAg
ICAKLSAgICAvLyBMb29rIHVwIHRoZSBjZWxsIGluIHRoZSBzZWN0aW9uJ3MgZ3JpZCwgd2hpY2gg
cmVxdWlyZXMgZWZmZWN0aXZlIGNvbCBpbmRleAotICAgIGlmIChzZWN0aW9uICYmIHJCZWxvdyA+
PSAwKSB7Ci0gICAgICAgIGludCBlZmZDb2wgPSBjb2xUb0VmZkNvbChjZWxsLT5jb2woKSk7Ci0g
ICAgICAgIFJlbmRlclRhYmxlU2VjdGlvbjo6Q2VsbFN0cnVjdCBiZWxvd0NlbGw7Ci0gICAgICAg
IC8vIElmIHdlIGhpdCBhIGNvbHNwYW4gYmFjayB1cCB0byBhIHJlYWwgY2VsbC4KLSAgICAgICAg
ZG8gewotICAgICAgICAgICAgYmVsb3dDZWxsID0gc2VjdGlvbi0+Y2VsbEF0KHJCZWxvdywgZWZm
Q29sKTsKLSAgICAgICAgICAgIGVmZkNvbC0tOwotICAgICAgICB9IHdoaWxlICghYmVsb3dDZWxs
LmNlbGwgJiYgYmVsb3dDZWxsLmluQ29sU3BhbiAmJiBlZmZDb2wgPj0wKTsKLSAgICAgICAgcmV0
dXJuIGJlbG93Q2VsbC5jZWxsOwotICAgIH0gZWxzZQotICAgICAgICByZXR1cm4gMDsKLX0KLQot
UmVuZGVyVGFibGVDZWxsKiBSZW5kZXJUYWJsZTo6Y2VsbExlZnQoY29uc3QgUmVuZGVyVGFibGVD
ZWxsKiBjZWxsKSBjb25zdAotewotICAgIFJlbmRlclRhYmxlU2VjdGlvbiogc2VjdGlvbiA9IGNl
bGwtPnNlY3Rpb24oKTsKLSAgICBpbnQgZWZmQ29sID0gY29sVG9FZmZDb2woY2VsbC0+Y29sKCkp
OwotICAgIGlmIChlZmZDb2wgPT0gMCkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgCi0gICAgLy8g
SWYgd2UgaGl0IGEgY29sc3BhbiBiYWNrIHVwIHRvIGEgcmVhbCBjZWxsLgotICAgIFJlbmRlclRh
YmxlU2VjdGlvbjo6Q2VsbFN0cnVjdCBwcmV2Q2VsbDsKLSAgICBkbyB7Ci0gICAgICAgIHByZXZD
ZWxsID0gc2VjdGlvbi0+Y2VsbEF0KGNlbGwtPnJvdygpLCBlZmZDb2wtMSk7Ci0gICAgICAgIGVm
ZkNvbC0tOwotICAgIH0gd2hpbGUgKCFwcmV2Q2VsbC5jZWxsICYmIHByZXZDZWxsLmluQ29sU3Bh
biAmJiBlZmZDb2wgPj0wKTsKLSAgICByZXR1cm4gcHJldkNlbGwuY2VsbDsKLX0KLQotUmVuZGVy
VGFibGVDZWxsKiBSZW5kZXJUYWJsZTo6Y2VsbFJpZ2h0KGNvbnN0IFJlbmRlclRhYmxlQ2VsbCog
Y2VsbCkgY29uc3QKLXsKLSAgICBpbnQgZWZmQ29sID0gY29sVG9FZmZDb2woY2VsbC0+Y29sKCkg
KyBjZWxsLT5jb2xTcGFuKCkpOwotICAgIGlmIChlZmZDb2wgPj0gbnVtRWZmQ29scygpKQotICAg
ICAgICByZXR1cm4gMDsKLSAgICByZXR1cm4gY2VsbC0+c2VjdGlvbigpLT5jZWxsQXQoY2VsbC0+
cm93KCksIGVmZkNvbCkuY2VsbDsKLX0KLQotUmVuZGVyQmxvY2sqIFJlbmRlclRhYmxlOjpmaXJz
dExpbmVCbG9jaygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgUmVuZGVyVGFi
bGU6OnVwZGF0ZUZpcnN0TGV0dGVyKCkKLXt9Ci0KLSNpZm5kZWYgTkRFQlVHCi12b2lkIFJlbmRl
clRhYmxlOjpkdW1wKFFUZXh0U3RyZWFtICpzdHJlYW0sIFFTdHJpbmcgaW5kKSBjb25zdAotewot
ICAgIGlmICh0Q2FwdGlvbikKLQkqc3RyZWFtIDw8ICIgdENhcHRpb24iOwotICAgIGlmIChoZWFk
KQotCSpzdHJlYW0gPDwgIiBoZWFkIjsKLSAgICBpZiAoZm9vdCkKLQkqc3RyZWFtIDw8ICIgZm9v
dCI7Ci0KLSAgICAqc3RyZWFtIDw8IGVuZGwgPDwgaW5kIDw8ICJjc3BhbnM6IjsKLSAgICBmb3Ig
KCB1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBjb2x1bW5zLnNpemUoKTsgaSsrICkKLQkqc3RyZWFt
IDw8ICIgIiA8PCBjb2x1bW5zW2ldLnNwYW47Ci0gICAgKnN0cmVhbSA8PCBlbmRsIDw8IGluZDsK
LQotICAgIFJlbmRlckJsb2NrOjpkdW1wKHN0cmVhbSxpbmQpOwotfQotI2VuZGlmCi0KLS8vIC0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tCi0KLVJlbmRlclRhYmxlU2VjdGlvbjo6UmVuZGVyVGFibGVTZWN0aW9u
KERPTTo6Tm9kZUltcGwqIG5vZGUpCi0gICAgOiBSZW5kZXJDb250YWluZXIobm9kZSkKLXsKLSAg
ICAvLyBpbml0IFJlbmRlck9iamVjdCBhdHRyaWJ1dGVzCi0gICAgc2V0SW5saW5lKGZhbHNlKTsg
ICAvLyBvdXIgb2JqZWN0IGlzIG5vdCBJbmxpbmUKLSAgICBncmlkUm93cyA9IDA7Ci0gICAgY0Nv
bCA9IDA7Ci0gICAgY1JvdyA9IC0xOwotICAgIG5lZWRDZWxsUmVjYWxjID0gZmFsc2U7Ci19Ci0K
LVJlbmRlclRhYmxlU2VjdGlvbjo6flJlbmRlclRhYmxlU2VjdGlvbigpCi17Ci0gICAgY2xlYXJH
cmlkKCk7Ci19Ci0KLXZvaWQgUmVuZGVyVGFibGVTZWN0aW9uOjpkZXN0cm95KCkKLXsKLSAgICAv
LyByZWNhbGMgY2VsbCBpbmZvIGJlY2F1c2UgUmVuZGVyVGFibGUgaGFzIHVuZ3VhcmRlZCBwb2lu
dGVycwotICAgIC8vIHN0b3JlZCB0aGF0IHBvaW50IHRvIHRoaXMgUmVuZGVyVGFibGVTZWN0aW9u
LgotICAgIGlmICh0YWJsZSgpKQotICAgICAgICB0YWJsZSgpLT5zZXROZWVkU2VjdGlvblJlY2Fs
YygpOwotCi0gICAgUmVuZGVyQ29udGFpbmVyOjpkZXN0cm95KCk7Ci19Ci0KLXZvaWQgUmVuZGVy
VGFibGVTZWN0aW9uOjpzZXRTdHlsZShSZW5kZXJTdHlsZSogX3N0eWxlKQotewotICAgIC8vIHdl
IGRvbid0IGFsbG93IGNoYW5naW5nIHRoaXMgb25lCi0gICAgaWYgKHN0eWxlKCkpCi0gICAgICAg
IF9zdHlsZS0+c2V0RGlzcGxheShzdHlsZSgpLT5kaXNwbGF5KCkpOwotICAgIGVsc2UgaWYgKF9z
dHlsZS0+ZGlzcGxheSgpICE9IFRBQkxFX0ZPT1RFUl9HUk9VUCAmJiBfc3R5bGUtPmRpc3BsYXko
KSAhPSBUQUJMRV9IRUFERVJfR1JPVVApCi0gICAgICAgIF9zdHlsZS0+c2V0RGlzcGxheShUQUJM
RV9ST1dfR1JPVVApOwotCi0gICAgUmVuZGVyQ29udGFpbmVyOjpzZXRTdHlsZShfc3R5bGUpOwot
fQotCi12b2lkIFJlbmRlclRhYmxlU2VjdGlvbjo6YWRkQ2hpbGQoUmVuZGVyT2JqZWN0ICpjaGls
ZCwgUmVuZGVyT2JqZWN0ICpiZWZvcmVDaGlsZCkKLXsKLSAgICBSZW5kZXJPYmplY3QgKnJvdyA9
IGNoaWxkOwotCi0gICAgaWYgKGNoaWxkLT5lbGVtZW50KCkgJiYgY2hpbGQtPmVsZW1lbnQoKS0+
aGFzVGFnTmFtZShmb3JtVGFnKSkgewotICAgICAgICBSZW5kZXJDb250YWluZXI6OmFkZENoaWxk
KGNoaWxkLGJlZm9yZUNoaWxkKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAKLSAgICBp
ZiAoIWNoaWxkLT5pc1RhYmxlUm93KCkpIHsKLQotICAgICAgICBpZiAoIWJlZm9yZUNoaWxkKQot
ICAgICAgICAgICAgYmVmb3JlQ2hpbGQgPSBsYXN0Q2hpbGQoKTsKLQotICAgICAgICBpZiAoYmVm
b3JlQ2hpbGQgJiYgYmVmb3JlQ2hpbGQtPmlzQW5vbnltb3VzKCkpCi0gICAgICAgICAgICByb3cg
PSBiZWZvcmVDaGlsZDsKLSAgICAgICAgZWxzZSB7Ci0JICAgIFJlbmRlck9iamVjdCAqbGFzdEJv
eCA9IGJlZm9yZUNoaWxkOwotCSAgICB3aGlsZSAobGFzdEJveCAmJiBsYXN0Qm94LT5wYXJlbnQo
KS0+aXNBbm9ueW1vdXMoKSAmJiAhbGFzdEJveC0+aXNUYWJsZVJvdygpKQotCQlsYXN0Qm94ID0g
bGFzdEJveC0+cGFyZW50KCk7Ci0JICAgIGlmIChsYXN0Qm94ICYmIGxhc3RCb3gtPmlzQW5vbnlt
b3VzKCkpIHsKLQkJbGFzdEJveC0+YWRkQ2hpbGQoIGNoaWxkLCBiZWZvcmVDaGlsZCApOwotCQly
ZXR1cm47Ci0JICAgIH0gZWxzZSB7Ci0JCXJvdyA9IG5ldyAocmVuZGVyQXJlbmEoKSkgUmVuZGVy
VGFibGVSb3coZG9jdW1lbnQoKSAvKiBhbm9ueW1vdXMgdGFibGUgKi8pOwotCQlSZW5kZXJTdHls
ZSAqbmV3U3R5bGUgPSBuZXcgKHJlbmRlckFyZW5hKCkpIFJlbmRlclN0eWxlKCk7Ci0JCW5ld1N0
eWxlLT5pbmhlcml0RnJvbShzdHlsZSgpKTsKLQkJbmV3U3R5bGUtPnNldERpc3BsYXkoVEFCTEVf
Uk9XKTsKLQkJcm93LT5zZXRTdHlsZShuZXdTdHlsZSk7Ci0JCWFkZENoaWxkKHJvdywgYmVmb3Jl
Q2hpbGQpOwotCSAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcm93LT5hZGRDaGlsZChjaGlsZCk7
Ci0gICAgICAgIGNoaWxkLT5zZXROZWVkc0xheW91dEFuZE1pbk1heFJlY2FsYygpOwotICAgICAg
ICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGJlZm9yZUNoaWxkKQotCXNldE5lZWRDZWxsUmVj
YWxjKCk7Ci0KLSAgICBjUm93Kys7Ci0gICAgY0NvbCA9IDA7Ci0KLSAgICBlbnN1cmVSb3dzKGNS
b3crMSk7Ci0KLSAgICBpZiAoIWJlZm9yZUNoaWxkKSB7Ci0gICAgICAgIGdyaWRbY1Jvd10uaGVp
Z2h0ID0gY2hpbGQtPnN0eWxlKCktPmhlaWdodCgpOwotICAgICAgICBpZiAoZ3JpZFtjUm93XS5o
ZWlnaHQudHlwZSA9PSBSZWxhdGl2ZSkKLSAgICAgICAgICAgIGdyaWRbY1Jvd10uaGVpZ2h0ID0g
TGVuZ3RoKCk7Ci0gICAgfQotCi0KLSAgICBSZW5kZXJDb250YWluZXI6OmFkZENoaWxkKGNoaWxk
LGJlZm9yZUNoaWxkKTsKLX0KLQotYm9vbCBSZW5kZXJUYWJsZVNlY3Rpb246OmVuc3VyZVJvd3Mo
aW50IG51bVJvd3MpCi17Ci0gICAgaW50IG5Sb3dzID0gZ3JpZFJvd3M7Ci0gICAgaWYgKG51bVJv
d3MgPiBuUm93cykgewotICAgICAgICBpZiAobnVtUm93cyA+IHN0YXRpY19jYXN0PGludD4oZ3Jp
ZC5zaXplKCkpKQotICAgICAgICAgICAgaWYgKCFncmlkLnJlc2l6ZShudW1Sb3dzKjIrMSkpCi0g
ICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIGdyaWRSb3dzID0gbnVtUm93
czsKLSAgICAgICAgaW50IG5Db2xzID0gdGFibGUoKS0+bnVtRWZmQ29scygpOwotICAgICAgICBD
ZWxsU3RydWN0IGVtcHR5Q2VsbFN0cnVjdDsKLSAgICAgICAgZW1wdHlDZWxsU3RydWN0LmNlbGwg
PSAwOwotICAgICAgICBlbXB0eUNlbGxTdHJ1Y3QuaW5Db2xTcGFuID0gZmFsc2U7Ci0JZm9yIChp
bnQgciA9IG5Sb3dzOyByIDwgbnVtUm93czsgcisrKSB7Ci0JICAgIGdyaWRbcl0ucm93ID0gbmV3
IFJvdyhuQ29scyk7Ci0JICAgIGdyaWRbcl0ucm93LT5maWxsKGVtcHR5Q2VsbFN0cnVjdCk7Ci0J
ICAgIGdyaWRbcl0uYmFzZUxpbmUgPSAwOwotCSAgICBncmlkW3JdLmhlaWdodCA9IExlbmd0aCgp
OwotCX0KLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBSZW5kZXJUYWJsZVNl
Y3Rpb246OmFkZENlbGwoUmVuZGVyVGFibGVDZWxsICpjZWxsKQotewotICAgIGludCByU3BhbiA9
IGNlbGwtPnJvd1NwYW4oKTsKLSAgICBpbnQgY1NwYW4gPSBjZWxsLT5jb2xTcGFuKCk7Ci0gICAg
QXJyYXk8UmVuZGVyVGFibGU6OkNvbHVtblN0cnVjdD4gJmNvbHVtbnMgPSB0YWJsZSgpLT5jb2x1
bW5zOwotICAgIGludCBuQ29scyA9IGNvbHVtbnMuc2l6ZSgpOwotCi0gICAgLy8gIyMjIG1vemls
bGEgc3RpbGwgc2VlbXMgdG8gZG8gdGhlIG9sZCBIVE1MIHdheSwgZXZlbiBmb3Igc3RyaWN0IERU
RAotICAgIC8vIChzZWUgdGhlIGFubm90YXRpb24gb24gdGFibGUgY2VsbCBsYXlvdXRpbmcgaW4g
dGhlIENTUyBzcGVjcyBhbmQgdGhlIHRlc3RjYXNlIGJlbG93OgotICAgIC8vIDxUQUJMRSBib3Jk
ZXI+Ci0gICAgLy8gPFRSPjxURD4xIDxURCByb3dzcGFuPSIyIj4yIDxURD4zIDxURD40Ci0gICAg
Ly8gPFRSPjxURCBjb2xzcGFuPSIyIj41Ci0gICAgLy8gPC9UQUJMRT4KLQotICAgIHdoaWxlIChj
Q29sIDwgbkNvbHMgJiYgKGNlbGxBdChjUm93LCBjQ29sKS5jZWxsIHx8IGNlbGxBdChjUm93LCBj
Q29sKS5pbkNvbFNwYW4pKQotCWNDb2wrKzsKLQotICAgIGlmIChyU3BhbiA9PSAxKSB7Ci0JLy8g
d2UgaWdub3JlIGhlaWdodCBzZXR0aW5ncyBvbiByb3dzcGFuIGNlbGxzCi0JTGVuZ3RoIGhlaWdo
dCA9IGNlbGwtPnN0eWxlKCktPmhlaWdodCgpOwotCWlmIChoZWlnaHQudmFsdWUgPiAwIHx8ICho
ZWlnaHQudHlwZSA9PSBSZWxhdGl2ZSAmJiBoZWlnaHQudmFsdWUgPj0gMCkpIHsKLQkgICAgTGVu
Z3RoIGNSb3dIZWlnaHQgPSBncmlkW2NSb3ddLmhlaWdodDsKLQkgICAgc3dpdGNoIChoZWlnaHQu
dHlwZSkgewotICAgICAgICAgICAgICAgIGNhc2UgUGVyY2VudDoKLSAgICAgICAgICAgICAgICAg
ICAgaWYgKCEoY1Jvd0hlaWdodC50eXBlID09IFBlcmNlbnQpIHx8Ci0gICAgICAgICAgICAgICAg
ICAgICAgICAoY1Jvd0hlaWdodC50eXBlID09IFBlcmNlbnQgJiYgY1Jvd0hlaWdodC52YWx1ZSA8
IGhlaWdodC52YWx1ZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBncmlkW2NSb3ddLmhlaWdo
dCA9IGhlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAg
ICAgIGNhc2UgRml4ZWQ6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjUm93SGVpZ2h0LnR5cGUg
PCBQZXJjZW50IHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAoY1Jvd0hlaWdodC50eXBlID09
IEZpeGVkICYmIGNSb3dIZWlnaHQudmFsdWUgPCBoZWlnaHQudmFsdWUpKQotICAgICAgICAgICAg
ICAgICAgICAgICAgZ3JpZFtjUm93XS5oZWlnaHQgPSBoZWlnaHQ7Ci0gICAgICAgICAgICAgICAg
ICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgUmVsYXRpdmU6Ci0gICAgICAgICAgICAg
ICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAg
fQotCi0gICAgLy8gbWFrZSBzdXJlIHdlIGhhdmUgZW5vdWdoIHJvd3MKLSAgICBpZiAoIWVuc3Vy
ZVJvd3MoY1JvdyArIHJTcGFuKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaW50IGNvbCA9IGND
b2w7Ci0gICAgLy8gdGVsbCB0aGUgY2VsbCB3aGVyZSBpdCBpcwotICAgIENlbGxTdHJ1Y3QgY3Vy
cmVudENlbGw7Ci0gICAgY3VycmVudENlbGwuY2VsbCA9IGNlbGw7Ci0gICAgY3VycmVudENlbGwu
aW5Db2xTcGFuID0gZmFsc2U7Ci0gICAgd2hpbGUgKGNTcGFuKSB7Ci0JaW50IGN1cnJlbnRTcGFu
OwotCWlmIChjQ29sID49IG5Db2xzKSB7Ci0JICAgIHRhYmxlKCktPmFwcGVuZENvbHVtbihjU3Bh
bik7Ci0JICAgIGN1cnJlbnRTcGFuID0gY1NwYW47Ci0JfSBlbHNlIHsKLQkgICAgaWYgKGNTcGFu
IDwgY29sdW1uc1tjQ29sXS5zcGFuKQotCQl0YWJsZSgpLT5zcGxpdENvbHVtbihjQ29sLCBjU3Bh
bik7Ci0JICAgIGN1cnJlbnRTcGFuID0gY29sdW1uc1tjQ29sXS5zcGFuOwotCX0KLQotCWZvciAo
aW50IHIgPSAwOyByIDwgclNwYW47IHIrKykgewotICAgICAgICAgICAgQ2VsbFN0cnVjdCYgYyA9
IGNlbGxBdChjUm93ICsgciwgY0NvbCk7Ci0gICAgICAgICAgICBpZiAoY3VycmVudENlbGwuY2Vs
bCAmJiAhYy5jZWxsKQotICAgICAgICAgICAgICAgIGMuY2VsbCA9IGN1cnJlbnRDZWxsLmNlbGw7
Ci0gICAgICAgICAgICBpZiAoY3VycmVudENlbGwuaW5Db2xTcGFuKQotICAgICAgICAgICAgICAg
IGMuaW5Db2xTcGFuID0gdHJ1ZTsKLQl9Ci0JY0NvbCsrOwotCWNTcGFuIC09IGN1cnJlbnRTcGFu
OwotICAgICAgICBjdXJyZW50Q2VsbC5jZWxsID0gMDsKLQljdXJyZW50Q2VsbC5pbkNvbFNwYW4g
PSB0cnVlOwotICAgIH0KLSAgICBpZiAoY2VsbCkgewotCWNlbGwtPnNldFJvdyhjUm93KTsKLQlj
ZWxsLT5zZXRDb2wodGFibGUoKS0+ZWZmQ29sVG9Db2woY29sKSk7Ci0gICAgfQotfQotCi0KLQot
dm9pZCBSZW5kZXJUYWJsZVNlY3Rpb246OnNldENlbGxXaWR0aHMoKQotewotICAgIEFycmF5PGlu
dD4gJmNvbHVtblBvcyA9IHRhYmxlKCktPmNvbHVtblBvczsKLQotICAgIGludCByb3dzID0gZ3Jp
ZFJvd3M7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCByb3dzOyBpKyspIHsKLQlSb3cgJnJvdyA9
ICpncmlkW2ldLnJvdzsKLQlpbnQgY29scyA9IHJvdy5zaXplKCk7Ci0JZm9yIChpbnQgaiA9IDA7
IGogPCBjb2xzOyBqKyspIHsKLQkgICAgQ2VsbFN0cnVjdCBjdXJyZW50ID0gcm93W2pdOwotICAg
ICAgICAgICAgUmVuZGVyVGFibGVDZWxsICpjZWxsID0gY3VycmVudC5jZWxsOwotCi0JICAgIGlm
ICghY2VsbCkKLQkJY29udGludWU7Ci0JICAgIGludCBlbmRDb2wgPSBqOwotCSAgICBpbnQgY3Nw
YW4gPSBjZWxsLT5jb2xTcGFuKCk7Ci0JICAgIHdoaWxlIChjc3BhbiAmJiBlbmRDb2wgPCBjb2xz
KSB7Ci0JCWNzcGFuIC09IHRhYmxlKCktPmNvbHVtbnNbZW5kQ29sXS5zcGFuOwotCQllbmRDb2wr
KzsKLQkgICAgfQotCSAgICBpbnQgdyA9IGNvbHVtblBvc1tlbmRDb2xdIC0gY29sdW1uUG9zW2pd
IC0gdGFibGUoKS0+aEJvcmRlclNwYWNpbmcoKTsKLQkgICAgaW50IG9sZFdpZHRoID0gY2VsbC0+
d2lkdGgoKTsKLQkgICAgaWYgKHcgIT0gb2xkV2lkdGgpIHsKLQkJY2VsbC0+c2V0TmVlZHNMYXlv
dXQodHJ1ZSk7Ci0JCWNlbGwtPnNldFdpZHRoKHcpOwotCSAgICB9Ci0JfQotICAgIH0KLX0KLQot
Ci12b2lkIFJlbmRlclRhYmxlU2VjdGlvbjo6Y2FsY1Jvd0hlaWdodCgpCi17Ci0gICAgaW50IGlu
ZHg7Ci0gICAgUmVuZGVyVGFibGVDZWxsICpjZWxsOwotCi0gICAgaW50IHRvdGFsUm93cyA9IGdy
aWRSb3dzOwotICAgIGludCBzcGFjaW5nID0gdGFibGUoKS0+dkJvcmRlclNwYWNpbmcoKTsKLQot
ICAgIHJvd1Bvcy5yZXNpemUodG90YWxSb3dzICsgMSk7Ci0gICAgcm93UG9zWzBdID0gc3BhY2lu
ZzsKLQotICAgIGZvciAoaW50IHIgPSAwOyByIDwgdG90YWxSb3dzOyByKyspIHsKLQlyb3dQb3Nb
ciArIDFdID0gMDsKLQotCWludCBiYXNlbGluZSA9IDA7Ci0JaW50IGJkZXNjID0gMDsKLQlpbnQg
Y2ggPSBncmlkW3JdLmhlaWdodC5taW5XaWR0aCgwKTsKLQlpbnQgcG9zID0gcm93UG9zW3IgKyAx
XSArIGNoICsgc3BhY2luZzsKLQotCWlmIChwb3MgPiByb3dQb3NbciArIDFdKQotCSAgICByb3dQ
b3NbciArIDFdID0gcG9zOwotCi0JUm93ICpyb3cgPSBncmlkW3JdLnJvdzsKLQlpbnQgdG90YWxD
b2xzID0gcm93LT5zaXplKCk7Ci0JaW50IHRvdGFsUm93cyA9IGdyaWRSb3dzOwotCi0JZm9yIChp
bnQgYyA9IDA7IGMgPCB0b3RhbENvbHM7IGMrKykgewotCSAgICBDZWxsU3RydWN0IGN1cnJlbnQg
PSBjZWxsQXQociwgYyk7Ci0gICAgICAgICAgICBjZWxsID0gY3VycmVudC5jZWxsOwotCSAgICBp
ZiAoIWNlbGwgfHwgY3VycmVudC5pbkNvbFNwYW4pCi0JCWNvbnRpbnVlOwotCSAgICBpZiAociA8
IHRvdGFsUm93cyAtIDEgJiYgY2VsbEF0KHIgKyAxLCBjKS5jZWxsID09IGNlbGwpCi0JCWNvbnRp
bnVlOwotCi0JICAgIGlmICgoaW5keCA9IHIgLSBjZWxsLT5yb3dTcGFuKCkgKyAxKSA8IDApCi0J
CWluZHggPSAwOwotCi0gICAgICAgICAgICBpZiAoY2VsbC0+b3ZlcnJpZGVTaXplKCkgIT0gLTEp
IHsKLSAgICAgICAgICAgICAgICBjZWxsLT5zZXRPdmVycmlkZVNpemUoLTEpOwotICAgICAgICAg
ICAgICAgIGNlbGwtPnNldENoaWxkTmVlZHNMYXlvdXQodHJ1ZSwgZmFsc2UpOwotICAgICAgICAg
ICAgICAgIGNlbGwtPmxheW91dElmTmVlZGVkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAg
ICAKLSAgICAgICAgICAgIC8vIEV4cGxpY2l0IGhlaWdodHMgdXNlIHRoZSBib3JkZXIgYm94IGlu
IHF1aXJrcyBtb2RlLiAgSW4gc3RyaWN0IG1vZGUgZG8gdGhlIHJpZ2h0Ci0gICAgICAgICAgICAv
LyB0aGluZyBhbmQgYWN0dWFsbHkgYWRkIGluIHRoZSBib3JkZXIgYW5kIHBhZGRpbmcuCi0JICAg
IGNoID0gY2VsbC0+c3R5bGUoKS0+aGVpZ2h0KCkud2lkdGgoMCkgKyAKLSAgICAgICAgICAgICAg
ICAoY2VsbC0+c3R5bGUoKS0+aHRtbEhhY2tzKCkgPyAwIDogKGNlbGwtPnBhZGRpbmdUb3AoKSAr
IGNlbGwtPnBhZGRpbmdCb3R0b20oKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBjZWxsLT5ib3JkZXJUb3AoKSArIGNlbGwtPmJvcmRlckJvdHRv
bSgpKSk7Ci0JICAgIGlmIChjZWxsLT5oZWlnaHQoKSA+IGNoKQotCQljaCA9IGNlbGwtPmhlaWdo
dCgpOwotCi0gICAgICAgICAgICBwb3MgPSByb3dQb3NbIGluZHggXSArIGNoICsgc3BhY2luZzsK
LQotCSAgICBpZiAocG9zID4gcm93UG9zW3IgKyAxXSkKLQkJcm93UG9zW3IgKyAxXSA9IHBvczsK
LQotCSAgICAvLyBmaW5kIG91dCB0aGUgYmFzZWxpbmUKLQkgICAgRVZlcnRpY2FsQWxpZ24gdmEg
PSBjZWxsLT5zdHlsZSgpLT52ZXJ0aWNhbEFsaWduKCk7Ci0JICAgIGlmICh2YSA9PSBCQVNFTElO
RSB8fCB2YSA9PSBURVhUX0JPVFRPTSB8fCB2YSA9PSBURVhUX1RPUAotCQl8fCB2YSA9PSBTVVBF
UiB8fCB2YSA9PSBTVUIpIHsKLQkJaW50IGIgPSBjZWxsLT5iYXNlbGluZVBvc2l0aW9uKCk7Ci0g
ICAgICAgICAgICAgICAgaWYgKGIgPiBjZWxsLT5ib3JkZXJUb3AoKSArIGNlbGwtPnBhZGRpbmdU
b3AoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoYiA+IGJhc2VsaW5lKQotICAgICAgICAg
ICAgICAgICAgICAgICAgYmFzZWxpbmUgPSBiOwotCi0gICAgICAgICAgICAgICAgICAgIGludCB0
ZCA9IHJvd1Bvc1tpbmR4XSArIGNoIC0gYjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRkID4g
YmRlc2MpCi0gICAgICAgICAgICAgICAgICAgICAgICBiZGVzYyA9IHRkOwotICAgICAgICAgICAg
ICAgIH0KLQkgICAgfQotCX0KLQotCS8vZG8gd2UgaGF2ZSBiYXNlbGluZSBhbGlnbmVkIGVsZW1l
bnRzPwotCWlmIChiYXNlbGluZSkgewotCSAgICAvLyBpbmNyZWFzZSByb3doZWlnaHQgaWYgYmFz
ZWxpbmUgcmVxdWlyZXMKLQkgICAgaW50IGJSb3dQb3MgPSBiYXNlbGluZSArIGJkZXNjICArIHNw
YWNpbmcgOyAvLyArIDIqcGFkZGluZwotCSAgICBpZiAocm93UG9zW3IgKyAxXSA8IGJSb3dQb3Mp
Ci0JCXJvd1Bvc1tyICsgMV0gPSBiUm93UG9zOwotCi0JICAgIGdyaWRbcl0uYmFzZUxpbmUgPSBi
YXNlbGluZTsKLQl9Ci0KLQlpZiAocm93UG9zW3IgKyAxXSA8IHJvd1Bvc1tyXSkKLQkgICAgcm93
UG9zW3IgKyAxXSA9IHJvd1Bvc1tyXTsKLSAgICB9Ci19Ci0KLWludCBSZW5kZXJUYWJsZVNlY3Rp
b246OmxheW91dFJvd3MoaW50IHRvQWRkKQotewotICAgIGludCBySGVpZ2h0OwotICAgIGludCBy
aW5keDsKLSAgICBpbnQgdG90YWxSb3dzID0gZ3JpZFJvd3M7Ci0gICAgaW50IGhzcGFjaW5nID0g
dGFibGUoKS0+aEJvcmRlclNwYWNpbmcoKTsKLSAgICBpbnQgdnNwYWNpbmcgPSB0YWJsZSgpLT52
Qm9yZGVyU3BhY2luZygpOwotICAgIAotICAgIGlmICh0b0FkZCAmJiB0b3RhbFJvd3MgJiYgKHJv
d1Bvc1t0b3RhbFJvd3NdIHx8ICFuZXh0U2libGluZygpKSkgewotCi0JaW50IHRvdGFsSGVpZ2h0
ID0gcm93UG9zW3RvdGFsUm93c10gKyB0b0FkZDsKLQotICAgICAgICBpbnQgZGggPSB0b0FkZDsK
LQlpbnQgdG90YWxQZXJjZW50ID0gMDsKLQlpbnQgbnVtQXV0byA9IDA7Ci0JZm9yIChpbnQgciA9
IDA7IHIgPCB0b3RhbFJvd3M7IHIrKykgewotCSAgICBpZiAoZ3JpZFtyXS5oZWlnaHQudHlwZSA9
PSBBdXRvKQotCQludW1BdXRvKys7Ci0JICAgIGVsc2UgaWYgKGdyaWRbcl0uaGVpZ2h0LnR5cGUg
PT0gUGVyY2VudCkKLQkJdG90YWxQZXJjZW50ICs9IGdyaWRbcl0uaGVpZ2h0LnZhbHVlOwotCX0K
LQlpZiAodG90YWxQZXJjZW50KSB7Ci0JICAgIC8vIHRyeSB0byBzYXRpc2Z5IHBlcmNlbnQKLQkg
ICAgaW50IGFkZCA9IDA7Ci0JICAgIGlmICh0b3RhbFBlcmNlbnQgPiAxMDApCi0JCXRvdGFsUGVy
Y2VudCA9IDEwMDsKLQkgICAgaW50IHJoID0gcm93UG9zWzFdIC0gcm93UG9zWzBdOwotCSAgICBm
b3IgKGludCByID0gMDsgciA8IHRvdGFsUm93czsgcisrKSB7Ci0JCWlmICh0b3RhbFBlcmNlbnQg
PiAwICYmIGdyaWRbcl0uaGVpZ2h0LnR5cGUgPT0gUGVyY2VudCkgewotCQkgICAgaW50IHRvQWRk
ID0ga01pbihkaCwgKHRvdGFsSGVpZ2h0ICogZ3JpZFtyXS5oZWlnaHQudmFsdWUgLyAxMDApIC0g
cmgpOwotICAgICAgICAgICAgICAgICAgICAvLyBJZiB0b0FkZCBpcyBuZWdhdGl2ZSwgdGhlbiB3
ZSBkb24ndCB3YW50IHRvIHNocmluayB0aGUgcm93ICh0aGlzIGJ1ZwotICAgICAgICAgICAgICAg
ICAgICAvLyBhZmZlY3RlZCBPdXRsb29rIFdlYiBBY2Nlc3MpLgotICAgICAgICAgICAgICAgICAg
ICB0b0FkZCA9IGtNYXgoMCwgdG9BZGQpOwotCQkgICAgYWRkICs9IHRvQWRkOwotCQkgICAgZGgg
LT0gdG9BZGQ7Ci0JCSAgICB0b3RhbFBlcmNlbnQgLT0gZ3JpZFtyXS5oZWlnaHQudmFsdWU7Ci0J
CX0KLQkJaWYgKHIgPCB0b3RhbFJvd3MgLSAxKQotCQkgICAgcmggPSByb3dQb3NbciArIDJdIC0g
cm93UG9zW3IgKyAxXTsKLSAgICAgICAgICAgICAgICByb3dQb3NbciArIDFdICs9IGFkZDsKLQkg
ICAgfQotCX0KLQlpZiAobnVtQXV0bykgewotCSAgICAvLyBkaXN0cmlidXRlIG92ZXIgdmFyaWFi
bGUgY29scwotCSAgICBpbnQgYWRkID0gMDsKLQkgICAgZm9yIChpbnQgciA9IDA7IHIgPCB0b3Rh
bFJvd3M7IHIrKykgewotCQlpZiAobnVtQXV0byA+IDAgJiYgZ3JpZFtyXS5oZWlnaHQudHlwZSA9
PSBBdXRvKSB7Ci0JCSAgICBpbnQgdG9BZGQgPSBkaC9udW1BdXRvOwotCQkgICAgYWRkICs9IHRv
QWRkOwotCQkgICAgZGggLT0gdG9BZGQ7Ci0gICAgICAgICAgICAgICAgICAgIG51bUF1dG8tLTsK
LQkJfQotICAgICAgICAgICAgICAgIHJvd1Bvc1tyICsgMV0gKz0gYWRkOwotCSAgICB9Ci0JfQot
ICAgICAgICBpZiAoZGggPiAwICYmIHJvd1Bvc1t0b3RhbFJvd3NdKSB7Ci0JICAgIC8vIGlmIHNv
bWUgbGVmdCBvdmVycywgZGlzdHJpYnV0ZSBlcXVhbGx5LgotICAgICAgICAgICAgaW50IHRvdCA9
IHJvd1Bvc1t0b3RhbFJvd3NdOwotICAgICAgICAgICAgaW50IGFkZCA9IDA7Ci0gICAgICAgICAg
ICBpbnQgcHJldiA9IHJvd1Bvc1swXTsKLSAgICAgICAgICAgIGZvciAoaW50IHIgPSAwOyByIDwg
dG90YWxSb3dzOyByKyspIHsKLSAgICAgICAgICAgICAgICAvL3dlaWdodCB3aXRoIHRoZSBvcmln
aW5hbCBoZWlnaHQKLSAgICAgICAgICAgICAgICBhZGQgKz0gZGggKiAocm93UG9zW3IgKyAxXSAt
IHByZXYpIC8gdG90OwotICAgICAgICAgICAgICAgIHByZXYgPSByb3dQb3NbciArIDFdOwotICAg
ICAgICAgICAgICAgIHJvd1Bvc1tyICsgMV0gKz0gYWRkOwotICAgICAgICAgICAgfQotICAgICAg
ICB9Ci0gICAgfQotCi0gICAgaW50IGxlZnRPZmZzZXQgPSBoc3BhY2luZzsKLQotICAgIGludCBu
RWZmQ29scyA9IHRhYmxlKCktPm51bUVmZkNvbHMoKTsKLSAgICBmb3IgKGludCByID0gMDsgciA8
IHRvdGFsUm93czsgcisrKSB7Ci0JUm93ICpyb3cgPSBncmlkW3JdLnJvdzsKLQlpbnQgdG90YWxD
b2xzID0gcm93LT5zaXplKCk7Ci0gICAgICAgIGZvciAoaW50IGMgPSAwOyBjIDwgbkVmZkNvbHM7
IGMrKykgewotICAgICAgICAgICAgQ2VsbFN0cnVjdCBjdXJyZW50ID0gY2VsbEF0KHIsIGMpOwot
ICAgICAgICAgICAgUmVuZGVyVGFibGVDZWxsKiBjZWxsID0gY3VycmVudC5jZWxsOwotICAgICAg
ICAgICAgCi0gICAgICAgICAgICBpZiAoIWNlbGwpCi0gICAgICAgICAgICAgICAgY29udGludWU7
Ci0gICAgICAgICAgICBpZiAociA8IHRvdGFsUm93cyAtIDEgJiYgY2VsbCA9PSBjZWxsQXQociAr
IDEsIGMpLmNlbGwpCi0JCWNvbnRpbnVlOwotCi0gICAgICAgICAgICBpZiAoKHJpbmR4ID0gci1j
ZWxsLT5yb3dTcGFuKCkgKyAxKSA8IDApCi0gICAgICAgICAgICAgICAgcmluZHggPSAwOwotCi0g
ICAgICAgICAgICBySGVpZ2h0ID0gcm93UG9zW3IgKyAxXSAtIHJvd1Bvc1tyaW5keF0gLSB2c3Bh
Y2luZzsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gRm9yY2UgcGVyY2VudCBoZWlnaHQg
Y2hpbGRyZW4gdG8gbGF5IHRoZW1zZWx2ZXMgb3V0IGFnYWluLgotICAgICAgICAgICAgLy8gVGhp
cyB3aWxsIGNhdXNlIHRoZXNlIGNoaWxkcmVuIHRvIGdyb3cgdG8gZmlsbCB0aGUgY2VsbC4KLSAg
ICAgICAgICAgIC8vIEZJWE1FOiBUaGVyZSBpcyBzdGlsbCBtb3JlIHdvcmsgdG8gZG8gaGVyZSB0
byBmdWxseSBtYXRjaCBXaW5JRSAoc2hvdWxkCi0gICAgICAgICAgICAvLyBpdCBiZWNvbWUgbmVj
ZXNzYXJ5IHRvIGRvIHNvKS4gIEluIHF1aXJrcyBtb2RlLCBXaW5JRSBiZWhhdmVzIGxpa2Ugd2UK
LSAgICAgICAgICAgIC8vIGRvLCBidXQgaXQgd2lsbCBjbGlwIHRoZSBjZWxscyB0aGF0IHNwaWxs
IG91dCBvZiB0aGUgdGFibGUgc2VjdGlvbi4gIEluCi0gICAgICAgICAgICAvLyBzdHJpY3QgbW9k
ZSwgTW96aWxsYSBhbmQgV2luSUUgYm90aCByZWdyb3cgdGhlIHRhYmxlIHRvIGFjY29tbW9kYXRl
IHRoZQotICAgICAgICAgICAgLy8gbmV3IGhlaWdodCBvZiB0aGUgY2VsbCAodGh1cyBsZXR0aW5n
IHRoZSBwZXJjZW50YWdlcyBjYXVzZSBncm93dGggb25lCi0gICAgICAgICAgICAvLyB0aW1lIG9u
bHkpLiAgV2UgbWF5IGFsc28gbm90IGJlIGhhbmRsaW5nIHJvdy1zcGFubmluZyBjZWxscyBjb3Jy
ZWN0bHkuCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gTm90ZSBhbHNvIHRoZSBvZGRp
dHkgd2hlcmUgcmVwbGFjZWQgZWxlbWVudHMgYWx3YXlzIGZsZXgsIGFuZCB5ZXQgYmxvY2tzL3Rh
YmxlcyBkbwotICAgICAgICAgICAgLy8gbm90IG5lY2Vzc2FyaWx5IGZsZXguICBXaW5JRSBpcyBj
cmF6eSBhbmQgaW5jb25zaXN0ZW50LCBhbmQgd2UgY2FuJ3QgaG9wZSB0bwotICAgICAgICAgICAg
Ly8gbWF0Y2ggdGhlIGJlaGF2aW9yIHBlcmZlY3RseSwgYnV0IHdlJ2xsIGNvbnRpbnVlIHRvIHJl
ZmluZSBpdCBhcyB3ZSBkaXNjb3ZlciBuZXcKLSAgICAgICAgICAgIC8vIGJ1Z3MuIDopCi0gICAg
ICAgICAgICBib29sIGNlbGxDaGlsZHJlbkZsZXggPSBmYWxzZTsKLSAgICAgICAgICAgIGJvb2wg
ZmxleEFsbENoaWxkcmVuID0gY2VsbC0+c3R5bGUoKS0+aGVpZ2h0KCkuaXNGaXhlZCgpIHx8IAot
ICAgICAgICAgICAgICAgICghdGFibGUoKS0+c3R5bGUoKS0+aGVpZ2h0KCkuaXNBdXRvKCkgJiYg
ckhlaWdodCAhPSBjZWxsLT5oZWlnaHQoKSk7Ci0KLSAgICAgICAgICAgIGZvciAoUmVuZGVyT2Jq
ZWN0KiBvID0gY2VsbC0+Zmlyc3RDaGlsZCgpOyBvOyBvID0gby0+bmV4dFNpYmxpbmcoKSkgewot
ICAgICAgICAgICAgICAgIGlmICghby0+aXNUZXh0KCkgJiYgby0+c3R5bGUoKS0+aGVpZ2h0KCku
aXNQZXJjZW50KCkgJiYgKG8tPmlzUmVwbGFjZWQoKSB8fCBvLT5zY3JvbGxzT3ZlcmZsb3coKSB8
fCBmbGV4QWxsQ2hpbGRyZW4pKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRhYmxlcyB3aXRo
IG5vIHNlY3Rpb25zIGRvIG5vdCBmbGV4LgotICAgICAgICAgICAgICAgICAgICBpZiAoIW8tPmlz
VGFibGUoKSB8fCBzdGF0aWNfY2FzdDxSZW5kZXJUYWJsZSo+KG8pLT5oYXNTZWN0aW9ucygpKSB7
Ci0gICAgICAgICAgICAgICAgICAgICAgICBvLT5zZXROZWVkc0xheW91dCh0cnVlLCBmYWxzZSk7
Ci0gICAgICAgICAgICAgICAgICAgICAgICBjZWxsLT5zZXRDaGlsZE5lZWRzTGF5b3V0KHRydWUs
IGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxDaGlsZHJlbkZsZXggPSB0cnVl
OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAg
fQotICAgICAgICAgICAgaWYgKGNlbGxDaGlsZHJlbkZsZXgpIHsKLSAgICAgICAgICAgICAgICBj
ZWxsLT5zZXRPdmVycmlkZVNpemUoa01heCgwLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBySGVpZ2h0IC0gY2VsbC0+Ym9yZGVyVG9wKCkgLSBjZWxsLT5wYWRk
aW5nVG9wKCkgLSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgY2VsbC0+Ym9yZGVyQm90dG9tKCkgLSBjZWxsLT5wYWRkaW5nQm90dG9tKCkpKTsK
LSAgICAgICAgICAgICAgICBjZWxsLT5sYXlvdXRJZk5lZWRlZCgpOwotCi0gICAgICAgICAgICAg
ICAgLy8gQWxpZ25tZW50IHdpdGhpbiBhIGNlbGwgaXMgYmFzZWQgb2ZmIHRoZSBjYWxjdWxhdGVk
Ci0gICAgICAgICAgICAgICAgLy8gaGVpZ2h0LCB3aGljaCBiZWNvbWVzIGlycmVsZXZhbnQgb25j
ZSB0aGUgY2VsbCBoYXMKLSAgICAgICAgICAgICAgICAvLyBiZWVuIHJlc2l6ZWQgYmFzZWQgb2Zm
IGl0cyBwZXJjZW50YWdlLiAtZHdoCi0gICAgICAgICAgICAgICAgY2VsbC0+c2V0Q2VsbFRvcEV4
dHJhKDApOwotICAgICAgICAgICAgICAgIGNlbGwtPnNldENlbGxCb3R0b21FeHRyYSgwKTsKLSAg
ICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIEVWZXJ0aWNh
bEFsaWduIHZhID0gY2VsbC0+c3R5bGUoKS0+dmVydGljYWxBbGlnbigpOwotICAgICAgICAgICAg
ICAgIGludCB0ZSA9IDA7Ci0gICAgICAgICAgICAgICAgc3dpdGNoICh2YSkgewotICAgICAgICAg
ICAgICAgICAgICBjYXNlIFNVQjoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTVVBFUjoKLSAg
ICAgICAgICAgICAgICAgICAgY2FzZSBURVhUX1RPUDoKLSAgICAgICAgICAgICAgICAgICAgY2Fz
ZSBURVhUX0JPVFRPTToKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBCQVNFTElORToKLSAgICAg
ICAgICAgICAgICAgICAgICAgIHRlID0gZ2V0QmFzZWxpbmUocikgLSBjZWxsLT5iYXNlbGluZVBv
c2l0aW9uKCkgOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAg
ICAgICAgIGNhc2UgVE9QOgotICAgICAgICAgICAgICAgICAgICAgICAgdGUgPSAwOwotICAgICAg
ICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTUlERExF
OgotICAgICAgICAgICAgICAgICAgICAgICAgdGUgPSAockhlaWdodCAtIGNlbGwtPmhlaWdodCgp
KS8yOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAg
IGNhc2UgQk9UVE9NOgotICAgICAgICAgICAgICAgICAgICAgICAgdGUgPSBySGVpZ2h0IC0gY2Vs
bC0+aGVpZ2h0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAg
ICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBjZWxsLT5zZXRD
ZWxsVG9wRXh0cmEodGUpOwotICAgICAgICAgICAgICAgIGNlbGwtPnNldENlbGxCb3R0b21FeHRy
YShySGVpZ2h0IC0gY2VsbC0+aGVpZ2h0KCkgLSB0ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAg
ICAgICAKLSAgICAgICAgICAgIGludCBvbGRDZWxsWCA9IGNlbGwtPnhQb3MoKTsKLSAgICAgICAg
ICAgIGludCBvbGRDZWxsWSA9IGNlbGwtPnlQb3MoKTsKLSAgICAgICAgCi0gICAgICAgICAgICBp
ZiAoc3R5bGUoKS0+ZGlyZWN0aW9uKCkgPT0gUlRMKSB7Ci0gICAgICAgICAgICAgICAgY2VsbC0+
c2V0UG9zKAotCQkgICAgdGFibGUoKS0+Y29sdW1uUG9zWyhpbnQpdG90YWxDb2xzXSAtCi0JCSAg
ICB0YWJsZSgpLT5jb2x1bW5Qb3NbdGFibGUoKS0+Y29sVG9FZmZDb2woY2VsbC0+Y29sKCkrY2Vs
bC0+Y29sU3BhbigpKV0gKwotCQkgICAgbGVmdE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAg
cm93UG9zW3JpbmR4XSk7Ci0gICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICBjZWxs
LT5zZXRQb3ModGFibGUoKS0+Y29sdW1uUG9zW2NdICsgbGVmdE9mZnNldCwgcm93UG9zW3JpbmR4
XSk7Ci0KLSAgICAgICAgICAgIC8vIElmIHRoZSBjZWxsIG1vdmVkLCB3ZSBoYXZlIHRvIHJlcGFp
bnQgaXQgYXMgd2VsbCBhcyBhbnkgZmxvYXRpbmcvcG9zaXRpb25lZAotICAgICAgICAgICAgLy8g
ZGVzY2VuZGFudHMuICBBbiBleGNlcHRpb24gaXMgaWYgd2UgbmVlZCBhIGxheW91dC4gIEluIHRo
aXMgY2FzZSwgd2Uga25vdyB3ZSdyZSBnb2luZyB0bwotICAgICAgICAgICAgLy8gcmVwYWludCBv
dXJzZWx2ZXMgKGFuZCB0aGUgY2VsbCkgYW55d2F5LgotICAgICAgICAgICAgaWYgKCF0YWJsZSgp
LT5zZWxmTmVlZHNMYXlvdXQoKSAmJiBjZWxsLT5jaGVja0ZvclJlcGFpbnREdXJpbmdMYXlvdXQo
KSkKLSAgICAgICAgICAgICAgICBjZWxsLT5yZXBhaW50RHVyaW5nTGF5b3V0SWZNb3ZlZChvbGRD
ZWxsWCwgb2xkQ2VsbFkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgbV9oZWlnaHQgPSByb3dQ
b3NbdG90YWxSb3dzXTsKLSAgICByZXR1cm4gbV9oZWlnaHQ7Ci19Ci0KLQotdm9pZCBSZW5kZXJU
YWJsZVNlY3Rpb246OnBhaW50KFBhaW50SW5mbyYgaSwgaW50IHR4LCBpbnQgdHkpCi17Ci0gICAg
dW5zaWduZWQgaW50IHRvdGFsUm93cyA9IGdyaWRSb3dzOwotICAgIHVuc2lnbmVkIGludCB0b3Rh
bENvbHMgPSB0YWJsZSgpLT5jb2x1bW5zLnNpemUoKTsKLQotICAgIHR4ICs9IG1feDsKLSAgICB0
eSArPSBtX3k7Ci0KLSAgICAvLyBjaGVjayB3aGljaCByb3dzIGFuZCBjb2xzIGFyZSB2aXNpYmxl
IGFuZCBvbmx5IHBhaW50IHRoZXNlCi0gICAgLy8gIyMjIGZpeG1lOiBjb3VsZCB1c2UgYSBiaW5h
cnkgc2VhcmNoIGhlcmUKLSAgICBQYWludEFjdGlvbiBwYWludEFjdGlvbiA9IGkucGhhc2U7Ci0g
ICAgaW50IHggPSBpLnIueCgpOwotICAgIGludCB5ID0gaS5yLnkoKTsKLSAgICBpbnQgdyA9IGku
ci53aWR0aCgpOwotICAgIGludCBoID0gaS5yLmhlaWdodCgpOwotCi0gICAgaW50IG9zID0gMiAq
IG1heGltYWxPdXRsaW5lU2l6ZShwYWludEFjdGlvbik7Ci0gICAgdW5zaWduZWQgaW50IHN0YXJ0
cm93ID0gMDsKLSAgICB1bnNpZ25lZCBpbnQgZW5kcm93ID0gdG90YWxSb3dzOwotICAgIGZvciAo
OyBzdGFydHJvdyA8IHRvdGFsUm93czsgc3RhcnRyb3crKykKLQlpZiAodHkgKyByb3dQb3Nbc3Rh
cnRyb3crMV0gPj0geSAtIG9zKQotCSAgICBicmVhazsKLQotICAgIGZvciAoOyBlbmRyb3cgPiAw
OyBlbmRyb3ctLSkKLQlpZiAoIHR5ICsgcm93UG9zW2VuZHJvdy0xXSA8PSB5ICsgaCArIG9zKQot
ICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICB1bnNpZ25lZCBpbnQgc3RhcnRjb2wgPSAwOwotICAg
IHVuc2lnbmVkIGludCBlbmRjb2wgPSB0b3RhbENvbHM7Ci0gICAgaWYgKHN0eWxlKCktPmRpcmVj
dGlvbigpID09IExUUikgewotCWZvciAoOyBzdGFydGNvbCA8IHRvdGFsQ29sczsgc3RhcnRjb2wr
KykgewotCSAgICBpZiAodHggKyB0YWJsZSgpLT5jb2x1bW5Qb3Nbc3RhcnRjb2wgKyAxXSA+PSB4
IC0gb3MpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0JfQotCWZvciAoOyBlbmRjb2wgPiAwOyBl
bmRjb2wtLSkgewotCSAgICBpZiAodHggKyB0YWJsZSgpLT5jb2x1bW5Qb3NbZW5kY29sIC0gMV0g
PD0geCArIHcgKyBvcykKLQkJYnJlYWs7Ci0JfQotICAgIH0KLQotICAgIGlmIChzdGFydGNvbCA8
IGVuZGNvbCkgewotCS8vIGRyYXcgdGhlIGNlbGxzCi0JZm9yICh1bnNpZ25lZCBpbnQgciA9IHN0
YXJ0cm93OyByIDwgZW5kcm93OyByKyspIHsKLQkgICAgdW5zaWduZWQgaW50IGMgPSBzdGFydGNv
bDsKLQkgICAgLy8gc2luY2UgYSBjZWxsIGNhbiBiZSAtMSAoaW5kaWNhdGluZyBhIGNvbHNwYW4p
IHdlIG1pZ2h0IGhhdmUgdG8gc2VhcmNoIGJhY2t3YXJkcyB0byBpbmNsdWRlIGl0Ci0JICAgIHdo
aWxlIChjICYmIGNlbGxBdChyLCBjKS5pbkNvbFNwYW4pCi0JCWMtLTsKLQkgICAgZm9yICg7IGMg
PCBlbmRjb2w7IGMrKykgewotICAgICAgICAgICAgICAgIENlbGxTdHJ1Y3QgY3VycmVudCA9IGNl
bGxBdChyLCBjKTsKLSAgICAgICAgICAgICAgICBSZW5kZXJUYWJsZUNlbGwgKmNlbGwgPSBjdXJy
ZW50LmNlbGw7Ci0JCQotICAgICAgICAgICAgICAgIGlmICghY2VsbCB8fCAoY2VsbC0+bGF5ZXIo
KSAmJiBpLnBoYXNlICE9IFBhaW50QWN0aW9uQ29sbGFwc2VkVGFibGVCb3JkZXJzKSkgCi0JCSAg
ICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBDZWxscyBt
dXN0IGFsd2F5cyBwYWludCBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcHBlYXIgdGFraW5n
IGludG8gYWNjb3VudAotICAgICAgICAgICAgICAgIC8vIHRoZWlyIHVwcGVyIGxlZnQgb3JpZ2lu
YXRpbmcgcm93L2NvbHVtbi4gIEZvciBjZWxscyB3aXRoIHJvd3NwYW5zLCBhdm9pZCByZXBhaW50
aW5nCi0gICAgICAgICAgICAgICAgLy8gaWYgd2UndmUgYWxyZWFkeSBzZWVuIHRoZSBjZWxsLgot
CQlpZiAociA+IHN0YXJ0cm93ICYmIChjZWxsQXQoci0xLCBjKS5jZWxsID09IGNlbGwpKQotCQkg
ICAgY29udGludWU7Ci0KLQkJY2VsbC0+cGFpbnQoaSwgdHgsIHR5KTsKLQkgICAgfQotCX0KLSAg
ICB9Ci19Ci0KLXZvaWQgUmVuZGVyVGFibGVTZWN0aW9uOjpyZWNhbGNDZWxscygpCi17Ci0gICAg
Y0NvbCA9IDA7Ci0gICAgY1JvdyA9IC0xOwotICAgIGNsZWFyR3JpZCgpOwotICAgIGdyaWRSb3dz
ID0gMDsKLQotICAgIGZvciAoUmVuZGVyT2JqZWN0ICpyb3cgPSBmaXJzdENoaWxkKCk7IHJvdzsg
cm93ID0gcm93LT5uZXh0U2libGluZygpKSB7Ci0JY1JvdysrOwotCWNDb2wgPSAwOwotCWVuc3Vy
ZVJvd3MoY1JvdyArIDEpOwotCWZvciAoUmVuZGVyT2JqZWN0ICpjZWxsID0gcm93LT5maXJzdENo
aWxkKCk7IGNlbGw7IGNlbGwgPSBjZWxsLT5uZXh0U2libGluZygpKQotCSAgICBpZiAoY2VsbC0+
aXNUYWJsZUNlbGwoKSkKLQkJYWRkQ2VsbChzdGF0aWNfY2FzdDxSZW5kZXJUYWJsZUNlbGwgKj4o
Y2VsbCkpOwotICAgIH0KLSAgICBuZWVkQ2VsbFJlY2FsYyA9IGZhbHNlOwotICAgIHNldE5lZWRz
TGF5b3V0KHRydWUpOwotfQotCi12b2lkIFJlbmRlclRhYmxlU2VjdGlvbjo6Y2xlYXJHcmlkKCkK
LXsKLSAgICBpbnQgcm93cyA9IGdyaWRSb3dzOwotICAgIHdoaWxlIChyb3dzLS0pCi0JZGVsZXRl
IGdyaWRbcm93c10ucm93OwotfQotCi1SZW5kZXJPYmplY3QqIFJlbmRlclRhYmxlU2VjdGlvbjo6
cmVtb3ZlQ2hpbGROb2RlKFJlbmRlck9iamVjdCogY2hpbGQpCi17Ci0gICAgc2V0TmVlZENlbGxS
ZWNhbGMoKTsKLSAgICByZXR1cm4gUmVuZGVyQ29udGFpbmVyOjpyZW1vdmVDaGlsZE5vZGUoY2hp
bGQpOwotfQotCi0jaWZuZGVmIE5ERUJVRwotdm9pZCBSZW5kZXJUYWJsZVNlY3Rpb246OmR1bXAo
UVRleHRTdHJlYW0gKnN0cmVhbSwgUVN0cmluZyBpbmQpIGNvbnN0Ci17Ci0gICAgKnN0cmVhbSA8
PCBlbmRsIDw8IGluZCA8PCAiZ3JpZD0oIiA8PCBncmlkLnNpemUoKSA8PCAiLCIgPDwgdGFibGUo
KS0+bnVtRWZmQ29scygpIDw8ICIpIiA8PCBlbmRsIDw8IGluZDsKLSAgICBmb3IgKHVuc2lnbmVk
IGludCByID0gMDsgciA8IGdyaWQuc2l6ZSgpOyByKyspIHsKLQlmb3IgKGludCBjID0gMDsgYyA8
IHRhYmxlKCktPm51bUVmZkNvbHMoKTsgYysrKSB7Ci0JICAgIGlmIChjZWxsQXQoIHIsIGMpLmNl
bGwgJiYgIWNlbGxBdChyLCBjKS5pbkNvbFNwYW4pCi0JCSpzdHJlYW0gPDwgIigiIDw8IGNlbGxB
dChyLCBjKS5jZWxsLT5yb3coKSA8PCAiLCIgPDwgY2VsbEF0KHIsIGMpLmNlbGwtPmNvbCgpIDw8
ICIsIgotCQkJPDwgY2VsbEF0KHIsIGMpLmNlbGwtPnJvd1NwYW4oKSA8PCAiLCIgPDwgY2VsbEF0
KHIsIGMpLmNlbGwtPmNvbFNwYW4oKSA8PCAiKSAiOwotCSAgICBlbHNlCi0JCSpzdHJlYW0gPDwg
Y2VsbEF0KHIsIGMpLmNlbGwgPDwgIm51bGwgY2VsbCAiOwotCX0KLQkqc3RyZWFtIDw8IGVuZGwg
PDwgaW5kOwotICAgIH0KLSAgICBSZW5kZXJDb250YWluZXI6OmR1bXAoc3RyZWFtLGluZCk7Ci19
Ci0jZW5kaWYKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1SZW5kZXJUYWJsZVJvdzo6UmVuZGVy
VGFibGVSb3coRE9NOjpOb2RlSW1wbCogbm9kZSkKLSAgICA6IFJlbmRlckNvbnRhaW5lcihub2Rl
KQotewotICAgIC8vIGluaXQgUmVuZGVyT2JqZWN0IGF0dHJpYnV0ZXMKLSAgICBzZXRJbmxpbmUo
ZmFsc2UpOyAgIC8vIG91ciBvYmplY3QgaXMgbm90IElubGluZQotfQotCi12b2lkIFJlbmRlclRh
YmxlUm93OjpkZXN0cm95KCkKLXsKLSAgICBSZW5kZXJUYWJsZVNlY3Rpb24gKnMgPSBzZWN0aW9u
KCk7Ci0gICAgaWYgKHMpCi0gICAgICAgIHMtPnNldE5lZWRDZWxsUmVjYWxjKCk7Ci0gICAgCi0g
ICAgUmVuZGVyQ29udGFpbmVyOjpkZXN0cm95KCk7Ci19Ci0KLXZvaWQgUmVuZGVyVGFibGVSb3c6
OnNldFN0eWxlKFJlbmRlclN0eWxlKiBzdHlsZSkKLXsKLSAgICBzdHlsZS0+c2V0RGlzcGxheShU
QUJMRV9ST1cpOwotICAgIFJlbmRlckNvbnRhaW5lcjo6c2V0U3R5bGUoc3R5bGUpOwotfQotCi12
b2lkIFJlbmRlclRhYmxlUm93OjphZGRDaGlsZChSZW5kZXJPYmplY3QgKmNoaWxkLCBSZW5kZXJP
YmplY3QgKmJlZm9yZUNoaWxkKQotewotICAgIGlmIChjaGlsZC0+ZWxlbWVudCgpICYmIGNoaWxk
LT5lbGVtZW50KCktPmhhc1RhZ05hbWUoZm9ybVRhZykpIHsKLSAgICAgICAgUmVuZGVyQ29udGFp
bmVyOjphZGRDaGlsZChjaGlsZCxiZWZvcmVDaGlsZCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9
Ci0KLSAgICBSZW5kZXJUYWJsZUNlbGwgKmNlbGw7Ci0KLSAgICBpZiAoIWNoaWxkLT5pc1RhYmxl
Q2VsbCgpKSB7Ci0JUmVuZGVyT2JqZWN0ICpsYXN0ID0gYmVmb3JlQ2hpbGQ7Ci0gICAgICAgIGlm
ICghbGFzdCkKLSAgICAgICAgICAgIGxhc3QgPSBsYXN0Q2hpbGQoKTsKLSAgICAgICAgUmVuZGVy
VGFibGVDZWxsICpjZWxsID0gMDsKLSAgICAgICAgaWYgKGxhc3QgJiYgbGFzdC0+aXNBbm9ueW1v
dXMoKSAmJiBsYXN0LT5pc1RhYmxlQ2VsbCgpKQotICAgICAgICAgICAgY2VsbCA9IHN0YXRpY19j
YXN0PFJlbmRlclRhYmxlQ2VsbCAqPihsYXN0KTsKLSAgICAgICAgZWxzZSB7Ci0JICAgIGNlbGwg
PSBuZXcgKHJlbmRlckFyZW5hKCkpIFJlbmRlclRhYmxlQ2VsbChkb2N1bWVudCgpIC8qIGFub255
bW91cyBvYmplY3QgKi8pOwotCSAgICBSZW5kZXJTdHlsZSAqbmV3U3R5bGUgPSBuZXcgKHJlbmRl
ckFyZW5hKCkpIFJlbmRlclN0eWxlKCk7Ci0JICAgIG5ld1N0eWxlLT5pbmhlcml0RnJvbShzdHls
ZSgpKTsKLQkgICAgbmV3U3R5bGUtPnNldERpc3BsYXkoVEFCTEVfQ0VMTCk7Ci0JICAgIGNlbGwt
PnNldFN0eWxlKG5ld1N0eWxlKTsKLQkgICAgYWRkQ2hpbGQoY2VsbCwgYmVmb3JlQ2hpbGQpOwot
ICAgICAgICB9Ci0gICAgICAgIGNlbGwtPmFkZENoaWxkKGNoaWxkKTsKLSAgICAgICAgY2hpbGQt
PnNldE5lZWRzTGF5b3V0QW5kTWluTWF4UmVjYWxjKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9
IGVsc2UKLSAgICAgICAgY2VsbCA9IHN0YXRpY19jYXN0PFJlbmRlclRhYmxlQ2VsbCAqPihjaGls
ZCk7Ci0KLSAgICBzdGF0aWNfY2FzdDxSZW5kZXJUYWJsZVNlY3Rpb24gKj4ocGFyZW50KCkpLT5h
ZGRDZWxsKGNlbGwpOwotCi0gICAgUmVuZGVyQ29udGFpbmVyOjphZGRDaGlsZChjZWxsLGJlZm9y
ZUNoaWxkKTsKLQotICAgIGlmICgoYmVmb3JlQ2hpbGQgfHwgbmV4dFNpYmxpbmcoKSkgJiYgc2Vj
dGlvbigpKQotCXNlY3Rpb24oKS0+c2V0TmVlZENlbGxSZWNhbGMoKTsKLX0KLQotUmVuZGVyT2Jq
ZWN0KiBSZW5kZXJUYWJsZVJvdzo6cmVtb3ZlQ2hpbGROb2RlKFJlbmRlck9iamVjdCogY2hpbGQp
Ci17Ci0vLyBSZW5kZXJUYWJsZUNlbGwgZGVzdHJveSBzaG91bGQgZG8gaXQKLS8vICAgICBpZiAo
IHNlY3Rpb24oKSApCi0vLyAJc2VjdGlvbigpLT5zZXROZWVkQ2VsbFJlY2FsYygpOwotICAgIHJl
dHVybiBSZW5kZXJDb250YWluZXI6OnJlbW92ZUNoaWxkTm9kZShjaGlsZCk7Ci19Ci0KLSNpZm5k
ZWYgTkRFQlVHCi12b2lkIFJlbmRlclRhYmxlUm93OjpkdW1wKFFUZXh0U3RyZWFtICpzdHJlYW0s
IFFTdHJpbmcgaW5kKSBjb25zdAotewotICAgIFJlbmRlckNvbnRhaW5lcjo6ZHVtcChzdHJlYW0s
aW5kKTsKLX0KLSNlbmRpZgotCi12b2lkIFJlbmRlclRhYmxlUm93OjpsYXlvdXQoKQotewotICAg
IEtIVE1MQXNzZXJ0KG5lZWRzTGF5b3V0KCkpOwotICAgIEtIVE1MQXNzZXJ0KG1pbk1heEtub3du
KCkpOwotCi0gICAgZm9yIChSZW5kZXJPYmplY3QgKmNoaWxkID0gZmlyc3RDaGlsZCgpOyBjaGls
ZDsgY2hpbGQgPSBjaGlsZC0+bmV4dFNpYmxpbmcoKSkgewotICAgICAgICBpZiAoY2hpbGQtPmlz
VGFibGVDZWxsKCkpIHsKLSAgICAgICAgICAgIFJlbmRlclRhYmxlQ2VsbCAqY2VsbCA9IHN0YXRp
Y19jYXN0PFJlbmRlclRhYmxlQ2VsbCAqPihjaGlsZCk7Ci0gICAgICAgICAgICBpZiAoY2hpbGQt
Pm5lZWRzTGF5b3V0KCkpIHsKLSAgICAgICAgICAgICAgICBjZWxsLT5jYWxjVmVydGljYWxNYXJn
aW5zKCk7Ci0gICAgICAgICAgICAgICAgY2VsbC0+bGF5b3V0KCk7Ci0gICAgICAgICAgICAgICAg
Y2VsbC0+c2V0Q2VsbFRvcEV4dHJhKDApOwotICAgICAgICAgICAgICAgIGNlbGwtPnNldENlbGxC
b3R0b21FeHRyYSgwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBzZXRO
ZWVkc0xheW91dChmYWxzZSk7Ci19Ci0KLUludFJlY3QgUmVuZGVyVGFibGVSb3c6OmdldEFic29s
dXRlUmVwYWludFJlY3QoKQotewotICAgIC8vIEZvciBub3csIGp1c3QgcmVwYWludCB0aGUgd2hv
bGUgdGFibGUuCi0gICAgLy8gRklYTUU6IEZpbmQgYSBiZXR0ZXIgd2F5IHRvIGRvIHRoaXMuCi0g
ICAgUmVuZGVyVGFibGUqIHBhcmVudFRhYmxlID0gdGFibGUoKTsKLSAgICBpZiAocGFyZW50VGFi
bGUpCi0gICAgICAgIHJldHVybiBwYXJlbnRUYWJsZS0+Z2V0QWJzb2x1dGVSZXBhaW50UmVjdCgp
OwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIEludFJlY3QoKTsKLX0KLQotLy8gLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLQotCi1SZW5kZXJUYWJsZUNlbGw6OlJlbmRlclRhYmxlQ2VsbChET006Ok5vZGVJbXBs
KiBfbm9kZSkKLSAgOiBSZW5kZXJCbG9jayhfbm9kZSkKLXsKLSAgX2NvbCA9IC0xOwotICBfcm93
ID0gLTE7Ci0gIGNTcGFuID0gclNwYW4gPSAxOwotICB1cGRhdGVGcm9tRWxlbWVudCgpOwotICBz
ZXRTaG91bGRQYWludEJhY2tncm91bmRPckJvcmRlcih0cnVlKTsKLSAgX3RvcEV4dHJhID0gMDsK
LSAgX2JvdHRvbUV4dHJhID0gMDsKLSAgbV9wZXJjZW50YWdlSGVpZ2h0ID0gMDsKLX0KLQotdm9p
ZCBSZW5kZXJUYWJsZUNlbGw6OmRlc3Ryb3koKQotewotICAgIGlmIChwYXJlbnQoKSAmJiBzZWN0
aW9uKCkpCi0gICAgICAgIHNlY3Rpb24oKS0+c2V0TmVlZENlbGxSZWNhbGMoKTsKLQotICAgIFJl
bmRlckJsb2NrOjpkZXN0cm95KCk7Ci19Ci0KLXZvaWQgUmVuZGVyVGFibGVDZWxsOjp1cGRhdGVG
cm9tRWxlbWVudCgpCi17Ci0gICAgaW50IG9sZFJTcGFuID0gclNwYW47Ci0gICAgaW50IG9sZENT
cGFuID0gY1NwYW47Ci0gICAgRE9NOjpOb2RlSW1wbCogbm9kZSA9IGVsZW1lbnQoKTsKLSAgICBp
ZiAobm9kZSAmJiAobm9kZS0+aGFzVGFnTmFtZSh0ZFRhZykgfHwgbm9kZS0+aGFzVGFnTmFtZSh0
aFRhZykpKSB7Ci0gICAgICAgIERPTTo6SFRNTFRhYmxlQ2VsbEVsZW1lbnRJbXBsICp0YyA9IHN0
YXRpY19jYXN0PERPTTo6SFRNTFRhYmxlQ2VsbEVsZW1lbnRJbXBsICo+KG5vZGUpOwotICAgICAg
ICBjU3BhbiA9IHRjLT5jb2xTcGFuKCk7Ci0gICAgICAgIHJTcGFuID0gdGMtPnJvd1NwYW4oKTsK
LSAgICB9Ci0gICAgaWYgKChvbGRSU3BhbiAhPSByU3BhbiB8fCBvbGRDU3BhbiAhPSBjU3Bhbikg
JiYgc3R5bGUoKSAmJiBwYXJlbnQoKSkKLSAgICAgICAgc2V0TmVlZHNMYXlvdXRBbmRNaW5NYXhS
ZWNhbGMoKTsKLX0KLSAgICAKLUxlbmd0aCBSZW5kZXJUYWJsZUNlbGw6OnN0eWxlT3JDb2xXaWR0
aCgpCi17Ci0gICAgTGVuZ3RoIHcgPSBzdHlsZSgpLT53aWR0aCgpOwotICAgIGlmIChjb2xTcGFu
KCkgPiAxIHx8ICF3LmlzQXV0bygpKQotICAgICAgICByZXR1cm4gdzsKLSAgICBSZW5kZXJUYWJs
ZUNvbCogY29sID0gdGFibGUoKS0+Y29sRWxlbWVudChfY29sKTsKLSAgICBpZiAoY29sKQotICAg
ICAgICB3ID0gY29sLT5zdHlsZSgpLT53aWR0aCgpOwotICAgIHJldHVybiB3OwotfQotCi12b2lk
IFJlbmRlclRhYmxlQ2VsbDo6Y2FsY01pbk1heFdpZHRoKCkKLXsKLSAgICBSZW5kZXJCbG9jazo6
Y2FsY01pbk1heFdpZHRoKCk7Ci0gICAgaWYgKGVsZW1lbnQoKSAmJiBzdHlsZSgpLT5hdXRvV3Jh
cCgpKSB7Ci0gICAgICAgIC8vIFNlZSBpZiBub3dyYXAgd2FzIHNldC4KLSAgICAgICAgTGVuZ3Ro
IHcgPSBzdHlsZU9yQ29sV2lkdGgoKTsKLSAgICAgICAgRE9NU3RyaW5nIG5vd3JhcCA9IHN0YXRp
Y19jYXN0PEVsZW1lbnRJbXBsKj4oZWxlbWVudCgpKS0+Z2V0QXR0cmlidXRlKG5vd3JhcEF0dHIp
OwotICAgICAgICBpZiAoIW5vd3JhcC5pc051bGwoKSAmJiB3LmlzRml4ZWQoKSkKLSAgICAgICAg
ICAgIC8vIE5vd3JhcCBpcyBzZXQsIGJ1dCB3ZSBkaWRuJ3QgYWN0dWFsbHkgdXNlIGl0IGJlY2F1
c2Ugb2YgdGhlCi0gICAgICAgICAgICAvLyBmaXhlZCB3aWR0aCBzZXQgb24gdGhlIGNlbGwuICBF
dmVuIHNvLCBpdCBpcyBhIFdpbklFL01veiB0cmFpdAotICAgICAgICAgICAgLy8gdG8gbWFrZSB0
aGUgbWlud2lkdGggb2YgdGhlIGNlbGwgaW50byB0aGUgZml4ZWQgd2lkdGguICBUaGV5IGRvIHRo
aXMKLSAgICAgICAgICAgIC8vIGV2ZW4gaW4gc3RyaWN0IG1vZGUsIHNvIGRvIG5vdCBtYWtlIHRo
aXMgYSBxdWlyay4gIEFmZmVjdGVkIHRoZSB0b3AKLSAgICAgICAgICAgIC8vIG9mIGhpcHRvcC5j
b20uCi0gICAgICAgICAgICBpZiAobV9taW5XaWR0aCA8IHcudmFsdWUpCi0gICAgICAgICAgICAg
ICAgbV9taW5XaWR0aCA9IHcudmFsdWU7Ci0gICAgfQotfQotCi12b2lkIFJlbmRlclRhYmxlQ2Vs
bDo6Y2FsY1dpZHRoKCkKLXsKLX0KLQotdm9pZCBSZW5kZXJUYWJsZUNlbGw6OnNldFdpZHRoKGlu
dCB3aWR0aCkKLXsKLSAgICBpZiAod2lkdGggIT0gbV93aWR0aCkgewotCW1fd2lkdGggPSB3aWR0
aDsKLQltX3dpZHRoQ2hhbmdlZCA9IHRydWU7Ci0gICAgfQotfQotCi12b2lkIFJlbmRlclRhYmxl
Q2VsbDo6bGF5b3V0KCkKLXsKLSAgICBsYXlvdXRCbG9jayhtX3dpZHRoQ2hhbmdlZCk7Ci0gICAg
bV93aWR0aENoYW5nZWQgPSBmYWxzZTsKLX0KLQotdm9pZCBSZW5kZXJUYWJsZUNlbGw6OmNvbXB1
dGVBYnNvbHV0ZVJlcGFpbnRSZWN0KEludFJlY3QmIHIsIGJvb2wgZikKLXsKLSAgICByLnNldFko
ci55KCkgKyBfdG9wRXh0cmEpOwotICAgIFJlbmRlckJsb2NrOjpjb21wdXRlQWJzb2x1dGVSZXBh
aW50UmVjdChyLCBmKTsKLX0KLQotYm9vbCBSZW5kZXJUYWJsZUNlbGw6OmFic29sdXRlUG9zaXRp
b24oaW50ICZ4UG9zLCBpbnQgJnlQb3MsIGJvb2wgZikKLXsKLSAgICBib29sIHJldCA9IFJlbmRl
ckJsb2NrOjphYnNvbHV0ZVBvc2l0aW9uKHhQb3MsIHlQb3MsIGYpOwotICAgIGlmIChyZXQpCi0g
ICAgICB5UG9zICs9IF90b3BFeHRyYTsKLSAgICByZXR1cm4gcmV0OwotfQotCi1zaG9ydCBSZW5k
ZXJUYWJsZUNlbGw6OmJhc2VsaW5lUG9zaXRpb24oYm9vbCkgY29uc3QKLXsKLSAgICBSZW5kZXJP
YmplY3QqIG8gPSBmaXJzdENoaWxkKCk7Ci0gICAgaW50IG9mZnNldCA9IHBhZGRpbmdUb3AoKSAr
IGJvcmRlclRvcCgpOwotICAgIAotICAgIGlmICghbykKLSAgICAgICAgcmV0dXJuIG9mZnNldCAr
IGNvbnRlbnRIZWlnaHQoKTsKLSAgICB3aGlsZSAoby0+Zmlyc3RDaGlsZCgpKSB7Ci0JaWYgKCFv
LT5pc0lubGluZSgpKQotCSAgICBvZmZzZXQgKz0gby0+cGFkZGluZ1RvcCgpICsgby0+Ym9yZGVy
VG9wKCk7Ci0JbyA9IG8tPmZpcnN0Q2hpbGQoKTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKCFvLT5p
c0lubGluZSgpKQotICAgICAgICByZXR1cm4gcGFkZGluZ1RvcCgpICsgYm9yZGVyVG9wKCkgKyBj
b250ZW50SGVpZ2h0KCk7Ci0KLSAgICBvZmZzZXQgKz0gby0+YmFzZWxpbmVQb3NpdGlvbih0cnVl
KTsKLSAgICByZXR1cm4gb2Zmc2V0OwotfQotCi0KLXZvaWQgUmVuZGVyVGFibGVDZWxsOjpzZXRT
dHlsZShSZW5kZXJTdHlsZSAqc3R5bGUpCi17Ci0gICAgc3R5bGUtPnNldERpc3BsYXkoVEFCTEVf
Q0VMTCk7Ci0KLSAgICBpZiAoc3R5bGUtPndoaXRlU3BhY2UoKSA9PSBLSFRNTF9OT1dSQVApIHsK
LSAgICAgICAgLy8gRmlndXJlIG91dCBpZiB3ZSBhcmUgcmVhbGx5IG5vd3JhcHBpbmcgb3IgaWYg
d2Ugc2hvdWxkIGp1c3QKLSAgICAgICAgLy8gdXNlIG5vcm1hbCBpbnN0ZWFkLiAgSWYgdGhlIHdp
ZHRoIG9mIHRoZSBjZWxsIGlzIGZpeGVkLCB0aGVuCi0gICAgICAgIC8vIHdlIGRvbid0IGFjdHVh
bGx5IHVzZSBOT1dSQVAuIAotICAgICAgICBpZiAoc3R5bGUtPndpZHRoKCkuaXNGaXhlZCgpKQot
ICAgICAgICAgICAgc3R5bGUtPnNldFdoaXRlU3BhY2UoTk9STUFMKTsKLSAgICAgICAgZWxzZQot
ICAgICAgICAgICAgc3R5bGUtPnNldFdoaXRlU3BhY2UoTk9XUkFQKTsKLSAgICB9Ci0KLSAgICBS
ZW5kZXJCbG9jazo6c2V0U3R5bGUoc3R5bGUpOwotICAgIHNldFNob3VsZFBhaW50QmFja2dyb3Vu
ZE9yQm9yZGVyKHRydWUpOwotfQotCi1ib29sIFJlbmRlclRhYmxlQ2VsbDo6cmVxdWlyZXNMYXll
cigpIHsKLSAgICByZXR1cm4gaXNQb3NpdGlvbmVkKCkgfHwgc3R5bGUoKS0+b3BhY2l0eSgpIDwg
MS4wZiB8fCBoYXNPdmVyZmxvd0NsaXAoKTsKLX0KLQotLy8gVGhlIGZvbGxvd2luZyBydWxlcyBh
cHBseSBmb3IgcmVzb2x2aW5nIGNvbmZsaWN0cyBhbmQgZmlndXJpbmcgb3V0IHdoaWNoIGJvcmRl
cgotLy8gdG8gdXNlLgotLy8gKDEpIEJvcmRlcnMgd2l0aCB0aGUgJ2JvcmRlci1zdHlsZScgb2Yg
J2hpZGRlbicgdGFrZSBwcmVjZWRlbmNlIG92ZXIgYWxsIG90aGVyIGNvbmZsaWN0aW5nIAotLy8g
Ym9yZGVycy4gQW55IGJvcmRlciB3aXRoIHRoaXMgdmFsdWUgc3VwcHJlc3NlcyBhbGwgYm9yZGVy
cyBhdCB0aGlzIGxvY2F0aW9uLgotLy8gKDIpIEJvcmRlcnMgd2l0aCBhIHN0eWxlIG9mICdub25l
JyBoYXZlIHRoZSBsb3dlc3QgcHJpb3JpdHkuIE9ubHkgaWYgdGhlIGJvcmRlciBwcm9wZXJ0aWVz
IG9mIGFsbCAKLS8vIHRoZSBlbGVtZW50cyBtZWV0aW5nIGF0IHRoaXMgZWRnZSBhcmUgJ25vbmUn
IHdpbGwgdGhlIGJvcmRlciBiZSBvbWl0dGVkIChidXQgbm90ZSB0aGF0ICdub25lJyBpcyAKLS8v
IHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgYm9yZGVyIHN0eWxlLikKLS8vICgzKSBJZiBub25l
IG9mIHRoZSBzdHlsZXMgYXJlICdoaWRkZW4nIGFuZCBhdCBsZWFzdCBvbmUgb2YgdGhlbSBpcyBu
b3QgJ25vbmUnLCB0aGVuIG5hcnJvdyBib3JkZXJzIAotLy8gYXJlIGRpc2NhcmRlZCBpbiBmYXZv
ciBvZiB3aWRlciBvbmVzLiBJZiBzZXZlcmFsIGhhdmUgdGhlIHNhbWUgJ2JvcmRlci13aWR0aCcg
dGhlbiBzdHlsZXMgYXJlIHByZWZlcnJlZCAKLS8vIGluIHRoaXMgb3JkZXI6ICdkb3VibGUnLCAn
c29saWQnLCAnZGFzaGVkJywgJ2RvdHRlZCcsICdyaWRnZScsICdvdXRzZXQnLCAnZ3Jvb3ZlJywg
YW5kIHRoZSBsb3dlc3Q6ICdpbnNldCcuCi0vLyAoNCkgSWYgYm9yZGVyIHN0eWxlcyBkaWZmZXIg
b25seSBpbiBjb2xvciwgdGhlbiBhIHN0eWxlIHNldCBvbiBhIGNlbGwgd2lucyBvdmVyIG9uZSBv
biBhIHJvdywgCi0vLyB3aGljaCB3aW5zIG92ZXIgYSByb3cgZ3JvdXAsIGNvbHVtbiwgY29sdW1u
IGdyb3VwIGFuZCwgbGFzdGx5LCB0YWJsZS4gSXQgaXMgdW5kZWZpbmVkIHdoaWNoIGNvbG9yIAot
Ly8gaXMgdXNlZCB3aGVuIHR3byBlbGVtZW50cyBvZiB0aGUgc2FtZSB0eXBlIGRpc2FncmVlLgot
c3RhdGljIENvbGxhcHNlZEJvcmRlclZhbHVlIGNvbXBhcmVCb3JkZXJzKGNvbnN0IENvbGxhcHNl
ZEJvcmRlclZhbHVlJiBib3JkZXIxLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBjb25zdCBDb2xsYXBzZWRCb3JkZXJWYWx1ZSYgYm9yZGVyMikKLXsKLSAgICAv
LyBTYW5pdHkgY2hlY2sgdGhlIHZhbHVlcyBwYXNzZWQgaW4uICBJZiBlaXRoZXIgaXMgbnVsbCwg
cmV0dXJuIHRoZSBvdGhlci4KLSAgICBpZiAoIWJvcmRlcjIuZXhpc3RzKCkpIHJldHVybiBib3Jk
ZXIxOwotICAgIGlmICghYm9yZGVyMS5leGlzdHMoKSkgcmV0dXJuIGJvcmRlcjI7Ci0gICAgCi0g
ICAgLy8gUnVsZSAjMSBhYm92ZS4KLSAgICBpZiAoYm9yZGVyMS5zdHlsZSgpID09IEJISURERU4g
fHwgYm9yZGVyMi5zdHlsZSgpID09IEJISURERU4pCi0gICAgICAgIHJldHVybiBDb2xsYXBzZWRC
b3JkZXJWYWx1ZSgpOyAvLyBObyBib3JkZXIgc2hvdWxkIGV4aXN0IGF0IHRoaXMgbG9jYXRpb24u
Ci0gICAgCi0gICAgLy8gUnVsZSAjMiBhYm92ZS4gIEEgc3R5bGUgb2YgJ25vbmUnIGhhcyBsb3dl
c3QgcHJpb3JpdHkgYW5kIGFsd2F5cyBsb3NlcyB0byBhbnkgb3RoZXIgYm9yZGVyLgotICAgIGlm
IChib3JkZXIyLnN0eWxlKCkgPT0gQk5PTkUpIHJldHVybiBib3JkZXIxOwotICAgIGlmIChib3Jk
ZXIxLnN0eWxlKCkgPT0gQk5PTkUpIHJldHVybiBib3JkZXIyOwotICAgIAotICAgIC8vIFRoZSBm
aXJzdCBwYXJ0IG9mIHJ1bGUgIzMgYWJvdmUuIFdpZGVyIGJvcmRlcnMgd2luLgotICAgIGlmIChi
b3JkZXIxLndpZHRoKCkgIT0gYm9yZGVyMi53aWR0aCgpKQotICAgICAgICByZXR1cm4gYm9yZGVy
MS53aWR0aCgpID4gYm9yZGVyMi53aWR0aCgpID8gYm9yZGVyMSA6IGJvcmRlcjI7Ci0gICAgCi0g
ICAgLy8gVGhlIGJvcmRlcnMgaGF2ZSBlcXVhbCB3aWR0aC4gIFNvcnQgYnkgYm9yZGVyIHN0eWxl
LgotICAgIGlmIChib3JkZXIxLnN0eWxlKCkgIT0gYm9yZGVyMi5zdHlsZSgpKQotICAgICAgICBy
ZXR1cm4gYm9yZGVyMS5zdHlsZSgpID4gYm9yZGVyMi5zdHlsZSgpID8gYm9yZGVyMSA6IGJvcmRl
cjI7Ci0gICAgCi0gICAgLy8gVGhlIGJvcmRlciBoYXZlIHRoZSBzYW1lIHdpZHRoIGFuZCBzdHls
ZS4gIFJlbHkgb24gcHJlY2VkZW5jZSAoY2VsbCBvdmVyIHJvdyBvdmVyIHJvdyBncm91cCwgZXRj
LikKLSAgICByZXR1cm4gYm9yZGVyMS5wcmVjZWRlbmNlID49IGJvcmRlcjIucHJlY2VkZW5jZSA/
IGJvcmRlcjEgOiBib3JkZXIyOwotfQotCi1Db2xsYXBzZWRCb3JkZXJWYWx1ZSBSZW5kZXJUYWJs
ZUNlbGw6OmNvbGxhcHNlZExlZnRCb3JkZXIoKSBjb25zdAotewotICAgIC8vIEZvciBib3JkZXIg
bGVmdCwgd2UgbmVlZCB0byBjaGVjaywgaW4gb3JkZXIgb2YgcHJlY2VkZW5jZToKLSAgICAvLyAo
MSkgT3VyIGxlZnQgYm9yZGVyLgotICAgIENvbGxhcHNlZEJvcmRlclZhbHVlIHJlc3VsdCgmc3R5
bGUoKS0+Ym9yZGVyTGVmdCgpLCBCQ0VMTCk7Ci0gICAgCi0gICAgLy8gKDIpIFRoZSBwcmV2aW91
cyBjZWxsJ3MgcmlnaHQgYm9yZGVyLgotICAgIFJlbmRlclRhYmxlQ2VsbCogcHJldkNlbGwgPSB0
YWJsZSgpLT5jZWxsTGVmdCh0aGlzKTsKLSAgICBpZiAocHJldkNlbGwpIHsKLSAgICAgICAgcmVz
dWx0ID0gY29tcGFyZUJvcmRlcnMocmVzdWx0LCBDb2xsYXBzZWRCb3JkZXJWYWx1ZSgmcHJldkNl
bGwtPnN0eWxlKCktPmJvcmRlclJpZ2h0KCksIEJDRUxMKSk7Ci0gICAgICAgIGlmICghcmVzdWx0
LmV4aXN0cygpKQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgZWxzZSBp
ZiAoY29sKCkgPT0gMCkgewotICAgICAgICAvLyAoMykgT3VyIHJvdydzIGxlZnQgYm9yZGVyLgot
ICAgICAgICByZXN1bHQgPSBjb21wYXJlQm9yZGVycyhyZXN1bHQsIENvbGxhcHNlZEJvcmRlclZh
bHVlKCZwYXJlbnQoKS0+c3R5bGUoKS0+Ym9yZGVyTGVmdCgpLCBCUk9XKSk7Ci0gICAgICAgIGlm
ICghcmVzdWx0LmV4aXN0cygpKQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAg
Ci0gICAgICAgIC8vICg0KSBPdXIgcm93IGdyb3VwJ3MgbGVmdCBib3JkZXIuCi0gICAgICAgIHJl
c3VsdCA9IGNvbXBhcmVCb3JkZXJzKHJlc3VsdCwgQ29sbGFwc2VkQm9yZGVyVmFsdWUoJnNlY3Rp
b24oKS0+c3R5bGUoKS0+Ym9yZGVyTGVmdCgpLCBCUk9XR1JPVVApKTsKLSAgICAgICAgaWYgKCFy
ZXN1bHQuZXhpc3RzKCkpCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICAK
LSAgICAvLyAoNSkgT3VyIGNvbHVtbidzIGxlZnQgYm9yZGVyLgotICAgIFJlbmRlclRhYmxlQ29s
KiBjb2xFbHQgPSB0YWJsZSgpLT5jb2xFbGVtZW50KGNvbCgpKTsKLSAgICBpZiAoY29sRWx0KSB7
Ci0gICAgICAgIHJlc3VsdCA9IGNvbXBhcmVCb3JkZXJzKHJlc3VsdCwgQ29sbGFwc2VkQm9yZGVy
VmFsdWUoJmNvbEVsdC0+c3R5bGUoKS0+Ym9yZGVyTGVmdCgpLCBCQ09MKSk7Ci0gICAgICAgIGlm
ICghcmVzdWx0LmV4aXN0cygpKQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0g
ICAgCi0gICAgLy8gKDYpIFRoZSBwcmV2aW91cyBjb2x1bW4ncyByaWdodCBib3JkZXIuCi0gICAg
aWYgKGNvbCgpID4gMCkgewotICAgICAgICBjb2xFbHQgPSB0YWJsZSgpLT5jb2xFbGVtZW50KGNv
bCgpIC0gMSk7Ci0gICAgICAgIGlmIChjb2xFbHQpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGNv
bXBhcmVCb3JkZXJzKHJlc3VsdCwgQ29sbGFwc2VkQm9yZGVyVmFsdWUoJmNvbEVsdC0+c3R5bGUo
KS0+Ym9yZGVyUmlnaHQoKSwgQkNPTCkpOwotICAgICAgICAgICAgaWYgKCFyZXN1bHQuZXhpc3Rz
KCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgIH0KLSAg
ICAKLSAgICBpZiAoY29sKCkgPT0gMCkgewotICAgICAgICAvLyAoNykgVGhlIHRhYmxlJ3MgbGVm
dCBib3JkZXIuCi0gICAgICAgIHJlc3VsdCA9IGNvbXBhcmVCb3JkZXJzKHJlc3VsdCwgQ29sbGFw
c2VkQm9yZGVyVmFsdWUoJnRhYmxlKCktPnN0eWxlKCktPmJvcmRlckxlZnQoKSwgQlRBQkxFKSk7
Ci0gICAgICAgIGlmICghcmVzdWx0LmV4aXN0cygpKQotICAgICAgICAgICAgcmV0dXJuIHJlc3Vs
dDsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotQ29sbGFwc2VkQm9yZGVy
VmFsdWUgUmVuZGVyVGFibGVDZWxsOjpjb2xsYXBzZWRSaWdodEJvcmRlcigpIGNvbnN0Ci17Ci0g
ICAgUmVuZGVyVGFibGUqIHRhYmxlRWx0ID0gdGFibGUoKTsKLSAgICBib29sIGluTGFzdENvbHVt
biA9IGZhbHNlOwotICAgIGludCBlZmZDb2wgPSB0YWJsZUVsdC0+Y29sVG9FZmZDb2woY29sKCkg
KyBjb2xTcGFuKCkgLSAxKTsKLSAgICBpZiAoZWZmQ29sID09IHRhYmxlRWx0LT5udW1FZmZDb2xz
KCkgLSAxKQotICAgICAgICBpbkxhc3RDb2x1bW4gPSB0cnVlOwotICAgIAotICAgIC8vIEZvciBi
b3JkZXIgcmlnaHQsIHdlIG5lZWQgdG8gY2hlY2ssIGluIG9yZGVyIG9mIHByZWNlZGVuY2U6Ci0g
ICAgLy8gKDEpIE91ciByaWdodCBib3JkZXIuCi0gICAgQ29sbGFwc2VkQm9yZGVyVmFsdWUgcmVz
dWx0ID0gQ29sbGFwc2VkQm9yZGVyVmFsdWUoJnN0eWxlKCktPmJvcmRlclJpZ2h0KCksIEJDRUxM
KTsKLSAgICAKLSAgICAvLyAoMikgVGhlIG5leHQgY2VsbCdzIGxlZnQgYm9yZGVyLgotICAgIGlm
ICghaW5MYXN0Q29sdW1uKSB7Ci0gICAgICAgIFJlbmRlclRhYmxlQ2VsbCogbmV4dENlbGwgPSB0
YWJsZUVsdC0+Y2VsbFJpZ2h0KHRoaXMpOwotICAgICAgICBpZiAobmV4dENlbGwgJiYgbmV4dENl
bGwtPnN0eWxlKCkpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGNvbXBhcmVCb3JkZXJzKHJlc3Vs
dCwgQ29sbGFwc2VkQm9yZGVyVmFsdWUoJm5leHRDZWxsLT5zdHlsZSgpLT5ib3JkZXJMZWZ0KCks
IEJDRUxMKSk7Ci0gICAgICAgICAgICBpZiAoIXJlc3VsdC5leGlzdHMoKSkKLSAgICAgICAgICAg
ICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8g
KDMpIE91ciByb3cncyByaWdodCBib3JkZXIuCi0gICAgICAgIHJlc3VsdCA9IGNvbXBhcmVCb3Jk
ZXJzKHJlc3VsdCwgQ29sbGFwc2VkQm9yZGVyVmFsdWUoJnBhcmVudCgpLT5zdHlsZSgpLT5ib3Jk
ZXJSaWdodCgpLCBCUk9XKSk7Ci0gICAgICAgIGlmICghcmVzdWx0LmV4aXN0cygpKQotICAgICAg
ICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgCi0gICAgICAgIC8vICg0KSBPdXIgcm93IGdy
b3VwJ3MgcmlnaHQgYm9yZGVyLgotICAgICAgICByZXN1bHQgPSBjb21wYXJlQm9yZGVycyhyZXN1
bHQsIENvbGxhcHNlZEJvcmRlclZhbHVlKCZzZWN0aW9uKCktPnN0eWxlKCktPmJvcmRlclJpZ2h0
KCksIEJST1dHUk9VUCkpOwotICAgICAgICBpZiAoIXJlc3VsdC5leGlzdHMoKSkKLSAgICAgICAg
ICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIAotICAgIC8vICg1KSBPdXIgY29sdW1uJ3Mg
cmlnaHQgYm9yZGVyLgotICAgIFJlbmRlclRhYmxlQ29sKiBjb2xFbHQgPSB0YWJsZSgpLT5jb2xF
bGVtZW50KGNvbCgpK2NvbFNwYW4oKSAtIDEpOwotICAgIGlmIChjb2xFbHQpIHsKLSAgICAgICAg
cmVzdWx0ID0gY29tcGFyZUJvcmRlcnMocmVzdWx0LCBDb2xsYXBzZWRCb3JkZXJWYWx1ZSgmY29s
RWx0LT5zdHlsZSgpLT5ib3JkZXJSaWdodCgpLCBCQ09MKSk7Ci0gICAgICAgIGlmICghcmVzdWx0
LmV4aXN0cygpKQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgCi0gICAg
Ly8gKDYpIFRoZSBuZXh0IGNvbHVtbidzIGxlZnQgYm9yZGVyLgotICAgIGlmICghaW5MYXN0Q29s
dW1uKSB7Ci0gICAgICAgIGNvbEVsdCA9IHRhYmxlRWx0LT5jb2xFbGVtZW50KGNvbCgpK2NvbFNw
YW4oKSk7Ci0gICAgICAgIGlmIChjb2xFbHQpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGNvbXBh
cmVCb3JkZXJzKHJlc3VsdCwgQ29sbGFwc2VkQm9yZGVyVmFsdWUoJmNvbEVsdC0+c3R5bGUoKS0+
Ym9yZGVyTGVmdCgpLCBCQ09MKSk7Ci0gICAgICAgICAgICBpZiAoIXJlc3VsdC5leGlzdHMoKSkK
LSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgfQotICAgIGVs
c2UgewotICAgICAgICAvLyAoNykgVGhlIHRhYmxlJ3MgcmlnaHQgYm9yZGVyLgotICAgICAgICBy
ZXN1bHQgPSBjb21wYXJlQm9yZGVycyhyZXN1bHQsIENvbGxhcHNlZEJvcmRlclZhbHVlKCZ0YWJs
ZUVsdC0+c3R5bGUoKS0+Ym9yZGVyUmlnaHQoKSwgQlRBQkxFKSk7Ci0gICAgICAgIGlmICghcmVz
dWx0LmV4aXN0cygpKQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgCi0g
ICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotQ29sbGFwc2VkQm9yZGVyVmFsdWUgUmVuZGVyVGFibGVD
ZWxsOjpjb2xsYXBzZWRUb3BCb3JkZXIoKSBjb25zdAotewotICAgIC8vIEZvciBib3JkZXIgdG9w
LCB3ZSBuZWVkIHRvIGNoZWNrLCBpbiBvcmRlciBvZiBwcmVjZWRlbmNlOgotICAgIC8vICgxKSBP
dXIgdG9wIGJvcmRlci4KLSAgICBDb2xsYXBzZWRCb3JkZXJWYWx1ZSByZXN1bHQgPSBDb2xsYXBz
ZWRCb3JkZXJWYWx1ZSgmc3R5bGUoKS0+Ym9yZGVyVG9wKCksIEJDRUxMKTsKLSAgICAKLSAgICBS
ZW5kZXJUYWJsZUNlbGwqIHByZXZDZWxsID0gdGFibGUoKS0+Y2VsbEFib3ZlKHRoaXMpOwotICAg
IGlmIChwcmV2Q2VsbCkgewotICAgICAgICAvLyAoMikgQSBwcmV2aW91cyBjZWxsJ3MgYm90dG9t
IGJvcmRlci4KLSAgICAgICAgcmVzdWx0ID0gY29tcGFyZUJvcmRlcnMocmVzdWx0LCBDb2xsYXBz
ZWRCb3JkZXJWYWx1ZSgmcHJldkNlbGwtPnN0eWxlKCktPmJvcmRlckJvdHRvbSgpLCBCQ0VMTCkp
OwotICAgICAgICBpZiAoIXJlc3VsdC5leGlzdHMoKSkgCi0gICAgICAgICAgICByZXR1cm4gcmVz
dWx0OwotICAgIH0KLSAgICAKLSAgICAvLyAoMykgT3VyIHJvdydzIHRvcCBib3JkZXIuCi0gICAg
cmVzdWx0ID0gY29tcGFyZUJvcmRlcnMocmVzdWx0LCBDb2xsYXBzZWRCb3JkZXJWYWx1ZSgmcGFy
ZW50KCktPnN0eWxlKCktPmJvcmRlclRvcCgpLCBCUk9XKSk7Ci0gICAgaWYgKCFyZXN1bHQuZXhp
c3RzKCkpCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgCi0gICAgLy8gKDQpIFRoZSBwcmV2
aW91cyByb3cncyBib3R0b20gYm9yZGVyLgotICAgIGlmIChwcmV2Q2VsbCkgewotICAgICAgICBS
ZW5kZXJPYmplY3QqIHByZXZSb3cgPSAwOwotICAgICAgICBpZiAocHJldkNlbGwtPnNlY3Rpb24o
KSA9PSBzZWN0aW9uKCkpCi0gICAgICAgICAgICBwcmV2Um93ID0gcGFyZW50KCktPnByZXZpb3Vz
U2libGluZygpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBwcmV2Um93ID0gcHJldkNlbGwt
PnNlY3Rpb24oKS0+bGFzdENoaWxkKCk7Ci0gICAgCi0gICAgICAgIGlmIChwcmV2Um93KSB7Ci0g
ICAgICAgICAgICByZXN1bHQgPSBjb21wYXJlQm9yZGVycyhyZXN1bHQsIENvbGxhcHNlZEJvcmRl
clZhbHVlKCZwcmV2Um93LT5zdHlsZSgpLT5ib3JkZXJCb3R0b20oKSwgQlJPVykpOwotICAgICAg
ICAgICAgaWYgKCFyZXN1bHQuZXhpc3RzKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3Vs
dDsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvLyBOb3cgY2hlY2sgcm93IGdyb3Vwcy4K
LSAgICBSZW5kZXJPYmplY3QqIGN1cnJTZWN0aW9uID0gcGFyZW50KCktPnBhcmVudCgpOwotICAg
IGlmIChyb3coKSA9PSAwKSB7Ci0gICAgICAgIC8vICg1KSBPdXIgcm93IGdyb3VwJ3MgdG9wIGJv
cmRlci4KLSAgICAgICAgcmVzdWx0ID0gY29tcGFyZUJvcmRlcnMocmVzdWx0LCBDb2xsYXBzZWRC
b3JkZXJWYWx1ZSgmY3VyclNlY3Rpb24tPnN0eWxlKCktPmJvcmRlclRvcCgpLCBCUk9XR1JPVVAp
KTsKLSAgICAgICAgaWYgKCFyZXN1bHQuZXhpc3RzKCkpCi0gICAgICAgICAgICByZXR1cm4gcmVz
dWx0OwotICAgICAgICAKLSAgICAgICAgLy8gKDYpIFByZXZpb3VzIHJvdyBncm91cCdzIGJvdHRv
bSBib3JkZXIuCi0gICAgICAgIGZvciAoY3VyclNlY3Rpb24gPSBjdXJyU2VjdGlvbi0+cHJldmlv
dXNTaWJsaW5nKCk7IGN1cnJTZWN0aW9uOwotICAgICAgICAgICAgIGN1cnJTZWN0aW9uID0gY3Vy
clNlY3Rpb24tPnByZXZpb3VzU2libGluZygpKSB7Ci0gICAgICAgICAgICBpZiAoY3VyclNlY3Rp
b24tPmlzVGFibGVTZWN0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICBSZW5kZXJUYWJsZVNlY3Rp
b24qIHNlY3Rpb24gPSBzdGF0aWNfY2FzdDxSZW5kZXJUYWJsZVNlY3Rpb24qPihjdXJyU2VjdGlv
bik7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gY29tcGFyZUJvcmRlcnMocmVzdWx0LCBDb2xs
YXBzZWRCb3JkZXJWYWx1ZSgmc2VjdGlvbi0+c3R5bGUoKS0+Ym9yZGVyQm90dG9tKCksIEJST1dH
Uk9VUCkpOwotICAgICAgICAgICAgICAgIGlmICghcmVzdWx0LmV4aXN0cygpKQotICAgICAgICAg
ICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAg
fQotICAgIAotICAgIGlmICghY3VyclNlY3Rpb24pIHsKLSAgICAgICAgLy8gKDgpIE91ciBjb2x1
bW4ncyB0b3AgYm9yZGVyLgotICAgICAgICBSZW5kZXJUYWJsZUNvbCogY29sRWx0ID0gdGFibGUo
KS0+Y29sRWxlbWVudChjb2woKSk7Ci0gICAgICAgIGlmIChjb2xFbHQpIHsKLSAgICAgICAgICAg
IHJlc3VsdCA9IGNvbXBhcmVCb3JkZXJzKHJlc3VsdCwgQ29sbGFwc2VkQm9yZGVyVmFsdWUoJmNv
bEVsdC0+c3R5bGUoKS0+Ym9yZGVyVG9wKCksIEJDT0wpKTsKLSAgICAgICAgICAgIGlmICghcmVz
dWx0LmV4aXN0cygpKQotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0K
LSAgICAgICAgCi0gICAgICAgIC8vICg5KSBUaGUgdGFibGUncyB0b3AgYm9yZGVyLgotICAgICAg
ICByZXN1bHQgPSBjb21wYXJlQm9yZGVycyhyZXN1bHQsIENvbGxhcHNlZEJvcmRlclZhbHVlKCZ0
YWJsZSgpLT5zdHlsZSgpLT5ib3JkZXJUb3AoKSwgQlRBQkxFKSk7Ci0gICAgICAgIGlmICghcmVz
dWx0LmV4aXN0cygpKQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgCi0g
ICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotQ29sbGFwc2VkQm9yZGVyVmFsdWUgUmVuZGVyVGFibGVD
ZWxsOjpjb2xsYXBzZWRCb3R0b21Cb3JkZXIoKSBjb25zdAotewotICAgIC8vIEZvciBib3JkZXIg
dG9wLCB3ZSBuZWVkIHRvIGNoZWNrLCBpbiBvcmRlciBvZiBwcmVjZWRlbmNlOgotICAgIC8vICgx
KSBPdXIgYm90dG9tIGJvcmRlci4KLSAgICBDb2xsYXBzZWRCb3JkZXJWYWx1ZSByZXN1bHQgPSBD
b2xsYXBzZWRCb3JkZXJWYWx1ZSgmc3R5bGUoKS0+Ym9yZGVyQm90dG9tKCksIEJDRUxMKTsKLSAg
ICAKLSAgICBSZW5kZXJUYWJsZUNlbGwqIG5leHRDZWxsID0gdGFibGUoKS0+Y2VsbEJlbG93KHRo
aXMpOwotICAgIGlmIChuZXh0Q2VsbCkgewotICAgICAgICAvLyAoMikgQSBmb2xsb3dpbmcgY2Vs
bCdzIHRvcCBib3JkZXIuCi0gICAgICAgIHJlc3VsdCA9IGNvbXBhcmVCb3JkZXJzKHJlc3VsdCwg
Q29sbGFwc2VkQm9yZGVyVmFsdWUoJm5leHRDZWxsLT5zdHlsZSgpLT5ib3JkZXJUb3AoKSwgQkNF
TEwpKTsKLSAgICAgICAgaWYgKCFyZXN1bHQuZXhpc3RzKCkpCi0gICAgICAgICAgICByZXR1cm4g
cmVzdWx0OwotICAgIH0KLSAgICAKLSAgICAvLyAoMykgT3VyIHJvdydzIGJvdHRvbSBib3JkZXIu
IChGSVhNRTogRGVhbCB3aXRoIHJvd3NwYW4hKQotICAgIHJlc3VsdCA9IGNvbXBhcmVCb3JkZXJz
KHJlc3VsdCwgQ29sbGFwc2VkQm9yZGVyVmFsdWUoJnBhcmVudCgpLT5zdHlsZSgpLT5ib3JkZXJC
b3R0b20oKSwgQlJPVykpOwotICAgIGlmICghcmVzdWx0LmV4aXN0cygpKQotICAgICAgICByZXR1
cm4gcmVzdWx0OwotICAgIAotICAgIC8vICg0KSBUaGUgbmV4dCByb3cncyB0b3AgYm9yZGVyLgot
ICAgIGlmIChuZXh0Q2VsbCkgewotICAgICAgICByZXN1bHQgPSBjb21wYXJlQm9yZGVycyhyZXN1
bHQsIENvbGxhcHNlZEJvcmRlclZhbHVlKCZuZXh0Q2VsbC0+cGFyZW50KCktPnN0eWxlKCktPmJv
cmRlclRvcCgpLCBCUk9XKSk7Ci0gICAgICAgIGlmICghcmVzdWx0LmV4aXN0cygpKQotICAgICAg
ICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgCi0gICAgLy8gTm93IGNoZWNrIHJvdyBn
cm91cHMuCi0gICAgUmVuZGVyT2JqZWN0KiBjdXJyU2VjdGlvbiA9IHBhcmVudCgpLT5wYXJlbnQo
KTsKLSAgICBpZiAocm93KCkgKyByb3dTcGFuKCkgPj0gc3RhdGljX2Nhc3Q8UmVuZGVyVGFibGVT
ZWN0aW9uKj4oY3VyclNlY3Rpb24pLT5udW1Sb3dzKCkpIHsKLSAgICAgICAgLy8gKDUpIE91ciBy
b3cgZ3JvdXAncyBib3R0b20gYm9yZGVyLgotICAgICAgICByZXN1bHQgPSBjb21wYXJlQm9yZGVy
cyhyZXN1bHQsIENvbGxhcHNlZEJvcmRlclZhbHVlKCZjdXJyU2VjdGlvbi0+c3R5bGUoKS0+Ym9y
ZGVyQm90dG9tKCksIEJST1dHUk9VUCkpOwotICAgICAgICBpZiAoIXJlc3VsdC5leGlzdHMoKSkK
LSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIAotICAgICAgICAvLyAoNikgRm9s
bG93aW5nIHJvdyBncm91cCdzIHRvcCBib3JkZXIuCi0gICAgICAgIGZvciAoY3VyclNlY3Rpb24g
PSBjdXJyU2VjdGlvbi0+bmV4dFNpYmxpbmcoKTsgY3VyclNlY3Rpb247Ci0gICAgICAgICAgICAg
Y3VyclNlY3Rpb24gPSBjdXJyU2VjdGlvbi0+bmV4dFNpYmxpbmcoKSkgewotICAgICAgICAgICAg
aWYgKGN1cnJTZWN0aW9uLT5pc1RhYmxlU2VjdGlvbigpKSB7Ci0gICAgICAgICAgICAgICAgUmVu
ZGVyVGFibGVTZWN0aW9uKiBzZWN0aW9uID0gc3RhdGljX2Nhc3Q8UmVuZGVyVGFibGVTZWN0aW9u
Kj4oY3VyclNlY3Rpb24pOwotICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNvbXBhcmVCb3JkZXJz
KHJlc3VsdCwgQ29sbGFwc2VkQm9yZGVyVmFsdWUoJnNlY3Rpb24tPnN0eWxlKCktPmJvcmRlclRv
cCgpLCBCUk9XR1JPVVApKTsKLSAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdC5leGlzdHMoKSkK
LSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAg
ICAgfQotICAgIH0KLSAgICAKLSAgICBpZiAoIWN1cnJTZWN0aW9uKSB7Ci0gICAgICAgIC8vICg4
KSBPdXIgY29sdW1uJ3MgYm90dG9tIGJvcmRlci4KLSAgICAgICAgUmVuZGVyVGFibGVDb2wqIGNv
bEVsdCA9IHRhYmxlKCktPmNvbEVsZW1lbnQoY29sKCkpOwotICAgICAgICBpZiAoY29sRWx0KSB7
Ci0gICAgICAgICAgICByZXN1bHQgPSBjb21wYXJlQm9yZGVycyhyZXN1bHQsIENvbGxhcHNlZEJv
cmRlclZhbHVlKCZjb2xFbHQtPnN0eWxlKCktPmJvcmRlckJvdHRvbSgpLCBCQ09MKSk7Ci0gICAg
ICAgICAgICBpZiAoIXJlc3VsdC5leGlzdHMoKSkgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQot
ICAgICAgICAKLSAgICAgICAgLy8gKDkpIFRoZSB0YWJsZSdzIGJvdHRvbSBib3JkZXIuCi0gICAg
ICAgIHJlc3VsdCA9IGNvbXBhcmVCb3JkZXJzKHJlc3VsdCwgQ29sbGFwc2VkQm9yZGVyVmFsdWUo
JnRhYmxlKCktPnN0eWxlKCktPmJvcmRlckJvdHRvbSgpLCBCVEFCTEUpKTsKLSAgICAgICAgaWYg
KCFyZXN1bHQuZXhpc3RzKCkpCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAg
ICAKLSAgICByZXR1cm4gcmVzdWx0OyAgICAKLX0KLQotaW50IFJlbmRlclRhYmxlQ2VsbDo6Ym9y
ZGVyTGVmdCgpIGNvbnN0Ci17Ci0gICAgaWYgKHRhYmxlKCktPmNvbGxhcHNlQm9yZGVycygpKSB7
Ci0gICAgICAgIENvbGxhcHNlZEJvcmRlclZhbHVlIGJvcmRlciA9IGNvbGxhcHNlZExlZnRCb3Jk
ZXIoKTsKLSAgICAgICAgaWYgKGJvcmRlci5leGlzdHMoKSkKLSAgICAgICAgICAgIHJldHVybiBp
bnQoYm9yZGVyLndpZHRoKCkgLyAyLjAgKyAwLjUpOyAvLyBHaXZlIHRoZSBleHRyYSBwaXhlbCB0
byB0b3AgYW5kIGxlZnQuCi0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gUmVu
ZGVyQmxvY2s6OmJvcmRlckxlZnQoKTsKLX0KLSAgICAKLWludCBSZW5kZXJUYWJsZUNlbGw6OmJv
cmRlclJpZ2h0KCkgY29uc3QKLXsKLSAgICBpZiAodGFibGUoKS0+Y29sbGFwc2VCb3JkZXJzKCkp
IHsKLSAgICAgICAgQ29sbGFwc2VkQm9yZGVyVmFsdWUgYm9yZGVyID0gY29sbGFwc2VkUmlnaHRC
b3JkZXIoKTsKLSAgICAgICAgaWYgKGJvcmRlci5leGlzdHMoKSkKLSAgICAgICAgICAgIHJldHVy
biBib3JkZXIud2lkdGgoKSAvIDI7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1
cm4gUmVuZGVyQmxvY2s6OmJvcmRlclJpZ2h0KCk7Ci19Ci0KLWludCBSZW5kZXJUYWJsZUNlbGw6
OmJvcmRlclRvcCgpIGNvbnN0Ci17Ci0gICAgaWYgKHRhYmxlKCktPmNvbGxhcHNlQm9yZGVycygp
KSB7Ci0gICAgICAgIENvbGxhcHNlZEJvcmRlclZhbHVlIGJvcmRlciA9IGNvbGxhcHNlZFRvcEJv
cmRlcigpOwotICAgICAgICBpZiAoYm9yZGVyLmV4aXN0cygpKQotICAgICAgICAgICAgcmV0dXJu
IGludChib3JkZXIud2lkdGgoKSAvIDIuMCArIDAuNSk7IC8vIEdpdmUgdGhlIGV4dHJhIHBpeGVs
IHRvIHRvcCBhbmQgbGVmdC4KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBS
ZW5kZXJCbG9jazo6Ym9yZGVyVG9wKCk7Ci19Ci0KLWludCBSZW5kZXJUYWJsZUNlbGw6OmJvcmRl
ckJvdHRvbSgpIGNvbnN0Ci17Ci0gICAgaWYgKHRhYmxlKCktPmNvbGxhcHNlQm9yZGVycygpKSB7
Ci0gICAgICAgIENvbGxhcHNlZEJvcmRlclZhbHVlIGJvcmRlciA9IGNvbGxhcHNlZEJvdHRvbUJv
cmRlcigpOwotICAgICAgICBpZiAoYm9yZGVyLmV4aXN0cygpKQotICAgICAgICAgICAgcmV0dXJu
IGJvcmRlci53aWR0aCgpIC8gMjsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVy
biBSZW5kZXJCbG9jazo6Ym9yZGVyQm90dG9tKCk7Ci19Ci0KLSNpZmRlZiBCT1hfREVCVUcKLSNp
bmNsdWRlIDxxcGFpbnRlci5oPgotCi1zdGF0aWMgdm9pZCBvdXRsaW5lQm94KFFQYWludGVyICpw
LCBpbnQgX3R4LCBpbnQgX3R5LCBpbnQgdywgaW50IGgpCi17Ci0gICAgcC0+c2V0UGVuKFFQZW4o
UUNvbG9yKCJ5ZWxsb3ciKSwgMywgUXQ6OkRvdExpbmUpKTsKLSAgICBwLT5zZXRCcnVzaChRdDo6
Tm9CcnVzaCk7Ci0gICAgcC0+ZHJhd1JlY3QoX3R4LCBfdHksIHcsIGgpOwotfQotI2VuZGlmCi0K
LXZvaWQgUmVuZGVyVGFibGVDZWxsOjpwYWludChQYWludEluZm8mIGksIGludCBfdHgsIGludCBf
dHkpCi17Ci0gICAgX3R4ICs9IG1feDsKLSAgICBfdHkgKz0gbV95OwotCi0gICAgLy8gY2hlY2sg
aWYgd2UgbmVlZCB0byBkbyBhbnl0aGluZyBhdCBhbGwuLi4KLSAgICBpbnQgb3MgPSAyKm1heGlt
YWxPdXRsaW5lU2l6ZShpLnBoYXNlKTsKLSAgICBpZiAoKF90eSA+PSBpLnIueSgpICsgaS5yLmhl
aWdodCgpICsgb3MpIHx8IChfdHkgKyBfdG9wRXh0cmEgKyBtX2hlaWdodCArIF9ib3R0b21FeHRy
YSA8PSBpLnIueSgpIC0gb3MpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBpZiAoaS5waGFzZSA9
PSBQYWludEFjdGlvbkNvbGxhcHNlZFRhYmxlQm9yZGVycyAmJiBzdHlsZSgpLT52aXNpYmlsaXR5
KCkgPT0gVklTSUJMRSkgewotICAgICAgICBpbnQgdyA9IHdpZHRoKCk7Ci0gICAgICAgIGludCBo
ID0gaGVpZ2h0KCkgKyBib3JkZXJUb3BFeHRyYSgpICsgYm9yZGVyQm90dG9tRXh0cmEoKTsKLSAg
ICAgICAgcGFpbnRDb2xsYXBzZWRCb3JkZXIoaS5wLCBfdHgsIF90eSwgdywgaCk7Ci0gICAgfQot
ICAgIGVsc2UKLSAgICAgICAgUmVuZGVyQmxvY2s6OnBhaW50T2JqZWN0KGksIF90eCwgX3R5ICsg
X3RvcEV4dHJhKTsKLQotI2lmZGVmIEJPWF9ERUJVRwotICAgIDo6b3V0bGluZUJveCggaS5wLCBf
dHgsIF90eSwgd2lkdGgoKSwgaGVpZ2h0KCkgKyBib3JkZXJUb3BFeHRyYSgpICsgYm9yZGVyQm90
dG9tRXh0cmEoKSk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIEVCb3JkZXJTdHlsZSBjb2xsYXBzZWRC
b3JkZXJTdHlsZShFQm9yZGVyU3R5bGUgc3R5bGUpCi17Ci0gICAgaWYgKHN0eWxlID09IE9VVFNF
VCkKLSAgICAgICAgc3R5bGUgPSBHUk9PVkU7Ci0gICAgZWxzZSBpZiAoc3R5bGUgPT0gSU5TRVQp
Ci0gICAgICAgIHN0eWxlID0gUklER0U7Ci0gICAgcmV0dXJuIHN0eWxlOwotfQotCi1zdHJ1Y3Qg
Q29sbGFwc2VkQm9yZGVyIHsKLSAgICBDb2xsYXBzZWRCb3JkZXIoKXt9Ci0gICAgCi0gICAgQ29s
bGFwc2VkQm9yZGVyVmFsdWUgYm9yZGVyOwotICAgIFJlbmRlck9iamVjdDo6Qm9yZGVyU2lkZSBz
aWRlOwotICAgIGJvb2wgc2hvdWxkUGFpbnQ7Ci0gICAgaW50IHgxOwotICAgIGludCB5MTsKLSAg
ICBpbnQgeDI7Ci0gICAgaW50IHkyOwotICAgIEVCb3JkZXJTdHlsZSBzdHlsZTsKLX07Ci0KLWNs
YXNzIENvbGxhcHNlZEJvcmRlcnMKLXsKLXB1YmxpYzoKLSAgICBDb2xsYXBzZWRCb3JkZXJzKGlu
dCBpKSA6Y291bnQoMCkge30KLSAgICAKLSAgICB2b2lkIGFkZEJvcmRlcihjb25zdCBDb2xsYXBz
ZWRCb3JkZXJWYWx1ZSYgYiwgUmVuZGVyT2JqZWN0OjpCb3JkZXJTaWRlIHMsIGJvb2wgcGFpbnQs
IAotICAgICAgICAgICAgICAgICAgIGludCBfeDEsIGludCBfeTEsIGludCBfeDIsIGludCBfeTIs
Ci0gICAgICAgICAgICAgICAgICAgRUJvcmRlclN0eWxlIF9zdHlsZSkKLSAgICB7Ci0gICAgICAg
IGlmIChiLmV4aXN0cygpICYmIHBhaW50KSB7Ci0gICAgICAgICAgICBib3JkZXJzW2NvdW50XS5i
b3JkZXIgPSBiOwotICAgICAgICAgICAgYm9yZGVyc1tjb3VudF0uc2lkZSA9IHM7Ci0gICAgICAg
ICAgICBib3JkZXJzW2NvdW50XS5zaG91bGRQYWludCA9IHBhaW50OwotICAgICAgICAgICAgYm9y
ZGVyc1tjb3VudF0ueDEgPSBfeDE7Ci0gICAgICAgICAgICBib3JkZXJzW2NvdW50XS54MiA9IF94
MjsKLSAgICAgICAgICAgIGJvcmRlcnNbY291bnRdLnkxID0gX3kxOwotICAgICAgICAgICAgYm9y
ZGVyc1tjb3VudF0ueTIgPSBfeTI7Ci0gICAgICAgICAgICBib3JkZXJzW2NvdW50XS5zdHlsZSA9
IF9zdHlsZTsKLSAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBD
b2xsYXBzZWRCb3JkZXIqIG5leHRCb3JkZXIoKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBp
IDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgaWYgKGJvcmRlcnNbaV0uYm9yZGVyLmV4aXN0
cygpICYmIGJvcmRlcnNbaV0uc2hvdWxkUGFpbnQpIHsKLSAgICAgICAgICAgICAgICBib3JkZXJz
W2ldLnNob3VsZFBhaW50ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICZib3JkZXJz
W2ldOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4g
MDsKLSAgICB9Ci0gICAgCi0gICAgQ29sbGFwc2VkQm9yZGVyIGJvcmRlcnNbNF07Ci0gICAgaW50
IGNvdW50OwotfTsKLQotc3RhdGljIHZvaWQgYWRkQm9yZGVyU3R5bGUoUVZhbHVlTGlzdDxDb2xs
YXBzZWRCb3JkZXJWYWx1ZT4mIGJvcmRlclN0eWxlcywgQ29sbGFwc2VkQm9yZGVyVmFsdWUgYm9y
ZGVyVmFsdWUpCi17Ci0gICAgaWYgKCFib3JkZXJWYWx1ZS5leGlzdHMoKSB8fCBib3JkZXJTdHls
ZXMuY29udGFpbnMoYm9yZGVyVmFsdWUpKQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgUVZh
bHVlTGlzdEl0ZXJhdG9yPENvbGxhcHNlZEJvcmRlclZhbHVlPiBpdCA9IGJvcmRlclN0eWxlcy5i
ZWdpbigpOwotICAgIFFWYWx1ZUxpc3RJdGVyYXRvcjxDb2xsYXBzZWRCb3JkZXJWYWx1ZT4gZW5k
ID0gYm9yZGVyU3R5bGVzLmVuZCgpOwotICAgIGZvciAoOyBpdCAhPSBlbmQ7ICsraXQpIHsKLSAg
ICAgICAgQ29sbGFwc2VkQm9yZGVyVmFsdWUgcmVzdWx0ID0gY29tcGFyZUJvcmRlcnMoKml0LCBi
b3JkZXJWYWx1ZSk7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gKml0KSB7Ci0gICAgICAgICAgICBi
b3JkZXJTdHlsZXMuaW5zZXJ0KGl0LCBib3JkZXJWYWx1ZSk7Ci0gICAgICAgICAgICByZXR1cm47
Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBib3JkZXJTdHlsZXMuYXBwZW5kKGJvcmRlclZhbHVl
KTsKLX0KLQotdm9pZCBSZW5kZXJUYWJsZUNlbGw6OmNvbGxlY3RCb3JkZXJzKFFWYWx1ZUxpc3Q8
Q29sbGFwc2VkQm9yZGVyVmFsdWU+JiBib3JkZXJTdHlsZXMpCi17Ci0gICAgYWRkQm9yZGVyU3R5
bGUoYm9yZGVyU3R5bGVzLCBjb2xsYXBzZWRMZWZ0Qm9yZGVyKCkpOwotICAgIGFkZEJvcmRlclN0
eWxlKGJvcmRlclN0eWxlcywgY29sbGFwc2VkUmlnaHRCb3JkZXIoKSk7Ci0gICAgYWRkQm9yZGVy
U3R5bGUoYm9yZGVyU3R5bGVzLCBjb2xsYXBzZWRUb3BCb3JkZXIoKSk7Ci0gICAgYWRkQm9yZGVy
U3R5bGUoYm9yZGVyU3R5bGVzLCBjb2xsYXBzZWRCb3R0b21Cb3JkZXIoKSk7Ci19Ci0KLXZvaWQg
UmVuZGVyVGFibGVDZWxsOjpwYWludENvbGxhcHNlZEJvcmRlcihRUGFpbnRlciogcCwgaW50IF90
eCwgaW50IF90eSwgaW50IHcsIGludCBoKQotewotICAgIGlmICghdGFibGUoKS0+Y3VycmVudEJv
cmRlclN0eWxlKCkpCi0gICAgICAgIHJldHVybjsKLSAgICAKLSAgICBDb2xsYXBzZWRCb3JkZXJW
YWx1ZSBsZWZ0VmFsID0gY29sbGFwc2VkTGVmdEJvcmRlcigpOwotICAgIENvbGxhcHNlZEJvcmRl
clZhbHVlIHJpZ2h0VmFsID0gY29sbGFwc2VkUmlnaHRCb3JkZXIoKTsKLSAgICBDb2xsYXBzZWRC
b3JkZXJWYWx1ZSB0b3BWYWwgPSBjb2xsYXBzZWRUb3BCb3JkZXIoKTsKLSAgICBDb2xsYXBzZWRC
b3JkZXJWYWx1ZSBib3R0b21WYWwgPSBjb2xsYXBzZWRCb3R0b21Cb3JkZXIoKTsKLSAgICAgCi0g
ICAgLy8gQWRqdXN0IG91ciB4L3kvd2lkdGgvaGVpZ2h0IHNvIHRoYXQgd2UgcGFpbnQgdGhlIGNv
bGxhcHNlZCBib3JkZXJzIGF0IHRoZSBjb3JyZWN0IGxvY2F0aW9uLgotICAgIGludCB0b3BXaWR0
aCA9IHRvcFZhbC53aWR0aCgpOwotICAgIGludCBib3R0b21XaWR0aCA9IGJvdHRvbVZhbC53aWR0
aCgpOwotICAgIGludCBsZWZ0V2lkdGggPSBsZWZ0VmFsLndpZHRoKCk7Ci0gICAgaW50IHJpZ2h0
V2lkdGggPSByaWdodFZhbC53aWR0aCgpOwotICAgIAotICAgIF90eCAtPSBsZWZ0V2lkdGggLyAy
OwotICAgIF90eSAtPSB0b3BXaWR0aCAvIDI7Ci0gICAgdyArPSBsZWZ0V2lkdGggLyAyICsgaW50
KHJpZ2h0V2lkdGggLyAyLjAgKyAwLjUpOwotICAgIGggKz0gdG9wV2lkdGggLyAyICsgaW50KGJv
dHRvbVdpZHRoIC8gMi4wICsgMC41KTsKLSAgICAKLSAgICBib29sIHR0ID0gdG9wVmFsLmlzVHJh
bnNwYXJlbnQoKTsKLSAgICBib29sIGJ0ID0gYm90dG9tVmFsLmlzVHJhbnNwYXJlbnQoKTsKLSAg
ICBib29sIHJ0ID0gcmlnaHRWYWwuaXNUcmFuc3BhcmVudCgpOwotICAgIGJvb2wgbHQgPSBsZWZ0
VmFsLmlzVHJhbnNwYXJlbnQoKTsKLSAgICAKLSAgICBFQm9yZGVyU3R5bGUgdHMgPSBjb2xsYXBz
ZWRCb3JkZXJTdHlsZSh0b3BWYWwuc3R5bGUoKSk7Ci0gICAgRUJvcmRlclN0eWxlIGJzID0gY29s
bGFwc2VkQm9yZGVyU3R5bGUoYm90dG9tVmFsLnN0eWxlKCkpOwotICAgIEVCb3JkZXJTdHlsZSBs
cyA9IGNvbGxhcHNlZEJvcmRlclN0eWxlKGxlZnRWYWwuc3R5bGUoKSk7Ci0gICAgRUJvcmRlclN0
eWxlIHJzID0gY29sbGFwc2VkQm9yZGVyU3R5bGUocmlnaHRWYWwuc3R5bGUoKSk7Ci0gICAgCi0g
ICAgYm9vbCByZW5kZXJfdCA9IHRzID4gQkhJRERFTiAmJiAhdHQ7Ci0gICAgYm9vbCByZW5kZXJf
bCA9IGxzID4gQkhJRERFTiAmJiAhbHQ7Ci0gICAgYm9vbCByZW5kZXJfciA9IHJzID4gQkhJRERF
TiAmJiAhcnQ7Ci0gICAgYm9vbCByZW5kZXJfYiA9IGJzID4gQkhJRERFTiAmJiAhYnQ7Ci0KLSAg
ICAvLyBXZSBuZXZlciBwYWludCBkaWFnb25hbHMgYXQgdGhlIGpvaW5zLiAgV2Ugc2ltcGx5IGxl
dCB0aGUgYm9yZGVyIHdpdGggdGhlIGhpZ2hlc3QKLSAgICAvLyBwcmVjZWRlbmNlIHBhaW50IG9u
IHRvcCBvZiBib3JkZXJzIHdpdGggbG93ZXIgcHJlY2VkZW5jZS4gIAotICAgIENvbGxhcHNlZEJv
cmRlcnMgYm9yZGVycyg0KTsKLSAgICBib3JkZXJzLmFkZEJvcmRlcih0b3BWYWwsIEJTVG9wLCBy
ZW5kZXJfdCwgX3R4LCBfdHksIF90eCArIHcsIF90eSArIHRvcFdpZHRoLCB0cyk7Ci0gICAgYm9y
ZGVycy5hZGRCb3JkZXIoYm90dG9tVmFsLCBCU0JvdHRvbSwgcmVuZGVyX2IsIF90eCwgX3R5ICsg
aCAtIGJvdHRvbVdpZHRoLCBfdHggKyB3LCBfdHkgKyBoLCBicyk7Ci0gICAgYm9yZGVycy5hZGRC
b3JkZXIobGVmdFZhbCwgQlNMZWZ0LCByZW5kZXJfbCwgX3R4LCBfdHksIF90eCArIGxlZnRXaWR0
aCwgX3R5ICsgaCwgbHMpOwotICAgIGJvcmRlcnMuYWRkQm9yZGVyKHJpZ2h0VmFsLCBCU1JpZ2h0
LCByZW5kZXJfciwgX3R4ICsgdyAtIHJpZ2h0V2lkdGgsIF90eSwgX3R4ICsgdywgX3R5ICsgaCwg
cnMpOwotICAgIAotICAgIGZvciAoQ29sbGFwc2VkQm9yZGVyKiBib3JkZXIgPSBib3JkZXJzLm5l
eHRCb3JkZXIoKTsgYm9yZGVyOyBib3JkZXIgPSBib3JkZXJzLm5leHRCb3JkZXIoKSkgewotICAg
ICAgICBpZiAoYm9yZGVyLT5ib3JkZXIgPT0gKnRhYmxlKCktPmN1cnJlbnRCb3JkZXJTdHlsZSgp
KQotICAgICAgICAgICAgZHJhd0JvcmRlcihwLCBib3JkZXItPngxLCBib3JkZXItPnkxLCBib3Jk
ZXItPngyLCBib3JkZXItPnkyLCBib3JkZXItPnNpZGUsIAotICAgICAgICAgICAgICAgICAgICAg
ICBib3JkZXItPmJvcmRlci5jb2xvcigpLCBzdHlsZSgpLT5jb2xvcigpLCBib3JkZXItPnN0eWxl
LCAwLCAwKTsKLSAgICB9Ci19Ci0KLUludFJlY3QgUmVuZGVyVGFibGVDZWxsOjpnZXRBYnNvbHV0
ZVJlcGFpbnRSZWN0KCkKLXsKLSAgICBpbnQgb3cgPSBzdHlsZSgpID8gc3R5bGUoKS0+b3V0bGlu
ZVNpemUoKSA6IDA7Ci0gICAgSW50UmVjdCByKC1vdywgLW93IC0gYm9yZGVyVG9wRXh0cmEoKSwg
Ci0gICAgICAgICAgICBvdmVyZmxvd1dpZHRoKGZhbHNlKSArIG93ICogMiwgb3ZlcmZsb3dIZWln
aHQoZmFsc2UpICsgYm9yZGVyVG9wRXh0cmEoKSArIGJvcmRlckJvdHRvbUV4dHJhKCkgKyBvdyAq
IDIpOwotICAgIGNvbXB1dGVBYnNvbHV0ZVJlcGFpbnRSZWN0KHIpOwotICAgIHJldHVybiByOwot
fQotCi12b2lkIFJlbmRlclRhYmxlQ2VsbDo6cGFpbnRCb3hEZWNvcmF0aW9ucyhQYWludEluZm8m
IGksIGludCBfdHgsIGludCBfdHkpCi17Ci0gICAgUmVuZGVyVGFibGUqIHRhYmxlRWx0ID0gdGFi
bGUoKTsKLSAgICBpZiAoIXRhYmxlRWx0LT5jb2xsYXBzZUJvcmRlcnMoKSAmJiBzdHlsZSgpLT5l
bXB0eUNlbGxzKCkgPT0gSElERSAmJiAhZmlyc3RDaGlsZCgpKQotICAgICAgICByZXR1cm47Ci0g
ICAgCi0gICAgaW50IHcgPSB3aWR0aCgpOwotICAgIGludCBoID0gaGVpZ2h0KCkgKyBib3JkZXJU
b3BFeHRyYSgpICsgYm9yZGVyQm90dG9tRXh0cmEoKTsKLSAgICBfdHkgLT0gYm9yZGVyVG9wRXh0
cmEoKTsKLQotICAgIFFDb2xvciBjID0gc3R5bGUoKS0+YmFja2dyb3VuZENvbG9yKCk7Ci0gICAg
aWYgKCFjLmlzVmFsaWQoKSAmJiBwYXJlbnQoKSkgLy8gdGFrZSBmcm9tIHJvdwotICAgICAgICBj
ID0gcGFyZW50KCktPnN0eWxlKCktPmJhY2tncm91bmRDb2xvcigpOwotICAgIGlmICghYy5pc1Zh
bGlkKCkgJiYgcGFyZW50KCkgJiYgcGFyZW50KCktPnBhcmVudCgpKSAvLyB0YWtlIGZyb20gcm93
Z3JvdXAKLSAgICAgICAgYyA9IHBhcmVudCgpLT5wYXJlbnQoKS0+c3R5bGUoKS0+YmFja2dyb3Vu
ZENvbG9yKCk7Ci0gICAgaWYgKCFjLmlzVmFsaWQoKSkgewotCS8vIHNlZSBpZiB3ZSBoYXZlIGEg
Y29sIG9yIGNvbGdyb3VwIGZvciB0aGlzCi0JUmVuZGVyVGFibGVDb2wgKmNvbCA9IHRhYmxlKCkt
PmNvbEVsZW1lbnQoX2NvbCk7Ci0JaWYgKGNvbCkgewotCSAgICBjID0gY29sLT5zdHlsZSgpLT5i
YWNrZ3JvdW5kQ29sb3IoKTsKLQkgICAgaWYgKCFjLmlzVmFsaWQoKSkgewotCQkvLyB0cnkgY29s
dW1uIGdyb3VwCi0JCVJlbmRlclN0eWxlICpzdHlsZSA9IGNvbC0+cGFyZW50KCktPnN0eWxlKCk7
Ci0JCWlmIChzdHlsZS0+ZGlzcGxheSgpID09IFRBQkxFX0NPTFVNTl9HUk9VUCkKLQkJICAgIGMg
PSBzdHlsZS0+YmFja2dyb3VuZENvbG9yKCk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gICAgLy8g
RklYTUU6IFRoaXMgY29kZSBpcyBqdXN0IHBsYWluIHdyb25nLiAgUm93cyBhbmQgY29sdW1ucyBz
aG91bGQgcGFpbnQgdGhlaXIgYmFja2dyb3VuZHMKLSAgICAvLyBpbmRlcGVuZGVudCBmcm9tIHRo
ZSBjZWxsLgotICAgIC8vICMjIyBnZXQgb2Zmc2V0cyByaWdodCBpbiBjYXNlIHRoZSBiZ2ltYWdl
IGlzIGluaGVyaXRlZC4KLSAgICBjb25zdCBCYWNrZ3JvdW5kTGF5ZXIqIGJnTGF5ZXIgPSBzdHls
ZSgpLT5iYWNrZ3JvdW5kTGF5ZXJzKCk7Ci0gICAgaWYgKCFiZ0xheWVyLT5oYXNJbWFnZSgpICYm
IHBhcmVudCgpKQotICAgICAgICBiZ0xheWVyID0gcGFyZW50KCktPnN0eWxlKCktPmJhY2tncm91
bmRMYXllcnMoKTsKLSAgICBpZiAoIWJnTGF5ZXItPmhhc0ltYWdlKCkgJiYgcGFyZW50KCkgJiYg
cGFyZW50KCktPnBhcmVudCgpKQotICAgICAgICBiZ0xheWVyID0gcGFyZW50KCktPnBhcmVudCgp
LT5zdHlsZSgpLT5iYWNrZ3JvdW5kTGF5ZXJzKCk7Ci0gICAgaWYgKCFiZ0xheWVyLT5oYXNJbWFn
ZSgpKSB7Ci0JLy8gc2VlIGlmIHdlIGhhdmUgYSBjb2wgb3IgY29sZ3JvdXAgZm9yIHRoaXMKLQlS
ZW5kZXJUYWJsZUNvbCogY29sID0gdGFibGUoKS0+Y29sRWxlbWVudChfY29sKTsKLQlpZiAoY29s
KSB7Ci0JICAgIGJnTGF5ZXIgPSBjb2wtPnN0eWxlKCktPmJhY2tncm91bmRMYXllcnMoKTsKLQkg
ICAgaWYgKCFiZ0xheWVyLT5oYXNJbWFnZSgpKSB7Ci0JCS8vIHRyeSBjb2x1bW4gZ3JvdXAKLQkJ
UmVuZGVyU3R5bGUgKnN0eWxlID0gY29sLT5wYXJlbnQoKS0+c3R5bGUoKTsKLQkJaWYgKHN0eWxl
LT5kaXNwbGF5KCkgPT0gVEFCTEVfQ09MVU1OX0dST1VQKQotCQkgICAgYmdMYXllciA9IHN0eWxl
LT5iYWNrZ3JvdW5kTGF5ZXJzKCk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gICAgaW50IG15ID0g
a01heChfdHksIGkuci55KCkpOwotICAgIGludCBlbmQgPSBrTWluKGkuci55KCkgKyBpLnIuaGVp
Z2h0KCksIF90eSArIGgpOwotICAgIGludCBtaCA9IGVuZCAtIG15OwotCi0gICAgaWYgKGJnTGF5
ZXItPmhhc0ltYWdlKCkgfHwgYy5pc1ZhbGlkKCkpIHsKLQkvLyBXZSBoYXZlIHRvIGNsaXAgaGVy
ZSBiZWNhdXNlIHRoZSBiYWNrcm91bmQgd291bGQgcGFpbnQKLSAgICAgICAgLy8gb24gdG9wIG9m
IHRoZSBib3JkZXJzIG90aGVyd2lzZS4KLSAgICAgICAgaWYgKG1fbGF5ZXIgJiYgdGFibGVFbHQt
PmNvbGxhcHNlQm9yZGVycygpKSB7Ci0gICAgICAgICAgICBJbnRSZWN0IGNsaXBSZWN0KF90eCAr
IGJvcmRlckxlZnQoKSwgX3R5ICsgYm9yZGVyVG9wKCksIHcgLSBib3JkZXJMZWZ0KCkgLSBib3Jk
ZXJSaWdodCgpLCBoIC0gYm9yZGVyVG9wKCkgLSBib3JkZXJCb3R0b20oKSk7Ci0gICAgICAgICAg
ICBjbGlwUmVjdCA9IGkucC0+eEZvcm0oY2xpcFJlY3QpOwotICAgICAgICAgICAgaS5wLT5zYXZl
KCk7Ci0gICAgICAgICAgICBpLnAtPmFkZENsaXAoY2xpcFJlY3QpOwotICAgICAgICB9Ci0gICAg
ICAgIHBhaW50QmFja2dyb3VuZChpLnAsIGMsIGJnTGF5ZXIsIG15LCBtaCwgX3R4LCBfdHksIHcs
IGgpOwotICAgICAgICBpZiAobV9sYXllciAmJiB0YWJsZUVsdC0+Y29sbGFwc2VCb3JkZXJzKCkp
Ci0gICAgICAgICAgICBpLnAtPnJlc3RvcmUoKTsKLSAgICB9Ci0KLSAgICBpZiAoc3R5bGUoKS0+
aGFzQm9yZGVyKCkgJiYgIXRhYmxlRWx0LT5jb2xsYXBzZUJvcmRlcnMoKSkKLSAgICAgICAgcGFp
bnRCb3JkZXIoaS5wLCBfdHgsIF90eSwgdywgaCwgc3R5bGUoKSk7Ci19Ci0KLQotI2lmbmRlZiBO
REVCVUcKLXZvaWQgUmVuZGVyVGFibGVDZWxsOjpkdW1wKFFUZXh0U3RyZWFtICpzdHJlYW0sIFFT
dHJpbmcgaW5kKSBjb25zdAotewotICAgICpzdHJlYW0gPDwgIiByb3c9IiA8PCBfcm93OwotICAg
ICpzdHJlYW0gPDwgIiBjb2w9IiA8PCBfY29sOwotICAgICpzdHJlYW0gPDwgIiByU3Bhbj0iIDw8
IHJTcGFuOwotICAgICpzdHJlYW0gPDwgIiBjU3Bhbj0iIDw8IGNTcGFuOwotLy8gICAgKnN0cmVh
bSA8PCAiIG5XcmFwPSIgPDwgbldyYXA7Ci0KLSAgICBSZW5kZXJCbG9jazo6ZHVtcChzdHJlYW0s
aW5kKTsKLX0KLSNlbmRpZgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVJlbmRlclRhYmxlQ29s
OjpSZW5kZXJUYWJsZUNvbChET006Ok5vZGVJbXBsKiBub2RlKQotICAgIDogUmVuZGVyQ29udGFp
bmVyKG5vZGUpCi17Ci0gICAgLy8gaW5pdCBSZW5kZXJPYmplY3QgYXR0cmlidXRlcwotICAgIHNl
dElubGluZSh0cnVlKTsgICAvLyBvdXIgb2JqZWN0IGlzIG5vdCBJbmxpbmUKLQotICAgIF9zcGFu
ID0gMTsKLSAgICB1cGRhdGVGcm9tRWxlbWVudCgpOwotfQotCi12b2lkIFJlbmRlclRhYmxlQ29s
Ojp1cGRhdGVGcm9tRWxlbWVudCgpCi17Ci0gICAgaW50IG9sZFNwYW4gPSBfc3BhbjsKLSAgICBE
T006Ok5vZGVJbXBsICpub2RlID0gZWxlbWVudCgpOwotICAgIGlmIChub2RlICYmIChub2RlLT5o
YXNUYWdOYW1lKGNvbFRhZykgfHwgbm9kZS0+aGFzVGFnTmFtZShjb2xncm91cFRhZykpKSB7Ci0g
ICAgICAgIERPTTo6SFRNTFRhYmxlQ29sRWxlbWVudEltcGwgKnRjID0gc3RhdGljX2Nhc3Q8RE9N
OjpIVE1MVGFibGVDb2xFbGVtZW50SW1wbCAqPihub2RlKTsKLSAgICAgICAgX3NwYW4gPSB0Yy0+
c3BhbigpOwotICAgIH0gZWxzZQotICAgICAgX3NwYW4gPSAhKHN0eWxlKCkgJiYgc3R5bGUoKS0+
ZGlzcGxheSgpID09IFRBQkxFX0NPTFVNTl9HUk9VUCk7Ci0gICAgaWYgKF9zcGFuICE9IG9sZFNw
YW4gJiYgc3R5bGUoKSAmJiBwYXJlbnQoKSkKLSAgICAgICAgc2V0TmVlZHNMYXlvdXRBbmRNaW5N
YXhSZWNhbGMoKTsKLX0KLQotYm9vbCBSZW5kZXJUYWJsZUNvbDo6Y2FuSGF2ZUNoaWxkcmVuKCkg
Y29uc3QKLXsKLSAgICAvLyBjb2xzIGNhbm5vdCBoYXZlIGNoaWxkcmVuLiAgVGhpcyBpcyBhY3R1
YWxseSBuZWNlc3NhcnkgdG8gZml4IGEgYnVnCi0gICAgLy8gd2l0aCBsaWJyYXJpZXMudWMuZWR1
LCB3aGljaCBtYWtlcyBhIDxwPiBiZSBhIHRhYmxlLWNvbHVtbi4KLSAgICByZXR1cm4gc3R5bGUo
KS0+ZGlzcGxheSgpID09IFRBQkxFX0NPTFVNTl9HUk9VUDsKLX0KLQotdm9pZCBSZW5kZXJUYWJs
ZUNvbDo6YWRkQ2hpbGQoUmVuZGVyT2JqZWN0ICpjaGlsZCwgUmVuZGVyT2JqZWN0ICpiZWZvcmVD
aGlsZCkKLXsKLSAgICBLSFRNTEFzc2VydChjaGlsZC0+c3R5bGUoKS0+ZGlzcGxheSgpID09IFRB
QkxFX0NPTFVNTik7Ci0KLSAgICAvLyB0aGVzZSBoYXZlIHRvIGNvbWUgYmVmb3JlIHRoZSB0YWJs
ZSBkZWZpbml0aW9uIQotICAgIFJlbmRlckNvbnRhaW5lcjo6YWRkQ2hpbGQoY2hpbGQsIGJlZm9y
ZUNoaWxkKTsKLX0KLQotI2lmbmRlZiBOREVCVUcKLXZvaWQgUmVuZGVyVGFibGVDb2w6OmR1bXAo
UVRleHRTdHJlYW0gKnN0cmVhbSwgUVN0cmluZyBpbmQpIGNvbnN0Ci17Ci0gICAgKnN0cmVhbSA8
PCAiIF9zcGFuPSIgPDwgX3NwYW47Ci0gICAgUmVuZGVyQ29udGFpbmVyOjpkdW1wKHN0cmVhbSwg
aW5kKTsKLX0KLSNlbmRpZgotCi0jdW5kZWYgVEFCTEVfREVCVUcKLSN1bmRlZiBERUJVR19MQVlP
VVQKLSN1bmRlZiBCT1hfREVCVUcKSW5kZXg6IHJlbmRlcmluZy9yZW5kZXJfYm94LmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSByZW5kZXJpbmcvcmVuZGVyX2JveC5jcHAJKHJldmlzaW9uIDEyMjUzKQorKysg
cmVuZGVyaW5nL3JlbmRlcl9ib3guY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yMywyMSArMjMsMTgg
QEAKICAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgogICoKICAqLwotLy8gLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLQotLy8jZGVmaW5lIERFQlVHX0xBWU9VVAotCiAKICNpbmNsdWRlICJjb25maWcuaCIK
ICNpbmNsdWRlIDxxcGFpbnRlci5oPgogI2luY2x1ZGUgPHFwZW4uaD4KIAotI2luY2x1ZGUgInJl
bmRlcmluZy9yZW5kZXJfYm94LmgiCi0jaW5jbHVkZSAicmVuZGVyaW5nL3JlbmRlcl9yZXBsYWNl
ZC5oIgotI2luY2x1ZGUgInJlbmRlcmluZy9yZW5kZXJfY2FudmFzLmgiCi0jaW5jbHVkZSAicmVu
ZGVyaW5nL3JlbmRlcl90YWJsZS5oIgorI2luY2x1ZGUgInJlbmRlcl9ib3guaCIKKyNpbmNsdWRl
ICJyZW5kZXJfcmVwbGFjZWQuaCIKKyNpbmNsdWRlICJyZW5kZXJfY2FudmFzLmgiCiAjaW5jbHVk
ZSAicmVuZGVyX2ZsZXhib3guaCIKICNpbmNsdWRlICJyZW5kZXJfYXJlbmEuaCIKICNpbmNsdWRl
ICJyZW5kZXJfdGhlbWUuaCIKKyNpbmNsdWRlICJSZW5kZXJUYWJsZUNlbGwuaCIKIAogI2luY2x1
ZGUgIkRvY3VtZW50SW1wbC5oIgogI2luY2x1ZGUgIkhUTUxFbGVtZW50SW1wbC5oIgpJbmRleDog
cmVuZGVyaW5nL1JlbmRlclRhYmxlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSByZW5kZXJpbmcvUmVuZGVy
VGFibGUuY3BwCShyZXZpc2lvbiAxMjI1MykKKysrIHJlbmRlcmluZy9SZW5kZXJUYWJsZS5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTYsNyArNiw3IEBACiAgKiAgICAgICAgICAgKEMpIDE5OTggV2Fs
ZG8gQmFzdGlhbiAoYmFzdGlhbkBrZGUub3JnKQogICogICAgICAgICAgIChDKSAxOTk5IExhcnMg
S25vbGwgKGtub2xsQGtkZS5vcmcpCiAgKiAgICAgICAgICAgKEMpIDE5OTkgQW50dGkgS29pdmlz
dG8gKGtvaXZpc3RvQGtkZS5vcmcpCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDMgQXBwbGUgQ29tcHV0
ZXIsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiBBcHBsZSBD
b21wdXRlciwgSW5jLgogICoKICAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3Ug
Y2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMg
b2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCkBAIC0yNCwyOCArMjQsMjEgQEAKICAq
IEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgogICovCiAKLS8vI2RlZmluZSBUQUJMRV9ERUJV
RwotLy8jZGVmaW5lIFRBQkxFX1BSSU5UCi0vLyNkZWZpbmUgREVCVUdfTEFZT1VUCi0vLyNkZWZp
bmUgQk9YX0RFQlVHCiAjaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAicmVuZGVyaW5nL3Jl
bmRlcl90YWJsZS5oIgotI2luY2x1ZGUgInJlbmRlcmluZy90YWJsZV9sYXlvdXQuaCIKLSNpbmNs
dWRlICJodG1sL2h0bWxfdGFibGVpbXBsLmgiCi0jaW5jbHVkZSAiaHRtbG5hbWVzLmgiCisjaW5j
bHVkZSAiUmVuZGVyVGFibGUuaCIKKyNpbmNsdWRlICJSZW5kZXJUYWJsZVNlY3Rpb24uaCIKKyNp
bmNsdWRlICJSZW5kZXJUYWJsZUNvbC5oIgorI2luY2x1ZGUgIlJlbmRlclRhYmxlQ2VsbC5oIgog
I2luY2x1ZGUgIkRvY3VtZW50SW1wbC5oIgorI2luY2x1ZGUgInRhYmxlX2xheW91dC5oIgorI2lu
Y2x1ZGUgImh0bWxuYW1lcy5oIgorI2luY2x1ZGUgPHF0ZXh0c3RyZWFtLmg+CiAKLSNpbmNsdWRl
IDxxYXBwbGljYXRpb24uaD4KLSNpbmNsdWRlIDxxc3R5bGUuaD4KLQotI2luY2x1ZGUgPGtkZWJ1
Zy5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgorbmFtZXNwYWNlIFdlYkNvcmUgewogCi11c2luZyBu
YW1lc3BhY2Uga2h0bWw7Ci11c2luZyBuYW1lc3BhY2UgRE9NOwogdXNpbmcgbmFtZXNwYWNlIEhU
TUxOYW1lczsKIAotUmVuZGVyVGFibGU6OlJlbmRlclRhYmxlKERPTTo6Tm9kZUltcGwqIG5vZGUp
CitSZW5kZXJUYWJsZTo6UmVuZGVyVGFibGUoTm9kZUltcGwqIG5vZGUpCiAgICAgOiBSZW5kZXJC
bG9jayhub2RlKQogewogICAgIHRDYXB0aW9uID0gMDsKQEAgLTcyNiw3ICs3MTksOCBAQCBSZW5k
ZXJCbG9jayogUmVuZGVyVGFibGU6OmZpcnN0TGluZUJsb2NrCiB9CiAKIHZvaWQgUmVuZGVyVGFi
bGU6OnVwZGF0ZUZpcnN0TGV0dGVyKCkKLXt9Cit7Cit9CiAKICNpZm5kZWYgTkRFQlVHCiB2b2lk
IFJlbmRlclRhYmxlOjpkdW1wKFFUZXh0U3RyZWFtICpzdHJlYW0sIFFTdHJpbmcgaW5kKSBjb25z
dApAQCAtNzQ3LDE1MTIgKzc0MSw0IEBAIHZvaWQgUmVuZGVyVGFibGU6OmR1bXAoUVRleHRTdHJl
YW0gKnN0cmUKIH0KICNlbmRpZgogCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1SZW5kZXJUYWJs
ZVNlY3Rpb246OlJlbmRlclRhYmxlU2VjdGlvbihET006Ok5vZGVJbXBsKiBub2RlKQotICAgIDog
UmVuZGVyQ29udGFpbmVyKG5vZGUpCi17Ci0gICAgLy8gaW5pdCBSZW5kZXJPYmplY3QgYXR0cmli
dXRlcwotICAgIHNldElubGluZShmYWxzZSk7ICAgLy8gb3VyIG9iamVjdCBpcyBub3QgSW5saW5l
Ci0gICAgZ3JpZFJvd3MgPSAwOwotICAgIGNDb2wgPSAwOwotICAgIGNSb3cgPSAtMTsKLSAgICBu
ZWVkQ2VsbFJlY2FsYyA9IGZhbHNlOwotfQotCi1SZW5kZXJUYWJsZVNlY3Rpb246On5SZW5kZXJU
YWJsZVNlY3Rpb24oKQotewotICAgIGNsZWFyR3JpZCgpOwotfQotCi12b2lkIFJlbmRlclRhYmxl
U2VjdGlvbjo6ZGVzdHJveSgpCi17Ci0gICAgLy8gcmVjYWxjIGNlbGwgaW5mbyBiZWNhdXNlIFJl
bmRlclRhYmxlIGhhcyB1bmd1YXJkZWQgcG9pbnRlcnMKLSAgICAvLyBzdG9yZWQgdGhhdCBwb2lu
dCB0byB0aGlzIFJlbmRlclRhYmxlU2VjdGlvbi4KLSAgICBpZiAodGFibGUoKSkKLSAgICAgICAg
dGFibGUoKS0+c2V0TmVlZFNlY3Rpb25SZWNhbGMoKTsKLQotICAgIFJlbmRlckNvbnRhaW5lcjo6
ZGVzdHJveSgpOwotfQotCi12b2lkIFJlbmRlclRhYmxlU2VjdGlvbjo6c2V0U3R5bGUoUmVuZGVy
U3R5bGUqIF9zdHlsZSkKLXsKLSAgICAvLyB3ZSBkb24ndCBhbGxvdyBjaGFuZ2luZyB0aGlzIG9u
ZQotICAgIGlmIChzdHlsZSgpKQotICAgICAgICBfc3R5bGUtPnNldERpc3BsYXkoc3R5bGUoKS0+
ZGlzcGxheSgpKTsKLSAgICBlbHNlIGlmIChfc3R5bGUtPmRpc3BsYXkoKSAhPSBUQUJMRV9GT09U
RVJfR1JPVVAgJiYgX3N0eWxlLT5kaXNwbGF5KCkgIT0gVEFCTEVfSEVBREVSX0dST1VQKQotICAg
ICAgICBfc3R5bGUtPnNldERpc3BsYXkoVEFCTEVfUk9XX0dST1VQKTsKLQotICAgIFJlbmRlckNv
bnRhaW5lcjo6c2V0U3R5bGUoX3N0eWxlKTsKLX0KLQotdm9pZCBSZW5kZXJUYWJsZVNlY3Rpb246
OmFkZENoaWxkKFJlbmRlck9iamVjdCAqY2hpbGQsIFJlbmRlck9iamVjdCAqYmVmb3JlQ2hpbGQp
Ci17Ci0gICAgUmVuZGVyT2JqZWN0ICpyb3cgPSBjaGlsZDsKLQotICAgIGlmIChjaGlsZC0+ZWxl
bWVudCgpICYmIGNoaWxkLT5lbGVtZW50KCktPmhhc1RhZ05hbWUoZm9ybVRhZykpIHsKLSAgICAg
ICAgUmVuZGVyQ29udGFpbmVyOjphZGRDaGlsZChjaGlsZCxiZWZvcmVDaGlsZCk7Ci0gICAgICAg
IHJldHVybjsKLSAgICB9Ci0gICAgCi0gICAgaWYgKCFjaGlsZC0+aXNUYWJsZVJvdygpKSB7Ci0K
LSAgICAgICAgaWYgKCFiZWZvcmVDaGlsZCkKLSAgICAgICAgICAgIGJlZm9yZUNoaWxkID0gbGFz
dENoaWxkKCk7Ci0KLSAgICAgICAgaWYgKGJlZm9yZUNoaWxkICYmIGJlZm9yZUNoaWxkLT5pc0Fu
b255bW91cygpKQotICAgICAgICAgICAgcm93ID0gYmVmb3JlQ2hpbGQ7Ci0gICAgICAgIGVsc2Ug
ewotCSAgICBSZW5kZXJPYmplY3QgKmxhc3RCb3ggPSBiZWZvcmVDaGlsZDsKLQkgICAgd2hpbGUg
KGxhc3RCb3ggJiYgbGFzdEJveC0+cGFyZW50KCktPmlzQW5vbnltb3VzKCkgJiYgIWxhc3RCb3gt
PmlzVGFibGVSb3coKSkKLQkJbGFzdEJveCA9IGxhc3RCb3gtPnBhcmVudCgpOwotCSAgICBpZiAo
bGFzdEJveCAmJiBsYXN0Qm94LT5pc0Fub255bW91cygpKSB7Ci0JCWxhc3RCb3gtPmFkZENoaWxk
KCBjaGlsZCwgYmVmb3JlQ2hpbGQgKTsKLQkJcmV0dXJuOwotCSAgICB9IGVsc2UgewotCQlyb3cg
PSBuZXcgKHJlbmRlckFyZW5hKCkpIFJlbmRlclRhYmxlUm93KGRvY3VtZW50KCkgLyogYW5vbnlt
b3VzIHRhYmxlICovKTsKLQkJUmVuZGVyU3R5bGUgKm5ld1N0eWxlID0gbmV3IChyZW5kZXJBcmVu
YSgpKSBSZW5kZXJTdHlsZSgpOwotCQluZXdTdHlsZS0+aW5oZXJpdEZyb20oc3R5bGUoKSk7Ci0J
CW5ld1N0eWxlLT5zZXREaXNwbGF5KFRBQkxFX1JPVyk7Ci0JCXJvdy0+c2V0U3R5bGUobmV3U3R5
bGUpOwotCQlhZGRDaGlsZChyb3csIGJlZm9yZUNoaWxkKTsKLQkgICAgfQotICAgICAgICB9Ci0g
ICAgICAgIHJvdy0+YWRkQ2hpbGQoY2hpbGQpOwotICAgICAgICBjaGlsZC0+c2V0TmVlZHNMYXlv
dXRBbmRNaW5NYXhSZWNhbGMoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChi
ZWZvcmVDaGlsZCkKLQlzZXROZWVkQ2VsbFJlY2FsYygpOwotCi0gICAgY1JvdysrOwotICAgIGND
b2wgPSAwOwotCi0gICAgZW5zdXJlUm93cyhjUm93KzEpOwotCi0gICAgaWYgKCFiZWZvcmVDaGls
ZCkgewotICAgICAgICBncmlkW2NSb3ddLmhlaWdodCA9IGNoaWxkLT5zdHlsZSgpLT5oZWlnaHQo
KTsKLSAgICAgICAgaWYgKGdyaWRbY1Jvd10uaGVpZ2h0LnR5cGUgPT0gUmVsYXRpdmUpCi0gICAg
ICAgICAgICBncmlkW2NSb3ddLmhlaWdodCA9IExlbmd0aCgpOwotICAgIH0KLQotCi0gICAgUmVu
ZGVyQ29udGFpbmVyOjphZGRDaGlsZChjaGlsZCxiZWZvcmVDaGlsZCk7Ci19Ci0KLWJvb2wgUmVu
ZGVyVGFibGVTZWN0aW9uOjplbnN1cmVSb3dzKGludCBudW1Sb3dzKQotewotICAgIGludCBuUm93
cyA9IGdyaWRSb3dzOwotICAgIGlmIChudW1Sb3dzID4gblJvd3MpIHsKLSAgICAgICAgaWYgKG51
bVJvd3MgPiBzdGF0aWNfY2FzdDxpbnQ+KGdyaWQuc2l6ZSgpKSkKLSAgICAgICAgICAgIGlmICgh
Z3JpZC5yZXNpemUobnVtUm93cyoyKzEpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
LQotICAgICAgICBncmlkUm93cyA9IG51bVJvd3M7Ci0gICAgICAgIGludCBuQ29scyA9IHRhYmxl
KCktPm51bUVmZkNvbHMoKTsKLSAgICAgICAgQ2VsbFN0cnVjdCBlbXB0eUNlbGxTdHJ1Y3Q7Ci0g
ICAgICAgIGVtcHR5Q2VsbFN0cnVjdC5jZWxsID0gMDsKLSAgICAgICAgZW1wdHlDZWxsU3RydWN0
LmluQ29sU3BhbiA9IGZhbHNlOwotCWZvciAoaW50IHIgPSBuUm93czsgciA8IG51bVJvd3M7IHIr
KykgewotCSAgICBncmlkW3JdLnJvdyA9IG5ldyBSb3cobkNvbHMpOwotCSAgICBncmlkW3JdLnJv
dy0+ZmlsbChlbXB0eUNlbGxTdHJ1Y3QpOwotCSAgICBncmlkW3JdLmJhc2VMaW5lID0gMDsKLQkg
ICAgZ3JpZFtyXS5oZWlnaHQgPSBMZW5ndGgoKTsKLQl9Ci0gICAgfQotCi0gICAgcmV0dXJuIHRy
dWU7Ci19Ci0KLXZvaWQgUmVuZGVyVGFibGVTZWN0aW9uOjphZGRDZWxsKFJlbmRlclRhYmxlQ2Vs
bCAqY2VsbCkKLXsKLSAgICBpbnQgclNwYW4gPSBjZWxsLT5yb3dTcGFuKCk7Ci0gICAgaW50IGNT
cGFuID0gY2VsbC0+Y29sU3BhbigpOwotICAgIEFycmF5PFJlbmRlclRhYmxlOjpDb2x1bW5TdHJ1
Y3Q+ICZjb2x1bW5zID0gdGFibGUoKS0+Y29sdW1uczsKLSAgICBpbnQgbkNvbHMgPSBjb2x1bW5z
LnNpemUoKTsKLQotICAgIC8vICMjIyBtb3ppbGxhIHN0aWxsIHNlZW1zIHRvIGRvIHRoZSBvbGQg
SFRNTCB3YXksIGV2ZW4gZm9yIHN0cmljdCBEVEQKLSAgICAvLyAoc2VlIHRoZSBhbm5vdGF0aW9u
IG9uIHRhYmxlIGNlbGwgbGF5b3V0aW5nIGluIHRoZSBDU1Mgc3BlY3MgYW5kIHRoZSB0ZXN0Y2Fz
ZSBiZWxvdzoKLSAgICAvLyA8VEFCTEUgYm9yZGVyPgotICAgIC8vIDxUUj48VEQ+MSA8VEQgcm93
c3Bhbj0iMiI+MiA8VEQ+MyA8VEQ+NAotICAgIC8vIDxUUj48VEQgY29sc3Bhbj0iMiI+NQotICAg
IC8vIDwvVEFCTEU+Ci0KLSAgICB3aGlsZSAoY0NvbCA8IG5Db2xzICYmIChjZWxsQXQoY1Jvdywg
Y0NvbCkuY2VsbCB8fCBjZWxsQXQoY1JvdywgY0NvbCkuaW5Db2xTcGFuKSkKLQljQ29sKys7Ci0K
LSAgICBpZiAoclNwYW4gPT0gMSkgewotCS8vIHdlIGlnbm9yZSBoZWlnaHQgc2V0dGluZ3Mgb24g
cm93c3BhbiBjZWxscwotCUxlbmd0aCBoZWlnaHQgPSBjZWxsLT5zdHlsZSgpLT5oZWlnaHQoKTsK
LQlpZiAoaGVpZ2h0LnZhbHVlID4gMCB8fCAoaGVpZ2h0LnR5cGUgPT0gUmVsYXRpdmUgJiYgaGVp
Z2h0LnZhbHVlID49IDApKSB7Ci0JICAgIExlbmd0aCBjUm93SGVpZ2h0ID0gZ3JpZFtjUm93XS5o
ZWlnaHQ7Ci0JICAgIHN3aXRjaCAoaGVpZ2h0LnR5cGUpIHsKLSAgICAgICAgICAgICAgICBjYXNl
IFBlcmNlbnQ6Ci0gICAgICAgICAgICAgICAgICAgIGlmICghKGNSb3dIZWlnaHQudHlwZSA9PSBQ
ZXJjZW50KSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgKGNSb3dIZWlnaHQudHlwZSA9PSBQ
ZXJjZW50ICYmIGNSb3dIZWlnaHQudmFsdWUgPCBoZWlnaHQudmFsdWUpKQotICAgICAgICAgICAg
ICAgICAgICAgICAgZ3JpZFtjUm93XS5oZWlnaHQgPSBoZWlnaHQ7Ci0gICAgICAgICAgICAgICAg
ICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEZpeGVkOgotICAgICAgICAgICAg
ICAgICAgICBpZiAoY1Jvd0hlaWdodC50eXBlIDwgUGVyY2VudCB8fAotICAgICAgICAgICAgICAg
ICAgICAgICAgKGNSb3dIZWlnaHQudHlwZSA9PSBGaXhlZCAmJiBjUm93SGVpZ2h0LnZhbHVlIDwg
aGVpZ2h0LnZhbHVlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGdyaWRbY1Jvd10uaGVpZ2h0
ID0gaGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBj
YXNlIFJlbGF0aXZlOgotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAg
ICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAgIC8vIG1ha2Ugc3VyZSB3ZSBoYXZl
IGVub3VnaCByb3dzCi0gICAgaWYgKCFlbnN1cmVSb3dzKGNSb3cgKyByU3BhbikpCi0gICAgICAg
IHJldHVybjsKLQotICAgIGludCBjb2wgPSBjQ29sOwotICAgIC8vIHRlbGwgdGhlIGNlbGwgd2hl
cmUgaXQgaXMKLSAgICBDZWxsU3RydWN0IGN1cnJlbnRDZWxsOwotICAgIGN1cnJlbnRDZWxsLmNl
bGwgPSBjZWxsOwotICAgIGN1cnJlbnRDZWxsLmluQ29sU3BhbiA9IGZhbHNlOwotICAgIHdoaWxl
IChjU3BhbikgewotCWludCBjdXJyZW50U3BhbjsKLQlpZiAoY0NvbCA+PSBuQ29scykgewotCSAg
ICB0YWJsZSgpLT5hcHBlbmRDb2x1bW4oY1NwYW4pOwotCSAgICBjdXJyZW50U3BhbiA9IGNTcGFu
OwotCX0gZWxzZSB7Ci0JICAgIGlmIChjU3BhbiA8IGNvbHVtbnNbY0NvbF0uc3BhbikKLQkJdGFi
bGUoKS0+c3BsaXRDb2x1bW4oY0NvbCwgY1NwYW4pOwotCSAgICBjdXJyZW50U3BhbiA9IGNvbHVt
bnNbY0NvbF0uc3BhbjsKLQl9Ci0KLQlmb3IgKGludCByID0gMDsgciA8IHJTcGFuOyByKyspIHsK
LSAgICAgICAgICAgIENlbGxTdHJ1Y3QmIGMgPSBjZWxsQXQoY1JvdyArIHIsIGNDb2wpOwotICAg
ICAgICAgICAgaWYgKGN1cnJlbnRDZWxsLmNlbGwgJiYgIWMuY2VsbCkKLSAgICAgICAgICAgICAg
ICBjLmNlbGwgPSBjdXJyZW50Q2VsbC5jZWxsOwotICAgICAgICAgICAgaWYgKGN1cnJlbnRDZWxs
LmluQ29sU3BhbikKLSAgICAgICAgICAgICAgICBjLmluQ29sU3BhbiA9IHRydWU7Ci0JfQotCWND
b2wrKzsKLQljU3BhbiAtPSBjdXJyZW50U3BhbjsKLSAgICAgICAgY3VycmVudENlbGwuY2VsbCA9
IDA7Ci0JY3VycmVudENlbGwuaW5Db2xTcGFuID0gdHJ1ZTsKLSAgICB9Ci0gICAgaWYgKGNlbGwp
IHsKLQljZWxsLT5zZXRSb3coY1Jvdyk7Ci0JY2VsbC0+c2V0Q29sKHRhYmxlKCktPmVmZkNvbFRv
Q29sKGNvbCkpOwotICAgIH0KLX0KLQotCi0KLXZvaWQgUmVuZGVyVGFibGVTZWN0aW9uOjpzZXRD
ZWxsV2lkdGhzKCkKLXsKLSAgICBBcnJheTxpbnQ+ICZjb2x1bW5Qb3MgPSB0YWJsZSgpLT5jb2x1
bW5Qb3M7Ci0KLSAgICBpbnQgcm93cyA9IGdyaWRSb3dzOwotICAgIGZvciAoaW50IGkgPSAwOyBp
IDwgcm93czsgaSsrKSB7Ci0JUm93ICZyb3cgPSAqZ3JpZFtpXS5yb3c7Ci0JaW50IGNvbHMgPSBy
b3cuc2l6ZSgpOwotCWZvciAoaW50IGogPSAwOyBqIDwgY29sczsgaisrKSB7Ci0JICAgIENlbGxT
dHJ1Y3QgY3VycmVudCA9IHJvd1tqXTsKLSAgICAgICAgICAgIFJlbmRlclRhYmxlQ2VsbCAqY2Vs
bCA9IGN1cnJlbnQuY2VsbDsKLQotCSAgICBpZiAoIWNlbGwpCi0JCWNvbnRpbnVlOwotCSAgICBp
bnQgZW5kQ29sID0gajsKLQkgICAgaW50IGNzcGFuID0gY2VsbC0+Y29sU3BhbigpOwotCSAgICB3
aGlsZSAoY3NwYW4gJiYgZW5kQ29sIDwgY29scykgewotCQljc3BhbiAtPSB0YWJsZSgpLT5jb2x1
bW5zW2VuZENvbF0uc3BhbjsKLQkJZW5kQ29sKys7Ci0JICAgIH0KLQkgICAgaW50IHcgPSBjb2x1
bW5Qb3NbZW5kQ29sXSAtIGNvbHVtblBvc1tqXSAtIHRhYmxlKCktPmhCb3JkZXJTcGFjaW5nKCk7
Ci0JICAgIGludCBvbGRXaWR0aCA9IGNlbGwtPndpZHRoKCk7Ci0JICAgIGlmICh3ICE9IG9sZFdp
ZHRoKSB7Ci0JCWNlbGwtPnNldE5lZWRzTGF5b3V0KHRydWUpOwotCQljZWxsLT5zZXRXaWR0aCh3
KTsKLQkgICAgfQotCX0KLSAgICB9Ci19Ci0KLQotdm9pZCBSZW5kZXJUYWJsZVNlY3Rpb246OmNh
bGNSb3dIZWlnaHQoKQotewotICAgIGludCBpbmR4OwotICAgIFJlbmRlclRhYmxlQ2VsbCAqY2Vs
bDsKLQotICAgIGludCB0b3RhbFJvd3MgPSBncmlkUm93czsKLSAgICBpbnQgc3BhY2luZyA9IHRh
YmxlKCktPnZCb3JkZXJTcGFjaW5nKCk7Ci0KLSAgICByb3dQb3MucmVzaXplKHRvdGFsUm93cyAr
IDEpOwotICAgIHJvd1Bvc1swXSA9IHNwYWNpbmc7Ci0KLSAgICBmb3IgKGludCByID0gMDsgciA8
IHRvdGFsUm93czsgcisrKSB7Ci0Jcm93UG9zW3IgKyAxXSA9IDA7Ci0KLQlpbnQgYmFzZWxpbmUg
PSAwOwotCWludCBiZGVzYyA9IDA7Ci0JaW50IGNoID0gZ3JpZFtyXS5oZWlnaHQubWluV2lkdGgo
MCk7Ci0JaW50IHBvcyA9IHJvd1Bvc1tyICsgMV0gKyBjaCArIHNwYWNpbmc7Ci0KLQlpZiAocG9z
ID4gcm93UG9zW3IgKyAxXSkKLQkgICAgcm93UG9zW3IgKyAxXSA9IHBvczsKLQotCVJvdyAqcm93
ID0gZ3JpZFtyXS5yb3c7Ci0JaW50IHRvdGFsQ29scyA9IHJvdy0+c2l6ZSgpOwotCWludCB0b3Rh
bFJvd3MgPSBncmlkUm93czsKLQotCWZvciAoaW50IGMgPSAwOyBjIDwgdG90YWxDb2xzOyBjKysp
IHsKLQkgICAgQ2VsbFN0cnVjdCBjdXJyZW50ID0gY2VsbEF0KHIsIGMpOwotICAgICAgICAgICAg
Y2VsbCA9IGN1cnJlbnQuY2VsbDsKLQkgICAgaWYgKCFjZWxsIHx8IGN1cnJlbnQuaW5Db2xTcGFu
KQotCQljb250aW51ZTsKLQkgICAgaWYgKHIgPCB0b3RhbFJvd3MgLSAxICYmIGNlbGxBdChyICsg
MSwgYykuY2VsbCA9PSBjZWxsKQotCQljb250aW51ZTsKLQotCSAgICBpZiAoKGluZHggPSByIC0g
Y2VsbC0+cm93U3BhbigpICsgMSkgPCAwKQotCQlpbmR4ID0gMDsKLQotICAgICAgICAgICAgaWYg
KGNlbGwtPm92ZXJyaWRlU2l6ZSgpICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgY2VsbC0+c2V0
T3ZlcnJpZGVTaXplKC0xKTsKLSAgICAgICAgICAgICAgICBjZWxsLT5zZXRDaGlsZE5lZWRzTGF5
b3V0KHRydWUsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICBjZWxsLT5sYXlvdXRJZk5lZWRlZCgp
OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBFeHBsaWNpdCBo
ZWlnaHRzIHVzZSB0aGUgYm9yZGVyIGJveCBpbiBxdWlya3MgbW9kZS4gIEluIHN0cmljdCBtb2Rl
IGRvIHRoZSByaWdodAotICAgICAgICAgICAgLy8gdGhpbmcgYW5kIGFjdHVhbGx5IGFkZCBpbiB0
aGUgYm9yZGVyIGFuZCBwYWRkaW5nLgotCSAgICBjaCA9IGNlbGwtPnN0eWxlKCktPmhlaWdodCgp
LndpZHRoKDApICsgCi0gICAgICAgICAgICAgICAgKGNlbGwtPnN0eWxlKCktPmh0bWxIYWNrcygp
ID8gMCA6IChjZWxsLT5wYWRkaW5nVG9wKCkgKyBjZWxsLT5wYWRkaW5nQm90dG9tKCkgKwotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC0+Ym9y
ZGVyVG9wKCkgKyBjZWxsLT5ib3JkZXJCb3R0b20oKSkpOwotCSAgICBpZiAoY2VsbC0+aGVpZ2h0
KCkgPiBjaCkKLQkJY2ggPSBjZWxsLT5oZWlnaHQoKTsKLQotICAgICAgICAgICAgcG9zID0gcm93
UG9zWyBpbmR4IF0gKyBjaCArIHNwYWNpbmc7Ci0KLQkgICAgaWYgKHBvcyA+IHJvd1Bvc1tyICsg
MV0pCi0JCXJvd1Bvc1tyICsgMV0gPSBwb3M7Ci0KLQkgICAgLy8gZmluZCBvdXQgdGhlIGJhc2Vs
aW5lCi0JICAgIEVWZXJ0aWNhbEFsaWduIHZhID0gY2VsbC0+c3R5bGUoKS0+dmVydGljYWxBbGln
bigpOwotCSAgICBpZiAodmEgPT0gQkFTRUxJTkUgfHwgdmEgPT0gVEVYVF9CT1RUT00gfHwgdmEg
PT0gVEVYVF9UT1AKLQkJfHwgdmEgPT0gU1VQRVIgfHwgdmEgPT0gU1VCKSB7Ci0JCWludCBiID0g
Y2VsbC0+YmFzZWxpbmVQb3NpdGlvbigpOwotICAgICAgICAgICAgICAgIGlmIChiID4gY2VsbC0+
Ym9yZGVyVG9wKCkgKyBjZWxsLT5wYWRkaW5nVG9wKCkpIHsKLSAgICAgICAgICAgICAgICAgICAg
aWYgKGIgPiBiYXNlbGluZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VsaW5lID0gYjsK
LQotICAgICAgICAgICAgICAgICAgICBpbnQgdGQgPSByb3dQb3NbaW5keF0gKyBjaCAtIGI7Ci0g
ICAgICAgICAgICAgICAgICAgIGlmICh0ZCA+IGJkZXNjKQotICAgICAgICAgICAgICAgICAgICAg
ICAgYmRlc2MgPSB0ZDsKLSAgICAgICAgICAgICAgICB9Ci0JICAgIH0KLQl9Ci0KLQkvL2RvIHdl
IGhhdmUgYmFzZWxpbmUgYWxpZ25lZCBlbGVtZW50cz8KLQlpZiAoYmFzZWxpbmUpIHsKLQkgICAg
Ly8gaW5jcmVhc2Ugcm93aGVpZ2h0IGlmIGJhc2VsaW5lIHJlcXVpcmVzCi0JICAgIGludCBiUm93
UG9zID0gYmFzZWxpbmUgKyBiZGVzYyAgKyBzcGFjaW5nIDsgLy8gKyAyKnBhZGRpbmcKLQkgICAg
aWYgKHJvd1Bvc1tyICsgMV0gPCBiUm93UG9zKQotCQlyb3dQb3NbciArIDFdID0gYlJvd1BvczsK
LQotCSAgICBncmlkW3JdLmJhc2VMaW5lID0gYmFzZWxpbmU7Ci0JfQotCi0JaWYgKHJvd1Bvc1ty
ICsgMV0gPCByb3dQb3Nbcl0pCi0JICAgIHJvd1Bvc1tyICsgMV0gPSByb3dQb3Nbcl07Ci0gICAg
fQotfQotCi1pbnQgUmVuZGVyVGFibGVTZWN0aW9uOjpsYXlvdXRSb3dzKGludCB0b0FkZCkKLXsK
LSAgICBpbnQgckhlaWdodDsKLSAgICBpbnQgcmluZHg7Ci0gICAgaW50IHRvdGFsUm93cyA9IGdy
aWRSb3dzOwotICAgIGludCBoc3BhY2luZyA9IHRhYmxlKCktPmhCb3JkZXJTcGFjaW5nKCk7Ci0g
ICAgaW50IHZzcGFjaW5nID0gdGFibGUoKS0+dkJvcmRlclNwYWNpbmcoKTsKLSAgICAKLSAgICBp
ZiAodG9BZGQgJiYgdG90YWxSb3dzICYmIChyb3dQb3NbdG90YWxSb3dzXSB8fCAhbmV4dFNpYmxp
bmcoKSkpIHsKLQotCWludCB0b3RhbEhlaWdodCA9IHJvd1Bvc1t0b3RhbFJvd3NdICsgdG9BZGQ7
Ci0KLSAgICAgICAgaW50IGRoID0gdG9BZGQ7Ci0JaW50IHRvdGFsUGVyY2VudCA9IDA7Ci0JaW50
IG51bUF1dG8gPSAwOwotCWZvciAoaW50IHIgPSAwOyByIDwgdG90YWxSb3dzOyByKyspIHsKLQkg
ICAgaWYgKGdyaWRbcl0uaGVpZ2h0LnR5cGUgPT0gQXV0bykKLQkJbnVtQXV0bysrOwotCSAgICBl
bHNlIGlmIChncmlkW3JdLmhlaWdodC50eXBlID09IFBlcmNlbnQpCi0JCXRvdGFsUGVyY2VudCAr
PSBncmlkW3JdLmhlaWdodC52YWx1ZTsKLQl9Ci0JaWYgKHRvdGFsUGVyY2VudCkgewotCSAgICAv
LyB0cnkgdG8gc2F0aXNmeSBwZXJjZW50Ci0JICAgIGludCBhZGQgPSAwOwotCSAgICBpZiAodG90
YWxQZXJjZW50ID4gMTAwKQotCQl0b3RhbFBlcmNlbnQgPSAxMDA7Ci0JICAgIGludCByaCA9IHJv
d1Bvc1sxXSAtIHJvd1Bvc1swXTsKLQkgICAgZm9yIChpbnQgciA9IDA7IHIgPCB0b3RhbFJvd3M7
IHIrKykgewotCQlpZiAodG90YWxQZXJjZW50ID4gMCAmJiBncmlkW3JdLmhlaWdodC50eXBlID09
IFBlcmNlbnQpIHsKLQkJICAgIGludCB0b0FkZCA9IGtNaW4oZGgsICh0b3RhbEhlaWdodCAqIGdy
aWRbcl0uaGVpZ2h0LnZhbHVlIC8gMTAwKSAtIHJoKTsKLSAgICAgICAgICAgICAgICAgICAgLy8g
SWYgdG9BZGQgaXMgbmVnYXRpdmUsIHRoZW4gd2UgZG9uJ3Qgd2FudCB0byBzaHJpbmsgdGhlIHJv
dyAodGhpcyBidWcKLSAgICAgICAgICAgICAgICAgICAgLy8gYWZmZWN0ZWQgT3V0bG9vayBXZWIg
QWNjZXNzKS4KLSAgICAgICAgICAgICAgICAgICAgdG9BZGQgPSBrTWF4KDAsIHRvQWRkKTsKLQkJ
ICAgIGFkZCArPSB0b0FkZDsKLQkJICAgIGRoIC09IHRvQWRkOwotCQkgICAgdG90YWxQZXJjZW50
IC09IGdyaWRbcl0uaGVpZ2h0LnZhbHVlOwotCQl9Ci0JCWlmIChyIDwgdG90YWxSb3dzIC0gMSkK
LQkJICAgIHJoID0gcm93UG9zW3IgKyAyXSAtIHJvd1Bvc1tyICsgMV07Ci0gICAgICAgICAgICAg
ICAgcm93UG9zW3IgKyAxXSArPSBhZGQ7Ci0JICAgIH0KLQl9Ci0JaWYgKG51bUF1dG8pIHsKLQkg
ICAgLy8gZGlzdHJpYnV0ZSBvdmVyIHZhcmlhYmxlIGNvbHMKLQkgICAgaW50IGFkZCA9IDA7Ci0J
ICAgIGZvciAoaW50IHIgPSAwOyByIDwgdG90YWxSb3dzOyByKyspIHsKLQkJaWYgKG51bUF1dG8g
PiAwICYmIGdyaWRbcl0uaGVpZ2h0LnR5cGUgPT0gQXV0bykgewotCQkgICAgaW50IHRvQWRkID0g
ZGgvbnVtQXV0bzsKLQkJICAgIGFkZCArPSB0b0FkZDsKLQkJICAgIGRoIC09IHRvQWRkOwotICAg
ICAgICAgICAgICAgICAgICBudW1BdXRvLS07Ci0JCX0KLSAgICAgICAgICAgICAgICByb3dQb3Nb
ciArIDFdICs9IGFkZDsKLQkgICAgfQotCX0KLSAgICAgICAgaWYgKGRoID4gMCAmJiByb3dQb3Nb
dG90YWxSb3dzXSkgewotCSAgICAvLyBpZiBzb21lIGxlZnQgb3ZlcnMsIGRpc3RyaWJ1dGUgZXF1
YWxseS4KLSAgICAgICAgICAgIGludCB0b3QgPSByb3dQb3NbdG90YWxSb3dzXTsKLSAgICAgICAg
ICAgIGludCBhZGQgPSAwOwotICAgICAgICAgICAgaW50IHByZXYgPSByb3dQb3NbMF07Ci0gICAg
ICAgICAgICBmb3IgKGludCByID0gMDsgciA8IHRvdGFsUm93czsgcisrKSB7Ci0gICAgICAgICAg
ICAgICAgLy93ZWlnaHQgd2l0aCB0aGUgb3JpZ2luYWwgaGVpZ2h0Ci0gICAgICAgICAgICAgICAg
YWRkICs9IGRoICogKHJvd1Bvc1tyICsgMV0gLSBwcmV2KSAvIHRvdDsKLSAgICAgICAgICAgICAg
ICBwcmV2ID0gcm93UG9zW3IgKyAxXTsKLSAgICAgICAgICAgICAgICByb3dQb3NbciArIDFdICs9
IGFkZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGludCBsZWZ0T2Zm
c2V0ID0gaHNwYWNpbmc7Ci0KLSAgICBpbnQgbkVmZkNvbHMgPSB0YWJsZSgpLT5udW1FZmZDb2xz
KCk7Ci0gICAgZm9yIChpbnQgciA9IDA7IHIgPCB0b3RhbFJvd3M7IHIrKykgewotCVJvdyAqcm93
ID0gZ3JpZFtyXS5yb3c7Ci0JaW50IHRvdGFsQ29scyA9IHJvdy0+c2l6ZSgpOwotICAgICAgICBm
b3IgKGludCBjID0gMDsgYyA8IG5FZmZDb2xzOyBjKyspIHsKLSAgICAgICAgICAgIENlbGxTdHJ1
Y3QgY3VycmVudCA9IGNlbGxBdChyLCBjKTsKLSAgICAgICAgICAgIFJlbmRlclRhYmxlQ2VsbCog
Y2VsbCA9IGN1cnJlbnQuY2VsbDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKCFjZWxs
KQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgaWYgKHIgPCB0b3RhbFJv
d3MgLSAxICYmIGNlbGwgPT0gY2VsbEF0KHIgKyAxLCBjKS5jZWxsKQotCQljb250aW51ZTsKLQot
ICAgICAgICAgICAgaWYgKChyaW5keCA9IHItY2VsbC0+cm93U3BhbigpICsgMSkgPCAwKQotICAg
ICAgICAgICAgICAgIHJpbmR4ID0gMDsKLQotICAgICAgICAgICAgckhlaWdodCA9IHJvd1Bvc1ty
ICsgMV0gLSByb3dQb3NbcmluZHhdIC0gdnNwYWNpbmc7Ci0gICAgICAgICAgICAKLSAgICAgICAg
ICAgIC8vIEZvcmNlIHBlcmNlbnQgaGVpZ2h0IGNoaWxkcmVuIHRvIGxheSB0aGVtc2VsdmVzIG91
dCBhZ2Fpbi4KLSAgICAgICAgICAgIC8vIFRoaXMgd2lsbCBjYXVzZSB0aGVzZSBjaGlsZHJlbiB0
byBncm93IHRvIGZpbGwgdGhlIGNlbGwuCi0gICAgICAgICAgICAvLyBGSVhNRTogVGhlcmUgaXMg
c3RpbGwgbW9yZSB3b3JrIHRvIGRvIGhlcmUgdG8gZnVsbHkgbWF0Y2ggV2luSUUgKHNob3VsZAot
ICAgICAgICAgICAgLy8gaXQgYmVjb21lIG5lY2Vzc2FyeSB0byBkbyBzbykuICBJbiBxdWlya3Mg
bW9kZSwgV2luSUUgYmVoYXZlcyBsaWtlIHdlCi0gICAgICAgICAgICAvLyBkbywgYnV0IGl0IHdp
bGwgY2xpcCB0aGUgY2VsbHMgdGhhdCBzcGlsbCBvdXQgb2YgdGhlIHRhYmxlIHNlY3Rpb24uICBJ
bgotICAgICAgICAgICAgLy8gc3RyaWN0IG1vZGUsIE1vemlsbGEgYW5kIFdpbklFIGJvdGggcmVn
cm93IHRoZSB0YWJsZSB0byBhY2NvbW1vZGF0ZSB0aGUKLSAgICAgICAgICAgIC8vIG5ldyBoZWln
aHQgb2YgdGhlIGNlbGwgKHRodXMgbGV0dGluZyB0aGUgcGVyY2VudGFnZXMgY2F1c2UgZ3Jvd3Ro
IG9uZQotICAgICAgICAgICAgLy8gdGltZSBvbmx5KS4gIFdlIG1heSBhbHNvIG5vdCBiZSBoYW5k
bGluZyByb3ctc3Bhbm5pbmcgY2VsbHMgY29ycmVjdGx5LgotICAgICAgICAgICAgLy8KLSAgICAg
ICAgICAgIC8vIE5vdGUgYWxzbyB0aGUgb2RkaXR5IHdoZXJlIHJlcGxhY2VkIGVsZW1lbnRzIGFs
d2F5cyBmbGV4LCBhbmQgeWV0IGJsb2Nrcy90YWJsZXMgZG8KLSAgICAgICAgICAgIC8vIG5vdCBu
ZWNlc3NhcmlseSBmbGV4LiAgV2luSUUgaXMgY3JhenkgYW5kIGluY29uc2lzdGVudCwgYW5kIHdl
IGNhbid0IGhvcGUgdG8KLSAgICAgICAgICAgIC8vIG1hdGNoIHRoZSBiZWhhdmlvciBwZXJmZWN0
bHksIGJ1dCB3ZSdsbCBjb250aW51ZSB0byByZWZpbmUgaXQgYXMgd2UgZGlzY292ZXIgbmV3Ci0g
ICAgICAgICAgICAvLyBidWdzLiA6KQotICAgICAgICAgICAgYm9vbCBjZWxsQ2hpbGRyZW5GbGV4
ID0gZmFsc2U7Ci0gICAgICAgICAgICBib29sIGZsZXhBbGxDaGlsZHJlbiA9IGNlbGwtPnN0eWxl
KCktPmhlaWdodCgpLmlzRml4ZWQoKSB8fCAKLSAgICAgICAgICAgICAgICAoIXRhYmxlKCktPnN0
eWxlKCktPmhlaWdodCgpLmlzQXV0bygpICYmIHJIZWlnaHQgIT0gY2VsbC0+aGVpZ2h0KCkpOwot
Ci0gICAgICAgICAgICBmb3IgKFJlbmRlck9iamVjdCogbyA9IGNlbGwtPmZpcnN0Q2hpbGQoKTsg
bzsgbyA9IG8tPm5leHRTaWJsaW5nKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoIW8tPmlzVGV4
dCgpICYmIG8tPnN0eWxlKCktPmhlaWdodCgpLmlzUGVyY2VudCgpICYmIChvLT5pc1JlcGxhY2Vk
KCkgfHwgby0+c2Nyb2xsc092ZXJmbG93KCkgfHwgZmxleEFsbENoaWxkcmVuKSkgewotICAgICAg
ICAgICAgICAgICAgICAvLyBUYWJsZXMgd2l0aCBubyBzZWN0aW9ucyBkbyBub3QgZmxleC4KLSAg
ICAgICAgICAgICAgICAgICAgaWYgKCFvLT5pc1RhYmxlKCkgfHwgc3RhdGljX2Nhc3Q8UmVuZGVy
VGFibGUqPihvKS0+aGFzU2VjdGlvbnMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgby0+
c2V0TmVlZHNMYXlvdXQodHJ1ZSwgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgY2Vs
bC0+c2V0Q2hpbGROZWVkc0xheW91dCh0cnVlLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAg
ICAgICBjZWxsQ2hpbGRyZW5GbGV4ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAg
ICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjZWxsQ2hpbGRy
ZW5GbGV4KSB7Ci0gICAgICAgICAgICAgICAgY2VsbC0+c2V0T3ZlcnJpZGVTaXplKGtNYXgoMCwg
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgckhlaWdodCAtIGNl
bGwtPmJvcmRlclRvcCgpIC0gY2VsbC0+cGFkZGluZ1RvcCgpIC0gCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGwtPmJvcmRlckJvdHRvbSgp
IC0gY2VsbC0+cGFkZGluZ0JvdHRvbSgpKSk7Ci0gICAgICAgICAgICAgICAgY2VsbC0+bGF5b3V0
SWZOZWVkZWQoKTsKLQotICAgICAgICAgICAgICAgIC8vIEFsaWdubWVudCB3aXRoaW4gYSBjZWxs
IGlzIGJhc2VkIG9mZiB0aGUgY2FsY3VsYXRlZAotICAgICAgICAgICAgICAgIC8vIGhlaWdodCwg
d2hpY2ggYmVjb21lcyBpcnJlbGV2YW50IG9uY2UgdGhlIGNlbGwgaGFzCi0gICAgICAgICAgICAg
ICAgLy8gYmVlbiByZXNpemVkIGJhc2VkIG9mZiBpdHMgcGVyY2VudGFnZS4gLWR3aAotICAgICAg
ICAgICAgICAgIGNlbGwtPnNldENlbGxUb3BFeHRyYSgwKTsKLSAgICAgICAgICAgICAgICBjZWxs
LT5zZXRDZWxsQm90dG9tRXh0cmEoMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNl
IHsKLSAgICAgICAgICAgICAgICBFVmVydGljYWxBbGlnbiB2YSA9IGNlbGwtPnN0eWxlKCktPnZl
cnRpY2FsQWxpZ24oKTsKLSAgICAgICAgICAgICAgICBpbnQgdGUgPSAwOwotICAgICAgICAgICAg
ICAgIHN3aXRjaCAodmEpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTVUI6Ci0gICAgICAg
ICAgICAgICAgICAgIGNhc2UgU1VQRVI6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgVEVYVF9U
T1A6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgVEVYVF9CT1RUT006Ci0gICAgICAgICAgICAg
ICAgICAgIGNhc2UgQkFTRUxJTkU6Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZSA9IGdldEJh
c2VsaW5lKHIpIC0gY2VsbC0+YmFzZWxpbmVQb3NpdGlvbigpIDsKLSAgICAgICAgICAgICAgICAg
ICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFRPUDoKLSAgICAgICAgICAg
ICAgICAgICAgICAgIHRlID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAg
ICAgICAgICAgICAgICAgICBjYXNlIE1JRERMRToKLSAgICAgICAgICAgICAgICAgICAgICAgIHRl
ID0gKHJIZWlnaHQgLSBjZWxsLT5oZWlnaHQoKSkvMjsKLSAgICAgICAgICAgICAgICAgICAgICAg
IGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEJPVFRPTToKLSAgICAgICAgICAgICAg
ICAgICAgICAgIHRlID0gckhlaWdodCAtIGNlbGwtPmhlaWdodCgpOwotICAgICAgICAgICAgICAg
ICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAg
ICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAg
Ci0gICAgICAgICAgICAgICAgY2VsbC0+c2V0Q2VsbFRvcEV4dHJhKHRlKTsKLSAgICAgICAgICAg
ICAgICBjZWxsLT5zZXRDZWxsQm90dG9tRXh0cmEockhlaWdodCAtIGNlbGwtPmhlaWdodCgpIC0g
dGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpbnQgb2xkQ2Vs
bFggPSBjZWxsLT54UG9zKCk7Ci0gICAgICAgICAgICBpbnQgb2xkQ2VsbFkgPSBjZWxsLT55UG9z
KCk7Ci0gICAgICAgIAotICAgICAgICAgICAgaWYgKHN0eWxlKCktPmRpcmVjdGlvbigpID09IFJU
TCkgewotICAgICAgICAgICAgICAgIGNlbGwtPnNldFBvcygKLQkJICAgIHRhYmxlKCktPmNvbHVt
blBvc1soaW50KXRvdGFsQ29sc10gLQotCQkgICAgdGFibGUoKS0+Y29sdW1uUG9zW3RhYmxlKCkt
PmNvbFRvRWZmQ29sKGNlbGwtPmNvbCgpK2NlbGwtPmNvbFNwYW4oKSldICsKLQkJICAgIGxlZnRP
ZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgIHJvd1Bvc1tyaW5keF0pOwotICAgICAgICAgICAg
fSBlbHNlCi0gICAgICAgICAgICAgICAgY2VsbC0+c2V0UG9zKHRhYmxlKCktPmNvbHVtblBvc1tj
XSArIGxlZnRPZmZzZXQsIHJvd1Bvc1tyaW5keF0pOwotCi0gICAgICAgICAgICAvLyBJZiB0aGUg
Y2VsbCBtb3ZlZCwgd2UgaGF2ZSB0byByZXBhaW50IGl0IGFzIHdlbGwgYXMgYW55IGZsb2F0aW5n
L3Bvc2l0aW9uZWQKLSAgICAgICAgICAgIC8vIGRlc2NlbmRhbnRzLiAgQW4gZXhjZXB0aW9uIGlz
IGlmIHdlIG5lZWQgYSBsYXlvdXQuICBJbiB0aGlzIGNhc2UsIHdlIGtub3cgd2UncmUgZ29pbmcg
dG8KLSAgICAgICAgICAgIC8vIHJlcGFpbnQgb3Vyc2VsdmVzIChhbmQgdGhlIGNlbGwpIGFueXdh
eS4KLSAgICAgICAgICAgIGlmICghdGFibGUoKS0+c2VsZk5lZWRzTGF5b3V0KCkgJiYgY2VsbC0+
Y2hlY2tGb3JSZXBhaW50RHVyaW5nTGF5b3V0KCkpCi0gICAgICAgICAgICAgICAgY2VsbC0+cmVw
YWludER1cmluZ0xheW91dElmTW92ZWQob2xkQ2VsbFgsIG9sZENlbGxZKTsKLSAgICAgICAgfQot
ICAgIH0KLQotICAgIG1faGVpZ2h0ID0gcm93UG9zW3RvdGFsUm93c107Ci0gICAgcmV0dXJuIG1f
aGVpZ2h0OwotfQotCi0KLXZvaWQgUmVuZGVyVGFibGVTZWN0aW9uOjpwYWludChQYWludEluZm8m
IGksIGludCB0eCwgaW50IHR5KQotewotICAgIHVuc2lnbmVkIGludCB0b3RhbFJvd3MgPSBncmlk
Um93czsKLSAgICB1bnNpZ25lZCBpbnQgdG90YWxDb2xzID0gdGFibGUoKS0+Y29sdW1ucy5zaXpl
KCk7Ci0KLSAgICB0eCArPSBtX3g7Ci0gICAgdHkgKz0gbV95OwotCi0gICAgLy8gY2hlY2sgd2hp
Y2ggcm93cyBhbmQgY29scyBhcmUgdmlzaWJsZSBhbmQgb25seSBwYWludCB0aGVzZQotICAgIC8v
ICMjIyBmaXhtZTogY291bGQgdXNlIGEgYmluYXJ5IHNlYXJjaCBoZXJlCi0gICAgUGFpbnRBY3Rp
b24gcGFpbnRBY3Rpb24gPSBpLnBoYXNlOwotICAgIGludCB4ID0gaS5yLngoKTsKLSAgICBpbnQg
eSA9IGkuci55KCk7Ci0gICAgaW50IHcgPSBpLnIud2lkdGgoKTsKLSAgICBpbnQgaCA9IGkuci5o
ZWlnaHQoKTsKLQotICAgIGludCBvcyA9IDIgKiBtYXhpbWFsT3V0bGluZVNpemUocGFpbnRBY3Rp
b24pOwotICAgIHVuc2lnbmVkIGludCBzdGFydHJvdyA9IDA7Ci0gICAgdW5zaWduZWQgaW50IGVu
ZHJvdyA9IHRvdGFsUm93czsKLSAgICBmb3IgKDsgc3RhcnRyb3cgPCB0b3RhbFJvd3M7IHN0YXJ0
cm93KyspCi0JaWYgKHR5ICsgcm93UG9zW3N0YXJ0cm93KzFdID49IHkgLSBvcykKLQkgICAgYnJl
YWs7Ci0KLSAgICBmb3IgKDsgZW5kcm93ID4gMDsgZW5kcm93LS0pCi0JaWYgKCB0eSArIHJvd1Bv
c1tlbmRyb3ctMV0gPD0geSArIGggKyBvcykKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgdW5z
aWduZWQgaW50IHN0YXJ0Y29sID0gMDsKLSAgICB1bnNpZ25lZCBpbnQgZW5kY29sID0gdG90YWxD
b2xzOwotICAgIGlmIChzdHlsZSgpLT5kaXJlY3Rpb24oKSA9PSBMVFIpIHsKLQlmb3IgKDsgc3Rh
cnRjb2wgPCB0b3RhbENvbHM7IHN0YXJ0Y29sKyspIHsKLQkgICAgaWYgKHR4ICsgdGFibGUoKS0+
Y29sdW1uUG9zW3N0YXJ0Y29sICsgMV0gPj0geCAtIG9zKQotICAgICAgICAgICAgICAgIGJyZWFr
OwotCX0KLQlmb3IgKDsgZW5kY29sID4gMDsgZW5kY29sLS0pIHsKLQkgICAgaWYgKHR4ICsgdGFi
bGUoKS0+Y29sdW1uUG9zW2VuZGNvbCAtIDFdIDw9IHggKyB3ICsgb3MpCi0JCWJyZWFrOwotCX0K
LSAgICB9Ci0KLSAgICBpZiAoc3RhcnRjb2wgPCBlbmRjb2wpIHsKLQkvLyBkcmF3IHRoZSBjZWxs
cwotCWZvciAodW5zaWduZWQgaW50IHIgPSBzdGFydHJvdzsgciA8IGVuZHJvdzsgcisrKSB7Ci0J
ICAgIHVuc2lnbmVkIGludCBjID0gc3RhcnRjb2w7Ci0JICAgIC8vIHNpbmNlIGEgY2VsbCBjYW4g
YmUgLTEgKGluZGljYXRpbmcgYSBjb2xzcGFuKSB3ZSBtaWdodCBoYXZlIHRvIHNlYXJjaCBiYWNr
d2FyZHMgdG8gaW5jbHVkZSBpdAotCSAgICB3aGlsZSAoYyAmJiBjZWxsQXQociwgYykuaW5Db2xT
cGFuKQotCQljLS07Ci0JICAgIGZvciAoOyBjIDwgZW5kY29sOyBjKyspIHsKLSAgICAgICAgICAg
ICAgICBDZWxsU3RydWN0IGN1cnJlbnQgPSBjZWxsQXQociwgYyk7Ci0gICAgICAgICAgICAgICAg
UmVuZGVyVGFibGVDZWxsICpjZWxsID0gY3VycmVudC5jZWxsOwotCQkKLSAgICAgICAgICAgICAg
ICBpZiAoIWNlbGwgfHwgKGNlbGwtPmxheWVyKCkgJiYgaS5waGFzZSAhPSBQYWludEFjdGlvbkNv
bGxhcHNlZFRhYmxlQm9yZGVycykpIAotCQkgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAg
Ci0gICAgICAgICAgICAgICAgLy8gQ2VsbHMgbXVzdCBhbHdheXMgcGFpbnQgaW4gdGhlIG9yZGVy
IGluIHdoaWNoIHRoZXkgYXBwZWFyIHRha2luZyBpbnRvIGFjY291bnQKLSAgICAgICAgICAgICAg
ICAvLyB0aGVpciB1cHBlciBsZWZ0IG9yaWdpbmF0aW5nIHJvdy9jb2x1bW4uICBGb3IgY2VsbHMg
d2l0aCByb3dzcGFucywgYXZvaWQgcmVwYWludGluZwotICAgICAgICAgICAgICAgIC8vIGlmIHdl
J3ZlIGFscmVhZHkgc2VlbiB0aGUgY2VsbC4KLQkJaWYgKHIgPiBzdGFydHJvdyAmJiAoY2VsbEF0
KHItMSwgYykuY2VsbCA9PSBjZWxsKSkKLQkJICAgIGNvbnRpbnVlOwotCi0JCWNlbGwtPnBhaW50
KGksIHR4LCB0eSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotfQotCi12b2lkIFJlbmRlclRhYmxlU2Vj
dGlvbjo6cmVjYWxjQ2VsbHMoKQotewotICAgIGNDb2wgPSAwOwotICAgIGNSb3cgPSAtMTsKLSAg
ICBjbGVhckdyaWQoKTsKLSAgICBncmlkUm93cyA9IDA7Ci0KLSAgICBmb3IgKFJlbmRlck9iamVj
dCAqcm93ID0gZmlyc3RDaGlsZCgpOyByb3c7IHJvdyA9IHJvdy0+bmV4dFNpYmxpbmcoKSkgewot
CWNSb3crKzsKLQljQ29sID0gMDsKLQllbnN1cmVSb3dzKGNSb3cgKyAxKTsKLQlmb3IgKFJlbmRl
ck9iamVjdCAqY2VsbCA9IHJvdy0+Zmlyc3RDaGlsZCgpOyBjZWxsOyBjZWxsID0gY2VsbC0+bmV4
dFNpYmxpbmcoKSkKLQkgICAgaWYgKGNlbGwtPmlzVGFibGVDZWxsKCkpCi0JCWFkZENlbGwoc3Rh
dGljX2Nhc3Q8UmVuZGVyVGFibGVDZWxsICo+KGNlbGwpKTsKLSAgICB9Ci0gICAgbmVlZENlbGxS
ZWNhbGMgPSBmYWxzZTsKLSAgICBzZXROZWVkc0xheW91dCh0cnVlKTsKLX0KLQotdm9pZCBSZW5k
ZXJUYWJsZVNlY3Rpb246OmNsZWFyR3JpZCgpCi17Ci0gICAgaW50IHJvd3MgPSBncmlkUm93czsK
LSAgICB3aGlsZSAocm93cy0tKQotCWRlbGV0ZSBncmlkW3Jvd3NdLnJvdzsKLX0KLQotUmVuZGVy
T2JqZWN0KiBSZW5kZXJUYWJsZVNlY3Rpb246OnJlbW92ZUNoaWxkTm9kZShSZW5kZXJPYmplY3Qq
IGNoaWxkKQotewotICAgIHNldE5lZWRDZWxsUmVjYWxjKCk7Ci0gICAgcmV0dXJuIFJlbmRlckNv
bnRhaW5lcjo6cmVtb3ZlQ2hpbGROb2RlKGNoaWxkKTsKLX0KLQotI2lmbmRlZiBOREVCVUcKLXZv
aWQgUmVuZGVyVGFibGVTZWN0aW9uOjpkdW1wKFFUZXh0U3RyZWFtICpzdHJlYW0sIFFTdHJpbmcg
aW5kKSBjb25zdAotewotICAgICpzdHJlYW0gPDwgZW5kbCA8PCBpbmQgPDwgImdyaWQ9KCIgPDwg
Z3JpZC5zaXplKCkgPDwgIiwiIDw8IHRhYmxlKCktPm51bUVmZkNvbHMoKSA8PCAiKSIgPDwgZW5k
bCA8PCBpbmQ7Ci0gICAgZm9yICh1bnNpZ25lZCBpbnQgciA9IDA7IHIgPCBncmlkLnNpemUoKTsg
cisrKSB7Ci0JZm9yIChpbnQgYyA9IDA7IGMgPCB0YWJsZSgpLT5udW1FZmZDb2xzKCk7IGMrKykg
ewotCSAgICBpZiAoY2VsbEF0KCByLCBjKS5jZWxsICYmICFjZWxsQXQociwgYykuaW5Db2xTcGFu
KQotCQkqc3RyZWFtIDw8ICIoIiA8PCBjZWxsQXQociwgYykuY2VsbC0+cm93KCkgPDwgIiwiIDw8
IGNlbGxBdChyLCBjKS5jZWxsLT5jb2woKSA8PCAiLCIKLQkJCTw8IGNlbGxBdChyLCBjKS5jZWxs
LT5yb3dTcGFuKCkgPDwgIiwiIDw8IGNlbGxBdChyLCBjKS5jZWxsLT5jb2xTcGFuKCkgPDwgIikg
IjsKLQkgICAgZWxzZQotCQkqc3RyZWFtIDw8IGNlbGxBdChyLCBjKS5jZWxsIDw8ICJudWxsIGNl
bGwgIjsKLQl9Ci0JKnN0cmVhbSA8PCBlbmRsIDw8IGluZDsKLSAgICB9Ci0gICAgUmVuZGVyQ29u
dGFpbmVyOjpkdW1wKHN0cmVhbSxpbmQpOwotfQotI2VuZGlmCi0KLS8vIC0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0KLQotUmVuZGVyVGFibGVSb3c6OlJlbmRlclRhYmxlUm93KERPTTo6Tm9kZUltcGwqIG5vZGUp
Ci0gICAgOiBSZW5kZXJDb250YWluZXIobm9kZSkKLXsKLSAgICAvLyBpbml0IFJlbmRlck9iamVj
dCBhdHRyaWJ1dGVzCi0gICAgc2V0SW5saW5lKGZhbHNlKTsgICAvLyBvdXIgb2JqZWN0IGlzIG5v
dCBJbmxpbmUKLX0KLQotdm9pZCBSZW5kZXJUYWJsZVJvdzo6ZGVzdHJveSgpCi17Ci0gICAgUmVu
ZGVyVGFibGVTZWN0aW9uICpzID0gc2VjdGlvbigpOwotICAgIGlmIChzKQotICAgICAgICBzLT5z
ZXROZWVkQ2VsbFJlY2FsYygpOwotICAgIAotICAgIFJlbmRlckNvbnRhaW5lcjo6ZGVzdHJveSgp
OwotfQotCi12b2lkIFJlbmRlclRhYmxlUm93OjpzZXRTdHlsZShSZW5kZXJTdHlsZSogc3R5bGUp
Ci17Ci0gICAgc3R5bGUtPnNldERpc3BsYXkoVEFCTEVfUk9XKTsKLSAgICBSZW5kZXJDb250YWlu
ZXI6OnNldFN0eWxlKHN0eWxlKTsKLX0KLQotdm9pZCBSZW5kZXJUYWJsZVJvdzo6YWRkQ2hpbGQo
UmVuZGVyT2JqZWN0ICpjaGlsZCwgUmVuZGVyT2JqZWN0ICpiZWZvcmVDaGlsZCkKLXsKLSAgICBp
ZiAoY2hpbGQtPmVsZW1lbnQoKSAmJiBjaGlsZC0+ZWxlbWVudCgpLT5oYXNUYWdOYW1lKGZvcm1U
YWcpKSB7Ci0gICAgICAgIFJlbmRlckNvbnRhaW5lcjo6YWRkQ2hpbGQoY2hpbGQsYmVmb3JlQ2hp
bGQpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgUmVuZGVyVGFibGVDZWxsICpjZWxs
OwotCi0gICAgaWYgKCFjaGlsZC0+aXNUYWJsZUNlbGwoKSkgewotCVJlbmRlck9iamVjdCAqbGFz
dCA9IGJlZm9yZUNoaWxkOwotICAgICAgICBpZiAoIWxhc3QpCi0gICAgICAgICAgICBsYXN0ID0g
bGFzdENoaWxkKCk7Ci0gICAgICAgIFJlbmRlclRhYmxlQ2VsbCAqY2VsbCA9IDA7Ci0gICAgICAg
IGlmIChsYXN0ICYmIGxhc3QtPmlzQW5vbnltb3VzKCkgJiYgbGFzdC0+aXNUYWJsZUNlbGwoKSkK
LSAgICAgICAgICAgIGNlbGwgPSBzdGF0aWNfY2FzdDxSZW5kZXJUYWJsZUNlbGwgKj4obGFzdCk7
Ci0gICAgICAgIGVsc2UgewotCSAgICBjZWxsID0gbmV3IChyZW5kZXJBcmVuYSgpKSBSZW5kZXJU
YWJsZUNlbGwoZG9jdW1lbnQoKSAvKiBhbm9ueW1vdXMgb2JqZWN0ICovKTsKLQkgICAgUmVuZGVy
U3R5bGUgKm5ld1N0eWxlID0gbmV3IChyZW5kZXJBcmVuYSgpKSBSZW5kZXJTdHlsZSgpOwotCSAg
ICBuZXdTdHlsZS0+aW5oZXJpdEZyb20oc3R5bGUoKSk7Ci0JICAgIG5ld1N0eWxlLT5zZXREaXNw
bGF5KFRBQkxFX0NFTEwpOwotCSAgICBjZWxsLT5zZXRTdHlsZShuZXdTdHlsZSk7Ci0JICAgIGFk
ZENoaWxkKGNlbGwsIGJlZm9yZUNoaWxkKTsKLSAgICAgICAgfQotICAgICAgICBjZWxsLT5hZGRD
aGlsZChjaGlsZCk7Ci0gICAgICAgIGNoaWxkLT5zZXROZWVkc0xheW91dEFuZE1pbk1heFJlY2Fs
YygpOwotICAgICAgICByZXR1cm47Ci0gICAgfSBlbHNlCi0gICAgICAgIGNlbGwgPSBzdGF0aWNf
Y2FzdDxSZW5kZXJUYWJsZUNlbGwgKj4oY2hpbGQpOwotCi0gICAgc3RhdGljX2Nhc3Q8UmVuZGVy
VGFibGVTZWN0aW9uICo+KHBhcmVudCgpKS0+YWRkQ2VsbChjZWxsKTsKLQotICAgIFJlbmRlckNv
bnRhaW5lcjo6YWRkQ2hpbGQoY2VsbCxiZWZvcmVDaGlsZCk7Ci0KLSAgICBpZiAoKGJlZm9yZUNo
aWxkIHx8IG5leHRTaWJsaW5nKCkpICYmIHNlY3Rpb24oKSkKLQlzZWN0aW9uKCktPnNldE5lZWRD
ZWxsUmVjYWxjKCk7Ci19Ci0KLVJlbmRlck9iamVjdCogUmVuZGVyVGFibGVSb3c6OnJlbW92ZUNo
aWxkTm9kZShSZW5kZXJPYmplY3QqIGNoaWxkKQotewotLy8gUmVuZGVyVGFibGVDZWxsIGRlc3Ry
b3kgc2hvdWxkIGRvIGl0Ci0vLyAgICAgaWYgKCBzZWN0aW9uKCkgKQotLy8gCXNlY3Rpb24oKS0+
c2V0TmVlZENlbGxSZWNhbGMoKTsKLSAgICByZXR1cm4gUmVuZGVyQ29udGFpbmVyOjpyZW1vdmVD
aGlsZE5vZGUoY2hpbGQpOwotfQotCi0jaWZuZGVmIE5ERUJVRwotdm9pZCBSZW5kZXJUYWJsZVJv
dzo6ZHVtcChRVGV4dFN0cmVhbSAqc3RyZWFtLCBRU3RyaW5nIGluZCkgY29uc3QKLXsKLSAgICBS
ZW5kZXJDb250YWluZXI6OmR1bXAoc3RyZWFtLGluZCk7Ci19Ci0jZW5kaWYKLQotdm9pZCBSZW5k
ZXJUYWJsZVJvdzo6bGF5b3V0KCkKLXsKLSAgICBLSFRNTEFzc2VydChuZWVkc0xheW91dCgpKTsK
LSAgICBLSFRNTEFzc2VydChtaW5NYXhLbm93bigpKTsKLQotICAgIGZvciAoUmVuZGVyT2JqZWN0
ICpjaGlsZCA9IGZpcnN0Q2hpbGQoKTsgY2hpbGQ7IGNoaWxkID0gY2hpbGQtPm5leHRTaWJsaW5n
KCkpIHsKLSAgICAgICAgaWYgKGNoaWxkLT5pc1RhYmxlQ2VsbCgpKSB7Ci0gICAgICAgICAgICBS
ZW5kZXJUYWJsZUNlbGwgKmNlbGwgPSBzdGF0aWNfY2FzdDxSZW5kZXJUYWJsZUNlbGwgKj4oY2hp
bGQpOwotICAgICAgICAgICAgaWYgKGNoaWxkLT5uZWVkc0xheW91dCgpKSB7Ci0gICAgICAgICAg
ICAgICAgY2VsbC0+Y2FsY1ZlcnRpY2FsTWFyZ2lucygpOwotICAgICAgICAgICAgICAgIGNlbGwt
PmxheW91dCgpOwotICAgICAgICAgICAgICAgIGNlbGwtPnNldENlbGxUb3BFeHRyYSgwKTsKLSAg
ICAgICAgICAgICAgICBjZWxsLT5zZXRDZWxsQm90dG9tRXh0cmEoMCk7Ci0gICAgICAgICAgICB9
Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgc2V0TmVlZHNMYXlvdXQoZmFsc2UpOwotfQotCi1JbnRS
ZWN0IFJlbmRlclRhYmxlUm93OjpnZXRBYnNvbHV0ZVJlcGFpbnRSZWN0KCkKLXsKLSAgICAvLyBG
b3Igbm93LCBqdXN0IHJlcGFpbnQgdGhlIHdob2xlIHRhYmxlLgotICAgIC8vIEZJWE1FOiBGaW5k
IGEgYmV0dGVyIHdheSB0byBkbyB0aGlzLgotICAgIFJlbmRlclRhYmxlKiBwYXJlbnRUYWJsZSA9
IHRhYmxlKCk7Ci0gICAgaWYgKHBhcmVudFRhYmxlKQotICAgICAgICByZXR1cm4gcGFyZW50VGFi
bGUtPmdldEFic29sdXRlUmVwYWludFJlY3QoKTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBJ
bnRSZWN0KCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotUmVuZGVyVGFibGVDZWxsOjpS
ZW5kZXJUYWJsZUNlbGwoRE9NOjpOb2RlSW1wbCogX25vZGUpCi0gIDogUmVuZGVyQmxvY2soX25v
ZGUpCi17Ci0gIF9jb2wgPSAtMTsKLSAgX3JvdyA9IC0xOwotICBjU3BhbiA9IHJTcGFuID0gMTsK
LSAgdXBkYXRlRnJvbUVsZW1lbnQoKTsKLSAgc2V0U2hvdWxkUGFpbnRCYWNrZ3JvdW5kT3JCb3Jk
ZXIodHJ1ZSk7Ci0gIF90b3BFeHRyYSA9IDA7Ci0gIF9ib3R0b21FeHRyYSA9IDA7Ci0gIG1fcGVy
Y2VudGFnZUhlaWdodCA9IDA7Ci19Ci0KLXZvaWQgUmVuZGVyVGFibGVDZWxsOjpkZXN0cm95KCkK
LXsKLSAgICBpZiAocGFyZW50KCkgJiYgc2VjdGlvbigpKQotICAgICAgICBzZWN0aW9uKCktPnNl
dE5lZWRDZWxsUmVjYWxjKCk7Ci0KLSAgICBSZW5kZXJCbG9jazo6ZGVzdHJveSgpOwotfQotCi12
b2lkIFJlbmRlclRhYmxlQ2VsbDo6dXBkYXRlRnJvbUVsZW1lbnQoKQotewotICAgIGludCBvbGRS
U3BhbiA9IHJTcGFuOwotICAgIGludCBvbGRDU3BhbiA9IGNTcGFuOwotICAgIERPTTo6Tm9kZUlt
cGwqIG5vZGUgPSBlbGVtZW50KCk7Ci0gICAgaWYgKG5vZGUgJiYgKG5vZGUtPmhhc1RhZ05hbWUo
dGRUYWcpIHx8IG5vZGUtPmhhc1RhZ05hbWUodGhUYWcpKSkgewotICAgICAgICBET006OkhUTUxU
YWJsZUNlbGxFbGVtZW50SW1wbCAqdGMgPSBzdGF0aWNfY2FzdDxET006OkhUTUxUYWJsZUNlbGxF
bGVtZW50SW1wbCAqPihub2RlKTsKLSAgICAgICAgY1NwYW4gPSB0Yy0+Y29sU3BhbigpOwotICAg
ICAgICByU3BhbiA9IHRjLT5yb3dTcGFuKCk7Ci0gICAgfQotICAgIGlmICgob2xkUlNwYW4gIT0g
clNwYW4gfHwgb2xkQ1NwYW4gIT0gY1NwYW4pICYmIHN0eWxlKCkgJiYgcGFyZW50KCkpCi0gICAg
ICAgIHNldE5lZWRzTGF5b3V0QW5kTWluTWF4UmVjYWxjKCk7Ci19Ci0gICAgCi1MZW5ndGggUmVu
ZGVyVGFibGVDZWxsOjpzdHlsZU9yQ29sV2lkdGgoKQotewotICAgIExlbmd0aCB3ID0gc3R5bGUo
KS0+d2lkdGgoKTsKLSAgICBpZiAoY29sU3BhbigpID4gMSB8fCAhdy5pc0F1dG8oKSkKLSAgICAg
ICAgcmV0dXJuIHc7Ci0gICAgUmVuZGVyVGFibGVDb2wqIGNvbCA9IHRhYmxlKCktPmNvbEVsZW1l
bnQoX2NvbCk7Ci0gICAgaWYgKGNvbCkKLSAgICAgICAgdyA9IGNvbC0+c3R5bGUoKS0+d2lkdGgo
KTsKLSAgICByZXR1cm4gdzsKLX0KLQotdm9pZCBSZW5kZXJUYWJsZUNlbGw6OmNhbGNNaW5NYXhX
aWR0aCgpCi17Ci0gICAgUmVuZGVyQmxvY2s6OmNhbGNNaW5NYXhXaWR0aCgpOwotICAgIGlmIChl
bGVtZW50KCkgJiYgc3R5bGUoKS0+YXV0b1dyYXAoKSkgewotICAgICAgICAvLyBTZWUgaWYgbm93
cmFwIHdhcyBzZXQuCi0gICAgICAgIExlbmd0aCB3ID0gc3R5bGVPckNvbFdpZHRoKCk7Ci0gICAg
ICAgIERPTVN0cmluZyBub3dyYXAgPSBzdGF0aWNfY2FzdDxFbGVtZW50SW1wbCo+KGVsZW1lbnQo
KSktPmdldEF0dHJpYnV0ZShub3dyYXBBdHRyKTsKLSAgICAgICAgaWYgKCFub3dyYXAuaXNOdWxs
KCkgJiYgdy5pc0ZpeGVkKCkpCi0gICAgICAgICAgICAvLyBOb3dyYXAgaXMgc2V0LCBidXQgd2Ug
ZGlkbid0IGFjdHVhbGx5IHVzZSBpdCBiZWNhdXNlIG9mIHRoZQotICAgICAgICAgICAgLy8gZml4
ZWQgd2lkdGggc2V0IG9uIHRoZSBjZWxsLiAgRXZlbiBzbywgaXQgaXMgYSBXaW5JRS9Nb3ogdHJh
aXQKLSAgICAgICAgICAgIC8vIHRvIG1ha2UgdGhlIG1pbndpZHRoIG9mIHRoZSBjZWxsIGludG8g
dGhlIGZpeGVkIHdpZHRoLiAgVGhleSBkbyB0aGlzCi0gICAgICAgICAgICAvLyBldmVuIGluIHN0
cmljdCBtb2RlLCBzbyBkbyBub3QgbWFrZSB0aGlzIGEgcXVpcmsuICBBZmZlY3RlZCB0aGUgdG9w
Ci0gICAgICAgICAgICAvLyBvZiBoaXB0b3AuY29tLgotICAgICAgICAgICAgaWYgKG1fbWluV2lk
dGggPCB3LnZhbHVlKQotICAgICAgICAgICAgICAgIG1fbWluV2lkdGggPSB3LnZhbHVlOwotICAg
IH0KLX0KLQotdm9pZCBSZW5kZXJUYWJsZUNlbGw6OmNhbGNXaWR0aCgpCi17Ci19Ci0KLXZvaWQg
UmVuZGVyVGFibGVDZWxsOjpzZXRXaWR0aChpbnQgd2lkdGgpCi17Ci0gICAgaWYgKHdpZHRoICE9
IG1fd2lkdGgpIHsKLQltX3dpZHRoID0gd2lkdGg7Ci0JbV93aWR0aENoYW5nZWQgPSB0cnVlOwot
ICAgIH0KLX0KLQotdm9pZCBSZW5kZXJUYWJsZUNlbGw6OmxheW91dCgpCi17Ci0gICAgbGF5b3V0
QmxvY2sobV93aWR0aENoYW5nZWQpOwotICAgIG1fd2lkdGhDaGFuZ2VkID0gZmFsc2U7Ci19Ci0K
LXZvaWQgUmVuZGVyVGFibGVDZWxsOjpjb21wdXRlQWJzb2x1dGVSZXBhaW50UmVjdChJbnRSZWN0
JiByLCBib29sIGYpCi17Ci0gICAgci5zZXRZKHIueSgpICsgX3RvcEV4dHJhKTsKLSAgICBSZW5k
ZXJCbG9jazo6Y29tcHV0ZUFic29sdXRlUmVwYWludFJlY3QociwgZik7Ci19Ci0KLWJvb2wgUmVu
ZGVyVGFibGVDZWxsOjphYnNvbHV0ZVBvc2l0aW9uKGludCAmeFBvcywgaW50ICZ5UG9zLCBib29s
IGYpCi17Ci0gICAgYm9vbCByZXQgPSBSZW5kZXJCbG9jazo6YWJzb2x1dGVQb3NpdGlvbih4UG9z
LCB5UG9zLCBmKTsKLSAgICBpZiAocmV0KQotICAgICAgeVBvcyArPSBfdG9wRXh0cmE7Ci0gICAg
cmV0dXJuIHJldDsKLX0KLQotc2hvcnQgUmVuZGVyVGFibGVDZWxsOjpiYXNlbGluZVBvc2l0aW9u
KGJvb2wpIGNvbnN0Ci17Ci0gICAgUmVuZGVyT2JqZWN0KiBvID0gZmlyc3RDaGlsZCgpOwotICAg
IGludCBvZmZzZXQgPSBwYWRkaW5nVG9wKCkgKyBib3JkZXJUb3AoKTsKLSAgICAKLSAgICBpZiAo
IW8pCi0gICAgICAgIHJldHVybiBvZmZzZXQgKyBjb250ZW50SGVpZ2h0KCk7Ci0gICAgd2hpbGUg
KG8tPmZpcnN0Q2hpbGQoKSkgewotCWlmICghby0+aXNJbmxpbmUoKSkKLQkgICAgb2Zmc2V0ICs9
IG8tPnBhZGRpbmdUb3AoKSArIG8tPmJvcmRlclRvcCgpOwotCW8gPSBvLT5maXJzdENoaWxkKCk7
Ci0gICAgfQotICAgIAotICAgIGlmICghby0+aXNJbmxpbmUoKSkKLSAgICAgICAgcmV0dXJuIHBh
ZGRpbmdUb3AoKSArIGJvcmRlclRvcCgpICsgY29udGVudEhlaWdodCgpOwotCi0gICAgb2Zmc2V0
ICs9IG8tPmJhc2VsaW5lUG9zaXRpb24odHJ1ZSk7Ci0gICAgcmV0dXJuIG9mZnNldDsKLX0KLQot
Ci12b2lkIFJlbmRlclRhYmxlQ2VsbDo6c2V0U3R5bGUoUmVuZGVyU3R5bGUgKnN0eWxlKQotewot
ICAgIHN0eWxlLT5zZXREaXNwbGF5KFRBQkxFX0NFTEwpOwotCi0gICAgaWYgKHN0eWxlLT53aGl0
ZVNwYWNlKCkgPT0gS0hUTUxfTk9XUkFQKSB7Ci0gICAgICAgIC8vIEZpZ3VyZSBvdXQgaWYgd2Ug
YXJlIHJlYWxseSBub3dyYXBwaW5nIG9yIGlmIHdlIHNob3VsZCBqdXN0Ci0gICAgICAgIC8vIHVz
ZSBub3JtYWwgaW5zdGVhZC4gIElmIHRoZSB3aWR0aCBvZiB0aGUgY2VsbCBpcyBmaXhlZCwgdGhl
bgotICAgICAgICAvLyB3ZSBkb24ndCBhY3R1YWxseSB1c2UgTk9XUkFQLiAKLSAgICAgICAgaWYg
KHN0eWxlLT53aWR0aCgpLmlzRml4ZWQoKSkKLSAgICAgICAgICAgIHN0eWxlLT5zZXRXaGl0ZVNw
YWNlKE5PUk1BTCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHN0eWxlLT5zZXRXaGl0ZVNw
YWNlKE5PV1JBUCk7Ci0gICAgfQotCi0gICAgUmVuZGVyQmxvY2s6OnNldFN0eWxlKHN0eWxlKTsK
LSAgICBzZXRTaG91bGRQYWludEJhY2tncm91bmRPckJvcmRlcih0cnVlKTsKLX0KLQotYm9vbCBS
ZW5kZXJUYWJsZUNlbGw6OnJlcXVpcmVzTGF5ZXIoKSB7Ci0gICAgcmV0dXJuIGlzUG9zaXRpb25l
ZCgpIHx8IHN0eWxlKCktPm9wYWNpdHkoKSA8IDEuMGYgfHwgaGFzT3ZlcmZsb3dDbGlwKCk7Ci19
Ci0KLS8vIFRoZSBmb2xsb3dpbmcgcnVsZXMgYXBwbHkgZm9yIHJlc29sdmluZyBjb25mbGljdHMg
YW5kIGZpZ3VyaW5nIG91dCB3aGljaCBib3JkZXIKLS8vIHRvIHVzZS4KLS8vICgxKSBCb3JkZXJz
IHdpdGggdGhlICdib3JkZXItc3R5bGUnIG9mICdoaWRkZW4nIHRha2UgcHJlY2VkZW5jZSBvdmVy
IGFsbCBvdGhlciBjb25mbGljdGluZyAKLS8vIGJvcmRlcnMuIEFueSBib3JkZXIgd2l0aCB0aGlz
IHZhbHVlIHN1cHByZXNzZXMgYWxsIGJvcmRlcnMgYXQgdGhpcyBsb2NhdGlvbi4KLS8vICgyKSBC
b3JkZXJzIHdpdGggYSBzdHlsZSBvZiAnbm9uZScgaGF2ZSB0aGUgbG93ZXN0IHByaW9yaXR5LiBP
bmx5IGlmIHRoZSBib3JkZXIgcHJvcGVydGllcyBvZiBhbGwgCi0vLyB0aGUgZWxlbWVudHMgbWVl
dGluZyBhdCB0aGlzIGVkZ2UgYXJlICdub25lJyB3aWxsIHRoZSBib3JkZXIgYmUgb21pdHRlZCAo
YnV0IG5vdGUgdGhhdCAnbm9uZScgaXMgCi0vLyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGJv
cmRlciBzdHlsZS4pCi0vLyAoMykgSWYgbm9uZSBvZiB0aGUgc3R5bGVzIGFyZSAnaGlkZGVuJyBh
bmQgYXQgbGVhc3Qgb25lIG9mIHRoZW0gaXMgbm90ICdub25lJywgdGhlbiBuYXJyb3cgYm9yZGVy
cyAKLS8vIGFyZSBkaXNjYXJkZWQgaW4gZmF2b3Igb2Ygd2lkZXIgb25lcy4gSWYgc2V2ZXJhbCBo
YXZlIHRoZSBzYW1lICdib3JkZXItd2lkdGgnIHRoZW4gc3R5bGVzIGFyZSBwcmVmZXJyZWQgCi0v
LyBpbiB0aGlzIG9yZGVyOiAnZG91YmxlJywgJ3NvbGlkJywgJ2Rhc2hlZCcsICdkb3R0ZWQnLCAn
cmlkZ2UnLCAnb3V0c2V0JywgJ2dyb292ZScsIGFuZCB0aGUgbG93ZXN0OiAnaW5zZXQnLgotLy8g
KDQpIElmIGJvcmRlciBzdHlsZXMgZGlmZmVyIG9ubHkgaW4gY29sb3IsIHRoZW4gYSBzdHlsZSBz
ZXQgb24gYSBjZWxsIHdpbnMgb3ZlciBvbmUgb24gYSByb3csIAotLy8gd2hpY2ggd2lucyBvdmVy
IGEgcm93IGdyb3VwLCBjb2x1bW4sIGNvbHVtbiBncm91cCBhbmQsIGxhc3RseSwgdGFibGUuIEl0
IGlzIHVuZGVmaW5lZCB3aGljaCBjb2xvciAKLS8vIGlzIHVzZWQgd2hlbiB0d28gZWxlbWVudHMg
b2YgdGhlIHNhbWUgdHlwZSBkaXNhZ3JlZS4KLXN0YXRpYyBDb2xsYXBzZWRCb3JkZXJWYWx1ZSBj
b21wYXJlQm9yZGVycyhjb25zdCBDb2xsYXBzZWRCb3JkZXJWYWx1ZSYgYm9yZGVyMSwgCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29sbGFwc2VkQm9y
ZGVyVmFsdWUmIGJvcmRlcjIpCi17Ci0gICAgLy8gU2FuaXR5IGNoZWNrIHRoZSB2YWx1ZXMgcGFz
c2VkIGluLiAgSWYgZWl0aGVyIGlzIG51bGwsIHJldHVybiB0aGUgb3RoZXIuCi0gICAgaWYgKCFi
b3JkZXIyLmV4aXN0cygpKSByZXR1cm4gYm9yZGVyMTsKLSAgICBpZiAoIWJvcmRlcjEuZXhpc3Rz
KCkpIHJldHVybiBib3JkZXIyOwotICAgIAotICAgIC8vIFJ1bGUgIzEgYWJvdmUuCi0gICAgaWYg
KGJvcmRlcjEuc3R5bGUoKSA9PSBCSElEREVOIHx8IGJvcmRlcjIuc3R5bGUoKSA9PSBCSElEREVO
KQotICAgICAgICByZXR1cm4gQ29sbGFwc2VkQm9yZGVyVmFsdWUoKTsgLy8gTm8gYm9yZGVyIHNo
b3VsZCBleGlzdCBhdCB0aGlzIGxvY2F0aW9uLgotICAgIAotICAgIC8vIFJ1bGUgIzIgYWJvdmUu
ICBBIHN0eWxlIG9mICdub25lJyBoYXMgbG93ZXN0IHByaW9yaXR5IGFuZCBhbHdheXMgbG9zZXMg
dG8gYW55IG90aGVyIGJvcmRlci4KLSAgICBpZiAoYm9yZGVyMi5zdHlsZSgpID09IEJOT05FKSBy
ZXR1cm4gYm9yZGVyMTsKLSAgICBpZiAoYm9yZGVyMS5zdHlsZSgpID09IEJOT05FKSByZXR1cm4g
Ym9yZGVyMjsKLSAgICAKLSAgICAvLyBUaGUgZmlyc3QgcGFydCBvZiBydWxlICMzIGFib3ZlLiBX
aWRlciBib3JkZXJzIHdpbi4KLSAgICBpZiAoYm9yZGVyMS53aWR0aCgpICE9IGJvcmRlcjIud2lk
dGgoKSkKLSAgICAgICAgcmV0dXJuIGJvcmRlcjEud2lkdGgoKSA+IGJvcmRlcjIud2lkdGgoKSA/
IGJvcmRlcjEgOiBib3JkZXIyOwotICAgIAotICAgIC8vIFRoZSBib3JkZXJzIGhhdmUgZXF1YWwg
d2lkdGguICBTb3J0IGJ5IGJvcmRlciBzdHlsZS4KLSAgICBpZiAoYm9yZGVyMS5zdHlsZSgpICE9
IGJvcmRlcjIuc3R5bGUoKSkKLSAgICAgICAgcmV0dXJuIGJvcmRlcjEuc3R5bGUoKSA+IGJvcmRl
cjIuc3R5bGUoKSA/IGJvcmRlcjEgOiBib3JkZXIyOwotICAgIAotICAgIC8vIFRoZSBib3JkZXIg
aGF2ZSB0aGUgc2FtZSB3aWR0aCBhbmQgc3R5bGUuICBSZWx5IG9uIHByZWNlZGVuY2UgKGNlbGwg
b3ZlciByb3cgb3ZlciByb3cgZ3JvdXAsIGV0Yy4pCi0gICAgcmV0dXJuIGJvcmRlcjEucHJlY2Vk
ZW5jZSA+PSBib3JkZXIyLnByZWNlZGVuY2UgPyBib3JkZXIxIDogYm9yZGVyMjsKLX0KLQotQ29s
bGFwc2VkQm9yZGVyVmFsdWUgUmVuZGVyVGFibGVDZWxsOjpjb2xsYXBzZWRMZWZ0Qm9yZGVyKCkg
Y29uc3QKLXsKLSAgICAvLyBGb3IgYm9yZGVyIGxlZnQsIHdlIG5lZWQgdG8gY2hlY2ssIGluIG9y
ZGVyIG9mIHByZWNlZGVuY2U6Ci0gICAgLy8gKDEpIE91ciBsZWZ0IGJvcmRlci4KLSAgICBDb2xs
YXBzZWRCb3JkZXJWYWx1ZSByZXN1bHQoJnN0eWxlKCktPmJvcmRlckxlZnQoKSwgQkNFTEwpOwot
ICAgIAotICAgIC8vICgyKSBUaGUgcHJldmlvdXMgY2VsbCdzIHJpZ2h0IGJvcmRlci4KLSAgICBS
ZW5kZXJUYWJsZUNlbGwqIHByZXZDZWxsID0gdGFibGUoKS0+Y2VsbExlZnQodGhpcyk7Ci0gICAg
aWYgKHByZXZDZWxsKSB7Ci0gICAgICAgIHJlc3VsdCA9IGNvbXBhcmVCb3JkZXJzKHJlc3VsdCwg
Q29sbGFwc2VkQm9yZGVyVmFsdWUoJnByZXZDZWxsLT5zdHlsZSgpLT5ib3JkZXJSaWdodCgpLCBC
Q0VMTCkpOwotICAgICAgICBpZiAoIXJlc3VsdC5leGlzdHMoKSkKLSAgICAgICAgICAgIHJldHVy
biByZXN1bHQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKGNvbCgpID09IDApIHsKLSAgICAgICAgLy8g
KDMpIE91ciByb3cncyBsZWZ0IGJvcmRlci4KLSAgICAgICAgcmVzdWx0ID0gY29tcGFyZUJvcmRl
cnMocmVzdWx0LCBDb2xsYXBzZWRCb3JkZXJWYWx1ZSgmcGFyZW50KCktPnN0eWxlKCktPmJvcmRl
ckxlZnQoKSwgQlJPVykpOwotICAgICAgICBpZiAoIXJlc3VsdC5leGlzdHMoKSkKLSAgICAgICAg
ICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIAotICAgICAgICAvLyAoNCkgT3VyIHJvdyBncm91
cCdzIGxlZnQgYm9yZGVyLgotICAgICAgICByZXN1bHQgPSBjb21wYXJlQm9yZGVycyhyZXN1bHQs
IENvbGxhcHNlZEJvcmRlclZhbHVlKCZzZWN0aW9uKCktPnN0eWxlKCktPmJvcmRlckxlZnQoKSwg
QlJPV0dST1VQKSk7Ci0gICAgICAgIGlmICghcmVzdWx0LmV4aXN0cygpKQotICAgICAgICAgICAg
cmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgCi0gICAgLy8gKDUpIE91ciBjb2x1bW4ncyBsZWZ0
IGJvcmRlci4KLSAgICBSZW5kZXJUYWJsZUNvbCogY29sRWx0ID0gdGFibGUoKS0+Y29sRWxlbWVu
dChjb2woKSk7Ci0gICAgaWYgKGNvbEVsdCkgewotICAgICAgICByZXN1bHQgPSBjb21wYXJlQm9y
ZGVycyhyZXN1bHQsIENvbGxhcHNlZEJvcmRlclZhbHVlKCZjb2xFbHQtPnN0eWxlKCktPmJvcmRl
ckxlZnQoKSwgQkNPTCkpOwotICAgICAgICBpZiAoIXJlc3VsdC5leGlzdHMoKSkKLSAgICAgICAg
ICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIAotICAgIC8vICg2KSBUaGUgcHJldmlvdXMg
Y29sdW1uJ3MgcmlnaHQgYm9yZGVyLgotICAgIGlmIChjb2woKSA+IDApIHsKLSAgICAgICAgY29s
RWx0ID0gdGFibGUoKS0+Y29sRWxlbWVudChjb2woKSAtIDEpOwotICAgICAgICBpZiAoY29sRWx0
KSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBjb21wYXJlQm9yZGVycyhyZXN1bHQsIENvbGxhcHNl
ZEJvcmRlclZhbHVlKCZjb2xFbHQtPnN0eWxlKCktPmJvcmRlclJpZ2h0KCksIEJDT0wpKTsKLSAg
ICAgICAgICAgIGlmICghcmVzdWx0LmV4aXN0cygpKQotICAgICAgICAgICAgICAgIHJldHVybiBy
ZXN1bHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaWYgKGNvbCgpID09IDApIHsKLSAg
ICAgICAgLy8gKDcpIFRoZSB0YWJsZSdzIGxlZnQgYm9yZGVyLgotICAgICAgICByZXN1bHQgPSBj
b21wYXJlQm9yZGVycyhyZXN1bHQsIENvbGxhcHNlZEJvcmRlclZhbHVlKCZ0YWJsZSgpLT5zdHls
ZSgpLT5ib3JkZXJMZWZ0KCksIEJUQUJMRSkpOwotICAgICAgICBpZiAoIXJlc3VsdC5leGlzdHMo
KSkKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBy
ZXN1bHQ7Ci19Ci0KLUNvbGxhcHNlZEJvcmRlclZhbHVlIFJlbmRlclRhYmxlQ2VsbDo6Y29sbGFw
c2VkUmlnaHRCb3JkZXIoKSBjb25zdAotewotICAgIFJlbmRlclRhYmxlKiB0YWJsZUVsdCA9IHRh
YmxlKCk7Ci0gICAgYm9vbCBpbkxhc3RDb2x1bW4gPSBmYWxzZTsKLSAgICBpbnQgZWZmQ29sID0g
dGFibGVFbHQtPmNvbFRvRWZmQ29sKGNvbCgpICsgY29sU3BhbigpIC0gMSk7Ci0gICAgaWYgKGVm
ZkNvbCA9PSB0YWJsZUVsdC0+bnVtRWZmQ29scygpIC0gMSkKLSAgICAgICAgaW5MYXN0Q29sdW1u
ID0gdHJ1ZTsKLSAgICAKLSAgICAvLyBGb3IgYm9yZGVyIHJpZ2h0LCB3ZSBuZWVkIHRvIGNoZWNr
LCBpbiBvcmRlciBvZiBwcmVjZWRlbmNlOgotICAgIC8vICgxKSBPdXIgcmlnaHQgYm9yZGVyLgot
ICAgIENvbGxhcHNlZEJvcmRlclZhbHVlIHJlc3VsdCA9IENvbGxhcHNlZEJvcmRlclZhbHVlKCZz
dHlsZSgpLT5ib3JkZXJSaWdodCgpLCBCQ0VMTCk7Ci0gICAgCi0gICAgLy8gKDIpIFRoZSBuZXh0
IGNlbGwncyBsZWZ0IGJvcmRlci4KLSAgICBpZiAoIWluTGFzdENvbHVtbikgewotICAgICAgICBS
ZW5kZXJUYWJsZUNlbGwqIG5leHRDZWxsID0gdGFibGVFbHQtPmNlbGxSaWdodCh0aGlzKTsKLSAg
ICAgICAgaWYgKG5leHRDZWxsICYmIG5leHRDZWxsLT5zdHlsZSgpKSB7Ci0gICAgICAgICAgICBy
ZXN1bHQgPSBjb21wYXJlQm9yZGVycyhyZXN1bHQsIENvbGxhcHNlZEJvcmRlclZhbHVlKCZuZXh0
Q2VsbC0+c3R5bGUoKS0+Ym9yZGVyTGVmdCgpLCBCQ0VMTCkpOwotICAgICAgICAgICAgaWYgKCFy
ZXN1bHQuZXhpc3RzKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAg
fQotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vICgzKSBPdXIgcm93J3MgcmlnaHQgYm9yZGVyLgot
ICAgICAgICByZXN1bHQgPSBjb21wYXJlQm9yZGVycyhyZXN1bHQsIENvbGxhcHNlZEJvcmRlclZh
bHVlKCZwYXJlbnQoKS0+c3R5bGUoKS0+Ym9yZGVyUmlnaHQoKSwgQlJPVykpOwotICAgICAgICBp
ZiAoIXJlc3VsdC5leGlzdHMoKSkKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAg
IAotICAgICAgICAvLyAoNCkgT3VyIHJvdyBncm91cCdzIHJpZ2h0IGJvcmRlci4KLSAgICAgICAg
cmVzdWx0ID0gY29tcGFyZUJvcmRlcnMocmVzdWx0LCBDb2xsYXBzZWRCb3JkZXJWYWx1ZSgmc2Vj
dGlvbigpLT5zdHlsZSgpLT5ib3JkZXJSaWdodCgpLCBCUk9XR1JPVVApKTsKLSAgICAgICAgaWYg
KCFyZXN1bHQuZXhpc3RzKCkpCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAg
ICAKLSAgICAvLyAoNSkgT3VyIGNvbHVtbidzIHJpZ2h0IGJvcmRlci4KLSAgICBSZW5kZXJUYWJs
ZUNvbCogY29sRWx0ID0gdGFibGUoKS0+Y29sRWxlbWVudChjb2woKStjb2xTcGFuKCkgLSAxKTsK
LSAgICBpZiAoY29sRWx0KSB7Ci0gICAgICAgIHJlc3VsdCA9IGNvbXBhcmVCb3JkZXJzKHJlc3Vs
dCwgQ29sbGFwc2VkQm9yZGVyVmFsdWUoJmNvbEVsdC0+c3R5bGUoKS0+Ym9yZGVyUmlnaHQoKSwg
QkNPTCkpOwotICAgICAgICBpZiAoIXJlc3VsdC5leGlzdHMoKSkKLSAgICAgICAgICAgIHJldHVy
biByZXN1bHQ7Ci0gICAgfQotICAgIAotICAgIC8vICg2KSBUaGUgbmV4dCBjb2x1bW4ncyBsZWZ0
IGJvcmRlci4KLSAgICBpZiAoIWluTGFzdENvbHVtbikgewotICAgICAgICBjb2xFbHQgPSB0YWJs
ZUVsdC0+Y29sRWxlbWVudChjb2woKStjb2xTcGFuKCkpOwotICAgICAgICBpZiAoY29sRWx0KSB7
Ci0gICAgICAgICAgICByZXN1bHQgPSBjb21wYXJlQm9yZGVycyhyZXN1bHQsIENvbGxhcHNlZEJv
cmRlclZhbHVlKCZjb2xFbHQtPnN0eWxlKCktPmJvcmRlckxlZnQoKSwgQkNPTCkpOwotICAgICAg
ICAgICAgaWYgKCFyZXN1bHQuZXhpc3RzKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3Vs
dDsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgLy8gKDcpIFRoZSB0YWJs
ZSdzIHJpZ2h0IGJvcmRlci4KLSAgICAgICAgcmVzdWx0ID0gY29tcGFyZUJvcmRlcnMocmVzdWx0
LCBDb2xsYXBzZWRCb3JkZXJWYWx1ZSgmdGFibGVFbHQtPnN0eWxlKCktPmJvcmRlclJpZ2h0KCks
IEJUQUJMRSkpOwotICAgICAgICBpZiAoIXJlc3VsdC5leGlzdHMoKSkKLSAgICAgICAgICAgIHJl
dHVybiByZXN1bHQ7Ci0gICAgfQotICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLUNvbGxh
cHNlZEJvcmRlclZhbHVlIFJlbmRlclRhYmxlQ2VsbDo6Y29sbGFwc2VkVG9wQm9yZGVyKCkgY29u
c3QKLXsKLSAgICAvLyBGb3IgYm9yZGVyIHRvcCwgd2UgbmVlZCB0byBjaGVjaywgaW4gb3JkZXIg
b2YgcHJlY2VkZW5jZToKLSAgICAvLyAoMSkgT3VyIHRvcCBib3JkZXIuCi0gICAgQ29sbGFwc2Vk
Qm9yZGVyVmFsdWUgcmVzdWx0ID0gQ29sbGFwc2VkQm9yZGVyVmFsdWUoJnN0eWxlKCktPmJvcmRl
clRvcCgpLCBCQ0VMTCk7Ci0gICAgCi0gICAgUmVuZGVyVGFibGVDZWxsKiBwcmV2Q2VsbCA9IHRh
YmxlKCktPmNlbGxBYm92ZSh0aGlzKTsKLSAgICBpZiAocHJldkNlbGwpIHsKLSAgICAgICAgLy8g
KDIpIEEgcHJldmlvdXMgY2VsbCdzIGJvdHRvbSBib3JkZXIuCi0gICAgICAgIHJlc3VsdCA9IGNv
bXBhcmVCb3JkZXJzKHJlc3VsdCwgQ29sbGFwc2VkQm9yZGVyVmFsdWUoJnByZXZDZWxsLT5zdHls
ZSgpLT5ib3JkZXJCb3R0b20oKSwgQkNFTEwpKTsKLSAgICAgICAgaWYgKCFyZXN1bHQuZXhpc3Rz
KCkpIAotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgCi0gICAgLy8gKDMp
IE91ciByb3cncyB0b3AgYm9yZGVyLgotICAgIHJlc3VsdCA9IGNvbXBhcmVCb3JkZXJzKHJlc3Vs
dCwgQ29sbGFwc2VkQm9yZGVyVmFsdWUoJnBhcmVudCgpLT5zdHlsZSgpLT5ib3JkZXJUb3AoKSwg
QlJPVykpOwotICAgIGlmICghcmVzdWx0LmV4aXN0cygpKQotICAgICAgICByZXR1cm4gcmVzdWx0
OwotICAgIAotICAgIC8vICg0KSBUaGUgcHJldmlvdXMgcm93J3MgYm90dG9tIGJvcmRlci4KLSAg
ICBpZiAocHJldkNlbGwpIHsKLSAgICAgICAgUmVuZGVyT2JqZWN0KiBwcmV2Um93ID0gMDsKLSAg
ICAgICAgaWYgKHByZXZDZWxsLT5zZWN0aW9uKCkgPT0gc2VjdGlvbigpKQotICAgICAgICAgICAg
cHJldlJvdyA9IHBhcmVudCgpLT5wcmV2aW91c1NpYmxpbmcoKTsKLSAgICAgICAgZWxzZQotICAg
ICAgICAgICAgcHJldlJvdyA9IHByZXZDZWxsLT5zZWN0aW9uKCktPmxhc3RDaGlsZCgpOwotICAg
IAotICAgICAgICBpZiAocHJldlJvdykgewotICAgICAgICAgICAgcmVzdWx0ID0gY29tcGFyZUJv
cmRlcnMocmVzdWx0LCBDb2xsYXBzZWRCb3JkZXJWYWx1ZSgmcHJldlJvdy0+c3R5bGUoKS0+Ym9y
ZGVyQm90dG9tKCksIEJST1cpKTsKLSAgICAgICAgICAgIGlmICghcmVzdWx0LmV4aXN0cygpKQot
ICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0g
ICAgLy8gTm93IGNoZWNrIHJvdyBncm91cHMuCi0gICAgUmVuZGVyT2JqZWN0KiBjdXJyU2VjdGlv
biA9IHBhcmVudCgpLT5wYXJlbnQoKTsKLSAgICBpZiAocm93KCkgPT0gMCkgewotICAgICAgICAv
LyAoNSkgT3VyIHJvdyBncm91cCdzIHRvcCBib3JkZXIuCi0gICAgICAgIHJlc3VsdCA9IGNvbXBh
cmVCb3JkZXJzKHJlc3VsdCwgQ29sbGFwc2VkQm9yZGVyVmFsdWUoJmN1cnJTZWN0aW9uLT5zdHls
ZSgpLT5ib3JkZXJUb3AoKSwgQlJPV0dST1VQKSk7Ci0gICAgICAgIGlmICghcmVzdWx0LmV4aXN0
cygpKQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgCi0gICAgICAgIC8vICg2
KSBQcmV2aW91cyByb3cgZ3JvdXAncyBib3R0b20gYm9yZGVyLgotICAgICAgICBmb3IgKGN1cnJT
ZWN0aW9uID0gY3VyclNlY3Rpb24tPnByZXZpb3VzU2libGluZygpOyBjdXJyU2VjdGlvbjsKLSAg
ICAgICAgICAgICBjdXJyU2VjdGlvbiA9IGN1cnJTZWN0aW9uLT5wcmV2aW91c1NpYmxpbmcoKSkg
ewotICAgICAgICAgICAgaWYgKGN1cnJTZWN0aW9uLT5pc1RhYmxlU2VjdGlvbigpKSB7Ci0gICAg
ICAgICAgICAgICAgUmVuZGVyVGFibGVTZWN0aW9uKiBzZWN0aW9uID0gc3RhdGljX2Nhc3Q8UmVu
ZGVyVGFibGVTZWN0aW9uKj4oY3VyclNlY3Rpb24pOwotICAgICAgICAgICAgICAgIHJlc3VsdCA9
IGNvbXBhcmVCb3JkZXJzKHJlc3VsdCwgQ29sbGFwc2VkQm9yZGVyVmFsdWUoJnNlY3Rpb24tPnN0
eWxlKCktPmJvcmRlckJvdHRvbSgpLCBCUk9XR1JPVVApKTsKLSAgICAgICAgICAgICAgICBpZiAo
IXJlc3VsdC5leGlzdHMoKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAg
ICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBpZiAoIWN1cnJTZWN0aW9u
KSB7Ci0gICAgICAgIC8vICg4KSBPdXIgY29sdW1uJ3MgdG9wIGJvcmRlci4KLSAgICAgICAgUmVu
ZGVyVGFibGVDb2wqIGNvbEVsdCA9IHRhYmxlKCktPmNvbEVsZW1lbnQoY29sKCkpOwotICAgICAg
ICBpZiAoY29sRWx0KSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBjb21wYXJlQm9yZGVycyhyZXN1
bHQsIENvbGxhcHNlZEJvcmRlclZhbHVlKCZjb2xFbHQtPnN0eWxlKCktPmJvcmRlclRvcCgpLCBC
Q09MKSk7Ci0gICAgICAgICAgICBpZiAoIXJlc3VsdC5leGlzdHMoKSkKLSAgICAgICAgICAgICAg
ICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyAoOSkgVGhl
IHRhYmxlJ3MgdG9wIGJvcmRlci4KLSAgICAgICAgcmVzdWx0ID0gY29tcGFyZUJvcmRlcnMocmVz
dWx0LCBDb2xsYXBzZWRCb3JkZXJWYWx1ZSgmdGFibGUoKS0+c3R5bGUoKS0+Ym9yZGVyVG9wKCks
IEJUQUJMRSkpOwotICAgICAgICBpZiAoIXJlc3VsdC5leGlzdHMoKSkKLSAgICAgICAgICAgIHJl
dHVybiByZXN1bHQ7Ci0gICAgfQotICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLUNvbGxh
cHNlZEJvcmRlclZhbHVlIFJlbmRlclRhYmxlQ2VsbDo6Y29sbGFwc2VkQm90dG9tQm9yZGVyKCkg
Y29uc3QKLXsKLSAgICAvLyBGb3IgYm9yZGVyIHRvcCwgd2UgbmVlZCB0byBjaGVjaywgaW4gb3Jk
ZXIgb2YgcHJlY2VkZW5jZToKLSAgICAvLyAoMSkgT3VyIGJvdHRvbSBib3JkZXIuCi0gICAgQ29s
bGFwc2VkQm9yZGVyVmFsdWUgcmVzdWx0ID0gQ29sbGFwc2VkQm9yZGVyVmFsdWUoJnN0eWxlKCkt
PmJvcmRlckJvdHRvbSgpLCBCQ0VMTCk7Ci0gICAgCi0gICAgUmVuZGVyVGFibGVDZWxsKiBuZXh0
Q2VsbCA9IHRhYmxlKCktPmNlbGxCZWxvdyh0aGlzKTsKLSAgICBpZiAobmV4dENlbGwpIHsKLSAg
ICAgICAgLy8gKDIpIEEgZm9sbG93aW5nIGNlbGwncyB0b3AgYm9yZGVyLgotICAgICAgICByZXN1
bHQgPSBjb21wYXJlQm9yZGVycyhyZXN1bHQsIENvbGxhcHNlZEJvcmRlclZhbHVlKCZuZXh0Q2Vs
bC0+c3R5bGUoKS0+Ym9yZGVyVG9wKCksIEJDRUxMKSk7Ci0gICAgICAgIGlmICghcmVzdWx0LmV4
aXN0cygpKQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgCi0gICAgLy8g
KDMpIE91ciByb3cncyBib3R0b20gYm9yZGVyLiAoRklYTUU6IERlYWwgd2l0aCByb3dzcGFuISkK
LSAgICByZXN1bHQgPSBjb21wYXJlQm9yZGVycyhyZXN1bHQsIENvbGxhcHNlZEJvcmRlclZhbHVl
KCZwYXJlbnQoKS0+c3R5bGUoKS0+Ym9yZGVyQm90dG9tKCksIEJST1cpKTsKLSAgICBpZiAoIXJl
c3VsdC5leGlzdHMoKSkKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAKLSAgICAvLyAoNCkg
VGhlIG5leHQgcm93J3MgdG9wIGJvcmRlci4KLSAgICBpZiAobmV4dENlbGwpIHsKLSAgICAgICAg
cmVzdWx0ID0gY29tcGFyZUJvcmRlcnMocmVzdWx0LCBDb2xsYXBzZWRCb3JkZXJWYWx1ZSgmbmV4
dENlbGwtPnBhcmVudCgpLT5zdHlsZSgpLT5ib3JkZXJUb3AoKSwgQlJPVykpOwotICAgICAgICBp
ZiAoIXJlc3VsdC5leGlzdHMoKSkKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQot
ICAgIAotICAgIC8vIE5vdyBjaGVjayByb3cgZ3JvdXBzLgotICAgIFJlbmRlck9iamVjdCogY3Vy
clNlY3Rpb24gPSBwYXJlbnQoKS0+cGFyZW50KCk7Ci0gICAgaWYgKHJvdygpICsgcm93U3Bhbigp
ID49IHN0YXRpY19jYXN0PFJlbmRlclRhYmxlU2VjdGlvbio+KGN1cnJTZWN0aW9uKS0+bnVtUm93
cygpKSB7Ci0gICAgICAgIC8vICg1KSBPdXIgcm93IGdyb3VwJ3MgYm90dG9tIGJvcmRlci4KLSAg
ICAgICAgcmVzdWx0ID0gY29tcGFyZUJvcmRlcnMocmVzdWx0LCBDb2xsYXBzZWRCb3JkZXJWYWx1
ZSgmY3VyclNlY3Rpb24tPnN0eWxlKCktPmJvcmRlckJvdHRvbSgpLCBCUk9XR1JPVVApKTsKLSAg
ICAgICAgaWYgKCFyZXN1bHQuZXhpc3RzKCkpCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0Owot
ICAgICAgICAKLSAgICAgICAgLy8gKDYpIEZvbGxvd2luZyByb3cgZ3JvdXAncyB0b3AgYm9yZGVy
LgotICAgICAgICBmb3IgKGN1cnJTZWN0aW9uID0gY3VyclNlY3Rpb24tPm5leHRTaWJsaW5nKCk7
IGN1cnJTZWN0aW9uOwotICAgICAgICAgICAgIGN1cnJTZWN0aW9uID0gY3VyclNlY3Rpb24tPm5l
eHRTaWJsaW5nKCkpIHsKLSAgICAgICAgICAgIGlmIChjdXJyU2VjdGlvbi0+aXNUYWJsZVNlY3Rp
b24oKSkgewotICAgICAgICAgICAgICAgIFJlbmRlclRhYmxlU2VjdGlvbiogc2VjdGlvbiA9IHN0
YXRpY19jYXN0PFJlbmRlclRhYmxlU2VjdGlvbio+KGN1cnJTZWN0aW9uKTsKLSAgICAgICAgICAg
ICAgICByZXN1bHQgPSBjb21wYXJlQm9yZGVycyhyZXN1bHQsIENvbGxhcHNlZEJvcmRlclZhbHVl
KCZzZWN0aW9uLT5zdHlsZSgpLT5ib3JkZXJUb3AoKSwgQlJPV0dST1VQKSk7Ci0gICAgICAgICAg
ICAgICAgaWYgKCFyZXN1bHQuZXhpc3RzKCkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBy
ZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaWYgKCFj
dXJyU2VjdGlvbikgewotICAgICAgICAvLyAoOCkgT3VyIGNvbHVtbidzIGJvdHRvbSBib3JkZXIu
Ci0gICAgICAgIFJlbmRlclRhYmxlQ29sKiBjb2xFbHQgPSB0YWJsZSgpLT5jb2xFbGVtZW50KGNv
bCgpKTsKLSAgICAgICAgaWYgKGNvbEVsdCkgewotICAgICAgICAgICAgcmVzdWx0ID0gY29tcGFy
ZUJvcmRlcnMocmVzdWx0LCBDb2xsYXBzZWRCb3JkZXJWYWx1ZSgmY29sRWx0LT5zdHlsZSgpLT5i
b3JkZXJCb3R0b20oKSwgQkNPTCkpOwotICAgICAgICAgICAgaWYgKCFyZXN1bHQuZXhpc3RzKCkp
IHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vICg5KSBUaGUg
dGFibGUncyBib3R0b20gYm9yZGVyLgotICAgICAgICByZXN1bHQgPSBjb21wYXJlQm9yZGVycyhy
ZXN1bHQsIENvbGxhcHNlZEJvcmRlclZhbHVlKCZ0YWJsZSgpLT5zdHlsZSgpLT5ib3JkZXJCb3R0
b20oKSwgQlRBQkxFKSk7Ci0gICAgICAgIGlmICghcmVzdWx0LmV4aXN0cygpKQotICAgICAgICAg
ICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHJlc3VsdDsgICAgCi19
Ci0KLWludCBSZW5kZXJUYWJsZUNlbGw6OmJvcmRlckxlZnQoKSBjb25zdAotewotICAgIGlmICh0
YWJsZSgpLT5jb2xsYXBzZUJvcmRlcnMoKSkgewotICAgICAgICBDb2xsYXBzZWRCb3JkZXJWYWx1
ZSBib3JkZXIgPSBjb2xsYXBzZWRMZWZ0Qm9yZGVyKCk7Ci0gICAgICAgIGlmIChib3JkZXIuZXhp
c3RzKCkpCi0gICAgICAgICAgICByZXR1cm4gaW50KGJvcmRlci53aWR0aCgpIC8gMi4wICsgMC41
KTsgLy8gR2l2ZSB0aGUgZXh0cmEgcGl4ZWwgdG8gdG9wIGFuZCBsZWZ0LgotICAgICAgICByZXR1
cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIFJlbmRlckJsb2NrOjpib3JkZXJMZWZ0KCk7Ci19Ci0g
ICAgCi1pbnQgUmVuZGVyVGFibGVDZWxsOjpib3JkZXJSaWdodCgpIGNvbnN0Ci17Ci0gICAgaWYg
KHRhYmxlKCktPmNvbGxhcHNlQm9yZGVycygpKSB7Ci0gICAgICAgIENvbGxhcHNlZEJvcmRlclZh
bHVlIGJvcmRlciA9IGNvbGxhcHNlZFJpZ2h0Qm9yZGVyKCk7Ci0gICAgICAgIGlmIChib3JkZXIu
ZXhpc3RzKCkpCi0gICAgICAgICAgICByZXR1cm4gYm9yZGVyLndpZHRoKCkgLyAyOwotICAgICAg
ICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIFJlbmRlckJsb2NrOjpib3JkZXJSaWdodCgp
OwotfQotCi1pbnQgUmVuZGVyVGFibGVDZWxsOjpib3JkZXJUb3AoKSBjb25zdAotewotICAgIGlm
ICh0YWJsZSgpLT5jb2xsYXBzZUJvcmRlcnMoKSkgewotICAgICAgICBDb2xsYXBzZWRCb3JkZXJW
YWx1ZSBib3JkZXIgPSBjb2xsYXBzZWRUb3BCb3JkZXIoKTsKLSAgICAgICAgaWYgKGJvcmRlci5l
eGlzdHMoKSkKLSAgICAgICAgICAgIHJldHVybiBpbnQoYm9yZGVyLndpZHRoKCkgLyAyLjAgKyAw
LjUpOyAvLyBHaXZlIHRoZSBleHRyYSBwaXhlbCB0byB0b3AgYW5kIGxlZnQuCi0gICAgICAgIHJl
dHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gUmVuZGVyQmxvY2s6OmJvcmRlclRvcCgpOwotfQot
Ci1pbnQgUmVuZGVyVGFibGVDZWxsOjpib3JkZXJCb3R0b20oKSBjb25zdAotewotICAgIGlmICh0
YWJsZSgpLT5jb2xsYXBzZUJvcmRlcnMoKSkgewotICAgICAgICBDb2xsYXBzZWRCb3JkZXJWYWx1
ZSBib3JkZXIgPSBjb2xsYXBzZWRCb3R0b21Cb3JkZXIoKTsKLSAgICAgICAgaWYgKGJvcmRlci5l
eGlzdHMoKSkKLSAgICAgICAgICAgIHJldHVybiBib3JkZXIud2lkdGgoKSAvIDI7Ci0gICAgICAg
IHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gUmVuZGVyQmxvY2s6OmJvcmRlckJvdHRvbSgp
OwotfQotCi0jaWZkZWYgQk9YX0RFQlVHCi0jaW5jbHVkZSA8cXBhaW50ZXIuaD4KLQotc3RhdGlj
IHZvaWQgb3V0bGluZUJveChRUGFpbnRlciAqcCwgaW50IF90eCwgaW50IF90eSwgaW50IHcsIGlu
dCBoKQotewotICAgIHAtPnNldFBlbihRUGVuKFFDb2xvcigieWVsbG93IiksIDMsIFF0OjpEb3RM
aW5lKSk7Ci0gICAgcC0+c2V0QnJ1c2goUXQ6Ok5vQnJ1c2gpOwotICAgIHAtPmRyYXdSZWN0KF90
eCwgX3R5LCB3LCBoKTsKLX0KLSNlbmRpZgotCi12b2lkIFJlbmRlclRhYmxlQ2VsbDo6cGFpbnQo
UGFpbnRJbmZvJiBpLCBpbnQgX3R4LCBpbnQgX3R5KQotewotICAgIF90eCArPSBtX3g7Ci0gICAg
X3R5ICs9IG1feTsKLQotICAgIC8vIGNoZWNrIGlmIHdlIG5lZWQgdG8gZG8gYW55dGhpbmcgYXQg
YWxsLi4uCi0gICAgaW50IG9zID0gMiptYXhpbWFsT3V0bGluZVNpemUoaS5waGFzZSk7Ci0gICAg
aWYgKChfdHkgPj0gaS5yLnkoKSArIGkuci5oZWlnaHQoKSArIG9zKSB8fCAoX3R5ICsgX3RvcEV4
dHJhICsgbV9oZWlnaHQgKyBfYm90dG9tRXh0cmEgPD0gaS5yLnkoKSAtIG9zKSkKLSAgICAgICAg
cmV0dXJuOwotCi0gICAgaWYgKGkucGhhc2UgPT0gUGFpbnRBY3Rpb25Db2xsYXBzZWRUYWJsZUJv
cmRlcnMgJiYgc3R5bGUoKS0+dmlzaWJpbGl0eSgpID09IFZJU0lCTEUpIHsKLSAgICAgICAgaW50
IHcgPSB3aWR0aCgpOwotICAgICAgICBpbnQgaCA9IGhlaWdodCgpICsgYm9yZGVyVG9wRXh0cmEo
KSArIGJvcmRlckJvdHRvbUV4dHJhKCk7Ci0gICAgICAgIHBhaW50Q29sbGFwc2VkQm9yZGVyKGku
cCwgX3R4LCBfdHksIHcsIGgpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIFJlbmRlckJsb2Nr
OjpwYWludE9iamVjdChpLCBfdHgsIF90eSArIF90b3BFeHRyYSk7Ci0KLSNpZmRlZiBCT1hfREVC
VUcKLSAgICA6Om91dGxpbmVCb3goIGkucCwgX3R4LCBfdHksIHdpZHRoKCksIGhlaWdodCgpICsg
Ym9yZGVyVG9wRXh0cmEoKSArIGJvcmRlckJvdHRvbUV4dHJhKCkpOwotI2VuZGlmCi19Ci0KLXN0
YXRpYyBFQm9yZGVyU3R5bGUgY29sbGFwc2VkQm9yZGVyU3R5bGUoRUJvcmRlclN0eWxlIHN0eWxl
KQotewotICAgIGlmIChzdHlsZSA9PSBPVVRTRVQpCi0gICAgICAgIHN0eWxlID0gR1JPT1ZFOwot
ICAgIGVsc2UgaWYgKHN0eWxlID09IElOU0VUKQotICAgICAgICBzdHlsZSA9IFJJREdFOwotICAg
IHJldHVybiBzdHlsZTsKLX0KLQotc3RydWN0IENvbGxhcHNlZEJvcmRlciB7Ci0gICAgQ29sbGFw
c2VkQm9yZGVyKCl7fQotICAgIAotICAgIENvbGxhcHNlZEJvcmRlclZhbHVlIGJvcmRlcjsKLSAg
ICBSZW5kZXJPYmplY3Q6OkJvcmRlclNpZGUgc2lkZTsKLSAgICBib29sIHNob3VsZFBhaW50Owot
ICAgIGludCB4MTsKLSAgICBpbnQgeTE7Ci0gICAgaW50IHgyOwotICAgIGludCB5MjsKLSAgICBF
Qm9yZGVyU3R5bGUgc3R5bGU7Ci19OwotCi1jbGFzcyBDb2xsYXBzZWRCb3JkZXJzCi17Ci1wdWJs
aWM6Ci0gICAgQ29sbGFwc2VkQm9yZGVycyhpbnQgaSkgOmNvdW50KDApIHt9Ci0gICAgCi0gICAg
dm9pZCBhZGRCb3JkZXIoY29uc3QgQ29sbGFwc2VkQm9yZGVyVmFsdWUmIGIsIFJlbmRlck9iamVj
dDo6Qm9yZGVyU2lkZSBzLCBib29sIHBhaW50LCAKLSAgICAgICAgICAgICAgICAgICBpbnQgX3gx
LCBpbnQgX3kxLCBpbnQgX3gyLCBpbnQgX3kyLAotICAgICAgICAgICAgICAgICAgIEVCb3JkZXJT
dHlsZSBfc3R5bGUpCi0gICAgewotICAgICAgICBpZiAoYi5leGlzdHMoKSAmJiBwYWludCkgewot
ICAgICAgICAgICAgYm9yZGVyc1tjb3VudF0uYm9yZGVyID0gYjsKLSAgICAgICAgICAgIGJvcmRl
cnNbY291bnRdLnNpZGUgPSBzOwotICAgICAgICAgICAgYm9yZGVyc1tjb3VudF0uc2hvdWxkUGFp
bnQgPSBwYWludDsKLSAgICAgICAgICAgIGJvcmRlcnNbY291bnRdLngxID0gX3gxOwotICAgICAg
ICAgICAgYm9yZGVyc1tjb3VudF0ueDIgPSBfeDI7Ci0gICAgICAgICAgICBib3JkZXJzW2NvdW50
XS55MSA9IF95MTsKLSAgICAgICAgICAgIGJvcmRlcnNbY291bnRdLnkyID0gX3kyOwotICAgICAg
ICAgICAgYm9yZGVyc1tjb3VudF0uc3R5bGUgPSBfc3R5bGU7Ci0gICAgICAgICAgICBjb3VudCsr
OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQ29sbGFwc2VkQm9yZGVyKiBuZXh0Qm9yZGVyKCkg
ewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAg
IGlmIChib3JkZXJzW2ldLmJvcmRlci5leGlzdHMoKSAmJiBib3JkZXJzW2ldLnNob3VsZFBhaW50
KSB7Ci0gICAgICAgICAgICAgICAgYm9yZGVyc1tpXS5zaG91bGRQYWludCA9IGZhbHNlOwotICAg
ICAgICAgICAgICAgIHJldHVybiAmYm9yZGVyc1tpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAg
fQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIAotICAgIENvbGxhcHNl
ZEJvcmRlciBib3JkZXJzWzRdOwotICAgIGludCBjb3VudDsKLX07Ci0KLXN0YXRpYyB2b2lkIGFk
ZEJvcmRlclN0eWxlKFFWYWx1ZUxpc3Q8Q29sbGFwc2VkQm9yZGVyVmFsdWU+JiBib3JkZXJTdHls
ZXMsIENvbGxhcHNlZEJvcmRlclZhbHVlIGJvcmRlclZhbHVlKQotewotICAgIGlmICghYm9yZGVy
VmFsdWUuZXhpc3RzKCkgfHwgYm9yZGVyU3R5bGVzLmNvbnRhaW5zKGJvcmRlclZhbHVlKSkKLSAg
ICAgICAgcmV0dXJuOwotICAgIAotICAgIFFWYWx1ZUxpc3RJdGVyYXRvcjxDb2xsYXBzZWRCb3Jk
ZXJWYWx1ZT4gaXQgPSBib3JkZXJTdHlsZXMuYmVnaW4oKTsKLSAgICBRVmFsdWVMaXN0SXRlcmF0
b3I8Q29sbGFwc2VkQm9yZGVyVmFsdWU+IGVuZCA9IGJvcmRlclN0eWxlcy5lbmQoKTsKLSAgICBm
b3IgKDsgaXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgICAgIENvbGxhcHNlZEJvcmRlclZhbHVlIHJl
c3VsdCA9IGNvbXBhcmVCb3JkZXJzKCppdCwgYm9yZGVyVmFsdWUpOwotICAgICAgICBpZiAocmVz
dWx0ID09ICppdCkgewotICAgICAgICAgICAgYm9yZGVyU3R5bGVzLmluc2VydChpdCwgYm9yZGVy
VmFsdWUpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgYm9y
ZGVyU3R5bGVzLmFwcGVuZChib3JkZXJWYWx1ZSk7Ci19Ci0KLXZvaWQgUmVuZGVyVGFibGVDZWxs
Ojpjb2xsZWN0Qm9yZGVycyhRVmFsdWVMaXN0PENvbGxhcHNlZEJvcmRlclZhbHVlPiYgYm9yZGVy
U3R5bGVzKQotewotICAgIGFkZEJvcmRlclN0eWxlKGJvcmRlclN0eWxlcywgY29sbGFwc2VkTGVm
dEJvcmRlcigpKTsKLSAgICBhZGRCb3JkZXJTdHlsZShib3JkZXJTdHlsZXMsIGNvbGxhcHNlZFJp
Z2h0Qm9yZGVyKCkpOwotICAgIGFkZEJvcmRlclN0eWxlKGJvcmRlclN0eWxlcywgY29sbGFwc2Vk
VG9wQm9yZGVyKCkpOwotICAgIGFkZEJvcmRlclN0eWxlKGJvcmRlclN0eWxlcywgY29sbGFwc2Vk
Qm90dG9tQm9yZGVyKCkpOwotfQotCi12b2lkIFJlbmRlclRhYmxlQ2VsbDo6cGFpbnRDb2xsYXBz
ZWRCb3JkZXIoUVBhaW50ZXIqIHAsIGludCBfdHgsIGludCBfdHksIGludCB3LCBpbnQgaCkKLXsK
LSAgICBpZiAoIXRhYmxlKCktPmN1cnJlbnRCb3JkZXJTdHlsZSgpKQotICAgICAgICByZXR1cm47
Ci0gICAgCi0gICAgQ29sbGFwc2VkQm9yZGVyVmFsdWUgbGVmdFZhbCA9IGNvbGxhcHNlZExlZnRC
b3JkZXIoKTsKLSAgICBDb2xsYXBzZWRCb3JkZXJWYWx1ZSByaWdodFZhbCA9IGNvbGxhcHNlZFJp
Z2h0Qm9yZGVyKCk7Ci0gICAgQ29sbGFwc2VkQm9yZGVyVmFsdWUgdG9wVmFsID0gY29sbGFwc2Vk
VG9wQm9yZGVyKCk7Ci0gICAgQ29sbGFwc2VkQm9yZGVyVmFsdWUgYm90dG9tVmFsID0gY29sbGFw
c2VkQm90dG9tQm9yZGVyKCk7Ci0gICAgIAotICAgIC8vIEFkanVzdCBvdXIgeC95L3dpZHRoL2hl
aWdodCBzbyB0aGF0IHdlIHBhaW50IHRoZSBjb2xsYXBzZWQgYm9yZGVycyBhdCB0aGUgY29ycmVj
dCBsb2NhdGlvbi4KLSAgICBpbnQgdG9wV2lkdGggPSB0b3BWYWwud2lkdGgoKTsKLSAgICBpbnQg
Ym90dG9tV2lkdGggPSBib3R0b21WYWwud2lkdGgoKTsKLSAgICBpbnQgbGVmdFdpZHRoID0gbGVm
dFZhbC53aWR0aCgpOwotICAgIGludCByaWdodFdpZHRoID0gcmlnaHRWYWwud2lkdGgoKTsKLSAg
ICAKLSAgICBfdHggLT0gbGVmdFdpZHRoIC8gMjsKLSAgICBfdHkgLT0gdG9wV2lkdGggLyAyOwot
ICAgIHcgKz0gbGVmdFdpZHRoIC8gMiArIGludChyaWdodFdpZHRoIC8gMi4wICsgMC41KTsKLSAg
ICBoICs9IHRvcFdpZHRoIC8gMiArIGludChib3R0b21XaWR0aCAvIDIuMCArIDAuNSk7Ci0gICAg
Ci0gICAgYm9vbCB0dCA9IHRvcFZhbC5pc1RyYW5zcGFyZW50KCk7Ci0gICAgYm9vbCBidCA9IGJv
dHRvbVZhbC5pc1RyYW5zcGFyZW50KCk7Ci0gICAgYm9vbCBydCA9IHJpZ2h0VmFsLmlzVHJhbnNw
YXJlbnQoKTsKLSAgICBib29sIGx0ID0gbGVmdFZhbC5pc1RyYW5zcGFyZW50KCk7Ci0gICAgCi0g
ICAgRUJvcmRlclN0eWxlIHRzID0gY29sbGFwc2VkQm9yZGVyU3R5bGUodG9wVmFsLnN0eWxlKCkp
OwotICAgIEVCb3JkZXJTdHlsZSBicyA9IGNvbGxhcHNlZEJvcmRlclN0eWxlKGJvdHRvbVZhbC5z
dHlsZSgpKTsKLSAgICBFQm9yZGVyU3R5bGUgbHMgPSBjb2xsYXBzZWRCb3JkZXJTdHlsZShsZWZ0
VmFsLnN0eWxlKCkpOwotICAgIEVCb3JkZXJTdHlsZSBycyA9IGNvbGxhcHNlZEJvcmRlclN0eWxl
KHJpZ2h0VmFsLnN0eWxlKCkpOwotICAgIAotICAgIGJvb2wgcmVuZGVyX3QgPSB0cyA+IEJISURE
RU4gJiYgIXR0OwotICAgIGJvb2wgcmVuZGVyX2wgPSBscyA+IEJISURERU4gJiYgIWx0OwotICAg
IGJvb2wgcmVuZGVyX3IgPSBycyA+IEJISURERU4gJiYgIXJ0OwotICAgIGJvb2wgcmVuZGVyX2Ig
PSBicyA+IEJISURERU4gJiYgIWJ0OwotCi0gICAgLy8gV2UgbmV2ZXIgcGFpbnQgZGlhZ29uYWxz
IGF0IHRoZSBqb2lucy4gIFdlIHNpbXBseSBsZXQgdGhlIGJvcmRlciB3aXRoIHRoZSBoaWdoZXN0
Ci0gICAgLy8gcHJlY2VkZW5jZSBwYWludCBvbiB0b3Agb2YgYm9yZGVycyB3aXRoIGxvd2VyIHBy
ZWNlZGVuY2UuICAKLSAgICBDb2xsYXBzZWRCb3JkZXJzIGJvcmRlcnMoNCk7Ci0gICAgYm9yZGVy
cy5hZGRCb3JkZXIodG9wVmFsLCBCU1RvcCwgcmVuZGVyX3QsIF90eCwgX3R5LCBfdHggKyB3LCBf
dHkgKyB0b3BXaWR0aCwgdHMpOwotICAgIGJvcmRlcnMuYWRkQm9yZGVyKGJvdHRvbVZhbCwgQlNC
b3R0b20sIHJlbmRlcl9iLCBfdHgsIF90eSArIGggLSBib3R0b21XaWR0aCwgX3R4ICsgdywgX3R5
ICsgaCwgYnMpOwotICAgIGJvcmRlcnMuYWRkQm9yZGVyKGxlZnRWYWwsIEJTTGVmdCwgcmVuZGVy
X2wsIF90eCwgX3R5LCBfdHggKyBsZWZ0V2lkdGgsIF90eSArIGgsIGxzKTsKLSAgICBib3JkZXJz
LmFkZEJvcmRlcihyaWdodFZhbCwgQlNSaWdodCwgcmVuZGVyX3IsIF90eCArIHcgLSByaWdodFdp
ZHRoLCBfdHksIF90eCArIHcsIF90eSArIGgsIHJzKTsKLSAgICAKLSAgICBmb3IgKENvbGxhcHNl
ZEJvcmRlciogYm9yZGVyID0gYm9yZGVycy5uZXh0Qm9yZGVyKCk7IGJvcmRlcjsgYm9yZGVyID0g
Ym9yZGVycy5uZXh0Qm9yZGVyKCkpIHsKLSAgICAgICAgaWYgKGJvcmRlci0+Ym9yZGVyID09ICp0
YWJsZSgpLT5jdXJyZW50Qm9yZGVyU3R5bGUoKSkKLSAgICAgICAgICAgIGRyYXdCb3JkZXIocCwg
Ym9yZGVyLT54MSwgYm9yZGVyLT55MSwgYm9yZGVyLT54MiwgYm9yZGVyLT55MiwgYm9yZGVyLT5z
aWRlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLT5ib3JkZXIuY29sb3IoKSwgc3R5
bGUoKS0+Y29sb3IoKSwgYm9yZGVyLT5zdHlsZSwgMCwgMCk7Ci0gICAgfQotfQotCi1JbnRSZWN0
IFJlbmRlclRhYmxlQ2VsbDo6Z2V0QWJzb2x1dGVSZXBhaW50UmVjdCgpCi17Ci0gICAgaW50IG93
ID0gc3R5bGUoKSA/IHN0eWxlKCktPm91dGxpbmVTaXplKCkgOiAwOwotICAgIEludFJlY3Qgcigt
b3csIC1vdyAtIGJvcmRlclRvcEV4dHJhKCksIAotICAgICAgICAgICAgb3ZlcmZsb3dXaWR0aChm
YWxzZSkgKyBvdyAqIDIsIG92ZXJmbG93SGVpZ2h0KGZhbHNlKSArIGJvcmRlclRvcEV4dHJhKCkg
KyBib3JkZXJCb3R0b21FeHRyYSgpICsgb3cgKiAyKTsKLSAgICBjb21wdXRlQWJzb2x1dGVSZXBh
aW50UmVjdChyKTsKLSAgICByZXR1cm4gcjsKLX0KLQotdm9pZCBSZW5kZXJUYWJsZUNlbGw6OnBh
aW50Qm94RGVjb3JhdGlvbnMoUGFpbnRJbmZvJiBpLCBpbnQgX3R4LCBpbnQgX3R5KQotewotICAg
IFJlbmRlclRhYmxlKiB0YWJsZUVsdCA9IHRhYmxlKCk7Ci0gICAgaWYgKCF0YWJsZUVsdC0+Y29s
bGFwc2VCb3JkZXJzKCkgJiYgc3R5bGUoKS0+ZW1wdHlDZWxscygpID09IEhJREUgJiYgIWZpcnN0
Q2hpbGQoKSkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIGludCB3ID0gd2lkdGgoKTsKLSAg
ICBpbnQgaCA9IGhlaWdodCgpICsgYm9yZGVyVG9wRXh0cmEoKSArIGJvcmRlckJvdHRvbUV4dHJh
KCk7Ci0gICAgX3R5IC09IGJvcmRlclRvcEV4dHJhKCk7Ci0KLSAgICBRQ29sb3IgYyA9IHN0eWxl
KCktPmJhY2tncm91bmRDb2xvcigpOwotICAgIGlmICghYy5pc1ZhbGlkKCkgJiYgcGFyZW50KCkp
IC8vIHRha2UgZnJvbSByb3cKLSAgICAgICAgYyA9IHBhcmVudCgpLT5zdHlsZSgpLT5iYWNrZ3Jv
dW5kQ29sb3IoKTsKLSAgICBpZiAoIWMuaXNWYWxpZCgpICYmIHBhcmVudCgpICYmIHBhcmVudCgp
LT5wYXJlbnQoKSkgLy8gdGFrZSBmcm9tIHJvd2dyb3VwCi0gICAgICAgIGMgPSBwYXJlbnQoKS0+
cGFyZW50KCktPnN0eWxlKCktPmJhY2tncm91bmRDb2xvcigpOwotICAgIGlmICghYy5pc1ZhbGlk
KCkpIHsKLQkvLyBzZWUgaWYgd2UgaGF2ZSBhIGNvbCBvciBjb2xncm91cCBmb3IgdGhpcwotCVJl
bmRlclRhYmxlQ29sICpjb2wgPSB0YWJsZSgpLT5jb2xFbGVtZW50KF9jb2wpOwotCWlmIChjb2wp
IHsKLQkgICAgYyA9IGNvbC0+c3R5bGUoKS0+YmFja2dyb3VuZENvbG9yKCk7Ci0JICAgIGlmICgh
Yy5pc1ZhbGlkKCkpIHsKLQkJLy8gdHJ5IGNvbHVtbiBncm91cAotCQlSZW5kZXJTdHlsZSAqc3R5
bGUgPSBjb2wtPnBhcmVudCgpLT5zdHlsZSgpOwotCQlpZiAoc3R5bGUtPmRpc3BsYXkoKSA9PSBU
QUJMRV9DT0xVTU5fR1JPVVApCi0JCSAgICBjID0gc3R5bGUtPmJhY2tncm91bmRDb2xvcigpOwot
CSAgICB9Ci0JfQotICAgIH0KLQotICAgIC8vIEZJWE1FOiBUaGlzIGNvZGUgaXMganVzdCBwbGFp
biB3cm9uZy4gIFJvd3MgYW5kIGNvbHVtbnMgc2hvdWxkIHBhaW50IHRoZWlyIGJhY2tncm91bmRz
Ci0gICAgLy8gaW5kZXBlbmRlbnQgZnJvbSB0aGUgY2VsbC4KLSAgICAvLyAjIyMgZ2V0IG9mZnNl
dHMgcmlnaHQgaW4gY2FzZSB0aGUgYmdpbWFnZSBpcyBpbmhlcml0ZWQuCi0gICAgY29uc3QgQmFj
a2dyb3VuZExheWVyKiBiZ0xheWVyID0gc3R5bGUoKS0+YmFja2dyb3VuZExheWVycygpOwotICAg
IGlmICghYmdMYXllci0+aGFzSW1hZ2UoKSAmJiBwYXJlbnQoKSkKLSAgICAgICAgYmdMYXllciA9
IHBhcmVudCgpLT5zdHlsZSgpLT5iYWNrZ3JvdW5kTGF5ZXJzKCk7Ci0gICAgaWYgKCFiZ0xheWVy
LT5oYXNJbWFnZSgpICYmIHBhcmVudCgpICYmIHBhcmVudCgpLT5wYXJlbnQoKSkKLSAgICAgICAg
YmdMYXllciA9IHBhcmVudCgpLT5wYXJlbnQoKS0+c3R5bGUoKS0+YmFja2dyb3VuZExheWVycygp
OwotICAgIGlmICghYmdMYXllci0+aGFzSW1hZ2UoKSkgewotCS8vIHNlZSBpZiB3ZSBoYXZlIGEg
Y29sIG9yIGNvbGdyb3VwIGZvciB0aGlzCi0JUmVuZGVyVGFibGVDb2wqIGNvbCA9IHRhYmxlKCkt
PmNvbEVsZW1lbnQoX2NvbCk7Ci0JaWYgKGNvbCkgewotCSAgICBiZ0xheWVyID0gY29sLT5zdHls
ZSgpLT5iYWNrZ3JvdW5kTGF5ZXJzKCk7Ci0JICAgIGlmICghYmdMYXllci0+aGFzSW1hZ2UoKSkg
ewotCQkvLyB0cnkgY29sdW1uIGdyb3VwCi0JCVJlbmRlclN0eWxlICpzdHlsZSA9IGNvbC0+cGFy
ZW50KCktPnN0eWxlKCk7Ci0JCWlmIChzdHlsZS0+ZGlzcGxheSgpID09IFRBQkxFX0NPTFVNTl9H
Uk9VUCkKLQkJICAgIGJnTGF5ZXIgPSBzdHlsZS0+YmFja2dyb3VuZExheWVycygpOwotCSAgICB9
Ci0JfQotICAgIH0KLQotICAgIGludCBteSA9IGtNYXgoX3R5LCBpLnIueSgpKTsKLSAgICBpbnQg
ZW5kID0ga01pbihpLnIueSgpICsgaS5yLmhlaWdodCgpLCBfdHkgKyBoKTsKLSAgICBpbnQgbWgg
PSBlbmQgLSBteTsKLQotICAgIGlmIChiZ0xheWVyLT5oYXNJbWFnZSgpIHx8IGMuaXNWYWxpZCgp
KSB7Ci0JLy8gV2UgaGF2ZSB0byBjbGlwIGhlcmUgYmVjYXVzZSB0aGUgYmFja3JvdW5kIHdvdWxk
IHBhaW50Ci0gICAgICAgIC8vIG9uIHRvcCBvZiB0aGUgYm9yZGVycyBvdGhlcndpc2UuCi0gICAg
ICAgIGlmIChtX2xheWVyICYmIHRhYmxlRWx0LT5jb2xsYXBzZUJvcmRlcnMoKSkgewotICAgICAg
ICAgICAgSW50UmVjdCBjbGlwUmVjdChfdHggKyBib3JkZXJMZWZ0KCksIF90eSArIGJvcmRlclRv
cCgpLCB3IC0gYm9yZGVyTGVmdCgpIC0gYm9yZGVyUmlnaHQoKSwgaCAtIGJvcmRlclRvcCgpIC0g
Ym9yZGVyQm90dG9tKCkpOwotICAgICAgICAgICAgY2xpcFJlY3QgPSBpLnAtPnhGb3JtKGNsaXBS
ZWN0KTsKLSAgICAgICAgICAgIGkucC0+c2F2ZSgpOwotICAgICAgICAgICAgaS5wLT5hZGRDbGlw
KGNsaXBSZWN0KTsKLSAgICAgICAgfQotICAgICAgICBwYWludEJhY2tncm91bmQoaS5wLCBjLCBi
Z0xheWVyLCBteSwgbWgsIF90eCwgX3R5LCB3LCBoKTsKLSAgICAgICAgaWYgKG1fbGF5ZXIgJiYg
dGFibGVFbHQtPmNvbGxhcHNlQm9yZGVycygpKQotICAgICAgICAgICAgaS5wLT5yZXN0b3JlKCk7
Ci0gICAgfQotCi0gICAgaWYgKHN0eWxlKCktPmhhc0JvcmRlcigpICYmICF0YWJsZUVsdC0+Y29s
bGFwc2VCb3JkZXJzKCkpCi0gICAgICAgIHBhaW50Qm9yZGVyKGkucCwgX3R4LCBfdHksIHcsIGgs
IHN0eWxlKCkpOwotfQotCi0KLSNpZm5kZWYgTkRFQlVHCi12b2lkIFJlbmRlclRhYmxlQ2VsbDo6
ZHVtcChRVGV4dFN0cmVhbSAqc3RyZWFtLCBRU3RyaW5nIGluZCkgY29uc3QKLXsKLSAgICAqc3Ry
ZWFtIDw8ICIgcm93PSIgPDwgX3JvdzsKLSAgICAqc3RyZWFtIDw8ICIgY29sPSIgPDwgX2NvbDsK
LSAgICAqc3RyZWFtIDw8ICIgclNwYW49IiA8PCByU3BhbjsKLSAgICAqc3RyZWFtIDw8ICIgY1Nw
YW49IiA8PCBjU3BhbjsKLS8vICAgICpzdHJlYW0gPDwgIiBuV3JhcD0iIDw8IG5XcmFwOwotCi0g
ICAgUmVuZGVyQmxvY2s6OmR1bXAoc3RyZWFtLGluZCk7Ci19Ci0jZW5kaWYKLQotLy8gLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLQotCi1SZW5kZXJUYWJsZUNvbDo6UmVuZGVyVGFibGVDb2woRE9NOjpOb2RlSW1w
bCogbm9kZSkKLSAgICA6IFJlbmRlckNvbnRhaW5lcihub2RlKQotewotICAgIC8vIGluaXQgUmVu
ZGVyT2JqZWN0IGF0dHJpYnV0ZXMKLSAgICBzZXRJbmxpbmUodHJ1ZSk7ICAgLy8gb3VyIG9iamVj
dCBpcyBub3QgSW5saW5lCi0KLSAgICBfc3BhbiA9IDE7Ci0gICAgdXBkYXRlRnJvbUVsZW1lbnQo
KTsKIH0KLQotdm9pZCBSZW5kZXJUYWJsZUNvbDo6dXBkYXRlRnJvbUVsZW1lbnQoKQotewotICAg
IGludCBvbGRTcGFuID0gX3NwYW47Ci0gICAgRE9NOjpOb2RlSW1wbCAqbm9kZSA9IGVsZW1lbnQo
KTsKLSAgICBpZiAobm9kZSAmJiAobm9kZS0+aGFzVGFnTmFtZShjb2xUYWcpIHx8IG5vZGUtPmhh
c1RhZ05hbWUoY29sZ3JvdXBUYWcpKSkgewotICAgICAgICBET006OkhUTUxUYWJsZUNvbEVsZW1l
bnRJbXBsICp0YyA9IHN0YXRpY19jYXN0PERPTTo6SFRNTFRhYmxlQ29sRWxlbWVudEltcGwgKj4o
bm9kZSk7Ci0gICAgICAgIF9zcGFuID0gdGMtPnNwYW4oKTsKLSAgICB9IGVsc2UKLSAgICAgIF9z
cGFuID0gIShzdHlsZSgpICYmIHN0eWxlKCktPmRpc3BsYXkoKSA9PSBUQUJMRV9DT0xVTU5fR1JP
VVApOwotICAgIGlmIChfc3BhbiAhPSBvbGRTcGFuICYmIHN0eWxlKCkgJiYgcGFyZW50KCkpCi0g
ICAgICAgIHNldE5lZWRzTGF5b3V0QW5kTWluTWF4UmVjYWxjKCk7Ci19Ci0KLWJvb2wgUmVuZGVy
VGFibGVDb2w6OmNhbkhhdmVDaGlsZHJlbigpIGNvbnN0Ci17Ci0gICAgLy8gY29scyBjYW5ub3Qg
aGF2ZSBjaGlsZHJlbi4gIFRoaXMgaXMgYWN0dWFsbHkgbmVjZXNzYXJ5IHRvIGZpeCBhIGJ1Zwot
ICAgIC8vIHdpdGggbGlicmFyaWVzLnVjLmVkdSwgd2hpY2ggbWFrZXMgYSA8cD4gYmUgYSB0YWJs
ZS1jb2x1bW4uCi0gICAgcmV0dXJuIHN0eWxlKCktPmRpc3BsYXkoKSA9PSBUQUJMRV9DT0xVTU5f
R1JPVVA7Ci19Ci0KLXZvaWQgUmVuZGVyVGFibGVDb2w6OmFkZENoaWxkKFJlbmRlck9iamVjdCAq
Y2hpbGQsIFJlbmRlck9iamVjdCAqYmVmb3JlQ2hpbGQpCi17Ci0gICAgS0hUTUxBc3NlcnQoY2hp
bGQtPnN0eWxlKCktPmRpc3BsYXkoKSA9PSBUQUJMRV9DT0xVTU4pOwotCi0gICAgLy8gdGhlc2Ug
aGF2ZSB0byBjb21lIGJlZm9yZSB0aGUgdGFibGUgZGVmaW5pdGlvbiEKLSAgICBSZW5kZXJDb250
YWluZXI6OmFkZENoaWxkKGNoaWxkLCBiZWZvcmVDaGlsZCk7Ci19Ci0KLSNpZm5kZWYgTkRFQlVH
Ci12b2lkIFJlbmRlclRhYmxlQ29sOjpkdW1wKFFUZXh0U3RyZWFtICpzdHJlYW0sIFFTdHJpbmcg
aW5kKSBjb25zdAotewotICAgICpzdHJlYW0gPDwgIiBfc3Bhbj0iIDw8IF9zcGFuOwotICAgIFJl
bmRlckNvbnRhaW5lcjo6ZHVtcChzdHJlYW0sIGluZCk7Ci19Ci0jZW5kaWYKLQotI3VuZGVmIFRB
QkxFX0RFQlVHCi0jdW5kZWYgREVCVUdfTEFZT1VUCi0jdW5kZWYgQk9YX0RFQlVHCkluZGV4OiBy
ZW5kZXJpbmcvcmVuZGVyX2Zsb3cuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHJlbmRlcmluZy9yZW5kZXJf
Zmxvdy5jcHAJKHJldmlzaW9uIDEyMjUzKQorKysgcmVuZGVyaW5nL3JlbmRlcl9mbG93LmNwcAko
d29ya2luZyBjb3B5KQpAQCAtMjksMTEgKzI5LDEwIEBACiAKICNpbmNsdWRlICJyZW5kZXJpbmcv
cmVuZGVyX2Zsb3cuaCIKICNpbmNsdWRlICJJbmxpbmVUZXh0Qm94LmgiCi0jaW5jbHVkZSAicmVu
ZGVyaW5nL3JlbmRlcl90YWJsZS5oIgogI2luY2x1ZGUgInJlbmRlcmluZy9yZW5kZXJfY2FudmFz
LmgiCiAjaW5jbHVkZSAiRG9jdW1lbnRJbXBsLmgiCiAjaW5jbHVkZSAicmVuZGVyX2lubGluZS5o
IgotI2luY2x1ZGUgInJlbmRlcl9ibG9jay5oIgorI2luY2x1ZGUgIlJlbmRlckJsb2NrLmgiCiAj
aW5jbHVkZSAicmVuZGVyX2FyZW5hLmgiCiAjaW5jbHVkZSAicmVuZGVyX2xpbmUuaCIKICNpbmNs
dWRlICJodG1sbmFtZXMuaCIKSW5kZXg6IHJlbmRlcmluZy9yZW5kZXJfaW5saW5lLmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSByZW5kZXJpbmcvcmVuZGVyX2lubGluZS5jcHAJKHJldmlzaW9uIDEyMjUzKQor
KysgcmVuZGVyaW5nL3JlbmRlcl9pbmxpbmUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNyw3ICsy
Nyw3IEBACiAKICNpbmNsdWRlICJEb2N1bWVudEltcGwuaCIKICNpbmNsdWRlICJyZW5kZXJfYXJl
bmEuaCIKLSNpbmNsdWRlICJyZW5kZXJfYmxvY2suaCIKKyNpbmNsdWRlICJSZW5kZXJCbG9jay5o
IgogI2luY2x1ZGUgInZpc2libGVfcG9zaXRpb24uaCIKIAogbmFtZXNwYWNlIFdlYkNvcmUgewpJ
bmRleDogcmVuZGVyaW5nL1JlbmRlclRhYmxlUm93LmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSByZW5kZXJp
bmcvUmVuZGVyVGFibGVSb3cuY3BwCShyZXZpc2lvbiAxMjI1MykKKysrIHJlbmRlcmluZy9SZW5k
ZXJUYWJsZVJvdy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTYsNyArNiw3IEBACiAgKiAgICAgICAg
ICAgKEMpIDE5OTggV2FsZG8gQmFzdGlhbiAoYmFzdGlhbkBrZGUub3JnKQogICogICAgICAgICAg
IChDKSAxOTk5IExhcnMgS25vbGwgKGtub2xsQGtkZS5vcmcpCiAgKiAgICAgICAgICAgKEMpIDE5
OTkgQW50dGkgS29pdmlzdG8gKGtvaXZpc3RvQGtkZS5vcmcpCi0gKiBDb3B5cmlnaHQgKEMpIDIw
MDMgQXBwbGUgQ29tcHV0ZXIsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCwgMjAw
NSwgMjAwNiBBcHBsZSBDb21wdXRlciwgSW5jLgogICoKICAqIFRoaXMgbGlicmFyeSBpcyBmcmVl
IHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAqIG1vZGlmeSBpdCB1
bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCkBAIC0yNCwx
MzQ1ICsyNCwxNyBAQAogICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCiAgKi8KIAotLy8j
ZGVmaW5lIFRBQkxFX0RFQlVHCi0vLyNkZWZpbmUgVEFCTEVfUFJJTlQKLS8vI2RlZmluZSBERUJV
R19MQVlPVVQKLS8vI2RlZmluZSBCT1hfREVCVUcKICNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNs
dWRlICJyZW5kZXJpbmcvcmVuZGVyX3RhYmxlLmgiCi0jaW5jbHVkZSAicmVuZGVyaW5nL3RhYmxl
X2xheW91dC5oIgotI2luY2x1ZGUgImh0bWwvaHRtbF90YWJsZWltcGwuaCIKLSNpbmNsdWRlICJo
dG1sbmFtZXMuaCIKLSNpbmNsdWRlICJEb2N1bWVudEltcGwuaCIKLQotI2luY2x1ZGUgPHFhcHBs
aWNhdGlvbi5oPgotI2luY2x1ZGUgPHFzdHlsZS5oPgotCi0jaW5jbHVkZSA8a2RlYnVnLmg+Ci0j
aW5jbHVkZSA8YXNzZXJ0Lmg+Ci0KLXVzaW5nIG5hbWVzcGFjZSBraHRtbDsKLXVzaW5nIG5hbWVz
cGFjZSBET007Ci11c2luZyBuYW1lc3BhY2UgSFRNTE5hbWVzOwotCi1SZW5kZXJUYWJsZTo6UmVu
ZGVyVGFibGUoRE9NOjpOb2RlSW1wbCogbm9kZSkKLSAgICA6IFJlbmRlckJsb2NrKG5vZGUpCi17
Ci0gICAgdENhcHRpb24gPSAwOwotICAgIGhlYWQgPSBmb290ID0gZmlyc3RCb2R5ID0gMDsKLSAg
ICB0YWJsZUxheW91dCA9IDA7Ci0gICAgbV9jdXJyZW50Qm9yZGVyID0gMDsKLSAgICAKLSAgICBy
dWxlcyA9IE5vbmU7Ci0gICAgZnJhbWUgPSBWb2lkOwotICAgIGhhc19jb2xfZWxlbXMgPSBmYWxz
ZTsKLSAgICBoc3BhY2luZyA9IDA7Ci0gICAgdnNwYWNpbmcgPSAwOwotICAgIHBhZGRpbmcgPSAw
OwotICAgIG5lZWRTZWN0aW9uUmVjYWxjID0gZmFsc2U7Ci0gICAgcGFkZGluZyA9IDA7Ci0KLSAg
ICBjb2x1bW5Qb3MucmVzaXplKDIpOwotICAgIGNvbHVtblBvcy5maWxsKDApOwotICAgIGNvbHVt
bnMucmVzaXplKDEpOwotICAgIGNvbHVtbnMuZmlsbChDb2x1bW5TdHJ1Y3QoKSk7Ci0KLSAgICBj
b2x1bW5Qb3NbMF0gPSAwOwotfQotCi1SZW5kZXJUYWJsZTo6flJlbmRlclRhYmxlKCkKLXsKLSAg
ICBkZWxldGUgdGFibGVMYXlvdXQ7Ci19Ci0KLXZvaWQgUmVuZGVyVGFibGU6OnNldFN0eWxlKFJl
bmRlclN0eWxlICpfc3R5bGUpCi17Ci0gICAgRVRhYmxlTGF5b3V0IG9sZFRhYmxlTGF5b3V0ID0g
c3R5bGUoKSA/IHN0eWxlKCktPnRhYmxlTGF5b3V0KCkgOiBUQVVUTzsKLSAgICBSZW5kZXJCbG9j
azo6c2V0U3R5bGUoX3N0eWxlKTsKLQotICAgIC8vIEluIHRoZSBjb2xsYXBzZWQgYm9yZGVyIG1v
ZGVsLCB0aGVyZSBpcyBubyBjZWxsIHNwYWNpbmcuCi0gICAgaHNwYWNpbmcgPSBjb2xsYXBzZUJv
cmRlcnMoKSA/IDAgOiBzdHlsZSgpLT5ob3Jpem9udGFsQm9yZGVyU3BhY2luZygpOwotICAgIHZz
cGFjaW5nID0gY29sbGFwc2VCb3JkZXJzKCkgPyAwIDogc3R5bGUoKS0+dmVydGljYWxCb3JkZXJT
cGFjaW5nKCk7Ci0gICAgY29sdW1uUG9zWzBdID0gaHNwYWNpbmc7Ci0KLSAgICBpZiAoIXRhYmxl
TGF5b3V0IHx8IHN0eWxlKCktPnRhYmxlTGF5b3V0KCkgIT0gb2xkVGFibGVMYXlvdXQpIHsKLQlk
ZWxldGUgdGFibGVMYXlvdXQ7Ci0KLSAgICAgICAgLy8gQWNjb3JkaW5nIHRvIHRoZSBDU1MyIHNw
ZWMsIHlvdSBvbmx5IHVzZSBmaXhlZCB0YWJsZSBsYXlvdXQgaWYgYW4KLSAgICAgICAgLy8gZXhw
bGljaXQgd2lkdGggaXMgc3BlY2lmaWVkIG9uIHRoZSB0YWJsZS4gIEF1dG8gd2lkdGggaW1wbGll
cyBhdXRvIHRhYmxlIGxheW91dC4KLQlpZiAoc3R5bGUoKS0+dGFibGVMYXlvdXQoKSA9PSBURklY
RUQgJiYgIXN0eWxlKCktPndpZHRoKCkuaXNBdXRvKCkpCi0JICAgIHRhYmxlTGF5b3V0ID0gbmV3
IEZpeGVkVGFibGVMYXlvdXQodGhpcyk7Ci0JZWxzZQotCSAgICB0YWJsZUxheW91dCA9IG5ldyBB
dXRvVGFibGVMYXlvdXQodGhpcyk7Ci0gICAgfQotfQotCi12b2lkIFJlbmRlclRhYmxlOjphZGRD
aGlsZChSZW5kZXJPYmplY3QgKmNoaWxkLCBSZW5kZXJPYmplY3QgKmJlZm9yZUNoaWxkKQotewot
ICAgIFJlbmRlck9iamVjdCAqbyA9IGNoaWxkOwotCi0gICAgaWYgKGNoaWxkLT5lbGVtZW50KCkg
JiYgY2hpbGQtPmVsZW1lbnQoKS0+aGFzVGFnTmFtZShmb3JtVGFnKSkgewotICAgICAgICBSZW5k
ZXJDb250YWluZXI6OmFkZENoaWxkKGNoaWxkLGJlZm9yZUNoaWxkKTsKLSAgICAgICAgcmV0dXJu
OwotICAgIH0KLQotICAgIHN3aXRjaCAoY2hpbGQtPnN0eWxlKCktPmRpc3BsYXkoKSkgewotICAg
ICAgICBjYXNlIFRBQkxFX0NBUFRJT046Ci0gICAgICAgICAgICB0Q2FwdGlvbiA9IHN0YXRpY19j
YXN0PFJlbmRlckJsb2NrICo+KGNoaWxkKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBj
YXNlIFRBQkxFX0NPTFVNTjoKLSAgICAgICAgY2FzZSBUQUJMRV9DT0xVTU5fR1JPVVA6Ci0gICAg
ICAgICAgICBoYXNfY29sX2VsZW1zID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICBjYXNlIFRBQkxFX0hFQURFUl9HUk9VUDoKLSAgICAgICAgICAgIGlmICghaGVhZCkKLSAgICAg
ICAgICAgICAgICBoZWFkID0gc3RhdGljX2Nhc3Q8UmVuZGVyVGFibGVTZWN0aW9uICo+KGNoaWxk
KTsKLSAgICAgICAgICAgIGVsc2UgaWYgKCFmaXJzdEJvZHkpCi0gICAgICAgICAgICAgICAgZmly
c3RCb2R5ID0gc3RhdGljX2Nhc3Q8UmVuZGVyVGFibGVTZWN0aW9uICo+KGNoaWxkKTsKLSAgICAg
ICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRBQkxFX0ZPT1RFUl9HUk9VUDoKLSAgICAgICAg
ICAgIGlmICghZm9vdCkgewotICAgICAgICAgICAgICAgIGZvb3QgPSBzdGF0aWNfY2FzdDxSZW5k
ZXJUYWJsZVNlY3Rpb24gKj4oY2hpbGQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICAgICAgfQotICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCi0gICAgICAgIGNhc2UgVEFCTEVf
Uk9XX0dST1VQOgotICAgICAgICAgICAgaWYgKCFmaXJzdEJvZHkpCi0gICAgICAgICAgICAgICAg
Zmlyc3RCb2R5ID0gc3RhdGljX2Nhc3Q8UmVuZGVyVGFibGVTZWN0aW9uICo+KGNoaWxkKTsKLSAg
ICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgaWYgKCFiZWZv
cmVDaGlsZCAmJiBsYXN0Q2hpbGQoKSAmJgotICAgICAgICAgICAgICAgIGxhc3RDaGlsZCgpLT5p
c1RhYmxlU2VjdGlvbigpICYmIGxhc3RDaGlsZCgpLT5pc0Fub255bW91cygpKSB7Ci0gICAgICAg
ICAgICAgICAgbyA9IGxhc3RDaGlsZCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAg
ICAgICAgICBSZW5kZXJPYmplY3QgKmxhc3RCb3ggPSBiZWZvcmVDaGlsZDsKLSAgICAgICAgICAg
ICAgICBSZW5kZXJPYmplY3QgKm5leHRUb0xhc3RCb3ggPSBiZWZvcmVDaGlsZDsKLSAgICAgICAg
ICAgICAgICB3aGlsZSAobGFzdEJveCAmJiBsYXN0Qm94LT5wYXJlbnQoKS0+aXNBbm9ueW1vdXMo
KSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIWxhc3RCb3gtPmlzVGFibGVTZWN0aW9uKCkg
JiYgbGFzdEJveC0+c3R5bGUoKS0+ZGlzcGxheSgpICE9IFRBQkxFX0NBUFRJT04pIHsKLSAgICAg
ICAgICAgICAgICAgICAgbmV4dFRvTGFzdEJveCA9IGxhc3RCb3g7Ci0gICAgICAgICAgICAgICAg
ICAgIGxhc3RCb3ggPSBsYXN0Qm94LT5wYXJlbnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAg
ICAgICAgICAgICAgaWYgKGxhc3RCb3ggJiYgbGFzdEJveC0+aXNBbm9ueW1vdXMoKSkgewotICAg
ICAgICAgICAgICAgICAgICBsYXN0Qm94LT5hZGRDaGlsZChjaGlsZCwgbmV4dFRvTGFzdEJveCk7
Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9IGVsc2Ugewot
ICAgICAgICAgICAgICAgICAgICBpZiAoYmVmb3JlQ2hpbGQgJiYgIWJlZm9yZUNoaWxkLT5pc1Rh
YmxlU2VjdGlvbigpKQotICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlQ2hpbGQgPSAwOwot
ICAgICAgICAgICAgICAgICAgICBvID0gbmV3IChyZW5kZXJBcmVuYSgpKSBSZW5kZXJUYWJsZVNl
Y3Rpb24oZG9jdW1lbnQoKSAvKiBhbm9ueW1vdXMgKi8pOwotICAgICAgICAgICAgICAgICAgICBS
ZW5kZXJTdHlsZSAqbmV3U3R5bGUgPSBuZXcgKHJlbmRlckFyZW5hKCkpIFJlbmRlclN0eWxlKCk7
Ci0gICAgICAgICAgICAgICAgICAgIG5ld1N0eWxlLT5pbmhlcml0RnJvbShzdHlsZSgpKTsKLSAg
ICAgICAgICAgICAgICAgICAgbmV3U3R5bGUtPnNldERpc3BsYXkoVEFCTEVfUk9XX0dST1VQKTsK
LSAgICAgICAgICAgICAgICAgICAgby0+c2V0U3R5bGUobmV3U3R5bGUpOwotICAgICAgICAgICAg
ICAgICAgICBhZGRDaGlsZChvLCBiZWZvcmVDaGlsZCk7Ci0gICAgICAgICAgICAgICAgfQotICAg
ICAgICAgICAgfQotICAgICAgICAgICAgby0+YWRkQ2hpbGQoY2hpbGQpOwotICAgICAgICAgICAg
Y2hpbGQtPnNldE5lZWRzTGF5b3V0QW5kTWluTWF4UmVjYWxjKCk7Ci0gICAgICAgICAgICByZXR1
cm47Ci0gICAgfQotICAgIFJlbmRlckNvbnRhaW5lcjo6YWRkQ2hpbGQoY2hpbGQsYmVmb3JlQ2hp
bGQpOwotfQotCi0KLQotdm9pZCBSZW5kZXJUYWJsZTo6Y2FsY1dpZHRoKCkKLXsKLSAgICBpZiAo
aXNQb3NpdGlvbmVkKCkpCi0gICAgICAgIGNhbGNBYnNvbHV0ZUhvcml6b250YWwoKTsKLQotICAg
IFJlbmRlckJsb2NrICpjYiA9IGNvbnRhaW5pbmdCbG9jaygpOwotICAgIGludCBhdmFpbGFibGVX
aWR0aCA9IGNiLT5jb250ZW50V2lkdGgoKTsKLQotICAgIExlbmd0aFR5cGUgd2lkdGhUeXBlID0g
c3R5bGUoKS0+d2lkdGgoKS50eXBlOwotICAgIGlmICh3aWR0aFR5cGUgPiBSZWxhdGl2ZSAmJiBz
dHlsZSgpLT53aWR0aCgpLnZhbHVlID4gMCkgewotCS8vIFBlcmNlbnQgb3IgZml4ZWQgdGFibGUK
LSAgICAgICAgbV93aWR0aCA9IHN0eWxlKCktPndpZHRoKCkubWluV2lkdGgoYXZhaWxhYmxlV2lk
dGgpOwotICAgICAgICBpZiAobV9taW5XaWR0aCA+IG1fd2lkdGgpIG1fd2lkdGggPSBtX21pbldp
ZHRoOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIEFuIGF1dG8gd2lkdGggdGFibGUgc2hvdWxk
IHNocmluayB0byBmaXQgd2l0aGluIHRoZSBsaW5lIHdpZHRoIGlmIG5lY2Vzc2FyeSBpbiBvcmRl
ciB0byAKLSAgICAgICAgLy8gYXZvaWQgb3ZlcmxhcHBpbmcgZmxvYXRzLgotICAgICAgICBhdmFp
bGFibGVXaWR0aCA9IGNiLT5saW5lV2lkdGgobV95KTsKLSAgICAgICAgCi0gICAgICAgIC8vIFN1
YnRyYWN0IG91dCBhbnkgZml4ZWQgbWFyZ2lucyBmcm9tIG91ciBhdmFpbGFibGUgd2lkdGggZm9y
IGF1dG8gd2lkdGggdGFibGVzLgotICAgICAgICBpbnQgbWFyZ2luVG90YWwgPSAwOwotICAgICAg
ICBpZiAoc3R5bGUoKS0+bWFyZ2luTGVmdCgpLnR5cGUgIT0gQXV0bykKLSAgICAgICAgICAgIG1h
cmdpblRvdGFsICs9IHN0eWxlKCktPm1hcmdpbkxlZnQoKS53aWR0aChhdmFpbGFibGVXaWR0aCk7
Ci0gICAgICAgIGlmIChzdHlsZSgpLT5tYXJnaW5SaWdodCgpLnR5cGUgIT0gQXV0bykKLSAgICAg
ICAgICAgIG1hcmdpblRvdGFsICs9IHN0eWxlKCktPm1hcmdpblJpZ2h0KCkud2lkdGgoYXZhaWxh
YmxlV2lkdGgpOwotICAgICAgICAgICAgCi0gICAgICAgIC8vIFN1YnRyYWN0IG91dCBvdXIgbWFy
Z2lucyB0byBnZXQgdGhlIGF2YWlsYWJsZSBjb250ZW50IHdpZHRoLgotICAgICAgICBpbnQgYXZh
aWxDb250ZW50V2lkdGggPSBrTWF4KDAsIGF2YWlsYWJsZVdpZHRoIC0gbWFyZ2luVG90YWwpOwot
ICAgICAgICAKLSAgICAgICAgLy8gRW5zdXJlIHdlIGFyZW4ndCBiaWdnZXIgdGhhbiBvdXIgbWF4
IHdpZHRoIG9yIHNtYWxsZXIgdGhhbiBvdXIgbWluIHdpZHRoLgotICAgICAgICBtX3dpZHRoID0g
a01pbihhdmFpbENvbnRlbnRXaWR0aCwgbV9tYXhXaWR0aCk7Ci0gICAgfQotICAgIAotICAgIG1f
d2lkdGggPSBrTWF4KG1fd2lkdGgsIG1fbWluV2lkdGgpOwotCi0gICAgLy8gRmluYWxseSwgd2l0
aCBvdXIgdHJ1ZSB3aWR0aCBkZXRlcm1pbmVkLCBjb21wdXRlIG91ciBtYXJnaW5zIGZvciByZWFs
LgotICAgIG1fbWFyZ2luUmlnaHQgPSAwOwotICAgIG1fbWFyZ2luTGVmdCA9IDA7Ci0gICAgY2Fs
Y0hvcml6b250YWxNYXJnaW5zKHN0eWxlKCktPm1hcmdpbkxlZnQoKSxzdHlsZSgpLT5tYXJnaW5S
aWdodCgpLGF2YWlsYWJsZVdpZHRoKTsKLX0KLQotdm9pZCBSZW5kZXJUYWJsZTo6bGF5b3V0KCkK
LXsKLSAgICBLSFRNTEFzc2VydChuZWVkc0xheW91dCgpKTsKLSAgICBLSFRNTEFzc2VydChtaW5N
YXhLbm93bigpKTsKLSAgICBLSFRNTEFzc2VydCghbmVlZFNlY3Rpb25SZWNhbGMpOwotCi0gICAg
aWYgKHBvc0NoaWxkTmVlZHNMYXlvdXQoKSAmJiAhbm9ybWFsQ2hpbGROZWVkc0xheW91dCgpICYm
ICFzZWxmTmVlZHNMYXlvdXQoKSkgewotICAgICAgICAvLyBBbGwgd2UgaGF2ZSB0byBpcyBsYXkg
b3V0IG91ciBwb3NpdGlvbmVkIG9iamVjdHMuCi0gICAgICAgIGxheW91dFBvc2l0aW9uZWRPYmpl
Y3RzKHRydWUpOwotICAgICAgICBzZXROZWVkc0xheW91dChmYWxzZSk7Ci0gICAgICAgIHJldHVy
bjsKLSAgICB9Ci0KLSAgICBJbnRSZWN0IG9sZEJvdW5kcywgb2xkRnVsbEJvdW5kczsKLSAgICBi
b29sIGNoZWNrRm9yUmVwYWludCA9IGNoZWNrRm9yUmVwYWludER1cmluZ0xheW91dCgpOwotICAg
IGlmIChjaGVja0ZvclJlcGFpbnQpCi0gICAgICAgIGdldEFic29sdXRlUmVwYWludFJlY3RJbmNs
dWRpbmdGbG9hdHMob2xkQm91bmRzLCBvbGRGdWxsQm91bmRzKTsKLSAgICAKLSAgICBtX2hlaWdo
dCA9IG1fb3ZlcmZsb3dIZWlnaHQgPSAwOwotICAgIGluaXRNYXhNYXJnaW5WYWx1ZXMoKTsKLSAg
ICAKLSAgICAvL2ludCBvbGRXaWR0aCA9IG1fd2lkdGg7Ci0gICAgY2FsY1dpZHRoKCk7Ci0gICAg
bV9vdmVyZmxvd1dpZHRoID0gbV93aWR0aDsKLQotICAgIC8vIHRoZSBvcHRpbWlzYXRpb24gYmVs
b3cgZG9lc24ndCB3b3JrIHNpbmNlIHRoZSBpbnRlcm5hbCB0YWJsZQotICAgIC8vIGxheW91dCBj
b3VsZCBoYXZlIGNoYW5nZWQuICB3ZSBuZWVkIHRvIGFkZCBhIGZsYWcgdG8gdGhlIHRhYmxlCi0g
ICAgLy8gbGF5b3V0IHRoYXQgdGVsbHMgdXMgaWYgc29tZXRoaW5nIGhhcyBjaGFuZ2VkIGluIHRo
ZSBtaW4gbWF4Ci0gICAgLy8gY2FsY3VsYXRpb25zIHRvIGRvIGl0IGNvcnJlY3RseS4KLS8vICAg
ICBpZiAoIG9sZFdpZHRoICE9IG1fd2lkdGggfHwgY29sdW1ucy5zaXplKCkgKyAxICE9IGNvbHVt
blBvcy5zaXplKCkgKQotICAgIHRhYmxlTGF5b3V0LT5sYXlvdXQoKTsKLQotICAgIHNldENlbGxX
aWR0aHMoKTsKLQotICAgIC8vIGxheW91dCBjaGlsZCBvYmplY3RzCi0gICAgaW50IGNhbGN1bGF0
ZWRIZWlnaHQgPSAwOwotCi0gICAgUmVuZGVyT2JqZWN0ICpjaGlsZCA9IGZpcnN0Q2hpbGQoKTsK
LSAgICB3aGlsZShjaGlsZCkgewotCWlmIChjaGlsZC0+bmVlZHNMYXlvdXQoKSAmJiAhKGNoaWxk
LT5lbGVtZW50KCkgJiYgY2hpbGQtPmVsZW1lbnQoKS0+aGFzVGFnTmFtZShmb3JtVGFnKSkpCi0J
ICAgIGNoaWxkLT5sYXlvdXQoKTsKLQlpZiAoY2hpbGQtPmlzVGFibGVTZWN0aW9uKCkpIHsKLQkg
ICAgc3RhdGljX2Nhc3Q8UmVuZGVyVGFibGVTZWN0aW9uICo+KGNoaWxkKS0+Y2FsY1Jvd0hlaWdo
dCgpOwotCSAgICBjYWxjdWxhdGVkSGVpZ2h0ICs9IHN0YXRpY19jYXN0PFJlbmRlclRhYmxlU2Vj
dGlvbiAqPihjaGlsZCktPmxheW91dFJvd3MoMCk7Ci0JfQotCWNoaWxkID0gY2hpbGQtPm5leHRT
aWJsaW5nKCk7Ci0gICAgfQotCi0gICAgLy8gIyMjIGNvbGxhcHNlIGNhcHRpb24gbWFyZ2luCi0g
ICAgaWYgKHRDYXB0aW9uICYmIHRDYXB0aW9uLT5zdHlsZSgpLT5jYXB0aW9uU2lkZSgpICE9IENB
UEJPVFRPTSkgewotICAgICAgICB0Q2FwdGlvbi0+c2V0UG9zKHRDYXB0aW9uLT5tYXJnaW5MZWZ0
KCksIG1faGVpZ2h0KTsKLSAgICAgICAgbV9oZWlnaHQgKz0gdENhcHRpb24tPmhlaWdodCgpICsg
dENhcHRpb24tPm1hcmdpblRvcCgpICsgdENhcHRpb24tPm1hcmdpbkJvdHRvbSgpOwotICAgIH0K
LQotICAgIGludCBicFRvcCA9IGJvcmRlclRvcCgpICsgKGNvbGxhcHNlQm9yZGVycygpID8gMCA6
IHBhZGRpbmdUb3AoKSk7Ci0gICAgaW50IGJwQm90dG9tID0gYm9yZGVyQm90dG9tKCkgKyAoY29s
bGFwc2VCb3JkZXJzKCkgPyAwIDogcGFkZGluZ0JvdHRvbSgpKTsKLSAgICAKLSAgICBtX2hlaWdo
dCArPSBicFRvcDsKLQotICAgIGludCBvbGRIZWlnaHQgPSBtX2hlaWdodDsKLSAgICBjYWxjSGVp
Z2h0KCk7Ci0gICAgaW50IG5ld0hlaWdodCA9IG1faGVpZ2h0OwotICAgIG1faGVpZ2h0ID0gb2xk
SGVpZ2h0OwotCi0gICAgTGVuZ3RoIGggPSBzdHlsZSgpLT5oZWlnaHQoKTsKLSAgICBpbnQgdGgg
PSAwOwotICAgIGlmIChpc1Bvc2l0aW9uZWQoKSkKLSAgICAgICAgdGggPSBuZXdIZWlnaHQ7IC8v
IEZJWE1FOiBMZWF2ZSB0aGlzIGFsb25lIGZvciBub3cgYnV0IGludmVzdGlnYXRlIGxhdGVyLgot
ICAgIGVsc2UgaWYgKGguaXNGaXhlZCgpKQotICAgICAgICB0aCA9IGgudmFsdWUgLSAoYnBUb3Ag
KyBicEJvdHRvbSk7ICAvLyBUYWJsZXMgc2l6ZSBhcyB0aG91Z2ggQ1NTIGhlaWdodCBpbmNsdWRl
cyBib3JkZXIvcGFkZGluZy4KLSAgICBlbHNlIGlmIChoLmlzUGVyY2VudCgpKQotICAgICAgICB0
aCA9IGNhbGNQZXJjZW50YWdlSGVpZ2h0KGgpOwotICAgIHRoID0ga01heCgwLCB0aCk7Ci0KLSAg
ICAvLyBsYXlvdXQgcm93cwotICAgIGlmICh0aCA+IGNhbGN1bGF0ZWRIZWlnaHQpIHsKLQkvLyB3
ZSBoYXZlIHRvIHJlZGlzdHJpYnV0ZSB0aGF0IGhlaWdodCB0byBnZXQgdGhlIGNvbnN0cmFpbnQg
Y29ycmVjdGx5Ci0JLy8ganVzdCBmb3JjZSB0aGUgZmlyc3QgYm9keSB0byB0aGUgaGVpZ2h0IG5l
ZWRlZAotCS8vICMjIyBGSVhNRSBUaGlzIHNob3VsZCB0YWtlIGhlaWdodCBjb25zdHJhaW50cyBv
biBhbGwgdGFibGUgc2VjdGlvbnMgaW50byBhY2NvdW50IGFuZCBkaXN0cmlidXRlCi0JLy8gYWNj
b3JkaW5nbHkuIEZvciBub3cgdGhpcyBzaG91bGQgYmUgZ29vZCBlbm91Z2gKLSAgICAgICAgaWYg
KGZpcnN0Qm9keSkgewotICAgICAgICAgICAgZmlyc3RCb2R5LT5jYWxjUm93SGVpZ2h0KCk7Ci0g
ICAgICAgICAgICBmaXJzdEJvZHktPmxheW91dFJvd3ModGggLSBjYWxjdWxhdGVkSGVpZ2h0KTsK
LSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICghc3R5bGUoKS0+aHRtbEhhY2tzKCkpIHsKLSAg
ICAgICAgICAgIC8vIENvbXBsZXRlbHkgZW1wdHkgdGFibGVzICh3aXRoIG5vIHNlY3Rpb25zIG9y
IGFueXRoaW5nKSBzaG91bGQgYXQgbGVhc3QgaG9ub3Igc3BlY2lmaWVkIGhlaWdodAotICAgICAg
ICAgICAgLy8gaW4gc3RyaWN0IG1vZGUuCi0gICAgICAgICAgICBtX2hlaWdodCArPSB0aDsKLSAg
ICAgICAgfQotICAgIH0KLSAgICAKLSAgICBpbnQgYmwgPSBib3JkZXJMZWZ0KCk7Ci0gICAgaWYg
KCFjb2xsYXBzZUJvcmRlcnMoKSkKLSAgICAgICAgYmwgKz0gcGFkZGluZ0xlZnQoKTsKLQotICAg
IC8vIHBvc2l0aW9uIHRoZSB0YWJsZSBzZWN0aW9ucwotICAgIGlmIChoZWFkKSB7Ci0JaGVhZC0+
c2V0UG9zKGJsLCBtX2hlaWdodCk7Ci0JbV9oZWlnaHQgKz0gaGVhZC0+aGVpZ2h0KCk7Ci0gICAg
fQotICAgIGZvciAoUmVuZGVyT2JqZWN0ICpib2R5ID0gZmlyc3RCb2R5OyBib2R5OyBib2R5ID0g
Ym9keS0+bmV4dFNpYmxpbmcoKSkgewotCWlmIChib2R5ICE9IGhlYWQgJiYgYm9keSAhPSBmb290
ICYmIGJvZHktPmlzVGFibGVTZWN0aW9uKCkpIHsKLQkgICAgYm9keS0+c2V0UG9zKGJsLCBtX2hl
aWdodCk7Ci0JICAgIG1faGVpZ2h0ICs9IGJvZHktPmhlaWdodCgpOwotCX0KLSAgICB9Ci0gICAg
aWYgKGZvb3QpIHsKLQlmb290LT5zZXRQb3MoYmwsIG1faGVpZ2h0KTsKLQltX2hlaWdodCArPSBm
b290LT5oZWlnaHQoKTsKLSAgICB9Ci0KLSAgICBtX2hlaWdodCArPSBicEJvdHRvbTsKLSAgICAg
ICAgICAgICAgIAotICAgIGlmICh0Q2FwdGlvbiAmJiB0Q2FwdGlvbi0+c3R5bGUoKS0+Y2FwdGlv
blNpZGUoKT09Q0FQQk9UVE9NKSB7Ci0gICAgICAgIHRDYXB0aW9uLT5zZXRQb3ModENhcHRpb24t
Pm1hcmdpbkxlZnQoKSwgbV9oZWlnaHQpOwotICAgICAgICBtX2hlaWdodCArPSB0Q2FwdGlvbi0+
aGVpZ2h0KCkgKyB0Q2FwdGlvbi0+bWFyZ2luVG9wKCkgKyB0Q2FwdGlvbi0+bWFyZ2luQm90dG9t
KCk7Ci0gICAgfQotCi0gICAgLy8gdGFibGUgY2FuIGJlIGNvbnRhaW5pbmcgYmxvY2sgb2YgcG9z
aXRpb25lZCBlbGVtZW50cy4KLSAgICAvLyAjIyMgb25seSBwYXNzIHRydWUgaWYgd2lkdGggb3Ig
aGVpZ2h0IGNoYW5nZWQuCi0gICAgbGF5b3V0UG9zaXRpb25lZE9iamVjdHMoIHRydWUgKTsKLQot
ICAgIC8vIFJlcGFpbnQgd2l0aCBvdXIgbmV3IGJvdW5kcyBpZiB0aGV5IGFyZSBkaWZmZXJlbnQg
ZnJvbSBvdXIgb2xkIGJvdW5kcy4KLSAgICBpZiAoY2hlY2tGb3JSZXBhaW50KQotICAgICAgICBy
ZXBhaW50QWZ0ZXJMYXlvdXRJZk5lZWRlZChvbGRCb3VuZHMsIG9sZEZ1bGxCb3VuZHMpOwotICAg
IAotICAgIG1fb3ZlcmZsb3dIZWlnaHQgPSBrTWF4KG1fb3ZlcmZsb3dIZWlnaHQsIG1faGVpZ2h0
KTsKLSAgICBtX292ZXJmbG93V2lkdGggPSBrTWF4KG1fb3ZlcmZsb3dXaWR0aCwgbV93aWR0aCk7
Ci0KLSAgICBzZXROZWVkc0xheW91dChmYWxzZSk7Ci19Ci0KLXZvaWQgUmVuZGVyVGFibGU6OnNl
dENlbGxXaWR0aHMoKQotewotICAgIGZvciAoUmVuZGVyT2JqZWN0ICpjaGlsZCA9IGZpcnN0Q2hp
bGQoKTsgY2hpbGQ7IGNoaWxkID0gY2hpbGQtPm5leHRTaWJsaW5nKCkpCi0JaWYgKCBjaGlsZC0+
aXNUYWJsZVNlY3Rpb24oKSApCi0JICAgIHN0YXRpY19jYXN0PFJlbmRlclRhYmxlU2VjdGlvbiAq
PihjaGlsZCktPnNldENlbGxXaWR0aHMoKTsKLX0KLQotdm9pZCBSZW5kZXJUYWJsZTo6cGFpbnQo
UGFpbnRJbmZvJiBpLCBpbnQgX3R4LCBpbnQgX3R5KQotewotICAgIF90eCArPSB4UG9zKCk7Ci0g
ICAgX3R5ICs9IHlQb3MoKTsKLQotICAgIFBhaW50QWN0aW9uIHBhaW50QWN0aW9uID0gaS5waGFz
ZTsKLSAgICAKLSAgICBpbnQgb3MgPSAyKm1heGltYWxPdXRsaW5lU2l6ZShwYWludEFjdGlvbik7
Ci0gICAgaWYgKChfdHkgPj0gaS5yLnkoKSArIGkuci5oZWlnaHQoKSArIG9zKSB8fCAoX3R5ICsg
aGVpZ2h0KCkgPD0gaS5yLnkoKSAtIG9zKSkKLSAgICAgICAgcmV0dXJuOwotICAgIGlmICgoX3R4
ID49IGkuci54KCkgKyBpLnIud2lkdGgoKSArIG9zKSB8fCAoX3R4ICsgd2lkdGgoKSA8PSBpLnIu
eCgpIC0gb3MpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBpZiAoKHBhaW50QWN0aW9uID09IFBh
aW50QWN0aW9uQmxvY2tCYWNrZ3JvdW5kIHx8IHBhaW50QWN0aW9uID09IFBhaW50QWN0aW9uQ2hp
bGRCbG9ja0JhY2tncm91bmQpCi0gICAgICAgICYmIHNob3VsZFBhaW50QmFja2dyb3VuZE9yQm9y
ZGVyKCkgJiYgc3R5bGUoKS0+dmlzaWJpbGl0eSgpID09IFZJU0lCTEUpCi0gICAgICAgIHBhaW50
Qm94RGVjb3JhdGlvbnMoaSwgX3R4LCBfdHkpOwotCi0gICAgLy8gV2UncmUgZG9uZS4gIFdlIGRv
bid0IGJvdGhlciBwYWludGluZyBhbnkgY2hpbGRyZW4uCi0gICAgaWYgKHBhaW50QWN0aW9uID09
IFBhaW50QWN0aW9uQmxvY2tCYWNrZ3JvdW5kKQotICAgICAgICByZXR1cm47Ci0gICAgLy8gV2Ug
ZG9uJ3QgcGFpbnQgb3VyIG93biBiYWNrZ3JvdW5kLCBidXQgd2UgZG8gbGV0IHRoZSBraWRzIHBh
aW50IHRoZWlyIGJhY2tncm91bmRzLgotICAgIGlmIChwYWludEFjdGlvbiA9PSBQYWludEFjdGlv
bkNoaWxkQmxvY2tCYWNrZ3JvdW5kcykKLSAgICAgICAgcGFpbnRBY3Rpb24gPSBQYWludEFjdGlv
bkNoaWxkQmxvY2tCYWNrZ3JvdW5kOwotICAgIFBhaW50SW5mbyBwYWludEluZm8oaS5wLCBpLnIs
IHBhaW50QWN0aW9uLCBwYWludGluZ1Jvb3RGb3JDaGlsZHJlbihpKSk7Ci0gICAgCi0gICAgZm9y
IChSZW5kZXJPYmplY3QgKmNoaWxkID0gZmlyc3RDaGlsZCgpOyBjaGlsZDsgY2hpbGQgPSBjaGls
ZC0+bmV4dFNpYmxpbmcoKSkKLSAgICAgICAgaWYgKGNoaWxkLT5pc1RhYmxlU2VjdGlvbigpIHx8
IGNoaWxkID09IHRDYXB0aW9uKQotCSAgICBjaGlsZC0+cGFpbnQocGFpbnRJbmZvLCBfdHgsIF90
eSk7Ci0KLSAgICBpZiAoY29sbGFwc2VCb3JkZXJzKCkgJiYgcGFpbnRBY3Rpb24gPT0gUGFpbnRB
Y3Rpb25DaGlsZEJsb2NrQmFja2dyb3VuZCAmJiBzdHlsZSgpLT52aXNpYmlsaXR5KCkgPT0gVklT
SUJMRSkgewotICAgICAgICAvLyBDb2xsZWN0IGFsbCB0aGUgdW5pcXVlIGJvcmRlciBzdHlsZXMg
dGhhdCB3ZSB3YW50IHRvIHBhaW50IGluIGEgc29ydGVkIGxpc3QuICBPbmNlIHdlCi0gICAgICAg
IC8vIGhhdmUgYWxsIHRoZSBzdHlsZXMgc29ydGVkLCB3ZSB0aGVuIGRvIGluZGl2aWR1YWwgcGFz
c2VzLCBwYWludGluZyBlYWNoIHN0eWxlIG9mIGJvcmRlcgotICAgICAgICAvLyBmcm9tIGxvd2Vz
dCBwcmVjZWRlbmNlIHRvIGhpZ2hlc3QgcHJlY2VkZW5jZS4KLSAgICAgICAgcGFpbnRJbmZvLnBo
YXNlID0gUGFpbnRBY3Rpb25Db2xsYXBzZWRUYWJsZUJvcmRlcnM7Ci0gICAgICAgIFFWYWx1ZUxp
c3Q8Q29sbGFwc2VkQm9yZGVyVmFsdWU+IGJvcmRlclN0eWxlczsKLSAgICAgICAgY29sbGVjdEJv
cmRlcnMoYm9yZGVyU3R5bGVzKTsKLSAgICAgICAgUVZhbHVlTGlzdEl0ZXJhdG9yPENvbGxhcHNl
ZEJvcmRlclZhbHVlPiBpdCA9IGJvcmRlclN0eWxlcy5iZWdpbigpOwotICAgICAgICBRVmFsdWVM
aXN0SXRlcmF0b3I8Q29sbGFwc2VkQm9yZGVyVmFsdWU+IGVuZCA9IGJvcmRlclN0eWxlcy5lbmQo
KTsKLSAgICAgICAgZm9yICg7IGl0ICE9IGVuZDsgKytpdCkgewotICAgICAgICAgICAgbV9jdXJy
ZW50Qm9yZGVyID0gJigqaXQpOwotICAgICAgICAgICAgZm9yIChSZW5kZXJPYmplY3QqIGNoaWxk
ID0gZmlyc3RDaGlsZCgpOyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4dFNpYmxpbmcoKSkKLSAg
ICAgICAgICAgICAgICBpZiAoY2hpbGQtPmlzVGFibGVTZWN0aW9uKCkpCi0gICAgICAgICAgICAg
ICAgICAgIGNoaWxkLT5wYWludChwYWludEluZm8sIF90eCwgX3R5KTsKLSAgICAgICAgfQotICAg
IH0KLSAgICAgICAgCi0jaWZkZWYgQk9YX0RFQlVHCi0gICAgb3V0bGluZUJveChpLnAsIF90eCwg
X3R5LCAiYmx1ZSIpOwotI2VuZGlmCi19Ci0KLXZvaWQgUmVuZGVyVGFibGU6OnBhaW50Qm94RGVj
b3JhdGlvbnMoUGFpbnRJbmZvJiBpLCBpbnQgX3R4LCBpbnQgX3R5KQotewotICAgIGludCB3ID0g
d2lkdGgoKTsKLSAgICBpbnQgaCA9IGhlaWdodCgpOwotICAgIAotICAgIC8vIEFjY291bnQgZm9y
IHRoZSBjYXB0aW9uLgotICAgIGlmICh0Q2FwdGlvbikgewotICAgICAgICBpbnQgY2FwdGlvbkhl
aWdodCA9ICh0Q2FwdGlvbi0+aGVpZ2h0KCkgKyB0Q2FwdGlvbi0+bWFyZ2luQm90dG9tKCkgKyAg
dENhcHRpb24tPm1hcmdpblRvcCgpKTsKLSAgICAgICAgaCAtPSBjYXB0aW9uSGVpZ2h0OwotICAg
ICAgICBpZiAodENhcHRpb24tPnN0eWxlKCktPmNhcHRpb25TaWRlKCkgIT0gQ0FQQk9UVE9NKQot
ICAgICAgICAgICAgX3R5ICs9IGNhcHRpb25IZWlnaHQ7Ci0gICAgfQotCi0gICAgaW50IG15ID0g
a01heChfdHksIGkuci55KCkpOwotICAgIGludCBtaDsKLSAgICBpZiAoX3R5IDwgaS5yLnkoKSkK
LSAgICAgICAgbWg9IGtNYXgoMCwgaCAtIChpLnIueSgpIC0gX3R5KSk7Ci0gICAgZWxzZQotICAg
ICAgICBtaCA9IGtNaW4oaS5yLmhlaWdodCgpLCBoKTsKLSAgICAKLSAgICBwYWludEJhY2tncm91
bmQoaS5wLCBzdHlsZSgpLT5iYWNrZ3JvdW5kQ29sb3IoKSwgc3R5bGUoKS0+YmFja2dyb3VuZExh
eWVycygpLCBteSwgbWgsIF90eCwgX3R5LCB3LCBoKTsKLSAgICAKLSAgICBpZiAoc3R5bGUoKS0+
aGFzQm9yZGVyKCkgJiYgIWNvbGxhcHNlQm9yZGVycygpKQotICAgICAgICBwYWludEJvcmRlcihp
LnAsIF90eCwgX3R5LCB3LCBoLCBzdHlsZSgpKTsKLX0KLQotdm9pZCBSZW5kZXJUYWJsZTo6Y2Fs
Y01pbk1heFdpZHRoKCkKLXsKLSAgICBLSFRNTEFzc2VydCghbWluTWF4S25vd24oKSk7Ci0KLSAg
ICBpZiAobmVlZFNlY3Rpb25SZWNhbGMpCi0JcmVjYWxjU2VjdGlvbnMoKTsKLQotICAgIHRhYmxl
TGF5b3V0LT5jYWxjTWluTWF4V2lkdGgoKTsKLQotICAgIGlmICh0Q2FwdGlvbiAmJiB0Q2FwdGlv
bi0+bWluV2lkdGgoKSA+IG1fbWluV2lkdGgpCi0gICAgICAgIG1fbWluV2lkdGggPSB0Q2FwdGlv
bi0+bWluV2lkdGgoKTsKLQotICAgIHNldE1pbk1heEtub3duKCk7Ci19Ci0KLXZvaWQgUmVuZGVy
VGFibGU6OnNwbGl0Q29sdW1uKGludCBwb3MsIGludCBmaXJzdFNwYW4pCi17Ci0gICAgLy8gd2Ug
bmVlZCB0byBhZGQgYSBuZXcgY29sdW1uU3RydWN0Ci0gICAgaW50IG9sZFNpemUgPSBjb2x1bW5z
LnNpemUoKTsKLSAgICBjb2x1bW5zLnJlc2l6ZShvbGRTaXplICsgMSk7Ci0gICAgaW50IG9sZFNw
YW4gPSBjb2x1bW5zW3Bvc10uc3BhbjsKLS8vICAgICBxRGVidWcoInNwbGl0Q29sdW1uKCAlZCwl
ZCApLCBvbGRTaXplPSVkLCBvbGRTcGFuPSVkIiwgcG9zLCBmaXJzdFNwYW4sIG9sZFNpemUsIG9s
ZFNwYW4gKTsKLSAgICBLSFRNTEFzc2VydChvbGRTcGFuID4gZmlyc3RTcGFuKTsKLSAgICBjb2x1
bW5zW3Bvc10uc3BhbiA9IGZpcnN0U3BhbjsKLSAgICBtZW1tb3ZlKGNvbHVtbnMuZGF0YSgpICsg
cG9zICsgMSwgY29sdW1ucy5kYXRhKCkgKyBwb3MsIChvbGRTaXplLXBvcykqc2l6ZW9mKENvbHVt
blN0cnVjdCkpOwotICAgIGNvbHVtbnNbcG9zKzFdLnNwYW4gPSBvbGRTcGFuIC0gZmlyc3RTcGFu
OwotCi0gICAgLy8gY2hhbmdlIHdpZHRoIG9mIGFsbCByb3dzLgotICAgIGZvciAoUmVuZGVyT2Jq
ZWN0ICpjaGlsZCA9IGZpcnN0Q2hpbGQoKTsgY2hpbGQ7IGNoaWxkID0gY2hpbGQtPm5leHRTaWJs
aW5nKCkpIHsKLQlpZiAoY2hpbGQtPmlzVGFibGVTZWN0aW9uKCkpIHsKLQkgICAgUmVuZGVyVGFi
bGVTZWN0aW9uICpzZWN0aW9uID0gc3RhdGljX2Nhc3Q8UmVuZGVyVGFibGVTZWN0aW9uICo+KGNo
aWxkKTsKLQkgICAgaWYgKHNlY3Rpb24tPmNDb2wgPiBwb3MpCi0JCXNlY3Rpb24tPmNDb2wrKzsK
LQkgICAgaW50IHNpemUgPSBzZWN0aW9uLT5udW1Sb3dzKCk7Ci0JICAgIGZvciAoaW50IHJvdyA9
IDA7IHJvdyA8IHNpemU7ICsrcm93KSB7Ci0JCXNlY3Rpb24tPmdyaWRbcm93XS5yb3ctPnJlc2l6
ZShvbGRTaXplICsgMSk7Ci0JCVJlbmRlclRhYmxlU2VjdGlvbjo6Um93ICZyID0gKnNlY3Rpb24t
PmdyaWRbcm93XS5yb3c7Ci0JCW1lbW1vdmUoci5kYXRhKCkgKyBwb3MgKyAxLCByLmRhdGEoKSAr
IHBvcywgKG9sZFNpemUgLSBwb3MpICogc2l6ZW9mKFJlbmRlclRhYmxlU2VjdGlvbjo6Q2VsbFN0
cnVjdCkpOwotCQlyW3BvcyArIDFdLmNlbGwgPSAwOwotICAgICAgICAgICAgICAgIHJbcG9zICsg
MV0uaW5Db2xTcGFuID0gcltwb3NdLmluQ29sU3BhbiB8fCByW3Bvc10uY2VsbDsKLQkgICAgfQot
CX0KLSAgICB9Ci0gICAgY29sdW1uUG9zLnJlc2l6ZShudW1FZmZDb2xzKCkgKyAxKTsKLSAgICBz
ZXROZWVkc0xheW91dEFuZE1pbk1heFJlY2FsYygpOwotfQotCi12b2lkIFJlbmRlclRhYmxlOjph
cHBlbmRDb2x1bW4oaW50IHNwYW4pCi17Ci0gICAgLy8gZWFzeSBjYXNlLgotICAgIGludCBwb3Mg
PSBjb2x1bW5zLnNpemUoKTsKLSAgICBpbnQgbmV3U2l6ZSA9IHBvcyArIDE7Ci0gICAgY29sdW1u
cy5yZXNpemUobmV3U2l6ZSk7Ci0gICAgY29sdW1uc1twb3NdLnNwYW4gPSBzcGFuOwotCi0gICAg
Ly8gY2hhbmdlIHdpZHRoIG9mIGFsbCByb3dzLgotICAgIGZvciAoUmVuZGVyT2JqZWN0ICpjaGls
ZCA9IGZpcnN0Q2hpbGQoKTsgY2hpbGQ7IGNoaWxkID0gY2hpbGQtPm5leHRTaWJsaW5nKCkpIHsK
LQlpZiAoY2hpbGQtPmlzVGFibGVTZWN0aW9uKCkpIHsKLQkgICAgUmVuZGVyVGFibGVTZWN0aW9u
ICpzZWN0aW9uID0gc3RhdGljX2Nhc3Q8UmVuZGVyVGFibGVTZWN0aW9uICo+KGNoaWxkKTsKLQkg
ICAgaW50IHNpemUgPSBzZWN0aW9uLT5udW1Sb3dzKCk7Ci0JICAgIGZvciAoaW50IHJvdyA9IDA7
IHJvdyA8IHNpemU7ICsrcm93KSB7Ci0JCXNlY3Rpb24tPmdyaWRbcm93XS5yb3ctPnJlc2l6ZShu
ZXdTaXplKTsKLSAgICAgICAgICAgICAgICBSZW5kZXJUYWJsZVNlY3Rpb246OkNlbGxTdHJ1Y3Qm
IGMgPSBzZWN0aW9uLT5jZWxsQXQocm93LCBwb3MpOwotCQljLmNlbGwgPSAwOwotCQljLmluQ29s
U3BhbiA9IGZhbHNlOwotCSAgICB9Ci0JfQotICAgIH0KLSAgICBjb2x1bW5Qb3MucmVzaXplKG51
bUVmZkNvbHMoKSArIDEpOwotICAgIHNldE5lZWRzTGF5b3V0QW5kTWluTWF4UmVjYWxjKCk7Ci19
Ci0KLVJlbmRlclRhYmxlQ29sICpSZW5kZXJUYWJsZTo6Y29sRWxlbWVudChpbnQgY29sKSB7Ci0g
ICAgaWYgKCFoYXNfY29sX2VsZW1zKQotCXJldHVybiAwOwotICAgIFJlbmRlck9iamVjdCAqY2hp
bGQgPSBmaXJzdENoaWxkKCk7Ci0gICAgaW50IGNDb2wgPSAwOwotICAgIHdoaWxlIChjaGlsZCkg
ewotCWlmIChjaGlsZC0+aXNUYWJsZUNvbCgpKSB7Ci0JICAgIFJlbmRlclRhYmxlQ29sICpjb2xF
bGVtID0gc3RhdGljX2Nhc3Q8UmVuZGVyVGFibGVDb2wgKj4oY2hpbGQpOwotCSAgICBpbnQgc3Bh
biA9IGNvbEVsZW0tPnNwYW4oKTsKLQkgICAgaWYgKCFjb2xFbGVtLT5maXJzdENoaWxkKCkpIHsK
LQkJY0NvbCArPSBzcGFuOwotCQlpZiAoY0NvbCA+IGNvbCkKLQkJICAgIHJldHVybiBjb2xFbGVt
OwotCSAgICB9Ci0KLQkgICAgUmVuZGVyT2JqZWN0ICpuZXh0ID0gY2hpbGQtPmZpcnN0Q2hpbGQo
KTsKLQkgICAgaWYgKCFuZXh0KQotCQluZXh0ID0gY2hpbGQtPm5leHRTaWJsaW5nKCk7Ci0JICAg
IGlmICghbmV4dCAmJiBjaGlsZC0+cGFyZW50KCktPmlzVGFibGVDb2woKSkKLQkJbmV4dCA9IGNo
aWxkLT5wYXJlbnQoKS0+bmV4dFNpYmxpbmcoKTsKLQkgICAgY2hpbGQgPSBuZXh0OwotCX0gZWxz
ZSBpZiAoY2hpbGQgPT0gdENhcHRpb24pCi0gICAgICAgICAgICBjaGlsZCA9IGNoaWxkLT5uZXh0
U2libGluZygpOwotICAgICAgICBlbHNlCi0JICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4g
MDsKLX0KLQotdm9pZCBSZW5kZXJUYWJsZTo6cmVjYWxjU2VjdGlvbnMoKQotewotICAgIHRDYXB0
aW9uID0gMDsKLSAgICBoZWFkID0gZm9vdCA9IGZpcnN0Qm9keSA9IDA7Ci0gICAgaGFzX2NvbF9l
bGVtcyA9IGZhbHNlOwotCi0gICAgLy8gV2UgbmVlZCB0byBnZXQgdmFsaWQgcG9pbnRlcnMgdG8g
Y2FwdGlvbiwgaGVhZCwgZm9vdCBhbmQgZmlyc3Rib2R5IGFnYWluCi0gICAgZm9yIChSZW5kZXJP
YmplY3QgKmNoaWxkID0gZmlyc3RDaGlsZCgpOyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4dFNp
YmxpbmcoKSkgewotCXN3aXRjaCAoY2hpbGQtPnN0eWxlKCktPmRpc3BsYXkoKSkgewotICAgICAg
ICAgICAgY2FzZSBUQUJMRV9DQVBUSU9OOgotICAgICAgICAgICAgICAgIGlmICghdENhcHRpb24p
IHsKLSAgICAgICAgICAgICAgICAgICAgdENhcHRpb24gPSBzdGF0aWNfY2FzdDxSZW5kZXJCbG9j
ayo+KGNoaWxkKTsKLSAgICAgICAgICAgICAgICAgICAgdENhcHRpb24tPnNldE5lZWRzTGF5b3V0
KHRydWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAg
ICAgICAgIGNhc2UgVEFCTEVfQ09MVU1OOgotICAgICAgICAgICAgY2FzZSBUQUJMRV9DT0xVTU5f
R1JPVVA6Ci0gICAgICAgICAgICAgICAgaGFzX2NvbF9lbGVtcyA9IHRydWU7Ci0gICAgICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFRBQkxFX0hFQURFUl9HUk9VUDogewotICAg
ICAgICAgICAgICAgIFJlbmRlclRhYmxlU2VjdGlvbiAqc2VjdGlvbiA9IHN0YXRpY19jYXN0PFJl
bmRlclRhYmxlU2VjdGlvbiAqPihjaGlsZCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFoZWFkKQot
ICAgICAgICAgICAgICAgICAgICBoZWFkID0gc2VjdGlvbjsKLSAgICAgICAgICAgICAgICBlbHNl
IGlmICghZmlyc3RCb2R5KQotICAgICAgICAgICAgICAgICAgICBmaXJzdEJvZHkgPSBzZWN0aW9u
OwotICAgICAgICAgICAgICAgIGlmIChzZWN0aW9uLT5uZWVkQ2VsbFJlY2FsYykKLSAgICAgICAg
ICAgICAgICAgICAgc2VjdGlvbi0+cmVjYWxjQ2VsbHMoKTsKLSAgICAgICAgICAgICAgICBicmVh
azsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgVEFCTEVfRk9PVEVSX0dST1VQOiB7
Ci0gICAgICAgICAgICAgICAgUmVuZGVyVGFibGVTZWN0aW9uICpzZWN0aW9uID0gc3RhdGljX2Nh
c3Q8UmVuZGVyVGFibGVTZWN0aW9uICo+KGNoaWxkKTsKLSAgICAgICAgICAgICAgICBpZiAoIWZv
b3QpCi0gICAgICAgICAgICAgICAgICAgIGZvb3QgPSBzZWN0aW9uOwotICAgICAgICAgICAgICAg
IGVsc2UgaWYgKCFmaXJzdEJvZHkpCi0gICAgICAgICAgICAgICAgICAgIGZpcnN0Qm9keSA9IHNl
Y3Rpb247Ci0gICAgICAgICAgICAgICAgaWYgKHNlY3Rpb24tPm5lZWRDZWxsUmVjYWxjKQotICAg
ICAgICAgICAgICAgICAgICBzZWN0aW9uLT5yZWNhbGNDZWxscygpOwotICAgICAgICAgICAgICAg
IGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBUQUJMRV9ST1dfR1JPVVA6
IHsKLSAgICAgICAgICAgICAgICBSZW5kZXJUYWJsZVNlY3Rpb24gKnNlY3Rpb24gPSBzdGF0aWNf
Y2FzdDxSZW5kZXJUYWJsZVNlY3Rpb24gKj4oY2hpbGQpOwotICAgICAgICAgICAgICAgIGlmICgh
Zmlyc3RCb2R5KQotICAgICAgICAgICAgICAgICAgICBmaXJzdEJvZHkgPSBzZWN0aW9uOwotICAg
ICAgICAgICAgICAgIGlmIChzZWN0aW9uLT5uZWVkQ2VsbFJlY2FsYykKLSAgICAgICAgICAgICAg
ICAgICAgc2VjdGlvbi0+cmVjYWxjQ2VsbHMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAg
IGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0JfQotICAgIH0KLSAgICBuZWVkU2Vj
dGlvblJlY2FsYyA9IGZhbHNlOwotICAgIHNldE5lZWRzTGF5b3V0KHRydWUpOwotfQotCi1SZW5k
ZXJPYmplY3QqIFJlbmRlclRhYmxlOjpyZW1vdmVDaGlsZE5vZGUoUmVuZGVyT2JqZWN0KiBjaGls
ZCkKLXsKLSAgICBzZXROZWVkU2VjdGlvblJlY2FsYygpOwotICAgIHJldHVybiBSZW5kZXJDb250
YWluZXI6OnJlbW92ZUNoaWxkTm9kZShjaGlsZCk7Ci19Ci0KLWludCBSZW5kZXJUYWJsZTo6Ym9y
ZGVyTGVmdCgpIGNvbnN0Ci17Ci0gICAgaWYgKGNvbGxhcHNlQm9yZGVycygpKSB7Ci0gICAgICAg
IC8vIEZJWE1FOiBGb3Igc3RyaWN0IG1vZGUsIHJldHVybmluZyAwIGlzIGNvcnJlY3QsIHNpbmNl
IHRoZSB0YWJsZSBib3JkZXIgaGFsZiBzcGlsbHMgaW50byB0aGUgbWFyZ2luLAotICAgICAgICAv
LyBidXQgSSdtIHdvcmtpbmcgdG8gZ2V0IHRoaXMgY2hhbmdlZC4gIEZvciBub3csIGZvbGxvdyB0
aGUgc3BlYy4KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBSZW5kZXJCbG9j
azo6Ym9yZGVyTGVmdCgpOwotfQotICAgIAotaW50IFJlbmRlclRhYmxlOjpib3JkZXJSaWdodCgp
IGNvbnN0Ci17Ci0gICAgaWYgKGNvbGxhcHNlQm9yZGVycygpKSB7Ci0gICAgICAgIC8vIEZJWE1F
OiBGb3Igc3RyaWN0IG1vZGUsIHJldHVybmluZyAwIGlzIGNvcnJlY3QsIHNpbmNlIHRoZSB0YWJs
ZSBib3JkZXIgaGFsZiBzcGlsbHMgaW50byB0aGUgbWFyZ2luLAotICAgICAgICAvLyBidXQgSSdt
IHdvcmtpbmcgdG8gZ2V0IHRoaXMgY2hhbmdlZC4gIEZvciBub3csIGZvbGxvdyB0aGUgc3BlYy4K
LSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBSZW5kZXJCbG9jazo6Ym9yZGVy
UmlnaHQoKTsKLX0KLQotaW50IFJlbmRlclRhYmxlOjpib3JkZXJUb3AoKSBjb25zdAotewotICAg
IGlmIChjb2xsYXBzZUJvcmRlcnMoKSkgewotICAgICAgICAvLyBGSVhNRTogRm9yIHN0cmljdCBt
b2RlLCByZXR1cm5pbmcgMCBpcyBjb3JyZWN0LCBzaW5jZSB0aGUgdGFibGUgYm9yZGVyIGhhbGYg
c3BpbGxzIGludG8gdGhlIG1hcmdpbiwKLSAgICAgICAgLy8gYnV0IEknbSB3b3JraW5nIHRvIGdl
dCB0aGlzIGNoYW5nZWQuICBGb3Igbm93LCBmb2xsb3cgdGhlIHNwZWMuCi0gICAgICAgIHJldHVy
biAwOwotICAgIH0KLSAgICByZXR1cm4gUmVuZGVyQmxvY2s6OmJvcmRlclRvcCgpOwotfQotCi1p
bnQgUmVuZGVyVGFibGU6OmJvcmRlckJvdHRvbSgpIGNvbnN0Ci17Ci0gICAgaWYgKGNvbGxhcHNl
Qm9yZGVycygpKSB7Ci0gICAgICAgIC8vIEZJWE1FOiBGb3Igc3RyaWN0IG1vZGUsIHJldHVybmlu
ZyAwIGlzIGNvcnJlY3QsIHNpbmNlIHRoZSB0YWJsZSBib3JkZXIgaGFsZiBzcGlsbHMgaW50byB0
aGUgbWFyZ2luLAotICAgICAgICAvLyBidXQgSSdtIHdvcmtpbmcgdG8gZ2V0IHRoaXMgY2hhbmdl
ZC4gIEZvciBub3csIGZvbGxvdyB0aGUgc3BlYy4KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQot
ICAgIHJldHVybiBSZW5kZXJCbG9jazo6Ym9yZGVyQm90dG9tKCk7Ci19Ci0KLVJlbmRlclRhYmxl
Q2VsbCogUmVuZGVyVGFibGU6OmNlbGxBYm92ZShjb25zdCBSZW5kZXJUYWJsZUNlbGwqIGNlbGwp
IGNvbnN0Ci17Ci0gICAgLy8gRmluZCB0aGUgc2VjdGlvbiBhbmQgcm93IHRvIGxvb2sgaW4KLSAg
ICBpbnQgciA9IGNlbGwtPnJvdygpOwotICAgIFJlbmRlclRhYmxlU2VjdGlvbiogc2VjdGlvbiA9
IDA7Ci0gICAgaW50IHJBYm92ZSA9IC0xOwotICAgIGlmIChyID4gMCkgewotICAgICAgICAvLyBj
ZWxsIGlzIG5vdCBpbiB0aGUgZmlyc3Qgcm93LCBzbyB1c2UgdGhlIGFib3ZlIHJvdyBpbiBpdHMg
b3duIHNlY3Rpb24KLSAgICAgICAgc2VjdGlvbiA9IGNlbGwtPnNlY3Rpb24oKTsKLSAgICAgICAg
ckFib3ZlID0gci0xOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIGNlbGwgaXMgYXQgdG9wIG9m
IGEgc2VjdGlvbiwgdXNlIGxhc3Qgcm93IGluIHByZXZpb3VzIHNlY3Rpb24KLSAgICAgICAgZm9y
IChSZW5kZXJPYmplY3QgKnByZXZTZWN0aW9uID0gY2VsbC0+c2VjdGlvbigpLT5wcmV2aW91c1Np
YmxpbmcoKTsKLSAgICAgICAgICAgICBwcmV2U2VjdGlvbiAmJiByQWJvdmUgPCAwOwotICAgICAg
ICAgICAgIHByZXZTZWN0aW9uID0gcHJldlNlY3Rpb24tPnByZXZpb3VzU2libGluZygpKSB7Ci0g
ICAgICAgICAgICBpZiAocHJldlNlY3Rpb24tPmlzVGFibGVTZWN0aW9uKCkpIHsKLSAgICAgICAg
ICAgICAgICBzZWN0aW9uID0gc3RhdGljX2Nhc3Q8UmVuZGVyVGFibGVTZWN0aW9uICo+KHByZXZT
ZWN0aW9uKTsKLSAgICAgICAgICAgICAgICBpZiAoc2VjdGlvbi0+bnVtUm93cygpID4gMCkKLSAg
ICAgICAgICAgICAgICAgICAgckFib3ZlID0gc2VjdGlvbi0+bnVtUm93cygpLTE7Ci0gICAgICAg
ICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBMb29rIHVwIHRoZSBjZWxsIGluIHRo
ZSBzZWN0aW9uJ3MgZ3JpZCwgd2hpY2ggcmVxdWlyZXMgZWZmZWN0aXZlIGNvbCBpbmRleAotICAg
IGlmIChzZWN0aW9uICYmIHJBYm92ZSA+PSAwKSB7Ci0gICAgICAgIGludCBlZmZDb2wgPSBjb2xU
b0VmZkNvbChjZWxsLT5jb2woKSk7Ci0gICAgICAgIFJlbmRlclRhYmxlU2VjdGlvbjo6Q2VsbFN0
cnVjdCBhYm92ZUNlbGw7Ci0gICAgICAgIC8vIElmIHdlIGhpdCBhIHNwYW4gYmFjayB1cCB0byBh
IHJlYWwgY2VsbC4KLSAgICAgICAgZG8gewotICAgICAgICAgICAgYWJvdmVDZWxsID0gc2VjdGlv
bi0+Y2VsbEF0KHJBYm92ZSwgZWZmQ29sKTsKLSAgICAgICAgICAgIGVmZkNvbC0tOwotICAgICAg
ICB9IHdoaWxlICghYWJvdmVDZWxsLmNlbGwgJiYgYWJvdmVDZWxsLmluQ29sU3BhbiAmJiBlZmZD
b2wgPj0wKTsKLSAgICAgICAgcmV0dXJuIGFib3ZlQ2VsbC5jZWxsOwotICAgIH0gZWxzZQotICAg
ICAgICByZXR1cm4gMDsKLX0KLQotUmVuZGVyVGFibGVDZWxsKiBSZW5kZXJUYWJsZTo6Y2VsbEJl
bG93KGNvbnN0IFJlbmRlclRhYmxlQ2VsbCogY2VsbCkgY29uc3QKLXsKLSAgICAvLyBGaW5kIHRo
ZSBzZWN0aW9uIGFuZCByb3cgdG8gbG9vayBpbgotICAgIGludCByID0gY2VsbC0+cm93KCkgKyBj
ZWxsLT5yb3dTcGFuKCkgLSAxOwotICAgIFJlbmRlclRhYmxlU2VjdGlvbiogc2VjdGlvbiA9IDA7
Ci0gICAgaW50IHJCZWxvdyA9IC0xOwotICAgIGlmIChyIDwgY2VsbC0+c2VjdGlvbigpLT5udW1S
b3dzKCkgLSAxKSB7Ci0gICAgICAgIC8vIFRoZSBjZWxsIGlzIG5vdCBpbiB0aGUgbGFzdCByb3cs
IHNvIHVzZSB0aGUgbmV4dCByb3cgaW4gdGhlIHNlY3Rpb24uCi0gICAgICAgIHNlY3Rpb24gPSBj
ZWxsLT5zZWN0aW9uKCk7Ci0gICAgICAgIHJCZWxvdz0gcisxOwotICAgIH0gZWxzZSB7Ci0gICAg
ICAgIC8vIFRoZSBjZWxsIGlzIGF0IHRoZSBib3R0b20gb2YgYSBzZWN0aW9uLiBVc2UgdGhlIGZp
cnN0IHJvdyBpbiB0aGUgbmV4dCBzZWN0aW9uLgotICAgICAgICBmb3IgKFJlbmRlck9iamVjdCog
bmV4dFNlY3Rpb24gPSBjZWxsLT5zZWN0aW9uKCktPm5leHRTaWJsaW5nKCk7Ci0gICAgICAgICAg
ICAgbmV4dFNlY3Rpb24gJiYgckJlbG93IDwgMDsKLSAgICAgICAgICAgICBuZXh0U2VjdGlvbiA9
IG5leHRTZWN0aW9uLT5uZXh0U2libGluZygpKSB7Ci0gICAgICAgICAgICBpZiAobmV4dFNlY3Rp
b24tPmlzVGFibGVTZWN0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICBzZWN0aW9uID0gc3RhdGlj
X2Nhc3Q8UmVuZGVyVGFibGVTZWN0aW9uICo+KG5leHRTZWN0aW9uKTsKLSAgICAgICAgICAgICAg
ICBpZiAoc2VjdGlvbi0+bnVtUm93cygpID4gMCkKLSAgICAgICAgICAgICAgICAgICAgckJlbG93
ID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvLyBMb29r
IHVwIHRoZSBjZWxsIGluIHRoZSBzZWN0aW9uJ3MgZ3JpZCwgd2hpY2ggcmVxdWlyZXMgZWZmZWN0
aXZlIGNvbCBpbmRleAotICAgIGlmIChzZWN0aW9uICYmIHJCZWxvdyA+PSAwKSB7Ci0gICAgICAg
IGludCBlZmZDb2wgPSBjb2xUb0VmZkNvbChjZWxsLT5jb2woKSk7Ci0gICAgICAgIFJlbmRlclRh
YmxlU2VjdGlvbjo6Q2VsbFN0cnVjdCBiZWxvd0NlbGw7Ci0gICAgICAgIC8vIElmIHdlIGhpdCBh
IGNvbHNwYW4gYmFjayB1cCB0byBhIHJlYWwgY2VsbC4KLSAgICAgICAgZG8gewotICAgICAgICAg
ICAgYmVsb3dDZWxsID0gc2VjdGlvbi0+Y2VsbEF0KHJCZWxvdywgZWZmQ29sKTsKLSAgICAgICAg
ICAgIGVmZkNvbC0tOwotICAgICAgICB9IHdoaWxlICghYmVsb3dDZWxsLmNlbGwgJiYgYmVsb3dD
ZWxsLmluQ29sU3BhbiAmJiBlZmZDb2wgPj0wKTsKLSAgICAgICAgcmV0dXJuIGJlbG93Q2VsbC5j
ZWxsOwotICAgIH0gZWxzZQotICAgICAgICByZXR1cm4gMDsKLX0KLQotUmVuZGVyVGFibGVDZWxs
KiBSZW5kZXJUYWJsZTo6Y2VsbExlZnQoY29uc3QgUmVuZGVyVGFibGVDZWxsKiBjZWxsKSBjb25z
dAotewotICAgIFJlbmRlclRhYmxlU2VjdGlvbiogc2VjdGlvbiA9IGNlbGwtPnNlY3Rpb24oKTsK
LSAgICBpbnQgZWZmQ29sID0gY29sVG9FZmZDb2woY2VsbC0+Y29sKCkpOwotICAgIGlmIChlZmZD
b2wgPT0gMCkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgCi0gICAgLy8gSWYgd2UgaGl0IGEgY29s
c3BhbiBiYWNrIHVwIHRvIGEgcmVhbCBjZWxsLgotICAgIFJlbmRlclRhYmxlU2VjdGlvbjo6Q2Vs
bFN0cnVjdCBwcmV2Q2VsbDsKLSAgICBkbyB7Ci0gICAgICAgIHByZXZDZWxsID0gc2VjdGlvbi0+
Y2VsbEF0KGNlbGwtPnJvdygpLCBlZmZDb2wtMSk7Ci0gICAgICAgIGVmZkNvbC0tOwotICAgIH0g
d2hpbGUgKCFwcmV2Q2VsbC5jZWxsICYmIHByZXZDZWxsLmluQ29sU3BhbiAmJiBlZmZDb2wgPj0w
KTsKLSAgICByZXR1cm4gcHJldkNlbGwuY2VsbDsKLX0KLQotUmVuZGVyVGFibGVDZWxsKiBSZW5k
ZXJUYWJsZTo6Y2VsbFJpZ2h0KGNvbnN0IFJlbmRlclRhYmxlQ2VsbCogY2VsbCkgY29uc3QKLXsK
LSAgICBpbnQgZWZmQ29sID0gY29sVG9FZmZDb2woY2VsbC0+Y29sKCkgKyBjZWxsLT5jb2xTcGFu
KCkpOwotICAgIGlmIChlZmZDb2wgPj0gbnVtRWZmQ29scygpKQotICAgICAgICByZXR1cm4gMDsK
LSAgICByZXR1cm4gY2VsbC0+c2VjdGlvbigpLT5jZWxsQXQoY2VsbC0+cm93KCksIGVmZkNvbCku
Y2VsbDsKLX0KLQotUmVuZGVyQmxvY2sqIFJlbmRlclRhYmxlOjpmaXJzdExpbmVCbG9jaygpIGNv
bnN0Ci17Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgUmVuZGVyVGFibGU6OnVwZGF0ZUZpcnN0
TGV0dGVyKCkKLXt9Ci0KLSNpZm5kZWYgTkRFQlVHCi12b2lkIFJlbmRlclRhYmxlOjpkdW1wKFFU
ZXh0U3RyZWFtICpzdHJlYW0sIFFTdHJpbmcgaW5kKSBjb25zdAotewotICAgIGlmICh0Q2FwdGlv
bikKLQkqc3RyZWFtIDw8ICIgdENhcHRpb24iOwotICAgIGlmIChoZWFkKQotCSpzdHJlYW0gPDwg
IiBoZWFkIjsKLSAgICBpZiAoZm9vdCkKLQkqc3RyZWFtIDw8ICIgZm9vdCI7Ci0KLSAgICAqc3Ry
ZWFtIDw8IGVuZGwgPDwgaW5kIDw8ICJjc3BhbnM6IjsKLSAgICBmb3IgKCB1bnNpZ25lZCBpbnQg
aSA9IDA7IGkgPCBjb2x1bW5zLnNpemUoKTsgaSsrICkKLQkqc3RyZWFtIDw8ICIgIiA8PCBjb2x1
bW5zW2ldLnNwYW47Ci0gICAgKnN0cmVhbSA8PCBlbmRsIDw8IGluZDsKLQotICAgIFJlbmRlckJs
b2NrOjpkdW1wKHN0cmVhbSxpbmQpOwotfQotI2VuZGlmCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
Ci0KLVJlbmRlclRhYmxlU2VjdGlvbjo6UmVuZGVyVGFibGVTZWN0aW9uKERPTTo6Tm9kZUltcGwq
IG5vZGUpCi0gICAgOiBSZW5kZXJDb250YWluZXIobm9kZSkKLXsKLSAgICAvLyBpbml0IFJlbmRl
ck9iamVjdCBhdHRyaWJ1dGVzCi0gICAgc2V0SW5saW5lKGZhbHNlKTsgICAvLyBvdXIgb2JqZWN0
IGlzIG5vdCBJbmxpbmUKLSAgICBncmlkUm93cyA9IDA7Ci0gICAgY0NvbCA9IDA7Ci0gICAgY1Jv
dyA9IC0xOwotICAgIG5lZWRDZWxsUmVjYWxjID0gZmFsc2U7Ci19Ci0KLVJlbmRlclRhYmxlU2Vj
dGlvbjo6flJlbmRlclRhYmxlU2VjdGlvbigpCi17Ci0gICAgY2xlYXJHcmlkKCk7Ci19Ci0KLXZv
aWQgUmVuZGVyVGFibGVTZWN0aW9uOjpkZXN0cm95KCkKLXsKLSAgICAvLyByZWNhbGMgY2VsbCBp
bmZvIGJlY2F1c2UgUmVuZGVyVGFibGUgaGFzIHVuZ3VhcmRlZCBwb2ludGVycwotICAgIC8vIHN0
b3JlZCB0aGF0IHBvaW50IHRvIHRoaXMgUmVuZGVyVGFibGVTZWN0aW9uLgotICAgIGlmICh0YWJs
ZSgpKQotICAgICAgICB0YWJsZSgpLT5zZXROZWVkU2VjdGlvblJlY2FsYygpOwotCi0gICAgUmVu
ZGVyQ29udGFpbmVyOjpkZXN0cm95KCk7Ci19Ci0KLXZvaWQgUmVuZGVyVGFibGVTZWN0aW9uOjpz
ZXRTdHlsZShSZW5kZXJTdHlsZSogX3N0eWxlKQotewotICAgIC8vIHdlIGRvbid0IGFsbG93IGNo
YW5naW5nIHRoaXMgb25lCi0gICAgaWYgKHN0eWxlKCkpCi0gICAgICAgIF9zdHlsZS0+c2V0RGlz
cGxheShzdHlsZSgpLT5kaXNwbGF5KCkpOwotICAgIGVsc2UgaWYgKF9zdHlsZS0+ZGlzcGxheSgp
ICE9IFRBQkxFX0ZPT1RFUl9HUk9VUCAmJiBfc3R5bGUtPmRpc3BsYXkoKSAhPSBUQUJMRV9IRUFE
RVJfR1JPVVApCi0gICAgICAgIF9zdHlsZS0+c2V0RGlzcGxheShUQUJMRV9ST1dfR1JPVVApOwot
Ci0gICAgUmVuZGVyQ29udGFpbmVyOjpzZXRTdHlsZShfc3R5bGUpOwotfQotCi12b2lkIFJlbmRl
clRhYmxlU2VjdGlvbjo6YWRkQ2hpbGQoUmVuZGVyT2JqZWN0ICpjaGlsZCwgUmVuZGVyT2JqZWN0
ICpiZWZvcmVDaGlsZCkKLXsKLSAgICBSZW5kZXJPYmplY3QgKnJvdyA9IGNoaWxkOwotCi0gICAg
aWYgKGNoaWxkLT5lbGVtZW50KCkgJiYgY2hpbGQtPmVsZW1lbnQoKS0+aGFzVGFnTmFtZShmb3Jt
VGFnKSkgewotICAgICAgICBSZW5kZXJDb250YWluZXI6OmFkZENoaWxkKGNoaWxkLGJlZm9yZUNo
aWxkKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAKLSAgICBpZiAoIWNoaWxkLT5pc1Rh
YmxlUm93KCkpIHsKLQotICAgICAgICBpZiAoIWJlZm9yZUNoaWxkKQotICAgICAgICAgICAgYmVm
b3JlQ2hpbGQgPSBsYXN0Q2hpbGQoKTsKLQotICAgICAgICBpZiAoYmVmb3JlQ2hpbGQgJiYgYmVm
b3JlQ2hpbGQtPmlzQW5vbnltb3VzKCkpCi0gICAgICAgICAgICByb3cgPSBiZWZvcmVDaGlsZDsK
LSAgICAgICAgZWxzZSB7Ci0JICAgIFJlbmRlck9iamVjdCAqbGFzdEJveCA9IGJlZm9yZUNoaWxk
OwotCSAgICB3aGlsZSAobGFzdEJveCAmJiBsYXN0Qm94LT5wYXJlbnQoKS0+aXNBbm9ueW1vdXMo
KSAmJiAhbGFzdEJveC0+aXNUYWJsZVJvdygpKQotCQlsYXN0Qm94ID0gbGFzdEJveC0+cGFyZW50
KCk7Ci0JICAgIGlmIChsYXN0Qm94ICYmIGxhc3RCb3gtPmlzQW5vbnltb3VzKCkpIHsKLQkJbGFz
dEJveC0+YWRkQ2hpbGQoIGNoaWxkLCBiZWZvcmVDaGlsZCApOwotCQlyZXR1cm47Ci0JICAgIH0g
ZWxzZSB7Ci0JCXJvdyA9IG5ldyAocmVuZGVyQXJlbmEoKSkgUmVuZGVyVGFibGVSb3coZG9jdW1l
bnQoKSAvKiBhbm9ueW1vdXMgdGFibGUgKi8pOwotCQlSZW5kZXJTdHlsZSAqbmV3U3R5bGUgPSBu
ZXcgKHJlbmRlckFyZW5hKCkpIFJlbmRlclN0eWxlKCk7Ci0JCW5ld1N0eWxlLT5pbmhlcml0RnJv
bShzdHlsZSgpKTsKLQkJbmV3U3R5bGUtPnNldERpc3BsYXkoVEFCTEVfUk9XKTsKLQkJcm93LT5z
ZXRTdHlsZShuZXdTdHlsZSk7Ci0JCWFkZENoaWxkKHJvdywgYmVmb3JlQ2hpbGQpOwotCSAgICB9
Ci0gICAgICAgIH0KLSAgICAgICAgcm93LT5hZGRDaGlsZChjaGlsZCk7Ci0gICAgICAgIGNoaWxk
LT5zZXROZWVkc0xheW91dEFuZE1pbk1heFJlY2FsYygpOwotICAgICAgICByZXR1cm47Ci0gICAg
fQotCi0gICAgaWYgKGJlZm9yZUNoaWxkKQotCXNldE5lZWRDZWxsUmVjYWxjKCk7Ci0KLSAgICBj
Um93Kys7Ci0gICAgY0NvbCA9IDA7Ci0KLSAgICBlbnN1cmVSb3dzKGNSb3crMSk7Ci0KLSAgICBp
ZiAoIWJlZm9yZUNoaWxkKSB7Ci0gICAgICAgIGdyaWRbY1Jvd10uaGVpZ2h0ID0gY2hpbGQtPnN0
eWxlKCktPmhlaWdodCgpOwotICAgICAgICBpZiAoZ3JpZFtjUm93XS5oZWlnaHQudHlwZSA9PSBS
ZWxhdGl2ZSkKLSAgICAgICAgICAgIGdyaWRbY1Jvd10uaGVpZ2h0ID0gTGVuZ3RoKCk7Ci0gICAg
fQotCi0KLSAgICBSZW5kZXJDb250YWluZXI6OmFkZENoaWxkKGNoaWxkLGJlZm9yZUNoaWxkKTsK
LX0KLQotYm9vbCBSZW5kZXJUYWJsZVNlY3Rpb246OmVuc3VyZVJvd3MoaW50IG51bVJvd3MpCi17
Ci0gICAgaW50IG5Sb3dzID0gZ3JpZFJvd3M7Ci0gICAgaWYgKG51bVJvd3MgPiBuUm93cykgewot
ICAgICAgICBpZiAobnVtUm93cyA+IHN0YXRpY19jYXN0PGludD4oZ3JpZC5zaXplKCkpKQotICAg
ICAgICAgICAgaWYgKCFncmlkLnJlc2l6ZShudW1Sb3dzKjIrMSkpCi0gICAgICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOwotCi0gICAgICAgIGdyaWRSb3dzID0gbnVtUm93czsKLSAgICAgICAgaW50
IG5Db2xzID0gdGFibGUoKS0+bnVtRWZmQ29scygpOwotICAgICAgICBDZWxsU3RydWN0IGVtcHR5
Q2VsbFN0cnVjdDsKLSAgICAgICAgZW1wdHlDZWxsU3RydWN0LmNlbGwgPSAwOwotICAgICAgICBl
bXB0eUNlbGxTdHJ1Y3QuaW5Db2xTcGFuID0gZmFsc2U7Ci0JZm9yIChpbnQgciA9IG5Sb3dzOyBy
IDwgbnVtUm93czsgcisrKSB7Ci0JICAgIGdyaWRbcl0ucm93ID0gbmV3IFJvdyhuQ29scyk7Ci0J
ICAgIGdyaWRbcl0ucm93LT5maWxsKGVtcHR5Q2VsbFN0cnVjdCk7Ci0JICAgIGdyaWRbcl0uYmFz
ZUxpbmUgPSAwOwotCSAgICBncmlkW3JdLmhlaWdodCA9IExlbmd0aCgpOwotCX0KLSAgICB9Ci0K
LSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBSZW5kZXJUYWJsZVNlY3Rpb246OmFkZENlbGwo
UmVuZGVyVGFibGVDZWxsICpjZWxsKQotewotICAgIGludCByU3BhbiA9IGNlbGwtPnJvd1NwYW4o
KTsKLSAgICBpbnQgY1NwYW4gPSBjZWxsLT5jb2xTcGFuKCk7Ci0gICAgQXJyYXk8UmVuZGVyVGFi
bGU6OkNvbHVtblN0cnVjdD4gJmNvbHVtbnMgPSB0YWJsZSgpLT5jb2x1bW5zOwotICAgIGludCBu
Q29scyA9IGNvbHVtbnMuc2l6ZSgpOwotCi0gICAgLy8gIyMjIG1vemlsbGEgc3RpbGwgc2VlbXMg
dG8gZG8gdGhlIG9sZCBIVE1MIHdheSwgZXZlbiBmb3Igc3RyaWN0IERURAotICAgIC8vIChzZWUg
dGhlIGFubm90YXRpb24gb24gdGFibGUgY2VsbCBsYXlvdXRpbmcgaW4gdGhlIENTUyBzcGVjcyBh
bmQgdGhlIHRlc3RjYXNlIGJlbG93OgotICAgIC8vIDxUQUJMRSBib3JkZXI+Ci0gICAgLy8gPFRS
PjxURD4xIDxURCByb3dzcGFuPSIyIj4yIDxURD4zIDxURD40Ci0gICAgLy8gPFRSPjxURCBjb2xz
cGFuPSIyIj41Ci0gICAgLy8gPC9UQUJMRT4KLQotICAgIHdoaWxlIChjQ29sIDwgbkNvbHMgJiYg
KGNlbGxBdChjUm93LCBjQ29sKS5jZWxsIHx8IGNlbGxBdChjUm93LCBjQ29sKS5pbkNvbFNwYW4p
KQotCWNDb2wrKzsKLQotICAgIGlmIChyU3BhbiA9PSAxKSB7Ci0JLy8gd2UgaWdub3JlIGhlaWdo
dCBzZXR0aW5ncyBvbiByb3dzcGFuIGNlbGxzCi0JTGVuZ3RoIGhlaWdodCA9IGNlbGwtPnN0eWxl
KCktPmhlaWdodCgpOwotCWlmIChoZWlnaHQudmFsdWUgPiAwIHx8IChoZWlnaHQudHlwZSA9PSBS
ZWxhdGl2ZSAmJiBoZWlnaHQudmFsdWUgPj0gMCkpIHsKLQkgICAgTGVuZ3RoIGNSb3dIZWlnaHQg
PSBncmlkW2NSb3ddLmhlaWdodDsKLQkgICAgc3dpdGNoIChoZWlnaHQudHlwZSkgewotICAgICAg
ICAgICAgICAgIGNhc2UgUGVyY2VudDoKLSAgICAgICAgICAgICAgICAgICAgaWYgKCEoY1Jvd0hl
aWdodC50eXBlID09IFBlcmNlbnQpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAoY1Jvd0hl
aWdodC50eXBlID09IFBlcmNlbnQgJiYgY1Jvd0hlaWdodC52YWx1ZSA8IGhlaWdodC52YWx1ZSkp
Ci0gICAgICAgICAgICAgICAgICAgICAgICBncmlkW2NSb3ddLmhlaWdodCA9IGhlaWdodDsKLSAg
ICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgRml4ZWQ6
Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjUm93SGVpZ2h0LnR5cGUgPCBQZXJjZW50IHx8Ci0g
ICAgICAgICAgICAgICAgICAgICAgICAoY1Jvd0hlaWdodC50eXBlID09IEZpeGVkICYmIGNSb3dI
ZWlnaHQudmFsdWUgPCBoZWlnaHQudmFsdWUpKQotICAgICAgICAgICAgICAgICAgICAgICAgZ3Jp
ZFtjUm93XS5oZWlnaHQgPSBoZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAg
ICAgICAgICAgICAgIGNhc2UgUmVsYXRpdmU6Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAg
ICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gICAgLy8gbWFr
ZSBzdXJlIHdlIGhhdmUgZW5vdWdoIHJvd3MKLSAgICBpZiAoIWVuc3VyZVJvd3MoY1JvdyArIHJT
cGFuKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaW50IGNvbCA9IGNDb2w7Ci0gICAgLy8gdGVs
bCB0aGUgY2VsbCB3aGVyZSBpdCBpcwotICAgIENlbGxTdHJ1Y3QgY3VycmVudENlbGw7Ci0gICAg
Y3VycmVudENlbGwuY2VsbCA9IGNlbGw7Ci0gICAgY3VycmVudENlbGwuaW5Db2xTcGFuID0gZmFs
c2U7Ci0gICAgd2hpbGUgKGNTcGFuKSB7Ci0JaW50IGN1cnJlbnRTcGFuOwotCWlmIChjQ29sID49
IG5Db2xzKSB7Ci0JICAgIHRhYmxlKCktPmFwcGVuZENvbHVtbihjU3Bhbik7Ci0JICAgIGN1cnJl
bnRTcGFuID0gY1NwYW47Ci0JfSBlbHNlIHsKLQkgICAgaWYgKGNTcGFuIDwgY29sdW1uc1tjQ29s
XS5zcGFuKQotCQl0YWJsZSgpLT5zcGxpdENvbHVtbihjQ29sLCBjU3Bhbik7Ci0JICAgIGN1cnJl
bnRTcGFuID0gY29sdW1uc1tjQ29sXS5zcGFuOwotCX0KLQotCWZvciAoaW50IHIgPSAwOyByIDwg
clNwYW47IHIrKykgewotICAgICAgICAgICAgQ2VsbFN0cnVjdCYgYyA9IGNlbGxBdChjUm93ICsg
ciwgY0NvbCk7Ci0gICAgICAgICAgICBpZiAoY3VycmVudENlbGwuY2VsbCAmJiAhYy5jZWxsKQot
ICAgICAgICAgICAgICAgIGMuY2VsbCA9IGN1cnJlbnRDZWxsLmNlbGw7Ci0gICAgICAgICAgICBp
ZiAoY3VycmVudENlbGwuaW5Db2xTcGFuKQotICAgICAgICAgICAgICAgIGMuaW5Db2xTcGFuID0g
dHJ1ZTsKLQl9Ci0JY0NvbCsrOwotCWNTcGFuIC09IGN1cnJlbnRTcGFuOwotICAgICAgICBjdXJy
ZW50Q2VsbC5jZWxsID0gMDsKLQljdXJyZW50Q2VsbC5pbkNvbFNwYW4gPSB0cnVlOwotICAgIH0K
LSAgICBpZiAoY2VsbCkgewotCWNlbGwtPnNldFJvdyhjUm93KTsKLQljZWxsLT5zZXRDb2wodGFi
bGUoKS0+ZWZmQ29sVG9Db2woY29sKSk7Ci0gICAgfQotfQotCi0KLQotdm9pZCBSZW5kZXJUYWJs
ZVNlY3Rpb246OnNldENlbGxXaWR0aHMoKQotewotICAgIEFycmF5PGludD4gJmNvbHVtblBvcyA9
IHRhYmxlKCktPmNvbHVtblBvczsKLQotICAgIGludCByb3dzID0gZ3JpZFJvd3M7Ci0gICAgZm9y
IChpbnQgaSA9IDA7IGkgPCByb3dzOyBpKyspIHsKLQlSb3cgJnJvdyA9ICpncmlkW2ldLnJvdzsK
LQlpbnQgY29scyA9IHJvdy5zaXplKCk7Ci0JZm9yIChpbnQgaiA9IDA7IGogPCBjb2xzOyBqKysp
IHsKLQkgICAgQ2VsbFN0cnVjdCBjdXJyZW50ID0gcm93W2pdOwotICAgICAgICAgICAgUmVuZGVy
VGFibGVDZWxsICpjZWxsID0gY3VycmVudC5jZWxsOwotCi0JICAgIGlmICghY2VsbCkKLQkJY29u
dGludWU7Ci0JICAgIGludCBlbmRDb2wgPSBqOwotCSAgICBpbnQgY3NwYW4gPSBjZWxsLT5jb2xT
cGFuKCk7Ci0JICAgIHdoaWxlIChjc3BhbiAmJiBlbmRDb2wgPCBjb2xzKSB7Ci0JCWNzcGFuIC09
IHRhYmxlKCktPmNvbHVtbnNbZW5kQ29sXS5zcGFuOwotCQllbmRDb2wrKzsKLQkgICAgfQotCSAg
ICBpbnQgdyA9IGNvbHVtblBvc1tlbmRDb2xdIC0gY29sdW1uUG9zW2pdIC0gdGFibGUoKS0+aEJv
cmRlclNwYWNpbmcoKTsKLQkgICAgaW50IG9sZFdpZHRoID0gY2VsbC0+d2lkdGgoKTsKLQkgICAg
aWYgKHcgIT0gb2xkV2lkdGgpIHsKLQkJY2VsbC0+c2V0TmVlZHNMYXlvdXQodHJ1ZSk7Ci0JCWNl
bGwtPnNldFdpZHRoKHcpOwotCSAgICB9Ci0JfQotICAgIH0KLX0KLQotCi12b2lkIFJlbmRlclRh
YmxlU2VjdGlvbjo6Y2FsY1Jvd0hlaWdodCgpCi17Ci0gICAgaW50IGluZHg7Ci0gICAgUmVuZGVy
VGFibGVDZWxsICpjZWxsOwotCi0gICAgaW50IHRvdGFsUm93cyA9IGdyaWRSb3dzOwotICAgIGlu
dCBzcGFjaW5nID0gdGFibGUoKS0+dkJvcmRlclNwYWNpbmcoKTsKLQotICAgIHJvd1Bvcy5yZXNp
emUodG90YWxSb3dzICsgMSk7Ci0gICAgcm93UG9zWzBdID0gc3BhY2luZzsKLQotICAgIGZvciAo
aW50IHIgPSAwOyByIDwgdG90YWxSb3dzOyByKyspIHsKLQlyb3dQb3NbciArIDFdID0gMDsKLQot
CWludCBiYXNlbGluZSA9IDA7Ci0JaW50IGJkZXNjID0gMDsKLQlpbnQgY2ggPSBncmlkW3JdLmhl
aWdodC5taW5XaWR0aCgwKTsKLQlpbnQgcG9zID0gcm93UG9zW3IgKyAxXSArIGNoICsgc3BhY2lu
ZzsKLQotCWlmIChwb3MgPiByb3dQb3NbciArIDFdKQotCSAgICByb3dQb3NbciArIDFdID0gcG9z
OwotCi0JUm93ICpyb3cgPSBncmlkW3JdLnJvdzsKLQlpbnQgdG90YWxDb2xzID0gcm93LT5zaXpl
KCk7Ci0JaW50IHRvdGFsUm93cyA9IGdyaWRSb3dzOwotCi0JZm9yIChpbnQgYyA9IDA7IGMgPCB0
b3RhbENvbHM7IGMrKykgewotCSAgICBDZWxsU3RydWN0IGN1cnJlbnQgPSBjZWxsQXQociwgYyk7
Ci0gICAgICAgICAgICBjZWxsID0gY3VycmVudC5jZWxsOwotCSAgICBpZiAoIWNlbGwgfHwgY3Vy
cmVudC5pbkNvbFNwYW4pCi0JCWNvbnRpbnVlOwotCSAgICBpZiAociA8IHRvdGFsUm93cyAtIDEg
JiYgY2VsbEF0KHIgKyAxLCBjKS5jZWxsID09IGNlbGwpCi0JCWNvbnRpbnVlOwotCi0JICAgIGlm
ICgoaW5keCA9IHIgLSBjZWxsLT5yb3dTcGFuKCkgKyAxKSA8IDApCi0JCWluZHggPSAwOwotCi0g
ICAgICAgICAgICBpZiAoY2VsbC0+b3ZlcnJpZGVTaXplKCkgIT0gLTEpIHsKLSAgICAgICAgICAg
ICAgICBjZWxsLT5zZXRPdmVycmlkZVNpemUoLTEpOwotICAgICAgICAgICAgICAgIGNlbGwtPnNl
dENoaWxkTmVlZHNMYXlvdXQodHJ1ZSwgZmFsc2UpOwotICAgICAgICAgICAgICAgIGNlbGwtPmxh
eW91dElmTmVlZGVkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAg
IC8vIEV4cGxpY2l0IGhlaWdodHMgdXNlIHRoZSBib3JkZXIgYm94IGluIHF1aXJrcyBtb2RlLiAg
SW4gc3RyaWN0IG1vZGUgZG8gdGhlIHJpZ2h0Ci0gICAgICAgICAgICAvLyB0aGluZyBhbmQgYWN0
dWFsbHkgYWRkIGluIHRoZSBib3JkZXIgYW5kIHBhZGRpbmcuCi0JICAgIGNoID0gY2VsbC0+c3R5
bGUoKS0+aGVpZ2h0KCkud2lkdGgoMCkgKyAKLSAgICAgICAgICAgICAgICAoY2VsbC0+c3R5bGUo
KS0+aHRtbEhhY2tzKCkgPyAwIDogKGNlbGwtPnBhZGRpbmdUb3AoKSArIGNlbGwtPnBhZGRpbmdC
b3R0b20oKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBjZWxsLT5ib3JkZXJUb3AoKSArIGNlbGwtPmJvcmRlckJvdHRvbSgpKSk7Ci0JICAgIGlm
IChjZWxsLT5oZWlnaHQoKSA+IGNoKQotCQljaCA9IGNlbGwtPmhlaWdodCgpOwotCi0gICAgICAg
ICAgICBwb3MgPSByb3dQb3NbIGluZHggXSArIGNoICsgc3BhY2luZzsKLQotCSAgICBpZiAocG9z
ID4gcm93UG9zW3IgKyAxXSkKLQkJcm93UG9zW3IgKyAxXSA9IHBvczsKLQotCSAgICAvLyBmaW5k
IG91dCB0aGUgYmFzZWxpbmUKLQkgICAgRVZlcnRpY2FsQWxpZ24gdmEgPSBjZWxsLT5zdHlsZSgp
LT52ZXJ0aWNhbEFsaWduKCk7Ci0JICAgIGlmICh2YSA9PSBCQVNFTElORSB8fCB2YSA9PSBURVhU
X0JPVFRPTSB8fCB2YSA9PSBURVhUX1RPUAotCQl8fCB2YSA9PSBTVVBFUiB8fCB2YSA9PSBTVUIp
IHsKLQkJaW50IGIgPSBjZWxsLT5iYXNlbGluZVBvc2l0aW9uKCk7Ci0gICAgICAgICAgICAgICAg
aWYgKGIgPiBjZWxsLT5ib3JkZXJUb3AoKSArIGNlbGwtPnBhZGRpbmdUb3AoKSkgewotICAgICAg
ICAgICAgICAgICAgICBpZiAoYiA+IGJhc2VsaW5lKQotICAgICAgICAgICAgICAgICAgICAgICAg
YmFzZWxpbmUgPSBiOwotCi0gICAgICAgICAgICAgICAgICAgIGludCB0ZCA9IHJvd1Bvc1tpbmR4
XSArIGNoIC0gYjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRkID4gYmRlc2MpCi0gICAgICAg
ICAgICAgICAgICAgICAgICBiZGVzYyA9IHRkOwotICAgICAgICAgICAgICAgIH0KLQkgICAgfQot
CX0KLQotCS8vZG8gd2UgaGF2ZSBiYXNlbGluZSBhbGlnbmVkIGVsZW1lbnRzPwotCWlmIChiYXNl
bGluZSkgewotCSAgICAvLyBpbmNyZWFzZSByb3doZWlnaHQgaWYgYmFzZWxpbmUgcmVxdWlyZXMK
LQkgICAgaW50IGJSb3dQb3MgPSBiYXNlbGluZSArIGJkZXNjICArIHNwYWNpbmcgOyAvLyArIDIq
cGFkZGluZwotCSAgICBpZiAocm93UG9zW3IgKyAxXSA8IGJSb3dQb3MpCi0JCXJvd1Bvc1tyICsg
MV0gPSBiUm93UG9zOwotCi0JICAgIGdyaWRbcl0uYmFzZUxpbmUgPSBiYXNlbGluZTsKLQl9Ci0K
LQlpZiAocm93UG9zW3IgKyAxXSA8IHJvd1Bvc1tyXSkKLQkgICAgcm93UG9zW3IgKyAxXSA9IHJv
d1Bvc1tyXTsKLSAgICB9Ci19Ci0KLWludCBSZW5kZXJUYWJsZVNlY3Rpb246OmxheW91dFJvd3Mo
aW50IHRvQWRkKQotewotICAgIGludCBySGVpZ2h0OwotICAgIGludCByaW5keDsKLSAgICBpbnQg
dG90YWxSb3dzID0gZ3JpZFJvd3M7Ci0gICAgaW50IGhzcGFjaW5nID0gdGFibGUoKS0+aEJvcmRl
clNwYWNpbmcoKTsKLSAgICBpbnQgdnNwYWNpbmcgPSB0YWJsZSgpLT52Qm9yZGVyU3BhY2luZygp
OwotICAgIAotICAgIGlmICh0b0FkZCAmJiB0b3RhbFJvd3MgJiYgKHJvd1Bvc1t0b3RhbFJvd3Nd
IHx8ICFuZXh0U2libGluZygpKSkgewotCi0JaW50IHRvdGFsSGVpZ2h0ID0gcm93UG9zW3RvdGFs
Um93c10gKyB0b0FkZDsKLQotICAgICAgICBpbnQgZGggPSB0b0FkZDsKLQlpbnQgdG90YWxQZXJj
ZW50ID0gMDsKLQlpbnQgbnVtQXV0byA9IDA7Ci0JZm9yIChpbnQgciA9IDA7IHIgPCB0b3RhbFJv
d3M7IHIrKykgewotCSAgICBpZiAoZ3JpZFtyXS5oZWlnaHQudHlwZSA9PSBBdXRvKQotCQludW1B
dXRvKys7Ci0JICAgIGVsc2UgaWYgKGdyaWRbcl0uaGVpZ2h0LnR5cGUgPT0gUGVyY2VudCkKLQkJ
dG90YWxQZXJjZW50ICs9IGdyaWRbcl0uaGVpZ2h0LnZhbHVlOwotCX0KLQlpZiAodG90YWxQZXJj
ZW50KSB7Ci0JICAgIC8vIHRyeSB0byBzYXRpc2Z5IHBlcmNlbnQKLQkgICAgaW50IGFkZCA9IDA7
Ci0JICAgIGlmICh0b3RhbFBlcmNlbnQgPiAxMDApCi0JCXRvdGFsUGVyY2VudCA9IDEwMDsKLQkg
ICAgaW50IHJoID0gcm93UG9zWzFdIC0gcm93UG9zWzBdOwotCSAgICBmb3IgKGludCByID0gMDsg
ciA8IHRvdGFsUm93czsgcisrKSB7Ci0JCWlmICh0b3RhbFBlcmNlbnQgPiAwICYmIGdyaWRbcl0u
aGVpZ2h0LnR5cGUgPT0gUGVyY2VudCkgewotCQkgICAgaW50IHRvQWRkID0ga01pbihkaCwgKHRv
dGFsSGVpZ2h0ICogZ3JpZFtyXS5oZWlnaHQudmFsdWUgLyAxMDApIC0gcmgpOwotICAgICAgICAg
ICAgICAgICAgICAvLyBJZiB0b0FkZCBpcyBuZWdhdGl2ZSwgdGhlbiB3ZSBkb24ndCB3YW50IHRv
IHNocmluayB0aGUgcm93ICh0aGlzIGJ1ZwotICAgICAgICAgICAgICAgICAgICAvLyBhZmZlY3Rl
ZCBPdXRsb29rIFdlYiBBY2Nlc3MpLgotICAgICAgICAgICAgICAgICAgICB0b0FkZCA9IGtNYXgo
MCwgdG9BZGQpOwotCQkgICAgYWRkICs9IHRvQWRkOwotCQkgICAgZGggLT0gdG9BZGQ7Ci0JCSAg
ICB0b3RhbFBlcmNlbnQgLT0gZ3JpZFtyXS5oZWlnaHQudmFsdWU7Ci0JCX0KLQkJaWYgKHIgPCB0
b3RhbFJvd3MgLSAxKQotCQkgICAgcmggPSByb3dQb3NbciArIDJdIC0gcm93UG9zW3IgKyAxXTsK
LSAgICAgICAgICAgICAgICByb3dQb3NbciArIDFdICs9IGFkZDsKLQkgICAgfQotCX0KLQlpZiAo
bnVtQXV0bykgewotCSAgICAvLyBkaXN0cmlidXRlIG92ZXIgdmFyaWFibGUgY29scwotCSAgICBp
bnQgYWRkID0gMDsKLQkgICAgZm9yIChpbnQgciA9IDA7IHIgPCB0b3RhbFJvd3M7IHIrKykgewot
CQlpZiAobnVtQXV0byA+IDAgJiYgZ3JpZFtyXS5oZWlnaHQudHlwZSA9PSBBdXRvKSB7Ci0JCSAg
ICBpbnQgdG9BZGQgPSBkaC9udW1BdXRvOwotCQkgICAgYWRkICs9IHRvQWRkOwotCQkgICAgZGgg
LT0gdG9BZGQ7Ci0gICAgICAgICAgICAgICAgICAgIG51bUF1dG8tLTsKLQkJfQotICAgICAgICAg
ICAgICAgIHJvd1Bvc1tyICsgMV0gKz0gYWRkOwotCSAgICB9Ci0JfQotICAgICAgICBpZiAoZGgg
PiAwICYmIHJvd1Bvc1t0b3RhbFJvd3NdKSB7Ci0JICAgIC8vIGlmIHNvbWUgbGVmdCBvdmVycywg
ZGlzdHJpYnV0ZSBlcXVhbGx5LgotICAgICAgICAgICAgaW50IHRvdCA9IHJvd1Bvc1t0b3RhbFJv
d3NdOwotICAgICAgICAgICAgaW50IGFkZCA9IDA7Ci0gICAgICAgICAgICBpbnQgcHJldiA9IHJv
d1Bvc1swXTsKLSAgICAgICAgICAgIGZvciAoaW50IHIgPSAwOyByIDwgdG90YWxSb3dzOyByKysp
IHsKLSAgICAgICAgICAgICAgICAvL3dlaWdodCB3aXRoIHRoZSBvcmlnaW5hbCBoZWlnaHQKLSAg
ICAgICAgICAgICAgICBhZGQgKz0gZGggKiAocm93UG9zW3IgKyAxXSAtIHByZXYpIC8gdG90Owot
ICAgICAgICAgICAgICAgIHByZXYgPSByb3dQb3NbciArIDFdOwotICAgICAgICAgICAgICAgIHJv
d1Bvc1tyICsgMV0gKz0gYWRkOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0g
ICAgaW50IGxlZnRPZmZzZXQgPSBoc3BhY2luZzsKLQotICAgIGludCBuRWZmQ29scyA9IHRhYmxl
KCktPm51bUVmZkNvbHMoKTsKLSAgICBmb3IgKGludCByID0gMDsgciA8IHRvdGFsUm93czsgcisr
KSB7Ci0JUm93ICpyb3cgPSBncmlkW3JdLnJvdzsKLQlpbnQgdG90YWxDb2xzID0gcm93LT5zaXpl
KCk7Ci0gICAgICAgIGZvciAoaW50IGMgPSAwOyBjIDwgbkVmZkNvbHM7IGMrKykgewotICAgICAg
ICAgICAgQ2VsbFN0cnVjdCBjdXJyZW50ID0gY2VsbEF0KHIsIGMpOwotICAgICAgICAgICAgUmVu
ZGVyVGFibGVDZWxsKiBjZWxsID0gY3VycmVudC5jZWxsOwotICAgICAgICAgICAgCi0gICAgICAg
ICAgICBpZiAoIWNlbGwpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBp
ZiAociA8IHRvdGFsUm93cyAtIDEgJiYgY2VsbCA9PSBjZWxsQXQociArIDEsIGMpLmNlbGwpCi0J
CWNvbnRpbnVlOwotCi0gICAgICAgICAgICBpZiAoKHJpbmR4ID0gci1jZWxsLT5yb3dTcGFuKCkg
KyAxKSA8IDApCi0gICAgICAgICAgICAgICAgcmluZHggPSAwOwotCi0gICAgICAgICAgICBySGVp
Z2h0ID0gcm93UG9zW3IgKyAxXSAtIHJvd1Bvc1tyaW5keF0gLSB2c3BhY2luZzsKLSAgICAgICAg
ICAgIAotICAgICAgICAgICAgLy8gRm9yY2UgcGVyY2VudCBoZWlnaHQgY2hpbGRyZW4gdG8gbGF5
IHRoZW1zZWx2ZXMgb3V0IGFnYWluLgotICAgICAgICAgICAgLy8gVGhpcyB3aWxsIGNhdXNlIHRo
ZXNlIGNoaWxkcmVuIHRvIGdyb3cgdG8gZmlsbCB0aGUgY2VsbC4KLSAgICAgICAgICAgIC8vIEZJ
WE1FOiBUaGVyZSBpcyBzdGlsbCBtb3JlIHdvcmsgdG8gZG8gaGVyZSB0byBmdWxseSBtYXRjaCBX
aW5JRSAoc2hvdWxkCi0gICAgICAgICAgICAvLyBpdCBiZWNvbWUgbmVjZXNzYXJ5IHRvIGRvIHNv
KS4gIEluIHF1aXJrcyBtb2RlLCBXaW5JRSBiZWhhdmVzIGxpa2Ugd2UKLSAgICAgICAgICAgIC8v
IGRvLCBidXQgaXQgd2lsbCBjbGlwIHRoZSBjZWxscyB0aGF0IHNwaWxsIG91dCBvZiB0aGUgdGFi
bGUgc2VjdGlvbi4gIEluCi0gICAgICAgICAgICAvLyBzdHJpY3QgbW9kZSwgTW96aWxsYSBhbmQg
V2luSUUgYm90aCByZWdyb3cgdGhlIHRhYmxlIHRvIGFjY29tbW9kYXRlIHRoZQotICAgICAgICAg
ICAgLy8gbmV3IGhlaWdodCBvZiB0aGUgY2VsbCAodGh1cyBsZXR0aW5nIHRoZSBwZXJjZW50YWdl
cyBjYXVzZSBncm93dGggb25lCi0gICAgICAgICAgICAvLyB0aW1lIG9ubHkpLiAgV2UgbWF5IGFs
c28gbm90IGJlIGhhbmRsaW5nIHJvdy1zcGFubmluZyBjZWxscyBjb3JyZWN0bHkuCi0gICAgICAg
ICAgICAvLwotICAgICAgICAgICAgLy8gTm90ZSBhbHNvIHRoZSBvZGRpdHkgd2hlcmUgcmVwbGFj
ZWQgZWxlbWVudHMgYWx3YXlzIGZsZXgsIGFuZCB5ZXQgYmxvY2tzL3RhYmxlcyBkbwotICAgICAg
ICAgICAgLy8gbm90IG5lY2Vzc2FyaWx5IGZsZXguICBXaW5JRSBpcyBjcmF6eSBhbmQgaW5jb25z
aXN0ZW50LCBhbmQgd2UgY2FuJ3QgaG9wZSB0bwotICAgICAgICAgICAgLy8gbWF0Y2ggdGhlIGJl
aGF2aW9yIHBlcmZlY3RseSwgYnV0IHdlJ2xsIGNvbnRpbnVlIHRvIHJlZmluZSBpdCBhcyB3ZSBk
aXNjb3ZlciBuZXcKLSAgICAgICAgICAgIC8vIGJ1Z3MuIDopCi0gICAgICAgICAgICBib29sIGNl
bGxDaGlsZHJlbkZsZXggPSBmYWxzZTsKLSAgICAgICAgICAgIGJvb2wgZmxleEFsbENoaWxkcmVu
ID0gY2VsbC0+c3R5bGUoKS0+aGVpZ2h0KCkuaXNGaXhlZCgpIHx8IAotICAgICAgICAgICAgICAg
ICghdGFibGUoKS0+c3R5bGUoKS0+aGVpZ2h0KCkuaXNBdXRvKCkgJiYgckhlaWdodCAhPSBjZWxs
LT5oZWlnaHQoKSk7Ci0KLSAgICAgICAgICAgIGZvciAoUmVuZGVyT2JqZWN0KiBvID0gY2VsbC0+
Zmlyc3RDaGlsZCgpOyBvOyBvID0gby0+bmV4dFNpYmxpbmcoKSkgewotICAgICAgICAgICAgICAg
IGlmICghby0+aXNUZXh0KCkgJiYgby0+c3R5bGUoKS0+aGVpZ2h0KCkuaXNQZXJjZW50KCkgJiYg
KG8tPmlzUmVwbGFjZWQoKSB8fCBvLT5zY3JvbGxzT3ZlcmZsb3coKSB8fCBmbGV4QWxsQ2hpbGRy
ZW4pKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRhYmxlcyB3aXRoIG5vIHNlY3Rpb25zIGRv
IG5vdCBmbGV4LgotICAgICAgICAgICAgICAgICAgICBpZiAoIW8tPmlzVGFibGUoKSB8fCBzdGF0
aWNfY2FzdDxSZW5kZXJUYWJsZSo+KG8pLT5oYXNTZWN0aW9ucygpKSB7Ci0gICAgICAgICAgICAg
ICAgICAgICAgICBvLT5zZXROZWVkc0xheW91dCh0cnVlLCBmYWxzZSk7Ci0gICAgICAgICAgICAg
ICAgICAgICAgICBjZWxsLT5zZXRDaGlsZE5lZWRzTGF5b3V0KHRydWUsIGZhbHNlKTsKLSAgICAg
ICAgICAgICAgICAgICAgICAgIGNlbGxDaGlsZHJlbkZsZXggPSB0cnVlOwotICAgICAgICAgICAg
ICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAg
aWYgKGNlbGxDaGlsZHJlbkZsZXgpIHsKLSAgICAgICAgICAgICAgICBjZWxsLT5zZXRPdmVycmlk
ZVNpemUoa01heCgwLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBySGVpZ2h0IC0gY2VsbC0+Ym9yZGVyVG9wKCkgLSBjZWxsLT5wYWRkaW5nVG9wKCkgLSAKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC0+
Ym9yZGVyQm90dG9tKCkgLSBjZWxsLT5wYWRkaW5nQm90dG9tKCkpKTsKLSAgICAgICAgICAgICAg
ICBjZWxsLT5sYXlvdXRJZk5lZWRlZCgpOwotCi0gICAgICAgICAgICAgICAgLy8gQWxpZ25tZW50
IHdpdGhpbiBhIGNlbGwgaXMgYmFzZWQgb2ZmIHRoZSBjYWxjdWxhdGVkCi0gICAgICAgICAgICAg
ICAgLy8gaGVpZ2h0LCB3aGljaCBiZWNvbWVzIGlycmVsZXZhbnQgb25jZSB0aGUgY2VsbCBoYXMK
LSAgICAgICAgICAgICAgICAvLyBiZWVuIHJlc2l6ZWQgYmFzZWQgb2ZmIGl0cyBwZXJjZW50YWdl
LiAtZHdoCi0gICAgICAgICAgICAgICAgY2VsbC0+c2V0Q2VsbFRvcEV4dHJhKDApOwotICAgICAg
ICAgICAgICAgIGNlbGwtPnNldENlbGxCb3R0b21FeHRyYSgwKTsKLSAgICAgICAgICAgIH0KLSAg
ICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIEVWZXJ0aWNhbEFsaWduIHZhID0gY2Vs
bC0+c3R5bGUoKS0+dmVydGljYWxBbGlnbigpOwotICAgICAgICAgICAgICAgIGludCB0ZSA9IDA7
Ci0gICAgICAgICAgICAgICAgc3dpdGNoICh2YSkgewotICAgICAgICAgICAgICAgICAgICBjYXNl
IFNVQjoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTVVBFUjoKLSAgICAgICAgICAgICAgICAg
ICAgY2FzZSBURVhUX1RPUDoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBURVhUX0JPVFRPTToK
LSAgICAgICAgICAgICAgICAgICAgY2FzZSBCQVNFTElORToKLSAgICAgICAgICAgICAgICAgICAg
ICAgIHRlID0gZ2V0QmFzZWxpbmUocikgLSBjZWxsLT5iYXNlbGluZVBvc2l0aW9uKCkgOwotICAg
ICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgVE9Q
OgotICAgICAgICAgICAgICAgICAgICAgICAgdGUgPSAwOwotICAgICAgICAgICAgICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTUlERExFOgotICAgICAgICAgICAg
ICAgICAgICAgICAgdGUgPSAockhlaWdodCAtIGNlbGwtPmhlaWdodCgpKS8yOwotICAgICAgICAg
ICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQk9UVE9NOgot
ICAgICAgICAgICAgICAgICAgICAgICAgdGUgPSBySGVpZ2h0IC0gY2VsbC0+aGVpZ2h0KCk7Ci0g
ICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVs
dDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAg
ICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBjZWxsLT5zZXRDZWxsVG9wRXh0cmEodGUp
OwotICAgICAgICAgICAgICAgIGNlbGwtPnNldENlbGxCb3R0b21FeHRyYShySGVpZ2h0IC0gY2Vs
bC0+aGVpZ2h0KCkgLSB0ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAg
ICAgIGludCBvbGRDZWxsWCA9IGNlbGwtPnhQb3MoKTsKLSAgICAgICAgICAgIGludCBvbGRDZWxs
WSA9IGNlbGwtPnlQb3MoKTsKLSAgICAgICAgCi0gICAgICAgICAgICBpZiAoc3R5bGUoKS0+ZGly
ZWN0aW9uKCkgPT0gUlRMKSB7Ci0gICAgICAgICAgICAgICAgY2VsbC0+c2V0UG9zKAotCQkgICAg
dGFibGUoKS0+Y29sdW1uUG9zWyhpbnQpdG90YWxDb2xzXSAtCi0JCSAgICB0YWJsZSgpLT5jb2x1
bW5Qb3NbdGFibGUoKS0+Y29sVG9FZmZDb2woY2VsbC0+Y29sKCkrY2VsbC0+Y29sU3BhbigpKV0g
KwotCQkgICAgbGVmdE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgcm93UG9zW3JpbmR4XSk7
Ci0gICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICBjZWxsLT5zZXRQb3ModGFibGUo
KS0+Y29sdW1uUG9zW2NdICsgbGVmdE9mZnNldCwgcm93UG9zW3JpbmR4XSk7Ci0KLSAgICAgICAg
ICAgIC8vIElmIHRoZSBjZWxsIG1vdmVkLCB3ZSBoYXZlIHRvIHJlcGFpbnQgaXQgYXMgd2VsbCBh
cyBhbnkgZmxvYXRpbmcvcG9zaXRpb25lZAotICAgICAgICAgICAgLy8gZGVzY2VuZGFudHMuICBB
biBleGNlcHRpb24gaXMgaWYgd2UgbmVlZCBhIGxheW91dC4gIEluIHRoaXMgY2FzZSwgd2Uga25v
dyB3ZSdyZSBnb2luZyB0bwotICAgICAgICAgICAgLy8gcmVwYWludCBvdXJzZWx2ZXMgKGFuZCB0
aGUgY2VsbCkgYW55d2F5LgotICAgICAgICAgICAgaWYgKCF0YWJsZSgpLT5zZWxmTmVlZHNMYXlv
dXQoKSAmJiBjZWxsLT5jaGVja0ZvclJlcGFpbnREdXJpbmdMYXlvdXQoKSkKLSAgICAgICAgICAg
ICAgICBjZWxsLT5yZXBhaW50RHVyaW5nTGF5b3V0SWZNb3ZlZChvbGRDZWxsWCwgb2xkQ2VsbFkp
OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgbV9oZWlnaHQgPSByb3dQb3NbdG90YWxSb3dzXTsK
LSAgICByZXR1cm4gbV9oZWlnaHQ7Ci19Ci0KLQotdm9pZCBSZW5kZXJUYWJsZVNlY3Rpb246OnBh
aW50KFBhaW50SW5mbyYgaSwgaW50IHR4LCBpbnQgdHkpCi17Ci0gICAgdW5zaWduZWQgaW50IHRv
dGFsUm93cyA9IGdyaWRSb3dzOwotICAgIHVuc2lnbmVkIGludCB0b3RhbENvbHMgPSB0YWJsZSgp
LT5jb2x1bW5zLnNpemUoKTsKLQotICAgIHR4ICs9IG1feDsKLSAgICB0eSArPSBtX3k7Ci0KLSAg
ICAvLyBjaGVjayB3aGljaCByb3dzIGFuZCBjb2xzIGFyZSB2aXNpYmxlIGFuZCBvbmx5IHBhaW50
IHRoZXNlCi0gICAgLy8gIyMjIGZpeG1lOiBjb3VsZCB1c2UgYSBiaW5hcnkgc2VhcmNoIGhlcmUK
LSAgICBQYWludEFjdGlvbiBwYWludEFjdGlvbiA9IGkucGhhc2U7Ci0gICAgaW50IHggPSBpLnIu
eCgpOwotICAgIGludCB5ID0gaS5yLnkoKTsKLSAgICBpbnQgdyA9IGkuci53aWR0aCgpOwotICAg
IGludCBoID0gaS5yLmhlaWdodCgpOwotCi0gICAgaW50IG9zID0gMiAqIG1heGltYWxPdXRsaW5l
U2l6ZShwYWludEFjdGlvbik7Ci0gICAgdW5zaWduZWQgaW50IHN0YXJ0cm93ID0gMDsKLSAgICB1
bnNpZ25lZCBpbnQgZW5kcm93ID0gdG90YWxSb3dzOwotICAgIGZvciAoOyBzdGFydHJvdyA8IHRv
dGFsUm93czsgc3RhcnRyb3crKykKLQlpZiAodHkgKyByb3dQb3Nbc3RhcnRyb3crMV0gPj0geSAt
IG9zKQotCSAgICBicmVhazsKLQotICAgIGZvciAoOyBlbmRyb3cgPiAwOyBlbmRyb3ctLSkKLQlp
ZiAoIHR5ICsgcm93UG9zW2VuZHJvdy0xXSA8PSB5ICsgaCArIG9zKQotICAgICAgICAgICAgYnJl
YWs7Ci0KLSAgICB1bnNpZ25lZCBpbnQgc3RhcnRjb2wgPSAwOwotICAgIHVuc2lnbmVkIGludCBl
bmRjb2wgPSB0b3RhbENvbHM7Ci0gICAgaWYgKHN0eWxlKCktPmRpcmVjdGlvbigpID09IExUUikg
ewotCWZvciAoOyBzdGFydGNvbCA8IHRvdGFsQ29sczsgc3RhcnRjb2wrKykgewotCSAgICBpZiAo
dHggKyB0YWJsZSgpLT5jb2x1bW5Qb3Nbc3RhcnRjb2wgKyAxXSA+PSB4IC0gb3MpCi0gICAgICAg
ICAgICAgICAgYnJlYWs7Ci0JfQotCWZvciAoOyBlbmRjb2wgPiAwOyBlbmRjb2wtLSkgewotCSAg
ICBpZiAodHggKyB0YWJsZSgpLT5jb2x1bW5Qb3NbZW5kY29sIC0gMV0gPD0geCArIHcgKyBvcykK
LQkJYnJlYWs7Ci0JfQotICAgIH0KLQotICAgIGlmIChzdGFydGNvbCA8IGVuZGNvbCkgewotCS8v
IGRyYXcgdGhlIGNlbGxzCi0JZm9yICh1bnNpZ25lZCBpbnQgciA9IHN0YXJ0cm93OyByIDwgZW5k
cm93OyByKyspIHsKLQkgICAgdW5zaWduZWQgaW50IGMgPSBzdGFydGNvbDsKLQkgICAgLy8gc2lu
Y2UgYSBjZWxsIGNhbiBiZSAtMSAoaW5kaWNhdGluZyBhIGNvbHNwYW4pIHdlIG1pZ2h0IGhhdmUg
dG8gc2VhcmNoIGJhY2t3YXJkcyB0byBpbmNsdWRlIGl0Ci0JICAgIHdoaWxlIChjICYmIGNlbGxB
dChyLCBjKS5pbkNvbFNwYW4pCi0JCWMtLTsKLQkgICAgZm9yICg7IGMgPCBlbmRjb2w7IGMrKykg
ewotICAgICAgICAgICAgICAgIENlbGxTdHJ1Y3QgY3VycmVudCA9IGNlbGxBdChyLCBjKTsKLSAg
ICAgICAgICAgICAgICBSZW5kZXJUYWJsZUNlbGwgKmNlbGwgPSBjdXJyZW50LmNlbGw7Ci0JCQot
ICAgICAgICAgICAgICAgIGlmICghY2VsbCB8fCAoY2VsbC0+bGF5ZXIoKSAmJiBpLnBoYXNlICE9
IFBhaW50QWN0aW9uQ29sbGFwc2VkVGFibGVCb3JkZXJzKSkgCi0JCSAgICBjb250aW51ZTsKLSAg
ICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBDZWxscyBtdXN0IGFsd2F5cyBwYWlu
dCBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcHBlYXIgdGFraW5nIGludG8gYWNjb3VudAot
ICAgICAgICAgICAgICAgIC8vIHRoZWlyIHVwcGVyIGxlZnQgb3JpZ2luYXRpbmcgcm93L2NvbHVt
bi4gIEZvciBjZWxscyB3aXRoIHJvd3NwYW5zLCBhdm9pZCByZXBhaW50aW5nCi0gICAgICAgICAg
ICAgICAgLy8gaWYgd2UndmUgYWxyZWFkeSBzZWVuIHRoZSBjZWxsLgotCQlpZiAociA+IHN0YXJ0
cm93ICYmIChjZWxsQXQoci0xLCBjKS5jZWxsID09IGNlbGwpKQotCQkgICAgY29udGludWU7Ci0K
LQkJY2VsbC0+cGFpbnQoaSwgdHgsIHR5KTsKLQkgICAgfQotCX0KLSAgICB9Ci19Ci0KLXZvaWQg
UmVuZGVyVGFibGVTZWN0aW9uOjpyZWNhbGNDZWxscygpCi17Ci0gICAgY0NvbCA9IDA7Ci0gICAg
Y1JvdyA9IC0xOwotICAgIGNsZWFyR3JpZCgpOwotICAgIGdyaWRSb3dzID0gMDsKLQotICAgIGZv
ciAoUmVuZGVyT2JqZWN0ICpyb3cgPSBmaXJzdENoaWxkKCk7IHJvdzsgcm93ID0gcm93LT5uZXh0
U2libGluZygpKSB7Ci0JY1JvdysrOwotCWNDb2wgPSAwOwotCWVuc3VyZVJvd3MoY1JvdyArIDEp
OwotCWZvciAoUmVuZGVyT2JqZWN0ICpjZWxsID0gcm93LT5maXJzdENoaWxkKCk7IGNlbGw7IGNl
bGwgPSBjZWxsLT5uZXh0U2libGluZygpKQotCSAgICBpZiAoY2VsbC0+aXNUYWJsZUNlbGwoKSkK
LQkJYWRkQ2VsbChzdGF0aWNfY2FzdDxSZW5kZXJUYWJsZUNlbGwgKj4oY2VsbCkpOwotICAgIH0K
LSAgICBuZWVkQ2VsbFJlY2FsYyA9IGZhbHNlOwotICAgIHNldE5lZWRzTGF5b3V0KHRydWUpOwot
fQotCi12b2lkIFJlbmRlclRhYmxlU2VjdGlvbjo6Y2xlYXJHcmlkKCkKLXsKLSAgICBpbnQgcm93
cyA9IGdyaWRSb3dzOwotICAgIHdoaWxlIChyb3dzLS0pCi0JZGVsZXRlIGdyaWRbcm93c10ucm93
OwotfQotCi1SZW5kZXJPYmplY3QqIFJlbmRlclRhYmxlU2VjdGlvbjo6cmVtb3ZlQ2hpbGROb2Rl
KFJlbmRlck9iamVjdCogY2hpbGQpCi17Ci0gICAgc2V0TmVlZENlbGxSZWNhbGMoKTsKLSAgICBy
ZXR1cm4gUmVuZGVyQ29udGFpbmVyOjpyZW1vdmVDaGlsZE5vZGUoY2hpbGQpOwotfQorI2luY2x1
ZGUgIlJlbmRlclRhYmxlUm93LmgiCisjaW5jbHVkZSAiUmVuZGVyVGFibGVDZWxsLmgiCisjaW5j
bHVkZSAiRG9jdW1lbnRJbXBsLmgiCisjaW5jbHVkZSAiaHRtbG5hbWVzLmgiCiAKLSNpZm5kZWYg
TkRFQlVHCi12b2lkIFJlbmRlclRhYmxlU2VjdGlvbjo6ZHVtcChRVGV4dFN0cmVhbSAqc3RyZWFt
LCBRU3RyaW5nIGluZCkgY29uc3QKLXsKLSAgICAqc3RyZWFtIDw8IGVuZGwgPDwgaW5kIDw8ICJn
cmlkPSgiIDw8IGdyaWQuc2l6ZSgpIDw8ICIsIiA8PCB0YWJsZSgpLT5udW1FZmZDb2xzKCkgPDwg
IikiIDw8IGVuZGwgPDwgaW5kOwotICAgIGZvciAodW5zaWduZWQgaW50IHIgPSAwOyByIDwgZ3Jp
ZC5zaXplKCk7IHIrKykgewotCWZvciAoaW50IGMgPSAwOyBjIDwgdGFibGUoKS0+bnVtRWZmQ29s
cygpOyBjKyspIHsKLQkgICAgaWYgKGNlbGxBdCggciwgYykuY2VsbCAmJiAhY2VsbEF0KHIsIGMp
LmluQ29sU3BhbikKLQkJKnN0cmVhbSA8PCAiKCIgPDwgY2VsbEF0KHIsIGMpLmNlbGwtPnJvdygp
IDw8ICIsIiA8PCBjZWxsQXQociwgYykuY2VsbC0+Y29sKCkgPDwgIiwiCi0JCQk8PCBjZWxsQXQo
ciwgYykuY2VsbC0+cm93U3BhbigpIDw8ICIsIiA8PCBjZWxsQXQociwgYykuY2VsbC0+Y29sU3Bh
bigpIDw8ICIpICI7Ci0JICAgIGVsc2UKLQkJKnN0cmVhbSA8PCBjZWxsQXQociwgYykuY2VsbCA8
PCAibnVsbCBjZWxsICI7Ci0JfQotCSpzdHJlYW0gPDwgZW5kbCA8PCBpbmQ7Ci0gICAgfQotICAg
IFJlbmRlckNvbnRhaW5lcjo6ZHVtcChzdHJlYW0saW5kKTsKLX0KLSNlbmRpZgorbmFtZXNwYWNl
IFdlYkNvcmUgewogCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit1c2luZyBuYW1lc3BhY2UgSFRNTE5h
bWVzOwogCi1SZW5kZXJUYWJsZVJvdzo6UmVuZGVyVGFibGVSb3coRE9NOjpOb2RlSW1wbCogbm9k
ZSkKK1JlbmRlclRhYmxlUm93OjpSZW5kZXJUYWJsZVJvdyhOb2RlSW1wbCogbm9kZSkKICAgICA6
IFJlbmRlckNvbnRhaW5lcihub2RlKQogewogICAgIC8vIGluaXQgUmVuZGVyT2JqZWN0IGF0dHJp
YnV0ZXMKQEAgLTE0NjcsNzkyICsxMzksNCBAQCBJbnRSZWN0IFJlbmRlclRhYmxlUm93OjpnZXRB
YnNvbHV0ZVJlcGFpCiAgICAgICAgIHJldHVybiBJbnRSZWN0KCk7CiB9CiAKLS8vIC0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0KLQotUmVuZGVyVGFibGVDZWxsOjpSZW5kZXJUYWJsZUNlbGwoRE9NOjpOb2RlSW1w
bCogX25vZGUpCi0gIDogUmVuZGVyQmxvY2soX25vZGUpCi17Ci0gIF9jb2wgPSAtMTsKLSAgX3Jv
dyA9IC0xOwotICBjU3BhbiA9IHJTcGFuID0gMTsKLSAgdXBkYXRlRnJvbUVsZW1lbnQoKTsKLSAg
c2V0U2hvdWxkUGFpbnRCYWNrZ3JvdW5kT3JCb3JkZXIodHJ1ZSk7Ci0gIF90b3BFeHRyYSA9IDA7
Ci0gIF9ib3R0b21FeHRyYSA9IDA7Ci0gIG1fcGVyY2VudGFnZUhlaWdodCA9IDA7Ci19Ci0KLXZv
aWQgUmVuZGVyVGFibGVDZWxsOjpkZXN0cm95KCkKLXsKLSAgICBpZiAocGFyZW50KCkgJiYgc2Vj
dGlvbigpKQotICAgICAgICBzZWN0aW9uKCktPnNldE5lZWRDZWxsUmVjYWxjKCk7Ci0KLSAgICBS
ZW5kZXJCbG9jazo6ZGVzdHJveSgpOwotfQotCi12b2lkIFJlbmRlclRhYmxlQ2VsbDo6dXBkYXRl
RnJvbUVsZW1lbnQoKQotewotICAgIGludCBvbGRSU3BhbiA9IHJTcGFuOwotICAgIGludCBvbGRD
U3BhbiA9IGNTcGFuOwotICAgIERPTTo6Tm9kZUltcGwqIG5vZGUgPSBlbGVtZW50KCk7Ci0gICAg
aWYgKG5vZGUgJiYgKG5vZGUtPmhhc1RhZ05hbWUodGRUYWcpIHx8IG5vZGUtPmhhc1RhZ05hbWUo
dGhUYWcpKSkgewotICAgICAgICBET006OkhUTUxUYWJsZUNlbGxFbGVtZW50SW1wbCAqdGMgPSBz
dGF0aWNfY2FzdDxET006OkhUTUxUYWJsZUNlbGxFbGVtZW50SW1wbCAqPihub2RlKTsKLSAgICAg
ICAgY1NwYW4gPSB0Yy0+Y29sU3BhbigpOwotICAgICAgICByU3BhbiA9IHRjLT5yb3dTcGFuKCk7
Ci0gICAgfQotICAgIGlmICgob2xkUlNwYW4gIT0gclNwYW4gfHwgb2xkQ1NwYW4gIT0gY1NwYW4p
ICYmIHN0eWxlKCkgJiYgcGFyZW50KCkpCi0gICAgICAgIHNldE5lZWRzTGF5b3V0QW5kTWluTWF4
UmVjYWxjKCk7Ci19Ci0gICAgCi1MZW5ndGggUmVuZGVyVGFibGVDZWxsOjpzdHlsZU9yQ29sV2lk
dGgoKQotewotICAgIExlbmd0aCB3ID0gc3R5bGUoKS0+d2lkdGgoKTsKLSAgICBpZiAoY29sU3Bh
bigpID4gMSB8fCAhdy5pc0F1dG8oKSkKLSAgICAgICAgcmV0dXJuIHc7Ci0gICAgUmVuZGVyVGFi
bGVDb2wqIGNvbCA9IHRhYmxlKCktPmNvbEVsZW1lbnQoX2NvbCk7Ci0gICAgaWYgKGNvbCkKLSAg
ICAgICAgdyA9IGNvbC0+c3R5bGUoKS0+d2lkdGgoKTsKLSAgICByZXR1cm4gdzsKLX0KLQotdm9p
ZCBSZW5kZXJUYWJsZUNlbGw6OmNhbGNNaW5NYXhXaWR0aCgpCi17Ci0gICAgUmVuZGVyQmxvY2s6
OmNhbGNNaW5NYXhXaWR0aCgpOwotICAgIGlmIChlbGVtZW50KCkgJiYgc3R5bGUoKS0+YXV0b1dy
YXAoKSkgewotICAgICAgICAvLyBTZWUgaWYgbm93cmFwIHdhcyBzZXQuCi0gICAgICAgIExlbmd0
aCB3ID0gc3R5bGVPckNvbFdpZHRoKCk7Ci0gICAgICAgIERPTVN0cmluZyBub3dyYXAgPSBzdGF0
aWNfY2FzdDxFbGVtZW50SW1wbCo+KGVsZW1lbnQoKSktPmdldEF0dHJpYnV0ZShub3dyYXBBdHRy
KTsKLSAgICAgICAgaWYgKCFub3dyYXAuaXNOdWxsKCkgJiYgdy5pc0ZpeGVkKCkpCi0gICAgICAg
ICAgICAvLyBOb3dyYXAgaXMgc2V0LCBidXQgd2UgZGlkbid0IGFjdHVhbGx5IHVzZSBpdCBiZWNh
dXNlIG9mIHRoZQotICAgICAgICAgICAgLy8gZml4ZWQgd2lkdGggc2V0IG9uIHRoZSBjZWxsLiAg
RXZlbiBzbywgaXQgaXMgYSBXaW5JRS9Nb3ogdHJhaXQKLSAgICAgICAgICAgIC8vIHRvIG1ha2Ug
dGhlIG1pbndpZHRoIG9mIHRoZSBjZWxsIGludG8gdGhlIGZpeGVkIHdpZHRoLiAgVGhleSBkbyB0
aGlzCi0gICAgICAgICAgICAvLyBldmVuIGluIHN0cmljdCBtb2RlLCBzbyBkbyBub3QgbWFrZSB0
aGlzIGEgcXVpcmsuICBBZmZlY3RlZCB0aGUgdG9wCi0gICAgICAgICAgICAvLyBvZiBoaXB0b3Au
Y29tLgotICAgICAgICAgICAgaWYgKG1fbWluV2lkdGggPCB3LnZhbHVlKQotICAgICAgICAgICAg
ICAgIG1fbWluV2lkdGggPSB3LnZhbHVlOwotICAgIH0KLX0KLQotdm9pZCBSZW5kZXJUYWJsZUNl
bGw6OmNhbGNXaWR0aCgpCi17Ci19Ci0KLXZvaWQgUmVuZGVyVGFibGVDZWxsOjpzZXRXaWR0aChp
bnQgd2lkdGgpCi17Ci0gICAgaWYgKHdpZHRoICE9IG1fd2lkdGgpIHsKLQltX3dpZHRoID0gd2lk
dGg7Ci0JbV93aWR0aENoYW5nZWQgPSB0cnVlOwotICAgIH0KLX0KLQotdm9pZCBSZW5kZXJUYWJs
ZUNlbGw6OmxheW91dCgpCi17Ci0gICAgbGF5b3V0QmxvY2sobV93aWR0aENoYW5nZWQpOwotICAg
IG1fd2lkdGhDaGFuZ2VkID0gZmFsc2U7Ci19Ci0KLXZvaWQgUmVuZGVyVGFibGVDZWxsOjpjb21w
dXRlQWJzb2x1dGVSZXBhaW50UmVjdChJbnRSZWN0JiByLCBib29sIGYpCi17Ci0gICAgci5zZXRZ
KHIueSgpICsgX3RvcEV4dHJhKTsKLSAgICBSZW5kZXJCbG9jazo6Y29tcHV0ZUFic29sdXRlUmVw
YWludFJlY3QociwgZik7Ci19Ci0KLWJvb2wgUmVuZGVyVGFibGVDZWxsOjphYnNvbHV0ZVBvc2l0
aW9uKGludCAmeFBvcywgaW50ICZ5UG9zLCBib29sIGYpCi17Ci0gICAgYm9vbCByZXQgPSBSZW5k
ZXJCbG9jazo6YWJzb2x1dGVQb3NpdGlvbih4UG9zLCB5UG9zLCBmKTsKLSAgICBpZiAocmV0KQot
ICAgICAgeVBvcyArPSBfdG9wRXh0cmE7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotc2hvcnQgUmVu
ZGVyVGFibGVDZWxsOjpiYXNlbGluZVBvc2l0aW9uKGJvb2wpIGNvbnN0Ci17Ci0gICAgUmVuZGVy
T2JqZWN0KiBvID0gZmlyc3RDaGlsZCgpOwotICAgIGludCBvZmZzZXQgPSBwYWRkaW5nVG9wKCkg
KyBib3JkZXJUb3AoKTsKLSAgICAKLSAgICBpZiAoIW8pCi0gICAgICAgIHJldHVybiBvZmZzZXQg
KyBjb250ZW50SGVpZ2h0KCk7Ci0gICAgd2hpbGUgKG8tPmZpcnN0Q2hpbGQoKSkgewotCWlmICgh
by0+aXNJbmxpbmUoKSkKLQkgICAgb2Zmc2V0ICs9IG8tPnBhZGRpbmdUb3AoKSArIG8tPmJvcmRl
clRvcCgpOwotCW8gPSBvLT5maXJzdENoaWxkKCk7Ci0gICAgfQotICAgIAotICAgIGlmICghby0+
aXNJbmxpbmUoKSkKLSAgICAgICAgcmV0dXJuIHBhZGRpbmdUb3AoKSArIGJvcmRlclRvcCgpICsg
Y29udGVudEhlaWdodCgpOwotCi0gICAgb2Zmc2V0ICs9IG8tPmJhc2VsaW5lUG9zaXRpb24odHJ1
ZSk7Ci0gICAgcmV0dXJuIG9mZnNldDsKLX0KLQotCi12b2lkIFJlbmRlclRhYmxlQ2VsbDo6c2V0
U3R5bGUoUmVuZGVyU3R5bGUgKnN0eWxlKQotewotICAgIHN0eWxlLT5zZXREaXNwbGF5KFRBQkxF
X0NFTEwpOwotCi0gICAgaWYgKHN0eWxlLT53aGl0ZVNwYWNlKCkgPT0gS0hUTUxfTk9XUkFQKSB7
Ci0gICAgICAgIC8vIEZpZ3VyZSBvdXQgaWYgd2UgYXJlIHJlYWxseSBub3dyYXBwaW5nIG9yIGlm
IHdlIHNob3VsZCBqdXN0Ci0gICAgICAgIC8vIHVzZSBub3JtYWwgaW5zdGVhZC4gIElmIHRoZSB3
aWR0aCBvZiB0aGUgY2VsbCBpcyBmaXhlZCwgdGhlbgotICAgICAgICAvLyB3ZSBkb24ndCBhY3R1
YWxseSB1c2UgTk9XUkFQLiAKLSAgICAgICAgaWYgKHN0eWxlLT53aWR0aCgpLmlzRml4ZWQoKSkK
LSAgICAgICAgICAgIHN0eWxlLT5zZXRXaGl0ZVNwYWNlKE5PUk1BTCk7Ci0gICAgICAgIGVsc2UK
LSAgICAgICAgICAgIHN0eWxlLT5zZXRXaGl0ZVNwYWNlKE5PV1JBUCk7Ci0gICAgfQotCi0gICAg
UmVuZGVyQmxvY2s6OnNldFN0eWxlKHN0eWxlKTsKLSAgICBzZXRTaG91bGRQYWludEJhY2tncm91
bmRPckJvcmRlcih0cnVlKTsKLX0KLQotYm9vbCBSZW5kZXJUYWJsZUNlbGw6OnJlcXVpcmVzTGF5
ZXIoKSB7Ci0gICAgcmV0dXJuIGlzUG9zaXRpb25lZCgpIHx8IHN0eWxlKCktPm9wYWNpdHkoKSA8
IDEuMGYgfHwgaGFzT3ZlcmZsb3dDbGlwKCk7Ci19Ci0KLS8vIFRoZSBmb2xsb3dpbmcgcnVsZXMg
YXBwbHkgZm9yIHJlc29sdmluZyBjb25mbGljdHMgYW5kIGZpZ3VyaW5nIG91dCB3aGljaCBib3Jk
ZXIKLS8vIHRvIHVzZS4KLS8vICgxKSBCb3JkZXJzIHdpdGggdGhlICdib3JkZXItc3R5bGUnIG9m
ICdoaWRkZW4nIHRha2UgcHJlY2VkZW5jZSBvdmVyIGFsbCBvdGhlciBjb25mbGljdGluZyAKLS8v
IGJvcmRlcnMuIEFueSBib3JkZXIgd2l0aCB0aGlzIHZhbHVlIHN1cHByZXNzZXMgYWxsIGJvcmRl
cnMgYXQgdGhpcyBsb2NhdGlvbi4KLS8vICgyKSBCb3JkZXJzIHdpdGggYSBzdHlsZSBvZiAnbm9u
ZScgaGF2ZSB0aGUgbG93ZXN0IHByaW9yaXR5LiBPbmx5IGlmIHRoZSBib3JkZXIgcHJvcGVydGll
cyBvZiBhbGwgCi0vLyB0aGUgZWxlbWVudHMgbWVldGluZyBhdCB0aGlzIGVkZ2UgYXJlICdub25l
JyB3aWxsIHRoZSBib3JkZXIgYmUgb21pdHRlZCAoYnV0IG5vdGUgdGhhdCAnbm9uZScgaXMgCi0v
LyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGJvcmRlciBzdHlsZS4pCi0vLyAoMykgSWYgbm9u
ZSBvZiB0aGUgc3R5bGVzIGFyZSAnaGlkZGVuJyBhbmQgYXQgbGVhc3Qgb25lIG9mIHRoZW0gaXMg
bm90ICdub25lJywgdGhlbiBuYXJyb3cgYm9yZGVycyAKLS8vIGFyZSBkaXNjYXJkZWQgaW4gZmF2
b3Igb2Ygd2lkZXIgb25lcy4gSWYgc2V2ZXJhbCBoYXZlIHRoZSBzYW1lICdib3JkZXItd2lkdGgn
IHRoZW4gc3R5bGVzIGFyZSBwcmVmZXJyZWQgCi0vLyBpbiB0aGlzIG9yZGVyOiAnZG91YmxlJywg
J3NvbGlkJywgJ2Rhc2hlZCcsICdkb3R0ZWQnLCAncmlkZ2UnLCAnb3V0c2V0JywgJ2dyb292ZScs
IGFuZCB0aGUgbG93ZXN0OiAnaW5zZXQnLgotLy8gKDQpIElmIGJvcmRlciBzdHlsZXMgZGlmZmVy
IG9ubHkgaW4gY29sb3IsIHRoZW4gYSBzdHlsZSBzZXQgb24gYSBjZWxsIHdpbnMgb3ZlciBvbmUg
b24gYSByb3csIAotLy8gd2hpY2ggd2lucyBvdmVyIGEgcm93IGdyb3VwLCBjb2x1bW4sIGNvbHVt
biBncm91cCBhbmQsIGxhc3RseSwgdGFibGUuIEl0IGlzIHVuZGVmaW5lZCB3aGljaCBjb2xvciAK
LS8vIGlzIHVzZWQgd2hlbiB0d28gZWxlbWVudHMgb2YgdGhlIHNhbWUgdHlwZSBkaXNhZ3JlZS4K
LXN0YXRpYyBDb2xsYXBzZWRCb3JkZXJWYWx1ZSBjb21wYXJlQm9yZGVycyhjb25zdCBDb2xsYXBz
ZWRCb3JkZXJWYWx1ZSYgYm9yZGVyMSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgY29uc3QgQ29sbGFwc2VkQm9yZGVyVmFsdWUmIGJvcmRlcjIpCi17Ci0gICAg
Ly8gU2FuaXR5IGNoZWNrIHRoZSB2YWx1ZXMgcGFzc2VkIGluLiAgSWYgZWl0aGVyIGlzIG51bGws
IHJldHVybiB0aGUgb3RoZXIuCi0gICAgaWYgKCFib3JkZXIyLmV4aXN0cygpKSByZXR1cm4gYm9y
ZGVyMTsKLSAgICBpZiAoIWJvcmRlcjEuZXhpc3RzKCkpIHJldHVybiBib3JkZXIyOwotICAgIAot
ICAgIC8vIFJ1bGUgIzEgYWJvdmUuCi0gICAgaWYgKGJvcmRlcjEuc3R5bGUoKSA9PSBCSElEREVO
IHx8IGJvcmRlcjIuc3R5bGUoKSA9PSBCSElEREVOKQotICAgICAgICByZXR1cm4gQ29sbGFwc2Vk
Qm9yZGVyVmFsdWUoKTsgLy8gTm8gYm9yZGVyIHNob3VsZCBleGlzdCBhdCB0aGlzIGxvY2F0aW9u
LgotICAgIAotICAgIC8vIFJ1bGUgIzIgYWJvdmUuICBBIHN0eWxlIG9mICdub25lJyBoYXMgbG93
ZXN0IHByaW9yaXR5IGFuZCBhbHdheXMgbG9zZXMgdG8gYW55IG90aGVyIGJvcmRlci4KLSAgICBp
ZiAoYm9yZGVyMi5zdHlsZSgpID09IEJOT05FKSByZXR1cm4gYm9yZGVyMTsKLSAgICBpZiAoYm9y
ZGVyMS5zdHlsZSgpID09IEJOT05FKSByZXR1cm4gYm9yZGVyMjsKLSAgICAKLSAgICAvLyBUaGUg
Zmlyc3QgcGFydCBvZiBydWxlICMzIGFib3ZlLiBXaWRlciBib3JkZXJzIHdpbi4KLSAgICBpZiAo
Ym9yZGVyMS53aWR0aCgpICE9IGJvcmRlcjIud2lkdGgoKSkKLSAgICAgICAgcmV0dXJuIGJvcmRl
cjEud2lkdGgoKSA+IGJvcmRlcjIud2lkdGgoKSA/IGJvcmRlcjEgOiBib3JkZXIyOwotICAgIAot
ICAgIC8vIFRoZSBib3JkZXJzIGhhdmUgZXF1YWwgd2lkdGguICBTb3J0IGJ5IGJvcmRlciBzdHls
ZS4KLSAgICBpZiAoYm9yZGVyMS5zdHlsZSgpICE9IGJvcmRlcjIuc3R5bGUoKSkKLSAgICAgICAg
cmV0dXJuIGJvcmRlcjEuc3R5bGUoKSA+IGJvcmRlcjIuc3R5bGUoKSA/IGJvcmRlcjEgOiBib3Jk
ZXIyOwotICAgIAotICAgIC8vIFRoZSBib3JkZXIgaGF2ZSB0aGUgc2FtZSB3aWR0aCBhbmQgc3R5
bGUuICBSZWx5IG9uIHByZWNlZGVuY2UgKGNlbGwgb3ZlciByb3cgb3ZlciByb3cgZ3JvdXAsIGV0
Yy4pCi0gICAgcmV0dXJuIGJvcmRlcjEucHJlY2VkZW5jZSA+PSBib3JkZXIyLnByZWNlZGVuY2Ug
PyBib3JkZXIxIDogYm9yZGVyMjsKLX0KLQotQ29sbGFwc2VkQm9yZGVyVmFsdWUgUmVuZGVyVGFi
bGVDZWxsOjpjb2xsYXBzZWRMZWZ0Qm9yZGVyKCkgY29uc3QKLXsKLSAgICAvLyBGb3IgYm9yZGVy
IGxlZnQsIHdlIG5lZWQgdG8gY2hlY2ssIGluIG9yZGVyIG9mIHByZWNlZGVuY2U6Ci0gICAgLy8g
KDEpIE91ciBsZWZ0IGJvcmRlci4KLSAgICBDb2xsYXBzZWRCb3JkZXJWYWx1ZSByZXN1bHQoJnN0
eWxlKCktPmJvcmRlckxlZnQoKSwgQkNFTEwpOwotICAgIAotICAgIC8vICgyKSBUaGUgcHJldmlv
dXMgY2VsbCdzIHJpZ2h0IGJvcmRlci4KLSAgICBSZW5kZXJUYWJsZUNlbGwqIHByZXZDZWxsID0g
dGFibGUoKS0+Y2VsbExlZnQodGhpcyk7Ci0gICAgaWYgKHByZXZDZWxsKSB7Ci0gICAgICAgIHJl
c3VsdCA9IGNvbXBhcmVCb3JkZXJzKHJlc3VsdCwgQ29sbGFwc2VkQm9yZGVyVmFsdWUoJnByZXZD
ZWxsLT5zdHlsZSgpLT5ib3JkZXJSaWdodCgpLCBCQ0VMTCkpOwotICAgICAgICBpZiAoIXJlc3Vs
dC5leGlzdHMoKSkKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIGVsc2Ug
aWYgKGNvbCgpID09IDApIHsKLSAgICAgICAgLy8gKDMpIE91ciByb3cncyBsZWZ0IGJvcmRlci4K
LSAgICAgICAgcmVzdWx0ID0gY29tcGFyZUJvcmRlcnMocmVzdWx0LCBDb2xsYXBzZWRCb3JkZXJW
YWx1ZSgmcGFyZW50KCktPnN0eWxlKCktPmJvcmRlckxlZnQoKSwgQlJPVykpOwotICAgICAgICBp
ZiAoIXJlc3VsdC5leGlzdHMoKSkKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAg
IAotICAgICAgICAvLyAoNCkgT3VyIHJvdyBncm91cCdzIGxlZnQgYm9yZGVyLgotICAgICAgICBy
ZXN1bHQgPSBjb21wYXJlQm9yZGVycyhyZXN1bHQsIENvbGxhcHNlZEJvcmRlclZhbHVlKCZzZWN0
aW9uKCktPnN0eWxlKCktPmJvcmRlckxlZnQoKSwgQlJPV0dST1VQKSk7Ci0gICAgICAgIGlmICgh
cmVzdWx0LmV4aXN0cygpKQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAg
Ci0gICAgLy8gKDUpIE91ciBjb2x1bW4ncyBsZWZ0IGJvcmRlci4KLSAgICBSZW5kZXJUYWJsZUNv
bCogY29sRWx0ID0gdGFibGUoKS0+Y29sRWxlbWVudChjb2woKSk7Ci0gICAgaWYgKGNvbEVsdCkg
ewotICAgICAgICByZXN1bHQgPSBjb21wYXJlQm9yZGVycyhyZXN1bHQsIENvbGxhcHNlZEJvcmRl
clZhbHVlKCZjb2xFbHQtPnN0eWxlKCktPmJvcmRlckxlZnQoKSwgQkNPTCkpOwotICAgICAgICBp
ZiAoIXJlc3VsdC5leGlzdHMoKSkKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQot
ICAgIAotICAgIC8vICg2KSBUaGUgcHJldmlvdXMgY29sdW1uJ3MgcmlnaHQgYm9yZGVyLgotICAg
IGlmIChjb2woKSA+IDApIHsKLSAgICAgICAgY29sRWx0ID0gdGFibGUoKS0+Y29sRWxlbWVudChj
b2woKSAtIDEpOwotICAgICAgICBpZiAoY29sRWx0KSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBj
b21wYXJlQm9yZGVycyhyZXN1bHQsIENvbGxhcHNlZEJvcmRlclZhbHVlKCZjb2xFbHQtPnN0eWxl
KCktPmJvcmRlclJpZ2h0KCksIEJDT0wpKTsKLSAgICAgICAgICAgIGlmICghcmVzdWx0LmV4aXN0
cygpKQotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0g
ICAgCi0gICAgaWYgKGNvbCgpID09IDApIHsKLSAgICAgICAgLy8gKDcpIFRoZSB0YWJsZSdzIGxl
ZnQgYm9yZGVyLgotICAgICAgICByZXN1bHQgPSBjb21wYXJlQm9yZGVycyhyZXN1bHQsIENvbGxh
cHNlZEJvcmRlclZhbHVlKCZ0YWJsZSgpLT5zdHlsZSgpLT5ib3JkZXJMZWZ0KCksIEJUQUJMRSkp
OwotICAgICAgICBpZiAoIXJlc3VsdC5leGlzdHMoKSkKLSAgICAgICAgICAgIHJldHVybiByZXN1
bHQ7Ci0gICAgfQotICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLUNvbGxhcHNlZEJvcmRl
clZhbHVlIFJlbmRlclRhYmxlQ2VsbDo6Y29sbGFwc2VkUmlnaHRCb3JkZXIoKSBjb25zdAotewot
ICAgIFJlbmRlclRhYmxlKiB0YWJsZUVsdCA9IHRhYmxlKCk7Ci0gICAgYm9vbCBpbkxhc3RDb2x1
bW4gPSBmYWxzZTsKLSAgICBpbnQgZWZmQ29sID0gdGFibGVFbHQtPmNvbFRvRWZmQ29sKGNvbCgp
ICsgY29sU3BhbigpIC0gMSk7Ci0gICAgaWYgKGVmZkNvbCA9PSB0YWJsZUVsdC0+bnVtRWZmQ29s
cygpIC0gMSkKLSAgICAgICAgaW5MYXN0Q29sdW1uID0gdHJ1ZTsKLSAgICAKLSAgICAvLyBGb3Ig
Ym9yZGVyIHJpZ2h0LCB3ZSBuZWVkIHRvIGNoZWNrLCBpbiBvcmRlciBvZiBwcmVjZWRlbmNlOgot
ICAgIC8vICgxKSBPdXIgcmlnaHQgYm9yZGVyLgotICAgIENvbGxhcHNlZEJvcmRlclZhbHVlIHJl
c3VsdCA9IENvbGxhcHNlZEJvcmRlclZhbHVlKCZzdHlsZSgpLT5ib3JkZXJSaWdodCgpLCBCQ0VM
TCk7Ci0gICAgCi0gICAgLy8gKDIpIFRoZSBuZXh0IGNlbGwncyBsZWZ0IGJvcmRlci4KLSAgICBp
ZiAoIWluTGFzdENvbHVtbikgewotICAgICAgICBSZW5kZXJUYWJsZUNlbGwqIG5leHRDZWxsID0g
dGFibGVFbHQtPmNlbGxSaWdodCh0aGlzKTsKLSAgICAgICAgaWYgKG5leHRDZWxsICYmIG5leHRD
ZWxsLT5zdHlsZSgpKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBjb21wYXJlQm9yZGVycyhyZXN1
bHQsIENvbGxhcHNlZEJvcmRlclZhbHVlKCZuZXh0Q2VsbC0+c3R5bGUoKS0+Ym9yZGVyTGVmdCgp
LCBCQ0VMTCkpOwotICAgICAgICAgICAgaWYgKCFyZXN1bHQuZXhpc3RzKCkpCi0gICAgICAgICAg
ICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8v
ICgzKSBPdXIgcm93J3MgcmlnaHQgYm9yZGVyLgotICAgICAgICByZXN1bHQgPSBjb21wYXJlQm9y
ZGVycyhyZXN1bHQsIENvbGxhcHNlZEJvcmRlclZhbHVlKCZwYXJlbnQoKS0+c3R5bGUoKS0+Ym9y
ZGVyUmlnaHQoKSwgQlJPVykpOwotICAgICAgICBpZiAoIXJlc3VsdC5leGlzdHMoKSkKLSAgICAg
ICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIAotICAgICAgICAvLyAoNCkgT3VyIHJvdyBn
cm91cCdzIHJpZ2h0IGJvcmRlci4KLSAgICAgICAgcmVzdWx0ID0gY29tcGFyZUJvcmRlcnMocmVz
dWx0LCBDb2xsYXBzZWRCb3JkZXJWYWx1ZSgmc2VjdGlvbigpLT5zdHlsZSgpLT5ib3JkZXJSaWdo
dCgpLCBCUk9XR1JPVVApKTsKLSAgICAgICAgaWYgKCFyZXN1bHQuZXhpc3RzKCkpCi0gICAgICAg
ICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICAKLSAgICAvLyAoNSkgT3VyIGNvbHVtbidz
IHJpZ2h0IGJvcmRlci4KLSAgICBSZW5kZXJUYWJsZUNvbCogY29sRWx0ID0gdGFibGUoKS0+Y29s
RWxlbWVudChjb2woKStjb2xTcGFuKCkgLSAxKTsKLSAgICBpZiAoY29sRWx0KSB7Ci0gICAgICAg
IHJlc3VsdCA9IGNvbXBhcmVCb3JkZXJzKHJlc3VsdCwgQ29sbGFwc2VkQm9yZGVyVmFsdWUoJmNv
bEVsdC0+c3R5bGUoKS0+Ym9yZGVyUmlnaHQoKSwgQkNPTCkpOwotICAgICAgICBpZiAoIXJlc3Vs
dC5leGlzdHMoKSkKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIAotICAg
IC8vICg2KSBUaGUgbmV4dCBjb2x1bW4ncyBsZWZ0IGJvcmRlci4KLSAgICBpZiAoIWluTGFzdENv
bHVtbikgewotICAgICAgICBjb2xFbHQgPSB0YWJsZUVsdC0+Y29sRWxlbWVudChjb2woKStjb2xT
cGFuKCkpOwotICAgICAgICBpZiAoY29sRWx0KSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBjb21w
YXJlQm9yZGVycyhyZXN1bHQsIENvbGxhcHNlZEJvcmRlclZhbHVlKCZjb2xFbHQtPnN0eWxlKCkt
PmJvcmRlckxlZnQoKSwgQkNPTCkpOwotICAgICAgICAgICAgaWYgKCFyZXN1bHQuZXhpc3RzKCkp
Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgIH0KLSAgICBl
bHNlIHsKLSAgICAgICAgLy8gKDcpIFRoZSB0YWJsZSdzIHJpZ2h0IGJvcmRlci4KLSAgICAgICAg
cmVzdWx0ID0gY29tcGFyZUJvcmRlcnMocmVzdWx0LCBDb2xsYXBzZWRCb3JkZXJWYWx1ZSgmdGFi
bGVFbHQtPnN0eWxlKCktPmJvcmRlclJpZ2h0KCksIEJUQUJMRSkpOwotICAgICAgICBpZiAoIXJl
c3VsdC5leGlzdHMoKSkKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIAot
ICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLUNvbGxhcHNlZEJvcmRlclZhbHVlIFJlbmRlclRhYmxl
Q2VsbDo6Y29sbGFwc2VkVG9wQm9yZGVyKCkgY29uc3QKLXsKLSAgICAvLyBGb3IgYm9yZGVyIHRv
cCwgd2UgbmVlZCB0byBjaGVjaywgaW4gb3JkZXIgb2YgcHJlY2VkZW5jZToKLSAgICAvLyAoMSkg
T3VyIHRvcCBib3JkZXIuCi0gICAgQ29sbGFwc2VkQm9yZGVyVmFsdWUgcmVzdWx0ID0gQ29sbGFw
c2VkQm9yZGVyVmFsdWUoJnN0eWxlKCktPmJvcmRlclRvcCgpLCBCQ0VMTCk7Ci0gICAgCi0gICAg
UmVuZGVyVGFibGVDZWxsKiBwcmV2Q2VsbCA9IHRhYmxlKCktPmNlbGxBYm92ZSh0aGlzKTsKLSAg
ICBpZiAocHJldkNlbGwpIHsKLSAgICAgICAgLy8gKDIpIEEgcHJldmlvdXMgY2VsbCdzIGJvdHRv
bSBib3JkZXIuCi0gICAgICAgIHJlc3VsdCA9IGNvbXBhcmVCb3JkZXJzKHJlc3VsdCwgQ29sbGFw
c2VkQm9yZGVyVmFsdWUoJnByZXZDZWxsLT5zdHlsZSgpLT5ib3JkZXJCb3R0b20oKSwgQkNFTEwp
KTsKLSAgICAgICAgaWYgKCFyZXN1bHQuZXhpc3RzKCkpIAotICAgICAgICAgICAgcmV0dXJuIHJl
c3VsdDsKLSAgICB9Ci0gICAgCi0gICAgLy8gKDMpIE91ciByb3cncyB0b3AgYm9yZGVyLgotICAg
IHJlc3VsdCA9IGNvbXBhcmVCb3JkZXJzKHJlc3VsdCwgQ29sbGFwc2VkQm9yZGVyVmFsdWUoJnBh
cmVudCgpLT5zdHlsZSgpLT5ib3JkZXJUb3AoKSwgQlJPVykpOwotICAgIGlmICghcmVzdWx0LmV4
aXN0cygpKQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIAotICAgIC8vICg0KSBUaGUgcHJl
dmlvdXMgcm93J3MgYm90dG9tIGJvcmRlci4KLSAgICBpZiAocHJldkNlbGwpIHsKLSAgICAgICAg
UmVuZGVyT2JqZWN0KiBwcmV2Um93ID0gMDsKLSAgICAgICAgaWYgKHByZXZDZWxsLT5zZWN0aW9u
KCkgPT0gc2VjdGlvbigpKQotICAgICAgICAgICAgcHJldlJvdyA9IHBhcmVudCgpLT5wcmV2aW91
c1NpYmxpbmcoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcHJldlJvdyA9IHByZXZDZWxs
LT5zZWN0aW9uKCktPmxhc3RDaGlsZCgpOwotICAgIAotICAgICAgICBpZiAocHJldlJvdykgewot
ICAgICAgICAgICAgcmVzdWx0ID0gY29tcGFyZUJvcmRlcnMocmVzdWx0LCBDb2xsYXBzZWRCb3Jk
ZXJWYWx1ZSgmcHJldlJvdy0+c3R5bGUoKS0+Ym9yZGVyQm90dG9tKCksIEJST1cpKTsKLSAgICAg
ICAgICAgIGlmICghcmVzdWx0LmV4aXN0cygpKQotICAgICAgICAgICAgICAgIHJldHVybiByZXN1
bHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLy8gTm93IGNoZWNrIHJvdyBncm91cHMu
Ci0gICAgUmVuZGVyT2JqZWN0KiBjdXJyU2VjdGlvbiA9IHBhcmVudCgpLT5wYXJlbnQoKTsKLSAg
ICBpZiAocm93KCkgPT0gMCkgewotICAgICAgICAvLyAoNSkgT3VyIHJvdyBncm91cCdzIHRvcCBi
b3JkZXIuCi0gICAgICAgIHJlc3VsdCA9IGNvbXBhcmVCb3JkZXJzKHJlc3VsdCwgQ29sbGFwc2Vk
Qm9yZGVyVmFsdWUoJmN1cnJTZWN0aW9uLT5zdHlsZSgpLT5ib3JkZXJUb3AoKSwgQlJPV0dST1VQ
KSk7Ci0gICAgICAgIGlmICghcmVzdWx0LmV4aXN0cygpKQotICAgICAgICAgICAgcmV0dXJuIHJl
c3VsdDsKLSAgICAgICAgCi0gICAgICAgIC8vICg2KSBQcmV2aW91cyByb3cgZ3JvdXAncyBib3R0
b20gYm9yZGVyLgotICAgICAgICBmb3IgKGN1cnJTZWN0aW9uID0gY3VyclNlY3Rpb24tPnByZXZp
b3VzU2libGluZygpOyBjdXJyU2VjdGlvbjsKLSAgICAgICAgICAgICBjdXJyU2VjdGlvbiA9IGN1
cnJTZWN0aW9uLT5wcmV2aW91c1NpYmxpbmcoKSkgewotICAgICAgICAgICAgaWYgKGN1cnJTZWN0
aW9uLT5pc1RhYmxlU2VjdGlvbigpKSB7Ci0gICAgICAgICAgICAgICAgUmVuZGVyVGFibGVTZWN0
aW9uKiBzZWN0aW9uID0gc3RhdGljX2Nhc3Q8UmVuZGVyVGFibGVTZWN0aW9uKj4oY3VyclNlY3Rp
b24pOwotICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNvbXBhcmVCb3JkZXJzKHJlc3VsdCwgQ29s
bGFwc2VkQm9yZGVyVmFsdWUoJnNlY3Rpb24tPnN0eWxlKCktPmJvcmRlckJvdHRvbSgpLCBCUk9X
R1JPVVApKTsKLSAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdC5leGlzdHMoKSkKLSAgICAgICAg
ICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAg
IH0KLSAgICAKLSAgICBpZiAoIWN1cnJTZWN0aW9uKSB7Ci0gICAgICAgIC8vICg4KSBPdXIgY29s
dW1uJ3MgdG9wIGJvcmRlci4KLSAgICAgICAgUmVuZGVyVGFibGVDb2wqIGNvbEVsdCA9IHRhYmxl
KCktPmNvbEVsZW1lbnQoY29sKCkpOwotICAgICAgICBpZiAoY29sRWx0KSB7Ci0gICAgICAgICAg
ICByZXN1bHQgPSBjb21wYXJlQm9yZGVycyhyZXN1bHQsIENvbGxhcHNlZEJvcmRlclZhbHVlKCZj
b2xFbHQtPnN0eWxlKCktPmJvcmRlclRvcCgpLCBCQ09MKSk7Ci0gICAgICAgICAgICBpZiAoIXJl
c3VsdC5leGlzdHMoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9
Ci0gICAgICAgIAotICAgICAgICAvLyAoOSkgVGhlIHRhYmxlJ3MgdG9wIGJvcmRlci4KLSAgICAg
ICAgcmVzdWx0ID0gY29tcGFyZUJvcmRlcnMocmVzdWx0LCBDb2xsYXBzZWRCb3JkZXJWYWx1ZSgm
dGFibGUoKS0+c3R5bGUoKS0+Ym9yZGVyVG9wKCksIEJUQUJMRSkpOwotICAgICAgICBpZiAoIXJl
c3VsdC5leGlzdHMoKSkKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIAot
ICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLUNvbGxhcHNlZEJvcmRlclZhbHVlIFJlbmRlclRhYmxl
Q2VsbDo6Y29sbGFwc2VkQm90dG9tQm9yZGVyKCkgY29uc3QKLXsKLSAgICAvLyBGb3IgYm9yZGVy
IHRvcCwgd2UgbmVlZCB0byBjaGVjaywgaW4gb3JkZXIgb2YgcHJlY2VkZW5jZToKLSAgICAvLyAo
MSkgT3VyIGJvdHRvbSBib3JkZXIuCi0gICAgQ29sbGFwc2VkQm9yZGVyVmFsdWUgcmVzdWx0ID0g
Q29sbGFwc2VkQm9yZGVyVmFsdWUoJnN0eWxlKCktPmJvcmRlckJvdHRvbSgpLCBCQ0VMTCk7Ci0g
ICAgCi0gICAgUmVuZGVyVGFibGVDZWxsKiBuZXh0Q2VsbCA9IHRhYmxlKCktPmNlbGxCZWxvdyh0
aGlzKTsKLSAgICBpZiAobmV4dENlbGwpIHsKLSAgICAgICAgLy8gKDIpIEEgZm9sbG93aW5nIGNl
bGwncyB0b3AgYm9yZGVyLgotICAgICAgICByZXN1bHQgPSBjb21wYXJlQm9yZGVycyhyZXN1bHQs
IENvbGxhcHNlZEJvcmRlclZhbHVlKCZuZXh0Q2VsbC0+c3R5bGUoKS0+Ym9yZGVyVG9wKCksIEJD
RUxMKSk7Ci0gICAgICAgIGlmICghcmVzdWx0LmV4aXN0cygpKQotICAgICAgICAgICAgcmV0dXJu
IHJlc3VsdDsKLSAgICB9Ci0gICAgCi0gICAgLy8gKDMpIE91ciByb3cncyBib3R0b20gYm9yZGVy
LiAoRklYTUU6IERlYWwgd2l0aCByb3dzcGFuISkKLSAgICByZXN1bHQgPSBjb21wYXJlQm9yZGVy
cyhyZXN1bHQsIENvbGxhcHNlZEJvcmRlclZhbHVlKCZwYXJlbnQoKS0+c3R5bGUoKS0+Ym9yZGVy
Qm90dG9tKCksIEJST1cpKTsKLSAgICBpZiAoIXJlc3VsdC5leGlzdHMoKSkKLSAgICAgICAgcmV0
dXJuIHJlc3VsdDsKLSAgICAKLSAgICAvLyAoNCkgVGhlIG5leHQgcm93J3MgdG9wIGJvcmRlci4K
LSAgICBpZiAobmV4dENlbGwpIHsKLSAgICAgICAgcmVzdWx0ID0gY29tcGFyZUJvcmRlcnMocmVz
dWx0LCBDb2xsYXBzZWRCb3JkZXJWYWx1ZSgmbmV4dENlbGwtPnBhcmVudCgpLT5zdHlsZSgpLT5i
b3JkZXJUb3AoKSwgQlJPVykpOwotICAgICAgICBpZiAoIXJlc3VsdC5leGlzdHMoKSkKLSAgICAg
ICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIAotICAgIC8vIE5vdyBjaGVjayByb3cg
Z3JvdXBzLgotICAgIFJlbmRlck9iamVjdCogY3VyclNlY3Rpb24gPSBwYXJlbnQoKS0+cGFyZW50
KCk7Ci0gICAgaWYgKHJvdygpICsgcm93U3BhbigpID49IHN0YXRpY19jYXN0PFJlbmRlclRhYmxl
U2VjdGlvbio+KGN1cnJTZWN0aW9uKS0+bnVtUm93cygpKSB7Ci0gICAgICAgIC8vICg1KSBPdXIg
cm93IGdyb3VwJ3MgYm90dG9tIGJvcmRlci4KLSAgICAgICAgcmVzdWx0ID0gY29tcGFyZUJvcmRl
cnMocmVzdWx0LCBDb2xsYXBzZWRCb3JkZXJWYWx1ZSgmY3VyclNlY3Rpb24tPnN0eWxlKCktPmJv
cmRlckJvdHRvbSgpLCBCUk9XR1JPVVApKTsKLSAgICAgICAgaWYgKCFyZXN1bHQuZXhpc3RzKCkp
Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAKLSAgICAgICAgLy8gKDYpIEZv
bGxvd2luZyByb3cgZ3JvdXAncyB0b3AgYm9yZGVyLgotICAgICAgICBmb3IgKGN1cnJTZWN0aW9u
ID0gY3VyclNlY3Rpb24tPm5leHRTaWJsaW5nKCk7IGN1cnJTZWN0aW9uOwotICAgICAgICAgICAg
IGN1cnJTZWN0aW9uID0gY3VyclNlY3Rpb24tPm5leHRTaWJsaW5nKCkpIHsKLSAgICAgICAgICAg
IGlmIChjdXJyU2VjdGlvbi0+aXNUYWJsZVNlY3Rpb24oKSkgewotICAgICAgICAgICAgICAgIFJl
bmRlclRhYmxlU2VjdGlvbiogc2VjdGlvbiA9IHN0YXRpY19jYXN0PFJlbmRlclRhYmxlU2VjdGlv
bio+KGN1cnJTZWN0aW9uKTsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBjb21wYXJlQm9yZGVy
cyhyZXN1bHQsIENvbGxhcHNlZEJvcmRlclZhbHVlKCZzZWN0aW9uLT5zdHlsZSgpLT5ib3JkZXJU
b3AoKSwgQlJPV0dST1VQKSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQuZXhpc3RzKCkp
Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAg
ICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaWYgKCFjdXJyU2VjdGlvbikgewotICAgICAgICAvLyAo
OCkgT3VyIGNvbHVtbidzIGJvdHRvbSBib3JkZXIuCi0gICAgICAgIFJlbmRlclRhYmxlQ29sKiBj
b2xFbHQgPSB0YWJsZSgpLT5jb2xFbGVtZW50KGNvbCgpKTsKLSAgICAgICAgaWYgKGNvbEVsdCkg
ewotICAgICAgICAgICAgcmVzdWx0ID0gY29tcGFyZUJvcmRlcnMocmVzdWx0LCBDb2xsYXBzZWRC
b3JkZXJWYWx1ZSgmY29sRWx0LT5zdHlsZSgpLT5ib3JkZXJCb3R0b20oKSwgQkNPTCkpOwotICAg
ICAgICAgICAgaWYgKCFyZXN1bHQuZXhpc3RzKCkpIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0K
LSAgICAgICAgCi0gICAgICAgIC8vICg5KSBUaGUgdGFibGUncyBib3R0b20gYm9yZGVyLgotICAg
ICAgICByZXN1bHQgPSBjb21wYXJlQm9yZGVycyhyZXN1bHQsIENvbGxhcHNlZEJvcmRlclZhbHVl
KCZ0YWJsZSgpLT5zdHlsZSgpLT5ib3JkZXJCb3R0b20oKSwgQlRBQkxFKSk7Ci0gICAgICAgIGlm
ICghcmVzdWx0LmV4aXN0cygpKQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0g
ICAgCi0gICAgcmV0dXJuIHJlc3VsdDsgICAgCi19Ci0KLWludCBSZW5kZXJUYWJsZUNlbGw6OmJv
cmRlckxlZnQoKSBjb25zdAotewotICAgIGlmICh0YWJsZSgpLT5jb2xsYXBzZUJvcmRlcnMoKSkg
ewotICAgICAgICBDb2xsYXBzZWRCb3JkZXJWYWx1ZSBib3JkZXIgPSBjb2xsYXBzZWRMZWZ0Qm9y
ZGVyKCk7Ci0gICAgICAgIGlmIChib3JkZXIuZXhpc3RzKCkpCi0gICAgICAgICAgICByZXR1cm4g
aW50KGJvcmRlci53aWR0aCgpIC8gMi4wICsgMC41KTsgLy8gR2l2ZSB0aGUgZXh0cmEgcGl4ZWwg
dG8gdG9wIGFuZCBsZWZ0LgotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIFJl
bmRlckJsb2NrOjpib3JkZXJMZWZ0KCk7Ci19Ci0gICAgCi1pbnQgUmVuZGVyVGFibGVDZWxsOjpi
b3JkZXJSaWdodCgpIGNvbnN0Ci17Ci0gICAgaWYgKHRhYmxlKCktPmNvbGxhcHNlQm9yZGVycygp
KSB7Ci0gICAgICAgIENvbGxhcHNlZEJvcmRlclZhbHVlIGJvcmRlciA9IGNvbGxhcHNlZFJpZ2h0
Qm9yZGVyKCk7Ci0gICAgICAgIGlmIChib3JkZXIuZXhpc3RzKCkpCi0gICAgICAgICAgICByZXR1
cm4gYm9yZGVyLndpZHRoKCkgLyAyOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0
dXJuIFJlbmRlckJsb2NrOjpib3JkZXJSaWdodCgpOwotfQotCi1pbnQgUmVuZGVyVGFibGVDZWxs
Ojpib3JkZXJUb3AoKSBjb25zdAotewotICAgIGlmICh0YWJsZSgpLT5jb2xsYXBzZUJvcmRlcnMo
KSkgewotICAgICAgICBDb2xsYXBzZWRCb3JkZXJWYWx1ZSBib3JkZXIgPSBjb2xsYXBzZWRUb3BC
b3JkZXIoKTsKLSAgICAgICAgaWYgKGJvcmRlci5leGlzdHMoKSkKLSAgICAgICAgICAgIHJldHVy
biBpbnQoYm9yZGVyLndpZHRoKCkgLyAyLjAgKyAwLjUpOyAvLyBHaXZlIHRoZSBleHRyYSBwaXhl
bCB0byB0b3AgYW5kIGxlZnQuCi0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4g
UmVuZGVyQmxvY2s6OmJvcmRlclRvcCgpOwotfQotCi1pbnQgUmVuZGVyVGFibGVDZWxsOjpib3Jk
ZXJCb3R0b20oKSBjb25zdAotewotICAgIGlmICh0YWJsZSgpLT5jb2xsYXBzZUJvcmRlcnMoKSkg
ewotICAgICAgICBDb2xsYXBzZWRCb3JkZXJWYWx1ZSBib3JkZXIgPSBjb2xsYXBzZWRCb3R0b21C
b3JkZXIoKTsKLSAgICAgICAgaWYgKGJvcmRlci5leGlzdHMoKSkKLSAgICAgICAgICAgIHJldHVy
biBib3JkZXIud2lkdGgoKSAvIDI7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1
cm4gUmVuZGVyQmxvY2s6OmJvcmRlckJvdHRvbSgpOwotfQotCi0jaWZkZWYgQk9YX0RFQlVHCi0j
aW5jbHVkZSA8cXBhaW50ZXIuaD4KLQotc3RhdGljIHZvaWQgb3V0bGluZUJveChRUGFpbnRlciAq
cCwgaW50IF90eCwgaW50IF90eSwgaW50IHcsIGludCBoKQotewotICAgIHAtPnNldFBlbihRUGVu
KFFDb2xvcigieWVsbG93IiksIDMsIFF0OjpEb3RMaW5lKSk7Ci0gICAgcC0+c2V0QnJ1c2goUXQ6
Ok5vQnJ1c2gpOwotICAgIHAtPmRyYXdSZWN0KF90eCwgX3R5LCB3LCBoKTsKLX0KLSNlbmRpZgot
Ci12b2lkIFJlbmRlclRhYmxlQ2VsbDo6cGFpbnQoUGFpbnRJbmZvJiBpLCBpbnQgX3R4LCBpbnQg
X3R5KQotewotICAgIF90eCArPSBtX3g7Ci0gICAgX3R5ICs9IG1feTsKLQotICAgIC8vIGNoZWNr
IGlmIHdlIG5lZWQgdG8gZG8gYW55dGhpbmcgYXQgYWxsLi4uCi0gICAgaW50IG9zID0gMiptYXhp
bWFsT3V0bGluZVNpemUoaS5waGFzZSk7Ci0gICAgaWYgKChfdHkgPj0gaS5yLnkoKSArIGkuci5o
ZWlnaHQoKSArIG9zKSB8fCAoX3R5ICsgX3RvcEV4dHJhICsgbV9oZWlnaHQgKyBfYm90dG9tRXh0
cmEgPD0gaS5yLnkoKSAtIG9zKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYgKGkucGhhc2Ug
PT0gUGFpbnRBY3Rpb25Db2xsYXBzZWRUYWJsZUJvcmRlcnMgJiYgc3R5bGUoKS0+dmlzaWJpbGl0
eSgpID09IFZJU0lCTEUpIHsKLSAgICAgICAgaW50IHcgPSB3aWR0aCgpOwotICAgICAgICBpbnQg
aCA9IGhlaWdodCgpICsgYm9yZGVyVG9wRXh0cmEoKSArIGJvcmRlckJvdHRvbUV4dHJhKCk7Ci0g
ICAgICAgIHBhaW50Q29sbGFwc2VkQm9yZGVyKGkucCwgX3R4LCBfdHksIHcsIGgpOwotICAgIH0K
LSAgICBlbHNlCi0gICAgICAgIFJlbmRlckJsb2NrOjpwYWludE9iamVjdChpLCBfdHgsIF90eSAr
IF90b3BFeHRyYSk7Ci0KLSNpZmRlZiBCT1hfREVCVUcKLSAgICA6Om91dGxpbmVCb3goIGkucCwg
X3R4LCBfdHksIHdpZHRoKCksIGhlaWdodCgpICsgYm9yZGVyVG9wRXh0cmEoKSArIGJvcmRlckJv
dHRvbUV4dHJhKCkpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBFQm9yZGVyU3R5bGUgY29sbGFwc2Vk
Qm9yZGVyU3R5bGUoRUJvcmRlclN0eWxlIHN0eWxlKQotewotICAgIGlmIChzdHlsZSA9PSBPVVRT
RVQpCi0gICAgICAgIHN0eWxlID0gR1JPT1ZFOwotICAgIGVsc2UgaWYgKHN0eWxlID09IElOU0VU
KQotICAgICAgICBzdHlsZSA9IFJJREdFOwotICAgIHJldHVybiBzdHlsZTsKLX0KLQotc3RydWN0
IENvbGxhcHNlZEJvcmRlciB7Ci0gICAgQ29sbGFwc2VkQm9yZGVyKCl7fQotICAgIAotICAgIENv
bGxhcHNlZEJvcmRlclZhbHVlIGJvcmRlcjsKLSAgICBSZW5kZXJPYmplY3Q6OkJvcmRlclNpZGUg
c2lkZTsKLSAgICBib29sIHNob3VsZFBhaW50OwotICAgIGludCB4MTsKLSAgICBpbnQgeTE7Ci0g
ICAgaW50IHgyOwotICAgIGludCB5MjsKLSAgICBFQm9yZGVyU3R5bGUgc3R5bGU7Ci19OwotCi1j
bGFzcyBDb2xsYXBzZWRCb3JkZXJzCi17Ci1wdWJsaWM6Ci0gICAgQ29sbGFwc2VkQm9yZGVycyhp
bnQgaSkgOmNvdW50KDApIHt9Ci0gICAgCi0gICAgdm9pZCBhZGRCb3JkZXIoY29uc3QgQ29sbGFw
c2VkQm9yZGVyVmFsdWUmIGIsIFJlbmRlck9iamVjdDo6Qm9yZGVyU2lkZSBzLCBib29sIHBhaW50
LCAKLSAgICAgICAgICAgICAgICAgICBpbnQgX3gxLCBpbnQgX3kxLCBpbnQgX3gyLCBpbnQgX3ky
LAotICAgICAgICAgICAgICAgICAgIEVCb3JkZXJTdHlsZSBfc3R5bGUpCi0gICAgewotICAgICAg
ICBpZiAoYi5leGlzdHMoKSAmJiBwYWludCkgewotICAgICAgICAgICAgYm9yZGVyc1tjb3VudF0u
Ym9yZGVyID0gYjsKLSAgICAgICAgICAgIGJvcmRlcnNbY291bnRdLnNpZGUgPSBzOwotICAgICAg
ICAgICAgYm9yZGVyc1tjb3VudF0uc2hvdWxkUGFpbnQgPSBwYWludDsKLSAgICAgICAgICAgIGJv
cmRlcnNbY291bnRdLngxID0gX3gxOwotICAgICAgICAgICAgYm9yZGVyc1tjb3VudF0ueDIgPSBf
eDI7Ci0gICAgICAgICAgICBib3JkZXJzW2NvdW50XS55MSA9IF95MTsKLSAgICAgICAgICAgIGJv
cmRlcnNbY291bnRdLnkyID0gX3kyOwotICAgICAgICAgICAgYm9yZGVyc1tjb3VudF0uc3R5bGUg
PSBfc3R5bGU7Ci0gICAgICAgICAgICBjb3VudCsrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAg
Q29sbGFwc2VkQm9yZGVyKiBuZXh0Qm9yZGVyKCkgewotICAgICAgICBmb3IgKGludCBpID0gMDsg
aSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIGlmIChib3JkZXJzW2ldLmJvcmRlci5leGlz
dHMoKSAmJiBib3JkZXJzW2ldLnNob3VsZFBhaW50KSB7Ci0gICAgICAgICAgICAgICAgYm9yZGVy
c1tpXS5zaG91bGRQYWludCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHJldHVybiAmYm9yZGVy
c1tpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJu
IDA7Ci0gICAgfQotICAgIAotICAgIENvbGxhcHNlZEJvcmRlciBib3JkZXJzWzRdOwotICAgIGlu
dCBjb3VudDsKLX07Ci0KLXN0YXRpYyB2b2lkIGFkZEJvcmRlclN0eWxlKFFWYWx1ZUxpc3Q8Q29s
bGFwc2VkQm9yZGVyVmFsdWU+JiBib3JkZXJTdHlsZXMsIENvbGxhcHNlZEJvcmRlclZhbHVlIGJv
cmRlclZhbHVlKQotewotICAgIGlmICghYm9yZGVyVmFsdWUuZXhpc3RzKCkgfHwgYm9yZGVyU3R5
bGVzLmNvbnRhaW5zKGJvcmRlclZhbHVlKSkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIFFW
YWx1ZUxpc3RJdGVyYXRvcjxDb2xsYXBzZWRCb3JkZXJWYWx1ZT4gaXQgPSBib3JkZXJTdHlsZXMu
YmVnaW4oKTsKLSAgICBRVmFsdWVMaXN0SXRlcmF0b3I8Q29sbGFwc2VkQm9yZGVyVmFsdWU+IGVu
ZCA9IGJvcmRlclN0eWxlcy5lbmQoKTsKLSAgICBmb3IgKDsgaXQgIT0gZW5kOyArK2l0KSB7Ci0g
ICAgICAgIENvbGxhcHNlZEJvcmRlclZhbHVlIHJlc3VsdCA9IGNvbXBhcmVCb3JkZXJzKCppdCwg
Ym9yZGVyVmFsdWUpOwotICAgICAgICBpZiAocmVzdWx0ID09ICppdCkgewotICAgICAgICAgICAg
Ym9yZGVyU3R5bGVzLmluc2VydChpdCwgYm9yZGVyVmFsdWUpOwotICAgICAgICAgICAgcmV0dXJu
OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgYm9yZGVyU3R5bGVzLmFwcGVuZChib3JkZXJWYWx1
ZSk7Ci19Ci0KLXZvaWQgUmVuZGVyVGFibGVDZWxsOjpjb2xsZWN0Qm9yZGVycyhRVmFsdWVMaXN0
PENvbGxhcHNlZEJvcmRlclZhbHVlPiYgYm9yZGVyU3R5bGVzKQotewotICAgIGFkZEJvcmRlclN0
eWxlKGJvcmRlclN0eWxlcywgY29sbGFwc2VkTGVmdEJvcmRlcigpKTsKLSAgICBhZGRCb3JkZXJT
dHlsZShib3JkZXJTdHlsZXMsIGNvbGxhcHNlZFJpZ2h0Qm9yZGVyKCkpOwotICAgIGFkZEJvcmRl
clN0eWxlKGJvcmRlclN0eWxlcywgY29sbGFwc2VkVG9wQm9yZGVyKCkpOwotICAgIGFkZEJvcmRl
clN0eWxlKGJvcmRlclN0eWxlcywgY29sbGFwc2VkQm90dG9tQm9yZGVyKCkpOwotfQotCi12b2lk
IFJlbmRlclRhYmxlQ2VsbDo6cGFpbnRDb2xsYXBzZWRCb3JkZXIoUVBhaW50ZXIqIHAsIGludCBf
dHgsIGludCBfdHksIGludCB3LCBpbnQgaCkKLXsKLSAgICBpZiAoIXRhYmxlKCktPmN1cnJlbnRC
b3JkZXJTdHlsZSgpKQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgQ29sbGFwc2VkQm9yZGVy
VmFsdWUgbGVmdFZhbCA9IGNvbGxhcHNlZExlZnRCb3JkZXIoKTsKLSAgICBDb2xsYXBzZWRCb3Jk
ZXJWYWx1ZSByaWdodFZhbCA9IGNvbGxhcHNlZFJpZ2h0Qm9yZGVyKCk7Ci0gICAgQ29sbGFwc2Vk
Qm9yZGVyVmFsdWUgdG9wVmFsID0gY29sbGFwc2VkVG9wQm9yZGVyKCk7Ci0gICAgQ29sbGFwc2Vk
Qm9yZGVyVmFsdWUgYm90dG9tVmFsID0gY29sbGFwc2VkQm90dG9tQm9yZGVyKCk7Ci0gICAgIAot
ICAgIC8vIEFkanVzdCBvdXIgeC95L3dpZHRoL2hlaWdodCBzbyB0aGF0IHdlIHBhaW50IHRoZSBj
b2xsYXBzZWQgYm9yZGVycyBhdCB0aGUgY29ycmVjdCBsb2NhdGlvbi4KLSAgICBpbnQgdG9wV2lk
dGggPSB0b3BWYWwud2lkdGgoKTsKLSAgICBpbnQgYm90dG9tV2lkdGggPSBib3R0b21WYWwud2lk
dGgoKTsKLSAgICBpbnQgbGVmdFdpZHRoID0gbGVmdFZhbC53aWR0aCgpOwotICAgIGludCByaWdo
dFdpZHRoID0gcmlnaHRWYWwud2lkdGgoKTsKLSAgICAKLSAgICBfdHggLT0gbGVmdFdpZHRoIC8g
MjsKLSAgICBfdHkgLT0gdG9wV2lkdGggLyAyOwotICAgIHcgKz0gbGVmdFdpZHRoIC8gMiArIGlu
dChyaWdodFdpZHRoIC8gMi4wICsgMC41KTsKLSAgICBoICs9IHRvcFdpZHRoIC8gMiArIGludChi
b3R0b21XaWR0aCAvIDIuMCArIDAuNSk7Ci0gICAgCi0gICAgYm9vbCB0dCA9IHRvcFZhbC5pc1Ry
YW5zcGFyZW50KCk7Ci0gICAgYm9vbCBidCA9IGJvdHRvbVZhbC5pc1RyYW5zcGFyZW50KCk7Ci0g
ICAgYm9vbCBydCA9IHJpZ2h0VmFsLmlzVHJhbnNwYXJlbnQoKTsKLSAgICBib29sIGx0ID0gbGVm
dFZhbC5pc1RyYW5zcGFyZW50KCk7Ci0gICAgCi0gICAgRUJvcmRlclN0eWxlIHRzID0gY29sbGFw
c2VkQm9yZGVyU3R5bGUodG9wVmFsLnN0eWxlKCkpOwotICAgIEVCb3JkZXJTdHlsZSBicyA9IGNv
bGxhcHNlZEJvcmRlclN0eWxlKGJvdHRvbVZhbC5zdHlsZSgpKTsKLSAgICBFQm9yZGVyU3R5bGUg
bHMgPSBjb2xsYXBzZWRCb3JkZXJTdHlsZShsZWZ0VmFsLnN0eWxlKCkpOwotICAgIEVCb3JkZXJT
dHlsZSBycyA9IGNvbGxhcHNlZEJvcmRlclN0eWxlKHJpZ2h0VmFsLnN0eWxlKCkpOwotICAgIAot
ICAgIGJvb2wgcmVuZGVyX3QgPSB0cyA+IEJISURERU4gJiYgIXR0OwotICAgIGJvb2wgcmVuZGVy
X2wgPSBscyA+IEJISURERU4gJiYgIWx0OwotICAgIGJvb2wgcmVuZGVyX3IgPSBycyA+IEJISURE
RU4gJiYgIXJ0OwotICAgIGJvb2wgcmVuZGVyX2IgPSBicyA+IEJISURERU4gJiYgIWJ0OwotCi0g
ICAgLy8gV2UgbmV2ZXIgcGFpbnQgZGlhZ29uYWxzIGF0IHRoZSBqb2lucy4gIFdlIHNpbXBseSBs
ZXQgdGhlIGJvcmRlciB3aXRoIHRoZSBoaWdoZXN0Ci0gICAgLy8gcHJlY2VkZW5jZSBwYWludCBv
biB0b3Agb2YgYm9yZGVycyB3aXRoIGxvd2VyIHByZWNlZGVuY2UuICAKLSAgICBDb2xsYXBzZWRC
b3JkZXJzIGJvcmRlcnMoNCk7Ci0gICAgYm9yZGVycy5hZGRCb3JkZXIodG9wVmFsLCBCU1RvcCwg
cmVuZGVyX3QsIF90eCwgX3R5LCBfdHggKyB3LCBfdHkgKyB0b3BXaWR0aCwgdHMpOwotICAgIGJv
cmRlcnMuYWRkQm9yZGVyKGJvdHRvbVZhbCwgQlNCb3R0b20sIHJlbmRlcl9iLCBfdHgsIF90eSAr
IGggLSBib3R0b21XaWR0aCwgX3R4ICsgdywgX3R5ICsgaCwgYnMpOwotICAgIGJvcmRlcnMuYWRk
Qm9yZGVyKGxlZnRWYWwsIEJTTGVmdCwgcmVuZGVyX2wsIF90eCwgX3R5LCBfdHggKyBsZWZ0V2lk
dGgsIF90eSArIGgsIGxzKTsKLSAgICBib3JkZXJzLmFkZEJvcmRlcihyaWdodFZhbCwgQlNSaWdo
dCwgcmVuZGVyX3IsIF90eCArIHcgLSByaWdodFdpZHRoLCBfdHksIF90eCArIHcsIF90eSArIGgs
IHJzKTsKLSAgICAKLSAgICBmb3IgKENvbGxhcHNlZEJvcmRlciogYm9yZGVyID0gYm9yZGVycy5u
ZXh0Qm9yZGVyKCk7IGJvcmRlcjsgYm9yZGVyID0gYm9yZGVycy5uZXh0Qm9yZGVyKCkpIHsKLSAg
ICAgICAgaWYgKGJvcmRlci0+Ym9yZGVyID09ICp0YWJsZSgpLT5jdXJyZW50Qm9yZGVyU3R5bGUo
KSkKLSAgICAgICAgICAgIGRyYXdCb3JkZXIocCwgYm9yZGVyLT54MSwgYm9yZGVyLT55MSwgYm9y
ZGVyLT54MiwgYm9yZGVyLT55MiwgYm9yZGVyLT5zaWRlLCAKLSAgICAgICAgICAgICAgICAgICAg
ICAgYm9yZGVyLT5ib3JkZXIuY29sb3IoKSwgc3R5bGUoKS0+Y29sb3IoKSwgYm9yZGVyLT5zdHls
ZSwgMCwgMCk7Ci0gICAgfQotfQotCi1JbnRSZWN0IFJlbmRlclRhYmxlQ2VsbDo6Z2V0QWJzb2x1
dGVSZXBhaW50UmVjdCgpCi17Ci0gICAgaW50IG93ID0gc3R5bGUoKSA/IHN0eWxlKCktPm91dGxp
bmVTaXplKCkgOiAwOwotICAgIEludFJlY3Qgcigtb3csIC1vdyAtIGJvcmRlclRvcEV4dHJhKCks
IAotICAgICAgICAgICAgb3ZlcmZsb3dXaWR0aChmYWxzZSkgKyBvdyAqIDIsIG92ZXJmbG93SGVp
Z2h0KGZhbHNlKSArIGJvcmRlclRvcEV4dHJhKCkgKyBib3JkZXJCb3R0b21FeHRyYSgpICsgb3cg
KiAyKTsKLSAgICBjb21wdXRlQWJzb2x1dGVSZXBhaW50UmVjdChyKTsKLSAgICByZXR1cm4gcjsK
LX0KLQotdm9pZCBSZW5kZXJUYWJsZUNlbGw6OnBhaW50Qm94RGVjb3JhdGlvbnMoUGFpbnRJbmZv
JiBpLCBpbnQgX3R4LCBpbnQgX3R5KQotewotICAgIFJlbmRlclRhYmxlKiB0YWJsZUVsdCA9IHRh
YmxlKCk7Ci0gICAgaWYgKCF0YWJsZUVsdC0+Y29sbGFwc2VCb3JkZXJzKCkgJiYgc3R5bGUoKS0+
ZW1wdHlDZWxscygpID09IEhJREUgJiYgIWZpcnN0Q2hpbGQoKSkKLSAgICAgICAgcmV0dXJuOwot
ICAgIAotICAgIGludCB3ID0gd2lkdGgoKTsKLSAgICBpbnQgaCA9IGhlaWdodCgpICsgYm9yZGVy
VG9wRXh0cmEoKSArIGJvcmRlckJvdHRvbUV4dHJhKCk7Ci0gICAgX3R5IC09IGJvcmRlclRvcEV4
dHJhKCk7Ci0KLSAgICBRQ29sb3IgYyA9IHN0eWxlKCktPmJhY2tncm91bmRDb2xvcigpOwotICAg
IGlmICghYy5pc1ZhbGlkKCkgJiYgcGFyZW50KCkpIC8vIHRha2UgZnJvbSByb3cKLSAgICAgICAg
YyA9IHBhcmVudCgpLT5zdHlsZSgpLT5iYWNrZ3JvdW5kQ29sb3IoKTsKLSAgICBpZiAoIWMuaXNW
YWxpZCgpICYmIHBhcmVudCgpICYmIHBhcmVudCgpLT5wYXJlbnQoKSkgLy8gdGFrZSBmcm9tIHJv
d2dyb3VwCi0gICAgICAgIGMgPSBwYXJlbnQoKS0+cGFyZW50KCktPnN0eWxlKCktPmJhY2tncm91
bmRDb2xvcigpOwotICAgIGlmICghYy5pc1ZhbGlkKCkpIHsKLQkvLyBzZWUgaWYgd2UgaGF2ZSBh
IGNvbCBvciBjb2xncm91cCBmb3IgdGhpcwotCVJlbmRlclRhYmxlQ29sICpjb2wgPSB0YWJsZSgp
LT5jb2xFbGVtZW50KF9jb2wpOwotCWlmIChjb2wpIHsKLQkgICAgYyA9IGNvbC0+c3R5bGUoKS0+
YmFja2dyb3VuZENvbG9yKCk7Ci0JICAgIGlmICghYy5pc1ZhbGlkKCkpIHsKLQkJLy8gdHJ5IGNv
bHVtbiBncm91cAotCQlSZW5kZXJTdHlsZSAqc3R5bGUgPSBjb2wtPnBhcmVudCgpLT5zdHlsZSgp
OwotCQlpZiAoc3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRV9DT0xVTU5fR1JPVVApCi0JCSAgICBj
ID0gc3R5bGUtPmJhY2tncm91bmRDb2xvcigpOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAgIC8v
IEZJWE1FOiBUaGlzIGNvZGUgaXMganVzdCBwbGFpbiB3cm9uZy4gIFJvd3MgYW5kIGNvbHVtbnMg
c2hvdWxkIHBhaW50IHRoZWlyIGJhY2tncm91bmRzCi0gICAgLy8gaW5kZXBlbmRlbnQgZnJvbSB0
aGUgY2VsbC4KLSAgICAvLyAjIyMgZ2V0IG9mZnNldHMgcmlnaHQgaW4gY2FzZSB0aGUgYmdpbWFn
ZSBpcyBpbmhlcml0ZWQuCi0gICAgY29uc3QgQmFja2dyb3VuZExheWVyKiBiZ0xheWVyID0gc3R5
bGUoKS0+YmFja2dyb3VuZExheWVycygpOwotICAgIGlmICghYmdMYXllci0+aGFzSW1hZ2UoKSAm
JiBwYXJlbnQoKSkKLSAgICAgICAgYmdMYXllciA9IHBhcmVudCgpLT5zdHlsZSgpLT5iYWNrZ3Jv
dW5kTGF5ZXJzKCk7Ci0gICAgaWYgKCFiZ0xheWVyLT5oYXNJbWFnZSgpICYmIHBhcmVudCgpICYm
IHBhcmVudCgpLT5wYXJlbnQoKSkKLSAgICAgICAgYmdMYXllciA9IHBhcmVudCgpLT5wYXJlbnQo
KS0+c3R5bGUoKS0+YmFja2dyb3VuZExheWVycygpOwotICAgIGlmICghYmdMYXllci0+aGFzSW1h
Z2UoKSkgewotCS8vIHNlZSBpZiB3ZSBoYXZlIGEgY29sIG9yIGNvbGdyb3VwIGZvciB0aGlzCi0J
UmVuZGVyVGFibGVDb2wqIGNvbCA9IHRhYmxlKCktPmNvbEVsZW1lbnQoX2NvbCk7Ci0JaWYgKGNv
bCkgewotCSAgICBiZ0xheWVyID0gY29sLT5zdHlsZSgpLT5iYWNrZ3JvdW5kTGF5ZXJzKCk7Ci0J
ICAgIGlmICghYmdMYXllci0+aGFzSW1hZ2UoKSkgewotCQkvLyB0cnkgY29sdW1uIGdyb3VwCi0J
CVJlbmRlclN0eWxlICpzdHlsZSA9IGNvbC0+cGFyZW50KCktPnN0eWxlKCk7Ci0JCWlmIChzdHls
ZS0+ZGlzcGxheSgpID09IFRBQkxFX0NPTFVNTl9HUk9VUCkKLQkJICAgIGJnTGF5ZXIgPSBzdHls
ZS0+YmFja2dyb3VuZExheWVycygpOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAgIGludCBteSA9
IGtNYXgoX3R5LCBpLnIueSgpKTsKLSAgICBpbnQgZW5kID0ga01pbihpLnIueSgpICsgaS5yLmhl
aWdodCgpLCBfdHkgKyBoKTsKLSAgICBpbnQgbWggPSBlbmQgLSBteTsKLQotICAgIGlmIChiZ0xh
eWVyLT5oYXNJbWFnZSgpIHx8IGMuaXNWYWxpZCgpKSB7Ci0JLy8gV2UgaGF2ZSB0byBjbGlwIGhl
cmUgYmVjYXVzZSB0aGUgYmFja3JvdW5kIHdvdWxkIHBhaW50Ci0gICAgICAgIC8vIG9uIHRvcCBv
ZiB0aGUgYm9yZGVycyBvdGhlcndpc2UuCi0gICAgICAgIGlmIChtX2xheWVyICYmIHRhYmxlRWx0
LT5jb2xsYXBzZUJvcmRlcnMoKSkgewotICAgICAgICAgICAgSW50UmVjdCBjbGlwUmVjdChfdHgg
KyBib3JkZXJMZWZ0KCksIF90eSArIGJvcmRlclRvcCgpLCB3IC0gYm9yZGVyTGVmdCgpIC0gYm9y
ZGVyUmlnaHQoKSwgaCAtIGJvcmRlclRvcCgpIC0gYm9yZGVyQm90dG9tKCkpOwotICAgICAgICAg
ICAgY2xpcFJlY3QgPSBpLnAtPnhGb3JtKGNsaXBSZWN0KTsKLSAgICAgICAgICAgIGkucC0+c2F2
ZSgpOwotICAgICAgICAgICAgaS5wLT5hZGRDbGlwKGNsaXBSZWN0KTsKLSAgICAgICAgfQotICAg
ICAgICBwYWludEJhY2tncm91bmQoaS5wLCBjLCBiZ0xheWVyLCBteSwgbWgsIF90eCwgX3R5LCB3
LCBoKTsKLSAgICAgICAgaWYgKG1fbGF5ZXIgJiYgdGFibGVFbHQtPmNvbGxhcHNlQm9yZGVycygp
KQotICAgICAgICAgICAgaS5wLT5yZXN0b3JlKCk7Ci0gICAgfQotCi0gICAgaWYgKHN0eWxlKCkt
Pmhhc0JvcmRlcigpICYmICF0YWJsZUVsdC0+Y29sbGFwc2VCb3JkZXJzKCkpCi0gICAgICAgIHBh
aW50Qm9yZGVyKGkucCwgX3R4LCBfdHksIHcsIGgsIHN0eWxlKCkpOwotfQotCi0KLSNpZm5kZWYg
TkRFQlVHCi12b2lkIFJlbmRlclRhYmxlQ2VsbDo6ZHVtcChRVGV4dFN0cmVhbSAqc3RyZWFtLCBR
U3RyaW5nIGluZCkgY29uc3QKLXsKLSAgICAqc3RyZWFtIDw8ICIgcm93PSIgPDwgX3JvdzsKLSAg
ICAqc3RyZWFtIDw8ICIgY29sPSIgPDwgX2NvbDsKLSAgICAqc3RyZWFtIDw8ICIgclNwYW49IiA8
PCByU3BhbjsKLSAgICAqc3RyZWFtIDw8ICIgY1NwYW49IiA8PCBjU3BhbjsKLS8vICAgICpzdHJl
YW0gPDwgIiBuV3JhcD0iIDw8IG5XcmFwOwotCi0gICAgUmVuZGVyQmxvY2s6OmR1bXAoc3RyZWFt
LGluZCk7Ci19Ci0jZW5kaWYKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1SZW5kZXJUYWJsZUNv
bDo6UmVuZGVyVGFibGVDb2woRE9NOjpOb2RlSW1wbCogbm9kZSkKLSAgICA6IFJlbmRlckNvbnRh
aW5lcihub2RlKQotewotICAgIC8vIGluaXQgUmVuZGVyT2JqZWN0IGF0dHJpYnV0ZXMKLSAgICBz
ZXRJbmxpbmUodHJ1ZSk7ICAgLy8gb3VyIG9iamVjdCBpcyBub3QgSW5saW5lCi0KLSAgICBfc3Bh
biA9IDE7Ci0gICAgdXBkYXRlRnJvbUVsZW1lbnQoKTsKLX0KLQotdm9pZCBSZW5kZXJUYWJsZUNv
bDo6dXBkYXRlRnJvbUVsZW1lbnQoKQotewotICAgIGludCBvbGRTcGFuID0gX3NwYW47Ci0gICAg
RE9NOjpOb2RlSW1wbCAqbm9kZSA9IGVsZW1lbnQoKTsKLSAgICBpZiAobm9kZSAmJiAobm9kZS0+
aGFzVGFnTmFtZShjb2xUYWcpIHx8IG5vZGUtPmhhc1RhZ05hbWUoY29sZ3JvdXBUYWcpKSkgewot
ICAgICAgICBET006OkhUTUxUYWJsZUNvbEVsZW1lbnRJbXBsICp0YyA9IHN0YXRpY19jYXN0PERP
TTo6SFRNTFRhYmxlQ29sRWxlbWVudEltcGwgKj4obm9kZSk7Ci0gICAgICAgIF9zcGFuID0gdGMt
PnNwYW4oKTsKLSAgICB9IGVsc2UKLSAgICAgIF9zcGFuID0gIShzdHlsZSgpICYmIHN0eWxlKCkt
PmRpc3BsYXkoKSA9PSBUQUJMRV9DT0xVTU5fR1JPVVApOwotICAgIGlmIChfc3BhbiAhPSBvbGRT
cGFuICYmIHN0eWxlKCkgJiYgcGFyZW50KCkpCi0gICAgICAgIHNldE5lZWRzTGF5b3V0QW5kTWlu
TWF4UmVjYWxjKCk7Ci19Ci0KLWJvb2wgUmVuZGVyVGFibGVDb2w6OmNhbkhhdmVDaGlsZHJlbigp
IGNvbnN0Ci17Ci0gICAgLy8gY29scyBjYW5ub3QgaGF2ZSBjaGlsZHJlbi4gIFRoaXMgaXMgYWN0
dWFsbHkgbmVjZXNzYXJ5IHRvIGZpeCBhIGJ1ZwotICAgIC8vIHdpdGggbGlicmFyaWVzLnVjLmVk
dSwgd2hpY2ggbWFrZXMgYSA8cD4gYmUgYSB0YWJsZS1jb2x1bW4uCi0gICAgcmV0dXJuIHN0eWxl
KCktPmRpc3BsYXkoKSA9PSBUQUJMRV9DT0xVTU5fR1JPVVA7Ci19Ci0KLXZvaWQgUmVuZGVyVGFi
bGVDb2w6OmFkZENoaWxkKFJlbmRlck9iamVjdCAqY2hpbGQsIFJlbmRlck9iamVjdCAqYmVmb3Jl
Q2hpbGQpCi17Ci0gICAgS0hUTUxBc3NlcnQoY2hpbGQtPnN0eWxlKCktPmRpc3BsYXkoKSA9PSBU
QUJMRV9DT0xVTU4pOwotCi0gICAgLy8gdGhlc2UgaGF2ZSB0byBjb21lIGJlZm9yZSB0aGUgdGFi
bGUgZGVmaW5pdGlvbiEKLSAgICBSZW5kZXJDb250YWluZXI6OmFkZENoaWxkKGNoaWxkLCBiZWZv
cmVDaGlsZCk7Ci19Ci0KLSNpZm5kZWYgTkRFQlVHCi12b2lkIFJlbmRlclRhYmxlQ29sOjpkdW1w
KFFUZXh0U3RyZWFtICpzdHJlYW0sIFFTdHJpbmcgaW5kKSBjb25zdAotewotICAgICpzdHJlYW0g
PDwgIiBfc3Bhbj0iIDw8IF9zcGFuOwotICAgIFJlbmRlckNvbnRhaW5lcjo6ZHVtcChzdHJlYW0s
IGluZCk7Ci19Ci0jZW5kaWYKLQotI3VuZGVmIFRBQkxFX0RFQlVHCi0jdW5kZWYgREVCVUdfTEFZ
T1VUCi0jdW5kZWYgQk9YX0RFQlVHCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpJbmRl
eDogcmVuZGVyaW5nL3JlbmRlcl9mcmFtZXMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSByZW5kZXJpbmcvcmVu
ZGVyX2ZyYW1lcy5oCShyZXZpc2lvbiAxMjI1MykKKysrIHJlbmRlcmluZy9yZW5kZXJfZnJhbWVz
LmgJKHdvcmtpbmcgY29weSkKQEAgLTIzLDIwICsyMywxOCBAQAogI2lmbmRlZiBfX3JlbmRlcl9m
cmFtZXNfaF9fCiAjZGVmaW5lIF9fcmVuZGVyX2ZyYW1lc19oX18KIAotI2luY2x1ZGUgInJlbmRl
cl9jb250YWluZXIuaCIKLSNpbmNsdWRlICJyZW5kZXJpbmcvcmVuZGVyX3JlcGxhY2VkLmgiCi0j
aW5jbHVkZSAiaHRtbC9odG1sX2Jhc2VpbXBsLmgiCisjaW5jbHVkZSAiUmVuZGVyQ29udGFpbmVy
LmgiCisjaW5jbHVkZSAicmVuZGVyX3JlcGxhY2VkLmgiCisjaW5jbHVkZSAiaHRtbF9iYXNlaW1w
bC5oIgorCiBjbGFzcyBGcmFtZVZpZXc7CiAKLW5hbWVzcGFjZSBET00KK25hbWVzcGFjZSBXZWJD
b3JlCiB7CiAgIGNsYXNzIEhUTUxGcmFtZUVsZW1lbnRJbXBsOwogICBjbGFzcyBIVE1MRWxlbWVu
dEltcGw7CiAgIGNsYXNzIE1vdXNlRXZlbnRJbXBsOwotfTsKIAotbmFtZXNwYWNlIGtodG1sCi17
CiAgIHN0cnVjdCBDaGlsZEZyYW1lOwogCiBjbGFzcyBSZW5kZXJGcmFtZVNldCA6IHB1YmxpYyBS
ZW5kZXJDb250YWluZXIKSW5kZXg6IHJlbmRlcmluZy9SZW5kZXJUZXh0LmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSByZW5kZXJpbmcvUmVuZGVyVGV4dC5jcHAJKHJldmlzaW9uIDEyMjUzKQorKysgcmVuZGVy
aW5nL1JlbmRlclRleHQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yOSw3ICsyOSw3IEBACiAjaW5j
bHVkZSAiYnJlYWtfbGluZXMuaCIKICNpbmNsdWRlICJkb20yX3JhbmdlaW1wbC5oIgogI2luY2x1
ZGUgInJlbmRlcl9hcmVuYS5oIgotI2luY2x1ZGUgInJlbmRlcl9ibG9jay5oIgorI2luY2x1ZGUg
IlJlbmRlckJsb2NrLmgiCiAjaW5jbHVkZSAidmlzaWJsZV9wb3NpdGlvbi5oIgogI2luY2x1ZGUg
PGt4bWxjb3JlL0Fsd2F5c0lubGluZS5oPgogI2luY2x1ZGUgPHFwZW4uaD4KSW5kZXg6IHJlbmRl
cmluZy90YWJsZV9sYXlvdXQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHJlbmRlcmluZy90YWJsZV9sYXlv
dXQuY3BwCShyZXZpc2lvbiAxMjI1MykKKysrIHJlbmRlcmluZy90YWJsZV9sYXlvdXQuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0yNCwxMSArMjQsMTAgQEAKICAqLwogI2luY2x1ZGUgImNvbmZpZy5o
IgogI2luY2x1ZGUgInRhYmxlX2xheW91dC5oIgotI2luY2x1ZGUgInJlbmRlcl90YWJsZS5oIgot
Ci11c2luZyBuYW1lc3BhY2Uga2h0bWw7Ci0KLS8vICNkZWZpbmUgREVCVUdfTEFZT1VUCisjaW5j
bHVkZSAiUmVuZGVyVGFibGUuaCIKKyNpbmNsdWRlICJSZW5kZXJUYWJsZUNvbC5oIgorI2luY2x1
ZGUgIlJlbmRlclRhYmxlU2VjdGlvbi5oIgorI2luY2x1ZGUgIlJlbmRlclRhYmxlQ2VsbC5oIgog
CiAvKgogICBUaGUgdGV4dCBiZWxvdyBpcyBmcm9tIHRoZSBDU1MgMi4xIHNwZWNzLgpAQCAtNzks
NiArNzgsOCBAQCBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCiAKICov
CiAKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwogRml4ZWRUYWJsZUxheW91dDo6Rml4ZWRUYWJsZUxh
eW91dCggUmVuZGVyVGFibGUgKnRhYmxlICkKICAgICA6IFRhYmxlTGF5b3V0ICggdGFibGUgKQog
ewpAQCAtMTE2MywzICsxMTY0LDUgQEAgdm9pZCBBdXRvVGFibGVMYXlvdXQ6OmNhbGNQZXJjZW50
YWdlcygpIAogfQogCiAjdW5kZWYgREVCVUdfTEFZT1VUCisKK30KSW5kZXg6IHJlbmRlcmluZy9S
ZW5kZXJDb250YWluZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSByZW5kZXJpbmcvUmVuZGVyQ29udGFpbmVy
LmgJKHJldmlzaW9uIDEyMjUzKQorKysgcmVuZGVyaW5nL1JlbmRlckNvbnRhaW5lci5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC0yLDYgKzIsNyBAQAogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGh0
bWwgcmVuZGVyZXIgZm9yIEtERS4KICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDEgQW50dGkgS29p
dmlzdG8gKGtvaXZpc3RvQGtkZS5vcmcpCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQsIDIw
MDUsIDIwMDYgQXBwbGUgQ29tcHV0ZXIsIEluYy4KICAqCiAgKiBUaGlzIGxpYnJhcnkgaXMgZnJl
ZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgKiBtb2RpZnkgaXQg
dW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwpAQCAtMTcs
MjAgKzE4LDE2IEBACiAgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENP
UFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bwogICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRh
dGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAogICogQm9zdG9uLCBNQSAw
MjExMS0xMzA3LCBVU0EuCi0gKgogICovCi0jaWZuZGVmIHJlbmRlcl9jb250YWluZXJfaAotI2Rl
ZmluZSByZW5kZXJfY29udGFpbmVyX2gKKworI2lmbmRlZiBSZW5kZXJDb250YWluZXJfSAorI2Rl
ZmluZSBSZW5kZXJDb250YWluZXJfSAogCiAjaW5jbHVkZSAicmVuZGVyX2JveC5oIgogCi1uYW1l
c3BhY2UgRE9NIHsKLSAgICBjbGFzcyBQb3NpdGlvbjsKLX07Ci0KLW5hbWVzcGFjZSBraHRtbAot
eworbmFtZXNwYWNlIFdlYkNvcmUgewogCitjbGFzcyBQb3NpdGlvbjsKIAogLyoqCiAgKiBCYXNl
IGNsYXNzIGZvciByZW5kZXJpbmcgb2JqZWN0cyB0aGF0IGNhbiBoYXZlIGNoaWxkcmVuCkBAIC03
NCw1ICs3MSw2IEBAIHByb3RlY3RlZDoKICAgICBSZW5kZXJPYmplY3QgKm1fZmlyc3Q7CiAgICAg
UmVuZGVyT2JqZWN0ICptX2xhc3Q7CiB9OwotfTsKKworfQogI2VuZGlmCkluZGV4OiByZW5kZXJp
bmcvUmVuZGVyVGFibGVDb2wuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSByZW5kZXJpbmcvUmVuZGVyVGFibGVD
b2wuaAkocmV2aXNpb24gMTIyNTMpCisrKyByZW5kZXJpbmcvUmVuZGVyVGFibGVDb2wuaAkod29y
a2luZyBjb3B5KQpAQCAtNiw3ICs2LDcgQEAKICAqICAgICAgICAgICAoQykgMTk5OCBXYWxkbyBC
YXN0aWFuIChiYXN0aWFuQGtkZS5vcmcpCiAgKiAgICAgICAgICAgKEMpIDE5OTkgTGFycyBLbm9s
bCAoa25vbGxAa2RlLm9yZykKICAqICAgICAgICAgICAoQykgMTk5OSBBbnR0aSBLb2l2aXN0byAo
a29pdmlzdG9Aa2RlLm9yZykKLSAqIENvcHlyaWdodCAoQykgMjAwMyBBcHBsZSBDb21wdXRlciwg
SW5jLgorICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2IEFwcGxlIENvbXB1
dGVyLCBJbmMuCiAgKgogICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4g
cmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0
aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKQEAgLTIzLDM4NyArMjMsMTIgQEAKICAqIHRo
ZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRl
IDMzMCwKICAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgogICovCi0jaWZuZGVmIFJFTkRF
Ul9UQUJMRV9ICi0jZGVmaW5lIFJFTkRFUl9UQUJMRV9ICisjaWZuZGVmIFJlbmRlclRhYmxlQ29s
X0gKKyNkZWZpbmUgUmVuZGVyVGFibGVDb2xfSAogCi0jaW5jbHVkZSA8cWNvbG9yLmg+CisjaW5j
bHVkZSAiUmVuZGVyQ29udGFpbmVyLmgiCiAKLSNpbmNsdWRlICJyZW5kZXJfYmxvY2suaCIKLSNp
bmNsdWRlICJyZW5kZXJfc3R5bGUuaCIKLSNpbmNsdWRlICJraHRtbGxheW91dC5oIgotCi1uYW1l
c3BhY2UgRE9NIHsKLSAgICBjbGFzcyBET01TdHJpbmc7Ci19OwotCi1uYW1lc3BhY2Uga2h0bWwg
ewotCi1jbGFzcyBSZW5kZXJUYWJsZTsKLWNsYXNzIFJlbmRlclRhYmxlU2VjdGlvbjsKLWNsYXNz
IFJlbmRlclRhYmxlUm93OwotY2xhc3MgUmVuZGVyVGFibGVDZWxsOwotY2xhc3MgUmVuZGVyVGFi
bGVDb2w7Ci1jbGFzcyBUYWJsZUxheW91dDsKLQotY2xhc3MgUmVuZGVyVGFibGUgOiBwdWJsaWMg
UmVuZGVyQmxvY2sKLXsKLXB1YmxpYzoKLSAgICBlbnVtIFJ1bGVzIHsKLSAgICAgICAgTm9uZSAg
ICA9IDB4MDAsCi0gICAgICAgIFJHcm91cHMgPSAweDAxLAotICAgICAgICBDR3JvdXBzID0gMHgw
MiwKLSAgICAgICAgR3JvdXBzICA9IDB4MDMsCi0gICAgICAgIFJvd3MgICAgPSAweDA1LAotICAg
ICAgICBDb2xzICAgID0gMHgwYSwKLSAgICAgICAgQWxsICAgICA9IDB4MGYKLSAgICB9OwotICAg
IGVudW0gRnJhbWUgewotICAgICAgICBWb2lkICAgPSAweDAwLAotICAgICAgICBBYm92ZSAgPSAw
eDAxLAotICAgICAgICBCZWxvdyAgPSAweDAyLAotICAgICAgICBMaHMgICAgPSAweDA0LAotICAg
ICAgICBSaHMgICAgPSAweDA4LAotICAgICAgICBIc2lkZXMgPSAweDAzLAotICAgICAgICBWc2lk
ZXMgPSAweDBjLAotICAgICAgICBCb3ggICAgPSAweDBmCi0gICAgfTsKLQotICAgIFJlbmRlclRh
YmxlKERPTTo6Tm9kZUltcGwqIG5vZGUpOwotICAgIH5SZW5kZXJUYWJsZSgpOwotCi0gICAgdmly
dHVhbCBjb25zdCBjaGFyICpyZW5kZXJOYW1lKCkgY29uc3QgeyByZXR1cm4gIlJlbmRlclRhYmxl
IjsgfQotCi0gICAgdmlydHVhbCB2b2lkIHNldFN0eWxlKFJlbmRlclN0eWxlICpzdHlsZSk7Ci0K
LSAgICB2aXJ0dWFsIGJvb2wgaXNUYWJsZSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLQotICAg
IGludCBnZXRDb2x1bW5Qb3MoaW50IGNvbCkgY29uc3QKLSAgICAgICAgeyByZXR1cm4gY29sdW1u
UG9zW2NvbF07IH0KLQotICAgIGludCBoQm9yZGVyU3BhY2luZygpIGNvbnN0IHsgcmV0dXJuIGhz
cGFjaW5nOyB9Ci0gICAgaW50IHZCb3JkZXJTcGFjaW5nKCkgY29uc3QgeyByZXR1cm4gdnNwYWNp
bmc7IH0KLSAgICAKLSAgICBib29sIGNvbGxhcHNlQm9yZGVycygpIGNvbnN0IHsgcmV0dXJuIHN0
eWxlKCktPmJvcmRlckNvbGxhcHNlKCk7IH0KLSAgICBpbnQgYm9yZGVyTGVmdCgpIGNvbnN0Owot
ICAgIGludCBib3JkZXJSaWdodCgpIGNvbnN0OwotICAgIGludCBib3JkZXJUb3AoKSBjb25zdDsK
LSAgICBpbnQgYm9yZGVyQm90dG9tKCkgY29uc3Q7Ci0gICAgCi0gICAgUnVsZXMgZ2V0UnVsZXMo
KSBjb25zdCB7IHJldHVybiBydWxlczsgfQotCi0gICAgY29uc3QgUUNvbG9yICZiZ0NvbG9yKCkg
Y29uc3QgeyByZXR1cm4gc3R5bGUoKS0+YmFja2dyb3VuZENvbG9yKCk7IH0KLQotICAgIHVpbnQg
Y2VsbFBhZGRpbmcoKSBjb25zdCB7IHJldHVybiBwYWRkaW5nOyB9Ci0gICAgdm9pZCBzZXRDZWxs
UGFkZGluZyh1aW50IHApIHsgcGFkZGluZyA9IHA7IH0KLQotICAgIC8vIG92ZXJyaWRlcwotICAg
IHZpcnR1YWwgaW50IG92ZXJmbG93SGVpZ2h0KGJvb2wgaW5jbHVkZUludGVyaW9yID0gdHJ1ZSkg
Y29uc3QgeyByZXR1cm4gaGVpZ2h0KCk7IH0KLSAgICB2aXJ0dWFsIGludCBvdmVyZmxvd1dpZHRo
KGJvb2wgaW5jbHVkZUludGVyaW9yID0gdHJ1ZSkgY29uc3QgeyByZXR1cm4gd2lkdGgoKTsgfQot
ICAgIHZpcnR1YWwgdm9pZCBhZGRDaGlsZChSZW5kZXJPYmplY3QgKmNoaWxkLCBSZW5kZXJPYmpl
Y3QgKmJlZm9yZUNoaWxkID0gMCk7Ci0gICAgdmlydHVhbCB2b2lkIHBhaW50KFBhaW50SW5mbyYg
aSwgaW50IHR4LCBpbnQgdHkpOwotICAgIHZpcnR1YWwgdm9pZCBwYWludEJveERlY29yYXRpb25z
KFBhaW50SW5mbyYgaSwgaW50IF90eCwgaW50IF90eSk7Ci0gICAgdmlydHVhbCB2b2lkIGxheW91
dCgpOwotICAgIHZpcnR1YWwgdm9pZCBjYWxjTWluTWF4V2lkdGgoKTsKLQotICAgIHZpcnR1YWwg
UmVuZGVyQmxvY2sqIGZpcnN0TGluZUJsb2NrKCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIHVw
ZGF0ZUZpcnN0TGV0dGVyKCk7Ci0gICAgCi0gICAgdmlydHVhbCB2b2lkIHNldENlbGxXaWR0aHMo
KTsKLQotICAgIHZpcnR1YWwgdm9pZCBjYWxjV2lkdGgoKTsKLQotI2lmbmRlZiBOREVCVUcKLSAg
ICB2aXJ0dWFsIHZvaWQgZHVtcChRVGV4dFN0cmVhbSAqc3RyZWFtLCBRU3RyaW5nIGluZCA9ICIi
KSBjb25zdDsKLSNlbmRpZgotICAgIHN0cnVjdCBDb2x1bW5TdHJ1Y3QgewotCWVudW0gewotCSAg
ICBXaWR0aFVuZGVmaW5lZCA9IDB4ZmZmZgotCX07Ci0JQ29sdW1uU3RydWN0KCkgewotCSAgICBz
cGFuID0gMTsKLQkgICAgd2lkdGggPSBXaWR0aFVuZGVmaW5lZDsKLQl9Ci0JdXNob3J0IHNwYW47
Ci0JdWludCB3aWR0aDsgLy8gdGhlIGNhbGN1bGF0ZWQgcG9zaXRpb24gb2YgdGhlIGNvbHVtbgot
ICAgIH07Ci0KLSAgICBBcnJheTxpbnQ+IGNvbHVtblBvczsKLSAgICBBcnJheTxDb2x1bW5TdHJ1
Y3Q+IGNvbHVtbnM7Ci0KLSAgICB2b2lkIHNwbGl0Q29sdW1uKGludCBwb3MsIGludCBmaXJzdFNw
YW4pOwotICAgIHZvaWQgYXBwZW5kQ29sdW1uKGludCBzcGFuKTsKLSAgICBpbnQgbnVtRWZmQ29s
cygpIGNvbnN0IHsgcmV0dXJuIGNvbHVtbnMuc2l6ZSgpOyB9Ci0gICAgaW50IHNwYW5PZkVmZkNv
bChpbnQgZWZmQ29sKSBjb25zdCB7IHJldHVybiBjb2x1bW5zW2VmZkNvbF0uc3BhbjsgfQotICAg
IGludCBjb2xUb0VmZkNvbChpbnQgY29sKSBjb25zdCB7Ci0JaW50IGMgPSAwOwotCWludCBpID0g
MDsKLQl3aGlsZSAoYyA8IGNvbCAmJiBpIDwgKGludCljb2x1bW5zLnNpemUoKSkgewotCSAgICBj
ICs9IGNvbHVtbnNbaV0uc3BhbjsKLQkgICAgaSsrOwotCX0KLQlyZXR1cm4gaTsKLSAgICB9Ci0g
ICAgaW50IGVmZkNvbFRvQ29sKGludCBlZmZDb2wpIGNvbnN0IHsKLQlpbnQgYyA9IDA7Ci0JZm9y
IChpbnQgaSA9IDA7IGkgPCBlZmZDb2w7IGkrKykKLQkgICAgYyArPSBjb2x1bW5zW2ldLnNwYW47
Ci0JcmV0dXJuIGM7Ci0gICAgfQotCi0gICAgaW50IGJvcmRlcnNQYWRkaW5nQW5kU3BhY2luZygp
IGNvbnN0IHsKLQlyZXR1cm4gYm9yZGVyTGVmdCgpICsgYm9yZGVyUmlnaHQoKSArIAotICAgICAg
ICAgICAgICAgKGNvbGxhcHNlQm9yZGVycygpID8gMCA6IChwYWRkaW5nTGVmdCgpICsgcGFkZGlu
Z1JpZ2h0KCkgKyAobnVtRWZmQ29scygpICsgMSkgKiBoQm9yZGVyU3BhY2luZygpKSk7Ci0gICAg
fQotCi0gICAgUmVuZGVyVGFibGVDb2wgKmNvbEVsZW1lbnQoaW50IGNvbCk7Ci0KLSAgICB2b2lk
IHNldE5lZWRTZWN0aW9uUmVjYWxjKCkgeyBuZWVkU2VjdGlvblJlY2FsYyA9IHRydWU7IH0KLQot
ICAgIHZpcnR1YWwgUmVuZGVyT2JqZWN0KiByZW1vdmVDaGlsZE5vZGUoUmVuZGVyT2JqZWN0KiBj
aGlsZCk7Ci0KLSAgICBSZW5kZXJUYWJsZUNlbGwqIGNlbGxBYm92ZShjb25zdCBSZW5kZXJUYWJs
ZUNlbGwqIGNlbGwpIGNvbnN0OwotICAgIFJlbmRlclRhYmxlQ2VsbCogY2VsbEJlbG93KGNvbnN0
IFJlbmRlclRhYmxlQ2VsbCogY2VsbCkgY29uc3Q7Ci0gICAgUmVuZGVyVGFibGVDZWxsKiBjZWxs
TGVmdChjb25zdCBSZW5kZXJUYWJsZUNlbGwqIGNlbGwpIGNvbnN0OwotICAgIFJlbmRlclRhYmxl
Q2VsbCogY2VsbFJpZ2h0KGNvbnN0IFJlbmRlclRhYmxlQ2VsbCogY2VsbCkgY29uc3Q7Ci0gCi0g
ICAgQ29sbGFwc2VkQm9yZGVyVmFsdWUqIGN1cnJlbnRCb3JkZXJTdHlsZSgpIHsgcmV0dXJuIG1f
Y3VycmVudEJvcmRlcjsgfQotICAgIAotICAgIGJvb2wgaGFzU2VjdGlvbnMoKSBjb25zdCB7IHJl
dHVybiBoZWFkIHx8IGZvb3QgfHwgZmlyc3RCb2R5OyB9Ci0KLXByb3RlY3RlZDoKLQotICAgIHZv
aWQgcmVjYWxjU2VjdGlvbnMoKTsKLQotICAgIGZyaWVuZCBjbGFzcyBBdXRvVGFibGVMYXlvdXQ7
Ci0gICAgZnJpZW5kIGNsYXNzIEZpeGVkVGFibGVMYXlvdXQ7Ci0KLSAgICBSZW5kZXJCbG9jayAq
dENhcHRpb247Ci0gICAgUmVuZGVyVGFibGVTZWN0aW9uICpoZWFkOwotICAgIFJlbmRlclRhYmxl
U2VjdGlvbiAqZm9vdDsKLSAgICBSZW5kZXJUYWJsZVNlY3Rpb24gKmZpcnN0Qm9keTsKLQotICAg
IFRhYmxlTGF5b3V0ICp0YWJsZUxheW91dDsKLQotICAgIENvbGxhcHNlZEJvcmRlclZhbHVlKiBt
X2N1cnJlbnRCb3JkZXI7Ci0gICAgCi0gICAgRnJhbWUgZnJhbWUgICAgICAgICAgICAgICAgIDog
NDsKLSAgICBSdWxlcyBydWxlcyAgICAgICAgICAgICAgICAgOiA0OwotCi0gICAgYm9vbCBoYXNf
Y29sX2VsZW1zCQk6IDE7Ci0gICAgdWludCBwYWRkaW5nCQk6IDIyOwotICAgIHVpbnQgbmVlZFNl
Y3Rpb25SZWNhbGMJOiAxOwotICAgIAotICAgIHNob3J0IGhzcGFjaW5nOwotICAgIHNob3J0IHZz
cGFjaW5nOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBSZW5kZXJUYWJsZVNl
Y3Rpb24gOiBwdWJsaWMgUmVuZGVyQ29udGFpbmVyCi17Ci1wdWJsaWM6Ci0gICAgUmVuZGVyVGFi
bGVTZWN0aW9uKERPTTo6Tm9kZUltcGwqIG5vZGUpOwotICAgIH5SZW5kZXJUYWJsZVNlY3Rpb24o
KTsKLSAgICB2aXJ0dWFsIHZvaWQgZGVzdHJveSgpOwotCi0gICAgdmlydHVhbCB2b2lkIHNldFN0
eWxlKFJlbmRlclN0eWxlICpzdHlsZSk7Ci0KLSAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKnJlbmRl
ck5hbWUoKSBjb25zdCB7IHJldHVybiAiUmVuZGVyVGFibGVTZWN0aW9uIjsgfQotCi0gICAgLy8g
b3ZlcnJpZGVzCi0gICAgdmlydHVhbCB2b2lkIGFkZENoaWxkKFJlbmRlck9iamVjdCAqY2hpbGQs
IFJlbmRlck9iamVjdCAqYmVmb3JlQ2hpbGQgPSAwKTsKLSAgICB2aXJ0dWFsIGJvb2wgaXNUYWJs
ZVNlY3Rpb24oKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0KLSAgICB2aXJ0dWFsIHNob3J0IGxp
bmVIZWlnaHQoYm9vbCkgY29uc3QgeyByZXR1cm4gMDsgfQotICAgIHZpcnR1YWwgdm9pZCBwb3Np
dGlvbihpbnQsIGludCwgaW50LCBpbnQsIGludCwgYm9vbCwgYm9vbCwgaW50KSB7fQotCi0jaWZu
ZGVmIE5ERUJVRwotICAgIHZpcnR1YWwgdm9pZCBkdW1wKFFUZXh0U3RyZWFtICpzdHJlYW0sIFFT
dHJpbmcgaW5kID0gIiIpIGNvbnN0OwotI2VuZGlmCi0KLSAgICB2b2lkIGFkZENlbGwoUmVuZGVy
VGFibGVDZWxsICpjZWxsKTsKLQotICAgIHZvaWQgc2V0Q2VsbFdpZHRocygpOwotICAgIHZvaWQg
Y2FsY1Jvd0hlaWdodCgpOwotICAgIGludCBsYXlvdXRSb3dzKGludCBoZWlnaHQpOwotCi0gICAg
UmVuZGVyVGFibGUgKnRhYmxlKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8UmVuZGVyVGFi
bGUgKj4ocGFyZW50KCkpOyB9Ci0KLSAgICBzdHJ1Y3QgQ2VsbFN0cnVjdCB7Ci0gICAgICAgIFJl
bmRlclRhYmxlQ2VsbCAqY2VsbDsKLSAgICAgICAgYm9vbCBpbkNvbFNwYW47IC8vIHRydWUgZm9y
IGNvbHVtbnMgYWZ0ZXIgdGhlIGZpcnN0IGluIGEgY29sc3BhbgotICAgIH07Ci0gICAgdHlwZWRl
ZiBBcnJheTxDZWxsU3RydWN0PiBSb3c7Ci0gICAgc3RydWN0IFJvd1N0cnVjdCB7Ci0JUm93ICpy
b3c7Ci0JaW50IGJhc2VMaW5lOwotCUxlbmd0aCBoZWlnaHQ7Ci0gICAgfTsKLQotICAgIENlbGxT
dHJ1Y3QmIGNlbGxBdChpbnQgcm93LCAgaW50IGNvbCkgewotCXJldHVybiAoKmdyaWRbcm93XS5y
b3cpW2NvbF07Ci0gICAgfQotICAgIGNvbnN0IENlbGxTdHJ1Y3QmIGNlbGxBdChpbnQgcm93LCBp
bnQgY29sKSBjb25zdCB7Ci0JcmV0dXJuICgqZ3JpZFtyb3ddLnJvdylbY29sXTsKLSAgICB9Ci0K
LSAgICB2aXJ0dWFsIHZvaWQgcGFpbnQoUGFpbnRJbmZvJiBpLCBpbnQgdHgsIGludCB0eSk7Ci0K
LSAgICBpbnQgbnVtUm93cygpIGNvbnN0IHsgcmV0dXJuIGdyaWRSb3dzOyB9Ci0gICAgaW50IGdl
dEJhc2VsaW5lKGludCByb3cpIHtyZXR1cm4gZ3JpZFtyb3ddLmJhc2VMaW5lO30KLQotICAgIHZv
aWQgc2V0TmVlZENlbGxSZWNhbGMoKSB7Ci0gICAgICAgIG5lZWRDZWxsUmVjYWxjID0gdHJ1ZTsK
LSAgICAgICAgdGFibGUoKS0+c2V0TmVlZFNlY3Rpb25SZWNhbGMoKTsKLSAgICB9Ci0KLSAgICB2
aXJ0dWFsIFJlbmRlck9iamVjdCogcmVtb3ZlQ2hpbGROb2RlKFJlbmRlck9iamVjdCogY2hpbGQp
OwotCi0gICAgLy8gdGhpcyBnZXRzIGEgY2VsbCBncmlkIGRhdGEgc3RydWN0dXJlLiBjaGFuZ2lu
ZyB0aGUgbnVtYmVyIG9mCi0gICAgLy8gY29sdW1ucyBpcyBkb25lIGJ5IHRoZSB0YWJsZQotICAg
IEFycmF5PFJvd1N0cnVjdD4gZ3JpZDsKLSAgICBpbnQgZ3JpZFJvd3M7Ci0gICAgQXJyYXk8aW50
PiByb3dQb3M7Ci0KLSAgICBpbnQgY0NvbDsKLSAgICBpbnQgY1JvdzsKLSAgICBib29sIG5lZWRD
ZWxsUmVjYWxjOwotCi0gICAgdm9pZCByZWNhbGNDZWxscygpOwotcHJvdGVjdGVkOgotICAgIGJv
b2wgZW5zdXJlUm93cyhpbnQgbnVtUm93cyk7Ci0gICAgdm9pZCBjbGVhckdyaWQoKTsKLX07Ci0K
LS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgUmVuZGVyVGFibGVSb3cgOiBwdWJsaWMgUmVu
ZGVyQ29udGFpbmVyCi17Ci1wdWJsaWM6Ci0gICAgUmVuZGVyVGFibGVSb3coRE9NOjpOb2RlSW1w
bCogbm9kZSk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgZGVzdHJveSgpOwotCi0gICAgdmlydHVhbCB2
b2lkIHNldFN0eWxlKFJlbmRlclN0eWxlKik7Ci0gICAgdmlydHVhbCBjb25zdCBjaGFyICpyZW5k
ZXJOYW1lKCkgY29uc3QgeyByZXR1cm4gIlJlbmRlclRhYmxlUm93IjsgfQotCi0gICAgdmlydHVh
bCBib29sIGlzVGFibGVSb3coKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0KLSAgICAvLyBvdmVy
cmlkZXMKLSAgICB2aXJ0dWFsIHZvaWQgYWRkQ2hpbGQoUmVuZGVyT2JqZWN0ICpjaGlsZCwgUmVu
ZGVyT2JqZWN0ICpiZWZvcmVDaGlsZCA9IDApOwotICAgIHZpcnR1YWwgUmVuZGVyT2JqZWN0KiBy
ZW1vdmVDaGlsZE5vZGUoUmVuZGVyT2JqZWN0KiBjaGlsZCk7Ci0KLSAgICB2aXJ0dWFsIHNob3J0
IGxpbmVIZWlnaHQoYm9vbCkgY29uc3QgeyByZXR1cm4gMDsgfQotICAgIHZpcnR1YWwgdm9pZCBw
b3NpdGlvbihpbnQsIGludCwgaW50LCBpbnQsIGludCwgYm9vbCwgYm9vbCwgaW50KSB7fQotCi0g
ICAgdmlydHVhbCB2b2lkIGxheW91dCgpOwotICAgIHZpcnR1YWwgSW50UmVjdCBnZXRBYnNvbHV0
ZVJlcGFpbnRSZWN0KCk7Ci0gICAgCi0gICAgUmVuZGVyVGFibGUgKnRhYmxlKCkgY29uc3QgeyBy
ZXR1cm4gc3RhdGljX2Nhc3Q8UmVuZGVyVGFibGUgKj4ocGFyZW50KCktPnBhcmVudCgpKTsgfQot
ICAgIFJlbmRlclRhYmxlU2VjdGlvbiAqc2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19j
YXN0PFJlbmRlclRhYmxlU2VjdGlvbiAqPihwYXJlbnQoKSk7IH0KLQotI2lmbmRlZiBOREVCVUcK
LSAgICB2aXJ0dWFsIHZvaWQgZHVtcChRVGV4dFN0cmVhbSAqc3RyZWFtLCBRU3RyaW5nIGluZCA9
ICIiKSBjb25zdDsKLSNlbmRpZgotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBS
ZW5kZXJUYWJsZUNlbGwgOiBwdWJsaWMgUmVuZGVyQmxvY2sKLXsKLXB1YmxpYzoKLSAgICBSZW5k
ZXJUYWJsZUNlbGwoRE9NOjpOb2RlSW1wbCogbm9kZSk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgZGVz
dHJveSgpOwotCi0gICAgdmlydHVhbCBjb25zdCBjaGFyICpyZW5kZXJOYW1lKCkgY29uc3QgeyBy
ZXR1cm4gIlJlbmRlclRhYmxlQ2VsbCI7IH0KLSAgICB2aXJ0dWFsIGJvb2wgaXNUYWJsZUNlbGwo
KSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0KLSAgICAvLyBvdmVycmlkZXMgUmVuZGVyT2JqZWN0
Ci0gICAgdmlydHVhbCBib29sIHJlcXVpcmVzTGF5ZXIoKTsKLQotICAgIC8vICMjIyBGSVggdGhl
c2UgdHdvLi4uCi0gICAgaW50IGNlbGxJbmRleCgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KLSAgICB2
b2lkIHNldENlbGxJbmRleChpbnQpIHsgfQotCi0gICAgaW50IGNvbFNwYW4oKSBjb25zdCB7IHJl
dHVybiBjU3BhbjsgfQotICAgIHZvaWQgc2V0Q29sU3BhbihpbnQgYykgeyBjU3BhbiA9IGM7IH0K
LQotICAgIGludCByb3dTcGFuKCkgY29uc3QgeyByZXR1cm4gclNwYW47IH0KLSAgICB2b2lkIHNl
dFJvd1NwYW4oaW50IHIpIHsgclNwYW4gPSByOyB9Ci0KLSAgICBpbnQgY29sKCkgY29uc3QgeyBy
ZXR1cm4gX2NvbDsgfQotICAgIHZvaWQgc2V0Q29sKGludCBjb2wpIHsgX2NvbCA9IGNvbDsgfQot
ICAgIGludCByb3coKSBjb25zdCB7IHJldHVybiBfcm93OyB9Ci0gICAgdm9pZCBzZXRSb3coaW50
IHIpIHsgX3JvdyA9IHI7IH0KLQotICAgIExlbmd0aCBzdHlsZU9yQ29sV2lkdGgoKTsKLQotICAg
IC8vIG92ZXJyaWRlcwotICAgIHZpcnR1YWwgdm9pZCBjYWxjTWluTWF4V2lkdGgoKTsKLSAgICB2
aXJ0dWFsIHZvaWQgY2FsY1dpZHRoKCk7Ci0gICAgdmlydHVhbCB2b2lkIHNldFdpZHRoKGludCB3
aWR0aCk7Ci0gICAgdmlydHVhbCB2b2lkIHNldFN0eWxlKFJlbmRlclN0eWxlICpzdHlsZSk7Ci0K
LSAgICBpbnQgYm9yZGVyTGVmdCgpIGNvbnN0OwotICAgIGludCBib3JkZXJSaWdodCgpIGNvbnN0
OwotICAgIGludCBib3JkZXJUb3AoKSBjb25zdDsKLSAgICBpbnQgYm9yZGVyQm90dG9tKCkgY29u
c3Q7Ci0KLSAgICBDb2xsYXBzZWRCb3JkZXJWYWx1ZSBjb2xsYXBzZWRMZWZ0Qm9yZGVyKCkgY29u
c3Q7Ci0gICAgQ29sbGFwc2VkQm9yZGVyVmFsdWUgY29sbGFwc2VkUmlnaHRCb3JkZXIoKSBjb25z
dDsKLSAgICBDb2xsYXBzZWRCb3JkZXJWYWx1ZSBjb2xsYXBzZWRUb3BCb3JkZXIoKSBjb25zdDsK
LSAgICBDb2xsYXBzZWRCb3JkZXJWYWx1ZSBjb2xsYXBzZWRCb3R0b21Cb3JkZXIoKSBjb25zdDsK
LSAgICB2aXJ0dWFsIHZvaWQgY29sbGVjdEJvcmRlcnMoUVZhbHVlTGlzdDxDb2xsYXBzZWRCb3Jk
ZXJWYWx1ZT4mIGJvcmRlclN0eWxlcyk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlRnJvbUVs
ZW1lbnQoKTsKLQotICAgIHZpcnR1YWwgdm9pZCBsYXlvdXQoKTsKLSAgICAKLSAgICB2b2lkIHNl
dENlbGxUb3BFeHRyYShpbnQgcCkgeyBfdG9wRXh0cmEgPSBwOyB9Ci0gICAgdm9pZCBzZXRDZWxs
Qm90dG9tRXh0cmEoaW50IHApIHsgX2JvdHRvbUV4dHJhID0gcDsgfQotCi0gICAgdmlydHVhbCB2
b2lkIHBhaW50KFBhaW50SW5mbyYgaSwgaW50IHR4LCBpbnQgdHkpOwotCi0gICAgdm9pZCBwYWlu
dENvbGxhcHNlZEJvcmRlcihRUGFpbnRlciogcCwgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgp
OwotICAgIAotICAgIC8vIGxpZSBwb3NpdGlvbiB0byBvdXRzaWRlIG9ic2VydmVycwotICAgIHZp
cnR1YWwgaW50IHlQb3MoKSBjb25zdCB7IHJldHVybiBtX3kgKyBfdG9wRXh0cmE7IH0KLQotICAg
IHZpcnR1YWwgdm9pZCBjb21wdXRlQWJzb2x1dGVSZXBhaW50UmVjdChJbnRSZWN0JiByLCBib29s
IGY9ZmFsc2UpOwotICAgIHZpcnR1YWwgYm9vbCBhYnNvbHV0ZVBvc2l0aW9uKGludCAmeFBvcywg
aW50ICZ5UG9zLCBib29sIGYgPSBmYWxzZSk7Ci0KLSAgICB2aXJ0dWFsIHNob3J0IGJhc2VsaW5l
UG9zaXRpb24oYm9vbCA9IGZhbHNlKSBjb25zdDsKLQotICAgIHZpcnR1YWwgaW50IGJvcmRlclRv
cEV4dHJhKCkgY29uc3QgeyByZXR1cm4gX3RvcEV4dHJhOyB9Ci0gICAgdmlydHVhbCBpbnQgYm9y
ZGVyQm90dG9tRXh0cmEoKSBjb25zdCB7IHJldHVybiBfYm90dG9tRXh0cmE7IH0KLQotICAgIFJl
bmRlclRhYmxlICp0YWJsZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PFJlbmRlclRhYmxl
ICo+KHBhcmVudCgpLT5wYXJlbnQoKS0+cGFyZW50KCkpOyB9Ci0gICAgUmVuZGVyVGFibGVTZWN0
aW9uICpzZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8UmVuZGVyVGFibGVTZWN0
aW9uICo+KHBhcmVudCgpLT5wYXJlbnQoKSk7IH0KLQotI2lmbmRlZiBOREVCVUcKLSAgICB2aXJ0
dWFsIHZvaWQgZHVtcChRVGV4dFN0cmVhbSAqc3RyZWFtLCBRU3RyaW5nIGluZCA9ICIiKSBjb25z
dDsKLSNlbmRpZgotCi0gICAgdmlydHVhbCBJbnRSZWN0IGdldEFic29sdXRlUmVwYWludFJlY3Qo
KTsKLSAgICAKLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIHZvaWQgcGFpbnRCb3hEZWNvcmF0aW9u
cyhQYWludEluZm8mIGksIGludCBfdHgsIGludCBfdHkpOwotICAgIAotICAgIGludCBfcm93Owot
ICAgIGludCBfY29sOwotICAgIGludCByU3BhbjsKLSAgICBpbnQgY1NwYW47Ci0gICAgaW50IF90
b3BFeHRyYSA6IDMxOwotICAgIGJvb2wgbldyYXAgOiAxOwotICAgIGludCBfYm90dG9tRXh0cmEg
OiAzMTsKLSAgICBib29sIG1fd2lkdGhDaGFuZ2VkIDogMTsKLSAgICAKLSAgICBpbnQgbV9wZXJj
ZW50YWdlSGVpZ2h0OwotfTsKLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCituYW1lc3BhY2UgV2Vi
Q29yZSB7CiAKIGNsYXNzIFJlbmRlclRhYmxlQ29sIDogcHVibGljIFJlbmRlckNvbnRhaW5lcgog
ewpAQCAtNDMzLDYgKzU4LDUgQEAgcHJvdGVjdGVkOgogICAgIGludCBfc3BhbjsKIH07CiAKLX07
Cit9CiAjZW5kaWYKLQpJbmRleDogcmVuZGVyaW5nL3JlbmRlcl90YWJsZS5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIHJlbmRlcmluZy9yZW5kZXJfdGFibGUuaAkocmV2aXNpb24gMTIyNTMpCisrKyByZW5kZXJp
bmcvcmVuZGVyX3RhYmxlLmgJKHdvcmtpbmcgY29weSkKQEAgLTEsNDM4ICswLDAgQEAKLS8qCi0g
KiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRE9NIGltcGxlbWVudGF0aW9uIGZvciBLREUuCi0g
KgotICogQ29weXJpZ2h0IChDKSAxOTk3IE1hcnRpbiBKb25lcyAobWpvbmVzQGtkZS5vcmcpCi0g
KiAgICAgICAgICAgKEMpIDE5OTcgVG9yYmVuIFdlaXMgKHdlaXNAa2RlLm9yZykKLSAqICAgICAg
ICAgICAoQykgMTk5OCBXYWxkbyBCYXN0aWFuIChiYXN0aWFuQGtkZS5vcmcpCi0gKiAgICAgICAg
ICAgKEMpIDE5OTkgTGFycyBLbm9sbCAoa25vbGxAa2RlLm9yZykKLSAqICAgICAgICAgICAoQykg
MTk5OSBBbnR0aSBLb2l2aXN0byAoa29pdmlzdG9Aa2RlLm9yZykKLSAqIENvcHlyaWdodCAoQykg
MjAwMyBBcHBsZSBDb21wdXRlciwgSW5jLgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNv
ZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRl
ciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNl
IGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAq
IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIg
dmVyc2lvbi4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUg
dGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0
aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3Ig
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogTGlicmFy
eSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNo
b3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJs
aWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZ
SU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRp
b24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSAqIEJvc3RvbiwgTUEgMDIx
MTEtMTMwNywgVVNBLgotICovCi0jaWZuZGVmIFJFTkRFUl9UQUJMRV9ICi0jZGVmaW5lIFJFTkRF
Ul9UQUJMRV9ICi0KLSNpbmNsdWRlIDxxY29sb3IuaD4KLQotI2luY2x1ZGUgInJlbmRlcl9ibG9j
ay5oIgotI2luY2x1ZGUgInJlbmRlcl9zdHlsZS5oIgotI2luY2x1ZGUgImtodG1sbGF5b3V0Lmgi
Ci0KLW5hbWVzcGFjZSBET00gewotICAgIGNsYXNzIERPTVN0cmluZzsKLX07Ci0KLW5hbWVzcGFj
ZSBraHRtbCB7Ci0KLWNsYXNzIFJlbmRlclRhYmxlOwotY2xhc3MgUmVuZGVyVGFibGVTZWN0aW9u
OwotY2xhc3MgUmVuZGVyVGFibGVSb3c7Ci1jbGFzcyBSZW5kZXJUYWJsZUNlbGw7Ci1jbGFzcyBS
ZW5kZXJUYWJsZUNvbDsKLWNsYXNzIFRhYmxlTGF5b3V0OwotCi1jbGFzcyBSZW5kZXJUYWJsZSA6
IHB1YmxpYyBSZW5kZXJCbG9jawotewotcHVibGljOgotICAgIGVudW0gUnVsZXMgewotICAgICAg
ICBOb25lICAgID0gMHgwMCwKLSAgICAgICAgUkdyb3VwcyA9IDB4MDEsCi0gICAgICAgIENHcm91
cHMgPSAweDAyLAotICAgICAgICBHcm91cHMgID0gMHgwMywKLSAgICAgICAgUm93cyAgICA9IDB4
MDUsCi0gICAgICAgIENvbHMgICAgPSAweDBhLAotICAgICAgICBBbGwgICAgID0gMHgwZgotICAg
IH07Ci0gICAgZW51bSBGcmFtZSB7Ci0gICAgICAgIFZvaWQgICA9IDB4MDAsCi0gICAgICAgIEFi
b3ZlICA9IDB4MDEsCi0gICAgICAgIEJlbG93ICA9IDB4MDIsCi0gICAgICAgIExocyAgICA9IDB4
MDQsCi0gICAgICAgIFJocyAgICA9IDB4MDgsCi0gICAgICAgIEhzaWRlcyA9IDB4MDMsCi0gICAg
ICAgIFZzaWRlcyA9IDB4MGMsCi0gICAgICAgIEJveCAgICA9IDB4MGYKLSAgICB9OwotCi0gICAg
UmVuZGVyVGFibGUoRE9NOjpOb2RlSW1wbCogbm9kZSk7Ci0gICAgflJlbmRlclRhYmxlKCk7Ci0K
LSAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKnJlbmRlck5hbWUoKSBjb25zdCB7IHJldHVybiAiUmVu
ZGVyVGFibGUiOyB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgc2V0U3R5bGUoUmVuZGVyU3R5bGUgKnN0
eWxlKTsKLQotICAgIHZpcnR1YWwgYm9vbCBpc1RhYmxlKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsg
fQotCi0gICAgaW50IGdldENvbHVtblBvcyhpbnQgY29sKSBjb25zdAotICAgICAgICB7IHJldHVy
biBjb2x1bW5Qb3NbY29sXTsgfQotCi0gICAgaW50IGhCb3JkZXJTcGFjaW5nKCkgY29uc3QgeyBy
ZXR1cm4gaHNwYWNpbmc7IH0KLSAgICBpbnQgdkJvcmRlclNwYWNpbmcoKSBjb25zdCB7IHJldHVy
biB2c3BhY2luZzsgfQotICAgIAotICAgIGJvb2wgY29sbGFwc2VCb3JkZXJzKCkgY29uc3QgeyBy
ZXR1cm4gc3R5bGUoKS0+Ym9yZGVyQ29sbGFwc2UoKTsgfQotICAgIGludCBib3JkZXJMZWZ0KCkg
Y29uc3Q7Ci0gICAgaW50IGJvcmRlclJpZ2h0KCkgY29uc3Q7Ci0gICAgaW50IGJvcmRlclRvcCgp
IGNvbnN0OwotICAgIGludCBib3JkZXJCb3R0b20oKSBjb25zdDsKLSAgICAKLSAgICBSdWxlcyBn
ZXRSdWxlcygpIGNvbnN0IHsgcmV0dXJuIHJ1bGVzOyB9Ci0KLSAgICBjb25zdCBRQ29sb3IgJmJn
Q29sb3IoKSBjb25zdCB7IHJldHVybiBzdHlsZSgpLT5iYWNrZ3JvdW5kQ29sb3IoKTsgfQotCi0g
ICAgdWludCBjZWxsUGFkZGluZygpIGNvbnN0IHsgcmV0dXJuIHBhZGRpbmc7IH0KLSAgICB2b2lk
IHNldENlbGxQYWRkaW5nKHVpbnQgcCkgeyBwYWRkaW5nID0gcDsgfQotCi0gICAgLy8gb3ZlcnJp
ZGVzCi0gICAgdmlydHVhbCBpbnQgb3ZlcmZsb3dIZWlnaHQoYm9vbCBpbmNsdWRlSW50ZXJpb3Ig
PSB0cnVlKSBjb25zdCB7IHJldHVybiBoZWlnaHQoKTsgfQotICAgIHZpcnR1YWwgaW50IG92ZXJm
bG93V2lkdGgoYm9vbCBpbmNsdWRlSW50ZXJpb3IgPSB0cnVlKSBjb25zdCB7IHJldHVybiB3aWR0
aCgpOyB9Ci0gICAgdmlydHVhbCB2b2lkIGFkZENoaWxkKFJlbmRlck9iamVjdCAqY2hpbGQsIFJl
bmRlck9iamVjdCAqYmVmb3JlQ2hpbGQgPSAwKTsKLSAgICB2aXJ0dWFsIHZvaWQgcGFpbnQoUGFp
bnRJbmZvJiBpLCBpbnQgdHgsIGludCB0eSk7Ci0gICAgdmlydHVhbCB2b2lkIHBhaW50Qm94RGVj
b3JhdGlvbnMoUGFpbnRJbmZvJiBpLCBpbnQgX3R4LCBpbnQgX3R5KTsKLSAgICB2aXJ0dWFsIHZv
aWQgbGF5b3V0KCk7Ci0gICAgdmlydHVhbCB2b2lkIGNhbGNNaW5NYXhXaWR0aCgpOwotCi0gICAg
dmlydHVhbCBSZW5kZXJCbG9jayogZmlyc3RMaW5lQmxvY2soKSBjb25zdDsKLSAgICB2aXJ0dWFs
IHZvaWQgdXBkYXRlRmlyc3RMZXR0ZXIoKTsKLSAgICAKLSAgICB2aXJ0dWFsIHZvaWQgc2V0Q2Vs
bFdpZHRocygpOwotCi0gICAgdmlydHVhbCB2b2lkIGNhbGNXaWR0aCgpOwotCi0jaWZuZGVmIE5E
RUJVRwotICAgIHZpcnR1YWwgdm9pZCBkdW1wKFFUZXh0U3RyZWFtICpzdHJlYW0sIFFTdHJpbmcg
aW5kID0gIiIpIGNvbnN0OwotI2VuZGlmCi0gICAgc3RydWN0IENvbHVtblN0cnVjdCB7Ci0JZW51
bSB7Ci0JICAgIFdpZHRoVW5kZWZpbmVkID0gMHhmZmZmCi0JfTsKLQlDb2x1bW5TdHJ1Y3QoKSB7
Ci0JICAgIHNwYW4gPSAxOwotCSAgICB3aWR0aCA9IFdpZHRoVW5kZWZpbmVkOwotCX0KLQl1c2hv
cnQgc3BhbjsKLQl1aW50IHdpZHRoOyAvLyB0aGUgY2FsY3VsYXRlZCBwb3NpdGlvbiBvZiB0aGUg
Y29sdW1uCi0gICAgfTsKLQotICAgIEFycmF5PGludD4gY29sdW1uUG9zOwotICAgIEFycmF5PENv
bHVtblN0cnVjdD4gY29sdW1uczsKLQotICAgIHZvaWQgc3BsaXRDb2x1bW4oaW50IHBvcywgaW50
IGZpcnN0U3Bhbik7Ci0gICAgdm9pZCBhcHBlbmRDb2x1bW4oaW50IHNwYW4pOwotICAgIGludCBu
dW1FZmZDb2xzKCkgY29uc3QgeyByZXR1cm4gY29sdW1ucy5zaXplKCk7IH0KLSAgICBpbnQgc3Bh
bk9mRWZmQ29sKGludCBlZmZDb2wpIGNvbnN0IHsgcmV0dXJuIGNvbHVtbnNbZWZmQ29sXS5zcGFu
OyB9Ci0gICAgaW50IGNvbFRvRWZmQ29sKGludCBjb2wpIGNvbnN0IHsKLQlpbnQgYyA9IDA7Ci0J
aW50IGkgPSAwOwotCXdoaWxlIChjIDwgY29sICYmIGkgPCAoaW50KWNvbHVtbnMuc2l6ZSgpKSB7
Ci0JICAgIGMgKz0gY29sdW1uc1tpXS5zcGFuOwotCSAgICBpKys7Ci0JfQotCXJldHVybiBpOwot
ICAgIH0KLSAgICBpbnQgZWZmQ29sVG9Db2woaW50IGVmZkNvbCkgY29uc3QgewotCWludCBjID0g
MDsKLQlmb3IgKGludCBpID0gMDsgaSA8IGVmZkNvbDsgaSsrKQotCSAgICBjICs9IGNvbHVtbnNb
aV0uc3BhbjsKLQlyZXR1cm4gYzsKLSAgICB9Ci0KLSAgICBpbnQgYm9yZGVyc1BhZGRpbmdBbmRT
cGFjaW5nKCkgY29uc3QgewotCXJldHVybiBib3JkZXJMZWZ0KCkgKyBib3JkZXJSaWdodCgpICsg
Ci0gICAgICAgICAgICAgICAoY29sbGFwc2VCb3JkZXJzKCkgPyAwIDogKHBhZGRpbmdMZWZ0KCkg
KyBwYWRkaW5nUmlnaHQoKSArIChudW1FZmZDb2xzKCkgKyAxKSAqIGhCb3JkZXJTcGFjaW5nKCkp
KTsKLSAgICB9Ci0KLSAgICBSZW5kZXJUYWJsZUNvbCAqY29sRWxlbWVudChpbnQgY29sKTsKLQot
ICAgIHZvaWQgc2V0TmVlZFNlY3Rpb25SZWNhbGMoKSB7IG5lZWRTZWN0aW9uUmVjYWxjID0gdHJ1
ZTsgfQotCi0gICAgdmlydHVhbCBSZW5kZXJPYmplY3QqIHJlbW92ZUNoaWxkTm9kZShSZW5kZXJP
YmplY3QqIGNoaWxkKTsKLQotICAgIFJlbmRlclRhYmxlQ2VsbCogY2VsbEFib3ZlKGNvbnN0IFJl
bmRlclRhYmxlQ2VsbCogY2VsbCkgY29uc3Q7Ci0gICAgUmVuZGVyVGFibGVDZWxsKiBjZWxsQmVs
b3coY29uc3QgUmVuZGVyVGFibGVDZWxsKiBjZWxsKSBjb25zdDsKLSAgICBSZW5kZXJUYWJsZUNl
bGwqIGNlbGxMZWZ0KGNvbnN0IFJlbmRlclRhYmxlQ2VsbCogY2VsbCkgY29uc3Q7Ci0gICAgUmVu
ZGVyVGFibGVDZWxsKiBjZWxsUmlnaHQoY29uc3QgUmVuZGVyVGFibGVDZWxsKiBjZWxsKSBjb25z
dDsKLSAKLSAgICBDb2xsYXBzZWRCb3JkZXJWYWx1ZSogY3VycmVudEJvcmRlclN0eWxlKCkgeyBy
ZXR1cm4gbV9jdXJyZW50Qm9yZGVyOyB9Ci0gICAgCi0gICAgYm9vbCBoYXNTZWN0aW9ucygpIGNv
bnN0IHsgcmV0dXJuIGhlYWQgfHwgZm9vdCB8fCBmaXJzdEJvZHk7IH0KLQotcHJvdGVjdGVkOgot
Ci0gICAgdm9pZCByZWNhbGNTZWN0aW9ucygpOwotCi0gICAgZnJpZW5kIGNsYXNzIEF1dG9UYWJs
ZUxheW91dDsKLSAgICBmcmllbmQgY2xhc3MgRml4ZWRUYWJsZUxheW91dDsKLQotICAgIFJlbmRl
ckJsb2NrICp0Q2FwdGlvbjsKLSAgICBSZW5kZXJUYWJsZVNlY3Rpb24gKmhlYWQ7Ci0gICAgUmVu
ZGVyVGFibGVTZWN0aW9uICpmb290OwotICAgIFJlbmRlclRhYmxlU2VjdGlvbiAqZmlyc3RCb2R5
OwotCi0gICAgVGFibGVMYXlvdXQgKnRhYmxlTGF5b3V0OwotCi0gICAgQ29sbGFwc2VkQm9yZGVy
VmFsdWUqIG1fY3VycmVudEJvcmRlcjsKLSAgICAKLSAgICBGcmFtZSBmcmFtZSAgICAgICAgICAg
ICAgICAgOiA0OwotICAgIFJ1bGVzIHJ1bGVzICAgICAgICAgICAgICAgICA6IDQ7Ci0KLSAgICBi
b29sIGhhc19jb2xfZWxlbXMJCTogMTsKLSAgICB1aW50IHBhZGRpbmcJCTogMjI7Ci0gICAgdWlu
dCBuZWVkU2VjdGlvblJlY2FsYwk6IDE7Ci0gICAgCi0gICAgc2hvcnQgaHNwYWNpbmc7Ci0gICAg
c2hvcnQgdnNwYWNpbmc7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIFJlbmRl
clRhYmxlU2VjdGlvbiA6IHB1YmxpYyBSZW5kZXJDb250YWluZXIKLXsKLXB1YmxpYzoKLSAgICBS
ZW5kZXJUYWJsZVNlY3Rpb24oRE9NOjpOb2RlSW1wbCogbm9kZSk7Ci0gICAgflJlbmRlclRhYmxl
U2VjdGlvbigpOwotICAgIHZpcnR1YWwgdm9pZCBkZXN0cm95KCk7Ci0KLSAgICB2aXJ0dWFsIHZv
aWQgc2V0U3R5bGUoUmVuZGVyU3R5bGUgKnN0eWxlKTsKLQotICAgIHZpcnR1YWwgY29uc3QgY2hh
ciAqcmVuZGVyTmFtZSgpIGNvbnN0IHsgcmV0dXJuICJSZW5kZXJUYWJsZVNlY3Rpb24iOyB9Ci0K
LSAgICAvLyBvdmVycmlkZXMKLSAgICB2aXJ0dWFsIHZvaWQgYWRkQ2hpbGQoUmVuZGVyT2JqZWN0
ICpjaGlsZCwgUmVuZGVyT2JqZWN0ICpiZWZvcmVDaGlsZCA9IDApOwotICAgIHZpcnR1YWwgYm9v
bCBpc1RhYmxlU2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLQotICAgIHZpcnR1YWwg
c2hvcnQgbGluZUhlaWdodChib29sKSBjb25zdCB7IHJldHVybiAwOyB9Ci0gICAgdmlydHVhbCB2
b2lkIHBvc2l0aW9uKGludCwgaW50LCBpbnQsIGludCwgaW50LCBib29sLCBib29sLCBpbnQpIHt9
Ci0KLSNpZm5kZWYgTkRFQlVHCi0gICAgdmlydHVhbCB2b2lkIGR1bXAoUVRleHRTdHJlYW0gKnN0
cmVhbSwgUVN0cmluZyBpbmQgPSAiIikgY29uc3Q7Ci0jZW5kaWYKLQotICAgIHZvaWQgYWRkQ2Vs
bChSZW5kZXJUYWJsZUNlbGwgKmNlbGwpOwotCi0gICAgdm9pZCBzZXRDZWxsV2lkdGhzKCk7Ci0g
ICAgdm9pZCBjYWxjUm93SGVpZ2h0KCk7Ci0gICAgaW50IGxheW91dFJvd3MoaW50IGhlaWdodCk7
Ci0KLSAgICBSZW5kZXJUYWJsZSAqdGFibGUoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxS
ZW5kZXJUYWJsZSAqPihwYXJlbnQoKSk7IH0KLQotICAgIHN0cnVjdCBDZWxsU3RydWN0IHsKLSAg
ICAgICAgUmVuZGVyVGFibGVDZWxsICpjZWxsOwotICAgICAgICBib29sIGluQ29sU3BhbjsgLy8g
dHJ1ZSBmb3IgY29sdW1ucyBhZnRlciB0aGUgZmlyc3QgaW4gYSBjb2xzcGFuCi0gICAgfTsKLSAg
ICB0eXBlZGVmIEFycmF5PENlbGxTdHJ1Y3Q+IFJvdzsKLSAgICBzdHJ1Y3QgUm93U3RydWN0IHsK
LQlSb3cgKnJvdzsKLQlpbnQgYmFzZUxpbmU7Ci0JTGVuZ3RoIGhlaWdodDsKLSAgICB9OwotCi0g
ICAgQ2VsbFN0cnVjdCYgY2VsbEF0KGludCByb3csICBpbnQgY29sKSB7Ci0JcmV0dXJuICgqZ3Jp
ZFtyb3ddLnJvdylbY29sXTsKLSAgICB9Ci0gICAgY29uc3QgQ2VsbFN0cnVjdCYgY2VsbEF0KGlu
dCByb3csIGludCBjb2wpIGNvbnN0IHsKLQlyZXR1cm4gKCpncmlkW3Jvd10ucm93KVtjb2xdOwot
ICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCBwYWludChQYWludEluZm8mIGksIGludCB0eCwgaW50
IHR5KTsKLQotICAgIGludCBudW1Sb3dzKCkgY29uc3QgeyByZXR1cm4gZ3JpZFJvd3M7IH0KLSAg
ICBpbnQgZ2V0QmFzZWxpbmUoaW50IHJvdykge3JldHVybiBncmlkW3Jvd10uYmFzZUxpbmU7fQot
Ci0gICAgdm9pZCBzZXROZWVkQ2VsbFJlY2FsYygpIHsKLSAgICAgICAgbmVlZENlbGxSZWNhbGMg
PSB0cnVlOwotICAgICAgICB0YWJsZSgpLT5zZXROZWVkU2VjdGlvblJlY2FsYygpOwotICAgIH0K
LQotICAgIHZpcnR1YWwgUmVuZGVyT2JqZWN0KiByZW1vdmVDaGlsZE5vZGUoUmVuZGVyT2JqZWN0
KiBjaGlsZCk7Ci0KLSAgICAvLyB0aGlzIGdldHMgYSBjZWxsIGdyaWQgZGF0YSBzdHJ1Y3R1cmUu
IGNoYW5naW5nIHRoZSBudW1iZXIgb2YKLSAgICAvLyBjb2x1bW5zIGlzIGRvbmUgYnkgdGhlIHRh
YmxlCi0gICAgQXJyYXk8Um93U3RydWN0PiBncmlkOwotICAgIGludCBncmlkUm93czsKLSAgICBB
cnJheTxpbnQ+IHJvd1BvczsKLQotICAgIGludCBjQ29sOwotICAgIGludCBjUm93OwotICAgIGJv
b2wgbmVlZENlbGxSZWNhbGM7Ci0KLSAgICB2b2lkIHJlY2FsY0NlbGxzKCk7Ci1wcm90ZWN0ZWQ6
Ci0gICAgYm9vbCBlbnN1cmVSb3dzKGludCBudW1Sb3dzKTsKLSAgICB2b2lkIGNsZWFyR3JpZCgp
OwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBSZW5kZXJUYWJsZVJvdyA6IHB1
YmxpYyBSZW5kZXJDb250YWluZXIKLXsKLXB1YmxpYzoKLSAgICBSZW5kZXJUYWJsZVJvdyhET006
Ok5vZGVJbXBsKiBub2RlKTsKLQotICAgIHZpcnR1YWwgdm9pZCBkZXN0cm95KCk7Ci0KLSAgICB2
aXJ0dWFsIHZvaWQgc2V0U3R5bGUoUmVuZGVyU3R5bGUqKTsKLSAgICB2aXJ0dWFsIGNvbnN0IGNo
YXIgKnJlbmRlck5hbWUoKSBjb25zdCB7IHJldHVybiAiUmVuZGVyVGFibGVSb3ciOyB9Ci0KLSAg
ICB2aXJ0dWFsIGJvb2wgaXNUYWJsZVJvdygpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLQotICAg
IC8vIG92ZXJyaWRlcwotICAgIHZpcnR1YWwgdm9pZCBhZGRDaGlsZChSZW5kZXJPYmplY3QgKmNo
aWxkLCBSZW5kZXJPYmplY3QgKmJlZm9yZUNoaWxkID0gMCk7Ci0gICAgdmlydHVhbCBSZW5kZXJP
YmplY3QqIHJlbW92ZUNoaWxkTm9kZShSZW5kZXJPYmplY3QqIGNoaWxkKTsKLQotICAgIHZpcnR1
YWwgc2hvcnQgbGluZUhlaWdodChib29sKSBjb25zdCB7IHJldHVybiAwOyB9Ci0gICAgdmlydHVh
bCB2b2lkIHBvc2l0aW9uKGludCwgaW50LCBpbnQsIGludCwgaW50LCBib29sLCBib29sLCBpbnQp
IHt9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgbGF5b3V0KCk7Ci0gICAgdmlydHVhbCBJbnRSZWN0IGdl
dEFic29sdXRlUmVwYWludFJlY3QoKTsKLSAgICAKLSAgICBSZW5kZXJUYWJsZSAqdGFibGUoKSBj
b25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxSZW5kZXJUYWJsZSAqPihwYXJlbnQoKS0+cGFyZW50
KCkpOyB9Ci0gICAgUmVuZGVyVGFibGVTZWN0aW9uICpzZWN0aW9uKCkgY29uc3QgeyByZXR1cm4g
c3RhdGljX2Nhc3Q8UmVuZGVyVGFibGVTZWN0aW9uICo+KHBhcmVudCgpKTsgfQotCi0jaWZuZGVm
IE5ERUJVRwotICAgIHZpcnR1YWwgdm9pZCBkdW1wKFFUZXh0U3RyZWFtICpzdHJlYW0sIFFTdHJp
bmcgaW5kID0gIiIpIGNvbnN0OwotI2VuZGlmCi19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0K
LWNsYXNzIFJlbmRlclRhYmxlQ2VsbCA6IHB1YmxpYyBSZW5kZXJCbG9jawotewotcHVibGljOgot
ICAgIFJlbmRlclRhYmxlQ2VsbChET006Ok5vZGVJbXBsKiBub2RlKTsKLQotICAgIHZpcnR1YWwg
dm9pZCBkZXN0cm95KCk7Ci0KLSAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKnJlbmRlck5hbWUoKSBj
b25zdCB7IHJldHVybiAiUmVuZGVyVGFibGVDZWxsIjsgfQotICAgIHZpcnR1YWwgYm9vbCBpc1Rh
YmxlQ2VsbCgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLQotICAgIC8vIG92ZXJyaWRlcyBSZW5k
ZXJPYmplY3QKLSAgICB2aXJ0dWFsIGJvb2wgcmVxdWlyZXNMYXllcigpOwotCi0gICAgLy8gIyMj
IEZJWCB0aGVzZSB0d28uLi4KLSAgICBpbnQgY2VsbEluZGV4KCkgY29uc3QgeyByZXR1cm4gMDsg
fQotICAgIHZvaWQgc2V0Q2VsbEluZGV4KGludCkgeyB9Ci0KLSAgICBpbnQgY29sU3BhbigpIGNv
bnN0IHsgcmV0dXJuIGNTcGFuOyB9Ci0gICAgdm9pZCBzZXRDb2xTcGFuKGludCBjKSB7IGNTcGFu
ID0gYzsgfQotCi0gICAgaW50IHJvd1NwYW4oKSBjb25zdCB7IHJldHVybiByU3BhbjsgfQotICAg
IHZvaWQgc2V0Um93U3BhbihpbnQgcikgeyByU3BhbiA9IHI7IH0KLQotICAgIGludCBjb2woKSBj
b25zdCB7IHJldHVybiBfY29sOyB9Ci0gICAgdm9pZCBzZXRDb2woaW50IGNvbCkgeyBfY29sID0g
Y29sOyB9Ci0gICAgaW50IHJvdygpIGNvbnN0IHsgcmV0dXJuIF9yb3c7IH0KLSAgICB2b2lkIHNl
dFJvdyhpbnQgcikgeyBfcm93ID0gcjsgfQotCi0gICAgTGVuZ3RoIHN0eWxlT3JDb2xXaWR0aCgp
OwotCi0gICAgLy8gb3ZlcnJpZGVzCi0gICAgdmlydHVhbCB2b2lkIGNhbGNNaW5NYXhXaWR0aCgp
OwotICAgIHZpcnR1YWwgdm9pZCBjYWxjV2lkdGgoKTsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0V2lk
dGgoaW50IHdpZHRoKTsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0U3R5bGUoUmVuZGVyU3R5bGUgKnN0
eWxlKTsKLQotICAgIGludCBib3JkZXJMZWZ0KCkgY29uc3Q7Ci0gICAgaW50IGJvcmRlclJpZ2h0
KCkgY29uc3Q7Ci0gICAgaW50IGJvcmRlclRvcCgpIGNvbnN0OwotICAgIGludCBib3JkZXJCb3R0
b20oKSBjb25zdDsKLQotICAgIENvbGxhcHNlZEJvcmRlclZhbHVlIGNvbGxhcHNlZExlZnRCb3Jk
ZXIoKSBjb25zdDsKLSAgICBDb2xsYXBzZWRCb3JkZXJWYWx1ZSBjb2xsYXBzZWRSaWdodEJvcmRl
cigpIGNvbnN0OwotICAgIENvbGxhcHNlZEJvcmRlclZhbHVlIGNvbGxhcHNlZFRvcEJvcmRlcigp
IGNvbnN0OwotICAgIENvbGxhcHNlZEJvcmRlclZhbHVlIGNvbGxhcHNlZEJvdHRvbUJvcmRlcigp
IGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCBjb2xsZWN0Qm9yZGVycyhRVmFsdWVMaXN0PENvbGxh
cHNlZEJvcmRlclZhbHVlPiYgYm9yZGVyU3R5bGVzKTsKLQotICAgIHZpcnR1YWwgdm9pZCB1cGRh
dGVGcm9tRWxlbWVudCgpOwotCi0gICAgdmlydHVhbCB2b2lkIGxheW91dCgpOwotICAgIAotICAg
IHZvaWQgc2V0Q2VsbFRvcEV4dHJhKGludCBwKSB7IF90b3BFeHRyYSA9IHA7IH0KLSAgICB2b2lk
IHNldENlbGxCb3R0b21FeHRyYShpbnQgcCkgeyBfYm90dG9tRXh0cmEgPSBwOyB9Ci0KLSAgICB2
aXJ0dWFsIHZvaWQgcGFpbnQoUGFpbnRJbmZvJiBpLCBpbnQgdHgsIGludCB0eSk7Ci0KLSAgICB2
b2lkIHBhaW50Q29sbGFwc2VkQm9yZGVyKFFQYWludGVyKiBwLCBpbnQgeCwgaW50IHksIGludCB3
LCBpbnQgaCk7Ci0gICAgCi0gICAgLy8gbGllIHBvc2l0aW9uIHRvIG91dHNpZGUgb2JzZXJ2ZXJz
Ci0gICAgdmlydHVhbCBpbnQgeVBvcygpIGNvbnN0IHsgcmV0dXJuIG1feSArIF90b3BFeHRyYTsg
fQotCi0gICAgdmlydHVhbCB2b2lkIGNvbXB1dGVBYnNvbHV0ZVJlcGFpbnRSZWN0KEludFJlY3Qm
IHIsIGJvb2wgZj1mYWxzZSk7Ci0gICAgdmlydHVhbCBib29sIGFic29sdXRlUG9zaXRpb24oaW50
ICZ4UG9zLCBpbnQgJnlQb3MsIGJvb2wgZiA9IGZhbHNlKTsKLQotICAgIHZpcnR1YWwgc2hvcnQg
YmFzZWxpbmVQb3NpdGlvbihib29sID0gZmFsc2UpIGNvbnN0OwotCi0gICAgdmlydHVhbCBpbnQg
Ym9yZGVyVG9wRXh0cmEoKSBjb25zdCB7IHJldHVybiBfdG9wRXh0cmE7IH0KLSAgICB2aXJ0dWFs
IGludCBib3JkZXJCb3R0b21FeHRyYSgpIGNvbnN0IHsgcmV0dXJuIF9ib3R0b21FeHRyYTsgfQot
Ci0gICAgUmVuZGVyVGFibGUgKnRhYmxlKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8UmVu
ZGVyVGFibGUgKj4ocGFyZW50KCktPnBhcmVudCgpLT5wYXJlbnQoKSk7IH0KLSAgICBSZW5kZXJU
YWJsZVNlY3Rpb24gKnNlY3Rpb24oKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxSZW5kZXJU
YWJsZVNlY3Rpb24gKj4ocGFyZW50KCktPnBhcmVudCgpKTsgfQotCi0jaWZuZGVmIE5ERUJVRwot
ICAgIHZpcnR1YWwgdm9pZCBkdW1wKFFUZXh0U3RyZWFtICpzdHJlYW0sIFFTdHJpbmcgaW5kID0g
IiIpIGNvbnN0OwotI2VuZGlmCi0KLSAgICB2aXJ0dWFsIEludFJlY3QgZ2V0QWJzb2x1dGVSZXBh
aW50UmVjdCgpOwotICAgIAotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgdm9pZCBwYWludEJveERl
Y29yYXRpb25zKFBhaW50SW5mbyYgaSwgaW50IF90eCwgaW50IF90eSk7Ci0gICAgCi0gICAgaW50
IF9yb3c7Ci0gICAgaW50IF9jb2w7Ci0gICAgaW50IHJTcGFuOwotICAgIGludCBjU3BhbjsKLSAg
ICBpbnQgX3RvcEV4dHJhIDogMzE7Ci0gICAgYm9vbCBuV3JhcCA6IDE7Ci0gICAgaW50IF9ib3R0
b21FeHRyYSA6IDMxOwotICAgIGJvb2wgbV93aWR0aENoYW5nZWQgOiAxOwotICAgIAotICAgIGlu
dCBtX3BlcmNlbnRhZ2VIZWlnaHQ7Ci19OwotCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xh
c3MgUmVuZGVyVGFibGVDb2wgOiBwdWJsaWMgUmVuZGVyQ29udGFpbmVyCi17Ci1wdWJsaWM6Ci0g
ICAgUmVuZGVyVGFibGVDb2woRE9NOjpOb2RlSW1wbCogbm9kZSk7Ci0KLSAgICB2aXJ0dWFsIGNv
bnN0IGNoYXIgKnJlbmRlck5hbWUoKSBjb25zdCB7IHJldHVybiAiUmVuZGVyVGFibGVDb2wiOyB9
Ci0KLSAgICBpbnQgc3BhbigpIGNvbnN0IHsgcmV0dXJuIF9zcGFuOyB9Ci0gICAgdm9pZCBzZXRT
cGFuKGludCBzKSB7IF9zcGFuID0gczsgfQotCi0gICAgdmlydHVhbCB2b2lkIGFkZENoaWxkKFJl
bmRlck9iamVjdCAqY2hpbGQsIFJlbmRlck9iamVjdCAqYmVmb3JlQ2hpbGQgPSAwKTsKLQotICAg
IHZpcnR1YWwgYm9vbCBpc1RhYmxlQ29sKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotCi0gICAg
dmlydHVhbCBzaG9ydCBsaW5lSGVpZ2h0KGJvb2wpIGNvbnN0IHsgcmV0dXJuIDA7IH0KLQotICAg
IHZpcnR1YWwgdm9pZCB1cGRhdGVGcm9tRWxlbWVudCgpOwotCi0gICAgdmlydHVhbCBib29sIGNh
bkhhdmVDaGlsZHJlbigpIGNvbnN0OwotICAgIAotI2lmbmRlZiBOREVCVUcKLSAgICB2aXJ0dWFs
IHZvaWQgZHVtcChRVGV4dFN0cmVhbSAqc3RyZWFtLCBRU3RyaW5nIGluZCA9ICIiKSBjb25zdDsK
LSNlbmRpZgotCi1wcm90ZWN0ZWQ6Ci0gICAgaW50IF9zcGFuOwotfTsKLQotfTsKLSNlbmRpZgot
CkluZGV4OiByZW5kZXJpbmcvSW5saW5lVGV4dEJveC5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gcmVuZGVy
aW5nL0lubGluZVRleHRCb3guY3BwCShyZXZpc2lvbiAxMjI1MykKKysrIHJlbmRlcmluZy9Jbmxp
bmVUZXh0Qm94LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjgsNyArMjgsNyBAQAogI2luY2x1ZGUg
ImJyZWFrX2xpbmVzLmgiCiAjaW5jbHVkZSAia3htbGNvcmUvQWx3YXlzSW5saW5lLmgiCiAjaW5j
bHVkZSAicmVuZGVyX2FyZW5hLmgiCi0jaW5jbHVkZSAicmVuZGVyX2Jsb2NrLmgiCisjaW5jbHVk
ZSAiUmVuZGVyQmxvY2suaCIKICNpbmNsdWRlICJ4bWwvZG9tMl9yYW5nZWltcGwuaCIKICNpbmNs
dWRlICJEb2N1bWVudEltcGwuaCIKICNpbmNsdWRlIDxxcGVuLmg+CkluZGV4OiByZW5kZXJpbmcv
cmVuZGVyX2Jsb2NrLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gcmVuZGVyaW5nL3JlbmRlcl9ibG9jay5oCShy
ZXZpc2lvbiAxMjI1MykKKysrIHJlbmRlcmluZy9yZW5kZXJfYmxvY2suaAkod29ya2luZyBjb3B5
KQpAQCAtMSw0NDQgKzAsMCBAQAotLyoKLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSByZW5k
ZXIgb2JqZWN0IGltcGxlbWVudGF0aW9uIGZvciBLSFRNTC4KLSAqCi0gKiBDb3B5cmlnaHQgKEMp
IDE5OTkgTGFycyBLbm9sbCAoa25vbGxAa2RlLm9yZykKLSAqICAgICAgICAgICAoQykgMTk5OSBB
bnR0aSBLb2l2aXN0byAoa29pdmlzdG9Aa2RlLm9yZykKLSAqIENvcHlyaWdodCAoQykgMjAwMyBB
cHBsZSBDb21wdXRlciwgSW5jLgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJl
OyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUg
dGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1
Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNp
b24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lv
bi4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBp
dCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBl
dmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogTGlicmFyeSBHZW5l
cmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBo
YXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGlj
ZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJ
Qi4gIElmIG5vdCwgd3JpdGUgdG8KLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIElu
Yy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSAqIEJvc3RvbiwgTUEgMDIxMTEtMTMw
NywgVVNBLgotICoKLSAqLwotCi0jaWZuZGVmIFJFTkRFUl9CTE9DS19ICi0jZGVmaW5lIFJFTkRF
Ul9CTE9DS19ICi0KLSNpbmNsdWRlIDxxcHRybGlzdC5oPgotCi0jaW5jbHVkZSAicmVuZGVyX2Zs
b3cuaCIKLQotdHlwZWRlZiBlbnVtIHsKLSAgICBDdXJzb3JDYXJldCwKLSAgICBEcmFnQ2FyZXQs
Ci19IENhcmV0VHlwZTsKLQotbmFtZXNwYWNlIERPTSB7Ci0gICAgY2xhc3MgUG9zaXRpb247Ci19
Ci0KLW5hbWVzcGFjZSBraHRtbCB7Ci0KLWNsYXNzIFJlbmRlckJsb2NrIDogcHVibGljIFJlbmRl
ckZsb3cKLXsKLXB1YmxpYzoKLSAgICBSZW5kZXJCbG9jayhET006Ok5vZGVJbXBsKiBub2RlKTsK
LSAgICB2aXJ0dWFsIH5SZW5kZXJCbG9jaygpOwotCi0gICAgdmlydHVhbCBjb25zdCBjaGFyICpy
ZW5kZXJOYW1lKCkgY29uc3Q7Ci0KLSAgICAvLyBUaGVzZSB0d28gZnVuY3Rpb25zIGFyZSBvdmVy
cmlkZGVuIGZvciBpbmxpbmUtYmxvY2suCi0gICAgdmlydHVhbCBzaG9ydCBsaW5lSGVpZ2h0KGJv
b2wgYiwgYm9vbCBpc1Jvb3RMaW5lQm94PWZhbHNlKSBjb25zdDsKLSAgICB2aXJ0dWFsIHNob3J0
IGJhc2VsaW5lUG9zaXRpb24oYm9vbCBiLCBib29sIGlzUm9vdExpbmVCb3g9ZmFsc2UpIGNvbnN0
OwotICAgIAotICAgIHZpcnR1YWwgYm9vbCBpc1JlbmRlckJsb2NrKCkgY29uc3QgeyByZXR1cm4g
dHJ1ZTsgfQotICAgIHZpcnR1YWwgYm9vbCBpc0Jsb2NrRmxvdygpIGNvbnN0IHsgcmV0dXJuICgh
aXNJbmxpbmUoKSB8fCBpc1JlcGxhY2VkKCkpICYmICFpc1RhYmxlKCk7IH0KLSAgICB2aXJ0dWFs
IGJvb2wgaXNJbmxpbmVGbG93KCkgY29uc3QgeyByZXR1cm4gaXNJbmxpbmUoKSAmJiAhaXNSZXBs
YWNlZCgpOyB9Ci0gICAgdmlydHVhbCBib29sIGlzSW5saW5lQmxvY2tPcklubGluZVRhYmxlKCkg
Y29uc3QgeyByZXR1cm4gaXNJbmxpbmUoKSAmJiBpc1JlcGxhY2VkKCk7IH0KLSAgICAKLSAgICB2
aXJ0dWFsIGJvb2wgY2hpbGRyZW5JbmxpbmUoKSBjb25zdCB7IHJldHVybiBtX2NoaWxkcmVuSW5s
aW5lOyB9Ci0gICAgdmlydHVhbCB2b2lkIHNldENoaWxkcmVuSW5saW5lKGJvb2wgYikgeyBtX2No
aWxkcmVuSW5saW5lID0gYjsgfQotICAgIHZvaWQgbWFrZUNoaWxkcmVuTm9uSW5saW5lKFJlbmRl
ck9iamVjdCogaW5zZXJ0aW9uUG9pbnQgPSAwKTsKLQotICAgIC8vIFRoZSBoZWlnaHQgKGFuZCB3
aWR0aCkgb2YgYSBibG9jayB3aGVuIHlvdSBpbmNsdWRlIG92ZXJmbG93IHNwaWxsYWdlIG91dCBv
ZiB0aGUgYm90dG9tCi0gICAgLy8gb2YgdGhlIGJsb2NrIChlLmcuLCBhIDxkaXYgc3R5bGU9Imhl
aWdodDoyNXB4Ij4gdGhhdCBoYXMgYSAxMDBweCB0YWxsIGltYWdlIGluc2lkZQotICAgIC8vIGl0
IHdvdWxkIGhhdmUgYW4gb3ZlcmZsb3cgaGVpZ2h0IG9mIGJvcmRlclRvcCgpICsgcGFkZGluZ1Rv
cCgpICsgMTAwcHguCi0gICAgdmlydHVhbCBpbnQgb3ZlcmZsb3dIZWlnaHQoYm9vbCBpbmNsdWRl
SW50ZXJpb3I9dHJ1ZSkgY29uc3Q7Ci0gICAgdmlydHVhbCBpbnQgb3ZlcmZsb3dXaWR0aChib29s
IGluY2x1ZGVJbnRlcmlvcj10cnVlKSBjb25zdDsKLSAgICB2aXJ0dWFsIGludCBvdmVyZmxvd0xl
ZnQoYm9vbCBpbmNsdWRlSW50ZXJpb3I9dHJ1ZSkgY29uc3Q7Ci0gICAgdmlydHVhbCBpbnQgb3Zl
cmZsb3dUb3AoYm9vbCBpbmNsdWRlSW50ZXJpb3I9dHJ1ZSkgY29uc3Q7Ci0gICAgdmlydHVhbCBJ
bnRSZWN0IG92ZXJmbG93UmVjdChib29sIGluY2x1ZGVJbnRlcmlvcj10cnVlKSBjb25zdDsKLSAg
ICB2aXJ0dWFsIHZvaWQgc2V0T3ZlcmZsb3dIZWlnaHQoaW50IGgpIHsgbV9vdmVyZmxvd0hlaWdo
dCA9IGg7IH0KLSAgICB2aXJ0dWFsIHZvaWQgc2V0T3ZlcmZsb3dXaWR0aChpbnQgdykgeyBtX292
ZXJmbG93V2lkdGggPSB3OyB9Ci0gICAgCi0gICAgdmlydHVhbCBib29sIGlzU2VsZkNvbGxhcHNp
bmdCbG9jaygpIGNvbnN0OwotICAgIHZpcnR1YWwgYm9vbCBpc1RvcE1hcmdpblF1aXJrKCkgY29u
c3QgeyByZXR1cm4gbV90b3BNYXJnaW5RdWlyazsgfQotICAgIHZpcnR1YWwgYm9vbCBpc0JvdHRv
bU1hcmdpblF1aXJrKCkgY29uc3QgeyByZXR1cm4gbV9ib3R0b21NYXJnaW5RdWlyazsgfQotCi0g
ICAgdmlydHVhbCBpbnQgbWF4VG9wTWFyZ2luKGJvb2wgcG9zaXRpdmUpIGNvbnN0IHsKLSAgICAg
ICAgaWYgKHBvc2l0aXZlKQotICAgICAgICAgICAgcmV0dXJuIG1fbWF4VG9wUG9zTWFyZ2luOwot
ICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gbV9tYXhUb3BOZWdNYXJnaW47Ci0gICAg
fQotICAgIHZpcnR1YWwgaW50IG1heEJvdHRvbU1hcmdpbihib29sIHBvc2l0aXZlKSBjb25zdCB7
Ci0gICAgICAgIGlmIChwb3NpdGl2ZSkKLSAgICAgICAgICAgIHJldHVybiBtX21heEJvdHRvbVBv
c01hcmdpbjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIG1fbWF4Qm90dG9tTmVn
TWFyZ2luOwotICAgIH0KLQotICAgIHZvaWQgaW5pdE1heE1hcmdpblZhbHVlcygpIHsKLSAgICAg
ICAgaWYgKG1fbWFyZ2luVG9wID49IDApIHsKLSAgICAgICAgICAgIG1fbWF4VG9wUG9zTWFyZ2lu
ID0gbV9tYXJnaW5Ub3A7Ci0gICAgICAgICAgICBtX21heFRvcE5lZ01hcmdpbiA9IDA7Ci0gICAg
ICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX21heFRvcE5lZ01hcmdpbiA9IC1tX21hcmdpblRv
cDsKLSAgICAgICAgICAgIG1fbWF4VG9wUG9zTWFyZ2luID0gMDsKLSAgICAgICAgfQotICAgICAg
ICBpZiAobV9tYXJnaW5Cb3R0b20gPj0gMCkgewotICAgICAgICAgICAgbV9tYXhCb3R0b21Qb3NN
YXJnaW4gPSBtX21hcmdpbkJvdHRvbTsKLSAgICAgICAgICAgIG1fbWF4Qm90dG9tTmVnTWFyZ2lu
ID0gMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1fbWF4Qm90dG9tTmVnTWFyZ2lu
ID0gLW1fbWFyZ2luQm90dG9tOwotICAgICAgICAgICAgbV9tYXhCb3R0b21Qb3NNYXJnaW4gPSAw
OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIGFkZENoaWxkVG9GbG93KFJl
bmRlck9iamVjdCogbmV3Q2hpbGQsIFJlbmRlck9iamVjdCogYmVmb3JlQ2hpbGQpOwotICAgIHZp
cnR1YWwgdm9pZCByZW1vdmVDaGlsZChSZW5kZXJPYmplY3QgKm9sZENoaWxkKTsKLQotICAgIHZp
cnR1YWwgdm9pZCByZXBhaW50T2JqZWN0c0JlZm9yZUxheW91dCgpOwotICAgIHZpcnR1YWwgdm9p
ZCByZXBhaW50RmxvYXRpbmdEZXNjZW5kYW50cygpOwotICAgIHZpcnR1YWwgdm9pZCBnZXRBYnNv
bHV0ZVJlcGFpbnRSZWN0SW5jbHVkaW5nRmxvYXRzKEludFJlY3QmIGJvdW5kcywgSW50UmVjdCYg
ZnVsbEJvdW5kcyk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgc2V0U3R5bGUoUmVuZGVyU3R5bGUqIF9z
dHlsZSk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgbGF5b3V0KCk7Ci0gICAgdmlydHVhbCB2b2lkIGxh
eW91dEJsb2NrKGJvb2wgcmVsYXlvdXRDaGlsZHJlbik7Ci0gICAgdm9pZCBsYXlvdXRCbG9ja0No
aWxkcmVuKGJvb2wgcmVsYXlvdXRDaGlsZHJlbik7Ci0gICAgSW50UmVjdCBsYXlvdXRJbmxpbmVD
aGlsZHJlbihib29sIHJlbGF5b3V0Q2hpbGRyZW4pOwotCi0gICAgdm9pZCBsYXlvdXRQb3NpdGlv
bmVkT2JqZWN0cyggYm9vbCByZWxheW91dENoaWxkcmVuICk7Ci0gICAgdm9pZCBpbnNlcnRQb3Np
dGlvbmVkT2JqZWN0KFJlbmRlck9iamVjdCAqbyk7Ci0gICAgdm9pZCByZW1vdmVQb3NpdGlvbmVk
T2JqZWN0KFJlbmRlck9iamVjdCAqbyk7Ci0KLSAgICAvLyBDYWxsZWQgdG8gbGF5IG91dCB0aGUg
bGVnZW5kIGZvciBhIGZpZWxkc2V0LgotICAgIHZpcnR1YWwgUmVuZGVyT2JqZWN0KiBsYXlvdXRM
ZWdlbmQoYm9vbCByZWxheW91dENoaWxkcmVuKSB7IHJldHVybiAwOyB9OwotICAgIAotICAgIC8v
IHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBpcyBpbiBiaWRp
LmNwcAotICAgIHZvaWQgYmlkaVJlb3JkZXJMaW5lKGNvbnN0IEJpZGlJdGVyYXRvciAmc3RhcnQs
IGNvbnN0IEJpZGlJdGVyYXRvciAmZW5kLCBCaWRpU3RhdGUgJmJpZGkgKTsKLSAgICBSb290SW5s
aW5lQm94KiBkZXRlcm1pbmVTdGFydFBvc2l0aW9uKGJvb2wgZnVsbExheW91dCwgQmlkaUl0ZXJh
dG9yICZzdGFydCwgQmlkaVN0YXRlICZiaWRpKTsKLSAgICBSb290SW5saW5lQm94KiBkZXRlcm1p
bmVFbmRQb3NpdGlvbihSb290SW5saW5lQm94KiBzdGFydEJveCwgQmlkaUl0ZXJhdG9yJiBjbGVh
bkxpbmVTdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWRp
U3RhdHVzJiBjbGVhbkxpbmVCaWRpU3RhdHVzLCBCaWRpQ29udGV4dComIGNsZWFuTGluZUJpZGlD
b250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgeVBv
cyk7Ci0gICAgYm9vbCBtYXRjaGVkRW5kTGluZShjb25zdCBCaWRpSXRlcmF0b3ImIHN0YXJ0LCBj
b25zdCBCaWRpU3RhdHVzJiBzdGF0dXMsIEJpZGlDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAg
ICAgICAgICAgICAgICAgY29uc3QgQmlkaUl0ZXJhdG9yJiBlbmRMaW5lU3RhcnQsIGNvbnN0IEJp
ZGlTdGF0dXMmIGVuZExpbmVTdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBCaWRpQ29u
dGV4dCogZW5kTGluZUNvbnRleHQsIFJvb3RJbmxpbmVCb3gqJiBlbmRMaW5lLCBpbnQmIGVuZFlQ
b3MpOwotICAgIGludCBza2lwV2hpdGVzcGFjZShCaWRpSXRlcmF0b3IgJiwgQmlkaVN0YXRlICYp
OwotICAgIEJpZGlJdGVyYXRvciBmaW5kTmV4dExpbmVCcmVhayhCaWRpSXRlcmF0b3IgJnN0YXJ0
LCBCaWRpU3RhdGUgJmluZm8gKTsKLSAgICBSb290SW5saW5lQm94KiBjb25zdHJ1Y3RMaW5lKGNv
bnN0IEJpZGlJdGVyYXRvciYgc3RhcnQsIGNvbnN0IEJpZGlJdGVyYXRvciYgZW5kKTsKLSAgICBJ
bmxpbmVGbG93Qm94KiBjcmVhdGVMaW5lQm94ZXMoUmVuZGVyT2JqZWN0KiBvYmopOwotICAgIGlu
dCB0YWJXaWR0aChib29sIGlzV2hpdGVzcGFjZVByZSk7Ci0gICAgdm9pZCBjb21wdXRlSG9yaXpv
bnRhbFBvc2l0aW9uc0ZvckxpbmUoUm9vdElubGluZUJveCogbGluZUJveCwgQmlkaVN0YXRlICZi
aWRpKTsKLSAgICB2b2lkIGNvbXB1dGVWZXJ0aWNhbFBvc2l0aW9uc0ZvckxpbmUoUm9vdElubGlu
ZUJveCogbGluZUJveCk7Ci0gICAgdm9pZCBjaGVja0xpbmVzRm9yT3ZlcmZsb3coKTsKLSAgICB2
b2lkIGRlbGV0ZUVsbGlwc2lzTGluZUJveGVzKCk7Ci0gICAgdm9pZCBjaGVja0xpbmVzRm9yVGV4
dE92ZXJmbG93KCk7Ci0gICAgLy8gZW5kIGJpZGkuY3BwIGZ1bmN0aW9ucwotICAgIAotICAgIHZp
cnR1YWwgdm9pZCBwYWludChQYWludEluZm8mIGksIGludCB0eCwgaW50IHR5KTsKLSAgICB2aXJ0
dWFsIHZvaWQgcGFpbnRPYmplY3QoUGFpbnRJbmZvJiBpLCBpbnQgdHgsIGludCB0eSk7Ci0gICAg
dm9pZCBwYWludEZsb2F0cyhQYWludEluZm8mIGksIGludCBfdHgsIGludCBfdHksIGJvb2wgcGFp
bnRTZWxlY3Rpb24gPSBmYWxzZSk7Ci0gICAgdm9pZCBwYWludENoaWxkcmVuKFBhaW50SW5mbyYg
aSwgaW50IF90eCwgaW50IF90eSk7Ci0gICAgdm9pZCBwYWludEVsbGlwc2lzQm94ZXMoUGFpbnRJ
bmZvJiBpLCBpbnQgX3R4LCBpbnQgX3R5KTsKLSAgICB2b2lkIHBhaW50U2VsZWN0aW9uKFBhaW50
SW5mbyYgaSwgaW50IF90eCwgaW50IF90eSk7Ci0gICAgdm9pZCBwYWludENhcmV0KFBhaW50SW5m
byYgaSwgQ2FyZXRUeXBlKTsKLSAgICAKLSAgICB2b2lkIGluc2VydEZsb2F0aW5nT2JqZWN0KFJl
bmRlck9iamVjdCAqbyk7Ci0gICAgdm9pZCByZW1vdmVGbG9hdGluZ09iamVjdChSZW5kZXJPYmpl
Y3QgKm8pOwotCi0gICAgLy8gY2FsbGVkIGZyb20gbGluZVdpZHRoLCB0byBwb3NpdGlvbiB0aGUg
ZmxvYXRzIGFkZGVkIGluIHRoZSBsYXN0IGxpbmUuCi0gICAgdm9pZCBwb3NpdGlvbk5ld0Zsb2F0
cygpOwotICAgIHZvaWQgY2xlYXJGbG9hdHMoKTsKLSAgICBpbnQgZ2V0Q2xlYXJEZWx0YShSZW5k
ZXJPYmplY3QgKmNoaWxkKTsKLSAgICB2aXJ0dWFsIHZvaWQgbWFya0FsbERlc2NlbmRhbnRzV2l0
aEZsb2F0c0ZvckxheW91dChSZW5kZXJPYmplY3QqIGZsb2F0VG9SZW1vdmUgPSAwKTsKLSAgICB2
b2lkIG1hcmtQb3NpdGlvbmVkT2JqZWN0c0ZvckxheW91dCgpOwotCi0gICAgdmlydHVhbCBib29s
IGNvbnRhaW5zRmxvYXRzKCkgeyByZXR1cm4gbV9mbG9hdGluZ09iamVjdHMhPTA7IH0KLSAgICB2
aXJ0dWFsIGJvb2wgY29udGFpbnNGbG9hdChSZW5kZXJPYmplY3QqIG8pOwotCi0gICAgdmlydHVh
bCBib29sIGhhc092ZXJoYW5naW5nRmxvYXRzKCkgeyByZXR1cm4gZmxvYXRCb3R0b20oKSA+IG1f
aGVpZ2h0OyB9Ci0gICAgdm9pZCBhZGRJbnRydWRpbmdGbG9hdHMoUmVuZGVyQmxvY2sqIHByZXYs
IGludCB4b2Zmc2V0LCBpbnQgeW9mZnNldCk7Ci0gICAgdm9pZCBhZGRPdmVyaGFuZ2luZ0Zsb2F0
cyhSZW5kZXJCbG9jayogY2hpbGQsIGludCB4b2Zmc2V0LCBpbnQgeW9mZnNldCk7Ci0KLSAgICBp
bnQgbmVhcmVzdEZsb2F0Qm90dG9tKGludCBoZWlnaHQpIGNvbnN0OwotICAgIGludCBmbG9hdEJv
dHRvbSgpIGNvbnN0OwotICAgIGlubGluZSBpbnQgbGVmdEJvdHRvbSgpOwotICAgIGlubGluZSBp
bnQgcmlnaHRCb3R0b20oKTsKLSAgICB2aXJ0dWFsIEludFJlY3QgZmxvYXRSZWN0KCkgY29uc3Q7
Ci0KLSAgICB2aXJ0dWFsIGludCBsaW5lV2lkdGgoaW50IHkpIGNvbnN0OwotICAgIHZpcnR1YWwg
aW50IGxvd2VzdFBvc2l0aW9uKGJvb2wgaW5jbHVkZU92ZXJmbG93SW50ZXJpb3I9dHJ1ZSwgYm9v
bCBpbmNsdWRlU2VsZj10cnVlKSBjb25zdDsKLSAgICB2aXJ0dWFsIGludCByaWdodG1vc3RQb3Np
dGlvbihib29sIGluY2x1ZGVPdmVyZmxvd0ludGVyaW9yPXRydWUsIGJvb2wgaW5jbHVkZVNlbGY9
dHJ1ZSkgY29uc3Q7Ci0gICAgdmlydHVhbCBpbnQgbGVmdG1vc3RQb3NpdGlvbihib29sIGluY2x1
ZGVPdmVyZmxvd0ludGVyaW9yPXRydWUsIGJvb2wgaW5jbHVkZVNlbGY9dHJ1ZSkgY29uc3Q7Ci0K
LSAgICBpbnQgcmlnaHRPZmZzZXQoKSBjb25zdDsKLSAgICBpbnQgcmlnaHRSZWxPZmZzZXQoaW50
IHksIGludCBmaXhlZE9mZnNldCwgYm9vbCBhcHBseVRleHRJbmRlbnQgPSB0cnVlLAotICAgICAg
ICAgICAgICAgICAgICAgICBpbnQgKmhlaWdodFJlbWFpbmluZyA9IDApIGNvbnN0OwotICAgIGlu
dCByaWdodE9mZnNldChpbnQgeSkgY29uc3QgeyByZXR1cm4gcmlnaHRSZWxPZmZzZXQoeSwgcmln
aHRPZmZzZXQoKSwgdHJ1ZSk7IH0KLQotICAgIGludCBsZWZ0T2Zmc2V0KCkgY29uc3Q7Ci0gICAg
aW50IGxlZnRSZWxPZmZzZXQoaW50IHksIGludCBmaXhlZE9mZnNldCwgYm9vbCBhcHBseVRleHRJ
bmRlbnQgPSB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgIGludCAqaGVpZ2h0UmVtYWluaW5n
ID0gMCkgY29uc3Q7Ci0gICAgaW50IGxlZnRPZmZzZXQoaW50IHkpIGNvbnN0IHsgcmV0dXJuIGxl
ZnRSZWxPZmZzZXQoeSwgbGVmdE9mZnNldCgpLCB0cnVlKTsgfQotCi0gICAgdmlydHVhbCBib29s
IG5vZGVBdFBvaW50KE5vZGVJbmZvJiBpbmZvLCBpbnQgeCwgaW50IHksIGludCB0eCwgaW50IHR5
LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIaXRUZXN0QWN0aW9uIGhpdFRlc3RBY3Rp
b24pOwotCi0gICAgYm9vbCBpc1BvaW50SW5TY3JvbGxiYXIoaW50IHgsIGludCB5LCBpbnQgdHgs
IGludCB0eSk7Ci0KLSAgICB2aXJ0dWFsIFZpc2libGVQb3NpdGlvbiBwb3NpdGlvbkZvckNvb3Jk
aW5hdGVzKGludCB4LCBpbnQgeSk7Ci0gICAgCi0gICAgdmlydHVhbCB2b2lkIGNhbGNNaW5NYXhX
aWR0aCgpOwotICAgIHZvaWQgY2FsY0lubGluZU1pbk1heFdpZHRoKCk7Ci0gICAgdm9pZCBjYWxj
QmxvY2tNaW5NYXhXaWR0aCgpOwotCi0gICAgdmlydHVhbCBpbnQgZ2V0QmFzZWxpbmVPZkZpcnN0
TGluZUJveCgpIGNvbnN0OwotICAgIHZpcnR1YWwgaW50IGdldEJhc2VsaW5lT2ZMYXN0TGluZUJv
eCgpIGNvbnN0OwotCi0gICAgUm9vdElubGluZUJveCogZmlyc3RSb290Qm94KCkgY29uc3QgeyBy
ZXR1cm4gc3RhdGljX2Nhc3Q8Um9vdElubGluZUJveCo+KG1fZmlyc3RMaW5lQm94KTsgfQotICAg
IFJvb3RJbmxpbmVCb3gqIGxhc3RSb290Qm94KCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8
Um9vdElubGluZUJveCo+KG1fbGFzdExpbmVCb3gpOyB9Ci0KLSAgICAvLyBPYnRhaW5zIHRoZSBu
ZWFyZXN0IGVuY2xvc2luZyBibG9jayAoaW5jbHVkaW5nIHRoaXMgYmxvY2spIHRoYXQgY29udHJp
YnV0ZXMgYSBmaXJzdC1saW5lIHN0eWxlIHRvIG91ciBpbmxpbmUKLSAgICAvLyBjaGlsZHJlbi4K
LSAgICB2aXJ0dWFsIFJlbmRlckJsb2NrKiBmaXJzdExpbmVCbG9jaygpIGNvbnN0OwotICAgIHZp
cnR1YWwgdm9pZCB1cGRhdGVGaXJzdExldHRlcigpOwotICAgIAotICAgIGJvb2wgaW5Sb290Qmxv
Y2tDb250ZXh0KCkgY29uc3Q7Ci0KLSAgICB2b2lkIHNldEhhc01hcmt1cFRydW5jYXRpb24oYm9v
bCBiPXRydWUpIHsgbV9oYXNNYXJrdXBUcnVuY2F0aW9uID0gYjsgfQotICAgIGJvb2wgaGFzTWFy
a3VwVHJ1bmNhdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1faGFzTWFya3VwVHJ1bmNhdGlvbjsgfQot
Ci0gICAgdmlydHVhbCBib29sIGhhc1NlbGVjdGVkQ2hpbGRyZW4oKSBjb25zdCB7IHJldHVybiBt
X3NlbGVjdGlvblN0YXRlICE9IFNlbGVjdGlvbk5vbmU7IH0KLSAgICB2aXJ0dWFsIFNlbGVjdGlv
blN0YXRlIHNlbGVjdGlvblN0YXRlKCkgY29uc3QgeyByZXR1cm4gbV9zZWxlY3Rpb25TdGF0ZTsg
fQotICAgIHZpcnR1YWwgdm9pZCBzZXRTZWxlY3Rpb25TdGF0ZShTZWxlY3Rpb25TdGF0ZSBzKTsK
LQotICAgIHN0cnVjdCBCbG9ja1NlbGVjdGlvbkluZm8gewotICAgICAgICBSZW5kZXJCbG9jayog
bV9ibG9jazsKLSAgICAgICAgR2FwUmVjdHMgbV9yZWN0czsKLSAgICAgICAgU2VsZWN0aW9uU3Rh
dGUgbV9zdGF0ZTsKLQotICAgICAgICBCbG9ja1NlbGVjdGlvbkluZm8oKSB7IG1fYmxvY2sgPSAw
OyBtX3N0YXRlID0gU2VsZWN0aW9uTm9uZTsgfQotICAgICAgICBCbG9ja1NlbGVjdGlvbkluZm8o
UmVuZGVyQmxvY2sqIGIpIHsgCi0gICAgICAgICAgICBtX2Jsb2NrID0gYjsKLSAgICAgICAgICAg
IG1fc3RhdGUgPSBtX2Jsb2NrLT5zZWxlY3Rpb25TdGF0ZSgpOwotICAgICAgICAgICAgbV9yZWN0
cyA9IG1fYmxvY2stPnNlbGVjdGlvbkdhcFJlY3RzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0g
ICAgICAgIEdhcFJlY3RzIHJlY3RzKCkgY29uc3QgeyByZXR1cm4gbV9yZWN0czsgfQotICAgICAg
ICBTZWxlY3Rpb25TdGF0ZSBzdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1fc3RhdGU7IH0KLSAgICAg
ICAgUmVuZGVyQmxvY2sqIGJsb2NrKCkgY29uc3QgeyByZXR1cm4gbV9ibG9jazsgfQotICAgIH07
Ci0gICAgCi0gICAgdmlydHVhbCBJbnRSZWN0IHNlbGVjdGlvblJlY3QoKSB7IHJldHVybiBzZWxl
Y3Rpb25HYXBSZWN0cygpOyB9Ci0gICAgR2FwUmVjdHMgc2VsZWN0aW9uR2FwUmVjdHMoKTsKLSAg
ICB2aXJ0dWFsIGJvb2wgc2hvdWxkUGFpbnRTZWxlY3Rpb25HYXBzKCkgY29uc3Q7Ci0gICAgYm9v
bCBpc1NlbGVjdGlvblJvb3QoKSBjb25zdDsKLSAgICBHYXBSZWN0cyBmaWxsU2VsZWN0aW9uR2Fw
cyhSZW5kZXJCbG9jayogcm9vdEJsb2NrLCBpbnQgYmxvY2tYLCBpbnQgYmxvY2tZLCBpbnQgdHgs
IGludCB0eSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBsYXN0VG9wLCBp
bnQmIGxhc3RMZWZ0LCBpbnQmIGxhc3RSaWdodCwgY29uc3QgUGFpbnRJbmZvKiBpID0gMCk7Ci0g
ICAgR2FwUmVjdHMgZmlsbElubGluZVNlbGVjdGlvbkdhcHMoUmVuZGVyQmxvY2sqIHJvb3RCbG9j
aywgaW50IGJsb2NrWCwgaW50IGJsb2NrWSwgaW50IHR4LCBpbnQgdHksCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBsYXN0VG9wLCBpbnQmIGxhc3RMZWZ0LCBpbnQm
IGxhc3RSaWdodCwgY29uc3QgUGFpbnRJbmZvKiBpKTsKLSAgICBHYXBSZWN0cyBmaWxsQmxvY2tT
ZWxlY3Rpb25HYXBzKFJlbmRlckJsb2NrKiByb290QmxvY2ssIGludCBibG9ja1gsIGludCBibG9j
a1ksIGludCB0eCwgaW50IHR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
aW50JiBsYXN0VG9wLCBpbnQmIGxhc3RMZWZ0LCBpbnQmIGxhc3RSaWdodCwgY29uc3QgUGFpbnRJ
bmZvKiBpKTsKLSAgICBJbnRSZWN0IGZpbGxWZXJ0aWNhbFNlbGVjdGlvbkdhcChpbnQgbGFzdFRv
cCwgaW50IGxhc3RMZWZ0LCBpbnQgbGFzdFJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBpbnQgYm90dG9tWSwgUmVuZGVyQmxvY2sqIHJvb3RCbG9jaywgaW50IGJsb2Nr
WCwgaW50IGJsb2NrWSwgY29uc3QgUGFpbnRJbmZvKiBpKTsKLSAgICBJbnRSZWN0IGZpbGxMZWZ0
U2VsZWN0aW9uR2FwKFJlbmRlck9iamVjdCogc2VsT2JqLCBpbnQgeFBvcywgaW50IHlQb3MsIGlu
dCBoZWlnaHQsIFJlbmRlckJsb2NrKiByb290QmxvY2ssIGludCBibG9ja1gsIGludCBibG9ja1ks
IGludCB0eCwgaW50IHR5LCBjb25zdCBQYWludEluZm8qIGkpOwotICAgIEludFJlY3QgZmlsbFJp
Z2h0U2VsZWN0aW9uR2FwKFJlbmRlck9iamVjdCogc2VsT2JqLCBpbnQgeFBvcywgaW50IHlQb3Ms
IGludCBoZWlnaHQsIFJlbmRlckJsb2NrKiByb290QmxvY2ssIGludCBibG9ja1gsIGludCBibG9j
a1ksIGludCB0eCwgaW50IHR5LCBjb25zdCBQYWludEluZm8qIGkpOwotICAgIEludFJlY3QgZmls
bEhvcml6b250YWxTZWxlY3Rpb25HYXAoUmVuZGVyT2JqZWN0KiBzZWxPYmosIGludCB4UG9zLCBp
bnQgeVBvcywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBjb25zdCBQYWludEluZm8qIGkpOwotCi0g
ICAgdm9pZCBnZXRIb3Jpem9udGFsU2VsZWN0aW9uR2FwSW5mbyhTZWxlY3Rpb25TdGF0ZSBzdGF0
ZSwgYm9vbCYgbGVmdEdhcCwgYm9vbCYgcmlnaHRHYXApOwotICAgIGludCBsZWZ0U2VsZWN0aW9u
T2Zmc2V0KFJlbmRlckJsb2NrKiByb290QmxvY2ssIGludCB5KTsKLSAgICBpbnQgcmlnaHRTZWxl
Y3Rpb25PZmZzZXQoUmVuZGVyQmxvY2sqIHJvb3RCbG9jaywgaW50IHkpOwotCi0jaWZuZGVmIE5E
RUJVRwotICAgIHZpcnR1YWwgdm9pZCBwcmludFRyZWUoaW50IGluZGVudD0wKSBjb25zdDsKLSAg
ICB2aXJ0dWFsIHZvaWQgZHVtcChRVGV4dFN0cmVhbSAqc3RyZWFtLCBRU3RyaW5nIGluZCA9ICIi
KSBjb25zdDsKLSNlbmRpZgotCi0gICAgLy8gSGVscGVyIG1ldGhvZHMgZm9yIGNvbXB1dGluZyBs
aW5lIGNvdW50cyBhbmQgaGVpZ2h0cyBmb3IgbGluZSBjb3VudHMuCi0gICAgUm9vdElubGluZUJv
eCogbGluZUF0SW5kZXgoaW50IGkpOwotICAgIGludCBsaW5lQ291bnQoKTsKLSAgICBpbnQgaGVp
Z2h0Rm9yTGluZUNvdW50KGludCBsKTsKLSAgICB2b2lkIGNsZWFyVHJ1bmNhdGlvbigpOwotCi1w
cm90ZWN0ZWQ6Ci0gICAgdm9pZCBuZXdMaW5lKCk7Ci0KLXByaXZhdGU6Ci0gICAgRE9NOjpQb3Np
dGlvbiBwb3NpdGlvbkZvckJveChJbmxpbmVCb3ggKmJveCwgYm9vbCBzdGFydD10cnVlKSBjb25z
dDsKLSAgICBET006OlBvc2l0aW9uIHBvc2l0aW9uRm9yUmVuZGVyZXIoUmVuZGVyT2JqZWN0ICpy
ZW5kZXJlciwgYm9vbCBzdGFydD10cnVlKSBjb25zdDsKLSAgICAKLXByb3RlY3RlZDoKLSAgICBz
dHJ1Y3QgRmxvYXRpbmdPYmplY3QgewotICAgICAgICBlbnVtIFR5cGUgewotICAgICAgICAgICAg
RmxvYXRMZWZ0LAotICAgICAgICAgICAgRmxvYXRSaWdodAotICAgICAgICB9OwotCi0gICAgICAg
IEZsb2F0aW5nT2JqZWN0KFR5cGUgX3R5cGUpIHsKLSAgICAgICAgICAgIG5vZGUgPSAwOwotICAg
ICAgICAgICAgc3RhcnRZID0gMDsKLSAgICAgICAgICAgIGVuZFkgPSAwOwotICAgICAgICAgICAg
dHlwZSA9IF90eXBlOwotICAgICAgICAgICAgbGVmdCA9IDA7Ci0gICAgICAgICAgICB3aWR0aCA9
IDA7Ci0gICAgICAgICAgICBub1BhaW50ID0gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBS
ZW5kZXJPYmplY3QqIG5vZGU7Ci0gICAgICAgIGludCBzdGFydFk7Ci0gICAgICAgIGludCBlbmRZ
OwotICAgICAgICBpbnQgbGVmdDsKLSAgICAgICAgaW50IHdpZHRoOwotICAgICAgICBUeXBlIHR5
cGUgOiAxOyAvLyBsZWZ0IG9yIHJpZ2h0IGFsaWduZWQKLSAgICAgICAgYm9vbCBub1BhaW50IDog
MTsKLSAgICB9OwotICAgIAotICAgIC8vIFRoZSBmb2xsb3dpbmcgaGVscGVyIGZ1bmN0aW9ucyBh
bmQgc3RydWN0cyBhcmUgdXNlZCBieSBsYXlvdXRCbG9ja0NoaWxkcmVuLgotICAgIGNsYXNzIENv
bXBhY3RJbmZvIHsKLSAgICAgICAgLy8gQSBjb21wYWN0IGNoaWxkIHRoYXQgbmVlZHMgdG8gYmUg
Y29sbGFwc2VkIGludG8gdGhlIG1hcmdpbiBvZiB0aGUgZm9sbG93aW5nIGJsb2NrLgotICAgICAg
ICBSZW5kZXJPYmplY3QqIG1fY29tcGFjdDsKLSAgICAgICAgCi0gICAgICAgIC8vIFRoZSBibG9j
ayB3aXRoIHRoZSBvcGVuIG1hcmdpbiB0aGF0IHRoZSBjb21wYWN0IGNoaWxkIGlzIGdvaW5nIHRv
IHBsYWNlIGl0c2VsZiB3aXRoaW4uCi0gICAgICAgIFJlbmRlck9iamVjdCogbV9ibG9jazsKLQot
ICAgIHB1YmxpYzoKLSAgICAgICAgUmVuZGVyT2JqZWN0KiBjb21wYWN0KCkgY29uc3QgeyByZXR1
cm4gbV9jb21wYWN0OyB9Ci0gICAgICAgIFJlbmRlck9iamVjdCogYmxvY2soKSBjb25zdCB7IHJl
dHVybiBtX2Jsb2NrOyB9Ci0gICAgICAgIGJvb2wgbWF0Y2hlcyhSZW5kZXJPYmplY3QqIGNoaWxk
KSBjb25zdCB7IHJldHVybiBtX2NvbXBhY3QgJiYgbV9ibG9jayA9PSBjaGlsZDsgfQotICAgICAg
ICAKLSAgICAgICAgdm9pZCBjbGVhcigpIHsgc2V0KDAsIDApOyAgfQotICAgICAgICB2b2lkIHNl
dChSZW5kZXJPYmplY3QqIGMsIFJlbmRlck9iamVjdCogYikgeyBtX2NvbXBhY3QgPSBjOyBtX2Js
b2NrID0gYjsgfQotICAgICAgICAKLSAgICAgICAgQ29tcGFjdEluZm8oKSB7IGNsZWFyKCk7IH0K
LSAgICB9OwotCi0gICAgY2xhc3MgTWFyZ2luSW5mbyB7Ci0gICAgICAgIC8vIENvbGxhcHNpbmcg
ZmxhZ3MgZm9yIHdoZXRoZXIgd2UgY2FuIGNvbGxhcHNlIG91ciBtYXJnaW5zIHdpdGggb3VyIGNo
aWxkcmVuJ3MgbWFyZ2lucy4KLSAgICAgICAgYm9vbCBtX2NhbkNvbGxhcHNlV2l0aENoaWxkcmVu
IDogMTsKLSAgICAgICAgYm9vbCBtX2NhbkNvbGxhcHNlVG9wV2l0aENoaWxkcmVuIDogMTsKLSAg
ICAgICAgYm9vbCBtX2NhbkNvbGxhcHNlQm90dG9tV2l0aENoaWxkcmVuIDogMTsKLSAgICAgICAg
Ci0gICAgICAgIC8vIFdoZXRoZXIgb3Igbm90IHdlIGFyZSBhIHF1aXJreSBjb250YWluZXIsIGku
ZS4sIGRvIHdlIGNvbGxhcHNlIGF3YXkgdG9wIGFuZCBib3R0b20KLSAgICAgICAgLy8gbWFyZ2lu
cyBpbiBvdXIgY29udGFpbmVyLiAgVGFibGUgY2VsbHMgYW5kIHRoZSBib2R5IGFyZSB0aGUgY29t
bW9uIGV4YW1wbGVzLiBXZQotICAgICAgICAvLyBhbHNvIGhhdmUgYSBjdXN0b20gc3R5bGUgcHJv
cGVydHkgZm9yIFNhZmFyaSBSU1MgdG8gZGVhbCB3aXRoIFR5cGVQYWQgYmxvZyBhcnRpY2xlcy4K
LSAgICAgICAgYm9vbCBtX3F1aXJrQ29udGFpbmVyIDogMTsKLQotICAgICAgICAvLyBUaGlzIGZs
YWcgdHJhY2tzIHdoZXRoZXIgd2UgYXJlIHN0aWxsIGxvb2tpbmcgYXQgY2hpbGQgbWFyZ2lucyB0
aGF0IGNhbiBhbGwgY29sbGFwc2UgdG9nZXRoZXIgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGJsb2Nr
LiAgCi0gICAgICAgIC8vIFRoZXkgbWF5IG9yIG1heSBub3QgY29sbGFwc2Ugd2l0aCB0aGUgdG9w
IG1hcmdpbiBvZiB0aGUgYmxvY2sgKHxtX2NhbkNvbGxhcHNlVG9wV2l0aENoaWxkcmVufCB0ZWxs
cyB1cyB0aGF0KSwgYnV0IHRoZXkgd2lsbAotICAgICAgICAvLyBhbHdheXMgYmUgY29sbGFwc2lu
ZyB3aXRoIG9uZSBhbm90aGVyLiAgVGhpcyB2YXJpYWJsZSBjYW4gcmVtYWluIHNldCB0byB0cnVl
IHRocm91Z2ggbXVsdGlwbGUgaXRlcmF0aW9ucyAKLSAgICAgICAgLy8gYXMgbG9uZyBhcyB3ZSBr
ZWVwIGVuY291bnRlcmluZyBzZWxmLWNvbGxhcHNpbmcgYmxvY2tzLgotICAgICAgICBib29sIG1f
YXRUb3BPZkJsb2NrIDogMTsKLQotICAgICAgICAvLyBUaGlzIGZsYWcgaXMgc2V0IHdoZW4gd2Ug
a25vdyB3ZSdyZSBleGFtaW5pbmcgYm90dG9tIG1hcmdpbnMgYW5kIHdlIGtub3cgd2UncmUgYXQg
dGhlIGJvdHRvbSBvZiB0aGUgYmxvY2suCi0gICAgICAgIGJvb2wgbV9hdEJvdHRvbU9mQmxvY2sg
OiAxOwotCi0gICAgICAgIC8vIElmIG91ciBsYXN0IG5vcm1hbCBmbG93IGNoaWxkIHdhcyBhIHNl
bGYtY29sbGFwc2luZyBibG9jayB0aGF0IGNsZWFyZWQgYSBmbG9hdCwKLSAgICAgICAgLy8gd2Ug
dHJhY2sgaXQgaW4gdGhpcyB2YXJpYWJsZS4KLSAgICAgICAgYm9vbCBtX3NlbGZDb2xsYXBzaW5n
QmxvY2tDbGVhcmVkRmxvYXQgOiAxOwotICAgIAotICAgICAgICAvLyBUaGVzZSB2YXJpYWJsZXMg
YXJlIHVzZWQgdG8gZGV0ZWN0IHF1aXJreSBtYXJnaW5zIHRoYXQgd2UgbmVlZCB0byBjb2xsYXBz
ZSBhd2F5IChpbiB0YWJsZSBjZWxscwotICAgICAgICAvLyBhbmQgaW4gdGhlIGJvZHkgZWxlbWVu
dCkuCi0gICAgICAgIGJvb2wgbV90b3BRdWlyayA6IDE7Ci0gICAgICAgIGJvb2wgbV9ib3R0b21R
dWlyayA6IDE7Ci0gICAgICAgIGJvb2wgbV9kZXRlcm1pbmVkVG9wUXVpcmsgOiAxOwotCi0gICAg
ICAgIC8vIFRoZXNlIGZsYWdzIHRyYWNrIHRoZSBwcmV2aW91cyBtYXhpbWFsIHBvc2l0aXZlIGFu
ZCBuZWdhdGl2ZSBtYXJnaW5zLgotICAgICAgICBpbnQgbV9wb3NNYXJnaW47Ci0gICAgICAgIGlu
dCBtX25lZ01hcmdpbjsKLQotICAgIHB1YmxpYzoKLSAgICAgICAgTWFyZ2luSW5mbyhSZW5kZXJC
bG9jayogYiwgaW50IHRvcCwgaW50IGJvdHRvbSk7Ci0gICAgICAgIAotICAgICAgICB2b2lkIHNl
dEF0VG9wT2ZCbG9jayhib29sIGIpIHsgbV9hdFRvcE9mQmxvY2sgPSBiOyB9Ci0gICAgICAgIHZv
aWQgc2V0QXRCb3R0b21PZkJsb2NrKGJvb2wgYikgeyBtX2F0Qm90dG9tT2ZCbG9jayA9IGI7IH0K
LSAgICAgICAgdm9pZCBjbGVhck1hcmdpbigpIHsgbV9wb3NNYXJnaW4gPSBtX25lZ01hcmdpbiA9
IDA7IH0KLSAgICAgICAgdm9pZCBzZXRTZWxmQ29sbGFwc2luZ0Jsb2NrQ2xlYXJlZEZsb2F0KGJv
b2wgYikgeyBtX3NlbGZDb2xsYXBzaW5nQmxvY2tDbGVhcmVkRmxvYXQgPSBiOyB9Ci0gICAgICAg
IHZvaWQgc2V0VG9wUXVpcmsoYm9vbCBiKSB7IG1fdG9wUXVpcmsgPSBiOyB9Ci0gICAgICAgIHZv
aWQgc2V0Qm90dG9tUXVpcmsoYm9vbCBiKSB7IG1fYm90dG9tUXVpcmsgPSBiOyB9Ci0gICAgICAg
IHZvaWQgc2V0RGV0ZXJtaW5lZFRvcFF1aXJrKGJvb2wgYikgeyBtX2RldGVybWluZWRUb3BRdWly
ayA9IGI7IH0KLSAgICAgICAgdm9pZCBzZXRQb3NNYXJnaW4oaW50IHApIHsgbV9wb3NNYXJnaW4g
PSBwOyB9Ci0gICAgICAgIHZvaWQgc2V0TmVnTWFyZ2luKGludCBuKSB7IG1fbmVnTWFyZ2luID0g
bjsgfQotICAgICAgICB2b2lkIHNldFBvc01hcmdpbklmTGFyZ2VyKGludCBwKSB7IGlmIChwID4g
bV9wb3NNYXJnaW4pIG1fcG9zTWFyZ2luID0gcDsgfQotICAgICAgICB2b2lkIHNldE5lZ01hcmdp
bklmTGFyZ2VyKGludCBuKSB7IGlmIChuID4gbV9uZWdNYXJnaW4pIG1fbmVnTWFyZ2luID0gbjsg
fQotCi0gICAgICAgIHZvaWQgc2V0TWFyZ2luKGludCBwLCBpbnQgbikgeyBtX3Bvc01hcmdpbiA9
IHA7IG1fbmVnTWFyZ2luID0gbjsgfQotCi0gICAgICAgIGJvb2wgYXRUb3BPZkJsb2NrKCkgY29u
c3QgeyByZXR1cm4gbV9hdFRvcE9mQmxvY2s7IH0KLSAgICAgICAgYm9vbCBjYW5Db2xsYXBzZVdp
dGhUb3AoKSBjb25zdCB7IHJldHVybiBtX2F0VG9wT2ZCbG9jayAmJiBtX2NhbkNvbGxhcHNlVG9w
V2l0aENoaWxkcmVuOyB9Ci0gICAgICAgIGJvb2wgY2FuQ29sbGFwc2VXaXRoQm90dG9tKCkgY29u
c3QgeyByZXR1cm4gbV9hdEJvdHRvbU9mQmxvY2sgJiYgbV9jYW5Db2xsYXBzZUJvdHRvbVdpdGhD
aGlsZHJlbjsgfQotICAgICAgICBib29sIGNhbkNvbGxhcHNlVG9wV2l0aENoaWxkcmVuKCkgY29u
c3QgeyByZXR1cm4gbV9jYW5Db2xsYXBzZVRvcFdpdGhDaGlsZHJlbjsgfQotICAgICAgICBib29s
IGNhbkNvbGxhcHNlQm90dG9tV2l0aENoaWxkcmVuKCkgY29uc3QgeyByZXR1cm4gbV9jYW5Db2xs
YXBzZUJvdHRvbVdpdGhDaGlsZHJlbjsgfQotICAgICAgICBib29sIHNlbGZDb2xsYXBzaW5nQmxv
Y2tDbGVhcmVkRmxvYXQoKSBjb25zdCB7IHJldHVybiBtX3NlbGZDb2xsYXBzaW5nQmxvY2tDbGVh
cmVkRmxvYXQ7IH0KLSAgICAgICAgYm9vbCBxdWlya0NvbnRhaW5lcigpIGNvbnN0IHsgcmV0dXJu
IG1fcXVpcmtDb250YWluZXI7IH0KLSAgICAgICAgYm9vbCBkZXRlcm1pbmVkVG9wUXVpcmsoKSBj
b25zdCB7IHJldHVybiBtX2RldGVybWluZWRUb3BRdWlyazsgfQotICAgICAgICBib29sIHRvcFF1
aXJrKCkgY29uc3QgeyByZXR1cm4gbV90b3BRdWlyazsgfQotICAgICAgICBib29sIGJvdHRvbVF1
aXJrKCkgY29uc3QgeyByZXR1cm4gbV9ib3R0b21RdWlyazsgfQotICAgICAgICBpbnQgcG9zTWFy
Z2luKCkgY29uc3QgeyByZXR1cm4gbV9wb3NNYXJnaW47IH0KLSAgICAgICAgaW50IG5lZ01hcmdp
bigpIGNvbnN0IHsgcmV0dXJuIG1fbmVnTWFyZ2luOyB9Ci0gICAgICAgIGludCBtYXJnaW4oKSBj
b25zdCB7IHJldHVybiBtX3Bvc01hcmdpbiAtIG1fbmVnTWFyZ2luOyB9Ci0gICAgfTsKLSAgICAK
LSAgICB2b2lkIGFkanVzdFBvc2l0aW9uZWRCbG9jayhSZW5kZXJPYmplY3QqIGNoaWxkLCBjb25z
dCBNYXJnaW5JbmZvJiBtYXJnaW5JbmZvKTsKLSAgICB2b2lkIGFkanVzdEZsb2F0aW5nQmxvY2so
Y29uc3QgTWFyZ2luSW5mbyYgbWFyZ2luSW5mbyk7Ci0gICAgUmVuZGVyT2JqZWN0KiBoYW5kbGVT
cGVjaWFsQ2hpbGQoUmVuZGVyT2JqZWN0KiBjaGlsZCwgY29uc3QgTWFyZ2luSW5mbyYgbWFyZ2lu
SW5mbywgQ29tcGFjdEluZm8mIGNvbXBhY3RJbmZvLCBib29sJiBoYW5kbGVkKTsKLSAgICBSZW5k
ZXJPYmplY3QqIGhhbmRsZUZsb2F0aW5nQ2hpbGQoUmVuZGVyT2JqZWN0KiBjaGlsZCwgY29uc3Qg
TWFyZ2luSW5mbyYgbWFyZ2luSW5mbywgYm9vbCYgaGFuZGxlZCk7Ci0gICAgUmVuZGVyT2JqZWN0
KiBoYW5kbGVQb3NpdGlvbmVkQ2hpbGQoUmVuZGVyT2JqZWN0KiBjaGlsZCwgY29uc3QgTWFyZ2lu
SW5mbyYgbWFyZ2luSW5mbywgYm9vbCYgaGFuZGxlZCk7Ci0gICAgUmVuZGVyT2JqZWN0KiBoYW5k
bGVDb21wYWN0Q2hpbGQoUmVuZGVyT2JqZWN0KiBjaGlsZCwgQ29tcGFjdEluZm8mIGNvbXBhY3RJ
bmZvLCBib29sJiBoYW5kbGVkKTsKLSAgICBSZW5kZXJPYmplY3QqIGhhbmRsZVJ1bkluQ2hpbGQo
UmVuZGVyT2JqZWN0KiBjaGlsZCwgYm9vbCYgaGFuZGxlZCk7Ci0gICAgdm9pZCBjb2xsYXBzZU1h
cmdpbnMoUmVuZGVyT2JqZWN0KiBjaGlsZCwgTWFyZ2luSW5mbyYgbWFyZ2luSW5mbywgaW50IHlQ
b3NFc3RpbWF0ZSk7Ci0gICAgdm9pZCBjbGVhckZsb2F0c0lmTmVlZGVkKFJlbmRlck9iamVjdCog
Y2hpbGQsIE1hcmdpbkluZm8mIG1hcmdpbkluZm8sIGludCBvbGRUb3BQb3NNYXJnaW4sIGludCBv
bGRUb3BOZWdNYXJnaW4pOwotICAgIHZvaWQgaW5zZXJ0Q29tcGFjdElmTmVlZGVkKFJlbmRlck9i
amVjdCogY2hpbGQsIENvbXBhY3RJbmZvJiBjb21wYWN0SW5mbyk7Ci0gICAgaW50IGVzdGltYXRl
VmVydGljYWxQb3NpdGlvbihSZW5kZXJPYmplY3QqIGNoaWxkLCBjb25zdCBNYXJnaW5JbmZvJiBp
bmZvKTsKLSAgICB2b2lkIGRldGVybWluZUhvcml6b250YWxQb3NpdGlvbihSZW5kZXJPYmplY3Qq
IGNoaWxkKTsKLSAgICB2b2lkIGhhbmRsZUJvdHRvbU9mQmxvY2soaW50IHRvcCwgaW50IGJvdHRv
bSwgTWFyZ2luSW5mbyYgbWFyZ2luSW5mbyk7Ci0gICAgdm9pZCBzZXRDb2xsYXBzZWRCb3R0b21N
YXJnaW4oY29uc3QgTWFyZ2luSW5mbyYgbWFyZ2luSW5mbyk7Ci0gICAgLy8gRW5kIGhlbHBlciBm
dW5jdGlvbnMgYW5kIHN0cnVjdHMgdXNlZCBieSBsYXlvdXRCbG9ja0NoaWxkcmVuLgotCi1wcm90
ZWN0ZWQ6Ci0gICAgUVB0ckxpc3Q8RmxvYXRpbmdPYmplY3Q+KiBtX2Zsb2F0aW5nT2JqZWN0czsK
LSAgICBRUHRyTGlzdDxSZW5kZXJPYmplY3Q+KiBtX3Bvc2l0aW9uZWRPYmplY3RzOwotICAgIAot
ICAgIGJvb2wgbV9jaGlsZHJlbklubGluZSA6IDE7Ci0gICAgYm9vbCBtX2ZpcnN0TGluZSAgICAg
IDogMTsKLSAgICBFQ2xlYXIgbV9jbGVhclN0YXR1cyAgOiAyOwotICAgIGJvb2wgbV90b3BNYXJn
aW5RdWlyayA6IDE7Ci0gICAgYm9vbCBtX2JvdHRvbU1hcmdpblF1aXJrIDogMTsKLSAgICBib29s
IG1faGFzTWFya3VwVHJ1bmNhdGlvbiA6IDE7Ci0gICAgU2VsZWN0aW9uU3RhdGUgbV9zZWxlY3Rp
b25TdGF0ZSA6IDM7Ci0KLSAgICBpbnQgbV9tYXhUb3BQb3NNYXJnaW47Ci0gICAgaW50IG1fbWF4
VG9wTmVnTWFyZ2luOwotICAgIGludCBtX21heEJvdHRvbVBvc01hcmdpbjsKLSAgICBpbnQgbV9t
YXhCb3R0b21OZWdNYXJnaW47Ci0KLSAgICAvLyBIb3cgbXVjaCBjb250ZW50IG92ZXJmbG93cyBv
dXQgb2Ygb3VyIGJsb2NrIHZlcnRpY2FsbHkgb3IgaG9yaXpvbnRhbGx5IChhbGwgd2Ugc3VwcG9y
dAotICAgIC8vIGZvciBub3cgaXMgc3BpbGxhZ2Ugb3V0IG9mIHRoZSBib3R0b20gYW5kIHRoZSBy
aWdodCwgd2hpY2ggYXJlIHRoZSBjb21tb24gY2FzZXMpLgotICAgIC8vIFhYWCBHZW5lcmFsaXpl
IHRvIHdvcmsgd2l0aCB0b3AgYW5kIGxlZnQgYXMgd2VsbC4KLSAgICBpbnQgbV9vdmVyZmxvd0hl
aWdodDsKLSAgICBpbnQgbV9vdmVyZmxvd1dpZHRoOwotICAgIAotICAgIC8vIExlZnQgYW5kIHRv
cCBvdmVyZmxvdy4gIERvZXMgbm90IGFmZmVjdCBzY3JvbGxpbmcgZGltZW5zaW9ucywgYnV0IHdl
IGRvIGF0IGxlYXN0IHVzZSBpdAotICAgIC8vIHdoZW4gZGlydHkgcmVjdCBjaGVja2luZyBhbmQg
aGl0IHRlc3RpbmcuCi0gICAgaW50IG1fb3ZlcmZsb3dMZWZ0OwotICAgIGludCBtX292ZXJmbG93
VG9wOwotICAgIAotICAgIC8vIGZ1bGwgd2lkdGggb2YgYSB0YWIgY2hhcmFjdGVyCi0gICAgaW50
IG1fdGFiV2lkdGg7Ci19OwotCi19OyAvLyBuYW1lc3BhY2UKLQotI2VuZGlmIC8vIFJFTkRFUl9C
TE9DS19ICkluZGV4OiByZW5kZXJpbmcvcmVuZGVyX29iamVjdC5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
cmVuZGVyaW5nL3JlbmRlcl9vYmplY3QuY3BwCShyZXZpc2lvbiAxMjI1MykKKysrIHJlbmRlcmlu
Zy9yZW5kZXJfb2JqZWN0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDAsMTMgKzQwLDE3IEBACiAj
aW5jbHVkZSAidmlzaWJsZV9wb3NpdGlvbi5oIgogI2luY2x1ZGUgImh0bWxuYW1lcy5oIgogI2lu
Y2x1ZGUgInJlbmRlcl9hcmVuYS5oIgotI2luY2x1ZGUgInJlbmRlcl9ibG9jay5oIgorI2luY2x1
ZGUgIlJlbmRlckJsb2NrLmgiCiAjaW5jbHVkZSAicmVuZGVyX2NhbnZhcy5oIgogI2luY2x1ZGUg
InJlbmRlcl9mbGV4Ym94LmgiCiAjaW5jbHVkZSAicmVuZGVyX2lubGluZS5oIgogI2luY2x1ZGUg
InJlbmRlcl9saW5lLmgiCiAjaW5jbHVkZSAicmVuZGVyX2xpc3QuaCIKLSNpbmNsdWRlICJyZW5k
ZXJfdGFibGUuaCIKKyNpbmNsdWRlICJSZW5kZXJUYWJsZS5oIgorI2luY2x1ZGUgIlJlbmRlclRh
YmxlUm93LmgiCisjaW5jbHVkZSAiUmVuZGVyVGFibGVDb2wuaCIKKyNpbmNsdWRlICJSZW5kZXJU
YWJsZUNlbGwuaCIKKwogI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPGtkZWJ1Zy5oPgog
I2luY2x1ZGUgPHFwYWludGVyLmg+CkluZGV4OiByZW5kZXJpbmcvcmVuZGVyX2Zsb3cuaAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSByZW5kZXJpbmcvcmVuZGVyX2Zsb3cuaAkocmV2aXNpb24gMTIyNTMpCisrKyBy
ZW5kZXJpbmcvcmVuZGVyX2Zsb3cuaAkod29ya2luZyBjb3B5KQpAQCAtMjQsMTEgKzI0LDExIEBA
CiAjaWZuZGVmIFJFTkRFUl9GTE9XX0gKICNkZWZpbmUgUkVOREVSX0ZMT1dfSAogCi0jaW5jbHVk
ZSAicmVuZGVyX2NvbnRhaW5lci5oIgorI2luY2x1ZGUgIlJlbmRlckNvbnRhaW5lci5oIgogI2lu
Y2x1ZGUgImJpZGkuaCIKICNpbmNsdWRlICJyZW5kZXJfbGluZS5oIgogCi1uYW1lc3BhY2Uga2h0
bWwgeworbmFtZXNwYWNlIFdlYkNvcmUgewogCiAvKioKICAqIGFsbCBnZW9tZXRyeSBtYW5hZ2lu
ZyBzdHVmZiBpcyBvbmx5IGluIHRoZSBibG9jayBlbGVtZW50cy4KSW5kZXg6IHJlbmRlcmluZy9y
ZW5kZXJfbGlzdC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHJlbmRlcmluZy9yZW5kZXJfbGlzdC5oCShyZXZp
c2lvbiAxMjI1MykKKysrIHJlbmRlcmluZy9yZW5kZXJfbGlzdC5oCSh3b3JraW5nIGNvcHkpCkBA
IC0yNCw3ICsyNCw3IEBACiAjaWZuZGVmIFJFTkRFUl9MSVNUX0gKICNkZWZpbmUgUkVOREVSX0xJ
U1RfSAogCi0jaW5jbHVkZSAicmVuZGVyX2Jsb2NrLmgiCisjaW5jbHVkZSAiUmVuZGVyQmxvY2su
aCIKIAogLy8gIyMjIGxpc3Qtc3R5bGUtcG9zaXRpb24sIGxpc3Qtc3R5bGUtaW1hZ2UgaXMgc3Rp
bGwgbWlzc2luZwogCkluZGV4OiByZW5kZXJpbmcvUmVuZGVyVGFibGVDb2wuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIHJlbmRlcmluZy9SZW5kZXJUYWJsZUNvbC5jcHAJKHJldmlzaW9uIDEyMjUzKQorKysg
cmVuZGVyaW5nL1JlbmRlclRhYmxlQ29sLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNiw3ICs2LDcg
QEAKICAqICAgICAgICAgICAoQykgMTk5OCBXYWxkbyBCYXN0aWFuIChiYXN0aWFuQGtkZS5vcmcp
CiAgKiAgICAgICAgICAgKEMpIDE5OTkgTGFycyBLbm9sbCAoa25vbGxAa2RlLm9yZykKICAqICAg
ICAgICAgICAoQykgMTk5OSBBbnR0aSBLb2l2aXN0byAoa29pdmlzdG9Aa2RlLm9yZykKLSAqIENv
cHlyaWdodCAoQykgMjAwMyBBcHBsZSBDb21wdXRlciwgSW5jLgorICogQ29weXJpZ2h0IChDKSAy
MDAzLCAyMDA0LCAyMDA1LCAyMDA2IEFwcGxlIENvbXB1dGVyLCBJbmMuCiAgKgogICogVGhpcyBs
aWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgog
ICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQ
dWJsaWMKQEAgLTI0LDIxOTAgKzI0LDE3IEBACiAgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVT
QS4KICAqLwogCi0vLyNkZWZpbmUgVEFCTEVfREVCVUcKLS8vI2RlZmluZSBUQUJMRV9QUklOVAot
Ly8jZGVmaW5lIERFQlVHX0xBWU9VVAotLy8jZGVmaW5lIEJPWF9ERUJVRwogI2luY2x1ZGUgImNv
bmZpZy5oIgotI2luY2x1ZGUgInJlbmRlcmluZy9yZW5kZXJfdGFibGUuaCIKLSNpbmNsdWRlICJy
ZW5kZXJpbmcvdGFibGVfbGF5b3V0LmgiCi0jaW5jbHVkZSAiaHRtbC9odG1sX3RhYmxlaW1wbC5o
IgorI2luY2x1ZGUgIlJlbmRlclRhYmxlQ29sLmgiCisjaW5jbHVkZSAiaHRtbF90YWJsZWltcGwu
aCIKICNpbmNsdWRlICJodG1sbmFtZXMuaCIKLSNpbmNsdWRlICJEb2N1bWVudEltcGwuaCIKKyNp
bmNsdWRlIDxxdGV4dHN0cmVhbS5oPgogCi0jaW5jbHVkZSA8cWFwcGxpY2F0aW9uLmg+Ci0jaW5j
bHVkZSA8cXN0eWxlLmg+CituYW1lc3BhY2UgV2ViQ29yZSB7CiAKLSNpbmNsdWRlIDxrZGVidWcu
aD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQotdXNpbmcgbmFtZXNwYWNlIGtodG1sOwotdXNpbmcg
bmFtZXNwYWNlIERPTTsKIHVzaW5nIG5hbWVzcGFjZSBIVE1MTmFtZXM7CiAKLVJlbmRlclRhYmxl
OjpSZW5kZXJUYWJsZShET006Ok5vZGVJbXBsKiBub2RlKQotICAgIDogUmVuZGVyQmxvY2sobm9k
ZSkKLXsKLSAgICB0Q2FwdGlvbiA9IDA7Ci0gICAgaGVhZCA9IGZvb3QgPSBmaXJzdEJvZHkgPSAw
OwotICAgIHRhYmxlTGF5b3V0ID0gMDsKLSAgICBtX2N1cnJlbnRCb3JkZXIgPSAwOwotICAgIAot
ICAgIHJ1bGVzID0gTm9uZTsKLSAgICBmcmFtZSA9IFZvaWQ7Ci0gICAgaGFzX2NvbF9lbGVtcyA9
IGZhbHNlOwotICAgIGhzcGFjaW5nID0gMDsKLSAgICB2c3BhY2luZyA9IDA7Ci0gICAgcGFkZGlu
ZyA9IDA7Ci0gICAgbmVlZFNlY3Rpb25SZWNhbGMgPSBmYWxzZTsKLSAgICBwYWRkaW5nID0gMDsK
LQotICAgIGNvbHVtblBvcy5yZXNpemUoMik7Ci0gICAgY29sdW1uUG9zLmZpbGwoMCk7Ci0gICAg
Y29sdW1ucy5yZXNpemUoMSk7Ci0gICAgY29sdW1ucy5maWxsKENvbHVtblN0cnVjdCgpKTsKLQot
ICAgIGNvbHVtblBvc1swXSA9IDA7Ci19Ci0KLVJlbmRlclRhYmxlOjp+UmVuZGVyVGFibGUoKQot
ewotICAgIGRlbGV0ZSB0YWJsZUxheW91dDsKLX0KLQotdm9pZCBSZW5kZXJUYWJsZTo6c2V0U3R5
bGUoUmVuZGVyU3R5bGUgKl9zdHlsZSkKLXsKLSAgICBFVGFibGVMYXlvdXQgb2xkVGFibGVMYXlv
dXQgPSBzdHlsZSgpID8gc3R5bGUoKS0+dGFibGVMYXlvdXQoKSA6IFRBVVRPOwotICAgIFJlbmRl
ckJsb2NrOjpzZXRTdHlsZShfc3R5bGUpOwotCi0gICAgLy8gSW4gdGhlIGNvbGxhcHNlZCBib3Jk
ZXIgbW9kZWwsIHRoZXJlIGlzIG5vIGNlbGwgc3BhY2luZy4KLSAgICBoc3BhY2luZyA9IGNvbGxh
cHNlQm9yZGVycygpID8gMCA6IHN0eWxlKCktPmhvcml6b250YWxCb3JkZXJTcGFjaW5nKCk7Ci0g
ICAgdnNwYWNpbmcgPSBjb2xsYXBzZUJvcmRlcnMoKSA/IDAgOiBzdHlsZSgpLT52ZXJ0aWNhbEJv
cmRlclNwYWNpbmcoKTsKLSAgICBjb2x1bW5Qb3NbMF0gPSBoc3BhY2luZzsKLQotICAgIGlmICgh
dGFibGVMYXlvdXQgfHwgc3R5bGUoKS0+dGFibGVMYXlvdXQoKSAhPSBvbGRUYWJsZUxheW91dCkg
ewotCWRlbGV0ZSB0YWJsZUxheW91dDsKLQotICAgICAgICAvLyBBY2NvcmRpbmcgdG8gdGhlIENT
UzIgc3BlYywgeW91IG9ubHkgdXNlIGZpeGVkIHRhYmxlIGxheW91dCBpZiBhbgotICAgICAgICAv
LyBleHBsaWNpdCB3aWR0aCBpcyBzcGVjaWZpZWQgb24gdGhlIHRhYmxlLiAgQXV0byB3aWR0aCBp
bXBsaWVzIGF1dG8gdGFibGUgbGF5b3V0LgotCWlmIChzdHlsZSgpLT50YWJsZUxheW91dCgpID09
IFRGSVhFRCAmJiAhc3R5bGUoKS0+d2lkdGgoKS5pc0F1dG8oKSkKLQkgICAgdGFibGVMYXlvdXQg
PSBuZXcgRml4ZWRUYWJsZUxheW91dCh0aGlzKTsKLQllbHNlCi0JICAgIHRhYmxlTGF5b3V0ID0g
bmV3IEF1dG9UYWJsZUxheW91dCh0aGlzKTsKLSAgICB9Ci19Ci0KLXZvaWQgUmVuZGVyVGFibGU6
OmFkZENoaWxkKFJlbmRlck9iamVjdCAqY2hpbGQsIFJlbmRlck9iamVjdCAqYmVmb3JlQ2hpbGQp
Ci17Ci0gICAgUmVuZGVyT2JqZWN0ICpvID0gY2hpbGQ7Ci0KLSAgICBpZiAoY2hpbGQtPmVsZW1l
bnQoKSAmJiBjaGlsZC0+ZWxlbWVudCgpLT5oYXNUYWdOYW1lKGZvcm1UYWcpKSB7Ci0gICAgICAg
IFJlbmRlckNvbnRhaW5lcjo6YWRkQ2hpbGQoY2hpbGQsYmVmb3JlQ2hpbGQpOwotICAgICAgICBy
ZXR1cm47Ci0gICAgfQotCi0gICAgc3dpdGNoIChjaGlsZC0+c3R5bGUoKS0+ZGlzcGxheSgpKSB7
Ci0gICAgICAgIGNhc2UgVEFCTEVfQ0FQVElPTjoKLSAgICAgICAgICAgIHRDYXB0aW9uID0gc3Rh
dGljX2Nhc3Q8UmVuZGVyQmxvY2sgKj4oY2hpbGQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgIGNhc2UgVEFCTEVfQ09MVU1OOgotICAgICAgICBjYXNlIFRBQkxFX0NPTFVNTl9HUk9VUDoK
LSAgICAgICAgICAgIGhhc19jb2xfZWxlbXMgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0g
ICAgICAgIGNhc2UgVEFCTEVfSEVBREVSX0dST1VQOgotICAgICAgICAgICAgaWYgKCFoZWFkKQot
ICAgICAgICAgICAgICAgIGhlYWQgPSBzdGF0aWNfY2FzdDxSZW5kZXJUYWJsZVNlY3Rpb24gKj4o
Y2hpbGQpOwotICAgICAgICAgICAgZWxzZSBpZiAoIWZpcnN0Qm9keSkKLSAgICAgICAgICAgICAg
ICBmaXJzdEJvZHkgPSBzdGF0aWNfY2FzdDxSZW5kZXJUYWJsZVNlY3Rpb24gKj4oY2hpbGQpOwot
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVEFCTEVfRk9PVEVSX0dST1VQOgotICAg
ICAgICAgICAgaWYgKCFmb290KSB7Ci0gICAgICAgICAgICAgICAgZm9vdCA9IHN0YXRpY19jYXN0
PFJlbmRlclRhYmxlU2VjdGlvbiAqPihjaGlsZCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0g
ICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKLSAgICAgICAgY2FzZSBU
QUJMRV9ST1dfR1JPVVA6Ci0gICAgICAgICAgICBpZiAoIWZpcnN0Qm9keSkKLSAgICAgICAgICAg
ICAgICBmaXJzdEJvZHkgPSBzdGF0aWNfY2FzdDxSZW5kZXJUYWJsZVNlY3Rpb24gKj4oY2hpbGQp
OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpZiAo
IWJlZm9yZUNoaWxkICYmIGxhc3RDaGlsZCgpICYmCi0gICAgICAgICAgICAgICAgbGFzdENoaWxk
KCktPmlzVGFibGVTZWN0aW9uKCkgJiYgbGFzdENoaWxkKCktPmlzQW5vbnltb3VzKCkpIHsKLSAg
ICAgICAgICAgICAgICBvID0gbGFzdENoaWxkKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAg
ICAgICAgICAgICAgIFJlbmRlck9iamVjdCAqbGFzdEJveCA9IGJlZm9yZUNoaWxkOwotICAgICAg
ICAgICAgICAgIFJlbmRlck9iamVjdCAqbmV4dFRvTGFzdEJveCA9IGJlZm9yZUNoaWxkOwotICAg
ICAgICAgICAgICAgIHdoaWxlIChsYXN0Qm94ICYmIGxhc3RCb3gtPnBhcmVudCgpLT5pc0Fub255
bW91cygpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAhbGFzdEJveC0+aXNUYWJsZVNlY3Rp
b24oKSAmJiBsYXN0Qm94LT5zdHlsZSgpLT5kaXNwbGF5KCkgIT0gVEFCTEVfQ0FQVElPTikgewot
ICAgICAgICAgICAgICAgICAgICBuZXh0VG9MYXN0Qm94ID0gbGFzdEJveDsKLSAgICAgICAgICAg
ICAgICAgICAgbGFzdEJveCA9IGxhc3RCb3gtPnBhcmVudCgpOwotICAgICAgICAgICAgICAgIH0K
LSAgICAgICAgICAgICAgICBpZiAobGFzdEJveCAmJiBsYXN0Qm94LT5pc0Fub255bW91cygpKSB7
Ci0gICAgICAgICAgICAgICAgICAgIGxhc3RCb3gtPmFkZENoaWxkKGNoaWxkLCBuZXh0VG9MYXN0
Qm94KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0gZWxz
ZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChiZWZvcmVDaGlsZCAmJiAhYmVmb3JlQ2hpbGQt
PmlzVGFibGVTZWN0aW9uKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmVDaGlsZCA9
IDA7Ci0gICAgICAgICAgICAgICAgICAgIG8gPSBuZXcgKHJlbmRlckFyZW5hKCkpIFJlbmRlclRh
YmxlU2VjdGlvbihkb2N1bWVudCgpIC8qIGFub255bW91cyAqLyk7Ci0gICAgICAgICAgICAgICAg
ICAgIFJlbmRlclN0eWxlICpuZXdTdHlsZSA9IG5ldyAocmVuZGVyQXJlbmEoKSkgUmVuZGVyU3R5
bGUoKTsKLSAgICAgICAgICAgICAgICAgICAgbmV3U3R5bGUtPmluaGVyaXRGcm9tKHN0eWxlKCkp
OwotICAgICAgICAgICAgICAgICAgICBuZXdTdHlsZS0+c2V0RGlzcGxheShUQUJMRV9ST1dfR1JP
VVApOwotICAgICAgICAgICAgICAgICAgICBvLT5zZXRTdHlsZShuZXdTdHlsZSk7Ci0gICAgICAg
ICAgICAgICAgICAgIGFkZENoaWxkKG8sIGJlZm9yZUNoaWxkKTsKLSAgICAgICAgICAgICAgICB9
Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvLT5hZGRDaGlsZChjaGlsZCk7Ci0gICAgICAg
ICAgICBjaGlsZC0+c2V0TmVlZHNMYXlvdXRBbmRNaW5NYXhSZWNhbGMoKTsKLSAgICAgICAgICAg
IHJldHVybjsKLSAgICB9Ci0gICAgUmVuZGVyQ29udGFpbmVyOjphZGRDaGlsZChjaGlsZCxiZWZv
cmVDaGlsZCk7Ci19Ci0KLQotCi12b2lkIFJlbmRlclRhYmxlOjpjYWxjV2lkdGgoKQotewotICAg
IGlmIChpc1Bvc2l0aW9uZWQoKSkKLSAgICAgICAgY2FsY0Fic29sdXRlSG9yaXpvbnRhbCgpOwot
Ci0gICAgUmVuZGVyQmxvY2sgKmNiID0gY29udGFpbmluZ0Jsb2NrKCk7Ci0gICAgaW50IGF2YWls
YWJsZVdpZHRoID0gY2ItPmNvbnRlbnRXaWR0aCgpOwotCi0gICAgTGVuZ3RoVHlwZSB3aWR0aFR5
cGUgPSBzdHlsZSgpLT53aWR0aCgpLnR5cGU7Ci0gICAgaWYgKHdpZHRoVHlwZSA+IFJlbGF0aXZl
ICYmIHN0eWxlKCktPndpZHRoKCkudmFsdWUgPiAwKSB7Ci0JLy8gUGVyY2VudCBvciBmaXhlZCB0
YWJsZQotICAgICAgICBtX3dpZHRoID0gc3R5bGUoKS0+d2lkdGgoKS5taW5XaWR0aChhdmFpbGFi
bGVXaWR0aCk7Ci0gICAgICAgIGlmIChtX21pbldpZHRoID4gbV93aWR0aCkgbV93aWR0aCA9IG1f
bWluV2lkdGg7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gQW4gYXV0byB3aWR0aCB0YWJsZSBz
aG91bGQgc2hyaW5rIHRvIGZpdCB3aXRoaW4gdGhlIGxpbmUgd2lkdGggaWYgbmVjZXNzYXJ5IGlu
IG9yZGVyIHRvIAotICAgICAgICAvLyBhdm9pZCBvdmVybGFwcGluZyBmbG9hdHMuCi0gICAgICAg
IGF2YWlsYWJsZVdpZHRoID0gY2ItPmxpbmVXaWR0aChtX3kpOwotICAgICAgICAKLSAgICAgICAg
Ly8gU3VidHJhY3Qgb3V0IGFueSBmaXhlZCBtYXJnaW5zIGZyb20gb3VyIGF2YWlsYWJsZSB3aWR0
aCBmb3IgYXV0byB3aWR0aCB0YWJsZXMuCi0gICAgICAgIGludCBtYXJnaW5Ub3RhbCA9IDA7Ci0g
ICAgICAgIGlmIChzdHlsZSgpLT5tYXJnaW5MZWZ0KCkudHlwZSAhPSBBdXRvKQotICAgICAgICAg
ICAgbWFyZ2luVG90YWwgKz0gc3R5bGUoKS0+bWFyZ2luTGVmdCgpLndpZHRoKGF2YWlsYWJsZVdp
ZHRoKTsKLSAgICAgICAgaWYgKHN0eWxlKCktPm1hcmdpblJpZ2h0KCkudHlwZSAhPSBBdXRvKQot
ICAgICAgICAgICAgbWFyZ2luVG90YWwgKz0gc3R5bGUoKS0+bWFyZ2luUmlnaHQoKS53aWR0aChh
dmFpbGFibGVXaWR0aCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgLy8gU3VidHJhY3Qgb3V0IG91
ciBtYXJnaW5zIHRvIGdldCB0aGUgYXZhaWxhYmxlIGNvbnRlbnQgd2lkdGguCi0gICAgICAgIGlu
dCBhdmFpbENvbnRlbnRXaWR0aCA9IGtNYXgoMCwgYXZhaWxhYmxlV2lkdGggLSBtYXJnaW5Ub3Rh
bCk7Ci0gICAgICAgIAotICAgICAgICAvLyBFbnN1cmUgd2UgYXJlbid0IGJpZ2dlciB0aGFuIG91
ciBtYXggd2lkdGggb3Igc21hbGxlciB0aGFuIG91ciBtaW4gd2lkdGguCi0gICAgICAgIG1fd2lk
dGggPSBrTWluKGF2YWlsQ29udGVudFdpZHRoLCBtX21heFdpZHRoKTsKLSAgICB9Ci0gICAgCi0g
ICAgbV93aWR0aCA9IGtNYXgobV93aWR0aCwgbV9taW5XaWR0aCk7Ci0KLSAgICAvLyBGaW5hbGx5
LCB3aXRoIG91ciB0cnVlIHdpZHRoIGRldGVybWluZWQsIGNvbXB1dGUgb3VyIG1hcmdpbnMgZm9y
IHJlYWwuCi0gICAgbV9tYXJnaW5SaWdodCA9IDA7Ci0gICAgbV9tYXJnaW5MZWZ0ID0gMDsKLSAg
ICBjYWxjSG9yaXpvbnRhbE1hcmdpbnMoc3R5bGUoKS0+bWFyZ2luTGVmdCgpLHN0eWxlKCktPm1h
cmdpblJpZ2h0KCksYXZhaWxhYmxlV2lkdGgpOwotfQotCi12b2lkIFJlbmRlclRhYmxlOjpsYXlv
dXQoKQotewotICAgIEtIVE1MQXNzZXJ0KG5lZWRzTGF5b3V0KCkpOwotICAgIEtIVE1MQXNzZXJ0
KG1pbk1heEtub3duKCkpOwotICAgIEtIVE1MQXNzZXJ0KCFuZWVkU2VjdGlvblJlY2FsYyk7Ci0K
LSAgICBpZiAocG9zQ2hpbGROZWVkc0xheW91dCgpICYmICFub3JtYWxDaGlsZE5lZWRzTGF5b3V0
KCkgJiYgIXNlbGZOZWVkc0xheW91dCgpKSB7Ci0gICAgICAgIC8vIEFsbCB3ZSBoYXZlIHRvIGlz
IGxheSBvdXQgb3VyIHBvc2l0aW9uZWQgb2JqZWN0cy4KLSAgICAgICAgbGF5b3V0UG9zaXRpb25l
ZE9iamVjdHModHJ1ZSk7Ci0gICAgICAgIHNldE5lZWRzTGF5b3V0KGZhbHNlKTsKLSAgICAgICAg
cmV0dXJuOwotICAgIH0KLQotICAgIEludFJlY3Qgb2xkQm91bmRzLCBvbGRGdWxsQm91bmRzOwot
ICAgIGJvb2wgY2hlY2tGb3JSZXBhaW50ID0gY2hlY2tGb3JSZXBhaW50RHVyaW5nTGF5b3V0KCk7
Ci0gICAgaWYgKGNoZWNrRm9yUmVwYWludCkKLSAgICAgICAgZ2V0QWJzb2x1dGVSZXBhaW50UmVj
dEluY2x1ZGluZ0Zsb2F0cyhvbGRCb3VuZHMsIG9sZEZ1bGxCb3VuZHMpOwotICAgIAotICAgIG1f
aGVpZ2h0ID0gbV9vdmVyZmxvd0hlaWdodCA9IDA7Ci0gICAgaW5pdE1heE1hcmdpblZhbHVlcygp
OwotICAgIAotICAgIC8vaW50IG9sZFdpZHRoID0gbV93aWR0aDsKLSAgICBjYWxjV2lkdGgoKTsK
LSAgICBtX292ZXJmbG93V2lkdGggPSBtX3dpZHRoOwotCi0gICAgLy8gdGhlIG9wdGltaXNhdGlv
biBiZWxvdyBkb2Vzbid0IHdvcmsgc2luY2UgdGhlIGludGVybmFsIHRhYmxlCi0gICAgLy8gbGF5
b3V0IGNvdWxkIGhhdmUgY2hhbmdlZC4gIHdlIG5lZWQgdG8gYWRkIGEgZmxhZyB0byB0aGUgdGFi
bGUKLSAgICAvLyBsYXlvdXQgdGhhdCB0ZWxscyB1cyBpZiBzb21ldGhpbmcgaGFzIGNoYW5nZWQg
aW4gdGhlIG1pbiBtYXgKLSAgICAvLyBjYWxjdWxhdGlvbnMgdG8gZG8gaXQgY29ycmVjdGx5Lgot
Ly8gICAgIGlmICggb2xkV2lkdGggIT0gbV93aWR0aCB8fCBjb2x1bW5zLnNpemUoKSArIDEgIT0g
Y29sdW1uUG9zLnNpemUoKSApCi0gICAgdGFibGVMYXlvdXQtPmxheW91dCgpOwotCi0gICAgc2V0
Q2VsbFdpZHRocygpOwotCi0gICAgLy8gbGF5b3V0IGNoaWxkIG9iamVjdHMKLSAgICBpbnQgY2Fs
Y3VsYXRlZEhlaWdodCA9IDA7Ci0KLSAgICBSZW5kZXJPYmplY3QgKmNoaWxkID0gZmlyc3RDaGls
ZCgpOwotICAgIHdoaWxlKGNoaWxkKSB7Ci0JaWYgKGNoaWxkLT5uZWVkc0xheW91dCgpICYmICEo
Y2hpbGQtPmVsZW1lbnQoKSAmJiBjaGlsZC0+ZWxlbWVudCgpLT5oYXNUYWdOYW1lKGZvcm1UYWcp
KSkKLQkgICAgY2hpbGQtPmxheW91dCgpOwotCWlmIChjaGlsZC0+aXNUYWJsZVNlY3Rpb24oKSkg
ewotCSAgICBzdGF0aWNfY2FzdDxSZW5kZXJUYWJsZVNlY3Rpb24gKj4oY2hpbGQpLT5jYWxjUm93
SGVpZ2h0KCk7Ci0JICAgIGNhbGN1bGF0ZWRIZWlnaHQgKz0gc3RhdGljX2Nhc3Q8UmVuZGVyVGFi
bGVTZWN0aW9uICo+KGNoaWxkKS0+bGF5b3V0Um93cygwKTsKLQl9Ci0JY2hpbGQgPSBjaGlsZC0+
bmV4dFNpYmxpbmcoKTsKLSAgICB9Ci0KLSAgICAvLyAjIyMgY29sbGFwc2UgY2FwdGlvbiBtYXJn
aW4KLSAgICBpZiAodENhcHRpb24gJiYgdENhcHRpb24tPnN0eWxlKCktPmNhcHRpb25TaWRlKCkg
IT0gQ0FQQk9UVE9NKSB7Ci0gICAgICAgIHRDYXB0aW9uLT5zZXRQb3ModENhcHRpb24tPm1hcmdp
bkxlZnQoKSwgbV9oZWlnaHQpOwotICAgICAgICBtX2hlaWdodCArPSB0Q2FwdGlvbi0+aGVpZ2h0
KCkgKyB0Q2FwdGlvbi0+bWFyZ2luVG9wKCkgKyB0Q2FwdGlvbi0+bWFyZ2luQm90dG9tKCk7Ci0g
ICAgfQotCi0gICAgaW50IGJwVG9wID0gYm9yZGVyVG9wKCkgKyAoY29sbGFwc2VCb3JkZXJzKCkg
PyAwIDogcGFkZGluZ1RvcCgpKTsKLSAgICBpbnQgYnBCb3R0b20gPSBib3JkZXJCb3R0b20oKSAr
IChjb2xsYXBzZUJvcmRlcnMoKSA/IDAgOiBwYWRkaW5nQm90dG9tKCkpOwotICAgIAotICAgIG1f
aGVpZ2h0ICs9IGJwVG9wOwotCi0gICAgaW50IG9sZEhlaWdodCA9IG1faGVpZ2h0OwotICAgIGNh
bGNIZWlnaHQoKTsKLSAgICBpbnQgbmV3SGVpZ2h0ID0gbV9oZWlnaHQ7Ci0gICAgbV9oZWlnaHQg
PSBvbGRIZWlnaHQ7Ci0KLSAgICBMZW5ndGggaCA9IHN0eWxlKCktPmhlaWdodCgpOwotICAgIGlu
dCB0aCA9IDA7Ci0gICAgaWYgKGlzUG9zaXRpb25lZCgpKQotICAgICAgICB0aCA9IG5ld0hlaWdo
dDsgLy8gRklYTUU6IExlYXZlIHRoaXMgYWxvbmUgZm9yIG5vdyBidXQgaW52ZXN0aWdhdGUgbGF0
ZXIuCi0gICAgZWxzZSBpZiAoaC5pc0ZpeGVkKCkpCi0gICAgICAgIHRoID0gaC52YWx1ZSAtIChi
cFRvcCArIGJwQm90dG9tKTsgIC8vIFRhYmxlcyBzaXplIGFzIHRob3VnaCBDU1MgaGVpZ2h0IGlu
Y2x1ZGVzIGJvcmRlci9wYWRkaW5nLgotICAgIGVsc2UgaWYgKGguaXNQZXJjZW50KCkpCi0gICAg
ICAgIHRoID0gY2FsY1BlcmNlbnRhZ2VIZWlnaHQoaCk7Ci0gICAgdGggPSBrTWF4KDAsIHRoKTsK
LQotICAgIC8vIGxheW91dCByb3dzCi0gICAgaWYgKHRoID4gY2FsY3VsYXRlZEhlaWdodCkgewot
CS8vIHdlIGhhdmUgdG8gcmVkaXN0cmlidXRlIHRoYXQgaGVpZ2h0IHRvIGdldCB0aGUgY29uc3Ry
YWludCBjb3JyZWN0bHkKLQkvLyBqdXN0IGZvcmNlIHRoZSBmaXJzdCBib2R5IHRvIHRoZSBoZWln
aHQgbmVlZGVkCi0JLy8gIyMjIEZJWE1FIFRoaXMgc2hvdWxkIHRha2UgaGVpZ2h0IGNvbnN0cmFp
bnRzIG9uIGFsbCB0YWJsZSBzZWN0aW9ucyBpbnRvIGFjY291bnQgYW5kIGRpc3RyaWJ1dGUKLQkv
LyBhY2NvcmRpbmdseS4gRm9yIG5vdyB0aGlzIHNob3VsZCBiZSBnb29kIGVub3VnaAotICAgICAg
ICBpZiAoZmlyc3RCb2R5KSB7Ci0gICAgICAgICAgICBmaXJzdEJvZHktPmNhbGNSb3dIZWlnaHQo
KTsKLSAgICAgICAgICAgIGZpcnN0Qm9keS0+bGF5b3V0Um93cyh0aCAtIGNhbGN1bGF0ZWRIZWln
aHQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCFzdHlsZSgpLT5odG1sSGFja3MoKSkg
ewotICAgICAgICAgICAgLy8gQ29tcGxldGVseSBlbXB0eSB0YWJsZXMgKHdpdGggbm8gc2VjdGlv
bnMgb3IgYW55dGhpbmcpIHNob3VsZCBhdCBsZWFzdCBob25vciBzcGVjaWZpZWQgaGVpZ2h0Ci0g
ICAgICAgICAgICAvLyBpbiBzdHJpY3QgbW9kZS4KLSAgICAgICAgICAgIG1faGVpZ2h0ICs9IHRo
OwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIGludCBibCA9IGJvcmRlckxlZnQoKTsKLSAg
ICBpZiAoIWNvbGxhcHNlQm9yZGVycygpKQotICAgICAgICBibCArPSBwYWRkaW5nTGVmdCgpOwot
Ci0gICAgLy8gcG9zaXRpb24gdGhlIHRhYmxlIHNlY3Rpb25zCi0gICAgaWYgKGhlYWQpIHsKLQlo
ZWFkLT5zZXRQb3MoYmwsIG1faGVpZ2h0KTsKLQltX2hlaWdodCArPSBoZWFkLT5oZWlnaHQoKTsK
LSAgICB9Ci0gICAgZm9yIChSZW5kZXJPYmplY3QgKmJvZHkgPSBmaXJzdEJvZHk7IGJvZHk7IGJv
ZHkgPSBib2R5LT5uZXh0U2libGluZygpKSB7Ci0JaWYgKGJvZHkgIT0gaGVhZCAmJiBib2R5ICE9
IGZvb3QgJiYgYm9keS0+aXNUYWJsZVNlY3Rpb24oKSkgewotCSAgICBib2R5LT5zZXRQb3MoYmws
IG1faGVpZ2h0KTsKLQkgICAgbV9oZWlnaHQgKz0gYm9keS0+aGVpZ2h0KCk7Ci0JfQotICAgIH0K
LSAgICBpZiAoZm9vdCkgewotCWZvb3QtPnNldFBvcyhibCwgbV9oZWlnaHQpOwotCW1faGVpZ2h0
ICs9IGZvb3QtPmhlaWdodCgpOwotICAgIH0KLQotICAgIG1faGVpZ2h0ICs9IGJwQm90dG9tOwot
ICAgICAgICAgICAgICAgCi0gICAgaWYgKHRDYXB0aW9uICYmIHRDYXB0aW9uLT5zdHlsZSgpLT5j
YXB0aW9uU2lkZSgpPT1DQVBCT1RUT00pIHsKLSAgICAgICAgdENhcHRpb24tPnNldFBvcyh0Q2Fw
dGlvbi0+bWFyZ2luTGVmdCgpLCBtX2hlaWdodCk7Ci0gICAgICAgIG1faGVpZ2h0ICs9IHRDYXB0
aW9uLT5oZWlnaHQoKSArIHRDYXB0aW9uLT5tYXJnaW5Ub3AoKSArIHRDYXB0aW9uLT5tYXJnaW5C
b3R0b20oKTsKLSAgICB9Ci0KLSAgICAvLyB0YWJsZSBjYW4gYmUgY29udGFpbmluZyBibG9jayBv
ZiBwb3NpdGlvbmVkIGVsZW1lbnRzLgotICAgIC8vICMjIyBvbmx5IHBhc3MgdHJ1ZSBpZiB3aWR0
aCBvciBoZWlnaHQgY2hhbmdlZC4KLSAgICBsYXlvdXRQb3NpdGlvbmVkT2JqZWN0cyggdHJ1ZSAp
OwotCi0gICAgLy8gUmVwYWludCB3aXRoIG91ciBuZXcgYm91bmRzIGlmIHRoZXkgYXJlIGRpZmZl
cmVudCBmcm9tIG91ciBvbGQgYm91bmRzLgotICAgIGlmIChjaGVja0ZvclJlcGFpbnQpCi0gICAg
ICAgIHJlcGFpbnRBZnRlckxheW91dElmTmVlZGVkKG9sZEJvdW5kcywgb2xkRnVsbEJvdW5kcyk7
Ci0gICAgCi0gICAgbV9vdmVyZmxvd0hlaWdodCA9IGtNYXgobV9vdmVyZmxvd0hlaWdodCwgbV9o
ZWlnaHQpOwotICAgIG1fb3ZlcmZsb3dXaWR0aCA9IGtNYXgobV9vdmVyZmxvd1dpZHRoLCBtX3dp
ZHRoKTsKLQotICAgIHNldE5lZWRzTGF5b3V0KGZhbHNlKTsKLX0KLQotdm9pZCBSZW5kZXJUYWJs
ZTo6c2V0Q2VsbFdpZHRocygpCi17Ci0gICAgZm9yIChSZW5kZXJPYmplY3QgKmNoaWxkID0gZmly
c3RDaGlsZCgpOyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4dFNpYmxpbmcoKSkKLQlpZiAoIGNo
aWxkLT5pc1RhYmxlU2VjdGlvbigpICkKLQkgICAgc3RhdGljX2Nhc3Q8UmVuZGVyVGFibGVTZWN0
aW9uICo+KGNoaWxkKS0+c2V0Q2VsbFdpZHRocygpOwotfQotCi12b2lkIFJlbmRlclRhYmxlOjpw
YWludChQYWludEluZm8mIGksIGludCBfdHgsIGludCBfdHkpCi17Ci0gICAgX3R4ICs9IHhQb3Mo
KTsKLSAgICBfdHkgKz0geVBvcygpOwotCi0gICAgUGFpbnRBY3Rpb24gcGFpbnRBY3Rpb24gPSBp
LnBoYXNlOwotICAgIAotICAgIGludCBvcyA9IDIqbWF4aW1hbE91dGxpbmVTaXplKHBhaW50QWN0
aW9uKTsKLSAgICBpZiAoKF90eSA+PSBpLnIueSgpICsgaS5yLmhlaWdodCgpICsgb3MpIHx8IChf
dHkgKyBoZWlnaHQoKSA8PSBpLnIueSgpIC0gb3MpKQotICAgICAgICByZXR1cm47Ci0gICAgaWYg
KChfdHggPj0gaS5yLngoKSArIGkuci53aWR0aCgpICsgb3MpIHx8IChfdHggKyB3aWR0aCgpIDw9
IGkuci54KCkgLSBvcykpCi0gICAgICAgIHJldHVybjsKLQotICAgIGlmICgocGFpbnRBY3Rpb24g
PT0gUGFpbnRBY3Rpb25CbG9ja0JhY2tncm91bmQgfHwgcGFpbnRBY3Rpb24gPT0gUGFpbnRBY3Rp
b25DaGlsZEJsb2NrQmFja2dyb3VuZCkKLSAgICAgICAgJiYgc2hvdWxkUGFpbnRCYWNrZ3JvdW5k
T3JCb3JkZXIoKSAmJiBzdHlsZSgpLT52aXNpYmlsaXR5KCkgPT0gVklTSUJMRSkKLSAgICAgICAg
cGFpbnRCb3hEZWNvcmF0aW9ucyhpLCBfdHgsIF90eSk7Ci0KLSAgICAvLyBXZSdyZSBkb25lLiAg
V2UgZG9uJ3QgYm90aGVyIHBhaW50aW5nIGFueSBjaGlsZHJlbi4KLSAgICBpZiAocGFpbnRBY3Rp
b24gPT0gUGFpbnRBY3Rpb25CbG9ja0JhY2tncm91bmQpCi0gICAgICAgIHJldHVybjsKLSAgICAv
LyBXZSBkb24ndCBwYWludCBvdXIgb3duIGJhY2tncm91bmQsIGJ1dCB3ZSBkbyBsZXQgdGhlIGtp
ZHMgcGFpbnQgdGhlaXIgYmFja2dyb3VuZHMuCi0gICAgaWYgKHBhaW50QWN0aW9uID09IFBhaW50
QWN0aW9uQ2hpbGRCbG9ja0JhY2tncm91bmRzKQotICAgICAgICBwYWludEFjdGlvbiA9IFBhaW50
QWN0aW9uQ2hpbGRCbG9ja0JhY2tncm91bmQ7Ci0gICAgUGFpbnRJbmZvIHBhaW50SW5mbyhpLnAs
IGkuciwgcGFpbnRBY3Rpb24sIHBhaW50aW5nUm9vdEZvckNoaWxkcmVuKGkpKTsKLSAgICAKLSAg
ICBmb3IgKFJlbmRlck9iamVjdCAqY2hpbGQgPSBmaXJzdENoaWxkKCk7IGNoaWxkOyBjaGlsZCA9
IGNoaWxkLT5uZXh0U2libGluZygpKQotICAgICAgICBpZiAoY2hpbGQtPmlzVGFibGVTZWN0aW9u
KCkgfHwgY2hpbGQgPT0gdENhcHRpb24pCi0JICAgIGNoaWxkLT5wYWludChwYWludEluZm8sIF90
eCwgX3R5KTsKLQotICAgIGlmIChjb2xsYXBzZUJvcmRlcnMoKSAmJiBwYWludEFjdGlvbiA9PSBQ
YWludEFjdGlvbkNoaWxkQmxvY2tCYWNrZ3JvdW5kICYmIHN0eWxlKCktPnZpc2liaWxpdHkoKSA9
PSBWSVNJQkxFKSB7Ci0gICAgICAgIC8vIENvbGxlY3QgYWxsIHRoZSB1bmlxdWUgYm9yZGVyIHN0
eWxlcyB0aGF0IHdlIHdhbnQgdG8gcGFpbnQgaW4gYSBzb3J0ZWQgbGlzdC4gIE9uY2Ugd2UKLSAg
ICAgICAgLy8gaGF2ZSBhbGwgdGhlIHN0eWxlcyBzb3J0ZWQsIHdlIHRoZW4gZG8gaW5kaXZpZHVh
bCBwYXNzZXMsIHBhaW50aW5nIGVhY2ggc3R5bGUgb2YgYm9yZGVyCi0gICAgICAgIC8vIGZyb20g
bG93ZXN0IHByZWNlZGVuY2UgdG8gaGlnaGVzdCBwcmVjZWRlbmNlLgotICAgICAgICBwYWludElu
Zm8ucGhhc2UgPSBQYWludEFjdGlvbkNvbGxhcHNlZFRhYmxlQm9yZGVyczsKLSAgICAgICAgUVZh
bHVlTGlzdDxDb2xsYXBzZWRCb3JkZXJWYWx1ZT4gYm9yZGVyU3R5bGVzOwotICAgICAgICBjb2xs
ZWN0Qm9yZGVycyhib3JkZXJTdHlsZXMpOwotICAgICAgICBRVmFsdWVMaXN0SXRlcmF0b3I8Q29s
bGFwc2VkQm9yZGVyVmFsdWU+IGl0ID0gYm9yZGVyU3R5bGVzLmJlZ2luKCk7Ci0gICAgICAgIFFW
YWx1ZUxpc3RJdGVyYXRvcjxDb2xsYXBzZWRCb3JkZXJWYWx1ZT4gZW5kID0gYm9yZGVyU3R5bGVz
LmVuZCgpOwotICAgICAgICBmb3IgKDsgaXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgICAgICAgICBt
X2N1cnJlbnRCb3JkZXIgPSAmKCppdCk7Ci0gICAgICAgICAgICBmb3IgKFJlbmRlck9iamVjdCog
Y2hpbGQgPSBmaXJzdENoaWxkKCk7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0U2libGluZygp
KQotICAgICAgICAgICAgICAgIGlmIChjaGlsZC0+aXNUYWJsZVNlY3Rpb24oKSkKLSAgICAgICAg
ICAgICAgICAgICAgY2hpbGQtPnBhaW50KHBhaW50SW5mbywgX3R4LCBfdHkpOwotICAgICAgICB9
Ci0gICAgfQotICAgICAgICAKLSNpZmRlZiBCT1hfREVCVUcKLSAgICBvdXRsaW5lQm94KGkucCwg
X3R4LCBfdHksICJibHVlIik7Ci0jZW5kaWYKLX0KLQotdm9pZCBSZW5kZXJUYWJsZTo6cGFpbnRC
b3hEZWNvcmF0aW9ucyhQYWludEluZm8mIGksIGludCBfdHgsIGludCBfdHkpCi17Ci0gICAgaW50
IHcgPSB3aWR0aCgpOwotICAgIGludCBoID0gaGVpZ2h0KCk7Ci0gICAgCi0gICAgLy8gQWNjb3Vu
dCBmb3IgdGhlIGNhcHRpb24uCi0gICAgaWYgKHRDYXB0aW9uKSB7Ci0gICAgICAgIGludCBjYXB0
aW9uSGVpZ2h0ID0gKHRDYXB0aW9uLT5oZWlnaHQoKSArIHRDYXB0aW9uLT5tYXJnaW5Cb3R0b20o
KSArICB0Q2FwdGlvbi0+bWFyZ2luVG9wKCkpOwotICAgICAgICBoIC09IGNhcHRpb25IZWlnaHQ7
Ci0gICAgICAgIGlmICh0Q2FwdGlvbi0+c3R5bGUoKS0+Y2FwdGlvblNpZGUoKSAhPSBDQVBCT1RU
T00pCi0gICAgICAgICAgICBfdHkgKz0gY2FwdGlvbkhlaWdodDsKLSAgICB9Ci0KLSAgICBpbnQg
bXkgPSBrTWF4KF90eSwgaS5yLnkoKSk7Ci0gICAgaW50IG1oOwotICAgIGlmIChfdHkgPCBpLnIu
eSgpKQotICAgICAgICBtaD0ga01heCgwLCBoIC0gKGkuci55KCkgLSBfdHkpKTsKLSAgICBlbHNl
Ci0gICAgICAgIG1oID0ga01pbihpLnIuaGVpZ2h0KCksIGgpOwotICAgIAotICAgIHBhaW50QmFj
a2dyb3VuZChpLnAsIHN0eWxlKCktPmJhY2tncm91bmRDb2xvcigpLCBzdHlsZSgpLT5iYWNrZ3Jv
dW5kTGF5ZXJzKCksIG15LCBtaCwgX3R4LCBfdHksIHcsIGgpOwotICAgIAotICAgIGlmIChzdHls
ZSgpLT5oYXNCb3JkZXIoKSAmJiAhY29sbGFwc2VCb3JkZXJzKCkpCi0gICAgICAgIHBhaW50Qm9y
ZGVyKGkucCwgX3R4LCBfdHksIHcsIGgsIHN0eWxlKCkpOwotfQotCi12b2lkIFJlbmRlclRhYmxl
OjpjYWxjTWluTWF4V2lkdGgoKQotewotICAgIEtIVE1MQXNzZXJ0KCFtaW5NYXhLbm93bigpKTsK
LQotICAgIGlmIChuZWVkU2VjdGlvblJlY2FsYykKLQlyZWNhbGNTZWN0aW9ucygpOwotCi0gICAg
dGFibGVMYXlvdXQtPmNhbGNNaW5NYXhXaWR0aCgpOwotCi0gICAgaWYgKHRDYXB0aW9uICYmIHRD
YXB0aW9uLT5taW5XaWR0aCgpID4gbV9taW5XaWR0aCkKLSAgICAgICAgbV9taW5XaWR0aCA9IHRD
YXB0aW9uLT5taW5XaWR0aCgpOwotCi0gICAgc2V0TWluTWF4S25vd24oKTsKLX0KLQotdm9pZCBS
ZW5kZXJUYWJsZTo6c3BsaXRDb2x1bW4oaW50IHBvcywgaW50IGZpcnN0U3BhbikKLXsKLSAgICAv
LyB3ZSBuZWVkIHRvIGFkZCBhIG5ldyBjb2x1bW5TdHJ1Y3QKLSAgICBpbnQgb2xkU2l6ZSA9IGNv
bHVtbnMuc2l6ZSgpOwotICAgIGNvbHVtbnMucmVzaXplKG9sZFNpemUgKyAxKTsKLSAgICBpbnQg
b2xkU3BhbiA9IGNvbHVtbnNbcG9zXS5zcGFuOwotLy8gICAgIHFEZWJ1Zygic3BsaXRDb2x1bW4o
ICVkLCVkICksIG9sZFNpemU9JWQsIG9sZFNwYW49JWQiLCBwb3MsIGZpcnN0U3Bhbiwgb2xkU2l6
ZSwgb2xkU3BhbiApOwotICAgIEtIVE1MQXNzZXJ0KG9sZFNwYW4gPiBmaXJzdFNwYW4pOwotICAg
IGNvbHVtbnNbcG9zXS5zcGFuID0gZmlyc3RTcGFuOwotICAgIG1lbW1vdmUoY29sdW1ucy5kYXRh
KCkgKyBwb3MgKyAxLCBjb2x1bW5zLmRhdGEoKSArIHBvcywgKG9sZFNpemUtcG9zKSpzaXplb2Yo
Q29sdW1uU3RydWN0KSk7Ci0gICAgY29sdW1uc1twb3MrMV0uc3BhbiA9IG9sZFNwYW4gLSBmaXJz
dFNwYW47Ci0KLSAgICAvLyBjaGFuZ2Ugd2lkdGggb2YgYWxsIHJvd3MuCi0gICAgZm9yIChSZW5k
ZXJPYmplY3QgKmNoaWxkID0gZmlyc3RDaGlsZCgpOyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4
dFNpYmxpbmcoKSkgewotCWlmIChjaGlsZC0+aXNUYWJsZVNlY3Rpb24oKSkgewotCSAgICBSZW5k
ZXJUYWJsZVNlY3Rpb24gKnNlY3Rpb24gPSBzdGF0aWNfY2FzdDxSZW5kZXJUYWJsZVNlY3Rpb24g
Kj4oY2hpbGQpOwotCSAgICBpZiAoc2VjdGlvbi0+Y0NvbCA+IHBvcykKLQkJc2VjdGlvbi0+Y0Nv
bCsrOwotCSAgICBpbnQgc2l6ZSA9IHNlY3Rpb24tPm51bVJvd3MoKTsKLQkgICAgZm9yIChpbnQg
cm93ID0gMDsgcm93IDwgc2l6ZTsgKytyb3cpIHsKLQkJc2VjdGlvbi0+Z3JpZFtyb3ddLnJvdy0+
cmVzaXplKG9sZFNpemUgKyAxKTsKLQkJUmVuZGVyVGFibGVTZWN0aW9uOjpSb3cgJnIgPSAqc2Vj
dGlvbi0+Z3JpZFtyb3ddLnJvdzsKLQkJbWVtbW92ZShyLmRhdGEoKSArIHBvcyArIDEsIHIuZGF0
YSgpICsgcG9zLCAob2xkU2l6ZSAtIHBvcykgKiBzaXplb2YoUmVuZGVyVGFibGVTZWN0aW9uOjpD
ZWxsU3RydWN0KSk7Ci0JCXJbcG9zICsgMV0uY2VsbCA9IDA7Ci0gICAgICAgICAgICAgICAgcltw
b3MgKyAxXS5pbkNvbFNwYW4gPSByW3Bvc10uaW5Db2xTcGFuIHx8IHJbcG9zXS5jZWxsOwotCSAg
ICB9Ci0JfQotICAgIH0KLSAgICBjb2x1bW5Qb3MucmVzaXplKG51bUVmZkNvbHMoKSArIDEpOwot
ICAgIHNldE5lZWRzTGF5b3V0QW5kTWluTWF4UmVjYWxjKCk7Ci19Ci0KLXZvaWQgUmVuZGVyVGFi
bGU6OmFwcGVuZENvbHVtbihpbnQgc3BhbikKLXsKLSAgICAvLyBlYXN5IGNhc2UuCi0gICAgaW50
IHBvcyA9IGNvbHVtbnMuc2l6ZSgpOwotICAgIGludCBuZXdTaXplID0gcG9zICsgMTsKLSAgICBj
b2x1bW5zLnJlc2l6ZShuZXdTaXplKTsKLSAgICBjb2x1bW5zW3Bvc10uc3BhbiA9IHNwYW47Ci0K
LSAgICAvLyBjaGFuZ2Ugd2lkdGggb2YgYWxsIHJvd3MuCi0gICAgZm9yIChSZW5kZXJPYmplY3Qg
KmNoaWxkID0gZmlyc3RDaGlsZCgpOyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4dFNpYmxpbmco
KSkgewotCWlmIChjaGlsZC0+aXNUYWJsZVNlY3Rpb24oKSkgewotCSAgICBSZW5kZXJUYWJsZVNl
Y3Rpb24gKnNlY3Rpb24gPSBzdGF0aWNfY2FzdDxSZW5kZXJUYWJsZVNlY3Rpb24gKj4oY2hpbGQp
OwotCSAgICBpbnQgc2l6ZSA9IHNlY3Rpb24tPm51bVJvd3MoKTsKLQkgICAgZm9yIChpbnQgcm93
ID0gMDsgcm93IDwgc2l6ZTsgKytyb3cpIHsKLQkJc2VjdGlvbi0+Z3JpZFtyb3ddLnJvdy0+cmVz
aXplKG5ld1NpemUpOwotICAgICAgICAgICAgICAgIFJlbmRlclRhYmxlU2VjdGlvbjo6Q2VsbFN0
cnVjdCYgYyA9IHNlY3Rpb24tPmNlbGxBdChyb3csIHBvcyk7Ci0JCWMuY2VsbCA9IDA7Ci0JCWMu
aW5Db2xTcGFuID0gZmFsc2U7Ci0JICAgIH0KLQl9Ci0gICAgfQotICAgIGNvbHVtblBvcy5yZXNp
emUobnVtRWZmQ29scygpICsgMSk7Ci0gICAgc2V0TmVlZHNMYXlvdXRBbmRNaW5NYXhSZWNhbGMo
KTsKLX0KLQotUmVuZGVyVGFibGVDb2wgKlJlbmRlclRhYmxlOjpjb2xFbGVtZW50KGludCBjb2wp
IHsKLSAgICBpZiAoIWhhc19jb2xfZWxlbXMpCi0JcmV0dXJuIDA7Ci0gICAgUmVuZGVyT2JqZWN0
ICpjaGlsZCA9IGZpcnN0Q2hpbGQoKTsKLSAgICBpbnQgY0NvbCA9IDA7Ci0gICAgd2hpbGUgKGNo
aWxkKSB7Ci0JaWYgKGNoaWxkLT5pc1RhYmxlQ29sKCkpIHsKLQkgICAgUmVuZGVyVGFibGVDb2wg
KmNvbEVsZW0gPSBzdGF0aWNfY2FzdDxSZW5kZXJUYWJsZUNvbCAqPihjaGlsZCk7Ci0JICAgIGlu
dCBzcGFuID0gY29sRWxlbS0+c3BhbigpOwotCSAgICBpZiAoIWNvbEVsZW0tPmZpcnN0Q2hpbGQo
KSkgewotCQljQ29sICs9IHNwYW47Ci0JCWlmIChjQ29sID4gY29sKQotCQkgICAgcmV0dXJuIGNv
bEVsZW07Ci0JICAgIH0KLQotCSAgICBSZW5kZXJPYmplY3QgKm5leHQgPSBjaGlsZC0+Zmlyc3RD
aGlsZCgpOwotCSAgICBpZiAoIW5leHQpCi0JCW5leHQgPSBjaGlsZC0+bmV4dFNpYmxpbmcoKTsK
LQkgICAgaWYgKCFuZXh0ICYmIGNoaWxkLT5wYXJlbnQoKS0+aXNUYWJsZUNvbCgpKQotCQluZXh0
ID0gY2hpbGQtPnBhcmVudCgpLT5uZXh0U2libGluZygpOwotCSAgICBjaGlsZCA9IG5leHQ7Ci0J
fSBlbHNlIGlmIChjaGlsZCA9PSB0Q2FwdGlvbikKLSAgICAgICAgICAgIGNoaWxkID0gY2hpbGQt
Pm5leHRTaWJsaW5nKCk7Ci0gICAgICAgIGVsc2UKLQkgICAgYnJlYWs7Ci0gICAgfQotICAgIHJl
dHVybiAwOwotfQotCi12b2lkIFJlbmRlclRhYmxlOjpyZWNhbGNTZWN0aW9ucygpCi17Ci0gICAg
dENhcHRpb24gPSAwOwotICAgIGhlYWQgPSBmb290ID0gZmlyc3RCb2R5ID0gMDsKLSAgICBoYXNf
Y29sX2VsZW1zID0gZmFsc2U7Ci0KLSAgICAvLyBXZSBuZWVkIHRvIGdldCB2YWxpZCBwb2ludGVy
cyB0byBjYXB0aW9uLCBoZWFkLCBmb290IGFuZCBmaXJzdGJvZHkgYWdhaW4KLSAgICBmb3IgKFJl
bmRlck9iamVjdCAqY2hpbGQgPSBmaXJzdENoaWxkKCk7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5u
ZXh0U2libGluZygpKSB7Ci0Jc3dpdGNoIChjaGlsZC0+c3R5bGUoKS0+ZGlzcGxheSgpKSB7Ci0g
ICAgICAgICAgICBjYXNlIFRBQkxFX0NBUFRJT046Ci0gICAgICAgICAgICAgICAgaWYgKCF0Q2Fw
dGlvbikgewotICAgICAgICAgICAgICAgICAgICB0Q2FwdGlvbiA9IHN0YXRpY19jYXN0PFJlbmRl
ckJsb2NrKj4oY2hpbGQpOwotICAgICAgICAgICAgICAgICAgICB0Q2FwdGlvbi0+c2V0TmVlZHNM
YXlvdXQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwot
ICAgICAgICAgICAgY2FzZSBUQUJMRV9DT0xVTU46Ci0gICAgICAgICAgICBjYXNlIFRBQkxFX0NP
TFVNTl9HUk9VUDoKLSAgICAgICAgICAgICAgICBoYXNfY29sX2VsZW1zID0gdHJ1ZTsKLSAgICAg
ICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVEFCTEVfSEVBREVSX0dST1VQOiB7
Ci0gICAgICAgICAgICAgICAgUmVuZGVyVGFibGVTZWN0aW9uICpzZWN0aW9uID0gc3RhdGljX2Nh
c3Q8UmVuZGVyVGFibGVTZWN0aW9uICo+KGNoaWxkKTsKLSAgICAgICAgICAgICAgICBpZiAoIWhl
YWQpCi0gICAgICAgICAgICAgICAgICAgIGhlYWQgPSBzZWN0aW9uOwotICAgICAgICAgICAgICAg
IGVsc2UgaWYgKCFmaXJzdEJvZHkpCi0gICAgICAgICAgICAgICAgICAgIGZpcnN0Qm9keSA9IHNl
Y3Rpb247Ci0gICAgICAgICAgICAgICAgaWYgKHNlY3Rpb24tPm5lZWRDZWxsUmVjYWxjKQotICAg
ICAgICAgICAgICAgICAgICBzZWN0aW9uLT5yZWNhbGNDZWxscygpOwotICAgICAgICAgICAgICAg
IGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBUQUJMRV9GT09URVJfR1JP
VVA6IHsKLSAgICAgICAgICAgICAgICBSZW5kZXJUYWJsZVNlY3Rpb24gKnNlY3Rpb24gPSBzdGF0
aWNfY2FzdDxSZW5kZXJUYWJsZVNlY3Rpb24gKj4oY2hpbGQpOwotICAgICAgICAgICAgICAgIGlm
ICghZm9vdCkKLSAgICAgICAgICAgICAgICAgICAgZm9vdCA9IHNlY3Rpb247Ci0gICAgICAgICAg
ICAgICAgZWxzZSBpZiAoIWZpcnN0Qm9keSkKLSAgICAgICAgICAgICAgICAgICAgZmlyc3RCb2R5
ID0gc2VjdGlvbjsKLSAgICAgICAgICAgICAgICBpZiAoc2VjdGlvbi0+bmVlZENlbGxSZWNhbGMp
Ci0gICAgICAgICAgICAgICAgICAgIHNlY3Rpb24tPnJlY2FsY0NlbGxzKCk7Ci0gICAgICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFRBQkxFX1JPV19H
Uk9VUDogewotICAgICAgICAgICAgICAgIFJlbmRlclRhYmxlU2VjdGlvbiAqc2VjdGlvbiA9IHN0
YXRpY19jYXN0PFJlbmRlclRhYmxlU2VjdGlvbiAqPihjaGlsZCk7Ci0gICAgICAgICAgICAgICAg
aWYgKCFmaXJzdEJvZHkpCi0gICAgICAgICAgICAgICAgICAgIGZpcnN0Qm9keSA9IHNlY3Rpb247
Ci0gICAgICAgICAgICAgICAgaWYgKHNlY3Rpb24tPm5lZWRDZWxsUmVjYWxjKQotICAgICAgICAg
ICAgICAgICAgICBzZWN0aW9uLT5yZWNhbGNDZWxscygpOwotICAgICAgICAgICAgfQotICAgICAg
ICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBicmVhazsKLQl9Ci0gICAgfQotICAgIG5l
ZWRTZWN0aW9uUmVjYWxjID0gZmFsc2U7Ci0gICAgc2V0TmVlZHNMYXlvdXQodHJ1ZSk7Ci19Ci0K
LVJlbmRlck9iamVjdCogUmVuZGVyVGFibGU6OnJlbW92ZUNoaWxkTm9kZShSZW5kZXJPYmplY3Qq
IGNoaWxkKQotewotICAgIHNldE5lZWRTZWN0aW9uUmVjYWxjKCk7Ci0gICAgcmV0dXJuIFJlbmRl
ckNvbnRhaW5lcjo6cmVtb3ZlQ2hpbGROb2RlKGNoaWxkKTsKLX0KLQotaW50IFJlbmRlclRhYmxl
Ojpib3JkZXJMZWZ0KCkgY29uc3QKLXsKLSAgICBpZiAoY29sbGFwc2VCb3JkZXJzKCkpIHsKLSAg
ICAgICAgLy8gRklYTUU6IEZvciBzdHJpY3QgbW9kZSwgcmV0dXJuaW5nIDAgaXMgY29ycmVjdCwg
c2luY2UgdGhlIHRhYmxlIGJvcmRlciBoYWxmIHNwaWxscyBpbnRvIHRoZSBtYXJnaW4sCi0gICAg
ICAgIC8vIGJ1dCBJJ20gd29ya2luZyB0byBnZXQgdGhpcyBjaGFuZ2VkLiAgRm9yIG5vdywgZm9s
bG93IHRoZSBzcGVjLgotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIFJlbmRl
ckJsb2NrOjpib3JkZXJMZWZ0KCk7Ci19Ci0gICAgCi1pbnQgUmVuZGVyVGFibGU6OmJvcmRlclJp
Z2h0KCkgY29uc3QKLXsKLSAgICBpZiAoY29sbGFwc2VCb3JkZXJzKCkpIHsKLSAgICAgICAgLy8g
RklYTUU6IEZvciBzdHJpY3QgbW9kZSwgcmV0dXJuaW5nIDAgaXMgY29ycmVjdCwgc2luY2UgdGhl
IHRhYmxlIGJvcmRlciBoYWxmIHNwaWxscyBpbnRvIHRoZSBtYXJnaW4sCi0gICAgICAgIC8vIGJ1
dCBJJ20gd29ya2luZyB0byBnZXQgdGhpcyBjaGFuZ2VkLiAgRm9yIG5vdywgZm9sbG93IHRoZSBz
cGVjLgotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIFJlbmRlckJsb2NrOjpi
b3JkZXJSaWdodCgpOwotfQotCi1pbnQgUmVuZGVyVGFibGU6OmJvcmRlclRvcCgpIGNvbnN0Ci17
Ci0gICAgaWYgKGNvbGxhcHNlQm9yZGVycygpKSB7Ci0gICAgICAgIC8vIEZJWE1FOiBGb3Igc3Ry
aWN0IG1vZGUsIHJldHVybmluZyAwIGlzIGNvcnJlY3QsIHNpbmNlIHRoZSB0YWJsZSBib3JkZXIg
aGFsZiBzcGlsbHMgaW50byB0aGUgbWFyZ2luLAotICAgICAgICAvLyBidXQgSSdtIHdvcmtpbmcg
dG8gZ2V0IHRoaXMgY2hhbmdlZC4gIEZvciBub3csIGZvbGxvdyB0aGUgc3BlYy4KLSAgICAgICAg
cmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBSZW5kZXJCbG9jazo6Ym9yZGVyVG9wKCk7Ci19
Ci0KLWludCBSZW5kZXJUYWJsZTo6Ym9yZGVyQm90dG9tKCkgY29uc3QKLXsKLSAgICBpZiAoY29s
bGFwc2VCb3JkZXJzKCkpIHsKLSAgICAgICAgLy8gRklYTUU6IEZvciBzdHJpY3QgbW9kZSwgcmV0
dXJuaW5nIDAgaXMgY29ycmVjdCwgc2luY2UgdGhlIHRhYmxlIGJvcmRlciBoYWxmIHNwaWxscyBp
bnRvIHRoZSBtYXJnaW4sCi0gICAgICAgIC8vIGJ1dCBJJ20gd29ya2luZyB0byBnZXQgdGhpcyBj
aGFuZ2VkLiAgRm9yIG5vdywgZm9sbG93IHRoZSBzcGVjLgotICAgICAgICByZXR1cm4gMDsKLSAg
ICB9Ci0gICAgcmV0dXJuIFJlbmRlckJsb2NrOjpib3JkZXJCb3R0b20oKTsKLX0KLQotUmVuZGVy
VGFibGVDZWxsKiBSZW5kZXJUYWJsZTo6Y2VsbEFib3ZlKGNvbnN0IFJlbmRlclRhYmxlQ2VsbCog
Y2VsbCkgY29uc3QKLXsKLSAgICAvLyBGaW5kIHRoZSBzZWN0aW9uIGFuZCByb3cgdG8gbG9vayBp
bgotICAgIGludCByID0gY2VsbC0+cm93KCk7Ci0gICAgUmVuZGVyVGFibGVTZWN0aW9uKiBzZWN0
aW9uID0gMDsKLSAgICBpbnQgckFib3ZlID0gLTE7Ci0gICAgaWYgKHIgPiAwKSB7Ci0gICAgICAg
IC8vIGNlbGwgaXMgbm90IGluIHRoZSBmaXJzdCByb3csIHNvIHVzZSB0aGUgYWJvdmUgcm93IGlu
IGl0cyBvd24gc2VjdGlvbgotICAgICAgICBzZWN0aW9uID0gY2VsbC0+c2VjdGlvbigpOwotICAg
ICAgICByQWJvdmUgPSByLTE7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gY2VsbCBpcyBhdCB0
b3Agb2YgYSBzZWN0aW9uLCB1c2UgbGFzdCByb3cgaW4gcHJldmlvdXMgc2VjdGlvbgotICAgICAg
ICBmb3IgKFJlbmRlck9iamVjdCAqcHJldlNlY3Rpb24gPSBjZWxsLT5zZWN0aW9uKCktPnByZXZp
b3VzU2libGluZygpOwotICAgICAgICAgICAgIHByZXZTZWN0aW9uICYmIHJBYm92ZSA8IDA7Ci0g
ICAgICAgICAgICAgcHJldlNlY3Rpb24gPSBwcmV2U2VjdGlvbi0+cHJldmlvdXNTaWJsaW5nKCkp
IHsKLSAgICAgICAgICAgIGlmIChwcmV2U2VjdGlvbi0+aXNUYWJsZVNlY3Rpb24oKSkgewotICAg
ICAgICAgICAgICAgIHNlY3Rpb24gPSBzdGF0aWNfY2FzdDxSZW5kZXJUYWJsZVNlY3Rpb24gKj4o
cHJldlNlY3Rpb24pOwotICAgICAgICAgICAgICAgIGlmIChzZWN0aW9uLT5udW1Sb3dzKCkgPiAw
KQotICAgICAgICAgICAgICAgICAgICByQWJvdmUgPSBzZWN0aW9uLT5udW1Sb3dzKCktMTsKLSAg
ICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIExvb2sgdXAgdGhlIGNlbGwg
aW4gdGhlIHNlY3Rpb24ncyBncmlkLCB3aGljaCByZXF1aXJlcyBlZmZlY3RpdmUgY29sIGluZGV4
Ci0gICAgaWYgKHNlY3Rpb24gJiYgckFib3ZlID49IDApIHsKLSAgICAgICAgaW50IGVmZkNvbCA9
IGNvbFRvRWZmQ29sKGNlbGwtPmNvbCgpKTsKLSAgICAgICAgUmVuZGVyVGFibGVTZWN0aW9uOjpD
ZWxsU3RydWN0IGFib3ZlQ2VsbDsKLSAgICAgICAgLy8gSWYgd2UgaGl0IGEgc3BhbiBiYWNrIHVw
IHRvIGEgcmVhbCBjZWxsLgotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBhYm92ZUNlbGwgPSBz
ZWN0aW9uLT5jZWxsQXQockFib3ZlLCBlZmZDb2wpOwotICAgICAgICAgICAgZWZmQ29sLS07Ci0g
ICAgICAgIH0gd2hpbGUgKCFhYm92ZUNlbGwuY2VsbCAmJiBhYm92ZUNlbGwuaW5Db2xTcGFuICYm
IGVmZkNvbCA+PTApOwotICAgICAgICByZXR1cm4gYWJvdmVDZWxsLmNlbGw7Ci0gICAgfSBlbHNl
Ci0gICAgICAgIHJldHVybiAwOwotfQotCi1SZW5kZXJUYWJsZUNlbGwqIFJlbmRlclRhYmxlOjpj
ZWxsQmVsb3coY29uc3QgUmVuZGVyVGFibGVDZWxsKiBjZWxsKSBjb25zdAotewotICAgIC8vIEZp
bmQgdGhlIHNlY3Rpb24gYW5kIHJvdyB0byBsb29rIGluCi0gICAgaW50IHIgPSBjZWxsLT5yb3co
KSArIGNlbGwtPnJvd1NwYW4oKSAtIDE7Ci0gICAgUmVuZGVyVGFibGVTZWN0aW9uKiBzZWN0aW9u
ID0gMDsKLSAgICBpbnQgckJlbG93ID0gLTE7Ci0gICAgaWYgKHIgPCBjZWxsLT5zZWN0aW9uKCkt
Pm51bVJvd3MoKSAtIDEpIHsKLSAgICAgICAgLy8gVGhlIGNlbGwgaXMgbm90IGluIHRoZSBsYXN0
IHJvdywgc28gdXNlIHRoZSBuZXh0IHJvdyBpbiB0aGUgc2VjdGlvbi4KLSAgICAgICAgc2VjdGlv
biA9IGNlbGwtPnNlY3Rpb24oKTsKLSAgICAgICAgckJlbG93PSByKzE7Ci0gICAgfSBlbHNlIHsK
LSAgICAgICAgLy8gVGhlIGNlbGwgaXMgYXQgdGhlIGJvdHRvbSBvZiBhIHNlY3Rpb24uIFVzZSB0
aGUgZmlyc3Qgcm93IGluIHRoZSBuZXh0IHNlY3Rpb24uCi0gICAgICAgIGZvciAoUmVuZGVyT2Jq
ZWN0KiBuZXh0U2VjdGlvbiA9IGNlbGwtPnNlY3Rpb24oKS0+bmV4dFNpYmxpbmcoKTsKLSAgICAg
ICAgICAgICBuZXh0U2VjdGlvbiAmJiByQmVsb3cgPCAwOwotICAgICAgICAgICAgIG5leHRTZWN0
aW9uID0gbmV4dFNlY3Rpb24tPm5leHRTaWJsaW5nKCkpIHsKLSAgICAgICAgICAgIGlmIChuZXh0
U2VjdGlvbi0+aXNUYWJsZVNlY3Rpb24oKSkgewotICAgICAgICAgICAgICAgIHNlY3Rpb24gPSBz
dGF0aWNfY2FzdDxSZW5kZXJUYWJsZVNlY3Rpb24gKj4obmV4dFNlY3Rpb24pOwotICAgICAgICAg
ICAgICAgIGlmIChzZWN0aW9uLT5udW1Sb3dzKCkgPiAwKQotICAgICAgICAgICAgICAgICAgICBy
QmVsb3cgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8v
IExvb2sgdXAgdGhlIGNlbGwgaW4gdGhlIHNlY3Rpb24ncyBncmlkLCB3aGljaCByZXF1aXJlcyBl
ZmZlY3RpdmUgY29sIGluZGV4Ci0gICAgaWYgKHNlY3Rpb24gJiYgckJlbG93ID49IDApIHsKLSAg
ICAgICAgaW50IGVmZkNvbCA9IGNvbFRvRWZmQ29sKGNlbGwtPmNvbCgpKTsKLSAgICAgICAgUmVu
ZGVyVGFibGVTZWN0aW9uOjpDZWxsU3RydWN0IGJlbG93Q2VsbDsKLSAgICAgICAgLy8gSWYgd2Ug
aGl0IGEgY29sc3BhbiBiYWNrIHVwIHRvIGEgcmVhbCBjZWxsLgotICAgICAgICBkbyB7Ci0gICAg
ICAgICAgICBiZWxvd0NlbGwgPSBzZWN0aW9uLT5jZWxsQXQockJlbG93LCBlZmZDb2wpOwotICAg
ICAgICAgICAgZWZmQ29sLS07Ci0gICAgICAgIH0gd2hpbGUgKCFiZWxvd0NlbGwuY2VsbCAmJiBi
ZWxvd0NlbGwuaW5Db2xTcGFuICYmIGVmZkNvbCA+PTApOwotICAgICAgICByZXR1cm4gYmVsb3dD
ZWxsLmNlbGw7Ci0gICAgfSBlbHNlCi0gICAgICAgIHJldHVybiAwOwotfQotCi1SZW5kZXJUYWJs
ZUNlbGwqIFJlbmRlclRhYmxlOjpjZWxsTGVmdChjb25zdCBSZW5kZXJUYWJsZUNlbGwqIGNlbGwp
IGNvbnN0Ci17Ci0gICAgUmVuZGVyVGFibGVTZWN0aW9uKiBzZWN0aW9uID0gY2VsbC0+c2VjdGlv
bigpOwotICAgIGludCBlZmZDb2wgPSBjb2xUb0VmZkNvbChjZWxsLT5jb2woKSk7Ci0gICAgaWYg
KGVmZkNvbCA9PSAwKQotICAgICAgICByZXR1cm4gMDsKLSAgICAKLSAgICAvLyBJZiB3ZSBoaXQg
YSBjb2xzcGFuIGJhY2sgdXAgdG8gYSByZWFsIGNlbGwuCi0gICAgUmVuZGVyVGFibGVTZWN0aW9u
OjpDZWxsU3RydWN0IHByZXZDZWxsOwotICAgIGRvIHsKLSAgICAgICAgcHJldkNlbGwgPSBzZWN0
aW9uLT5jZWxsQXQoY2VsbC0+cm93KCksIGVmZkNvbC0xKTsKLSAgICAgICAgZWZmQ29sLS07Ci0g
ICAgfSB3aGlsZSAoIXByZXZDZWxsLmNlbGwgJiYgcHJldkNlbGwuaW5Db2xTcGFuICYmIGVmZkNv
bCA+PTApOwotICAgIHJldHVybiBwcmV2Q2VsbC5jZWxsOwotfQotCi1SZW5kZXJUYWJsZUNlbGwq
IFJlbmRlclRhYmxlOjpjZWxsUmlnaHQoY29uc3QgUmVuZGVyVGFibGVDZWxsKiBjZWxsKSBjb25z
dAotewotICAgIGludCBlZmZDb2wgPSBjb2xUb0VmZkNvbChjZWxsLT5jb2woKSArIGNlbGwtPmNv
bFNwYW4oKSk7Ci0gICAgaWYgKGVmZkNvbCA+PSBudW1FZmZDb2xzKCkpCi0gICAgICAgIHJldHVy
biAwOwotICAgIHJldHVybiBjZWxsLT5zZWN0aW9uKCktPmNlbGxBdChjZWxsLT5yb3coKSwgZWZm
Q29sKS5jZWxsOwotfQotCi1SZW5kZXJCbG9jayogUmVuZGVyVGFibGU6OmZpcnN0TGluZUJsb2Nr
KCkgY29uc3QKLXsKLSAgICByZXR1cm4gMDsKLX0KLQotdm9pZCBSZW5kZXJUYWJsZTo6dXBkYXRl
Rmlyc3RMZXR0ZXIoKQote30KLQotI2lmbmRlZiBOREVCVUcKLXZvaWQgUmVuZGVyVGFibGU6OmR1
bXAoUVRleHRTdHJlYW0gKnN0cmVhbSwgUVN0cmluZyBpbmQpIGNvbnN0Ci17Ci0gICAgaWYgKHRD
YXB0aW9uKQotCSpzdHJlYW0gPDwgIiB0Q2FwdGlvbiI7Ci0gICAgaWYgKGhlYWQpCi0JKnN0cmVh
bSA8PCAiIGhlYWQiOwotICAgIGlmIChmb290KQotCSpzdHJlYW0gPDwgIiBmb290IjsKLQotICAg
ICpzdHJlYW0gPDwgZW5kbCA8PCBpbmQgPDwgImNzcGFuczoiOwotICAgIGZvciAoIHVuc2lnbmVk
IGludCBpID0gMDsgaSA8IGNvbHVtbnMuc2l6ZSgpOyBpKysgKQotCSpzdHJlYW0gPDwgIiAiIDw8
IGNvbHVtbnNbaV0uc3BhbjsKLSAgICAqc3RyZWFtIDw8IGVuZGwgPDwgaW5kOwotCi0gICAgUmVu
ZGVyQmxvY2s6OmR1bXAoc3RyZWFtLGluZCk7Ci19Ci0jZW5kaWYKLQotLy8gLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0KLQotUmVuZGVyVGFibGVTZWN0aW9uOjpSZW5kZXJUYWJsZVNlY3Rpb24oRE9NOjpOb2Rl
SW1wbCogbm9kZSkKLSAgICA6IFJlbmRlckNvbnRhaW5lcihub2RlKQotewotICAgIC8vIGluaXQg
UmVuZGVyT2JqZWN0IGF0dHJpYnV0ZXMKLSAgICBzZXRJbmxpbmUoZmFsc2UpOyAgIC8vIG91ciBv
YmplY3QgaXMgbm90IElubGluZQotICAgIGdyaWRSb3dzID0gMDsKLSAgICBjQ29sID0gMDsKLSAg
ICBjUm93ID0gLTE7Ci0gICAgbmVlZENlbGxSZWNhbGMgPSBmYWxzZTsKLX0KLQotUmVuZGVyVGFi
bGVTZWN0aW9uOjp+UmVuZGVyVGFibGVTZWN0aW9uKCkKLXsKLSAgICBjbGVhckdyaWQoKTsKLX0K
LQotdm9pZCBSZW5kZXJUYWJsZVNlY3Rpb246OmRlc3Ryb3koKQotewotICAgIC8vIHJlY2FsYyBj
ZWxsIGluZm8gYmVjYXVzZSBSZW5kZXJUYWJsZSBoYXMgdW5ndWFyZGVkIHBvaW50ZXJzCi0gICAg
Ly8gc3RvcmVkIHRoYXQgcG9pbnQgdG8gdGhpcyBSZW5kZXJUYWJsZVNlY3Rpb24uCi0gICAgaWYg
KHRhYmxlKCkpCi0gICAgICAgIHRhYmxlKCktPnNldE5lZWRTZWN0aW9uUmVjYWxjKCk7Ci0KLSAg
ICBSZW5kZXJDb250YWluZXI6OmRlc3Ryb3koKTsKLX0KLQotdm9pZCBSZW5kZXJUYWJsZVNlY3Rp
b246OnNldFN0eWxlKFJlbmRlclN0eWxlKiBfc3R5bGUpCi17Ci0gICAgLy8gd2UgZG9uJ3QgYWxs
b3cgY2hhbmdpbmcgdGhpcyBvbmUKLSAgICBpZiAoc3R5bGUoKSkKLSAgICAgICAgX3N0eWxlLT5z
ZXREaXNwbGF5KHN0eWxlKCktPmRpc3BsYXkoKSk7Ci0gICAgZWxzZSBpZiAoX3N0eWxlLT5kaXNw
bGF5KCkgIT0gVEFCTEVfRk9PVEVSX0dST1VQICYmIF9zdHlsZS0+ZGlzcGxheSgpICE9IFRBQkxF
X0hFQURFUl9HUk9VUCkKLSAgICAgICAgX3N0eWxlLT5zZXREaXNwbGF5KFRBQkxFX1JPV19HUk9V
UCk7Ci0KLSAgICBSZW5kZXJDb250YWluZXI6OnNldFN0eWxlKF9zdHlsZSk7Ci19Ci0KLXZvaWQg
UmVuZGVyVGFibGVTZWN0aW9uOjphZGRDaGlsZChSZW5kZXJPYmplY3QgKmNoaWxkLCBSZW5kZXJP
YmplY3QgKmJlZm9yZUNoaWxkKQotewotICAgIFJlbmRlck9iamVjdCAqcm93ID0gY2hpbGQ7Ci0K
LSAgICBpZiAoY2hpbGQtPmVsZW1lbnQoKSAmJiBjaGlsZC0+ZWxlbWVudCgpLT5oYXNUYWdOYW1l
KGZvcm1UYWcpKSB7Ci0gICAgICAgIFJlbmRlckNvbnRhaW5lcjo6YWRkQ2hpbGQoY2hpbGQsYmVm
b3JlQ2hpbGQpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIAotICAgIGlmICghY2hpbGQt
PmlzVGFibGVSb3coKSkgewotCi0gICAgICAgIGlmICghYmVmb3JlQ2hpbGQpCi0gICAgICAgICAg
ICBiZWZvcmVDaGlsZCA9IGxhc3RDaGlsZCgpOwotCi0gICAgICAgIGlmIChiZWZvcmVDaGlsZCAm
JiBiZWZvcmVDaGlsZC0+aXNBbm9ueW1vdXMoKSkKLSAgICAgICAgICAgIHJvdyA9IGJlZm9yZUNo
aWxkOwotICAgICAgICBlbHNlIHsKLQkgICAgUmVuZGVyT2JqZWN0ICpsYXN0Qm94ID0gYmVmb3Jl
Q2hpbGQ7Ci0JICAgIHdoaWxlIChsYXN0Qm94ICYmIGxhc3RCb3gtPnBhcmVudCgpLT5pc0Fub255
bW91cygpICYmICFsYXN0Qm94LT5pc1RhYmxlUm93KCkpCi0JCWxhc3RCb3ggPSBsYXN0Qm94LT5w
YXJlbnQoKTsKLQkgICAgaWYgKGxhc3RCb3ggJiYgbGFzdEJveC0+aXNBbm9ueW1vdXMoKSkgewot
CQlsYXN0Qm94LT5hZGRDaGlsZCggY2hpbGQsIGJlZm9yZUNoaWxkICk7Ci0JCXJldHVybjsKLQkg
ICAgfSBlbHNlIHsKLQkJcm93ID0gbmV3IChyZW5kZXJBcmVuYSgpKSBSZW5kZXJUYWJsZVJvdyhk
b2N1bWVudCgpIC8qIGFub255bW91cyB0YWJsZSAqLyk7Ci0JCVJlbmRlclN0eWxlICpuZXdTdHls
ZSA9IG5ldyAocmVuZGVyQXJlbmEoKSkgUmVuZGVyU3R5bGUoKTsKLQkJbmV3U3R5bGUtPmluaGVy
aXRGcm9tKHN0eWxlKCkpOwotCQluZXdTdHlsZS0+c2V0RGlzcGxheShUQUJMRV9ST1cpOwotCQly
b3ctPnNldFN0eWxlKG5ld1N0eWxlKTsKLQkJYWRkQ2hpbGQocm93LCBiZWZvcmVDaGlsZCk7Ci0J
ICAgIH0KLSAgICAgICAgfQotICAgICAgICByb3ctPmFkZENoaWxkKGNoaWxkKTsKLSAgICAgICAg
Y2hpbGQtPnNldE5lZWRzTGF5b3V0QW5kTWluTWF4UmVjYWxjKCk7Ci0gICAgICAgIHJldHVybjsK
LSAgICB9Ci0KLSAgICBpZiAoYmVmb3JlQ2hpbGQpCi0Jc2V0TmVlZENlbGxSZWNhbGMoKTsKLQot
ICAgIGNSb3crKzsKLSAgICBjQ29sID0gMDsKLQotICAgIGVuc3VyZVJvd3MoY1JvdysxKTsKLQot
ICAgIGlmICghYmVmb3JlQ2hpbGQpIHsKLSAgICAgICAgZ3JpZFtjUm93XS5oZWlnaHQgPSBjaGls
ZC0+c3R5bGUoKS0+aGVpZ2h0KCk7Ci0gICAgICAgIGlmIChncmlkW2NSb3ddLmhlaWdodC50eXBl
ID09IFJlbGF0aXZlKQotICAgICAgICAgICAgZ3JpZFtjUm93XS5oZWlnaHQgPSBMZW5ndGgoKTsK
LSAgICB9Ci0KLQotICAgIFJlbmRlckNvbnRhaW5lcjo6YWRkQ2hpbGQoY2hpbGQsYmVmb3JlQ2hp
bGQpOwotfQotCi1ib29sIFJlbmRlclRhYmxlU2VjdGlvbjo6ZW5zdXJlUm93cyhpbnQgbnVtUm93
cykKLXsKLSAgICBpbnQgblJvd3MgPSBncmlkUm93czsKLSAgICBpZiAobnVtUm93cyA+IG5Sb3dz
KSB7Ci0gICAgICAgIGlmIChudW1Sb3dzID4gc3RhdGljX2Nhc3Q8aW50PihncmlkLnNpemUoKSkp
Ci0gICAgICAgICAgICBpZiAoIWdyaWQucmVzaXplKG51bVJvd3MqMisxKSkKLSAgICAgICAgICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgZ3JpZFJvd3MgPSBudW1Sb3dzOwotICAgICAg
ICBpbnQgbkNvbHMgPSB0YWJsZSgpLT5udW1FZmZDb2xzKCk7Ci0gICAgICAgIENlbGxTdHJ1Y3Qg
ZW1wdHlDZWxsU3RydWN0OwotICAgICAgICBlbXB0eUNlbGxTdHJ1Y3QuY2VsbCA9IDA7Ci0gICAg
ICAgIGVtcHR5Q2VsbFN0cnVjdC5pbkNvbFNwYW4gPSBmYWxzZTsKLQlmb3IgKGludCByID0gblJv
d3M7IHIgPCBudW1Sb3dzOyByKyspIHsKLQkgICAgZ3JpZFtyXS5yb3cgPSBuZXcgUm93KG5Db2xz
KTsKLQkgICAgZ3JpZFtyXS5yb3ctPmZpbGwoZW1wdHlDZWxsU3RydWN0KTsKLQkgICAgZ3JpZFty
XS5iYXNlTGluZSA9IDA7Ci0JICAgIGdyaWRbcl0uaGVpZ2h0ID0gTGVuZ3RoKCk7Ci0JfQotICAg
IH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIFJlbmRlclRhYmxlU2VjdGlvbjo6YWRk
Q2VsbChSZW5kZXJUYWJsZUNlbGwgKmNlbGwpCi17Ci0gICAgaW50IHJTcGFuID0gY2VsbC0+cm93
U3BhbigpOwotICAgIGludCBjU3BhbiA9IGNlbGwtPmNvbFNwYW4oKTsKLSAgICBBcnJheTxSZW5k
ZXJUYWJsZTo6Q29sdW1uU3RydWN0PiAmY29sdW1ucyA9IHRhYmxlKCktPmNvbHVtbnM7Ci0gICAg
aW50IG5Db2xzID0gY29sdW1ucy5zaXplKCk7Ci0KLSAgICAvLyAjIyMgbW96aWxsYSBzdGlsbCBz
ZWVtcyB0byBkbyB0aGUgb2xkIEhUTUwgd2F5LCBldmVuIGZvciBzdHJpY3QgRFRECi0gICAgLy8g
KHNlZSB0aGUgYW5ub3RhdGlvbiBvbiB0YWJsZSBjZWxsIGxheW91dGluZyBpbiB0aGUgQ1NTIHNw
ZWNzIGFuZCB0aGUgdGVzdGNhc2UgYmVsb3c6Ci0gICAgLy8gPFRBQkxFIGJvcmRlcj4KLSAgICAv
LyA8VFI+PFREPjEgPFREIHJvd3NwYW49IjIiPjIgPFREPjMgPFREPjQKLSAgICAvLyA8VFI+PFRE
IGNvbHNwYW49IjIiPjUKLSAgICAvLyA8L1RBQkxFPgotCi0gICAgd2hpbGUgKGNDb2wgPCBuQ29s
cyAmJiAoY2VsbEF0KGNSb3csIGNDb2wpLmNlbGwgfHwgY2VsbEF0KGNSb3csIGNDb2wpLmluQ29s
U3BhbikpCi0JY0NvbCsrOwotCi0gICAgaWYgKHJTcGFuID09IDEpIHsKLQkvLyB3ZSBpZ25vcmUg
aGVpZ2h0IHNldHRpbmdzIG9uIHJvd3NwYW4gY2VsbHMKLQlMZW5ndGggaGVpZ2h0ID0gY2VsbC0+
c3R5bGUoKS0+aGVpZ2h0KCk7Ci0JaWYgKGhlaWdodC52YWx1ZSA+IDAgfHwgKGhlaWdodC50eXBl
ID09IFJlbGF0aXZlICYmIGhlaWdodC52YWx1ZSA+PSAwKSkgewotCSAgICBMZW5ndGggY1Jvd0hl
aWdodCA9IGdyaWRbY1Jvd10uaGVpZ2h0OwotCSAgICBzd2l0Y2ggKGhlaWdodC50eXBlKSB7Ci0g
ICAgICAgICAgICAgICAgY2FzZSBQZXJjZW50OgotICAgICAgICAgICAgICAgICAgICBpZiAoIShj
Um93SGVpZ2h0LnR5cGUgPT0gUGVyY2VudCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIChj
Um93SGVpZ2h0LnR5cGUgPT0gUGVyY2VudCAmJiBjUm93SGVpZ2h0LnZhbHVlIDwgaGVpZ2h0LnZh
bHVlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGdyaWRbY1Jvd10uaGVpZ2h0ID0gaGVpZ2h0
OwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBG
aXhlZDoKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNSb3dIZWlnaHQudHlwZSA8IFBlcmNlbnQg
fHwKLSAgICAgICAgICAgICAgICAgICAgICAgIChjUm93SGVpZ2h0LnR5cGUgPT0gRml4ZWQgJiYg
Y1Jvd0hlaWdodC52YWx1ZSA8IGhlaWdodC52YWx1ZSkpCi0gICAgICAgICAgICAgICAgICAgICAg
ICBncmlkW2NSb3ddLmhlaWdodCA9IGhlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgICAgICAgICAgY2FzZSBSZWxhdGl2ZToKLSAgICAgICAgICAgICAgICBkZWZhdWx0
OgotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgICAv
LyBtYWtlIHN1cmUgd2UgaGF2ZSBlbm91Z2ggcm93cwotICAgIGlmICghZW5zdXJlUm93cyhjUm93
ICsgclNwYW4pKQotICAgICAgICByZXR1cm47Ci0KLSAgICBpbnQgY29sID0gY0NvbDsKLSAgICAv
LyB0ZWxsIHRoZSBjZWxsIHdoZXJlIGl0IGlzCi0gICAgQ2VsbFN0cnVjdCBjdXJyZW50Q2VsbDsK
LSAgICBjdXJyZW50Q2VsbC5jZWxsID0gY2VsbDsKLSAgICBjdXJyZW50Q2VsbC5pbkNvbFNwYW4g
PSBmYWxzZTsKLSAgICB3aGlsZSAoY1NwYW4pIHsKLQlpbnQgY3VycmVudFNwYW47Ci0JaWYgKGND
b2wgPj0gbkNvbHMpIHsKLQkgICAgdGFibGUoKS0+YXBwZW5kQ29sdW1uKGNTcGFuKTsKLQkgICAg
Y3VycmVudFNwYW4gPSBjU3BhbjsKLQl9IGVsc2UgewotCSAgICBpZiAoY1NwYW4gPCBjb2x1bW5z
W2NDb2xdLnNwYW4pCi0JCXRhYmxlKCktPnNwbGl0Q29sdW1uKGNDb2wsIGNTcGFuKTsKLQkgICAg
Y3VycmVudFNwYW4gPSBjb2x1bW5zW2NDb2xdLnNwYW47Ci0JfQotCi0JZm9yIChpbnQgciA9IDA7
IHIgPCByU3BhbjsgcisrKSB7Ci0gICAgICAgICAgICBDZWxsU3RydWN0JiBjID0gY2VsbEF0KGNS
b3cgKyByLCBjQ29sKTsKLSAgICAgICAgICAgIGlmIChjdXJyZW50Q2VsbC5jZWxsICYmICFjLmNl
bGwpCi0gICAgICAgICAgICAgICAgYy5jZWxsID0gY3VycmVudENlbGwuY2VsbDsKLSAgICAgICAg
ICAgIGlmIChjdXJyZW50Q2VsbC5pbkNvbFNwYW4pCi0gICAgICAgICAgICAgICAgYy5pbkNvbFNw
YW4gPSB0cnVlOwotCX0KLQljQ29sKys7Ci0JY1NwYW4gLT0gY3VycmVudFNwYW47Ci0gICAgICAg
IGN1cnJlbnRDZWxsLmNlbGwgPSAwOwotCWN1cnJlbnRDZWxsLmluQ29sU3BhbiA9IHRydWU7Ci0g
ICAgfQotICAgIGlmIChjZWxsKSB7Ci0JY2VsbC0+c2V0Um93KGNSb3cpOwotCWNlbGwtPnNldENv
bCh0YWJsZSgpLT5lZmZDb2xUb0NvbChjb2wpKTsKLSAgICB9Ci19Ci0KLQotCi12b2lkIFJlbmRl
clRhYmxlU2VjdGlvbjo6c2V0Q2VsbFdpZHRocygpCi17Ci0gICAgQXJyYXk8aW50PiAmY29sdW1u
UG9zID0gdGFibGUoKS0+Y29sdW1uUG9zOwotCi0gICAgaW50IHJvd3MgPSBncmlkUm93czsKLSAg
ICBmb3IgKGludCBpID0gMDsgaSA8IHJvd3M7IGkrKykgewotCVJvdyAmcm93ID0gKmdyaWRbaV0u
cm93OwotCWludCBjb2xzID0gcm93LnNpemUoKTsKLQlmb3IgKGludCBqID0gMDsgaiA8IGNvbHM7
IGorKykgewotCSAgICBDZWxsU3RydWN0IGN1cnJlbnQgPSByb3dbal07Ci0gICAgICAgICAgICBS
ZW5kZXJUYWJsZUNlbGwgKmNlbGwgPSBjdXJyZW50LmNlbGw7Ci0KLQkgICAgaWYgKCFjZWxsKQot
CQljb250aW51ZTsKLQkgICAgaW50IGVuZENvbCA9IGo7Ci0JICAgIGludCBjc3BhbiA9IGNlbGwt
PmNvbFNwYW4oKTsKLQkgICAgd2hpbGUgKGNzcGFuICYmIGVuZENvbCA8IGNvbHMpIHsKLQkJY3Nw
YW4gLT0gdGFibGUoKS0+Y29sdW1uc1tlbmRDb2xdLnNwYW47Ci0JCWVuZENvbCsrOwotCSAgICB9
Ci0JICAgIGludCB3ID0gY29sdW1uUG9zW2VuZENvbF0gLSBjb2x1bW5Qb3Nbal0gLSB0YWJsZSgp
LT5oQm9yZGVyU3BhY2luZygpOwotCSAgICBpbnQgb2xkV2lkdGggPSBjZWxsLT53aWR0aCgpOwot
CSAgICBpZiAodyAhPSBvbGRXaWR0aCkgewotCQljZWxsLT5zZXROZWVkc0xheW91dCh0cnVlKTsK
LQkJY2VsbC0+c2V0V2lkdGgodyk7Ci0JICAgIH0KLQl9Ci0gICAgfQotfQotCi0KLXZvaWQgUmVu
ZGVyVGFibGVTZWN0aW9uOjpjYWxjUm93SGVpZ2h0KCkKLXsKLSAgICBpbnQgaW5keDsKLSAgICBS
ZW5kZXJUYWJsZUNlbGwgKmNlbGw7Ci0KLSAgICBpbnQgdG90YWxSb3dzID0gZ3JpZFJvd3M7Ci0g
ICAgaW50IHNwYWNpbmcgPSB0YWJsZSgpLT52Qm9yZGVyU3BhY2luZygpOwotCi0gICAgcm93UG9z
LnJlc2l6ZSh0b3RhbFJvd3MgKyAxKTsKLSAgICByb3dQb3NbMF0gPSBzcGFjaW5nOwotCi0gICAg
Zm9yIChpbnQgciA9IDA7IHIgPCB0b3RhbFJvd3M7IHIrKykgewotCXJvd1Bvc1tyICsgMV0gPSAw
OwotCi0JaW50IGJhc2VsaW5lID0gMDsKLQlpbnQgYmRlc2MgPSAwOwotCWludCBjaCA9IGdyaWRb
cl0uaGVpZ2h0Lm1pbldpZHRoKDApOwotCWludCBwb3MgPSByb3dQb3NbciArIDFdICsgY2ggKyBz
cGFjaW5nOwotCi0JaWYgKHBvcyA+IHJvd1Bvc1tyICsgMV0pCi0JICAgIHJvd1Bvc1tyICsgMV0g
PSBwb3M7Ci0KLQlSb3cgKnJvdyA9IGdyaWRbcl0ucm93OwotCWludCB0b3RhbENvbHMgPSByb3ct
PnNpemUoKTsKLQlpbnQgdG90YWxSb3dzID0gZ3JpZFJvd3M7Ci0KLQlmb3IgKGludCBjID0gMDsg
YyA8IHRvdGFsQ29sczsgYysrKSB7Ci0JICAgIENlbGxTdHJ1Y3QgY3VycmVudCA9IGNlbGxBdChy
LCBjKTsKLSAgICAgICAgICAgIGNlbGwgPSBjdXJyZW50LmNlbGw7Ci0JICAgIGlmICghY2VsbCB8
fCBjdXJyZW50LmluQ29sU3BhbikKLQkJY29udGludWU7Ci0JICAgIGlmIChyIDwgdG90YWxSb3dz
IC0gMSAmJiBjZWxsQXQociArIDEsIGMpLmNlbGwgPT0gY2VsbCkKLQkJY29udGludWU7Ci0KLQkg
ICAgaWYgKChpbmR4ID0gciAtIGNlbGwtPnJvd1NwYW4oKSArIDEpIDwgMCkKLQkJaW5keCA9IDA7
Ci0KLSAgICAgICAgICAgIGlmIChjZWxsLT5vdmVycmlkZVNpemUoKSAhPSAtMSkgewotICAgICAg
ICAgICAgICAgIGNlbGwtPnNldE92ZXJyaWRlU2l6ZSgtMSk7Ci0gICAgICAgICAgICAgICAgY2Vs
bC0+c2V0Q2hpbGROZWVkc0xheW91dCh0cnVlLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgY2Vs
bC0+bGF5b3V0SWZOZWVkZWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAg
ICAgICAgLy8gRXhwbGljaXQgaGVpZ2h0cyB1c2UgdGhlIGJvcmRlciBib3ggaW4gcXVpcmtzIG1v
ZGUuICBJbiBzdHJpY3QgbW9kZSBkbyB0aGUgcmlnaHQKLSAgICAgICAgICAgIC8vIHRoaW5nIGFu
ZCBhY3R1YWxseSBhZGQgaW4gdGhlIGJvcmRlciBhbmQgcGFkZGluZy4KLQkgICAgY2ggPSBjZWxs
LT5zdHlsZSgpLT5oZWlnaHQoKS53aWR0aCgwKSArIAotICAgICAgICAgICAgICAgIChjZWxsLT5z
dHlsZSgpLT5odG1sSGFja3MoKSA/IDAgOiAoY2VsbC0+cGFkZGluZ1RvcCgpICsgY2VsbC0+cGFk
ZGluZ0JvdHRvbSgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGNlbGwtPmJvcmRlclRvcCgpICsgY2VsbC0+Ym9yZGVyQm90dG9tKCkpKTsKLQkg
ICAgaWYgKGNlbGwtPmhlaWdodCgpID4gY2gpCi0JCWNoID0gY2VsbC0+aGVpZ2h0KCk7Ci0KLSAg
ICAgICAgICAgIHBvcyA9IHJvd1Bvc1sgaW5keCBdICsgY2ggKyBzcGFjaW5nOwotCi0JICAgIGlm
IChwb3MgPiByb3dQb3NbciArIDFdKQotCQlyb3dQb3NbciArIDFdID0gcG9zOwotCi0JICAgIC8v
IGZpbmQgb3V0IHRoZSBiYXNlbGluZQotCSAgICBFVmVydGljYWxBbGlnbiB2YSA9IGNlbGwtPnN0
eWxlKCktPnZlcnRpY2FsQWxpZ24oKTsKLQkgICAgaWYgKHZhID09IEJBU0VMSU5FIHx8IHZhID09
IFRFWFRfQk9UVE9NIHx8IHZhID09IFRFWFRfVE9QCi0JCXx8IHZhID09IFNVUEVSIHx8IHZhID09
IFNVQikgewotCQlpbnQgYiA9IGNlbGwtPmJhc2VsaW5lUG9zaXRpb24oKTsKLSAgICAgICAgICAg
ICAgICBpZiAoYiA+IGNlbGwtPmJvcmRlclRvcCgpICsgY2VsbC0+cGFkZGluZ1RvcCgpKSB7Ci0g
ICAgICAgICAgICAgICAgICAgIGlmIChiID4gYmFzZWxpbmUpCi0gICAgICAgICAgICAgICAgICAg
ICAgICBiYXNlbGluZSA9IGI7Ci0KLSAgICAgICAgICAgICAgICAgICAgaW50IHRkID0gcm93UG9z
W2luZHhdICsgY2ggLSBiOwotICAgICAgICAgICAgICAgICAgICBpZiAodGQgPiBiZGVzYykKLSAg
ICAgICAgICAgICAgICAgICAgICAgIGJkZXNjID0gdGQ7Ci0gICAgICAgICAgICAgICAgfQotCSAg
ICB9Ci0JfQotCi0JLy9kbyB3ZSBoYXZlIGJhc2VsaW5lIGFsaWduZWQgZWxlbWVudHM/Ci0JaWYg
KGJhc2VsaW5lKSB7Ci0JICAgIC8vIGluY3JlYXNlIHJvd2hlaWdodCBpZiBiYXNlbGluZSByZXF1
aXJlcwotCSAgICBpbnQgYlJvd1BvcyA9IGJhc2VsaW5lICsgYmRlc2MgICsgc3BhY2luZyA7IC8v
ICsgMipwYWRkaW5nCi0JICAgIGlmIChyb3dQb3NbciArIDFdIDwgYlJvd1BvcykKLQkJcm93UG9z
W3IgKyAxXSA9IGJSb3dQb3M7Ci0KLQkgICAgZ3JpZFtyXS5iYXNlTGluZSA9IGJhc2VsaW5lOwot
CX0KLQotCWlmIChyb3dQb3NbciArIDFdIDwgcm93UG9zW3JdKQotCSAgICByb3dQb3NbciArIDFd
ID0gcm93UG9zW3JdOwotICAgIH0KLX0KLQotaW50IFJlbmRlclRhYmxlU2VjdGlvbjo6bGF5b3V0
Um93cyhpbnQgdG9BZGQpCi17Ci0gICAgaW50IHJIZWlnaHQ7Ci0gICAgaW50IHJpbmR4OwotICAg
IGludCB0b3RhbFJvd3MgPSBncmlkUm93czsKLSAgICBpbnQgaHNwYWNpbmcgPSB0YWJsZSgpLT5o
Qm9yZGVyU3BhY2luZygpOwotICAgIGludCB2c3BhY2luZyA9IHRhYmxlKCktPnZCb3JkZXJTcGFj
aW5nKCk7Ci0gICAgCi0gICAgaWYgKHRvQWRkICYmIHRvdGFsUm93cyAmJiAocm93UG9zW3RvdGFs
Um93c10gfHwgIW5leHRTaWJsaW5nKCkpKSB7Ci0KLQlpbnQgdG90YWxIZWlnaHQgPSByb3dQb3Nb
dG90YWxSb3dzXSArIHRvQWRkOwotCi0gICAgICAgIGludCBkaCA9IHRvQWRkOwotCWludCB0b3Rh
bFBlcmNlbnQgPSAwOwotCWludCBudW1BdXRvID0gMDsKLQlmb3IgKGludCByID0gMDsgciA8IHRv
dGFsUm93czsgcisrKSB7Ci0JICAgIGlmIChncmlkW3JdLmhlaWdodC50eXBlID09IEF1dG8pCi0J
CW51bUF1dG8rKzsKLQkgICAgZWxzZSBpZiAoZ3JpZFtyXS5oZWlnaHQudHlwZSA9PSBQZXJjZW50
KQotCQl0b3RhbFBlcmNlbnQgKz0gZ3JpZFtyXS5oZWlnaHQudmFsdWU7Ci0JfQotCWlmICh0b3Rh
bFBlcmNlbnQpIHsKLQkgICAgLy8gdHJ5IHRvIHNhdGlzZnkgcGVyY2VudAotCSAgICBpbnQgYWRk
ID0gMDsKLQkgICAgaWYgKHRvdGFsUGVyY2VudCA+IDEwMCkKLQkJdG90YWxQZXJjZW50ID0gMTAw
OwotCSAgICBpbnQgcmggPSByb3dQb3NbMV0gLSByb3dQb3NbMF07Ci0JICAgIGZvciAoaW50IHIg
PSAwOyByIDwgdG90YWxSb3dzOyByKyspIHsKLQkJaWYgKHRvdGFsUGVyY2VudCA+IDAgJiYgZ3Jp
ZFtyXS5oZWlnaHQudHlwZSA9PSBQZXJjZW50KSB7Ci0JCSAgICBpbnQgdG9BZGQgPSBrTWluKGRo
LCAodG90YWxIZWlnaHQgKiBncmlkW3JdLmhlaWdodC52YWx1ZSAvIDEwMCkgLSByaCk7Ci0gICAg
ICAgICAgICAgICAgICAgIC8vIElmIHRvQWRkIGlzIG5lZ2F0aXZlLCB0aGVuIHdlIGRvbid0IHdh
bnQgdG8gc2hyaW5rIHRoZSByb3cgKHRoaXMgYnVnCi0gICAgICAgICAgICAgICAgICAgIC8vIGFm
ZmVjdGVkIE91dGxvb2sgV2ViIEFjY2VzcykuCi0gICAgICAgICAgICAgICAgICAgIHRvQWRkID0g
a01heCgwLCB0b0FkZCk7Ci0JCSAgICBhZGQgKz0gdG9BZGQ7Ci0JCSAgICBkaCAtPSB0b0FkZDsK
LQkJICAgIHRvdGFsUGVyY2VudCAtPSBncmlkW3JdLmhlaWdodC52YWx1ZTsKLQkJfQotCQlpZiAo
ciA8IHRvdGFsUm93cyAtIDEpCi0JCSAgICByaCA9IHJvd1Bvc1tyICsgMl0gLSByb3dQb3NbciAr
IDFdOwotICAgICAgICAgICAgICAgIHJvd1Bvc1tyICsgMV0gKz0gYWRkOwotCSAgICB9Ci0JfQot
CWlmIChudW1BdXRvKSB7Ci0JICAgIC8vIGRpc3RyaWJ1dGUgb3ZlciB2YXJpYWJsZSBjb2xzCi0J
ICAgIGludCBhZGQgPSAwOwotCSAgICBmb3IgKGludCByID0gMDsgciA8IHRvdGFsUm93czsgcisr
KSB7Ci0JCWlmIChudW1BdXRvID4gMCAmJiBncmlkW3JdLmhlaWdodC50eXBlID09IEF1dG8pIHsK
LQkJICAgIGludCB0b0FkZCA9IGRoL251bUF1dG87Ci0JCSAgICBhZGQgKz0gdG9BZGQ7Ci0JCSAg
ICBkaCAtPSB0b0FkZDsKLSAgICAgICAgICAgICAgICAgICAgbnVtQXV0by0tOwotCQl9Ci0gICAg
ICAgICAgICAgICAgcm93UG9zW3IgKyAxXSArPSBhZGQ7Ci0JICAgIH0KLQl9Ci0gICAgICAgIGlm
IChkaCA+IDAgJiYgcm93UG9zW3RvdGFsUm93c10pIHsKLQkgICAgLy8gaWYgc29tZSBsZWZ0IG92
ZXJzLCBkaXN0cmlidXRlIGVxdWFsbHkuCi0gICAgICAgICAgICBpbnQgdG90ID0gcm93UG9zW3Rv
dGFsUm93c107Ci0gICAgICAgICAgICBpbnQgYWRkID0gMDsKLSAgICAgICAgICAgIGludCBwcmV2
ID0gcm93UG9zWzBdOwotICAgICAgICAgICAgZm9yIChpbnQgciA9IDA7IHIgPCB0b3RhbFJvd3M7
IHIrKykgewotICAgICAgICAgICAgICAgIC8vd2VpZ2h0IHdpdGggdGhlIG9yaWdpbmFsIGhlaWdo
dAotICAgICAgICAgICAgICAgIGFkZCArPSBkaCAqIChyb3dQb3NbciArIDFdIC0gcHJldikgLyB0
b3Q7Ci0gICAgICAgICAgICAgICAgcHJldiA9IHJvd1Bvc1tyICsgMV07Ci0gICAgICAgICAgICAg
ICAgcm93UG9zW3IgKyAxXSArPSBhZGQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9
Ci0KLSAgICBpbnQgbGVmdE9mZnNldCA9IGhzcGFjaW5nOwotCi0gICAgaW50IG5FZmZDb2xzID0g
dGFibGUoKS0+bnVtRWZmQ29scygpOwotICAgIGZvciAoaW50IHIgPSAwOyByIDwgdG90YWxSb3dz
OyByKyspIHsKLQlSb3cgKnJvdyA9IGdyaWRbcl0ucm93OwotCWludCB0b3RhbENvbHMgPSByb3ct
PnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgYyA9IDA7IGMgPCBuRWZmQ29sczsgYysrKSB7Ci0g
ICAgICAgICAgICBDZWxsU3RydWN0IGN1cnJlbnQgPSBjZWxsQXQociwgYyk7Ci0gICAgICAgICAg
ICBSZW5kZXJUYWJsZUNlbGwqIGNlbGwgPSBjdXJyZW50LmNlbGw7Ci0gICAgICAgICAgICAKLSAg
ICAgICAgICAgIGlmICghY2VsbCkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAg
ICAgIGlmIChyIDwgdG90YWxSb3dzIC0gMSAmJiBjZWxsID09IGNlbGxBdChyICsgMSwgYykuY2Vs
bCkKLQkJY29udGludWU7Ci0KLSAgICAgICAgICAgIGlmICgocmluZHggPSByLWNlbGwtPnJvd1Nw
YW4oKSArIDEpIDwgMCkKLSAgICAgICAgICAgICAgICByaW5keCA9IDA7Ci0KLSAgICAgICAgICAg
IHJIZWlnaHQgPSByb3dQb3NbciArIDFdIC0gcm93UG9zW3JpbmR4XSAtIHZzcGFjaW5nOwotICAg
ICAgICAgICAgCi0gICAgICAgICAgICAvLyBGb3JjZSBwZXJjZW50IGhlaWdodCBjaGlsZHJlbiB0
byBsYXkgdGhlbXNlbHZlcyBvdXQgYWdhaW4uCi0gICAgICAgICAgICAvLyBUaGlzIHdpbGwgY2F1
c2UgdGhlc2UgY2hpbGRyZW4gdG8gZ3JvdyB0byBmaWxsIHRoZSBjZWxsLgotICAgICAgICAgICAg
Ly8gRklYTUU6IFRoZXJlIGlzIHN0aWxsIG1vcmUgd29yayB0byBkbyBoZXJlIHRvIGZ1bGx5IG1h
dGNoIFdpbklFIChzaG91bGQKLSAgICAgICAgICAgIC8vIGl0IGJlY29tZSBuZWNlc3NhcnkgdG8g
ZG8gc28pLiAgSW4gcXVpcmtzIG1vZGUsIFdpbklFIGJlaGF2ZXMgbGlrZSB3ZQotICAgICAgICAg
ICAgLy8gZG8sIGJ1dCBpdCB3aWxsIGNsaXAgdGhlIGNlbGxzIHRoYXQgc3BpbGwgb3V0IG9mIHRo
ZSB0YWJsZSBzZWN0aW9uLiAgSW4KLSAgICAgICAgICAgIC8vIHN0cmljdCBtb2RlLCBNb3ppbGxh
IGFuZCBXaW5JRSBib3RoIHJlZ3JvdyB0aGUgdGFibGUgdG8gYWNjb21tb2RhdGUgdGhlCi0gICAg
ICAgICAgICAvLyBuZXcgaGVpZ2h0IG9mIHRoZSBjZWxsICh0aHVzIGxldHRpbmcgdGhlIHBlcmNl
bnRhZ2VzIGNhdXNlIGdyb3d0aCBvbmUKLSAgICAgICAgICAgIC8vIHRpbWUgb25seSkuICBXZSBt
YXkgYWxzbyBub3QgYmUgaGFuZGxpbmcgcm93LXNwYW5uaW5nIGNlbGxzIGNvcnJlY3RseS4KLSAg
ICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBOb3RlIGFsc28gdGhlIG9kZGl0eSB3aGVyZSBy
ZXBsYWNlZCBlbGVtZW50cyBhbHdheXMgZmxleCwgYW5kIHlldCBibG9ja3MvdGFibGVzIGRvCi0g
ICAgICAgICAgICAvLyBub3QgbmVjZXNzYXJpbHkgZmxleC4gIFdpbklFIGlzIGNyYXp5IGFuZCBp
bmNvbnNpc3RlbnQsIGFuZCB3ZSBjYW4ndCBob3BlIHRvCi0gICAgICAgICAgICAvLyBtYXRjaCB0
aGUgYmVoYXZpb3IgcGVyZmVjdGx5LCBidXQgd2UnbGwgY29udGludWUgdG8gcmVmaW5lIGl0IGFz
IHdlIGRpc2NvdmVyIG5ldwotICAgICAgICAgICAgLy8gYnVncy4gOikKLSAgICAgICAgICAgIGJv
b2wgY2VsbENoaWxkcmVuRmxleCA9IGZhbHNlOwotICAgICAgICAgICAgYm9vbCBmbGV4QWxsQ2hp
bGRyZW4gPSBjZWxsLT5zdHlsZSgpLT5oZWlnaHQoKS5pc0ZpeGVkKCkgfHwgCi0gICAgICAgICAg
ICAgICAgKCF0YWJsZSgpLT5zdHlsZSgpLT5oZWlnaHQoKS5pc0F1dG8oKSAmJiBySGVpZ2h0ICE9
IGNlbGwtPmhlaWdodCgpKTsKLQotICAgICAgICAgICAgZm9yIChSZW5kZXJPYmplY3QqIG8gPSBj
ZWxsLT5maXJzdENoaWxkKCk7IG87IG8gPSBvLT5uZXh0U2libGluZygpKSB7Ci0gICAgICAgICAg
ICAgICAgaWYgKCFvLT5pc1RleHQoKSAmJiBvLT5zdHlsZSgpLT5oZWlnaHQoKS5pc1BlcmNlbnQo
KSAmJiAoby0+aXNSZXBsYWNlZCgpIHx8IG8tPnNjcm9sbHNPdmVyZmxvdygpIHx8IGZsZXhBbGxD
aGlsZHJlbikpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVGFibGVzIHdpdGggbm8gc2VjdGlv
bnMgZG8gbm90IGZsZXguCi0gICAgICAgICAgICAgICAgICAgIGlmICghby0+aXNUYWJsZSgpIHx8
IHN0YXRpY19jYXN0PFJlbmRlclRhYmxlKj4obyktPmhhc1NlY3Rpb25zKCkpIHsKLSAgICAgICAg
ICAgICAgICAgICAgICAgIG8tPnNldE5lZWRzTGF5b3V0KHRydWUsIGZhbHNlKTsKLSAgICAgICAg
ICAgICAgICAgICAgICAgIGNlbGwtPnNldENoaWxkTmVlZHNMYXlvdXQodHJ1ZSwgZmFsc2UpOwot
ICAgICAgICAgICAgICAgICAgICAgICAgY2VsbENoaWxkcmVuRmxleCA9IHRydWU7Ci0gICAgICAg
ICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAg
ICAgICBpZiAoY2VsbENoaWxkcmVuRmxleCkgewotICAgICAgICAgICAgICAgIGNlbGwtPnNldE92
ZXJyaWRlU2l6ZShrTWF4KDAsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHJIZWlnaHQgLSBjZWxsLT5ib3JkZXJUb3AoKSAtIGNlbGwtPnBhZGRpbmdUb3AoKSAt
IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBj
ZWxsLT5ib3JkZXJCb3R0b20oKSAtIGNlbGwtPnBhZGRpbmdCb3R0b20oKSkpOwotICAgICAgICAg
ICAgICAgIGNlbGwtPmxheW91dElmTmVlZGVkKCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBBbGln
bm1lbnQgd2l0aGluIGEgY2VsbCBpcyBiYXNlZCBvZmYgdGhlIGNhbGN1bGF0ZWQKLSAgICAgICAg
ICAgICAgICAvLyBoZWlnaHQsIHdoaWNoIGJlY29tZXMgaXJyZWxldmFudCBvbmNlIHRoZSBjZWxs
IGhhcwotICAgICAgICAgICAgICAgIC8vIGJlZW4gcmVzaXplZCBiYXNlZCBvZmYgaXRzIHBlcmNl
bnRhZ2UuIC1kd2gKLSAgICAgICAgICAgICAgICBjZWxsLT5zZXRDZWxsVG9wRXh0cmEoMCk7Ci0g
ICAgICAgICAgICAgICAgY2VsbC0+c2V0Q2VsbEJvdHRvbUV4dHJhKDApOwotICAgICAgICAgICAg
fQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgRVZlcnRpY2FsQWxpZ24gdmEg
PSBjZWxsLT5zdHlsZSgpLT52ZXJ0aWNhbEFsaWduKCk7Ci0gICAgICAgICAgICAgICAgaW50IHRl
ID0gMDsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHZhKSB7Ci0gICAgICAgICAgICAgICAgICAg
IGNhc2UgU1VCOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNVUEVSOgotICAgICAgICAgICAg
ICAgICAgICBjYXNlIFRFWFRfVE9QOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFRFWFRfQk9U
VE9NOgotICAgICAgICAgICAgICAgICAgICBjYXNlIEJBU0VMSU5FOgotICAgICAgICAgICAgICAg
ICAgICAgICAgdGUgPSBnZXRCYXNlbGluZShyKSAtIGNlbGwtPmJhc2VsaW5lUG9zaXRpb24oKSA7
Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2Fz
ZSBUT1A6Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZSA9IDA7Ci0gICAgICAgICAgICAgICAg
ICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNSURETEU6Ci0gICAgICAg
ICAgICAgICAgICAgICAgICB0ZSA9IChySGVpZ2h0IC0gY2VsbC0+aGVpZ2h0KCkpLzI7Ci0gICAg
ICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBCT1RU
T006Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZSA9IHJIZWlnaHQgLSBjZWxsLT5oZWlnaHQo
KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBk
ZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAg
fQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGNlbGwtPnNldENlbGxUb3BFeHRy
YSh0ZSk7Ci0gICAgICAgICAgICAgICAgY2VsbC0+c2V0Q2VsbEJvdHRvbUV4dHJhKHJIZWlnaHQg
LSBjZWxsLT5oZWlnaHQoKSAtIHRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAg
ICAgICAgICAgaW50IG9sZENlbGxYID0gY2VsbC0+eFBvcygpOwotICAgICAgICAgICAgaW50IG9s
ZENlbGxZID0gY2VsbC0+eVBvcygpOwotICAgICAgICAKLSAgICAgICAgICAgIGlmIChzdHlsZSgp
LT5kaXJlY3Rpb24oKSA9PSBSVEwpIHsKLSAgICAgICAgICAgICAgICBjZWxsLT5zZXRQb3MoCi0J
CSAgICB0YWJsZSgpLT5jb2x1bW5Qb3NbKGludCl0b3RhbENvbHNdIC0KLQkJICAgIHRhYmxlKCkt
PmNvbHVtblBvc1t0YWJsZSgpLT5jb2xUb0VmZkNvbChjZWxsLT5jb2woKStjZWxsLT5jb2xTcGFu
KCkpXSArCi0JCSAgICBsZWZ0T2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICByb3dQb3Nbcmlu
ZHhdKTsKLSAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgIGNlbGwtPnNldFBvcyh0
YWJsZSgpLT5jb2x1bW5Qb3NbY10gKyBsZWZ0T2Zmc2V0LCByb3dQb3NbcmluZHhdKTsKLQotICAg
ICAgICAgICAgLy8gSWYgdGhlIGNlbGwgbW92ZWQsIHdlIGhhdmUgdG8gcmVwYWludCBpdCBhcyB3
ZWxsIGFzIGFueSBmbG9hdGluZy9wb3NpdGlvbmVkCi0gICAgICAgICAgICAvLyBkZXNjZW5kYW50
cy4gIEFuIGV4Y2VwdGlvbiBpcyBpZiB3ZSBuZWVkIGEgbGF5b3V0LiAgSW4gdGhpcyBjYXNlLCB3
ZSBrbm93IHdlJ3JlIGdvaW5nIHRvCi0gICAgICAgICAgICAvLyByZXBhaW50IG91cnNlbHZlcyAo
YW5kIHRoZSBjZWxsKSBhbnl3YXkuCi0gICAgICAgICAgICBpZiAoIXRhYmxlKCktPnNlbGZOZWVk
c0xheW91dCgpICYmIGNlbGwtPmNoZWNrRm9yUmVwYWludER1cmluZ0xheW91dCgpKQotICAgICAg
ICAgICAgICAgIGNlbGwtPnJlcGFpbnREdXJpbmdMYXlvdXRJZk1vdmVkKG9sZENlbGxYLCBvbGRD
ZWxsWSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBtX2hlaWdodCA9IHJvd1Bvc1t0b3RhbFJv
d3NdOwotICAgIHJldHVybiBtX2hlaWdodDsKLX0KLQotCi12b2lkIFJlbmRlclRhYmxlU2VjdGlv
bjo6cGFpbnQoUGFpbnRJbmZvJiBpLCBpbnQgdHgsIGludCB0eSkKLXsKLSAgICB1bnNpZ25lZCBp
bnQgdG90YWxSb3dzID0gZ3JpZFJvd3M7Ci0gICAgdW5zaWduZWQgaW50IHRvdGFsQ29scyA9IHRh
YmxlKCktPmNvbHVtbnMuc2l6ZSgpOwotCi0gICAgdHggKz0gbV94OwotICAgIHR5ICs9IG1feTsK
LQotICAgIC8vIGNoZWNrIHdoaWNoIHJvd3MgYW5kIGNvbHMgYXJlIHZpc2libGUgYW5kIG9ubHkg
cGFpbnQgdGhlc2UKLSAgICAvLyAjIyMgZml4bWU6IGNvdWxkIHVzZSBhIGJpbmFyeSBzZWFyY2gg
aGVyZQotICAgIFBhaW50QWN0aW9uIHBhaW50QWN0aW9uID0gaS5waGFzZTsKLSAgICBpbnQgeCA9
IGkuci54KCk7Ci0gICAgaW50IHkgPSBpLnIueSgpOwotICAgIGludCB3ID0gaS5yLndpZHRoKCk7
Ci0gICAgaW50IGggPSBpLnIuaGVpZ2h0KCk7Ci0KLSAgICBpbnQgb3MgPSAyICogbWF4aW1hbE91
dGxpbmVTaXplKHBhaW50QWN0aW9uKTsKLSAgICB1bnNpZ25lZCBpbnQgc3RhcnRyb3cgPSAwOwot
ICAgIHVuc2lnbmVkIGludCBlbmRyb3cgPSB0b3RhbFJvd3M7Ci0gICAgZm9yICg7IHN0YXJ0cm93
IDwgdG90YWxSb3dzOyBzdGFydHJvdysrKQotCWlmICh0eSArIHJvd1Bvc1tzdGFydHJvdysxXSA+
PSB5IC0gb3MpCi0JICAgIGJyZWFrOwotCi0gICAgZm9yICg7IGVuZHJvdyA+IDA7IGVuZHJvdy0t
KQotCWlmICggdHkgKyByb3dQb3NbZW5kcm93LTFdIDw9IHkgKyBoICsgb3MpCi0gICAgICAgICAg
ICBicmVhazsKLQotICAgIHVuc2lnbmVkIGludCBzdGFydGNvbCA9IDA7Ci0gICAgdW5zaWduZWQg
aW50IGVuZGNvbCA9IHRvdGFsQ29sczsKLSAgICBpZiAoc3R5bGUoKS0+ZGlyZWN0aW9uKCkgPT0g
TFRSKSB7Ci0JZm9yICg7IHN0YXJ0Y29sIDwgdG90YWxDb2xzOyBzdGFydGNvbCsrKSB7Ci0JICAg
IGlmICh0eCArIHRhYmxlKCktPmNvbHVtblBvc1tzdGFydGNvbCArIDFdID49IHggLSBvcykKLSAg
ICAgICAgICAgICAgICBicmVhazsKLQl9Ci0JZm9yICg7IGVuZGNvbCA+IDA7IGVuZGNvbC0tKSB7
Ci0JICAgIGlmICh0eCArIHRhYmxlKCktPmNvbHVtblBvc1tlbmRjb2wgLSAxXSA8PSB4ICsgdyAr
IG9zKQotCQlicmVhazsKLQl9Ci0gICAgfQotCi0gICAgaWYgKHN0YXJ0Y29sIDwgZW5kY29sKSB7
Ci0JLy8gZHJhdyB0aGUgY2VsbHMKLQlmb3IgKHVuc2lnbmVkIGludCByID0gc3RhcnRyb3c7IHIg
PCBlbmRyb3c7IHIrKykgewotCSAgICB1bnNpZ25lZCBpbnQgYyA9IHN0YXJ0Y29sOwotCSAgICAv
LyBzaW5jZSBhIGNlbGwgY2FuIGJlIC0xIChpbmRpY2F0aW5nIGEgY29sc3Bhbikgd2UgbWlnaHQg
aGF2ZSB0byBzZWFyY2ggYmFja3dhcmRzIHRvIGluY2x1ZGUgaXQKLQkgICAgd2hpbGUgKGMgJiYg
Y2VsbEF0KHIsIGMpLmluQ29sU3BhbikKLQkJYy0tOwotCSAgICBmb3IgKDsgYyA8IGVuZGNvbDsg
YysrKSB7Ci0gICAgICAgICAgICAgICAgQ2VsbFN0cnVjdCBjdXJyZW50ID0gY2VsbEF0KHIsIGMp
OwotICAgICAgICAgICAgICAgIFJlbmRlclRhYmxlQ2VsbCAqY2VsbCA9IGN1cnJlbnQuY2VsbDsK
LQkJCi0gICAgICAgICAgICAgICAgaWYgKCFjZWxsIHx8IChjZWxsLT5sYXllcigpICYmIGkucGhh
c2UgIT0gUGFpbnRBY3Rpb25Db2xsYXBzZWRUYWJsZUJvcmRlcnMpKSAKLQkJICAgIGNvbnRpbnVl
OwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIENlbGxzIG11c3QgYWx3YXlz
IHBhaW50IGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGFwcGVhciB0YWtpbmcgaW50byBhY2Nv
dW50Ci0gICAgICAgICAgICAgICAgLy8gdGhlaXIgdXBwZXIgbGVmdCBvcmlnaW5hdGluZyByb3cv
Y29sdW1uLiAgRm9yIGNlbGxzIHdpdGggcm93c3BhbnMsIGF2b2lkIHJlcGFpbnRpbmcKLSAgICAg
ICAgICAgICAgICAvLyBpZiB3ZSd2ZSBhbHJlYWR5IHNlZW4gdGhlIGNlbGwuCi0JCWlmIChyID4g
c3RhcnRyb3cgJiYgKGNlbGxBdChyLTEsIGMpLmNlbGwgPT0gY2VsbCkpCi0JCSAgICBjb250aW51
ZTsKLQotCQljZWxsLT5wYWludChpLCB0eCwgdHkpOwotCSAgICB9Ci0JfQotICAgIH0KLX0KLQot
dm9pZCBSZW5kZXJUYWJsZVNlY3Rpb246OnJlY2FsY0NlbGxzKCkKLXsKLSAgICBjQ29sID0gMDsK
LSAgICBjUm93ID0gLTE7Ci0gICAgY2xlYXJHcmlkKCk7Ci0gICAgZ3JpZFJvd3MgPSAwOwotCi0g
ICAgZm9yIChSZW5kZXJPYmplY3QgKnJvdyA9IGZpcnN0Q2hpbGQoKTsgcm93OyByb3cgPSByb3ct
Pm5leHRTaWJsaW5nKCkpIHsKLQljUm93Kys7Ci0JY0NvbCA9IDA7Ci0JZW5zdXJlUm93cyhjUm93
ICsgMSk7Ci0JZm9yIChSZW5kZXJPYmplY3QgKmNlbGwgPSByb3ctPmZpcnN0Q2hpbGQoKTsgY2Vs
bDsgY2VsbCA9IGNlbGwtPm5leHRTaWJsaW5nKCkpCi0JICAgIGlmIChjZWxsLT5pc1RhYmxlQ2Vs
bCgpKQotCQlhZGRDZWxsKHN0YXRpY19jYXN0PFJlbmRlclRhYmxlQ2VsbCAqPihjZWxsKSk7Ci0g
ICAgfQotICAgIG5lZWRDZWxsUmVjYWxjID0gZmFsc2U7Ci0gICAgc2V0TmVlZHNMYXlvdXQodHJ1
ZSk7Ci19Ci0KLXZvaWQgUmVuZGVyVGFibGVTZWN0aW9uOjpjbGVhckdyaWQoKQotewotICAgIGlu
dCByb3dzID0gZ3JpZFJvd3M7Ci0gICAgd2hpbGUgKHJvd3MtLSkKLQlkZWxldGUgZ3JpZFtyb3dz
XS5yb3c7Ci19Ci0KLVJlbmRlck9iamVjdCogUmVuZGVyVGFibGVTZWN0aW9uOjpyZW1vdmVDaGls
ZE5vZGUoUmVuZGVyT2JqZWN0KiBjaGlsZCkKLXsKLSAgICBzZXROZWVkQ2VsbFJlY2FsYygpOwot
ICAgIHJldHVybiBSZW5kZXJDb250YWluZXI6OnJlbW92ZUNoaWxkTm9kZShjaGlsZCk7Ci19Ci0K
LSNpZm5kZWYgTkRFQlVHCi12b2lkIFJlbmRlclRhYmxlU2VjdGlvbjo6ZHVtcChRVGV4dFN0cmVh
bSAqc3RyZWFtLCBRU3RyaW5nIGluZCkgY29uc3QKLXsKLSAgICAqc3RyZWFtIDw8IGVuZGwgPDwg
aW5kIDw8ICJncmlkPSgiIDw8IGdyaWQuc2l6ZSgpIDw8ICIsIiA8PCB0YWJsZSgpLT5udW1FZmZD
b2xzKCkgPDwgIikiIDw8IGVuZGwgPDwgaW5kOwotICAgIGZvciAodW5zaWduZWQgaW50IHIgPSAw
OyByIDwgZ3JpZC5zaXplKCk7IHIrKykgewotCWZvciAoaW50IGMgPSAwOyBjIDwgdGFibGUoKS0+
bnVtRWZmQ29scygpOyBjKyspIHsKLQkgICAgaWYgKGNlbGxBdCggciwgYykuY2VsbCAmJiAhY2Vs
bEF0KHIsIGMpLmluQ29sU3BhbikKLQkJKnN0cmVhbSA8PCAiKCIgPDwgY2VsbEF0KHIsIGMpLmNl
bGwtPnJvdygpIDw8ICIsIiA8PCBjZWxsQXQociwgYykuY2VsbC0+Y29sKCkgPDwgIiwiCi0JCQk8
PCBjZWxsQXQociwgYykuY2VsbC0+cm93U3BhbigpIDw8ICIsIiA8PCBjZWxsQXQociwgYykuY2Vs
bC0+Y29sU3BhbigpIDw8ICIpICI7Ci0JICAgIGVsc2UKLQkJKnN0cmVhbSA8PCBjZWxsQXQociwg
YykuY2VsbCA8PCAibnVsbCBjZWxsICI7Ci0JfQotCSpzdHJlYW0gPDwgZW5kbCA8PCBpbmQ7Ci0g
ICAgfQotICAgIFJlbmRlckNvbnRhaW5lcjo6ZHVtcChzdHJlYW0saW5kKTsKLX0KLSNlbmRpZgot
Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVJlbmRlclRhYmxlUm93OjpSZW5kZXJUYWJsZVJvdyhE
T006Ok5vZGVJbXBsKiBub2RlKQotICAgIDogUmVuZGVyQ29udGFpbmVyKG5vZGUpCi17Ci0gICAg
Ly8gaW5pdCBSZW5kZXJPYmplY3QgYXR0cmlidXRlcwotICAgIHNldElubGluZShmYWxzZSk7ICAg
Ly8gb3VyIG9iamVjdCBpcyBub3QgSW5saW5lCi19Ci0KLXZvaWQgUmVuZGVyVGFibGVSb3c6OmRl
c3Ryb3koKQotewotICAgIFJlbmRlclRhYmxlU2VjdGlvbiAqcyA9IHNlY3Rpb24oKTsKLSAgICBp
ZiAocykKLSAgICAgICAgcy0+c2V0TmVlZENlbGxSZWNhbGMoKTsKLSAgICAKLSAgICBSZW5kZXJD
b250YWluZXI6OmRlc3Ryb3koKTsKLX0KLQotdm9pZCBSZW5kZXJUYWJsZVJvdzo6c2V0U3R5bGUo
UmVuZGVyU3R5bGUqIHN0eWxlKQotewotICAgIHN0eWxlLT5zZXREaXNwbGF5KFRBQkxFX1JPVyk7
Ci0gICAgUmVuZGVyQ29udGFpbmVyOjpzZXRTdHlsZShzdHlsZSk7Ci19Ci0KLXZvaWQgUmVuZGVy
VGFibGVSb3c6OmFkZENoaWxkKFJlbmRlck9iamVjdCAqY2hpbGQsIFJlbmRlck9iamVjdCAqYmVm
b3JlQ2hpbGQpCi17Ci0gICAgaWYgKGNoaWxkLT5lbGVtZW50KCkgJiYgY2hpbGQtPmVsZW1lbnQo
KS0+aGFzVGFnTmFtZShmb3JtVGFnKSkgewotICAgICAgICBSZW5kZXJDb250YWluZXI6OmFkZENo
aWxkKGNoaWxkLGJlZm9yZUNoaWxkKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIFJl
bmRlclRhYmxlQ2VsbCAqY2VsbDsKLQotICAgIGlmICghY2hpbGQtPmlzVGFibGVDZWxsKCkpIHsK
LQlSZW5kZXJPYmplY3QgKmxhc3QgPSBiZWZvcmVDaGlsZDsKLSAgICAgICAgaWYgKCFsYXN0KQot
ICAgICAgICAgICAgbGFzdCA9IGxhc3RDaGlsZCgpOwotICAgICAgICBSZW5kZXJUYWJsZUNlbGwg
KmNlbGwgPSAwOwotICAgICAgICBpZiAobGFzdCAmJiBsYXN0LT5pc0Fub255bW91cygpICYmIGxh
c3QtPmlzVGFibGVDZWxsKCkpCi0gICAgICAgICAgICBjZWxsID0gc3RhdGljX2Nhc3Q8UmVuZGVy
VGFibGVDZWxsICo+KGxhc3QpOwotICAgICAgICBlbHNlIHsKLQkgICAgY2VsbCA9IG5ldyAocmVu
ZGVyQXJlbmEoKSkgUmVuZGVyVGFibGVDZWxsKGRvY3VtZW50KCkgLyogYW5vbnltb3VzIG9iamVj
dCAqLyk7Ci0JICAgIFJlbmRlclN0eWxlICpuZXdTdHlsZSA9IG5ldyAocmVuZGVyQXJlbmEoKSkg
UmVuZGVyU3R5bGUoKTsKLQkgICAgbmV3U3R5bGUtPmluaGVyaXRGcm9tKHN0eWxlKCkpOwotCSAg
ICBuZXdTdHlsZS0+c2V0RGlzcGxheShUQUJMRV9DRUxMKTsKLQkgICAgY2VsbC0+c2V0U3R5bGUo
bmV3U3R5bGUpOwotCSAgICBhZGRDaGlsZChjZWxsLCBiZWZvcmVDaGlsZCk7Ci0gICAgICAgIH0K
LSAgICAgICAgY2VsbC0+YWRkQ2hpbGQoY2hpbGQpOwotICAgICAgICBjaGlsZC0+c2V0TmVlZHNM
YXlvdXRBbmRNaW5NYXhSZWNhbGMoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0gZWxzZQotICAg
ICAgICBjZWxsID0gc3RhdGljX2Nhc3Q8UmVuZGVyVGFibGVDZWxsICo+KGNoaWxkKTsKLQotICAg
IHN0YXRpY19jYXN0PFJlbmRlclRhYmxlU2VjdGlvbiAqPihwYXJlbnQoKSktPmFkZENlbGwoY2Vs
bCk7Ci0KLSAgICBSZW5kZXJDb250YWluZXI6OmFkZENoaWxkKGNlbGwsYmVmb3JlQ2hpbGQpOwot
Ci0gICAgaWYgKChiZWZvcmVDaGlsZCB8fCBuZXh0U2libGluZygpKSAmJiBzZWN0aW9uKCkpCi0J
c2VjdGlvbigpLT5zZXROZWVkQ2VsbFJlY2FsYygpOwotfQotCi1SZW5kZXJPYmplY3QqIFJlbmRl
clRhYmxlUm93OjpyZW1vdmVDaGlsZE5vZGUoUmVuZGVyT2JqZWN0KiBjaGlsZCkKLXsKLS8vIFJl
bmRlclRhYmxlQ2VsbCBkZXN0cm95IHNob3VsZCBkbyBpdAotLy8gICAgIGlmICggc2VjdGlvbigp
ICkKLS8vIAlzZWN0aW9uKCktPnNldE5lZWRDZWxsUmVjYWxjKCk7Ci0gICAgcmV0dXJuIFJlbmRl
ckNvbnRhaW5lcjo6cmVtb3ZlQ2hpbGROb2RlKGNoaWxkKTsKLX0KLQotI2lmbmRlZiBOREVCVUcK
LXZvaWQgUmVuZGVyVGFibGVSb3c6OmR1bXAoUVRleHRTdHJlYW0gKnN0cmVhbSwgUVN0cmluZyBp
bmQpIGNvbnN0Ci17Ci0gICAgUmVuZGVyQ29udGFpbmVyOjpkdW1wKHN0cmVhbSxpbmQpOwotfQot
I2VuZGlmCi0KLXZvaWQgUmVuZGVyVGFibGVSb3c6OmxheW91dCgpCi17Ci0gICAgS0hUTUxBc3Nl
cnQobmVlZHNMYXlvdXQoKSk7Ci0gICAgS0hUTUxBc3NlcnQobWluTWF4S25vd24oKSk7Ci0KLSAg
ICBmb3IgKFJlbmRlck9iamVjdCAqY2hpbGQgPSBmaXJzdENoaWxkKCk7IGNoaWxkOyBjaGlsZCA9
IGNoaWxkLT5uZXh0U2libGluZygpKSB7Ci0gICAgICAgIGlmIChjaGlsZC0+aXNUYWJsZUNlbGwo
KSkgewotICAgICAgICAgICAgUmVuZGVyVGFibGVDZWxsICpjZWxsID0gc3RhdGljX2Nhc3Q8UmVu
ZGVyVGFibGVDZWxsICo+KGNoaWxkKTsKLSAgICAgICAgICAgIGlmIChjaGlsZC0+bmVlZHNMYXlv
dXQoKSkgewotICAgICAgICAgICAgICAgIGNlbGwtPmNhbGNWZXJ0aWNhbE1hcmdpbnMoKTsKLSAg
ICAgICAgICAgICAgICBjZWxsLT5sYXlvdXQoKTsKLSAgICAgICAgICAgICAgICBjZWxsLT5zZXRD
ZWxsVG9wRXh0cmEoMCk7Ci0gICAgICAgICAgICAgICAgY2VsbC0+c2V0Q2VsbEJvdHRvbUV4dHJh
KDApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHNldE5lZWRzTGF5b3V0
KGZhbHNlKTsKLX0KLQotSW50UmVjdCBSZW5kZXJUYWJsZVJvdzo6Z2V0QWJzb2x1dGVSZXBhaW50
UmVjdCgpCi17Ci0gICAgLy8gRm9yIG5vdywganVzdCByZXBhaW50IHRoZSB3aG9sZSB0YWJsZS4K
LSAgICAvLyBGSVhNRTogRmluZCBhIGJldHRlciB3YXkgdG8gZG8gdGhpcy4KLSAgICBSZW5kZXJU
YWJsZSogcGFyZW50VGFibGUgPSB0YWJsZSgpOwotICAgIGlmIChwYXJlbnRUYWJsZSkKLSAgICAg
ICAgcmV0dXJuIHBhcmVudFRhYmxlLT5nZXRBYnNvbHV0ZVJlcGFpbnRSZWN0KCk7Ci0gICAgZWxz
ZQotICAgICAgICByZXR1cm4gSW50UmVjdCgpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0K
LVJlbmRlclRhYmxlQ2VsbDo6UmVuZGVyVGFibGVDZWxsKERPTTo6Tm9kZUltcGwqIF9ub2RlKQot
ICA6IFJlbmRlckJsb2NrKF9ub2RlKQotewotICBfY29sID0gLTE7Ci0gIF9yb3cgPSAtMTsKLSAg
Y1NwYW4gPSByU3BhbiA9IDE7Ci0gIHVwZGF0ZUZyb21FbGVtZW50KCk7Ci0gIHNldFNob3VsZFBh
aW50QmFja2dyb3VuZE9yQm9yZGVyKHRydWUpOwotICBfdG9wRXh0cmEgPSAwOwotICBfYm90dG9t
RXh0cmEgPSAwOwotICBtX3BlcmNlbnRhZ2VIZWlnaHQgPSAwOwotfQotCi12b2lkIFJlbmRlclRh
YmxlQ2VsbDo6ZGVzdHJveSgpCi17Ci0gICAgaWYgKHBhcmVudCgpICYmIHNlY3Rpb24oKSkKLSAg
ICAgICAgc2VjdGlvbigpLT5zZXROZWVkQ2VsbFJlY2FsYygpOwotCi0gICAgUmVuZGVyQmxvY2s6
OmRlc3Ryb3koKTsKLX0KLQotdm9pZCBSZW5kZXJUYWJsZUNlbGw6OnVwZGF0ZUZyb21FbGVtZW50
KCkKLXsKLSAgICBpbnQgb2xkUlNwYW4gPSByU3BhbjsKLSAgICBpbnQgb2xkQ1NwYW4gPSBjU3Bh
bjsKLSAgICBET006Ok5vZGVJbXBsKiBub2RlID0gZWxlbWVudCgpOwotICAgIGlmIChub2RlICYm
IChub2RlLT5oYXNUYWdOYW1lKHRkVGFnKSB8fCBub2RlLT5oYXNUYWdOYW1lKHRoVGFnKSkpIHsK
LSAgICAgICAgRE9NOjpIVE1MVGFibGVDZWxsRWxlbWVudEltcGwgKnRjID0gc3RhdGljX2Nhc3Q8
RE9NOjpIVE1MVGFibGVDZWxsRWxlbWVudEltcGwgKj4obm9kZSk7Ci0gICAgICAgIGNTcGFuID0g
dGMtPmNvbFNwYW4oKTsKLSAgICAgICAgclNwYW4gPSB0Yy0+cm93U3BhbigpOwotICAgIH0KLSAg
ICBpZiAoKG9sZFJTcGFuICE9IHJTcGFuIHx8IG9sZENTcGFuICE9IGNTcGFuKSAmJiBzdHlsZSgp
ICYmIHBhcmVudCgpKQotICAgICAgICBzZXROZWVkc0xheW91dEFuZE1pbk1heFJlY2FsYygpOwot
fQotICAgIAotTGVuZ3RoIFJlbmRlclRhYmxlQ2VsbDo6c3R5bGVPckNvbFdpZHRoKCkKLXsKLSAg
ICBMZW5ndGggdyA9IHN0eWxlKCktPndpZHRoKCk7Ci0gICAgaWYgKGNvbFNwYW4oKSA+IDEgfHwg
IXcuaXNBdXRvKCkpCi0gICAgICAgIHJldHVybiB3OwotICAgIFJlbmRlclRhYmxlQ29sKiBjb2wg
PSB0YWJsZSgpLT5jb2xFbGVtZW50KF9jb2wpOwotICAgIGlmIChjb2wpCi0gICAgICAgIHcgPSBj
b2wtPnN0eWxlKCktPndpZHRoKCk7Ci0gICAgcmV0dXJuIHc7Ci19Ci0KLXZvaWQgUmVuZGVyVGFi
bGVDZWxsOjpjYWxjTWluTWF4V2lkdGgoKQotewotICAgIFJlbmRlckJsb2NrOjpjYWxjTWluTWF4
V2lkdGgoKTsKLSAgICBpZiAoZWxlbWVudCgpICYmIHN0eWxlKCktPmF1dG9XcmFwKCkpIHsKLSAg
ICAgICAgLy8gU2VlIGlmIG5vd3JhcCB3YXMgc2V0LgotICAgICAgICBMZW5ndGggdyA9IHN0eWxl
T3JDb2xXaWR0aCgpOwotICAgICAgICBET01TdHJpbmcgbm93cmFwID0gc3RhdGljX2Nhc3Q8RWxl
bWVudEltcGwqPihlbGVtZW50KCkpLT5nZXRBdHRyaWJ1dGUobm93cmFwQXR0cik7Ci0gICAgICAg
IGlmICghbm93cmFwLmlzTnVsbCgpICYmIHcuaXNGaXhlZCgpKQotICAgICAgICAgICAgLy8gTm93
cmFwIGlzIHNldCwgYnV0IHdlIGRpZG4ndCBhY3R1YWxseSB1c2UgaXQgYmVjYXVzZSBvZiB0aGUK
LSAgICAgICAgICAgIC8vIGZpeGVkIHdpZHRoIHNldCBvbiB0aGUgY2VsbC4gIEV2ZW4gc28sIGl0
IGlzIGEgV2luSUUvTW96IHRyYWl0Ci0gICAgICAgICAgICAvLyB0byBtYWtlIHRoZSBtaW53aWR0
aCBvZiB0aGUgY2VsbCBpbnRvIHRoZSBmaXhlZCB3aWR0aC4gIFRoZXkgZG8gdGhpcwotICAgICAg
ICAgICAgLy8gZXZlbiBpbiBzdHJpY3QgbW9kZSwgc28gZG8gbm90IG1ha2UgdGhpcyBhIHF1aXJr
LiAgQWZmZWN0ZWQgdGhlIHRvcAotICAgICAgICAgICAgLy8gb2YgaGlwdG9wLmNvbS4KLSAgICAg
ICAgICAgIGlmIChtX21pbldpZHRoIDwgdy52YWx1ZSkKLSAgICAgICAgICAgICAgICBtX21pbldp
ZHRoID0gdy52YWx1ZTsKLSAgICB9Ci19Ci0KLXZvaWQgUmVuZGVyVGFibGVDZWxsOjpjYWxjV2lk
dGgoKQotewotfQotCi12b2lkIFJlbmRlclRhYmxlQ2VsbDo6c2V0V2lkdGgoaW50IHdpZHRoKQot
ewotICAgIGlmICh3aWR0aCAhPSBtX3dpZHRoKSB7Ci0JbV93aWR0aCA9IHdpZHRoOwotCW1fd2lk
dGhDaGFuZ2VkID0gdHJ1ZTsKLSAgICB9Ci19Ci0KLXZvaWQgUmVuZGVyVGFibGVDZWxsOjpsYXlv
dXQoKQotewotICAgIGxheW91dEJsb2NrKG1fd2lkdGhDaGFuZ2VkKTsKLSAgICBtX3dpZHRoQ2hh
bmdlZCA9IGZhbHNlOwotfQotCi12b2lkIFJlbmRlclRhYmxlQ2VsbDo6Y29tcHV0ZUFic29sdXRl
UmVwYWludFJlY3QoSW50UmVjdCYgciwgYm9vbCBmKQotewotICAgIHIuc2V0WShyLnkoKSArIF90
b3BFeHRyYSk7Ci0gICAgUmVuZGVyQmxvY2s6OmNvbXB1dGVBYnNvbHV0ZVJlcGFpbnRSZWN0KHIs
IGYpOwotfQotCi1ib29sIFJlbmRlclRhYmxlQ2VsbDo6YWJzb2x1dGVQb3NpdGlvbihpbnQgJnhQ
b3MsIGludCAmeVBvcywgYm9vbCBmKQotewotICAgIGJvb2wgcmV0ID0gUmVuZGVyQmxvY2s6OmFi
c29sdXRlUG9zaXRpb24oeFBvcywgeVBvcywgZik7Ci0gICAgaWYgKHJldCkKLSAgICAgIHlQb3Mg
Kz0gX3RvcEV4dHJhOwotICAgIHJldHVybiByZXQ7Ci19Ci0KLXNob3J0IFJlbmRlclRhYmxlQ2Vs
bDo6YmFzZWxpbmVQb3NpdGlvbihib29sKSBjb25zdAotewotICAgIFJlbmRlck9iamVjdCogbyA9
IGZpcnN0Q2hpbGQoKTsKLSAgICBpbnQgb2Zmc2V0ID0gcGFkZGluZ1RvcCgpICsgYm9yZGVyVG9w
KCk7Ci0gICAgCi0gICAgaWYgKCFvKQotICAgICAgICByZXR1cm4gb2Zmc2V0ICsgY29udGVudEhl
aWdodCgpOwotICAgIHdoaWxlIChvLT5maXJzdENoaWxkKCkpIHsKLQlpZiAoIW8tPmlzSW5saW5l
KCkpCi0JICAgIG9mZnNldCArPSBvLT5wYWRkaW5nVG9wKCkgKyBvLT5ib3JkZXJUb3AoKTsKLQlv
ID0gby0+Zmlyc3RDaGlsZCgpOwotICAgIH0KLSAgICAKLSAgICBpZiAoIW8tPmlzSW5saW5lKCkp
Ci0gICAgICAgIHJldHVybiBwYWRkaW5nVG9wKCkgKyBib3JkZXJUb3AoKSArIGNvbnRlbnRIZWln
aHQoKTsKLQotICAgIG9mZnNldCArPSBvLT5iYXNlbGluZVBvc2l0aW9uKHRydWUpOwotICAgIHJl
dHVybiBvZmZzZXQ7Ci19Ci0KLQotdm9pZCBSZW5kZXJUYWJsZUNlbGw6OnNldFN0eWxlKFJlbmRl
clN0eWxlICpzdHlsZSkKLXsKLSAgICBzdHlsZS0+c2V0RGlzcGxheShUQUJMRV9DRUxMKTsKLQot
ICAgIGlmIChzdHlsZS0+d2hpdGVTcGFjZSgpID09IEtIVE1MX05PV1JBUCkgewotICAgICAgICAv
LyBGaWd1cmUgb3V0IGlmIHdlIGFyZSByZWFsbHkgbm93cmFwcGluZyBvciBpZiB3ZSBzaG91bGQg
anVzdAotICAgICAgICAvLyB1c2Ugbm9ybWFsIGluc3RlYWQuICBJZiB0aGUgd2lkdGggb2YgdGhl
IGNlbGwgaXMgZml4ZWQsIHRoZW4KLSAgICAgICAgLy8gd2UgZG9uJ3QgYWN0dWFsbHkgdXNlIE5P
V1JBUC4gCi0gICAgICAgIGlmIChzdHlsZS0+d2lkdGgoKS5pc0ZpeGVkKCkpCi0gICAgICAgICAg
ICBzdHlsZS0+c2V0V2hpdGVTcGFjZShOT1JNQUwpOwotICAgICAgICBlbHNlCi0gICAgICAgICAg
ICBzdHlsZS0+c2V0V2hpdGVTcGFjZShOT1dSQVApOwotICAgIH0KLQotICAgIFJlbmRlckJsb2Nr
OjpzZXRTdHlsZShzdHlsZSk7Ci0gICAgc2V0U2hvdWxkUGFpbnRCYWNrZ3JvdW5kT3JCb3JkZXIo
dHJ1ZSk7Ci19Ci0KLWJvb2wgUmVuZGVyVGFibGVDZWxsOjpyZXF1aXJlc0xheWVyKCkgewotICAg
IHJldHVybiBpc1Bvc2l0aW9uZWQoKSB8fCBzdHlsZSgpLT5vcGFjaXR5KCkgPCAxLjBmIHx8IGhh
c092ZXJmbG93Q2xpcCgpOwotfQotCi0vLyBUaGUgZm9sbG93aW5nIHJ1bGVzIGFwcGx5IGZvciBy
ZXNvbHZpbmcgY29uZmxpY3RzIGFuZCBmaWd1cmluZyBvdXQgd2hpY2ggYm9yZGVyCi0vLyB0byB1
c2UuCi0vLyAoMSkgQm9yZGVycyB3aXRoIHRoZSAnYm9yZGVyLXN0eWxlJyBvZiAnaGlkZGVuJyB0
YWtlIHByZWNlZGVuY2Ugb3ZlciBhbGwgb3RoZXIgY29uZmxpY3RpbmcgCi0vLyBib3JkZXJzLiBB
bnkgYm9yZGVyIHdpdGggdGhpcyB2YWx1ZSBzdXBwcmVzc2VzIGFsbCBib3JkZXJzIGF0IHRoaXMg
bG9jYXRpb24uCi0vLyAoMikgQm9yZGVycyB3aXRoIGEgc3R5bGUgb2YgJ25vbmUnIGhhdmUgdGhl
IGxvd2VzdCBwcmlvcml0eS4gT25seSBpZiB0aGUgYm9yZGVyIHByb3BlcnRpZXMgb2YgYWxsIAot
Ly8gdGhlIGVsZW1lbnRzIG1lZXRpbmcgYXQgdGhpcyBlZGdlIGFyZSAnbm9uZScgd2lsbCB0aGUg
Ym9yZGVyIGJlIG9taXR0ZWQgKGJ1dCBub3RlIHRoYXQgJ25vbmUnIGlzIAotLy8gdGhlIGRlZmF1
bHQgdmFsdWUgZm9yIHRoZSBib3JkZXIgc3R5bGUuKQotLy8gKDMpIElmIG5vbmUgb2YgdGhlIHN0
eWxlcyBhcmUgJ2hpZGRlbicgYW5kIGF0IGxlYXN0IG9uZSBvZiB0aGVtIGlzIG5vdCAnbm9uZScs
IHRoZW4gbmFycm93IGJvcmRlcnMgCi0vLyBhcmUgZGlzY2FyZGVkIGluIGZhdm9yIG9mIHdpZGVy
IG9uZXMuIElmIHNldmVyYWwgaGF2ZSB0aGUgc2FtZSAnYm9yZGVyLXdpZHRoJyB0aGVuIHN0eWxl
cyBhcmUgcHJlZmVycmVkIAotLy8gaW4gdGhpcyBvcmRlcjogJ2RvdWJsZScsICdzb2xpZCcsICdk
YXNoZWQnLCAnZG90dGVkJywgJ3JpZGdlJywgJ291dHNldCcsICdncm9vdmUnLCBhbmQgdGhlIGxv
d2VzdDogJ2luc2V0Jy4KLS8vICg0KSBJZiBib3JkZXIgc3R5bGVzIGRpZmZlciBvbmx5IGluIGNv
bG9yLCB0aGVuIGEgc3R5bGUgc2V0IG9uIGEgY2VsbCB3aW5zIG92ZXIgb25lIG9uIGEgcm93LCAK
LS8vIHdoaWNoIHdpbnMgb3ZlciBhIHJvdyBncm91cCwgY29sdW1uLCBjb2x1bW4gZ3JvdXAgYW5k
LCBsYXN0bHksIHRhYmxlLiBJdCBpcyB1bmRlZmluZWQgd2hpY2ggY29sb3IgCi0vLyBpcyB1c2Vk
IHdoZW4gdHdvIGVsZW1lbnRzIG9mIHRoZSBzYW1lIHR5cGUgZGlzYWdyZWUuCi1zdGF0aWMgQ29s
bGFwc2VkQm9yZGVyVmFsdWUgY29tcGFyZUJvcmRlcnMoY29uc3QgQ29sbGFwc2VkQm9yZGVyVmFs
dWUmIGJvcmRlcjEsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGNvbnN0IENvbGxhcHNlZEJvcmRlclZhbHVlJiBib3JkZXIyKQotewotICAgIC8vIFNhbml0eSBj
aGVjayB0aGUgdmFsdWVzIHBhc3NlZCBpbi4gIElmIGVpdGhlciBpcyBudWxsLCByZXR1cm4gdGhl
IG90aGVyLgotICAgIGlmICghYm9yZGVyMi5leGlzdHMoKSkgcmV0dXJuIGJvcmRlcjE7Ci0gICAg
aWYgKCFib3JkZXIxLmV4aXN0cygpKSByZXR1cm4gYm9yZGVyMjsKLSAgICAKLSAgICAvLyBSdWxl
ICMxIGFib3ZlLgotICAgIGlmIChib3JkZXIxLnN0eWxlKCkgPT0gQkhJRERFTiB8fCBib3JkZXIy
LnN0eWxlKCkgPT0gQkhJRERFTikKLSAgICAgICAgcmV0dXJuIENvbGxhcHNlZEJvcmRlclZhbHVl
KCk7IC8vIE5vIGJvcmRlciBzaG91bGQgZXhpc3QgYXQgdGhpcyBsb2NhdGlvbi4KLSAgICAKLSAg
ICAvLyBSdWxlICMyIGFib3ZlLiAgQSBzdHlsZSBvZiAnbm9uZScgaGFzIGxvd2VzdCBwcmlvcml0
eSBhbmQgYWx3YXlzIGxvc2VzIHRvIGFueSBvdGhlciBib3JkZXIuCi0gICAgaWYgKGJvcmRlcjIu
c3R5bGUoKSA9PSBCTk9ORSkgcmV0dXJuIGJvcmRlcjE7Ci0gICAgaWYgKGJvcmRlcjEuc3R5bGUo
KSA9PSBCTk9ORSkgcmV0dXJuIGJvcmRlcjI7Ci0gICAgCi0gICAgLy8gVGhlIGZpcnN0IHBhcnQg
b2YgcnVsZSAjMyBhYm92ZS4gV2lkZXIgYm9yZGVycyB3aW4uCi0gICAgaWYgKGJvcmRlcjEud2lk
dGgoKSAhPSBib3JkZXIyLndpZHRoKCkpCi0gICAgICAgIHJldHVybiBib3JkZXIxLndpZHRoKCkg
PiBib3JkZXIyLndpZHRoKCkgPyBib3JkZXIxIDogYm9yZGVyMjsKLSAgICAKLSAgICAvLyBUaGUg
Ym9yZGVycyBoYXZlIGVxdWFsIHdpZHRoLiAgU29ydCBieSBib3JkZXIgc3R5bGUuCi0gICAgaWYg
KGJvcmRlcjEuc3R5bGUoKSAhPSBib3JkZXIyLnN0eWxlKCkpCi0gICAgICAgIHJldHVybiBib3Jk
ZXIxLnN0eWxlKCkgPiBib3JkZXIyLnN0eWxlKCkgPyBib3JkZXIxIDogYm9yZGVyMjsKLSAgICAK
LSAgICAvLyBUaGUgYm9yZGVyIGhhdmUgdGhlIHNhbWUgd2lkdGggYW5kIHN0eWxlLiAgUmVseSBv
biBwcmVjZWRlbmNlIChjZWxsIG92ZXIgcm93IG92ZXIgcm93IGdyb3VwLCBldGMuKQotICAgIHJl
dHVybiBib3JkZXIxLnByZWNlZGVuY2UgPj0gYm9yZGVyMi5wcmVjZWRlbmNlID8gYm9yZGVyMSA6
IGJvcmRlcjI7Ci19Ci0KLUNvbGxhcHNlZEJvcmRlclZhbHVlIFJlbmRlclRhYmxlQ2VsbDo6Y29s
bGFwc2VkTGVmdEJvcmRlcigpIGNvbnN0Ci17Ci0gICAgLy8gRm9yIGJvcmRlciBsZWZ0LCB3ZSBu
ZWVkIHRvIGNoZWNrLCBpbiBvcmRlciBvZiBwcmVjZWRlbmNlOgotICAgIC8vICgxKSBPdXIgbGVm
dCBib3JkZXIuCi0gICAgQ29sbGFwc2VkQm9yZGVyVmFsdWUgcmVzdWx0KCZzdHlsZSgpLT5ib3Jk
ZXJMZWZ0KCksIEJDRUxMKTsKLSAgICAKLSAgICAvLyAoMikgVGhlIHByZXZpb3VzIGNlbGwncyBy
aWdodCBib3JkZXIuCi0gICAgUmVuZGVyVGFibGVDZWxsKiBwcmV2Q2VsbCA9IHRhYmxlKCktPmNl
bGxMZWZ0KHRoaXMpOwotICAgIGlmIChwcmV2Q2VsbCkgewotICAgICAgICByZXN1bHQgPSBjb21w
YXJlQm9yZGVycyhyZXN1bHQsIENvbGxhcHNlZEJvcmRlclZhbHVlKCZwcmV2Q2VsbC0+c3R5bGUo
KS0+Ym9yZGVyUmlnaHQoKSwgQkNFTEwpKTsKLSAgICAgICAgaWYgKCFyZXN1bHQuZXhpc3RzKCkp
Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICBlbHNlIGlmIChjb2woKSA9
PSAwKSB7Ci0gICAgICAgIC8vICgzKSBPdXIgcm93J3MgbGVmdCBib3JkZXIuCi0gICAgICAgIHJl
c3VsdCA9IGNvbXBhcmVCb3JkZXJzKHJlc3VsdCwgQ29sbGFwc2VkQm9yZGVyVmFsdWUoJnBhcmVu
dCgpLT5zdHlsZSgpLT5ib3JkZXJMZWZ0KCksIEJST1cpKTsKLSAgICAgICAgaWYgKCFyZXN1bHQu
ZXhpc3RzKCkpCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAKLSAgICAgICAg
Ly8gKDQpIE91ciByb3cgZ3JvdXAncyBsZWZ0IGJvcmRlci4KLSAgICAgICAgcmVzdWx0ID0gY29t
cGFyZUJvcmRlcnMocmVzdWx0LCBDb2xsYXBzZWRCb3JkZXJWYWx1ZSgmc2VjdGlvbigpLT5zdHls
ZSgpLT5ib3JkZXJMZWZ0KCksIEJST1dHUk9VUCkpOwotICAgICAgICBpZiAoIXJlc3VsdC5leGlz
dHMoKSkKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIAotICAgIC8vICg1
KSBPdXIgY29sdW1uJ3MgbGVmdCBib3JkZXIuCi0gICAgUmVuZGVyVGFibGVDb2wqIGNvbEVsdCA9
IHRhYmxlKCktPmNvbEVsZW1lbnQoY29sKCkpOwotICAgIGlmIChjb2xFbHQpIHsKLSAgICAgICAg
cmVzdWx0ID0gY29tcGFyZUJvcmRlcnMocmVzdWx0LCBDb2xsYXBzZWRCb3JkZXJWYWx1ZSgmY29s
RWx0LT5zdHlsZSgpLT5ib3JkZXJMZWZ0KCksIEJDT0wpKTsKLSAgICAgICAgaWYgKCFyZXN1bHQu
ZXhpc3RzKCkpCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICAKLSAgICAv
LyAoNikgVGhlIHByZXZpb3VzIGNvbHVtbidzIHJpZ2h0IGJvcmRlci4KLSAgICBpZiAoY29sKCkg
PiAwKSB7Ci0gICAgICAgIGNvbEVsdCA9IHRhYmxlKCktPmNvbEVsZW1lbnQoY29sKCkgLSAxKTsK
LSAgICAgICAgaWYgKGNvbEVsdCkgewotICAgICAgICAgICAgcmVzdWx0ID0gY29tcGFyZUJvcmRl
cnMocmVzdWx0LCBDb2xsYXBzZWRCb3JkZXJWYWx1ZSgmY29sRWx0LT5zdHlsZSgpLT5ib3JkZXJS
aWdodCgpLCBCQ09MKSk7Ci0gICAgICAgICAgICBpZiAoIXJlc3VsdC5leGlzdHMoKSkKLSAgICAg
ICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIGlm
IChjb2woKSA9PSAwKSB7Ci0gICAgICAgIC8vICg3KSBUaGUgdGFibGUncyBsZWZ0IGJvcmRlci4K
LSAgICAgICAgcmVzdWx0ID0gY29tcGFyZUJvcmRlcnMocmVzdWx0LCBDb2xsYXBzZWRCb3JkZXJW
YWx1ZSgmdGFibGUoKS0+c3R5bGUoKS0+Ym9yZGVyTGVmdCgpLCBCVEFCTEUpKTsKLSAgICAgICAg
aWYgKCFyZXN1bHQuZXhpc3RzKCkpCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0K
LSAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1Db2xsYXBzZWRCb3JkZXJWYWx1ZSBSZW5k
ZXJUYWJsZUNlbGw6OmNvbGxhcHNlZFJpZ2h0Qm9yZGVyKCkgY29uc3QKLXsKLSAgICBSZW5kZXJU
YWJsZSogdGFibGVFbHQgPSB0YWJsZSgpOwotICAgIGJvb2wgaW5MYXN0Q29sdW1uID0gZmFsc2U7
Ci0gICAgaW50IGVmZkNvbCA9IHRhYmxlRWx0LT5jb2xUb0VmZkNvbChjb2woKSArIGNvbFNwYW4o
KSAtIDEpOwotICAgIGlmIChlZmZDb2wgPT0gdGFibGVFbHQtPm51bUVmZkNvbHMoKSAtIDEpCi0g
ICAgICAgIGluTGFzdENvbHVtbiA9IHRydWU7Ci0gICAgCi0gICAgLy8gRm9yIGJvcmRlciByaWdo
dCwgd2UgbmVlZCB0byBjaGVjaywgaW4gb3JkZXIgb2YgcHJlY2VkZW5jZToKLSAgICAvLyAoMSkg
T3VyIHJpZ2h0IGJvcmRlci4KLSAgICBDb2xsYXBzZWRCb3JkZXJWYWx1ZSByZXN1bHQgPSBDb2xs
YXBzZWRCb3JkZXJWYWx1ZSgmc3R5bGUoKS0+Ym9yZGVyUmlnaHQoKSwgQkNFTEwpOwotICAgIAot
ICAgIC8vICgyKSBUaGUgbmV4dCBjZWxsJ3MgbGVmdCBib3JkZXIuCi0gICAgaWYgKCFpbkxhc3RD
b2x1bW4pIHsKLSAgICAgICAgUmVuZGVyVGFibGVDZWxsKiBuZXh0Q2VsbCA9IHRhYmxlRWx0LT5j
ZWxsUmlnaHQodGhpcyk7Ci0gICAgICAgIGlmIChuZXh0Q2VsbCAmJiBuZXh0Q2VsbC0+c3R5bGUo
KSkgewotICAgICAgICAgICAgcmVzdWx0ID0gY29tcGFyZUJvcmRlcnMocmVzdWx0LCBDb2xsYXBz
ZWRCb3JkZXJWYWx1ZSgmbmV4dENlbGwtPnN0eWxlKCktPmJvcmRlckxlZnQoKSwgQkNFTEwpKTsK
LSAgICAgICAgICAgIGlmICghcmVzdWx0LmV4aXN0cygpKQotICAgICAgICAgICAgICAgIHJldHVy
biByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICAvLyAoMykgT3VyIHJv
dydzIHJpZ2h0IGJvcmRlci4KLSAgICAgICAgcmVzdWx0ID0gY29tcGFyZUJvcmRlcnMocmVzdWx0
LCBDb2xsYXBzZWRCb3JkZXJWYWx1ZSgmcGFyZW50KCktPnN0eWxlKCktPmJvcmRlclJpZ2h0KCks
IEJST1cpKTsKLSAgICAgICAgaWYgKCFyZXN1bHQuZXhpc3RzKCkpCi0gICAgICAgICAgICByZXR1
cm4gcmVzdWx0OwotICAgICAgICAKLSAgICAgICAgLy8gKDQpIE91ciByb3cgZ3JvdXAncyByaWdo
dCBib3JkZXIuCi0gICAgICAgIHJlc3VsdCA9IGNvbXBhcmVCb3JkZXJzKHJlc3VsdCwgQ29sbGFw
c2VkQm9yZGVyVmFsdWUoJnNlY3Rpb24oKS0+c3R5bGUoKS0+Ym9yZGVyUmlnaHQoKSwgQlJPV0dS
T1VQKSk7Ci0gICAgICAgIGlmICghcmVzdWx0LmV4aXN0cygpKQotICAgICAgICAgICAgcmV0dXJu
IHJlc3VsdDsKLSAgICB9Ci0gICAgCi0gICAgLy8gKDUpIE91ciBjb2x1bW4ncyByaWdodCBib3Jk
ZXIuCi0gICAgUmVuZGVyVGFibGVDb2wqIGNvbEVsdCA9IHRhYmxlKCktPmNvbEVsZW1lbnQoY29s
KCkrY29sU3BhbigpIC0gMSk7Ci0gICAgaWYgKGNvbEVsdCkgewotICAgICAgICByZXN1bHQgPSBj
b21wYXJlQm9yZGVycyhyZXN1bHQsIENvbGxhcHNlZEJvcmRlclZhbHVlKCZjb2xFbHQtPnN0eWxl
KCktPmJvcmRlclJpZ2h0KCksIEJDT0wpKTsKLSAgICAgICAgaWYgKCFyZXN1bHQuZXhpc3RzKCkp
Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICAKLSAgICAvLyAoNikgVGhl
IG5leHQgY29sdW1uJ3MgbGVmdCBib3JkZXIuCi0gICAgaWYgKCFpbkxhc3RDb2x1bW4pIHsKLSAg
ICAgICAgY29sRWx0ID0gdGFibGVFbHQtPmNvbEVsZW1lbnQoY29sKCkrY29sU3BhbigpKTsKLSAg
ICAgICAgaWYgKGNvbEVsdCkgewotICAgICAgICAgICAgcmVzdWx0ID0gY29tcGFyZUJvcmRlcnMo
cmVzdWx0LCBDb2xsYXBzZWRCb3JkZXJWYWx1ZSgmY29sRWx0LT5zdHlsZSgpLT5ib3JkZXJMZWZ0
KCksIEJDT0wpKTsKLSAgICAgICAgICAgIGlmICghcmVzdWx0LmV4aXN0cygpKQotICAgICAgICAg
ICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAg
ICAgIC8vICg3KSBUaGUgdGFibGUncyByaWdodCBib3JkZXIuCi0gICAgICAgIHJlc3VsdCA9IGNv
bXBhcmVCb3JkZXJzKHJlc3VsdCwgQ29sbGFwc2VkQm9yZGVyVmFsdWUoJnRhYmxlRWx0LT5zdHls
ZSgpLT5ib3JkZXJSaWdodCgpLCBCVEFCTEUpKTsKLSAgICAgICAgaWYgKCFyZXN1bHQuZXhpc3Rz
KCkpCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICAKLSAgICByZXR1cm4g
cmVzdWx0OwotfQotCi1Db2xsYXBzZWRCb3JkZXJWYWx1ZSBSZW5kZXJUYWJsZUNlbGw6OmNvbGxh
cHNlZFRvcEJvcmRlcigpIGNvbnN0Ci17Ci0gICAgLy8gRm9yIGJvcmRlciB0b3AsIHdlIG5lZWQg
dG8gY2hlY2ssIGluIG9yZGVyIG9mIHByZWNlZGVuY2U6Ci0gICAgLy8gKDEpIE91ciB0b3AgYm9y
ZGVyLgotICAgIENvbGxhcHNlZEJvcmRlclZhbHVlIHJlc3VsdCA9IENvbGxhcHNlZEJvcmRlclZh
bHVlKCZzdHlsZSgpLT5ib3JkZXJUb3AoKSwgQkNFTEwpOwotICAgIAotICAgIFJlbmRlclRhYmxl
Q2VsbCogcHJldkNlbGwgPSB0YWJsZSgpLT5jZWxsQWJvdmUodGhpcyk7Ci0gICAgaWYgKHByZXZD
ZWxsKSB7Ci0gICAgICAgIC8vICgyKSBBIHByZXZpb3VzIGNlbGwncyBib3R0b20gYm9yZGVyLgot
ICAgICAgICByZXN1bHQgPSBjb21wYXJlQm9yZGVycyhyZXN1bHQsIENvbGxhcHNlZEJvcmRlclZh
bHVlKCZwcmV2Q2VsbC0+c3R5bGUoKS0+Ym9yZGVyQm90dG9tKCksIEJDRUxMKSk7Ci0gICAgICAg
IGlmICghcmVzdWx0LmV4aXN0cygpKSAKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAg
fQotICAgIAotICAgIC8vICgzKSBPdXIgcm93J3MgdG9wIGJvcmRlci4KLSAgICByZXN1bHQgPSBj
b21wYXJlQm9yZGVycyhyZXN1bHQsIENvbGxhcHNlZEJvcmRlclZhbHVlKCZwYXJlbnQoKS0+c3R5
bGUoKS0+Ym9yZGVyVG9wKCksIEJST1cpKTsKLSAgICBpZiAoIXJlc3VsdC5leGlzdHMoKSkKLSAg
ICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAKLSAgICAvLyAoNCkgVGhlIHByZXZpb3VzIHJvdydz
IGJvdHRvbSBib3JkZXIuCi0gICAgaWYgKHByZXZDZWxsKSB7Ci0gICAgICAgIFJlbmRlck9iamVj
dCogcHJldlJvdyA9IDA7Ci0gICAgICAgIGlmIChwcmV2Q2VsbC0+c2VjdGlvbigpID09IHNlY3Rp
b24oKSkKLSAgICAgICAgICAgIHByZXZSb3cgPSBwYXJlbnQoKS0+cHJldmlvdXNTaWJsaW5nKCk7
Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHByZXZSb3cgPSBwcmV2Q2VsbC0+c2VjdGlvbigp
LT5sYXN0Q2hpbGQoKTsKLSAgICAKLSAgICAgICAgaWYgKHByZXZSb3cpIHsKLSAgICAgICAgICAg
IHJlc3VsdCA9IGNvbXBhcmVCb3JkZXJzKHJlc3VsdCwgQ29sbGFwc2VkQm9yZGVyVmFsdWUoJnBy
ZXZSb3ctPnN0eWxlKCktPmJvcmRlckJvdHRvbSgpLCBCUk9XKSk7Ci0gICAgICAgICAgICBpZiAo
IXJlc3VsdC5leGlzdHMoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAg
ICB9Ci0gICAgfQotICAgIAotICAgIC8vIE5vdyBjaGVjayByb3cgZ3JvdXBzLgotICAgIFJlbmRl
ck9iamVjdCogY3VyclNlY3Rpb24gPSBwYXJlbnQoKS0+cGFyZW50KCk7Ci0gICAgaWYgKHJvdygp
ID09IDApIHsKLSAgICAgICAgLy8gKDUpIE91ciByb3cgZ3JvdXAncyB0b3AgYm9yZGVyLgotICAg
ICAgICByZXN1bHQgPSBjb21wYXJlQm9yZGVycyhyZXN1bHQsIENvbGxhcHNlZEJvcmRlclZhbHVl
KCZjdXJyU2VjdGlvbi0+c3R5bGUoKS0+Ym9yZGVyVG9wKCksIEJST1dHUk9VUCkpOwotICAgICAg
ICBpZiAoIXJlc3VsdC5leGlzdHMoKSkKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAg
ICAgIAotICAgICAgICAvLyAoNikgUHJldmlvdXMgcm93IGdyb3VwJ3MgYm90dG9tIGJvcmRlci4K
LSAgICAgICAgZm9yIChjdXJyU2VjdGlvbiA9IGN1cnJTZWN0aW9uLT5wcmV2aW91c1NpYmxpbmco
KTsgY3VyclNlY3Rpb247Ci0gICAgICAgICAgICAgY3VyclNlY3Rpb24gPSBjdXJyU2VjdGlvbi0+
cHJldmlvdXNTaWJsaW5nKCkpIHsKLSAgICAgICAgICAgIGlmIChjdXJyU2VjdGlvbi0+aXNUYWJs
ZVNlY3Rpb24oKSkgewotICAgICAgICAgICAgICAgIFJlbmRlclRhYmxlU2VjdGlvbiogc2VjdGlv
biA9IHN0YXRpY19jYXN0PFJlbmRlclRhYmxlU2VjdGlvbio+KGN1cnJTZWN0aW9uKTsKLSAgICAg
ICAgICAgICAgICByZXN1bHQgPSBjb21wYXJlQm9yZGVycyhyZXN1bHQsIENvbGxhcHNlZEJvcmRl
clZhbHVlKCZzZWN0aW9uLT5zdHlsZSgpLT5ib3JkZXJCb3R0b20oKSwgQlJPV0dST1VQKSk7Ci0g
ICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQuZXhpc3RzKCkpCi0gICAgICAgICAgICAgICAgICAg
IHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0g
ICAgaWYgKCFjdXJyU2VjdGlvbikgewotICAgICAgICAvLyAoOCkgT3VyIGNvbHVtbidzIHRvcCBi
b3JkZXIuCi0gICAgICAgIFJlbmRlclRhYmxlQ29sKiBjb2xFbHQgPSB0YWJsZSgpLT5jb2xFbGVt
ZW50KGNvbCgpKTsKLSAgICAgICAgaWYgKGNvbEVsdCkgewotICAgICAgICAgICAgcmVzdWx0ID0g
Y29tcGFyZUJvcmRlcnMocmVzdWx0LCBDb2xsYXBzZWRCb3JkZXJWYWx1ZSgmY29sRWx0LT5zdHls
ZSgpLT5ib3JkZXJUb3AoKSwgQkNPTCkpOwotICAgICAgICAgICAgaWYgKCFyZXN1bHQuZXhpc3Rz
KCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICAK
LSAgICAgICAgLy8gKDkpIFRoZSB0YWJsZSdzIHRvcCBib3JkZXIuCi0gICAgICAgIHJlc3VsdCA9
IGNvbXBhcmVCb3JkZXJzKHJlc3VsdCwgQ29sbGFwc2VkQm9yZGVyVmFsdWUoJnRhYmxlKCktPnN0
eWxlKCktPmJvcmRlclRvcCgpLCBCVEFCTEUpKTsKLSAgICAgICAgaWYgKCFyZXN1bHQuZXhpc3Rz
KCkpCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICAKLSAgICByZXR1cm4g
cmVzdWx0OwotfQotCi1Db2xsYXBzZWRCb3JkZXJWYWx1ZSBSZW5kZXJUYWJsZUNlbGw6OmNvbGxh
cHNlZEJvdHRvbUJvcmRlcigpIGNvbnN0Ci17Ci0gICAgLy8gRm9yIGJvcmRlciB0b3AsIHdlIG5l
ZWQgdG8gY2hlY2ssIGluIG9yZGVyIG9mIHByZWNlZGVuY2U6Ci0gICAgLy8gKDEpIE91ciBib3R0
b20gYm9yZGVyLgotICAgIENvbGxhcHNlZEJvcmRlclZhbHVlIHJlc3VsdCA9IENvbGxhcHNlZEJv
cmRlclZhbHVlKCZzdHlsZSgpLT5ib3JkZXJCb3R0b20oKSwgQkNFTEwpOwotICAgIAotICAgIFJl
bmRlclRhYmxlQ2VsbCogbmV4dENlbGwgPSB0YWJsZSgpLT5jZWxsQmVsb3codGhpcyk7Ci0gICAg
aWYgKG5leHRDZWxsKSB7Ci0gICAgICAgIC8vICgyKSBBIGZvbGxvd2luZyBjZWxsJ3MgdG9wIGJv
cmRlci4KLSAgICAgICAgcmVzdWx0ID0gY29tcGFyZUJvcmRlcnMocmVzdWx0LCBDb2xsYXBzZWRC
b3JkZXJWYWx1ZSgmbmV4dENlbGwtPnN0eWxlKCktPmJvcmRlclRvcCgpLCBCQ0VMTCkpOwotICAg
ICAgICBpZiAoIXJlc3VsdC5leGlzdHMoKSkKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0g
ICAgfQotICAgIAotICAgIC8vICgzKSBPdXIgcm93J3MgYm90dG9tIGJvcmRlci4gKEZJWE1FOiBE
ZWFsIHdpdGggcm93c3BhbiEpCi0gICAgcmVzdWx0ID0gY29tcGFyZUJvcmRlcnMocmVzdWx0LCBD
b2xsYXBzZWRCb3JkZXJWYWx1ZSgmcGFyZW50KCktPnN0eWxlKCktPmJvcmRlckJvdHRvbSgpLCBC
Uk9XKSk7Ci0gICAgaWYgKCFyZXN1bHQuZXhpc3RzKCkpCi0gICAgICAgIHJldHVybiByZXN1bHQ7
Ci0gICAgCi0gICAgLy8gKDQpIFRoZSBuZXh0IHJvdydzIHRvcCBib3JkZXIuCi0gICAgaWYgKG5l
eHRDZWxsKSB7Ci0gICAgICAgIHJlc3VsdCA9IGNvbXBhcmVCb3JkZXJzKHJlc3VsdCwgQ29sbGFw
c2VkQm9yZGVyVmFsdWUoJm5leHRDZWxsLT5wYXJlbnQoKS0+c3R5bGUoKS0+Ym9yZGVyVG9wKCks
IEJST1cpKTsKLSAgICAgICAgaWYgKCFyZXN1bHQuZXhpc3RzKCkpCi0gICAgICAgICAgICByZXR1
cm4gcmVzdWx0OwotICAgIH0KLSAgICAKLSAgICAvLyBOb3cgY2hlY2sgcm93IGdyb3Vwcy4KLSAg
ICBSZW5kZXJPYmplY3QqIGN1cnJTZWN0aW9uID0gcGFyZW50KCktPnBhcmVudCgpOwotICAgIGlm
IChyb3coKSArIHJvd1NwYW4oKSA+PSBzdGF0aWNfY2FzdDxSZW5kZXJUYWJsZVNlY3Rpb24qPihj
dXJyU2VjdGlvbiktPm51bVJvd3MoKSkgewotICAgICAgICAvLyAoNSkgT3VyIHJvdyBncm91cCdz
IGJvdHRvbSBib3JkZXIuCi0gICAgICAgIHJlc3VsdCA9IGNvbXBhcmVCb3JkZXJzKHJlc3VsdCwg
Q29sbGFwc2VkQm9yZGVyVmFsdWUoJmN1cnJTZWN0aW9uLT5zdHlsZSgpLT5ib3JkZXJCb3R0b20o
KSwgQlJPV0dST1VQKSk7Ci0gICAgICAgIGlmICghcmVzdWx0LmV4aXN0cygpKQotICAgICAgICAg
ICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgCi0gICAgICAgIC8vICg2KSBGb2xsb3dpbmcgcm93
IGdyb3VwJ3MgdG9wIGJvcmRlci4KLSAgICAgICAgZm9yIChjdXJyU2VjdGlvbiA9IGN1cnJTZWN0
aW9uLT5uZXh0U2libGluZygpOyBjdXJyU2VjdGlvbjsKLSAgICAgICAgICAgICBjdXJyU2VjdGlv
biA9IGN1cnJTZWN0aW9uLT5uZXh0U2libGluZygpKSB7Ci0gICAgICAgICAgICBpZiAoY3VyclNl
Y3Rpb24tPmlzVGFibGVTZWN0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICBSZW5kZXJUYWJsZVNl
Y3Rpb24qIHNlY3Rpb24gPSBzdGF0aWNfY2FzdDxSZW5kZXJUYWJsZVNlY3Rpb24qPihjdXJyU2Vj
dGlvbik7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gY29tcGFyZUJvcmRlcnMocmVzdWx0LCBD
b2xsYXBzZWRCb3JkZXJWYWx1ZSgmc2VjdGlvbi0+c3R5bGUoKS0+Ym9yZGVyVG9wKCksIEJST1dH
Uk9VUCkpOwotICAgICAgICAgICAgICAgIGlmICghcmVzdWx0LmV4aXN0cygpKQotICAgICAgICAg
ICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAg
fQotICAgIAotICAgIGlmICghY3VyclNlY3Rpb24pIHsKLSAgICAgICAgLy8gKDgpIE91ciBjb2x1
bW4ncyBib3R0b20gYm9yZGVyLgotICAgICAgICBSZW5kZXJUYWJsZUNvbCogY29sRWx0ID0gdGFi
bGUoKS0+Y29sRWxlbWVudChjb2woKSk7Ci0gICAgICAgIGlmIChjb2xFbHQpIHsKLSAgICAgICAg
ICAgIHJlc3VsdCA9IGNvbXBhcmVCb3JkZXJzKHJlc3VsdCwgQ29sbGFwc2VkQm9yZGVyVmFsdWUo
JmNvbEVsdC0+c3R5bGUoKS0+Ym9yZGVyQm90dG9tKCksIEJDT0wpKTsKLSAgICAgICAgICAgIGlm
ICghcmVzdWx0LmV4aXN0cygpKSByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIAot
ICAgICAgICAvLyAoOSkgVGhlIHRhYmxlJ3MgYm90dG9tIGJvcmRlci4KLSAgICAgICAgcmVzdWx0
ID0gY29tcGFyZUJvcmRlcnMocmVzdWx0LCBDb2xsYXBzZWRCb3JkZXJWYWx1ZSgmdGFibGUoKS0+
c3R5bGUoKS0+Ym9yZGVyQm90dG9tKCksIEJUQUJMRSkpOwotICAgICAgICBpZiAoIXJlc3VsdC5l
eGlzdHMoKSkKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIAotICAgIHJl
dHVybiByZXN1bHQ7ICAgIAotfQotCi1pbnQgUmVuZGVyVGFibGVDZWxsOjpib3JkZXJMZWZ0KCkg
Y29uc3QKLXsKLSAgICBpZiAodGFibGUoKS0+Y29sbGFwc2VCb3JkZXJzKCkpIHsKLSAgICAgICAg
Q29sbGFwc2VkQm9yZGVyVmFsdWUgYm9yZGVyID0gY29sbGFwc2VkTGVmdEJvcmRlcigpOwotICAg
ICAgICBpZiAoYm9yZGVyLmV4aXN0cygpKQotICAgICAgICAgICAgcmV0dXJuIGludChib3JkZXIu
d2lkdGgoKSAvIDIuMCArIDAuNSk7IC8vIEdpdmUgdGhlIGV4dHJhIHBpeGVsIHRvIHRvcCBhbmQg
bGVmdC4KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBSZW5kZXJCbG9jazo6
Ym9yZGVyTGVmdCgpOwotfQotICAgIAotaW50IFJlbmRlclRhYmxlQ2VsbDo6Ym9yZGVyUmlnaHQo
KSBjb25zdAotewotICAgIGlmICh0YWJsZSgpLT5jb2xsYXBzZUJvcmRlcnMoKSkgewotICAgICAg
ICBDb2xsYXBzZWRCb3JkZXJWYWx1ZSBib3JkZXIgPSBjb2xsYXBzZWRSaWdodEJvcmRlcigpOwot
ICAgICAgICBpZiAoYm9yZGVyLmV4aXN0cygpKQotICAgICAgICAgICAgcmV0dXJuIGJvcmRlci53
aWR0aCgpIC8gMjsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBSZW5kZXJC
bG9jazo6Ym9yZGVyUmlnaHQoKTsKLX0KLQotaW50IFJlbmRlclRhYmxlQ2VsbDo6Ym9yZGVyVG9w
KCkgY29uc3QKLXsKLSAgICBpZiAodGFibGUoKS0+Y29sbGFwc2VCb3JkZXJzKCkpIHsKLSAgICAg
ICAgQ29sbGFwc2VkQm9yZGVyVmFsdWUgYm9yZGVyID0gY29sbGFwc2VkVG9wQm9yZGVyKCk7Ci0g
ICAgICAgIGlmIChib3JkZXIuZXhpc3RzKCkpCi0gICAgICAgICAgICByZXR1cm4gaW50KGJvcmRl
ci53aWR0aCgpIC8gMi4wICsgMC41KTsgLy8gR2l2ZSB0aGUgZXh0cmEgcGl4ZWwgdG8gdG9wIGFu
ZCBsZWZ0LgotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIFJlbmRlckJsb2Nr
Ojpib3JkZXJUb3AoKTsKLX0KLQotaW50IFJlbmRlclRhYmxlQ2VsbDo6Ym9yZGVyQm90dG9tKCkg
Y29uc3QKLXsKLSAgICBpZiAodGFibGUoKS0+Y29sbGFwc2VCb3JkZXJzKCkpIHsKLSAgICAgICAg
Q29sbGFwc2VkQm9yZGVyVmFsdWUgYm9yZGVyID0gY29sbGFwc2VkQm90dG9tQm9yZGVyKCk7Ci0g
ICAgICAgIGlmIChib3JkZXIuZXhpc3RzKCkpCi0gICAgICAgICAgICByZXR1cm4gYm9yZGVyLndp
ZHRoKCkgLyAyOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIFJlbmRlckJs
b2NrOjpib3JkZXJCb3R0b20oKTsKLX0KLQotI2lmZGVmIEJPWF9ERUJVRwotI2luY2x1ZGUgPHFw
YWludGVyLmg+Ci0KLXN0YXRpYyB2b2lkIG91dGxpbmVCb3goUVBhaW50ZXIgKnAsIGludCBfdHgs
IGludCBfdHksIGludCB3LCBpbnQgaCkKLXsKLSAgICBwLT5zZXRQZW4oUVBlbihRQ29sb3IoInll
bGxvdyIpLCAzLCBRdDo6RG90TGluZSkpOwotICAgIHAtPnNldEJydXNoKFF0OjpOb0JydXNoKTsK
LSAgICBwLT5kcmF3UmVjdChfdHgsIF90eSwgdywgaCk7Ci19Ci0jZW5kaWYKLQotdm9pZCBSZW5k
ZXJUYWJsZUNlbGw6OnBhaW50KFBhaW50SW5mbyYgaSwgaW50IF90eCwgaW50IF90eSkKLXsKLSAg
ICBfdHggKz0gbV94OwotICAgIF90eSArPSBtX3k7Ci0KLSAgICAvLyBjaGVjayBpZiB3ZSBuZWVk
IHRvIGRvIGFueXRoaW5nIGF0IGFsbC4uLgotICAgIGludCBvcyA9IDIqbWF4aW1hbE91dGxpbmVT
aXplKGkucGhhc2UpOwotICAgIGlmICgoX3R5ID49IGkuci55KCkgKyBpLnIuaGVpZ2h0KCkgKyBv
cykgfHwgKF90eSArIF90b3BFeHRyYSArIG1faGVpZ2h0ICsgX2JvdHRvbUV4dHJhIDw9IGkuci55
KCkgLSBvcykpCi0gICAgICAgIHJldHVybjsKLQotICAgIGlmIChpLnBoYXNlID09IFBhaW50QWN0
aW9uQ29sbGFwc2VkVGFibGVCb3JkZXJzICYmIHN0eWxlKCktPnZpc2liaWxpdHkoKSA9PSBWSVNJ
QkxFKSB7Ci0gICAgICAgIGludCB3ID0gd2lkdGgoKTsKLSAgICAgICAgaW50IGggPSBoZWlnaHQo
KSArIGJvcmRlclRvcEV4dHJhKCkgKyBib3JkZXJCb3R0b21FeHRyYSgpOwotICAgICAgICBwYWlu
dENvbGxhcHNlZEJvcmRlcihpLnAsIF90eCwgX3R5LCB3LCBoKTsKLSAgICB9Ci0gICAgZWxzZQot
ICAgICAgICBSZW5kZXJCbG9jazo6cGFpbnRPYmplY3QoaSwgX3R4LCBfdHkgKyBfdG9wRXh0cmEp
OwotCi0jaWZkZWYgQk9YX0RFQlVHCi0gICAgOjpvdXRsaW5lQm94KCBpLnAsIF90eCwgX3R5LCB3
aWR0aCgpLCBoZWlnaHQoKSArIGJvcmRlclRvcEV4dHJhKCkgKyBib3JkZXJCb3R0b21FeHRyYSgp
KTsKLSNlbmRpZgotfQotCi1zdGF0aWMgRUJvcmRlclN0eWxlIGNvbGxhcHNlZEJvcmRlclN0eWxl
KEVCb3JkZXJTdHlsZSBzdHlsZSkKLXsKLSAgICBpZiAoc3R5bGUgPT0gT1VUU0VUKQotICAgICAg
ICBzdHlsZSA9IEdST09WRTsKLSAgICBlbHNlIGlmIChzdHlsZSA9PSBJTlNFVCkKLSAgICAgICAg
c3R5bGUgPSBSSURHRTsKLSAgICByZXR1cm4gc3R5bGU7Ci19Ci0KLXN0cnVjdCBDb2xsYXBzZWRC
b3JkZXIgewotICAgIENvbGxhcHNlZEJvcmRlcigpe30KLSAgICAKLSAgICBDb2xsYXBzZWRCb3Jk
ZXJWYWx1ZSBib3JkZXI7Ci0gICAgUmVuZGVyT2JqZWN0OjpCb3JkZXJTaWRlIHNpZGU7Ci0gICAg
Ym9vbCBzaG91bGRQYWludDsKLSAgICBpbnQgeDE7Ci0gICAgaW50IHkxOwotICAgIGludCB4MjsK
LSAgICBpbnQgeTI7Ci0gICAgRUJvcmRlclN0eWxlIHN0eWxlOwotfTsKLQotY2xhc3MgQ29sbGFw
c2VkQm9yZGVycwotewotcHVibGljOgotICAgIENvbGxhcHNlZEJvcmRlcnMoaW50IGkpIDpjb3Vu
dCgwKSB7fQotICAgIAotICAgIHZvaWQgYWRkQm9yZGVyKGNvbnN0IENvbGxhcHNlZEJvcmRlclZh
bHVlJiBiLCBSZW5kZXJPYmplY3Q6OkJvcmRlclNpZGUgcywgYm9vbCBwYWludCwgCi0gICAgICAg
ICAgICAgICAgICAgaW50IF94MSwgaW50IF95MSwgaW50IF94MiwgaW50IF95MiwKLSAgICAgICAg
ICAgICAgICAgICBFQm9yZGVyU3R5bGUgX3N0eWxlKQotICAgIHsKLSAgICAgICAgaWYgKGIuZXhp
c3RzKCkgJiYgcGFpbnQpIHsKLSAgICAgICAgICAgIGJvcmRlcnNbY291bnRdLmJvcmRlciA9IGI7
Ci0gICAgICAgICAgICBib3JkZXJzW2NvdW50XS5zaWRlID0gczsKLSAgICAgICAgICAgIGJvcmRl
cnNbY291bnRdLnNob3VsZFBhaW50ID0gcGFpbnQ7Ci0gICAgICAgICAgICBib3JkZXJzW2NvdW50
XS54MSA9IF94MTsKLSAgICAgICAgICAgIGJvcmRlcnNbY291bnRdLngyID0gX3gyOwotICAgICAg
ICAgICAgYm9yZGVyc1tjb3VudF0ueTEgPSBfeTE7Ci0gICAgICAgICAgICBib3JkZXJzW2NvdW50
XS55MiA9IF95MjsKLSAgICAgICAgICAgIGJvcmRlcnNbY291bnRdLnN0eWxlID0gX3N0eWxlOwot
ICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIENvbGxhcHNlZEJv
cmRlciogbmV4dEJvcmRlcigpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsg
aSsrKSB7Ci0gICAgICAgICAgICBpZiAoYm9yZGVyc1tpXS5ib3JkZXIuZXhpc3RzKCkgJiYgYm9y
ZGVyc1tpXS5zaG91bGRQYWludCkgewotICAgICAgICAgICAgICAgIGJvcmRlcnNbaV0uc2hvdWxk
UGFpbnQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICByZXR1cm4gJmJvcmRlcnNbaV07Ci0gICAg
ICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiAwOwotICAgIH0K
LSAgICAKLSAgICBDb2xsYXBzZWRCb3JkZXIgYm9yZGVyc1s0XTsKLSAgICBpbnQgY291bnQ7Ci19
OwotCi1zdGF0aWMgdm9pZCBhZGRCb3JkZXJTdHlsZShRVmFsdWVMaXN0PENvbGxhcHNlZEJvcmRl
clZhbHVlPiYgYm9yZGVyU3R5bGVzLCBDb2xsYXBzZWRCb3JkZXJWYWx1ZSBib3JkZXJWYWx1ZSkK
LXsKLSAgICBpZiAoIWJvcmRlclZhbHVlLmV4aXN0cygpIHx8IGJvcmRlclN0eWxlcy5jb250YWlu
cyhib3JkZXJWYWx1ZSkpCi0gICAgICAgIHJldHVybjsKLSAgICAKLSAgICBRVmFsdWVMaXN0SXRl
cmF0b3I8Q29sbGFwc2VkQm9yZGVyVmFsdWU+IGl0ID0gYm9yZGVyU3R5bGVzLmJlZ2luKCk7Ci0g
ICAgUVZhbHVlTGlzdEl0ZXJhdG9yPENvbGxhcHNlZEJvcmRlclZhbHVlPiBlbmQgPSBib3JkZXJT
dHlsZXMuZW5kKCk7Ci0gICAgZm9yICg7IGl0ICE9IGVuZDsgKytpdCkgewotICAgICAgICBDb2xs
YXBzZWRCb3JkZXJWYWx1ZSByZXN1bHQgPSBjb21wYXJlQm9yZGVycygqaXQsIGJvcmRlclZhbHVl
KTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSAqaXQpIHsKLSAgICAgICAgICAgIGJvcmRlclN0eWxl
cy5pbnNlcnQoaXQsIGJvcmRlclZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAg
fQotICAgIH0KLQotICAgIGJvcmRlclN0eWxlcy5hcHBlbmQoYm9yZGVyVmFsdWUpOwotfQotCi12
b2lkIFJlbmRlclRhYmxlQ2VsbDo6Y29sbGVjdEJvcmRlcnMoUVZhbHVlTGlzdDxDb2xsYXBzZWRC
b3JkZXJWYWx1ZT4mIGJvcmRlclN0eWxlcykKLXsKLSAgICBhZGRCb3JkZXJTdHlsZShib3JkZXJT
dHlsZXMsIGNvbGxhcHNlZExlZnRCb3JkZXIoKSk7Ci0gICAgYWRkQm9yZGVyU3R5bGUoYm9yZGVy
U3R5bGVzLCBjb2xsYXBzZWRSaWdodEJvcmRlcigpKTsKLSAgICBhZGRCb3JkZXJTdHlsZShib3Jk
ZXJTdHlsZXMsIGNvbGxhcHNlZFRvcEJvcmRlcigpKTsKLSAgICBhZGRCb3JkZXJTdHlsZShib3Jk
ZXJTdHlsZXMsIGNvbGxhcHNlZEJvdHRvbUJvcmRlcigpKTsKLX0KLQotdm9pZCBSZW5kZXJUYWJs
ZUNlbGw6OnBhaW50Q29sbGFwc2VkQm9yZGVyKFFQYWludGVyKiBwLCBpbnQgX3R4LCBpbnQgX3R5
LCBpbnQgdywgaW50IGgpCi17Ci0gICAgaWYgKCF0YWJsZSgpLT5jdXJyZW50Qm9yZGVyU3R5bGUo
KSkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIENvbGxhcHNlZEJvcmRlclZhbHVlIGxlZnRW
YWwgPSBjb2xsYXBzZWRMZWZ0Qm9yZGVyKCk7Ci0gICAgQ29sbGFwc2VkQm9yZGVyVmFsdWUgcmln
aHRWYWwgPSBjb2xsYXBzZWRSaWdodEJvcmRlcigpOwotICAgIENvbGxhcHNlZEJvcmRlclZhbHVl
IHRvcFZhbCA9IGNvbGxhcHNlZFRvcEJvcmRlcigpOwotICAgIENvbGxhcHNlZEJvcmRlclZhbHVl
IGJvdHRvbVZhbCA9IGNvbGxhcHNlZEJvdHRvbUJvcmRlcigpOwotICAgICAKLSAgICAvLyBBZGp1
c3Qgb3VyIHgveS93aWR0aC9oZWlnaHQgc28gdGhhdCB3ZSBwYWludCB0aGUgY29sbGFwc2VkIGJv
cmRlcnMgYXQgdGhlIGNvcnJlY3QgbG9jYXRpb24uCi0gICAgaW50IHRvcFdpZHRoID0gdG9wVmFs
LndpZHRoKCk7Ci0gICAgaW50IGJvdHRvbVdpZHRoID0gYm90dG9tVmFsLndpZHRoKCk7Ci0gICAg
aW50IGxlZnRXaWR0aCA9IGxlZnRWYWwud2lkdGgoKTsKLSAgICBpbnQgcmlnaHRXaWR0aCA9IHJp
Z2h0VmFsLndpZHRoKCk7Ci0gICAgCi0gICAgX3R4IC09IGxlZnRXaWR0aCAvIDI7Ci0gICAgX3R5
IC09IHRvcFdpZHRoIC8gMjsKLSAgICB3ICs9IGxlZnRXaWR0aCAvIDIgKyBpbnQocmlnaHRXaWR0
aCAvIDIuMCArIDAuNSk7Ci0gICAgaCArPSB0b3BXaWR0aCAvIDIgKyBpbnQoYm90dG9tV2lkdGgg
LyAyLjAgKyAwLjUpOwotICAgIAotICAgIGJvb2wgdHQgPSB0b3BWYWwuaXNUcmFuc3BhcmVudCgp
OwotICAgIGJvb2wgYnQgPSBib3R0b21WYWwuaXNUcmFuc3BhcmVudCgpOwotICAgIGJvb2wgcnQg
PSByaWdodFZhbC5pc1RyYW5zcGFyZW50KCk7Ci0gICAgYm9vbCBsdCA9IGxlZnRWYWwuaXNUcmFu
c3BhcmVudCgpOwotICAgIAotICAgIEVCb3JkZXJTdHlsZSB0cyA9IGNvbGxhcHNlZEJvcmRlclN0
eWxlKHRvcFZhbC5zdHlsZSgpKTsKLSAgICBFQm9yZGVyU3R5bGUgYnMgPSBjb2xsYXBzZWRCb3Jk
ZXJTdHlsZShib3R0b21WYWwuc3R5bGUoKSk7Ci0gICAgRUJvcmRlclN0eWxlIGxzID0gY29sbGFw
c2VkQm9yZGVyU3R5bGUobGVmdFZhbC5zdHlsZSgpKTsKLSAgICBFQm9yZGVyU3R5bGUgcnMgPSBj
b2xsYXBzZWRCb3JkZXJTdHlsZShyaWdodFZhbC5zdHlsZSgpKTsKLSAgICAKLSAgICBib29sIHJl
bmRlcl90ID0gdHMgPiBCSElEREVOICYmICF0dDsKLSAgICBib29sIHJlbmRlcl9sID0gbHMgPiBC
SElEREVOICYmICFsdDsKLSAgICBib29sIHJlbmRlcl9yID0gcnMgPiBCSElEREVOICYmICFydDsK
LSAgICBib29sIHJlbmRlcl9iID0gYnMgPiBCSElEREVOICYmICFidDsKLQotICAgIC8vIFdlIG5l
dmVyIHBhaW50IGRpYWdvbmFscyBhdCB0aGUgam9pbnMuICBXZSBzaW1wbHkgbGV0IHRoZSBib3Jk
ZXIgd2l0aCB0aGUgaGlnaGVzdAotICAgIC8vIHByZWNlZGVuY2UgcGFpbnQgb24gdG9wIG9mIGJv
cmRlcnMgd2l0aCBsb3dlciBwcmVjZWRlbmNlLiAgCi0gICAgQ29sbGFwc2VkQm9yZGVycyBib3Jk
ZXJzKDQpOwotICAgIGJvcmRlcnMuYWRkQm9yZGVyKHRvcFZhbCwgQlNUb3AsIHJlbmRlcl90LCBf
dHgsIF90eSwgX3R4ICsgdywgX3R5ICsgdG9wV2lkdGgsIHRzKTsKLSAgICBib3JkZXJzLmFkZEJv
cmRlcihib3R0b21WYWwsIEJTQm90dG9tLCByZW5kZXJfYiwgX3R4LCBfdHkgKyBoIC0gYm90dG9t
V2lkdGgsIF90eCArIHcsIF90eSArIGgsIGJzKTsKLSAgICBib3JkZXJzLmFkZEJvcmRlcihsZWZ0
VmFsLCBCU0xlZnQsIHJlbmRlcl9sLCBfdHgsIF90eSwgX3R4ICsgbGVmdFdpZHRoLCBfdHkgKyBo
LCBscyk7Ci0gICAgYm9yZGVycy5hZGRCb3JkZXIocmlnaHRWYWwsIEJTUmlnaHQsIHJlbmRlcl9y
LCBfdHggKyB3IC0gcmlnaHRXaWR0aCwgX3R5LCBfdHggKyB3LCBfdHkgKyBoLCBycyk7Ci0gICAg
Ci0gICAgZm9yIChDb2xsYXBzZWRCb3JkZXIqIGJvcmRlciA9IGJvcmRlcnMubmV4dEJvcmRlcigp
OyBib3JkZXI7IGJvcmRlciA9IGJvcmRlcnMubmV4dEJvcmRlcigpKSB7Ci0gICAgICAgIGlmIChi
b3JkZXItPmJvcmRlciA9PSAqdGFibGUoKS0+Y3VycmVudEJvcmRlclN0eWxlKCkpCi0gICAgICAg
ICAgICBkcmF3Qm9yZGVyKHAsIGJvcmRlci0+eDEsIGJvcmRlci0+eTEsIGJvcmRlci0+eDIsIGJv
cmRlci0+eTIsIGJvcmRlci0+c2lkZSwgCi0gICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci0+
Ym9yZGVyLmNvbG9yKCksIHN0eWxlKCktPmNvbG9yKCksIGJvcmRlci0+c3R5bGUsIDAsIDApOwot
ICAgIH0KLX0KLQotSW50UmVjdCBSZW5kZXJUYWJsZUNlbGw6OmdldEFic29sdXRlUmVwYWludFJl
Y3QoKQotewotICAgIGludCBvdyA9IHN0eWxlKCkgPyBzdHlsZSgpLT5vdXRsaW5lU2l6ZSgpIDog
MDsKLSAgICBJbnRSZWN0IHIoLW93LCAtb3cgLSBib3JkZXJUb3BFeHRyYSgpLCAKLSAgICAgICAg
ICAgIG92ZXJmbG93V2lkdGgoZmFsc2UpICsgb3cgKiAyLCBvdmVyZmxvd0hlaWdodChmYWxzZSkg
KyBib3JkZXJUb3BFeHRyYSgpICsgYm9yZGVyQm90dG9tRXh0cmEoKSArIG93ICogMik7Ci0gICAg
Y29tcHV0ZUFic29sdXRlUmVwYWludFJlY3Qocik7Ci0gICAgcmV0dXJuIHI7Ci19Ci0KLXZvaWQg
UmVuZGVyVGFibGVDZWxsOjpwYWludEJveERlY29yYXRpb25zKFBhaW50SW5mbyYgaSwgaW50IF90
eCwgaW50IF90eSkKLXsKLSAgICBSZW5kZXJUYWJsZSogdGFibGVFbHQgPSB0YWJsZSgpOwotICAg
IGlmICghdGFibGVFbHQtPmNvbGxhcHNlQm9yZGVycygpICYmIHN0eWxlKCktPmVtcHR5Q2VsbHMo
KSA9PSBISURFICYmICFmaXJzdENoaWxkKCkpCi0gICAgICAgIHJldHVybjsKLSAgICAKLSAgICBp
bnQgdyA9IHdpZHRoKCk7Ci0gICAgaW50IGggPSBoZWlnaHQoKSArIGJvcmRlclRvcEV4dHJhKCkg
KyBib3JkZXJCb3R0b21FeHRyYSgpOwotICAgIF90eSAtPSBib3JkZXJUb3BFeHRyYSgpOwotCi0g
ICAgUUNvbG9yIGMgPSBzdHlsZSgpLT5iYWNrZ3JvdW5kQ29sb3IoKTsKLSAgICBpZiAoIWMuaXNW
YWxpZCgpICYmIHBhcmVudCgpKSAvLyB0YWtlIGZyb20gcm93Ci0gICAgICAgIGMgPSBwYXJlbnQo
KS0+c3R5bGUoKS0+YmFja2dyb3VuZENvbG9yKCk7Ci0gICAgaWYgKCFjLmlzVmFsaWQoKSAmJiBw
YXJlbnQoKSAmJiBwYXJlbnQoKS0+cGFyZW50KCkpIC8vIHRha2UgZnJvbSByb3dncm91cAotICAg
ICAgICBjID0gcGFyZW50KCktPnBhcmVudCgpLT5zdHlsZSgpLT5iYWNrZ3JvdW5kQ29sb3IoKTsK
LSAgICBpZiAoIWMuaXNWYWxpZCgpKSB7Ci0JLy8gc2VlIGlmIHdlIGhhdmUgYSBjb2wgb3IgY29s
Z3JvdXAgZm9yIHRoaXMKLQlSZW5kZXJUYWJsZUNvbCAqY29sID0gdGFibGUoKS0+Y29sRWxlbWVu
dChfY29sKTsKLQlpZiAoY29sKSB7Ci0JICAgIGMgPSBjb2wtPnN0eWxlKCktPmJhY2tncm91bmRD
b2xvcigpOwotCSAgICBpZiAoIWMuaXNWYWxpZCgpKSB7Ci0JCS8vIHRyeSBjb2x1bW4gZ3JvdXAK
LQkJUmVuZGVyU3R5bGUgKnN0eWxlID0gY29sLT5wYXJlbnQoKS0+c3R5bGUoKTsKLQkJaWYgKHN0
eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEVfQ09MVU1OX0dST1VQKQotCQkgICAgYyA9IHN0eWxlLT5i
YWNrZ3JvdW5kQ29sb3IoKTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgICAvLyBGSVhNRTogVGhp
cyBjb2RlIGlzIGp1c3QgcGxhaW4gd3JvbmcuICBSb3dzIGFuZCBjb2x1bW5zIHNob3VsZCBwYWlu
dCB0aGVpciBiYWNrZ3JvdW5kcwotICAgIC8vIGluZGVwZW5kZW50IGZyb20gdGhlIGNlbGwuCi0g
ICAgLy8gIyMjIGdldCBvZmZzZXRzIHJpZ2h0IGluIGNhc2UgdGhlIGJnaW1hZ2UgaXMgaW5oZXJp
dGVkLgotICAgIGNvbnN0IEJhY2tncm91bmRMYXllciogYmdMYXllciA9IHN0eWxlKCktPmJhY2tn
cm91bmRMYXllcnMoKTsKLSAgICBpZiAoIWJnTGF5ZXItPmhhc0ltYWdlKCkgJiYgcGFyZW50KCkp
Ci0gICAgICAgIGJnTGF5ZXIgPSBwYXJlbnQoKS0+c3R5bGUoKS0+YmFja2dyb3VuZExheWVycygp
OwotICAgIGlmICghYmdMYXllci0+aGFzSW1hZ2UoKSAmJiBwYXJlbnQoKSAmJiBwYXJlbnQoKS0+
cGFyZW50KCkpCi0gICAgICAgIGJnTGF5ZXIgPSBwYXJlbnQoKS0+cGFyZW50KCktPnN0eWxlKCkt
PmJhY2tncm91bmRMYXllcnMoKTsKLSAgICBpZiAoIWJnTGF5ZXItPmhhc0ltYWdlKCkpIHsKLQkv
LyBzZWUgaWYgd2UgaGF2ZSBhIGNvbCBvciBjb2xncm91cCBmb3IgdGhpcwotCVJlbmRlclRhYmxl
Q29sKiBjb2wgPSB0YWJsZSgpLT5jb2xFbGVtZW50KF9jb2wpOwotCWlmIChjb2wpIHsKLQkgICAg
YmdMYXllciA9IGNvbC0+c3R5bGUoKS0+YmFja2dyb3VuZExheWVycygpOwotCSAgICBpZiAoIWJn
TGF5ZXItPmhhc0ltYWdlKCkpIHsKLQkJLy8gdHJ5IGNvbHVtbiBncm91cAotCQlSZW5kZXJTdHls
ZSAqc3R5bGUgPSBjb2wtPnBhcmVudCgpLT5zdHlsZSgpOwotCQlpZiAoc3R5bGUtPmRpc3BsYXko
KSA9PSBUQUJMRV9DT0xVTU5fR1JPVVApCi0JCSAgICBiZ0xheWVyID0gc3R5bGUtPmJhY2tncm91
bmRMYXllcnMoKTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgICBpbnQgbXkgPSBrTWF4KF90eSwg
aS5yLnkoKSk7Ci0gICAgaW50IGVuZCA9IGtNaW4oaS5yLnkoKSArIGkuci5oZWlnaHQoKSwgX3R5
ICsgaCk7Ci0gICAgaW50IG1oID0gZW5kIC0gbXk7Ci0KLSAgICBpZiAoYmdMYXllci0+aGFzSW1h
Z2UoKSB8fCBjLmlzVmFsaWQoKSkgewotCS8vIFdlIGhhdmUgdG8gY2xpcCBoZXJlIGJlY2F1c2Ug
dGhlIGJhY2tyb3VuZCB3b3VsZCBwYWludAotICAgICAgICAvLyBvbiB0b3Agb2YgdGhlIGJvcmRl
cnMgb3RoZXJ3aXNlLgotICAgICAgICBpZiAobV9sYXllciAmJiB0YWJsZUVsdC0+Y29sbGFwc2VC
b3JkZXJzKCkpIHsKLSAgICAgICAgICAgIEludFJlY3QgY2xpcFJlY3QoX3R4ICsgYm9yZGVyTGVm
dCgpLCBfdHkgKyBib3JkZXJUb3AoKSwgdyAtIGJvcmRlckxlZnQoKSAtIGJvcmRlclJpZ2h0KCks
IGggLSBib3JkZXJUb3AoKSAtIGJvcmRlckJvdHRvbSgpKTsKLSAgICAgICAgICAgIGNsaXBSZWN0
ID0gaS5wLT54Rm9ybShjbGlwUmVjdCk7Ci0gICAgICAgICAgICBpLnAtPnNhdmUoKTsKLSAgICAg
ICAgICAgIGkucC0+YWRkQ2xpcChjbGlwUmVjdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcGFpbnRC
YWNrZ3JvdW5kKGkucCwgYywgYmdMYXllciwgbXksIG1oLCBfdHgsIF90eSwgdywgaCk7Ci0gICAg
ICAgIGlmIChtX2xheWVyICYmIHRhYmxlRWx0LT5jb2xsYXBzZUJvcmRlcnMoKSkKLSAgICAgICAg
ICAgIGkucC0+cmVzdG9yZSgpOwotICAgIH0KLQotICAgIGlmIChzdHlsZSgpLT5oYXNCb3JkZXIo
KSAmJiAhdGFibGVFbHQtPmNvbGxhcHNlQm9yZGVycygpKQotICAgICAgICBwYWludEJvcmRlcihp
LnAsIF90eCwgX3R5LCB3LCBoLCBzdHlsZSgpKTsKLX0KLQotCi0jaWZuZGVmIE5ERUJVRwotdm9p
ZCBSZW5kZXJUYWJsZUNlbGw6OmR1bXAoUVRleHRTdHJlYW0gKnN0cmVhbSwgUVN0cmluZyBpbmQp
IGNvbnN0Ci17Ci0gICAgKnN0cmVhbSA8PCAiIHJvdz0iIDw8IF9yb3c7Ci0gICAgKnN0cmVhbSA8
PCAiIGNvbD0iIDw8IF9jb2w7Ci0gICAgKnN0cmVhbSA8PCAiIHJTcGFuPSIgPDwgclNwYW47Ci0g
ICAgKnN0cmVhbSA8PCAiIGNTcGFuPSIgPDwgY1NwYW47Ci0vLyAgICAqc3RyZWFtIDw8ICIgbldy
YXA9IiA8PCBuV3JhcDsKLQotICAgIFJlbmRlckJsb2NrOjpkdW1wKHN0cmVhbSxpbmQpOwotfQot
I2VuZGlmCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotUmVuZGVyVGFibGVDb2w6OlJlbmRlclRh
YmxlQ29sKERPTTo6Tm9kZUltcGwqIG5vZGUpCitSZW5kZXJUYWJsZUNvbDo6UmVuZGVyVGFibGVD
b2woTm9kZUltcGwqIG5vZGUpCiAgICAgOiBSZW5kZXJDb250YWluZXIobm9kZSkKIHsKICAgICAv
LyBpbml0IFJlbmRlck9iamVjdCBhdHRyaWJ1dGVzCkBAIC0yMjIwLDkgKzQ3LDkgQEAgUmVuZGVy
VGFibGVDb2w6OlJlbmRlclRhYmxlQ29sKERPTTo6Tm9kZQogdm9pZCBSZW5kZXJUYWJsZUNvbDo6
dXBkYXRlRnJvbUVsZW1lbnQoKQogewogICAgIGludCBvbGRTcGFuID0gX3NwYW47Ci0gICAgRE9N
OjpOb2RlSW1wbCAqbm9kZSA9IGVsZW1lbnQoKTsKKyAgICBOb2RlSW1wbCAqbm9kZSA9IGVsZW1l
bnQoKTsKICAgICBpZiAobm9kZSAmJiAobm9kZS0+aGFzVGFnTmFtZShjb2xUYWcpIHx8IG5vZGUt
Pmhhc1RhZ05hbWUoY29sZ3JvdXBUYWcpKSkgewotICAgICAgICBET006OkhUTUxUYWJsZUNvbEVs
ZW1lbnRJbXBsICp0YyA9IHN0YXRpY19jYXN0PERPTTo6SFRNTFRhYmxlQ29sRWxlbWVudEltcGwg
Kj4obm9kZSk7CisgICAgICAgIEhUTUxUYWJsZUNvbEVsZW1lbnRJbXBsICp0YyA9IHN0YXRpY19j
YXN0PEhUTUxUYWJsZUNvbEVsZW1lbnRJbXBsICo+KG5vZGUpOwogICAgICAgICBfc3BhbiA9IHRj
LT5zcGFuKCk7CiAgICAgfSBlbHNlCiAgICAgICBfc3BhbiA9ICEoc3R5bGUoKSAmJiBzdHlsZSgp
LT5kaXNwbGF5KCkgPT0gVEFCTEVfQ09MVU1OX0dST1VQKTsKQEAgLTIyNTMsNiArODAsNCBAQCB2
b2lkIFJlbmRlclRhYmxlQ29sOjpkdW1wKFFUZXh0U3RyZWFtICpzCiB9CiAjZW5kaWYKIAotI3Vu
ZGVmIFRBQkxFX0RFQlVHCi0jdW5kZWYgREVCVUdfTEFZT1VUCi0jdW5kZWYgQk9YX0RFQlVHCit9
CkluZGV4OiByZW5kZXJpbmcvcmVuZGVyX2Jsb2NrLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSByZW5kZXJp
bmcvcmVuZGVyX2Jsb2NrLmNwcAkocmV2aXNpb24gMTIyNTMpCisrKyByZW5kZXJpbmcvcmVuZGVy
X2Jsb2NrLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSwzNTY4ICswLDAgQEAKLS8qCi0gKiBUaGlz
IGZpbGUgaXMgcGFydCBvZiB0aGUgcmVuZGVyIG9iamVjdCBpbXBsZW1lbnRhdGlvbiBmb3IgS0hU
TUwuCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk5IExhcnMgS25vbGwgKGtub2xsQGtkZS5vcmcp
Ci0gKiAgICAgICAgICAgKEMpIDE5OTkgQW50dGkgS29pdmlzdG8gKGtvaXZpc3RvQGtkZS5vcmcp
Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYgQXBwbGUgQ29tcHV0ZXIs
IEluYy4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRp
c3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBH
TlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhl
IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIgb2YgdGhlIExp
Y2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhp
cyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2Vm
dWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGll
ZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGlj
ZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBh
IGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25n
IHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdy
aXRlIHRvCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUg
UGxhY2UgLSBTdWl0ZSAzMzAsCi0gKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0g
Ki8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgInJlbmRlcl9ibG9jay5oIgotCi0j
aW5jbHVkZSAiRG9jdW1lbnRJbXBsLmgiCi0jaW5jbHVkZSAiRnJhbWUuaCIKLSNpbmNsdWRlICJG
cmFtZVZpZXcuaCIKLSNpbmNsdWRlICJJbmxpbmVUZXh0Qm94LmgiCi0jaW5jbHVkZSAiUmVuZGVy
VGV4dEZyYWdtZW50LmgiCi0jaW5jbHVkZSAiU2VsZWN0aW9uQ29udHJvbGxlci5oIgotI2luY2x1
ZGUgImh0bWxuYW1lcy5oIgotI2luY2x1ZGUgInJlbmRlcl9jYW52YXMuaCIKLSNpbmNsdWRlICJy
ZW5kZXJfdGFibGUuaCIKLSNpbmNsdWRlICJyZW5kZXJfdGhlbWUuaCIKLSNpbmNsdWRlICJ2aXNp
YmxlX3Bvc2l0aW9uLmgiCi0jaW5jbHVkZSA8a2RlYnVnLmg+Ci0KLXVzaW5nIG5hbWVzcGFjZSBE
T007Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLQotdXNpbmcgbmFtZXNwYWNlIEhUTUxOYW1lczsK
LQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0v
LyBPdXIgTWFyZ2luSW5mbyBzdGF0ZSB1c2VkIHdoZW4gbGF5aW5nIG91dCBibG9jayBjaGlsZHJl
bi4KLVJlbmRlckJsb2NrOjpNYXJnaW5JbmZvOjpNYXJnaW5JbmZvKFJlbmRlckJsb2NrKiBibG9j
aywgaW50IHRvcCwgaW50IGJvdHRvbSkKLXsKLSAgICAvLyBXaGV0aGVyIG9yIG5vdCB3ZSBjYW4g
Y29sbGFwc2Ugb3VyIG93biBtYXJnaW5zIHdpdGggb3VyIGNoaWxkcmVuLiAgV2UgZG9uJ3QgZG8g
dGhpcwotICAgIC8vIGlmIHdlIGhhZCBhbnkgYm9yZGVyL3BhZGRpbmcgKG9idmlvdXNseSksIGlm
IHdlJ3JlIHRoZSByb290IG9yIEhUTUwgZWxlbWVudHMsIG9yIGlmCi0gICAgLy8gd2UncmUgcG9z
aXRpb25lZCwgZmxvYXRpbmcsIGEgdGFibGUgY2VsbC4KLSAgICBtX2NhbkNvbGxhcHNlV2l0aENo
aWxkcmVuID0gIWJsb2NrLT5pc0NhbnZhcygpICYmICFibG9jay0+aXNSb290KCkgJiYgIWJsb2Nr
LT5pc1Bvc2l0aW9uZWQoKSAmJgotICAgICAgICAhYmxvY2stPmlzRmxvYXRpbmcoKSAmJiAhYmxv
Y2stPmlzVGFibGVDZWxsKCkgJiYgIWJsb2NrLT5oYXNPdmVyZmxvd0NsaXAoKSAmJiAhYmxvY2st
PmlzSW5saW5lQmxvY2tPcklubGluZVRhYmxlKCk7Ci0KLSAgICBtX2NhbkNvbGxhcHNlVG9wV2l0
aENoaWxkcmVuID0gbV9jYW5Db2xsYXBzZVdpdGhDaGlsZHJlbiAmJiAodG9wID09IDApICYmIGJs
b2NrLT5zdHlsZSgpLT5tYXJnaW5Ub3BDb2xsYXBzZSgpICE9IE1TRVBBUkFURTsKLQotICAgIC8v
IElmIGFueSBoZWlnaHQgb3RoZXIgdGhhbiBhdXRvIGlzIHNwZWNpZmllZCBpbiBDU1MsIHRoZW4g
d2UgZG9uJ3QgY29sbGFwc2Ugb3VyIGJvdHRvbQotICAgIC8vIG1hcmdpbnMgd2l0aCBvdXIgY2hp
bGRyZW4ncyBtYXJnaW5zLiAgVG8gZG8gb3RoZXJ3aXNlIHdvdWxkIGJlIHRvIHJpc2sgb2RkIHZp
c3VhbAotICAgIC8vIGVmZmVjdHMgd2hlbiB0aGUgY2hpbGRyZW4gb3ZlcmZsb3cgb3V0IG9mIHRo
ZSBwYXJlbnQgYmxvY2sgYW5kIHlldCBzdGlsbCBjb2xsYXBzZQotICAgIC8vIHdpdGggaXQuICBX
ZSBhbHNvIGRvbid0IGNvbGxhcHNlIGlmIHdlIGhhdmUgYW55IGJvdHRvbSBib3JkZXIvcGFkZGlu
Zy4KLSAgICBtX2NhbkNvbGxhcHNlQm90dG9tV2l0aENoaWxkcmVuID0gbV9jYW5Db2xsYXBzZVdp
dGhDaGlsZHJlbiAmJiAoYm90dG9tID09IDApICYmCi0gICAgICAgIChibG9jay0+c3R5bGUoKS0+
aGVpZ2h0KCkuaXNBdXRvKCkgJiYgYmxvY2stPnN0eWxlKCktPmhlaWdodCgpLnZhbHVlID09IDAp
ICYmIGJsb2NrLT5zdHlsZSgpLT5tYXJnaW5Cb3R0b21Db2xsYXBzZSgpICE9IE1TRVBBUkFURTsK
LSAgICAKLSAgICBtX3F1aXJrQ29udGFpbmVyID0gYmxvY2stPmlzVGFibGVDZWxsKCkgfHwgYmxv
Y2stPmlzQm9keSgpIHx8IGJsb2NrLT5zdHlsZSgpLT5tYXJnaW5Ub3BDb2xsYXBzZSgpID09IE1E
SVNDQVJEIHx8IAotICAgICAgICBibG9jay0+c3R5bGUoKS0+bWFyZ2luQm90dG9tQ29sbGFwc2Uo
KSA9PSBNRElTQ0FSRDsKLQotICAgIG1fYXRUb3BPZkJsb2NrID0gdHJ1ZTsKLSAgICBtX2F0Qm90
dG9tT2ZCbG9jayA9IGZhbHNlOwotCi0gICAgbV9wb3NNYXJnaW4gPSBtX2NhbkNvbGxhcHNlVG9w
V2l0aENoaWxkcmVuID8gYmxvY2stPm1heFRvcE1hcmdpbih0cnVlKSA6IDA7Ci0gICAgbV9uZWdN
YXJnaW4gPSBtX2NhbkNvbGxhcHNlVG9wV2l0aENoaWxkcmVuID8gYmxvY2stPm1heFRvcE1hcmdp
bihmYWxzZSkgOiAwOwotCi0gICAgbV9zZWxmQ29sbGFwc2luZ0Jsb2NrQ2xlYXJlZEZsb2F0ID0g
ZmFsc2U7Ci0gICAgCi0gICAgbV90b3BRdWlyayA9IG1fYm90dG9tUXVpcmsgPSBtX2RldGVybWlu
ZWRUb3BRdWlyayA9IGZhbHNlOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tCi0KLVJlbmRlckJsb2NrOjpSZW5kZXJCbG9jayhET006Ok5vZGVJ
bXBsKiBub2RlKQotOlJlbmRlckZsb3cobm9kZSkKLXsKLSAgICBtX2NoaWxkcmVuSW5saW5lID0g
dHJ1ZTsKLSAgICBtX2Zsb2F0aW5nT2JqZWN0cyA9IDA7Ci0gICAgbV9wb3NpdGlvbmVkT2JqZWN0
cyA9IDA7Ci0gICAgbV9maXJzdExpbmUgPSBmYWxzZTsKLSAgICBtX2hhc01hcmt1cFRydW5jYXRp
b24gPSBmYWxzZTsKLSAgICBtX3NlbGVjdGlvblN0YXRlID0gU2VsZWN0aW9uTm9uZTsKLSAgICBt
X2NsZWFyU3RhdHVzID0gQ05PTkU7Ci0gICAgbV9tYXhUb3BQb3NNYXJnaW4gPSBtX21heFRvcE5l
Z01hcmdpbiA9IG1fbWF4Qm90dG9tUG9zTWFyZ2luID0gbV9tYXhCb3R0b21OZWdNYXJnaW4gPSAw
OwotICAgIG1fdG9wTWFyZ2luUXVpcmsgPSBtX2JvdHRvbU1hcmdpblF1aXJrID0gZmFsc2U7Ci0g
ICAgbV9vdmVyZmxvd0hlaWdodCA9IG1fb3ZlcmZsb3dXaWR0aCA9IDA7Ci0gICAgbV9vdmVyZmxv
d0xlZnQgPSBtX292ZXJmbG93VG9wID0gMDsKLSAgICBtX3RhYldpZHRoID0gMDsKLX0KLQotUmVu
ZGVyQmxvY2s6On5SZW5kZXJCbG9jaygpCi17Ci0gICAgZGVsZXRlIG1fZmxvYXRpbmdPYmplY3Rz
OwotICAgIGRlbGV0ZSBtX3Bvc2l0aW9uZWRPYmplY3RzOwotfQotCi12b2lkIFJlbmRlckJsb2Nr
OjpzZXRTdHlsZShSZW5kZXJTdHlsZSogX3N0eWxlKQotewotICAgIHNldFJlcGxhY2VkKF9zdHls
ZS0+aXNEaXNwbGF5UmVwbGFjZWRUeXBlKCkpOwotCi0gICAgUmVuZGVyRmxvdzo6c2V0U3R5bGUo
X3N0eWxlKTsKLQotICAgIC8vICMjIyB3ZSBjb3VsZCBzYXZlIHRoaXMgY2FsbCB3aGVuIHRoZSBj
aGFuZ2Ugb25seSBhZmZlY3RlZAotICAgIC8vIG5vbiBpbmhlcml0ZWQgcHJvcGVydGllcwotICAg
IFJlbmRlck9iamVjdCAqY2hpbGQgPSBmaXJzdENoaWxkKCk7Ci0gICAgd2hpbGUgKGNoaWxkICE9
IDApCi0gICAgeyAgIAotICAgICAgICBpZiAoY2hpbGQtPmlzQW5vbnltb3VzQmxvY2soKSkKLSAg
ICAgICAgewotICAgICAgICAgICAgUmVuZGVyU3R5bGUqIG5ld1N0eWxlID0gbmV3IChyZW5kZXJB
cmVuYSgpKSBSZW5kZXJTdHlsZSgpOwotICAgICAgICAgICAgbmV3U3R5bGUtPmluaGVyaXRGcm9t
KHN0eWxlKCkpOwotICAgICAgICAgICAgbmV3U3R5bGUtPnNldERpc3BsYXkoQkxPQ0spOwotICAg
ICAgICAgICAgY2hpbGQtPnNldFN0eWxlKG5ld1N0eWxlKTsKLSAgICAgICAgfQotICAgICAgICBj
aGlsZCA9IGNoaWxkLT5uZXh0U2libGluZygpOwotICAgIH0KLQotICAgIG1fbGluZUhlaWdodCA9
IC0xOwotICAgIG1fdGFiV2lkdGggPSAwOwotCi0gICAgLy8gVXBkYXRlIHBzZXVkb3MgZm9yIDpi
ZWZvcmUgYW5kIDphZnRlciBub3cuCi0gICAgUmVuZGVyT2JqZWN0KiBmaXJzdCA9IGZpcnN0Q2hp
bGQoKTsKLSAgICB3aGlsZSAoZmlyc3QgJiYgZmlyc3QtPmlzTGlzdE1hcmtlcigpKSBmaXJzdCA9
IGZpcnN0LT5uZXh0U2libGluZygpOwotICAgIHVwZGF0ZVBzZXVkb0NoaWxkKFJlbmRlclN0eWxl
OjpCRUZPUkUsIGZpcnN0KTsKLSAgICB1cGRhdGVQc2V1ZG9DaGlsZChSZW5kZXJTdHlsZTo6QUZU
RVIsIGxhc3RDaGlsZCgpKTsKLX0KLQotdm9pZCBSZW5kZXJCbG9jazo6YWRkQ2hpbGRUb0Zsb3co
UmVuZGVyT2JqZWN0KiBuZXdDaGlsZCwgUmVuZGVyT2JqZWN0KiBiZWZvcmVDaGlsZCkKLXsKLSAg
ICAvLyBNYWtlIHN1cmUgd2UgZG9uJ3QgYXBwZW5kIHRoaW5ncyBhZnRlciA6YWZ0ZXItZ2VuZXJh
dGVkIGNvbnRlbnQgaWYgd2UgaGF2ZSBpdC4KLSAgICBpZiAoIWJlZm9yZUNoaWxkICYmIGxhc3RD
aGlsZCgpICYmIGxhc3RDaGlsZCgpLT5zdHlsZSgpLT5zdHlsZVR5cGUoKSA9PSBSZW5kZXJTdHls
ZTo6QUZURVIpCi0gICAgICAgIGJlZm9yZUNoaWxkID0gbGFzdENoaWxkKCk7Ci0gICAgCi0gICAg
Ym9vbCBtYWRlQm94ZXNOb25JbmxpbmUgPSBGQUxTRTsKLQotICAgIC8vIElmIHRoZSByZXF1ZXN0
ZWQgYmVmb3JlQ2hpbGQgaXMgbm90IG9uZSBvZiBvdXIgY2hpbGRyZW4sIHRoZW4gdGhpcyBpcyBt
b3N0IGxpa2VseSBiZWNhdXNlCi0gICAgLy8gdGhlcmUgaXMgYW4gYW5vbnltb3VzIGJsb2NrIGJv
eCB3aXRoaW4gdGhpcyBvYmplY3QgdGhhdCBjb250YWlucyB0aGUgYmVmb3JlQ2hpbGQuIFNvCi0g
ICAgLy8ganVzdCBpbnNlcnQgdGhlIGNoaWxkIGludG8gdGhlIGFub255bW91cyBibG9jayBib3gg
aW5zdGVhZCBvZiBoZXJlLgotICAgIGlmIChiZWZvcmVDaGlsZCAmJiBiZWZvcmVDaGlsZC0+cGFy
ZW50KCkgIT0gdGhpcykgewotCi0gICAgICAgIEtIVE1MQXNzZXJ0KGJlZm9yZUNoaWxkLT5wYXJl
bnQoKSk7Ci0gICAgICAgIEtIVE1MQXNzZXJ0KGJlZm9yZUNoaWxkLT5wYXJlbnQoKS0+aXNBbm9u
eW1vdXNCbG9jaygpKTsKLQotICAgICAgICBpZiAobmV3Q2hpbGQtPmlzSW5saW5lKCkpIHsKLSAg
ICAgICAgICAgIGJlZm9yZUNoaWxkLT5wYXJlbnQoKS0+YWRkQ2hpbGQobmV3Q2hpbGQsYmVmb3Jl
Q2hpbGQpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYg
KGJlZm9yZUNoaWxkLT5wYXJlbnQoKS0+Zmlyc3RDaGlsZCgpICE9IGJlZm9yZUNoaWxkKQotICAg
ICAgICAgICAgcmV0dXJuIGJlZm9yZUNoaWxkLT5wYXJlbnQoKS0+YWRkQ2hpbGQobmV3Q2hpbGQs
IGJlZm9yZUNoaWxkKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIGFkZENoaWxk
VG9GbG93KG5ld0NoaWxkLCBiZWZvcmVDaGlsZC0+cGFyZW50KCkpOwotICAgIH0KLQotICAgIC8v
IEEgYmxvY2sgaGFzIHRvIGVpdGhlciBoYXZlIGFsbCBvZiBpdHMgY2hpbGRyZW4gaW5saW5lLCBv
ciBhbGwgb2YgaXRzIGNoaWxkcmVuIGFzIGJsb2Nrcy4KLSAgICAvLyBTbywgaWYgb3VyIGNoaWxk
cmVuIGFyZSBjdXJyZW50bHkgaW5saW5lIGFuZCBhIGJsb2NrIGNoaWxkIGhhcyB0byBiZSBpbnNl
cnRlZCwgd2UgbW92ZSBhbGwgb3VyCi0gICAgLy8gaW5saW5lIGNoaWxkcmVuIGludG8gYW5vbnlt
b3VzIGJsb2NrIGJveGVzCi0gICAgaWYgKCBtX2NoaWxkcmVuSW5saW5lICYmICFuZXdDaGlsZC0+
aXNJbmxpbmUoKSAmJiAhbmV3Q2hpbGQtPmlzRmxvYXRpbmdPclBvc2l0aW9uZWQoKSApCi0gICAg
ewotICAgICAgICAvLyBUaGlzIGlzIGEgYmxvY2sgd2l0aCBpbmxpbmUgY29udGVudC4gV3JhcCB0
aGUgaW5saW5lIGNvbnRlbnQgaW4gYW5vbnltb3VzIGJsb2Nrcy4KLSAgICAgICAgbWFrZUNoaWxk
cmVuTm9uSW5saW5lKGJlZm9yZUNoaWxkKTsKLSAgICAgICAgbWFkZUJveGVzTm9uSW5saW5lID0g
dHJ1ZTsKLSAgICAgICAgCi0gICAgICAgIGlmIChiZWZvcmVDaGlsZCAmJiBiZWZvcmVDaGlsZC0+
cGFyZW50KCkgIT0gdGhpcykgewotICAgICAgICAgICAgYmVmb3JlQ2hpbGQgPSBiZWZvcmVDaGls
ZC0+cGFyZW50KCk7Ci0gICAgICAgICAgICBLSFRNTEFzc2VydChiZWZvcmVDaGlsZC0+aXNBbm9u
eW1vdXNCbG9jaygpKTsKLSAgICAgICAgICAgIEtIVE1MQXNzZXJ0KGJlZm9yZUNoaWxkLT5wYXJl
bnQoKSA9PSB0aGlzKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmICghbV9jaGlsZHJl
bklubGluZSAmJiAhbmV3Q2hpbGQtPmlzRmxvYXRpbmdPclBvc2l0aW9uZWQoKSkKLSAgICB7Ci0g
ICAgICAgIC8vIElmIHdlJ3JlIGluc2VydGluZyBhbiBpbmxpbmUgY2hpbGQgYnV0IGFsbCBvZiBv
dXIgY2hpbGRyZW4gYXJlIGJsb2NrcywgdGhlbiB3ZSBoYXZlIHRvIG1ha2Ugc3VyZQotICAgICAg
ICAvLyBpdCBpcyBwdXQgaW50byBhbiBhbm9teW91cyBibG9jayBib3guIFdlIHRyeSB0byB1c2Ug
YW4gZXhpc3RpbmcgYW5vbnltb3VzIGJveCBpZiBwb3NzaWJsZSwgb3RoZXJ3aXNlCi0gICAgICAg
IC8vIGEgbmV3IG9uZSBpcyBjcmVhdGVkIGFuZCBpbnNlcnRlZCBpbnRvIG91ciBsaXN0IG9mIGNo
aWxkcmVuIGluIHRoZSBhcHByb3ByaWF0ZSBwb3NpdGlvbi4KLSAgICAgICAgaWYgKG5ld0NoaWxk
LT5pc0lubGluZSgpKSB7Ci0gICAgICAgICAgICBpZiAoYmVmb3JlQ2hpbGQpIHsKLSAgICAgICAg
ICAgICAgICBpZiAoYmVmb3JlQ2hpbGQtPnByZXZpb3VzU2libGluZygpICYmIGJlZm9yZUNoaWxk
LT5wcmV2aW91c1NpYmxpbmcoKS0+aXNBbm9ueW1vdXNCbG9jaygpKSB7Ci0gICAgICAgICAgICAg
ICAgICAgIGJlZm9yZUNoaWxkLT5wcmV2aW91c1NpYmxpbmcoKS0+YWRkQ2hpbGQobmV3Q2hpbGQp
OwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAg
ICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1fbGFzdCAm
JiBtX2xhc3QtPmlzQW5vbnltb3VzQmxvY2soKSkgewotICAgICAgICAgICAgICAgICAgICBtX2xh
c3QtPmFkZENoaWxkKG5ld0NoaWxkKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAg
ICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gbm8gc3VpdGFi
bGUgZXhpc3RpbmcgYW5vbnltb3VzIGJveCAtIGNyZWF0ZSBhIG5ldyBvbmUKLSAgICAgICAgICAg
IFJlbmRlckJsb2NrKiBuZXdCb3ggPSBjcmVhdGVBbm9ueW1vdXNCbG9jaygpOwotICAgICAgICAg
ICAgUmVuZGVyQ29udGFpbmVyOjphZGRDaGlsZChuZXdCb3gsYmVmb3JlQ2hpbGQpOwotICAgICAg
ICAgICAgbmV3Qm94LT5hZGRDaGlsZChuZXdDaGlsZCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0g
ICAgICAgIH0KLSAgICB9Ci0KLSAgICBSZW5kZXJDb250YWluZXI6OmFkZENoaWxkKG5ld0NoaWxk
LGJlZm9yZUNoaWxkKTsKLSAgICAvLyAjIyMgY2FyZSBhYm91dCBhbGlnbmVkIHN0dWZmCi0KLSAg
ICBpZiAoIG1hZGVCb3hlc05vbklubGluZSApCi0gICAgICAgIHJlbW92ZUxlZnRvdmVyQW5vbnlt
b3VzQm94ZXMoKTsKLX0KLQotc3RhdGljIHZvaWQgZ2V0SW5saW5lUnVuKFJlbmRlck9iamVjdCog
c3RhcnQsIFJlbmRlck9iamVjdCogYm91bmRhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAg
UmVuZGVyT2JqZWN0KiYgaW5saW5lUnVuU3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAg
UmVuZGVyT2JqZWN0KiYgaW5saW5lUnVuRW5kKQotewotICAgIC8vIEJlZ2lubmluZyBhdCB8c3Rh
cnR8IHdlIGZpbmQgdGhlIGxhcmdlc3QgY29udGlndW91cyBydW4gb2YgaW5saW5lcyB0aGF0Ci0g
ICAgLy8gd2UgY2FuLiAgV2UgZGVub3RlIHRoZSBydW4gd2l0aCBzdGFydCBhbmQgZW5kIHBvaW50
cywgfGlubGluZVJ1blN0YXJ0fAotICAgIC8vIGFuZCB8aW5saW5lUnVuRW5kfC4gIE5vdGUgdGhh
dCB0aGVzZSB0d28gdmFsdWVzIG1heSBiZSB0aGUgc2FtZSBpZgotICAgIC8vIHdlIGVuY291bnRl
ciBvbmx5IG9uZSBpbmxpbmUuCi0gICAgLy8KLSAgICAvLyBXZSBza2lwIGFueSBub24taW5saW5l
cyB3ZSBlbmNvdW50ZXIgYXMgbG9uZyBhcyB3ZSBoYXZlbid0IGZvdW5kIGFueQotICAgIC8vIGlu
bGluZXMgeWV0LgotICAgIC8vCi0gICAgLy8gfGJvdW5kYXJ5fCBpbmRpY2F0ZXMgYSBub24taW5j
bHVzaXZlIGJvdW5kYXJ5IHBvaW50LiAgUmVnYXJkbGVzcyBvZiB3aGV0aGVyIHxib3VuZGFyeXwK
LSAgICAvLyBpcyBpbmxpbmUgb3Igbm90LCB3ZSB3aWxsIG5vdCBpbmNsdWRlIGl0IGluIGEgcnVu
IHdpdGggaW5saW5lcyBiZWZvcmUgaXQuICBJdCdzIGFzIHRob3VnaCB3ZSBlbmNvdW50ZXJlZAot
ICAgIC8vIGEgbm9uLWlubGluZS4KLSAgICAKLSAgICAvLyBTdGFydCBieSBza2lwcGluZyBhcyBt
YW55IG5vbi1pbmxpbmVzIGFzIHdlIGNhbi4KLSAgICBSZW5kZXJPYmplY3QgKiBjdXJyID0gc3Rh
cnQ7Ci0gICAgYm9vbCBzYXdJbmxpbmU7Ci0gICAgZG8gewotICAgICAgICB3aGlsZSAoY3VyciAm
JiAhKGN1cnItPmlzSW5saW5lKCkgfHwgY3Vyci0+aXNGbG9hdGluZ09yUG9zaXRpb25lZCgpKSkK
LSAgICAgICAgICAgIGN1cnIgPSBjdXJyLT5uZXh0U2libGluZygpOwotICAgICAgICAKLSAgICAg
ICAgaW5saW5lUnVuU3RhcnQgPSBpbmxpbmVSdW5FbmQgPSBjdXJyOwotICAgICAgICAKLSAgICAg
ICAgaWYgKCFjdXJyKQotICAgICAgICAgICAgcmV0dXJuOyAvLyBObyBtb3JlIGlubGluZSBjaGls
ZHJlbiB0byBiZSBmb3VuZC4KLSAgICAgICAgCi0gICAgICAgIHNhd0lubGluZSA9IGN1cnItPmlz
SW5saW5lKCk7Ci0gICAgICAgIAotICAgICAgICBjdXJyID0gY3Vyci0+bmV4dFNpYmxpbmcoKTsK
LSAgICAgICAgd2hpbGUgKGN1cnIgJiYgKGN1cnItPmlzSW5saW5lKCkgfHwgY3Vyci0+aXNGbG9h
dGluZ09yUG9zaXRpb25lZCgpKSAmJiAoY3VyciAhPSBib3VuZGFyeSkpIHsKLSAgICAgICAgICAg
IGlubGluZVJ1bkVuZCA9IGN1cnI7Ci0gICAgICAgICAgICBpZiAoY3Vyci0+aXNJbmxpbmUoKSkK
LSAgICAgICAgICAgICAgICBzYXdJbmxpbmUgPSB0cnVlOwotICAgICAgICAgICAgY3VyciA9IGN1
cnItPm5leHRTaWJsaW5nKCk7Ci0gICAgICAgIH0KLSAgICB9IHdoaWxlICghc2F3SW5saW5lKTsK
LX0KLQotdm9pZCBSZW5kZXJCbG9jazo6bWFrZUNoaWxkcmVuTm9uSW5saW5lKFJlbmRlck9iamVj
dCAqaW5zZXJ0aW9uUG9pbnQpCi17ICAgIAotICAgIC8vIG1ha2VDaGlsZHJlbk5vbklubGluZSB0
YWtlcyBhIGJsb2NrIHdob3NlIGNoaWxkcmVuIGFyZSAqYWxsKiBpbmxpbmUgYW5kIGl0Ci0gICAg
Ly8gbWFrZXMgc3VyZSB0aGF0IGlubGluZSBjaGlsZHJlbiBhcmUgY29hbGVzY2VkIHVuZGVyIGFu
b255bW91cwotICAgIC8vIGJsb2Nrcy4gIElmIHxpbnNlcnRpb25Qb2ludHwgaXMgZGVmaW5lZCwg
dGhlbiBpdCByZXByZXNlbnRzIHRoZSBpbnNlcnRpb24gcG9pbnQgZm9yCi0gICAgLy8gdGhlIG5l
dyBibG9jayBjaGlsZCB0aGF0IGlzIGNhdXNpbmcgdXMgdG8gaGF2ZSB0byB3cmFwIGFsbCB0aGUg
aW5saW5lcy4gIFRoaXMKLSAgICAvLyBtZWFucyB0aGF0IHdlIGNhbm5vdCBjb2FsZXNjZSBpbmxp
bmVzIGJlZm9yZSB8aW5zZXJ0aW9uUG9pbnR8IHdpdGggaW5saW5lcyBmb2xsb3dpbmcKLSAgICAv
LyB8aW5zZXJ0aW9uUG9pbnR8LCBiZWNhdXNlIHRoZSBuZXcgY2hpbGQgaXMgZ29pbmcgdG8gYmUg
aW5zZXJ0ZWQgaW4gYmV0d2VlbiB0aGUgaW5saW5lcywKLSAgICAvLyBzcGxpdHRpbmcgdGhlbS4K
LSAgICBLSFRNTEFzc2VydChpc0lubGluZUJsb2NrT3JJbmxpbmVUYWJsZSgpIHx8ICFpc0lubGlu
ZSgpKTsKLSAgICBLSFRNTEFzc2VydCghaW5zZXJ0aW9uUG9pbnQgfHwgaW5zZXJ0aW9uUG9pbnQt
PnBhcmVudCgpID09IHRoaXMpOwotCi0gICAgbV9jaGlsZHJlbklubGluZSA9IGZhbHNlOwotCi0g
ICAgUmVuZGVyT2JqZWN0ICpjaGlsZCA9IGZpcnN0Q2hpbGQoKTsKLQotICAgIHdoaWxlIChjaGls
ZCkgewotICAgICAgICBSZW5kZXJPYmplY3QgKmlubGluZVJ1blN0YXJ0LCAqaW5saW5lUnVuRW5k
OwotICAgICAgICBnZXRJbmxpbmVSdW4oY2hpbGQsIGluc2VydGlvblBvaW50LCBpbmxpbmVSdW5T
dGFydCwgaW5saW5lUnVuRW5kKTsKLQotICAgICAgICBpZiAoIWlubGluZVJ1blN0YXJ0KQotICAg
ICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2hpbGQgPSBpbmxpbmVSdW5FbmQtPm5leHRTaWJs
aW5nKCk7Ci0KLSAgICAgICAgUmVuZGVyQmxvY2sqIGJveCA9IGNyZWF0ZUFub255bW91c0Jsb2Nr
KCk7Ci0gICAgICAgIGluc2VydENoaWxkTm9kZShib3gsIGlubGluZVJ1blN0YXJ0KTsKLSAgICAg
ICAgUmVuZGVyT2JqZWN0KiBvID0gaW5saW5lUnVuU3RhcnQ7Ci0gICAgICAgIHdoaWxlKG8gIT0g
aW5saW5lUnVuRW5kKQotICAgICAgICB7Ci0gICAgICAgICAgICBSZW5kZXJPYmplY3QqIG5vID0g
bzsKLSAgICAgICAgICAgIG8gPSBuby0+bmV4dFNpYmxpbmcoKTsKLSAgICAgICAgICAgIGJveC0+
YXBwZW5kQ2hpbGROb2RlKHJlbW92ZUNoaWxkTm9kZShubykpOwotICAgICAgICB9Ci0gICAgICAg
IGJveC0+YXBwZW5kQ2hpbGROb2RlKHJlbW92ZUNoaWxkTm9kZShpbmxpbmVSdW5FbmQpKTsKLSAg
ICB9Ci0KLSNpZm5kZWYgTkRFQlVHCi0gICAgZm9yIChSZW5kZXJPYmplY3QgKmMgPSBmaXJzdENo
aWxkKCk7IGM7IGMgPSBjLT5uZXh0U2libGluZygpKQotICAgICAgICBLSFRNTEFzc2VydCghYy0+
aXNJbmxpbmUoKSk7Ci0jZW5kaWYKLX0KLQotdm9pZCBSZW5kZXJCbG9jazo6cmVtb3ZlQ2hpbGQo
UmVuZGVyT2JqZWN0ICpvbGRDaGlsZCkKLXsKLSAgICAvLyBJZiB0aGlzIGNoaWxkIGlzIGEgYmxv
Y2ssIGFuZCBpZiBvdXIgcHJldmlvdXMgYW5kIG5leHQgc2libGluZ3MgYXJlCi0gICAgLy8gYm90
aCBhbm9ueW1vdXMgYmxvY2tzIHdpdGggaW5saW5lIGNvbnRlbnQsIHRoZW4gd2UgY2FuIGdvIGFo
ZWFkIGFuZAotICAgIC8vIGZvbGQgdGhlIGlubGluZSBjb250ZW50IGJhY2sgdG9nZXRoZXIuCi0g
ICAgUmVuZGVyT2JqZWN0KiBwcmV2ID0gb2xkQ2hpbGQtPnByZXZpb3VzU2libGluZygpOwotICAg
IFJlbmRlck9iamVjdCogbmV4dCA9IG9sZENoaWxkLT5uZXh0U2libGluZygpOwotICAgIGJvb2wg
Y2FuRGVsZXRlQW5vbnltb3VzQmxvY2tzID0gIWRvY3VtZW50QmVpbmdEZXN0cm95ZWQoKSAmJiAh
aXNJbmxpbmUoKSAmJiAhb2xkQ2hpbGQtPmlzSW5saW5lKCkgJiYgCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAhb2xkQ2hpbGQtPmNvbnRpbnVhdGlvbigpICYmIAotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFwcmV2IHx8IChwcmV2LT5pc0Fub255bW91
c0Jsb2NrKCkgJiYgcHJldi0+Y2hpbGRyZW5JbmxpbmUoKSkpICYmCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAoIW5leHQgfHwgKG5leHQtPmlzQW5vbnltb3VzQmxvY2soKSAm
JiBuZXh0LT5jaGlsZHJlbklubGluZSgpKSk7Ci0gICAgaWYgKGNhbkRlbGV0ZUFub255bW91c0Js
b2NrcyAmJiBwcmV2ICYmIG5leHQpIHsKLSAgICAgICAgLy8gVGFrZSBhbGwgdGhlIGNoaWxkcmVu
IG91dCBvZiB0aGUgfG5leHR8IGJsb2NrIGFuZCBwdXQgdGhlbSBpbgotICAgICAgICAvLyB0aGUg
fHByZXZ8IGJsb2NrLgotICAgICAgICBwcmV2LT5zZXROZWVkc0xheW91dEFuZE1pbk1heFJlY2Fs
YygpOwotICAgICAgICBSZW5kZXJPYmplY3QqIG8gPSBuZXh0LT5maXJzdENoaWxkKCk7Ci0gICAg
ICAgIHdoaWxlIChvKSB7Ci0gICAgICAgICAgICBSZW5kZXJPYmplY3QqIG5vID0gbzsKLSAgICAg
ICAgICAgIG8gPSBuby0+bmV4dFNpYmxpbmcoKTsKLSAgICAgICAgICAgIHByZXYtPmFwcGVuZENo
aWxkTm9kZShuZXh0LT5yZW1vdmVDaGlsZE5vZGUobm8pKTsKLSAgICAgICAgICAgIG5vLT5zZXRO
ZWVkc0xheW91dEFuZE1pbk1heFJlY2FsYygpOwotICAgICAgICB9Ci0gICAgICAgIC8vIE51a2Ug
dGhlIG5vdy1lbXB0eSBibG9jay4KLSAgICAgICAgbmV4dC0+ZGVzdHJveSgpOwotICAgIH0KLQot
ICAgIFJlbmRlckZsb3c6OnJlbW92ZUNoaWxkKG9sZENoaWxkKTsKLQotICAgIFJlbmRlck9iamVj
dCogY2hpbGQgPSBwcmV2ID8gcHJldiA6IG5leHQ7Ci0gICAgaWYgKGNhbkRlbGV0ZUFub255bW91
c0Jsb2NrcyAmJiBjaGlsZCAmJiAhY2hpbGQtPnByZXZpb3VzU2libGluZygpICYmICFjaGlsZC0+
bmV4dFNpYmxpbmcoKSkgewotICAgICAgICAvLyBUaGUgcmVtb3ZhbCBoYXMga25vY2tlZCB1cyBk
b3duIHRvIGNvbnRhaW5pbmcgb25seSBhIHNpbmdsZSBhbm9ueW1vdXMKLSAgICAgICAgLy8gYm94
LiAgV2UgY2FuIGdvIGFoZWFkIGFuZCBwdWxsIHRoZSBjb250ZW50IHJpZ2h0IGJhY2sgdXAgaW50
byBvdXIKLSAgICAgICAgLy8gYm94LgotICAgICAgICBzZXROZWVkc0xheW91dEFuZE1pbk1heFJl
Y2FsYygpOwotICAgICAgICBSZW5kZXJPYmplY3QqIGFub25CbG9jayA9IHJlbW92ZUNoaWxkTm9k
ZShjaGlsZCk7Ci0gICAgICAgIG1fY2hpbGRyZW5JbmxpbmUgPSB0cnVlOwotICAgICAgICBSZW5k
ZXJPYmplY3QqIG8gPSBhbm9uQmxvY2stPmZpcnN0Q2hpbGQoKTsKLSAgICAgICAgd2hpbGUgKG8p
IHsKLSAgICAgICAgICAgIFJlbmRlck9iamVjdCogbm8gPSBvOwotICAgICAgICAgICAgbyA9IG5v
LT5uZXh0U2libGluZygpOwotICAgICAgICAgICAgYXBwZW5kQ2hpbGROb2RlKGFub25CbG9jay0+
cmVtb3ZlQ2hpbGROb2RlKG5vKSk7Ci0gICAgICAgICAgICBuby0+c2V0TmVlZHNMYXlvdXRBbmRN
aW5NYXhSZWNhbGMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE51a2UgdGhlIG5vdy1lbXB0
eSBibG9jay4KLSAgICAgICAgYW5vbkJsb2NrLT5kZXN0cm95KCk7Ci0gICAgfQotfQotCi1pbnQg
UmVuZGVyQmxvY2s6Om92ZXJmbG93SGVpZ2h0KGJvb2wgaW5jbHVkZUludGVyaW9yKSBjb25zdAot
ewotICAgIHJldHVybiAoIWluY2x1ZGVJbnRlcmlvciAmJiBoYXNPdmVyZmxvd0NsaXAoKSkgPyBt
X2hlaWdodCA6IG1fb3ZlcmZsb3dIZWlnaHQ7Ci19Ci0KLWludCBSZW5kZXJCbG9jazo6b3ZlcmZs
b3dXaWR0aChib29sIGluY2x1ZGVJbnRlcmlvcikgY29uc3QKLXsKLSAgICByZXR1cm4gKCFpbmNs
dWRlSW50ZXJpb3IgJiYgaGFzT3ZlcmZsb3dDbGlwKCkpID8gbV93aWR0aCA6IG1fb3ZlcmZsb3dX
aWR0aDsKLX0KLWludCBSZW5kZXJCbG9jazo6b3ZlcmZsb3dMZWZ0KGJvb2wgaW5jbHVkZUludGVy
aW9yKSBjb25zdAotewotICAgIHJldHVybiAoIWluY2x1ZGVJbnRlcmlvciAmJiBoYXNPdmVyZmxv
d0NsaXAoKSkgPyAwIDogbV9vdmVyZmxvd0xlZnQ7Ci19Ci0KLWludCBSZW5kZXJCbG9jazo6b3Zl
cmZsb3dUb3AoYm9vbCBpbmNsdWRlSW50ZXJpb3IpIGNvbnN0Ci17Ci0gICAgcmV0dXJuICghaW5j
bHVkZUludGVyaW9yICYmIGhhc092ZXJmbG93Q2xpcCgpKSA/IDAgOiBtX292ZXJmbG93VG9wOwot
fQotCi1JbnRSZWN0IFJlbmRlckJsb2NrOjpvdmVyZmxvd1JlY3QoYm9vbCBpbmNsdWRlSW50ZXJp
b3IpIGNvbnN0Ci17Ci0gICAgaWYgKCFpbmNsdWRlSW50ZXJpb3IgJiYgaGFzT3ZlcmZsb3dDbGlw
KCkpCi0gICAgICAgIHJldHVybiBib3JkZXJCb3goKTsKLSAgICBpbnQgbCA9IG92ZXJmbG93TGVm
dChpbmNsdWRlSW50ZXJpb3IpOwotICAgIGludCB0ID0ga01pbihvdmVyZmxvd1RvcChpbmNsdWRl
SW50ZXJpb3IpLCAtYm9yZGVyVG9wRXh0cmEoKSk7Ci0gICAgcmV0dXJuIEludFJlY3QobCwgdCwg
bV9vdmVyZmxvd1dpZHRoIC0gMipsLCBtX292ZXJmbG93SGVpZ2h0ICsgYm9yZGVyVG9wRXh0cmEo
KSArIGJvcmRlckJvdHRvbUV4dHJhKCkgLSAyKnQpOwotfQotCi1ib29sIFJlbmRlckJsb2NrOjpp
c1NlbGZDb2xsYXBzaW5nQmxvY2soKSBjb25zdAotewotICAgIC8vIFdlIGFyZSBub3Qgc2VsZi1j
b2xsYXBzaW5nIGlmIHdlCi0gICAgLy8gKGEpIGhhdmUgYSBub24temVybyBoZWlnaHQgYWNjb3Jk
aW5nIHRvIGxheW91dCAoYW4gb3B0aW1pemF0aW9uIHRvIGF2b2lkIHdhc3RpbmcgdGltZSkKLSAg
ICAvLyAoYikgYXJlIGEgdGFibGUsCi0gICAgLy8gKGMpIGhhdmUgYm9yZGVyL3BhZGRpbmcsCi0g
ICAgLy8gKGQpIGhhdmUgYSBtaW4taGVpZ2h0Ci0gICAgLy8gKGUpIGhhdmUgc3BlY2lmaWVkIHRo
YXQgb25lIG9mIG91ciBtYXJnaW5zIGNhbid0IGNvbGxhcHNlIHVzaW5nIGEgQ1NTIGV4dGVuc2lv
bgotICAgIGlmIChtX2hlaWdodCA+IDAgfHwKLSAgICAgICAgaXNUYWJsZSgpIHx8IChib3JkZXJC
b3R0b20oKSArIHBhZGRpbmdCb3R0b20oKSArIGJvcmRlclRvcCgpICsgcGFkZGluZ1RvcCgpKSAh
PSAwIHx8Ci0gICAgICAgIHN0eWxlKCktPm1pbkhlaWdodCgpLnZhbHVlID4gMCB8fCAKLSAgICAg
ICAgc3R5bGUoKS0+bWFyZ2luVG9wQ29sbGFwc2UoKSA9PSBNU0VQQVJBVEUgfHwgc3R5bGUoKS0+
bWFyZ2luQm90dG9tQ29sbGFwc2UoKSA9PSBNU0VQQVJBVEUpCi0gICAgICAgIHJldHVybiBmYWxz
ZTsKLQotICAgIGJvb2wgaGFzQXV0b0hlaWdodCA9IHN0eWxlKCktPmhlaWdodCgpLmlzQXV0bygp
OwotICAgIGlmIChzdHlsZSgpLT5oZWlnaHQoKS5pc1BlcmNlbnQoKSAmJiAhc3R5bGUoKS0+aHRt
bEhhY2tzKCkpIHsKLSAgICAgICAgaGFzQXV0b0hlaWdodCA9IHRydWU7Ci0gICAgICAgIGZvciAo
UmVuZGVyQmxvY2sqIGNiID0gY29udGFpbmluZ0Jsb2NrKCk7ICFjYi0+aXNDYW52YXMoKTsgY2Ig
PSBjYi0+Y29udGFpbmluZ0Jsb2NrKCkpIHsKLSAgICAgICAgICAgIGlmIChjYi0+c3R5bGUoKS0+
aGVpZ2h0KCkuaXNGaXhlZCgpIHx8IGNiLT5pc1RhYmxlQ2VsbCgpKQotICAgICAgICAgICAgICAg
IGhhc0F1dG9IZWlnaHQgPSBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIElmIHRo
ZSBoZWlnaHQgaXMgMCBvciBhdXRvLCB0aGVuIHdoZXRoZXIgb3Igbm90IHdlIGFyZSBhIHNlbGYt
Y29sbGFwc2luZyBibG9jayBkZXBlbmRzCi0gICAgLy8gb24gd2hldGhlciB3ZSBoYXZlIGNvbnRl
bnQgdGhhdCBpcyBhbGwgc2VsZi1jb2xsYXBzaW5nIG9yIG5vdC4KLSAgICBpZiAoaGFzQXV0b0hl
aWdodCB8fCAoKHN0eWxlKCktPmhlaWdodCgpLmlzRml4ZWQoKSB8fCBzdHlsZSgpLT5oZWlnaHQo
KS5pc1BlcmNlbnQoKSkgJiYgc3R5bGUoKS0+aGVpZ2h0KCkudmFsdWUgPT0gMCkpIHsKLSAgICAg
ICAgLy8gSWYgdGhlIGJsb2NrIGhhcyBpbmxpbmUgY2hpbGRyZW4sIHNlZSBpZiB3ZSBnZW5lcmF0
ZWQgYW55IGxpbmUgYm94ZXMuICBJZiB3ZSBoYXZlIGFueQotICAgICAgICAvLyBsaW5lIGJveGVz
LCB0aGVuIHdlIGNhbid0IGJlIHNlbGYtY29sbGFwc2luZywgc2luY2Ugd2UgaGF2ZSBjb250ZW50
LgotICAgICAgICBpZiAoY2hpbGRyZW5JbmxpbmUoKSkKLSAgICAgICAgICAgIHJldHVybiAhZmly
c3RMaW5lQm94KCk7Ci0gICAgICAgIAotICAgICAgICAvLyBXaGV0aGVyIG9yIG5vdCB3ZSBjb2xs
YXBzZSBpcyBkZXBlbmRlbnQgb24gd2hldGhlciBhbGwgb3VyIG5vcm1hbCBmbG93IGNoaWxkcmVu
Ci0gICAgICAgIC8vIGFyZSBhbHNvIHNlbGYtY29sbGFwc2luZy4KLSAgICAgICAgZm9yIChSZW5k
ZXJPYmplY3QqIGNoaWxkID0gZmlyc3RDaGlsZCgpOyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4
dFNpYmxpbmcoKSkgewotICAgICAgICAgICAgaWYgKGNoaWxkLT5pc0Zsb2F0aW5nT3JQb3NpdGlv
bmVkKCkpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBpZiAoIWNoaWxk
LT5pc1NlbGZDb2xsYXBzaW5nQmxvY2soKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7
Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxz
ZTsKLX0KLQotdm9pZCBSZW5kZXJCbG9jazo6bGF5b3V0KCkKLXsKLSAgICAvLyBUYWJsZSBjZWxs
cyBjYWxsIGxheW91dEJsb2NrIGRpcmVjdGx5LCBzbyBkb24ndCBhZGQgYW55IGxvZ2ljIGhlcmUu
ICBQdXQgY29kZSBpbnRvCi0gICAgLy8gbGF5b3V0QmxvY2soKS4KLSAgICBsYXlvdXRCbG9jayhm
YWxzZSk7Ci19Ci0KLXZvaWQgUmVuZGVyQmxvY2s6OmxheW91dEJsb2NrKGJvb2wgcmVsYXlvdXRD
aGlsZHJlbikKLXsKLSAgICBLSFRNTEFzc2VydChuZWVkc0xheW91dCgpKTsKLSAgICBLSFRNTEFz
c2VydChtaW5NYXhLbm93bigpKTsKLQotICAgIGlmIChpc0lubGluZSgpICYmICFpc0lubGluZUJs
b2NrT3JJbmxpbmVUYWJsZSgpKSAvLyBJbmxpbmUgPGZvcm0+cyBpbnNpZGUgdmFyaW91cyB0YWJs
ZSBlbGVtZW50cyBjYW4KLSAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgLy8gY2F1c2UgdXMgdG8gY29tZSBpbiBoZXJlLiAgSnVzdCBiYWlsLgotCi0g
ICAgaWYgKCFyZWxheW91dENoaWxkcmVuICYmIHBvc0NoaWxkTmVlZHNMYXlvdXQoKSAmJiAhbm9y
bWFsQ2hpbGROZWVkc0xheW91dCgpICYmICFzZWxmTmVlZHNMYXlvdXQoKSkgewotICAgICAgICAv
LyBBbGwgd2UgaGF2ZSB0byBpcyBsYXkgb3V0IG91ciBwb3NpdGlvbmVkIG9iamVjdHMuCi0gICAg
ICAgIGxheW91dFBvc2l0aW9uZWRPYmplY3RzKHJlbGF5b3V0Q2hpbGRyZW4pOwotICAgICAgICBp
ZiAoaGFzT3ZlcmZsb3dDbGlwKCkpCi0gICAgICAgICAgICBtX2xheWVyLT51cGRhdGVTY3JvbGxJ
bmZvQWZ0ZXJMYXlvdXQoKTsKLSAgICAgICAgc2V0TmVlZHNMYXlvdXQoZmFsc2UpOwotICAgICAg
ICByZXR1cm47Ci0gICAgfQotICAgIAotICAgIEludFJlY3Qgb2xkQm91bmRzLCBvbGRGdWxsQm91
bmRzOwotICAgIGJvb2wgY2hlY2tGb3JSZXBhaW50ID0gY2hlY2tGb3JSZXBhaW50RHVyaW5nTGF5
b3V0KCk7Ci0gICAgaWYgKGNoZWNrRm9yUmVwYWludCkKLSAgICAgICAgZ2V0QWJzb2x1dGVSZXBh
aW50UmVjdEluY2x1ZGluZ0Zsb2F0cyhvbGRCb3VuZHMsIG9sZEZ1bGxCb3VuZHMpOwotCi0gICAg
aW50IG9sZFdpZHRoID0gbV93aWR0aDsKLSAgICAKLSAgICBjYWxjV2lkdGgoKTsKLSAgICBtX292
ZXJmbG93V2lkdGggPSBtX3dpZHRoOwotCi0gICAgaWYgKG9sZFdpZHRoICE9IG1fd2lkdGgpCi0g
ICAgICAgIHJlbGF5b3V0Q2hpbGRyZW4gPSB0cnVlOwotCi0gICAgY2xlYXJGbG9hdHMoKTsKLQot
ICAgIG1faGVpZ2h0ID0gMDsKLSAgICBtX292ZXJmbG93SGVpZ2h0ID0gMDsKLSAgICBtX2NsZWFy
U3RhdHVzID0gQ05PTkU7Ci0KLSAgICAvLyBXZSB1c2UgZm91ciB2YWx1ZXMsIG1heFRvcFBvcywg
bWF4UG9zTmVnLCBtYXhCb3R0b21Qb3MsIGFuZCBtYXhCb3R0b21OZWcsIHRvIHRyYWNrCi0gICAg
Ly8gb3VyIGN1cnJlbnQgbWF4aW1hbCBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgbWFyZ2lucy4gIFRo
ZXNlIHZhbHVlcyBhcmUgdXNlZCB3aGVuIHdlCi0gICAgLy8gYXJlIGNvbGxhcHNlZCB3aXRoIGFk
amFjZW50IGJsb2Nrcywgc28gZm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIGJsb2NrIEEgYW5kIEIK
LSAgICAvLyBjb2xsYXBzaW5nIHRvZ2V0aGVyLCB0aGVuIHlvdSdkIHRha2UgdGhlIG1heGltYWwg
cG9zaXRpdmUgbWFyZ2luIGZyb20gYm90aCBBIGFuZCBCCi0gICAgLy8gYW5kIHN1YnRyYWN0IGl0
IGZyb20gdGhlIG1heGltYWwgbmVnYXRpdmUgbWFyZ2luIGZyb20gYm90aCBBIGFuZCBCIHRvIGdl
dCB0aGUKLSAgICAvLyB0cnVlIGNvbGxhcHNlZCBtYXJnaW4uICBUaGlzIGFsZ29yaXRobSBpcyBy
ZWN1cnNpdmUsIHNvIHdoZW4gd2UgZmluaXNoIGxheW91dCgpCi0gICAgLy8gb3VyIGJsb2NrIGtu
b3dzIGl0cyBjdXJyZW50IG1heGltYWwgcG9zaXRpdmUvbmVnYXRpdmUgdmFsdWVzLgotICAgIC8v
Ci0gICAgLy8gU3RhcnQgb3V0IGJ5IHNldHRpbmcgb3VyIG1hcmdpbiB2YWx1ZXMgdG8gb3VyIGN1
cnJlbnQgbWFyZ2lucy4gIFRhYmxlIGNlbGxzIGhhdmUKLSAgICAvLyBubyBtYXJnaW5zLCBzbyB3
ZSBkb24ndCBmaWxsIGluIHRoZSB2YWx1ZXMgZm9yIHRhYmxlIGNlbGxzLgotICAgIGlmICghaXNU
YWJsZUNlbGwoKSkgewotICAgICAgICBpbml0TWF4TWFyZ2luVmFsdWVzKCk7Ci0KLSAgICAgICAg
bV90b3BNYXJnaW5RdWlyayA9IHN0eWxlKCktPm1hcmdpblRvcCgpLnF1aXJrOwotICAgICAgICBt
X2JvdHRvbU1hcmdpblF1aXJrID0gc3R5bGUoKS0+bWFyZ2luQm90dG9tKCkucXVpcms7Ci0KLSAg
ICAgICAgaWYgKGVsZW1lbnQoKSAmJiBlbGVtZW50KCktPmhhc1RhZ05hbWUoZm9ybVRhZykgJiYg
ZWxlbWVudCgpLT5pc01hbGZvcm1lZCgpKQotICAgICAgICAgICAgLy8gU2VlIGlmIHRoaXMgZm9y
bSBpcyBtYWxmb3JtZWQgKGkuZS4sIHVuY2xvc2VkKS4gSWYgc28sIGRvbid0IGdpdmUgdGhlIGZv
cm0KLSAgICAgICAgICAgIC8vIGEgYm90dG9tIG1hcmdpbi4KLSAgICAgICAgICAgIG1fbWF4Qm90
dG9tUG9zTWFyZ2luID0gbV9tYXhCb3R0b21OZWdNYXJnaW4gPSAwOwotICAgIH0KLQotICAgIGlm
IChzY3JvbGxzT3ZlcmZsb3coKSkgewotICAgICAgICAvLyBGb3Igb3ZlcmZsb3c6c2Nyb2xsIGJs
b2NrcywgZW5zdXJlIHdlIGhhdmUgYm90aCBzY3JvbGxiYXJzIGluIHBsYWNlIGFsd2F5cy4KLSAg
ICAgICAgaWYgKHN0eWxlKCktPm92ZXJmbG93KCkgPT0gT1NDUk9MTCkgewotICAgICAgICAgICAg
bV9sYXllci0+c2V0SGFzSG9yaXpvbnRhbFNjcm9sbGJhcih0cnVlKTsKLSAgICAgICAgICAgIG1f
bGF5ZXItPnNldEhhc1ZlcnRpY2FsU2Nyb2xsYmFyKHRydWUpOwotICAgICAgICB9Ci0gICAgICAg
IAotICAgICAgICAvLyBNb3ZlIHRoZSBzY3JvbGxiYXJzIGFzaWRlIGR1cmluZyBsYXlvdXQuICBU
aGUgbGF5ZXIgd2lsbCBtb3ZlIHRoZW0gYmFjayB3aGVuIGl0Ci0gICAgICAgIC8vIGRvZXMgcGFp
bnRpbmcgb3IgZXZlbnQgaGFuZGxpbmcuCi0gICAgICAgIG1fbGF5ZXItPm1vdmVTY3JvbGxiYXJz
QXNpZGUoKTsKLSAgICB9Ci0gICAKLSAgICBJbnRSZWN0IHJlcGFpbnRSZWN0OwotICAgIGlmIChj
aGlsZHJlbklubGluZSgpKQotICAgICAgICByZXBhaW50UmVjdCA9IGxheW91dElubGluZUNoaWxk
cmVuKHJlbGF5b3V0Q2hpbGRyZW4pOwotICAgIGVsc2UKLSAgICAgICAgbGF5b3V0QmxvY2tDaGls
ZHJlbihyZWxheW91dENoaWxkcmVuKTsKLQotICAgIC8vIEV4cGFuZCBvdXIgaW50cmluc2ljIGhl
aWdodCB0byBlbmNvbXBhc3MgZmxvYXRzLgotICAgIGludCB0b0FkZCA9IGJvcmRlckJvdHRvbSgp
ICsgcGFkZGluZ0JvdHRvbSgpOwotICAgIGlmIChpbmNsdWRlU2Nyb2xsYmFyU2l6ZSgpKQotICAg
ICAgICB0b0FkZCArPSBtX2xheWVyLT5ob3Jpem9udGFsU2Nyb2xsYmFySGVpZ2h0KCk7Ci0gICAg
aWYgKGZsb2F0Qm90dG9tKCkgPiAobV9oZWlnaHQgLSB0b0FkZCkgJiYgKGlzSW5saW5lQmxvY2tP
cklubGluZVRhYmxlKCkgfHwgaXNGbG9hdGluZ09yUG9zaXRpb25lZCgpIHx8IGhhc092ZXJmbG93
Q2xpcCgpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGFyZW50KCkg
JiYgcGFyZW50KCktPmlzRmxleGlibGVCb3goKSkpKQotICAgICAgICBtX2hlaWdodCA9IGZsb2F0
Qm90dG9tKCkgKyB0b0FkZDsKLSAgICAgICAgICAgCi0gICAgaW50IG9sZEhlaWdodCA9IG1faGVp
Z2h0OwotICAgIGNhbGNIZWlnaHQoKTsKLSAgICBpZiAob2xkSGVpZ2h0ICE9IG1faGVpZ2h0KSB7
Ci0gICAgICAgIHJlbGF5b3V0Q2hpbGRyZW4gPSB0cnVlOwotCi0gICAgICAgIC8vIElmIHRoZSBi
bG9jayBnb3QgZXhwYW5kZWQgaW4gc2l6ZSwgdGhlbiBpbmNyZWFzZSBvdXIgb3ZlcmZsb3doZWln
aHQgdG8gbWF0Y2guCi0gICAgICAgIGlmIChtX292ZXJmbG93SGVpZ2h0ID4gbV9oZWlnaHQpCi0g
ICAgICAgICAgICBtX292ZXJmbG93SGVpZ2h0IC09IHBhZGRpbmdCb3R0b20oKSArIGJvcmRlckJv
dHRvbSgpOwotICAgICAgICBpZiAobV9vdmVyZmxvd0hlaWdodCA8IG1faGVpZ2h0KQotICAgICAg
ICAgICAgbV9vdmVyZmxvd0hlaWdodCA9IG1faGVpZ2h0OwotICAgIH0KLQotICAgIGlmIChpc1Rh
YmxlQ2VsbCgpKSB7Ci0gICAgICAgIC8vIFRhYmxlIGNlbGxzIG5lZWQgdG8gZ3JvdyB0byBhY2Nv
bW1vZGF0ZSBib3RoIG92ZXJoYW5naW5nIGZsb2F0cyBhbmQKLSAgICAgICAgLy8gYmxvY2tzIHRo
YXQgaGF2ZSBvdmVyZmxvd2VkIGNvbnRlbnQuCi0gICAgICAgIC8vIENoZWNrIGZvciBhbiBvdmVy
aGFuZ2luZyBmbG9hdCBmaXJzdC4KLSAgICAgICAgLy8gRklYTUU6IFRoaXMgbmVlZHMgdG8gbG9v
ayBhdCB0aGUgbGFzdCBmbG93LCBub3QgdGhlIGxhc3QgY2hpbGQuCi0gICAgICAgIGlmIChsYXN0
Q2hpbGQoKSAmJiBsYXN0Q2hpbGQoKS0+aGFzT3ZlcmhhbmdpbmdGbG9hdHMoKSkgewotICAgICAg
ICAgICAgS0hUTUxBc3NlcnQobGFzdENoaWxkKCktPmlzUmVuZGVyQmxvY2soKSk7Ci0gICAgICAg
ICAgICBtX2hlaWdodCA9IGxhc3RDaGlsZCgpLT55UG9zKCkgKyBzdGF0aWNfY2FzdDxSZW5kZXJC
bG9jayo+KGxhc3RDaGlsZCgpKS0+ZmxvYXRCb3R0b20oKTsKLSAgICAgICAgICAgIG1faGVpZ2h0
ICs9IGJvcmRlckJvdHRvbSgpICsgcGFkZGluZ0JvdHRvbSgpOwotICAgICAgICB9Ci0KLSAgICAg
ICAgaWYgKG1fb3ZlcmZsb3dIZWlnaHQgPiBtX2hlaWdodCAmJiAhaGFzT3ZlcmZsb3dDbGlwKCkp
Ci0gICAgICAgICAgICBtX2hlaWdodCA9IG1fb3ZlcmZsb3dIZWlnaHQgKyBib3JkZXJCb3R0b20o
KSArIHBhZGRpbmdCb3R0b20oKTsKLSAgICB9Ci0KLSAgICBpZiAoaGFzT3ZlcmhhbmdpbmdGbG9h
dHMoKSAmJiAoKGlzRmxvYXRpbmcoKSAmJiBzdHlsZSgpLT5oZWlnaHQoKS5pc0F1dG8oKSkgfHwg
aXNUYWJsZUNlbGwoKSkpIHsKLSAgICAgICAgbV9oZWlnaHQgPSBmbG9hdEJvdHRvbSgpOwotICAg
ICAgICBtX2hlaWdodCArPSBib3JkZXJCb3R0b20oKSArIHBhZGRpbmdCb3R0b20oKTsKLSAgICB9
Ci0KLSAgICBsYXlvdXRQb3NpdGlvbmVkT2JqZWN0cyggcmVsYXlvdXRDaGlsZHJlbiApOwotCi0g
ICAgLy8gQWx3YXlzIGVuc3VyZSBvdXIgb3ZlcmZsb3cgd2lkdGgvaGVpZ2h0IGFyZSBhdCBsZWFz
dCBhcyBsYXJnZSBhcyBvdXIgd2lkdGgvaGVpZ2h0LgotICAgIG1fb3ZlcmZsb3dXaWR0aCA9IGtN
YXgobV9vdmVyZmxvd1dpZHRoLCBtX3dpZHRoKTsKLSAgICBtX292ZXJmbG93SGVpZ2h0ID0ga01h
eChtX292ZXJmbG93SGVpZ2h0LCBtX2hlaWdodCk7Ci0KLSAgICAvLyBVcGRhdGUgb3VyIHNjcm9s
bCBpbmZvcm1hdGlvbiBpZiB3ZSdyZSBvdmVyZmxvdzphdXRvL3Njcm9sbC9oaWRkZW4gbm93IHRo
YXQgd2Uga25vdyBpZgotICAgIC8vIHdlIG92ZXJmbG93IG9yIG5vdC4KLSAgICBpZiAoaGFzT3Zl
cmZsb3dDbGlwKCkpCi0gICAgICAgIG1fbGF5ZXItPnVwZGF0ZVNjcm9sbEluZm9BZnRlckxheW91
dCgpOwotCi0gICAgLy8gUmVwYWludCB3aXRoIG91ciBuZXcgYm91bmRzIGlmIHRoZXkgYXJlIGRp
ZmZlcmVudCBmcm9tIG91ciBvbGQgYm91bmRzLgotICAgIGJvb2wgZGlkRnVsbFJlcGFpbnQgPSBm
YWxzZTsKLSAgICBpZiAoY2hlY2tGb3JSZXBhaW50KQotICAgICAgICBkaWRGdWxsUmVwYWludCA9
IHJlcGFpbnRBZnRlckxheW91dElmTmVlZGVkKG9sZEJvdW5kcywgb2xkRnVsbEJvdW5kcyk7Ci0g
ICAgaWYgKCFkaWRGdWxsUmVwYWludCAmJiAhcmVwYWludFJlY3QuaXNFbXB0eSgpKSB7Ci0gICAg
ICAgIFJlbmRlckNhbnZhcyogYyA9IGNhbnZhcygpOwotICAgICAgICBpZiAoYyAmJiBjLT52aWV3
KCkpCi0gICAgICAgICAgICBjLT52aWV3KCktPmFkZFJlcGFpbnRJbmZvKHRoaXMsIHJlcGFpbnRS
ZWN0KTsgLy8gV2UgbmVlZCB0byBkbyBhIHBhcnRpYWwgcmVwYWludCBvZiBvdXIgY29udGVudC4K
LSAgICB9Ci0gICAgc2V0TmVlZHNMYXlvdXQoZmFsc2UpOwotfQotCi12b2lkIFJlbmRlckJsb2Nr
OjphZGp1c3RQb3NpdGlvbmVkQmxvY2soUmVuZGVyT2JqZWN0KiBjaGlsZCwgY29uc3QgTWFyZ2lu
SW5mbyYgbWFyZ2luSW5mbykKLXsKLSAgICBpZiAoY2hpbGQtPmhhc1N0YXRpY1goKSkgewotICAg
ICAgICBpZiAoc3R5bGUoKS0+ZGlyZWN0aW9uKCkgPT0gTFRSKQotICAgICAgICAgICAgY2hpbGQt
PnNldFN0YXRpY1goYm9yZGVyTGVmdCgpICsgcGFkZGluZ0xlZnQoKSk7Ci0gICAgICAgIGVsc2UK
LSAgICAgICAgICAgIGNoaWxkLT5zZXRTdGF0aWNYKGJvcmRlclJpZ2h0KCkgKyBwYWRkaW5nUmln
aHQoKSk7Ci0gICAgfQotCi0gICAgaWYgKGNoaWxkLT5oYXNTdGF0aWNZKCkpIHsKLSAgICAgICAg
aW50IG1hcmdpbk9mZnNldCA9IDA7Ci0gICAgICAgIGlmICghbWFyZ2luSW5mby5jYW5Db2xsYXBz
ZVdpdGhUb3AoKSkgewotICAgICAgICAgICAgaW50IGNvbGxhcHNlZFRvcFBvcyA9IG1hcmdpbklu
Zm8ucG9zTWFyZ2luKCk7Ci0gICAgICAgICAgICBpbnQgY29sbGFwc2VkVG9wTmVnID0gbWFyZ2lu
SW5mby5uZWdNYXJnaW4oKTsKLSAgICAgICAgICAgIGJvb2wgcG9zTWFyZ2luID0gY2hpbGQtPm1h
cmdpblRvcCgpID49IDA7Ci0gICAgICAgICAgICBpZiAocG9zTWFyZ2luICYmIGNoaWxkLT5tYXJn
aW5Ub3AoKSA+IGNvbGxhcHNlZFRvcFBvcykKLSAgICAgICAgICAgICAgICBjb2xsYXBzZWRUb3BQ
b3MgPSBjaGlsZC0+bWFyZ2luVG9wKCk7Ci0gICAgICAgICAgICBlbHNlIGlmICghcG9zTWFyZ2lu
ICYmIGNoaWxkLT5tYXJnaW5Ub3AoKSA+IGNvbGxhcHNlZFRvcE5lZykKLSAgICAgICAgICAgICAg
ICBjb2xsYXBzZWRUb3BOZWcgPSBjaGlsZC0+bWFyZ2luVG9wKCk7Ci0gICAgICAgICAgICBtYXJn
aW5PZmZzZXQgKz0gKGNvbGxhcHNlZFRvcFBvcyAtIGNvbGxhcHNlZFRvcE5lZykgLSBjaGlsZC0+
bWFyZ2luVG9wKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGNoaWxkLT5zZXRTdGF0
aWNZKG1faGVpZ2h0ICsgbWFyZ2luT2Zmc2V0KTsKLSAgICB9Ci19Ci0KLXZvaWQgUmVuZGVyQmxv
Y2s6OmFkanVzdEZsb2F0aW5nQmxvY2soY29uc3QgTWFyZ2luSW5mbyYgbWFyZ2luSW5mbykKLXsK
LSAgICAvLyBUaGUgZmxvYXQgc2hvdWxkIGJlIHBvc2l0aW9uZWQgdGFraW5nIGludG8gYWNjb3Vu
dCB0aGUgYm90dG9tIG1hcmdpbgotICAgIC8vIG9mIHRoZSBwcmV2aW91cyBmbG93LiAgV2UgYWRk
IHRoYXQgbWFyZ2luIGludG8gdGhlIGhlaWdodCwgZ2V0IHRoZQotICAgIC8vIGZsb2F0IHBvc2l0
aW9uZWQgcHJvcGVybHksIGFuZCB0aGVuIHN1YnRyYWN0IHRoZSBtYXJnaW4gb3V0IG9mIHRoZQot
ICAgIC8vIGhlaWdodCBhZ2Fpbi4gIEluIHRoZSBjYXNlIG9mIHNlbGYtY29sbGFwc2luZyBibG9j
a3MsIHdlIGFsd2F5cyBqdXN0Ci0gICAgLy8gdXNlIHRoZSB0b3AgbWFyZ2lucywgc2luY2UgdGhl
IHNlbGYtY29sbGFwc2luZyBibG9jayBjb2xsYXBzZWQgaXRzCi0gICAgLy8gb3duIGJvdHRvbSBt
YXJnaW4gaW50byBpdHMgdG9wIG1hcmdpbi4KLSAgICAvLwotICAgIC8vIE5vdGUgYWxzbyB0aGF0
IHRoZSBwcmV2aW91cyBmbG93IG1heSBjb2xsYXBzZSBpdHMgbWFyZ2luIGludG8gdGhlIHRvcCBv
ZgotICAgIC8vIG91ciBibG9jay4gIElmIHRoaXMgaXMgdGhlIGNhc2UsIHRoZW4gd2UgZG8gbm90
IGFkZCB0aGUgbWFyZ2luIGluIHRvIG91cgotICAgIC8vIGhlaWdodCB3aGVuIGNvbXB1dGluZyB0
aGUgcG9zaXRpb24gb2YgdGhlIGZsb2F0LiAgIFRoaXMgY29uZGl0aW9uIGNhbiBiZSB0ZXN0ZWQK
LSAgICAvLyBmb3IgYnkgc2ltcGx5IGNhbGxpbmcgY2FuQ29sbGFwc2VXaXRoVG9wLiAgU2VlCi0g
ICAgLy8gaHR0cDovL3d3dy5oaXhpZS5jaC90ZXN0cy9hZGhvYy9jc3MvYm94L2Jsb2NrL21hcmdp
bi1jb2xsYXBzZS8wNDYuaHRtbCBmb3IKLSAgICAvLyBhbiBleGFtcGxlIG9mIHRoaXMgc2NlbmFy
aW8uCi0gICAgaW50IG1hcmdpbk9mZnNldCA9IG1hcmdpbkluZm8uY2FuQ29sbGFwc2VXaXRoVG9w
KCkgPyAwIDogbWFyZ2luSW5mby5tYXJnaW4oKTsKLSAgICBtX2hlaWdodCArPSBtYXJnaW5PZmZz
ZXQ7Ci0gICAgcG9zaXRpb25OZXdGbG9hdHMoKTsKLSAgICBtX2hlaWdodCAtPSBtYXJnaW5PZmZz
ZXQ7Ci19Ci0KLVJlbmRlck9iamVjdCogUmVuZGVyQmxvY2s6OmhhbmRsZVNwZWNpYWxDaGlsZChS
ZW5kZXJPYmplY3QqIGNoaWxkLCBjb25zdCBNYXJnaW5JbmZvJiBtYXJnaW5JbmZvLCBDb21wYWN0
SW5mbyYgY29tcGFjdEluZm8sIGJvb2wmIGhhbmRsZWQpCi17Ci0gICAgLy8gSGFuZGxlIHBvc2l0
aW9uZWQgY2hpbGRyZW4gZmlyc3QuCi0gICAgUmVuZGVyT2JqZWN0KiBuZXh0ID0gaGFuZGxlUG9z
aXRpb25lZENoaWxkKGNoaWxkLCBtYXJnaW5JbmZvLCBoYW5kbGVkKTsKLSAgICBpZiAoaGFuZGxl
ZCkgcmV0dXJuIG5leHQ7Ci0gICAgCi0gICAgLy8gSGFuZGxlIGZsb2F0aW5nIGNoaWxkcmVuIG5l
eHQuCi0gICAgbmV4dCA9IGhhbmRsZUZsb2F0aW5nQ2hpbGQoY2hpbGQsIG1hcmdpbkluZm8sIGhh
bmRsZWQpOwotICAgIGlmIChoYW5kbGVkKSByZXR1cm4gbmV4dDsKLQotICAgIC8vIFNlZSBpZiB3
ZSBoYXZlIGEgY29tcGFjdCBlbGVtZW50LiAgSWYgd2UgZG8sIHRoZW4gdHJ5IHRvIHR1Y2sgdGhl
IGNvbXBhY3QgZWxlbWVudCBpbnRvIHRoZSBtYXJnaW4gc3BhY2Ugb2YgdGhlIG5leHQgYmxvY2su
Ci0gICAgbmV4dCA9IGhhbmRsZUNvbXBhY3RDaGlsZChjaGlsZCwgY29tcGFjdEluZm8sIGhhbmRs
ZWQpOwotICAgIGlmIChoYW5kbGVkKSByZXR1cm4gbmV4dDsKLQotICAgIC8vIEZpbmFsbHksIHNl
ZSBpZiB3ZSBoYXZlIGEgcnVuLWluIGVsZW1lbnQuCi0gICAgcmV0dXJuIGhhbmRsZVJ1bkluQ2hp
bGQoY2hpbGQsIGhhbmRsZWQpOwotfQotCi0KLVJlbmRlck9iamVjdCogUmVuZGVyQmxvY2s6Omhh
bmRsZVBvc2l0aW9uZWRDaGlsZChSZW5kZXJPYmplY3QqIGNoaWxkLCBjb25zdCBNYXJnaW5JbmZv
JiBtYXJnaW5JbmZvLCBib29sJiBoYW5kbGVkKQotewotICAgIGlmIChjaGlsZC0+aXNQb3NpdGlv
bmVkKCkpIHsKLSAgICAgICAgaGFuZGxlZCA9IHRydWU7Ci0gICAgICAgIGNoaWxkLT5jb250YWlu
aW5nQmxvY2soKS0+aW5zZXJ0UG9zaXRpb25lZE9iamVjdChjaGlsZCk7Ci0gICAgICAgIGFkanVz
dFBvc2l0aW9uZWRCbG9jayhjaGlsZCwgbWFyZ2luSW5mbyk7Ci0gICAgICAgIHJldHVybiBjaGls
ZC0+bmV4dFNpYmxpbmcoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotUmVuZGVyT2Jq
ZWN0KiBSZW5kZXJCbG9jazo6aGFuZGxlRmxvYXRpbmdDaGlsZChSZW5kZXJPYmplY3QqIGNoaWxk
LCBjb25zdCBNYXJnaW5JbmZvJiBtYXJnaW5JbmZvLCBib29sJiBoYW5kbGVkKQotewotICAgIGlm
IChjaGlsZC0+aXNGbG9hdGluZygpKSB7Ci0gICAgICAgIGhhbmRsZWQgPSB0cnVlOwotICAgICAg
ICBpbnNlcnRGbG9hdGluZ09iamVjdChjaGlsZCk7Ci0gICAgICAgIGFkanVzdEZsb2F0aW5nQmxv
Y2sobWFyZ2luSW5mbyk7Ci0gICAgICAgIHJldHVybiBjaGlsZC0+bmV4dFNpYmxpbmcoKTsKLSAg
ICB9Ci0gICAgCi0gICAgcmV0dXJuIDA7Ci19Ci0KLVJlbmRlck9iamVjdCogUmVuZGVyQmxvY2s6
OmhhbmRsZUNvbXBhY3RDaGlsZChSZW5kZXJPYmplY3QqIGNoaWxkLCBDb21wYWN0SW5mbyYgY29t
cGFjdEluZm8sIGJvb2wmIGhhbmRsZWQpCi17Ci0gICAgLy8gRklYTUU6IFdlIG9ubHkgZGVhbCB3
aXRoIG9uZSBjb21wYWN0IGF0IGEgdGltZS4gIEl0IGlzIHVuY2xlYXIgd2hhdCBzaG91bGQgYmUK
LSAgICAvLyBkb25lIGlmIG11bHRpcGxlIGNvbnRpZ3VvdXMgY29tcGFjdHMgYXJlIGVuY291bnRl
cmVkLiAgRm9yIG5vdyB3ZSBhc3N1bWUgdGhhdAotICAgIC8vIGNvbXBhY3QgQSBmb2xsb3dlZCBi
eSBhbm90aGVyIGNvbXBhY3QgQiBzaG91bGQgc2ltcGx5IGJlIHRyZWF0ZWQgYXMgYmxvY2sgQS4K
LSAgICBpZiAoY2hpbGQtPmlzQ29tcGFjdCgpICYmICFjb21wYWN0SW5mby5jb21wYWN0KCkgJiYg
KGNoaWxkLT5jaGlsZHJlbklubGluZSgpIHx8IGNoaWxkLT5pc1JlcGxhY2VkKCkpKSB7Ci0gICAg
ICAgIC8vIEdldCB0aGUgbmV4dCBub24tcG9zaXRpb25lZC9ub24tZmxvYXRpbmcgUmVuZGVyQmxv
Y2suCi0gICAgICAgIFJlbmRlck9iamVjdCogbmV4dCA9IGNoaWxkLT5uZXh0U2libGluZygpOwot
ICAgICAgICBSZW5kZXJPYmplY3QqIGN1cnIgPSBuZXh0OwotICAgICAgICB3aGlsZSAoY3VyciAm
JiBjdXJyLT5pc0Zsb2F0aW5nT3JQb3NpdGlvbmVkKCkpCi0gICAgICAgICAgICBjdXJyID0gY3Vy
ci0+bmV4dFNpYmxpbmcoKTsKLSAgICAgICAgaWYgKGN1cnIgJiYgY3Vyci0+aXNSZW5kZXJCbG9j
aygpICYmICFjdXJyLT5pc0NvbXBhY3QoKSAmJiAhY3Vyci0+aXNSdW5JbigpKSB7Ci0gICAgICAg
ICAgICBjdXJyLT5jYWxjV2lkdGgoKTsgLy8gU28gdGhhdCBob3Jpem9udGFsIG1hcmdpbnMgYXJl
IGNvcnJlY3QuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBj
aGlsZC0+c2V0SW5saW5lKHRydWUpOyAvLyBOZWVkIHRvIGNvbXB1dGUgdGhlIG1hcmdpbnMvd2lk
dGggZm9yIHRoZSBjaGlsZCBhcyB0aG91Z2ggaXQgaXMgYW4gaW5saW5lLCBzbyB0aGF0IGl0IHdv
bid0IHRyeSB0byBwdWZmIHVwIHRoZSBtYXJnaW5zIHRvCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAvLyBmaWxsIHRoZSBjb250YWluaW5nIGJsb2NrIHdpZHRoLgotICAgICAg
ICAgICAgY2hpbGQtPmNhbGNXaWR0aCgpOwotICAgICAgICAgICAgaW50IGNoaWxkTWFyZ2lucyA9
IGNoaWxkLT5tYXJnaW5MZWZ0KCkgKyBjaGlsZC0+bWFyZ2luUmlnaHQoKTsKLSAgICAgICAgICAg
IGludCBtYXJnaW4gPSBzdHlsZSgpLT5kaXJlY3Rpb24oKSA9PSBMVFIgPyBjdXJyLT5tYXJnaW5M
ZWZ0KCkgOiBjdXJyLT5tYXJnaW5SaWdodCgpOwotICAgICAgICAgICAgaWYgKG1hcmdpbiA+PSAo
Y2hpbGRNYXJnaW5zICsgY2hpbGQtPm1heFdpZHRoKCkpKSB7Ci0gICAgICAgICAgICAgICAgLy8g
VGhlIGNvbXBhY3Qgd2lsbCBmaXQgaW4gdGhlIG1hcmdpbi4KLSAgICAgICAgICAgICAgICBoYW5k
bGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBjb21wYWN0SW5mby5zZXQoY2hpbGQsIGN1cnIp
OwotICAgICAgICAgICAgICAgIGNoaWxkLT5zZXRQb3MoMCwwKTsgLy8gVGhpcyBwb3NpdGlvbiB3
aWxsIGJlIHVwZGF0ZWQgdG8gcmVmbGVjdCB0aGUgY29tcGFjdCdzCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAvLyBkZXNpcmVkIHBvc2l0aW9uIGFuZCB0aGUgbGluZSBib3gg
Zm9yIHRoZSBjb21wYWN0IHdpbGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IC8vIHBpY2sgdGhhdCBwb3NpdGlvbiB1cC4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAg
ICAgICAvLyBSZW1vdmUgdGhlIGNoaWxkLgotICAgICAgICAgICAgICAgIFJlbmRlck9iamVjdCog
bmV4dCA9IGNoaWxkLT5uZXh0U2libGluZygpOwotICAgICAgICAgICAgICAgIHJlbW92ZUNoaWxk
Tm9kZShjaGlsZCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gTm93IGlu
c2VydCB0aGUgY2hpbGQgdW5kZXIgfGN1cnJ8LgotICAgICAgICAgICAgICAgIGN1cnItPmluc2Vy
dENoaWxkTm9kZShjaGlsZCwgY3Vyci0+Zmlyc3RDaGlsZCgpKTsKLSAgICAgICAgICAgICAgICBy
ZXR1cm4gbmV4dDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAg
ICAgICBjaGlsZC0+c2V0SW5saW5lKGZhbHNlKTsgLy8gV2UgZGlkbid0IGZpdCwgc28gd2UgcmVt
YWluIGEgYmxvY2stbGV2ZWwgZWxlbWVudC4KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4g
MDsKLX0KLQotdm9pZCBSZW5kZXJCbG9jazo6aW5zZXJ0Q29tcGFjdElmTmVlZGVkKFJlbmRlck9i
amVjdCogY2hpbGQsIENvbXBhY3RJbmZvJiBjb21wYWN0SW5mbykKLXsKLSAgICBpZiAoY29tcGFj
dEluZm8ubWF0Y2hlcyhjaGlsZCkpIHsKLSAgICAgICAgLy8gV2UgaGF2ZSBhIGNvbXBhY3QgY2hp
bGQgdG8gc3F1ZWV6ZSBpbi4KLSAgICAgICAgUmVuZGVyT2JqZWN0KiBjb21wYWN0Q2hpbGQgPSBj
b21wYWN0SW5mby5jb21wYWN0KCk7Ci0gICAgICAgIGludCBjb21wYWN0WFBvcyA9IGJvcmRlckxl
ZnQoKSArIHBhZGRpbmdMZWZ0KCkgKyBjb21wYWN0Q2hpbGQtPm1hcmdpbkxlZnQoKTsKLSAgICAg
ICAgaWYgKHN0eWxlKCktPmRpcmVjdGlvbigpID09IFJUTCkgewotICAgICAgICAgICAgY29tcGFj
dENoaWxkLT5jYWxjV2lkdGgoKTsgLy8gaGF2ZSB0byBkbyB0aGlzIGJlY2F1c2Ugb2YgdGhlIGNh
cHBlZCBtYXh3aWR0aAotICAgICAgICAgICAgY29tcGFjdFhQb3MgPSB3aWR0aCgpIC0gYm9yZGVy
UmlnaHQoKSAtIHBhZGRpbmdSaWdodCgpIC0gbWFyZ2luUmlnaHQoKSAtCi0gICAgICAgICAgICAg
ICAgY29tcGFjdENoaWxkLT53aWR0aCgpIC0gY29tcGFjdENoaWxkLT5tYXJnaW5SaWdodCgpOwot
ICAgICAgICB9Ci0gICAgICAgIGNvbXBhY3RYUG9zIC09IGNoaWxkLT54UG9zKCk7IC8vIFB1dCBj
b21wYWN0WFBvcyBpbnRvIHRoZSBjaGlsZCdzIGNvb3JkaW5hdGUgc3BhY2UuCi0gICAgICAgIGNv
bXBhY3RDaGlsZC0+c2V0UG9zKGNvbXBhY3RYUG9zLCBjb21wYWN0Q2hpbGQtPnlQb3MoKSk7IC8v
IFNldCB0aGUgeCBwb3NpdGlvbi4KLSAgICAgICAgY29tcGFjdEluZm8uY2xlYXIoKTsKLSAgICB9
Ci19Ci0KLVJlbmRlck9iamVjdCogUmVuZGVyQmxvY2s6OmhhbmRsZVJ1bkluQ2hpbGQoUmVuZGVy
T2JqZWN0KiBjaGlsZCwgYm9vbCYgaGFuZGxlZCkKLXsKLSAgICAvLyBTZWUgaWYgd2UgaGF2ZSBh
IHJ1bi1pbiBlbGVtZW50IHdpdGggaW5saW5lIGNoaWxkcmVuLiAgSWYgdGhlCi0gICAgLy8gY2hp
bGRyZW4gYXJlbid0IGlubGluZSwgdGhlbiBqdXN0IHRyZWF0IHRoZSBydW4taW4gYXMgYSBub3Jt
YWwKLSAgICAvLyBibG9jay4KLSAgICBpZiAoY2hpbGQtPmlzUnVuSW4oKSAmJiAoY2hpbGQtPmNo
aWxkcmVuSW5saW5lKCkgfHwgY2hpbGQtPmlzUmVwbGFjZWQoKSkpIHsKLSAgICAgICAgLy8gR2V0
IHRoZSBuZXh0IG5vbi1wb3NpdGlvbmVkL25vbi1mbG9hdGluZyBSZW5kZXJCbG9jay4KLSAgICAg
ICAgUmVuZGVyT2JqZWN0KiBjdXJyID0gY2hpbGQtPm5leHRTaWJsaW5nKCk7Ci0gICAgICAgIHdo
aWxlIChjdXJyICYmIGN1cnItPmlzRmxvYXRpbmdPclBvc2l0aW9uZWQoKSkKLSAgICAgICAgICAg
IGN1cnIgPSBjdXJyLT5uZXh0U2libGluZygpOwotICAgICAgICBpZiAoY3VyciAmJiAoY3Vyci0+
aXNSZW5kZXJCbG9jaygpICYmIGN1cnItPmNoaWxkcmVuSW5saW5lKCkgJiYgIWN1cnItPmlzQ29t
cGFjdCgpICYmICFjdXJyLT5pc1J1bkluKCkpKSB7Ci0gICAgICAgICAgICAvLyBUaGUgYmxvY2sg
YWN0cyBsaWtlIGFuIGlubGluZSwgc28ganVzdCBudWxsIG91dCBpdHMKLSAgICAgICAgICAgIC8v
IHBvc2l0aW9uLgotICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7Ci0gICAgICAgICAgICBjaGls
ZC0+c2V0SW5saW5lKHRydWUpOwotICAgICAgICAgICAgY2hpbGQtPnNldFBvcygwLDApOwotICAg
ICAgICAgICAgCi0gICAgICAgICAgICAvLyBSZW1vdmUgdGhlIGNoaWxkLgotICAgICAgICAgICAg
UmVuZGVyT2JqZWN0KiBuZXh0ID0gY2hpbGQtPm5leHRTaWJsaW5nKCk7Ci0gICAgICAgICAgICBy
ZW1vdmVDaGlsZE5vZGUoY2hpbGQpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBOb3cg
aW5zZXJ0IHRoZSBjaGlsZCB1bmRlciB8Y3VycnwuCi0gICAgICAgICAgICBjdXJyLT5pbnNlcnRD
aGlsZE5vZGUoY2hpbGQsIGN1cnItPmZpcnN0Q2hpbGQoKSk7Ci0gICAgICAgICAgICByZXR1cm4g
bmV4dDsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotdm9pZCBSZW5kZXJC
bG9jazo6Y29sbGFwc2VNYXJnaW5zKFJlbmRlck9iamVjdCogY2hpbGQsIE1hcmdpbkluZm8mIG1h
cmdpbkluZm8sIGludCB5UG9zRXN0aW1hdGUpCi17Ci0gICAgLy8gR2V0IG91ciBtYXggcG9zIGFu
ZCBuZWcgdG9wIG1hcmdpbnMuCi0gICAgaW50IHBvc1RvcCA9IGNoaWxkLT5tYXhUb3BNYXJnaW4o
dHJ1ZSk7Ci0gICAgaW50IG5lZ1RvcCA9IGNoaWxkLT5tYXhUb3BNYXJnaW4oZmFsc2UpOwotCi0g
ICAgLy8gRm9yIHNlbGYtY29sbGFwc2luZyBibG9ja3MsIGNvbGxhcHNlIG91ciBib3R0b20gbWFy
Z2lucyBpbnRvIG91cgotICAgIC8vIHRvcCB0byBnZXQgbmV3IHBvc1RvcCBhbmQgbmVnVG9wIHZh
bHVlcy4KLSAgICBpZiAoY2hpbGQtPmlzU2VsZkNvbGxhcHNpbmdCbG9jaygpKSB7Ci0gICAgICAg
IHBvc1RvcCA9IGtNYXgocG9zVG9wLCBjaGlsZC0+bWF4Qm90dG9tTWFyZ2luKHRydWUpKTsKLSAg
ICAgICAgbmVnVG9wID0ga01heChuZWdUb3AsIGNoaWxkLT5tYXhCb3R0b21NYXJnaW4oZmFsc2Up
KTsKLSAgICB9Ci0gICAgCi0gICAgLy8gU2VlIGlmIHRoZSB0b3AgbWFyZ2luIGlzIHF1aXJreS4g
V2Ugb25seSBjYXJlIGlmIHRoaXMgY2hpbGQgaGFzCi0gICAgLy8gbWFyZ2lucyB0aGF0IHdpbGwg
Y29sbGFwc2Ugd2l0aCB1cy4KLSAgICBib29sIHRvcFF1aXJrID0gY2hpbGQtPmlzVG9wTWFyZ2lu
UXVpcmsoKSB8fCBzdHlsZSgpLT5tYXJnaW5Ub3BDb2xsYXBzZSgpID09IE1ESVNDQVJEOwotCi0g
ICAgaWYgKG1hcmdpbkluZm8uY2FuQ29sbGFwc2VXaXRoVG9wKCkpIHsKLSAgICAgICAgLy8gVGhp
cyBjaGlsZCBpcyBjb2xsYXBzaW5nIHdpdGggdGhlIHRvcCBvZiB0aGUKLSAgICAgICAgLy8gYmxv
Y2suICBJZiBpdCBoYXMgbGFyZ2VyIG1hcmdpbiB2YWx1ZXMsIHRoZW4gd2UgbmVlZCB0byB1cGRh
dGUKLSAgICAgICAgLy8gb3VyIG93biBtYXhpbWFsIHZhbHVlcy4KLSAgICAgICAgaWYgKCFzdHls
ZSgpLT5odG1sSGFja3MoKSB8fCAhbWFyZ2luSW5mby5xdWlya0NvbnRhaW5lcigpIHx8ICF0b3BR
dWlyaykgewotICAgICAgICAgICAgbV9tYXhUb3BQb3NNYXJnaW4gPSBrTWF4KHBvc1RvcCwgbV9t
YXhUb3BQb3NNYXJnaW4pOwotICAgICAgICAgICAgbV9tYXhUb3BOZWdNYXJnaW4gPSBrTWF4KG5l
Z1RvcCwgbV9tYXhUb3BOZWdNYXJnaW4pOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVGhlIG1p
bnV0ZSBhbnkgb2YgdGhlIG1hcmdpbnMgaW52b2x2ZWQgaXNuJ3QgYSBxdWlyaywgZG9uJ3QKLSAg
ICAgICAgLy8gY29sbGFwc2UgaXQgYXdheSwgZXZlbiBpZiB0aGUgbWFyZ2luIGlzIHNtYWxsZXIg
KHd3dy53ZWJyZWZlcmVuY2UuY29tCi0gICAgICAgIC8vIGhhcyBhbiBleGFtcGxlIG9mIHRoaXMs
IGEgPGR0PiB3aXRoIDAuOGVtIGF1dGhvci1zcGVjaWZpZWQgaW5zaWRlCi0gICAgICAgIC8vIGEg
PGRsPiBpbnNpZGUgYSA8dGQ+LgotICAgICAgICBpZiAoIW1hcmdpbkluZm8uZGV0ZXJtaW5lZFRv
cFF1aXJrKCkgJiYgIXRvcFF1aXJrICYmIChwb3NUb3AtbmVnVG9wKSkgewotICAgICAgICAgICAg
bV90b3BNYXJnaW5RdWlyayA9IGZhbHNlOwotICAgICAgICAgICAgbWFyZ2luSW5mby5zZXREZXRl
cm1pbmVkVG9wUXVpcmsodHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIW1hcmdpbklu
Zm8uZGV0ZXJtaW5lZFRvcFF1aXJrKCkgJiYgdG9wUXVpcmsgJiYgbWFyZ2luVG9wKCkgPT0gMCkK
LSAgICAgICAgICAgIC8vIFdlIGhhdmUgbm8gdG9wIG1hcmdpbiBhbmQgb3VyIHRvcCBjaGlsZCBo
YXMgYSBxdWlya3kgbWFyZ2luLgotICAgICAgICAgICAgLy8gV2Ugd2lsbCBwaWNrIHVwIHRoaXMg
cXVpcmt5IG1hcmdpbiBhbmQgcGFzcyBpdCB0aHJvdWdoLgotICAgICAgICAgICAgLy8gVGhpcyBk
ZWFscyB3aXRoIHRoZSA8dGQ+PGRpdj48cD4gY2FzZS4KLSAgICAgICAgICAgIC8vIERvbid0IGRv
IHRoaXMgZm9yIGEgYmxvY2sgdGhhdCBzcGxpdCB0d28gaW5saW5lcyB0aG91Z2guICBZb3UgZG8K
LSAgICAgICAgICAgIC8vIHN0aWxsIGFwcGx5IG1hcmdpbnMgaW4gdGhpcyBjYXNlLgotICAgICAg
ICAgICAgbV90b3BNYXJnaW5RdWlyayA9IHRydWU7Ci0gICAgfQotCi0gICAgaWYgKG1hcmdpbklu
Zm8ucXVpcmtDb250YWluZXIoKSAmJiBtYXJnaW5JbmZvLmF0VG9wT2ZCbG9jaygpICYmIChwb3NU
b3AgLSBuZWdUb3ApKQotICAgICAgICBtYXJnaW5JbmZvLnNldFRvcFF1aXJrKHRvcFF1aXJrKTsK
LQotICAgIGludCB5cG9zID0gbV9oZWlnaHQ7Ci0gICAgaWYgKGNoaWxkLT5pc1NlbGZDb2xsYXBz
aW5nQmxvY2soKSkgewotICAgICAgICAvLyBUaGlzIGNoaWxkIGhhcyBubyBoZWlnaHQuICBXZSBu
ZWVkIHRvIGNvbXB1dGUgb3VyCi0gICAgICAgIC8vIHBvc2l0aW9uIGJlZm9yZSB3ZSBjb2xsYXBz
ZSB0aGUgY2hpbGQncyBtYXJnaW5zIHRvZ2V0aGVyLAotICAgICAgICAvLyBzbyB0aGF0IHdlIGNh
biBnZXQgYW4gYWNjdXJhdGUgcG9zaXRpb24gZm9yIHRoZSB6ZXJvLWhlaWdodCBibG9jay4KLSAg
ICAgICAgaW50IGNvbGxhcHNlZFRvcFBvcyA9IGtNYXgobWFyZ2luSW5mby5wb3NNYXJnaW4oKSwg
Y2hpbGQtPm1heFRvcE1hcmdpbih0cnVlKSk7Ci0gICAgICAgIGludCBjb2xsYXBzZWRUb3BOZWcg
PSBrTWF4KG1hcmdpbkluZm8ubmVnTWFyZ2luKCksIGNoaWxkLT5tYXhUb3BNYXJnaW4oZmFsc2Up
KTsKLSAgICAgICAgbWFyZ2luSW5mby5zZXRNYXJnaW4oY29sbGFwc2VkVG9wUG9zLCBjb2xsYXBz
ZWRUb3BOZWcpOwotICAgICAgICAKLSAgICAgICAgLy8gTm93IGNvbGxhcHNlIHRoZSBjaGlsZCdz
IG1hcmdpbnMgdG9nZXRoZXIsIHdoaWNoIG1lYW5zIGV4YW1pbmluZyBvdXIKLSAgICAgICAgLy8g
Ym90dG9tIG1hcmdpbiB2YWx1ZXMgYXMgd2VsbC4gCi0gICAgICAgIG1hcmdpbkluZm8uc2V0UG9z
TWFyZ2luSWZMYXJnZXIoY2hpbGQtPm1heEJvdHRvbU1hcmdpbih0cnVlKSk7Ci0gICAgICAgIG1h
cmdpbkluZm8uc2V0TmVnTWFyZ2luSWZMYXJnZXIoY2hpbGQtPm1heEJvdHRvbU1hcmdpbihmYWxz
ZSkpOwotCi0gICAgICAgIGlmICghbWFyZ2luSW5mby5jYW5Db2xsYXBzZVdpdGhUb3AoKSkKLSAg
ICAgICAgICAgIC8vIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHBvc2l0aW9uIG9mIHRo
ZSBzZWxmLWNvbGxhcHNpbmcgYmxvY2sKLSAgICAgICAgICAgIC8vIGlzIGNvcnJlY3QsIHNpbmNl
IGl0IGNvdWxkIGhhdmUgb3ZlcmZsb3dpbmcgY29udGVudAotICAgICAgICAgICAgLy8gdGhhdCBu
ZWVkcyB0byBiZSBwb3NpdGlvbmVkIGNvcnJlY3RseSAoZS5nLiwgYSBibG9jayB0aGF0Ci0gICAg
ICAgICAgICAvLyBoYWQgYSBzcGVjaWZpZWQgaGVpZ2h0IG9mIDAgYnV0IHRoYXQgYWN0dWFsbHkg
aGFkIHN1YmNvbnRlbnQpLgotICAgICAgICAgICAgeXBvcyA9IG1faGVpZ2h0ICsgY29sbGFwc2Vk
VG9wUG9zIC0gY29sbGFwc2VkVG9wTmVnOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgaWYg
KGNoaWxkLT5zdHlsZSgpLT5tYXJnaW5Ub3BDb2xsYXBzZSgpID09IE1TRVBBUkFURSkgewotICAg
ICAgICAgICAgbV9oZWlnaHQgKz0gbWFyZ2luSW5mby5tYXJnaW4oKSArIGNoaWxkLT5tYXJnaW5U
b3AoKTsKLSAgICAgICAgICAgIHlwb3MgPSBtX2hlaWdodDsKLSAgICAgICAgfQotICAgICAgICBl
bHNlIGlmICghbWFyZ2luSW5mby5hdFRvcE9mQmxvY2soKSB8fAotICAgICAgICAgICAgKCFtYXJn
aW5JbmZvLmNhbkNvbGxhcHNlVG9wV2l0aENoaWxkcmVuKCkKLSAgICAgICAgICAgICAmJiAoIXN0
eWxlKCktPmh0bWxIYWNrcygpIHx8ICFtYXJnaW5JbmZvLnF1aXJrQ29udGFpbmVyKCkgfHwgIW1h
cmdpbkluZm8udG9wUXVpcmsoKSkpKSB7Ci0gICAgICAgICAgICAvLyBXZSdyZSBjb2xsYXBzaW5n
IHdpdGggYSBwcmV2aW91cyBzaWJsaW5nJ3MgbWFyZ2lucyBhbmQgbm90Ci0gICAgICAgICAgICAv
LyB3aXRoIHRoZSB0b3Agb2YgdGhlIGJsb2NrLgotICAgICAgICAgICAgbV9oZWlnaHQgKz0ga01h
eChtYXJnaW5JbmZvLnBvc01hcmdpbigpLCBwb3NUb3ApIC0ga01heChtYXJnaW5JbmZvLm5lZ01h
cmdpbigpLCBuZWdUb3ApOwotICAgICAgICAgICAgeXBvcyA9IG1faGVpZ2h0OwotICAgICAgICB9
Ci0KLSAgICAgICAgbWFyZ2luSW5mby5zZXRQb3NNYXJnaW4oY2hpbGQtPm1heEJvdHRvbU1hcmdp
bih0cnVlKSk7Ci0gICAgICAgIG1hcmdpbkluZm8uc2V0TmVnTWFyZ2luKGNoaWxkLT5tYXhCb3R0
b21NYXJnaW4oZmFsc2UpKTsKLQotICAgICAgICBpZiAobWFyZ2luSW5mby5tYXJnaW4oKSkKLSAg
ICAgICAgICAgIG1hcmdpbkluZm8uc2V0Qm90dG9tUXVpcmsoY2hpbGQtPmlzQm90dG9tTWFyZ2lu
UXVpcmsoKSB8fCBzdHlsZSgpLT5tYXJnaW5Cb3R0b21Db2xsYXBzZSgpID09IE1ESVNDQVJEKTsK
LQotICAgICAgICBtYXJnaW5JbmZvLnNldFNlbGZDb2xsYXBzaW5nQmxvY2tDbGVhcmVkRmxvYXQo
ZmFsc2UpOwotICAgIH0KLQotICAgIGNoaWxkLT5zZXRQb3MoY2hpbGQtPnhQb3MoKSwgeXBvcyk7
Ci0gICAgaWYgKHlwb3MgIT0geVBvc0VzdGltYXRlKSB7Ci0gICAgICAgIGlmIChjaGlsZC0+c3R5
bGUoKS0+d2lkdGgoKS5pc1BlcmNlbnQoKSAmJiBjaGlsZC0+dXNlc0xpbmVXaWR0aCgpKQotICAg
ICAgICAgICAgLy8gVGhlIGNoaWxkJ3Mgd2lkdGggaXMgYSBwZXJjZW50YWdlIG9mIHRoZSBsaW5l
IHdpZHRoLgotICAgICAgICAgICAgLy8gV2hlbiB0aGUgY2hpbGQgc2hpZnRzIHRvIGNsZWFyIGFu
IGl0ZW0sIGl0cyB3aWR0aCBjYW4KLSAgICAgICAgICAgIC8vIGNoYW5nZSAoYmVjYXVzZSBpdCBo
YXMgbW9yZSBhdmFpbGFibGUgbGluZSB3aWR0aCkuCi0gICAgICAgICAgICAvLyBTbyBnbyBhaGVh
ZCBhbmQgbWFyayB0aGUgaXRlbSBhcyBkaXJ0eS4KLSAgICAgICAgICAgIGNoaWxkLT5zZXRDaGls
ZE5lZWRzTGF5b3V0KHRydWUpOwotCi0gICAgICAgIGlmICghY2hpbGQtPmF2b2lkc0Zsb2F0cygp
ICYmIGNoaWxkLT5jb250YWluc0Zsb2F0cygpKQotICAgICAgICAgICAgY2hpbGQtPm1hcmtBbGxE
ZXNjZW5kYW50c1dpdGhGbG9hdHNGb3JMYXlvdXQoKTsKLQotICAgICAgICAvLyBPdXIgZ3Vlc3Mg
d2FzIHdyb25nLiBNYWtlIHRoZSBjaGlsZCBsYXkgaXRzZWxmIG91dCBhZ2Fpbi4KLSAgICAgICAg
Y2hpbGQtPmxheW91dElmTmVlZGVkKCk7Ci0gICAgfQotfQotCi12b2lkIFJlbmRlckJsb2NrOjpj
bGVhckZsb2F0c0lmTmVlZGVkKFJlbmRlck9iamVjdCogY2hpbGQsIE1hcmdpbkluZm8mIG1hcmdp
bkluZm8sIGludCBvbGRUb3BQb3NNYXJnaW4sIGludCBvbGRUb3BOZWdNYXJnaW4pCi17Ci0gICAg
aW50IGhlaWdodEluY3JlYXNlID0gZ2V0Q2xlYXJEZWx0YShjaGlsZCk7Ci0gICAgaWYgKGhlaWdo
dEluY3JlYXNlKSB7Ci0gICAgICAgIC8vIFRoZSBjaGlsZCBuZWVkcyB0byBiZSBsb3dlcmVkLiAg
TW92ZSB0aGUgY2hpbGQgc28gdGhhdCBpdCBqdXN0IGNsZWFycyB0aGUgZmxvYXQuCi0gICAgICAg
IGNoaWxkLT5zZXRQb3MoY2hpbGQtPnhQb3MoKSwgY2hpbGQtPnlQb3MoKSArIGhlaWdodEluY3Jl
YXNlKTsKLQotICAgICAgICAvLyBJbmNyZWFzZSBvdXIgaGVpZ2h0IGJ5IHRoZSBhbW91bnQgd2Ug
aGFkIHRvIGNsZWFyLgotICAgICAgICBpZiAoIWNoaWxkLT5pc1NlbGZDb2xsYXBzaW5nQmxvY2so
KSkKLSAgICAgICAgICAgIG1faGVpZ2h0ICs9IGhlaWdodEluY3JlYXNlOwotICAgICAgICBlbHNl
IHsKLSAgICAgICAgICAgIC8vIEZvciBzZWxmLWNvbGxhcHNpbmcgYmxvY2tzIHRoYXQgY2xlYXIs
IHRoZXkgbWF5IGVuZCB1cCBjb2xsYXBzaW5nCi0gICAgICAgICAgICAvLyBpbnRvIHRoZSBib3R0
b20gb2YgdGhlIHBhcmVudCBibG9jay4gIFdlIHNpbXVsYXRlIHRoaXMgYmVoYXZpb3IgYnkKLSAg
ICAgICAgICAgIC8vIHNldHRpbmcgb3VyIHBvc2l0aXZlIG1hcmdpbiB2YWx1ZSB0byBjb21wZW5z
YXRlIGZvciB0aGUgY2xlYXIuCi0gICAgICAgICAgICBtYXJnaW5JbmZvLnNldFBvc01hcmdpbihr
TWF4KDAsIGNoaWxkLT55UG9zKCkgLSBtX2hlaWdodCkpOwotICAgICAgICAgICAgbWFyZ2luSW5m
by5zZXROZWdNYXJnaW4oMCk7Ci0gICAgICAgICAgICBtYXJnaW5JbmZvLnNldFNlbGZDb2xsYXBz
aW5nQmxvY2tDbGVhcmVkRmxvYXQodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAg
IGlmIChtYXJnaW5JbmZvLmNhbkNvbGxhcHNlV2l0aFRvcCgpKSB7Ci0gICAgICAgICAgICAvLyBX
ZSBjYW4gbm8gbG9uZ2VyIGNvbGxhcHNlIHdpdGggdGhlIHRvcCBvZiB0aGUgYmxvY2sgc2luY2Ug
YSBjbGVhcgotICAgICAgICAgICAgLy8gb2NjdXJyZWQuICBUaGUgZW1wdHkgYmxvY2tzIGNvbGxh
cHNlIGludG8gdGhlIGNsZWFyZWQgYmxvY2suCi0gICAgICAgICAgICAvLyBGSVhNRTogVGhpcyBp
c24ndCBxdWl0ZSBjb3JyZWN0LiAgTmVlZCBjbGFyaWZpY2F0aW9uIGZvciB3aGF0IHRvIGRvCi0g
ICAgICAgICAgICAvLyBpZiB0aGUgaGVpZ2h0IHRoZSBjbGVhcmVkIGJsb2NrIGlzIG9mZnNldCBi
eSBpcyBzbWFsbGVyIHRoYW4gdGhlCi0gICAgICAgICAgICAvLyBtYXJnaW5zIGludm9sdmVkLgot
ICAgICAgICAgICAgbV9tYXhUb3BQb3NNYXJnaW4gPSBvbGRUb3BQb3NNYXJnaW47Ci0gICAgICAg
ICAgICBtX21heFRvcE5lZ01hcmdpbiA9IG9sZFRvcE5lZ01hcmdpbjsKLSAgICAgICAgICAgIG1h
cmdpbkluZm8uc2V0QXRUb3BPZkJsb2NrKGZhbHNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8v
IElmIG91ciB2YWx1ZSBvZiBjbGVhciBjYXVzZWQgdXMgdG8gYmUgcmVwb3NpdGlvbmVkIHZlcnRp
Y2FsbHkgdG8gYmUKLSAgICAgICAgLy8gdW5kZXJuZWF0aCBhIGZsb2F0LCB3ZSBtaWdodCBoYXZl
IHRvIGRvIGFub3RoZXIgbGF5b3V0IHRvIHRha2UgaW50byBhY2NvdW50Ci0gICAgICAgIC8vIHRo
ZSBleHRyYSBzcGFjZSB3ZSBub3cgaGF2ZSBhdmFpbGFibGUuCi0gICAgICAgIGlmIChjaGlsZC0+
c3R5bGUoKS0+d2lkdGgoKS5pc1BlcmNlbnQoKSAmJiBjaGlsZC0+dXNlc0xpbmVXaWR0aCgpKQot
ICAgICAgICAgICAgLy8gVGhlIGNoaWxkJ3Mgd2lkdGggaXMgYSBwZXJjZW50YWdlIG9mIHRoZSBs
aW5lIHdpZHRoLgotICAgICAgICAgICAgLy8gV2hlbiB0aGUgY2hpbGQgc2hpZnRzIHRvIGNsZWFy
IGFuIGl0ZW0sIGl0cyB3aWR0aCBjYW4KLSAgICAgICAgICAgIC8vIGNoYW5nZSAoYmVjYXVzZSBp
dCBoYXMgbW9yZSBhdmFpbGFibGUgbGluZSB3aWR0aCkuCi0gICAgICAgICAgICAvLyBTbyBnbyBh
aGVhZCBhbmQgbWFyayB0aGUgaXRlbSBhcyBkaXJ0eS4KLSAgICAgICAgICAgIGNoaWxkLT5zZXRD
aGlsZE5lZWRzTGF5b3V0KHRydWUpOwotICAgICAgICBpZiAoIWNoaWxkLT5hdm9pZHNGbG9hdHMo
KSAmJiBjaGlsZC0+Y29udGFpbnNGbG9hdHMoKSkKLSAgICAgICAgICAgIGNoaWxkLT5tYXJrQWxs
RGVzY2VuZGFudHNXaXRoRmxvYXRzRm9yTGF5b3V0KCk7Ci0gICAgICAgIGNoaWxkLT5sYXlvdXRJ
Zk5lZWRlZCgpOwotICAgIH0KLX0KLQotaW50IFJlbmRlckJsb2NrOjplc3RpbWF0ZVZlcnRpY2Fs
UG9zaXRpb24oUmVuZGVyT2JqZWN0KiBjaGlsZCwgY29uc3QgTWFyZ2luSW5mbyYgbWFyZ2luSW5m
bykKLXsKLSAgICAvLyBGSVhNRTogV2UgbmVlZCB0byBlbGltaW5hdGUgdGhlIGVzdGltYXRpb24g
b2YgdmVydGljYWwgcG9zaXRpb24sIGJlY2F1c2Ugd2hlbiBpdCdzIHdyb25nIHdlIHNvbWV0aW1l
cyB0cmlnZ2VyIGEgcGF0aG9sb2dpY2FsCi0gICAgLy8gcmVsYXlvdXQgaWYgdGhlcmUgYXJlIGlu
dHJ1ZGluZyBmbG9hdHMuCi0gICAgaW50IHlQb3NFc3RpbWF0ZSA9IG1faGVpZ2h0OwotICAgIGlm
ICghbWFyZ2luSW5mby5jYW5Db2xsYXBzZVdpdGhUb3AoKSkgewotICAgICAgICBpbnQgY2hpbGRN
YXJnaW5Ub3AgPSBjaGlsZC0+c2VsZk5lZWRzTGF5b3V0KCkgPyBjaGlsZC0+bWFyZ2luVG9wKCkg
OiBjaGlsZC0+Y29sbGFwc2VkTWFyZ2luVG9wKCk7Ci0gICAgICAgIHlQb3NFc3RpbWF0ZSArPSBr
TWF4KG1hcmdpbkluZm8ubWFyZ2luKCksIGNoaWxkTWFyZ2luVG9wKTsKLSAgICB9Ci0gICAgcmV0
dXJuIHlQb3NFc3RpbWF0ZTsKLX0KLQotdm9pZCBSZW5kZXJCbG9jazo6ZGV0ZXJtaW5lSG9yaXpv
bnRhbFBvc2l0aW9uKFJlbmRlck9iamVjdCogY2hpbGQpCi17Ci0gICAgaWYgKHN0eWxlKCktPmRp
cmVjdGlvbigpID09IExUUikgewotICAgICAgICBpbnQgeFBvcyA9IGJvcmRlckxlZnQoKSArIHBh
ZGRpbmdMZWZ0KCk7Ci0gICAgICAgIAotICAgICAgICAvLyBBZGQgaW4gb3VyIGxlZnQgbWFyZ2lu
LgotICAgICAgICBpbnQgY2hQb3MgPSB4UG9zICsgY2hpbGQtPm1hcmdpbkxlZnQoKTsKLSAgICAg
ICAgCi0gICAgICAgIC8vIFNvbWUgb2JqZWN0cyAoZS5nLiwgdGFibGVzLCBob3Jpem9udGFsIHJ1
bGVzLCBvdmVyZmxvdzphdXRvIGJsb2NrcykgYXZvaWQgZmxvYXRzLiAgVGhleSBuZWVkCi0gICAg
ICAgIC8vIHRvIHNoaWZ0IG92ZXIgYXMgbmVjZXNzYXJ5IHRvIGRvZGdlIGFueSBmbG9hdHMgdGhh
dCBtaWdodCBnZXQgaW4gdGhlIHdheS4KLSAgICAgICAgaWYgKGNoaWxkLT5hdm9pZHNGbG9hdHMo
KSkgewotICAgICAgICAgICAgaW50IGxlZnRPZmYgPSBsZWZ0T2Zmc2V0KG1faGVpZ2h0KTsKLSAg
ICAgICAgICAgIGlmIChzdHlsZSgpLT50ZXh0QWxpZ24oKSAhPSBLSFRNTF9DRU5URVIgJiYgY2hp
bGQtPnN0eWxlKCktPm1hcmdpbkxlZnQoKS50eXBlICE9IEF1dG8pIHsKLSAgICAgICAgICAgICAg
ICBpZiAoY2hpbGQtPm1hcmdpbkxlZnQoKSA8IDApCi0gICAgICAgICAgICAgICAgICAgIGxlZnRP
ZmYgKz0gY2hpbGQtPm1hcmdpbkxlZnQoKTsKLSAgICAgICAgICAgICAgICBjaFBvcyA9IGtNYXgo
Y2hQb3MsIGxlZnRPZmYpOyAvLyBMZXQgdGhlIGZsb2F0IHNpdCBpbiB0aGUgY2hpbGQncyBtYXJn
aW4gaWYgaXQgY2FuIGZpdC4KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGxl
ZnRPZmYgIT0geFBvcykgewotICAgICAgICAgICAgICAgIC8vIFRoZSBvYmplY3QgaXMgc2hpZnRp
bmcgcmlnaHQuIFRoZSBvYmplY3QgbWlnaHQgYmUgY2VudGVyZWQsIHNvIHdlIG5lZWQgdG8KLSAg
ICAgICAgICAgICAgICAvLyByZWNhbGN1bGF0ZSBvdXIgaG9yaXpvbnRhbCBtYXJnaW5zLiBOb3Rl
IHRoYXQgdGhlIGNvbnRhaW5pbmcgYmxvY2sgY29udGVudAotICAgICAgICAgICAgICAgIC8vIHdp
ZHRoIGNvbXB1dGF0aW9uIHdpbGwgdGFrZSBpbnRvIGFjY291bnQgdGhlIGRlbHRhIGJldHdlZW4g
fGxlZnRPZmZ8IGFuZCB8eFBvc3wKLSAgICAgICAgICAgICAgICAvLyBzbyB0aGF0IHdlIGNhbiBq
dXN0IHBhc3MgdGhlIGNvbnRlbnQgd2lkdGggaW4gZGlyZWN0bHkgdG8gdGhlIHxjYWxjSG9yaXpv
bnRhbE1hcmdpbnN8Ci0gICAgICAgICAgICAgICAgLy8gZnVuY3Rpb24uCi0gICAgICAgICAgICAg
ICAgc3RhdGljX2Nhc3Q8UmVuZGVyQm94Kj4oY2hpbGQpLT5jYWxjSG9yaXpvbnRhbE1hcmdpbnMo
Y2hpbGQtPnN0eWxlKCktPm1hcmdpbkxlZnQoKSwgY2hpbGQtPnN0eWxlKCktPm1hcmdpblJpZ2h0
KCksIGxpbmVXaWR0aChjaGlsZC0+eVBvcygpKSk7Ci0gICAgICAgICAgICAgICAgY2hQb3MgPSBs
ZWZ0T2ZmICsgY2hpbGQtPm1hcmdpbkxlZnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQot
ICAgICAgICBjaGlsZC0+c2V0UG9zKGNoUG9zLCBjaGlsZC0+eVBvcygpKTsKLSAgICB9IGVsc2Ug
ewotICAgICAgICBpbnQgeFBvcyA9IG1fd2lkdGggLSBib3JkZXJSaWdodCgpIC0gcGFkZGluZ1Jp
Z2h0KCkgLSAoaW5jbHVkZVNjcm9sbGJhclNpemUoKSA/IG1fbGF5ZXItPnZlcnRpY2FsU2Nyb2xs
YmFyV2lkdGgoKSA6IDApOwotICAgICAgICBpbnQgY2hQb3MgPSB4UG9zIC0gKGNoaWxkLT53aWR0
aCgpICsgY2hpbGQtPm1hcmdpblJpZ2h0KCkpOwotICAgICAgICBpZiAoY2hpbGQtPmF2b2lkc0Zs
b2F0cygpKSB7Ci0gICAgICAgICAgICBpbnQgcmlnaHRPZmYgPSByaWdodE9mZnNldChtX2hlaWdo
dCk7Ci0gICAgICAgICAgICBpZiAoc3R5bGUoKS0+dGV4dEFsaWduKCkgIT0gS0hUTUxfQ0VOVEVS
ICYmIGNoaWxkLT5zdHlsZSgpLT5tYXJnaW5SaWdodCgpLnR5cGUgIT0gQXV0bykgewotICAgICAg
ICAgICAgICAgIGlmIChjaGlsZC0+bWFyZ2luUmlnaHQoKSA8IDApCi0gICAgICAgICAgICAgICAg
ICAgIHJpZ2h0T2ZmIC09IGNoaWxkLT5tYXJnaW5SaWdodCgpOwotICAgICAgICAgICAgICAgIGNo
UG9zID0ga01pbihjaFBvcywgcmlnaHRPZmYgLSBjaGlsZC0+d2lkdGgoKSk7IC8vIExldCB0aGUg
ZmxvYXQgc2l0IGluIHRoZSBjaGlsZCdzIG1hcmdpbiBpZiBpdCBjYW4gZml0LgotICAgICAgICAg
ICAgfSBlbHNlIGlmIChyaWdodE9mZiAhPSB4UG9zKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhl
IG9iamVjdCBpcyBzaGlmdGluZyBsZWZ0LiBUaGUgb2JqZWN0IG1pZ2h0IGJlIGNlbnRlcmVkLCBz
byB3ZSBuZWVkIHRvCi0gICAgICAgICAgICAgICAgLy8gcmVjYWxjdWxhdGUgb3VyIGhvcml6b250
YWwgbWFyZ2lucy4gTm90ZSB0aGF0IHRoZSBjb250YWluaW5nIGJsb2NrIGNvbnRlbnQKLSAgICAg
ICAgICAgICAgICAvLyB3aWR0aCBjb21wdXRhdGlvbiB3aWxsIHRha2UgaW50byBhY2NvdW50IHRo
ZSBkZWx0YSBiZXR3ZWVuIHxyaWdodE9mZnwgYW5kIHx4UG9zfAotICAgICAgICAgICAgICAgIC8v
IHNvIHRoYXQgd2UgY2FuIGp1c3QgcGFzcyB0aGUgY29udGVudCB3aWR0aCBpbiBkaXJlY3RseSB0
byB0aGUgfGNhbGNIb3Jpem9udGFsTWFyZ2luc3wKLSAgICAgICAgICAgICAgICAvLyBmdW5jdGlv
bi4KLSAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJCb3gqPihjaGlsZCktPmNhbGNI
b3Jpem9udGFsTWFyZ2lucyhjaGlsZC0+c3R5bGUoKS0+bWFyZ2luTGVmdCgpLCBjaGlsZC0+c3R5
bGUoKS0+bWFyZ2luUmlnaHQoKSwgbGluZVdpZHRoKGNoaWxkLT55UG9zKCkpKTsKLSAgICAgICAg
ICAgICAgICBjaFBvcyA9IHJpZ2h0T2ZmIC0gY2hpbGQtPm1hcmdpblJpZ2h0KCkgLSBjaGlsZC0+
d2lkdGgoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjaGlsZC0+c2V0UG9z
KGNoUG9zLCBjaGlsZC0+eVBvcygpKTsKLSAgICB9Ci19Ci0KLXZvaWQgUmVuZGVyQmxvY2s6OnNl
dENvbGxhcHNlZEJvdHRvbU1hcmdpbihjb25zdCBNYXJnaW5JbmZvJiBtYXJnaW5JbmZvKQotewot
ICAgIGlmIChtYXJnaW5JbmZvLmNhbkNvbGxhcHNlV2l0aEJvdHRvbSgpICYmICFtYXJnaW5JbmZv
LmNhbkNvbGxhcHNlV2l0aFRvcCgpKSB7Ci0gICAgICAgIC8vIFVwZGF0ZSBvdXIgbWF4IHBvcy9u
ZWcgYm90dG9tIG1hcmdpbnMsIHNpbmNlIHdlIGNvbGxhcHNlZCBvdXIgYm90dG9tIG1hcmdpbnMK
LSAgICAgICAgLy8gd2l0aCBvdXIgY2hpbGRyZW4uCi0gICAgICAgIG1fbWF4Qm90dG9tUG9zTWFy
Z2luID0ga01heChtX21heEJvdHRvbVBvc01hcmdpbiwgbWFyZ2luSW5mby5wb3NNYXJnaW4oKSk7
Ci0gICAgICAgIG1fbWF4Qm90dG9tTmVnTWFyZ2luID0ga01heChtX21heEJvdHRvbU5lZ01hcmdp
biwgbWFyZ2luSW5mby5uZWdNYXJnaW4oKSk7Ci0KLSAgICAgICAgaWYgKCFtYXJnaW5JbmZvLmJv
dHRvbVF1aXJrKCkpCi0gICAgICAgICAgICBtX2JvdHRvbU1hcmdpblF1aXJrID0gZmFsc2U7Ci0K
LSAgICAgICAgaWYgKG1hcmdpbkluZm8uYm90dG9tUXVpcmsoKSAmJiBtYXJnaW5Cb3R0b20oKSA9
PSAwKQotICAgICAgICAgICAgLy8gV2UgaGF2ZSBubyBib3R0b20gbWFyZ2luIGFuZCBvdXIgbGFz
dCBjaGlsZCBoYXMgYSBxdWlya3kgbWFyZ2luLgotICAgICAgICAgICAgLy8gV2Ugd2lsbCBwaWNr
IHVwIHRoaXMgcXVpcmt5IG1hcmdpbiBhbmQgcGFzcyBpdCB0aHJvdWdoLgotICAgICAgICAgICAg
Ly8gVGhpcyBkZWFscyB3aXRoIHRoZSA8dGQ+PGRpdj48cD4gY2FzZS4KLSAgICAgICAgICAgIG1f
Ym90dG9tTWFyZ2luUXVpcmsgPSB0cnVlOwotICAgIH0KLX0KLQotdm9pZCBSZW5kZXJCbG9jazo6
aGFuZGxlQm90dG9tT2ZCbG9jayhpbnQgdG9wLCBpbnQgYm90dG9tLCBNYXJnaW5JbmZvJiBtYXJn
aW5JbmZvKQotewotICAgICAvLyBJZiBvdXIgbGFzdCBmbG93IHdhcyBhIHNlbGYtY29sbGFwc2lu
ZyBibG9jayB0aGF0IGNsZWFyZWQgYSBmbG9hdCwgdGhlbiB3ZSBkb24ndAotICAgIC8vIGNvbGxh
cHNlIGl0IHdpdGggdGhlIGJvdHRvbSBvZiB0aGUgYmxvY2suCi0gICAgaWYgKCFtYXJnaW5JbmZv
LnNlbGZDb2xsYXBzaW5nQmxvY2tDbGVhcmVkRmxvYXQoKSkKLSAgICAgICAgbWFyZ2luSW5mby5z
ZXRBdEJvdHRvbU9mQmxvY2sodHJ1ZSk7Ci0KLSAgICAvLyBJZiB3ZSBjYW4ndCBjb2xsYXBzZSB3
aXRoIGNoaWxkcmVuIHRoZW4gZ28gYWhlYWQgYW5kIGFkZCBpbiB0aGUgYm90dG9tIG1hcmdpbi4K
LSAgICBpZiAoIW1hcmdpbkluZm8uY2FuQ29sbGFwc2VXaXRoQm90dG9tKCkgJiYgIW1hcmdpbklu
Zm8uY2FuQ29sbGFwc2VXaXRoVG9wKCkKLSAgICAgICAgJiYgKCFzdHlsZSgpLT5odG1sSGFja3Mo
KSB8fCAhbWFyZ2luSW5mby5xdWlya0NvbnRhaW5lcigpIHx8ICFtYXJnaW5JbmZvLmJvdHRvbVF1
aXJrKCkpKQotICAgICAgICBtX2hlaWdodCArPSBtYXJnaW5JbmZvLm1hcmdpbigpOwotICAgICAg
ICAKLSAgICAvLyBOb3cgYWRkIGluIG91ciBib3R0b20gYm9yZGVyL3BhZGRpbmcuCi0gICAgbV9o
ZWlnaHQgKz0gYm90dG9tOwotCi0gICAgLy8gTmVnYXRpdmUgbWFyZ2lucyBjYW4gY2F1c2Ugb3Vy
IGhlaWdodCB0byBzaHJpbmsgYmVsb3cgb3VyIG1pbmltYWwgaGVpZ2h0IChib3JkZXIvcGFkZGlu
ZykuCi0gICAgLy8gSWYgdGhpcyBoYXBwZW5zLCBlbnN1cmUgdGhhdCB0aGUgY29tcHV0ZWQgaGVp
Z2h0IGlzIGluY3JlYXNlZCB0byB0aGUgbWluaW1hbCBoZWlnaHQuCi0gICAgbV9oZWlnaHQgPSBr
TWF4KG1faGVpZ2h0LCB0b3AgKyBib3R0b20pOwotCi0gICAgLy8gQWx3YXlzIG1ha2Ugc3VyZSBv
dXIgb3ZlcmZsb3cgaGVpZ2h0IGlzIGF0IGxlYXN0IG91ciBoZWlnaHQuCi0gICAgbV9vdmVyZmxv
d0hlaWdodCA9IGtNYXgobV9oZWlnaHQsIG1fb3ZlcmZsb3dIZWlnaHQpOwotCi0gICAgLy8gVXBk
YXRlIG91ciBib3R0b20gY29sbGFwc2VkIG1hcmdpbiBpbmZvLgotICAgIHNldENvbGxhcHNlZEJv
dHRvbU1hcmdpbihtYXJnaW5JbmZvKTsKLX0KLQotdm9pZCBSZW5kZXJCbG9jazo6bGF5b3V0Qmxv
Y2tDaGlsZHJlbihib29sIHJlbGF5b3V0Q2hpbGRyZW4pCi17Ci0gICAgaW50IHRvcCA9IGJvcmRl
clRvcCgpICsgcGFkZGluZ1RvcCgpOwotICAgIGludCBib3R0b20gPSBib3JkZXJCb3R0b20oKSAr
IHBhZGRpbmdCb3R0b20oKSArIChpbmNsdWRlU2Nyb2xsYmFyU2l6ZSgpID8gbV9sYXllci0+aG9y
aXpvbnRhbFNjcm9sbGJhckhlaWdodCgpIDogMCk7Ci0KLSAgICBtX2hlaWdodCA9IG1fb3ZlcmZs
b3dIZWlnaHQgPSB0b3A7Ci0KLSAgICAvLyBUaGUgbWFyZ2luIHN0cnVjdCBjYWNoZXMgYWxsIG91
ciBjdXJyZW50IG1hcmdpbiBjb2xsYXBzaW5nIHN0YXRlLiAgVGhlIGNvbXBhY3Qgc3RydWN0IGNh
Y2hlcyBzdGF0ZSB3aGVuIHdlIGVuY291bnRlciBjb21wYWN0cywKLSAgICBNYXJnaW5JbmZvIG1h
cmdpbkluZm8odGhpcywgdG9wLCBib3R0b20pOwotICAgIENvbXBhY3RJbmZvIGNvbXBhY3RJbmZv
OwotCi0gICAgLy8gRmllbGRzZXRzIG5lZWQgdG8gZmluZCB0aGVpciBsZWdlbmQgYW5kIHBvc2l0
aW9uIGl0IGluc2lkZSB0aGUgYm9yZGVyIG9mIHRoZSBvYmplY3QuCi0gICAgLy8gVGhlIGxlZ2Vu
ZCB0aGVuIGdldHMgc2tpcHBlZCBkdXJpbmcgbm9ybWFsIGxheW91dC4KLSAgICBSZW5kZXJPYmpl
Y3QqIGxlZ2VuZCA9IGxheW91dExlZ2VuZChyZWxheW91dENoaWxkcmVuKTsKLQotICAgIFJlbmRl
ck9iamVjdCogY2hpbGQgPSBmaXJzdENoaWxkKCk7Ci0gICAgd2hpbGUgKGNoaWxkKSB7Ci0gICAg
ICAgIGlmIChsZWdlbmQgPT0gY2hpbGQpIHsKLSAgICAgICAgICAgIGNoaWxkID0gY2hpbGQtPm5l
eHRTaWJsaW5nKCk7Ci0gICAgICAgICAgICBjb250aW51ZTsgLy8gU2tpcCB0aGUgbGVnZW5kLCBz
aW5jZSBpdCBoYXMgYWxyZWFkeSBiZWVuIHBvc2l0aW9uZWQgdXAgaW4gdGhlIGZpZWxkc2V0J3Mg
Ym9yZGVyLgotICAgICAgICB9Ci0KLSAgICAgICAgaW50IG9sZFRvcFBvc01hcmdpbiA9IG1fbWF4
VG9wUG9zTWFyZ2luOwotICAgICAgICBpbnQgb2xkVG9wTmVnTWFyZ2luID0gbV9tYXhUb3BOZWdN
YXJnaW47Ci0KLSAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGxheW91dCBjaGlsZHJlbiBpZiB0aGV5
IG5lZWQgaXQuCi0gICAgICAgIC8vIEZJWE1FOiBUZWNobmljYWxseSBwZXJjZW50YWdlIGhlaWdo
dCBvYmplY3RzIG9ubHkgbmVlZCBhIHJlbGF5b3V0IGlmIHRoZWlyIHBlcmNlbnRhZ2UgaXNuJ3Qg
Z29pbmcgdG8gYmUgdHVybmVkIGludG8KLSAgICAgICAgLy8gYW4gYXV0byB2YWx1ZS4gIEFkZCBh
IG1ldGhvZCB0byBkZXRlcm1pbmUgdGhpcywgc28gdGhhdCB3ZSBjYW4gYXZvaWQgdGhlIHJlbGF5
b3V0LgotICAgICAgICBpZiAocmVsYXlvdXRDaGlsZHJlbiB8fCBjaGlsZC0+c3R5bGUoKS0+aGVp
Z2h0KCkuaXNQZXJjZW50KCkpCi0gICAgICAgICAgICBjaGlsZC0+c2V0Q2hpbGROZWVkc0xheW91
dCh0cnVlKTsKLQotICAgICAgICAvLyBIYW5kbGUgdGhlIGZvdXIgdHlwZXMgb2Ygc3BlY2lhbCBl
bGVtZW50cyBmaXJzdC4gIFRoZXNlIGluY2x1ZGUgcG9zaXRpb25lZCBjb250ZW50LCBmbG9hdGlu
ZyBjb250ZW50LCBjb21wYWN0cyBhbmQKLSAgICAgICAgLy8gcnVuLWlucy4gIFdoZW4gd2UgZW5j
b3VudGVyIHRoZXNlIGZvdXIgdHlwZXMgb2Ygb2JqZWN0cywgd2UgZG9uJ3QgYWN0dWFsbHkgbGF5
IHRoZW0gb3V0IGFzIG5vcm1hbCBmbG93IGJsb2Nrcy4KLSAgICAgICAgYm9vbCBoYW5kbGVkID0g
ZmFsc2U7Ci0gICAgICAgIFJlbmRlck9iamVjdCogbmV4dCA9IGhhbmRsZVNwZWNpYWxDaGlsZChj
aGlsZCwgbWFyZ2luSW5mbywgY29tcGFjdEluZm8sIGhhbmRsZWQpOwotICAgICAgICBpZiAoaGFu
ZGxlZCkgeyBjaGlsZCA9IG5leHQ7IGNvbnRpbnVlOyB9Ci0KLSAgICAgICAgLy8gVGhlIGNoaWxk
IGlzIGEgbm9ybWFsIGZsb3cgb2JqZWN0LiAgQ29tcHV0ZSBpdHMgdmVydGljYWwgbWFyZ2lucyBu
b3cuCi0gICAgICAgIGNoaWxkLT5jYWxjVmVydGljYWxNYXJnaW5zKCk7Ci0KLSAgICAgICAgLy8g
RG8gbm90IGFsbG93IGEgY29sbGFwc2UgaWYgdGhlIG1hcmdpbiB0b3AgY29sbGFwc2Ugc3R5bGUg
aXMgc2V0IHRvIFNFUEFSQVRFLgotICAgICAgICBpZiAoY2hpbGQtPnN0eWxlKCktPm1hcmdpblRv
cENvbGxhcHNlKCkgPT0gTVNFUEFSQVRFKSB7Ci0gICAgICAgICAgICBtYXJnaW5JbmZvLnNldEF0
VG9wT2ZCbG9jayhmYWxzZSk7Ci0gICAgICAgICAgICBtYXJnaW5JbmZvLmNsZWFyTWFyZ2luKCk7
Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUcnkgdG8gZ3Vlc3Mgb3VyIGNvcnJlY3QgeSBwb3Np
dGlvbi4gIEluIG1vc3QgY2FzZXMgdGhpcyBndWVzcyB3aWxsCi0gICAgICAgIC8vIGJlIGNvcnJl
Y3QuICBPbmx5IGlmIHdlJ3JlIHdyb25nICh3aGVuIHdlIGNvbXB1dGUgdGhlIHJlYWwgeSBwb3Np
dGlvbikKLSAgICAgICAgLy8gd2lsbCB3ZSBoYXZlIHRvIHBvdGVudGlhbGx5IHJlbGF5b3V0Lgot
ICAgICAgICBpbnQgeVBvc0VzdGltYXRlID0gZXN0aW1hdGVWZXJ0aWNhbFBvc2l0aW9uKGNoaWxk
LCBtYXJnaW5JbmZvKTsKLSAgICAgICAgCi0gICAgICAgIC8vIElmIGFuIGVsZW1lbnQgbWlnaHQg
YmUgYWZmZWN0ZWQgYnkgdGhlIHByZXNlbmNlIG9mIGZsb2F0cywgdGhlbiBhbHdheXMgbWFyayBp
dCBmb3IKLSAgICAgICAgLy8gbGF5b3V0LgotICAgICAgICBpZiAoIWNoaWxkLT5hdm9pZHNGbG9h
dHMoKSB8fCBjaGlsZC0+dXNlc0xpbmVXaWR0aCgpKSB7Ci0gICAgICAgICAgICBpbnQgZmIgPSBm
bG9hdEJvdHRvbSgpOwotICAgICAgICAgICAgaWYgKGZiID4gbV9oZWlnaHQgfHwgZmIgPiB5UG9z
RXN0aW1hdGUpCi0gICAgICAgICAgICAgICAgY2hpbGQtPnNldENoaWxkTmVlZHNMYXlvdXQodHJ1
ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDYWNoZSBvdXIgb2xkIHBvc2l0aW9uIHNvIHRo
YXQgd2UgY2FuIGRpcnR5IHRoZSBwcm9wZXIgcmVwYWludCByZWN0cyBpZiB0aGUgY2hpbGQgbW92
ZXMuCi0gICAgICAgIGludCBvbGRDaGlsZFggPSBjaGlsZC0+eFBvcygpOwotICAgICAgICBpbnQg
b2xkQ2hpbGRZID0gY2hpbGQtPnlQb3MoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEdvIGFoZWFk
IGFuZCBwb3NpdGlvbiB0aGUgY2hpbGQgYXMgdGhvdWdoIGl0IGRpZG4ndCBjb2xsYXBzZSB3aXRo
IHRoZSB0b3AuCi0gICAgICAgIGNoaWxkLT5zZXRQb3MoY2hpbGQtPnhQb3MoKSwgeVBvc0VzdGlt
YXRlKTsKLSAgICAgICAgY2hpbGQtPmxheW91dElmTmVlZGVkKCk7Ci0KLSAgICAgICAgLy8gTm93
IGRldGVybWluZSB0aGUgY29ycmVjdCB5cG9zIGJhc2VkIG9mZiBleGFtaW5hdGlvbiBvZiBjb2xs
YXBzaW5nIG1hcmdpbgotICAgICAgICAvLyB2YWx1ZXMuCi0gICAgICAgIGNvbGxhcHNlTWFyZ2lu
cyhjaGlsZCwgbWFyZ2luSW5mbywgeVBvc0VzdGltYXRlKTsKLQotICAgICAgICAvLyBOb3cgY2hl
Y2sgZm9yIGNsZWFyLgotICAgICAgICBjbGVhckZsb2F0c0lmTmVlZGVkKGNoaWxkLCBtYXJnaW5J
bmZvLCBvbGRUb3BQb3NNYXJnaW4sIG9sZFRvcE5lZ01hcmdpbik7Ci0KLSAgICAgICAgLy8gV2Ug
YXJlIG5vIGxvbmdlciBhdCB0aGUgdG9wIG9mIHRoZSBibG9jayBpZiB3ZSBlbmNvdW50ZXIgYSBu
b24tZW1wdHkgY2hpbGQuICAKLSAgICAgICAgLy8gVGhpcyBoYXMgdG8gYmUgZG9uZSBhZnRlciBj
aGVja2luZyBmb3IgY2xlYXIsIHNvIHRoYXQgbWFyZ2lucyBjYW4gYmUgcmVzZXQgaWYgYSBjbGVh
ciBvY2N1cnJlZC4KLSAgICAgICAgaWYgKG1hcmdpbkluZm8uYXRUb3BPZkJsb2NrKCkgJiYgIWNo
aWxkLT5pc1NlbGZDb2xsYXBzaW5nQmxvY2soKSkKLSAgICAgICAgICAgIG1hcmdpbkluZm8uc2V0
QXRUb3BPZkJsb2NrKGZhbHNlKTsKLQotICAgICAgICAvLyBOb3cgcGxhY2UgdGhlIGNoaWxkIGlu
IHRoZSBjb3JyZWN0IGhvcml6b250YWwgcG9zaXRpb24KLSAgICAgICAgZGV0ZXJtaW5lSG9yaXpv
bnRhbFBvc2l0aW9uKGNoaWxkKTsKLQotICAgICAgICAvLyBVcGRhdGUgb3VyIHRvcCBvdmVyZmxv
dyBpbiBjYXNlIHRoZSBjaGlsZCBzcGlsbHMgb3V0IHRoZSB0b3Agb2YgdGhlIGJsb2NrLgotICAg
ICAgICBtX292ZXJmbG93VG9wID0ga01pbihtX292ZXJmbG93VG9wLCBjaGlsZC0+eVBvcygpICsg
Y2hpbGQtPm92ZXJmbG93VG9wKGZhbHNlKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBVcGRhdGUg
b3VyIGhlaWdodCBub3cgdGhhdCB0aGUgY2hpbGQgaGFzIGJlZW4gcGxhY2VkIGluIHRoZSBjb3Jy
ZWN0IHBvc2l0aW9uLgotICAgICAgICBtX2hlaWdodCArPSBjaGlsZC0+aGVpZ2h0KCk7Ci0gICAg
ICAgIGlmIChjaGlsZC0+c3R5bGUoKS0+bWFyZ2luQm90dG9tQ29sbGFwc2UoKSA9PSBNU0VQQVJB
VEUpIHsKLSAgICAgICAgICAgIG1faGVpZ2h0ICs9IGNoaWxkLT5tYXJnaW5Cb3R0b20oKTsKLSAg
ICAgICAgICAgIG1hcmdpbkluZm8uY2xlYXJNYXJnaW4oKTsKLSAgICAgICAgfQotICAgICAgICBp
bnQgb3ZlcmZsb3dEZWx0YSA9IGNoaWxkLT5vdmVyZmxvd0hlaWdodChmYWxzZSkgLSBjaGlsZC0+
aGVpZ2h0KCk7Ci0gICAgICAgIGlmIChtX2hlaWdodCArIG92ZXJmbG93RGVsdGEgPiBtX292ZXJm
bG93SGVpZ2h0KQotICAgICAgICAgICAgbV9vdmVyZmxvd0hlaWdodCA9IG1faGVpZ2h0ICsgb3Zl
cmZsb3dEZWx0YTsKLQotICAgICAgICAvLyBJZiB0aGUgY2hpbGQgaGFzIG92ZXJoYW5naW5nIGZs
b2F0cyB0aGF0IGludHJ1ZGUgaW50byBmb2xsb3dpbmcgc2libGluZ3MgKG9yIHBvc3NpYmx5IG91
dAotICAgICAgICAvLyBvZiB0aGlzIGJsb2NrKSwgdGhlbiB0aGUgcGFyZW50IGdldHMgbm90aWZp
ZWQgb2YgdGhlIGZsb2F0cyBub3cuCi0gICAgICAgIGFkZE92ZXJoYW5naW5nRmxvYXRzKHN0YXRp
Y19jYXN0PFJlbmRlckJsb2NrICo+KGNoaWxkKSwgLWNoaWxkLT54UG9zKCksIC1jaGlsZC0+eVBv
cygpKTsKLQotICAgICAgICAvLyBTZWUgaWYgdGhpcyBjaGlsZCBoYXMgbWFkZSBvdXIgb3ZlcmZs
b3cgbmVlZCB0byBncm93LgotICAgICAgICBpbnQgcmlnaHRDaGlsZFBvcyA9IGNoaWxkLT54UG9z
KCkgKyBrTWF4KGNoaWxkLT5vdmVyZmxvd1dpZHRoKGZhbHNlKSwgY2hpbGQtPndpZHRoKCkpOwot
ICAgICAgICBtX292ZXJmbG93V2lkdGggPSBrTWF4KHJpZ2h0Q2hpbGRQb3MsIG1fb3ZlcmZsb3dX
aWR0aCk7Ci0gICAgICAgIG1fb3ZlcmZsb3dMZWZ0ID0ga01pbihjaGlsZC0+eFBvcygpICsgY2hp
bGQtPm92ZXJmbG93TGVmdChmYWxzZSksIG1fb3ZlcmZsb3dMZWZ0KTsKLSAgICAgICAgCi0gICAg
ICAgIC8vIEluc2VydCBvdXIgY29tcGFjdCBpbnRvIHRoZSBibG9jayBtYXJnaW4gaWYgd2UgaGF2
ZSBvbmUuCi0gICAgICAgIGluc2VydENvbXBhY3RJZk5lZWRlZChjaGlsZCwgY29tcGFjdEluZm8p
OwotCi0gICAgICAgIC8vIElmIHRoZSBjaGlsZCBtb3ZlZCwgd2UgaGF2ZSB0byByZXBhaW50IGl0
IGFzIHdlbGwgYXMgYW55IGZsb2F0aW5nL3Bvc2l0aW9uZWQKLSAgICAgICAgLy8gZGVzY2VuZGFu
dHMuICBBbiBleGNlcHRpb24gaXMgaWYgd2UgbmVlZCBhIGxheW91dC4gIEluIHRoaXMgY2FzZSwg
d2Uga25vdyB3ZSdyZSBnb2luZyB0bwotICAgICAgICAvLyByZXBhaW50IG91cnNlbHZlcyAoYW5k
IHRoZSBjaGlsZCkgYW55d2F5LgotICAgICAgICBpZiAoIXNlbGZOZWVkc0xheW91dCgpICYmIGNo
aWxkLT5jaGVja0ZvclJlcGFpbnREdXJpbmdMYXlvdXQoKSkKLSAgICAgICAgICAgIGNoaWxkLT5y
ZXBhaW50RHVyaW5nTGF5b3V0SWZNb3ZlZChvbGRDaGlsZFgsIG9sZENoaWxkWSk7Ci0KLSAgICAg
ICAgY2hpbGQgPSBjaGlsZC0+bmV4dFNpYmxpbmcoKTsKLSAgICB9Ci0KLSAgICAvLyBOb3cgZG8g
dGhlIGhhbmRsaW5nIG9mIHRoZSBib3R0b20gb2YgdGhlIGJsb2NrLCBhZGRpbmcgaW4gb3VyIGJv
dHRvbSBib3JkZXIvcGFkZGluZyBhbmQKLSAgICAvLyBkZXRlcm1pbmluZyB0aGUgY29ycmVjdCBj
b2xsYXBzZWQgYm90dG9tIG1hcmdpbiBpbmZvcm1hdGlvbi4KLSAgICBoYW5kbGVCb3R0b21PZkJs
b2NrKHRvcCwgYm90dG9tLCBtYXJnaW5JbmZvKTsKLQotICAgIC8vIEZpbmlzaGVkLiBDbGVhciB0
aGUgZGlydHkgbGF5b3V0IGJpdHMuCi0gICAgc2V0TmVlZHNMYXlvdXQoZmFsc2UpOwotfQotCi12
b2lkIFJlbmRlckJsb2NrOjpsYXlvdXRQb3NpdGlvbmVkT2JqZWN0cyhib29sIHJlbGF5b3V0Q2hp
bGRyZW4pCi17Ci0gICAgaWYgKG1fcG9zaXRpb25lZE9iamVjdHMpIHsKLSAgICAgICAgLy9rZERl
YnVnKCA2MDQwICkgPDwgcmVuZGVyTmFtZSgpIDw8ICIgIiA8PCB0aGlzIDw8ICI6OmxheW91dFBv
c2l0aW9uZWRPYmplY3RzKCkgc3RhcnQiIDw8IGVuZGw7Ci0gICAgICAgIFJlbmRlck9iamVjdCog
cjsKLSAgICAgICAgUVB0ckxpc3RJdGVyYXRvcjxSZW5kZXJPYmplY3Q+IGl0KCptX3Bvc2l0aW9u
ZWRPYmplY3RzKTsKLSAgICAgICAgZm9yICggOyAociA9IGl0LmN1cnJlbnQoKSk7ICsraXQgKSB7
Ci0gICAgICAgICAgICAvLyBXaGVuIGEgbm9uLXBvc2l0aW9uZWQgYmxvY2sgZWxlbWVudCBtb3Zl
cywgaXQgbWF5IGhhdmUgcG9zaXRpb25lZCBjaGlsZHJlbiB0aGF0IGFyZSBpbXBsaWNpdGx5IHBv
c2l0aW9uZWQgcmVsYXRpdmUgdG8gdGhlCi0gICAgICAgICAgICAvLyBub24tcG9zaXRpb25lZCBi
bG9jay4gIFJhdGhlciB0aGFuIHRyeWluZyB0byBkZXRlY3QgYWxsIG9mIHRoZXNlIG1vdmVtZW50
IGNhc2VzLCB3ZSBqdXN0IGFsd2F5cyBsYXkgb3V0IHBvc2l0aW9uZWQKLSAgICAgICAgICAgIC8v
IG9iamVjdHMgdGhhdCBhcmUgcG9zaXRpb25lZCBpbXBsaWNpdGx5IGxpa2UgdGhpcy4gIFN1Y2gg
b2JqZWN0cyBhcmUgcmFyZSwgYW5kIHNvIGluIHR5cGljYWwgREhUTUwgbWVudSB1c2FnZSAod2hl
cmUgZXZlcnl0aGluZyBpcwotICAgICAgICAgICAgLy8gcG9zaXRpb25lZCBleHBsaWNpdGx5KSB0
aGlzIHNob3VsZCBub3QgaW5jdXIgYSBwZXJmb3JtYW5jZSBwZW5hbHR5LgotICAgICAgICAgICAg
aWYgKHJlbGF5b3V0Q2hpbGRyZW4gfHwgKHItPmhhc1N0YXRpY1koKSAmJiByLT5wYXJlbnQoKSAh
PSB0aGlzICYmIHItPnBhcmVudCgpLT5pc0Jsb2NrRmxvdygpKSkKLSAgICAgICAgICAgICAgICBy
LT5zZXRDaGlsZE5lZWRzTGF5b3V0KHRydWUpOwotICAgICAgICAgICAgci0+bGF5b3V0SWZOZWVk
ZWQoKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBSZW5kZXJCbG9jazo6bWFya1Bvc2l0
aW9uZWRPYmplY3RzRm9yTGF5b3V0KCkKLXsKLSAgICBpZiAobV9wb3NpdGlvbmVkT2JqZWN0cykg
ewotICAgICAgICBSZW5kZXJPYmplY3QqIHI7Ci0gICAgICAgIFFQdHJMaXN0SXRlcmF0b3I8UmVu
ZGVyT2JqZWN0PiBpdCgqbV9wb3NpdGlvbmVkT2JqZWN0cyk7Ci0gICAgICAgIGZvciAoOyAociA9
IGl0LmN1cnJlbnQoKSk7ICsraXQpCi0gICAgICAgICAgICByLT5zZXRDaGlsZE5lZWRzTGF5b3V0
KHRydWUpOwotICAgIH0KLX0KLQotdm9pZCBSZW5kZXJCbG9jazo6Z2V0QWJzb2x1dGVSZXBhaW50
UmVjdEluY2x1ZGluZ0Zsb2F0cyhJbnRSZWN0JiBib3VuZHMsIEludFJlY3QmIGZ1bGxCb3VuZHMp
Ci17Ci0gICAgYm91bmRzID0gZnVsbEJvdW5kcyA9IGdldEFic29sdXRlUmVwYWludFJlY3QoKTsK
LQotICAgIC8vIEluY2x1ZGUgYW55IG92ZXJoYW5naW5nIGZsb2F0cyAoaWYgd2Uga25vdyB3ZSdy
ZSB0aGUgb25lIHRvIHBhaW50IHRoZW0pLgotICAgIC8vIFdlIG51bGwtY2hlY2sgbV9mbG9hdGlu
Z09iamVjdHMgaGVyZSB0byBjYXRjaCBhbnkgY2FzZXMgd2hlcmUgbV9oZWlnaHQgZW5kcyB1cCBu
ZWdhdGl2ZQotICAgIC8vIGZvciBzb21lIHJlYXNvbi4gIEkgdGhpbmsgSSd2ZSBjYXVnaHQgYWxs
IHRob3NlIGNhc2VzLCBidXQgdGhpcyB3YXkgd2Ugc3RheSByb2J1c3QgYW5kIGRvbid0Ci0gICAg
Ly8gY3Jhc2guCi0gICAgaWYgKGhhc092ZXJoYW5naW5nRmxvYXRzKCkgJiYgbV9mbG9hdGluZ09i
amVjdHMpIHsKLSAgICAgICAgRmxvYXRpbmdPYmplY3QqIHI7Ci0gICAgICAgIFFQdHJMaXN0SXRl
cmF0b3I8RmxvYXRpbmdPYmplY3Q+IGl0KCptX2Zsb2F0aW5nT2JqZWN0cyk7Ci0gICAgICAgIGZv
ciAoIDsgKHIgPSBpdC5jdXJyZW50KCkpOyArK2l0KSB7Ci0gICAgICAgICAgICAvLyBPbmx5IHJl
cGFpbnQgdGhlIG9iamVjdCBpZiBvdXIgbm9QYWludCBmbGFnIGlzbid0IHNldCBhbmQgaWYgaXQg
aXNuJ3QgaW4KLSAgICAgICAgICAgIC8vIGl0cyBvd24gbGF5ZXIuCi0gICAgICAgICAgICBpZiAo
IXItPm5vUGFpbnQgJiYgIXItPm5vZGUtPmxheWVyKCkpIHsKLSAgICAgICAgICAgICAgICBJbnRS
ZWN0IGNoaWxkUmVjdCwgY2hpbGRGdWxsUmVjdDsKLSAgICAgICAgICAgICAgICByLT5ub2RlLT5n
ZXRBYnNvbHV0ZVJlcGFpbnRSZWN0SW5jbHVkaW5nRmxvYXRzKGNoaWxkUmVjdCwgY2hpbGRGdWxs
UmVjdCk7Ci0gICAgICAgICAgICAgICAgZnVsbEJvdW5kcyA9IGZ1bGxCb3VuZHMudW5pdGUoY2hp
bGRGdWxsUmVjdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQg
UmVuZGVyQmxvY2s6OnJlcGFpbnRGbG9hdGluZ0Rlc2NlbmRhbnRzKCkKLXsKLSAgICAvLyBSZXBh
aW50IGFueSBvdmVyaGFuZ2luZyBmbG9hdHMgKGlmIHdlIGtub3cgd2UncmUgdGhlIG9uZSB0byBw
YWludCB0aGVtKS4KLSAgICBpZiAoaGFzT3ZlcmhhbmdpbmdGbG9hdHMoKSkgewotICAgICAgICBG
bG9hdGluZ09iamVjdCogcjsKLSAgICAgICAgUVB0ckxpc3RJdGVyYXRvcjxGbG9hdGluZ09iamVj
dD4gaXQoKm1fZmxvYXRpbmdPYmplY3RzKTsKLSAgICAgICAgZm9yICggOyAociA9IGl0LmN1cnJl
bnQoKSk7ICsraXQpIHsKLSAgICAgICAgICAgIC8vIE9ubHkgcmVwYWludCB0aGUgb2JqZWN0IGlm
IG91ciBub1BhaW50IGZsYWcgaXNuJ3Qgc2V0IGFuZCBpZiBpdCBpc24ndCBpbgotICAgICAgICAg
ICAgLy8gaXRzIG93biBsYXllci4KLSAgICAgICAgICAgIGlmICghci0+bm9QYWludCAmJiAhci0+
bm9kZS0+bGF5ZXIoKSkgeyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICByLT5ub2Rl
LT5yZXBhaW50KCk7Ci0gICAgICAgICAgICAgICAgci0+bm9kZS0+cmVwYWludEZsb2F0aW5nRGVz
Y2VuZGFudHMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBS
ZW5kZXJCbG9jazo6cmVwYWludE9iamVjdHNCZWZvcmVMYXlvdXQoKQotewotICAgIFJlbmRlckZs
b3c6OnJlcGFpbnRPYmplY3RzQmVmb3JlTGF5b3V0KCk7Ci0gICAgaWYgKCFuZWVkc0xheW91dCgp
KQotICAgICAgICByZXR1cm47Ci0KLSAgICAvLyBXYWxrIG91ciBwb3NpdGlvbmVkIG9iamVjdHMu
Ci0gICAgaWYgKG1fcG9zaXRpb25lZE9iamVjdHMpIHsKLSAgICAgICAgUmVuZGVyT2JqZWN0KiBy
OwotICAgICAgICBRUHRyTGlzdEl0ZXJhdG9yPFJlbmRlck9iamVjdD4gaXQoKm1fcG9zaXRpb25l
ZE9iamVjdHMpOwotICAgICAgICBmb3IgKCA7IChyID0gaXQuY3VycmVudCgpKTsgKytpdCApCi0g
ICAgICAgICAgICByLT5yZXBhaW50T2JqZWN0c0JlZm9yZUxheW91dCgpOwotICAgIH0KLX0KLQot
dm9pZCBSZW5kZXJCbG9jazo6cGFpbnQoUGFpbnRJbmZvJiBpLCBpbnQgX3R4LCBpbnQgX3R5KQot
ewotICAgIF90eCArPSBtX3g7Ci0gICAgX3R5ICs9IG1feTsKLQotICAgIC8vIENoZWNrIGlmIHdl
IG5lZWQgdG8gZG8gYW55dGhpbmcgYXQgYWxsLgotICAgIGlmICghaXNJbmxpbmVGbG93KCkgJiYg
IWlzUm9vdCgpKSB7Ci0gICAgICAgIEludFJlY3Qgb3ZlcmZsb3dCb3ggPSBvdmVyZmxvd1JlY3Qo
ZmFsc2UpOwotICAgICAgICBvdmVyZmxvd0JveC5pbmZsYXRlKG1heGltYWxPdXRsaW5lU2l6ZShp
LnBoYXNlKSk7Ci0gICAgICAgIG92ZXJmbG93Qm94LnNldFgob3ZlcmZsb3dCb3gueCgpICsgX3R4
KTsKLSAgICAgICAgb3ZlcmZsb3dCb3guc2V0WShvdmVyZmxvd0JveC55KCkgKyBfdHkpOwotICAg
ICAgICBib29sIGludGVyc2VjdHNPdmVyZmxvd0JveCA9IG92ZXJmbG93Qm94LmludGVyc2VjdHMo
aS5yKTsKLSAgICAgICAgaWYgKCFpbnRlcnNlY3RzT3ZlcmZsb3dCb3gpIHsKLSAgICAgICAgICAg
IC8vIENoZWNrIGZsb2F0cyBuZXh0LgotICAgICAgICAgICAgaWYgKGkucGhhc2UgIT0gUGFpbnRB
Y3Rpb25GbG9hdCkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBJbnRSZWN0
IGZsb2F0Qm94ID0gZmxvYXRSZWN0KCk7Ci0gICAgICAgICAgICBmbG9hdEJveC5pbmZsYXRlKG1h
eGltYWxPdXRsaW5lU2l6ZShpLnBoYXNlKSk7Ci0gICAgICAgICAgICBmbG9hdEJveC5zZXRYKGZs
b2F0Qm94LngoKSArIF90eCk7Ci0gICAgICAgICAgICBmbG9hdEJveC5zZXRZKGZsb2F0Qm94Lnko
KSArIF90eSk7Ci0gICAgICAgICAgICBpZiAoIWZsb2F0Qm94LmludGVyc2VjdHMoaS5yKSkKLSAg
ICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcGFp
bnRPYmplY3QoaSwgX3R4LCBfdHkpOwotfQotCi12b2lkIFJlbmRlckJsb2NrOjpwYWludENoaWxk
cmVuKFBhaW50SW5mbyYgaSwgaW50IF90eCwgaW50IF90eSkKLXsKLSAgICAvLyBXZSBkb24ndCBw
YWludCBvdXIgb3duIGJhY2tncm91bmQsIGJ1dCB3ZSBkbyBsZXQgdGhlIGtpZHMgcGFpbnQgdGhl
aXIgYmFja2dyb3VuZHMuCi0gICAgUGFpbnRJbmZvIHBhaW50SW5mbyhpLnAsIGkuciwgaS5waGFz
ZSA9PSBQYWludEFjdGlvbkNoaWxkQmxvY2tCYWNrZ3JvdW5kcyA/IFBhaW50QWN0aW9uQ2hpbGRC
bG9ja0JhY2tncm91bmQgOiBpLnBoYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgcGFpbnRp
bmdSb290Rm9yQ2hpbGRyZW4oaSkpOwotICAgIGJvb2wgaXNQcmludGluZyA9IChpLnAtPmRldmlj
ZSgpLT5kZXZUeXBlKCkgPT0gUUludGVybmFsOjpQcmludGVyKTsKLQotICAgIGZvciAoUmVuZGVy
T2JqZWN0ICpjaGlsZCA9IGZpcnN0Q2hpbGQoKTsgY2hpbGQ7IGNoaWxkID0gY2hpbGQtPm5leHRT
aWJsaW5nKCkpIHsgICAgICAgIAotICAgICAgICAvLyBDaGVjayBmb3IgcGFnZS1icmVhay1iZWZv
cmU6IGFsd2F5cywgYW5kIGlmIGl0J3Mgc2V0LCBicmVhayBhbmQgYmFpbC4KLSAgICAgICAgaWYg
KGlzUHJpbnRpbmcgJiYgIWNoaWxkcmVuSW5saW5lKCkgJiYgY2hpbGQtPnN0eWxlKCktPnBhZ2VC
cmVha0JlZm9yZSgpID09IFBCQUxXQVlTICYmCi0gICAgICAgICAgICBpblJvb3RCbG9ja0NvbnRl
eHQoKSAmJiAoX3R5ICsgY2hpbGQtPnlQb3MoKSkgPiBpLnIueSgpICYmIAotICAgICAgICAgICAg
KF90eSArIGNoaWxkLT55UG9zKCkpIDwgaS5yLnkoKSArIGkuci5oZWlnaHQoKSkgewotICAgICAg
ICAgICAgY2FudmFzKCktPnNldEJlc3RUcnVuY2F0ZWRBdChfdHkgKyBjaGlsZC0+eVBvcygpLCB0
aGlzLCB0cnVlKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAg
ICAgICAgaWYgKCFjaGlsZC0+bGF5ZXIoKSAmJiAhY2hpbGQtPmlzRmxvYXRpbmcoKSkKLSAgICAg
ICAgICAgIGNoaWxkLT5wYWludChwYWludEluZm8sIF90eCwgX3R5KTsKLSAgICAgICAgCi0gICAg
ICAgIC8vIENoZWNrIGZvciBwYWdlLWJyZWFrLWFmdGVyOiBhbHdheXMsIGFuZCBpZiBpdCdzIHNl
dCwgYnJlYWsgYW5kIGJhaWwuCi0gICAgICAgIGlmIChpc1ByaW50aW5nICYmICFjaGlsZHJlbklu
bGluZSgpICYmIGNoaWxkLT5zdHlsZSgpLT5wYWdlQnJlYWtBZnRlcigpID09IFBCQUxXQVlTICYm
IAotICAgICAgICAgICAgaW5Sb290QmxvY2tDb250ZXh0KCkgJiYgKF90eSArIGNoaWxkLT55UG9z
KCkgKyBjaGlsZC0+aGVpZ2h0KCkpID4gaS5yLnkoKSAmJiAKLSAgICAgICAgICAgIChfdHkgKyBj
aGlsZC0+eVBvcygpICsgY2hpbGQtPmhlaWdodCgpKSA8IGkuci55KCkgKyBpLnIuaGVpZ2h0KCkp
IHsKLSAgICAgICAgICAgIGNhbnZhcygpLT5zZXRCZXN0VHJ1bmNhdGVkQXQoX3R5ICsgY2hpbGQt
PnlQb3MoKSArIGNoaWxkLT5oZWlnaHQoKSArIGNoaWxkLT5jb2xsYXBzZWRNYXJnaW5Cb3R0b20o
KSwgdGhpcywgdHJ1ZSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci19
Ci0KLXZvaWQgUmVuZGVyQmxvY2s6OnBhaW50Q2FyZXQoUGFpbnRJbmZvJiBpLCBDYXJldFR5cGUg
dHlwZSkKLXsKLSAgICBjb25zdCBTZWxlY3Rpb25Db250cm9sbGVyICZzID0gdHlwZSA9PSBDdXJz
b3JDYXJldCA/IGRvY3VtZW50KCktPmZyYW1lKCktPnNlbGVjdGlvbigpIDogZG9jdW1lbnQoKS0+
ZnJhbWUoKS0+ZHJhZ0NhcmV0KCk7Ci0gICAgTm9kZUltcGwgKmNhcmV0Tm9kZSA9IHMuc3RhcnQo
KS5ub2RlKCk7Ci0gICAgUmVuZGVyT2JqZWN0ICpyZW5kZXJlciA9IGNhcmV0Tm9kZSA/IGNhcmV0
Tm9kZS0+cmVuZGVyZXIoKSA6IDA7Ci0gICAgaWYgKHJlbmRlcmVyICYmIChyZW5kZXJlciA9PSB0
aGlzIHx8IHJlbmRlcmVyLT5jb250YWluaW5nQmxvY2soKSA9PSB0aGlzKSAmJiBjYXJldE5vZGUg
JiYgY2FyZXROb2RlLT5pc0NvbnRlbnRFZGl0YWJsZSgpKSB7Ci0gICAgICAgIGlmICh0eXBlID09
IEN1cnNvckNhcmV0KSB7Ci0gICAgICAgICAgICBkb2N1bWVudCgpLT5mcmFtZSgpLT5wYWludENh
cmV0KGkucCwgaS5yKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRvY3VtZW50KCkt
PmZyYW1lKCktPnBhaW50RHJhZ0NhcmV0KGkucCwgaS5yKTsKLSAgICAgICAgfQotICAgIH0KLX0K
LQotdm9pZCBSZW5kZXJCbG9jazo6cGFpbnRPYmplY3QoUGFpbnRJbmZvJiBpLCBpbnQgX3R4LCBp
bnQgX3R5KQotewotICAgIFBhaW50QWN0aW9uIHBhaW50QWN0aW9uID0gaS5waGFzZTsKLQotICAg
IC8vIElmIHdlJ3JlIGEgcmVwb3NpdGlvbmVkIHJ1bi1pbiBvciBhIGNvbXBhY3QsIGRvbid0IHBh
aW50IGJhY2tncm91bmQvYm9yZGVycy4KLSAgICBib29sIGlubGluZUZsb3cgPSBpc0lubGluZUZs
b3coKTsKLQotICAgIC8vIDEuIHBhaW50IGJhY2tncm91bmQsIGJvcmRlcnMgZXRjCi0gICAgaWYg
KCFpbmxpbmVGbG93ICYmCi0gICAgICAgIChwYWludEFjdGlvbiA9PSBQYWludEFjdGlvbkJsb2Nr
QmFja2dyb3VuZCB8fCBwYWludEFjdGlvbiA9PSBQYWludEFjdGlvbkNoaWxkQmxvY2tCYWNrZ3Jv
dW5kKSAmJgotICAgICAgICBzaG91bGRQYWludEJhY2tncm91bmRPckJvcmRlcigpICYmIHN0eWxl
KCktPnZpc2liaWxpdHkoKSA9PSBWSVNJQkxFKSB7Ci0gICAgICAgIHBhaW50Qm94RGVjb3JhdGlv
bnMoaSwgX3R4LCBfdHkpOwotICAgIH0KLQotICAgIC8vIFdlJ3JlIGRvbmUuICBXZSBkb24ndCBi
b3RoZXIgcGFpbnRpbmcgYW55IGNoaWxkcmVuLgotICAgIGlmIChwYWludEFjdGlvbiA9PSBQYWlu
dEFjdGlvbkJsb2NrQmFja2dyb3VuZCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLy8gQWRqdXN0
IG91ciBwYWludGluZyBwb3NpdGlvbiBpZiB3ZSdyZSBpbnNpZGUgYSBzY3JvbGxlZCBsYXllciAo
ZS5nLiwgYW4gb3ZlcmZsb3c6YXV0byBkaXYpLnMKLSAgICBpbnQgc2Nyb2xsZWRYID0gX3R4Owot
ICAgIGludCBzY3JvbGxlZFkgPSBfdHk7Ci0gICAgaWYgKGhhc092ZXJmbG93Q2xpcCgpKQotICAg
ICAgICBtX2xheWVyLT5zdWJ0cmFjdFNjcm9sbE9mZnNldChzY3JvbGxlZFgsIHNjcm9sbGVkWSk7
Ci0KLSAgICAvLyAyLiBwYWludCBjb250ZW50cyAgCi0gICAgaWYgKGNoaWxkcmVuSW5saW5lKCkp
Ci0gICAgICAgIHBhaW50TGluZXMoaSwgc2Nyb2xsZWRYLCBzY3JvbGxlZFkpOwotICAgIGVsc2UK
LSAgICAgICAgcGFpbnRDaGlsZHJlbihpLCBzY3JvbGxlZFgsIHNjcm9sbGVkWSk7Ci0gICAgCi0g
ICAgLy8gMy4gcGFpbnQgc2VsZWN0aW9uCi0gICAgYm9vbCBpc1ByaW50aW5nID0gKGkucC0+ZGV2
aWNlKCktPmRldlR5cGUoKSA9PSBRSW50ZXJuYWw6OlByaW50ZXIpOwotICAgIGlmICghaW5saW5l
RmxvdyAmJiAhaXNQcmludGluZykKLSAgICAgICAgcGFpbnRTZWxlY3Rpb24oaSwgc2Nyb2xsZWRY
LCBzY3JvbGxlZFkpOyAvLyBGaWxsIGluIGdhcHMgaW4gc2VsZWN0aW9uIG9uIGxpbmVzIGFuZCBi
ZXR3ZWVuIGJsb2Nrcy4KLQotICAgIC8vIDQuIHBhaW50IGZsb2F0cy4KLSAgICBpZiAoIWlubGlu
ZUZsb3cgJiYgKHBhaW50QWN0aW9uID09IFBhaW50QWN0aW9uRmxvYXQgfHwgcGFpbnRBY3Rpb24g
PT0gUGFpbnRBY3Rpb25TZWxlY3Rpb24pKQotICAgICAgICBwYWludEZsb2F0cyhpLCBzY3JvbGxl
ZFgsIHNjcm9sbGVkWSwgcGFpbnRBY3Rpb24gPT0gUGFpbnRBY3Rpb25TZWxlY3Rpb24pOwotCi0g
ICAgLy8gNS4gcGFpbnQgb3V0bGluZS4KLSAgICBpZiAoIWlubGluZUZsb3cgJiYgcGFpbnRBY3Rp
b24gPT0gUGFpbnRBY3Rpb25PdXRsaW5lICYmIAotICAgICAgICBzdHlsZSgpLT5vdXRsaW5lV2lk
dGgoKSAmJiBzdHlsZSgpLT52aXNpYmlsaXR5KCkgPT0gVklTSUJMRSkKLSAgICAgICAgcGFpbnRP
dXRsaW5lKGkucCwgX3R4LCBfdHksIHdpZHRoKCksIGhlaWdodCgpLCBzdHlsZSgpKTsKLQotICAg
IC8vIDYuIHBhaW50IGNhcmV0LgotICAgIC8vIElmIHRoZSBjYXJldCdzIG5vZGUncyByZW5kZXIg
b2JqZWN0J3MgY29udGFpbmluZyBibG9jayBpcyB0aGlzIGJsb2NrLCBhbmQgdGhlIHBhaW50IGFj
dGlvbiBpcyBQYWludEFjdGlvbkZvcmVncm91bmQsCi0gICAgLy8gdGhlbiBwYWludCB0aGUgY2Fy
ZXQuCi0gICAgaWYgKCFpbmxpbmVGbG93ICYmIHBhaW50QWN0aW9uID09IFBhaW50QWN0aW9uRm9y
ZWdyb3VuZCkgeyAgICAgICAgCi0gICAgICAgIHBhaW50Q2FyZXQoaSwgQ3Vyc29yQ2FyZXQpOwot
ICAgICAgICBwYWludENhcmV0KGksIERyYWdDYXJldCk7Ci0gICAgfQotCi0jaWZkZWYgQk9YX0RF
QlVHCi0gICAgaWYgKCBzdHlsZSgpICYmIHN0eWxlKCktPnZpc2liaWxpdHkoKSA9PSBWSVNJQkxF
ICkgewotICAgICAgICBpZihpc0Fub255bW91cygpKQotICAgICAgICAgICAgb3V0bGluZUJveChp
LnAsIF90eCwgX3R5LCAiZ3JlZW4iKTsKLSAgICAgICAgaWYoaXNGbG9hdGluZygpKQotICAgICAg
ICAgICAgb3V0bGluZUJveChpLnAsIF90eCwgX3R5LCAieWVsbG93Iik7Ci0gICAgICAgIGVsc2UK
LSAgICAgICAgICAgIG91dGxpbmVCb3goaS5wLCBfdHgsIF90eSk7Ci0gICAgfQotI2VuZGlmCi19
Ci0KLXZvaWQgUmVuZGVyQmxvY2s6OnBhaW50RmxvYXRzKFBhaW50SW5mbyYgaSwgaW50IF90eCwg
aW50IF90eSwgYm9vbCBwYWludFNlbGVjdGlvbikKLXsKLSAgICBpZiAoIW1fZmxvYXRpbmdPYmpl
Y3RzKQotICAgICAgICByZXR1cm47Ci0KLSAgICBGbG9hdGluZ09iamVjdCogcjsKLSAgICBRUHRy
TGlzdEl0ZXJhdG9yPEZsb2F0aW5nT2JqZWN0PiBpdCgqbV9mbG9hdGluZ09iamVjdHMpOwotICAg
IGZvciAoIDsgKHIgPSBpdC5jdXJyZW50KCkpOyArK2l0KSB7Ci0gICAgICAgIC8vIE9ubHkgcGFp
bnQgdGhlIG9iamVjdCBpZiBvdXIgbm9QYWludCBmbGFnIGlzbid0IHNldC4KLSAgICAgICAgaWYg
KCFyLT5ub1BhaW50ICYmICFyLT5ub2RlLT5sYXllcigpKSB7Ci0gICAgICAgICAgICBQYWludElu
Zm8gaW5mbyhpLnAsIGkuciwgcGFpbnRTZWxlY3Rpb24gPyBQYWludEFjdGlvblNlbGVjdGlvbiA6
IFBhaW50QWN0aW9uQmxvY2tCYWNrZ3JvdW5kLCBpLnBhaW50aW5nUm9vdCk7Ci0gICAgICAgICAg
ICBpbnQgdHggPSBfdHggKyByLT5sZWZ0IC0gci0+bm9kZS0+eFBvcygpICsgci0+bm9kZS0+bWFy
Z2luTGVmdCgpOwotICAgICAgICAgICAgaW50IHR5ID0gX3R5ICsgci0+c3RhcnRZIC0gci0+bm9k
ZS0+eVBvcygpICsgci0+bm9kZS0+bWFyZ2luVG9wKCk7Ci0gICAgICAgICAgICByLT5ub2RlLT5w
YWludChpbmZvLCB0eCwgdHkpOwotICAgICAgICAgICAgaWYgKCFwYWludFNlbGVjdGlvbikgewot
ICAgICAgICAgICAgICAgIGluZm8ucGhhc2UgPSBQYWludEFjdGlvbkNoaWxkQmxvY2tCYWNrZ3Jv
dW5kczsKLSAgICAgICAgICAgICAgICByLT5ub2RlLT5wYWludChpbmZvLCB0eCwgdHkpOwotICAg
ICAgICAgICAgICAgIGluZm8ucGhhc2UgPSBQYWludEFjdGlvbkZsb2F0OwotICAgICAgICAgICAg
ICAgIHItPm5vZGUtPnBhaW50KGluZm8sIHR4LCB0eSk7Ci0gICAgICAgICAgICAgICAgaW5mby5w
aGFzZSA9IFBhaW50QWN0aW9uRm9yZWdyb3VuZDsKLSAgICAgICAgICAgICAgICByLT5ub2RlLT5w
YWludChpbmZvLCB0eCwgdHkpOwotICAgICAgICAgICAgICAgIGluZm8ucGhhc2UgPSBQYWludEFj
dGlvbk91dGxpbmU7Ci0gICAgICAgICAgICAgICAgci0+bm9kZS0+cGFpbnQoaW5mbywgdHgsIHR5
KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBSZW5kZXJCbG9j
azo6cGFpbnRFbGxpcHNpc0JveGVzKFBhaW50SW5mbyYgaSwgaW50IF90eCwgaW50IF90eSkKLXsK
LSAgICBpZiAoIXNob3VsZFBhaW50V2l0aGluUm9vdChpKSB8fCAhZmlyc3RMaW5lQm94KCkpCi0g
ICAgICAgIHJldHVybjsKLQotICAgIGlmIChzdHlsZSgpLT52aXNpYmlsaXR5KCkgPT0gVklTSUJM
RSAmJiBpLnBoYXNlID09IFBhaW50QWN0aW9uRm9yZWdyb3VuZCkgewotICAgICAgICAvLyBXZSBj
YW4gY2hlY2sgdGhlIGZpcnN0IGJveCBhbmQgbGFzdCBib3ggYW5kIGF2b2lkIHBhaW50aW5nIGlm
IHdlIGRvbid0Ci0gICAgICAgIC8vIGludGVyc2VjdC4KLSAgICAgICAgaW50IHlQb3MgPSBfdHkg
KyBmaXJzdExpbmVCb3goKS0+eVBvcygpOzsKLSAgICAgICAgaW50IGggPSBsYXN0TGluZUJveCgp
LT55UG9zKCkgKyBsYXN0TGluZUJveCgpLT5oZWlnaHQoKSAtIGZpcnN0TGluZUJveCgpLT55UG9z
KCk7Ci0gICAgICAgIGlmKCAoeVBvcyA+PSBpLnIueSgpICsgaS5yLmhlaWdodCgpKSB8fCAoeVBv
cyArIGggPD0gaS5yLnkoKSkpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgLy8gU2Vl
IGlmIG91ciBib3hlcyBpbnRlcnNlY3Qgd2l0aCB0aGUgZGlydHkgcmVjdC4gIElmIHNvLCB0aGVu
IHdlIHBhaW50Ci0gICAgICAgIC8vIHRoZW0uICBOb3RlIHRoYXQgYm94ZXMgY2FuIGVhc2lseSBv
dmVybGFwLCBzbyB3ZSBjYW4ndCBtYWtlIGFueSBhc3N1bXB0aW9ucwotICAgICAgICAvLyBiYXNl
ZCBvZmYgcG9zaXRpb25zIG9mIG91ciBmaXJzdCBsaW5lIGJveCBvciBvdXIgbGFzdCBsaW5lIGJv
eC4KLSAgICAgICAgZm9yIChSb290SW5saW5lQm94KiBjdXJyID0gZmlyc3RSb290Qm94KCk7IGN1
cnI7IGN1cnIgPSBjdXJyLT5uZXh0Um9vdEJveCgpKSB7Ci0gICAgICAgICAgICB5UG9zID0gX3R5
ICsgY3Vyci0+eVBvcygpOwotICAgICAgICAgICAgaCA9IGN1cnItPmhlaWdodCgpOwotICAgICAg
ICAgICAgaWYgKGN1cnItPmVsbGlwc2lzQm94KCkgJiYgKHlQb3MgPCBpLnIueSgpICsgaS5yLmhl
aWdodCgpKSAmJiAoeVBvcyArIGggPiBpLnIueSgpKSkKLSAgICAgICAgICAgICAgICBjdXJyLT5w
YWludEVsbGlwc2lzQm94KGksIF90eCwgX3R5KTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9p
ZCBSZW5kZXJCbG9jazo6c2V0U2VsZWN0aW9uU3RhdGUoU2VsZWN0aW9uU3RhdGUgcykKLXsKLSAg
ICBpZiAobV9zZWxlY3Rpb25TdGF0ZSA9PSBzKQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAg
aWYgKHMgPT0gU2VsZWN0aW9uSW5zaWRlICYmIG1fc2VsZWN0aW9uU3RhdGUgIT0gU2VsZWN0aW9u
Tm9uZSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYgKChzID09IFNlbGVjdGlvblN0YXJ0ICYm
IG1fc2VsZWN0aW9uU3RhdGUgPT0gU2VsZWN0aW9uRW5kKSB8fAotICAgICAgICAocyA9PSBTZWxl
Y3Rpb25FbmQgJiYgbV9zZWxlY3Rpb25TdGF0ZSA9PSBTZWxlY3Rpb25TdGFydCkpCi0gICAgICAg
IG1fc2VsZWN0aW9uU3RhdGUgPSBTZWxlY3Rpb25Cb3RoOwotICAgIGVsc2UKLSAgICAgICAgbV9z
ZWxlY3Rpb25TdGF0ZSA9IHM7Ci0gICAgCi0gICAgUmVuZGVyQmxvY2sqIGNiID0gY29udGFpbmlu
Z0Jsb2NrKCk7Ci0gICAgaWYgKGNiICYmICFjYi0+aXNDYW52YXMoKSkKLSAgICAgICAgY2ItPnNl
dFNlbGVjdGlvblN0YXRlKHMpOwotfQotCi1ib29sIFJlbmRlckJsb2NrOjpzaG91bGRQYWludFNl
bGVjdGlvbkdhcHMoKSBjb25zdAotewotICAgIHJldHVybiBtX3NlbGVjdGlvblN0YXRlICE9IFNl
bGVjdGlvbk5vbmUgJiYgc3R5bGUoKS0+dmlzaWJpbGl0eSgpID09IFZJU0lCTEUgJiYgaXNTZWxl
Y3Rpb25Sb290KCk7Ci19Ci0KLWJvb2wgUmVuZGVyQmxvY2s6OmlzU2VsZWN0aW9uUm9vdCgpIGNv
bnN0Ci17Ci0gICAgLy8gRklYTUU6IEV2ZW50dWFsbHkgdGFibGVzIHNob3VsZCBoYXZlIHRvIGxl
YXJuIGhvdyB0byBmaWxsIGdhcHMgYmV0d2VlbiBjZWxscywgYXQgbGVhc3QgaW4gc2ltcGxlIG5v
bi1zcGFubmluZyBjYXNlcy4KLSAgICByZXR1cm4gKGlzQm9keSgpIHx8IGlzUm9vdCgpIHx8IGhh
c092ZXJmbG93Q2xpcCgpIHx8IGlzUmVsUG9zaXRpb25lZCgpIHx8Ci0gICAgICAgICAgICBpc0Zs
b2F0aW5nT3JQb3NpdGlvbmVkKCkgfHwgaXNUYWJsZUNlbGwoKSB8fCBpc0lubGluZUJsb2NrT3JJ
bmxpbmVUYWJsZSgpKTsKLX0KLQotR2FwUmVjdHMgUmVuZGVyQmxvY2s6OnNlbGVjdGlvbkdhcFJl
Y3RzKCkKLXsKLSAgICBpZiAoIXNob3VsZFBhaW50U2VsZWN0aW9uR2FwcygpKQotICAgICAgICBy
ZXR1cm4gR2FwUmVjdHMoKTsKLQotICAgIGludCB0eCwgdHk7Ci0gICAgYWJzb2x1dGVQb3NpdGlv
bih0eCwgdHkpOwotICAgIAotICAgIGludCBsYXN0VG9wID0gLWJvcmRlclRvcEV4dHJhKCk7Ci0g
ICAgaW50IGxhc3RMZWZ0ID0gbGVmdFNlbGVjdGlvbk9mZnNldCh0aGlzLCBsYXN0VG9wKTsKLSAg
ICBpbnQgbGFzdFJpZ2h0ID0gcmlnaHRTZWxlY3Rpb25PZmZzZXQodGhpcywgbGFzdFRvcCk7Ci0g
ICAgCi0gICAgcmV0dXJuIGZpbGxTZWxlY3Rpb25HYXBzKHRoaXMsIHR4LCB0eSwgdHgsIHR5LCBs
YXN0VG9wLCBsYXN0TGVmdCwgbGFzdFJpZ2h0KTsKLX0KLQotdm9pZCBSZW5kZXJCbG9jazo6cGFp
bnRTZWxlY3Rpb24oUGFpbnRJbmZvJiBpLCBpbnQgdHgsIGludCB0eSkKLXsKLSAgICBpZiAoc2hv
dWxkUGFpbnRTZWxlY3Rpb25HYXBzKCkgJiYgaS5waGFzZSA9PSBQYWludEFjdGlvbkZvcmVncm91
bmQpIHsKLSAgICAgICAgaW50IGxhc3RUb3AgPSAtYm9yZGVyVG9wRXh0cmEoKTsKLSAgICAgICAg
aW50IGxhc3RMZWZ0ID0gbGVmdFNlbGVjdGlvbk9mZnNldCh0aGlzLCBsYXN0VG9wKTsKLSAgICAg
ICAgaW50IGxhc3RSaWdodCA9IHJpZ2h0U2VsZWN0aW9uT2Zmc2V0KHRoaXMsIGxhc3RUb3ApOwot
ICAgICAgICBmaWxsU2VsZWN0aW9uR2Fwcyh0aGlzLCB0eCwgdHksIHR4LCB0eSwgbGFzdFRvcCwg
bGFzdExlZnQsIGxhc3RSaWdodCwgJmkpOwotICAgIH0KLX0KLQotR2FwUmVjdHMgUmVuZGVyQmxv
Y2s6OmZpbGxTZWxlY3Rpb25HYXBzKFJlbmRlckJsb2NrKiByb290QmxvY2ssIGludCBibG9ja1gs
IGludCBibG9ja1ksIGludCB0eCwgaW50IHR5LCBpbnQmIGxhc3RUb3AsIGludCYgbGFzdExlZnQs
IGludCYgbGFzdFJpZ2h0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBjb25zdCBQYWludEluZm8qIGkpCi17Ci0gICAgLy8gRklYTUU6IG92ZXJmbG93OiBhdXRvL3Nj
cm9sbCByZWdpb25zIG5lZWQgbW9yZSBtYXRoIGhlcmUsIHNpbmNlIHBhaW50aW5nIGluIHRoZSBi
b3JkZXIgYm94IGlzIGRpZmZlcmVudCBmcm9tIHBhaW50aW5nIGluIHRoZSBwYWRkaW5nIGJveCAo
b25lIGlzIHNjcm9sbGVkLCB0aGUgb3RoZXIgaXMKLSAgICAvLyBmaXhlZCkuCi0gICAgR2FwUmVj
dHMgcmVzdWx0OwotICAgIGlmICghaXNCbG9ja0Zsb3coKSkKLSAgICAgICAgcmV0dXJuIHJlc3Vs
dDsKLQotICAgIGlmIChjaGlsZHJlbklubGluZSgpKQotICAgICAgICByZXN1bHQgPSBmaWxsSW5s
aW5lU2VsZWN0aW9uR2Fwcyhyb290QmxvY2ssIGJsb2NrWCwgYmxvY2tZLCB0eCwgdHksIGxhc3RU
b3AsIGxhc3RMZWZ0LCBsYXN0UmlnaHQsIGkpOwotICAgIGVsc2UKLSAgICAgICAgcmVzdWx0ID0g
ZmlsbEJsb2NrU2VsZWN0aW9uR2Fwcyhyb290QmxvY2ssIGJsb2NrWCwgYmxvY2tZLCB0eCwgdHks
IGxhc3RUb3AsIGxhc3RMZWZ0LCBsYXN0UmlnaHQsIGkpOwotICAgICAgICAKLSAgICAvLyBHbyBh
aGVhZCBhbmQgZmlsbCB0aGUgdmVydGljYWwgZ2FwIGFsbCB0aGUgd2F5IHRvIHRoZSBib3R0b20g
b2Ygb3VyIGJsb2NrIGlmIHRoZSBzZWxlY3Rpb24gZXh0ZW5kcyBwYXN0IG91ciBibG9jay4KLSAg
ICBpZiAocm9vdEJsb2NrID09IHRoaXMgJiYgKG1fc2VsZWN0aW9uU3RhdGUgIT0gU2VsZWN0aW9u
Qm90aCAmJiBtX3NlbGVjdGlvblN0YXRlICE9IFNlbGVjdGlvbkVuZCkpCi0gICAgICAgIHJlc3Vs
dC51bml0ZUNlbnRlcihmaWxsVmVydGljYWxTZWxlY3Rpb25HYXAobGFzdFRvcCwgbGFzdExlZnQs
IGxhc3RSaWdodCwgdHkgKyBoZWlnaHQoKSArIGJvcmRlckJvdHRvbUV4dHJhKCksCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdEJsb2NrLCBi
bG9ja1gsIGJsb2NrWSwgaSkpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLUdhcFJlY3RzIFJl
bmRlckJsb2NrOjpmaWxsSW5saW5lU2VsZWN0aW9uR2FwcyhSZW5kZXJCbG9jayogcm9vdEJsb2Nr
LCBpbnQgYmxvY2tYLCBpbnQgYmxvY2tZLCBpbnQgdHgsIGludCB0eSwgCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBsYXN0VG9wLCBpbnQmIGxhc3RM
ZWZ0LCBpbnQmIGxhc3RSaWdodCwgY29uc3QgUGFpbnRJbmZvKiBpKQotewotICAgIEdhcFJlY3Rz
IHJlc3VsdDsKLSAgICAKLSAgICBSZW5kZXJPYmplY3QqIHNlbFN0YXJ0ID0gY2FudmFzKCktPnNl
bGVjdGlvblN0YXJ0KCk7Ci0gICAgLy8gSWYgdGhlcmUgaXMgbm8gc2VsZWN0aW9uLCBkb24ndCB0
cnkgdG8gZ2V0IHRoZSBzZWxlY3Rpb24ncyBjb250YWluaW5nIGJsb2NrLiAKLSAgICAvLyBJZiB3
ZSBkbywgd2UnbGwgY3Jhc2guCi0gICAgYm9vbCBjb250YWluc1N0YXJ0ID0gKHNlbFN0YXJ0ICYm
IChzZWxTdGFydCA9PSB0aGlzIHx8IHNlbFN0YXJ0LT5jb250YWluaW5nQmxvY2soKSA9PSB0aGlz
KSk7Ci0KLSAgICBpZiAoIWZpcnN0TGluZUJveCgpKSB7Ci0gICAgICAgIGlmIChjb250YWluc1N0
YXJ0KSB7Ci0gICAgICAgICAgICAvLyBHbyBhaGVhZCBhbmQgdXBkYXRlIG91ciBsYXN0WSB0byBi
ZSB0aGUgYm90dG9tIG9mIHRoZSBibG9jay4gIDxocj5zIG9yIGVtcHR5IGJsb2NrcyB3aXRoIGhl
aWdodCBjYW4gdHJpcCB0aGlzCi0gICAgICAgICAgICAvLyBjYXNlLgotICAgICAgICAgICAgbGFz
dFRvcCA9ICh0eSAtIGJsb2NrWSkgKyBoZWlnaHQoKTsKLSAgICAgICAgICAgIGxhc3RMZWZ0ID0g
bGVmdFNlbGVjdGlvbk9mZnNldChyb290QmxvY2ssIGhlaWdodCgpKTsKLSAgICAgICAgICAgIGxh
c3RSaWdodCA9IHJpZ2h0U2VsZWN0aW9uT2Zmc2V0KHJvb3RCbG9jaywgaGVpZ2h0KCkpOwotICAg
ICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgUm9vdElubGluZUJv
eCogbGFzdFNlbGVjdGVkTGluZSA9IDA7Ci0gICAgUm9vdElubGluZUJveCogY3VycjsKLSAgICBm
b3IgKGN1cnIgPSBmaXJzdFJvb3RCb3goKTsgY3VyciAmJiAhY3Vyci0+aGFzU2VsZWN0ZWRDaGls
ZHJlbigpOyBjdXJyID0gY3Vyci0+bmV4dFJvb3RCb3goKSk7Ci0KLSAgICAvLyBOb3cgcGFpbnQg
dGhlIGdhcHMgZm9yIHRoZSBsaW5lcy4KLSAgICBmb3IgKDsgY3VyciAmJiBjdXJyLT5oYXNTZWxl
Y3RlZENoaWxkcmVuKCk7IGN1cnIgPSBjdXJyLT5uZXh0Um9vdEJveCgpKSB7Ci0gICAgICAgIGlu
dCBzZWxUb3AgPSAgY3Vyci0+c2VsZWN0aW9uVG9wKCk7Ci0gICAgICAgIGludCBzZWxIZWlnaHQg
PSBjdXJyLT5zZWxlY3Rpb25IZWlnaHQoKTsKLQotICAgICAgICBpZiAoIWNvbnRhaW5zU3RhcnQg
JiYgIWxhc3RTZWxlY3RlZExpbmUgJiYgc2VsZWN0aW9uU3RhdGUoKSAhPSBTZWxlY3Rpb25TdGFy
dCkKLSAgICAgICAgICAgIHJlc3VsdC51bml0ZUNlbnRlcihmaWxsVmVydGljYWxTZWxlY3Rpb25H
YXAobGFzdFRvcCwgbGFzdExlZnQsIGxhc3RSaWdodCwgdHkgKyBzZWxUb3AsCi0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RCbG9jaywg
YmxvY2tYLCBibG9ja1ksIGkpKTsKLQotICAgICAgICBpZiAoIWkgfHwgKHR5ICsgc2VsVG9wIDwg
aS0+ci55KCkgKyBpLT5yLmhlaWdodCgpKSAmJiAodHkgKyBzZWxUb3AgKyBzZWxIZWlnaHQgPiBp
LT5yLnkoKSkpCi0gICAgICAgICAgICByZXN1bHQudW5pdGUoY3Vyci0+ZmlsbExpbmVTZWxlY3Rp
b25HYXAoc2VsVG9wLCBzZWxIZWlnaHQsIHJvb3RCbG9jaywgYmxvY2tYLCBibG9ja1ksIHR4LCB0
eSwgaSkpOwotCi0gICAgICAgIGxhc3RTZWxlY3RlZExpbmUgPSBjdXJyOwotICAgIH0KLQotICAg
IGlmIChjb250YWluc1N0YXJ0ICYmICFsYXN0U2VsZWN0ZWRMaW5lKQotICAgICAgICAvLyBTZWxl
Y3Rpb24gbXVzdCBzdGFydCBqdXN0IGFmdGVyIG91ciBsYXN0IGxpbmUuCi0gICAgICAgIGxhc3RT
ZWxlY3RlZExpbmUgPSBsYXN0Um9vdEJveCgpOwotCi0gICAgaWYgKGxhc3RTZWxlY3RlZExpbmUg
JiYgc2VsZWN0aW9uU3RhdGUoKSAhPSBTZWxlY3Rpb25FbmQgJiYgc2VsZWN0aW9uU3RhdGUoKSAh
PSBTZWxlY3Rpb25Cb3RoKSB7Ci0gICAgICAgIC8vIEdvIGFoZWFkIGFuZCB1cGRhdGUgb3VyIGxh
c3RZIHRvIGJlIHRoZSBib3R0b20gb2YgdGhlIGxhc3Qgc2VsZWN0ZWQgbGluZS4KLSAgICAgICAg
bGFzdFRvcCA9ICh0eSAtIGJsb2NrWSkgKyBsYXN0U2VsZWN0ZWRMaW5lLT5ib3R0b21PdmVyZmxv
dygpOwotICAgICAgICBsYXN0TGVmdCA9IGxlZnRTZWxlY3Rpb25PZmZzZXQocm9vdEJsb2NrLCBs
YXN0U2VsZWN0ZWRMaW5lLT5ib3R0b21PdmVyZmxvdygpKTsKLSAgICAgICAgbGFzdFJpZ2h0ID0g
cmlnaHRTZWxlY3Rpb25PZmZzZXQocm9vdEJsb2NrLCBsYXN0U2VsZWN0ZWRMaW5lLT5ib3R0b21P
dmVyZmxvdygpKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotR2FwUmVjdHMgUmVu
ZGVyQmxvY2s6OmZpbGxCbG9ja1NlbGVjdGlvbkdhcHMoUmVuZGVyQmxvY2sqIHJvb3RCbG9jaywg
aW50IGJsb2NrWCwgaW50IGJsb2NrWSwgaW50IHR4LCBpbnQgdHksIGludCYgbGFzdFRvcCwgaW50
JiBsYXN0TGVmdCwgaW50JiBsYXN0UmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBjb25zdCBQYWludEluZm8qIGkpCi17Ci0gICAgR2FwUmVjdHMgcmVzdWx0
OwotICAgIAotICAgIC8vIEdvIGFoZWFkIGFuZCBqdW1wIHJpZ2h0IHRvIHRoZSBmaXJzdCBibG9j
ayBjaGlsZCB0aGF0IGNvbnRhaW5zIHNvbWUgc2VsZWN0ZWQgb2JqZWN0cy4KLSAgICBSZW5kZXJP
YmplY3QqIGN1cnI7Ci0gICAgZm9yIChjdXJyID0gZmlyc3RDaGlsZCgpOyBjdXJyICYmIGN1cnIt
PnNlbGVjdGlvblN0YXRlKCkgPT0gU2VsZWN0aW9uTm9uZTsgY3VyciA9IGN1cnItPm5leHRTaWJs
aW5nKCkpOwotICAgIAotICAgIGZvciAoYm9vbCBzYXdTZWxlY3Rpb25FbmQgPSBmYWxzZTsgY3Vy
ciAmJiAhc2F3U2VsZWN0aW9uRW5kOyBjdXJyID0gY3Vyci0+bmV4dFNpYmxpbmcoKSkgewotICAg
ICAgICBTZWxlY3Rpb25TdGF0ZSBjaGlsZFN0YXRlID0gY3Vyci0+c2VsZWN0aW9uU3RhdGUoKTsK
LSAgICAgICAgaWYgKGNoaWxkU3RhdGUgPT0gU2VsZWN0aW9uQm90aCB8fCBjaGlsZFN0YXRlID09
IFNlbGVjdGlvbkVuZCkKLSAgICAgICAgICAgIHNhd1NlbGVjdGlvbkVuZCA9IHRydWU7Ci0KLSAg
ICAgICAgaWYgKGN1cnItPmlzRmxvYXRpbmdPclBvc2l0aW9uZWQoKSkKLSAgICAgICAgICAgIGNv
bnRpbnVlOyAvLyBXZSBtdXN0IGJlIGEgbm9ybWFsIGZsb3cgb2JqZWN0IGluIG9yZGVyIHRvIGV2
ZW4gYmUgY29uc2lkZXJlZC4KLSAgICAgICAgCi0gICAgICAgIGlmIChjdXJyLT5pc1JlbFBvc2l0
aW9uZWQoKSAmJiBjdXJyLT5sYXllcigpKSB7Ci0gICAgICAgICAgICAvLyBJZiB0aGUgcmVscG9z
aXRpb24gb2Zmc2V0IGlzIGFueXRoaW5nIG90aGVyIHRoYW4gMCwgdGhlbiB0cmVhdCB0aGlzIGp1
c3QgbGlrZSBhbiBhYnNvbHV0ZSBwb3NpdGlvbmVkIGVsZW1lbnQuCi0gICAgICAgICAgICAvLyBK
dXN0IGRpc3JlZ2FyZCBpdCBjb21wbGV0ZWx5LgotICAgICAgICAgICAgaW50IHggPSAwOwotICAg
ICAgICAgICAgaW50IHkgPSAwOwotICAgICAgICAgICAgY3Vyci0+bGF5ZXIoKS0+cmVsYXRpdmVQ
b3NpdGlvbk9mZnNldCh4LCB5KTsKLSAgICAgICAgICAgIGlmICh4IHx8IHkpCi0gICAgICAgICAg
ICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sIHBhaW50c093blNlbGVj
dGlvbiA9IGN1cnItPnNob3VsZFBhaW50U2VsZWN0aW9uR2FwcygpIHx8IGN1cnItPmlzVGFibGUo
KTsgLy8gRklYTUU6IEV2ZW50dWFsbHkgd2Ugd29uJ3Qgc3BlY2lhbC1jYXNlIHRhYmxlIGxpa2Ug
dGhpcy4KLSAgICAgICAgYm9vbCBmaWxsQmxvY2tHYXBzID0gcGFpbnRzT3duU2VsZWN0aW9uIHx8
IChjdXJyLT5jYW5CZVNlbGVjdGlvbkxlYWYoKSAmJiBjaGlsZFN0YXRlICE9IFNlbGVjdGlvbk5v
bmUpOwotICAgICAgICBpZiAoZmlsbEJsb2NrR2FwcykgewotICAgICAgICAgICAgLy8gV2UgbmVl
ZCB0byBmaWxsIHRoZSB2ZXJ0aWNhbCBnYXAgYWJvdmUgdGhpcyBvYmplY3QuCi0gICAgICAgICAg
ICBpZiAoY2hpbGRTdGF0ZSA9PSBTZWxlY3Rpb25FbmQgfHwgY2hpbGRTdGF0ZSA9PSBTZWxlY3Rp
b25JbnNpZGUpCi0gICAgICAgICAgICAgICAgLy8gRmlsbCB0aGUgZ2FwIGFib3ZlIHRoZSBvYmpl
Y3QuCi0gICAgICAgICAgICAgICAgcmVzdWx0LnVuaXRlQ2VudGVyKGZpbGxWZXJ0aWNhbFNlbGVj
dGlvbkdhcChsYXN0VG9wLCBsYXN0TGVmdCwgbGFzdFJpZ2h0LCAKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5ICsgY3Vyci0+eVBv
cygpLCByb290QmxvY2ssIGJsb2NrWCwgYmxvY2tZLCBpKSk7Ci0KLSAgICAgICAgICAgIC8vIE9u
bHkgZmlsbCBzaWRlIGdhcHMgZm9yIG9iamVjdHMgdGhhdCBwYWludCB0aGVpciBvd24gc2VsZWN0
aW9uIGlmIHdlIGtub3cgZm9yIHN1cmUgdGhlIHNlbGVjdGlvbiBpcyBnb2luZyB0byBleHRlbmQg
YWxsIHRoZSB3YXkgKnBhc3QqCi0gICAgICAgICAgICAvLyBvdXIgb2JqZWN0LiAgV2Uga25vdyB0
aGlzIGlmIHRoZSBzZWxlY3Rpb24gZGlkIG5vdCBlbmQgaW5zaWRlIG91ciBvYmplY3QuCi0gICAg
ICAgICAgICBpZiAocGFpbnRzT3duU2VsZWN0aW9uICYmIChjaGlsZFN0YXRlID09IFNlbGVjdGlv
blN0YXJ0IHx8IHNhd1NlbGVjdGlvbkVuZCkpCi0gICAgICAgICAgICAgICAgY2hpbGRTdGF0ZSA9
IFNlbGVjdGlvbk5vbmU7Ci0KLSAgICAgICAgICAgIC8vIEZpbGwgc2lkZSBnYXBzIG9uIHRoaXMg
b2JqZWN0IGJhc2VkIG9mZiBpdHMgc3RhdGUuCi0gICAgICAgICAgICBib29sIGxlZnRHYXAsIHJp
Z2h0R2FwOwotICAgICAgICAgICAgZ2V0SG9yaXpvbnRhbFNlbGVjdGlvbkdhcEluZm8oY2hpbGRT
dGF0ZSwgbGVmdEdhcCwgcmlnaHRHYXApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAo
bGVmdEdhcCkKLSAgICAgICAgICAgICAgICByZXN1bHQudW5pdGVMZWZ0KGZpbGxMZWZ0U2VsZWN0
aW9uR2FwKHRoaXMsIGN1cnItPnhQb3MoKSwgY3Vyci0+eVBvcygpLCBjdXJyLT5oZWlnaHQoKSwg
cm9vdEJsb2NrLCBibG9ja1gsIGJsb2NrWSwgdHgsIHR5LCBpKSk7Ci0gICAgICAgICAgICBpZiAo
cmlnaHRHYXApCi0gICAgICAgICAgICAgICAgcmVzdWx0LnVuaXRlUmlnaHQoZmlsbFJpZ2h0U2Vs
ZWN0aW9uR2FwKHRoaXMsIGN1cnItPnhQb3MoKSArIGN1cnItPndpZHRoKCksIGN1cnItPnlQb3Mo
KSwgY3Vyci0+aGVpZ2h0KCksIHJvb3RCbG9jaywgYmxvY2tYLCBibG9ja1ksIHR4LCB0eSwgaSkp
OwotCi0gICAgICAgICAgICAvLyBVcGRhdGUgbGFzdFRvcCB0byBiZSBqdXN0IHVuZGVybmVhdGgg
dGhlIG9iamVjdC4gIGxhc3RMZWZ0IGFuZCBsYXN0UmlnaHQgZXh0ZW5kIGFzIGZhciBhcwotICAg
ICAgICAgICAgLy8gdGhleSBjYW4gd2l0aG91dCBidW1waW5nIGludG8gZmxvYXRpbmcgb3IgcG9z
aXRpb25lZCBvYmplY3RzLiAgSWRlYWxseSB0aGV5IHdpbGwgZ28gcmlnaHQgdXAKLSAgICAgICAg
ICAgIC8vIHRvIHRoZSBib3JkZXIgb2YgdGhlIHJvb3Qgc2VsZWN0aW9uIGJsb2NrLgotICAgICAg
ICAgICAgbGFzdFRvcCA9ICh0eSAtIGJsb2NrWSkgKyAoY3Vyci0+eVBvcygpICsgY3Vyci0+aGVp
Z2h0KCkpOwotICAgICAgICAgICAgbGFzdExlZnQgPSBsZWZ0U2VsZWN0aW9uT2Zmc2V0KHJvb3RC
bG9jaywgY3Vyci0+eVBvcygpICsgY3Vyci0+aGVpZ2h0KCkpOwotICAgICAgICAgICAgbGFzdFJp
Z2h0ID0gcmlnaHRTZWxlY3Rpb25PZmZzZXQocm9vdEJsb2NrLCBjdXJyLT55UG9zKCkgKyBjdXJy
LT5oZWlnaHQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoY2hpbGRTdGF0ZSAhPSBT
ZWxlY3Rpb25Ob25lKQotICAgICAgICAgICAgLy8gV2UgbXVzdCBiZSBhIGJsb2NrIHRoYXQgaGFz
IHNvbWUgc2VsZWN0ZWQgb2JqZWN0IGluc2lkZSBpdC4gIEdvIGFoZWFkIGFuZCByZWN1ci4KLSAg
ICAgICAgICAgIHJlc3VsdC51bml0ZShzdGF0aWNfY2FzdDxSZW5kZXJCbG9jayo+KGN1cnIpLT5m
aWxsU2VsZWN0aW9uR2Fwcyhyb290QmxvY2ssIGJsb2NrWCwgYmxvY2tZLCB0eCArIGN1cnItPnhQ
b3MoKSwgdHkgKyBjdXJyLT55UG9zKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RUb3AsIGxh
c3RMZWZ0LCBsYXN0UmlnaHQsIGkpKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQot
SW50UmVjdCBSZW5kZXJCbG9jazo6ZmlsbEhvcml6b250YWxTZWxlY3Rpb25HYXAoUmVuZGVyT2Jq
ZWN0KiBzZWxPYmosIGludCB4UG9zLCBpbnQgeVBvcywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAot
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhaW50
SW5mbyogaSkKLXsKLSAgICBpZiAod2lkdGggPD0gMCB8fCBoZWlnaHQgPD0gMCkKLSAgICAgICAg
cmV0dXJuIEludFJlY3QoKTsKLQotICAgIEludFJlY3QgZ2FwUmVjdCh4UG9zLCB5UG9zLCB3aWR0
aCwgaGVpZ2h0KTsKLSAgICBpZiAoaSkgewotICAgICAgICAvLyBQYWludCB0aGUgcmVjdC4KLSAg
ICAgICAgUUJydXNoIHNlbEJydXNoKHNlbE9iai0+c2VsZWN0aW9uQ29sb3IoaS0+cCkpOwotICAg
ICAgICBpLT5wLT5maWxsUmVjdChnYXBSZWN0LCBzZWxCcnVzaCk7Ci0gICAgfQotICAgIHJldHVy
biBnYXBSZWN0OwotfQotCi1JbnRSZWN0IFJlbmRlckJsb2NrOjpmaWxsVmVydGljYWxTZWxlY3Rp
b25HYXAoaW50IGxhc3RUb3AsIGludCBsYXN0TGVmdCwgaW50IGxhc3RSaWdodCwKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJvdHRvbVksIFJlbmRlckJs
b2NrKiByb290QmxvY2ssIGludCBibG9ja1gsIGludCBibG9ja1ksCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhaW50SW5mbyogaSkKLXsKLSAgICBp
bnQgdG9wID0gYmxvY2tZICsgbGFzdFRvcDsKLSAgICBpbnQgaGVpZ2h0ID0gYm90dG9tWSAtIHRv
cDsKLSAgICBpZiAoaGVpZ2h0IDw9IDApCi0gICAgICAgIHJldHVybiBJbnRSZWN0KCk7Ci0gICAg
ICAgIAotICAgIC8vIEdldCB0aGUgc2VsZWN0aW9uIG9mZnNldHMgZm9yIHRoZSBib3R0b20gb2Yg
dGhlIGdhcAotICAgIGludCBsZWZ0ID0gYmxvY2tYICsga01heChsYXN0TGVmdCwgbGVmdFNlbGVj
dGlvbk9mZnNldChyb290QmxvY2ssIGJvdHRvbVkpKTsKLSAgICBpbnQgcmlnaHQgPSBibG9ja1gg
KyBrTWluKGxhc3RSaWdodCwgcmlnaHRTZWxlY3Rpb25PZmZzZXQocm9vdEJsb2NrLCBib3R0b21Z
KSk7Ci0gICAgaW50IHdpZHRoID0gcmlnaHQgLSBsZWZ0OwotICAgIGlmICh3aWR0aCA8PSAwKQot
ICAgICAgICByZXR1cm4gSW50UmVjdCgpOwotCi0gICAgSW50UmVjdCBnYXBSZWN0KGxlZnQsIHRv
cCwgd2lkdGgsIGhlaWdodCk7Ci0gICAgaWYgKGkpIHsKLSAgICAgICAgLy8gUGFpbnQgdGhlIHJl
Y3QuCi0gICAgICAgIFFCcnVzaCBzZWxCcnVzaChzZWxlY3Rpb25Db2xvcihpLT5wKSk7Ci0gICAg
ICAgIGktPnAtPmZpbGxSZWN0KGdhcFJlY3QsIHNlbEJydXNoKTsKLSAgICB9Ci0gICAgcmV0dXJu
IGdhcFJlY3Q7Ci19Ci0KLUludFJlY3QgUmVuZGVyQmxvY2s6OmZpbGxMZWZ0U2VsZWN0aW9uR2Fw
KFJlbmRlck9iamVjdCogc2VsT2JqLCBpbnQgeFBvcywgaW50IHlQb3MsIGludCBoZWlnaHQsIFJl
bmRlckJsb2NrKiByb290QmxvY2ssIGludCBibG9ja1gsIGludCBibG9ja1ksIGludCB0eCwgaW50
IHR5LCBjb25zdCBQYWludEluZm8qIGkpCi17Ci0gICAgaW50IHRvcCA9IHlQb3MgKyB0eTsKLSAg
ICBpbnQgbGVmdCA9IGJsb2NrWCArIGtNYXgobGVmdFNlbGVjdGlvbk9mZnNldChyb290QmxvY2ss
IHlQb3MpLCBsZWZ0U2VsZWN0aW9uT2Zmc2V0KHJvb3RCbG9jaywgeVBvcyArIGhlaWdodCkpOwot
ICAgIGludCB3aWR0aCA9IHR4ICsgeFBvcyAtIGxlZnQ7Ci0gICAgaWYgKHdpZHRoIDw9IDApCi0g
ICAgICAgIHJldHVybiBJbnRSZWN0KCk7Ci0KLSAgICBJbnRSZWN0IGdhcFJlY3QobGVmdCwgdG9w
LCB3aWR0aCwgaGVpZ2h0KTsKLSAgICBpZiAoaSkgewotICAgICAgICAvLyBQYWludCB0aGUgcmVj
dC4KLSAgICAgICAgUUJydXNoIHNlbEJydXNoKHNlbE9iai0+c2VsZWN0aW9uQ29sb3IoaS0+cCkp
OwotICAgICAgICBpLT5wLT5maWxsUmVjdChnYXBSZWN0LCBzZWxCcnVzaCk7Ci0gICAgfQotICAg
IHJldHVybiBnYXBSZWN0OwotfQotCi1JbnRSZWN0IFJlbmRlckJsb2NrOjpmaWxsUmlnaHRTZWxl
Y3Rpb25HYXAoUmVuZGVyT2JqZWN0KiBzZWxPYmosIGludCB4UG9zLCBpbnQgeVBvcywgaW50IGhl
aWdodCwgUmVuZGVyQmxvY2sqIHJvb3RCbG9jaywgaW50IGJsb2NrWCwgaW50IGJsb2NrWSwgaW50
IHR4LCBpbnQgdHksIGNvbnN0IFBhaW50SW5mbyogaSkKLXsKLSAgICBpbnQgbGVmdCA9IHhQb3Mg
KyB0eDsKLSAgICBpbnQgdG9wID0geVBvcyArIHR5OwotICAgIGludCByaWdodCA9IGJsb2NrWCAr
IGtNaW4ocmlnaHRTZWxlY3Rpb25PZmZzZXQocm9vdEJsb2NrLCB5UG9zKSwgcmlnaHRTZWxlY3Rp
b25PZmZzZXQocm9vdEJsb2NrLCB5UG9zICsgaGVpZ2h0KSk7Ci0gICAgaW50IHdpZHRoID0gcmln
aHQgLSBsZWZ0OwotICAgIGlmICh3aWR0aCA8PSAwKQotICAgICAgICByZXR1cm4gSW50UmVjdCgp
OwotCi0gICAgSW50UmVjdCBnYXBSZWN0KGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCk7Ci0gICAg
aWYgKGkpIHsKLSAgICAgICAgLy8gUGFpbnQgdGhlIHJlY3QuCi0gICAgICAgIFFCcnVzaCBzZWxC
cnVzaChzZWxPYmotPnNlbGVjdGlvbkNvbG9yKGktPnApKTsKLSAgICAgICAgaS0+cC0+ZmlsbFJl
Y3QoZ2FwUmVjdCwgc2VsQnJ1c2gpOwotICAgIH0KLSAgICByZXR1cm4gZ2FwUmVjdDsKLX0KLQot
dm9pZCBSZW5kZXJCbG9jazo6Z2V0SG9yaXpvbnRhbFNlbGVjdGlvbkdhcEluZm8oU2VsZWN0aW9u
U3RhdGUgc3RhdGUsIGJvb2wmIGxlZnRHYXAsIGJvb2wmIHJpZ2h0R2FwKQotewotICAgIGJvb2wg
bHRyID0gc3R5bGUoKS0+ZGlyZWN0aW9uKCkgPT0gTFRSOwotICAgIGxlZnRHYXAgPSAoc3RhdGUg
PT0gUmVuZGVyT2JqZWN0OjpTZWxlY3Rpb25JbnNpZGUpIHx8Ci0gICAgICAgICAgICAgIChzdGF0
ZSA9PSBSZW5kZXJPYmplY3Q6OlNlbGVjdGlvbkVuZCAmJiBsdHIpIHx8Ci0gICAgICAgICAgICAg
IChzdGF0ZSA9PSBSZW5kZXJPYmplY3Q6OlNlbGVjdGlvblN0YXJ0ICYmICFsdHIpOwotICAgIHJp
Z2h0R2FwID0gKHN0YXRlID09IFJlbmRlck9iamVjdDo6U2VsZWN0aW9uSW5zaWRlKSB8fAotICAg
ICAgICAgICAgICAgKHN0YXRlID09IFJlbmRlck9iamVjdDo6U2VsZWN0aW9uU3RhcnQgJiYgbHRy
KSB8fAotICAgICAgICAgICAgICAgKHN0YXRlID09IFJlbmRlck9iamVjdDo6U2VsZWN0aW9uRW5k
ICYmICFsdHIpOwotfQotCi1pbnQgUmVuZGVyQmxvY2s6OmxlZnRTZWxlY3Rpb25PZmZzZXQoUmVu
ZGVyQmxvY2sqIHJvb3RCbG9jaywgaW50IHkpCi17Ci0gICAgaW50IGxlZnQgPSBsZWZ0T2Zmc2V0
KHkpOwotICAgIGlmIChsZWZ0ID09IGJvcmRlckxlZnQoKSArIHBhZGRpbmdMZWZ0KCkpIHsKLSAg
ICAgICAgaWYgKHJvb3RCbG9jayAhPSB0aGlzKQotICAgICAgICAgICAgLy8gVGhlIGJvcmRlciBj
YW4gcG90ZW50aWFsbHkgYmUgZnVydGhlciBleHRlbmRlZCBieSBvdXIgY29udGFpbmluZ0Jsb2Nr
KCkuCi0gICAgICAgICAgICByZXR1cm4gY29udGFpbmluZ0Jsb2NrKCktPmxlZnRTZWxlY3Rpb25P
ZmZzZXQocm9vdEJsb2NrLCB5ICsgeVBvcygpKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQot
ICAgIGVsc2UgewotICAgICAgICBSZW5kZXJCbG9jayogY2IgPSB0aGlzOwotICAgICAgICB3aGls
ZSAoY2IgIT0gcm9vdEJsb2NrKSB7Ci0gICAgICAgICAgICBsZWZ0ICs9IGNiLT54UG9zKCk7Ci0g
ICAgICAgICAgICBjYiA9IGNiLT5jb250YWluaW5nQmxvY2soKTsKLSAgICAgICAgfQotICAgIH0K
LSAgICAKLSAgICByZXR1cm4gbGVmdDsKLX0KLQotaW50IFJlbmRlckJsb2NrOjpyaWdodFNlbGVj
dGlvbk9mZnNldChSZW5kZXJCbG9jayogcm9vdEJsb2NrLCBpbnQgeSkKLXsKLSAgICBpbnQgcmln
aHQgPSByaWdodE9mZnNldCh5KTsKLSAgICBpZiAocmlnaHQgPT0gKGNvbnRlbnRXaWR0aCgpICsg
KGJvcmRlckxlZnQoKSArIHBhZGRpbmdMZWZ0KCkpKSkgewotICAgICAgICBpZiAocm9vdEJsb2Nr
ICE9IHRoaXMpCi0gICAgICAgICAgICAvLyBUaGUgYm9yZGVyIGNhbiBwb3RlbnRpYWxseSBiZSBm
dXJ0aGVyIGV4dGVuZGVkIGJ5IG91ciBjb250YWluaW5nQmxvY2soKS4KLSAgICAgICAgICAgIHJl
dHVybiBjb250YWluaW5nQmxvY2soKS0+cmlnaHRTZWxlY3Rpb25PZmZzZXQocm9vdEJsb2NrLCB5
ICsgeVBvcygpKTsKLSAgICAgICAgcmV0dXJuIHdpZHRoKCk7Ci0gICAgfQotICAgIGVsc2Ugewot
ICAgICAgICBSZW5kZXJCbG9jayogY2IgPSB0aGlzOwotICAgICAgICB3aGlsZSAoY2IgIT0gcm9v
dEJsb2NrKSB7Ci0gICAgICAgICAgICByaWdodCArPSBjYi0+eFBvcygpOwotICAgICAgICAgICAg
Y2IgPSBjYi0+Y29udGFpbmluZ0Jsb2NrKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJu
IHJpZ2h0OwotfQotCi12b2lkIFJlbmRlckJsb2NrOjppbnNlcnRQb3NpdGlvbmVkT2JqZWN0KFJl
bmRlck9iamVjdCAqbykKLXsKLSAgICAvLyBDcmVhdGUgdGhlIGxpc3Qgb2Ygc3BlY2lhbCBvYmpl
Y3RzIGlmIHdlIGRvbid0IGFsZWFkeSBoYXZlIG9uZQotICAgIGlmICghbV9wb3NpdGlvbmVkT2Jq
ZWN0cykgewotICAgICAgICBtX3Bvc2l0aW9uZWRPYmplY3RzID0gbmV3IFFQdHJMaXN0PFJlbmRl
ck9iamVjdD47Ci0gICAgICAgIG1fcG9zaXRpb25lZE9iamVjdHMtPnNldEF1dG9EZWxldGUoZmFs
c2UpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgLy8gRG9uJ3QgaW5zZXJ0IHRoZSBvYmpl
Y3QgYWdhaW4gaWYgaXQncyBhbHJlYWR5IGluIHRoZSBsaXN0Ci0gICAgICAgIFFQdHJMaXN0SXRl
cmF0b3I8UmVuZGVyT2JqZWN0PiBpdCgqbV9wb3NpdGlvbmVkT2JqZWN0cyk7Ci0gICAgICAgIFJl
bmRlck9iamVjdCogZjsKLSAgICAgICAgd2hpbGUgKCAoZiA9IGl0LmN1cnJlbnQoKSkgKSB7Ci0g
ICAgICAgICAgICBpZiAoZiA9PSBvKSByZXR1cm47Ci0gICAgICAgICAgICArK2l0OwotICAgICAg
ICB9Ci0gICAgfQotCi0gICAgbV9wb3NpdGlvbmVkT2JqZWN0cy0+YXBwZW5kKG8pOwotfQotCi12
b2lkIFJlbmRlckJsb2NrOjpyZW1vdmVQb3NpdGlvbmVkT2JqZWN0KFJlbmRlck9iamVjdCAqbykK
LXsKLSAgICBpZiAobV9wb3NpdGlvbmVkT2JqZWN0cykgewotICAgICAgICBRUHRyTGlzdEl0ZXJh
dG9yPFJlbmRlck9iamVjdD4gaXQoKm1fcG9zaXRpb25lZE9iamVjdHMpOwotICAgICAgICB3aGls
ZSAoaXQuY3VycmVudCgpKSB7Ci0gICAgICAgICAgICBpZiAoaXQuY3VycmVudCgpID09IG8pCi0g
ICAgICAgICAgICAgICAgbV9wb3NpdGlvbmVkT2JqZWN0cy0+cmVtb3ZlUmVmKGl0LmN1cnJlbnQo
KSk7Ci0gICAgICAgICAgICArK2l0OwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIFJlbmRl
ckJsb2NrOjppbnNlcnRGbG9hdGluZ09iamVjdChSZW5kZXJPYmplY3QgKm8pCi17Ci0gICAgLy8g
Q3JlYXRlIHRoZSBsaXN0IG9mIHNwZWNpYWwgb2JqZWN0cyBpZiB3ZSBkb24ndCBhbGVhZHkgaGF2
ZSBvbmUKLSAgICBpZiAoIW1fZmxvYXRpbmdPYmplY3RzKSB7Ci0gICAgICAgIG1fZmxvYXRpbmdP
YmplY3RzID0gbmV3IFFQdHJMaXN0PEZsb2F0aW5nT2JqZWN0PjsKLSAgICAgICAgbV9mbG9hdGlu
Z09iamVjdHMtPnNldEF1dG9EZWxldGUodHJ1ZSk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAg
ICAvLyBEb24ndCBpbnNlcnQgdGhlIG9iamVjdCBhZ2FpbiBpZiBpdCdzIGFscmVhZHkgaW4gdGhl
IGxpc3QKLSAgICAgICAgUVB0ckxpc3RJdGVyYXRvcjxGbG9hdGluZ09iamVjdD4gaXQoKm1fZmxv
YXRpbmdPYmplY3RzKTsKLSAgICAgICAgRmxvYXRpbmdPYmplY3QqIGY7Ci0gICAgICAgIHdoaWxl
ICggKGYgPSBpdC5jdXJyZW50KCkpICkgewotICAgICAgICAgICAgaWYgKGYtPm5vZGUgPT0gbykg
cmV0dXJuOwotICAgICAgICAgICAgKytpdDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIENy
ZWF0ZSB0aGUgc3BlY2lhbCBvYmplY3QgZW50cnkgJiBhcHBlbmQgaXQgdG8gdGhlIGxpc3QKLQot
ICAgIEZsb2F0aW5nT2JqZWN0ICpuZXdPYmo7Ci0gICAgaWYgKG8tPmlzRmxvYXRpbmcoKSkgewot
ICAgICAgICAvLyBmbG9hdGluZyBvYmplY3QKLSAgICAgICAgby0+bGF5b3V0SWZOZWVkZWQoKTsK
LQotICAgICAgICBpZihvLT5zdHlsZSgpLT5mbG9hdGluZygpID09IEZMRUZUKQotICAgICAgICAg
ICAgbmV3T2JqID0gbmV3IEZsb2F0aW5nT2JqZWN0KEZsb2F0aW5nT2JqZWN0OjpGbG9hdExlZnQp
OwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBuZXdPYmogPSBuZXcgRmxvYXRpbmdPYmplY3Qo
RmxvYXRpbmdPYmplY3Q6OkZsb2F0UmlnaHQpOwotCi0gICAgICAgIG5ld09iai0+c3RhcnRZID0g
LTE7Ci0gICAgICAgIG5ld09iai0+ZW5kWSA9IC0xOwotICAgICAgICBuZXdPYmotPndpZHRoID0g
by0+d2lkdGgoKSArIG8tPm1hcmdpbkxlZnQoKSArIG8tPm1hcmdpblJpZ2h0KCk7Ci0gICAgICAg
IG5ld09iai0+bm9QYWludCA9IG8tPmxheWVyKCk7IC8vIElmIGEgbGF5ZXIgZXhpc3RzLCB0aGUg
ZmxvYXQgd2lsbCBwYWludCBpdHNlbGYuICBPdGhlcndpc2Ugc29tZW9uZSBlbHNlIHdpbGwuCi0g
ICAgfQotICAgIGVsc2UgewotICAgICAgICAvLyBXZSBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUsIGFz
IGluc2VydEZsb2F0aW5nT2JqZWN0KCkgc2hvdWxkIG9ubHkgZXZlciBiZSBjYWxsZWQgd2l0aCBm
bG9hdGluZwotICAgICAgICAvLyBvYmplY3RzLgotICAgICAgICBLSFRNTEFzc2VydChmYWxzZSk7
Ci0gICAgICAgIG5ld09iaiA9IDA7IC8vIGtlZXAgZ2NjJ3MgdW5pbml0aWFsaXplZCB2YXJpYWJs
ZSB3YXJuaW5ncyBoYXBweQotICAgIH0KLQotICAgIG5ld09iai0+bm9kZSA9IG87Ci0KLSAgICBt
X2Zsb2F0aW5nT2JqZWN0cy0+YXBwZW5kKG5ld09iaik7Ci19Ci0KLXZvaWQgUmVuZGVyQmxvY2s6
OnJlbW92ZUZsb2F0aW5nT2JqZWN0KFJlbmRlck9iamVjdCAqbykKLXsKLSAgICBpZiAobV9mbG9h
dGluZ09iamVjdHMpIHsKLSAgICAgICAgUVB0ckxpc3RJdGVyYXRvcjxGbG9hdGluZ09iamVjdD4g
aXQoKm1fZmxvYXRpbmdPYmplY3RzKTsKLSAgICAgICAgd2hpbGUgKGl0LmN1cnJlbnQoKSkgewot
ICAgICAgICAgICAgaWYgKGl0LmN1cnJlbnQoKS0+bm9kZSA9PSBvKQotICAgICAgICAgICAgICAg
IG1fZmxvYXRpbmdPYmplY3RzLT5yZW1vdmVSZWYoaXQuY3VycmVudCgpKTsKLSAgICAgICAgICAg
ICsraXQ7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgUmVuZGVyQmxvY2s6OnBvc2l0aW9u
TmV3RmxvYXRzKCkKLXsKLSAgICBpZighbV9mbG9hdGluZ09iamVjdHMpIHJldHVybjsKLSAgICBG
bG9hdGluZ09iamVjdCAqZiA9IG1fZmxvYXRpbmdPYmplY3RzLT5nZXRMYXN0KCk7Ci0gICAgaWYo
IWYgfHwgZi0+c3RhcnRZICE9IC0xKSByZXR1cm47Ci0gICAgRmxvYXRpbmdPYmplY3QgKmxhc3RG
bG9hdDsKLSAgICB3aGlsZSgxKQotICAgIHsKLSAgICAgICAgbGFzdEZsb2F0ID0gbV9mbG9hdGlu
Z09iamVjdHMtPnByZXYoKTsKLSAgICAgICAgaWYgKCFsYXN0RmxvYXQgfHwgbGFzdEZsb2F0LT5z
dGFydFkgIT0gLTEpIHsKLSAgICAgICAgICAgIG1fZmxvYXRpbmdPYmplY3RzLT5uZXh0KCk7Ci0g
ICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBmID0gbGFzdEZsb2F0OwotICAg
IH0KLQotCi0gICAgaW50IHkgPSBtX2hlaWdodDsKLQotCi0gICAgLy8gdGhlIGZsb2F0IGNhbiBu
b3Qgc3RhcnQgYWJvdmUgdGhlIHkgcG9zaXRpb24gb2YgdGhlIGxhc3QgcG9zaXRpb25lZCBmbG9h
dC4KLSAgICBpZihsYXN0RmxvYXQgJiYgbGFzdEZsb2F0LT5zdGFydFkgPiB5KQotICAgICAgICB5
ID0gbGFzdEZsb2F0LT5zdGFydFk7Ci0KLSAgICB3aGlsZShmKQotICAgIHsKLSAgICAgICAgLy9z
a2lwIGVsZW1lbnRzIGNvcGllZCBmcm9tIGVsc2V3aGVyZSBhbmQgcG9zaXRpb25lZCBlbGVtZW50
cwotICAgICAgICBpZiAoZi0+bm9kZS0+Y29udGFpbmluZ0Jsb2NrKCkhPXRoaXMpCi0gICAgICAg
IHsKLSAgICAgICAgICAgIGYgPSBtX2Zsb2F0aW5nT2JqZWN0cy0+bmV4dCgpOwotICAgICAgICAg
ICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBSZW5kZXJPYmplY3QgKm8gPSBmLT5u
b2RlOwotICAgICAgICBpbnQgX2hlaWdodCA9IG8tPmhlaWdodCgpICsgby0+bWFyZ2luVG9wKCkg
KyBvLT5tYXJnaW5Cb3R0b20oKTsKLQotICAgICAgICBpbnQgcm8gPSByaWdodE9mZnNldCgpOyAv
LyBDb25zdGFudCBwYXJ0IG9mIHJpZ2h0IG9mZnNldC4KLSAgICAgICAgaW50IGxvID0gbGVmdE9m
ZnNldCgpOyAvLyBDb25zdGF0IHBhcnQgb2YgbGVmdCBvZmZzZXQuCi0gICAgICAgIGludCBmd2lk
dGggPSBmLT53aWR0aDsgLy8gVGhlIHdpZHRoIHdlIGxvb2sgZm9yLgotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIC8va2REZWJ1ZyggNjA0MCApIDw8ICIgT2JqZWN0IHdpZHRoOiAiIDw8
IGZ3aWR0aCA8PCAiIGF2YWlsYWJsZSB3aWR0aDogIiA8PCBybyAtIGxvIDw8IGVuZGw7Ci0gICAg
ICAgIGlmIChybyAtIGxvIDwgZndpZHRoKQotICAgICAgICAgICAgZndpZHRoID0gcm8gLSBsbzsg
Ly8gTmV2ZXIgbG9vayBmb3IgbW9yZSB0aGFuIHdoYXQgd2lsbCBiZSBhdmFpbGFibGUuCi0gICAg
ICAgIAotICAgICAgICBpbnQgb2xkQ2hpbGRYID0gby0+eFBvcygpOwotICAgICAgICBpbnQgb2xk
Q2hpbGRZID0gby0+eVBvcygpOwotICAgICAgICAKLSAgICAgICAgaWYgKCBvLT5zdHlsZSgpLT5j
bGVhcigpICYgQ0xFRlQgKQotICAgICAgICAgICAgeSA9IGtNYXgoIGxlZnRCb3R0b20oKSwgeSAp
OwotICAgICAgICBpZiAoIG8tPnN0eWxlKCktPmNsZWFyKCkgJiBDUklHSFQgKQotICAgICAgICAg
ICAgeSA9IGtNYXgoIHJpZ2h0Qm90dG9tKCksIHkgKTsKLQotICAgICAgICBpZiAoby0+c3R5bGUo
KS0+ZmxvYXRpbmcoKSA9PSBGTEVGVCkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGhlaWdo
dFJlbWFpbmluZ0xlZnQgPSAxOwotICAgICAgICAgICAgaW50IGhlaWdodFJlbWFpbmluZ1JpZ2h0
ID0gMTsKLSAgICAgICAgICAgIGludCBmeCA9IGxlZnRSZWxPZmZzZXQoeSxsbywgZmFsc2UsICZo
ZWlnaHRSZW1haW5pbmdMZWZ0KTsKLSAgICAgICAgICAgIHdoaWxlIChyaWdodFJlbE9mZnNldCh5
LHJvLCBmYWxzZSwgJmhlaWdodFJlbWFpbmluZ1JpZ2h0KS1meCA8IGZ3aWR0aCkKLSAgICAgICAg
ICAgIHsKLSAgICAgICAgICAgICAgICB5ICs9IGtNaW4oIGhlaWdodFJlbWFpbmluZ0xlZnQsIGhl
aWdodFJlbWFpbmluZ1JpZ2h0ICk7Ci0gICAgICAgICAgICAgICAgZnggPSBsZWZ0UmVsT2Zmc2V0
KHksbG8sIGZhbHNlLCAmaGVpZ2h0UmVtYWluaW5nTGVmdCk7Ci0gICAgICAgICAgICB9Ci0gICAg
ICAgICAgICBpZiAoZng8MCkgZng9MDsKLSAgICAgICAgICAgIGYtPmxlZnQgPSBmeDsKLSAgICAg
ICAgICAgIC8va2REZWJ1ZyggNjA0MCApIDw8ICJwb3NpdGlvbmluZyBsZWZ0IGFsaWduZWQgZmxv
YXQgYXQgKCIgPDwgZnggKyBvLT5tYXJnaW5MZWZ0KCkgIDw8ICIvIiA8PCB5ICsgby0+bWFyZ2lu
VG9wKCkgPDwgIikgZng9IiA8PCBmeCA8PCBlbmRsOwotICAgICAgICAgICAgby0+c2V0UG9zKGZ4
ICsgby0+bWFyZ2luTGVmdCgpLCB5ICsgby0+bWFyZ2luVG9wKCkpOwotICAgICAgICB9Ci0gICAg
ICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGhlaWdodFJlbWFpbmluZ0xlZnQg
PSAxOwotICAgICAgICAgICAgaW50IGhlaWdodFJlbWFpbmluZ1JpZ2h0ID0gMTsKLSAgICAgICAg
ICAgIGludCBmeCA9IHJpZ2h0UmVsT2Zmc2V0KHkscm8sIGZhbHNlLCAmaGVpZ2h0UmVtYWluaW5n
UmlnaHQpOwotICAgICAgICAgICAgd2hpbGUgKGZ4IC0gbGVmdFJlbE9mZnNldCh5LGxvLCBmYWxz
ZSwgJmhlaWdodFJlbWFpbmluZ0xlZnQpIDwgZndpZHRoKQotICAgICAgICAgICAgewotICAgICAg
ICAgICAgICAgIHkgKz0ga01pbihoZWlnaHRSZW1haW5pbmdMZWZ0LCBoZWlnaHRSZW1haW5pbmdS
aWdodCk7Ci0gICAgICAgICAgICAgICAgZnggPSByaWdodFJlbE9mZnNldCh5LHJvLCBmYWxzZSwg
JmhlaWdodFJlbWFpbmluZ1JpZ2h0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChm
eDxmLT53aWR0aCkgZng9Zi0+d2lkdGg7Ci0gICAgICAgICAgICBmLT5sZWZ0ID0gZnggLSBmLT53
aWR0aDsKLSAgICAgICAgICAgIC8va2REZWJ1ZyggNjA0MCApIDw8ICJwb3NpdGlvbmluZyByaWdo
dCBhbGlnbmVkIGZsb2F0IGF0ICgiIDw8IGZ4IC0gby0+bWFyZ2luUmlnaHQoKSAtIG8tPndpZHRo
KCkgPDwgIi8iIDw8IHkgKyBvLT5tYXJnaW5Ub3AoKSA8PCAiKSIgPDwgZW5kbDsKLSAgICAgICAg
ICAgIG8tPnNldFBvcyhmeCAtIG8tPm1hcmdpblJpZ2h0KCkgLSBvLT53aWR0aCgpLCB5ICsgby0+
bWFyZ2luVG9wKCkpOwotICAgICAgICB9Ci0gICAgICAgIGYtPnN0YXJ0WSA9IHk7Ci0gICAgICAg
IGYtPmVuZFkgPSBmLT5zdGFydFkgKyBfaGVpZ2h0OwotCi0gICAgICAgIC8vIElmIHRoZSBjaGls
ZCBtb3ZlZCwgd2UgaGF2ZSB0byByZXBhaW50IGl0LgotICAgICAgICBpZiAoby0+Y2hlY2tGb3JS
ZXBhaW50RHVyaW5nTGF5b3V0KCkpCi0gICAgICAgICAgICBvLT5yZXBhaW50RHVyaW5nTGF5b3V0
SWZNb3ZlZChvbGRDaGlsZFgsIG9sZENoaWxkWSk7Ci0KLSAgICAgICAgLy9rZERlYnVnKCA2MDQw
ICkgPDwgImZsb2F0aW5nT2JqZWN0IHgveT0gKCIgPDwgZi0+bGVmdCA8PCAiLyIgPDwgZi0+c3Rh
cnRZIDw8ICItIiA8PCBmLT53aWR0aCA8PCAiLyIgPDwgZi0+ZW5kWSAtIGYtPnN0YXJ0WSA8PCAi
KSIgPDwgZW5kbDsKLQotICAgICAgICBmID0gbV9mbG9hdGluZ09iamVjdHMtPm5leHQoKTsKLSAg
ICB9Ci19Ci0KLXZvaWQgUmVuZGVyQmxvY2s6Om5ld0xpbmUoKQotewotICAgIHBvc2l0aW9uTmV3
RmxvYXRzKCk7Ci0gICAgLy8gc2V0IHkgcG9zaXRpb24KLSAgICBpbnQgbmV3WSA9IDA7Ci0gICAg
c3dpdGNoKG1fY2xlYXJTdGF0dXMpCi0gICAgewotICAgICAgICBjYXNlIENMRUZUOgotICAgICAg
ICAgICAgbmV3WSA9IGxlZnRCb3R0b20oKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBj
YXNlIENSSUdIVDoKLSAgICAgICAgICAgIG5ld1kgPSByaWdodEJvdHRvbSgpOwotICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ0JPVEg6Ci0gICAgICAgICAgICBuZXdZID0gZmxvYXRC
b3R0b20oKTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAg
ICBpZihtX2hlaWdodCA8IG5ld1kpCi0gICAgewotICAgICAgICAvLyAgICAgIGtkRGVidWcoIDYw
NDAgKSA8PCAiYWRqdXN0aW5nIHkgcG9zaXRpb24iIDw8IGVuZGw7Ci0gICAgICAgIG1faGVpZ2h0
ID0gbmV3WTsKLSAgICB9Ci0gICAgbV9jbGVhclN0YXR1cyA9IENOT05FOwotfQotCi1pbnQKLVJl
bmRlckJsb2NrOjpsZWZ0T2Zmc2V0KCkgY29uc3QKLXsKLSAgICByZXR1cm4gYm9yZGVyTGVmdCgp
K3BhZGRpbmdMZWZ0KCk7Ci19Ci0KLWludAotUmVuZGVyQmxvY2s6OmxlZnRSZWxPZmZzZXQoaW50
IHksIGludCBmaXhlZE9mZnNldCwgYm9vbCBhcHBseVRleHRJbmRlbnQsCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICBpbnQgKmhlaWdodFJlbWFpbmluZyApIGNvbnN0Ci17Ci0gICAgaW50IGxl
ZnQgPSBmaXhlZE9mZnNldDsKLSAgICBpZiAobV9mbG9hdGluZ09iamVjdHMpIHsKLSAgICAgICAg
aWYgKCBoZWlnaHRSZW1haW5pbmcgKSAqaGVpZ2h0UmVtYWluaW5nID0gMTsKLSAgICAgICAgRmxv
YXRpbmdPYmplY3QqIHI7Ci0gICAgICAgIFFQdHJMaXN0SXRlcmF0b3I8RmxvYXRpbmdPYmplY3Q+
IGl0KCptX2Zsb2F0aW5nT2JqZWN0cyk7Ci0gICAgICAgIGZvciAoIDsgKHIgPSBpdC5jdXJyZW50
KCkpOyArK2l0ICkKLSAgICAgICAgewotICAgICAgICAgICAgLy9rZERlYnVnKCA2MDQwICkgPDwo
dm9pZCAqKXRoaXMgPDwgIiBsZWZ0OiBzeSwgZXksIHgsIHcgIiA8PCByLT5zdGFydFkgPDwgIiwi
IDw8IHItPmVuZFkgPDwgIiwiIDw8IHItPmxlZnQgPDwgIiwiIDw8IHItPndpZHRoIDw8ICIgIiA8
PCBlbmRsOwotICAgICAgICAgICAgaWYgKHItPnN0YXJ0WSA8PSB5ICYmIHItPmVuZFkgPiB5ICYm
Ci0gICAgICAgICAgICAgICAgci0+dHlwZSA9PSBGbG9hdGluZ09iamVjdDo6RmxvYXRMZWZ0ICYm
Ci0gICAgICAgICAgICAgICAgci0+bGVmdCArIHItPndpZHRoID4gbGVmdCkgewotICAgICAgICAg
ICAgICAgIGxlZnQgPSByLT5sZWZ0ICsgci0+d2lkdGg7Ci0gICAgICAgICAgICAgICAgaWYgKCBo
ZWlnaHRSZW1haW5pbmcgKSAqaGVpZ2h0UmVtYWluaW5nID0gci0+ZW5kWSAtIHk7Ci0gICAgICAg
ICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoYXBwbHlUZXh0SW5kZW50ICYmIG1f
Zmlyc3RMaW5lICYmIHN0eWxlKCktPmRpcmVjdGlvbigpID09IExUUikgewotICAgICAgICBpbnQg
Y3c9MDsKLSAgICAgICAgaWYgKHN0eWxlKCktPnRleHRJbmRlbnQoKS5pc1BlcmNlbnQoKSkKLSAg
ICAgICAgICAgIGN3ID0gY29udGFpbmluZ0Jsb2NrKCktPmNvbnRlbnRXaWR0aCgpOwotICAgICAg
ICBsZWZ0ICs9IHN0eWxlKCktPnRleHRJbmRlbnQoKS5taW5XaWR0aChjdyk7Ci0gICAgfQotCi0g
ICAgLy9rZERlYnVnKCA2MDQwICkgPDwgImxlZnRPZmZzZXQoIiA8PCB5IDw8ICIpID0gIiA8PCBs
ZWZ0IDw8IGVuZGw7Ci0gICAgcmV0dXJuIGxlZnQ7Ci19Ci0KLWludAotUmVuZGVyQmxvY2s6OnJp
Z2h0T2Zmc2V0KCkgY29uc3QKLXsKLSAgICBpbnQgcmlnaHQgPSBtX3dpZHRoIC0gYm9yZGVyUmln
aHQoKSAtIHBhZGRpbmdSaWdodCgpOwotICAgIGlmIChpbmNsdWRlU2Nyb2xsYmFyU2l6ZSgpKQot
ICAgICAgICByaWdodCAtPSBtX2xheWVyLT52ZXJ0aWNhbFNjcm9sbGJhcldpZHRoKCk7Ci0gICAg
cmV0dXJuIHJpZ2h0OwotfQotCi1pbnQKLVJlbmRlckJsb2NrOjpyaWdodFJlbE9mZnNldChpbnQg
eSwgaW50IGZpeGVkT2Zmc2V0LCBib29sIGFwcGx5VGV4dEluZGVudCwKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBpbnQgKmhlaWdodFJlbWFpbmluZyApIGNvbnN0Ci17Ci0gICAgaW50IHJp
Z2h0ID0gZml4ZWRPZmZzZXQ7Ci0KLSAgICBpZiAobV9mbG9hdGluZ09iamVjdHMpIHsKLSAgICAg
ICAgaWYgKGhlaWdodFJlbWFpbmluZykgKmhlaWdodFJlbWFpbmluZyA9IDE7Ci0gICAgICAgIEZs
b2F0aW5nT2JqZWN0KiByOwotICAgICAgICBRUHRyTGlzdEl0ZXJhdG9yPEZsb2F0aW5nT2JqZWN0
PiBpdCgqbV9mbG9hdGluZ09iamVjdHMpOwotICAgICAgICBmb3IgKCA7IChyID0gaXQuY3VycmVu
dCgpKTsgKytpdCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8va2REZWJ1ZyggNjA0MCApIDw8
ICJyaWdodDogc3ksIGV5LCB4LCB3ICIgPDwgci0+c3RhcnRZIDw8ICIsIiA8PCByLT5lbmRZIDw8
ICIsIiA8PCByLT5sZWZ0IDw8ICIsIiA8PCByLT53aWR0aCA8PCAiICIgPDwgZW5kbDsKLSAgICAg
ICAgICAgIGlmIChyLT5zdGFydFkgPD0geSAmJiByLT5lbmRZID4geSAmJgotICAgICAgICAgICAg
ICAgIHItPnR5cGUgPT0gRmxvYXRpbmdPYmplY3Q6OkZsb2F0UmlnaHQgJiYKLSAgICAgICAgICAg
ICAgICByLT5sZWZ0IDwgcmlnaHQpIHsKLSAgICAgICAgICAgICAgICByaWdodCA9IHItPmxlZnQ7
Ci0gICAgICAgICAgICAgICAgaWYgKCBoZWlnaHRSZW1haW5pbmcgKSAqaGVpZ2h0UmVtYWluaW5n
ID0gci0+ZW5kWSAtIHk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0g
ICAgaWYgKGFwcGx5VGV4dEluZGVudCAmJiBtX2ZpcnN0TGluZSAmJiBzdHlsZSgpLT5kaXJlY3Rp
b24oKSA9PSBSVEwpIHsKLSAgICAgICAgaW50IGN3PTA7Ci0gICAgICAgIGlmIChzdHlsZSgpLT50
ZXh0SW5kZW50KCkuaXNQZXJjZW50KCkpCi0gICAgICAgICAgICBjdyA9IGNvbnRhaW5pbmdCbG9j
aygpLT5jb250ZW50V2lkdGgoKTsKLSAgICAgICAgcmlnaHQgLT0gc3R5bGUoKS0+dGV4dEluZGVu
dCgpLm1pbldpZHRoKGN3KTsKLSAgICB9Ci0gICAgCi0gICAgLy9rZERlYnVnKCA2MDQwICkgPDwg
InJpZ2h0T2Zmc2V0KCIgPDwgeSA8PCAiKSA9ICIgPDwgcmlnaHQgPDwgZW5kbDsKLSAgICByZXR1
cm4gcmlnaHQ7Ci19Ci0KLWludAotUmVuZGVyQmxvY2s6OmxpbmVXaWR0aChpbnQgeSkgY29uc3QK
LXsKLSAgICAvL2tkRGVidWcoIDYwNDAgKSA8PCAibGluZVdpZHRoKCIgPDwgeSA8PCAiKT0iIDw8
IHJpZ2h0T2Zmc2V0KHkpIC0gbGVmdE9mZnNldCh5KSA8PCBlbmRsOwotICAgIGludCByZXN1bHQg
PSByaWdodE9mZnNldCh5KSAtIGxlZnRPZmZzZXQoeSk7Ci0gICAgcmV0dXJuIChyZXN1bHQgPCAw
KSA/IDAgOiByZXN1bHQ7Ci19Ci0KLWludAotUmVuZGVyQmxvY2s6Om5lYXJlc3RGbG9hdEJvdHRv
bShpbnQgaGVpZ2h0KSBjb25zdAotewotICAgIGlmICghbV9mbG9hdGluZ09iamVjdHMpIHJldHVy
biAwOwotICAgIGludCBib3R0b20gPSAwOwotICAgIEZsb2F0aW5nT2JqZWN0KiByOwotICAgIFFQ
dHJMaXN0SXRlcmF0b3I8RmxvYXRpbmdPYmplY3Q+IGl0KCptX2Zsb2F0aW5nT2JqZWN0cyk7Ci0g
ICAgZm9yICggOyAociA9IGl0LmN1cnJlbnQoKSk7ICsraXQgKQotICAgICAgICBpZiAoci0+ZW5k
WT5oZWlnaHQgJiYgKHItPmVuZFk8Ym90dG9tIHx8IGJvdHRvbT09MCkpCi0gICAgICAgICAgICBi
b3R0b209ci0+ZW5kWTsKLSAgICByZXR1cm4ga01heChib3R0b20sIGhlaWdodCk7Ci19Ci0KLWlu
dAotUmVuZGVyQmxvY2s6OmZsb2F0Qm90dG9tKCkgY29uc3QKLXsKLSAgICBpZiAoIW1fZmxvYXRp
bmdPYmplY3RzKSByZXR1cm4gMDsKLSAgICBpbnQgYm90dG9tPTA7Ci0gICAgRmxvYXRpbmdPYmpl
Y3QqIHI7Ci0gICAgUVB0ckxpc3RJdGVyYXRvcjxGbG9hdGluZ09iamVjdD4gaXQoKm1fZmxvYXRp
bmdPYmplY3RzKTsKLSAgICBmb3IgKCA7IChyID0gaXQuY3VycmVudCgpKTsgKytpdCApCi0gICAg
ICAgIGlmIChyLT5lbmRZPmJvdHRvbSkKLSAgICAgICAgICAgIGJvdHRvbT1yLT5lbmRZOwotICAg
IHJldHVybiBib3R0b207Ci19Ci0KLUludFJlY3QgUmVuZGVyQmxvY2s6OmZsb2F0UmVjdCgpIGNv
bnN0Ci17Ci0gICAgSW50UmVjdCByZXN1bHQoYm9yZGVyQm94KCkpOwotICAgIGlmICghbV9mbG9h
dGluZ09iamVjdHMgfHwgaGFzT3ZlcmZsb3dDbGlwKCkpCi0gICAgICAgIHJldHVybiByZXN1bHQ7
Ci0gICAgRmxvYXRpbmdPYmplY3QqIHI7Ci0gICAgUVB0ckxpc3RJdGVyYXRvcjxGbG9hdGluZ09i
amVjdD4gaXQoKm1fZmxvYXRpbmdPYmplY3RzKTsKLSAgICBmb3IgKDsgKHIgPSBpdC5jdXJyZW50
KCkpOyArK2l0KSB7Ci0gICAgICAgIGlmICghci0+bm9QYWludCAmJiAhci0+bm9kZS0+bGF5ZXIo
KSkgewotICAgICAgICAgICAgLy8gQ2hlY2sgdGhpcyBmbG9hdC4KLSAgICAgICAgICAgIGludCBi
b3R0b21EZWx0YSA9IGtNYXgoMCwgci0+c3RhcnRZICsgci0+bm9kZS0+bWFyZ2luVG9wKCkgKyBy
LT5ub2RlLT5vdmVyZmxvd0hlaWdodChmYWxzZSkgLQotICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAocmVzdWx0LnkoKSArIHJlc3VsdC5oZWlnaHQoKSkpOwotICAgICAgICAg
ICAgaWYgKGJvdHRvbURlbHRhKQotICAgICAgICAgICAgICAgIHJlc3VsdC5zZXRIZWlnaHQocmVz
dWx0LmhlaWdodCgpICsgYm90dG9tRGVsdGEpOwotICAgICAgICAgICAgaW50IHJpZ2h0RGVsdGEg
PSBrTWF4KDAsIHItPmxlZnQgKyByLT5ub2RlLT5tYXJnaW5MZWZ0KCkgKyByLT5ub2RlLT5vdmVy
Zmxvd1dpZHRoKGZhbHNlKSAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
KHJlc3VsdC54KCkgKyByZXN1bHQud2lkdGgoKSkpOwotICAgICAgICAgICAgaWYgKHJpZ2h0RGVs
dGEpCi0gICAgICAgICAgICAgICAgcmVzdWx0LnNldFdpZHRoKHJlc3VsdC53aWR0aCgpICsgcmln
aHREZWx0YSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIE5vdyBjaGVjayBsZWZ0IGFu
ZCB0b3AKLSAgICAgICAgICAgIGludCB0b3BEZWx0YSA9IGtNaW4oMCwgci0+c3RhcnRZICsgci0+
bm9kZS0+bWFyZ2luVG9wKCkgLSByZXN1bHQueSgpKTsKLSAgICAgICAgICAgIGlmICh0b3BEZWx0
YSA8IDApIHsKLSAgICAgICAgICAgICAgICByZXN1bHQuc2V0WShyZXN1bHQueSgpICsgdG9wRGVs
dGEpOwotICAgICAgICAgICAgICAgIHJlc3VsdC5zZXRIZWlnaHQocmVzdWx0LmhlaWdodCgpIC0g
Mip0b3BEZWx0YSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgbGVmdERlbHRhID0g
a01pbigwLCByLT5sZWZ0ICsgci0+bm9kZS0+bWFyZ2luTGVmdCgpIC0gcmVzdWx0LngoKSk7Ci0g
ICAgICAgICAgICBpZiAodG9wRGVsdGEgPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LnNl
dFgocmVzdWx0LngoKSArIGxlZnREZWx0YSk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LnNldEhl
aWdodChyZXN1bHQud2lkdGgoKSAtIDIqbGVmdERlbHRhKTsKLSAgICAgICAgICAgIH0KLSAgICAg
ICAgfQotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLWludAotUmVuZGVyQmxvY2s6
Omxvd2VzdFBvc2l0aW9uKGJvb2wgaW5jbHVkZU92ZXJmbG93SW50ZXJpb3IsIGJvb2wgaW5jbHVk
ZVNlbGYpIGNvbnN0Ci17Ci0gICAgaW50IGJvdHRvbSA9IFJlbmRlckZsb3c6Omxvd2VzdFBvc2l0
aW9uKGluY2x1ZGVPdmVyZmxvd0ludGVyaW9yLCBpbmNsdWRlU2VsZik7Ci0gICAgaWYgKCFpbmNs
dWRlT3ZlcmZsb3dJbnRlcmlvciAmJiBoYXNPdmVyZmxvd0NsaXAoKSkKLSAgICAgICAgcmV0dXJu
IGJvdHRvbTsKLSAgICBpZiAoaW5jbHVkZVNlbGYgJiYgbV9vdmVyZmxvd0hlaWdodCA+IGJvdHRv
bSkKLSAgICAgICAgYm90dG9tID0gbV9vdmVyZmxvd0hlaWdodDsKLSAgICAKLSAgICBpZiAobV9m
bG9hdGluZ09iamVjdHMpIHsKLSAgICAgICAgRmxvYXRpbmdPYmplY3QqIHI7Ci0gICAgICAgIFFQ
dHJMaXN0SXRlcmF0b3I8RmxvYXRpbmdPYmplY3Q+IGl0KCptX2Zsb2F0aW5nT2JqZWN0cyk7Ci0g
ICAgICAgIGZvciAoIDsgKHIgPSBpdC5jdXJyZW50KCkpOyArK2l0ICkgewotICAgICAgICAgICAg
aWYgKCFyLT5ub1BhaW50IHx8IHItPm5vZGUtPmxheWVyKCkpIHsKLSAgICAgICAgICAgICAgICBp
bnQgbHAgPSByLT5zdGFydFkgKyByLT5ub2RlLT5tYXJnaW5Ub3AoKSArIHItPm5vZGUtPmxvd2Vz
dFBvc2l0aW9uKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBib3R0b20gPSBrTWF4KGJvdHRvbSwg
bHApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gRml4ZWQgcG9z
aXRpb25lZCBvYmplY3RzIGRvIG5vdCBzY3JvbGwgYW5kIHRodXMgc2hvdWxkIG5vdCBjb25zdGl0
dXRlCi0gICAgLy8gcGFydCBvZiB0aGUgbG93ZXN0IHBvc2l0aW9uLgotICAgIGlmIChtX3Bvc2l0
aW9uZWRPYmplY3RzICYmICFpc0NhbnZhcygpKSB7Ci0gICAgICAgIFJlbmRlck9iamVjdCogcjsK
LSAgICAgICAgUVB0ckxpc3RJdGVyYXRvcjxSZW5kZXJPYmplY3Q+IGl0KCptX3Bvc2l0aW9uZWRP
YmplY3RzKTsKLSAgICAgICAgZm9yICggOyAociA9IGl0LmN1cnJlbnQoKSk7ICsraXQgKSB7Ci0g
ICAgICAgICAgICBpbnQgbHAgPSByLT55UG9zKCkgKyByLT5sb3dlc3RQb3NpdGlvbihmYWxzZSk7
Ci0gICAgICAgICAgICBib3R0b20gPSBrTWF4KGJvdHRvbSwgbHApOwotICAgICAgICB9Ci0gICAg
fQotCi0gICAgaWYgKCFpbmNsdWRlU2VsZiAmJiBsYXN0TGluZUJveCgpKSB7Ci0gICAgICAgIGlu
dCBscCA9IGxhc3RMaW5lQm94KCktPnlQb3MoKSArIGxhc3RMaW5lQm94KCktPmhlaWdodCgpOwot
ICAgICAgICBib3R0b20gPSBrTWF4KGJvdHRvbSwgbHApOwotICAgIH0KLSAgICAKLSAgICByZXR1
cm4gYm90dG9tOwotfQotCi1pbnQgUmVuZGVyQmxvY2s6OnJpZ2h0bW9zdFBvc2l0aW9uKGJvb2wg
aW5jbHVkZU92ZXJmbG93SW50ZXJpb3IsIGJvb2wgaW5jbHVkZVNlbGYpIGNvbnN0Ci17Ci0gICAg
aW50IHJpZ2h0ID0gUmVuZGVyRmxvdzo6cmlnaHRtb3N0UG9zaXRpb24oaW5jbHVkZU92ZXJmbG93
SW50ZXJpb3IsIGluY2x1ZGVTZWxmKTsKLSAgICBpZiAoIWluY2x1ZGVPdmVyZmxvd0ludGVyaW9y
ICYmIGhhc092ZXJmbG93Q2xpcCgpKQotICAgICAgICByZXR1cm4gcmlnaHQ7Ci0gICAgaWYgKGlu
Y2x1ZGVTZWxmICYmIG1fb3ZlcmZsb3dXaWR0aCA+IHJpZ2h0KQotICAgICAgICByaWdodCA9IG1f
b3ZlcmZsb3dXaWR0aDsKLSAgICAKLSAgICBpZiAobV9mbG9hdGluZ09iamVjdHMpIHsKLSAgICAg
ICAgRmxvYXRpbmdPYmplY3QqIHI7Ci0gICAgICAgIFFQdHJMaXN0SXRlcmF0b3I8RmxvYXRpbmdP
YmplY3Q+IGl0KCptX2Zsb2F0aW5nT2JqZWN0cyk7Ci0gICAgICAgIGZvciAoIDsgKHIgPSBpdC5j
dXJyZW50KCkpOyArK2l0ICkgewotICAgICAgICAgICAgaWYgKCFyLT5ub1BhaW50IHx8IHItPm5v
ZGUtPmxheWVyKCkpIHsKLSAgICAgICAgICAgICAgICBpbnQgcnAgPSByLT5sZWZ0ICsgci0+bm9k
ZS0+bWFyZ2luTGVmdCgpICsgci0+bm9kZS0+cmlnaHRtb3N0UG9zaXRpb24oZmFsc2UpOwotICAg
ICAgICAgICAgICAgIHJpZ2h0ID0ga01heChyaWdodCwgcnApOwotICAgICAgICAgICAgfQotICAg
ICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG1fcG9zaXRpb25lZE9iamVjdHMgJiYgIWlzQ2FudmFz
KCkpIHsKLSAgICAgICAgUmVuZGVyT2JqZWN0KiByOwotICAgICAgICBRUHRyTGlzdEl0ZXJhdG9y
PFJlbmRlck9iamVjdD4gaXQoKm1fcG9zaXRpb25lZE9iamVjdHMpOwotICAgICAgICBmb3IgKCA7
IChyID0gaXQuY3VycmVudCgpKTsgKytpdCApIHsKLSAgICAgICAgICAgIGludCBycCA9IHItPnhQ
b3MoKSArIHItPnJpZ2h0bW9zdFBvc2l0aW9uKGZhbHNlKTsKLSAgICAgICAgICAgIHJpZ2h0ID0g
a01heChyaWdodCwgcnApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCFpbmNsdWRlU2Vs
ZiAmJiBmaXJzdExpbmVCb3goKSkgewotICAgICAgICBmb3IgKElubGluZVJ1bkJveCogY3VyckJv
eCA9IGZpcnN0TGluZUJveCgpOyBjdXJyQm94OyBjdXJyQm94ID0gY3VyckJveC0+bmV4dExpbmVC
b3goKSkgewotICAgICAgICAgICAgaW50IHJwID0gY3VyckJveC0+eFBvcygpICsgY3VyckJveC0+
d2lkdGgoKTsKLSAgICAgICAgICAgIHJpZ2h0ID0ga01heChyaWdodCwgcnApOwotICAgICAgICB9
Ci0gICAgfQotICAgIAotICAgIHJldHVybiByaWdodDsKLX0KLQotaW50IFJlbmRlckJsb2NrOjps
ZWZ0bW9zdFBvc2l0aW9uKGJvb2wgaW5jbHVkZU92ZXJmbG93SW50ZXJpb3IsIGJvb2wgaW5jbHVk
ZVNlbGYpIGNvbnN0Ci17Ci0gICAgaW50IGxlZnQgPSBSZW5kZXJGbG93OjpsZWZ0bW9zdFBvc2l0
aW9uKGluY2x1ZGVPdmVyZmxvd0ludGVyaW9yLCBpbmNsdWRlU2VsZik7Ci0gICAgaWYgKCFpbmNs
dWRlT3ZlcmZsb3dJbnRlcmlvciAmJiBoYXNPdmVyZmxvd0NsaXAoKSkKLSAgICAgICAgcmV0dXJu
IGxlZnQ7Ci0gICAgaWYgKGluY2x1ZGVTZWxmICYmIG1fb3ZlcmZsb3dMZWZ0IDwgbGVmdCkKLSAg
ICAgICAgbGVmdCA9IG1fb3ZlcmZsb3dMZWZ0OwotICAgIAotICAgIGlmIChtX2Zsb2F0aW5nT2Jq
ZWN0cykgewotICAgICAgICBGbG9hdGluZ09iamVjdCogcjsKLSAgICAgICAgUVB0ckxpc3RJdGVy
YXRvcjxGbG9hdGluZ09iamVjdD4gaXQoKm1fZmxvYXRpbmdPYmplY3RzKTsKLSAgICAgICAgZm9y
ICggOyAociA9IGl0LmN1cnJlbnQoKSk7ICsraXQgKSB7Ci0gICAgICAgICAgICBpZiAoIXItPm5v
UGFpbnQgfHwgci0+bm9kZS0+bGF5ZXIoKSkgewotICAgICAgICAgICAgICAgIGludCBscCA9IHIt
PmxlZnQgKyByLT5ub2RlLT5tYXJnaW5MZWZ0KCkgKyByLT5ub2RlLT5sZWZ0bW9zdFBvc2l0aW9u
KGZhbHNlKTsKLSAgICAgICAgICAgICAgICBsZWZ0ID0ga01pbihsZWZ0LCBscCk7Ci0gICAgICAg
ICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaWYgKG1fcG9zaXRpb25lZE9iamVj
dHMgJiYgIWlzQ2FudmFzKCkpIHsKLSAgICAgICAgUmVuZGVyT2JqZWN0KiByOwotICAgICAgICBR
UHRyTGlzdEl0ZXJhdG9yPFJlbmRlck9iamVjdD4gaXQoKm1fcG9zaXRpb25lZE9iamVjdHMpOwot
ICAgICAgICBmb3IgKCA7IChyID0gaXQuY3VycmVudCgpKTsgKytpdCApIHsKLSAgICAgICAgICAg
IGludCBscCA9IHItPnhQb3MoKSArIHItPmxlZnRtb3N0UG9zaXRpb24oZmFsc2UpOwotICAgICAg
ICAgICAgbGVmdCA9IGtNaW4obGVmdCwgbHApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAg
IGlmICghaW5jbHVkZVNlbGYgJiYgZmlyc3RMaW5lQm94KCkpIHsKLSAgICAgICAgZm9yIChJbmxp
bmVSdW5Cb3gqIGN1cnJCb3ggPSBmaXJzdExpbmVCb3goKTsgY3VyckJveDsgY3VyckJveCA9IGN1
cnJCb3gtPm5leHRMaW5lQm94KCkpCi0gICAgICAgICAgICBsZWZ0ID0ga01pbihsZWZ0LCAoaW50
KWN1cnJCb3gtPnhQb3MoKSk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBsZWZ0OwotfQotCi1p
bnQKLVJlbmRlckJsb2NrOjpsZWZ0Qm90dG9tKCkKLXsKLSAgICBpZiAoIW1fZmxvYXRpbmdPYmpl
Y3RzKSByZXR1cm4gMDsKLSAgICBpbnQgYm90dG9tPTA7Ci0gICAgRmxvYXRpbmdPYmplY3QqIHI7
Ci0gICAgUVB0ckxpc3RJdGVyYXRvcjxGbG9hdGluZ09iamVjdD4gaXQoKm1fZmxvYXRpbmdPYmpl
Y3RzKTsKLSAgICBmb3IgKCA7IChyID0gaXQuY3VycmVudCgpKTsgKytpdCApCi0gICAgICAgIGlm
IChyLT5lbmRZPmJvdHRvbSAmJiByLT50eXBlID09IEZsb2F0aW5nT2JqZWN0OjpGbG9hdExlZnQp
Ci0gICAgICAgICAgICBib3R0b209ci0+ZW5kWTsKLQotICAgIHJldHVybiBib3R0b207Ci19Ci0K
LWludAotUmVuZGVyQmxvY2s6OnJpZ2h0Qm90dG9tKCkKLXsKLSAgICBpZiAoIW1fZmxvYXRpbmdP
YmplY3RzKSByZXR1cm4gMDsKLSAgICBpbnQgYm90dG9tPTA7Ci0gICAgRmxvYXRpbmdPYmplY3Qq
IHI7Ci0gICAgUVB0ckxpc3RJdGVyYXRvcjxGbG9hdGluZ09iamVjdD4gaXQoKm1fZmxvYXRpbmdP
YmplY3RzKTsKLSAgICBmb3IgKCA7IChyID0gaXQuY3VycmVudCgpKTsgKytpdCApCi0gICAgICAg
IGlmIChyLT5lbmRZPmJvdHRvbSAmJiByLT50eXBlID09IEZsb2F0aW5nT2JqZWN0OjpGbG9hdFJp
Z2h0KQotICAgICAgICAgICAgYm90dG9tPXItPmVuZFk7Ci0KLSAgICByZXR1cm4gYm90dG9tOwot
fQotCi12b2lkCi1SZW5kZXJCbG9jazo6Y2xlYXJGbG9hdHMoKQotewotICAgIGlmIChtX2Zsb2F0
aW5nT2JqZWN0cykKLSAgICAgICAgbV9mbG9hdGluZ09iamVjdHMtPmNsZWFyKCk7Ci0KLSAgICAv
LyBJbmxpbmUgYmxvY2tzIGFyZSBjb3ZlcmVkIGJ5IHRoZSBpc1JlcGxhY2VkKCkgY2hlY2sgaW4g
dGhlIGF2b2lkRmxvYXRzIG1ldGhvZC4KLSAgICBpZiAoYXZvaWRzRmxvYXRzKCkgfHwgaXNSb290
KCkgfHwgaXNDYW52YXMoKSB8fCBpc0Zsb2F0aW5nT3JQb3NpdGlvbmVkKCkgfHwgaXNUYWJsZUNl
bGwoKSkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIC8vIEF0dGVtcHQgdG8gbG9jYXRlIGEg
cHJldmlvdXMgc2libGluZyB3aXRoIG92ZXJoYW5naW5nIGZsb2F0cy4gIFdlIHNraXAgYW55IGVs
ZW1lbnRzIHRoYXQgYXJlCi0gICAgLy8gb3V0IG9mIGZsb3cgKGxpa2UgZmxvYXRpbmcvcG9zaXRp
b25lZCBlbGVtZW50cyksIGFuZCB3ZSBhbHNvIHNraXAgb3ZlciBhbnkgb2JqZWN0cyB0aGF0IG1h
eSBoYXZlIHNoaWZ0ZWQKLSAgICAvLyB0byBhdm9pZCBmbG9hdHMuCi0gICAgYm9vbCBwYXJlbnRI
YXNGbG9hdHMgPSBmYWxzZTsKLSAgICBSZW5kZXJPYmplY3QgKnByZXYgPSBwcmV2aW91c1NpYmxp
bmcoKTsKLSAgICB3aGlsZSAocHJldiAmJiAoIXByZXYtPmlzUmVuZGVyQmxvY2soKSB8fCBwcmV2
LT5hdm9pZHNGbG9hdHMoKSB8fCBwcmV2LT5pc0Zsb2F0aW5nT3JQb3NpdGlvbmVkKCkpKSB7Ci0g
ICAgICAgIGlmIChwcmV2LT5pc0Zsb2F0aW5nKCkpCi0gICAgICAgICAgICBwYXJlbnRIYXNGbG9h
dHMgPSB0cnVlOwotICAgICAgICAgcHJldiA9IHByZXYtPnByZXZpb3VzU2libGluZygpOwotICAg
IH0KLQotICAgIC8vIEZpcnN0IGFkZCBpbiBmbG9hdHMgZnJvbSB0aGUgcGFyZW50LgotICAgIGlu
dCBvZmZzZXQgPSBtX3k7Ci0gICAgaWYgKHBhcmVudEhhc0Zsb2F0cykKLSAgICAgICAgYWRkSW50
cnVkaW5nRmxvYXRzKHN0YXRpY19jYXN0PFJlbmRlckJsb2NrICo+KHBhcmVudCgpKSwKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHBhcmVudCgpLT5ib3JkZXJMZWZ0KCkgKyBwYXJlbnQoKS0+
cGFkZGluZ0xlZnQoKSwgb2Zmc2V0KTsKLQotICAgIGludCB4b2Zmc2V0ID0gMDsKLSAgICBpZiAo
cHJldikKLSAgICAgICAgb2Zmc2V0IC09IHByZXYtPnlQb3MoKTsKLSAgICBlbHNlIHsKLSAgICAg
ICAgcHJldiA9IHBhcmVudCgpOwotICAgICAgICB4b2Zmc2V0ICs9IHByZXYtPmJvcmRlckxlZnQo
KSArIHByZXYtPnBhZGRpbmdMZWZ0KCk7Ci0gICAgfQotICAgIC8va2REZWJ1ZygpIDw8ICJSZW5k
ZXJCbG9jazo6Y2xlYXJGbG9hdHMgZm91bmQgcHJldmlvdXMgIjw8ICh2b2lkICopdGhpcyA8PCAi
IHByZXY9IiA8PCAodm9pZCAqKXByZXY8PCBlbmRsOwotCi0gICAgLy8gQWRkIG92ZXJoYW5naW5n
IGZsb2F0cyBmcm9tIHRoZSBwcmV2aW91cyBSZW5kZXJCbG9jaywgYnV0IG9ubHkgaWYgaXQgaGFz
IGEgZmxvYXQgdGhhdCBpbnRydWRlcyBpbnRvIG91ciBzcGFjZS4KLSAgICBpZiAoIXByZXYtPmlz
UmVuZGVyQmxvY2soKSkgcmV0dXJuOwotICAgIFJlbmRlckJsb2NrKiBibG9jayA9IHN0YXRpY19j
YXN0PFJlbmRlckJsb2NrICo+KHByZXYpOwotICAgIGlmICghYmxvY2stPm1fZmxvYXRpbmdPYmpl
Y3RzKSByZXR1cm47Ci0gICAgaWYgKGJsb2NrLT5mbG9hdEJvdHRvbSgpID4gb2Zmc2V0KQotICAg
ICAgICBhZGRJbnRydWRpbmdGbG9hdHMoYmxvY2ssIHhvZmZzZXQsIG9mZnNldCk7Ci19Ci0KLXZv
aWQgUmVuZGVyQmxvY2s6OmFkZE92ZXJoYW5naW5nRmxvYXRzKFJlbmRlckJsb2NrKiBjaGlsZCwg
aW50IHhvZmYsIGludCB5b2ZmKQotewotICAgIC8vIFByZXZlbnQgZmxvYXRzIGZyb20gYmVpbmcg
YWRkZWQgdG8gdGhlIGNhbnZhcyBieSB0aGUgcm9vdCBlbGVtZW50LCBlLmcuLCA8aHRtbD4uCi0g
ICAgaWYgKGNoaWxkLT5oYXNPdmVyZmxvd0NsaXAoKSB8fCAhY2hpbGQtPmhhc092ZXJoYW5naW5n
RmxvYXRzKCkgfHwgIWNoaWxkLT5tX2Zsb2F0aW5nT2JqZWN0cyB8fCBjaGlsZC0+aXNSb290KCkp
Ci0gICAgICAgIHJldHVybjsKLQotICAgIFFQdHJMaXN0SXRlcmF0b3I8RmxvYXRpbmdPYmplY3Q+
IGl0KCpjaGlsZC0+bV9mbG9hdGluZ09iamVjdHMpOwotICAgIGZvciAoRmxvYXRpbmdPYmplY3Qg
KnI7IChyID0gaXQuY3VycmVudCgpKTsgKytpdCkgewotICAgICAgICBpZiAoY2hpbGQtPnlQb3Mo
KSArIHItPmVuZFkgPiBoZWlnaHQoKSkgewotICAgICAgICAgICAgLy8gVGhlIG9iamVjdCBtYXkg
YWxyZWFkeSBiZSBpbiBvdXIgbGlzdC4gQ2hlY2sgZm9yIGl0IHVwIGZyb250IHRvIGF2b2lkCi0g
ICAgICAgICAgICAvLyBjcmVhdGluZyBkdXBsaWNhdGUgZW50cmllcy4KLSAgICAgICAgICAgIEZs
b2F0aW5nT2JqZWN0KiBmID0gMDsKLSAgICAgICAgICAgIGlmIChtX2Zsb2F0aW5nT2JqZWN0cykg
ewotICAgICAgICAgICAgICAgIFFQdHJMaXN0SXRlcmF0b3I8RmxvYXRpbmdPYmplY3Q+IGl0KCpt
X2Zsb2F0aW5nT2JqZWN0cyk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKChmID0gaXQuY3VycmVu
dCgpKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZi0+bm9kZSA9PSByLT5ub2RlKSBicmVh
azsKLSAgICAgICAgICAgICAgICAgICAgKytpdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAg
ICAgICB9Ci0KLSAgICAgICAgICAgIC8vIElmIHRoZSBvYmplY3QgaXMgbm90IGluIHRoZSBsaXN0
LCB3ZSBhZGQgaXQgbm93LgotICAgICAgICAgICAgaWYgKCFmKSB7Ci0gICAgICAgICAgICAgICAg
RmxvYXRpbmdPYmplY3QgKmZsb2F0aW5nT2JqID0gbmV3IEZsb2F0aW5nT2JqZWN0KHItPnR5cGUp
OwotICAgICAgICAgICAgICAgIGZsb2F0aW5nT2JqLT5zdGFydFkgPSByLT5zdGFydFkgLSB5b2Zm
OwotICAgICAgICAgICAgICAgIGZsb2F0aW5nT2JqLT5lbmRZID0gci0+ZW5kWSAtIHlvZmY7Ci0g
ICAgICAgICAgICAgICAgZmxvYXRpbmdPYmotPmxlZnQgPSByLT5sZWZ0IC0geG9mZjsKLSAgICAg
ICAgICAgICAgICBmbG9hdGluZ09iai0+d2lkdGggPSByLT53aWR0aDsKLSAgICAgICAgICAgICAg
ICBmbG9hdGluZ09iai0+bm9kZSA9IHItPm5vZGU7Ci0KLSAgICAgICAgICAgICAgICAvLyBUaGUg
bmVhcmVzdCBlbmNsb3NpbmcgbGF5ZXIgYWx3YXlzIHBhaW50cyB0aGUgZmxvYXQgKHNvIHRoYXQg
emluZGV4IGFuZCBzdGFja2luZwotICAgICAgICAgICAgICAgIC8vIGJlaGF2ZXMgcHJvcGVybHkp
LiAgV2UgYWx3YXlzIHdhbnQgdG8gcHJvcGFnYXRlIHRoZSBkZXNpcmUgdG8gcGFpbnQgdGhlIGZs
b2F0IGFzCi0gICAgICAgICAgICAgICAgLy8gZmFyIG91dCBhcyB3ZSBjYW4sIHRvIHRoZSBvdXRl
cm1vc3QgYmxvY2sgdGhhdCBvdmVybGFwcyB0aGUgZmxvYXQsIHN0b3BwaW5nIG9ubHkKLSAgICAg
ICAgICAgICAgICAvLyBpZiB3ZSBoaXQgYSBsYXllciBib3VuZGFyeS4KLSAgICAgICAgICAgICAg
ICBpZiAoci0+bm9kZS0+ZW5jbG9zaW5nTGF5ZXIoKSA9PSBlbmNsb3NpbmdMYXllcigpKQotICAg
ICAgICAgICAgICAgICAgICByLT5ub1BhaW50ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBlbHNl
Ci0gICAgICAgICAgICAgICAgICAgIGZsb2F0aW5nT2JqLT5ub1BhaW50ID0gdHJ1ZTsKLSAgICAg
ICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBXZSBjcmVhdGUgdGhlIGZsb2F0aW5nIG9i
amVjdCBsaXN0IGxhemlseS4KLSAgICAgICAgICAgICAgICBpZiAoIW1fZmxvYXRpbmdPYmplY3Rz
KSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fZmxvYXRpbmdPYmplY3RzID0gbmV3IFFQdHJMaXN0
PEZsb2F0aW5nT2JqZWN0PjsKLSAgICAgICAgICAgICAgICAgICAgbV9mbG9hdGluZ09iamVjdHMt
PnNldEF1dG9EZWxldGUodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAg
IG1fZmxvYXRpbmdPYmplY3RzLT5hcHBlbmQoZmxvYXRpbmdPYmopOwotICAgICAgICAgICAgfQot
ICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIFJlbmRlckJsb2NrOjphZGRJbnRydWRpbmdGbG9h
dHMoUmVuZGVyQmxvY2sqIHByZXYsIGludCB4b2ZmLCBpbnQgeW9mZikKLXsKLSAgICAvLyBJZiB0
aGUgcGFyZW50IG9yIHByZXZpb3VzIHNpYmxpbmcgZG9lc24ndCBoYXZlIGFueSBmbG9hdHMgdG8g
YWRkLCBkb24ndCBib3RoZXIuCi0gICAgaWYgKCFwcmV2LT5tX2Zsb2F0aW5nT2JqZWN0cykKLSAg
ICAgICAgcmV0dXJuOwotCi0gICAgUVB0ckxpc3RJdGVyYXRvcjxGbG9hdGluZ09iamVjdD4gaXQo
KnByZXYtPm1fZmxvYXRpbmdPYmplY3RzKTsKLSAgICBmb3IgKEZsb2F0aW5nT2JqZWN0ICpyOyAo
ciA9IGl0LmN1cnJlbnQoKSk7ICsraXQpIHsKLSAgICAgICAgaWYgKHItPmVuZFkgPiB5b2ZmKSB7
Ci0gICAgICAgICAgICAvLyBUaGUgb2JqZWN0IG1heSBhbHJlYWR5IGJlIGluIG91ciBsaXN0LiBD
aGVjayBmb3IgaXQgdXAgZnJvbnQgdG8gYXZvaWQKLSAgICAgICAgICAgIC8vIGNyZWF0aW5nIGR1
cGxpY2F0ZSBlbnRyaWVzLgotICAgICAgICAgICAgRmxvYXRpbmdPYmplY3QqIGYgPSAwOwotICAg
ICAgICAgICAgaWYgKG1fZmxvYXRpbmdPYmplY3RzKSB7Ci0gICAgICAgICAgICAgICAgUVB0ckxp
c3RJdGVyYXRvcjxGbG9hdGluZ09iamVjdD4gaXQoKm1fZmxvYXRpbmdPYmplY3RzKTsKLSAgICAg
ICAgICAgICAgICB3aGlsZSAoKGYgPSBpdC5jdXJyZW50KCkpKSB7Ci0gICAgICAgICAgICAgICAg
ICAgIGlmIChmLT5ub2RlID09IHItPm5vZGUpIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAr
K2l0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgh
ZikgewotICAgICAgICAgICAgICAgIEZsb2F0aW5nT2JqZWN0ICpmbG9hdGluZ09iaiA9IG5ldyBG
bG9hdGluZ09iamVjdChyLT50eXBlKTsKLSAgICAgICAgICAgICAgICBmbG9hdGluZ09iai0+c3Rh
cnRZID0gci0+c3RhcnRZIC0geW9mZjsKLSAgICAgICAgICAgICAgICBmbG9hdGluZ09iai0+ZW5k
WSA9IHItPmVuZFkgLSB5b2ZmOwotICAgICAgICAgICAgICAgIGZsb2F0aW5nT2JqLT5sZWZ0ID0g
ci0+bGVmdCAtIHhvZmY7Ci0gICAgICAgICAgICAgICAgLy8gQXBwbHlpbmcgdGhlIGNoaWxkJ3Mg
bWFyZ2luIG1ha2VzIG5vIHNlbnNlIGluIHRoZSBjYXNlIHdoZXJlIHRoZSBjaGlsZCB3YXMgcGFz
c2VkIGluLgotICAgICAgICAgICAgICAgIC8vIHNpbmNlIGhpcyBvd24gbWFyZ2luIHdhcyBhZGRl
ZCBhbHJlYWR5IHRocm91Z2ggdGhlIHN1YnRyYWN0aW9uIG9mIHRoZSB8eG9mZnwgdmFyaWFibGUK
LSAgICAgICAgICAgICAgICAvLyBhYm92ZS4gIHx4b2ZmfCB3aWxsIGVxdWFsIC1mbG93LT5tYXJn
aW5MZWZ0KCkgaW4gdGhpcyBjYXNlLCBzbyBpdCdzIGFscmVhZHkgYmVlbiB0YWtlbgotICAgICAg
ICAgICAgICAgIC8vIGludG8gYWNjb3VudC4gIE9ubHkgYXBwbHkgdGhpcyBjb2RlIGlmIHxjaGls
ZHwgaXMgZmFsc2UsIHNpbmNlIG90aGVyd2lzZSB0aGUgbGVmdCBtYXJnaW4KLSAgICAgICAgICAg
ICAgICAvLyB3aWxsIGdldCBhcHBsaWVkIHR3aWNlLgotICAgICAgICAgICAgICAgIGlmIChwcmV2
ICE9IHBhcmVudCgpKQotICAgICAgICAgICAgICAgICAgICBmbG9hdGluZ09iai0+bGVmdCArPSBw
cmV2LT5tYXJnaW5MZWZ0KCk7Ci0gICAgICAgICAgICAgICAgZmxvYXRpbmdPYmotPmxlZnQgLT0g
bWFyZ2luTGVmdCgpOwotICAgICAgICAgICAgICAgIGZsb2F0aW5nT2JqLT5ub1BhaW50ID0gdHJ1
ZTsgIC8vIFdlIGFyZSBub3QgaW4gdGhlIGRpcmVjdCBpbmhlcml0YW5jZSBjaGFpbiBmb3IgdGhp
cyBmbG9hdC4gV2Ugd2lsbCBuZXZlciBwYWludCBpdC4KLSAgICAgICAgICAgICAgICBmbG9hdGlu
Z09iai0+d2lkdGggPSByLT53aWR0aDsKLSAgICAgICAgICAgICAgICBmbG9hdGluZ09iai0+bm9k
ZSA9IHItPm5vZGU7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gV2UgY3Jl
YXRlIHRoZSBmbG9hdGluZyBvYmplY3QgbGlzdCBsYXppbHkuCi0gICAgICAgICAgICAgICAgaWYg
KCFtX2Zsb2F0aW5nT2JqZWN0cykgewotICAgICAgICAgICAgICAgICAgICBtX2Zsb2F0aW5nT2Jq
ZWN0cyA9IG5ldyBRUHRyTGlzdDxGbG9hdGluZ09iamVjdD47Ci0gICAgICAgICAgICAgICAgICAg
IG1fZmxvYXRpbmdPYmplY3RzLT5zZXRBdXRvRGVsZXRlKHRydWUpOwotICAgICAgICAgICAgICAg
IH0KLSAgICAgICAgICAgICAgICBtX2Zsb2F0aW5nT2JqZWN0cy0+YXBwZW5kKGZsb2F0aW5nT2Jq
KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotYm9vbCBSZW5kZXJCbG9j
azo6Y29udGFpbnNGbG9hdChSZW5kZXJPYmplY3QqIG8pCi17Ci0gICAgaWYgKG1fZmxvYXRpbmdP
YmplY3RzKSB7Ci0gICAgICAgIFFQdHJMaXN0SXRlcmF0b3I8RmxvYXRpbmdPYmplY3Q+IGl0KCpt
X2Zsb2F0aW5nT2JqZWN0cyk7Ci0gICAgICAgIHdoaWxlIChpdC5jdXJyZW50KCkpIHsKLSAgICAg
ICAgICAgIGlmIChpdC5jdXJyZW50KCktPm5vZGUgPT0gbykKLSAgICAgICAgICAgICAgICByZXR1
cm4gdHJ1ZTsKLSAgICAgICAgICAgICsraXQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJu
IGZhbHNlOwotfQotCi12b2lkIFJlbmRlckJsb2NrOjptYXJrQWxsRGVzY2VuZGFudHNXaXRoRmxv
YXRzRm9yTGF5b3V0KFJlbmRlck9iamVjdCogZmxvYXRUb1JlbW92ZSkKLXsKLSAgICBzZXRDaGls
ZE5lZWRzTGF5b3V0KHRydWUpOwotCi0gICAgaWYgKGZsb2F0VG9SZW1vdmUpCi0gICAgICAgIHJl
bW92ZUZsb2F0aW5nT2JqZWN0KGZsb2F0VG9SZW1vdmUpOwotCi0gICAgLy8gSXRlcmF0ZSBvdmVy
IG91ciBjaGlsZHJlbiBhbmQgbWFyayB0aGVtIGFzIG5lZWRlZC4KLSAgICBpZiAoIWNoaWxkcmVu
SW5saW5lKCkpIHsKLSAgICAgICAgZm9yIChSZW5kZXJPYmplY3QqIGNoaWxkID0gZmlyc3RDaGls
ZCgpOyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4dFNpYmxpbmcoKSkgewotICAgICAgICAgICAg
aWYgKGlzQmxvY2tGbG93KCkgJiYgIWNoaWxkLT5pc0Zsb2F0aW5nT3JQb3NpdGlvbmVkKCkgJiYK
LSAgICAgICAgICAgICAgICAoZmxvYXRUb1JlbW92ZSA/IGNoaWxkLT5jb250YWluc0Zsb2F0KGZs
b2F0VG9SZW1vdmUpIDogY2hpbGQtPmNvbnRhaW5zRmxvYXRzKCkpKQotICAgICAgICAgICAgICAg
IGNoaWxkLT5tYXJrQWxsRGVzY2VuZGFudHNXaXRoRmxvYXRzRm9yTGF5b3V0KGZsb2F0VG9SZW1v
dmUpOwotICAgICAgICB9Ci0gICAgfQotfQotCi1pbnQgUmVuZGVyQmxvY2s6OmdldENsZWFyRGVs
dGEoUmVuZGVyT2JqZWN0ICpjaGlsZCkKLXsKLSAgICBib29sIGNsZWFyU2V0ID0gY2hpbGQtPnN0
eWxlKCktPmNsZWFyKCkgIT0gQ05PTkU7Ci0gICAgaW50IGJvdHRvbSA9IDA7Ci0gICAgc3dpdGNo
IChjaGlsZC0+c3R5bGUoKS0+Y2xlYXIoKSkgewotICAgICAgICBjYXNlIENOT05FOgotICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ0xFRlQ6Ci0gICAgICAgICAgICBib3R0b20gPSBs
ZWZ0Qm90dG9tKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDUklHSFQ6Ci0g
ICAgICAgICAgICBib3R0b20gPSByaWdodEJvdHRvbSgpOwotICAgICAgICAgICAgYnJlYWs7Ci0g
ICAgICAgIGNhc2UgQ0JPVEg6Ci0gICAgICAgICAgICBib3R0b20gPSBmbG9hdEJvdHRvbSgpOwot
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLy8gV2UgYWxzbyBjbGVhciBmbG9hdHMg
aWYgd2UgYXJlIHRvbyBiaWcgdG8gc2l0IG9uIHRoZSBzYW1lIGxpbmUgYXMgYSBmbG9hdCAoYW5k
IHdpc2ggdG8gYXZvaWQgZmxvYXRzIGJ5IGRlZmF1bHQpLgotICAgIC8vIEZJWE1FOiBOb3RlIHRo
YXQgdGhlIHJlbWFpbmluZyBzcGFjZSBjaGVja3MgYXJlbid0IHF1aXRlIGFjY3VyYXRlLCBzaW5j
ZSB5b3Ugc2hvdWxkIGJlIGFibGUgdG8gY2xlYXIgb25seSBzb21lIGZsb2F0cyAodGhlIG1pbmlt
dW0gIyBuZWVkZWQKLSAgICAvLyB0byBmaXQpIGFuZCBub3QgYWxsICh3ZSBzaG91bGQgYmUgdXNp
bmcgbmVhcmVzdEZsb2F0Qm90dG9tIGFuZCBsb29waW5nKS4KLSAgICAvLyBEbyBub3QgYWxsb3cg
dGFibGVzIHRvIHdyYXAgaW4gcXVpcmtzIG9yIGV2ZW4gaW4gYWxtb3N0IHN0cmljdCBtb2RlIAot
ICAgIC8vIChlYmF5IG9uIHRoZSBQTFQsIGZpbmFuY2UueWFob28uY29tIGluIHRoZSByZWFsIHdv
cmxkLCB2ZXJzaW9udHJhY2tlci5jb20gZm9yY2VzIGV2ZW4gYWxtb3N0IHN0cmljdCBtb2RlIG5v
dCB0byB3b3JrKQotICAgIGludCByZXN1bHQgPSBjbGVhclNldCA/IGtNYXgoMCwgYm90dG9tIC0g
Y2hpbGQtPnlQb3MoKSkgOiAwOwotICAgIGlmICghcmVzdWx0ICYmIGNoaWxkLT5hdm9pZHNGbG9h
dHMoKSAmJiBjaGlsZC0+c3R5bGUoKS0+d2lkdGgoKS5pc0ZpeGVkKCkgJiYgCi0gICAgICAgIGNo
aWxkLT5taW5XaWR0aCgpID4gbGluZVdpZHRoKGNoaWxkLT55UG9zKCkpICYmIGNoaWxkLT5taW5X
aWR0aCgpIDw9IGNvbnRlbnRXaWR0aCgpICYmIAotICAgICAgICBkb2N1bWVudCgpLT5pblN0cmlj
dE1vZGUoKSkgICAKLSAgICAgICAgcmVzdWx0ID0ga01heCgwLCBmbG9hdEJvdHRvbSgpIC0gY2hp
bGQtPnlQb3MoKSk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotYm9vbCBSZW5kZXJCbG9jazo6
aXNQb2ludEluU2Nyb2xsYmFyKGludCBfeCwgaW50IF95LCBpbnQgX3R4LCBpbnQgX3R5KQotewot
ICAgIGlmICghc2Nyb2xsc092ZXJmbG93KCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAg
IGlmIChtX2xheWVyLT52ZXJ0aWNhbFNjcm9sbGJhcldpZHRoKCkpIHsKLSAgICAgICAgSW50UmVj
dCB2ZXJ0UmVjdChfdHggKyB3aWR0aCgpIC0gYm9yZGVyUmlnaHQoKSAtIG1fbGF5ZXItPnZlcnRp
Y2FsU2Nyb2xsYmFyV2lkdGgoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgX3R5ICsgYm9yZGVy
VG9wKCkgLSBib3JkZXJUb3BFeHRyYSgpLAotICAgICAgICAgICAgICAgICAgICAgICBtX2xheWVy
LT52ZXJ0aWNhbFNjcm9sbGJhcldpZHRoKCksCi0gICAgICAgICAgICAgICAgICAgICAgIGhlaWdo
dCgpICsgYm9yZGVyVG9wRXh0cmEoKSArIGJvcmRlckJvdHRvbUV4dHJhKCkgLSBib3JkZXJUb3Ao
KSAtIGJvcmRlckJvdHRvbSgpKTsKLSAgICAgICAgaWYgKHZlcnRSZWN0LmNvbnRhaW5zKF94LCBf
eSkpIHsKLSAgICAgICAgICAgIFJlbmRlckxheWVyOjpnU2Nyb2xsQmFyID0gbV9sYXllci0+dmVy
dGljYWxTY3JvbGxiYXIoKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0g
ICAgfQotCi0gICAgaWYgKG1fbGF5ZXItPmhvcml6b250YWxTY3JvbGxiYXJIZWlnaHQoKSkgewot
ICAgICAgICBJbnRSZWN0IGhvcml6UmVjdChfdHggKyBib3JkZXJMZWZ0KCksCi0gICAgICAgICAg
ICAgICAgICAgICAgICBfdHkgKyBoZWlnaHQoKSArIGJvcmRlckJvdHRvbUV4dHJhKCkgLSBtX2xh
eWVyLT5ob3Jpem9udGFsU2Nyb2xsYmFySGVpZ2h0KCkgLSBib3JkZXJCb3R0b20oKSwKLSAgICAg
ICAgICAgICAgICAgICAgICAgIHdpZHRoKCkgLSBib3JkZXJMZWZ0KCkgLSBib3JkZXJSaWdodCgp
LAotICAgICAgICAgICAgICAgICAgICAgICAgbV9sYXllci0+aG9yaXpvbnRhbFNjcm9sbGJhckhl
aWdodCgpKTsKLSAgICAgICAgaWYgKGhvcml6UmVjdC5jb250YWlucyhfeCwgX3kpKSB7Ci0gICAg
ICAgICAgICBSZW5kZXJMYXllcjo6Z1Njcm9sbEJhciA9IG1fbGF5ZXItPmhvcml6b250YWxTY3Jv
bGxiYXIoKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0g
ICAgcmV0dXJuIGZhbHNlOyAgICAKLX0KLQotYm9vbCBSZW5kZXJCbG9jazo6bm9kZUF0UG9pbnQo
Tm9kZUluZm8mIGluZm8sIGludCBfeCwgaW50IF95LCBpbnQgX3R4LCBpbnQgX3R5LAotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgSGl0VGVzdEFjdGlvbiBoaXRUZXN0QWN0aW9uKQotewot
ICAgIGJvb2wgaW5saW5lRmxvdyA9IGlzSW5saW5lRmxvdygpOwotCi0gICAgaW50IHR4ID0gX3R4
ICsgbV94OwotICAgIGludCB0eSA9IF90eSArIG1feSArIGJvcmRlclRvcEV4dHJhKCk7Ci0gICAg
Ci0gICAgaWYgKCFpbmxpbmVGbG93ICYmICFpc1Jvb3QoKSkgewotICAgICAgICAvLyBDaGVjayBp
ZiB3ZSBuZWVkIHRvIGRvIGFueXRoaW5nIGF0IGFsbC4KLSAgICAgICAgSW50UmVjdCBvdmVyZmxv
d0JveCA9IG92ZXJmbG93UmVjdChmYWxzZSk7Ci0gICAgICAgIG92ZXJmbG93Qm94LnNldFgob3Zl
cmZsb3dCb3gueCgpICsgdHgpOwotICAgICAgICBvdmVyZmxvd0JveC5zZXRZKG92ZXJmbG93Qm94
LnkoKSArIHR5KTsKLSAgICAgICAgYm9vbCBpbnNpZGVPdmVyZmxvd0JveCA9IG92ZXJmbG93Qm94
LmNvbnRhaW5zKF94LCBfeSk7Ci0gICAgICAgIGlmICghaW5zaWRlT3ZlcmZsb3dCb3gpIHsKLSAg
ICAgICAgICAgIC8vIENoZWNrIGZsb2F0cyBuZXh0LgotICAgICAgICAgICAgaWYgKGhpdFRlc3RB
Y3Rpb24gIT0gSGl0VGVzdEZsb2F0KQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAg
ICAgICAgICAgIEludFJlY3QgZmxvYXRCb3ggPSBmbG9hdFJlY3QoKTsKLSAgICAgICAgICAgIGZs
b2F0Qm94LnNldFgoZmxvYXRCb3gueCgpICsgdHgpOwotICAgICAgICAgICAgZmxvYXRCb3guc2V0
WShmbG9hdEJveC55KCkgKyB0eSk7Ci0gICAgICAgICAgICBpZiAoIWZsb2F0Qm94LmNvbnRhaW5z
KF94LCBfeSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAg
fQotCi0gICAgaWYgKGlzUG9pbnRJblNjcm9sbGJhcihfeCwgX3ksIHR4LCB0eSkpIHsKLSAgICAg
ICAgaWYgKGhpdFRlc3RBY3Rpb24gPT0gSGl0VGVzdEJsb2NrQmFja2dyb3VuZCkgewotICAgICAg
ICAgICAgc2V0SW5uZXJOb2RlKGluZm8pOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAg
ICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8vIEhpdCB0ZXN0IGRl
c2NlbmRhbnRzIGZpcnN0LgotICAgIGludCBzY3JvbGxlZFggPSB0eDsKLSAgICBpbnQgc2Nyb2xs
ZWRZID0gdHk7Ci0gICAgaWYgKGhhc092ZXJmbG93Q2xpcCgpKQotICAgICAgICBtX2xheWVyLT5z
dWJ0cmFjdFNjcm9sbE9mZnNldChzY3JvbGxlZFgsIHNjcm9sbGVkWSk7Ci0gICAgaWYgKGNoaWxk
cmVuSW5saW5lKCkgJiYgIWlzVGFibGUoKSkgewotICAgICAgICAvLyBXZSBoYXZlIHRvIGhpdC10
ZXN0IG91ciBsaW5lIGJveGVzLgotICAgICAgICBpZiAoaGl0VGVzdExpbmVzKGluZm8sIF94LCBf
eSwgc2Nyb2xsZWRYLCBzY3JvbGxlZFksIGhpdFRlc3RBY3Rpb24pKSB7Ci0gICAgICAgICAgICBz
ZXRJbm5lck5vZGUoaW5mbyk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQot
ICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgLy8gSGl0IHRlc3Qgb3VyIGNoaWxkcmVuLgotICAg
ICAgICBIaXRUZXN0QWN0aW9uIGNoaWxkSGl0VGVzdCA9IGhpdFRlc3RBY3Rpb247Ci0gICAgICAg
IGlmIChoaXRUZXN0QWN0aW9uID09IEhpdFRlc3RDaGlsZEJsb2NrQmFja2dyb3VuZHMpCi0gICAg
ICAgICAgICBjaGlsZEhpdFRlc3QgPSBIaXRUZXN0Q2hpbGRCbG9ja0JhY2tncm91bmQ7Ci0gICAg
ICAgIGZvciAoUmVuZGVyT2JqZWN0KiBjaGlsZCA9IGxhc3RDaGlsZCgpOyBjaGlsZDsgY2hpbGQg
PSBjaGlsZC0+cHJldmlvdXNTaWJsaW5nKCkpCi0gICAgICAgICAgICAvLyBGSVhNRTogV2UgaGF2
ZSB0byBza2lwIG92ZXIgaW5saW5lIGZsb3dzLCBzaW5jZSB0aGV5IGNhbiBzaG93IHVwIGluc2lk
ZSBSZW5kZXJUYWJsZXMgYXQgdGhlIG1vbWVudCAoYSBkZW1vdGVkIGlubGluZSA8Zm9ybT4gZm9y
IGV4YW1wbGUpLiAgSWYgd2UgZXZlciBpbXBsZW1lbnQgYQotICAgICAgICAgICAgLy8gdGFibGUt
c3BlY2lmaWMgaGl0LXRlc3QgbWV0aG9kICh3aGljaCB3ZSBzaG91bGQgZG8gZm9yIHBlcmZvcm1h
bmNlIHJlYXNvbnMgYW55d2F5KSwgdGhlbiB3ZSBjYW4gcmVtb3ZlIHRoaXMgY2hlY2suCi0gICAg
ICAgICAgICBpZiAoIWNoaWxkLT5sYXllcigpICYmICFjaGlsZC0+aXNGbG9hdGluZygpICYmICFj
aGlsZC0+aXNJbmxpbmVGbG93KCkgJiYgY2hpbGQtPm5vZGVBdFBvaW50KGluZm8sIF94LCBfeSwg
c2Nyb2xsZWRYLCBzY3JvbGxlZFksIGNoaWxkSGl0VGVzdCkpIHsKLSAgICAgICAgICAgICAgICBz
ZXRJbm5lck5vZGUoaW5mbyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAg
ICAgICB9Ci0gICAgfQotICAgIAotICAgIC8vIEhpdCB0ZXN0IGZsb2F0cy4KLSAgICBpZiAoaGl0
VGVzdEFjdGlvbiA9PSBIaXRUZXN0RmxvYXQgJiYgbV9mbG9hdGluZ09iamVjdHMpIHsKLSAgICAg
ICAgaWYgKGlzQ2FudmFzKCkpIHsKLSAgICAgICAgICAgIHNjcm9sbGVkWCArPSBzdGF0aWNfY2Fz
dDxSZW5kZXJDYW52YXMqPih0aGlzKS0+dmlldygpLT5jb250ZW50c1goKTsKLSAgICAgICAgICAg
IHNjcm9sbGVkWSArPSBzdGF0aWNfY2FzdDxSZW5kZXJDYW52YXMqPih0aGlzKS0+dmlldygpLT5j
b250ZW50c1koKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgRmxvYXRpbmdPYmplY3Qq
IG87Ci0gICAgICAgIFFQdHJMaXN0SXRlcmF0b3I8RmxvYXRpbmdPYmplY3Q+IGl0KCptX2Zsb2F0
aW5nT2JqZWN0cyk7Ci0gICAgICAgIGZvciAoaXQudG9MYXN0KCk7IChvID0gaXQuY3VycmVudCgp
KTsgLS1pdCkKLSAgICAgICAgICAgIGlmICghby0+bm9QYWludCAmJiAhby0+bm9kZS0+bGF5ZXIo
KSAmJiBvLT5ub2RlLT5oaXRUZXN0KGluZm8sIF94LCBfeSwKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBzY3JvbGxlZFggKyBvLT5sZWZ0ICsgby0+bm9kZS0+bWFyZ2luTGVm
dCgpIC0gby0+bm9kZS0+eFBvcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHNjcm9sbGVkWSArIG8tPnN0YXJ0WSArIG8tPm5vZGUtPm1hcmdpblRvcCgpIC0gby0+bm9k
ZS0+eVBvcygpKSkgewotICAgICAgICAgICAgICAgIHNldElubmVyTm9kZShpbmZvKTsKLSAgICAg
ICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBO
b3cgaGl0IHRlc3Qgb3VyIGJhY2tncm91bmQuCi0gICAgaWYgKCFpbmxpbmVGbG93ICYmIChoaXRU
ZXN0QWN0aW9uID09IEhpdFRlc3RCbG9ja0JhY2tncm91bmQgfHwgaGl0VGVzdEFjdGlvbiA9PSBI
aXRUZXN0Q2hpbGRCbG9ja0JhY2tncm91bmQpKSB7Ci0gICAgICAgIGludCB0b3BFeHRyYSA9IGJv
cmRlclRvcEV4dHJhKCk7Ci0gICAgICAgIEludFJlY3QgYm91bmRzUmVjdCh0eCwgdHkgLSB0b3BF
eHRyYSwgbV93aWR0aCwgbV9oZWlnaHQgKyB0b3BFeHRyYSArIGJvcmRlckJvdHRvbUV4dHJhKCkp
OwotICAgICAgICBpZiAoaXNSb290KCkgfHwgKHN0eWxlKCktPnZpc2liaWxpdHkoKSA9PSBWSVNJ
QkxFICYmIGJvdW5kc1JlY3QuY29udGFpbnMoX3gsIF95KSkpIHsKLSAgICAgICAgICAgIHNldElu
bmVyTm9kZShpbmZvKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAg
fQotCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1Qb3NpdGlvbiBSZW5kZXJCbG9jazo6cG9zaXRp
b25Gb3JCb3goSW5saW5lQm94ICpib3gsIGJvb2wgc3RhcnQpIGNvbnN0Ci17Ci0gICAgaWYgKCFi
b3gpCi0gICAgICAgIHJldHVybiBQb3NpdGlvbigpOwotCi0gICAgaWYgKCFib3gtPm9iamVjdCgp
LT5lbGVtZW50KCkpCi0gICAgICAgIHJldHVybiBQb3NpdGlvbihlbGVtZW50KCksIHN0YXJ0ID8g
Y2FyZXRNaW5PZmZzZXQoKSA6IGNhcmV0TWF4T2Zmc2V0KCkpOwotCi0gICAgaWYgKCFib3gtPmlz
SW5saW5lVGV4dEJveCgpKQotICAgICAgICByZXR1cm4gUG9zaXRpb24oYm94LT5vYmplY3QoKS0+
ZWxlbWVudCgpLCBzdGFydCA/IGJveC0+b2JqZWN0KCktPmNhcmV0TWluT2Zmc2V0KCkgOiBib3gt
Pm9iamVjdCgpLT5jYXJldE1heE9mZnNldCgpKTsKLQotICAgIElubGluZVRleHRCb3ggKnRleHRC
b3ggPSBzdGF0aWNfY2FzdDxJbmxpbmVUZXh0Qm94ICo+KGJveCk7Ci0gICAgcmV0dXJuIFBvc2l0
aW9uKGJveC0+b2JqZWN0KCktPmVsZW1lbnQoKSwgc3RhcnQgPyB0ZXh0Qm94LT5zdGFydCgpIDog
dGV4dEJveC0+c3RhcnQoKSArIHRleHRCb3gtPmxlbigpKTsKLX0KLQotUG9zaXRpb24gUmVuZGVy
QmxvY2s6OnBvc2l0aW9uRm9yUmVuZGVyZXIoUmVuZGVyT2JqZWN0ICpyZW5kZXJlciwgYm9vbCBz
dGFydCkgY29uc3QKLXsKLSAgICBpZiAoIXJlbmRlcmVyKQotICAgICAgICByZXR1cm4gUG9zaXRp
b24oZWxlbWVudCgpLCAwKTsKLQotICAgIE5vZGVJbXBsICpub2RlID0gcmVuZGVyZXItPmVsZW1l
bnQoKSA/IHJlbmRlcmVyLT5lbGVtZW50KCkgOiBlbGVtZW50KCk7Ci0gICAgaWYgKCFub2RlKQot
ICAgICAgICByZXR1cm4gUG9zaXRpb24oKTsKLQotICAgIGludCBvZmZzZXQgPSBzdGFydCA/IG5v
ZGUtPmNhcmV0TWluT2Zmc2V0KCkgOiBub2RlLT5jYXJldE1heE9mZnNldCgpOwotICAgIHJldHVy
biBQb3NpdGlvbihub2RlLCBvZmZzZXQpOwotfQotCi1WaXNpYmxlUG9zaXRpb24gUmVuZGVyQmxv
Y2s6OnBvc2l0aW9uRm9yQ29vcmRpbmF0ZXMoaW50IF94LCBpbnQgX3kpCi17Ci0gICAgaWYgKGlz
VGFibGUoKSkKLSAgICAgICAgcmV0dXJuIFJlbmRlckZsb3c6OnBvc2l0aW9uRm9yQ29vcmRpbmF0
ZXMoX3gsIF95KTsgCi0KLSAgICBpbnQgYWJzeCwgYWJzeTsKLSAgICBhYnNvbHV0ZVBvc2l0aW9u
KGFic3gsIGFic3kpOwotCi0gICAgaW50IHRvcCA9IGFic3kgKyBib3JkZXJUb3AoKSArIHBhZGRp
bmdUb3AoKTsKLSAgICBpbnQgYm90dG9tID0gdG9wICsgY29udGVudEhlaWdodCgpOwotCi0gICAg
aWYgKF95IDwgdG9wKQotICAgICAgICAvLyB5IGNvb3JkaW5hdGUgaXMgYWJvdmUgYmxvY2sKLSAg
ICAgICAgcmV0dXJuIFZpc2libGVQb3NpdGlvbihwb3NpdGlvbkZvclJlbmRlcmVyKGZpcnN0TGVh
ZkNoaWxkKCksIHRydWUpLCBET1dOU1RSRUFNKTsKLQotICAgIGlmIChfeSA+PSBib3R0b20pCi0g
ICAgICAgIC8vIHkgY29vcmRpbmF0ZSBpcyBiZWxvdyBibG9jawotICAgICAgICByZXR1cm4gVmlz
aWJsZVBvc2l0aW9uKHBvc2l0aW9uRm9yUmVuZGVyZXIobGFzdExlYWZDaGlsZCgpLCBmYWxzZSks
IERPV05TVFJFQU0pOwotCi0gICAgaWYgKGNoaWxkcmVuSW5saW5lKCkpIHsKLSAgICAgICAgaWYg
KCFmaXJzdFJvb3RCb3goKSkKLSAgICAgICAgICAgIHJldHVybiBWaXNpYmxlUG9zaXRpb24oZWxl
bWVudCgpLCAwLCBET1dOU1RSRUFNKTsKLSAgICAgICAgICAgIAotICAgICAgICBpZiAoX3kgPj0g
dG9wICYmIF95IDwgYWJzeSArIGZpcnN0Um9vdEJveCgpLT50b3BPdmVyZmxvdygpKQotICAgICAg
ICAgICAgLy8geSBjb29yZGluYXRlIGlzIGFib3ZlIGZpcnN0IHJvb3QgbGluZSBib3gKLSAgICAg
ICAgICAgIHJldHVybiBWaXNpYmxlUG9zaXRpb24ocG9zaXRpb25Gb3JCb3goZmlyc3RSb290Qm94
KCktPmZpcnN0TGVhZkNoaWxkKCksIHRydWUpLCBET1dOU1RSRUFNKTsKLSAgICAgICAgCi0gICAg
ICAgIC8vIGxvb2sgZm9yIHRoZSBjbG9zZXN0IGxpbmUgYm94IGluIHRoZSByb290IGJveCB3aGlj
aCBpcyBhdCB0aGUgcGFzc2VkLWluIHkgY29vcmRpbmF0ZQotICAgICAgICBmb3IgKFJvb3RJbmxp
bmVCb3ggKnJvb3QgPSBmaXJzdFJvb3RCb3goKTsgcm9vdDsgcm9vdCA9IHJvb3QtPm5leHRSb290
Qm94KCkpIHsKLSAgICAgICAgICAgIHRvcCA9IGFic3kgKyByb290LT50b3BPdmVyZmxvdygpOwot
ICAgICAgICAgICAgLy8gc2V0IHRoZSBib3R0b20gYmFzZWQgb24gd2hldGhlciB0aGVyZSBpcyBh
IG5leHQgcm9vdCBib3gKLSAgICAgICAgICAgIGlmIChyb290LT5uZXh0Um9vdEJveCgpKQotICAg
ICAgICAgICAgICAgIGJvdHRvbSA9IGFic3kgKyByb290LT5uZXh0Um9vdEJveCgpLT50b3BPdmVy
ZmxvdygpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGJvdHRvbSA9IGFic3kg
KyByb290LT5ib3R0b21PdmVyZmxvdygpOwotICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhpcyBy
b290IGxpbmUgYm94IGlzIGxvY2F0ZWQgYXQgdGhpcyB5IGNvb3JkaW5hdGUKLSAgICAgICAgICAg
IGlmIChfeSA+PSB0b3AgJiYgX3kgPCBib3R0b20gJiYgcm9vdC0+Zmlyc3RDaGlsZCgpKSB7Ci0g
ICAgICAgICAgICAgICAgSW5saW5lQm94ICpjbG9zZXN0Qm94ID0gcm9vdC0+Y2xvc2VzdExlYWZD
aGlsZEZvclhQb3MoX3gsIGFic3gpOwotICAgICAgICAgICAgICAgIGlmIChjbG9zZXN0Qm94KSB7
Ci0gICAgICAgICAgICAgICAgICAgIC8vIHBhc3MgdGhlIGJveCBhIHkgcG9zaXRpb24gdGhhdCBp
cyBpbnNpZGUgaXQKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsb3Nlc3RCb3gtPm9iamVj
dCgpLT5wb3NpdGlvbkZvckNvb3JkaW5hdGVzKF94LCBhYnN5ICsgY2xvc2VzdEJveC0+bV95KTsK
LSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBp
ZiAobGFzdFJvb3RCb3goKSkKLSAgICAgICAgICAgIC8vIHkgY29vcmRpbmF0ZSBpcyBiZWxvdyBs
YXN0IHJvb3QgbGluZSBib3gKLSAgICAgICAgICAgIHJldHVybiBWaXNpYmxlUG9zaXRpb24ocG9z
aXRpb25Gb3JCb3gobGFzdFJvb3RCb3goKS0+bGFzdExlYWZDaGlsZCgpLCBmYWxzZSksIERPV05T
VFJFQU0pOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIFZpc2libGVQb3NpdGlvbihlbGVtZW50
KCksIDAsIERPV05TVFJFQU0pOwotICAgIH0KLSAgICAKLSAgICAvLyBzZWUgaWYgYW55IGNoaWxk
IGJsb2NrcyBleGlzdCBhdCB0aGlzIHkgY29vcmRpbmF0ZQotICAgIFJlbmRlck9iamVjdCAqbGFz
dFZpc2libGVDaGlsZCA9IDA7Ci0gICAgZm9yIChSZW5kZXJPYmplY3QgKnJlbmRlcmVyID0gZmly
c3RDaGlsZCgpOyByZW5kZXJlcjsgcmVuZGVyZXIgPSByZW5kZXJlci0+bmV4dFNpYmxpbmcoKSkg
ewotICAgICAgICBpZiAocmVuZGVyZXItPmhlaWdodCgpID09IDAgfHwgcmVuZGVyZXItPnN0eWxl
KCktPnZpc2liaWxpdHkoKSAhPSBWSVNJQkxFIHx8IHJlbmRlcmVyLT5pc0Zsb2F0aW5nT3JQb3Np
dGlvbmVkKCkpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgcmVuZGVyZXItPmFic29s
dXRlUG9zaXRpb24oYWJzeCwgdG9wKTsKLSAgICAgICAgUmVuZGVyT2JqZWN0ICpuZXh0ID0gcmVu
ZGVyZXItPm5leHRTaWJsaW5nKCk7Ci0gICAgICAgIHdoaWxlIChuZXh0ICYmIG5leHQtPmlzRmxv
YXRpbmdPclBvc2l0aW9uZWQoKSkKLSAgICAgICAgICAgIG5leHQgPSBuZXh0LT5uZXh0U2libGlu
ZygpOwotICAgICAgICBpZiAobmV4dCkgCi0gICAgICAgICAgICBuZXh0LT5hYnNvbHV0ZVBvc2l0
aW9uKGFic3gsIGJvdHRvbSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGJvdHRvbSA9IHRv
cCArIGNvbnRlbnRIZWlnaHQoKTsKLSAgICAgICAgaWYgKF95ID49IHRvcCAmJiBfeSA8IGJvdHRv
bSkgewotICAgICAgICAgICAgcmV0dXJuIHJlbmRlcmVyLT5wb3NpdGlvbkZvckNvb3JkaW5hdGVz
KF94LCBfeSk7Ci0gICAgICAgIH0KLSAgICAgICAgbGFzdFZpc2libGVDaGlsZCA9IHJlbmRlcmVy
OwotICAgIH0KLQotICAgIC8vIHBhc3MgYWxvbmcgdG8gdGhlIGxhc3QgY2hpbGQgd2Ugc2F3IHRo
YXQgaGFkIGEgaGVpZ2h0IGFuZCBpcyB2aXNpYmxlLgotICAgIGlmIChsYXN0VmlzaWJsZUNoaWxk
KQotICAgICAgICByZXR1cm4gbGFzdFZpc2libGVDaGlsZC0+cG9zaXRpb25Gb3JDb29yZGluYXRl
cyhfeCwgX3kpOwotICAgIAotICAgIC8vIHN0aWxsIG5vIGx1Y2suLi5yZXR1cm4gdGhpcyByZW5k
ZXIgb2JqZWN0J3MgZWxlbWVudCBhbmQgb2Zmc2V0IDAKLSAgICByZXR1cm4gVmlzaWJsZVBvc2l0
aW9uKGVsZW1lbnQoKSwgMCwgRE9XTlNUUkVBTSk7Ci19Ci0KLXZvaWQgUmVuZGVyQmxvY2s6OmNh
bGNNaW5NYXhXaWR0aCgpCi17Ci0gICAgS0hUTUxBc3NlcnQoICFtaW5NYXhLbm93bigpICk7Ci0K
LSNpZmRlZiBERUJVR19MQVlPVVQKLSAgICBrZERlYnVnKCA2MDQwICkgPDwgcmVuZGVyTmFtZSgp
IDw8ICIoUmVuZGVyQmxvY2spOjpjYWxjTWluTWF4V2lkdGgoKSB0aGlzPSIgPDwgdGhpcyA8PCBl
bmRsOwotI2VuZGlmCi0KLSAgICBtX21pbldpZHRoID0gMDsKLSAgICBtX21heFdpZHRoID0gMDsK
LQotICAgIGlmIChjaGlsZHJlbklubGluZSgpKQotICAgICAgICBjYWxjSW5saW5lTWluTWF4V2lk
dGgoKTsKLSAgICBlbHNlCi0gICAgICAgIGNhbGNCbG9ja01pbk1heFdpZHRoKCk7Ci0KLSAgICBp
ZihtX21heFdpZHRoIDwgbV9taW5XaWR0aCkgbV9tYXhXaWR0aCA9IG1fbWluV2lkdGg7Ci0KLSAg
ICBpZiAoIXN0eWxlKCktPmF1dG9XcmFwKCkgJiYgY2hpbGRyZW5JbmxpbmUoKSkgewotICAgICAg
ICBtX21pbldpZHRoID0gbV9tYXhXaWR0aDsKLSAgICAgICAgCi0gICAgICAgIC8vIEEgaG9yaXpv
bnRhbCBtYXJxdWVlIHdpdGggaW5saW5lIGNoaWxkcmVuIGhhcyBubyBtaW5pbXVtIHdpZHRoLgot
ICAgICAgICBpZiAoc3R5bGUoKS0+b3ZlcmZsb3coKSA9PSBPTUFSUVVFRSAmJiBtX2xheWVyICYm
IG1fbGF5ZXItPm1hcnF1ZWUoKSAmJiAKLSAgICAgICAgICAgIG1fbGF5ZXItPm1hcnF1ZWUoKS0+
aXNIb3Jpem9udGFsKCkgJiYgIW1fbGF5ZXItPm1hcnF1ZWUoKS0+aXNVbmZ1cmxNYXJxdWVlKCkp
Ci0gICAgICAgICAgICBtX21pbldpZHRoID0gMDsKLSAgICB9Ci0KLSAgICBpZiAoaXNUYWJsZUNl
bGwoKSkgewotICAgICAgICBMZW5ndGggdyA9IHN0YXRpY19jYXN0PFJlbmRlclRhYmxlQ2VsbCo+
KHRoaXMpLT5zdHlsZU9yQ29sV2lkdGgoKTsKLSAgICAgICAgaWYgKHcuaXNGaXhlZCgpICYmIHcu
dmFsdWUgPiAwKQotICAgICAgICAgICAgbV9tYXhXaWR0aCA9IGtNYXgobV9taW5XaWR0aCwgY2Fs
Y0NvbnRlbnRCb3hXaWR0aCh3LnZhbHVlKSk7Ci0gICAgfSBlbHNlIGlmIChzdHlsZSgpLT53aWR0
aCgpLmlzRml4ZWQoKSAmJiBzdHlsZSgpLT53aWR0aCgpLnZhbHVlID4gMCkKLSAgICAgICAgbV9t
aW5XaWR0aCA9IG1fbWF4V2lkdGggPSBjYWxjQ29udGVudEJveFdpZHRoKHN0eWxlKCktPndpZHRo
KCkudmFsdWUpOwotICAgIAotICAgIGlmIChzdHlsZSgpLT5taW5XaWR0aCgpLmlzRml4ZWQoKSAm
JiBzdHlsZSgpLT5taW5XaWR0aCgpLnZhbHVlID4gMCkgewotICAgICAgICBtX21heFdpZHRoID0g
a01heChtX21heFdpZHRoLCBjYWxjQ29udGVudEJveFdpZHRoKHN0eWxlKCktPm1pbldpZHRoKCku
dmFsdWUpKTsKLSAgICAgICAgbV9taW5XaWR0aCA9IGtNYXgobV9taW5XaWR0aCwgY2FsY0NvbnRl
bnRCb3hXaWR0aChzdHlsZSgpLT5taW5XaWR0aCgpLnZhbHVlKSk7Ci0gICAgfQotICAgIAotICAg
IGlmIChzdHlsZSgpLT5tYXhXaWR0aCgpLmlzRml4ZWQoKSAmJiBzdHlsZSgpLT5tYXhXaWR0aCgp
LnZhbHVlICE9IFVOREVGSU5FRCkgewotICAgICAgICBtX21heFdpZHRoID0ga01pbihtX21heFdp
ZHRoLCBjYWxjQ29udGVudEJveFdpZHRoKHN0eWxlKCktPm1heFdpZHRoKCkudmFsdWUpKTsKLSAg
ICAgICAgbV9taW5XaWR0aCA9IGtNaW4obV9taW5XaWR0aCwgY2FsY0NvbnRlbnRCb3hXaWR0aChz
dHlsZSgpLT5tYXhXaWR0aCgpLnZhbHVlKSk7Ci0gICAgfQotCi0gICAgaW50IHRvQWRkID0gMDsK
LSAgICB0b0FkZCA9IGJvcmRlckxlZnQoKSArIGJvcmRlclJpZ2h0KCkgKyBwYWRkaW5nTGVmdCgp
ICsgcGFkZGluZ1JpZ2h0KCk7Ci0KLSAgICBtX21pbldpZHRoICs9IHRvQWRkOwotICAgIG1fbWF4
V2lkdGggKz0gdG9BZGQ7Ci0KLSAgICBzZXRNaW5NYXhLbm93bigpOwotCi0gICAgLy9rZERlYnVn
KCA2MDQwICkgPDwgIlRleHQ6OmNhbGNNaW5NYXhXaWR0aCgiIDw8IHRoaXMgPDwgIik6IG1pbiA9
ICIgPDwgbV9taW5XaWR0aCA8PCAiIG1heCA9ICIgPDwgbV9tYXhXaWR0aCA8PCBlbmRsOwotfQot
Ci1zdHJ1Y3QgSW5saW5lTWluTWF4SXRlcmF0b3IKLXsKLS8qIElubGluZU1pbk1heEl0ZXJhdG9y
IGlzIGEgY2xhc3MgdGhhdCB3aWxsIGl0ZXJhdGUgb3ZlciBhbGwgcmVuZGVyIG9iamVjdHMgdGhh
dCBjb250cmlidXRlIHRvCi0gICBpbmxpbmUgbWluL21heCB3aWR0aCBjYWxjdWxhdGlvbnMuICBO
b3RlIHRoZSBmb2xsb3dpbmcgYWJvdXQgdGhlIHdheSBpdCB3YWxrczoKLSAgICgxKSBQb3NpdGlv
bmVkIGNvbnRlbnQgaXMgc2tpcHBlZCAoc2luY2UgaXQgZG9lcyBub3QgY29udHJpYnV0ZSB0byBt
aW4vbWF4IHdpZHRoIG9mIGEgYmxvY2spCi0gICAoMikgV2UgZG8gbm90IGRyaWxsIGludG8gdGhl
IGNoaWxkcmVuIG9mIGZsb2F0cyBvciByZXBsYWNlZCBlbGVtZW50cywgc2luY2UgeW91IGNhbid0
IGJyZWFrCi0gICAgICAgaW4gdGhlIG1pZGRsZSBvZiBzdWNoIGFuIGVsZW1lbnQuCi0gICAoMykg
SW5saW5lIGZsb3dzIChlLmcuLCA8YT4sIDxzcGFuPiwgPGk+KSBhcmUgd2Fsa2VkIHR3aWNlLCBz
aW5jZSBlYWNoIHNpZGUgY2FuIGhhdmUKLSAgICAgICBkaXN0aW5jdCBib3JkZXJzL21hcmdpbi9w
YWRkaW5nIHRoYXQgY29udHJpYnV0ZSB0byB0aGUgbWluL21heCB3aWR0aC4KLSovCi0gICAgUmVu
ZGVyT2JqZWN0KiBwYXJlbnQ7Ci0gICAgUmVuZGVyT2JqZWN0KiBjdXJyZW50OwotICAgIGJvb2wg
ZW5kT2ZJbmxpbmU7Ci0KLSAgICBJbmxpbmVNaW5NYXhJdGVyYXRvcihSZW5kZXJPYmplY3QqIHAs
IFJlbmRlck9iamVjdCogbywgYm9vbCBlbmQgPSBmYWxzZSkKLSAgICAgICAgOnBhcmVudChwKSwg
Y3VycmVudChvKSwgZW5kT2ZJbmxpbmUoZW5kKSB7fQotCi0gICAgUmVuZGVyT2JqZWN0KiBuZXh0
KCk7Ci19OwotCi1SZW5kZXJPYmplY3QqIElubGluZU1pbk1heEl0ZXJhdG9yOjpuZXh0KCkKLXsK
LSAgICBSZW5kZXJPYmplY3QqIHJlc3VsdCA9IDA7Ci0gICAgYm9vbCBvbGRFbmRPZklubGluZSA9
IGVuZE9mSW5saW5lOwotICAgIGVuZE9mSW5saW5lID0gZmFsc2U7Ci0gICAgd2hpbGUgKGN1cnJl
bnQgIT0gMCB8fCAoY3VycmVudCA9PSBwYXJlbnQpKQotICAgIHsKLSAgICAgICAgLy9rZERlYnVn
KCA2MDQwICkgPDwgImN1cnJlbnQgPSAiIDw8IGN1cnJlbnQgPDwgZW5kbDsKLSAgICAgICAgaWYg
KCFvbGRFbmRPZklubGluZSAmJgotICAgICAgICAgICAgKGN1cnJlbnQgPT0gcGFyZW50IHx8Ci0g
ICAgICAgICAgICAgKCFjdXJyZW50LT5pc0Zsb2F0aW5nKCkgJiYgIWN1cnJlbnQtPmlzUmVwbGFj
ZWQoKSAmJiAhY3VycmVudC0+aXNQb3NpdGlvbmVkKCkpKSkKLSAgICAgICAgICAgIHJlc3VsdCA9
IGN1cnJlbnQtPmZpcnN0Q2hpbGQoKTsKLSAgICAgICAgaWYgKCFyZXN1bHQpIHsKLSAgICAgICAg
ICAgIC8vIFdlIGhpdCB0aGUgZW5kIG9mIG91ciBpbmxpbmUuIChJdCB3YXMgZW1wdHksIGUuZy4s
IDxzcGFuPjwvc3Bhbj4uKQotICAgICAgICAgICAgaWYgKCFvbGRFbmRPZklubGluZSAmJiBjdXJy
ZW50LT5pc0lubGluZUZsb3coKSkgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IGN1cnJlbnQ7
Ci0gICAgICAgICAgICAgICAgZW5kT2ZJbmxpbmUgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJy
ZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB3aGlsZSAoY3VycmVudCAmJiBjdXJy
ZW50ICE9IHBhcmVudCkgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IGN1cnJlbnQtPm5leHRT
aWJsaW5nKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkgYnJlYWs7Ci0gICAgICAgICAg
ICAgICAgY3VycmVudCA9IGN1cnJlbnQtPnBhcmVudCgpOwotICAgICAgICAgICAgICAgIGlmIChj
dXJyZW50ICYmIGN1cnJlbnQgIT0gcGFyZW50ICYmIGN1cnJlbnQtPmlzSW5saW5lRmxvdygpKSB7
Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGN1cnJlbnQ7Ci0gICAgICAgICAgICAgICAg
ICAgIGVuZE9mSW5saW5lID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFy
ZXN1bHQpIGJyZWFrOwotCi0gICAgICAgIGlmICghcmVzdWx0LT5pc1Bvc2l0aW9uZWQoKSAmJiAo
cmVzdWx0LT5pc1RleHQoKSB8fCByZXN1bHQtPmlzQlIoKSB8fAotICAgICAgICAgICAgcmVzdWx0
LT5pc0Zsb2F0aW5nKCkgfHwgcmVzdWx0LT5pc1JlcGxhY2VkKCkgfHwKLSAgICAgICAgICAgIHJl
c3VsdC0+aXNJbmxpbmVGbG93KCkpKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIAotICAg
ICAgICBjdXJyZW50ID0gcmVzdWx0OwotICAgICAgICByZXN1bHQgPSAwOwotICAgIH0KLQotICAg
IC8vIFVwZGF0ZSBvdXIgcG9zaXRpb24uCi0gICAgY3VycmVudCA9IHJlc3VsdDsKLSAgICByZXR1
cm4gY3VycmVudDsKLX0KLQotc3RhdGljIGludCBnZXRCUE1XaWR0aChpbnQgY2hpbGRWYWx1ZSwg
TGVuZ3RoIGNzc1VuaXQpCi17Ci0gICAgaWYgKGNzc1VuaXQudHlwZSAhPSBBdXRvKQotICAgICAg
ICByZXR1cm4gKGNzc1VuaXQudHlwZSA9PSBGaXhlZCA/IGNzc1VuaXQudmFsdWUgOiBjaGlsZFZh
bHVlKTsKLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBnZXRCb3JkZXJQYWRkaW5nTWFy
Z2luKFJlbmRlck9iamVjdCogY2hpbGQsIGJvb2wgZW5kT2ZJbmxpbmUpCi17Ci0gICAgUmVuZGVy
U3R5bGUqIGNzdHlsZSA9IGNoaWxkLT5zdHlsZSgpOwotICAgIGludCByZXN1bHQgPSAwOwotICAg
IGJvb2wgbGVmdFNpZGUgPSAoY3N0eWxlLT5kaXJlY3Rpb24oKSA9PSBMVFIpID8gIWVuZE9mSW5s
aW5lIDogZW5kT2ZJbmxpbmU7Ci0gICAgcmVzdWx0ICs9IGdldEJQTVdpZHRoKChsZWZ0U2lkZSA/
IGNoaWxkLT5tYXJnaW5MZWZ0KCkgOiBjaGlsZC0+bWFyZ2luUmlnaHQoKSksCi0gICAgICAgICAg
ICAgICAgICAgICAgICAgIChsZWZ0U2lkZSA/IGNzdHlsZS0+bWFyZ2luTGVmdCgpIDoKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3N0eWxlLT5tYXJnaW5SaWdodCgpKSk7
Ci0gICAgcmVzdWx0ICs9IGdldEJQTVdpZHRoKChsZWZ0U2lkZSA/IGNoaWxkLT5wYWRkaW5nTGVm
dCgpIDogY2hpbGQtPnBhZGRpbmdSaWdodCgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
KGxlZnRTaWRlID8gY3N0eWxlLT5wYWRkaW5nTGVmdCgpIDoKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgY3N0eWxlLT5wYWRkaW5nUmlnaHQoKSkpOwotICAgIHJlc3VsdCAr
PSBsZWZ0U2lkZSA/IGNoaWxkLT5ib3JkZXJMZWZ0KCkgOiBjaGlsZC0+Ym9yZGVyUmlnaHQoKTsK
LSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc3RyaXBUcmFpbGlu
Z1NwYWNlKGludCYgaW5saW5lTWF4LCBpbnQmIGlubGluZU1pbiwKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgUmVuZGVyT2JqZWN0KiB0cmFpbGluZ1NwYWNlQ2hpbGQpCi17
Ci0gICAgaWYgKHRyYWlsaW5nU3BhY2VDaGlsZCAmJiB0cmFpbGluZ1NwYWNlQ2hpbGQtPmlzVGV4
dCgpKSB7Ci0gICAgICAgIC8vIENvbGxhcHNlIGF3YXkgdGhlIHRyYWlsaW5nIHNwYWNlIGF0IHRo
ZSBlbmQgb2YgYSBibG9jay4KLSAgICAgICAgUmVuZGVyVGV4dCogdCA9IHN0YXRpY19jYXN0PFJl
bmRlclRleHQgKj4odHJhaWxpbmdTcGFjZUNoaWxkKTsKLSAgICAgICAgY29uc3QgRm9udCAqZiA9
IHQtPmh0bWxGb250KCBmYWxzZSApOwotICAgICAgICBRQ2hhciBzcGFjZVsxXTsgc3BhY2VbMF0g
PSAnICc7Ci0gICAgICAgIGludCBzcGFjZVdpZHRoID0gZi0+d2lkdGgoc3BhY2UsIDEsIDAsIDAp
OwotICAgICAgICBpbmxpbmVNYXggLT0gc3BhY2VXaWR0aDsKLSAgICAgICAgaWYgKGlubGluZU1p
biA+IGlubGluZU1heCkKLSAgICAgICAgICAgIGlubGluZU1pbiA9IGlubGluZU1heDsKLSAgICB9
Ci19Ci0KLXZvaWQgUmVuZGVyQmxvY2s6OmNhbGNJbmxpbmVNaW5NYXhXaWR0aCgpCi17Ci0gICAg
aW50IGlubGluZU1heD0wOwotICAgIGludCBpbmxpbmVNaW49MDsKLQotICAgIGludCBjdyA9IGNv
bnRhaW5pbmdCbG9jaygpLT5jb250ZW50V2lkdGgoKTsKLQotICAgIC8vIElmIHdlIGFyZSBhdCB0
aGUgc3RhcnQgb2YgYSBsaW5lLCB3ZSB3YW50IHRvIGlnbm9yZSBhbGwgd2hpdGUtc3BhY2UuCi0g
ICAgLy8gQWxzbyBzdHJpcCBzcGFjZXMgaWYgd2UgcHJldmlvdXNseSBoYWQgdGV4dCB0aGF0IGVu
ZGVkIGluIGEgdHJhaWxpbmcgc3BhY2UuCi0gICAgYm9vbCBzdHJpcEZyb250U3BhY2VzID0gdHJ1
ZTsKLSAgICBSZW5kZXJPYmplY3QqIHRyYWlsaW5nU3BhY2VDaGlsZCA9IDA7Ci0KLSAgICBib29s
IGF1dG9XcmFwLCBvbGRBdXRvV3JhcDsKLSAgICBhdXRvV3JhcCA9IG9sZEF1dG9XcmFwID0gc3R5
bGUoKS0+YXV0b1dyYXAoKTsKLQotICAgIElubGluZU1pbk1heEl0ZXJhdG9yIGNoaWxkSXRlcmF0
b3IodGhpcywgdGhpcyk7Ci0gICAgYm9vbCBhZGRlZFRleHRJbmRlbnQgPSBmYWxzZTsgLy8gT25s
eSBnZXRzIGFkZGVkIGluIG9uY2UuCi0gICAgUmVuZGVyT2JqZWN0KiBwcmV2RmxvYXQgPSAwOwot
ICAgIHdoaWxlIChSZW5kZXJPYmplY3QqIGNoaWxkID0gY2hpbGRJdGVyYXRvci5uZXh0KCkpCi0g
ICAgewotICAgICAgICBhdXRvV3JhcCA9IGNoaWxkLT5zdHlsZSgpLT5hdXRvV3JhcCgpOwotCi0g
ICAgICAgIGlmICghY2hpbGQtPmlzQlIoKSkgewotICAgICAgICAgICAgLy8gU3RlcCBPbmU6IGRl
dGVybWluZSB3aGV0aGVyIG9yIG5vdCB3ZSBuZWVkIHRvIGdvIGFoZWFkIGFuZAotICAgICAgICAg
ICAgLy8gdGVybWluYXRlIG91ciBjdXJyZW50IGxpbmUuICBFYWNoIGRpc2NyZXRlIGNodW5rIGNh
biBiZWNvbWUKLSAgICAgICAgICAgIC8vIHRoZSBuZXcgbWluLXdpZHRoLCBpZiBpdCBpcyB0aGUg
d2lkZXN0IGNodW5rIHNlZW4gc28gZmFyLCBhbmQKLSAgICAgICAgICAgIC8vIGl0IGNhbiBhbHNv
IGJlY29tZSB0aGUgbWF4LXdpZHRoLgotCi0gICAgICAgICAgICAvLyBDaGlsZHJlbiBmYWxsIGlu
dG8gdGhyZWUgY2F0ZWdvcmllczoKLSAgICAgICAgICAgIC8vICgxKSBBbiBpbmxpbmUgZmxvdyBv
YmplY3QuICBUaGVzZSBvYmplY3RzIGFsd2F5cyBoYXZlIGEgbWluL21heCBvZiAwLAotICAgICAg
ICAgICAgLy8gYW5kIGFyZSBpbmNsdWRlZCBpbiB0aGUgaXRlcmF0aW9uIHNvbGVseSBzbyB0aGF0
IHRoZWlyIG1hcmdpbnMgY2FuCi0gICAgICAgICAgICAvLyBiZSBhZGRlZCBpbi4KLSAgICAgICAg
ICAgIC8vCi0gICAgICAgICAgICAvLyAoMikgQW4gaW5saW5lIG5vbi10ZXh0IG5vbi1mbG93IG9i
amVjdCwgZS5nLiwgYW4gaW5saW5lIHJlcGxhY2VkIGVsZW1lbnQuCi0gICAgICAgICAgICAvLyBU
aGVzZSBvYmplY3RzIGNhbiBhbHdheXMgYmUgb24gYSBsaW5lIGJ5IHRoZW1zZWx2ZXMsIHNvIGlu
IHRoaXMgc2l0dWF0aW9uCi0gICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIGdvIGFoZWFkIGFuZCBi
cmVhayB0aGUgY3VycmVudCBsaW5lLCBhbmQgdGhlbiBhZGQgaW4gb3VyIG93bgotICAgICAgICAg
ICAgLy8gbWFyZ2lucyBhbmQgbWluL21heCB3aWR0aCBvbiBpdHMgb3duIGxpbmUsIGFuZCB0aGVu
IHRlcm1pbmF0ZSB0aGUgbGluZS4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyAoMykg
QSB0ZXh0IG9iamVjdC4gIFRleHQgcnVucyBjYW4gaGF2ZSBicmVha2FibGUgY2hhcmFjdGVycyBh
dCB0aGUgc3RhcnQsCi0gICAgICAgICAgICAvLyB0aGUgbWlkZGxlIG9yIHRoZSBlbmQuICBUaGV5
IG1heSBhbHNvIGxvc2Ugd2hpdGVzcGFjZSBvZmYgdGhlIGZyb250IGlmCi0gICAgICAgICAgICAv
LyB3ZSdyZSBhbHJlYWR5IGlnbm9yaW5nIHdoaXRlc3BhY2UuICBJbiBvcmRlciB0byBjb21wdXRl
IGFjY3VyYXRlIG1pbi13aWR0aAotICAgICAgICAgICAgLy8gaW5mb3JtYXRpb24sIHdlIG5lZWQg
dGhyZWUgcGllY2VzIG9mIGluZm9ybWF0aW9uLgotICAgICAgICAgICAgLy8gKGEpIHRoZSBtaW4t
d2lkdGggb2YgdGhlIGZpcnN0IG5vbi1icmVha2FibGUgcnVuLiAgU2hvdWxkIGJlIDAgaWYgdGhl
IHRleHQgc3RyaW5nCi0gICAgICAgICAgICAvLyBzdGFydHMgd2l0aCB3aGl0ZXNwYWNlLgotICAg
ICAgICAgICAgLy8gKGIpIHRoZSBtaW4td2lkdGggb2YgdGhlIGxhc3Qgbm9uLWJyZWFrYWJsZSBy
dW4uIFNob3VsZCBiZSAwIGlmIHRoZSB0ZXh0IHN0cmluZwotICAgICAgICAgICAgLy8gZW5kcyB3
aXRoIHdoaXRlc3BhY2UuCi0gICAgICAgICAgICAvLyAoYykgdGhlIG1pbi9tYXggd2lkdGggb2Yg
dGhlIHN0cmluZyAodHJpbW1lZCBmb3Igd2hpdGVzcGFjZSkuCi0gICAgICAgICAgICAvLwotICAg
ICAgICAgICAgLy8gSWYgdGhlIHRleHQgc3RyaW5nIHN0YXJ0cyB3aXRoIHdoaXRlc3BhY2UsIHRo
ZW4gd2UgbmVlZCB0byBnbyBhaGVhZCBhbmQKLSAgICAgICAgICAgIC8vIHRlcm1pbmF0ZSBvdXIg
Y3VycmVudCBsaW5lICh1bmxlc3Mgd2UncmUgYWxyZWFkeSBpbiBhIHdoaXRlc3BhY2Ugc3RyaXBw
aW5nCi0gICAgICAgICAgICAvLyBtb2RlLgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8v
IElmIHRoZSB0ZXh0IHN0cmluZyBoYXMgYSBicmVha2FibGUgY2hhcmFjdGVyIGluIHRoZSBtaWRk
bGUsIGJ1dCBkaWRuJ3Qgc3RhcnQKLSAgICAgICAgICAgIC8vIHdpdGggd2hpdGVzcGFjZSwgdGhl
biB3ZSBhZGQgdGhlIHdpZHRoIG9mIHRoZSBmaXJzdCBub24tYnJlYWthYmxlIHJ1biBhbmQKLSAg
ICAgICAgICAgIC8vIHRoZW4gZW5kIHRoZSBjdXJyZW50IGxpbmUuICBXZSB0aGVuIG5lZWQgdG8g
dXNlIHRoZSBpbnRlcm1lZGlhdGUgbWluL21heCB3aWR0aAotICAgICAgICAgICAgLy8gdmFsdWVz
IChpZiBhbnkgb2YgdGhlbSBhcmUgbGFyZ2VyIHRoYW4gb3VyIGN1cnJlbnQgbWluL21heCkuICBX
ZSB0aGVuIGxvb2sgYXQKLSAgICAgICAgICAgIC8vIHRoZSB3aWR0aCBvZiB0aGUgbGFzdCBub24t
YnJlYWthYmxlIHJ1biBhbmQgdXNlIHRoYXQgdG8gc3RhcnQgYSBuZXcgbGluZQotICAgICAgICAg
ICAgLy8gKHVubGVzcyB3ZSBlbmQgaW4gd2hpdGVzcGFjZSkuCi0gICAgICAgICAgICBSZW5kZXJT
dHlsZSogY3N0eWxlID0gY2hpbGQtPnN0eWxlKCk7Ci0gICAgICAgICAgICBpbnQgY2hpbGRNaW4g
PSAwOwotICAgICAgICAgICAgaW50IGNoaWxkTWF4ID0gMDsKLQotICAgICAgICAgICAgaWYgKCFj
aGlsZC0+aXNUZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAvLyBDYXNlICgxKSBhbmQgKDIpLiAg
SW5saW5lIHJlcGxhY2VkIGFuZCBpbmxpbmUgZmxvdyBlbGVtZW50cy4KLSAgICAgICAgICAgICAg
ICBpZiAoY2hpbGQtPmlzSW5saW5lRmxvdygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEFk
ZCBpbiBwYWRkaW5nL2JvcmRlci9tYXJnaW4gZnJvbSB0aGUgYXBwcm9wcmlhdGUgc2lkZSBvZgot
ICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZWxlbWVudC4KLSAgICAgICAgICAgICAgICAgICAg
aW50IGJwbSA9IGdldEJvcmRlclBhZGRpbmdNYXJnaW4oY2hpbGQsIGNoaWxkSXRlcmF0b3IuZW5k
T2ZJbmxpbmUpOwotICAgICAgICAgICAgICAgICAgICBjaGlsZE1pbiArPSBicG07Ci0gICAgICAg
ICAgICAgICAgICAgIGNoaWxkTWF4ICs9IGJwbTsKLQotICAgICAgICAgICAgICAgICAgICBpbmxp
bmVNaW4gKz0gY2hpbGRNaW47Ci0gICAgICAgICAgICAgICAgICAgIGlubGluZU1heCArPSBjaGls
ZE1heDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAg
ICAgICAgICAgICAgIC8vIElubGluZSByZXBsYWNlZCBlbHRzIGFkZCBpbiB0aGVpciBtYXJnaW5z
IHRvIHRoZWlyIG1pbi9tYXggdmFsdWVzLgotICAgICAgICAgICAgICAgICAgICBpbnQgbWFyZ2lu
cyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIExlbmd0aFR5cGUgdHlwZSA9IGNzdHlsZS0+bWFy
Z2luTGVmdCgpLnR5cGU7Ci0gICAgICAgICAgICAgICAgICAgIGlmICggdHlwZSAhPSBBdXRvICkK
LSAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbnMgKz0gKHR5cGUgPT0gRml4ZWQgPyBjc3R5
bGUtPm1hcmdpbkxlZnQoKS52YWx1ZSA6IGNoaWxkLT5tYXJnaW5MZWZ0KCkpOwotICAgICAgICAg
ICAgICAgICAgICB0eXBlID0gY3N0eWxlLT5tYXJnaW5SaWdodCgpLnR5cGU7Ci0gICAgICAgICAg
ICAgICAgICAgIGlmICggdHlwZSAhPSBBdXRvICkKLSAgICAgICAgICAgICAgICAgICAgICAgIG1h
cmdpbnMgKz0gKHR5cGUgPT0gRml4ZWQgPyBjc3R5bGUtPm1hcmdpblJpZ2h0KCkudmFsdWUgOiBj
aGlsZC0+bWFyZ2luUmlnaHQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNoaWxkTWluICs9IG1h
cmdpbnM7Ci0gICAgICAgICAgICAgICAgICAgIGNoaWxkTWF4ICs9IG1hcmdpbnM7Ci0gICAgICAg
ICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIWNoaWxkLT5pc1Jl
bmRlcklubGluZSgpICYmICFjaGlsZC0+aXNUZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAvLyBD
YXNlICgyKS4gSW5saW5lIHJlcGxhY2VkIGVsZW1lbnRzIGFuZCBmbG9hdHMuCi0gICAgICAgICAg
ICAgICAgLy8gR28gYWhlYWQgYW5kIHRlcm1pbmF0ZSB0aGUgY3VycmVudCBsaW5lIGFzIGZhciBh
cwotICAgICAgICAgICAgICAgIC8vIG1pbndpZHRoIGlzIGNvbmNlcm5lZC4KLSAgICAgICAgICAg
ICAgICBjaGlsZE1pbiArPSBjaGlsZC0+bWluV2lkdGgoKTsKLSAgICAgICAgICAgICAgICBjaGls
ZE1heCArPSBjaGlsZC0+bWF4V2lkdGgoKTsKLQotICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBU
aGlzIGlzbid0IHJpZ2h0LiAgV2luSUUsIE9wZXJhLCBNb3ppbGxhIGFsbCBkbyB0aGlzIGRpZmZl
cmVudGx5IGFuZAotICAgICAgICAgICAgICAgIC8vIHRyZWF0IHJlcGxhY2VkIGVsZW1lbnRzIGxp
a2UgY2hhcmFjdGVycyBpbiBhIHdvcmQuCi0gICAgICAgICAgICAgICAgaWYgKGF1dG9XcmFwIHx8
IG9sZEF1dG9XcmFwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKG1fbWluV2lkdGggPCBpbmxp
bmVNaW4pIG1fbWluV2lkdGggPSBpbmxpbmVNaW47Ci0gICAgICAgICAgICAgICAgICAgIGlubGlu
ZU1pbiA9IDA7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gQ2hlY2sg
b3VyICJjbGVhciIgc2V0dGluZy4gIElmIHdlJ3JlIHN1cHBvc2VkIHRvIGNsZWFyIHRoZSBwcmV2
aW91cyBmbG9hdCwgdGhlbgotICAgICAgICAgICAgICAgIC8vIGdvIGFoZWFkIGFuZCB0ZXJtaW5h
dGUgbWF4d2lkdGggYXMgd2VsbC4KLSAgICAgICAgICAgICAgICBpZiAoY2hpbGQtPmlzRmxvYXRp
bmcoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocHJldkZsb2F0ICYmCi0gICAgICAgICAg
ICAgICAgICAgICAgICAoKHByZXZGbG9hdC0+c3R5bGUoKS0+ZmxvYXRpbmcoKSA9PSBGTEVGVCAm
JiAoY2hpbGQtPnN0eWxlKCktPmNsZWFyKCkgJiBDTEVGVCkpIHx8Ci0gICAgICAgICAgICAgICAg
ICAgICAgICAgKHByZXZGbG9hdC0+c3R5bGUoKS0+ZmxvYXRpbmcoKSA9PSBGUklHSFQgJiYgKGNo
aWxkLT5zdHlsZSgpLT5jbGVhcigpICYgQ1JJR0hUKSkpKSB7Ci0gICAgICAgICAgICAgICAgICAg
ICAgICBtX21heFdpZHRoID0ga01heChpbmxpbmVNYXgsIG1fbWF4V2lkdGgpOwotICAgICAgICAg
ICAgICAgICAgICAgICAgaW5saW5lTWF4ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAg
ICAgICAgICAgICAgICAgICBwcmV2RmxvYXQgPSBjaGlsZDsKLSAgICAgICAgICAgICAgICB9Ci0g
ICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gQWRkIGluIHRleHQtaW5kZW50LiAg
VGhpcyBpcyBhZGRlZCBpbiBvbmx5IG9uY2UuCi0gICAgICAgICAgICAgICAgaW50IHRpID0gMDsK
LSAgICAgICAgICAgICAgICBpZiAoIWFkZGVkVGV4dEluZGVudCkgewotICAgICAgICAgICAgICAg
ICAgICBhZGRlZFRleHRJbmRlbnQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB0aSA9IHN0
eWxlKCktPnRleHRJbmRlbnQoKS5taW5XaWR0aChjdyk7Ci0gICAgICAgICAgICAgICAgICAgIGNo
aWxkTWluKz10aTsKLSAgICAgICAgICAgICAgICAgICAgY2hpbGRNYXgrPXRpOwotICAgICAgICAg
ICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBBZGQgb3VyIHdp
ZHRoIHRvIHRoZSBtYXguCi0gICAgICAgICAgICAgICAgaW5saW5lTWF4ICs9IGNoaWxkTWF4Owot
Ci0gICAgICAgICAgICAgICAgaWYgKCFhdXRvV3JhcCkKLSAgICAgICAgICAgICAgICAgICAgaW5s
aW5lTWluICs9IGNoaWxkTWluOwotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAg
ICAgICAgICAvLyBOb3cgY2hlY2sgb3VyIGxpbmUuCi0gICAgICAgICAgICAgICAgICAgIGlubGlu
ZU1pbiA9IGNoaWxkTWluOwotICAgICAgICAgICAgICAgICAgICBpZihtX21pbldpZHRoIDwgaW5s
aW5lTWluKSBtX21pbldpZHRoID0gaW5saW5lTWluOwotCi0gICAgICAgICAgICAgICAgICAgIC8v
IE5vdyBzdGFydCBhIG5ldyBsaW5lLgotICAgICAgICAgICAgICAgICAgICBpbmxpbmVNaW4gPSAw
OwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBubyBsb25n
ZXIgc3RyaXBwaW5nIHdoaXRlc3BhY2UgYXQgdGhlIHN0YXJ0IG9mCi0gICAgICAgICAgICAgICAg
Ly8gYSBsaW5lLgotICAgICAgICAgICAgICAgIGlmICghY2hpbGQtPmlzRmxvYXRpbmcoKSkgewot
ICAgICAgICAgICAgICAgICAgICBzdHJpcEZyb250U3BhY2VzID0gZmFsc2U7Ci0gICAgICAgICAg
ICAgICAgICAgIHRyYWlsaW5nU3BhY2VDaGlsZCA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAg
ICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoY2hpbGQtPmlzVGV4dCgpKQotICAgICAg
ICAgICAgewotICAgICAgICAgICAgICAgIC8vIENhc2UgKDMpLiBUZXh0LgotICAgICAgICAgICAg
ICAgIFJlbmRlclRleHQqIHQgPSBzdGF0aWNfY2FzdDxSZW5kZXJUZXh0ICo+KGNoaWxkKTsKLQot
ICAgICAgICAgICAgICAgIC8vIERldGVybWluZSBpZiB3ZSBoYXZlIGEgYnJlYWthYmxlIGNoYXJh
Y3Rlci4gIFBhc3MgaW4KLSAgICAgICAgICAgICAgICAvLyB3aGV0aGVyIG9yIG5vdCB3ZSBzaG91
bGQgaWdub3JlIGFueSBzcGFjZXMgYXQgdGhlIGZyb250Ci0gICAgICAgICAgICAgICAgLy8gb2Yg
dGhlIHN0cmluZy4gIElmIHRob3NlIGFyZSBnb2luZyB0byBiZSBzdHJpcHBlZCBvdXQsCi0gICAg
ICAgICAgICAgICAgLy8gdGhlbiB0aGV5IHNob3VsZG4ndCBiZSBjb25zaWRlcmVkIGluIHRoZSBi
cmVha2FibGUgY2hhcgotICAgICAgICAgICAgICAgIC8vIGNoZWNrLgotICAgICAgICAgICAgICAg
IGJvb2wgaGFzQnJlYWthYmxlQ2hhciwgaGFzQnJlYWs7Ci0gICAgICAgICAgICAgICAgaW50IGJl
Z2luTWluLCBlbmRNaW47Ci0gICAgICAgICAgICAgICAgYm9vbCBiZWdpbldTLCBlbmRXUzsKLSAg
ICAgICAgICAgICAgICBpbnQgYmVnaW5NYXgsIGVuZE1heDsKLSAgICAgICAgICAgICAgICB0LT50
cmltbWVkTWluTWF4V2lkdGgoaW5saW5lTWF4LCBiZWdpbk1pbiwgYmVnaW5XUywgZW5kTWluLCBl
bmRXUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzQnJlYWthYmxl
Q2hhciwgaGFzQnJlYWssIGJlZ2luTWF4LCBlbmRNYXgsCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGNoaWxkTWluLCBjaGlsZE1heCwgc3RyaXBGcm9udFNwYWNlcyk7Ci0K
LSAgICAgICAgICAgICAgICAvLyBUaGlzIHRleHQgb2JqZWN0IGlzIGluc2lnbmlmaWNhbnQgYW5k
IHdpbGwgbm90IGJlIHJlbmRlcmVkLiAgSnVzdAotICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVl
LgotICAgICAgICAgICAgICAgIGlmICghaGFzQnJlYWsgJiYgY2hpbGRNYXggPT0gMCkgY29udGlu
dWU7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHN0cmlwRnJvbnRTcGFj
ZXMpCi0gICAgICAgICAgICAgICAgICAgIHRyYWlsaW5nU3BhY2VDaGlsZCA9IGNoaWxkOwotICAg
ICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgdHJhaWxpbmdTcGFjZUNoaWxk
ID0gMDsKLQotICAgICAgICAgICAgICAgIC8vIEFkZCBpbiB0ZXh0LWluZGVudC4gIFRoaXMgaXMg
YWRkZWQgaW4gb25seSBvbmNlLgotICAgICAgICAgICAgICAgIGludCB0aSA9IDA7Ci0gICAgICAg
ICAgICAgICAgaWYgKCFhZGRlZFRleHRJbmRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRk
ZWRUZXh0SW5kZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgdGkgPSBzdHlsZSgpLT50
ZXh0SW5kZW50KCkubWluV2lkdGgoY3cpOwotICAgICAgICAgICAgICAgICAgICBjaGlsZE1pbis9
dGk7IGJlZ2luTWluICs9IHRpOwotICAgICAgICAgICAgICAgICAgICBjaGlsZE1heCs9dGk7IGJl
Z2luTWF4ICs9IHRpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAg
ICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIG5vIGJyZWFrYWJsZSBjaGFyYWN0ZXJzIGF0IGFsbCwK
LSAgICAgICAgICAgICAgICAvLyB0aGVuIHRoaXMgaXMgdGhlIGVhc3kgY2FzZS4gV2UgYWRkIG91
cnNlbHZlcyB0byB0aGUgY3VycmVudAotICAgICAgICAgICAgICAgIC8vIG1pbiBhbmQgbWF4IGFu
ZCBjb250aW51ZS4KLSAgICAgICAgICAgICAgICBpZiAoIWhhc0JyZWFrYWJsZUNoYXIpIHsKLSAg
ICAgICAgICAgICAgICAgICAgaW5saW5lTWluICs9IGNoaWxkTWluOwotICAgICAgICAgICAgICAg
IH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gV2UgaGF2
ZSBhIGJyZWFrYWJsZSBjaGFyYWN0ZXIuICBOb3cgd2UgbmVlZCB0byBrbm93IGlmCi0gICAgICAg
ICAgICAgICAgICAgIC8vIHdlIHN0YXJ0IGFuZCBlbmQgd2l0aCB3aGl0ZXNwYWNlLgotICAgICAg
ICAgICAgICAgICAgICBpZiAoYmVnaW5XUykgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8g
R28gYWhlYWQgYW5kIGVuZCB0aGUgY3VycmVudCBsaW5lLgotICAgICAgICAgICAgICAgICAgICAg
ICAgaWYobV9taW5XaWR0aCA8IGlubGluZU1pbikgbV9taW5XaWR0aCA9IGlubGluZU1pbjsKLSAg
ICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAg
ICAgICAgICAgICAgICAgIGlubGluZU1pbiArPSBiZWdpbk1pbjsKLSAgICAgICAgICAgICAgICAg
ICAgICAgIGlmKG1fbWluV2lkdGggPCBpbmxpbmVNaW4pIG1fbWluV2lkdGggPSBpbmxpbmVNaW47
Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZE1pbiAtPSB0aTsKLSAgICAgICAgICAgICAg
ICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlubGluZU1pbiA9IGNoaWxkTWluOwotCi0g
ICAgICAgICAgICAgICAgICAgIGlmIChlbmRXUykgewotICAgICAgICAgICAgICAgICAgICAgICAg
Ly8gV2UgZW5kIGluIHdoaXRlc3BhY2UsIHdoaWNoIG1lYW5zIHdlIGNhbiBnbyBhaGVhZAotICAg
ICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGVuZCBvdXIgY3VycmVudCBsaW5lLgotICAgICAg
ICAgICAgICAgICAgICAgICAgaWYobV9taW5XaWR0aCA8IGlubGluZU1pbikgbV9taW5XaWR0aCA9
IGlubGluZU1pbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlubGluZU1pbiA9IDA7Ci0gICAg
ICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAg
ICAgICAgICAgICAgICBpZihtX21pbldpZHRoIDwgaW5saW5lTWluKSBtX21pbldpZHRoID0gaW5s
aW5lTWluOwotICAgICAgICAgICAgICAgICAgICAgICAgaW5saW5lTWluID0gZW5kTWluOwotICAg
ICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAg
aWYgKGhhc0JyZWFrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlubGluZU1heCArPSBiZWdpbk1h
eDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1fbWF4V2lkdGggPCBpbmxpbmVNYXgpIG1fbWF4
V2lkdGggPSBpbmxpbmVNYXg7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtX21heFdpZHRoIDwg
Y2hpbGRNYXgpIG1fbWF4V2lkdGggPSBjaGlsZE1heDsKLSAgICAgICAgICAgICAgICAgICAgaW5s
aW5lTWF4ID0gZW5kTWF4OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNl
Ci0gICAgICAgICAgICAgICAgICAgIGlubGluZU1heCArPSBjaGlsZE1heDsKLSAgICAgICAgICAg
IH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKG1f
bWluV2lkdGggPCBpbmxpbmVNaW4pIG1fbWluV2lkdGggPSBpbmxpbmVNaW47Ci0gICAgICAgICAg
ICBpZihtX21heFdpZHRoIDwgaW5saW5lTWF4KSBtX21heFdpZHRoID0gaW5saW5lTWF4OwotICAg
ICAgICAgICAgaW5saW5lTWluID0gaW5saW5lTWF4ID0gMDsKLSAgICAgICAgICAgIHN0cmlwRnJv
bnRTcGFjZXMgPSB0cnVlOwotICAgICAgICAgICAgdHJhaWxpbmdTcGFjZUNoaWxkID0gMDsKLSAg
ICAgICAgfQotCi0gICAgICAgIG9sZEF1dG9XcmFwID0gYXV0b1dyYXA7Ci0gICAgfQotCi0gICAg
aWYgKHN0eWxlKCktPmNvbGxhcHNlV2hpdGVTcGFjZSgpKQotICAgICAgICBzdHJpcFRyYWlsaW5n
U3BhY2UoaW5saW5lTWF4LCBpbmxpbmVNaW4sIHRyYWlsaW5nU3BhY2VDaGlsZCk7Ci0gICAgCi0g
ICAgbV9taW5XaWR0aCA9IGtNYXgoaW5saW5lTWluLCBtX21pbldpZHRoKTsKLSAgICBtX21heFdp
ZHRoID0ga01heChpbmxpbmVNYXgsIG1fbWF4V2lkdGgpOwotfQotCi0vLyBVc2UgYSB2ZXJ5IGxh
cmdlIHZhbHVlIChpbiBlZmZlY3QgaW5maW5pdGUpLgotI2RlZmluZSBCTE9DS19NQVhfV0lEVEgg
MTUwMDAKLQotdm9pZCBSZW5kZXJCbG9jazo6Y2FsY0Jsb2NrTWluTWF4V2lkdGgoKQotewotICAg
IGJvb2wgbm93cmFwID0gc3R5bGUoKS0+d2hpdGVTcGFjZSgpID09IE5PV1JBUDsKLQotICAgIFJl
bmRlck9iamVjdCAqY2hpbGQgPSBmaXJzdENoaWxkKCk7Ci0gICAgaW50IGZsb2F0TGVmdFdpZHRo
ID0gMCwgZmxvYXRSaWdodFdpZHRoID0gMDsKLSAgICB3aGlsZSAoY2hpbGQpIHsKLSAgICAgICAg
Ly8gUG9zaXRpb25lZCBjaGlsZHJlbiBkb24ndCBhZmZlY3QgdGhlIG1pbi9tYXggd2lkdGgKLSAg
ICAgICAgaWYgKGNoaWxkLT5pc1Bvc2l0aW9uZWQoKSkgewotICAgICAgICAgICAgY2hpbGQgPSBj
aGlsZC0+bmV4dFNpYmxpbmcoKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0K
LSAgICAgICAgaWYgKGNoaWxkLT5pc0Zsb2F0aW5nKCkgfHwgY2hpbGQtPmF2b2lkc0Zsb2F0cygp
KSB7Ci0gICAgICAgICAgICBpbnQgZmxvYXRUb3RhbFdpZHRoID0gZmxvYXRMZWZ0V2lkdGggKyBm
bG9hdFJpZ2h0V2lkdGg7Ci0gICAgICAgICAgICBpZiAoY2hpbGQtPnN0eWxlKCktPmNsZWFyKCkg
JiBDTEVGVCkgewotICAgICAgICAgICAgICAgIG1fbWF4V2lkdGggPSBrTWF4KGZsb2F0VG90YWxX
aWR0aCwgbV9tYXhXaWR0aCk7Ci0gICAgICAgICAgICAgICAgZmxvYXRMZWZ0V2lkdGggPSAwOwot
ICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNoaWxkLT5zdHlsZSgpLT5jbGVhcigpICYg
Q1JJR0hUKSB7Ci0gICAgICAgICAgICAgICAgbV9tYXhXaWR0aCA9IGtNYXgoZmxvYXRUb3RhbFdp
ZHRoLCBtX21heFdpZHRoKTsKLSAgICAgICAgICAgICAgICBmbG9hdFJpZ2h0V2lkdGggPSAwOwot
ICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgTGVuZ3RoIG1sID0gY2hpbGQtPnN0
eWxlKCktPm1hcmdpbkxlZnQoKTsKLSAgICAgICAgTGVuZ3RoIG1yID0gY2hpbGQtPnN0eWxlKCkt
Pm1hcmdpblJpZ2h0KCk7Ci0KLSAgICAgICAgLy8gQ2FsbCBjYWxjV2lkdGggb24gdGhlIGNoaWxk
IHRvIGVuc3VyZSB0aGF0IG91ciBtYXJnaW5zIGFyZQotICAgICAgICAvLyB1cCB0byBkYXRlLiAg
VGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCBiZWZvcmUgdGhlIGNoaWxkIGhhcyBhY3R1YWxseQot
ICAgICAgICAvLyBjYWxjdWxhdGVkIGl0cyBtYXJnaW5zICh3aGljaCBhcmUgY29tcHV0ZWQgaW5z
aWRlIGNhbGNXaWR0aCkuCi0gICAgICAgIGlmIChtbC50eXBlID09IFBlcmNlbnQgfHwgbXIudHlw
ZSA9PSBQZXJjZW50KQotICAgICAgICAgICAgY2FsY1dpZHRoKCk7Ci0KLSAgICAgICAgLy8gQSBt
YXJnaW4gYmFzaWNhbGx5IGhhcyB0aHJlZSB0eXBlczogZml4ZWQsIHBlcmNlbnRhZ2UsIGFuZCBh
dXRvICh2YXJpYWJsZSkuCi0gICAgICAgIC8vIEF1dG8gbWFyZ2lucyBzaW1wbHkgYmVjb21lIDAg
d2hlbiBjb21wdXRpbmcgbWluL21heCB3aWR0aC4KLSAgICAgICAgLy8gRml4ZWQgbWFyZ2lucyBj
YW4gYmUgYWRkZWQgaW4gYXMgaXMuCi0gICAgICAgIC8vIFBlcmNlbnRhZ2UgbWFyZ2lucyBhcmUg
Y29tcHV0ZWQgYXMgYSBwZXJjZW50YWdlIG9mIHRoZSB3aWR0aCB3ZSBjYWxjdWxhdGVkIGluCi0g
ICAgICAgIC8vIHRoZSBjYWxjV2lkdGggY2FsbCBhYm92ZS4gIEluIHRoaXMgY2FzZSB3ZSB1c2Ug
dGhlIGFjdHVhbCBjYWNoZWQgbWFyZ2luIHZhbHVlcyBvbgotICAgICAgICAvLyB0aGUgUmVuZGVy
T2JqZWN0IGl0c2VsZi4KLSAgICAgICAgaW50IG1hcmdpbiA9IDAsIG1hcmdpbkxlZnQgPSAwLCBt
YXJnaW5SaWdodCA9IDA7Ci0gICAgICAgIGlmIChtbC50eXBlID09IEZpeGVkKQotICAgICAgICAg
ICAgbWFyZ2luTGVmdCArPSBtbC52YWx1ZTsKLSAgICAgICAgZWxzZSBpZiAobWwudHlwZSA9PSBQ
ZXJjZW50KQotICAgICAgICAgICAgbWFyZ2luTGVmdCArPSBjaGlsZC0+bWFyZ2luTGVmdCgpOwot
ICAgICAgICBpZiAobXIudHlwZSA9PSBGaXhlZCkKLSAgICAgICAgICAgIG1hcmdpblJpZ2h0ICs9
IG1yLnZhbHVlOwotICAgICAgICBlbHNlIGlmIChtci50eXBlID09IFBlcmNlbnQpCi0gICAgICAg
ICAgICBtYXJnaW5SaWdodCArPSBjaGlsZC0+bWFyZ2luUmlnaHQoKTsKLSAgICAgICAgbWFyZ2lu
ID0gbWFyZ2luTGVmdCArIG1hcmdpblJpZ2h0OwotCi0gICAgICAgIGludCB3ID0gY2hpbGQtPm1p
bldpZHRoKCkgKyBtYXJnaW47Ci0gICAgICAgIGlmIChtX21pbldpZHRoIDwgdykgbV9taW5XaWR0
aCA9IHc7Ci0gICAgICAgIAotICAgICAgICAvLyBJRSBpZ25vcmVzIHRhYmxlcyBmb3IgY2FsY3Vs
YXRpb24gb2Ygbm93cmFwLiBNYWtlcyBzb21lIHNlbnNlLgotICAgICAgICBpZiAobm93cmFwICYm
ICFjaGlsZC0+aXNUYWJsZSgpICYmIG1fbWF4V2lkdGggPCB3KQotICAgICAgICAgICAgbV9tYXhX
aWR0aCA9IHc7Ci0KLSAgICAgICAgdyA9IGNoaWxkLT5tYXhXaWR0aCgpICsgbWFyZ2luOwotCi0g
ICAgICAgIGlmICghY2hpbGQtPmlzRmxvYXRpbmcoKSkgewotICAgICAgICAgICAgaWYgKGNoaWxk
LT5hdm9pZHNGbG9hdHMoKSkgewotICAgICAgICAgICAgICAgIC8vIERldGVybWluZSBhIGxlZnQg
YW5kIHJpZ2h0IG1heCB2YWx1ZSBiYXNlZCBvZmYgd2hldGhlciBvciBub3QgdGhlIGZsb2F0cyBj
YW4gZml0IGluIHRoZQotICAgICAgICAgICAgICAgIC8vIG1hcmdpbnMgb2YgdGhlIG9iamVjdC4g
IEZvciBuZWdhdGl2ZSBtYXJnaW5zLCB3ZSB3aWxsIGF0dGVtcHQgdG8gb3ZlcmxhcCB0aGUgZmxv
YXQgaWYgdGhlIG5lZ2F0aXZlIG1hcmdpbgotICAgICAgICAgICAgICAgIC8vIGlzIHNtYWxsZXIg
dGhhbiB0aGUgZmxvYXQgd2lkdGguCi0gICAgICAgICAgICAgICAgaW50IG1heExlZnQgPSBtYXJn
aW5MZWZ0ID4gMCA/IGtNYXgoZmxvYXRMZWZ0V2lkdGgsIG1hcmdpbkxlZnQpIDogZmxvYXRMZWZ0
V2lkdGggKyBtYXJnaW5MZWZ0OwotICAgICAgICAgICAgICAgIGludCBtYXhSaWdodCA9IG1hcmdp
blJpZ2h0ID4gMCA/IGtNYXgoZmxvYXRSaWdodFdpZHRoLCBtYXJnaW5SaWdodCkgOiBmbG9hdFJp
Z2h0V2lkdGggKyBtYXJnaW5SaWdodDsKLSAgICAgICAgICAgICAgICB3ID0gY2hpbGQtPm1heFdp
ZHRoKCkgKyBtYXhMZWZ0ICsgbWF4UmlnaHQ7Ci0gICAgICAgICAgICAgICAgdyA9IGtNYXgodywg
ZmxvYXRMZWZ0V2lkdGggKyBmbG9hdFJpZ2h0V2lkdGgpOwotICAgICAgICAgICAgfQotICAgICAg
ICAgICAgZWxzZQotICAgICAgICAgICAgICAgIG1fbWF4V2lkdGggPSBrTWF4KGZsb2F0TGVmdFdp
ZHRoICsgZmxvYXRSaWdodFdpZHRoLCBtX21heFdpZHRoKTsKLSAgICAgICAgICAgIGZsb2F0TGVm
dFdpZHRoID0gZmxvYXRSaWdodFdpZHRoID0gMDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAg
ICAgaWYgKGNoaWxkLT5pc0Zsb2F0aW5nKCkpIHsKLSAgICAgICAgICAgIGlmIChzdHlsZSgpLT5m
bG9hdGluZygpID09IEZMRUZUKQotICAgICAgICAgICAgICAgIGZsb2F0TGVmdFdpZHRoICs9IHc7
Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZmxvYXRSaWdodFdpZHRoICs9IHc7
Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobV9tYXhXaWR0aCA8IHcpCi0gICAgICAgICAg
ICBtX21heFdpZHRoID0gdzsKLQotICAgICAgICAvLyBBIHZlcnkgc3BlY2lmaWMgV2luSUUgcXVp
cmsuCi0gICAgICAgIC8vIEV4YW1wbGU6Ci0gICAgICAgIC8qCi0gICAgICAgICAgIDxkaXYgc3R5
bGU9InBvc2l0aW9uOmFic29sdXRlOyB3aWR0aDoxMDBweDsgdG9wOjUwcHg7Ij4KLSAgICAgICAg
ICAgICAgPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7bGVmdDowcHg7dG9wOjUwcHg7aGVp
Z2h0OjUwcHg7YmFja2dyb3VuZC1jb2xvcjpncmVlbiI+Ci0gICAgICAgICAgICAgICAgPHRhYmxl
IHN0eWxlPSJ3aWR0aDoxMDAlIj48dHI+PHRkPjwvdGFibGU+Ci0gICAgICAgICAgICAgIDwvZGl2
PgotICAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgKi8KLSAgICAgICAgLy8gSW4gdGhlIGFib3Zl
IGV4YW1wbGUsIHRoZSBpbm5lciBhYnNvbHV0ZSBwb3NpdGlvbmVkIGJsb2NrIHNob3VsZCBoYXZl
IGEgY29tcHV0ZWQgd2lkdGgKLSAgICAgICAgLy8gb2YgMTAwcHggYmVjYXVzZSBvZiB0aGUgdGFi
bGUuCi0gICAgICAgIC8vIFdlIGNhbiBhY2hpZXZlIHRoaXMgZWZmZWN0IGJ5IG1ha2luZyB0aGUg
bWF4d2lkdGggb2YgYmxvY2tzIHRoYXQgY29udGFpbiB0YWJsZXMKLSAgICAgICAgLy8gd2l0aCBw
ZXJjZW50YWdlIHdpZHRocyBiZSBpbmZpbml0ZSAoYXMgbG9uZyBhcyB0aGV5IGFyZSBub3QgaW5z
aWRlIGEgdGFibGUgY2VsbCkuCi0gICAgICAgIGlmIChzdHlsZSgpLT5odG1sSGFja3MoKSAmJiBj
aGlsZC0+c3R5bGUoKS0+d2lkdGgoKS50eXBlID09IFBlcmNlbnQgJiYKLSAgICAgICAgICAgICFp
c1RhYmxlQ2VsbCgpICYmIGNoaWxkLT5pc1RhYmxlKCkgJiYgbV9tYXhXaWR0aCA8IEJMT0NLX01B
WF9XSURUSCkgewotICAgICAgICAgICAgUmVuZGVyQmxvY2sqIGNiID0gY29udGFpbmluZ0Jsb2Nr
KCk7Ci0gICAgICAgICAgICB3aGlsZSAoIWNiLT5pc0NhbnZhcygpICYmICFjYi0+aXNUYWJsZUNl
bGwoKSkKLSAgICAgICAgICAgICAgICBjYiA9IGNiLT5jb250YWluaW5nQmxvY2soKTsKLSAgICAg
ICAgICAgIGlmICghY2ItPmlzVGFibGVDZWxsKCkpCi0gICAgICAgICAgICAgICAgbV9tYXhXaWR0
aCA9IEJMT0NLX01BWF9XSURUSDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgY2hpbGQg
PSBjaGlsZC0+bmV4dFNpYmxpbmcoKTsKLSAgICB9Ci0KLSAgICAvLyBBbHdheXMgbWFrZSBzdXJl
IHRoZXNlIHZhbHVlcyBhcmUgbm9uLW5lZ2F0aXZlLgotICAgIG1fbWluV2lkdGggPSBrTWF4KDAs
IG1fbWluV2lkdGgpOwotICAgIG1fbWF4V2lkdGggPSBrTWF4KDAsIG1fbWF4V2lkdGgpOwotCi0g
ICAgbV9tYXhXaWR0aCA9IGtNYXgoZmxvYXRMZWZ0V2lkdGggKyBmbG9hdFJpZ2h0V2lkdGgsIG1f
bWF4V2lkdGgpOwotfQotCi1zaG9ydCBSZW5kZXJCbG9jazo6bGluZUhlaWdodChib29sIGIsIGJv
b2wgaXNSb290TGluZUJveCkgY29uc3QKLXsKLSAgICAvLyBJbmxpbmUgYmxvY2tzIGFyZSByZXBs
YWNlZCBlbGVtZW50cy4gT3RoZXJ3aXNlLCBqdXN0IHBhc3Mgb2ZmIHRvCi0gICAgLy8gdGhlIGJh
c2UgY2xhc3MuICBJZiB3ZSdyZSBiZWluZyBxdWVyaWVkIGFzIHRob3VnaCB3ZSdyZSB0aGUgcm9v
dCBsaW5lCi0gICAgLy8gYm94LCB0aGVuIHRoZSBmYWN0IHRoYXQgd2UncmUgYW4gaW5saW5lLWJs
b2NrIGlzIGlycmVsZXZhbnQsIGFuZCB3ZSBiZWhhdmUKLSAgICAvLyBqdXN0IGxpa2UgYSBibG9j
ay4KLSAgICBpZiAoaXNSZXBsYWNlZCgpICYmICFpc1Jvb3RMaW5lQm94KQotICAgICAgICByZXR1
cm4gaGVpZ2h0KCkrbWFyZ2luVG9wKCkrbWFyZ2luQm90dG9tKCk7Ci0gICAgcmV0dXJuIFJlbmRl
ckZsb3c6OmxpbmVIZWlnaHQoYiwgaXNSb290TGluZUJveCk7Ci19Ci0KLXNob3J0IFJlbmRlckJs
b2NrOjpiYXNlbGluZVBvc2l0aW9uKGJvb2wgYiwgYm9vbCBpc1Jvb3RMaW5lQm94KSBjb25zdAot
ewotICAgIC8vIElubGluZSBibG9ja3MgYXJlIHJlcGxhY2VkIGVsZW1lbnRzLiBPdGhlcndpc2Us
IGp1c3QgcGFzcyBvZmYgdG8KLSAgICAvLyB0aGUgYmFzZSBjbGFzcy4gIElmIHdlJ3JlIGJlaW5n
IHF1ZXJpZWQgYXMgdGhvdWdoIHdlJ3JlIHRoZSByb290IGxpbmUKLSAgICAvLyBib3gsIHRoZW4g
dGhlIGZhY3QgdGhhdCB3ZSdyZSBhbiBpbmxpbmUtYmxvY2sgaXMgaXJyZWxldmFudCwgYW5kIHdl
IGJlaGF2ZQotICAgIC8vIGp1c3QgbGlrZSBhIGJsb2NrLgotICAgIGlmIChpc1JlcGxhY2VkKCkg
JiYgIWlzUm9vdExpbmVCb3gpIHsKLSAgICAgICAgLy8gRm9yICJsZWFmIiB0aGVtZSBvYmplY3Rz
LCBsZXQgdGhlIHRoZW1lIGRlY2lkZSB3aGF0IHRoZSBiYXNlbGluZSBwb3NpdGlvbiBpcy4KLSAg
ICAgICAgLy8gRklYTUU6IE1pZ2h0IGJlIGJldHRlciB0byBoYXZlIGEgY3VzdG9tIENTUyBwcm9w
ZXJ0eSBpbnN0ZWFkLCBzbyB0aGF0IGlmIHRoZSB0aGVtZQotICAgICAgICAvLyBpcyB0dXJuZWQg
b2ZmLCBjaGVja2JveGVzL3JhZGlvcyB3aWxsIHN0aWxsIGhhdmUgZGVjZW50IGJhc2VsaW5lcy4K
LSAgICAgICAgaWYgKHN0eWxlKCktPmhhc0FwcGVhcmFuY2UoKSAmJiAhdGhlbWUoKS0+aXNDb250
cm9sQ29udGFpbmVyKHN0eWxlKCktPmFwcGVhcmFuY2UoKSkpCi0gICAgICAgICAgICByZXR1cm4g
dGhlbWUoKS0+YmFzZWxpbmVQb3NpdGlvbih0aGlzKTsKLSAgICAgICAgICAgIAotICAgICAgICAv
LyBDU1MyLjEgc3RhdGVzIHRoYXQgdGhlIGJhc2VsaW5lIG9mIGFuIGlubGluZSBibG9jayBpcyB0
aGUgYmFzZWxpbmUgb2YgdGhlIGxhc3QgbGluZSBib3ggaW4KLSAgICAgICAgLy8gdGhlIG5vcm1h
bCBmbG93LiAgV2UgbWFrZSBhbiBleGNlcHRpb24gZm9yIG1hcnF1ZWVzLCBzaW5jZSB0aGVpciBi
YXNlbGluZXMgYXJlIG1lYW5pbmdsZXNzCi0gICAgICAgIC8vICh0aGUgY29udGVudCBpbnNpZGUg
dGhlbSBtb3ZlcykuICBUaGlzIG1hdGNoZXMgV2luSUUgYXMgd2VsbCwgd2hpY2gganVzdCBib3R0
b20tYWxpZ25zIHRoZW0uCi0gICAgICAgIC8vIFdlIGFsc28gZ2l2ZSB1cCBvbiBmaW5kaW5nIGEg
YmFzZWxpbmUgaWYgd2UgaGF2ZSBhIHZlcnRpY2FsIHNjcm9sbGJhciwgb3IgaWYgd2UgYXJlIHNj
cm9sbGVkCi0gICAgICAgIC8vIHZlcnRpY2FsbHkgKGUuZy4sIGFuIG92ZXJmbG93OmhpZGRlbiBi
bG9jayB0aGF0IGhhcyBoYWQgc2Nyb2xsVG9wIG1vdmVkKSBvciBpZiB0aGUgYmFzZWxpbmUgaXMg
b3V0c2lkZQotICAgICAgICAvLyBvZiBvdXIgY29udGVudCBib3guCi0gICAgICAgIGludCBiYXNl
bGluZVBvcyA9IChtX2xheWVyICYmIChtX2xheWVyLT5tYXJxdWVlKCkgfHwgbV9sYXllci0+dmVy
dGljYWxTY3JvbGxiYXIoKSB8fCBtX2xheWVyLT5zY3JvbGxZT2Zmc2V0KCkgIT0gMCkpID8gLTEg
OiBnZXRCYXNlbGluZU9mTGFzdExpbmVCb3goKTsKLSAgICAgICAgaWYgKGJhc2VsaW5lUG9zICE9
IC0xICYmIGJhc2VsaW5lUG9zIDw9IGJvcmRlclRvcCgpICsgcGFkZGluZ1RvcCgpICsgY29udGVu
dEhlaWdodCgpKQotICAgICAgICAgICAgcmV0dXJuIG1hcmdpblRvcCgpICsgYmFzZWxpbmVQb3M7
Ci0gICAgICAgIHJldHVybiBoZWlnaHQoKSArIG1hcmdpblRvcCgpICsgbWFyZ2luQm90dG9tKCk7
Ci0gICAgfQotICAgIHJldHVybiBSZW5kZXJGbG93OjpiYXNlbGluZVBvc2l0aW9uKGIsIGlzUm9v
dExpbmVCb3gpOwotfQotCi1pbnQgUmVuZGVyQmxvY2s6OmdldEJhc2VsaW5lT2ZGaXJzdExpbmVC
b3goKSBjb25zdAotewotICAgIGlmICghaXNCbG9ja0Zsb3coKSkKLSAgICAgICAgcmV0dXJuIFJl
bmRlckZsb3c6OmdldEJhc2VsaW5lT2ZGaXJzdExpbmVCb3goKTsKLQotICAgIGlmIChjaGlsZHJl
bklubGluZSgpKSB7Ci0gICAgICAgIGlmIChtX2ZpcnN0TGluZUJveCkKLSAgICAgICAgICAgIHJl
dHVybiBtX2ZpcnN0TGluZUJveC0+eVBvcygpICsgbV9maXJzdExpbmVCb3gtPmJhc2VsaW5lKCk7
Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgZWxzZSB7
Ci0gICAgICAgIGZvciAoUmVuZGVyT2JqZWN0KiBjdXJyID0gZmlyc3RDaGlsZCgpOyBjdXJyOyBj
dXJyID0gY3Vyci0+bmV4dFNpYmxpbmcoKSkgewotICAgICAgICAgICAgaWYgKCFjdXJyLT5pc0Zs
b2F0aW5nT3JQb3NpdGlvbmVkKCkpIHsKLSAgICAgICAgICAgICAgICBpbnQgcmVzdWx0ID0gY3Vy
ci0+Z2V0QmFzZWxpbmVPZkZpcnN0TGluZUJveCgpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1
bHQgIT0gLTEpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXJyLT55UG9zKCkgKyByZXN1
bHQ7IC8vIFRyYW5zbGF0ZSB0byBvdXIgY29vcmRpbmF0ZSBzcGFjZS4KLSAgICAgICAgICAgIH0K
LSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAtMTsKLX0KLQotaW50IFJlbmRlckJsb2Nr
OjpnZXRCYXNlbGluZU9mTGFzdExpbmVCb3goKSBjb25zdAotewotICAgIGlmICghaXNCbG9ja0Zs
b3coKSkKLSAgICAgICAgcmV0dXJuIFJlbmRlckZsb3c6OmdldEJhc2VsaW5lT2ZMYXN0TGluZUJv
eCgpOwotCi0gICAgaWYgKGNoaWxkcmVuSW5saW5lKCkpIHsKLSAgICAgICAgaWYgKG1fbGFzdExp
bmVCb3gpCi0gICAgICAgICAgICByZXR1cm4gbV9sYXN0TGluZUJveC0+eVBvcygpICsgbV9sYXN0
TGluZUJveC0+YmFzZWxpbmUoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIC0x
OwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgZm9yIChSZW5kZXJPYmplY3QqIGN1cnIgPSBs
YXN0Q2hpbGQoKTsgY3VycjsgY3VyciA9IGN1cnItPnByZXZpb3VzU2libGluZygpKSB7Ci0gICAg
ICAgICAgICBpZiAoIWN1cnItPmlzRmxvYXRpbmdPclBvc2l0aW9uZWQoKSkgewotICAgICAgICAg
ICAgICAgIGludCByZXN1bHQgPSBjdXJyLT5nZXRCYXNlbGluZU9mTGFzdExpbmVCb3goKTsKLSAg
ICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IC0xKQotICAgICAgICAgICAgICAgICAgICByZXR1
cm4gY3Vyci0+eVBvcygpICsgcmVzdWx0OyAvLyBUcmFuc2xhdGUgdG8gb3VyIGNvb3JkaW5hdGUg
c3BhY2UuCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gLTE7
Ci19Ci0KLVJlbmRlckJsb2NrKiBSZW5kZXJCbG9jazo6Zmlyc3RMaW5lQmxvY2soKSBjb25zdAot
ewotICAgIGNvbnN0IFJlbmRlck9iamVjdCogZmlyc3RMaW5lQmxvY2sgPSB0aGlzOwotICAgIGJv
b2wgaGFzUHNldWRvID0gZmFsc2U7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgaGFzUHNl
dWRvID0gZmlyc3RMaW5lQmxvY2stPnN0eWxlKCktPmhhc1BzZXVkb1N0eWxlKFJlbmRlclN0eWxl
OjpGSVJTVF9MSU5FKTsKLSAgICAgICAgaWYgKGhhc1BzZXVkbykKLSAgICAgICAgICAgIGJyZWFr
OwotICAgICAgICBSZW5kZXJPYmplY3QqIHBhcmVudEJsb2NrID0gZmlyc3RMaW5lQmxvY2stPnBh
cmVudCgpOwotICAgICAgICBpZiAoZmlyc3RMaW5lQmxvY2stPmlzUmVwbGFjZWQoKSB8fCBmaXJz
dExpbmVCbG9jay0+aXNGbG9hdGluZygpIHx8IAotICAgICAgICAgICAgIXBhcmVudEJsb2NrIHx8
IHBhcmVudEJsb2NrLT5maXJzdENoaWxkKCkgIT0gZmlyc3RMaW5lQmxvY2sgfHwgIXBhcmVudEJs
b2NrLT5pc0Jsb2NrRmxvdygpKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGZpcnN0TGlu
ZUJsb2NrID0gcGFyZW50QmxvY2s7Ci0gICAgfSAKLSAgICAKLSAgICBpZiAoIWhhc1BzZXVkbykK
LSAgICAgICAgcmV0dXJuIDA7Ci0gICAgCi0gICAgcmV0dXJuIChSZW5kZXJCbG9jayopKGZpcnN0
TGluZUJsb2NrKTsKLX0KLQotdm9pZCBSZW5kZXJCbG9jazo6dXBkYXRlRmlyc3RMZXR0ZXIoKQot
eyAgICAKLSAgICAvLyBGSVhNRTogV2UgbmVlZCB0byBkZXN0cm95IHRoZSBmaXJzdC1sZXR0ZXIg
b2JqZWN0IGlmIGl0IGlzIG5vIGxvbmdlciB0aGUgZmlyc3QgY2hpbGQuICBOZWVkIHRvIGZpbmQK
LSAgICAvLyBhbiBlZmZpY2llbnQgd2F5IHRvIGNoZWNrIGZvciB0aGF0IHNpdHVhdGlvbiB0aG91
Z2ggYmVmb3JlIGltcGxlbWVudGluZyBhbnl0aGluZy4KLSAgICBSZW5kZXJPYmplY3QqIGZpcnN0
TGV0dGVyQmxvY2sgPSB0aGlzOwotICAgIGJvb2wgaGFzUHNldWRvU3R5bGUgPSBmYWxzZTsKLSAg
ICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBoYXNQc2V1ZG9TdHlsZSA9IGZpcnN0TGV0dGVyQmxv
Y2stPnN0eWxlKCktPmhhc1BzZXVkb1N0eWxlKFJlbmRlclN0eWxlOjpGSVJTVF9MRVRURVIpOwot
ICAgICAgICBpZiAoaGFzUHNldWRvU3R5bGUpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAg
UmVuZGVyT2JqZWN0KiBwYXJlbnRCbG9jayA9IGZpcnN0TGV0dGVyQmxvY2stPnBhcmVudCgpOwot
ICAgICAgICBpZiAoZmlyc3RMZXR0ZXJCbG9jay0+aXNSZXBsYWNlZCgpIHx8ICFwYXJlbnRCbG9j
ayB8fCBwYXJlbnRCbG9jay0+Zmlyc3RDaGlsZCgpICE9IGZpcnN0TGV0dGVyQmxvY2sgfHwgCi0g
ICAgICAgICAgICAhcGFyZW50QmxvY2stPmlzQmxvY2tGbG93KCkpCi0gICAgICAgICAgICBicmVh
azsKLSAgICAgICAgZmlyc3RMZXR0ZXJCbG9jayA9IHBhcmVudEJsb2NrOwotICAgIH0gCi0KLSAg
ICBpZiAoIWhhc1BzZXVkb1N0eWxlKSAKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIC8vIERy
aWxsIGludG8gaW5saW5lcyBsb29raW5nIGZvciBvdXIgZmlyc3QgdGV4dCBjaGlsZC4KLSAgICBS
ZW5kZXJPYmplY3QqIGN1cnJDaGlsZCA9IGZpcnN0TGV0dGVyQmxvY2stPmZpcnN0Q2hpbGQoKTsK
LSAgICB3aGlsZSAoY3VyckNoaWxkICYmIGN1cnJDaGlsZC0+bmVlZHNMYXlvdXQoKSAmJiAhY3Vy
ckNoaWxkLT5pc1JlcGxhY2VkKCkgJiYgIWN1cnJDaGlsZC0+aXNUZXh0KCkpIAotICAgICAgICBj
dXJyQ2hpbGQgPSBjdXJyQ2hpbGQtPmZpcnN0Q2hpbGQoKTsKLQotICAgIC8vIEdldCBsaXN0IG1h
cmtlcnMgb3V0IG9mIHRoZSB3YXkuCi0gICAgd2hpbGUgKGN1cnJDaGlsZCAmJiBjdXJyQ2hpbGQt
PmlzTGlzdE1hcmtlcigpKQotICAgICAgICBjdXJyQ2hpbGQgPSBjdXJyQ2hpbGQtPm5leHRTaWJs
aW5nKCk7Ci0gICAgCi0gICAgaWYgKCFjdXJyQ2hpbGQpCi0gICAgICAgIHJldHVybjsKLSAgICAK
LSAgICBSZW5kZXJPYmplY3QqIGZpcnN0TGV0dGVyQ29udGFpbmVyID0gY3VyckNoaWxkLT5wYXJl
bnQoKTsKLQotICAgIC8vIElmIHRoZSBjaGlsZCBhbHJlYWR5IGhhcyBzdHlsZSwgdGhlbiBpdCBo
YXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQsIHNvIHdlIGp1c3Qgd2FudAotICAgIC8vIHRvIHVwZGF0
ZSBpdC4KLSAgICBpZiAoY3VyckNoaWxkLT5zdHlsZSgpLT5zdHlsZVR5cGUoKSA9PSBSZW5kZXJT
dHlsZTo6RklSU1RfTEVUVEVSKSB7Ci0gICAgICAgIFJlbmRlclN0eWxlKiBwc2V1ZG8gPSBmaXJz
dExldHRlckJsb2NrLT5nZXRQc2V1ZG9TdHlsZShSZW5kZXJTdHlsZTo6RklSU1RfTEVUVEVSLAot
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgZmlyc3RMZXR0ZXJDb250YWluZXItPmZpcnN0TGluZVN0eWxlKCkpOwotICAgICAgICBj
dXJyQ2hpbGQtPnNldFN0eWxlKHBzZXVkbyk7Ci0gICAgICAgIGZvciAoUmVuZGVyT2JqZWN0KiBn
ZW5DaGlsZCA9IGN1cnJDaGlsZC0+Zmlyc3RDaGlsZCgpOyBnZW5DaGlsZDsgZ2VuQ2hpbGQgPSBn
ZW5DaGlsZC0+bmV4dFNpYmxpbmcoKSkgewotICAgICAgICAgICAgaWYgKGdlbkNoaWxkLT5pc1Rl
eHQoKSkgCi0gICAgICAgICAgICAgICAgZ2VuQ2hpbGQtPnNldFN0eWxlKHBzZXVkbyk7Ci0gICAg
ICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIElmIHRoZSBjaGlsZCBkb2Vz
IG5vdCBhbHJlYWR5IGhhdmUgc3R5bGUsIHdlIGNyZWF0ZSBpdCBoZXJlLgotICAgIGlmIChjdXJy
Q2hpbGQtPmlzVGV4dCgpICYmICFjdXJyQ2hpbGQtPmlzQlIoKSAmJiAKLSAgICAgICAgY3VyckNo
aWxkLT5wYXJlbnQoKS0+c3R5bGUoKS0+c3R5bGVUeXBlKCkgIT0gUmVuZGVyU3R5bGU6OkZJUlNU
X0xFVFRFUikgewotICAgICAgICAKLSAgICAgICAgUmVuZGVyVGV4dCogdGV4dE9iaiA9IHN0YXRp
Y19jYXN0PFJlbmRlclRleHQqPihjdXJyQ2hpbGQpOwotICAgICAgICAKLSAgICAgICAgLy8gQ3Jl
YXRlIG91ciBwc2V1ZG8gc3R5bGUgbm93IHRoYXQgd2UgaGF2ZSBvdXIgZmlyc3RMZXR0ZXJDb250
YWluZXIgZGV0ZXJtaW5lZC4KLSAgICAgICAgUmVuZGVyU3R5bGUqIHBzZXVkb1N0eWxlID0gZmly
c3RMZXR0ZXJCbG9jay0+Z2V0UHNldWRvU3R5bGUoUmVuZGVyU3R5bGU6OkZJUlNUX0xFVFRFUiwK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgZmlyc3RMZXR0ZXJDb250YWluZXItPmZpcnN0TGluZVN0eWxlKCkpOwotICAg
ICAgICAKLSAgICAgICAgLy8gRm9yY2UgaW5saW5lIGRpc3BsYXkgKGV4Y2VwdCBmb3IgZmxvYXRp
bmcgZmlyc3QtbGV0dGVycykKLSAgICAgICAgcHNldWRvU3R5bGUtPnNldERpc3BsYXkoIHBzZXVk
b1N0eWxlLT5pc0Zsb2F0aW5nKCkgPyBCTE9DSyA6IElOTElORSk7Ci0gICAgICAgIHBzZXVkb1N0
eWxlLT5zZXRQb3NpdGlvbiggU1RBVElDICk7IC8vIENTUzIgc2F5cyBmaXJzdC1sZXR0ZXIgY2Fu
J3QgYmUgcG9zaXRpb25lZC4KLSAgICAgICAgCi0gICAgICAgIFJlbmRlck9iamVjdCogZmlyc3RM
ZXR0ZXIgPSBSZW5kZXJGbG93OjpjcmVhdGVBbm9ueW1vdXNGbG93KGRvY3VtZW50KCksIHBzZXVk
b1N0eWxlKTsgLy8gYW5vbnltb3VzIGJveAotICAgICAgICAvLyBGSVhNRTogVGhpcyBhZGRzIGlu
IHRoZSB3cm9uZyBwbGFjZSBpZiBsaXN0IG1hcmtlcnMgd2VyZSBza2lwcGVkIGFib3ZlLiAgU2hv
dWxkIGJlCi0gICAgICAgIC8vIGZpcnN0TGV0dGVyQ29udGFpbmVyLT5hZGRDaGlsZChmaXJzdExl
dHRlciwgY3VyckNoaWxkKTsKLSAgICAgICAgZmlyc3RMZXR0ZXJDb250YWluZXItPmFkZENoaWxk
KGZpcnN0TGV0dGVyLCBmaXJzdExldHRlckNvbnRhaW5lci0+Zmlyc3RDaGlsZCgpKTsKLSAgICAg
ICAgCi0gICAgICAgIC8vIFRoZSBvcmlnaW5hbCBzdHJpbmcgaXMgZ29pbmcgdG8gYmUgZWl0aGVy
IGEgZ2VuZXJhdGVkIGNvbnRlbnQgc3RyaW5nIG9yIGEgRE9NIG5vZGUncwotICAgICAgICAvLyBz
dHJpbmcuICBXZSB3YW50IHRoZSBvcmlnaW5hbCBzdHJpbmcgYmVmb3JlIGl0IGdvdCB0cmFuc2Zv
cm1lZCBpbiBjYXNlIGZpcnN0LWxldHRlciBoYXMKLSAgICAgICAgLy8gbm8gdGV4dC10cmFuc2Zv
cm0gb3IgYSBkaWZmZXJlbnQgdGV4dC10cmFuc2Zvcm0gYXBwbGllZCB0byBpdC4KLSAgICAgICAg
UmVmUHRyPERPTVN0cmluZ0ltcGw+IG9sZFRleHQgPSB0ZXh0T2JqLT5vcmlnaW5hbFN0cmluZygp
OwotICAgICAgICBLSFRNTEFzc2VydChvbGRUZXh0KTsKLSAgICAgICAgCi0gICAgICAgIGlmIChv
bGRUZXh0ICYmIG9sZFRleHQtPmwgPiAwKSB7Ci0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgbGVu
Z3RoID0gMDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gYWNjb3VudCBmb3IgbGVhZGlu
ZyBzcGFjZXMgYW5kIHB1bmN0dWF0aW9uCi0gICAgICAgICAgICB3aGlsZSAoIGxlbmd0aCA8IG9s
ZFRleHQtPmwgJiYgKCAob2xkVGV4dC0+cytsZW5ndGgpLT5pc1NwYWNlKCkgfHwgKG9sZFRleHQt
PnMrbGVuZ3RoKS0+aXNQdW5jdCgpICkgKQotICAgICAgICAgICAgICAgIGxlbmd0aCsrOwotICAg
ICAgICAgICAgCi0gICAgICAgICAgICAvLyBhY2NvdW50IGZvciBmaXJzdCBsZXR0ZXIKLSAgICAg
ICAgICAgIGxlbmd0aCsrOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBjb25zdHJ1Y3Qg
dGV4dCBmcmFnbWVudCBmb3IgdGhlIHRleHQgYWZ0ZXIgdGhlIGZpcnN0IGxldHRlcgotICAgICAg
ICAgICAgLy8gTk9URTogdGhpcyBtaWdodCBlbXB0eQotICAgICAgICAgICAgUmVuZGVyVGV4dEZy
YWdtZW50KiByZW1haW5pbmdUZXh0ID0gCi0gICAgICAgICAgICAgICAgbmV3IChyZW5kZXJBcmVu
YSgpKSBSZW5kZXJUZXh0RnJhZ21lbnQodGV4dE9iai0+bm9kZSgpLCBvbGRUZXh0LmdldCgpLCBs
ZW5ndGgsIG9sZFRleHQtPmwtbGVuZ3RoKTsKLSAgICAgICAgICAgIHJlbWFpbmluZ1RleHQtPnNl
dFN0eWxlKHRleHRPYmotPnN0eWxlKCkpOwotICAgICAgICAgICAgaWYgKHJlbWFpbmluZ1RleHQt
PmVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICByZW1haW5pbmdUZXh0LT5lbGVtZW50KCktPnNl
dFJlbmRlcmVyKHJlbWFpbmluZ1RleHQpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBSZW5k
ZXJPYmplY3QqIG5leHRPYmogPSB0ZXh0T2JqLT5uZXh0U2libGluZygpOwotICAgICAgICAgICAg
Zmlyc3RMZXR0ZXJDb250YWluZXItPnJlbW92ZUNoaWxkKHRleHRPYmopOwotICAgICAgICAgICAg
Zmlyc3RMZXR0ZXJDb250YWluZXItPmFkZENoaWxkKHJlbWFpbmluZ1RleHQsIG5leHRPYmopOwot
ICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBjb25zdHJ1Y3QgdGV4dCBmcmFnbWVudCBmb3Ig
dGhlIGZpcnN0IGxldHRlcgotICAgICAgICAgICAgUmVuZGVyVGV4dEZyYWdtZW50KiBsZXR0ZXIg
PSAKLSAgICAgICAgICAgICAgICBuZXcgKHJlbmRlckFyZW5hKCkpIFJlbmRlclRleHRGcmFnbWVu
dChyZW1haW5pbmdUZXh0LT5ub2RlKCksIG9sZFRleHQuZ2V0KCksIDAsIGxlbmd0aCk7Ci0gICAg
ICAgICAgICBSZW5kZXJTdHlsZSogbmV3U3R5bGUgPSBuZXcgKHJlbmRlckFyZW5hKCkpIFJlbmRl
clN0eWxlKCk7Ci0gICAgICAgICAgICBuZXdTdHlsZS0+aW5oZXJpdEZyb20ocHNldWRvU3R5bGUp
OwotICAgICAgICAgICAgbGV0dGVyLT5zZXRTdHlsZShuZXdTdHlsZSk7Ci0gICAgICAgICAgICBm
aXJzdExldHRlci0+YWRkQ2hpbGQobGV0dGVyKTsKLQotICAgICAgICAgICAgdGV4dE9iai0+ZGVz
dHJveSgpOwotICAgICAgICB9Ci0gICAgfQotfQotCi1ib29sIFJlbmRlckJsb2NrOjppblJvb3RC
bG9ja0NvbnRleHQoKSBjb25zdAotewotICAgIGlmIChpc1RhYmxlQ2VsbCgpIHx8IGlzRmxvYXRp
bmdPclBvc2l0aW9uZWQoKSB8fCBoYXNPdmVyZmxvd0NsaXAoKSkKLSAgICAgICAgcmV0dXJuIGZh
bHNlOwotICAgIAotICAgIGlmIChpc1Jvb3QoKSB8fCBpc0NhbnZhcygpKQotICAgICAgICByZXR1
cm4gdHJ1ZTsKLSAgICAKLSAgICByZXR1cm4gY29udGFpbmluZ0Jsb2NrKCktPmluUm9vdEJsb2Nr
Q29udGV4dCgpOwotfQotCi0vLyBIZWxwZXIgbWV0aG9kcyBmb3Igb2J0YWluaW5nIHRoZSBsYXN0
IGxpbmUsIGNvbXB1dGluZyBsaW5lIGNvdW50cyBhbmQgaGVpZ2h0cyBmb3IgbGluZSBjb3VudHMK
LS8vIChjcmF3bGluZyBpbnRvIGJsb2NrcykuCi1zdGF0aWMgYm9vbCBzaG91bGRDaGVja0xpbmVz
KFJlbmRlck9iamVjdCogb2JqKQotewotICAgIHJldHVybiAhb2JqLT5pc0Zsb2F0aW5nT3JQb3Np
dGlvbmVkKCkgJiYgIW9iai0+aXNDb21wYWN0KCkgJiYgIW9iai0+aXNSdW5JbigpICYmCi0gICAg
ICAgICAgICBvYmotPmlzQmxvY2tGbG93KCkgJiYgb2JqLT5zdHlsZSgpLT5oZWlnaHQoKS5pc0F1
dG8oKSAmJgotICAgICAgICAgICAgKCFvYmotPmlzRmxleGlibGVCb3goKSB8fCBvYmotPnN0eWxl
KCktPmJveE9yaWVudCgpID09IFZFUlRJQ0FMKTsKLX0KLQotc3RhdGljIFJvb3RJbmxpbmVCb3gq
IGdldExpbmVBdEluZGV4KFJlbmRlckJsb2NrKiBibG9jaywgaW50IGksIGludCYgY291bnQpCi17
Ci0gICAgaWYgKGJsb2NrLT5zdHlsZSgpLT52aXNpYmlsaXR5KCkgPT0gVklTSUJMRSkgewotICAg
ICAgICBpZiAoYmxvY2stPmNoaWxkcmVuSW5saW5lKCkpIHsKLSAgICAgICAgICAgIGZvciAoUm9v
dElubGluZUJveCogYm94ID0gYmxvY2stPmZpcnN0Um9vdEJveCgpOyBib3g7IGJveCA9IGJveC0+
bmV4dFJvb3RCb3goKSkgewotICAgICAgICAgICAgICAgIGlmIChjb3VudCsrID09IGkpCi0gICAg
ICAgICAgICAgICAgICAgIHJldHVybiBib3g7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAg
ICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKFJlbmRlck9iamVjdCogb2JqID0gYmxvY2st
PmZpcnN0Q2hpbGQoKTsgb2JqOyBvYmogPSBvYmotPm5leHRTaWJsaW5nKCkpIHsKLSAgICAgICAg
ICAgICAgICBpZiAoc2hvdWxkQ2hlY2tMaW5lcyhvYmopKSB7Ci0gICAgICAgICAgICAgICAgICAg
IFJvb3RJbmxpbmVCb3ggKmJveCA9IGdldExpbmVBdEluZGV4KHN0YXRpY19jYXN0PFJlbmRlckJs
b2NrKj4ob2JqKSwgaSwgY291bnQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYm94KQotICAg
ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJveDsKLSAgICAgICAgICAgICAgICB9Ci0gICAg
ICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBnZXRI
ZWlnaHRGb3JMaW5lQ291bnQoUmVuZGVyQmxvY2sqIGJsb2NrLCBpbnQgbCwgYm9vbCBpbmNsdWRl
Qm90dG9tLCBpbnQmIGNvdW50KQotewotICAgIGlmIChibG9jay0+c3R5bGUoKS0+dmlzaWJpbGl0
eSgpID09IFZJU0lCTEUpIHsKLSAgICAgICAgaWYgKGJsb2NrLT5jaGlsZHJlbklubGluZSgpKSB7
Ci0gICAgICAgICAgICBmb3IgKFJvb3RJbmxpbmVCb3gqIGJveCA9IGJsb2NrLT5maXJzdFJvb3RC
b3goKTsgYm94OyBib3ggPSBib3gtPm5leHRSb290Qm94KCkpIHsKLSAgICAgICAgICAgICAgICBp
ZiAoKytjb3VudCA9PSBsKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gYm94LT5ib3R0b21P
dmVyZmxvdygpICsgKGluY2x1ZGVCb3R0b20gPyAoYmxvY2stPmJvcmRlckJvdHRvbSgpICsgYmxv
Y2stPnBhZGRpbmdCb3R0b20oKSkgOiAwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAg
ICAgICBlbHNlIHsKLSAgICAgICAgICAgIFJlbmRlck9iamVjdCogbm9ybWFsRmxvd0NoaWxkV2l0
aG91dExpbmVzID0gMDsKLSAgICAgICAgICAgIGZvciAoUmVuZGVyT2JqZWN0KiBvYmogPSBibG9j
ay0+Zmlyc3RDaGlsZCgpOyBvYmo7IG9iaiA9IG9iai0+bmV4dFNpYmxpbmcoKSkgewotICAgICAg
ICAgICAgICAgIGlmIChzaG91bGRDaGVja0xpbmVzKG9iaikpIHsKLSAgICAgICAgICAgICAgICAg
ICAgaW50IHJlc3VsdCA9IGdldEhlaWdodEZvckxpbmVDb3VudChzdGF0aWNfY2FzdDxSZW5kZXJC
bG9jayo+KG9iaiksIGwsIGZhbHNlLCBjb3VudCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChy
ZXN1bHQgIT0gLTEpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgb2Jq
LT55UG9zKCkgKyAoaW5jbHVkZUJvdHRvbSA/IChibG9jay0+Ym9yZGVyQm90dG9tKCkgKyBibG9j
ay0+cGFkZGluZ0JvdHRvbSgpKSA6IDApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAg
ICAgICBlbHNlIGlmICghb2JqLT5pc0Zsb2F0aW5nT3JQb3NpdGlvbmVkKCkgJiYgIW9iai0+aXND
b21wYWN0KCkgJiYgIW9iai0+aXNSdW5JbigpKQotICAgICAgICAgICAgICAgICAgICBub3JtYWxG
bG93Q2hpbGRXaXRob3V0TGluZXMgPSBvYmo7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBp
ZiAobm9ybWFsRmxvd0NoaWxkV2l0aG91dExpbmVzICYmIGwgPT0gMCkKLSAgICAgICAgICAgICAg
ICByZXR1cm4gbm9ybWFsRmxvd0NoaWxkV2l0aG91dExpbmVzLT55UG9zKCkgKyBub3JtYWxGbG93
Q2hpbGRXaXRob3V0TGluZXMtPmhlaWdodCgpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAg
IHJldHVybiAtMTsKLX0KLQotUm9vdElubGluZUJveCogUmVuZGVyQmxvY2s6OmxpbmVBdEluZGV4
KGludCBpKQotewotICAgIGludCBjb3VudCA9IDA7Ci0gICAgcmV0dXJuIGdldExpbmVBdEluZGV4
KHRoaXMsIGksIGNvdW50KTsKLX0KLQotaW50IFJlbmRlckJsb2NrOjpsaW5lQ291bnQoKQotewot
ICAgIGludCBjb3VudCA9IDA7Ci0gICAgaWYgKHN0eWxlKCktPnZpc2liaWxpdHkoKSA9PSBWSVNJ
QkxFKSB7Ci0gICAgICAgIGlmIChjaGlsZHJlbklubGluZSgpKQotICAgICAgICAgICAgZm9yIChS
b290SW5saW5lQm94KiBib3ggPSBmaXJzdFJvb3RCb3goKTsgYm94OyBib3ggPSBib3gtPm5leHRS
b290Qm94KCkpCi0gICAgICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgZWxzZQotICAgICAg
ICAgICAgZm9yIChSZW5kZXJPYmplY3QqIG9iaiA9IGZpcnN0Q2hpbGQoKTsgb2JqOyBvYmogPSBv
YmotPm5leHRTaWJsaW5nKCkpCi0gICAgICAgICAgICAgICAgaWYgKHNob3VsZENoZWNrTGluZXMo
b2JqKSkKLSAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gc3RhdGljX2Nhc3Q8UmVuZGVyQmxv
Y2sqPihvYmopLT5saW5lQ291bnQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGNvdW50OwotfQotCi1p
bnQgUmVuZGVyQmxvY2s6OmhlaWdodEZvckxpbmVDb3VudChpbnQgbCkKLXsKLSAgICBpbnQgY291
bnQgPSAwOwotICAgIHJldHVybiBnZXRIZWlnaHRGb3JMaW5lQ291bnQodGhpcywgbCwgdHJ1ZSwg
Y291bnQpOwotfQotCi12b2lkIFJlbmRlckJsb2NrOjpjbGVhclRydW5jYXRpb24oKQotewotICAg
IGlmIChzdHlsZSgpLT52aXNpYmlsaXR5KCkgPT0gVklTSUJMRSkgewotICAgICAgICBpZiAoY2hp
bGRyZW5JbmxpbmUoKSAmJiBoYXNNYXJrdXBUcnVuY2F0aW9uKCkpIHsKLSAgICAgICAgICAgIHNl
dEhhc01hcmt1cFRydW5jYXRpb24oZmFsc2UpOwotICAgICAgICAgICAgZm9yIChSb290SW5saW5l
Qm94KiBib3ggPSBmaXJzdFJvb3RCb3goKTsgYm94OyBib3ggPSBib3gtPm5leHRSb290Qm94KCkp
Ci0gICAgICAgICAgICAgICAgYm94LT5jbGVhclRydW5jYXRpb24oKTsKLSAgICAgICAgfQotICAg
ICAgICBlbHNlCi0gICAgICAgICAgICBmb3IgKFJlbmRlck9iamVjdCogb2JqID0gZmlyc3RDaGls
ZCgpOyBvYmo7IG9iaiA9IG9iai0+bmV4dFNpYmxpbmcoKSkKLSAgICAgICAgICAgICAgICBpZiAo
c2hvdWxkQ2hlY2tMaW5lcyhvYmopKQotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxS
ZW5kZXJCbG9jayo+KG9iaiktPmNsZWFyVHJ1bmNhdGlvbigpOwotICAgIH0KLX0KLQotY29uc3Qg
Y2hhciAqUmVuZGVyQmxvY2s6OnJlbmRlck5hbWUoKSBjb25zdAotewotICAgIGlmIChpc0JvZHko
KSkKLSAgICAgICAgcmV0dXJuICJSZW5kZXJCb2R5IjsgLy8gRklYTUU6IFRlbXBvcmFyeSBoYWNr
IHVudGlsIHdlIGtub3cgdGhhdCB0aGUgcmVncmVzc2lvbiB0ZXN0cyBwYXNzLgotICAgIAotICAg
IGlmIChpc0Zsb2F0aW5nKCkpCi0gICAgICAgIHJldHVybiAiUmVuZGVyQmxvY2sgKGZsb2F0aW5n
KSI7Ci0gICAgaWYgKGlzUG9zaXRpb25lZCgpKQotICAgICAgICByZXR1cm4gIlJlbmRlckJsb2Nr
IChwb3NpdGlvbmVkKSI7Ci0gICAgaWYgKGlzQW5vbnltb3VzQmxvY2soKSkKLSAgICAgICAgcmV0
dXJuICJSZW5kZXJCbG9jayAoYW5vbnltb3VzKSI7Ci0gICAgZWxzZSBpZiAoaXNBbm9ueW1vdXMo
KSkKLSAgICAgICAgcmV0dXJuICJSZW5kZXJCbG9jayAoZ2VuZXJhdGVkKSI7Ci0gICAgaWYgKGlz
UmVsUG9zaXRpb25lZCgpKQotICAgICAgICByZXR1cm4gIlJlbmRlckJsb2NrIChyZWxhdGl2ZSBw
b3NpdGlvbmVkKSI7Ci0gICAgaWYgKGlzQ29tcGFjdCgpKQotICAgICAgICByZXR1cm4gIlJlbmRl
ckJsb2NrIChjb21wYWN0KSI7Ci0gICAgaWYgKGlzUnVuSW4oKSkKLSAgICAgICAgcmV0dXJuICJS
ZW5kZXJCbG9jayAocnVuLWluKSI7Ci0gICAgcmV0dXJuICJSZW5kZXJCbG9jayI7Ci19Ci0KLSNp
Zm5kZWYgTkRFQlVHCi12b2lkIFJlbmRlckJsb2NrOjpwcmludFRyZWUoaW50IGluZGVudCkgY29u
c3QKLXsKLSAgICBSZW5kZXJGbG93OjpwcmludFRyZWUoaW5kZW50KTsKLQotICAgIGlmIChtX2Zs
b2F0aW5nT2JqZWN0cykKLSAgICB7Ci0gICAgICAgIFFQdHJMaXN0SXRlcmF0b3I8RmxvYXRpbmdP
YmplY3Q+IGl0KCptX2Zsb2F0aW5nT2JqZWN0cyk7Ci0gICAgICAgIEZsb2F0aW5nT2JqZWN0ICpy
OwotICAgICAgICBmb3IgKCA7IChyID0gaXQuY3VycmVudCgpKTsgKytpdCApCi0gICAgICAgIHsK
LSAgICAgICAgICAgIFFTdHJpbmcgczsKLSAgICAgICAgICAgIHMuZmlsbCgnICcsIGluZGVudCk7
Ci0gICAgICAgICAgICBrZERlYnVnKCkgPDwgcyA8PCByZW5kZXJOYW1lKCkgPDwgIjogICIgPDwK
LSAgICAgICAgICAgICAgICAoci0+dHlwZSA9PSBGbG9hdGluZ09iamVjdDo6RmxvYXRMZWZ0ID8g
IkZsb2F0TGVmdCIgOiAiRmxvYXRSaWdodCIgKSAgPDwKLSAgICAgICAgICAgICAgICAiWyIgPDwg
ci0+bm9kZS0+cmVuZGVyTmFtZSgpIDw8ICI6ICIgPDwgKHZvaWQqKXItPm5vZGUgPDwgIl0gKCIg
PDwgci0+c3RhcnRZIDw8ICIgLSAiIDw8IHItPmVuZFkgPDwgIikiIDw8ICJ3aWR0aDogIiA8PCBy
LT53aWR0aCA8PAotICAgICAgICAgICAgICAgIGVuZGw7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0K
LXZvaWQgUmVuZGVyQmxvY2s6OmR1bXAoUVRleHRTdHJlYW0gKnN0cmVhbSwgUVN0cmluZyBpbmQp
IGNvbnN0Ci17Ci0gICAgaWYgKG1fY2hpbGRyZW5JbmxpbmUpIHsgKnN0cmVhbSA8PCAiIGNoaWxk
cmVuSW5saW5lIjsgfQotICAgIGlmIChtX2ZpcnN0TGluZSkgeyAqc3RyZWFtIDw8ICIgZmlyc3RM
aW5lIjsgfQotCi0gICAgaWYgKG1fZmxvYXRpbmdPYmplY3RzICYmICFtX2Zsb2F0aW5nT2JqZWN0
cy0+aXNFbXB0eSgpKQotICAgIHsKLSAgICAgICAgKnN0cmVhbSA8PCAiIHNwZWNpYWwoIjsKLSAg
ICAgICAgUVB0ckxpc3RJdGVyYXRvcjxGbG9hdGluZ09iamVjdD4gaXQoKm1fZmxvYXRpbmdPYmpl
Y3RzKTsKLSAgICAgICAgRmxvYXRpbmdPYmplY3QgKnI7Ci0gICAgICAgIGJvb2wgZmlyc3QgPSB0
cnVlOwotICAgICAgICBmb3IgKCA7IChyID0gaXQuY3VycmVudCgpKTsgKytpdCApCi0gICAgICAg
IHsKLSAgICAgICAgICAgIGlmICghZmlyc3QpCi0gICAgICAgICAgICAgICAgKnN0cmVhbSA8PCAi
LCI7Ci0gICAgICAgICAgICAqc3RyZWFtIDw8IHItPm5vZGUtPnJlbmRlck5hbWUoKTsKLSAgICAg
ICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgKnN0cmVhbSA8PCAiKSI7
Ci0gICAgfQotCi0gICAgLy8gIyMjIEVDbGVhciBtX2NsZWFyU3RhdHVzCi0KLSAgICBSZW5kZXJG
bG93OjpkdW1wKHN0cmVhbSxpbmQpOwotfQotI2VuZGlmCi0KLSN1bmRlZiBERUJVRwotI3VuZGVm
IERFQlVHX0xBWU9VVAotI3VuZGVmIEJPWF9ERUJVRwotCi19IC8vIG5hbWVzcGFjZSBraHRtbAot
CkluZGV4OiByZW5kZXJpbmcvUmVuZGVyQmxvY2suY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHJlbmRlcmlu
Zy9SZW5kZXJCbG9jay5jcHAJKHJldmlzaW9uIDEyMjUzKQorKysgcmVuZGVyaW5nL1JlbmRlckJs
b2NrLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTksMTEgKzE5LDEwIEBACiAgKiBhbG9uZyB3aXRo
IHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0
bwogICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNl
IC0gU3VpdGUgMzMwLAogICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgogICovCiAK
ICNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJyZW5kZXJfYmxvY2suaCIKKyNpbmNsdWRl
ICJSZW5kZXJCbG9jay5oIgogCiAjaW5jbHVkZSAiRG9jdW1lbnRJbXBsLmgiCiAjaW5jbHVkZSAi
RnJhbWUuaCIKSW5kZXg6IHJlbmRlcmluZy9SZW5kZXJUYWJsZUNlbGwuaAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSByZW5kZXJpbmcvUmVuZGVyVGFibGVDZWxsLmgJKHJldmlzaW9uIDEyMjUzKQorKysgcmVuZGVy
aW5nL1JlbmRlclRhYmxlQ2VsbC5oCSh3b3JraW5nIGNvcHkpCkBAIC02LDcgKzYsNyBAQAogICog
ICAgICAgICAgIChDKSAxOTk4IFdhbGRvIEJhc3RpYW4gKGJhc3RpYW5Aa2RlLm9yZykKICAqICAg
ICAgICAgICAoQykgMTk5OSBMYXJzIEtub2xsIChrbm9sbEBrZGUub3JnKQogICogICAgICAgICAg
IChDKSAxOTk5IEFudHRpIEtvaXZpc3RvIChrb2l2aXN0b0BrZGUub3JnKQotICogQ29weXJpZ2h0
IChDKSAyMDAzIEFwcGxlIENvbXB1dGVyLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIw
MDQsIDIwMDUsIDIwMDYgQXBwbGUgQ29tcHV0ZXIsIEluYy4KICAqCiAgKiBUaGlzIGxpYnJhcnkg
aXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgKiBtb2Rp
ZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwpA
QCAtMjMsMjkxICsyMywxNCBAQAogICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5j
LiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAogICogQm9zdG9uLCBNQSAwMjExMS0xMzA3
LCBVU0EuCiAgKi8KLSNpZm5kZWYgUkVOREVSX1RBQkxFX0gKLSNkZWZpbmUgUkVOREVSX1RBQkxF
X0gKKyNpZm5kZWYgUmVuZGVyVGFibGVDZWxsX0gKKyNkZWZpbmUgUmVuZGVyVGFibGVDZWxsX0gK
IAotI2luY2x1ZGUgPHFjb2xvci5oPgorI2luY2x1ZGUgIlJlbmRlckJsb2NrLmgiCisjaW5jbHVk
ZSAiUmVuZGVyVGFibGUuaCIKKyNpbmNsdWRlICJSZW5kZXJUYWJsZVNlY3Rpb24uaCIKIAotI2lu
Y2x1ZGUgInJlbmRlcl9ibG9jay5oIgotI2luY2x1ZGUgInJlbmRlcl9zdHlsZS5oIgotI2luY2x1
ZGUgImtodG1sbGF5b3V0LmgiCi0KLW5hbWVzcGFjZSBET00gewotICAgIGNsYXNzIERPTVN0cmlu
ZzsKLX07Ci0KLW5hbWVzcGFjZSBraHRtbCB7Ci0KLWNsYXNzIFJlbmRlclRhYmxlOwotY2xhc3Mg
UmVuZGVyVGFibGVTZWN0aW9uOwotY2xhc3MgUmVuZGVyVGFibGVSb3c7Ci1jbGFzcyBSZW5kZXJU
YWJsZUNlbGw7Ci1jbGFzcyBSZW5kZXJUYWJsZUNvbDsKLWNsYXNzIFRhYmxlTGF5b3V0OwotCi1j
bGFzcyBSZW5kZXJUYWJsZSA6IHB1YmxpYyBSZW5kZXJCbG9jawotewotcHVibGljOgotICAgIGVu
dW0gUnVsZXMgewotICAgICAgICBOb25lICAgID0gMHgwMCwKLSAgICAgICAgUkdyb3VwcyA9IDB4
MDEsCi0gICAgICAgIENHcm91cHMgPSAweDAyLAotICAgICAgICBHcm91cHMgID0gMHgwMywKLSAg
ICAgICAgUm93cyAgICA9IDB4MDUsCi0gICAgICAgIENvbHMgICAgPSAweDBhLAotICAgICAgICBB
bGwgICAgID0gMHgwZgotICAgIH07Ci0gICAgZW51bSBGcmFtZSB7Ci0gICAgICAgIFZvaWQgICA9
IDB4MDAsCi0gICAgICAgIEFib3ZlICA9IDB4MDEsCi0gICAgICAgIEJlbG93ICA9IDB4MDIsCi0g
ICAgICAgIExocyAgICA9IDB4MDQsCi0gICAgICAgIFJocyAgICA9IDB4MDgsCi0gICAgICAgIEhz
aWRlcyA9IDB4MDMsCi0gICAgICAgIFZzaWRlcyA9IDB4MGMsCi0gICAgICAgIEJveCAgICA9IDB4
MGYKLSAgICB9OwotCi0gICAgUmVuZGVyVGFibGUoRE9NOjpOb2RlSW1wbCogbm9kZSk7Ci0gICAg
flJlbmRlclRhYmxlKCk7Ci0KLSAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKnJlbmRlck5hbWUoKSBj
b25zdCB7IHJldHVybiAiUmVuZGVyVGFibGUiOyB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgc2V0U3R5
bGUoUmVuZGVyU3R5bGUgKnN0eWxlKTsKLQotICAgIHZpcnR1YWwgYm9vbCBpc1RhYmxlKCkgY29u
c3QgeyByZXR1cm4gdHJ1ZTsgfQotCi0gICAgaW50IGdldENvbHVtblBvcyhpbnQgY29sKSBjb25z
dAotICAgICAgICB7IHJldHVybiBjb2x1bW5Qb3NbY29sXTsgfQotCi0gICAgaW50IGhCb3JkZXJT
cGFjaW5nKCkgY29uc3QgeyByZXR1cm4gaHNwYWNpbmc7IH0KLSAgICBpbnQgdkJvcmRlclNwYWNp
bmcoKSBjb25zdCB7IHJldHVybiB2c3BhY2luZzsgfQotICAgIAotICAgIGJvb2wgY29sbGFwc2VC
b3JkZXJzKCkgY29uc3QgeyByZXR1cm4gc3R5bGUoKS0+Ym9yZGVyQ29sbGFwc2UoKTsgfQotICAg
IGludCBib3JkZXJMZWZ0KCkgY29uc3Q7Ci0gICAgaW50IGJvcmRlclJpZ2h0KCkgY29uc3Q7Ci0g
ICAgaW50IGJvcmRlclRvcCgpIGNvbnN0OwotICAgIGludCBib3JkZXJCb3R0b20oKSBjb25zdDsK
LSAgICAKLSAgICBSdWxlcyBnZXRSdWxlcygpIGNvbnN0IHsgcmV0dXJuIHJ1bGVzOyB9Ci0KLSAg
ICBjb25zdCBRQ29sb3IgJmJnQ29sb3IoKSBjb25zdCB7IHJldHVybiBzdHlsZSgpLT5iYWNrZ3Jv
dW5kQ29sb3IoKTsgfQotCi0gICAgdWludCBjZWxsUGFkZGluZygpIGNvbnN0IHsgcmV0dXJuIHBh
ZGRpbmc7IH0KLSAgICB2b2lkIHNldENlbGxQYWRkaW5nKHVpbnQgcCkgeyBwYWRkaW5nID0gcDsg
fQotCi0gICAgLy8gb3ZlcnJpZGVzCi0gICAgdmlydHVhbCBpbnQgb3ZlcmZsb3dIZWlnaHQoYm9v
bCBpbmNsdWRlSW50ZXJpb3IgPSB0cnVlKSBjb25zdCB7IHJldHVybiBoZWlnaHQoKTsgfQotICAg
IHZpcnR1YWwgaW50IG92ZXJmbG93V2lkdGgoYm9vbCBpbmNsdWRlSW50ZXJpb3IgPSB0cnVlKSBj
b25zdCB7IHJldHVybiB3aWR0aCgpOyB9Ci0gICAgdmlydHVhbCB2b2lkIGFkZENoaWxkKFJlbmRl
ck9iamVjdCAqY2hpbGQsIFJlbmRlck9iamVjdCAqYmVmb3JlQ2hpbGQgPSAwKTsKLSAgICB2aXJ0
dWFsIHZvaWQgcGFpbnQoUGFpbnRJbmZvJiBpLCBpbnQgdHgsIGludCB0eSk7Ci0gICAgdmlydHVh
bCB2b2lkIHBhaW50Qm94RGVjb3JhdGlvbnMoUGFpbnRJbmZvJiBpLCBpbnQgX3R4LCBpbnQgX3R5
KTsKLSAgICB2aXJ0dWFsIHZvaWQgbGF5b3V0KCk7Ci0gICAgdmlydHVhbCB2b2lkIGNhbGNNaW5N
YXhXaWR0aCgpOwotCi0gICAgdmlydHVhbCBSZW5kZXJCbG9jayogZmlyc3RMaW5lQmxvY2soKSBj
b25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlRmlyc3RMZXR0ZXIoKTsKLSAgICAKLSAgICB2
aXJ0dWFsIHZvaWQgc2V0Q2VsbFdpZHRocygpOwotCi0gICAgdmlydHVhbCB2b2lkIGNhbGNXaWR0
aCgpOwotCi0jaWZuZGVmIE5ERUJVRwotICAgIHZpcnR1YWwgdm9pZCBkdW1wKFFUZXh0U3RyZWFt
ICpzdHJlYW0sIFFTdHJpbmcgaW5kID0gIiIpIGNvbnN0OwotI2VuZGlmCi0gICAgc3RydWN0IENv
bHVtblN0cnVjdCB7Ci0JZW51bSB7Ci0JICAgIFdpZHRoVW5kZWZpbmVkID0gMHhmZmZmCi0JfTsK
LQlDb2x1bW5TdHJ1Y3QoKSB7Ci0JICAgIHNwYW4gPSAxOwotCSAgICB3aWR0aCA9IFdpZHRoVW5k
ZWZpbmVkOwotCX0KLQl1c2hvcnQgc3BhbjsKLQl1aW50IHdpZHRoOyAvLyB0aGUgY2FsY3VsYXRl
ZCBwb3NpdGlvbiBvZiB0aGUgY29sdW1uCi0gICAgfTsKLQotICAgIEFycmF5PGludD4gY29sdW1u
UG9zOwotICAgIEFycmF5PENvbHVtblN0cnVjdD4gY29sdW1uczsKLQotICAgIHZvaWQgc3BsaXRD
b2x1bW4oaW50IHBvcywgaW50IGZpcnN0U3Bhbik7Ci0gICAgdm9pZCBhcHBlbmRDb2x1bW4oaW50
IHNwYW4pOwotICAgIGludCBudW1FZmZDb2xzKCkgY29uc3QgeyByZXR1cm4gY29sdW1ucy5zaXpl
KCk7IH0KLSAgICBpbnQgc3Bhbk9mRWZmQ29sKGludCBlZmZDb2wpIGNvbnN0IHsgcmV0dXJuIGNv
bHVtbnNbZWZmQ29sXS5zcGFuOyB9Ci0gICAgaW50IGNvbFRvRWZmQ29sKGludCBjb2wpIGNvbnN0
IHsKLQlpbnQgYyA9IDA7Ci0JaW50IGkgPSAwOwotCXdoaWxlIChjIDwgY29sICYmIGkgPCAoaW50
KWNvbHVtbnMuc2l6ZSgpKSB7Ci0JICAgIGMgKz0gY29sdW1uc1tpXS5zcGFuOwotCSAgICBpKys7
Ci0JfQotCXJldHVybiBpOwotICAgIH0KLSAgICBpbnQgZWZmQ29sVG9Db2woaW50IGVmZkNvbCkg
Y29uc3QgewotCWludCBjID0gMDsKLQlmb3IgKGludCBpID0gMDsgaSA8IGVmZkNvbDsgaSsrKQot
CSAgICBjICs9IGNvbHVtbnNbaV0uc3BhbjsKLQlyZXR1cm4gYzsKLSAgICB9Ci0KLSAgICBpbnQg
Ym9yZGVyc1BhZGRpbmdBbmRTcGFjaW5nKCkgY29uc3QgewotCXJldHVybiBib3JkZXJMZWZ0KCkg
KyBib3JkZXJSaWdodCgpICsgCi0gICAgICAgICAgICAgICAoY29sbGFwc2VCb3JkZXJzKCkgPyAw
IDogKHBhZGRpbmdMZWZ0KCkgKyBwYWRkaW5nUmlnaHQoKSArIChudW1FZmZDb2xzKCkgKyAxKSAq
IGhCb3JkZXJTcGFjaW5nKCkpKTsKLSAgICB9Ci0KLSAgICBSZW5kZXJUYWJsZUNvbCAqY29sRWxl
bWVudChpbnQgY29sKTsKLQotICAgIHZvaWQgc2V0TmVlZFNlY3Rpb25SZWNhbGMoKSB7IG5lZWRT
ZWN0aW9uUmVjYWxjID0gdHJ1ZTsgfQotCi0gICAgdmlydHVhbCBSZW5kZXJPYmplY3QqIHJlbW92
ZUNoaWxkTm9kZShSZW5kZXJPYmplY3QqIGNoaWxkKTsKLQotICAgIFJlbmRlclRhYmxlQ2VsbCog
Y2VsbEFib3ZlKGNvbnN0IFJlbmRlclRhYmxlQ2VsbCogY2VsbCkgY29uc3Q7Ci0gICAgUmVuZGVy
VGFibGVDZWxsKiBjZWxsQmVsb3coY29uc3QgUmVuZGVyVGFibGVDZWxsKiBjZWxsKSBjb25zdDsK
LSAgICBSZW5kZXJUYWJsZUNlbGwqIGNlbGxMZWZ0KGNvbnN0IFJlbmRlclRhYmxlQ2VsbCogY2Vs
bCkgY29uc3Q7Ci0gICAgUmVuZGVyVGFibGVDZWxsKiBjZWxsUmlnaHQoY29uc3QgUmVuZGVyVGFi
bGVDZWxsKiBjZWxsKSBjb25zdDsKLSAKLSAgICBDb2xsYXBzZWRCb3JkZXJWYWx1ZSogY3VycmVu
dEJvcmRlclN0eWxlKCkgeyByZXR1cm4gbV9jdXJyZW50Qm9yZGVyOyB9Ci0gICAgCi0gICAgYm9v
bCBoYXNTZWN0aW9ucygpIGNvbnN0IHsgcmV0dXJuIGhlYWQgfHwgZm9vdCB8fCBmaXJzdEJvZHk7
IH0KLQotcHJvdGVjdGVkOgotCi0gICAgdm9pZCByZWNhbGNTZWN0aW9ucygpOwotCi0gICAgZnJp
ZW5kIGNsYXNzIEF1dG9UYWJsZUxheW91dDsKLSAgICBmcmllbmQgY2xhc3MgRml4ZWRUYWJsZUxh
eW91dDsKLQotICAgIFJlbmRlckJsb2NrICp0Q2FwdGlvbjsKLSAgICBSZW5kZXJUYWJsZVNlY3Rp
b24gKmhlYWQ7Ci0gICAgUmVuZGVyVGFibGVTZWN0aW9uICpmb290OwotICAgIFJlbmRlclRhYmxl
U2VjdGlvbiAqZmlyc3RCb2R5OwotCi0gICAgVGFibGVMYXlvdXQgKnRhYmxlTGF5b3V0OwotCi0g
ICAgQ29sbGFwc2VkQm9yZGVyVmFsdWUqIG1fY3VycmVudEJvcmRlcjsKLSAgICAKLSAgICBGcmFt
ZSBmcmFtZSAgICAgICAgICAgICAgICAgOiA0OwotICAgIFJ1bGVzIHJ1bGVzICAgICAgICAgICAg
ICAgICA6IDQ7Ci0KLSAgICBib29sIGhhc19jb2xfZWxlbXMJCTogMTsKLSAgICB1aW50IHBhZGRp
bmcJCTogMjI7Ci0gICAgdWludCBuZWVkU2VjdGlvblJlY2FsYwk6IDE7Ci0gICAgCi0gICAgc2hv
cnQgaHNwYWNpbmc7Ci0gICAgc2hvcnQgdnNwYWNpbmc7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tCi0KLWNsYXNzIFJlbmRlclRhYmxlU2VjdGlvbiA6IHB1YmxpYyBSZW5kZXJDb250YWluZXIK
LXsKLXB1YmxpYzoKLSAgICBSZW5kZXJUYWJsZVNlY3Rpb24oRE9NOjpOb2RlSW1wbCogbm9kZSk7
Ci0gICAgflJlbmRlclRhYmxlU2VjdGlvbigpOwotICAgIHZpcnR1YWwgdm9pZCBkZXN0cm95KCk7
Ci0KLSAgICB2aXJ0dWFsIHZvaWQgc2V0U3R5bGUoUmVuZGVyU3R5bGUgKnN0eWxlKTsKLQotICAg
IHZpcnR1YWwgY29uc3QgY2hhciAqcmVuZGVyTmFtZSgpIGNvbnN0IHsgcmV0dXJuICJSZW5kZXJU
YWJsZVNlY3Rpb24iOyB9Ci0KLSAgICAvLyBvdmVycmlkZXMKLSAgICB2aXJ0dWFsIHZvaWQgYWRk
Q2hpbGQoUmVuZGVyT2JqZWN0ICpjaGlsZCwgUmVuZGVyT2JqZWN0ICpiZWZvcmVDaGlsZCA9IDAp
OwotICAgIHZpcnR1YWwgYm9vbCBpc1RhYmxlU2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuIHRydWU7
IH0KLQotICAgIHZpcnR1YWwgc2hvcnQgbGluZUhlaWdodChib29sKSBjb25zdCB7IHJldHVybiAw
OyB9Ci0gICAgdmlydHVhbCB2b2lkIHBvc2l0aW9uKGludCwgaW50LCBpbnQsIGludCwgaW50LCBi
b29sLCBib29sLCBpbnQpIHt9Ci0KLSNpZm5kZWYgTkRFQlVHCi0gICAgdmlydHVhbCB2b2lkIGR1
bXAoUVRleHRTdHJlYW0gKnN0cmVhbSwgUVN0cmluZyBpbmQgPSAiIikgY29uc3Q7Ci0jZW5kaWYK
LQotICAgIHZvaWQgYWRkQ2VsbChSZW5kZXJUYWJsZUNlbGwgKmNlbGwpOwotCi0gICAgdm9pZCBz
ZXRDZWxsV2lkdGhzKCk7Ci0gICAgdm9pZCBjYWxjUm93SGVpZ2h0KCk7Ci0gICAgaW50IGxheW91
dFJvd3MoaW50IGhlaWdodCk7Ci0KLSAgICBSZW5kZXJUYWJsZSAqdGFibGUoKSBjb25zdCB7IHJl
dHVybiBzdGF0aWNfY2FzdDxSZW5kZXJUYWJsZSAqPihwYXJlbnQoKSk7IH0KLQotICAgIHN0cnVj
dCBDZWxsU3RydWN0IHsKLSAgICAgICAgUmVuZGVyVGFibGVDZWxsICpjZWxsOwotICAgICAgICBi
b29sIGluQ29sU3BhbjsgLy8gdHJ1ZSBmb3IgY29sdW1ucyBhZnRlciB0aGUgZmlyc3QgaW4gYSBj
b2xzcGFuCi0gICAgfTsKLSAgICB0eXBlZGVmIEFycmF5PENlbGxTdHJ1Y3Q+IFJvdzsKLSAgICBz
dHJ1Y3QgUm93U3RydWN0IHsKLQlSb3cgKnJvdzsKLQlpbnQgYmFzZUxpbmU7Ci0JTGVuZ3RoIGhl
aWdodDsKLSAgICB9OwotCi0gICAgQ2VsbFN0cnVjdCYgY2VsbEF0KGludCByb3csICBpbnQgY29s
KSB7Ci0JcmV0dXJuICgqZ3JpZFtyb3ddLnJvdylbY29sXTsKLSAgICB9Ci0gICAgY29uc3QgQ2Vs
bFN0cnVjdCYgY2VsbEF0KGludCByb3csIGludCBjb2wpIGNvbnN0IHsKLQlyZXR1cm4gKCpncmlk
W3Jvd10ucm93KVtjb2xdOwotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCBwYWludChQYWludElu
Zm8mIGksIGludCB0eCwgaW50IHR5KTsKLQotICAgIGludCBudW1Sb3dzKCkgY29uc3QgeyByZXR1
cm4gZ3JpZFJvd3M7IH0KLSAgICBpbnQgZ2V0QmFzZWxpbmUoaW50IHJvdykge3JldHVybiBncmlk
W3Jvd10uYmFzZUxpbmU7fQotCi0gICAgdm9pZCBzZXROZWVkQ2VsbFJlY2FsYygpIHsKLSAgICAg
ICAgbmVlZENlbGxSZWNhbGMgPSB0cnVlOwotICAgICAgICB0YWJsZSgpLT5zZXROZWVkU2VjdGlv
blJlY2FsYygpOwotICAgIH0KLQotICAgIHZpcnR1YWwgUmVuZGVyT2JqZWN0KiByZW1vdmVDaGls
ZE5vZGUoUmVuZGVyT2JqZWN0KiBjaGlsZCk7Ci0KLSAgICAvLyB0aGlzIGdldHMgYSBjZWxsIGdy
aWQgZGF0YSBzdHJ1Y3R1cmUuIGNoYW5naW5nIHRoZSBudW1iZXIgb2YKLSAgICAvLyBjb2x1bW5z
IGlzIGRvbmUgYnkgdGhlIHRhYmxlCi0gICAgQXJyYXk8Um93U3RydWN0PiBncmlkOwotICAgIGlu
dCBncmlkUm93czsKLSAgICBBcnJheTxpbnQ+IHJvd1BvczsKLQotICAgIGludCBjQ29sOwotICAg
IGludCBjUm93OwotICAgIGJvb2wgbmVlZENlbGxSZWNhbGM7Ci0KLSAgICB2b2lkIHJlY2FsY0Nl
bGxzKCk7Ci1wcm90ZWN0ZWQ6Ci0gICAgYm9vbCBlbnN1cmVSb3dzKGludCBudW1Sb3dzKTsKLSAg
ICB2b2lkIGNsZWFyR3JpZCgpOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBS
ZW5kZXJUYWJsZVJvdyA6IHB1YmxpYyBSZW5kZXJDb250YWluZXIKLXsKLXB1YmxpYzoKLSAgICBS
ZW5kZXJUYWJsZVJvdyhET006Ok5vZGVJbXBsKiBub2RlKTsKLQotICAgIHZpcnR1YWwgdm9pZCBk
ZXN0cm95KCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgc2V0U3R5bGUoUmVuZGVyU3R5bGUqKTsKLSAg
ICB2aXJ0dWFsIGNvbnN0IGNoYXIgKnJlbmRlck5hbWUoKSBjb25zdCB7IHJldHVybiAiUmVuZGVy
VGFibGVSb3ciOyB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNUYWJsZVJvdygpIGNvbnN0IHsgcmV0
dXJuIHRydWU7IH0KLQotICAgIC8vIG92ZXJyaWRlcwotICAgIHZpcnR1YWwgdm9pZCBhZGRDaGls
ZChSZW5kZXJPYmplY3QgKmNoaWxkLCBSZW5kZXJPYmplY3QgKmJlZm9yZUNoaWxkID0gMCk7Ci0g
ICAgdmlydHVhbCBSZW5kZXJPYmplY3QqIHJlbW92ZUNoaWxkTm9kZShSZW5kZXJPYmplY3QqIGNo
aWxkKTsKLQotICAgIHZpcnR1YWwgc2hvcnQgbGluZUhlaWdodChib29sKSBjb25zdCB7IHJldHVy
biAwOyB9Ci0gICAgdmlydHVhbCB2b2lkIHBvc2l0aW9uKGludCwgaW50LCBpbnQsIGludCwgaW50
LCBib29sLCBib29sLCBpbnQpIHt9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgbGF5b3V0KCk7Ci0gICAg
dmlydHVhbCBJbnRSZWN0IGdldEFic29sdXRlUmVwYWludFJlY3QoKTsKLSAgICAKLSAgICBSZW5k
ZXJUYWJsZSAqdGFibGUoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxSZW5kZXJUYWJsZSAq
PihwYXJlbnQoKS0+cGFyZW50KCkpOyB9Ci0gICAgUmVuZGVyVGFibGVTZWN0aW9uICpzZWN0aW9u
KCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8UmVuZGVyVGFibGVTZWN0aW9uICo+KHBhcmVu
dCgpKTsgfQotCi0jaWZuZGVmIE5ERUJVRwotICAgIHZpcnR1YWwgdm9pZCBkdW1wKFFUZXh0U3Ry
ZWFtICpzdHJlYW0sIFFTdHJpbmcgaW5kID0gIiIpIGNvbnN0OwotI2VuZGlmCi19OwotCi0vLyAt
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tCituYW1lc3BhY2UgV2ViQ29yZSB7CiAKIGNsYXNzIFJlbmRlclRhYmxl
Q2VsbCA6IHB1YmxpYyBSZW5kZXJCbG9jawogewpAQCAtNDAyLDM3ICsxMjUsNSBAQCBwcm90ZWN0
ZWQ6CiAgICAgaW50IG1fcGVyY2VudGFnZUhlaWdodDsKIH07CiAKLQotLy8gLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLQotCi1jbGFzcyBSZW5kZXJUYWJsZUNvbCA6IHB1YmxpYyBSZW5kZXJDb250YWluZXIKLXsK
LXB1YmxpYzoKLSAgICBSZW5kZXJUYWJsZUNvbChET006Ok5vZGVJbXBsKiBub2RlKTsKLQotICAg
IHZpcnR1YWwgY29uc3QgY2hhciAqcmVuZGVyTmFtZSgpIGNvbnN0IHsgcmV0dXJuICJSZW5kZXJU
YWJsZUNvbCI7IH0KLQotICAgIGludCBzcGFuKCkgY29uc3QgeyByZXR1cm4gX3NwYW47IH0KLSAg
ICB2b2lkIHNldFNwYW4oaW50IHMpIHsgX3NwYW4gPSBzOyB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQg
YWRkQ2hpbGQoUmVuZGVyT2JqZWN0ICpjaGlsZCwgUmVuZGVyT2JqZWN0ICpiZWZvcmVDaGlsZCA9
IDApOwotCi0gICAgdmlydHVhbCBib29sIGlzVGFibGVDb2woKSBjb25zdCB7IHJldHVybiB0cnVl
OyB9Ci0KLSAgICB2aXJ0dWFsIHNob3J0IGxpbmVIZWlnaHQoYm9vbCkgY29uc3QgeyByZXR1cm4g
MDsgfQotCi0gICAgdmlydHVhbCB2b2lkIHVwZGF0ZUZyb21FbGVtZW50KCk7Ci0KLSAgICB2aXJ0
dWFsIGJvb2wgY2FuSGF2ZUNoaWxkcmVuKCkgY29uc3Q7Ci0gICAgCi0jaWZuZGVmIE5ERUJVRwot
ICAgIHZpcnR1YWwgdm9pZCBkdW1wKFFUZXh0U3RyZWFtICpzdHJlYW0sIFFTdHJpbmcgaW5kID0g
IiIpIGNvbnN0OwotI2VuZGlmCi0KLXByb3RlY3RlZDoKLSAgICBpbnQgX3NwYW47Ci19OwotCi19
OworfQogI2VuZGlmCi0KSW5kZXg6IFdlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvago9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oJKHJldmlzaW9u
IDEyMjUzKQorKysgV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCSh3b3JraW5nIGNv
cHkpCkBAIC0xMzI4LDYgKzEzMjgsMjYgQEAKIAkJQThERjNGREIwOTdGQTBGQzAwNTI5ODFCIC8q
IEhUTUxCYXNlRm9udEVsZW1lbnRJbXBsLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1
aWxkRmlsZTsgZmlsZVJlZiA9IEE4REYzRkNCMDk3RkEwRkIwMDUyOTgxQiAvKiBIVE1MQmFzZUZv
bnRFbGVtZW50SW1wbC5jcHAgKi87IH07CiAJCUE4REYzRkRDMDk3RkEwRkMwMDUyOTgxQiAvKiBI
VE1MTmFtZUNvbGxlY3Rpb25JbXBsLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZp
bGU7IGZpbGVSZWYgPSBBOERGM0ZDQzA5N0ZBMEZCMDA1Mjk4MUIgLyogSFRNTE5hbWVDb2xsZWN0
aW9uSW1wbC5oICovOyB9OwogCQlBOERGM0ZERDA5N0ZBMEZDMDA1Mjk4MUIgLyogSFRNTE5hbWVD
b2xsZWN0aW9uSW1wbC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZp
bGVSZWYgPSBBOERGM0ZDRDA5N0ZBMEZCMDA1Mjk4MUIgLyogSFRNTE5hbWVDb2xsZWN0aW9uSW1w
bC5jcHAgKi87IH07CisJCUE4REY0QUU4MDk4MEM0MkMwMDUyOTgxQiAvKiBSZW5kZXJUYWJsZUNv
bC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBOERG
NEFERTA5ODBDNDJDMDA1Mjk4MUIgLyogUmVuZGVyVGFibGVDb2wuY3BwICovOyB9OworCQlBOERG
NEFFOTA5ODBDNDJDMDA1Mjk4MUIgLyogUmVuZGVyVGFibGVDZWxsLmggaW4gSGVhZGVycyAqLyA9
IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBOERGNEFERjA5ODBDNDJDMDA1Mjk4MUIg
LyogUmVuZGVyVGFibGVDZWxsLmggKi87IH07CisJCUE4REY0QUVBMDk4MEM0MkMwMDUyOTgxQiAv
KiBSZW5kZXJUYWJsZUNlbGwuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxl
OyBmaWxlUmVmID0gQThERjRBRTAwOTgwQzQyQzAwNTI5ODFCIC8qIFJlbmRlclRhYmxlQ2VsbC5j
cHAgKi87IH07CisJCUE4REY0QUVCMDk4MEM0MkMwMDUyOTgxQiAvKiBSZW5kZXJUYWJsZS5oIGlu
IEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQThERjRBRTEwOTgw
QzQyQzAwNTI5ODFCIC8qIFJlbmRlclRhYmxlLmggKi87IH07CisJCUE4REY0QUVDMDk4MEM0MkMw
MDUyOTgxQiAvKiBSZW5kZXJUYWJsZS5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWls
ZEZpbGU7IGZpbGVSZWYgPSBBOERGNEFFMjA5ODBDNDJDMDA1Mjk4MUIgLyogUmVuZGVyVGFibGUu
Y3BwICovOyB9OworCQlBOERGNEFFRDA5ODBDNDJDMDA1Mjk4MUIgLyogUmVuZGVyVGFibGVTZWN0
aW9uLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEE4
REY0QUUzMDk4MEM0MkMwMDUyOTgxQiAvKiBSZW5kZXJUYWJsZVNlY3Rpb24uY3BwICovOyB9Owor
CQlBOERGNEFFRTA5ODBDNDJDMDA1Mjk4MUIgLyogUmVuZGVyVGFibGVSb3cuaCBpbiBIZWFkZXJz
ICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEE4REY0QUU0MDk4MEM0MkMwMDUy
OTgxQiAvKiBSZW5kZXJUYWJsZVJvdy5oICovOyB9OworCQlBOERGNEFFRjA5ODBDNDJDMDA1Mjk4
MUIgLyogUmVuZGVyVGFibGVTZWN0aW9uLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWls
ZEZpbGU7IGZpbGVSZWYgPSBBOERGNEFFNTA5ODBDNDJDMDA1Mjk4MUIgLyogUmVuZGVyVGFibGVT
ZWN0aW9uLmggKi87IH07CisJCUE4REY0QUYwMDk4MEM0MkMwMDUyOTgxQiAvKiBSZW5kZXJUYWJs
ZVJvdy5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBB
OERGNEFFNjA5ODBDNDJDMDA1Mjk4MUIgLyogUmVuZGVyVGFibGVSb3cuY3BwICovOyB9OworCQlB
OERGNEFGMTA5ODBDNDJDMDA1Mjk4MUIgLyogUmVuZGVyVGFibGVDb2wuaCBpbiBIZWFkZXJzICov
ID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEE4REY0QUU3MDk4MEM0MkMwMDUyOTgx
QiAvKiBSZW5kZXJUYWJsZUNvbC5oICovOyB9OworCQlBOERGNEFGMjA5ODBDNDJDMDA1Mjk4MUIg
LyogUmVuZGVyVGFibGVDb2wuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxl
OyBmaWxlUmVmID0gQThERjRBREUwOTgwQzQyQzAwNTI5ODFCIC8qIFJlbmRlclRhYmxlQ29sLmNw
cCAqLzsgfTsKKwkJQThERjRBRjMwOTgwQzQyQzAwNTI5ODFCIC8qIFJlbmRlclRhYmxlQ2VsbC5o
IGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQThERjRBREYw
OTgwQzQyQzAwNTI5ODFCIC8qIFJlbmRlclRhYmxlQ2VsbC5oICovOyB9OworCQlBOERGNEFGNDA5
ODBDNDJDMDA1Mjk4MUIgLyogUmVuZGVyVGFibGVDZWxsLmNwcCBpbiBTb3VyY2VzICovID0ge2lz
YSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEE4REY0QUUwMDk4MEM0MkMwMDUyOTgxQiAvKiBS
ZW5kZXJUYWJsZUNlbGwuY3BwICovOyB9OworCQlBOERGNEFGNTA5ODBDNDJDMDA1Mjk4MUIgLyog
UmVuZGVyVGFibGUuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJl
ZiA9IEE4REY0QUUxMDk4MEM0MkMwMDUyOTgxQiAvKiBSZW5kZXJUYWJsZS5oICovOyB9OworCQlB
OERGNEFGNjA5ODBDNDJDMDA1Mjk4MUIgLyogUmVuZGVyVGFibGUuY3BwIGluIFNvdXJjZXMgKi8g
PSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQThERjRBRTIwOTgwQzQyQzAwNTI5ODFC
IC8qIFJlbmRlclRhYmxlLmNwcCAqLzsgfTsKKwkJQThERjRBRjcwOTgwQzQyQzAwNTI5ODFCIC8q
IFJlbmRlclRhYmxlU2VjdGlvbi5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZp
bGU7IGZpbGVSZWYgPSBBOERGNEFFMzA5ODBDNDJDMDA1Mjk4MUIgLyogUmVuZGVyVGFibGVTZWN0
aW9uLmNwcCAqLzsgfTsKKwkJQThERjRBRjgwOTgwQzQyQzAwNTI5ODFCIC8qIFJlbmRlclRhYmxl
Um93LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBOERG
NEFFNDA5ODBDNDJDMDA1Mjk4MUIgLyogUmVuZGVyVGFibGVSb3cuaCAqLzsgfTsKKwkJQThERjRB
RjkwOTgwQzQyQzAwNTI5ODFCIC8qIFJlbmRlclRhYmxlU2VjdGlvbi5oIGluIEhlYWRlcnMgKi8g
PSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQThERjRBRTUwOTgwQzQyQzAwNTI5ODFC
IC8qIFJlbmRlclRhYmxlU2VjdGlvbi5oICovOyB9OworCQlBOERGNEFGQTA5ODBDNDJDMDA1Mjk4
MUIgLyogUmVuZGVyVGFibGVSb3cuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRG
aWxlOyBmaWxlUmVmID0gQThERjRBRTYwOTgwQzQyQzAwNTI5ODFCIC8qIFJlbmRlclRhYmxlUm93
LmNwcCAqLzsgfTsKKwkJQThERjRBRkIwOTgwQzQyQzAwNTI5ODFCIC8qIFJlbmRlclRhYmxlQ29s
LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBOERGNEFF
NzA5ODBDNDJDMDA1Mjk4MUIgLyogUmVuZGVyVGFibGVDb2wuaCAqLzsgfTsKIAkJQThGRDhCODYw
ODdDQjQ0QzAwREMzNzA3IC8qIEtXUVdNYXRyaXguY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0g
UEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQTg1RDdBOEMwODc5RUM2NDAwNkE5MTcyIC8qIEtXUVdN
YXRyaXguY3BwICovOyB9OwogCQlBOEZEOEI4NzA4N0NCNDU3MDBEQzM3MDcgLyogS1dRV01hdHJp
eC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQTg1RDdB
OEQwODc5RUM2NDAwNkE5MTcyIC8qIEtXUVdNYXRyaXguaCAqLzsgfTsKIAkJQThGRUZCMEEwOTc5
RjQ3MjAwNTgzOUZEIC8qIFJlbmRlckZvcmVpZ25PYmplY3QuaCBpbiBIZWFkZXJzICovID0ge2lz
YSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEE4RkVGQjA4MDk3OUY0NzIwMDU4MzlGRCAvKiBS
ZW5kZXJGb3JlaWduT2JqZWN0LmggKi87IH07CkBAIC0xNTI3LDggKzE1NDcsOCBAQAogCQlCQ0VB
NDg1QzA5N0Q5MzAyMDA5NEM5RTQgLyogcmVuZGVyX2FwcGxldC5oIGluIEhlYWRlcnMgKi8gPSB7
aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQkNFQTQ4MUQwOTdEOTMwMjAwOTRDOUU0IC8q
IHJlbmRlcl9hcHBsZXQuaCAqLzsgfTsKIAkJQkNFQTQ4NUQwOTdEOTMwMjAwOTRDOUU0IC8qIHJl
bmRlcl9hcmVuYS5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVS
ZWYgPSBCQ0VBNDgxRTA5N0Q5MzAyMDA5NEM5RTQgLyogcmVuZGVyX2FyZW5hLmNwcCAqLzsgfTsK
IAkJQkNFQTQ4NUUwOTdEOTMwMjAwOTRDOUU0IC8qIHJlbmRlcl9hcmVuYS5oIGluIEhlYWRlcnMg
Ki8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQkNFQTQ4MUYwOTdEOTMwMjAwOTRD
OUU0IC8qIHJlbmRlcl9hcmVuYS5oICovOyB9OwotCQlCQ0VBNDg1RjA5N0Q5MzAyMDA5NEM5RTQg
LyogcmVuZGVyX2Jsb2NrLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsg
ZmlsZVJlZiA9IEJDRUE0ODIwMDk3RDkzMDIwMDk0QzlFNCAvKiByZW5kZXJfYmxvY2suY3BwICov
OyB9OwotCQlCQ0VBNDg2MDA5N0Q5MzAyMDA5NEM5RTQgLyogcmVuZGVyX2Jsb2NrLmggaW4gSGVh
ZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBCQ0VBNDgyMTA5N0Q5MzAy
MDA5NEM5RTQgLyogcmVuZGVyX2Jsb2NrLmggKi87IH07CisJCUJDRUE0ODVGMDk3RDkzMDIwMDk0
QzlFNCAvKiBSZW5kZXJCbG9jay5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZp
bGU7IGZpbGVSZWYgPSBCQ0VBNDgyMDA5N0Q5MzAyMDA5NEM5RTQgLyogUmVuZGVyQmxvY2suY3Bw
ICovOyB9OworCQlCQ0VBNDg2MDA5N0Q5MzAyMDA5NEM5RTQgLyogUmVuZGVyQmxvY2suaCBpbiBI
ZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEJDRUE0ODIxMDk3RDkz
MDIwMDk0QzlFNCAvKiBSZW5kZXJCbG9jay5oICovOyB9OwogCQlCQ0VBNDg2MTA5N0Q5MzAyMDA5
NEM5RTQgLyogcmVuZGVyX2JveC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZp
bGU7IGZpbGVSZWYgPSBCQ0VBNDgyMjA5N0Q5MzAyMDA5NEM5RTQgLyogcmVuZGVyX2JveC5jcHAg
Ki87IH07CiAJCUJDRUE0ODYyMDk3RDkzMDIwMDk0QzlFNCAvKiByZW5kZXJfYm94LmggaW4gSGVh
ZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBCQ0VBNDgyMzA5N0Q5MzAy
MDA5NEM5RTQgLyogcmVuZGVyX2JveC5oICovOyB9OwogCQlCQ0VBNDg2MzA5N0Q5MzAyMDA5NEM5
RTQgLyogcmVuZGVyX2JyLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsg
ZmlsZVJlZiA9IEJDRUE0ODI0MDk3RDkzMDIwMDk0QzlFNCAvKiByZW5kZXJfYnIuY3BwICovOyB9
OwpAQCAtMTUzOSw4ICsxNTU5LDggQEAKIAkJQkNFQTQ4NjgwOTdEOTMwMjAwOTRDOUU0IC8qIHJl
bmRlcl9jYW52YXMuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJl
ZiA9IEJDRUE0ODI5MDk3RDkzMDIwMDk0QzlFNCAvKiByZW5kZXJfY2FudmFzLmggKi87IH07CiAJ
CUJDRUE0ODY5MDk3RDkzMDIwMDk0QzlFNCAvKiByZW5kZXJfY2FudmFzaW1hZ2UuY3BwIGluIFNv
dXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQkNFQTQ4MkEwOTdEOTMw
MjAwOTRDOUU0IC8qIHJlbmRlcl9jYW52YXNpbWFnZS5jcHAgKi87IH07CiAJCUJDRUE0ODZBMDk3
RDkzMDIwMDk0QzlFNCAvKiByZW5kZXJfY2FudmFzaW1hZ2UuaCBpbiBIZWFkZXJzICovID0ge2lz
YSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEJDRUE0ODJCMDk3RDkzMDIwMDk0QzlFNCAvKiBy
ZW5kZXJfY2FudmFzaW1hZ2UuaCAqLzsgfTsKLQkJQkNFQTQ4NkIwOTdEOTMwMjAwOTRDOUU0IC8q
IHJlbmRlcl9jb250YWluZXIuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxl
OyBmaWxlUmVmID0gQkNFQTQ4MkMwOTdEOTMwMjAwOTRDOUU0IC8qIHJlbmRlcl9jb250YWluZXIu
Y3BwICovOyB9OwotCQlCQ0VBNDg2QzA5N0Q5MzAyMDA5NEM5RTQgLyogcmVuZGVyX2NvbnRhaW5l
ci5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQkNFQTQ4
MkQwOTdEOTMwMjAwOTRDOUU0IC8qIHJlbmRlcl9jb250YWluZXIuaCAqLzsgfTsKKwkJQkNFQTQ4
NkIwOTdEOTMwMjAwOTRDOUU0IC8qIFJlbmRlckNvbnRhaW5lci5jcHAgaW4gU291cmNlcyAqLyA9
IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBCQ0VBNDgyQzA5N0Q5MzAyMDA5NEM5RTQg
LyogUmVuZGVyQ29udGFpbmVyLmNwcCAqLzsgfTsKKwkJQkNFQTQ4NkMwOTdEOTMwMjAwOTRDOUU0
IC8qIFJlbmRlckNvbnRhaW5lci5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxl
OyBmaWxlUmVmID0gQkNFQTQ4MkQwOTdEOTMwMjAwOTRDOUU0IC8qIFJlbmRlckNvbnRhaW5lci5o
ICovOyB9OwogCQlCQ0VBNDg2RDA5N0Q5MzAyMDA5NEM5RTQgLyogcmVuZGVyX2ZsZXhib3guY3Bw
IGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQkNFQTQ4MkUw
OTdEOTMwMjAwOTRDOUU0IC8qIHJlbmRlcl9mbGV4Ym94LmNwcCAqLzsgfTsKIAkJQkNFQTQ4NkUw
OTdEOTMwMjAwOTRDOUU0IC8qIHJlbmRlcl9mbGV4Ym94LmggaW4gSGVhZGVycyAqLyA9IHtpc2Eg
PSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBCQ0VBNDgyRjA5N0Q5MzAyMDA5NEM5RTQgLyogcmVu
ZGVyX2ZsZXhib3guaCAqLzsgfTsKIAkJQkNFQTQ4NkYwOTdEOTMwMjAwOTRDOUU0IC8qIHJlbmRl
cl9mbG93LmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9
IEJDRUE0ODMwMDk3RDkzMDIwMDk0QzlFNCAvKiByZW5kZXJfZmxvdy5jcHAgKi87IH07CkBAIC0x
NTY1LDggKzE1ODUsNiBAQAogCQlCQ0VBNDg4MjA5N0Q5MzAyMDA5NEM5RTQgLyogcmVuZGVyX3Jl
cGxhY2VkLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBC
Q0VBNDg0MzA5N0Q5MzAyMDA5NEM5RTQgLyogcmVuZGVyX3JlcGxhY2VkLmggKi87IH07CiAJCUJD
RUE0ODgzMDk3RDkzMDIwMDk0QzlFNCAvKiByZW5kZXJfc3R5bGUuY3BwIGluIFNvdXJjZXMgKi8g
PSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQkNFQTQ4NDQwOTdEOTMwMjAwOTRDOUU0
IC8qIHJlbmRlcl9zdHlsZS5jcHAgKi87IH07CiAJCUJDRUE0ODg0MDk3RDkzMDIwMDk0QzlFNCAv
KiByZW5kZXJfc3R5bGUuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmls
ZVJlZiA9IEJDRUE0ODQ1MDk3RDkzMDIwMDk0QzlFNCAvKiByZW5kZXJfc3R5bGUuaCAqLzsgfTsK
LQkJQkNFQTQ4ODUwOTdEOTMwMjAwOTRDOUU0IC8qIHJlbmRlcl90YWJsZS5jcHAgaW4gU291cmNl
cyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBCQ0VBNDg0NjA5N0Q5MzAyMDA5
NEM5RTQgLyogcmVuZGVyX3RhYmxlLmNwcCAqLzsgfTsKLQkJQkNFQTQ4ODYwOTdEOTMwMjAwOTRD
OUU0IC8qIHJlbmRlcl90YWJsZS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxl
OyBmaWxlUmVmID0gQkNFQTQ4NDcwOTdEOTMwMjAwOTRDOUU0IC8qIHJlbmRlcl90YWJsZS5oICov
OyB9OwogCQlCQ0VBNDg4NzA5N0Q5MzAyMDA5NEM5RTQgLyogcmVuZGVyX3RoZW1lX21hYy5oIGlu
IEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQkNFQTQ4NDgwOTdE
OTMwMjAwOTRDOUU0IC8qIHJlbmRlcl90aGVtZV9tYWMuaCAqLzsgfTsKIAkJQkNFQTQ4ODgwOTdE
OTMwMjAwOTRDOUU0IC8qIHJlbmRlcl90aGVtZV9tYWMubW0gaW4gU291cmNlcyAqLyA9IHtpc2Eg
PSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBCQ0VBNDg0OTA5N0Q5MzAyMDA5NEM5RTQgLyogcmVu
ZGVyX3RoZW1lX21hYy5tbSAqLzsgfTsKIAkJQkNFQTQ4ODkwOTdEOTMwMjAwOTRDOUU0IC8qIHJl
bmRlcl90aGVtZS5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVS
ZWYgPSBCQ0VBNDg0QTA5N0Q5MzAyMDA5NEM5RTQgLyogcmVuZGVyX3RoZW1lLmNwcCAqLzsgfTsK
QEAgLTE1OTAsOCArMTYwOCw4IEBACiAJCUJDRUE0ODlCMDk3RDkzMDIwMDk0QzlFNCAvKiByZW5k
ZXJfYXBwbGV0LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYg
PSBCQ0VBNDgxRDA5N0Q5MzAyMDA5NEM5RTQgLyogcmVuZGVyX2FwcGxldC5oICovOyB9OwogCQlC
Q0VBNDg5QzA5N0Q5MzAyMDA5NEM5RTQgLyogcmVuZGVyX2FyZW5hLmNwcCBpbiBTb3VyY2VzICov
ID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEJDRUE0ODFFMDk3RDkzMDIwMDk0QzlF
NCAvKiByZW5kZXJfYXJlbmEuY3BwICovOyB9OwogCQlCQ0VBNDg5RDA5N0Q5MzAyMDA5NEM5RTQg
LyogcmVuZGVyX2FyZW5hLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZp
bGVSZWYgPSBCQ0VBNDgxRjA5N0Q5MzAyMDA5NEM5RTQgLyogcmVuZGVyX2FyZW5hLmggKi87IH07
Ci0JCUJDRUE0ODlFMDk3RDkzMDIwMDk0QzlFNCAvKiByZW5kZXJfYmxvY2suY3BwIGluIFNvdXJj
ZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQkNFQTQ4MjAwOTdEOTMwMjAw
OTRDOUU0IC8qIHJlbmRlcl9ibG9jay5jcHAgKi87IH07Ci0JCUJDRUE0ODlGMDk3RDkzMDIwMDk0
QzlFNCAvKiByZW5kZXJfYmxvY2suaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmls
ZTsgZmlsZVJlZiA9IEJDRUE0ODIxMDk3RDkzMDIwMDk0QzlFNCAvKiByZW5kZXJfYmxvY2suaCAq
LzsgfTsKKwkJQkNFQTQ4OUUwOTdEOTMwMjAwOTRDOUU0IC8qIFJlbmRlckJsb2NrLmNwcCBpbiBT
b3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEJDRUE0ODIwMDk3RDkz
MDIwMDk0QzlFNCAvKiBSZW5kZXJCbG9jay5jcHAgKi87IH07CisJCUJDRUE0ODlGMDk3RDkzMDIw
MDk0QzlFNCAvKiBSZW5kZXJCbG9jay5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRG
aWxlOyBmaWxlUmVmID0gQkNFQTQ4MjEwOTdEOTMwMjAwOTRDOUU0IC8qIFJlbmRlckJsb2NrLmgg
Ki87IH07CiAJCUJDRUE0OEEwMDk3RDkzMDIwMDk0QzlFNCAvKiByZW5kZXJfYm94LmNwcCBpbiBT
b3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEJDRUE0ODIyMDk3RDkz
MDIwMDk0QzlFNCAvKiByZW5kZXJfYm94LmNwcCAqLzsgfTsKIAkJQkNFQTQ4QTEwOTdEOTMwMjAw
OTRDOUU0IC8qIHJlbmRlcl9ib3guaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmls
ZTsgZmlsZVJlZiA9IEJDRUE0ODIzMDk3RDkzMDIwMDk0QzlFNCAvKiByZW5kZXJfYm94LmggKi87
IH07CiAJCUJDRUE0OEEyMDk3RDkzMDIwMDk0QzlFNCAvKiByZW5kZXJfYnIuY3BwIGluIFNvdXJj
ZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQkNFQTQ4MjQwOTdEOTMwMjAw
OTRDOUU0IC8qIHJlbmRlcl9ici5jcHAgKi87IH07CkBAIC0xNjAyLDggKzE2MjAsOCBAQAogCQlC
Q0VBNDhBNzA5N0Q5MzAyMDA5NEM5RTQgLyogcmVuZGVyX2NhbnZhcy5oIGluIEhlYWRlcnMgKi8g
PSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQkNFQTQ4MjkwOTdEOTMwMjAwOTRDOUU0
IC8qIHJlbmRlcl9jYW52YXMuaCAqLzsgfTsKIAkJQkNFQTQ4QTgwOTdEOTMwMjAwOTRDOUU0IC8q
IHJlbmRlcl9jYW52YXNpbWFnZS5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZp
bGU7IGZpbGVSZWYgPSBCQ0VBNDgyQTA5N0Q5MzAyMDA5NEM5RTQgLyogcmVuZGVyX2NhbnZhc2lt
YWdlLmNwcCAqLzsgfTsKIAkJQkNFQTQ4QTkwOTdEOTMwMjAwOTRDOUU0IC8qIHJlbmRlcl9jYW52
YXNpbWFnZS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0g
QkNFQTQ4MkIwOTdEOTMwMjAwOTRDOUU0IC8qIHJlbmRlcl9jYW52YXNpbWFnZS5oICovOyB9Owot
CQlCQ0VBNDhBQTA5N0Q5MzAyMDA5NEM5RTQgLyogcmVuZGVyX2NvbnRhaW5lci5jcHAgaW4gU291
cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBCQ0VBNDgyQzA5N0Q5MzAy
MDA5NEM5RTQgLyogcmVuZGVyX2NvbnRhaW5lci5jcHAgKi87IH07Ci0JCUJDRUE0OEFCMDk3RDkz
MDIwMDk0QzlFNCAvKiByZW5kZXJfY29udGFpbmVyLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQ
QlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBCQ0VBNDgyRDA5N0Q5MzAyMDA5NEM5RTQgLyogcmVuZGVy
X2NvbnRhaW5lci5oICovOyB9OworCQlCQ0VBNDhBQTA5N0Q5MzAyMDA5NEM5RTQgLyogUmVuZGVy
Q29udGFpbmVyLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJl
ZiA9IEJDRUE0ODJDMDk3RDkzMDIwMDk0QzlFNCAvKiBSZW5kZXJDb250YWluZXIuY3BwICovOyB9
OworCQlCQ0VBNDhBQjA5N0Q5MzAyMDA5NEM5RTQgLyogUmVuZGVyQ29udGFpbmVyLmggaW4gSGVh
ZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBCQ0VBNDgyRDA5N0Q5MzAy
MDA5NEM5RTQgLyogUmVuZGVyQ29udGFpbmVyLmggKi87IH07CiAJCUJDRUE0OEFDMDk3RDkzMDIw
MDk0QzlFNCAvKiByZW5kZXJfZmxleGJveC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhC
dWlsZEZpbGU7IGZpbGVSZWYgPSBCQ0VBNDgyRTA5N0Q5MzAyMDA5NEM5RTQgLyogcmVuZGVyX2Zs
ZXhib3guY3BwICovOyB9OwogCQlCQ0VBNDhBRDA5N0Q5MzAyMDA5NEM5RTQgLyogcmVuZGVyX2Zs
ZXhib3guaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEJD
RUE0ODJGMDk3RDkzMDIwMDk0QzlFNCAvKiByZW5kZXJfZmxleGJveC5oICovOyB9OwogCQlCQ0VB
NDhBRTA5N0Q5MzAyMDA5NEM5RTQgLyogcmVuZGVyX2Zsb3cuY3BwIGluIFNvdXJjZXMgKi8gPSB7
aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQkNFQTQ4MzAwOTdEOTMwMjAwOTRDOUU0IC8q
IHJlbmRlcl9mbG93LmNwcCAqLzsgfTsKQEAgLTE2MjgsOCArMTY0Niw2IEBACiAJCUJDRUE0OEMx
MDk3RDkzMDIwMDk0QzlFNCAvKiByZW5kZXJfcmVwbGFjZWQuaCBpbiBIZWFkZXJzICovID0ge2lz
YSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEJDRUE0ODQzMDk3RDkzMDIwMDk0QzlFNCAvKiBy
ZW5kZXJfcmVwbGFjZWQuaCAqLzsgfTsKIAkJQkNFQTQ4QzIwOTdEOTMwMjAwOTRDOUU0IC8qIHJl
bmRlcl9zdHlsZS5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVS
ZWYgPSBCQ0VBNDg0NDA5N0Q5MzAyMDA5NEM5RTQgLyogcmVuZGVyX3N0eWxlLmNwcCAqLzsgfTsK
IAkJQkNFQTQ4QzMwOTdEOTMwMjAwOTRDOUU0IC8qIHJlbmRlcl9zdHlsZS5oIGluIEhlYWRlcnMg
Ki8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQkNFQTQ4NDUwOTdEOTMwMjAwOTRD
OUU0IC8qIHJlbmRlcl9zdHlsZS5oICovOyB9OwotCQlCQ0VBNDhDNDA5N0Q5MzAyMDA5NEM5RTQg
LyogcmVuZGVyX3RhYmxlLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsg
ZmlsZVJlZiA9IEJDRUE0ODQ2MDk3RDkzMDIwMDk0QzlFNCAvKiByZW5kZXJfdGFibGUuY3BwICov
OyB9OwotCQlCQ0VBNDhDNTA5N0Q5MzAyMDA5NEM5RTQgLyogcmVuZGVyX3RhYmxlLmggaW4gSGVh
ZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBCQ0VBNDg0NzA5N0Q5MzAy
MDA5NEM5RTQgLyogcmVuZGVyX3RhYmxlLmggKi87IH07CiAJCUJDRUE0OEM2MDk3RDkzMDIwMDk0
QzlFNCAvKiByZW5kZXJfdGhlbWVfbWFjLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWls
ZEZpbGU7IGZpbGVSZWYgPSBCQ0VBNDg0ODA5N0Q5MzAyMDA5NEM5RTQgLyogcmVuZGVyX3RoZW1l
X21hYy5oICovOyB9OwogCQlCQ0VBNDhDNzA5N0Q5MzAyMDA5NEM5RTQgLyogcmVuZGVyX3RoZW1l
X21hYy5tbSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEJD
RUE0ODQ5MDk3RDkzMDIwMDk0QzlFNCAvKiByZW5kZXJfdGhlbWVfbWFjLm1tICovOyB9OwogCQlC
Q0VBNDhDODA5N0Q5MzAyMDA5NEM5RTQgLyogcmVuZGVyX3RoZW1lLmNwcCBpbiBTb3VyY2VzICov
ID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEJDRUE0ODRBMDk3RDkzMDIwMDk0QzlF
NCAvKiByZW5kZXJfdGhlbWUuY3BwICovOyB9OwpAQCAtMjQyNiw2ICsyNDQyLDE2IEBACiAJCUE4
REYzRkNCMDk3RkEwRkIwMDUyOTgxQiAvKiBIVE1MQmFzZUZvbnRFbGVtZW50SW1wbC5jcHAgKi8g
PSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZp
bGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gSFRNTEJhc2VGb250RWxlbWVudElt
cGwuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlBOERGM0ZDQzA5N0ZBMEZCMDA1
Mjk4MUIgLyogSFRNTE5hbWVDb2xsZWN0aW9uSW1wbC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZl
cmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUu
Yy5oOyBwYXRoID0gSFRNTE5hbWVDb2xsZWN0aW9uSW1wbC5oOyBzb3VyY2VUcmVlID0gIjxncm91
cD4iOyB9OwogCQlBOERGM0ZDRDA5N0ZBMEZCMDA1Mjk4MUIgLyogSFRNTE5hbWVDb2xsZWN0aW9u
SW1wbC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7
IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gSFRNTE5hbWVD
b2xsZWN0aW9uSW1wbC5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUE4REY0QURF
MDk4MEM0MkMwMDUyOTgxQiAvKiBSZW5kZXJUYWJsZUNvbC5jcHAgKi8gPSB7aXNhID0gUEJYRmls
ZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNl
Y29kZS5jcHAuY3BwOyBwYXRoID0gUmVuZGVyVGFibGVDb2wuY3BwOyBzb3VyY2VUcmVlID0gIjxn
cm91cD4iOyB9OworCQlBOERGNEFERjA5ODBDNDJDMDA1Mjk4MUIgLyogUmVuZGVyVGFibGVDZWxs
LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RL
bm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBSZW5kZXJUYWJsZUNlbGwuaDsg
c291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJQThERjRBRTAwOTgwQzQyQzAwNTI5ODFCIC8q
IFJlbmRlclRhYmxlQ2VsbC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVu
Y29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRo
ID0gUmVuZGVyVGFibGVDZWxsLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJQThE
RjRBRTEwOTgwQzQyQzAwNTI5ODFCIC8qIFJlbmRlclRhYmxlLmggKi8gPSB7aXNhID0gUEJYRmls
ZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNl
Y29kZS5jLmg7IHBhdGggPSBSZW5kZXJUYWJsZS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9
OworCQlBOERGNEFFMjA5ODBDNDJDMDA1Mjk4MUIgLyogUmVuZGVyVGFibGUuY3BwICovID0ge2lz
YSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlw
ZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IFJlbmRlclRhYmxlLmNwcDsgc291cmNlVHJl
ZSA9ICI8Z3JvdXA+IjsgfTsKKwkJQThERjRBRTMwOTgwQzQyQzAwNTI5ODFCIC8qIFJlbmRlclRh
YmxlU2VjdGlvbi5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5n
ID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gUmVu
ZGVyVGFibGVTZWN0aW9uLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJQThERjRB
RTQwOTgwQzQyQzAwNTI5ODFCIC8qIFJlbmRlclRhYmxlUm93LmggKi8gPSB7aXNhID0gUEJYRmls
ZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNl
Y29kZS5jLmg7IHBhdGggPSBSZW5kZXJUYWJsZVJvdy5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4i
OyB9OworCQlBOERGNEFFNTA5ODBDNDJDMDA1Mjk4MUIgLyogUmVuZGVyVGFibGVTZWN0aW9uLmgg
Ki8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93
bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBSZW5kZXJUYWJsZVNlY3Rpb24uaDsg
c291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJQThERjRBRTYwOTgwQzQyQzAwNTI5ODFCIC8q
IFJlbmRlclRhYmxlUm93LmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5j
b2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGgg
PSBSZW5kZXJUYWJsZVJvdy5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUE4REY0
QUU3MDk4MEM0MkMwMDUyOTgxQiAvKiBSZW5kZXJUYWJsZUNvbC5oICovID0ge2lzYSA9IFBCWEZp
bGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJj
ZWNvZGUuYy5oOyBwYXRoID0gUmVuZGVyVGFibGVDb2wuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+
IjsgfTsKIAkJQThGRUZCMDgwOTc5RjQ3MjAwNTgzOUZEIC8qIFJlbmRlckZvcmVpZ25PYmplY3Qu
aCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtu
b3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFJlbmRlckZvcmVpZ25PYmplY3Qu
aDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJQThGRUZCMDkwOTc5RjQ3MjAwNTgzOUZE
IC8qIFJlbmRlckZvcmVpZ25PYmplY3QuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7
IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNw
cDsgcGF0aCA9IFJlbmRlckZvcmVpZ25PYmplY3QuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4i
OyB9OwogCQlBOEZFRkIyRjA5NzlGNEY2MDA1ODM5RkQgLyogU1ZHRm9yZWlnbk9iamVjdEVsZW1l
bnRJbXBsLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAz
MDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBTVkdGb3Jl
aWduT2JqZWN0RWxlbWVudEltcGwuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwpAQCAt
MjU1Niw4ICsyNTgyLDggQEAKIAkJQkNFQTQ4MUQwOTdEOTMwMjAwOTRDOUU0IC8qIHJlbmRlcl9h
cHBsZXQuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsg
bGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IHJlbmRlcl9hcHBsZXQu
aDsgcGF0aCA9IHJlbmRlcmluZy9yZW5kZXJfYXBwbGV0Lmg7IHNvdXJjZVRyZWUgPSBTT1VSQ0Vf
Uk9PVDsgfTsKIAkJQkNFQTQ4MUUwOTdEOTMwMjAwOTRDOUU0IC8qIHJlbmRlcl9hcmVuYS5jcHAg
Ki8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93
bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBuYW1lID0gcmVuZGVyX2FyZW5hLmNwcDsg
cGF0aCA9IHJlbmRlcmluZy9yZW5kZXJfYXJlbmEuY3BwOyBzb3VyY2VUcmVlID0gU09VUkNFX1JP
T1Q7IH07CiAJCUJDRUE0ODFGMDk3RDkzMDIwMDk0QzlFNCAvKiByZW5kZXJfYXJlbmEuaCAqLyA9
IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmls
ZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IHJlbmRlcl9hcmVuYS5oOyBwYXRoID0gcmVu
ZGVyaW5nL3JlbmRlcl9hcmVuYS5oOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07Ci0JCUJD
RUE0ODIwMDk3RDkzMDIwMDk0QzlFNCAvKiByZW5kZXJfYmxvY2suY3BwICovID0ge2lzYSA9IFBC
WEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNv
dXJjZWNvZGUuY3BwLmNwcDsgbmFtZSA9IHJlbmRlcl9ibG9jay5jcHA7IHBhdGggPSByZW5kZXJp
bmcvcmVuZGVyX2Jsb2NrLmNwcDsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OwotCQlCQ0VB
NDgyMTA5N0Q5MzAyMDA5NEM5RTQgLyogcmVuZGVyX2Jsb2NrLmggKi8gPSB7aXNhID0gUEJYRmls
ZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNl
Y29kZS5jLmg7IG5hbWUgPSByZW5kZXJfYmxvY2suaDsgcGF0aCA9IHJlbmRlcmluZy9yZW5kZXJf
YmxvY2suaDsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQlCQ0VBNDgyMDA5N0Q5MzAy
MDA5NEM5RTQgLyogUmVuZGVyQmxvY2suY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7
IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNw
cDsgcGF0aCA9IFJlbmRlckJsb2NrLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJ
QkNFQTQ4MjEwOTdEOTMwMjAwOTRDOUU0IC8qIFJlbmRlckJsb2NrLmggKi8gPSB7aXNhID0gUEJY
RmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291
cmNlY29kZS5jLmg7IHBhdGggPSBSZW5kZXJCbG9jay5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4i
OyB9OwogCQlCQ0VBNDgyMjA5N0Q5MzAyMDA5NEM5RTQgLyogcmVuZGVyX2JveC5jcHAgKi8gPSB7
aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVU
eXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBuYW1lID0gcmVuZGVyX2JveC5jcHA7IHBhdGggPSBy
ZW5kZXJpbmcvcmVuZGVyX2JveC5jcHA7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKIAkJ
QkNFQTQ4MjMwOTdEOTMwMjAwOTRDOUU0IC8qIHJlbmRlcl9ib3guaCAqLyA9IHtpc2EgPSBQQlhG
aWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3Vy
Y2Vjb2RlLmMuaDsgbmFtZSA9IHJlbmRlcl9ib3guaDsgcGF0aCA9IHJlbmRlcmluZy9yZW5kZXJf
Ym94Lmg7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKIAkJQkNFQTQ4MjQwOTdEOTMwMjAw
OTRDOUU0IC8qIHJlbmRlcl9ici5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmls
ZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBu
YW1lID0gcmVuZGVyX2JyLmNwcDsgcGF0aCA9IHJlbmRlcmluZy9yZW5kZXJfYnIuY3BwOyBzb3Vy
Y2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CkBAIC0yNTY4LDggKzI1OTQsOCBAQAogCQlCQ0VBNDgy
OTA5N0Q5MzAyMDA5NEM5RTQgLyogcmVuZGVyX2NhbnZhcy5oICovID0ge2lzYSA9IFBCWEZpbGVS
ZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNv
ZGUuYy5oOyBuYW1lID0gcmVuZGVyX2NhbnZhcy5oOyBwYXRoID0gcmVuZGVyaW5nL3JlbmRlcl9j
YW52YXMuaDsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OwogCQlCQ0VBNDgyQTA5N0Q5MzAy
MDA5NEM5RTQgLyogcmVuZGVyX2NhbnZhc2ltYWdlLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVm
ZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2Rl
LmNwcC5jcHA7IG5hbWUgPSByZW5kZXJfY2FudmFzaW1hZ2UuY3BwOyBwYXRoID0gcmVuZGVyaW5n
L3JlbmRlcl9jYW52YXNpbWFnZS5jcHA7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKIAkJ
QkNFQTQ4MkIwOTdEOTMwMjAwOTRDOUU0IC8qIHJlbmRlcl9jYW52YXNpbWFnZS5oICovID0ge2lz
YSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlw
ZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gcmVuZGVyX2NhbnZhc2ltYWdlLmg7IHBhdGggPSBy
ZW5kZXJpbmcvcmVuZGVyX2NhbnZhc2ltYWdlLmg7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsg
fTsKLQkJQkNFQTQ4MkMwOTdEOTMwMjAwOTRDOUU0IC8qIHJlbmRlcl9jb250YWluZXIuY3BwICov
ID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25G
aWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgbmFtZSA9IHJlbmRlcl9jb250YWluZXIuY3Bw
OyBwYXRoID0gcmVuZGVyaW5nL3JlbmRlcl9jb250YWluZXIuY3BwOyBzb3VyY2VUcmVlID0gU09V
UkNFX1JPT1Q7IH07Ci0JCUJDRUE0ODJEMDk3RDkzMDIwMDk0QzlFNCAvKiByZW5kZXJfY29udGFp
bmVyLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxh
c3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSByZW5kZXJfY29udGFpbmVy
Lmg7IHBhdGggPSByZW5kZXJpbmcvcmVuZGVyX2NvbnRhaW5lci5oOyBzb3VyY2VUcmVlID0gU09V
UkNFX1JPT1Q7IH07CisJCUJDRUE0ODJDMDk3RDkzMDIwMDk0QzlFNCAvKiBSZW5kZXJDb250YWlu
ZXIuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBs
YXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IFJlbmRlckNvbnRh
aW5lci5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUJDRUE0ODJEMDk3RDkzMDIw
MDk0QzlFNCAvKiBSZW5kZXJDb250YWluZXIuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNl
OyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsg
cGF0aCA9IFJlbmRlckNvbnRhaW5lci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlC
Q0VBNDgyRTA5N0Q5MzAyMDA5NEM5RTQgLyogcmVuZGVyX2ZsZXhib3guY3BwICovID0ge2lzYSA9
IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9
IHNvdXJjZWNvZGUuY3BwLmNwcDsgbmFtZSA9IHJlbmRlcl9mbGV4Ym94LmNwcDsgcGF0aCA9IHJl
bmRlcmluZy9yZW5kZXJfZmxleGJveC5jcHA7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsK
IAkJQkNFQTQ4MkYwOTdEOTMwMjAwOTRDOUU0IC8qIHJlbmRlcl9mbGV4Ym94LmggKi8gPSB7aXNh
ID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBl
ID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSByZW5kZXJfZmxleGJveC5oOyBwYXRoID0gcmVuZGVy
aW5nL3JlbmRlcl9mbGV4Ym94Lmg7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKIAkJQkNF
QTQ4MzAwOTdEOTMwMjAwOTRDOUU0IC8qIHJlbmRlcl9mbG93LmNwcCAqLyA9IHtpc2EgPSBQQlhG
aWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3Vy
Y2Vjb2RlLmNwcC5jcHA7IG5hbWUgPSByZW5kZXJfZmxvdy5jcHA7IHBhdGggPSByZW5kZXJpbmcv
cmVuZGVyX2Zsb3cuY3BwOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CkBAIC0yNTk0LDgg
KzI2MjAsNiBAQAogCQlCQ0VBNDg0MzA5N0Q5MzAyMDA5NEM5RTQgLyogcmVuZGVyX3JlcGxhY2Vk
LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RL
bm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSByZW5kZXJfcmVwbGFjZWQuaDsg
cGF0aCA9IHJlbmRlcmluZy9yZW5kZXJfcmVwbGFjZWQuaDsgc291cmNlVHJlZSA9IFNPVVJDRV9S
T09UOyB9OwogCQlCQ0VBNDg0NDA5N0Q5MzAyMDA5NEM5RTQgLyogcmVuZGVyX3N0eWxlLmNwcCAq
LyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3du
RmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IG5hbWUgPSByZW5kZXJfc3R5bGUuY3BwOyBw
YXRoID0gcmVuZGVyaW5nL3JlbmRlcl9zdHlsZS5jcHA7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9P
VDsgfTsKIAkJQkNFQTQ4NDUwOTdEOTMwMjAwOTRDOUU0IC8qIHJlbmRlcl9zdHlsZS5oICovID0g
e2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxl
VHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gcmVuZGVyX3N0eWxlLmg7IHBhdGggPSByZW5k
ZXJpbmcvcmVuZGVyX3N0eWxlLmg7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKLQkJQkNF
QTQ4NDYwOTdEOTMwMjAwOTRDOUU0IC8qIHJlbmRlcl90YWJsZS5jcHAgKi8gPSB7aXNhID0gUEJY
RmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291
cmNlY29kZS5jcHAuY3BwOyBuYW1lID0gcmVuZGVyX3RhYmxlLmNwcDsgcGF0aCA9IHJlbmRlcmlu
Zy9yZW5kZXJfdGFibGUuY3BwOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07Ci0JCUJDRUE0
ODQ3MDk3RDkzMDIwMDk0QzlFNCAvKiByZW5kZXJfdGFibGUuaCAqLyA9IHtpc2EgPSBQQlhGaWxl
UmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vj
b2RlLmMuaDsgbmFtZSA9IHJlbmRlcl90YWJsZS5oOyBwYXRoID0gcmVuZGVyaW5nL3JlbmRlcl90
YWJsZS5oOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CiAJCUJDRUE0ODQ4MDk3RDkzMDIw
MDk0QzlFNCAvKiByZW5kZXJfdGhlbWVfbWFjLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5j
ZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7
IG5hbWUgPSByZW5kZXJfdGhlbWVfbWFjLmg7IHBhdGggPSByZW5kZXJpbmcvcmVuZGVyX3RoZW1l
X21hYy5oOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CiAJCUJDRUE0ODQ5MDk3RDkzMDIw
MDk0QzlFNCAvKiByZW5kZXJfdGhlbWVfbWFjLm1tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVu
Y2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3Bw
Lm9iamNwcDsgbmFtZSA9IHJlbmRlcl90aGVtZV9tYWMubW07IHBhdGggPSByZW5kZXJpbmcvcmVu
ZGVyX3RoZW1lX21hYy5tbTsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OwogCQlCQ0VBNDg0
QTA5N0Q5MzAyMDA5NEM5RTQgLyogcmVuZGVyX3RoZW1lLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxl
UmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vj
b2RlLmNwcC5jcHA7IG5hbWUgPSByZW5kZXJfdGhlbWUuY3BwOyBwYXRoID0gcmVuZGVyaW5nL3Jl
bmRlcl90aGVtZS5jcHA7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKQEAgLTQxMzgsOCAr
NDE2Miw4IEBACiAJCQkJQkNFQTQ4MUQwOTdEOTMwMjAwOTRDOUU0IC8qIHJlbmRlcl9hcHBsZXQu
aCAqLywKIAkJCQlCQ0VBNDgxRTA5N0Q5MzAyMDA5NEM5RTQgLyogcmVuZGVyX2FyZW5hLmNwcCAq
LywKIAkJCQlCQ0VBNDgxRjA5N0Q5MzAyMDA5NEM5RTQgLyogcmVuZGVyX2FyZW5hLmggKi8sCi0J
CQkJQkNFQTQ4MjAwOTdEOTMwMjAwOTRDOUU0IC8qIHJlbmRlcl9ibG9jay5jcHAgKi8sCi0JCQkJ
QkNFQTQ4MjEwOTdEOTMwMjAwOTRDOUU0IC8qIHJlbmRlcl9ibG9jay5oICovLAorCQkJCUJDRUE0
ODIwMDk3RDkzMDIwMDk0QzlFNCAvKiBSZW5kZXJCbG9jay5jcHAgKi8sCisJCQkJQkNFQTQ4MjEw
OTdEOTMwMjAwOTRDOUU0IC8qIFJlbmRlckJsb2NrLmggKi8sCiAJCQkJQkNFQTQ4MjIwOTdEOTMw
MjAwOTRDOUU0IC8qIHJlbmRlcl9ib3guY3BwICovLAogCQkJCUJDRUE0ODIzMDk3RDkzMDIwMDk0
QzlFNCAvKiByZW5kZXJfYm94LmggKi8sCiAJCQkJQkNFQTQ4MjQwOTdEOTMwMjAwOTRDOUU0IC8q
IHJlbmRlcl9ici5jcHAgKi8sCkBAIC00MTUwLDggKzQxNzQsOCBAQAogCQkJCUJDRUE0ODI5MDk3
RDkzMDIwMDk0QzlFNCAvKiByZW5kZXJfY2FudmFzLmggKi8sCiAJCQkJQkNFQTQ4MkEwOTdEOTMw
MjAwOTRDOUU0IC8qIHJlbmRlcl9jYW52YXNpbWFnZS5jcHAgKi8sCiAJCQkJQkNFQTQ4MkIwOTdE
OTMwMjAwOTRDOUU0IC8qIHJlbmRlcl9jYW52YXNpbWFnZS5oICovLAotCQkJCUJDRUE0ODJDMDk3
RDkzMDIwMDk0QzlFNCAvKiByZW5kZXJfY29udGFpbmVyLmNwcCAqLywKLQkJCQlCQ0VBNDgyRDA5
N0Q5MzAyMDA5NEM5RTQgLyogcmVuZGVyX2NvbnRhaW5lci5oICovLAorCQkJCUJDRUE0ODJDMDk3
RDkzMDIwMDk0QzlFNCAvKiBSZW5kZXJDb250YWluZXIuY3BwICovLAorCQkJCUJDRUE0ODJEMDk3
RDkzMDIwMDk0QzlFNCAvKiBSZW5kZXJDb250YWluZXIuaCAqLywKIAkJCQlCQ0VBNDgyRTA5N0Q5
MzAyMDA5NEM5RTQgLyogcmVuZGVyX2ZsZXhib3guY3BwICovLAogCQkJCUJDRUE0ODJGMDk3RDkz
MDIwMDk0QzlFNCAvKiByZW5kZXJfZmxleGJveC5oICovLAogCQkJCUJDRUE0ODMwMDk3RDkzMDIw
MDk0QzlFNCAvKiByZW5kZXJfZmxvdy5jcHAgKi8sCkBAIC00MTc2LDggKzQyMDAsNiBAQAogCQkJ
CUJDRUE0ODQzMDk3RDkzMDIwMDk0QzlFNCAvKiByZW5kZXJfcmVwbGFjZWQuaCAqLywKIAkJCQlC
Q0VBNDg0NDA5N0Q5MzAyMDA5NEM5RTQgLyogcmVuZGVyX3N0eWxlLmNwcCAqLywKIAkJCQlCQ0VB
NDg0NTA5N0Q5MzAyMDA5NEM5RTQgLyogcmVuZGVyX3N0eWxlLmggKi8sCi0JCQkJQkNFQTQ4NDYw
OTdEOTMwMjAwOTRDOUU0IC8qIHJlbmRlcl90YWJsZS5jcHAgKi8sCi0JCQkJQkNFQTQ4NDcwOTdE
OTMwMjAwOTRDOUU0IC8qIHJlbmRlcl90YWJsZS5oICovLAogCQkJCUJDRUE0ODQ4MDk3RDkzMDIw
MDk0QzlFNCAvKiByZW5kZXJfdGhlbWVfbWFjLmggKi8sCiAJCQkJQkNFQTQ4NDkwOTdEOTMwMjAw
OTRDOUU0IC8qIHJlbmRlcl90aGVtZV9tYWMubW0gKi8sCiAJCQkJQkNFQTQ4NEEwOTdEOTMwMjAw
OTRDOUU0IC8qIHJlbmRlcl90aGVtZS5jcHAgKi8sCkBAIC00MTg4LDYgKzQyMTAsMTYgQEAKIAkJ
CQlCQ0VBNDg0RjA5N0Q5MzAyMDA5NEM5RTQgLyogUmVuZGVyVGV4dEZyYWdtZW50LmggKi8sCiAJ
CQkJQkNFQTQ4NTAwOTdEOTMwMjAwOTRDOUU0IC8qIHRhYmxlX2xheW91dC5jcHAgKi8sCiAJCQkJ
QkNFQTQ4NTEwOTdEOTMwMjAwOTRDOUU0IC8qIHRhYmxlX2xheW91dC5oICovLAorCQkJCUE4REY0
QUUwMDk4MEM0MkMwMDUyOTgxQiAvKiBSZW5kZXJUYWJsZUNlbGwuY3BwICovLAorCQkJCUE4REY0
QURGMDk4MEM0MkMwMDUyOTgxQiAvKiBSZW5kZXJUYWJsZUNlbGwuaCAqLywKKwkJCQlBOERGNEFF
MjA5ODBDNDJDMDA1Mjk4MUIgLyogUmVuZGVyVGFibGUuY3BwICovLAorCQkJCUE4REY0QUUxMDk4
MEM0MkMwMDUyOTgxQiAvKiBSZW5kZXJUYWJsZS5oICovLAorCQkJCUE4REY0QUUzMDk4MEM0MkMw
MDUyOTgxQiAvKiBSZW5kZXJUYWJsZVNlY3Rpb24uY3BwICovLAorCQkJCUE4REY0QUU1MDk4MEM0
MkMwMDUyOTgxQiAvKiBSZW5kZXJUYWJsZVNlY3Rpb24uaCAqLywKKwkJCQlBOERGNEFFNjA5ODBD
NDJDMDA1Mjk4MUIgLyogUmVuZGVyVGFibGVSb3cuY3BwICovLAorCQkJCUE4REY0QUU0MDk4MEM0
MkMwMDUyOTgxQiAvKiBSZW5kZXJUYWJsZVJvdy5oICovLAorCQkJCUE4REY0QURFMDk4MEM0MkMw
MDUyOTgxQiAvKiBSZW5kZXJUYWJsZUNvbC5jcHAgKi8sCisJCQkJQThERjRBRTcwOTgwQzQyQzAw
NTI5ODFCIC8qIFJlbmRlclRhYmxlQ29sLmggKi8sCiAJCQkpOwogCQkJcGF0aCA9IHJlbmRlcmlu
ZzsKIAkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CkBAIC00OTYzLDEzICs0OTk1LDEzIEBACiAJ
CQkJQkNFQTQ4NUEwOTdEOTMwMjAwOTRDOUU0IC8qIElubGluZVRleHRCb3guaCBpbiBIZWFkZXJz
ICovLAogCQkJCUJDRUE0ODVDMDk3RDkzMDIwMDk0QzlFNCAvKiByZW5kZXJfYXBwbGV0LmggaW4g
SGVhZGVycyAqLywKIAkJCQlCQ0VBNDg1RTA5N0Q5MzAyMDA5NEM5RTQgLyogcmVuZGVyX2FyZW5h
LmggaW4gSGVhZGVycyAqLywKLQkJCQlCQ0VBNDg2MDA5N0Q5MzAyMDA5NEM5RTQgLyogcmVuZGVy
X2Jsb2NrLmggaW4gSGVhZGVycyAqLywKKwkJCQlCQ0VBNDg2MDA5N0Q5MzAyMDA5NEM5RTQgLyog
UmVuZGVyQmxvY2suaCBpbiBIZWFkZXJzICovLAogCQkJCUJDRUE0ODYyMDk3RDkzMDIwMDk0QzlF
NCAvKiByZW5kZXJfYm94LmggaW4gSGVhZGVycyAqLywKIAkJCQlCQ0VBNDg2NDA5N0Q5MzAyMDA5
NEM5RTQgLyogcmVuZGVyX2JyLmggaW4gSGVhZGVycyAqLywKIAkJCQlCQ0VBNDg2NjA5N0Q5MzAy
MDA5NEM5RTQgLyogcmVuZGVyX2J1dHRvbi5oIGluIEhlYWRlcnMgKi8sCiAJCQkJQkNFQTQ4Njgw
OTdEOTMwMjAwOTRDOUU0IC8qIHJlbmRlcl9jYW52YXMuaCBpbiBIZWFkZXJzICovLAogCQkJCUJD
RUE0ODZBMDk3RDkzMDIwMDk0QzlFNCAvKiByZW5kZXJfY2FudmFzaW1hZ2UuaCBpbiBIZWFkZXJz
ICovLAotCQkJCUJDRUE0ODZDMDk3RDkzMDIwMDk0QzlFNCAvKiByZW5kZXJfY29udGFpbmVyLmgg
aW4gSGVhZGVycyAqLywKKwkJCQlCQ0VBNDg2QzA5N0Q5MzAyMDA5NEM5RTQgLyogUmVuZGVyQ29u
dGFpbmVyLmggaW4gSGVhZGVycyAqLywKIAkJCQlCQ0VBNDg2RTA5N0Q5MzAyMDA5NEM5RTQgLyog
cmVuZGVyX2ZsZXhib3guaCBpbiBIZWFkZXJzICovLAogCQkJCUJDRUE0ODcwMDk3RDkzMDIwMDk0
QzlFNCAvKiByZW5kZXJfZmxvdy5oIGluIEhlYWRlcnMgKi8sCiAJCQkJQkNFQTQ4NzIwOTdEOTMw
MjAwOTRDOUU0IC8qIHJlbmRlcl9mb3JtLmggaW4gSGVhZGVycyAqLywKQEAgLTQ5ODIsNyArNTAx
NCw2IEBACiAJCQkJQkNFQTQ4ODAwOTdEOTMwMjAwOTRDOUU0IC8qIHJlbmRlcl9vYmplY3QuaCBp
biBIZWFkZXJzICovLAogCQkJCUJDRUE0ODgyMDk3RDkzMDIwMDk0QzlFNCAvKiByZW5kZXJfcmVw
bGFjZWQuaCBpbiBIZWFkZXJzICovLAogCQkJCUJDRUE0ODg0MDk3RDkzMDIwMDk0QzlFNCAvKiBy
ZW5kZXJfc3R5bGUuaCBpbiBIZWFkZXJzICovLAotCQkJCUJDRUE0ODg2MDk3RDkzMDIwMDk0QzlF
NCAvKiByZW5kZXJfdGFibGUuaCBpbiBIZWFkZXJzICovLAogCQkJCUJDRUE0ODg3MDk3RDkzMDIw
MDk0QzlFNCAvKiByZW5kZXJfdGhlbWVfbWFjLmggaW4gSGVhZGVycyAqLywKIAkJCQlCQ0VBNDg4
QTA5N0Q5MzAyMDA5NEM5RTQgLyogcmVuZGVyX3RoZW1lLmggaW4gSGVhZGVycyAqLywKIAkJCQlC
Q0VBNDg4QzA5N0Q5MzAyMDA5NEM5RTQgLyogUmVuZGVyVGV4dC5oIGluIEhlYWRlcnMgKi8sCkBA
IC00OTk1LDYgKzUwMjYsMTEgQEAKIAkJCQlBOERGM0ZEMDA5N0ZBMEZDMDA1Mjk4MUIgLyogSFRN
TENvbGxlY3Rpb25JbXBsLmggaW4gSGVhZGVycyAqLywKIAkJCQlBOERGM0ZEMjA5N0ZBMEZDMDA1
Mjk4MUIgLyogSFRNTEJhc2VGb250RWxlbWVudEltcGwuaCBpbiBIZWFkZXJzICovLAogCQkJCUE4
REYzRkQ0MDk3RkEwRkMwMDUyOTgxQiAvKiBIVE1MTmFtZUNvbGxlY3Rpb25JbXBsLmggaW4gSGVh
ZGVycyAqLywKKwkJCQlBOERGNEFFOTA5ODBDNDJDMDA1Mjk4MUIgLyogUmVuZGVyVGFibGVDZWxs
LmggaW4gSGVhZGVycyAqLywKKwkJCQlBOERGNEFFQjA5ODBDNDJDMDA1Mjk4MUIgLyogUmVuZGVy
VGFibGUuaCBpbiBIZWFkZXJzICovLAorCQkJCUE4REY0QUVFMDk4MEM0MkMwMDUyOTgxQiAvKiBS
ZW5kZXJUYWJsZVJvdy5oIGluIEhlYWRlcnMgKi8sCisJCQkJQThERjRBRUYwOTgwQzQyQzAwNTI5
ODFCIC8qIFJlbmRlclRhYmxlU2VjdGlvbi5oIGluIEhlYWRlcnMgKi8sCisJCQkJQThERjRBRjEw
OTgwQzQyQzAwNTI5ODFCIC8qIFJlbmRlclRhYmxlQ29sLmggaW4gSGVhZGVycyAqLywKIAkJCSk7
CiAJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKIAkJfTsKQEAgLTUz
MTIsMTMgKzUzNDgsMTMgQEAKIAkJCQlCQ0VBNDg5OTA5N0Q5MzAyMDA5NEM5RTQgLyogSW5saW5l
VGV4dEJveC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJQkNFQTQ4OUIwOTdEOTMwMjAwOTRDOUU0IC8q
IHJlbmRlcl9hcHBsZXQuaCBpbiBIZWFkZXJzICovLAogCQkJCUJDRUE0ODlEMDk3RDkzMDIwMDk0
QzlFNCAvKiByZW5kZXJfYXJlbmEuaCBpbiBIZWFkZXJzICovLAotCQkJCUJDRUE0ODlGMDk3RDkz
MDIwMDk0QzlFNCAvKiByZW5kZXJfYmxvY2suaCBpbiBIZWFkZXJzICovLAorCQkJCUJDRUE0ODlG
MDk3RDkzMDIwMDk0QzlFNCAvKiBSZW5kZXJCbG9jay5oIGluIEhlYWRlcnMgKi8sCiAJCQkJQkNF
QTQ4QTEwOTdEOTMwMjAwOTRDOUU0IC8qIHJlbmRlcl9ib3guaCBpbiBIZWFkZXJzICovLAogCQkJ
CUJDRUE0OEEzMDk3RDkzMDIwMDk0QzlFNCAvKiByZW5kZXJfYnIuaCBpbiBIZWFkZXJzICovLAog
CQkJCUJDRUE0OEE1MDk3RDkzMDIwMDk0QzlFNCAvKiByZW5kZXJfYnV0dG9uLmggaW4gSGVhZGVy
cyAqLywKIAkJCQlCQ0VBNDhBNzA5N0Q5MzAyMDA5NEM5RTQgLyogcmVuZGVyX2NhbnZhcy5oIGlu
IEhlYWRlcnMgKi8sCiAJCQkJQkNFQTQ4QTkwOTdEOTMwMjAwOTRDOUU0IC8qIHJlbmRlcl9jYW52
YXNpbWFnZS5oIGluIEhlYWRlcnMgKi8sCi0JCQkJQkNFQTQ4QUIwOTdEOTMwMjAwOTRDOUU0IC8q
IHJlbmRlcl9jb250YWluZXIuaCBpbiBIZWFkZXJzICovLAorCQkJCUJDRUE0OEFCMDk3RDkzMDIw
MDk0QzlFNCAvKiBSZW5kZXJDb250YWluZXIuaCBpbiBIZWFkZXJzICovLAogCQkJCUJDRUE0OEFE
MDk3RDkzMDIwMDk0QzlFNCAvKiByZW5kZXJfZmxleGJveC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJ
QkNFQTQ4QUYwOTdEOTMwMjAwOTRDOUU0IC8qIHJlbmRlcl9mbG93LmggaW4gSGVhZGVycyAqLywK
IAkJCQlCQ0VBNDhCMTA5N0Q5MzAyMDA5NEM5RTQgLyogcmVuZGVyX2Zvcm0uaCBpbiBIZWFkZXJz
ICovLApAQCAtNTMzMSw3ICs1MzY3LDYgQEAKIAkJCQlCQ0VBNDhCRjA5N0Q5MzAyMDA5NEM5RTQg
LyogcmVuZGVyX29iamVjdC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJQkNFQTQ4QzEwOTdEOTMwMjAw
OTRDOUU0IC8qIHJlbmRlcl9yZXBsYWNlZC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJQkNFQTQ4QzMw
OTdEOTMwMjAwOTRDOUU0IC8qIHJlbmRlcl9zdHlsZS5oIGluIEhlYWRlcnMgKi8sCi0JCQkJQkNF
QTQ4QzUwOTdEOTMwMjAwOTRDOUU0IC8qIHJlbmRlcl90YWJsZS5oIGluIEhlYWRlcnMgKi8sCiAJ
CQkJQkNFQTQ4QzYwOTdEOTMwMjAwOTRDOUU0IC8qIHJlbmRlcl90aGVtZV9tYWMuaCBpbiBIZWFk
ZXJzICovLAogCQkJCUJDRUE0OEM5MDk3RDkzMDIwMDk0QzlFNCAvKiByZW5kZXJfdGhlbWUuaCBp
biBIZWFkZXJzICovLAogCQkJCUJDRUE0OENCMDk3RDkzMDIwMDk0QzlFNCAvKiBSZW5kZXJUZXh0
LmggaW4gSGVhZGVycyAqLywKQEAgLTUzNDIsNiArNTM3NywxMSBAQAogCQkJCUE4REYzRkQ4MDk3
RkEwRkMwMDUyOTgxQiAvKiBIVE1MQ29sbGVjdGlvbkltcGwuaCBpbiBIZWFkZXJzICovLAogCQkJ
CUE4REYzRkRBMDk3RkEwRkMwMDUyOTgxQiAvKiBIVE1MQmFzZUZvbnRFbGVtZW50SW1wbC5oIGlu
IEhlYWRlcnMgKi8sCiAJCQkJQThERjNGREMwOTdGQTBGQzAwNTI5ODFCIC8qIEhUTUxOYW1lQ29s
bGVjdGlvbkltcGwuaCBpbiBIZWFkZXJzICovLAorCQkJCUE4REY0QUYzMDk4MEM0MkMwMDUyOTgx
QiAvKiBSZW5kZXJUYWJsZUNlbGwuaCBpbiBIZWFkZXJzICovLAorCQkJCUE4REY0QUY1MDk4MEM0
MkMwMDUyOTgxQiAvKiBSZW5kZXJUYWJsZS5oIGluIEhlYWRlcnMgKi8sCisJCQkJQThERjRBRjgw
OTgwQzQyQzAwNTI5ODFCIC8qIFJlbmRlclRhYmxlUm93LmggaW4gSGVhZGVycyAqLywKKwkJCQlB
OERGNEFGOTA5ODBDNDJDMDA1Mjk4MUIgLyogUmVuZGVyVGFibGVTZWN0aW9uLmggaW4gSGVhZGVy
cyAqLywKKwkJCQlBOERGNEFGQjA5ODBDNDJDMDA1Mjk4MUIgLyogUmVuZGVyVGFibGVDb2wuaCBp
biBIZWFkZXJzICovLAogCQkJKTsKIAkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3Np
bmcgPSAwOwogCQl9OwpAQCAtNjg3NSwxMyArNjkxNSwxMyBAQAogCQkJCUJDRUE0ODU5MDk3RDkz
MDIwMDk0QzlFNCAvKiBJbmxpbmVUZXh0Qm94LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUJDRUE0
ODVCMDk3RDkzMDIwMDk0QzlFNCAvKiByZW5kZXJfYXBwbGV0LmNwcCBpbiBTb3VyY2VzICovLAog
CQkJCUJDRUE0ODVEMDk3RDkzMDIwMDk0QzlFNCAvKiByZW5kZXJfYXJlbmEuY3BwIGluIFNvdXJj
ZXMgKi8sCi0JCQkJQkNFQTQ4NUYwOTdEOTMwMjAwOTRDOUU0IC8qIHJlbmRlcl9ibG9jay5jcHAg
aW4gU291cmNlcyAqLywKKwkJCQlCQ0VBNDg1RjA5N0Q5MzAyMDA5NEM5RTQgLyogUmVuZGVyQmxv
Y2suY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJQkNFQTQ4NjEwOTdEOTMwMjAwOTRDOUU0IC8qIHJl
bmRlcl9ib3guY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJQkNFQTQ4NjMwOTdEOTMwMjAwOTRDOUU0
IC8qIHJlbmRlcl9ici5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlCQ0VBNDg2NTA5N0Q5MzAyMDA5
NEM5RTQgLyogcmVuZGVyX2J1dHRvbi5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlCQ0VBNDg2NzA5
N0Q5MzAyMDA5NEM5RTQgLyogcmVuZGVyX2NhbnZhcy5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlC
Q0VBNDg2OTA5N0Q5MzAyMDA5NEM5RTQgLyogcmVuZGVyX2NhbnZhc2ltYWdlLmNwcCBpbiBTb3Vy
Y2VzICovLAotCQkJCUJDRUE0ODZCMDk3RDkzMDIwMDk0QzlFNCAvKiByZW5kZXJfY29udGFpbmVy
LmNwcCBpbiBTb3VyY2VzICovLAorCQkJCUJDRUE0ODZCMDk3RDkzMDIwMDk0QzlFNCAvKiBSZW5k
ZXJDb250YWluZXIuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJQkNFQTQ4NkQwOTdEOTMwMjAwOTRD
OUU0IC8qIHJlbmRlcl9mbGV4Ym94LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUJDRUE0ODZGMDk3
RDkzMDIwMDk0QzlFNCAvKiByZW5kZXJfZmxvdy5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlCQ0VB
NDg3MTA5N0Q5MzAyMDA5NEM5RTQgLyogcmVuZGVyX2Zvcm0uY3BwIGluIFNvdXJjZXMgKi8sCkBA
IC02ODk0LDcgKzY5MzQsNiBAQAogCQkJCUJDRUE0ODdGMDk3RDkzMDIwMDk0QzlFNCAvKiByZW5k
ZXJfb2JqZWN0LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUJDRUE0ODgxMDk3RDkzMDIwMDk0QzlF
NCAvKiByZW5kZXJfcmVwbGFjZWQuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJQkNFQTQ4ODMwOTdE
OTMwMjAwOTRDOUU0IC8qIHJlbmRlcl9zdHlsZS5jcHAgaW4gU291cmNlcyAqLywKLQkJCQlCQ0VB
NDg4NTA5N0Q5MzAyMDA5NEM5RTQgLyogcmVuZGVyX3RhYmxlLmNwcCBpbiBTb3VyY2VzICovLAog
CQkJCUJDRUE0ODg4MDk3RDkzMDIwMDk0QzlFNCAvKiByZW5kZXJfdGhlbWVfbWFjLm1tIGluIFNv
dXJjZXMgKi8sCiAJCQkJQkNFQTQ4ODkwOTdEOTMwMjAwOTRDOUU0IC8qIHJlbmRlcl90aGVtZS5j
cHAgaW4gU291cmNlcyAqLywKIAkJCQlCQ0VBNDg4QjA5N0Q5MzAyMDA5NEM5RTQgLyogUmVuZGVy
VGV4dC5jcHAgaW4gU291cmNlcyAqLywKQEAgLTY5MDcsNiArNjk0NiwxMSBAQAogCQkJCUE4REYz
RkQxMDk3RkEwRkMwMDUyOTgxQiAvKiBIVE1MQ29sbGVjdGlvbkltcGwuY3BwIGluIFNvdXJjZXMg
Ki8sCiAJCQkJQThERjNGRDMwOTdGQTBGQzAwNTI5ODFCIC8qIEhUTUxCYXNlRm9udEVsZW1lbnRJ
bXBsLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUE4REYzRkQ1MDk3RkEwRkMwMDUyOTgxQiAvKiBI
VE1MTmFtZUNvbGxlY3Rpb25JbXBsLmNwcCBpbiBTb3VyY2VzICovLAorCQkJCUE4REY0QUU4MDk4
MEM0MkMwMDUyOTgxQiAvKiBSZW5kZXJUYWJsZUNvbC5jcHAgaW4gU291cmNlcyAqLywKKwkJCQlB
OERGNEFFQTA5ODBDNDJDMDA1Mjk4MUIgLyogUmVuZGVyVGFibGVDZWxsLmNwcCBpbiBTb3VyY2Vz
ICovLAorCQkJCUE4REY0QUVDMDk4MEM0MkMwMDUyOTgxQiAvKiBSZW5kZXJUYWJsZS5jcHAgaW4g
U291cmNlcyAqLywKKwkJCQlBOERGNEFFRDA5ODBDNDJDMDA1Mjk4MUIgLyogUmVuZGVyVGFibGVT
ZWN0aW9uLmNwcCBpbiBTb3VyY2VzICovLAorCQkJCUE4REY0QUYwMDk4MEM0MkMwMDUyOTgxQiAv
KiBSZW5kZXJUYWJsZVJvdy5jcHAgaW4gU291cmNlcyAqLywKIAkJCSk7CiAJCQlydW5Pbmx5Rm9y
RGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKIAkJfTsKQEAgLTcxNzcsMTMgKzcyMjEsMTMg
QEAKIAkJCQlCQ0VBNDg5ODA5N0Q5MzAyMDA5NEM5RTQgLyogSW5saW5lVGV4dEJveC5jcHAgaW4g
U291cmNlcyAqLywKIAkJCQlCQ0VBNDg5QTA5N0Q5MzAyMDA5NEM5RTQgLyogcmVuZGVyX2FwcGxl
dC5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlCQ0VBNDg5QzA5N0Q5MzAyMDA5NEM5RTQgLyogcmVu
ZGVyX2FyZW5hLmNwcCBpbiBTb3VyY2VzICovLAotCQkJCUJDRUE0ODlFMDk3RDkzMDIwMDk0QzlF
NCAvKiByZW5kZXJfYmxvY2suY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJQkNFQTQ4OUUwOTdEOTMw
MjAwOTRDOUU0IC8qIFJlbmRlckJsb2NrLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUJDRUE0OEEw
MDk3RDkzMDIwMDk0QzlFNCAvKiByZW5kZXJfYm94LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUJD
RUE0OEEyMDk3RDkzMDIwMDk0QzlFNCAvKiByZW5kZXJfYnIuY3BwIGluIFNvdXJjZXMgKi8sCiAJ
CQkJQkNFQTQ4QTQwOTdEOTMwMjAwOTRDOUU0IC8qIHJlbmRlcl9idXR0b24uY3BwIGluIFNvdXJj
ZXMgKi8sCiAJCQkJQkNFQTQ4QTYwOTdEOTMwMjAwOTRDOUU0IC8qIHJlbmRlcl9jYW52YXMuY3Bw
IGluIFNvdXJjZXMgKi8sCiAJCQkJQkNFQTQ4QTgwOTdEOTMwMjAwOTRDOUU0IC8qIHJlbmRlcl9j
YW52YXNpbWFnZS5jcHAgaW4gU291cmNlcyAqLywKLQkJCQlCQ0VBNDhBQTA5N0Q5MzAyMDA5NEM5
RTQgLyogcmVuZGVyX2NvbnRhaW5lci5jcHAgaW4gU291cmNlcyAqLywKKwkJCQlCQ0VBNDhBQTA5
N0Q5MzAyMDA5NEM5RTQgLyogUmVuZGVyQ29udGFpbmVyLmNwcCBpbiBTb3VyY2VzICovLAogCQkJ
CUJDRUE0OEFDMDk3RDkzMDIwMDk0QzlFNCAvKiByZW5kZXJfZmxleGJveC5jcHAgaW4gU291cmNl
cyAqLywKIAkJCQlCQ0VBNDhBRTA5N0Q5MzAyMDA5NEM5RTQgLyogcmVuZGVyX2Zsb3cuY3BwIGlu
IFNvdXJjZXMgKi8sCiAJCQkJQkNFQTQ4QjAwOTdEOTMwMjAwOTRDOUU0IC8qIHJlbmRlcl9mb3Jt
LmNwcCBpbiBTb3VyY2VzICovLApAQCAtNzE5Niw3ICs3MjQwLDYgQEAKIAkJCQlCQ0VBNDhCRTA5
N0Q5MzAyMDA5NEM5RTQgLyogcmVuZGVyX29iamVjdC5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlC
Q0VBNDhDMDA5N0Q5MzAyMDA5NEM5RTQgLyogcmVuZGVyX3JlcGxhY2VkLmNwcCBpbiBTb3VyY2Vz
ICovLAogCQkJCUJDRUE0OEMyMDk3RDkzMDIwMDk0QzlFNCAvKiByZW5kZXJfc3R5bGUuY3BwIGlu
IFNvdXJjZXMgKi8sCi0JCQkJQkNFQTQ4QzQwOTdEOTMwMjAwOTRDOUU0IC8qIHJlbmRlcl90YWJs
ZS5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlCQ0VBNDhDNzA5N0Q5MzAyMDA5NEM5RTQgLyogcmVu
ZGVyX3RoZW1lX21hYy5tbSBpbiBTb3VyY2VzICovLAogCQkJCUJDRUE0OEM4MDk3RDkzMDIwMDk0
QzlFNCAvKiByZW5kZXJfdGhlbWUuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJQkNFQTQ4Q0EwOTdE
OTMwMjAwOTRDOUU0IC8qIFJlbmRlclRleHQuY3BwIGluIFNvdXJjZXMgKi8sCkBAIC03MjA4LDYg
KzcyNTEsMTEgQEAKIAkJCQlBOERGM0ZEOTA5N0ZBMEZDMDA1Mjk4MUIgLyogSFRNTENvbGxlY3Rp
b25JbXBsLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUE4REYzRkRCMDk3RkEwRkMwMDUyOTgxQiAv
KiBIVE1MQmFzZUZvbnRFbGVtZW50SW1wbC5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlBOERGM0ZE
RDA5N0ZBMEZDMDA1Mjk4MUIgLyogSFRNTE5hbWVDb2xsZWN0aW9uSW1wbC5jcHAgaW4gU291cmNl
cyAqLywKKwkJCQlBOERGNEFGMjA5ODBDNDJDMDA1Mjk4MUIgLyogUmVuZGVyVGFibGVDb2wuY3Bw
IGluIFNvdXJjZXMgKi8sCisJCQkJQThERjRBRjQwOTgwQzQyQzAwNTI5ODFCIC8qIFJlbmRlclRh
YmxlQ2VsbC5jcHAgaW4gU291cmNlcyAqLywKKwkJCQlBOERGNEFGNjA5ODBDNDJDMDA1Mjk4MUIg
LyogUmVuZGVyVGFibGUuY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJQThERjRBRjcwOTgwQzQyQzAw
NTI5ODFCIC8qIFJlbmRlclRhYmxlU2VjdGlvbi5jcHAgaW4gU291cmNlcyAqLywKKwkJCQlBOERG
NEFGQTA5ODBDNDJDMDA1Mjk4MUIgLyogUmVuZGVyVGFibGVSb3cuY3BwIGluIFNvdXJjZXMgKi8s
CiAJCQkpOwogCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CiAJCX07
CkluZGV4OiBrY2FudmFzL0tDYW52YXNDb250YWluZXIuaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBrY2FudmFz
L0tDYW52YXNDb250YWluZXIuaAkocmV2aXNpb24gMTIyNTMpCisrKyBrY2FudmFzL0tDYW52YXND
b250YWluZXIuaAkod29ya2luZyBjb3B5KQpAQCAtMjQsNyArMjQsNyBAQAogI2RlZmluZSBLQ2Fu
dmFzQ29udGFpbmVyX0gKIAogI2luY2x1ZGUgImtjYW52YXMvUmVuZGVyUGF0aC5oIgotI2luY2x1
ZGUgInJlbmRlcl9jb250YWluZXIuaCIKKyNpbmNsdWRlICJSZW5kZXJDb250YWluZXIuaCIKIAog
dHlwZWRlZiBlbnVtCiB7CkluZGV4OiBrY2FudmFzL1JlbmRlclNWR1RleHQuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBrY2FudmFzL1JlbmRlclNWR1RleHQuaAkocmV2aXNpb24gMTIyNTMpCisrKyBrY2FudmFz
L1JlbmRlclNWR1RleHQuaAkod29ya2luZyBjb3B5KQpAQCAtMjMsNyArMjMsNyBAQAogI2lmbmRl
ZiBSZW5kZXJTVkdUZXh0X0gKICNkZWZpbmUgUmVuZGVyU1ZHVGV4dF9ICiAKLSNpbmNsdWRlICJy
ZW5kZXJfYmxvY2suaCIKKyNpbmNsdWRlICJSZW5kZXJCbG9jay5oIgogI2luY2x1ZGUgPHFtYXRy
aXguaD4KIAogbmFtZXNwYWNlIEtTVkcgewpJbmRleDoga2NhbnZhcy9SZW5kZXJGb3JlaWduT2Jq
ZWN0LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0ga2NhbnZhcy9SZW5kZXJGb3JlaWduT2JqZWN0LmgJKHJldmlz
aW9uIDEyMjUzKQorKysga2NhbnZhcy9SZW5kZXJGb3JlaWduT2JqZWN0LmgJKHdvcmtpbmcgY29w
eSkKQEAgLTIzLDcgKzIzLDcgQEAKICNpZm5kZWYgUmVuZGVyRm9yZWlnbk9iamVjdF9ICiAjZGVm
aW5lIFJlbmRlckZvcmVpZ25PYmplY3RfSAogCi0jaW5jbHVkZSAicmVuZGVyX2Jsb2NrLmgiCisj
aW5jbHVkZSAiUmVuZGVyQmxvY2suaCIKICNpbmNsdWRlIDxxbWF0cml4Lmg+CiAKIG5hbWVzcGFj
ZSBLU1ZHIHsKSW5kZXg6IENoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBDaGFuZ2VMb2cJKHJldmlz
aW9uIDEyMjU1KQorKysgQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNzIgQEAK
IDIwMDYtMDEtMTkgIEVyaWMgU2VpZGVsICA8ZXNlaWRlbEBhcHBsZS5jb20+CiAKKyAgICAgICAg
UmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgQnJlYWsgY2xhc3NlcyBpbiBy
ZW5kZXJfdGFibGUgb3V0IGludG8gc2VwYXJhdGUgZmlsZXMuCisgICAgICAgIE1vdmUgcmVuZGVy
X2Jsb2NrIHRvIFJlbmRlckJsb2NrLgorICAgICAgICBNb3ZlIHJlbmRlcl9jb250YWluZXIgdG8g
UmVuZGVyQ29udGFpbmVyLgorCisgICAgICAgICogV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5w
Ynhwcm9qOgorICAgICAgICAqIGJyaWRnZS9tYWMvTWFjRnJhbWUubW06CisgICAgICAgICoga2Nh
bnZhcy9LQ2FudmFzQ29udGFpbmVyLmg6CisgICAgICAgICoga2NhbnZhcy9SZW5kZXJGb3JlaWdu
T2JqZWN0Lmg6CisgICAgICAgICoga2NhbnZhcy9SZW5kZXJTVkdUZXh0Lmg6CisgICAgICAgICog
a2h0bWwvZWRpdGluZy92aXNpYmxlX3VuaXRzLmNwcDoKKyAgICAgICAgKiBraHRtbC9odG1sL2h0
bWxfdGFibGVpbXBsLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkhUTUxUYWJsZUVsZW1lbnRJbXBs
OjppbnNlcnRSb3cpOgorICAgICAgICAqIGtodG1sL3htbC9kb20yX3JhbmdlaW1wbC5jcHA6Cisg
ICAgICAgICoga2h0bWwveG1sL2RvbV9wb3NpdGlvbi5jcHA6CisgICAgICAgICoga3dxL0tXUVJl
bmRlclRyZWVEZWJ1Zy5jcHA6CisgICAgICAgICogcGFnZS9GcmFtZS5jcHA6CisgICAgICAgICog
cmVuZGVyaW5nL0lubGluZVRleHRCb3guY3BwOgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJC
bG9jay5jcHA6IEFkZGVkLgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJCbG9jay5oOiBBZGRl
ZC4KKyAgICAgICAgKiByZW5kZXJpbmcvUmVuZGVyQ29udGFpbmVyLmNwcDogQWRkZWQuCisgICAg
ICAgIChXZWJDb3JlOjpSZW5kZXJDb250YWluZXI6OmFkZENoaWxkKToKKyAgICAgICAgKiByZW5k
ZXJpbmcvUmVuZGVyQ29udGFpbmVyLmg6IEFkZGVkLgorICAgICAgICAqIHJlbmRlcmluZy9SZW5k
ZXJUYWJsZS5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGFibGU6OlJlbmRl
clRhYmxlKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRhYmxlOjp1cGRhdGVGaXJzdExldHRl
cik6CisgICAgICAgICogcmVuZGVyaW5nL1JlbmRlclRhYmxlLmg6IEFkZGVkLgorICAgICAgICAq
IHJlbmRlcmluZy9SZW5kZXJUYWJsZUNlbGwuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6
OlJlbmRlclRhYmxlQ2VsbDo6UmVuZGVyVGFibGVDZWxsKToKKyAgICAgICAgKFdlYkNvcmU6OlJl
bmRlclRhYmxlQ2VsbDo6dXBkYXRlRnJvbUVsZW1lbnQpOgorICAgICAgICAqIHJlbmRlcmluZy9S
ZW5kZXJUYWJsZUNlbGwuaDogQWRkZWQuCisgICAgICAgICogcmVuZGVyaW5nL1JlbmRlclRhYmxl
Q29sLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUYWJsZUNvbDo6UmVuZGVy
VGFibGVDb2wpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGFibGVDb2w6OnVwZGF0ZUZyb21F
bGVtZW50KToKKyAgICAgICAgKiByZW5kZXJpbmcvUmVuZGVyVGFibGVDb2wuaDogQWRkZWQuCisg
ICAgICAgICogcmVuZGVyaW5nL1JlbmRlclRhYmxlUm93LmNwcDogQWRkZWQuCisgICAgICAgIChX
ZWJDb3JlOjpSZW5kZXJUYWJsZVJvdzo6UmVuZGVyVGFibGVSb3cpOgorICAgICAgICAqIHJlbmRl
cmluZy9SZW5kZXJUYWJsZVJvdy5oOiBBZGRlZC4KKyAgICAgICAgKiByZW5kZXJpbmcvUmVuZGVy
VGFibGVTZWN0aW9uLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUYWJsZVNl
Y3Rpb246OlJlbmRlclRhYmxlU2VjdGlvbik6CisgICAgICAgICogcmVuZGVyaW5nL1JlbmRlclRh
YmxlU2VjdGlvbi5oOiBBZGRlZC4KKyAgICAgICAgKiByZW5kZXJpbmcvUmVuZGVyVGV4dC5jcHA6
CisgICAgICAgICogcmVuZGVyaW5nL2JpZGkuY3BwOgorICAgICAgICAqIHJlbmRlcmluZy9yZW5k
ZXJfYmxvY2suY3BwOiBSZW1vdmVkLgorICAgICAgICAqIHJlbmRlcmluZy9yZW5kZXJfYmxvY2su
aDogUmVtb3ZlZC4KKyAgICAgICAgKiByZW5kZXJpbmcvcmVuZGVyX2JveC5jcHA6CisgICAgICAg
ICogcmVuZGVyaW5nL3JlbmRlcl9jYW52YXMuaDoKKyAgICAgICAgKiByZW5kZXJpbmcvcmVuZGVy
X2NvbnRhaW5lci5jcHA6IFJlbW92ZWQuCisgICAgICAgICogcmVuZGVyaW5nL3JlbmRlcl9jb250
YWluZXIuaDogUmVtb3ZlZC4KKyAgICAgICAgKiByZW5kZXJpbmcvcmVuZGVyX2ZsZXhib3guaDoK
KyAgICAgICAgKiByZW5kZXJpbmcvcmVuZGVyX2Zsb3cuY3BwOgorICAgICAgICAqIHJlbmRlcmlu
Zy9yZW5kZXJfZmxvdy5oOgorICAgICAgICAqIHJlbmRlcmluZy9yZW5kZXJfZm9ybS5oOgorICAg
ICAgICAqIHJlbmRlcmluZy9yZW5kZXJfZnJhbWVzLmg6CisgICAgICAgICogcmVuZGVyaW5nL3Jl
bmRlcl9pbmxpbmUuY3BwOgorICAgICAgICAqIHJlbmRlcmluZy9yZW5kZXJfaW5saW5lLmg6Cisg
ICAgICAgICogcmVuZGVyaW5nL3JlbmRlcl9saW5lLmNwcDoKKyAgICAgICAgKiByZW5kZXJpbmcv
cmVuZGVyX2xpc3QuaDoKKyAgICAgICAgKiByZW5kZXJpbmcvcmVuZGVyX29iamVjdC5jcHA6Cisg
ICAgICAgICogcmVuZGVyaW5nL3JlbmRlcl9yZXBsYWNlZC5oOgorICAgICAgICAqIHJlbmRlcmlu
Zy9yZW5kZXJfdGFibGUuY3BwOiBSZW1vdmVkLgorICAgICAgICAqIHJlbmRlcmluZy9yZW5kZXJf
dGFibGUuaDogUmVtb3ZlZC4KKyAgICAgICAgKiByZW5kZXJpbmcvdGFibGVfbGF5b3V0LmNwcDoK
KworMjAwNi0wMS0xOSAgRXJpYyBTZWlkZWwgIDxlc2VpZGVsQGFwcGxlLmNvbT4KKwogICAgICAg
ICBSZXZpZXdlZCBieSBkYXJpbi4KIAogICAgICAgICA8ZW1iZWQ+IGFuZCA8b2JqZWN0PiB0YWdz
IHNob3cgdXAgYmxhbmsgd2hlbiBnb2luZyBiYWNrL2ZvcndhcmQuCkluZGV4OiBicmlkZ2UvbWFj
L01hY0ZyYW1lLm1tCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGJyaWRnZS9tYWMvTWFjRnJhbWUubW0JKHJldmlz
aW9uIDEyMjUzKQorKysgYnJpZGdlL21hYy9NYWNGcmFtZS5tbQkod29ya2luZyBjb3B5KQpAQCAt
NzAsMTEgKzcwLDEyIEBACiAjaW1wb3J0ICJyZW5kZXJfaW1hZ2UuaCIKICNpbXBvcnQgInJlbmRl
cl9saXN0LmgiCiAjaW1wb3J0ICJyZW5kZXJfc3R5bGUuaCIKLSNpbXBvcnQgInJlbmRlcl90YWJs
ZS5oIgogI2ltcG9ydCAicmVuZGVyX3RoZW1lLmgiCisjaW1wb3J0ICJSZW5kZXJUYWJsZUNlbGwu
aCIKICNpbXBvcnQgInZpc2libGVfcG9zaXRpb24uaCIKICNpbXBvcnQgInZpc2libGVfdGV4dC5o
IgogI2ltcG9ydCAidmlzaWJsZV91bml0cy5oIgorCiAjaW1wb3J0IDxKYXZhU2NyaXB0Q29yZS9O
UF9qc29iamVjdC5oPgogI2ltcG9ydCA8SmF2YVNjcmlwdENvcmUvV2ViU2NyaXB0T2JqZWN0UHJp
dmF0ZS5oPgogI2ltcG9ydCA8SmF2YVNjcmlwdENvcmUvaWRlbnRpZmllci5oPgpJbmRleDoga3dx
L0tXUVJlbmRlclRyZWVEZWJ1Zy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga3dxL0tXUVJlbmRlclRyZWVE
ZWJ1Zy5jcHAJKHJldmlzaW9uIDEyMjUzKQorKysga3dxL0tXUVJlbmRlclRyZWVEZWJ1Zy5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTMyLDcgKzMyLDcgQEAKICNpbmNsdWRlICJGcmFtZVZpZXcuaCIK
ICNpbmNsdWRlICJyZW5kZXJfY2FudmFzLmgiCiAjaW5jbHVkZSAicmVuZGVyX3JlcGxhY2VkLmgi
Ci0jaW5jbHVkZSAicmVuZGVyX3RhYmxlLmgiCisjaW5jbHVkZSAiUmVuZGVyVGFibGVDZWxsLmgi
CiAjaW5jbHVkZSAiSW5saW5lVGV4dEJveC5oIgogI2luY2x1ZGUgInJlbmRlcl9ici5oIgogI2lu
Y2x1ZGUgIlNlbGVjdGlvbkNvbnRyb2xsZXIuaCIKSW5kZXg6IHBhZ2UvRnJhbWUuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIHBhZ2UvRnJhbWUuY3BwCShyZXZpc2lvbiAxMjI1MykKKysrIHBhZ2UvRnJhbWUu
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC02Miw3ICs2Miw3IEBACiAjaW5jbHVkZSAia2pzX3dpbmRv
dy5oIgogI2luY2x1ZGUgImxvYWRlci5oIgogI2luY2x1ZGUgIm1hcmt1cC5oIgotI2luY2x1ZGUg
InJlbmRlcl9ibG9jay5oIgorI2luY2x1ZGUgIlJlbmRlckJsb2NrLmgiCiAjaW5jbHVkZSAicmVu
ZGVyX2NhbnZhcy5oIgogI2luY2x1ZGUgInJlbmRlcl9mcmFtZXMuaCIKICNpbmNsdWRlICJ0eXBp
bmdfY29tbWFuZC5oIgo=
</data>
<flag name="review"
          id="1332"
          type_id="1"
          status="+"
          setter="bdakin"
    />
          </attachment>
      

    </bug>

</bugzilla>