[PATCH 1/2] coroutine: New module

David Gibson <[email protected]> Tue, 29 Nov 2016 00:18:29 +1100
Newsgroups org.ozlabs.lists.ccan
Message-ID <[email protected]>
VGhpcyBpcyBlc3NlbnRpYWxseSBhIHdyYXBwZXIgYXJvdW5kIHVjb250ZXh0LmgsIGJ1dCB0aGUg
aWRlYSBpcyB0aGF0CmFsdGVybmF0aXZlIGJhY2sgZW5kIGltcGxlbWVudGF0aW9ucyBjb3VsZCBi
ZSB1c2VkIGluIGZ1dHVyZS4KClNpZ25lZC1vZmYtYnk6IERhdmlkIEdpYnNvbiA8ZGF2aWRAZ2li
c29uLmRyb3BiZWFyLmlkLmF1PgotLS0KIGNjYW4vY29yb3V0aW5lL0xJQ0VOU0UgICAgICB8ICAg
MSArCiBjY2FuL2Nvcm91dGluZS9faW5mbyAgICAgICAgfCAgNDAgKysrKysrKysKIGNjYW4vY29y
b3V0aW5lL2Nvcm91dGluZS5jICB8IDExNSArKysrKysrKysrKysrKysrKysrKysrKwogY2Nhbi9j
b3JvdXRpbmUvY29yb3V0aW5lLmggIHwgMjE5ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysr
KysrKysrKysrKysrKysrCiBjY2FuL2Nvcm91dGluZS90ZXN0L2FwaS0xLmMgfCAgNTIgKysrKysr
KysrKysKIGNjYW4vY29yb3V0aW5lL3Rlc3QvYXBpLTIuYyB8IDExMCArKysrKysrKysrKysrKysr
KysrKysrCiBjY2FuL2Nvcm91dGluZS90ZXN0L2FwaS0zLmMgfCAgOTAgKysrKysrKysrKysrKysr
KysrCiA3IGZpbGVzIGNoYW5nZWQsIDYyNyBpbnNlcnRpb25zKCspCiBjcmVhdGUgbW9kZSAxMjAw
MDAgY2Nhbi9jb3JvdXRpbmUvTElDRU5TRQogY3JlYXRlIG1vZGUgMTAwNjQ0IGNjYW4vY29yb3V0
aW5lL19pbmZvCiBjcmVhdGUgbW9kZSAxMDA2NDQgY2Nhbi9jb3JvdXRpbmUvY29yb3V0aW5lLmMK
IGNyZWF0ZSBtb2RlIDEwMDY0NCBjY2FuL2Nvcm91dGluZS9jb3JvdXRpbmUuaAogY3JlYXRlIG1v
ZGUgMTAwNjQ0IGNjYW4vY29yb3V0aW5lL3Rlc3QvYXBpLTEuYwogY3JlYXRlIG1vZGUgMTAwNjQ0
IGNjYW4vY29yb3V0aW5lL3Rlc3QvYXBpLTIuYwogY3JlYXRlIG1vZGUgMTAwNjQ0IGNjYW4vY29y
b3V0aW5lL3Rlc3QvYXBpLTMuYwoKZGlmZiAtLWdpdCBhL2NjYW4vY29yb3V0aW5lL0xJQ0VOU0Ug
Yi9jY2FuL2Nvcm91dGluZS9MSUNFTlNFCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAw
MDAuLmRjMzE0ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9jY2FuL2Nvcm91dGluZS9MSUNFTlNFCkBA
IC0wLDAgKzEgQEAKKy4uLy4uL2xpY2Vuc2VzL0xHUEwtMi4xClwgTm8gbmV3bGluZSBhdCBlbmQg
b2YgZmlsZQpkaWZmIC0tZ2l0IGEvY2Nhbi9jb3JvdXRpbmUvX2luZm8gYi9jY2FuL2Nvcm91dGlu
ZS9faW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTlhMDk5Ci0tLSAv
ZGV2L251bGwKKysrIGIvY2Nhbi9jb3JvdXRpbmUvX2luZm8KQEAgLTAsMCArMSw0MCBAQAorI2lu
Y2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+
CisKKy8qKgorICogY29yb3V0aW5lIC0gQ28tcm91dGluZXMKKyAqCisgKiBUaGlzIGNvZGUgaGFz
IGhlbHBlciBmdW5jdGlvbnMgZm9yIGltcGxlbWVudGluZyBjby1yb3V0aW5lcywgdGhhdAorICog
aXMsIGV4cGxpY2l0IGNvLW9wZXJhdGl2ZSBjb250ZXh0IHN3aXRjaGluZy4gIEl0J3MgaW50ZW5k
ZWQgdG8KKyAqIHByb3ZpZGUgc2ltaWxhciBmdW5jdGlvbmFsaXR5IHRvIAorICoKKyAqIEF1dGhv
cjogRGF2aWQgR2lic29uIDxkYXZpZEBnaWJzb24uZHJvcGJlYXIuaWQuYXU+CisgKiBMaWNlbnNl
OiBMR1BMICh2Mi4xIG9yIGFueSBsYXRlciB2ZXJzaW9uKQorICoKKyAqIENjYW5saW50OgorICoJ
Ly8gQ29udGV4dCBzd2l0Y2hpbmcgcmVhbGx5IGNvbmZ1c2VzIHZhbGdyaW5kCisgKgl0ZXN0c19w
YXNzX3ZhbGdyaW5kIEZBSUwKKyAqLworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkK
K3sKKwkvKiBFeHBlY3QgZXhhY3RseSBvbmUgYXJndW1lbnQgKi8KKwlpZiAoYXJnYyAhPSAyKQor
CQlyZXR1cm4gMTsKKworCWlmIChzdHJjbXAoYXJndlsxXSwgImRlcGVuZHMiKSA9PSAwKSB7CisJ
CXByaW50ZigiY2Nhbi9wdHJpbnRcbiIpOworCQlwcmludGYoImNjYW4vY29tcGlsZXJcbiIpOwor
CQlwcmludGYoImNjYW4vYnVpbGRfYXNzZXJ0XG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYg
KHN0cmNtcChhcmd2WzFdLCAicG9ydGVkIikgPT0gMCkgeworI2lmICFIQVZFX1VDT05URVhUCisJ
CXByaW50ZigiUmVxdWlyZXMgd29ya2luZyB1Y29udGV4dC5oXG4iKTsKKyNlbmRpZgorCQlyZXR1
cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2NjYW4vY29yb3V0aW5lL2Nv
cm91dGluZS5jIGIvY2Nhbi9jb3JvdXRpbmUvY29yb3V0aW5lLmMKbmV3IGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggMDAwMDAwMC4uZmQ0MDg5YgotLS0gL2Rldi9udWxsCisrKyBiL2NjYW4vY29yb3V0
aW5lL2Nvcm91dGluZS5jCkBAIC0wLDAgKzEsMTE1IEBACisvKiBHTlUgTEdQTCB2ZXJzaW9uIDIg
KG9yIGxhdGVyKSAtIHNlZSBMSUNFTlNFIGZpbGUgZm9yIGRldGFpbHMgKi8KKyNpbmNsdWRlIDxh
c3NlcnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGNjYW4vcHRyaW50L3B0
cmludC5oPgorI2luY2x1ZGUgPGNjYW4vYnVpbGRfYXNzZXJ0L2J1aWxkX2Fzc2VydC5oPgorI2lu
Y2x1ZGUgPGNjYW4vY29yb3V0aW5lL2Nvcm91dGluZS5oPgorCisvKgorICogU3RhY2sgbWFuYWdl
bWVudAorICovCisKK3N0cnVjdCBjb3JvdXRpbmVfc3RhY2sgeworCXVpbnQ2NF90IG1hZ2ljOwor
CXNpemVfdCBzaXplOworfTsKKworc3RydWN0IGNvcm91dGluZV9zdGFjayAqY29yb3V0aW5lX3N0
YWNrX2luaXQodm9pZCAqYnVmLCBzaXplX3QgYnVmc2l6ZSwKKwkJCQkJICAgICBzaXplX3QgbWV0
YXNpemUpCit7CisJc3RydWN0IGNvcm91dGluZV9zdGFjayAqc3RhY2s7CisKKwlCVUlMRF9BU1NF
UlQoQ09ST1VUSU5FX1NUS19PVkVSSEVBRCA9PSBzaXplb2YoKnN0YWNrKSk7CisjaWZkZWYgTUlO
U0lHU1RLU1oKKwlCVUlMRF9BU1NFUlQoQ09ST1VUSU5FX01JTl9TVEtTWiA+PSBNSU5TSUdTVEtT
Wik7CisjZW5kaWYKKworCWlmIChidWZzaXplIDwgKENPUk9VVElORV9NSU5fU1RLU1ogKyBzaXpl
b2YoKnN0YWNrKSArIG1ldGFzaXplKSkKKwkJcmV0dXJuIE5VTEw7CisKKyNpZiBIQVZFX1NUQUNL
X0dST1dTX1VQV0FSRFMKKwlzdGFjayA9IChjaGFyICopYnVmICsgbWV0YXNpemU7CisjZWxzZQor
CXN0YWNrID0gKHN0cnVjdCBjb3JvdXRpbmVfc3RhY2sgKikKKwkJKChjaGFyICopYnVmICsgYnVm
c2l6ZSAtIG1ldGFzaXplKSAtIDE7CisjZW5kaWYKKworCXN0YWNrLT5tYWdpYyA9IENPUk9VVElO
RV9TVEFDS19NQUdJQzsKKwlzdGFjay0+c2l6ZSA9IGJ1ZnNpemUgLSBzaXplb2YoKnN0YWNrKSAt
IG1ldGFzaXplOworCisJcmV0dXJuIHN0YWNrOworfQorCit2b2lkIGNvcm91dGluZV9zdGFja19y
ZWxlYXNlKHN0cnVjdCBjb3JvdXRpbmVfc3RhY2sgKnN0YWNrKQoreworCW1lbXNldChzdGFjaywg
MCwgc2l6ZW9mKCpzdGFjaykpOworfQorCitib29sIGNvcm91dGluZV9zdGFja192YWxpZChzdHJ1
Y3QgY29yb3V0aW5lX3N0YWNrICpzdGFjaykKK3sKKwlyZXR1cm4gc3RhY2sKKwkJJiYgKHN0YWNr
LT5tYWdpYyA9PSBDT1JPVVRJTkVfU1RBQ0tfTUFHSUMpCisJCSYmIChzdGFjay0+c2l6ZSA+PSBD
T1JPVVRJTkVfTUlOX1NUS1NaKTsKK30KKworc2l6ZV90IGNvcm91dGluZV9zdGFja19zaXplKGNv
bnN0IHN0cnVjdCBjb3JvdXRpbmVfc3RhY2sgKnN0YWNrKQoreworCXJldHVybiBzdGFjay0+c2l6
ZTsKK30KKworI2lmIEhBVkVfVUNPTlRFWFQKK3N0YXRpYyB2b2lkIGNvcm91dGluZV91Y19zdGFj
ayhzdGFja190ICp1Y19zdGFjaywKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgY29yb3V0aW5lX3N0
YWNrICpzdGFjaykKK3sKKwl1Y19zdGFjay0+c3Nfc2l6ZSA9IGNvcm91dGluZV9zdGFja19zaXpl
KHN0YWNrKSAtIHNpemVvZigqc3RhY2spOworCisjaWYgSEFWRV9TVEFDS19HUk9XU19VUFdBUkRT
CisJdWNfc3RhY2stPnNzX3NwID0gKHZvaWQgKikoc3RhY2sgKyAxKTsKKyNlbHNlCisJdWNfc3Rh
Y2stPnNzX3NwID0gKGNoYXIgKilzdGFjayAtIHVjX3N0YWNrLT5zc19zaXplOworI2VuZGlmCit9
CisjZW5kaWYgLyogSEFWRV9VQ09OVEVYVCAqLworCisvKgorICogQ29yb3V0aW5lIHN3aXRjaGlu
ZworICovCisKKyNpZiBIQVZFX1VDT05URVhUCit2b2lkIGNvcm91dGluZV9pbml0KHN0cnVjdCBj
b3JvdXRpbmVfc3RhdGUgKmNzLAorCQkgICAgdm9pZCAoKmZuKSh2b2lkICopLCB2b2lkICphcmcs
CisJCSAgICBzdHJ1Y3QgY29yb3V0aW5lX3N0YWNrICpzdGFjaykKK3sKKwlnZXRjb250ZXh0ICgm
Y3MtPnVjKTsKKworCWNvcm91dGluZV91Y19zdGFjaygmY3MtPnVjLnVjX3N0YWNrLCBzdGFjayk7
CisKKyAgICAgICAgaWYgKEhBVkVfUE9JTlRFUl9TQUZFX01BS0VDT05URVhUKSB7CisgICAgICAg
ICAgICAgICAgbWFrZWNvbnRleHQoJmNzLT51YywgKHZvaWQgKilmbiwgMSwgYXJnKTsKKyAgICAg
ICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc2kgPSBwdHIyaW50KGFyZyk7
CisgICAgICAgICAgICAgICAgcHRyZGlmZl90IG1hc2sgPSAoMVVMIDw8IChzaXplb2YoaW50KSAq
IDgpKSAtIDE7CisgICAgICAgICAgICAgICAgaW50IGxvID0gc2kgJiBtYXNrOworICAgICAgICAg
ICAgICAgIGludCBoaSA9IHNpID4+IChzaXplb2YoaW50KSAqIDgpOworCisgICAgICAgICAgICAg
ICAgbWFrZWNvbnRleHQoJmNzLT51YywgKHZvaWQgKilmbiwgMiwgbG8sIGhpKTsKKyAgICAgICAg
fQorCQorfQorCit2b2lkIGNvcm91dGluZV9qdW1wKGNvbnN0IHN0cnVjdCBjb3JvdXRpbmVfc3Rh
dGUgKnRvKQoreworCXNldGNvbnRleHQoJnRvLT51Yyk7CisJYXNzZXJ0KDApOworfQorCit2b2lk
IGNvcm91dGluZV9zd2l0Y2goc3RydWN0IGNvcm91dGluZV9zdGF0ZSAqZnJvbSwKKwkJICAgICAg
Y29uc3Qgc3RydWN0IGNvcm91dGluZV9zdGF0ZSAqdG8pCit7CisJaW50IHJjOworCisJcmMgPSBz
d2FwY29udGV4dCgmZnJvbS0+dWMsICZ0by0+dWMpOworCWFzc2VydChyYyA9PSAwKTsKK30KKyNl
bmRpZiAvKiBIQVZFX1VDT05URVhUICovCmRpZmYgLS1naXQgYS9jY2FuL2Nvcm91dGluZS9jb3Jv
dXRpbmUuaCBiL2NjYW4vY29yb3V0aW5lL2Nvcm91dGluZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0
CmluZGV4IDAwMDAwMDAuLjZlYmE0YTMKLS0tIC9kZXYvbnVsbAorKysgYi9jY2FuL2Nvcm91dGlu
ZS9jb3JvdXRpbmUuaApAQCAtMCwwICsxLDIxOSBAQAorLyogTGljZW5zZWQgdW5kZXIgTEdQTHYy
LjErIC0gc2VlIExJQ0VOU0UgZmlsZSBmb3IgZGV0YWlscyAqLworI2lmbmRlZiBDQ0FOX0NPUk9V
VElORV9ICisjZGVmaW5lIENDQU5fQ09ST1VUSU5FX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKwor
I2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGJv
b2wuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2luY2x1ZGUgPGNjYW4vY29tcGlsZXIvY29t
cGlsZXIuaD4KKworLyoqCisgKiBzdHJ1Y3QgY29yb3V0aW5lX3N0YWNrCisgKgorICogRGVzY3Jp
YmVzIGEgc3RhY2sgc3VpdGFibGUgZm9yIGV4ZWN1dGluZyBhIGNvcm91dGluZS4gIFRoaXMKKyAq
IHN0cnVjdHVyZSBpcyBhbHdheXMgY29udGFpbmVkIHdpdGhpbiB0aGUgc3RhY2sgaXQgZGVzY3Jp
YmVzLgorICovCitzdHJ1Y3QgY29yb3V0aW5lX3N0YWNrOworCisvKioKKyAqIHN0cnVjdCBjb3Jv
dXRpbmVfc3RhdGUKKyAqCisgKiBEZXNjcmliZXMgdGhlIHN0YXRlIG9mIGFuIGluLXByb2dyZXNz
IGNvcm91dGluZS4KKyAqLworc3RydWN0IGNvcm91dGluZV9zdGF0ZTsKKworLyoKKyAqIFN0YWNr
IG1hbmFnZW1lbnQKKyAqLworCisvKioKKyAqIENPUk9VVElORV9TVEtfT1ZFUkhFQUQgLSBpbnRl
cm5hbCBzdGFjayBvdmVyaGVhZAorICoKKyAqIE51bWJlciBvZiBieXRlcyBvZiBhIHN0YWNrIHdo
aWNoIGNvcm91dGluZSBuZWVkcyBmb3IgaXRzIG93bgorICogdHJhY2tpbmcgaW5mb3JtYXRpb24u
CisgKi8KKyNkZWZpbmUgQ09ST1VUSU5FX1NUS19PVkVSSEVBRAkJKHNpemVvZih1aW50NjRfdCkg
KyBzaXplb2Yoc2l6ZV90KSkKKworLyoqCisgKiBDT1JPVVRJTkVfTUlOX1NUS1NaIC0gTWluaW11
bSBjb3JvdXRpbmUgc3RhY2sgc2l6ZQorICoKKyAqIENvbnRhaW5zIHRoZSBtaW5pbXVtIHNpemUg
Zm9yIGEgY29yb3V0aW5lIHN0YWNrIChub3QgaW5jbHVkaW5nCisgKiBvdmVyaGVhZCkuICBPbiBz
eXN0ZW1zIHdpdGggTUlOU1RLU1osIGd1YXJhbnRlZWQgdG8gYmUgYXQgbGVhc3QgYXMKKyAqIGxh
cmdlIGFzIE1JTlNUS1NaLgorICovCisjZGVmaW5lIENPUk9VVElORV9NSU5fU1RLU1oJCTIwNDgK
KworLyoqCisgKiBDT1JPVVRJTkVfU1RBQ0tfTUFHSUMgLSBNYWdpYyBudW1iZXIgZm9yIGNvcm91
dGluZSBzdGFja3MKKyAqLworI2RlZmluZSBDT1JPVVRJTkVfU1RBQ0tfTUFHSUMJCTB4YzA0MGMw
NDA1NzRjNTc0YworCisKKy8qKgorICogY29yb3V0aW5lX3N0YWNrX2luaXQgLSBQcmVwYXJlIGEg
Y29yb3V0aW5lIHN0YWNrIGluIGFuIGV4aXN0aW5nIGJ1ZmZlcgorICogQGJ1ZjogYnVmZmVyIHRv
IHVzZSBmb3IgdGhlIGNvcm91dGluZSBzdGFjaworICogQGJ1ZnNpemU6IHNpemUgb2YgQGJ1Zgor
ICogQG1ldGFzaXplOiBzaXplIG9mIG1ldGFkYXRhIHRvIGFkZCB0byB0aGUgc3RhY2sgKG5vdCBp
bmNsdWRpbmcKKyAqICAgICAgICAgICAgY29yb3V0aW5lIGludGVybmFsIG92ZXJoZWFkKQorICoK
KyAqIFByZXBhcmVzIEBidWYgZm9yIHVzZSBhcyBhIGNvcm91dGluZSBzdGFjaywgcmV0dXJuaW5n
IGEKKyAqIGNvcm91dGluZV9zdGFjayAqLCBhbGxvY2F0ZWQgZnJvbSB3aXRoaW4gdGhlIGJ1ZmZl
ci4gIFJldHVybnMgTlVMTAorICogb24gZmFpbHVyZS4KKyAqCisgKiBUaGlzIHdpbGwgZmFpbCBp
ZiB0aGUgYnVmc2l6ZSA8IChDT1JPVVRJTkVfTUlOX1NUS1NaICsKKyAqIENPUk9VVElORV9TVEtf
T1ZFUkhFQUQgKyBtZXRhc2l6ZSkuCisgKi8KK3N0cnVjdCBjb3JvdXRpbmVfc3RhY2sgKmNvcm91
dGluZV9zdGFja19pbml0KHZvaWQgKmJ1Ziwgc2l6ZV90IGJ1ZnNpemUsCisJCQkJCSAgICAgc2l6
ZV90IG1ldGFzaXplKTsKKworLyoqCisgKiBjb3JvdXRpbmVfc3RhY2tfaW5pdCAtIFN0b3AgdXNp
bmcgYSBjb3JvdXRpbmUgc3RhY2sKKyAqIEBzdGFjazogY29yb3V0aW5lIHN0YWNrIHRvIHJlbGVh
c2UKKyAqCisgKiBUaGlzIHJlbGVhc2VzIEBzdGFjaywgbWFraW5nIGl0IG5vIGxvbmdlciBzdWl0
YWJsZSBmb3IgdXNlIGFzIGEKKyAqIGNvcm91dGluZSBzdGFjay4KKyAqLwordm9pZCBjb3JvdXRp
bmVfc3RhY2tfcmVsZWFzZShzdHJ1Y3QgY29yb3V0aW5lX3N0YWNrICpzdGFjayk7CisKKy8qKgor
ICogY29yb3V0aW5lX3N0YWNrX3ZhbGlkIC0gRGV0ZXJtaW5lIGlmIGEgY29yb3V0aW5lIHN0YWNr
IGxvb2tzIHZhbGlkCisgKiBAc3RhY2s6IHN0YWNrIHRvIGNoZWNrCisgKgorICogUmV0dXJucyB0
cnVlIGlmIEBzdGFjayBhcHBlYXJzIHRvIGJlIGEgdmFsaWQgY29yb3V0aW5lIHN0YWNrLCBmYWxz
ZQorICogb3RoZXJ3aXNlLgorICovCitib29sIGNvcm91dGluZV9zdGFja192YWxpZChzdHJ1Y3Qg
Y29yb3V0aW5lX3N0YWNrICpzdGFjayk7CisKKy8qKgorICogY29yb3V0aW5lX3N0YWNrX3RvX21l
dGFkYXRhIC0gUmV0dXJucyBwb2ludGVyIHRvIHVzZXIncyBtZXRhZGF0YQorICogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGVkIHdpdGhpbiB0aGUgc3RhY2sKKyAqIEBzdGFj
azogY29yb3V0aW5lIHN0YWNrCisgKiBAbWV0YXNpemU6IHNpemUgb2YgbWV0YWRhdGEKKyAqCisg
KiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgbWV0YWRhdGEgYXJlYSB3aXRoaW4gQHN0YWNrLiAg
VGhpcyBpcyBvZgorICogc2l6ZSBnaXZlbiBhdCBpbml0aWFsaXphdGlvbiB0aW1lLCBhbmQgd29u
J3QgYmUgb3ZlcndyaXR0ZW4gYnkKKyAqIGNvcm91dGluZXMgZXhlY3V0aW5nIG9uIHRoZSBzdGFj
ay4gIEl0J3MgdXAgdG8gdGhlIGNhbGxlciB3aGF0IHRvCisgKiBwdXQgaW4gaGVyZS4gQG1ldGFz
aXplIG11c3QgYmUgZXF1YWwgdG8gdGhlIHZhbHVlIHBhc3NlZCB0bworICogY29yb3V0aW5lX3N0
YWNrX2luaXQoKS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkICpjb3JvdXRpbmVfc3RhY2tfdG9f
bWV0YWRhdGEoc3RydWN0IGNvcm91dGluZV9zdGFjayAqc3RhY2ssCisJCQkJCQlzaXplX3QgbWV0
YXNpemUpCit7CisjaWYgSEFWRV9TVEFDS19HUk9XU19VUFdBUkRTCisJcmV0dXJuIChjaGFyICop
c3RhY2sgLSBtZXRhc2l6ZTsKKyNlbHNlCisJcmV0dXJuIChjaGFyICopc3RhY2sgKyBDT1JPVVRJ
TkVfU1RLX09WRVJIRUFEOworI2VuZGlmCit9CisKKy8qKgorICogY29yb3V0aW5lX3N0YWNrX2Zy
b21fbWV0YWRhdGEgLSBSZXR1cm5zIHBvaW50ZXIgdG8gY29yb3V0aW5lIHN0YWNrCisgKiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgZ2l2ZW4gcG9pbnRlciB0byB1c2Vy
IG1ldGFkYXRhCisgKiBAbWV0YWRhdDogdXNlciBtZXRhZGF0YSB3aXRoaW4gYSBzdGFjaworICog
QG1ldGFzaXplOiBzaXplIG9mIG1ldGFkYXRhCisgKgorICogUmV0dXJucyBhIHBvaW50ZXIgdG8g
dGhlIGNvcm91dGluZV9zdGFjayBoYW5kbGUgd2l0aGluIGEgc3RhY2suCisgKiBUaGUgYXJndW1l
bnQgbXVzdCBiZSBhIHBvaW50ZXIgcmV0dXJuZWQgYnkKKyAqIGNvcm91dGluZV9zdGFja190b19t
ZXRhZGF0YSgpIGF0IGFuIGVhcmxpZXIgdGltZS4gQG1ldGFzaXplIG11c3QgYmUKKyAqIGVxdWFs
IHRvIHRoZSB2YWx1ZSBwYXNzZWQgdG8gY29yb3V0aW5lX3N0YWNrX2luaXQoKS4KKyAqLworc3Rh
dGljIGlubGluZSBzdHJ1Y3QgY29yb3V0aW5lX3N0YWNrICoKK2Nvcm91dGluZV9zdGFja19mcm9t
X21ldGFkYXRhKHZvaWQgKm1ldGFkYXRhLCBzaXplX3QgbWV0YXNpemUpCit7CisjaWYgSEFWRV9T
VEFDS19HUk9XU19VUFdBUkRTCisJcmV0dXJuIChzdHJ1Y3QgY29yb3V0aW5lX3N0YWNrICopKChj
aGFyICopbWV0YWRhdGEgKyBtZXRhc2l6ZSk7CisjZWxzZQorCXJldHVybiAoc3RydWN0IGNvcm91
dGluZV9zdGFjayAqKSgoY2hhciAqKW1ldGFkYXRhCisJCQkJCSAgLSBDT1JPVVRJTkVfU1RLX09W
RVJIRUFEKTsKKyNlbmRpZgorfQorCisvKioKKyAqIGNvcm91dGluZV9zdGFja19zaXplIC0gUmV0
dXJuIHNpemUgb2YgYSBjb3JvdXRpbmUgc3RhY2sKKyAqIEBzdGFjazogY29yb3V0aW5lIHN0YWNr
CisgKgorICogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgY29yb3V0aW5lIHN0YWNrIEBzdGFjay4g
IFRoaXMgZG9lcyBub3QKKyAqIGluY2x1ZGUgdGhlIG92ZXJoZWFkIG9mIHN0cnVjdCBjb3JvdXRp
bmVfc3RhY2sgb3IgbWV0ZGF0YS4KKyAqLworc2l6ZV90IGNvcm91dGluZV9zdGFja19zaXplKGNv
bnN0IHN0cnVjdCBjb3JvdXRpbmVfc3RhY2sgKnN0YWNrKTsKKworLyoKKyAqIENvcm91dGluZSBz
d2l0Y2hpbmcKKyAqLworCisjaWYgSEFWRV9VQ09OVEVYVAorI2luY2x1ZGUgPHVjb250ZXh0Lmg+
CisjZGVmaW5lIENPUk9VVElORV9BVkFJTEFCTEUJCTEKKyNlbHNlCisjZGVmaW5lIENPUk9VVElO
RV9BVkFJTEFCTEUJCTAKKyNlbmRpZgorCitzdHJ1Y3QgY29yb3V0aW5lX3N0YXRlIHsKKyNpZiBI
QVZFX1VDT05URVhUCisJdWNvbnRleHRfdCB1YzsKKyNlbmRpZiAvKiBIQVZFX1VDT05URVhUICov
Cit9OworCisjaWYgQ09ST1VUSU5FX0FWQUlMQUJMRQorCisvKioKKyAqIGNvcm91dGluZV9pbml0
IC0gUHJlcGFyZSBhIGNvcm91dGluZSBmb3IgZXhlY3V0aW9uCisgKiBAY3M6IGNvcm91dGluZV9z
dGF0ZSBzdHJ1Y3R1cmUgdG8gaW5pdGlhbGl6ZQorICogQGZuOiBmdW5jdGlvbiB0byBzdGFydCBl
eGVjdXRpbmcgaW4gdGhlIGNvcm91dGluZQorICogQGFyZzogYXJndW1lbnQgZm9yIEBmbgorICog
QHN0YWNrOiBzdGFjayB0byB1c2UgZm9yIHRoZSBjb3JvdXRpbmUKKyAqCisgKiBQcmVwYXJlcyBA
Y3MgYXMgYSBuZXcgY29yb3V0aW5lIHdoaWNoIHdpbGwgZXhlY3V0ZSBzdGFydGluZyB3aXRoCisg
KiBmdW5jdGlvbiBAZm4sIHVzaW5nIHN0YWNrIEBzdGFjay4KKyAqLwordm9pZCBjb3JvdXRpbmVf
aW5pdChzdHJ1Y3QgY29yb3V0aW5lX3N0YXRlICpjcywKKwkJICAgIHZvaWQgKCpmbikodm9pZCAq
KSwgdm9pZCAqYXJnLAorCQkgICAgc3RydWN0IGNvcm91dGluZV9zdGFjayAqc3RhY2spOworCisv
KioKKyAqIGNvcm91dGluZV9qdW1wIC0gSXJyZXZlcnNpYmx5IHN3aXRjaCB0byBleGVjdXRpbmcg
YSBjb3JvdXRpbmUKKyAqIEB0bzogY29yb3V0aW5lIHRvIHN3aXRjaCB0bworICoKKyAqIEltbWVk
aWF0ZWx5IGp1bXAgdG8gZXhlY3V0aW5nIGNvcm91dGluZSBAdG8gKGF0IHdoYXRldmVyIHBvaW50
IGluCisgKiBleGVjdXRpb24gaXQgd2FzIHVwIHRvKS4gIE5ldmVyIHJldHVybnMuCisgKi8KK3Zv
aWQgTk9SRVRVUk4gY29yb3V0aW5lX2p1bXAoY29uc3Qgc3RydWN0IGNvcm91dGluZV9zdGF0ZSAq
dG8pOworCisvKioKKyAqIGNvcm91dGluZV9zd2l0Y2ggLSBTd2l0Y2ggY29yb3V0aW5lcworICog
QGZyb206IGNvcm91dGluZSBpbiB3aGljaCB0byBzdG9yZSBjdXJyZW50IGV4ZWN1dGlvbiBzdGF0
ZQorICogQHRvOiBjb3JvdXRpbmUgdG8gc3dpdGNoIHRvCisgKgorICogU3RvcCBleGVjdXRpbmcg
dGhlIGN1cnJlbnQgcm91dGluZSwgc2F2aW5nIGl0cyBzdGF0ZSBpbiBAZnJvbSwgYW5kCisgKiBz
d2l0Y2ggdG8gZXhlY3V0aW5nIHRoZSBjb3JvdXRpbmUgQHRvLiAgUmV0dXJucyBvbmx5IHdoZW4g
c29tZXRoaW5nCisgKiBzd2l0Y2hlcyBvciBqdW1wcyBiYWNrIHRvIEBmcm9tLgorICovCit2b2lk
IGNvcm91dGluZV9zd2l0Y2goc3RydWN0IGNvcm91dGluZV9zdGF0ZSAqZnJvbSwKKwkJICAgICAg
Y29uc3Qgc3RydWN0IGNvcm91dGluZV9zdGF0ZSAqdG8pOworCisjZWxzZQorCitzdGF0aWMgaW5s
aW5lIHZvaWQgY29yb3V0aW5lX2luaXQoc3RydWN0IGNvcm91dGluZV9zdGF0ZSAqY3MsCisJCQkJ
ICB2b2lkICgqZm4pKHZvaWQgKiksIHZvaWQgKmFyZywKKwkJCQkgIHN0cnVjdCBjb3JvdXRpbmVf
c3RhY2sgKnN0YWNrKQoreworCWFzc2VydCgwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIE5P
UkVUVVJOIGNvcm91dGluZV9qdW1wKGNvbnN0IHN0cnVjdCBjb3JvdXRpbmVfc3RhdGUgKnRvKQor
eworCWFzc2VydCgwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNvcm91dGluZV9zd2l0Y2go
c3RydWN0IGNvcm91dGluZV9zdGF0ZSAqZnJvbSwKKwkJCQkgICAgY29uc3Qgc3RydWN0IGNvcm91
dGluZV9zdGF0ZSAqdG8pCit7CisJYXNzZXJ0KDApOworfQorCisjZW5kaWYgLyogIUNPUk9VVElO
RV9BVkFJTEFCTEUgKi8KKworI2VuZGlmIC8qIENDQU5fQ09ST1VUSU5FX0ggKi8KZGlmZiAtLWdp
dCBhL2NjYW4vY29yb3V0aW5lL3Rlc3QvYXBpLTEuYyBiL2NjYW4vY29yb3V0aW5lL3Rlc3QvYXBp
LTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWI0OWYxCi0tLSAvZGV2
L251bGwKKysrIGIvY2Nhbi9jb3JvdXRpbmUvdGVzdC9hcGktMS5jCkBAIC0wLDAgKzEsNTIgQEAK
KyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgPGNjYW4vY29yb3V0aW5lL2Nvcm91dGlu
ZS5oPgorI2luY2x1ZGUgPGNjYW4vdGFwL3RhcC5oPgorCitzdGF0aWMgaW50IGdsb2JhbCA9IDA7
CisKK3N0YXRpYyB2b2lkIHRyaXZpYWxfZm4odm9pZCAqcCkKK3sKKwlzdHJ1Y3QgY29yb3V0aW5l
X3N0YXRlICpyZXQgPSAoc3RydWN0IGNvcm91dGluZV9zdGF0ZSAqKXA7CisKKwlnbG9iYWwgPSAx
OworCisJY29yb3V0aW5lX2p1bXAocmV0KTsKK30KKworc3RhdGljIHZvaWQgdGVzdF90cml2aWFs
KHN0cnVjdCBjb3JvdXRpbmVfc3RhY2sgKnN0YWNrKQoreworCXN0cnVjdCBjb3JvdXRpbmVfc3Rh
dGUgdCwgbWFzdGVyOworCisJaWYgKCFDT1JPVVRJTkVfQVZBSUxBQkxFKSB7CisJCXNraXAoMSwg
IkNvcm91dGluZXMgbm90IGF2YWlsYWJsZSIpOworCQlyZXR1cm47CisJfQorCisJY29yb3V0aW5l
X2luaXQoJnQsIHRyaXZpYWxfZm4sICZtYXN0ZXIsIHN0YWNrKTsKKwljb3JvdXRpbmVfc3dpdGNo
KCZtYXN0ZXIsICZ0KTsKKworCW9rMShnbG9iYWwgPT0gMSk7Cit9CisKKworaW50IG1haW4odm9p
ZCkKK3sKKwljaGFyIGJ1ZltDT1JPVVRJTkVfTUlOX1NUS1NaICsgQ09ST1VUSU5FX1NUS19PVkVS
SEVBRF07CisJc3RydWN0IGNvcm91dGluZV9zdGFjayAqc3RhY2s7CisKKwkvKiBUaGlzIGlzIGhv
dyBtYW55IHRlc3RzIHlvdSBwbGFuIHRvIHJ1biAqLworCXBsYW5fdGVzdHMoNCk7CisKKwlzdGFj
ayA9IGNvcm91dGluZV9zdGFja19pbml0KGJ1Ziwgc2l6ZW9mKGJ1ZiksIDApOworCW9rMShzdGFj
ayAhPSBOVUxMKTsKKwlvazEoY29yb3V0aW5lX3N0YWNrX3ZhbGlkKHN0YWNrKSk7CisJb2sxKGNv
cm91dGluZV9zdGFja19zaXplKHN0YWNrKSA9PSBDT1JPVVRJTkVfTUlOX1NUS1NaKTsKKworCXRl
c3RfdHJpdmlhbChzdGFjayk7CisKKwljb3JvdXRpbmVfc3RhY2tfcmVsZWFzZShzdGFjayk7CisK
KwkvKiBUaGlzIGV4aXRzIGRlcGVuZGluZyBvbiB3aGV0aGVyIGFsbCB0ZXN0cyBwYXNzZWQgKi8K
KwlyZXR1cm4gZXhpdF9zdGF0dXMoKTsKK30KZGlmZiAtLWdpdCBhL2NjYW4vY29yb3V0aW5lL3Rl
c3QvYXBpLTIuYyBiL2NjYW4vY29yb3V0aW5lL3Rlc3QvYXBpLTIuYwpuZXcgZmlsZSBtb2RlIDEw
MDY0NAppbmRleCAwMDAwMDAwLi5lYzEwMGFjCi0tLSAvZGV2L251bGwKKysrIGIvY2Nhbi9jb3Jv
dXRpbmUvdGVzdC9hcGktMi5jCkBAIC0wLDAgKzEsMTEwIEBACisjaW5jbHVkZSA8c3RkbGliLmg+
CisKKyNpbmNsdWRlIDxjY2FuL2Nvcm91dGluZS9jb3JvdXRpbmUuaD4KKyNpbmNsdWRlIDxjY2Fu
L3RhcC90YXAuaD4KKworc3RydWN0IHN0YXRlIHsKKwlzdHJ1Y3QgY29yb3V0aW5lX3N0YXRlIGMx
LCBjMjsKKwlzdHJ1Y3QgY29yb3V0aW5lX3N0YXRlIG1hc3RlcjsKKwlpbnQgdmFsOworfTsKKwor
c3RhdGljIHZvaWQgZjEodm9pZCAqcCkKK3sKKwlzdHJ1Y3Qgc3RhdGUgKnN0YXRlID0gKHN0cnVj
dCBzdGF0ZSAqKXA7CisKKwljb3JvdXRpbmVfc3dpdGNoKCZzdGF0ZS0+YzEsICZzdGF0ZS0+YzIp
OworCisJb2soc3RhdGUtPnZhbCA9PSAxNywgInN0YXRlLT52YWwgPT0gJWQgW2V4cGVjdGVkIDE3
XSIsIHN0YXRlLT52YWwpOworCXN0YXRlLT52YWwgPSAyMzsKKworCWNvcm91dGluZV9zd2l0Y2go
JnN0YXRlLT5jMSwgJnN0YXRlLT5jMik7CisKKwlvayhzdGF0ZS0+dmFsID09IDI0LCAic3RhdGUt
PnZhbCA9PSAlZCBbZXhwZWN0ZWQgMjRdIiwgc3RhdGUtPnZhbCk7CisKKwljb3JvdXRpbmVfc3dp
dGNoKCZzdGF0ZS0+YzEsICZzdGF0ZS0+YzIpOworCisJb2soc3RhdGUtPnZhbCA9PSAyNiwgInN0
YXRlLT52YWwgPT0gJWQgW2V4cGVjdGVkIDI2XSIsIHN0YXRlLT52YWwpOworCisJY29yb3V0aW5l
X3N3aXRjaCgmc3RhdGUtPmMxLCAmc3RhdGUtPmMyKTsKKworCW9rKHN0YXRlLT52YWwgPT0gMjks
ICJzdGF0ZS0+dmFsID09ICVkIFtleHBlY3RlZCAyOV0iLCBzdGF0ZS0+dmFsKTsKKworCWNvcm91
dGluZV9zd2l0Y2goJnN0YXRlLT5jMSwgJnN0YXRlLT5jMik7Cit9CisKK3N0YXRpYyB2b2lkIGYy
KHZvaWQgKnApCit7CisJc3RydWN0IHN0YXRlICpzdGF0ZSA9IChzdHJ1Y3Qgc3RhdGUgKilwOwor
CisJc3RhdGUtPnZhbCA9IDE3OworCisJY29yb3V0aW5lX3N3aXRjaCgmc3RhdGUtPmMyLCAmc3Rh
dGUtPmMxKTsKKworCW9rKHN0YXRlLT52YWwgPT0gMjMsICJzdGF0ZS0+dmFsID09ICVkIFtleHBl
Y3RlZCAyM10iLCBzdGF0ZS0+dmFsKTsKKwlzdGF0ZS0+dmFsICs9IDE7CisKKwljb3JvdXRpbmVf
c3dpdGNoKCZzdGF0ZS0+YzIsICZzdGF0ZS0+YzEpOworCisJc3RhdGUtPnZhbCArPSAyOworCisJ
Y29yb3V0aW5lX3N3aXRjaCgmc3RhdGUtPmMyLCAmc3RhdGUtPmMxKTsKKworCXN0YXRlLT52YWwg
Kz0gMzsKKworCWNvcm91dGluZV9zd2l0Y2goJnN0YXRlLT5jMiwgJnN0YXRlLT5jMSk7CisKKwlj
b3JvdXRpbmVfanVtcCgmc3RhdGUtPm1hc3Rlcik7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3QxKHNp
emVfdCBidWZzeikKK3sKKwl2b2lkICpidWYxLCAqYnVmMjsKKwlzdHJ1Y3QgY29yb3V0aW5lX3N0
YWNrICpzdGFjazEsICpzdGFjazI7CisKKwlidWYxID0gbWFsbG9jKGJ1ZnN6KTsKKwlvazEoYnVm
MSAhPSBOVUxMKTsKKwlzdGFjazEgPSBjb3JvdXRpbmVfc3RhY2tfaW5pdChidWYxLCBidWZzeiwg
MCk7CisJZGlhZygiYnVmMT0lcCBzdGFjazE9JXAgYnVmc3o9MHglenggb3ZlcmhlYWQ9MHglenhc
biIsCisJICAgICBidWYxLCBzdGFjazEsIGJ1ZnN6LCBDT1JPVVRJTkVfU1RLX09WRVJIRUFEKTsK
KwlvazEoY29yb3V0aW5lX3N0YWNrX3ZhbGlkKHN0YWNrMSkpOworCW9rMShjb3JvdXRpbmVfc3Rh
Y2tfc2l6ZShzdGFjazEpID09IGJ1ZnN6IC0gQ09ST1VUSU5FX1NUS19PVkVSSEVBRCk7CisKKwli
dWYyID0gbWFsbG9jKGJ1ZnN6KTsKKwlvazEoYnVmMiAhPSBOVUxMKTsKKwlzdGFjazIgPSBjb3Jv
dXRpbmVfc3RhY2tfaW5pdChidWYyLCBidWZzeiwgMCk7CisJb2sxKGNvcm91dGluZV9zdGFja192
YWxpZChzdGFjazIpKTsKKwlvazEoY29yb3V0aW5lX3N0YWNrX3NpemUoc3RhY2syKSA9PSBidWZz
eiAtIENPUk9VVElORV9TVEtfT1ZFUkhFQUQpOworCisJaWYgKENPUk9VVElORV9BVkFJTEFCTEUp
IHsKKwkJc3RydWN0IHN0YXRlIHM7CisKKwkJY29yb3V0aW5lX2luaXQoJnMuYzEsIGYxLCAmcywg
c3RhY2sxKTsKKwkJY29yb3V0aW5lX2luaXQoJnMuYzIsIGYyLCAmcywgc3RhY2syKTsKKworCQlj
b3JvdXRpbmVfc3dpdGNoKCZzLm1hc3RlciwgJnMuYzEpOworCX0gZWxzZSB7CisJCXNraXAoNSwg
IkNvcm91dGluZXMgbm90IGF2YWlsYWJsZSIpOworCX0KKworCW9rKDEsICJDb21wbGV0ZWQgdGVz
dDEiKTsKKworCWNvcm91dGluZV9zdGFja19yZWxlYXNlKHN0YWNrMSk7CisJb2sxKCFjb3JvdXRp
bmVfc3RhY2tfdmFsaWQoc3RhY2sxKSk7CisJZnJlZShidWYxKTsKKwljb3JvdXRpbmVfc3RhY2tf
cmVsZWFzZShzdGFjazIpOworCW9rMSghY29yb3V0aW5lX3N0YWNrX3ZhbGlkKHN0YWNrMikpOwor
CWZyZWUoYnVmMik7Cit9CisKKworaW50IG1haW4odm9pZCkKK3sKKwkvKiBUaGlzIGlzIGhvdyBt
YW55IHRlc3RzIHlvdSBwbGFuIHRvIHJ1biAqLworCXBsYW5fdGVzdHMoMTQpOworCisJdGVzdDEo
ODE5Mik7CisKKwkvKiBUaGlzIGV4aXRzIGRlcGVuZGluZyBvbiB3aGV0aGVyIGFsbCB0ZXN0cyBw
YXNzZWQgKi8KKwlyZXR1cm4gZXhpdF9zdGF0dXMoKTsKK30KZGlmZiAtLWdpdCBhL2NjYW4vY29y
b3V0aW5lL3Rlc3QvYXBpLTMuYyBiL2NjYW4vY29yb3V0aW5lL3Rlc3QvYXBpLTMuYwpuZXcgZmls
ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWExMGIxCi0tLSAvZGV2L251bGwKKysrIGIv
Y2Nhbi9jb3JvdXRpbmUvdGVzdC9hcGktMy5jCkBAIC0wLDAgKzEsOTAgQEAKKyNpbmNsdWRlIDxz
dGRsaWIuaD4KKworI2luY2x1ZGUgPGNjYW4vY29yb3V0aW5lL2Nvcm91dGluZS5oPgorI2luY2x1
ZGUgPGNjYW4vdGFwL3RhcC5oPgorCisvKiBUZXN0IG1ldGFkYXRhICovCisjZGVmaW5lIE1FVEFf
TUFHSUMgMHg0ZDg2YWE4MmVjMTg5MmY2CisjZGVmaW5lIEJVRlNJWkUgICAgODE5MgorCitzdHJ1
Y3QgbWV0YWRhdGEgeworCXVpbnQ2NF90IG1hZ2ljOworfTsKKworc3RydWN0IHN0YXRlIHsKKwlz
dHJ1Y3QgY29yb3V0aW5lX3N0YXRlIHJldDsKKwl1bnNpZ25lZCBsb25nIHRvdGFsOworfTsKKwor
LyogVG91Y2ggYSBidW5jaCBvZiBzdGFjayAqLworc3RhdGljIHZvaWQgY2xvYmJlcih2b2lkICpw
KQoreworCXN0cnVjdCBzdGF0ZSAqcyA9IChzdHJ1Y3Qgc3RhdGUgKilwOworCWNoYXIgYnVmW0JV
RlNJWkUgLSBDT1JPVVRJTkVfTUlOX1NUS1NaXTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkg
PCBzaXplb2YoYnVmKTsgaSsrKSB7CisJCWJ1ZltpXSA9IHJhbmRvbSgpICYgMHhmZjsKKwl9CisK
KwlkaWFnKCJXcm90ZSByYW5kb20gdG8gYnVmZmVyXG4iKTsKKworCXMtPnRvdGFsID0gMDsKKwlm
b3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGJ1Zik7IGkrKykgeworCQlzLT50b3RhbCArPSBidWZbaV07
CisJfQorCisJY29yb3V0aW5lX2p1bXAoJnMtPnJldCk7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3Rf
bWV0YWRhdGEoc3RydWN0IGNvcm91dGluZV9zdGFjayAqc3RhY2spCit7CisJc3RydWN0IG1ldGFk
YXRhICptZXRhOworCisJbWV0YSA9IGNvcm91dGluZV9zdGFja190b19tZXRhZGF0YShzdGFjaywg
c2l6ZW9mKCptZXRhKSk7CisJb2sxKGNvcm91dGluZV9zdGFja19mcm9tX21ldGFkYXRhKG1ldGEs
IHNpemVvZigqbWV0YSkpID09IHN0YWNrKTsKKworCW1ldGEtPm1hZ2ljID0gTUVUQV9NQUdJQzsK
KwlvazEobWV0YS0+bWFnaWMgPT0gTUVUQV9NQUdJQyk7CisKKwlpZiAoQ09ST1VUSU5FX0FWQUlM
QUJMRSkgeworCQlzdHJ1Y3QgY29yb3V0aW5lX3N0YXRlIHQ7CisJCXN0cnVjdCBzdGF0ZSBzID0g
eworCQl9OworCisJCWNvcm91dGluZV9pbml0KCZ0LCBjbG9iYmVyLCAmcywgc3RhY2spOworCQlj
b3JvdXRpbmVfc3dpdGNoKCZzLnJldCwgJnQpOworCQlvazEocy50b3RhbCAhPSAwKTsKKwl9IGVs
c2UgeworCQlza2lwKDEsICJDb3JvdXRpbmVzIG5vdCBhdmFpbGFibGUiKTsKKwl9CisKKwlvazEo
Y29yb3V0aW5lX3N0YWNrX3RvX21ldGFkYXRhKHN0YWNrLCBzaXplb2YoKm1ldGEpKSA9PSBtZXRh
KTsKKwlvazEoY29yb3V0aW5lX3N0YWNrX2Zyb21fbWV0YWRhdGEobWV0YSwgc2l6ZW9mKCptZXRh
KSkgPT0gc3RhY2spOworCW9rMShtZXRhLT5tYWdpYyA9PSBNRVRBX01BR0lDKTsKK30KKworaW50
IG1haW4odm9pZCkKK3sKKwljaGFyIGJ1ZltCVUZTSVpFXTsKKwlzdHJ1Y3QgY29yb3V0aW5lX3N0
YWNrICpzdGFjazsKKworCS8qIFRoaXMgaXMgaG93IG1hbnkgdGVzdHMgeW91IHBsYW4gdG8gcnVu
ICovCisJcGxhbl90ZXN0cyg5KTsKKworCS8qIEZpeCBzZWVkIHNvIHdlIGdldCBjb25zaXN0ZW50
LCB0aG91Z2ggcHNldWRvLXJhbmRvbSByZXN1bHRzICovCQorCXNyYW5kb20oMCk7CisKKwlzdGFj
ayA9IGNvcm91dGluZV9zdGFja19pbml0KGJ1Ziwgc2l6ZW9mKGJ1ZiksIHNpemVvZihzdHJ1Y3Qg
bWV0YWRhdGEpKTsKKwlvazEoc3RhY2sgIT0gTlVMTCk7CisJb2sxKGNvcm91dGluZV9zdGFja192
YWxpZChzdGFjaykpOworCW9rMShjb3JvdXRpbmVfc3RhY2tfc2l6ZShzdGFjaykKKwkgICAgPT0g
QlVGU0laRSAtIENPUk9VVElORV9TVEtfT1ZFUkhFQUQgLSBzaXplb2Yoc3RydWN0IG1ldGFkYXRh
KSk7CisKKwl0ZXN0X21ldGFkYXRhKHN0YWNrKTsKKworCWNvcm91dGluZV9zdGFja19yZWxlYXNl
KHN0YWNrKTsKKworCS8qIFRoaXMgZXhpdHMgZGVwZW5kaW5nIG9uIHdoZXRoZXIgYWxsIHRlc3Rz
IHBhc3NlZCAqLworCXJldHVybiBleGl0X3N0YXR1cygpOworfQotLSAKMi45LjMKCl9fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmNjYW4gbWFpbGluZyBsaXN0
CmNjYW5AbGlzdHMub3psYWJzLm9yZwpodHRwczovL2xpc3RzLm96bGFicy5vcmcvbGlzdGluZm8v
Y2Nhbgo=