This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

c++/1672: dynamic_cast<> gives wrong value under certain circumstances



>Number:         1672
>Category:       c++
>Synopsis:       dynamic_cast<> gives wrong value under certain circumstances
>Confidential:   no
>Severity:       critical
>Priority:       medium
>Responsible:    unassigned
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Tue Jan 16 13:16:01 PST 2001
>Closed-Date:
>Last-Modified:
>Originator:     mac@dgp.toronto.edu
>Release:        gcc version 2.95.3 20001229 (prerelease)
>Organization:
>Environment:
i386-linux
>Description:
Upcasting and then downcasting (using dynamic_cast<>) a 
pointer sometimes results in a wrong value.  The simple
attached program demonstrates this.  On my machine that
program resulted in the following output:

B1's constructor:
   this == 0xbffffa00
   pa == 0xbffffa08
   dynamic_cast<B1*>(pa) == 0xbffffa04
dynamic_cast: dynamic_cast.cc:28: B1::B1(): Assertion `this == dynamic_cast<B1*>(pa)' failed.

The assertion should not have failed.  It seems that having
this diamond shaped class hierarchy is necessary for this
behaviour to appear.
>How-To-Repeat:
Compile and run the attached source.
  g++ dynamic_cast.ii
is sufficient.  The assertion should not fail, but does (on
all the machines I tried).
>Fix:
Not found.
>Release-Note:
>Audit-Trail:
>Unformatted:
----gnatsweb-attachment----
Content-Type: application/octet-stream; name="dynamic_cast.ii"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="dynamic_cast.ii"

IyAwICJkeW5hbWljX2Nhc3QuY2MiCiNkZWZpbmUgX19CQVNFX0ZJTEVfXyAiZHluYW1pY19jYXN0
LmNjIgojIDAgImR5bmFtaWNfY2FzdC5jYyIKI2RlZmluZSBfX1ZFUlNJT05fXyAiMi45NS4zIDIw
MDAxMjI5IChwcmVyZWxlYXNlKSIKIyAwICJkeW5hbWljX2Nhc3QuY2MiCiNkZWZpbmUgX19TSVpF
X1RZUEVfXyB1bnNpZ25lZCBpbnQKIyAwICJkeW5hbWljX2Nhc3QuY2MiCiNkZWZpbmUgX19QVFJE
SUZGX1RZUEVfXyBpbnQKIyAwICJkeW5hbWljX2Nhc3QuY2MiCiNkZWZpbmUgX19XQ0hBUl9UWVBF
X18gX193Y2hhcl90CiMgMCAiZHluYW1pY19jYXN0LmNjIgojZGVmaW5lIF9fREFURV9fICJKYW4g
MTYgMjAwMSIKIyAwICJkeW5hbWljX2Nhc3QuY2MiCiNkZWZpbmUgX19USU1FX18gIjE2OjA2OjQ5
IgojIDAgImR5bmFtaWNfY2FzdC5jYyIKI2RlZmluZSBfX1NURENfXyAxCiMgMCAiZHluYW1pY19j
YXN0LmNjIgojIDAgImR5bmFtaWNfY2FzdC5jYyIKIyAwICJkeW5hbWljX2Nhc3QuY2MiCiMgMCAi
ZHluYW1pY19jYXN0LmNjIgojIDAgImR5bmFtaWNfY2FzdC5jYyIKIyAwICJkeW5hbWljX2Nhc3Qu
Y2MiCiMgMCAiZHluYW1pY19jYXN0LmNjIgojIDAgImR5bmFtaWNfY2FzdC5jYyIKIyAwICJkeW5h
bWljX2Nhc3QuY2MiCiMgMCAiZHluYW1pY19jYXN0LmNjIgojIDAgImR5bmFtaWNfY2FzdC5jYyIK
IyAwICJkeW5hbWljX2Nhc3QuY2MiCiMgMCAiZHluYW1pY19jYXN0LmNjIgojIDAgImR5bmFtaWNf
Y2FzdC5jYyIKIyAwICJkeW5hbWljX2Nhc3QuY2MiCiMgMCAiZHluYW1pY19jYXN0LmNjIgojIDAg
ImR5bmFtaWNfY2FzdC5jYyIKIyAwICJkeW5hbWljX2Nhc3QuY2MiCiMgMSAiZHluYW1pY19jYXN0
LmNjIgojIDEgIi91c3IvaW5jbHVkZS9hc3NlcnQuaCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoKCgog
CgoKCiMgMzIgIi91c3IvaW5jbHVkZS9hc3NlcnQuaCIgMwoKCiNkZWZpbmUgCV9BU1NFUlRfSAkx
CiMgMSAiL3Vzci9pbmNsdWRlL2ZlYXR1cmVzLmgiIDEgMwogCgoKCgoKCgoKCgoKCgoKCgoKCiNk
ZWZpbmUgCV9GRUFUVVJFU19ICTEKCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK
CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKCgoKCgoKCgoKCgoKCgoKIAoKCiNk
ZWZpbmUgX19LRVJORUxfU1RSSUNUX05BTUVTCgoKIAojZGVmaW5lIAlfX1VTRV9BTlNJCTEKCgog
CgoKCgoKCgogCiMgMTQyICIvdXNyL2luY2x1ZGUvZmVhdHVyZXMuaCIgMwoKCiAKCgoKCgojZGVm
aW5lIF9CU0RfU09VUkNFCTEKI2RlZmluZSBfU1ZJRF9TT1VSQ0UJMQoKCiAKCgoKCgoKCgogCgoK
CiNkZWZpbmUgX1BPU0lYX1NPVVJDRQkxCgoKCiNkZWZpbmUgX1BPU0lYX0NfU09VUkNFCTE5OTUw
NkwKCgoKCiNkZWZpbmUgX19VU0VfUE9TSVgJMQoKCgojZGVmaW5lIF9fVVNFX1BPU0lYMgkxCgoK
CiNkZWZpbmUgX19VU0VfUE9TSVgxOTkzMDkJMQoKCgojZGVmaW5lIF9fVVNFX1BPU0lYMTk5NTA2
CTEKCgojIDIwOCAiL3Vzci9pbmNsdWRlL2ZlYXR1cmVzLmgiIDMKCgoKCgoKCgoKCgoKCgoKI2Rl
ZmluZSBfX1VTRV9NSVNDCTEKCgoKI2RlZmluZSBfX1VTRV9CU0QJMQoKCgojZGVmaW5lIF9fVVNF
X1NWSUQJMQoKCgoKCgoKCgoKIAojZGVmaW5lIF9fU1REQ19JRUNfNTU5X18JCTEKI2RlZmluZSBf
X1NURENfSUVDXzU1OV9DT01QTEVYX18JMQoKIAojZGVmaW5lIF9fU1REQ19JU09fMTA2NDZfXwkJ
MjAwMDA5TAoKIAoKCgoKCgojZGVmaW5lIF9fR05VX0xJQlJBUllfXyA2CgogCgojZGVmaW5lIAlf
X0dMSUJDX18JMgojZGVmaW5lIAlfX0dMSUJDX01JTk9SX18JMgoKIAoKCgoKCgoKI2RlZmluZSBf
X0dOVUNfUFJFUkVRKG1haiwgbWluKSAoKF9fR05VQ19fIDw8IDE2KSArIF9fR05VQ19NSU5PUl9f
ID49ICgobWFqKSA8PCAxNikgKyAobWluKSkKCgoKCgojZGVmaW5lIF9fR0xJQkNfUFJFUkVRKG1h
aiwgbWluKSAoKF9fR0xJQkNfXyA8PCAxNikgKyBfX0dMSUJDX01JTk9SX18gPj0gKChtYWopIDw8
IDE2KSArIChtaW4pKQoKCiAKCgojIDEgIi91c3IvaW5jbHVkZS9zeXMvY2RlZnMuaCIgMSAzCiAK
CgoKCgoKCgoKCgoKCgoKCgoKI2RlZmluZSAJX1NZU19DREVGU19ICTEKCiAKCgoKCiAKCgoKCgoK
IAoKCgoKCiAKCgoKI2RlZmluZSBfX1RIUk9XCXRocm93ICgpCgoKCiNkZWZpbmUgX19QKGFyZ3Mp
CWFyZ3MgX19USFJPVwogCgojZGVmaW5lIF9fUE1UKGFyZ3MpCWFyZ3MKCiMgNjUgIi91c3IvaW5j
bHVkZS9zeXMvY2RlZnMuaCIgMwoKCiAKCgojZGVmaW5lIF9fQ09OQ0FUKHgseSkJeCAjIyB5CiNk
ZWZpbmUgX19TVFJJTkcoeCkJI3gKCiAKI2RlZmluZSBfX3B0cl90IHZvaWQgKgojZGVmaW5lIF9f
bG9uZ19kb3VibGVfdCAgbG9uZyBkb3VibGUKCgogCgojZGVmaW5lIF9fQkVHSU5fREVDTFMJZXh0
ZXJuICJDIiB7CiNkZWZpbmUgX19FTkRfREVDTFMJfQoKCgoKCgogCgojZGVmaW5lIF9fYm91bmRl
ZAkKI2RlZmluZSBfX3VuYm91bmRlZAkKI2RlZmluZSBfX3B0cnZhbHVlCQoKCgogCgoKCgoKCgoK
CgoKI2RlZmluZSBfX1JFRElSRUNUKG5hbWUsIHByb3RvLCBhbGlhcykgbmFtZSBwcm90byBfX2Fz
bV9fIChfX0FTTU5BTUUgKCNhbGlhcykpCiNkZWZpbmUgX19BU01OQU1FKGNuYW1lKSAgX19BU01O
QU1FMiAoX19VU0VSX0xBQkVMX1BSRUZJWF9fLCBjbmFtZSkKI2RlZmluZSBfX0FTTU5BTUUyKHBy
ZWZpeCwgY25hbWUpIF9fU1RSSU5HIChwcmVmaXgpIGNuYW1lCgogCgoKCgoKCgogCgoKCgoKCiAK
CgoKCgojZGVmaW5lIF9fYXR0cmlidXRlX21hbGxvY19fIAoKCiAKCgoKCgojZGVmaW5lIF9fYXR0
cmlidXRlX3B1cmVfXyAKCgogCgoKCiNkZWZpbmUgX19hdHRyaWJ1dGVfZm9ybWF0X2FyZ19fKHgp
IF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9hcmdfXyAoeCkpKQoKCgoKIAoKCgoKCgoKIAoKCgoK
IAoKCgojZGVmaW5lIF9fcmVzdHJpY3RfYXJyCgoKIyAyODMgIi91c3IvaW5jbHVkZS9mZWF0dXJl
cy5oIiAyIDMKCgoKIAoKCgoKCgoKCiAKCgoKCiAKCiAKCgoKCgoKCgojIDEgIi91c3IvaW5jbHVk
ZS9nbnUvc3R1YnMuaCIgMSAzCiAKCgoKI2RlZmluZSBfX3N0dWJfX19rZXJuZWxfY29zbAojZGVm
aW5lIF9fc3R1Yl9fX2tlcm5lbF9zaW5sCiNkZWZpbmUgX19zdHViX19fa2VybmVsX3RhbmwKI2Rl
ZmluZSBfX3N0dWJfY2hmbGFncwojZGVmaW5lIF9fc3R1Yl9lcmZjbAojZGVmaW5lIF9fc3R1Yl9l
cmZsCiNkZWZpbmUgX19zdHViX2ZhdHRhY2gKI2RlZmluZSBfX3N0dWJfZmNoZmxhZ3MKI2RlZmlu
ZSBfX3N0dWJfZmRldGFjaAojZGVmaW5lIF9fc3R1Yl9mZXhlY3ZlCiNkZWZpbmUgX19zdHViX2dl
dGNvbnRleHQKI2RlZmluZSBfX3N0dWJfZ3R0eQojZGVmaW5lIF9fc3R1Yl9qMGwKI2RlZmluZSBf
X3N0dWJfajFsCiNkZWZpbmUgX19zdHViX2pubAojZGVmaW5lIF9fc3R1Yl9sZ2FtbWFsCiNkZWZp
bmUgX19zdHViX2xnYW1tYWxfcgojZGVmaW5lIF9fc3R1Yl9tYWR2aXNlCiNkZWZpbmUgX19zdHVi
X21ha2Vjb250ZXh0CiNkZWZpbmUgX19zdHViX21pbmNvcmUKI2RlZmluZSBfX3N0dWJfcG9zaXhf
ZmFkdmlzZQojZGVmaW5lIF9fc3R1Yl9wb3NpeF9mYWR2aXNlNjQKI2RlZmluZSBfX3N0dWJfcmV2
b2tlCiNkZWZpbmUgX19zdHViX3NldGNvbnRleHQKI2RlZmluZSBfX3N0dWJfc2V0bG9naW4KI2Rl
ZmluZSBfX3N0dWJfc2lncmV0dXJuCiNkZWZpbmUgX19zdHViX3NzdGsKI2RlZmluZSBfX3N0dWJf
c3R0eQojZGVmaW5lIF9fc3R1Yl9zd2FwY29udGV4dAojZGVmaW5lIF9fc3R1Yl95MGwKI2RlZmlu
ZSBfX3N0dWJfeTFsCiNkZWZpbmUgX19zdHViX3lubAojIDMxMSAiL3Vzci9pbmNsdWRlL2ZlYXR1
cmVzLmgiIDIgMwoKCgoKIyAzNSAiL3Vzci9pbmNsdWRlL2Fzc2VydC5oIiAyIDMKCgogCgoKCgoj
IDU2ICIvdXNyL2luY2x1ZGUvYXNzZXJ0LmgiIDMKCgpleHRlcm4gIkMiIHsgCgogCmV4dGVybiB2
b2lkIF9fYXNzZXJ0X2ZhaWwgKF9fY29uc3QgY2hhciAqX19hc3NlcnRpb24sIF9fY29uc3QgY2hh
ciAqX19maWxlLAoJCQkgICB1bnNpZ25lZCBpbnQgX19saW5lLCBfX2NvbnN0IGNoYXIgKl9fZnVu
Y3Rpb24pCiAgICAgdGhyb3cgKCkgIF9fYXR0cmlidXRlX18gKChfX25vcmV0dXJuX18pKTsKCiAK
ZXh0ZXJuIHZvaWQgX19hc3NlcnRfcGVycm9yX2ZhaWwgKGludCBfX2Vycm51bSwgX19jb25zdCBj
aGFyICpfX2ZpbGUsCgkJCQkgIHVuc2lnbmVkIGludCBfX2xpbmUsCgkJCQkgIF9fY29uc3QgY2hh
ciAqX19mdW5jdGlvbikKICAgICB0aHJvdyAoKSAgX19hdHRyaWJ1dGVfXyAoKF9fbm9yZXR1cm5f
XykpOwoKCiAKCmV4dGVybiB2b2lkIF9fYXNzZXJ0IChjb25zdCBjaGFyICpfX2Fzc2VydGlvbiwg
Y29uc3QgY2hhciAqX19maWxlLCBpbnQgX19saW5lKQogICAgIHRocm93ICgpICBfX2F0dHJpYnV0
ZV9fICgoX19ub3JldHVybl9fKSk7CgoKfSAKCiNkZWZpbmUgYXNzZXJ0KGV4cHIpCSgodm9pZCkg
KChleHByKSA/IDAgOgkoX19hc3NlcnRfZmFpbCAoX19TVFJJTkcoZXhwciksCV9fRklMRV9fLCBf
X0xJTkVfXywgX19BU1NFUlRfRlVOQ1RJT04pLCAwKSkpCgoKCgoKCgoKCgoKIAoKCgoKCiNkZWZp
bmUgX19BU1NFUlRfRlVOQ1RJT04JX19QUkVUVFlfRlVOQ1RJT05fXwoKCgoKCgoKCgojIDEgImR5
bmFtaWNfY2FzdC5jYyIgMgoKIyAxICIvdXNyL2xpYi9nY2MtbGliL2kzODYtbGludXgvMi45NS4z
Ly4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvaW9zdHJlYW0iIDEgMwogCiAKCgojZGVmaW5lIF9f
SU9TVFJFQU1fXwojIDEgIi91c3IvbGliL2djYy1saWIvaTM4Ni1saW51eC8yLjk1LjMvLi4vLi4v
Li4vLi4vaW5jbHVkZS9nKystMy9pb3N0cmVhbS5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCgoK
CgoKCgoKI3ByYWdtYSBpbnRlcmZhY2UKCiNkZWZpbmUgX0lPU1RSRUFNX0gKCiMgMSAiL3Vzci9s
aWIvZ2NjLWxpYi9pMzg2LWxpbnV4LzIuOTUuMy8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL3N0
cmVhbWJ1Zi5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgojZGVmaW5lIF9TVFJFQU1C
VUZfSAoKI3ByYWdtYSBpbnRlcmZhY2UKCgogICAKCiNkZWZpbmUgX0lPX05FV19TVFJFQU1TIAoK
ZXh0ZXJuICJDIiB7CiMgMSAiL3Vzci9pbmNsdWRlL2xpYmlvLmgiIDEgMwogCgoKCgoKCgoKCgoK
CgoKCgoKCgoKCgoKCgoKI2RlZmluZSBfSU9fU1RESU9fSAoKIyAxICIvdXNyL2luY2x1ZGUvX0df
Y29uZmlnLmgiIDEgMwogCgoKCiNkZWZpbmUgX0dfY29uZmlnX2ggMQoKIAoKIyAxICIvdXNyL2lu
Y2x1ZGUvYml0cy90eXBlcy5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCiAKCgoKCiNkZWZpbmUg
CV9CSVRTX1RZUEVTX0gJMQoKCgojZGVmaW5lIF9fbmVlZF9zaXplX3QKIyAxICIvdXNyL2xpYi9n
Y2MtbGliL2kzODYtbGludXgvMi45NS4zL2luY2x1ZGUvc3RkZGVmLmgiIDEgMwoKCgoKCgogCgoK
IyAxOSAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2LWxpbnV4LzIuOTUuMy9pbmNsdWRlL3N0ZGRlZi5o
IiAzCgoKCiAKCgogCgoKCgoKIAoKCiMgNjEgIi91c3IvbGliL2djYy1saWIvaTM4Ni1saW51eC8y
Ljk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCiAKCgoKCgogCgoKCgoKCgoKCgoKCgoKCgoKCiAK
CgoKCgogCgogCgojIDEzMSAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2LWxpbnV4LzIuOTUuMy9pbmNs
dWRlL3N0ZGRlZi5oIiAzCgoKIAoKIAoKCgoKCgoKCgoKCgoKCgoKI2RlZmluZSBfX3NpemVfdF9f
CQojZGVmaW5lIF9TSVpFX1QKI2RlZmluZSBfU1lTX1NJWkVfVF9ICiNkZWZpbmUgX1RfU0laRV8K
I2RlZmluZSBfVF9TSVpFCiNkZWZpbmUgX19TSVpFX1QKI2RlZmluZSBfU0laRV9UXwojZGVmaW5l
IF9CU0RfU0laRV9UXwojZGVmaW5lIF9TSVpFX1RfREVGSU5FRF8KI2RlZmluZSBfU0laRV9UX0RF
RklORUQKI2RlZmluZSBfX19pbnRfc2l6ZV90X2gKI2RlZmluZSBfR0NDX1NJWkVfVAojZGVmaW5l
IF9TSVpFVF8KI2RlZmluZSBfX3NpemVfdAoKCgoKdHlwZWRlZiB1bnNpZ25lZCBpbnQgc2l6ZV90
OwoKCgoKCgoKCgoKCgoKCgoKCgojdW5kZWYgCV9fbmVlZF9zaXplX3QKCgoKIAoKCgoKIAoKIyAy
NzEgIi91c3IvbGliL2djYy1saWIvaTM4Ni1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIg
MwoKCiMgMjgzICIvdXNyL2xpYi9nY2MtbGliL2kzODYtbGludXgvMi45NS4zL2luY2x1ZGUvc3Rk
ZGVmLmgiIDMKCgogCgogCgojIDMxNyAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2LWxpbnV4LzIuOTUu
My9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKCgogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiMgMjkgIi91
c3IvaW5jbHVkZS9iaXRzL3R5cGVzLmgiIDIgMwoKCiAKdHlwZWRlZiB1bnNpZ25lZCBjaGFyIF9f
dV9jaGFyOwp0eXBlZGVmIHVuc2lnbmVkIHNob3J0IF9fdV9zaG9ydDsKdHlwZWRlZiB1bnNpZ25l
ZCBpbnQgX191X2ludDsKdHlwZWRlZiB1bnNpZ25lZCBsb25nIF9fdV9sb25nOwoKX19leHRlbnNp
b25fXyB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgX191X3F1YWRfdDsKX19leHRlbnNp
b25fXyB0eXBlZGVmIGxvbmcgbG9uZyBpbnQgX19xdWFkX3Q7CiMgNDggIi91c3IvaW5jbHVkZS9i
aXRzL3R5cGVzLmgiIDMKCnR5cGVkZWYgc2lnbmVkIGNoYXIgX19pbnQ4X3Q7CnR5cGVkZWYgdW5z
aWduZWQgY2hhciBfX3VpbnQ4X3Q7CnR5cGVkZWYgc2lnbmVkIHNob3J0IGludCBfX2ludDE2X3Q7
CnR5cGVkZWYgdW5zaWduZWQgc2hvcnQgaW50IF9fdWludDE2X3Q7CnR5cGVkZWYgc2lnbmVkIGlu
dCBfX2ludDMyX3Q7CnR5cGVkZWYgdW5zaWduZWQgaW50IF9fdWludDMyX3Q7CgpfX2V4dGVuc2lv
bl9fIHR5cGVkZWYgc2lnbmVkIGxvbmcgbG9uZyBpbnQgX19pbnQ2NF90OwpfX2V4dGVuc2lvbl9f
IHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIGludCBfX3VpbnQ2NF90OwoKdHlwZWRlZiBfX3F1
YWRfdCAqX19xYWRkcl90OwoKdHlwZWRlZiBfX3VfcXVhZF90IF9fZGV2X3Q7CQkgCnR5cGVkZWYg
X191X2ludCBfX3VpZF90OwkJIAp0eXBlZGVmIF9fdV9pbnQgX19naWRfdDsJCSAKdHlwZWRlZiBf
X3VfbG9uZyBfX2lub190OwkJIAp0eXBlZGVmIF9fdV9pbnQgX19tb2RlX3Q7CQkgCnR5cGVkZWYg
X191X2ludCBfX25saW5rX3Q7IAkJIAp0eXBlZGVmIGxvbmcgaW50IF9fb2ZmX3Q7CQkgCnR5cGVk
ZWYgX19xdWFkX3QgX19sb2ZmX3Q7CQkgCnR5cGVkZWYgaW50IF9fcGlkX3Q7CQkJIAp0eXBlZGVm
IGludCBfX3NzaXplX3Q7CQkJIAp0eXBlZGVmIF9fdV9sb25nIF9fcmxpbV90OwkJIAp0eXBlZGVm
IF9fdV9xdWFkX3QgX19ybGltNjRfdDsJCSAKdHlwZWRlZiBfX3VfaW50IF9faWRfdDsJCQkgCgp0
eXBlZGVmIHN0cnVjdAogIHsKICAgIGludCBfX3ZhbFsyXTsKICB9IF9fZnNpZF90OwkJCQkgCgog
CnR5cGVkZWYgaW50IF9fZGFkZHJfdDsJCQkgCnR5cGVkZWYgY2hhciAqX19jYWRkcl90Owp0eXBl
ZGVmIGxvbmcgaW50IF9fdGltZV90Owp0eXBlZGVmIHVuc2lnbmVkIGludCBfX3VzZWNvbmRzX3Q7
CnR5cGVkZWYgbG9uZyBpbnQgX19zdXNlY29uZHNfdDsKdHlwZWRlZiBsb25nIGludCBfX3N3Ymxr
X3Q7CQkgCgwKdHlwZWRlZiBsb25nIGludCBfX2Nsb2NrX3Q7CgogCnR5cGVkZWYgaW50IF9fY2xv
Y2tpZF90OwoKIAp0eXBlZGVmIGludCBfX3RpbWVyX3Q7CgoKIAp0eXBlZGVmIHVuc2lnbmVkIGxv
bmcgaW50IF9fZmRfbWFzazsKCiAKI2RlZmluZSBfX0ZEX1NFVFNJWkUJMTAyNAoKIAojZGVmaW5l
IF9fTkZEQklUUwkoOCAqIHNpemVvZiAoX19mZF9tYXNrKSkKI2RlZmluZSAJX19GREVMVChkKQko
KGQpIC8gX19ORkRCSVRTKQojZGVmaW5lIAlfX0ZETUFTSyhkKQkoKF9fZmRfbWFzaykgMSA8PCAo
KGQpICUgX19ORkRCSVRTKSkKCiAKdHlwZWRlZiBzdHJ1Y3QKICB7CiAgICAgCgoKCgoKICAgIF9f
ZmRfbWFzayBfX2Zkc19iaXRzWzEwMjQgIC8gKDggKiBzaXplb2YgKF9fZmRfbWFzaykpIF07CiNk
ZWZpbmUgX19GRFNfQklUUyhzZXQpICgoc2V0KS0+X19mZHNfYml0cykKCiAgfSBfX2ZkX3NldDsK
Cgp0eXBlZGVmIGludCBfX2tleV90OwoKIAp0eXBlZGVmIHVuc2lnbmVkIHNob3J0IGludCBfX2lw
Y19waWRfdDsKCgogCnR5cGVkZWYgbG9uZyBpbnQgX19ibGtzaXplX3Q7CgogCgogCnR5cGVkZWYg
bG9uZyBpbnQgX19ibGtjbnRfdDsKdHlwZWRlZiBfX3F1YWRfdCBfX2Jsa2NudDY0X3Q7CgogCnR5
cGVkZWYgX191X2xvbmcgX19mc2Jsa2NudF90Owp0eXBlZGVmIF9fdV9xdWFkX3QgX19mc2Jsa2Nu
dDY0X3Q7CgogCnR5cGVkZWYgX191X2xvbmcgX19mc2ZpbGNudF90Owp0eXBlZGVmIF9fdV9xdWFk
X3QgX19mc2ZpbGNudDY0X3Q7CgogCnR5cGVkZWYgX191X3F1YWRfdCBfX2lubzY0X3Q7CgogCnR5
cGVkZWYgX19sb2ZmX3QgX19vZmY2NF90OwoKIAp0eXBlZGVmIGxvbmcgaW50IF9fdF9zY2FsYXJf
dDsKdHlwZWRlZiB1bnNpZ25lZCBsb25nIGludCBfX3RfdXNjYWxhcl90OwoKIAp0eXBlZGVmIGlu
dCBfX2ludHB0cl90OwoKIAp0eXBlZGVmIHVuc2lnbmVkIGludCBfX3NvY2tsZW5fdDsKCgogCgoj
IDEgIi91c3IvaW5jbHVkZS9iaXRzL3B0aHJlYWR0eXBlcy5oIiAxIDMKIAogCiAKIAogCiAKIAog
CiAKIAogCiAKIAoKCgoKCgojZGVmaW5lIF9CSVRTX1BUSFJFQURUWVBFU19ICTEKCiNkZWZpbmUg
X19uZWVkX3NjaGVkcGFyYW0KIyAxICIvdXNyL2luY2x1ZGUvYml0cy9zY2hlZC5oIiAxIDMKIAoK
CgoKCgoKCgoKCgoKCgoKCgoKIyA2MiAiL3Vzci9pbmNsdWRlL2JpdHMvc2NoZWQuaCIgMwoKCgoK
I2RlZmluZSBfX2RlZmluZWRfc2NoZWRwYXJhbQkxCiAKc3RydWN0IF9fc2NoZWRfcGFyYW0KICB7
CiAgICBpbnQgc2NoZWRfcHJpb3JpdHk7CiAgfTsKI3VuZGVmIF9fbmVlZF9zY2hlZHBhcmFtCgoj
IDIzICIvdXNyL2luY2x1ZGUvYml0cy9wdGhyZWFkdHlwZXMuaCIgMiAzCgoKIApzdHJ1Y3QgX3B0
aHJlYWRfZmFzdGxvY2sKewogIGxvbmcgaW50IF9fc3RhdHVzOyAgICAKICBpbnQgX19zcGlubG9j
azsgICAgICAgCgp9OwoKCiAKdHlwZWRlZiBzdHJ1Y3QgX3B0aHJlYWRfZGVzY3Jfc3RydWN0ICpf
cHRocmVhZF9kZXNjcjsKI2RlZmluZSBfUFRIUkVBRF9ERVNDUl9ERUZJTkVECgoKCiAKdHlwZWRl
ZiBzdHJ1Y3QKewogIGludCBfX2RldGFjaHN0YXRlOwogIGludCBfX3NjaGVkcG9saWN5OwogIHN0
cnVjdCBfX3NjaGVkX3BhcmFtIF9fc2NoZWRwYXJhbTsKICBpbnQgX19pbmhlcml0c2NoZWQ7CiAg
aW50IF9fc2NvcGU7CiAgc2l6ZV90IF9fZ3VhcmRzaXplOwogIGludCBfX3N0YWNrYWRkcl9zZXQ7
CiAgdm9pZCAqX19zdGFja2FkZHI7CiAgc2l6ZV90IF9fc3RhY2tzaXplOwp9IHB0aHJlYWRfYXR0
cl90OwoKCiAKdHlwZWRlZiBzdHJ1Y3QKewogIHN0cnVjdCBfcHRocmVhZF9mYXN0bG9jayBfX2Nf
bG9jazsgIAogIF9wdGhyZWFkX2Rlc2NyIF9fY193YWl0aW5nOyAgICAgICAgIAp9IHB0aHJlYWRf
Y29uZF90OwoKCiAKdHlwZWRlZiBzdHJ1Y3QKewogIGludCBfX2R1bW15Owp9IHB0aHJlYWRfY29u
ZGF0dHJfdDsKCiAKdHlwZWRlZiB1bnNpZ25lZCBpbnQgcHRocmVhZF9rZXlfdDsKCgogCiAKCnR5
cGVkZWYgc3RydWN0CnsKICBpbnQgX19tX3Jlc2VydmVkOyAgICAgICAgICAgICAgICAKICBpbnQg
X19tX2NvdW50OyAgICAgICAgICAgICAgICAgICAKICBfcHRocmVhZF9kZXNjciBfX21fb3duZXI7
ICAgICAgICAKICBpbnQgX19tX2tpbmQ7ICAgICAgICAgICAgICAgICAgICAKICBzdHJ1Y3QgX3B0
aHJlYWRfZmFzdGxvY2sgX19tX2xvY2s7ICAKfSBwdGhyZWFkX211dGV4X3Q7CgoKIAp0eXBlZGVm
IHN0cnVjdAp7CiAgaW50IF9fbXV0ZXhraW5kOwp9IHB0aHJlYWRfbXV0ZXhhdHRyX3Q7CgoKIAp0
eXBlZGVmIGludCBwdGhyZWFkX29uY2VfdDsKCgojIDExNyAiL3Vzci9pbmNsdWRlL2JpdHMvcHRo
cmVhZHR5cGVzLmgiIDMKCgojIDEzNiAiL3Vzci9pbmNsdWRlL2JpdHMvcHRocmVhZHR5cGVzLmgi
IDMKCgoKIAp0eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50IHB0aHJlYWRfdDsKCgojIDE2NSAiL3Vz
ci9pbmNsdWRlL2JpdHMvdHlwZXMuaCIgMiAzCgoKCgojIDkgIi91c3IvaW5jbHVkZS9fR19jb25m
aWcuaCIgMiAzCgojZGVmaW5lIF9fbmVlZF9zaXplX3QKI2RlZmluZSBfX25lZWRfd2NoYXJfdAoj
ZGVmaW5lIF9fbmVlZF93aW50X3QKI2RlZmluZSBfX25lZWRfTlVMTAojIDEgIi91c3IvbGliL2dj
Yy1saWIvaTM4Ni1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMSAzCgoKCgoKCiAKCgoj
IDE5ICIvdXNyL2xpYi9nY2MtbGliL2kzODYtbGludXgvMi45NS4zL2luY2x1ZGUvc3RkZGVmLmgi
IDMKCgoKIAoKCiAKCgoKCgogCgoKIyA2MSAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2LWxpbnV4LzIu
OTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKIAoKCgoKCiAKCgoKCgoKCgoKCgoKCgoKCgoKIAoK
CgoKCiAKCiAKCiMgMTMxICIvdXNyL2xpYi9nY2MtbGliL2kzODYtbGludXgvMi45NS4zL2luY2x1
ZGUvc3RkZGVmLmgiIDMKCgogCgogCgoKIyAxODggIi91c3IvbGliL2djYy1saWIvaTM4Ni1saW51
eC8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMwoKI3VuZGVmIAlfX25lZWRfc2l6ZV90CgoKCiAK
CgoKCiAKCgoKCgoKCgoKCgoKCgoKI2RlZmluZSBfX3djaGFyX3RfXwkKI2RlZmluZSBfV0NIQVJf
VAojZGVmaW5lIF9UX1dDSEFSXwojZGVmaW5lIF9UX1dDSEFSCiNkZWZpbmUgX19XQ0hBUl9UCiNk
ZWZpbmUgX1dDSEFSX1RfCiNkZWZpbmUgX0JTRF9XQ0hBUl9UXwojZGVmaW5lIF9XQ0hBUl9UX0RF
RklORURfCiNkZWZpbmUgX1dDSEFSX1RfREVGSU5FRAojZGVmaW5lIF9XQ0hBUl9UX0gKI2RlZmlu
ZSBfX19pbnRfd2NoYXJfdF9oCiNkZWZpbmUgX19JTlRfV0NIQVJfVF9ICiNkZWZpbmUgX0dDQ19X
Q0hBUl9UCgogCgoKCgoKCgoKCgojdW5kZWYgX0JTRF9XQ0hBUl9UXwoKCgoKCgoKCgoKCgoKCgoK
CgoKCgoKCgoKCgoKCgojdW5kZWYgCV9fbmVlZF93Y2hhcl90CgoKCgojZGVmaW5lIF9XSU5UX1QK
CgojZGVmaW5lIF9fV0lOVF9UWVBFX18gdW5zaWduZWQgaW50Cgp0eXBlZGVmIHVuc2lnbmVkIGlu
dCAgd2ludF90OwoKI3VuZGVmIF9fbmVlZF93aW50X3QKCgogCgogCgojIDMxNyAiL3Vzci9saWIv
Z2NjLWxpYi9pMzg2LWxpbnV4LzIuOTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKCgogCgoKCgoj
ZGVmaW5lIE5VTEwgX19udWxsCgoKCgojdW5kZWYgCV9fbmVlZF9OVUxMCgoKCgoKCgoKCgoKIyAx
NCAiL3Vzci9pbmNsdWRlL19HX2NvbmZpZy5oIiAyIDMKCgoKCgoKCgoKI2RlZmluZSBfX25lZWRf
bWJzdGF0ZV90CiMgMSAiL3Vzci9pbmNsdWRlL3djaGFyLmgiIDEgMwogCgoKCgoKCgoKCgoKCgoK
CgoKIAoKCgoKCgoKCgoKCiMgNDMgIi91c3IvaW5jbHVkZS93Y2hhci5oIiAzCgojZGVmaW5lIF9f
bmVlZF93aW50X3QKIyAxICIvdXNyL2xpYi9nY2MtbGliL2kzODYtbGludXgvMi45NS4zL2luY2x1
ZGUvc3RkZGVmLmgiIDEgMwoKCgoKCgogCgoKIyAxOSAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2LWxp
bnV4LzIuOTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKCiAKCgogCgoKCgoKIAoKCiMgNjEgIi91
c3IvbGliL2djYy1saWIvaTM4Ni1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCiAK
CgoKCgogCgoKCgoKCgoKCgoKCgoKCgoKCiAKCgoKCgogCgogCgojIDEzMSAiL3Vzci9saWIvZ2Nj
LWxpYi9pMzg2LWxpbnV4LzIuOTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKIAoKIAoKIyAxOTAg
Ii91c3IvbGliL2djYy1saWIvaTM4Ni1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMwoK
CgogCgoKCgogCgojIDI3MSAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2LWxpbnV4LzIuOTUuMy9pbmNs
dWRlL3N0ZGRlZi5oIiAzCgoKCgoKCgoKCgoKI3VuZGVmIF9fbmVlZF93aW50X3QKCgogCgogCgoj
IDMxNyAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2LWxpbnV4LzIuOTUuMy9pbmNsdWRlL3N0ZGRlZi5o
IiAzCgoKCgogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiMgNDUgIi91c3IvaW5jbHVkZS93Y2hhci5o
IiAyIDMKCgojIDEgIi91c3IvaW5jbHVkZS9iaXRzL3djaGFyLmgiIDEgMwogCgoKCgoKCgoKCgoK
CgoKCgoKCgojZGVmaW5lIF9CSVRTX1dDSEFSX0gJMQoKI2RlZmluZSBfX1dDSEFSX01JTgkoLTIx
NDc0ODM2NDdsIC0gMWwpCiNkZWZpbmUgX19XQ0hBUl9NQVgJKDIxNDc0ODM2NDdsKQoKCiMgNDcg
Ii91c3IvaW5jbHVkZS93Y2hhci5oIiAyIDMKCgogCgoKCgoKCgoKCgoKCiNkZWZpbmUgX19tYnN0
YXRlX3RfZGVmaW5lZAkxCiAKdHlwZWRlZiBzdHJ1Y3QKewogIGludCBfX2NvdW50OwogIHVuaW9u
CiAgewogICAgd2ludF90IF9fd2NoOwogICAgY2hhciBfX3djaGJbNF07CiAgfSBfX3ZhbHVlOwkJ
IAp9IF9fbWJzdGF0ZV90OwoKI3VuZGVmIF9fbmVlZF9tYnN0YXRlX3QKCgogCgojIDY4MSAiL3Vz
ci9pbmNsdWRlL3djaGFyLmgiIDMKCgoKIyAyNCAiL3Vzci9pbmNsdWRlL19HX2NvbmZpZy5oIiAy
IDMKCiNkZWZpbmUgX0dfc2l6ZV90CXNpemVfdAp0eXBlZGVmIHN0cnVjdAp7CiAgX19vZmZfdCBf
X3BvczsKICBfX21ic3RhdGVfdCBfX3N0YXRlOwp9IF9HX2Zwb3NfdDsKdHlwZWRlZiBzdHJ1Y3QK
ewogIF9fb2ZmNjRfdCBfX3BvczsKICBfX21ic3RhdGVfdCBfX3N0YXRlOwp9IF9HX2Zwb3M2NF90
OwojZGVmaW5lIF9HX3NzaXplX3QJX19zc2l6ZV90CiNkZWZpbmUgX0dfb2ZmX3QJX19vZmZfdAoj
ZGVmaW5lIF9HX29mZjY0X3QJX19vZmY2NF90CiNkZWZpbmUgCV9HX3BpZF90CV9fcGlkX3QKI2Rl
ZmluZSAJX0dfdWlkX3QJX191aWRfdAojZGVmaW5lIF9HX3djaGFyX3QJd2NoYXJfdAojZGVmaW5l
IF9HX3dpbnRfdAl3aW50X3QKI2RlZmluZSBfR19zdGF0NjQJc3RhdDY0CiMgMSAiL3Vzci9pbmNs
dWRlL2djb252LmgiIDEgMwogCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoKI2RlZmluZSBfR0NPTlZf
SAkxCgoKI2RlZmluZSBfX25lZWRfbWJzdGF0ZV90CiMgMSAiL3Vzci9pbmNsdWRlL3djaGFyLmgi
IDEgMwogCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoKCgoKCgoKCiMgNDMgIi91c3IvaW5jbHVkZS93
Y2hhci5oIiAzCgojZGVmaW5lIF9fbmVlZF93aW50X3QKIyAxICIvdXNyL2xpYi9nY2MtbGliL2kz
ODYtbGludXgvMi45NS4zL2luY2x1ZGUvc3RkZGVmLmgiIDEgMwoKCgoKCgogCgoKIyAxOSAiL3Vz
ci9saWIvZ2NjLWxpYi9pMzg2LWxpbnV4LzIuOTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKCiAK
CgogCgoKCgoKIAoKCiMgNjEgIi91c3IvbGliL2djYy1saWIvaTM4Ni1saW51eC8yLjk1LjMvaW5j
bHVkZS9zdGRkZWYuaCIgMwoKCiAKCgoKCgogCgoKCgoKCgoKCgoKCgoKCgoKCiAKCgoKCgogCgog
CgojIDEzMSAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2LWxpbnV4LzIuOTUuMy9pbmNsdWRlL3N0ZGRl
Zi5oIiAzCgoKIAoKIAoKIyAxOTAgIi91c3IvbGliL2djYy1saWIvaTM4Ni1saW51eC8yLjk1LjMv
aW5jbHVkZS9zdGRkZWYuaCIgMwoKCgogCgoKCgogCgojIDI3MSAiL3Vzci9saWIvZ2NjLWxpYi9p
Mzg2LWxpbnV4LzIuOTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKCgoKCgoKCgoKI3VuZGVmIF9f
bmVlZF93aW50X3QKCgogCgogCgojIDMxNyAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2LWxpbnV4LzIu
OTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKCgogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiMgNDUg
Ii91c3IvaW5jbHVkZS93Y2hhci5oIiAyIDMKCgoKCiAKCgoKCgoKCgoKCgojIDczICIvdXNyL2lu
Y2x1ZGUvd2NoYXIuaCIgMwoKI3VuZGVmIF9fbmVlZF9tYnN0YXRlX3QKCgogCgojIDY4MSAiL3Vz
ci9pbmNsdWRlL3djaGFyLmgiIDMKCgoKIyAyOCAiL3Vzci9pbmNsdWRlL2djb252LmgiIDIgMwoK
I2RlZmluZSBfX25lZWRfc2l6ZV90CiMgMSAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2LWxpbnV4LzIu
OTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAxIDMKCgoKCgoKIAoKCiMgMTkgIi91c3IvbGliL2djYy1s
aWIvaTM4Ni1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCgogCgoKIAoKCgoKCiAK
CgojIDYxICIvdXNyL2xpYi9nY2MtbGliL2kzODYtbGludXgvMi45NS4zL2luY2x1ZGUvc3RkZGVm
LmgiIDMKCgogCgoKCgoKIAoKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKIAoKIAoKIyAxMzEgIi91
c3IvbGliL2djYy1saWIvaTM4Ni1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCiAK
CiAKCgojIDE4OCAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2LWxpbnV4LzIuOTUuMy9pbmNsdWRlL3N0
ZGRlZi5oIiAzCgojdW5kZWYgCV9fbmVlZF9zaXplX3QKCgoKIAoKCgoKIAoKIyAyNzEgIi91c3Iv
bGliL2djYy1saWIvaTM4Ni1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCiMgMjgz
ICIvdXNyL2xpYi9nY2MtbGliL2kzODYtbGludXgvMi45NS4zL2luY2x1ZGUvc3RkZGVmLmgiIDMK
CgogCgogCgojIDMxNyAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2LWxpbnV4LzIuOTUuMy9pbmNsdWRl
L3N0ZGRlZi5oIiAzCgoKCgogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiMgMzAgIi91c3IvaW5jbHVk
ZS9nY29udi5oIiAyIDMKCgogCiNkZWZpbmUgX19VTktOT1dOXzEwNjQ2X0NIQVIJKCh3Y2hhcl90
KSAweGZmZmQpCgogCmVudW0KewogIF9fR0NPTlZfT0sgPSAwLAogIF9fR0NPTlZfTk9DT05WLAog
IF9fR0NPTlZfTk9EQiwKICBfX0dDT05WX05PTUVNLAoKICBfX0dDT05WX0VNUFRZX0lOUFVULAog
IF9fR0NPTlZfRlVMTF9PVVRQVVQsCiAgX19HQ09OVl9JTExFR0FMX0lOUFVULAogIF9fR0NPTlZf
SU5DT01QTEVURV9JTlBVVCwKCiAgX19HQ09OVl9JTExFR0FMX0RFU0NSSVBUT1IsCiAgX19HQ09O
Vl9JTlRFUk5BTF9FUlJPUgp9OwoKCiAKZW51bQp7CiAgX19HQ09OVl9JU19MQVNUID0gMHgwMDAx
LAogIF9fR0NPTlZfSUdOT1JFX0VSUk9SUyA9IDB4MDAwMgp9OwoKCiAKc3RydWN0IF9fZ2NvbnZf
c3RlcDsKc3RydWN0IF9fZ2NvbnZfc3RlcF9kYXRhOwpzdHJ1Y3QgX19nY29udl9sb2FkZWRfb2Jq
ZWN0OwpzdHJ1Y3QgX19nY29udl90cmFuc19kYXRhOwoKCiAKdHlwZWRlZiBpbnQgKCpfX2djb252
X2ZjdCkgKHN0cnVjdCBfX2djb252X3N0ZXAgKiwgc3RydWN0IF9fZ2NvbnZfc3RlcF9kYXRhICos
CgkJCSAgICBfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKiosIF9fY29uc3QgdW5zaWduZWQgY2hhciAq
LAoJCQkgICAgdW5zaWduZWQgY2hhciAqKiwgc2l6ZV90ICosIGludCwgaW50KTsKCiAKdHlwZWRl
ZiBpbnQgKCpfX2djb252X2luaXRfZmN0KSAoc3RydWN0IF9fZ2NvbnZfc3RlcCAqKTsKdHlwZWRl
ZiB2b2lkICgqX19nY29udl9lbmRfZmN0KSAoc3RydWN0IF9fZ2NvbnZfc3RlcCAqKTsKCgogCnR5
cGVkZWYgaW50ICgqX19nY29udl90cmFuc19mY3QpIChzdHJ1Y3QgX19nY29udl9zdGVwICosCgkJ
CQkgIHN0cnVjdCBfX2djb252X3N0ZXBfZGF0YSAqLCB2b2lkICosCgkJCQkgIF9fY29uc3QgdW5z
aWduZWQgY2hhciAqLAoJCQkJICBfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKiosCgkJCQkgIF9fY29u
c3QgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBjaGFyICoqLAoJCQkJICBzaXplX3QgKik7Cgog
CnR5cGVkZWYgaW50ICgqX19nY29udl90cmFuc19jb250ZXh0X2ZjdCkgKHZvaWQgKiwgX19jb25z
dCB1bnNpZ25lZCBjaGFyICosCgkJCQkJICBfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKiwKCQkJCQkg
IHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgY2hhciAqKTsKCiAKdHlwZWRlZiBpbnQgKCpfX2dj
b252X3RyYW5zX3F1ZXJ5X2ZjdCkgKF9fY29uc3QgY2hhciAqLCBfX2NvbnN0IGNoYXIgKioqLAoJ
CQkJCXNpemVfdCAqKTsKCiAKdHlwZWRlZiBpbnQgKCpfX2djb252X3RyYW5zX2luaXRfZmN0KSAo
dm9pZCAqKiwgY29uc3QgY2hhciAqKTsKdHlwZWRlZiB2b2lkICgqX19nY29udl90cmFuc19lbmRf
ZmN0KSAodm9pZCAqKTsKCnN0cnVjdCBfX2djb252X3RyYW5zX2RhdGEKewogICAKICBfX2djb252
X3RyYW5zX2ZjdCBfX3RyYW5zX2ZjdDsKICBfX2djb252X3RyYW5zX2NvbnRleHRfZmN0IF9fdHJh
bnNfY29udGV4dF9mY3Q7CiAgX19nY29udl90cmFuc19lbmRfZmN0IF9fdHJhbnNfZW5kX2ZjdDsK
ICB2b2lkICpfX2RhdGE7CiAgc3RydWN0IF9fZ2NvbnZfdHJhbnNfZGF0YSAqX19uZXh0Owp9OwoK
CiAKc3RydWN0IF9fZ2NvbnZfc3RlcAp7CiAgc3RydWN0IF9fZ2NvbnZfbG9hZGVkX29iamVjdCAq
X19zaGxpYl9oYW5kbGU7CiAgX19jb25zdCBjaGFyICpfX21vZG5hbWU7CgogIGludCBfX2NvdW50
ZXI7CgogIF9fY29uc3QgY2hhciAqX19mcm9tX25hbWU7CiAgX19jb25zdCBjaGFyICpfX3RvX25h
bWU7CgogIF9fZ2NvbnZfZmN0IF9fZmN0OwogIF9fZ2NvbnZfaW5pdF9mY3QgX19pbml0X2ZjdDsK
ICBfX2djb252X2VuZF9mY3QgX19lbmRfZmN0OwoKICAgCgogIGludCBfX21pbl9uZWVkZWRfZnJv
bTsKICBpbnQgX19tYXhfbmVlZGVkX2Zyb207CiAgaW50IF9fbWluX25lZWRlZF90bzsKICBpbnQg
X19tYXhfbmVlZGVkX3RvOwoKICAgCiAgaW50IF9fc3RhdGVmdWw7CgogIHZvaWQgKl9fZGF0YTsJ
CSAKfTsKCiAKCnN0cnVjdCBfX2djb252X3N0ZXBfZGF0YQp7CiAgdW5zaWduZWQgY2hhciAqX19v
dXRidWY7ICAgICAKICB1bnNpZ25lZCBjaGFyICpfX291dGJ1ZmVuZDsgIAoKCiAgIAogIGludCBf
X2ZsYWdzOwoKICAgCgogIGludCBfX2ludm9jYXRpb25fY291bnRlcjsKCiAgIAoKICBpbnQgX19p
bnRlcm5hbF91c2U7CgogIF9fbWJzdGF0ZV90ICpfX3N0YXRlcDsKICBfX21ic3RhdGVfdCBfX3N0
YXRlOwkgCgoKICAgCiAgc3RydWN0IF9fZ2NvbnZfdHJhbnNfZGF0YSAqX190cmFuczsKfTsKCgog
CnR5cGVkZWYgc3RydWN0IF9fZ2NvbnZfaW5mbwp7CiAgc2l6ZV90IF9fbnN0ZXBzOwogIHN0cnVj
dCBfX2djb252X3N0ZXAgKl9fc3RlcHM7CiAgX19leHRlbnNpb25fXyBzdHJ1Y3QgX19nY29udl9z
dGVwX2RhdGEgX19kYXRhWzBdOwp9ICpfX2djb252X3Q7CgoKIyA0NCAiL3Vzci9pbmNsdWRlL19H
X2NvbmZpZy5oIiAyIDMKCnR5cGVkZWYgdW5pb24KewogIHN0cnVjdCBfX2djb252X2luZm8gX19j
ZDsKICBzdHJ1Y3QKICB7CiAgICBzdHJ1Y3QgX19nY29udl9pbmZvIF9fY2Q7CiAgICBzdHJ1Y3Qg
X19nY29udl9zdGVwX2RhdGEgX19kYXRhOwogIH0gX19jb21iaW5lZDsKfSBfR19pY29udl90OwoK
dHlwZWRlZiBpbnQgX0dfaW50MTZfdCBfX2F0dHJpYnV0ZV9fICgoX19tb2RlX18gKF9fSElfXykp
KTsKdHlwZWRlZiBpbnQgX0dfaW50MzJfdCBfX2F0dHJpYnV0ZV9fICgoX19tb2RlX18gKF9fU0lf
XykpKTsKdHlwZWRlZiB1bnNpZ25lZCBpbnQgX0dfdWludDE2X3QgX19hdHRyaWJ1dGVfXyAoKF9f
bW9kZV9fIChfX0hJX18pKSk7CnR5cGVkZWYgdW5zaWduZWQgaW50IF9HX3VpbnQzMl90IF9fYXR0
cmlidXRlX18gKChfX21vZGVfXyAoX19TSV9fKSkpOwoKI2RlZmluZSBfR19IQVZFX0JPT0wgMQoK
CiAKI2RlZmluZSBfR19IQVZFX0FURVhJVCAxCiNkZWZpbmUgX0dfSEFWRV9TWVNfQ0RFRlMgMQoj
ZGVmaW5lIF9HX0hBVkVfU1lTX1dBSVQgMQojZGVmaW5lIF9HX05FRURfU1REQVJHX0ggMQojZGVm
aW5lIF9HX3ZhX2xpc3QgX19nbnVjX3ZhX2xpc3QKCiNkZWZpbmUgX0dfSEFWRV9QUklOVEZfRlAg
MQojZGVmaW5lIF9HX0hBVkVfTU1BUCAxCiNkZWZpbmUgX0dfSEFWRV9MT05HX0RPVUJMRV9JTyAx
CiNkZWZpbmUgX0dfSEFWRV9JT19GSUxFX09QRU4gMQojZGVmaW5lIF9HX0hBVkVfSU9fR0VUTElO
RV9JTkZPIDEKCiNkZWZpbmUgX0dfSU9fSU9fRklMRV9WRVJTSU9OIDB4MjAwMDEKCiNkZWZpbmUg
X0dfT1BFTjY0CV9fb3BlbjY0CiNkZWZpbmUgX0dfTFNFRUs2NAlfX2xzZWVrNjQKI2RlZmluZSBf
R19GU1RBVDY0KGZkLGJ1ZikgX19meHN0YXQ2NCAoX1NUQVRfVkVSLCBmZCwgYnVmKQoKIAojZGVm
aW5lIF9HX0hBVkVfU1RfQkxLU0laRSBkZWZpbmVkIChfU1RBVEJVRl9TVF9CTEtTSVpFKQoKI2Rl
ZmluZSBfR19CVUZTSVogODE5MgoKIAojZGVmaW5lIF9HX05BTUVTX0hBVkVfVU5ERVJTQ09SRSAw
CiNkZWZpbmUgX0dfVlRBQkxFX0xBQkVMX0hBU19MRU5HVEggMQojZGVmaW5lIF9HX1VTSU5HX1RI
VU5LUwkxCiNkZWZpbmUgX0dfVlRBQkxFX0xBQkVMX1BSRUZJWCAiX192dF8iCiNkZWZpbmUgX0df
VlRBQkxFX0xBQkVMX1BSRUZJWF9JRCBfX3Z0XwoKCgojZGVmaW5lIF9HX0FSR1MoQVJHTElTVCkg
QVJHTElTVAoKCgoKCiMgMzAgIi91c3IvaW5jbHVkZS9saWJpby5oIiAyIDMKCiAKI2RlZmluZSBf
SU9fcG9zX3QgX0dfZnBvc190IAojZGVmaW5lIF9JT19mcG9zX3QgX0dfZnBvc190CiNkZWZpbmUg
X0lPX2Zwb3M2NF90IF9HX2Zwb3M2NF90CiNkZWZpbmUgX0lPX3NpemVfdCBfR19zaXplX3QKI2Rl
ZmluZSBfSU9fc3NpemVfdCBfR19zc2l6ZV90CiNkZWZpbmUgX0lPX29mZl90IF9HX29mZl90CiNk
ZWZpbmUgX0lPX29mZjY0X3QgX0dfb2ZmNjRfdAojZGVmaW5lIF9JT19waWRfdCBfR19waWRfdAoj
ZGVmaW5lIF9JT191aWRfdCBfR191aWRfdAojZGVmaW5lIF9JT19pY29udl90IF9HX2ljb252X3QK
I2RlZmluZSBfSU9fSEFWRV9TWVNfV0FJVCBfR19IQVZFX1NZU19XQUlUCiNkZWZpbmUgX0lPX0hB
VkVfU1RfQkxLU0laRSBfR19IQVZFX1NUX0JMS1NJWkUKI2RlZmluZSBfSU9fQlVGU0laIF9HX0JV
RlNJWgojZGVmaW5lIF9JT192YV9saXN0IF9HX3ZhX2xpc3QKI2RlZmluZSBfSU9fd2ludF90IF9H
X3dpbnRfdAoKCiAKI2RlZmluZSBfX25lZWRfX192YV9saXN0CiMgMSAiL3Vzci9saWIvZ2NjLWxp
Yi9pMzg2LWxpbnV4LzIuOTUuMy9pbmNsdWRlL3N0ZGFyZy5oIiAxIDMKIAoKCgoKCgoKCgoKI3Vu
ZGVmIF9fbmVlZF9fX3ZhX2xpc3QKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK
CgoKCgoKCgoKCgoKCgoKCgogCgoKI2RlZmluZSBfX0dOVUNfVkFfTElTVAoKCgp0eXBlZGVmIHZv
aWQgKl9fZ251Y192YV9saXN0OwoKCgogCgojIDEyMiAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2LWxp
bnV4LzIuOTUuMy9pbmNsdWRlL3N0ZGFyZy5oIiAzCgoKCgoKCgoKCgoKCgoKCgoKCgoKIyAyMDkg
Ii91c3IvbGliL2djYy1saWIvaTM4Ni1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRhcmcuaCIgMwoK
CgoKIyA1MSAiL3Vzci9pbmNsdWRlL2xpYmlvLmgiIDIgMwoKCiN1bmRlZiBfSU9fdmFfbGlzdAoj
ZGVmaW5lIF9JT192YV9saXN0IF9fZ251Y192YV9saXN0CgoKCiMgNzAgIi91c3IvaW5jbHVkZS9s
aWJpby5oIiAzCgoKIAoKI2RlZmluZSBfUEFSQU1TKHByb3RvcykgX19QKHByb3RvcykKCgoKCgoK
CiNkZWZpbmUgX0lPX1VOSUZJRURfSlVNUFRBQkxFUyAxCgoKCgoKI2RlZmluZSBFT0YgKC0xKQoK
IyAxMDEgIi91c3IvaW5jbHVkZS9saWJpby5oIiAzCgoKI2RlZmluZSBfSU9TX0lOUFVUCTEKI2Rl
ZmluZSBfSU9TX09VVFBVVAkyCiNkZWZpbmUgX0lPU19BVEVORAk0CiNkZWZpbmUgX0lPU19BUFBF
TkQJOAojZGVmaW5lIF9JT1NfVFJVTkMJMTYKI2RlZmluZSBfSU9TX05PQ1JFQVRFCTMyCiNkZWZp
bmUgX0lPU19OT1JFUExBQ0UJNjQKI2RlZmluZSBfSU9TX0JJTgkxMjgKCiAKCgoKCgojZGVmaW5l
IF9JT19NQUdJQyAweEZCQUQwMDAwIAojZGVmaW5lIF9PTERfU1RESU9fTUFHSUMgMHhGQUJDMDAw
MCAKI2RlZmluZSBfSU9fTUFHSUNfTUFTSyAweEZGRkYwMDAwCiNkZWZpbmUgX0lPX1VTRVJfQlVG
IDEgCiNkZWZpbmUgX0lPX1VOQlVGRkVSRUQgMgojZGVmaW5lIF9JT19OT19SRUFEUyA0IAojZGVm
aW5lIF9JT19OT19XUklURVMgOCAKI2RlZmluZSBfSU9fRU9GX1NFRU4gMHgxMAojZGVmaW5lIF9J
T19FUlJfU0VFTiAweDIwCiNkZWZpbmUgX0lPX0RFTEVURV9ET05UX0NMT1NFIDB4NDAgCiNkZWZp
bmUgX0lPX0xJTktFRCAweDgwIAojZGVmaW5lIF9JT19JTl9CQUNLVVAgMHgxMDAKI2RlZmluZSBf
SU9fTElORV9CVUYgMHgyMDAKI2RlZmluZSBfSU9fVElFRF9QVVRfR0VUIDB4NDAwIAojZGVmaW5l
IF9JT19DVVJSRU5UTFlfUFVUVElORyAweDgwMAojZGVmaW5lIF9JT19JU19BUFBFTkRJTkcgMHgx
MDAwCiNkZWZpbmUgX0lPX0lTX0ZJTEVCVUYgMHgyMDAwCiNkZWZpbmUgX0lPX0JBRF9TRUVOIDB4
NDAwMAojZGVmaW5lIF9JT19VU0VSX0xPQ0sgMHg4MDAwCgogCiNkZWZpbmUgX0lPX1NLSVBXUyAw
MQojZGVmaW5lIF9JT19MRUZUIDAyCiNkZWZpbmUgX0lPX1JJR0hUIDA0CiNkZWZpbmUgX0lPX0lO
VEVSTkFMIDAxMAojZGVmaW5lIF9JT19ERUMgMDIwCiNkZWZpbmUgX0lPX09DVCAwNDAKI2RlZmlu
ZSBfSU9fSEVYIDAxMDAKI2RlZmluZSBfSU9fU0hPV0JBU0UgMDIwMAojZGVmaW5lIF9JT19TSE9X
UE9JTlQgMDQwMAojZGVmaW5lIF9JT19VUFBFUkNBU0UgMDEwMDAKI2RlZmluZSBfSU9fU0hPV1BP
UyAwMjAwMAojZGVmaW5lIF9JT19TQ0lFTlRJRklDIDA0MDAwCiNkZWZpbmUgX0lPX0ZJWEVEIDAx
MDAwMAojZGVmaW5lIF9JT19VTklUQlVGIDAyMDAwMAojZGVmaW5lIF9JT19TVERJTyAwNDAwMDAK
I2RlZmluZSBfSU9fRE9OVF9DTE9TRSAwMTAwMDAwCiNkZWZpbmUgX0lPX0JPT0xBTFBIQSAwMjAw
MDAwCgoKc3RydWN0IF9JT19qdW1wX3Q7ICBzdHJ1Y3QgX0lPX0ZJTEU7CgogCgoKCgoKCgp0eXBl
ZGVmIHZvaWQgX0lPX2xvY2tfdDsKCgoKIAoKc3RydWN0IF9JT19tYXJrZXIgewogIHN0cnVjdCBf
SU9fbWFya2VyICpfbmV4dDsKICBzdHJ1Y3QgX0lPX0ZJTEUgKl9zYnVmOwogICAKCiAgIAogIGlu
dCBfcG9zOwojIDE5MCAiL3Vzci9pbmNsdWRlL2xpYmlvLmgiIDMKCn07CgogCmVudW0gX19jb2Rl
Y3Z0X3Jlc3VsdAp7CiAgX19jb2RlY3Z0X29rLAogIF9fY29kZWN2dF9wYXJ0aWFsLAogIF9fY29k
ZWN2dF9lcnJvciwKICBfX2NvZGVjdnRfbm9jb252Cn07CgojIDI2MSAiL3Vzci9pbmNsdWRlL2xp
YmlvLmgiIDMKCgpzdHJ1Y3QgX0lPX0ZJTEUgewogIGludCBfZmxhZ3M7CQkgCiNkZWZpbmUgX0lP
X2ZpbGVfZmxhZ3MgX2ZsYWdzCgogICAKICAgCiAgY2hhciogX0lPX3JlYWRfcHRyOwkgCiAgY2hh
ciogX0lPX3JlYWRfZW5kOwkgCiAgY2hhciogX0lPX3JlYWRfYmFzZTsJIAogIGNoYXIqIF9JT193
cml0ZV9iYXNlOwkgCiAgY2hhciogX0lPX3dyaXRlX3B0cjsJIAogIGNoYXIqIF9JT193cml0ZV9l
bmQ7CSAKICBjaGFyKiBfSU9fYnVmX2Jhc2U7CSAKICBjaGFyKiBfSU9fYnVmX2VuZDsJIAogICAK
ICBjaGFyICpfSU9fc2F2ZV9iYXNlOyAgCiAgY2hhciAqX0lPX2JhY2t1cF9iYXNlOyAgIAogIGNo
YXIgKl9JT19zYXZlX2VuZDsgIAoKICBzdHJ1Y3QgX0lPX21hcmtlciAqX21hcmtlcnM7CgogIHN0
cnVjdCBfSU9fRklMRSAqX2NoYWluOwoKICBpbnQgX2ZpbGVubzsKICBpbnQgX2Jsa3NpemU7CiAg
X19vZmZfdCAgIF9vbGRfb2Zmc2V0OyAgCgojZGVmaW5lIF9fSEFWRV9DT0xVTU4gCiAgIAogIHVu
c2lnbmVkIHNob3J0IF9jdXJfY29sdW1uOwogIHNpZ25lZCBjaGFyIF92dGFibGVfb2Zmc2V0Owog
IGNoYXIgX3Nob3J0YnVmWzFdOwoKICAgCgogIF9JT19sb2NrX3QgKl9sb2NrOwoKCgoKCgoKCiAg
X19vZmY2NF90ICAgX29mZnNldDsKCgoKCgogIHZvaWQgKl9fcGFkMTsKICB2b2lkICpfX3BhZDI7
CgogIGludCBfbW9kZTsKICAgCiAgY2hhciBfdW51c2VkMlsxNSAqIHNpemVvZiAoaW50KSAtIDIg
KiBzaXplb2YgKHZvaWQgKildOwoKfTsKCgoKCgpzdHJ1Y3QgX0lPX0ZJTEVfcGx1czsKCmV4dGVy
biBzdHJ1Y3QgX0lPX0ZJTEVfcGx1cyBfSU9fMl8xX3N0ZGluXzsKZXh0ZXJuIHN0cnVjdCBfSU9f
RklMRV9wbHVzIF9JT18yXzFfc3Rkb3V0XzsKZXh0ZXJuIHN0cnVjdCBfSU9fRklMRV9wbHVzIF9J
T18yXzFfc3RkZXJyXzsKCiNkZWZpbmUgX0lPX3N0ZGluICgoX0lPX0ZJTEUqKSgmX0lPXzJfMV9z
dGRpbl8pKQojZGVmaW5lIF9JT19zdGRvdXQgKChfSU9fRklMRSopKCZfSU9fMl8xX3N0ZG91dF8p
KQojZGVmaW5lIF9JT19zdGRlcnIgKChfSU9fRklMRSopKCZfSU9fMl8xX3N0ZGVycl8pKQoKCgoK
CgoKIAoKIAoKdHlwZWRlZiBfX3NzaXplX3QgX19pb19yZWFkX2ZuICh2b2lkICpfX2Nvb2tpZSwg
Y2hhciAqX19idWYsIHNpemVfdCBfX25ieXRlcyk7CgogCgoKCgoKdHlwZWRlZiBfX3NzaXplX3Qg
X19pb193cml0ZV9mbiAodm9pZCAqX19jb29raWUsIF9fY29uc3QgY2hhciAqX19idWYsCgkJCQkg
c2l6ZV90IF9fbik7CgogCgoKCgoKdHlwZWRlZiBpbnQgX19pb19zZWVrX2ZuICh2b2lkICpfX2Nv
b2tpZSwgX19vZmY2NF90ICAgKl9fcG9zLCBpbnQgX193KTsKCiAKdHlwZWRlZiBpbnQgX19pb19j
bG9zZV9mbiAodm9pZCAqX19jb29raWUpOwoKCiMgMzkxICIvdXNyL2luY2x1ZGUvbGliaW8uaCIg
MwoKCgoKZXh0ZXJuICJDIiB7CgoKZXh0ZXJuIGludCBfX3VuZGVyZmxvdyAoX0lPX0ZJTEUgKikg
dGhyb3cgKCkgOwpleHRlcm4gaW50IF9fdWZsb3cgKF9JT19GSUxFICopIHRocm93ICgpIDsKZXh0
ZXJuIGludCBfX292ZXJmbG93IChfSU9fRklMRSAqLCBpbnQpIHRocm93ICgpIDsKZXh0ZXJuIHdp
bnRfdCAgIF9fd3VuZGVyZmxvdyAoX0lPX0ZJTEUgKikgdGhyb3cgKCkgOwpleHRlcm4gd2ludF90
ICAgX193dWZsb3cgKF9JT19GSUxFICopIHRocm93ICgpIDsKZXh0ZXJuIHdpbnRfdCAgIF9fd292
ZXJmbG93IChfSU9fRklMRSAqLCB3aW50X3QgICkgdGhyb3cgKCkgOwoKI2RlZmluZSBfSU9fZ2V0
Y191bmxvY2tlZChfZnApICgoX2ZwKS0+X0lPX3JlYWRfcHRyID49IChfZnApLT5fSU9fcmVhZF9l
bmQgPyBfX3VmbG93IChfZnApIDogKih1bnNpZ25lZCBjaGFyICopIChfZnApLT5fSU9fcmVhZF9w
dHIrKykKCgojZGVmaW5lIF9JT19wZWVrY191bmxvY2tlZChfZnApICgoX2ZwKS0+X0lPX3JlYWRf
cHRyID49IChfZnApLT5fSU9fcmVhZF9lbmQgJiYgX191bmRlcmZsb3cgKF9mcCkgPT0gRU9GID8g
RU9GIDogKih1bnNpZ25lZCBjaGFyICopIChfZnApLT5fSU9fcmVhZF9wdHIpCgoKCiNkZWZpbmUg
X0lPX3B1dGNfdW5sb2NrZWQoX2NoLCBfZnApICgoKF9mcCktPl9JT193cml0ZV9wdHIgPj0gKF9m
cCktPl9JT193cml0ZV9lbmQpID8gX19vdmVyZmxvdyAoX2ZwLCAodW5zaWduZWQgY2hhcikgKF9j
aCkpIDogKHVuc2lnbmVkIGNoYXIpICgqKF9mcCktPl9JT193cml0ZV9wdHIrKyA9IChfY2gpKSkK
CgoKCiNkZWZpbmUgX0lPX2dldHdjX3VubG9ja2VkKF9mcCkgKChfZnApLT5fd2lkZV9kYXRhLT5f
SU9fcmVhZF9wdHIgPj0gKF9mcCktPl93aWRlX2RhdGEtPl9JT19yZWFkX2VuZCA/IF9fd3VmbG93
IChfZnApIDogKF9JT193aW50X3QpICooX2ZwKS0+X3dpZGVfZGF0YS0+X0lPX3JlYWRfcHRyKysp
CgoKI2RlZmluZSBfSU9fcHV0d2NfdW5sb2NrZWQoX3djaCwgX2ZwKSAoKF9mcCktPl93aWRlX2Rh
dGEtPl9JT193cml0ZV9wdHIgPj0gKF9mcCktPl93aWRlX2RhdGEtPl9JT193cml0ZV9lbmQgPyBf
X3dvdmVyZmxvdyAoX2ZwLCBfd2NoKSA6IChfSU9fd2ludF90KSAoKihfZnApLT5fd2lkZV9kYXRh
LT5fSU9fd3JpdGVfcHRyKysgPSAoX3djaCkpKQoKCgoKI2RlZmluZSBfSU9fZmVvZl91bmxvY2tl
ZChfX2ZwKSAoKChfX2ZwKS0+X2ZsYWdzICYgX0lPX0VPRl9TRUVOKSAhPSAwKQojZGVmaW5lIF9J
T19mZXJyb3JfdW5sb2NrZWQoX19mcCkgKCgoX19mcCktPl9mbGFncyAmIF9JT19FUlJfU0VFTikg
IT0gMCkKCmV4dGVybiBpbnQgX0lPX2dldGMgKF9JT19GSUxFICpfX2ZwKSB0aHJvdyAoKSA7CmV4
dGVybiBpbnQgX0lPX3B1dGMgKGludCBfX2MsIF9JT19GSUxFICpfX2ZwKSB0aHJvdyAoKSA7CmV4
dGVybiBpbnQgX0lPX2Zlb2YgKF9JT19GSUxFICpfX2ZwKSB0aHJvdyAoKSA7CmV4dGVybiBpbnQg
X0lPX2ZlcnJvciAoX0lPX0ZJTEUgKl9fZnApIHRocm93ICgpIDsKCmV4dGVybiBpbnQgX0lPX3Bl
ZWtjX2xvY2tlZCAoX0lPX0ZJTEUgKl9fZnApIHRocm93ICgpIDsKCiAKI2RlZmluZSBfSU9fUEVO
RElOR19PVVRQVVRfQ09VTlQoX2ZwKQkoKF9mcCktPl9JT193cml0ZV9wdHIgLSAoX2ZwKS0+X0lP
X3dyaXRlX2Jhc2UpCgoKZXh0ZXJuIHZvaWQgX0lPX2Zsb2NrZmlsZSAoX0lPX0ZJTEUgKikgdGhy
b3cgKCkgOwpleHRlcm4gdm9pZCBfSU9fZnVubG9ja2ZpbGUgKF9JT19GSUxFICopIHRocm93ICgp
IDsKZXh0ZXJuIGludCBfSU9fZnRyeWxvY2tmaWxlIChfSU9fRklMRSAqKSB0aHJvdyAoKSA7CgoK
CgoKCgoKI2RlZmluZSBfSU9fcGVla2MoX2ZwKSBfSU9fcGVla2NfdW5sb2NrZWQgKF9mcCkKI2Rl
ZmluZSBfSU9fZmxvY2tmaWxlKF9mcCkgCiNkZWZpbmUgX0lPX2Z1bmxvY2tmaWxlKF9mcCkgCiNk
ZWZpbmUgX0lPX2Z0cnlsb2NrZmlsZShfZnApIAojZGVmaW5lIF9JT19jbGVhbnVwX3JlZ2lvbl9z
dGFydChfZmN0LCBfZnApIAojZGVmaW5lIF9JT19jbGVhbnVwX3JlZ2lvbl9lbmQoX0RvaXQpIAoK
CmV4dGVybiBpbnQgX0lPX3Zmc2NhbmYgKF9JT19GSUxFICogX19yZXN0cmljdCwgY29uc3QgY2hh
ciAqIF9fcmVzdHJpY3QsCgkJCV9fZ251Y192YV9saXN0ICwgaW50ICpfX3Jlc3RyaWN0KSB0aHJv
dyAoKSA7CmV4dGVybiBpbnQgX0lPX3ZmcHJpbnRmIChfSU9fRklMRSAqX19yZXN0cmljdCwgY29u
c3QgY2hhciAqX19yZXN0cmljdCwKCQkJIF9fZ251Y192YV9saXN0ICkgdGhyb3cgKCkgOwpleHRl
cm4gX19zc2l6ZV90ICAgX0lPX3BhZG4gKF9JT19GSUxFICosIGludCwgX19zc2l6ZV90ICApIHRo
cm93ICgpIDsKZXh0ZXJuIHNpemVfdCAgIF9JT19zZ2V0biAoX0lPX0ZJTEUgKiwgdm9pZCAqLCBz
aXplX3QgICkgdGhyb3cgKCkgOwoKZXh0ZXJuIF9fb2ZmNjRfdCAgIF9JT19zZWVrb2ZmIChfSU9f
RklMRSAqLCBfX29mZjY0X3QgICwgaW50LCBpbnQpIHRocm93ICgpIDsKZXh0ZXJuIF9fb2ZmNjRf
dCAgIF9JT19zZWVrcG9zIChfSU9fRklMRSAqLCBfX29mZjY0X3QgICwgaW50KSB0aHJvdyAoKSA7
CgpleHRlcm4gdm9pZCBfSU9fZnJlZV9iYWNrdXBfYXJlYSAoX0lPX0ZJTEUgKikgdGhyb3cgKCkg
OwoKIyA1MTEgIi91c3IvaW5jbHVkZS9saWJpby5oIiAzCgoKCn0KCgoKIyAzNiAiL3Vzci9saWIv
Z2NjLWxpYi9pMzg2LWxpbnV4LzIuOTUuMy8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL3N0cmVh
bWJ1Zi5oIiAyIDMKCn0KIAoKIyAxICIvdXNyL2xpYi9nY2MtbGliL2kzODYtbGludXgvMi45NS4z
L2luY2x1ZGUvc3RkYXJnLmgiIDEgMwogCgoKCgoKCgojZGVmaW5lIF9TVERBUkdfSAojZGVmaW5l
IF9BTlNJX1NUREFSR19IXwoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK
CgoKCgoKCgoKCgoKCgoKIAoKCgoKCgoKCgoKIAoKCgogCgoKCgoKCgoKCiNkZWZpbmUgX192YV9y
b3VuZGVkX3NpemUoVFlQRSkgKCgoc2l6ZW9mIChUWVBFKSArIHNpemVvZiAoaW50KSAtIDEpIC8g
c2l6ZW9mIChpbnQpKSAqIHNpemVvZiAoaW50KSkKCgoKI2RlZmluZSB2YV9zdGFydChBUCwgTEFT
VEFSRykgKEFQID0gKChfX2dudWNfdmFfbGlzdCkgX19idWlsdGluX25leHRfYXJnIChMQVNUQVJH
KSkpCgoKCnZvaWQgdmFfZW5kIChfX2dudWNfdmFfbGlzdCk7CQkgCiNkZWZpbmUgdmFfZW5kKEFQ
KQkoKHZvaWQpMCkKCiAKCgoKIAojZGVmaW5lIHZhX2FyZyhBUCwgVFlQRSkJKEFQID0gKF9fZ251
Y192YV9saXN0KSAoKGNoYXIgKikgKEFQKSArIF9fdmFfcm91bmRlZF9zaXplIChUWVBFKSksCSoo
KFRZUEUgKikgKHZvaWQgKikgKChjaGFyICopIChBUCkgLSBfX3ZhX3JvdW5kZWRfc2l6ZSAoVFlQ
RSkpKSkKCgoKCgoKCgoKCgogCiNkZWZpbmUgX192YV9jb3B5KGRlc3QsIHNyYykgKGRlc3QpID0g
KHNyYykKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiAKIAoKCgoKCgoKCgoKCgoKIyAxNzUgIi91c3Iv
bGliL2djYy1saWIvaTM4Ni1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRhcmcuaCIgMwoKCiAKCgoK
CiAKCiAKCiAKCnR5cGVkZWYgX19nbnVjX3ZhX2xpc3QgdmFfbGlzdDsKCgoKCiNkZWZpbmUgX1ZB
X0xJU1RfCgoKI2RlZmluZSBfVkFfTElTVAoKCiNkZWZpbmUgX1ZBX0xJU1RfREVGSU5FRAoKCiNk
ZWZpbmUgX1ZBX0xJU1RfVF9ICgoKCgoKCgoKCgojIDQwICIvdXNyL2xpYi9nY2MtbGliL2kzODYt
bGludXgvMi45NS4zLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3RyZWFtYnVmLmgiIDIgMwoK
CgoKCgoKCgoKCgoKCgoKCgoKI2RlZmluZSBfSU9fd2NoYXJfdCBfR193Y2hhcl90CgoKCgoKZXh0
ZXJuICJDKysiIHsKY2xhc3MgaXN0cmVhbTsgIApjbGFzcyBvc3RyZWFtOyBjbGFzcyBzdHJlYW1i
dWY7CgogCgoKCgp0eXBlZGVmIF9fb2ZmNjRfdCAgIHN0cmVhbW9mZjsKdHlwZWRlZiBfX29mZjY0
X3QgICBzdHJlYW1wb3M7CgoKCgp0eXBlZGVmIF9fc3NpemVfdCAgIHN0cmVhbXNpemU7Cgp0eXBl
ZGVmIHVuc2lnbmVkIGxvbmcgX19mbXRmbGFnczsKdHlwZWRlZiB1bnNpZ25lZCBjaGFyIF9faW9z
dGF0ZTsKCnN0cnVjdCBfaW9zX2ZpZWxkcwp7ICAKICAgIHN0cmVhbWJ1ZiAqX3N0cmJ1ZjsKICAg
IG9zdHJlYW0qIF90aWU7CiAgICBpbnQgX3dpZHRoOwogICAgX19mbXRmbGFncyBfZmxhZ3M7CiAg
ICB3Y2hhcl90ICAgX2ZpbGw7CiAgICBfX2lvc3RhdGUgX3N0YXRlOwogICAgX19pb3N0YXRlIF9l
eGNlcHRpb25zOwogICAgaW50IF9wcmVjaXNpb247CgogICAgdm9pZCAqX2FycmF5czsgIAp9OwoK
I2RlZmluZSBfSU9TX0dPT0QJMAojZGVmaW5lIF9JT1NfRU9GCTEKI2RlZmluZSBfSU9TX0ZBSUwJ
MgojZGVmaW5lIF9JT1NfQkFECTQKCiNkZWZpbmUgX0lPX0lOUFVUCTEKI2RlZmluZSBfSU9fT1VU
UFVUCTIKI2RlZmluZSBfSU9fQVRFTkQJNAojZGVmaW5lIF9JT19BUFBFTkQJOAojZGVmaW5lIF9J
T19UUlVOQwkxNgojZGVmaW5lIF9JT19OT0NSRUFURQkzMgojZGVmaW5lIF9JT19OT1JFUExBQ0UJ
NjQKI2RlZmluZSBfSU9fQklOCQkxMjgKCiMgMTI0ICIvdXNyL2xpYi9nY2MtbGliL2kzODYtbGlu
dXgvMi45NS4zLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3RyZWFtYnVmLmgiIDMKCgpjbGFz
cyBpb3MgOiBwdWJsaWMgX2lvc19maWVsZHMgewogIGlvcyYgb3BlcmF0b3I9KGlvcyYpOyAgIAog
IGlvcyAoY29uc3QgaW9zJik7ICAKICBwdWJsaWM6CiAgICB0eXBlZGVmIF9fZm10ZmxhZ3MgZm10
ZmxhZ3M7CiAgICB0eXBlZGVmIGludCBpb3N0YXRlOwogICAgdHlwZWRlZiBpbnQgb3Blbm1vZGU7
CiAgICB0eXBlZGVmIF9fc3NpemVfdCAgIHN0cmVhbXNpemU7CiAgICBlbnVtIGlvX3N0YXRlIHsK
CWdvb2RiaXQgPSAwICwKCWVvZmJpdCA9IDEgLAoJZmFpbGJpdCA9IDIgLAoJYmFkYml0ID0gNCAg
fTsKICAgIGVudW0gb3Blbl9tb2RlIHsKCWluID0gMSAsCglvdXQgPSAyICwKCWF0ZSA9IDQgLAoJ
YXBwID0gOCAsCgl0cnVuYyA9IDE2ICwKCW5vY3JlYXRlID0gMzIgLAoJbm9yZXBsYWNlID0gNjQg
LAoJYmluID0gMTI4ICwgIAoJYmluYXJ5ID0gMTI4ICB9OwogICAgZW51bSBzZWVrX2RpciB7IGJl
ZywgY3VyLCBlbmR9OwogICAgdHlwZWRlZiBlbnVtIHNlZWtfZGlyIHNlZWtkaXI7CiAgICAgCiAg
ICBlbnVtIHsgc2tpcHdzPSAwMSAsCgkgICBsZWZ0PSAwMiAsIHJpZ2h0PSAwNCAsIGludGVybmFs
PSAwMTAgLAoJICAgZGVjPSAwMjAgLCBvY3Q9IDA0MCAsIGhleD0gMDEwMCAsCgkgICBzaG93YmFz
ZT0gMDIwMCAsIHNob3dwb2ludD0gMDQwMCAsCgkgICB1cHBlcmNhc2U9IDAxMDAwICwgc2hvd3Bv
cz0gMDIwMDAgLAoJICAgc2NpZW50aWZpYz0gMDQwMDAgLCBmaXhlZD0gMDEwMDAwICwKCSAgIHVu
aXRidWY9IDAyMDAwMCAsIHN0ZGlvPSAwNDAwMDAgCgoKCgkgICB9OwogICAgZW51bSB7ICAKCWJh
c2VmaWVsZD1kZWMrb2N0K2hleCwKCWZsb2F0ZmllbGQgPSBzY2llbnRpZmljK2ZpeGVkLAoJYWRq
dXN0ZmllbGQgPSBsZWZ0K3JpZ2h0K2ludGVybmFsCiAgICB9OwoKIyAxNzcgIi91c3IvbGliL2dj
Yy1saWIvaTM4Ni1saW51eC8yLjk1LjMvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9zdHJlYW1i
dWYuaCIgMwoKCiAgICBvc3RyZWFtKiB0aWUoKSBjb25zdCB7IHJldHVybiBfdGllOyB9CiAgICBv
c3RyZWFtKiB0aWUob3N0cmVhbSogdmFsKSB7IG9zdHJlYW0qIHNhdmU9X3RpZTsgX3RpZT12YWw7
IHJldHVybiBzYXZlOyB9CgogICAgIAogICAgd2NoYXJfdCAgIGZpbGwoKSBjb25zdCB7IHJldHVy
biBfZmlsbDsgfQogICAgd2NoYXJfdCAgIGZpbGwod2NoYXJfdCAgIG5ld2YpCgl7d2NoYXJfdCAg
IG9sZGYgPSBfZmlsbDsgX2ZpbGwgPSBuZXdmOyByZXR1cm4gb2xkZjt9CiAgICBmbXRmbGFncyBm
bGFncygpIGNvbnN0IHsgcmV0dXJuIF9mbGFnczsgfQogICAgZm10ZmxhZ3MgZmxhZ3MoZm10Zmxh
Z3MgbmV3X3ZhbCkgewoJZm10ZmxhZ3Mgb2xkX3ZhbCA9IF9mbGFnczsgX2ZsYWdzID0gbmV3X3Zh
bDsgcmV0dXJuIG9sZF92YWw7IH0KICAgIGludCBwcmVjaXNpb24oKSBjb25zdCB7IHJldHVybiBf
cHJlY2lzaW9uOyB9CiAgICBpbnQgcHJlY2lzaW9uKGludCBuZXdwKSB7Cgl1bnNpZ25lZCBzaG9y
dCBvbGRwID0gX3ByZWNpc2lvbjsgX3ByZWNpc2lvbiA9ICh1bnNpZ25lZCBzaG9ydCluZXdwOwoJ
cmV0dXJuIG9sZHA7IH0KICAgIGZtdGZsYWdzIHNldGYoZm10ZmxhZ3MgdmFsKSB7CglmbXRmbGFn
cyBvbGRiaXRzID0gX2ZsYWdzOwoJX2ZsYWdzIHw9IHZhbDsgcmV0dXJuIG9sZGJpdHM7IH0KICAg
IGZtdGZsYWdzIHNldGYoZm10ZmxhZ3MgdmFsLCBmbXRmbGFncyBtYXNrKSB7CglmbXRmbGFncyBv
bGRiaXRzID0gX2ZsYWdzOwoJX2ZsYWdzID0gKF9mbGFncyAmIH5tYXNrKSB8ICh2YWwgJiBtYXNr
KTsgcmV0dXJuIG9sZGJpdHM7IH0KICAgIGZtdGZsYWdzIHVuc2V0ZihmbXRmbGFncyBtYXNrKSB7
CglmbXRmbGFncyBvbGRiaXRzID0gX2ZsYWdzOwoJX2ZsYWdzICY9IH5tYXNrOyByZXR1cm4gb2xk
Yml0czsgfQogICAgaW50IHdpZHRoKCkgY29uc3QgeyByZXR1cm4gX3dpZHRoOyB9CiAgICBpbnQg
d2lkdGgoaW50IHZhbCkgeyBpbnQgc2F2ZSA9IF93aWR0aDsgX3dpZHRoID0gdmFsOyByZXR1cm4g
c2F2ZTsgfQoKCgoKICAgIHZvaWQgX3Rocm93X2ZhaWx1cmUoKSBjb25zdCB7IH0KCiAgICB2b2lk
IGNsZWFyKGlvc3RhdGUgc3RhdGUgPSAwKSB7Cglfc3RhdGUgPSBfc3RyYnVmID8gc3RhdGUgOiBz
dGF0ZXxiYWRiaXQ7CglpZiAoX3N0YXRlICYgX2V4Y2VwdGlvbnMpIF90aHJvd19mYWlsdXJlKCk7
IH0KICAgIHZvaWQgc2V0KGlvc3RhdGUgZmxhZykgeyBfc3RhdGUgfD0gZmxhZzsKCWlmIChfc3Rh
dGUgJiBfZXhjZXB0aW9ucykgX3Rocm93X2ZhaWx1cmUoKTsgfQogICAgdm9pZCBzZXRzdGF0ZShp
b3N0YXRlIGZsYWcpIHsgX3N0YXRlIHw9IGZsYWc7ICAKCWlmIChfc3RhdGUgJiBfZXhjZXB0aW9u
cykgX3Rocm93X2ZhaWx1cmUoKTsgfQogICAgaW50IGdvb2QoKSBjb25zdCB7IHJldHVybiBfc3Rh
dGUgPT0gMDsgfQogICAgaW50IGVvZigpIGNvbnN0IHsgcmV0dXJuIF9zdGF0ZSAmIGlvczo6ZW9m
Yml0OyB9CiAgICBpbnQgZmFpbCgpIGNvbnN0IHsgcmV0dXJuIF9zdGF0ZSAmIChpb3M6OmJhZGJp
dHxpb3M6OmZhaWxiaXQpOyB9CiAgICBpbnQgYmFkKCkgY29uc3QgeyByZXR1cm4gX3N0YXRlICYg
aW9zOjpiYWRiaXQ7IH0KICAgIGlvc3RhdGUgcmRzdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIF9zdGF0
ZTsgfQogICAgb3BlcmF0b3Igdm9pZCooKSBjb25zdCB7IHJldHVybiBmYWlsKCkgPyAodm9pZCop
MCA6ICh2b2lkKikoLTEpOyB9CiAgICBpbnQgb3BlcmF0b3IhKCkgY29uc3QgeyByZXR1cm4gZmFp
bCgpOyB9CiAgICBpb3N0YXRlIGV4Y2VwdGlvbnMoKSBjb25zdCB7IHJldHVybiBfZXhjZXB0aW9u
czsgfQogICAgdm9pZCBleGNlcHRpb25zKGlvc3RhdGUgZW5hYmxlKSB7CglfZXhjZXB0aW9ucyA9
IGVuYWJsZTsKCWlmIChfc3RhdGUgJiBfZXhjZXB0aW9ucykgX3Rocm93X2ZhaWx1cmUoKTsgfQoK
ICAgIHN0cmVhbWJ1ZiogcmRidWYoKSBjb25zdCB7IHJldHVybiBfc3RyYnVmOyB9CiAgICBzdHJl
YW1idWYqIHJkYnVmKHN0cmVhbWJ1ZiAqX3MpIHsKICAgICAgc3RyZWFtYnVmICpfb2xkID0gX3N0
cmJ1ZjsgX3N0cmJ1ZiA9IF9zOyBjbGVhciAoKTsgcmV0dXJuIF9vbGQ7IH0KCiAgICBzdGF0aWMg
aW50IHN5bmNfd2l0aF9zdGRpbyhpbnQgb24pOwogICAgc3RhdGljIHZvaWQgc3luY193aXRoX3N0
ZGlvKCkgeyBzeW5jX3dpdGhfc3RkaW8oMSk7IH0KICAgIHN0YXRpYyBmbXRmbGFncyBiaXRhbGxv
YygpOwogICAgc3RhdGljIGludCB4YWxsb2MoKTsKICAgIHZvaWQqJiBwd29yZChpbnQpOwogICAg
dm9pZCogcHdvcmQoaW50KSBjb25zdDsKICAgIGxvbmcmIGl3b3JkKGludCk7CiAgICBsb25nIGl3
b3JkKGludCkgY29uc3Q7CgoKCgoKCgoKCiAgICAgCiAgICBjbGFzcyBJbml0IHsKICAgIHB1Ymxp
YzoKICAgICAgSW5pdCAoKSB7IH0KICAgIH07CgogIHByb3RlY3RlZDoKICAgIGlubGluZSBpb3Mo
c3RyZWFtYnVmKiBzYiA9IDAsIG9zdHJlYW0qIHRpZV90byA9IDApOwogICAgaW5saW5lIHZpcnR1
YWwgfmlvcygpOwogICAgaW5saW5lIHZvaWQgaW5pdChzdHJlYW1idWYqIHNiLCBvc3RyZWFtKiB0
aWUgPSAwKTsKfTsKCgoKCnR5cGVkZWYgaW9zOjpzZWVrX2RpciBfc2Vla19kaXI7CgoKIAogCiAK
IAogCgogCiAKY2xhc3Mgc3RyZWFtbWFya2VyIDogcHJpdmF0ZSBfSU9fbWFya2VyIHsKICAgIGZy
aWVuZCBjbGFzcyBzdHJlYW1idWY7CiAgICB2b2lkIHNldF9vZmZzZXQoaW50IG9mZnNldCkgeyBf
cG9zID0gb2Zmc2V0OyB9CiAgcHVibGljOgogICAgc3RyZWFtbWFya2VyKHN0cmVhbWJ1ZiAqc2Ip
OwogICAgfnN0cmVhbW1hcmtlcigpOwogICAgaW50IHNhdmluZygpIHsgcmV0dXJuICAxOyB9CiAg
ICBpbnQgZGVsdGEoc3RyZWFtbWFya2VyJik7CiAgICBpbnQgZGVsdGEoKTsKfTsKCnN0cnVjdCBz
dHJlYW1idWYgOiBwdWJsaWMgX0lPX0ZJTEUgeyAgCiAgICBmcmllbmQgY2xhc3MgaW9zOwogICAg
ZnJpZW5kIGNsYXNzIGlzdHJlYW07CiAgICBmcmllbmQgY2xhc3Mgb3N0cmVhbTsKICAgIGZyaWVu
ZCBjbGFzcyBzdHJlYW1tYXJrZXI7CiAgICBjb25zdCB2b2lkIComX3Z0YWJsZSgpIHsgcmV0dXJu
ICooY29uc3Qgdm9pZCoqKSgoX0lPX0ZJTEUqKXRoaXMgKyAxKTsgfQogIHByb3RlY3RlZDoKICAg
IHN0YXRpYyBzdHJlYW1idWYqIF9saXN0X2FsbDsgIAogICAgX0lPX0ZJTEUqJiB4Y2hhaW4oKSB7
IHJldHVybiBfY2hhaW47IH0KICAgIHZvaWQgX3VuX2xpbmsoKTsKICAgIHZvaWQgX2xpbmtfaW4o
KTsKICAgIGNoYXIqIGdwdHIoKSBjb25zdAogICAgICB7IHJldHVybiBfZmxhZ3MgICYgMHgxMDAg
ID8gX0lPX3NhdmVfYmFzZSA6IF9JT19yZWFkX3B0cjsgfQogICAgY2hhciogcHB0cigpIGNvbnN0
IHsgcmV0dXJuIF9JT193cml0ZV9wdHI7IH0KICAgIGNoYXIqIGVncHRyKCkgY29uc3QKICAgICAg
eyByZXR1cm4gX2ZsYWdzICAmIDB4MTAwICA/IF9JT19zYXZlX2VuZCA6IF9JT19yZWFkX2VuZDsg
fQogICAgY2hhciogZXBwdHIoKSBjb25zdCB7IHJldHVybiBfSU9fd3JpdGVfZW5kOyB9CiAgICBj
aGFyKiBwYmFzZSgpIGNvbnN0IHsgcmV0dXJuIF9JT193cml0ZV9iYXNlOyB9CiAgICBjaGFyKiBl
YmFjaygpIGNvbnN0CiAgICAgIHsgcmV0dXJuIF9mbGFncyAgJiAweDEwMCAgPyBfSU9fc2F2ZV9i
YXNlIDogX0lPX3JlYWRfYmFzZTt9CiAgICBjaGFyKiBiYXNlKCkgY29uc3QgeyByZXR1cm4gX0lP
X2J1Zl9iYXNlOyB9CiAgICBjaGFyKiBlYnVmKCkgY29uc3QgeyByZXR1cm4gX0lPX2J1Zl9lbmQ7
IH0KICAgIGludCBibGVuKCkgY29uc3QgeyByZXR1cm4gX0lPX2J1Zl9lbmQgLSBfSU9fYnVmX2Jh
c2U7IH0KICAgIHZvaWQgeHB1dF9jaGFyKGNoYXIgYykgeyAqX0lPX3dyaXRlX3B0cisrID0gYzsg
fQogICAgaW50IHhmbGFncygpIHsgcmV0dXJuIF9mbGFncyA7IH0KICAgIGludCB4ZmxhZ3MoaW50
IGYpIHtpbnQgZmwgPSBfZmxhZ3MgOyBfZmxhZ3MgID0gZjsgcmV0dXJuIGZsO30KICAgIHZvaWQg
eHNldGZsYWdzKGludCBmKSB7IF9mbGFncyAgfD0gZjsgfQogICAgdm9pZCB4c2V0ZmxhZ3MoaW50
IGYsIGludCBtYXNrKQogICAgICB7IF9mbGFncyAgPSAoX2ZsYWdzICAmIH5tYXNrKSB8IChmICYg
bWFzayk7IH0KICAgIHZvaWQgZ2J1bXAoaW50IG4pCiAgICAgIHsgX2ZsYWdzICAmIDB4MTAwICA/
IChfSU9fc2F2ZV9iYXNlKz1uKTooX0lPX3JlYWRfcHRyKz1uKTt9CiAgICB2b2lkIHBidW1wKGlu
dCBuKSB7IF9JT193cml0ZV9wdHIgKz0gbjsgfQogICAgdm9pZCBzZXRiKGNoYXIqIGIsIGNoYXIq
IGViLCBpbnQgYT0wKTsKICAgIHZvaWQgc2V0cChjaGFyKiBwLCBjaGFyKiBlcCkKICAgICAgeyBf
SU9fd3JpdGVfYmFzZT1fSU9fd3JpdGVfcHRyPXA7IF9JT193cml0ZV9lbmQ9ZXA7IH0KICAgIHZv
aWQgc2V0ZyhjaGFyKiBlYiwgY2hhciogZywgY2hhciAqZWcpIHsKICAgICAgaWYgKF9mbGFncyAg
JiAweDEwMCApIF9JT19mcmVlX2JhY2t1cF9hcmVhKHRoaXMpOyAKICAgICAgX0lPX3JlYWRfYmFz
ZSA9IGViOyBfSU9fcmVhZF9wdHIgPSBnOyBfSU9fcmVhZF9lbmQgPSBlZzsgfQogICAgY2hhciAq
c2hvcnRidWYoKSB7IHJldHVybiBfc2hvcnRidWY7IH0KCiAgICBpbnQgaW5fYmFja3VwKCkgeyBy
ZXR1cm4gX2ZsYWdzICYgMHgxMDAgOyB9CiAgICAgCiAgICBjaGFyICpHYmFzZSgpIHsgcmV0dXJu
IGluX2JhY2t1cCgpID8gX0lPX3NhdmVfYmFzZSA6IF9JT19yZWFkX2Jhc2U7IH0KICAgICAKICAg
IGNoYXIgKmVHcHRyKCkgeyByZXR1cm4gaW5fYmFja3VwKCkgPyBfSU9fc2F2ZV9lbmQgOiBfSU9f
cmVhZF9lbmQ7IH0KICAgICAKICAgIGNoYXIgKkJiYXNlKCkgeyByZXR1cm4gaW5fYmFja3VwKCkg
PyBfSU9fcmVhZF9iYXNlIDogX0lPX3NhdmVfYmFzZTsgfQogICAgY2hhciAqQnB0cigpIHsgcmV0
dXJuIF9JT19iYWNrdXBfYmFzZTsgfQogICAgIAogICAgY2hhciAqZUJwdHIoKSB7IHJldHVybiBp
bl9iYWNrdXAoKSA/IF9JT19yZWFkX2VuZCA6IF9JT19zYXZlX2VuZDsgfQogICAgY2hhciAqTmJh
c2UoKSB7IHJldHVybiBfSU9fc2F2ZV9iYXNlOyB9CiAgICBjaGFyICplTnB0cigpIHsgcmV0dXJu
IF9JT19zYXZlX2VuZDsgfQogICAgaW50IGhhdmVfYmFja3VwKCkgeyByZXR1cm4gX0lPX3NhdmVf
YmFzZSAhPSBfX251bGwgOyB9CiAgICBpbnQgaGF2ZV9tYXJrZXJzKCkgeyByZXR1cm4gX21hcmtl
cnMgIT0gX19udWxsIDsgfQogICAgdm9pZCBmcmVlX2JhY2t1cF9hcmVhKCk7CiAgICB2b2lkIHVu
c2F2ZV9tYXJrZXJzKCk7ICAKICAgIGludCBwdXRfbW9kZSgpIHsgcmV0dXJuIF9mbGFncyAmIDB4
ODAwIDsgfQogICAgaW50IHN3aXRjaF90b19nZXRfbW9kZSgpOwogICAgCiAgICBzdHJlYW1idWYo
aW50IGZsYWdzPTApOwogIHB1YmxpYzoKICAgIHN0YXRpYyBpbnQgZmx1c2hfYWxsKCk7CiAgICBz
dGF0aWMgdm9pZCBmbHVzaF9hbGxfbGluZWJ1ZmZlcmVkKCk7ICAKICAgIHZpcnR1YWwgfnN0cmVh
bWJ1ZigpOwogICAgdmlydHVhbCBpbnQgb3ZlcmZsb3coaW50IGMgPSAoLTEpICk7ICAKICAgIHZp
cnR1YWwgaW50IHVuZGVyZmxvdygpOyAgCiAgICB2aXJ0dWFsIGludCB1ZmxvdygpOyAgCiAgICB2
aXJ0dWFsIGludCBwYmFja2ZhaWwoaW50IGMpOwogCiAgICB2aXJ0dWFsIHN0cmVhbXNpemUgeHNw
dXRuKGNvbnN0IGNoYXIqIHMsIHN0cmVhbXNpemUgbik7CiAgICB2aXJ0dWFsIHN0cmVhbXNpemUg
eHNnZXRuKGNoYXIqIHMsIHN0cmVhbXNpemUgbik7CiAgICB2aXJ0dWFsIHN0cmVhbXBvcyBzZWVr
b2ZmKHN0cmVhbW9mZiwgX3NlZWtfZGlyLCBpbnQgbW9kZT1pb3M6OmlufGlvczo6b3V0KTsKICAg
IHZpcnR1YWwgc3RyZWFtcG9zIHNlZWtwb3Moc3RyZWFtcG9zIHBvcywgaW50IG1vZGUgPSBpb3M6
OmlufGlvczo6b3V0KTsKCiAgICBzdHJlYW1wb3MgcHVic2Vla29mZihzdHJlYW1vZmYgbywgX3Nl
ZWtfZGlyIGQsIGludCBtb2RlPWlvczo6aW58aW9zOjpvdXQpCiAgICAgIHsgcmV0dXJuIF9JT19z
ZWVrb2ZmICh0aGlzLCBvLCBkLCBtb2RlKTsgfQogICAgc3RyZWFtcG9zIHB1YnNlZWtwb3Moc3Ry
ZWFtcG9zIHBvcywgaW50IG1vZGUgPSBpb3M6OmlufGlvczo6b3V0KQogICAgICB7IHJldHVybiBf
SU9fc2Vla3BvcyAodGhpcywgcG9zLCBtb2RlKTsgfQogICAgc3RyZWFtcG9zIHNzZWVrb2ZmKHN0
cmVhbW9mZiwgX3NlZWtfZGlyLCBpbnQgbW9kZT1pb3M6OmlufGlvczo6b3V0KTsKICAgIHN0cmVh
bXBvcyBzc2Vla3BvcyhzdHJlYW1wb3MgcG9zLCBpbnQgbW9kZSA9IGlvczo6aW58aW9zOjpvdXQp
OwogICAgdmlydHVhbCBzdHJlYW1idWYqIHNldGJ1ZihjaGFyKiBwLCBpbnQgbGVuKTsKICAgIHZp
cnR1YWwgaW50IHN5bmMoKTsKICAgIHZpcnR1YWwgaW50IGRvYWxsb2NhdGUoKTsKCiAgICBpbnQg
c2Vla21hcmsoc3RyZWFtbWFya2VyJiBtYXJrLCBpbnQgZGVsdGEgPSAwKTsKICAgIGludCBzcHV0
YmFja2MoY2hhciBjKTsKICAgIGludCBzdW5nZXRjKCk7CiAgICBpbnQgdW5idWZmZXJlZCgpIHsg
cmV0dXJuIF9mbGFncyAmIDIgID8gMSA6IDA7IH0KICAgIGludCBsaW5lYnVmZmVyZWQoKSB7IHJl
dHVybiBfZmxhZ3MgJiAweDIwMCAgPyAxIDogMDsgfQogICAgdm9pZCB1bmJ1ZmZlcmVkKGludCBp
KQoJeyBpZiAoaSkgX2ZsYWdzIHw9IDIgOyBlbHNlIF9mbGFncyAmPSB+MiA7IH0KICAgIHZvaWQg
bGluZWJ1ZmZlcmVkKGludCBpKQoJeyBpZiAoaSkgX2ZsYWdzIHw9IDB4MjAwIDsgZWxzZSBfZmxh
Z3MgJj0gfjB4MjAwIDsgfQogICAgaW50IGFsbG9jYXRlKCkgeyAgCglpZiAoYmFzZSgpIHx8IHVu
YnVmZmVyZWQoKSkgcmV0dXJuIDA7CgllbHNlIHJldHVybiBkb2FsbG9jYXRlKCk7IH0KICAgICAK
ICAgIHZvaWQgYWxsb2NidWYoKSB7IGlmIChiYXNlKCkgPT0gX19udWxsICkgZG9hbGxvY2J1Zigp
OyB9CiAgICB2b2lkIGRvYWxsb2NidWYoKTsKICAgIGludCBpbl9hdmFpbCgpIHsgcmV0dXJuIF9J
T19yZWFkX2VuZCAtIF9JT19yZWFkX3B0cjsgfQogICAgaW50IG91dF93YWl0aW5nKCkgeyByZXR1
cm4gX0lPX3dyaXRlX3B0ciAtIF9JT193cml0ZV9iYXNlOyB9CiAgICBzdHJlYW1zaXplIHNwdXRu
KGNvbnN0IGNoYXIqIHMsIHN0cmVhbXNpemUgbikgeyByZXR1cm4geHNwdXRuKHMsIG4pOyB9CiAg
ICBzdHJlYW1zaXplIHBhZG4oY2hhciBwYWQsIHN0cmVhbXNpemUgbikgeyByZXR1cm4gX0lPX3Bh
ZG4odGhpcywgcGFkLCBuKTsgfQogICAgc3RyZWFtc2l6ZSBzZ2V0bihjaGFyKiBzLCBzdHJlYW1z
aXplIG4pIHsgcmV0dXJuIF9JT19zZ2V0bih0aGlzLCBzLCBuKTsgfQogICAgaW50IGlnbm9yZShp
bnQpOwogICAgaW50IGdldF9jb2x1bW4oKTsKICAgIGludCBzZXRfY29sdW1uKGludCk7CiAgICBs
b25nIHNnZXRsaW5lKGNoYXIqIGJ1Ziwgc2l6ZV90ICAgbiwgY2hhciBkZWxpbSwgaW50IHB1dGJh
Y2tfZGVsaW0pOwogICAgaW50IHNwdXRjKGludCBjKSB7IHJldHVybiBfSU9fcHV0YyhjLCB0aGlz
KTsgfQogICAgaW50IHNidW1wYygpIHsgcmV0dXJuIF9JT19nZXRjKHRoaXMpOyB9CiAgICBpbnQg
c2dldGMoKSB7IHJldHVybiAoKCAgdGhpcyAgKS0+X0lPX3JlYWRfcHRyID49ICggIHRoaXMgICkt
Pl9JT19yZWFkX2VuZCAmJiBfX3VuZGVyZmxvdyAoICB0aGlzICApID09ICgtMSkgID8gKC0xKSAg
OiAqKHVuc2lnbmVkIGNoYXIgKikgKCAgdGhpcyAgKS0+X0lPX3JlYWRfcHRyKSAgOyB9CiAgICBp
bnQgc25leHRjKCkgewoJaWYgKF9JT19yZWFkX3B0ciA+PSBfSU9fcmVhZF9lbmQgJiYgX191bmRl
cmZsb3codGhpcykgPT0gKC0xKSApCgkgIHJldHVybiAoLTEpIDsKCWVsc2UgcmV0dXJuIF9JT19y
ZWFkX3B0cisrLCBzZ2V0YygpOyB9CiAgICB2b2lkIHN0b3NzYygpIHsgaWYgKF9JT19yZWFkX3B0
ciA8IF9JT19yZWFkX2VuZCkgX0lPX3JlYWRfcHRyKys7IH0KICAgIGludCB2c2NhbihjaGFyIGNv
bnN0ICpmbXQwLCBfX2dudWNfdmFfbGlzdCAgYXAsIGlvcyogc3RyZWFtID0gX19udWxsICk7CiAg
ICBpbnQgc2NhbihjaGFyIGNvbnN0ICpmbXQwIC4uLik7CiAgICBpbnQgdmZvcm0oY2hhciBjb25z
dCAqZm10MCwgX19nbnVjX3ZhX2xpc3QgIGFwKTsKICAgIGludCBmb3JtKGNoYXIgY29uc3QgKmZt
dDAgLi4uKTsKCgoKCiAgICB2aXJ0dWFsIHN0cmVhbXNpemUgc3lzX3JlYWQoY2hhciogYnVmLCBz
dHJlYW1zaXplIHNpemUpOwogICAgdmlydHVhbCBzdHJlYW1zaXplIHN5c193cml0ZShjb25zdCBj
aGFyKiwgc3RyZWFtc2l6ZSk7CiAgICB2aXJ0dWFsIHN0cmVhbXBvcyBzeXNfc2VlayhzdHJlYW1v
ZmYsIF9zZWVrX2Rpcik7CiAgICB2aXJ0dWFsIGludCBzeXNfY2xvc2UoKTsKICAgIHZpcnR1YWwg
aW50IHN5c19zdGF0KHZvaWQqKTsgIAoKICAgIHZpcnR1YWwgaW50IHNob3dtYW55YygpOwogICAg
dmlydHVhbCB2b2lkIGltYnVlKHZvaWQgKik7Cgp9OwoKIAogCgpjbGFzcyBmaWxlYnVmIDogcHVi
bGljIHN0cmVhbWJ1ZiB7CiAgcHJvdGVjdGVkOgogICAgdm9pZCBpbml0KCk7CiAgcHVibGljOgog
ICAgc3RhdGljIGNvbnN0IGludCBvcGVucHJvdDsgIAogICAgZmlsZWJ1ZigpOwogICAgZmlsZWJ1
ZihpbnQgZmQpOwogICAgZmlsZWJ1ZihpbnQgZmQsIGNoYXIqIHAsIGludCBsZW4pOwoKCgogICAg
fmZpbGVidWYoKTsKICAgIGZpbGVidWYqIGF0dGFjaChpbnQgZmQpOwogICAgZmlsZWJ1Ziogb3Bl
bihjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqbW9kZSk7CiAgICBmaWxlYnVmKiBv
cGVuKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpb3M6Om9wZW5tb2RlIG1vZGUsIGludCBwcm90ID0g
MDY2NCk7CiAgICB2aXJ0dWFsIGludCB1bmRlcmZsb3coKTsKICAgIHZpcnR1YWwgaW50IG92ZXJm
bG93KGludCBjID0gKC0xKSApOwogICAgaW50IGlzX29wZW4oKSBjb25zdCB7IHJldHVybiBfZmls
ZW5vID49IDA7IH0KICAgIGludCBmZCgpIGNvbnN0IHsgcmV0dXJuIGlzX29wZW4oKSA/IF9maWxl
bm8gOiAoLTEpIDsgfQogICAgZmlsZWJ1ZiogY2xvc2UoKTsKICAgIHZpcnR1YWwgaW50IGRvYWxs
b2NhdGUoKTsKICAgIHZpcnR1YWwgc3RyZWFtcG9zIHNlZWtvZmYoc3RyZWFtb2ZmLCBfc2Vla19k
aXIsIGludCBtb2RlPWlvczo6aW58aW9zOjpvdXQpOwogICAgdmlydHVhbCBzdHJlYW1idWYqIHNl
dGJ1ZihjaGFyKiBwLCBpbnQgbGVuKTsKICAgIHN0cmVhbXNpemUgeHNwdXRuKGNvbnN0IGNoYXIq
IHMsIHN0cmVhbXNpemUgbik7CiAgICBzdHJlYW1zaXplIHhzZ2V0bihjaGFyKiBzLCBzdHJlYW1z
aXplIG4pOwogICAgdmlydHVhbCBpbnQgc3luYygpOwogIHByb3RlY3RlZDogIAogCiAgICBpbnQg
aXNfcmVhZGluZygpIHsgcmV0dXJuIGViYWNrKCkgIT0gZWdwdHIoKTsgfQogICAgY2hhciogY3Vy
X3B0cigpIHsgcmV0dXJuIGlzX3JlYWRpbmcoKSA/ICBncHRyKCkgOiBwcHRyKCk7IH0KICAgICAK
ICAgIGNoYXIqIGZpbGVfcHRyKCkgeyByZXR1cm4gZUdwdHIoKTsgfQogICAgIAogICAgdmlydHVh
bCBzdHJlYW1zaXplIHN5c19yZWFkKGNoYXIqIGJ1Ziwgc3RyZWFtc2l6ZSBzaXplKTsKICAgIHZp
cnR1YWwgc3RyZWFtcG9zIHN5c19zZWVrKHN0cmVhbW9mZiwgX3NlZWtfZGlyKTsKICAgIHZpcnR1
YWwgc3RyZWFtc2l6ZSBzeXNfd3JpdGUoY29uc3QgY2hhciosIHN0cmVhbXNpemUpOwogICAgdmly
dHVhbCBpbnQgc3lzX3N0YXQodm9pZCopOyAgCiAgICB2aXJ0dWFsIGludCBzeXNfY2xvc2UoKTsK
CgoKCn07CgppbmxpbmUgdm9pZCBpb3M6OmluaXQoc3RyZWFtYnVmKiBzYiwgb3N0cmVhbSogdGll
X3RvKSB7CgkJX3N0YXRlID0gc2IgPyBpb3M6Omdvb2RiaXQgOiBpb3M6OmJhZGJpdDsgX2V4Y2Vw
dGlvbnM9MDsKCQlfc3RyYnVmPXNiOyBfdGllID0gdGllX3RvOyBfd2lkdGg9MDsgX2ZpbGw9JyAn
OwoKCQlfZmxhZ3M9aW9zOjpza2lwd3N8aW9zOjpkZWM7CgoKCgkJX3ByZWNpc2lvbj02OyBfYXJy
YXlzID0gMDsgfQoKaW5saW5lIGlvczo6aW9zKHN0cmVhbWJ1Ziogc2IsIG9zdHJlYW0qIHRpZV90
bykgeyBpbml0KHNiLCB0aWVfdG8pOyB9CgppbmxpbmUgaW9zOjp+aW9zKCkgewoKCgogICAgIAog
ICAgIAogICAgb3BlcmF0b3IgZGVsZXRlW10gKF9hcnJheXMpOwp9Cn0gIAoKIyAzMSAiL3Vzci9s
aWIvZ2NjLWxpYi9pMzg2LWxpbnV4LzIuOTUuMy8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL2lv
c3RyZWFtLmgiIDIgMwoKCmV4dGVybiAiQysrIiB7CmNsYXNzIGlzdHJlYW07IGNsYXNzIG9zdHJl
YW07CnR5cGVkZWYgaW9zJiAoKl9fbWFuaXApKGlvcyYpOwp0eXBlZGVmIGlzdHJlYW0mICgqX19p
bWFuaXApKGlzdHJlYW0mKTsKdHlwZWRlZiBvc3RyZWFtJiAoKl9fb21hbmlwKShvc3RyZWFtJik7
CgpleHRlcm4gaXN0cmVhbSYgd3MoaXN0cmVhbSYgaW5zKTsKZXh0ZXJuIG9zdHJlYW0mIGZsdXNo
KG9zdHJlYW0mIG91dHMpOwpleHRlcm4gb3N0cmVhbSYgZW5kbChvc3RyZWFtJiBvdXRzKTsKZXh0
ZXJuIG9zdHJlYW0mIGVuZHMob3N0cmVhbSYgb3V0cyk7CgpjbGFzcyBvc3RyZWFtIDogdmlydHVh
bCBwdWJsaWMgaW9zCnsKICAgICAKICAgIHZvaWQgZG9fb3NmeCgpOwogIHB1YmxpYzoKICAgIG9z
dHJlYW0oKSB7IH0KICAgIG9zdHJlYW0oc3RyZWFtYnVmKiBzYiwgb3N0cmVhbSogdGllZD0gX19u
dWxsICk7CiAgICBpbnQgb3BmeCgpIHsKCWlmICghZ29vZCgpKSByZXR1cm4gMDsKCWVsc2UgeyBp
ZiAoX3RpZSkgX3RpZS0+Zmx1c2goKTsgIDsgcmV0dXJuIDE7fSB9CiAgICB2b2lkIG9zZngoKSB7
ICA7CgkJICBpZiAoZmxhZ3MoKSAmIChpb3M6OnVuaXRidWZ8aW9zOjpzdGRpbykpCgkJICAgICAg
ZG9fb3NmeCgpOyB9CiAgICBvc3RyZWFtJiBmbHVzaCgpOwogICAgb3N0cmVhbSYgcHV0KGNoYXIg
YykgeyBfc3RyYnVmLT5zcHV0YyhjKTsgcmV0dXJuICp0aGlzOyB9CgoKCgoKICAgIG9zdHJlYW0m
IHdyaXRlKGNvbnN0IGNoYXIgKnMsIHN0cmVhbXNpemUgbik7CiAgICBvc3RyZWFtJiB3cml0ZShj
b25zdCB1bnNpZ25lZCBjaGFyICpzLCBzdHJlYW1zaXplIG4pCiAgICAgIHsgcmV0dXJuIHdyaXRl
KChjb25zdCBjaGFyKilzLCBuKTt9CiAgICBvc3RyZWFtJiB3cml0ZShjb25zdCBzaWduZWQgY2hh
ciAqcywgc3RyZWFtc2l6ZSBuKQogICAgICB7IHJldHVybiB3cml0ZSgoY29uc3QgY2hhciopcywg
bik7fQogICAgb3N0cmVhbSYgd3JpdGUoY29uc3Qgdm9pZCAqcywgc3RyZWFtc2l6ZSBuKQogICAg
ICB7IHJldHVybiB3cml0ZSgoY29uc3QgY2hhciopcywgbik7fQogICAgb3N0cmVhbSYgc2Vla3Ao
c3RyZWFtcG9zKTsKICAgIG9zdHJlYW0mIHNlZWtwKHN0cmVhbW9mZiwgX3NlZWtfZGlyKTsKICAg
IHN0cmVhbXBvcyB0ZWxscCgpOwogICAgb3N0cmVhbSYgZm9ybShjb25zdCBjaGFyICpmb3JtYXQg
Li4uKTsKICAgIG9zdHJlYW0mIHZmb3JtKGNvbnN0IGNoYXIgKmZvcm1hdCwgX19nbnVjX3ZhX2xp
c3QgIGFyZ3MpOwoKICAgIG9zdHJlYW0mIG9wZXJhdG9yPDwoY2hhciBjKTsKICAgIG9zdHJlYW0m
IG9wZXJhdG9yPDwodW5zaWduZWQgY2hhciBjKSB7IHJldHVybiAoKnRoaXMpIDw8IChjaGFyKWM7
IH0KICAgIG9zdHJlYW0mIG9wZXJhdG9yPDwoc2lnbmVkIGNoYXIgYykgeyByZXR1cm4gKCp0aGlz
KSA8PCAoY2hhciljOyB9CiAgICBvc3RyZWFtJiBvcGVyYXRvcjw8KGNvbnN0IGNoYXIgKnMpOwog
ICAgb3N0cmVhbSYgb3BlcmF0b3I8PChjb25zdCB1bnNpZ25lZCBjaGFyICpzKQoJeyByZXR1cm4g
KCp0aGlzKSA8PCAoY29uc3QgY2hhciopczsgfQogICAgb3N0cmVhbSYgb3BlcmF0b3I8PChjb25z
dCBzaWduZWQgY2hhciAqcykKCXsgcmV0dXJuICgqdGhpcykgPDwgKGNvbnN0IGNoYXIqKXM7IH0K
ICAgIG9zdHJlYW0mIG9wZXJhdG9yPDwoY29uc3Qgdm9pZCAqcCk7CiAgICBvc3RyZWFtJiBvcGVy
YXRvcjw8KGludCBuKTsKICAgIG9zdHJlYW0mIG9wZXJhdG9yPDwodW5zaWduZWQgaW50IG4pOwog
ICAgb3N0cmVhbSYgb3BlcmF0b3I8PChsb25nIG4pOwogICAgb3N0cmVhbSYgb3BlcmF0b3I8PCh1
bnNpZ25lZCBsb25nIG4pOwoKICAgIF9fZXh0ZW5zaW9uX18gb3N0cmVhbSYgb3BlcmF0b3I8PChs
b25nIGxvbmcgbik7CiAgICBfX2V4dGVuc2lvbl9fIG9zdHJlYW0mIG9wZXJhdG9yPDwodW5zaWdu
ZWQgbG9uZyBsb25nIG4pOwoKICAgIG9zdHJlYW0mIG9wZXJhdG9yPDwoc2hvcnQgbikge3JldHVy
biBvcGVyYXRvcjw8KChpbnQpbik7fQogICAgb3N0cmVhbSYgb3BlcmF0b3I8PCh1bnNpZ25lZCBz
aG9ydCBuKSB7cmV0dXJuIG9wZXJhdG9yPDwoKHVuc2lnbmVkIGludCluKTt9CgogICAgb3N0cmVh
bSYgb3BlcmF0b3I8PChib29sIGIpIHsgcmV0dXJuIG9wZXJhdG9yPDwoKGludCliKTsgfQoKICAg
IG9zdHJlYW0mIG9wZXJhdG9yPDwoZG91YmxlIG4pOwogICAgb3N0cmVhbSYgb3BlcmF0b3I8PChm
bG9hdCBuKSB7IHJldHVybiBvcGVyYXRvcjw8KChkb3VibGUpbik7IH0KCiAgICBvc3RyZWFtJiBv
cGVyYXRvcjw8KGxvbmcgZG91YmxlIG4pOwoKCgogICAgb3N0cmVhbSYgb3BlcmF0b3I8PChfX29t
YW5pcCBmdW5jKSB7IHJldHVybiAoKmZ1bmMpKCp0aGlzKTsgfQogICAgb3N0cmVhbSYgb3BlcmF0
b3I8PChfX21hbmlwIGZ1bmMpIHsoKmZ1bmMpKCp0aGlzKTsgcmV0dXJuICp0aGlzO30KICAgIG9z
dHJlYW0mIG9wZXJhdG9yPDwoc3RyZWFtYnVmKik7CgoKCn07CgpjbGFzcyBpc3RyZWFtIDogdmly
dHVhbCBwdWJsaWMgaW9zCnsKICAgICAKcHJvdGVjdGVkOgogICAgc2l6ZV90ICAgX2djb3VudDsK
CiAgICBpbnQgX3NraXBfd3MoKTsKICBwdWJsaWM6CiAgICBpc3RyZWFtKCk6IF9nY291bnQgKDAp
IHsgfQogICAgaXN0cmVhbShzdHJlYW1idWYqIHNiLCBvc3RyZWFtKnRpZWQ9IF9fbnVsbCApOwog
ICAgaXN0cmVhbSYgZ2V0KGNoYXIqIHB0ciwgaW50IGxlbiwgY2hhciBkZWxpbSA9ICdcbicpOwog
ICAgaXN0cmVhbSYgZ2V0KHVuc2lnbmVkIGNoYXIqIHB0ciwgaW50IGxlbiwgY2hhciBkZWxpbSA9
ICdcbicpCgl7IHJldHVybiBnZXQoKGNoYXIqKXB0ciwgbGVuLCBkZWxpbSk7IH0KICAgIGlzdHJl
YW0mIGdldChjaGFyJiBjKTsKICAgIGlzdHJlYW0mIGdldCh1bnNpZ25lZCBjaGFyJiBjKSB7IHJl
dHVybiBnZXQoKGNoYXImKWMpOyB9CiAgICBpc3RyZWFtJiBnZXRsaW5lKGNoYXIqIHB0ciwgaW50
IGxlbiwgY2hhciBkZWxpbSA9ICdcbicpOwogICAgaXN0cmVhbSYgZ2V0bGluZSh1bnNpZ25lZCBj
aGFyKiBwdHIsIGludCBsZW4sIGNoYXIgZGVsaW0gPSAnXG4nKQoJeyByZXR1cm4gZ2V0bGluZSgo
Y2hhciopcHRyLCBsZW4sIGRlbGltKTsgfQogICAgaXN0cmVhbSYgZ2V0KHNpZ25lZCBjaGFyJiBj
KSAgeyByZXR1cm4gZ2V0KChjaGFyJiljKTsgfQogICAgaXN0cmVhbSYgZ2V0KHNpZ25lZCBjaGFy
KiBwdHIsIGludCBsZW4sIGNoYXIgZGVsaW0gPSAnXG4nKQoJeyByZXR1cm4gZ2V0KChjaGFyKilw
dHIsIGxlbiwgZGVsaW0pOyB9CiAgICBpc3RyZWFtJiBnZXRsaW5lKHNpZ25lZCBjaGFyKiBwdHIs
IGludCBsZW4sIGNoYXIgZGVsaW0gPSAnXG4nKQoJeyByZXR1cm4gZ2V0bGluZSgoY2hhciopcHRy
LCBsZW4sIGRlbGltKTsgfQogICAgaXN0cmVhbSYgcmVhZChjaGFyICpwdHIsIHN0cmVhbXNpemUg
bik7CiAgICBpc3RyZWFtJiByZWFkKHVuc2lnbmVkIGNoYXIgKnB0ciwgc3RyZWFtc2l6ZSBuKQog
ICAgICB7IHJldHVybiByZWFkKChjaGFyKilwdHIsIG4pOyB9CiAgICBpc3RyZWFtJiByZWFkKHNp
Z25lZCBjaGFyICpwdHIsIHN0cmVhbXNpemUgbikKICAgICAgeyByZXR1cm4gcmVhZCgoY2hhciop
cHRyLCBuKTsgfQogICAgaXN0cmVhbSYgcmVhZCh2b2lkICpwdHIsIHN0cmVhbXNpemUgbikKICAg
ICAgeyByZXR1cm4gcmVhZCgoY2hhciopcHRyLCBuKTsgfQogICAgaXN0cmVhbSYgZ2V0KHN0cmVh
bWJ1ZiYgc2IsIGNoYXIgZGVsaW0gPSAnXG4nKTsKICAgIGlzdHJlYW0mIGdldHMoY2hhciAqKnMs
IGNoYXIgZGVsaW0gPSAnXG4nKTsKICAgIGludCBpcGZ4KGludCBuZWVkID0gMCkgewoJaWYgKCFn
b29kKCkpIHsgc2V0KGlvczo6ZmFpbGJpdCk7IHJldHVybiAwOyB9CgllbHNlIHsKCSAgIDsKCSAg
aWYgKF90aWUgJiYgKG5lZWQgPT0gMCB8fCByZGJ1ZigpLT5pbl9hdmFpbCgpIDwgbmVlZCkpIF90
aWUtPmZsdXNoKCk7CgkgIGlmICghbmVlZCAmJiAoZmxhZ3MoKSAmIGlvczo6c2tpcHdzKSkgcmV0
dXJuIF9za2lwX3dzKCk7CgkgIGVsc2UgcmV0dXJuIDE7Cgl9CiAgICB9CiAgICBpbnQgaXBmeDAo
KSB7ICAKCWlmICghZ29vZCgpKSB7IHNldChpb3M6OmZhaWxiaXQpOyByZXR1cm4gMDsgfQoJZWxz
ZSB7CgkgICA7CgkgIGlmIChfdGllKSBfdGllLT5mbHVzaCgpOwoJICBpZiAoZmxhZ3MoKSAmIGlv
czo6c2tpcHdzKSByZXR1cm4gX3NraXBfd3MoKTsKCSAgZWxzZSByZXR1cm4gMTsKCX0KICAgIH0K
ICAgIGludCBpcGZ4MSgpIHsgIAoJaWYgKCFnb29kKCkpIHsgc2V0KGlvczo6ZmFpbGJpdCk7IHJl
dHVybiAwOyB9CgllbHNlIHsKCSAgIDsKCSAgaWYgKF90aWUgJiYgcmRidWYoKS0+aW5fYXZhaWwo
KSA9PSAwKSBfdGllLT5mbHVzaCgpOwoJICByZXR1cm4gMTsKCX0KICAgIH0KICAgIHZvaWQgaXNm
eCgpIHsgIDsgfQogICAgaW50IGdldCgpIHsgaWYgKCFpcGZ4MSgpKSByZXR1cm4gKC0xKSA7CgkJ
ZWxzZSB7IGludCBjaCA9IF9zdHJidWYtPnNidW1wYygpOwoJCSAgICAgICBpZiAoY2ggPT0gKC0x
KSApIHNldChpb3M6OmVvZmJpdCk7CgkJICAgICAgIGlzZngoKTsKCQkgICAgICAgcmV0dXJuIGNo
OwoJCSAgICAgfSB9CiAgICBpbnQgcGVlaygpOwogICAgc2l6ZV90ICAgZ2NvdW50KCkgeyByZXR1
cm4gX2djb3VudDsgfQogICAgaXN0cmVhbSYgaWdub3JlKGludCBuPTEsIGludCBkZWxpbSA9ICgt
MSkgKTsKICAgIGludCBzeW5jICgpOwogICAgaXN0cmVhbSYgc2Vla2coc3RyZWFtcG9zKTsKICAg
IGlzdHJlYW0mIHNlZWtnKHN0cmVhbW9mZiwgX3NlZWtfZGlyKTsKICAgIHN0cmVhbXBvcyB0ZWxs
ZygpOwogICAgaXN0cmVhbSYgcHV0YmFjayhjaGFyIGNoKSB7CglpZiAoZ29vZCgpICYmIF9zdHJi
dWYtPnNwdXRiYWNrYyhjaCkgPT0gKC0xKSApIGNsZWFyKGlvczo6YmFkYml0KTsKCXJldHVybiAq
dGhpczt9CiAgICBpc3RyZWFtJiB1bmdldCgpIHsKCWlmIChnb29kKCkgJiYgX3N0cmJ1Zi0+c3Vu
Z2V0YygpID09ICgtMSkgKSBjbGVhcihpb3M6OmJhZGJpdCk7CglyZXR1cm4gKnRoaXM7fQogICAg
aXN0cmVhbSYgc2Nhbihjb25zdCBjaGFyICpmb3JtYXQgLi4uKTsKICAgIGlzdHJlYW0mIHZzY2Fu
KGNvbnN0IGNoYXIgKmZvcm1hdCwgX19nbnVjX3ZhX2xpc3QgIGFyZ3MpOwoKCgoKCgogICAgaXN0
cmVhbSYgb3BlcmF0b3I+PihjaGFyKik7CiAgICBpc3RyZWFtJiBvcGVyYXRvcj4+KHVuc2lnbmVk
IGNoYXIqIHApIHsgcmV0dXJuIG9wZXJhdG9yPj4oKGNoYXIqKXApOyB9CiAgICBpc3RyZWFtJiBv
cGVyYXRvcj4+KHNpZ25lZCBjaGFyKnApIHsgcmV0dXJuIG9wZXJhdG9yPj4oKGNoYXIqKXApOyB9
CiAgICBpc3RyZWFtJiBvcGVyYXRvcj4+KGNoYXImIGMpOwogICAgaXN0cmVhbSYgb3BlcmF0b3I+
Pih1bnNpZ25lZCBjaGFyJiBjKSB7cmV0dXJuIG9wZXJhdG9yPj4oKGNoYXImKWMpO30KICAgIGlz
dHJlYW0mIG9wZXJhdG9yPj4oc2lnbmVkIGNoYXImIGMpIHtyZXR1cm4gb3BlcmF0b3I+PigoY2hh
ciYpYyk7fQogICAgaXN0cmVhbSYgb3BlcmF0b3I+PihpbnQmKTsKICAgIGlzdHJlYW0mIG9wZXJh
dG9yPj4obG9uZyYpOwoKICAgIF9fZXh0ZW5zaW9uX18gaXN0cmVhbSYgb3BlcmF0b3I+Pihsb25n
IGxvbmcmKTsKICAgIF9fZXh0ZW5zaW9uX18gaXN0cmVhbSYgb3BlcmF0b3I+Pih1bnNpZ25lZCBs
b25nIGxvbmcmKTsKCiAgICBpc3RyZWFtJiBvcGVyYXRvcj4+KHNob3J0Jik7CiAgICBpc3RyZWFt
JiBvcGVyYXRvcj4+KHVuc2lnbmVkIGludCYpOwogICAgaXN0cmVhbSYgb3BlcmF0b3I+Pih1bnNp
Z25lZCBsb25nJik7CiAgICBpc3RyZWFtJiBvcGVyYXRvcj4+KHVuc2lnbmVkIHNob3J0Jik7Cgog
ICAgaXN0cmVhbSYgb3BlcmF0b3I+Pihib29sJik7CgogICAgaXN0cmVhbSYgb3BlcmF0b3I+Pihm
bG9hdCYpOwogICAgaXN0cmVhbSYgb3BlcmF0b3I+Pihkb3VibGUmKTsKICAgIGlzdHJlYW0mIG9w
ZXJhdG9yPj4obG9uZyBkb3VibGUmKTsKICAgIGlzdHJlYW0mIG9wZXJhdG9yPj4oIF9fbWFuaXAg
ZnVuYykgeygqZnVuYykoKnRoaXMpOyByZXR1cm4gKnRoaXM7fQogICAgaXN0cmVhbSYgb3BlcmF0
b3I+PihfX2ltYW5pcCBmdW5jKSB7IHJldHVybiAoKmZ1bmMpKCp0aGlzKTsgfQogICAgaXN0cmVh
bSYgb3BlcmF0b3I+PihzdHJlYW1idWYqKTsKfTsKCmNsYXNzIGlvc3RyZWFtIDogcHVibGljIGlz
dHJlYW0sIHB1YmxpYyBvc3RyZWFtCnsKICBwdWJsaWM6CiAgICBpb3N0cmVhbSgpIHsgfQogICAg
aW9zdHJlYW0oc3RyZWFtYnVmKiBzYiwgb3N0cmVhbSp0aWVkPSBfX251bGwgKTsKfTsKCmNsYXNz
IF9JT19pc3RyZWFtX3dpdGhhc3NpZ24gOiBwdWJsaWMgaXN0cmVhbSB7CnB1YmxpYzoKICBfSU9f
aXN0cmVhbV93aXRoYXNzaWduJiBvcGVyYXRvcj0oaXN0cmVhbSYpOwogIF9JT19pc3RyZWFtX3dp
dGhhc3NpZ24mIG9wZXJhdG9yPShfSU9faXN0cmVhbV93aXRoYXNzaWduJiByaHMpCiAgICB7IHJl
dHVybiBvcGVyYXRvcj0gKHN0YXRpY19jYXN0PGlzdHJlYW0mPiAocmhzKSk7IH0KfTsKCmNsYXNz
IF9JT19vc3RyZWFtX3dpdGhhc3NpZ24gOiBwdWJsaWMgb3N0cmVhbSB7CnB1YmxpYzoKICBfSU9f
b3N0cmVhbV93aXRoYXNzaWduJiBvcGVyYXRvcj0ob3N0cmVhbSYpOwogIF9JT19vc3RyZWFtX3dp
dGhhc3NpZ24mIG9wZXJhdG9yPShfSU9fb3N0cmVhbV93aXRoYXNzaWduJiByaHMpCiAgICB7IHJl
dHVybiBvcGVyYXRvcj0gKHN0YXRpY19jYXN0PG9zdHJlYW0mPiAocmhzKSk7IH0KfTsKCmV4dGVy
biBfSU9faXN0cmVhbV93aXRoYXNzaWduIGNpbjsKIApleHRlcm4gX0lPX29zdHJlYW1fd2l0aGFz
c2lnbiBjb3V0LCBjZXJyOwoKZXh0ZXJuIF9JT19vc3RyZWFtX3dpdGhhc3NpZ24gY2xvZwoKCgo7
CgpleHRlcm4gaXN0cmVhbSYgbG9jayhpc3RyZWFtJiBpbnMpOwpleHRlcm4gaXN0cmVhbSYgdW5s
b2NrKGlzdHJlYW0mIGlucyk7CmV4dGVybiBvc3RyZWFtJiBsb2NrKG9zdHJlYW0mIG91dHMpOwpl
eHRlcm4gb3N0cmVhbSYgdW5sb2NrKG9zdHJlYW0mIG91dHMpOwoKc3RydWN0IElvc3RyZWFtX2lu
aXQgeyB9IDsgICAKCmlubGluZSBpb3MmIGRlYyhpb3MmIGkpCnsgaS5zZXRmKGlvczo6ZGVjLCBp
b3M6OmRlY3xpb3M6OmhleHxpb3M6Om9jdCk7IHJldHVybiBpOyB9CmlubGluZSBpb3MmIGhleChp
b3MmIGkpCnsgaS5zZXRmKGlvczo6aGV4LCBpb3M6OmRlY3xpb3M6OmhleHxpb3M6Om9jdCk7IHJl
dHVybiBpOyB9CmlubGluZSBpb3MmIG9jdChpb3MmIGkpCnsgaS5zZXRmKGlvczo6b2N0LCBpb3M6
OmRlY3xpb3M6OmhleHxpb3M6Om9jdCk7IHJldHVybiBpOyB9Cn0gIAoKCiMgNiAiL3Vzci9saWIv
Z2NjLWxpYi9pMzg2LWxpbnV4LzIuOTUuMy8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL2lvc3Ry
ZWFtIiAyIDMKCgojIDIgImR5bmFtaWNfY2FzdC5jYyIgMgoKCmNsYXNzIEEgewpwdWJsaWM6CiAg
dmlydHVhbCB+QSgpIHt9CSAKfTsKCmNsYXNzIEIxOiB2aXJ0dWFsIHB1YmxpYyBBIHsKcHVibGlj
OgogIEIxKCk7Cn07CgpjbGFzcyBCMjogdmlydHVhbCBwdWJsaWMgQSB7Cn07CgpjbGFzcyBDOiBw
dWJsaWMgQjEsIHB1YmxpYyBCMiB7Cn07CgoKQjE6OkIxKCkKewogIEEqIHBhID0gdGhpczsKICBj
b3V0IDw8ICJCMSdzIGNvbnN0cnVjdG9yOiIgPDwgZW5kbAogICAgICAgPDwgIiAgIHRoaXMgPT0g
IiA8PCB0aGlzIDw8IGVuZGwKICAgICAgIDw8ICIgICBwYSA9PSAiIDw8IHBhIDw8IGVuZGwKICAg
ICAgIDw8ICIgICBkeW5hbWljX2Nhc3Q8QjEqPihwYSkgPT0gIiA8PCBkeW5hbWljX2Nhc3Q8QjEq
PihwYSkgPDwgZW5kbDsKICAoKHZvaWQpICgoIHRoaXMgPT0gZHluYW1pY19jYXN0PEIxKj4ocGEp
ICkgPyAwIDoJKF9fYXNzZXJ0X2ZhaWwgKCJ0aGlzID09IGR5bmFtaWNfY2FzdDxCMSo+KHBhKSIg
LAkiZHluYW1pY19jYXN0LmNjIiwgMjgsIF9fUFJFVFRZX0ZVTkNUSU9OX18gKSwgMCkpKSA7Cn0K
Cm1haW4oKQp7CiAgQyBjOwp9Cg==

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]