<?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>23506</bug_id>
          
          <creation_ts>2009-01-23 10:39:45 -0800</creation_ts>
          <short_desc>Upstream chromium&apos;s image decoders</short_desc>
          <delta_ts>2009-01-26 12:03:52 -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>Platform</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Darin Fisher (:fishd, Google)">fishd</reporter>
          <assigned_to name="Darin Fisher (:fishd, Google)">fishd</assigned_to>
          
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>106770</commentid>
    <comment_count>0</comment_count>
    <who name="Darin Fisher (:fishd, Google)">fishd</who>
    <bug_when>2009-01-23 10:39:45 -0800</bug_when>
    <thetext>Upstream chromium&apos;s image decoders

From here:
http://src.chromium.org/viewvc/chrome/trunk/deps/third_party/WebKit/WebCore/platform/image-decoders/skia/

My plan is to attach two patches.  The first will copy the existing PNG, JPEG, and GIF decoders.  Then, I will do a subsequent change, which applies our changes as well as adds BMP, ICO, and XBM decoders.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>106771</commentid>
    <comment_count>1</comment_count>
      <attachid>26975</attachid>
    <who name="Darin Fisher (:fishd, Google)">fishd</who>
    <bug_when>2009-01-23 10:41:02 -0800</bug_when>
    <thetext>Created attachment 26975
patch: part 1 - copy existing files</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>106772</commentid>
    <comment_count>2</comment_count>
      <attachid>26975</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-01-23 10:43:23 -0800</bug_when>
    <thetext>Comment on attachment 26975
patch: part 1 - copy existing files

rs=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>106773</commentid>
    <comment_count>3</comment_count>
      <attachid>26976</attachid>
    <who name="Darin Fisher (:fishd, Google)">fishd</who>
    <bug_when>2009-01-23 10:55:56 -0800</bug_when>
    <thetext>Created attachment 26976
patch: part 2 - copy ImageDecoder.h as well</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>106774</commentid>
    <comment_count>4</comment_count>
      <attachid>26977</attachid>
    <who name="Darin Fisher (:fishd, Google)">fishd</who>
    <bug_when>2009-01-23 10:59:23 -0800</bug_when>
    <thetext>Created attachment 26977
patch: part 3 - apply skia changes on top</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>106777</commentid>
    <comment_count>5</comment_count>
      <attachid>26976</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-01-23 11:20:03 -0800</bug_when>
    <thetext>Comment on attachment 26976
patch: part 2 - copy ImageDecoder.h as well

rs=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>106778</commentid>
    <comment_count>6</comment_count>
      <attachid>26977</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-01-23 11:21:55 -0800</bug_when>
    <thetext>Comment on attachment 26977
patch: part 3 - apply skia changes on top

This is a bit hard to review at this size.  It is possible to split out the adds into a new patch?  Or somehow make this one smaller?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>106783</commentid>
    <comment_count>7</comment_count>
      <attachid>26977</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-01-23 12:26:31 -0800</bug_when>
    <thetext>Comment on attachment 26977
patch: part 3 - apply skia changes on top

Gonna rubber stamp this.  I&apos;ve reviewed this already when you submitted it to our local branch.

My understanding of the &quot;grand plan&quot; is that Hyatt was interested in replacing the shared decoders with Chromium&apos;s decoders.  Peter Kasting intends to take care of that merging/replacement work.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>107058</commentid>
    <comment_count>8</comment_count>
    <who name="Darin Fisher (:fishd, Google)">fishd</who>
    <bug_when>2009-01-26 12:03:52 -0800</bug_when>
    <thetext>http://trac.webkit.org/changeset/40165
http://trac.webkit.org/changeset/40166
http://trac.webkit.org/changeset/40173</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>26975</attachid>
            <date>2009-01-23 10:41:02 -0800</date>
            <delta_ts>2009-01-23 10:43:23 -0800</delta_ts>
            <desc>patch: part 1 - copy existing files</desc>
            <filename>im_1.diff</filename>
            <type>text/plain</type>
            <size>102650</size>
            <attacher name="Darin Fisher (:fishd, Google)">fishd</attacher>
            
              <data encoding="base64">SW5kZXg6IENoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBDaGFuZ2VMb2cJKHJldmlzaW9uIDQwMTY0
KQorKysgQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMjAgQEAKKzIwMDktMDEt
MjMgIERhcmluIEZpc2hlciAgPGRhcmluQGNocm9taXVtLm9yZz4KKworICAgICAgICBSZXZpZXdl
ZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9MjM1MDYKKyAgICAgICAgQ29weSBleGlzdGluZyBpbWFnZS1kZWNvZGVy
cyBpbiBwcmVwYXJhdGlvbiBmb3IgbGFuZGluZyBTa2lhIGNoYW5nZXMgb24gdG9wLgorCisgICAg
ICAgICogcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvc2tpYTogQWRkZWQuCisgICAgICAgICogcGxh
dGZvcm0vaW1hZ2UtZGVjb2RlcnMvc2tpYS9HSUZJbWFnZURlY29kZXIuY3BwOiBDb3BpZWQgZnJv
bSBwbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9naWYvR0lGSW1hZ2VEZWNvZGVyLmNwcC4KKyAgICAg
ICAgKiBwbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9za2lhL0dJRkltYWdlRGVjb2Rlci5oOiBDb3Bp
ZWQgZnJvbSBwbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9naWYvR0lGSW1hZ2VEZWNvZGVyLmguCisg
ICAgICAgICogcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvc2tpYS9HSUZJbWFnZVJlYWRlci5jcHA6
IENvcGllZCBmcm9tIHBsYXRmb3JtL2ltYWdlLWRlY29kZXJzL2dpZi9HSUZJbWFnZVJlYWRlci5j
cHAuCisgICAgICAgICogcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvc2tpYS9HSUZJbWFnZVJlYWRl
ci5oOiBDb3BpZWQgZnJvbSBwbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9naWYvR0lGSW1hZ2VSZWFk
ZXIuaC4KKyAgICAgICAgKiBwbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9za2lhL0pQRUdJbWFnZURl
Y29kZXIuY3BwOiBDb3BpZWQgZnJvbSBwbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9qcGVnL0pQRUdJ
bWFnZURlY29kZXIuY3BwLgorICAgICAgICAqIHBsYXRmb3JtL2ltYWdlLWRlY29kZXJzL3NraWEv
SlBFR0ltYWdlRGVjb2Rlci5oOiBDb3BpZWQgZnJvbSBwbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9q
cGVnL0pQRUdJbWFnZURlY29kZXIuaC4KKyAgICAgICAgKiBwbGF0Zm9ybS9pbWFnZS1kZWNvZGVy
cy9za2lhL1BOR0ltYWdlRGVjb2Rlci5jcHA6IENvcGllZCBmcm9tIHBsYXRmb3JtL2ltYWdlLWRl
Y29kZXJzL3BuZy9QTkdJbWFnZURlY29kZXIuY3BwLgorICAgICAgICAqIHBsYXRmb3JtL2ltYWdl
LWRlY29kZXJzL3NraWEvUE5HSW1hZ2VEZWNvZGVyLmg6IENvcGllZCBmcm9tIHBsYXRmb3JtL2lt
YWdlLWRlY29kZXJzL3BuZy9QTkdJbWFnZURlY29kZXIuaC4KKwogMjAwOS0wMS0yMyAgSG9sZ2Vy
IEZyZXl0aGVyICA8emVja2VAc2VsZmlzaC5vcmc+CiAKICAgICAgICAgVW5yZXZpZXdlZCBidWls
ZCBmaXguCkluZGV4OiBwbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9za2lhL0dJRkltYWdlRGVjb2Rl
ci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvc2tpYS9HSUZJbWFn
ZURlY29kZXIuY3BwCShyZXZpc2lvbiA0MDE2NCkJKGZyb20gcGxhdGZvcm0vaW1hZ2UtZGVjb2Rl
cnMvZ2lmL0dJRkltYWdlRGVjb2Rlci5jcHA6NDAxNjQpCisrKyBwbGF0Zm9ybS9pbWFnZS1kZWNv
ZGVycy9za2lhL0dJRkltYWdlRGVjb2Rlci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0
NjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgQXBwbGUgQ29tcHV0ZXIsIEluYy4gIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
SEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRl
ICJHSUZJbWFnZURlY29kZXIuaCIKKyNpbmNsdWRlICJHSUZJbWFnZVJlYWRlci5oIgorCisjaWYg
UExBVEZPUk0oQ0FJUk8pIHx8IFBMQVRGT1JNKFFUKSB8fCBQTEFURk9STShXWCkKKworbmFtZXNw
YWNlIFdlYkNvcmUgeworCitjbGFzcyBHSUZJbWFnZURlY29kZXJQcml2YXRlCit7CitwdWJsaWM6
CisgICAgR0lGSW1hZ2VEZWNvZGVyUHJpdmF0ZShHSUZJbWFnZURlY29kZXIqIGRlY29kZXIgPSAw
KQorICAgICAgICA6IG1fcmVhZGVyKGRlY29kZXIpCisgICAgeworICAgICAgICBtX3JlYWRPZmZz
ZXQgPSAwOworICAgIH0KKworICAgIH5HSUZJbWFnZURlY29kZXJQcml2YXRlKCkKKyAgICB7Cisg
ICAgICAgIG1fcmVhZGVyLmNsb3NlKCk7CisgICAgfQorCisgICAgYm9vbCBkZWNvZGUoY29uc3Qg
VmVjdG9yPGNoYXI+JiBkYXRhLCAKKyAgICAgICAgICAgICAgICBHSUZJbWFnZURlY29kZXI6OkdJ
RlF1ZXJ5IHF1ZXJ5ID0gR0lGSW1hZ2VEZWNvZGVyOjpHSUZGdWxsUXVlcnksCisgICAgICAgICAg
ICAgICAgdW5zaWduZWQgaW50IGhhbHRGcmFtZSA9IC0xKQorICAgIHsKKyAgICAgICAgcmV0dXJu
IG1fcmVhZGVyLnJlYWQoKGNvbnN0IHVuc2lnbmVkIGNoYXIqKWRhdGEuZGF0YSgpICsgbV9yZWFk
T2Zmc2V0LCBkYXRhLnNpemUoKSAtIG1fcmVhZE9mZnNldCwgCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHF1ZXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYWx0RnJhbWUp
OworICAgIH0KKworICAgIHVuc2lnbmVkIGZyYW1lQ291bnQoKSBjb25zdCB7IHJldHVybiBtX3Jl
YWRlci5pbWFnZXNfY291bnQ7IH0KKyAgICBpbnQgcmVwZXRpdGlvbkNvdW50KCkgY29uc3QgeyBy
ZXR1cm4gbV9yZWFkZXIubG9vcF9jb3VudDsgfQorCisgICAgdm9pZCBzZXRSZWFkT2Zmc2V0KHVu
c2lnbmVkIG8pIHsgbV9yZWFkT2Zmc2V0ID0gbzsgfQorCisgICAgYm9vbCBpc1RyYW5zcGFyZW50
KCkgY29uc3QgeyByZXR1cm4gbV9yZWFkZXIuZnJhbWVfcmVhZGVyLT5pc190cmFuc3BhcmVudDsg
fQorCisgICAgdm9pZCBnZXRDb2xvck1hcCh1bnNpZ25lZCBjaGFyKiYgbWFwLCB1bnNpZ25lZCYg
c2l6ZSkgY29uc3QgeworICAgICAgICBpZiAobV9yZWFkZXIuZnJhbWVfcmVhZGVyLT5pc19sb2Nh
bF9jb2xvcm1hcF9kZWZpbmVkKSB7CisgICAgICAgICAgICBtYXAgPSBtX3JlYWRlci5mcmFtZV9y
ZWFkZXItPmxvY2FsX2NvbG9ybWFwOworICAgICAgICAgICAgc2l6ZSA9ICh1bnNpZ25lZCltX3Jl
YWRlci5mcmFtZV9yZWFkZXItPmxvY2FsX2NvbG9ybWFwX3NpemU7CisgICAgICAgIH0gZWxzZSB7
CisgICAgICAgICAgICBtYXAgPSBtX3JlYWRlci5nbG9iYWxfY29sb3JtYXA7CisgICAgICAgICAg
ICBzaXplID0gbV9yZWFkZXIuZ2xvYmFsX2NvbG9ybWFwX3NpemU7CisgICAgICAgIH0KKyAgICB9
CisKKyAgICB1bnNpZ25lZCBmcmFtZVhPZmZzZXQoKSBjb25zdCB7IHJldHVybiBtX3JlYWRlci5m
cmFtZV9yZWFkZXItPnhfb2Zmc2V0OyB9CisgICAgdW5zaWduZWQgZnJhbWVZT2Zmc2V0KCkgY29u
c3QgeyByZXR1cm4gbV9yZWFkZXIuZnJhbWVfcmVhZGVyLT55X29mZnNldDsgfQorICAgIHVuc2ln
bmVkIGZyYW1lV2lkdGgoKSBjb25zdCB7IHJldHVybiBtX3JlYWRlci5mcmFtZV9yZWFkZXItPndp
ZHRoOyB9CisgICAgdW5zaWduZWQgZnJhbWVIZWlnaHQoKSBjb25zdCB7IHJldHVybiBtX3JlYWRl
ci5mcmFtZV9yZWFkZXItPmhlaWdodDsgfQorCisgICAgaW50IHRyYW5zcGFyZW50UGl4ZWwoKSBj
b25zdCB7IHJldHVybiBtX3JlYWRlci5mcmFtZV9yZWFkZXItPnRwaXhlbDsgfQorCisgICAgdW5z
aWduZWQgZHVyYXRpb24oKSBjb25zdCB7IHJldHVybiBtX3JlYWRlci5mcmFtZV9yZWFkZXItPmRl
bGF5X3RpbWU7IH0KKworcHJpdmF0ZToKKyAgICBHSUZJbWFnZVJlYWRlciBtX3JlYWRlcjsKKyAg
ICB1bnNpZ25lZCBtX3JlYWRPZmZzZXQ7Cit9OworCitHSUZJbWFnZURlY29kZXI6OkdJRkltYWdl
RGVjb2RlcigpCis6IG1fZnJhbWVDb3VudFZhbGlkKHRydWUpLCBtX3JlcGV0aXRpb25Db3VudChj
QW5pbWF0aW9uTG9vcE9uY2UpLCBtX3JlYWRlcigwKQore30KKworR0lGSW1hZ2VEZWNvZGVyOjp+
R0lGSW1hZ2VEZWNvZGVyKCkKK3sKKyAgICBkZWxldGUgbV9yZWFkZXI7Cit9CisKKy8vIFRha2Ug
dGhlIGRhdGEgYW5kIHN0b3JlIGl0Lgordm9pZCBHSUZJbWFnZURlY29kZXI6OnNldERhdGEoU2hh
cmVkQnVmZmVyKiBkYXRhLCBib29sIGFsbERhdGFSZWNlaXZlZCkKK3sKKyAgICBpZiAobV9mYWls
ZWQpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIENhY2hlIG91ciBuZXcgZGF0YS4KKyAgICBJ
bWFnZURlY29kZXI6OnNldERhdGEoZGF0YSwgYWxsRGF0YVJlY2VpdmVkKTsKKworICAgIC8vIE91
ciBmcmFtZSBjb3VudCBpcyBub3cgdW5rbm93bi4KKyAgICBtX2ZyYW1lQ291bnRWYWxpZCA9IGZh
bHNlOworCisgICAgLy8gQ3JlYXRlIHRoZSBHSUYgcmVhZGVyLgorICAgIGlmICghbV9yZWFkZXIg
JiYgIW1fZmFpbGVkKQorICAgICAgICBtX3JlYWRlciA9IG5ldyBHSUZJbWFnZURlY29kZXJQcml2
YXRlKHRoaXMpOworfQorCisvLyBXaGV0aGVyIG9yIG5vdCB0aGUgc2l6ZSBpbmZvcm1hdGlvbiBo
YXMgYmVlbiBkZWNvZGVkIHlldC4KK2Jvb2wgR0lGSW1hZ2VEZWNvZGVyOjppc1NpemVBdmFpbGFi
bGUoKSBjb25zdAoreworICAgIC8vIElmIHdlIGhhdmUgcGVuZGluZyBkYXRhIHRvIGRlY29kZSwg
c2VuZCBpdCB0byB0aGUgR0lGIHJlYWRlciBub3cuCisgICAgaWYgKCFtX3NpemVBdmFpbGFibGUg
JiYgbV9yZWFkZXIpIHsKKyAgICAgICAgaWYgKG1fZmFpbGVkKQorICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgICAgIC8vIFRoZSBkZWNvZGVyIHdpbGwgZ28gYWhlYWQgYW5kIGFnZ3Jl
c3NpdmVseSBjb25zdW1lIGV2ZXJ5dGhpbmcgdXAgdW50aWwgdGhlIGZpcnN0CisgICAgICAgIC8v
IHNpemUgaXMgZW5jb3VudGVyZWQuCisgICAgICAgIGRlY29kZShHSUZTaXplUXVlcnksIDApOwor
ICAgIH0KKworICAgIHJldHVybiBtX3NpemVBdmFpbGFibGU7Cit9CisKKy8vIFRoZSB0b3RhbCBu
dW1iZXIgb2YgZnJhbWVzIGZvciB0aGUgaW1hZ2UuICBXaWxsIHNjYW4gdGhlIGltYWdlIGRhdGEg
Zm9yIHRoZSBhbnN3ZXIKKy8vICh3aXRob3V0IG5lY2Vzc2FyaWx5IGRlY29kaW5nIGFsbCBvZiB0
aGUgaW5kaXZpZHVhbCBmcmFtZXMpLgoraW50IEdJRkltYWdlRGVjb2Rlcjo6ZnJhbWVDb3VudCgp
Cit7CisgICAgLy8gSWYgdGhlIGRlY29kZXIgaGFkIGFuIGVhcmxpZXIgZXJyb3IsIHdlIHdpbGwg
anVzdCByZXR1cm4gd2hhdCB3ZSBoYWQgZGVjb2RlZAorICAgIC8vIHNvIGZhci4KKyAgICBpZiAo
IW1fZnJhbWVDb3VudFZhbGlkKSB7CisgICAgICAgIC8vIEZJWE1FOiBTY2FubmluZyBhbGwgdGhl
IGRhdGEgaGFzIE8obl4yKSBiZWhhdmlvciBpZiB0aGUgZGF0YSB3ZXJlIHRvIGNvbWUgaW4gcmVh
bGx5CisgICAgICAgIC8vIHNsb3dseS4gIE1pZ2h0IGJlIGludGVyZXN0aW5nIHRvIHRyeSB0byBj
bG9uZSBvdXIgZXhpc3RpbmcgcmVhZCBzZXNzaW9uIHRvIHByZXNlcnZlCisgICAgICAgIC8vIHN0
YXRlLCBidXQgZm9yIG5vdyB3ZSBqdXN0IGNyYXdsIGFsbCB0aGUgZGF0YS4gIE5vdGUgdGhhdCB0
aGlzIGlzIG5vIHdvcnNlIHRoYW4gd2hhdAorICAgICAgICAvLyBJbWFnZUlPIGRvZXMgb24gTWFj
IHJpZ2h0IG5vdyAoaXQgYWxzbyBjcmF3bHMgYWxsIHRoZSBkYXRhIGFnYWluKS4KKyAgICAgICAg
R0lGSW1hZ2VEZWNvZGVyUHJpdmF0ZSByZWFkZXI7CisgICAgICAgIHJlYWRlci5kZWNvZGUobV9k
YXRhLT5idWZmZXIoKSwgR0lGRnJhbWVDb3VudFF1ZXJ5KTsKKyAgICAgICAgbV9mcmFtZUNvdW50
VmFsaWQgPSB0cnVlOworICAgICAgICBtX2ZyYW1lQnVmZmVyQ2FjaGUucmVzaXplKHJlYWRlci5m
cmFtZUNvdW50KCkpOworICAgIH0KKworICAgIHJldHVybiBtX2ZyYW1lQnVmZmVyQ2FjaGUuc2l6
ZSgpOworfQorCisvLyBUaGUgbnVtYmVyIG9mIHJlcGV0aXRpb25zIHRvIHBlcmZvcm0gZm9yIGFu
IGFuaW1hdGlvbiBsb29wLgoraW50IEdJRkltYWdlRGVjb2Rlcjo6cmVwZXRpdGlvbkNvdW50KCkg
Y29uc3QKK3sKKyAgICAvLyBUaGlzIHZhbHVlIGNhbiBhcnJpdmUgYXQgYW55IHBvaW50IGluIHRo
ZSBpbWFnZSBkYXRhIHN0cmVhbS4gIE1vc3QgR0lGcworICAgIC8vIGluIHRoZSB3aWxkIGRlY2xh
cmUgaXQgbmVhciB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLCBzbyBpdCB1c3VhbGx5IGlzCisg
ICAgLy8gc2V0IGJ5IHRoZSB0aW1lIHdlJ3ZlIGRlY29kZWQgdGhlIHNpemUsIGJ1dCAoZGVwZW5k
aW5nIG9uIHRoZSBHSUYgYW5kIHRoZQorICAgIC8vIHBhY2tldHMgc2VudCBiYWNrIGJ5IHRoZSB3
ZWJzZXJ2ZXIpIG5vdCBhbHdheXMuICBPdXIgY2FsbGVyIGlzCisgICAgLy8gcmVzcG9uc2libGUg
Zm9yIHdhaXRpbmcgdW50aWwgaW1hZ2UgZGVjb2RpbmcgaGFzIGZpbmlzaGVkIHRvIGFzayB0aGlz
IGlmCisgICAgLy8gaXQgbmVlZHMgYW4gYXV0aG9yaXRhdGl2ZSBhbnN3ZXIuICBJbiB0aGUgbWVh
bnRpbWUsIHdlIHNob3VsZCBkZWZhdWx0IHRvCisgICAgLy8gImxvb3Agb25jZSIuCisgICAgaWYg
KG1fcmVhZGVyKSB7CisgICAgICAgIC8vIEFkZGVkIHdyaW5rbGU6IEltYWdlU291cmNlOjpjbGVh
cigpIG1heSBkZXN0cm95IHRoZSByZWFkZXIsIG1ha2luZworICAgICAgICAvLyB0aGUgcmVzdWx0
IGZyb20gdGhlIHJlYWRlciBfbGVzc18gYXV0aG9yaXRhdGl2ZSBvbiBmdXR1cmUgY2FsbHMuICBU
bworICAgICAgICAvLyBkZXRlY3QgdGhpcywgdGhlIHJlYWRlciByZXR1cm5zIGNMb29wQ291bnRO
b3RTZWVuICgtMikgaW5zdGVhZCBvZgorICAgICAgICAvLyBjQW5pbWF0aW9uTG9vcE9uY2UgKC0x
KSB3aGVuIGl0cyBjdXJyZW50IGluY2FybmF0aW9uIGhhc24ndCBhY3R1YWxseQorICAgICAgICAv
LyBzZWVuIGEgbG9vcCBjb3VudCB5ZXQ7IGluIHRoaXMgY2FzZSB3ZSByZXR1cm4gb3VyIHByZXZp
b3VzbHktY2FjaGVkCisgICAgICAgIC8vIHZhbHVlLgorICAgICAgICBjb25zdCBpbnQgcmVwZXRp
dGlvbkNvdW50ID0gbV9yZWFkZXItPnJlcGV0aXRpb25Db3VudCgpOworICAgICAgICBpZiAocmVw
ZXRpdGlvbkNvdW50ICE9IGNMb29wQ291bnROb3RTZWVuKQorICAgICAgICAgICAgbV9yZXBldGl0
aW9uQ291bnQgPSByZXBldGl0aW9uQ291bnQ7CisgICAgfQorICAgIHJldHVybiBtX3JlcGV0aXRp
b25Db3VudDsKK30KKworUkdCQTMyQnVmZmVyKiBHSUZJbWFnZURlY29kZXI6OmZyYW1lQnVmZmVy
QXRJbmRleChzaXplX3QgaW5kZXgpCit7CisgICAgaWYgKGluZGV4ID49IGZyYW1lQ291bnQoKSkK
KyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBSR0JBMzJCdWZmZXImIGZyYW1lID0gbV9mcmFtZUJ1
ZmZlckNhY2hlW2luZGV4XTsKKyAgICBpZiAoZnJhbWUuc3RhdHVzKCkgIT0gUkdCQTMyQnVmZmVy
OjpGcmFtZUNvbXBsZXRlICYmIG1fcmVhZGVyKQorICAgICAgICAvLyBEZWNvZGUgdGhpcyBmcmFt
ZS4KKyAgICAgICAgZGVjb2RlKEdJRkZ1bGxRdWVyeSwgaW5kZXgrMSk7CisgICAgcmV0dXJuICZm
cmFtZTsKK30KKwordm9pZCBHSUZJbWFnZURlY29kZXI6OmNsZWFyRnJhbWVCdWZmZXJDYWNoZShz
aXplX3QgY2xlYXJCZWZvcmVGcmFtZSkKK3sKKyAgICAvLyBJbiBzb21lIGNhc2VzLCBsaWtlIGlm
IHRoZSBkZWNvZGVyIHdhcyBkZXN0cm95ZWQgd2hpbGUgYW5pbWF0aW5nLCB3ZQorICAgIC8vIGNh
biBiZSBhc2tlZCB0byBjbGVhciBtb3JlIGZyYW1lcyB0aGFuIHdlIGN1cnJlbnRseSBoYXZlLgor
ICAgIGlmIChtX2ZyYW1lQnVmZmVyQ2FjaGUuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm47ICAv
LyBOb3RoaW5nIHRvIGRvLgorICAgIC8vIFRoZSAiLTEiIGhlcmUgaXMgdHJpY2t5LiAgSXQgZG9l
cyBub3QgbWVhbiB0aGF0IHxjbGVhckJlZm9yZUZyYW1lfCBpcyB0aGUKKyAgICAvLyBsYXN0IGZy
YW1lIHdlIHdpc2ggdG8gcHJlc2VydmUsIGJ1dCByYXRoZXIgdGhhdCB3ZSBuZXZlciB3YW50IHRv
IGNsZWFyCisgICAgLy8gdGhlIHZlcnkgbGFzdCBmcmFtZSBpbiB0aGUgY2FjaGU6IGl0J3MgZW1w
dHkgKHNvIGNsZWFyaW5nIGl0IGlzCisgICAgLy8gcG9pbnRsZXNzKSwgaXQncyBwYXJ0aWFsIChz
byB3ZSBkb24ndCB3YW50IHRvIGNsZWFyIGl0IGFueXdheSksIG9yIHRoZQorICAgIC8vIGNhY2hl
IGNvdWxkIGJlIGVubGFyZ2VkIHdpdGggYSBmdXR1cmUgc2V0RGF0YSgpIGNhbGwgYW5kIGl0IGNv
dWxkIGJlCisgICAgLy8gbmVlZGVkIHRvIGNvbnN0cnVjdCB0aGUgbmV4dCBmcmFtZSAoc2VlIGNv
bW1lbnRzIGJlbG93KS4gIENhbGxlcnMgY2FuCisgICAgLy8gYWx3YXlzIHVzZSBJbWFnZVNvdXJj
ZTo6Y2xlYXIodHJ1ZSwgLi4uKSB0byBjb21wbGV0ZWx5IGZyZWUgdGhlIG1lbW9yeSBpbgorICAg
IC8vIHRoaXMgY2FzZS4KKyAgICBjbGVhckJlZm9yZUZyYW1lID0gc3RkOjptaW4oY2xlYXJCZWZv
cmVGcmFtZSwgbV9mcmFtZUJ1ZmZlckNhY2hlLnNpemUoKSAtIDEpOworICAgIGNvbnN0IFZlY3Rv
cjxSR0JBMzJCdWZmZXI+OjppdGVyYXRvciBlbmQobV9mcmFtZUJ1ZmZlckNhY2hlLmJlZ2luKCkg
KyBjbGVhckJlZm9yZUZyYW1lKTsKKyAgICBmb3IgKFZlY3RvcjxSR0JBMzJCdWZmZXI+OjppdGVy
YXRvciBpKG1fZnJhbWVCdWZmZXJDYWNoZS5iZWdpbigpKTsgaSAhPSBlbmQ7ICsraSkgeworICAg
ICAgICBpZiAoaS0+c3RhdHVzKCkgPT0gUkdCQTMyQnVmZmVyOjpGcmFtZUVtcHR5KQorICAgICAg
ICAgICAgY29udGludWU7ICAvLyBOb3RoaW5nIHRvIGRvLgorCisgICAgICAgIC8vIFRoZSBsYXlv
dXQgb2YgZnJhbWVzIGlzOgorICAgICAgICAvLyBbZW1wdHkgZnJhbWVzXVtjb21wbGV0ZSBmcmFt
ZXNdW3BhcnRpYWwgZnJhbWVdW2VtcHR5IGZyYW1lc10KKyAgICAgICAgLy8gLi4ud2hlcmUgZWFj
aCBvZiB0aGVzZSBncm91cHMgbWF5IGJlIGVtcHR5LiAgV2Ugc2hvdWxkIG5vdCBjbGVhciBhCisg
ICAgICAgIC8vIHBhcnRpYWwgZnJhbWUgc2luY2UgdGhhdCdzIHdoYXQncyBiZWluZyBkZWNvZGVk
IHJpZ2h0IG5vdywgYW5kIHdlCisgICAgICAgIC8vIGFsc28gc2hvdWxkIG5vdCBjbGVhciB0aGUg
bGFzdCBjb21wbGV0ZSBmcmFtZSwgc2luY2UgaXQgbWF5IGJlIG5lZWRlZAorICAgICAgICAvLyB3
aGVuIGNvbnN0cnVjdGluZyB0aGUgbmV4dCBmcmFtZS4gIE5vdGUgdGhhdCAiaSArIDEiIGlzIHNh
ZmUgc2luY2UKKyAgICAgICAgLy8gaSA8IGVuZCA8IG1fZnJhbWVCdWZmZXJDYWNoZS5lbmQoKS4K
KyAgICAgICAgaWYgKChpLT5zdGF0dXMoKSA9PSBSR0JBMzJCdWZmZXI6OkZyYW1lUGFydGlhbCkg
fHwgKChpICsgMSktPnN0YXR1cygpICE9IFJHQkEzMkJ1ZmZlcjo6RnJhbWVDb21wbGV0ZSkpCisg
ICAgICAgICAgICBicmVhazsKKworICAgICAgICBpLT5jbGVhcigpOworICAgIH0KK30KKworLy8g
RmVlZCBkYXRhIHRvIHRoZSBHSUYgcmVhZGVyLgordm9pZCBHSUZJbWFnZURlY29kZXI6OmRlY29k
ZShHSUZRdWVyeSBxdWVyeSwgdW5zaWduZWQgaGFsdEF0RnJhbWUpIGNvbnN0Cit7CisgICAgaWYg
KG1fZmFpbGVkKQorICAgICAgICByZXR1cm47CisKKyAgICBtX2ZhaWxlZCA9ICFtX3JlYWRlci0+
ZGVjb2RlKG1fZGF0YS0+YnVmZmVyKCksIHF1ZXJ5LCBoYWx0QXRGcmFtZSk7CisgICAgCisgICAg
aWYgKG1fZmFpbGVkKSB7CisgICAgICAgIGRlbGV0ZSBtX3JlYWRlcjsKKyAgICAgICAgbV9yZWFk
ZXIgPSAwOworICAgIH0KK30KKworLy8gQ2FsbGJhY2tzIGZyb20gdGhlIEdJRiByZWFkZXIuCit2
b2lkIEdJRkltYWdlRGVjb2Rlcjo6c2l6ZU5vd0F2YWlsYWJsZSh1bnNpZ25lZCB3aWR0aCwgdW5z
aWduZWQgaGVpZ2h0KQoreworICAgIG1fc2l6ZSA9IEludFNpemUod2lkdGgsIGhlaWdodCk7Cisg
ICAgbV9zaXplQXZhaWxhYmxlID0gdHJ1ZTsKK30KKwordm9pZCBHSUZJbWFnZURlY29kZXI6OmRl
Y29kaW5nSGFsdGVkKHVuc2lnbmVkIGJ5dGVzTGVmdCkKK3sKKyAgICBtX3JlYWRlci0+c2V0UmVh
ZE9mZnNldChtX2RhdGEtPnNpemUoKSAtIGJ5dGVzTGVmdCk7Cit9CisKK3ZvaWQgR0lGSW1hZ2VE
ZWNvZGVyOjppbml0RnJhbWVCdWZmZXIodW5zaWduZWQgZnJhbWVJbmRleCkKK3sKKyAgICAvLyBJ
bml0aWFsaXplIHRoZSBmcmFtZSByZWN0IGluIG91ciBidWZmZXIuCisgICAgSW50UmVjdCBmcmFt
ZVJlY3QobV9yZWFkZXItPmZyYW1lWE9mZnNldCgpLCBtX3JlYWRlci0+ZnJhbWVZT2Zmc2V0KCks
CisgICAgICAgICAgICAgICAgICAgICAgbV9yZWFkZXItPmZyYW1lV2lkdGgoKSwgbV9yZWFkZXIt
PmZyYW1lSGVpZ2h0KCkpOworCisgICAgLy8gTWFrZSBzdXJlIHRoZSBmcmFtZVJlY3QgZG9lc24n
dCBleHRlbmQgcGFzdCB0aGUgYm90dG9tLXJpZ2h0IG9mIHRoZSBidWZmZXIuCisgICAgaWYgKGZy
YW1lUmVjdC5yaWdodCgpID4gbV9zaXplLndpZHRoKCkpCisgICAgICAgIGZyYW1lUmVjdC5zZXRX
aWR0aChtX3NpemUud2lkdGgoKSAtIG1fcmVhZGVyLT5mcmFtZVhPZmZzZXQoKSk7CisgICAgaWYg
KGZyYW1lUmVjdC5ib3R0b20oKSA+IG1fc2l6ZS5oZWlnaHQoKSkKKyAgICAgICAgZnJhbWVSZWN0
LnNldEhlaWdodChtX3NpemUuaGVpZ2h0KCkgLSBtX3JlYWRlci0+ZnJhbWVZT2Zmc2V0KCkpOwor
CisgICAgUkdCQTMyQnVmZmVyKiBjb25zdCBidWZmZXIgPSAmbV9mcmFtZUJ1ZmZlckNhY2hlW2Zy
YW1lSW5kZXhdOworICAgIGJ1ZmZlci0+c2V0UmVjdChmcmFtZVJlY3QpOworICAgIAorICAgIGlm
IChmcmFtZUluZGV4ID09IDApIHsKKyAgICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgZnJhbWUs
IHNvIHdlJ3JlIG5vdCByZWx5aW5nIG9uIGFueSBwcmV2aW91cyBkYXRhLgorICAgICAgICBwcmVw
RW1wdHlGcmFtZUJ1ZmZlcihidWZmZXIpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFRoZSBz
dGFydGluZyBzdGF0ZSBmb3IgdGhpcyBmcmFtZSBkZXBlbmRzIG9uIHRoZSBwcmV2aW91cyBmcmFt
ZSdzCisgICAgICAgIC8vIGRpc3Bvc2FsIG1ldGhvZC4KKyAgICAgICAgLy8KKyAgICAgICAgLy8g
RnJhbWVzIHRoYXQgdXNlIHRoZSBEaXNwb3NlT3ZlcndyaXRlUHJldmlvdXMgbWV0aG9kIGFyZSBl
ZmZlY3RpdmVseQorICAgICAgICAvLyBuby1vcHMgaW4gdGVybXMgb2YgY2hhbmdpbmcgdGhlIHN0
YXJ0aW5nIHN0YXRlIG9mIGEgZnJhbWUgY29tcGFyZWQgdG8KKyAgICAgICAgLy8gdGhlIHN0YXJ0
aW5nIHN0YXRlIG9mIHRoZSBwcmV2aW91cyBmcmFtZSwgc28gc2tpcCBvdmVyIHRoZW0uICAoSWYg
dGhlCisgICAgICAgIC8vIGZpcnN0IGZyYW1lIHNwZWNpZmllcyB0aGlzIG1ldGhvZCwgaXQgd2ls
bCBnZXQgdHJlYXRlZCBsaWtlCisgICAgICAgIC8vIERpc3Bvc2VPdmVyd3JpdGVCZ2NvbG9yIGJl
bG93IGFuZCByZXNldCB0byBhIGNvbXBsZXRlbHkgZW1wdHkgaW1hZ2UuKQorICAgICAgICBjb25z
dCBSR0JBMzJCdWZmZXIqIHByZXZCdWZmZXIgPSAmbV9mcmFtZUJ1ZmZlckNhY2hlWy0tZnJhbWVJ
bmRleF07CisgICAgICAgIEFTU0VSVChwcmV2QnVmZmVyLT5zdGF0dXMoKSA9PSBSR0JBMzJCdWZm
ZXI6OkZyYW1lQ29tcGxldGUpOworICAgICAgICBSR0JBMzJCdWZmZXI6OkZyYW1lRGlzcG9zYWxN
ZXRob2QgcHJldk1ldGhvZCA9CisgICAgICAgICAgICBwcmV2QnVmZmVyLT5kaXNwb3NhbE1ldGhv
ZCgpOworICAgICAgICB3aGlsZSAoKGZyYW1lSW5kZXggPiAwKSAmJgorICAgICAgICAgICAgICAg
IChwcmV2TWV0aG9kID09IFJHQkEzMkJ1ZmZlcjo6RGlzcG9zZU92ZXJ3cml0ZVByZXZpb3VzKSkg
eworICAgICAgICAgICAgcHJldkJ1ZmZlciA9ICZtX2ZyYW1lQnVmZmVyQ2FjaGVbLS1mcmFtZUlu
ZGV4XTsKKyAgICAgICAgICAgIHByZXZNZXRob2QgPSBwcmV2QnVmZmVyLT5kaXNwb3NhbE1ldGhv
ZCgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChwcmV2TWV0aG9kID09IFJHQkEzMkJ1ZmZl
cjo6RGlzcG9zZU5vdFNwZWNpZmllZCkgfHwKKyAgICAgICAgICAgICAgICAocHJldk1ldGhvZCA9
PSBSR0JBMzJCdWZmZXI6OkRpc3Bvc2VLZWVwKSkgeworICAgICAgICAgICAgLy8gUHJlc2VydmUg
dGhlIGxhc3QgZnJhbWUgYXMgdGhlIHN0YXJ0aW5nIHN0YXRlIGZvciB0aGlzIGZyYW1lLgorICAg
ICAgICAgICAgYnVmZmVyLT5ieXRlcygpID0gcHJldkJ1ZmZlci0+Ynl0ZXMoKTsKKyAgICAgICAg
ICAgIGJ1ZmZlci0+c2V0SGFzQWxwaGEocHJldkJ1ZmZlci0+aGFzQWxwaGEoKSk7CisgICAgICAg
IH0gZWxzZSB7CisgICAgICAgICAgICAvLyBXZSB3YW50IHRvIGNsZWFyIHRoZSBwcmV2aW91cyBm
cmFtZSB0byB0cmFuc3BhcmVudCwgd2l0aG91dAorICAgICAgICAgICAgLy8gYWZmZWN0aW5nIHBp
eGVscyBpbiB0aGUgaW1hZ2Ugb3V0c2lkZSBvZiB0aGUgZnJhbWUuCisgICAgICAgICAgICBjb25z
dCBJbnRSZWN0JiBwcmV2UmVjdCA9IHByZXZCdWZmZXItPnJlY3QoKTsKKyAgICAgICAgICAgIGlm
ICgoZnJhbWVJbmRleCA9PSAwKSB8fAorICAgICAgICAgICAgICAgICAgICBwcmV2UmVjdC5jb250
YWlucyhJbnRSZWN0KEludFBvaW50KDAsIDApLCBtX3NpemUpKSkgeworICAgICAgICAgICAgICAg
IC8vIENsZWFyaW5nIHRoZSBmaXJzdCBmcmFtZSwgb3IgYSBmcmFtZSB0aGUgc2l6ZSBvZiB0aGUg
d2hvbGUKKyAgICAgICAgICAgICAgICAvLyBpbWFnZSwgcmVzdWx0cyBpbiBhIGNvbXBsZXRlbHkg
ZW1wdHkgaW1hZ2UuCisgICAgICAgICAgICAgICAgcHJlcEVtcHR5RnJhbWVCdWZmZXIoYnVmZmVy
KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIC8vIENvcHkgdGhlIHdob2xl
IHByZXZpb3VzIGJ1ZmZlciwgdGhlbiBjbGVhciBqdXN0IGl0cyBmcmFtZS4KKyAgICAgICAgICAg
ICAgYnVmZmVyLT5ieXRlcygpID0gcHJldkJ1ZmZlci0+Ynl0ZXMoKTsKKyAgICAgICAgICAgICAg
YnVmZmVyLT5zZXRIYXNBbHBoYShwcmV2QnVmZmVyLT5oYXNBbHBoYSgpKTsKKyAgICAgICAgICAg
ICAgZm9yIChpbnQgeSA9IHByZXZSZWN0LnkoKTsgeSA8IHByZXZSZWN0LmJvdHRvbSgpOyArK3kp
IHsKKyAgICAgICAgICAgICAgICAgIHVuc2lnbmVkKiBjb25zdCBjdXJyZW50Um93ID0KKyAgICAg
ICAgICAgICAgICAgICAgICBidWZmZXItPmJ5dGVzKCkuZGF0YSgpICsgKHkgKiBtX3NpemUud2lk
dGgoKSk7CisgICAgICAgICAgICAgICAgICBmb3IgKGludCB4ID0gcHJldlJlY3QueCgpOyB4IDwg
cHJldlJlY3QucmlnaHQoKTsgKyt4KQorICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+c2V0
UkdCQSgqKGN1cnJlbnRSb3cgKyB4KSwgMCwgMCwgMCwgMCk7CisgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgICAgaWYgKChwcmV2UmVjdC53aWR0aCgpID4gMCkgJiYgKHByZXZSZWN0LmhlaWdo
dCgpID4gMCkpCisgICAgICAgICAgICAgICAgYnVmZmVyLT5zZXRIYXNBbHBoYSh0cnVlKTsKKyAg
ICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFVwZGF0ZSBvdXIgc3RhdHVz
IHRvIGJlIHBhcnRpYWxseSBjb21wbGV0ZS4KKyAgICBidWZmZXItPnNldFN0YXR1cyhSR0JBMzJC
dWZmZXI6OkZyYW1lUGFydGlhbCk7CisKKyAgICAvLyBSZXNldCB0aGUgYWxwaGEgcGl4ZWwgdHJh
Y2tlciBmb3IgdGhpcyBmcmFtZS4KKyAgICBtX2N1cnJlbnRCdWZmZXJTYXdBbHBoYSA9IGZhbHNl
OworfQorCit2b2lkIEdJRkltYWdlRGVjb2Rlcjo6cHJlcEVtcHR5RnJhbWVCdWZmZXIoUkdCQTMy
QnVmZmVyKiBidWZmZXIpIGNvbnN0Cit7CisgICAgYnVmZmVyLT5ieXRlcygpLnJlc2l6ZShtX3Np
emUud2lkdGgoKSAqIG1fc2l6ZS5oZWlnaHQoKSk7CisgICAgYnVmZmVyLT5ieXRlcygpLmZpbGwo
MCk7CisgICAgYnVmZmVyLT5zZXRIYXNBbHBoYSh0cnVlKTsKK30KKwordm9pZCBHSUZJbWFnZURl
Y29kZXI6OmhhdmVEZWNvZGVkUm93KHVuc2lnbmVkIGZyYW1lSW5kZXgsCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciogcm93QnVmZmVyLCAgIC8vIFBv
aW50ZXIgdG8gc2luZ2xlIHNjYW5saW5lIHRlbXBvcmFyeSBidWZmZXIKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiByb3dFbmQsCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgcm93TnVtYmVyLCAgLy8gVGhlIHJv
dyBpbmRleAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHJl
cGVhdENvdW50LCAgLy8gSG93IG1hbnkgdGltZXMgdG8gcmVwZWF0IHRoZSByb3cKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHdyaXRlVHJhbnNwYXJlbnRQaXhlbHMp
Cit7CisgICAgLy8gSW5pdGlhbGl6ZSB0aGUgZnJhbWUgaWYgbmVjZXNzYXJ5LgorICAgIFJHQkEz
MkJ1ZmZlciYgYnVmZmVyID0gbV9mcmFtZUJ1ZmZlckNhY2hlW2ZyYW1lSW5kZXhdOworICAgIGlm
IChidWZmZXIuc3RhdHVzKCkgPT0gUkdCQTMyQnVmZmVyOjpGcmFtZUVtcHR5KQorICAgICAgICBp
bml0RnJhbWVCdWZmZXIoZnJhbWVJbmRleCk7CisKKyAgICAvLyBEbyBub3RoaW5nIGZvciBib2d1
cyBkYXRhLgorICAgIGlmIChyb3dCdWZmZXIgPT0gMCB8fCBzdGF0aWNfY2FzdDxpbnQ+KG1fcmVh
ZGVyLT5mcmFtZVlPZmZzZXQoKSArIHJvd051bWJlcikgPj0gbV9zaXplLmhlaWdodCgpKQorICAg
ICAgcmV0dXJuOworCisgICAgdW5zaWduZWQgY29sb3JNYXBTaXplOworICAgIHVuc2lnbmVkIGNo
YXIqIGNvbG9yTWFwOworICAgIG1fcmVhZGVyLT5nZXRDb2xvck1hcChjb2xvck1hcCwgY29sb3JN
YXBTaXplKTsKKyAgICBpZiAoIWNvbG9yTWFwKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBU
aGUgYnVmZmVycyB0aGF0IHdlIGRyYXcgYXJlIHRoZSBlbnRpcmUgaW1hZ2UncyB3aWR0aCBhbmQg
aGVpZ2h0LCBzbyBhIGZpbmFsIG91dHB1dCBmcmFtZSBpcworICAgIC8vIHdpZHRoICogaGVpZ2h0
IFJHQkEzMiB2YWx1ZXMgaW4gc2l6ZS4KKyAgICAvLworICAgIC8vIEEgc2luZ2xlIEdJRiBmcmFt
ZSwgaG93ZXZlciwgY2FuIGJlIHNtYWxsZXIgdGhhbiB0aGUgZW50aXJlIGltYWdlLCBpLmUuLCBp
dCBjYW4gcmVwcmVzZW50IHNvbWUgc3ViLXJlY3RhbmdsZQorICAgIC8vIHdpdGhpbiB0aGUgb3Zl
cmFsbCBpbWFnZS4gIFRoZSByb3dzIHdlIGFyZSBkZWNvZGluZyBhcmUgd2l0aGluIHRoaXMKKyAg
ICAvLyBzdWItcmVjdGFuZ2xlLiAgVGhpcyBtZWFucyB0aGF0IGlmIHRoZSBHSUYgZnJhbWUncyBz
dWItcmVjdGFuZ2xlIGlzICh4LHksdyxoKSB0aGVuIHJvdyAwIGlzIHJlYWxseSByb3cKKyAgICAv
LyB5LCBhbmQgZWFjaCByb3cgZ29lcyBmcm9tIHggdG8geCt3LgorICAgIHVuc2lnbmVkIGRzdFBv
cyA9IChtX3JlYWRlci0+ZnJhbWVZT2Zmc2V0KCkgKyByb3dOdW1iZXIpICogbV9zaXplLndpZHRo
KCkgKyBtX3JlYWRlci0+ZnJhbWVYT2Zmc2V0KCk7CisgICAgdW5zaWduZWQqIGRzdCA9IGJ1ZmZl
ci5ieXRlcygpLmRhdGEoKSArIGRzdFBvczsKKyAgICB1bnNpZ25lZCogZHN0RW5kID0gZHN0ICsg
bV9zaXplLndpZHRoKCkgLSBtX3JlYWRlci0+ZnJhbWVYT2Zmc2V0KCk7CisgICAgdW5zaWduZWQq
IGN1cnJEc3QgPSBkc3Q7CisgICAgdW5zaWduZWQgY2hhciogY3VycmVudFJvd0J5dGUgPSByb3dC
dWZmZXI7CisgICAgCisgICAgd2hpbGUgKGN1cnJlbnRSb3dCeXRlICE9IHJvd0VuZCAmJiBjdXJy
RHN0IDwgZHN0RW5kKSB7CisgICAgICAgIGlmICgoIW1fcmVhZGVyLT5pc1RyYW5zcGFyZW50KCkg
fHwgKmN1cnJlbnRSb3dCeXRlICE9IG1fcmVhZGVyLT50cmFuc3BhcmVudFBpeGVsKCkpICYmICpj
dXJyZW50Um93Qnl0ZSA8IGNvbG9yTWFwU2l6ZSkgeworICAgICAgICAgICAgdW5zaWduZWQgY29s
b3JJbmRleCA9ICpjdXJyZW50Um93Qnl0ZSAqIDM7CisgICAgICAgICAgICB1bnNpZ25lZCByZWQg
PSBjb2xvck1hcFtjb2xvckluZGV4XTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGdyZWVuID0gY29s
b3JNYXBbY29sb3JJbmRleCArIDFdOworICAgICAgICAgICAgdW5zaWduZWQgYmx1ZSA9IGNvbG9y
TWFwW2NvbG9ySW5kZXggKyAyXTsKKyAgICAgICAgICAgIFJHQkEzMkJ1ZmZlcjo6c2V0UkdCQSgq
Y3VyckRzdCwgcmVkLCBncmVlbiwgYmx1ZSwgMjU1KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAg
ICAgICAgIG1fY3VycmVudEJ1ZmZlclNhd0FscGhhID0gdHJ1ZTsKKyAgICAgICAgICAgIC8vIFdl
IG1heSBvciBtYXkgbm90IG5lZWQgdG8gd3JpdGUgdHJhbnNwYXJlbnQgcGl4ZWxzIHRvIHRoZSBi
dWZmZXIuCisgICAgICAgICAgICAvLyBJZiB3ZSdyZSBjb21wb3NpdGluZyBhZ2FpbnN0IGEgcHJl
dmlvdXMgaW1hZ2UsIGl0J3Mgd3JvbmcsIGFuZCBpZgorICAgICAgICAgICAgLy8gd2UncmUgd3Jp
dGluZyBhdG9wIGEgY2xlYXJlZCwgZnVsbHkgdHJhbnNwYXJlbnQgYnVmZmVyLCBpdCdzCisgICAg
ICAgICAgICAvLyB1bm5lY2Vzc2FyeTsgYnV0IGlmIHdlJ3JlIGRlY29kaW5nIGFuIGludGVybGFj
ZWQgZ2lmIGFuZAorICAgICAgICAgICAgLy8gZGlzcGxheWluZyBpdCAiSGFlYmVybGkiLXN0eWxl
LCB3ZSBtdXN0IHdyaXRlIHRoZXNlIGZvciBwYXNzZXMKKyAgICAgICAgICAgIC8vIGJleW9uZCB0
aGUgZmlyc3QsIG9yIHRoZSBpbml0aWFsIHBhc3NlcyB3aWxsICJzaG93IHRocm91Z2giIHRoZQor
ICAgICAgICAgICAgLy8gbGF0ZXIgb25lcy4KKyAgICAgICAgICAgIGlmICh3cml0ZVRyYW5zcGFy
ZW50UGl4ZWxzKQorICAgICAgICAgICAgICAgIFJHQkEzMkJ1ZmZlcjo6c2V0UkdCQSgqY3VyckRz
dCwgMCwgMCwgMCwgMCk7CisgICAgICAgIH0KKyAgICAgICAgY3VyckRzdCsrOworICAgICAgICBj
dXJyZW50Um93Qnl0ZSsrOworICAgIH0KKworICAgIGlmIChyZXBlYXRDb3VudCA+IDEpIHsKKyAg
ICAgICAgLy8gQ29weSB0aGUgcm93IHxyZXBlYXRDb3VudHwtMSB0aW1lcy4KKyAgICAgICAgdW5z
aWduZWQgbnVtID0gY3VyckRzdCAtIGRzdDsKKyAgICAgICAgdW5zaWduZWQgc2l6ZSA9IG51bSAq
IHNpemVvZih1bnNpZ25lZCk7CisgICAgICAgIHVuc2lnbmVkIHdpZHRoID0gbV9zaXplLndpZHRo
KCk7CisgICAgICAgIHVuc2lnbmVkKiBlbmQgPSBidWZmZXIuYnl0ZXMoKS5kYXRhKCkgKyB3aWR0
aCAqIG1fc2l6ZS5oZWlnaHQoKTsKKyAgICAgICAgY3VyckRzdCA9IGRzdCArIHdpZHRoOworICAg
ICAgICBmb3IgKHVuc2lnbmVkIGkgPSAxOyBpIDwgcmVwZWF0Q291bnQ7IGkrKykgeworICAgICAg
ICAgICAgaWYgKGN1cnJEc3QgKyBudW0gPiBlbmQpIC8vIFByb3RlY3QgYWdhaW5zdCBhIGJ1ZmZl
ciBvdmVycnVuIGZyb20gYSBib2d1cyByZXBlYXRDb3VudC4KKyAgICAgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgICAgIG1lbWNweShjdXJyRHN0LCBkc3QsIHNpemUpOworICAgICAgICAgICAg
Y3VyckRzdCArPSB3aWR0aDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIE91ciBwYXJ0aWFs
IGhlaWdodCBpcyByb3dOdW1iZXIgKyAxLCBlLmcuLCByb3cgMiBpcyB0aGUgM3JkIHJvdywgc28g
dGhhdCdzIGEgaGVpZ2h0IG9mIDMuCisgICAgLy8gQWRkaW5nIGluIHJlcGVhdENvdW50IC0gMSB0
byByb3dOdW1iZXIgKyAxIHdvcmtzIG91dCB0byBqdXN0IGJlIHJvd051bWJlciArIHJlcGVhdENv
dW50LgorICAgIGJ1ZmZlci5lbnN1cmVIZWlnaHQocm93TnVtYmVyICsgcmVwZWF0Q291bnQpOwor
fQorCit2b2lkIEdJRkltYWdlRGVjb2Rlcjo6ZnJhbWVDb21wbGV0ZSh1bnNpZ25lZCBmcmFtZUlu
ZGV4LCB1bnNpZ25lZCBmcmFtZUR1cmF0aW9uLCBSR0JBMzJCdWZmZXI6OkZyYW1lRGlzcG9zYWxN
ZXRob2QgZGlzcG9zYWxNZXRob2QpCit7CisgICAgLy8gSW5pdGlhbGl6ZSB0aGUgZnJhbWUgaWYg
bmVjZXNzYXJ5LiAgU29tZSBHSUZzIGluc2VydCBkby1ub3RoaW5nIGZyYW1lcywKKyAgICAvLyBp
biB3aGljaCBjYXNlIHdlIG5ldmVyIHJlYWNoIGhhdmVEZWNvZGVkUm93KCkgYmVmb3JlIGdldHRp
bmcgaGVyZS4KKyAgICBSR0JBMzJCdWZmZXImIGJ1ZmZlciA9IG1fZnJhbWVCdWZmZXJDYWNoZVtm
cmFtZUluZGV4XTsKKyAgICBpZiAoYnVmZmVyLnN0YXR1cygpID09IFJHQkEzMkJ1ZmZlcjo6RnJh
bWVFbXB0eSkKKyAgICAgICAgaW5pdEZyYW1lQnVmZmVyKGZyYW1lSW5kZXgpOworCisgICAgYnVm
ZmVyLmVuc3VyZUhlaWdodChtX3NpemUuaGVpZ2h0KCkpOworICAgIGJ1ZmZlci5zZXRTdGF0dXMo
UkdCQTMyQnVmZmVyOjpGcmFtZUNvbXBsZXRlKTsKKyAgICBidWZmZXIuc2V0RHVyYXRpb24oZnJh
bWVEdXJhdGlvbik7CisgICAgYnVmZmVyLnNldERpc3Bvc2FsTWV0aG9kKGRpc3Bvc2FsTWV0aG9k
KTsKKworICAgIGlmICghbV9jdXJyZW50QnVmZmVyU2F3QWxwaGEpIHsKKyAgICAgICAgLy8gVGhl
IHdob2xlIGZyYW1lIHdhcyBub24tdHJhbnNwYXJlbnQsIHNvIGl0J3MgcG9zc2libGUgdGhhdCB0
aGUgZW50aXJlCisgICAgICAgIC8vIHJlc3VsdGluZyBidWZmZXIgd2FzIG5vbi10cmFuc3BhcmVu
dCwgYW5kIHdlIGNhbiBzZXRIYXNBbHBoYShmYWxzZSkuCisgICAgICAgIGlmIChidWZmZXIucmVj
dCgpLmNvbnRhaW5zKEludFJlY3QoSW50UG9pbnQoMCwgMCksIG1fc2l6ZSkpKSB7CisgICAgICAg
ICAgICBidWZmZXIuc2V0SGFzQWxwaGEoZmFsc2UpOworICAgICAgICB9IGVsc2UgaWYgKGZyYW1l
SW5kZXggPiAwKSB7CisgICAgICAgICAgICAvLyBUcmlja3kgY2FzZS4gIFRoaXMgZnJhbWUgZG9l
cyBub3QgaGF2ZSBhbHBoYSBvbmx5IGlmIGV2ZXJ5d2hlcmUKKyAgICAgICAgICAgIC8vIG91dHNp
ZGUgaXRzIHJlY3QgZG9lc24ndCBoYXZlIGFscGhhLiAgVG8ga25vdyB3aGV0aGVyIHRoaXMgaXMK
KyAgICAgICAgICAgIC8vIHRydWUsIHdlIGNoZWNrIHRoZSBzdGFydCBzdGF0ZSBvZiB0aGUgZnJh
bWUgLS0gaWYgaXQgZG9lc24ndCBoYXZlCisgICAgICAgICAgICAvLyBhbHBoYSwgd2UncmUgc2Fm
ZS4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBGaXJzdCBza2lwIG92ZXIgcHJpb3Ig
RGlzcG9zZU92ZXJ3cml0ZVByZXZpb3VzIGZyYW1lcyAoc2luY2UgdGhleQorICAgICAgICAgICAg
Ly8gZG9uJ3QgYWZmZWN0IHRoZSBzdGFydCBzdGF0ZSBvZiB0aGlzIGZyYW1lKSB0aGUgc2FtZSB3
YXkgd2UgZG8gaW4KKyAgICAgICAgICAgIC8vIGluaXRGcmFtZUJ1ZmZlcigpLgorICAgICAgICAg
ICAgY29uc3QgUkdCQTMyQnVmZmVyKiBwcmV2QnVmZmVyID0gJm1fZnJhbWVCdWZmZXJDYWNoZVst
LWZyYW1lSW5kZXhdOworICAgICAgICAgICAgd2hpbGUgKChmcmFtZUluZGV4ID4gMCkgJiYKKyAg
ICAgICAgICAgICAgICAgICAgKHByZXZCdWZmZXItPmRpc3Bvc2FsTWV0aG9kKCkgPT0KKyAgICAg
ICAgICAgICAgICAgICAgICAgIFJHQkEzMkJ1ZmZlcjo6RGlzcG9zZU92ZXJ3cml0ZVByZXZpb3Vz
KSkKKyAgICAgICAgICAgICAgICBwcmV2QnVmZmVyID0gJm1fZnJhbWVCdWZmZXJDYWNoZVstLWZy
YW1lSW5kZXhdOworCisgICAgICAgICAgICAvLyBOb3csIGlmIHdlJ3JlIGF0IGEgRGlzcG9zZU5v
dFNwZWNpZmllZCBvciBEaXNwb3NlS2VlcCBmcmFtZSwgdGhlbgorICAgICAgICAgICAgLy8gd2Ug
Y2FuIHNheSB3ZSBoYXZlIG5vIGFscGhhIGlmIHRoYXQgZnJhbWUgaGFkIG5vIGFscGhhLiAgQnV0
CisgICAgICAgICAgICAvLyBzaW5jZSBpbiBpbml0RnJhbWVCdWZmZXIoKSB3ZSBhbHJlYWR5IGNv
cGllZCB0aGF0IGZyYW1lJ3MgYWxwaGEKKyAgICAgICAgICAgIC8vIHN0YXRlIGludG8gdGhlIGN1
cnJlbnQgZnJhbWUncywgd2UgbmVlZCBkbyBub3RoaW5nIGF0IGFsbCBoZXJlLgorICAgICAgICAg
ICAgLy8KKyAgICAgICAgICAgIC8vIFRoZSBvbmx5IHJlbWFpbmluZyBjYXNlIGlzIGEgRGlzcG9z
ZU92ZXJ3cml0ZUJnY29sb3IgZnJhbWUuICBJZgorICAgICAgICAgICAgLy8gaXQgaGFkIG5vIGFs
cGhhLCBhbmQgaXRzIHJlY3QgaXMgY29udGFpbmVkIGluIHRoZSBjdXJyZW50IGZyYW1lJ3MKKyAg
ICAgICAgICAgIC8vIHJlY3QsIHdlIGtub3cgdGhlIGN1cnJlbnQgZnJhbWUgaGFzIG5vIGFscGhh
LgorICAgICAgICAgICAgaWYgKChwcmV2QnVmZmVyLT5kaXNwb3NhbE1ldGhvZCgpID09CisgICAg
ICAgICAgICAgICAgICAgIFJHQkEzMkJ1ZmZlcjo6RGlzcG9zZU92ZXJ3cml0ZUJnY29sb3IpICYm
CisgICAgICAgICAgICAgICAgICAgICFwcmV2QnVmZmVyLT5oYXNBbHBoYSgpICYmCisgICAgICAg
ICAgICAgICAgICAgIGJ1ZmZlci5yZWN0KCkuY29udGFpbnMocHJldkJ1ZmZlci0+cmVjdCgpKSkK
KyAgICAgICAgICAgICAgICBidWZmZXIuc2V0SGFzQWxwaGEoZmFsc2UpOworICAgICAgICB9Cisg
ICAgfQorfQorCit2b2lkIEdJRkltYWdlRGVjb2Rlcjo6Z2lmQ29tcGxldGUoKQoreworICAgIGlm
IChtX3JlYWRlcikKKyAgICAgICAgbV9yZXBldGl0aW9uQ291bnQgPSBtX3JlYWRlci0+cmVwZXRp
dGlvbkNvdW50KCk7CisgICAgZGVsZXRlIG1fcmVhZGVyOworICAgIG1fcmVhZGVyID0gMDsKK30K
KworfQorCisjZW5kaWYgLy8gUExBVEZPUk0oQ0FJUk8pCkluZGV4OiBwbGF0Zm9ybS9pbWFnZS1k
ZWNvZGVycy9za2lhL0dJRkltYWdlRGVjb2Rlci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHBsYXRmb3JtL2lt
YWdlLWRlY29kZXJzL3NraWEvR0lGSW1hZ2VEZWNvZGVyLmgJKHJldmlzaW9uIDQwMTY0KQkoZnJv
bSBwbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9naWYvR0lGSW1hZ2VEZWNvZGVyLmg6NDAxNjQpCisr
KyBwbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9za2lhL0dJRkltYWdlRGVjb2Rlci5oCSh3b3JraW5n
IGNvcHkpCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgQXBwbGUg
Q29tcHV0ZXIsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycg
QU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICog
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgR0lG
X0RFQ09ERVJfSF8KKyNkZWZpbmUgR0lGX0RFQ09ERVJfSF8KKworI2luY2x1ZGUgIkltYWdlRGVj
b2Rlci5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIEdJRkltYWdlRGVjb2RlclBy
aXZhdGU7CisKKy8vIFRoaXMgY2xhc3MgZGVjb2RlcyB0aGUgR0lGIGltYWdlIGZvcm1hdC4KK2Ns
YXNzIEdJRkltYWdlRGVjb2RlciA6IHB1YmxpYyBJbWFnZURlY29kZXIKK3sKK3B1YmxpYzoKKyAg
ICBHSUZJbWFnZURlY29kZXIoKTsKKyAgICB+R0lGSW1hZ2VEZWNvZGVyKCk7CisKKyAgICB2aXJ0
dWFsIFN0cmluZyBmaWxlbmFtZUV4dGVuc2lvbigpIGNvbnN0IHsgcmV0dXJuICJnaWYiOyB9CisK
KyAgICAvLyBUYWtlIHRoZSBkYXRhIGFuZCBzdG9yZSBpdC4KKyAgICB2aXJ0dWFsIHZvaWQgc2V0
RGF0YShTaGFyZWRCdWZmZXIqIGRhdGEsIGJvb2wgYWxsRGF0YVJlY2VpdmVkKTsKKworICAgIC8v
IFdoZXRoZXIgb3Igbm90IHRoZSBzaXplIGluZm9ybWF0aW9uIGhhcyBiZWVuIGRlY29kZWQgeWV0
LgorICAgIHZpcnR1YWwgYm9vbCBpc1NpemVBdmFpbGFibGUoKSBjb25zdDsKKworICAgIC8vIFRo
ZSB0b3RhbCBudW1iZXIgb2YgZnJhbWVzIGZvciB0aGUgaW1hZ2UuICBXaWxsIHNjYW4gdGhlIGlt
YWdlIGRhdGEgZm9yIHRoZSBhbnN3ZXIKKyAgICAvLyAod2l0aG91dCBuZWNlc3NhcmlseSBkZWNv
ZGluZyBhbGwgb2YgdGhlIGluZGl2aWR1YWwgZnJhbWVzKS4KKyAgICB2aXJ0dWFsIGludCBmcmFt
ZUNvdW50KCk7CisKKyAgICAvLyBUaGUgbnVtYmVyIG9mIHJlcGV0aXRpb25zIHRvIHBlcmZvcm0g
Zm9yIGFuIGFuaW1hdGlvbiBsb29wLgorICAgIHZpcnR1YWwgaW50IHJlcGV0aXRpb25Db3VudCgp
IGNvbnN0OworCisgICAgdmlydHVhbCBSR0JBMzJCdWZmZXIqIGZyYW1lQnVmZmVyQXRJbmRleChz
aXplX3QgaW5kZXgpOworCisgICAgdmlydHVhbCB2b2lkIGNsZWFyRnJhbWVCdWZmZXJDYWNoZShz
aXplX3QgY2xlYXJCZWZvcmVGcmFtZSk7CisKKyAgICB2aXJ0dWFsIHVuc2lnbmVkIGZyYW1lRHVy
YXRpb25BdEluZGV4KHNpemVfdCBpbmRleCkgeyByZXR1cm4gMDsgfQorCisgICAgZW51bSBHSUZR
dWVyeSB7IEdJRkZ1bGxRdWVyeSwgR0lGU2l6ZVF1ZXJ5LCBHSUZGcmFtZUNvdW50UXVlcnkgfTsK
KworICAgIHZvaWQgZGVjb2RlKEdJRlF1ZXJ5IHF1ZXJ5LCB1bnNpZ25lZCBoYWx0QXRGcmFtZSkg
Y29uc3Q7CisKKyAgICAvLyBDYWxsYmFja3MgZnJvbSB0aGUgR0lGIHJlYWRlci4KKyAgICB2b2lk
IHNpemVOb3dBdmFpbGFibGUodW5zaWduZWQgd2lkdGgsIHVuc2lnbmVkIGhlaWdodCk7CisgICAg
dm9pZCBkZWNvZGluZ0hhbHRlZCh1bnNpZ25lZCBieXRlc0xlZnQpOworICAgIHZvaWQgaGF2ZURl
Y29kZWRSb3codW5zaWduZWQgZnJhbWVJbmRleCwgdW5zaWduZWQgY2hhciogcm93QnVmZmVyLCB1
bnNpZ25lZCBjaGFyKiByb3dFbmQsIHVuc2lnbmVkIHJvd051bWJlciwgCisgICAgICAgICAgICAg
ICAgICAgICAgICB1bnNpZ25lZCByZXBlYXRDb3VudCwgYm9vbCB3cml0ZVRyYW5zcGFyZW50UGl4
ZWxzKTsKKyAgICB2b2lkIGZyYW1lQ29tcGxldGUodW5zaWduZWQgZnJhbWVJbmRleCwgdW5zaWdu
ZWQgZnJhbWVEdXJhdGlvbiwgUkdCQTMyQnVmZmVyOjpGcmFtZURpc3Bvc2FsTWV0aG9kIGRpc3Bv
c2FsTWV0aG9kKTsKKyAgICB2b2lkIGdpZkNvbXBsZXRlKCk7CisKK3ByaXZhdGU6CisgICAgLy8g
Q2FsbGVkIHRvIGluaXRpYWxpemUgdGhlIGZyYW1lIGJ1ZmZlciB3aXRoIHRoZSBnaXZlbiBpbmRl
eCwgYmFzZWQgb24gdGhlCisgICAgLy8gcHJldmlvdXMgZnJhbWUncyBkaXNwb3NhbCBtZXRob2Qu
CisgICAgdm9pZCBpbml0RnJhbWVCdWZmZXIodW5zaWduZWQgZnJhbWVJbmRleCk7CisKKyAgICAv
LyBBIGhlbHBlciBmb3IgaW5pdEZyYW1lQnVmZmVyKCksIHRoaXMgc2V0cyB0aGUgc2l6ZSBvZiB0
aGUgYnVmZmVyLCBhbmQKKyAgICAvLyBmaWxscyBpdCB3aXRoIHRyYW5zcGFyZW50IHBpeGVscy4K
KyAgICB2b2lkIHByZXBFbXB0eUZyYW1lQnVmZmVyKFJHQkEzMkJ1ZmZlciogYnVmZmVyKSBjb25z
dDsKKworICAgIGJvb2wgbV9mcmFtZUNvdW50VmFsaWQ7CisgICAgYm9vbCBtX2N1cnJlbnRCdWZm
ZXJTYXdBbHBoYTsKKyAgICBtdXRhYmxlIGludCBtX3JlcGV0aXRpb25Db3VudDsKKyAgICBtdXRh
YmxlIEdJRkltYWdlRGVjb2RlclByaXZhdGUqIG1fcmVhZGVyOworfTsKKworfQorCisjZW5kaWYK
SW5kZXg6IHBsYXRmb3JtL2ltYWdlLWRlY29kZXJzL3NraWEvR0lGSW1hZ2VSZWFkZXIuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIHBsYXRmb3JtL2ltYWdlLWRlY29kZXJzL3NraWEvR0lGSW1hZ2VSZWFkZXIu
Y3BwCShyZXZpc2lvbiA0MDE2NCkJKGZyb20gcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvZ2lmL0dJ
RkltYWdlUmVhZGVyLmNwcDo0MDE2NCkKKysrIHBsYXRmb3JtL2ltYWdlLWRlY29kZXJzL3NraWEv
R0lGSW1hZ2VSZWFkZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsOTQzIEBACisvKiAt
Ki0gTW9kZTogQzsgdGFiLXdpZHRoOiAyOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IGMtYmFzaWMt
b2Zmc2V0OiAyIC0qLSAqLworLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgorICog
VmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCisgKgorICogVGhlIGNvbnRlbnRzIG9m
IHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJz
aW9uCisgKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4
Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBh
IGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwor
ICoKKyAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1
dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCisgKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5E
LCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKKyAqIGZvciB0aGUg
c3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIg
dGhlCisgKiBMaWNlbnNlLgorICoKKyAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIG1vemlsbGEub3Jn
IGNvZGUuCisgKgorICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2Rl
IGlzCisgKiBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4KKyAqIFBvcnRpb25z
IGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTgK
KyAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBD
b250cmlidXRvcihzKToKKyAqICAgQ2hyaXMgU2FhcmkgPHNhYXJpQG5ldHNjYXBlLmNvbT4KKyAq
ICAgQXBwbGUgQ29tcHV0ZXIKKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2Yg
dGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogZWl0aGVyIHRoZSBH
TlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiks
IG9yCisgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4x
IG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKKyAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMg
b2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCisgKiBvZiB0aG9z
ZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlz
IGZpbGUgb25seQorICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBM
R1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bworICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0
aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKKyAqIGRl
Y2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0g
d2l0aCB0aGUgbm90aWNlCisgKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUg
R1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQorICogdGhlIHByb3Zpc2lvbnMg
YWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRl
cgorICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQ
TC4KKyAqCisgKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLworCisvKgorVGhlIEdy
YXBoaWNzIEludGVyY2hhbmdlIEZvcm1hdChjKSBpcyB0aGUgY29weXJpZ2h0IHByb3BlcnR5IG9m
IENvbXB1U2VydmUKK0luY29ycG9yYXRlZC4gT25seSBDb21wdVNlcnZlIEluY29ycG9yYXRlZCBp
cyBhdXRob3JpemVkIHRvIGRlZmluZSwgcmVkZWZpbmUsCitlbmhhbmNlLCBhbHRlciwgbW9kaWZ5
IG9yIGNoYW5nZSBpbiBhbnkgd2F5IHRoZSBkZWZpbml0aW9uIG9mIHRoZSBmb3JtYXQuCisKK0Nv
bXB1U2VydmUgSW5jb3Jwb3JhdGVkIGhlcmVieSBncmFudHMgYSBsaW1pdGVkLCBub24tZXhjbHVz
aXZlLCByb3lhbHR5LWZyZWUKK2xpY2Vuc2UgZm9yIHRoZSB1c2Ugb2YgdGhlIEdyYXBoaWNzIElu
dGVyY2hhbmdlIEZvcm1hdChzbSkgaW4gY29tcHV0ZXIKK3NvZnR3YXJlOyBjb21wdXRlciBzb2Z0
d2FyZSB1dGlsaXppbmcgR0lGKHNtKSBtdXN0IGFja25vd2xlZGdlIG93bmVyc2hpcCBvZiB0aGUK
K0dyYXBoaWNzIEludGVyY2hhbmdlIEZvcm1hdCBhbmQgaXRzIFNlcnZpY2UgTWFyayBieSBDb21w
dVNlcnZlIEluY29ycG9yYXRlZCwgaW4KK1VzZXIgYW5kIFRlY2huaWNhbCBEb2N1bWVudGF0aW9u
LiBDb21wdXRlciBzb2Z0d2FyZSB1dGlsaXppbmcgR0lGLCB3aGljaCBpcworZGlzdHJpYnV0ZWQg
b3IgbWF5IGJlIGRpc3RyaWJ1dGVkIHdpdGhvdXQgVXNlciBvciBUZWNobmljYWwgRG9jdW1lbnRh
dGlvbiBtdXN0CitkaXNwbGF5IHRvIHRoZSBzY3JlZW4gb3IgcHJpbnRlciBhIG1lc3NhZ2UgYWNr
bm93bGVkZ2luZyBvd25lcnNoaXAgb2YgdGhlCitHcmFwaGljcyBJbnRlcmNoYW5nZSBGb3JtYXQg
YW5kIHRoZSBTZXJ2aWNlIE1hcmsgYnkgQ29tcHVTZXJ2ZSBJbmNvcnBvcmF0ZWQ7IGluCit0aGlz
IGNhc2UsIHRoZSBhY2tub3dsZWRnZW1lbnQgbWF5IGJlIGRpc3BsYXllZCBpbiBhbiBvcGVuaW5n
IHNjcmVlbiBvciBsZWFkaW5nCitiYW5uZXIsIG9yIGEgY2xvc2luZyBzY3JlZW4gb3IgdHJhaWxp
bmcgYmFubmVyLiBBIG1lc3NhZ2Ugc3VjaCBhcyB0aGUgZm9sbG93aW5nCittYXkgYmUgdXNlZDoK
KworICAgICJUaGUgR3JhcGhpY3MgSW50ZXJjaGFuZ2UgRm9ybWF0KGMpIGlzIHRoZSBDb3B5cmln
aHQgcHJvcGVydHkgb2YKKyAgICBDb21wdVNlcnZlIEluY29ycG9yYXRlZC4gR0lGKHNtKSBpcyBh
IFNlcnZpY2UgTWFyayBwcm9wZXJ0eSBvZgorICAgIENvbXB1U2VydmUgSW5jb3Jwb3JhdGVkLiIK
KworRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24sIHBsZWFzZSBjb250YWN0IDoKKworICAgIENvbXB1
U2VydmUgSW5jb3Jwb3JhdGVkCisgICAgR3JhcGhpY3MgVGVjaG5vbG9neSBEZXBhcnRtZW50Cisg
ICAgNTAwMCBBcmxpbmd0b24gQ2VudGVyIEJvdWxldmFyZAorICAgIENvbHVtYnVzLCBPaGlvICA0
MzIyMAorICAgIFUuIFMuIEEuCisKK0NvbXB1U2VydmUgSW5jb3Jwb3JhdGVkIG1haW50YWlucyBh
IG1haWxpbmcgbGlzdCB3aXRoIGFsbCB0aG9zZSBpbmRpdmlkdWFscyBhbmQKK29yZ2FuaXphdGlv
bnMgd2hvIHdpc2ggdG8gcmVjZWl2ZSBjb3BpZXMgb2YgdGhpcyBkb2N1bWVudCB3aGVuIGl0IGlz
IGNvcnJlY3RlZAorb3IgcmV2aXNlZC4gVGhpcyBzZXJ2aWNlIGlzIG9mZmVyZWQgZnJlZSBvZiBj
aGFyZ2U7IHBsZWFzZSBwcm92aWRlIHVzIHdpdGggeW91cgorbWFpbGluZyBhZGRyZXNzLgorKi8K
KworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkdJRkltYWdlUmVhZGVyLmgiCisKKyNp
bmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJHSUZJbWFnZURlY29kZXIuaCIKKworI2lmIFBM
QVRGT1JNKENBSVJPKSB8fCBQTEFURk9STShRVCkgfHwgUExBVEZPUk0oV1gpCisKK3VzaW5nIFdl
YkNvcmU6OkdJRkltYWdlRGVjb2RlcjsKKworLy8gRGVmaW5lIHRoZSBNb3ppbGxhIG1hY3JvIHNl
dHVwIHNvIHRoYXQgd2UgY2FuIGxlYXZlIHRoZSBtYWNyb3MgYWxvbmUuCisjZGVmaW5lIFBSX0JF
R0lOX01BQ1JPICBkbyB7CisjZGVmaW5lIFBSX0VORF9NQUNSTyAgICB9IHdoaWxlICgwKQorCisv
KgorICogR0VUTihuLCBzKSByZXF1ZXN0cyBhdCBsZWFzdCAnbicgYnl0ZXMgYXZhaWxhYmxlIGZy
b20gJ3EnLCBhdCBzdGFydCBvZiBzdGF0ZSAncycKKyAqCisgKiBOb3RlLCB0aGUgaG9sZCB3aWxs
IG5ldmVyIG5lZWQgdG8gYmUgYmlnZ2VyIHRoYW4gMjU2IGJ5dGVzIHRvIGdhdGhlciB1cCBpbiB0
aGUgaG9sZCwKKyAqIGFzIGVhY2ggR0lGIGJsb2NrIChleGNlcHQgY29sb3JtYXBzKSBjYW4gbmV2
ZXIgYmUgYmlnZ2VyIHRoYW4gMjU2IGJ5dGVzLgorICogQ29sb3JtYXBzIGFyZSBkaXJlY3RseSBj
b3BpZWQgaW4gdGhlIHJlc3AuIGdsb2JhbF9jb2xvcm1hcCBvciBkeW5hbWljYWxseSBhbGxvY2F0
ZWQgbG9jYWxfY29sb3JtYXAuCisgKiBTbyBhIGZpeGVkIGJ1ZmZlciBpbiBHSUZJbWFnZVJlYWRl
ciBpcyBnb29kIGVub3VnaC4KKyAqIFRoaXMgYnVmZmVyIGlzIG9ubHkgbmVlZGVkIHRvIGNvcHkg
bGVmdC1vdmVyIGRhdGEgZnJvbSBvbmUgR2lmV3JpdGUgY2FsbCB0byB0aGUgbmV4dAorICovCisj
ZGVmaW5lIEdFVE4obixzKSAgICAgICAgICAgICAgICAgICAgXAorICBQUl9CRUdJTl9NQUNSTyAg
ICAgICAgICAgICAgICAgICAgIFwKKyAgICBieXRlc190b19jb25zdW1lID0gKG4pOyAgICAgIFwK
KyAgICBzdGF0ZSA9IChzKTsgICAgICAgICAgICAgICAgIFwKKyAgUFJfRU5EX01BQ1JPCisKKy8q
IEdldCBhIDE2LWJpdCB2YWx1ZSBzdG9yZWQgaW4gbGl0dGxlLWVuZGlhbiBmb3JtYXQgKi8KKyNk
ZWZpbmUgR0VUSU5UMTYocCkgICAoKHApWzFdPDw4fChwKVswXSkKKworLy8qKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioKKy8vIFNlbmQgdGhlIGRhdGEgdG8gdGhlIGRpc3BsYXkgZnJvbnQtZW5kLgordm9p
ZCBHSUZJbWFnZVJlYWRlcjo6b3V0cHV0X3JvdygpCit7CisgIEdJRkZyYW1lUmVhZGVyKiBncyA9
IGZyYW1lX3JlYWRlcjsKKworICBpbnQgZHJvd19zdGFydCwgZHJvd19lbmQ7CisKKyAgZHJvd19z
dGFydCA9IGRyb3dfZW5kID0gZ3MtPmlyb3c7CisKKyAgLyoKKyAgICogSGFlYmVybGktaW5zcGly
ZWQgaGFjayBmb3IgaW50ZXJsYWNlZCBHSUZzOiBSZXBsaWNhdGUgbGluZXMgd2hpbGUKKyAgICog
ZGlzcGxheWluZyB0byBkaW1pbmlzaCB0aGUgInZlbmV0aWFuLWJsaW5kIiBlZmZlY3QgYXMgdGhl
IGltYWdlIGlzCisgICAqIGxvYWRlZC4gQWRqdXN0IHBpeGVsIHZlcnRpY2FsIHBvc2l0aW9ucyB0
byBhdm9pZCB0aGUgYXBwZWFyYW5jZSBvZiB0aGUKKyAgICogaW1hZ2UgY3Jhd2xpbmcgdXAgdGhl
IHNjcmVlbiBhcyBzdWNjZXNzaXZlIHBhc3NlcyBhcmUgZHJhd24uCisgICAqLworICBpZiAoZ3Mt
PnByb2dyZXNzaXZlX2Rpc3BsYXkgJiYgZ3MtPmludGVybGFjZWQgJiYgZ3MtPmlwYXNzIDwgNCkg
eworICAgIHVuc2lnbmVkIHJvd19kdXAgPSAwLCByb3dfc2hpZnQgPSAwOworCisgICAgc3dpdGNo
IChncy0+aXBhc3MpIHsKKyAgICBjYXNlIDE6CisgICAgICByb3dfZHVwID0gNzsKKyAgICAgIHJv
d19zaGlmdCA9IDM7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICByb3dfZHVwID0g
MzsKKyAgICAgIHJvd19zaGlmdCA9IDE7CisgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAg
ICByb3dfZHVwID0gMTsKKyAgICAgIHJvd19zaGlmdCA9IDA7CisgICAgICBicmVhazsKKyAgICBk
ZWZhdWx0OgorICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZHJvd19zdGFydCAtPSByb3dfc2hp
ZnQ7CisgICAgZHJvd19lbmQgPSBkcm93X3N0YXJ0ICsgcm93X2R1cDsKKworICAgIC8qIEV4dGVu
ZCBpZiBib3R0b20gZWRnZSBpc24ndCBjb3ZlcmVkIGJlY2F1c2Ugb2YgdGhlIHNoaWZ0IHVwd2Fy
ZC4gKi8KKyAgICBpZiAoKChncy0+aGVpZ2h0IC0gMSkgLSBkcm93X2VuZCkgPD0gcm93X3NoaWZ0
KQorICAgICAgZHJvd19lbmQgPSBncy0+aGVpZ2h0IC0gMTsKKworICAgIC8qIENsYW1wIGZpcnN0
IGFuZCBsYXN0IHJvd3MgdG8gdXBwZXIgYW5kIGxvd2VyIGVkZ2Ugb2YgaW1hZ2UuICovCisgICAg
aWYgKGRyb3dfc3RhcnQgPCAwKQorICAgICAgZHJvd19zdGFydCA9IDA7CisgICAgaWYgKCh1bnNp
Z25lZClkcm93X2VuZCA+PSBncy0+aGVpZ2h0KQorICAgICAgZHJvd19lbmQgPSBncy0+aGVpZ2h0
IC0gMTsKKyAgfQorCisgIC8qIFByb3RlY3QgYWdhaW5zdCB0b28gbXVjaCBpbWFnZSBkYXRhICov
CisgIGlmICgodW5zaWduZWQpZHJvd19zdGFydCA+PSBncy0+aGVpZ2h0KQorICAgIHJldHVybjsK
KworICAvLyBDQUxMQkFDSzogTGV0IHRoZSBjbGllbnQga25vdyB3ZSBoYXZlIGRlY29kZWQgYSBy
b3cuCisgIGlmIChjbGllbnRwdHIgJiYgZnJhbWVfcmVhZGVyKQorICAgIGNsaWVudHB0ci0+aGF2
ZURlY29kZWRSb3coaW1hZ2VzX2NvdW50IC0gMSwgZnJhbWVfcmVhZGVyLT5yb3didWYsIGZyYW1l
X3JlYWRlci0+cm93ZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJvd19zdGFy
dCwgZHJvd19lbmQgLSBkcm93X3N0YXJ0ICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGdzLT5wcm9ncmVzc2l2ZV9kaXNwbGF5ICYmIGdzLT5pbnRlcmxhY2VkICYmIGdzLT5pcGFz
cyA+IDEpOworCisgIGdzLT5yb3dwID0gZ3MtPnJvd2J1ZjsKKworICBpZiAoIWdzLT5pbnRlcmxh
Y2VkKQorICAgIGdzLT5pcm93Kys7CisgIGVsc2UgeworICAgIGRvIHsKKyAgICAgIHN3aXRjaCAo
Z3MtPmlwYXNzKQorICAgICAgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgZ3MtPmlyb3cg
Kz0gODsKKyAgICAgICAgICBpZiAoZ3MtPmlyb3cgPj0gZ3MtPmhlaWdodCkgeworICAgICAgICAg
ICAgZ3MtPmlwYXNzKys7CisgICAgICAgICAgICBncy0+aXJvdyA9IDQ7CisgICAgICAgICAgfQor
ICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICBncy0+aXJvdyAr
PSA4OworICAgICAgICAgIGlmIChncy0+aXJvdyA+PSBncy0+aGVpZ2h0KSB7CisgICAgICAgICAg
ICBncy0+aXBhc3MrKzsKKyAgICAgICAgICAgIGdzLT5pcm93ID0gMjsKKyAgICAgICAgICB9Cisg
ICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgIGdzLT5pcm93ICs9
IDQ7CisgICAgICAgICAgaWYgKGdzLT5pcm93ID49IGdzLT5oZWlnaHQpIHsKKyAgICAgICAgICAg
IGdzLT5pcGFzcysrOworICAgICAgICAgICAgZ3MtPmlyb3cgPSAxOworICAgICAgICAgIH0KKyAg
ICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgZ3MtPmlyb3cgKz0g
MjsKKyAgICAgICAgICBpZiAoZ3MtPmlyb3cgPj0gZ3MtPmhlaWdodCl7CisgICAgICAgICAgICBn
cy0+aXBhc3MrKzsKKyAgICAgICAgICAgIGdzLT5pcm93ID0gMDsKKyAgICAgICAgICB9CisgICAg
ICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBicmVhazsKKyAgICAg
IH0KKyAgICB9IHdoaWxlIChncy0+aXJvdyA+IChncy0+aGVpZ2h0IC0gMSkpOworICB9Cit9CisK
Ky8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqCisvKiBQZXJmb3JtIExlbXBlbC1aaXYtV2VsY2ggZGVj
b2RpbmcgKi8KK2ludCBHSUZJbWFnZVJlYWRlcjo6ZG9fbHp3KGNvbnN0IHVuc2lnbmVkIGNoYXIg
KnEpCit7CisgIEdJRkZyYW1lUmVhZGVyKiBncyA9IGZyYW1lX3JlYWRlcjsKKyAgaWYgKCFncykK
KyAgICByZXR1cm4gMDsKKworICBpbnQgY29kZTsKKyAgaW50IGluY29kZTsKKyAgY29uc3QgdW5z
aWduZWQgY2hhciAqY2g7CisgIAorICAvKiBDb3B5IGFsbCB0aGUgZGVjb2RlciBzdGF0ZSB2YXJp
YWJsZXMgaW50byBsb2NhbHMgc28gdGhlIGNvbXBpbGVyCisgICAqIHdvbid0IHdvcnJ5IGFib3V0
IHRoZW0gYmVpbmcgYWxpYXNlZC4gIFRoZSBsb2NhbHMgd2lsbCBiZSBob21lZAorICAgKiBiYWNr
IGludG8gdGhlIEdJRiBkZWNvZGVyIHN0cnVjdHVyZSB3aGVuIHdlIGV4aXQuCisgICAqLworICBp
bnQgYXZhaWwgICAgICAgPSBncy0+YXZhaWw7CisgIGludCBiaXRzICAgICAgICA9IGdzLT5iaXRz
OworICBpbnQgY250ICAgICAgICAgPSBjb3VudDsKKyAgaW50IGNvZGVzaXplICAgID0gZ3MtPmNv
ZGVzaXplOworICBpbnQgY29kZW1hc2sgICAgPSBncy0+Y29kZW1hc2s7CisgIGludCBvbGRjb2Rl
ICAgICA9IGdzLT5vbGRjb2RlOworICBpbnQgY2xlYXJfY29kZSAgPSBncy0+Y2xlYXJfY29kZTsK
KyAgdW5zaWduZWQgY2hhciBmaXJzdGNoYXIgPSBncy0+Zmlyc3RjaGFyOworICBpbnQgZGF0dW0g
ICAgID0gZ3MtPmRhdHVtOworCisgIGlmICghZ3MtPnByZWZpeCkgeworICAgIGdzLT5wcmVmaXgg
PSBuZXcgdW5zaWduZWQgc2hvcnRbTUFYX0JJVFNdOworICAgIG1lbXNldChncy0+cHJlZml4LCAw
LCBNQVhfQklUUyAqIHNpemVvZihzaG9ydCkpOworICB9CisKKyAgdW5zaWduZWQgc2hvcnQgKnBy
ZWZpeCAgPSBncy0+cHJlZml4OworICB1bnNpZ25lZCBjaGFyICpzdGFja3AgICA9IGdzLT5zdGFj
a3A7CisgIHVuc2lnbmVkIGNoYXIgKnN1ZmZpeCAgID0gZ3MtPnN1ZmZpeDsKKyAgdW5zaWduZWQg
Y2hhciAqc3RhY2sgICAgPSBncy0+c3RhY2s7CisgIHVuc2lnbmVkIGNoYXIgKnJvd3AgICAgID0g
Z3MtPnJvd3A7CisgIHVuc2lnbmVkIGNoYXIgKnJvd2VuZCAgID0gZ3MtPnJvd2VuZDsKKyAgdW5z
aWduZWQgcm93c19yZW1haW5pbmcgPSBncy0+cm93c19yZW1haW5pbmc7CisKKyAgaWYgKHJvd3Ag
PT0gcm93ZW5kKQorICAgIHJldHVybiAwOworCisjZGVmaW5lIE9VVFBVVF9ST1cgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgUFJfQkVHSU5fTUFD
Uk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IFwKKyAgICBvdXRwdXRfcm93KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBcCisgICAgcm93c19yZW1haW5pbmctLTsgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcm93cCA9IGZyYW1lX3Jl
YWRlci0+cm93cDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgXAorICAgIGlmICghcm93c19yZW1haW5pbmcpICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZ290byBFTkQ7ICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBQUl9FTkRfTUFD
Uk8KKworICBmb3IgKGNoID0gcTsgY250LS0gPiAwOyBjaCsrKQorICB7CisgICAgLyogRmVlZCB0
aGUgbmV4dCBieXRlIGludG8gdGhlIGRlY29kZXIncyAzMi1iaXQgaW5wdXQgYnVmZmVyLiAqLwor
ICAgIGRhdHVtICs9ICgoaW50KSAqY2gpIDw8IGJpdHM7CisgICAgYml0cyArPSA4OworCisgICAg
LyogQ2hlY2sgZm9yIHVuZGVyZmxvdyBvZiBkZWNvZGVyJ3MgMzItYml0IGlucHV0IGJ1ZmZlci4g
Ki8KKyAgICB3aGlsZSAoYml0cyA+PSBjb2Rlc2l6ZSkKKyAgICB7CisgICAgICAvKiBHZXQgdGhl
IGxlYWRpbmcgdmFyaWFibGUtbGVuZ3RoIHN5bWJvbCBmcm9tIHRoZSBkYXRhIHN0cmVhbSAqLwor
ICAgICAgY29kZSA9IGRhdHVtICYgY29kZW1hc2s7CisgICAgICBkYXR1bSA+Pj0gY29kZXNpemU7
CisgICAgICBiaXRzIC09IGNvZGVzaXplOworCisgICAgICAvKiBSZXNldCB0aGUgZGljdGlvbmFy
eSB0byBpdHMgb3JpZ2luYWwgc3RhdGUsIGlmIHJlcXVlc3RlZCAqLworICAgICAgaWYgKGNvZGUg
PT0gY2xlYXJfY29kZSkgeworICAgICAgICBjb2Rlc2l6ZSA9IGdzLT5kYXRhc2l6ZSArIDE7Cisg
ICAgICAgIGNvZGVtYXNrID0gKDEgPDwgY29kZXNpemUpIC0gMTsKKyAgICAgICAgYXZhaWwgPSBj
bGVhcl9jb2RlICsgMjsKKyAgICAgICAgb2xkY29kZSA9IC0xOworICAgICAgICBjb250aW51ZTsK
KyAgICAgIH0KKworICAgICAgLyogQ2hlY2sgZm9yIGV4cGxpY2l0IGVuZC1vZi1zdHJlYW0gY29k
ZSAqLworICAgICAgaWYgKGNvZGUgPT0gKGNsZWFyX2NvZGUgKyAxKSkgeworICAgICAgICAvKiBl
bmQtb2Ytc3RyZWFtIHNob3VsZCBvbmx5IGFwcGVhciBhZnRlciBhbGwgaW1hZ2UgZGF0YSAqLwor
ICAgICAgICBpZiAocm93c19yZW1haW5pbmcgIT0gMCkKKyAgICAgICAgICByZXR1cm4gLTE7Cisg
ICAgICAgIHJldHVybiAwOworICAgICAgfQorCisgICAgICBpZiAob2xkY29kZSA9PSAtMSkgewor
ICAgICAgICAqcm93cCsrID0gc3VmZml4W2NvZGVdOworICAgICAgICBpZiAocm93cCA9PSByb3dl
bmQpCisgICAgICAgICAgT1VUUFVUX1JPVzsKKworICAgICAgICBmaXJzdGNoYXIgPSBvbGRjb2Rl
ID0gY29kZTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGluY29kZSA9IGNv
ZGU7CisgICAgICBpZiAoY29kZSA+PSBhdmFpbCkgeworICAgICAgICAqc3RhY2twKysgPSBmaXJz
dGNoYXI7CisgICAgICAgIGNvZGUgPSBvbGRjb2RlOworCisgICAgICAgIGlmIChzdGFja3AgPT0g
c3RhY2sgKyBNQVhfQklUUykKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisKKyAgICAg
IHdoaWxlIChjb2RlID49IGNsZWFyX2NvZGUpCisgICAgICB7CisgICAgICAgIGlmIChjb2RlID09
IHByZWZpeFtjb2RlXSkKKyAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgKnN0YWNrcCsr
ID0gc3VmZml4W2NvZGVdOworICAgICAgICBjb2RlID0gcHJlZml4W2NvZGVdOworCisgICAgICAg
IGlmIChzdGFja3AgPT0gc3RhY2sgKyBNQVhfQklUUykKKyAgICAgICAgICByZXR1cm4gLTE7Cisg
ICAgICB9CisKKyAgICAgICpzdGFja3ArKyA9IGZpcnN0Y2hhciA9IHN1ZmZpeFtjb2RlXTsKKwor
ICAgICAgLyogRGVmaW5lIGEgbmV3IGNvZGV3b3JkIGluIHRoZSBkaWN0aW9uYXJ5LiAqLworICAg
ICAgaWYgKGF2YWlsIDwgNDA5NikgeworICAgICAgICBwcmVmaXhbYXZhaWxdID0gb2xkY29kZTsK
KyAgICAgICAgc3VmZml4W2F2YWlsXSA9IGZpcnN0Y2hhcjsKKyAgICAgICAgYXZhaWwrKzsKKwor
ICAgICAgICAvKiBJZiB3ZSd2ZSB1c2VkIHVwIGFsbCB0aGUgY29kZXdvcmRzIG9mIGEgZ2l2ZW4g
bGVuZ3RoCisgICAgICAgICAqIGluY3JlYXNlIHRoZSBsZW5ndGggb2YgY29kZXdvcmRzIGJ5IG9u
ZSBiaXQsIGJ1dCBkb24ndAorICAgICAgICAgKiBleGNlZWQgdGhlIHNwZWNpZmllZCBtYXhpbXVt
IGNvZGV3b3JkIHNpemUgb2YgMTIgYml0cy4KKyAgICAgICAgICovCisgICAgICAgIGlmICgoKGF2
YWlsICYgY29kZW1hc2spID09IDApICYmIChhdmFpbCA8IDQwOTYpKSB7CisgICAgICAgICAgY29k
ZXNpemUrKzsKKyAgICAgICAgICBjb2RlbWFzayArPSBhdmFpbDsKKyAgICAgICAgfQorICAgICAg
fQorICAgICAgb2xkY29kZSA9IGluY29kZTsKKworICAgICAgICAvKiBDb3B5IHRoZSBkZWNvZGVk
IGRhdGEgb3V0IHRvIHRoZSBzY2FubGluZSBidWZmZXIuICovCisgICAgICBkbyB7CisgICAgICAg
ICpyb3dwKysgPSAqLS1zdGFja3A7CisgICAgICAgIGlmIChyb3dwID09IHJvd2VuZCkgeworICAg
ICAgICAgIE9VVFBVVF9ST1c7CisgICAgICAgIH0KKyAgICAgIH0gd2hpbGUgKHN0YWNrcCA+IHN0
YWNrKTsKKyAgICB9CisgIH0KKworICBFTkQ6CisKKyAgLyogSG9tZSB0aGUgbG9jYWwgY29waWVz
IG9mIHRoZSBHSUYgZGVjb2RlciBzdGF0ZSB2YXJpYWJsZXMgKi8KKyAgZ3MtPmF2YWlsID0gYXZh
aWw7CisgIGdzLT5iaXRzID0gYml0czsKKyAgZ3MtPmNvZGVzaXplID0gY29kZXNpemU7CisgIGdz
LT5jb2RlbWFzayA9IGNvZGVtYXNrOworICBjb3VudCA9IGNudDsKKyAgZ3MtPm9sZGNvZGUgPSBv
bGRjb2RlOworICBncy0+Zmlyc3RjaGFyID0gZmlyc3RjaGFyOworICBncy0+ZGF0dW0gPSBkYXR1
bTsKKyAgZ3MtPnN0YWNrcCA9IHN0YWNrcDsKKyAgZ3MtPnJvd3AgPSByb3dwOworICBncy0+cm93
c19yZW1haW5pbmcgPSByb3dzX3JlbWFpbmluZzsKKworICByZXR1cm4gMDsKK30KKworCisvKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqLworLyoKKyAqIHByb2Nlc3MgZGF0YSBhcnJpdmluZyBmcm9tIHRo
ZSBzdHJlYW0gZm9yIHRoZSBnaWYgZGVjb2RlcgorICovCisKK2Jvb2wgR0lGSW1hZ2VSZWFkZXI6
OnJlYWQoY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25lZCBsZW4sIAorICAgICAgICAg
ICAgICAgICAgICAgR0lGSW1hZ2VEZWNvZGVyOjpHSUZRdWVyeSBxdWVyeSwgdW5zaWduZWQgaGFs
dEF0RnJhbWUpCit7CisgIGlmICghbGVuKSB7CisgICAgLy8gTm8gbmV3IGRhdGEgaGFzIGNvbWUg
aW4gc2luY2UgdGhlIGxhc3QgY2FsbCwganVzdCBpZ25vcmUgdGhpcyBjYWxsLgorICAgIHJldHVy
biB0cnVlOworICB9CisKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqcSA9IGJ1ZjsKKworICAvLyBB
ZGQgd2hhdCB3ZSBoYXZlIHNvIGZhciB0byB0aGUgYmxvY2sKKyAgLy8gSWYgcHJldmlvdXMgY2Fs
bCB0byBtZSBsZWZ0IHNvbWV0aGluZyBpbiB0aGUgaG9sZCBmaXJzdCBjb21wbGV0ZSBjdXJyZW50
IGJsb2NrCisgIC8vIE9yIGlmIHdlIGFyZSBmaWxsaW5nIHRoZSBjb2xvcm1hcHMsIGZpcnN0IGNv
bXBsZXRlIHRoZSBjb2xvcm1hcAorICB1bnNpZ25lZCBjaGFyKiBwID0gMDsKKyAgaWYgKHN0YXRl
ID09IGdpZl9nbG9iYWxfY29sb3JtYXApCisgICAgcCA9IGdsb2JhbF9jb2xvcm1hcDsKKyAgZWxz
ZSBpZiAoc3RhdGUgPT0gZ2lmX2ltYWdlX2NvbG9ybWFwKQorICAgIHAgPSBmcmFtZV9yZWFkZXIg
PyBmcmFtZV9yZWFkZXItPmxvY2FsX2NvbG9ybWFwIDogMDsKKyAgZWxzZSBpZiAoYnl0ZXNfaW5f
aG9sZCkKKyAgICBwID0gaG9sZDsKKyAgZWxzZQorICAgIHAgPSAwOworCisgIGlmIChwIHx8IChz
dGF0ZSA9PSBnaWZfZ2xvYmFsX2NvbG9ybWFwKSB8fCAoc3RhdGUgPT0gZ2lmX2ltYWdlX2NvbG9y
bWFwKSkgeworICAgIC8vIEFkZCB3aGF0IHdlIGhhdmUgc29mYXIgdG8gdGhlIGJsb2NrCisgICAg
dW5zaWduZWQgbCA9IGxlbiA8IGJ5dGVzX3RvX2NvbnN1bWUgPyBsZW4gOiBieXRlc190b19jb25z
dW1lOworICAgIGlmIChwKQorICAgICAgICBtZW1jcHkocCArIGJ5dGVzX2luX2hvbGQsIGJ1Ziwg
bCk7CisKKyAgICBpZiAobCA8IGJ5dGVzX3RvX2NvbnN1bWUpIHsKKyAgICAgIC8vIE5vdCBlbm91
Z2ggaW4gJ2J1ZicgdG8gY29tcGxldGUgY3VycmVudCBibG9jaywgZ2V0IG1vcmUKKyAgICAgIGJ5
dGVzX2luX2hvbGQgKz0gbDsKKyAgICAgIGJ5dGVzX3RvX2NvbnN1bWUgLT0gbDsKKyAgICAgIGlm
IChjbGllbnRwdHIpCisgICAgICAgIGNsaWVudHB0ci0+ZGVjb2RpbmdIYWx0ZWQoMCk7CisgICAg
ICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgLy8gUmVzZXQgaG9sZCBidWZmZXIgY291bnQKKyAg
ICBieXRlc19pbl9ob2xkID0gMDsKKyAgICAvLyBQb2ludCAncScgdG8gY29tcGxldGUgYmxvY2sg
aW4gaG9sZCAob3IgaW4gY29sb3JtYXApCisgICAgcSA9IHA7CisgIH0KKworICAvLyBJbnZhcmlh
bnQ6CisgIC8vICAgICdxJyBpcyBzdGFydCBvZiBjdXJyZW50IHRvIGJlIHByb2Nlc3NlZCBibG9j
ayAoaG9sZCwgY29sb3JtYXAgb3IgYnVmKQorICAvLyAgICAnYnl0ZXNfdG9fY29uc3VtZScgaXMg
bnVtYmVyIG9mIGJ5dGVzIHRvIGNvbnN1bWUgZnJvbSAnYnVmJworICAvLyAgICAnYnVmJyBwb2lu
dHMgdG8gdGhlIGJ5dGVzIHRvIGJlIGNvbnN1bWVkIGZyb20gdGhlIGlucHV0IGJ1ZmZlcgorICAv
LyAgICAnbGVuJyBpcyBudW1iZXIgb2YgYnl0ZXMgbGVmdCBpbiBpbnB1dCBidWZmZXIgZnJvbSBw
b3NpdGlvbiAnYnVmJy4KKyAgLy8gICAgQXQgZW50cmFuY2Ugb2YgdGhlIGZvciBsb29wIHdpbGwg
J2J1Zicgd2lsbCBiZSBtb3ZlZCAnYnl0ZXNfdG9fY29uc3VtZScKKyAgLy8gICAgdG8gcG9pbnQg
dG8gbmV4dCBidWZmZXIsICdsZW4nIGlzIGFkanVzdGVkIGFjY29yZGluZ2x5LgorICAvLyAgICBT
byB0aGF0IG5leHQgcm91bmQgaW4gZm9yIGxvb3AsIHEgZ2V0cyBwb2ludGVkIHRvIHRoZSBuZXh0
IGJ1ZmZlci4KKworICBmb3IgKDtsZW4gPj0gYnl0ZXNfdG9fY29uc3VtZTsgcT1idWYpIHsKKyAg
ICAvLyBFYXQgdGhlIGN1cnJlbnQgYmxvY2sgZnJvbSB0aGUgYnVmZmVyLCBxIGtlZXBzIHBvaW50
ZWQgYXQgY3VycmVudCBibG9jaworICAgIGJ1ZiArPSBieXRlc190b19jb25zdW1lOworICAgIGxl
biAtPSBieXRlc190b19jb25zdW1lOworCisgICAgc3dpdGNoIChzdGF0ZSkKKyAgICB7CisgICAg
Y2FzZSBnaWZfbHp3OgorICAgICAgaWYgKGRvX2x6dyhxKSA8IDApIHsKKyAgICAgICAgc3RhdGUg
PSBnaWZfZXJyb3I7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgR0VUTigxLCBnaWZf
c3ViX2Jsb2NrKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBnaWZfbHp3X3N0YXJ0OgorICAg
IHsKKyAgICAgIC8qIEluaXRpYWxpemUgTFpXIHBhcnNlci9kZWNvZGVyICovCisgICAgICBpbnQg
ZGF0YXNpemUgPSAqcTsKKyAgICAgIGlmIChkYXRhc2l6ZSA+IE1BWF9MWldfQklUUykgeworICAg
ICAgICBzdGF0ZSA9IGdpZl9lcnJvcjsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBp
bnQgY2xlYXJfY29kZSA9IDEgPDwgZGF0YXNpemU7CisgICAgICBpZiAoY2xlYXJfY29kZSA+PSBN
QVhfQklUUykgeworICAgICAgICBzdGF0ZSA9IGdpZl9lcnJvcjsKKyAgICAgICAgYnJlYWs7Cisg
ICAgICB9CisKKyAgICAgIGlmIChmcmFtZV9yZWFkZXIpIHsKKyAgICAgICAgZnJhbWVfcmVhZGVy
LT5kYXRhc2l6ZSA9IGRhdGFzaXplOworICAgICAgICBmcmFtZV9yZWFkZXItPmNsZWFyX2NvZGUg
PSBjbGVhcl9jb2RlOworICAgICAgICBmcmFtZV9yZWFkZXItPmF2YWlsID0gZnJhbWVfcmVhZGVy
LT5jbGVhcl9jb2RlICsgMjsKKyAgICAgICAgZnJhbWVfcmVhZGVyLT5vbGRjb2RlID0gLTE7Cisg
ICAgICAgIGZyYW1lX3JlYWRlci0+Y29kZXNpemUgPSBmcmFtZV9yZWFkZXItPmRhdGFzaXplICsg
MTsKKyAgICAgICAgZnJhbWVfcmVhZGVyLT5jb2RlbWFzayA9ICgxIDw8IGZyYW1lX3JlYWRlci0+
Y29kZXNpemUpIC0gMTsKKworICAgICAgICBmcmFtZV9yZWFkZXItPmRhdHVtID0gZnJhbWVfcmVh
ZGVyLT5iaXRzID0gMDsKKworICAgICAgICAvKiBpbml0IHRoZSB0YWJsZXMgKi8KKyAgICAgICAg
aWYgKCFmcmFtZV9yZWFkZXItPnN1ZmZpeCkKKyAgICAgICAgICBmcmFtZV9yZWFkZXItPnN1ZmZp
eCA9IG5ldyB1bnNpZ25lZCBjaGFyW01BWF9CSVRTXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7
IGkgPCBmcmFtZV9yZWFkZXItPmNsZWFyX2NvZGU7IGkrKykKKyAgICAgICAgICBmcmFtZV9yZWFk
ZXItPnN1ZmZpeFtpXSA9IGk7CisKKyAgICAgICAgaWYgKCFmcmFtZV9yZWFkZXItPnN0YWNrKQor
ICAgICAgICAgIGZyYW1lX3JlYWRlci0+c3RhY2sgPSBuZXcgdW5zaWduZWQgY2hhcltNQVhfQklU
U107CisgICAgICAgIGZyYW1lX3JlYWRlci0+c3RhY2twID0gZnJhbWVfcmVhZGVyLT5zdGFjazsK
KyAgICAgIH0KKworICAgICAgR0VUTigxLCBnaWZfc3ViX2Jsb2NrKTsKKyAgICB9CisgICAgYnJl
YWs7CisKKyAgICAvKiBBbGwgR0lGIGZpbGVzIGJlZ2luIHdpdGggIkdJRjg3YSIgb3IgIkdJRjg5
YSIgKi8KKyAgICBjYXNlIGdpZl90eXBlOgorICAgIHsKKyAgICAgIGlmICghc3RybmNtcCgoY2hh
ciopcSwgIkdJRjg5YSIsIDYpKSB7CisgICAgICAgIHZlcnNpb24gPSA4OTsKKyAgICAgIH0gZWxz
ZSBpZiAoIXN0cm5jbXAoKGNoYXIqKXEsICJHSUY4N2EiLCA2KSkgeworICAgICAgICB2ZXJzaW9u
ID0gODc7CisgICAgICB9IGVsc2UgeworICAgICAgICBzdGF0ZSA9IGdpZl9lcnJvcjsKKyAgICAg
ICAgYnJlYWs7CisgICAgICB9CisgICAgICBHRVROKDcsIGdpZl9nbG9iYWxfaGVhZGVyKTsKKyAg
ICB9CisgICAgYnJlYWs7CisKKyAgICBjYXNlIGdpZl9nbG9iYWxfaGVhZGVyOgorICAgIHsKKyAg
ICAgIC8qIFRoaXMgaXMgdGhlIGhlaWdodCBhbmQgd2lkdGggb2YgdGhlICJzY3JlZW4iIG9yCisg
ICAgICAgKiBmcmFtZSBpbnRvIHdoaWNoIGltYWdlcyBhcmUgcmVuZGVyZWQuICBUaGUKKyAgICAg
ICAqIGluZGl2aWR1YWwgaW1hZ2VzIGNhbiBiZSBzbWFsbGVyIHRoYW4gdGhlCisgICAgICAgKiBz
Y3JlZW4gc2l6ZSBhbmQgbG9jYXRlZCB3aXRoIGFuIG9yaWdpbiBhbnl3aGVyZQorICAgICAgICog
d2l0aGluIHRoZSBzY3JlZW4uCisgICAgICAgKi8KKworICAgICAgc2NyZWVuX3dpZHRoID0gR0VU
SU5UMTYocSk7CisgICAgICBzY3JlZW5faGVpZ2h0ID0gR0VUSU5UMTYocSArIDIpOworCisgICAg
ICAvLyBDQUxMQkFDSzogSW5mb3JtIHRoZSBkZWNvZGVycGx1Z2luIG9mIG91ciBzaXplLgorICAg
ICAgaWYgKGNsaWVudHB0cikKKyAgICAgICAgY2xpZW50cHRyLT5zaXplTm93QXZhaWxhYmxlKHNj
cmVlbl93aWR0aCwgc2NyZWVuX2hlaWdodCk7CisgICAgICAKKyAgICAgIHNjcmVlbl9iZ2NvbG9y
ID0gcVs1XTsKKyAgICAgIGdsb2JhbF9jb2xvcm1hcF9zaXplID0gMjw8KHFbNF0mMHgwNyk7CisK
KyAgICAgIGlmICgocVs0XSAmIDB4ODApICYmIGdsb2JhbF9jb2xvcm1hcF9zaXplID4gMCkgeyAv
KiBnbG9iYWwgbWFwICovCisgICAgICAgIC8vIEdldCB0aGUgZ2xvYmFsIGNvbG9ybWFwCisgICAg
ICAgIGNvbnN0IHVuc2lnbmVkIHNpemUgPSAzKmdsb2JhbF9jb2xvcm1hcF9zaXplOworICAgICAg
ICAKKyAgICAgICAgLy8gTWFsbG9jIHRoZSBjb2xvciBtYXAsIGJ1dCBvbmx5IGlmIHdlJ3JlIG5v
dCBqdXN0IGNvdW50aW5nIGZyYW1lcy4KKyAgICAgICAgaWYgKHF1ZXJ5ICE9IEdJRkltYWdlRGVj
b2Rlcjo6R0lGRnJhbWVDb3VudFF1ZXJ5KQorICAgICAgICAgIGdsb2JhbF9jb2xvcm1hcCA9IG5l
dyB1bnNpZ25lZCBjaGFyW3NpemVdOworCisgICAgICAgIGlmIChsZW4gPCBzaXplKSB7CisgICAg
ICAgICAgLy8gVXNlICdob2xkJyBwYXR0ZXJuIHRvIGdldCB0aGUgZ2xvYmFsIGNvbG9ybWFwCisg
ICAgICAgICAgR0VUTihzaXplLCBnaWZfZ2xvYmFsX2NvbG9ybWFwKTsKKyAgICAgICAgICBicmVh
azsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gQ29weSBldmVyeXRoaW5nIGFuZCBn
byBkaXJlY3RseSB0byBnaWZfaW1hZ2Vfc3RhcnQuCisgICAgICAgIGlmIChnbG9iYWxfY29sb3Jt
YXApCisgICAgICAgICAgICBtZW1jcHkoZ2xvYmFsX2NvbG9ybWFwLCBidWYsIHNpemUpOworICAg
ICAgICBidWYgKz0gc2l6ZTsKKyAgICAgICAgbGVuIC09IHNpemU7CisgICAgICB9CisKKyAgICAg
IEdFVE4oMSwgZ2lmX2ltYWdlX3N0YXJ0KTsKKworICAgICAgLy8gcVs2XSA9IFBpeGVsIEFzcGVj
dCBSYXRpbworICAgICAgLy8gICBOb3QgdXNlZAorICAgICAgLy8gICBmbG9hdCBhc3BlY3QgPSAo
ZmxvYXQpKChxWzZdICsgMTUpIC8gNjQuMCk7CisgICAgfQorICAgIGJyZWFrOworCisgICAgY2Fz
ZSBnaWZfZ2xvYmFsX2NvbG9ybWFwOgorICAgICAgLy8gRXZlcnl0aGluZyBpcyBhbHJlYWR5IGNv
cGllZCBpbnRvIGdsb2JhbF9jb2xvcm1hcAorICAgICAgR0VUTigxLCBnaWZfaW1hZ2Vfc3RhcnQp
OworICAgIGJyZWFrOworCisgICAgY2FzZSBnaWZfaW1hZ2Vfc3RhcnQ6CisgICAgeworICAgICAg
aWYgKCpxID09ICc7JykgeyAvKiB0ZXJtaW5hdG9yICovCisgICAgICAgIHN0YXRlID0gZ2lmX2Rv
bmU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBpZiAoKnEgPT0gJyEnKSB7IC8q
IGV4dGVuc2lvbiAqLworICAgICAgICBHRVROKDIsIGdpZl9leHRlbnNpb24pOworICAgICAgICBi
cmVhazsKKyAgICAgIH0KKworICAgICAgLyogSWYgd2UgZ2V0IGFueXRoaW5nIG90aGVyIHRoYW4g
JywnIChpbWFnZSBzZXBhcmF0b3IpLCAnIScKKyAgICAgICAqIChleHRlbnNpb24pLCBvciAnOycg
KHRyYWlsZXIpLCB0aGVyZSBpcyBleHRyYW5lb3VzIGRhdGEKKyAgICAgICAqIGJldHdlZW4gYmxv
Y2tzLiBUaGUgR0lGODdhIHNwZWMgdGVsbHMgdXMgdG8ga2VlcCByZWFkaW5nCisgICAgICAgKiB1
bnRpbCB3ZSBmaW5kIGFuIGltYWdlIHNlcGFyYXRvciwgYnV0IEdJRjg5YSBzYXlzIHN1Y2gKKyAg
ICAgICAqIGEgZmlsZSBpcyBjb3JydXB0LiBXZSBmb2xsb3cgR0lGODlhIGFuZCBiYWlsIG91dC4g
Ki8KKyAgICAgIGlmICgqcSAhPSAnLCcpIHsKKyAgICAgICAgaWYgKGltYWdlc19kZWNvZGVkID4g
MCkgeworICAgICAgICAgIC8qIFRoZSBmaWxlIGlzIGNvcnJ1cHQsIGJ1dCBvbmUgb3IgbW9yZSBp
bWFnZXMgaGF2ZQorICAgICAgICAgICAqIGJlZW4gZGVjb2RlZCBjb3JyZWN0bHkuIEluIHRoaXMg
Y2FzZSwgd2UgcHJvY2VlZAorICAgICAgICAgICAqIGFzIGlmIHRoZSBmaWxlIHdlcmUgY29ycmVj
dGx5IHRlcm1pbmF0ZWQgYW5kIHNldAorICAgICAgICAgICAqIHRoZSBzdGF0ZSB0byBnaWZfZG9u
ZSwgc28gdGhlIEdJRiB3aWxsIGRpc3BsYXkuCisgICAgICAgICAgICovCisgICAgICAgICAgc3Rh
dGUgPSBnaWZfZG9uZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvKiBObyBpbWFnZXMg
ZGVjb2RlZCwgdGhlcmUgaXMgbm90aGluZyB0byBkaXNwbGF5LiAqLworICAgICAgICAgIHN0YXRl
ID0gZ2lmX2Vycm9yOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfSBlbHNlCisg
ICAgICAgIEdFVE4oOSwgZ2lmX2ltYWdlX2hlYWRlcik7CisgICAgfQorICAgIGJyZWFrOworCisg
ICAgY2FzZSBnaWZfZXh0ZW5zaW9uOgorICAgIHsKKyAgICAgIGludCBsZW4gPSBjb3VudCA9IHFb
MV07CisgICAgICBnc3RhdGUgZXMgPSBnaWZfc2tpcF9ibG9jazsKKworICAgICAgc3dpdGNoICgq
cSkKKyAgICAgIHsKKyAgICAgIGNhc2UgMHhmOToKKyAgICAgICAgZXMgPSBnaWZfY29udHJvbF9l
eHRlbnNpb247CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDB4MDE6CisgICAgICAgIC8v
IGlnbm9yaW5nIHBsYWluIHRleHQgZXh0ZW5zaW9uCisgICAgICAgIGJyZWFrOworCisgICAgICBj
YXNlIDB4ZmY6CisgICAgICAgIGVzID0gZ2lmX2FwcGxpY2F0aW9uX2V4dGVuc2lvbjsKKyAgICAg
ICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMHhmZToKKyAgICAgICAgZXMgPSBnaWZfY29uc3VtZV9j
b21tZW50OworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgaWYgKGxlbikKKyAgICAg
ICAgR0VUTihsZW4sIGVzKTsKKyAgICAgIGVsc2UKKyAgICAgICAgR0VUTigxLCBnaWZfaW1hZ2Vf
c3RhcnQpOworICAgIH0KKyAgICBicmVhazsKKworICAgIGNhc2UgZ2lmX2NvbnN1bWVfYmxvY2s6
CisgICAgICBpZiAoISpxKQorICAgICAgICBHRVROKDEsIGdpZl9pbWFnZV9zdGFydCk7CisgICAg
ICBlbHNlCisgICAgICAgIEdFVE4oKnEsIGdpZl9za2lwX2Jsb2NrKTsKKyAgICBicmVhazsKKwor
ICAgIGNhc2UgZ2lmX3NraXBfYmxvY2s6CisgICAgICBHRVROKDEsIGdpZl9jb25zdW1lX2Jsb2Nr
KTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBnaWZfY29udHJvbF9leHRlbnNpb246CisgICAg
eworICAgICAgaWYgKHF1ZXJ5ICE9IEdJRkltYWdlRGVjb2Rlcjo6R0lGRnJhbWVDb3VudFF1ZXJ5
KSB7CisgICAgICAgICAgaWYgKCFmcmFtZV9yZWFkZXIpCisgICAgICAgICAgICBmcmFtZV9yZWFk
ZXIgPSBuZXcgR0lGRnJhbWVSZWFkZXIoKTsKKyAgICAgIH0KKworICAgICAgaWYgKGZyYW1lX3Jl
YWRlcikgeworICAgICAgICBpZiAoKnEgJiAweDEpIHsKKyAgICAgICAgICBmcmFtZV9yZWFkZXIt
PnRwaXhlbCA9IHFbM107CisgICAgICAgICAgZnJhbWVfcmVhZGVyLT5pc190cmFuc3BhcmVudCA9
IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZnJhbWVfcmVhZGVyLT5pc190cmFu
c3BhcmVudCA9IGZhbHNlOworICAgICAgICAgIC8vIGlnbm9yaW5nIGdmeCBjb250cm9sIGV4dGVu
c2lvbgorICAgICAgICB9CisgICAgICAgIC8vIE5PVEU6IFRoaXMgcmVsaWVzIG9uIHRoZSB2YWx1
ZXMgaW4gdGhlIEZyYW1lRGlzcG9zYWxNZXRob2QgZW51bQorICAgICAgICAvLyBtYXRjaGluZyB0
aG9zZSBpbiB0aGUgR0lGIHNwZWMhCisgICAgICAgIGZyYW1lX3JlYWRlci0+ZGlzcG9zYWxfbWV0
aG9kID0gKFdlYkNvcmU6OlJHQkEzMkJ1ZmZlcjo6RnJhbWVEaXNwb3NhbE1ldGhvZCkoKCgqcSkg
Pj4gMikgJiAweDcpOworICAgICAgICAvLyBTb21lIHNwZWNzIHNheSAzcmQgYml0ICh2YWx1ZSA0
KSwgb3RoZXIgc3BlY3Mgc2F5IHZhbHVlIDMKKyAgICAgICAgLy8gTGV0J3MgY2hvb3NlIDMgKHRo
ZSBtb3JlIHBvcHVsYXIpCisgICAgICAgIGlmIChmcmFtZV9yZWFkZXItPmRpc3Bvc2FsX21ldGhv
ZCA9PSA0KQorICAgICAgICAgIGZyYW1lX3JlYWRlci0+ZGlzcG9zYWxfbWV0aG9kID0gV2ViQ29y
ZTo6UkdCQTMyQnVmZmVyOjpEaXNwb3NlT3ZlcndyaXRlUHJldmlvdXM7CisgICAgICAgIGZyYW1l
X3JlYWRlci0+ZGVsYXlfdGltZSA9IEdFVElOVDE2KHEgKyAxKSAqIDEwOworICAgICAgfQorICAg
ICAgR0VUTigxLCBnaWZfY29uc3VtZV9ibG9jayk7CisgICAgfQorICAgIGJyZWFrOworCisgICAg
Y2FzZSBnaWZfY29tbWVudF9leHRlbnNpb246CisgICAgeworICAgICAgaWYgKCpxKQorICAgICAg
ICBHRVROKCpxLCBnaWZfY29uc3VtZV9jb21tZW50KTsKKyAgICAgIGVsc2UKKyAgICAgICAgR0VU
TigxLCBnaWZfaW1hZ2Vfc3RhcnQpOworICAgIH0KKyAgICBicmVhazsKKworICAgIGNhc2UgZ2lm
X2NvbnN1bWVfY29tbWVudDoKKyAgICAgIEdFVE4oMSwgZ2lmX2NvbW1lbnRfZXh0ZW5zaW9uKTsK
KyAgICBicmVhazsKKworICAgIGNhc2UgZ2lmX2FwcGxpY2F0aW9uX2V4dGVuc2lvbjoKKyAgICAg
IC8qIENoZWNrIGZvciBuZXRzY2FwZSBhcHBsaWNhdGlvbiBleHRlbnNpb24gKi8KKyAgICAgIGlm
ICghc3RybmNtcCgoY2hhciopcSwgIk5FVFNDQVBFMi4wIiwgMTEpIHx8CisgICAgICAgICFzdHJu
Y21wKChjaGFyKilxLCAiQU5JTUVYVFMxLjAiLCAxMSkpCisgICAgICAgIEdFVE4oMSwgZ2lmX25l
dHNjYXBlX2V4dGVuc2lvbl9ibG9jayk7CisgICAgICBlbHNlCisgICAgICAgIEdFVE4oMSwgZ2lm
X2NvbnN1bWVfYmxvY2spOworICAgIGJyZWFrOworCisgICAgLyogTmV0c2NhcGUtc3BlY2lmaWMg
R0lGIGV4dGVuc2lvbjogYW5pbWF0aW9uIGxvb3BpbmcgKi8KKyAgICBjYXNlIGdpZl9uZXRzY2Fw
ZV9leHRlbnNpb25fYmxvY2s6CisgICAgICBpZiAoKnEpCisgICAgICAgIEdFVE4oKnEsIGdpZl9j
b25zdW1lX25ldHNjYXBlX2V4dGVuc2lvbik7CisgICAgICBlbHNlCisgICAgICAgIEdFVE4oMSwg
Z2lmX2ltYWdlX3N0YXJ0KTsKKyAgICBicmVhazsKKworICAgIC8qIFBhcnNlIG5ldHNjYXBlLXNw
ZWNpZmljIGFwcGxpY2F0aW9uIGV4dGVuc2lvbnMgKi8KKyAgICBjYXNlIGdpZl9jb25zdW1lX25l
dHNjYXBlX2V4dGVuc2lvbjoKKyAgICB7CisgICAgICBpbnQgbmV0c2NhcGVfZXh0ZW5zaW9uID0g
cVswXSAmIDc7CisKKyAgICAgIC8qIExvb3AgZW50aXJlIGFuaW1hdGlvbiBzcGVjaWZpZWQgIyBv
ZiB0aW1lcy4gIE9ubHkgcmVhZCB0aGUKKyAgICAgICAgIGxvb3AgY291bnQgZHVyaW5nIHRoZSBm
aXJzdCBpdGVyYXRpb24uICovCisgICAgICBpZiAobmV0c2NhcGVfZXh0ZW5zaW9uID09IDEpIHsK
KyAgICAgICAgbG9vcF9jb3VudCA9IEdFVElOVDE2KHEgKyAxKTsKKworICAgICAgICBHRVROKDEs
IGdpZl9uZXRzY2FwZV9leHRlbnNpb25fYmxvY2spOworICAgICAgfQorICAgICAgLyogV2FpdCBm
b3Igc3BlY2lmaWVkICMgb2YgYnl0ZXMgdG8gZW50ZXIgYnVmZmVyICovCisgICAgICBlbHNlIGlm
IChuZXRzY2FwZV9leHRlbnNpb24gPT0gMikgeworICAgICAgICAvLyBEb24ndCBkbyB0aGlzLCB0
aGlzIGV4dGVuc2lvbiBkb2Vzbid0IGV4aXN0IChpc24ndCB1c2VkIGF0IGFsbCkgCisgICAgICAg
IC8vIGFuZCBkb2Vzbid0IGRvIGFueXRoaW5nLCBhcyBvdXIgc3RyZWFtaW5nL2J1ZmZlcmluZyB0
YWtlcyBjYXJlIG9mIGl0IGFsbC4uLgorICAgICAgICAvLyBTZWU6IGh0dHA6Ly9zZW1taXgucGwv
Y29sb3IvZXhncmFmL2VlZzI0Lmh0bQorICAgICAgICBHRVROKDEsIGdpZl9uZXRzY2FwZV9leHRl
bnNpb25fYmxvY2spOworICAgICAgfSBlbHNlCisgICAgICAgIHN0YXRlID0gZ2lmX2Vycm9yOyAv
LyAwLDMtNyBhcmUgeWV0IHRvIGJlIGRlZmluZWQgbmV0c2NhcGUKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAvLyBleHRlbnNpb24gY29kZXMKKworICAgICAgYnJlYWs7CisgICAgfQor
CisgICAgY2FzZSBnaWZfaW1hZ2VfaGVhZGVyOgorICAgIHsKKyAgICAgIHVuc2lnbmVkIGhlaWdo
dCwgd2lkdGgsIHhfb2Zmc2V0LCB5X29mZnNldDsKKyAgICAgIAorICAgICAgLyogR2V0IGltYWdl
IG9mZnNldHMsIHdpdGggcmVzcGVjdCB0byB0aGUgc2NyZWVuIG9yaWdpbiAqLworICAgICAgeF9v
ZmZzZXQgPSBHRVRJTlQxNihxKTsKKyAgICAgIHlfb2Zmc2V0ID0gR0VUSU5UMTYocSArIDIpOwor
CisgICAgICAvKiBHZXQgaW1hZ2Ugd2lkdGggYW5kIGhlaWdodC4gKi8KKyAgICAgIHdpZHRoICA9
IEdFVElOVDE2KHEgKyA0KTsKKyAgICAgIGhlaWdodCA9IEdFVElOVDE2KHEgKyA2KTsKKworICAg
ICAgLyogV29yayBhcm91bmQgYnJva2VuIEdJRiBmaWxlcyB3aGVyZSB0aGUgbG9naWNhbCBzY3Jl
ZW4KKyAgICAgICAqIHNpemUgaGFzIHdlaXJkIHdpZHRoIG9yIGhlaWdodC4gIFdlIGFzc3VtZSB0
aGF0IEdJRjg3YQorICAgICAgICogZmlsZXMgZG9uJ3QgY29udGFpbiBhbmltYXRpb25zLgorICAg
ICAgICovCisgICAgICBpZiAoKGltYWdlc19kZWNvZGVkID09IDApICYmCisgICAgICAgICAgKChz
Y3JlZW5faGVpZ2h0IDwgaGVpZ2h0KSB8fCAoc2NyZWVuX3dpZHRoIDwgd2lkdGgpIHx8CisgICAg
ICAgICAgICh2ZXJzaW9uID09IDg3KSkpCisgICAgICB7CisgICAgICAgIHNjcmVlbl9oZWlnaHQg
PSBoZWlnaHQ7CisgICAgICAgIHNjcmVlbl93aWR0aCA9IHdpZHRoOworICAgICAgICB4X29mZnNl
dCA9IDA7CisgICAgICAgIHlfb2Zmc2V0ID0gMDsKKworICAgICAgICAvLyBDQUxMQkFDSzogSW5m
b3JtIHRoZSBkZWNvZGVycGx1Z2luIG9mIG91ciBzaXplLgorICAgICAgICBpZiAoY2xpZW50cHRy
KQorICAgICAgICAgIGNsaWVudHB0ci0+c2l6ZU5vd0F2YWlsYWJsZShzY3JlZW5fd2lkdGgsIHNj
cmVlbl9oZWlnaHQpOworICAgICAgfQorCisgICAgICAvKiBXb3JrIGFyb3VuZCBtb3JlIGJyb2tl
biBHSUYgZmlsZXMgdGhhdCBoYXZlIHplcm8gaW1hZ2UKKyAgICAgICAgIHdpZHRoIG9yIGhlaWdo
dCAqLworICAgICAgaWYgKCFoZWlnaHQgfHwgIXdpZHRoKSB7CisgICAgICAgIGhlaWdodCA9IHNj
cmVlbl9oZWlnaHQ7CisgICAgICAgIHdpZHRoID0gc2NyZWVuX3dpZHRoOworICAgICAgICBpZiAo
IWhlaWdodCB8fCAhd2lkdGgpIHsKKyAgICAgICAgICBzdGF0ZSA9IGdpZl9lcnJvcjsKKyAgICAg
ICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAocXVlcnkgPT0gR0lG
SW1hZ2VEZWNvZGVyOjpHSUZTaXplUXVlcnkgfHwgaGFsdEF0RnJhbWUgPT0gaW1hZ2VzX2RlY29k
ZWQpIHsKKyAgICAgICAgLy8gVGhlIGRlY29kZXIgbmVlZHMgdG8gc3RvcC4gIEhhbmQgYmFjayB0
aGUgbnVtYmVyIG9mIGJ5dGVzIHdlIGNvbnN1bWVkIGZyb20KKyAgICAgICAgLy8gYnVmZmVyIG1p
bnVzIDkgKHRoZSBhbW91bnQgd2UgY29uc3VtZWQgdG8gcmVhZCB0aGUgaGVhZGVyKS4KKyAgICAg
ICAgaWYgKGNsaWVudHB0cikKKyAgICAgICAgICAgIGNsaWVudHB0ci0+ZGVjb2RpbmdIYWx0ZWQo
bGVuICsgOSk7CisgICAgICAgIEdFVE4oOSwgZ2lmX2ltYWdlX2hlYWRlcik7CisgICAgICAgIHJl
dHVybiB0cnVlOworICAgICAgfQorICAgICAgCisgICAgICBpbWFnZXNfY291bnQgPSBpbWFnZXNf
ZGVjb2RlZCArIDE7CisKKyAgICAgIGlmIChxdWVyeSA9PSBHSUZJbWFnZURlY29kZXI6OkdJRkZ1
bGxRdWVyeSAmJiAhZnJhbWVfcmVhZGVyKQorICAgICAgICBmcmFtZV9yZWFkZXIgPSBuZXcgR0lG
RnJhbWVSZWFkZXIoKTsKKworICAgICAgaWYgKGZyYW1lX3JlYWRlcikgeworICAgICAgICBmcmFt
ZV9yZWFkZXItPnhfb2Zmc2V0ID0geF9vZmZzZXQ7CisgICAgICAgIGZyYW1lX3JlYWRlci0+eV9v
ZmZzZXQgPSB5X29mZnNldDsKKyAgICAgICAgZnJhbWVfcmVhZGVyLT5oZWlnaHQgPSBoZWlnaHQ7
CisgICAgICAgIGZyYW1lX3JlYWRlci0+d2lkdGggPSB3aWR0aDsKKworICAgICAgICAvKiBUaGlz
IGNhc2Ugd2lsbCBuZXZlciBiZSB0YWtlbiBpZiB0aGlzIGlzIHRoZSBmaXJzdCBpbWFnZSAqLwor
ICAgICAgICAvKiBiZWluZyBkZWNvZGVkLiBJZiBhbnkgb2YgdGhlIGxhdGVyIGltYWdlcyBhcmUg
bGFyZ2VyICAgICAqLworICAgICAgICAvKiB0aGFuIHRoZSBzY3JlZW4gc2l6ZSwgd2UgbmVlZCB0
byByZWFsbG9jYXRlIGJ1ZmZlcnMuICAgICAqLworICAgICAgICBpZiAoc2NyZWVuX3dpZHRoIDwg
d2lkdGgpIHsKKyAgICAgICAgICAvKiBYWFggRGV2aWFudCEgKi8KKworICAgICAgICAgIGRlbGV0
ZSBbXWZyYW1lX3JlYWRlci0+cm93YnVmOworICAgICAgICAgIHNjcmVlbl93aWR0aCA9IHdpZHRo
OworICAgICAgICAgIGZyYW1lX3JlYWRlci0+cm93YnVmID0gbmV3IHVuc2lnbmVkIGNoYXJbc2Ny
ZWVuX3dpZHRoXTsKKyAgICAgICAgfSBlbHNlIGlmICghZnJhbWVfcmVhZGVyLT5yb3didWYpIHsK
KyAgICAgICAgICBmcmFtZV9yZWFkZXItPnJvd2J1ZiA9IG5ldyB1bnNpZ25lZCBjaGFyW3NjcmVl
bl93aWR0aF07CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWZyYW1lX3JlYWRlci0+cm93YnVm
KSB7CisgICAgICAgICAgc3RhdGUgPSBnaWZfb29tOworICAgICAgICAgIGJyZWFrOworICAgICAg
ICB9CisgICAgICAgIGlmIChzY3JlZW5faGVpZ2h0IDwgaGVpZ2h0KQorICAgICAgICAgIHNjcmVl
bl9oZWlnaHQgPSBoZWlnaHQ7CisKKyAgICAgICAgaWYgKHFbOF0gJiAweDQwKSB7CisgICAgICAg
ICAgZnJhbWVfcmVhZGVyLT5pbnRlcmxhY2VkID0gdHJ1ZTsKKyAgICAgICAgICBmcmFtZV9yZWFk
ZXItPmlwYXNzID0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmcmFtZV9yZWFkZXIt
PmludGVybGFjZWQgPSBmYWxzZTsKKyAgICAgICAgICBmcmFtZV9yZWFkZXItPmlwYXNzID0gMDsK
KyAgICAgICAgfQorCisgICAgICAgIGlmIChpbWFnZXNfZGVjb2RlZCA9PSAwKSB7CisgICAgICAg
ICAgZnJhbWVfcmVhZGVyLT5wcm9ncmVzc2l2ZV9kaXNwbGF5ID0gdHJ1ZTsKKyAgICAgICAgfSBl
bHNlIHsKKyAgICAgICAgICAvKiBPdmVybGF5aW5nIGludGVybGFjZWQsIHRyYW5zcGFyZW50IEdJ
RnMgb3ZlcgorICAgICAgICAgICAgIGV4aXN0aW5nIGltYWdlIGRhdGEgdXNpbmcgdGhlIEhhZWJl
cmxpIGRpc3BsYXkgaGFjaworICAgICAgICAgICAgIHJlcXVpcmVzIHNhdmluZyB0aGUgdW5kZXJs
eWluZyBpbWFnZSBpbiBvcmRlciB0bworICAgICAgICAgICAgIGF2b2lkIGphZ2dpZXMgYXQgdGhl
IHRyYW5zcGFyZW5jeSBlZGdlcy4gIFdlIGFyZQorICAgICAgICAgICAgIHVucHJlcGFyZWQgdG8g
ZGVhbCB3aXRoIHRoYXQsIHNvIGRvbid0IGRpc3BsYXkgc3VjaAorICAgICAgICAgICAgIGltYWdl
cyBwcm9ncmVzc2l2ZWx5ICovCisgICAgICAgICAgZnJhbWVfcmVhZGVyLT5wcm9ncmVzc2l2ZV9k
aXNwbGF5ID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvKiBDbGVhciBzdGF0ZSBmcm9t
IGxhc3QgaW1hZ2UgKi8KKyAgICAgICAgZnJhbWVfcmVhZGVyLT5pcm93ID0gMDsKKyAgICAgICAg
ZnJhbWVfcmVhZGVyLT5yb3dzX3JlbWFpbmluZyA9IGZyYW1lX3JlYWRlci0+aGVpZ2h0OworICAg
ICAgICBmcmFtZV9yZWFkZXItPnJvd2VuZCA9IGZyYW1lX3JlYWRlci0+cm93YnVmICsgZnJhbWVf
cmVhZGVyLT53aWR0aDsKKyAgICAgICAgZnJhbWVfcmVhZGVyLT5yb3dwID0gZnJhbWVfcmVhZGVy
LT5yb3didWY7CisKKyAgICAgICAgLyogYml0cyBwZXIgcGl4ZWwgaXMgcVs4XSYweDA3ICovCisg
ICAgICB9CisgICAgICAKKyAgICAgIGlmIChxWzhdICYgMHg4MCkgLyogaGFzIGEgbG9jYWwgY29s
b3JtYXA/ICovCisgICAgICB7CisgICAgICAgIGludCBudW1fY29sb3JzID0gMiA8PCAocVs4XSAm
IDB4Nyk7CisgICAgICAgIGNvbnN0IHVuc2lnbmVkIHNpemUgPSAzKm51bV9jb2xvcnM7CisgICAg
ICAgIHVuc2lnbmVkIGNoYXIgKm1hcCA9IGZyYW1lX3JlYWRlciA/IGZyYW1lX3JlYWRlci0+bG9j
YWxfY29sb3JtYXAgOiAwOworICAgICAgICBpZiAoZnJhbWVfcmVhZGVyICYmICghbWFwIHx8IChu
dW1fY29sb3JzID4gZnJhbWVfcmVhZGVyLT5sb2NhbF9jb2xvcm1hcF9zaXplKSkpIHsKKyAgICAg
ICAgICBkZWxldGUgW11tYXA7CisgICAgICAgICAgbWFwID0gbmV3IHVuc2lnbmVkIGNoYXJbc2l6
ZV07CisgICAgICAgICAgaWYgKCFtYXApIHsKKyAgICAgICAgICAgIHN0YXRlID0gZ2lmX29vbTsK
KyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8q
IFN3aXRjaCB0byB0aGUgbmV3IGxvY2FsIHBhbGV0dGUgYWZ0ZXIgaXQgbG9hZHMgKi8KKyAgICAg
ICAgaWYgKGZyYW1lX3JlYWRlcikgeworICAgICAgICAgIGZyYW1lX3JlYWRlci0+bG9jYWxfY29s
b3JtYXAgPSBtYXA7CisgICAgICAgICAgZnJhbWVfcmVhZGVyLT5sb2NhbF9jb2xvcm1hcF9zaXpl
ID0gbnVtX2NvbG9yczsKKyAgICAgICAgICBmcmFtZV9yZWFkZXItPmlzX2xvY2FsX2NvbG9ybWFw
X2RlZmluZWQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxlbiA8IHNpemUpIHsK
KyAgICAgICAgICAvLyBVc2UgJ2hvbGQnIHBhdHRlcm4gdG8gZ2V0IHRoZSBpbWFnZSBjb2xvcm1h
cAorICAgICAgICAgIEdFVE4oc2l6ZSwgZ2lmX2ltYWdlX2NvbG9ybWFwKTsKKyAgICAgICAgICBi
cmVhazsKKyAgICAgICAgfQorICAgICAgICAvLyBDb3B5IGV2ZXJ5dGhpbmcgYW5kIGRpcmVjdGx5
IGdvIHRvIGdpZl9sendfc3RhcnQKKyAgICAgICAgaWYgKGZyYW1lX3JlYWRlcikKKyAgICAgICAg
ICBtZW1jcHkoZnJhbWVfcmVhZGVyLT5sb2NhbF9jb2xvcm1hcCwgYnVmLCBzaXplKTsKKyAgICAg
ICAgYnVmICs9IHNpemU7CisgICAgICAgIGxlbiAtPSBzaXplOworICAgICAgfSBlbHNlIGlmIChm
cmFtZV9yZWFkZXIpIHsKKyAgICAgICAgLyogU3dpdGNoIGJhY2sgdG8gdGhlIGdsb2JhbCBwYWxl
dHRlICovCisgICAgICAgIGZyYW1lX3JlYWRlci0+aXNfbG9jYWxfY29sb3JtYXBfZGVmaW5lZCA9
IGZhbHNlOworICAgICAgfQorICAgICAgR0VUTigxLCBnaWZfbHp3X3N0YXJ0KTsKKyAgICB9Cisg
ICAgYnJlYWs7CisKKyAgICBjYXNlIGdpZl9pbWFnZV9jb2xvcm1hcDoKKyAgICAgIC8vIEV2ZXJ5
dGhpbmcgaXMgYWxyZWFkeSBjb3BpZWQgaW50byBsb2NhbF9jb2xvcm1hcAorICAgICAgR0VUTigx
LCBnaWZfbHp3X3N0YXJ0KTsKKyAgICBicmVhazsKKworICAgIGNhc2UgZ2lmX3N1Yl9ibG9jazoK
KyAgICB7CisgICAgICBpZiAoKGNvdW50ID0gKnEpICE9IDApCisgICAgICAvKiBTdGlsbCB3b3Jr
aW5nIG9uIHRoZSBzYW1lIGltYWdlOiBQcm9jZXNzIG5leHQgTFpXIGRhdGEgYmxvY2sgKi8KKyAg
ICAgIHsKKyAgICAgICAgLyogTWFrZSBzdXJlIHRoZXJlIGFyZSBzdGlsbCByb3dzIGxlZnQuIElm
IHRoZSBHSUYgZGF0YSAqLworICAgICAgICAvKiBpcyBjb3JydXB0LCB3ZSBtYXkgbm90IGdldCBh
biBleHBsaWNpdCB0ZXJtaW5hdG9yLiAgICovCisgICAgICAgIGlmIChmcmFtZV9yZWFkZXIgJiYg
ZnJhbWVfcmVhZGVyLT5yb3dzX3JlbWFpbmluZyA9PSAwKSB7CisgICAgICAgICAgLyogVGhpcyBp
cyBhbiBpbGxlZ2FsIEdJRiwgYnV0IHdlIHJlbWFpbiB0b2xlcmFudC4gKi8KKyAgICAgICAgICBH
RVROKDEsIGdpZl9zdWJfYmxvY2spOworICAgICAgICB9CisgICAgICAgIEdFVE4oY291bnQsIGdp
Zl9sencpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgLyogU2VlIGlmIHRoZXJlIGFyZSBh
bnkgbW9yZSBpbWFnZXMgaW4gdGhpcyBzZXF1ZW5jZS4gKi8KKyAgICAgIHsKKyAgICAgICAgaW1h
Z2VzX2RlY29kZWQrKzsKKworICAgICAgICAvLyBDQUxMQkFDSzogVGhlIGZyYW1lIGlzIG5vdyBj
b21wbGV0ZS4KKyAgICAgICAgaWYgKGNsaWVudHB0ciAmJiBmcmFtZV9yZWFkZXIpCisgICAgICAg
ICAgY2xpZW50cHRyLT5mcmFtZUNvbXBsZXRlKGltYWdlc19kZWNvZGVkIC0gMSwgZnJhbWVfcmVh
ZGVyLT5kZWxheV90aW1lLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJh
bWVfcmVhZGVyLT5kaXNwb3NhbF9tZXRob2QpOworCisgICAgICAgIC8qIENsZWFyIHN0YXRlIGZy
b20gdGhpcyBpbWFnZSAqLworICAgICAgICBpZiAoZnJhbWVfcmVhZGVyKSB7CisgICAgICAgICAg
ICBmcmFtZV9yZWFkZXItPmlzX2xvY2FsX2NvbG9ybWFwX2RlZmluZWQgPSBmYWxzZTsKKyAgICAg
ICAgICAgIGZyYW1lX3JlYWRlci0+aXNfdHJhbnNwYXJlbnQgPSBmYWxzZTsKKyAgICAgICAgfQor
CisgICAgICAgIEdFVE4oMSwgZ2lmX2ltYWdlX3N0YXJ0KTsKKyAgICAgIH0KKyAgICB9CisgICAg
YnJlYWs7CisKKyAgICBjYXNlIGdpZl9kb25lOgorICAgICAgLy8gV2hlbiB0aGUgR0lGIGlzIGRv
bmUsIHdlIGNhbiBzdG9wLgorICAgICAgaWYgKGNsaWVudHB0cikKKyAgICAgICAgY2xpZW50cHRy
LT5naWZDb21wbGV0ZSgpOworICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAvLyBIYW5kbGUgb3V0
IG9mIG1lbW9yeSBlcnJvcnMKKyAgICBjYXNlIGdpZl9vb206CisgICAgICByZXR1cm4gZmFsc2U7
CisKKyAgICAvLyBIYW5kbGUgZ2VuZXJhbCBlcnJvcnMKKyAgICBjYXNlIGdpZl9lcnJvcjoKKyAg
ICAgIC8vIG5zR0lGRGVjb2RlcjI6OkVuZEdJRihncy0+Y2xpZW50cHRyLCBncy0+bG9vcF9jb3Vu
dCk7CisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBXZSBzaG91bGRuJ3QgZXZlciBnZXQg
aGVyZS4KKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgLy8gQ29w
eSB0aGUgbGVmdG92ZXIgaW50byBncy0+aG9sZAorICBieXRlc19pbl9ob2xkID0gbGVuOworICBp
ZiAobGVuKSB7CisgICAgLy8gQWRkIHdoYXQgd2UgaGF2ZSBzb2ZhciB0byB0aGUgYmxvY2sKKyAg
ICB1bnNpZ25lZCBjaGFyKiBwOworICAgIGlmIChzdGF0ZSA9PSBnaWZfZ2xvYmFsX2NvbG9ybWFw
KQorICAgICAgcCA9IGdsb2JhbF9jb2xvcm1hcDsKKyAgICBlbHNlIGlmIChzdGF0ZSA9PSBnaWZf
aW1hZ2VfY29sb3JtYXApCisgICAgICBwID0gZnJhbWVfcmVhZGVyID8gZnJhbWVfcmVhZGVyLT5s
b2NhbF9jb2xvcm1hcCA6IDA7CisgICAgZWxzZQorICAgICAgcCA9IGhvbGQ7CisgICAgaWYgKHAp
CisgICAgICBtZW1jcHkocCwgYnVmLCBsZW4pOworICAgIGJ5dGVzX3RvX2NvbnN1bWUgLT0gbGVu
OworICB9CisKKyAgaWYgKGNsaWVudHB0cikKKyAgICBjbGllbnRwdHItPmRlY29kaW5nSGFsdGVk
KDApOworICByZXR1cm4gdHJ1ZTsKK30KKworI2VuZGlmIC8vIFBMQVRGT1JNKENBSVJPKQpJbmRl
eDogcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvc2tpYS9HSUZJbWFnZVJlYWRlci5oCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIHBsYXRmb3JtL2ltYWdlLWRlY29kZXJzL3NraWEvR0lGSW1hZ2VSZWFkZXIuaAkocmV2
aXNpb24gNDAxNjQpCShmcm9tIHBsYXRmb3JtL2ltYWdlLWRlY29kZXJzL2dpZi9HSUZJbWFnZVJl
YWRlci5oOjQwMTY0KQorKysgcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvc2tpYS9HSUZJbWFnZVJl
YWRlci5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMjE2IEBACisvKiAtKi0gTW9kZTogQzsg
dGFiLXdpZHRoOiA0OyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IGMtYmFzaWMtb2Zmc2V0OiAyIC0q
LSAqLworLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgorICogVmVyc2lvbjogTVBM
IDEuMS9HUEwgMi4wL0xHUEwgMi4xCisgKgorICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBh
cmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCisgKiAxLjEg
KHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21w
bGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhl
IExpY2Vuc2UgYXQKKyAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLworICoKKyAqIFNvZnR3
YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJB
UyBJUyIgYmFzaXMsCisgKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhw
cmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKKyAqIGZvciB0aGUgc3BlY2lmaWMgbGFu
Z3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCisgKiBMaWNl
bnNlLgorICoKKyAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIE1vemlsbGEgQ29tbXVuaWNhdG9yIGNs
aWVudCBjb2RlLgorICoKKyAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwg
Q29kZSBpcworICogTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uCisgKiBQb3J0
aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAx
OTk4CisgKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgor
ICogQ29udHJpYnV0b3Iocyk6CisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9m
IHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGVpdGhlciB0aGUg
R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIp
LCBvcgorICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIu
MSBvciBsYXRlciAodGhlICJMR1BMIiksCisgKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25z
IG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAorICogb2YgdGhv
c2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhp
cyBmaWxlIG9ubHkKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUg
TEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KKyAqIHVzZSB5b3VyIHZlcnNpb24gb2Yg
dGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCisgKiBk
ZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVt
IHdpdGggdGhlIG5vdGljZQorICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhl
IEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKKyAqIHRoZSBwcm92aXNpb25z
IGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5k
ZXIKKyAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExH
UEwuCisgKgorICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KKworI2lmbmRlZiBf
R0lGX0hfCisjZGVmaW5lIF9HSUZfSF8KKworLy8gRGVmaW5lIG91cnNlbHZlcyBhcyB0aGUgY2xp
ZW50UHRyLiAgTW96aWxsYSBqdXN0IGhhY2tlZCB0aGVpciBDKysgY2FsbGJhY2sgY2xhc3MgaW50
byB0aGlzIG9sZCBDIGRlY29kZXIsCisvLyBzbyB3ZSB3aWxsIHRvby4KKyNpbmNsdWRlICJHSUZJ
bWFnZURlY29kZXIuaCIKKworI2RlZmluZSBNQVhfTFpXX0JJVFMgICAgICAgICAgMTIKKyNkZWZp
bmUgTUFYX0JJVFMgICAgICAgICAgICA0MDk3IC8qIDJeTUFYX0xaV19CSVRTKzEgKi8KKyNkZWZp
bmUgTUFYX0NPTE9SUyAgICAgICAgICAgMjU2CisjZGVmaW5lIE1BWF9IT0xEX1NJWkUgICAgICAg
IDI1NgorCitjb25zdCBpbnQgY0xvb3BDb3VudE5vdFNlZW4gPSAtMjsKKworLyogZ2lmMi5oICAK
KyAgIFRoZSBpbnRlcmZhY2UgZm9yIHRoZSBHSUY4Ny84OWEgZGVjb2Rlci4gCisqLworLy8gTGlz
dCBvZiBwb3NzaWJsZSBwYXJzaW5nIHN0YXRlcwordHlwZWRlZiBlbnVtIHsKKyAgICBnaWZfdHlw
ZSwKKyAgICBnaWZfZ2xvYmFsX2hlYWRlciwKKyAgICBnaWZfZ2xvYmFsX2NvbG9ybWFwLAorICAg
IGdpZl9pbWFnZV9zdGFydCwgICAgICAgICAgICAKKyAgICBnaWZfaW1hZ2VfaGVhZGVyLAorICAg
IGdpZl9pbWFnZV9jb2xvcm1hcCwKKyAgICBnaWZfaW1hZ2VfYm9keSwKKyAgICBnaWZfbHp3X3N0
YXJ0LAorICAgIGdpZl9sencsCisgICAgZ2lmX3N1Yl9ibG9jaywKKyAgICBnaWZfZXh0ZW5zaW9u
LAorICAgIGdpZl9jb250cm9sX2V4dGVuc2lvbiwKKyAgICBnaWZfY29uc3VtZV9ibG9jaywKKyAg
ICBnaWZfc2tpcF9ibG9jaywKKyAgICBnaWZfZG9uZSwKKyAgICBnaWZfb29tLAorICAgIGdpZl9l
cnJvciwKKyAgICBnaWZfY29tbWVudF9leHRlbnNpb24sCisgICAgZ2lmX2FwcGxpY2F0aW9uX2V4
dGVuc2lvbiwKKyAgICBnaWZfbmV0c2NhcGVfZXh0ZW5zaW9uX2Jsb2NrLAorICAgIGdpZl9jb25z
dW1lX25ldHNjYXBlX2V4dGVuc2lvbiwKKyAgICBnaWZfY29uc3VtZV9jb21tZW50Cit9IGdzdGF0
ZTsKKworc3RydWN0IEdJRkZyYW1lUmVhZGVyIHsKKyAgICAvKiBMWlcgZGVjb2RlciBzdGF0ZSBt
YWNoaW5lICovCisgICAgdW5zaWduZWQgY2hhciAqc3RhY2twOyAgICAgICAgICAgICAgLyogQ3Vy
cmVudCBzdGFjayBwb2ludGVyICovCisgICAgaW50IGRhdGFzaXplOworICAgIGludCBjb2Rlc2l6
ZTsKKyAgICBpbnQgY29kZW1hc2s7CisgICAgaW50IGNsZWFyX2NvZGU7ICAgICAgICAgICAgIC8q
IENvZGV3b3JkIHVzZWQgdG8gdHJpZ2dlciBkaWN0aW9uYXJ5IHJlc2V0ICovCisgICAgaW50IGF2
YWlsOyAgICAgICAgICAgICAgICAgIC8qIEluZGV4IG9mIG5leHQgYXZhaWxhYmxlIHNsb3QgaW4g
ZGljdGlvbmFyeSAqLworICAgIGludCBvbGRjb2RlOworICAgIHVuc2lnbmVkIGNoYXIgZmlyc3Rj
aGFyOworICAgIGludCBiaXRzOyAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgdW5yZWFk
IGJpdHMgaW4gImRhdHVtIiAqLworICAgIGludCBkYXR1bTsgICAgICAgICAgICAgICAgLyogMzIt
Yml0IGlucHV0IGJ1ZmZlciAqLworCisgICAgLyogT3V0cHV0IHN0YXRlIG1hY2hpbmUgKi8KKyAg
ICBpbnQgaXBhc3M7ICAgICAgICAgICAgICAgICAgLyogSW50ZXJsYWNlIHBhc3M7IFJhbmdlcyAx
LTQgaWYgaW50ZXJsYWNlZC4gKi8KKyAgICB1bnNpZ25lZCBpbnQgcm93c19yZW1haW5pbmc7ICAg
ICAgICAvKiBSb3dzIHJlbWFpbmluZyB0byBiZSBvdXRwdXQgKi8KKyAgICB1bnNpZ25lZCBpbnQg
aXJvdzsgICAgICAgICAgICAgICAgICAvKiBDdXJyZW50IG91dHB1dCByb3csIHN0YXJ0aW5nIGF0
IHplcm8gKi8KKyAgICB1bnNpZ25lZCBjaGFyICpyb3didWY7ICAgICAgICAgICAgICAvKiBTaW5n
bGUgc2NhbmxpbmUgdGVtcG9yYXJ5IGJ1ZmZlciAqLworICAgIHVuc2lnbmVkIGNoYXIgKnJvd2Vu
ZDsgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gZW5kIG9mIHJvd2J1ZiAqLworICAgIHVuc2ln
bmVkIGNoYXIgKnJvd3A7ICAgICAgICAgICAgICAgIC8qIEN1cnJlbnQgb3V0cHV0IHBvaW50ZXIg
Ki8KKworICAgIC8qIFBhcmFtZXRlcnMgZm9yIGltYWdlIGZyYW1lIGN1cnJlbnRseSBiZWluZyBk
ZWNvZGVkICovCisgICAgdW5zaWduZWQgaW50IHhfb2Zmc2V0LCB5X29mZnNldDsgICAgLyogV2l0
aCByZXNwZWN0IHRvICJzY3JlZW4iIG9yaWdpbiAqLworICAgIHVuc2lnbmVkIGludCBoZWlnaHQs
IHdpZHRoOworICAgIGludCB0cGl4ZWw7ICAgICAgICAgICAgICAgICAvKiBJbmRleCBvZiB0cmFu
c3BhcmVudCBwaXhlbCAqLworICAgIFdlYkNvcmU6OlJHQkEzMkJ1ZmZlcjo6RnJhbWVEaXNwb3Nh
bE1ldGhvZCBkaXNwb3NhbF9tZXRob2Q7ICAgLyogUmVzdG9yZSB0byBiYWNrZ3JvdW5kLCBsZWF2
ZSBpbiBwbGFjZSwgZXRjLiovCisgICAgdW5zaWduZWQgY2hhciAqbG9jYWxfY29sb3JtYXA7ICAg
IC8qIFBlci1pbWFnZSBjb2xvcm1hcCAqLworICAgIGludCBsb2NhbF9jb2xvcm1hcF9zaXplOyAg
ICAvKiBTaXplIG9mIGxvY2FsIGNvbG9ybWFwIGFycmF5LiAqLworICAgIAorICAgIGJvb2wgaXNf
bG9jYWxfY29sb3JtYXBfZGVmaW5lZCA6IDE7CisgICAgYm9vbCBwcm9ncmVzc2l2ZV9kaXNwbGF5
IDogMTsgICAgLyogSWYgVFJVRSwgZG8gSGFlYmVybGkgaW50ZXJsYWNlIGhhY2sgKi8KKyAgICBi
b29sIGludGVybGFjZWQgOiAxOyAgICAgICAgICAgICAvKiBUUlVFLCBpZiBzY2FubGluZXMgYXJy
aXZlIGludGVybGFjZWQgb3JkZXIgKi8KKyAgICBib29sIGlzX3RyYW5zcGFyZW50IDogMTsgICAg
ICAgICAvKiBUUlVFLCBpZiB0cGl4ZWwgaXMgdmFsaWQgKi8KKworICAgIHVuc2lnbmVkIGRlbGF5
X3RpbWU7ICAgICAgICAvKiBEaXNwbGF5IHRpbWUsIGluIG1pbGxpc2Vjb25kcywKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoaXMgaW1hZ2UgaW4gYSBtdWx0aS1pbWFn
ZSBHSUYgKi8KKworCisgICAgdW5zaWduZWQgc2hvcnQqICBwcmVmaXg7ICAgICAgICAgIC8qIExa
VyBkZWNvZGluZyB0YWJsZXMgKi8KKyAgICB1bnNpZ25lZCBjaGFyKiAgIHN1ZmZpeDsgICAgICAg
ICAgLyogTFpXIGRlY29kaW5nIHRhYmxlcyAqLworICAgIHVuc2lnbmVkIGNoYXIqICAgc3RhY2s7
ICAgICAgICAgICAvKiBCYXNlIG9mIExaVyBkZWNvZGVyIHN0YWNrICovCisKKworICAgIEdJRkZy
YW1lUmVhZGVyKCkgeworICAgICAgICBzdGFja3AgPSAwOworICAgICAgICBkYXRhc2l6ZSA9IGNv
ZGVzaXplID0gY29kZW1hc2sgPSBjbGVhcl9jb2RlID0gYXZhaWwgPSBvbGRjb2RlID0gMDsKKyAg
ICAgICAgZmlyc3RjaGFyID0gMDsKKyAgICAgICAgYml0cyA9IGRhdHVtID0gMDsKKyAgICAgICAg
aXBhc3MgPSAwOworICAgICAgICByb3dzX3JlbWFpbmluZyA9IGlyb3cgPSAwOworICAgICAgICBy
b3didWYgPSByb3dlbmQgPSByb3dwID0gMDsKKworICAgICAgICB4X29mZnNldCA9IHlfb2Zmc2V0
ID0gd2lkdGggPSBoZWlnaHQgPSAwOworICAgICAgICB0cGl4ZWwgPSAwOworICAgICAgICBkaXNw
b3NhbF9tZXRob2QgPSBXZWJDb3JlOjpSR0JBMzJCdWZmZXI6OkRpc3Bvc2VOb3RTcGVjaWZpZWQ7
CisKKyAgICAgICAgbG9jYWxfY29sb3JtYXAgPSAwOworICAgICAgICBsb2NhbF9jb2xvcm1hcF9z
aXplID0gMDsKKyAgICAgICAgaXNfbG9jYWxfY29sb3JtYXBfZGVmaW5lZCA9IHByb2dyZXNzaXZl
X2Rpc3BsYXkgPSBpc190cmFuc3BhcmVudCA9IGludGVybGFjZWQgPSBmYWxzZTsKKworICAgICAg
ICBkZWxheV90aW1lID0gMDsKKworICAgICAgICBwcmVmaXggPSAwOworICAgICAgICBzdWZmaXgg
PSBzdGFjayA9IDA7CisgICAgfQorICAgIAorICAgIH5HSUZGcmFtZVJlYWRlcigpIHsKKyAgICAg
ICAgZGVsZXRlIFtdcm93YnVmOworICAgICAgICBkZWxldGUgW11sb2NhbF9jb2xvcm1hcDsKKyAg
ICAgICAgZGVsZXRlIFtdcHJlZml4OworICAgICAgICBkZWxldGUgW11zdWZmaXg7CisgICAgICAg
IGRlbGV0ZSBbXXN0YWNrOworICAgIH0KK307CisKK3N0cnVjdCBHSUZJbWFnZVJlYWRlciB7Cisg
ICAgV2ViQ29yZTo6R0lGSW1hZ2VEZWNvZGVyKiBjbGllbnRwdHI7CisgICAgLyogUGFyc2luZyBz
dGF0ZSBtYWNoaW5lICovCisgICAgZ3N0YXRlIHN0YXRlOyAgICAgICAgICAgICAgICAgICAgICAv
KiBDdXJyZW50IGRlY29kZXIgbWFzdGVyIHN0YXRlICovCisgICAgdW5zaWduZWQgYnl0ZXNfdG9f
Y29uc3VtZTsgICAgICAgICAvKiBOdW1iZXIgb2YgYnl0ZXMgdG8gYWNjdW11bGF0ZSAqLworICAg
IHVuc2lnbmVkIGJ5dGVzX2luX2hvbGQ7ICAgICAgICAgICAgLyogYnl0ZXMgYWNjdW11bGF0ZWQg
c28gZmFyKi8KKyAgICB1bnNpZ25lZCBjaGFyIGhvbGRbTUFYX0hPTERfU0laRV07IC8qIEFjY3Vt
dWxhdGlvbiBidWZmZXIgKi8KKyAgICB1bnNpZ25lZCBjaGFyKiBnbG9iYWxfY29sb3JtYXA7ICAg
IC8qICgzKiBNQVhfQ09MT1JTIGluIHNpemUpIERlZmF1bHQgY29sb3JtYXAgaWYgbG9jYWwgbm90
IHN1cHBsaWVkLCAzIGJ5dGVzIGZvciBlYWNoIGNvbG9yICAqLworICAgIAorICAgICAvKiBHbG9i
YWwgKG11bHRpLWltYWdlKSBzdGF0ZSAqLworICAgIGludCBzY3JlZW5fYmdjb2xvcjsgICAgICAg
ICAvKiBMb2dpY2FsIHNjcmVlbiBiYWNrZ3JvdW5kIGNvbG9yICovCisgICAgaW50IHZlcnNpb247
ICAgICAgICAgICAgICAgIC8qIEVpdGhlciA4OSBmb3IgR0lGODkgb3IgODcgZm9yIEdJRjg3ICov
CisgICAgdW5zaWduZWQgc2NyZWVuX3dpZHRoOyAgICAgICAvKiBMb2dpY2FsIHNjcmVlbiB3aWR0
aCAmIGhlaWdodCAqLworICAgIHVuc2lnbmVkIHNjcmVlbl9oZWlnaHQ7CisgICAgaW50IGdsb2Jh
bF9jb2xvcm1hcF9zaXplOyAgIC8qIFNpemUgb2YgZ2xvYmFsIGNvbG9ybWFwIGFycmF5LiAqLwor
ICAgIGludCBpbWFnZXNfZGVjb2RlZDsgICAgICAgICAvKiBDb3VudHMgY29tcGxldGVkIGZyYW1l
cyBmb3IgYW5pbWF0ZWQgR0lGcyAqLworICAgIGludCBpbWFnZXNfY291bnQ7ICAgICAgICAgICAv
KiBDb3VudGVkIGFsbCBmcmFtZXMgc2VlbiBzbyBmYXIgKGluY2x1ZGluZyBpbmNvbXBsZXRlIGZy
YW1lcykgKi8KKyAgICBpbnQgbG9vcF9jb3VudDsgICAgICAgICAgICAgLyogTmV0c2NhcGUgc3Bl
Y2lmaWMgZXh0ZW5zaW9uIGJsb2NrIHRvIGNvbnRyb2wKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgdGhlIG51bWJlciBvZiBhbmltYXRpb24gbG9vcHMgYSBHSUYgcmVuZGVycy4g
Ki8KKyAgICAKKyAgICAvLyBOb3QgcmVhbGx5IGdsb2JhbCwgYnV0IGNvbnZlbmllbnQgdG8gbG9j
YXRlIGhlcmUuCisgICAgaW50IGNvdW50OyAgICAgICAgICAgICAgICAgIC8qIFJlbWFpbmluZyAj
IGJ5dGVzIGluIHN1Yi1ibG9jayAqLworICAgIAorICAgIEdJRkZyYW1lUmVhZGVyKiBmcmFtZV9y
ZWFkZXI7CisKKyAgICBHSUZJbWFnZVJlYWRlcihXZWJDb3JlOjpHSUZJbWFnZURlY29kZXIqIGNs
aWVudCA9IDApIHsKKyAgICAgICAgY2xpZW50cHRyID0gY2xpZW50OworICAgICAgICBzdGF0ZSA9
IGdpZl90eXBlOworICAgICAgICBieXRlc190b19jb25zdW1lID0gNjsKKyAgICAgICAgYnl0ZXNf
aW5faG9sZCA9IDA7CisgICAgICAgIGZyYW1lX3JlYWRlciA9IDA7CisgICAgICAgIGdsb2JhbF9j
b2xvcm1hcCA9IDA7CisKKyAgICAgICAgc2NyZWVuX2JnY29sb3IgPSB2ZXJzaW9uID0gMDsKKyAg
ICAgICAgc2NyZWVuX3dpZHRoID0gc2NyZWVuX2hlaWdodCA9IDA7CisgICAgICAgIGdsb2JhbF9j
b2xvcm1hcF9zaXplID0gaW1hZ2VzX2RlY29kZWQgPSBpbWFnZXNfY291bnQgPSAwOworICAgICAg
ICBsb29wX2NvdW50ID0gY0xvb3BDb3VudE5vdFNlZW47CisgICAgICAgIGNvdW50ID0gMDsKKyAg
ICB9CisKKyAgICB+R0lGSW1hZ2VSZWFkZXIoKSB7CisgICAgICAgIGNsb3NlKCk7CisgICAgfQor
CisgICAgdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgZGVsZXRlIFtdZ2xvYmFsX2NvbG9ybWFwOwor
ICAgICAgICBnbG9iYWxfY29sb3JtYXAgPSAwOworICAgICAgICBkZWxldGUgZnJhbWVfcmVhZGVy
OworICAgICAgICBmcmFtZV9yZWFkZXIgPSAwOworICAgIH0KKworICAgIGJvb2wgcmVhZChjb25z
dCB1bnNpZ25lZCBjaGFyICogYnVmLCB1bnNpZ25lZCBpbnQgbnVtYnl0ZXMsIAorICAgICAgICAg
ICAgICBXZWJDb3JlOjpHSUZJbWFnZURlY29kZXI6OkdJRlF1ZXJ5IHF1ZXJ5ID0gV2ViQ29yZTo6
R0lGSW1hZ2VEZWNvZGVyOjpHSUZGdWxsUXVlcnksIHVuc2lnbmVkIGhhbHRBdEZyYW1lID0gLTEp
OworCitwcml2YXRlOgorICAgIHZvaWQgb3V0cHV0X3JvdygpOworICAgIGludCBkb19sencoY29u
c3QgdW5zaWduZWQgY2hhciAqcSk7Cit9OworCisjZW5kaWYKKwpJbmRleDogcGxhdGZvcm0vaW1h
Z2UtZGVjb2RlcnMvc2tpYS9KUEVHSW1hZ2VEZWNvZGVyLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBwbGF0
Zm9ybS9pbWFnZS1kZWNvZGVycy9za2lhL0pQRUdJbWFnZURlY29kZXIuY3BwCShyZXZpc2lvbiA0
MDE2NCkJKGZyb20gcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvanBlZy9KUEVHSW1hZ2VEZWNvZGVy
LmNwcDo0MDE2NCkKKysrIHBsYXRmb3JtL2ltYWdlLWRlY29kZXJzL3NraWEvSlBFR0ltYWdlRGVj
b2Rlci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1MzEgQEAKKy8qCisgKiBDb3B5cmln
aHQgKEMpIDIwMDYgQXBwbGUgQ29tcHV0ZXIsIEluYy4KKyAqCisgKiBQb3J0aW9ucyBhcmUgQ29w
eXJpZ2h0IChDKSAyMDAxLTYgbW96aWxsYS5vcmcKKyAqCisgKiBPdGhlciBjb250cmlidXRvcnM6
CisgKiAgIFN0dWFydCBQYXJtZW50ZXIgPHN0dWFydEBtb3ppbGxhLmNvbT4KKyAqCisgKiBUaGlz
IGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29y
CisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwg
UHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3Vu
ZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91
ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0
cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhP
VVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAq
IE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNl
ZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRh
aWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBM
ZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7
IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4s
IDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEg
IFVTQQorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5
IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiBlaXRoZXIgdGhlIE1vemlsbGEgUHVibGlj
IExpY2Vuc2UgVmVyc2lvbiAxLjEsIGZvdW5kIGF0CisgKiBodHRwOi8vd3d3Lm1vemlsbGEub3Jn
L01QTC8gKHRoZSAiTVBMIikgb3IgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBW
ZXJzaW9uIDIuMCwgZm91bmQgYXQgaHR0cDovL3d3dy5mc2Yub3JnL2NvcHlsZWZ0L2dwbC5odG1s
CisgKiAodGhlICJHUEwiKSwgaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgTVBM
IG9yIHRoZSBHUEwgYXJlCisgKiBhcHBsaWNhYmxlIGluc3RlYWQgb2YgdGhvc2UgYWJvdmUuICBJ
ZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91cgorICogdmVyc2lvbiBvZiB0aGlzIGZpbGUg
b25seSB1bmRlciB0aGUgdGVybXMgb2Ygb25lIG9mIHRob3NlIHR3bworICogbGljZW5zZXMgKHRo
ZSBNUEwgb3IgdGhlIEdQTCkgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8gdXNlIHlvdXIKKyAq
IHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSBMR1BMLCBpbmRpY2F0ZSB5b3VyIGRlY2lz
aW9uIGJ5CisgKiBkZWxldGluZ3RoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0g
d2l0aCB0aGUgbm90aWNlIGFuZAorICogb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUg
TVBMIG9yIHRoZSBHUEwsIGFzIHRoZSBjYXNlIG1heSBiZS4KKyAqIElmIHlvdSBkbyBub3QgZGVs
ZXRlIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIKKyAqIHZl
cnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIGFueSBvZiB0aGUgTEdQTCwgdGhlIE1QTCBvciB0aGUg
R1BMLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJKUEVHSW1hZ2VEZWNv
ZGVyLmgiCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2lmIFBM
QVRGT1JNKENBSVJPKSB8fCBQTEFURk9STShRVCkgfHwgUExBVEZPUk0oV1gpCisKKyNpZiBDT01Q
SUxFUihNU1ZDKQorLy8gUmVtb3ZlIHdhcm5pbmdzIGZyb20gd2FybmluZyBsZXZlbCA0LgorI3By
YWdtYSB3YXJuaW5nKGRpc2FibGUgOiA0NjExKSAvLyB3YXJuaW5nIEM0NjExOiBpbnRlcmFjdGlv
biBiZXR3ZWVuICdfc2V0am1wJyBhbmQgQysrIG9iamVjdCBkZXN0cnVjdGlvbiBpcyBub24tcG9y
dGFibGUKKworLy8gaWYgQUREUkVTU19UQUdfQklUIGlzIGRmaW5lZCwgSU5UMzIgaGFzIGJlZW4g
ZGVjbGFyZWQgYXMgYSB0eXBlZGVmIGluIHRoZSBQbGF0Zm9ybVNESyAoQmFzZVRzZC5oKSwKKy8v
IHNvIHdlIG5lZWQgdG8gc3RvcCBqcGVnbGliLmggZnJvbSB0cnlpbmcgdG8gI2RlZmluZSBpdCAK
Ky8vIHNlZSBoZXJlIGZvciBtb3JlIGluZm86IGh0dHA6Ly93d3cuY3lnd2luLmNvbS9tbC9jeWd3
aW4vMjAwNC0wNy9tc2cwMTA1MS5odG1sCisjIGlmIGRlZmluZWQoQUREUkVTU19UQUdfQklUKSAm
JiAhZGVmaW5lZChYTURfSCkKKyMgIGRlZmluZSBYTURfSAorIyAgZGVmaW5lIFZUS19KUEVHX1hN
RF9ICisjIGVuZGlmCisjZW5kaWYgLy8gQ09NUElMRVIoTVNWQykKKworZXh0ZXJuICJDIiB7Cisj
aW5jbHVkZSAianBlZ2xpYi5oIgorfQorCisjaWYgQ09NUElMRVIoTVNWQykKKyMgaWYgZGVmaW5l
ZChWVEtfSlBFR19YTURfSCkKKyMgIHVuZGVmIFZUS19KUEVHX1hNRF9ICisjICB1bmRlZiBYTURf
SAorIyBlbmRpZgorI2VuZGlmIC8vIENPTVBJTEVSKE1TVkMpCisKKyNpbmNsdWRlIDxzZXRqbXAu
aD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitzdHJ1Y3QgZGVjb2Rlcl9lcnJvcl9tZ3Igewor
ICAgIHN0cnVjdCBqcGVnX2Vycm9yX21nciBwdWI7ICAvKiAicHVibGljIiBmaWVsZHMgZm9yIElK
RyBsaWJyYXJ5Ki8KKyAgICBqbXBfYnVmIHNldGptcF9idWZmZXI7ICAgICAgLyogRm9yIGhhbmRs
aW5nIGNhdGFzdHJvcGljIGVycm9ycyAqLworfTsKKworZW51bSBqc3RhdGUgeworICAgIEpQRUdf
SEVBREVSLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVhZGluZyBKRklGIGhlYWRlcnMg
Ki8KKyAgICBKUEVHX1NUQVJUX0RFQ09NUFJFU1MsCisgICAgSlBFR19ERUNPTVBSRVNTX1BST0dS
RVNTSVZFLCAgICAgICAgICAvKiBPdXRwdXQgcHJvZ3Jlc3NpdmUgcGl4ZWxzICovCisgICAgSlBF
R19ERUNPTVBSRVNTX1NFUVVFTlRJQUwsICAgICAgICAgICAvKiBPdXRwdXQgc2VxdWVudGlhbCBw
aXhlbHMgKi8KKyAgICBKUEVHX0RPTkUsCisgICAgSlBFR19TSU5LX05PTl9KUEVHX1RSQUlMRVIs
ICAgICAgICAgIC8qIFNvbWUgaW1hZ2UgZmlsZXMgaGF2ZSBhICovCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vbi1KUEVHIHRyYWlsZXIgKi8KKyAgICBKUEVH
X0VSUk9SICAgIAorfTsKKwordm9pZCBpbml0X3NvdXJjZShqX2RlY29tcHJlc3NfcHRyIGpkKTsK
K2Jvb2xlYW4gZmlsbF9pbnB1dF9idWZmZXIoal9kZWNvbXByZXNzX3B0ciBqZCk7Cit2b2lkIHNr
aXBfaW5wdXRfZGF0YShqX2RlY29tcHJlc3NfcHRyIGpkLCBsb25nIG51bV9ieXRlcyk7Cit2b2lk
IHRlcm1fc291cmNlKGpfZGVjb21wcmVzc19wdHIgamQpOwordm9pZCBlcnJvcl9leGl0KGpfY29t
bW9uX3B0ciBjaW5mbyk7CisKKy8qCisgKiAgSW1wbGVtZW50YXRpb24gb2YgYSBKUEVHIHNyYyBv
YmplY3QgdGhhdCB1bmRlcnN0YW5kcyBvdXIgc3RhdGUgbWFjaGluZQorICovCitzdHJ1Y3QgZGVj
b2Rlcl9zb3VyY2VfbWdyIHsKKyAgLyogcHVibGljIGZpZWxkczsgbXVzdCBiZSBmaXJzdCBpbiB0
aGlzIHN0cnVjdCEgKi8KKyAgc3RydWN0IGpwZWdfc291cmNlX21nciBwdWI7CisKKyAgSlBFR0lt
YWdlUmVhZGVyICpkZWNvZGVyOworfTsKKworY2xhc3MgSlBFR0ltYWdlUmVhZGVyCit7CitwdWJs
aWM6CisgICAgSlBFR0ltYWdlUmVhZGVyKEpQRUdJbWFnZURlY29kZXIqIGRlY29kZXIpCisgICAg
ICAgIDogbV9kZWNvZGVyKGRlY29kZXIpCisgICAgICAgICwgbV9idWZmZXJMZW5ndGgoMCkKKyAg
ICAgICAgLCBtX2J5dGVzVG9Ta2lwKDApCisgICAgICAgICwgbV9zdGF0ZShKUEVHX0hFQURFUikK
KyAgICAgICAgLCBtX3NhbXBsZXMoMCkKKyAgICB7CisgICAgICAgIG1lbXNldCgmbV9pbmZvLCAw
LCBzaXplb2YoanBlZ19kZWNvbXByZXNzX3N0cnVjdCkpOworIAorICAgICAgICAvKiBXZSBzZXQg
dXAgdGhlIG5vcm1hbCBKUEVHIGVycm9yIHJvdXRpbmVzLCB0aGVuIG92ZXJyaWRlIGVycm9yX2V4
aXQuICovCisgICAgICAgIG1faW5mby5lcnIgPSBqcGVnX3N0ZF9lcnJvcigmbV9lcnIucHViKTsK
KyAgICAgICAgbV9lcnIucHViLmVycm9yX2V4aXQgPSBlcnJvcl9leGl0OworCisgICAgICAgIC8q
IEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIEpQRUcgZGVjb21wcmVzc2lvbiBvYmplY3QgKi8KKyAg
ICAgICAganBlZ19jcmVhdGVfZGVjb21wcmVzcygmbV9pbmZvKTsKKyAgCisgICAgICAgIGRlY29k
ZXJfc291cmNlX21nciogc3JjID0gMDsKKyAgICAgICAgaWYgKCFtX2luZm8uc3JjKSB7CisgICAg
ICAgICAgICBzcmMgPSAoZGVjb2Rlcl9zb3VyY2VfbWdyKilmYXN0Q2FsbG9jKHNpemVvZihkZWNv
ZGVyX3NvdXJjZV9tZ3IpLCAxKTsKKyAgICAgICAgICAgIGlmICghc3JjKSB7CisgICAgICAgICAg
ICAgICAgbV9zdGF0ZSA9IEpQRUdfRVJST1I7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAg
ICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbV9pbmZvLnNyYyA9IChqcGVnX3NvdXJj
ZV9tZ3IqKXNyYzsKKworICAgICAgICAvKiBTZXQgdXAgY2FsbGJhY2sgZnVuY3Rpb25zLiAqLwor
ICAgICAgICBzcmMtPnB1Yi5pbml0X3NvdXJjZSA9IGluaXRfc291cmNlOworICAgICAgICBzcmMt
PnB1Yi5maWxsX2lucHV0X2J1ZmZlciA9IGZpbGxfaW5wdXRfYnVmZmVyOworICAgICAgICBzcmMt
PnB1Yi5za2lwX2lucHV0X2RhdGEgPSBza2lwX2lucHV0X2RhdGE7CisgICAgICAgIHNyYy0+cHVi
LnJlc3luY190b19yZXN0YXJ0ID0ganBlZ19yZXN5bmNfdG9fcmVzdGFydDsKKyAgICAgICAgc3Jj
LT5wdWIudGVybV9zb3VyY2UgPSB0ZXJtX3NvdXJjZTsKKyAgICAgICAgc3JjLT5kZWNvZGVyID0g
dGhpczsKKyAgICB9CisKKyAgICB+SlBFR0ltYWdlUmVhZGVyKCkKKyAgICB7CisgICAgICAgIGNs
b3NlKCk7CisgICAgfQorCisgICAgdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgZGVjb2Rlcl9zb3Vy
Y2VfbWdyKiBzcmMgPSAoZGVjb2Rlcl9zb3VyY2VfbWdyKiltX2luZm8uc3JjOworICAgICAgICBp
ZiAoc3JjKQorICAgICAgICAgICAgZmFzdEZyZWUoc3JjKTsKKyAgICAgICAgbV9pbmZvLnNyYyA9
IDA7CisKKyAgICAgICAganBlZ19kZXN0cm95X2RlY29tcHJlc3MoJm1faW5mbyk7CisgICAgfQor
CisgICAgdm9pZCBza2lwQnl0ZXMobG9uZyBudW1fYnl0ZXMpIHsKKyAgICAgICAgZGVjb2Rlcl9z
b3VyY2VfbWdyKiBzcmMgPSAoZGVjb2Rlcl9zb3VyY2VfbWdyKiltX2luZm8uc3JjOworICAgICAg
ICBsb25nIGJ5dGVzVG9Ta2lwID0gc3RkOjptaW4obnVtX2J5dGVzLCAobG9uZylzcmMtPnB1Yi5i
eXRlc19pbl9idWZmZXIpOworICAgICAgICBzcmMtPnB1Yi5ieXRlc19pbl9idWZmZXIgLT0gKHNp
emVfdClieXRlc1RvU2tpcDsKKyAgICAgICAgc3JjLT5wdWIubmV4dF9pbnB1dF9ieXRlICs9IGJ5
dGVzVG9Ta2lwOworICAgIAorICAgICAgICBpZiAobnVtX2J5dGVzID4gYnl0ZXNUb1NraXApCisg
ICAgICAgICAgICBtX2J5dGVzVG9Ta2lwID0gKHNpemVfdCkobnVtX2J5dGVzIC0gYnl0ZXNUb1Nr
aXApOworICAgICAgICBlbHNlCisgICAgICAgICAgICBtX2J5dGVzVG9Ta2lwID0gMDsKKyAgICB9
CisKKyAgICBib29sIGRlY29kZShjb25zdCBWZWN0b3I8Y2hhcj4mIGRhdGEsIGJvb2wgc2l6ZU9u
bHkpIHsKKyAgICAgICAgbV9kZWNvZGluZ1NpemVPbmx5ID0gc2l6ZU9ubHk7CisgICAgICAgIAor
ICAgICAgICB1bnNpZ25lZCBuZXdCeXRlQ291bnQgPSBkYXRhLnNpemUoKSAtIG1fYnVmZmVyTGVu
Z3RoOworICAgICAgICB1bnNpZ25lZCByZWFkT2Zmc2V0ID0gbV9idWZmZXJMZW5ndGggLSBtX2lu
Zm8uc3JjLT5ieXRlc19pbl9idWZmZXI7CisKKyAgICAgICAgbV9pbmZvLnNyYy0+Ynl0ZXNfaW5f
YnVmZmVyICs9IG5ld0J5dGVDb3VudDsKKyAgICAgICAgbV9pbmZvLnNyYy0+bmV4dF9pbnB1dF9i
eXRlID0gKEpPQ1RFVCopKGRhdGEuZGF0YSgpKSArIHJlYWRPZmZzZXQ7CisgICAgICAgIAorICAg
ICAgICAvLyBJZiB3ZSBzdGlsbCBoYXZlIGJ5dGVzIHRvIHNraXAsIHRyeSB0byBza2lwIHRob3Nl
IG5vdy4KKyAgICAgICAgaWYgKG1fYnl0ZXNUb1NraXApCisgICAgICAgICAgICBza2lwQnl0ZXMo
bV9ieXRlc1RvU2tpcCk7CisKKyAgICAgICAgbV9idWZmZXJMZW5ndGggPSBkYXRhLnNpemUoKTsK
KyAgICAgICAgCisgICAgICAgIC8vIFdlIG5lZWQgdG8gZG8gdGhlIHNldGptcCBoZXJlLiBPdGhl
cndpc2UgYmFkIHRoaW5ncyB3aWxsIGhhcHBlbgorICAgICAgICBpZiAoc2V0am1wKG1fZXJyLnNl
dGptcF9idWZmZXIpKSB7CisgICAgICAgICAgICBtX3N0YXRlID0gSlBFR19TSU5LX05PTl9KUEVH
X1RSQUlMRVI7CisgICAgICAgICAgICBjbG9zZSgpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChtX3N0YXRlKSB7CisgICAgICAgICAgICBj
YXNlIEpQRUdfSEVBREVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFJlYWQg
ZmlsZSBwYXJhbWV0ZXJzIHdpdGgganBlZ19yZWFkX2hlYWRlcigpICovCisgICAgICAgICAgICAg
ICAgaWYgKGpwZWdfcmVhZF9oZWFkZXIoJm1faW5mbywgdHJ1ZSkgPT0gSlBFR19TVVNQRU5ERUQp
CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOyAvKiBJL08gc3VzcGVuc2lvbiAqLwor
CisgICAgICAgICAgICAgICAgLyogbGV0IGxpYmpwZWcgdGFrZSBjYXJlIG9mIGdyYXktPlJHQiBh
bmQgWUNiQ3ItPlJHQiBjb252ZXJzaW9ucyAqLworICAgICAgICAgICAgICAgIHN3aXRjaCAobV9p
bmZvLmpwZWdfY29sb3Jfc3BhY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBKQ1NfR1JB
WVNDQUxFOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEpDU19SR0I6CisgICAgICAgICAgICAg
ICAgICAgIGNhc2UgSkNTX1lDYkNyOgorICAgICAgICAgICAgICAgICAgICAgICAgbV9pbmZvLm91
dF9jb2xvcl9zcGFjZSA9IEpDU19SR0I7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgICAgICAgICAgICAgY2FzZSBKQ1NfQ01ZSzoKKyAgICAgICAgICAgICAgICAgICAg
Y2FzZSBKQ1NfWUNDSzoKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAg
ICAgICAgICAgICAgIG1fc3RhdGUgPSBKUEVHX0VSUk9SOworICAgICAgICAgICAgICAgICAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8q
CisgICAgICAgICAgICAgICAgICogRG9uJ3QgYWxsb2NhdGUgYSBnaWFudCBhbmQgc3VwZXJmbHVv
dXMgbWVtb3J5IGJ1ZmZlcgorICAgICAgICAgICAgICAgICAqIHdoZW4gdGhlIGltYWdlIGlzIGEg
c2VxdWVudGlhbCBKUEVHLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIG1f
aW5mby5idWZmZXJlZF9pbWFnZSA9IGpwZWdfaGFzX211bHRpcGxlX3NjYW5zKCZtX2luZm8pOwor
CisgICAgICAgICAgICAgICAgLyogVXNlZCB0byBzZXQgdXAgaW1hZ2Ugc2l6ZSBzbyBhcnJheXMg
Y2FuIGJlIGFsbG9jYXRlZCAqLworICAgICAgICAgICAgICAgIGpwZWdfY2FsY19vdXRwdXRfZGlt
ZW5zaW9ucygmbV9pbmZvKTsKKworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAg
ICogTWFrZSBhIG9uZS1yb3ctaGlnaCBzYW1wbGUgYXJyYXkgdGhhdCB3aWxsIGdvIGF3YXkKKyAg
ICAgICAgICAgICAgICAgKiB3aGVuIGRvbmUgd2l0aCBpbWFnZS4gQWx3YXlzIG1ha2UgaXQgYmln
IGVub3VnaCB0bworICAgICAgICAgICAgICAgICAqIGhvbGQgYW4gUkdCIHJvdy4gIFNpbmNlIHRo
aXMgdXNlcyB0aGUgSUpHIG1lbW9yeQorICAgICAgICAgICAgICAgICAqIG1hbmFnZXIsIGl0IG11
c3QgYmUgYWxsb2NhdGVkIGJlZm9yZSB0aGUgY2FsbCB0bworICAgICAgICAgICAgICAgICAqIGpw
ZWdfc3RhcnRfY29tcHJlc3MoKS4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAg
ICBpbnQgcm93X3N0cmlkZSA9IG1faW5mby5vdXRwdXRfd2lkdGggKiA0OyAvLyBSR0JBIGJ1ZmZl
cgorCisKKyAgICAgICAgICAgICAgICBtX3NhbXBsZXMgPSAoKm1faW5mby5tZW0tPmFsbG9jX3Nh
cnJheSkoKGpfY29tbW9uX3B0cikgJm1faW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBKUE9PTF9JTUFHRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICByb3dfc3RyaWRlLCAxKTsKKworICAgICAgICAgICAgICAgIG1fc3Rh
dGUgPSBKUEVHX1NUQVJUX0RFQ09NUFJFU1M7CisKKyAgICAgICAgICAgICAgICAvLyBXZSBjYW4g
ZmlsbCBpbiB0aGUgc2l6ZSBub3cgdGhhdCB0aGUgaGVhZGVyIGlzIGF2YWlsYWJsZS4KKyAgICAg
ICAgICAgICAgICBtX2RlY29kZXItPnNldFNpemUobV9pbmZvLmltYWdlX3dpZHRoLCBtX2luZm8u
aW1hZ2VfaGVpZ2h0KTsKKworICAgICAgICAgICAgICAgIGlmIChtX2RlY29kaW5nU2l6ZU9ubHkp
IHsKKyAgICAgICAgICAgICAgICAgICAgLy8gV2UgY2FuIHN0b3AgaGVyZS4KKyAgICAgICAgICAg
ICAgICAgICAgLy8gUmVkdWNlIG91ciBidWZmZXIgbGVuZ3RoIGFuZCBhdmFpbGFibGUgZGF0YS4K
KyAgICAgICAgICAgICAgICAgICAgbV9idWZmZXJMZW5ndGggLT0gbV9pbmZvLnNyYy0+Ynl0ZXNf
aW5fYnVmZmVyOworICAgICAgICAgICAgICAgICAgICBtX2luZm8uc3JjLT5ieXRlc19pbl9idWZm
ZXIgPSAwOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAg
ICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgSlBFR19TVEFSVF9ERUNPTVBS
RVNTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFNldCBwYXJhbWV0ZXJzIGZv
ciBkZWNvbXByZXNzaW9uICovCisgICAgICAgICAgICAgICAgLyogRklYTUUgLS0gU2hvdWxkIHJl
c2V0IGRjdF9tZXRob2QgYW5kIGRpdGhlciBtb2RlCisgICAgICAgICAgICAgICAgICogZm9yIGZp
bmFsIHBhc3Mgb2YgcHJvZ3Jlc3NpdmUgSlBFRworICAgICAgICAgICAgICAgICAqLworICAgICAg
ICAgICAgICAgIG1faW5mby5kY3RfbWV0aG9kID0gIEpEQ1RfSVNMT1c7CisgICAgICAgICAgICAg
ICAgbV9pbmZvLmRpdGhlcl9tb2RlID0gSkRJVEhFUl9GUzsKKyAgICAgICAgICAgICAgICBtX2lu
Zm8uZG9fZmFuY3lfdXBzYW1wbGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgbV9pbmZvLmVu
YWJsZV8ycGFzc19xdWFudCA9IGZhbHNlOworICAgICAgICAgICAgICAgIG1faW5mby5kb19ibG9j
a19zbW9vdGhpbmcgPSB0cnVlOworCisgICAgICAgICAgICAgICAgLyogU3RhcnQgZGVjb21wcmVz
c29yICovCisgICAgICAgICAgICAgICAgaWYgKCFqcGVnX3N0YXJ0X2RlY29tcHJlc3MoJm1faW5m
bykpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOyAvKiBJL08gc3VzcGVuc2lvbiAq
LworCisgICAgICAgICAgICAgICAgLyogSWYgdGhpcyBpcyBhIHByb2dyZXNzaXZlIEpQRUcgLi4u
ICovCisgICAgICAgICAgICAgICAgbV9zdGF0ZSA9IChtX2luZm8uYnVmZmVyZWRfaW1hZ2UpID8g
SlBFR19ERUNPTVBSRVNTX1BST0dSRVNTSVZFIDogSlBFR19ERUNPTVBSRVNTX1NFUVVFTlRJQUw7
CisgICAgICAgICAgICB9CisgICAgCisgICAgICAgICAgICBjYXNlIEpQRUdfREVDT01QUkVTU19T
RVFVRU5USUFMOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChtX3N0YXRlID09
IEpQRUdfREVDT01QUkVTU19TRVFVRU5USUFMKSB7CisgICAgICAKKyAgICAgICAgICAgICAgICAg
ICAgaWYgKCFtX2RlY29kZXItPm91dHB1dFNjYW5saW5lcygpKQorICAgICAgICAgICAgICAgICAg
ICAgICAgcmV0dXJuIHRydWU7IC8qIEkvTyBzdXNwZW5zaW9uICovCisgICAgICAKKyAgICAgICAg
ICAgICAgICAgICAgLyogSWYgd2UndmUgY29tcGxldGVkIGltYWdlIG91dHB1dCAuLi4gKi8KKyAg
ICAgICAgICAgICAgICAgICAgYXNzZXJ0KG1faW5mby5vdXRwdXRfc2NhbmxpbmUgPT0gbV9pbmZv
Lm91dHB1dF9oZWlnaHQpOworICAgICAgICAgICAgICAgICAgICBtX3N0YXRlID0gSlBFR19ET05F
OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSBK
UEVHX0RFQ09NUFJFU1NfUFJPR1JFU1NJVkU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAg
ICAgaWYgKG1fc3RhdGUgPT0gSlBFR19ERUNPTVBSRVNTX1BST0dSRVNTSVZFKSB7CisgICAgICAg
ICAgICAgICAgICAgIGludCBzdGF0dXM7CisgICAgICAgICAgICAgICAgICAgIGRvIHsKKyAgICAg
ICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGpwZWdfY29uc3VtZV9pbnB1dCgmbV9pbmZvKTsK
KyAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoKHN0YXR1cyAhPSBKUEVHX1NVU1BFTkRFRCkg
JiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXR1cyAhPSBKUEVHX1JFQUNIRURf
RU9JKSk7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgICAg
ICAgICAgICAgaWYgKG1faW5mby5vdXRwdXRfc2NhbmxpbmUgPT0gMCkgeworICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGludCBzY2FuID0gbV9pbmZvLmlucHV0X3NjYW5fbnVtYmVyOworCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgd2UgaGF2ZW4ndCBkaXNwbGF5ZWQgYW55
dGhpbmcgeWV0IChvdXRwdXRfc2Nhbl9udW1iZXI9PTApCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgYW5kIHdlIGhhdmUgZW5vdWdoIGRhdGEgZm9yIGEgY29tcGxldGUgc2NhbiwgZm9yY2Ug
b3V0cHV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGxhc3QgZnVsbCBzY2Fu
ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChtX2luZm8ub3V0cHV0X3NjYW5f
bnVtYmVyID09IDApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzY2FuID4g
MSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXR1cyAhPSBKUEVHX1JF
QUNIRURfRU9JKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nhbi0tOworCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFqcGVnX3N0YXJ0X291dHB1dCgmbV9pbmZv
LCBzY2FuKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8q
IEkvTyBzdXNwZW5zaW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAg
ICAgICAgICAgICAgICAgIGlmIChtX2luZm8ub3V0cHV0X3NjYW5saW5lID09IDB4ZmZmZmZmKQor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faW5mby5vdXRwdXRfc2NhbmxpbmUgPSAwOwor
CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1fZGVjb2Rlci0+b3V0cHV0U2NhbmxpbmVz
KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9pbmZvLm91dHB1dF9zY2Fu
bGluZSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkaWRuJ3QgbWFu
YWdlIHRvIHJlYWQgYW55IGxpbmVzIC0gZmxhZyBzbyB3ZSBkb24ndCBjYWxsCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGpwZWdfc3RhcnRfb3V0cHV0KCkgbXVsdGlwbGUgdGltZXMg
Zm9yIHRoZSBzYW1lIHNjYW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9p
bmZvLm91dHB1dF9zY2FubGluZSA9IDB4ZmZmZmZmOworICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHJldHVybiB0cnVlOyAvKiBJL08gc3VzcGVuc2lvbiAqLworICAgICAgICAgICAgICAgICAg
ICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9pbmZvLm91dHB1dF9zY2Fu
bGluZSA9PSBtX2luZm8ub3V0cHV0X2hlaWdodCkgeworICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGlmICghanBlZ19maW5pc2hfb3V0cHV0KCZtX2luZm8pKQorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLyogSS9PIHN1c3BlbnNpb24gKi8KKworICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGlmIChqcGVnX2lucHV0X2NvbXBsZXRlKCZtX2luZm8pICYm
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtX2luZm8uaW5wdXRfc2Nhbl9udW1i
ZXIgPT0gbV9pbmZvLm91dHB1dF9zY2FuX251bWJlcikpCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pbmZvLm91
dHB1dF9zY2FubGluZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAg
ICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBtX3N0YXRlID0gSlBFR19ET05FOwor
ICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSBKUEVH
X0RPTkU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogRmluaXNoIGRlY29tcHJl
c3Npb24gKi8KKyAgICAgICAgICAgICAgICBpZiAoIWpwZWdfZmluaXNoX2RlY29tcHJlc3MoJm1f
aW5mbykpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOyAvKiBJL08gc3VzcGVuc2lv
biAqLworCisgICAgICAgICAgICAgICAgbV9zdGF0ZSA9IEpQRUdfU0lOS19OT05fSlBFR19UUkFJ
TEVSOworCisgICAgICAgICAgICAgICAgLyogd2UncmUgZG9uZSAqLworICAgICAgICAgICAgICAg
IGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBjYXNlIEpQ
RUdfU0lOS19OT05fSlBFR19UUkFJTEVSOgorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAg
ICAgICAgICBjYXNlIEpQRUdfRVJST1I6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
IH0KKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBqcGVnX2RlY29tcHJlc3Nf
c3RydWN0KiBpbmZvKCkgeyByZXR1cm4gJm1faW5mbzsgfQorICAgIEpTQU1QQVJSQVkgc2FtcGxl
cygpIGNvbnN0IHsgcmV0dXJuIG1fc2FtcGxlczsgfQorICAgIEpQRUdJbWFnZURlY29kZXIqIGRl
Y29kZXIoKSB7IHJldHVybiBtX2RlY29kZXI7IH0KKworcHJpdmF0ZToKKyAgICBKUEVHSW1hZ2VE
ZWNvZGVyKiBtX2RlY29kZXI7CisgICAgdW5zaWduZWQgbV9idWZmZXJMZW5ndGg7CisgICAgaW50
IG1fYnl0ZXNUb1NraXA7CisgICAgYm9vbCBtX2RlY29kaW5nU2l6ZU9ubHk7CisgICAgYm9vbCBt
X2luaXRpYWxpemVkOworCisgICAganBlZ19kZWNvbXByZXNzX3N0cnVjdCBtX2luZm87CisgICAg
ZGVjb2Rlcl9lcnJvcl9tZ3IgbV9lcnI7CisgICAganN0YXRlIG1fc3RhdGU7CisKKyAgICBKU0FN
UEFSUkFZIG1fc2FtcGxlczsKK307CisKKy8qIE92ZXJyaWRlIHRoZSBzdGFuZGFyZCBlcnJvciBt
ZXRob2QgaW4gdGhlIElKRyBKUEVHIGRlY29kZXIgY29kZS4gKi8KK3ZvaWQgZXJyb3JfZXhpdChq
X2NvbW1vbl9wdHIgY2luZm8pCit7CisgICAgLyogUmV0dXJuIGNvbnRyb2wgdG8gdGhlIHNldGpt
cCBwb2ludC4gKi8KKyAgICBkZWNvZGVyX2Vycm9yX21nciAqZXJyID0gKGRlY29kZXJfZXJyb3Jf
bWdyICopIGNpbmZvLT5lcnI7CisgICAgbG9uZ2ptcChlcnItPnNldGptcF9idWZmZXIsIC0xKTsK
K30KKwordm9pZCBpbml0X3NvdXJjZShqX2RlY29tcHJlc3NfcHRyIGpkKQoreworfQorCit2b2lk
IHNraXBfaW5wdXRfZGF0YShqX2RlY29tcHJlc3NfcHRyIGpkLCBsb25nIG51bV9ieXRlcykKK3sK
KyAgICBkZWNvZGVyX3NvdXJjZV9tZ3IgKnNyYyA9IChkZWNvZGVyX3NvdXJjZV9tZ3IgKilqZC0+
c3JjOworICAgIHNyYy0+ZGVjb2Rlci0+c2tpcEJ5dGVzKG51bV9ieXRlcyk7Cit9CisKK2Jvb2xl
YW4gZmlsbF9pbnB1dF9idWZmZXIoal9kZWNvbXByZXNzX3B0ciBqZCkKK3sKKyAgICAvLyBPdXIg
ZGVjb2RlIHN0ZXAgYWx3YXlzIHNldHMgdGhpbmdzIHVwIHByb3Blcmx5LCBzbyBpZiB0aGlzIG1l
dGhvZCBpcyBldmVyCisgICAgLy8gY2FsbGVkLCB0aGVuIHdlIGhhdmUgaGl0IHRoZSBlbmQgb2Yg
dGhlIGJ1ZmZlci4gIEEgcmV0dXJuIHZhbHVlIG9mIEZBTFNFIGluZGljYXRlcworICAgIC8vIHRo
YXQgd2UgaGF2ZSBubyBkYXRhIHRvIHN1cHBseSB5ZXQuCisgICAgcmV0dXJuIGZhbHNlOworfQor
Cit2b2lkIHRlcm1fc291cmNlIChqX2RlY29tcHJlc3NfcHRyIGpkKQoreworICAgIGRlY29kZXJf
c291cmNlX21nciAqc3JjID0gKGRlY29kZXJfc291cmNlX21nciAqKWpkLT5zcmM7CisgICAgc3Jj
LT5kZWNvZGVyLT5kZWNvZGVyKCktPmpwZWdDb21wbGV0ZSgpOworfQorCitKUEVHSW1hZ2VEZWNv
ZGVyOjpKUEVHSW1hZ2VEZWNvZGVyKCkKKzogbV9yZWFkZXIoMCkKK3t9CisKK0pQRUdJbWFnZURl
Y29kZXI6On5KUEVHSW1hZ2VEZWNvZGVyKCkKK3sKKyAgICBkZWxldGUgbV9yZWFkZXI7Cit9CisK
Ky8vIFRha2UgdGhlIGRhdGEgYW5kIHN0b3JlIGl0Lgordm9pZCBKUEVHSW1hZ2VEZWNvZGVyOjpz
ZXREYXRhKFNoYXJlZEJ1ZmZlciogZGF0YSwgYm9vbCBhbGxEYXRhUmVjZWl2ZWQpCit7CisgICAg
aWYgKG1fZmFpbGVkKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBDYWNoZSBvdXIgbmV3IGRh
dGEuCisgICAgSW1hZ2VEZWNvZGVyOjpzZXREYXRhKGRhdGEsIGFsbERhdGFSZWNlaXZlZCk7CisK
KyAgICAvLyBDcmVhdGUgdGhlIEpQRUcgcmVhZGVyLgorICAgIGlmICghbV9yZWFkZXIgJiYgIW1f
ZmFpbGVkKQorICAgICAgICBtX3JlYWRlciA9IG5ldyBKUEVHSW1hZ2VSZWFkZXIodGhpcyk7Cit9
CisKKy8vIFdoZXRoZXIgb3Igbm90IHRoZSBzaXplIGluZm9ybWF0aW9uIGhhcyBiZWVuIGRlY29k
ZWQgeWV0LgorYm9vbCBKUEVHSW1hZ2VEZWNvZGVyOjppc1NpemVBdmFpbGFibGUoKSBjb25zdAor
eworICAgIC8vIElmIHdlIGhhdmUgcGVuZGluZyBkYXRhIHRvIGRlY29kZSwgc2VuZCBpdCB0byB0
aGUgSlBFRyByZWFkZXIgbm93LgorICAgIGlmICghbV9zaXplQXZhaWxhYmxlICYmIG1fcmVhZGVy
KSB7CisgICAgICAgIGlmIChtX2ZhaWxlZCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKwor
ICAgICAgICAvLyBUaGUgZGVjb2RlciB3aWxsIGdvIGFoZWFkIGFuZCBhZ2dyZXNzaXZlbHkgY29u
c3VtZSBldmVyeXRoaW5nIHVwIHVudGlsIHRoZQorICAgICAgICAvLyBzaXplIGlzIGVuY291bnRl
cmVkLgorICAgICAgICBkZWNvZGUodHJ1ZSk7CisgICAgfQorCisgICAgcmV0dXJuIG1fc2l6ZUF2
YWlsYWJsZTsKK30KKworUkdCQTMyQnVmZmVyKiBKUEVHSW1hZ2VEZWNvZGVyOjpmcmFtZUJ1ZmZl
ckF0SW5kZXgoc2l6ZV90IGluZGV4KQoreworICAgIGlmIChpbmRleCkKKyAgICAgICAgcmV0dXJu
IDA7CisKKyAgICBpZiAobV9mcmFtZUJ1ZmZlckNhY2hlLmlzRW1wdHkoKSkKKyAgICAgICAgbV9m
cmFtZUJ1ZmZlckNhY2hlLnJlc2l6ZSgxKTsKKworICAgIFJHQkEzMkJ1ZmZlciYgZnJhbWUgPSBt
X2ZyYW1lQnVmZmVyQ2FjaGVbMF07CisgICAgaWYgKGZyYW1lLnN0YXR1cygpICE9IFJHQkEzMkJ1
ZmZlcjo6RnJhbWVDb21wbGV0ZSAmJiBtX3JlYWRlcikKKyAgICAgICAgLy8gRGVjb2RlIHRoaXMg
ZnJhbWUuCisgICAgICAgIGRlY29kZSgpOworICAgIHJldHVybiAmZnJhbWU7Cit9CisKKy8vIEZl
ZWQgZGF0YSB0byB0aGUgSlBFRyByZWFkZXIuCit2b2lkIEpQRUdJbWFnZURlY29kZXI6OmRlY29k
ZShib29sIHNpemVPbmx5KSBjb25zdAoreworICAgIGlmIChtX2ZhaWxlZCkKKyAgICAgICAgcmV0
dXJuOworCisgICAgbV9mYWlsZWQgPSAhbV9yZWFkZXItPmRlY29kZShtX2RhdGEtPmJ1ZmZlcigp
LCBzaXplT25seSk7CisKKyAgICBpZiAobV9mYWlsZWQgfHwgKCFtX2ZyYW1lQnVmZmVyQ2FjaGUu
aXNFbXB0eSgpICYmIG1fZnJhbWVCdWZmZXJDYWNoZVswXS5zdGF0dXMoKSA9PSBSR0JBMzJCdWZm
ZXI6OkZyYW1lQ29tcGxldGUpKSB7CisgICAgICAgIGRlbGV0ZSBtX3JlYWRlcjsKKyAgICAgICAg
bV9yZWFkZXIgPSAwOworICAgIH0KK30KKworYm9vbCBKUEVHSW1hZ2VEZWNvZGVyOjpvdXRwdXRT
Y2FubGluZXMoKQoreworICAgIGlmIChtX2ZyYW1lQnVmZmVyQ2FjaGUuaXNFbXB0eSgpKQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBSZXNpemUgdG8gdGhlIHdpZHRoIGFuZCBoZWln
aHQgb2YgdGhlIGltYWdlLgorICAgIFJHQkEzMkJ1ZmZlciYgYnVmZmVyID0gbV9mcmFtZUJ1ZmZl
ckNhY2hlWzBdOworICAgIGlmIChidWZmZXIuc3RhdHVzKCkgPT0gUkdCQTMyQnVmZmVyOjpGcmFt
ZUVtcHR5KSB7CisgICAgICAgIC8vIExldCdzIHJlc2l6ZSBvdXIgYnVmZmVyIG5vdyB0byB0aGUg
Y29ycmVjdCB3aWR0aC9oZWlnaHQuCisgICAgICAgIFJHQkEzMkFycmF5JiBieXRlcyA9IGJ1ZmZl
ci5ieXRlcygpOworICAgICAgICBieXRlcy5yZXNpemUobV9zaXplLndpZHRoKCkgKiBtX3NpemUu
aGVpZ2h0KCkpOworCisgICAgICAgIC8vIFVwZGF0ZSBvdXIgc3RhdHVzIHRvIGJlIHBhcnRpYWxs
eSBjb21wbGV0ZS4KKyAgICAgICAgYnVmZmVyLnNldFN0YXR1cyhSR0JBMzJCdWZmZXI6OkZyYW1l
UGFydGlhbCk7CisKKyAgICAgICAgLy8gRm9yIEpQRUdzLCB0aGUgZnJhbWUgYWx3YXlzIGZpbGxz
IHRoZSBlbnRpcmUgaW1hZ2UuCisgICAgICAgIGJ1ZmZlci5zZXRSZWN0KEludFJlY3QoMCwgMCwg
bV9zaXplLndpZHRoKCksIG1fc2l6ZS5oZWlnaHQoKSkpOworCisgICAgICAgIC8vIFdlIGRvbid0
IGhhdmUgYWxwaGEgKHRoaXMgaXMgdGhlIGRlZmF1bHQgd2hlbiB0aGUgYnVmZmVyIGlzIGNvbnN0
cnVjdGVkKS4KKyAgICB9CisKKyAgICBqcGVnX2RlY29tcHJlc3Nfc3RydWN0KiBpbmZvID0gbV9y
ZWFkZXItPmluZm8oKTsKKyAgICBKU0FNUEFSUkFZIHNhbXBsZXMgPSBtX3JlYWRlci0+c2FtcGxl
cygpOworCisgICAgdW5zaWduZWQqIGRzdCA9IGJ1ZmZlci5ieXRlcygpLmRhdGEoKSArIGluZm8t
Pm91dHB1dF9zY2FubGluZSAqIG1fc2l6ZS53aWR0aCgpOworICAgCisgICAgd2hpbGUgKGluZm8t
Pm91dHB1dF9zY2FubGluZSA8IGluZm8tPm91dHB1dF9oZWlnaHQpIHsKKyAgICAgICAgLyogUmVx
dWVzdCBvbmUgc2NhbmxpbmUuICBSZXR1cm5zIDAgb3IgMSBzY2FubGluZXMuICovCisgICAgICAg
IGlmIChqcGVnX3JlYWRfc2NhbmxpbmVzKGluZm8sIHNhbXBsZXMsIDEpICE9IDEpCisgICAgICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIEpTQU1QTEUgKmoxID0gc2FtcGxlc1swXTsKKyAg
ICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGluZm8tPm91dHB1dF93aWR0aDsgKytpKSB7
CisgICAgICAgICAgICB1bnNpZ25lZCByID0gKmoxKys7CisgICAgICAgICAgICB1bnNpZ25lZCBn
ID0gKmoxKys7CisgICAgICAgICAgICB1bnNpZ25lZCBiID0gKmoxKys7CisgICAgICAgICAgICBS
R0JBMzJCdWZmZXI6OnNldFJHQkEoKmRzdCsrLCByLCBnLCBiLCAweEZGKTsKKyAgICAgICAgfQor
CisgICAgICAgIGJ1ZmZlci5lbnN1cmVIZWlnaHQoaW5mby0+b3V0cHV0X3NjYW5saW5lKTsKKyAg
ICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBKUEVHSW1hZ2VEZWNvZGVyOjpqcGVn
Q29tcGxldGUoKQoreworICAgIGlmIChtX2ZyYW1lQnVmZmVyQ2FjaGUuaXNFbXB0eSgpKQorICAg
ICAgICByZXR1cm47CisKKyAgICAvLyBIYW5kIGJhY2sgYW4gYXBwcm9wcmlhdGVseSBzaXplZCBi
dWZmZXIsIGV2ZW4gaWYgdGhlIGltYWdlIGVuZGVkIHVwIGJlaW5nIGVtcHR5LgorICAgIFJHQkEz
MkJ1ZmZlciYgYnVmZmVyID0gbV9mcmFtZUJ1ZmZlckNhY2hlWzBdOworICAgIGJ1ZmZlci5zZXRT
dGF0dXMoUkdCQTMyQnVmZmVyOjpGcmFtZUNvbXBsZXRlKTsKK30KKworfQorCisjZW5kaWYgLy8g
UExBVEZPUk0oQ0FJUk8pCkluZGV4OiBwbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9za2lhL0pQRUdJ
bWFnZURlY29kZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBwbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9za2lh
L0pQRUdJbWFnZURlY29kZXIuaAkocmV2aXNpb24gNDAxNjQpCShmcm9tIHBsYXRmb3JtL2ltYWdl
LWRlY29kZXJzL2pwZWcvSlBFR0ltYWdlRGVjb2Rlci5oOjQwMTY0KQorKysgcGxhdGZvcm0vaW1h
Z2UtZGVjb2RlcnMvc2tpYS9KUEVHSW1hZ2VEZWNvZGVyLmgJKHdvcmtpbmcgY29weSkKQEAgLTAs
MCArMSw3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBBcHBsZSBDb21wdXRlciwgSW5j
LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICog
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBKUEVHX0RFQ09ERVJfSF8K
KyNkZWZpbmUgSlBFR19ERUNPREVSX0hfCisKKyNpbmNsdWRlICJJbWFnZURlY29kZXIuaCIKKwor
bmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBKUEVHSW1hZ2VSZWFkZXI7CisKKy8vIFRoaXMg
Y2xhc3MgZGVjb2RlcyB0aGUgSlBFRyBpbWFnZSBmb3JtYXQuCitjbGFzcyBKUEVHSW1hZ2VEZWNv
ZGVyIDogcHVibGljIEltYWdlRGVjb2RlcgoreworcHVibGljOgorICAgIEpQRUdJbWFnZURlY29k
ZXIoKTsKKyAgICB+SlBFR0ltYWdlRGVjb2RlcigpOworCisgICAgdmlydHVhbCBTdHJpbmcgZmls
ZW5hbWVFeHRlbnNpb24oKSBjb25zdCB7IHJldHVybiAianBnIjsgfQorCisgICAgLy8gVGFrZSB0
aGUgZGF0YSBhbmQgc3RvcmUgaXQuCisgICAgdmlydHVhbCB2b2lkIHNldERhdGEoU2hhcmVkQnVm
ZmVyKiBkYXRhLCBib29sIGFsbERhdGFSZWNlaXZlZCk7CisKKyAgICAvLyBXaGV0aGVyIG9yIG5v
dCB0aGUgc2l6ZSBpbmZvcm1hdGlvbiBoYXMgYmVlbiBkZWNvZGVkIHlldC4KKyAgICB2aXJ0dWFs
IGJvb2wgaXNTaXplQXZhaWxhYmxlKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIFJHQkEzMkJ1ZmZl
ciogZnJhbWVCdWZmZXJBdEluZGV4KHNpemVfdCBpbmRleCk7CisgICAgCisgICAgdmlydHVhbCBi
b29sIHN1cHBvcnRzQWxwaGEoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCisgICAgdm9pZCBk
ZWNvZGUoYm9vbCBzaXplT25seSA9IGZhbHNlKSBjb25zdDsKKworICAgIEpQRUdJbWFnZVJlYWRl
ciogcmVhZGVyKCkgeyByZXR1cm4gbV9yZWFkZXI7IH0KKworICAgIHZvaWQgc2V0U2l6ZShpbnQg
d2lkdGgsIGludCBoZWlnaHQpIHsKKyAgICAgICAgaWYgKCFtX3NpemVBdmFpbGFibGUpIHsKKyAg
ICAgICAgICAgIG1fc2l6ZUF2YWlsYWJsZSA9IHRydWU7CisgICAgICAgICAgICBtX3NpemUgPSBJ
bnRTaXplKHdpZHRoLCBoZWlnaHQpOworICAgICAgICB9CisgICAgfQorCisgICAgYm9vbCBvdXRw
dXRTY2FubGluZXMoKTsKKyAgICB2b2lkIGpwZWdDb21wbGV0ZSgpOworCitwcml2YXRlOgorICAg
IG11dGFibGUgSlBFR0ltYWdlUmVhZGVyKiBtX3JlYWRlcjsKK307CisKK30KKworI2VuZGlmCklu
ZGV4OiBwbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9za2lhL1BOR0ltYWdlRGVjb2Rlci5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvc2tpYS9QTkdJbWFnZURlY29kZXIu
Y3BwCShyZXZpc2lvbiA0MDE2NCkJKGZyb20gcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvcG5nL1BO
R0ltYWdlRGVjb2Rlci5jcHA6NDAxNjQpCisrKyBwbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9za2lh
L1BOR0ltYWdlRGVjb2Rlci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MDMgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgQXBwbGUgQ29tcHV0ZXIsIEluYy4KKyAqCisgKiBQb3J0
aW9ucyBhcmUgQ29weXJpZ2h0IChDKSAyMDAxIG1vemlsbGEub3JnCisgKgorICogT3RoZXIgY29u
dHJpYnV0b3JzOgorICogICBTdHVhcnQgUGFybWVudGVyIDxzdHVhcnRAbW96aWxsYS5jb20+Cisg
KgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRl
IGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3Nl
ciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29m
dHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwg
b3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJh
cnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAq
IGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJh
bnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV
UlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9y
IG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9m
IHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhp
cyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0
aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAw
MjExMC0xMzAxICBVU0EKKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhp
cyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcworICogb2YgZWl0aGVyIHRoZSBNb3pp
bGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xLCBmb3VuZCBhdAorICogaHR0cDovL3d3dy5t
b3ppbGxhLm9yZy9NUEwvICh0aGUgIk1QTCIpIG9yIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAq
IExpY2Vuc2UgVmVyc2lvbiAyLjAsIGZvdW5kIGF0IGh0dHA6Ly93d3cuZnNmLm9yZy9jb3B5bGVm
dC9ncGwuaHRtbAorICogKHRoZSAiR1BMIiksIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMg
b2YgdGhlIE1QTCBvciB0aGUgR1BMIGFyZQorICogYXBwbGljYWJsZSBpbnN0ZWFkIG9mIHRob3Nl
IGFib3ZlLiAgSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIKKyAqIHZlcnNpb24gb2Yg
dGhpcyBmaWxlIG9ubHkgdW5kZXIgdGhlIHRlcm1zIG9mIG9uZSBvZiB0aG9zZSB0d28KKyAqIGxp
Y2Vuc2VzICh0aGUgTVBMIG9yIHRoZSBHUEwpIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvIHVz
ZSB5b3VyCisgKiB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgTEdQTCwgaW5kaWNhdGUg
eW91ciBkZWNpc2lvbiBieQorICogZGVsZXRpbmd0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVw
bGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZSBhbmQKKyAqIG90aGVyIHByb3Zpc2lvbnMgcmVxdWly
ZWQgYnkgdGhlIE1QTCBvciB0aGUgR1BMLCBhcyB0aGUgY2FzZSBtYXkgYmUuCisgKiBJZiB5b3Ug
ZG8gbm90IGRlbGV0ZSB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5
b3VyCisgKiB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciBhbnkgb2YgdGhlIExHUEwsIHRoZSBN
UEwgb3IgdGhlIEdQTC4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiUE5H
SW1hZ2VEZWNvZGVyLmgiCisjaW5jbHVkZSAicG5nLmgiCisjaW5jbHVkZSAiYXNzZXJ0LmgiCisK
KyNpZiBQTEFURk9STShDQUlSTykgfHwgUExBVEZPUk0oUVQpIHx8IFBMQVRGT1JNKFdYKQorCisj
aWYgQ09NUElMRVIoTVNWQykKKy8vIFJlbW92ZSB3YXJuaW5ncyBmcm9tIHdhcm5pbmcgbGV2ZWwg
NC4KKyNwcmFnbWEgd2FybmluZyhkaXNhYmxlIDogNDYxMSkgLy8gd2FybmluZyBDNDYxMTogaW50
ZXJhY3Rpb24gYmV0d2VlbiAnX3NldGptcCcgYW5kIEMrKyBvYmplY3QgZGVzdHJ1Y3Rpb24gaXMg
bm9uLXBvcnRhYmxlCisjZW5kaWYKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCisvLyBHYW1tYSBj
b25zdGFudHMuCitjb25zdCBkb3VibGUgY01heEdhbW1hID0gMjE0NzQuODM7Citjb25zdCBkb3Vi
bGUgY0RlZmF1bHRHYW1tYSA9IDIuMjsKK2NvbnN0IGRvdWJsZSBjSW52ZXJzZUdhbW1hID0gMC40
NTQ1NTsKKworLy8gUHJvdGVjdCBhZ2FpbnN0IGxhcmdlIFBOR3MuIFNlZSBNb3ppbGxhJ3MgYnVn
ICMyNTEzODEgZm9yIG1vcmUgaW5mby4KK2NvbnN0IGxvbmcgY01heFBOR1NpemUgPSAxMDAwMDAw
TDsKKworLy8gQ2FsbGVkIGlmIHRoZSBkZWNvZGluZyBvZiB0aGUgaW1hZ2UgZmFpbHMuCitzdGF0
aWMgdm9pZCBQTkdBUEkgZGVjb2RpbmdGYWlsZWQocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2Nv
bnN0X2NoYXJwIGVycm9yX21zZyk7CisKKy8vIENhbGxiYWNrcyBnaXZlbiB0byB0aGUgcmVhZCBz
dHJ1Y3QuICBUaGUgZmlyc3QgaXMgZm9yIHdhcm5pbmdzICh3ZSB3YW50IHRvIHRyZWF0IGEgcGFy
dGljdWxhciB3YXJuaW5nCisvLyBhcyBhbiBlcnJvciwgd2hpY2ggaXMgd2h5IHdlIGhhdmUgdG8g
cmVnaXN0ZXIgdGhpcyBjYWxsYmFjay4KK3N0YXRpYyB2b2lkIFBOR0FQSSBkZWNvZGluZ1dhcm5p
bmcocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2NvbnN0X2NoYXJwIHdhcm5pbmdfbXNnKTsKKwor
Ly8gQ2FsbGVkIHdoZW4gd2UgaGF2ZSBvYnRhaW5lZCB0aGUgaGVhZGVyIGluZm9ybWF0aW9uIChp
bmNsdWRpbmcgdGhlIHNpemUpLgorc3RhdGljIHZvaWQgUE5HQVBJIGhlYWRlckF2YWlsYWJsZShw
bmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIpOworCisvLyBDYWxsZWQgd2hl
biBhIHJvdyBpcyByZWFkeS4KK3N0YXRpYyB2b2lkIFBOR0FQSSByb3dBdmFpbGFibGUocG5nX3N0
cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwIG5ld19yb3csCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHBuZ191aW50XzMyIHJvd19udW0sIGludCBwYXNzKTsKKworLy8gQ2FsbGVkIHdo
ZW4gd2UgaGF2ZSBjb21wbGV0ZWx5IGZpbmlzaGVkIGRlY29kaW5nIHRoZSBpbWFnZS4KK3N0YXRp
YyB2b2lkIFBOR0FQSSBwbmdDb21wbGV0ZShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3Ag
aW5mb19wdHIpOworCitjbGFzcyBQTkdJbWFnZVJlYWRlcgoreworcHVibGljOgorICAgIFBOR0lt
YWdlUmVhZGVyKFBOR0ltYWdlRGVjb2RlciogZGVjb2RlcikKKyAgICA6IG1fcmVhZE9mZnNldCgw
KSwgbV9kZWNvZGluZ1NpemVPbmx5KGZhbHNlKSwgbV9pbnRlcmxhY2VCdWZmZXIoMCksIG1faGFz
QWxwaGEoMCkKKyAgICB7CisgICAgICAgIG1fcG5nID0gcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdChQ
TkdfTElCUE5HX1ZFUl9TVFJJTkcsIE5VTEwsIGRlY29kaW5nRmFpbGVkLCBkZWNvZGluZ1dhcm5p
bmcpOworICAgICAgICBtX2luZm8gPSBwbmdfY3JlYXRlX2luZm9fc3RydWN0KG1fcG5nKTsKKyAg
ICAgICAgcG5nX3NldF9wcm9ncmVzc2l2ZV9yZWFkX2ZuKG1fcG5nLCBkZWNvZGVyLCBoZWFkZXJB
dmFpbGFibGUsIHJvd0F2YWlsYWJsZSwgcG5nQ29tcGxldGUpOworICAgIH0KKworICAgIH5QTkdJ
bWFnZVJlYWRlcigpCisgICAgeworICAgICAgICBjbG9zZSgpOworICAgIH0KKworICAgIHZvaWQg
Y2xvc2UoKSB7CisgICAgICAgIGlmIChtX3BuZyAmJiBtX2luZm8pCisgICAgICAgICAgICBwbmdf
ZGVzdHJveV9yZWFkX3N0cnVjdCgmbV9wbmcsICZtX2luZm8sIDApOworICAgICAgICBkZWxldGUg
W11tX2ludGVybGFjZUJ1ZmZlcjsKKyAgICAgICAgbV9yZWFkT2Zmc2V0ID0gMDsKKyAgICB9CisK
KyAgICB2b2lkIGRlY29kZShjb25zdCBWZWN0b3I8Y2hhcj4mIGRhdGEsIGJvb2wgc2l6ZU9ubHkp
CisgICAgeworICAgICAgICBtX2RlY29kaW5nU2l6ZU9ubHkgPSBzaXplT25seTsKKworICAgICAg
ICAvLyBXZSBuZWVkIHRvIGRvIHRoZSBzZXRqbXAgaGVyZS4gT3RoZXJ3aXNlIGJhZCB0aGluZ3Mg
d2lsbCBoYXBwZW4KKyAgICAgICAgaWYgKHNldGptcChtX3BuZy0+am1wYnVmKSkgeworICAgICAg
ICAgICAgY2xvc2UoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAg
IC8vIEdvIGFoZWFkIGFuZCBhc3N1bWUgd2UgY29uc3VtZWQgYWxsIHRoZSBkYXRhLiAgSWYgd2Ug
Y29uc3VtZSBsZXNzLCB0aGUKKyAgICAgICAgLy8gY2FsbGJhY2sgd2lsbCBhZGp1c3Qgb3VyIHJl
YWQgb2Zmc2V0IGFjY29yZGluZ2x5LiAgRG8gbm90IGF0dGVtcHQgdG8gYWRqdXN0IHRoZQorICAg
ICAgICAvLyBvZmZzZXQgYWZ0ZXIgcG5nX3Byb2Nlc3NfZGF0YSByZXR1cm5zLgorICAgICAgICB1
bnNpZ25lZCBvZmZzZXQgPSBtX3JlYWRPZmZzZXQ7CisgICAgICAgIHVuc2lnbmVkIHJlbWFpbmlu
ZyA9IGRhdGEuc2l6ZSgpIC0gbV9yZWFkT2Zmc2V0OworICAgICAgICBtX3JlYWRPZmZzZXQgPSBk
YXRhLnNpemUoKTsKKyAgICAgICAgcG5nX3Byb2Nlc3NfZGF0YShtX3BuZywgbV9pbmZvLCAocG5n
X2J5dGVwKShkYXRhLmRhdGEoKSkgKyBvZmZzZXQsIHJlbWFpbmluZyk7CisgICAgfQorCisgICAg
Ym9vbCBkZWNvZGluZ1NpemVPbmx5KCkgY29uc3QgeyByZXR1cm4gbV9kZWNvZGluZ1NpemVPbmx5
OyB9CisgICAgcG5nX3N0cnVjdHAgcG5nUHRyKCkgY29uc3QgeyByZXR1cm4gbV9wbmc7IH0KKyAg
ICBwbmdfaW5mb3AgaW5mb1B0cigpIGNvbnN0IHsgcmV0dXJuIG1faW5mbzsgfQorICAgIHBuZ19i
eXRlcCBpbnRlcmxhY2VCdWZmZXIoKSBjb25zdCB7IHJldHVybiBtX2ludGVybGFjZUJ1ZmZlcjsg
fQorICAgIGJvb2wgaGFzQWxwaGEoKSBjb25zdCB7IHJldHVybiBtX2hhc0FscGhhOyB9CisKKyAg
ICB2b2lkIHNldFJlYWRPZmZzZXQodW5zaWduZWQgb2Zmc2V0KSB7IG1fcmVhZE9mZnNldCA9IG9m
ZnNldDsgfQorICAgIHZvaWQgc2V0SGFzQWxwaGEoYm9vbCBiKSB7IG1faGFzQWxwaGEgPSBiOyB9
CisKKyAgICB2b2lkIGNyZWF0ZUludGVybGFjZUJ1ZmZlcihpbnQgc2l6ZSkgeworICAgICAgICBt
X2ludGVybGFjZUJ1ZmZlciA9IG5ldyBwbmdfYnl0ZVtzaXplXTsKKyAgICB9CisKK3ByaXZhdGU6
CisgICAgdW5zaWduZWQgbV9yZWFkT2Zmc2V0OworICAgIGJvb2wgbV9kZWNvZGluZ1NpemVPbmx5
OworICAgIHBuZ19zdHJ1Y3RwIG1fcG5nOworICAgIHBuZ19pbmZvcCBtX2luZm87CisgICAgcG5n
X2J5dGVwIG1faW50ZXJsYWNlQnVmZmVyOworICAgIGJvb2wgbV9oYXNBbHBoYTsKK307CisKK1BO
R0ltYWdlRGVjb2Rlcjo6UE5HSW1hZ2VEZWNvZGVyKCkKKzogbV9yZWFkZXIoMCkKK3sKKyAgICBt
X2ZyYW1lQnVmZmVyQ2FjaGUucmVzaXplKDEpOworfQorCitQTkdJbWFnZURlY29kZXI6On5QTkdJ
bWFnZURlY29kZXIoKQoreworICAgIGRlbGV0ZSBtX3JlYWRlcjsKK30KKworLy8gVGFrZSB0aGUg
ZGF0YSBhbmQgc3RvcmUgaXQuCit2b2lkIFBOR0ltYWdlRGVjb2Rlcjo6c2V0RGF0YShTaGFyZWRC
dWZmZXIqIGRhdGEsIGJvb2wgYWxsRGF0YVJlY2VpdmVkKQoreworICAgIGlmIChtX2ZhaWxlZCkK
KyAgICAgICAgcmV0dXJuOworCisgICAgLy8gQ2FjaGUgb3VyIG5ldyBkYXRhLgorICAgIEltYWdl
RGVjb2Rlcjo6c2V0RGF0YShkYXRhLCBhbGxEYXRhUmVjZWl2ZWQpOworCisgICAgLy8gQ3JlYXRl
IHRoZSBQTkcgcmVhZGVyLgorICAgIGlmICghbV9yZWFkZXIgJiYgIW1fZmFpbGVkKQorICAgICAg
ICBtX3JlYWRlciA9IG5ldyBQTkdJbWFnZVJlYWRlcih0aGlzKTsKK30KKworLy8gV2hldGhlciBv
ciBub3QgdGhlIHNpemUgaW5mb3JtYXRpb24gaGFzIGJlZW4gZGVjb2RlZCB5ZXQuCitib29sIFBO
R0ltYWdlRGVjb2Rlcjo6aXNTaXplQXZhaWxhYmxlKCkgY29uc3QKK3sKKyAgICAvLyBJZiB3ZSBo
YXZlIHBlbmRpbmcgZGF0YSB0byBkZWNvZGUsIHNlbmQgaXQgdG8gdGhlIFBORyByZWFkZXIgbm93
LgorICAgIGlmICghbV9zaXplQXZhaWxhYmxlICYmIG1fcmVhZGVyKSB7CisgICAgICAgIGlmICht
X2ZhaWxlZCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAvLyBUaGUgZGVj
b2RlciB3aWxsIGdvIGFoZWFkIGFuZCBhZ2dyZXNzaXZlbHkgY29uc3VtZSBldmVyeXRoaW5nIHVw
IHVudGlsIHRoZQorICAgICAgICAvLyBzaXplIGlzIGVuY291bnRlcmVkLgorICAgICAgICBkZWNv
ZGUodHJ1ZSk7CisgICAgfQorCisgICAgcmV0dXJuIG1fc2l6ZUF2YWlsYWJsZTsKK30KKworUkdC
QTMyQnVmZmVyKiBQTkdJbWFnZURlY29kZXI6OmZyYW1lQnVmZmVyQXRJbmRleChzaXplX3QgaW5k
ZXgpCit7CisgICAgaWYgKGluZGV4KQorICAgICAgICByZXR1cm4gMDsKKworICAgIFJHQkEzMkJ1
ZmZlciYgZnJhbWUgPSBtX2ZyYW1lQnVmZmVyQ2FjaGVbMF07CisgICAgaWYgKGZyYW1lLnN0YXR1
cygpICE9IFJHQkEzMkJ1ZmZlcjo6RnJhbWVDb21wbGV0ZSAmJiBtX3JlYWRlcikKKyAgICAgICAg
Ly8gRGVjb2RlIHRoaXMgZnJhbWUuCisgICAgICAgIGRlY29kZSgpOworICAgIHJldHVybiAmZnJh
bWU7Cit9CisKKy8vIEZlZWQgZGF0YSB0byB0aGUgUE5HIHJlYWRlci4KK3ZvaWQgUE5HSW1hZ2VE
ZWNvZGVyOjpkZWNvZGUoYm9vbCBzaXplT25seSkgY29uc3QKK3sKKyAgICBpZiAobV9mYWlsZWQp
CisgICAgICAgIHJldHVybjsKKworICAgIG1fcmVhZGVyLT5kZWNvZGUobV9kYXRhLT5idWZmZXIo
KSwgc2l6ZU9ubHkpOworICAgIAorICAgIGlmIChtX2ZhaWxlZCB8fCAobV9mcmFtZUJ1ZmZlckNh
Y2hlWzBdLnN0YXR1cygpID09IFJHQkEzMkJ1ZmZlcjo6RnJhbWVDb21wbGV0ZSkpIHsKKyAgICAg
ICAgZGVsZXRlIG1fcmVhZGVyOworICAgICAgICBtX3JlYWRlciA9IDA7CisgICAgfQorfQorCit2
b2lkIGRlY29kaW5nRmFpbGVkKHBuZ19zdHJ1Y3RwIHBuZywgcG5nX2NvbnN0X2NoYXJwIGVycm9y
TXNnKQoreworICAgIHN0YXRpY19jYXN0PFBOR0ltYWdlRGVjb2Rlcio+KHBuZ19nZXRfcHJvZ3Jl
c3NpdmVfcHRyKHBuZykpLT5kZWNvZGluZ0ZhaWxlZCgpOworICAgIGxvbmdqbXAocG5nLT5qbXBi
dWYsIDEpOworfQorCit2b2lkIGRlY29kaW5nV2FybmluZyhwbmdfc3RydWN0cCBwbmcsIHBuZ19j
b25zdF9jaGFycCB3YXJuaW5nTXNnKQoreworICAvLyBNb3ppbGxhIGRpZCB0aGlzLCBzbyB3ZSB3
aWxsIHRvby4KKyAgLy8gQ29udmVydCBhIHRSTlMgd2FybmluZyB0byBiZSBhbiBlcnJvciAoZG9j
dW1lbnRlZCBpbiBidWd6aWxsYS5tb3ppbGxhLm9yZyBidWcgIzI1MTM4MSkKKyAgaWYgKCFzdHJu
Y21wKHdhcm5pbmdNc2csICJNaXNzaW5nIFBMVEUgYmVmb3JlIHRSTlMiLCAyNCkpCisgICAgICBw
bmdfZXJyb3IocG5nLCB3YXJuaW5nTXNnKTsKK30KKwordm9pZCBoZWFkZXJBdmFpbGFibGUocG5n
X3N0cnVjdHAgcG5nLCBwbmdfaW5mb3AgaW5mbykKK3sKKyAgICBzdGF0aWNfY2FzdDxQTkdJbWFn
ZURlY29kZXIqPihwbmdfZ2V0X3Byb2dyZXNzaXZlX3B0cihwbmcpKS0+aGVhZGVyQXZhaWxhYmxl
KCk7Cit9CisKK3ZvaWQgUE5HSW1hZ2VEZWNvZGVyOjpoZWFkZXJBdmFpbGFibGUoKQoreworICAg
IHBuZ19zdHJ1Y3RwIHBuZyA9IHJlYWRlcigpLT5wbmdQdHIoKTsKKyAgICBwbmdfaW5mb3AgaW5m
byA9IHJlYWRlcigpLT5pbmZvUHRyKCk7CisgICAgcG5nX3VpbnRfMzIgd2lkdGggPSBwbmctPndp
ZHRoOworICAgIHBuZ191aW50XzMyIGhlaWdodCA9IHBuZy0+aGVpZ2h0OworICAgIAorICAgIC8v
IFByb3RlY3QgYWdhaW5zdCBsYXJnZSBpbWFnZXMuCisgICAgaWYgKHBuZy0+d2lkdGggPiBjTWF4
UE5HU2l6ZSB8fCBwbmctPmhlaWdodCA+IGNNYXhQTkdTaXplKSB7CisgICAgICAgIG1fZmFpbGVk
ID0gdHJ1ZTsKKyAgICAgICAgbG9uZ2ptcChwbmctPmptcGJ1ZiwgMSk7CisgICAgICAgIHJldHVy
bjsKKyAgICB9CisgICAgCisgICAgLy8gV2UgY2FuIGZpbGwgaW4gdGhlIHNpemUgbm93IHRoYXQg
dGhlIGhlYWRlciBpcyBhdmFpbGFibGUuCisgICAgaWYgKCFtX3NpemVBdmFpbGFibGUpIHsKKyAg
ICAgICAgbV9zaXplQXZhaWxhYmxlID0gdHJ1ZTsKKyAgICAgICAgbV9zaXplID0gSW50U2l6ZSh3
aWR0aCwgaGVpZ2h0KTsKKyAgICB9CisKKyAgICBpbnQgYml0RGVwdGgsIGNvbG9yVHlwZSwgaW50
ZXJsYWNlVHlwZSwgY29tcHJlc3Npb25UeXBlLCBmaWx0ZXJUeXBlLCBjaGFubmVsczsKKyAgICBw
bmdfZ2V0X0lIRFIocG5nLCBpbmZvLCAmd2lkdGgsICZoZWlnaHQsICZiaXREZXB0aCwgJmNvbG9y
VHlwZSwKKyAgICAgICAgICAgICAgICAgJmludGVybGFjZVR5cGUsICZjb21wcmVzc2lvblR5cGUs
ICZmaWx0ZXJUeXBlKTsKKworICAgIC8vIFRoZSBvcHRpb25zIHdlIHNldCBoZXJlIG1hdGNoIHdo
YXQgTW96aWxsYSBkb2VzLgorCisgICAgLy8gRXhwYW5kIHRvIGVuc3VyZSB3ZSB1c2UgMjQtYml0
IGZvciBSR0IgYW5kIDMyLWJpdCBmb3IgUkdCQS4KKyAgICBpZiAoY29sb3JUeXBlID09IFBOR19D
T0xPUl9UWVBFX1BBTEVUVEUgfHwKKyAgICAgICAgKGNvbG9yVHlwZSA9PSBQTkdfQ09MT1JfVFlQ
RV9HUkFZICYmIGJpdERlcHRoIDwgOCkpCisgICAgICAgIHBuZ19zZXRfZXhwYW5kKHBuZyk7Cisg
ICAgCisgICAgcG5nX2J5dGVwIHRybnMgPSAwOworICAgIGludCB0cm5zQ291bnQgPSAwOworICAg
IGlmIChwbmdfZ2V0X3ZhbGlkKHBuZywgaW5mbywgUE5HX0lORk9fdFJOUykpIHsKKyAgICAgICAg
cG5nX2dldF90Uk5TKHBuZywgaW5mbywgJnRybnMsICZ0cm5zQ291bnQsIDApOworICAgICAgICBw
bmdfc2V0X2V4cGFuZChwbmcpOworICAgIH0KKworICAgIGlmIChiaXREZXB0aCA9PSAxNikKKyAg
ICAgICAgcG5nX3NldF9zdHJpcF8xNihwbmcpOworCisgICAgaWYgKGNvbG9yVHlwZSA9PSBQTkdf
Q09MT1JfVFlQRV9HUkFZIHx8CisgICAgICAgIGNvbG9yVHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9H
UkFZX0FMUEhBKQorICAgICAgICBwbmdfc2V0X2dyYXlfdG9fcmdiKHBuZyk7CisKKyAgICAvLyBE
ZWFsIHdpdGggZ2FtbWEgYW5kIGtlZXAgaXQgdW5kZXIgb3VyIGNvbnRyb2wuCisgICAgZG91Ymxl
IGdhbW1hOworICAgIGlmIChwbmdfZ2V0X2dBTUEocG5nLCBpbmZvLCAmZ2FtbWEpKSB7CisgICAg
ICAgIGlmICgoZ2FtbWEgPD0gMC4wKSB8fCAoZ2FtbWEgPiBjTWF4R2FtbWEpKSB7CisgICAgICAg
ICAgICBnYW1tYSA9IGNJbnZlcnNlR2FtbWE7CisgICAgICAgICAgICBwbmdfc2V0X2dBTUEocG5n
LCBpbmZvLCBnYW1tYSk7CisgICAgICAgIH0KKyAgICAgICAgcG5nX3NldF9nYW1tYShwbmcsIGNE
ZWZhdWx0R2FtbWEsIGdhbW1hKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBwbmdfc2V0X2dh
bW1hKHBuZywgY0RlZmF1bHRHYW1tYSwgY0ludmVyc2VHYW1tYSk7CisKKyAgICAvLyBUZWxsIGxp
YnBuZyB0byBzZW5kIHVzIHJvd3MgZm9yIGludGVybGFjZWQgcG5ncy4KKyAgICBpZiAoaW50ZXJs
YWNlVHlwZSA9PSBQTkdfSU5URVJMQUNFX0FEQU03KQorICAgICAgICBwbmdfc2V0X2ludGVybGFj
ZV9oYW5kbGluZyhwbmcpOworCisgICAgLy8gVXBkYXRlIG91ciBpbmZvIG5vdworICAgIHBuZ19y
ZWFkX3VwZGF0ZV9pbmZvKHBuZywgaW5mbyk7CisgICAgY2hhbm5lbHMgPSBwbmdfZ2V0X2NoYW5u
ZWxzKHBuZywgaW5mbyk7CisgICAgYXNzZXJ0KGNoYW5uZWxzID09IDMgfHwgY2hhbm5lbHMgPT0g
NCk7CisKKyAgICByZWFkZXIoKS0+c2V0SGFzQWxwaGEoY2hhbm5lbHMgPT0gNCk7CisKKyAgICBp
ZiAocmVhZGVyKCktPmRlY29kaW5nU2l6ZU9ubHkoKSkgeworICAgICAgICAvLyBJZiB3ZSBvbmx5
IG5lZWRlZCB0aGUgc2l6ZSwgaGFsdCB0aGUgcmVhZGVyLiAgICAgCisgICAgICAgIHJlYWRlcigp
LT5zZXRSZWFkT2Zmc2V0KG1fZGF0YS0+c2l6ZSgpIC0gcG5nLT5idWZmZXJfc2l6ZSk7CisgICAg
ICAgIHBuZy0+YnVmZmVyX3NpemUgPSAwOworICAgIH0KK30KKwordm9pZCByb3dBdmFpbGFibGUo
cG5nX3N0cnVjdHAgcG5nLCBwbmdfYnl0ZXAgcm93QnVmZmVyLAorICAgICAgICAgICAgICAgICAg
cG5nX3VpbnRfMzIgcm93SW5kZXgsIGludCBpbnRlcmxhY2VQYXNzKQoreworICAgIHN0YXRpY19j
YXN0PFBOR0ltYWdlRGVjb2Rlcio+KHBuZ19nZXRfcHJvZ3Jlc3NpdmVfcHRyKHBuZykpLT5yb3dB
dmFpbGFibGUocm93QnVmZmVyLCByb3dJbmRleCwgaW50ZXJsYWNlUGFzcyk7Cit9CisKK3ZvaWQg
UE5HSW1hZ2VEZWNvZGVyOjpyb3dBdmFpbGFibGUodW5zaWduZWQgY2hhciogcm93QnVmZmVyLCB1
bnNpZ25lZCByb3dJbmRleCwgaW50IGludGVybGFjZVBhc3MpCit7CisgICAgLy8gUmVzaXplIHRv
IHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBpbWFnZS4KKyAgICBSR0JBMzJCdWZmZXImIGJ1
ZmZlciA9IG1fZnJhbWVCdWZmZXJDYWNoZVswXTsKKyAgICBpZiAoYnVmZmVyLnN0YXR1cygpID09
IFJHQkEzMkJ1ZmZlcjo6RnJhbWVFbXB0eSkgeworICAgICAgICAvLyBMZXQncyByZXNpemUgb3Vy
IGJ1ZmZlciBub3cgdG8gdGhlIGNvcnJlY3Qgd2lkdGgvaGVpZ2h0LgorICAgICAgICBSR0JBMzJB
cnJheSYgYnl0ZXMgPSBidWZmZXIuYnl0ZXMoKTsKKyAgICAgICAgYnl0ZXMucmVzaXplKG1fc2l6
ZS53aWR0aCgpICogbV9zaXplLmhlaWdodCgpKTsKKworICAgICAgICAvLyBVcGRhdGUgb3VyIHN0
YXR1cyB0byBiZSBwYXJ0aWFsbHkgY29tcGxldGUuCisgICAgICAgIGJ1ZmZlci5zZXRTdGF0dXMo
UkdCQTMyQnVmZmVyOjpGcmFtZVBhcnRpYWwpOworCisgICAgICAgIC8vIEZvciBQTkdzLCB0aGUg
ZnJhbWUgYWx3YXlzIGZpbGxzIHRoZSBlbnRpcmUgaW1hZ2UuCisgICAgICAgIGJ1ZmZlci5zZXRS
ZWN0KEludFJlY3QoMCwgMCwgbV9zaXplLndpZHRoKCksIG1fc2l6ZS5oZWlnaHQoKSkpOworCisg
ICAgICAgIGlmIChyZWFkZXIoKS0+cG5nUHRyKCktPmludGVybGFjZWQpCisgICAgICAgICAgICBy
ZWFkZXIoKS0+Y3JlYXRlSW50ZXJsYWNlQnVmZmVyKChyZWFkZXIoKS0+aGFzQWxwaGEoKSA/IDQg
OiAzKSAqIG1fc2l6ZS53aWR0aCgpICogbV9zaXplLmhlaWdodCgpKTsKKyAgICB9CisKKyAgICBp
ZiAocm93QnVmZmVyID09IDApCisgICAgICAgIHJldHVybjsKKworICAgLyogbGlicG5nIGNvbW1l
bnRzIChwYXN0ZWQgaW4gaGVyZSB0byBleHBsYWluIHdoYXQgZm9sbG93cykKKyAgICAqCisgICAg
KiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgZXZlcnkgcm93IGluIHRoZSBpbWFnZS4gIElm
IHRoZQorICAgICogaW1hZ2UgaXMgaW50ZXJsYWNpbmcsIGFuZCB5b3UgdHVybmVkIG9uIHRoZSBp
bnRlcmxhY2UgaGFuZGxlciwKKyAgICAqIHRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgZm9y
IGV2ZXJ5IHJvdyBpbiBldmVyeSBwYXNzLgorICAgICogU29tZSBvZiB0aGVzZSByb3dzIHdpbGwg
bm90IGJlIGNoYW5nZWQgZnJvbSB0aGUgcHJldmlvdXMgcGFzcy4KKyAgICAqIFdoZW4gdGhlIHJv
dyBpcyBub3QgY2hhbmdlZCwgdGhlIG5ld19yb3cgdmFyaWFibGUgd2lsbCBiZSBOVUxMLgorICAg
ICogVGhlIHJvd3MgYW5kIHBhc3NlcyBhcmUgY2FsbGVkIGluIG9yZGVyLCBzbyB5b3UgZG9uJ3Qg
cmVhbGx5CisgICAgKiBuZWVkIHRoZSByb3dfbnVtIGFuZCBwYXNzLCBidXQgSSdtIHN1cHBseWlu
ZyB0aGVtIGJlY2F1c2UgaXQKKyAgICAqIG1heSBtYWtlIHlvdXIgbGlmZSBlYXNpZXIuCisgICAg
KgorICAgICogRm9yIHRoZSBub24tTlVMTCByb3dzIG9mIGludGVybGFjZWQgaW1hZ2VzLCB5b3Ug
bXVzdCBjYWxsCisgICAgKiBwbmdfcHJvZ3Jlc3NpdmVfY29tYmluZV9yb3coKSBwYXNzaW5nIGlu
IHRoZSByb3cgYW5kIHRoZQorICAgICogb2xkIHJvdy4gIFlvdSBjYW4gY2FsbCB0aGlzIGZ1bmN0
aW9uIGZvciBOVUxMIHJvd3MgKGl0IHdpbGwKKyAgICAqIGp1c3QgcmV0dXJuKSBhbmQgZm9yIG5v
bi1pbnRlcmxhY2VkIGltYWdlcyAoaXQganVzdCBkb2VzIHRoZQorICAgICogbWVtY3B5IGZvciB5
b3UpIGlmIGl0IHdpbGwgbWFrZSB0aGUgY29kZSBlYXNpZXIuICBUaHVzLCB5b3UKKyAgICAqIGNh
biBqdXN0IGRvIHRoaXMgZm9yIGFsbCBjYXNlczoKKyAgICAqCisgICAgKiAgICBwbmdfcHJvZ3Jl
c3NpdmVfY29tYmluZV9yb3cocG5nX3B0ciwgb2xkX3JvdywgbmV3X3Jvdyk7CisgICAgKgorICAg
ICogd2hlcmUgb2xkX3JvdyBpcyB3aGF0IHdhcyBkaXNwbGF5ZWQgZm9yIHByZXZpb3VzIHJvd3Mu
ICBOb3RlCisgICAgKiB0aGF0IHRoZSBmaXJzdCBwYXNzIChwYXNzID09IDAgcmVhbGx5KSB3aWxs
IGNvbXBsZXRlbHkgY292ZXIKKyAgICAqIHRoZSBvbGQgcm93LCBzbyB0aGUgcm93cyBkbyBub3Qg
aGF2ZSB0byBiZSBpbml0aWFsaXplZC4gIEFmdGVyCisgICAgKiB0aGUgZmlyc3QgcGFzcyAoYW5k
IG9ubHkgZm9yIGludGVybGFjZWQgaW1hZ2VzKSwgeW91IHdpbGwgaGF2ZQorICAgICogdG8gcGFz
cyB0aGUgY3VycmVudCByb3csIGFuZCB0aGUgZnVuY3Rpb24gd2lsbCBjb21iaW5lIHRoZQorICAg
ICogb2xkIHJvdyBhbmQgdGhlIG5ldyByb3cuCisgICAgKi8KKyAgICAKKyAgICBwbmdfc3RydWN0
cCBwbmcgPSByZWFkZXIoKS0+cG5nUHRyKCk7CisgICAgYm9vbCBoYXNBbHBoYSA9IHJlYWRlcigp
LT5oYXNBbHBoYSgpOworICAgIHVuc2lnbmVkIGNvbG9yQ2hhbm5lbHMgPSBoYXNBbHBoYSA/IDQg
OiAzOworICAgIHBuZ19ieXRlcCByb3c7CisgICAgcG5nX2J5dGVwIGludGVybGFjZUJ1ZmZlciA9
IHJlYWRlcigpLT5pbnRlcmxhY2VCdWZmZXIoKTsKKyAgICBpZiAoaW50ZXJsYWNlQnVmZmVyKSB7
CisgICAgICAgIHJvdyA9IGludGVybGFjZUJ1ZmZlciArIChyb3dJbmRleCAqIGNvbG9yQ2hhbm5l
bHMgKiBtX3NpemUud2lkdGgoKSk7CisgICAgICAgIHBuZ19wcm9ncmVzc2l2ZV9jb21iaW5lX3Jv
dyhwbmcsIHJvdywgcm93QnVmZmVyKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByb3cgPSBy
b3dCdWZmZXI7CisKKyAgICAvLyBDb3B5IHRoZSBkYXRhIGludG8gb3VyIGJ1ZmZlci4KKyAgICBp
bnQgd2lkdGggPSBtX3NpemUud2lkdGgoKTsKKyAgICB1bnNpZ25lZCogZHN0ID0gYnVmZmVyLmJ5
dGVzKCkuZGF0YSgpICsgcm93SW5kZXggKiB3aWR0aDsKKyAgICBib29sIHNhd0FscGhhID0gZmFs
c2U7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3aWR0aDsgaSsrKSB7CisgICAgICAgIHVuc2ln
bmVkIHJlZCA9ICpyb3crKzsKKyAgICAgICAgdW5zaWduZWQgZ3JlZW4gPSAqcm93Kys7CisgICAg
ICAgIHVuc2lnbmVkIGJsdWUgPSAqcm93Kys7CisgICAgICAgIHVuc2lnbmVkIGFscGhhID0gKGhh
c0FscGhhID8gKnJvdysrIDogMjU1KTsKKyAgICAgICAgUkdCQTMyQnVmZmVyOjpzZXRSR0JBKCpk
c3QrKywgcmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOworICAgICAgICBpZiAoIXNhd0FscGhhICYm
IGFscGhhIDwgMjU1KSB7CisgICAgICAgICAgICBzYXdBbHBoYSA9IHRydWU7CisgICAgICAgICAg
ICBidWZmZXIuc2V0SGFzQWxwaGEodHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBidWZm
ZXIuZW5zdXJlSGVpZ2h0KHJvd0luZGV4ICsgMSk7Cit9CisKK3ZvaWQgcG5nQ29tcGxldGUocG5n
X3N0cnVjdHAgcG5nLCBwbmdfaW5mb3AgaW5mbykKK3sKKyAgICBzdGF0aWNfY2FzdDxQTkdJbWFn
ZURlY29kZXIqPihwbmdfZ2V0X3Byb2dyZXNzaXZlX3B0cihwbmcpKS0+cG5nQ29tcGxldGUoKTsK
K30KKwordm9pZCBQTkdJbWFnZURlY29kZXI6OnBuZ0NvbXBsZXRlKCkKK3sKKyAgICAvLyBIYW5k
IGJhY2sgYW4gYXBwcm9wcmlhdGVseSBzaXplZCBidWZmZXIsIGV2ZW4gaWYgdGhlIGltYWdlIGVu
ZGVkIHVwIGJlaW5nIGVtcHR5LgorICAgIFJHQkEzMkJ1ZmZlciYgYnVmZmVyID0gbV9mcmFtZUJ1
ZmZlckNhY2hlWzBdOworICAgIGJ1ZmZlci5zZXRTdGF0dXMoUkdCQTMyQnVmZmVyOjpGcmFtZUNv
bXBsZXRlKTsKK30KKworfQorCisjZW5kaWYgLy8gUExBVEZPUk0oQ0FJUk8pCkluZGV4OiBwbGF0
Zm9ybS9pbWFnZS1kZWNvZGVycy9za2lhL1BOR0ltYWdlRGVjb2Rlci5oCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IHBsYXRmb3JtL2ltYWdlLWRlY29kZXJzL3NraWEvUE5HSW1hZ2VEZWNvZGVyLmgJKHJldmlzaW9u
IDQwMTY0KQkoZnJvbSBwbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9wbmcvUE5HSW1hZ2VEZWNvZGVy
Lmg6NDAxNjQpCisrKyBwbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9za2lhL1BOR0ltYWdlRGVjb2Rl
ci5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMDYgQXBwbGUgQ29tcHV0ZXIsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
CisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMu
IE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisK
KyNpZm5kZWYgUE5HX0RFQ09ERVJfSF8KKyNkZWZpbmUgUE5HX0RFQ09ERVJfSF8KKworI2luY2x1
ZGUgIkltYWdlRGVjb2Rlci5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIFBOR0lt
YWdlUmVhZGVyOworCisvLyBUaGlzIGNsYXNzIGRlY29kZXMgdGhlIFBORyBpbWFnZSBmb3JtYXQu
CitjbGFzcyBQTkdJbWFnZURlY29kZXIgOiBwdWJsaWMgSW1hZ2VEZWNvZGVyCit7CitwdWJsaWM6
CisgICAgUE5HSW1hZ2VEZWNvZGVyKCk7CisgICAgflBOR0ltYWdlRGVjb2RlcigpOworCisgICAg
dmlydHVhbCBTdHJpbmcgZmlsZW5hbWVFeHRlbnNpb24oKSBjb25zdCB7IHJldHVybiAicG5nIjsg
fQorCisgICAgLy8gVGFrZSB0aGUgZGF0YSBhbmQgc3RvcmUgaXQuCisgICAgdmlydHVhbCB2b2lk
IHNldERhdGEoU2hhcmVkQnVmZmVyKiBkYXRhLCBib29sIGFsbERhdGFSZWNlaXZlZCk7CisKKyAg
ICAvLyBXaGV0aGVyIG9yIG5vdCB0aGUgc2l6ZSBpbmZvcm1hdGlvbiBoYXMgYmVlbiBkZWNvZGVk
IHlldC4KKyAgICB2aXJ0dWFsIGJvb2wgaXNTaXplQXZhaWxhYmxlKCkgY29uc3Q7CisKKyAgICB2
aXJ0dWFsIFJHQkEzMkJ1ZmZlciogZnJhbWVCdWZmZXJBdEluZGV4KHNpemVfdCBpbmRleCk7CisK
KyAgICB2b2lkIGRlY29kZShib29sIHNpemVPbmx5ID0gZmFsc2UpIGNvbnN0OworCisgICAgUE5H
SW1hZ2VSZWFkZXIqIHJlYWRlcigpIHsgcmV0dXJuIG1fcmVhZGVyOyB9CisKKyAgICAvLyBDYWxs
YmFja3MgZnJvbSBsaWJwbmcKKyAgICB2b2lkIGRlY29kaW5nRmFpbGVkKCkgeyBtX2ZhaWxlZCA9
IHRydWU7IH0KKyAgICB2b2lkIGhlYWRlckF2YWlsYWJsZSgpOworICAgIHZvaWQgcm93QXZhaWxh
YmxlKHVuc2lnbmVkIGNoYXIqIHJvd0J1ZmZlciwgdW5zaWduZWQgcm93SW5kZXgsIGludCBpbnRl
cmxhY2VQYXNzKTsKKyAgICB2b2lkIHBuZ0NvbXBsZXRlKCk7CisKK3ByaXZhdGU6CisgICAgbXV0
YWJsZSBQTkdJbWFnZVJlYWRlciogbV9yZWFkZXI7Cit9OworCit9CisKKyNlbmRpZgo=
</data>
<flag name="review"
          id="12924"
          type_id="1"
          status="+"
          setter="eric"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>26976</attachid>
            <date>2009-01-23 10:55:56 -0800</date>
            <delta_ts>2009-01-23 11:20:03 -0800</delta_ts>
            <desc>patch: part 2 - copy ImageDecoder.h as well</desc>
            <filename>im_2.diff</filename>
            <type>text/plain</type>
            <size>8492</size>
            <attacher name="Darin Fisher (:fishd, Google)">fishd</attacher>
            
              <data encoding="base64">SW5kZXg6IENoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBDaGFuZ2VMb2cJKHJldmlzaW9uIDQwMTY1
KQorKysgQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0zLDYgKzMsMTUgQEAKICAgICAgICAg
UmV2aWV3ZWQgYnkgRXJpYyBTZWlkZWwuCiAKICAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5v
cmcvc2hvd19idWcuY2dpP2lkPTIzNTA2CisgICAgICAgIENvcHkgZXhpc3RpbmcgSW1hZ2VEZWNv
ZGVyLmggaW4gcHJlcGFyYXRpb24gZm9yIGxhbmRpbmcgU2tpYSBjaGFuZ2VzIG9uIHRvcC4KKwor
ICAgICAgICAqIHBsYXRmb3JtL2ltYWdlLWRlY29kZXJzL3NraWEvSW1hZ2VEZWNvZGVyLmg6IENv
cGllZCBmcm9tIHBsYXRmb3JtL2ltYWdlLWRlY29kZXJzL0ltYWdlRGVjb2Rlci5oLgorCisyMDA5
LTAxLTIzICBEYXJpbiBGaXNoZXIgIDxkYXJpbkBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2
aWV3ZWQgYnkgRXJpYyBTZWlkZWwuCisKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcv
c2hvd19idWcuY2dpP2lkPTIzNTA2CiAgICAgICAgIENvcHkgZXhpc3RpbmcgaW1hZ2UtZGVjb2Rl
cnMgaW4gcHJlcGFyYXRpb24gZm9yIGxhbmRpbmcgU2tpYSBjaGFuZ2VzIG9uIHRvcC4KIAogICAg
ICAgICAqIHBsYXRmb3JtL2ltYWdlLWRlY29kZXJzL3NraWE6IEFkZGVkLgpJbmRleDogcGxhdGZv
cm0vaW1hZ2UtZGVjb2RlcnMvc2tpYS9JbWFnZURlY29kZXIuaAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBwbGF0
Zm9ybS9pbWFnZS1kZWNvZGVycy9za2lhL0ltYWdlRGVjb2Rlci5oCShyZXZpc2lvbiA0MDE2NCkJ
KGZyb20gcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvSW1hZ2VEZWNvZGVyLmg6NDAxNjQpCisrKyBw
bGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9za2lhL0ltYWdlRGVjb2Rlci5oCSh3b3JraW5nIGNvcHkp
CkBAIC0wLDAgKzEsMTcwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2IEFwcGxlIENvbXB1
dGVyLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBB
TlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
ICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIElNQUdFX0RF
Q09ERVJfSF8KKyNkZWZpbmUgSU1BR0VfREVDT0RFUl9IXworCisjaW5jbHVkZSAiSW50UmVjdC5o
IgorI2luY2x1ZGUgIkltYWdlU291cmNlLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIK
KyNpbmNsdWRlICJTaGFyZWRCdWZmZXIuaCIKKyNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CisKK25h
bWVzcGFjZSBXZWJDb3JlIHsKKwordHlwZWRlZiBWZWN0b3I8dW5zaWduZWQ+IFJHQkEzMkFycmF5
OworCisvLyBUaGUgUkdCQTMyQnVmZmVyIG9iamVjdCByZXByZXNlbnRzIHRoZSBkZWNvZGVkIGlt
YWdlIGRhdGEgaW4gUkdCQTMyIGZvcm1hdC4gIFRoaXMgYnVmZmVyIGlzIHdoYXQgYWxsCisvLyBk
ZWNvZGVycyB3cml0ZSBhIHNpbmdsZSBmcmFtZSBpbnRvLiAgRnJhbWVzIGFyZSB0aGVuIGluc3Rh
bnRpYXRlZCBmb3IgZHJhd2luZyBieSBiZWluZyBoYW5kZWQgdGhpcyBidWZmZXIuCitjbGFzcyBS
R0JBMzJCdWZmZXIKK3sKK3B1YmxpYzoKKyAgICBlbnVtIEZyYW1lU3RhdHVzIHsgRnJhbWVFbXB0
eSwgRnJhbWVQYXJ0aWFsLCBGcmFtZUNvbXBsZXRlIH07CisgICAgZW51bSBGcmFtZURpc3Bvc2Fs
TWV0aG9kIHsKKyAgICAgICAgLy8gSWYgeW91IGNoYW5nZSB0aGUgbnVtZXJpYyB2YWx1ZXMgb2Yg
dGhlc2UsIG1ha2Ugc3VyZSB5b3UgYXVkaXQgYWxsCisgICAgICAgIC8vIHVzZXJzLCBhcyBzb21l
IHVzZXJzIG1heSBjYXN0IHJhdyB2YWx1ZXMgdG8vZnJvbSB0aGVzZSBjb25zdGFudHMuCisgICAg
ICAgIERpc3Bvc2VOb3RTcGVjaWZpZWQgPSAwLCAgICAgICAvLyBMZWF2ZSBmcmFtZSBpbiBmcmFt
ZWJ1ZmZlcgorICAgICAgICBEaXNwb3NlS2VlcCA9IDEsICAgICAgICAgICAgICAgLy8gTGVhdmUg
ZnJhbWUgaW4gZnJhbWVidWZmZXIKKyAgICAgICAgRGlzcG9zZU92ZXJ3cml0ZUJnY29sb3IgPSAy
LCAgIC8vIENsZWFyIGZyYW1lIHRvIHRyYW5zcGFyZW50CisgICAgICAgIERpc3Bvc2VPdmVyd3Jp
dGVQcmV2aW91cyA9IDMsICAvLyBDbGVhciBmcmFtZSB0byBwcmV2aW91cyBmcmFtZWJ1ZmZlciBj
b250ZW50cworICAgIH07CisKKyAgICBSR0JBMzJCdWZmZXIoKSA6IG1faGVpZ2h0KDApLCBtX3N0
YXR1cyhGcmFtZUVtcHR5KSwgbV9kdXJhdGlvbigwKSwKKyAgICAgICAgICAgICAgICAgICAgIG1f
ZGlzcG9zYWxNZXRob2QoRGlzcG9zZU5vdFNwZWNpZmllZCksIG1faGFzQWxwaGEoZmFsc2UpCisg
ICAge30gCisKKyAgICB2b2lkIGNsZWFyKCkgeworICAgICAgbV9ieXRlcy5jbGVhcigpOworICAg
ICAgbV9yZWN0ID0gSW50UmVjdCgpOworICAgICAgbV9oZWlnaHQgPSAwOworICAgICAgbV9zdGF0
dXMgPSBGcmFtZUVtcHR5OworICAgICAgbV9kdXJhdGlvbiA9IDA7CisgICAgICBtX2Rpc3Bvc2Fs
TWV0aG9kID0gRGlzcG9zZU5vdFNwZWNpZmllZDsKKyAgICAgIG1faGFzQWxwaGEgPSBmYWxzZTsK
KyAgICB9CisKKyAgICBjb25zdCBSR0JBMzJBcnJheSYgYnl0ZXMoKSBjb25zdCB7IHJldHVybiBt
X2J5dGVzOyB9CisgICAgUkdCQTMyQXJyYXkmIGJ5dGVzKCkgeyByZXR1cm4gbV9ieXRlczsgfQor
ICAgIGNvbnN0IEludFJlY3QmIHJlY3QoKSBjb25zdCB7IHJldHVybiBtX3JlY3Q7IH0KKyAgICB1
bnNpZ25lZCBoZWlnaHQoKSBjb25zdCB7IHJldHVybiBtX2hlaWdodDsgfQorICAgIEZyYW1lU3Rh
dHVzIHN0YXR1cygpIGNvbnN0IHsgcmV0dXJuIG1fc3RhdHVzOyB9CisgICAgdW5zaWduZWQgZHVy
YXRpb24oKSBjb25zdCB7IHJldHVybiBtX2R1cmF0aW9uOyB9CisgICAgRnJhbWVEaXNwb3NhbE1l
dGhvZCBkaXNwb3NhbE1ldGhvZCgpIGNvbnN0IHsgcmV0dXJuIG1fZGlzcG9zYWxNZXRob2Q7IH0K
KyAgICBib29sIGhhc0FscGhhKCkgY29uc3QgeyByZXR1cm4gbV9oYXNBbHBoYTsgfQorCisgICAg
dm9pZCBzZXRSZWN0KGNvbnN0IEludFJlY3QmIHIpIHsgbV9yZWN0ID0gcjsgfQorICAgIHZvaWQg
ZW5zdXJlSGVpZ2h0KHVuc2lnbmVkIHJvd0luZGV4KSB7IGlmIChyb3dJbmRleCA+IG1faGVpZ2h0
KSBtX2hlaWdodCA9IHJvd0luZGV4OyB9CisgICAgdm9pZCBzZXRTdGF0dXMoRnJhbWVTdGF0dXMg
cykgeyBtX3N0YXR1cyA9IHM7IH0KKyAgICB2b2lkIHNldER1cmF0aW9uKHVuc2lnbmVkIGR1cmF0
aW9uKSB7IG1fZHVyYXRpb24gPSBkdXJhdGlvbjsgfQorICAgIHZvaWQgc2V0RGlzcG9zYWxNZXRo
b2QoRnJhbWVEaXNwb3NhbE1ldGhvZCBtZXRob2QpIHsgbV9kaXNwb3NhbE1ldGhvZCA9IG1ldGhv
ZDsgfQorICAgIHZvaWQgc2V0SGFzQWxwaGEoYm9vbCBhbHBoYSkgeyBtX2hhc0FscGhhID0gYWxw
aGE7IH0KKworICAgIHN0YXRpYyB2b2lkIHNldFJHQkEodW5zaWduZWQmIHBvcywgdW5zaWduZWQg
ciwgdW5zaWduZWQgZywgdW5zaWduZWQgYiwgdW5zaWduZWQgYSkKKyAgICB7CisgICAgICAgIC8v
IFdlIHN0b3JlIHRoaXMgZGF0YSBwcmUtbXVsdGlwbGllZC4KKyAgICAgICAgaWYgKGEgPT0gMCkK
KyAgICAgICAgICAgIHBvcyA9IDA7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKGEg
PCAyNTUpIHsKKyAgICAgICAgICAgICAgICBmbG9hdCBhbHBoYVBlcmNlbnQgPSBhIC8gMjU1LjBm
OworICAgICAgICAgICAgICAgIHIgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4ociAqIGFscGhhUGVy
Y2VudCk7CisgICAgICAgICAgICAgICAgZyA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPihnICogYWxw
aGFQZXJjZW50KTsKKyAgICAgICAgICAgICAgICBiID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGIg
KiBhbHBoYVBlcmNlbnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcG9zID0gKGEgPDwg
MjQgfCByIDw8IDE2IHwgZyA8PCA4IHwgYik7CisgICAgICAgIH0KKyAgICB9CisKK3ByaXZhdGU6
CisgICAgUkdCQTMyQXJyYXkgbV9ieXRlczsKKyAgICBJbnRSZWN0IG1fcmVjdDsgICAgLy8gVGhl
IHJlY3Qgb2YgdGhlIG9yaWdpbmFsIHNwZWNpZmllZCBmcmFtZSB3aXRoaW4gdGhlIG92ZXJhbGwg
YnVmZmVyLgorICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHdpbGwgYWx3YXlzIGp1c3Qg
YmUgdGhlIGVudGlyZSBidWZmZXIgZXhjZXB0IGZvciBHSUYgZnJhbWVzCisgICAgICAgICAgICAg
ICAgICAgICAgIC8vIHdob3NlIG9yaWdpbmFsIHJlY3Qgd2FzIHNtYWxsZXIgdGhhbiB0aGUgb3Zl
cmFsbCBpbWFnZSBzaXplLgorICAgIHVuc2lnbmVkIG1faGVpZ2h0OyAvLyBUaGUgaGVpZ2h0ICh0
aGUgbnVtYmVyIG9mIHJvd3Mgd2UndmUgZnVsbHkgZGVjb2RlZCkuCisgICAgRnJhbWVTdGF0dXMg
bV9zdGF0dXM7IC8vIFdoZXRoZXIgb3Igbm90IHRoaXMgZnJhbWUgaXMgY29tcGxldGVseSBmaW5p
c2hlZCBkZWNvZGluZy4KKyAgICB1bnNpZ25lZCBtX2R1cmF0aW9uOyAvLyBUaGUgYW5pbWF0aW9u
IGRlbGF5LgorICAgIEZyYW1lRGlzcG9zYWxNZXRob2QgbV9kaXNwb3NhbE1ldGhvZDsgLy8gV2hh
dCB0byBkbyB3aXRoIHRoaXMgZnJhbWUncyBkYXRhIHdoZW4gaW5pdGlhbGl6aW5nIHRoZSBuZXh0
IGZyYW1lLgorICAgIGJvb2wgbV9oYXNBbHBoYTsgLy8gV2hldGhlciBvciBub3QgYW55IG9mIHRo
ZSBwaXhlbHMgaW4gdGhlIGJ1ZmZlciBoYXZlIHRyYW5zcGFyZW5jeS4KK307CisKKy8vIFRoZSBJ
bWFnZURlY29kZXIgY2xhc3MgcmVwcmVzZW50cyBhIGJhc2UgY2xhc3MgZm9yIHNwZWNpZmljIGlt
YWdlIGZvcm1hdCBkZWNvZGVycworLy8gKGUuZy4sIEdJRiwgSlBHLCBQTkcsIElDTykgdG8gZGVy
aXZlIGZyb20uICBBbGwgZGVjb2RlcnMgZGVjb2RlIGludG8gUkdCQTMyIGZvcm1hdAorLy8gYW5k
IHRoZSBiYXNlIGNsYXNzIG1hbmFnZXMgdGhlIFJHQkEzMiBmcmFtZSBjYWNoZS4KK2NsYXNzIElt
YWdlRGVjb2RlcgoreworcHVibGljOgorICAgIEltYWdlRGVjb2RlcigpIDptX3NpemVBdmFpbGFi
bGUoZmFsc2UpLCBtX2ZhaWxlZChmYWxzZSkge30KKyAgICB2aXJ0dWFsIH5JbWFnZURlY29kZXIo
KSB7fQorCisgICAgLy8gVGhlIHRoZSBmaWxlbmFtZSBleHRlbnNpb24gdXN1YWxseSBhc3NvY2lh
dGVkIHdpdGggYW4gdW5kZWNvZGVkIGltYWdlIG9mIHRoaXMgdHlwZS4KKyAgICB2aXJ0dWFsIFN0
cmluZyBmaWxlbmFtZUV4dGVuc2lvbigpIGNvbnN0ID0gMDsKKworICAgIC8vIEFsbCBzcGVjaWZp
YyBkZWNvZGVyIHBsdWdpbnMgbXVzdCBkbyBzb21ldGhpbmcgd2l0aCB0aGUgZGF0YSB0aGV5IGFy
ZSBnaXZlbi4KKyAgICB2aXJ0dWFsIHZvaWQgc2V0RGF0YShTaGFyZWRCdWZmZXIqIGRhdGEsIGJv
b2wgYWxsRGF0YVJlY2VpdmVkKSB7IG1fZGF0YSA9IGRhdGE7IH0KKworICAgIC8vIFdoZXRoZXIg
b3Igbm90IHRoZSBzaXplIGluZm9ybWF0aW9uIGhhcyBiZWVuIGRlY29kZWQgeWV0LgorICAgIHZp
cnR1YWwgYm9vbCBpc1NpemVBdmFpbGFibGUoKSBjb25zdCA9IDA7CisKKyAgICAvLyBSZXF1ZXN0
cyB0aGUgc2l6ZS4KKyAgICB2aXJ0dWFsIEludFNpemUgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1f
c2l6ZTsgfQorCisgICAgLy8gVGhlIHRvdGFsIG51bWJlciBvZiBmcmFtZXMgZm9yIHRoZSBpbWFn
ZS4gIENsYXNzZXMgdGhhdCBzdXBwb3J0IG11bHRpcGxlIGZyYW1lcworICAgIC8vIHdpbGwgc2Nh
biB0aGUgaW1hZ2UgZGF0YSBmb3IgdGhlIGFuc3dlciBpZiB0aGV5IG5lZWQgdG8gKHdpdGhvdXQg
bmVjZXNzYXJpbHkKKyAgICAvLyBkZWNvZGluZyBhbGwgb2YgdGhlIGluZGl2aWR1YWwgZnJhbWVz
KS4KKyAgICB2aXJ0dWFsIGludCBmcmFtZUNvdW50KCkgeyByZXR1cm4gMTsgfQorCisgICAgLy8g
VGhlIG51bWJlciBvZiByZXBldGl0aW9ucyB0byBwZXJmb3JtIGZvciBhbiBhbmltYXRpb24gbG9v
cC4KKyAgICB2aXJ0dWFsIGludCByZXBldGl0aW9uQ291bnQoKSBjb25zdCB7IHJldHVybiBjQW5p
bWF0aW9uTm9uZTsgfQorCisgICAgLy8gQ2FsbGVkIHRvIG9idGFpbiB0aGUgUkdCQTMyQnVmZmVy
IGZ1bGwgb2YgZGVjb2RlZCBkYXRhIGZvciByZW5kZXJpbmcuICBUaGUKKyAgICAvLyBkZWNvZGVy
IHBsdWdpbiB3aWxsIGRlY29kZSBhcyBtdWNoIG9mIHRoZSBmcmFtZSBhcyBpdCBjYW4gYmVmb3Jl
IGhhbmRpbmcKKyAgICAvLyBiYWNrIHRoZSBidWZmZXIuCisgICAgdmlydHVhbCBSR0JBMzJCdWZm
ZXIqIGZyYW1lQnVmZmVyQXRJbmRleChzaXplX3QgaW5kZXgpID0gMDsKKworICAgIC8vIFdoZXRo
ZXIgb3Igbm90IHRoZSB1bmRlcmx5aW5nIGltYWdlIGZvcm1hdCBldmVuIHN1cHBvcnRzIGFscGhh
IHRyYW5zcGFyZW5jeS4KKyAgICB2aXJ0dWFsIGJvb2wgc3VwcG9ydHNBbHBoYSgpIGNvbnN0IHsg
cmV0dXJuIHRydWU7IH0KKworICAgIGJvb2wgZmFpbGVkKCkgY29uc3QgeyByZXR1cm4gbV9mYWls
ZWQ7IH0KKyAgICB2b2lkIHNldEZhaWxlZCgpIHsgbV9mYWlsZWQgPSB0cnVlOyB9CisKKyAgICAv
LyBXaXBlIG91dCBmcmFtZXMgaW4gdGhlIGZyYW1lIGJ1ZmZlciBjYWNoZSBiZWZvcmUgfGNsZWFy
QmVmb3JlRnJhbWV8LAorICAgIC8vIGFzc3VtaW5nIHRoaXMgY2FuIGJlIGRvbmUgd2l0aG91dCBi
cmVha2luZyBkZWNvZGluZy4gIERpZmZlcmVudCBkZWNvZGVycworICAgIC8vIHBsYWNlIGRpZmZl
cmVudCByZXN0cmljdGlvbnMgb24gd2hhdCBmcmFtZXMgYXJlIHNhZmUgdG8gZGVzdHJveSwgc28g
dGhpcworICAgIC8vIGlzIGxlZnQgdG8gdGhlbSB0byBpbXBsZW1lbnQuCisgICAgLy8gRm9yIGNv
bnZlbmllbmNlJ3Mgc2FrZSwgd2UgcHJvdmlkZSBhIGRlZmF1bHQgKGVtcHR5KSBpbXBsZW1lbnRh
dGlvbiwKKyAgICAvLyBzaW5jZSBpbiBwcmFjdGljZSBvbmx5IEdJRnMgd2lsbCBldmVyIHVzZSB0
aGlzLgorICAgIHZpcnR1YWwgdm9pZCBjbGVhckZyYW1lQnVmZmVyQ2FjaGUoc2l6ZV90IGNsZWFy
QmVmb3JlRnJhbWUpIHsgfQorCitwcm90ZWN0ZWQ6CisgICAgUmVmUHRyPFNoYXJlZEJ1ZmZlcj4g
bV9kYXRhOyAvLyBUaGUgZW5jb2RlZCBkYXRhLgorICAgIFZlY3RvcjxSR0JBMzJCdWZmZXI+IG1f
ZnJhbWVCdWZmZXJDYWNoZTsKKyAgICBib29sIG1fc2l6ZUF2YWlsYWJsZTsKKyAgICBtdXRhYmxl
IGJvb2wgbV9mYWlsZWQ7CisgICAgSW50U2l6ZSBtX3NpemU7Cit9OworCit9CisKKyNlbmRpZgo=
</data>
<flag name="review"
          id="12925"
          type_id="1"
          status="+"
          setter="eric"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>26977</attachid>
            <date>2009-01-23 10:59:23 -0800</date>
            <delta_ts>2009-01-23 12:26:31 -0800</delta_ts>
            <desc>patch: part 3 - apply skia changes on top</desc>
            <filename>im_3.diff</filename>
            <type>text/plain</type>
            <size>152472</size>
            <attacher name="Darin Fisher (:fishd, Google)">fishd</attacher>
            
              <data encoding="base64">SW5kZXg6IENoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBDaGFuZ2VMb2cJKHJldmlzaW9uIDQwMTY2
KQorKysgQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0zLDYgKzMsMTA2IEBACiAgICAgICAg
IFJldmlld2VkIGJ5IEVyaWMgU2VpZGVsLgogCiAgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQu
b3JnL3Nob3dfYnVnLmNnaT9pZD0yMzUwNgorICAgICAgICBVcHN0cmVhbSBDaHJvbWl1bSdzIGlt
YWdlIGRlY29kZXJzIGZvciB1c2Ugd2l0aCBQTEFURk9STShTS0lBKQorCisgICAgICAgICogcGxh
dGZvcm0vaW1hZ2UtZGVjb2RlcnMvc2tpYS9CTVBJbWFnZURlY29kZXIuY3BwOiBBZGRlZC4KKyAg
ICAgICAgKiBwbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9za2lhL0JNUEltYWdlRGVjb2Rlci5oOiBB
ZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9za2lhL0JNUEltYWdlUmVh
ZGVyLmNwcDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvc2tpYS9C
TVBJbWFnZVJlYWRlci5oOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9pbWFnZS1kZWNvZGVy
cy9za2lhL0dJRkltYWdlRGVjb2Rlci5jcHA6CisgICAgICAgIChXZWJDb3JlOjpHSUZJbWFnZURl
Y29kZXJQcml2YXRlOjpHSUZJbWFnZURlY29kZXJQcml2YXRlKToKKyAgICAgICAgKFdlYkNvcmU6
OkdJRkltYWdlRGVjb2RlclByaXZhdGU6OmRlY29kZSk6CisgICAgICAgIChXZWJDb3JlOjpHSUZJ
bWFnZURlY29kZXJQcml2YXRlOjpnZXRDb2xvck1hcCk6CisgICAgICAgIChXZWJDb3JlOjpHSUZJ
bWFnZURlY29kZXI6OkdJRkltYWdlRGVjb2Rlcik6CisgICAgICAgIChXZWJDb3JlOjpHSUZJbWFn
ZURlY29kZXI6OmlzU2l6ZUF2YWlsYWJsZSk6CisgICAgICAgIChXZWJDb3JlOjpHSUZJbWFnZURl
Y29kZXI6OmZyYW1lQ291bnQpOgorICAgICAgICAoV2ViQ29yZTo6R0lGSW1hZ2VEZWNvZGVyOjpm
cmFtZUJ1ZmZlckF0SW5kZXgpOgorICAgICAgICAoV2ViQ29yZTo6R0lGSW1hZ2VEZWNvZGVyOjpj
bGVhckZyYW1lQnVmZmVyQ2FjaGUpOgorICAgICAgICAoV2ViQ29yZTo6R0lGSW1hZ2VEZWNvZGVy
OjpkZWNvZGUpOgorICAgICAgICAoV2ViQ29yZTo6R0lGSW1hZ2VEZWNvZGVyOjpzaXplTm93QXZh
aWxhYmxlKToKKyAgICAgICAgKFdlYkNvcmU6OkdJRkltYWdlRGVjb2Rlcjo6aW5pdEZyYW1lQnVm
ZmVyKToKKyAgICAgICAgKFdlYkNvcmU6OkdJRkltYWdlRGVjb2Rlcjo6cHJlcEVtcHR5RnJhbWVC
dWZmZXIpOgorICAgICAgICAoV2ViQ29yZTo6R0lGSW1hZ2VEZWNvZGVyOjpoYXZlRGVjb2RlZFJv
dyk6CisgICAgICAgIChXZWJDb3JlOjpHSUZJbWFnZURlY29kZXI6OmZyYW1lQ29tcGxldGUpOgor
ICAgICAgICAqIHBsYXRmb3JtL2ltYWdlLWRlY29kZXJzL3NraWEvR0lGSW1hZ2VEZWNvZGVyLmg6
CisgICAgICAgIChXZWJDb3JlOjpHSUZJbWFnZURlY29kZXI6OmZpbGVuYW1lRXh0ZW5zaW9uKToK
KyAgICAgICAgKFdlYkNvcmU6OkdJRkltYWdlRGVjb2Rlcjo6ZnJhbWVEdXJhdGlvbkF0SW5kZXgp
OgorICAgICAgICAoV2ViQ29yZTo6R0lGSW1hZ2VEZWNvZGVyOjopOgorICAgICAgICAqIHBsYXRm
b3JtL2ltYWdlLWRlY29kZXJzL3NraWEvR0lGSW1hZ2VSZWFkZXIuY3BwOgorICAgICAgICAoR0lG
SW1hZ2VSZWFkZXI6OmRvX2x6dyk6CisgICAgICAgIChHSUZJbWFnZVJlYWRlcjo6cmVhZCk6Cisg
ICAgICAgICogcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvc2tpYS9HSUZJbWFnZVJlYWRlci5oOgor
ICAgICAgICAqIHBsYXRmb3JtL2ltYWdlLWRlY29kZXJzL3NraWEvSUNPSW1hZ2VEZWNvZGVyLmNw
cDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvc2tpYS9JQ09JbWFn
ZURlY29kZXIuaDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvc2tp
YS9JbWFnZURlY29kZXIuaDoKKyAgICAgICAgKFdlYkNvcmU6OlJlZkNvdW50ZWROYXRpdmVJbWFn
ZVNraWE6OmNyZWF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpSZWZDb3VudGVkTmF0aXZlSW1hZ2VT
a2lhOjpiaXRtYXApOgorICAgICAgICAoV2ViQ29yZTo6UmVmQ291bnRlZE5hdGl2ZUltYWdlU2tp
YTo6UmVmQ291bnRlZE5hdGl2ZUltYWdlU2tpYSk6CisgICAgICAgIChXZWJDb3JlOjpSR0JBMzJC
dWZmZXI6Oik6CisgICAgICAgIChXZWJDb3JlOjpSR0JBMzJCdWZmZXI6OlJHQkEzMkJ1ZmZlcik6
CisgICAgICAgIChXZWJDb3JlOjpSR0JBMzJCdWZmZXI6On5SR0JBMzJCdWZmZXIpOgorICAgICAg
ICAoV2ViQ29yZTo6UkdCQTMyQnVmZmVyOjpvcGVyYXRvcj0pOgorICAgICAgICAoV2ViQ29yZTo6
UkdCQTMyQnVmZmVyOjpjbGVhcik6CisgICAgICAgIChXZWJDb3JlOjpSR0JBMzJCdWZmZXI6OmNv
cHlCaXRtYXBEYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OlJHQkEzMkJ1ZmZlcjo6Yml0bWFwKToK
KyAgICAgICAgKFdlYkNvcmU6OlJHQkEzMkJ1ZmZlcjo6c2V0U2l6ZSk6CisgICAgICAgIChXZWJD
b3JlOjpSR0JBMzJCdWZmZXI6OndpZHRoKToKKyAgICAgICAgKFdlYkNvcmU6OlJHQkEzMkJ1ZmZl
cjo6aGVpZ2h0KToKKyAgICAgICAgKFdlYkNvcmU6OlJHQkEzMkJ1ZmZlcjo6cmVjdCk6CisgICAg
ICAgIChXZWJDb3JlOjpSR0JBMzJCdWZmZXI6OnN0YXR1cyk6CisgICAgICAgIChXZWJDb3JlOjpS
R0JBMzJCdWZmZXI6OmR1cmF0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OlJHQkEzMkJ1ZmZlcjo6
ZGlzcG9zYWxNZXRob2QpOgorICAgICAgICAoV2ViQ29yZTo6UkdCQTMyQnVmZmVyOjpoYXNBbHBo
YSk6CisgICAgICAgIChXZWJDb3JlOjpSR0JBMzJCdWZmZXI6OnNldFJlY3QpOgorICAgICAgICAo
V2ViQ29yZTo6UkdCQTMyQnVmZmVyOjpzZXRTdGF0dXMpOgorICAgICAgICAoV2ViQ29yZTo6UkdC
QTMyQnVmZmVyOjpzZXREdXJhdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpSR0JBMzJCdWZmZXI6
OnNldERpc3Bvc2FsTWV0aG9kKToKKyAgICAgICAgKFdlYkNvcmU6OlJHQkEzMkJ1ZmZlcjo6c2V0
SGFzQWxwaGEpOgorICAgICAgICAoV2ViQ29yZTo6UkdCQTMyQnVmZmVyOjpzZXRSR0JBKToKKyAg
ICAgICAgKFdlYkNvcmU6OkltYWdlRGVjb2Rlcjo6SW1hZ2VEZWNvZGVyKToKKyAgICAgICAgKFdl
YkNvcmU6OkltYWdlRGVjb2Rlcjo6fkltYWdlRGVjb2Rlcik6CisgICAgICAgIChXZWJDb3JlOjpJ
bWFnZURlY29kZXI6OnNldERhdGEpOgorICAgICAgICAoV2ViQ29yZTo6SW1hZ2VEZWNvZGVyOjpp
c1NpemVBdmFpbGFibGUpOgorICAgICAgICAoV2ViQ29yZTo6SW1hZ2VEZWNvZGVyOjpzaXplKToK
KyAgICAgICAgKFdlYkNvcmU6OkltYWdlRGVjb2Rlcjo6ZnJhbWVDb3VudCk6CisgICAgICAgIChX
ZWJDb3JlOjpJbWFnZURlY29kZXI6OnJlcGV0aXRpb25Db3VudCk6CisgICAgICAgIChXZWJDb3Jl
OjpJbWFnZURlY29kZXI6OnN1cHBvcnRzQWxwaGEpOgorICAgICAgICAoV2ViQ29yZTo6SW1hZ2VE
ZWNvZGVyOjpmYWlsZWQpOgorICAgICAgICAoV2ViQ29yZTo6SW1hZ2VEZWNvZGVyOjpzZXRGYWls
ZWQpOgorICAgICAgICAoV2ViQ29yZTo6SW1hZ2VEZWNvZGVyOjpjbGVhckZyYW1lQnVmZmVyQ2Fj
aGUpOgorICAgICAgICAoV2ViQ29yZTo6SW1hZ2VEZWNvZGVyOjpzZXRTaXplKToKKyAgICAgICAg
KFdlYkNvcmU6OkltYWdlRGVjb2Rlcjo6aXNPdmVyU2l6ZSk6CisgICAgICAgICogcGxhdGZvcm0v
aW1hZ2UtZGVjb2RlcnMvc2tpYS9KUEVHSW1hZ2VEZWNvZGVyLmNwcDoKKyAgICAgICAgKFdlYkNv
cmU6OkpQRUdJbWFnZVJlYWRlcjo6SlBFR0ltYWdlUmVhZGVyKToKKyAgICAgICAgKFdlYkNvcmU6
OkpQRUdJbWFnZVJlYWRlcjo6ZGVjb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OkpQRUdJbWFnZURl
Y29kZXI6OmlzU2l6ZUF2YWlsYWJsZSk6CisgICAgICAgIChXZWJDb3JlOjpKUEVHSW1hZ2VEZWNv
ZGVyOjpvdXRwdXRTY2FubGluZXMpOgorICAgICAgICAqIHBsYXRmb3JtL2ltYWdlLWRlY29kZXJz
L3NraWEvSlBFR0ltYWdlRGVjb2Rlci5oOgorICAgICAgICAoV2ViQ29yZTo6SlBFR0ltYWdlRGVj
b2Rlcjo6ZmlsZW5hbWVFeHRlbnNpb24pOgorICAgICAgICAoV2ViQ29yZTo6SlBFR0ltYWdlRGVj
b2Rlcjo6c3VwcG9ydHNBbHBoYSk6CisgICAgICAgIChXZWJDb3JlOjpKUEVHSW1hZ2VEZWNvZGVy
OjpyZWFkZXIpOgorICAgICAgICAqIHBsYXRmb3JtL2ltYWdlLWRlY29kZXJzL3NraWEvUE5HSW1h
Z2VEZWNvZGVyLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlBOR0ltYWdlUmVhZGVyOjpjbG9zZSk6
CisgICAgICAgIChXZWJDb3JlOjpQTkdJbWFnZURlY29kZXI6OlBOR0ltYWdlRGVjb2Rlcik6Cisg
ICAgICAgIChXZWJDb3JlOjpQTkdJbWFnZURlY29kZXI6OmlzU2l6ZUF2YWlsYWJsZSk6CisgICAg
ICAgIChXZWJDb3JlOjpQTkdJbWFnZURlY29kZXI6OmZyYW1lQnVmZmVyQXRJbmRleCk6CisgICAg
ICAgIChXZWJDb3JlOjpQTkdJbWFnZURlY29kZXI6OmRlY29kZSk6CisgICAgICAgIChXZWJDb3Jl
OjpQTkdJbWFnZURlY29kZXI6OmRlY29kaW5nRmFpbGVkKToKKyAgICAgICAgKFdlYkNvcmU6OlBO
R0ltYWdlRGVjb2Rlcjo6aGVhZGVyQXZhaWxhYmxlKToKKyAgICAgICAgKFdlYkNvcmU6OnJvd0F2
YWlsYWJsZSk6CisgICAgICAgIChXZWJDb3JlOjpQTkdJbWFnZURlY29kZXI6OnJvd0F2YWlsYWJs
ZSk6CisgICAgICAgIChXZWJDb3JlOjpQTkdJbWFnZURlY29kZXI6OnBuZ0NvbXBsZXRlKToKKyAg
ICAgICAgKiBwbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9za2lhL1BOR0ltYWdlRGVjb2Rlci5oOgor
ICAgICAgICAoV2ViQ29yZTo6UE5HSW1hZ2VEZWNvZGVyOjpmaWxlbmFtZUV4dGVuc2lvbik6Cisg
ICAgICAgIChXZWJDb3JlOjpQTkdJbWFnZURlY29kZXI6OnJlYWRlcik6CisgICAgICAgICogcGxh
dGZvcm0vaW1hZ2UtZGVjb2RlcnMvc2tpYS9YQk1JbWFnZURlY29kZXIuY3BwOiBBZGRlZC4KKyAg
ICAgICAgKiBwbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9za2lhL1hCTUltYWdlRGVjb2Rlci5oOiBB
ZGRlZC4KKworMjAwOS0wMS0yMyAgRGFyaW4gRmlzaGVyICA8ZGFyaW5AY2hyb21pdW0ub3JnPgor
CisgICAgICAgIFJldmlld2VkIGJ5IEVyaWMgU2VpZGVsLgorCisgICAgICAgIGh0dHBzOi8vYnVn
cy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yMzUwNgogICAgICAgICBDb3B5IGV4aXN0aW5n
IEltYWdlRGVjb2Rlci5oIGluIHByZXBhcmF0aW9uIGZvciBsYW5kaW5nIFNraWEgY2hhbmdlcyBv
biB0b3AuCiAKICAgICAgICAgKiBwbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9za2lhL0ltYWdlRGVj
b2Rlci5oOiBDb3BpZWQgZnJvbSBwbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9JbWFnZURlY29kZXIu
aC4KSW5kZXg6IHBsYXRmb3JtL2ltYWdlLWRlY29kZXJzL3NraWEvQk1QSW1hZ2VEZWNvZGVyLmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBwbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9za2lhL0JNUEltYWdlRGVj
b2Rlci5jcHAJKHJldmlzaW9uIDApCisrKyBwbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9za2lhL0JN
UEltYWdlRGVjb2Rlci5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKGMpIDIwMDgsIDIwMDksIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICogCisgKiAg
ICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhl
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQor
ICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5j
LiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVu
ZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUg
d2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiAKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklC
VVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBP
V05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
CisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKwor
I2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkJNUEltYWdlRGVjb2Rlci5oIgorCituYW1l
c3BhY2UgV2ViQ29yZSB7CisKKy8vIE51bWJlciBvZiBiaXRzIGluIC5CTVAgdXNlZCB0byBzdG9y
ZSB0aGUgZmlsZSBoZWFkZXIgKGRvZXNuJ3QgbWF0Y2gKKy8vICJzaXplb2YoQk1QSW1hZ2VEZWNv
ZGVyOjpCaXRtYXBGaWxlSGVhZGVyKSIgc2luY2Ugd2Ugb21pdCBzb21lIGZpZWxkcyBhbmQKKy8v
IGRvbid0IHBhY2spLgorc3RhdGljIGNvbnN0IHNpemVfdCBzaXplT2ZGaWxlSGVhZGVyID0gMTQ7
CisKK3ZvaWQgQk1QSW1hZ2VEZWNvZGVyOjpkZWNvZGVJbWFnZShTaGFyZWRCdWZmZXIqIGRhdGEp
Cit7CisgICAgLy8gUmVhZCBhbmQgcHJvY2VzcyBmaWxlIGhlYWRlci4KKyAgICBpZiAoKG1fZGVj
b2RlZE9mZnNldCA8IHNpemVPZkZpbGVIZWFkZXIpICYmICFwcm9jZXNzRmlsZUhlYWRlcihkYXRh
KSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gRGVjb2RlIEJNUC4KKyAgICBkZWNvZGVCTVAo
ZGF0YSk7Cit9CisKK2Jvb2wgQk1QSW1hZ2VEZWNvZGVyOjpwcm9jZXNzRmlsZUhlYWRlcihTaGFy
ZWRCdWZmZXIqIGRhdGEpCit7CisgICAgLy8gUmVhZCBmaWxlIGhlYWRlci4KKyAgICBBU1NFUlQo
IW1fZGVjb2RlZE9mZnNldCk7CisgICAgaWYgKGRhdGEtPnNpemUoKSA8IHNpemVPZkZpbGVIZWFk
ZXIpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBjb25zdCB1aW50MTZfdCBmaWxlVHlwZSA9
CisgICAgICAgIChkYXRhLT5kYXRhKClbMF0gPDwgOCkgfCBzdGF0aWNfY2FzdDx1aW50OF90Pihk
YXRhLT5kYXRhKClbMV0pOworICAgIG1faW1nRGF0YU9mZnNldCA9IHJlYWRVaW50MzIoZGF0YSwg
MTApOworICAgIG1fZGVjb2RlZE9mZnNldCA9IG1faGVhZGVyT2Zmc2V0ID0gc2l6ZU9mRmlsZUhl
YWRlcjsKKworICAgIC8vIFNlZSBpZiB0aGlzIGlzIGEgYml0bWFwIGZpbGV0eXBlIHdlIHVuZGVy
c3RhbmQuCisgICAgZW51bSB7CisgICAgICAgIEJNQVAgPSAnQk0nLAorICAgICAgICAvLyBUaGUg
Zm9sbG93aW5nIGFkZGl0aW9uYWwgT1MvMiAyLnggaGVhZGVyIHZhbHVlcyAoc2VlCisgICAgICAg
IC8vIGh0dHA6Ly93d3cuZmlsZWZvcm1hdC5pbmZvL2Zvcm1hdC9vczJibXAvZWdmZi5odG0gKSBh
cmVuJ3Qgd2lkZWx5CisgICAgICAgIC8vIGRlY29kZWQsIGFuZCBhcmUgdW5saWtlbHkgdG8gYmUg
aW4gbXVjaCB1c2UuCisgICAgICAgIC8qCisgICAgICAgIElDT04gPSAnSUMnLAorICAgICAgICBQ
T0lOVEVSID0gJ1BUJywKKyAgICAgICAgQ09MT1JJQ09OID0gJ0NJJywKKyAgICAgICAgQ09MT1JQ
T0lOVEVSID0gJ0NQJywKKyAgICAgICAgQklUTUFQQVJSQVkgPSAnQkEnLAorICAgICAgICAqLwor
ICAgIH07CisgICAgaWYgKGZpbGVUeXBlICE9IEJNQVApCisgICAgICAgIG1fZmFpbGVkID0gdHJ1
ZTsKKworICAgIHJldHVybiAhbV9mYWlsZWQ7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUK
SW5kZXg6IHBsYXRmb3JtL2ltYWdlLWRlY29kZXJzL3NraWEvQk1QSW1hZ2VEZWNvZGVyLmgKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvc2tpYS9CTVBJbWFnZURlY29kZXIu
aAkocmV2aXNpb24gMCkKKysrIHBsYXRmb3JtL2ltYWdlLWRlY29kZXJzL3NraWEvQk1QSW1hZ2VE
ZWNvZGVyLmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KGMpIDIwMDgsIDIwMDksIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICogCisgKiAgICAgKiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJp
YnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhl
IG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3Ig
cHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBz
cGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiAKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAq
ICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVP
UlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBC
TVBJbWFnZURlY29kZXJfaAorI2RlZmluZSBCTVBJbWFnZURlY29kZXJfaAorCisjaW5jbHVkZSAi
Qk1QSW1hZ2VSZWFkZXIuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCisgICAgLy8gVGhpcyBj
bGFzcyBkZWNvZGVzIHRoZSBCTVAgaW1hZ2UgZm9ybWF0LgorICAgIGNsYXNzIEJNUEltYWdlRGVj
b2RlciA6IHB1YmxpYyBCTVBJbWFnZVJlYWRlciB7CisgICAgcHVibGljOgorICAgICAgICB2aXJ0
dWFsIFN0cmluZyBmaWxlbmFtZUV4dGVuc2lvbigpIGNvbnN0IHsgcmV0dXJuICJibXAiOyB9CisK
KyAgICAgICAgLy8gQk1QSW1hZ2VSZWFkZXIKKyAgICAgICAgdmlydHVhbCB2b2lkIGRlY29kZUlt
YWdlKFNoYXJlZEJ1ZmZlciopOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgLy8gUHJvY2Vzc2Vz
IHRoZSBmaWxlIGhlYWRlciBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBkYXRhLiAgUmV0dXJucyB0
cnVlIGlmCisgICAgICAgIC8vIHRoZSBmaWxlIGhlYWRlciBjb3VsZCBiZSBkZWNvZGVkLgorICAg
ICAgICBib29sIHByb2Nlc3NGaWxlSGVhZGVyKFNoYXJlZEJ1ZmZlciopOworICAgIH07CisKK30g
Ly8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmCkluZGV4OiBwbGF0Zm9ybS9pbWFnZS1kZWNv
ZGVycy9za2lhL0JNUEltYWdlUmVhZGVyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBwbGF0Zm9ybS9pbWFn
ZS1kZWNvZGVycy9za2lhL0JNUEltYWdlUmVhZGVyLmNwcAkocmV2aXNpb24gMCkKKysrIHBsYXRm
b3JtL2ltYWdlLWRlY29kZXJzL3NraWEvQk1QSW1hZ2VSZWFkZXIuY3BwCShyZXZpc2lvbiAwKQpA
QCAtMCwwICsxLDgzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSwgR29vZ2xl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMgYXJlCisgKiBtZXQ6CisgKiAKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisg
KiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0
aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250
cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2
ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4g
cGVybWlzc2lvbi4KKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09Q
WVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQg
VE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5U
IFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElN
SVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAi
Qk1QSW1hZ2VSZWFkZXIuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitCTVBJbWFnZVJlYWRl
cjo6Qk1QSW1hZ2VSZWFkZXIoKQorICAgIDogbV9kZWNvZGVkT2Zmc2V0KDApCisgICAgLCBtX2hl
YWRlck9mZnNldCgwKQorICAgICwgbV9pbWdEYXRhT2Zmc2V0KDApCisgICAgLCBtX2FuZE1hc2tT
dGF0ZShOb25lKQorICAgICwgbV9pc09TMjF4KGZhbHNlKQorICAgICwgbV9pc09TMjJ4KGZhbHNl
KQorICAgICwgbV9pc1RvcERvd24oZmFsc2UpCisgICAgLCBtX25lZWRUb1Byb2Nlc3NCaXRtYXNr
cyhmYWxzZSkKKyAgICAsIG1fbmVlZFRvUHJvY2Vzc0NvbG9yVGFibGUoZmFsc2UpCisgICAgLCBt
X3RhYmxlU2l6ZUluQnl0ZXMoMCkKKyAgICAsIG1fc2Vlbk5vblplcm9BbHBoYVBpeGVsKGZhbHNl
KQorICAgICwgbV9zZWVuWmVyb0FscGhhUGl4ZWwoZmFsc2UpCit7CisgICAgbV9mcmFtZUJ1ZmZl
ckNhY2hlLnJlc2l6ZSgxKTsKKworICAgIC8vIENsdWUtaW4gZGVjb2RlQk1QKCkgdGhhdCB3ZSBu
ZWVkIHRvIGRldGVjdCB0aGUgY29ycmVjdCBpbmZvIGhlYWRlciBzaXplLgorICAgIG1lbXNldCgm
bV9pbmZvSGVhZGVyLCAwLCBzaXplb2YobV9pbmZvSGVhZGVyKSk7Cit9CisKK3ZvaWQgQk1QSW1h
Z2VSZWFkZXI6OnNldERhdGEoU2hhcmVkQnVmZmVyKiBkYXRhLCBib29sIGFsbERhdGFSZWNlaXZl
ZCkKK3sKKyAgICBJbWFnZURlY29kZXI6OnNldERhdGEoZGF0YSwgYWxsRGF0YVJlY2VpdmVkKTsK
KworICAgIC8vIE5PVEU6IFRoaXMgZnVuY3Rpb24gaW50ZW50aW9uYWxseSB1c2VzIGZyYW1lQnVm
ZmVyQXRJbmRleCgpIGluc3RlYWQgb2YKKyAgICAvLyBjaGVja2luZyBtX2ZyYW1lQnVmZmVyQ2Fj
aGUuZmlyc3QoKSBkaXJlY3RseSwgc28gdGhhdCBpdCB3aWxsIGRvIHRoZQorICAgIC8vIHJpZ2h0
IHRoaW5nIGZvciBJQ09JbWFnZURlY29kZXIsIHdoaWNoIG5lZWRzIHRvIG92ZXJyaWRlIHRoaXMg
YWNjZXNzb3IKKyAgICAvLyB0byBzdXBwb3J0IElDT3Mgd2hpY2ggY29udGFpbiBQTkdzLgorCisg
ICAgLy8gUmV0dXJuIHF1aWNrbHkgd2hlbiB3ZSBjYW4ndCBkbyBhbnkgbW9yZSB3b3JrLgorICAg
IGlmIChtX2ZhaWxlZCB8fCBkYXRhLT5pc0VtcHR5KCkKKyAgICAgICAgfHwgKGZyYW1lQnVmZmVy
QXRJbmRleCgwKS0+c3RhdHVzKCkgPT0gUkdCQTMyQnVmZmVyOjpGcmFtZUNvbXBsZXRlKSkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgLy8gRGVjb2RlIGFzIG11Y2ggYXMgd2UgY2FuLiAgVGhpcyBh
c3N1bWVzIHxkYXRhfCBzdGFydHMgYXQgdGhlIGJlZ2lubmluZworICAgIC8vIG9mIHRoZSBpbWFn
ZSBkYXRhLCByYXRoZXIgdGhhbiBjb250YWluaW5nIGp1c3QgdGhlIGxhdGVzdCBjaHVuay4KKyAg
ICBkZWNvZGVJbWFnZShkYXRhKTsKKyAgICBpZiAobV9mYWlsZWQpIHsKKyAgICAgICAgLy8gSGFu
ZGxlIGZhaWx1cmUgYmVmb3JlIGdldHRpbmcgdGhlIGZyYW1lYnVmZmVyIGJlbG93LgorICAgICAg
ICBtX2NvbG9yVGFibGUuY2xlYXIoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8v
IElmIHdlIGdvdCBhbGwgdGhlIGRhdGEgYnV0IGNvdWxkbid0IGZpbmlzaCBkZWNvZGluZywgZmFp
bC4KKyAgICBjb25zdCBib29sIGZpbmlzaGVkID0KKyAgICAgICAgKGZyYW1lQnVmZmVyQXRJbmRl
eCgwKS0+c3RhdHVzKCkgPT0gUkdCQTMyQnVmZmVyOjpGcmFtZUNvbXBsZXRlKTsKKyAgICBpZiAo
YWxsRGF0YVJlY2VpdmVkICYmICFmaW5pc2hlZCkKKyAgICAgICAgbV9mYWlsZWQgPSB0cnVlOwor
CisgICAgLy8gUmVsZWFzZSB0aGUgY29sb3IgdGFibGUgd2hlbiB3ZSBubyBsb25nZXIgbmVlZCBp
dC4KKyAgICBpZiAoZmluaXNoZWQgfHwgbV9mYWlsZWQpCisgICAgICAgIG1fY29sb3JUYWJsZS5j
bGVhcigpOworfQorCitSR0JBMzJCdWZmZXIqIEJNUEltYWdlUmVhZGVyOjpmcmFtZUJ1ZmZlckF0
SW5kZXgoc2l6ZV90IGluZGV4KQoreworICAgIHJldHVybiBpbmRleCA/IDAgOiAmbV9mcmFtZUJ1
ZmZlckNhY2hlLmZpcnN0KCk7Cit9CisKK3ZvaWQgQk1QSW1hZ2VSZWFkZXI6OmRlY29kZUJNUChT
aGFyZWRCdWZmZXIqIGRhdGEpCit7CisgICAgLy8gQ2FsY3VsYXRlIHNpemUgb2YgaW5mbyBoZWFk
ZXIuCisgICAgaWYgKCFtX2luZm9IZWFkZXIuYmlTaXplICYmICFnZXRJbmZvSGVhZGVyU2l6ZShk
YXRhKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gUmVhZCBhbmQgcHJvY2VzcyBpbmZvIGhl
YWRlci4KKyAgICBpZiAoKG1fZGVjb2RlZE9mZnNldCA8IChtX2hlYWRlck9mZnNldCArIG1faW5m
b0hlYWRlci5iaVNpemUpKQorICAgICAgICAmJiAhcHJvY2Vzc0luZm9IZWFkZXIoZGF0YSkpCisg
ICAgICAgIHJldHVybjsKKworICAgIC8vIFJlYWQgYW5kIHByb2Nlc3MgdGhlIGJpdG1hc2tzLCBp
ZiBuZWVkZWQuCisgICAgaWYgKG1fbmVlZFRvUHJvY2Vzc0JpdG1hc2tzICYmICFwcm9jZXNzQml0
bWFza3MoZGF0YSkpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIFJlYWQgYW5kIHByb2Nlc3Mg
dGhlIGNvbG9yIHRhYmxlLCBpZiBuZWVkZWQuCisgICAgaWYgKG1fbmVlZFRvUHJvY2Vzc0NvbG9y
VGFibGUgJiYgIXByb2Nlc3NDb2xvclRhYmxlKGRhdGEpKQorICAgICAgICByZXR1cm47CisKKyAg
ICAvLyBJbml0aWFsaXplIGZyYW1lIGJ1ZmZlciBzdGF0ZSwgaWYgbmVlZGVkLgorICAgIGlmICht
X2ZyYW1lQnVmZmVyQ2FjaGUuZmlyc3QoKS5zdGF0dXMoKSA9PSBSR0JBMzJCdWZmZXI6OkZyYW1l
RW1wdHkpIHsKKyAgICAgICAgbV9mcmFtZUJ1ZmZlckNhY2hlLmZpcnN0KCkuc2V0UmVjdChJbnRS
ZWN0KEludFBvaW50KCksIHNpemUoKSkpOworICAgICAgICBtX2ZyYW1lQnVmZmVyQ2FjaGUuZmly
c3QoKS5zZXRTdGF0dXMoUkdCQTMyQnVmZmVyOjpGcmFtZVBhcnRpYWwpOworICAgICAgICBpZiAo
IW1fZnJhbWVCdWZmZXJDYWNoZS5maXJzdCgpLnNldFNpemUobV9pbmZvSGVhZGVyLmJpV2lkdGgs
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2luZm9I
ZWFkZXIuYmlIZWlnaHQpKSB7CisgICAgICAgICAgICAvLyBVbmFibGUgdG8gYWxsb2NhdGUuCisg
ICAgICAgICAgICBtX2ZhaWxlZCA9IHRydWU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAg
IH0KKworICAgICAgICAvLyBzZXRTaXplKCkgY2FsbHMgZXJhc2VBUkdCKCksIHdoaWNoIHJlc2V0
cyB0aGUgYWxwaGEgZmxhZywgc28gd2UgZm9yY2UKKyAgICAgICAgLy8gaXQgYmFjayB0byBmYWxz
ZSBoZXJlLiAgV2UnbGwgc2V0IGl0IHRydWUgYmVsb3cgaW4gYWxsIGNhc2VzIHdoZXJlCisgICAg
ICAgIC8vIHRoZXNlIDBzIGNvdWxkIGFjdHVhbGx5IHNob3cgdGhyb3VnaC4KKyAgICAgICAgbV9m
cmFtZUJ1ZmZlckNhY2hlLmZpcnN0KCkuc2V0SGFzQWxwaGEoZmFsc2UpOworICAgICAgICBpZiAo
IW1faXNUb3BEb3duKQorICAgICAgICAgICAgbV9jb29yZC5zZXRZKHNpemUoKS5oZWlnaHQoKSAt
IDEpOworICAgIH0KKworICAgIC8vIERlY29kZSB0aGUgZGF0YS4KKyAgICBpZiAoKG1fYW5kTWFz
a1N0YXRlICE9IERlY29kaW5nKSAmJiAhcGFzdEVuZE9mSW1hZ2UoMCkpIHsKKyAgICAgICAgaWYg
KChtX2luZm9IZWFkZXIuYmlDb21wcmVzc2lvbiA9PSBSTEU0KQorICAgICAgICAgICAgfHwgKG1f
aW5mb0hlYWRlci5iaUNvbXByZXNzaW9uID09IFJMRTgpCisgICAgICAgICAgICB8fCAobV9pbmZv
SGVhZGVyLmJpQ29tcHJlc3Npb24gPT0gUkxFMjQpKSB7CisgICAgICAgICAgICBpZiAoIXByb2Nl
c3NSTEVEYXRhKGRhdGEpKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNl
IGlmICghcHJvY2Vzc05vblJMRURhdGEoZGF0YSwgZmFsc2UsIDApKQorICAgICAgICAgICAgcmV0
dXJuOworICAgIH0KKworICAgIC8vIElmIHRoZSBpbWFnZSBoYXMgYW4gQU5EIG1hc2sgYW5kIHRo
ZXJlIHdhcyBubyBhbHBoYSBkYXRhLCBwcm9jZXNzIHRoZQorICAgIC8vIG1hc2suCisgICAgaWYg
KChtX2FuZE1hc2tTdGF0ZSA9PSBOb3RZZXREZWNvZGVkKQorICAgICAgICAmJiAhbV9mcmFtZUJ1
ZmZlckNhY2hlLmZpcnN0KCkuaGFzQWxwaGEoKSkgeworICAgICAgICAvLyBSZXNldCBkZWNvZGlu
ZyBjb29yZGluYXRlcyB0byBzdGFydCBvZiBpbWFnZS4KKyAgICAgICAgbV9jb29yZC5zZXRYKDAp
OworICAgICAgICBtX2Nvb3JkLnNldFkobV9pc1RvcERvd24gPyAwIDogKHNpemUoKS5oZWlnaHQo
KSAtIDEpKTsKKworICAgICAgICAvLyBUaGUgQU5EIG1hc2sgaXMgc3RvcmVkIGFzIDEtYml0IGRh
dGEuCisgICAgICAgIG1faW5mb0hlYWRlci5iaUJpdENvdW50ID0gMTsKKworICAgICAgICBtX2Fu
ZE1hc2tTdGF0ZSA9IERlY29kaW5nOworICAgIH0KKyAgICBpZiAoKG1fYW5kTWFza1N0YXRlID09
IERlY29kaW5nKSAmJiAhcHJvY2Vzc05vblJMRURhdGEoZGF0YSwgZmFsc2UsIDApKQorICAgICAg
ICByZXR1cm47CisKKyAgICAvLyBEb25lIQorICAgIG1fZnJhbWVCdWZmZXJDYWNoZS5maXJzdCgp
LnNldFN0YXR1cyhSR0JBMzJCdWZmZXI6OkZyYW1lQ29tcGxldGUpOworfQorCitib29sIEJNUElt
YWdlUmVhZGVyOjpnZXRJbmZvSGVhZGVyU2l6ZShTaGFyZWRCdWZmZXIqIGRhdGEpCit7CisgICAg
Ly8gR2V0IHNpemUgb2YgaW5mbyBoZWFkZXIuCisgICAgQVNTRVJUKG1fZGVjb2RlZE9mZnNldCA9
PSBtX2hlYWRlck9mZnNldCk7CisgICAgaWYgKChtX2RlY29kZWRPZmZzZXQgPiBkYXRhLT5zaXpl
KCkpCisgICAgICAgIHx8ICgoZGF0YS0+c2l6ZSgpIC0gbV9kZWNvZGVkT2Zmc2V0KSA8IDQpKQor
ICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgbV9pbmZvSGVhZGVyLmJpU2l6ZSA9IHJlYWRVaW50
MzIoZGF0YSwgMCk7CisgICAgLy8gRG9uJ3QgaW5jcmVtZW50IG1fZGVjb2RlZE9mZnNldCBoZXJl
LCBpdCBqdXN0IG1ha2VzIHRoZSBjb2RlIGluCisgICAgLy8gcHJvY2Vzc0luZm9IZWFkZXIoKSBt
b3JlIGNvbmZ1c2luZy4KKworICAgIC8vIERvbid0IGFsbG93IHRoZSBoZWFkZXIgdG8gb3ZlcmZs
b3cgKHdoaWNoIHdvdWxkIGJlIGhhcm1sZXNzIGhlcmUsIGJ1dAorICAgIC8vIHByb2JsZW1hdGlj
IG9yIGF0IGxlYXN0IGNvbmZ1c2luZyBpbiBvdGhlciBwbGFjZXMpLCBvciB0byBvdmVycnVuIHRo
ZQorICAgIC8vIGltYWdlIGRhdGEuCisgICAgaWYgKCgobV9oZWFkZXJPZmZzZXQgKyBtX2luZm9I
ZWFkZXIuYmlTaXplKSA8IG1faGVhZGVyT2Zmc2V0KQorICAgICAgICB8fCAobV9pbWdEYXRhT2Zm
c2V0CisgICAgICAgICAgICAmJiAobV9pbWdEYXRhT2Zmc2V0IDwgKG1faGVhZGVyT2Zmc2V0ICsg
bV9pbmZvSGVhZGVyLmJpU2l6ZSkpKSkgeworICAgICAgICBtX2ZhaWxlZCA9IHRydWU7CisgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBTZWUgaWYgdGhpcyBpcyBhIGhlYWRl
ciBzaXplIHdlIHVuZGVyc3RhbmQ6CisgICAgLy8gT1MvMiAxLng6IDEyCisgICAgaWYgKG1faW5m
b0hlYWRlci5iaVNpemUgPT0gMTIpCisgICAgICAgIG1faXNPUzIxeCA9IHRydWU7CisgICAgLy8g
V2luZG93cyBWMzogNDAKKyAgICBlbHNlIGlmICgobV9pbmZvSGVhZGVyLmJpU2l6ZSA9PSA0MCkg
fHwgaXNXaW5kb3dzVjRQbHVzKCkpCisgICAgICAgIDsKKyAgICAvLyBPUy8yIDIueDogYW55IG11
bHRpcGxlIG9mIDQgYmV0d2VlbiAxNiBhbmQgNjQsIGluY2x1c2l2ZSwgb3IgNDIgb3IgNDYKKyAg
ICBlbHNlIGlmICgobV9pbmZvSGVhZGVyLmJpU2l6ZSA+PSAxNikgJiYgKG1faW5mb0hlYWRlci5i
aVNpemUgPD0gNjQpCisgICAgICAgICAgICAgJiYgKCgobV9pbmZvSGVhZGVyLmJpU2l6ZSAmIDMp
ID09IDApIHx8IChtX2luZm9IZWFkZXIuYmlTaXplID09IDQyKQorICAgICAgICAgICAgICAgICB8
fCAobV9pbmZvSGVhZGVyLmJpU2l6ZSA9PSA0NikpKQorICAgICAgICBtX2lzT1MyMnggPSB0cnVl
OworICAgIGVsc2UKKyAgICAgICAgbV9mYWlsZWQgPSB0cnVlOworCisgICAgcmV0dXJuICFtX2Zh
aWxlZDsKK30KKworYm9vbCBCTVBJbWFnZVJlYWRlcjo6cHJvY2Vzc0luZm9IZWFkZXIoU2hhcmVk
QnVmZmVyKiBkYXRhKQoreworICAgIC8vIFJlYWQgaW5mbyBoZWFkZXIuCisgICAgQVNTRVJUKG1f
ZGVjb2RlZE9mZnNldCA9PSBtX2hlYWRlck9mZnNldCk7CisgICAgaWYgKChtX2RlY29kZWRPZmZz
ZXQgPiBkYXRhLT5zaXplKCkpCisgICAgICAgIHx8ICgoZGF0YS0+c2l6ZSgpIC0gbV9kZWNvZGVk
T2Zmc2V0KSA8IG1faW5mb0hlYWRlci5iaVNpemUpCisgICAgICAgIHx8ICFyZWFkSW5mb0hlYWRl
cihkYXRhKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIG1fZGVjb2RlZE9mZnNldCArPSBt
X2luZm9IZWFkZXIuYmlTaXplOworCisgICAgLy8gU2FuaXR5LWNoZWNrIGhlYWRlciB2YWx1ZXMu
CisgICAgaWYgKCFpc0luZm9IZWFkZXJWYWxpZCgpKSB7CisgICAgICAgIG1fZmFpbGVkID0gdHJ1
ZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIE1ha2Ugb3VyIHNpemUg
YXZhaWxhYmxlIHRvIHRoZSBjYWxsZXIuCisgICAgaWYgKCFzZXRTaXplKG1faW5mb0hlYWRlci5i
aVdpZHRoLCBtX2luZm9IZWFkZXIuYmlIZWlnaHQpKSB7CisgICAgICAgIG1fZmFpbGVkID0gdHJ1
ZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIEZvciBwYWxldHRlZCBp
bWFnZXMsIGJpdG1hcHMgY2FuIHNldCBiaUNsclVzZWQgdG8gMCB0byBtZWFuICJhbGwKKyAgICAv
LyBjb2xvcnMiLCBzbyBzZXQgaXQgdG8gdGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbG9ycyBmb3Ig
dGhpcyBiaXQgZGVwdGguCisgICAgLy8gQWxzbyBkbyB0aGlzIGZvciBiaXRtYXBzIHRoYXQgcHV0
IHRvbyBsYXJnZSBhIHZhbHVlIGhlcmUuCisgICAgaWYgKG1faW5mb0hlYWRlci5iaUJpdENvdW50
IDwgMTYpIHsKKyAgICAgIGNvbnN0IHVpbnQzMl90IG1heENvbG9ycyA9CisgICAgICAgICAgc3Rh
dGljX2Nhc3Q8dWludDMyX3Q+KDEpIDw8IG1faW5mb0hlYWRlci5iaUJpdENvdW50OworICAgICAg
aWYgKChtX2luZm9IZWFkZXIuYmlDbHJVc2VkID09IDApCisgICAgICAgICAgfHwgKG1faW5mb0hl
YWRlci5iaUNsclVzZWQgPiBtYXhDb2xvcnMpKQorICAgICAgICBtX2luZm9IZWFkZXIuYmlDbHJV
c2VkID0gbWF4Q29sb3JzOworICAgIH0KKworICAgIC8vIEZvciBhbnkgYml0bWFwcyB0aGF0IHNl
dCB0aGVpciBCaXRDb3VudCB0byB0aGUgd3JvbmcgdmFsdWUsIHJlc2V0IHRoZQorICAgIC8vIGNv
dW50cyBub3cgdGhhdCB3ZSd2ZSBjYWxjdWxhdGVkIHRoZSBudW1iZXIgb2YgbmVjZXNzYXJ5IGNv
bG9ycywgc2luY2UKKyAgICAvLyBvdGhlciBjb2RlIHJlbGllcyBvbiB0aGlzIHZhbHVlIGJlaW5n
IGNvcnJlY3QuCisgICAgaWYgKG1faW5mb0hlYWRlci5iaUNvbXByZXNzaW9uID09IFJMRTgpCisg
ICAgICAgIG1faW5mb0hlYWRlci5iaUJpdENvdW50ID0gODsKKyAgICBlbHNlIGlmIChtX2luZm9I
ZWFkZXIuYmlDb21wcmVzc2lvbiA9PSBSTEU0KQorICAgICAgICBtX2luZm9IZWFkZXIuYmlCaXRD
b3VudCA9IDQ7CisKKyAgICAvLyBUZWxsIGNhbGxlciB3aGF0IHN0aWxsIG5lZWRzIHRvIGJlIHBy
b2Nlc3NlZC4KKyAgICBpZiAobV9pbmZvSGVhZGVyLmJpQml0Q291bnQgPj0gMTYpCisgICAgICAg
IG1fbmVlZFRvUHJvY2Vzc0JpdG1hc2tzID0gdHJ1ZTsKKyAgICBlbHNlIGlmIChtX2luZm9IZWFk
ZXIuYmlCaXRDb3VudCA+IDApCisgICAgICAgIG1fbmVlZFRvUHJvY2Vzc0NvbG9yVGFibGUgPSB0
cnVlOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQk1QSW1hZ2VSZWFkZXI6OnJlYWRJ
bmZvSGVhZGVyKFNoYXJlZEJ1ZmZlciogZGF0YSkKK3sKKyAgICAvLyBQcmUtaW5pdGlhbGl6ZSBz
b21lIGZpZWxkcyB0aGF0IG5vdCBhbGwgaGVhZGVycyBzZXQuCisgICAgbV9pbmZvSGVhZGVyLmJp
Q29tcHJlc3Npb24gPSBSR0I7CisgICAgbV9pbmZvSGVhZGVyLmJpQ2xyVXNlZCA9IDA7CisKKyAg
ICBpZiAobV9pc09TMjF4KSB7CisgICAgICAgIG1faW5mb0hlYWRlci5iaVdpZHRoID0gcmVhZFVp
bnQxNihkYXRhLCA0KTsKKyAgICAgICAgbV9pbmZvSGVhZGVyLmJpSGVpZ2h0ID0gcmVhZFVpbnQx
NihkYXRhLCA2KTsKKyAgICAgICAgQVNTRVJUKG1fYW5kTWFza1N0YXRlID09IE5vbmUpOyAgLy8g
SUNPIGlzIGEgV2luZG93cyBmb3JtYXQsIG5vdCBPUy8yIQorICAgICAgICBtX2luZm9IZWFkZXIu
YmlCaXRDb3VudCA9IHJlYWRVaW50MTYoZGF0YSwgMTApOworICAgICAgICByZXR1cm4gdHJ1ZTsK
KyAgICB9CisKKyAgICBtX2luZm9IZWFkZXIuYmlXaWR0aCA9IHJlYWRVaW50MzIoZGF0YSwgNCk7
CisgICAgbV9pbmZvSGVhZGVyLmJpSGVpZ2h0ID0gcmVhZFVpbnQzMihkYXRhLCA4KTsKKyAgICBp
ZiAobV9hbmRNYXNrU3RhdGUgIT0gTm9uZSkKKyAgICAgICAgbV9pbmZvSGVhZGVyLmJpSGVpZ2h0
IC89IDI7CisgICAgbV9pbmZvSGVhZGVyLmJpQml0Q291bnQgPSByZWFkVWludDE2KGRhdGEsIDE0
KTsKKworICAgIC8vIFJlYWQgY29tcHJlc3Npb24gdHlwZSwgaWYgcHJlc2VudC4KKyAgICBpZiAo
bV9pbmZvSGVhZGVyLmJpU2l6ZSA+PSAyMCkgeworICAgICAgICB1aW50MzJfdCBiaUNvbXByZXNz
aW9uID0gcmVhZFVpbnQzMihkYXRhLCAxNik7CisKKyAgICAgICAgLy8gRGV0ZWN0IE9TLzIgMi54
LXNwZWNpZmljIGNvbXByZXNzaW9uIHR5cGVzLgorICAgICAgICBpZiAoKGJpQ29tcHJlc3Npb24g
PT0gMykgJiYgKG1faW5mb0hlYWRlci5iaUJpdENvdW50ID09IDEpKSB7CisgICAgICAgICAgICBt
X2luZm9IZWFkZXIuYmlDb21wcmVzc2lvbiA9IEhVRkZNQU4xRDsKKyAgICAgICAgICAgIG1faXNP
UzIyeCA9IHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAoKGJpQ29tcHJlc3Npb24gPT0gNCkgJiYg
KG1faW5mb0hlYWRlci5iaUJpdENvdW50ID09IDI0KSkgeworICAgICAgICAgICAgbV9pbmZvSGVh
ZGVyLmJpQ29tcHJlc3Npb24gPSBSTEUyNDsKKyAgICAgICAgICAgIG1faXNPUzIyeCA9IHRydWU7
CisgICAgICAgIH0gZWxzZSBpZiAoYmlDb21wcmVzc2lvbiA+IDUpIHsKKyAgICAgICAgICAgIC8v
IFNvbWUgdHlwZSB3ZSBkb24ndCB1bmRlcnN0YW5kLgorICAgICAgICAgICAgbV9mYWlsZWQgPSB0
cnVlOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGVsc2UKKyAgICAgICAg
ICAgIG1faW5mb0hlYWRlci5iaUNvbXByZXNzaW9uID0gc3RhdGljX2Nhc3Q8Q29tcHJlc3Npb25U
eXBlPihiaUNvbXByZXNzaW9uKTsKKyAgICB9CisKKyAgICAvLyBSZWFkIGNvbG9ycyB1c2VkLCBp
ZiBwcmVzZW50LgorICAgIGlmIChtX2luZm9IZWFkZXIuYmlTaXplID49IDM2KQorICAgICAgICBt
X2luZm9IZWFkZXIuYmlDbHJVc2VkID0gcmVhZFVpbnQzMihkYXRhLCAzMik7CisKKyAgICAvLyBX
aW5kb3dzIFY0KyBjYW4gc2FmZWx5IHJlYWQgdGhlIGZvdXIgYml0bWFza3MgZnJvbSA0MC01NiBi
eXRlcyBpbiwgc28gZG8KKyAgICAvLyB0aGF0IGhlcmUuICBJZiB0aGUgYml0IGRlcHRoIGlzIGxl
c3MgdGhhbiAxNiwgdGhlc2UgdmFsdWVzIHdpbGwgYmUKKyAgICAvLyBpZ25vcmVkIGJ5IHRoZSBp
bWFnZSBkYXRhIGRlY29kZXJzLiAgSWYgdGhlIGJpdCBkZXB0aCBpcyBhdCBsZWFzdCAxNiBidXQK
KyAgICAvLyB0aGUgY29tcHJlc3Npb24gZm9ybWF0IGlzbid0IEJJVEZJRUxEUywgdGhlc2UgdmFs
dWVzIHdpbGwgYmUgaWdub3JlZCBhbmQKKyAgICAvLyBvdmVyd3JpdHRlbiogaW4gcHJvY2Vzc0Jp
dG1hc2tzKCkuCisgICAgLy8gTk9URTogV2UgYWxsb3cgYWxwaGEgaGVyZS4gIE1pY3Jvc29mdCBk
b2Vzbid0IHJlYWxseSBkb2N1bWVudCB0aGlzIHdlbGwsCisgICAgLy8gYnV0IHNvbWUgQk1QcyBh
cHBlYXIgdG8gdXNlIGl0LgorICAgIC8vCisgICAgLy8gRm9yIG5vbi1XaW5kb3dzIFY0KywgbV9i
aXRNYXNrc1tdIGV0LiBhbCB3aWxsIGJlIGluaXRpYWxpemVkIGxhdGVyCisgICAgLy8gZHVyaW5n
IHByb2Nlc3NCaXRtYXNrcygpLgorICAgIC8vCisgICAgLy8gKkV4Y2VwdCB0aGUgYWxwaGEgY2hh
bm5lbC4gIEJpemFycmVseSwgc29tZSBSR0IgYml0bWFwcyBleHBlY3QgZGVjb2RlcnMKKyAgICAv
LyB0byBwYXkgYXR0ZW50aW9uIHRvIHRoZSBhbHBoYSBtYXNrIGhlcmUsIHNvIHRoZXJlJ3MgYSBz
cGVjaWFsIGNhc2UgaW4KKyAgICAvLyBwcm9jZXNzQml0bWFza3MoKSB0aGF0IGRvZXNuJ3QgYWx3
YXlzIG92ZXJ3cml0ZSB0aGF0IHZhbHVlLgorICAgIGlmIChpc1dpbmRvd3NWNFBsdXMoKSkgewor
ICAgICAgICBtX2JpdE1hc2tzWzBdID0gcmVhZFVpbnQzMihkYXRhLCA0MCk7CisgICAgICAgIG1f
Yml0TWFza3NbMV0gPSByZWFkVWludDMyKGRhdGEsIDQ0KTsKKyAgICAgICAgbV9iaXRNYXNrc1sy
XSA9IHJlYWRVaW50MzIoZGF0YSwgNDgpOworICAgICAgICBtX2JpdE1hc2tzWzNdID0gcmVhZFVp
bnQzMihkYXRhLCA1Mik7CisgICAgfQorCisgICAgLy8gRGV0ZWN0IHRvcC1kb3duIEJNUHMuCisg
ICAgaWYgKG1faW5mb0hlYWRlci5iaUhlaWdodCA8IDApIHsKKyAgICAgICAgbV9pc1RvcERvd24g
PSB0cnVlOworICAgICAgICBtX2luZm9IZWFkZXIuYmlIZWlnaHQgPSAtbV9pbmZvSGVhZGVyLmJp
SGVpZ2h0OworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEJNUEltYWdlUmVh
ZGVyOjppc0luZm9IZWFkZXJWYWxpZCgpIGNvbnN0Cit7CisgICAgLy8gTm9uLXBvc2l0aXZlIHdp
ZHRocy9oZWlnaHRzIGFyZSBpbnZhbGlkLiAgKFdlJ3ZlIGFscmVhZHkgZmxpcHBlZCB0aGUKKyAg
ICAvLyBzaWduIG9mIHRoZSBoZWlnaHQgZm9yIHRvcC1kb3duIGJpdG1hcHMuKQorICAgIGlmICgo
bV9pbmZvSGVhZGVyLmJpV2lkdGggPD0gMCkgfHwgKG1faW5mb0hlYWRlci5iaUhlaWdodCA9PSAw
KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gT25seSBXaW5kb3dzIFYzKyBoYXMg
dG9wLWRvd24gYml0bWFwcy4KKyAgICBpZiAobV9pc1RvcERvd24gJiYgKG1faXNPUzIxeCB8fCBt
X2lzT1MyMngpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBPbmx5IGJpdCBkZXB0
aHMgb2YgMSwgNCwgOCwgb3IgMjQgYXJlIHVuaXZlcnNhbGx5IHN1cHBvcnRlZC4KKyAgICBpZiAo
KG1faW5mb0hlYWRlci5iaUJpdENvdW50ICE9IDEpICYmIChtX2luZm9IZWFkZXIuYmlCaXRDb3Vu
dCAhPSA0KQorICAgICAgICAmJiAobV9pbmZvSGVhZGVyLmJpQml0Q291bnQgIT0gOCkKKyAgICAg
ICAgJiYgKG1faW5mb0hlYWRlci5iaUJpdENvdW50ICE9IDI0KSkgeworICAgICAgICAvLyBXaW5k
b3dzIFYzKyBhZGRpdGlvbmFsbHkgc3VwcG9ydHMgYml0IGRlcHRocyBvZiAwIChmb3IgZW1iZWRk
ZWQKKyAgICAgICAgLy8gSlBFRy9QTkcgaW1hZ2VzKSwgMTYsIGFuZCAzMi4KKyAgICAgICAgaWYg
KG1faXNPUzIxeCB8fCBtX2lzT1MyMngpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
ICAgIGlmICgobV9pbmZvSGVhZGVyLmJpQml0Q291bnQgIT0gMCkKKyAgICAgICAgICAgICYmICht
X2luZm9IZWFkZXIuYmlCaXRDb3VudCAhPSAxNikKKyAgICAgICAgICAgICYmIChtX2luZm9IZWFk
ZXIuYmlCaXRDb3VudCAhPSAzMikpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQor
CisgICAgLy8gRWFjaCBjb21wcmVzc2lvbiB0eXBlIGlzIG9ubHkgdmFsaWQgd2l0aCBjZXJ0YWlu
IGJpdCBkZXB0aHMgKGV4Y2VwdCBSR0IsCisgICAgLy8gd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBh
bnkgYml0IGRlcHRoKS4gIEFsc28sIHNvbWUgZm9ybWF0cyBkbyBub3QKKyAgICAvLyBzb21lIGNv
bXByZXNzaW9uIHR5cGVzLgorICAgIHN3aXRjaCAobV9pbmZvSGVhZGVyLmJpQ29tcHJlc3Npb24p
IHsKKyAgICBjYXNlIFJHQjoKKyAgICAgICAgaWYgKG1faW5mb0hlYWRlci5iaUJpdENvdW50ID09
IDApCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGJyZWFrOworCisgICAgY2Fz
ZSBSTEU4OgorICAgICAgICAvLyBTdXBwb3NlZGx5IHRoZXJlIGFyZSB1bmRvY3VtZW50ZWQgZm9y
bWF0cyBsaWtlICJCaXRDb3VudCA9IDEsCisgICAgICAgIC8vIENvbXByZXNzaW9uID0gUkxFNCIg
KHdoaWNoIG1lYW5zICI0IGJpdCwgYnV0IHdpdGggYSAyLWNvbG9yIHRhYmxlIiksCisgICAgICAg
IC8vIHNvIGFsc28gYWxsb3cgdGhlIHBhbGV0dGVkIFJMRSBjb21wcmVzc2lvbiB0eXBlcyB0byBo
YXZlIHRvbyBsb3cgYQorICAgICAgICAvLyBiaXQgY291bnQ7IHdlJ2xsIGNvcnJlY3QgdGhpcyBs
YXRlci4KKyAgICAgICAgaWYgKG1faW5mb0hlYWRlci5iaUJpdENvdW50ID09IDAgfHwgbV9pbmZv
SGVhZGVyLmJpQml0Q291bnQgPiA4KQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAg
ICBicmVhazsKKworICAgIGNhc2UgUkxFNDoKKyAgICAgICAgLy8gU2VlIGNvbW1lbnRzIGluIFJM
RTguCisgICAgICAgIGlmIChtX2luZm9IZWFkZXIuYmlCaXRDb3VudCA9PSAwIHx8IG1faW5mb0hl
YWRlci5iaUJpdENvdW50ID4gNCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAg
YnJlYWs7CisKKyAgICBjYXNlIEJJVEZJRUxEUzoKKyAgICAgICAgLy8gT25seSB2YWxpZCBmb3Ig
V2luZG93cyBWMysuCisgICAgICAgIGlmIChtX2lzT1MyMXggfHwgbV9pc09TMjJ4KQorICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoKG1faW5mb0hlYWRlci5iaUJpdENvdW50
ICE9IDE2KSAmJiAobV9pbmZvSGVhZGVyLmJpQml0Q291bnQgIT0gMzIpKQorICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgSlBFRzoKKyAgICBjYXNl
IFBORzoKKyAgICAgICAgLy8gT25seSB2YWxpZCBmb3IgV2luZG93cyBWMysuCisgICAgICAgIGlm
IChtX2lzT1MyMXggfHwgbV9pc09TMjJ4KQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
ICAgICBpZiAobV9pbmZvSGVhZGVyLmJpQml0Q291bnQgIT0gMCkKKyAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEhVRkZNQU4xRDoKKyAgICAgICAg
Ly8gT25seSB2YWxpZCBmb3IgT1MvMiAyLnguCisgICAgICAgIGlmICghbV9pc09TMjJ4KQorICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAobV9pbmZvSGVhZGVyLmJpQml0Q291
bnQgIT0gMSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgYnJlYWs7CisKKyAg
ICBjYXNlIFJMRTI0OgorICAgICAgICAvLyBPbmx5IHZhbGlkIGZvciBPUy8yIDIueC4KKyAgICAg
ICAgaWYgKCFtX2lzT1MyMngpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlm
IChtX2luZm9IZWFkZXIuYmlCaXRDb3VudCAhPSAyNCkKKyAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICAgICAgYnJlYWs7CisgICAgCisgICAgZGVmYXVsdDoKKyAgICAgICAgLy8gU29tZSB0
eXBlIHdlIGRvbid0IHVuZGVyc3RhbmQuICBUaGlzIHNob3VsZCBoYXZlIGJlZW4gY2F1Z2h0IGlu
CisgICAgICAgIC8vIHJlYWRJbmZvSGVhZGVyKCkuCisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hF
RCgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gVG9wLWRvd24gYml0
bWFwcyBjYW5ub3QgYmUgY29tcHJlc3NlZDsgdGhleSBtdXN0IGJlIFJHQiBvciBCSVRGSUVMRFMu
CisgICAgaWYgKG1faXNUb3BEb3duICYmIChtX2luZm9IZWFkZXIuYmlDb21wcmVzc2lvbiAhPSBS
R0IpCisgICAgICAgICYmIChtX2luZm9IZWFkZXIuYmlDb21wcmVzc2lvbiAhPSBCSVRGSUVMRFMp
KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBSZWplY3QgdGhlIGZvbGxvd2luZyB2
YWxpZCBiaXRtYXAgdHlwZXMgdGhhdCB3ZSBkb24ndCBjdXJyZW50bHkgYm90aGVyCisgICAgLy8g
ZGVjb2RpbmcuICBGZXcgb3RoZXIgcGVvcGxlIGRlY29kZSB0aGVzZSBlaXRoZXIsIHRoZXkncmUg
dW5saWtlbHkgdG8gYmUKKyAgICAvLyBpbiBtdWNoIHVzZS4KKyAgICAvLyBUT0RPKHBrYXN0aW5n
KTogQ29uc2lkZXIgc3VwcG9ydGluZyB0aGVzZSBzb21lZGF5LgorICAgIC8vICAgKiBCaXRtYXBz
IGxhcmdlciB0aGFuIDJeMTYgcGl4ZWxzIGluIGVpdGhlciBkaW1lbnNpb24gKFdpbmRvd3MKKyAg
ICAvLyAgICAgcHJvYmFibHkgZG9lc24ndCBkcmF3IHRoZXNlIHdlbGwgYW55d2F5LCBhbmQgdGhl
IGRlY29kZWQgZGF0YSB3b3VsZAorICAgIC8vICAgICB0YWtlIGEgbG90IG9mIG1lbW9yeSkuCisg
ICAgaWYgKChtX2luZm9IZWFkZXIuYmlXaWR0aCA+PSAoMSA8PCAxNikpCisgICAgICAgIHx8ICht
X2luZm9IZWFkZXIuYmlIZWlnaHQgPj0gKDEgPDwgMTYpKSkKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgIC8vICAgKiBXaW5kb3dzIFYzKyBKUEVHLWluLUJNUCBhbmQgUE5HLWluLUJNUCBiaXRt
YXBzIChzdXBwb3NlZGx5IG5vdCBmb3VuZAorICAgIC8vICAgICBpbiB0aGUgd2lsZCwgb25seSB1
c2VkIHRvIHNlbmQgZGF0YSB0byBwcmludGVycz8pLgorICAgIGlmICgobV9pbmZvSGVhZGVyLmJp
Q29tcHJlc3Npb24gPT0gSlBFRykKKyAgICAgICAgfHwgKG1faW5mb0hlYWRlci5iaUNvbXByZXNz
aW9uID09IFBORykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAvLyAgICogT1MvMiAyLngg
SHVmZm1hbi1lbmNvZGVkIG1vbm9jaHJvbWUgYml0bWFwcyAoc2VlCisgICAgLy8gICAgICBodHRw
Oi8vd3d3LmZpbGVmb3JtYXQuaW5mby9taXJyb3IvZWdmZi9jaDA5XzA1Lmh0bSAsIHJlOiAiRzMx
RCIKKyAgICAvLyAgICAgIGFsZ29yaXRobSkuCisgICAgaWYgKG1faW5mb0hlYWRlci5iaUNvbXBy
ZXNzaW9uID09IEhVRkZNQU4xRCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJu
IHRydWU7Cit9CisKK2Jvb2wgQk1QSW1hZ2VSZWFkZXI6OnByb2Nlc3NCaXRtYXNrcyhTaGFyZWRC
dWZmZXIqIGRhdGEpCit7CisgICAgLy8gQ3JlYXRlIG1fYml0TWFza3NbXSB2YWx1ZXMuCisgICAg
aWYgKG1faW5mb0hlYWRlci5iaUNvbXByZXNzaW9uICE9IEJJVEZJRUxEUykgeworICAgICAgICAv
LyBUaGUgZm9ybWF0IGRvZXNuJ3QgYWN0dWFsbHkgdXNlIGJpdG1hc2tzLiAgVG8gc2ltcGxpZnkg
dGhlIGRlY29kZQorICAgICAgICAvLyBsb2dpYyBsYXRlciwgY3JlYXRlIGJpdG1hc2tzIGZvciB0
aGUgUkdCIGRhdGEuICBGb3IgV2luZG93cyBWNCssCisgICAgICAgIC8vIHRoaXMgb3ZlcndyaXRl
cyB0aGUgbWFza3Mgd2UgcmVhZCBmcm9tIHRoZSBoZWFkZXIsIHdoaWNoIGFyZQorICAgICAgICAv
LyBzdXBwb3NlZCB0byBiZSBpZ25vcmVkIGluIG5vbi1CSVRGSUVMRFMgY2FzZXMuCisgICAgICAg
IC8vIDE2IGJpdHM6ICAgIE1TQiA8LSAgICAgICAgICAgICAgICAgICAgIHhSUlJSUkdHIEdHR0JC
QkJCIC0+IExTQgorICAgICAgICAvLyAyNC8zMiBiaXRzOiBNU0IgPC0gW0FBQUFBQUFBXSBSUlJS
UlJSUiBHR0dHR0dHRyBCQkJCQkJCQiAtPiBMU0IKKyAgICAgICAgY29uc3QgaW50IG51bUJpdHMg
PSAobV9pbmZvSGVhZGVyLmJpQml0Q291bnQgPT0gMTYpID8gNSA6IDg7CisgICAgICAgIGZvciAo
aW50IGkgPSAwOyBpIDw9IDI7ICsraSkgeworICAgICAgICAgICAgbV9iaXRNYXNrc1tpXSA9Cisg
ICAgICAgICAgICAgICAgKChzdGF0aWNfY2FzdDx1aW50MzJfdD4oMSkgPDwgKG51bUJpdHMgKiAo
MyAtIGkpKSkgLSAxKSBeCisgICAgICAgICAgICAgICAgKChzdGF0aWNfY2FzdDx1aW50MzJfdD4o
MSkgPDwgKG51bUJpdHMgKiAoMiAtIGkpKSkgLSAxKTsKKyAgICAgICAgfQorCisgICAgICAgIC8v
IEZvciBXaW5kb3dzIFY0KyAzMi1iaXQgUkdCLCBkb24ndCBvdmVyd3JpdGUgdGhlIGFscGhhIG1h
c2sgZnJvbSB0aGUKKyAgICAgICAgLy8gaGVhZGVyIChzZWUgbm90ZSBpbiByZWFkSW5mb0hlYWRl
cigpKS4KKyAgICAgICAgaWYgKG1faW5mb0hlYWRlci5iaUJpdENvdW50IDwgMzIpCisgICAgICAg
ICAgICBtX2JpdE1hc2tzWzNdID0gMDsKKyAgICAgICAgZWxzZSBpZiAoIWlzV2luZG93c1Y0UGx1
cygpKQorICAgICAgICAgICAgbV9iaXRNYXNrc1szXSA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pigw
eGZmMDAwMDAwKTsKKyAgICB9IGVsc2UgaWYgKCFpc1dpbmRvd3NWNFBsdXMoKSkgeworICAgICAg
ICAvLyBGb3IgV2luZG93cyBWNCsgQklURklFTERTIG1vZGUgYml0bWFwcywgdGhpcyB3YXMgYWxy
ZWFkeSBkb25lIHdoZW4KKyAgICAgICAgLy8gd2UgcmVhZCB0aGUgaW5mbyBoZWFkZXIuCisKKyAg
ICAgICAgLy8gRmFpbCBpZiB3ZSBkb24ndCBoYXZlIGVub3VnaCBmaWxlIHNwYWNlIGZvciB0aGUg
Yml0bWFza3MuCisgICAgICAgIHN0YXRpYyBjb25zdCBpbnQgU0laRU9GX0JJVE1BU0tTID0gMTI7
CisgICAgICAgIGlmICgoKG1faGVhZGVyT2Zmc2V0ICsgbV9pbmZvSGVhZGVyLmJpU2l6ZSArIFNJ
WkVPRl9CSVRNQVNLUykgPCAobV9oZWFkZXJPZmZzZXQgKyBtX2luZm9IZWFkZXIuYmlTaXplKSkK
KyAgICAgICAgICAgIHx8IChtX2ltZ0RhdGFPZmZzZXQgJiYgKG1faW1nRGF0YU9mZnNldCA8ICht
X2hlYWRlck9mZnNldCArIG1faW5mb0hlYWRlci5iaVNpemUgKyBTSVpFT0ZfQklUTUFTS1MpKSkp
IHsKKyAgICAgICAgICAgIG1fZmFpbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlYWQgYml0bWFza3MuCisgICAgICAgIGlmICgo
ZGF0YS0+c2l6ZSgpIC0gbV9kZWNvZGVkT2Zmc2V0KSA8IFNJWkVPRl9CSVRNQVNLUykKKyAgICAg
ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgbV9iaXRNYXNrc1swXSA9IHJlYWRVaW50MzIo
ZGF0YSwgMCk7CisgICAgICAgIG1fYml0TWFza3NbMV0gPSByZWFkVWludDMyKGRhdGEsIDQpOwor
ICAgICAgICBtX2JpdE1hc2tzWzJdID0gcmVhZFVpbnQzMihkYXRhLCA4KTsKKyAgICAgICAgLy8g
Tm8gYWxwaGEgaW4gYW55dGhpbmcgb3RoZXIgdGhhbiBXaW5kb3dzIFY0Ky4KKyAgICAgICAgbV9i
aXRNYXNrc1szXSA9IDA7CisKKyAgICAgICAgbV9kZWNvZGVkT2Zmc2V0ICs9IFNJWkVPRl9CSVRN
QVNLUzsKKyAgICB9CisKKyAgICAvLyBXZSd2ZSBub3cgZGVjb2RlZCBhbGwgdGhlIG5vbi1pbWFn
ZSBkYXRhIHdlIGNhcmUgYWJvdXQuICBTa2lwIGFueXRoaW5nCisgICAgLy8gZWxzZSBiZWZvcmUg
dGhlIGFjdHVhbCByYXN0ZXIgZGF0YS4KKyAgICBpZiAobV9pbWdEYXRhT2Zmc2V0KQorICAgICAg
ICBtX2RlY29kZWRPZmZzZXQgPSBtX2ltZ0RhdGFPZmZzZXQ7CisgICAgbV9uZWVkVG9Qcm9jZXNz
Qml0bWFza3MgPSBmYWxzZTsKKworICAgIC8vIENoZWNrIG1hc2tzIGFuZCBzZXQgc2hpZnQgdmFs
dWVzLgorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgICAgIC8vIFRyaW0g
dGhlIG1hc2sgdG8gdGhlIGFsbG93ZWQgYml0IGRlcHRoLiAgU29tZSBXaW5kb3dzIFY0KyBCTVBz
CisgICAgICAgIC8vIHNwZWNpZnkgYSBib2d1cyBhbHBoYSBjaGFubmVsIGluIGJpdHMgdGhhdCBk
b24ndCBleGlzdCBpbiB0aGUgcGl4ZWwKKyAgICAgICAgLy8gZGF0YSAoZm9yIGV4YW1wbGUsIGJp
dHMgMjUtMzEgaW4gYSAyNC1iaXQgUkdCIGZvcm1hdCkuCisgICAgICAgIGlmIChtX2luZm9IZWFk
ZXIuYmlCaXRDb3VudCA8IDMyKQorICAgICAgICAgICAgbV9iaXRNYXNrc1tpXSAmPSAoKHN0YXRp
Y19jYXN0PHVpbnQzMl90PigxKSA8PCBtX2luZm9IZWFkZXIuYmlCaXRDb3VudCkgLSAxKTsKKwor
ICAgICAgICAvLyBGb3IgZW1wdHkgbWFza3MgKGNvbW1vbiBvbiB0aGUgYWxwaGEgY2hhbm5lbCwg
ZXNwZWNpYWxseSBhZnRlciB0aGUKKyAgICAgICAgLy8gdHJpbW1pbmcgYWJvdmUpLCBxdWlja2x5
IGNsZWFyIHRoZSBzaGlmdHMgYW5kIGNvbnRpbnVlLCB0byBhdm9pZCBhbgorICAgICAgICAvLyBp
bmZpbml0ZSBsb29wIGluIHRoZSBjb3VudGluZyBjb2RlIGJlbG93LgorICAgICAgICB1aW50MzJf
dCB0ZW1wTWFzayA9IG1fYml0TWFza3NbaV07CisgICAgICAgIGlmICghdGVtcE1hc2spIHsKKyAg
ICAgICAgICAgIG1fYml0U2hpZnRzUmlnaHRbaV0gPSBtX2JpdFNoaWZ0c0xlZnRbaV0gPSAwOwor
ICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBNYWtlIHN1cmUg
Yml0bWFzayBkb2VzIG5vdCBvdmVybGFwIGFueSBvdGhlciBiaXRtYXNrcy4KKyAgICAgICAgZm9y
IChpbnQgaiA9IDA7IGogPCBpOyArK2opIHsKKyAgICAgICAgICAgIGlmICh0ZW1wTWFzayAmIG1f
Yml0TWFza3Nbal0pIHsKKyAgICAgICAgICAgICAgICBtX2ZhaWxlZCA9IHRydWU7CisgICAgICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAg
ICAgLy8gQ291bnQgb2Zmc2V0IGludG8gcGl4ZWwgZGF0YS4KKyAgICAgICAgZm9yIChtX2JpdFNo
aWZ0c1JpZ2h0W2ldID0gMDsgISh0ZW1wTWFzayAmIDEpOyB0ZW1wTWFzayA+Pj0gMSkKKyAgICAg
ICAgICAgICsrbV9iaXRTaGlmdHNSaWdodFtpXTsKKworICAgICAgICAvLyBDb3VudCBzaXplIG9m
IG1hc2suCisgICAgICAgIGZvciAobV9iaXRTaGlmdHNMZWZ0W2ldID0gODsgdGVtcE1hc2sgJiAx
OyB0ZW1wTWFzayA+Pj0gMSkKKyAgICAgICAgICAgIC0tbV9iaXRTaGlmdHNMZWZ0W2ldOworCisg
ICAgICAgIC8vIE1ha2Ugc3VyZSBiaXRtYXNrIGlzIGNvbnRpZ3VvdXMuCisgICAgICAgIGlmICh0
ZW1wTWFzaykgeworICAgICAgICAgICAgbV9mYWlsZWQgPSB0cnVlOworICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gU2luY2UgUkdCQUJ1ZmZlciB0b3Bz
IG91dCBhdCA4IGJpdHMgcGVyIGNoYW5uZWwsIGFkanVzdCB0aGUgc2hpZnQKKyAgICAgICAgLy8g
YW1vdW50cyB0byB1c2UgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgOCBiaXRzIG9mIHRoZSBjaGFubmVs
LgorICAgICAgICBpZiAobV9iaXRTaGlmdHNMZWZ0W2ldIDwgMCkgeworICAgICAgICAgICAgbV9i
aXRTaGlmdHNSaWdodFtpXSAtPSBtX2JpdFNoaWZ0c0xlZnRbaV07CisgICAgICAgICAgICBtX2Jp
dFNoaWZ0c0xlZnRbaV0gPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7
Cit9CisKK2Jvb2wgQk1QSW1hZ2VSZWFkZXI6OnByb2Nlc3NDb2xvclRhYmxlKFNoYXJlZEJ1ZmZl
ciogZGF0YSkKK3sKKyAgICBtX3RhYmxlU2l6ZUluQnl0ZXMgPSBtX2luZm9IZWFkZXIuYmlDbHJV
c2VkICogKG1faXNPUzIxeCA/IDMgOiA0KTsKKworICAgIC8vIEZhaWwgaWYgd2UgZG9uJ3QgaGF2
ZSBlbm91Z2ggZmlsZSBzcGFjZSBmb3IgdGhlIGNvbG9yIHRhYmxlLgorICAgIGlmICgoKG1faGVh
ZGVyT2Zmc2V0ICsgbV9pbmZvSGVhZGVyLmJpU2l6ZSArIG1fdGFibGVTaXplSW5CeXRlcykgPCAo
bV9oZWFkZXJPZmZzZXQgKyBtX2luZm9IZWFkZXIuYmlTaXplKSkKKyAgICAgICAgfHwgKG1faW1n
RGF0YU9mZnNldCAmJiAobV9pbWdEYXRhT2Zmc2V0IDwgKG1faGVhZGVyT2Zmc2V0ICsgbV9pbmZv
SGVhZGVyLmJpU2l6ZSArIG1fdGFibGVTaXplSW5CeXRlcykpKSkgeworICAgICAgICBtX2ZhaWxl
ZCA9IHRydWU7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBSZWFkIGNv
bG9yIHRhYmxlLgorICAgIGlmICgobV9kZWNvZGVkT2Zmc2V0ID4gZGF0YS0+c2l6ZSgpKQorICAg
ICAgICB8fCAoKGRhdGEtPnNpemUoKSAtIG1fZGVjb2RlZE9mZnNldCkgPCBtX3RhYmxlU2l6ZUlu
Qnl0ZXMpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgbV9jb2xvclRhYmxlLnJlc2l6ZSht
X2luZm9IZWFkZXIuYmlDbHJVc2VkKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1faW5m
b0hlYWRlci5iaUNsclVzZWQ7ICsraSkgeworICAgICAgICBtX2NvbG9yVGFibGVbaV0ucmdiQmx1
ZSA9IGRhdGEtPmRhdGEoKVttX2RlY29kZWRPZmZzZXQrK107CisgICAgICAgIG1fY29sb3JUYWJs
ZVtpXS5yZ2JHcmVlbiA9IGRhdGEtPmRhdGEoKVttX2RlY29kZWRPZmZzZXQrK107CisgICAgICAg
IG1fY29sb3JUYWJsZVtpXS5yZ2JSZWQgPSBkYXRhLT5kYXRhKClbbV9kZWNvZGVkT2Zmc2V0Kytd
OworICAgICAgICAvLyBTa2lwIHBhZGRpbmcgYnl0ZSAobm90IHByZXNlbnQgb24gT1MvMiAxLngp
LgorICAgICAgICBpZiAoIW1faXNPUzIxeCkKKyAgICAgICAgICAgICsrbV9kZWNvZGVkT2Zmc2V0
OworICAgIH0KKworICAgIC8vIFdlJ3ZlIG5vdyBkZWNvZGVkIGFsbCB0aGUgbm9uLWltYWdlIGRh
dGEgd2UgY2FyZSBhYm91dC4gIFNraXAgYW55dGhpbmcKKyAgICAvLyBlbHNlIGJlZm9yZSB0aGUg
YWN0dWFsIHJhc3RlciBkYXRhLgorICAgIGlmIChtX2ltZ0RhdGFPZmZzZXQpCisgICAgICAgIG1f
ZGVjb2RlZE9mZnNldCA9IG1faW1nRGF0YU9mZnNldDsKKyAgICBtX25lZWRUb1Byb2Nlc3NDb2xv
clRhYmxlID0gZmFsc2U7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBCTVBJbWFnZVJl
YWRlcjo6cHJvY2Vzc1JMRURhdGEoU2hhcmVkQnVmZmVyKiBkYXRhKQoreworICAgIGlmIChtX2Rl
Y29kZWRPZmZzZXQgPiBkYXRhLT5zaXplKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAg
IC8vIFJMRSBkZWNvZGluZyBpcyBwb29ybHkgc3BlY2lmaWVkLiAgVHdvIG1haW4gcHJvYmxlbXM6
CisgICAgLy8gKDEpIEFyZSBFT0wgbWFya2VycyBuZWNlc3Nhcnk/ICBXaGF0IGhhcHBlbnMgd2hl
biB3ZSBoYXZlIHRvbyBtYW55CisgICAgLy8gICAgIHBpeGVscyBmb3Igb25lIHJvdz8KKyAgICAv
LyAgICAgaHR0cDovL3d3dy5maWxlZm9ybWF0LmluZm8vZm9ybWF0L2JtcC9lZ2ZmLmh0bSBzYXlz
IGV4dHJhIHBpeGVscworICAgIC8vICAgICBzaG91bGQgd3JhcCB0byB0aGUgbmV4dCBsaW5lLiAg
UmVhbCBCTVBzIEkndmUgZW5jb3VudGVyZWQgc2VlbSB0bworICAgIC8vICAgICBpbnN0ZWFkIGV4
cGVjdCBleHRyYSBwaXhlbHMgdG8gYmUgaWdub3JlZCB1bnRpbCB0aGUgRU9MIG1hcmtlciBpcwor
ICAgIC8vICAgICBzZWVuLCBhbHRob3VnaCB0aGlzIGhhcyBvbmx5IGhhcHBlbmVkIGluIGEgZmV3
IGNhc2VzIGFuZCBJIHN1c3BlY3QKKyAgICAvLyAgICAgdGhvc2UgQk1QcyBtYXkgYmUgaW52YWxp
ZC4gIFNvIHdlIG9ubHkgY2hhbmdlIGxpbmVzIG9uIEVPTCAob3IgRGVsdGEKKyAgICAvLyAgICAg
d2l0aCBkeSA+IDApLCBhbmQgZmFpbCBpbiBtb3N0IGNhc2VzIHdoZW4gcGl4ZWxzIGV4dGVuZCBw
YXN0IHRoZSBlbmQKKyAgICAvLyAgICAgb2YgdGhlIGxpbmUuCisgICAgLy8gKDIpIFdoZW4gRGVs
dGEsIEVPTCwgb3IgRU9GIGFyZSBzZWVuLCB3aGF0IGhhcHBlbnMgdG8gdGhlICJza2lwcGVkIgor
ICAgIC8vICAgICBwaXhlbHM/CisgICAgLy8gICAgIGh0dHA6Ly93d3cuZGF1Ym5ldC5jb20vZm9y
bWF0cy9CTVAuaHRtbCBzYXlzIHRoZXNlIHNob3VsZCBiZSBmaWxsZWQKKyAgICAvLyAgICAgd2l0
aCBjb2xvciAwLiAgSG93ZXZlciwgdGhlICJkbyBub3RoaW5nIiBhbmQgImRvbid0IGNhcmUiIGNv
bW1lbnRzCisgICAgLy8gICAgIG9mIG90aGVyIHJlZmVyZW5jZXMgc3VnZ2VzdCBsZWF2aW5nIHRo
ZXNlIGFsb25lLCBpLmUuIGxldHRpbmcgdGhlbQorICAgIC8vICAgICBiZSB0cmFuc3BhcmVudCB0
byB0aGUgYmFja2dyb3VuZCBiZWhpbmQgdGhlIGltYWdlLiAgVGhpcyBzZWVtcyB0bworICAgIC8v
ICAgICBtYXRjaCBob3cgTVNQQUlOVCB0cmVhdHMgQk1Qcywgc28gd2UgZG8gdGhhdC4gIE5vdGUg
dGhhdCB3aGVuIHdlCisgICAgLy8gICAgIGFjdHVhbGx5IHNraXAgcGl4ZWxzIGZvciBhIGNhc2Ug
bGlrZSB0aGlzLCB3ZSBuZWVkIHRvIG5vdGUgb24gdGhlCisgICAgLy8gICAgIGZyYW1lYnVmZmVy
IHRoYXQgd2UgaGF2ZSBhbHBoYS4KKworICAgIC8vIEltcG9zc2libGUgdG8gZGVjb2RlIHJvdy1h
dC1hLXRpbWUsIHNvIGp1c3QgZG8gdGhpbmdzIGFzIGEgc3RyZWFtIG9mCisgICAgLy8gYnl0ZXMu
CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgLy8gRXZlcnkgZW50cnkgdGFrZXMgYXQgbGVh
c3QgdHdvIGJ5dGVzOyBiYWlsIGlmIHRoZXJlIGlzbid0IGVub3VnaAorICAgICAgICAvLyBkYXRh
LgorICAgICAgICBpZiAoKGRhdGEtPnNpemUoKSAtIG1fZGVjb2RlZE9mZnNldCkgPCAyKQorICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIC8vIEZvciBldmVyeSBlbnRyeSBleGNl
cHQgRU9GLCB3ZSdkIGJldHRlciBub3QgaGF2ZSByZWFjaGVkIHRoZSBlbmQgb2YKKyAgICAgICAg
Ly8gdGhlIGltYWdlLgorICAgICAgICBjb25zdCB1aW50OF90IGNvdW50ID0gZGF0YS0+ZGF0YSgp
W21fZGVjb2RlZE9mZnNldF07CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgY29kZSA9IGRhdGEtPmRh
dGEoKVttX2RlY29kZWRPZmZzZXQgKyAxXTsKKyAgICAgICAgaWYgKCgoY291bnQgIT0gMCkgfHwg
KGNvZGUgIT0gMSkpICYmIHBhc3RFbmRPZkltYWdlKDApKSB7CisgICAgICAgICAgICBtX2ZhaWxl
ZCA9IHRydWU7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAg
ICAvLyBEZWNvZGUuCisgICAgICAgIGlmIChjb3VudCA9PSAwKSB7CisgICAgICAgICAgICBzd2l0
Y2ggKGNvZGUpIHsKKyAgICAgICAgICAgIGNhc2UgMDogIC8vIE1hZ2ljIHRva2VuOiBFT0wKKyAg
ICAgICAgICAgICAgICAvLyBTa2lwIGFueSByZW1haW5pbmcgcGl4ZWxzIGluIHRoaXMgcm93Lgor
ICAgICAgICAgICAgICAgIGlmIChtX2Nvb3JkLngoKSA8IHNpemUoKS53aWR0aCgpKQorICAgICAg
ICAgICAgICAgICAgICBtX2ZyYW1lQnVmZmVyQ2FjaGUuZmlyc3QoKS5zZXRIYXNBbHBoYSh0cnVl
KTsKKyAgICAgICAgICAgICAgICBtb3ZlQnVmZmVyVG9OZXh0Um93KCk7CisKKyAgICAgICAgICAg
ICAgICBtX2RlY29kZWRPZmZzZXQgKz0gMjsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAg
ICAgICAgICAgY2FzZSAxOiAgLy8gTWFnaWMgdG9rZW46IEVPRgorICAgICAgICAgICAgICAgIC8v
IFNraXAgYW55IHJlbWFpbmluZyBwaXhlbHMgaW4gdGhlIGltYWdlLgorICAgICAgICAgICAgICAg
IGlmICgobV9jb29yZC54KCkgPCBzaXplKCkud2lkdGgoKSkKKyAgICAgICAgICAgICAgICAgICAg
fHwgKG1faXNUb3BEb3duID8gKG1fY29vcmQueSgpIDwgKHNpemUoKS5oZWlnaHQoKSAtIDEpKSA6
IChtX2Nvb3JkLnkoKSA+IDApKSkKKyAgICAgICAgICAgICAgICAgICAgbV9mcmFtZUJ1ZmZlckNh
Y2hlLmZpcnN0KCkuc2V0SGFzQWxwaGEodHJ1ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRy
dWU7CisKKyAgICAgICAgICAgIGNhc2UgMjogeyAgLy8gTWFnaWMgdG9rZW46IERlbHRhCisgICAg
ICAgICAgICAgICAgLy8gVGhlIG5leHQgdHdvIGJ5dGVzIHNwZWNpZnkgZHggYW5kIGR5LiAgQmFp
bCBpZiB0aGVyZSBpc24ndAorICAgICAgICAgICAgICAgIC8vIGVub3VnaCBkYXRhLgorICAgICAg
ICAgICAgICAgIGlmICgoZGF0YS0+c2l6ZSgpIC0gbV9kZWNvZGVkT2Zmc2V0KSA8IDQpCisgICAg
ICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgICAgIC8vIEZhaWwg
aWYgdGhpcyB0YWtlcyB1cyBwYXN0IHRoZSBlbmQgb2YgdGhlIGRlc2lyZWQgcm93IG9yCisgICAg
ICAgICAgICAgICAgLy8gcGFzdCB0aGUgZW5kIG9mIHRoZSBpbWFnZS4KKyAgICAgICAgICAgICAg
ICBjb25zdCB1aW50OF90IGR4ID0gZGF0YS0+ZGF0YSgpW21fZGVjb2RlZE9mZnNldCArIDJdOwor
ICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgZHkgPSBkYXRhLT5kYXRhKClbbV9kZWNvZGVk
T2Zmc2V0ICsgM107CisgICAgICAgICAgICAgICAgaWYgKChkeCAhPSAwKSB8fCAoZHkgIT0gMCkp
CisgICAgICAgICAgICAgICAgICAgIG1fZnJhbWVCdWZmZXJDYWNoZS5maXJzdCgpLnNldEhhc0Fs
cGhhKHRydWUpOworICAgICAgICAgICAgICAgIGlmICgoKG1fY29vcmQueCgpICsgZHgpID4gc2l6
ZSgpLndpZHRoKCkpIHx8CisgICAgICAgICAgICAgICAgICAgIHBhc3RFbmRPZkltYWdlKGR5KSkg
eworICAgICAgICAgICAgICAgICAgICBtX2ZhaWxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAv
LyBTa2lwIGludGVydmVuaW5nIHBpeGVscy4KKyAgICAgICAgICAgICAgICBtX2Nvb3JkLm1vdmUo
ZHgsIG1faXNUb3BEb3duID8gZHkgOiAtZHkpOworCisgICAgICAgICAgICAgICAgbV9kZWNvZGVk
T2Zmc2V0ICs9IDQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAg
ICAgICAgICAgIGRlZmF1bHQ6ICAvLyBBYnNvbHV0ZSBtb2RlCisgICAgICAgICAgICAgICAgLy8g
fGNvZGV8IHBpeGVscyBzcGVjaWZpZWQgYXMgaW4gQklfUkdCLCB6ZXJvLXBhZGRlZCBhdCB0aGUg
ZW5kCisgICAgICAgICAgICAgICAgLy8gdG8gYSBtdWx0aXBsZSBvZiAxNiBiaXRzLgorICAgICAg
ICAgICAgICAgIC8vIEJlY2F1c2UgcHJvY2Vzc05vblJMRURhdGEoKSBleHBlY3RzIG1fZGVjb2Rl
ZE9mZnNldCB0bworICAgICAgICAgICAgICAgIC8vIHBvaW50IHRvIHRoZSBiZWdpbm5pbmcgb2Yg
dGhlIHBpeGVsIGRhdGEsIGJ1bXAgaXQgcGFzdAorICAgICAgICAgICAgICAgIC8vIHRoZSBlc2Nh
cGUgYnl0ZXMgYW5kIHRoZW4gcmVzZXQgaWYgZGVjb2RpbmcgZmFpbGVkLgorICAgICAgICAgICAg
ICAgIG1fZGVjb2RlZE9mZnNldCArPSAyOworICAgICAgICAgICAgICAgIGlmICghcHJvY2Vzc05v
blJMRURhdGEoZGF0YSwgdHJ1ZSwgY29kZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbV9kZWNv
ZGVkT2Zmc2V0IC09IDI7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAg
ICAgIH0gZWxzZSB7ICAvLyBFbmNvZGVkIG1vZGUKKyAgICAgICAgICAgIC8vIFRoZSBmb2xsb3dp
bmcgY29sb3IgZGF0YSBpcyByZXBlYXRlZCBmb3IgfGNvdW50fCB0b3RhbCBwaXhlbHMuCisgICAg
ICAgICAgICAvLyBTdHJhbmdlbHksIHNvbWUgQk1QcyBzZWVtIHRvIHNwZWNpZnkgZXhjZXNzaXZl
bHkgbGFyZ2UgY291bnRzCisgICAgICAgICAgICAvLyBoZXJlOyBpZ25vcmUgcGl4ZWxzIHBhc3Qg
dGhlIGVuZCBvZiB0aGUgcm93LgorICAgICAgICAgICAgY29uc3QgaW50IGVuZFggPSBzdGQ6Om1p
bihtX2Nvb3JkLngoKSArIGNvdW50LCBzaXplKCkud2lkdGgoKSk7CisKKyAgICAgICAgICAgIGlm
IChtX2luZm9IZWFkZXIuYmlDb21wcmVzc2lvbiA9PSBSTEUyNCkgeworICAgICAgICAgICAgICAg
IC8vIEJhaWwgaWYgdGhlcmUgaXNuJ3QgZW5vdWdoIGRhdGEuCisgICAgICAgICAgICAgICAgaWYg
KChkYXRhLT5zaXplKCkgLSBtX2RlY29kZWRPZmZzZXQpIDwgNCkKKyAgICAgICAgICAgICAgICAg
ICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICAgICAgLy8gT25lIEJHUiB0cmlwbGUgdGhh
dCB3ZSBjb3B5IHxjb3VudHwgdGltZXMuCisgICAgICAgICAgICAgICAgZmlsbFJHQkEoZW5kWCwg
ZGF0YS0+ZGF0YSgpW21fZGVjb2RlZE9mZnNldCArIDNdLAorICAgICAgICAgICAgICAgICAgICAg
ICAgIGRhdGEtPmRhdGEoKVttX2RlY29kZWRPZmZzZXQgKyAyXSwgY29kZSwgMHhmZik7CisgICAg
ICAgICAgICAgICAgbV9kZWNvZGVkT2Zmc2V0ICs9IDQ7CisgICAgICAgICAgICB9IGVsc2Ugewor
ICAgICAgICAgICAgICAgIC8vIFJMRTggaGFzIG9uZSBjb2xvciBpbmRleCB0aGF0IGdldHMgcmVw
ZWF0ZWQ7IFJMRTQgaGFzIHR3bworICAgICAgICAgICAgICAgIC8vIGNvbG9yIGluZGV4ZXMgaW4g
dGhlIHVwcGVyIGFuZCBsb3dlciA0IGJpdHMgb2YgdGhlIGJ5dGUsCisgICAgICAgICAgICAgICAg
Ly8gd2hpY2ggYXJlIGFsdGVybmF0ZWQuCisgICAgICAgICAgICAgICAgc2l6ZV90IGNvbG9ySW5k
ZXhlc1syXSA9IHtjb2RlLCBjb2RlfTsKKyAgICAgICAgICAgICAgICBpZiAobV9pbmZvSGVhZGVy
LmJpQ29tcHJlc3Npb24gPT0gUkxFNCkgeworICAgICAgICAgICAgICAgICAgICBjb2xvckluZGV4
ZXNbMF0gPSAoY29sb3JJbmRleGVzWzBdID4+IDQpICYgMHhmOworICAgICAgICAgICAgICAgICAg
ICBjb2xvckluZGV4ZXNbMV0gJj0gMHhmOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAg
ICAgICBpZiAoKGNvbG9ySW5kZXhlc1swXSA+PSBtX2luZm9IZWFkZXIuYmlDbHJVc2VkKQorICAg
ICAgICAgICAgICAgICAgICB8fCAoY29sb3JJbmRleGVzWzFdID49IG1faW5mb0hlYWRlci5iaUNs
clVzZWQpKSB7CisgICAgICAgICAgICAgICAgICAgIG1fZmFpbGVkID0gdHJ1ZTsKKyAgICAgICAg
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAg
ICAgICBmb3IgKGludCB3aGljaCA9IDA7IG1fY29vcmQueCgpIDwgZW5kWDsgKSB7CisgICAgICAg
ICAgICAgICAgICAgIHNldEkoY29sb3JJbmRleGVzW3doaWNoXSk7CisgICAgICAgICAgICAgICAg
ICAgIHdoaWNoID0gIXdoaWNoOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAg
IG1fZGVjb2RlZE9mZnNldCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQor
fQorCitib29sIEJNUEltYWdlUmVhZGVyOjpwcm9jZXNzTm9uUkxFRGF0YShTaGFyZWRCdWZmZXIq
IGRhdGEsIGJvb2wgaW5STEUsIGludCBudW1QaXhlbHMpCit7CisgICAgaWYgKG1fZGVjb2RlZE9m
ZnNldCA+IGRhdGEtPnNpemUoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKCFp
blJMRSkKKyAgICAgICAgbnVtUGl4ZWxzID0gc2l6ZSgpLndpZHRoKCk7CisKKyAgICAvLyBGYWls
IGlmIHdlJ3JlIGJlaW5nIGFza2VkIHRvIGRlY29kZSBtb3JlIHBpeGVscyB0aGFuIHJlbWFpbiBp
biB0aGUgcm93LgorICAgIGNvbnN0IGludCBlbmRYID0gbV9jb29yZC54KCkgKyBudW1QaXhlbHM7
CisgICAgaWYgKGVuZFggPiBzaXplKCkud2lkdGgoKSkgeworICAgICAgICBtX2ZhaWxlZCA9IHRy
dWU7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBEZXRlcm1pbmUgaG93
IG1hbnkgYnl0ZXMgb2YgZGF0YSB0aGUgcmVxdWVzdGVkIG51bWJlciBvZiBwaXhlbHMKKyAgICAv
LyByZXF1aXJlcy4KKyAgICBjb25zdCBzaXplX3QgcGl4ZWxzUGVyQnl0ZSA9IDggLyBtX2luZm9I
ZWFkZXIuYmlCaXRDb3VudDsKKyAgICBjb25zdCBzaXplX3QgYnl0ZXNQZXJQaXhlbCA9IG1faW5m
b0hlYWRlci5iaUJpdENvdW50IC8gODsKKyAgICBjb25zdCBzaXplX3QgdW5wYWRkZWROdW1CeXRl
cyA9IChtX2luZm9IZWFkZXIuYmlCaXRDb3VudCA8IDE2KQorICAgICAgICA/ICgobnVtUGl4ZWxz
ICsgcGl4ZWxzUGVyQnl0ZSAtIDEpIC8gcGl4ZWxzUGVyQnl0ZSkKKyAgICAgICAgOiAobnVtUGl4
ZWxzICogYnl0ZXNQZXJQaXhlbCk7CisgICAgLy8gUkxFIHJ1bnMgYXJlIHplcm8tcGFkZGVkIGF0
IHRoZSBlbmQgdG8gYSBtdWx0aXBsZSBvZiAxNiBiaXRzLiAgTm9uLVJMRQorICAgIC8vIGRhdGEg
aXMgaW4gcm93cyBhbmQgaXMgemVyby1wYWRkZWQgdG8gYSBtdWx0aXBsZSBvZiAzMiBiaXRzLgor
ICAgIGNvbnN0IHNpemVfdCBhbGlnbkJpdHMgPSBpblJMRSA/IDEgOiAzOworICAgIGNvbnN0IHNp
emVfdCBwYWRkZWROdW1CeXRlcyA9ICh1bnBhZGRlZE51bUJ5dGVzICsgYWxpZ25CaXRzKSAmIH5h
bGlnbkJpdHM7CisKKyAgICAvLyBEZWNvZGUgYXMgbWFueSByb3dzIGFzIHdlIGNhbi4gIChGb3Ig
UkxFLCB3aGVyZSB3ZSBvbmx5IHdhbnQgdG8gZGVjb2RlCisgICAgLy8gb25lIHJvdywgd2UndmUg
YWxyZWFkeSBjaGVja2VkIHRoYXQgdGhpcyBjb25kaXRpb24gaXMgdHJ1ZS4pCisgICAgd2hpbGUg
KCFwYXN0RW5kT2ZJbWFnZSgwKSkgeworICAgICAgICAvLyBCYWlsIGlmIHdlIGRvbid0IGhhdmUg
ZW5vdWdoIGRhdGEgZm9yIHRoZSBkZXNpcmVkIG51bWJlciBvZiBwaXhlbHMuCisgICAgICAgIGlm
ICgoZGF0YS0+c2l6ZSgpIC0gbV9kZWNvZGVkT2Zmc2V0KSA8IHBhZGRlZE51bUJ5dGVzKQorICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGlmIChtX2luZm9IZWFkZXIuYmlCaXRD
b3VudCA8IDE2KSB7CisgICAgICAgICAgICAvLyBQYWxldHRlZCBkYXRhLiAgUGl4ZWxzIGFyZSBz
dG9yZWQgbGl0dGxlLWVuZGlhbiB3aXRoaW4gYnl0ZXMuCisgICAgICAgICAgICAvLyBEZWNvZGUg
cGl4ZWxzIG9uZSBieXRlIGF0IGEgdGltZSwgbGVmdCB0byByaWdodCAoc28sIHN0YXJ0aW5nIGF0
CisgICAgICAgICAgICAvLyB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXRzIGluIHRoZSBieXRlKS4K
KyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgbWFzayA9ICgxIDw8IG1faW5mb0hlYWRlci5iaUJp
dENvdW50KSAtIDE7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBieXRlID0gMDsgYnl0ZSA8IHVu
cGFkZGVkTnVtQnl0ZXM7ICsrYnl0ZSkgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgcGl4ZWxE
YXRhID0gZGF0YS0+ZGF0YSgpW21fZGVjb2RlZE9mZnNldCArIGJ5dGVdOworICAgICAgICAgICAg
ICAgIGZvciAoc2l6ZV90IHBpeGVsID0gMDsgKHBpeGVsIDwgcGl4ZWxzUGVyQnl0ZSkgJiYgKG1f
Y29vcmQueCgpIDwgZW5kWCk7ICsrcGl4ZWwpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qg
c2l6ZV90IGNvbG9ySW5kZXggPQorICAgICAgICAgICAgICAgICAgICAgICAgKHBpeGVsRGF0YSA+
PiAoOCAtIG1faW5mb0hlYWRlci5iaUJpdENvdW50KSkgJiBtYXNrOworICAgICAgICAgICAgICAg
ICAgICBpZiAobV9hbmRNYXNrU3RhdGUgPT0gRGVjb2RpbmcpIHsKKyAgICAgICAgICAgICAgICAg
ICAgICAgIC8vIFRoZXJlJ3Mgbm8gd2F5IHRvIGFjY3VyYXRlbHkgcmVwcmVzZW50IGFuIEFORCAr
IFhPUgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3BlcmF0aW9uIGFzIGFuIFJHQkEgaW1h
Z2UsIHNvIHdoZXJlIHRoZSBBTkQgdmFsdWVzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBh
cmUgMSwgd2Ugc2ltcGx5IHNldCB0aGUgZnJhbWVidWZmZXIgcGl4ZWxzIHRvIGZ1bGx5CisgICAg
ICAgICAgICAgICAgICAgICAgICAvLyB0cmFuc3BhcmVudCwgb24gdGhlIGFzc3VtcHRpb24gdGhh
dCBtb3N0IElDT3Mgb24gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZWIgd2lsbCBu
b3QgYmUgZG9pbmcgYSBsb3Qgb2YgaW52ZXJ0aW5nLgorICAgICAgICAgICAgICAgICAgICAgICAg
aWYgKGNvbG9ySW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRSR0JBKDAs
IDAsIDAsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZnJhbWVCdWZmZXJDYWNo
ZS5maXJzdCgpLnNldEhhc0FscGhhKHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBl
bHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9jb29yZC5tb3ZlKDEsIDApOworICAg
ICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNv
bG9ySW5kZXggPj0gbV9pbmZvSGVhZGVyLmJpQ2xyVXNlZCkgeworICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIG1fZmFpbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAg
ICAgICAgICBzZXRJKGNvbG9ySW5kZXgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAg
ICAgICAgICAgICAgIHBpeGVsRGF0YSA8PD0gbV9pbmZvSGVhZGVyLmJpQml0Q291bnQ7CisgICAg
ICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAg
ICAgLy8gUkdCIGRhdGEuICBEZWNvZGUgcGl4ZWxzIG9uZSBhdCBhIHRpbWUsIGxlZnQgdG8gcmln
aHQuCisgICAgICAgICAgICB3aGlsZSAobV9jb29yZC54KCkgPCBlbmRYKSB7CisgICAgICAgICAg
ICAgICAgY29uc3QgdWludDMyX3QgcGl4ZWwgPSByZWFkQ3VycmVudFBpeGVsKGRhdGEsIGJ5dGVz
UGVyUGl4ZWwpOworCisgICAgICAgICAgICAgICAgLy8gU29tZSBCTVBzIHNwZWNpZnkgYW4gYWxw
aGEgY2hhbm5lbCBidXQgZG9uJ3QgYWN0dWFsbHkgdXNlIGl0CisgICAgICAgICAgICAgICAgLy8g
KGl0IGNvbnRhaW5zIGFsbCAwcykuICBUbyBhdm9pZCBkaXNwbGF5aW5nIHRoZXNlIGltYWdlcyBh
cworICAgICAgICAgICAgICAgIC8vIGZ1bGx5LXRyYW5zcGFyZW50LCBkZWNvZGUgYXMgaWYgaW1h
Z2VzIGFyZSBmdWxseSBvcGFxdWUKKyAgICAgICAgICAgICAgICAvLyB1bnRpbCB3ZSBhY3R1YWxs
eSBzZWUgYSBub24temVybyBhbHBoYSB2YWx1ZTsgYXQgdGhhdCBwb2ludCwKKyAgICAgICAgICAg
ICAgICAvLyByZXNldCBhbnkgcHJldmlvdXNseS1kZWNvZGVkIHBpeGVscyB0byBmdWxseSB0cmFu
c3BhcmVudCBhbmQKKyAgICAgICAgICAgICAgICAvLyBjb250aW51ZSBkZWNvZGluZyBiYXNlZCBv
biB0aGUgcmVhbCBhbHBoYSBjaGFubmVsIHZhbHVlcy4KKyAgICAgICAgICAgICAgICAvLyBBcyBh
biBvcHRpbWl6YXRpb24sIGF2b2lkIHNldHRpbmcgImhhc0FscGhhIiB0byB0cnVlIGZvcgorICAg
ICAgICAgICAgICAgIC8vIGltYWdlcyB3aGVyZSBhbGwgYWxwaGEgdmFsdWVzIGFyZSAyNTU7IG9w
YXF1ZSBpbWFnZXMgYXJlCisgICAgICAgICAgICAgICAgLy8gZmFzdGVyIHRvIGRyYXcuCisgICAg
ICAgICAgICAgICAgaW50IGFscGhhID0gZ2V0QWxwaGEocGl4ZWwpOworICAgICAgICAgICAgICAg
IGlmICghbV9zZWVuTm9uWmVyb0FscGhhUGl4ZWwgJiYgKGFscGhhID09IDApKSB7CisgICAgICAg
ICAgICAgICAgICAgIG1fc2Vlblplcm9BbHBoYVBpeGVsID0gdHJ1ZTsKKyAgICAgICAgICAgICAg
ICAgICAgYWxwaGEgPSAyNTU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAg
ICAgICAgICAgbV9zZWVuTm9uWmVyb0FscGhhUGl4ZWwgPSB0cnVlOworICAgICAgICAgICAgICAg
ICAgICBpZiAobV9zZWVuWmVyb0FscGhhUGl4ZWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAg
IC8vIFRoZSBlcmFzZUFSR0IoKSBjYWxsIGhlcmUgYWxzbyBzZXRzICJoYXNBbHBoYSIgdHJ1ZS4K
KyAgICAgICAgICAgICAgICAgICAgICAgIG1fZnJhbWVCdWZmZXJDYWNoZS5maXJzdCgpLmJpdG1h
cCgpLmVyYXNlQVJHQigwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgICAgICAgICAgICAg
ICAgICAgICAgbV9zZWVuWmVyb0FscGhhUGl4ZWwgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAg
ICAgfSBlbHNlIGlmIChhbHBoYSAhPSAyNTUpCisgICAgICAgICAgICAgICAgICAgICAgICBtX2Zy
YW1lQnVmZmVyQ2FjaGUuZmlyc3QoKS5zZXRIYXNBbHBoYSh0cnVlKTsKKyAgICAgICAgICAgICAg
ICB9CisKKyAgICAgICAgICAgICAgICBzZXRSR0JBKGdldENvbXBvbmVudChwaXhlbCwgMCksIGdl
dENvbXBvbmVudChwaXhlbCwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRDb21wb25l
bnQocGl4ZWwsIDIpLCBhbHBoYSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAg
ICAvLyBTdWNjZXNzLCBrZWVwIGdvaW5nLgorICAgICAgICBtX2RlY29kZWRPZmZzZXQgKz0gcGFk
ZGVkTnVtQnl0ZXM7CisgICAgICAgIGlmIChpblJMRSkKKyAgICAgICAgICAgIHJldHVybiB0cnVl
OworICAgICAgICBtb3ZlQnVmZmVyVG9OZXh0Um93KCk7CisgICAgfQorCisgICAgLy8gRmluaXNo
ZWQgZGVjb2Rpbmcgd2hvbGUgaW1hZ2UuCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQk1Q
SW1hZ2VSZWFkZXI6Om1vdmVCdWZmZXJUb05leHRSb3coKQoreworICAgIG1fY29vcmQubW92ZSgt
bV9jb29yZC54KCksIG1faXNUb3BEb3duID8gMSA6IC0xKTsKK30KKworfSAvLyBuYW1lc3BhY2Ug
V2ViQ29yZQpJbmRleDogcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvc2tpYS9CTVBJbWFnZVJlYWRl
ci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIHBsYXRmb3JtL2ltYWdlLWRlY29kZXJzL3NraWEvQk1QSW1hZ2VS
ZWFkZXIuaAkocmV2aXNpb24gMCkKKysrIHBsYXRmb3JtL2ltYWdlLWRlY29kZXJzL3NraWEvQk1Q
SW1hZ2VSZWFkZXIuaAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwzMjcgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKGMpIDIwMDgsIDIwMDksIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICogCisgKiAgICAg
KiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICog
ZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBu
b3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9y
c2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0
aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiAKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRP
UlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05F
UiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisg
KiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lm
bmRlZiBCTVBJbWFnZVJlYWRlcl9oCisjZGVmaW5lIEJNUEltYWdlUmVhZGVyX2gKKworI2luY2x1
ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgIkltYWdlRGVjb2Rlci5oIgorCituYW1lc3BhY2UgV2Vi
Q29yZSB7CisKKyAgICAvLyBUaGlzIGNsYXNzIGRlY29kZXMgYSBCTVAgaW1hZ2UuICBJdCBpcyB1
c2VkIGFzIGEgYmFzZSBmb3IgdGhlIEJNUCBhbmQgSUNPCisgICAgLy8gZGVjb2RlcnMsIHdoaWNo
IHdyYXAgaXQgaW4gdGhlIGFwcHJvcHJpYXRlIGNvZGUgdG8gcmVhZCBmaWxlIGhlYWRlcnMsIGV0
Yy4KKyAgICBjbGFzcyBCTVBJbWFnZVJlYWRlciA6IHB1YmxpYyBJbWFnZURlY29kZXIgeworICAg
IHB1YmxpYzoKKyAgICAgICAgQk1QSW1hZ2VSZWFkZXIoKTsKKworICAgICAgICAvLyBEb2VzIHRo
ZSBhY3R1YWwgZGVjb2RpbmcuICB8ZGF0YXwgc3RhcnRzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhl
IGZpbGUsCisgICAgICAgIC8vIGJ1dCBtYXkgYmUgaW5jb21wbGV0ZS4KKyAgICAgICAgdmlydHVh
bCB2b2lkIGRlY29kZUltYWdlKFNoYXJlZEJ1ZmZlciogZGF0YSkgPSAwOworCisgICAgICAgIC8v
IEltYWdlRGVjb2RlcgorICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0RGF0YShTaGFyZWRCdWZmZXIq
IGRhdGEsIGJvb2wgYWxsRGF0YVJlY2VpdmVkKTsKKyAgICAgICAgdmlydHVhbCBSR0JBMzJCdWZm
ZXIqIGZyYW1lQnVmZmVyQXRJbmRleChzaXplX3QgaW5kZXgpOworCisgICAgcHJvdGVjdGVkOgor
ICAgICAgICBlbnVtIEFuZE1hc2tTdGF0ZSB7CisgICAgICAgICAgICBOb25lLAorICAgICAgICAg
ICAgTm90WWV0RGVjb2RlZCwKKyAgICAgICAgICAgIERlY29kaW5nLAorICAgICAgICB9OworCisg
ICAgICAgIC8vIERlY29kZXMgYSBzaW5nbGUgQk1QLCBzdGFydGluZyB3aXRoIGFuIGluZm8gaGVh
ZGVyLgorICAgICAgICB2b2lkIGRlY29kZUJNUChTaGFyZWRCdWZmZXIqIGRhdGEpOworCisgICAg
ICAgIC8vIFJlYWQgYSB2YWx1ZSBmcm9tIHxkYXRhW21fZGVjb2RlZE9mZnNldCArIGFkZGl0aW9u
YWxPZmZzZXRdfCwgY29udmVydGluZworICAgICAgICAvLyBmcm9tIGxpdHRsZSB0byBuYXRpdmUg
ZW5kaWFubmVzcy4KKyAgICAgICAgaW5saW5lIHVpbnQxNl90IHJlYWRVaW50MTYoU2hhcmVkQnVm
ZmVyKiBkYXRhLCBpbnQgYWRkaXRpb25hbE9mZnNldCkgY29uc3QKKyAgICAgICAgeworICAgICAg
ICAgICAgdWludDE2X3QgcmVzdWx0OworICAgICAgICAgICAgbWVtY3B5KCZyZXN1bHQsICZkYXRh
LT5kYXRhKClbbV9kZWNvZGVkT2Zmc2V0ICsgYWRkaXRpb25hbE9mZnNldF0sIDIpOworICAgICAg
ICAjaWYgUExBVEZPUk0oQklHX0VORElBTikKKyAgICAgICAgICAgIHJlc3VsdCA9ICgocmVzdWx0
ICYgMHhmZikgPDwgOCkgfCAoKHJlc3VsdCAmIDB4ZmYwMCkgPj4gOCk7CisgICAgICAgICNlbmRp
ZgorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIGlubGlu
ZSB1aW50MzJfdCByZWFkVWludDMyKFNoYXJlZEJ1ZmZlciogZGF0YSwgaW50IGFkZGl0aW9uYWxP
ZmZzZXQpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHJlc3VsdDsKKyAg
ICAgICAgICAgIG1lbWNweSgmcmVzdWx0LCAmZGF0YS0+ZGF0YSgpW21fZGVjb2RlZE9mZnNldCAr
IGFkZGl0aW9uYWxPZmZzZXRdLCA0KTsKKyAgICAgICAgI2lmIFBMQVRGT1JNKEJJR19FTkRJQU4p
CisgICAgICAgICAgICByZXN1bHQgPSAoKHJlc3VsdCAmIDB4ZmYpIDw8IDI0KSB8ICgocmVzdWx0
ICYgMHhmZjAwKSA8PCA4KSB8CisgICAgICAgICAgICAgICAgKChyZXN1bHQgJiAweGZmMDAwMCkg
Pj4gOCkgfCAoKHJlc3VsdCAmIDB4ZmYwMDAwMDApID4+IDI0KTsKKyAgICAgICAgI2VuZGlmCisg
ICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgLy8gQW4gaW5k
ZXggaW50byB8bV9kYXRhfCByZXByZXNlbnRpbmcgaG93IG11Y2ggd2UndmUgYWxyZWFkeSBkZWNv
ZGVkLgorICAgICAgICBzaXplX3QgbV9kZWNvZGVkT2Zmc2V0OworCisgICAgICAgIC8vIFRoZSBm
aWxlIG9mZnNldCBhdCB3aGljaCB0aGUgQk1QIGluZm8gaGVhZGVyIHN0YXJ0cy4KKyAgICAgICAg
c2l6ZV90IG1faGVhZGVyT2Zmc2V0OworCisgICAgICAgIC8vIFRoZSBmaWxlIG9mZnNldCBhdCB3
aGljaCB0aGUgYWN0dWFsIGltYWdlIGJpdHMgc3RhcnQuICBXaGVuIGRlY29kaW5nIElDTworICAg
ICAgICAvLyBmaWxlcywgdGhpcyBpcyBzZXQgdG8gMCwgc2luY2UgaXQncyBub3Qgc3RvcmVkIGFu
eXdoZXJlIGluIGEgaGVhZGVyOyB0aGUKKyAgICAgICAgLy8gcmVhZGVyIGZ1bmN0aW9ucyBleHBl
Y3QgdGhlIGltYWdlIGRhdGEgdG8gc3RhcnQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlCisgICAgICAg
IC8vIGhlYWRlciBhbmQgKGlmIG5lY2Vzc2FyeSkgY29sb3IgdGFibGUuCisgICAgICAgIHNpemVf
dCBtX2ltZ0RhdGFPZmZzZXQ7CisKKyAgICAgICAgLy8gSUNPcyBzdG9yZSBhIDFicHAgIm1hc2si
IGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBtYWluIGJpdG1hcCBpbWFnZSBkYXRhCisgICAgICAgIC8v
IChhbmQsIGNvbmZ1c2luZ2x5LCBhZGQgaXRzIGhlaWdodCB0byB0aGUgYmlIZWlnaHQgdmFsdWUg
aW4gdGhlIGluZm8KKyAgICAgICAgLy8gaGVhZGVyLCB0aHVzIGRvdWJsaW5nIGl0KS4gIFRoaXMg
dmFyaWFibGUgdHJhY2tzIHdoZXRoZXIgd2UgaGF2ZSBzdWNoIGEKKyAgICAgICAgLy8gbWFzayBh
bmQgaWYgd2UndmUgc3RhcnRlZCBkZWNvZGluZyBpdCB5ZXQuCisgICAgICAgIEFuZE1hc2tTdGF0
ZSBtX2FuZE1hc2tTdGF0ZTsKKworICAgIHByaXZhdGU6CisgICAgICAgIC8vIFRoZSB2YXJpb3Vz
IEJNUCBjb21wcmVzc2lvbiB0eXBlcy4gIFdlIGRvbid0IGN1cnJlbnRseSBkZWNvZGUgYWxsIHRo
ZXNlLgorICAgICAgICBlbnVtIENvbXByZXNzaW9uVHlwZSB7CisgICAgICAgICAgICAvLyBVbml2
ZXJzYWwgdHlwZXMKKyAgICAgICAgICAgIFJHQiA9IDAsCisgICAgICAgICAgICBSTEU4ID0gMSwK
KyAgICAgICAgICAgIFJMRTQgPSAyLAorICAgICAgICAgICAgLy8gV2luZG93cyBWMysgb25seQor
ICAgICAgICAgICAgQklURklFTERTID0gMywKKyAgICAgICAgICAgIEpQRUcgPSA0LAorICAgICAg
ICAgICAgUE5HID0gNSwKKyAgICAgICAgICAgIC8vIE9TLzIgMi54LW9ubHkKKyAgICAgICAgICAg
IEhVRkZNQU4xRCwgIC8vIFN0b3JlZCBpbiBmaWxlIGFzIDMKKyAgICAgICAgICAgIFJMRTI0LCAg
ICAgIC8vIFN0b3JlZCBpbiBmaWxlIGFzIDQKKyAgICAgICAgfTsKKworICAgICAgICAvLyBUaGVz
ZSBhcmUgYmFzZWQgb24gdGhlIFdpbmRvd3MgQklUTUFQSU5GT0hFQURFUiBhbmQgUkdCVFJJUExF
IHN0cnVjdHMsCisgICAgICAgIC8vIGJ1dCB3aXRoIHVubmVjZXNzYXJ5IGVudHJpZXMgcmVtb3Zl
ZC4KKyAgICAgICAgc3RydWN0IEJpdG1hcEluZm9IZWFkZXIgeworICAgICAgICAgICAgdWludDMy
X3QgYmlTaXplOworICAgICAgICAgICAgaW50MzJfdCBiaVdpZHRoOworICAgICAgICAgICAgaW50
MzJfdCBiaUhlaWdodDsKKyAgICAgICAgICAgIHVpbnQxNl90IGJpQml0Q291bnQ7CisgICAgICAg
ICAgICBDb21wcmVzc2lvblR5cGUgYmlDb21wcmVzc2lvbjsKKyAgICAgICAgICAgIHVpbnQzMl90
IGJpQ2xyVXNlZDsKKyAgICAgICAgfTsKKyAgICAgICAgc3RydWN0IFJHQlRyaXBsZSB7CisgICAg
ICAgICAgICB1aW50OF90IHJnYkJsdWU7CisgICAgICAgICAgICB1aW50OF90IHJnYkdyZWVuOwor
ICAgICAgICAgICAgdWludDhfdCByZ2JSZWQ7CisgICAgICAgIH07CisKKyAgICAgICAgLy8gRGV0
ZXJtaW5lcyB0aGUgc2l6ZSBvZiB0aGUgQk1QIGluZm8gaGVhZGVyLiAgUmV0dXJucyB0cnVlIGlm
IHRoZSBzaXplIGlzCisgICAgICAgIC8vIHZhbGlkLgorICAgICAgICBib29sIGdldEluZm9IZWFk
ZXJTaXplKFNoYXJlZEJ1ZmZlciogZGF0YSk7CisKKyAgICAgICAgLy8gUHJvY2Vzc2VzIHRoZSBC
TVAgaW5mbyBoZWFkZXIuICBSZXR1cm5zIHRydWUgaWYgdGhlIGluZm8gaGVhZGVyIGNvdWxkIGJl
CisgICAgICAgIC8vIGRlY29kZWQuCisgICAgICAgIGJvb2wgcHJvY2Vzc0luZm9IZWFkZXIoU2hh
cmVkQnVmZmVyKiBkYXRhKTsKKworICAgICAgICAvLyBIZWxwZXIgZnVuY3Rpb24gZm9yIHByb2Nl
c3NJbmZvSGVhZGVyKCkgd2hpY2ggZG9lcyB0aGUgYWN0dWFsIHJlYWRpbmcgb2YKKyAgICAgICAg
Ly8gaGVhZGVyIHZhbHVlcyBmcm9tIHRoZSBieXRlIHN0cmVhbS4gIFJldHVybnMgZmFsc2Ugb24g
ZXJyb3IuCisgICAgICAgIGJvb2wgcmVhZEluZm9IZWFkZXIoU2hhcmVkQnVmZmVyKiBkYXRhKTsK
KworICAgICAgICAvLyBSZXR1cm5zIHRydWUgaWYgdGhpcyBpcyBhIFdpbmRvd3MgVjQrIEJNUC4K
KyAgICAgICAgaW5saW5lIGJvb2wgaXNXaW5kb3dzVjRQbHVzKCkgY29uc3QKKyAgICAgICAgewor
ICAgICAgICAgICAgLy8gV2luZG93cyBWNCBpbmZvIGhlYWRlciBpcyAxMDggYnl0ZXMuICBWNSBp
cyAxMjQgYnl0ZXMuCisgICAgICAgICAgICByZXR1cm4gKG1faW5mb0hlYWRlci5iaVNpemUgPT0g
MTA4KSB8fCAobV9pbmZvSGVhZGVyLmJpU2l6ZSA9PSAxMjQpOworICAgICAgICB9CisKKyAgICAg
ICAgLy8gUmV0dXJucyBmYWxzZSBpZiBjb25zaXN0ZW5jeSBlcnJvcnMgYXJlIGZvdW5kIGluIHRo
ZSBpbmZvIGhlYWRlci4KKyAgICAgICAgYm9vbCBpc0luZm9IZWFkZXJWYWxpZCgpIGNvbnN0Owor
CisgICAgICAgIC8vIEZvciBCSV9CSVRGSUVMRFMgaW1hZ2VzLCBpbml0aWFsaXplcyB0aGUgbV9i
aXRNYXNrc1tdIGFuZCBtX2JpdE9mZnNldHNbXQorICAgICAgICAvLyBhcnJheXMuICBwcm9jZXNz
SW5mb0hlYWRlcigpIHdpbGwgaW5pdGlhbGl6ZSB0aGVzZSBmb3Igb3RoZXIgY29tcHJlc3Npb24K
KyAgICAgICAgLy8gdHlwZXMgd2hlcmUgbmVlZGVkLgorICAgICAgICBib29sIHByb2Nlc3NCaXRt
YXNrcyhTaGFyZWRCdWZmZXIqIGRhdGEpOworCisgICAgICAgIC8vIEZvciBwYWxldHRlZCBpbWFn
ZXMsIGFsbG9jYXRlcyBhbmQgaW5pdGlhbGl6ZXMgdGhlIG1fY29sb3JUYWJsZVtdIGFycmF5Lgor
ICAgICAgICBib29sIHByb2Nlc3NDb2xvclRhYmxlKFNoYXJlZEJ1ZmZlciogZGF0YSk7CisKKyAg
ICAgICAgLy8gUHJvY2Vzc2VzIGFuIFJMRS1lbmNvZGVkIGltYWdlLiAgUmV0dXJucyB0cnVlIGlm
IHRoZSBlbnRpcmUgaW1hZ2Ugd2FzCisgICAgICAgIC8vIGRlY29kZWQuCisgICAgICAgIGJvb2wg
cHJvY2Vzc1JMRURhdGEoU2hhcmVkQnVmZmVyKiBkYXRhKTsKKworICAgICAgICAvLyBQcm9jZXNz
ZXMgYSBzZXQgb2Ygbm9uLVJMRS1jb21wcmVzc2VkIHBpeGVscy4gIFR3byBjYXNlczoKKyAgICAg
ICAgLy8gICAqIGluUkxFID0gdHJ1ZTogdGhlIGRhdGEgaXMgaW5zaWRlIGFuIFJMRS1lbmNvZGVk
IGJpdG1hcC4gIFRyaWVzIHRvCisgICAgICAgIC8vICAgICBwcm9jZXNzIHxudW1QaXhlbHN8IHBp
eGVscyBvbiB0aGUgY3VycmVudCByb3c7IHJldHVybnMgdHJ1ZSBvbgorICAgICAgICAvLyAgICAg
c3VjY2Vzcy4KKyAgICAgICAgLy8gICAqIGluUkxFID0gZmFsc2U6IHRoZSBkYXRhIGlzIGluc2lk
ZSBhIG5vbi1STEUtZW5jb2RlZCBiaXRtYXAuCisgICAgICAgIC8vICAgICB8bnVtUGl4ZWxzfCBp
cyBpZ25vcmVkLiAgRXhwZWN0cyB8bV9jb29yZHwgdG8gcG9pbnQgYXQgdGhlIGJlZ2lubmluZwor
ICAgICAgICAvLyAgICAgb2YgdGhlIG5leHQgcm93IHRvIGJlIGRlY29kZWQuICBUcmllcyB0byBw
cm9jZXNzIGFzIG1hbnkgY29tcGxldGUKKyAgICAgICAgLy8gICAgIHJvd3MgYXMgcG9zc2libGUu
ICBSZXR1cm5zIHRydWUgaWYgdGhlIHdob2xlIGltYWdlIHdhcyBkZWNvZGVkLgorICAgICAgICBi
b29sIHByb2Nlc3NOb25STEVEYXRhKFNoYXJlZEJ1ZmZlciogZGF0YSwgYm9vbCBpblJMRSwgaW50
IG51bVBpeGVscyk7CisKKyAgICAgICAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBjdXJyZW50IHkt
Y29vcmRpbmF0ZSBwbHVzIHxudW1Sb3dzfCB3b3VsZCBiZSBwYXN0CisgICAgICAgIC8vIHRoZSBl
bmQgb2YgdGhlIGltYWdlLiAgSGVyZSAicGx1cyIgbWVhbnMgInRvd2FyZCB0aGUgZW5kIG9mIHRo
ZSBpbWFnZSIsCisgICAgICAgIC8vIHNvIGRvd253YXJkcyBmb3IgbV9pc1RvcERvd24gaW1hZ2Vz
IGFuZCB1cHdhcmRzIG90aGVyd2lzZS4KKyAgICAgICAgaW5saW5lIGJvb2wgcGFzdEVuZE9mSW1h
Z2UoaW50IG51bVJvd3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtX2lzVG9wRG93
bgorICAgICAgICAgICAgICAgID8gKChtX2Nvb3JkLnkoKSArIG51bVJvd3MpID49IHNpemUoKS5o
ZWlnaHQoKSkKKyAgICAgICAgICAgICAgICA6ICgobV9jb29yZC55KCkgLSBudW1Sb3dzKSA8IDAp
OworICAgICAgICB9CisKKyAgICAgICAgLy8gUmV0dXJucyB0aGUgcGl4ZWwgZGF0YSBmb3IgdGhl
IGN1cnJlbnQgWCBjb29yZGluYXRlIGluIGEgdWludDMyX3QuCisgICAgICAgIC8vIEFzc3VtZXMg
bV9kZWNvZGVkT2Zmc2V0IGhhcyBiZWVuIHNldCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjdXJy
ZW50CisgICAgICAgIC8vIHJvdy4KKyAgICAgICAgLy8gTk9URTogT25seSBhcyBtYW55IGJ5dGVz
IG9mIHRoZSByZXR1cm4gdmFsdWUgYXMgYXJlIG5lZWRlZCB0byBob2xkIHRoZQorICAgICAgICAv
LyBwaXhlbCBkYXRhIHdpbGwgYWN0dWFsbHkgYmUgc2V0LgorICAgICAgICBpbmxpbmUgdWludDMy
X3QgcmVhZEN1cnJlbnRQaXhlbChTaGFyZWRCdWZmZXIqIGRhdGEsIGludCBieXRlc1BlclBpeGVs
KSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBpbnQgYWRkaXRpb25hbE9mZnNl
dCA9IG1fY29vcmQueCgpICogYnl0ZXNQZXJQaXhlbDsKKyAgICAgICAgICAgIHN3aXRjaCAoYnl0
ZXNQZXJQaXhlbCkgeworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIHJldHVy
biByZWFkVWludDE2KGRhdGEsIGFkZGl0aW9uYWxPZmZzZXQpOworCisgICAgICAgICAgICBjYXNl
IDM6IHsKKyAgICAgICAgICAgICAgICAvLyBJdCBkb2Vzbid0IG1hdHRlciB0aGF0IHdlIG5ldmVy
IHNldCB0aGUgbW9zdCBzaWduaWZpY2FudCBieXRlIG9mCisgICAgICAgICAgICAgICAgLy8gdGhl
IHJldHVybiB2YWx1ZSBoZXJlIGluIGxpdHRsZS1lbmRpYW4gbW9kZSwgdGhlIGNhbGxlciB3b24n
dAorICAgICAgICAgICAgICAgIC8vIHJlYWQgaXQuCisgICAgICAgICAgICAgICAgdWludDMyX3Qg
cGl4ZWw7CisgICAgICAgICAgICAgICAgbWVtY3B5KCZwaXhlbCwKKyAgICAgICAgICAgICAgICAg
ICAgICAgJmRhdGEtPmRhdGEoKVttX2RlY29kZWRPZmZzZXQgKyBhZGRpdGlvbmFsT2Zmc2V0XSwg
Myk7CisgICAgICAgICNpZiBQTEFURk9STShCSUdfRU5ESUFOKQorICAgICAgICAgICAgICAgIHBp
eGVsID0gKChwaXhlbCAmIDB4ZmYwMCkgPDwgOCkgfCAoKHBpeGVsICYgMHhmZjAwMDApID4+IDgp
IHwKKyAgICAgICAgICAgICAgICAgICAgKChwaXhlbCAmIDB4ZmYwMDAwMDApID4+IDI0KTsKKyAg
ICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgcmV0dXJuIHBpeGVsOworICAgICAgICAgICAg
fQorCisgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRVaW50
MzIoZGF0YSwgYWRkaXRpb25hbE9mZnNldCk7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAg
ICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgICAgICAgICAgcmV0dXJu
IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXR1cm5zIHRoZSB2
YWx1ZSBvZiB0aGUgZGVzaXJlZCBjb21wb25lbnQgKDAsIDEsIDIsIDMgPT0gUiwgRywgQiwgQSkg
aW4KKyAgICAgICAgLy8gdGhlIGdpdmVuIHBpeGVsIGRhdGEuCisgICAgICAgIGlubGluZSB1bnNp
Z25lZCBnZXRDb21wb25lbnQodWludDMyX3QgcGl4ZWwsIGludCBjb21wb25lbnQpIGNvbnN0Cisg
ICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoKHBpeGVsICYgbV9iaXRNYXNrc1tjb21wb25l
bnRdKSA+PiBtX2JpdFNoaWZ0c1JpZ2h0W2NvbXBvbmVudF0pCisgICAgICAgICAgICAgICAgPDwg
bV9iaXRTaGlmdHNMZWZ0W2NvbXBvbmVudF07CisgICAgICAgIH0KKworICAgICAgICBpbmxpbmUg
dW5zaWduZWQgZ2V0QWxwaGEodWludDMyX3QgcGl4ZWwpIGNvbnN0CisgICAgICAgIHsKKyAgICAg
ICAgICAgIC8vIEZvciBpbWFnZXMgd2l0aG91dCBhbHBoYSwgcmV0dXJuIGFscGhhIG9mIDB4ZmYu
CisgICAgICAgICAgICBpZiAobV9iaXRNYXNrc1szXSA9PSAwKQorICAgICAgICAgICAgICAgIHJl
dHVybiAweGZmOworCisgICAgICAgICAgICByZXR1cm4gZ2V0Q29tcG9uZW50KHBpeGVsLCAzKTsK
KyAgICAgICAgfQorCisgICAgICAgIC8vIFNldHMgdGhlIGN1cnJlbnQgcGl4ZWwgdG8gdGhlIGNv
bG9yIGdpdmVuIGJ5IHxjb2xvckluZGV4fC4gIFRoaXMgYWxzbworICAgICAgICAvLyBpbmNyZW1l
bnRzIHRoZSByZWxldmFudCBsb2NhbCB2YXJpYWJsZXMgdG8gbW92ZSB0aGUgY3VycmVudCBwaXhl
bCByaWdodAorICAgICAgICAvLyBieSBvbmUuCisgICAgICAgIGlubGluZSB2b2lkIHNldEkoc2l6
ZV90IGNvbG9ySW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNldFJHQkEobV9jb2xvclRh
YmxlW2NvbG9ySW5kZXhdLnJnYlJlZCwgbV9jb2xvclRhYmxlW2NvbG9ySW5kZXhdLnJnYkdyZWVu
LAorICAgICAgICAgICAgICAgICAgICBtX2NvbG9yVGFibGVbY29sb3JJbmRleF0ucmdiQmx1ZSwg
MHhmZik7CisgICAgICAgIH0KKworICAgICAgICAvLyBMaWtlIHNldEkoKSwgYnV0IHdpdGggdGhl
IGluZGl2aWR1YWwgY29tcG9uZW50IHZhbHVlcyBzcGVjaWZpZWQuCisgICAgICAgIGlubGluZSB2
b2lkIHNldFJHQkEodW5zaWduZWQgcmVkLCB1bnNpZ25lZCBncmVlbiwgdW5zaWduZWQgYmx1ZSwg
dW5zaWduZWQgYWxwaGEpCisgICAgICAgIHsKKyAgICAgICAgICAgIFJHQkEzMkJ1ZmZlcjo6c2V0
UkdCQSgKKyAgICAgICAgICAgICAgICBtX2ZyYW1lQnVmZmVyQ2FjaGUuZmlyc3QoKS5iaXRtYXAo
KS5nZXRBZGRyMzIobV9jb29yZC54KCksIG1fY29vcmQueSgpKSwKKyAgICAgICAgICAgICAgICBy
ZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7CisgICAgICAgICAgICBtX2Nvb3JkLm1vdmUoMSwgMCk7
CisgICAgICAgIH0KKworICAgICAgICAvLyBGaWxscyBwaXhlbHMgZnJvbSB0aGUgY3VycmVudCBY
LWNvb3JkaW5hdGUgdXAgdG8sIGJ1dCBub3QgaW5jbHVkaW5nLAorICAgICAgICAvLyB8ZW5kQ29v
cmR8IHdpdGggdGhlIGNvbG9yIGdpdmVuIGJ5IHRoZSBpbmRpdmlkdWFsIGNvbXBvbmVudHMuICBU
aGlzIGFsc28KKyAgICAgICAgLy8gaW5jcmVtZW50cyB0aGUgcmVsZXZhbnQgbG9jYWwgdmFyaWFi
bGVzIHRvIG1vdmUgdGhlIGN1cnJlbnQgcGl4ZWwgcmlnaHQKKyAgICAgICAgLy8gdG8gfGVuZENv
b3JkfC4KKyAgICAgICAgaW5saW5lIHZvaWQgZmlsbFJHQkEoaW50IGVuZENvb3JkLCB1bnNpZ25l
ZCByZWQsIHVuc2lnbmVkIGdyZWVuLCB1bnNpZ25lZCBibHVlLCB1bnNpZ25lZCBhbHBoYSkKKyAg
ICAgICAgeworICAgICAgICAgICAgd2hpbGUgKG1fY29vcmQueCgpIDwgZW5kQ29vcmQpCisgICAg
ICAgICAgICAgICAgc2V0UkdCQShyZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7CisgICAgICAgIH0K
KworICAgICAgICAvLyBSZXNldHMgdGhlIHJlbGV2YW50IGxvY2FsIHZhcmlhYmxlcyB0byBzdGFy
dCBkcmF3aW5nIGF0IHRoZSBsZWZ0IGVkZ2Ugb2YKKyAgICAgICAgLy8gdGhlICJuZXh0IiByb3cs
IHdoZXJlICJuZXh0IiBpcyBhYm92ZSBvciBiZWxvdyB0aGUgY3VycmVudCByb3cgZGVwZW5kaW5n
CisgICAgICAgIC8vIG9uIHRoZSB2YWx1ZSBvZiB8bV9pc1RvcERvd258LgorICAgICAgICB2b2lk
IG1vdmVCdWZmZXJUb05leHRSb3coKTsKKworICAgICAgICAvLyBUaGUgQk1QIGluZm8gaGVhZGVy
LgorICAgICAgICBCaXRtYXBJbmZvSGVhZGVyIG1faW5mb0hlYWRlcjsKKworICAgICAgICAvLyBU
cnVlIGlmIHRoaXMgaXMgYW4gT1MvMiAxLnggKGFrYSBXaW5kb3dzIDIueCkgQk1QLiAgVGhlIHN0
cnVjdCBsYXlvdXRzCisgICAgICAgIC8vIGZvciB0aGlzIHR5cGUgb2YgQk1QIGFyZSBzbGlnaHRs
eSBkaWZmZXJlbnQgZnJvbSB0aGUgbGF0ZXIsIG1vcmUgY29tbW9uCisgICAgICAgIC8vIGZvcm1h
dHMuCisgICAgICAgIGJvb2wgbV9pc09TMjF4OworCisgICAgICAgIC8vIFRydWUgaWYgdGhpcyBp
cyBhbiBPUy8yIDIueCBCTVAuICBUaGUgbWVhbmluZ3Mgb2YgY29tcHJlc3Npb24gdHlwZXMgMwor
ICAgICAgICAvLyBhbmQgNCBmb3IgdGhpcyB0eXBlIG9mIEJNUCBkaWZmZXIgZnJvbSBXaW5kb3dz
IFYzKyBCTVBzLgorICAgICAgICAvLworICAgICAgICAvLyBUaGlzIHdpbGwgYmUgZmFsc2VseSBu
ZWdhdGl2ZSBpbiBzb21lIGNhc2VzLCBidXQgb25seSBvbmVzIHdoZXJlIHRoZSB3YXkKKyAgICAg
ICAgLy8gd2UgbWlzaW50ZXJwcmV0IHRoZSBkYXRhIGlzIGlycmVsZXZhbnQuCisgICAgICAgIGJv
b2wgbV9pc09TMjJ4OworCisgICAgICAgIC8vIFRydWUgaWYgdGhlIEJNUCBpcyBub3QgdmVydGlj
YWxseSBmbGlwcGVkLCB0aGF0IGlzLCB0aGUgZmlyc3QgbGluZSBvZgorICAgICAgICAvLyByYXN0
ZXIgZGF0YSBpbiB0aGUgZmlsZSBpcyB0aGUgdG9wIGxpbmUgb2YgdGhlIGltYWdlLgorICAgICAg
ICBib29sIG1faXNUb3BEb3duOworCisgICAgICAgIC8vIFRoZXNlIGZsYWdzIGdldCBzZXQgdG8g
ZmFsc2UgYXMgd2UgZmluaXNoIGVhY2ggcHJvY2Vzc2luZyBzdGFnZS4KKyAgICAgICAgYm9vbCBt
X25lZWRUb1Byb2Nlc3NCaXRtYXNrczsKKyAgICAgICAgYm9vbCBtX25lZWRUb1Byb2Nlc3NDb2xv
clRhYmxlOworCisgICAgICAgIC8vIE1hc2tzL29mZnNldHMgZm9yIHRoZSBjb2xvciB2YWx1ZXMg
Zm9yIG5vbi1wYWxldHRlIGZvcm1hdHMuICBUaGVzZSBhcmUKKyAgICAgICAgLy8gYml0d2lzZSwg
d2l0aCBhcnJheSBlbnRyaWVzIDAsIDEsIDIsIDMgY29ycmVzcG9uZGluZyB0byBSLCBHLCBCLCBB
LgorICAgICAgICAvLworICAgICAgICAvLyBUaGUgcmlnaHQvbGVmdCBzaGlmdCB2YWx1ZXMgYXJl
IG1lYW50IHRvIGJlIGFwcGxpZWQgYWZ0ZXIgdGhlIG1hc2tzLgorICAgICAgICAvLyBXZSBuZWVk
IHRvIHJpZ2h0IHNoaWZ0IHRvIGNvbXBlbnNhdGUgZm9yIHRoZSBiaXRmaWVsZHMnIG9mZnNldHMg
aW50byB0aGUKKyAgICAgICAgLy8gMzIgYml0cyBvZiBwaXhlbCBkYXRhLCBhbmQgbGVmdCBzaGlm
dCB0byBzY2FsZSB0aGUgY29sb3IgdmFsdWVzIHVwIGZvcgorICAgICAgICAvLyBmaWVsZHMgd2l0
aCBsZXNzIHRoYW4gOCBiaXRzIG9mIHByZWNpc2lvbi4gIFNhZGx5LCB3ZSBjYW4ndCBqdXN0IGNv
bWJpbmUKKyAgICAgICAgLy8gdGhlc2UgaW50byBvbmUgc2hpZnQgdmFsdWUgYmVjYXVzZSB0aGUg
bmV0IHNoaWZ0IGFtb3VudCBjb3VsZCBnbyBlaXRoZXIKKyAgICAgICAgLy8gZGlyZWN0aW9uLiAg
KElmIG9ubHkgIjw8IC14IiB3ZXJlIGVxdWl2YWxlbnQgdG8gIj4+IHgiLi4uKQorICAgICAgICB1
aW50MzJfdCBtX2JpdE1hc2tzWzRdOworICAgICAgICBpbnQgbV9iaXRTaGlmdHNSaWdodFs0XTsK
KyAgICAgICAgaW50IG1fYml0U2hpZnRzTGVmdFs0XTsKKworICAgICAgICAvLyBUaGUgY29sb3Ig
cGFsZXR0ZSwgZm9yIHBhbGV0dGVkIGZvcm1hdHMuCisgICAgICAgIHNpemVfdCBtX3RhYmxlU2l6
ZUluQnl0ZXM7CisgICAgICAgIFZlY3RvcjxSR0JUcmlwbGU+IG1fY29sb3JUYWJsZTsKKworICAg
ICAgICAvLyBUaGUgY29vcmRpbmF0ZSB0byB3aGljaCB3ZSd2ZSBkZWNvZGVkIHRoZSBpbWFnZS4K
KyAgICAgICAgSW50UG9pbnQgbV9jb29yZDsKKworICAgICAgICAvLyBWYXJpYWJsZXMgdGhhdCB0
cmFjayB3aGV0aGVyIHdlJ3ZlIHNlZW4gcGl4ZWxzIHdpdGggYWxwaGEgdmFsdWVzICE9IDAKKyAg
ICAgICAgLy8gYW5kID09IDAsIHJlc3BlY3RpdmVseS4gIFNlZSBjb21tZW50cyBpbiBwcm9jZXNz
Tm9uUkxFRGF0YSgpIG9uIGhvdworICAgICAgICAvLyB0aGVzZSBhcmUgdXNlZC4KKyAgICAgICAg
Ym9vbCBtX3NlZW5Ob25aZXJvQWxwaGFQaXhlbDsKKyAgICAgICAgYm9vbCBtX3NlZW5aZXJvQWxw
aGFQaXhlbDsKKyAgICB9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZgpJbmRl
eDogcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvc2tpYS9HSUZJbWFnZURlY29kZXIuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIHBsYXRmb3JtL2ltYWdlLWRlY29kZXJzL3NraWEvR0lGSW1hZ2VEZWNvZGVyLmNw
cAkocmV2aXNpb24gNDAxNjUpCisrKyBwbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9za2lhL0dJRklt
YWdlRGVjb2Rlci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEsNSArMSw2IEBACiAvKgogICogQ29w
eXJpZ2h0IChDKSAyMDA2IEFwcGxlIENvbXB1dGVyLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICogQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5IEdvb2dsZSwgSW5jLgogICoKICAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCkBAIC0yNywxNyArMjgsMTQgQEAKICNpbmNsdWRlICJHSUZJbWFn
ZURlY29kZXIuaCIKICNpbmNsdWRlICJHSUZJbWFnZVJlYWRlci5oIgogCi0jaWYgUExBVEZPUk0o
Q0FJUk8pIHx8IFBMQVRGT1JNKFFUKSB8fCBQTEFURk9STShXWCkKLQogbmFtZXNwYWNlIFdlYkNv
cmUgewogCi1jbGFzcyBHSUZJbWFnZURlY29kZXJQcml2YXRlCi17CitjbGFzcyBHSUZJbWFnZURl
Y29kZXJQcml2YXRlIHsKIHB1YmxpYzoKICAgICBHSUZJbWFnZURlY29kZXJQcml2YXRlKEdJRklt
YWdlRGVjb2RlciogZGVjb2RlciA9IDApCiAgICAgICAgIDogbV9yZWFkZXIoZGVjb2RlcikKKyAg
ICAgICAgLCBtX3JlYWRPZmZzZXQoMCkKICAgICB7Ci0gICAgICAgIG1fcmVhZE9mZnNldCA9IDA7
CiAgICAgfQogCiAgICAgfkdJRkltYWdlRGVjb2RlclByaXZhdGUoKQpAQCAtNDUsMTEgKzQzLDEx
IEBAIHB1YmxpYzoKICAgICAgICAgbV9yZWFkZXIuY2xvc2UoKTsKICAgICB9CiAKLSAgICBib29s
IGRlY29kZShjb25zdCBWZWN0b3I8Y2hhcj4mIGRhdGEsIAorICAgIGJvb2wgZGVjb2RlKFNoYXJl
ZEJ1ZmZlciogZGF0YSwgCiAgICAgICAgICAgICAgICAgR0lGSW1hZ2VEZWNvZGVyOjpHSUZRdWVy
eSBxdWVyeSA9IEdJRkltYWdlRGVjb2Rlcjo6R0lGRnVsbFF1ZXJ5LAogICAgICAgICAgICAgICAg
IHVuc2lnbmVkIGludCBoYWx0RnJhbWUgPSAtMSkKICAgICB7Ci0gICAgICAgIHJldHVybiBtX3Jl
YWRlci5yZWFkKChjb25zdCB1bnNpZ25lZCBjaGFyKilkYXRhLmRhdGEoKSArIG1fcmVhZE9mZnNl
dCwgZGF0YS5zaXplKCkgLSBtX3JlYWRPZmZzZXQsIAorICAgICAgICByZXR1cm4gbV9yZWFkZXIu
cmVhZCgoY29uc3QgdW5zaWduZWQgY2hhciopZGF0YS0+ZGF0YSgpICsgbV9yZWFkT2Zmc2V0LCBk
YXRhLT5zaXplKCkgLSBtX3JlYWRPZmZzZXQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBxdWVyeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFsdEZyYW1lKTsKICAgICB9
CkBAIC02MSw3ICs1OSw4IEBAIHB1YmxpYzoKIAogICAgIGJvb2wgaXNUcmFuc3BhcmVudCgpIGNv
bnN0IHsgcmV0dXJuIG1fcmVhZGVyLmZyYW1lX3JlYWRlci0+aXNfdHJhbnNwYXJlbnQ7IH0KIAot
ICAgIHZvaWQgZ2V0Q29sb3JNYXAodW5zaWduZWQgY2hhciomIG1hcCwgdW5zaWduZWQmIHNpemUp
IGNvbnN0IHsKKyAgICB2b2lkIGdldENvbG9yTWFwKHVuc2lnbmVkIGNoYXIqJiBtYXAsIHVuc2ln
bmVkJiBzaXplKSBjb25zdAorICAgIHsKICAgICAgICAgaWYgKG1fcmVhZGVyLmZyYW1lX3JlYWRl
ci0+aXNfbG9jYWxfY29sb3JtYXBfZGVmaW5lZCkgewogICAgICAgICAgICAgbWFwID0gbV9yZWFk
ZXIuZnJhbWVfcmVhZGVyLT5sb2NhbF9jb2xvcm1hcDsKICAgICAgICAgICAgIHNpemUgPSAodW5z
aWduZWQpbV9yZWFkZXIuZnJhbWVfcmVhZGVyLT5sb2NhbF9jb2xvcm1hcF9zaXplOwpAQCAtODYs
OCArODUsMTEgQEAgcHJpdmF0ZToKIH07CiAKIEdJRkltYWdlRGVjb2Rlcjo6R0lGSW1hZ2VEZWNv
ZGVyKCkKLTogbV9mcmFtZUNvdW50VmFsaWQodHJ1ZSksIG1fcmVwZXRpdGlvbkNvdW50KGNBbmlt
YXRpb25Mb29wT25jZSksIG1fcmVhZGVyKDApCi17fQorICAgIDogbV9mcmFtZUNvdW50VmFsaWQo
dHJ1ZSkKKyAgICAsIG1fcmVwZXRpdGlvbkNvdW50KGNBbmltYXRpb25Mb29wT25jZSkKKyAgICAs
IG1fcmVhZGVyKDApCit7Cit9CiAKIEdJRkltYWdlRGVjb2Rlcjo6fkdJRkltYWdlRGVjb2Rlcigp
CiB7CkBAIC0xMTUsNyArMTE3LDcgQEAgdm9pZCBHSUZJbWFnZURlY29kZXI6OnNldERhdGEoU2hh
cmVkQnVmZgogYm9vbCBHSUZJbWFnZURlY29kZXI6OmlzU2l6ZUF2YWlsYWJsZSgpIGNvbnN0CiB7
CiAgICAgLy8gSWYgd2UgaGF2ZSBwZW5kaW5nIGRhdGEgdG8gZGVjb2RlLCBzZW5kIGl0IHRvIHRo
ZSBHSUYgcmVhZGVyIG5vdy4KLSAgICBpZiAoIW1fc2l6ZUF2YWlsYWJsZSAmJiBtX3JlYWRlcikg
eworICAgIGlmICghSW1hZ2VEZWNvZGVyOjppc1NpemVBdmFpbGFibGUoKSAmJiBtX3JlYWRlcikg
ewogICAgICAgICBpZiAobV9mYWlsZWQpCiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKQEAg
LTEyNCw3ICsxMjYsNyBAQCBib29sIEdJRkltYWdlRGVjb2Rlcjo6aXNTaXplQXZhaWxhYmxlKCkg
CiAgICAgICAgIGRlY29kZShHSUZTaXplUXVlcnksIDApOwogICAgIH0KIAotICAgIHJldHVybiBt
X3NpemVBdmFpbGFibGU7CisgICAgcmV0dXJuICFtX2ZhaWxlZCAmJiBJbWFnZURlY29kZXI6Omlz
U2l6ZUF2YWlsYWJsZSgpOwogfQogCiAvLyBUaGUgdG90YWwgbnVtYmVyIG9mIGZyYW1lcyBmb3Ig
dGhlIGltYWdlLiAgV2lsbCBzY2FuIHRoZSBpbWFnZSBkYXRhIGZvciB0aGUgYW5zd2VyCkBAIC0x
MzksNyArMTQxLDEwIEBAIGludCBHSUZJbWFnZURlY29kZXI6OmZyYW1lQ291bnQoKQogICAgICAg
ICAvLyBzdGF0ZSwgYnV0IGZvciBub3cgd2UganVzdCBjcmF3bCBhbGwgdGhlIGRhdGEuICBOb3Rl
IHRoYXQgdGhpcyBpcyBubyB3b3JzZSB0aGFuIHdoYXQKICAgICAgICAgLy8gSW1hZ2VJTyBkb2Vz
IG9uIE1hYyByaWdodCBub3cgKGl0IGFsc28gY3Jhd2xzIGFsbCB0aGUgZGF0YSBhZ2FpbikuCiAg
ICAgICAgIEdJRkltYWdlRGVjb2RlclByaXZhdGUgcmVhZGVyOwotICAgICAgICByZWFkZXIuZGVj
b2RlKG1fZGF0YS0+YnVmZmVyKCksIEdJRkZyYW1lQ291bnRRdWVyeSk7CisgICAgICAgIC8vIFRo
aXMgZnVuY3Rpb24gbWF5IGZhaWwsIGJ1dCB3ZSB3YW50IHRvIGtlZXAgYW55IHBhcnRpYWwgZGF0
YSBpdCBtYXkKKyAgICAgICAgLy8gaGF2ZSBkZWNvZGVkLCBzbyBkb24ndCBtYXJrIGl0IGlzIGlu
dmFsaWQuIElmIHRoZXJlIGlzIGFuIG92ZXJmbG93CisgICAgICAgIC8vIG9yIHNvbWUgc2VyaW91
cyBlcnJvciwgbV9mYWlsZWQgd2lsbCBoYXZlIGdvdHRlbiBzZXQgZm9yIHVzLgorICAgICAgICBy
ZWFkZXIuZGVjb2RlKG1fZGF0YS5nZXQoKSwgR0lGRnJhbWVDb3VudFF1ZXJ5KTsKICAgICAgICAg
bV9mcmFtZUNvdW50VmFsaWQgPSB0cnVlOwogICAgICAgICBtX2ZyYW1lQnVmZmVyQ2FjaGUucmVz
aXplKHJlYWRlci5mcmFtZUNvdW50KCkpOwogICAgIH0KQEAgLTE3MywxMyArMTc4LDEyIEBAIGlu
dCBHSUZJbWFnZURlY29kZXI6OnJlcGV0aXRpb25Db3VudCgpIGMKIAogUkdCQTMyQnVmZmVyKiBH
SUZJbWFnZURlY29kZXI6OmZyYW1lQnVmZmVyQXRJbmRleChzaXplX3QgaW5kZXgpCiB7Ci0gICAg
aWYgKGluZGV4ID49IGZyYW1lQ291bnQoKSkKKyAgICBpZiAoaW5kZXggPj0gc3RhdGljX2Nhc3Q8
c2l6ZV90PihmcmFtZUNvdW50KCkpKQogICAgICAgICByZXR1cm4gMDsKIAogICAgIFJHQkEzMkJ1
ZmZlciYgZnJhbWUgPSBtX2ZyYW1lQnVmZmVyQ2FjaGVbaW5kZXhdOwogICAgIGlmIChmcmFtZS5z
dGF0dXMoKSAhPSBSR0JBMzJCdWZmZXI6OkZyYW1lQ29tcGxldGUgJiYgbV9yZWFkZXIpCi0gICAg
ICAgIC8vIERlY29kZSB0aGlzIGZyYW1lLgotICAgICAgICBkZWNvZGUoR0lGRnVsbFF1ZXJ5LCBp
bmRleCsxKTsKKyAgICAgICAgZGVjb2RlKEdJRkZ1bGxRdWVyeSwgaW5kZXgrMSk7IC8vIERlY29k
ZSB0aGlzIGZyYW1lLgogICAgIHJldHVybiAmZnJhbWU7CiB9CiAKQEAgLTE4OCw3ICsxOTIsNyBA
QCB2b2lkIEdJRkltYWdlRGVjb2Rlcjo6Y2xlYXJGcmFtZUJ1ZmZlckNhCiAgICAgLy8gSW4gc29t
ZSBjYXNlcywgbGlrZSBpZiB0aGUgZGVjb2RlciB3YXMgZGVzdHJveWVkIHdoaWxlIGFuaW1hdGlu
Zywgd2UKICAgICAvLyBjYW4gYmUgYXNrZWQgdG8gY2xlYXIgbW9yZSBmcmFtZXMgdGhhbiB3ZSBj
dXJyZW50bHkgaGF2ZS4KICAgICBpZiAobV9mcmFtZUJ1ZmZlckNhY2hlLmlzRW1wdHkoKSkKLSAg
ICAgICAgcmV0dXJuOyAgLy8gTm90aGluZyB0byBkby4KKyAgICAgICAgcmV0dXJuOyAvLyBOb3Ro
aW5nIHRvIGRvLgogICAgIC8vIFRoZSAiLTEiIGhlcmUgaXMgdHJpY2t5LiAgSXQgZG9lcyBub3Qg
bWVhbiB0aGF0IHxjbGVhckJlZm9yZUZyYW1lfCBpcyB0aGUKICAgICAvLyBsYXN0IGZyYW1lIHdl
IHdpc2ggdG8gcHJlc2VydmUsIGJ1dCByYXRoZXIgdGhhdCB3ZSBuZXZlciB3YW50IHRvIGNsZWFy
CiAgICAgLy8gdGhlIHZlcnkgbGFzdCBmcmFtZSBpbiB0aGUgY2FjaGU6IGl0J3MgZW1wdHkgKHNv
IGNsZWFyaW5nIGl0IGlzCkBAIC0yMDEsNyArMjA1LDcgQEAgdm9pZCBHSUZJbWFnZURlY29kZXI6
OmNsZWFyRnJhbWVCdWZmZXJDYQogICAgIGNvbnN0IFZlY3RvcjxSR0JBMzJCdWZmZXI+OjppdGVy
YXRvciBlbmQobV9mcmFtZUJ1ZmZlckNhY2hlLmJlZ2luKCkgKyBjbGVhckJlZm9yZUZyYW1lKTsK
ICAgICBmb3IgKFZlY3RvcjxSR0JBMzJCdWZmZXI+OjppdGVyYXRvciBpKG1fZnJhbWVCdWZmZXJD
YWNoZS5iZWdpbigpKTsgaSAhPSBlbmQ7ICsraSkgewogICAgICAgICBpZiAoaS0+c3RhdHVzKCkg
PT0gUkdCQTMyQnVmZmVyOjpGcmFtZUVtcHR5KQotICAgICAgICAgICAgY29udGludWU7ICAvLyBO
b3RoaW5nIHRvIGRvLgorICAgICAgICAgICAgY29udGludWU7IC8vIE5vdGhpbmcgdG8gZG8uCiAK
ICAgICAgICAgLy8gVGhlIGxheW91dCBvZiBmcmFtZXMgaXM6CiAgICAgICAgIC8vIFtlbXB0eSBm
cmFtZXNdW2NvbXBsZXRlIGZyYW1lc11bcGFydGlhbCBmcmFtZV1bZW1wdHkgZnJhbWVzXQpAQCAt
MjIzLDcgKzIyNyw3IEBAIHZvaWQgR0lGSW1hZ2VEZWNvZGVyOjpkZWNvZGUoR0lGUXVlcnkgcXUK
ICAgICBpZiAobV9mYWlsZWQpCiAgICAgICAgIHJldHVybjsKIAotICAgIG1fZmFpbGVkID0gIW1f
cmVhZGVyLT5kZWNvZGUobV9kYXRhLT5idWZmZXIoKSwgcXVlcnksIGhhbHRBdEZyYW1lKTsKKyAg
ICBtX2ZhaWxlZCA9ICFtX3JlYWRlci0+ZGVjb2RlKG1fZGF0YS5nZXQoKSwgcXVlcnksIGhhbHRB
dEZyYW1lKTsKICAgICAKICAgICBpZiAobV9mYWlsZWQpIHsKICAgICAgICAgZGVsZXRlIG1fcmVh
ZGVyOwpAQCAtMjMyLDEwICsyMzYsOSBAQCB2b2lkIEdJRkltYWdlRGVjb2Rlcjo6ZGVjb2RlKEdJ
RlF1ZXJ5IHF1CiB9CiAKIC8vIENhbGxiYWNrcyBmcm9tIHRoZSBHSUYgcmVhZGVyLgotdm9pZCBH
SUZJbWFnZURlY29kZXI6OnNpemVOb3dBdmFpbGFibGUodW5zaWduZWQgd2lkdGgsIHVuc2lnbmVk
IGhlaWdodCkKK2Jvb2wgR0lGSW1hZ2VEZWNvZGVyOjpzaXplTm93QXZhaWxhYmxlKHVuc2lnbmVk
IHdpZHRoLCB1bnNpZ25lZCBoZWlnaHQpCiB7Ci0gICAgbV9zaXplID0gSW50U2l6ZSh3aWR0aCwg
aGVpZ2h0KTsKLSAgICBtX3NpemVBdmFpbGFibGUgPSB0cnVlOworICAgIHJldHVybiBzZXRTaXpl
KHdpZHRoLCBoZWlnaHQpOwogfQogCiB2b2lkIEdJRkltYWdlRGVjb2Rlcjo6ZGVjb2RpbmdIYWx0
ZWQodW5zaWduZWQgYnl0ZXNMZWZ0KQpAQCAtMjQzLDI0ICsyNDYsMjggQEAgdm9pZCBHSUZJbWFn
ZURlY29kZXI6OmRlY29kaW5nSGFsdGVkKHVucwogICAgIG1fcmVhZGVyLT5zZXRSZWFkT2Zmc2V0
KG1fZGF0YS0+c2l6ZSgpIC0gYnl0ZXNMZWZ0KTsKIH0KIAotdm9pZCBHSUZJbWFnZURlY29kZXI6
OmluaXRGcmFtZUJ1ZmZlcih1bnNpZ25lZCBmcmFtZUluZGV4KQorYm9vbCBHSUZJbWFnZURlY29k
ZXI6OmluaXRGcmFtZUJ1ZmZlcih1bnNpZ25lZCBmcmFtZUluZGV4KQogewogICAgIC8vIEluaXRp
YWxpemUgdGhlIGZyYW1lIHJlY3QgaW4gb3VyIGJ1ZmZlci4KICAgICBJbnRSZWN0IGZyYW1lUmVj
dChtX3JlYWRlci0+ZnJhbWVYT2Zmc2V0KCksIG1fcmVhZGVyLT5mcmFtZVlPZmZzZXQoKSwKICAg
ICAgICAgICAgICAgICAgICAgICBtX3JlYWRlci0+ZnJhbWVXaWR0aCgpLCBtX3JlYWRlci0+ZnJh
bWVIZWlnaHQoKSk7CiAKICAgICAvLyBNYWtlIHN1cmUgdGhlIGZyYW1lUmVjdCBkb2Vzbid0IGV4
dGVuZCBwYXN0IHRoZSBib3R0b20tcmlnaHQgb2YgdGhlIGJ1ZmZlci4KLSAgICBpZiAoZnJhbWVS
ZWN0LnJpZ2h0KCkgPiBtX3NpemUud2lkdGgoKSkKLSAgICAgICAgZnJhbWVSZWN0LnNldFdpZHRo
KG1fc2l6ZS53aWR0aCgpIC0gbV9yZWFkZXItPmZyYW1lWE9mZnNldCgpKTsKLSAgICBpZiAoZnJh
bWVSZWN0LmJvdHRvbSgpID4gbV9zaXplLmhlaWdodCgpKQotICAgICAgICBmcmFtZVJlY3Quc2V0
SGVpZ2h0KG1fc2l6ZS5oZWlnaHQoKSAtIG1fcmVhZGVyLT5mcmFtZVlPZmZzZXQoKSk7CisgICAg
aWYgKGZyYW1lUmVjdC5yaWdodCgpID4gc2l6ZSgpLndpZHRoKCkpCisgICAgICAgIGZyYW1lUmVj
dC5zZXRXaWR0aChzaXplKCkud2lkdGgoKSAtIG1fcmVhZGVyLT5mcmFtZVhPZmZzZXQoKSk7Cisg
ICAgaWYgKGZyYW1lUmVjdC5ib3R0b20oKSA+IHNpemUoKS5oZWlnaHQoKSkKKyAgICAgICAgZnJh
bWVSZWN0LnNldEhlaWdodChzaXplKCkuaGVpZ2h0KCkgLSBtX3JlYWRlci0+ZnJhbWVZT2Zmc2V0
KCkpOwogCiAgICAgUkdCQTMyQnVmZmVyKiBjb25zdCBidWZmZXIgPSAmbV9mcmFtZUJ1ZmZlckNh
Y2hlW2ZyYW1lSW5kZXhdOwogICAgIGJ1ZmZlci0+c2V0UmVjdChmcmFtZVJlY3QpOwogICAgIAog
ICAgIGlmIChmcmFtZUluZGV4ID09IDApIHsKICAgICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3Qg
ZnJhbWUsIHNvIHdlJ3JlIG5vdCByZWx5aW5nIG9uIGFueSBwcmV2aW91cyBkYXRhLgotICAgICAg
ICBwcmVwRW1wdHlGcmFtZUJ1ZmZlcihidWZmZXIpOworICAgICAgICBpZiAoIXByZXBFbXB0eUZy
YW1lQnVmZmVyKGJ1ZmZlcikpIHsKKyAgICAgICAgICAgIGJ1ZmZlci0+c2V0U3RhdHVzKFJHQkEz
MkJ1ZmZlcjo6RnJhbWVDb21wbGV0ZSk7CisgICAgICAgICAgICBtX2ZhaWxlZCA9IHRydWU7Cisg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAg
ICAvLyBUaGUgc3RhcnRpbmcgc3RhdGUgZm9yIHRoaXMgZnJhbWUgZGVwZW5kcyBvbiB0aGUgcHJl
dmlvdXMgZnJhbWUncwogICAgICAgICAvLyBkaXNwb3NhbCBtZXRob2QuCkBAIC0yNzQsOCArMjgx
LDggQEAgdm9pZCBHSUZJbWFnZURlY29kZXI6OmluaXRGcmFtZUJ1ZmZlcih1bgogICAgICAgICBB
U1NFUlQocHJldkJ1ZmZlci0+c3RhdHVzKCkgPT0gUkdCQTMyQnVmZmVyOjpGcmFtZUNvbXBsZXRl
KTsKICAgICAgICAgUkdCQTMyQnVmZmVyOjpGcmFtZURpc3Bvc2FsTWV0aG9kIHByZXZNZXRob2Qg
PQogICAgICAgICAgICAgcHJldkJ1ZmZlci0+ZGlzcG9zYWxNZXRob2QoKTsKLSAgICAgICAgd2hp
bGUgKChmcmFtZUluZGV4ID4gMCkgJiYKLSAgICAgICAgICAgICAgICAocHJldk1ldGhvZCA9PSBS
R0JBMzJCdWZmZXI6OkRpc3Bvc2VPdmVyd3JpdGVQcmV2aW91cykpIHsKKyAgICAgICAgd2hpbGUg
KChmcmFtZUluZGV4ID4gMCkKKyAgICAgICAgICAgICAgICYmIChwcmV2TWV0aG9kID09IFJHQkEz
MkJ1ZmZlcjo6RGlzcG9zZU92ZXJ3cml0ZVByZXZpb3VzKSkgewogICAgICAgICAgICAgcHJldkJ1
ZmZlciA9ICZtX2ZyYW1lQnVmZmVyQ2FjaGVbLS1mcmFtZUluZGV4XTsKICAgICAgICAgICAgIHBy
ZXZNZXRob2QgPSBwcmV2QnVmZmVyLT5kaXNwb3NhbE1ldGhvZCgpOwogICAgICAgICB9CkBAIC0y
ODMsMjkgKzI5MCwzMiBAQCB2b2lkIEdJRkltYWdlRGVjb2Rlcjo6aW5pdEZyYW1lQnVmZmVyKHVu
CiAgICAgICAgIGlmICgocHJldk1ldGhvZCA9PSBSR0JBMzJCdWZmZXI6OkRpc3Bvc2VOb3RTcGVj
aWZpZWQpIHx8CiAgICAgICAgICAgICAgICAgKHByZXZNZXRob2QgPT0gUkdCQTMyQnVmZmVyOjpE
aXNwb3NlS2VlcCkpIHsKICAgICAgICAgICAgIC8vIFByZXNlcnZlIHRoZSBsYXN0IGZyYW1lIGFz
IHRoZSBzdGFydGluZyBzdGF0ZSBmb3IgdGhpcyBmcmFtZS4KLSAgICAgICAgICAgIGJ1ZmZlci0+
Ynl0ZXMoKSA9IHByZXZCdWZmZXItPmJ5dGVzKCk7CisgICAgICAgICAgICBidWZmZXItPmNvcHlC
aXRtYXBEYXRhKCpwcmV2QnVmZmVyKTsKKyAgICAgICAgICAgIC8vIFRoaXMgbmV4dCBsaW5lIGlz
bid0IGN1cnJlbnRseSBuZWNlc3Nhcnkgc2luY2UgdGhlIGFscGhhIHN0YXRlIGlzCisgICAgICAg
ICAgICAvLyBjdXJyZW50bHkgY2FycmllZCBhbG9uZyBpbiB0aGUgU2tpYSBiaXRtYXAgZGF0YSwg
YnV0IGl0J3Mgc2FmZSwKKyAgICAgICAgICAgIC8vIGZ1dHVyZS1wcm9vZiwgYW5kIHBhcmFsbGVs
IHRvIHRoZSBDYWlybyBjb2RlLgogICAgICAgICAgICAgYnVmZmVyLT5zZXRIYXNBbHBoYShwcmV2
QnVmZmVyLT5oYXNBbHBoYSgpKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIFdl
IHdhbnQgdG8gY2xlYXIgdGhlIHByZXZpb3VzIGZyYW1lIHRvIHRyYW5zcGFyZW50LCB3aXRob3V0
CiAgICAgICAgICAgICAvLyBhZmZlY3RpbmcgcGl4ZWxzIGluIHRoZSBpbWFnZSBvdXRzaWRlIG9m
IHRoZSBmcmFtZS4KICAgICAgICAgICAgIGNvbnN0IEludFJlY3QmIHByZXZSZWN0ID0gcHJldkJ1
ZmZlci0+cmVjdCgpOwotICAgICAgICAgICAgaWYgKChmcmFtZUluZGV4ID09IDApIHx8Ci0gICAg
ICAgICAgICAgICAgICAgIHByZXZSZWN0LmNvbnRhaW5zKEludFJlY3QoSW50UG9pbnQoMCwgMCks
IG1fc2l6ZSkpKSB7CisgICAgICAgICAgICBpZiAoKGZyYW1lSW5kZXggPT0gMCkKKyAgICAgICAg
ICAgICAgICB8fCBwcmV2UmVjdC5jb250YWlucyhJbnRSZWN0KEludFBvaW50KDAsIDApLCBzaXpl
KCkpKSkgewogICAgICAgICAgICAgICAgIC8vIENsZWFyaW5nIHRoZSBmaXJzdCBmcmFtZSwgb3Ig
YSBmcmFtZSB0aGUgc2l6ZSBvZiB0aGUgd2hvbGUKICAgICAgICAgICAgICAgICAvLyBpbWFnZSwg
cmVzdWx0cyBpbiBhIGNvbXBsZXRlbHkgZW1wdHkgaW1hZ2UuCiAgICAgICAgICAgICAgICAgcHJl
cEVtcHR5RnJhbWVCdWZmZXIoYnVmZmVyKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAg
ICAgICAgIC8vIENvcHkgdGhlIHdob2xlIHByZXZpb3VzIGJ1ZmZlciwgdGhlbiBjbGVhciBqdXN0
IGl0cyBmcmFtZS4KLSAgICAgICAgICAgICAgYnVmZmVyLT5ieXRlcygpID0gcHJldkJ1ZmZlci0+
Ynl0ZXMoKTsKKyAgICAgICAgICAgICAgYnVmZmVyLT5jb3B5Qml0bWFwRGF0YSgqcHJldkJ1ZmZl
cik7CisgICAgICAgICAgICAgIC8vIFVubmVjZXNzYXJ5IChidXQgc2FmZSk7IHNlZSBjb21tZW50
cyBvbiB0aGUgc2ltaWxhciBjYWxsIGFib3ZlLgogICAgICAgICAgICAgICBidWZmZXItPnNldEhh
c0FscGhhKHByZXZCdWZmZXItPmhhc0FscGhhKCkpOworICAgICAgICAgICAgICBTa0JpdG1hcCYg
Yml0bWFwID0gYnVmZmVyLT5iaXRtYXAoKTsKICAgICAgICAgICAgICAgZm9yIChpbnQgeSA9IHBy
ZXZSZWN0LnkoKTsgeSA8IHByZXZSZWN0LmJvdHRvbSgpOyArK3kpIHsKLSAgICAgICAgICAgICAg
ICAgIHVuc2lnbmVkKiBjb25zdCBjdXJyZW50Um93ID0KLSAgICAgICAgICAgICAgICAgICAgICBi
dWZmZXItPmJ5dGVzKCkuZGF0YSgpICsgKHkgKiBtX3NpemUud2lkdGgoKSk7CiAgICAgICAgICAg
ICAgICAgICBmb3IgKGludCB4ID0gcHJldlJlY3QueCgpOyB4IDwgcHJldlJlY3QucmlnaHQoKTsg
Kyt4KQotICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+c2V0UkdCQSgqKGN1cnJlbnRSb3cg
KyB4KSwgMCwgMCwgMCwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5zZXRSR0JB
KGJpdG1hcC5nZXRBZGRyMzIoeCwgeSksIDAsIDAsIDAsIDApOwogICAgICAgICAgICAgICB9CiAg
ICAgICAgICAgICAgIGlmICgocHJldlJlY3Qud2lkdGgoKSA+IDApICYmIChwcmV2UmVjdC5oZWln
aHQoKSA+IDApKQotICAgICAgICAgICAgICAgIGJ1ZmZlci0+c2V0SGFzQWxwaGEodHJ1ZSk7Cisg
ICAgICAgICAgICAgICAgICBidWZmZXItPnNldEhhc0FscGhhKHRydWUpOwogICAgICAgICAgICAg
fQogICAgICAgICB9CiAgICAgfQpAQCAtMzE1LDEzICszMjUsMTggQEAgdm9pZCBHSUZJbWFnZURl
Y29kZXI6OmluaXRGcmFtZUJ1ZmZlcih1bgogCiAgICAgLy8gUmVzZXQgdGhlIGFscGhhIHBpeGVs
IHRyYWNrZXIgZm9yIHRoaXMgZnJhbWUuCiAgICAgbV9jdXJyZW50QnVmZmVyU2F3QWxwaGEgPSBm
YWxzZTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotdm9pZCBHSUZJbWFnZURlY29kZXI6OnByZXBF
bXB0eUZyYW1lQnVmZmVyKFJHQkEzMkJ1ZmZlciogYnVmZmVyKSBjb25zdAorYm9vbCBHSUZJbWFn
ZURlY29kZXI6OnByZXBFbXB0eUZyYW1lQnVmZmVyKFJHQkEzMkJ1ZmZlciogYnVmZmVyKSBjb25z
dAogewotICAgIGJ1ZmZlci0+Ynl0ZXMoKS5yZXNpemUobV9zaXplLndpZHRoKCkgKiBtX3NpemUu
aGVpZ2h0KCkpOwotICAgIGJ1ZmZlci0+Ynl0ZXMoKS5maWxsKDApOworICAgIGlmICghYnVmZmVy
LT5zZXRTaXplKHNpemUoKS53aWR0aCgpLCBzaXplKCkuaGVpZ2h0KCkpKQorICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgLy8gVGhpcyBuZXh0IGxpbmUgaXNuJ3QgY3VycmVudGx5IG5lY2Vzc2Fy
eSBzaW5jZSBTa2lhJ3MgZXJhc2VBUkdCKCkgc2V0cworICAgIC8vIHRoaXMgZm9yIHVzLCBidXQg
d2UgZG8gaXQgZm9yIHNpbWlsYXIgcmVhc29ucyB0byB0aGUgc2V0SGFzQWxwaGEoKSBjYWxscwor
ICAgIC8vIGluIGluaXRGcmFtZUJ1ZmZlcigpIGFib3ZlLgogICAgIGJ1ZmZlci0+c2V0SGFzQWxw
aGEodHJ1ZSk7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIHZvaWQgR0lGSW1hZ2VEZWNvZGVyOjpo
YXZlRGVjb2RlZFJvdyh1bnNpZ25lZCBmcmFtZUluZGV4LApAQCAtMzMzLDEyICszNDgsMTIgQEAg
dm9pZCBHSUZJbWFnZURlY29kZXI6OmhhdmVEZWNvZGVkUm93KHVucwogewogICAgIC8vIEluaXRp
YWxpemUgdGhlIGZyYW1lIGlmIG5lY2Vzc2FyeS4KICAgICBSR0JBMzJCdWZmZXImIGJ1ZmZlciA9
IG1fZnJhbWVCdWZmZXJDYWNoZVtmcmFtZUluZGV4XTsKLSAgICBpZiAoYnVmZmVyLnN0YXR1cygp
ID09IFJHQkEzMkJ1ZmZlcjo6RnJhbWVFbXB0eSkKLSAgICAgICAgaW5pdEZyYW1lQnVmZmVyKGZy
YW1lSW5kZXgpOworICAgIGlmICgoYnVmZmVyLnN0YXR1cygpID09IFJHQkEzMkJ1ZmZlcjo6RnJh
bWVFbXB0eSkgJiYgIWluaXRGcmFtZUJ1ZmZlcihmcmFtZUluZGV4KSkKKyAgICAgICAgcmV0dXJu
OwogCiAgICAgLy8gRG8gbm90aGluZyBmb3IgYm9ndXMgZGF0YS4KLSAgICBpZiAocm93QnVmZmVy
ID09IDAgfHwgc3RhdGljX2Nhc3Q8aW50PihtX3JlYWRlci0+ZnJhbWVZT2Zmc2V0KCkgKyByb3dO
dW1iZXIpID49IG1fc2l6ZS5oZWlnaHQoKSkKLSAgICAgIHJldHVybjsKKyAgICBpZiAocm93QnVm
ZmVyID09IDAgfHwgc3RhdGljX2Nhc3Q8aW50PihtX3JlYWRlci0+ZnJhbWVZT2Zmc2V0KCkgKyBy
b3dOdW1iZXIpID49IHNpemUoKS5oZWlnaHQoKSkKKyAgICAgICAgcmV0dXJuOwogCiAgICAgdW5z
aWduZWQgY29sb3JNYXBTaXplOwogICAgIHVuc2lnbmVkIGNoYXIqIGNvbG9yTWFwOwpAQCAtMzUz
LDE5ICszNjgsMTkgQEAgdm9pZCBHSUZJbWFnZURlY29kZXI6OmhhdmVEZWNvZGVkUm93KHVucwog
ICAgIC8vIHdpdGhpbiB0aGUgb3ZlcmFsbCBpbWFnZS4gIFRoZSByb3dzIHdlIGFyZSBkZWNvZGlu
ZyBhcmUgd2l0aGluIHRoaXMKICAgICAvLyBzdWItcmVjdGFuZ2xlLiAgVGhpcyBtZWFucyB0aGF0
IGlmIHRoZSBHSUYgZnJhbWUncyBzdWItcmVjdGFuZ2xlIGlzICh4LHksdyxoKSB0aGVuIHJvdyAw
IGlzIHJlYWxseSByb3cKICAgICAvLyB5LCBhbmQgZWFjaCByb3cgZ29lcyBmcm9tIHggdG8geCt3
LgotICAgIHVuc2lnbmVkIGRzdFBvcyA9IChtX3JlYWRlci0+ZnJhbWVZT2Zmc2V0KCkgKyByb3dO
dW1iZXIpICogbV9zaXplLndpZHRoKCkgKyBtX3JlYWRlci0+ZnJhbWVYT2Zmc2V0KCk7Ci0gICAg
dW5zaWduZWQqIGRzdCA9IGJ1ZmZlci5ieXRlcygpLmRhdGEoKSArIGRzdFBvczsKLSAgICB1bnNp
Z25lZCogZHN0RW5kID0gZHN0ICsgbV9zaXplLndpZHRoKCkgLSBtX3JlYWRlci0+ZnJhbWVYT2Zm
c2V0KCk7CisgICAgdW5zaWduZWQgZHN0UG9zID0gKG1fcmVhZGVyLT5mcmFtZVlPZmZzZXQoKSAr
IHJvd051bWJlcikgKiBzaXplKCkud2lkdGgoKSArIG1fcmVhZGVyLT5mcmFtZVhPZmZzZXQoKTsK
KyAgICB1bnNpZ25lZCogZHN0ID0gYnVmZmVyLmJpdG1hcCgpLmdldEFkZHIzMigwLCAwKSArIGRz
dFBvczsKKyAgICB1bnNpZ25lZCogZHN0RW5kID0gZHN0ICsgc2l6ZSgpLndpZHRoKCkgLSBtX3Jl
YWRlci0+ZnJhbWVYT2Zmc2V0KCk7CiAgICAgdW5zaWduZWQqIGN1cnJEc3QgPSBkc3Q7CiAgICAg
dW5zaWduZWQgY2hhciogY3VycmVudFJvd0J5dGUgPSByb3dCdWZmZXI7Ci0gICAgCisKICAgICB3
aGlsZSAoY3VycmVudFJvd0J5dGUgIT0gcm93RW5kICYmIGN1cnJEc3QgPCBkc3RFbmQpIHsKICAg
ICAgICAgaWYgKCghbV9yZWFkZXItPmlzVHJhbnNwYXJlbnQoKSB8fCAqY3VycmVudFJvd0J5dGUg
IT0gbV9yZWFkZXItPnRyYW5zcGFyZW50UGl4ZWwoKSkgJiYgKmN1cnJlbnRSb3dCeXRlIDwgY29s
b3JNYXBTaXplKSB7CiAgICAgICAgICAgICB1bnNpZ25lZCBjb2xvckluZGV4ID0gKmN1cnJlbnRS
b3dCeXRlICogMzsKICAgICAgICAgICAgIHVuc2lnbmVkIHJlZCA9IGNvbG9yTWFwW2NvbG9ySW5k
ZXhdOwogICAgICAgICAgICAgdW5zaWduZWQgZ3JlZW4gPSBjb2xvck1hcFtjb2xvckluZGV4ICsg
MV07CiAgICAgICAgICAgICB1bnNpZ25lZCBibHVlID0gY29sb3JNYXBbY29sb3JJbmRleCArIDJd
OwotICAgICAgICAgICAgUkdCQTMyQnVmZmVyOjpzZXRSR0JBKCpjdXJyRHN0LCByZWQsIGdyZWVu
LCBibHVlLCAyNTUpOworICAgICAgICAgICAgUkdCQTMyQnVmZmVyOjpzZXRSR0JBKGN1cnJEc3Qs
IHJlZCwgZ3JlZW4sIGJsdWUsIDI1NSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBt
X2N1cnJlbnRCdWZmZXJTYXdBbHBoYSA9IHRydWU7CiAgICAgICAgICAgICAvLyBXZSBtYXkgb3Ig
bWF5IG5vdCBuZWVkIHRvIHdyaXRlIHRyYW5zcGFyZW50IHBpeGVscyB0byB0aGUgYnVmZmVyLgpA
QCAtMzc2LDcgKzM5MSw3IEBAIHZvaWQgR0lGSW1hZ2VEZWNvZGVyOjpoYXZlRGVjb2RlZFJvdyh1
bnMKICAgICAgICAgICAgIC8vIGJleW9uZCB0aGUgZmlyc3QsIG9yIHRoZSBpbml0aWFsIHBhc3Nl
cyB3aWxsICJzaG93IHRocm91Z2giIHRoZQogICAgICAgICAgICAgLy8gbGF0ZXIgb25lcy4KICAg
ICAgICAgICAgIGlmICh3cml0ZVRyYW5zcGFyZW50UGl4ZWxzKQotICAgICAgICAgICAgICAgIFJH
QkEzMkJ1ZmZlcjo6c2V0UkdCQSgqY3VyckRzdCwgMCwgMCwgMCwgMCk7CisgICAgICAgICAgICAg
ICAgUkdCQTMyQnVmZmVyOjpzZXRSR0JBKGN1cnJEc3QsIDAsIDAsIDAsIDApOwogICAgICAgICB9
CiAgICAgICAgIGN1cnJEc3QrKzsKICAgICAgICAgY3VycmVudFJvd0J5dGUrKzsKQEAgLTM4NSwy
MSArNDAwLDE3IEBAIHZvaWQgR0lGSW1hZ2VEZWNvZGVyOjpoYXZlRGVjb2RlZFJvdyh1bnMKICAg
ICBpZiAocmVwZWF0Q291bnQgPiAxKSB7CiAgICAgICAgIC8vIENvcHkgdGhlIHJvdyB8cmVwZWF0
Q291bnR8LTEgdGltZXMuCiAgICAgICAgIHVuc2lnbmVkIG51bSA9IGN1cnJEc3QgLSBkc3Q7Ci0g
ICAgICAgIHVuc2lnbmVkIHNpemUgPSBudW0gKiBzaXplb2YodW5zaWduZWQpOwotICAgICAgICB1
bnNpZ25lZCB3aWR0aCA9IG1fc2l6ZS53aWR0aCgpOwotICAgICAgICB1bnNpZ25lZCogZW5kID0g
YnVmZmVyLmJ5dGVzKCkuZGF0YSgpICsgd2lkdGggKiBtX3NpemUuaGVpZ2h0KCk7CisgICAgICAg
IHVuc2lnbmVkIGRhdGFfc2l6ZSA9IG51bSAqIHNpemVvZih1bnNpZ25lZCk7CisgICAgICAgIHVu
c2lnbmVkIHdpZHRoID0gc2l6ZSgpLndpZHRoKCk7CisgICAgICAgIHVuc2lnbmVkKiBlbmQgPSBi
dWZmZXIuYml0bWFwKCkuZ2V0QWRkcjMyKDAsIDApICsgd2lkdGggKiBzaXplKCkuaGVpZ2h0KCk7
CiAgICAgICAgIGN1cnJEc3QgPSBkc3QgKyB3aWR0aDsKICAgICAgICAgZm9yICh1bnNpZ25lZCBp
ID0gMTsgaSA8IHJlcGVhdENvdW50OyBpKyspIHsKICAgICAgICAgICAgIGlmIChjdXJyRHN0ICsg
bnVtID4gZW5kKSAvLyBQcm90ZWN0IGFnYWluc3QgYSBidWZmZXIgb3ZlcnJ1biBmcm9tIGEgYm9n
dXMgcmVwZWF0Q291bnQuCiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBtZW1j
cHkoY3VyckRzdCwgZHN0LCBzaXplKTsKKyAgICAgICAgICAgIG1lbWNweShjdXJyRHN0LCBkc3Qs
IGRhdGFfc2l6ZSk7CiAgICAgICAgICAgICBjdXJyRHN0ICs9IHdpZHRoOwogICAgICAgICB9CiAg
ICAgfQotCi0gICAgLy8gT3VyIHBhcnRpYWwgaGVpZ2h0IGlzIHJvd051bWJlciArIDEsIGUuZy4s
IHJvdyAyIGlzIHRoZSAzcmQgcm93LCBzbyB0aGF0J3MgYSBoZWlnaHQgb2YgMy4KLSAgICAvLyBB
ZGRpbmcgaW4gcmVwZWF0Q291bnQgLSAxIHRvIHJvd051bWJlciArIDEgd29ya3Mgb3V0IHRvIGp1
c3QgYmUgcm93TnVtYmVyICsgcmVwZWF0Q291bnQuCi0gICAgYnVmZmVyLmVuc3VyZUhlaWdodChy
b3dOdW1iZXIgKyByZXBlYXRDb3VudCk7CiB9CiAKIHZvaWQgR0lGSW1hZ2VEZWNvZGVyOjpmcmFt
ZUNvbXBsZXRlKHVuc2lnbmVkIGZyYW1lSW5kZXgsIHVuc2lnbmVkIGZyYW1lRHVyYXRpb24sIFJH
QkEzMkJ1ZmZlcjo6RnJhbWVEaXNwb3NhbE1ldGhvZCBkaXNwb3NhbE1ldGhvZCkKQEAgLTQwNywx
MCArNDE4LDkgQEAgdm9pZCBHSUZJbWFnZURlY29kZXI6OmZyYW1lQ29tcGxldGUodW5zaQogICAg
IC8vIEluaXRpYWxpemUgdGhlIGZyYW1lIGlmIG5lY2Vzc2FyeS4gIFNvbWUgR0lGcyBpbnNlcnQg
ZG8tbm90aGluZyBmcmFtZXMsCiAgICAgLy8gaW4gd2hpY2ggY2FzZSB3ZSBuZXZlciByZWFjaCBo
YXZlRGVjb2RlZFJvdygpIGJlZm9yZSBnZXR0aW5nIGhlcmUuCiAgICAgUkdCQTMyQnVmZmVyJiBi
dWZmZXIgPSBtX2ZyYW1lQnVmZmVyQ2FjaGVbZnJhbWVJbmRleF07Ci0gICAgaWYgKGJ1ZmZlci5z
dGF0dXMoKSA9PSBSR0JBMzJCdWZmZXI6OkZyYW1lRW1wdHkpCi0gICAgICAgIGluaXRGcmFtZUJ1
ZmZlcihmcmFtZUluZGV4KTsKKyAgICBpZiAoKGJ1ZmZlci5zdGF0dXMoKSA9PSBSR0JBMzJCdWZm
ZXI6OkZyYW1lRW1wdHkpICYmICFpbml0RnJhbWVCdWZmZXIoZnJhbWVJbmRleCkpCisgICAgICAg
IHJldHVybjsKIAotICAgIGJ1ZmZlci5lbnN1cmVIZWlnaHQobV9zaXplLmhlaWdodCgpKTsKICAg
ICBidWZmZXIuc2V0U3RhdHVzKFJHQkEzMkJ1ZmZlcjo6RnJhbWVDb21wbGV0ZSk7CiAgICAgYnVm
ZmVyLnNldER1cmF0aW9uKGZyYW1lRHVyYXRpb24pOwogICAgIGJ1ZmZlci5zZXREaXNwb3NhbE1l
dGhvZChkaXNwb3NhbE1ldGhvZCk7CkBAIC00MTgsOSArNDI4LDkgQEAgdm9pZCBHSUZJbWFnZURl
Y29kZXI6OmZyYW1lQ29tcGxldGUodW5zaQogICAgIGlmICghbV9jdXJyZW50QnVmZmVyU2F3QWxw
aGEpIHsKICAgICAgICAgLy8gVGhlIHdob2xlIGZyYW1lIHdhcyBub24tdHJhbnNwYXJlbnQsIHNv
IGl0J3MgcG9zc2libGUgdGhhdCB0aGUgZW50aXJlCiAgICAgICAgIC8vIHJlc3VsdGluZyBidWZm
ZXIgd2FzIG5vbi10cmFuc3BhcmVudCwgYW5kIHdlIGNhbiBzZXRIYXNBbHBoYShmYWxzZSkuCi0g
ICAgICAgIGlmIChidWZmZXIucmVjdCgpLmNvbnRhaW5zKEludFJlY3QoSW50UG9pbnQoMCwgMCks
IG1fc2l6ZSkpKSB7CisgICAgICAgIGlmIChidWZmZXIucmVjdCgpLmNvbnRhaW5zKEludFJlY3Qo
SW50UG9pbnQoMCwgMCksIHNpemUoKSkpKQogICAgICAgICAgICAgYnVmZmVyLnNldEhhc0FscGhh
KGZhbHNlKTsKLSAgICAgICAgfSBlbHNlIGlmIChmcmFtZUluZGV4ID4gMCkgeworICAgICAgICBl
bHNlIGlmIChmcmFtZUluZGV4ID4gMCkgewogICAgICAgICAgICAgLy8gVHJpY2t5IGNhc2UuICBU
aGlzIGZyYW1lIGRvZXMgbm90IGhhdmUgYWxwaGEgb25seSBpZiBldmVyeXdoZXJlCiAgICAgICAg
ICAgICAvLyBvdXRzaWRlIGl0cyByZWN0IGRvZXNuJ3QgaGF2ZSBhbHBoYS4gIFRvIGtub3cgd2hl
dGhlciB0aGlzIGlzCiAgICAgICAgICAgICAvLyB0cnVlLCB3ZSBjaGVjayB0aGUgc3RhcnQgc3Rh
dGUgb2YgdGhlIGZyYW1lIC0tIGlmIGl0IGRvZXNuJ3QgaGF2ZQpAQCAtNDMwLDkgKzQ0MCw4IEBA
IHZvaWQgR0lGSW1hZ2VEZWNvZGVyOjpmcmFtZUNvbXBsZXRlKHVuc2kKICAgICAgICAgICAgIC8v
IGRvbid0IGFmZmVjdCB0aGUgc3RhcnQgc3RhdGUgb2YgdGhpcyBmcmFtZSkgdGhlIHNhbWUgd2F5
IHdlIGRvIGluCiAgICAgICAgICAgICAvLyBpbml0RnJhbWVCdWZmZXIoKS4KICAgICAgICAgICAg
IGNvbnN0IFJHQkEzMkJ1ZmZlciogcHJldkJ1ZmZlciA9ICZtX2ZyYW1lQnVmZmVyQ2FjaGVbLS1m
cmFtZUluZGV4XTsKLSAgICAgICAgICAgIHdoaWxlICgoZnJhbWVJbmRleCA+IDApICYmCi0gICAg
ICAgICAgICAgICAgICAgIChwcmV2QnVmZmVyLT5kaXNwb3NhbE1ldGhvZCgpID09Ci0gICAgICAg
ICAgICAgICAgICAgICAgICBSR0JBMzJCdWZmZXI6OkRpc3Bvc2VPdmVyd3JpdGVQcmV2aW91cykp
CisgICAgICAgICAgICB3aGlsZSAoKGZyYW1lSW5kZXggPiAwKQorICAgICAgICAgICAgICAgICAg
ICYmIChwcmV2QnVmZmVyLT5kaXNwb3NhbE1ldGhvZCgpID09IFJHQkEzMkJ1ZmZlcjo6RGlzcG9z
ZU92ZXJ3cml0ZVByZXZpb3VzKSkKICAgICAgICAgICAgICAgICBwcmV2QnVmZmVyID0gJm1fZnJh
bWVCdWZmZXJDYWNoZVstLWZyYW1lSW5kZXhdOwogCiAgICAgICAgICAgICAvLyBOb3csIGlmIHdl
J3JlIGF0IGEgRGlzcG9zZU5vdFNwZWNpZmllZCBvciBEaXNwb3NlS2VlcCBmcmFtZSwgdGhlbgpA
QCAtNDQzLDEwICs0NTIsOCBAQCB2b2lkIEdJRkltYWdlRGVjb2Rlcjo6ZnJhbWVDb21wbGV0ZSh1
bnNpCiAgICAgICAgICAgICAvLyBUaGUgb25seSByZW1haW5pbmcgY2FzZSBpcyBhIERpc3Bvc2VP
dmVyd3JpdGVCZ2NvbG9yIGZyYW1lLiAgSWYKICAgICAgICAgICAgIC8vIGl0IGhhZCBubyBhbHBo
YSwgYW5kIGl0cyByZWN0IGlzIGNvbnRhaW5lZCBpbiB0aGUgY3VycmVudCBmcmFtZSdzCiAgICAg
ICAgICAgICAvLyByZWN0LCB3ZSBrbm93IHRoZSBjdXJyZW50IGZyYW1lIGhhcyBubyBhbHBoYS4K
LSAgICAgICAgICAgIGlmICgocHJldkJ1ZmZlci0+ZGlzcG9zYWxNZXRob2QoKSA9PQotICAgICAg
ICAgICAgICAgICAgICBSR0JBMzJCdWZmZXI6OkRpc3Bvc2VPdmVyd3JpdGVCZ2NvbG9yKSAmJgot
ICAgICAgICAgICAgICAgICAgICAhcHJldkJ1ZmZlci0+aGFzQWxwaGEoKSAmJgotICAgICAgICAg
ICAgICAgICAgICBidWZmZXIucmVjdCgpLmNvbnRhaW5zKHByZXZCdWZmZXItPnJlY3QoKSkpCisg
ICAgICAgICAgICBpZiAoKHByZXZCdWZmZXItPmRpc3Bvc2FsTWV0aG9kKCkgPT0gUkdCQTMyQnVm
ZmVyOjpEaXNwb3NlT3ZlcndyaXRlQmdjb2xvcikKKyAgICAgICAgICAgICAgICAmJiAhcHJldkJ1
ZmZlci0+aGFzQWxwaGEoKSAmJiBidWZmZXIucmVjdCgpLmNvbnRhaW5zKHByZXZCdWZmZXItPnJl
Y3QoKSkpCiAgICAgICAgICAgICAgICAgYnVmZmVyLnNldEhhc0FscGhhKGZhbHNlKTsKICAgICAg
ICAgfQogICAgIH0KQEAgLTQ2MCw2ICs0NjcsNCBAQCB2b2lkIEdJRkltYWdlRGVjb2Rlcjo6Z2lm
Q29tcGxldGUoKQogICAgIG1fcmVhZGVyID0gMDsKIH0KIAotfQotCi0jZW5kaWYgLy8gUExBVEZP
Uk0oQ0FJUk8pCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBwbGF0Zm9ybS9pbWFnZS1k
ZWNvZGVycy9za2lhL0dJRkltYWdlRGVjb2Rlci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHBsYXRmb3JtL2lt
YWdlLWRlY29kZXJzL3NraWEvR0lGSW1hZ2VEZWNvZGVyLmgJKHJldmlzaW9uIDQwMTY1KQorKysg
cGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvc2tpYS9HSUZJbWFnZURlY29kZXIuaAkod29ya2luZyBj
b3B5KQpAQCAtMSw1ICsxLDYgQEAKIC8qCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDYgQXBwbGUgQ29t
cHV0ZXIsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgs
IDIwMDkgR29vZ2xlLCBJbmMuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTIz
LDcwICsyNCw3MCBAQAogICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCiAgKi8KIAotI2lmbmRlZiBHSUZfREVDT0RF
Ul9IXwotI2RlZmluZSBHSUZfREVDT0RFUl9IXworI2lmbmRlZiBHSUZJbWFnZURlY29kZXJfaAor
I2RlZmluZSBHSUZJbWFnZURlY29kZXJfaAogCiAjaW5jbHVkZSAiSW1hZ2VEZWNvZGVyLmgiCiAK
IG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotY2xhc3MgR0lGSW1hZ2VEZWNvZGVyUHJpdmF0ZTsKKyAg
ICBjbGFzcyBHSUZJbWFnZURlY29kZXJQcml2YXRlOwogCi0vLyBUaGlzIGNsYXNzIGRlY29kZXMg
dGhlIEdJRiBpbWFnZSBmb3JtYXQuCi1jbGFzcyBHSUZJbWFnZURlY29kZXIgOiBwdWJsaWMgSW1h
Z2VEZWNvZGVyCi17Ci1wdWJsaWM6Ci0gICAgR0lGSW1hZ2VEZWNvZGVyKCk7Ci0gICAgfkdJRklt
YWdlRGVjb2RlcigpOworICAgIC8vIFRoaXMgY2xhc3MgZGVjb2RlcyB0aGUgR0lGIGltYWdlIGZv
cm1hdC4KKyAgICBjbGFzcyBHSUZJbWFnZURlY29kZXIgOiBwdWJsaWMgSW1hZ2VEZWNvZGVyIHsK
KyAgICBwdWJsaWM6CisgICAgICAgIEdJRkltYWdlRGVjb2RlcigpOworICAgICAgICB+R0lGSW1h
Z2VEZWNvZGVyKCk7CiAKLSAgICB2aXJ0dWFsIFN0cmluZyBmaWxlbmFtZUV4dGVuc2lvbigpIGNv
bnN0IHsgcmV0dXJuICJnaWYiOyB9CisgICAgICAgIHZpcnR1YWwgU3RyaW5nIGZpbGVuYW1lRXh0
ZW5zaW9uKCkgY29uc3QgeyByZXR1cm4gImdpZiI7IH0KIAotICAgIC8vIFRha2UgdGhlIGRhdGEg
YW5kIHN0b3JlIGl0LgotICAgIHZpcnR1YWwgdm9pZCBzZXREYXRhKFNoYXJlZEJ1ZmZlciogZGF0
YSwgYm9vbCBhbGxEYXRhUmVjZWl2ZWQpOworICAgICAgICAvLyBUYWtlIHRoZSBkYXRhIGFuZCBz
dG9yZSBpdC4KKyAgICAgICAgdmlydHVhbCB2b2lkIHNldERhdGEoU2hhcmVkQnVmZmVyKiBkYXRh
LCBib29sIGFsbERhdGFSZWNlaXZlZCk7CiAKLSAgICAvLyBXaGV0aGVyIG9yIG5vdCB0aGUgc2l6
ZSBpbmZvcm1hdGlvbiBoYXMgYmVlbiBkZWNvZGVkIHlldC4KLSAgICB2aXJ0dWFsIGJvb2wgaXNT
aXplQXZhaWxhYmxlKCkgY29uc3Q7CisgICAgICAgIC8vIFdoZXRoZXIgb3Igbm90IHRoZSBzaXpl
IGluZm9ybWF0aW9uIGhhcyBiZWVuIGRlY29kZWQgeWV0LgorICAgICAgICB2aXJ0dWFsIGJvb2wg
aXNTaXplQXZhaWxhYmxlKCkgY29uc3Q7CiAKLSAgICAvLyBUaGUgdG90YWwgbnVtYmVyIG9mIGZy
YW1lcyBmb3IgdGhlIGltYWdlLiAgV2lsbCBzY2FuIHRoZSBpbWFnZSBkYXRhIGZvciB0aGUgYW5z
d2VyCi0gICAgLy8gKHdpdGhvdXQgbmVjZXNzYXJpbHkgZGVjb2RpbmcgYWxsIG9mIHRoZSBpbmRp
dmlkdWFsIGZyYW1lcykuCi0gICAgdmlydHVhbCBpbnQgZnJhbWVDb3VudCgpOworICAgICAgICAv
LyBUaGUgdG90YWwgbnVtYmVyIG9mIGZyYW1lcyBmb3IgdGhlIGltYWdlLiAgV2lsbCBzY2FuIHRo
ZSBpbWFnZSBkYXRhIGZvciB0aGUgYW5zd2VyCisgICAgICAgIC8vICh3aXRob3V0IG5lY2Vzc2Fy
aWx5IGRlY29kaW5nIGFsbCBvZiB0aGUgaW5kaXZpZHVhbCBmcmFtZXMpLgorICAgICAgICB2aXJ0
dWFsIGludCBmcmFtZUNvdW50KCk7CiAKLSAgICAvLyBUaGUgbnVtYmVyIG9mIHJlcGV0aXRpb25z
IHRvIHBlcmZvcm0gZm9yIGFuIGFuaW1hdGlvbiBsb29wLgotICAgIHZpcnR1YWwgaW50IHJlcGV0
aXRpb25Db3VudCgpIGNvbnN0OworICAgICAgICAvLyBUaGUgbnVtYmVyIG9mIHJlcGV0aXRpb25z
IHRvIHBlcmZvcm0gZm9yIGFuIGFuaW1hdGlvbiBsb29wLgorICAgICAgICB2aXJ0dWFsIGludCBy
ZXBldGl0aW9uQ291bnQoKSBjb25zdDsKIAotICAgIHZpcnR1YWwgUkdCQTMyQnVmZmVyKiBmcmFt
ZUJ1ZmZlckF0SW5kZXgoc2l6ZV90IGluZGV4KTsKKyAgICAgICAgdmlydHVhbCBSR0JBMzJCdWZm
ZXIqIGZyYW1lQnVmZmVyQXRJbmRleChzaXplX3QgaW5kZXgpOwogCi0gICAgdmlydHVhbCB2b2lk
IGNsZWFyRnJhbWVCdWZmZXJDYWNoZShzaXplX3QgY2xlYXJCZWZvcmVGcmFtZSk7CisgICAgICAg
IHZpcnR1YWwgdm9pZCBjbGVhckZyYW1lQnVmZmVyQ2FjaGUoc2l6ZV90IGNsZWFyQmVmb3JlRnJh
bWUpOwogCi0gICAgdmlydHVhbCB1bnNpZ25lZCBmcmFtZUR1cmF0aW9uQXRJbmRleChzaXplX3Qg
aW5kZXgpIHsgcmV0dXJuIDA7IH0KKyAgICAgICAgdmlydHVhbCB1bnNpZ25lZCBmcmFtZUR1cmF0
aW9uQXRJbmRleChzaXplX3QgaW5kZXgpIHsgcmV0dXJuIDA7IH0KIAotICAgIGVudW0gR0lGUXVl
cnkgeyBHSUZGdWxsUXVlcnksIEdJRlNpemVRdWVyeSwgR0lGRnJhbWVDb3VudFF1ZXJ5IH07Cisg
ICAgICAgIGVudW0gR0lGUXVlcnkgeyBHSUZGdWxsUXVlcnksIEdJRlNpemVRdWVyeSwgR0lGRnJh
bWVDb3VudFF1ZXJ5IH07CiAKLSAgICB2b2lkIGRlY29kZShHSUZRdWVyeSBxdWVyeSwgdW5zaWdu
ZWQgaGFsdEF0RnJhbWUpIGNvbnN0OworICAgICAgICB2b2lkIGRlY29kZShHSUZRdWVyeSwgdW5z
aWduZWQgaGFsdEF0RnJhbWUpIGNvbnN0OwogCi0gICAgLy8gQ2FsbGJhY2tzIGZyb20gdGhlIEdJ
RiByZWFkZXIuCi0gICAgdm9pZCBzaXplTm93QXZhaWxhYmxlKHVuc2lnbmVkIHdpZHRoLCB1bnNp
Z25lZCBoZWlnaHQpOwotICAgIHZvaWQgZGVjb2RpbmdIYWx0ZWQodW5zaWduZWQgYnl0ZXNMZWZ0
KTsKLSAgICB2b2lkIGhhdmVEZWNvZGVkUm93KHVuc2lnbmVkIGZyYW1lSW5kZXgsIHVuc2lnbmVk
IGNoYXIqIHJvd0J1ZmZlciwgdW5zaWduZWQgY2hhciogcm93RW5kLCB1bnNpZ25lZCByb3dOdW1i
ZXIsIAotICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgcmVwZWF0Q291bnQsIGJvb2wg
d3JpdGVUcmFuc3BhcmVudFBpeGVscyk7Ci0gICAgdm9pZCBmcmFtZUNvbXBsZXRlKHVuc2lnbmVk
IGZyYW1lSW5kZXgsIHVuc2lnbmVkIGZyYW1lRHVyYXRpb24sIFJHQkEzMkJ1ZmZlcjo6RnJhbWVE
aXNwb3NhbE1ldGhvZCBkaXNwb3NhbE1ldGhvZCk7Ci0gICAgdm9pZCBnaWZDb21wbGV0ZSgpOwor
ICAgICAgICAvLyBDYWxsYmFja3MgZnJvbSB0aGUgR0lGIHJlYWRlci4KKyAgICAgICAgYm9vbCBz
aXplTm93QXZhaWxhYmxlKHVuc2lnbmVkIHdpZHRoLCB1bnNpZ25lZCBoZWlnaHQpOworICAgICAg
ICB2b2lkIGRlY29kaW5nSGFsdGVkKHVuc2lnbmVkIGJ5dGVzTGVmdCk7CisgICAgICAgIHZvaWQg
aGF2ZURlY29kZWRSb3codW5zaWduZWQgZnJhbWVJbmRleCwgdW5zaWduZWQgY2hhciogcm93QnVm
ZmVyLCB1bnNpZ25lZCBjaGFyKiByb3dFbmQsIHVuc2lnbmVkIHJvd051bWJlciwgCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgcmVwZWF0Q291bnQsIGJvb2wgd3JpdGVUcmFu
c3BhcmVudFBpeGVscyk7CisgICAgICAgIHZvaWQgZnJhbWVDb21wbGV0ZSh1bnNpZ25lZCBmcmFt
ZUluZGV4LCB1bnNpZ25lZCBmcmFtZUR1cmF0aW9uLCBSR0JBMzJCdWZmZXI6OkZyYW1lRGlzcG9z
YWxNZXRob2QgZGlzcG9zYWxNZXRob2QpOworICAgICAgICB2b2lkIGdpZkNvbXBsZXRlKCk7CiAK
LXByaXZhdGU6Ci0gICAgLy8gQ2FsbGVkIHRvIGluaXRpYWxpemUgdGhlIGZyYW1lIGJ1ZmZlciB3
aXRoIHRoZSBnaXZlbiBpbmRleCwgYmFzZWQgb24gdGhlCi0gICAgLy8gcHJldmlvdXMgZnJhbWUn
cyBkaXNwb3NhbCBtZXRob2QuCi0gICAgdm9pZCBpbml0RnJhbWVCdWZmZXIodW5zaWduZWQgZnJh
bWVJbmRleCk7CisgICAgcHJpdmF0ZToKKyAgICAgICAgLy8gQ2FsbGVkIHRvIGluaXRpYWxpemUg
dGhlIGZyYW1lIGJ1ZmZlciB3aXRoIHRoZSBnaXZlbiBpbmRleCwgYmFzZWQgb24gdGhlCisgICAg
ICAgIC8vIHByZXZpb3VzIGZyYW1lJ3MgZGlzcG9zYWwgbWV0aG9kLiBSZXR1cm5zIHRydWUgb24g
c3VjY2Vzcy4gT24gZmFpbHVyZSwKKyAgICAgICAgLy8gdGhpcyB3aWxsIG1hcmsgdGhlIGltYWdl
IGFzIGZhaWxlZC4KKyAgICAgICAgYm9vbCBpbml0RnJhbWVCdWZmZXIodW5zaWduZWQgZnJhbWVJ
bmRleCk7CiAKLSAgICAvLyBBIGhlbHBlciBmb3IgaW5pdEZyYW1lQnVmZmVyKCksIHRoaXMgc2V0
cyB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyLCBhbmQKLSAgICAvLyBmaWxscyBpdCB3aXRoIHRyYW5z
cGFyZW50IHBpeGVscy4KLSAgICB2b2lkIHByZXBFbXB0eUZyYW1lQnVmZmVyKFJHQkEzMkJ1ZmZl
ciogYnVmZmVyKSBjb25zdDsKKyAgICAgICAgLy8gQSBoZWxwZXIgZm9yIGluaXRGcmFtZUJ1ZmZl
cigpLCB0aGlzIHNldHMgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciwgYW5kCisgICAgICAgIC8vIGZp
bGxzIGl0IHdpdGggdHJhbnNwYXJlbnQgcGl4ZWxzLgorICAgICAgICBib29sIHByZXBFbXB0eUZy
YW1lQnVmZmVyKFJHQkEzMkJ1ZmZlciopIGNvbnN0OwogCi0gICAgYm9vbCBtX2ZyYW1lQ291bnRW
YWxpZDsKLSAgICBib29sIG1fY3VycmVudEJ1ZmZlclNhd0FscGhhOwotICAgIG11dGFibGUgaW50
IG1fcmVwZXRpdGlvbkNvdW50OwotICAgIG11dGFibGUgR0lGSW1hZ2VEZWNvZGVyUHJpdmF0ZSog
bV9yZWFkZXI7Ci19OworICAgICAgICBib29sIG1fZnJhbWVDb3VudFZhbGlkOworICAgICAgICBi
b29sIG1fY3VycmVudEJ1ZmZlclNhd0FscGhhOworICAgICAgICBtdXRhYmxlIGludCBtX3JlcGV0
aXRpb25Db3VudDsKKyAgICAgICAgbXV0YWJsZSBHSUZJbWFnZURlY29kZXJQcml2YXRlKiBtX3Jl
YWRlcjsKKyAgICB9OwogCi19Cit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCiAKICNlbmRpZgpJbmRl
eDogcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvc2tpYS9HSUZJbWFnZVJlYWRlci5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvc2tpYS9HSUZJbWFnZVJlYWRlci5jcHAJ
KHJldmlzaW9uIDQwMTY1KQorKysgcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvc2tpYS9HSUZJbWFn
ZVJlYWRlci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTIyLDYgKzIyLDcgQEAKICAqIENvbnRyaWJ1
dG9yKHMpOgogICogICBDaHJpcyBTYWFyaSA8c2FhcmlAbmV0c2NhcGUuY29tPgogICogICBBcHBs
ZSBDb21wdXRlcgorICogICBHb29nbGUsIEluYy4KICAqCiAgKiBBbHRlcm5hdGl2ZWx5LCB0aGUg
Y29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogICog
ZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIg
KHRoZSAiR1BMIiksIG9yCkBAIC03OCw4ICs3OSw2IEBAIG1haWxpbmcgYWRkcmVzcy4KICNpbmNs
dWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlICJHSUZJbWFnZURlY29kZXIuaCIKIAotI2lmIFBMQVRG
T1JNKENBSVJPKSB8fCBQTEFURk9STShRVCkgfHwgUExBVEZPUk0oV1gpCi0KIHVzaW5nIFdlYkNv
cmU6OkdJRkltYWdlRGVjb2RlcjsKIAogLy8gRGVmaW5lIHRoZSBNb3ppbGxhIG1hY3JvIHNldHVw
IHNvIHRoYXQgd2UgY2FuIGxlYXZlIHRoZSBtYWNyb3MgYWxvbmUuCkBAIC0zMTMsOSArMzEyLDEz
IEBAIGludCBHSUZJbWFnZVJlYWRlcjo6ZG9fbHp3KGNvbnN0IHVuc2lnbmUKIAogICAgICAgd2hp
bGUgKGNvZGUgPj0gY2xlYXJfY29kZSkKICAgICAgIHsKLSAgICAgICAgaWYgKGNvZGUgPT0gcHJl
Zml4W2NvZGVdKQorICAgICAgICBpZiAoY29kZSA+PSBNQVhfQklUUyB8fCBjb2RlID09IHByZWZp
eFtjb2RlXSkKICAgICAgICAgICByZXR1cm4gLTE7CiAKKyAgICAgICAgLy8gRXZlbiB0aG91Z2gg
c3VmZml4W10gb25seSBob2xkcyBjaGFyYWN0ZXJzIHRocm91Z2ggc3VmZml4W2F2YWlsIC0gMV0s
CisgICAgICAgIC8vIGFsbG93aW5nIGNvZGUgPj0gYXZhaWwgaGVyZSBsZXRzIHVzIGJlIG1vcmUg
dG9sZXJhbnQgb2YgbWFsZm9ybWVkCisgICAgICAgIC8vIGRhdGEuIEFzIGxvbmcgYXMgY29kZSA8
IE1BWF9CSVRTLCB0aGUgb25seSByaXNrIGlzIGEgZ2FyYmxlZCBpbWFnZSwKKyAgICAgICAgLy8g
d2hpY2ggaXMgbm8gd29yc2UgdGhhbiByZWZ1c2luZyB0byBkaXNwbGF5IGl0LgogICAgICAgICAq
c3RhY2twKysgPSBzdWZmaXhbY29kZV07CiAgICAgICAgIGNvZGUgPSBwcmVmaXhbY29kZV07CiAK
QEAgLTQ0Nyw3ICs0NTAsMTAgQEAgYm9vbCBHSUZJbWFnZVJlYWRlcjo6cmVhZChjb25zdCB1bnNp
Z25lZAogICAgIHsKICAgICAgIC8qIEluaXRpYWxpemUgTFpXIHBhcnNlci9kZWNvZGVyICovCiAg
ICAgICBpbnQgZGF0YXNpemUgPSAqcTsKLSAgICAgIGlmIChkYXRhc2l6ZSA+IE1BWF9MWldfQklU
UykgeworICAgICAgLy8gU2luY2Ugd2UgdXNlIGEgY29kZXNpemUgb2YgMSBtb3JlIHRoYW4gdGhl
IGRhdGFzaXplLCB3ZSBuZWVkIHRvIGVuc3VyZQorICAgICAgLy8gdGhhdCBvdXIgZGF0YXNpemUg
aXMgc3RyaWN0bHkgbGVzcyB0aGFuIHRoZSBNQVhfTFpXX0JJVFMgdmFsdWUgKDEyKS4KKyAgICAg
IC8vIFRoaXMgc2V0cyB0aGUgbGFyZ2VzdCBwb3NzaWJsZSBjb2RlbWFzayBjb3JyZWN0bHkgYXQg
NDA5NS4KKyAgICAgIGlmIChkYXRhc2l6ZSA+PSBNQVhfTFpXX0JJVFMpIHsKICAgICAgICAgc3Rh
dGUgPSBnaWZfZXJyb3I7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQpAQCAtNDcwLDYgKzQ3Niw4
IEBAIGJvb2wgR0lGSW1hZ2VSZWFkZXI6OnJlYWQoY29uc3QgdW5zaWduZWQKICAgICAgICAgLyog
aW5pdCB0aGUgdGFibGVzICovCiAgICAgICAgIGlmICghZnJhbWVfcmVhZGVyLT5zdWZmaXgpCiAg
ICAgICAgICAgZnJhbWVfcmVhZGVyLT5zdWZmaXggPSBuZXcgdW5zaWduZWQgY2hhcltNQVhfQklU
U107CisgICAgICAgIC8vIENsZWFyaW5nIHRoZSB3aG9sZSBzdWZmaXggdGFibGUgbGV0cyB1cyBi
ZSBtb3JlIHRvbGVyYW50IG9mIGJhZCBkYXRhLgorICAgICAgICBtZW1zZXQoZnJhbWVfcmVhZGVy
LT5zdWZmaXgsIDAsIE1BWF9CSVRTKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFt
ZV9yZWFkZXItPmNsZWFyX2NvZGU7IGkrKykKICAgICAgICAgICBmcmFtZV9yZWFkZXItPnN1ZmZp
eFtpXSA9IGk7CiAKQEAgLTUxMCw4ICs1MTgsMTAgQEAgYm9vbCBHSUZJbWFnZVJlYWRlcjo6cmVh
ZChjb25zdCB1bnNpZ25lZAogICAgICAgc2NyZWVuX2hlaWdodCA9IEdFVElOVDE2KHEgKyAyKTsK
IAogICAgICAgLy8gQ0FMTEJBQ0s6IEluZm9ybSB0aGUgZGVjb2RlcnBsdWdpbiBvZiBvdXIgc2l6
ZS4KLSAgICAgIGlmIChjbGllbnRwdHIpCi0gICAgICAgIGNsaWVudHB0ci0+c2l6ZU5vd0F2YWls
YWJsZShzY3JlZW5fd2lkdGgsIHNjcmVlbl9oZWlnaHQpOworICAgICAgaWYgKGNsaWVudHB0cikg
eworICAgICAgICBpZiAoIWNsaWVudHB0ci0+c2l6ZU5vd0F2YWlsYWJsZShzY3JlZW5fd2lkdGgs
IHNjcmVlbl9oZWlnaHQpKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KICAgICAg
IAogICAgICAgc2NyZWVuX2JnY29sb3IgPSBxWzVdOwogICAgICAgZ2xvYmFsX2NvbG9ybWFwX3Np
emUgPSAyPDwocVs0XSYweDA3KTsKQEAgLTkzOSw1ICs5NDksMyBAQCBib29sIEdJRkltYWdlUmVh
ZGVyOjpyZWFkKGNvbnN0IHVuc2lnbmVkCiAgICAgY2xpZW50cHRyLT5kZWNvZGluZ0hhbHRlZCgw
KTsKICAgcmV0dXJuIHRydWU7CiB9Ci0KLSNlbmRpZiAvLyBQTEFURk9STShDQUlSTykKSW5kZXg6
IHBsYXRmb3JtL2ltYWdlLWRlY29kZXJzL3NraWEvR0lGSW1hZ2VSZWFkZXIuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBwbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9za2lhL0dJRkltYWdlUmVhZGVyLmgJKHJldmlz
aW9uIDQwMTY1KQorKysgcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvc2tpYS9HSUZJbWFnZVJlYWRl
ci5oCSh3b3JraW5nIGNvcHkpCkBAIC0zNSw4ICszNSw4IEBACiAgKgogICogKioqKiogRU5EIExJ
Q0VOU0UgQkxPQ0sgKioqKiogKi8KIAotI2lmbmRlZiBfR0lGX0hfCi0jZGVmaW5lIF9HSUZfSF8K
KyNpZm5kZWYgR0lGSW1hZ2VSZWFkZXJfaAorI2RlZmluZSBHSUZJbWFnZVJlYWRlcl9oCiAKIC8v
IERlZmluZSBvdXJzZWx2ZXMgYXMgdGhlIGNsaWVudFB0ci4gIE1vemlsbGEganVzdCBoYWNrZWQg
dGhlaXIgQysrIGNhbGxiYWNrIGNsYXNzIGludG8gdGhpcyBvbGQgQyBkZWNvZGVyLAogLy8gc28g
d2Ugd2lsbCB0b28uCkBAIC0xNjcsMTEgKzE2NywxMSBAQCBzdHJ1Y3QgR0lGSW1hZ2VSZWFkZXIg
ewogICAgIGludCB2ZXJzaW9uOyAgICAgICAgICAgICAgICAvKiBFaXRoZXIgODkgZm9yIEdJRjg5
IG9yIDg3IGZvciBHSUY4NyAqLwogICAgIHVuc2lnbmVkIHNjcmVlbl93aWR0aDsgICAgICAgLyog
TG9naWNhbCBzY3JlZW4gd2lkdGggJiBoZWlnaHQgKi8KICAgICB1bnNpZ25lZCBzY3JlZW5faGVp
Z2h0OwotICAgIGludCBnbG9iYWxfY29sb3JtYXBfc2l6ZTsgICAvKiBTaXplIG9mIGdsb2JhbCBj
b2xvcm1hcCBhcnJheS4gKi8KLSAgICBpbnQgaW1hZ2VzX2RlY29kZWQ7ICAgICAgICAgLyogQ291
bnRzIGNvbXBsZXRlZCBmcmFtZXMgZm9yIGFuaW1hdGVkIEdJRnMgKi8KLSAgICBpbnQgaW1hZ2Vz
X2NvdW50OyAgICAgICAgICAgLyogQ291bnRlZCBhbGwgZnJhbWVzIHNlZW4gc28gZmFyIChpbmNs
dWRpbmcgaW5jb21wbGV0ZSBmcmFtZXMpICovCi0gICAgaW50IGxvb3BfY291bnQ7ICAgICAgICAg
ICAgIC8qIE5ldHNjYXBlIHNwZWNpZmljIGV4dGVuc2lvbiBibG9jayB0byBjb250cm9sCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYW5pbWF0aW9uIGxv
b3BzIGEgR0lGIHJlbmRlcnMuICovCisgICAgaW50IGdsb2JhbF9jb2xvcm1hcF9zaXplOyAgICAv
KiBTaXplIG9mIGdsb2JhbCBjb2xvcm1hcCBhcnJheS4gKi8KKyAgICB1bnNpZ25lZCBpbnQgaW1h
Z2VzX2RlY29kZWQ7IC8qIENvdW50cyBjb21wbGV0ZWQgZnJhbWVzIGZvciBhbmltYXRlZCBHSUZz
ICovCisgICAgaW50IGltYWdlc19jb3VudDsgICAgICAgICAgICAvKiBDb3VudGVkIGFsbCBmcmFt
ZXMgc2VlbiBzbyBmYXIgKGluY2x1ZGluZyBpbmNvbXBsZXRlIGZyYW1lcykgKi8KKyAgICBpbnQg
bG9vcF9jb3VudDsgICAgICAgICAgICAgIC8qIE5ldHNjYXBlIHNwZWNpZmljIGV4dGVuc2lvbiBi
bG9jayB0byBjb250cm9sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUg
bnVtYmVyIG9mIGFuaW1hdGlvbiBsb29wcyBhIEdJRiByZW5kZXJzLiAqLwogICAgIAogICAgIC8v
IE5vdCByZWFsbHkgZ2xvYmFsLCBidXQgY29udmVuaWVudCB0byBsb2NhdGUgaGVyZS4KICAgICBp
bnQgY291bnQ7ICAgICAgICAgICAgICAgICAgLyogUmVtYWluaW5nICMgYnl0ZXMgaW4gc3ViLWJs
b2NrICovCkBAIC0yMTMsNCArMjEzLDMgQEAgcHJpdmF0ZToKIH07CiAKICNlbmRpZgotCkluZGV4
OiBwbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9za2lhL0lDT0ltYWdlRGVjb2Rlci5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvc2tpYS9JQ09JbWFnZURlY29kZXIuY3Bw
CShyZXZpc2lvbiAwKQorKysgcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvc2tpYS9JQ09JbWFnZURl
Y29kZXIuY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDIzMCBAQAorLyoKKyAqIENvcHlyaWdo
dCAoYykgMjAwOCwgMjAwOSwgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAor
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKiAKKyAqICAgICAqIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0
cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0
aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBv
ciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0
IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIAorICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwor
ICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9S
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRI
RU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVk
ZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiSUNPSW1hZ2VEZWNvZGVyLmgiCisKK25hbWVzcGFjZSBX
ZWJDb3JlIHsKKworLy8gTnVtYmVyIG9mIGJpdHMgaW4gLklDTy8uQ1VSIHVzZWQgdG8gc3RvcmUg
dGhlIGRpcmVjdG9yeSBhbmQgaXRzIGVudHJpZXMsCisvLyByZXNwZWN0aXZlbHkgKGRvZXNuJ3Qg
bWF0Y2ggc2l6ZW9mIHZhbHVlcyBmb3IgbWVtYmVyIHN0cnVjdHMgc2luY2Ugd2Ugb21pdAorLy8g
c29tZSBmaWVsZHMpLgorc3RhdGljIGNvbnN0IHNpemVfdCBzaXplT2ZEaXJlY3RvcnkgPSA2Owor
c3RhdGljIGNvbnN0IHNpemVfdCBzaXplT2ZEaXJFbnRyeSA9IDE2OworCit2b2lkIElDT0ltYWdl
RGVjb2Rlcjo6ZGVjb2RlSW1hZ2UoU2hhcmVkQnVmZmVyKiBkYXRhKQoreworICAgIC8vIFJlYWQg
YW5kIHByb2Nlc3MgZGlyZWN0b3J5LgorICAgIGlmICgobV9kZWNvZGVkT2Zmc2V0IDwgc2l6ZU9m
RGlyZWN0b3J5KSAmJiAhcHJvY2Vzc0RpcmVjdG9yeShkYXRhKSkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgLy8gUmVhZCBhbmQgcHJvY2VzcyBkaXJlY3RvcnkgZW50cmllcy4KKyAgICBpZiAoKG1f
ZGVjb2RlZE9mZnNldCA8IChzaXplT2ZEaXJlY3RvcnkgKyAobV9kaXJlY3RvcnkuaWRDb3VudCAq
IHNpemVPZkRpckVudHJ5KSkpCisgICAgICAgICYmICFwcm9jZXNzRGlyZWN0b3J5RW50cmllcyhk
YXRhKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gQ2hlY2sgaWYgdGhpcyBlbnRyeSBpcyBh
IFBORzsgd2UgbmVlZCA0IGJ5dGVzIHRvIGNoZWNrIHRoZSBtYWdpYyBudW1iZXIuCisgICAgaWYg
KG1faW1hZ2VUeXBlID09IFVua25vd24pIHsKKyAgICAgICAgaWYgKGRhdGEtPnNpemUoKSA8ICht
X2RpckVudHJ5LmR3SW1hZ2VPZmZzZXQgKyA0KSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAg
ICAgbV9pbWFnZVR5cGUgPQorICAgICAgICAgICAgc3RybmNtcCgmZGF0YS0+ZGF0YSgpW21fZGly
RW50cnkuZHdJbWFnZU9mZnNldF0sICJceDg5UE5HIiwgNCkgPworICAgICAgICAgICAgQk1QIDog
UE5HOworICAgIH0KKworICAgIC8vIERlY29kZSBzZWxlY3RlZCBlbnRyeS4KKyAgICBpZiAobV9p
bWFnZVR5cGUgPT0gUE5HKQorICAgICAgICBkZWNvZGVQTkcoZGF0YSk7CisgICAgZWxzZSB7Cisg
ICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBkb24ndCB0cnkgdG8gbGltaXQgdGhlIGJ5dGVzIHdlIGdp
dmUgdG8gdGhlIGRlY29kZXIgdG8KKyAgICAgICAgLy8ganVzdCB0aGUgc2l6ZSBzcGVjaWZpZWQg
aW4gdGhlIGljb24gZGlyZWN0b3J5LiAgSWYgdGhlIHNpemUgZ2l2ZW4gaW4KKyAgICAgICAgLy8g
dGhlIGRpcmVjdG9yeSBpcyBpbnN1ZmZpY2llbnQgdG8gZGVjb2RlIHRoZSB3aG9sZSBpbWFnZSwg
dGhlIGltYWdlIGlzCisgICAgICAgIC8vIGNvcnJ1cHQgYW55d2F5LCBzbyB3aGF0ZXZlciB3ZSBk
byBtYXkgYmUgd3JvbmcuICBUaGUgZWFzaWVzdCBjaG9pY2UKKyAgICAgICAgLy8gKHdoaWNoIHdl
IGRvIGhlcmUpIGlzIHRvIHNpbXBseSBhZ2dyZXNzaXZlbHkgY29uc3VtZSBieXRlcyB1bnRpbCB3
ZQorICAgICAgICAvLyBydW4gb3V0IG9mIGJ5dGVzLCBmaW5pc2ggZGVjb2RpbmcsIG9yIGhpdCBh
IHNlcXVlbmNlIHRoYXQgbWFrZXMgdGhlCisgICAgICAgIC8vIGRlY29kZXIgZmFpbC4KKyAgICAg
ICAgZGVjb2RlQk1QKGRhdGEpOworICAgIH0KK30KKworUkdCQTMyQnVmZmVyKiBJQ09JbWFnZURl
Y29kZXI6OmZyYW1lQnVmZmVyQXRJbmRleChzaXplX3QgaW5kZXgpCit7CisgICAgcmV0dXJuICht
X2ltYWdlVHlwZSA9PSBQTkcpID8gbV9wbmdEZWNvZGVyLmZyYW1lQnVmZmVyQXRJbmRleCgwKSA6
CisgICAgICAgIEJNUEltYWdlUmVhZGVyOjpmcmFtZUJ1ZmZlckF0SW5kZXgoMCk7Cit9CisKK2Jv
b2wgSUNPSW1hZ2VEZWNvZGVyOjppc1NpemVBdmFpbGFibGUoKSBjb25zdAoreworICAgIHJldHVy
biAobV9pbWFnZVR5cGUgPT0gUE5HKSA/IG1fcG5nRGVjb2Rlci5pc1NpemVBdmFpbGFibGUoKSA6
CisgICAgICAgIEJNUEltYWdlUmVhZGVyOjppc1NpemVBdmFpbGFibGUoKTsKK30KKworSW50U2l6
ZSBJQ09JbWFnZURlY29kZXI6OnNpemUoKSBjb25zdAoreworICAgIHJldHVybiAobV9pbWFnZVR5
cGUgPT0gUE5HKSA/IG1fcG5nRGVjb2Rlci5zaXplKCkgOiBCTVBJbWFnZVJlYWRlcjo6c2l6ZSgp
OworfQorCitib29sIElDT0ltYWdlRGVjb2Rlcjo6cHJvY2Vzc0RpcmVjdG9yeShTaGFyZWRCdWZm
ZXIqIGRhdGEpCit7CisgICAgLy8gUmVhZCBkaXJlY3RvcnkuCisgICAgQVNTRVJUKCFtX2RlY29k
ZWRPZmZzZXQpOworICAgIGlmIChkYXRhLT5zaXplKCkgPCBzaXplT2ZEaXJlY3RvcnkpCisgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICBjb25zdCB1aW50MTZfdCBmaWxlVHlwZSA9IHJlYWRVaW50
MTYoZGF0YSwgMik7CisgICAgbV9kaXJlY3RvcnkuaWRDb3VudCA9IHJlYWRVaW50MTYoZGF0YSwg
NCk7CisgICAgbV9kZWNvZGVkT2Zmc2V0ID0gc2l6ZU9mRGlyZWN0b3J5OworCisgICAgLy8gU2Vl
IGlmIHRoaXMgaXMgYW4gaWNvbiBmaWxldHlwZSB3ZSB1bmRlcnN0YW5kLCBhbmQgbWFrZSBzdXJl
IHdlIGhhdmUgYXQKKyAgICAvLyBsZWFzdCBvbmUgZW50cnkgaW4gdGhlIGRpcmVjdG9yeS4KKyAg
ICBlbnVtIHsKKyAgICAgICAgSUNPTiA9IDEsCisgICAgICAgIENVUlNPUiA9IDIsCisgICAgfTsK
KyAgICBpZiAoKChmaWxlVHlwZSAhPSBJQ09OKSAmJiAoZmlsZVR5cGUgIT0gQ1VSU09SKSkgfHwK
KyAgICAgICAgICAgIChtX2RpcmVjdG9yeS5pZENvdW50ID09IDApKQorICAgICAgICBtX2ZhaWxl
ZCA9IHRydWU7CisKKyAgICByZXR1cm4gIW1fZmFpbGVkOworfQorCitib29sIElDT0ltYWdlRGVj
b2Rlcjo6cHJvY2Vzc0RpcmVjdG9yeUVudHJpZXMoU2hhcmVkQnVmZmVyKiBkYXRhKQoreworICAg
IC8vIFJlYWQgZGlyZWN0b3J5IGVudHJpZXMuCisgICAgQVNTRVJUKG1fZGVjb2RlZE9mZnNldCA9
PSBzaXplT2ZEaXJlY3RvcnkpOworICAgIGlmICgobV9kZWNvZGVkT2Zmc2V0ID4gZGF0YS0+c2l6
ZSgpKSB8fCAoZGF0YS0+c2l6ZSgpIC0gbV9kZWNvZGVkT2Zmc2V0KSA8CisgICAgICAgICAgICAo
bV9kaXJlY3RvcnkuaWRDb3VudCAqIHNpemVPZkRpckVudHJ5KSkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9kaXJlY3RvcnkuaWRDb3VudDsgKytpKSB7
CisgICAgICAgIGNvbnN0IEljb25EaXJlY3RvcnlFbnRyeSBkaXJFbnRyeSA9IHJlYWREaXJlY3Rv
cnlFbnRyeShkYXRhKTsKKyAgICAgICAgaWYgKChpID09IDApIHx8IGlzQmV0dGVyRW50cnkoZGly
RW50cnkpKQorICAgICAgICAgICAgbV9kaXJFbnRyeSA9IGRpckVudHJ5OworICAgIH0KKworICAg
IC8vIE1ha2Ugc3VyZSB0aGUgc3BlY2lmaWVkIGltYWdlIG9mZnNldCBpcyBwYXN0IHRoZSBlbmQg
b2YgdGhlIGRpcmVjdG9yeQorICAgIC8vIGVudHJpZXMsIGFuZCB0aGF0IHRoZSBvZmZzZXQgaXNu
J3Qgc28gbGFyZ2UgdGhhdCBpdCBvdmVyZmxvd3Mgd2hlbiB3ZSBhZGQKKyAgICAvLyA0IGJ5dGVz
IHRvIGl0ICh3aGljaCB3ZSBkbyBpbiBkZWNvZGVJbWFnZSgpIHdoaWxlIGVuc3VyaW5nIGl0J3Mg
c2FmZSB0bworICAgIC8vIGV4YW1pbmUgdGhlIGZpcnN0IDQgYnl0ZXMgb2YgdGhlIGltYWdlIGRh
dGEpLgorICAgIGlmICgobV9kaXJFbnRyeS5kd0ltYWdlT2Zmc2V0IDwgbV9kZWNvZGVkT2Zmc2V0
KSB8fAorICAgICAgICAgICAgKChtX2RpckVudHJ5LmR3SW1hZ2VPZmZzZXQgKyA0KSA8IG1fZGly
RW50cnkuZHdJbWFnZU9mZnNldCkpIHsKKyAgICAgIG1fZmFpbGVkID0gdHJ1ZTsKKyAgICAgIHJl
dHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBSZWFkeSB0byBkZWNvZGUgdGhlIGltYWdlIGF0
IHRoZSBzcGVjaWZpZWQgb2Zmc2V0LgorICAgIG1fZGVjb2RlZE9mZnNldCA9IG1faGVhZGVyT2Zm
c2V0ID0gbV9kaXJFbnRyeS5kd0ltYWdlT2Zmc2V0OworICAgIHJldHVybiB0cnVlOworfQorCitJ
Q09JbWFnZURlY29kZXI6Okljb25EaXJlY3RvcnlFbnRyeSBJQ09JbWFnZURlY29kZXI6OnJlYWRE
aXJlY3RvcnlFbnRyeSgKKyAgICBTaGFyZWRCdWZmZXIqIGRhdGEpCit7CisgICAgLy8gUmVhZCBp
Y29uIGRhdGEuCisgICAgSWNvbkRpcmVjdG9yeUVudHJ5IGVudHJ5OworICAgIGVudHJ5LmJXaWR0
aCA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGRhdGEtPmRhdGEoKVttX2RlY29kZWRPZmZzZXRdKTsK
KyAgICBpZiAoZW50cnkuYldpZHRoID09IDApCisgICAgICAgIGVudHJ5LmJXaWR0aCA9IDI1NjsK
KyAgICBlbnRyeS5iSGVpZ2h0ID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oZGF0YS0+ZGF0YSgpW21f
ZGVjb2RlZE9mZnNldCArIDFdKTsKKyAgICBpZiAoZW50cnkuYkhlaWdodCA9PSAwKQorICAgICAg
ICBlbnRyeS5iSGVpZ2h0ID0gMjU2OworICAgIGVudHJ5LndCaXRDb3VudCA9IHJlYWRVaW50MTYo
ZGF0YSwgNik7CisgICAgZW50cnkuZHdJbWFnZU9mZnNldCA9IHJlYWRVaW50MzIoZGF0YSwgMTIp
OworCisgICAgLy8gU29tZSBpY29ucyBkb24ndCBoYXZlIGEgYml0IGRlcHRoLCBvbmx5IGEgY29s
b3IgY291bnQuICBDb252ZXJ0IHRoZQorICAgIC8vIGNvbG9yIGNvdW50IHRvIHRoZSBtaW5pbXVt
IG5lY2Vzc2FyeSBiaXQgZGVwdGguICBJdCBkb2Vzbid0IG1hdHRlciBpZgorICAgIC8vIHRoaXMg
aXNuJ3QgcXVpdGUgd2hhdCB0aGUgYml0bWFwIGluZm8gaGVhZGVyIHNheXMgbGF0ZXIsIGFzIHdl
IG9ubHkgdXNlCisgICAgLy8gdGhpcyB2YWx1ZSB0byBkZXRlcm1pbmUgd2hpY2ggaWNvbiBlbnRy
eSBpcyBiZXN0LgorICAgIGlmICghZW50cnkud0JpdENvdW50KSB7CisgICAgICAgIHVpbnQ4X3Qg
Y29sb3JDb3VudCA9IGRhdGEtPmRhdGEoKVttX2RlY29kZWRPZmZzZXQgKyAyXTsKKyAgICAgICAg
aWYgKGNvbG9yQ291bnQpIHsKKyAgICAgICAgICAgIGZvciAoLS1jb2xvckNvdW50OyBjb2xvckNv
dW50OyBjb2xvckNvdW50ID4+PSAxKQorICAgICAgICAgICAgICAgICsrZW50cnkud0JpdENvdW50
OworICAgICAgICB9CisgICAgfQorCisgICAgbV9kZWNvZGVkT2Zmc2V0ICs9IHNpemVPZkRpckVu
dHJ5OworICAgIHJldHVybiBlbnRyeTsKK30KKworYm9vbCBJQ09JbWFnZURlY29kZXI6OmlzQmV0
dGVyRW50cnkoY29uc3QgSWNvbkRpcmVjdG9yeUVudHJ5JiBlbnRyeSkgY29uc3QKK3sKKyAgICBj
b25zdCBJbnRTaXplIGVudHJ5U2l6ZShlbnRyeS5iV2lkdGgsIGVudHJ5LmJIZWlnaHQpOworICAg
IGNvbnN0IEludFNpemUgZGlyRW50cnlTaXplKG1fZGlyRW50cnkuYldpZHRoLCBtX2RpckVudHJ5
LmJIZWlnaHQpOworICAgIGNvbnN0IGludCBlbnRyeUFyZWEgPSBlbnRyeS5iV2lkdGggKiBlbnRy
eS5iSGVpZ2h0OworICAgIGNvbnN0IGludCBkaXJFbnRyeUFyZWEgPSBtX2RpckVudHJ5LmJXaWR0
aCAqIG1fZGlyRW50cnkuYkhlaWdodDsKKworICAgIGlmICgoZW50cnlTaXplICE9IGRpckVudHJ5
U2l6ZSkgJiYgIW1fcHJlZmVycmVkSWNvblNpemUuaXNFbXB0eSgpKSB7CisgICAgICAgIC8vIEFu
IGljb24gb2YgZXhhY3RseSB0aGUgcHJlZmVycmVkIHNpemUgaXMgYmVzdC4KKyAgICAgICAgaWYg
KGVudHJ5U2l6ZSA9PSBtX3ByZWZlcnJlZEljb25TaXplKQorICAgICAgICAgICAgcmV0dXJuIHRy
dWU7CisgICAgICAgIGlmIChkaXJFbnRyeVNpemUgPT0gbV9wcmVmZXJyZWRJY29uU2l6ZSkKKyAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAvLyBUaGUgaWNvbiBjbG9zZXN0IHRv
IHRoZSBwcmVmZXJyZWQgYXJlYSB3aXRob3V0IGJlaW5nIHNtYWxsZXIgaXMKKyAgICAgICAgLy8g
YmV0dGVyLgorICAgICAgICBpZiAoZW50cnlBcmVhICE9IGRpckVudHJ5QXJlYSkgeworICAgICAg
ICAgICAgcmV0dXJuIChlbnRyeUFyZWEgPCBkaXJFbnRyeUFyZWEpCisgICAgICAgICAgICAgICAg
JiYgKGVudHJ5QXJlYSA+PSAobV9wcmVmZXJyZWRJY29uU2l6ZS53aWR0aCgpICogbV9wcmVmZXJy
ZWRJY29uU2l6ZS5oZWlnaHQoKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gTGFyZ2Vy
IGljb25zIGFyZSBiZXR0ZXIuCisgICAgaWYgKGVudHJ5QXJlYSAhPSBkaXJFbnRyeUFyZWEpCisg
ICAgICAgIHJldHVybiAoZW50cnlBcmVhID4gZGlyRW50cnlBcmVhKTsKKworICAgIC8vIEhpZ2hl
ciBiaXQtZGVwdGggaWNvbnMgYXJlIGJldHRlci4KKyAgICByZXR1cm4gKGVudHJ5LndCaXRDb3Vu
dCA+IG1fZGlyRW50cnkud0JpdENvdW50KTsKK30KKwordm9pZCBJQ09JbWFnZURlY29kZXI6OmRl
Y29kZVBORyhTaGFyZWRCdWZmZXIqIGRhdGEpCit7CisgICAgLy8gQ29weSBvdXQgUE5HIGRhdGEg
dG8gYSBzZXBhcmF0ZSB2ZWN0b3IgYW5kIGluc3RhbnRpYXRlIFBORyBkZWNvZGVyLgorICAgIC8v
IEl0IHdvdWxkIGJlIG5pY2UgdG8gc2F2ZSB0aGlzIGNvcHksIGlmIEkgY291bGQgZmlndXJlIG91
dCBob3cgdG8ganVzdAorICAgIC8vIG9mZnNldCB0aGUgcGVyY2VpdmVkIHN0YXJ0IG9mIHxkYXRh
fCBieSB8bV9kaXJFbnRyeS5kd0ltYWdlT2Zmc2V0fCB3aGVuCisgICAgLy8gcGFzc2luZyBpdCB0
byBzZXREYXRhKCkuLi4KKyAgICBSZWZQdHI8U2hhcmVkQnVmZmVyPiBwbmdEYXRhKAorICAgICAg
ICBTaGFyZWRCdWZmZXI6OmNyZWF0ZSgmZGF0YS0+ZGF0YSgpW21fZGlyRW50cnkuZHdJbWFnZU9m
ZnNldF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPnNpemUoKSAtIG1fZGly
RW50cnkuZHdJbWFnZU9mZnNldCkpOworICAgIG1fcG5nRGVjb2Rlci5zZXREYXRhKHBuZ0RhdGEu
Z2V0KCksIHRydWUpOworCisgICAgLy8gRGVjb2RlIFBORyBhcyBhIHNpZGUgZWZmZWN0IG9mIGFz
a2luZyBmb3IgdGhlIGZyYW1lLiAgU3RyYW5nZWx5LCBpdCdzCisgICAgLy8gc2VlbWluZ2x5IHVu
c2FmZSB0byBjYWxsIGRlY29kZSgpIG9yIGlzU2l6ZUF2YWlsYWJsZSgpIGJlZm9yZSBjYWxsaW5n
CisgICAgLy8gdGhpcywgYXMgdGhpcyBpcyB0aGUgb25seSBmdW5jdGlvbiB0aGF0IGVubGFyZ2Vz
IHRoZSBmcmFtZWJ1ZmZlciB0bworICAgIC8vIG5vbnplcm8gc2l6ZSwgYW5kIGJlZm9yZSB0aGlz
IGhhcHBlbnMgYW55IGRlY29kZWQgaW1hZ2UgZGF0YSBpcyBzaWxlbnRseQorICAgIC8vIHRocm93
biBhd2F5IGFuZCBuZXZlciBkZWNvZGVkIGFnYWluICghKS4KKyAgICBtX3BuZ0RlY29kZXIuZnJh
bWVCdWZmZXJBdEluZGV4KDApOworICAgIG1fZmFpbGVkID0gbV9wbmdEZWNvZGVyLmZhaWxlZCgp
OworCisgICAgLy8gU2FuaXR5LWNoZWNrIHRoYXQgdGhlIHNpemUgaXMgd2hhdCB3ZSBleHBlY3Rl
ZC4KKyAgICBpZiAoaXNTaXplQXZhaWxhYmxlKCkgJiYgKChzaXplKCkud2lkdGgoKSAhPSBtX2Rp
ckVudHJ5LmJXaWR0aCkgfHwKKyAgICAgICAgICAgIChzaXplKCkuaGVpZ2h0KCkgIT0gbV9kaXJF
bnRyeS5iSGVpZ2h0KSkpCisgICAgICAgIG1fZmFpbGVkID0gdHJ1ZTsKK30KKworfQpJbmRleDog
cGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvc2tpYS9JQ09JbWFnZURlY29kZXIuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBwbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9za2lhL0lDT0ltYWdlRGVjb2Rlci5oCShyZXZp
c2lvbiAwKQorKysgcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvc2tpYS9JQ09JbWFnZURlY29kZXIu
aAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIw
MDgsIDIwMDksIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICogCisgKiAgICAgKiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9u
LgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVz
IG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90
ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZp
YyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJ
UyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAq
IFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBJQ09JbWFn
ZURlY29kZXJfaAorI2RlZmluZSBJQ09JbWFnZURlY29kZXJfaAorCisjaW5jbHVkZSAiQk1QSW1h
Z2VSZWFkZXIuaCIKKyNpbmNsdWRlICJQTkdJbWFnZURlY29kZXIuaCIKKworbmFtZXNwYWNlIFdl
YkNvcmUgeworCisgICAgLy8gVGhpcyBjbGFzcyBkZWNvZGVzIHRoZSBJQ08gYW5kIENVUiBpbWFn
ZSBmb3JtYXRzLgorICAgIGNsYXNzIElDT0ltYWdlRGVjb2RlciA6IHB1YmxpYyBCTVBJbWFnZVJl
YWRlciB7CisgICAgcHVibGljOgorICAgICAgICAvLyBTZWUgY29tbWVudHMgb24gfG1fcHJlZmVy
cmVkSWNvblNpemV8IGJlbG93LgorICAgICAgICBJQ09JbWFnZURlY29kZXIoY29uc3QgSW50U2l6
ZSYgcHJlZmVycmVkSWNvblNpemUpCisgICAgICAgICAgICA6IG1fcHJlZmVycmVkSWNvblNpemUo
cHJlZmVycmVkSWNvblNpemUpCisgICAgICAgICAgICAsIG1faW1hZ2VUeXBlKFVua25vd24pCisg
ICAgICAgIHsKKyAgICAgICAgICAgIG1fYW5kTWFza1N0YXRlID0gTm90WWV0RGVjb2RlZDsKKyAg
ICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgU3RyaW5nIGZpbGVuYW1lRXh0ZW5zaW9uKCkgY29u
c3QgeyByZXR1cm4gImljbyI7IH0KKworICAgICAgICAvLyBCTVBJbWFnZVJlYWRlcgorICAgICAg
ICB2aXJ0dWFsIHZvaWQgZGVjb2RlSW1hZ2UoU2hhcmVkQnVmZmVyKiBkYXRhKTsKKyAgICAgICAg
dmlydHVhbCBSR0JBMzJCdWZmZXIqIGZyYW1lQnVmZmVyQXRJbmRleChzaXplX3QgaW5kZXgpOwor
CisgICAgICAgIC8vIEltYWdlRGVjb2RlcgorICAgICAgICB2aXJ0dWFsIGJvb2wgaXNTaXplQXZh
aWxhYmxlKCkgY29uc3Q7CisgICAgICAgIHZpcnR1YWwgSW50U2l6ZSBzaXplKCkgY29uc3Q7CisK
KyAgICBwcml2YXRlOgorICAgICAgICBlbnVtIEltYWdlVHlwZSB7CisgICAgICAgICAgICBVbmtu
b3duLAorICAgICAgICAgICAgQk1QLAorICAgICAgICAgICAgUE5HLAorICAgICAgICB9OworCisg
ICAgICAgIC8vIFRoZXNlIGFyZSBiYXNlZCBvbiB0aGUgV2luZG93cyBJQ09ORElSIGFuZCBJQ09O
RElSRU5UUlkgc3RydWN0cywgYnV0CisgICAgICAgIC8vIHdpdGggdW5uZWNlc3NhcnkgZW50cmll
cyByZW1vdmVkLgorICAgICAgICBzdHJ1Y3QgSWNvbkRpcmVjdG9yeSB7CisgICAgICAgICAgICB1
aW50MTZfdCBpZENvdW50OworICAgICAgICB9OworICAgICAgICBzdHJ1Y3QgSWNvbkRpcmVjdG9y
eUVudHJ5IHsKKyAgICAgICAgICAgIHVpbnQxNl90IGJXaWR0aDsgICAvLyAxNiBiaXRzIHNvIHdl
IGNhbiByZXByZXNlbnQgMjU2IGFzIDI1Niwgbm90IDAKKyAgICAgICAgICAgIHVpbnQxNl90IGJI
ZWlnaHQ7ICAvLyAiCisgICAgICAgICAgICB1aW50MTZfdCB3Qml0Q291bnQ7CisgICAgICAgICAg
ICB1aW50MzJfdCBkd0ltYWdlT2Zmc2V0OworICAgICAgICB9OworCisgICAgICAgIC8vIFByb2Nl
c3NlcyB0aGUgSUNPTkRJUiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBkYXRhLiAgUmV0dXJucyB0
cnVlIGlmIHRoZQorICAgICAgICAvLyBkaXJlY3RvcnkgY291bGQgYmUgZGVjb2RlZC4KKyAgICAg
ICAgYm9vbCBwcm9jZXNzRGlyZWN0b3J5KFNoYXJlZEJ1ZmZlciopOworCisgICAgICAgIC8vIFBy
b2Nlc3NlcyB0aGUgSUNPTkRJUkVOVFJZIHJlY29yZHMgYWZ0ZXIgdGhlIGRpcmVjdG9yeS4gIEtl
ZXBzIHRoZQorICAgICAgICAvLyAiYmVzdCIgZW50cnkgYXMgdGhlIG9uZSB3ZSdsbCBkZWNvZGUu
ICBSZXR1cm5zIHRydWUgaWYgdGhlIGVudHJpZXMgY291bGQKKyAgICAgICAgLy8gYmUgZGVjb2Rl
ZC4KKyAgICAgICAgYm9vbCBwcm9jZXNzRGlyZWN0b3J5RW50cmllcyhTaGFyZWRCdWZmZXIqKTsK
KworICAgICAgICAvLyBSZWFkcyBhbmQgcmV0dXJucyBhIGRpcmVjdG9yeSBlbnRyeSBmcm9tIHRo
ZSBjdXJyZW50IG9mZnNldCBpbnRvIHxkYXRhfC4KKyAgICAgICAgSWNvbkRpcmVjdG9yeUVudHJ5
IHJlYWREaXJlY3RvcnlFbnRyeShTaGFyZWRCdWZmZXIqKTsKKworICAgICAgICAvLyBSZXR1cm5z
IHRydWUgaWYgfGVudHJ5fCBpcyBhIHByZWZlcmFibGUgaWNvbiBlbnRyeSB0byBtX2RpckVudHJ5
LgorICAgICAgICAvLyBMYXJnZXIgc2l6ZXMsIG9yIGdyZWF0ZXIgYml0ZGVwdGhzIGF0IHRoZSBz
YW1lIHNpemUsIGFyZSBwcmVmZXJhYmxlLgorICAgICAgICBib29sIGlzQmV0dGVyRW50cnkoY29u
c3QgSWNvbkRpcmVjdG9yeUVudHJ5JikgY29uc3Q7CisKKyAgICAgICAgLy8gQ2FsbGVkIHdoZW4g
dGhlIGltYWdlIHRvIGJlIGRlY29kZWQgaXMgYSBQTkcgcmF0aGVyIHRoYW4gYSBCTVAuCisgICAg
ICAgIC8vIEluc3RhbnRpYXRlcyBhIFBOR0ltYWdlRGVjb2RlciwgZGVjb2RlcyB0aGUgaW1hZ2Us
IGFuZCBjb3BpZXMgdGhlCisgICAgICAgIC8vIHJlc3VsdHMgbG9jYWxseS4KKyAgICAgICAgdm9p
ZCBkZWNvZGVQTkcoU2hhcmVkQnVmZmVyKik7CisKKyAgICAgICAgLy8gVGhlIGVudHJ5IHNpemUg
d2Ugc2hvdWxkIHByZWZlci4gIElmIHRoaXMgaXMgZW1wdHksIHdlIGNob29zZSB0aGUKKyAgICAg
ICAgLy8gbGFyZ2VzdCBhdmFpbGFibGUgc2l6ZS4gIElmIG5vIGVudHJpZXMgb2YgdGhlIGRlc2ly
ZWQgc2l6ZSBhcmUKKyAgICAgICAgLy8gYXZhaWxhYmxlLCB3ZSBwaWNrIHRoZSBuZXh0IGxhcmdl
ciBzaXplLgorICAgICAgICBJbnRTaXplIG1fcHJlZmVycmVkSWNvblNpemU7CisKKyAgICAgICAg
Ly8gVGhlIGhlYWRlcnMgZm9yIHRoZSBJQ08uCisgICAgICAgIEljb25EaXJlY3RvcnkgbV9kaXJl
Y3Rvcnk7CisgICAgICAgIEljb25EaXJlY3RvcnlFbnRyeSBtX2RpckVudHJ5OworCisgICAgICAg
IC8vIFRoZSBQTkcgZGVjb2RlciwgaWYgd2UgbmVlZCB0byB1c2Ugb25lLgorICAgICAgICBQTkdJ
bWFnZURlY29kZXIgbV9wbmdEZWNvZGVyOworCisgICAgICAgIC8vIFdoYXQga2luZCBvZiBpbWFn
ZSBkYXRhIGlzIHN0b3JlZCBhdCB0aGUgZW50cnkgd2UncmUgZGVjb2RpbmcuCisgICAgICAgIElt
YWdlVHlwZSBtX2ltYWdlVHlwZTsKKyAgICB9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisK
KyNlbmRpZgpJbmRleDogcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvc2tpYS9JbWFnZURlY29kZXIu
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBwbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9za2lhL0ltYWdlRGVjb2Rl
ci5oCShyZXZpc2lvbiA0MDE2NikKKysrIHBsYXRmb3JtL2ltYWdlLWRlY29kZXJzL3NraWEvSW1h
Z2VEZWNvZGVyLmgJKHdvcmtpbmcgY29weSkKQEAgLTEsNSArMSw2IEBACiAvKgogICogQ29weXJp
Z2h0IChDKSAyMDA2IEFwcGxlIENvbXB1dGVyLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICogQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5IEdvb2dsZSwgSW5jLgogICoKICAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCkBAIC0yMywxNDggKzI0LDMxMCBAQAogICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCiAg
Ki8KIAotI2lmbmRlZiBJTUFHRV9ERUNPREVSX0hfCi0jZGVmaW5lIElNQUdFX0RFQ09ERVJfSF8K
KyNpZm5kZWYgSW1hZ2VEZWNvZGVyX2gKKyNkZWZpbmUgSW1hZ2VEZWNvZGVyX2gKIAogI2luY2x1
ZGUgIkludFJlY3QuaCIKICNpbmNsdWRlICJJbWFnZVNvdXJjZS5oIgorI2luY2x1ZGUgIk5hdGl2
ZUltYWdlU2tpYS5oIgogI2luY2x1ZGUgIlBsYXRmb3JtU3RyaW5nLmgiCiAjaW5jbHVkZSAiU2hh
cmVkQnVmZmVyLmgiCisjaW5jbHVkZSA8d3RmL0Fzc2VydGlvbnMuaD4KKyNpbmNsdWRlIDx3dGYv
UGFzc1JlZlB0ci5oPgorI2luY2x1ZGUgPHd0Zi9SZWZDb3VudGVkLmg+CisjaW5jbHVkZSA8d3Rm
L1JlZlB0ci5oPgogI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KIAorI2luY2x1ZGUgIlNrQml0bWFw
LmgiCisKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotdHlwZWRlZiBWZWN0b3I8dW5zaWduZWQ+IFJH
QkEzMkFycmF5OworICAgIGNsYXNzIFJlZkNvdW50ZWROYXRpdmVJbWFnZVNraWEgOiBwdWJsaWMg
UmVmQ291bnRlZDxSZWZDb3VudGVkTmF0aXZlSW1hZ2VTa2lhPiB7CisgICAgcHVibGljOgorICAg
ICAgICBzdGF0aWMgUGFzc1JlZlB0cjxSZWZDb3VudGVkTmF0aXZlSW1hZ2VTa2lhPiBjcmVhdGUo
KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3IFJlZkNvdW50ZWRO
YXRpdmVJbWFnZVNraWEpOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgTmF0aXZlSW1hZ2VT
a2lhJiBiaXRtYXAoKSBjb25zdCB7IHJldHVybiBtX2JpdG1hcDsgfQorICAgICAgICBOYXRpdmVJ
bWFnZVNraWEmIGJpdG1hcCgpIHsgcmV0dXJuIG1fYml0bWFwOyB9CiAKLS8vIFRoZSBSR0JBMzJC
dWZmZXIgb2JqZWN0IHJlcHJlc2VudHMgdGhlIGRlY29kZWQgaW1hZ2UgZGF0YSBpbiBSR0JBMzIg
Zm9ybWF0LiAgVGhpcyBidWZmZXIgaXMgd2hhdCBhbGwKLS8vIGRlY29kZXJzIHdyaXRlIGEgc2lu
Z2xlIGZyYW1lIGludG8uICBGcmFtZXMgYXJlIHRoZW4gaW5zdGFudGlhdGVkIGZvciBkcmF3aW5n
IGJ5IGJlaW5nIGhhbmRlZCB0aGlzIGJ1ZmZlci4KLWNsYXNzIFJHQkEzMkJ1ZmZlcgotewotcHVi
bGljOgotICAgIGVudW0gRnJhbWVTdGF0dXMgeyBGcmFtZUVtcHR5LCBGcmFtZVBhcnRpYWwsIEZy
YW1lQ29tcGxldGUgfTsKLSAgICBlbnVtIEZyYW1lRGlzcG9zYWxNZXRob2QgewotICAgICAgICAv
LyBJZiB5b3UgY2hhbmdlIHRoZSBudW1lcmljIHZhbHVlcyBvZiB0aGVzZSwgbWFrZSBzdXJlIHlv
dSBhdWRpdCBhbGwKLSAgICAgICAgLy8gdXNlcnMsIGFzIHNvbWUgdXNlcnMgbWF5IGNhc3QgcmF3
IHZhbHVlcyB0by9mcm9tIHRoZXNlIGNvbnN0YW50cy4KLSAgICAgICAgRGlzcG9zZU5vdFNwZWNp
ZmllZCA9IDAsICAgICAgIC8vIExlYXZlIGZyYW1lIGluIGZyYW1lYnVmZmVyCi0gICAgICAgIERp
c3Bvc2VLZWVwID0gMSwgICAgICAgICAgICAgICAvLyBMZWF2ZSBmcmFtZSBpbiBmcmFtZWJ1ZmZl
cgotICAgICAgICBEaXNwb3NlT3ZlcndyaXRlQmdjb2xvciA9IDIsICAgLy8gQ2xlYXIgZnJhbWUg
dG8gdHJhbnNwYXJlbnQKLSAgICAgICAgRGlzcG9zZU92ZXJ3cml0ZVByZXZpb3VzID0gMywgIC8v
IENsZWFyIGZyYW1lIHRvIHByZXZpb3VzIGZyYW1lYnVmZmVyIGNvbnRlbnRzCisgICAgcHJpdmF0
ZToKKyAgICAgICAgUmVmQ291bnRlZE5hdGl2ZUltYWdlU2tpYSgpIHt9CisgICAgICAgIE5hdGl2
ZUltYWdlU2tpYSBtX2JpdG1hcDsKICAgICB9OwogCi0gICAgUkdCQTMyQnVmZmVyKCkgOiBtX2hl
aWdodCgwKSwgbV9zdGF0dXMoRnJhbWVFbXB0eSksIG1fZHVyYXRpb24oMCksCi0gICAgICAgICAg
ICAgICAgICAgICBtX2Rpc3Bvc2FsTWV0aG9kKERpc3Bvc2VOb3RTcGVjaWZpZWQpLCBtX2hhc0Fs
cGhhKGZhbHNlKQotICAgIHt9IAotCi0gICAgdm9pZCBjbGVhcigpIHsKLSAgICAgIG1fYnl0ZXMu
Y2xlYXIoKTsKLSAgICAgIG1fcmVjdCA9IEludFJlY3QoKTsKLSAgICAgIG1faGVpZ2h0ID0gMDsK
LSAgICAgIG1fc3RhdHVzID0gRnJhbWVFbXB0eTsKLSAgICAgIG1fZHVyYXRpb24gPSAwOwotICAg
ICAgbV9kaXNwb3NhbE1ldGhvZCA9IERpc3Bvc2VOb3RTcGVjaWZpZWQ7Ci0gICAgICBtX2hhc0Fs
cGhhID0gZmFsc2U7Ci0gICAgfQotCi0gICAgY29uc3QgUkdCQTMyQXJyYXkmIGJ5dGVzKCkgY29u
c3QgeyByZXR1cm4gbV9ieXRlczsgfQotICAgIFJHQkEzMkFycmF5JiBieXRlcygpIHsgcmV0dXJu
IG1fYnl0ZXM7IH0KLSAgICBjb25zdCBJbnRSZWN0JiByZWN0KCkgY29uc3QgeyByZXR1cm4gbV9y
ZWN0OyB9Ci0gICAgdW5zaWduZWQgaGVpZ2h0KCkgY29uc3QgeyByZXR1cm4gbV9oZWlnaHQ7IH0K
LSAgICBGcmFtZVN0YXR1cyBzdGF0dXMoKSBjb25zdCB7IHJldHVybiBtX3N0YXR1czsgfQotICAg
IHVuc2lnbmVkIGR1cmF0aW9uKCkgY29uc3QgeyByZXR1cm4gbV9kdXJhdGlvbjsgfQotICAgIEZy
YW1lRGlzcG9zYWxNZXRob2QgZGlzcG9zYWxNZXRob2QoKSBjb25zdCB7IHJldHVybiBtX2Rpc3Bv
c2FsTWV0aG9kOyB9Ci0gICAgYm9vbCBoYXNBbHBoYSgpIGNvbnN0IHsgcmV0dXJuIG1faGFzQWxw
aGE7IH0KLQotICAgIHZvaWQgc2V0UmVjdChjb25zdCBJbnRSZWN0JiByKSB7IG1fcmVjdCA9IHI7
IH0KLSAgICB2b2lkIGVuc3VyZUhlaWdodCh1bnNpZ25lZCByb3dJbmRleCkgeyBpZiAocm93SW5k
ZXggPiBtX2hlaWdodCkgbV9oZWlnaHQgPSByb3dJbmRleDsgfQotICAgIHZvaWQgc2V0U3RhdHVz
KEZyYW1lU3RhdHVzIHMpIHsgbV9zdGF0dXMgPSBzOyB9Ci0gICAgdm9pZCBzZXREdXJhdGlvbih1
bnNpZ25lZCBkdXJhdGlvbikgeyBtX2R1cmF0aW9uID0gZHVyYXRpb247IH0KLSAgICB2b2lkIHNl
dERpc3Bvc2FsTWV0aG9kKEZyYW1lRGlzcG9zYWxNZXRob2QgbWV0aG9kKSB7IG1fZGlzcG9zYWxN
ZXRob2QgPSBtZXRob2Q7IH0KLSAgICB2b2lkIHNldEhhc0FscGhhKGJvb2wgYWxwaGEpIHsgbV9o
YXNBbHBoYSA9IGFscGhhOyB9Ci0KLSAgICBzdGF0aWMgdm9pZCBzZXRSR0JBKHVuc2lnbmVkJiBw
b3MsIHVuc2lnbmVkIHIsIHVuc2lnbmVkIGcsIHVuc2lnbmVkIGIsIHVuc2lnbmVkIGEpCi0gICAg
ewotICAgICAgICAvLyBXZSBzdG9yZSB0aGlzIGRhdGEgcHJlLW11bHRpcGxpZWQuCi0gICAgICAg
IGlmIChhID09IDApCi0gICAgICAgICAgICBwb3MgPSAwOwotICAgICAgICBlbHNlIHsKLSAgICAg
ICAgICAgIGlmIChhIDwgMjU1KSB7Ci0gICAgICAgICAgICAgICAgZmxvYXQgYWxwaGFQZXJjZW50
ID0gYSAvIDI1NS4wZjsKLSAgICAgICAgICAgICAgICByID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+
KHIgKiBhbHBoYVBlcmNlbnQpOwotICAgICAgICAgICAgICAgIGcgPSBzdGF0aWNfY2FzdDx1bnNp
Z25lZD4oZyAqIGFscGhhUGVyY2VudCk7Ci0gICAgICAgICAgICAgICAgYiA9IHN0YXRpY19jYXN0
PHVuc2lnbmVkPihiICogYWxwaGFQZXJjZW50KTsKKyAgICAvLyBUaGUgUkdCQTMyQnVmZmVyIG9i
amVjdCByZXByZXNlbnRzIHRoZSBkZWNvZGVkIGltYWdlIGRhdGEgaW4gUkdCQTMyIGZvcm1hdC4K
KyAgICAvLyBUaGlzIGJ1ZmZlciBpcyB3aGF0IGFsbCBkZWNvZGVycyB3cml0ZSBhIHNpbmdsZSBm
cmFtZSBpbnRvLiAgRnJhbWVzIGFyZSB0aGVuCisgICAgLy8gaW5zdGFudGlhdGVkIGZvciBkcmF3
aW5nIGJ5IGJlaW5nIGhhbmRlZCB0aGlzIGJ1ZmZlci4KKyAgICAvLworICAgIC8vIFRoZSBpbWFn
ZSBkYXRhIG9mIGFuIFJHQkEzMkJ1ZmZlciBpcyBrZXB0IGluIGFuIFNrQml0bWFwUmVmLCBhIHJl
ZmNvdW50aW5nCisgICAgLy8gY29udGFpbmVyIGZvciBhbiBTa0JpdG1hcC4gIEluIGFsbCBub3Jt
YWwgY2FzZXMsIHRoZSByZWZjb3VudCBzaG91bGQgYmUKKyAgICAvLyBleGFjdGx5IG9uZS4gIFRo
ZSBleGNlcHRpb24gaGFwcGVucyB3aGVuIHJlc2l6aW5nIHRoZSB2ZWN0b3I8UkdCQTMyQnVmZmVy
PiBpbgorICAgIC8vIEltYWdlRGVjb2Rlcjo6bV9mcmFtZUJ1ZmZlckNhY2hlLCB3aGljaCBjb3Bp
ZXMgYWxsIHRoZSBidWZmZXJzIHRvIHRoZSBuZXcKKyAgICAvLyB2ZWN0b3IsIHRodXMgdHJhbnNp
ZW50bHkgaW5jcmVtZW50aW5nIHRoZSByZWZjb3VudCB0byB0d28uCisgICAgLy8KKyAgICAvLyBU
aGUgY2hvaWNlIHRvIHVzZSBhbiBTa0JpdG1hcFJlZiBpbnN0ZWFkIG9mIGFuIFNrQml0bWFwIGlz
IG5vdCBiZWNhdXNlIG9mCisgICAgLy8gcGVyZm9ybWFuY2UgY29uY2VybnMgLS0gU2tCaXRtYXAg
cmVmY291bnRzIGl0cyBpbnRlcm5hbCBkYXRhIGFueXdheS4gIFJhdGhlciwKKyAgICAvLyB3ZSBu
ZWVkIHRoZSBhZm9yZW1lbnRpb25lZCB2ZWN0b3IgcmVzaXplIHRvIHByZXNlcnZlIHRoZSBleGFj
dCB1bmRlcmx5aW5nCisgICAgLy8gU2tCaXRtYXAgb2JqZWN0LCBzaW5jZSB3ZSBtYXkgaGF2ZSBh
bHJlYWR5IGdpdmVuIGl0cyBhZGRyZXNzIHRvCisgICAgLy8gQml0bWFwSW1hZ2U6Om1fZnJhbWVz
LiAgVXNpbmcgYW4gU2tCaXRtYXAgd291bGQgbWVhbiB0aGF0IGFmdGVyIEltYWdlRGVjb2Rlcgor
ICAgIC8vIHJlc2l6ZXMgaXRzIHZlY3RvciwgQml0bWFwSW1hZ2Ugd291bGQgYmUgaG9sZGluZyBh
IHBvaW50ZXIgdG8gZ2FyYmFnZS4KKyAgICBjbGFzcyBSR0JBMzJCdWZmZXIgeworICAgIHB1Ymxp
YzoKKyAgICAgICAgZW51bSBGcmFtZVN0YXR1cyB7IEZyYW1lRW1wdHksIEZyYW1lUGFydGlhbCwg
RnJhbWVDb21wbGV0ZSB9OworCisgICAgICAgIGVudW0gRnJhbWVEaXNwb3NhbE1ldGhvZCB7Cisg
ICAgICAgICAgICAvLyBJZiB5b3UgY2hhbmdlIHRoZSBudW1lcmljIHZhbHVlcyBvZiB0aGVzZSwg
bWFrZSBzdXJlIHlvdSBhdWRpdCBhbGwKKyAgICAgICAgICAgIC8vIHVzZXJzLCBhcyBzb21lIHVz
ZXJzIG1heSBjYXN0IHJhdyB2YWx1ZXMgdG8vZnJvbSB0aGVzZSBjb25zdGFudHMuCisgICAgICAg
ICAgICBEaXNwb3NlTm90U3BlY2lmaWVkLCAgICAgICAvLyBMZWF2ZSBmcmFtZSBpbiBmcmFtZWJ1
ZmZlcgorICAgICAgICAgICAgRGlzcG9zZUtlZXAsICAgICAgICAgICAgICAgLy8gTGVhdmUgZnJh
bWUgaW4gZnJhbWVidWZmZXIKKyAgICAgICAgICAgIERpc3Bvc2VPdmVyd3JpdGVCZ2NvbG9yLCAg
IC8vIENsZWFyIGZyYW1lIHRvIHRyYW5zcGFyZW50CisgICAgICAgICAgICBEaXNwb3NlT3Zlcndy
aXRlUHJldmlvdXMsICAvLyBDbGVhciBmcmFtZSB0byBwcmV2aW91cyBmcmFtZWJ1ZmZlciBjb250
ZW50cworICAgICAgICB9OworCisgICAgICAgIFJHQkEzMkJ1ZmZlcigpCisgICAgICAgICAgICA6
IG1fc3RhdHVzKEZyYW1lRW1wdHkpCisgICAgICAgICAgICAsIG1fZHVyYXRpb24oMCkKKyAgICAg
ICAgICAgICwgbV9kaXNwb3NhbE1ldGhvZChEaXNwb3NlTm90U3BlY2lmaWVkKQorICAgICAgICB7
CisgICAgICAgICAgICBtX2JpdG1hcFJlZiA9IFJlZkNvdW50ZWROYXRpdmVJbWFnZVNraWE6OmNy
ZWF0ZSgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gVGhpcyBjb25zdHJ1Y3RvciBkb2Vzbid0
IGNyZWF0ZSBhIG5ldyBjb3B5IG9mIHRoZSBpbWFnZSBkYXRhLCBpdCBvbmx5CisgICAgICAgIC8v
IGluY3JlYXNlcyB0aGUgcmVmIGNvdW50IG9mIHRoZSBleGlzdGluZyBiaXRtYXAuCisgICAgICAg
IFJHQkEzMkJ1ZmZlcihjb25zdCBSR0JBMzJCdWZmZXImIG90aGVyKQorICAgICAgICB7CisgICAg
ICAgICAgICBtX2JpdG1hcFJlZiA9IFJlZkNvdW50ZWROYXRpdmVJbWFnZVNraWE6OmNyZWF0ZSgp
OworICAgICAgICAgICAgb3BlcmF0b3I9KG90aGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIH5S
R0JBMzJCdWZmZXIoKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICAvLyBJbml0aWFs
aXplIHdpdGggYW5vdGhlciBidWZmZXIuICBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgY3JlYXRlIGEg
bmV3IGNvcHkKKyAgICAgICAgLy8gb2YgdGhlIGltYWdlIGRhdGEsIGl0IG9ubHkgaW5jcmVhc2Vz
IHRoZSByZWZjb3VudCBvZiB0aGUgZXhpc3RpbmcgYml0bWFwLgorICAgICAgICAvLworICAgICAg
ICAvLyBOb3JtYWwgY2FsbGVycyBzaG91bGQgbm90IGdlbmVyYWxseSBiZSB1c2luZyB0aGlzIGZ1
bmN0aW9uLiAgSWYgeW91IHdhbnQKKyAgICAgICAgLy8gdG8gY3JlYXRlIGEgY29weSBvbiB3aGlj
aCB5b3UgY2FuIG1vZGlmeSB0aGUgaW1hZ2UgZGF0YSBpbmRlcGVuZGVudGx5LAorICAgICAgICAv
LyB1c2UgY29weUJpdG1hcERhdGEoKSBpbnN0ZWFkLgorICAgICAgICBSR0JBMzJCdWZmZXImIG9w
ZXJhdG9yPShjb25zdCBSR0JBMzJCdWZmZXImIG90aGVyKQorICAgICAgICB7CisgICAgICAgICAg
ICBpZiAodGhpcyA9PSAmb3RoZXIpCisgICAgICAgICAgICAgICAgcmV0dXJuICp0aGlzOworCisg
ICAgICAgICAgICBtX2JpdG1hcFJlZiA9IG90aGVyLm1fYml0bWFwUmVmOworICAgICAgICAgICAg
c2V0UmVjdChvdGhlci5yZWN0KCkpOworICAgICAgICAgICAgc2V0U3RhdHVzKG90aGVyLnN0YXR1
cygpKTsKKyAgICAgICAgICAgIHNldER1cmF0aW9uKG90aGVyLmR1cmF0aW9uKCkpOworICAgICAg
ICAgICAgc2V0RGlzcG9zYWxNZXRob2Qob3RoZXIuZGlzcG9zYWxNZXRob2QoKSk7CisgICAgICAg
ICAgICBzZXRIYXNBbHBoYShvdGhlci5oYXNBbHBoYSgpKTsKKyAgICAgICAgICAgIHJldHVybiAq
dGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgY2xlYXIoKQorICAgICAgICB7CisgICAg
ICAgICAgICBtX2JpdG1hcFJlZiA9IFJlZkNvdW50ZWROYXRpdmVJbWFnZVNraWE6OmNyZWF0ZSgp
OworICAgICAgICAgICAgbV9yZWN0ID0gSW50UmVjdCgpOworICAgICAgICAgICAgbV9zdGF0dXMg
PSBGcmFtZUVtcHR5OworICAgICAgICAgICAgbV9kdXJhdGlvbiA9IDA7CisgICAgICAgICAgICBt
X2Rpc3Bvc2FsTWV0aG9kID0gRGlzcG9zZU5vdFNwZWNpZmllZDsKKyAgICAgICAgfQorCisgICAg
ICAgIC8vIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhIG5ldyBjb3B5IG9mIHRoZSBpbWFnZSBkYXRh
IGluIHxvdGhlcnwsIHNvIHRoZQorICAgICAgICAvLyB0d28gaW1hZ2VzIGNhbiBiZSBtb2RpZmll
ZCBpbmRlcGVuZGVudGx5LgorICAgICAgICB2b2lkIGNvcHlCaXRtYXBEYXRhKGNvbnN0IFJHQkEz
MkJ1ZmZlciYgb3RoZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh0aGlzID09ICZvdGhl
cikKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIG1fYml0bWFwUmVmID0g
UmVmQ291bnRlZE5hdGl2ZUltYWdlU2tpYTo6Y3JlYXRlKCk7CisgICAgICAgICAgICBTa0JpdG1h
cCYgYm1wID0gYml0bWFwKCk7CisgICAgICAgICAgICBjb25zdCBTa0JpdG1hcCYgb3RoZXJCbXAg
PSBvdGhlci5iaXRtYXAoKTsKKyAgICAgICAgICAgIGJtcC5zZXRDb25maWcoU2tCaXRtYXA6OmtB
UkdCXzg4ODhfQ29uZmlnLCBvdGhlci53aWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICBvdGhlci5oZWlnaHQoKSwgb3RoZXJCbXAucm93Qnl0ZXMoKSk7CisgICAgICAgICAgICBibXAu
YWxsb2NQaXhlbHMoKTsKKyAgICAgICAgICAgIGlmICh3aWR0aCgpID4gMCAmJiBoZWlnaHQoKSA+
IDApIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkoYm1wLmdldEFkZHIzMigwLCAwKSwKKyAgICAg
ICAgICAgICAgICAgICAgICAgb3RoZXJCbXAuZ2V0QWRkcjMyKDAsIDApLAorICAgICAgICAgICAg
ICAgICAgICAgICBvdGhlckJtcC5yb3dCeXRlcygpICogaGVpZ2h0KCkpOwogICAgICAgICAgICAg
fQotICAgICAgICAgICAgcG9zID0gKGEgPDwgMjQgfCByIDw8IDE2IHwgZyA8PCA4IHwgYik7CiAg
ICAgICAgIH0KLSAgICB9CiAKLXByaXZhdGU6Ci0gICAgUkdCQTMyQXJyYXkgbV9ieXRlczsKLSAg
ICBJbnRSZWN0IG1fcmVjdDsgICAgLy8gVGhlIHJlY3Qgb2YgdGhlIG9yaWdpbmFsIHNwZWNpZmll
ZCBmcmFtZSB3aXRoaW4gdGhlIG92ZXJhbGwgYnVmZmVyLgotICAgICAgICAgICAgICAgICAgICAg
ICAvLyBUaGlzIHdpbGwgYWx3YXlzIGp1c3QgYmUgdGhlIGVudGlyZSBidWZmZXIgZXhjZXB0IGZv
ciBHSUYgZnJhbWVzCi0gICAgICAgICAgICAgICAgICAgICAgIC8vIHdob3NlIG9yaWdpbmFsIHJl
Y3Qgd2FzIHNtYWxsZXIgdGhhbiB0aGUgb3ZlcmFsbCBpbWFnZSBzaXplLgotICAgIHVuc2lnbmVk
IG1faGVpZ2h0OyAvLyBUaGUgaGVpZ2h0ICh0aGUgbnVtYmVyIG9mIHJvd3Mgd2UndmUgZnVsbHkg
ZGVjb2RlZCkuCi0gICAgRnJhbWVTdGF0dXMgbV9zdGF0dXM7IC8vIFdoZXRoZXIgb3Igbm90IHRo
aXMgZnJhbWUgaXMgY29tcGxldGVseSBmaW5pc2hlZCBkZWNvZGluZy4KLSAgICB1bnNpZ25lZCBt
X2R1cmF0aW9uOyAvLyBUaGUgYW5pbWF0aW9uIGRlbGF5LgotICAgIEZyYW1lRGlzcG9zYWxNZXRo
b2QgbV9kaXNwb3NhbE1ldGhvZDsgLy8gV2hhdCB0byBkbyB3aXRoIHRoaXMgZnJhbWUncyBkYXRh
IHdoZW4gaW5pdGlhbGl6aW5nIHRoZSBuZXh0IGZyYW1lLgotICAgIGJvb2wgbV9oYXNBbHBoYTsg
Ly8gV2hldGhlciBvciBub3QgYW55IG9mIHRoZSBwaXhlbHMgaW4gdGhlIGJ1ZmZlciBoYXZlIHRy
YW5zcGFyZW5jeS4KLX07Ci0KLS8vIFRoZSBJbWFnZURlY29kZXIgY2xhc3MgcmVwcmVzZW50cyBh
IGJhc2UgY2xhc3MgZm9yIHNwZWNpZmljIGltYWdlIGZvcm1hdCBkZWNvZGVycwotLy8gKGUuZy4s
IEdJRiwgSlBHLCBQTkcsIElDTykgdG8gZGVyaXZlIGZyb20uICBBbGwgZGVjb2RlcnMgZGVjb2Rl
IGludG8gUkdCQTMyIGZvcm1hdAotLy8gYW5kIHRoZSBiYXNlIGNsYXNzIG1hbmFnZXMgdGhlIFJH
QkEzMiBmcmFtZSBjYWNoZS4KLWNsYXNzIEltYWdlRGVjb2RlcgotewotcHVibGljOgotICAgIElt
YWdlRGVjb2RlcigpIDptX3NpemVBdmFpbGFibGUoZmFsc2UpLCBtX2ZhaWxlZChmYWxzZSkge30K
LSAgICB2aXJ0dWFsIH5JbWFnZURlY29kZXIoKSB7fQotCi0gICAgLy8gVGhlIHRoZSBmaWxlbmFt
ZSBleHRlbnNpb24gdXN1YWxseSBhc3NvY2lhdGVkIHdpdGggYW4gdW5kZWNvZGVkIGltYWdlIG9m
IHRoaXMgdHlwZS4KLSAgICB2aXJ0dWFsIFN0cmluZyBmaWxlbmFtZUV4dGVuc2lvbigpIGNvbnN0
ID0gMDsKLQotICAgIC8vIEFsbCBzcGVjaWZpYyBkZWNvZGVyIHBsdWdpbnMgbXVzdCBkbyBzb21l
dGhpbmcgd2l0aCB0aGUgZGF0YSB0aGV5IGFyZSBnaXZlbi4KLSAgICB2aXJ0dWFsIHZvaWQgc2V0
RGF0YShTaGFyZWRCdWZmZXIqIGRhdGEsIGJvb2wgYWxsRGF0YVJlY2VpdmVkKSB7IG1fZGF0YSA9
IGRhdGE7IH0KLQotICAgIC8vIFdoZXRoZXIgb3Igbm90IHRoZSBzaXplIGluZm9ybWF0aW9uIGhh
cyBiZWVuIGRlY29kZWQgeWV0LgotICAgIHZpcnR1YWwgYm9vbCBpc1NpemVBdmFpbGFibGUoKSBj
b25zdCA9IDA7Ci0KLSAgICAvLyBSZXF1ZXN0cyB0aGUgc2l6ZS4KLSAgICB2aXJ0dWFsIEludFNp
emUgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fc2l6ZTsgfQotCi0gICAgLy8gVGhlIHRvdGFsIG51
bWJlciBvZiBmcmFtZXMgZm9yIHRoZSBpbWFnZS4gIENsYXNzZXMgdGhhdCBzdXBwb3J0IG11bHRp
cGxlIGZyYW1lcwotICAgIC8vIHdpbGwgc2NhbiB0aGUgaW1hZ2UgZGF0YSBmb3IgdGhlIGFuc3dl
ciBpZiB0aGV5IG5lZWQgdG8gKHdpdGhvdXQgbmVjZXNzYXJpbHkKLSAgICAvLyBkZWNvZGluZyBh
bGwgb2YgdGhlIGluZGl2aWR1YWwgZnJhbWVzKS4KLSAgICB2aXJ0dWFsIGludCBmcmFtZUNvdW50
KCkgeyByZXR1cm4gMTsgfQotCi0gICAgLy8gVGhlIG51bWJlciBvZiByZXBldGl0aW9ucyB0byBw
ZXJmb3JtIGZvciBhbiBhbmltYXRpb24gbG9vcC4KLSAgICB2aXJ0dWFsIGludCByZXBldGl0aW9u
Q291bnQoKSBjb25zdCB7IHJldHVybiBjQW5pbWF0aW9uTm9uZTsgfQotCi0gICAgLy8gQ2FsbGVk
IHRvIG9idGFpbiB0aGUgUkdCQTMyQnVmZmVyIGZ1bGwgb2YgZGVjb2RlZCBkYXRhIGZvciByZW5k
ZXJpbmcuICBUaGUKLSAgICAvLyBkZWNvZGVyIHBsdWdpbiB3aWxsIGRlY29kZSBhcyBtdWNoIG9m
IHRoZSBmcmFtZSBhcyBpdCBjYW4gYmVmb3JlIGhhbmRpbmcKLSAgICAvLyBiYWNrIHRoZSBidWZm
ZXIuCi0gICAgdmlydHVhbCBSR0JBMzJCdWZmZXIqIGZyYW1lQnVmZmVyQXRJbmRleChzaXplX3Qg
aW5kZXgpID0gMDsKLQotICAgIC8vIFdoZXRoZXIgb3Igbm90IHRoZSB1bmRlcmx5aW5nIGltYWdl
IGZvcm1hdCBldmVuIHN1cHBvcnRzIGFscGhhIHRyYW5zcGFyZW5jeS4KLSAgICB2aXJ0dWFsIGJv
b2wgc3VwcG9ydHNBbHBoYSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLQotICAgIGJvb2wgZmFp
bGVkKCkgY29uc3QgeyByZXR1cm4gbV9mYWlsZWQ7IH0KLSAgICB2b2lkIHNldEZhaWxlZCgpIHsg
bV9mYWlsZWQgPSB0cnVlOyB9Ci0KLSAgICAvLyBXaXBlIG91dCBmcmFtZXMgaW4gdGhlIGZyYW1l
IGJ1ZmZlciBjYWNoZSBiZWZvcmUgfGNsZWFyQmVmb3JlRnJhbWV8LAotICAgIC8vIGFzc3VtaW5n
IHRoaXMgY2FuIGJlIGRvbmUgd2l0aG91dCBicmVha2luZyBkZWNvZGluZy4gIERpZmZlcmVudCBk
ZWNvZGVycwotICAgIC8vIHBsYWNlIGRpZmZlcmVudCByZXN0cmljdGlvbnMgb24gd2hhdCBmcmFt
ZXMgYXJlIHNhZmUgdG8gZGVzdHJveSwgc28gdGhpcwotICAgIC8vIGlzIGxlZnQgdG8gdGhlbSB0
byBpbXBsZW1lbnQuCi0gICAgLy8gRm9yIGNvbnZlbmllbmNlJ3Mgc2FrZSwgd2UgcHJvdmlkZSBh
IGRlZmF1bHQgKGVtcHR5KSBpbXBsZW1lbnRhdGlvbiwKLSAgICAvLyBzaW5jZSBpbiBwcmFjdGlj
ZSBvbmx5IEdJRnMgd2lsbCBldmVyIHVzZSB0aGlzLgotICAgIHZpcnR1YWwgdm9pZCBjbGVhckZy
YW1lQnVmZmVyQ2FjaGUoc2l6ZV90IGNsZWFyQmVmb3JlRnJhbWUpIHsgfQotCi1wcm90ZWN0ZWQ6
Ci0gICAgUmVmUHRyPFNoYXJlZEJ1ZmZlcj4gbV9kYXRhOyAvLyBUaGUgZW5jb2RlZCBkYXRhLgot
ICAgIFZlY3RvcjxSR0JBMzJCdWZmZXI+IG1fZnJhbWVCdWZmZXJDYWNoZTsKLSAgICBib29sIG1f
c2l6ZUF2YWlsYWJsZTsKLSAgICBtdXRhYmxlIGJvb2wgbV9mYWlsZWQ7Ci0gICAgSW50U2l6ZSBt
X3NpemU7Ci19OworICAgICAgICBOYXRpdmVJbWFnZVNraWEmIGJpdG1hcCgpIHsgcmV0dXJuIG1f
Yml0bWFwUmVmLT5iaXRtYXAoKTsgfQorICAgICAgICBjb25zdCBOYXRpdmVJbWFnZVNraWEmIGJp
dG1hcCgpIGNvbnN0IHsgcmV0dXJuIG1fYml0bWFwUmVmLT5iaXRtYXAoKTsgfQorCisgICAgICAg
IC8vIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBhbnkgcGl4ZWxzIGFyZSB3cml0dGVuLiBXaWxsIHJl
dHVybiB0cnVlIG9uCisgICAgICAgIC8vIHN1Y2Nlc3MsIGZhbHNlIGlmIHRoZSBtZW1vcnkgYWxs
b2NhdGlvbiBmYWlscy4KKyAgICAgICAgYm9vbCBzZXRTaXplKGludCB3aWR0aCwgaW50IGhlaWdo
dCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVGhpcyBmdW5jdGlvbiBzaG91bGQgb25seSBi
ZSBjYWxsZWQgb25jZSwgaXQgd2lsbCBsZWFrIG1lbW9yeQorICAgICAgICAgICAgLy8gb3RoZXJ3
aXNlLgorICAgICAgICAgICAgU2tCaXRtYXAmIGJtcCA9IGJpdG1hcCgpOworICAgICAgICAgICAg
QVNTRVJUKGJtcC53aWR0aCgpID09IDAgJiYgYm1wLmhlaWdodCgpID09IDApOworICAgICAgICAg
ICAgYm1wLnNldENvbmZpZyhTa0JpdG1hcDo6a0FSR0JfODg4OF9Db25maWcsIHdpZHRoLCBoZWln
aHQpOworICAgICAgICAgICAgaWYgKCFibXAuYWxsb2NQaXhlbHMoKSkKKyAgICAgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7ICAvLyBBbGxvY2F0aW9uIGZhaWx1cmUsIG1heWJlIHRoZSBiaXRtYXAg
d2FzIHRvbyBiaWcuCisKKyAgICAgICAgICAgIC8vIENsZWFyIHRoZSBpbWFnZS4KKyAgICAgICAg
ICAgIGJtcC5lcmFzZUFSR0IoMCwgMCwgMCwgMCk7CisKKyAgICAgICAgICAgIHJldHVybiB0cnVl
OworICAgICAgICB9CisKKyAgICAgICAgaW50IHdpZHRoKCkgY29uc3QgeyByZXR1cm4gYml0bWFw
KCkud2lkdGgoKTsgfQorICAgICAgICBpbnQgaGVpZ2h0KCkgY29uc3QgeyByZXR1cm4gYml0bWFw
KCkuaGVpZ2h0KCk7IH0KKworICAgICAgICBjb25zdCBJbnRSZWN0JiByZWN0KCkgY29uc3QgeyBy
ZXR1cm4gbV9yZWN0OyB9CisgICAgICAgIEZyYW1lU3RhdHVzIHN0YXR1cygpIGNvbnN0IHsgcmV0
dXJuIG1fc3RhdHVzOyB9CisgICAgICAgIHVuc2lnbmVkIGR1cmF0aW9uKCkgY29uc3QgeyByZXR1
cm4gbV9kdXJhdGlvbjsgfQorICAgICAgICBGcmFtZURpc3Bvc2FsTWV0aG9kIGRpc3Bvc2FsTWV0
aG9kKCkgY29uc3QgeyByZXR1cm4gbV9kaXNwb3NhbE1ldGhvZDsgfQorICAgICAgICBib29sIGhh
c0FscGhhKCkgY29uc3QgeyByZXR1cm4gIWJpdG1hcCgpLmlzT3BhcXVlKCk7IH0KKworICAgICAg
ICB2b2lkIHNldFJlY3QoY29uc3QgSW50UmVjdCYgcikgeyBtX3JlY3QgPSByOyB9CisgICAgICAg
IHZvaWQgc2V0U3RhdHVzKEZyYW1lU3RhdHVzIHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlm
IChzID09IEZyYW1lQ29tcGxldGUpCisgICAgICAgICAgICAgICAgbV9iaXRtYXBSZWYtPmJpdG1h
cCgpLnNldERhdGFDb21wbGV0ZSgpOyAgLy8gVGVsbCB0aGUgYml0bWFwIGl0J3MgZG9uZS4KKyAg
ICAgICAgICAgIG1fc3RhdHVzID0gczsKKyAgICAgICAgfQorICAgICAgICB2b2lkIHNldER1cmF0
aW9uKHVuc2lnbmVkIGR1cmF0aW9uKSB7IG1fZHVyYXRpb24gPSBkdXJhdGlvbjsgfQorICAgICAg
ICB2b2lkIHNldERpc3Bvc2FsTWV0aG9kKEZyYW1lRGlzcG9zYWxNZXRob2QgbWV0aG9kKSB7IG1f
ZGlzcG9zYWxNZXRob2QgPSBtZXRob2Q7IH0KKyAgICAgICAgdm9pZCBzZXRIYXNBbHBoYShib29s
IGFscGhhKSB7IGJpdG1hcCgpLnNldElzT3BhcXVlKCFhbHBoYSk7IH0KKworICAgICAgICBzdGF0
aWMgdm9pZCBzZXRSR0JBKHVpbnQzMl90KiBkZXN0LCB1aW50OF90IHIsIHVpbnQ4X3QgZywgdWlu
dDhfdCBiLCB1aW50OF90IGEpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFdlIHN0b3JlIHRo
aXMgZGF0YSBwcmUtbXVsdGlwbGllZC4KKyAgICAgICAgICAgIGlmIChhID09IDApCisgICAgICAg
ICAgICAgICAgKmRlc3QgPSAwOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAg
aWYgKGEgPCAyNTUpIHsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgYWxwaGFQZXJjZW50ID0g
YSAvIDI1NS4wZjsKKyAgICAgICAgICAgICAgICAgICAgciA9IHN0YXRpY19jYXN0PHVuc2lnbmVk
PihyICogYWxwaGFQZXJjZW50KTsKKyAgICAgICAgICAgICAgICAgICAgZyA9IHN0YXRpY19jYXN0
PHVuc2lnbmVkPihnICogYWxwaGFQZXJjZW50KTsKKyAgICAgICAgICAgICAgICAgICAgYiA9IHN0
YXRpY19jYXN0PHVuc2lnbmVkPihiICogYWxwaGFQZXJjZW50KTsKKyAgICAgICAgICAgICAgICB9
CisgICAgICAgICAgICAgICAgKmRlc3QgPSAoYSA8PCAyNCB8IHIgPDwgMTYgfCBnIDw8IDggfCBi
KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgc2V0UkdCQShpbnQg
eCwgaW50IHksIHVpbnQ4X3QgciwgdWludDhfdCBnLCB1aW50OF90IGIsIHVpbnQ4X3QgYSkKKyAg
ICAgICAgeworICAgICAgICAgICAgc2V0UkdCQShiaXRtYXAoKS5nZXRBZGRyMzIoeCwgeSksIHIs
IGcsIGIsIGEpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBSZWZQdHI8UmVm
Q291bnRlZE5hdGl2ZUltYWdlU2tpYT4gbV9iaXRtYXBSZWY7CisgICAgICAgIEludFJlY3QgbV9y
ZWN0OyAgICAvLyBUaGUgcmVjdCBvZiB0aGUgb3JpZ2luYWwgc3BlY2lmaWVkIGZyYW1lIHdpdGhp
biB0aGUgb3ZlcmFsbCBidWZmZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlz
IHdpbGwgYWx3YXlzIGp1c3QgYmUgdGhlIGVudGlyZSBidWZmZXIgZXhjZXB0IGZvciBHSUYgZnJh
bWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aG9zZSBvcmlnaW5hbCByZWN0IHdh
cyBzbWFsbGVyIHRoYW4gdGhlIG92ZXJhbGwgaW1hZ2Ugc2l6ZS4KKyAgICAgICAgRnJhbWVTdGF0
dXMgbV9zdGF0dXM7IC8vIFdoZXRoZXIgb3Igbm90IHRoaXMgZnJhbWUgaXMgY29tcGxldGVseSBm
aW5pc2hlZCBkZWNvZGluZy4KKyAgICAgICAgdW5zaWduZWQgbV9kdXJhdGlvbjsgLy8gVGhlIGFu
aW1hdGlvbiBkZWxheS4KKyAgICAgICAgRnJhbWVEaXNwb3NhbE1ldGhvZCBtX2Rpc3Bvc2FsTWV0
aG9kOyAvLyBXaGF0IHRvIGRvIHdpdGggdGhpcyBmcmFtZSdzIGRhdGEgd2hlbiBpbml0aWFsaXpp
bmcgdGhlIG5leHQgZnJhbWUuCisgICAgfTsKKworICAgIC8vIFRoZSBJbWFnZURlY29kZXIgY2xh
c3MgcmVwcmVzZW50cyBhIGJhc2UgY2xhc3MgZm9yIHNwZWNpZmljIGltYWdlIGZvcm1hdCBkZWNv
ZGVycworICAgIC8vIChlLmcuLCBHSUYsIEpQRywgUE5HLCBJQ08pIHRvIGRlcml2ZSBmcm9tLiAg
QWxsIGRlY29kZXJzIGRlY29kZSBpbnRvIFJHQkEzMiBmb3JtYXQKKyAgICAvLyBhbmQgdGhlIGJh
c2UgY2xhc3MgbWFuYWdlcyB0aGUgUkdCQTMyIGZyYW1lIGNhY2hlLgorICAgIGNsYXNzIEltYWdl
RGVjb2RlciB7CisgICAgcHVibGljOgorICAgICAgICBJbWFnZURlY29kZXIoKSA6IG1fZmFpbGVk
KGZhbHNlKSwgbV9zaXplQXZhaWxhYmxlKGZhbHNlKSAge30KKyAgICAgICAgdmlydHVhbCB+SW1h
Z2VEZWNvZGVyKCkge30KKworICAgICAgICAvLyBUaGUgdGhlIGZpbGVuYW1lIGV4dGVuc2lvbiB1
c3VhbGx5IGFzc29jaWF0ZWQgd2l0aCBhbiB1bmRlY29kZWQgaW1hZ2Ugb2YgdGhpcyB0eXBlLgor
ICAgICAgICB2aXJ0dWFsIFN0cmluZyBmaWxlbmFtZUV4dGVuc2lvbigpIGNvbnN0ID0gMDsKKwor
ICAgICAgICAvLyBBbGwgc3BlY2lmaWMgZGVjb2RlciBwbHVnaW5zIG11c3QgZG8gc29tZXRoaW5n
IHdpdGggdGhlIGRhdGEgdGhleSBhcmUgZ2l2ZW4uCisgICAgICAgIHZpcnR1YWwgdm9pZCBzZXRE
YXRhKFNoYXJlZEJ1ZmZlciogZGF0YSwgYm9vbCBhbGxEYXRhUmVjZWl2ZWQpIHsgbV9kYXRhID0g
ZGF0YTsgfQorCisgICAgICAgIC8vIFdoZXRoZXIgb3Igbm90IHRoZSBzaXplIGluZm9ybWF0aW9u
IGhhcyBiZWVuIGRlY29kZWQgeWV0LiBUaGlzIGRlZmF1bHQKKyAgICAgICAgLy8gaW1wbGVtZW50
YXRpb24ganVzdCByZXR1cm5zIHRydWUgaWYgdGhlIHNpemUgaGFzIGJlZW4gc2V0IGFuZCB3ZSBo
YXZlIG5vdAorICAgICAgICAvLyBzZWVuIGEgZmFpbHVyZS4gRGVjb2RlcnMgbWF5IHdhbnQgdG8g
b3ZlcnJpZGUgdGhpcyB0byBsYXppbHkgZGVjb2RlCisgICAgICAgIC8vIGVub3VnaCBvZiB0aGUg
aW1hZ2UgdG8gZ2V0IHRoZSBzaXplLgorICAgICAgICB2aXJ0dWFsIGJvb2wgaXNTaXplQXZhaWxh
YmxlKCkgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICFtX2ZhaWxlZCAmJiBt
X3NpemVBdmFpbGFibGU7IAorICAgICAgICB9CisKKyAgICAgICAgLy8gUmVxdWVzdHMgdGhlIHNp
emUuCisgICAgICAgIHZpcnR1YWwgSW50U2l6ZSBzaXplKCkgY29uc3QKKyAgICAgICAgeworICAg
ICAgICAgICAgLy8gUmVxdWVzdGluZyB0aGUgc2l6ZSBvZiBhbiBpbnZhbGlkIGJpdG1hcCBpcyBt
ZWFuaW5nbGVzcy4KKyAgICAgICAgICAgIEFTU0VSVCghbV9mYWlsZWQpOworICAgICAgICAgICAg
cmV0dXJuIG1fc2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRoZSB0b3RhbCBudW1iZXIg
b2YgZnJhbWVzIGZvciB0aGUgaW1hZ2UuICBDbGFzc2VzIHRoYXQgc3VwcG9ydCBtdWx0aXBsZSBm
cmFtZXMKKyAgICAgICAgLy8gd2lsbCBzY2FuIHRoZSBpbWFnZSBkYXRhIGZvciB0aGUgYW5zd2Vy
IGlmIHRoZXkgbmVlZCB0byAod2l0aG91dCBuZWNlc3NhcmlseQorICAgICAgICAvLyBkZWNvZGlu
ZyBhbGwgb2YgdGhlIGluZGl2aWR1YWwgZnJhbWVzKS4KKyAgICAgICAgdmlydHVhbCBpbnQgZnJh
bWVDb3VudCgpIHsgcmV0dXJuIDE7IH0KKworICAgICAgICAvLyBUaGUgbnVtYmVyIG9mIHJlcGV0
aXRpb25zIHRvIHBlcmZvcm0gZm9yIGFuIGFuaW1hdGlvbiBsb29wLgorICAgICAgICB2aXJ0dWFs
IGludCByZXBldGl0aW9uQ291bnQoKSBjb25zdCB7IHJldHVybiBjQW5pbWF0aW9uTm9uZTsgfQor
CisgICAgICAgIC8vIENhbGxlZCB0byBvYnRhaW4gdGhlIFJHQkEzMkJ1ZmZlciBmdWxsIG9mIGRl
Y29kZWQgZGF0YSBmb3IgcmVuZGVyaW5nLiAgVGhlCisgICAgICAgIC8vIGRlY29kZXIgcGx1Z2lu
IHdpbGwgZGVjb2RlIGFzIG11Y2ggb2YgdGhlIGZyYW1lIGFzIGl0IGNhbiBiZWZvcmUgaGFuZGlu
ZworICAgICAgICAvLyBiYWNrIHRoZSBidWZmZXIuCisgICAgICAgIHZpcnR1YWwgUkdCQTMyQnVm
ZmVyKiBmcmFtZUJ1ZmZlckF0SW5kZXgoc2l6ZV90IGluZGV4KSA9IDA7CisKKyAgICAgICAgLy8g
V2hldGhlciBvciBub3QgdGhlIHVuZGVybHlpbmcgaW1hZ2UgZm9ybWF0IGV2ZW4gc3VwcG9ydHMg
YWxwaGEgdHJhbnNwYXJlbmN5LgorICAgICAgICB2aXJ0dWFsIGJvb2wgc3VwcG9ydHNBbHBoYSgp
IGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKworICAgICAgICBib29sIGZhaWxlZCgpIGNvbnN0IHsg
cmV0dXJuIG1fZmFpbGVkOyB9CisgICAgICAgIHZvaWQgc2V0RmFpbGVkKCkgeyBtX2ZhaWxlZCA9
IHRydWU7IH0KKworICAgICAgICAvLyBXaXBlIG91dCBmcmFtZXMgaW4gdGhlIGZyYW1lIGJ1ZmZl
ciBjYWNoZSBiZWZvcmUgfGNsZWFyQmVmb3JlRnJhbWV8LAorICAgICAgICAvLyBhc3N1bWluZyB0
aGlzIGNhbiBiZSBkb25lIHdpdGhvdXQgYnJlYWtpbmcgZGVjb2RpbmcuICBEaWZmZXJlbnQgZGVj
b2RlcnMKKyAgICAgICAgLy8gcGxhY2UgZGlmZmVyZW50IHJlc3RyaWN0aW9ucyBvbiB3aGF0IGZy
YW1lcyBhcmUgc2FmZSB0byBkZXN0cm95LCBzbyB0aGlzCisgICAgICAgIC8vIGlzIGxlZnQgdG8g
dGhlbSB0byBpbXBsZW1lbnQuCisgICAgICAgIC8vIEZvciBjb252ZW5pZW5jZSdzIHNha2UsIHdl
IHByb3ZpZGUgYSBkZWZhdWx0IChlbXB0eSkgaW1wbGVtZW50YXRpb24sCisgICAgICAgIC8vIHNp
bmNlIGluIHByYWN0aWNlIG9ubHkgR0lGcyB3aWxsIGV2ZXIgdXNlIHRoaXMuCisgICAgICAgIHZp
cnR1YWwgdm9pZCBjbGVhckZyYW1lQnVmZmVyQ2FjaGUoc2l6ZV90IGNsZWFyQmVmb3JlRnJhbWUp
IHsgfQorCisgICAgcHJvdGVjdGVkOgorICAgICAgICAvLyBDYWxsZWQgYnkgdGhlIGltYWdlIGRl
Y29kZXJzIHRvIHNldCB0aGVpciBkZWNvZGVkIHNpemUsIHRoaXMgYWxzbyBjaGVjaworICAgICAg
ICAvLyB0aGUgc2l6ZSBmb3IgdmFsaWRpdHkuIEl0IHdpbGwgcmV0dXJuIHRydWUgaWYgdGhlIHNp
emUgd2FzIHNldCwgb3IgZmFsc2UKKyAgICAgICAgLy8gaWYgdGhlcmUgaXMgYW4gZXJyb3IuIE9u
IGVycm9yLCB0aGUgbV9mYWlsZWQgZmxhZyB3aWxsIGJlIHNldCBhbmQgdGhlCisgICAgICAgIC8v
IGNhbGxlciBzaG91bGQgaW1tZWRpYXRlbHkgc3RvcCBkZWNvZGluZy4KKyAgICAgICAgYm9vbCBz
ZXRTaXplKHVuc2lnbmVkIHdpZHRoLCB1bnNpZ25lZCBoZWlnaHQpCisgICAgICAgIHsKKyAgICAg
ICAgICAgIGlmIChpc092ZXJTaXplKHdpZHRoLCBoZWlnaHQpKSB7CisgICAgICAgICAgICAgICAg
bV9mYWlsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIG1fc2l6ZSA9IEludFNpemUod2lkdGgsIGhlaWdodCk7CisgICAg
ICAgICAgICBtX3NpemVBdmFpbGFibGUgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuIHRydWU7
CisgICAgICAgIH0KKworICAgICAgICBSZWZQdHI8U2hhcmVkQnVmZmVyPiBtX2RhdGE7IC8vIFRo
ZSBlbmNvZGVkIGRhdGEuCisgICAgICAgIFZlY3RvcjxSR0JBMzJCdWZmZXI+IG1fZnJhbWVCdWZm
ZXJDYWNoZTsKKyAgICAgICAgbXV0YWJsZSBib29sIG1fZmFpbGVkOworCisgICAgcHJpdmF0ZToK
KyAgICAgICAgLy8gVGhpcyBmdW5jdGlvbiBhbGxvd3MgdXMgdG8gbWFrZSBzdXJlIHRoZSBpbWFn
ZSBpcyBub3QgdG9vIGxhcmdlLiBWZXJ5CisgICAgICAgIC8vIGxhcmdlIGltYWdlcywgZXZlbiBp
ZiB0aGUgYWxsb2NhdGlvbiBzdWNjZWVkcywgY2FuIHRha2UgYSB2ZXJ5IGxvbmcgdGltZQorICAg
ICAgICAvLyB0byBwcm9jZXNzLCBnaXZpbmcgdGhlIGFwcGVhcmFuY2Ugb2YgYSBEb1MuCisgICAg
ICAgIC8vCisgICAgICAgIC8vIFdlYktpdCBhbHNvIHNlZW1zIHRvIGxpa2UgdG8gYXNrIGZvciB0
aGUgc2l6ZSBiZWZvcmUgZGF0YSBpcyBhdmFpbGFibGUKKyAgICAgICAgLy8gYW5kIGluIHNvbWUg
Y2FzZXMgd2hlbiB0aGUgZmFpbGVkIGZsYWcgaXMgc2V0LiBTb21lIG9mIHRoZXNlIGNvZGUgcGF0
aHMKKyAgICAgICAgLy8gc3VjaCBhcyBCaXRtYXBJbWFnZTo6cmVzZXRBbmltYXRpb24gdGhlbiBj
b21wdXRlIHRoZSBzaXplIG9mIHRoZSBpbWFnZQorICAgICAgICAvLyBiYXNlZCBvbiB0aGUgd2lk
dGggYW5kIGhlaWdodC4gQmVjYXVzZSBvZiB0aGlzLCBvdXIgdG90YWwgY29tcHV0ZWQgaW1hZ2UK
KyAgICAgICAgLy8gYnl0ZSBzaXplIG11c3QgbmV2ZXIgb3ZlcmZsb3cgYW4gaW50LgorICAgICAg
ICBzdGF0aWMgYm9vbCBpc092ZXJTaXplKHVuc2lnbmVkIHdpZHRoLCB1bnNpZ25lZCBoZWlnaHQp
CisgICAgICAgIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyB0b3RhbF9zaXplID0g
c3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBsb25nPih3aWR0aCkKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICogc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBsb25n
PihoZWlnaHQpOworICAgICAgICAgICAgaWYgKHRvdGFsX3NpemUgPiAzMiAqIDEwMjQgKiAxMDI0
KSAgLy8gMzJNID0gMTI4TUIgbWVtb3J5IHRvdGFsICgzMiBicHApLgorICAgICAgICAgICAgICAg
IHJldHVybiB0cnVlOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAg
ICAgICAgSW50U2l6ZSBtX3NpemU7CisgICAgICAgIGJvb2wgbV9zaXplQXZhaWxhYmxlOworICAg
IH07CiAKLX0KK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKIAogI2VuZGlmCkluZGV4OiBwbGF0Zm9y
bS9pbWFnZS1kZWNvZGVycy9za2lhL0pQRUdJbWFnZURlY29kZXIuY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IHBsYXRmb3JtL2ltYWdlLWRlY29kZXJzL3NraWEvSlBFR0ltYWdlRGVjb2Rlci5jcHAJKHJldmlz
aW9uIDQwMTY1KQorKysgcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvc2tpYS9KUEVHSW1hZ2VEZWNv
ZGVyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSw1ICsxLDYgQEAKIC8qCiAgKiBDb3B5cmlnaHQg
KEMpIDIwMDYgQXBwbGUgQ29tcHV0ZXIsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwOCwgMjAw
OSBHb29nbGUsIEluYy4KICAqCiAgKiBQb3J0aW9ucyBhcmUgQ29weXJpZ2h0IChDKSAyMDAxLTYg
bW96aWxsYS5vcmcKICAqCkBAIC0zOCwzNCArMzksMTEgQEAKICNpbmNsdWRlICJjb25maWcuaCIK
ICNpbmNsdWRlICJKUEVHSW1hZ2VEZWNvZGVyLmgiCiAjaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5j
bHVkZSA8c3RkaW8uaD4KLQotI2lmIFBMQVRGT1JNKENBSVJPKSB8fCBQTEFURk9STShRVCkgfHwg
UExBVEZPUk0oV1gpCi0KLSNpZiBDT01QSUxFUihNU1ZDKQotLy8gUmVtb3ZlIHdhcm5pbmdzIGZy
b20gd2FybmluZyBsZXZlbCA0LgotI3ByYWdtYSB3YXJuaW5nKGRpc2FibGUgOiA0NjExKSAvLyB3
YXJuaW5nIEM0NjExOiBpbnRlcmFjdGlvbiBiZXR3ZWVuICdfc2V0am1wJyBhbmQgQysrIG9iamVj
dCBkZXN0cnVjdGlvbiBpcyBub24tcG9ydGFibGUKLQotLy8gaWYgQUREUkVTU19UQUdfQklUIGlz
IGRmaW5lZCwgSU5UMzIgaGFzIGJlZW4gZGVjbGFyZWQgYXMgYSB0eXBlZGVmIGluIHRoZSBQbGF0
Zm9ybVNESyAoQmFzZVRzZC5oKSwKLS8vIHNvIHdlIG5lZWQgdG8gc3RvcCBqcGVnbGliLmggZnJv
bSB0cnlpbmcgdG8gI2RlZmluZSBpdCAKLS8vIHNlZSBoZXJlIGZvciBtb3JlIGluZm86IGh0dHA6
Ly93d3cuY3lnd2luLmNvbS9tbC9jeWd3aW4vMjAwNC0wNy9tc2cwMTA1MS5odG1sCi0jIGlmIGRl
ZmluZWQoQUREUkVTU19UQUdfQklUKSAmJiAhZGVmaW5lZChYTURfSCkKLSMgIGRlZmluZSBYTURf
SAotIyAgZGVmaW5lIFZUS19KUEVHX1hNRF9ICi0jIGVuZGlmCi0jZW5kaWYgLy8gQ09NUElMRVIo
TVNWQykKIAogZXh0ZXJuICJDIiB7CiAjaW5jbHVkZSAianBlZ2xpYi5oIgogfQogCi0jaWYgQ09N
UElMRVIoTVNWQykKLSMgaWYgZGVmaW5lZChWVEtfSlBFR19YTURfSCkKLSMgIHVuZGVmIFZUS19K
UEVHX1hNRF9ICi0jICB1bmRlZiBYTURfSAotIyBlbmRpZgotI2VuZGlmIC8vIENPTVBJTEVSKE1T
VkMpCi0KICNpbmNsdWRlIDxzZXRqbXAuaD4KIAogbmFtZXNwYWNlIFdlYkNvcmUgewpAQCAtMTIx
LDcgKzk5LDcgQEAgcHVibGljOgogICAgICAgICAvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBK
UEVHIGRlY29tcHJlc3Npb24gb2JqZWN0ICovCiAgICAgICAgIGpwZWdfY3JlYXRlX2RlY29tcHJl
c3MoJm1faW5mbyk7CiAgIAotICAgICAgICBkZWNvZGVyX3NvdXJjZV9tZ3IqIHNyYyA9IDA7Cisg
ICAgICAgIGRlY29kZXJfc291cmNlX21nciogc3JjID0gTlVMTDsKICAgICAgICAgaWYgKCFtX2lu
Zm8uc3JjKSB7CiAgICAgICAgICAgICBzcmMgPSAoZGVjb2Rlcl9zb3VyY2VfbWdyKilmYXN0Q2Fs
bG9jKHNpemVvZihkZWNvZGVyX3NvdXJjZV9tZ3IpLCAxKTsKICAgICAgICAgICAgIGlmICghc3Jj
KSB7CkBAIC0yMzYsNyArMjE0LDEwIEBAIHB1YmxpYzoKICAgICAgICAgICAgICAgICBtX3N0YXRl
ID0gSlBFR19TVEFSVF9ERUNPTVBSRVNTOwogCiAgICAgICAgICAgICAgICAgLy8gV2UgY2FuIGZp
bGwgaW4gdGhlIHNpemUgbm93IHRoYXQgdGhlIGhlYWRlciBpcyBhdmFpbGFibGUuCi0gICAgICAg
ICAgICAgICAgbV9kZWNvZGVyLT5zZXRTaXplKG1faW5mby5pbWFnZV93aWR0aCwgbV9pbmZvLmlt
YWdlX2hlaWdodCk7CisgICAgICAgICAgICAgICAgaWYgKCFtX2RlY29kZXItPnNldFNpemUobV9p
bmZvLmltYWdlX3dpZHRoLCBtX2luZm8uaW1hZ2VfaGVpZ2h0KSkgeworICAgICAgICAgICAgICAg
ICAgICBtX3N0YXRlID0gSlBFR19FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmIChtX2RlY29kaW5n
U2l6ZU9ubHkpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gV2UgY2FuIHN0b3AgaGVyZS4KQEAg
LTQzMSw3ICs0MTIsNyBAQCB2b2lkIEpQRUdJbWFnZURlY29kZXI6OnNldERhdGEoU2hhcmVkQnVm
CiBib29sIEpQRUdJbWFnZURlY29kZXI6OmlzU2l6ZUF2YWlsYWJsZSgpIGNvbnN0CiB7CiAgICAg
Ly8gSWYgd2UgaGF2ZSBwZW5kaW5nIGRhdGEgdG8gZGVjb2RlLCBzZW5kIGl0IHRvIHRoZSBKUEVH
IHJlYWRlciBub3cuCi0gICAgaWYgKCFtX3NpemVBdmFpbGFibGUgJiYgbV9yZWFkZXIpIHsKKyAg
ICBpZiAoIUltYWdlRGVjb2Rlcjo6aXNTaXplQXZhaWxhYmxlKCkgJiYgbV9yZWFkZXIpIHsKICAg
ICAgICAgaWYgKG1fZmFpbGVkKQogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCkBAIC00NDAs
NyArNDIxLDcgQEAgYm9vbCBKUEVHSW1hZ2VEZWNvZGVyOjppc1NpemVBdmFpbGFibGUoKQogICAg
ICAgICBkZWNvZGUodHJ1ZSk7CiAgICAgfQogCi0gICAgcmV0dXJuIG1fc2l6ZUF2YWlsYWJsZTsK
KyAgICByZXR1cm4gIW1fZmFpbGVkICYmIEltYWdlRGVjb2Rlcjo6aXNTaXplQXZhaWxhYmxlKCk7
CiB9CiAKIFJHQkEzMkJ1ZmZlciogSlBFR0ltYWdlRGVjb2Rlcjo6ZnJhbWVCdWZmZXJBdEluZGV4
KHNpemVfdCBpbmRleCkKQEAgLTQ4MCwzNyArNDYxLDM5IEBAIGJvb2wgSlBFR0ltYWdlRGVjb2Rl
cjo6b3V0cHV0U2NhbmxpbmVzKCkKICAgICAvLyBSZXNpemUgdG8gdGhlIHdpZHRoIGFuZCBoZWln
aHQgb2YgdGhlIGltYWdlLgogICAgIFJHQkEzMkJ1ZmZlciYgYnVmZmVyID0gbV9mcmFtZUJ1ZmZl
ckNhY2hlWzBdOwogICAgIGlmIChidWZmZXIuc3RhdHVzKCkgPT0gUkdCQTMyQnVmZmVyOjpGcmFt
ZUVtcHR5KSB7Ci0gICAgICAgIC8vIExldCdzIHJlc2l6ZSBvdXIgYnVmZmVyIG5vdyB0byB0aGUg
Y29ycmVjdCB3aWR0aC9oZWlnaHQuCi0gICAgICAgIFJHQkEzMkFycmF5JiBieXRlcyA9IGJ1ZmZl
ci5ieXRlcygpOwotICAgICAgICBieXRlcy5yZXNpemUobV9zaXplLndpZHRoKCkgKiBtX3NpemUu
aGVpZ2h0KCkpOworICAgICAgICAvLyBMZXQncyByZXNpemUgb3VyIGJ1ZmZlciBub3cgdG8gdGhl
IGNvcnJlY3Qgd2lkdGgvaGVpZ2h0LiBUaGlzIHdpbGwKKyAgICAgICAgLy8gYWxzbyBpbml0aWFs
aXplIGl0IHRvIHRyYW5zcGFyZW50LgorICAgICAgICBpZiAoIWJ1ZmZlci5zZXRTaXplKHNpemUo
KS53aWR0aCgpLCBzaXplKCkuaGVpZ2h0KCkpKSB7CisgICAgICAgICAgICBtX2ZhaWxlZCA9IHRy
dWU7CisgICAgICAgICAgICBidWZmZXIuc2V0U3RhdHVzKFJHQkEzMkJ1ZmZlcjo6RnJhbWVDb21w
bGV0ZSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KIAogICAgICAgICAv
LyBVcGRhdGUgb3VyIHN0YXR1cyB0byBiZSBwYXJ0aWFsbHkgY29tcGxldGUuCiAgICAgICAgIGJ1
ZmZlci5zZXRTdGF0dXMoUkdCQTMyQnVmZmVyOjpGcmFtZVBhcnRpYWwpOwogCiAgICAgICAgIC8v
IEZvciBKUEVHcywgdGhlIGZyYW1lIGFsd2F5cyBmaWxscyB0aGUgZW50aXJlIGltYWdlLgotICAg
ICAgICBidWZmZXIuc2V0UmVjdChJbnRSZWN0KDAsIDAsIG1fc2l6ZS53aWR0aCgpLCBtX3NpemUu
aGVpZ2h0KCkpKTsKKyAgICAgICAgYnVmZmVyLnNldFJlY3QoSW50UmVjdCgwLCAwLCBzaXplKCku
d2lkdGgoKSwgc2l6ZSgpLmhlaWdodCgpKSk7CiAKLSAgICAgICAgLy8gV2UgZG9uJ3QgaGF2ZSBh
bHBoYSAodGhpcyBpcyB0aGUgZGVmYXVsdCB3aGVuIHRoZSBidWZmZXIgaXMgY29uc3RydWN0ZWQp
LgorICAgICAgICAvLyBXZSBkb24ndCBoYXZlIGFscGhhICh0aGlzIGlzIHRoZSBkZWZhdWx0IHdo
ZW4gdGhlIGJ1ZmZlciBpcyBjb25zdHJ1Y3RlZCkuCQkJCiAgICAgfQogCiAgICAganBlZ19kZWNv
bXByZXNzX3N0cnVjdCogaW5mbyA9IG1fcmVhZGVyLT5pbmZvKCk7CiAgICAgSlNBTVBBUlJBWSBz
YW1wbGVzID0gbV9yZWFkZXItPnNhbXBsZXMoKTsKIAotICAgIHVuc2lnbmVkKiBkc3QgPSBidWZm
ZXIuYnl0ZXMoKS5kYXRhKCkgKyBpbmZvLT5vdXRwdXRfc2NhbmxpbmUgKiBtX3NpemUud2lkdGgo
KTsKLSAgIAogICAgIHdoaWxlIChpbmZvLT5vdXRwdXRfc2NhbmxpbmUgPCBpbmZvLT5vdXRwdXRf
aGVpZ2h0KSB7CiAgICAgICAgIC8qIFJlcXVlc3Qgb25lIHNjYW5saW5lLiAgUmV0dXJucyAwIG9y
IDEgc2NhbmxpbmVzLiAqLwogICAgICAgICBpZiAoanBlZ19yZWFkX3NjYW5saW5lcyhpbmZvLCBz
YW1wbGVzLCAxKSAhPSAxKQogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICBKU0FN
UExFICpqMSA9IHNhbXBsZXNbMF07Ci0gICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBp
bmZvLT5vdXRwdXRfd2lkdGg7ICsraSkgeworICAgICAgICBmb3IgKHVuc2lnbmVkIHggPSAwOyB4
IDwgaW5mby0+b3V0cHV0X3dpZHRoOyArK3gpIHsKICAgICAgICAgICAgIHVuc2lnbmVkIHIgPSAq
ajErKzsKICAgICAgICAgICAgIHVuc2lnbmVkIGcgPSAqajErKzsKICAgICAgICAgICAgIHVuc2ln
bmVkIGIgPSAqajErKzsKLSAgICAgICAgICAgIFJHQkEzMkJ1ZmZlcjo6c2V0UkdCQSgqZHN0Kyss
IHIsIGcsIGIsIDB4RkYpOworICAgICAgICAgICAgLy8gcmVhZF9zY2FubGluZXMgaGFzIGluY3Jl
YXNlZCB0aGUgc2NhbmxpbmUgY291bnRlciwgc28gd2UKKyAgICAgICAgICAgIC8vIGFjdHVhbGx5
IG1lYW4gdGhlIHByZXZpb3VzIG9uZS4KKyAgICAgICAgICAgIGJ1ZmZlci5zZXRSR0JBKHgsIGlu
Zm8tPm91dHB1dF9zY2FubGluZSAtIDEsIHIsIGcsIGIsIDB4RkYpOwogICAgICAgICB9Ci0KLSAg
ICAgICAgYnVmZmVyLmVuc3VyZUhlaWdodChpbmZvLT5vdXRwdXRfc2NhbmxpbmUpOwogICAgIH0K
IAogICAgIHJldHVybiB0cnVlOwpAQCAtNTI3LDUgKzUxMCwzIEBAIHZvaWQgSlBFR0ltYWdlRGVj
b2Rlcjo6anBlZ0NvbXBsZXRlKCkKIH0KIAogfQotCi0jZW5kaWYgLy8gUExBVEZPUk0oQ0FJUk8p
CkluZGV4OiBwbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9za2lhL0pQRUdJbWFnZURlY29kZXIuaAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBwbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9za2lhL0pQRUdJbWFnZURlY29k
ZXIuaAkocmV2aXNpb24gNDAxNjUpCisrKyBwbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9za2lhL0pQ
RUdJbWFnZURlY29kZXIuaAkod29ya2luZyBjb3B5KQpAQCAtMSw1ICsxLDYgQEAKIC8qCiAgKiBD
b3B5cmlnaHQgKEMpIDIwMDYgQXBwbGUgQ29tcHV0ZXIsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMDkgR29vZ2xlLCBJbmMuCiAgKgogICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTIzLDUyICsyNCw0NSBAQAogICogT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4g
CiAgKi8KIAotI2lmbmRlZiBKUEVHX0RFQ09ERVJfSF8KLSNkZWZpbmUgSlBFR19ERUNPREVSX0hf
CisjaWZuZGVmIEpQRUdJbWFnZURlY29kZXJfaAorI2RlZmluZSBKUEVHSW1hZ2VEZWNvZGVyX2gK
IAogI2luY2x1ZGUgIkltYWdlRGVjb2Rlci5oIgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLWNs
YXNzIEpQRUdJbWFnZVJlYWRlcjsKKyAgICBjbGFzcyBKUEVHSW1hZ2VSZWFkZXI7CiAKLS8vIFRo
aXMgY2xhc3MgZGVjb2RlcyB0aGUgSlBFRyBpbWFnZSBmb3JtYXQuCi1jbGFzcyBKUEVHSW1hZ2VE
ZWNvZGVyIDogcHVibGljIEltYWdlRGVjb2RlcgotewotcHVibGljOgotICAgIEpQRUdJbWFnZURl
Y29kZXIoKTsKLSAgICB+SlBFR0ltYWdlRGVjb2RlcigpOworICAgIC8vIFRoaXMgY2xhc3MgZGVj
b2RlcyB0aGUgSlBFRyBpbWFnZSBmb3JtYXQuCisgICAgY2xhc3MgSlBFR0ltYWdlRGVjb2RlciA6
IHB1YmxpYyBJbWFnZURlY29kZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgSlBFR0ltYWdlRGVj
b2RlcigpOworICAgICAgICB+SlBFR0ltYWdlRGVjb2RlcigpOwogCi0gICAgdmlydHVhbCBTdHJp
bmcgZmlsZW5hbWVFeHRlbnNpb24oKSBjb25zdCB7IHJldHVybiAianBnIjsgfQorICAgICAgICB2
aXJ0dWFsIFN0cmluZyBmaWxlbmFtZUV4dGVuc2lvbigpIGNvbnN0IHsgcmV0dXJuICJqcGciOyB9
CiAKLSAgICAvLyBUYWtlIHRoZSBkYXRhIGFuZCBzdG9yZSBpdC4KLSAgICB2aXJ0dWFsIHZvaWQg
c2V0RGF0YShTaGFyZWRCdWZmZXIqIGRhdGEsIGJvb2wgYWxsRGF0YVJlY2VpdmVkKTsKKyAgICAg
ICAgLy8gVGFrZSB0aGUgZGF0YSBhbmQgc3RvcmUgaXQuCisgICAgICAgIHZpcnR1YWwgdm9pZCBz
ZXREYXRhKFNoYXJlZEJ1ZmZlciogZGF0YSwgYm9vbCBhbGxEYXRhUmVjZWl2ZWQpOwogCi0gICAg
Ly8gV2hldGhlciBvciBub3QgdGhlIHNpemUgaW5mb3JtYXRpb24gaGFzIGJlZW4gZGVjb2RlZCB5
ZXQuCi0gICAgdmlydHVhbCBib29sIGlzU2l6ZUF2YWlsYWJsZSgpIGNvbnN0OworICAgICAgICAv
LyBXaGV0aGVyIG9yIG5vdCB0aGUgc2l6ZSBpbmZvcm1hdGlvbiBoYXMgYmVlbiBkZWNvZGVkIHll
dC4KKyAgICAgICAgdmlydHVhbCBib29sIGlzU2l6ZUF2YWlsYWJsZSgpIGNvbnN0OwogCi0gICAg
dmlydHVhbCBSR0JBMzJCdWZmZXIqIGZyYW1lQnVmZmVyQXRJbmRleChzaXplX3QgaW5kZXgpOwot
ICAgIAotICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0c0FscGhhKCkgY29uc3QgeyByZXR1cm4gZmFs
c2U7IH0KKyAgICAgICAgdmlydHVhbCBSR0JBMzJCdWZmZXIqIGZyYW1lQnVmZmVyQXRJbmRleChz
aXplX3QgaW5kZXgpOworICAgICAgICAKKyAgICAgICAgdmlydHVhbCBib29sIHN1cHBvcnRzQWxw
aGEoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQogCi0gICAgdm9pZCBkZWNvZGUoYm9vbCBzaXpl
T25seSA9IGZhbHNlKSBjb25zdDsKKyAgICAgICAgdm9pZCBkZWNvZGUoYm9vbCBzaXplT25seSA9
IGZhbHNlKSBjb25zdDsKIAotICAgIEpQRUdJbWFnZVJlYWRlciogcmVhZGVyKCkgeyByZXR1cm4g
bV9yZWFkZXI7IH0KKyAgICAgICAgSlBFR0ltYWdlUmVhZGVyKiByZWFkZXIoKSB7IHJldHVybiBt
X3JlYWRlcjsgfQogCi0gICAgdm9pZCBzZXRTaXplKGludCB3aWR0aCwgaW50IGhlaWdodCkgewot
ICAgICAgICBpZiAoIW1fc2l6ZUF2YWlsYWJsZSkgewotICAgICAgICAgICAgbV9zaXplQXZhaWxh
YmxlID0gdHJ1ZTsKLSAgICAgICAgICAgIG1fc2l6ZSA9IEludFNpemUod2lkdGgsIGhlaWdodCk7
Ci0gICAgICAgIH0KLSAgICB9CisgICAgICAgIGJvb2wgb3V0cHV0U2NhbmxpbmVzKCk7CisgICAg
ICAgIHZvaWQganBlZ0NvbXBsZXRlKCk7CiAKLSAgICBib29sIG91dHB1dFNjYW5saW5lcygpOwot
ICAgIHZvaWQganBlZ0NvbXBsZXRlKCk7CisgICAgcHJpdmF0ZToKKyAgICAgICAgZnJpZW5kIGNs
YXNzIEpQRUdJbWFnZVJlYWRlcjsKKyAgICAgICAgbXV0YWJsZSBKUEVHSW1hZ2VSZWFkZXIqIG1f
cmVhZGVyOworICAgIH07CiAKLXByaXZhdGU6Ci0gICAgbXV0YWJsZSBKUEVHSW1hZ2VSZWFkZXIq
IG1fcmVhZGVyOwotfTsKLQotfQorfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQogCiAjZW5kaWYKSW5k
ZXg6IHBsYXRmb3JtL2ltYWdlLWRlY29kZXJzL3NraWEvUE5HSW1hZ2VEZWNvZGVyLmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBwbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9za2lhL1BOR0ltYWdlRGVjb2Rlci5j
cHAJKHJldmlzaW9uIDQwMTY1KQorKysgcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvc2tpYS9QTkdJ
bWFnZURlY29kZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNiBAQAogLyoKICAqIENv
cHlyaWdodCAoQykgMjAwNiBBcHBsZSBDb21wdXRlciwgSW5jLgorICogQ29weXJpZ2h0IChDKSAy
MDA4LCAyMDA5IEdvb2dsZSwgSW5jLgogICoKICAqIFBvcnRpb25zIGFyZSBDb3B5cmlnaHQgKEMp
IDIwMDEgbW96aWxsYS5vcmcKICAqCkBAIC00MCwxMyArNDEsNiBAQAogI2luY2x1ZGUgInBuZy5o
IgogI2luY2x1ZGUgImFzc2VydC5oIgogCi0jaWYgUExBVEZPUk0oQ0FJUk8pIHx8IFBMQVRGT1JN
KFFUKSB8fCBQTEFURk9STShXWCkKLQotI2lmIENPTVBJTEVSKE1TVkMpCi0vLyBSZW1vdmUgd2Fy
bmluZ3MgZnJvbSB3YXJuaW5nIGxldmVsIDQuCi0jcHJhZ21hIHdhcm5pbmcoZGlzYWJsZSA6IDQ2
MTEpIC8vIHdhcm5pbmcgQzQ2MTE6IGludGVyYWN0aW9uIGJldHdlZW4gJ19zZXRqbXAnIGFuZCBD
Kysgb2JqZWN0IGRlc3RydWN0aW9uIGlzIG5vbi1wb3J0YWJsZQotI2VuZGlmCi0KIG5hbWVzcGFj
ZSBXZWJDb3JlIHsKIAogLy8gR2FtbWEgY29uc3RhbnRzLgpAQCAtNTUsNyArNDksNyBAQCBjb25z
dCBkb3VibGUgY0RlZmF1bHRHYW1tYSA9IDIuMjsKIGNvbnN0IGRvdWJsZSBjSW52ZXJzZUdhbW1h
ID0gMC40NTQ1NTsKIAogLy8gUHJvdGVjdCBhZ2FpbnN0IGxhcmdlIFBOR3MuIFNlZSBNb3ppbGxh
J3MgYnVnICMyNTEzODEgZm9yIG1vcmUgaW5mby4KLWNvbnN0IGxvbmcgY01heFBOR1NpemUgPSAx
MDAwMDAwTDsKK2NvbnN0IHVuc2lnbmVkIGxvbmcgY01heFBOR1NpemUgPSAxMDAwMDAwVUw7CiAK
IC8vIENhbGxlZCBpZiB0aGUgZGVjb2Rpbmcgb2YgdGhlIGltYWdlIGZhaWxzLgogc3RhdGljIHZv
aWQgUE5HQVBJIGRlY29kaW5nRmFpbGVkKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19jb25zdF9j
aGFycCBlcnJvcl9tc2cpOwpAQCAtOTIsOCArODYsOSBAQCBwdWJsaWM6CiAKICAgICB2b2lkIGNs
b3NlKCkgewogICAgICAgICBpZiAobV9wbmcgJiYgbV9pbmZvKQotICAgICAgICAgICAgcG5nX2Rl
c3Ryb3lfcmVhZF9zdHJ1Y3QoJm1fcG5nLCAmbV9pbmZvLCAwKTsKKyAgICAgICAgICAgIHBuZ19k
ZXN0cm95X3JlYWRfc3RydWN0KCZtX3BuZywgJm1faW5mbywgMCk7ICAvLyBXaWxsIHplcm8gdGhl
IHBvaW50ZXJzLgogICAgICAgICBkZWxldGUgW11tX2ludGVybGFjZUJ1ZmZlcjsKKyAgICAgICAg
bV9pbnRlcmxhY2VCdWZmZXIgPSAwOwogICAgICAgICBtX3JlYWRPZmZzZXQgPSAwOwogICAgIH0K
IApAQCAtMTQwLDkgKzEzNSw3IEBAIHByaXZhdGU6CiAKIFBOR0ltYWdlRGVjb2Rlcjo6UE5HSW1h
Z2VEZWNvZGVyKCkKIDogbV9yZWFkZXIoMCkKLXsKLSAgICBtX2ZyYW1lQnVmZmVyQ2FjaGUucmVz
aXplKDEpOwotfQore30KIAogUE5HSW1hZ2VEZWNvZGVyOjp+UE5HSW1hZ2VEZWNvZGVyKCkKIHsK
QEAgLTE2Nyw3ICsxNjAsNyBAQCB2b2lkIFBOR0ltYWdlRGVjb2Rlcjo6c2V0RGF0YShTaGFyZWRC
dWZmCiBib29sIFBOR0ltYWdlRGVjb2Rlcjo6aXNTaXplQXZhaWxhYmxlKCkgY29uc3QKIHsKICAg
ICAvLyBJZiB3ZSBoYXZlIHBlbmRpbmcgZGF0YSB0byBkZWNvZGUsIHNlbmQgaXQgdG8gdGhlIFBO
RyByZWFkZXIgbm93LgotICAgIGlmICghbV9zaXplQXZhaWxhYmxlICYmIG1fcmVhZGVyKSB7Cisg
ICAgaWYgKCFJbWFnZURlY29kZXI6OmlzU2l6ZUF2YWlsYWJsZSgpICYmIG1fcmVhZGVyKSB7CiAg
ICAgICAgIGlmIChtX2ZhaWxlZCkKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIApAQCAtMTc2
LDcgKzE2OSw3IEBAIGJvb2wgUE5HSW1hZ2VEZWNvZGVyOjppc1NpemVBdmFpbGFibGUoKSAKICAg
ICAgICAgZGVjb2RlKHRydWUpOwogICAgIH0KIAotICAgIHJldHVybiBtX3NpemVBdmFpbGFibGU7
CisgICAgcmV0dXJuICFtX2ZhaWxlZCAmJiBJbWFnZURlY29kZXI6OmlzU2l6ZUF2YWlsYWJsZSgp
OwogfQogCiBSR0JBMzJCdWZmZXIqIFBOR0ltYWdlRGVjb2Rlcjo6ZnJhbWVCdWZmZXJBdEluZGV4
KHNpemVfdCBpbmRleCkKQEAgLTE4NCw2ICsxNzcsOSBAQCBSR0JBMzJCdWZmZXIqIFBOR0ltYWdl
RGVjb2Rlcjo6ZnJhbWVCdWZmCiAgICAgaWYgKGluZGV4KQogICAgICAgICByZXR1cm4gMDsKIAor
ICAgIGlmIChtX2ZyYW1lQnVmZmVyQ2FjaGUuaXNFbXB0eSgpKQorICAgICAgICBtX2ZyYW1lQnVm
ZmVyQ2FjaGUucmVzaXplKDEpOworCiAgICAgUkdCQTMyQnVmZmVyJiBmcmFtZSA9IG1fZnJhbWVC
dWZmZXJDYWNoZVswXTsKICAgICBpZiAoZnJhbWUuc3RhdHVzKCkgIT0gUkdCQTMyQnVmZmVyOjpG
cmFtZUNvbXBsZXRlICYmIG1fcmVhZGVyKQogICAgICAgICAvLyBEZWNvZGUgdGhpcyBmcmFtZS4K
QEAgLTE5OSw3ICsxOTUsNyBAQCB2b2lkIFBOR0ltYWdlRGVjb2Rlcjo6ZGVjb2RlKGJvb2wgc2l6
ZU9uCiAKICAgICBtX3JlYWRlci0+ZGVjb2RlKG1fZGF0YS0+YnVmZmVyKCksIHNpemVPbmx5KTsK
ICAgICAKLSAgICBpZiAobV9mYWlsZWQgfHwgKG1fZnJhbWVCdWZmZXJDYWNoZVswXS5zdGF0dXMo
KSA9PSBSR0JBMzJCdWZmZXI6OkZyYW1lQ29tcGxldGUpKSB7CisgICAgaWYgKG1fZmFpbGVkIHx8
ICghbV9mcmFtZUJ1ZmZlckNhY2hlLmlzRW1wdHkoKSAmJiBtX2ZyYW1lQnVmZmVyQ2FjaGVbMF0u
c3RhdHVzKCkgPT0gUkdCQTMyQnVmZmVyOjpGcmFtZUNvbXBsZXRlKSkgewogICAgICAgICBkZWxl
dGUgbV9yZWFkZXI7CiAgICAgICAgIG1fcmVhZGVyID0gMDsKICAgICB9CkBAIC0yMjQsNiArMjIw
LDEwIEBAIHZvaWQgaGVhZGVyQXZhaWxhYmxlKHBuZ19zdHJ1Y3RwIHBuZywgcG4KICAgICBzdGF0
aWNfY2FzdDxQTkdJbWFnZURlY29kZXIqPihwbmdfZ2V0X3Byb2dyZXNzaXZlX3B0cihwbmcpKS0+
aGVhZGVyQXZhaWxhYmxlKCk7CiB9CiAKK3ZvaWQgUE5HSW1hZ2VEZWNvZGVyOjpkZWNvZGluZ0Zh
aWxlZCgpIHsKKyAgICBtX2ZhaWxlZCA9IHRydWU7Cit9CisKIHZvaWQgUE5HSW1hZ2VEZWNvZGVy
OjpoZWFkZXJBdmFpbGFibGUoKQogewogICAgIHBuZ19zdHJ1Y3RwIHBuZyA9IHJlYWRlcigpLT5w
bmdQdHIoKTsKQEAgLTIzOSw5ICsyMzksMTIgQEAgdm9pZCBQTkdJbWFnZURlY29kZXI6OmhlYWRl
ckF2YWlsYWJsZSgpCiAgICAgfQogICAgIAogICAgIC8vIFdlIGNhbiBmaWxsIGluIHRoZSBzaXpl
IG5vdyB0aGF0IHRoZSBoZWFkZXIgaXMgYXZhaWxhYmxlLgotICAgIGlmICghbV9zaXplQXZhaWxh
YmxlKSB7Ci0gICAgICAgIG1fc2l6ZUF2YWlsYWJsZSA9IHRydWU7Ci0gICAgICAgIG1fc2l6ZSA9
IEludFNpemUod2lkdGgsIGhlaWdodCk7CisgICAgaWYgKCFJbWFnZURlY29kZXI6OmlzU2l6ZUF2
YWlsYWJsZSgpKSB7CisgICAgICAgIGlmICghc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KSkgeworICAg
ICAgICAgICAgLy8gU2l6ZSB1bnJlYXNvbmFibGUsIGJhaWwgb3V0LgorICAgICAgICAgICAgbG9u
Z2ptcChwbmctPmptcGJ1ZiwgMSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KICAg
ICB9CiAKICAgICBpbnQgYml0RGVwdGgsIGNvbG9yVHlwZSwgaW50ZXJsYWNlVHlwZSwgY29tcHJl
c3Npb25UeXBlLCBmaWx0ZXJUeXBlLCBjaGFubmVsczsKQEAgLTMwMiwyNiArMzA1LDM0IEBAIHZv
aWQgUE5HSW1hZ2VEZWNvZGVyOjpoZWFkZXJBdmFpbGFibGUoKQogdm9pZCByb3dBdmFpbGFibGUo
cG5nX3N0cnVjdHAgcG5nLCBwbmdfYnl0ZXAgcm93QnVmZmVyLAogICAgICAgICAgICAgICAgICAg
cG5nX3VpbnRfMzIgcm93SW5kZXgsIGludCBpbnRlcmxhY2VQYXNzKQogewotICAgIHN0YXRpY19j
YXN0PFBOR0ltYWdlRGVjb2Rlcio+KHBuZ19nZXRfcHJvZ3Jlc3NpdmVfcHRyKHBuZykpLT5yb3dB
dmFpbGFibGUocm93QnVmZmVyLCByb3dJbmRleCwgaW50ZXJsYWNlUGFzcyk7CisgICAgc3RhdGlj
X2Nhc3Q8UE5HSW1hZ2VEZWNvZGVyKj4ocG5nX2dldF9wcm9ncmVzc2l2ZV9wdHIocG5nKSktPnJv
d0F2YWlsYWJsZSgKKyAgICAgICAgcm93QnVmZmVyLCByb3dJbmRleCwgaW50ZXJsYWNlUGFzcyk7
CiB9CiAKIHZvaWQgUE5HSW1hZ2VEZWNvZGVyOjpyb3dBdmFpbGFibGUodW5zaWduZWQgY2hhciog
cm93QnVmZmVyLCB1bnNpZ25lZCByb3dJbmRleCwgaW50IGludGVybGFjZVBhc3MpCiB7CisgICAg
aWYgKG1fZnJhbWVCdWZmZXJDYWNoZS5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKwogICAg
IC8vIFJlc2l6ZSB0byB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgaW1hZ2UuCiAgICAgUkdC
QTMyQnVmZmVyJiBidWZmZXIgPSBtX2ZyYW1lQnVmZmVyQ2FjaGVbMF07CiAgICAgaWYgKGJ1ZmZl
ci5zdGF0dXMoKSA9PSBSR0JBMzJCdWZmZXI6OkZyYW1lRW1wdHkpIHsKICAgICAgICAgLy8gTGV0
J3MgcmVzaXplIG91ciBidWZmZXIgbm93IHRvIHRoZSBjb3JyZWN0IHdpZHRoL2hlaWdodC4KLSAg
ICAgICAgUkdCQTMyQXJyYXkmIGJ5dGVzID0gYnVmZmVyLmJ5dGVzKCk7Ci0gICAgICAgIGJ5dGVz
LnJlc2l6ZShtX3NpemUud2lkdGgoKSAqIG1fc2l6ZS5oZWlnaHQoKSk7CisgICAgICAgIGlmICgh
YnVmZmVyLnNldFNpemUoc2l6ZSgpLndpZHRoKCksIHNpemUoKS5oZWlnaHQoKSkpIHsKKyAgICAg
ICAgICAgIC8vIEVycm9yIGFsbG9jYXRpbmcgdGhlIGJpdG1hcC4gV2Ugc2hvdWxkIG5vdCBjb250
aW51ZS4KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PFBOR0ltYWdlRGVjb2Rlcio+KHBuZ19nZXRf
cHJvZ3Jlc3NpdmVfcHRyKHJlYWRlcigpLT5wbmdQdHIoKSkpLT5kZWNvZGluZ0ZhaWxlZCgpOwor
ICAgICAgICAgICAgbG9uZ2ptcChyZWFkZXIoKS0+cG5nUHRyKCktPmptcGJ1ZiwgMSk7CisgICAg
ICAgICAgICByZXR1cm47CisgICAgICAgIH0KIAogICAgICAgICAvLyBVcGRhdGUgb3VyIHN0YXR1
cyB0byBiZSBwYXJ0aWFsbHkgY29tcGxldGUuCiAgICAgICAgIGJ1ZmZlci5zZXRTdGF0dXMoUkdC
QTMyQnVmZmVyOjpGcmFtZVBhcnRpYWwpOwogCiAgICAgICAgIC8vIEZvciBQTkdzLCB0aGUgZnJh
bWUgYWx3YXlzIGZpbGxzIHRoZSBlbnRpcmUgaW1hZ2UuCi0gICAgICAgIGJ1ZmZlci5zZXRSZWN0
KEludFJlY3QoMCwgMCwgbV9zaXplLndpZHRoKCksIG1fc2l6ZS5oZWlnaHQoKSkpOworICAgICAg
ICBidWZmZXIuc2V0UmVjdChJbnRSZWN0KDAsIDAsIHNpemUoKS53aWR0aCgpLCBzaXplKCkuaGVp
Z2h0KCkpKTsKIAogICAgICAgICBpZiAocmVhZGVyKCktPnBuZ1B0cigpLT5pbnRlcmxhY2VkKQot
ICAgICAgICAgICAgcmVhZGVyKCktPmNyZWF0ZUludGVybGFjZUJ1ZmZlcigocmVhZGVyKCktPmhh
c0FscGhhKCkgPyA0IDogMykgKiBtX3NpemUud2lkdGgoKSAqIG1fc2l6ZS5oZWlnaHQoKSk7Cisg
ICAgICAgICAgICByZWFkZXIoKS0+Y3JlYXRlSW50ZXJsYWNlQnVmZmVyKChyZWFkZXIoKS0+aGFz
QWxwaGEoKSA/IDQgOiAzKSAqIHNpemUoKS53aWR0aCgpICogc2l6ZSgpLmhlaWdodCgpKTsKICAg
ICB9CiAKICAgICBpZiAocm93QnVmZmVyID09IDApCkBAIC0zNjEsMjkgKzM3MiwyNiBAQCB2b2lk
IFBOR0ltYWdlRGVjb2Rlcjo6cm93QXZhaWxhYmxlKHVuc2lnCiAgICAgcG5nX2J5dGVwIHJvdzsK
ICAgICBwbmdfYnl0ZXAgaW50ZXJsYWNlQnVmZmVyID0gcmVhZGVyKCktPmludGVybGFjZUJ1ZmZl
cigpOwogICAgIGlmIChpbnRlcmxhY2VCdWZmZXIpIHsKLSAgICAgICAgcm93ID0gaW50ZXJsYWNl
QnVmZmVyICsgKHJvd0luZGV4ICogY29sb3JDaGFubmVscyAqIG1fc2l6ZS53aWR0aCgpKTsKKyAg
ICAgICAgcm93ID0gaW50ZXJsYWNlQnVmZmVyICsgKHJvd0luZGV4ICogY29sb3JDaGFubmVscyAq
IHNpemUoKS53aWR0aCgpKTsKICAgICAgICAgcG5nX3Byb2dyZXNzaXZlX2NvbWJpbmVfcm93KHBu
Zywgcm93LCByb3dCdWZmZXIpOwogICAgIH0KICAgICBlbHNlCiAgICAgICAgIHJvdyA9IHJvd0J1
ZmZlcjsKIAogICAgIC8vIENvcHkgdGhlIGRhdGEgaW50byBvdXIgYnVmZmVyLgotICAgIGludCB3
aWR0aCA9IG1fc2l6ZS53aWR0aCgpOwotICAgIHVuc2lnbmVkKiBkc3QgPSBidWZmZXIuYnl0ZXMo
KS5kYXRhKCkgKyByb3dJbmRleCAqIHdpZHRoOworICAgIGludCB3aWR0aCA9IHNpemUoKS53aWR0
aCgpOwogICAgIGJvb2wgc2F3QWxwaGEgPSBmYWxzZTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8
IHdpZHRoOyBpKyspIHsKKyAgICBmb3IgKGludCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKICAg
ICAgICAgdW5zaWduZWQgcmVkID0gKnJvdysrOwogICAgICAgICB1bnNpZ25lZCBncmVlbiA9ICpy
b3crKzsKICAgICAgICAgdW5zaWduZWQgYmx1ZSA9ICpyb3crKzsKICAgICAgICAgdW5zaWduZWQg
YWxwaGEgPSAoaGFzQWxwaGEgPyAqcm93KysgOiAyNTUpOwotICAgICAgICBSR0JBMzJCdWZmZXI6
OnNldFJHQkEoKmRzdCsrLCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7CisgICAgICAgIGJ1ZmZl
ci5zZXRSR0JBKHgsIHJvd0luZGV4LCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7CiAgICAgICAg
IGlmICghc2F3QWxwaGEgJiYgYWxwaGEgPCAyNTUpIHsKICAgICAgICAgICAgIHNhd0FscGhhID0g
dHJ1ZTsKICAgICAgICAgICAgIGJ1ZmZlci5zZXRIYXNBbHBoYSh0cnVlKTsKICAgICAgICAgfQog
ICAgIH0KLQotICAgIGJ1ZmZlci5lbnN1cmVIZWlnaHQocm93SW5kZXggKyAxKTsKIH0KIAogdm9p
ZCBwbmdDb21wbGV0ZShwbmdfc3RydWN0cCBwbmcsIHBuZ19pbmZvcCBpbmZvKQpAQCAtMzkzLDEx
ICs0MDEsMTIgQEAgdm9pZCBwbmdDb21wbGV0ZShwbmdfc3RydWN0cCBwbmcsIHBuZ19pbgogCiB2
b2lkIFBOR0ltYWdlRGVjb2Rlcjo6cG5nQ29tcGxldGUoKQogeworICAgIGlmIChtX2ZyYW1lQnVm
ZmVyQ2FjaGUuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm47CisKICAgICAvLyBIYW5kIGJhY2sg
YW4gYXBwcm9wcmlhdGVseSBzaXplZCBidWZmZXIsIGV2ZW4gaWYgdGhlIGltYWdlIGVuZGVkIHVw
IGJlaW5nIGVtcHR5LgogICAgIFJHQkEzMkJ1ZmZlciYgYnVmZmVyID0gbV9mcmFtZUJ1ZmZlckNh
Y2hlWzBdOwogICAgIGJ1ZmZlci5zZXRTdGF0dXMoUkdCQTMyQnVmZmVyOjpGcmFtZUNvbXBsZXRl
KTsKIH0KIAotfQotCi0jZW5kaWYgLy8gUExBVEZPUk0oQ0FJUk8pCit9IC8vIG5hbWVzcGFjZSBX
ZWJDb3JlCkluZGV4OiBwbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9za2lhL1BOR0ltYWdlRGVjb2Rl
ci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIHBsYXRmb3JtL2ltYWdlLWRlY29kZXJzL3NraWEvUE5HSW1hZ2VE
ZWNvZGVyLmgJKHJldmlzaW9uIDQwMTY1KQorKysgcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvc2tp
YS9QTkdJbWFnZURlY29kZXIuaAkod29ya2luZyBjb3B5KQpAQCAtMSw1ICsxLDYgQEAKIC8qCiAg
KiBDb3B5cmlnaHQgKEMpIDIwMDYgQXBwbGUgQ29tcHV0ZXIsIEluYy4gIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMDkgR29vZ2xlLCBJbmMuCiAgKgogICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTIzLDQ2ICsyNCw0NSBAQAogICogT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4gCiAgKi8KIAotI2lmbmRlZiBQTkdfREVDT0RFUl9IXwotI2RlZmluZSBQTkdfREVDT0RFUl9I
XworI2lmbmRlZiBQTkdJbWFnZURlY29kZXJfaAorI2RlZmluZSBQTkdJbWFnZURlY29kZXJfaAog
CiAjaW5jbHVkZSAiSW1hZ2VEZWNvZGVyLmgiCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotY2xh
c3MgUE5HSW1hZ2VSZWFkZXI7CisgICAgY2xhc3MgUE5HSW1hZ2VSZWFkZXI7CiAKLS8vIFRoaXMg
Y2xhc3MgZGVjb2RlcyB0aGUgUE5HIGltYWdlIGZvcm1hdC4KLWNsYXNzIFBOR0ltYWdlRGVjb2Rl
ciA6IHB1YmxpYyBJbWFnZURlY29kZXIKLXsKLXB1YmxpYzoKLSAgICBQTkdJbWFnZURlY29kZXIo
KTsKLSAgICB+UE5HSW1hZ2VEZWNvZGVyKCk7CisgICAgLy8gVGhpcyBjbGFzcyBkZWNvZGVzIHRo
ZSBQTkcgaW1hZ2UgZm9ybWF0LgorICAgIGNsYXNzIFBOR0ltYWdlRGVjb2RlciA6IHB1YmxpYyBJ
bWFnZURlY29kZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgUE5HSW1hZ2VEZWNvZGVyKCk7Cisg
ICAgICAgIH5QTkdJbWFnZURlY29kZXIoKTsKIAotICAgIHZpcnR1YWwgU3RyaW5nIGZpbGVuYW1l
RXh0ZW5zaW9uKCkgY29uc3QgeyByZXR1cm4gInBuZyI7IH0KKyAgICAgICAgdmlydHVhbCBTdHJp
bmcgZmlsZW5hbWVFeHRlbnNpb24oKSBjb25zdCB7IHJldHVybiAicG5nIjsgfQogCi0gICAgLy8g
VGFrZSB0aGUgZGF0YSBhbmQgc3RvcmUgaXQuCi0gICAgdmlydHVhbCB2b2lkIHNldERhdGEoU2hh
cmVkQnVmZmVyKiBkYXRhLCBib29sIGFsbERhdGFSZWNlaXZlZCk7CisgICAgICAgIC8vIFRha2Ug
dGhlIGRhdGEgYW5kIHN0b3JlIGl0LgorICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0RGF0YShTaGFy
ZWRCdWZmZXIqIGRhdGEsIGJvb2wgYWxsRGF0YVJlY2VpdmVkKTsKIAotICAgIC8vIFdoZXRoZXIg
b3Igbm90IHRoZSBzaXplIGluZm9ybWF0aW9uIGhhcyBiZWVuIGRlY29kZWQgeWV0LgotICAgIHZp
cnR1YWwgYm9vbCBpc1NpemVBdmFpbGFibGUoKSBjb25zdDsKKyAgICAgICAgLy8gV2hldGhlciBv
ciBub3QgdGhlIHNpemUgaW5mb3JtYXRpb24gaGFzIGJlZW4gZGVjb2RlZCB5ZXQuCisgICAgICAg
IHZpcnR1YWwgYm9vbCBpc1NpemVBdmFpbGFibGUoKSBjb25zdDsKIAotICAgIHZpcnR1YWwgUkdC
QTMyQnVmZmVyKiBmcmFtZUJ1ZmZlckF0SW5kZXgoc2l6ZV90IGluZGV4KTsKKyAgICAgICAgdmly
dHVhbCBSR0JBMzJCdWZmZXIqIGZyYW1lQnVmZmVyQXRJbmRleChzaXplX3QgaW5kZXgpOwogCi0g
ICAgdm9pZCBkZWNvZGUoYm9vbCBzaXplT25seSA9IGZhbHNlKSBjb25zdDsKKyAgICAgICAgdm9p
ZCBkZWNvZGUoYm9vbCBzaXplT25seSA9IGZhbHNlKSBjb25zdDsKIAotICAgIFBOR0ltYWdlUmVh
ZGVyKiByZWFkZXIoKSB7IHJldHVybiBtX3JlYWRlcjsgfQorICAgICAgICBQTkdJbWFnZVJlYWRl
ciogcmVhZGVyKCkgeyByZXR1cm4gbV9yZWFkZXI7IH0KIAotICAgIC8vIENhbGxiYWNrcyBmcm9t
IGxpYnBuZwotICAgIHZvaWQgZGVjb2RpbmdGYWlsZWQoKSB7IG1fZmFpbGVkID0gdHJ1ZTsgfQot
ICAgIHZvaWQgaGVhZGVyQXZhaWxhYmxlKCk7Ci0gICAgdm9pZCByb3dBdmFpbGFibGUodW5zaWdu
ZWQgY2hhciogcm93QnVmZmVyLCB1bnNpZ25lZCByb3dJbmRleCwgaW50IGludGVybGFjZVBhc3Mp
OwotICAgIHZvaWQgcG5nQ29tcGxldGUoKTsKKyAgICAgICAgLy8gQ2FsbGJhY2tzIGZyb20gbGli
cG5nCisgICAgICAgIHZvaWQgZGVjb2RpbmdGYWlsZWQoKTsKKyAgICAgICAgdm9pZCBoZWFkZXJB
dmFpbGFibGUoKTsKKyAgICAgICAgdm9pZCByb3dBdmFpbGFibGUodW5zaWduZWQgY2hhciogcm93
QnVmZmVyLCB1bnNpZ25lZCByb3dJbmRleCwgaW50IGludGVybGFjZVBhc3MpOworICAgICAgICB2
b2lkIHBuZ0NvbXBsZXRlKCk7CiAKLXByaXZhdGU6Ci0gICAgbXV0YWJsZSBQTkdJbWFnZVJlYWRl
ciogbV9yZWFkZXI7Ci19OworICAgIHByaXZhdGU6CisgICAgICAgIG11dGFibGUgUE5HSW1hZ2VS
ZWFkZXIqIG1fcmVhZGVyOworICAgIH07CiAKLX0KK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKIAog
I2VuZGlmCkluZGV4OiBwbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9za2lhL1hCTUltYWdlRGVjb2Rl
ci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvc2tpYS9YQk1JbWFn
ZURlY29kZXIuY3BwCShyZXZpc2lvbiAwKQorKysgcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvc2tp
YS9YQk1JbWFnZURlY29kZXIuY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDI4MCBAQAorLyoK
KyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSwgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKiAK
KyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBp
biB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2ds
ZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQg
dG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0
d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIAorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENP
TlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFS
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQK
KyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBP
UiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAq
LworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiWEJNSW1hZ2VEZWNvZGVyLmgiCisK
KyNpbmNsdWRlIDxhbGdvcml0aG0+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworWEJNSW1hZ2VE
ZWNvZGVyOjpYQk1JbWFnZURlY29kZXIoKQorICAgIDogbV9kZWNvZGVPZmZzZXQoMCkKKyAgICAs
IG1fYWxsRGF0YVJlY2VpdmVkKGZhbHNlKQorICAgICwgbV9kZWNvZGVkSGVhZGVyKGZhbHNlKQor
ICAgICwgbV9kYXRhVHlwZShVbmtub3duKQorICAgICwgbV9iaXRzRGVjb2RlZCgwKQoreworfQor
Cit2b2lkIFhCTUltYWdlRGVjb2Rlcjo6c2V0RGF0YShTaGFyZWRCdWZmZXIqIGRhdGEsIGJvb2wg
YWxsRGF0YVJlY2VpdmVkKQoreworICAgIEltYWdlRGVjb2Rlcjo6c2V0RGF0YShkYXRhLCBhbGxE
YXRhUmVjZWl2ZWQpOworCisgICAgY29uc3QgVmVjdG9yPGNoYXI+JiBidWYgPSBtX2RhdGEtPmJ1
ZmZlcigpOworICAgIGlmIChidWYuc2l6ZSgpID4gbV94Ym1TdHJpbmcuc2l6ZSgpKQorICAgICAg
ICBtX3hibVN0cmluZy5hcHBlbmQoJmJ1ZlttX3hibVN0cmluZy5zaXplKCldLCBidWYuc2l6ZSgp
IC0gbV94Ym1TdHJpbmcuc2l6ZSgpKTsKKworICAgIG1fYWxsRGF0YVJlY2VpdmVkID0gYWxsRGF0
YVJlY2VpdmVkOworfQorCitib29sIFhCTUltYWdlRGVjb2Rlcjo6aXNTaXplQXZhaWxhYmxlKCkg
Y29uc3QKK3sKKyAgICAvLyBUaGlzIG1ldGhvZCBzaG91bGQgZWl0aGVyIChhKSBub3QgYmUgY29u
c3QsIG9yIChiKSBub3QgYmUgZXhwZWN0ZWQgdG8KKyAgICAvLyBkbyBhbnl0aGluZyB0aGF0IGNo
YW5nZXMgbV9zaXplQXZhaWxhYmxlLiBUaGUgcG5nIGFuZCBqcGVnIGRlY29kZXJzCisgICAgLy8g
Z2V0IGFyb3VuZCB0aGlzIHdpdGggY2FsbGJhY2tzIGZyb20gZXh0ZXJuYWwgbGlicmFyaWVzLgor
ICAgIC8vCisgICAgLy8gRklYTUU6IEZpbmQgb3V0IGlmIHdlIGNhbiBwYXRjaCB3ZWJraXQgdG8g
dGFrZSBjYXJlIG9mIHRoaXMuCisgICAgaWYgKCFJbWFnZURlY29kZXI6OmlzU2l6ZUF2YWlsYWJs
ZSgpICYmICFtX2ZhaWxlZCkKKyAgICAgICAgY29uc3RfY2FzdDxYQk1JbWFnZURlY29kZXIqPih0
aGlzKS0+ZGVjb2RlWEJNKHRydWUpOworCisgICAgcmV0dXJuICFtX2ZhaWxlZCAmJiBJbWFnZURl
Y29kZXI6OmlzU2l6ZUF2YWlsYWJsZSgpOworfQorCitSR0JBMzJCdWZmZXIqIFhCTUltYWdlRGVj
b2Rlcjo6ZnJhbWVCdWZmZXJBdEluZGV4KHNpemVfdCBpbmRleCkKK3sKKyAgICAvLyBBbGxvY2F0
ZSBhIGZyYW1lYnVmZmVyIGlmIG5lY2Vzc2FyeS4gTmV3IGZyYW1lYnVmZmVycyBoYXZlIHRoZWly
IHN0YXR1cworICAgIC8vIGluaXRpYWxpemVkIHRvIFJHQkEzMkJ1ZmZlcjo6RnJhbWVFbXB0eS4K
KyAgICBpZiAobV9mcmFtZUJ1ZmZlckNhY2hlLmlzRW1wdHkoKSkKKyAgICAgICAgbV9mcmFtZUJ1
ZmZlckNhY2hlLnJlc2l6ZSgxKTsKKworICAgIFJHQkEzMkJ1ZmZlciYgZnJhbWUgPSBtX2ZyYW1l
QnVmZmVyQ2FjaGVbMF07CisKKyAgICAvLyBBdHRlbXB0IHRvIGdldCB0aGUgc2l6ZSBpZiB3ZSBk
b24ndCBoYXZlIGl0IHlldC4KKyAgICBpZiAoIUltYWdlRGVjb2Rlcjo6aXNTaXplQXZhaWxhYmxl
KCkpCisgICAgICAgIGRlY29kZVhCTSh0cnVlKTsKKyAgICAKKyAgICAvLyBTaXplIHRoZSBmcmFt
ZWJ1ZmZlciBvbmNlIHdlIGtub3cgdGhlIHJpZ2h0IHNpemUuCisgICAgaWYgKEltYWdlRGVjb2Rl
cjo6aXNTaXplQXZhaWxhYmxlKCkgJiYKKyAgICAgICAgZnJhbWUuc3RhdHVzKCkgPT0gUkdCQTMy
QnVmZmVyOjpGcmFtZUVtcHR5KSB7CisgICAgICAgIGlmICghZnJhbWUuc2V0U2l6ZShzaXplKCku
d2lkdGgoKSwgc2l6ZSgpLmhlaWdodCgpKSkgeworICAgICAgICAgICAgbV9mYWlsZWQgPSB0cnVl
OworICAgICAgICAgICAgZnJhbWUuc2V0U3RhdHVzKFJHQkEzMkJ1ZmZlcjo6RnJhbWVDb21wbGV0
ZSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBmcmFtZS5zZXRT
dGF0dXMoUkdCQTMyQnVmZmVyOjpGcmFtZVBhcnRpYWwpOworICAgIH0KKyAgICAKKyAgICAvLyBL
ZWVwIHRyeWluZyB0byBkZWNvZGUgdW50aWwgd2UndmUgZ290IHRoZSBlbnRpcmUgaW1hZ2UuCisg
ICAgaWYgKGZyYW1lLnN0YXR1cygpICE9IFJHQkEzMkJ1ZmZlcjo6RnJhbWVDb21wbGV0ZSkKKyAg
ICAgICAgZGVjb2RlWEJNKGZhbHNlKTsKKworICAgIHJldHVybiAmZnJhbWU7Cit9CisKK2Jvb2wg
WEJNSW1hZ2VEZWNvZGVyOjpkZWNvZGVIZWFkZXIoKQoreworICAgIEFTU0VSVChtX2RlY29kZU9m
ZnNldCA8PSBtX3hibVN0cmluZy5zaXplKCkpOworICAgIEFTU0VSVCghbV9kZWNvZGVkSGVhZGVy
KTsKKworICAgIGNvbnN0IGNoYXIqIGlucHV0ID0gbV94Ym1TdHJpbmcuY19zdHIoKTsKKworICAg
IC8vIEF0IGxlYXN0IDIgIiNkZWZpbmUgPHN0cmluZz4gPHVuc2lnbmVkPiIgc2VxdWVuY2VzIGFy
ZSByZXF1aXJlZC4gVGhlc2UKKyAgICAvLyBzcGVjaWZ5IHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9m
IHRoZSBpbWFnZS4KKyAgICBpbnQgd2lkdGgsIGhlaWdodDsKKyAgICBpZiAoIUltYWdlRGVjb2Rl
cjo6aXNTaXplQXZhaWxhYmxlKCkpIHsKKyAgICAgICAgaW50IGNvdW50OworICAgICAgICBpZiAo
c3NjYW5mKCZpbnB1dFttX2RlY29kZU9mZnNldF0sICIjZGVmaW5lICUqcyAlaSAjZGVmaW5lICUq
cyAlaSVuIiwKKyAgICAgICAgICAgICAgICAgICAmd2lkdGgsICZoZWlnaHQsICZjb3VudCkgIT0g
MikKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAvLyBUaGUgd2lkdGggYW5k
IGhlaWdodCBuZWVkIHRvIGZvbGxvdyBzb21lIHJ1bGVzLgorICAgICAgICBpZiAod2lkdGggPCAw
IHx8IHdpZHRoID4gbWF4RGltZW5zaW9uIHx8IGhlaWdodCA8IDAgfHwgaGVpZ2h0ID4gbWF4RGlt
ZW5zaW9uKSB7CisgICAgICAgICAgICAvLyBJZiB0aGlzIGhhcHBlbnMsIGRlY29kaW5nIHNob3Vs
ZCBub3QgY29udGludWUuCisgICAgICAgICAgICBzZXRGYWlsZWQoKTsKKyAgICAgICAgICAgIHJl
dHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghc2V0U2l6ZSh3aWR0aCwgaGVp
Z2h0KSkgeworICAgICAgICAgICAgc2V0RmFpbGVkKCk7CisgICAgICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgICAgIH0KKyAgICAgICAgbV9kZWNvZGVPZmZzZXQgKz0gY291bnQ7CisgICAgICAg
IEFTU0VSVChtX2RlY29kZU9mZnNldCA8PSBtX3hibVN0cmluZy5zaXplKCkpOworICAgIH0KKwor
ICAgIEFTU0VSVChJbWFnZURlY29kZXI6OmlzU2l6ZUF2YWlsYWJsZSgpKTsKKworICAgIC8vIE5v
dyB3ZSdyZSBsb29raW5nIGZvciBzb21ldGhpbmcgdGhhdCB0ZWxscyB1cyB0aGF0IHdlJ3ZlIHNl
ZW4gYWxsIG9mIHRoZQorICAgIC8vICIjZGVmaW5lIDxzdHJpbmc+IDx1bnNpZ25lZD4iIHNlcXVl
bmNlcyB0aGF0IHdlJ3JlIGdvaW5nIHRvLiBNb3ppbGxhCisgICAgLy8ganVzdCBsb29rcyBmb3Ig
IiBjaGFyICIgb3IgIiBzaG9ydCAiLiBXZSdsbCBkbyB0aGUgc2FtZS4KKyAgICBpZiAobV9kYXRh
VHlwZSA9PSBVbmtub3duKSB7CisgICAgICAgIGNvbnN0IGNoYXIqIHgxMWhpbnQgPSAiIGNoYXIg
IjsKKyAgICAgICAgY29uc3QgY2hhciogeDExSGludExvY2F0aW9uID0gc3Ryc3RyKCZpbnB1dFtt
X2RlY29kZU9mZnNldF0sIHgxMWhpbnQpOworICAgICAgICBpZiAoeDExSGludExvY2F0aW9uKSB7
CisgICAgICAgICAgICBtX2RhdGFUeXBlID0gWDExOworICAgICAgICAgICAgbV9kZWNvZGVPZmZz
ZXQgKz0gKCh4MTFIaW50TG9jYXRpb24gLSAmaW5wdXRbbV9kZWNvZGVPZmZzZXRdKSArIHN0cmxl
bih4MTFoaW50KSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb25zdCBjaGFyKiB4
MTBoaW50ID0gIiBzaG9ydCAiOworICAgICAgICAgICAgY29uc3QgY2hhciogeDEwSGludExvY2F0
aW9uID0gc3Ryc3RyKCZpbnB1dFttX2RlY29kZU9mZnNldF0sIHgxMGhpbnQpOworICAgICAgICAg
ICAgaWYgKHgxMEhpbnRMb2NhdGlvbikgeworICAgICAgICAgICAgICAgIG1fZGF0YVR5cGUgPSBY
MTA7CisgICAgICAgICAgICAgICAgbV9kZWNvZGVPZmZzZXQgKz0gKCh4MTBIaW50TG9jYXRpb24g
LSAmaW5wdXRbbV9kZWNvZGVPZmZzZXRdKSArIHN0cmxlbih4MTBoaW50KSk7CisgICAgICAgICAg
ICB9IGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAg
ICAgQVNTRVJUKG1fZGVjb2RlT2Zmc2V0IDw9IG1feGJtU3RyaW5nLnNpemUoKSk7CisgICAgfQor
CisgICAgLy8gRmluZCB0aGUgc3RhcnQgb2YgdGhlIGRhdGEuIEFnYWluLCB3ZSBkbyB3aGF0IG1v
emlsbGEgZG9lcyBhbmQganVzdAorICAgIC8vIGxvb2sgZm9yIGEgJ3snIGluIHRoZSBpbnB1dC4K
KyAgICBjb25zdCBjaGFyKiBmb3VuZCA9IHN0cmNocigmaW5wdXRbbV9kZWNvZGVPZmZzZXRdLCAn
eycpOworICAgIGlmICghZm91bmQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIEFk
dmFuY2UgdG8gY2hhcmFjdGVyIGFmdGVyIHRoZSAneycKKyAgICBtX2RlY29kZU9mZnNldCArPSAo
KGZvdW5kIC0gJmlucHV0W21fZGVjb2RlT2Zmc2V0XSkgKyAxKTsKKyAgICBBU1NFUlQobV9kZWNv
ZGVPZmZzZXQgPD0gbV94Ym1TdHJpbmcuc2l6ZSgpKTsKKyAgICBtX2RlY29kZWRIZWFkZXIgPSB0
cnVlOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFRoZSBkYXRhIGluIGFuIFhCTSBmaWxl
IGlzIHByb3ZpZGVkIGFzIGFuIGFycmF5IG9mIGVpdGhlciAiY2hhciIgb3IgInNob3J0IgorLy8g
dmFsdWVzLiBUaGVzZSB2YWx1ZXMgYXJlIGRlY29kZWQgb25lIGF0IGEgdGltZSB1c2luZyBzdHJ0
b3VsKCkgYW5kIHRoZSBiaXRzCisvLyBhcmUgdXNlZCB0byBzZXQgdGhlIGFscGhhIHZhbHVlIGZv
ciB0aGUgaW1hZ2UuCisvLworLy8gVGhlIHZhbHVlIGZvciB0aGUgY29sb3IgaXMgYWx3YXlzIHNl
dCB0byBSR0IoMCwwLDApLCB0aGUgYWxwaGEgdmFsdWUgdGFrZXMKKy8vIGNhcmUgb2Ygd2hldGhl
ciBvciBub3QgdGhlIHBpeGVsIHNob3dzIHVwLgorLy8KKy8vIFNpbmNlIHRoZSBkYXRhIG1heSBh
cnJpdmUgaW4gY2h1bmtzLCBhbmQgbWFueSBwcmVmaXhlcyBvZiB2YWxpZCBudW1iZXJzIGFyZQor
Ly8gdGhlbXNlbHZlcyB2YWxpZCBudW1iZXJzLCB0aGlzIGNvZGUgbmVlZHMgdG8gY2hlY2sgdG8g
bWFrZSBzdXJlIHRoYXQgdGhlCisvLyB2YWx1ZSBpcyBub3QgdHJ1bmNhdGVkLiBUaGlzIGlzIGRv
bmUgYnkgY29uc3VtaW5nIHNwYWNlIGFmdGVyIHRoZSB2YWx1ZQorLy8gcmVhZCB1bnRpbCBhICcs
JyBvciBhICd9JyBvY2N1cnMuIEluIGEgdmFsaWQgWEJNLCBvbmUgb2YgdGhlc2UgY2hhcmFjdGVy
cworLy8gd2lsbCBvY2N1ciBhZnRlciBlYWNoIHZhbHVlLgorLy8KKy8vIFRoZSBjaGVja3MgYWZ0
ZXIgc3RydG91bCBhcmUgYmFzZWQgb24gTW96aWxsYSdzIG5zWEJNRGVjb2Rlci5jcHAuCitib29s
IFhCTUltYWdlRGVjb2Rlcjo6ZGVjb2RlRGF0dW0odWludDE2X3QqIHJlc3VsdCkKK3sKKyAgICBj
b25zdCBjaGFyKiBpbnB1dCA9IG1feGJtU3RyaW5nLmNfc3RyKCk7CisgICAgY2hhciogZW5kUHRy
OworICAgIGNvbnN0IHVpbnQxNl90IHZhbHVlID0gc3RydG91bCgmaW5wdXRbbV9kZWNvZGVPZmZz
ZXRdLCAmZW5kUHRyLCAwKTsKKworICAgIC8vIEVuZCBvZiBpbnB1dCBvciBjb3VsZG4ndCBkZWNv
ZGUgYW55dGhpbmcsIGNhbid0IGdvIGFueSBmdXJ0aGVyLgorICAgIGlmIChlbmRQdHIgPT0gJmlu
cHV0W21fZGVjb2RlT2Zmc2V0XSB8fCAhKmVuZFB0cikKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
CisgICAgLy8gUG9zc2libHkgYSBoZXggdmFsdWUgdHJ1bmNhdGVkIGF0ICIweCIuIE5lZWQgbW9y
ZSBkYXRhLgorICAgIGlmICh2YWx1ZSA9PSAwICYmICgqZW5kUHRyID09ICd4JyB8fCAqZW5kUHRy
ID09ICdYJykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIFNraXAgd2hpdGVzcGFj
ZQorICAgIHdoaWxlICgqZW5kUHRyICYmIGlzc3BhY2UoKmVuZFB0cikpCisgICAgICAgICsrZW5k
UHRyOworCisgICAgLy8gT3V0IG9mIGlucHV0LCBkb24ndCBrbm93IHdoYXQgY29tZXMgbmV4dC4K
KyAgICBpZiAoISplbmRQdHIpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIElmIHRo
ZSBuZXh0IG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlciBpcyBub3Qgb25lIG9mIHRoZXNlLCBpdCdz
IGFuIGVycm9yLgorICAgIC8vIEV2ZXJ5IHZhbGlkIGVudHJ5IGluIHRoZSBkYXRhIGFycmF5IG5l
ZWRzIHRvIGJlIGZvbGxvd2VkIGJ5ICcsJyBvciAnfScuCisgICAgaWYgKCplbmRQdHIgIT0gJywn
ICYmICplbmRQdHIgIT0gJ30nKSB7CisgICAgICAgIHNldEZhaWxlZCgpOworICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gQXQgdGhpcyBwb2ludCB3ZSBoYXZlIGEgdmFsdWUu
CisgICAgKnJlc3VsdCA9IHZhbHVlOworCisgICAgLy8gU2tpcCBvdmVyIHRoZSBkZWNvZGVkIHZh
bHVlIHBsdXMgdGhlIGRlbGltaXRlciAoJywnIG9yICd9JykuCisgICAgbV9kZWNvZGVPZmZzZXQg
Kz0gKChlbmRQdHIgLSAmaW5wdXRbbV9kZWNvZGVPZmZzZXRdKSArIDEpOworICAgIEFTU0VSVCht
X2RlY29kZU9mZnNldCA8PSBtX3hibVN0cmluZy5zaXplKCkpOworCisgICAgcmV0dXJuIHRydWU7
Cit9CisKK2Jvb2wgWEJNSW1hZ2VEZWNvZGVyOjpkZWNvZGVEYXRhKCkKK3sKKyAgICBBU1NFUlQo
bV9kZWNvZGVPZmZzZXQgPD0gbV94Ym1TdHJpbmcuc2l6ZSgpKTsKKyAgICBBU1NFUlQobV9kZWNv
ZGVkSGVhZGVyICYmICFtX2ZyYW1lQnVmZmVyQ2FjaGUuaXNFbXB0eSgpKTsKKworICAgIFJHQkEz
MkJ1ZmZlciYgZnJhbWUgPSBtX2ZyYW1lQnVmZmVyQ2FjaGVbMF07CisKKyAgICBBU1NFUlQoZnJh
bWUuc3RhdHVzKCkgPT0gUkdCQTMyQnVmZmVyOjpGcmFtZVBhcnRpYWwpOworCisgICAgY29uc3Qg
aW50IGJpdHNQZXJSb3cgPSBzaXplKCkud2lkdGgoKTsKKworICAgIEFTU0VSVChtX2RhdGFUeXBl
ICE9IFVua25vd24pOworCisgICAgd2hpbGUgKG1fYml0c0RlY29kZWQgPCAoc2l6ZSgpLndpZHRo
KCkgKiBzaXplKCkuaGVpZ2h0KCkpKSB7CisgICAgICAgIHVpbnQxNl90IHZhbHVlOworICAgICAg
ICBpZiAoIWRlY29kZURhdHVtKCZ2YWx1ZSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisK
KyAgICAgICAgaW50IHggPSBtX2JpdHNEZWNvZGVkICUgYml0c1BlclJvdzsKKyAgICAgICAgY29u
c3QgaW50IHkgPSBtX2JpdHNEZWNvZGVkIC8gYml0c1BlclJvdzsKKworICAgICAgICAvLyBIb3cg
bWFueSBiaXRzIHdpbGwgYmUgd3JpdHRlbj8KKyAgICAgICAgY29uc3QgaW50IGJpdHMgPSBzdGQ6
Om1pbihiaXRzUGVyUm93IC0geCwgKG1fZGF0YVR5cGUgPT0gWDExKSA/IDggOiAxNik7CisKKyAg
ICAgICAgLy8gT25seSB0aGUgYWxwaGEgY2hhbm5lbCBtYXR0ZXJzIGhlcmUsIHNvIHRoZSBjb2xv
ciB2YWx1ZXMgYXJlIGFsd2F5cworICAgICAgICAvLyBzZXQgdG8gMC4KKyAgICAgICAgZm9yIChp
bnQgaSA9IDA7IGkgPCBiaXRzOyArK2kpCisgICAgICAgICAgICBmcmFtZS5zZXRSR0JBKHgrKywg
eSwgMCwgMCwgMCwgdmFsdWUgJiAoMSA8PCBpKSA/IDI1NSA6IDApOworCisgICAgICAgIG1fYml0
c0RlY29kZWQgKz0gYml0czsKKyAgICB9CisKKyAgICBmcmFtZS5zZXRTdGF0dXMoUkdCQTMyQnVm
ZmVyOjpGcmFtZUNvbXBsZXRlKTsKKworICAgIHJldHVybiB0cnVlOworfQorCisvLyBEZWNvZGUg
YXMgbXVjaCBhcyB3ZSBjYW4gb2YgdGhlIFhCTSBmaWxlLgordm9pZCBYQk1JbWFnZURlY29kZXI6
OmRlY29kZVhCTShib29sIHNpemVPbmx5KQoreworICAgIGlmIChmYWlsZWQoKSkKKyAgICAgICAg
cmV0dXJuOworCisgICAgYm9vbCBkZWNvZGVSZXN1bHQgPSBmYWxzZTsKKworICAgIGlmICghbV9k
ZWNvZGVkSGVhZGVyKQorICAgICAgICBkZWNvZGVSZXN1bHQgPSBkZWNvZGVIZWFkZXIoKTsKKwor
ICAgIGlmIChtX2RlY29kZWRIZWFkZXIgJiYgIXNpemVPbmx5KQorICAgICAgICBkZWNvZGVSZXN1
bHQgPSBkZWNvZGVEYXRhKCk7CisKKyAgICAvLyBUaGUgaGVhZGVyIG9yIHRoZSBkYXRhIGNvdWxk
IG5vdCBiZSBkZWNvZGVkLCBidXQgdGhlcmUgaXMgbm8gbW9yZQorICAgIC8vIGRhdGE6IGRlY29k
aW5nIGhhcyBmYWlsZWQuCisgICAgaWYgKCFkZWNvZGVSZXN1bHQgJiYgbV9hbGxEYXRhUmVjZWl2
ZWQpCisgICAgICAgIHNldEZhaWxlZCgpOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCklu
ZGV4OiBwbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9za2lhL1hCTUltYWdlRGVjb2Rlci5oCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIHBsYXRmb3JtL2ltYWdlLWRlY29kZXJzL3NraWEvWEJNSW1hZ2VEZWNvZGVyLmgJ
KHJldmlzaW9uIDApCisrKyBwbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9za2lhL1hCTUltYWdlRGVj
b2Rlci5oCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDgyIEBACisvKgorICogQ29weXJpZ2h0IChj
KSAyMDA4LCAyMDA5LCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqIAorICogICAgICogUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1
dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBu
YW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHBy
b21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3Bl
Y2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAi
QVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
CisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZ
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgWEJN
SW1hZ2VEZWNvZGVyX2gKKyNkZWZpbmUgWEJNSW1hZ2VEZWNvZGVyX2gKKworI2luY2x1ZGUgImNv
bmZpZy5oIgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlICJJbWFnZURlY29kZXIuaCIKKwor
bmFtZXNwYWNlIFdlYkNvcmUgeworCisgICAgLy8gVGhpcyBjbGFzcyBkZWNvZGVzIHRoZSBYQk0g
aW1hZ2UgZm9ybWF0LgorICAgIGNsYXNzIFhCTUltYWdlRGVjb2RlciA6IHB1YmxpYyBJbWFnZURl
Y29kZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgWEJNSW1hZ2VEZWNvZGVyKCk7CisgICAgICAg
IHZpcnR1YWwgflhCTUltYWdlRGVjb2RlcigpIHt9CisKKyAgICAgICAgdmlydHVhbCBTdHJpbmcg
ZmlsZW5hbWVFeHRlbnNpb24oKSBjb25zdCB7IHJldHVybiAieGJtIjsgfQorCisgICAgICAgIHZp
cnR1YWwgdm9pZCBzZXREYXRhKFNoYXJlZEJ1ZmZlciogZGF0YSwgYm9vbCBhbGxEYXRhUmVjZWl2
ZWQpOworICAgICAgICAvLyBXaGV0aGVyIG9yIG5vdCB0aGUgc2l6ZSBpbmZvcm1hdGlvbiBoYXMg
YmVlbiBkZWNvZGVkIHlldC4KKyAgICAgICAgdmlydHVhbCBib29sIGlzU2l6ZUF2YWlsYWJsZSgp
IGNvbnN0OworICAgICAgICB2aXJ0dWFsIFJHQkEzMkJ1ZmZlciogZnJhbWVCdWZmZXJBdEluZGV4
KHNpemVfdCBpbmRleCk7CisKKyAgICBwcml2YXRlOgorICAgICAgICAvLyBSZXN0cmljdHMgaW1h
Z2Ugc2l6ZSB0byBzb21ldGhpbmcgInJlYXNvbmFibGUiLgorICAgICAgICAvLyBUaGlzIHByb3Rl
Y3RzIGFnYWlucyByaWRpY3Vsb3VzbHkgbGFyZ2UgWEJNcyBhbmQgcHJldmVudHMgYmFkIHRoaW5n
cworICAgICAgICAvLyBsaWtlIG92ZXJmbG93IG9mIG1fYml0c0RlY29kZWQuCisgICAgICAgIHN0
YXRpYyBjb25zdCBpbnQgbWF4RGltZW5zaW9uID0gNjU1MzU7CisKKyAgICAgICAgLy8gSW4gWDEw
LCBhbiBhcnJheSBvZiB0eXBlICJzaG9ydCIgaXMgdXNlZCB0byBkZWNsYXJlIHRoZSBpbWFnZSBi
aXRzLAorICAgICAgICAvLyBidXQgaW4gWDExLCB0aGUgdHlwZSBpcyAiY2hhciIuCisgICAgICAg
IGVudW0gRGF0YVR5cGUgeworICAgICAgICAgICAgVW5rbm93biwKKyAgICAgICAgICAgIFgxMCwK
KyAgICAgICAgICAgIFgxMSwKKyAgICAgICAgfTsKKworICAgICAgICBib29sIGRlY29kZUhlYWRl
cigpOworICAgICAgICBib29sIGRlY29kZURhdHVtKHVpbnQxNl90KiByZXN1bHQpOworICAgICAg
ICBib29sIGRlY29kZURhdGEoKTsKKyAgICAgICAgdm9pZCBkZWNvZGVYQk0oYm9vbCBzaXplT25s
eSk7CisKKyAgICAgICAgc3RkOjpzdHJpbmcgbV94Ym1TdHJpbmc7ICAvLyBOdWxsLXRlcm1pbmF0
ZWQgY29weSBvZiB0aGUgWEJNIGRhdGEuCisgICAgICAgIHNpemVfdCBtX2RlY29kZU9mZnNldDsg
ICAgLy8gVGhlIGN1cnJlbnQgb2Zmc2V0IGluIG1feGJtU3RyaW5nIGZvciBkZWNvZGluZy4KKyAg
ICAgICAgYm9vbCBtX2FsbERhdGFSZWNlaXZlZDsKKyAgICAgICAgYm9vbCBtX2RlY29kZWRIZWFk
ZXI7CisgICAgICAgIGVudW0gRGF0YVR5cGUgbV9kYXRhVHlwZTsKKyAgICAgICAgaW50IG1fYml0
c0RlY29kZWQ7CisgICAgfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYK
</data>
<flag name="review"
          id="12926"
          type_id="1"
          status="+"
          setter="eric"
    />
          </attachment>
      

    </bug>

</bugzilla>