Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 16 Sep 2016 18:01:28 +0000
From:      "sbruno (Sean Bruno)" <phabric-noreply@FreeBSD.org>
To:        freebsd-mips@freebsd.org
Subject:   [Differential] D2535: New, experimental PMAP implementation for MIPS64
Message-ID:  <8a01977bc2405e827dd78c8dca1d7216@localhost.localdomain>
In-Reply-To: <differential-rev-PHID-DREV-5xurf3bsmfb7qsmjczka-req@FreeBSD.org>
References:  <differential-rev-PHID-DREV-5xurf3bsmfb7qsmjczka-req@FreeBSD.org>

next in thread | previous in thread | raw e-mail | index | archive | help

--b1_8a01977bc2405e827dd78c8dca1d7216
Content-Type: text/plain; charset = "utf-8"
Content-Transfer-Encoding: base64

c2JydW5vIHVwZGF0ZWQgdGhpcyByZXZpc2lvbiB0byBEaWZmIDIwMzg3LgpzYnJ1bm8gYWRkZWQg
YSBjb21tZW50LgoKCiAgVXBkYXRlIHJldmlldyB0byBoZWFkLgogIAogIEJ1aWxkIG9mIGxpYmt2
bSBmYWlscyBob3dldmVyIGFzIHB0ZS5oIGNoYW5nZXMgYXJlIGNhdXNpbmcgYXNzZXJ0cyB0bwog
IGZpcmUuICBJIHN1c3BlY3QgdGhhdCBhIHNpbXBsZSBjaGFuZ2UgaXMgcmVxdWlyZWQuCgpSRVBP
U0lUT1JZCiAgclMgRnJlZUJTRCBzcmMgcmVwb3NpdG9yeQoKQ0hBTkdFUyBTSU5DRSBMQVNUIFVQ
REFURQogIGh0dHBzOi8vcmV2aWV3cy5mcmVlYnNkLm9yZy9EMjUzNT92cz01MzYwJmlkPTIwMzg3
CgpSRVZJU0lPTiBERVRBSUwKICBodHRwczovL3Jldmlld3MuZnJlZWJzZC5vcmcvRDI1MzUKCkFG
RkVDVEVEIEZJTEVTCiAgc3lzL2NvbmYvZmlsZXMubWlwcwogIHN5cy9jb25mL29wdGlvbnMubWlw
cwogIHN5cy9taXBzL2luY2x1ZGUvcGFyYW0uaAogIHN5cy9taXBzL2luY2x1ZGUvcG1hcC5oCiAg
c3lzL21pcHMvaW5jbHVkZS9wdGUuaAogIHN5cy9taXBzL2luY2x1ZGUvdm1wYXJhbS5oCiAgc3lz
L21pcHMvbWlwcy9jcHUuYwogIHN5cy9taXBzL21pcHMvZXhjZXB0aW9uLlMKICBzeXMvbWlwcy9t
aXBzL2dlbmFzc3ltLmMKICBzeXMvbWlwcy9taXBzL21hY2hkZXAuYwogIHN5cy9taXBzL21pcHMv
bWluaWR1bXBfbWFjaGRlcC5jCiAgc3lzL21pcHMvbWlwcy9wbWFwLmMKICBzeXMvbWlwcy9taXBz
L3BtYXBfbWlwczY0LmMKICBzeXMvbWlwcy9taXBzL3N3dGNoLlMKICBzeXMvbWlwcy9taXBzL3Rs
Yi5jCiAgc3lzL21pcHMvbWlwcy90cmFwLmMKICBzeXMvbWlwcy9taXBzL3VtYV9tYWNoZGVwLmMK
ICBzeXMvbWlwcy9taXBzL3ZtX21hY2hkZXAuYwogIHN5cy92bS92bV9nbHVlLmMKCkVNQUlMIFBS
RUZFUkVOQ0VTCiAgaHR0cHM6Ly9yZXZpZXdzLmZyZWVic2Qub3JnL3NldHRpbmdzL3BhbmVsL2Vt
YWlscHJlZmVyZW5jZXMvCgpUbzogc2JydW5vLCBzc29uCkNjOiBzYnJ1bm8sIHJ3YXRzb24sIGVt
YXN0ZSwgaW1wLCBmcmVlYnNkLW1pcHMtbGlzdCwgZG5lbHNvbl8xOTAxX3lhaG9vLmNvbSwgbWl6
aGthX2dtYWlsLmNvbQo=

--b1_8a01977bc2405e827dd78c8dca1d7216
Content-Type: text/x-patch; charset=utf-8; name="D2535.20387.patch"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="D2535.20387.patch"

ZGlmZiAtLWdpdCBhL3N5cy92bS92bV9nbHVlLmMgYi9zeXMvdm0vdm1fZ2x1ZS5jCi0tLSBhL3N5
cy92bS92bV9nbHVlLmMKKysrIGIvc3lzL3ZtL3ZtX2dsdWUuYwpAQCAtMzEyLDYgKzMxMiwxNjEg
QEAKICNkZWZpbmUgS1NUQUNLX01BWF9QQUdFUyAzMgogI2VuZGlmCiAKKyNpZiBkZWZpbmVkKF9f
bWlwc19fKQorCitzdGF0aWMgdm1fb2Zmc2V0X3QKK3ZtX2tzdGFja192YWxsb2MoaW50IHBhZ2Vz
KQoreworCXZtX29mZnNldF90IGtzOworCisJLyoKKwkgKiBXZSBuZWVkIHRvIGFsaWduIHRoZSBr
c3RhY2sncyBtYXBwZWQgYWRkcmVzcyB0byBmaXQgd2l0aGluCisJICogYSBzaW5nbGUgVExCIGVu
dHJ5LgorCSAqLworCWlmICh2bWVtX3hhbGxvYyhrZXJuZWxfYXJlbmEsCisJICAgIChwYWdlcyAr
IEtTVEFDS19HVUFSRF9QQUdFUykgKiBQQUdFX1NJWkUsCisJICAgIEtTVEFDS19QQUdFX1NJWkUg
KiAyLCAwLCAwLCBWTUVNX0FERFJfTUlOLCBWTUVNX0FERFJfTUFYLAorCSAgICBNX0JFU1RGSVQg
fCBNX05PV0FJVCwgJmtzKSkgeworCQlyZXR1cm4gKDApOworCX0KKworCXJldHVybiAoa3MpOwor
fQorCisjaWZkZWYgS1NUQUNLX0xBUkdFX1BBR0UKKworI2RlZmluZQlLU1RBQ0tfT0JKVAkJT0JK
VF9QSFlTCisKK3N0YXRpYyBpbnQKK3ZtX2tzdGFja19wYWxsb2Modm1fb2JqZWN0X3Qga3NvYmos
IHZtX29mZnNldF90IGtzLCBpbnQgYWxsb2NmbGFncywgaW50IHBhZ2VzLAorICAgIHZtX3BhZ2Vf
dCBtYVtdKQoreworCXZtX3BhZ2VfdCBtLCBlbmRfbTsKKwlpbnQgaTsKKworCUtBU1NFUlQoKGtz
b2JqICE9IE5VTEwpLCAoInZtX2tzdGFja19wYWxsb2M6IGludmFsaWQgVk0gb2JqZWN0IikpOwor
CVZNX09CSkVDVF9BU1NFUlRfV0xPQ0tFRChrc29iaik7CisKKwlhbGxvY2ZsYWdzID0gKGFsbG9j
ZmxhZ3MgJiB+Vk1fQUxMT0NfQ0xBU1NfTUFTSykgfCBWTV9BTExPQ19OT1JNQUw7CisKKwlmb3Ig
KGkgPSAwOyBpIDwgcGFnZXM7IGkrKykgeworcmV0cnlsb29rdXA6CisJCWlmICgobSA9IHZtX3Bh
Z2VfbG9va3VwKGtzb2JqLCBpKSkgPT0gTlVMTCkKKwkJCWJyZWFrOworCQlpZiAodm1fcGFnZV9i
dXNpZWQobSkpIHsKKwkJCS8qCisJCQkgKiBSZWZlcmVuY2UgdGhlIHBhZ2UgYmVmb3JlIHVubG9j
a2luZyBhbmQKKwkJCSAqIHNsZWVwaW5nIHNvIHRoYXQgdGhlIHBhZ2UgZGFlbW9uIGlzIGxlc3MK
KwkJCSAqIGxpa2VseSB0byByZWNsYWltIGl0LgorCQkJICovCisJCQl2bV9wYWdlX2FmbGFnX3Nl
dChtLCBQR0FfUkVGRVJFTkNFRCk7CisJCQl2bV9wYWdlX2xvY2sobSk7CisJCQlWTV9PQkpFQ1Rf
V1VOTE9DSyhrc29iaik7CisJCQl2bV9wYWdlX2J1c3lfc2xlZXAobSwgInBncmJ3dCIpOworCQkJ
Vk1fT0JKRUNUX1dMT0NLKGtzb2JqKTsKKwkJCWdvdG8gcmV0cnlsb29rdXA7CisJCX0gZWxzZSB7
CisJCQlpZiAoKGFsbG9jZmxhZ3MgJiBWTV9BTExPQ19XSVJFRCkgIT0gMCkgeworCQkJCXZtX3Bh
Z2VfbG9jayhtKTsKKwkJCQl2bV9wYWdlX3dpcmUobSk7CisJCQkJdm1fcGFnZV91bmxvY2sobSk7
CisJCQl9CisJCQltYVtpXSA9IG07CisJCX0KKwl9CisJaWYgKGkgPT0gcGFnZXMpCisJCXJldHVy
biAoaSk7CisKKwlLQVNTRVJUKChpID09IDApLCAoInZtX2tzdGFja19wYWxsb2M6IGtzb2JqIGFs
cmVhZHkgaGFzIGtzdGFjayBwYWdlcyIpKTsKKworCWZvciAoOzspIHsKKwkJbSA9IHZtX3BhZ2Vf
YWxsb2NfY29udGlnKGtzb2JqLCAwLCBhbGxvY2ZsYWdzLAorCQkgICAgYXRvcChLU1RBQ0tfUEFH
RV9TSVpFKSwgMHVsLCB+MHVsLCBLU1RBQ0tfUEFHRV9TSVpFICogMiwgMCwKKwkJICAgIFZNX01F
TUFUVFJfREVGQVVMVCk7CisJCWlmIChtICE9IE5VTEwpCisJCQlicmVhazsKKwkJVk1fT0JKRUNU
X1dVTkxPQ0soa3NvYmopOworCQlWTV9XQUlUOworCQlWTV9PQkpFQ1RfV0xPQ0soa3NvYmopOwor
CX0KKwllbmRfbSA9IG0gKyBhdG9wKEtTVEFDS19QQUdFX1NJWkUpOworCWZvciAoaSA9IDA7IG0g
PCBlbmRfbTsgbSsrKSB7CisJCW0tPnBpbmRleCA9ICh2bV9waW5kZXhfdClpOworCQlpZiAoKGFs
bG9jZmxhZ3MgJiBWTV9BTExPQ19OT0JVU1kpICE9IDApCisJCQltLT52YWxpZCA9IFZNX1BBR0Vf
QklUU19BTEw7CisJCW1hW2ldID0gbTsKKwkJaSsrOworCX0KKwlyZXR1cm4gKGkpOworfQorCisj
ZWxzZSAvKiAhIEtTVEFDS19MQVJHRV9QQUdFICovCisKKyNkZWZpbmUJS1NUQUNLX09CSlQJCU9C
SlRfREVGQVVMVAorCitzdGF0aWMgaW50Cit2bV9rc3RhY2tfcGFsbG9jKHZtX29iamVjdF90IGtz
b2JqLCB2bV9vZmZzZXRfdCBrcywgaW50IGFsbG9jZmxhZ3MsIGludCBwYWdlcywKKyAgICB2bV9w
YWdlX3QgbWFbXSkKK3sKKwlpbnQgaTsKKworCUtBU1NFUlQoKGtzb2JqICE9IE5VTEwpLCAoInZt
X2tzdGFja19wYWxsb2M6IGludmFsaWQgVk0gb2JqZWN0IikpOworCVZNX09CSkVDVF9BU1NFUlRf
V0xPQ0tFRChrc29iaik7CisKKwlhbGxvY2ZsYWdzID0gKGFsbG9jZmxhZ3MgJiB+Vk1fQUxMT0Nf
Q0xBU1NfTUFTSykgfCBWTV9BTExPQ19OT1JNQUw7CisKKwlmb3IgKGkgPSAwOyBpIDwgcGFnZXM7
IGkrKykgeworCQkvKgorCQkgKiBHZXQgYSBrZXJuZWwgc3RhY2sgcGFnZS4KKwkJICovCisJCW1h
W2ldID0gdm1fcGFnZV9ncmFiKGtzb2JqLCBpLCBhbGxvY2ZsYWdzKTsKKwkJaWYgKGFsbG9jZmxh
Z3MgJiBWTV9BTExPQ19OT0JVU1kpCisJCQltYVtpXS0+dmFsaWQgPSBWTV9QQUdFX0JJVFNfQUxM
OworCX0KKworCXJldHVybiAoaSk7Cit9CisjZW5kaWYgLyogISBLU1RBQ0tfTEFSR0VfUEFHRSAq
LworCisjZWxzZSAvKiAhIF9fbWlwc19fICovCisKKyNkZWZpbmUJS1NUQUNLX09CSlQJCU9CSlRf
REVGQVVMVAorCitzdGF0aWMgdm1fb2Zmc2V0X3QKK3ZtX2tzdGFja192YWxsb2MoaW50IHBhZ2Vz
KQoreworCXZtX29mZnNldF90IGtzOworCisJa3MgPSBrdmFfYWxsb2MoKHBhZ2VzICsgS1NUQUNL
X0dVQVJEX1BBR0VTKSAqIFBBR0VfU0laRSk7CisKKwlyZXR1cm4oa3MpOworfQorCitzdGF0aWMg
aW50Cit2bV9rc3RhY2tfcGFsbG9jKHZtX29iamVjdF90IGtzb2JqLCB2bV9vZmZzZXRfdCBrcywg
aW50IGFsbG9jZmxhZ3MsIGludCBwYWdlcywKKyAgICB2bV9wYWdlX3QgbWFbXSkKK3sKKwlpbnQg
aTsKKworCUtBU1NFUlQoKGtzb2JqICE9IE5VTEwpLCAoInZtX2tzdGFja19wYWxsb2M6IGludmFs
aWQgVk0gb2JqZWN0IikpOworCVZNX09CSkVDVF9BU1NFUlRfV0xPQ0tFRChrc29iaik7CisKKwlh
bGxvY2ZsYWdzID0gKGFsbG9jZmxhZ3MgJiB+Vk1fQUxMT0NfQ0xBU1NfTUFTSykgfCBWTV9BTExP
Q19OT1JNQUw7CisKKwlmb3IgKGkgPSAwOyBpIDwgcGFnZXM7IGkrKykgeworCQkvKgorCQkgKiBH
ZXQgYSBrZXJuZWwgc3RhY2sgcGFnZS4KKwkJICovCisJCW1hW2ldID0gdm1fcGFnZV9ncmFiKGtz
b2JqLCBpLCBhbGxvY2ZsYWdzKTsKKwkJaWYgKGFsbG9jZmxhZ3MgJiBWTV9BTExPQ19OT0JVU1kp
CisJCQltYVtpXS0+dmFsaWQgPSBWTV9QQUdFX0JJVFNfQUxMOworCX0KKworCXJldHVybiAoaSk7
Cit9CisjZW5kaWYgLyogISBfX21pcHNfXyAqLworCisKIC8qCiAgKiBDcmVhdGUgdGhlIGtlcm5l
bCBzdGFjayAoaW5jbHVkaW5nIHBjYiBmb3IgaTM4NikgZm9yIGEgbmV3IHRocmVhZC4KICAqIFRo
aXMgcm91dGluZSBkaXJlY3RseSBhZmZlY3RzIHRoZSBmb3JrIHBlcmYgZm9yIGEgcHJvY2VzcyBh
bmQKQEAgLTMyMiw5ICs0NzcsOCBAQAogewogCXZtX29iamVjdF90IGtzb2JqOwogCXZtX29mZnNl
dF90IGtzOwotCXZtX3BhZ2VfdCBtLCBtYVtLU1RBQ0tfTUFYX1BBR0VTXTsKKwl2bV9wYWdlX3Qg
bWFbS1NUQUNLX01BWF9QQUdFU107CiAJc3RydWN0IGtzdGFja19jYWNoZV9lbnRyeSAqa3NfY2U7
Ci0JaW50IGk7CiAKIAkvKiBCb3VuZHMgY2hlY2sgKi8KIAlpZiAocGFnZXMgPD0gMSkKQEAgLTM1
MCwyNCArNTA0LDEyIEBACiAJLyoKIAkgKiBBbGxvY2F0ZSBhbiBvYmplY3QgZm9yIHRoZSBrc3Rh
Y2suCiAJICovCi0Ja3NvYmogPSB2bV9vYmplY3RfYWxsb2NhdGUoT0JKVF9ERUZBVUxULCBwYWdl
cyk7Ci0JCisJa3NvYmogPSB2bV9vYmplY3RfYWxsb2NhdGUoS1NUQUNLX09CSlQsIHBhZ2VzKTsK
KwogCS8qCiAJICogR2V0IGEga2VybmVsIHZpcnR1YWwgYWRkcmVzcyBmb3IgdGhpcyB0aHJlYWQn
cyBrc3RhY2suCiAJICovCi0jaWYgZGVmaW5lZChfX21pcHNfXykKLQkvKgotCSAqIFdlIG5lZWQg
dG8gYWxpZ24gdGhlIGtzdGFjaydzIG1hcHBlZCBhZGRyZXNzIHRvIGZpdCB3aXRoaW4KLQkgKiBh
IHNpbmdsZSBUTEIgZW50cnkuCi0JICovCi0JaWYgKHZtZW1feGFsbG9jKGtlcm5lbF9hcmVuYSwg
KHBhZ2VzICsgS1NUQUNLX0dVQVJEX1BBR0VTKSAqIFBBR0VfU0laRSwKLQkgICAgUEFHRV9TSVpF
ICogMiwgMCwgMCwgVk1FTV9BRERSX01JTiwgVk1FTV9BRERSX01BWCwKLQkgICAgTV9CRVNURklU
IHwgTV9OT1dBSVQsICZrcykpIHsKLQkJa3MgPSAwOwotCX0KLSNlbHNlCi0Ja3MgPSBrdmFfYWxs
b2MoKHBhZ2VzICsgS1NUQUNLX0dVQVJEX1BBR0VTKSAqIFBBR0VfU0laRSk7Ci0jZW5kaWYKKwlr
cyA9IHZtX2tzdGFja192YWxsb2MocGFnZXMpOwogCWlmIChrcyA9PSAwKSB7CiAJCXByaW50Zigi
dm1fdGhyZWFkX25ldzoga3N0YWNrIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKIAkJdm1fb2JqZWN0
X2RlYWxsb2NhdGUoa3NvYmopOwpAQCAtMzg2LDIxICs1MjgsMTUgQEAKIAkgKiB3YW50IHRvIGRl
YWxsb2NhdGUgdGhlbS4KIAkgKi8KIAl0ZC0+dGRfa3N0YWNrX3BhZ2VzID0gcGFnZXM7Ci0JLyog
Ci0JICogRm9yIHRoZSBsZW5ndGggb2YgdGhlIHN0YWNrLCBsaW5rIGluIGEgcmVhbCBwYWdlIG9m
IHJhbSBmb3IgZWFjaAotCSAqIHBhZ2Ugb2Ygc3RhY2suCi0JICovCisKIAlWTV9PQkpFQ1RfV0xP
Q0soa3NvYmopOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlczsgaSsrKSB7Ci0JCS8qCi0JCSAqIEdl
dCBhIGtlcm5lbCBzdGFjayBwYWdlLgotCQkgKi8KLQkJbSA9IHZtX3BhZ2VfZ3JhYihrc29iaiwg
aSwgVk1fQUxMT0NfTk9CVVNZIHwKLQkJICAgIFZNX0FMTE9DX05PUk1BTCB8IFZNX0FMTE9DX1dJ
UkVEKTsKLQkJbWFbaV0gPSBtOwotCQltLT52YWxpZCA9IFZNX1BBR0VfQklUU19BTEw7Ci0JfQor
CXBhZ2VzID0gdm1fa3N0YWNrX3BhbGxvYyhrc29iaiwga3MsIChWTV9BTExPQ19OT0JVU1kgfCBW
TV9BTExPQ19XSVJFRCksCisJICAgIHBhZ2VzLCBtYSk7CiAJVk1fT0JKRUNUX1dVTkxPQ0soa3Nv
YmopOworCWlmIChwYWdlcyA9PSAwKSB7CisJCXByaW50Zigidm1fdGhyZWFkX25ldzogdm1fa3N0
YWNrX3BhbGxvYygpIGZhaWxlZFxuIik7CisJCXJldHVybiAoMCk7CisJfQogCXBtYXBfcWVudGVy
KGtzLCBtYSwgcGFnZXMpOwogCXJldHVybiAoMSk7CiB9CkBAIC01NzMsOSArNzA5LDkgQEAKIAlw
YWdlcyA9IHRkLT50ZF9rc3RhY2tfcGFnZXM7CiAJa3NvYmogPSB0ZC0+dGRfa3N0YWNrX29iajsK
IAlWTV9PQkpFQ1RfV0xPQ0soa3NvYmopOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGFnZXM7IGkr
KykKLQkJbWFbaV0gPSB2bV9wYWdlX2dyYWIoa3NvYmosIGksIFZNX0FMTE9DX05PUk1BTCB8Ci0J
CSAgICBWTV9BTExPQ19XSVJFRCk7CisJcnYgPSB2bV9rc3RhY2tfcGFsbG9jKGtzb2JqLCB0ZC0+
dGRfa3N0YWNrLCAoVk1fQUxMT0NfTk9STUFMIHwKKwkgICAgVk1fQUxMT0NfV0lSRUQpLCBwYWdl
cywgbWEpOworCUtBU1NFUlQocnYgIT0gMCwgKCJ2bV90aHJlYWRfc3dhcGluOiB2bV9rc3RhY2tf
cGFsbG9jKCkgZmFpbGVkIikpOwogCWZvciAoaW50IGkgPSAwOyBpIDwgcGFnZXM7KSB7CiAJCWlu
dCBqLCBhLCBjb3VudCwgcnY7CiAKZGlmZiAtLWdpdCBhL3N5cy9taXBzL21pcHMvdm1fbWFjaGRl
cC5jIGIvc3lzL21pcHMvbWlwcy92bV9tYWNoZGVwLmMKLS0tIGEvc3lzL21pcHMvbWlwcy92bV9t
YWNoZGVwLmMKKysrIGIvc3lzL21pcHMvbWlwcy92bV9tYWNoZGVwLmMKQEAgLTI1MSwxOCArMjUx
LDI4IEBACiBjcHVfdGhyZWFkX3N3YXBpbihzdHJ1Y3QgdGhyZWFkICp0ZCkKIHsKIAlwdF9lbnRy
eV90ICpwdGU7Ci0JaW50IGk7CiAKIAkvKgogCSAqIFRoZSBrc3RhY2sgbWF5IGJlIGF0IGEgZGlm
ZmVyZW50IHBoeXNpY2FsIGFkZHJlc3Mgbm93LgogCSAqIENhY2hlIHRoZSBQVEVzIGZvciB0aGUg
S2VybmVsIHN0YWNrIGluIHRoZSBtYWNoaW5lIGRlcGVuZGVudAogCSAqIHBhcnQgb2YgdGhlIHRo
cmVhZCBzdHJ1Y3Qgc28gY3B1X3N3aXRjaCgpIGNhbiBxdWlja2x5IG1hcCBpbgogCSAqIHRoZSBw
Y2Igc3RydWN0IGFuZCBrZXJuZWwgc3RhY2suCiAJICovCisjaWZkZWYgS1NUQUNLX0xBUkdFX1BB
R0UKKwkvKiBKdXN0IG9uZSBlbnRyeSBmb3Igb25lIGxhcmdlIGtlcm5lbCBwYWdlLiAqLworCXB0
ZSA9IHBtYXBfcHRlKGtlcm5lbF9wbWFwLCB0ZC0+dGRfa3N0YWNrKTsKKwl0ZC0+dGRfbWQubWRf
dXB0ZVswXSA9ICpwdGUgJiB+VExCTE9fU1dCSVRTX01BU0s7CisJdGQtPnRkX21kLm1kX3VwdGVb
MV0gPSAxOworCisjZWxzZQorCisJaW50IGk7CisKIAlmb3IgKGkgPSAwOyBpIDwgS1NUQUNLX1BB
R0VTOyBpKyspIHsKIAkJcHRlID0gcG1hcF9wdGUoa2VybmVsX3BtYXAsIHRkLT50ZF9rc3RhY2sg
KyBpICogUEFHRV9TSVpFKTsKIAkJdGQtPnRkX21kLm1kX3VwdGVbaV0gPSAqcHRlICYgflRMQkxP
X1NXQklUU19NQVNLOwogCX0KKyNlbmRpZiAvKiAhIEtTVEFDS19MQVJHRV9QQUdFICovCiB9CiAK
IHZvaWQKQEAgLTI3NCwxNyArMjg0LDMxIEBACiBjcHVfdGhyZWFkX2FsbG9jKHN0cnVjdCB0aHJl
YWQgKnRkKQogewogCXB0X2VudHJ5X3QgKnB0ZTsKLQlpbnQgaTsKIAotCUtBU1NFUlQoKHRkLT50
ZF9rc3RhY2sgJiAoMSA8PCBQQUdFX1NISUZUKSkgPT0gMCwgKCJrZXJuZWwgc3RhY2sgbXVzdCBi
ZSBhbGlnbmVkLiIpKTsKKwlLQVNTRVJUKCh0ZC0+dGRfa3N0YWNrICYgKChLU1RBQ0tfUEFHRV9T
SVpFICogMikgLSAxKSApID09IDAsCisJICAgICgia2VybmVsIHN0YWNrIG11c3QgYmUgYWxpZ25l
ZC4iKSk7CiAJdGQtPnRkX3BjYiA9IChzdHJ1Y3QgcGNiICopKHRkLT50ZF9rc3RhY2sgKwogCSAg
ICB0ZC0+dGRfa3N0YWNrX3BhZ2VzICogUEFHRV9TSVpFKSAtIDE7CiAJdGQtPnRkX2ZyYW1lID0g
JnRkLT50ZF9wY2ItPnBjYl9yZWdzOwogCi0JZm9yIChpID0gMDsgaSA8IEtTVEFDS19QQUdFUzsg
aSsrKSB7Ci0JCXB0ZSA9IHBtYXBfcHRlKGtlcm5lbF9wbWFwLCB0ZC0+dGRfa3N0YWNrICsgaSAq
IFBBR0VfU0laRSk7Ci0JCXRkLT50ZF9tZC5tZF91cHRlW2ldID0gKnB0ZSAmIH5UTEJMT19TV0JJ
VFNfTUFTSzsKKyNpZmRlZiBLU1RBQ0tfTEFSR0VfUEFHRQorCS8qIEp1c3Qgb25lIGVudHJ5IGZv
ciBvbmUgbGFyZ2Uga2VybmVsIHBhZ2UuICovCisJcHRlID0gcG1hcF9wdGUoa2VybmVsX3BtYXAs
IHRkLT50ZF9rc3RhY2spOworCXRkLT50ZF9tZC5tZF91cHRlWzBdID0gKnB0ZSAmIH5UTEJMT19T
V0JJVFNfTUFTSzsKKwl0ZC0+dGRfbWQubWRfdXB0ZVsxXSA9IDE7CisKKyNlbHNlCisKKwl7CisJ
CWludCBpOworCisJCWZvciAoaSA9IDA7IGkgPCBLU1RBQ0tfUEFHRVM7IGkrKykgeworCQkJcHRl
ID0gcG1hcF9wdGUoa2VybmVsX3BtYXAsIHRkLT50ZF9rc3RhY2sgKyBpICoKKwkJCSAgICBQQUdF
X1NJWkUpOworCQkJdGQtPnRkX21kLm1kX3VwdGVbaV0gPSAqcHRlICYgflRMQkxPX1NXQklUU19N
QVNLOworCQl9CiAJfQorI2VuZGlmIC8qICEgS1NUQUNLX0xBUkdFX1BBR0UgKi8KIH0KIAogdm9p
ZApkaWZmIC0tZ2l0IGEvc3lzL21pcHMvbWlwcy91bWFfbWFjaGRlcC5jIGIvc3lzL21pcHMvbWlw
cy91bWFfbWFjaGRlcC5jCi0tLSBhL3N5cy9taXBzL21pcHMvdW1hX21hY2hkZXAuYworKysgYi9z
eXMvbWlwcy9taXBzL3VtYV9tYWNoZGVwLmMKQEAgLTUyLDcgKzUyLDExIEBACiAJcGZsYWdzID0g
bWFsbG9jMnZtX2ZsYWdzKHdhaXQpIHwgVk1fQUxMT0NfV0lSRUQ7CiAKIAlmb3IgKDs7KSB7Cisj
aWZkZWYgTUlQUzY0X05FV19QTUFQCisJCW0gPSB2bV9wYWdlX2FsbG9jKE5VTEwsIDAsIHBmbGFn
cyB8IFZNX0FMTE9DX05PT0JKKTsKKyNlbHNlIC8qICEgTUlQUzY0X05FV19QTUFQICovCiAJCW0g
PSB2bV9wYWdlX2FsbG9jX2ZyZWVsaXN0KFZNX0ZSRUVMSVNUX0RJUkVDVCwgcGZsYWdzKTsKKyNl
bmRpZiAvKiAhIE1JUFM2NF9ORVdfUE1BUCAqLwogI2lmbmRlZiBfX21pcHNfbjY0CiAJCWlmICht
ID09IE5VTEwgJiYgdm1fcGFnZV9yZWNsYWltX2NvbnRpZyhwZmxhZ3MsIDEsCiAJCSAgICAwLCBN
SVBTX0tTRUcwX0xBUkdFU1RfUEhZUywgUEFHRV9TSVpFLCAwKSkKQEAgLTYyLDEyICs2NiwxOCBA
QAogCQkJaWYgKHdhaXQgJiBNX05PV0FJVCkKIAkJCQlyZXR1cm4gKE5VTEwpOwogCQkJZWxzZQor
I2lmZGVmIE1JUFM2NF9ORVdfUE1BUAogCQkJCVZNX1dBSVQ7CisjZWxzZSAvKiAhIE1JUFM2NF9O
RVdfUE1BUCAqLworCQkJCXBtYXBfZ3Jvd19kaXJlY3RfcGFnZV9jYWNoZSgpOworI2VuZGlmIC8q
ICEgTUlQUzY0X05FV19QTUFQICovCiAJCX0gZWxzZQogCQkJYnJlYWs7CiAJfQogCiAJcGEgPSBW
TV9QQUdFX1RPX1BIWVMobSk7CisJaWYgKCh3YWl0ICYgTV9OT0RVTVApID09IDApCisJCWR1bXBf
YWRkX3BhZ2UocGEpOwogCXZhID0gKHZvaWQgKilNSVBTX1BIWVNfVE9fRElSRUNUKHBhKTsKIAlp
ZiAoKHdhaXQgJiBNX1pFUk8pICYmIChtLT5mbGFncyAmIFBHX1pFUk8pID09IDApCiAJCWJ6ZXJv
KHZhLCBQQUdFX1NJWkUpOwpkaWZmIC0tZ2l0IGEvc3lzL21pcHMvbWlwcy90cmFwLmMgYi9zeXMv
bWlwcy9taXBzL3RyYXAuYwotLS0gYS9zeXMvbWlwcy9taXBzL3RyYXAuYworKysgYi9zeXMvbWlw
cy9taXBzL3RyYXAuYwpAQCAtODEsNiArODEsNyBAQAogI2luY2x1ZGUgPG1hY2hpbmUvbWlwc19v
cGNvZGUuaD4KICNpbmNsdWRlIDxtYWNoaW5lL2ZyYW1lLmg+CiAjaW5jbHVkZSA8bWFjaGluZS9y
ZWdudW0uaD4KKyNpbmNsdWRlIDxtYWNoaW5lL3RsYi5oPgogI2luY2x1ZGUgPG1hY2hpbmUvdGxz
Lmg+CiAKICNpZmRlZiBEREIKQEAgLTI2NCw3ICsyNjUsNyBAQAogCSJyZXNlcnZlZCAyMSIsCiAJ
InJlc2VydmVkIDIyIiwKIAkid2F0Y2giLAotCSJyZXNlcnZlZCAyNCIsCisJIm1hY2hpbmUgY2hl
Y2siLAogCSJyZXNlcnZlZCAyNSIsCiAJInJlc2VydmVkIDI2IiwKIAkicmVzZXJ2ZWQgMjciLApA
QCAtNjMyLDYgKzYzMywzMyBAQAogI2VuZGlmCiAJCXBhbmljKCJNQ0hFQ0tcbiIpOwogCQlicmVh
azsKKwljYXNlIFRfTUNIRUNLICsgVF9VU0VSOgorCQl7CisJCQl1aW50MzJfdCBzdGF0dXMgPSBt
aXBzX3JkX3N0YXR1cygpOworCisJCQlpZiAoc3RhdHVzICYgTUlQU19TUl9UUykgeworCQkJCS8q
CisJCQkJICogTWFjaGluZSBDaGVjayBleGNlcHRpb24gY2F1c2VkIGJ5IFRMQgorCQkJCSAqIGRl
dGVjdGluZyBhIG1hdGNoIGZvciBtdWx0aXBsZSBlbnRyaWVzLgorCQkJCSAqCisJCQkJICogQXR0
ZW1wdCB0byByZWNvdmVyIGJ5IGZsdXNoaW5nIHRoZSB1c2VyIFRMQgorCQkJCSAqIGFuZCByZXNl
dHRpbmcgdGhlIHN0YXR1cyBiaXQuCisJCQkJICovCisJCQkJcHJpbnRmKCJNYWNoaW5lIENoZWNr
IGluIFVzZXIgLSBEdXAgVExCIGVudHJ5LiAiCisJCQkJICAgICJSZWNvdmVyaW5nLi4uXG4iKTsK
KwkJCQlwbWFwID0gJnAtPnBfdm1zcGFjZS0+dm1fcG1hcDsKKwkJCQl0bGJfaW52YWxpZGF0ZV9h
bGxfdXNlcihwbWFwKTsKKwkJCQltaXBzX3dyX3N0YXR1cyhzdGF0dXMgJiB+TUlQU19TUl9UUyk7
CisKKwkJCQlyZXR1cm4gKHRyYXBmcmFtZS0+cGMpOworCQkJfSBlbHNlIHsKKyNpZmRlZiBEREIK
KwkJCQlrZGJfdHJhcCh0eXBlLCAwLCB0cmFwZnJhbWUpOworI2VuZGlmCisJCQkJcGFuaWMoIk1D
SEVDS1xuIik7CisJCQl9CisJCX0KKwkJYnJlYWs7CiAJY2FzZSBUX1RMQl9NT0Q6CiAJCS8qIGNo
ZWNrIGZvciBrZXJuZWwgYWRkcmVzcyAqLwogCQlpZiAoS0VSTkxBTkQodHJhcGZyYW1lLT5iYWR2
YWRkcikpIHsKQEAgLTY5NCwxMCArNzIyLDIzIEBACiAKIAljYXNlIFRfVExCX0xEX01JU1MgKyBU
X1VTRVI6CiAJCWZ0eXBlID0gVk1fUFJPVF9SRUFEOwotCQlnb3RvIGRvZmF1bHQ7CisJCWdvdG8g
Y2hlY2tyZWZiaXQ7CiAKIAljYXNlIFRfVExCX1NUX01JU1MgKyBUX1VTRVI6CiAJCWZ0eXBlID0g
Vk1fUFJPVF9XUklURTsKKworY2hlY2tyZWZiaXQ6CisJCS8qCisJCSAqIFdhcyB0aGlzIHRyYXAg
Y2F1c2VkIGJ5IHRoZSBQVEVfVlIgYml0IG5vdCBiZWluZyBzZXQ/CisJCSAqLworCQlpZiAocG1h
cF9lbXVsYXRlX3JlZmVyZW5jZWQoJnAtPnBfdm1zcGFjZS0+dm1fcG1hcCwKKwkJICAgIHRyYXBm
cmFtZS0+YmFkdmFkZHIpID09IDApIHsKKwkJCWlmICghdXNlcm1vZGUpIHsKKwkJCQlyZXR1cm4g
KHRyYXBmcmFtZS0+cGMpOworCQkJfQorCQkJZ290byBvdXQ7CisJCX0KKwogZG9mYXVsdDoKIAkJ
ewogCQkJdm1fb2Zmc2V0X3QgdmE7CkBAIC0xNDExLDkgKzE0NTIsMTYgQEAKIAlzdHJ1Y3QgcHJv
YyAqcCA9IGN1cnByb2M7CiAKIAlwZGVwID0gKCYocC0+cF92bXNwYWNlLT52bV9wbWFwLnBtX3Nl
Z3RhYlsodmEgPj4gU0VHU0hJRlQpICYgKE5QREVQRyAtIDEpXSkpOwotCWlmICgqcGRlcCkKLQkJ
cHRlcCA9IHBtYXBfcHRlKCZwLT5wX3Ztc3BhY2UtPnZtX3BtYXAsIHZhKTsKLQllbHNlCisJaWYg
KCpwZGVwKSB7CisjaWYgVk1fTlJFU0VSVkxFVkVMID4gMAorCQlwZF9lbnRyeV90ICpwZGUgPSAm
cGRlcFsodmEgPj4gUERSU0hJRlQpICYgKE5QREVQRyAtIDEpXTsKKworCQlpZiAocGRlX2lzX3N1
cGVycGFnZShwZGUpKQorCQkJcHRlcCA9IChwdF9lbnRyeV90ICopcGRlOworCQllbHNlCisjZW5k
aWYgLyogVk1fTlJFU0VSVkxFVkVMID4gMCAqLworCQkJcHRlcCA9IHBtYXBfcHRlKCZwLT5wX3Zt
c3BhY2UtPnZtX3BtYXAsIHZhKTsKKwl9IGVsc2UKIAkJcHRlcCA9IChwdF9lbnRyeV90ICopMDsK
IAogCSpwZGVwcCA9IHBkZXA7CmRpZmYgLS1naXQgYS9zeXMvbWlwcy9taXBzL3RsYi5jIGIvc3lz
L21pcHMvbWlwcy90bGIuYwotLS0gYS9zeXMvbWlwcy9taXBzL3RsYi5jCisrKyBiL3N5cy9taXBz
L21pcHMvdGxiLmMKQEAgLTQwLDEwICs0MCwxNCBAQAogI2luY2x1ZGUgPG1hY2hpbmUvcHRlLmg+
CiAjaW5jbHVkZSA8bWFjaGluZS90bGIuaD4KIAorI2luY2x1ZGUgIm9wdF92bS5oIgorCiAjaWYg
ZGVmaW5lZChDUFVfQ05NSVBTKQogI2RlZmluZQlNSVBTX01BWF9UTEJfRU5UUklFUwkxMjgKICNl
bGlmIGRlZmluZWQoQ1BVX05MTSkKICNkZWZpbmUJTUlQU19NQVhfVExCX0VOVFJJRVMJKDIwNDgg
KyAxMjgpCisjZWxpZiBkZWZpbmVkKENQVV9DSEVSSSkKKyNkZWZpbmUJTUlQU19NQVhfVExCX0VO
VFJJRVMJMTQ0CiAjZWxzZQogI2RlZmluZQlNSVBTX01BWF9UTEJfRU5UUklFUwk2NAogI2VuZGlm
CkBAIC0xMDIsMjAgKzEwNiwzMSBAQAogewogCXJlZ2lzdGVyX3QgYXNpZDsKIAlyZWdpc3Rlcl90
IHM7CisJdWludDMyX3QgcGFnZW1hc2s7CisJdW5zaWduZWQgbG9uZyBtYXNrLCBzaXplOwogCi0J
dmEgJj0gflBBR0VfTUFTSzsKKwlLQVNTRVJUKChUTEJMT19QVEVfVE9fSURYKHB0ZTApID09IFRM
QkxPX1BURV9UT19JRFgocHRlMSkpLAorCSAgICAoIiVzOiBwdGUwIGFuZCBwdGUxIHBhZ2Ugc2l6
ZXMgZG9uJ3QgbWF0Y2giLCBfX2Z1bmNfXykpOworCisJLyogQ29tcHV0ZSB0aGUgcGFnZSBtYXNr
IGFuZCBzaXplLiAqLworCXBhZ2VtYXNrID0gVExCTE9fUFRFX1RPX01BU0socHRlMCk7CisJbWFz
ayA9ICh1bnNpZ25lZCBsb25nKXBhZ2VtYXNrIHwgUEFHRV9NQVNLOyAvKiBPUiBpdCB3aXRoIGxv
d2VyIDEyIGJpdHMgKi8KKwlzaXplID0gbWFzayArIDE7CisKKwl2YSAmPSB+bWFzazsKIAogCXMg
PSBpbnRyX2Rpc2FibGUoKTsKIAlhc2lkID0gbWlwc19yZF9lbnRyeWhpKCkgJiBUTEJISV9BU0lE
X01BU0s7CiAKIAltaXBzX3dyX2luZGV4KGkpOwotCW1pcHNfd3JfcGFnZW1hc2soMCk7CisJbWlw
c193cl9wYWdlbWFzayhwYWdlbWFzayk7CiAJbWlwc193cl9lbnRyeWhpKFRMQkhJX0VOVFJZKHZh
LCAwKSk7CiAJbWlwc193cl9lbnRyeWxvMChwdGUwKTsKIAltaXBzX3dyX2VudHJ5bG8xKHB0ZTEp
OwogCXRsYl93cml0ZV9pbmRleGVkKCk7CiAKIAltaXBzX3dyX2VudHJ5aGkoYXNpZCk7CisJbWlw
c193cl9wYWdlbWFzaygwKTsKIAlpbnRyX3Jlc3RvcmUocyk7CiB9CiAKQEAgLTEzNyw3ICsxNTIs
NiBAQAogCWkgPSBtaXBzX3JkX2luZGV4KCk7CiAJaWYgKGkgPj0gMCkKIAkJdGxiX2ludmFsaWRh
dGVfb25lKGkpOwotCiAJbWlwc193cl9lbnRyeWhpKGFzaWQpOwogCWludHJfcmVzdG9yZShzKTsK
IH0KQEAgLTI5OCwyOSArMzEyLDUzIEBACiAJcmVnaXN0ZXJfdCBhc2lkOwogCXJlZ2lzdGVyX3Qg
czsKIAlpbnQgaTsKKwl1aW50MzJfdCBwYWdlbWFzazsKKwl1bnNpZ25lZCBsb25nIG1hc2ssIHNp
emU7CisJcHRfZW50cnlfdCBwdGUwLCBwdGUxOworCisJLyogQ29tcHV0ZSB0aGUgcGFnZSBtYXNr
IGFuZCBzaXplLiAqLworCXBhZ2VtYXNrID0gVExCTE9fUFRFX1RPX01BU0socHRlKTsKKwltYXNr
ID0gKHVuc2lnbmVkIGxvbmcpcGFnZW1hc2sgfCBQQUdFX01BU0s7IC8qIE9SIGl0IHdpdGggbG93
ZXIgMTIgYml0cyAqLworCXNpemUgPSBtYXNrICsgMTsKIAotCXZhICY9IH5QQUdFX01BU0s7CisJ
dmEgJj0gfm1hc2s7CiAJcHRlICY9IH5UTEJMT19TV0JJVFNfTUFTSzsKIAogCXMgPSBpbnRyX2Rp
c2FibGUoKTsKIAlhc2lkID0gbWlwc19yZF9lbnRyeWhpKCkgJiBUTEJISV9BU0lEX01BU0s7CiAK
LQltaXBzX3dyX3BhZ2VtYXNrKDApOworCW1pcHNfd3JfcGFnZW1hc2socGFnZW1hc2spOwogCW1p
cHNfd3JfZW50cnloaShUTEJISV9FTlRSWSh2YSwgcG1hcF9hc2lkKHBtYXApKSk7CiAJdGxiX3By
b2JlKCk7CiAJaSA9IG1pcHNfcmRfaW5kZXgoKTsKIAlpZiAoaSA+PSAwKSB7CiAJCXRsYl9yZWFk
KCk7CisJCXB0ZTAgPSBtaXBzX3JkX2VudHJ5bG8wKCk7CisJCXB0ZTEgPSBtaXBzX3JkX2VudHJ5
bG8xKCk7CisJCUtBU1NFUlQoKFRMQkxPX1BURV9UT19JRFgocHRlKSA9PSBUTEJMT19QVEVfVE9f
SURYKHB0ZTApICYmCisJCSAgICBUTEJMT19QVEVfVE9fSURYKHB0ZSkgPT0gVExCTE9fUFRFX1RP
X0lEWChwdGUxKSksCisJCQkoIiVzOiBwdGUsIHB0ZTAgYW5kIHB0ZTEgcGFnZSBzaXplcyBkb24n
dCBtYXRjaCIsIF9fZnVuY19fKSk7CiAKLQkJaWYgKCh2YSAmIFBBR0VfU0laRSkgPT0gMCkgewor
CQlpZiAoKHZhICYgc2l6ZSkgPT0gMCkgewogCQkJbWlwc193cl9lbnRyeWxvMChwdGUpOworCQkJ
aWYgKHBhZ2VtYXNrICYgflBBR0VfTUFTSykgeworCQkJCS8qIFN1cGVycGFnZSAqLworCQkJCXB0
ZTEgPSAocHRlMSAmIH4oUFRFX1ZSIHwgUFRFX0QpKSB8IChwdGUgJiAoUFRFX1ZSIHwgUFRFX0Qp
KTsKKwkJCQltaXBzX3dyX2VudHJ5bG8xKHB0ZTEpOworCQkJfQogCQl9IGVsc2UgewogCQkJbWlw
c193cl9lbnRyeWxvMShwdGUpOworCQkJaWYgKHBhZ2VtYXNrICYgflBBR0VfTUFTSykgeworCQkJ
CS8qIFN1cGVycGFnZSAqLworCQkJCXB0ZTAgPSAocHRlMCAmIH4oUFRFX1ZSIHwgUFRFX0QpKSB8
IChwdGUgJiAoUFRFX1ZSIHwgUFRFX0QpKTsKKwkJCQltaXBzX3dyX2VudHJ5bG8wKHB0ZTApOwor
CQkJfQogCQl9CiAJCXRsYl93cml0ZV9pbmRleGVkKCk7CiAJfQogCiAJbWlwc193cl9lbnRyeWhp
KGFzaWQpOworCW1pcHNfd3JfcGFnZW1hc2soMCk7CiAJaW50cl9yZXN0b3JlKHMpOwogfQogCmRp
ZmYgLS1naXQgYS9zeXMvbWlwcy9taXBzL3N3dGNoLlMgYi9zeXMvbWlwcy9taXBzL3N3dGNoLlMK
LS0tIGEvc3lzL21pcHMvbWlwcy9zd3RjaC5TCisrKyBiL3N5cy9taXBzL21pcHMvc3d0Y2guUwpA
QCAtMzE1LDM2ICszMTUsOTEgQEAKICAqIE5PVEU6IFRoaXMgaXMgaGFyZCBjb2RlZCB0byBVUEFH
RVMgPT0gMi4KICAqIEFsc28sIHRoZXJlIHNob3VsZCBiZSBubyBUTEIgZmF1bHRzIGF0IHRoaXMg
cG9pbnQuCiAgKi8KLQlNVEMwCXYwLCBNSVBTX0NPUF8wX1RMQl9ISQkJIyBWUE4gPSB2YQorCU1U
QzAJCXYwLCBNSVBTX0NPUF8wX1RMQl9ISQkjIFZQTiA9IHZhCiAJSEFaQVJEX0RFTEFZCiAJdGxi
cAkJCQkJIyBwcm9iZSBWUE4KIAlIQVpBUkRfREVMQVkKLQltZmMwCXMwLCBNSVBTX0NPUF8wX1RM
Ql9JTkRFWAorCW1mYzAJCXMwLCBNSVBTX0NPUF8wX1RMQl9JTkRFWAogCUhBWkFSRF9ERUxBWQog
Ci0JUFRSX0xJCXQxLCBNSVBTX0tTRUcwX1NUQVJUCQkjIGludmFsaWRhdGUgdGxiIGVudHJ5Ci0J
Ymx0eglzMCwgZW50cnkwc2V0CisJIyBNSVBTX0tTRUcwX1NUQVJUICsgKDIgKiBpbmRleCAqIFBB
R0VfU0laRSkgLT4gTUlQU19DT1BfMF9UTEJfSEkKKwlQVFJfTEkJCXQxLCBNSVBTX0tTRUcwX1NU
QVJUCQkjIGludmFsaWRhdGUgdGxiIGVudHJ5CisjaWZkZWYgS1NUQUNLX0xBUkdFX1BBR0UKKwli
bHR6CQlzMCwgaW52YWxfbnh0MQorI2Vsc2UKKwlibHR6CQlzMCwgZW50cnkwc2V0CisjZW5kaWYK
IAlub3AKLQlzbGwJczAsIFBBR0VfU0hJRlQgKyAxCi0JYWRkdQl0MSwgczAKLQlNVEMwCXQxLCBN
SVBTX0NPUF8wX1RMQl9ISQorCXNsbAkJczAsIFBBR0VfU0hJRlQgKyAxCisJUFRSX0FERFUJdDEs
IHMwCisJTVRDMAkJdDEsIE1JUFNfQ09QXzBfVExCX0hJCiAJUFRFX01UQzAJemVybywgTUlQU19D
T1BfMF9UTEJfTE8wCiAJUFRFX01UQzAJemVybywgTUlQU19DT1BfMF9UTEJfTE8xCisJTVRDMAkJ
emVybywgTUlQU19DT1BfMF9UTEJfUEdfTUFTSwogCUhBWkFSRF9ERUxBWQogCXRsYndpCiAJSEFa
QVJEX0RFTEFZCi0JTVRDMAl2MCwgTUlQU19DT1BfMF9UTEJfSEkJCSMgc2V0IFZQTiBhZ2Fpbgor
CisjaWZkZWYgS1NUQUNLX0xBUkdFX1BBR0UKKy8qCisgKiBXaXRoIGEgS1NUQUNLX1BBR0VfU0la
RSBvZiAxNksgYW5kIFBBR0VfU0laRSBvZiA0SyBpdCBpcyBwb3NzaWJsZSB0aGF0CisgKiBhIHNl
Y29uZCBUTEIgZW50cnkgaXMgY3VycmVudGx5IG1hcHBpbmcgdGhlIGtlcm5lbCB0aHJlYWQgc3Rh
Y2sgYXMgYQorICogcmVndWxhciA0SyBzaXplZCBwYWdlKHMpLiBDaGVjayBmb3IgdGhpcyBjYXNl
IGFuZCwgaWYgc28sIGludmFsaWRhdGUKKyAqIHRoYXQgVExCIGVudHJ5IGFzIHdlbGwuCisgKi8K
KyNpZiAoUEFHRV9TSVpFICE9IDQwOTYpICYmIChLU1RBQ0tfUEFHRV9TSVpFICE9IDE2Mzg0KQor
I2Vycm9yIFBBR0VfU0laRSBpcyBub3QgNEsgb3IgS1NUQUNLX1BBR0VfU0laRSBpcyBub3QgMTZL
LgorI2VuZGlmCitpbnZhbF9ueHQxOgorCW1vdmUJCXYxLCB2MAorCVBUUl9BRERVCXYxLCBQQUdF
X1NJWkUgKiAyCisJTVRDMAkJdjEsIE1JUFNfQ09QXzBfVExCX0hJCQkjIFZQTiA9IHZhCisJSEFa
QVJEX0RFTEFZCisJdGxicAkJCQkJCSMgcHJvYmUgVlBOCisJSEFaQVJEX0RFTEFZCisJbWZjMAkJ
czAsIE1JUFNfQ09QXzBfVExCX0lOREVYCisJSEFaQVJEX0RFTEFZCisKKwkjIE1JUFNfS1NFRzBf
U1RBUlQgKyAoMiAqIGluZGV4ICogUEFHRV9TSVpFKSAtPiBNSVBTX0NPUF8wX1RMQl9ISQorCVBU
Ul9MSQkJdDEsIE1JUFNfS1NFRzBfU1RBUlQJCSMgaW52YWxpZGF0ZSB0bGIgZW50cnkKKwlibHR6
CQlzMCwgZW50cnkwc2V0CisJbm9wCisJc2xsCQlzMCwgUEFHRV9TSElGVCArIDEKKwlQVFJfQURE
VQl0MSwgczAKKwlNVEMwCQl0MSwgTUlQU19DT1BfMF9UTEJfSEkKKwlQVEVfTVRDMAl6ZXJvLCBN
SVBTX0NPUF8wX1RMQl9MTzAKKwlQVEVfTVRDMAl6ZXJvLCBNSVBTX0NPUF8wX1RMQl9MTzEKKwlN
VEMwCQl6ZXJvLCBNSVBTX0NPUF8wX1RMQl9QR19NQVNLCisJSEFaQVJEX0RFTEFZCisJdGxid2kK
KwlIQVpBUkRfREVMQVkKKyNlbmRpZgkvKiBLU1RBQ0tfTEFSR0VfUEFHRSAqLwogCiBlbnRyeTBz
ZXQ6CisJTVRDMAkJdjAsIE1JUFNfQ09QXzBfVExCX0hJCQkjIHNldCBWUE4gYWdhaW4KKwlIQVpB
UkRfREVMQVkKIC8qIFNNUCEhIC0gV29ya3Mgb25seSBmb3IgIHVuc2hhcmVkIFRMQiBjYXNlIC0g
aS5lLiBubyB2LWNwdXMgKi8KLQltdGMwCXplcm8sIE1JUFNfQ09QXzBfVExCX0lOREVYCQkjIFRM
QiBlbnRyeSAjMAorCW10YzAJCXplcm8sIE1JUFNfQ09QXzBfVExCX0lOREVYCSMgVExCIGVudHJ5
ICMwCiAJSEFaQVJEX0RFTEFZCiAJUFRFX01UQzAJYTEsIE1JUFNfQ09QXzBfVExCX0xPMAkJIyB1
cHRlWzBdCiAJSEFaQVJEX0RFTEFZCiAJUFRFX01UQzAJYTIsIE1JUFNfQ09QXzBfVExCX0xPMQkJ
IyB1cHRlWzFdCisjaWZkZWYgS1NUQUNLX0xBUkdFX1BBR0UKKwlIQVpBUkRfREVMQVkKKwlsaQkJ
dDEsIEtTVEFDS19UTEJNQVNLX01BU0sKKwlNVEMwCQl0MSwgTUlQU19DT1BfMF9UTEJfUEdfTUFT
SwogCUhBWkFSRF9ERUxBWQorI2Vsc2UKKwlNVEMwCQl6ZXJvLCBNSVBTX0NPUF8wX1RMQl9QR19N
QVNLCisJSEFaQVJEX0RFTEFZCisjZW5kaWYKIAl0bGJ3aQkJCQkJIyBzZXQgVExCIGVudHJ5ICMw
CiAJSEFaQVJEX0RFTEFZCisKKyNpZmRlZiBLU1RBQ0tfTEFSR0VfUEFHRQorCU1UQzAJCXplcm8s
IE1JUFNfQ09QXzBfVExCX1BHX01BU0sKKwlIQVpBUkRfREVMQVkKKyNlbmRpZgogLyoKICAqIE5v
dyBydW5uaW5nIG9uIG5ldyB1IHN0cnVjdC4KICAqLwpkaWZmIC0tZ2l0IGEvc3lzL21pcHMvbWlw
cy9wbWFwX21pcHM2NC5jIGIvc3lzL21pcHMvbWlwcy9wbWFwX21pcHM2NC5jCm5ldyBmaWxlIG1v
ZGUgMTAwNjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzL21pcHMvbWlwcy9wbWFwX21pcHM2NC5j
CkBAIC0wLDAgKzEsNTUyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5MSBSZWdlbnRzIG9m
IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICogQ29weXJpZ2h0IChjKSAxOTk0IEpvaG4gUy4gRHlzb24KKyAqIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQgRGF2aWQgR3JlZW5tYW4KKyAqIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgUGV0ZXIgV2VtbQorICogQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDEwIEFsYW4gTC4gQ294IDxhbGNA
Y3MucmljZS5lZHU+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAy
MDE1IFN0YWNleSBELiBTb24gPHNzb25ALi4uPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJl
cmtlbGV5IGJ5CisgKiB0aGUgU3lzdGVtcyBQcm9ncmFtbWluZyBHcm91cCBvZiB0aGUgVW5pdmVy
c2l0eSBvZiBVdGFoIENvbXB1dGVyCisgKiBTY2llbmNlIERlcGFydG1lbnQgYW5kIFdpbGxpYW0g
Sm9saXR6IG9mIFVVTkVUIFRlY2hub2xvZ2llcyBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiA0LiBOZWl0aGVy
IHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1
dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRl
cml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdy
aXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRI
RSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
CisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBT
SEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwg
REFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0gg
REFNQUdFLgorICoKKyAqCWZyb206CUAoIylwbWFwLmMJNy43IChCZXJrZWxleSkJNS8xMi85MQor
ICoJZnJvbTogc3JjL3N5cy9pMzg2L2kzODYvcG1hcC5jLHYgMS4yNTAuMi44IDIwMDAvMTEvMjEg
MDA6MDk6MTQgcHMKKyAqCUpOUFI6IHBtYXAuYyx2IDEuMTEuMi4xIDIwMDcvMDgvMTYgMTE6NTE6
MDYgZ2lyaXNoCisgKi8KKworLyoKKyAqCU1hbmFnZXMgcGh5c2ljYWwgYWRkcmVzcyBtYXBzLgor
ICoKKyAqCVNpbmNlIHRoZSBpbmZvcm1hdGlvbiBtYW5hZ2VkIGJ5IHRoaXMgbW9kdWxlIGlzCisg
KglhbHNvIHN0b3JlZCBieSB0aGUgbG9naWNhbCBhZGRyZXNzIG1hcHBpbmcgbW9kdWxlLAorICoJ
dGhpcyBtb2R1bGUgbWF5IHRocm93IGF3YXkgdmFsaWQgdmlydHVhbC10by1waHlzaWNhbAorICoJ
bWFwcGluZ3MgYXQgYWxtb3N0IGFueSB0aW1lLiAgSG93ZXZlciwgaW52YWxpZGF0aW9ucworICoJ
b2YgdmlydHVhbC10by1waHlzaWNhbCBtYXBwaW5ncyBtdXN0IGJlIGRvbmUgYXMKKyAqCXJlcXVl
c3RlZC4KKyAqCisgKglJbiBvcmRlciB0byBjb3BlIHdpdGggaGFyZHdhcmUgYXJjaGl0ZWN0dXJl
cyB3aGljaAorICoJbWFrZSB2aXJ0dWFsLXRvLXBoeXNpY2FsIG1hcCBpbnZhbGlkYXRlcyBleHBl
bnNpdmUsCisgKgl0aGlzIG1vZHVsZSBtYXkgZGVsYXkgaW52YWxpZGF0ZSBvciByZWR1Y2VkIHBy
b3RlY3Rpb24KKyAqCW9wZXJhdGlvbnMgdW50aWwgc3VjaCB0aW1lIGFzIHRoZXkgYXJlIGFjdHVh
bGx5CisgKgluZWNlc3NhcnkuICBUaGlzIG1vZHVsZSBpcyBnaXZlbiBmdWxsIGluZm9ybWF0aW9u
IGFzCisgKgl0byB3aGljaCBwcm9jZXNzb3JzIGFyZSBjdXJyZW50bHkgdXNpbmcgd2hpY2ggbWFw
cywKKyAqCWFuZCB0byB3aGVuIHBoeXNpY2FsIG1hcHMgbXVzdCBiZSBtYWRlIGNvcnJlY3QuCisg
Ki8KKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorX19GQlNESUQoIiRGcmVlQlNEJCIpOworCisj
aW5jbHVkZSAib3B0X2RkYi5oIgorI2luY2x1ZGUgIm9wdF9wbWFwLmgiCisjaW5jbHVkZSAib3B0
X3ZtLmgiCisKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzeXMvc3lzdG0uaD4K
KyNpbmNsdWRlIDxzeXMva3RyLmg+CisjaW5jbHVkZSA8c3lzL2xvY2suaD4KKyNpbmNsdWRlIDxz
eXMvbW1hbi5oPgorI2luY2x1ZGUgPHN5cy9tc2didWYuaD4KKyNpbmNsdWRlIDxzeXMvbXV0ZXgu
aD4KKyNpbmNsdWRlIDxzeXMvcGNwdS5oPgorI2luY2x1ZGUgPHN5cy9wcm9jLmg+CisjaW5jbHVk
ZSA8c3lzL3J3bG9jay5oPgorI2luY2x1ZGUgPHN5cy9zY2hlZC5oPgorI2lmZGVmIFNNUAorI2lu
Y2x1ZGUgPHN5cy9zbXAuaD4KKyNlbHNlCisjaW5jbHVkZSA8c3lzL2NwdXNldC5oPgorI2VuZGlm
CisjaW5jbHVkZSA8c3lzL3N5c2N0bC5oPgorI2luY2x1ZGUgPHN5cy92bW1ldGVyLmg+CisKKyNp
ZmRlZiBEREIKKyNpbmNsdWRlIDxkZGIvZGRiLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHZtL3Zt
Lmg+CisjaW5jbHVkZSA8dm0vdm1fcGFyYW0uaD4KKyNpbmNsdWRlIDx2bS92bV9rZXJuLmg+Cisj
aW5jbHVkZSA8dm0vdm1fcGFnZS5oPgorI2luY2x1ZGUgPHZtL3ZtX21hcC5oPgorI2luY2x1ZGUg
PHZtL3ZtX29iamVjdC5oPgorI2luY2x1ZGUgPHZtL3ZtX2V4dGVybi5oPgorI2luY2x1ZGUgPHZt
L3ZtX3BhZ2VvdXQuaD4KKyNpbmNsdWRlIDx2bS92bV9wYWdlci5oPgorI2luY2x1ZGUgPHZtL3Zt
X3JhZGl4Lmg+CisjaW5jbHVkZSA8dm0vdm1fcmVzZXJ2Lmg+CisjaW5jbHVkZSA8dm0vdW1hLmg+
CisKKyNpbmNsdWRlIDxtYWNoaW5lL2NhY2hlLmg+CisjaW5jbHVkZSA8bWFjaGluZS9tZF92YXIu
aD4KKyNpbmNsdWRlIDxtYWNoaW5lL3RsYi5oPgorCisjdW5kZWYgUE1BUF9ERUJVRworCisjaWYg
IWRlZmluZWQoRElBR05PU1RJQykKKyNkZWZpbmUJUE1BUF9JTkxJTkUgX19pbmxpbmUKKyNlbHNl
CisjZGVmaW5lCVBNQVBfSU5MSU5FCisjZW5kaWYKKworLy8gI2RlZmluZSBQVl9TVEFUUworI2lm
ZGVmIFBWX1NUQVRTCisjZGVmaW5lIFBWX1NUQVQoeCkJZG8geyB4IDsgfSB3aGlsZSAoMCkKKyNl
bHNlCisjZGVmaW5lIFBWX1NUQVQoeCkJZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCisKKyNkZWZp
bmUJcGFfaW5kZXgocGEpCSgocGEpID4+IFBEUlNISUZUKQorI2RlZmluZQlwYV90b19wdmgocGEp
CSgmcHZfdGFibGVbcGFfaW5kZXgocGEpXSkKKworI2RlZmluZQlOUFZfTElTVF9MT0NLUwlNQVhD
UFUKKworI2RlZmluZQlQSFlTX1RPX1BWX0xJU1RfTE9DSyhwYSkJXAorCQkoJnB2X2xpc3RfbG9j
a3NbcGFfaW5kZXgocGEpICUgTlBWX0xJU1RfTE9DS1NdKQorCisjZGVmaW5lCUNIQU5HRV9QVl9M
SVNUX0xPQ0tfVE9fUEhZUyhsb2NrcCwgcGEpCWRvIHsJXAorCXN0cnVjdCByd2xvY2sgKipfbG9j
a3AgPSAobG9ja3ApOwkJXAorCXN0cnVjdCByd2xvY2sgKl9uZXdfbG9jazsJCQlcCisJCQkJCQkJ
XAorCV9uZXdfbG9jayA9IFBIWVNfVE9fUFZfTElTVF9MT0NLKHBhKTsJCVwKKwlpZiAoX25ld19s
b2NrICE9ICpfbG9ja3ApIHsJCQlcCisJCWlmICgqX2xvY2twICE9IE5VTEwpCQkJXAorCQkJcndf
d3VubG9jaygqX2xvY2twKTsJCVwKKwkJKl9sb2NrcCA9IF9uZXdfbG9jazsJCQlcCisJCSByd193
bG9jaygqX2xvY2twKTsJCQlcCisJfQkJCQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQ0hB
TkdFX1BWX0xJU1RfTE9DS19UT19WTV9QQUdFKGxvY2twLCBtKQlcCisJCUNIQU5HRV9QVl9MSVNU
X0xPQ0tfVE9fUEhZUyhsb2NrcCwgVk1fUEFHRV9UT19QSFlTKG0pKQorCisjZGVmaW5lCVJFTEVB
U0VfUFZfTElTVF9MT0NLKGxvY2twKQkJZG8gewlcCisJc3RydWN0IHJ3bG9jayAqKl9sb2NrcCA9
IChsb2NrcCk7CQlcCisJCQkJCQkJXAorCWlmICgqX2xvY2twICE9IE5VTEwpIHsJCQkJXAorCQly
d193dW5sb2NrKCpfbG9ja3ApOwkJCVwKKwkJKl9sb2NrcCA9IE5VTEw7CQkJCVwKKwl9CQkJCQkJ
XAorfSB3aGlsZSAoMCkKKworI2RlZmluZQlWTV9QQUdFX1RPX1BWX0xJU1RfTE9DSyhtKQlcCisJ
CVBIWVNfVE9fUFZfTElTVF9MT0NLKFZNX1BBR0VfVE9fUEhZUyhtKSkKKworLyoKKyAqIEdldCBQ
REVzIGFuZCBQVEVzIGZvciB1c2VyL2tlcm5lbCBhZGRyZXNzIHNwYWNlCisgKi8KKyNkZWZpbmUJ
cG1hcF9zZWdfaW5kZXgodikJKCgodikgPj4gU0VHU0hJRlQpICYgKE5QREVQRyAtIDEpKQorI2Rl
ZmluZQlwbWFwX3BkZV9pbmRleCh2KQkoKCh2KSA+PiBQRFJTSElGVCkgJiAoTlBERVBHIC0gMSkp
CisjZGVmaW5lCXBtYXBfcHRlX2luZGV4KHYpCSgoKHYpID4+IFBBR0VfU0hJRlQpICYgKE5QVEVQ
RyAtIDEpKQorI2RlZmluZQlwbWFwX3BkZV9waW5kZXgodikJKCh2KSA+PiBQRFJTSElGVCkKKwor
I2RlZmluZQlOVVBERQkJCShOUERFUEcgKiBOUERFUEcpCisjZGVmaW5lCU5VU0VSUEdUQkxTCQko
TlVQREUgKyBOUERFUEcpCisKKyNkZWZpbmUJaXNfa2VybmVsX3BtYXAoeCkJKCh4KSA9PSBrZXJu
ZWxfcG1hcCkKKworc3RydWN0IHBtYXAga2VybmVsX3BtYXBfc3RvcmU7CitwZF9lbnRyeV90ICpr
ZXJuZWxfc2VnbWFwOworCit2bV9vZmZzZXRfdCB2aXJ0dWFsX2F2YWlsOwkvKiBWQSBvZiBmaXJz
dCBhdmFpbCBwYWdlIChhZnRlciBrZXJuZWwgYnNzKSAqLwordm1fb2Zmc2V0X3QgdmlydHVhbF9l
bmQ7CS8qIFZBIG9mIGxhc3QgYXZhaWwgcGFnZSAoZW5kIG9mIGtlcm5lbCBBUykgKi8KKworc3Rh
dGljIGludCBua3B0OwordW5zaWduZWQgcG1hcF9tYXhfYXNpZDsJCS8qIG1heCBBU0lEIHN1cHBv
cnRlZCBieSB0aGUgc3lzdGVtICovCisKK3N0YXRpYyBTWVNDVExfTk9ERShfdm0sIE9JRF9BVVRP
LCBwbWFwLCBDVExGTEFHX1JELCAwLCAiVk0vcG1hcCBwYXJhbWV0ZXJzIik7CitzdGF0aWMgaW50
IHBnX3NwX2VuYWJsZWQgPSAwOworU1lTQ1RMX0lOVChfdm1fcG1hcCwgT0lEX0FVVE8sIHBnX3Bz
X2VuYWJsZWQsIENUTEZMQUdfUkRUVU4gfCBDVExGTEFHX05PRkVUQ0gsCisgICAgJnBnX3NwX2Vu
YWJsZWQsIDAsICJBcmUgbGFyZ2UgcGFnZSBtYXBwaW5ncyBlbmFibGVkPyIpOworCisjZGVmaW5l
CVBNQVBfQVNJRF9SRVNFUlZFRAkwCisKK3ZtX29mZnNldF90IGtlcm5lbF92bV9lbmQgPSBWTV9N
SU5fS0VSTkVMX0FERFJFU1M7CisKK3N0YXRpYyB2b2lkIHBtYXBfYXNpZF9hbGxvYyhwbWFwX3Qg
cG1hcCk7CisKK3N0YXRpYyBzdHJ1Y3Qgcndsb2NrX3BhZGFsaWduIHB2aF9nbG9iYWxfbG9jazsK
KworLyoKKyAqIERhdGEgZm9yIHRoZSBwdiBlbnRyeSBhbGxvY2F0aW9uIG1lY2hhbmlzbQorICov
CitzdGF0aWMgVEFJTFFfSEVBRChwY2gsIHB2X2NodW5rKSBwdl9jaHVua3MgPSBUQUlMUV9IRUFE
X0lOSVRJQUxJWkVSKHB2X2NodW5rcyk7CitzdGF0aWMgc3RydWN0IG10eCBwdl9jaHVua3NfbXV0
ZXg7CitzdGF0aWMgc3RydWN0IHJ3bG9jayBwdl9saXN0X2xvY2tzW05QVl9MSVNUX0xPQ0tTXTsK
K3N0YXRpYyBzdHJ1Y3QgbWRfcGFnZSAqcHZfdGFibGU7CisKK3N0YXRpYyB2b2lkIGZyZWVfcHZf
Y2h1bmsoc3RydWN0IHB2X2NodW5rICpwYyk7CitzdGF0aWMgdm9pZCBmcmVlX3B2X2VudHJ5KHBt
YXBfdCBwbWFwLCBwdl9lbnRyeV90IHB2KTsKK3N0YXRpYyBwdl9lbnRyeV90IGdldF9wdl9lbnRy
eShwbWFwX3QgcG1hcCwgc3RydWN0IHJ3bG9jayAqKmxvY2twKTsKK3N0YXRpYyB2bV9wYWdlX3Qg
cmVjbGFpbV9wdl9jaHVuayhwbWFwX3QgbG9ja2VkX3BtYXAsIHN0cnVjdCByd2xvY2sgKipsb2Nr
cCk7CitzdGF0aWMgdm9pZCBwbWFwX3B2aF9mcmVlKHN0cnVjdCBtZF9wYWdlICpwdmgsIHBtYXBf
dCBwbWFwLCB2bV9vZmZzZXRfdCB2YSk7CitzdGF0aWMgcHZfZW50cnlfdCBwbWFwX3B2aF9yZW1v
dmUoc3RydWN0IG1kX3BhZ2UgKnB2aCwgcG1hcF90IHBtYXAsCisgICAgdm1fb2Zmc2V0X3QgdmEp
Oworc3RhdGljIHZtX3BhZ2VfdCBwbWFwX2FsbG9jX2RpcmVjdF9wYWdlKHVuc2lnbmVkIGludCBp
bmRleCwgaW50IHJlcSk7CitzdGF0aWMgdm1fcGFnZV90IHBtYXBfZW50ZXJfcXVpY2tfbG9ja2Vk
KHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwKKyAgICB2bV9wYWdlX3QgbSwgdm1fcHJvdF90
IHByb3QsIHZtX3BhZ2VfdCBtcHRlLCAgc3RydWN0IHJ3bG9jayAqKmxvY2twKTsKK3N0YXRpYyB2
b2lkIHJlc2VydmVfcHZfZW50cmllcyhwbWFwX3QgcG1hcCwgaW50IG5lZWRlZCwKKyAgICBzdHJ1
Y3Qgcndsb2NrICoqbG9ja3ApOworc3RhdGljIGJvb2xlYW5fdCBwbWFwX2RlbW90ZV9wZGUocG1h
cF90IHBtYXAsIHBkX2VudHJ5X3QgKnBkZSwgdm1fb2Zmc2V0X3QgdmEpOworc3RhdGljIGJvb2xl
YW5fdCBwbWFwX2RlbW90ZV9wZGVfbG9ja2VkKHBtYXBfdCBwbWFwLCBwZF9lbnRyeV90ICpwZGUs
CisgICAgdm1fb2Zmc2V0X3QgdmEsIHN0cnVjdCByd2xvY2sgKipsb2NrcCk7CitzdGF0aWMgdm1f
cGFnZV90IHBtYXBfYWxsb2NwZGUocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhLAorICAgIHN0
cnVjdCByd2xvY2sgKipsb2NrcCk7CitzdGF0aWMgYm9vbGVhbl90IHBtYXBfZW50ZXJfcGRlKHBt
YXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgdm1fcGFnZV90IG0sCisgICAgdm1fcHJvdF90IHBy
b3QsIHN0cnVjdCByd2xvY2sgKipsb2NrcCk7CitzdGF0aWMgdm9pZCBwbWFwX3B2X2RlbW90ZV9w
ZGUocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhLCB2bV9wYWRkcl90IHBhLAorICAgIHN0cnVj
dCByd2xvY2sgKipsb2NrcCk7CitzdGF0aWMgYm9vbGVhbl90IHBtYXBfcHZfaW5zZXJ0X3BkZShw
bWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEsIHZtX3BhZGRyX3QgcGEsCisgICAgc3RydWN0IHJ3
bG9jayAqKmxvY2twKTsKK3N0YXRpYyB2b2lkIHBtYXBfcHZfcHJvbW90ZV9wZGUocG1hcF90IHBt
YXAsIHZtX29mZnNldF90IHZhLCB2bV9wYWRkcl90IHBhLAorICAgIHN0cnVjdCByd2xvY2sgKips
b2NrcCk7CitzdGF0aWMgdm9pZCBwbWFwX2ZpbGxfcHRwKHB0X2VudHJ5X3QgKmZpcnN0cHRlLCBw
dF9lbnRyeV90IG5ld3B0ZSk7CitzdGF0aWMgX19pbmxpbmUgaW50IHBtYXBfaW5zZXJ0X3B0X3Bh
Z2UocG1hcF90IHBtYXAsIHZtX3BhZ2VfdCBtcHRlKTsKK3N0YXRpYyBfX2lubGluZSB2bV9wYWdl
X3QgcG1hcF9sb29rdXBfcHRfcGFnZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEpOworc3Rh
dGljIHZvaWQgcG1hcF9wcm9tb3RlX3BkZShwbWFwX3QgcG1hcCwgcGRfZW50cnlfdCAqcGRlLCB2
bV9vZmZzZXRfdCB2YSwKKyAgICBzdHJ1Y3Qgcndsb2NrICoqbG9ja3ApOworc3RhdGljIGludCBw
bWFwX3JlbW92ZV9wZGUocG1hcF90IHBtYXAsIHBkX2VudHJ5X3QgKnBkcSwgdm1fb2Zmc2V0X3Qg
c3ZhLAorICAgIHN0cnVjdCBzcGdsaXN0ICpmcmVlLCBzdHJ1Y3Qgcndsb2NrICoqbG9ja3ApOwor
c3RhdGljIGludCBwbWFwX3JlbW92ZV9wdGUoc3RydWN0IHBtYXAgKnBtYXAsIHB0X2VudHJ5X3Qg
KnB0cSwgdm1fb2Zmc2V0X3QgdmEsCisgICAgcGRfZW50cnlfdCBwdGVwZGUsIHN0cnVjdCBzcGds
aXN0ICpmcmVlLCBzdHJ1Y3Qgcndsb2NrICoqbG9ja3ApOworc3RhdGljIHZvaWQgcG1hcF9yZW1v
dmVfcGFnZShzdHJ1Y3QgcG1hcCAqcG1hcCwgdm1fb2Zmc2V0X3QgdmEsCisgICAgc3RydWN0IHNw
Z2xpc3QgKmZyZWUpOworc3RhdGljIGJvb2xlYW5fdCBwbWFwX3RyeV9pbnNlcnRfcHZfZW50cnko
cG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhLAorICAgIHZtX3BhZ2VfdCBtLCBzdHJ1Y3Qgcnds
b2NrICoqbG9ja3ApOworc3RhdGljIHZvaWQgcG1hcF91cGRhdGVfcGFnZShwbWFwX3QgcG1hcCwg
dm1fb2Zmc2V0X3QgdmEsIHB0X2VudHJ5X3QgcHRlKTsKK3N0YXRpYyB2b2lkIHBtYXBfaW52YWxp
ZGF0ZV9hbGwocG1hcF90IHBtYXApOworc3RhdGljIHZvaWQgcG1hcF9pbnZhbGlkYXRlX3BhZ2Uo
cG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhKTsKK3N0YXRpYyB2b2lkIF9wbWFwX3Vud2lyZV9w
dHAocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhLCB2bV9wYWdlX3QgbSwKKyAgICBzdHJ1Y3Qg
c3BnbGlzdCAqZnJlZSk7CisKK3N0YXRpYyB2bV9wYWdlX3QgcG1hcF9hbGxvY3B0ZShwbWFwX3Qg
cG1hcCwgdm1fb2Zmc2V0X3QgdmEsCisgICAgc3RydWN0IHJ3bG9jayAqKmxvY2twKTsKK3N0YXRp
YyB2bV9wYWdlX3QgX3BtYXBfYWxsb2NwdGUocG1hcF90IHBtYXAsIHVuc2lnbmVkIHB0ZXBpbmRl
eCwKKyAgICBzdHJ1Y3Qgcndsb2NrICoqbG9ja3ApOworc3RhdGljIGludCBwbWFwX3VudXNlX3B0
KHBtYXBfdCwgdm1fb2Zmc2V0X3QsIHBkX2VudHJ5X3QsIHN0cnVjdCBzcGdsaXN0ICopOworc3Rh
dGljIHB0X2VudHJ5X3QgaW5pdF9wdGVfcHJvdCh2bV9wYWdlX3QgbSwgdm1fcHJvdF90IGFjY2Vz
cywgdm1fcHJvdF90IHByb3QpOworCitzdGF0aWMgdm9pZCBwbWFwX2ludmFsaWRhdGVfcGFnZV9h
Y3Rpb24odm9pZCAqYXJnKTsKK3N0YXRpYyB2b2lkIHBtYXBfaW52YWxpZGF0ZV9yYW5nZV9hY3Rp
b24odm9pZCAqYXJnKTsKK3N0YXRpYyB2b2lkIHBtYXBfdXBkYXRlX3BhZ2VfYWN0aW9uKHZvaWQg
KmFyZyk7CisKKy8qCisgKiBQYWdlIHRhYmxlIGVudHJ5IGxvb2t1cCByb3V0aW5lcy4KKyAqLwor
CisvKiBSZXR1cm4gYSBzZWdtZW50IGVudHJ5IGZvciBnaXZlbiBwbWFwICYgdmlydHVhbCBhZGRy
ZXNzLiAqLworc3RhdGljIF9faW5saW5lIHBkX2VudHJ5X3QgKgorcG1hcF9zZWdtYXAocG1hcF90
IHBtYXAsIHZtX29mZnNldF90IHZhKQoreworCisJcmV0dXJuICgmcG1hcC0+cG1fc2VndGFiW3Bt
YXBfc2VnX2luZGV4KHZhKV0pOworfQorCisvKiBSZXR1cm4gYSBwYWdlIGRpcmVjdG9yeSBlbnRy
eSBmb3IgZ2l2ZW4gc2VnbWVudCB0YWJsZSAmIHZpcnR1YWwgYWRkcmVzcy4gKi8KK3N0YXRpYyBf
X2lubGluZSBwZF9lbnRyeV90ICoKK3BtYXBfcGRwZV90b19wZGUocGRfZW50cnlfdCAqcGRwZSwg
dm1fb2Zmc2V0X3QgdmEpCit7CisJcGRfZW50cnlfdCAqcGRlOworCisJcGRlID0gKHBkX2VudHJ5
X3QgKikqcGRwZTsKKwlyZXR1cm4gKCZwZGVbcG1hcF9wZGVfaW5kZXgodmEpXSk7Cit9CisKKy8q
IFJldHVybiBhIHBhZ2UgZGlyZWN0b3J5IGVudHJ5IGZvciBnaXZlbiBwbWFwICYgdmlydHVhbCBh
ZGRyZXNzLiAqLworc3RhdGljIF9faW5saW5lIHBkX2VudHJ5X3QgKgorcG1hcF9wZGUocG1hcF90
IHBtYXAsIHZtX29mZnNldF90IHZhKQoreworCXBkX2VudHJ5X3QgKnBkcGU7CisKKwlwZHBlID0g
cG1hcF9zZWdtYXAocG1hcCwgdmEpOworCWlmICgqcGRwZSA9PSBOVUxMKQorCQlyZXR1cm4gKE5V
TEwpOworCisJcmV0dXJuIChwbWFwX3BkcGVfdG9fcGRlKHBkcGUsIHZhKSk7Cit9CisKKy8qIFJl
dHVybiBhIHBhZ2UgdGFibGUgZW50cnkgZm9yIGdpdmVuIHBhZ2UgZGlyZWN0b3J5ICYgdmlydHVh
bCBhZGRyZXNzLiAqLworc3RhdGljIF9faW5saW5lIHB0X2VudHJ5X3QgKgorcG1hcF9wZGVfdG9f
cHRlKHBkX2VudHJ5X3QgKnBkZSwgdm1fb2Zmc2V0X3QgdmEpCit7CisJcHRfZW50cnlfdCAqcHRl
OworCisJcHRlID0gKHB0X2VudHJ5X3QgKikqcGRlOworCXJldHVybiAoJnB0ZVtwbWFwX3B0ZV9p
bmRleCh2YSldKTsKK30KKworLyogUmV0dXJuIGEgcGFnZSB0YWJsZSBlbnRyeSBmb3IgZ2l2ZW4g
cG1hcCAmIHZpcnR1YWwgYWRkcmVzcy4gKi8KK3B0X2VudHJ5X3QgKgorcG1hcF9wdGUocG1hcF90
IHBtYXAsIHZtX29mZnNldF90IHZhKQoreworCXBkX2VudHJ5X3QgKnBkZTsKKworCXBkZSA9IHBt
YXBfcGRlKHBtYXAsIHZhKTsKKwlpZiAocGRlID09IE5VTEwgfHwgKnBkZSA9PSBOVUxMKQorCQly
ZXR1cm4gKE5VTEwpOworCWlmIChwZGVfaXNfc3VwZXJwYWdlKHBkZSkpIHsKKwkJcmV0dXJuICgo
cHRfZW50cnlfdCAqKXBkZSk7CisJfSBlbHNlCisJCXJldHVybiAocG1hcF9wZGVfdG9fcHRlKHBk
ZSwgdmEpKTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK3BtYXBfcmVzaWRlbnRfY291bnRf
aW5jKHBtYXBfdCBwbWFwLCBpbnQgY291bnQpCit7CisKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAs
IE1BX09XTkVEKTsKKwlwbWFwLT5wbV9zdGF0cy5yZXNpZGVudF9jb3VudCArPSBjb3VudDsKK30K
Kworc3RhdGljIF9faW5saW5lIHZvaWQKK3BtYXBfcmVzaWRlbnRfY291bnRfZGVjKHBtYXBfdCBw
bWFwLCBpbnQgY291bnQpCit7CisKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsK
KwlLQVNTRVJUKHBtYXAtPnBtX3N0YXRzLnJlc2lkZW50X2NvdW50ID49IGNvdW50LAorCSAgICAo
InBtYXAgJXAgcmVzaWRlbnQgY291bnQgdW5kZXJmbG93ICVsZCAlZCIsIHBtYXAsCisJICAgIHBt
YXAtPnBtX3N0YXRzLnJlc2lkZW50X2NvdW50LCBjb3VudCkpOworCXBtYXAtPnBtX3N0YXRzLnJl
c2lkZW50X2NvdW50IC09IGNvdW50OworfQorCisvKgorICogQWxsb2NhdGUgc29tZSB3aXJlZCBt
ZW1vcnkgYmVmb3JlIHRoZSB2aXJ0dWFsIG1lbW9yeSBzeXN0ZW0gaXMKKyAqIGJvb3RzdHJhcHBl
ZC4KKyAqLwordm1fb2Zmc2V0X3QKK3BtYXBfc3RlYWxfbWVtb3J5KHZtX3NpemVfdCBzaXplKQor
eworCXZtX3BhZGRyX3QgYmFua19zaXplLCBwYTsKKwl2bV9vZmZzZXRfdCB2YTsKKworCXNpemUg
PSByb3VuZF9wYWdlKHNpemUpOworCWJhbmtfc2l6ZSA9IHBoeXNfYXZhaWxbMV0gLSBwaHlzX2F2
YWlsWzBdOworCXdoaWxlIChzaXplID4gYmFua19zaXplKSB7CisJCWludCBpOworCisJCWZvciAo
aSA9IDA7IHBoeXNfYXZhaWxbaSArIDJdOyBpICs9IDIpIHsKKwkJCXBoeXNfYXZhaWxbaV0gPSBw
aHlzX2F2YWlsW2kgKyAyXTsKKwkJCXBoeXNfYXZhaWxbaSArIDFdID0gcGh5c19hdmFpbFtpICsg
M107CisJCX0KKwkJcGh5c19hdmFpbFtpXSA9IDA7CisJCXBoeXNfYXZhaWxbaSArIDFdID0gMDsK
KwkJaWYgKCFwaHlzX2F2YWlsWzBdKQorCQkJcGFuaWMoInBtYXBfc3RlYWxfbWVtb3J5OiBvdXQg
b2YgbWVtb3J5Iik7CisJCWJhbmtfc2l6ZSA9IHBoeXNfYXZhaWxbMV0gLSBwaHlzX2F2YWlsWzBd
OworCX0KKworCXBhID0gcGh5c19hdmFpbFswXTsKKwlwaHlzX2F2YWlsWzBdICs9IHNpemU7CisJ
dmEgPSBNSVBTX1BIWVNfVE9fRElSRUNUKHBhKTsKKwliemVybygoY2FkZHJfdCl2YSwgc2l6ZSk7
CisJcmV0dXJuICh2YSk7Cit9CisKKy8qCisgKiBCb290c3RyYXAgdGhlIHN5c3RlbSBlbm91Z2gg
dG8gcnVuIHdpdGggdmlydHVhbCBtZW1vcnkuICBUaGlzCisgKiBhc3N1bWVzIHRoYXQgdGhlIHBo
eXNfYXZhaWwgYXJyYXkgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuCisgKi8KK3N0YXRpYyB2b2lkCitw
bWFwX2NyZWF0ZV9rZXJuZWxfcGFnZXRhYmxlKHZvaWQpCit7CisJaW50IGksIGo7CisJdm1fb2Zm
c2V0X3QgcHRhZGRyOworCXB0X2VudHJ5X3QgKnB0ZTsKKwlwZF9lbnRyeV90ICpwZGU7CisJdm1f
b2Zmc2V0X3QgcGRhZGRyOworCWludCBucHQsIG5wZGU7CisKKwkvKgorCSAqIEFsbG9jYXRlIHNl
Z21lbnQgdGFibGUgZm9yIHRoZSBrZXJuZWwKKwkgKi8KKwlrZXJuZWxfc2VnbWFwID0gKHBkX2Vu
dHJ5X3QgKilwbWFwX3N0ZWFsX21lbW9yeShQQUdFX1NJWkUpOworCisJLyoKKwkgKiBBbGxvY2F0
ZSBzZWNvbmQgbGV2ZWwgcGFnZSB0YWJsZXMgZm9yIHRoZSBrZXJuZWwKKwkgKi8KKwlucGRlID0g
aG93bWFueShOS1BULCBOUERFUEcpOworCXBkYWRkciA9IHBtYXBfc3RlYWxfbWVtb3J5KFBBR0Vf
U0laRSAqIG5wZGUpOworCW5rcHQgPSBOS1BUOworCXB0YWRkciA9IHBtYXBfc3RlYWxfbWVtb3J5
KFBBR0VfU0laRSAqIG5rcHQpOworCisJLyoKKwkgKiBUaGUgUls0LTddPzAwIHN0b3JlcyBvbmx5
IG9uZSBjb3B5IG9mIHRoZSBHbG9iYWwgYml0IGluIHRoZQorCSAqIHRyYW5zbGF0aW9uIGxvb2th
c2lkZSBidWZmZXIgZm9yIGVhY2ggMiBwYWdlIGVudHJ5LiBUaHVzIGludmFsaWQKKwkgKiBlbnRy
eXMgbXVzdCBoYXZlIHRoZSBHbG9iYWwgYml0IHNldCBzbyB3aGVuIEVudHJ5IExPIGFuZCBFbnRy
eSBISQorCSAqIEcgYml0cyBhcmUgYW5kZWQgdG9nZXRoZXIgdGhleSB3aWxsIHByb2R1Y2UgYSBn
bG9iYWwgYml0IHRvIHN0b3JlCisJICogaW4gdGhlIHRsYi4KKwkgKi8KKwlmb3IgKGkgPSAwLCBw
dGUgPSAocHRfZW50cnlfdCAqKXB0YWRkcjsgaSA8IChua3B0ICogTlBURVBHKTsgaSsrLCBwdGUr
KykKKwkJKnB0ZSA9IFBURV9HOworCisJZm9yIChpID0gMCwgIG5wdCA9IG5rcHQ7IG5wdCA+IDA7
IGkrKykgeworCQlrZXJuZWxfc2VnbWFwW2ldID0gKHBkX2VudHJ5X3QpKHBkYWRkciArIGkgKiBQ
QUdFX1NJWkUpOworCQlwZGUgPSAocGRfZW50cnlfdCAqKWtlcm5lbF9zZWdtYXBbaV07CisKKwkJ
Zm9yIChqID0gMDsgaiA8IE5QREVQRyAmJiBucHQgPiAwOyBqKyssIG5wdC0tKQorCQkJcGRlW2pd
ID0gKHBkX2VudHJ5X3QpKHB0YWRkciArIChpICogTlBERVBHICsgaikgKgorCQkJICAgIFBBR0Vf
U0laRSk7CisJfQorCisJUE1BUF9MT0NLX0lOSVQoa2VybmVsX3BtYXApOworCWtlcm5lbF9wbWFw
LT5wbV9zZWd0YWIgPSBrZXJuZWxfc2VnbWFwOworCUNQVV9GSUxMKCZrZXJuZWxfcG1hcC0+cG1f
YWN0aXZlKTsKKwlUQUlMUV9JTklUKCZrZXJuZWxfcG1hcC0+cG1fcHZjaHVuayk7CisJa2VybmVs
X3BtYXAtPnBtX2FzaWRbMF0uYXNpZCA9IFBNQVBfQVNJRF9SRVNFUlZFRDsKKwlrZXJuZWxfcG1h
cC0+cG1fYXNpZFswXS5nZW4gPSAwOworCWtlcm5lbF92bV9lbmQgKz0gbmtwdCAqIE5QVEVQRyAq
IFBBR0VfU0laRTsKK30KKwordm9pZAorcG1hcF9ib290c3RyYXAodm9pZCkKK3sKKwlpbnQgaTsK
KworCS8qIFNvcnQuICovCithZ2FpbjoKKwlmb3IgKGkgPSAwOyBwaHlzX2F2YWlsW2kgKyAxXSAh
PSAwOyBpICs9IDIpIHsKKwkJLyoKKwkJICogS2VlcCB0aGUgbWVtb3J5IGFsaWduZWQgb24gcGFn
ZSBib3VuZGFyeS4KKwkJICovCisJCXBoeXNfYXZhaWxbaV0gPSByb3VuZF9wYWdlKHBoeXNfYXZh
aWxbaV0pOworCQlwaHlzX2F2YWlsW2kgKyAxXSA9IHRydW5jX3BhZ2UocGh5c19hdmFpbFtpICsg
MV0pOworCisJCWlmIChpIDwgMikKKwkJCWNvbnRpbnVlOworCQlpZiAocGh5c19hdmFpbFtpIC0g
Ml0gPiBwaHlzX2F2YWlsW2ldKSB7CisJCQl2bV9wYWRkcl90IHB0ZW1wWzJdOworCisJCQlwdGVt
cFswXSA9IHBoeXNfYXZhaWxbaSArIDBdOworCQkJcHRlbXBbMV0gPSBwaHlzX2F2YWlsW2kgKyAx
XTsKKworCQkJcGh5c19hdmFpbFtpICsgMF0gPSBwaHlzX2F2YWlsW2kgLSAyXTsKKwkJCXBoeXNf
YXZhaWxbaSArIDFdID0gcGh5c19hdmFpbFtpIC0gMV07CisKKwkJCXBoeXNfYXZhaWxbaSAtIDJd
ID0gcHRlbXBbMF07CisJCQlwaHlzX2F2YWlsW2kgLSAxXSA9IHB0ZW1wWzFdOworCQkJZ290byBh
Z2FpbjsKKwkJfQorCX0KKworCS8qCisJICogQ29weSB0aGUgcGh5c19hdmFpbFtdIGFycmF5IGJl
Zm9yZSB3ZSBzdGFydCBzdGVhbGluZyBtZW1vcnkgZnJvbSBpdC4KKwkgKi8KKwlmb3IgKGkgPSAw
OyBwaHlzX2F2YWlsW2kgKyAxXSAhPSAwOyBpICs9IDIpIHsKKwkJcGh5c21lbV9kZXNjW2ldID0g
cGh5c19hdmFpbFtpXTsKKwkJcGh5c21lbV9kZXNjW2kgKyAxXSA9IHBoeXNfYXZhaWxbaSArIDFd
OworCX0KKworCU1heG1lbSA9IGF0b3AocGh5c19hdmFpbFtpIC0gMV0pOworCisJaWYgKGJvb3R2
ZXJib3NlKSB7CisJCXByaW50ZigiUGh5c2ljYWwgbWVtb3J5IGNodW5rKHMpOlxuIik7CisJCWZv
ciAoaSA9IDA7IHBoeXNfYXZhaWxbaSArIDFdICE9IDA7IGkgKz0gMikgeworCQkJdm1fcGFkZHJf
dCBzaXplOworCisJCQlzaXplID0gcGh5c19hdmFpbFtpICsgMV0gLSBwaHlzX2F2YWlsW2ldOwor
CQkJcHJpbnRmKCIlIzA4anggLSAlIzA4angsICVqdSBieXRlcyAoJWp1IHBhZ2VzKVxuIiwKKwkJ
CSAgICAodWludG1heF90KSBwaHlzX2F2YWlsW2ldLAorCQkJICAgICh1aW50bWF4X3QpIHBoeXNf
YXZhaWxbaSArIDFdIC0gMSwKKwkJCSAgICAodWludG1heF90KSBzaXplLCAodWludG1heF90KSBz
aXplIC8gUEFHRV9TSVpFKTsKKwkJfQorCQlwcmludGYoIk1heG1lbSBpcyAweCUwanhcbiIsIHB0
b2EoKHVpbnRtYXhfdClNYXhtZW0pKTsKKwl9CisJLyoKKwkgKiBTdGVhbCB0aGUgbWVzc2FnZSBi
dWZmZXIgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIG1lbW9yeS4KKwkgKi8KKwltc2didWZwID0gKHN0
cnVjdCBtc2didWYgKilwbWFwX3N0ZWFsX21lbW9yeShtc2didWZzaXplKTsKKwltc2didWZpbml0
KG1zZ2J1ZnAsIG1zZ2J1ZnNpemUpOworCisJLyoKKwkgKiBTdGVhbCB0aHJlYWQwIGtzdGFjay4g
VGhpcyBtdXN0IGJlIGFsaWduZWQgdG8KKwkgKiAoS1NUQUNLX1BBR0VfU0laRSAqIDIpIHNvIGl0
IGNhbiBtYXBwZWQgdG8gYSBzaW5nbGUgVExCIGVudHJ5LgorCSAqCisJICovCisJa3N0YWNrMCA9
IHBtYXBfc3RlYWxfbWVtb3J5KChLU1RBQ0tfUEFHRVMgICsgS1NUQUNLX0dVQVJEX1BBR0VTKSA8
PAorCSAgICBQQUdFX1NISUZUKTsKKwlrc3RhY2swID0gcm91bmR1cDIoa3N0YWNrMCwgKEtTVEFD
S19QQUdFX1NJWkUgKiAyKSk7CisKKwl2aXJ0dWFsX2F2YWlsID0gVk1fTUlOX0tFUk5FTF9BRERS
RVNTOworCXZpcnR1YWxfZW5kID0gVk1fTUFYX0tFUk5FTF9BRERSRVNTOworCisjaWZkZWYgU01Q
CisJLyoKKwkgKiBTdGVhbCBzb21lIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSB0byBtYXAgdGhlIHBj
cHUgYXJlYS4KKwkgKi8KKwl2aXJ0dWFsX2F2YWlsID0gcm91bmR1cDIodmlydHVhbF9hdmFpbCwg
UEFHRV9TSVpFICogMik7CisJcGNwdXAgPSAoc3RydWN0IHBjcHUgKil2aXJ0dWFsX2F2YWlsOwor
CXZpcnR1YWxfYXZhaWwgKz0gUEFHRV9TSVpFICogMjsKKworCS8qCisJICogSW5pdGlhbGl6ZSB0
aGUgd2lyZWQgVExCIGVudHJ5IG1hcHBpbmcgdGhlIHBjcHUgcmVnaW9uIGZvcgorCSAqIHRoZSBC
U1AgYXQgJ3BjcHVwJy4gVXAgdW50aWwgdGhpcyBwb2ludCB3ZSB3ZXJlIG9wZXJhdGluZworCSAq
IHdpdGggdGhlICdwY3B1cCcgZm9yIHRoZSBCU1AgcG9pbnRpbmcgdG8gYSB2aXJ0dWFsIGFkZHJl
c3MKKwkgKiBpbiBLU0VHMCBzbyB0aGVyZSB3YXMgbm8gbmVlZCBmb3IgYSBUTEIgbWFwcGluZy4K
KwkgKi8KKwltaXBzX3BjcHVfdGxiX2luaXQoUENQVV9BRERSKDApKTsKKworCWlmIChib290dmVy
Ym9zZSkKKwkJcHJpbnRmKCJwY3B1IGlzIGF2YWlsYWJsZSBhdCB2aXJ0dWFsIGFkZHJlc3MgJXAu
XG4iLCBwY3B1cCk7CisjZW5kaWYKKworCXBtYXBfY3JlYXRlX2tlcm5lbF9wYWdldGFibGUoKTsK
KwlwbWFwX21heF9hc2lkID0gVk1OVU1fUElEUzsKKwltaXBzX3dyX2VudHJ5aGkoMCk7CisJbWlw
c193cl9wYWdlbWFzaygwKTsKKworCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgZ2xvYmFsIHB2IGxp
c3QgbG9jay4KKwkgKi8KKwlyd19pbml0KCZwdmhfZ2xvYmFsX2xvY2ssICJwbWFwIHB2IGdsb2Jh
bCIpOworfQorCisvKgorICogSW5pdGlhbGl6ZSBhIHZtX3BhZ2UncyBtYWNoaW5lLWRlcGVuZGVu
dCBmaWVsZHMuCisgKi8KK3ZvaWQKK3BtYXBfcGFnZV9pbml0KHZtX3BhZ2VfdCBtKQoreworCisJ
VEFJTFFfSU5JVCgmbS0+bWQucHZfbGlzdCk7CisJbS0+bWQucHZfbWVtYXR0ciA9IFZNX01FTUFU
VFJfREVGQVVMVDsKK30KKworLyoKKyAqCUluaXRpYWxpemUgdGhlIHBtYXAgbW9kdWxlLgorICoJ
Q2FsbGVkIGJ5IHZtX2luaXQsIHRvIGluaXRpYWxpemUgYW55IHN0cnVjdHVyZXMgdGhhdCB0aGUg
cG1hcAorICoJc3lzdGVtIG5lZWRzIHRvIG1hcCB2aXJ0dWFsIG1lbW9yeS4KKyAqLwordm9pZAor
cG1hcF9pbml0KHZvaWQpCit7CisJaW50IGk7CisJdm1fc2l6ZV90IHM7CisJaW50IHB2X25wZzsK
KworCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgcHYgY2h1bmsgbGlzdCBtdXRleC4KKwkgKi8KKwlt
dHhfaW5pdCgmcHZfY2h1bmtzX211dGV4LCAicG1hcCBwdiBjaHVuayBsaXN0IiwgTlVMTCwgTVRY
X0RFRik7CisKKwkvKgorCSAqIEluaXRpYWxpemUgdGhlIHBvb2wgb2YgcHYgbGlzdCBsb2Nrcy4K
KwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTlBWX0xJU1RfTE9DS1M7IGkrKykKKwkJcndfaW5pdCgm
cHZfbGlzdF9sb2Nrc1tpXSwgInB2IGxpc3QiKTsKKworCS8qCisJICogQ2FsY3VsYXRlIHRoZSBz
aXplIG9mIHRoZSBwdiBoZWFkIHRhYmxlIGZvciBzdXBlcnBhZ2VzLgorCSAqLworCWZvciAoaSA9
IDA7IHBoeXNfYXZhaWxbaSArIDFdOyBpICs9IDIpOworCXB2X25wZyA9IHJvdW5kXzJtcGFnZShw
aHlzX2F2YWlsWyhpIC0gMikgKyAxXSkgLyBOQlBEUjsKKworCS8qCisJICogQWxsb2NhdGUgbWVt
b3J5IGZvciB0aGUgcHYgaGVhZCB0YWJsZSBmb3Igc3VwZXJwYWdlcy4KKwkgKi8KKwlzID0gKHZt
X3NpemVfdCkocHZfbnBnICogc2l6ZW9mKHN0cnVjdCBtZF9wYWdlKSk7CisJcyA9IHJvdW5kX3Bh
Z2Uocyk7CisJcHZfdGFibGUgPSAoc3RydWN0IG1kX3BhZ2UgKilrbWVtX21hbGxvYyhrZXJuZWxf
YXJlbmEsIHMsCisJICAgIE1fV0FJVE9LIHwgTV9aRVJPKTsKKwlmb3IgKGkgPSAwOyBpIDwgcHZf
bnBnOyBpKyspCisJCVRBSUxRX0lOSVQoJnB2X3RhYmxlW2ldLnB2X2xpc3QpOworfQorCitzdGF0
aWMgU1lTQ1RMX05PREUoX3ZtX3BtYXAsIE9JRF9BVVRPLCBwZGUsIENUTEZMQUdfUkQsIDAsCisg
ICAgIjJNQiBwYWdlIG1hcHBpbmcgY291bnRlcnMiKTsKKworc3RhdGljIHVfbG9uZyBwbWFwX3Bk
ZV9kZW1vdGlvbnM7CitTWVNDVExfVUxPTkcoX3ZtX3BtYXBfcGRlLCBPSURfQVVUTywgZGVtb3Rp
b25zLCBDVExGTEFHX1JELAorICAgICZwbWFwX3BkZV9kZW1vdGlvbnMsIDAsICIyTUIgcGFnZSBk
ZW1vdGlvbnMiKTsKKworc3RhdGljIHVfbG9uZyBwbWFwX3BkZV9tYXBwaW5nczsKK1NZU0NUTF9V
TE9ORyhfdm1fcG1hcF9wZGUsIE9JRF9BVVRPLCBtYXBwaW5ncywgQ1RMRkxBR19SRCwKKyAgICAm
cG1hcF9wZGVfbWFwcGluZ3MsIDAsICIyTUIgcGFnZSBtYXBwaW5ncyIpOworCitzdGF0aWMgdV9s
b25nIHBtYXBfcGRlX3BfZmFpbHVyZXM7CitTWVNDVExfVUxPTkcoX3ZtX3BtYXBfcGRlLCBPSURf
QVVUTywgcF9mYWlsdXJlcywgQ1RMRkxBR19SRCwKKyAgICAmcG1hcF9wZGVfcF9mYWlsdXJlcywg
MCwgIjJNQiBwYWdlIHByb21vdGlvbiBmYWlsdXJlcyIpOworCitzdGF0aWMgdV9sb25nIHBtYXBf
cGRlX3Byb21vdGlvbnM7CitTWVNDVExfVUxPTkcoX3ZtX3BtYXBfcGRlLCBPSURfQVVUTywgcHJv
bW90aW9ucywgQ1RMRkxBR19SRCwKKyAgICAmcG1hcF9wZGVfcHJvbW90aW9ucywgMCwgIjJNQiBw
YWdlIHByb21vdGlvbnMiKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKgorICogTG93IGxldmVsIGhlbHBlciByb3V0aW5lcy4uLi4uCisgKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZk
ZWYJU01QCitzdGF0aWMgX19pbmxpbmUgdm9pZAorcG1hcF9jYWxsX29uX2FjdGl2ZV9jcHVzKHBt
YXBfdCBwbWFwLCB2b2lkICgqZm4pKHZvaWQgKiksIHZvaWQgKmFyZykKK3sKKwlpbnQJY3B1aWQs
IGNwdSwgc2VsZjsKKwljcHVzZXRfdCBhY3RpdmVfY3B1czsKKworCXNjaGVkX3BpbigpOworCWlm
IChpc19rZXJuZWxfcG1hcChwbWFwKSkgeworCQlzbXBfcmVuZGV6dm91cyhOVUxMLCBmbiwgTlVM
TCwgYXJnKTsKKwkJZ290byBvdXQ7CisJfQorCS8qIEZvcmNlIEFTSUQgdXBkYXRlIG9uIGluYWN0
aXZlIENQVXMgKi8KKwlDUFVfRk9SRUFDSChjcHUpIHsKKwkJaWYgKCFDUFVfSVNTRVQoY3B1LCAm
cG1hcC0+cG1fYWN0aXZlKSkKKwkJCXBtYXAtPnBtX2FzaWRbY3B1XS5nZW4gPSAwOworCX0KKwlj
cHVpZCA9IFBDUFVfR0VUKGNwdWlkKTsKKwkvKgorCSAqIFhYWDogYmFycmllci9sb2NraW5nIGZv
ciBhY3RpdmU/CisJICoKKwkgKiBUYWtlIGEgc25hcHNob3Qgb2YgYWN0aXZlIGhlcmUsIGFueSBm
dXJ0aGVyIGNoYW5nZXMgYXJlIGlnbm9yZWQuCisJICogdGxiIHVwZGF0ZS9pbnZhbGlkYXRlIHNo
b3VsZCBiZSBoYXJtbGVzcyBvbiBpbmFjdGl2ZSBDUFVzCisJICovCisJYWN0aXZlX2NwdXMgPSBw
bWFwLT5wbV9hY3RpdmU7CisJc2VsZiA9IENQVV9JU1NFVChjcHVpZCwgJmFjdGl2ZV9jcHVzKTsK
KwlDUFVfQ0xSKGNwdWlkLCAmYWN0aXZlX2NwdXMpOworCS8qIE9wdGltaXplIGZvciB0aGUgY2Fz
ZSB3aGVyZSB0aGlzIGNwdSBpcyB0aGUgb25seSBhY3RpdmUgb25lICovCisJaWYgKENQVV9FTVBU
WSgmYWN0aXZlX2NwdXMpKSB7CisJCWlmIChzZWxmKQorCQkJZm4oYXJnKTsKKwl9IGVsc2Ugewor
CQlpZiAoc2VsZikKKwkJCUNQVV9TRVQoY3B1aWQsICZhY3RpdmVfY3B1cyk7CisJCXNtcF9yZW5k
ZXp2b3VzX2NwdXMoYWN0aXZlX2NwdXMsIE5VTEwsIGZuLCBOVUxMLCBhcmcpOworCX0KK291dDoK
KwlzY2hlZF91bnBpbigpOworfQorI2Vsc2UgLyogIVNNUCAqLworc3RhdGljIF9faW5saW5lIHZv
aWQKK3BtYXBfY2FsbF9vbl9hY3RpdmVfY3B1cyhwbWFwX3QgcG1hcCwgdm9pZCAoKmZuKSh2b2lk
ICopLCB2b2lkICphcmcpCit7CisJaW50CWNwdWlkOworCisJaWYgKGlzX2tlcm5lbF9wbWFwKHBt
YXApKSB7CisJCWZuKGFyZyk7CisJCXJldHVybjsKKwl9CisJY3B1aWQgPSBQQ1BVX0dFVChjcHVp
ZCk7CisJaWYgKCFDUFVfSVNTRVQoY3B1aWQsICZwbWFwLT5wbV9hY3RpdmUpKQorCQlwbWFwLT5w
bV9hc2lkW2NwdWlkXS5nZW4gPSAwOworCWVsc2UKKwkJZm4oYXJnKTsKK30KKyNlbmRpZiAvKiBT
TVAgKi8KKworc3RhdGljIHZvaWQKK3BtYXBfaW52YWxpZGF0ZV9hbGwocG1hcF90IHBtYXApCit7
CisKKwlwbWFwX2NhbGxfb25fYWN0aXZlX2NwdXMocG1hcCwKKwkgICAgKHZvaWQgKCopKHZvaWQg
KikpdGxiX2ludmFsaWRhdGVfYWxsX3VzZXIsIHBtYXApOworfQorCitzdHJ1Y3QgcG1hcF9pbnZh
bGlkYXRlX3BhZ2VfYXJnIHsKKwlwbWFwX3QgcG1hcDsKKwl2bV9vZmZzZXRfdCB2YTsKK307CisK
K3N0YXRpYyB2b2lkCitwbWFwX2ludmFsaWRhdGVfcGFnZV9hY3Rpb24odm9pZCAqYXJnKQorewor
CXN0cnVjdCBwbWFwX2ludmFsaWRhdGVfcGFnZV9hcmcgKnAgPSBhcmc7CisKKwl0bGJfaW52YWxp
ZGF0ZV9hZGRyZXNzKHAtPnBtYXAsIHAtPnZhKTsKK30KKworc3RhdGljIHZvaWQKK3BtYXBfaW52
YWxpZGF0ZV9wYWdlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSkKK3sKKwlzdHJ1Y3QgcG1h
cF9pbnZhbGlkYXRlX3BhZ2VfYXJnIGFyZzsKKworCWFyZy5wbWFwID0gcG1hcDsKKwlhcmcudmEg
PSB2YTsKKwlwbWFwX2NhbGxfb25fYWN0aXZlX2NwdXMocG1hcCwgcG1hcF9pbnZhbGlkYXRlX3Bh
Z2VfYWN0aW9uLCAmYXJnKTsKK30KKworc3RydWN0IHBtYXBfaW52YWxpZGF0ZV9yYW5nZV9hcmcg
eworCXBtYXBfdCBwbWFwOworCXZtX29mZnNldF90IHN2YTsKKwl2bV9vZmZzZXRfdCBldmE7Cit9
OworCitzdGF0aWMgdm9pZAorcG1hcF9pbnZhbGlkYXRlX3JhbmdlX2FjdGlvbih2b2lkICphcmcp
Cit7CisJc3RydWN0IHBtYXBfaW52YWxpZGF0ZV9yYW5nZV9hcmcgKnAgPSBhcmc7CisKKwl0bGJf
aW52YWxpZGF0ZV9yYW5nZShwLT5wbWFwLCBwLT5zdmEsIHAtPmV2YSk7Cit9CisKK3N0YXRpYyB2
b2lkCitwbWFwX2ludmFsaWRhdGVfcmFuZ2UocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHN2YSwg
dm1fb2Zmc2V0X3QgZXZhKQoreworCXN0cnVjdCBwbWFwX2ludmFsaWRhdGVfcmFuZ2VfYXJnIGFy
ZzsKKworCWFyZy5wbWFwID0gcG1hcDsKKwlhcmcuc3ZhID0gc3ZhOworCWFyZy5ldmEgPSBldmE7
CisJcG1hcF9jYWxsX29uX2FjdGl2ZV9jcHVzKHBtYXAsIHBtYXBfaW52YWxpZGF0ZV9yYW5nZV9h
Y3Rpb24sICZhcmcpOworfQorCitzdHJ1Y3QgcG1hcF91cGRhdGVfcGFnZV9hcmcgeworCXBtYXBf
dCBwbWFwOworCXZtX29mZnNldF90IHZhOworCXB0X2VudHJ5X3QgcHRlOworfTsKKworc3RhdGlj
IHZvaWQKK3BtYXBfdXBkYXRlX3BhZ2VfYWN0aW9uKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgcG1h
cF91cGRhdGVfcGFnZV9hcmcgKnAgPSBhcmc7CisKKwl0bGJfdXBkYXRlKHAtPnBtYXAsIHAtPnZh
LCBwLT5wdGUpOworfQorCitzdGF0aWMgdm9pZAorcG1hcF91cGRhdGVfcGFnZShwbWFwX3QgcG1h
cCwgdm1fb2Zmc2V0X3QgdmEsIHB0X2VudHJ5X3QgcHRlKQoreworCXN0cnVjdCBwbWFwX3VwZGF0
ZV9wYWdlX2FyZyBhcmc7CisKKwlhcmcucG1hcCA9IHBtYXA7CisJYXJnLnZhID0gdmE7CisJYXJn
LnB0ZSA9IHB0ZTsKKwlwbWFwX2NhbGxfb25fYWN0aXZlX2NwdXMocG1hcCwgcG1hcF91cGRhdGVf
cGFnZV9hY3Rpb24sICZhcmcpOworfQorCitzdGF0aWMgdm9pZAorcG1hcF91cGRhdGVfcGRlX2lu
dmFsaWRhdGUocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhLCBwdF9lbnRyeV90IG5ld3BkZSkK
K3sKKworCWlmICghcHRlX2lzXzFtX3N1cGVycGFnZSgmbmV3cGRlKSkgeworCQkvKiBEZW1vdGlv
bjogZmx1c2ggYSBzcGVjaWZpYyAybWIgcGFnZSBtYXBwaW5nLiAqLworCQl0bGJfaW52YWxpZGF0
ZV9yYW5nZShwbWFwLCAodmEgJiB+UERSTUFTSyksCisJCSAgICAodmEgJiB+UERSTUFTSykgKyBO
QlBEUik7CisJfSBlbHNlIGlmICghcHRlX3Rlc3QoJm5ld3BkZSwgUFRFX0cpKSB7CisJCS8qCisJ
CSAqIFByb21vdGlvbjogZmx1c2ggZXZlcnkgNEtCIHBhZ2UgbWFwcGluZyBmcm9tIHRoZSBUTEIK
KwkJICogYmVjYXVzZSB0aGVyZSBhcmUgdG9vIG1hbnkgdG8gZmx1c2ggaW5kaXZpZHVhbGx5Lgor
CQkgKi8KKwkJdGxiX2ludmFsaWRhdGVfYWxsX3VzZXIocG1hcCk7CisJfSBlbHNlIHsKKwkJLyoK
KwkJICogUHJvbW90aW9uOiBmbHVzaCBldmVyeSA0S0IgcGFnZSBtYXBwaW5nIGZyb20gdGhlIFRM
QiwKKwkJICogaW5jbHVkaW5nIGFueSBnbG9iYWwgKFBURV9HKSBtYXBwaW5ncy4KKwkJICovCisJ
CXRsYl9pbnZhbGlkYXRlX2FsbCgpOworCX0KK30KKworc3RydWN0IHBtYXBfdXBkYXRlX3BkZV9h
cmcgeworCXBtYXBfdCBwbWFwOworCXZtX29mZnNldF90IHZhOworCXBkX2VudHJ5X3QgKnBkZTsK
KwlwdF9lbnRyeV90IG5ld3BkZTsKK307CisKK3N0YXRpYyB2b2lkCitwbWFwX3VwZGF0ZV9wZGVf
YWN0aW9uKHZvaWQgKmFjdCkKK3sKKwlzdHJ1Y3QgcG1hcF91cGRhdGVfcGRlX2FyZyAqYXJnID0g
YWN0OworCisJcG1hcF91cGRhdGVfcGRlX2ludmFsaWRhdGUoYXJnLT5wbWFwLCBhcmctPnZhLCBh
cmctPm5ld3BkZSk7Cit9CisKK3N0YXRpYyB2b2lkCitwbWFwX3VwZGF0ZV9wZGVfc3RvcmUocG1h
cF90IHBtYXAsIHBkX2VudHJ5X3QgKnBkZSwgcHRfZW50cnlfdCBuZXdwZGUpCit7CisKKwlwZGVf
c3RvcmUocGRlLCBuZXdwZGUpOworfQorCisKKy8qCisgKiBDaGFuZ2UgdGhlIHBhZ2Ugc2l6ZSBm
b3IgdGhlIHNwZWNpZmllZCB2aXJ0dWFsIGFkZHJlc3MgaW4gYSB3YXkgdGhhdAorICogcHJldmVu
dHMgYW55IHBvc3NpYmlsaXR5IG9mIHRoZSBUTEIgZXZlciBoYXZpbmcgdHdvIGVudHJpZXMgdGhh
dCBtYXAgdGhlCisgKiBzYW1lIHZpcnR1YWwgYWRkcmVzcyB1c2luZyBkaWZmZXJlbnQgcGFnZSBz
aXplcy4KKyAqLworc3RhdGljIHZvaWQKK3BtYXBfdXBkYXRlX3BkZShwbWFwX3QgcG1hcCwgdm1f
b2Zmc2V0X3QgdmEsIHBkX2VudHJ5X3QgKnBkZSwgcHRfZW50cnlfdCBuZXdwZGUpCit7CisJc3Ry
dWN0IHBtYXBfdXBkYXRlX3BkZV9hcmcgYXJnOworCisJYXJnLnBtYXAgPSBwbWFwOworCWFyZy52
YSA9IHZhOworCWFyZy5wZGUgPSBwZGU7CisJYXJnLm5ld3BkZSA9IG5ld3BkZTsKKworCXBtYXBf
dXBkYXRlX3BkZV9zdG9yZShwbWFwLCBwZGUsIG5ld3BkZSk7CisJcG1hcF9jYWxsX29uX2FjdGl2
ZV9jcHVzKHBtYXAsIHBtYXBfdXBkYXRlX3BkZV9hY3Rpb24sICZhcmcpOworfQorCisvKiAtLS0g
Ki8KKworLyoKKyAqCVJvdXRpbmU6CXBtYXBfZXh0cmFjdAorICoJRnVuY3Rpb246CisgKgkJRXh0
cmFjdCB0aGUgcGh5c2ljYWwgcGFnZSBhZGRyZXNzIGFzc29jaWF0ZWQKKyAqCQl3aXRoIHRoZSBn
aXZlbiBtYXAvdmlydHVhbF9hZGRyZXNzIHBhaXIuCisgKi8KK3ZtX3BhZGRyX3QKK3BtYXBfZXh0
cmFjdChwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEpCit7CisJcGRfZW50cnlfdCAqcGRlOwor
CXB0X2VudHJ5X3QgKnB0ZTsKKwl2bV9vZmZzZXRfdCBwYTsKKworCXBhID0gMDsKKwlQTUFQX0xP
Q0socG1hcCk7CisJcGRlID0gcG1hcF9wZGUocG1hcCwgdmEpOworCWlmIChwZGVfaXNfMW1fc3Vw
ZXJwYWdlKHBkZSkpIHsKKwkJcGEgPSBUTEJMT19QREVfVE9fUEEoKnBkZSkgfCAodmEgJiBQRFJN
QVNLKTsKKwl9IGVsc2UgeworCQlwdGUgPSBwbWFwX3BkZV90b19wdGUocGRlLCB2YSk7CisJCWlm
IChwdGUpCisJCQlwYSA9IFRMQkxPX1BURV9UT19QQSgqcHRlKSB8ICh2YSAmIFBBR0VfTUFTSyk7
CisJfQorCVBNQVBfVU5MT0NLKHBtYXApOworCXJldHVybiAocGEpOworfQorCisvKgorICoJUm91
dGluZToJcG1hcF9leHRyYWN0X2FuZF9ob2xkCisgKglGdW5jdGlvbjoKKyAqCQlBdG9taWNhbGx5
IGV4dHJhY3QgYW5kIGhvbGQgdGhlIHBoeXNpY2FsIHBhZ2UKKyAqCQl3aXRoIHRoZSBnaXZlbiBw
bWFwIGFuZCB2aXJ0dWFsIGFkZHJlc3MgcGFpcgorICoJCWlmIHRoYXQgbWFwcGluZyBwZXJtaXRz
IHRoZSBnaXZlbiBwcm90ZWN0aW9uLgorICovCit2bV9wYWdlX3QKK3BtYXBfZXh0cmFjdF9hbmRf
aG9sZChwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEsIHZtX3Byb3RfdCBwcm90KQoreworCXBk
X2VudHJ5X3QgKnBkZXA7CisJcHRfZW50cnlfdCBwdGUsICpwdGVwOworCXZtX3BhZGRyX3QgcGEs
IHB0ZV9wYTsKKwl2bV9wYWdlX3QgbTsKKwl2bV9wYWRkcl90IHBkZV9wYTsKKworCXBhID0gMDsK
KwltID0gTlVMTDsKKwlQTUFQX0xPQ0socG1hcCk7CityZXRyeToKKwlwZGVwID0gcG1hcF9wZGUo
cG1hcCwgdmEpOworCWlmIChwZGVwICE9IE5VTEwgJiYgKnBkZXAgIT0gTlVMTCkgeworCQlpZiAo
cGRlX2lzXzFtX3N1cGVycGFnZShwZGVwKSkgeworCQkJaWYgKCFwZGVfdGVzdChwZGVwLCBQVEVf
Uk8pIHx8CisJCQkgICAgKHByb3QgJiBWTV9QUk9UX1dSSVRFKSA9PSAwKSB7CisJCQkJcGRlX3Bh
ID0gVExCTE9fUERFX1RPX1BBKCpwZGVwKSB8CisJCQkJICAgICh2YSAmIFBEUk1BU0spOworCQkJ
CWlmICh2bV9wYWdlX3BhX3RyeXJlbG9jayhwbWFwLCBwZGVfcGEsICZwYSkpCisJCQkJCWdvdG8g
cmV0cnk7CisJCQkJbSA9IFBIWVNfVE9fVk1fUEFHRShwZGVfcGEpOworCQkJCXZtX3BhZ2VfaG9s
ZChtKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXB0ZXAgPSBwbWFwX3BkZV90b19wdGUocGRlcCwg
dmEpOworCQkJaWYgKHB0ZXAgIT0gTlVMTCkgeworCQkJCXB0ZSA9ICpwdGVwOworCQkJCWlmIChw
dGVfaXNfdmFsaWQoJnB0ZSkgJiYKKwkJCQkgICAgKCFwdGVfdGVzdCgmcHRlLCBQVEVfUk8pIHx8
CisJCQkJICAgIChwcm90ICYgVk1fUFJPVF9XUklURSkgPT0gMCkpIHsKKwkJCQkJcHRlX3BhID0g
VExCTE9fUFRFX1RPX1BBKHB0ZSk7CisJCQkJCWlmICh2bV9wYWdlX3BhX3RyeXJlbG9jayhwbWFw
LCBwdGVfcGEsCisJCQkJCSAgICAmcGEpKQorCQkJCQkJZ290byByZXRyeTsKKwkJCQkJbSA9IFBI
WVNfVE9fVk1fUEFHRShwdGVfcGEpOworCQkJCQl2bV9wYWdlX2hvbGQobSk7CisJCQkJfQorCQkJ
fQorCQl9CisJfQorCVBBX1VOTE9DS19DT05EKHBhKTsKKwlQTUFQX1VOTE9DSyhwbWFwKTsKKwly
ZXR1cm4gKG0pOworfQorCisvKi0KKyAqCVJvdXRpbmU6CXBtYXBfa2V4dHJhY3QKKyAqCUZ1bmN0
aW9uOgorICoJCUV4dHJhY3QgdGhlIHBoeXNpY2FsIHBhZ2UgYWRkcmVzcyBhc3NvY2lhdGVkCisg
KgkJdmlydHVhbCBhZGRyZXNzLgorICovCit2bV9wYWRkcl90CitwbWFwX2tleHRyYWN0KHZtX29m
ZnNldF90IHZhKQoreworCWludCBtYXBwZWQ7CisKKwkvKgorCSAqIEZpcnN0LCB0aGUgZGlyZWN0
LW1hcHBlZCByZWdpb25zLgorCSAqLworCWlmICh2YSA+PSBNSVBTX1hLUEhZU19TVEFSVCAmJiB2
YSA8IE1JUFNfWEtQSFlTX0VORCkKKwkJcmV0dXJuIChNSVBTX1hLUEhZU19UT19QSFlTKHZhKSk7
CisKKwlpZiAodmEgPj0gTUlQU19LU0VHMF9TVEFSVCAmJiB2YSA8IE1JUFNfS1NFRzBfRU5EKQor
CQlyZXR1cm4gKE1JUFNfS1NFRzBfVE9fUEhZUyh2YSkpOworCisJaWYgKHZhID49IE1JUFNfS1NF
RzFfU1RBUlQgJiYgdmEgPCBNSVBTX0tTRUcxX0VORCkKKwkJcmV0dXJuIChNSVBTX0tTRUcxX1RP
X1BIWVModmEpKTsKKworCS8qCisJICogVXNlciB2aXJ0dWFsIGFkZHJlc3Nlcy4KKwkgKi8KKwlp
ZiAodmEgPCBWTV9NQVhVU0VSX0FERFJFU1MpIHsKKwkJcGRfZW50cnlfdCAqcGRlcDsKKwkJcHRf
ZW50cnlfdCAqcHRlcDsKKworCQlpZiAoY3VycHJvYyAmJiBjdXJwcm9jLT5wX3Ztc3BhY2UpIHsK
KwkJCXBkZXAgPSBwbWFwX3BkZSgmY3VycHJvYy0+cF92bXNwYWNlLT52bV9wbWFwLCB2YSk7CisJ
CQlpZiAocGRlcCA9PSBOVUxMIHx8ICpwZGVwID09IE5VTEwpCisJCQkJcmV0dXJuICgwKTsKKwkJ
CWlmIChwZGVfaXNfMW1fc3VwZXJwYWdlKHBkZXApKSB7CisJCQkJcHRlcCA9IChwdF9lbnRyeV90
ICopcGRlcDsKKwkJCQlyZXR1cm4gKFRMQkxPX1BURV9UT19QQSgqcHRlcCkgfAorCQkJCSAgICAo
dmEgJiBQRFJNQVNLKSk7CisJCQl9CisJCQlwdGVwID0gcG1hcF9wZGVfdG9fcHRlKHBkZXAsIHZh
KTsKKwkJCWlmIChwdGVwKSB7CisJCQkJcmV0dXJuIChUTEJMT19QVEVfVE9fUEEoKnB0ZXApIHwK
KwkJCQkgICAgKHZhICYgUEFHRV9NQVNLKSk7CisJCQl9CisJCQlyZXR1cm4gKDApOworCQl9CisJ
fQorCisJLyoKKwkgKiBTaG91bGQgYmUga2VybmVsIHZpcnR1YWwgaGVyZSwgb3RoZXJ3aXNlIGZh
aWwKKwkgKi8KKwltYXBwZWQgPSAodmEgPj0gTUlQU19LU0VHMl9TVEFSVCB8fCB2YSA8IE1JUFNf
S1NFRzJfRU5EKTsKKwltYXBwZWQgPSBtYXBwZWQgfHwgKHZhID49IE1JUFNfWEtTRUdfU1RBUlQg
fHwgdmEgPCBNSVBTX1hLU0VHX0VORCk7CisJLyoKKwkgKiBLZXJuZWwgdmlydHVhbC4KKwkgKi8K
KworCWlmIChtYXBwZWQpIHsKKwkJcGRfZW50cnlfdCAqcGRlcDsKKwkJcHRfZW50cnlfdCAqcHRl
cDsKKworCQkvKiBJcyB0aGUga2VybmVsIHBtYXAgaW5pdGlhbGl6ZWQ/ICovCisJCWlmICghQ1BV
X0VNUFRZKCZrZXJuZWxfcG1hcC0+cG1fYWN0aXZlKSkgeworCQkJLyogSXQncyBpbnNpZGUgdGhl
IHZpcnR1YWwgYWRkcmVzcyByYW5nZSAqLworCQkJcGRlcCA9IHBtYXBfcGRlKGtlcm5lbF9wbWFw
LCB2YSk7CisJCQlpZiAocGRlcCA9PSBOVUxMIHx8ICpwZGVwID09IE5VTEwpCisJCQkJcmV0dXJu
ICgwKTsKKwkJCWlmIChwZGVfaXNfMW1fc3VwZXJwYWdlKHBkZXApKSB7CisJCQkJcHRlcCA9IChw
dF9lbnRyeV90ICopcGRlcDsKKwkJCQlyZXR1cm4gKFRMQkxPX1BURV9UT19QQSgqcHRlcCkgfAor
CQkJCSAgICAodmEgJiBQRFJNQVNLKSk7CisJCQl9CisJCQlwdGVwID0gcG1hcF9wZGVfdG9fcHRl
KHBkZXAsIHZhKTsKKwkJCWlmIChwdGVwKSB7CisJCQkJcmV0dXJuIChUTEJMT19QVEVfVE9fUEEo
KnB0ZXApIHwKKwkJCQkgICAgKHZhICYgUEFHRV9NQVNLKSk7CisJCQl9CisJCX0KKwkJcmV0dXJu
ICgwKTsKKwl9CisKKwlwYW5pYygiJXMgZm9yIHVua25vd24gYWRkcmVzcyBzcGFjZSAlcC4iLCBf
X2Z1bmNfXywgKHZvaWQgKil2YSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioKKyAqIExvdyBsZXZlbCBtYXBwaW5nIHJvdXRpbmVzLi4u
Li4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiov
CisKKy8qLQorICogYWRkIGEgd2lyZWQgcGFnZSB0byB0aGUga3ZhCisgKi8KK3ZvaWQKK3BtYXBf
a2VudGVyX2F0dHIodm1fb2Zmc2V0X3QgdmEsIHZtX3BhZGRyX3QgcGEsIGludCBhdHRyKQorewor
CXB0X2VudHJ5X3QgKnB0ZTsKKwlwdF9lbnRyeV90IG9wdGUsIG5wdGU7CisKKyNpZmRlZiBQTUFQ
X0RFQlVHCisJcHJpbnRmKCJwbWFwX2tlbnRlcjogIHZhOiAlcCAtPiBwYTogJXBcbiIsICh2b2lk
ICopdmEsICh2b2lkICopcGEpOworI2VuZGlmCisKKwlwdGUgPSBwbWFwX3B0ZShrZXJuZWxfcG1h
cCwgdmEpOworCW9wdGUgPSAqcHRlOworCW5wdGUgPSBUTEJMT19QQV9UT19QRk4ocGEpIHwgYXR0
ciB8IFBURV9EIHwgUFRFX1JFRiB8IFBURV9WQUxJRCB8IFBURV9HOworCXB0ZV9zdG9yZShwdGUs
IG5wdGUpOworCWlmIChwdGVfaXNfdmFsaWQoJm9wdGUpICYmIG9wdGUgIT0gbnB0ZSkKKwkJcG1h
cF91cGRhdGVfcGFnZShrZXJuZWxfcG1hcCwgdmEsIG5wdGUpOworfQorCit2b2lkCitwbWFwX2tl
bnRlcih2bV9vZmZzZXRfdCB2YSwgdm1fcGFkZHJfdCBwYSkKK3sKKworCUtBU1NFUlQoaXNfY2Fj
aGVhYmxlX21lbShwYSksCisJCSgicG1hcF9rZW50ZXI6IG1lbW9yeSBhdCAweCVseCBpcyBub3Qg
Y2FjaGVhYmxlIiwgKHVfbG9uZylwYSkpOworCisJcG1hcF9rZW50ZXJfYXR0cih2YSwgcGEsIFBU
RV9DX0NBQ0hFKTsKK30KKworLyotCisgKiByZW1vdmUgYSBwYWdlIGZyb20gdGhlIGtlcm5lbCBw
YWdldGFibGVzCisgKi8KKyAvKiBQTUFQX0lOTElORSAqLyB2b2lkCitwbWFwX2tyZW1vdmUodm1f
b2Zmc2V0X3QgdmEpCit7CisJcHRfZW50cnlfdCAqcHRlOworCisJLyoKKwkgKiBXcml0ZSBiYWNr
IGFsbCBjYWNoZXMgZnJvbSB0aGUgcGFnZSBiZWluZyBkZXN0cm95ZWQKKwkgKi8KKwltaXBzX2Rj
YWNoZV93Ymludl9yYW5nZV9pbmRleCh2YSwgUEFHRV9TSVpFKTsKKworCXB0ZSA9IHBtYXBfcHRl
KGtlcm5lbF9wbWFwLCB2YSk7CisJcHRlX3N0b3JlKHB0ZSwgUFRFX0cpOworCXBtYXBfaW52YWxp
ZGF0ZV9wYWdlKGtlcm5lbF9wbWFwLCB2YSk7Cit9CisKKy8qCisgKglVc2VkIHRvIG1hcCBhIHJh
bmdlIG9mIHBoeXNpY2FsIGFkZHJlc3NlcyBpbnRvIGtlcm5lbAorICoJdmlydHVhbCBhZGRyZXNz
IHNwYWNlLgorICoKKyAqCVRoZSB2YWx1ZSBwYXNzZWQgaW4gJyp2aXJ0JyBpcyBhIHN1Z2dlc3Rl
ZCB2aXJ0dWFsIGFkZHJlc3MgZm9yCisgKgl0aGUgbWFwcGluZy4gQXJjaGl0ZWN0dXJlcyB3aGlj
aCBjYW4gc3VwcG9ydCBhIGRpcmVjdC1tYXBwZWQKKyAqCXBoeXNpY2FsIHRvIHZpcnR1YWwgcmVn
aW9uIGNhbiByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIGFkZHJlc3MKKyAqCXdpdGhpbiB0aGF0IHJl
Z2lvbiwgbGVhdmluZyAnKnZpcnQnIHVuY2hhbmdlZC4gT3RoZXIKKyAqCWFyY2hpdGVjdHVyZXMg
c2hvdWxkIG1hcCB0aGUgcGFnZXMgc3RhcnRpbmcgYXQgJyp2aXJ0JyBhbmQKKyAqCXVwZGF0ZSAn
KnZpcnQnIHdpdGggdGhlIGZpcnN0IHVzYWJsZSBhZGRyZXNzIGFmdGVyIHRoZSBtYXBwZWQKKyAq
CXJlZ2lvbi4KKyAqCisgKglVc2UgWEtQSFlTIGZvciA2NCBiaXQuCisgKi8KK3ZtX29mZnNldF90
CitwbWFwX21hcCh2bV9vZmZzZXRfdCAqdmlydCwgdm1fcGFkZHJfdCBzdGFydCwgdm1fcGFkZHJf
dCBlbmQsIGludCBwcm90KQoreworCisJcmV0dXJuIChNSVBTX1BIWVNfVE9fRElSRUNUKHN0YXJ0
KSk7Cit9CisKKy8qLQorICogQWRkIGEgbGlzdCBvZiB3aXJlZCBwYWdlcyB0byB0aGUga3ZhCisg
KiB0aGlzIHJvdXRpbmUgaXMgb25seSB1c2VkIGZvciB0ZW1wb3JhcnkKKyAqIGtlcm5lbCBtYXBw
aW5ncyB0aGF0IGRvIG5vdCBuZWVkIHRvIGhhdmUKKyAqIHBhZ2UgbW9kaWZpY2F0aW9uIG9yIHJl
ZmVyZW5jZXMgcmVjb3JkZWQuCisgKiBOb3RlIHRoYXQgb2xkIG1hcHBpbmdzIGFyZSBzaW1wbHkg
d3JpdHRlbgorICogb3Zlci4gIFRoZSBwYWdlICptdXN0KiBiZSB3aXJlZC4KKyAqLwordm9pZAor
cG1hcF9xZW50ZXIodm1fb2Zmc2V0X3QgdmEsIHZtX3BhZ2VfdCAqbSwgaW50IGNvdW50KQorewor
CWludCBpOworCXZtX29mZnNldF90IG9yaWd2YSA9IHZhOworCisJZm9yIChpID0gMDsgaSA8IGNv
dW50OyBpKyspIHsKKwkJcG1hcF9mbHVzaF9wdmNhY2hlKG1baV0pOworCQlwbWFwX2tlbnRlcih2
YSwgVk1fUEFHRV9UT19QSFlTKG1baV0pKTsKKwkJdmEgKz0gUEFHRV9TSVpFOworCX0KKworCW1p
cHNfZGNhY2hlX3diaW52X3JhbmdlX2luZGV4KG9yaWd2YSwgUEFHRV9TSVpFKmNvdW50KTsKK30K
KworLyotCisgKiBUaGlzIHJvdXRpbmUgamVya3MgcGFnZSBtYXBwaW5ncyBmcm9tIHRoZQorICog
a2VybmVsIC0tIGl0IGlzIG1lYW50IG9ubHkgZm9yIHRlbXBvcmFyeSBtYXBwaW5ncy4KKyAqLwor
dm9pZAorcG1hcF9xcmVtb3ZlKHZtX29mZnNldF90IHZhLCBpbnQgY291bnQpCit7CisJcHRfZW50
cnlfdCAqcHRlOworCXZtX29mZnNldF90IG9yaWd2YTsKKworCWlmIChjb3VudCA8IDEpCisJCXJl
dHVybjsKKwltaXBzX2RjYWNoZV93Ymludl9yYW5nZV9pbmRleCh2YSwgUEFHRV9TSVpFICogY291
bnQpOworCW9yaWd2YSA9IHZhOworCWRvIHsKKwkJcHRlID0gcG1hcF9wdGUoa2VybmVsX3BtYXAs
IHZhKTsKKwkJcHRlX3N0b3JlKHB0ZSwgUFRFX0cpOworCQl2YSArPSBQQUdFX1NJWkU7CisJfSB3
aGlsZSAoLS1jb3VudCA+IDApOworCXBtYXBfaW52YWxpZGF0ZV9yYW5nZShrZXJuZWxfcG1hcCwg
b3JpZ3ZhLCB2YSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioKKyAqIFBhZ2UgdGFibGUgcGFnZSBtYW5hZ2VtZW50IHJvdXRpbmVzLi4u
Li4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiov
CitzdGF0aWMgX19pbmxpbmUgdm9pZAorcG1hcF9mcmVlX3plcm9fcGFnZXMoc3RydWN0IHNwZ2xp
c3QgKmZyZWUpCit7CisJdm1fcGFnZV90IG07CisKKwl3aGlsZSAoKG0gPSBTTElTVF9GSVJTVChm
cmVlKSkgIT0gTlVMTCkgeworCQlTTElTVF9SRU1PVkVfSEVBRChmcmVlLCBwbGlua3Mucy5zcyk7
CisJCS8qIFByZXNlcnZlIHRoZSBwYWdlJ3MgUEdfWkVSTyBzZXR0aW5nLiAqLworCQl2bV9wYWdl
X2ZyZWVfdG9xKG0pOworCX0KK30KKworLyotCisgKiBTY2hlZHVsZSB0aGUgc3BlY2lmaWVkIHVu
dXNlZCBwYWdlIHRhYmxlIHBhZ2UgdG8gYmUgZnJlZWQuICBTcGVjaWZpY2FsbHkKKyAqIGFkZCB0
aGUgcGFnZSB0byB0aGUgc3BlY2lmaWVkIGxpc3Qgb2YgcGFnZXMgdGhhdCB3aWxsIGJlIHJlbGVh
c2VkIHRvIHRoZQorICogcGh5c2ljYWwgbWVtb3J5IG1hbmFnZXIgYWZ0ZXIgdGhlIFRMQiBoYXMg
YmVlbiB1cGRhdGVkLgorICovCitzdGF0aWMgX19pbmxpbmUgdm9pZAorcG1hcF9hZGRfZGVsYXll
ZF9mcmVlX2xpc3Qodm1fcGFnZV90IG0sIHN0cnVjdCBzcGdsaXN0ICpmcmVlLAorICAgIGJvb2xl
YW5fdCBzZXRfUEdfWkVSTykKK3sKKworCWlmIChzZXRfUEdfWkVSTykKKwkJbS0+ZmxhZ3MgfD0g
UEdfWkVSTzsKKwllbHNlCisJCW0tPmZsYWdzICY9IH5QR19aRVJPOworCVNMSVNUX0lOU0VSVF9I
RUFEKGZyZWUsIG0sIHBsaW5rcy5zLnNzKTsKK30KKworLyoKKyAqIEluc2VydHMgdGhlIHNwZWNp
ZmllZCBwYWdlIHRhYmxlIHBhZ2UgaW50byB0aGUgc3BlY2lmaWVkIHBtYXAncyBjb2xsZWN0aW9u
CisgKiBvZiBpZGxlIHBhZ2UgdGFibGUgcGFnZXMuICBFYWNoIG9mIGEgcG1hcCdzIHBhZ2UgdGFi
bGUgcGFnZXMgaXMgcmVzcG9uc2libGUKKyAqIGZvciBtYXBwaW5nIGEgZGlzdGluY3QgcmFuZ2Ug
b2YgdmlydHVhbCBhZGRyZXNzZXMuICBUaGUgcG1hcCdzIGNvbGxlY3Rpb24gaXMKKyAqIG9yZGVy
ZWQgYnkgdGhpcyB2aXJ0dWFsIGFkZHJlc3MgcmFuZ2UuCisgKi8KK3N0YXRpYyBfX2lubGluZSBp
bnQKK3BtYXBfaW5zZXJ0X3B0X3BhZ2UocG1hcF90IHBtYXAsIHZtX3BhZ2VfdCBtcHRlKQorewor
CisJUE1BUF9MT0NLX0FTU0VSVChwbWFwLCBNQV9PV05FRCk7CisJcmV0dXJuICh2bV9yYWRpeF9p
bnNlcnQoJnBtYXAtPnBtX3Jvb3QsIG1wdGUpKTsKK30KKworLyoKKyAqIExvb2tzIGZvciBhIHBh
Z2UgdGFibGUgcGFnZSBtYXBwaW5nIHRoZSBzcGVjaWZpZWQgdmlydHVhbCBhZGRyZXNzIGluIHRo
ZQorICogc3BlY2lmaWVkIHBtYXAncyBjb2xsZWN0aW9uIG9mIGlkbGUgcGFnZSB0YWJsZSBwYWdl
cy4gIFJldHVybnMgTlVMTCBpZiB0aGVyZQorICogaXMgbm8gcGFnZSB0YWJsZSBwYWdlIGNvcnJl
c3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCB2aXJ0dWFsIGFkZHJlc3MuCisgKi8KK3N0YXRpYyBf
X2lubGluZSB2bV9wYWdlX3QKK3BtYXBfbG9va3VwX3B0X3BhZ2UocG1hcF90IHBtYXAsIHZtX29m
ZnNldF90IHZhKQoreworCisJUE1BUF9MT0NLX0FTU0VSVChwbWFwLCBNQV9PV05FRCk7CisJcmV0
dXJuICh2bV9yYWRpeF9sb29rdXAoJnBtYXAtPnBtX3Jvb3QsIHBtYXBfcGRlX3BpbmRleCh2YSkp
KTsKK30KKworLyoKKyAqIFJlbW92ZXMgdGhlIHNwZWNpZmllZCBwYWdlIHRhYmxlIHBhZ2UgZnJv
bSB0aGUgc3BlY2lmaWVkIHBtYXAncyBjb2xsZWN0aW9uCisgKiBvZiBpZGxlIHBhZ2UgdGFibGUg
cGFnZXMuICBUaGUgc3BlY2lmaWVkIHBhZ2UgdGFibGUgcGFnZSBtdXN0IGJlIGEgbWVtYmVyIG9m
CisgKiB0aGUgcG1hcCdzIGNvbGxlY3Rpb24uCisgKi8KK3N0YXRpYyBfX2lubGluZSB2b2lkCitw
bWFwX3JlbW92ZV9wdF9wYWdlKHBtYXBfdCBwbWFwLCB2bV9wYWdlX3QgbXB0ZSkKK3sKKworCVBN
QVBfTE9DS19BU1NFUlQocG1hcCwgTUFfT1dORUQpOworCXZtX3JhZGl4X3JlbW92ZSgmcG1hcC0+
cG1fcm9vdCwgbXB0ZS0+cGluZGV4KTsKK30KKworLyoKKyAqIERlY3JlbWVudHMgYSBwYWdlIHRh
YmxlIHBhZ2UncyB3aXJlIGNvdW50LCB3aGljaCBpcyB1c2VkIHRvIHJlY29yZCB0aGUKKyAqIG51
bWJlciBvZiB2YWxpZCBwYWdlIHRhYmxlIGVudHJpZXMgd2l0aGluIHRoZSBwYWdlLiAgSWYgdGhl
IHdpcmUgY291bnQKKyAqIGRyb3BzIHRvIHplcm8sIHRoZW4gdGhlIHBhZ2UgdGFibGUgcGFnZSBp
cyB1bm1hcHBlZC4gIFJldHVybnMgVFJVRSBpZiB0aGUKKyAqIHBhZ2UgdGFibGUgcGFnZSB3YXMg
dW5tYXBwZWQgYW5kIEZBTFNFIG90aGVyd2lzZS4KKyAqLworc3RhdGljIFBNQVBfSU5MSU5FIGJv
b2xlYW5fdAorcG1hcF91bndpcmVfcHRwKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgdm1f
cGFnZV90IG0sIHN0cnVjdCBzcGdsaXN0ICpmcmVlKQoreworCisJLS1tLT53aXJlX2NvdW50Owor
CWlmIChtLT53aXJlX2NvdW50ID09IDApIHsKKwkJX3BtYXBfdW53aXJlX3B0cChwbWFwLCB2YSwg
bSwgZnJlZSk7CisJCXJldHVybiAoVFJVRSk7CisJfSBlbHNlCisJCXJldHVybiAoRkFMU0UpOwor
fQorCitzdGF0aWMgdm9pZAorX3BtYXBfdW53aXJlX3B0cChwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0
X3QgdmEsIHZtX3BhZ2VfdCBtLCBzdHJ1Y3Qgc3BnbGlzdCAqZnJlZSkKK3sKKwlwZF9lbnRyeV90
ICpwZGUsICpwZHA7CisJdm1fcGFnZV90IHBkcGc7CisKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAs
IE1BX09XTkVEKTsKKwkvKgorCSAqIHVubWFwIHRoZSBwYWdlIHRhYmxlIHBhZ2UKKwkgKi8KKwlp
ZiAobS0+cGluZGV4IDwgTlVQREUpIHsKKwkJcGRlID0gcG1hcF9wZGUocG1hcCwgdmEpOworCQkq
cGRlID0gMDsKKwkJcG1hcF9yZXNpZGVudF9jb3VudF9kZWMocG1hcCwgMSk7CisKKwkJLyoKKwkJ
ICogUmVjdXJzaXZlbHkgZGVjcmVtZW50IG5leHQgbGV2ZWwgcGFnZXRhYmxlIHJlZmNvdW50CisJ
CSAqLworCQlwZHAgPSAocGRfZW50cnlfdCAqKSpwbWFwX3NlZ21hcChwbWFwLCB2YSk7CisJCXBk
cGcgPSBQSFlTX1RPX1ZNX1BBR0UoTUlQU19ESVJFQ1RfVE9fUEhZUyhwZHApKTsKKwkJcG1hcF91
bndpcmVfcHRwKHBtYXAsIHZhLCBwZHBnLCBmcmVlKTsKKwl9IGVsc2UgeworCQlwZGUgPSBwbWFw
X3NlZ21hcChwbWFwLCB2YSk7CisJCSpwZGUgPSAwOworCQlwbWFwX3Jlc2lkZW50X2NvdW50X2Rl
YyhwbWFwLCAxKTsKKwl9CisKKwkvKgorCSAqIElmIHRoZSBwYWdlIGlzIGZpbmFsbHkgdW53aXJl
ZCwgc2ltcGx5IGZyZWUgaXQuCisJICogVGhpcyBpcyBhIHJlbGVhc2Ugc3RvcmUgc28gdGhhdCB0
aGUgb3JkaW5hcnkgc3RvcmUgdW5tYXBwaW5nCisJICogdGhlIHBhZ2UgdGFibGUgcGFnZSBpcyBn
bG9iYWxseSBwZXJmb3JtZWQgYmVmb3JlIFRMQiBzaG9vdC0KKwkgKiBkb3duIGlzIGJlZ3VuLgor
CSAqLworCWF0b21pY19zdWJ0cmFjdF9pbnQoJnZtX2NudC52X3dpcmVfY291bnQsIDEpOworCisJ
LyoKKwkgKiBQdXQgcGFnZSBvbiBhIGxpc3Qgc28gdGhhdCBpdCBpcyByZWxlYXNlZCBhZnRlcgor
CSAqICpBTEwqIFRMQiBzaG9vdGRvd24gaXMgZG9uZS4KKwkgKi8KKwlwbWFwX2FkZF9kZWxheWVk
X2ZyZWVfbGlzdChtLCBmcmVlLCBUUlVFKTsKK30KKworLyoKKyAqIEFmdGVyIHJlbW92aW5nIGEg
cGFnZSB0YWJsZSBlbnRyeSwgdGhpcyByb3V0aW5lIGlzIHVzZWQgdG8KKyAqIGNvbmRpdGlvbmFs
bHkgZnJlZSB0aGUgcGFnZSwgYW5kIG1hbmFnZSB0aGUgaG9sZC93aXJlIGNvdW50cy4KKyAqLwor
c3RhdGljIGludAorcG1hcF91bnVzZV9wdChwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEsIHBk
X2VudHJ5X3QgcHRlcGRlLAorICAgIHN0cnVjdCBzcGdsaXN0ICpmcmVlKQoreworCXZtX3BhZ2Vf
dCBtcHRlOworCisJaWYgKHZhID49IFZNX01BWFVTRVJfQUREUkVTUykKKwkJcmV0dXJuICgwKTsK
KwlLQVNTRVJUKHB0ZXBkZSAhPSAwLCAoInBtYXBfdW51c2VfcHQ6IHB0ZXBkZSAhPSAwIikpOwor
CW1wdGUgPSBQSFlTX1RPX1ZNX1BBR0UoTUlQU19ESVJFQ1RfVE9fUEhZUyhwdGVwZGUpKTsKKwly
ZXR1cm4gKHBtYXBfdW53aXJlX3B0cChwbWFwLCB2YSwgbXB0ZSwgZnJlZSkpOworfQorCit2b2lk
CitwbWFwX3Bpbml0MChwbWFwX3QgcG1hcCkKK3sKKwlpbnQgaTsKKworCVBNQVBfTE9DS19JTklU
KHBtYXApOworCXBtYXAtPnBtX3NlZ3RhYiA9IGtlcm5lbF9zZWdtYXA7CisJQ1BVX1pFUk8oJnBt
YXAtPnBtX2FjdGl2ZSk7CisJZm9yIChpID0gMDsgaSA8IE1BWENQVTsgaSsrKSB7CisJCXBtYXAt
PnBtX2FzaWRbaV0uYXNpZCA9IFBNQVBfQVNJRF9SRVNFUlZFRDsKKwkJcG1hcC0+cG1fYXNpZFtp
XS5nZW4gPSAwOworCX0KKwlQQ1BVX1NFVChjdXJwbWFwLCBwbWFwKTsKKwlUQUlMUV9JTklUKCZw
bWFwLT5wbV9wdmNodW5rKTsKKwliemVybygmcG1hcC0+cG1fc3RhdHMsIHNpemVvZiBwbWFwLT5w
bV9zdGF0cyk7Cit9CisKK3ZvaWQKK3BtYXBfZ3Jvd19kaXJlY3RfcGFnZV9jYWNoZSgpCit7CisK
Kwl2bV9wYWdlb3V0X2dyb3dfY2FjaGUoMywgMCwgTUlQU19YS1BIWVNfTEFSR0VTVF9QSFlTKTsK
K30KKworc3RhdGljIHZtX3BhZ2VfdAorcG1hcF9hbGxvY19kaXJlY3RfcGFnZSh1bnNpZ25lZCBp
bnQgaW5kZXgsIGludCByZXEpCit7CisJdm1fcGFnZV90IG07CisKKwltID0gdm1fcGFnZV9hbGxv
Y19mcmVlbGlzdChWTV9GUkVFTElTVF9ESVJFQ1QsIHJlcSB8IFZNX0FMTE9DX1dJUkVEIHwKKwkg
ICAgVk1fQUxMT0NfWkVSTyk7CisJaWYgKG0gPT0gTlVMTCkKKwkJcmV0dXJuIChOVUxMKTsKKwor
CWlmICgobS0+ZmxhZ3MgJiBQR19aRVJPKSA9PSAwKQorCQlwbWFwX3plcm9fcGFnZShtKTsKKwor
CW0tPnBpbmRleCA9IGluZGV4OworCXJldHVybiAobSk7Cit9CisKKy8qLQorICogSW5pdGlhbGl6
ZSBhIHByZWFsbG9jYXRlZCBhbmQgemVyb2VkIHBtYXAgc3RydWN0dXJlLAorICogc3VjaCBhcyBv
bmUgaW4gYSB2bXNwYWNlIHN0cnVjdHVyZS4KKyAqLworaW50CitwbWFwX3Bpbml0KHBtYXBfdCBw
bWFwKQoreworCXZtX29mZnNldF90IHB0ZHZhOworCXZtX3BhZ2VfdCBwdGRwZzsKKwlpbnQgaTsK
KworCS8qCisJICogYWxsb2NhdGUgdGhlIHBhZ2UgZGlyZWN0b3J5IHBhZ2UKKwkgKi8KKwl3aGls
ZSAoKHB0ZHBnID0gcG1hcF9hbGxvY19kaXJlY3RfcGFnZShOVVNFUlBHVEJMUywgVk1fQUxMT0Nf
Tk9PQkogfAorCSAgICBWTV9BTExPQ19OT1JNQUwpKSA9PSBOVUxMKSB7CisJICAgICAgIHBtYXBf
Z3Jvd19kaXJlY3RfcGFnZV9jYWNoZSgpOworCX0KKworCXB0ZHZhID0gTUlQU19QSFlTX1RPX0RJ
UkVDVChWTV9QQUdFX1RPX1BIWVMocHRkcGcpKTsKKwlwbWFwLT5wbV9zZWd0YWIgPSAocGRfZW50
cnlfdCAqKXB0ZHZhOworCUNQVV9aRVJPKCZwbWFwLT5wbV9hY3RpdmUpOworCWZvciAoaSA9IDA7
IGkgPCBNQVhDUFU7IGkrKykgeworCQlwbWFwLT5wbV9hc2lkW2ldLmFzaWQgPSBQTUFQX0FTSURf
UkVTRVJWRUQ7CisJCXBtYXAtPnBtX2FzaWRbaV0uZ2VuID0gMDsKKwl9CisJVEFJTFFfSU5JVCgm
cG1hcC0+cG1fcHZjaHVuayk7CisJYnplcm8oJnBtYXAtPnBtX3N0YXRzLCBzaXplb2YgcG1hcC0+
cG1fc3RhdHMpOworCisJcmV0dXJuICgxKTsKK30KKworLyoKKyAqIFRoaXMgcm91dGluZSBpcyBj
YWxsZWQgaWYgdGhlIGRlc2lyZWQgcGFnZSB0YWJsZSBwYWdlIGRvZXMgbm90IGV4aXN0LgorICov
CitzdGF0aWMgdm1fcGFnZV90CitfcG1hcF9hbGxvY3B0ZShwbWFwX3QgcG1hcCwgdW5zaWduZWQg
cHRlcGluZGV4LCBzdHJ1Y3Qgcndsb2NrICoqbG9ja3ApCit7CisJdm1fb2Zmc2V0X3QgcGFnZXZh
OworCXZtX3BhZ2VfdCBtOworCisJUE1BUF9MT0NLX0FTU0VSVChwbWFwLCBNQV9PV05FRCk7CisK
KwkvKgorCSAqIEZpbmQgb3IgZmFicmljYXRlIGEgbmV3IHBhZ2V0YWJsZSBwYWdlCisJICovCisJ
aWYgKChtID0gdm1fcGFnZV9hbGxvYyhOVUxMLCBwdGVwaW5kZXgsIFZNX0FMTE9DX05PUk1BTCB8
CisJICAgIFZNX0FMTE9DX05PT0JKIHwgVk1fQUxMT0NfV0lSRUQgfCBWTV9BTExPQ19aRVJPKSkg
PT0gTlVMTCkgeworCQlpZiAobG9ja3AgIT0gTlVMTCkgeworCQkJUkVMRUFTRV9QVl9MSVNUX0xP
Q0sobG9ja3ApOworCQkJUE1BUF9VTkxPQ0socG1hcCk7CisJCQlyd19ydW5sb2NrKCZwdmhfZ2xv
YmFsX2xvY2spOworCQkJVk1fV0FJVDsKKwkJCXJ3X3Jsb2NrKCZwdmhfZ2xvYmFsX2xvY2spOwor
CQkJUE1BUF9MT0NLKHBtYXApOworCQl9CisKKwkJLyoKKwkJICogSW5kaWNhdGUgdGhlIG5lZWQg
dG8gcmV0cnkuCVdoaWxlIHdhaXRpbmcsIHRoZSBwYWdlCisJCSAqIHRhYmxlIHBhZ2UgbWF5IGhh
dmUgYmVlbiBhbGxvY2F0ZWQuCisJCSAqLworCQlyZXR1cm4gKE5VTEwpOworCX0KKwlpZiAoKG0t
PmZsYWdzICYgUEdfWkVSTykgPT0gMCkKKwkJcG1hcF96ZXJvX3BhZ2UobSk7CisKKwkvKgorCSAq
IE1hcCB0aGUgcGFnZXRhYmxlIHBhZ2UgaW50byB0aGUgcHJvY2VzcyBhZGRyZXNzIHNwYWNlLCBp
ZiBpdAorCSAqIGlzbid0IGFscmVhZHkgdGhlcmUuCisJICovCisJcGFnZXZhID0gTUlQU19QSFlT
X1RPX0RJUkVDVChWTV9QQUdFX1RPX1BIWVMobSkpOworCisJaWYgKHB0ZXBpbmRleCA+PSBOVVBE
RSkgeworCQlwbWFwLT5wbV9zZWd0YWJbcHRlcGluZGV4IC0gTlVQREVdID0gKHBkX2VudHJ5X3Qp
cGFnZXZhOworCX0gZWxzZSB7CisJCXBkX2VudHJ5X3QgKnBkZXAsICpwZGU7CisJCWludCBzZWdp
bmRleCA9IHB0ZXBpbmRleCA+PiAoU0VHU0hJRlQgLSBQRFJTSElGVCk7CisJCWludCBwZGVpbmRl
eCA9IHB0ZXBpbmRleCAmIChOUERFUEcgLSAxKTsKKwkJdm1fcGFnZV90IHBnOworCisJCXBkZXAg
PSAmcG1hcC0+cG1fc2VndGFiW3NlZ2luZGV4XTsKKwkJaWYgKCpwZGVwID09IE5VTEwpIHsKKwkJ
CS8qIEhhdmUgdG8gYWxsb2NhdGUgYSBuZXcgcGQsIHJlY3Vyc2UgKi8KKwkJCWlmIChfcG1hcF9h
bGxvY3B0ZShwbWFwLCBOVVBERSArIHNlZ2luZGV4LAorCQkJICAgIGxvY2twKSA9PSBOVUxMKSB7
CisJCQkJLyogYWxsb2MgZmFpbGVkLCByZWxlYXNlIGN1cnJlbnQgKi8KKwkJCQktLW0tPndpcmVf
Y291bnQ7CisJCQkJYXRvbWljX3N1YnRyYWN0X2ludCgmdm1fY250LnZfd2lyZV9jb3VudCwgMSk7
CisJCQkJdm1fcGFnZV9mcmVlX3plcm8obSk7CisJCQkJcmV0dXJuIChOVUxMKTsKKwkJCX0KKwkJ
fSBlbHNlIHsKKwkJCS8qIEFkZCByZWZlcmVuY2UgdG8gdGhlIHBkIHBhZ2UgKi8KKwkJCXBnID0g
UEhZU19UT19WTV9QQUdFKE1JUFNfRElSRUNUX1RPX1BIWVMoKnBkZXApKTsKKwkJCXBnLT53aXJl
X2NvdW50Kys7CisJCX0KKwkJLyogTmV4dCBsZXZlbCBlbnRyeSAqLworCQlwZGUgPSAocGRfZW50
cnlfdCAqKSpwZGVwOworCQlwZGVbcGRlaW5kZXhdID0gKHBkX2VudHJ5X3QpcGFnZXZhOworCX0K
KworCXBtYXBfcmVzaWRlbnRfY291bnRfaW5jKHBtYXAsIDEpOworCisJcmV0dXJuIChtKTsKK30K
Kworc3RhdGljIHZtX3BhZ2VfdAorcG1hcF9hbGxvY3B0ZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0
X3QgdmEsIHN0cnVjdCByd2xvY2sgKipsb2NrcCkKK3sKKwl1bnNpZ25lZCBwdGVwaW5kZXg7CisJ
cGRfZW50cnlfdCAqcGQ7CisJdm1fcGFnZV90IG07CisKKwkvKgorCSAqIENhbGN1bGF0ZSBwYWdl
dGFibGUgcGFnZSBpbmRleAorCSAqLworCXB0ZXBpbmRleCA9IHBtYXBfcGRlX3BpbmRleCh2YSk7
CityZXRyeToKKwkvKgorCSAqIEdldCB0aGUgcGFnZSBkaXJlY3RvcnkgZW50cnkKKwkgKi8KKwlw
ZCA9IHBtYXBfcGRlKHBtYXAsIHZhKTsKKworCS8qCisJICogVGhpcyBzdXBwb3J0cyBzd2l0Y2hp
bmcgZnJvbSBhIDJNQiBwYWdlIHRvIGEKKwkgKiBub3JtYWwgNEsgcGFnZS4KKwkgKi8KKwlpZiAo
cGQgIT0gTlVMTCAmJiAocGRlX2lzXzFtX3N1cGVycGFnZShwZCkgJiYKKwkgICAgcHRlX2lzX3Zh
bGlkKChwdF9lbnRyeV90ICopcGQpKSkgeworCQkgaWYgKCFwbWFwX2RlbW90ZV9wZGVfbG9ja2Vk
KHBtYXAsIHBkLCB2YSwgbG9ja3ApKSB7CisJCQkgLyoKKwkJCSAgKiBJbnZhbGlkYXRpb24gb2Yg
dGhlIDJNQiBwYWdlIG1hcHBpbmcgbWF5IGhhdmUgY2F1c2VkCisJCQkgICogdGhlIGRlYWxsb2Nh
dGlvbiBvZiB0aGUgdW5kZXJseWluZyBQRCBwYWdlLgorCQkJICAqLworCQkJIHBkID0gTlVMTDsK
KwkJIH0KKwl9CisKKwkvKgorCSAqIElmIHRoZSBwYWdlIHRhYmxlIHBhZ2UgaXMgbWFwcGVkLCB3
ZSBqdXN0IGluY3JlbWVudCB0aGUgaG9sZAorCSAqIGNvdW50LCBhbmQgYWN0aXZhdGUgaXQuCisJ
ICovCisJaWYgKHBkICE9IE5VTEwgJiYgKnBkICE9IE5VTEwpIHsKKwkJbSA9IFBIWVNfVE9fVk1f
UEFHRShNSVBTX0RJUkVDVF9UT19QSFlTKChwdF9lbnRyeV90KSpwZCkpOworCQltLT53aXJlX2Nv
dW50Kys7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogSGVyZSBpZiB0aGUgcHRlIHBhZ2UgaXNuJ3Qg
bWFwcGVkLCBvciBpZiBpdCBoYXMgYmVlbgorCQkgKiBkZWFsbG9jYXRlZC4KKwkJICovCisJCW0g
PSBfcG1hcF9hbGxvY3B0ZShwbWFwLCBwdGVwaW5kZXgsIGxvY2twKTsKKwkJaWYgKG0gPT0gTlVM
TCAmJiBsb2NrcCAhPSBOVUxMKQorCQkJZ290byByZXRyeTsKKwl9CisJcmV0dXJuIChtKTsKK30K
KworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgor
ICogUG1hcCBhbGxvY2F0aW9uL2RlYWxsb2NhdGlvbiByb3V0aW5lcy4KKyAqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qLQorICogUmVsZWFz
ZSBhbnkgcmVzb3VyY2VzIGhlbGQgYnkgdGhlIGdpdmVuIHBoeXNpY2FsIG1hcC4KKyAqIENhbGxl
ZCB3aGVuIGEgcG1hcCBpbml0aWFsaXplZCBieSBwbWFwX3Bpbml0IGlzIGJlaW5nIHJlbGVhc2Vk
LgorICogU2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIHRoZSBtYXAgY29udGFpbnMgbm8gdmFsaWQg
bWFwcGluZ3MuCisgKi8KK3ZvaWQKK3BtYXBfcmVsZWFzZShwbWFwX3QgcG1hcCkKK3sKKwl2bV9v
ZmZzZXRfdCBwdGR2YTsKKwl2bV9wYWdlX3QgcHRkcGc7CisKKwlLQVNTRVJUKHBtYXAtPnBtX3N0
YXRzLnJlc2lkZW50X2NvdW50ID09IDAsCisJICAgICgicG1hcF9yZWxlYXNlOiBwbWFwIHJlc2lk
ZW50IGNvdW50ICVsZCAhPSAwIiwKKwkgICAgcG1hcC0+cG1fc3RhdHMucmVzaWRlbnRfY291bnQp
KTsKKworCS8qCisJICogSW52YWxpZGF0ZSBhbnkgbGVmdCBUTEIgZW50cmllcywgdG8gYWxsb3cg
dGhlIHJldXNlCisJICogb2YgdGhlIGFzaWQuCisJICovCisJcG1hcF9pbnZhbGlkYXRlX2FsbChw
bWFwKTsKKworCXB0ZHZhID0gKHZtX29mZnNldF90KXBtYXAtPnBtX3NlZ3RhYjsKKwlwdGRwZyA9
IFBIWVNfVE9fVk1fUEFHRShNSVBTX0RJUkVDVF9UT19QSFlTKHB0ZHZhKSk7CisKKwlwdGRwZy0+
d2lyZV9jb3VudC0tOworCWF0b21pY19zdWJ0cmFjdF9pbnQoJnZtX2NudC52X3dpcmVfY291bnQs
IDEpOworCXZtX3BhZ2VfZnJlZV96ZXJvKHB0ZHBnKTsKK30KKworLyotCisgKiBncm93IHRoZSBu
dW1iZXIgb2Yga2VybmVsIHBhZ2UgdGFibGUgZW50cmllcywgaWYgbmVlZGVkCisgKi8KK3ZvaWQK
K3BtYXBfZ3Jvd2tlcm5lbCh2bV9vZmZzZXRfdCBhZGRyKQoreworCXZtX3BhZ2VfdCBua3BnOwor
CXBkX2VudHJ5X3QgKnBkZSwgKnBkcGU7CisJcHRfZW50cnlfdCAqcHRlOworCWludCBpOworCisJ
bXR4X2Fzc2VydCgma2VybmVsX21hcC0+c3lzdGVtX210eCwgTUFfT1dORUQpOworCWFkZHIgPSBy
b3VuZHVwMihhZGRyLCBOQlNFRyk7CisJaWYgKGFkZHIgLSAxID49IGtlcm5lbF9tYXAtPm1heF9v
ZmZzZXQpCisJCWFkZHIgPSBrZXJuZWxfbWFwLT5tYXhfb2Zmc2V0OworCXdoaWxlIChrZXJuZWxf
dm1fZW5kIDwgYWRkcikgeworCQlwZHBlID0gcG1hcF9zZWdtYXAoa2VybmVsX3BtYXAsIGtlcm5l
bF92bV9lbmQpOworCQlpZiAoKnBkcGUgPT0gMCkgeworCQkJLyogbmV3IGludGVybWVkaWF0ZSBw
YWdlIHRhYmxlIGVudHJ5ICovCisJCQlua3BnID0gdm1fcGFnZV9hbGxvYyhOVUxMLCBua3B0LCBW
TV9BTExPQ19JTlRFUlJVUFQgfAorCQkJICAgIFZNX0FMTE9DX05PT0JKIHwgVk1fQUxMT0NfV0lS
RUQgfCBWTV9BTExPQ19aRVJPKTsKKwkJCWlmIChua3BnID09IE5VTEwpCisJCQkJcGFuaWMoIiVz
OiBubyBtZW1vcnkgdG8gZ3JvdyBrZXJuZWwiLCBfX2Z1bmNfXyk7CisJCQkqcGRwZSA9IChwZF9l
bnRyeV90KU1JUFNfUEhZU19UT19ESVJFQ1QoCisJCQkgICAgVk1fUEFHRV9UT19QSFlTKG5rcGcp
KTsKKwkJCWNvbnRpbnVlOyAvKiB0cnkgYWdhaW4gKi8KKwkJfQorCQlwZGUgPSBwbWFwX3BkcGVf
dG9fcGRlKHBkcGUsIGtlcm5lbF92bV9lbmQpOworCQlpZiAoKnBkZSAhPSAwKSB7CisJCQlrZXJu
ZWxfdm1fZW5kID0gKGtlcm5lbF92bV9lbmQgKyBOQlBEUikgJiB+UERSTUFTSzsKKwkJCWlmIChr
ZXJuZWxfdm1fZW5kIC0gMSA+PSBrZXJuZWxfbWFwLT5tYXhfb2Zmc2V0KSB7CisJCQkJa2VybmVs
X3ZtX2VuZCA9IGtlcm5lbF9tYXAtPm1heF9vZmZzZXQ7CisJCQkJYnJlYWs7CisJCQl9CisJCQlj
b250aW51ZTsKKwkJfQorCisJCS8qCisJCSAqIFRoaXMgaW5kZXggaXMgYm9ndXMsIGJ1dCBvdXQg
b2YgdGhlIHdheQorCQkgKi8KKwkJbmtwZyA9IHZtX3BhZ2VfYWxsb2MoTlVMTCwgbmtwdCwgVk1f
QUxMT0NfSU5URVJSVVBUIHwKKwkJICAgIFZNX0FMTE9DX05PT0JKIHwgVk1fQUxMT0NfV0lSRUQg
fCBWTV9BTExPQ19aRVJPKTsKKwkJaWYgKCFua3BnKQorCQkJcGFuaWMoInBtYXBfZ3Jvd2tlcm5l
bDogbm8gbWVtb3J5IHRvIGdyb3cga2VybmVsIik7CisJCW5rcHQrKzsKKwkJKnBkZSA9IChwZF9l
bnRyeV90KU1JUFNfUEhZU19UT19ESVJFQ1QoVk1fUEFHRV9UT19QSFlTKG5rcGcpKTsKKworCQkv
KgorCQkgKiBUaGUgUls0LTddPzAwIHN0b3JlcyBvbmx5IG9uZSBjb3B5IG9mIHRoZSBHbG9iYWwg
Yml0IGluCisJCSAqIHRoZSB0cmFuc2xhdGlvbiBsb29rYXNpZGUgYnVmZmVyIGZvciBlYWNoIDIg
cGFnZSBlbnRyeS4KKwkJICogVGh1cyBpbnZhbGlkIGVudHJ5cyBtdXN0IGhhdmUgdGhlIEdsb2Jh
bCBiaXQgc2V0IHNvIHdoZW4KKwkJICogRW50cnkgTE8gYW5kIEVudHJ5IEhJIEcgYml0cyBhcmUg
YW5kZWQgdG9nZXRoZXIgdGhleSB3aWxsCisJCSAqIHByb2R1Y2UgYSBnbG9iYWwgYml0IHRvIHN0
b3JlIGluIHRoZSB0bGIuCisJCSAqLworCQlwdGUgPSAocHRfZW50cnlfdCAqKSpwZGU7CisJCWZv
ciAoaSA9IDA7IGkgPCBOUFRFUEc7IGkrKykKKwkJCXB0ZVtpXSA9IFBURV9HOworCisJCWtlcm5l
bF92bV9lbmQgPSAoa2VybmVsX3ZtX2VuZCArIE5CUERSKSAmIH5QRFJNQVNLOworCQlpZiAoa2Vy
bmVsX3ZtX2VuZCAtIDEgPj0ga2VybmVsX21hcC0+bWF4X29mZnNldCkgeworCQkJa2VybmVsX3Zt
X2VuZCA9IGtlcm5lbF9tYXAtPm1heF9vZmZzZXQ7CisJCQlicmVhazsKKwkJfQorCX0KK30KKwor
LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICog
cGFnZSBtYW5hZ2VtZW50IHJvdXRpbmVzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKi8KKworQ1RBU1NFUlQoc2l6ZW9mKHN0cnVjdCBwdl9jaHVu
aykgPT0gUEFHRV9TSVpFKTsKK0NUQVNTRVJUKF9OUENNID09IDMpOworQ1RBU1NFUlQoX05QQ1BW
ID09IDE2OCk7CisKK3N0YXRpYyBfX2lubGluZSBzdHJ1Y3QgcHZfY2h1bmsgKgorcHZfdG9fY2h1
bmsocHZfZW50cnlfdCBwdikKK3sKKworCXJldHVybiAoKHN0cnVjdCBwdl9jaHVuayAqKSgodWlu
dHB0cl90KXB2ICYgfih1aW50cHRyX3QpUEFHRV9NQVNLKSk7Cit9CisKKyNkZWZpbmUgUFZfUE1B
UChwdikgKHB2X3RvX2NodW5rKHB2KS0+cGNfcG1hcCkKKworI2RlZmluZQlQQ19GUkVFMAkweGZm
ZmZmZmZmZmZmZmZmZmZ1bAorI2RlZmluZQlQQ19GUkVFMQkweGZmZmZmZmZmZmZmZmZmZmZ1bAor
I2RlZmluZQlQQ19GUkVFMgkweDAwMDAwMGZmZmZmZmZmZmZ1bAorCitzdGF0aWMgY29uc3QgdV9s
b25nIHBjX2ZyZWVtYXNrW19OUENNXSA9IHsgUENfRlJFRTAsIFBDX0ZSRUUxLCBQQ19GUkVFMiB9
OworCisjaWZkZWYgUFZfU1RBVFMKK3N0YXRpYyBpbnQgcGNfY2h1bmtfY291bnQsIHBjX2NodW5r
X2FsbG9jcywgcGNfY2h1bmtfZnJlZXMsIHBjX2NodW5rX3RyeWZhaWw7CisKK1NZU0NUTF9JTlQo
X3ZtX3BtYXAsIE9JRF9BVVRPLCBwY19jaHVua19jb3VudCwgQ1RMRkxBR19SRCwgJnBjX2NodW5r
X2NvdW50LCAwLAorICAgICJDdXJyZW50IG51bWJlciBvZiBwdiBlbnRyeSBjaHVua3MiKTsKK1NZ
U0NUTF9JTlQoX3ZtX3BtYXAsIE9JRF9BVVRPLCBwY19jaHVua19hbGxvY3MsIENUTEZMQUdfUkQs
ICZwY19jaHVua19hbGxvY3MsIDAsCisgICAgIkN1cnJlbnQgbnVtYmVyIG9mIHB2IGVudHJ5IGNo
dW5rcyBhbGxvY2F0ZWQiKTsKK1NZU0NUTF9JTlQoX3ZtX3BtYXAsIE9JRF9BVVRPLCBwY19jaHVu
a19mcmVlcywgQ1RMRkxBR19SRCwgJnBjX2NodW5rX2ZyZWVzLCAwLAorICAgICJDdXJyZW50IG51
bWJlciBvZiBwdiBlbnRyeSBjaHVua3MgZnJlZXMiKTsKK1NZU0NUTF9JTlQoX3ZtX3BtYXAsIE9J
RF9BVVRPLCBwY19jaHVua190cnlmYWlsLCBDVExGTEFHX1JELCAmcGNfY2h1bmtfdHJ5ZmFpbCwg
MCwKKyAgICAiTnVtYmVyIG9mIHRpbWVzIHRyaWVkIHRvIGdldCBhIGNodW5rIHBhZ2UgYnV0IGZh
aWxlZC4iKTsKKworc3RhdGljIGxvbmcgcHZfZW50cnlfY291bnQsIHB2X2VudHJ5X2ZyZWVzLCBw
dl9lbnRyeV9hbGxvY3M7CitzdGF0aWMgaW50IHB2X2VudHJ5X3NwYXJlOworCitTWVNDVExfTE9O
Ryhfdm1fcG1hcCwgT0lEX0FVVE8sIHB2X2VudHJ5X2ZyZWVzLCBDVExGTEFHX1JELCAmcHZfZW50
cnlfZnJlZXMsIDAsCisgICAgIkN1cnJlbnQgbnVtYmVyIG9mIHB2IGVudHJ5IGZyZWVzIik7CitT
WVNDVExfTE9ORyhfdm1fcG1hcCwgT0lEX0FVVE8sIHB2X2VudHJ5X2FsbG9jcywgQ1RMRkxBR19S
RCwgJnB2X2VudHJ5X2FsbG9jcywgMCwKKyAgICAiQ3VycmVudCBudW1iZXIgb2YgcHYgZW50cnkg
YWxsb2NzIik7CitTWVNDVExfTE9ORyhfdm1fcG1hcCwgT0lEX0FVVE8sIHB2X2VudHJ5X2NvdW50
LCBDVExGTEFHX1JELCAmcHZfZW50cnlfY291bnQsIDAsCisgICAgIkN1cnJlbnQgbnVtYmVyIG9m
IHB2IGVudHJpZXMiKTsKK1NZU0NUTF9JTlQoX3ZtX3BtYXAsIE9JRF9BVVRPLCBwdl9lbnRyeV9z
cGFyZSwgQ1RMRkxBR19SRCwgJnB2X2VudHJ5X3NwYXJlLCAwLAorICAgICJDdXJyZW50IG51bWJl
ciBvZiBzcGFyZSBwdiBlbnRyaWVzIik7CisjZW5kaWYKKworLyoKKyAqIFdlIGFyZSBpbiBhIHNl
cmlvdXMgbG93IG1lbW9yeSBjb25kaXRpb24uICBSZXNvcnQgdG8KKyAqIGRyYXN0aWMgbWVhc3Vy
ZXMgdG8gZnJlZSBzb21lIHBhZ2VzIHNvIHdlIGNhbiBhbGxvY2F0ZQorICogYW5vdGhlciBwdiBl
bnRyeSBjaHVuay4KKyAqCisgKiBSZXR1cm5zIE5VTEwgaWYgUFYgZW50cmllcyB3ZXJlIHJlY2xh
aW1lZCBmcm9tIHRoZSBzcGVjaWZpZWQgcG1hcC4KKyAqCisgKiBXZSBkbyBub3QsIGhvd2V2ZXIs
IHVubWFwIDJtcGFnZXMgYmVjYXVzZSBzdWJzZXF1ZW50IGFjY2VzcyB3aWxsCisgKiBhbGxvY2F0
ZSBwZXItcGFnZSBwdiBlbnRyaWVzIHVudGlsIHJlcHJvbW90aW9uIG9jY3VycywgdGhlcmVieQor
ICogZXhhY2VyYmF0aW5nIHRoZSBzaG9ydGFnZSBvZiBmcmVlIHB2IGVudHJpZXMuCisgKi8KK3N0
YXRpYyB2bV9wYWdlX3QKK3JlY2xhaW1fcHZfY2h1bmsocG1hcF90IGxvY2tlZF9wbWFwLCBzdHJ1
Y3Qgcndsb2NrICoqbG9ja3ApCit7CisJc3RydWN0IHBjaCBuZXdfdGFpbDsKKwlzdHJ1Y3QgcHZf
Y2h1bmsgKnBjOworCXBkX2VudHJ5X3QgKnBkZTsKKwlwbWFwX3QgcG1hcDsKKwlwdF9lbnRyeV90
ICpwdGUsIG9sZHB0ZTsKKwlwdl9lbnRyeV90IHB2OworCXZtX29mZnNldF90IHZhOworCXZtX3Bh
Z2VfdCBtLCBtX3BjOworCXN0cnVjdCBzcGdsaXN0IGZyZWU7CisJdWludDY0X3QgaW51c2U7CisJ
aW50IGJpdCwgZmllbGQsIGZyZWVkLCBpZHg7CisKKwlyd19hc3NlcnQoJnB2aF9nbG9iYWxfbG9j
aywgUkFfTE9DS0VEKTsKKwlQTUFQX0xPQ0tfQVNTRVJUKGxvY2tlZF9wbWFwLCBNQV9PV05FRCk7
CisJS0FTU0VSVChsb2NrcCAhPSBOVUxMLCAoInJlY2xhaW1fcHZfY2h1bms6IGxvY2twIGlzIE5V
TEwiKSk7CisJcG1hcCA9IE5VTEw7CisJbV9wYyA9IE5VTEw7CisJU0xJU1RfSU5JVCgmZnJlZSk7
CisJVEFJTFFfSU5JVCgmbmV3X3RhaWwpOworCW10eF9sb2NrKCZwdl9jaHVua3NfbXV0ZXgpOwor
CXdoaWxlICgocGMgPSBUQUlMUV9GSVJTVCgmcHZfY2h1bmtzKSkgIT0gTlVMTCAmJiBTTElTVF9F
TVBUWSgmZnJlZSkpIHsKKwkJVEFJTFFfUkVNT1ZFKCZwdl9jaHVua3MsIHBjLCBwY19scnUpOwor
CQltdHhfdW5sb2NrKCZwdl9jaHVua3NfbXV0ZXgpOworCQlpZiAocG1hcCAhPSBwYy0+cGNfcG1h
cCkgeworCQkJaWYgKHBtYXAgIT0gTlVMTCkgeworCQkJCXBtYXBfaW52YWxpZGF0ZV9hbGwocG1h
cCk7CisJCQkJaWYgKHBtYXAgIT0gbG9ja2VkX3BtYXApCisJCQkJCVBNQVBfVU5MT0NLKHBtYXAp
OworCQkJfQorCQkJcG1hcCA9IHBjLT5wY19wbWFwOworCQkJLyogQXZvaWQgZGVhZGxvY2sgYW5k
IGxvY2sgcmVjdXJzaW9uLiAqLworCQkJaWYgKHBtYXAgPiBsb2NrZWRfcG1hcCkgeworCQkJCVJF
TEVBU0VfUFZfTElTVF9MT0NLKGxvY2twKTsKKwkJCQlQTUFQX0xPQ0socG1hcCk7CisJCQl9IGVs
c2UgaWYgKHBtYXAgIT0gbG9ja2VkX3BtYXAgJiYgIVBNQVBfVFJZTE9DSyhwbWFwKSkgeworCQkJ
CXBtYXAgPSBOVUxMOworCQkJCVRBSUxRX0lOU0VSVF9UQUlMKCZuZXdfdGFpbCwgcGMsIHBjX2xy
dSk7CisJCQkJbXR4X2xvY2soJnB2X2NodW5rc19tdXRleCk7CisJCQkJY29udGludWU7CisJCQl9
CisJCX0KKworCQkvKgorCQkgKiBEZXN0cm95IGV2ZXJ5IG5vbi13aXJlZCwgNCBLQiBwYWdlIG1h
cHBpbmcgaW4gdGhlIGNodW5rLgorCQkgKi8KKwkJZnJlZWQgPSAwOworCQlmb3IgKGZpZWxkID0g
MDsgZmllbGQgPCBfTlBDTTsgZmllbGQrKykgeworCQkJZm9yIChpbnVzZSA9IH5wYy0+cGNfbWFw
W2ZpZWxkXSAmIHBjX2ZyZWVtYXNrW2ZpZWxkXTsKKwkJCSAgICBpbnVzZSAhPSAwOyBpbnVzZSAm
PSB+KDFVTCA8PCBiaXQpKSB7CisJCQkJYml0ID0gZmZzbChpbnVzZSkgLSAxOworCQkJCWlkeCA9
IGZpZWxkICogc2l6ZW9mKGludXNlKSAqIE5CQlkgKyBiaXQ7CisJCQkJcHYgPSAmcGMtPnBjX3B2
ZW50cnlbaWR4XTsKKwkJCQl2YSA9IHB2LT5wdl92YTsKKwkJCQlwZGUgPSBwbWFwX3BkZShwbWFw
LCB2YSk7CisJCQkJS0FTU0VSVChwZGUgIT0gTlVMTCAmJiAqcGRlICE9IDAsCisJCQkJICAgICgi
JXM6IHBkZSIsIF9fZnVuY19fKSk7CisJCQkJaWYgKHBkZV9pc18xbV9zdXBlcnBhZ2UocGRlKSkK
KwkJCQkJY29udGludWU7CisJCQkJcHRlID0gcG1hcF9wZGVfdG9fcHRlKHBkZSwgdmEpOworCQkJ
CW9sZHB0ZSA9ICpwdGU7CisJCQkJaWYgKHB0ZV90ZXN0KCZvbGRwdGUsIFBURV9XKSkKKwkJCQkJ
Y29udGludWU7CisJCQkJaWYgKGlzX2tlcm5lbF9wbWFwKHBtYXApKQorCQkJCQkqcHRlID0gUFRF
X0c7CisJCQkJZWxzZQorCQkJCQkqcHRlID0gMDsKKwkJCQlpZiAocHRlX3Rlc3QoJm9sZHB0ZSwg
UFRFX0cpKQorCQkJCQlwbWFwX2ludmFsaWRhdGVfcGFnZShwbWFwLCB2YSk7CisJCQkJbSA9IFBI
WVNfVE9fVk1fUEFHRShUTEJMT19QVEVfVE9fUEEob2xkcHRlKSk7CisJCQkJaWYgKHB0ZV90ZXN0
KCZvbGRwdGUsIFBURV9EKSkKKwkJCQkJdm1fcGFnZV9kaXJ0eShtKTsKKwkJCQlpZiAocHRlX2lz
X3JlZigmb2xkcHRlKSkKKwkJCQkJdm1fcGFnZV9hZmxhZ19zZXQobSwgUEdBX1JFRkVSRU5DRUQp
OworCQkJCVRBSUxRX1JFTU9WRSgmbS0+bWQucHZfbGlzdCwgcHYsIHB2X25leHQpOworCQkJCW0t
Pm1kLnB2X2dlbisrOworCQkJCWlmIChUQUlMUV9FTVBUWSgmbS0+bWQucHZfbGlzdCkgJiYKKwkJ
CQkgICAgKG0tPmZsYWdzICYgUEdfRklDVElUSU9VUykgPT0gMCkgeworCQkJCQlzdHJ1Y3QgbWRf
cGFnZSAqcHZoID0KKwkJCQkJICAgIHBhX3RvX3B2aChWTV9QQUdFX1RPX1BIWVMobSkpOworCQkJ
CQlpZiAoVEFJTFFfRU1QVFkoJnB2aC0+cHZfbGlzdCkpIHsKKwkJCQkJCXZtX3BhZ2VfYWZsYWdf
Y2xlYXIobSwKKwkJCQkJCSAgICBQR0FfV1JJVEVBQkxFKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlw
Yy0+cGNfbWFwW2ZpZWxkXSB8PSAxVUwgPDwgYml0OworCQkJCXBtYXBfdW51c2VfcHQocG1hcCwg
dmEsICpwZGUsICZmcmVlKTsKKwkJCQlmcmVlZCsrOworCQkJfQorCQl9CisJCWlmIChmcmVlZCA9
PSAwKSB7CisJCQlUQUlMUV9JTlNFUlRfVEFJTCgmbmV3X3RhaWwsIHBjLCBwY19scnUpOworCQkJ
bXR4X2xvY2soJnB2X2NodW5rc19tdXRleCk7CisJCQljb250aW51ZTsKKwkJfQorCQkvKiBFdmVy
eSBmcmVlZCBtYXBwaW5nIGlzIGZvciBhIDQgS0IgcGFnZS4gKi8KKwkJcG1hcF9yZXNpZGVudF9j
b3VudF9kZWMocG1hcCwgZnJlZWQpOworCQlQVl9TVEFUKGF0b21pY19hZGRfbG9uZygmcHZfZW50
cnlfZnJlZXMsIGZyZWVkKSk7CisJCVBWX1NUQVQoYXRvbWljX2FkZF9pbnQoJnB2X2VudHJ5X3Nw
YXJlLCBmcmVlZCkpOworCQlQVl9TVEFUKGF0b21pY19zdWJ0cmFjdF9sb25nKCZwdl9lbnRyeV9j
b3VudCwgZnJlZWQpKTsKKwkJVEFJTFFfUkVNT1ZFKCZwbWFwLT5wbV9wdmNodW5rLCBwYywgcGNf
bGlzdCk7CisJCWlmIChwYy0+cGNfbWFwWzBdID09IFBDX0ZSRUUwICYmIHBjLT5wY19tYXBbMV0g
PT0gUENfRlJFRTEgJiYKKwkJICAgIHBjLT5wY19tYXBbMl0gPT0gUENfRlJFRTIpIHsKKwkJCVBW
X1NUQVQoYXRvbWljX3N1YnRyYWN0X2ludCgmcHZfZW50cnlfc3BhcmUsIF9OUENQVikpOworCQkJ
UFZfU1RBVChhdG9taWNfc3VidHJhY3RfaW50KCZwY19jaHVua19jb3VudCwgMSkpOworCQkJUFZf
U1RBVChhdG9taWNfYWRkX2ludCgmcGNfY2h1bmtfZnJlZXMsIDEpKTsKKwkJCS8qIEVudGlyZSBj
aHVuayBpcyBmcmVlOyByZXR1cm4gaXQuICovCisJCQltX3BjID0gUEhZU19UT19WTV9QQUdFKE1J
UFNfRElSRUNUX1RPX1BIWVMoCisJCQkgICAgKHZtX29mZnNldF90KXBjKSk7CisJCQlkdW1wX2Ry
b3BfcGFnZShtX3BjLT5waHlzX2FkZHIpOworCQkJbXR4X2xvY2soJnB2X2NodW5rc19tdXRleCk7
CisJCQlicmVhazsKKwkJfQorCQlUQUlMUV9JTlNFUlRfSEVBRCgmcG1hcC0+cG1fcHZjaHVuaywg
cGMsIHBjX2xpc3QpOworCQlUQUlMUV9JTlNFUlRfVEFJTCgmbmV3X3RhaWwsIHBjLCBwY19scnUp
OworCQltdHhfbG9jaygmcHZfY2h1bmtzX211dGV4KTsKKwkJLyogT25lIGZyZWVkIHB2IGVudHJ5
IGluIGxvY2tlZF9wbWFwIGlzIHN1ZmZpY2llbnQuICovCisJCWlmIChwbWFwID09IGxvY2tlZF9w
bWFwKQorCQkJYnJlYWs7CisJfQorCVRBSUxRX0NPTkNBVCgmcHZfY2h1bmtzLCAmbmV3X3RhaWws
IHBjX2xydSk7CisJbXR4X3VubG9jaygmcHZfY2h1bmtzX211dGV4KTsKKwlpZiAocG1hcCAhPSBO
VUxMKSB7CisJCXBtYXBfaW52YWxpZGF0ZV9hbGwocG1hcCk7CisJCWlmIChwbWFwICE9IGxvY2tl
ZF9wbWFwKQorCQkJUE1BUF9VTkxPQ0socG1hcCk7CisJfQorCWlmIChtX3BjID09IE5VTEwgJiYg
IVNMSVNUX0VNUFRZKCZmcmVlKSkgeworCQltX3BjID0gU0xJU1RfRklSU1QoJmZyZWUpOworCQlT
TElTVF9SRU1PVkVfSEVBRCgmZnJlZSwgcGxpbmtzLnMuc3MpOworCQkvKiBSZWN5Y2xlIGEgZnJl
ZWQgcGFnZSB0YWJsZSBwYWdlLiAqLworCQltX3BjLT53aXJlX2NvdW50ID0gMTsKKwkJYXRvbWlj
X2FkZF9pbnQoJnZtX2NudC52X3dpcmVfY291bnQsIDEpOworCX0KKwlwbWFwX2ZyZWVfemVyb19w
YWdlcygmZnJlZSk7CisJcmV0dXJuIChtX3BjKTsKK30KKworLyoKKyAqIGZyZWUgdGhlIHB2X2Vu
dHJ5IGJhY2sgdG8gdGhlIGZyZWUgbGlzdAorICovCitzdGF0aWMgdm9pZAorZnJlZV9wdl9lbnRy
eShwbWFwX3QgcG1hcCwgcHZfZW50cnlfdCBwdikKK3sKKwlzdHJ1Y3QgcHZfY2h1bmsgKnBjOwor
CWludCBiaXQsIGZpZWxkLCBpZHg7CisKKwlyd19hc3NlcnQoJnB2aF9nbG9iYWxfbG9jaywgUkFf
TE9DS0VEKTsKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsKKwlQVl9TVEFUKGF0
b21pY19hZGRfbG9uZygmcHZfZW50cnlfZnJlZXMsIDEpKTsKKwlQVl9TVEFUKGF0b21pY19hZGRf
aW50KCZwdl9lbnRyeV9zcGFyZSwgMSkpOworCVBWX1NUQVQoYXRvbWljX3N1YnRyYWN0X2xvbmco
JnB2X2VudHJ5X2NvdW50LCAxKSk7CisJcGMgPSBwdl90b19jaHVuayhwdik7CisJaWR4ID0gcHYg
LSAmcGMtPnBjX3B2ZW50cnlbMF07CisJZmllbGQgPSBpZHggLyAoc2l6ZW9mKHVfbG9uZykgKiBO
QkJZKTsKKwliaXQgPSBpZHggJSAoc2l6ZW9mKHVfbG9uZykgKiBOQkJZKTsKKwlwYy0+cGNfbWFw
W2ZpZWxkXSB8PSAxdWwgPDwgYml0OworCWlmIChwYy0+cGNfbWFwWzBdICE9IFBDX0ZSRUUwIHx8
IHBjLT5wY19tYXBbMV0gIT0gUENfRlJFRTEgfHwKKwkgICAgcGMtPnBjX21hcFsyXSAhPSBQQ19G
UkVFMikgeworCQkvKiA5OCUgb2YgdGhlIHRpbWUsIHBjIGlzIGFscmVhZHkgYXQgdGhlIGhlYWQg
b2YgdGhlIGxpc3QuICovCisJCWlmIChfX3ByZWRpY3RfZmFsc2UocGMgIT0gVEFJTFFfRklSU1Qo
JnBtYXAtPnBtX3B2Y2h1bmspKSkgeworCQkJVEFJTFFfUkVNT1ZFKCZwbWFwLT5wbV9wdmNodW5r
LCBwYywgcGNfbGlzdCk7CisJCQlUQUlMUV9JTlNFUlRfSEVBRCgmcG1hcC0+cG1fcHZjaHVuaywg
cGMsIHBjX2xpc3QpOworCQl9CisJCXJldHVybjsKKwl9CisJVEFJTFFfUkVNT1ZFKCZwbWFwLT5w
bV9wdmNodW5rLCBwYywgcGNfbGlzdCk7CisJZnJlZV9wdl9jaHVuayhwYyk7Cit9CisKK3N0YXRp
YyB2b2lkCitmcmVlX3B2X2NodW5rKHN0cnVjdCBwdl9jaHVuayAqcGMpCit7CisJdm1fcGFnZV90
IG07CisKKwltdHhfbG9jaygmcHZfY2h1bmtzX211dGV4KTsKKwlUQUlMUV9SRU1PVkUoJnB2X2No
dW5rcywgcGMsIHBjX2xydSk7CisJbXR4X3VubG9jaygmcHZfY2h1bmtzX211dGV4KTsKKwlQVl9T
VEFUKGF0b21pY19zdWJ0cmFjdF9pbnQoJnB2X2VudHJ5X3NwYXJlLCBfTlBDUFYpKTsKKwlQVl9T
VEFUKGF0b21pY19zdWJ0cmFjdF9pbnQoJnBjX2NodW5rX2NvdW50LCAxKSk7CisJUFZfU1RBVChh
dG9taWNfYWRkX2ludCgmcGNfY2h1bmtfZnJlZXMsIDEpKTsKKwkvKiBlbnRpcmUgY2h1bmsgaXMg
ZnJlZSwgcmV0dXJuIGl0ICovCisJbSA9IFBIWVNfVE9fVk1fUEFHRShNSVBTX0RJUkVDVF9UT19Q
SFlTKCh2bV9vZmZzZXRfdClwYykpOworCWR1bXBfZHJvcF9wYWdlKG0tPnBoeXNfYWRkcik7CisJ
dm1fcGFnZV91bndpcmUobSwgUFFfSU5BQ1RJVkUpOworCXZtX3BhZ2VfZnJlZShtKTsKK30KKwor
LyoKKyAqIFJldHVybnMgYSBuZXcgUFYgZW50cnksIGFsbG9jYXRpbmcgYSBuZXcgUFYgY2h1bmsg
ZnJvbSB0aGUgc3lzdGVtIHdoZW4KKyAqIG5lZWRlZC4gIElmIHRoaXMgUFYgY2h1bmsgYWxsb2Nh
dGlvbiBmYWlscyBhbmQgYSBQViBsaXN0IGxvY2sgcG9pbnRlciB3YXMKKyAqIGdpdmVuLCBhIFBW
IGNodW5rIGlzIHJlY2xhaW1lZCBmcm9tIGFuIGFyYml0cmFyeSBwbWFwLiAgT3RoZXJ3aXNlLCBO
VUxMIGlzCisgKiByZXR1cm5lZC4KKyAqCisgKiBUaGUgZ2l2ZW4gUFYgbGlzdCBsb2NrIG1heSBi
ZSByZWxlYXNlZC4KKyAqLworc3RhdGljIHB2X2VudHJ5X3QKK2dldF9wdl9lbnRyeShwbWFwX3Qg
cG1hcCwgc3RydWN0IHJ3bG9jayAqKmxvY2twKQoreworCWludCBiaXQsIGZpZWxkLCBpZHg7CisJ
cHZfZW50cnlfdCBwdjsKKwlzdHJ1Y3QgcHZfY2h1bmsgKnBjOworCXZtX3BhZ2VfdCBtOworCisJ
cndfYXNzZXJ0KCZwdmhfZ2xvYmFsX2xvY2ssIFJBX0xPQ0tFRCk7CisJUE1BUF9MT0NLX0FTU0VS
VChwbWFwLCBNQV9PV05FRCk7CisJUFZfU1RBVChhdG9taWNfYWRkX2xvbmcoJnB2X2VudHJ5X2Fs
bG9jcywgMSkpOworcmV0cnk6CisJcGMgPSBUQUlMUV9GSVJTVCgmcG1hcC0+cG1fcHZjaHVuayk7
CisJaWYgKHBjICE9IE5VTEwpIHsKKwkJZm9yIChmaWVsZCA9IDA7IGZpZWxkIDwgX05QQ007IGZp
ZWxkKyspIHsKKwkJCWlmIChwYy0+cGNfbWFwW2ZpZWxkXSkgeworCQkJCWJpdCA9IGZmc2wocGMt
PnBjX21hcFtmaWVsZF0pIC0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoZmllbGQg
PCBfTlBDTSkgeworCQkJaWR4ID0gZmllbGQgKiBzaXplb2YocGMtPnBjX21hcFtmaWVsZF0pICog
TkJCWSArIGJpdDsKKwkJCXB2ID0gJnBjLT5wY19wdmVudHJ5W2lkeF07CisJCQlwYy0+cGNfbWFw
W2ZpZWxkXSAmPSB+KDF1bCA8PCBiaXQpOworCQkJLyogSWYgdGhpcyB3YXMgdGhlIGxhc3QgaXRl
bSwgbW92ZSBpdCB0byB0YWlsICovCisJCQlpZiAocGMtPnBjX21hcFswXSA9PSAwICYmIHBjLT5w
Y19tYXBbMV0gPT0gMCAmJgorCQkJICAgIHBjLT5wY19tYXBbMl0gPT0gMCkgeworCQkJCVRBSUxR
X1JFTU9WRSgmcG1hcC0+cG1fcHZjaHVuaywgcGMsIHBjX2xpc3QpOworCQkJCVRBSUxRX0lOU0VS
VF9UQUlMKCZwbWFwLT5wbV9wdmNodW5rLCBwYywKKwkJCQkgICAgcGNfbGlzdCk7CisJCQl9CisJ
CQlQVl9TVEFUKGF0b21pY19hZGRfbG9uZygmcHZfZW50cnlfY291bnQsIDEpKTsKKwkJCVBWX1NU
QVQoYXRvbWljX3N1YnRyYWN0X2ludCgmcHZfZW50cnlfc3BhcmUsIDEpKTsKKwkJCXJldHVybiAo
cHYpOworCQl9CisJfQorCS8qIE5vIGZyZWUgaXRlbXMsIGFsbG9jYXRlIGFub3RoZXIgY2h1bmsg
Ki8KKwltID0gdm1fcGFnZV9hbGxvYyhOVUxMLCAwLCBWTV9BTExPQ19OT1JNQUwgfCBWTV9BTExP
Q19OT09CSiB8CisJICAgIFZNX0FMTE9DX1dJUkVEKTsKKwlpZiAobSA9PSBOVUxMKSB7CisJCWlm
IChsb2NrcCA9PSBOVUxMKSB7CisJCQlQVl9TVEFUKHBjX2NodW5rX3RyeWZhaWwrKyk7CisJCQly
ZXR1cm4gKE5VTEwpOworCQl9CisJCW0gPSByZWNsYWltX3B2X2NodW5rKHBtYXAsIGxvY2twKTsK
KwkJaWYgKG0gPT0gTlVMTCkKKwkJCWdvdG8gcmV0cnk7CisJfQorCVBWX1NUQVQoYXRvbWljX2Fk
ZF9pbnQoJnBjX2NodW5rX2NvdW50LCAxKSk7CisJUFZfU1RBVChhdG9taWNfYWRkX2ludCgmcGNf
Y2h1bmtfYWxsb2NzLCAxKSk7CisJZHVtcF9hZGRfcGFnZShtLT5waHlzX2FkZHIpOworCXBjID0g
KHN0cnVjdCBwdl9jaHVuayAqKU1JUFNfUEhZU19UT19ESVJFQ1QoVk1fUEFHRV9UT19QSFlTKG0p
KTsKKwlwYy0+cGNfcG1hcCA9IHBtYXA7CisJcGMtPnBjX21hcFswXSA9IFBDX0ZSRUUwICYgfjF1
bDsJLyogcHJlYWxsb2NhdGVkIGJpdCAwICovCisJcGMtPnBjX21hcFsxXSA9IFBDX0ZSRUUxOwor
CXBjLT5wY19tYXBbMl0gPSBQQ19GUkVFMjsKKwltdHhfbG9jaygmcHZfY2h1bmtzX211dGV4KTsK
KwlUQUlMUV9JTlNFUlRfVEFJTCgmcHZfY2h1bmtzLCBwYywgcGNfbHJ1KTsKKwltdHhfdW5sb2Nr
KCZwdl9jaHVua3NfbXV0ZXgpOworCXB2ID0gJnBjLT5wY19wdmVudHJ5WzBdOworCVRBSUxRX0lO
U0VSVF9IRUFEKCZwbWFwLT5wbV9wdmNodW5rLCBwYywgcGNfbGlzdCk7CisJUFZfU1RBVChhdG9t
aWNfYWRkX2xvbmcoJnB2X2VudHJ5X2NvdW50LCAxKSk7CisJUFZfU1RBVChhdG9taWNfYWRkX2lu
dCgmcHZfZW50cnlfc3BhcmUsIF9OUENQViAtIDEpKTsKKwlyZXR1cm4gKHB2KTsKK30KKworLyoK
KyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBvbmUgYml0cyB3aXRoaW4gdGhlIGdpdmVuIFBWIGNo
dW5rIG1hcCBlbGVtZW50LgorICovCitzdGF0aWMgaW5saW5lIGludAorcG9wY291bnRfcGNfbWFw
X2VsZW0odWludDY0X3QgZWxlbSkKK3sKKwlpbnQgY291bnQ7CisKKwkvKgorCSAqIFRoaXMgc2lt
cGxlIG1ldGhvZCBvZiBjb3VudGluZyB0aGUgb25lIGJpdHMgcGVyZm9ybXMgd2VsbCBiZWNhdXNl
CisJICogdGhlIGdpdmVuIGVsZW1lbnQgdHlwaWNhbGx5IGNvbnRhaW5zIG1vcmUgemVybyBiaXRz
IHRoYW4gb25lIGJpdHMuCisJICovCisJY291bnQgPSAwOworCWZvciAoOyBlbGVtICE9IDA7IGVs
ZW0gJj0gZWxlbSAtIDEpCisJCWNvdW50Kys7CisJcmV0dXJuIChjb3VudCk7Cit9CisKKy8qCisg
KiBFbnN1cmUgdGhhdCB0aGUgbnVtYmVyIG9mIHNwYXJlIFBWIGVudHJpZXMgaW4gdGhlIHNwZWNp
ZmllZCBwbWFwIG1lZXRzIG9yCisgKiBleGNlZWRzIHRoZSBnaXZlbiBjb3VudCwgIm5lZWRlZCIu
CisgKgorICogVGhlIGdpdmVuIFBWIGxpc3QgbG9jayBtYXkgYmUgcmVsZWFzZWQuCisgKi8KK3N0
YXRpYyB2b2lkCityZXNlcnZlX3B2X2VudHJpZXMocG1hcF90IHBtYXAsIGludCBuZWVkZWQsIHN0
cnVjdCByd2xvY2sgKipsb2NrcCkKK3sKKwlzdHJ1Y3QgcGNoIG5ld190YWlsOworCXN0cnVjdCBw
dl9jaHVuayAqcGM7CisJaW50IGF2YWlsLCBmcmVlOworCXZtX3BhZ2VfdCBtOworCisJcndfYXNz
ZXJ0KCZwdmhfZ2xvYmFsX2xvY2ssIFJBX0xPQ0tFRCk7CisJUE1BUF9MT0NLX0FTU0VSVChwbWFw
LCBNQV9PV05FRCk7CisJS0FTU0VSVChsb2NrcCAhPSBOVUxMLCAoIiVzOiBsb2NrcCBpcyBOVUxM
IiwgX19mdW5jX18pKTsKKworCS8qCisJICogTmV3bHkgYWxsb2NhdGVkIFBWIGNodW5rcyBtdXN0
IGJlIHN0b3JlZCBpbiBhIHByaXZhdGUgbGlzdCB1bnRpbAorCSAqIHRoZSByZXF1aXJlZCBudW1i
ZXIgb2YgUFYgY2h1bmtzIGhhdmUgYmVlbiBhbGxvY2F0ZWQuICBPdGhlcndpc2UsCisJICogcmVj
bGFpbV9wdl9jaHVuaygpIGNvdWxkIHJlY3ljbGUgb25lIG9mIHRoZXNlIGNodW5rcy4gIEluCisJ
ICogY29udHJhc3QsIHRoZXNlIGNodW5rcyBtdXN0IGJlIGFkZGVkIHRvIHRoZSBwbWFwIHVwb24g
YWxsb2NhdGlvbi4KKwkgKi8KKwlUQUlMUV9JTklUKCZuZXdfdGFpbCk7CityZXRyeToKKwlhdmFp
bCA9IDA7CisJVEFJTFFfRk9SRUFDSChwYywgJnBtYXAtPnBtX3B2Y2h1bmssIHBjX2xpc3QpIHsK
KwkJZnJlZSA9IHBvcGNvdW50X3BjX21hcF9lbGVtKHBjLT5wY19tYXBbMF0pOworCQlmcmVlICs9
IHBvcGNvdW50X3BjX21hcF9lbGVtKHBjLT5wY19tYXBbMV0pOworCQlmcmVlICs9IHBvcGNvdW50
X3BjX21hcF9lbGVtKHBjLT5wY19tYXBbMl0pOworCQlpZiAoZnJlZSA9PSAwKQorCQkJYnJlYWs7
CisJCWF2YWlsICs9IGZyZWU7CisJCWlmIChhdmFpbCA+PSBuZWVkZWQpCisJCQlicmVhazsKKwl9
CisJZm9yICg7IGF2YWlsIDwgbmVlZGVkOyBhdmFpbCArPSBfTlBDUFYpIHsKKwkJbSA9IHZtX3Bh
Z2VfYWxsb2MoTlVMTCwgMCwgVk1fQUxMT0NfTk9STUFMIHwgVk1fQUxMT0NfTk9PQkogfAorCQkg
ICAgVk1fQUxMT0NfV0lSRUQpOworCQlpZiAobSA9PSBOVUxMKSB7CisJCQltID0gcmVjbGFpbV9w
dl9jaHVuayhwbWFwLCBsb2NrcCk7CisJCQlpZiAobSA9PSBOVUxMKQorCQkJCWdvdG8gcmV0cnk7
CisJCX0KKwkJUFZfU1RBVChhdG9taWNfYWRkX2ludCgmcGNfY2h1bmtfY291bnQsIDEpKTsKKwkJ
UFZfU1RBVChhdG9taWNfYWRkX2ludCgmcGNfY2h1bmtfYWxsb2NzLCAxKSk7CisJCWR1bXBfYWRk
X3BhZ2UobS0+cGh5c19hZGRyKTsKKwkJcGMgPSAoc3RydWN0IHB2X2NodW5rICopTUlQU19QSFlT
X1RPX0RJUkVDVChWTV9QQUdFX1RPX1BIWVMobSkpOworCQlwYy0+cGNfcG1hcCA9IHBtYXA7CisJ
CXBjLT5wY19tYXBbMF0gPSBQQ19GUkVFMDsKKwkJcGMtPnBjX21hcFsxXSA9IFBDX0ZSRUUxOwor
CQlwYy0+cGNfbWFwWzJdID0gUENfRlJFRTI7CisJCVRBSUxRX0lOU0VSVF9IRUFEKCZwbWFwLT5w
bV9wdmNodW5rLCBwYywgcGNfbGlzdCk7CisJCVRBSUxRX0lOU0VSVF9UQUlMKCZuZXdfdGFpbCwg
cGMsIHBjX2xydSk7CisJCVBWX1NUQVQoYXRvbWljX2FkZF9pbnQoJnB2X2VudHJ5X3NwYXJlLCBf
TlBDUFYpKTsKKwl9CisJaWYgKCFUQUlMUV9FTVBUWSgmbmV3X3RhaWwpKSB7CisJCW10eF9sb2Nr
KCZwdl9jaHVua3NfbXV0ZXgpOworCQlUQUlMUV9DT05DQVQoJnB2X2NodW5rcywgJm5ld190YWls
LCBwY19scnUpOworCQltdHhfdW5sb2NrKCZwdl9jaHVua3NfbXV0ZXgpOworCX0KK30KKworLyoK
KyAqIEZpcnN0IGZpbmQgYW5kIHRoZW4gcmVtb3ZlIHRoZSBwdiBlbnRyeSBmb3IgdGhlIHNwZWNp
ZmllZCBwbWFwIGFuZCB2aXJ0dWFsCisgKiBhZGRyZXNzIGZyb20gdGhlIHNwZWNpZmllZCBwdiBs
aXN0LiAgUmV0dXJucyB0aGUgcHYgZW50cnkgaWYgZm91bmQgYW5kIE5VTEwKKyAqIG90aGVyd2lz
ZS4gIFRoaXMgb3BlcmF0aW9uIGNhbiBiZSBwZXJmb3JtZWQgb24gcHYgbGlzdHMgZm9yIGVpdGhl
ciA0S0Igb3IKKyAqIDJNQiBwYWdlIG1hcHBpbmdzLgorICovCitzdGF0aWMgcHZfZW50cnlfdAor
cG1hcF9wdmhfcmVtb3ZlKHN0cnVjdCBtZF9wYWdlICpwdmgsIHBtYXBfdCBwbWFwLCB2bV9vZmZz
ZXRfdCB2YSkKK3sKKwlwdl9lbnRyeV90IHB2OworCisJcndfYXNzZXJ0KCZwdmhfZ2xvYmFsX2xv
Y2ssIFJBX0xPQ0tFRCk7CisJVEFJTFFfRk9SRUFDSChwdiwgJnB2aC0+cHZfbGlzdCwgcHZfbmV4
dCkgeworCQlpZiAocG1hcCA9PSBQVl9QTUFQKHB2KSAmJiB2YSA9PSBwdi0+cHZfdmEpIHsKKwkJ
CVRBSUxRX1JFTU9WRSgmcHZoLT5wdl9saXN0LCBwdiwgcHZfbmV4dCk7CisJCQlwdmgtPnB2X2dl
bisrOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIChwdik7Cit9CisKKy8qCisgKiBBZnRl
ciBkZW1vdGlvbiBmcm9tIGEgMk1CIHBhZ2UgbWFwcGluZyB0byA1MTIgNEtCIHBhZ2UgbWFwcGlu
Z3MsCisgKiBkZXN0cm95IHRoZSBwdiBlbnRyeSBmb3IgdGhlIDJNQiBwYWdlIG1hcHBpbmcgYW5k
IHJlaW5zdGFudGlhdGUgdGhlIHB2CisgKiBlbnRyaWVzIGZvciBlYWNoIG9mIHRoZSA0S0IgcGFn
ZSBtYXBwaW5ncy4KKyAqLworc3RhdGljIHZvaWQKK3BtYXBfcHZfZGVtb3RlX3BkZShwbWFwX3Qg
cG1hcCwgdm1fb2Zmc2V0X3QgdmEsIHZtX3BhZGRyX3QgcGEsCisgICAgc3RydWN0IHJ3bG9jayAq
KmxvY2twKQoreworCXN0cnVjdCBtZF9wYWdlICpwdmg7CisJc3RydWN0IHB2X2NodW5rICpwYzsK
Kwlwdl9lbnRyeV90IHB2OworCXZtX29mZnNldF90IHZhX2xhc3Q7CisJdm1fcGFnZV90IG07CisJ
aW50IGJpdCwgZmllbGQ7CisKKwlyd19hc3NlcnQoJnB2aF9nbG9iYWxfbG9jaywgUkFfTE9DS0VE
KTsKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsKKwlLQVNTRVJUKChwYSAmIFBE
Uk1BU0spID09IDAsCisJICAgICgiJXM6IHBhIGlzIG5vdCAybXBhZ2UgYWxpZ25lZCIsIF9fZnVu
Y19fKSk7CisJQ0hBTkdFX1BWX0xJU1RfTE9DS19UT19QSFlTKGxvY2twLCBwYSk7CisKKwkvKgor
CSAqIFRyYW5zZmVyIHRoZSAybXBhZ2UncyBwdiBlbnRyeSBmb3IgdGhpcyBtYXBwaW5nIHRvIHRo
ZSBmaXJzdAorCSAqIHBhZ2UncyBwdiBsaXN0LiAgT25jZSB0aGlzIHRyYW5zZmVyIGJlZ2lucywg
dGhlIHB2IGxpc3QgbG9jaworCSAqIG11c3Qgbm90IGJlIHJlbGVhc2VkIHVudGlsIHRoZSBsYXN0
IHB2IGVudHJ5IGlzIHJlaW5zdGFudGlhdGVkLgorCSAqLworCXB2aCA9IHBhX3RvX3B2aChwYSk7
CisJdmEgPSB0cnVuY18ybXBhZ2UodmEpOworCXB2ID0gcG1hcF9wdmhfcmVtb3ZlKHB2aCwgcG1h
cCwgdmEpOworCUtBU1NFUlQocHYgIT0gTlVMTCwgKCIlczogcHYgbm90IGZvdW5kIiwgX19mdW5j
X18pKTsKKwltID0gUEhZU19UT19WTV9QQUdFKHBhKTsKKwlUQUlMUV9JTlNFUlRfVEFJTCgmbS0+
bWQucHZfbGlzdCwgcHYsIHB2X25leHQpOworCW0tPm1kLnB2X2dlbisrOworCS8qIEluc3RhbnRp
YXRlIHRoZSByZW1haW5pbmcgTlBURVBHIC0gMSBwdiBlbnRyaWVzLiAqLworCVBWX1NUQVQoYXRv
bWljX2FkZF9sb25nKCZwdl9lbnRyeV9hbGxvY3MsIE5QVEVQRyAtIDEpKTsKKwl2YV9sYXN0ID0g
dmEgKyBOQlBEUiAtIFBBR0VfU0laRTsKKwlmb3IgKDs7KSB7CisJCXBjID0gVEFJTFFfRklSU1Qo
JnBtYXAtPnBtX3B2Y2h1bmspOworCQlLQVNTRVJUKHBjLT5wY19tYXBbMF0gIT0gMCB8fCBwYy0+
cGNfbWFwWzFdICE9IDAgfHwKKwkJICAgIHBjLT5wY19tYXBbMl0gIT0gMCwgKCIlczogbWlzc2lu
ZyBzcGFyZSIsIF9fZnVuY19fKSk7CisJCWZvciAoZmllbGQgPSAwOyBmaWVsZCA8IF9OUENNOyBm
aWVsZCsrKSB7CisJCQl3aGlsZSAocGMtPnBjX21hcFtmaWVsZF0pIHsKKwkJCQliaXQgPSBmZnNs
KHBjLT5wY19tYXBbZmllbGRdKSAtIDE7CisJCQkJcGMtPnBjX21hcFtmaWVsZF0gJj0gfigxdWwg
PDwgYml0KTsKKwkJCQlwdiA9ICZwYy0+cGNfcHZlbnRyeVtmaWVsZCAqIDY0ICsgYml0XTsKKwkJ
CQl2YSArPSBQQUdFX1NJWkU7CisJCQkJcHYtPnB2X3ZhID0gdmE7CisJCQkJbSsrOworCQkJCUtB
U1NFUlQoKG0tPm9mbGFncyAmIFZQT19VTk1BTkFHRUQpID09IDAsCisJCQkJICAgKCIlczogcGFn
ZSAlcCBpcyBub3QgbWFuYWdlZCIsIF9fZnVuY19fLCBtKSk7CisJCQkJVEFJTFFfSU5TRVJUX1RB
SUwoJm0tPm1kLnB2X2xpc3QsIHB2LCBwdl9uZXh0KTsKKwkJCQltLT5tZC5wdl9nZW4rKzsKKwkJ
CQlpZiAodmEgPT0gdmFfbGFzdCkKKwkJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKwkJVEFJTFFf
UkVNT1ZFKCZwbWFwLT5wbV9wdmNodW5rLCBwYywgcGNfbGlzdCk7CisJCVRBSUxRX0lOU0VSVF9U
QUlMKCZwbWFwLT5wbV9wdmNodW5rLCBwYywgcGNfbGlzdCk7CisJfQorb3V0OgorCWlmIChwYy0+
cGNfbWFwWzBdID09IDAgJiYgcGMtPnBjX21hcFsxXSA9PSAwICYmIHBjLT5wY19tYXBbMl0gPT0g
MCkgeworCQlUQUlMUV9SRU1PVkUoJnBtYXAtPnBtX3B2Y2h1bmssIHBjLCBwY19saXN0KTsKKwkJ
VEFJTFFfSU5TRVJUX1RBSUwoJnBtYXAtPnBtX3B2Y2h1bmssIHBjLCBwY19saXN0KTsKKwl9CisJ
UFZfU1RBVChhdG9taWNfYWRkX2xvbmcoJnB2X2VudHJ5X2NvdW50LCBOUFRFUEcgLSAxKSk7CisJ
UFZfU1RBVChhdG9taWNfc3VidHJhY3RfaW50KCZwdl9lbnRyeV9zcGFyZSwgTlBURVBHIC0gMSkp
OworfQorCisvKgorICogQWZ0ZXIgcHJvbW90aW9uIGZyb20gNTEyIDRLQiBwYWdlIG1hcHBpbmdz
IHRvIGEgc2luZ2xlIDJNQiBwYWdlIG1hcHBpbmcsCisgKiByZXBsYWNlIHRoZSBtYW55IHB2IGVu
dHJpZXMgZm9yIHRoZSA0S0IgcGFnZSBtYXBwaW5ncyBieSBhIHNpbmdsZSBwdiBlbnRyeQorICog
Zm9yIHRoZSAyTUIgcGFnZSBtYXBwaW5nLgorICovCitzdGF0aWMgdm9pZAorcG1hcF9wdl9wcm9t
b3RlX3BkZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEsIHZtX3BhZGRyX3QgcGEsCisgICAg
c3RydWN0IHJ3bG9jayAqKmxvY2twKQoreworCXN0cnVjdCBtZF9wYWdlICpwdmg7CisJcHZfZW50
cnlfdCBwdjsKKwl2bV9vZmZzZXRfdCB2YV9sYXN0OworCXZtX3BhZ2VfdCBtOworCisJcndfYXNz
ZXJ0KCZwdmhfZ2xvYmFsX2xvY2ssIFJBX0xPQ0tFRCk7CisJS0FTU0VSVCgocGEgJiBQRFJNQVNL
KSA9PSAwLAorCSAgICAoIiVzOiBwYSBpcyBub3QgMm1wYWdlIGFsaWduZWQiLCBfX2Z1bmNfXykp
OworCUNIQU5HRV9QVl9MSVNUX0xPQ0tfVE9fUEhZUyhsb2NrcCwgcGEpOworCisJLyoKKwkgKiBU
cmFuc2ZlciB0aGUgZmlyc3QgcGFnZSdzIHB2IGVudHJ5IGZvciB0aGlzIG1hcHBpbmcgdG8gdGhl
IDJtcGFnZSdzCisJICogcHYgbGlzdC4gIEFzaWRlIGZyb20gYXZvaWRpbmcgdGhlIGNvc3Qgb2Yg
YSBjYWxsIHRvIGdldF9wdl9lbnRyeSgpLAorCSAqIGEgdHJhbnNmZXIgYXZvaWRzIHRoZSBwb3Nz
aWJpbGl0eSB0aGF0IGdldF9wdl9lbnRyeSgpIGNhbGxzCisJICogcmVjbGFpbV9wdl9jaHVuaygp
IGFuZCB0aGF0IHJlY2xhaW1fcHZfY2h1bmsoKSByZW1vdmVzIG9uZSBvZiB0aGUKKwkgKiBtYXBw
aW5ncyB0aGF0IGlzIGJlaW5nIHByb21vdGVkLgorCSAqLworCW0gPSBQSFlTX1RPX1ZNX1BBR0Uo
cGEpOworCXZhID0gdHJ1bmNfMm1wYWdlKHZhKTsKKwlwdiA9IHBtYXBfcHZoX3JlbW92ZSgmbS0+
bWQsIHBtYXAsIHZhKTsKKwlLQVNTRVJUKHB2ICE9IE5VTEwsICgiJXM6IHB2IG5vdCBmb3VuZCIs
IF9fZnVuY19fKSk7CisJcHZoID0gcGFfdG9fcHZoKHBhKTsKKwlUQUlMUV9JTlNFUlRfVEFJTCgm
cHZoLT5wdl9saXN0LCBwdiwgcHZfbmV4dCk7CisJcHZoLT5wdl9nZW4rKzsKKwkvKiBGcmVlIHRo
ZSByZW1haW5pbmcgTlBURVBHIC0gMSBwdiBlbnRyaWVzLiAqLworCXZhX2xhc3QgPSB2YSArIE5C
UERSIC0gUEFHRV9TSVpFOworCWRvIHsKKwkJbSsrOworCQl2YSArPSBQQUdFX1NJWkU7CisJCXBt
YXBfcHZoX2ZyZWUoJm0tPm1kLCBwbWFwLCB2YSk7CisJfSB3aGlsZSAodmEgPCB2YV9sYXN0KTsK
K30KKworLyoKKyAqIEZpcnN0IGZpbmQgYW5kIHRoZW4gZGVzdHJveSB0aGUgcHYgZW50cnkgZm9y
IHRoZSBzcGVjaWZpZWQgcG1hcCBhbmQgdmlydHVhbAorICogYWRkcmVzcy4gIFRoaXMgb3BlcmF0
aW9uIGNhbiBiZSBwZXJmb3JtZWQgb24gcHYgbGlzdHMgZm9yIGVpdGhlciA0S0Igb3IgMk1CCisg
KiBwYWdlIG1hcHBpbmdzLgorICovCitzdGF0aWMgdm9pZAorcG1hcF9wdmhfZnJlZShzdHJ1Y3Qg
bWRfcGFnZSAqcHZoLCBwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEpCit7CisJcHZfZW50cnlf
dCBwdjsKKworCXB2ID0gcG1hcF9wdmhfcmVtb3ZlKHB2aCwgcG1hcCwgdmEpOworCUtBU1NFUlQo
cHYgIT0gTlVMTCwgKCJwbWFwX3B2aF9mcmVlOiBwdiBub3QgZm91bmQsIHBhICVseCB2YSAlbHgi
LAorCSAgICAgKHVfbG9uZylWTV9QQUdFX1RPX1BIWVMoX19jb250YWluZXJvZihwdmgsIHN0cnVj
dCB2bV9wYWdlLCBtZCkpLAorCSAgICAgKHVfbG9uZyl2YSkpOworCWZyZWVfcHZfZW50cnkocG1h
cCwgcHYpOworfQorCisvKgorICogQ29uZGl0aW9uYWxseSBjcmVhdGUgdGhlIHB2IGVudHJ5IGZv
ciBhIDRLQiBwYWdlIG1hcHBpbmcgaWYgdGhlIHJlcXVpcmVkCisgKiBtZW1vcnkgY2FuIGJlIGFs
bG9jYXRlZCB3aXRob3V0IHJlc3RvcnRpbmcgdG8gcmVjbGFtYXRpb24uCisgKi8KK3N0YXRpYyBi
b29sZWFuX3QKK3BtYXBfdHJ5X2luc2VydF9wdl9lbnRyeShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0
X3QgdmEsIHZtX3BhZ2VfdCBtLAorICAgIHN0cnVjdCByd2xvY2sgKipsb2NrcCkKK3sKKwlwdl9l
bnRyeV90IHB2OworCisJcndfYXNzZXJ0KCZwdmhfZ2xvYmFsX2xvY2ssIFJBX0xPQ0tFRCk7CisJ
UE1BUF9MT0NLX0FTU0VSVChwbWFwLCBNQV9PV05FRCk7CisJaWYgKChwdiA9IGdldF9wdl9lbnRy
eShwbWFwLCBOVUxMKSkgIT0gTlVMTCkgeworCQlwdi0+cHZfdmEgPSB2YTsKKwkJQ0hBTkdFX1BW
X0xJU1RfTE9DS19UT19WTV9QQUdFKGxvY2twLCBtKTsKKwkJVEFJTFFfSU5TRVJUX1RBSUwoJm0t
Pm1kLnB2X2xpc3QsIHB2LCBwdl9uZXh0KTsKKwkJbS0+bWQucHZfZ2VuKys7CisJCXJldHVybiAo
VFJVRSk7CisJfSBlbHNlCisJCXJldHVybiAoRkFMU0UpOworfQorCisvKgorICogQ29uZGl0aW9u
YWxseSBjcmVhdGUgdGhlIFBWIGVudHJ5IGZvciBhIDJNQiBwYWdlIG1hcHBpbmcgaWYgdGhlIHJl
cXVpcmVkCisgKiBtZW1vcnkgY2FuIGJlIGFsbG9jYXRlZCB3aXRob3V0IHJlc29ydGluZyB0byBy
ZWNsYW1hdGlvbi4KKyAqLworc3RhdGljIGJvb2xlYW5fdAorcG1hcF9wdl9pbnNlcnRfcGRlKHBt
YXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgdm1fcGFkZHJfdCBwYSwKKyAgICBzdHJ1Y3Qgcnds
b2NrICoqbG9ja3ApCit7CisJc3RydWN0IG1kX3BhZ2UgKnB2aDsKKwlwdl9lbnRyeV90IHB2Owor
CisJcndfYXNzZXJ0KCZwdmhfZ2xvYmFsX2xvY2ssIFJBX0xPQ0tFRCk7CisJUE1BUF9MT0NLX0FT
U0VSVChwbWFwLCBNQV9PV05FRCk7CisJLyogUGFzcyBOVUxMIGluc3RlYWQgb2YgdGhlIGxvY2sg
cG9pbnRlciB0byBkaXNhYmxlIHJlY2xhbWF0aW9uLiAqLworCWlmICgocHYgPSBnZXRfcHZfZW50
cnkocG1hcCwgTlVMTCkpICE9IE5VTEwpIHsKKwkJcHYtPnB2X3ZhID0gdmE7CisJCUNIQU5HRV9Q
Vl9MSVNUX0xPQ0tfVE9fUEhZUyhsb2NrcCwgcGEpOworCQlwdmggPSBwYV90b19wdmgocGEpOwor
CQlUQUlMUV9JTlNFUlRfVEFJTCgmcHZoLT5wdl9saXN0LCBwdiwgcHZfbmV4dCk7CisJCXB2aC0+
cHZfZ2VuKys7CisJCXJldHVybiAoVFJVRSk7CisJfSBlbHNlCisJCXJldHVybiAoRkFMU0UpOwor
fQorCisKKy8qCisgKiBGaWxscyBhIHBhZ2UgdGFibGUgcGFnZSB3aXRoIG1hcHBpbmdzIHRvIGNv
bnNlY3V0aXZlIHBoeXNpY2FsIHBhZ2VzLgorICovCitzdGF0aWMgdm9pZAorcG1hcF9maWxsX3B0
cChwdF9lbnRyeV90ICpmaXJzdHB0ZSwgcHRfZW50cnlfdCBuZXdwdGUpCit7CisJcHRfZW50cnlf
dCAqcHRlOworCisJZm9yIChwdGUgPSBmaXJzdHB0ZTsgcHRlIDwgZmlyc3RwdGUgKyBOUFRFUEc7
IHB0ZSsrKSB7CisJCSpwdGUgPSBuZXdwdGU7CisJCW5ld3B0ZSArPSAoUEFHRV9TSVpFID4+IFRM
QkxPX1BGTl9TSElGVCk7CisJfQorfQorCisvKgorICogVHJpZXMgdG8gZGVtb3RlIGEgMk1CIHBh
Z2UgbWFwcGluZy4gIElmIGRlbW90aW9uIGZhaWxzLCB0aGUgMk1CIHBhZ2UKKyAqIG1hcHBpbmcg
aXMgaW52YWxpZGF0ZWQuCisgKi8KK3N0YXRpYyBib29sZWFuX3QKK3BtYXBfZGVtb3RlX3BkZShw
bWFwX3QgcG1hcCwgcGRfZW50cnlfdCAqcGRlLCB2bV9vZmZzZXRfdCB2YSkKK3sKKwlzdHJ1Y3Qg
cndsb2NrICpsb2NrOworCWJvb2xlYW5fdCBydjsKKworCWxvY2sgPSBOVUxMOworCXJ2ID0gcG1h
cF9kZW1vdGVfcGRlX2xvY2tlZChwbWFwLCBwZGUsIHZhLCAmbG9jayk7CisJaWYgKGxvY2sgIT0g
TlVMTCkKKwkJcndfd3VubG9jayhsb2NrKTsKKwlyZXR1cm4gKHJ2KTsKK30KKworc3RhdGljIGJv
b2xlYW5fdAorcG1hcF9kZW1vdGVfcGRlX2xvY2tlZChwbWFwX3QgcG1hcCwgcGRfZW50cnlfdCAq
cGRlLCB2bV9vZmZzZXRfdCB2YSwKKyAgICBzdHJ1Y3Qgcndsb2NrICoqbG9ja3ApCit7CisJIHBk
X2VudHJ5X3QgbmV3cGRlLCBvbGRwZGU7CisJIHB0X2VudHJ5X3Qgb2xkcHRlLCAqZmlyc3RwdGUs
IG5ld3B0ZTsKKwkgdm1fcGFkZHJfdCBtcHRlcGE7CisJIHZtX3BhZ2VfdCBtcHRlOworCSBzdHJ1
Y3Qgc3BnbGlzdCBmcmVlOworCisJIFBNQVBfTE9DS19BU1NFUlQocG1hcCwgTUFfT1dORUQpOwor
CSBvbGRwZGUgPSAqcGRlOworCSBvbGRwdGUgPSAocHRfZW50cnlfdClvbGRwZGU7CisJIEtBU1NF
UlQocHRlX2lzXzFtX3N1cGVycGFnZSgmb2xkcHRlKSAmJiBwdGVfaXNfdmFsaWQoJm9sZHB0ZSks
CisJICAgICAoIiVzOiBvbGRwZGUgaXMgbm90IHN1cGVycGFnZSBhbmQvb3IgdmFsaWQuIiwgX19m
dW5jX18pKTsKKwkgaWYgKHB0ZV9pc19yZWYoJm9sZHB0ZSkgJiYgKG1wdGUgPSBwbWFwX2xvb2t1
cF9wdF9wYWdlKHBtYXAsIHZhKSkgIT0KKwkgICAgIE5VTEwpCisJCSBwbWFwX3JlbW92ZV9wdF9w
YWdlKHBtYXAsIG1wdGUpOworCSBlbHNlIHsKKwkJIEtBU1NFUlQoIXB0ZV90ZXN0KCZvbGRwdGUs
IFBURV9XKSwKKwkJICAgICAoIiVzOiBwYWdlIHRhYmxlIHBhZ2UgZm9yIGEgd2lyZWQgbWFwcGlu
ZyBpcyBtaXNzaW5nIiwKKwkJICAgICBfX2Z1bmNfXykpOworCQkgLyoKKwkJICAqIEludmFsaWRh
dGUgdGhlIDJNQiBwYWdlIG1hcHBpbmcgYW5kIHJldHVybiAiZmFpbHVyZSIgaWYgdGhlCisJCSAg
KiBtYXBwaW5nIHdhcyBuZXZlciBhY2Nlc3NlZCBvciB0aGUgYWxsb2NhdGlvbiBvZiB0aGUgbmV3
CisJCSAgKiBwYWdlIHRhYmxlIHBhZ2UgZmFpbHMuICBJZiB0aGUgMk1CIHBhZ2UgbWFwcGluZyBi
ZWxvbmdzIHRvCisJCSAgKiB0aGUgZGlyZWN0IG1hcCByZWdpb24gb2YgdGhlIGtlcm5lbCdzIGFk
ZHJlc3Mgc3BhY2UsIHRoZW4KKwkJICAqIHRoZSBwYWdlIGFsbG9jYXRpb24gcmVxdWVzdCBzcGVj
aWZpZXMgdGhlIGhpZ2hlc3QgcG9zc2libGUKKwkJICAqIHByaW9yaXR5IChWTV9BTExPQ19JTlRF
UlJVUFQpLiAgT3RoZXJ3aXNlLCB0aGUgcHJpb3JpdHkgaXMKKwkJICAqIG5vcm1hbC4gIFBhZ2Ug
dGFibGUgcGFnZXMgYXJlIHByZWFsbG9jYXRlZCBmb3IgZXZlcnkgb3RoZXIKKwkJICAqIHBhcnQg
b2YgdGhlIGtlcm5lbCBhZGRyZXNzIHNwYWNlLCBzbyB0aGUgZGlyZWN0IG1hcCByZWdpb24KKwkJ
ICAqIGlzIHRoZSBvbmx5IHBhcnQgb2YgdGhlIGtlcm5lbCBhZGRyZXNzIHNwYWNlIHRoYXQgbXVz
dCBiZQorCQkgICogaGFuZGxlZCBoZXJlLgorCQkgICovCisJCSBpZiAoIXB0ZV9pc19yZWYoJm9s
ZHB0ZSkgfHwgKG1wdGUgPSB2bV9wYWdlX2FsbG9jKE5VTEwsCisJCSAgICAgcG1hcF9wZGVfcGlu
ZGV4KHZhKSwgKHZhID49IFZNX01JTl9LRVJORUxfQUREUkVTUyAmJiB2YSA8CisJCSAgICAgVk1f
TUFYX0FERFJFU1MgPyBWTV9BTExPQ19JTlRFUlJVUFQgOiBWTV9BTExPQ19OT1JNQUwpIHwKKwkJ
ICAgICBWTV9BTExPQ19OT09CSiB8IFZNX0FMTE9DX1dJUkVEKSkgPT0gTlVMTCkgeworCQkJIFNM
SVNUX0lOSVQoJmZyZWUpOworCQkJIHBtYXBfcmVtb3ZlX3BkZShwbWFwLCBwZGUsIHRydW5jXzJt
cGFnZSh2YSksICZmcmVlLAorCQkJICAgICBsb2NrcCk7CisJCQkgcG1hcF9pbnZhbGlkYXRlX3Jh
bmdlKHBtYXAsCisJCQkgICAgICh2bV9vZmZzZXRfdCkodmEgJiB+UERSTUFTSyksCisJCQkgICAg
ICh2bV9vZmZzZXRfdCkodmEgJiB+UERSTUFTSykgKyBOQlBEUik7CisJCQkgcG1hcF9mcmVlX3pl
cm9fcGFnZXMoJmZyZWUpOworCQkJIENUUjMoS1RSX1BNQVAsICIlczogZmFpbHVyZSBmb3IgdmEg
JSNseCBpbiBwbWFwICVwIiwKKwkJCSAgICAgX19mdW5jX18sIHZhLCBwbWFwKTsKKwkJCSByZXR1
cm4gKEZBTFNFKTsKKwkJIH0KKwkJIGlmICh2YSA8IFZNX01BWFVTRVJfQUREUkVTUykKKwkJCSBw
bWFwX3Jlc2lkZW50X2NvdW50X2luYyhwbWFwLCAxKTsKKwkgfQorCSBtcHRlcGEgPSBWTV9QQUdF
X1RPX1BIWVMobXB0ZSk7CisJIG5ld3BkZSA9IChwZF9lbnRyeV90KU1JUFNfUEhZU19UT19ESVJF
Q1QobXB0ZXBhKTsKKwkgZmlyc3RwdGUgPSBuZXdwZGU7CisJIEtBU1NFUlQocHRlX2lzX3JlZigm
b2xkcHRlKSwKKwkgICAgICgiJXM6IG9sZHB0ZSBpcyBub3QgcmVmZXJlbmNlZCIsIF9fZnVuY19f
KSk7CisJIEtBU1NFUlQoIXB0ZV90ZXN0KCZvbGRwdGUsIFBURV9STykgJiYgcHRlX3Rlc3QoJm9s
ZHB0ZSwgUFRFX0QpLAorCSAgICAgKCIlczogb2xkcHRlIGlzIG1pc3NpbmcgUFRFX0QiLCBfX2Z1
bmNfXykpOworCSBuZXdwdGUgPSBvbGRwdGUgJiB+UFRFX1BTX0lEWF9NQVNLOworCisJIC8qCisJ
ICAqIElmIHRoZSBwYWdlIHRhYmxlIHBhZ2UgaXMgbmV3LCBpbml0aWFsaXplIGl0LgorCSAgKi8K
KwkgaWYgKG1wdGUtPndpcmVfY291bnQgPT0gMSkgeworCQkgbXB0ZS0+d2lyZV9jb3VudCA9IE5Q
VEVQRzsKKwkJIHBtYXBfZmlsbF9wdHAoZmlyc3RwdGUsIG5ld3B0ZSk7CisJIH0KKwkgS0FTU0VS
VChUTEJMT19QVEVfVE9fUEEoKmZpcnN0cHRlKSA9PSBUTEJMT19QVEVfVE9fUEEobmV3cHRlKSwK
KwkgICAgICgiJXM6IGZpcnN0cHRlIGFuZCBuZXdwdGUgbWFwIGRpZmZlcmVudCBwaHlzaWNhbCBh
ZGRyZXNzZXMiLAorCSAgICAgX19mdW5jX18pKTsKKworCSAvKgorCSAgKiBJZiB0aGUgbWFwcGlu
ZyBoYXMgY2hhbmdlZCBhdHRyaWJ1dGVzLCB1cGRhdGUgdGhlIHBhZ2UgdGFibGUKKwkgICogZW50
cmllcy4KKwkgICovCisJIGlmICgoKmZpcnN0cHRlICYgUEdfUFJPTU9URV9NQVNLKSAhPSAobmV3
cHRlICYgUEdfUFJPTU9URV9NQVNLKSkKKwkJIHBtYXBfZmlsbF9wdHAoZmlyc3RwdGUsIG5ld3B0
ZSk7CisKKworCSAvKgorCSAgKiBUaGUgc3BhcmUgUFYgZW50cmllcyBtdXN0IGJlIHJlc2VydmVk
IHByaW9yIHRvIGRlbW90aW5nIHRoZQorCSAgKiBtYXBwaW5nLCB0aGF0IGlzLCBwcmlvciB0byBj
aGFuZ2luZyB0aGUgUERFLiAgT3RoZXJ3aXNlLCB0aGUgc3RhdGUKKwkgICogb2YgdGhlIFBERSBh
bmQgdGhlIFBWIGxpc3RzIHdpbGwgYmUgaW5jb25zaXN0ZW50LCB3aGljaCBjYW4gcmVzdWx0CisJ
ICAqIGluIHJlY2xhaW1fcHZfY2h1bmsoKSBhdHRlbXB0aW5nIHRvIHJlbW92ZSBhIFBWIGVudHJ5
IGZyb20gdGhlCisJICAqIHdyb25nIFBWIGxpc3QgYW5kIHBtYXBfcHZfZGVtb3RlX3BkZSgpIGZh
aWxpbmcgdG8gZmluZCB0aGUgZXhwZWN0ZWQKKwkgICogUFYgZW50cnkgZm9yIHRoZSAyTUIgcGFn
ZSBtYXBwaW5nIHRoYXQgaXMgYmVpbmcgZGVtb3RlZC4KKwkgICovCisJIGlmIChwZGVfdGVzdCgm
b2xkcGRlLCBQVEVfTUFOQUdFRCkpCisJCSByZXNlcnZlX3B2X2VudHJpZXMocG1hcCwgTlBURVBH
IC0gMSwgbG9ja3ApOworCisJIC8qCisJICAqIERlbW90ZSB0aGUgbWFwcGluZy4gIFRoaXMgcG1h
cCBpcyBsb2NrZWQuICBUaGUgb2xkIFBERSBoYXMKKwkgICogUFRFX1JFRiBzZXQuICBJZiB0aGUg
b2xkIFBERSBoYXMgUFRFX1JPIGNsZWFyLCBpdCBhbHNvIGhhcworCSAgKiBQVEVfRCBzZXQuICBU
aHVzLCB0aGVyZSBpcyBubyBkYW5nZXIgb2YgYSByYWNlIHdpdGggYW5vdGhlcgorCSAgKiBwcm9j
ZXNzb3IgY2hhbmdpbmcgdGhlIHNldHRpbmcgb2YgUFRFX1JFRiBhbmQvb3IgUFRFX0QgYmV0d2Vl
bgorCSAgKiB0aGUgcmVhZCBhYm92ZSBhbmQgdGhlIHN0b3JlIGJlbG93LgorCSAgKi8KKwkgcG1h
cF91cGRhdGVfcGRlKHBtYXAsIHZhLCBwZGUsIChwdF9lbnRyeV90KW5ld3BkZSk7CisKKwkgLyoK
KwkgICogSW52YWxpZGF0ZSBhIHN0YWxlIHJlY3Vyc2l2ZSBtYXBwaW5nIG9mIHRoZSBwYWdlIHRh
YmxlIHBhZ2UuCisJICAqLworCSBpZiAodmEgPj0gVk1fTUFYVVNFUl9BRERSRVNTKQorCQkgcG1h
cF9pbnZhbGlkYXRlX3BhZ2UocG1hcCwgKHZtX29mZnNldF90KXBtYXBfcHRlKHBtYXAsIHZhKSk7
CisKKwkgLyoKKwkgICogRGVtb3RlIHRoZSBQViBlbnRyeS4KKwkgICovCisJIGlmIChwZGVfdGVz
dCgmb2xkcGRlLCBQVEVfTUFOQUdFRCkpIHsKKwkJIHBtYXBfcHZfZGVtb3RlX3BkZShwbWFwLCB2
YSwgVExCTE9fUERFX1RPX1BBKG9sZHBkZSksIGxvY2twKTsKKwkgfQorCSBhdG9taWNfYWRkX2xv
bmcoJnBtYXBfcGRlX2RlbW90aW9ucywgMSk7CisJIENUUjMoS1RSX1BNQVAsICIlczogc3VjY2Vz
cyBmb3IgdmEgJSNseCBpbiBwbWFwICVwIiwgX19mdW5jX18sIHZhLAorCSAgICAgcG1hcCk7CisK
KwkgcmV0dXJuIChUUlVFKTsKK30KKworLyoKKyAqIHBtYXBfcmVtb3ZlX2tlcm5lbF9wZGU6IFJl
bW92ZSBhIGtlcm5lbCBzdXBlcnBhZ2UgbWFwcGluZy4KKyAqLworc3RhdGljIHZvaWQKK3BtYXBf
cmVtb3ZlX2tlcm5lbF9wZGUocG1hcF90IHBtYXAsIHBkX2VudHJ5X3QgKnBkZSwgdm1fb2Zmc2V0
X3QgdmEpCit7CisJLyogWFhYIE5vdCBkb2luZyBrZXJuZWwgc3VwZXJwYWdlcyB5ZXQuICovCisJ
cGFuaWMoInBtYXBfcmVtb3ZlX2tlcm5lbF9wZGU6IGtlcm5lbCBzdXBlcnBhZ2UiKTsKK30KKwor
LyoKKyAqIHBtYXBfcmVtb3ZlX3BkZTogZG8gdGhlIHRoaW5ncyB0byB1bm1hcCBhIHN1cGVycGFn
ZSBpbiBhIHByb2Nlc3MKKyAqLworc3RhdGljIGludAorcG1hcF9yZW1vdmVfcGRlKHBtYXBfdCBw
bWFwLCBwZF9lbnRyeV90ICpwZHEsIHZtX29mZnNldF90IHN2YSwKKyAgICBzdHJ1Y3Qgc3BnbGlz
dCAqZnJlZSwgc3RydWN0IHJ3bG9jayAqKmxvY2twKQoreworCXN0cnVjdCBtZF9wYWdlICpwdmg7
CisJcGRfZW50cnlfdCBvbGRwZGU7CisJdm1fb2Zmc2V0X3QgZXZhLCB2YTsKKwl2bV9wYWdlX3Qg
bSwgbXB0ZTsKKworCS8qCisJICogV3JpdGUgYmFjayBhbGwgY2FjaGUgbGluZXMgZnJvbSB0aGUg
c3VwZXJwYWdlIGJlaW5nIHVubWFwcGVkLgorCSAqLworCW1pcHNfZGNhY2hlX3diaW52X3Jhbmdl
X2luZGV4KChzdmEgJiB+UERSTUFTSyksIE5CUERSKTsKKworCVBNQVBfTE9DS19BU1NFUlQocG1h
cCwgTUFfT1dORUQpOworCUtBU1NFUlQoKHN2YSAmIFBEUk1BU0spID09IDAsCisJICAgICgicG1h
cF9yZW1vdmVfcGRlOiBzdmEgaXMgbm90IDJtcGFnZSBhbGlnbmVkIikpOworCisJaWYgKGlzX2tl
cm5lbF9wbWFwKHBtYXApKQorCQlvbGRwZGUgPSBwZGVfbG9hZF9zdG9yZShwZHEsIFBURV9HKTsK
KwllbHNlCisJCW9sZHBkZSA9IHBkZV9sb2FkX3N0b3JlKHBkcSwgMCk7CisJaWYgKHBkZV90ZXN0
KCZvbGRwZGUsIFBURV9XKSkKKwkJcG1hcC0+cG1fc3RhdHMud2lyZWRfY291bnQgLT0gTkJQRFIg
LyBQQUdFX1NJWkU7CisKKwlpZiAocGRlX3Rlc3QoJm9sZHBkZSwgUFRFX0cpKQorCQlwbWFwX2lu
dmFsaWRhdGVfcGFnZShrZXJuZWxfcG1hcCwgc3ZhKTsKKworCXBtYXBfcmVzaWRlbnRfY291bnRf
ZGVjKHBtYXAsIE5CUERSIC8gUEFHRV9TSVpFKTsKKwlpZiAocGRlX3Rlc3QoJm9sZHBkZSwgUFRF
X01BTkFHRUQpKSB7CisJICAgIENIQU5HRV9QVl9MSVNUX0xPQ0tfVE9fUEhZUyhsb2NrcCwgVExC
TE9fUERFX1RPX1BBKG9sZHBkZSkpOworCSAgICBwdmggPSBwYV90b19wdmgoVExCTE9fUERFX1RP
X1BBKG9sZHBkZSkpOworCSAgICBwbWFwX3B2aF9mcmVlKHB2aCwgcG1hcCwgc3ZhKTsKKwkgICAg
ZXZhID0gc3ZhICsgTkJQRFI7CisJICAgIGZvciAodmEgPSBzdmEsIG0gPSBQSFlTX1RPX1ZNX1BB
R0UoVExCTE9fUERFX1RPX1BBKG9sZHBkZSkpOworCQl2YSA8IGV2YTsgdmEgKz0gUEFHRV9TSVpF
LCBtKyspIHsKKwkJICAgIGlmIChwZGVfdGVzdCgmb2xkcGRlLCBQVEVfRCkgJiYgIXBkZV90ZXN0
KCZvbGRwZGUsIFBURV9STykpCisJCQkgICAgdm1fcGFnZV9kaXJ0eShtKTsKKwkJICAgIGlmIChw
ZGVfdGVzdCgmb2xkcGRlLCBQVEVfUkVGKSkKKwkJCXZtX3BhZ2VfYWZsYWdfc2V0KG0sIFBHQV9S
RUZFUkVOQ0VEKTsKKwkJICAgIGlmIChUQUlMUV9FTVBUWSgmbS0+bWQucHZfbGlzdCkgJiYKKwkJ
CVRBSUxRX0VNUFRZKCZwdmgtPnB2X2xpc3QpKQorCQkJICAgIHZtX3BhZ2VfYWZsYWdfY2xlYXIo
bSwgUEdBX1dSSVRFQUJMRSk7CisJICAgIH0KKwl9CisJaWYgKHBtYXAgPT0ga2VybmVsX3BtYXAp
IHsKKwkJcG1hcF9yZW1vdmVfa2VybmVsX3BkZShwbWFwLCBwZHEsIHN2YSk7CisJfSBlbHNlIHsK
KwkJbXB0ZSA9IHBtYXBfbG9va3VwX3B0X3BhZ2UocG1hcCwgc3ZhKTsKKwkJaWYgKG1wdGUgIT0g
TlVMTCkgeworCQkJcG1hcF9yZW1vdmVfcHRfcGFnZShwbWFwLCBtcHRlKTsKKwkJCXBtYXBfcmVz
aWRlbnRfY291bnRfZGVjKHBtYXAsIDEpOworCQkJS0FTU0VSVChtcHRlLT53aXJlX2NvdW50ID09
IE5QVEVQRywKKwkJCSAgICAoInBtYXBfcmVtb3ZlX3BkZTogcHRlIHBhZ2Ugd2lyZSBjb3VudCBl
cnJvciIpKTsKKwkJCW1wdGUtPndpcmVfY291bnQgPSAwOworCQkJcG1hcF9hZGRfZGVsYXllZF9m
cmVlX2xpc3QobXB0ZSwgZnJlZSwgRkFMU0UpOworCQkJYXRvbWljX3N1YnRyYWN0X2ludCgmdm1f
Y250LnZfd2lyZV9jb3VudCwgMSk7CisJCX0KKwl9CisJcmV0dXJuIChwbWFwX3VudXNlX3B0KHBt
YXAsIHN2YSwgKnBtYXBfc2VnbWFwKHBtYXAsIHN2YSksIGZyZWUpKTsKK30KKworLyoKKyAqIHBt
YXBfcmVtb3ZlX3B0ZTogZG8gdGhlIHRoaW5ncyB0byB1bm1hcCBhIHBhZ2UgaW4gYSBwcm9jZXNz
CisgKi8KK3N0YXRpYyBpbnQKK3BtYXBfcmVtb3ZlX3B0ZShzdHJ1Y3QgcG1hcCAqcG1hcCwgcHRf
ZW50cnlfdCAqcHRxLCB2bV9vZmZzZXRfdCB2YSwKKyAgICBwZF9lbnRyeV90IHB0ZXBkZSwgc3Ry
dWN0IHNwZ2xpc3QgKmZyZWUsIHN0cnVjdCByd2xvY2sgKipsb2NrcCkKK3sKKwlzdHJ1Y3QgbWRf
cGFnZSAqcHZoOworCXB0X2VudHJ5X3Qgb2xkcHRlOworCXZtX3BhZ2VfdCBtOworCisJUE1BUF9M
T0NLX0FTU0VSVChwbWFwLCBNQV9PV05FRCk7CisKKwkvKgorCSAqIFdyaXRlIGJhY2sgYWxsIGNh
Y2hlIGxpbmVzIGZyb20gdGhlIHBhZ2UgYmVpbmcgdW5tYXBwZWQuCisJICovCisJbWlwc19kY2Fj
aGVfd2JpbnZfcmFuZ2VfaW5kZXgodmEsIFBBR0VfU0laRSk7CisKKwlvbGRwdGUgPSAqcHRxOwor
CWlmIChpc19rZXJuZWxfcG1hcChwbWFwKSkKKwkJKnB0cSA9IFBURV9HOworCWVsc2UKKwkJKnB0
cSA9IDA7CisKKwlpZiAocHRlX3Rlc3QoJm9sZHB0ZSwgUFRFX1cpKQorCQlwbWFwLT5wbV9zdGF0
cy53aXJlZF9jb3VudCAtPSAxOworCisJcG1hcF9yZXNpZGVudF9jb3VudF9kZWMocG1hcCwgMSk7
CisJaWYgKHB0ZV90ZXN0KCZvbGRwdGUsIFBURV9NQU5BR0VEKSkgeworCQltID0gUEhZU19UT19W
TV9QQUdFKFRMQkxPX1BURV9UT19QQShvbGRwdGUpKTsKKwkJaWYgKHB0ZV90ZXN0KCZvbGRwdGUs
IFBURV9EKSkgeworCQkJS0FTU0VSVCghcHRlX3Rlc3QoJm9sZHB0ZSwgUFRFX1JPKSwKKwkJCSAg
ICgiJXM6IG1vZGlmaWVkIHBhZ2Ugbm90IHdyaXRhYmxlOiB2YTogJXAsIHB0ZTogJSNqeCIsCisJ
CQkgICAgX19mdW5jX18sICh2b2lkICopdmEsICh1aW50bWF4X3Qpb2xkcHRlKSk7CisJCQl2bV9w
YWdlX2RpcnR5KG0pOworCQl9CisJCWlmIChwdGVfaXNfcmVmKCZvbGRwdGUpKQorCQkJdm1fcGFn
ZV9hZmxhZ19zZXQobSwgUEdBX1JFRkVSRU5DRUQpOworCQlDSEFOR0VfUFZfTElTVF9MT0NLX1RP
X1ZNX1BBR0UobG9ja3AsIG0pOworCQlwbWFwX3B2aF9mcmVlKCZtLT5tZCwgcG1hcCwgdmEpOwor
CQlpZiAoVEFJTFFfRU1QVFkoJm0tPm1kLnB2X2xpc3QpICYmCisJCSAgICAobS0+ZmxhZ3MgJiBQ
R19GSUNUSVRJT1VTKSA9PSAwKSB7CisJCQlwdmggPSBwYV90b19wdmgoVk1fUEFHRV9UT19QSFlT
KG0pKTsKKwkJCWlmIChUQUlMUV9FTVBUWSgmcHZoLT5wdl9saXN0KSkKKwkJCQl2bV9wYWdlX2Fm
bGFnX2NsZWFyKG0sIFBHQV9XUklURUFCTEUpOworCQl9CisJfQorCXJldHVybiAocG1hcF91bnVz
ZV9wdChwbWFwLCB2YSwgcHRlcGRlLCBmcmVlKSk7Cit9CisKKy8qCisgKiBSZW1vdmUgYSBzaW5n
bGUgcGFnZSBmcm9tIGEgcHJvY2VzcyBhZGRyZXNzIHNwYWNlCisgKi8KK3N0YXRpYyB2b2lkCitw
bWFwX3JlbW92ZV9wYWdlKHN0cnVjdCBwbWFwICpwbWFwLCB2bV9vZmZzZXRfdCB2YSwgc3RydWN0
IHNwZ2xpc3QgKmZyZWUpCit7CisJc3RydWN0IHJ3bG9jayAqbG9jazsKKwlwZF9lbnRyeV90ICpw
ZGU7CisJcHRfZW50cnlfdCAqcHRlOworCisJUE1BUF9MT0NLX0FTU0VSVChwbWFwLCBNQV9PV05F
RCk7CisJcGRlID0gcG1hcF9wZGUocG1hcCwgdmEpOworCWlmIChwZGUgPT0gTlVMTCB8fCAqcGRl
ID09IDApCisJCXJldHVybjsKKwlwdGUgPSBwbWFwX3BkZV90b19wdGUocGRlLCB2YSk7CisKKwkv
KgorCSAqIElmIHRoZXJlIGlzIG5vIHB0ZSBmb3IgdGhpcyBhZGRyZXNzLCBqdXN0IHNraXAgaXQh
CisJICovCisJaWYgKCFwdGVfaXNfdmFsaWQocHRlKSkKKwkJcmV0dXJuOworCisJbG9jayA9IE5V
TEw7CisJKHZvaWQpcG1hcF9yZW1vdmVfcHRlKHBtYXAsIHB0ZSwgdmEsICpwZGUsIGZyZWUsICZs
b2NrKTsKKwlpZiAobG9jayAhPSBOVUxMKQorCQlyd193dW5sb2NrKGxvY2spOworCXBtYXBfaW52
YWxpZGF0ZV9wYWdlKHBtYXAsIHZhKTsKK30KKworLyoKKyAqCVJlbW92ZSB0aGUgZ2l2ZW4gcmFu
Z2Ugb2YgYWRkcmVzc2VzIGZyb20gdGhlIHNwZWNpZmllZCBtYXAuCisgKgorICoJSXQgaXMgYXNz
dW1lZCB0aGF0IHRoZSBzdGFydCBhbmQgZW5kIGFyZSBwcm9wZXJseQorICoJcm91bmRlZCB0byB0
aGUgcGFnZSBzaXplLgorICovCit2b2lkCitwbWFwX3JlbW92ZShwbWFwX3QgcG1hcCwgdm1fb2Zm
c2V0X3Qgc3ZhLCB2bV9vZmZzZXRfdCBldmEpCit7CisJc3RydWN0IHJ3bG9jayAqbG9jazsKKwl2
bV9vZmZzZXRfdCB2YSwgdmFfbmV4dDsKKwlwZF9lbnRyeV90IHB0cGFkZHIsICpwZGUsICpwZHBl
OworCXB0X2VudHJ5X3QgKnB0ZTsKKwlzdHJ1Y3Qgc3BnbGlzdCBmcmVlOworCWludCBhbnl2YWxp
ZDsKKworCS8qCisJICogUGVyZm9ybSBhbiB1bnN5bmNocm9uaXplZCByZWFkLiAgVGhpcyBpcywg
aG93ZXZlciwgc2FmZS4KKwkgKi8KKwlpZiAocG1hcC0+cG1fc3RhdHMucmVzaWRlbnRfY291bnQg
PT0gMCkKKwkJcmV0dXJuOworCisJYW55dmFsaWQgPSAwOworCVNMSVNUX0lOSVQoJmZyZWUpOwor
CisJcndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJUE1BUF9MT0NLKHBtYXApOworCisJLyoK
KwkgKiBzcGVjaWFsIGhhbmRsaW5nIG9mIHJlbW92aW5nIG9uZSBwYWdlLiAgYSB2ZXJ5IGNvbW1v
biBvcGVyYXRpb24KKwkgKiBhbmQgZWFzeSB0byBzaG9ydCBjaXJjdWl0IHNvbWUgY29kZS4KKwkg
Ki8KKwlpZiAoKHN2YSArIFBBR0VfU0laRSkgPT0gZXZhKSB7CisJCXBkZSA9IHBtYXBfcGRlKHBt
YXAsIHN2YSk7CisJCWlmICghcGRlX2lzXzFtX3N1cGVycGFnZShwZGUpKSB7CisJCQlwbWFwX3Jl
bW92ZV9wYWdlKHBtYXAsIHN2YSwgJmZyZWUpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwls
b2NrID0gTlVMTDsKKwlmb3IgKDsgc3ZhIDwgZXZhOyBzdmEgPSB2YV9uZXh0KSB7CisJCWlmIChw
bWFwLT5wbV9zdGF0cy5yZXNpZGVudF9jb3VudCA9PSAwKQorCQkJYnJlYWs7CisKKwkJcGRwZSA9
IHBtYXBfc2VnbWFwKHBtYXAsIHN2YSk7CisJCWlmICgqcGRwZSA9PSAwKSB7CisJCQl2YV9uZXh0
ID0gKHN2YSArIE5CU0VHKSAmIH5TRUdNQVNLOworCQkJaWYgKHZhX25leHQgPCBzdmEpCisJCQkJ
dmFfbmV4dCA9IGV2YTsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qCisJCSAqIENhbGN1bGF0ZSBp
bmRleCBmb3IgbmV4dCBwYWdlIHRhYmxlLgorCQkgKi8KKwkJdmFfbmV4dCA9IChzdmEgKyBOQlBE
UikgJiB+UERSTUFTSzsKKwkJaWYgKHZhX25leHQgPCBzdmEpCisJCQl2YV9uZXh0ID0gZXZhOwor
CisJCXBkZSA9IHBtYXBfcGRwZV90b19wZGUocGRwZSwgc3ZhKTsKKwkJcHRwYWRkciA9ICpwZGU7
CisKKwkJLyoKKwkJICogV2VlZCBvdXQgaW52YWxpZCBtYXBwaW5ncy4KKwkJICovCisJCWlmIChw
dHBhZGRyID09IE5VTEwpCisJCQljb250aW51ZTsKKwkJLyoKKwkJICogQ2hlY2sgZm9yIHN1cGVy
cGFnZS4KKwkJICovCisJCWlmIChwZGVfaXNfMW1fc3VwZXJwYWdlKCZwdHBhZGRyKSkgeworCQkJ
LyoKKwkJCSAqIEFyZSB3ZSByZW1vdmluZyB0aGUgZW50aXJlIHN1cGVycGFnZT8gIElmIG5vdCwK
KwkJCSAqIGRlbW90ZSB0aGUgbWFwcGluZyBhbmQgZmFsbCB0aHJvdWdoLgorCQkJICovCisJCQlp
ZiAoc3ZhICsgTkJQRFIgPT0gdmFfbmV4dCAmJiBldmEgPj0gdmFfbmV4dCkgeworCQkJCS8qCisJ
CQkJICogVGhlIFRMQiBlbnRyeSBmb3IgYSBQVEVfRyBtYXBwaW5nIGlzCisJCQkJICogaW52YWxp
ZGF0ZWQgYnkgcG1hcF9yZW1vdmVfcGRlKCkuCisJCQkJICovCisJCQkJaWYgKCFwZGVfdGVzdCgm
cHRwYWRkciwgUFRFX0cpKQorCQkJCQlhbnl2YWxpZCA9IFRSVUU7CisJCQkJcG1hcF9yZW1vdmVf
cGRlKHBtYXAsIHBkZSwgc3ZhLCAmZnJlZSwgJmxvY2spOworCQkJCWNvbnRpbnVlOworCQkJfSBl
bHNlIGlmICghcG1hcF9kZW1vdGVfcGRlX2xvY2tlZChwbWFwLCBwZGUsIHN2YSwKKwkJCSAgICAm
bG9jaykpIHsKKwkJCQkvKiBUaGUgc3VwZXJwYWdlIG1hcHBpbmcgd2FzIGRlc3Ryb3llZC4gKi8K
KwkJCQljb250aW51ZTsKKwkJCX0gZWxzZSB7CisJCQkJcHRwYWRkciA9ICpwZGU7CisJCQl9CisJ
CX0KKworCQkvKgorCQkgKiBMaW1pdCBvdXIgc2NhbiB0byBlaXRoZXIgdGhlIGVuZCBvZiB0aGUg
dmEgcmVwcmVzZW50ZWQKKwkJICogYnkgdGhlIGN1cnJlbnQgcGFnZSB0YWJsZSBwYWdlLCBvciB0
byB0aGUgZW5kIG9mIHRoZQorCQkgKiByYW5nZSBiZWluZyByZW1vdmVkLgorCQkgKi8KKwkJaWYg
KHZhX25leHQgPiBldmEpCisJCQl2YV9uZXh0ID0gZXZhOworCisJCXZhID0gdmFfbmV4dDsKKwkJ
Zm9yIChwdGUgPSBwbWFwX3BkZV90b19wdGUocGRlLCBzdmEpOyBzdmEgIT0gdmFfbmV4dDsgcHRl
KyssCisJCSAgICBzdmEgKz0gUEFHRV9TSVpFKSB7CisJCQlpZiAoIXB0ZV9pc192YWxpZChwdGUp
KSB7CisJCQkJaWYgKHZhICE9IHZhX25leHQpIHsKKwkJCQkJcG1hcF9pbnZhbGlkYXRlX3Jhbmdl
KHBtYXAsIHZhLCBzdmEpOworCQkJCQl2YSA9IHZhX25leHQ7CisJCQkJfQorCQkJCWNvbnRpbnVl
OworCQkJfQorCQkJaWYgKCFwdGVfdGVzdChwdGUsIFBURV9HKSkKKwkJCQlhbnl2YWxpZCA9IFRS
VUU7CisJCQlpZiAodmEgPT0gdmFfbmV4dCkKKwkJCQl2YSA9IHN2YTsKKwkJCWlmIChwbWFwX3Jl
bW92ZV9wdGUocG1hcCwgcHRlLCBzdmEsIHB0cGFkZHIsICZmcmVlLAorCQkJICAgICZsb2NrKSkg
eworCQkJCXN2YSArPSBQQUdFX1NJWkU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKHZh
ICE9IHZhX25leHQpCisJCQlwbWFwX2ludmFsaWRhdGVfcmFuZ2UocG1hcCwgdmEsIHN2YSk7CisJ
fQorCWlmIChsb2NrICE9IE5VTEwpCisJCXJ3X3d1bmxvY2sobG9jayk7CitvdXQ6CisJaWYgKGFu
eXZhbGlkKQorCQlwbWFwX2ludmFsaWRhdGVfYWxsKHBtYXApOworCXJ3X3J1bmxvY2soJnB2aF9n
bG9iYWxfbG9jayk7CisJUE1BUF9VTkxPQ0socG1hcCk7CisJcG1hcF9mcmVlX3plcm9fcGFnZXMo
JmZyZWUpOworfQorCisvKgorICoJUm91dGluZToJcG1hcF9yZW1vdmVfYWxsCisgKglGdW5jdGlv
bjoKKyAqCQlSZW1vdmVzIHRoaXMgcGh5c2ljYWwgcGFnZSBmcm9tCisgKgkJYWxsIHBoeXNpY2Fs
IG1hcHMgaW4gd2hpY2ggaXQgcmVzaWRlcy4KKyAqCQlSZWZsZWN0cyBiYWNrIG1vZGlmeSBiaXRz
IHRvIHRoZSBwYWdlci4KKyAqCisgKglOb3RlczoKKyAqCQlPcmlnaW5hbCB2ZXJzaW9ucyBvZiB0
aGlzIHJvdXRpbmUgd2VyZSB2ZXJ5CisgKgkJaW5lZmZpY2llbnQgYmVjYXVzZSB0aGV5IGl0ZXJh
dGl2ZWx5IGNhbGxlZAorICoJCXBtYXBfcmVtb3ZlIChzbG93Li4uKQorICovCit2b2lkCitwbWFw
X3JlbW92ZV9hbGwodm1fcGFnZV90IG0pCit7CisJc3RydWN0IG1kX3BhZ2UgKnB2aDsKKwlwdl9l
bnRyeV90IHB2OworCXBtYXBfdCBwbWFwOworCXB0X2VudHJ5X3QgKnB0ZSwgdHB0ZTsKKwlwZF9l
bnRyeV90ICpwZGU7CisJdm1fb2Zmc2V0X3QgdmE7CisJc3RydWN0IHNwZ2xpc3QgZnJlZTsKKwor
CUtBU1NFUlQoKG0tPm9mbGFncyAmIFZQT19VTk1BTkFHRUQpID09IDAsCisJICAgICgicG1hcF9y
ZW1vdmVfYWxsOiBwYWdlICVwIGlzIG5vdCBtYW5hZ2VkIiwgbSkpOworCVNMSVNUX0lOSVQoJmZy
ZWUpOworCXJ3X3dsb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCWlmICgobS0+ZmxhZ3MgJiBQR19G
SUNUSVRJT1VTKSAhPSAwKQorCQlnb3RvIHNtYWxsX21hcHBpbmdzOworCXB2aCA9IHBhX3RvX3B2
aChWTV9QQUdFX1RPX1BIWVMobSkpOworCXdoaWxlICgocHYgPSBUQUlMUV9GSVJTVCgmcHZoLT5w
dl9saXN0KSkgIT0gTlVMTCkgeworCQlwbWFwID0gUFZfUE1BUChwdik7CisJCVBNQVBfTE9DSyhw
bWFwKTsKKwkJdmEgPSBwdi0+cHZfdmE7CisJCXBkZSA9IHBtYXBfcGRlKHBtYXAsIHZhKTsKKwkJ
KHZvaWQpcG1hcF9kZW1vdGVfcGRlKHBtYXAsIHBkZSwgdmEpOworCQlQTUFQX1VOTE9DSyhwbWFw
KTsKKwl9CitzbWFsbF9tYXBwaW5nczoKKwl3aGlsZSAoKHB2ID0gVEFJTFFfRklSU1QoJm0tPm1k
LnB2X2xpc3QpKSAhPSBOVUxMKSB7CisJCXBtYXAgPSBQVl9QTUFQKHB2KTsKKwkJUE1BUF9MT0NL
KHBtYXApOworCisJCS8qCisJCSAqIElmIGl0J3MgbGFzdCBtYXBwaW5nIHdyaXRlYmFjayBhbGwg
Y2FjaGVzIGZyb20KKwkJICogdGhlIHBhZ2UgYmVpbmcgZGVzdHJveWVkCisJCSAqLworCQlpZiAo
VEFJTFFfTkVYVChwdiwgcHZfbmV4dCkgPT0gTlVMTCkKKwkJCW1pcHNfZGNhY2hlX3diaW52X3Jh
bmdlX2luZGV4KHB2LT5wdl92YSwgUEFHRV9TSVpFKTsKKworCQlwbWFwX3Jlc2lkZW50X2NvdW50
X2RlYyhwbWFwLCAxKTsKKwkJcGRlID0gcG1hcF9wZGUocG1hcCwgcHYtPnB2X3ZhKTsKKwkJS0FT
U0VSVChwZGUgIT0gTlVMTCAmJiAqcGRlICE9IDAsICgicG1hcF9yZW1vdmVfYWxsOiBwZGUiKSk7
CisJCUtBU1NFUlQoIXBkZV9pc19zdXBlcnBhZ2UocGRlKSwgKCJwbWFwX3JlbW92ZV9hbGw6IGZv
dW5kIgorCQkgICAgIiBhIHN1cGVycGFnZSBpbiBwYWdlICVwICdzIHB2IGxpc3QiLCBtKSk7CisJ
CXB0ZSA9IHBtYXBfcGRlX3RvX3B0ZShwZGUsIHB2LT5wdl92YSk7CisKKwkJdHB0ZSA9ICpwdGU7
CisJCXB0ZV9zdG9yZShwdGUsIGlzX2tlcm5lbF9wbWFwKHBtYXApID8gUFRFX0cgOiAwKTsKKwor
CQlpZiAocHRlX3Rlc3QoJnRwdGUsIFBURV9XKSkKKwkJCXBtYXAtPnBtX3N0YXRzLndpcmVkX2Nv
dW50LS07CisKKwkJLyoKKwkJICogVXBkYXRlIHRoZSB2bV9wYWdlX3QgZGlydHkgYW5kIHJlZmVy
ZW5jZSBiaXRzLgorCQkgKi8KKwkJaWYgKHB0ZV9pc19yZWYoJnRwdGUpKQorCQkJdm1fcGFnZV9h
ZmxhZ19zZXQobSwgUEdBX1JFRkVSRU5DRUQpOworCQlpZiAocHRlX3Rlc3QoJnRwdGUsIFBURV9E
KSkgeworCQkJS0FTU0VSVCghcHRlX3Rlc3QoJnRwdGUsIFBURV9STyksCisJCQkgICAgKCIlczog
bW9kaWZpZWQgcGFnZSBub3Qgd3JpdGFibGU6IHZhOiAlcCwgcHRlOiAlI2p4IgorCQkJICAgICwg
X19mdW5jX18sICh2b2lkICopcHYtPnB2X3ZhLCAodWludG1heF90KXRwdGUpKTsKKwkJCXZtX3Bh
Z2VfZGlydHkobSk7CisJCX0KKwkJcG1hcF91bnVzZV9wdChwbWFwLCBwdi0+cHZfdmEsICpwZGUs
ICZmcmVlKTsKKwkJcG1hcF9pbnZhbGlkYXRlX3BhZ2UocG1hcCwgcHYtPnB2X3ZhKTsKKworCQlU
QUlMUV9SRU1PVkUoJm0tPm1kLnB2X2xpc3QsIHB2LCBwdl9uZXh0KTsKKwkJbS0+bWQucHZfZ2Vu
Kys7CisJCWZyZWVfcHZfZW50cnkocG1hcCwgcHYpOworCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwl9
CisKKwl2bV9wYWdlX2FmbGFnX2NsZWFyKG0sIFBHQV9XUklURUFCTEUpOworCXJ3X3d1bmxvY2so
JnB2aF9nbG9iYWxfbG9jayk7CisJcG1hcF9mcmVlX3plcm9fcGFnZXMoJmZyZWUpOworfQorCisv
KgorICogcG1hcF9wcm90ZWN0X3BkZTogZG8gdGhlIHRoaW5ncyB0byBwcm90ZWN0IGEgc3VwZXJw
YWdlIGluIGEgcHJvY2VzcworICovCitzdGF0aWMgYm9vbGVhbl90CitwbWFwX3Byb3RlY3RfcGRl
KHBtYXBfdCBwbWFwLCBwZF9lbnRyeV90ICpwZGUsIHZtX29mZnNldF90IHN2YSwgdm1fcHJvdF90
IHByb3QpCit7CisJcGRfZW50cnlfdCBuZXdwZGUsIG9sZHBkZTsKKwl2bV9vZmZzZXRfdCBldmEs
IHZhOworCXZtX3BhZ2VfdCBtOworCWJvb2xlYW5fdCBhbnljaGFuZ2VkOworCisJUE1BUF9MT0NL
X0FTU0VSVChwbWFwLCBNQV9PV05FRCk7CisJS0FTU0VSVCgoc3ZhICYgUERSTUFTSykgPT0gMCwK
KwkgICAgKCIlczogc3ZhIGlzIG5vdCAybXBhZ2UgYWxpZ25lZCIsIF9fZnVuY19fKSk7CisJYW55
Y2hhbmdlZCA9IEZBTFNFOworcmV0cnk6CisJb2xkcGRlID0gbmV3cGRlID0gKnBkZTsKKwlpZiAo
cGRlX3Rlc3QoJm9sZHBkZSwgUFRFX01BTkFHRUQpKSB7CisJCWV2YSA9IHN2YSArIE5CUERSOwor
CQlmb3IgKHZhID0gc3ZhLCBtID0gUEhZU19UT19WTV9QQUdFKFRMQkxPX1BERV9UT19QQShvbGRw
ZGUpKTsKKwkJICAgIHZhIDwgZXZhOyB2YSArPSBQQUdFX1NJWkUsIG0rKykKKwkJCWlmIChwZGVf
dGVzdCgmb2xkcGRlLCBQVEVfRCkgJiYKKwkJCSAgICAhcGRlX3Rlc3QoJm9sZHBkZSwgUFRFX1JP
KSkKKwkJCQl2bV9wYWdlX2RpcnR5KG0pOworCX0KKwlpZiAoKHByb3QgJiBWTV9QUk9UX1dSSVRF
KSA9PSAwKSB7CisJCXBkZV9zZXQoJm5ld3BkZSwgUFRFX1JPKTsKKwkJcGRlX2NsZWFyKCZuZXdw
ZGUsIFBURV9EKTsKKwl9CisJaWYgKG5ld3BkZSAhPSBvbGRwZGUpIHsKKwkJaWYgKCFhdG9taWNf
Y21wc2V0X2xvbmcoKHB0X2VudHJ5X3QgKilwZGUsIChwdF9lbnRyeV90KW9sZHBkZSwKKwkJICAg
IChwdF9lbnRyeV90KW5ld3BkZSkpCisJCQlnb3RvIHJldHJ5OworCQlpZiAocGRlX3Rlc3QoJm9s
ZHBkZSwgUFRFX0cpKQorCQkJcG1hcF9pbnZhbGlkYXRlX3BhZ2UocG1hcCwgc3ZhKTsKKwkJZWxz
ZQorCQkJYW55Y2hhbmdlZCA9IFRSVUU7CisJfQorCXJldHVybiAoYW55Y2hhbmdlZCk7Cit9CisK
Ky8qLQorICoJU2V0IHRoZSBwaHlzaWNhbCBwcm90ZWN0aW9uIG9uIHRoZQorICoJc3BlY2lmaWVk
IHJhbmdlIG9mIHRoaXMgbWFwIGFzIHJlcXVlc3RlZC4KKyAqLwordm9pZAorcG1hcF9wcm90ZWN0
KHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCBzdmEsIHZtX29mZnNldF90IGV2YSwgdm1fcHJvdF90
IHByb3QpCit7CisJdm1fb2Zmc2V0X3QgdmEsIHZhX25leHQ7CisJcGRfZW50cnlfdCAqcGRlLCAq
cGRwZTsKKwlwdF9lbnRyeV90ICpwdGU7CisJYm9vbGVhbl90IGFueWNoYW5nZWQsIHB2X2xpc3Rz
X2xvY2tlZDsKKworCWlmICgocHJvdCAmIFZNX1BST1RfUkVBRCkgPT0gVk1fUFJPVF9OT05FKSB7
CisJCXBtYXBfcmVtb3ZlKHBtYXAsIHN2YSwgZXZhKTsKKwkJcmV0dXJuOworCX0KKwlpZiAocHJv
dCAmIFZNX1BST1RfV1JJVEUpCisJCXJldHVybjsKKworCXB2X2xpc3RzX2xvY2tlZCA9IEZBTFNF
OworcmVzdW1lOgorCWFueWNoYW5nZWQgPSBGQUxTRTsKKworCVBNQVBfTE9DSyhwbWFwKTsKKwlm
b3IgKDsgc3ZhIDwgZXZhOyBzdmEgPSB2YV9uZXh0KSB7CisJCXBkcGUgPSBwbWFwX3NlZ21hcChw
bWFwLCBzdmEpOworCQlpZiAoKnBkcGUgPT0gMCkgeworCQkJdmFfbmV4dCA9IChzdmEgKyBOQlNF
RykgJiB+U0VHTUFTSzsKKwkJCWlmICh2YV9uZXh0IDwgc3ZhKQorCQkJCXZhX25leHQgPSBldmE7
CisJCQljb250aW51ZTsKKwkJfQorCQl2YV9uZXh0ID0gKHN2YSArIE5CUERSKSAmIH5QRFJNQVNL
OworCQlpZiAodmFfbmV4dCA8IHN2YSkKKwkJCXZhX25leHQgPSBldmE7CisKKwkJcGRlID0gcG1h
cF9wZHBlX3RvX3BkZShwZHBlLCBzdmEpOworCisJCS8qCisJCSAqIFdlZWQgb3V0IGludmFsaWQg
bWFwcGluZ3MuCisJCSAqLworCQlpZiAoKnBkZSA9PSBOVUxMKQorCQkJY29udGludWU7CisKKwkJ
LyoKKwkJICogQ2hlY2sgZm9yIHN1cGVycGFnZS4KKwkJICovCisJCWlmIChwZGVfaXNfMW1fc3Vw
ZXJwYWdlKHBkZSkpIHsKKwkJCS8qCisJCQkgKiBBcmUgd2UgcHJvdGVjdGluZyB0aGUgZW50aXJl
IHN1cGVycGFnZT8gSWYgbm90LAorCQkJICogZGVtb3RlIHRoZSBtYXBwaW5nIGFuZCBmYWxsIHRo
cm91Z2guCisJCQkgKi8KKwkJCWlmIChzdmEgKyBOQlBEUiA9PSB2YV9uZXh0ICYmIGV2YSA+PSB2
YV9uZXh0KSB7CisJCQkJLyoKKwkJCQkgKiBUaGUgVExCIGVudHJ5IGZvciBhIFBHX0cgbWFwcGlu
ZyBpcworCQkJCSAqIGludmFsaWRhdGVkIGJ5IHBtYXBfcHJvdGVjdF9wZGUoKS4KKwkJCQkgKi8K
KwkJCQlpZiAocG1hcF9wcm90ZWN0X3BkZShwbWFwLCBwZGUsIHN2YSwgcHJvdCkpCisJCQkJCWFu
eWNoYW5nZWQgPSBUUlVFOworCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoIXB2
X2xpc3RzX2xvY2tlZCkgeworCQkJCQlwdl9saXN0c19sb2NrZWQgPSBUUlVFOworCQkJCQlpZiAo
IXJ3X3RyeV9ybG9jaygmcHZoX2dsb2JhbF9sb2NrKSkgeworCQkJCQkJaWYgKGFueWNoYW5nZWQp
CisJCQkJCQkJcG1hcF9pbnZhbGlkYXRlX2FsbCgKKwkJCQkJCQkgICAgcG1hcCk7CisJCQkJCQlQ
TUFQX1VOTE9DSyhwbWFwKTsKKwkJCQkJCXJ3X3Jsb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCQkJ
CQkJZ290byByZXN1bWU7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKCFwbWFwX2RlbW90ZV9wZGUo
cG1hcCwgcGRlLCBzdmEpKSB7CisJCQkJCS8qCisJCQkJCSAqIFRoZSBzdXBlcnBhZ2UgbWFwcGlu
ZyB3YXMgZGVzdHJveWVkLgorCQkJCQkgKi8KKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJfQor
CQl9CisJCS8qCisJCSAqIExpbWl0IG91ciBzY2FuIHRvIGVpdGhlciB0aGUgZW5kIG9mIHRoZSB2
YSByZXByZXNlbnRlZAorCQkgKiBieSB0aGUgY3VycmVudCBwYWdlIHRhYmxlIHBhZ2UsIG9yIHRv
IHRoZSBlbmQgb2YgdGhlCisJCSAqIHJhbmdlIGJlaW5nIHdyaXRlIHByb3RlY3RlZC4KKwkJICov
CisJCWlmICh2YV9uZXh0ID4gZXZhKQorCQkJdmFfbmV4dCA9IGV2YTsKKworCQl2YSA9IHZhX25l
eHQ7CisJCWZvciAocHRlID0gcG1hcF9wZGVfdG9fcHRlKHBkZSwgc3ZhKTsgc3ZhICE9IHZhX25l
eHQ7IHB0ZSsrLAorCQkgICAgc3ZhICs9IFBBR0VfU0laRSkgeworCQkJcHRfZW50cnlfdCBwYml0
czsKKwkJCXZtX3BhZ2VfdCBtOworCQkJdm1fcGFkZHJfdCBwYTsKKworCQkJcGJpdHMgPSAqcHRl
OworCQkJaWYgKCFwdGVfaXNfdmFsaWQoJnBiaXRzKSB8fCBwdGVfdGVzdCgmcGJpdHMsIFBURV9S
TykpIHsKKwkJCQlpZiAodmEgIT0gdmFfbmV4dCkgeworCQkJCQlwbWFwX2ludmFsaWRhdGVfcmFu
Z2UocG1hcCwgdmEsIHN2YSk7CisJCQkJCXZhID0gdmFfbmV4dDsKKwkJCQl9CisJCQkJY29udGlu
dWU7CisJCQl9CisJCQlwdGVfc2V0KCZwYml0cywgUFRFX1JPKTsKKwkJCWlmIChwdGVfdGVzdCgm
cGJpdHMsIFBURV9EKSkgeworCQkJCXB0ZV9jbGVhcigmcGJpdHMsIFBURV9EKTsKKwkJCQlpZiAo
cHRlX3Rlc3QoJnBiaXRzLCBQVEVfTUFOQUdFRCkpIHsKKwkJCQkJcGEgPSBUTEJMT19QVEVfVE9f
UEEocGJpdHMpOworCQkJCQltID0gUEhZU19UT19WTV9QQUdFKHBhKTsKKwkJCQkJdm1fcGFnZV9k
aXJ0eShtKTsKKwkJCQl9CisJCQkJaWYgKHZhID09IHZhX25leHQpCisJCQkJCXZhID0gc3ZhOwor
CQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSAqIFVubGVzcyBQVEVfRCBpcyBzZXQsIGFueSBUTEIg
ZW50cmllcworCQkJCSAqIG1hcHBpbmcgInN2YSIgZG9uJ3QgYWxsb3cgd3JpdGUgYWNjZXNzLCBz
bworCQkJCSAqIHRoZXkgbmVlZG4ndCBiZSBpbnZhbGlkYXRlZC4KKwkJCQkgKi8KKwkJCQlpZiAo
dmEgIT0gdmFfbmV4dCkgeworCQkJCQlwbWFwX2ludmFsaWRhdGVfcmFuZ2UocG1hcCwgdmEsIHN2
YSk7CisJCQkJCXZhID0gdmFfbmV4dDsKKwkJCQl9CisJCQl9CisJCQkqcHRlID0gcGJpdHM7CisJ
CX0KKwkJaWYgKHZhICE9IHZhX25leHQpCisJCQlwbWFwX2ludmFsaWRhdGVfcmFuZ2UocG1hcCwg
dmEsIHN2YSk7CisJfQorCWlmIChhbnljaGFuZ2VkKQorCQlwbWFwX2ludmFsaWRhdGVfYWxsKHBt
YXApOworCWlmIChwdl9saXN0c19sb2NrZWQpIHsKKwkJcndfcnVubG9jaygmcHZoX2dsb2JhbF9s
b2NrKTsKKwl9CisJUE1BUF9VTkxPQ0socG1hcCk7Cit9CisKKy8qLQorICogVHJpZXMgdG8gcHJv
bW90ZSB0aGUgNTEyLCBjb250aWd1b3VzIDRLQiBwYWdlIG1hcHBpbmdzIHRoYXQgYXJlIHdpdGhp
biBhCisgKiBzaW5nbGUgcGFnZSB0YWJsZSBwYWdlIHRvIGEgc2luZ2xlIDJNQiBwYWdlIG1hcHBp
bmcuICBGb3IgcHJvbW90aW9uIHRvCisgKiBvY2N1ciwgdHdvIGNvbmRpdGlvbnMgbXVzdCBiZSBt
ZXQ6ICgxKSB0aGUgNEtCIHBhZ2UgbWFwcGluZ3MgbXVzdCBtYXAKKyAqIGFsaWduZWQsIGNvbnRp
Z3VvdXMgcGh5c2ljYWwgbWVtb3J5IGFuZCAoMikgdGhlIDRLQiBwYWdlIG1hcHBpbmdzIG11c3Qg
aGF2ZQorICogaWRlbnRpY2FsIGNoYXJhY3RlcmlzdGljcy4KKyAqCisgKiBPbiBNSVBTNjQgcHJv
bW90aW9ucyBhcmUgYWN0dWFsbHkgZG9uZSBpbiBwYWlycyBvZiB0d28gMU1CIHN1cGVycGFnZXMK
KyAqIGJlY2F1c2Ugb2YgdGhlIGhhcmR3YXJlIGFyY2hpdGVjdHVyZSAodHdvIHBoeXNpY2FsIHBh
Z2VzIGFyZSBpbiBhIHNpbmdsZQorICogVExCIGVudHJ5KSBldmVuIHRob3VnaCBWTSBsYXllciBp
cyB1bmRlciB0aGUgaW1wcmVzc2lvbiB0aGF0IHRoZSBzdXBlcnBhZ2UKKyAqIHNpemUgaXMgYWN0
dWFsbHkgMk1CLgorICovCitzdGF0aWMgdm9pZAorcG1hcF9wcm9tb3RlX3BkZShwbWFwX3QgcG1h
cCwgcGRfZW50cnlfdCAqcGRlLCB2bV9vZmZzZXRfdCB2YSwKKyAgICBzdHJ1Y3Qgcndsb2NrICoq
bG9ja3ApCit7CisJcHRfZW50cnlfdCBuZXdwZGU7CisJcHRfZW50cnlfdCAqZmlyc3RwdGUsIG9s
ZHB0ZSwgcGEsICpwdGU7CisJdm1fb2Zmc2V0X3Qgb2xkcHRldmE7CisJdm1fcGFnZV90IG1wdGU7
CisKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsKKwkvKgorCSAqIEV4YW1pbmUg
dGhlIGZpcnN0IFBURSBpbiB0aGUgc3BlY2lmaWVkIFBUUC4gIEFib3J0IGlmIHRoaXMgUFRFIGlz
CisJICogZWl0aGVyIGludmFsaWQsIHVudXNlZCwgb3IgZG9lcyBub3QgbWFwIHRoZSBmaXJzdCA0
S0IgcGh5c2ljYWwgcGFnZQorCSAqIHdpdGhpbiBhIDJNQiBwYWdlLgorCSAqLworCWZpcnN0cHRl
ID0gcG1hcF9wdGUocG1hcCwgdHJ1bmNfMm1wYWdlKHZhKSk7CitzZXRwZGU6CisJbmV3cGRlID0g
KmZpcnN0cHRlOworCWlmIChpc19rZXJuZWxfcG1hcChwbWFwKSkgeworCQkvKiBYWFggbm90IGRv
aW5nIGtlcm5lbCBwbWFwIHlldCAqLworCQlhdG9taWNfYWRkX2xvbmcoJnBtYXBfcGRlX3BfZmFp
bHVyZXMsIDEpOworCQlDVFIzKEtUUl9QTUFQLCAiJXM6IGZhaWx1cmUgZm9yIHZhICUjbHggaW4g
cG1hcCAlcCIsCisJCSAgICBfX2Z1bmNfXywgdmEsIHBtYXApOworCQlyZXR1cm47CisJfQorCWlm
ICghcHRlX2lzX3ZhbGlkKCZuZXdwZGUpIHx8ICFwdGVfaXNfcmVmKCZuZXdwZGUpKSB7CisJCWF0
b21pY19hZGRfbG9uZygmcG1hcF9wZGVfcF9mYWlsdXJlcywgMSk7CisJCUNUUjMoS1RSX1BNQVAs
ICIlczogZmFpbHVyZSBmb3IgdmEgJSNseCBpbiBwbWFwICVwIiwKKwkJICAgIF9fZnVuY19fLCB2
YSwgcG1hcCk7CisJCXJldHVybjsKKwl9CisJaWYgKCFwdGVfdGVzdCgmbmV3cGRlLCBQVEVfRCkg
JiYgIXB0ZV90ZXN0KCZuZXdwZGUsIFBURV9STykpIHsKKwkJLyoKKwkJICogV2hlbiBQVEVfRCBp
cyBhbHJlYWR5IGNsZWFyLCBQVEVfUk8gY2FuIGJlIHNldCB3aXRob3V0CisJCSAqIGEgVExCIGlu
dmFsaWRhdGlvbi4KKwkJICovCisJCWlmICghYXRvbWljX2NtcHNldF9sb25nKCh1X2xvbmcgKilm
aXJzdHB0ZSwgbmV3cGRlLCBuZXdwZGUgfAorCQkgICAgUFRFX1JPKSkKKwkJCWdvdG8gc2V0cGRl
OworCQluZXdwZGUgfD0gUFRFX1JPOworCX0KKworCS8qCisJICogRXhhbWluZSBlYWNoIG9mIHRo
ZSBvdGhlciBQVEVzIGluIHRoZSBzcGVjaWZpZWQgUFRQLiAgQWJvcnQgaWYgdGhpcworCSAqIFBU
RSBtYXBzIGFuIHVuZXhwZWN0ZWQgNEtCIHBoeXNpY2FsIHBhZ2Ugb3IgZG9lcyBub3QgaGF2ZSBp
ZGVudGljYWwKKwkgKiBjaGFyYWN0ZXJpc3RpY3MgdG8gdGhlIGZpcnN0IFBURS4KKwkgKi8KKwlw
YSA9IFRMQkxPX1BURV9UT19QQShuZXdwZGUpICsgTkJQRFIgLSBQQUdFX1NJWkU7CisJZm9yIChw
dGUgPSBmaXJzdHB0ZSArIE5QVEVQRyAtIDE7IHB0ZSA+IGZpcnN0cHRlOyBwdGUtLSkgeworc2V0
cHRlOgorCQlvbGRwdGUgPSAqcHRlOworCQlpZiAoVExCTE9fUFRFX1RPX1BBKG9sZHB0ZSkgIT0g
cGEpIHsKKwkJCWF0b21pY19hZGRfbG9uZygmcG1hcF9wZGVfcF9mYWlsdXJlcywgMSk7CisJCQlD
VFIzKEtUUl9QTUFQLCAiJXM6IGZhaWx1cmUgZm9yIHZhICUjbHggaW4gcG1hcCAlcCIsCisJCQkg
ICAgX19mdW5jX18sIHZhLCBwbWFwKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoIXB0ZV90ZXN0
KCZvbGRwdGUsIFBURV9EKSAmJiAhcHRlX3Rlc3QoJm9sZHB0ZSwgUFRFX1JPKSkgeworCQkJaWYg
KCFhdG9taWNfY21wc2V0X2xvbmcocHRlLCBvbGRwdGUsIG9sZHB0ZSB8IFBURV9STykpCisJCQkJ
Z290byBzZXRwdGU7CisJCQlvbGRwdGUgfD0gUFRFX1JPOworCQkJb2xkcHRldmEgPSAodmEgJiB+
UERSTUFTSykgfAorCQkJICAgIChUTEJMT19QVEVfVE9fUEEob2xkcHRlKSAmIFBEUk1BU0spOwor
CQkJQ1RSMyhLVFJfUE1BUCwgIiVzOiBwcm90ZWN0IGZvciB2YSAlI2x4IGluIHBtYXAgJXAiLAor
CQkJICAgIF9fZnVuY19fLCBvbGRwdGV2YSwgcG1hcCk7CisJCX0KKwkJaWYgKChvbGRwdGUgJiBQ
R19QUk9NT1RFX01BU0spICE9IChuZXdwZGUgJiBQR19QUk9NT1RFX01BU0spKSB7CisJCQlhdG9t
aWNfYWRkX2xvbmcoJnBtYXBfcGRlX3BfZmFpbHVyZXMsIDEpOworCQkJQ1RSMyhLVFJfUE1BUCwg
IiVzOiBmYWlsdXJlIGZvciB2YSAlI2x4IGluIHBtYXAgJXAiLAorCQkJICAgIF9fZnVuY19fLCB2
YSwgcG1hcCk7CisJCQlyZXR1cm47CisJCX0KKwkJcGEgLT0gUEFHRV9TSVpFOworCX0KKworCS8q
CisJICogU2F2ZSB0aGUgcGFnZSB0YWJsZSBwYWdlIGluIGl0cyBjdXJyZW50IHN0YXRlIHVudGls
IHRoZSBQREUKKwkgKiBtYXBwaW5nIHRoZSBzdXBlcnBhZ2UgaXMgZGVtb3RlZCBieSBwbWFwX2Rl
bW90ZV9wZGUoKSBvcgorCSAqIGRlc3Ryb3llZCBieSBwbWFwX3JlbW92ZV9wZGUoKS4KKwkgKi8K
KwltcHRlID0gUEhZU19UT19WTV9QQUdFKE1JUFNfRElSRUNUX1RPX1BIWVMoKnBkZSkpOworCUtB
U1NFUlQobXB0ZSA+PSB2bV9wYWdlX2FycmF5ICYmCisJICAgIG1wdGUgPCAmdm1fcGFnZV9hcnJh
eVt2bV9wYWdlX2FycmF5X3NpemVdLAorCSAgICAoIiVzOiBwYWdlIHRhYmxlIHBhZ2UgaXMgb3V0
IG9mIHJhbmdlIiwgX19mdW5jX18pKTsKKwlLQVNTRVJUKG1wdGUtPnBpbmRleCA9PSBwbWFwX3Bk
ZV9waW5kZXgodmEpLAorCSAgICAoIiVzOiBwYWdlIHRhYmxlIHBhZ2UncyBwaW5kZXggaXMgd3Jv
bmciLCBfX2Z1bmNfXykpOworCWlmIChwbWFwX2luc2VydF9wdF9wYWdlKHBtYXAsIG1wdGUpKSB7
CisJCWF0b21pY19hZGRfbG9uZygmcG1hcF9wZGVfcF9mYWlsdXJlcywgMSk7CisJCUNUUjMoS1RS
X1BNQVAsICIlczogZmFpbHVyZSBmb3IgdmEgJSNseCBpbiBwbWFwICVwIiwKKwkJICAgIF9fZnVu
Y19fLCB2YSwgcG1hcCk7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIFByb21vdGUgdGhlIHB2
IGVudHJpZXMuCisJICovCisJaWYgKHB0ZV90ZXN0KCZuZXdwZGUsIFBURV9NQU5BR0VEKSkKKwkJ
cG1hcF9wdl9wcm9tb3RlX3BkZShwbWFwLCB2YSwgVExCTE9fUFRFX1RPX1BBKG5ld3BkZSksIGxv
Y2twKTsKKworCS8qCisJICogTWFwIHRoZSBzdXBlcnBhZ2UuCisJICovCisJcG1hcF91cGRhdGVf
cGRlKHBtYXAsIHZhLCBwZGUsIG5ld3BkZSB8IFBURV9QU18xTSk7CisKKwlhdG9taWNfYWRkX2xv
bmcoJnBtYXBfcGRlX3Byb21vdGlvbnMsIDEpOworCUNUUjMoS1RSX1BNQVAsICIlczogc3VjY2Vz
cyBmb3IgdmEgJSNseCBpbiBwbWFwICVwIiwgX19mdW5jX18sIHZhLAorCSAgICBwbWFwKTsKK30K
KworLyoKKyAqCUluc2VydCB0aGUgZ2l2ZW4gcGh5c2ljYWwgcGFnZSAocCkgYXQKKyAqCXRoZSBz
cGVjaWZpZWQgdmlydHVhbCBhZGRyZXNzICh2KSBpbiB0aGUKKyAqCXRhcmdldCBwaHlzaWNhbCBt
YXAgd2l0aCB0aGUgcHJvdGVjdGlvbiByZXF1ZXN0ZWQuCisgKgorICoJSWYgc3BlY2lmaWVkLCB0
aGUgcGFnZSB3aWxsIGJlIHdpcmVkIGRvd24sIG1lYW5pbmcKKyAqCXRoYXQgdGhlIHJlbGF0ZWQg
cHRlIGNhbiBub3QgYmUgcmVjbGFpbWVkLgorICoKKyAqCU5COiAgVGhpcyBpcyB0aGUgb25seSBy
b3V0aW5lIHdoaWNoIE1BWSBOT1QgbGF6eS1ldmFsdWF0ZQorICoJb3IgbG9zZSBpbmZvcm1hdGlv
bi4gIFRoYXQgaXMsIHRoaXMgcm91dGluZSBtdXN0IGFjdHVhbGx5CisgKglpbnNlcnQgdGhpcyBw
YWdlIGludG8gdGhlIGdpdmVuIG1hcCBOT1cuCisgKi8KK2ludAorcG1hcF9lbnRlcihwbWFwX3Qg
cG1hcCwgdm1fb2Zmc2V0X3QgdmEsIHZtX3BhZ2VfdCBtLCB2bV9wcm90X3QgcHJvdCwKKyAgICB1
X2ludCBmbGFncywgaW50OF90IHBzaW5kIF9fdW51c2VkKQoreworICAgICAgICBzdHJ1Y3Qgcnds
b2NrICpsb2NrOworICAgICAgICB2bV9wYWRkcl90IHBhLCBvcGE7CisgICAgICAgIHBkX2VudHJ5
X3QgKnBkZTsKKyAgICAgICAgcHRfZW50cnlfdCAqcHRlOworICAgICAgICBwdF9lbnRyeV90IG9y
aWdwdGUsIG5ld3B0ZTsKKyAgICAgICAgcHZfZW50cnlfdCBwdjsKKyAgICAgICAgdm1fcGFnZV90
IG1wdGUsIG9tOworICAgICAgICBib29sZWFuX3Qgbm9zbGVlcDsKKworICAgICAgICB2YSA9IHRy
dW5jX3BhZ2UodmEpOworICAgICAgICBLQVNTRVJUKHZhIDw9IFZNX01BWF9LRVJORUxfQUREUkVT
UywgKCJwbWFwX2VudGVyOiB0b29iaWciKSk7CisgICAgICAgIEtBU1NFUlQoKG0tPm9mbGFncyAm
IFZQT19VTk1BTkFHRUQpICE9IDAgfHwgdmEgPCBrbWkuY2xlYW5fc3ZhIHx8CisgICAgICAgICAg
ICB2YSA+PSBrbWkuY2xlYW5fZXZhLAorICAgICAgICAgICAgKCJwbWFwX2VudGVyOiBtYW5hZ2Vk
IG1hcHBpbmcgd2l0aGluIHRoZSBjbGVhbiBzdWJtYXAiKSk7CisgICAgICAgIGlmICgobS0+b2Zs
YWdzICYgVlBPX1VOTUFOQUdFRCkgPT0gMCAmJiAhdm1fcGFnZV94YnVzaWVkKG0pKQorICAgICAg
ICAgICAgICAgIFZNX09CSkVDVF9BU1NFUlRfTE9DS0VEKG0tPm9iamVjdCk7CisKKyAgICAgICAg
bXB0ZSA9IE5VTEw7CisKKyAgICAgICAgbG9jayA9IE5VTEw7CisgICAgICAgIHJ3X3Jsb2NrKCZw
dmhfZ2xvYmFsX2xvY2spOworICAgICAgICBQTUFQX0xPQ0socG1hcCk7CisKKyAgICAgICAgLyoK
KyAgICAgICAgICogSW4gdGhlIGNhc2UgdGhhdCBhIHBhZ2UgdGFibGUgcGFnZSBpcyBub3QgcmVz
aWRlbnQsIHdlIGFyZQorICAgICAgICAgKiBjcmVhdGluZyBpdCBoZXJlLgorICAgICAgICAgKi8K
KwlpZiAodmEgPCBWTV9NQVhVU0VSX0FERFJFU1MpIHsKKyAgICAgICAgICAgICAgICAvKgorICAg
ICAgICAgICAgICAgICAqIEhlcmUgaWYgdGhlIHB0ZSBwYWdlIGlzbid0IG1hcHBlZCwgb3IgaWYg
aXQgaGFzIGJlZW4KKyAgICAgICAgICAgICAgICAgKiBkZWFsbG9jYXRlZC4KKyAgICAgICAgICAg
ICAgICAgKi8KKyAgICAgICAgICAgICAgICBub3NsZWVwID0gKGZsYWdzICYgUE1BUF9FTlRFUl9O
T1NMRUVQKSAhPSAwOworICAgICAgICAgICAgICAgIG1wdGUgPSBwbWFwX2FsbG9jcHRlKHBtYXAs
IHZhLCBub3NsZWVwID8gTlVMTCA6ICZsb2NrKTsKKyAgICAgICAgICAgICAgICBpZiAobXB0ZSA9
PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBLQVNTRVJUKG5vc2xlZXAgIT0gMCwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoInBtYXBfYWxsb2NwdGUgZmFpbGVkIHdpdGgg
c2xlZXAgYWxsb3dlZCIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NrICE9IE5V
TEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ3X3d1bmxvY2sobG9jayk7Cisg
ICAgICAgICAgICAgICAgICAgICAgICByd19ydW5sb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworICAg
ICAgICAgICAgICAgICAgICAgICAgUE1BUF9VTkxPQ0socG1hcCk7CisgICAgICAgICAgICAgICAg
ICAgICAgICByZXR1cm4gKEtFUk5fUkVTT1VSQ0VfU0hPUlRBR0UpOworICAgICAgICAgICAgICAg
IH0KKyAgICAgICAgfQorCXBkZSA9IHBtYXBfcGRlKHBtYXAsIHZhKTsKKwlpZiAocGRlX2lzXzFt
X3N1cGVycGFnZShwZGUpKSB7CisJCXBhbmljKCIlczogYXR0ZW1wdGVkIHBtYXBfZW50ZXIgb24g
c3VwZXJwYWdlIiwgX19mdW5jX18pOworCX0KKwlwdGUgPSBwbWFwX3BkZV90b19wdGUocGRlLCB2
YSk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogIFBhZ2UgRGlyZWN0b3J5IHRhYmxlIGVudHJ5
IG5vdCB2YWxpZCwgd2UgbmVlZCBhIG5ldyBQVCBwYWdlCisgICAgICAgICAqLworICAgICAgICBp
ZiAocHRlID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBwYW5pYygicG1hcF9lbnRlcjogaW52
YWxpZCBwYWdlIGRpcmVjdG9yeSwgcGRpcj0lcCwgdmE9JXAiLAorICAgICAgICAgICAgICAgICAg
ICAodm9pZCAqKXBtYXAtPnBtX3NlZ3RhYiwgKHZvaWQgKil2YSk7CisgICAgICAgIH0KKworICAg
ICAgICBwYSA9IFZNX1BBR0VfVE9fUEhZUyhtKTsKKyAgICAgICAgb20gPSBOVUxMOworICAgICAg
ICBvcmlncHRlID0gKnB0ZTsKKwlvcGEgPSBUTEJMT19QVEVfVE9fUEEob3JpZ3B0ZSk7CisKKyAg
ICAgICAgbmV3cHRlID0gVExCTE9fUEFfVE9fUEZOKHBhKSB8IGluaXRfcHRlX3Byb3QobSwgZmxh
Z3MsIHByb3QpOworICAgICAgICAvKgorICAgICAgICAgKiBwbWFwX2VudGVyKCkgaXMgY2FsbGVk
IGR1cmluZyBhIGZhdWx0IG9yIHNpbXVsYXRlZCBmYXVsdCBzbworICAgICAgICAgKiBzZXQgdGhl
IHJlZmVyZW5jZSBiaXQgbm93IHRvIGF2b2lkIGEgZmF1bHQuCisgICAgICAgICAqLworICAgICAg
ICBwdGVfcmVmX3NldCgmbmV3cHRlKTsKKyAgICAgICAgaWYgKChmbGFncyAmIFBNQVBfRU5URVJf
V0lSRUQpICE9IDApCisgICAgICAgICAgICAgICAgbmV3cHRlIHw9IFBURV9XOworICAgICAgICBp
ZiAoaXNfa2VybmVsX3BtYXAocG1hcCkpCisgICAgICAgICAgICAgICAgbmV3cHRlIHw9IFBURV9H
OworICAgICAgICBpZiAoaXNfY2FjaGVhYmxlX21lbShwYSkpIHsKKyAgICAgICAgICAgICAgICBp
ZiAobS0+bWQucHZfbWVtYXR0ciA9PSBWTV9NRU1BVFRSX1VOQ0FDSEVBQkxFKQorICAgICAgICAg
ICAgICAgICAgICAgICAgbmV3cHRlIHw9IFBURV9DX1VOQ0FDSEVEOworICAgICAgICAgICAgICAg
IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld3B0ZSB8PSBQVEVfQ19DQUNIRTsKKyAg
ICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgbmV3cHRlIHw9IFBURV9DX1VOQ0FDSEVEOwor
I2lmZGVmIENQVV9DSEVSSQorICAgICAgICBpZiAoKGZsYWdzICYgUE1BUF9FTlRFUl9OT0xPQURU
QUdTKSAhPSAwKQorICAgICAgICAgICAgICAgIG5ld3B0ZSB8PSBQVEVfTEM7CisgICAgICAgIGlm
ICgoZmxhZ3MgJiBQTUFQX0VOVEVSX05PU1RPUkVUQUdTKSAhPSAwKQorICAgICAgICAgICAgICAg
IG5ld3B0ZSB8PSBQVEVfU0M7CisjZW5kaWYKKworCS8qCisJICogU2V0IG1vZGlmaWVkIGJpdCBn
cmF0dWl0b3VzbHkgZm9yIHdyaXRlYWJsZSBtYXBwaW5ncyBpZgorCSAqIHRoZSBwYWdlIGlzIHVu
bWFuYWdlZC4gV2UgZG8gbm90IHdhbnQgdG8gdGFrZSBhIGZhdWx0CisJICogdG8gZG8gdGhlIGRp
cnR5IGJpdCBlbXVsYXRpb24gZm9yIHRoZXNlIG1hcHBpbmdzLgorCSAqLworCWlmICgobS0+b2Zs
YWdzICYgVlBPX1VOTUFOQUdFRCkgIT0gMCkgeworCQlpZiAoIXB0ZV90ZXN0KCZuZXdwdGUsIFBU
RV9STykpCisJCQluZXdwdGUgfD0gUFRFX0Q7CisJfQorCisgICAgICAgIC8qCisgICAgICAgICAq
IE1hcHBpbmcgaGFzIG5vdCBjaGFuZ2VkLCBtdXN0IGJlIHByb3RlY3Rpb24gb3Igd2lyaW5nIGNo
YW5nZS4KKyAgICAgICAgICovCisgICAgICAgIGlmIChwdGVfaXNfdmFsaWQoJm9yaWdwdGUpICYm
IG9wYSA9PSBwYSkgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogV2ly
aW5nIGNoYW5nZSwganVzdCB1cGRhdGUgc3RhdHMuIFdlIGRvbid0IHdvcnJ5IGFib3V0CisgICAg
ICAgICAgICAgICAgICogd2lyaW5nIFBUIHBhZ2VzIGFzIHRoZXkgcmVtYWluIHJlc2lkZW50IGFz
IGxvbmcgYXMgdGhlcmUKKyAgICAgICAgICAgICAgICAgKiBhcmUgdmFsaWQgbWFwcGluZ3MgaW4g
dGhlbS4gSGVuY2UsIGlmIGEgdXNlciBwYWdlIGlzCisgICAgICAgICAgICAgICAgICogd2lyZWQs
IHRoZSBQVCBwYWdlIHdpbGwgYmUgYWxzby4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAg
ICAgICAgICBpZiAocHRlX3Rlc3QoJm5ld3B0ZSwgUFRFX1cpICYmICFwdGVfdGVzdCgmb3JpZ3B0
ZSwgUFRFX1cpKQorICAgICAgICAgICAgICAgICAgICAgICAgcG1hcC0+cG1fc3RhdHMud2lyZWRf
Y291bnQrKzsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICghcHRlX3Rlc3QoJm5ld3B0ZSwgUFRF
X1cpICYmIHB0ZV90ZXN0KCZvcmlncHRlLAorICAgICAgICAgICAgICAgICAgICBQVEVfVykpCisg
ICAgICAgICAgICAgICAgICAgICAgICBwbWFwLT5wbV9zdGF0cy53aXJlZF9jb3VudC0tOworCisg
ICAgICAgICAgICAgICAgS0FTU0VSVCghcHRlX3Rlc3QoJm9yaWdwdGUsIFBURV9EIHwgUFRFX1JP
KSwKKyAgICAgICAgICAgICAgICAgICAgKCIlczogbW9kaWZpZWQgcGFnZSBub3Qgd3JpdGFibGU6
IHZhOiAlcCwgcHRlOiAlI2p4IiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sICh2b2lk
ICopdmEsICh1aW50bWF4X3Qpb3JpZ3B0ZSkpOworCisgICAgICAgICAgICAgICAgLyoKKyAgICAg
ICAgICAgICAgICAgKiBSZW1vdmUgdGhlIGV4dHJhIFBUIHBhZ2UgcmVmZXJlbmNlCisgICAgICAg
ICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKG1wdGUgIT0gTlVMTCkgeworICAgICAg
ICAgICAgICAgICAgICAgICAgbXB0ZS0+d2lyZV9jb3VudC0tOworICAgICAgICAgICAgICAgICAg
ICAgICAgS0FTU0VSVChtcHRlLT53aXJlX2NvdW50ID4gMCwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAoInBtYXBfZW50ZXI6IG1pc3NpbmcgcmVmZXJlbmNlIHRvIHBhZ2UgdGFibGUgcGFn
ZSwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgdmE6IDB4JWx4IiwgdmEpKTsKKyAg
ICAgICAgICAgICAgICB9CisJCWlmIChwdGVfdGVzdCgmb3JpZ3B0ZSwgUFRFX01BTkFHRUQpKSB7
CisJCQlvbSA9IG07CisJCQluZXdwdGUgfD0gUFRFX01BTkFHRUQ7CisJCQlpZiAoIXB0ZV90ZXN0
KCZuZXdwdGUsIFBURV9STykpCisJCQkJdm1fcGFnZV9hZmxhZ19zZXQobSwgUEdBX1dSSVRFQUJM
RSk7CisJCX0KKwkJZ290byB2YWxpZGF0ZTsKKwl9CisKKwlwdiA9IE5VTEw7CisKKyAgICAgICAg
LyoKKyAgICAgICAgICogTWFwcGluZyBoYXMgY2hhbmdlZCwgaW52YWxpZGF0ZSBvbGQgcmFuZ2Ug
YW5kIGZhbGwgdGhyb3VnaCB0bworICAgICAgICAgKiBoYW5kbGUgdmFsaWRhdGluZyBuZXcgbWFw
cGluZy4KKyAgICAgICAgICovCisgICAgICAgIGlmIChvcGEpIHsKKyAgICAgICAgICAgICAgICBp
ZiAocHRlX3Rlc3QoJm9yaWdwdGUsIFBURV9XKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHBt
YXAtPnBtX3N0YXRzLndpcmVkX2NvdW50LS07CisKKyAgICAgICAgICAgICAgICBpZiAocHRlX3Rl
c3QoJm9yaWdwdGUsIFBURV9NQU5BR0VEKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgb20g
PSBQSFlTX1RPX1ZNX1BBR0Uob3BhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIQU5HRV9Q
Vl9MSVNUX0xPQ0tfVE9fVk1fUEFHRSgmbG9jaywgb20pOworICAgICAgICAgICAgICAgICAgICAg
ICAgcHYgPSBwbWFwX3B2aF9yZW1vdmUoJm9tLT5tZCwgcG1hcCwgdmEpOworICAgICAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobXB0ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAg
ICAgICAgICAgICBtcHRlLT53aXJlX2NvdW50LS07CisgICAgICAgICAgICAgICAgICAgICAgICBL
QVNTRVJUKG1wdGUtPndpcmVfY291bnQgPiAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICgicG1hcF9lbnRlcjogbWlzc2luZyByZWZlcmVuY2UgdG8gcGFnZSB0YWJsZSBwYWdlLCIKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAiIHZhOiAlcCIsICh2b2lkICopdmEpKTsKKyAgICAg
ICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHBtYXBfcmVzaWRl
bnRfY291bnRfaW5jKHBtYXAsIDEpOworCisgICAgICAgIC8qCisgICAgICAgICAqIEVudGVyIG9u
IHRoZSBQViBsaXN0IGlmIHBhcnQgb2Ygb3VyIG1hbmFnZWQgbWVtb3J5LgorICAgICAgICAgKi8K
KyAgICAgICAgaWYgKChtLT5vZmxhZ3MgJiBWUE9fVU5NQU5BR0VEKSA9PSAwKSB7CisgICAgICAg
ICAgICAgICAgbmV3cHRlIHw9IFBURV9NQU5BR0VEOworCQkvKiBJbnNlcnQgRW50cnkgKi8KKwkJ
aWYgKHB2ID09IE5VTEwpCisJCQlwdiA9IGdldF9wdl9lbnRyeShwbWFwLCAmbG9jayk7CisgICAg
ICAgICAgICAgICAgcHYtPnB2X3ZhID0gdmE7CisgICAgICAgICAgICAgICAgQ0hBTkdFX1BWX0xJ
U1RfTE9DS19UT19QSFlTKCZsb2NrLCBwYSk7CisgICAgICAgICAgICAgICAgVEFJTFFfSU5TRVJU
X1RBSUwoJm0tPm1kLnB2X2xpc3QsIHB2LCBwdl9uZXh0KTsKKyAgICAgICAgICAgICAgICBtLT5t
ZC5wdl9nZW4rKzsKKyAgICAgICAgICAgICAgICBpZiAoIXB0ZV90ZXN0KCZuZXdwdGUsIFBURV9S
TykpCisgICAgICAgICAgICAgICAgICAgICAgICB2bV9wYWdlX2FmbGFnX3NldChtLCBQR0FfV1JJ
VEVBQkxFKTsKKyAgICAgICAgfSBlbHNlIGlmIChwdiAhPSBOVUxMKQorCQlmcmVlX3B2X2VudHJ5
KHBtYXAsIHB2KTsKKworCisgICAgICAgIC8qCisgICAgICAgICAqIEluY3JlbWVudCBjb3VudGVy
cworICAgICAgICAgKi8KKyAgICAgICAgaWYgKHB0ZV90ZXN0KCZuZXdwdGUsIFBURV9XKSkKKyAg
ICAgICAgICAgICAgICBwbWFwLT5wbV9zdGF0cy53aXJlZF9jb3VudCsrOworCit2YWxpZGF0ZToK
KyNpZmRlZiBQTUFQX0RFQlVHCisgICAgICAgIHByaW50ZigicG1hcF9lbnRlcjogIHZhOiAlcCAt
PiBwYTogJXBcbiIsICh2b2lkICopdmEsICh2b2lkICopcGEpOworI2VuZGlmCisgICAgICAgIC8q
CisgICAgICAgICAqIGlmIHRoZSBtYXBwaW5nIG9yIHBlcm1pc3Npb24gYml0cyBhcmUgZGlmZmVy
ZW50LCB3ZSBuZWVkIHRvCisgICAgICAgICAqIHVwZGF0ZSB0aGUgcHRlLgorICAgICAgICAgKi8K
KyAgICAgICAgaWYgKChvcmlncHRlICYgfiAoUFRFX0R8UFRFX1JFRikpICE9IG5ld3B0ZSkgewor
ICAgICAgICAgICAgICAgIG5ld3B0ZSB8PSBQVEVfVlI7CisgICAgICAgICAgICAgICAgaWYgKChm
bGFncyAmIFZNX1BST1RfV1JJVEUpICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdw
dGUgfD0gUFRFX0Q7CisgICAgICAgICAgICAgICAgaWYgKHB0ZV9pc192YWxpZCgmb3JpZ3B0ZSkp
IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW5fdCBpbnZsdmEgPSBGQUxTRTsKKwor
CQkJb3JpZ3B0ZSA9IHB0ZV9sb2FkX3N0b3JlKHB0ZSwgbmV3cHRlKTsKKyAgICAgICAgICAgICAg
ICAgICAgICAgIGlmIChwdGVfaXNfcmVmKCZvcmlncHRlKSkgeworICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBpZiAocHRlX3Rlc3QoJm9yaWdwdGUsIFBURV9NQU5BR0VEKSkKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bV9wYWdlX2FmbGFnX3NldChvbSwg
UEdBX1JFRkVSRU5DRUQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3Bh
ICE9IHBhKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmx2YSA9
IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAg
ICBpZiAocHRlX3Rlc3QoJm9yaWdwdGUsIFBURV9EKSAmJgorCQkJICAgICFwdGVfdGVzdCgmb3Jp
Z3B0ZSwgUFRFX1JPKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHRl
X3Rlc3QoJm9yaWdwdGUsIFBURV9NQU5BR0VEKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICB2bV9wYWdlX2RpcnR5KG9tKTsKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgaWYgKChwcm90ICYgVk1fUFJPVF9XUklURSkgPT0gMCkKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZsdmEgPSBUUlVFOworICAgICAgICAgICAgICAg
ICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHB0ZV90ZXN0KCZvcmlncHRl
LCBQVEVfTUFOQUdFRCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQUlMUV9FTVBU
WSgmb20tPm1kLnB2X2xpc3QpICYmCisJCQkgICAgKChvbS0+ZmxhZ3MgJiBQR19GSUNUSVRJT1VT
KSAhPSAwIHx8CisJCQkgICAgVEFJTFFfRU1QVFkoJnBhX3RvX3B2aChvcGEpLT5wdl9saXN0KSkp
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZtX3BhZ2VfYWZsYWdfY2xlYXIob20s
IFBHQV9XUklURUFCTEUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGludmx2YSkKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG1hcF9pbnZhbGlkYXRlX3BhZ2UocG1hcCwg
dmEpOworICAgICAgICAgICAgICAgIH0gZWxzZQorCQkJcHRlX3N0b3JlKHB0ZSwgbmV3cHRlKTsK
KyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqICBJZiBib3RoIHRoZSBwYWdlIHRh
YmxlIHBhZ2UgYW5kIHRoZSByZXNlcnZhdGlvbiBhcmUgZnVsbHkKKyAgICAgICAgICogIHBvcHVs
YXRlZCwgdGhlbiBhdHRlbXB0IHByb21vdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIGlmICgo
bXB0ZSA9PSBOVUxMIHx8IG1wdGUtPndpcmVfY291bnQgPT0gTlBURVBHKSAmJgorICAgICAgICAg
ICAgKG0tPmZsYWdzICYgUEdfRklDVElUSU9VUykgPT0gMCAmJgorICAgICAgICAgICAgcGdfc3Bf
ZW5hYmxlZCAmJiB2bV9yZXNlcnZfbGV2ZWxfaWZmdWxscG9wKG0pID09IDApCisgICAgICAgICAg
ICAgICAgcG1hcF9wcm9tb3RlX3BkZShwbWFwLCBwZGUsIHZhLCAmbG9jayk7CisKKyAgICAgICAg
LyoKKyAgICAgICAgICogU3luYyBJICYgRCBjYWNoZXMgZm9yIGV4ZWN1dGFibGUgcGFnZXMuICBE
byB0aGlzIG9ubHkgaWYgdGhlCisgICAgICAgICAqIHRhcmdldCBwbWFwIGJlbG9uZ3MgdG8gdGhl
IGN1cnJlbnQgcHJvY2Vzcy4gIE90aGVyd2lzZSwgYW4KKyAgICAgICAgICogdW5yZXNvbHZhYmxl
IFRMQiBtaXNzIG1heSBvY2N1ci4KKyAgICAgICAgICovCisgICAgICAgIGlmICghaXNfa2VybmVs
X3BtYXAocG1hcCkgJiYgKHBtYXAgPT0gJmN1cnByb2MtPnBfdm1zcGFjZS0+dm1fcG1hcCkgJiYK
KyAgICAgICAgICAgIChwcm90ICYgVk1fUFJPVF9FWEVDVVRFKSkgeworICAgICAgICAgICAgICAg
IG1pcHNfaWNhY2hlX3N5bmNfcmFuZ2UodmEsIFBBR0VfU0laRSk7CisgICAgICAgICAgICAgICAg
bWlwc19kY2FjaGVfd2JpbnZfcmFuZ2UodmEsIFBBR0VfU0laRSk7CisgICAgICAgIH0KKyAgICAg
ICAgaWYgKGxvY2sgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICByd193dW5sb2NrKGxvY2spOwor
ICAgICAgICByd19ydW5sb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworICAgICAgICBQTUFQX1VOTE9D
SyhwbWFwKTsKKyAgICAgICAgcmV0dXJuIChLRVJOX1NVQ0NFU1MpOworfQorCisvKgorICogdGhp
cyBjb2RlIG1ha2VzIHNvbWUgKk1BSk9SKiBhc3N1bXB0aW9uczoKKyAqIDEuIEN1cnJlbnQgcG1h
cCAmIHBtYXAgZXhpc3RzLgorICogMi4gTm90IHdpcmVkLgorICogMy4gUmVhZCBhY2Nlc3MuCisg
KiA0LiBObyBwYWdlIHRhYmxlIHBhZ2VzLgorICogYnV0IGlzICpNVUNIKiBmYXN0ZXIgdGhhbiBw
bWFwX2VudGVyLi4uCisgKi8KK3ZvaWQKK3BtYXBfZW50ZXJfcXVpY2socG1hcF90IHBtYXAsIHZt
X29mZnNldF90IHZhLCB2bV9wYWdlX3QgbSwgdm1fcHJvdF90IHByb3QpCit7CisJc3RydWN0IHJ3
bG9jayAqbG9jazsKKworCWxvY2sgPSBOVUxMOworCXJ3X3Jsb2NrKCZwdmhfZ2xvYmFsX2xvY2sp
OworCVBNQVBfTE9DSyhwbWFwKTsKKwkodm9pZClwbWFwX2VudGVyX3F1aWNrX2xvY2tlZChwbWFw
LCB2YSwgbSwgcHJvdCwgTlVMTCwgJmxvY2spOworCWlmIChsb2NrICE9IE5VTEwpCisJCXJ3X3d1
bmxvY2sobG9jayk7CisJcndfcnVubG9jaygmcHZoX2dsb2JhbF9sb2NrKTsKKwlQTUFQX1VOTE9D
SyhwbWFwKTsKK30KKworc3RhdGljIHZtX3BhZ2VfdAorcG1hcF9lbnRlcl9xdWlja19sb2NrZWQo
cG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhLCB2bV9wYWdlX3QgbSwKKyAgICB2bV9wcm90X3Qg
cHJvdCwgdm1fcGFnZV90IG1wdGUsIHN0cnVjdCByd2xvY2sgKipsb2NrcCkKK3sKKwlwdF9lbnRy
eV90ICpwdGUsIG5ld3B0ZTsKKwl2bV9wYWRkcl90IHBhOworCXN0cnVjdCBzcGdsaXN0IGZyZWU7
CisKKwlLQVNTRVJUKHZhIDwga21pLmNsZWFuX3N2YSB8fCB2YSA+PSBrbWkuY2xlYW5fZXZhIHx8
CisJICAgIChtLT5vZmxhZ3MgJiBWUE9fVU5NQU5BR0VEKSAhPSAwLAorCSAgICAoIiVzOiBtYW5h
Z2VkIG1hcHBpbmcgd2l0aGluIHRoZSBjbGVhbiBzdWJtYXAiLCBfX2Z1bmNfXykpOworCXJ3X2Fz
c2VydCgmcHZoX2dsb2JhbF9sb2NrLCBSQV9MT0NLRUQpOworCVBNQVBfTE9DS19BU1NFUlQocG1h
cCwgTUFfT1dORUQpOworCisJLyoKKwkgKiBJbiB0aGUgY2FzZSB0aGF0IGEgcGFnZSB0YWJsZSBw
YWdlIGlzIG5vdCByZXNpZGVudCwgd2UgYXJlCisJICogY3JlYXRpbmcgaXQgaGVyZS4KKwkgKi8K
KwlpZiAodmEgPCBWTV9NQVhVU0VSX0FERFJFU1MpIHsKKwkJcGRfZW50cnlfdCAqcGRlOworCQl1
bnNpZ25lZCBwdGVwaW5kZXg7CisKKwkJLyoKKwkJICogQ2FsY3VsYXRlIHBhZ2V0YWJsZSBwYWdl
IGluZGV4CisJCSAqLworCQlwdGVwaW5kZXggPSBwbWFwX3BkZV9waW5kZXgodmEpOworCQlpZiAo
bXB0ZSAmJiAobXB0ZS0+cGluZGV4ID09IHB0ZXBpbmRleCkpIHsKKwkJCW1wdGUtPndpcmVfY291
bnQrKzsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBHZXQgdGhlIHBhZ2UgZGlyZWN0b3J5IGVu
dHJ5CisJCQkgKi8KKwkJCXBkZSA9IHBtYXBfcGRlKHBtYXAsIHZhKTsKKworCQkJLyoKKwkJCSAq
IElmIHRoZSBwYWdlIHRhYmxlIHBhZ2UgaXMgbWFwcGVkLCB3ZSBqdXN0CisJCQkgKiBpbmNyZW1l
bnQgdGhlIGhvbGQgY291bnQsIGFuZCBhY3RpdmF0ZSBpdC4KKwkJCSAqLworCQkJaWYgKHBkZSAm
JiAqcGRlICE9IDApIHsKKwkJCQlpZiAocGRlX2lzXzFtX3N1cGVycGFnZShwZGUpKQorCQkJCQly
ZXR1cm4gKE5VTEwpOworCQkJCW1wdGUgPSBQSFlTX1RPX1ZNX1BBR0UoCisJCQkJICAgIE1JUFNf
RElSRUNUX1RPX1BIWVMoKnBkZSkpOworCQkJCW1wdGUtPndpcmVfY291bnQrKzsKKwkJCX0gZWxz
ZSB7CisJCQkJLyoKKwkJCQkgKiBQYXNzIE5VTEwgaW5zdGVhZCBvZiB0aGUgUFYgbGlzdCBsb2Nr
CisJCQkJICogcG9pbnRlciwgYmVjYXVzZSB3ZSBkb24ndCBpbnRlbmQgdG8gc2xlZXAuCisJCQkJ
ICovCisJCQkJbXB0ZSA9IF9wbWFwX2FsbG9jcHRlKHBtYXAsIHB0ZXBpbmRleCwgTlVMTCk7CisJ
CQkJaWYgKG1wdGUgPT0gTlVMTCkKKwkJCQkJcmV0dXJuIChtcHRlKTsKKwkJCX0KKwkJfQorCX0g
ZWxzZSB7CisJCW1wdGUgPSBOVUxMOworCX0KKworCXB0ZSA9IHBtYXBfcHRlKHBtYXAsIHZhKTsK
KwlpZiAocHRlX2lzX3ZhbGlkKHB0ZSkpIHsKKwkJaWYgKG1wdGUgIT0gTlVMTCkgeworCQkJbXB0
ZS0+d2lyZV9jb3VudC0tOworCQkJbXB0ZSA9IE5VTEw7CisJCX0KKwkJcmV0dXJuIChtcHRlKTsK
Kwl9CisKKwkvKgorCSAqIEVudGVyIG9uIHRoZSBQViBsaXN0IGlmIHBhcnQgb2Ygb3VyIG1hbmFn
ZWQgbWVtb3J5LgorCSAqLworCWlmICgobS0+b2ZsYWdzICYgVlBPX1VOTUFOQUdFRCkgPT0gMCAm
JgorCSAgICAhcG1hcF90cnlfaW5zZXJ0X3B2X2VudHJ5KHBtYXAsIHZhLCBtLCBsb2NrcCkpIHsK
KwkJaWYgKG1wdGUgIT0gTlVMTCkgeworCQkJU0xJU1RfSU5JVCgmZnJlZSk7CisJCQlpZiAocG1h
cF91bndpcmVfcHRwKHBtYXAsIHZhLCBtcHRlLCAmZnJlZSkpIHsKKwkJCQlwbWFwX2ludmFsaWRh
dGVfcGFnZShwbWFwLCB2YSk7CisJCQkJcG1hcF9mcmVlX3plcm9fcGFnZXMoJmZyZWUpOworCQkJ
fQorCisJCQltcHRlID0gTlVMTDsKKwkJfQorCQlyZXR1cm4gKG1wdGUpOworCX0KKworCS8qCisJ
ICogSW5jcmVtZW50IGNvdW50ZXJzCisJICovCisJcG1hcF9yZXNpZGVudF9jb3VudF9pbmMocG1h
cCwgMSk7CisKKwlwYSA9IFZNX1BBR0VfVE9fUEhZUyhtKTsKKworCS8qCisJICogTm93IHZhbGlk
YXRlIG1hcHBpbmcgd2l0aCBSTyBwcm90ZWN0aW9uCisJICovCisJbmV3cHRlID0gUFRFX1JPIHwg
VExCTE9fUEFfVE9fUEZOKHBhKSB8IFBURV9WQUxJRDsKKwlpZiAoKG0tPm9mbGFncyAmIFZQT19V
Tk1BTkFHRUQpID09IDApCisJCW5ld3B0ZSB8PSBQVEVfTUFOQUdFRDsKKworCWlmIChpc19jYWNo
ZWFibGVfbWVtKHBhKSkgeworCQlpZiAobS0+bWQucHZfbWVtYXR0ciA9PSBWTV9NRU1BVFRSX1VO
Q0FDSEVBQkxFKQorCQkJbmV3cHRlIHw9IFBURV9DX1VOQ0FDSEVEOworCQllbHNlCisJCQluZXdw
dGUgfD0gUFRFX0NfQ0FDSEU7CisJfSBlbHNlCisJCW5ld3B0ZSB8PSBQVEVfQ19VTkNBQ0hFRDsK
KworCXNjaGVkX3BpbigpOworCWlmIChpc19rZXJuZWxfcG1hcChwbWFwKSkgeworCQluZXdwdGUg
fD0gUFRFX0c7CisJCXB0ZV9yZWZfc2V0KCZuZXdwdGUpOworCQlwdGVfc3RvcmUocHRlLCBuZXdw
dGUpOworCX0gZWxzZSB7CisJCXB0ZV9zdG9yZShwdGUsIG5ld3B0ZSk7CisJCS8qCisJCSAqIFN5
bmMgSSAmIEQgY2FjaGVzLiAgRG8gdGhpcyBvbmx5IGlmIHRoZSB0YXJnZXQgcG1hcAorCQkgKiBi
ZWxvbmdzIHRvIHRoZSBjdXJyZW50IHByb2Nlc3MuICBPdGhlcndpc2UsIGFuCisJCSAqIHVucmVz
b2x2YWJsZSBUTEIgbWlzcyBtYXkgb2NjdXIuCisJCSAqLworCQlpZiAocG1hcCA9PSAmY3VycHJv
Yy0+cF92bXNwYWNlLT52bV9wbWFwKSB7CisJCQl2YSAmPSB+UEFHRV9NQVNLOworCQkJbWlwc19p
Y2FjaGVfc3luY19yYW5nZSh2YSwgUEFHRV9TSVpFKTsKKwkJCW1pcHNfZGNhY2hlX3diaW52X3Jh
bmdlKHZhLCBQQUdFX1NJWkUpOworCQl9CisJfQorCXNjaGVkX3VucGluKCk7CisKKwlyZXR1cm4g
KG1wdGUpOworfQorCisvKgorICogTWFrZSBhIHRlbXBvcmFyeSBtYXBwaW5nIGZvciBhIHBoeXNp
Y2FsIGFkZHJlc3MuICBUaGlzIGlzIG9ubHkgaW50ZW5kZWQKKyAqIHRvIGJlIHVzZWQgZm9yIHBh
bmljIGR1bXBzLgorICoKKyAqIFVzZSBYS1BIWVMgZm9yIDY0IGJpdC4KKyAqLwordm9pZCAqCitw
bWFwX2tlbnRlcl90ZW1wb3Jhcnkodm1fcGFkZHJfdCBwYSwgaW50IGkpCit7CisKKwlpZiAoaSAh
PSAwKQorCQlwcmludGYoIiVzOiBFUlJPUiEhISBNb3JlIHRoYW4gb25lIHBhZ2Ugb2YgdmlydHVh
bCBhZGRyZXNzICIKKwkJICAgICJtYXBwaW5nIG5vdCBzdXBwb3J0ZWRcbiIsIF9fZnVuY19fKTsK
KworCXJldHVybiAoKHZvaWQgKilNSVBTX1BIWVNfVE9fRElSRUNUKHBhKSk7Cit9CisKK3ZvaWQK
K3BtYXBfa2VudGVyX3RlbXBvcmFyeV9mcmVlKHZtX3BhZGRyX3QgcGEpCit7CisKKwkvKiBub3Ro
aW5nIHRvIGRvIGZvciBtaXBzNjQgKi8KKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2bV9wYWdlX3QK
K3BtYXBfYWxsb2NwZGUocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhLCBzdHJ1Y3Qgcndsb2Nr
ICoqbG9ja3ApCit7CisJdm1fcGluZGV4X3QgcGRwaW5kZXgsIHB0ZXBpbmRleDsKKwlwZF9lbnRy
eV90ICpwZHBlOworCXZtX3BhZ2VfdCBtcHRlID0gTlVMTDsKKworCWlmICh2YSA8IFZNX01BWFVT
RVJfQUREUkVTUykgeworcmV0cnk6CisJCXBkcGUgPSBwbWFwX3NlZ21hcChwbWFwLCB2YSk7CisJ
CWlmIChwZHBlICE9IE5VTEwgJiYgKCpwZHBlICE9IE5VTEwpKSB7CisJCQkvKiBBZGQgYSByZWZl
cmVuY2UgdG8gdGhlIHBkIHBhZ2UuICovCisJCQltcHRlID0gUEhZU19UT19WTV9QQUdFKE1JUFNf
RElSRUNUX1RPX1BIWVMoKnBkcGUpKTsKKwkJCW1wdGUtPndpcmVfY291bnQrKzsKKwkJfSBlbHNl
IHsKKwkJCS8qIEFsbG9jYXRlIGEgcGQgcGFnZS4gKi8KKworCQkJLyogQ2FsY3VsYXRlIHBhZ2V0
YWJsZSBwYWdlIGluZGV4LiAqLworCQkJcHRlcGluZGV4ID0gcG1hcF9wZGVfcGluZGV4KHZhKTsK
KwkJCXBkcGluZGV4ID0gcHRlcGluZGV4ID4+IE5QREVQR1NISUZUOyAgLyogWFhYICovCisJCQlt
cHRlID0gX3BtYXBfYWxsb2NwdGUocG1hcCwgTlVQREUgKyBwZHBpbmRleCwgbG9ja3ApOworCQkJ
aWYgKG1wdGUgPT0gTlVMTCAmJiBsb2NrcCAhPSBOVUxMKQorCQkJCWdvdG8gcmV0cnk7CisJCX0K
Kwl9CisJcmV0dXJuIChtcHRlKTsKK30KKworLyoKKyAqIFRyaWVzIHRvIGNyZWF0ZSBhIDJNQiBw
YWdlIG1hcHBpbmcuICBSZXR1cm5zIFRSVUUgaWYgc3VjY2Vzc2Z1bCBhbmQgRkFMU0UKKyAqIG90
aGVyd2lzZS4gIEZhaWxzIGlmICgxKSBhIHBhZ2UgdGFibGUgcGFnZSBjYW5ub3QgYmUgYWxsb2Nh
dGVkIHdpdGhvdXQKKyAqIGJsb2NraW5nLCAoMikgYSBtYXBwaW5nIGFscmVhZHkgZXhpc3RzIGF0
IHRoZSBzcGVjaWZpZWQgdmlydHVhbCBhZGRyZXNzLCBvcgorICogKDMpIGEgcHYgZW50cnkgY2Fu
bm90IGJlIGFsbG9jYXRlZCB3aXRob3V0IHJlY2xhaW1pbmcgYW5vdGhlciBwdiBlbnRyeS4KKyAq
Lworc3RhdGljIGJvb2xlYW5fdAorcG1hcF9lbnRlcl9wZGUocG1hcF90IHBtYXAsIHZtX29mZnNl
dF90IHZhLCB2bV9wYWdlX3QgbSwgdm1fcHJvdF90IHByb3QsCisgICAgc3RydWN0IHJ3bG9jayAq
KmxvY2twKQoreworCXBkX2VudHJ5X3QgKnBkZTsKKwlwdF9lbnRyeV90IG5ld3BkZTsKKwl2bV9w
YWdlX3QgbXBkZTsKKwlzdHJ1Y3Qgc3BnbGlzdCBmcmVlOworCXZtX3BhZGRyX3QgcGE7CisKKwor
CXJ3X2Fzc2VydCgmcHZoX2dsb2JhbF9sb2NrLCBSQV9MT0NLRUQpOworCVBNQVBfTE9DS19BU1NF
UlQocG1hcCwgTUFfT1dORUQpOworCisJaWYgKGlzX2tlcm5lbF9wbWFwKHBtYXApKSB7CisJCS8q
IE5vdCBkb2luZyB0aGUga2VybmVsIHBtYXAgZm9yIG5vdyAqLworCQlDVFIzKEtUUl9QTUFQLCAi
JXM6IGZhaWx1cmUgZm9yIHZhICUjbHggaW4gcG1hcCAlcDoga2VybmVsIG1hcCIsCisJCSAgICBf
X2Z1bmNfXywgdmEsIHBtYXApOworCQlyZXR1cm4gKEZBTFNFKTsKKwl9CisJaWYgKChtcGRlID0g
cG1hcF9hbGxvY3BkZShwbWFwLCB2YSwgTlVMTCkpID09IE5VTEwpIHsKKwkJQ1RSMyhLVFJfUE1B
UCwgIiVzOiBmYWlsdXJlIGZvciB2YSAlI2x4IGluIHBtYXAgJXAiLAorCQkgICAgX19mdW5jX18s
IHZhLCBwbWFwKTsKKwkJcmV0dXJuIChGQUxTRSk7CisJfQorCS8qIHBkZSA9IHBtYXBfcGRlKHBt
YXAsIHZhKTsgKi8KKwlwZGUgPSAocGRfZW50cnlfdCAqKU1JUFNfUEhZU19UT19ESVJFQ1QoVk1f
UEFHRV9UT19QSFlTKG1wZGUpKTsKKwlwZGUgPSAmcGRlW3BtYXBfcGRlX2luZGV4KHZhKV07CisJ
aWYgKHBkZSA9PSBOVUxMKSB7CisJCUtBU1NFUlQobXBkZS0+d2lyZV9jb3VudCA+IDEsCisJCSAg
ICAoIiVzOiBtcGRlJ3Mgd2lyZSBjb3VudCBpcyB0b28gbG93IiwgX19mdW5jX18pKTsKKwkJbXBk
ZS0+d2lyZV9jb3VudC0tOworCQlDVFIzKEtUUl9QTUFQLCAiJXM6IGZhaWx1cmUgZm9yIHZhICUj
bHggaW4gcG1hcCAlcCIsIF9fZnVuY19fLAorCQkgICAgdmEsIHBtYXApOworCQlyZXR1cm4gKEZB
TFNFKTsKKwl9CisJcGEgPSBWTV9QQUdFX1RPX1BIWVMobSk7CisgICAgICAgIG5ld3BkZSA9IFBU
RV9STyB8IFRMQkxPX1BBX1RPX1BGTihwYSkgfCBQVEVfVkFMSUQgfCBQVEVfUFNfMU07CisJaWYg
KGlzX2NhY2hlYWJsZV9tZW0ocGEpKSB7CisJCWlmIChtLT5tZC5wdl9tZW1hdHRyID09IFZNX01F
TUFUVFJfVU5DQUNIRUFCTEUpCisJCQluZXdwZGUgfD0gUFRFX0NfVU5DQUNIRUQ7CisJCWVsc2UK
KwkJCW5ld3BkZSB8PSBQVEVfQ19DQUNIRTsKKwl9IGVsc2UKKwkJbmV3cGRlIHw9IFBURV9DX1VO
Q0FDSEVEOworCWlmICgobS0+b2ZsYWdzICYgVlBPX1VOTUFOQUdFRCkgPT0gMCkgeworCQluZXdw
ZGUgfD0gUFRFX01BTkFHRUQ7CisKKwkJLyoKKwkJICogQWJvcnQgdGhpcyBtYXBwaW5nIGlmIGl0
cyBQViBlbnRyeSBjb3VsZCBub3QgYmUgY3JlYXRlZC4KKwkJICovCisJCWlmICghcG1hcF9wdl9p
bnNlcnRfcGRlKHBtYXAsIHZhLCBWTV9QQUdFX1RPX1BIWVMobSksCisJCSAgICBsb2NrcCkpIHsK
KwkJCVNMSVNUX0lOSVQoJmZyZWUpOworCQkJaWYgKHBtYXBfdW53aXJlX3B0cChwbWFwLCB2YSwg
bXBkZSwgJmZyZWUpKSB7CisJCQkJcG1hcF9pbnZhbGlkYXRlX3BhZ2UocG1hcCwgdmEpOworCQkJ
CXBtYXBfZnJlZV96ZXJvX3BhZ2VzKCZmcmVlKTsKKwkJCX0KKwkJCUNUUjMoS1RSX1BNQVAsICIl
czogZmFpbHVyZSBmb3IgdmEgJSNseCBpbiBwbWFwICVwIiwKKwkJCSAgICBfX2Z1bmNfXywgdmEs
IHBtYXApOworCQkJcmV0dXJuIChGQUxTRSk7CisJCX0KKwl9CisKKwkvKgorCSAqIEluY3JlbWVu
dCBjb3VudGVycy4KKwkgKi8KKwkgcG1hcF9yZXNpZGVudF9jb3VudF9pbmMocG1hcCwgTkJQRFIg
LyBQQUdFX1NJWkUpOworCisJIC8qCisJICAqIE1hcCB0aGUgc3VwZXJwYWdlLgorCSAgKi8KKwkg
c2NoZWRfcGluKCk7CisJIHBkZV9zdG9yZShwZGUsIG5ld3BkZSk7CisKKwkvKgorCSAqIFN5bmMg
SSAmIEQgY2FjaGVzIGZvciBleGVjdXRhYmxlIHBhZ2VzLiAgRG8gdGhpcyBvbmx5IGlmIHRoZQor
CSAqIHRhcmdldCBwbWFwIGJlbG9uZ3MgdG8gdGhlIGN1cnJlbnQgcHJvY2Vzcy4gIE90aGVyd2lz
ZSwgYW4KKwkgKiB1bnJlc29sdmFibGUgVExCIG1pc3MgbWF5IG9jY3VyLgorCSAqLworCSBpZiAo
IWlzX2tlcm5lbF9wbWFwKHBtYXApICYmIChwbWFwID09ICZjdXJwcm9jLT5wX3Ztc3BhY2UtPnZt
X3BtYXApICYmCisJICAgICAocHJvdCAmIFZNX1BST1RfRVhFQ1VURSkpIHsKKwkJCSB2YSAmPSB+
UERSTUFTSzsKKwkJCSBtaXBzX2ljYWNoZV9zeW5jX3JhbmdlKHZhLCBOQlBEUik7CisJCQkgbWlw
c19kY2FjaGVfd2JpbnZfcmFuZ2UodmEsIE5CUERSKTsKKworCSB9CisJIHNjaGVkX3VucGluKCk7
CisKKwkgYXRvbWljX2FkZF9sb25nKCZwbWFwX3BkZV9tYXBwaW5ncywgMSk7CisJIENUUjMoS1RS
X1BNQVAsICIlczogc3VjY2VzcyBmb3IgdmEgJSNseCBpbiBwbWFwICVwIiwgX19mdW5jX18sIHZh
LAorCSAgICAgcG1hcCk7CisJIHJldHVybiAoVFJVRSk7Cit9CisKKy8qCisgKiBNYXBzIGEgc2Vx
dWVuY2Ugb2YgcmVzaWRlbnQgcGFnZXMgYmVsb25naW5nIHRvIHRoZSBzYW1lIG9iamVjdC4KKyAq
IFRoZSBzZXF1ZW5jZSBiZWdpbnMgd2l0aCB0aGUgZ2l2ZW4gcGFnZSBtX3N0YXJ0LiAgVGhpcyBw
YWdlIGlzCisgKiBtYXBwZWQgYXQgdGhlIGdpdmVuIHZpcnR1YWwgYWRkcmVzcyBzdGFydC4gIEVh
Y2ggc3Vic2VxdWVudCBwYWdlIGlzCisgKiBtYXBwZWQgYXQgYSB2aXJ0dWFsIGFkZHJlc3MgdGhh
dCBpcyBvZmZzZXQgZnJvbSBzdGFydCBieSB0aGUgc2FtZQorICogYW1vdW50IGFzIHRoZSBwYWdl
IGlzIG9mZnNldCBmcm9tIG1fc3RhcnQgd2l0aGluIHRoZSBvYmplY3QuICBUaGUKKyAqIGxhc3Qg
cGFnZSBpbiB0aGUgc2VxdWVuY2UgaXMgdGhlIHBhZ2Ugd2l0aCB0aGUgbGFyZ2VzdCBvZmZzZXQg
ZnJvbQorICogbV9zdGFydCB0aGF0IGNhbiBiZSBtYXBwZWQgYXQgYSB2aXJ0dWFsIGFkZHJlc3Mg
bGVzcyB0aGFuIHRoZSBnaXZlbgorICogdmlydHVhbCBhZGRyZXNzIGVuZC4gIE5vdCBldmVyeSB2
aXJ0dWFsIHBhZ2UgYmV0d2VlbiBzdGFydCBhbmQgZW5kCisgKiBpcyBtYXBwZWQ7IG9ubHkgdGhv
c2UgZm9yIHdoaWNoIGEgcmVzaWRlbnQgcGFnZSBleGlzdHMgd2l0aCB0aGUKKyAqIGNvcnJlc3Bv
bmRpbmcgb2Zmc2V0IGZyb20gbV9zdGFydCBhcmUgbWFwcGVkLgorICovCit2b2lkCitwbWFwX2Vu
dGVyX29iamVjdChwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3Qgc3RhcnQsIHZtX29mZnNldF90IGVu
ZCwKKyAgICB2bV9wYWdlX3QgbV9zdGFydCwgdm1fcHJvdF90IHByb3QpCit7CisJc3RydWN0IHJ3
bG9jayAqbG9jazsKKwl2bV9vZmZzZXRfdCB2YTsKKwl2bV9wYWdlX3QgbSwgbXB0ZTsKKwl2bV9w
aW5kZXhfdCBkaWZmLCBwc2l6ZTsKKworCVZNX09CSkVDVF9BU1NFUlRfTE9DS0VEKG1fc3RhcnQt
Pm9iamVjdCk7CisKKwlwc2l6ZSA9IGF0b3AoZW5kIC0gc3RhcnQpOworCW1wdGUgPSBOVUxMOwor
CW0gPSBtX3N0YXJ0OworCWxvY2sgPSBOVUxMOworCXJ3X3Jsb2NrKCZwdmhfZ2xvYmFsX2xvY2sp
OworCVBNQVBfTE9DSyhwbWFwKTsKKwl3aGlsZSAobSAhPSBOVUxMICYmIChkaWZmID0gbS0+cGlu
ZGV4IC0gbV9zdGFydC0+cGluZGV4KSA8IHBzaXplKSB7CisJCXZhID0gc3RhcnQgKyBwdG9hKGRp
ZmYpOworCQlpZiAoKHZhICYgUERSTUFTSykgPT0gMCAmJiB2YSArIE5CUERSIDw9IGVuZCAmJgor
CQkgICAgbS0+cHNpbmQgPT0gMSAmJiBwZ19zcF9lbmFibGVkICYmCisJCSAgICBwbWFwX2VudGVy
X3BkZShwbWFwLCB2YSwgbSwgcHJvdCwgJmxvY2spKQorCQkJbSA9ICZtW05CUERSIC8gUEFHRV9T
SVpFIC0gMV07CisJCWVsc2UKKwkJCW1wdGUgPSBwbWFwX2VudGVyX3F1aWNrX2xvY2tlZChwbWFw
LCB2YSwgbSwgcHJvdCwKKwkJCSAgICBtcHRlLCAmbG9jayk7CisJCW0gPSBUQUlMUV9ORVhUKG0s
IGxpc3RxKTsKKwl9CisJaWYgKGxvY2sgIT0gTlVMTCkKKwkJcndfd3VubG9jayhsb2NrKTsKKwly
d19ydW5sb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCVBNQVBfVU5MT0NLKHBtYXApOworfQorCisv
KgorICogcG1hcF9vYmplY3RfaW5pdF9wdCBwcmVsb2FkcyB0aGUgcHRlcyBmb3IgYSBnaXZlbiBv
YmplY3QKKyAqIGludG8gdGhlIHNwZWNpZmllZCBwbWFwLiAgVGhpcyBlbGltaW5hdGVzIHRoZSBi
bGFzdCBvZiBzb2Z0CisgKiBmYXVsdHMgb24gcHJvY2VzcyBzdGFydHVwIGFuZCBpbW1lZGlhdGVs
eSBhZnRlciBhIG1tYXAoKS4KKyAqCisgKiBUaGlzIGNvZGUgbWFwcyBsYXJnZSBwaHlzaWNhbCBt
bWFwIHJlZ2lvbnMgaW50byB0aGUKKyAqIHByb2Nlc3NvciBhZGRyZXNzIHNwYWNlLiBOb3RlIHRo
YXQgc29tZSBzaG9ydGN1dHMKKyAqIGFyZSB0YWtlbiwgYnV0IHRoZSBjb2RlIHdvcmtzLgorICov
Cit2b2lkCitwbWFwX29iamVjdF9pbml0X3B0KHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCBhZGRy
LCB2bV9vYmplY3RfdCBvYmplY3QsCisgICAgdm1fcGluZGV4X3QgcGluZGV4LCB2bV9zaXplX3Qg
c2l6ZSkKK3sKKwlwZF9lbnRyeV90ICpwZGU7CisJdm1fcGFkZHJfdCBwYSwgcHRlcGE7CisJdm1f
cGFnZV90IHAsIHBkcGc7CisJdm1fbWVtYXR0cl90IG1lbWF0dHI7CisKKwlWTV9PQkpFQ1RfQVNT
RVJUX1dMT0NLRUQob2JqZWN0KTsKKwlLQVNTRVJUKG9iamVjdC0+dHlwZSA9PSBPQkpUX0RFVklD
RSB8fCBvYmplY3QtPnR5cGUgPT0gT0JKVF9TRywKKwkgICAgKCJwbWFwX29iamVjdF9pbml0X3B0
OiBub24tZGV2aWNlIG9iamVjdCIpKTsKKworCWlmIChpc19rZXJuZWxfcG1hcChwbWFwKSkgewor
CQkvKiBOb3QgZG9pbmcgdGhlIGtlcm5lbCBwbWFwIGZvciBub3cuICovCisJCXJldHVybjsKKwl9
CisKKwlpZiAoKGFkZHIgJiAoTkJQRFIgLSAxKSkgPT0gMCAmJiAoc2l6ZSAmIChOQlBEUiAtIDEp
KSA9PSAwKSB7CisJCWlmICghcGdfc3BfZW5hYmxlZCkKKwkJCXJldHVybjsKKwkJaWYgKCF2bV9v
YmplY3RfcG9wdWxhdGUob2JqZWN0LCBwaW5kZXgsIHBpbmRleCArIGF0b3Aoc2l6ZSkpKQorCQkJ
cmV0dXJuOworCQlwID0gdm1fcGFnZV9sb29rdXAob2JqZWN0LCBwaW5kZXgpOworCQlLQVNTRVJU
KHAtPnZhbGlkID09IFZNX1BBR0VfQklUU19BTEwsCisJCSAgICAoIiVzOiBpbnZhbGlkIHBhZ2Ug
JXAiLCBfX2Z1bmNfXywgcCkpOworCQltZW1hdHRyID0gcC0+bWQucHZfbWVtYXR0cjsKKworCQkv
KgorCQkgKiBBYm9ydCB0aGUgbWFwcGluZyBpZiB0aGUgZmlyc3QgcGFnZSBpcyBub3QgcGh5c2lj
YWxseQorCQkgKiBhbGlnbmVkIHRvIGEgMk1CIHBhZ2UgYm91bmRhcnkuCisJCSAqLworCQlwdGVw
YSA9IFZNX1BBR0VfVE9fUEhZUyhwKTsKKwkJaWYgKHB0ZXBhICYgKE5CUERSIC0gMSkpCisJCQly
ZXR1cm47CisKKwkJLyoKKwkJICogU2tpcCB0aGUgZmlyc3QgcGFnZS4gQWJvcnQgdGhlIG1hcHBp
bmcgaWYgdGhlIHJlc3Qgb2YKKwkJICogdGhlIHBhZ2VzIGFyZSBub3QgcGh5c2ljYWxseSBjb250
aWd1b3VzIG9yIGhhdmUgZGlmZmVyaW5nCisJCSAqIG1lbW9yeSBhdHRyaWJ1dGVzLgorCQkgKi8K
KwkJcCA9IFRBSUxRX05FWFQocCwgbGlzdHEpOworCQlmb3IgKHBhID0gcHRlcGEgKyBQQUdFX1NJ
WkU7IHBhIDwgcHRlcGEgKyBzaXplOworCQkgICAgcGEgKz0gUEFHRV9TSVpFKSB7CisJCQlLQVNT
RVJUKHAtPnZhbGlkID09IFZNX1BBR0VfQklUU19BTEwsCisJCQkgICAgKCIlczogaW52YWxpZCBw
YWdlICVwIiwgX19mdW5jX18sIHApKTsKKwkJCWlmIChwYSAhPSBWTV9QQUdFX1RPX1BIWVMocCkg
fHwKKwkJCSAgICBtZW1hdHRyICE9IHAtPm1kLnB2X21lbWF0dHIpCisJCQkJcmV0dXJuOworCQkJ
cCA9IFRBSUxRX05FWFQocCwgbGlzdHEpOworCQl9CisKKwkJLyoKKwkJICogTWFwIHVzaW5nIDJN
QiBwYWdlcy4gICJwdGVwYSIgaXMgMk0gYWxpZ25lZCBhbmQgInNpemUiCisJCSAqIGlzIGEgbXVs
dGlwbGUgb2YgMk0uCisJCSAqLworCQlQTUFQX0xPQ0socG1hcCk7CisJCWZvciAocGEgPSBwdGVw
YTsgcGEgPCBwdGVwYSArIHNpemU7IHBhICs9IE5CUERSKSB7CisJCQlwZHBnID0gcG1hcF9hbGxv
Y3BkZShwbWFwLCBhZGRyLCBOVUxMKTsKKwkJCWlmIChwZHBnID09IE5VTEwpIHsKKwkJCQkvKgor
CQkJCSAqIFRoZSBjcmVhdGlvbiBvZiBtYXBwaW5ncyBiZWxvdyBpcyBvbmx5IGFuCisJCQkJICog
b3B0aW1pemF0aW9uLiAgSWYgYSBwYWdlIGRpcmVjdG9yeSBwYWdlCisJCQkJICogY2Fubm90IGJl
IGFsbG9jYXRlZCB3aXRob3V0IGJsb2NraW5nLAorCQkJCSAqIGNvbnRpbnVlIG9uIHRvIHRoZSBu
ZXh0IG1hcHBpbmcgcmF0aGVyIHRoYW4KKwkJCQkgKiBibG9ja2luZy4KKwkJCQkgKi8KKwkJCQlh
ZGRyICs9IE5CUERSOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJcGRlID0gKHBkX2VudHJ5X3Qg
KilNSVBTX1BIWVNfVE9fRElSRUNUKAorCQkJICAgIFZNX1BBR0VfVE9fUEhZUyhwZHBnKSk7CisJ
CQlwZGUgPSAmcGRlW3BtYXBfcGRlX2luZGV4KGFkZHIpXTsKKwkJCWlmICghcHRlX2lzX3ZhbGlk
KChwdF9lbnRyeV90ICopcGRlKSkgeworCQkJCXB0X2VudHJ5X3QgbmV3cHRlID0gVExCTE9fUEFf
VE9fUEZOKHBhKSB8CisJCQkJICAgIFBURV9QU18xTSB8IFBURV9EIHwgUFRFX1JFRiB8IFBURV9W
QUxJRDsKKworCQkJCWlmIChpc19jYWNoZWFibGVfbWVtKHBhKSkgeworCQkJCQlpZiAocGRwZy0+
bWQucHZfbWVtYXR0ciA9PQorCQkJCQkgICAgVk1fTUVNQVRUUl9VTkNBQ0hFQUJMRSkKKwkJCQkJ
CW5ld3B0ZSB8PSBQVEVfQ19VTkNBQ0hFRDsKKwkJCQkJZWxzZQorCQkJCQkJbmV3cHRlIHw9IFBU
RV9DX0NBQ0hFOworCQkJCX0gZWxzZQorCQkJCQluZXdwdGUgfD0gUFRFX0NfVU5DQUNIRUQ7CisK
KwkJCQlwZGVfc3RvcmUocGRlLCBuZXdwdGUpOworCQkJCXBtYXBfcmVzaWRlbnRfY291bnRfaW5j
KHBtYXAsIE5CUERSL1BBR0VfU0laRSk7CisJCQkJYXRvbWljX2FkZF9sb25nKCZwbWFwX3BkZV9t
YXBwaW5ncywgMSk7CisJCQl9IGVsc2UgeworCQkJCS8qIENvbnRpbnVlIG9uIGlmIHRoZSBQREUg
aXMgYWxyZWFkeSB2YWxpZC4gKi8KKwkJCQlwZHBnLT53aXJlX2NvdW50LS07CisJCQkJS0FTU0VS
VChwZHBnLT53aXJlX2NvdW50ID4gMCwKKwkJCQkgICAgKCIlczogbWlzc2luZyByZWZlcmVuY2Ug
dG8gcGFnZSBkaXJlY3RvcnkgIgorCQkJCSAgICAicGFnZSwgdmE6IDB4JWx4IiwgX19mdW5jX18s
IGFkZHIpKTsKKwkJCX0KKwkJCWFkZHIgKz0gTkJQRFI7CisJCX0KKwkJUE1BUF9VTkxPQ0socG1h
cCk7CisJfQorfQorCisvKgorICoJQ2xlYXIgdGhlIHdpcmVkIGF0dHJpYnV0ZSBmcm9tIHRoZSBt
YXBwaW5ncyBmb3IgdGhlIHNwZWNpZmllZCByYW5nZSBvZgorICoJYWRkcmVzc2VzIGluIHRoZSBn
aXZlbiBwbWFwLiAgRXZlcnkgdmFsaWQgbWFwcGluZyB3aXRoaW4gdGhhdCByYW5nZQorICoJbXVz
dCBoYXZlIHRoZSB3aXJlZCBhdHRyaWJ1dGUgc2V0LiAgSW4gY29udHJhc3QsIGludmFsaWQgbWFw
cGluZ3MKKyAqCWNhbm5vdCBoYXZlIHRoZSB3aXJlZCBhdHRyaWJ1dGUgc2V0LCBzbyB0aGV5IGFy
ZSBpZ25vcmVkLgorICoKKyAqCVRoZSB3aXJlZCBhdHRyaWJ1dGUgb2YgdGhlIHBhZ2UgdGFibGUg
ZW50cnkgaXMgbm90IGEgaGFyZHdhcmUgZmVhdHVyZSwKKyAqCXNvIHRoZXJlIGlzIG5vIG5lZWQg
dG8gaW52YWxpZGF0ZSBhbnkgVExCIGVudHJpZXMuCisgKi8KK3ZvaWQKK3BtYXBfdW53aXJlKHBt
YXBfdCBwbWFwLCB2bV9vZmZzZXRfdCBzdmEsIHZtX29mZnNldF90IGV2YSkKK3sKKwlwZF9lbnRy
eV90ICpwZGUsICpwZHBlOworCXB0X2VudHJ5X3QgKnB0ZTsKKwl2bV9vZmZzZXRfdCB2YV9uZXh0
OworCWJvb2xlYW5fdCBwdl9saXN0c19sb2NrZWQ7CisKKwlwdl9saXN0c19sb2NrZWQgPSBGQUxT
RTsKK3Jlc3VtZToKKwlQTUFQX0xPQ0socG1hcCk7CisJZm9yICg7IHN2YSA8IGV2YTsgc3ZhID0g
dmFfbmV4dCkgeworCQlwZHBlID0gcG1hcF9zZWdtYXAocG1hcCwgc3ZhKTsKKwkJaWYgKCpwZHBl
ID09IE5VTEwpIHsKKwkJCXZhX25leHQgPSAoc3ZhICsgTkJTRUcpICYgflNFR01BU0s7CisJCQlp
ZiAodmFfbmV4dCA8IHN2YSkKKwkJCQl2YV9uZXh0ID0gZXZhOworCQkJY29udGludWU7CisJCX0K
KwkJdmFfbmV4dCA9IChzdmEgKyBOQlBEUikgJiB+UERSTUFTSzsKKwkJaWYgKHZhX25leHQgPCBz
dmEpCisJCQl2YV9uZXh0ID0gZXZhOworCQlwZGUgPSBwbWFwX3BkcGVfdG9fcGRlKHBkcGUsIHN2
YSk7CisJCWlmICgqcGRlID09IE5VTEwpCisJCQljb250aW51ZTsKKwkJaWYgKHBkZV9pc18xbV9z
dXBlcnBhZ2UocGRlKSkgeworCQkJaWYgKCFwZGVfdGVzdChwZGUsIFBURV9XKSkKKwkJCQlwYW5p
YygicG1hcF91bndpcmU6IHBkZSAlI2p4IGlzIG1pc3NpbmcgUFRFX1ciLAorCQkJCSAgICAodWlu
dG1heF90KSpwZGUpOworCQkJLyoKKwkJCSAqIEFyZSB3ZSB1bndpcmluZyB0aGUgZW50aXJlIHN1
cGVycGFnZT8gSWYgbm90LAorCQkJICogZGVtb3RlIHRoZSBtYXBwaW5nIGFuZCBmYWxsIHRocm91
Z2guCisJCQkgKi8KKwkJCWlmIChzdmEgKyBOQlBEUiA9PSB2YV9uZXh0ICYmIGV2YSA+PSB2YV9u
ZXh0KSB7CisJCQkJYXRvbWljX2NsZWFyX2xvbmcoKHB0X2VudHJ5X3QgKilwZGUsIFBURV9XKTsK
KwkJCQlwbWFwLT5wbV9zdGF0cy53aXJlZF9jb3VudCAtPSBOQlBEUiAvIFBBR0VfU0laRTsKKwkJ
CQljb250aW51ZTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKCFwdl9saXN0c19sb2NrZWQpIHsKKwkJ
CQkJcHZfbGlzdHNfbG9ja2VkID0gVFJVRTsKKwkJCQkJaWYgKCFyd190cnlfcmxvY2soJnB2aF9n
bG9iYWxfbG9jaykpIHsKKwkJCQkJCSBQTUFQX1VOTE9DSyhwbWFwKTsKKwkJCQkJCSByd19ybG9j
aygmcHZoX2dsb2JhbF9sb2NrKTsKKwkJCQkJCSAvKiBSZXBlYXQgc3ZhLiAqLworCQkJCQkJIGdv
dG8gcmVzdW1lOworCQkJCQl9CisJCQkJfQorCQkJCWlmICghcG1hcF9kZW1vdGVfcGRlKHBtYXAs
IHBkZSwgc3ZhKSkKKwkJCQkJcGFuaWMoInBtYXBfdW53aXJlOiBkZW1vdGlvbiBmYWlsZWQiKTsK
KwkJCX0KKwkJfQorCQlpZiAodmFfbmV4dCA+IGV2YSkKKwkJCXZhX25leHQgPSBldmE7CisJCWZv
ciAocHRlID0gcG1hcF9wZGVfdG9fcHRlKHBkZSwgc3ZhKTsgc3ZhICE9IHZhX25leHQ7IHB0ZSsr
LAorCQkgICAgc3ZhICs9IFBBR0VfU0laRSkgeworCQkJaWYgKCFwdGVfaXNfdmFsaWQocHRlKSkK
KwkJCQljb250aW51ZTsKKwkJCWlmICghcHRlX3Rlc3QocHRlLCBQVEVfVykpCisJCQkJcGFuaWMo
InBtYXBfdW53aXJlOiBwdGUgJSNqeCBpcyBtaXNzaW5nIFBHX1ciLAorCQkJCSAgICAodWludG1h
eF90KSpwdGUpOworCQkJLyoKKwkJCSAqIFBURV9XIG11c3QgYmUgY2xlYXJlZCBhdG9taWNhbGx5
LiAgQWx0aG91Z2ggdGhlIHBtYXAKKwkJCSAqIGxvY2sgc3luY2hyb25pemVzIGFjY2VzcyB0byBQ
VEVfVywgYW5vdGhlciBwcm9jZXNzb3IKKwkJCSAqIGNvdWxkIGJlIHNldHRpbmcgUFRFX0QgYW5k
L29yIFBURV9SRUYgY29uY3VycmVudGx5LgorCQkJICovCisJCQlwdGVfYXRvbWljX2NsZWFyKHB0
ZSwgUFRFX1cpOworCQkJcG1hcC0+cG1fc3RhdHMud2lyZWRfY291bnQtLTsKKwkJfQorCX0KKwlp
ZiAocHZfbGlzdHNfbG9ja2VkKSB7CisJCXJ3X3J1bmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJ
fQorCVBNQVBfVU5MT0NLKHBtYXApOworfQorCisvKgorICoJQ29weSB0aGUgcmFuZ2Ugc3BlY2lm
aWVkIGJ5IHNyY19hZGRyL2xlbgorICoJZnJvbSB0aGUgc291cmNlIG1hcCB0byB0aGUgcmFuZ2Ug
ZHN0X2FkZHIvbGVuCisgKglpbiB0aGUgZGVzdGluYXRpb24gbWFwLgorICoKKyAqCVRoaXMgcm91
dGluZSBpcyBvbmx5IGFkdmlzb3J5IGFuZCBuZWVkIG5vdCBkbyBhbnl0aGluZy4KKyAqLworCit2
b2lkCitwbWFwX2NvcHkocG1hcF90IGRzdF9wbWFwLCBwbWFwX3Qgc3JjX3BtYXAsIHZtX29mZnNl
dF90IGRzdF9hZGRyLAorICAgIHZtX3NpemVfdCBsZW4sIHZtX29mZnNldF90IHNyY19hZGRyKQor
eworI2lmIDAKKy8qCisgKiBYWFggVGhpcyBkb2Vzbid0IGhlbHAgd2l0aCBmb3JrKCkgcGVyZm9y
bWFuY2UgYW5kCisgKiBhZGRzIG1vcmUgb3ZlcmhlYWQuICBNYXliZSB0aGUgcmVmZXJlbmNlIGJp
dCBlbXVsYXRpb24KKyAqIGlzIGNhdXNpbmcgZmF1bHQtbGlrZSBvdmVyaGVhZCBhbnl3YXk/Cisg
Ki8KKworCXN0cnVjdCByd2xvY2sgKmxvY2s7CisJc3RydWN0IHNwZ2xpc3QgZnJlZTsKKwl2bV9v
ZmZzZXRfdCBhZGRyLCBlbmRfYWRkciwgdmFfbmV4dDsKKworCWlmIChkc3RfYWRkciAhPSBzcmNf
YWRkcikKKwkJcmV0dXJuOworCisJaWYgKFBDUFVfR0VUKGN1cnBtYXApICE9IHNyY19wbWFwKQor
CQlyZXR1cm47CisKKwllbmRfYWRkciA9IHNyY19hZGRyICsgbGVuOworCisJbG9jayA9IE5VTEw7
CisJcndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJLyogTG9jayB0aGUgcG1hcHMgaW4gdGhl
IHNhbWUgb3JkZXIgdG8gYXZvaWQgZGVhZGxvY2suICovCisJaWYgKGRzdF9wbWFwIDwgc3JjX3Bt
YXApIHsKKwkJUE1BUF9MT0NLKGRzdF9wbWFwKTsKKwkJUE1BUF9MT0NLKHNyY19wbWFwKTsKKwl9
IGVsc2UgeworCQlQTUFQX0xPQ0soc3JjX3BtYXApOworCQlQTUFQX0xPQ0soZHN0X3BtYXApOwor
CX0KKworCWZvciAoYWRkciA9IHNyY19hZGRyOyBhZGRyIDwgZW5kX2FkZHI7IGFkZHIgPSB2YV9u
ZXh0KSB7CisJCXB0X2VudHJ5X3QgKnNyY19wdGUsICpkc3RfcHRlOworCQl2bV9wYWdlX3QgZHN0
bXBkZSwgZHN0bXB0ZSwgc3JjbXB0ZTsKKwkJcGRfZW50cnlfdCAqc3JjX3BkcGUsICpzcmNfcGRl
LCAqZHN0X3BkZTsKKwkJcHRfZW50cnlfdCBzcmNwdGU7CisJCXZtX3BhZGRyX3Qgc3JjcGFkZHI7
CisJCXZtX3BhZ2VfdCBtOworCisKKwkJc3JjX3BkcGUgPSBwbWFwX3NlZ21hcChzcmNfcG1hcCwg
YWRkcik7CisJCWlmIChzcmNfcGRwZSA9PSBOVUxMIHx8ICpzcmNfcGRwZSA9PSAwKSB7CisJCQl2
YV9uZXh0ID0gKGFkZHIgKyBOQlNFRykgJiB+U0VHTUFTSzsKKwkJCS8qCisJCQkgKiBJZiB0aGUg
bmV4dCB2YSBpcyBvdXQgb2YgdGhlIGNvcHkgcmFuZ2UgdGhlbiBzZXQKKwkJCSAqIGl0IHRvIGVu
ZF9hZGRyIGluIG9yZGVyIHRvIGNvcHkgYWxsIG1hcHBpbmdzIHVudGlsCisJCQkgKiBnaXZlbiBs
aW1pdC4KKwkJCSAqLworCQkJaWYgKHZhX25leHQgPCBhZGRyKQorCQkJCXZhX25leHQgPSBlbmRf
YWRkcjsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJdmFfbmV4dCA9IChhZGRyICsgTkJQRFIpICYg
flBEUk1BU0s7CisJCWlmICh2YV9uZXh0IDwgYWRkcikKKwkJCXZhX25leHQgPSBlbmRfYWRkcjsK
KworCQlzcmNfcGRlID0gcG1hcF9wZHBlX3RvX3BkZShzcmNfcGRwZSwgYWRkcik7CisJCWlmIChz
cmNfcGRlID09IE5VTEwgfHwgKnNyY19wZGUgPT0gMCkKKwkJCWNvbnRpbnVlOworCQlzcmNwdGUg
PSAocHRfZW50cnlfdCkqc3JjX3BkZTsKKworCQlpZiAocHRlX2lzXzFtX3N1cGVycGFnZSgmc3Jj
cHRlKSkgeworCQkJLyogQ29weSBzdXBlcnBhZ2UgcGRlLiAqLworCQkJaWYgKChhZGRyICYgUERS
TUFTSykgIT0gMCB8fCBhZGRyICsgTkJQRFIgPiBlbmRfYWRkcikKKwkJCQljb250aW51ZTsKKwkJ
CWRzdG1wZGUgPSBwbWFwX2FsbG9jcGRlKGRzdF9wbWFwLCBhZGRyLCBOVUxMKTsKKwkJCWlmIChk
c3RtcGRlID09IE5VTEwpCisJCQkJYnJlYWs7CisKKwkJCS8qIGRzdF9wZGUgPSBwbWFwX3BkZShk
c3RfcG1hcCwgYWRkcik7ICovCisJCQlkc3RfcGRlID0gKHBkX2VudHJ5X3QgKilNSVBTX1BIWVNf
VE9fRElSRUNUKAorCQkJICAgIFZNX1BBR0VfVE9fUEhZUyhkc3RtcGRlKSk7CisJCQlkc3RfcGRl
ID0gJmRzdF9wZGVbcG1hcF9wZGVfaW5kZXgoYWRkcildOworCisJCQlpZiAoKmRzdF9wZGUgPT0g
MCAmJgorCQkJICAgICghcHRlX3Rlc3QoJnNyY3B0ZSwgUFRFX01BTkFHRUQpIHx8CisJCQkgICAg
cG1hcF9wdl9pbnNlcnRfcGRlKGRzdF9wbWFwLCBhZGRyLAorCQkJICAgIFRMQkxPX1BURV9UT19Q
QShzcmNwdGUpLCAmbG9jaykpKSB7CisJCQkJKmRzdF9wZGUgPSAocGRfZW50cnlfdCkoc3JjcHRl
ICYgflBURV9XKTsKKwkJCQlwbWFwX3Jlc2lkZW50X2NvdW50X2luYyhkc3RfcG1hcCwgTkJQRFIg
LworCQkJCSAgICBQQUdFX1NJWkUpOworCQkJfSBlbHNlCisJCQkJZHN0bXBkZS0+d2lyZV9jb3Vu
dC0tOworCQkJY29udGludWU7CisJCX0KKworCQlzcmNwYWRkciA9IE1JUFNfRElSRUNUX1RPX1BI
WVMoKnNyY19wZGUpOworCQlzcmNtcHRlID0gUEhZU19UT19WTV9QQUdFKHNyY3BhZGRyKTsKKwkJ
S0FTU0VSVChzcmNtcHRlLT53aXJlX2NvdW50ID4gMCwKKwkJICAgICgicG1hcF9jb3B5OiBzb3Vy
Y2UgcGFnZSB0YWJsZSBwYWdlIGlzIHVudXNlZCIpKTsKKworCQkvKgorCQkgKiBMaW1pdCBvdXIg
c2NhbiB0byBlaXRoZXIgdGhlIGVuZCBvZiB0aGUgdmFkZHIgcmVwcmVzZW50ZWQKKwkJICogYnkg
dGhlIHNvdXJjZSBwYWdlIHRhYmxlIHBhZ2UsIG9yIHRvIHRoZSBlbmQgb2YgdGhlIHJhbmdlCisJ
CSAqIGJlaW5nIGNvcGllZC4KKwkJICovCisJCWlmICh2YV9uZXh0ID4gZW5kX2FkZHIpCisJCQl2
YV9uZXh0ID0gZW5kX2FkZHI7CisKKwkJLyoKKwkJICogV2FsayB0aGUgc291cmNlIHBhZ2UgdGFi
bGUgZW50cmllcyBhbmQgY29weSB0aGUgbWFuYWdlZAorCQkgKiBlbnRyaWVzLgorCQkgKi8KKwor
CQkvKiBzcmNfcHRlID0gcG1hcF9wZGVfdG9fcHRlKHNyY19wZGUsIGFkZHIpOyAqLworCQlzcmNf
cHRlID0gKHB0X2VudHJ5X3QgKilNSVBTX1BIWVNfVE9fRElSRUNUKHNyY3BhZGRyKTsKKwkJc3Jj
X3B0ZSA9ICZzcmNfcHRlW3BtYXBfcHRlX2luZGV4KGFkZHIpXTsKKworCQlpZiAoc3JjX3B0ZSA9
PSBOVUxMIHx8ICpzcmNfcHRlID09IDApCisJCQljb250aW51ZTsKKworCQlkc3RtcHRlID0gTlVM
TDsKKwkJd2hpbGUgKGFkZHIgPCB2YV9uZXh0KSB7CisJCQl1bnNpZ25lZCBwZGVwaW5kZXg7CisJ
CQlwdF9lbnRyeV90IHB0ZXRlbXA7CisKKworCQkJcHRldGVtcCA9ICpzcmNfcHRlOworCisJCQkv
KgorCQkJICogd2Ugb25seSB2aXJ0dWFsIGNvcHkgbWFuYWdlZCBwYWdlcworCQkJICovCisJCQlp
ZiAocHRlX3Rlc3QoJnB0ZXRlbXAsIFBURV9NQU5BR0VEKSkgeworCQkJCS8qIENhbGN1bGF0ZSBw
YWdldGFibGUgcGFnZSBpbmRleCAqLworCQkJCXBkZXBpbmRleCA9IHBtYXBfcGRlX3BpbmRleChh
ZGRyKTsKKworCQkJCS8qIEdldCB0aGUgcGFnZSBkaXJlY3RvcnkgZW50cnkuICovCisJCQkJZHN0
X3BkZSA9IHBtYXBfcGRlKGRzdF9wbWFwLCBhZGRyKTsKKworCQkJCWlmIChkc3RfcGRlICE9IE5V
TEwgJiYgKmRzdF9wZGUgIT0gMCkgeworCQkJCQlkc3RtcHRlID0gUEhZU19UT19WTV9QQUdFKAor
CQkJCQkgICAgTUlQU19ESVJFQ1RfVE9fUEhZUygqZHN0X3BkZSkpOworCQkJCX0gZWxzZQorCQkJ
CQlkc3RtcHRlID0gTlVMTDsKKworCQkJCWlmIChkc3RtcHRlICE9IE5VTEwgJiYKKwkJCQkgICAg
ZHN0bXB0ZS0+cGluZGV4ID09IHBkZXBpbmRleCkgeworCQkJCQkvKgorCQkJCQkgKiBUaGUgcGFn
ZSB0YWJsZSBpcyBtYXBwZWQgc28ganVzdAorCQkJCQkgKiBpbmNyZW1lbnQgdGhlIGhvbGQgY291
bnQuCisJCQkJCSAqLworCQkJCQlkc3RtcHRlLT53aXJlX2NvdW50Kys7CisJCQkJfSBlbHNlIHsK
KwkJCQkJLyoKKwkJCQkJICogVGhlIHBhZ2UgdGFibGUgaXNuJ3QgbWFwcGVkLCBvciBpdAorCQkJ
CQkgKiBoYXMgYmVlbiBkZWFsbG9jYXRlZC4KKwkJCQkJICovCisJCQkJCWRzdG1wdGUgPSBwbWFw
X2FsbG9jcHRlKGRzdF9wbWFwLAorCQkJCQkgICAgYWRkciwgTlVMTCk7CisKKwkJCQkJLyoKKwkJ
CQkJICogSWYgd2UgYXJlIGhhdmluZyBtZW1vcnkgYWxsb2MgaXNzdWVzCisJCQkJCSAqIHRoZW4g
YWJhbmRvbiB0cnlpbmcgdG8gY29weSB0aGUgcGFnZQorCQkJCQkgKiB0YWJsZXMuCisJCQkJCSAq
LworCQkJCQlpZiAoZHN0bXB0ZSA9PSBOVUxMKQorCQkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJ
CS8qCisJCQkJICogTm93IHRoYXQgd2UgaGF2ZSBhIHBhZ2UgZGlyZWN0b3J5LCBnZXQgdGhlCisJ
CQkJICogcHRlLgorCQkJCSAqLworCisJCQkJLyogZHN0X3B0ZSA9IHBtYXBfcHRlKGRzdF9wbWFw
LCBhZGRyKTsgKi8KKwkJCQlkc3RfcHRlID0gKHB0X2VudHJ5X3QgKikKKwkJCQkgICAgTUlQU19Q
SFlTX1RPX0RJUkVDVCgKKwkJCQkJVk1fUEFHRV9UT19QSFlTKGRzdG1wdGUpKTsKKwkJCQlkc3Rf
cHRlID0gJmRzdF9wdGVbcG1hcF9wdGVfaW5kZXgoYWRkcildOworCisJCQkJLyogVHJ5IGFuZCBp
bnNlcnQgdGhlIHB2X2VudHJ5LiAqLworCQkJCW0gPSBQSFlTX1RPX1ZNX1BBR0UoVExCTE9fUFRF
X1RPX1BBKHB0ZXRlbXApKTsKKwkJCQlpZiAoKmRzdF9wdGUgPT0gMCAmJgorCQkJCSAgICBwbWFw
X3RyeV9pbnNlcnRfcHZfZW50cnkoZHN0X3BtYXAsIGFkZHIsIG0sCisJCQkJICAgICZsb2NrKSkg
eworCQkJCQkvKgorCQkJCQkgKiBQb3B1bGF0ZSB0aGUgZW50cnkuCisJCQkJCSAqCisJCQkJCSAq
IENsZWFyIHRoZSB3aXJlZCwgbW9kaWZpZWQsIGFuZAorCQkJCQkgKiBhY2Nlc3NlZCAocmVmZXJl
bmNlZCkgYml0cworCQkJCQkgKiBkdXJpbmcgdGhlIGNvcHkuCisJCQkJCSAqLworCQkJCQlwdGVf
Y2xlYXIoJnB0ZXRlbXAsIFBURV9XIHwgUFRFX0QgfAorCQkJCQkgICAgUFRFX1JFRik7CisJCQkJ
CSpkc3RfcHRlID0gcHRldGVtcDsKKwkJCQkJLyogVXBkYXRlIHN0YXRzLiAqLworCQkJCQlwbWFw
X3Jlc2lkZW50X2NvdW50X2luYyhkc3RfcG1hcCwgMSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJU0xJ
U1RfSU5JVCgmZnJlZSk7CisJCQkJCWlmIChwbWFwX3Vud2lyZV9wdHAoZHN0X3BtYXAsIGFkZHIs
CisJCQkJCSAgICBkc3RtcHRlLCAmZnJlZSkpIHsKKwkJCQkJCXBtYXBfaW52YWxpZGF0ZV9wYWdl
KGRzdF9wbWFwLAorCQkJCQkJICAgIGFkZHIpOworCQkJCQkJcG1hcF9mcmVlX3plcm9fcGFnZXMo
JmZyZWUpOworCQkJCQl9CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCQkvKiBDaGVjayB0aGUg
d2lyZV9jb3VudCB0byBzZWUgaWYgd2UncmUgZG9uZS4gKi8KKwkJCQlpZiAoZHN0bXB0ZS0+d2ly
ZV9jb3VudCA+PSBzcmNtcHRlLT53aXJlX2NvdW50KQorCQkJCQlicmVhazsKKwkJCX0KKwkJCWFk
ZHIgKz0gUEFHRV9TSVpFOworCQkJc3JjX3B0ZSsrOworCQl9CisJfQorb3V0OgorCWlmIChsb2Nr
ICE9IE5VTEwpCisJCXJ3X3d1bmxvY2sobG9jayk7CisJcndfcnVubG9jaygmcHZoX2dsb2JhbF9s
b2NrKTsKKwlQTUFQX1VOTE9DSyhzcmNfcG1hcCk7CisJUE1BUF9VTkxPQ0soZHN0X3BtYXApOwor
I2VuZGlmIC8qICNpZiAwICovCit9CisKKy8qCisgKglwbWFwX3plcm9fcGFnZSB6ZXJvcyB0aGUg
c3BlY2lmaWVkIGhhcmR3YXJlIHBhZ2UgYnkgbWFwcGluZworICoJdGhlIHBhZ2UgaW50byBLVk0g
YW5kIHVzaW5nIGJ6ZXJvIHRvIGNsZWFyIGl0cyBjb250ZW50cy4KKyAqCisgKiAJVXNlIFhLUEhZ
UyBmb3IgNjQgYml0LgorICovCit2b2lkCitwbWFwX3plcm9fcGFnZSh2bV9wYWdlX3QgbSkKK3sK
Kwl2bV9vZmZzZXRfdCB2YTsKKwl2bV9wYWRkcl90IHBoeXMgPSBWTV9QQUdFX1RPX1BIWVMobSk7
CisKKwl2YSA9IE1JUFNfUEhZU19UT19ESVJFQ1QocGh5cyk7CisJc2NoZWRfcGluKCk7CisJYnpl
cm8oKGNhZGRyX3QpdmEsIFBBR0VfU0laRSk7CisJbWlwc19kY2FjaGVfd2JpbnZfcmFuZ2UodmEs
IFBBR0VfU0laRSk7CisJc2NoZWRfdW5waW4oKTsKK30KKworLyoKKyAqCXBtYXBfemVyb19wYWdl
X2FyZWEgemVyb3MgdGhlIHNwZWNpZmllZCBoYXJkd2FyZSBwYWdlIGJ5IG1hcHBpbmcKKyAqCXRo
ZSBwYWdlIGludG8gS1ZNIGFuZCB1c2luZyBiemVybyB0byBjbGVhciBpdHMgY29udGVudHMuCisg
KgorICoJb2ZmIGFuZCBzaXplIG1heSBub3QgY292ZXIgYW4gYXJlYSBiZXlvbmQgYSBzaW5nbGUg
aGFyZHdhcmUgcGFnZS4KKyAqLwordm9pZAorcG1hcF96ZXJvX3BhZ2VfYXJlYSh2bV9wYWdlX3Qg
bSwgaW50IG9mZiwgaW50IHNpemUpCit7CisJdm1fb2Zmc2V0X3QgdmE7CisJdm1fcGFkZHJfdCBw
aHlzID0gVk1fUEFHRV9UT19QSFlTKG0pOworCisJdmEgPSBNSVBTX1BIWVNfVE9fRElSRUNUKHBo
eXMpOworCXNjaGVkX3BpbigpOworCWJ6ZXJvKChjaGFyICopKGNhZGRyX3QpdmEgKyBvZmYsIHNp
emUpOworCW1pcHNfZGNhY2hlX3diaW52X3JhbmdlKHZhICsgb2ZmLCBzaXplKTsKKwlzY2hlZF91
bnBpbigpOworfQorCit2b2lkCitwbWFwX3plcm9fcGFnZV9pZGxlKHZtX3BhZ2VfdCBtKQorewor
CXZtX29mZnNldF90IHZhOworCXZtX3BhZGRyX3QgcGh5cyA9IFZNX1BBR0VfVE9fUEhZUyhtKTsK
KworCXZhID0gTUlQU19QSFlTX1RPX0RJUkVDVChwaHlzKTsKKwlzY2hlZF9waW4oKTsKKwliemVy
bygoY2FkZHJfdCl2YSwgUEFHRV9TSVpFKTsKKwltaXBzX2RjYWNoZV93Ymludl9yYW5nZSh2YSwg
UEFHRV9TSVpFKTsKKwlzY2hlZF91bnBpbigpOworfQorCisvKgorICoJcG1hcF9jb3B5X3BhZ2Ug
Y29waWVzIHRoZSBzcGVjaWZpZWQgKG1hY2hpbmUgaW5kZXBlbmRlbnQpCisgKglwYWdlIGJ5IG1h
cHBpbmcgdGhlIHBhZ2UgaW50byB2aXJ0dWFsIG1lbW9yeSBhbmQgdXNpbmcKKyAqCWJjb3B5IHRv
IGNvcHkgdGhlIHBhZ2UsIG9uZSBtYWNoaW5lIGRlcGVuZGVudCBwYWdlIGF0IGEKKyAqCXRpbWUu
CisgKgorICogCVVzZSBYS1BIWVMgZm9yIDY0IGJpdC4KKyAqLworI2RlZmluZQlQTUFQX0NPUFlf
VEFHUwkweDAwMDAwMDAxCitzdGF0aWMgdm9pZAorcG1hcF9jb3B5X3BhZ2VfaW50ZXJuYWwodm1f
cGFnZV90IHNyYywgdm1fcGFnZV90IGRzdCwgaW50IGZsYWdzKQoreworCXZtX29mZnNldF90IHZh
X3NyYywgdmFfZHN0OworCXZtX3BhZGRyX3QgcGh5c19zcmMgPSBWTV9QQUdFX1RPX1BIWVMoc3Jj
KTsKKwl2bV9wYWRkcl90IHBoeXNfZHN0ID0gVk1fUEFHRV9UT19QSFlTKGRzdCk7CisKKwkvKiBl
YXN5IGNhc2UsIGFsbCBjYW4gYmUgYWNjZXNzZWQgdmlhIEtTRUcwICovCisJLyoKKwkgKiBGbHVz
aCBhbGwgY2FjaGVzIGZvciBWQSB0aGF0IGFyZSBtYXBwZWQgdG8gdGhpcyBwYWdlCisJICogdG8g
bWFrZSBzdXJlIHRoYXQgZGF0YSBpbiBTRFJBTSBpcyB1cCB0byBkYXRlCisJICovCisJc2NoZWRf
cGluKCk7CisJcG1hcF9mbHVzaF9wdmNhY2hlKHNyYyk7CisJbWlwc19kY2FjaGVfd2JpbnZfcmFu
Z2VfaW5kZXgoTUlQU19QSFlTX1RPX0RJUkVDVChwaHlzX2RzdCksIFBBR0VfU0laRSk7CisJdmFf
c3JjID0gTUlQU19QSFlTX1RPX0RJUkVDVChwaHlzX3NyYyk7CisJdmFfZHN0ID0gTUlQU19QSFlT
X1RPX0RJUkVDVChwaHlzX2RzdCk7CisjaWZkZWYgQ1BVX0NIRVJJCisJaWYgKGZsYWdzICYgUE1B
UF9DT1BZX1RBR1MpCisJCWNoZXJpX2Jjb3B5KChjYWRkcl90KXZhX3NyYywgKGNhZGRyX3QpdmFf
ZHN0LCBQQUdFX1NJWkUpOworCWVsc2UKKyNlbHNlCisJCWJjb3B5KChjYWRkcl90KXZhX3NyYywg
KGNhZGRyX3QpdmFfZHN0LCBQQUdFX1NJWkUpOworI2VuZGlmCisJbWlwc19kY2FjaGVfd2JpbnZf
cmFuZ2UodmFfZHN0LCBQQUdFX1NJWkUpOworCXNjaGVkX3VucGluKCk7Cit9CisKKy8qCisgKiBX
aXRoIENIRVJJLCBpdCBpcyBzb21ldGltZXMgZGVzaXJhYmxlIHRvIGV4cGxpY2l0bHkgcHJvcGFn
YXRlIHRhZ3MgYmV0d2VlbgorICogcGFnZXMgKGUuZy4sIGR1cmluZyBjb3B5LW9uLXdyaXRlKSwg
YnV0IG5vdCBvdGhlciB0aW1lcyAoZS5nLiwgY29weWluZyBkYXRhCisgKiBmcm9tIFZNIHRvIGJ1
ZmZlciBjYWNoZSkuICBUaGVyZSBpcyBtb3JlIHBsYXlpbmcgb3V0IGhlcmUgeWV0IHRvIGRvIChl
LmcuLAorICogaWYgYW55IGZpbGVzeXN0ZW1zIGxlYXJuIHRvIHByZXNlcnZlIHRhZ3MpIGJ1dCB0
aGVzZSBLUElzIGFsbG93IHVzIHRvCisgKiBjYXB0dXJlIHRoYXQgZGlmZmVyZW5jZSBpbiB0aGUg
bWVhbiB0aW1lLgorICovCit2b2lkCitwbWFwX2NvcHlfcGFnZSh2bV9wYWdlX3Qgc3JjLCB2bV9w
YWdlX3QgZHN0KQoreworCisJcG1hcF9jb3B5X3BhZ2VfaW50ZXJuYWwoc3JjLCBkc3QsIDApOwor
fQorCisjaWZkZWYgQ1BVX0NIRVJJCit2b2lkCitwbWFwX2NvcHlfcGFnZV90YWdzKHZtX3BhZ2Vf
dCBzcmMsIHZtX3BhZ2VfdCBkc3QpCit7CisKKwlwbWFwX2NvcHlfcGFnZV9pbnRlcm5hbChzcmMs
IGRzdCwgUE1BUF9DT1BZX1RBR1MpOworfQorI2VuZGlmCisKK2ludCB1bm1hcHBlZF9idWZfYWxs
b3dlZDsKKworc3RhdGljIHZvaWQKK3BtYXBfY29weV9wYWdlc19pbnRlcm5hbCh2bV9wYWdlX3Qg
bWFbXSwgdm1fb2Zmc2V0X3QgYV9vZmZzZXQsIHZtX3BhZ2VfdCBtYltdLAorICAgIHZtX29mZnNl
dF90IGJfb2Zmc2V0LCBpbnQgeGZlcnNpemUsIGludCBmbGFncykKK3sKKwljaGFyICphX2NwLCAq
Yl9jcDsKKwl2bV9wYWdlX3QgYV9tLCBiX207CisJdm1fb2Zmc2V0X3QgYV9wZ19vZmZzZXQsIGJf
cGdfb2Zmc2V0OworCXZtX3BhZGRyX3QgYV9waHlzLCBiX3BoeXM7CisJaW50IGNudDsKKworCXNj
aGVkX3BpbigpOworCXdoaWxlICh4ZmVyc2l6ZSA+IDApIHsKKwkJYV9wZ19vZmZzZXQgPSBhX29m
ZnNldCAmIFBBR0VfTUFTSzsKKwkJY250ID0gbWluKHhmZXJzaXplLCBQQUdFX1NJWkUgLSBhX3Bn
X29mZnNldCk7CisJCWFfbSA9IG1hW2Ffb2Zmc2V0ID4+IFBBR0VfU0hJRlRdOworCQlhX3BoeXMg
PSBWTV9QQUdFX1RPX1BIWVMoYV9tKTsKKwkJYl9wZ19vZmZzZXQgPSBiX29mZnNldCAmIFBBR0Vf
TUFTSzsKKwkJY250ID0gbWluKGNudCwgUEFHRV9TSVpFIC0gYl9wZ19vZmZzZXQpOworCQliX20g
PSBtYltiX29mZnNldCA+PiBQQUdFX1NISUZUXTsKKwkJYl9waHlzID0gVk1fUEFHRV9UT19QSFlT
KGJfbSk7CisJCXBtYXBfZmx1c2hfcHZjYWNoZShhX20pOworCQltaXBzX2RjYWNoZV93Ymludl9y
YW5nZV9pbmRleChNSVBTX1BIWVNfVE9fRElSRUNUKGJfcGh5cyksCisJCSAgICBQQUdFX1NJWkUp
OworCQlhX2NwID0gKGNoYXIgKilNSVBTX1BIWVNfVE9fRElSRUNUKGFfcGh5cykgKyBhX3BnX29m
ZnNldDsKKwkJYl9jcCA9IChjaGFyICopTUlQU19QSFlTX1RPX0RJUkVDVChiX3BoeXMpICsgYl9w
Z19vZmZzZXQ7CisjaWZkZWYgQ1BVX0NIRVJJCisJCWlmIChmbGFncyAmIFBNQVBfQ09QWV9UQUdT
KQorCQkJY2hlcmlfYmNvcHkoYV9jcCwgYl9jcCwgY250KTsKKwkJZWxzZQorI2Vsc2UKKwkJCWJj
b3B5KGFfY3AsIGJfY3AsIGNudCk7CisjZW5kaWYKKwkJbWlwc19kY2FjaGVfd2JpbnZfcmFuZ2Uo
KHZtX29mZnNldF90KWJfY3AsIGNudCk7CisJCWFfb2Zmc2V0ICs9IGNudDsKKwkJYl9vZmZzZXQg
Kz0gY250OworCQl4ZmVyc2l6ZSAtPSBjbnQ7CisJfQorCXNjaGVkX3VucGluKCk7Cit9CisKKy8q
CisgKiBBcyB3aXRoIHBtYXBfY29weV9wYWdlKCksIENIRVJJIHJlcXVpcmVzIHRhZ2dlZCBhbmQg
bm9uLXRhZ2dlZCB2ZXJzaW9ucworICogZGVwZW5kaW5nIG9uIHRoZSBjaXJjdW1zdGFuY2VzLgor
ICovCit2b2lkCitwbWFwX2NvcHlfcGFnZXModm1fcGFnZV90IG1hW10sIHZtX29mZnNldF90IGFf
b2Zmc2V0LCB2bV9wYWdlX3QgbWJbXSwKKyAgICB2bV9vZmZzZXRfdCBiX29mZnNldCwgaW50IHhm
ZXJzaXplKQoreworCisJcG1hcF9jb3B5X3BhZ2VzX2ludGVybmFsKG1hLCBhX29mZnNldCwgbWIs
IGJfb2Zmc2V0LCB4ZmVyc2l6ZSwgMCk7Cit9CisKKyNpZmRlZiBDUFVfQ0hFUkkKK3ZvaWQKK3Bt
YXBfY29weV9wYWdlc190YWdzKHZtX3BhZ2VfdCBtYVtdLCB2bV9vZmZzZXRfdCBhX29mZnNldCwg
dm1fcGFnZV90IG1iW10sCisgICAgdm1fb2Zmc2V0X3QgYl9vZmZzZXQsIGludCB4ZmVyc2l6ZSkK
K3sKKworCXBtYXBfY29weV9wYWdlc19pbnRlcm5hbChtYSwgYV9vZmZzZXQsIG1iLCBiX29mZnNl
dCwgeGZlcnNpemUsCisJICAgIFBNQVBfQ09QWV9UQUdTKTsKK30KKyNlbmRpZgorCisvKgorICog
UmV0dXJucyB0cnVlIGlmIHRoZSBwbWFwJ3MgcHYgaXMgb25lIG9mIHRoZSBmaXJzdAorICogMTYg
cHZzIGxpbmtlZCB0byBmcm9tIHRoaXMgcGFnZS4gIFRoaXMgY291bnQgbWF5CisgKiBiZSBjaGFu
Z2VkIHVwd2FyZHMgb3IgZG93bndhcmRzIGluIHRoZSBmdXR1cmU7IGl0CisgKiBpcyBvbmx5IG5l
Y2Vzc2FyeSB0aGF0IHRydWUgYmUgcmV0dXJuZWQgZm9yIGEgc21hbGwKKyAqIHN1YnNldCBvZiBw
bWFwcyBmb3IgcHJvcGVyIHBhZ2UgYWdpbmcuCisgKi8KK2Jvb2xlYW5fdAorcG1hcF9wYWdlX2V4
aXN0c19xdWljayhwbWFwX3QgcG1hcCwgdm1fcGFnZV90IG0pCit7CisJc3RydWN0IG1kX3BhZ2Ug
KnB2aDsKKwlzdHJ1Y3Qgcndsb2NrICpsb2NrOworCXB2X2VudHJ5X3QgcHY7CisJaW50IGxvb3Bz
ID0gMDsKKwlib29sZWFuX3QgcnY7CisKKwlLQVNTRVJUKChtLT5vZmxhZ3MgJiBWUE9fVU5NQU5B
R0VEKSA9PSAwLAorCSAgICAoIiVzOiBwYWdlICVwIGlzIG5vdCBtYW5hZ2VkIiwgX19mdW5jX18s
IG0pKTsKKwlydiA9IEZBTFNFOworCXJ3X3Jsb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCWxvY2sg
PSBWTV9QQUdFX1RPX1BWX0xJU1RfTE9DSyhtKTsKKwlyd19ybG9jayhsb2NrKTsKKwlUQUlMUV9G
T1JFQUNIKHB2LCAmbS0+bWQucHZfbGlzdCwgcHZfbmV4dCkgeworCQlpZiAoUFZfUE1BUChwdikg
PT0gcG1hcCkgeworCQkJcnYgPSBUUlVFOworCQkJYnJlYWs7CisJCX0KKwkJbG9vcHMrKzsKKwkJ
aWYgKGxvb3BzID49IDE2KQorCQkJYnJlYWs7CisJfQorCWlmICghcnYgJiYgbG9vcHMgPCAxNiAm
JiAobS0+ZmxhZ3MgJiBQR19GSUNUSVRJT1VTKSA9PSAwKSB7CisJCXB2aCA9IHBhX3RvX3B2aChW
TV9QQUdFX1RPX1BIWVMobSkpOworCQlUQUlMUV9GT1JFQUNIKHB2LCAmcHZoLT5wdl9saXN0LCBw
dl9uZXh0KSB7CisJCQlpZiAoUFZfUE1BUChwdikgPT0gcG1hcCkgeworCQkJCXJ2ID0gVFJVRTsK
KwkJCQlicmVhazsKKwkJCX0KKwkJCWxvb3BzKys7CisJCQlpZiAobG9vcHMgPj0gMTYpCisJCQkJ
YnJlYWs7CisJCX0KKwl9CisJcndfcnVubG9jayhsb2NrKTsKKwlyd19ydW5sb2NrKCZwdmhfZ2xv
YmFsX2xvY2spOworCXJldHVybiAocnYpOworfQorCisvKgorICoJcG1hcF9wYWdlX3dpcmVkX21h
cHBpbmdzOgorICoKKyAqCVJldHVybiB0aGUgbnVtYmVyIG9mIG1hbmFnZWQgbWFwcGluZ3MgdG8g
dGhlIGdpdmVuIHBoeXNpY2FsIHBhZ2UKKyAqCXRoYXQgYXJlIHdpcmVkLgorICovCitpbnQKK3Bt
YXBfcGFnZV93aXJlZF9tYXBwaW5ncyh2bV9wYWdlX3QgbSkKK3sKKwlzdHJ1Y3Qgcndsb2NrICps
b2NrOworCXB2X2VudHJ5X3QgcHY7CisJcG1hcF90IHBtYXA7CisJcHRfZW50cnlfdCAqcHRlOwor
CWludCBjb3VudCwgbWRfZ2VuOworCisJaWYgKChtLT5vZmxhZ3MgJiBWUE9fVU5NQU5BR0VEKSAh
PSAwKQorCQlyZXR1cm4gKDApOworCXJ3X3Jsb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCWxvY2sg
PSBWTV9QQUdFX1RPX1BWX0xJU1RfTE9DSyhtKTsKKwlyd19ybG9jayhsb2NrKTsKK3Jlc3RhcnQ6
CisJY291bnQgPSAwOworCVRBSUxRX0ZPUkVBQ0gocHYsICZtLT5tZC5wdl9saXN0LCBwdl9uZXh0
KSB7CisJCXBtYXAgPSBQVl9QTUFQKHB2KTsKKwkJaWYgKCFQTUFQX1RSWUxPQ0socG1hcCkpIHsK
KwkJCW1kX2dlbiA9IG0tPm1kLnB2X2dlbjsKKwkJCXJ3X3J1bmxvY2sobG9jayk7CisJCQlQTUFQ
X0xPQ0socG1hcCk7CisJCQlyd19ybG9jayhsb2NrKTsKKwkJCWlmIChtZF9nZW4gIT0gbS0+bWQu
cHZfZ2VuKSB7CisJCQkJUE1BUF9VTkxPQ0socG1hcCk7CisJCQkJZ290byByZXN0YXJ0OworCQkJ
fQorCQl9CisJCXB0ZSA9IHBtYXBfcHRlKHBtYXAsIHB2LT5wdl92YSk7CisJCWlmIChwdGVfdGVz
dChwdGUsIFBURV9XKSkKKwkJCWNvdW50Kys7CisJCVBNQVBfVU5MT0NLKHBtYXApOworCX0KKwlp
ZiAoKG0tPmZsYWdzICYgUEdfRklDVElUSU9VUykgPT0gMCkgeworCQlzdHJ1Y3QgbWRfcGFnZSAq
cHZoID0gcGFfdG9fcHZoKFZNX1BBR0VfVE9fUEhZUyhtKSk7CisJCVRBSUxRX0ZPUkVBQ0gocHYs
ICZwdmgtPnB2X2xpc3QsIHB2X25leHQpIHsKKwkJCXBtYXAgPSBQVl9QTUFQKHB2KTsKKwkJCWlm
ICghUE1BUF9UUllMT0NLKHBtYXApKSB7CisJCQkJaW50IHB2aF9nZW4gPSBwdmgtPnB2X2dlbjsK
KwkJCQltZF9nZW4gPSBtLT5tZC5wdl9nZW47CisJCQkJcndfcnVubG9jayhsb2NrKTsKKwkJCQlQ
TUFQX0xPQ0socG1hcCk7CisJCQkJcndfcmxvY2sobG9jayk7CisJCQkJaWYgKG1kX2dlbiAhPSBt
LT5tZC5wdl9nZW4gfHwKKwkJCQkgICAgcHZoX2dlbiAhPSBwdmgtPnB2X2dlbikgeworCQkJCQlQ
TUFQX1VOTE9DSyhwbWFwKTsKKwkJCQkJZ290byByZXN0YXJ0OworCQkJCX0KKwkJCX0KKwkJCXBk
X2VudHJ5X3QgKnBkZSA9IHBtYXBfcGRlKHBtYXAsIHB2LT5wdl92YSk7CisJCQlpZiAocHRlX3Rl
c3QoKHB0X2VudHJ5X3QgKilwZGUsIFBURV9XKSkKKwkJCQljb3VudCsrOworCQkJUE1BUF9VTkxP
Q0socG1hcCk7CisJCX0KKwl9CisJcndfcnVubG9jayhsb2NrKTsKKwlyd19ydW5sb2NrKCZwdmhf
Z2xvYmFsX2xvY2spOworCXJldHVybiAoY291bnQpOworfQorCisvKgorICogIFJldHVybnMgVFJV
RSBpZiB0aGUgZ2l2ZW4gcGFnZSBpcyBtYXBwZWQgaW5kaXZpZHVhbGx5IG9yIGFzIHBhcnQgb2YK
KyAqICBhIDJtcGFnZS4gT3RoZXJ3aXNlLCByZXR1cm5zIEZBTFNFLgorICovCitib29sZWFuX3QK
K3BtYXBfcGFnZV9pc19tYXBwZWQodm1fcGFnZV90IG0pCit7CisJc3RydWN0IHJ3bG9jayAqbG9j
azsKKwlib29sZWFuX3QgcnY7CisKKwlpZiAoKG0tPm9mbGFncyAmIFZQT19VTk1BTkFHRUQpICE9
IDApCisJCXJldHVybiAoRkFMU0UpOworCXJ3X3Jsb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCWxv
Y2sgPSBWTV9QQUdFX1RPX1BWX0xJU1RfTE9DSyhtKTsKKwlyd19ybG9jayhsb2NrKTsKKwlydiA9
ICFUQUlMUV9FTVBUWSgmbS0+bWQucHZfbGlzdCkgfHwKKwkgICAgKChtLT5mbGFncyAmIFBHX0ZJ
Q1RJVElPVVMpID09IDAgJiYKKwkJIVRBSUxRX0VNUFRZKCZwYV90b19wdmgoVk1fUEFHRV9UT19Q
SFlTKG0pKS0+cHZfbGlzdCkpOworCXJ3X3J1bmxvY2sobG9jayk7CisJcndfcnVubG9jaygmcHZo
X2dsb2JhbF9sb2NrKTsKKwlyZXR1cm4gKHJ2KTsKK30KKworLyoKKyAqIERlc3Ryb3kgYWxsIG1h
bmFnZWQsIG5vbi13aXJlZCBtYXBwaW5ncyBpbiB0aGUgZ2l2ZW4gdXNlci1zcGFjZQorICogcG1h
cC4gIFRoaXMgcG1hcCBjYW5ub3QgYmUgYWN0aXZlIG9uIGFueSBwcm9jZXNzb3IgYmVzaWRlcyB0
aGUKKyAqIGNhbGxlci4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNhbm5vdCBiZSBhcHBsaWVkIHRv
IHRoZSBrZXJuZWwgcG1hcC4gIE1vcmVvdmVyLCBpdAorICogaXMgbm90IGludGVuZGVkIGZvciBn
ZW5lcmFsIHVzZS4gIEl0IGlzIG9ubHkgdG8gYmUgdXNlZCBkdXJpbmcKKyAqIHByb2Nlc3MgdGVy
bWluYXRpb24uICBDb25zZXF1ZW50bHksIGl0IGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB3YXlzCisg
KiB0aGF0IG1ha2UgaXQgZmFzdGVyIHRoYW4gcG1hcF9yZW1vdmUoKS4gIEZpcnN0LCBpdCBjYW4g
bW9yZSBxdWlja2x5CisgKiBkZXN0cm95IG1hcHBpbmdzIGJ5IGl0ZXJhdGluZyBvdmVyIHRoZSBw
bWFwJ3MgY29sbGVjdGlvbiBvZiBQVgorICogZW50cmllcywgcmF0aGVyIHRoYW4gc2VhcmNoaW5n
IHRoZSBwYWdlIHRhYmxlLiAgU2Vjb25kLCBpdCBkb2Vzbid0CisgKiBoYXZlIHRvIHRlc3QgYW5k
IGNsZWFyIHRoZSBwYWdlIHRhYmxlIGVudHJpZXMgYXRvbWljYWxseSwgYmVjYXVzZQorICogbm8g
cHJvY2Vzc29yIGlzIGN1cnJlbnRseSBhY2Nlc3NpbmcgdGhlIHVzZXIgYWRkcmVzcyBzcGFjZS4g
IEluCisgKiBwYXJ0aWN1bGFyLCBhIHBhZ2UgdGFibGUgZW50cnkncyBkaXJ0eSBiaXQgd29uJ3Qg
Y2hhbmdlIHN0YXRlIG9uY2UKKyAqIHRoaXMgZnVuY3Rpb24gc3RhcnRzLgorICovCit2b2lkCitw
bWFwX3JlbW92ZV9wYWdlcyhwbWFwX3QgcG1hcCkKK3sKKwlwZF9lbnRyeV90IHB0ZXBkZSwgKnBk
ZTsKKwlwdF9lbnRyeV90ICpwdGUsIHRwdGU7CisJc3RydWN0IHNwZ2xpc3QgZnJlZTsKKwl2bV9w
YWdlX3QgbSwgbXB0ZSwgbXQ7CisJcHZfZW50cnlfdCBwdjsKKwlzdHJ1Y3QgbWRfcGFnZSAqcHZo
OworCXN0cnVjdCBwdl9jaHVuayAqcGMsICpucGM7CisJc3RydWN0IHJ3bG9jayAqbG9jazsKKwlp
bnQgYml0OworCXVpbnQ2NF90IGludXNlLCBiaXRtYXNrOworCWludCBhbGxmcmVlLCBmaWVsZCwg
ZnJlZWQsIGlkeDsKKwlib29sZWFuX3Qgc3VwZXJwYWdlOworCXZtX3BhZGRyX3QgcGE7CisKKwkv
KgorCSAqIEFzc2VydCB0aGF0IHRoZSBnaXZlbiBwbWFwIGlzIG9ubHkgYWN0aXZlIG9uIHRoZSBj
dXJyZW50CisJICogQ1BVLiAgVW5mb3J0dW5hdGVseSwgd2UgY2Fubm90IGJsb2NrIGFub3RoZXIg
Q1BVIGZyb20KKwkgKiBhY3RpdmF0aW5nIHRoZSBwbWFwIHdoaWxlIHRoaXMgZnVuY3Rpb24gaXMg
ZXhlY3V0aW5nLgorCSAqLworCUtBU1NFUlQocG1hcCA9PSB2bXNwYWNlX3BtYXAoY3VydGhyZWFk
LT50ZF9wcm9jLT5wX3Ztc3BhY2UpLAorCSAgICAoIiVzOiBub24tY3VycmVudCBwbWFwICVwIiwg
X19mdW5jX18sIHBtYXApKTsKKworCWxvY2sgPSBOVUxMOworCVNMSVNUX0lOSVQoJmZyZWUpOwor
CXJ3X3Jsb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCVBNQVBfTE9DSyhwbWFwKTsKKwlUQUlMUV9G
T1JFQUNIX1NBRkUocGMsICZwbWFwLT5wbV9wdmNodW5rLCBwY19saXN0LCBucGMpIHsKKwkJYWxs
ZnJlZSA9IDE7CisJCWZyZWVkID0gMDsKKwkJZm9yIChmaWVsZCA9IDA7IGZpZWxkIDwgX05QQ007
IGZpZWxkKyspIHsKKwkJCWludXNlID0gfnBjLT5wY19tYXBbZmllbGRdICYgcGNfZnJlZW1hc2tb
ZmllbGRdOworCQkJd2hpbGUgKGludXNlICE9IDApIHsKKwkJCQliaXQgPSBmZnNsKGludXNlKSAt
IDE7CisJCQkJYml0bWFzayA9IDFVTCA8PCBiaXQ7CisJCQkJaWR4ID0gZmllbGQgKiBzaXplb2Yo
aW51c2UpICogTkJCWSArIGJpdDsKKwkJCQlwdiA9ICZwYy0+cGNfcHZlbnRyeVtpZHhdOworCQkJ
CWludXNlICY9IH5iaXRtYXNrOworCisJCQkJcGRlID0gcG1hcF9zZWdtYXAocG1hcCwgcHYtPnB2
X3ZhKTsKKwkJCQlwdGVwZGUgPSAqcGRlOworCQkJCXBkZSA9IHBtYXBfcGRwZV90b19wZGUocGRl
LCBwdi0+cHZfdmEpOworCQkJCWlmIChwZGVfaXNfMW1fc3VwZXJwYWdlKHBkZSkpIHsKKwkJCQkJ
c3VwZXJwYWdlID0gVFJVRTsKKwkJCQkJcHRlID0gKHB0X2VudHJ5X3QgKilwZGU7CisJCQkJfSBl
bHNlIHsKKwkJCQkJc3VwZXJwYWdlID0gRkFMU0U7CisJCQkJCXB0ZXBkZSA9ICpwZGU7CisJCQkJ
CXB0ZSA9IHBtYXBfcGRlX3RvX3B0ZShwZGUsIHB2LT5wdl92YSk7CisJCQkJfQorCQkJCXRwdGUg
PSAqcHRlOworCQkJCWlmICghcHRlX2lzX3ZhbGlkKHB0ZSkpICB7CisJCQkJCXBhbmljKCIlczog
YmFkICVzIHB0ZSB2YSAlbHggcHRlICVseCIsCisJCQkJCSAgICBfX2Z1bmNfXywgc3VwZXJwYWdl
ID8gInN1cGVycGFnZSIgOgorCQkJCQkgICAgIiIsIHB2LT5wdl92YSwgdHB0ZSk7CisJCQkJfQor
CisvKgorICogV2UgY2Fubm90IHJlbW92ZSB3aXJlZCBwYWdlcyBmcm9tIGEgcHJvY2VzcycgbWFw
cGluZyBhdCB0aGlzIHRpbWUKKyAqLworCQkJCWlmIChwdGVfdGVzdCgmdHB0ZSwgUFRFX1cpKSB7
CisJCQkJCWFsbGZyZWUgPSAwOworCQkJCQljb250aW51ZTsKKwkJCQl9CisKKwkJCQlwYSA9IFRM
QkxPX1BURV9UT19QQSh0cHRlKTsKKwkJCQlpZiAoc3VwZXJwYWdlKQorCQkJCQlwYSAmPSB+UERS
TUFTSzsKKwkJCQltID0gUEhZU19UT19WTV9QQUdFKHBhKTsKKwkJCQlLQVNTRVJUKG0tPnBoeXNf
YWRkciA9PSBwYSwKKwkJCQkgICAgKCIlczogdm1fcGFnZV90ICVwIHBoeXNfYWRkciBtaXNtYXRj
aCAiCisJCQkJICAgICIlMDE2anggJTAxNmp4IiwgX19mdW5jX18sIG0sCisJCQkJICAgICh1aW50
bWF4X3QpbS0+cGh5c19hZGRyLCAodWludG1heF90KXRwdGUpKTsKKworCQkJCUtBU1NFUlQoKG0t
PmZsYWdzICYgUEdfRklDVElUSU9VUykgIT0gMCB8fAorCQkJCSAgICBtIDwgJnZtX3BhZ2VfYXJy
YXlbdm1fcGFnZV9hcnJheV9zaXplXSwKKwkJCQkgICAgKCIlczogYmFkIHRwdGUgJSNqeCIsIF9f
ZnVuY19fLAorCQkJCSAgICAodWludG1heF90KXRwdGUpKTsKKworCQkJCS8qIENsZWFyIFBURSAq
LworCQkJCWlmIChzdXBlcnBhZ2UpCisJCQkJCXB0ZV9zdG9yZShwdGUsIDApOworCQkJCWVsc2UK
KwkJCQkJcHRlX3N0b3JlKHB0ZSwgaXNfa2VybmVsX3BtYXAocG1hcCkgPworCQkJCQkgICAgUFRF
X0cgOiAwKTsKKworCQkJCS8qCisJCQkJICogVXBkYXRlIHRoZSB2bV9wYWdlX3QgY2xlYW4gYW5k
IHJlZmVyZW5jZSBiaXRzCisJCQkJICovCisJCQkJaWYgKHB0ZV90ZXN0KCZ0cHRlLCBQVEVfRCkg
JiYKKwkJCQkgICAgIXB0ZV90ZXN0KCZ0cHRlLCBQVEVfUk8pKSB7CisJCQkJCWlmIChzdXBlcnBh
Z2UpIHsKKwkJCQkJCXZtX3BhZ2VfdCBtdDsKKworCQkJCQkJZm9yIChtdCA9IG07IG10IDwgJm1b
TkJQRFIgLyBQQUdFX1NJWkVdOyBtdCsrKQorCQkJCQkJCXZtX3BhZ2VfZGlydHkobXQpOworCQkJ
CQl9IGVsc2UKKwkJCQkJCXZtX3BhZ2VfZGlydHkobSk7CisJCQkJfQorCisJCQkJQ0hBTkdFX1BW
X0xJU1RfTE9DS19UT19WTV9QQUdFKCZsb2NrLCBtKTsKKworCQkJCS8qIE1hcmsgZnJlZSAqLwor
CQkJCXBjLT5wY19tYXBbZmllbGRdIHw9IGJpdG1hc2s7CisJCQkJaWYgKHN1cGVycGFnZSkgewor
CQkJCQlwbWFwX3Jlc2lkZW50X2NvdW50X2RlYyhwbWFwLCBOQlBEUiAvIFBBR0VfU0laRSk7CisJ
CQkJCXB2aCA9IHBhX3RvX3B2aChUTEJMT19QVEVfVE9fUEEodHB0ZSkpOworCQkJCQlUQUlMUV9S
RU1PVkUoJnB2aC0+cHZfbGlzdCwgcHYsIHB2X25leHQpOworCQkJCQlwdmgtPnB2X2dlbisrOwor
CQkJCQlpZiAoVEFJTFFfRU1QVFkoJnB2aC0+cHZfbGlzdCkpIHsKKwkJCQkJCWZvciAobXQgPSBt
OyBtdCA8ICZtW05CUERSIC8gUEFHRV9TSVpFXTsgbXQrKykKKwkJCQkJCQlpZiAoVEFJTFFfRU1Q
VFkoJm10LT5tZC5wdl9saXN0KSkKKwkJCQkJCQkJdm1fcGFnZV9hZmxhZ19jbGVhcihtdCwgUEdB
X1dSSVRFQUJMRSk7CisJCQkJCX0KKwkJCQkJbXB0ZSA9IHBtYXBfbG9va3VwX3B0X3BhZ2UocG1h
cCwgcHYtPnB2X3ZhKTsKKwkJCQkJaWYgKG1wdGUgIT0gTlVMTCkgeworCQkJCQkJcG1hcF9yZW1v
dmVfcHRfcGFnZShwbWFwLCBtcHRlKTsKKwkJCQkJCXBtYXBfcmVzaWRlbnRfY291bnRfZGVjKHBt
YXAsIDEpOworCQkJCQkJS0FTU0VSVChtcHRlLT53aXJlX2NvdW50ID09IE5QVEVQRywKKwkJCQkJ
CSAgICAoIiVzOiBwdGUgcGFnZSB3aXJlIGNvdW50IGVycm9yIiwKKwkJCQkJCSAgICBfX2Z1bmNf
XykpOworCQkJCQkJbXB0ZS0+d2lyZV9jb3VudCA9IDA7CisJCQkJCQlwbWFwX2FkZF9kZWxheWVk
X2ZyZWVfbGlzdChtcHRlLCAmZnJlZSwgRkFMU0UpOworCQkJCQkJYXRvbWljX3N1YnRyYWN0X2lu
dCgmdm1fY250LnZfd2lyZV9jb3VudCwgMSk7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlw
bWFwX3Jlc2lkZW50X2NvdW50X2RlYyhwbWFwLCAxKTsKKwkJCQkJVEFJTFFfUkVNT1ZFKCZtLT5t
ZC5wdl9saXN0LCBwdiwgcHZfbmV4dCk7CisJCQkJCW0tPm1kLnB2X2dlbisrOworCQkJCQlpZiAo
KG0tPmFmbGFncyAmIFBHQV9XUklURUFCTEUpICE9IDAgJiYKKwkJCQkJICAgIFRBSUxRX0VNUFRZ
KCZtLT5tZC5wdl9saXN0KSAmJgorCQkJCQkgICAgKG0tPmZsYWdzICYgUEdfRklDVElUSU9VUykg
PT0gMCkgeworCQkJCQkJcHZoID0gcGFfdG9fcHZoKFZNX1BBR0VfVE9fUEhZUyhtKSk7CisJCQkJ
CQlpZiAoVEFJTFFfRU1QVFkoJnB2aC0+cHZfbGlzdCkpCisJCQkJCQkJdm1fcGFnZV9hZmxhZ19j
bGVhcihtLCBQR0FfV1JJVEVBQkxFKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlwbWFwX3VudXNlX3B0
KHBtYXAsIHB2LT5wdl92YSwgcHRlcGRlLCAmZnJlZSk7CisJCQkJZnJlZWQrKzsKKwkJCX0KKwkJ
fQorCQlQVl9TVEFUKGF0b21pY19hZGRfbG9uZygmcHZfZW50cnlfZnJlZXMsIGZyZWVkKSk7CisJ
CVBWX1NUQVQoYXRvbWljX2FkZF9pbnQoJnB2X2VudHJ5X3NwYXJlLCBmcmVlZCkpOworCQlQVl9T
VEFUKGF0b21pY19zdWJ0cmFjdF9sb25nKCZwdl9lbnRyeV9jb3VudCwgZnJlZWQpKTsKKwkJaWYg
KGFsbGZyZWUpIHsKKwkJCVRBSUxRX1JFTU9WRSgmcG1hcC0+cG1fcHZjaHVuaywgcGMsIHBjX2xp
c3QpOworCQkJZnJlZV9wdl9jaHVuayhwYyk7CisJCX0KKwl9CisJaWYgKGxvY2sgIT0gTlVMTCkK
KwkJcndfd3VubG9jayhsb2NrKTsKKwlwbWFwX2ludmFsaWRhdGVfYWxsKHBtYXApOworCVBNQVBf
VU5MT0NLKHBtYXApOworCXJ3X3J1bmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJcG1hcF9mcmVl
X3plcm9fcGFnZXMoJmZyZWUpOworfQorCisvKgorICogQ2xlYXIgdGhlIHdyaXRlIGFuZCBtb2Rp
ZmllZCBiaXRzIGluIGVhY2ggb2YgdGhlIGdpdmVuIHBhZ2UncyBtYXBwaW5ncy4KKyAqLwordm9p
ZAorcG1hcF9yZW1vdmVfd3JpdGUodm1fcGFnZV90IG0pCit7CisJc3RydWN0IG1kX3BhZ2UgKnB2
aDsKKwl2bV9vZmZzZXRfdCB2YTsKKwlwdl9lbnRyeV90IG5leHRfcHY7CisJaW50IHB2aF9nZW47
CisJcG1hcF90IHBtYXA7CisJc3RydWN0IHJ3bG9jayAqbG9jazsKKwlwZF9lbnRyeV90ICpwZGU7
CisJcHRfZW50cnlfdCBvbGRwdGUsICpwdGU7CisJcHZfZW50cnlfdCBwdjsKKwlpbnQgbWRfZ2Vu
OworCisJS0FTU0VSVCgobS0+b2ZsYWdzICYgVlBPX1VOTUFOQUdFRCkgPT0gMCwKKwkgICAgKCJw
bWFwX3JlbW92ZV93cml0ZTogcGFnZSAlcCBpcyBub3QgbWFuYWdlZCIsIG0pKTsKKworCS8qCisJ
ICogSWYgdGhlIHBhZ2UgaXMgbm90IGV4Y2x1c2l2ZSBidXNpZWQsIHRoZW4gUEdBX1dSSVRFQUJM
RSBjYW5ub3QgYmUKKwkgKiBzZXQgYnkgYW5vdGhlciB0aHJlYWQgd2hpbGUgdGhlIG9iamVjdCBp
cyBsb2NrZWQuICBUaHVzLAorCSAqIGlmIFBHQV9XUklURUFCTEUgaXMgY2xlYXIsIG5vIHBhZ2Ug
dGFibGUgZW50cmllcyBuZWVkIHVwZGF0aW5nLgorCSAqLworCVZNX09CSkVDVF9BU1NFUlRfV0xP
Q0tFRChtLT5vYmplY3QpOworCWlmICghdm1fcGFnZV94YnVzaWVkKG0pICYmIChtLT5hZmxhZ3Mg
JiBQR0FfV1JJVEVBQkxFKSA9PSAwKQorCQlyZXR1cm47CisJcndfcmxvY2soJnB2aF9nbG9iYWxf
bG9jayk7CisJbG9jayA9IFZNX1BBR0VfVE9fUFZfTElTVF9MT0NLKG0pOworCXB2aCA9IHBhX3Rv
X3B2aChWTV9QQUdFX1RPX1BIWVMobSkpOworcmV0cnlfcHZfbG9vcDoKKwlyd193bG9jayhsb2Nr
KTsKKwlpZiAoKG0tPmZsYWdzICYgUEdfRklDVElUSU9VUykgIT0gMCkKKwkJZ290byBzbWFsbF9t
YXBwaW5nczsKKwlUQUlMUV9GT1JFQUNIX1NBRkUocHYsICZwdmgtPnB2X2xpc3QsIHB2X25leHQs
IG5leHRfcHYpIHsKKwkJcG1hcCA9IFBWX1BNQVAocHYpOworCQlpZiAoIVBNQVBfVFJZTE9DSyhw
bWFwKSkgeworCQkJcHZoX2dlbiA9IHB2aC0+cHZfZ2VuOworCQkJcndfd3VubG9jayhsb2NrKTsK
KwkJCVBNQVBfTE9DSyhwbWFwKTsKKwkJCXJ3X3dsb2NrKGxvY2spOworCQkJaWYgKHB2aF9nZW4g
IT0gcHZoLT5wdl9nZW4pIHsKKwkJCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwkJCQlyd193dW5sb2Nr
KGxvY2spOworCQkJCWdvdG8gcmV0cnlfcHZfbG9vcDsKKwkJCX0KKwkJfQorCQl2YSA9IHB2LT5w
dl92YTsKKwkJcGRlID0gcG1hcF9wZGUocG1hcCwgdmEpOworCQlpZiAocGRlX2lzXzFtX3N1cGVy
cGFnZShwZGUpICYmICFwZGVfdGVzdChwZGUsIFBURV9STykpCisJCQkodm9pZClwbWFwX2RlbW90
ZV9wZGVfbG9ja2VkKHBtYXAsIHBkZSwgdmEsICZsb2NrKTsKKwkJS0FTU0VSVChsb2NrID09IFZN
X1BBR0VfVE9fUFZfTElTVF9MT0NLKG0pLAorCQkgICAgKCJpbmNvbnNpc3RlbnQgcHYgbG9jayAl
cCAlcCBmb3IgcGFnZSAlcCIsCisJCSAgICBsb2NrLCBWTV9QQUdFX1RPX1BWX0xJU1RfTE9DSyht
KSwgbSkpOworCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwl9CitzbWFsbF9tYXBwaW5nczoKKwlUQUlM
UV9GT1JFQUNIKHB2LCAmbS0+bWQucHZfbGlzdCwgcHZfbmV4dCkgeworCQlwbWFwID0gUFZfUE1B
UChwdik7CisJCWlmICghUE1BUF9UUllMT0NLKHBtYXApKSB7CisJCQlwdmhfZ2VuID0gcHZoLT5w
dl9nZW47CisJCQltZF9nZW4gPSBtLT5tZC5wdl9nZW47CisJCQlyd193dW5sb2NrKGxvY2spOwor
CQkJUE1BUF9MT0NLKHBtYXApOworCQkJcndfd2xvY2sobG9jayk7CisJCQlpZiAocHZoX2dlbiAh
PSBwdmgtPnB2X2dlbiB8fAorCQkJICAgIG1kX2dlbiAhPSBtLT5tZC5wdl9nZW4pIHsKKwkJCQlQ
TUFQX1VOTE9DSyhwbWFwKTsKKwkJCQlyd193dW5sb2NrKGxvY2spOworCQkJCWdvdG8gcmV0cnlf
cHZfbG9vcDsKKwkJCX0KKwkJfQorCQlwZGUgPSBwbWFwX3BkZShwbWFwLCBwdi0+cHZfdmEpOwor
CQlLQVNTRVJUKCFwZGVfaXNfc3VwZXJwYWdlKHBkZSksCisJCSAgICAoIiVzOiBmb3VuZCBhIHN1
cGVycGFnZSBpbiBwYWdlICVwJ3MgcHYgbGlzdCIsCisJCSAgICBfX2Z1bmNfXywgbSkpOworCQlw
dGUgPSBwbWFwX3BkZV90b19wdGUocGRlLCBwdi0+cHZfdmEpOworCQlLQVNTRVJUKHB0ZSAhPSBO
VUxMICYmIHB0ZV9pc192YWxpZChwdGUpLAorCQkgICAgKCIlczpwYWdlIG9uIHB2X2xpc3QgaGFz
IG5vIHB0ZSIsIF9fZnVuY19fKSk7CityZXRyeToKKwkJb2xkcHRlID0gKnB0ZTsKKwkJaWYgKCFw
dGVfdGVzdCgmb2xkcHRlLCBQVEVfUk8pKSB7CisJCQlpZiAoIWF0b21pY19jbXBzZXRfbG9uZyhw
dGUsIG9sZHB0ZSwKKwkJCSAgICAoKG9sZHB0ZSAmIH5QVEVfRCkgfCBQVEVfUk8pKSkKKwkJCQln
b3RvIHJldHJ5OworCQkJaWYgKHB0ZV90ZXN0KCZvbGRwdGUsIFBURV9EKSkKKwkJCQl2bV9wYWdl
X2RpcnR5KG0pOworCQkJcG1hcF9pbnZhbGlkYXRlX3BhZ2UocG1hcCwgcHYtPnB2X3ZhKTsKKwkJ
fQorCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwl9CisJdm1fcGFnZV9hZmxhZ19jbGVhcihtLCBQR0Ff
V1JJVEVBQkxFKTsKKwlyd193dW5sb2NrKGxvY2spOworCXJ3X3J1bmxvY2soJnB2aF9nbG9iYWxf
bG9jayk7Cit9CisKKyNkZWZpbmUJUE1BUF9UU19SRUZFUkVOQ0VEX01BWAk1CisKKy8qLQorICoJ
cG1hcF90c19yZWZlcmVuY2VkOgorICoKKyAqICBSZXR1cm4gYSBjb3VudCBvZiBwYWdlcyB0aGF0
IGhhdmUgYmVlbiByZWZlcmVuY2VkLCBhbmQgcmVzZXQgdGhlCisgKiAgcmVmZXJlbmNlIGJpdC4g
IEl0IGlzIG5vdCBuZWNlc3NhcnkgZm9yIGV2ZXJ5IHJlZmVyZW5jZSBiaXQgdG8gYmUKKyAqICBy
ZXNldCwgYnV0IGl0IGlzIG5lY2Vzc2FyeSB0aGF0IDAgb25seSBiZSByZXR1cm5lZCB3aGVuIHRo
ZXJlIGFyZQorICogIHRydWx5IGhhdmUgYmVlbiBwYWdlcyByZWZlcmVuY2VkLgorICoKKyAqICBY
WFg6IFRoZSBleGFjdCBudW1iZXIgb2YgZmxhZ3MgdG8gY2hlY2sgYW5kIHJlc2V0IGlzIGEgbWF0
dGVyIHRoYXQKKyAqICBzaG91bGQgYmUgdGVzdGVkIGFuZCBzdGFuZGFyZGl6ZWQgYXQgc29tZSBw
b2ludCBpbiB0aGUgZnV0dXJlIGZvcgorICogIG9wdGltYWwgYWdpbmcgb2Ygc2hhcmVkIHBhZ2Vz
LgorICovCitpbnQKK3BtYXBfdHNfcmVmZXJlbmNlZCh2bV9wYWdlX3QgbSkKK3sKKwlzdHJ1Y3Qg
bWRfcGFnZSAqcHZoOworCXB2X2VudHJ5X3QgcHYsIHB2ZjsKKwlwbWFwX3QgcG1hcDsKKwlzdHJ1
Y3Qgcndsb2NrICpsb2NrOworCXBkX2VudHJ5X3QgKnBkZTsKKwlwdF9lbnRyeV90ICpwdGU7CisJ
dm1fb2Zmc2V0X3QgdmE7CisJdm1fcGFkZHJfdCBwYTsKKwlpbnQgY2xlYXJlZCwgbWRfZ2VuLCBu
b3RfY2xlYXJlZCwgcHZoX2dlbjsKKworCUtBU1NFUlQoKG0tPm9mbGFncyAmIFZQT19VTk1BTkFH
RUQpID09IDAsCisJICAgICgicG1hcF90c19yZWZlcmVuY2VkOiBwYWdlICVwIGlzIG5vdCBtYW5h
Z2VkIiwgbSkpOworCWNsZWFyZWQgPSAwOworCXBhID0gVk1fUEFHRV9UT19QSFlTKG0pOworCWxv
Y2sgPSBQSFlTX1RPX1BWX0xJU1RfTE9DSyhwYSk7CisJcHZoID0gcGFfdG9fcHZoKHBhKTsKKwly
d19ybG9jaygmcHZoX2dsb2JhbF9sb2NrKTsKKwlyd193bG9jayhsb2NrKTsKK3JldHJ5OgorCW5v
dF9jbGVhcmVkID0gMDsKKwlpZiAoKG0tPmZsYWdzICYgUEdfRklDVElUSU9VUykgIT0gMCB8fAor
CSAgICAocHZmID0gVEFJTFFfRklSU1QoJnB2aC0+cHZfbGlzdCkpID09IE5VTEwpCisJCWdvdG8g
c21hbGxfbWFwcGluZ3M7CisJcHYgPSBwdmY7CisJZG8geworCQlpZiAocHZmID09IE5VTEwpCisJ
CQlwdmYgPSBwdjsKKwkJcG1hcCA9IFBWX1BNQVAocHYpOworCQlpZiAoIVBNQVBfVFJZTE9DSyhw
bWFwKSkgeworCQkJcHZoX2dlbiA9IHB2aC0+cHZfZ2VuOworCQkJcndfd3VubG9jayhsb2NrKTsK
KwkJCVBNQVBfTE9DSyhwbWFwKTsKKwkJCXJ3X3dsb2NrKGxvY2spOworCQkJaWYgKHB2aF9nZW4g
IT0gcHZoLT5wdl9nZW4pIHsKKwkJCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwkJCQlnb3RvIHJldHJ5
OworCQkJfQorCQl9CisJCXZhID0gcHYtPnB2X3ZhOworCQlwZGUgPSBwbWFwX3BkZShwbWFwLCBw
di0+cHZfdmEpOworCQlpZiAocHRlX2lzX3JlZigocHRfZW50cnlfdCAqKXBkZSkpIHsKKwkJCS8q
CisJCQkgKiBTaW5jZSB0aGlzIHJlZmVyZW5jZSBiaXQgaXMgc2hhcmVkIGJ5IDUxMiA0S0IKKwkJ
CSAqIHBhZ2VzLCBpdCBzaG91bGQgbm90IGJlIGNsZWFyZWQgZXZlcnkgdGltZSBpdCBpcworCQkJ
ICogdGVzdGVkLiAgQXBwbHkgYSBzaW1wbGUgImhhc2giIGZ1bmN0aW9uIG9uIHRoZQorCQkJICog
cGh5c2ljYWwgcGFnZSBudW1iZXIsIHRoZSB2aXJ0dWFsIHN1cGVycGFnZSBudW1iZXIsCisJCQkg
KiBhbmQgdGhlIHBtYXAgYWRkcmVzcyB0byBzZWxlY3Qgb25lIDRLQiBwYWdlIG91dCBvZgorCQkJ
ICogdGhlIDUxMiBvbiB3aGljaCB0ZXN0aW5nIHRoZSByZWZlcmVuY2UgYml0IHdpbGwKKwkJCSAq
IHJlc3VsdCBpbiBjbGVhcmluZyB0aGF0IHJlZmVyZW5jZSBiaXQuICBUaGlzCisJCQkgKiBmdW5j
dGlvbiBpcyBkZXNpZ25lZCB0byBhdm9pZCB0aGUgc2VsZWN0aW9uIG9mIHRoZQorCQkJICogc2Ft
ZSA0S0IgcGFnZSBmb3IgZXZlcnkgMk1CIHBhZ2UgbWFwcGluZy4KKwkJCSAqCisJCQkgKiBPbiBk
ZW1vdGlvbiwgYSBtYXBwaW5nIHRoYXQgaGFzbid0IGJlZW4gcmVmZXJlbmNlZAorCQkJICogaXMg
c2ltcGx5IGRlc3Ryb3llZC4gIFRvIGF2b2lkIHRoZSBwb3NzaWJpbGl0eSBvZiBhCisJCQkgKiBz
dWJzZXF1ZW50IHBhZ2UgZmF1bHQgb24gYSBkZW1vdGVkIHdpcmVkIG1hcHBpbmcsCisJCQkgKiBh
bHdheXMgbGVhdmUgaXRzIHJlZmVyZW5jZSBiaXQgc2V0LiAgTW9yZW92ZXIsCisJCQkgKiBzaW5j
ZSB0aGUgc3VwZXJwYWdlIGlzIHdpcmVkLCB0aGUgY3VycmVudCBzdGF0ZSBvZgorCQkJICogaXRz
IHJlZmVyZW5jZSBiaXQgd29uJ3QgYWZmZWN0IHBhZ2UgcmVwbGFjZW1lbnQuCisJCQkgKi8KKwkJ
CWlmICgoKChwYSA+PiBQQUdFX1NISUZUKSBeIChwdi0+cHZfdmEgPj4gUERSU0hJRlQpIF4KKwkJ
CSAgICAodWludHB0cl90KXBtYXApICYgKE5QVEVQRyAtIDEpKSA9PSAwICYmCisJCQkgICAgIXBk
ZV90ZXN0KHBkZSwgUFRFX1cpKSB7CisJCQkJYXRvbWljX2NsZWFyX2xvbmcoKHB0X2VudHJ5X3Qg
KilwZGUsIFBURV9SRUYpOworCQkJCXBtYXBfaW52YWxpZGF0ZV9wYWdlKHBtYXAsIHB2LT5wdl92
YSk7CisJCQkJY2xlYXJlZCsrOworCQkJfSBlbHNlCisJCQkJbm90X2NsZWFyZWQrKzsKKworCQl9
CisJCVBNQVBfVU5MT0NLKHBtYXApOworCQkvKiBSb3RhdGUgdGhlIFBWIGxpc3QgaWYgaXQgaGFz
IG1vcmUgdGhhbiBvbmUgZW50cnkuICovCisJCWlmIChwdiAhPSBOVUxMICYmIFRBSUxRX05FWFQo
cHYsIHB2X25leHQpICE9IE5VTEwpIHsKKwkJCVRBSUxRX1JFTU9WRSgmcHZoLT5wdl9saXN0LCBw
diwgcHZfbmV4dCk7CisJCQlUQUlMUV9JTlNFUlRfVEFJTCgmcHZoLT5wdl9saXN0LCBwdiwgcHZf
bmV4dCk7CisJCX0KKwkJaWYgKChjbGVhcmVkICsgbm90X2NsZWFyZWQpID49IFBNQVBfVFNfUkVG
RVJFTkNFRF9NQVgpCisJCQlnb3RvIG91dDsKKwl9IHdoaWxlICgocHYgPSBUQUlMUV9GSVJTVCgm
cHZoLT5wdl9saXN0KSkgIT0gcHZmKTsKK3NtYWxsX21hcHBpbmdzOgorCWlmICgocHZmID0gVEFJ
TFFfRklSU1QoJm0tPm1kLnB2X2xpc3QpKSA9PSBOVUxMKQorCQlnb3RvIG91dDsKKwlwdiA9IHB2
ZjsKKwlkbyB7CisJCWlmIChwdmYgPT0gTlVMTCkKKwkJCXB2ZiA9IHB2OworCQlwbWFwID0gUFZf
UE1BUChwdik7CisJCWlmICghUE1BUF9UUllMT0NLKHBtYXApKSB7CisJCQlwdmhfZ2VuID0gcHZo
LT5wdl9nZW47CisJCQltZF9nZW4gPSBtLT5tZC5wdl9nZW47CisJCQlyd193dW5sb2NrKGxvY2sp
OworCQkJUE1BUF9MT0NLKHBtYXApOworCQkJcndfd2xvY2sobG9jayk7CisJCQlpZiAoCisJCQkg
ICAgcHZoX2dlbiAhPSBwdmgtPnB2X2dlbiB8fAorCQkJICAgIG1kX2dlbiAhPSBtLT5tZC5wdl9n
ZW4pIHsKKwkJCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwkJCQlnb3RvIHJldHJ5OworCQkJfQorCQl9
CisKKwkJcGRlID0gcG1hcF9wZGUocG1hcCwgcHYtPnB2X3ZhKTsKKwkJS0FTU0VSVCghcGRlX2lz
X3N1cGVycGFnZShwZGUpLAorCQkgICAgKCJwbWFwX3RzX3JlZmVyZW5jZWQ6IGZvdW5kIHN1cGVy
cGFnZSBpbiBwYWdlICVwJ3MgcHYgbGlzdCIsCisJCSAgICBtKSk7CisJCXB0ZSA9IHBtYXBfcGRl
X3RvX3B0ZShwZGUsIHB2LT5wdl92YSk7CisJCWlmIChwdGVfaXNfcmVmKHB0ZSkpIHsKKwkJCWF0
b21pY19jbGVhcl9sb25nKChwdF9lbnRyeV90ICopcGRlLCBQVEVfUkVGKTsKKwkJCXBtYXBfaW52
YWxpZGF0ZV9wYWdlKHBtYXAsIHB2LT5wdl92YSk7CisJCQljbGVhcmVkKys7CisJCX0KKwkJUE1B
UF9VTkxPQ0socG1hcCk7CisJCS8qIFJvdGF0ZSB0aGUgUFYgbGlzdCBpZiBpdCBoYXMgbW9yZSB0
aGFuIG9uZSBlbnRyeS4gKi8KKwkJaWYgKHB2ICE9IE5VTEwgJiYgVEFJTFFfTkVYVChwdiwgcHZf
bmV4dCkgIT0gTlVMTCkgeworCQkJVEFJTFFfUkVNT1ZFKCZtLT5tZC5wdl9saXN0LCBwdiwgcHZf
bmV4dCk7CisJCQlUQUlMUV9JTlNFUlRfVEFJTCgmbS0+bWQucHZfbGlzdCwgcHYsIHB2X25leHQp
OworCQkJbS0+bWQucHZfZ2VuKys7CisJCX0KKwl9IHdoaWxlICgocHYgPSBUQUlMUV9GSVJTVCgm
bS0+bWQucHZfbGlzdCkpICE9IHB2ZiAmJiBjbGVhcmVkICsKKwkgICAgbm90X2NsZWFyZWQgPCBQ
TUFQX1RTX1JFRkVSRU5DRURfTUFYKTsKK291dDoKKwlyd193dW5sb2NrKGxvY2spOworCXJ3X3J1
bmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJcmV0dXJuIChjbGVhcmVkICsgbm90X2NsZWFyZWQp
OworfQorCitzdGF0aWMgYm9vbGVhbl90CitwbWFwX3BhZ2VfdGVzdF9tYXBwaW5ncyh2bV9wYWdl
X3QgbSwgYm9vbGVhbl90IGFjY2Vzc2VkLCBib29sZWFuX3QgbW9kaWZpZWQpCit7CisJc3RydWN0
IHJ3bG9jayAqbG9jazsKKwlwdl9lbnRyeV90IHB2OworCXN0cnVjdCBtZF9wYWdlICpwdmg7CisJ
cHRfZW50cnlfdCAqcHRlOworCXBtYXBfdCBwbWFwOworCWludCBtZF9nZW4sIHB2aF9nZW47CisJ
Ym9vbGVhbl90IHJ2OworCisJcnYgPSBGQUxTRTsKKwlyd19ybG9jaygmcHZoX2dsb2JhbF9sb2Nr
KTsKKwlsb2NrID0gVk1fUEFHRV9UT19QVl9MSVNUX0xPQ0sobSk7CisJcndfcmxvY2sobG9jayk7
CityZXN0YXJ0OgorCVRBSUxRX0ZPUkVBQ0gocHYsICZtLT5tZC5wdl9saXN0LCBwdl9uZXh0KSB7
CisJCXBtYXAgPSBQVl9QTUFQKHB2KTsKKwkJaWYgKCFQTUFQX1RSWUxPQ0socG1hcCkpIHsKKwkJ
CSBtZF9nZW4gPSBtLT5tZC5wdl9nZW47CisJCQkgcndfcnVubG9jayhsb2NrKTsKKwkJCSBQTUFQ
X0xPQ0socG1hcCk7CisJCQkgcndfcmxvY2sobG9jayk7CisJCQkgaWYgKG1kX2dlbiAhPSBtLT5t
ZC5wdl9nZW4pIHsKKwkJCQkgUE1BUF9VTkxPQ0socG1hcCk7CisJCQkJIGdvdG8gcmVzdGFydDsK
KwkJCSB9CisJCX0KKwkJcHRlID0gcG1hcF9wdGUocG1hcCwgcHYtPnB2X3ZhKTsKKwkJaWYgKG1v
ZGlmaWVkKSB7CisJCQlydiA9IHB0ZV90ZXN0KHB0ZSwgUFRFX0QpICYmICFwdGVfdGVzdChwdGUs
IFBURV9STyk7CisJCQlpZiAoYWNjZXNzZWQpCisJCQkJcnYgPSBydiAmJiBwdGVfaXNfdmFsaWQo
cHRlKSAmJiBwdGVfaXNfcmVmKHB0ZSk7CisJCX0gZWxzZSBpZiAoYWNjZXNzZWQpIHsKKwkJCXJ2
ID0gcHRlX2lzX3ZhbGlkKHB0ZSkgJiYgcHRlX2lzX3JlZihwdGUpOworCQl9CisJCVBNQVBfVU5M
T0NLKHBtYXApOworCQlpZiAocnYpCisJCQlnb3RvIG91dDsKKwl9CisJaWYgKChtLT5mbGFncyAm
IFBHX0ZJQ1RJVElPVVMpID09IDApIHsKKwkJcHZoID0gcGFfdG9fcHZoKFZNX1BBR0VfVE9fUEhZ
UyhtKSk7CisJCVRBSUxRX0ZPUkVBQ0gocHYsICZwdmgtPnB2X2xpc3QsIHB2X25leHQpIHsKKwkJ
CXBtYXAgPSBQVl9QTUFQKHB2KTsKKwkJCWlmICghUE1BUF9UUllMT0NLKHBtYXApKSB7CisJCQkJ
bWRfZ2VuID0gbS0+bWQucHZfZ2VuOworCQkJCXB2aF9nZW4gPSBwdmgtPnB2X2dlbjsKKwkJCQly
d19ydW5sb2NrKGxvY2spOworCQkJCVBNQVBfTE9DSyhwbWFwKTsKKwkJCQlyd19ybG9jayhsb2Nr
KTsKKwkJCQlpZiAobWRfZ2VuICE9IG0tPm1kLnB2X2dlbiB8fAorCQkJCSAgICBwdmhfZ2VuICE9
IHB2aC0+cHZfZ2VuKSB7CisJCQkJCVBNQVBfVU5MT0NLKHBtYXApOworCQkJCQlnb3RvIHJlc3Rh
cnQ7CisJCQkJfQorCQkJfQorCQkJcHRlID0gKHB0X2VudHJ5X3QgKilwbWFwX3BkZShwbWFwLCBw
di0+cHZfdmEpOworCQkJaWYgKG1vZGlmaWVkKSB7CisJCQkJcnYgPSBwdGVfdGVzdChwdGUsIFBU
RV9EKSAmJgorCQkJCSAgICAhcHRlX3Rlc3QocHRlLCBQVEVfUk8pOworCQkJCWlmIChhY2Nlc3Nl
ZCkKKwkJCQkJcnYgPSBydiAmJiBwdGVfaXNfdmFsaWQocHRlKSAmJgorCQkJCQkgICAgcHRlX2lz
X3JlZihwdGUpOworCQkJfSBlbHNlIGlmIChhY2Nlc3NlZCkgeworCQkJCXJ2ID0gcHRlX2lzX3Zh
bGlkKHB0ZSkgJiYKKwkJCQkgICAgcHRlX2lzX3JlZihwdGUpOworCQkJfQorCQkJUE1BUF9VTkxP
Q0socG1hcCk7CisJCQlpZiAocnYpCisJCQkJZ290byBvdXQ7CisJCX0KKwl9CitvdXQ6CisJcndf
cnVubG9jayhsb2NrKTsKKwlyd19ydW5sb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCXJldHVybiAo
cnYpOworfQorCisKKy8qCisgKglwbWFwX2lzX21vZGlmaWVkOgorICoKKyAqCVJldHVybiB3aGV0
aGVyIG9yIG5vdCB0aGUgc3BlY2lmaWVkIHBoeXNpY2FsIHBhZ2Ugd2FzIG1vZGlmaWVkCisgKglp
biBhbnkgcGh5c2ljYWwgbWFwcy4KKyAqLworYm9vbGVhbl90CitwbWFwX2lzX21vZGlmaWVkKHZt
X3BhZ2VfdCBtKQoreworCisJS0FTU0VSVCgobS0+b2ZsYWdzICYgVlBPX1VOTUFOQUdFRCkgPT0g
MCwKKwkgICAgKCJwbWFwX2lzX21vZGlmaWVkOiBwYWdlICVwIGlzIG5vdCBtYW5hZ2VkIiwgbSkp
OworCisJLyoKKwkgKiBJZiB0aGUgcGFnZSBpcyBub3QgZXhjbHVzaXZlIGJ1c2llZCwgdGhlbiBQ
R0FfV1JJVEVBQkxFIGNhbm5vdCBiZQorCSAqIGNvbmN1cnJlbnRseSBzZXQgd2hpbGUgdGhlIG9i
amVjdCBpcyBsb2NrZWQuICBUaHVzLCBpZiBQR0FfV1JJVEVBQkxFCisJICogaXMgY2xlYXIsIG5v
IFBURXMgY2FuIGhhdmUgUFRFX0Qgc2V0LgorCSAqLworCVZNX09CSkVDVF9BU1NFUlRfV0xPQ0tF
RChtLT5vYmplY3QpOworCWlmICghdm1fcGFnZV94YnVzaWVkKG0pICYmIChtLT5hZmxhZ3MgJiBQ
R0FfV1JJVEVBQkxFKSA9PSAwKQorCQlyZXR1cm4gKEZBTFNFKTsKKwlyZXR1cm4gKHBtYXBfcGFn
ZV90ZXN0X21hcHBpbmdzKG0sIEZBTFNFLCBUUlVFKSk7Cit9CisKKy8qCisgKglwbWFwX2lzX3By
ZWZhdWx0YWJsZToKKyAqCisgKglSZXR1cm4gd2hldGhlciBvciBub3QgdGhlIHNwZWNpZmllZCB2
aXJ0dWFsIGFkZHJlc3MgaXMgZWxnaWJsZQorICoJZm9yIHByZWZhdWx0LgorICovCitib29sZWFu
X3QKK3BtYXBfaXNfcHJlZmF1bHRhYmxlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCBhZGRyKQor
eworCXBkX2VudHJ5X3QgKnBkZTsKKwlwdF9lbnRyeV90ICpwdGU7CisJYm9vbGVhbl90IHJ2Owor
CisJcnYgPSBGQUxTRTsKKwlQTUFQX0xPQ0socG1hcCk7CisJcGRlID0gcG1hcF9wZGUocG1hcCwg
YWRkcik7CisJaWYgKHBkZSAhPSBOVUxMICYmICpwZGUgIT0gMCkgeworCQlpZiAocGRlX2lzXzFt
X3N1cGVycGFnZShwZGUpKQorCQkJcHRlID0gKHB0X2VudHJ5X3QgKilwZGU7CisJCWVsc2UKKwkJ
CXB0ZSA9IHBtYXBfcGRlX3RvX3B0ZShwZGUsIGFkZHIpOworCQlydiA9ICgqcHRlID09IDApIHx8
ICgqcHRlID09IFBURV9HKTsKKwl9CisJUE1BUF9VTkxPQ0socG1hcCk7CisJcmV0dXJuIChydik7
Cit9CisKKy8qCisgKglwbWFwX2lzX3JlZmVyZW5jZWQ6CisgKgorICoJUmV0dXJuIHdoZXRoZXIg
b3Igbm90IHRoZSBzcGVjaWZpZWQgcGh5c2ljYWwgcGFnZSB3YXMgcmVmZXJlbmNlZAorICoJaW4g
YW55IHBoeXNpY2FsIG1hcHMuCisgKi8KK2Jvb2xlYW5fdAorcG1hcF9pc19yZWZlcmVuY2VkKHZt
X3BhZ2VfdCBtKQoreworCisJS0FTU0VSVCgobS0+b2ZsYWdzICYgVlBPX1VOTUFOQUdFRCkgPT0g
MCwKKwkgICAgKCJwbWFwX2lzX3JlZmVyZW5jZWQ6IHBhZ2UgJXAgaXMgbm90IG1hbmFnZWQiLCBt
KSk7CisJcmV0dXJuIChwbWFwX3BhZ2VfdGVzdF9tYXBwaW5ncyhtLCBUUlVFLCBGQUxTRSkpOwor
fQorCisvKgorICoJQXBwbHkgdGhlIGdpdmVuIGFkdmljZSB0byB0aGUgc3BlY2lmaWVkIHJhbmdl
IG9mIGFkZHJlc3NlcyB3aXRoaW4gdGhlCisgKglnaXZlbiBwbWFwLiAgRGVwZW5kaW5nIG9uIHRo
ZSBhZHZpY2UsIGNsZWFyIHRoZSByZWZlcmVuY2VkIGFuZC9vcgorICoJbW9kaWZpZWQgZmxhZ3Mg
aW4gZWFjaCBtYXBwaW5nIGFuZCBzZXQgdGhlIG1hcHBlZCBwYWdlJ3MgZGlydHkgZmllbGQuCisg
Ki8KK3ZvaWQKK3BtYXBfYWR2aXNlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCBzdmEsIHZtX29m
ZnNldF90IGV2YSwgaW50IGFkdmljZSkKK3sKKwlzdHJ1Y3Qgcndsb2NrICpsb2NrOworCXBkX2Vu
dHJ5X3QgKnBkZSwgKnBkcGUsIG9sZHBkZTsKKwlwdF9lbnRyeV90ICpwdGU7CisJdm1fb2Zmc2V0
X3QgdmFfbmV4dDsKKwl2bV9wYWdlX3QgbTsKKwlib29sZWFuX3QgYW55Y2hhbmdlZCwgcHZfbGlz
dHNfbG9ja2VkOworCisJaWYgKGFkdmljZSAhPSBNQURWX0RPTlRORUVEICYmIGFkdmljZSAhPSBN
QURWX0ZSRUUpCisJCXJldHVybjsKKworCXB2X2xpc3RzX2xvY2tlZCA9IEZBTFNFOworcmVzdW1l
OgorCWFueWNoYW5nZWQgPSBGQUxTRTsKKwlQTUFQX0xPQ0socG1hcCk7CisJZm9yICg7IHN2YSA8
IGV2YTsgc3ZhID0gdmFfbmV4dCkgeworCQlwZHBlID0gcG1hcF9zZWdtYXAocG1hcCwgc3ZhKTsK
KwkJaWYgKCpwZHBlID09IDApIHsKKwkJCXZhX25leHQgPSAoc3ZhICsgTkJTRUcpICYgflNFR01B
U0s7CisJCQlpZiAodmFfbmV4dCA8IHN2YSkKKwkJCQl2YV9uZXh0ID0gZXZhOworCQkJY29udGlu
dWU7CisJCX0KKwkJdmFfbmV4dCA9IChzdmEgKyBOQlBEUikgJiB+UERSTUFTSzsKKwkJaWYgKHZh
X25leHQgPCBzdmEpCisJCQl2YV9uZXh0ID0gZXZhOworCisJCXBkZSA9IHBtYXBfcGRwZV90b19w
ZGUocGRwZSwgc3ZhKTsKKwkJb2xkcGRlID0gKnBkZTsKKwkJaWYgKHBkZSA9PSBOVUxMIHx8ICpw
ZGUgPT0gMCkKKwkJCWNvbnRpbnVlOworCQllbHNlIGlmIChwZGVfaXNfMW1fc3VwZXJwYWdlKHBk
ZSkpIHsKKwkJCWlmICghcGRlX3Rlc3QoJm9sZHBkZSwgUFRFX01BTkFHRUQpKQorCQkJCWNvbnRp
bnVlOworCQkJaWYgKCFwdl9saXN0c19sb2NrZWQpIHsKKwkJCQlwdl9saXN0c19sb2NrZWQgPSBU
UlVFOworCQkJCWlmICghcndfdHJ5X3Jsb2NrKCZwdmhfZ2xvYmFsX2xvY2spKSB7CisJCQkJCWlm
IChhbnljaGFuZ2VkKQorCQkJCQkJcG1hcF9pbnZhbGlkYXRlX2FsbChwbWFwKTsKKwkJCQkJUE1B
UF9VTkxPQ0socG1hcCk7CisJCQkJCXJ3X3Jsb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCQkJCQln
b3RvIHJlc3VtZTsKKwkJCQl9CisJCQl9CisJCQlsb2NrID0gTlVMTDsKKwkJCWlmICghcG1hcF9k
ZW1vdGVfcGRlX2xvY2tlZChwbWFwLCBwZGUsIHN2YSwgJmxvY2spKSB7CisJCQkJaWYgKGxvY2sg
IT0gTlVMTCkKKwkJCQkJcndfd3VubG9jayhsb2NrKTsKKworCQkJCS8qCisJCQkJICogVGhlIHN1
cGVycGFnZSBtYXBwaW5nIHdhcyBkZXN0cm95ZWQuCisJCQkJICovCisJCQkJY29udGludWU7CisJ
CQl9CisKKwkJCS8qCisJCQkgKiBVbmxlc3MgdGhlIHBhZ2UgbWFwcGluZ3MgYXJlIHdpcmVkLCBy
ZW1vdmUgdGhlCisJCQkgKiBtYXBwaW5nIHRvIGEgc2luZ2xlIHBhZ2Ugc28gdGhhdCBhIHN1YnNl
cXVlbnQKKwkJCSAqIGFjY2VzcyBtYXkgcmVwcm9tb3RlLiAgU2luY2UgdGhlIHVuZGVybHlpbmcg
cGFnZQorCQkJICogdGFibGUgcGFnZSBpcyBmdWxseSBwb3B1bGF0ZWQsIHRoaXMgcmVtb3ZhbCBu
ZXZlcgorCQkJICogZnJlZXMgYSBwYWdlIHRhYmxlIHBhZ2UuCisJCQkgKi8KKwkJCWlmICghcGRl
X3Rlc3QoJm9sZHBkZSwgUFRFX1cpKSB7CisJCQkJcHRlID0gcG1hcF9wZGVfdG9fcHRlKHBkZSwg
c3ZhKTsKKwkJCQlLQVNTRVJUKHB0ZV90ZXN0KHB0ZSwgUFRFX1ZBTElEKSwKKwkJCQkgICAgKCJw
bWFwX2FkdmlzZTogaW52YWxpZCBQVEUiKSk7CisJCQkJcG1hcF9yZW1vdmVfcHRlKHBtYXAsIHB0
ZSwgc3ZhLCAqcGRlLCBOVUxMLAorCQkJCSAgICAmbG9jayk7CisJCQkJYW55Y2hhbmdlZCA9IFRS
VUU7CisJCQl9CisJCQlpZiAobG9jayAhPSBOVUxMKQorCQkJCXJ3X3d1bmxvY2sobG9jayk7CisJ
CX0KKwkJLyoKKwkJICogTGltaXQgb3VyIHNjYW4gdG8gZWl0aGVyIHRoZSBlbmQgb2YgdGhlIHZh
IHJlcHJlc2VudGVkCisJCSAqIGJ5IHRoZSBjdXJyZW50IHBhZ2UgdGFibGUgcGFnZSwgb3IgdG8g
dGhlIGVuZCBvZiB0aGUKKwkJICogcmFuZ2UgYmVpbmcgd3JpdGUgcHJvdGVjdGVkLgorCQkgKi8K
KwkJaWYgKHZhX25leHQgPiBldmEpCisJCQl2YV9uZXh0ID0gZXZhOworCisJCWZvciAocHRlID0g
cG1hcF9wZGVfdG9fcHRlKHBkZSwgc3ZhKTsgc3ZhICE9IHZhX25leHQ7IHB0ZSsrLAorCQkgICAg
c3ZhICs9IFBBR0VfU0laRSkgeworCQkJaWYgKCFwdGVfaXNfdmFsaWQocHRlKSB8fCAhcHRlX3Rl
c3QocHRlLCBQVEVfTUFOQUdFRCkpCisJCQkJY29udGludWU7CisJCQllbHNlIGlmIChwdGVfdGVz
dChwdGUsIFBURV9EKSAmJgorCQkJICAgICFwdGVfdGVzdChwdGUsIFBURV9STykpIHsKKwkJCQlp
ZiAoYWR2aWNlID09IE1BRFZfRE9OVE5FRUQpIHsKKwkJCQkJLyoKKwkJCQkJICogRnV0dXJlIGNh
bGxzIHRvIHBtYXBfaXNfbW9kaWZpZWQoKQorCQkJCQkgKiBjYW4gYmUgYXZvaWRlZCBieSBtYWtp
bmcgdGhlIHBhZ2UKKwkJCQkJICogZGlydHkgbm93LgorCQkJCQkgKi8KKwkJCQkJbSA9IFBIWVNf
VE9fVk1fUEFHRSgKKwkJCQkJICAgIFRMQkxPX1BURV9UT19QQSgqcHRlKSk7CisJCQkJCXZtX3Bh
Z2VfZGlydHkobSk7CisJCQkJfQorCQkJCXB0ZV9hdG9taWNfY2xlYXIocHRlLCBQVEVfRCB8IFBU
RV9SRUYpOworCQkJfSBlbHNlIGlmIChwdGVfaXNfcmVmKHB0ZSkpCisJCQkJcHRlX2F0b21pY19j
bGVhcihwdGUsIFBURV9SRUYpOworCQkJZWxzZQorCQkJCWNvbnRpbnVlOworCQkJaWYgKHB0ZV90
ZXN0KHB0ZSwgUFRFX0cpKQorCQkJCXBtYXBfaW52YWxpZGF0ZV9wYWdlKHBtYXAsIHN2YSk7CisJ
CQllbHNlCisJCQkJYW55Y2hhbmdlZCA9IFRSVUU7CisJCX0KKwl9CisJaWYgKGFueWNoYW5nZWQp
CisJCXBtYXBfaW52YWxpZGF0ZV9hbGwocG1hcCk7CisJaWYgKHB2X2xpc3RzX2xvY2tlZCkgewor
CQlyd19ydW5sb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCX0KKwlQTUFQX1VOTE9DSyhwbWFwKTsK
K30KKworLyoKKyAqCUNsZWFyIHRoZSBtb2RpZnkgYml0cyBvbiB0aGUgc3BlY2lmaWVkIHBoeXNp
Y2FsIHBhZ2UuCisgKi8KK3ZvaWQKK3BtYXBfY2xlYXJfbW9kaWZ5KHZtX3BhZ2VfdCBtKQorewor
CXN0cnVjdCBtZF9wYWdlICpwdmg7CisJcG1hcF90IHBtYXA7CisJcHZfZW50cnlfdCBuZXh0X3B2
LCBwdjsKKwlwZF9lbnRyeV90IG9sZHBkZSwgKnBkZTsKKwlwdF9lbnRyeV90IG9sZHB0ZSwgKnB0
ZTsKKwlzdHJ1Y3Qgcndsb2NrICpsb2NrOworCXZtX29mZnNldF90IHZhOworCWludCBtZF9nZW4s
IHB2aF9nZW47CisKKwlLQVNTRVJUKChtLT5vZmxhZ3MgJiBWUE9fVU5NQU5BR0VEKSA9PSAwLAor
CSAgICAoInBtYXBfY2xlYXJfbW9kaWZ5OiBwYWdlICVwIGlzIG5vdCBtYW5hZ2VkIiwgbSkpOwor
CVZNX09CSkVDVF9BU1NFUlRfV0xPQ0tFRChtLT5vYmplY3QpOworCUtBU1NFUlQoIXZtX3BhZ2Vf
eGJ1c2llZChtKSwKKwkgICAgKCJwbWFwX2NsZWFyX21vZGlmeTogcGFnZSAlcCBpcyBleGNsdXNp
dmUgYnVzaWVkIiwgbSkpOworCisJLyoKKwkgKiBJZiB0aGUgcGFnZSBpcyBub3QgUEdBX1dSSVRF
QUJMRSwgdGhlbiBubyBQVEVzIGNhbiBoYXZlIFBURV9EIHNldC4KKwkgKiBJZiB0aGUgb2JqZWN0
IGNvbnRhaW5pbmcgdGhlIHBhZ2UgaXMgbG9ja2VkIGFuZCB0aGUgcGFnZSBpcyBub3QKKwkgKiB3
cml0ZSBidXNpZWQsIHRoZW4gUEdBX1dSSVRFQUJMRSBjYW5ub3QgYmUgY29uY3VycmVudGx5IHNl
dC4KKwkgKi8KKwlpZiAoKG0tPmFmbGFncyAmIFBHQV9XUklURUFCTEUpID09IDApCisJCXJldHVy
bjsKKwlwdmggPSBwYV90b19wdmgoVk1fUEFHRV9UT19QSFlTKG0pKTsKKwlyd19ybG9jaygmcHZo
X2dsb2JhbF9sb2NrKTsKKwlsb2NrID0gVk1fUEFHRV9UT19QVl9MSVNUX0xPQ0sobSk7CisJcndf
d2xvY2sobG9jayk7CityZXN0YXJ0OgorCWlmICgobS0+ZmxhZ3MgJiBQR19GSUNUSVRJT1VTKSAh
PSAwKQorCQlnb3RvIHNtYWxsX21hcHBpbmdzOworCVRBSUxRX0ZPUkVBQ0hfU0FGRShwdiwgJnB2
aC0+cHZfbGlzdCwgcHZfbmV4dCwgbmV4dF9wdikgeworCQlwbWFwID0gUFZfUE1BUChwdik7CisJ
CWlmICghUE1BUF9UUllMT0NLKHBtYXApKSB7CisJCQlwdmhfZ2VuID0gcHZoLT5wdl9nZW47CisJ
CQlyd193dW5sb2NrKGxvY2spOworCQkJUE1BUF9MT0NLKHBtYXApOworCQkJcndfd2xvY2sobG9j
ayk7CisJCQlpZiAocHZoX2dlbiAhPSBwdmgtPnB2X2dlbikgeworCQkJCVBNQVBfVU5MT0NLKHBt
YXApOworCQkJCWdvdG8gcmVzdGFydDsKKwkJCX0KKwkJfQorCQl2YSA9IHB2LT5wdl92YTsKKwkJ
cGRlID0gcG1hcF9wZGUocG1hcCwgdmEpOworCQlvbGRwZGUgPSAqcGRlOworCQlpZiAoIXBkZV90
ZXN0KHBkZSwgUFRFX1JPKSkgeworCQkJaWYgKHBtYXBfZGVtb3RlX3BkZV9sb2NrZWQocG1hcCwg
cGRlLCB2YSwgJmxvY2spKSB7CisJCQkJaWYgKCFwZGVfdGVzdCgmb2xkcGRlLCBQVEVfVykpIHsK
KwkJCQkJLyoKKwkJCQkJICogV3JpdGUgcHJvdGVjdCB0aGUgbWFwcGluZyB0byBhCisJCQkJCSAq
IHNpbmdsZSBwYWdlIHNvIHRoYXQgYSBzdWJzZXF1ZW50CisJCQkJCSAqIHdyaXRlIGFjY2VzcyBt
YXkgcmVwcm9tb3RlLgorCQkJCQkgKi8KKwkJCQkJdmEgKz0gVk1fUEFHRV9UT19QSFlTKG0pIC0K
KwkJCQkJICAgVExCTE9fUERFX1RPX1BBKG9sZHBkZSk7CisJCQkJCXB0ZSA9IHBtYXBfcGRlX3Rv
X3B0ZShwZGUsIHZhKTsKKwkJCQkJb2xkcHRlID0gKnB0ZTsKKwkJCQkJaWYgKCFwdGVfdGVzdCgm
b2xkcHRlLCBQVEVfVkFMSUQpKSB7CisJCQkJCQl3aGlsZSAoIWF0b21pY19jbXBzZXRfbG9uZyhw
dGUsCisJCQkJCQkgICAgb2xkcHRlLAorCQkJCQkJICAgIChvbGRwdGUgJiB+UFRFX0QpIHwgUFRF
X1JPKSkKKwkJCQkJCQlvbGRwdGUgPSAqcHRlOworCQkJCQkJdm1fcGFnZV9kaXJ0eShtKTsKKwkJ
CQkJCXBtYXBfaW52YWxpZGF0ZV9wYWdlKHBtYXAsIHZhKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0K
KwkJfQorCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwl9CitzbWFsbF9tYXBwaW5nczoKKwlUQUlMUV9G
T1JFQUNIKHB2LCAmbS0+bWQucHZfbGlzdCwgcHZfbmV4dCkgeworCQlwbWFwID0gUFZfUE1BUChw
dik7CisJCWlmICghUE1BUF9UUllMT0NLKHBtYXApKSB7CisJCQltZF9nZW4gPSBtLT5tZC5wdl9n
ZW47CisJCQlwdmhfZ2VuID0gcHZoLT5wdl9nZW47CisJCQlyd193dW5sb2NrKGxvY2spOworCQkJ
UE1BUF9MT0NLKHBtYXApOworCQkJcndfd2xvY2sobG9jayk7CisJCQlpZiAobWRfZ2VuICE9IG0t
Pm1kLnB2X2dlbiB8fCBtZF9nZW4gIT0gbS0+bWQucHZfZ2VuKSB7CisJCQkJUE1BUF9VTkxPQ0so
cG1hcCk7CisJCQkJZ290byByZXN0YXJ0OworCQkJfQorCQl9CisJCXBkZSA9IHBtYXBfcGRlKHBt
YXAsIHB2LT5wdl92YSk7CisJCUtBU1NFUlQoIXBkZV9pc19zdXBlcnBhZ2UocGRlKSwgKCJwbWFw
X2NsZWFyX21vZGlmeTogZm91bmQiCisJCSAgICAiIGEgc3VwZXJwYWdlIGluIHBhZ2UgJXAncyBw
diBsaXN0IiwgbSkpOworCQlwdGUgPSBwbWFwX3BkZV90b19wdGUocGRlLCBwdi0+cHZfdmEpOwor
CQlpZiAocHRlX3Rlc3QocHRlLCBQVEVfRCkgJiYgIXB0ZV90ZXN0KHB0ZSwgUFRFX1JPKSkgewor
CQkJcHRlX2F0b21pY19jbGVhcihwdGUsIFBURV9EKTsKKwkJCXBtYXBfaW52YWxpZGF0ZV9wYWdl
KHBtYXAsIHB2LT5wdl92YSk7CisJCX0KKwkJUE1BUF9VTkxPQ0socG1hcCk7CisJfQorCXJ3X3d1
bmxvY2sobG9jayk7CisJcndfcnVubG9jaygmcHZoX2dsb2JhbF9sb2NrKTsKK30KKworLyoKKyAq
IE1pc2NlbGxhbmVvdXMgc3VwcG9ydCByb3V0aW5lcyBmb2xsb3cKKyAqLworCisvKgorICogTWFw
IGEgc2V0IG9mIHBoeXNpY2FsIG1lbW9yeSBwYWdlcyBpbnRvIHRoZSBrZXJuZWwgdmlydHVhbAor
ICogYWRkcmVzcyBzcGFjZS4gUmV0dXJuIGEgcG9pbnRlciB0byB3aGVyZSBpdCBpcyBtYXBwZWQu
IFRoaXMKKyAqIHJvdXRpbmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBmb3IgbWFwcGluZyBkZXZp
Y2UgbWVtb3J5LAorICogTk9UIHJlYWwgbWVtb3J5LgorICoKKyAqIFVzZSBYS1BIWVMgdW5jYWNo
ZWQgZm9yIDY0IGJpdC4KKyAqLwordm9pZCAqCitwbWFwX21hcGRldih2bV9wYWRkcl90IHBhLCB2
bV9zaXplX3Qgc2l6ZSkKK3sKKworCXJldHVybiAoKHZvaWQgKilNSVBTX1BIWVNfVE9fRElSRUNU
X1VOQ0FDSEVEKHBhKSk7Cit9CisKK3ZvaWQKK3BtYXBfdW5tYXBkZXYodm1fb2Zmc2V0X3QgdmEs
IHZtX3NpemVfdCBzaXplKQoreworCisJLyogTm90aGluZyB0byBkbyBmb3IgbWlwczY0LiAqLwor
fQorCisvKgorICogU2V0cyB0aGUgbWVtb3J5IGF0dHJpYnV0ZSBmb3IgdGhlIHNwZWNpZmllZCBw
YWdlLgorICovCit2b2lkCitwbWFwX3BhZ2Vfc2V0X21lbWF0dHIodm1fcGFnZV90IG0sIHZtX21l
bWF0dHJfdCBtYSkKK3sKKwkvKgorCSAqIFNldCB0aGUgbWVtYXR0ciBmaWVsZCBzbyB0aGUgYXBw
cm9wcmlhdGUgYml0cyBhcmUgc2V0IGluIHRoZQorCSAqIFBURSBhcyBtYXBwaW5ncyBhcmUgY3Jl
YXRlZC4KKwkgKi8KKwltLT5tZC5wdl9tZW1hdHRyID0gbWE7CisKKwkvKgorCSAqIEl0IGlzIGFz
c3VtZWQgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIGJlZm9yZSBhbnkgbWFwcGlu
Z3MKKwkgKiBhcmUgZXN0YWJsaXNoZWQuICBJZiB0aGlzIGlzIG5vdCB0aGUgY2FzZSB0aGVuIHRo
aXMgZnVuY3Rpb24gd2lsbAorCSAqIG5lZWQgdG8gd2FsayB0aGUgcHZfbGlzdCBhbmQgbWFrZSBl
YWNoIG9mIHRoZSBleGlzdGluZyBtYXBwaW5ncworCSAqIHVuY2FjaGVhYmxlLCBzeW5jIHRoZSBj
YWNoZSAod2l0aCBtaXBzX2ljYWNoZV9zeW5jX2FsbCgpIGFuZAorCSAqIG1pcHNfZGNhY2hlX3di
aW52X2FsbCgpKSBhbmQgbW9zdCBsaWtlbHkgaW52YWxpZGF0ZSBUTEIgZW50cmllcyBmb3IKKwkg
KiBhbnkgb2YgdGhlIGN1cnJlbnQgbWFwcGluZ3MgaXQgbW9kaWZpZXMuCisJICovCisJaWYgKFRB
SUxRX0ZJUlNUKCZtLT5tZC5wdl9saXN0KSAhPSBOVUxMKQorCQlwYW5pYygiQ2FuJ3QgY2hhbmdl
IG1lbWF0dHIgb24gcGFnZSB3aXRoIGV4aXN0aW5nIG1hcHBpbmdzIik7Cit9CisKKy8qCisgKiBw
ZXJmb3JtIHRoZSBwbWFwIHdvcmsgZm9yIG1pbmNvcmUKKyAqLworaW50CitwbWFwX21pbmNvcmUo
cG1hcF90IHBtYXAsIHZtX29mZnNldF90IGFkZHIsIHZtX3BhZGRyX3QgKmxvY2tlZF9wYSkKK3sK
KwlwZF9lbnRyeV90ICpwZGVwOworCXB0X2VudHJ5X3QgKnB0ZXAsIHB0ZTsKKwl2bV9wYWRkcl90
IHBhOworCWludCB2YWw7CisKKwlQTUFQX0xPQ0socG1hcCk7CityZXRyeToKKwlwZGVwID0gcG1h
cF9wZGUocG1hcCwgYWRkcik7CisJaWYgKHBkZXAgIT0gTlVMTCkgeworCQlpZiAocGRlX2lzXzFt
X3N1cGVycGFnZShwZGVwKSkgeworCQkJcHRlID0gKHB0X2VudHJ5X3QpKnBkZXA7CisJCQlwYSA9
IFRMQkxPX1BURV9UT19QQShwdGUpOworCQkJdmFsID0gTUlOQ09SRV9TVVBFUjsKKwkJfSBlbHNl
IHsKKwkJCXB0ZXAgPSBwbWFwX3BkZV90b19wdGUocGRlcCwgYWRkcik7CisJCQlwdGUgPSAocHRl
cCAhPSBOVUxMKSA/ICpwdGVwIDogMDsKKwkJCXBhID0gVExCTE9fUFRFX1RPX1BBKHB0ZSk7CisJ
CQl2YWwgPSAwOworCQl9CisJfSBlbHNlIHsKKwkJcHRlID0gMDsKKwkJcGEgPSAwOworCQl2YWwg
PSAwOworCX0KKwlpZiAocHRlX2lzX3ZhbGlkKCZwdGUpKSB7CisJCXZhbCB8PSBNSU5DT1JFX0lO
Q09SRTsKKwkJaWYgKHB0ZV90ZXN0KCZwdGUsIFBURV9EKSkKKwkJCXZhbCB8PSBNSU5DT1JFX01P
RElGSUVEIHwgTUlOQ09SRV9NT0RJRklFRF9PVEhFUjsKKwkJaWYgKHB0ZV9pc19yZWYoJnB0ZSkp
CisJCQl2YWwgfD0gTUlOQ09SRV9SRUZFUkVOQ0VEIHwgTUlOQ09SRV9SRUZFUkVOQ0VEX09USEVS
OworCX0KKwlpZiAoKHZhbCAmIChNSU5DT1JFX01PRElGSUVEX09USEVSIHwgTUlOQ09SRV9SRUZF
UkVOQ0VEX09USEVSKSkgIT0KKwkgICAgKE1JTkNPUkVfTU9ESUZJRURfT1RIRVIgfCBNSU5DT1JF
X1JFRkVSRU5DRURfT1RIRVIpICYmCisJICAgIHB0ZV90ZXN0KCZwdGUsIFBURV9NQU5BR0VEKSkg
eworCQkvKiBFbnN1cmUgdGhhdCAiUEhZU19UT19WTV9QQUdFKHBhKS0+b2JqZWN0IiBkb2Vzbid0
IGNoYW5nZS4gKi8KKwkJaWYgKHZtX3BhZ2VfcGFfdHJ5cmVsb2NrKHBtYXAsIHBhLCBsb2NrZWRf
cGEpKQorCQkJZ290byByZXRyeTsKKwl9IGVsc2UKKwkJUEFfVU5MT0NLX0NPTkQoKmxvY2tlZF9w
YSk7CisJUE1BUF9VTkxPQ0socG1hcCk7CisJcmV0dXJuICh2YWwpOworfQorCit2b2lkCitwbWFw
X2FjdGl2YXRlKHN0cnVjdCB0aHJlYWQgKnRkKQoreworCXBtYXBfdCBwbWFwLCBvbGRwbWFwOwor
CXN0cnVjdCBwcm9jICpwID0gdGQtPnRkX3Byb2M7CisJdV9pbnQgY3B1aWQ7CisKKwljcml0aWNh
bF9lbnRlcigpOworCisJcG1hcCA9IHZtc3BhY2VfcG1hcChwLT5wX3Ztc3BhY2UpOworCW9sZHBt
YXAgPSBQQ1BVX0dFVChjdXJwbWFwKTsKKwljcHVpZCA9IFBDUFVfR0VUKGNwdWlkKTsKKworCWlm
IChvbGRwbWFwKQorCQlDUFVfQ0xSX0FUT01JQyhjcHVpZCwgJm9sZHBtYXAtPnBtX2FjdGl2ZSk7
CisJQ1BVX1NFVF9BVE9NSUMoY3B1aWQsICZwbWFwLT5wbV9hY3RpdmUpOworCXBtYXBfYXNpZF9h
bGxvYyhwbWFwKTsKKwlpZiAodGQgPT0gY3VydGhyZWFkKSB7CisJCVBDUFVfU0VUKHNlZ2Jhc2Us
IHBtYXAtPnBtX3NlZ3RhYik7CisJCW1pcHNfd3JfZW50cnloaShwbWFwLT5wbV9hc2lkW2NwdWlk
XS5hc2lkKTsKKwl9CisKKwlQQ1BVX1NFVChjdXJwbWFwLCBwbWFwKTsKKwljcml0aWNhbF9leGl0
KCk7Cit9CisKK3ZvaWQKK3BtYXBfc3luY19pY2FjaGUocG1hcF90IHBtLCB2bV9vZmZzZXRfdCB2
YSwgdm1fc2l6ZV90IHN6KQoreworfQorCisvKgorICoJSW5jcmVhc2UgdGhlIHN0YXJ0aW5nIHZp
cnR1YWwgYWRkcmVzcyBvZiB0aGUgZ2l2ZW4gbWFwcGluZyBpZiBhCisgKglkaWZmZXJlbnQgYWxp
Z25tZW50IG1pZ2h0IHJlc3VsdCBpbiBtb3JlIHN1cGVycGFnZSBtYXBwaW5ncy4KKyAqLwordm9p
ZAorcG1hcF9hbGlnbl9zdXBlcnBhZ2Uodm1fb2JqZWN0X3Qgb2JqZWN0LCB2bV9vb2Zmc2V0X3Qg
b2Zmc2V0LAorICAgIHZtX29mZnNldF90ICphZGRyLCB2bV9zaXplX3Qgc2l6ZSkKK3sKKwl2bV9v
ZmZzZXRfdCBzdXBlcnBhZ2Vfb2Zmc2V0OworCisJaWYgKHNpemUgPCBOQlNFRykKKwkJcmV0dXJu
OworCWlmIChvYmplY3QgIT0gTlVMTCAmJiAob2JqZWN0LT5mbGFncyAmIE9CSl9DT0xPUkVEKSAh
PSAwKQorCQlvZmZzZXQgKz0gcHRvYShvYmplY3QtPnBnX2NvbG9yKTsKKwlzdXBlcnBhZ2Vfb2Zm
c2V0ID0gb2Zmc2V0ICYgU0VHTUFTSzsKKwlpZiAoc2l6ZSAtICgoTkJTRUcgLSBzdXBlcnBhZ2Vf
b2Zmc2V0KSAmIFNFR01BU0spIDwgTkJTRUcgfHwKKwkgICAgKCphZGRyICYgU0VHTUFTSykgPT0g
c3VwZXJwYWdlX29mZnNldCkKKwkJcmV0dXJuOworCWlmICgoKmFkZHIgJiBTRUdNQVNLKSA8IHN1
cGVycGFnZV9vZmZzZXQpCisJCSphZGRyID0gKCphZGRyICYgflNFR01BU0spICsgc3VwZXJwYWdl
X29mZnNldDsKKwllbHNlCisJCSphZGRyID0gKCgqYWRkciArIFNFR01BU0spICYgflNFR01BU0sp
ICsgc3VwZXJwYWdlX29mZnNldDsKK30KKworI2lmZGVmIEREQgorREJfU0hPV19DT01NQU5EKHB0
YWJsZSwgZGRiX3BpZF9kdW1wKQoreworCXBtYXBfdCBwbWFwOworCXN0cnVjdCB0aHJlYWQgKnRk
ID0gTlVMTDsKKwlzdHJ1Y3QgcHJvYyAqcDsKKwlpbnQgaSwgaiwgazsKKwl2bV9wYWRkcl90IHBh
OworCXZtX29mZnNldF90IHZhOworCisJaWYgKGhhdmVfYWRkcikgeworCQl0ZCA9IGRiX2xvb2t1
cF90aHJlYWQoYWRkciwgVFJVRSk7CisJCWlmICh0ZCA9PSBOVUxMKSB7CisJCQlkYl9wcmludGYo
IkludmFsaWQgcGlkIG9yIHRpZCIpOworCQkJcmV0dXJuOworCQl9CisJCXAgPSB0ZC0+dGRfcHJv
YzsKKwkJaWYgKHAtPnBfdm1zcGFjZSA9PSBOVUxMKSB7CisJCQlkYl9wcmludGYoIk5vIHZtc3Bh
Y2UgZm9yIHByb2Nlc3MiKTsKKwkJCXJldHVybjsKKwkJfQorCQkJcG1hcCA9IHZtc3BhY2VfcG1h
cChwLT5wX3Ztc3BhY2UpOworCX0gZWxzZQorCQlwbWFwID0ga2VybmVsX3BtYXA7CisKKwlkYl9w
cmludGYoInBtYXA6JXAgc2VndGFiOiVwIGFzaWQ6JXggZ2VuZXJhdGlvbjoleFxuIiwKKwkgICAg
cG1hcCwgcG1hcC0+cG1fc2VndGFiLCBwbWFwLT5wbV9hc2lkWzBdLmFzaWQsCisJICAgIHBtYXAt
PnBtX2FzaWRbMF0uZ2VuKTsKKwlmb3IgKGkgPSAwOyBpIDwgTlBERVBHOyBpKyspIHsKKwkJcGRf
ZW50cnlfdCAqcGRwZTsKKwkJcHRfZW50cnlfdCAqcGRlOworCQlwdF9lbnRyeV90IHB0ZTsKKwor
CQlwZHBlID0gKHBkX2VudHJ5X3QgKilwbWFwLT5wbV9zZWd0YWJbaV07CisJCWlmIChwZHBlID09
IE5VTEwpCisJCQljb250aW51ZTsKKwkJZGJfcHJpbnRmKCJbJTRkXSAlcFxuIiwgaSwgcGRwZSk7
CisJCWZvciAoaiA9IDA7IGogPCBOUERFUEc7IGorKykgeworCQkJcGRlID0gKHB0X2VudHJ5X3Qg
KilwZHBlW2pdOworCQkJaWYgKHBkZSA9PSBOVUxMKQorCQkJCWNvbnRpbnVlOworCQkJZGJfcHJp
bnRmKCJcdFslNGRdICVwXG4iLCBqLCBwZGUpOworCQkJZm9yIChrID0gMDsgayA8IE5QVEVQRzsg
aysrKSB7CisJCQkJcHRlID0gcGRlW2tdOworCQkJCWlmIChwdGUgPT0gMCB8fCAhcHRlX2lzX3Zh
bGlkKCZwdGUpKQorCQkJCQljb250aW51ZTsKKwkJCQlwYSA9IFRMQkxPX1BURV9UT19QQShwdGUp
OworCQkJCXZhID0gKCh1X2xvbmcpaSA8PCBTRUdTSElGVCkgfCAoaiA8PCBQRFJTSElGVCkgfCAo
ayA8PCBQQUdFX1NISUZUKTsKKwkJCQlkYl9wcmludGYoIlx0XHRbJTA0ZF0gdmE6ICVwIHB0ZTog
JThqeCBwYTolanhcbiIsCisJCQkJICAgICAgIGssICh2b2lkICopdmEsICh1aW50bWF4X3QpcHRl
LCAodWludG1heF90KXBhKTsKKwkJCX0KKwkJfQorCX0KK30KKyNlbmRpZgorCisjaWYgZGVmaW5l
ZChERUJVRykKKworc3RhdGljIHZvaWQgcGFkcyhwbWFwX3QgcG0pOwordm9pZCBwbWFwX3B2ZHVt
cCh2bV9vZmZzZXRfdCBwYSk7CisKKy8qIHByaW50IGFkZHJlc3Mgc3BhY2Ugb2YgcG1hcCovCitz
dGF0aWMgdm9pZAorcGFkcyhwbWFwX3QgcG0pCit7CisJdW5zaWduZWQgdmEsIGksIGo7CisJcHRf
ZW50cnlfdCAqcHRlcDsKKworCWlmIChwbSA9PSBrZXJuZWxfcG1hcCkKKwkJcmV0dXJuOworCWZv
ciAoaSA9IDA7IGkgPCBOUFRFUEc7IGkrKykKKwkJaWYgKHBtLT5wbV9zZWd0YWJbaV0pCisJCQlm
b3IgKGogPSAwOyBqIDwgTlBURVBHOyBqKyspIHsKKwkJCQl2YSA9IChpIDw8IFNFR1NISUZUKSAr
IChqIDw8IFBBR0VfU0hJRlQpOworCQkJCWlmIChwbSA9PSBrZXJuZWxfcG1hcCAmJiB2YSA8IEtF
Uk5CQVNFKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAocG0gIT0ga2VybmVsX3BtYXAgJiYKKwkJ
CQkgICAgdmEgPj0gVk1fTUFYVVNFUl9BRERSRVNTKQorCQkJCQljb250aW51ZTsKKwkJCQlwdGVw
ID0gcG1hcF9wdGUocG0sIHZhKTsKKwkJCQlpZiAocHRlX2lzX3ZhbGlkKHB0ZXApKQorCQkJCQlw
cmludGYoIiV4OiV4ICIsIHZhLCAqKGludCAqKXB0ZXApOworCQkJfQorCit9CisKK3ZvaWQKK3Bt
YXBfcHZkdW1wKHZtX29mZnNldF90IHBhKQoreworCXJlZ2lzdGVyIHB2X2VudHJ5X3QgcHY7CisJ
dm1fcGFnZV90IG07CisKKwlwcmludGYoInBhICV4IiwgcGEpOworCW0gPSBQSFlTX1RPX1ZNX1BB
R0UocGEpOworCWZvciAocHYgPSBUQUlMUV9GSVJTVCgmbS0+bWQucHZfbGlzdCk7IHB2OworCSAg
ICBwdiA9IFRBSUxRX05FWFQocHYsIHB2X2xpc3QpKSB7CisJCXByaW50ZigiIC0+IHBtYXAgJXAs
IHZhICV4IiwgKHZvaWQgKilwdi0+cHZfcG1hcCwgcHYtPnB2X3ZhKTsKKwkJcGFkcyhwdi0+cHZf
cG1hcCk7CisJfQorCXByaW50ZigiICIpOworfQorCisvKiBOL0MgKi8KKyNlbmRpZgorCisKKy8q
CisgKiBBbGxvY2F0ZSBUTEIgYWRkcmVzcyBzcGFjZSB0YWcgKGNhbGxlZCBBU0lEIG9yIFRMQlBJ
RCkgYW5kIHJldHVybiBpdC4KKyAqIEl0IHRha2VzIGFsbW9zdCBhcyBtdWNoIG9yIG1vcmUgdGlt
ZSB0byBzZWFyY2ggdGhlIFRMQiBmb3IgYQorICogc3BlY2lmaWMgQVNJRCBhbmQgZmx1c2ggdGhv
c2UgZW50cmllcyBhcyBpdCBkb2VzIHRvIGZsdXNoIHRoZSBlbnRpcmUgVExCLgorICogVGhlcmVm
b3JlLCB3aGVuIHdlIGFsbG9jYXRlIGEgbmV3IEFTSUQsIHdlIGp1c3QgdGFrZSB0aGUgbmV4dCBu
dW1iZXIuIFdoZW4KKyAqIHdlIHJ1biBvdXQgb2YgbnVtYmVycywgd2UgZmx1c2ggdGhlIFRMQiwg
aW5jcmVtZW50IHRoZSBnZW5lcmF0aW9uIGNvdW50CisgKiBhbmQgc3RhcnQgb3Zlci4gQVNJRCB6
ZXJvIGlzIHJlc2VydmVkIGZvciBrZXJuZWwgdXNlLgorICovCitzdGF0aWMgdm9pZAorcG1hcF9h
c2lkX2FsbG9jKHBtYXApCisJcG1hcF90IHBtYXA7Cit7CisJaWYgKHBtYXAtPnBtX2FzaWRbUENQ
VV9HRVQoY3B1aWQpXS5hc2lkICE9IFBNQVBfQVNJRF9SRVNFUlZFRCAmJgorCSAgICBwbWFwLT5w
bV9hc2lkW1BDUFVfR0VUKGNwdWlkKV0uZ2VuID09IFBDUFVfR0VUKGFzaWRfZ2VuZXJhdGlvbikp
OworCWVsc2UgeworCQlpZiAoUENQVV9HRVQobmV4dF9hc2lkKSA9PSBwbWFwX21heF9hc2lkKSB7
CisJCQl0bGJfaW52YWxpZGF0ZV9hbGxfdXNlcihOVUxMKTsKKwkJCVBDUFVfU0VUKGFzaWRfZ2Vu
ZXJhdGlvbiwKKwkJCSAgICAoUENQVV9HRVQoYXNpZF9nZW5lcmF0aW9uKSArIDEpICYgQVNJREdF
Tl9NQVNLKTsKKwkJCWlmIChQQ1BVX0dFVChhc2lkX2dlbmVyYXRpb24pID09IDApIHsKKwkJCQlQ
Q1BVX1NFVChhc2lkX2dlbmVyYXRpb24sIDEpOworCQkJfQorCQkJUENQVV9TRVQobmV4dF9hc2lk
LCAxKTsJLyogMCBtZWFucyBpbnZhbGlkICovCisJCX0KKwkJcG1hcC0+cG1fYXNpZFtQQ1BVX0dF
VChjcHVpZCldLmFzaWQgPSBQQ1BVX0dFVChuZXh0X2FzaWQpOworCQlwbWFwLT5wbV9hc2lkW1BD
UFVfR0VUKGNwdWlkKV0uZ2VuID0gUENQVV9HRVQoYXNpZF9nZW5lcmF0aW9uKTsKKwkJUENQVV9T
RVQobmV4dF9hc2lkLCBQQ1BVX0dFVChuZXh0X2FzaWQpICsgMSk7CisJfQorfQorCitzdGF0aWMg
cHRfZW50cnlfdAoraW5pdF9wdGVfcHJvdCh2bV9wYWdlX3QgbSwgdm1fcHJvdF90IGFjY2Vzcywg
dm1fcHJvdF90IHByb3QpCit7CisJcHRfZW50cnlfdCBydzsKKworCWlmICghKHByb3QgJiBWTV9Q
Uk9UX1dSSVRFKSkKKwkJcncgPSBQVEVfVkFMSUQgfCBQVEVfUk87CisJZWxzZSBpZiAoKG0tPm9m
bGFncyAmIFZQT19VTk1BTkFHRUQpID09IDApIHsKKwkJaWYgKChhY2Nlc3MgJiBWTV9QUk9UX1dS
SVRFKSAhPSAwKQorCQkJcncgPSBQVEVfVkFMSUQgfCBQVEVfRDsKKwkJZWxzZQorCQkJcncgPSBQ
VEVfVkFMSUQ7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogTmVlZG4ndCBlbXVsYXRlIGEgcmVmZXJl
bmNlL21vZGlmaWVkIGJpdCBmb3IgdW5tYW5hZ2VkCisJCSAqIHBhZ2VzLgorCQkgKi8KKwkJcncg
PSBQVEVfVkFMSUQgfCBQVEVfRDsKKwkJcHRlX3JlZl9zZXQoJnJ3KTsKKwl9CisKKwlyZXR1cm4g
KHJ3KTsKK30KKworLyoKKyAqIHBtYXBfZW11bGF0ZV9tb2RpZmllZCA6IGRvIGRpcnR5IGJpdCBl
bXVsYXRpb24KKyAqCisgKiBPbiBTTVAsIHVwZGF0ZSBqdXN0IHRoZSBsb2NhbCBUTEIsIG90aGVy
IENQVXMgd2lsbCB1cGRhdGUgdGhlaXIKKyAqIFRMQnMgZnJvbSBQVEUgbGF6aWx5LCBpZiB0aGV5
IGdldCB0aGUgZXhjZXB0aW9uLgorICogUmV0dXJucyAwIGluIGNhc2Ugb2Ygc3VjZXNzLCAxIGlm
IHRoZSBwYWdlIGlzIHJlYWQgb25seSBhbmQgd2UKKyAqIG5lZWQgdG8gZmF1bHQuCisgKi8KK2lu
dAorcG1hcF9lbXVsYXRlX21vZGlmaWVkKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSkKK3sK
KwlwZF9lbnRyeV90ICpwZGU7CisJcHRfZW50cnlfdCAqcHRlOworCisJUE1BUF9MT0NLKHBtYXAp
OworCXBkZSA9IHBtYXBfcGRlKHBtYXAsIHZhKTsKKwlpZiAocGRlX2lzXzFtX3N1cGVycGFnZShw
ZGUpKQorCQlwdGUgPSAocHRfZW50cnlfdCAqKXBkZTsKKwllbHNlCisJCXB0ZSA9IHBtYXBfcGRl
X3RvX3B0ZShwZGUsIHZhKTsKKwlpZiAocHRlID09IE5VTEwpCisJCXBhbmljKCJwbWFwX2VtdWxh
dGVfbW9kaWZpZWQ6IGNhbid0IGZpbmQgUFRFIik7CisjaWZkZWYgU01QCisJLyogSXQgaXMgcG9z
c2libGUgdGhhdCBzb21lIG90aGVyIENQVSBjaGFuZ2VkIG0tYml0ICovCisJaWYgKCFwdGVfaXNf
dmFsaWQocHRlKSB8fCBwdGVfdGVzdChwdGUsIFBURV9EKSkgeworCQl0bGJfdXBkYXRlKHBtYXAs
IHZhLCAqcHRlKTsKKwkJUE1BUF9VTkxPQ0socG1hcCk7CisJCXJldHVybiAoMCk7CisJfQorI2Vs
c2UKKwlpZiAoIXB0ZV9pc192YWxpZChwdGUpIHx8IHB0ZV90ZXN0KHB0ZSwgUFRFX0QpKSB7CisJ
CXRsYl91cGRhdGUocG1hcCwgdmEsICpwdGUpOworCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwkJcmV0
dXJuICgwKTsKKwl9CisjZW5kaWYKKwlpZiAocHRlX3Rlc3QocHRlLCBQVEVfUk8pKSB7CisJCVBN
QVBfVU5MT0NLKHBtYXApOworCQlyZXR1cm4gKDEpOworCX0KKwlwdGVfYXRvbWljX3NldChwdGUs
IFBURV9EKTsgLyogbWFyayBpdCByZWZlcmVuY2VkIGFuZCBtb2RpZmllZCAqLworCXB0ZV9yZWZf
YXRvbWljX3NldChwdGUpOworCXRsYl91cGRhdGUocG1hcCwgdmEsICpwdGUpOworCWlmICghcHRl
X3Rlc3QocHRlLCBQVEVfTUFOQUdFRCkpCisJCXBhbmljKCJwbWFwX2VtdWxhdGVfbW9kaWZpZWQ6
IHVubWFuYWdlZCBwYWdlIik7CisJUE1BUF9VTkxPQ0socG1hcCk7CisJcmV0dXJuICgwKTsKK30K
KworLyoKKyAqIHBtYXBfZW11bGF0ZV9yZWZlcmVuY2VkOiBkbyByZWZlcmVuY2UgYml0IGVtdWxh
dGlvbgorICoKKyAqIFJldHVybnMgMCBpbiBjYXNlIG9mIHN1Y2Nlc3MuICBSZXR1cm5zIDEgaWYg
d2UgbmVlZCB0byBmYXVsdC4KKyAqLworaW50CitwbWFwX2VtdWxhdGVfcmVmZXJlbmNlZChwbWFw
X3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEpCit7CisJcGRfZW50cnlfdCAqcGRlOworCXB0X2VudHJ5
X3QgKnB0ZTsKKworCWlmIChpc19rZXJuZWxfcG1hcChwbWFwKSkKKwkJcmV0dXJuICgxKTsKKwlQ
TUFQX0xPQ0socG1hcCk7CisJcGRlID0gcG1hcF9wZGUocG1hcCwgdmEpOworCWlmIChwZGUgPT0g
TlVMTCB8fCAqcGRlID09IE5VTEwpIHsKKwkJLyogSW52YWxpZCBwYWdlIGRpcmVjdG9yeS4gKi8K
KwkJZ290byBkb2ZhdWx0OworCX0KKwlpZiAocGRlX2lzXzFtX3N1cGVycGFnZShwZGUpKSB7CisJ
CXB0ZSA9IChwdF9lbnRyeV90ICopcGRlOworCX0gZWxzZQorCQlwdGUgPSBwbWFwX3BkZV90b19w
dGUocGRlLCB2YSk7CisJaWYgKHB0ZSA9PSBOVUxMKSB7CisJCS8qIEludmFsaWQgcGFnZSB0YWJs
ZS4gKi8KKwkJZ290byBkb2ZhdWx0OworCX0KKwlpZiAoIXB0ZV9pc192YWxpZChwdGUpKSB7CisJ
CS8qIEludmFsaWQgUFRFLiAqLworCQlnb3RvIGRvZmF1bHQ7CisJfQorCS8qIENoZWNrIHRvIHNl
ZSBpZiBhbHJlYWR5IG1hcmtlZCBieSBvdGhlciBDUFUuICAqLworCWlmICghcHRlX2lzX3JlZihw
dGUpKQorCQlwdGVfcmVmX2F0b21pY19zZXQocHRlKTsKKworCXRsYl91cGRhdGUocG1hcCwgdmEs
ICpwdGUpOworCVBNQVBfVU5MT0NLKHBtYXApOworCisJcmV0dXJuICgwKTsKKworZG9mYXVsdDoK
KwlQTUFQX1VOTE9DSyhwbWFwKTsKKwlyZXR1cm4gKDEpOworfQorCit2b2lkCitwbWFwX2ZsdXNo
X3B2Y2FjaGUodm1fcGFnZV90IG0pCit7CisJcHZfZW50cnlfdCBwdjsKKworCWlmIChtICE9IE5V
TEwpIHsKKwkJZm9yIChwdiA9IFRBSUxRX0ZJUlNUKCZtLT5tZC5wdl9saXN0KTsgcHY7CisJCSAg
ICBwdiA9IFRBSUxRX05FWFQocHYsIHB2X25leHQpKSB7CisJCQltaXBzX2RjYWNoZV93Ymludl9y
YW5nZV9pbmRleChwdi0+cHZfdmEsIFBBR0VfU0laRSk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQg
YS9zeXMvbWlwcy9taXBzL3BtYXAuYyBiL3N5cy9taXBzL21pcHMvcG1hcC5jCi0tLSBhL3N5cy9t
aXBzL21pcHMvcG1hcC5jCisrKyBiL3N5cy9taXBzL21pcHMvcG1hcC5jCkBAIC0yMzIsNyArMjMy
LDcgQEAKIAlzeXNtID0gJnN5c21hcF9sbWVtW2NwdV07CiAJc3lzbS0+c2F2ZWRfaW50ciA9IGlu
dHI7CiAJdmEgPSBzeXNtLT5iYXNlOwotCW5wdGUgPSBUTEJMT19QQV9UT19QRk4ocGh5cykgfCBQ
VEVfQ19DQUNIRSB8IFBURV9EIHwgUFRFX1YgfCBQVEVfRzsKKwlucHRlID0gVExCTE9fUEFfVE9f
UEZOKHBoeXMpIHwgUFRFX0NfQ0FDSEUgfCBQVEVfRCB8IFBURV9WQUxJRCB8IFBURV9HOwogCXB0
ZSA9IHBtYXBfcHRlKGtlcm5lbF9wbWFwLCB2YSk7CiAJKnB0ZSA9IG5wdGU7CiAJc3lzbS0+dmFs
aWQxID0gMTsKQEAgLTI1NCwxMCArMjU0LDEwIEBACiAJc3lzbS0+c2F2ZWRfaW50ciA9IGludHI7
CiAJdmExID0gc3lzbS0+YmFzZTsKIAl2YTIgPSBzeXNtLT5iYXNlICsgUEFHRV9TSVpFOwotCW5w
dGUgPSBUTEJMT19QQV9UT19QRk4ocGh5czEpIHwgUFRFX0NfQ0FDSEUgfCBQVEVfRCB8IFBURV9W
IHwgUFRFX0c7CisJbnB0ZSA9IFRMQkxPX1BBX1RPX1BGTihwaHlzMSkgfCBQVEVfQ19DQUNIRSB8
IFBURV9EIHwgUFRFX1ZBTElEIHwgUFRFX0c7CiAJcHRlID0gcG1hcF9wdGUoa2VybmVsX3BtYXAs
IHZhMSk7CiAJKnB0ZSA9IG5wdGU7Ci0JbnB0ZSA9IFRMQkxPX1BBX1RPX1BGTihwaHlzMikgfCBQ
VEVfQ19DQUNIRSB8IFBURV9EIHwgUFRFX1YgfCBQVEVfRzsKKwlucHRlID0gVExCTE9fUEFfVE9f
UEZOKHBoeXMyKSB8IFBURV9DX0NBQ0hFIHwgUFRFX0QgfCBQVEVfVkFMSUQgfCBQVEVfRzsKIAlw
dGUgPSBwbWFwX3B0ZShrZXJuZWxfcG1hcCwgdmEyKTsKIAkqcHRlID0gbnB0ZTsKIAlzeXNtLT52
YWxpZDEgPSAxOwpAQCAtNTU2LDkgKzU1NiwxNSBAQAogCW1zZ2J1ZmluaXQobXNnYnVmcCwgbXNn
YnVmc2l6ZSk7CiAKIAkvKgotCSAqIFN0ZWFsIHRocmVhZDAga3N0YWNrLgorCSAqIFN0ZWFsIHRo
cmVhZDAga3N0YWNrLiAgVGhpcyBtdXN0IGJlIGFsaWduZWQgdG8KKwkgKiAoS1NUQUNLX1BBR0Vf
U0laRSAqIDIpIHNvIGl0IGNhbiBtYXBwZWQgdG8gYSBzaW5nbGUgVExCIGVudHJ5LgorCSAqCisJ
ICogWFhYIFRoZXJlIHNob3VsZCBiZSBhIGJldHRlciB3YXkgb2YgZ2V0dGluZyBhbGlnbmVkIG1l
bW9yeQorCSAqIHdpdGggcG1hcF9zdGVhbF9tZW1vcnkoKS4KIAkgKi8KLQlrc3RhY2swID0gcG1h
cF9zdGVhbF9tZW1vcnkoS1NUQUNLX1BBR0VTIDw8IFBBR0VfU0hJRlQpOworCWtzdGFjazAgPSBw
bWFwX3N0ZWFsX21lbW9yeSgoS1NUQUNLX1BBR0VTICsgS1NUQUNLX0dVQVJEX1BBR0VTKSBcCisJ
CQkJCTw8IFBBR0VfU0hJRlQpOworCWtzdGFjazAgPSByb3VuZHVwMihrc3RhY2swLCAoS1NUQUNL
X1BBR0VfU0laRSAqIDIpKTsKIAogCXZpcnR1YWxfYXZhaWwgPSBWTV9NSU5fS0VSTkVMX0FERFJF
U1M7CiAJdmlydHVhbF9lbmQgPSBWTV9NQVhfS0VSTkVMX0FERFJFU1M7CkBAIC02MDUsNiArNjEx
LDcgQEAKIAogCVRBSUxRX0lOSVQoJm0tPm1kLnB2X2xpc3QpOwogCW0tPm1kLnB2X2ZsYWdzID0g
MDsKKwltLT5tZC5wdl9tZW1hdHRyID0gVk1fTUVNQVRUUl9ERUZBVUxUOwogfQogCiAvKgpAQCAt
ODAxLDcgKzgwOCw3IEBACiAJcHRlcCA9IHBtYXBfcHRlKHBtYXAsIHZhKTsKIAlpZiAocHRlcCAh
PSBOVUxMKSB7CiAJCXB0ZSA9ICpwdGVwOwotCQlpZiAocHRlX3Rlc3QoJnB0ZSwgUFRFX1YpICYm
ICghcHRlX3Rlc3QoJnB0ZSwgUFRFX1JPKSB8fAorCQlpZiAocHRlX3Rlc3QoJnB0ZSwgUFRFX1ZB
TElEKSAmJiAoIXB0ZV90ZXN0KCZwdGUsIFBURV9STykgfHwKIAkJICAgIChwcm90ICYgVk1fUFJP
VF9XUklURSkgPT0gMCkpIHsKIAkJCXB0ZV9wYSA9IFRMQkxPX1BURV9UT19QQShwdGUpOwogCQkJ
aWYgKHZtX3BhZ2VfcGFfdHJ5cmVsb2NrKHBtYXAsIHB0ZV9wYSwgJnBhKSkKQEAgLTgzNCw5ICs4
NDEsOSBAQAogCiAJcHRlID0gcG1hcF9wdGUoa2VybmVsX3BtYXAsIHZhKTsKIAlvcHRlID0gKnB0
ZTsKLQlucHRlID0gVExCTE9fUEFfVE9fUEZOKHBhKSB8IGF0dHIgfCBQVEVfRCB8IFBURV9WIHwg
UFRFX0c7CisJbnB0ZSA9IFRMQkxPX1BBX1RPX1BGTihwYSkgfCBhdHRyIHwgUFRFX0QgfCBQVEVf
VkFMSUQgfCBQVEVfRzsKIAkqcHRlID0gbnB0ZTsKLQlpZiAocHRlX3Rlc3QoJm9wdGUsIFBURV9W
KSAmJiBvcHRlICE9IG5wdGUpCisJaWYgKHB0ZV90ZXN0KCZvcHRlLCBQVEVfVkFMSUQpICYmIG9w
dGUgIT0gbnB0ZSkKIAkJcG1hcF91cGRhdGVfcGFnZShrZXJuZWxfcG1hcCwgdmEsIG5wdGUpOwog
fQogCkBAIC0xNDQ5LDcgKzE0NTYsNyBAQAogCQkJCWlmIChtLT5tZC5wdl9mbGFncyAmIFBWX1RB
QkxFX1JFRikKIAkJCQkJdm1fcGFnZV9hZmxhZ19zZXQobSwgUEdBX1JFRkVSRU5DRUQpOwogCQkJ
CW0tPm1kLnB2X2ZsYWdzICY9IH5QVl9UQUJMRV9SRUY7Ci0JCQkJVEFJTFFfUkVNT1ZFKCZtLT5t
ZC5wdl9saXN0LCBwdiwgcHZfbGlzdCk7CisJCQkJVEFJTFFfUkVNT1ZFKCZtLT5tZC5wdl9saXN0
LCBwdiwgcHZfbmV4dCk7CiAJCQkJaWYgKFRBSUxRX0VNUFRZKCZtLT5tZC5wdl9saXN0KSkKIAkJ
CQkJdm1fcGFnZV9hZmxhZ19jbGVhcihtLCBQR0FfV1JJVEVBQkxFKTsKIAkJCQlwYy0+cGNfbWFw
W2ZpZWxkXSB8PSAxVUwgPDwgYml0OwpAQCAtMTYyNyw5ICsxNjM0LDkgQEAKIAlwdl9lbnRyeV90
IHB2OwogCiAJcndfYXNzZXJ0KCZwdmhfZ2xvYmFsX2xvY2ssIFJBX1dMT0NLRUQpOwotCVRBSUxR
X0ZPUkVBQ0gocHYsICZwdmgtPnB2X2xpc3QsIHB2X2xpc3QpIHsKKwlUQUlMUV9GT1JFQUNIKHB2
LCAmcHZoLT5wdl9saXN0LCBwdl9uZXh0KSB7CiAJCWlmIChwbWFwID09IFBWX1BNQVAocHYpICYm
IHZhID09IHB2LT5wdl92YSkgewotCQkJVEFJTFFfUkVNT1ZFKCZwdmgtPnB2X2xpc3QsIHB2LCBw
dl9saXN0KTsKKwkJCVRBSUxRX1JFTU9WRSgmcHZoLT5wdl9saXN0LCBwdiwgcHZfbmV4dCk7CiAJ
CQlicmVhazsKIAkJfQogCX0KQEAgLTE2NzEsNyArMTY3OCw3IEBACiAJUE1BUF9MT0NLX0FTU0VS
VChwbWFwLCBNQV9PV05FRCk7CiAJaWYgKChwdiA9IGdldF9wdl9lbnRyeShwbWFwLCBUUlVFKSkg
IT0gTlVMTCkgewogCQlwdi0+cHZfdmEgPSB2YTsKLQkJVEFJTFFfSU5TRVJUX1RBSUwoJm0tPm1k
LnB2X2xpc3QsIHB2LCBwdl9saXN0KTsKKwkJVEFJTFFfSU5TRVJUX1RBSUwoJm0tPm1kLnB2X2xp
c3QsIHB2LCBwdl9uZXh0KTsKIAkJcmV0dXJuIChUUlVFKTsKIAl9IGVsc2UKIAkJcmV0dXJuIChG
QUxTRSk7CkBAIC0xNzQ0LDcgKzE3NTEsNyBAQAogCS8qCiAJICogSWYgdGhlcmUgaXMgbm8gcHRl
IGZvciB0aGlzIGFkZHJlc3MsIGp1c3Qgc2tpcCBpdCEKIAkgKi8KLQlpZiAoIXB0ZV90ZXN0KHB0
cSwgUFRFX1YpKQorCWlmICghcHRlX3Rlc3QocHRxLCBQVEVfVkFMSUQpKQogCQlyZXR1cm47CiAK
IAkodm9pZClwbWFwX3JlbW92ZV9wdGUocG1hcCwgcHRxLCB2YSwgKnBkZSk7CkBAIC0xODEwLDcg
KzE4MTcsNyBAQAogCQl2YSA9IHZhX25leHQ7CiAJCWZvciAocHRlID0gcG1hcF9wZGVfdG9fcHRl
KHBkZSwgc3ZhKTsgc3ZhICE9IHZhX25leHQ7IHB0ZSsrLAogCQkgICAgc3ZhICs9IFBBR0VfU0la
RSkgewotCQkJaWYgKCFwdGVfdGVzdChwdGUsIFBURV9WKSkgeworCQkJaWYgKCFwdGVfdGVzdChw
dGUsIFBURV9WQUxJRCkpIHsKIAkJCQlpZiAodmEgIT0gdmFfbmV4dCkgewogCQkJCQlwbWFwX2lu
dmFsaWRhdGVfcmFuZ2UocG1hcCwgdmEsIHN2YSk7CiAJCQkJCXZhID0gdmFfbmV4dDsKQEAgLTE4
NjgsNyArMTg3NSw3IEBACiAJCSAqIElmIGl0J3MgbGFzdCBtYXBwaW5nIHdyaXRlYmFjayBhbGwg
Y2FjaGVzIGZyb20gCiAJCSAqIHRoZSBwYWdlIGJlaW5nIGRlc3Ryb3llZAogCSAJICovCi0JCWlm
IChUQUlMUV9ORVhUKHB2LCBwdl9saXN0KSA9PSBOVUxMKQorCQlpZiAoVEFJTFFfTkVYVChwdiwg
cHZfbmV4dCkgPT0gTlVMTCkKIAkJCW1pcHNfZGNhY2hlX3diaW52X3JhbmdlX2luZGV4KHB2LT5w
dl92YSwgUEFHRV9TSVpFKTsKIAogCQlwbWFwLT5wbV9zdGF0cy5yZXNpZGVudF9jb3VudC0tOwpA
QCAtMTg5Nyw3ICsxOTA0LDcgQEAKIAkJfQogCQlwbWFwX2ludmFsaWRhdGVfcGFnZShwbWFwLCBw
di0+cHZfdmEpOwogCi0JCVRBSUxRX1JFTU9WRSgmbS0+bWQucHZfbGlzdCwgcHYsIHB2X2xpc3Qp
OworCQlUQUlMUV9SRU1PVkUoJm0tPm1kLnB2X2xpc3QsIHB2LCBwdl9uZXh0KTsKIAkJcG1hcF91
bnVzZV9wdChwbWFwLCBwdi0+cHZfdmEsICpwZGUpOwogCQlmcmVlX3B2X2VudHJ5KHBtYXAsIHB2
KTsKIAkJUE1BUF9VTkxPQ0socG1hcCk7CkBAIC0xOTU5LDcgKzE5NjYsNyBAQAogCQlmb3IgKHB0
ZSA9IHBtYXBfcGRlX3RvX3B0ZShwZGUsIHN2YSk7IHN2YSAhPSB2YV9uZXh0OyBwdGUrKywKIAkJ
ICAgIHN2YSArPSBQQUdFX1NJWkUpIHsKIAkJCXBiaXRzID0gKnB0ZTsKLQkJCWlmICghcHRlX3Rl
c3QoJnBiaXRzLCBQVEVfVikgfHwgcHRlX3Rlc3QoJnBiaXRzLAorCQkJaWYgKCFwdGVfdGVzdCgm
cGJpdHMsIFBURV9WQUxJRCkgfHwgcHRlX3Rlc3QoJnBiaXRzLAogCQkJICAgIFBURV9STykpIHsK
IAkJCQlpZiAodmEgIT0gdmFfbmV4dCkgewogCQkJCQlwbWFwX2ludmFsaWRhdGVfcmFuZ2UocG1h
cCwgdmEsIHN2YSk7CkBAIC0yMDcxLDcgKzIwNzgsNyBAQAogCS8qCiAJICogTWFwcGluZyBoYXMg
bm90IGNoYW5nZWQsIG11c3QgYmUgcHJvdGVjdGlvbiBvciB3aXJpbmcgY2hhbmdlLgogCSAqLwot
CWlmIChwdGVfdGVzdCgmb3JpZ3B0ZSwgUFRFX1YpICYmIG9wYSA9PSBwYSkgeworCWlmIChwdGVf
dGVzdCgmb3JpZ3B0ZSwgUFRFX1ZBTElEKSAmJiBvcGEgPT0gcGEpIHsKIAkJLyoKIAkJICogV2ly
aW5nIGNoYW5nZSwganVzdCB1cGRhdGUgc3RhdHMuIFdlIGRvbid0IHdvcnJ5IGFib3V0CiAJCSAq
IHdpcmluZyBQVCBwYWdlcyBhcyB0aGV5IHJlbWFpbiByZXNpZGVudCBhcyBsb25nIGFzIHRoZXJl
CkBAIC0yMTM1LDcgKzIxNDIsNyBAQAogCQlpZiAocHYgPT0gTlVMTCkKIAkJCXB2ID0gZ2V0X3B2
X2VudHJ5KHBtYXAsIEZBTFNFKTsKIAkJcHYtPnB2X3ZhID0gdmE7Ci0JCVRBSUxRX0lOU0VSVF9U
QUlMKCZtLT5tZC5wdl9saXN0LCBwdiwgcHZfbGlzdCk7CisJCVRBSUxRX0lOU0VSVF9UQUlMKCZt
LT5tZC5wdl9saXN0LCBwdiwgcHZfbmV4dCk7CiAJCW5ld3B0ZSB8PSBQVEVfTUFOQUdFRDsKIAkJ
aWYgKCFwdGVfdGVzdCgmbmV3cHRlLCBQVEVfUk8pKQogCQkJdm1fcGFnZV9hZmxhZ19zZXQobSwg
UEdBX1dSSVRFQUJMRSk7CkBAIC0yMTYwLDcgKzIxNjcsNyBAQAogCSAqLwogCWlmIChvcmlncHRl
ICE9IG5ld3B0ZSkgewogCQkqcHRlID0gbmV3cHRlOwotCQlpZiAocHRlX3Rlc3QoJm9yaWdwdGUs
IFBURV9WKSkgeworCQlpZiAocHRlX3Rlc3QoJm9yaWdwdGUsIFBURV9WQUxJRCkpIHsKIAkJCWlm
IChwdGVfdGVzdCgmb3JpZ3B0ZSwgUFRFX01BTkFHRUQpICYmIG9wYSAhPSBwYSkgewogCQkJCWlm
IChvbS0+bWQucHZfZmxhZ3MgJiBQVl9UQUJMRV9SRUYpCiAJCQkJCXZtX3BhZ2VfYWZsYWdfc2V0
KG9tLCBQR0FfUkVGRVJFTkNFRCk7CkBAIC0yMjY4LDcgKzIyNzUsNyBAQAogCX0KIAogCXB0ZSA9
IHBtYXBfcHRlKHBtYXAsIHZhKTsKLQlpZiAocHRlX3Rlc3QocHRlLCBQVEVfVikpIHsKKwlpZiAo
cHRlX3Rlc3QocHRlLCBQVEVfVkFMSUQpKSB7CiAJCWlmIChtcHRlICE9IE5VTEwpIHsKIAkJCW1w
dGUtPndpcmVfY291bnQtLTsKIAkJCW1wdGUgPSBOVUxMOwpAQCAtMjI5OCw3ICsyMzA1LDcgQEAK
IAkvKgogCSAqIE5vdyB2YWxpZGF0ZSBtYXBwaW5nIHdpdGggUk8gcHJvdGVjdGlvbgogCSAqLwot
CSpwdGUgPSBQVEVfUk8gfCBUTEJMT19QQV9UT19QRk4ocGEpIHwgUFRFX1Y7CisJKnB0ZSA9IFBU
RV9STyB8IFRMQkxPX1BBX1RPX1BGTihwYSkgfCBQVEVfVkFMSUQ7CiAJaWYgKChtLT5vZmxhZ3Mg
JiBWUE9fVU5NQU5BR0VEKSA9PSAwKQogCQkqcHRlIHw9IFBURV9NQU5BR0VEOwogCkBAIC0yMzU2
LDcgKzIzNjMsNyBAQAogCQljcHUgPSBQQ1BVX0dFVChjcHVpZCk7CiAJCXN5c20gPSAmc3lzbWFw
X2xtZW1bY3B1XTsKIAkJLyogU2luY2UgdGhpcyBpcyBmb3IgdGhlIGRlYnVnZ2VyLCBubyBsb2Nr
cyBvciBhbnkgb3RoZXIgZnVuICovCi0JCW5wdGUgPSBUTEJMT19QQV9UT19QRk4ocGEpIHwgUFRF
X0NfQ0FDSEUgfCBQVEVfRCB8IFBURV9WIHwKKwkJbnB0ZSA9IFRMQkxPX1BBX1RPX1BGTihwYSkg
fCBQVEVfQ19DQUNIRSB8IFBURV9EIHwgUFRFX1ZBTElEIHwKIAkJICAgIFBURV9HOwogCQlwdGUg
PSBwbWFwX3B0ZShrZXJuZWxfcG1hcCwgc3lzbS0+YmFzZSk7CiAJCSpwdGUgPSBucHRlOwpAQCAt
MjQ4NCw3ICsyNDkxLDcgQEAKIAkJCXZhX25leHQgPSBldmE7CiAJCWZvciAocHRlID0gcG1hcF9w
ZGVfdG9fcHRlKHBkZSwgc3ZhKTsgc3ZhICE9IHZhX25leHQ7IHB0ZSsrLAogCQkgICAgc3ZhICs9
IFBBR0VfU0laRSkgewotCQkJaWYgKCFwdGVfdGVzdChwdGUsIFBURV9WKSkKKwkJCWlmICghcHRl
X3Rlc3QocHRlLCBQVEVfVkFMSUQpKQogCQkJCWNvbnRpbnVlOwogCQkJaWYgKCFwdGVfdGVzdChw
dGUsIFBURV9XKSkKIAkJCQlwYW5pYygicG1hcF91bndpcmU6IHB0ZSAlI2p4IGlzIG1pc3Npbmcg
UEdfVyIsCkBAIC0yNzE5LDcgKzI3MjYsNyBAQAogCSAgICAoInBtYXBfcGFnZV9leGlzdHNfcXVp
Y2s6IHBhZ2UgJXAgaXMgbm90IG1hbmFnZWQiLCBtKSk7CiAJcnYgPSBGQUxTRTsKIAlyd193bG9j
aygmcHZoX2dsb2JhbF9sb2NrKTsKLQlUQUlMUV9GT1JFQUNIKHB2LCAmbS0+bWQucHZfbGlzdCwg
cHZfbGlzdCkgeworCVRBSUxRX0ZPUkVBQ0gocHYsICZtLT5tZC5wdl9saXN0LCBwdl9uZXh0KSB7
CiAJCWlmIChQVl9QTUFQKHB2KSA9PSBwbWFwKSB7CiAJCQlydiA9IFRSVUU7CiAJCQlicmVhazsK
QEAgLTI3MzMsNiArMjc0MCwxNiBAQAogfQogCiAvKgorICogUmV0dXJucyBUUlVFIGlmIHRoZSBn
aXZlbiBwYWdlIGlzIG1hcHBlZC4KKyAqLworYm9vbGVhbl90CitwbWFwX3BhZ2VfaXNfbWFwcGVk
KHZtX3BhZ2VfdCBtKQoreworCisJCXJldHVybiAoIVRBSUxRX0VNUFRZKCYobSktPm1kLnB2X2xp
c3QpKTsKK30KKworLyoKICAqIFJlbW92ZSBhbGwgcGFnZXMgZnJvbSBzcGVjaWZpZWQgYWRkcmVz
cyBzcGFjZQogICogdGhpcyBhaWRzIHByb2Nlc3MgZXhpdCBzcGVlZHMuICBBbHNvLCB0aGlzIGNv
ZGUKICAqIGlzIHNwZWNpYWwgY2FzZWQgZm9yIGN1cnJlbnQgcHJvY2VzcyBvbmx5LCBidXQKQEAg
LTI3NzIsNyArMjc4OSw3IEBACiAJCQkJS0FTU0VSVChwZGUgIT0gTlVMTCAmJiAqcGRlICE9IDAs
CiAJCQkJICAgICgicG1hcF9yZW1vdmVfcGFnZXM6IHBkZSIpKTsKIAkJCQlwdGUgPSBwbWFwX3Bk
ZV90b19wdGUocGRlLCBwdi0+cHZfdmEpOwotCQkJCWlmICghcHRlX3Rlc3QocHRlLCBQVEVfVikp
CisJCQkJaWYgKCFwdGVfdGVzdChwdGUsIFBURV9WQUxJRCkpCiAJCQkJCXBhbmljKCJwbWFwX3Jl
bW92ZV9wYWdlczogYmFkIHB0ZSIpOwogCQkJCXRwdGUgPSAqcHRlOwogCkBAIC0yODAyLDcgKzI4
MTksNyBAQAogCQkJCXB2X2VudHJ5X2NvdW50LS07CiAJCQkJcGMtPnBjX21hcFtmaWVsZF0gfD0g
Yml0bWFzazsKIAkJCQlwbWFwLT5wbV9zdGF0cy5yZXNpZGVudF9jb3VudC0tOwotCQkJCVRBSUxR
X1JFTU9WRSgmbS0+bWQucHZfbGlzdCwgcHYsIHB2X2xpc3QpOworCQkJCVRBSUxRX1JFTU9WRSgm
bS0+bWQucHZfbGlzdCwgcHYsIHB2X25leHQpOwogCQkJCWlmIChUQUlMUV9FTVBUWSgmbS0+bWQu
cHZfbGlzdCkpCiAJCQkJCXZtX3BhZ2VfYWZsYWdfY2xlYXIobSwgUEdBX1dSSVRFQUJMRSk7CiAJ
CQkJcG1hcF91bnVzZV9wdChwbWFwLCBwdi0+cHZfdmEsICpwZGUpOwpAQCAtMjgzMyw3ICsyODUw
LDcgQEAKIAkJcmV0dXJuIChydik7CiAKIAlyd19hc3NlcnQoJnB2aF9nbG9iYWxfbG9jaywgUkFf
V0xPQ0tFRCk7Ci0JVEFJTFFfRk9SRUFDSChwdiwgJm0tPm1kLnB2X2xpc3QsIHB2X2xpc3QpIHsK
KwlUQUlMUV9GT1JFQUNIKHB2LCAmbS0+bWQucHZfbGlzdCwgcHZfbmV4dCkgewogCQlwbWFwID0g
UFZfUE1BUChwdik7CiAJCVBNQVBfTE9DSyhwbWFwKTsKIAkJcHRlID0gcG1hcF9wdGUocG1hcCwg
cHYtPnB2X3ZhKTsKQEAgLTI4NjMsNyArMjg4MCw3IEBACiAJaWYgKChtLT5vZmxhZ3MgJiBWUE9f
VU5NQU5BR0VEKSAhPSAwKQogCQlyZXR1cm4gKGNvdW50KTsKIAlyd193bG9jaygmcHZoX2dsb2Jh
bF9sb2NrKTsKLQlUQUlMUV9GT1JFQUNIKHB2LCAmbS0+bWQucHZfbGlzdCwgcHZfbGlzdCkgewor
CVRBSUxRX0ZPUkVBQ0gocHYsICZtLT5tZC5wdl9saXN0LCBwdl9uZXh0KSB7CiAJCXBtYXAgPSBQ
Vl9QTUFQKHB2KTsKIAkJUE1BUF9MT0NLKHBtYXApOwogCQlwdGUgPSBwbWFwX3B0ZShwbWFwLCBw
di0+cHZfdmEpOwpAQCAtMjg5NywxMSArMjkxNCwxMSBAQAogCWlmICghdm1fcGFnZV94YnVzaWVk
KG0pICYmIChtLT5hZmxhZ3MgJiBQR0FfV1JJVEVBQkxFKSA9PSAwKQogCQlyZXR1cm47CiAJcndf
d2xvY2soJnB2aF9nbG9iYWxfbG9jayk7Ci0JVEFJTFFfRk9SRUFDSChwdiwgJm0tPm1kLnB2X2xp
c3QsIHB2X2xpc3QpIHsKKwlUQUlMUV9GT1JFQUNIKHB2LCAmbS0+bWQucHZfbGlzdCwgcHZfbmV4
dCkgewogCQlwbWFwID0gUFZfUE1BUChwdik7CiAJCVBNQVBfTE9DSyhwbWFwKTsKIAkJcHRlID0g
cG1hcF9wdGUocG1hcCwgcHYtPnB2X3ZhKTsKLQkJS0FTU0VSVChwdGUgIT0gTlVMTCAmJiBwdGVf
dGVzdChwdGUsIFBURV9WKSwKKwkJS0FTU0VSVChwdGUgIT0gTlVMTCAmJiBwdGVfdGVzdChwdGUs
IFBURV9WQUxJRCksCiAJCSAgICAoInBhZ2Ugb24gcHZfbGlzdCBoYXMgbm8gcHRlIikpOwogCQlw
Yml0cyA9ICpwdGU7CiAJCWlmIChwdGVfdGVzdCgmcGJpdHMsIFBURV9EKSkgewpAQCAtMzA0MCw3
ICszMDU3LDcgQEAKIAkJdmEgPSB2YV9uZXh0OwogCQlmb3IgKHB0ZSA9IHBtYXBfcGRlX3RvX3B0
ZShwZGUsIHN2YSk7IHN2YSAhPSB2YV9uZXh0OyBwdGUrKywKIAkJICAgIHN2YSArPSBQQUdFX1NJ
WkUpIHsKLQkJCWlmICghcHRlX3Rlc3QocHRlLCBQVEVfTUFOQUdFRCB8IFBURV9WKSkgeworCQkJ
aWYgKCFwdGVfdGVzdChwdGUsIFBURV9NQU5BR0VEIHwgUFRFX1ZBTElEKSkgewogCQkJCWlmICh2
YSAhPSB2YV9uZXh0KSB7CiAJCQkJCXBtYXBfaW52YWxpZGF0ZV9yYW5nZShwbWFwLCB2YSwgc3Zh
KTsKIAkJCQkJdmEgPSB2YV9uZXh0OwpAQCAtMzEwNiw3ICszMTIzLDcgQEAKIAlpZiAoKG0tPmFm
bGFncyAmIFBHQV9XUklURUFCTEUpID09IDApCiAJCXJldHVybjsKIAlyd193bG9jaygmcHZoX2ds
b2JhbF9sb2NrKTsKLQlUQUlMUV9GT1JFQUNIKHB2LCAmbS0+bWQucHZfbGlzdCwgcHZfbGlzdCkg
eworCVRBSUxRX0ZPUkVBQ0gocHYsICZtLT5tZC5wdl9saXN0LCBwdl9uZXh0KSB7CiAJCXBtYXAg
PSBQVl9QTUFQKHB2KTsKIAkJUE1BUF9MT0NLKHBtYXApOwogCQlwdGUgPSBwbWFwX3B0ZShwbWFw
LCBwdi0+cHZfdmEpOwpAQCAtMzE5NCw2ICszMjExLDMxIEBACiB9CiAKIC8qCisgKiBTZXRzIHRo
ZSBtZW1vcnkgYXR0cmlidXRlIGZvciB0aGUgc3BlY2lmaWVkIHBhZ2UuCisgKi8KK3ZvaWQKK3Bt
YXBfcGFnZV9zZXRfbWVtYXR0cih2bV9wYWdlX3QgbSwgdm1fbWVtYXR0cl90IG1hKQoreworCisJ
CS8qCisJCSAqIFNldCB0aGUgbWVtYXR0ciBmaWVsZCBzbyB0aGUgYXBwcm9wcmlhdGUgYml0cyBh
cmUgc2V0IGluIHRoZQorCQkgKiBQVEUgYXMgbWFwcGluZ3MgYXJlIGNyZWF0ZWQuCisJCSAqLwor
CQltLT5tZC5wdl9tZW1hdHRyID0gbWE7CisKKwkJLyoKKwkJICogSXQgaXMgYXNzdW1lZCB0aGF0
IHRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgYmVmb3JlIGFueSBtYXBwaW5ncworCQkgKiBh
cmUgZXN0YWJsaXNoZWQuICBJZiB0aGlzIGlzIG5vdCB0aGUgY2FzZSB0aGVuIHRoaXMgZnVuY3Rp
b24gd2lsbAorCQkgKiBuZWVkIHRvIHdhbGsgdGhlIHB2X2xpc3QgYW5kIG1ha2UgZWFjaCBvZiB0
aGUgZXhpc3RpbmcgbWFwcGluZ3MKKwkJICogdW5jYWNoZWFibGUsIHN5bmMgdGhlIGNhY2hlICh3
aXRoIG1pcHNfaWNhY2hlX3N5bmNfYWxsKCkgYW5kCisJCSAqIG1pcHNfZGNhY2hlX3diaW52X2Fs
bCgpKSBhbmQgbW9zdCBsaWtlbHkgaW52YWxpZGF0ZSBUTEIgZW50cmllcyBmb3IKKwkJICogYW55
IG9mIHRoZSBjdXJyZW50IG1hcHBpbmdzIGl0IG1vZGlmaWVzLgorCQkgKi8KKwkJaWYgKFRBSUxR
X0ZJUlNUKCZtLT5tZC5wdl9saXN0KSAhPSBOVUxMKQorCQkJCXBhbmljKCJDYW4ndCBjaGFuZ2Ug
bWVtYXR0ciBvbiBwYWdlIHdpdGggZXhpc3RpbmcgbWFwcGluZ3MiKTsKK30KKworLyoKICAqIHBl
cmZvcm0gdGhlIHBtYXAgd29yayBmb3IgbWluY29yZQogICovCiBpbnQKQEAgLTMyMDgsNyArMzI1
MCw3IEBACiByZXRyeToKIAlwdGVwID0gcG1hcF9wdGUocG1hcCwgYWRkcik7CiAJcHRlID0gKHB0
ZXAgIT0gTlVMTCkgPyAqcHRlcCA6IDA7Ci0JaWYgKCFwdGVfdGVzdCgmcHRlLCBQVEVfVikpIHsK
KwlpZiAoIXB0ZV90ZXN0KCZwdGUsIFBURV9WQUxJRCkpIHsKIAkJdmFsID0gMDsKIAkJZ290byBv
dXQ7CiAJfQpAQCAtMzM0NSw3ICszMzg3LDcgQEAKICNlbmRpZgogCQkJZm9yIChrID0gMDsgayA8
IE5QVEVQRzsgaysrKSB7CiAJCQkJcHRlID0gcGRlW2tdOwotCQkJCWlmIChwdGUgPT0gMCB8fCAh
cHRlX3Rlc3QoJnB0ZSwgUFRFX1YpKQorCQkJCWlmIChwdGUgPT0gMCB8fCAhcHRlX3Rlc3QoJnB0
ZSwgUFRFX1ZBTElEKSkKIAkJCQkJY29udGludWU7CiAJCQkJcGEgPSBUTEJMT19QVEVfVE9fUEEo
cHRlKTsKIAkJCQl2YSA9ICgodV9sb25nKWkgPDwgU0VHU0hJRlQpIHwgKGogPDwgUERSU0hJRlQp
IHwgKGsgPDwgUEFHRV9TSElGVCk7CkBAIC0zMzkzLDE1ICszNDM1LDE1IEBACiAJcHRfZW50cnlf
dCBydzsKIAogCWlmICghKHByb3QgJiBWTV9QUk9UX1dSSVRFKSkKLQkJcncgPSBQVEVfViB8IFBU
RV9STzsKKwkJcncgPSBQVEVfVkFMSUQgfCBQVEVfUk87CiAJZWxzZSBpZiAoKG0tPm9mbGFncyAm
IFZQT19VTk1BTkFHRUQpID09IDApIHsKIAkJaWYgKChhY2Nlc3MgJiBWTV9QUk9UX1dSSVRFKSAh
PSAwKQotCQkJcncgPSBQVEVfViB8IFBURV9EOworCQkJcncgPSBQVEVfVkFMSUQgfCBQVEVfRDsK
IAkJZWxzZQotCQkJcncgPSBQVEVfVjsKKwkJCXJ3ID0gUFRFX1ZBTElEOwogCX0gZWxzZQogCQkv
KiBOZWVkbid0IGVtdWxhdGUgYSBtb2RpZmllZCBiaXQgZm9yIHVubWFuYWdlZCBwYWdlcy4gKi8K
LQkJcncgPSBQVEVfViB8IFBURV9EOworCQlydyA9IFBURV9WQUxJRCB8IFBURV9EOwogCXJldHVy
biAocncpOwogfQogCkBAIC0zNDI0LDEzICszNDY2LDEzIEBACiAJCXBhbmljKCJwbWFwX2VtdWxh
dGVfbW9kaWZpZWQ6IGNhbid0IGZpbmQgUFRFIik7CiAjaWZkZWYgU01QCiAJLyogSXQgaXMgcG9z
c2libGUgdGhhdCBzb21lIG90aGVyIENQVSBjaGFuZ2VkIG0tYml0ICovCi0JaWYgKCFwdGVfdGVz
dChwdGUsIFBURV9WKSB8fCBwdGVfdGVzdChwdGUsIFBURV9EKSkgeworCWlmICghcHRlX3Rlc3Qo
cHRlLCBQVEVfVkFMSUQpIHx8IHB0ZV90ZXN0KHB0ZSwgUFRFX0QpKSB7CiAJCXRsYl91cGRhdGUo
cG1hcCwgdmEsICpwdGUpOwogCQlQTUFQX1VOTE9DSyhwbWFwKTsKIAkJcmV0dXJuICgwKTsKIAl9
CiAjZWxzZQotCWlmICghcHRlX3Rlc3QocHRlLCBQVEVfVikgfHwgcHRlX3Rlc3QocHRlLCBQVEVf
RCkpCisJaWYgKCFwdGVfdGVzdChwdGUsIFBURV9WQUxJRCkgfHwgcHRlX3Rlc3QocHRlLCBQVEVf
RCkpCiAJCXBhbmljKCJwbWFwX2VtdWxhdGVfbW9kaWZpZWQ6IGludmFsaWQgcHRlIik7CiAjZW5k
aWYKIAlpZiAocHRlX3Rlc3QocHRlLCBQVEVfUk8pKSB7CkBAIC0zNDQ2LDYgKzM0ODgsMTggQEAK
IH0KIAogLyoKKyAqIHBtYXBfZW11bGF0ZV9yZWZlcmVuY2VkCisgKgorICogUmVmZXJlbmNlIGJp
dCBlbXVsYXRpb24gaXMgbm90IHN1cHBvcnRlZCBpbiB0aGlzIHBtYXAgaW1wbGVtZW50YXRpb24u
CisgKi8KK2ludAorcG1hcF9lbXVsYXRlX3JlZmVyZW5jZWQocG1hcF90IHBtYXAsIHZtX29mZnNl
dF90IHZhKQoreworCisJCXJldHVybiAoMSk7Cit9CisKKy8qCiAgKglSb3V0aW5lOglwbWFwX2tl
eHRyYWN0CiAgKglGdW5jdGlvbjoKICAqCQlFeHRyYWN0IHRoZSBwaHlzaWNhbCBwYWdlIGFkZHJl
c3MgYXNzb2NpYXRlZApAQCAtMzUyMiw3ICszNTc2LDcgQEAKIAogCWlmIChtICE9IE5VTEwpIHsK
IAkJZm9yIChwdiA9IFRBSUxRX0ZJUlNUKCZtLT5tZC5wdl9saXN0KTsgcHY7Ci0JCSAgICBwdiA9
IFRBSUxRX05FWFQocHYsIHB2X2xpc3QpKSB7CisJCSAgICBwdiA9IFRBSUxRX05FWFQocHYsIHB2
X25leHQpKSB7CiAJCQltaXBzX2RjYWNoZV93Ymludl9yYW5nZV9pbmRleChwdi0+cHZfdmEsIFBB
R0VfU0laRSk7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9zeXMvbWlwcy9taXBzL21pbmlkdW1wX21h
Y2hkZXAuYyBiL3N5cy9taXBzL21pcHMvbWluaWR1bXBfbWFjaGRlcC5jCi0tLSBhL3N5cy9taXBz
L21pcHMvbWluaWR1bXBfbWFjaGRlcC5jCisrKyBiL3N5cy9taXBzL21pcHMvbWluaWR1bXBfbWFj
aGRlcC5jCkBAIC0xNzksNyArMTc5LDcgQEAKIAkJcHRlID0gcG1hcF9wdGUoa2VybmVsX3BtYXAs
IHZhKTsKIAkJS0FTU0VSVChwdGUgIT0gTlVMTCwgKCJwdGUgZm9yICVqeCBpcyBOVUxMIiwgKHVp
bnRtYXhfdCl2YSkpOwogCQlmb3IgKGkgPSAwOyBpIDwgTlBURVBHOyBpKyspIHsKLQkJCWlmIChw
dGVfdGVzdCgmcHRlW2ldLCBQVEVfVikpIHsKKwkJCWlmIChwdGVfaXNfdmFsaWQoJnB0ZVtpXSkp
IHsKIAkJCQlwYSA9IFRMQkxPX1BURV9UT19QQShwdGVbaV0pOwogCQkJCWlmIChpc19kdW1wYWJs
ZShwYSkpCiAJCQkJCWR1bXBfYWRkX3BhZ2UocGEpOwpkaWZmIC0tZ2l0IGEvc3lzL21pcHMvbWlw
cy9tYWNoZGVwLmMgYi9zeXMvbWlwcy9taXBzL21hY2hkZXAuYwotLS0gYS9zeXMvbWlwcy9taXBz
L21hY2hkZXAuYworKysgYi9zeXMvbWlwcy9taXBzL21hY2hkZXAuYwpAQCAtMjgzLDkgKzI4Myw5
IEBACiAjZW5kaWYKIAlwcm9jX2xpbmt1cDAoJnByb2MwLCAmdGhyZWFkMCk7CiAKLQlLQVNTRVJU
KChrc3RhY2swICYgUEFHRV9NQVNLKSA9PSAwLAotCQkoImtzdGFjazAgaXMgbm90IGFsaWduZWQg
b24gYSBwYWdlIGJvdW5kYXJ5OiAweCUwbHgiLAotCQkobG9uZylrc3RhY2swKSk7CisJS0FTU0VS
VCgoa3N0YWNrMCAmICgoS1NUQUNLX1BBR0VfU0laRSAqIDIpIC0gMSkpID09IDAsCisJCSgia3N0
YWNrMCBpcyBub3QgYWxpZ25lZCBvbiBhIHBhZ2UgKDB4JTBseCkgYm91bmRhcnk6IDB4JTBseCIs
CisJCShsb25nKShLU1RBQ0tfUEFHRV9TSVpFICogMiksIChsb25nKWtzdGFjazApKTsKIAl0aHJl
YWQwLnRkX2tzdGFjayA9IGtzdGFjazA7CiAJdGhyZWFkMC50ZF9rc3RhY2tfcGFnZXMgPSBLU1RB
Q0tfUEFHRVM7CiAJLyogCkBAIC00NTksNyArNDU5LDcgQEAKIAkgKiBXZSB1c2UgYSB3aXJlZCB0
bGIgaW5kZXggdG8gZG8gdGhpcyBvbmUtdGltZSBtYXBwaW5nLgogCSAqLwogCXBhID0gdnRvcGh5
cyhwY3B1KTsKLQlwdGUgPSBQVEVfRCB8IFBURV9WIHwgUFRFX0cgfCBQVEVfQ19DQUNIRTsKKwlw
dGUgPSBQVEVfRCB8IFBURV9WQUxJRCB8IFBURV9SRUYgfCBQVEVfRyB8IFBURV9DX0NBQ0hFOwog
CXRsYl9pbnNlcnRfd2lyZWQoUENQVV9UTEJfRU5UUlksICh2bV9vZmZzZXRfdClwY3B1cCwKIAkJ
CSBUTEJMT19QQV9UT19QRk4ocGEpIHwgcHRlLAogCQkJIFRMQkxPX1BBX1RPX1BGTihwYSArIFBB
R0VfU0laRSkgfCBwdGUpOwpkaWZmIC0tZ2l0IGEvc3lzL21pcHMvbWlwcy9nZW5hc3N5bS5jIGIv
c3lzL21pcHMvbWlwcy9nZW5hc3N5bS5jCi0tLSBhL3N5cy9taXBzL21pcHMvZ2VuYXNzeW0uYwor
KysgYi9zeXMvbWlwcy9taXBzL2dlbmFzc3ltLmMKQEAgLTEwMiw2ICsxMDIsOSBAQAogQVNTWU0o
VERGX0FTVFBFTkRJTkcsIFRERl9BU1RQRU5ESU5HKTsKIEFTU1lNKE1BWENPTUxFTiwgTUFYQ09N
TEVOKTsKIEFTU1lNKE1EVERfQ09QMlVTRUQsIE1EVERfQ09QMlVTRUQpOworI2lmZGVmIEtTVEFD
S19MQVJHRV9QQUdFCitBU1NZTShLU1RBQ0tfVExCTUFTS19NQVNLLCBLU1RBQ0tfVExCTUFTS19N
QVNLKTsKKyNlbmRpZgogCiBBU1NZTShNSVBTX0tTRUcwX1NUQVJULCBNSVBTX0tTRUcwX1NUQVJU
KTsKIEFTU1lNKE1JUFNfS1NFRzFfU1RBUlQsIE1JUFNfS1NFRzFfU1RBUlQpOwpkaWZmIC0tZ2l0
IGEvc3lzL21pcHMvbWlwcy9leGNlcHRpb24uUyBiL3N5cy9taXBzL21pcHMvZXhjZXB0aW9uLlMK
LS0tIGEvc3lzL21pcHMvbWlwcy9leGNlcHRpb24uUworKysgYi9zeXMvbWlwcy9taXBzL2V4Y2Vw
dGlvbi5TCkBAIC04NSw2ICs4NSwyOCBAQAogICovCiAjZGVmaW5lCUlOVFJDTlRfQ09VTlQJMjU2
CiAKKy8qCisgKiBHZW5lcmFsIE1JUFMgQ1BVIHN0YXRlIGZvciBleGNlcHRpb25zOgorICoKKyAq
IEVQQyBSZWdpc3RlciB3aWxsIHBvaW50IHRvIHRoZSBpbnN0cnVjdGlvbiB0aGF0IGNhdXNlZCBm
YXVsdCwgdW5sZXNzIHRoZQorICogZmF1bHRpbmcgaW5zdHJ1Y3Rpb24gd2FzIGluIGEgYnJhbmNo
IGRlbGF5IHNsb3QuICBJbiB0aGF0IGNhc2UsIGl0IHdpbGwKKyAqIHBvaW50IHRvIHRoZSBicmFu
Y2ggYmVmb3JlIHRoZSBicmFuY2ggZGVsYXkgc2xvdCBpbnN0cnVjdGlvbi4KKyAqCisgKiBUaGUg
Y2F1c2UgcmVnaXN0ZXIgd2lsbCBjb250YWluIHdoYXQgY2F1c2VkIHRoZSBleGNlcHRpb24gYW5k
IHNvbWUgc3RhdGUKKyAqIGFib3V0IHRoZSBpbnRlcnJ1cHQuCisgKgorICogVGhlIHN0YXR1cyBy
ZWdpc3RlciBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RhdHVzIG9mIHRoZSBDUFUg
c3VjaAorICogYXM6IEtlcm5lbC9Vc2VyIG1vZGUgYml0LCBpbnRlcnJ1cHQgZW5hYmxlIGJpdC4K
KyAqCisgKiBUaGUgQmFkVmFkZHIgcmVnaXN0ZXIgY29udGFpbnMgdGhlIHZpcnR1YWwgYWRkcmVz
cyB0aGF0IGNhdXNlIHRoZSBsYXN0CisgKiBleGNlcHRpb24uCisgKgorICogVGhlIENvbnRleHQg
cmVnaXN0ZXIgY29udGFpbnMgdGhlIGxvd2VyIDIyIGJpdHMgb2YgdGhlIFZQTiAoc3RhcnRpbmcg
YXQKKyAqIGJpdCA0KSB0aGF0IGNhdXNlIHRoZSBsYXN0IGV4Y2VwdGlvbiBleGNlcHQgYml0MCBh
bmQgYml0MSBhcmUgemVyby4gVGhlCisgKiB1cHBlciBiaXRzIChiaXRzIDIzIHRvIDMxIGZvciBN
SVBTMzIgYW5kIGJpdHMgMjMgdG8gNjMpIGFyZSBzZXQgdW5kZXIKKyAqIGtlcm5lbCBjb250cm9s
IChpLmUuIHBvaW50IHRvIHRoZSBwYWdlIHRhYmxlKS4gVGhlIENvbnRleHQvWENvbnRleHQKKyAq
IHJlZ2lzdGVycyBhcmUgbm90IGN1cnJlbnRseSB1c2VkIGJ5IEZyZWVCU0QuCisgKi8KIAogLyoK
ICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTEwLDEzICsxMzIsMjcgQEAKIC8qCiAgKi0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0KICAqCi0gKiBNaXBzRG9UTEJNaXNzIC0tCisgKiBNaXBzRG9UTEJNaXNz
IC0tICAoVVRMQiBtaXNzKQogICoKLSAqIFRoaXMgaXMgdGhlIHJlYWwgVExCIE1pc3MgSGFuZGxl
ciBjb2RlLgorICogVGhpcyBpcyB0aGUgcmVhbCBUTEIgTWlzcyBIYW5kbGVyIGNvZGUuICBBIG1p
c3Mgd2FzIGdlbmVyYXRlZCB3aGVuIHRoZQorICogYWNjZXNzIGlzIHRvIGt1c2VnIGFuZCB0aGVy
ZSB3YXMgbm90IG1hdGNoaW5nIG1hcHBpbmcgbG9hZGVkIGludG8gdGhlIFRMQi4KICAqICdzZWdi
YXNlJyBwb2ludHMgdG8gdGhlIGJhc2Ugb2YgdGhlIHNlZ21lbnQgdGFibGUgZm9yIHVzZXIgcHJv
Y2Vzc2VzLgogICoKKyAqIFRoZSBDUFUgZG9lcyB0aGUgZm9sbG93aW5nIGZvciBhbiBVVExCIG1p
c3M6CisgKiAtIFNldHMgdGhlIEVQQyByZWdpc3Rlci4KKyAqIC0gU2V0cyB0aGUgQ2F1c2UgcmVn
aXN0ZXIuCisgKiAtIFNldHMgdGhlIFN0YXR1cyByZWdpc3Rlci4gU2hpZnRzIEsvVSBhbmQgSUUg
Yml0cyBvdmVyIG9uZSBhbmQgY2xlYXJzCisgKiAgIHRoZSBjdXJyZW50IEtlcm5lbC9Vc2VyIGFu
ZCBJbnRlcnJ1cHQgRW5hYmxlIGJpdHMuIFNvIHRoZSBwcm9jZXNzb3IKKyAqICAgaXMgaW4ga2Vy
bmVsIG1vZGUgd2l0aCB0aGUgaW50ZXJ1cHRzIHR1cm5lZCBvZmYuCisgKiAtIFNldHMgQmFkVmFk
ZHIgcmVnaXN0ZXIuCisgKiAtIFNldHMgdGhlIENvbnRleHQvWENvbnRleHQgcmVnaXN0ZXIocyku
CisgKiAtIFNldHMgdGhlIFRMQiBFbnRyeUhpIHJlZ2lzdGVyIHRvIGNvbnRhaW4gVlBOIG9mIHRo
ZSBmYXVsdGluZyBhZGRyZXNzLgorICoKICAqIERvbid0IGNoZWNrIGZvciBpbnZhbGlkIHB0ZSdz
IGhlcmUuIFdlIGxvYWQgdGhlbSBhcyB3ZWxsIGFuZAogICogbGV0IHRoZSBwcm9jZXNzb3IgdHJh
cCB0byBsb2FkIHRoZSBjb3JyZWN0IHZhbHVlIGFmdGVyIHNlcnZpY2UuCisgKgorICogWFhYIFRo
aXMgcmVhbGx5IG5lZWRzIHRvIGJlIGNoYW5nZWQgdG8gYSBsaW5lYXIgcGFnZSB0YWJsZSBhbmQg
dXNlIHRoZQorICogQ29udGV4dCBhbmQgWENvbnRleHQgcmVnaXN0ZXJzLiAgVGhhdCBpcyByZWFs
bHkgd2hhdCBpdCB3YXMgZGVzaWduZWQgZm9yLgogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8K
ICAJLnNldCBwdXNoCkBAIC0xMzcsMjUgKzE3Myw4OSBAQAogI2lmZGVmIF9fbWlwc19uNjQKIAlQ
VFJfU1JMCQlrMCwgUERSU0hJRlQgLSBQVFJTSElGVAkJIyBrMD1WUE4KIAlhbmRpCQlrMCwgazAs
IFBERVBUUk1BU0sJCSMgazA9cGRlIG9mZnNldAotCVBUUl9BRERVCWsxLCBrMCwgazEJCQkjIGsx
PXBkZSBlbnRyeSBhZGRyZXNzCi0JUFRSX0wJCWsxLCAwKGsxKQkJCSMgazE9cGRlIGVudHJ5Ci0J
TUZDMAkJazAsIE1JUFNfQ09QXzBfQkFEX1ZBRERSCSMgazA9YmFkIGFkZHJlc3MgKGFnYWluKQor
CVBUUl9BRERVCWswLCBrMCwgazEJCQkjIGsxPXBkZSBlbnRyeSBhZGRyZXNzCisJUFRSX0wJCWsx
LCAwKGswKQkJCSMgazE9cGRlIGVudHJ5CiAJYmVxCQlrMSwgemVybywgMmYJCQkjID09MCAtLSBu
byBwYWdlIHRhYmxlCisJbm9wCisKKyNpZmRlZiBNSVBTNjRfTkVXX1BNQVAKKwkjIENoZWNrIGZv
ciBzdXBlcnBhZ2UKKwlHRVRfU1VQRVJQQUdFX0lEWChrMSkJCQkJIyBrMT1zdXBlcnBhZ2UgaW5k
ZXggZnJvbSBQVEUKKwliZXEJCWsxLCB6ZXJvLCBub3Rfc3VwZXJwYWdlCQkjID09MCAtLSBub3Qg
c3VwZXJwYWdlCisJUFRSX0wJCWsxLCAwKGswKQkJCSMgazE9cGRlIGVudHJ5IChkZWxheSBzbG90
KQorCisJIyBTZXQgdGhlIHJlZmVyZW5jZWQgYml0IGluIHRoZSBQREUgaWYgdmFsaWQuCisJIwor
CSMgWFhYIFNldHRpbmcgdGhlIHJlZmVyZW5jZWQgYml0IGhlcmUgc2F2ZXMgYSBmYXVsdCBsYXRl
ciBidXQgaXQKKwkjIG1heSBub3QgYmUgc2FmZSB0byBkbyBzby4gVGhlcmVmb3JlLCBqdXN0IHRh
a2UgdGhlIGZhdWx0IHRvIHNldAorCSMgdGhlIHJlZmVyZW5jZSBiaXQuCisjCUlGX1ZBTElEX1NF
VF9SRUZCSVQoazEsIGswLCAwLCAxKQorCisJIyBUaGUgUERFIGlzIGFjdHVhbGx5IGEgc3VwZXJw
YWdlIFBURS4gIFN0b3JlIGl0IGluIHRoZSBUTEIgbG8wIHJlZy4KKwlDTEVBUl9QVEVfU1dCSVRT
KGsxKQorCVBURV9NVEMwCWsxLCBNSVBTX0NPUF8wX1RMQl9MTzAJCSMgbG8wIGlzIGxvYWRlZAor
CUNPUDBfU1lOQworCisJIyBDb21wdXRlIHRoZSBQRk4gZm9yIHRoZSBUTEIgbG8xIHJlZ2lzdGVy
IGZyb20gazEoPVBURSBmb3IgVExCIGxvMCkuCisJR0VUX09ERF8xTV9QRk5fRlJPTV9FVkVOKGsx
KQkJCSMgazE9T2RkIFBGTiBpbiBQVEUgcG9zdGlvbgorCisJIyBHZXQgaGFyZCBUTEIgZmxhZyBi
aXRzLgorCVBUUl9MCQlrMCwgMChrMCkJCQkjIGswPXBkZSBlbnRyeSAoYWdhaW4pCisJR0VUX0hX
X1RMQl9GTEFHUyhrMCkJCQkJIyBrMD1odyBUTEIgZmxhZyBiaXRzCisJb3IJCWsxLCBrMSwgazAJ
CQkjIGsxPVBURT1QRk4gfCBod2ZsZyBiaXRzCisJIyBMb2FkIGl0IGludG8gdGhlIFRMQiBMbzEg
cmVnaXN0ZXIuCisJI0NMRUFSX1BURV9TV0JJVFMoazEpCQkJCSMgTm8gU1cgYml0cyB0byBjbGVh
cgorCVBURV9NVEMwCWsxLCBNSVBTX0NPUF8wX1RMQl9MTzEJCSMgbG8xIGlzIGxvYWRlZAorCUNP
UDBfU1lOQworCisJIyBMb2FkIHRoZSBUTEIgUGFnZU1hc2sgZm9yIDFNIHBhZ2VzLgorCWRsaQkJ
azAsIFRMQk1BU0tfMU1fUEFHRQkJIyBQYWdlTWFzayBmb3IgMU0gUGFnZQorCVBURV9NVEMwCWsw
LCBNSVBTX0NPUF8wX1RMQl9QR19NQVNLCSMgUGFnZU1hc2sgaXMgbG9hZGVkCisJQ09QMF9TWU5D
CisKKwl0bGJ3cgkJCQkJCSMgd3JpdGUgdG8gdGxiCisJSEFaQVJEX0RFTEFZCisJUFRFX01UQzAJ
emVybywgTUlQU19DT1BfMF9UTEJfUEdfTUFTSwkjIHplcm8gb3V0IFBhZ2VNYXNrIHJlZworCUNP
UDBfU1lOQworCWVyZXQJCQkJCQkjIHJldHVybiBmcm9tIGV4Y2VwdGlvbgorCitub3Rfc3VwZXJw
YWdlOgorI2VuZGlmIC8qIE1JUFM2NF9ORVdfUE1BUCAqLwogI2VuZGlmCisJTUZDMAkJazAsIE1J
UFNfQ09QXzBfQkFEX1ZBRERSCSMgazA9YmFkIGFkZHJlc3MgKGFnYWluKQogCVBUUl9TUkwJCWsw
LCBQQUdFX1NISUZUIC0gUFRFU0hJRlQJIzBiOiBrMD1WUE4gKGFrYSB2YT4+MTApCiAJYW5kaQkJ
azAsIGswLCBQVEUyTUFTSwkJIzBjOiBrMD1wYWdlIHRhYiBvZmZzZXQKIAlQVFJfQUREVQlrMSwg
azEsIGswCQkJIzBkOiBrMT1wdGUgYWRkcmVzcwotCVBURV9MCQlrMCwgMChrMSkJCQkjMGU6IGsw
PWxvMCBwdGUKLQlQVEVfTAkJazEsIFBURVNJWkUoazEpCQkJIzBmOiBrMT1sbzAgcHRlCisKKwlQ
VEVfTAkJazAsIDAoazEpCQkJIyBrMD1sbzAgcHRlCisKKwkjIFNldCB0aGUgcmVmZXJlbmNlZCBi
aXQgaW4gdGhlIFBERSBpZiB2YWxpZC4KKwkjCisJIyBYWFggU2V0dGluZyB0aGUgcmVmZXJlbmNl
ZCBiaXQgaGVyZSBzYXZlcyBhIGZhdWx0IGxhdGVyIGJ1dCBpdAorCSMgbWF5IG5vdCBiZSBzYWZl
IHRvIGRvIHNvLiBUaGVyZWZvcmUsIGp1c3QgdGFrZSB0aGUgZmF1bHQgdG8gc2V0CisJIyB0aGUg
cmVmZXJlbmNlIGJpdC4KKyMJSUZfVkFMSURfU0VUX1JFRkJJVChrMCwgazEsIDAsIDIpCisKIAlD
TEVBUl9QVEVfU1dCSVRTKGswKQogCVBURV9NVEMwCWswLCBNSVBTX0NPUF8wX1RMQl9MTzAJCSMx
MjogbG8wIGlzIGxvYWRlZAogCUNPUDBfU1lOQwotCUNMRUFSX1BURV9TV0JJVFMoazEpCi0JUFRF
X01UQzAJazEsIE1JUFNfQ09QXzBfVExCX0xPMQkJIzE1OiBsbzEgaXMgbG9hZGVkCisKKwlQVEVf
TAkJazAsIFBURVNJWkUoazEpCQkJIyBrMD1sbzEgcHRlCisKKwkjIFNldCB0aGUgcmVmZXJlbmNl
ZCBiaXQgaW4gdGhlIFBERSBpZiB2YWxpZC4KKwkjCisJIyBYWFggU2V0dGluZyB0aGUgcmVmZXJl
bmNlZCBiaXQgaGVyZSBzYXZlcyBhIGZhdWx0IGxhdGVyIGJ1dCBpdAorCSMgbWF5IG5vdCBiZSBz
YWZlIHRvIGRvIHNvLiBUaGVyZWZvcmUsIGp1c3QgdGFrZSB0aGUgZmF1bHQgdG8gc2V0CisJIyB0
aGUgcmVmZXJlbmNlIGJpdC4KKyMJSUZfVkFMSURfU0VUX1JFRkJJVChrMCwgazEsIDAsIDMpCisK
KwlDTEVBUl9QVEVfU1dCSVRTKGswKQorCVBURV9NVEMwCWswLCBNSVBTX0NPUF8wX1RMQl9MTzEJ
CSMxNTogbG8xIGlzIGxvYWRlZAogCUNPUDBfU1lOQwogCXRsYndyCQkJCQkJIzFhOiB3cml0ZSB0
byB0bGIKIAlIQVpBUkRfREVMQVkKIAllcmV0CQkJCQkJIzFmOiByZXRVcm4gZnJvbSBleGNlcHRp
b24KKwogMToJagkJTWlwc1RMQk1pc3NFeGNlcHRpb24JCSMyMDoga2VybmVsIGV4Y2VwdGlvbgog
CW5vcAkJCQkJCSMyMTogYnJhbmNoIGRlbGF5IHNsb3QKIDI6CWoJCVNsb3dGYXVsdAkJCSMyMjog
bm8gcGFnZSB0YWJsZSBwcmVzZW50CkBAIC0yNjUsNyArMzY1LDcgQEAKICNlbmRpZgogCiAvKgot
ICogU2F2ZSBDUFUgYW5kIENQMCByZWdpc3RlciBzdGF0ZS4KKyAqIFNhdmUgQ1BVIGFuZCBDUDAg
cmVnaXN0ZXIgc3RhdGUgd2hlbiB0YWtpbmcgYW4gZXhjZXB0aW9uIGluIGtlcm5lbCBtb2RlLgog
ICoKICAqIFRoaXMgaXMgc3RyYWlnaHRmb3J3YXJkIGV4Y2VwdCBmb3Igc2F2aW5nIHRoZSBleGNl
cHRpb24gcHJvZ3JhbQogICogY291bnRlci4gVGhlIGRkYiBiYWNrdHJhY2UgY29kZSBsb29rcyBm
b3IgdGhlIGZpcnN0IGluc3RydWN0aW9uCkBAIC00MDYsNiArNTA2LDcgQEAKIAlTQVZFX1JFRyhh
MSwgU1IsIHNwKQogCVJFU1RPUkVfQ1BVCQkJIyB2MCBjb250YWlucyB0aGUgcmV0dXJuIGFkZHJl
c3MuCiAJc3luYworCiAJZXJldAogCS5zZXQJYXQKIEVORChNaXBzS2VybkdlbkV4Y2VwdGlvbikK
QEAgLTg4NCwyMSArOTg1LDYwIEBACiAJUFRSX1NSTAkJazAsIFBEUlNISUZUIC0gUFRSU0hJRlQJ
CSMgazA9cGRlIG9mZnNldCAoYWxtb3N0KQogCWJlcQkJazEsIHplcm8sIE1pcHNLZXJuR2VuRXhj
ZXB0aW9uCSMgPT0wIC0tIG5vIHBkZSB0YWIKIAlhbmRpCQlrMCwgazAsIFBERVBUUk1BU0sJCSMg
azA9cGRlIG9mZnNldAotCVBUUl9BRERVCWsxLCBrMCwgazEJCQkjIGsxPXBkZSBlbnRyeSBhZGRy
ZXNzCi0JUFRSX0wJCWsxLCAwKGsxKQkJCSMgazE9cGRlIGVudHJ5CisJUFRSX0FERFUJazAsIGsw
LCBrMQkJCSMgazA9cGRlIGVudHJ5IGFkZHJlc3MKKwlQVFJfTAkJazEsIDAoazApCQkJIyBrMT1w
ZGUgZW50cnkKIAogCS8qIFZhbGlkYXRlIHBkZSB0YWJsZSBwb2ludGVyLiAgKi8KIAliZXF6CQlr
MSwgM2YKIAlub3AKKworI2lmZGVmIE1JUFM2NF9ORVdfUE1BUAorCSMgQ2hlY2sgZm9yIHN1cGVy
cGFnZQorCUdFVF9TVVBFUlBBR0VfSURYKGsxKQkJCQkjIGsxPXN1cGVycGFnZSBpbmRleCBmcm9t
IFBURQorCWJlcQkJazEsIHplcm8sIG5vdF9zcGcJCSMgPT0wIC0tIG5vdCBzdXBlcnBhZ2UKKwlQ
VFJfTAkJazEsIDAoazApCQkJIyBrMT1wZGUgZW50cnkgKGRlbGF5IHNsb3QpCisKKwkvKiBWYWxp
ZGF0ZSBwYWdlIHRhYmxlIGVudHJ5LiAgKi8KKwlhbmRpCQlrMSwgUFRFX1ZSCisJYmVxegkJazEs
IDNmCisJbm9wCisKKwkjIFRoZSBQREUgaXMgYWN0dWFsbHkgYSBzdXBlcnBhZ2UgUFRFLiAgU3Rv
cmUgaXQgaW4gdGhlIFRMQiBsbzAgcmVnLgorCUNMRUFSX1BURV9TV0JJVFMoazEpCisJUFRFX01U
QzAJazEsIE1JUFNfQ09QXzBfVExCX0xPMAkJIyBsbzAgaXMgbG9hZGVkCisJQ09QMF9TWU5DCisK
KwkjIENvbXB1dGUgdGhlIFBGTiBmb3IgdGhlIFRMQiBsbzEgcmVnaXN0ZXIgZnJvbSBrMSg9UFRF
IGZvciBUTEIgbG8wKS4KKwlHRVRfT0REXzFNX1BGTl9GUk9NX0VWRU4oazEpCQkJIyBrMT1PZGQg
UEZOIGluIFBURSBwb3N0aW9uCisKKwkjIEdldCBoYXJkIFRMQiBmbGFnIGJpdHMuCisJUFRSX0wJ
CWswLCAwKGswKQkJCSMgazA9cGRlIGVudHJ5IChhZ2FpbikKKwlHRVRfSFdfVExCX0ZMQUdTKGsw
KQkJCQkjIGswPWh3IFRMQiBmbGFnIGJpdHMKKwlvcgkJazEsIGsxLCBrMAkJCSMgazE9UFRFPVBG
TiB8IGh3ZmxnIGJpdHMKKwkjIExvYWQgaXQgaW50byB0aGUgVExCIExvMSByZWdpc3Rlci4KKwkj
IENMRUFSX1BURV9TV0JJVFMoazEpCQkJCSMgTm8gU1cgYml0cyB0byBjbGVhcgorCVBURV9NVEMw
CWsxLCBNSVBTX0NPUF8wX1RMQl9MTzEJCSMgbG8xIGlzIGxvYWRlZAorCUNPUDBfU1lOQworCisJ
IyBMb2FkIHRoZSBUTEIgUGFnZU1hc2sgZm9yIDFNIHBhZ2VzLgorCWRsaQkJazAsIFRMQk1BU0tf
MU1fUEFHRQkJIyBQYWdlTWFzayBmb3IgMU0gUGFnZQorCVBURV9NVEMwCWswLCBNSVBTX0NPUF8w
X1RMQl9QR19NQVNLCSMgUGFnZU1hc2sgaXMgbG9hZGVkCisJQ09QMF9TWU5DCisKKwliCQl0bGJf
aW5zZXJ0X2VudHJ5CisJbm9wCisKK25vdF9zcGc6CisjZW5kaWYgLyogTUlQUzY0X05FV19QTUFQ
ICovCiAjZW5kaWYKIAlNRkMwCQlrMCwgTUlQU19DT1BfMF9CQURfVkFERFIJIyBrMD1iYWQgYWRk
cmVzcyAoYWdhaW4pCiAJUFRSX1NSTAkJazAsIFBBR0VfU0hJRlQgLSBQVEVTSElGVAkjIGswPVZQ
TgogCWFuZGkJCWswLCBrMCwgUFRFTUFTSwkJCSMgazA9cGFnZSB0YWIgb2Zmc2V0CiAJUFRSX0FE
RFUJazEsIGsxLCBrMAkJCSMgazE9cHRlIGFkZHJlc3MKIAlQVEVfTAkJazAsIDAoazEpCQkJIyBr
MD10aGlzIFBURQogCiAJLyogVmFsaWRhdGUgcGFnZSB0YWJsZSBlbnRyeS4gICovCi0JYW5kaQkJ
azAsIFBURV9WCisJYW5kaQkJazAsIFBURV9WUgogCWJlcXoJCWswLCAzZgogCW5vcAogCkBAIC05
MDgsMjUgKzEwNDgsMzEgQEAKIAlub3AKIAogCVBURV9MCQlrMCwgMChrMSkKLQlQVEVfTAkJazEs
IFBURVNJWkUoazEpCisKIAlDTEVBUl9QVEVfU1dCSVRTKGswKQogCVBURV9NVEMwCWswLCBNSVBT
X0NPUF8wX1RMQl9MTzAKIAlDT1AwX1NZTkMKLQlDTEVBUl9QVEVfU1dCSVRTKGsxKQotCVBURV9N
VEMwCWsxLCBNSVBTX0NPUF8wX1RMQl9MTzEKKworCVBURV9MCQlrMCwgUFRFU0laRShrMSkKKwor
CUNMRUFSX1BURV9TV0JJVFMoazApCisJUFRFX01UQzAJazAsIE1JUFNfQ09QXzBfVExCX0xPMQog
CUNPUDBfU1lOQwogCiAJYgkJdGxiX2luc2VydF9lbnRyeQogCW5vcAogCiBvZGRfcGFnZToKIAlQ
VEVfTAkJazAsIC1QVEVTSVpFKGsxKQotCVBURV9MCQlrMSwgMChrMSkKKwogCUNMRUFSX1BURV9T
V0JJVFMoazApCiAJUFRFX01UQzAJazAsIE1JUFNfQ09QXzBfVExCX0xPMAogCUNPUDBfU1lOQwot
CUNMRUFSX1BURV9TV0JJVFMoazEpCi0JUFRFX01UQzAJazEsIE1JUFNfQ09QXzBfVExCX0xPMQor
CisJUFRFX0wJCWswLCAwKGsxKQorCisJQ0xFQVJfUFRFX1NXQklUUyhrMCkKKwlQVEVfTVRDMAlr
MCwgTUlQU19DT1BfMF9UTEJfTE8xCiAJQ09QMF9TWU5DCiAKIHRsYl9pbnNlcnRfZW50cnk6CkBA
IC05MzYsMTEgKzEwODIsMTUgQEAKIAlibHR6CQlrMCwgdGxiX2luc2VydF9yYW5kb20KIAlub3AK
IAl0bGJ3aQorCVBURV9NVEMwCXplcm8sIE1JUFNfQ09QXzBfVExCX1BHX01BU0sKKwlDT1AwX1NZ
TkMKIAllcmV0CiAJc3Nub3AKIAogdGxiX2luc2VydF9yYW5kb206CiAJdGxid3IKKwlQVEVfTVRD
MAl6ZXJvLCBNSVBTX0NPUF8wX1RMQl9QR19NQVNLCisJQ09QMF9TWU5DCiAJZXJldAogCXNzbm9w
CiAKQEAgLTEwNTQsMjEgKzEyMDQsNjcgQEAKICNpZmRlZiBfX21pcHNfbjY0CiAJUFRSX1NSTAkJ
azAsIFBEUlNISUZUIC0gUFRSU0hJRlQJCSMgazA9VlBOCiAJYW5kaQkJazAsIGswLCBQREVQVFJN
QVNLCQkjIGswPXBkZSBvZmZzZXQKLQlQVFJfQUREVQlrMSwgazAsIGsxCQkJIyBrMT1wZGUgZW50
cnkgYWRkcmVzcwotCVBUUl9MCQlrMSwgMChrMSkJCQkjIGsxPXBkZSBlbnRyeQorCVBUUl9BRERV
CWswLCBrMCwgazEJCQkjIGsxPXBkZSBlbnRyeSBhZGRyZXNzCisJUFRSX0wJCWsxLCAwKGswKQkJ
CSMgazE9cGRlIGVudHJ5CisKKyNpZmRlZiBNSVBTNjRfTkVXX1BNQVAKKwkjIENoZWNrIGZvciBz
dXBlcnBhZ2UKKwlHRVRfU1VQRVJQQUdFX0lEWChrMSkJCQkJIyBrMT1zdXBlcnBhZ2UgaW5kZXgg
ZnJvbSBQVEUKKwliZXEJCWsxLCB6ZXJvLCBub3Rfa3NwZwkJIyA9PTAgLS0gbm90IHN1cGVycGFn
ZQorCVBUUl9MCQlrMSwgMChrMCkJCQkjIGsxPXBkZSBlbnRyeSAoZGVsYXkgc2xvdCkKKworCSMg
WFhYIFJlZmVyZW5jZSBiaXQgZW11bGF0aW9uCisKKwkjIFRoZSBQREUgaXMgYWN0dWFsbHkgYSBz
dXBlcnBhZ2UgUFRFLiAgU3RvcmUgaXQgaW4gdGhlIFRMQiBsbzAgcmVnLgorCUNMRUFSX1BURV9T
V0JJVFMoazEpCisJUFRFX01UQzAJazEsIE1JUFNfQ09QXzBfVExCX0xPMAkJIyBsbzAgaXMgbG9h
ZGVkCisJQ09QMF9TWU5DCisKKwkjIENvbXB1dGUgdGhlIFBGTiBmb3IgdGhlIFRMQiBsbzEgcmVn
aXN0ZXIgZnJvbSBrMSg9UFRFIGZvciBUTEIgbG8wKS4KKwlHRVRfT0REXzFNX1BGTl9GUk9NX0VW
RU4oazEpCQkJIyBrMT1PZGQgUEZOIGluIFBURSBwb3N0aW9uCisKKwkjIEdldCBoYXJkIFRMQiBm
bGFnIGJpdHMuCisJUFRSX0wJCWswLCAwKGswKQkJCSMgazA9cGRlIGVudHJ5IChhZ2FpbikKKwlH
RVRfSFdfVExCX0ZMQUdTKGswKQkJCQkjIGswPWh3IFRMQiBmbGFnIGJpdHMKKwlvcgkJazEsIGsx
LCBrMAkJCSMgazE9UFRFPVBGTiB8IGh3ZmxnIGJpdHMKKwkjIExvYWQgaXQgaW50byB0aGUgVExC
IExvMSByZWdpc3Rlci4KKwkjQ0xFQVJfUFRFX1NXQklUUyhrMSkJCQkJIyBObyBTVyBCaXRzIHRv
IGNsZWFyCisJUFRFX01UQzAJazEsIE1JUFNfQ09QXzBfVExCX0xPMQkJIyBsbzEgaXMgbG9hZGVk
CisJQ09QMF9TWU5DCisKKwkjIExvYWQgdGhlIFRMQiBQYWdlTWFzayBmb3IgMU0gcGFnZXMuCisJ
ZGxpCQlrMCwgVExCTUFTS18xTV9QQUdFCQkjIFBhZ2VNYXNrIGZvciAxTSBQYWdlCisJUFRFX01U
QzAJazAsIE1JUFNfQ09QXzBfVExCX1BHX01BU0sJIyBQYWdlTWFzayBpcyBsb2FkZWQKKwlDT1Aw
X1NZTkMKKworCXRsYndyCQkJCQkJIyB3cml0ZSB0byB0bGIKKwlIQVpBUkRfREVMQVkKKwlQVEVf
TVRDMAl6ZXJvLCBNSVBTX0NPUF8wX1RMQl9QR19NQVNLCSMgemVybyBvdXQgUGFnZU1hc2sgcmVn
CisJQ09QMF9TWU5DCisJZXJldAkJCQkJCSMgcmV0dXJuIGZyb20gZXhjZXB0aW9uCisKK25vdF9r
c3BnOgorI2VuZGlmIC8qIE1JUFM2NF9ORVdfUE1BUCAqLworCiAJTUZDMAkJazAsIE1JUFNfQ09Q
XzBfQkFEX1ZBRERSCSMgazA9YmFkIGFkZHJlc3MgKGFnYWluKQogICAJYmVxCQlrMSwgemVybywg
TWlwc0tlcm5HZW5FeGNlcHRpb24JIyA9PTAgLS0gbm8gcGFnZSB0YWJsZQogI2VuZGlmCiAJUFRS
X1NSTAkJazAsIFBBR0VfU0hJRlQgLSBQVEVTSElGVAkjIGswPVZQTgogCWFuZGkJCWswLCBrMCwg
UFRFMk1BU0sJCSMgazA9cGFnZSB0YWIgb2Zmc2V0CiAJUFRSX0FERFUJazEsIGsxLCBrMAkJCSMg
azE9cHRlIGFkZHJlc3MKKwogCVBURV9MCQlrMCwgMChrMSkJCQkjIGswPWxvMCBwdGUKLQlQVEVf
TAkJazEsIFBURVNJWkUoazEpCQkJIyBrMT1sbzEgcHRlCisKKwkjIFhYWCBSZWZlcmVuY2UgYml0
IGVtdWxhdGlvbgorCiAJQ0xFQVJfUFRFX1NXQklUUyhrMCkKIAlQVEVfTVRDMAlrMCwgTUlQU19D
T1BfMF9UTEJfTE8wCQkjIGxvMCBpcyBsb2FkZWQKIAlDT1AwX1NZTkMKLQlDTEVBUl9QVEVfU1dC
SVRTKGsxKQotCVBURV9NVEMwCWsxLCBNSVBTX0NPUF8wX1RMQl9MTzEJCSMgbG8xIGlzIGxvYWRl
ZAorCisJUFRFX0wJCWswLCBQVEVTSVpFKGsxKQkJCSMgazA9bG8xIHB0ZQorCisJQ0xFQVJfUFRF
X1NXQklUUyhrMCkKKwlQVEVfTVRDMAlrMCwgTUlQU19DT1BfMF9UTEJfTE8xCQkjIGxvMSBpcyBs
b2FkZWQKIAlDT1AwX1NZTkMKIAl0bGJ3cgkJCQkJIyB3cml0ZSB0byB0bGIKIAlIQVpBUkRfREVM
QVkKZGlmZiAtLWdpdCBhL3N5cy9taXBzL21pcHMvY3B1LmMgYi9zeXMvbWlwcy9taXBzL2NwdS5j
Ci0tLSBhL3N5cy9taXBzL21pcHMvY3B1LmMKKysrIGIvc3lzL21pcHMvbWlwcy9jcHUuYwpAQCAt
MzEzLDYgKzMxMywyNSBAQAogCWNwdWluZm8tPmwyLmRjX3NpemUgPSBjcHVpbmZvLT5sMi5kY19s
aW5lc2l6ZQogCSAgICAqIGNwdWluZm8tPmwyLmRjX25zZXRzICogY3B1aW5mby0+bDIuZGNfbndh
eXM7CiAjZW5kaWYKKworCS8qCisJICogUHJvYmUgUGFnZU1hc2sgcmVnaXN0ZXIgdG8gc2VlIHdo
YXQgc2l6ZXMgb2YgcGFnZXMgYXJlIHN1cHBvcnRlZAorCSAqIGJ5IHdyaXRpbmcgYWxsIG9uZSdz
IGFuZCB0aGVuIHJlYWRpbmcgaXQgYmFjay4KKwkgKi8KKwltaXBzX3dyX3BhZ2VtYXNrKH4wKTsK
KwljcHVpbmZvLT50bGJfcGdtYXNrID0gbWlwc19yZF9wYWdlbWFzaygpOworCW1pcHNfd3JfcGFn
ZW1hc2soTUlQUzNfUEdNQVNLXzRLKTsKKworI2lmZGVmIEtTVEFDS19MQVJHRV9QQUdFCisJaWYg
KChjcHVpbmZvLT50bGJfcGdtYXNrICYgTUlQUzNfUEdNQVNLXzE2SykgPT0gMCkKKwkJcGFuaWMo
IiVzOiAxNksgc2l6ZWQgcGFnZXMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBDUFUuIiwKKwkJ
ICAgIF9fZnVuY19fKTsKKyNlbmRpZiAvKiBLU1RBQ0tfTEFSR0VfUEFHRSAqLworI2lmZGVmIE1J
UFM2NF9ORVdfUE1BUAorCWlmICgoY3B1aW5mby0+dGxiX3BnbWFzayAmIE1JUFMzX1BHTUFTS18x
TSkgPT0gMCkKKwkJcGFuaWMoIiVzOiAxTSBzaXplZCBwYWdlcyBhcmUgbm90IHN1cHBvcnRlZCBi
eSB0aGlzIENQVS4iLAorCQkgICAgX19mdW5jX18pOworI2VuZGlmIC8qIE1JUFM2NF9ORVdfUE1B
UCAqLwogfQogCiB2b2lkCkBAIC0zODksNiArNDA4LDMwIEBACiAJCQlwcmludGYoIkZpeGVkIG1h
cHBpbmciKTsKIAkJfQogCQlwcmludGYoIiwgJWQgZW50cmllcyAiLCBjcHVpbmZvLnRsYl9uZW50
cmllcyk7CisJCWlmIChjcHVpbmZvLnRsYl9wZ21hc2spIHsKKwkJCXByaW50ZigiKCIpOworCQkJ
aWYgKGNwdWluZm8udGxiX3BnbWFzayAmIE1JUFMzX1BHTUFTS19NQVNLWCkKKwkJCQlwcmludGYo
IjFLICIpOworCQkJcHJpbnRmKCI0SyAiKTsKKwkJCWlmIChjcHVpbmZvLnRsYl9wZ21hc2sgJiBN
SVBTM19QR01BU0tfMTZLKQorCQkJCXByaW50ZigiMTZLICIpOworCQkJaWYgKGNwdWluZm8udGxi
X3BnbWFzayAmIE1JUFMzX1BHTUFTS182NEspCisJCQkJcHJpbnRmKCI2NEsgIik7CisJCQlpZiAo
Y3B1aW5mby50bGJfcGdtYXNrICYgTUlQUzNfUEdNQVNLXzI1NkspCisJCQkJcHJpbnRmKCIyNTZL
ICIpOworCQkJaWYgKGNwdWluZm8udGxiX3BnbWFzayAmIE1JUFMzX1BHTUFTS18xTSkKKwkJCQlw
cmludGYoIjFNICIpOworCQkJaWYgKGNwdWluZm8udGxiX3BnbWFzayAmIE1JUFMzX1BHTUFTS180
TSkKKwkJCQlwcmludGYoIjRNICIpOworCQkJaWYgKGNwdWluZm8udGxiX3BnbWFzayAmIE1JUFMz
X1BHTUFTS18xNk0pCisJCQkJcHJpbnRmKCIxNk0gIik7CisJCQlpZiAoY3B1aW5mby50bGJfcGdt
YXNrICYgTUlQUzNfUEdNQVNLXzY0TSkKKwkJCQlwcmludGYoIjY0TSAiKTsKKwkJCWlmIChjcHVp
bmZvLnRsYl9wZ21hc2sgJiBNSVBTM19QR01BU0tfMjU2TSkKKwkJCQlwcmludGYoIjI1Nk0gIik7
CisJCQlwcmludGYoInBnIHNpemVzKSIpOworCQl9CisJCXByaW50ZigiXG4iKTsKIAl9CiAKIAlp
ZiAoY3B1aW5mby50bGJfcGdtYXNrKSB7CmRpZmYgLS1naXQgYS9zeXMvbWlwcy9pbmNsdWRlL3Zt
cGFyYW0uaCBiL3N5cy9taXBzL2luY2x1ZGUvdm1wYXJhbS5oCi0tLSBhL3N5cy9taXBzL2luY2x1
ZGUvdm1wYXJhbS5oCisrKyBiL3N5cy9taXBzL2luY2x1ZGUvdm1wYXJhbS5oCkBAIC0xMDAsMTUg
KzEwMCw0NyBAQAogI2RlZmluZQlGUkVFQlNEMzJfVVNSU1RBQ0sJKCgodm1fb2Zmc2V0X3QpMHg4
MDAwMDAwMCkgLSBQQUdFX1NJWkUpCiAjZW5kaWYKIAorI2lmZGVmIE1JUFM2NF9ORVdfUE1BUAog
LyoKLSAqIERpc2FibGUgc3VwZXJwYWdlIHJlc2VydmF0aW9ucy4gKG5vdCBzdXJlIGlmIHRoaXMg
aXMgcmlnaHQKLSAqIEkgY29waWVkIGl0IGZyb20gQVJNKQorICogRW5hYmxlIHN1cGVycGFnZSBy
ZXNlcnZhdGlvbnM6IDEgbGV2ZWwuCisgKgorICogVk1fTlJFU0VSVkxFVkVMIHNwZWNpZmllcyBh
IG51bWJlciBvZiBwcm9tb3Rpb24gbGV2ZWxzIGVuYWJsZWQuCisgKiBDdXJyZW50bHkgbWlwczY0
IG9ubHkgc3VwcG9ydHMgb25lIHNpemUgb3IgbGV2ZWwgKFZNX0xFVkVMXzBfT1JERVIpIG9mCisg
KiBzdXBlcnBhZ2VzICgyTUIpCisgKi8KKyNpZm5kZWYJVk1fTlJFU0VSVkxFVkVMCisjZGVmaW5l
CVZNX05SRVNFUlZMRVZFTAkJCTEKKyNlbmRpZgorCisvKgorICogTGV2ZWwgMCByZXNlcnZhdGlv
bnMgY29uc2lzdCBvZiA1MTIgKDJeOSkgcGFnZXMgKDJNQikuCisgKi8KKyNpZm5kZWYJVk1fTEVW
RUxfMF9PUkRFUgorI2RlZmluZQlWTV9MRVZFTF8wX09SREVSCQk5CisjZW5kaWYKKworLyoKKyAq
IFRoZSBsYXJnZXN0IGFsbG9jYXRpb24gc2l6ZSBpcyA0TUIuCisgKi8KKyNkZWZpbmUJVk1fTkZS
RUVPUkRFUgkJCTExCisKKyNlbHNlIC8qICEgTUlQUzY0X05FV19QTUFQICovCisKKy8qCisgKiBE
aXNhYmxlIHN1cGVycGFnZSByZXNlcnZhdGlvbnMuCiAgKi8KICNpZm5kZWYJVk1fTlJFU0VSVkxF
VkVMCiAjZGVmaW5lCVZNX05SRVNFUlZMRVZFTAkJMAogI2VuZGlmCiAKIC8qCisgKiBUaGUgbGFy
Z2VzdCBhbGxvY2F0aW9uIHNpemUgaXMgMU1CLgorICovCisjZGVmaW5lCVZNX05GUkVFT1JERVIJ
CTkKKworI2VuZGlmIC8qICEgTUlQUzY0X05FV19QTUFQICovCisKKy8qCiAgKiBIb3cgbWFueSBw
aHlzaWNhbCBwYWdlcyBwZXIga21lbSBhcmVuYSB2aXJ0dWFsIHBhZ2UuCiAgKi8KICNpZm5kZWYg
Vk1fS01FTV9TSVpFX1NDQUxFCkBAIC0xNzcsMTEgKzIwOSw2IEBACiAjZGVmaW5lCVZNX0xPV01F
TV9CT1VOREFSWQkoKHZtX3BhZGRyX3QpMHgyMDAwMDAwMCkKICNlbmRpZgogCi0vKgotICogVGhl
IGxhcmdlc3QgYWxsb2NhdGlvbiBzaXplIGlzIDFNQi4KLSAqLwotI2RlZmluZQlWTV9ORlJFRU9S
REVSCQk5Ci0KICNkZWZpbmUJWkVST19SRUdJT05fU0laRQkoNjQgKiAxMDI0KQkvKiA2NEtCICov
CiAKICNpZm5kZWYgX19taXBzX242NApkaWZmIC0tZ2l0IGEvc3lzL21pcHMvaW5jbHVkZS9wdGUu
aCBiL3N5cy9taXBzL2luY2x1ZGUvcHRlLmgKLS0tIGEvc3lzL21pcHMvaW5jbHVkZS9wdGUuaAor
KysgYi9zeXMvbWlwcy9pbmNsdWRlL3B0ZS5oCkBAIC0yOSw2ICsyOSwxMCBAQAogI2lmbmRlZglf
TUFDSElORV9QVEVfSF8KICNkZWZpbmUJX01BQ0hJTkVfUFRFX0hfCiAKKyNpZiAhZGVmaW5lZChf
S0VSTkVMKQorI2luY2x1ZGUgPG1hY2hpbmUvcGFyYW0uaD4KKyNlbmRpZgorCiAjaWZuZGVmIF9M
T0NPUkUKICNpZiBkZWZpbmVkKF9fbWlwc19uNjQpIHx8IGRlZmluZWQoX19taXBzX24zMikgLyog
IFBIWVNBRERSXzY0X0JJVCAqLwogdHlwZWRlZgl1aW50NjRfdCBwdF9lbnRyeV90OwpAQCAtNzIs
MjIgKzc2LDI1IEBACiAgKiBOT1RFOiBUaGlzIG1lYW5zIHRoYXQgZm9yIDMyLWJpdCB1c2Ugb2Yg
Q1AwLCB3ZSBhcmVuJ3QgYWJsZSB0byBzZXQgdGhlIHRvcAogICogYml0IG9mIFBGTiB0byBhIG5v
bi16ZXJvIHZhbHVlLCBhcyBzb2Z0d2FyZSBpcyB1c2luZyBpdCEgIFRoaXMgcGh5c2ljYWwKICAq
IG1lbW9yeSBzaXplIGxpbWl0IG1heSBub3QgYmUgc3VmZmljaWVudGx5IGVuZm9yY2VkIGVsc2V3
aGVyZS4KKyAqCisgKiBYWFhSVzogT24gQ0hFUkksIGJpdHMgNjMgYW5kIDYyIGFyZSB1c2VkIGZv
ciBhZGRpdGlvbmFsIHBlcm1pc3Npb25zIHRoYXQKKyAqIHByZXZlbnQgbG9hZGluZyBhbmQgc3Rv
cmluZyBvZiBjYXBhYmlsaXRpZXMsIHNvIHdlIGhhdmUgcmVkdWNlZCB0aGUgNTUtYml0CisgKiBz
aGlmdCB0byA1MyBiaXRzLgogICovCiAjaWYgZGVmaW5lZChfX21pcHNfbjY0KSB8fCBkZWZpbmVk
KF9fbWlwc19uMzIpIC8qICBQSFlTQUREUl82NF9CSVQgKi8KLSNkZWZpbmUJVExCTE9fU1dCSVRT
X1NISUZUCSg1NSkKLSNkZWZpbmUJVExCTE9fU1dCSVRTX0NMRUFSX1NISUZUCSg5KQotI2RlZmlu
ZQlUTEJMT19QRk5fTUFTSwkJMHgzRkZGRkZGQzBVTEwKKyNkZWZpbmUJVExCTE9fU1dCSVRTX1NI
SUZUCSg1MykJCS8qIFhYWFJXOiBXYXMgNTUuICovCisjZGVmaW5lCVRMQkxPX1JFRl9CSVRfU0hJ
RlQJKDYxKQorI2RlZmluZQlUTEJMT19TV0JJVFNfQ0xFQVJfU0hJRlQJKDExKQkvKiBYWFhTUzog
V2FzIDkuICovCisjZGVmaW5lCVRMQkxPX1BGTl9NQVNLCQkweEZGRkZGRkMwVUxMCisjZGVmaW5l
CVRMQl8xTV9TVVBFUlBBR0VfU0hJRlQJKFBEUlNISUZUKQorI2RlZmluZQlUTEJMT19TV0JJVFNf
TUFTSwkoKHB0X2VudHJ5X3QpMHg3RiA8PCBUTEJMT19TV0JJVFNfU0hJRlQpCiAjZWxzZQogI2Rl
ZmluZQlUTEJMT19TV0JJVFNfU0hJRlQJKDI5KQogI2RlZmluZQlUTEJMT19TV0JJVFNfQ0xFQVJf
U0hJRlQJKDMpCiAjZGVmaW5lCVRMQkxPX1BGTl9NQVNLCQkoMHgxRkZGRkZDMCkKKyNkZWZpbmUJ
VExCTE9fU1dCSVRTX01BU0sJKChwdF9lbnRyeV90KTB4NyA8PCBUTEJMT19TV0JJVFNfU0hJRlQp
CiAjZW5kaWYKICNkZWZpbmUJVExCTE9fUEZOX1NISUZUCQkoNikKLSNkZWZpbmUJVExCTE9fU1dC
SVRTX01BU0sJKChwdF9lbnRyeV90KTB4NyA8PCBUTEJMT19TV0JJVFNfU0hJRlQpCi0jZGVmaW5l
CVRMQkxPX1BBX1RPX1BGTihwYSkJKCgoKHBhKSA+PiBUTEJfUEFHRV9TSElGVCkgPDwgVExCTE9f
UEZOX1NISUZUKSAmIFRMQkxPX1BGTl9NQVNLKQotI2RlZmluZQlUTEJMT19QRk5fVE9fUEEocGZu
KQkoKHZtX3BhZGRyX3QpKChwZm4pID4+IFRMQkxPX1BGTl9TSElGVCkgPDwgVExCX1BBR0VfU0hJ
RlQpCi0jZGVmaW5lCVRMQkxPX1BURV9UT19QRk4ocHRlKQkoKHB0ZSkgJiBUTEJMT19QRk5fTUFT
SykKLSNkZWZpbmUJVExCTE9fUFRFX1RPX1BBKHB0ZSkJKFRMQkxPX1BGTl9UT19QQShUTEJMT19Q
VEVfVE9fUEZOKChwdGUpKSkpCiAKIC8qCiAgKiBYWFggVGhpcyBjb21tZW50IGlzIG5vdCBjb3Jy
ZWN0IGZvciBhbnl0aGluZyBtb3JlIG1vZGVybiB0aGFuIFI0Sy4KQEAgLTEyMSwyNSArMTI4LDgz
IEBACiAjZW5kaWYgLyogZGVmaW5lZChfX21pcHNfbjY0KSAqLwogCiAvKgorICogUFRFIEhhcmR3
YXJlIEJpdHMgKEVudHJ5TG8wLTEgcmVnaXN0ZXIgZmllbGRzKQorICoKKyAqIExvd2VyIGJpdHMg
b2YgYSAzMiBiaXQgUFRFOgorICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IDI4IC0tLS0tLS0tLS0tLS0tLSA2IDUgLSAzICAyICAgMSAgIDAKKyAqICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICBQRk4gICAgICAg
IHwgIEMgIHwgRCB8IFZSfCBHIHwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogTG93ZXIgYml0
cyBvZiBhIDY0IGJpdCBQVEU6CisgKgorICogIDUyIC0tLS0tLS0tLS0tLS0tLS0tLS0tIDM0ICAz
MyAtLS0tLS0tLS0tLS0tLS0tLS0tIDYgNSAtIDMgIDIgICAxICAgMAorICogIC0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0KKyAqIHwgICAgICAgUmVzZXJ2ZWQgKFplcm8pICAgICB8ICAgICAgICAgIFBGTiAgICAgICAg
ICAgfCAgQyAgfCBEIHwgVlJ8IEcgfAorICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCiAgKiBUTEIgZmxh
Z3MgbWFuYWdlZCBpbiBoYXJkd2FyZToKKyAqICAgIFBGTjoJUGFnZSBGcmFtZSBOdW1iZXIuCiAg
KiAJQzoJQ2FjaGUgYXR0cmlidXRlLgogICogCUQ6CURpcnR5IGJpdC4gIFRoaXMgbWVhbnMgYSBw
YWdlIGlzIHdyaXRhYmxlLiAgSXQgaXMgbm90CiAgKiAJCXNldCBhdCBmaXJzdCwgYW5kIGEgd3Jp
dGUgaXMgdHJhcHBlZCwgYW5kIHRoZSBkaXJ0eQogICogCQliaXQgaXMgc2V0LiAgU2VlIGFsc28g
UFRFX1JPLgotICogCVY6CVZhbGlkIGJpdC4gIE9idmlvdXMsIGlzbid0IGl0PworICogCVZSOglW
YWxpZC9SZWZlcmVuY2UgYml0LiBTZWUgYWxzbyBQVEVfU1YuCiAgKiAJRzoJR2xvYmFsIGJpdC4g
IFRoaXMgbWVhbnMgdGhhdCB0aGlzIG1hcHBpbmcgaXMgcHJlc2VudAogICogCQlpbiBFVkVSWSBh
ZGRyZXNzIHNwYWNlLCBhbmQgdG8gaWdub3JlIHRoZSBBU0lEIHdoZW4KICAqIAkJaXQgaXMgbWF0
Y2hlZC4KICAqLwogI2RlZmluZQlQVEVfQyhhdHRyKQkJKChhdHRyICYgMHgwNykgPDwgMykKICNk
ZWZpbmUJUFRFX0NfVU5DQUNIRUQJCShQVEVfQyhNSVBTX0NDQV9VTkNBQ0hFRCkpCiAjZGVmaW5l
CVBURV9DX0NBQ0hFCQkoUFRFX0MoTUlQU19DQ0FfQ0FDSEVEKSkKICNkZWZpbmUJUFRFX0QJCQkw
eDA0Ci0jZGVmaW5lCVBURV9WCQkJMHgwMgorI2RlZmluZQlQVEVfVlIJCQkweDAyCiAjZGVmaW5l
CVBURV9HCQkJMHgwMQogCisjaWZkZWYgQ1BVX0NIRVJJCisvKgorICogQ0hFUkkgRW50cnlMbyBl
eHRlbnNpb25zIHRoYXQgbGltaXQgc3RvcmluZyBsb2FkaW5nIGFuZCBzdG9yaW5nIHRhZ2dlZAor
ICogdmFsdWVzLgorICovCisjZGVmaW5lCVBURV9TQwkJCSgweDFVTEwgPDwgNjMpCisjZGVmaW5l
CVBURV9MQwkJCSgweDFVTEwgPDwgNjIpCisjZW5kaWYKKwogLyoKKyAqIFBURSBTb2Z0d2FyZSBC
aXRzCisgKgorICogVXBwZXIgYml0cyBvZiBhIDMyIGJpdCBQVEU6CisgKgorICogICAgIDMxICAg
MzAgICAyOQorICogICAgLS0tLS0tLS0tLS0tLS0KKyAqICAgfCBNTiB8IFcgIHwgUk8gfAorICog
ICAgLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBVcHBlciBiaXRzIG9mIGEgNjQgYml0IFBURToKKyAq
CisgKiAgIDYzLTYyICAgNjEtNjAgIDU5ICAgNTggLS0gNTYgICAgNTUgICA1NCAgIDUzCisgKiAg
IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIHwgIFJH
ICB8ICAgICAgfCBTViB8IFBHIFNaIElEWCB8IE1OIHwgVyAgfCBSTyB8CisgKiAgIC0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKICAqIFZNIGZsYWdzIG1h
bmFnZWQgaW4gc29mdHdhcmU6CisgKglSRzoJUmVnaW9uLgkgKFJlc2VydmVkLiBDdXJyZW50bHkg
bm90IHVzZWQuKQorICoJU1Y6CVNvZnQgVmFsaWQgYml0LgorICoJUEcgU1ogSURYOiBQYWdlIFNp
emUgSW5kZXggKDAtNykuCisgKgkJSW5kZXgJUGFnZSBNYXNrIChCaW5hcnkpCUhXIFBhZ2UgU2l6
ZQorICoJCS0tLS0tCS0tLS0tLS0tLS0tLS0tLS0tLS0JLS0tLS0tLS0tLS0tCisgKgkJMAkwMDAw
IDAwMDAgMDAwMCAwMDAwCSAgNEsKKyAqCQkxCTAwMDAgMDAwMCAwMDAwIDAwMTEJIDE2SworICoJ
CTIJMDAwMCAwMDAwIDAwMDAgMTExMQkgNjRLCisgKgkJMwkwMDAwIDAwMDAgMDAxMSAxMTExCTI1
NksKKyAqCQk0CTAwMDAgMDAwMCAxMTExIDExMTEJICAxTQorICoJCTUJMDAwMCAwMDExIDExMTEg
MTExMQkgIDRNCisgKgkJNgkwMDAwIDExMTEgMTExMSAxMTExCSAxNk0KKyAqIChNSVBTIDM6KQor
ICoJCTcJMDAxMSAxMTExIDExMTEgMTExMQkgNjRNCisgKgkJOAkxMTExIDExMTEgMTExMSAxMTEx
CTI1Nk0gKE5vdCBjdXJyZW50bHkgc3VwcG9ydGVkKQorICoKICAqIAlSTzoJUmVhZCBvbmx5LiAg
TmV2ZXIgc2V0IFBURV9EIG9uIHRoaXMgcGFnZSwgYW5kIGRvbid0CiAgKiAJCWxpc3RlbiB0byBy
ZXF1ZXN0cyB0byB3cml0ZSB0byBpdC4KICAqIAlXOglXaXJlZC4gID8/PwpAQCAtMTUxLDEzICsy
MTYsMjkxIEBACiAjZGVmaW5lCVBURV9STwkJCSgocHRfZW50cnlfdCkweDAxIDw8IFRMQkxPX1NX
QklUU19TSElGVCkKICNkZWZpbmUJUFRFX1cJCQkoKHB0X2VudHJ5X3QpMHgwMiA8PCBUTEJMT19T
V0JJVFNfU0hJRlQpCiAjZGVmaW5lCVBURV9NQU5BR0VECQkoKHB0X2VudHJ5X3QpMHgwNCA8PCBU
TEJMT19TV0JJVFNfU0hJRlQpCisjaWYgZGVmaW5lZChfX21pcHNfbjY0KSB8fCBkZWZpbmVkKF9f
bWlwc19uMzIpIC8qICBQSFlTQUREUl82NF9CSVQgKi8KKyNkZWZpbmUJUFRFX1BTXzE2SwkJKChw
dF9lbnRyeV90KTB4MDggPDwgVExCTE9fU1dCSVRTX1NISUZUKQorI2RlZmluZQlQVEVfUFNfNjRL
CQkoKHB0X2VudHJ5X3QpMHgxMCA8PCBUTEJMT19TV0JJVFNfU0hJRlQpCisjZGVmaW5lCVBURV9Q
U18yNTZLCQkoKHB0X2VudHJ5X3QpMHgxOCA8PCBUTEJMT19TV0JJVFNfU0hJRlQpCisjZGVmaW5l
CVBURV9QU18xTQkJKChwdF9lbnRyeV90KTB4MjAgPDwgVExCTE9fU1dCSVRTX1NISUZUKQorI2Rl
ZmluZQlQVEVfUFNfNE0JCSgocHRfZW50cnlfdCkweDI4IDw8IFRMQkxPX1NXQklUU19TSElGVCkK
KyNkZWZpbmUJUFRFX1BTXzE2TQkJKChwdF9lbnRyeV90KTB4MzAgPDwgVExCTE9fU1dCSVRTX1NI
SUZUKQorI2RlZmluZQlQVEVfUFNfNjRNCQkoKHB0X2VudHJ5X3QpMHgzOCA8PCBUTEJMT19TV0JJ
VFNfU0hJRlQpCisjZGVmaW5lCVBURV9QU19JRFhfTUFTSwkJKChwdF9lbnRyeV90KTB4MzggPDwg
VExCTE9fU1dCSVRTX1NISUZUKQorI2RlZmluZQlQVEVfUFNJRFhfTkJJVFNfVE9fTEVGVAkJNQor
I2RlZmluZQlQVEVfUFNJRFhfTkJJVFNfVE9fUklHSFQJNTYKKyNkZWZpbmUJUFRFX1BGTl9OQklU
U19UT19MRUZUCQkxMQorI2RlZmluZQlQVEVfUEZOX05CSVRTX1RPX1JJR0hUCQk2CisjZGVmaW5l
CVBURV9IV0ZMQUdTX05CSVRTX1RPX0xFRlQJNTgKKyNkZWZpbmUJU1dfVkFMSUQJCTB4NDAKKyNk
ZWZpbmUJUFRFX1NWCQkJKChwdF9lbnRyeV90KVNXX1ZBTElEIDw8IFRMQkxPX1NXQklUU19TSElG
VCkKKyNlbHNlCisjZGVmaW5lCVBURV9QU19JRFhfTUFTSwkJMAorI2RlZmluZQlQVEVfU1YJCQkw
CisjZW5kaWYKKworLyoKKyAqIFByb21vdGlvbiB0byBhIDRNQiAoUERFKSBwYWdlIG1hcHBpbmcg
cmVxdWlyZXMgdGhhdCB0aGUgY29ycmVzcG9uZGluZyA0S0IKKyAqIChQVEUpIHBhZ2UgbWFwcGlu
Z3MgaGF2ZSBpZGVudGljYWwgc2V0dGluZ3MgZm9yIHRoZSBmb2xsb3dpbmcgZmllbGRzOgorICov
CisjZGVmaW5lCVBHX1BST01PVEVfTUFTSwkoUFRFX0cgfCBQVEVfVkFMSUQgfCBQVEVfRCB8IFBU
RV9DX1VOQ0FDSEVEIHwgXAorCQkJUFRFX0NfQ0FDSEUgfCBQVEVfUk8gfCBQVEVfVyB8IFBURV9N
QU5BR0VEIHwgXAorCQkJUFRFX1JFRikKKworI2lmZGVmIE1JUFM2NF9ORVdfUE1BUAorI2RlZmlu
ZQlUTEJMT19QVEVfVE9fSURYKHB0ZSkJKCgocHRlKSAmIFBURV9QU19JRFhfTUFTSykgPj4gNTYp
CisjZGVmaW5lCVRMQk1BU0tfSURYX1RPX01BU0soaWR4KSAoKCgxIDw8ICgoaWR4KSA8PCAxKSkg
LSAxKSA8PCBUTEJNQVNLX1NISUZUKQorI2RlZmluZQlUTEJMT19QVEVfVE9fTUFTSyhwdGUpCVRM
Qk1BU0tfSURYX1RPX01BU0soVExCTE9fUFRFX1RPX0lEWChwdGUpKQorI2RlZmluZQlUTEJNQVNL
XzRLX1BBR0UJCVRMQk1BU0tfSURYX1RPX01BU0soMCkKKyNkZWZpbmUJVExCTUFTS18xNktfUEFH
RQlUTEJNQVNLX0lEWF9UT19NQVNLKDEpCisjZGVmaW5lCVRMQk1BU0tfNjRLX1BBR0UJVExCTUFT
S19JRFhfVE9fTUFTSygyKQorI2RlZmluZQlUTEJNQVNLXzI1NktfUEFHRQlUTEJNQVNLX0lEWF9U
T19NQVNLKDMpCisjZGVmaW5lCVRMQk1BU0tfMU1fUEFHRQkJVExCTUFTS19JRFhfVE9fTUFTSyg0
KQorI2RlZmluZQlUTEJNQVNLXzRNX1BBR0UJCVRMQk1BU0tfSURYX1RPX01BU0soNSkKKyNkZWZp
bmUJVExCTUFTS18xNk1fUEFHRQlUTEJNQVNLX0lEWF9UT19NQVNLKDYpCisjZGVmaW5lCVRMQk1B
U0tfNjRNX1BBR0UJVExCTUFTS19JRFhfVE9fTUFTSyg3KQorI2Vsc2UgLyogISBNSVBTNjRfTkVX
X1BNQVAgKi8KKyNkZWZpbmUJVExCTE9fUFRFX1RPX0lEWChwdGUpIAkwCisjZGVmaW5lCVRMQkxP
X1BURV9UT19NQVNLKHB0ZSkJMAorI2VuZGlmIC8qICEgTUlQUzY0X05FV19QTUFQICovCiAKIC8q
CiAgKiBQVEUgbWFuYWdlbWVudCBmdW5jdGlvbnMgZm9yIGJpdHMgZGVmaW5lZCBhYm92ZS4KICAq
LwotI2RlZmluZQlwdGVfY2xlYXIocHRlLCBiaXQpCSgqKHB0ZSkgJj0gfihiaXQpKQotI2RlZmlu
ZQlwdGVfc2V0KHB0ZSwgYml0KQkoKihwdGUpIHw9IChiaXQpKQotI2RlZmluZQlwdGVfdGVzdChw
dGUsIGJpdCkJKCgqKHB0ZSkgJiAoYml0KSkgPT0gKGJpdCkpCisjaWZuZGVmIF9MT0NPUkUKK3N0
YXRpYyBfX2lubGluZSB2b2lkCitwdGVfY2xlYXIocHRfZW50cnlfdCAqcHRlLCBwdF9lbnRyeV90
IGJpdCkKK3sKKworCSpwdGUgJj0gKH5iaXQpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAor
cHRlX3NldChwdF9lbnRyeV90ICpwdGUsIHB0X2VudHJ5X3QgYml0KQoreworCisJKnB0ZSB8PSBi
aXQ7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK3B0ZV90ZXN0KHB0X2VudHJ5X3QgKnB0ZSwg
cHRfZW50cnlfdCBiaXQpCit7CisKKwlyZXR1cm4gKCgqcHRlICYgYml0KSA9PSBiaXQpOworfQor
CitzdGF0aWMgX19pbmxpbmUgdm9pZAorcGRlX2NsZWFyKHBkX2VudHJ5X3QgKnBkZSwgcHRfZW50
cnlfdCBiaXQpCit7CisKKwkqKHB0X2VudHJ5X3QgKilwZGUgJj0gKH5iaXQpOworfQorCitzdGF0
aWMgX19pbmxpbmUgdm9pZAorcGRlX3NldChwZF9lbnRyeV90ICpwZGUsIHB0X2VudHJ5X3QgYml0
KQoreworCisJKihwdF9lbnRyeV90ICopcGRlIHw9IGJpdDsKK30KKworc3RhdGljIF9faW5saW5l
IGludAorcGRlX3Rlc3QocGRfZW50cnlfdCAqcGRlLCBwdF9lbnRyeV90IGJpdCkKK3sKKworCXJl
dHVybiAoKCoocHRfZW50cnlfdCAqKXBkZSAmIGJpdCkgPT0gYml0KTsKK30KKworc3RhdGljIF9f
aW5saW5lIHB0X2VudHJ5X3QKK1RMQkxPX1BBX1RPX1BGTih2bV9wYWRkcl90IHBhKQoreworCisJ
cmV0dXJuICgoKHBhID4+IFRMQl9QQUdFX1NISUZUKSA8PCBUTEJMT19QRk5fU0hJRlQpICYgVExC
TE9fUEZOX01BU0spOworfQorCitzdGF0aWMgX19pbmxpbmUgdm1fcGFkZHJfdAorVExCTE9fUEZO
X1RPX1BBKHB0X2VudHJ5X3QgcGZuKQoreworCisJcmV0dXJuICgodm1fcGFkZHJfdCkocGZuID4+
IFRMQkxPX1BGTl9TSElGVCkgPDwgVExCX1BBR0VfU0hJRlQpOworfQorCitzdGF0aWMgX19pbmxp
bmUgcHRfZW50cnlfdAorVExCTE9fUFRFX1RPX1BGTihwdF9lbnRyeV90IHB0ZSkKK3sKKworCXJl
dHVybiAocHRlICYgVExCTE9fUEZOX01BU0spOworfQorCisjaWZkZWYgTUlQUzY0X05FV19QTUFQ
CisKKyNkZWZpbmUJUFRFX1JFRgkJUFRFX1ZSCisjZGVmaW5lCVBURV9WQUxJRCAJUFRFX1NWCisK
KyNkZWZpbmUJcHRlX2lzX3JlZihwdGUpCQkJcHRlX3Rlc3QoKHB0ZSksIFBURV9SRUYpCisjZGVm
aW5lCXB0ZV9yZWZfY2xlYXIocHRlKQkJcHRlX2NsZWFyKChwdGUpLCBQVEVfUkVGKQorI2RlZmlu
ZQlwdGVfcmVmX3NldChwdGUpCQlwdGVfc2V0KChwdGUpLCBQVEVfUkVGKQorI2RlZmluZQlwdGVf
cmVmX2F0b21pY19jbGVhcihwdGUpCWF0b21pY19jbGVhcl9sb25nKChwdGUpLCBQVEVfUkVGKQor
I2RlZmluZQlwdGVfcmVmX2F0b21pY19zZXQocHRlKQkJYXRvbWljX3NldF9sb25nKChwdGUpLCBQ
VEVfUkVGKQorCisjZWxzZSAvKiAhIE1JUFM2NF9ORVdfUE1BUCAqLworCisjZGVmaW5lCVBURV9S
RUYJCTAKKyNkZWZpbmUJUFRFX1ZBTElECVBURV9WUgorCisjZGVmaW5lCXB0ZV9pc19yZWYocHRl
KQkJCTAKKyNkZWZpbmUJcHRlX3JlZl9jbGVhcihwdGUpCisjZGVmaW5lCXB0ZV9yZWZfc2V0KHB0
ZSkKKyNkZWZpbmUJcHRlX3JlZl9hdG9taWNfY2xlYXIocHRlKQorI2RlZmluZQlwdGVfcmVmX2F0
b21pY19zZXQocHRlLCBiaXQpCisKKyNlbmRpZiAvKiAhIE1JUFM2NF9ORVdfUE1BUCAqLworCisj
ZGVmaW5lCXB0ZV9pc192YWxpZChwdGUpCQlwdGVfdGVzdCgocHRlKSwgUFRFX1ZBTElEKQorCisj
aWYgZGVmaW5lZChfX21pcHNfbjY0KSB8fCBkZWZpbmVkKF9fbWlwc19uMzIpIC8qICBQSFlTQURE
Ul82NF9CSVQgKi8KKworI2RlZmluZQlwdGVfYXRvbWljX2NsZWFyKHB0ZSwgYml0KQlhdG9taWNf
Y2xlYXJfNjQoKHB0ZSksIGJpdCkKKyNkZWZpbmUJcHRlX2F0b21pY19zZXQocHRlLCBiaXQpCWF0
b21pY19zZXRfNjQoKHB0ZSksIGJpdCkKKyNkZWZpbmUJcHRlX2xvYWRfc3RvcmUocHRlcCwgcHRl
KQlhdG9taWNfcmVhZGFuZHNldF82NChwdGVwLCBwdGUpCisjZGVmaW5lCXBkZV9sb2FkX3N0b3Jl
KHBkZXAsIHBkZSkJKHBkX2VudHJ5X3QpYXRvbWljX3JlYWRhbmRzZXRfNjQoXAorCQkJCQkJKHB0
X2VudHJ5X3QgKilwZGVwLCBwZGUpCisKKyNkZWZpbmUJcHRlX2F0b21pY19zdG9yZShwdGVwLCBw
dGUpCWF0b21pY19zdG9yZV9yZWxfNjQocHRlcCwgcHRlKQorI2RlZmluZSBwdGVfc3RvcmUocHRl
cCwgcHRlKQlkbyB7CQlcCisJKih1X2xvbmcgKikocHRlcCkgPSAodV9sb25nKShwdGUpOwlcCit9
IHdoaWxlICgwKQorI2RlZmluZQlwZGVfc3RvcmUocGRlcCwgcGRlKQkJcHRlX3N0b3JlKHBkZXAs
IHBkZSkKKworCisjZWxzZSAvKiAhIFBIWVNBRERSXzY0X0JJVCAqLworCisjZGVmaW5lCXB0ZV9h
dG9taWNfY2xlYXIocHRlLCBiaXQpCWF0b21pY19jbGVhcl8zMigocHRlKSwgYml0KQorI2RlZmlu
ZQlwdGVfYXRvbWljX3NldChwdGUsIGJpdCkJYXRvbWljX3NldF8zMigocHRlKSwgYml0KQorI2Rl
ZmluZQlwdGVfbG9hZF9zdG9yZShwdGVwLCBwdGUpCWF0b21pY19yZWFkYW5kc2V0XzMyKHB0ZXAs
IHB0ZSkKKyNkZWZpbmUJcGRlX2xvYWRfc3RvcmUocGRlcCwgcGRlKQkocGRfZW50cnlfdClhdG9t
aWNfcmVhZGFuZHNldF8zMihcCisJCQkJCQkocHRfZW50cnlfdCAqKXBkZXAsIHBkZSkKKworI2Rl
ZmluZQlwdGVfYXRvbWljX3N0b3JlKHB0ZXAsIHB0ZSkJYXRvbWljX3N0b3JlX3JlbF8zMihwdGVw
LCBwdGUpCisjZGVmaW5lIHB0ZV9zdG9yZShwdGVwLCBwdGUpCWRvIHsJCVwKKwkqKHVfaW50ICop
KHB0ZXApID0gKHVfaW50KShwdGUpOwlcCit9IHdoaWxlICgwKQorI2RlZmluZQlwZGVfc3RvcmUo
cGRlcCwgcGRlKQkJcHRlX3N0b3JlKHBkZXAsIHBkZSkKKworI2VuZGlmIC8qICEgUEhZU0FERFJf
NjRfQklUICovCisKKyNlbmRpZiAvKiAhIF9MT0NPUkUgKi8KKworI2lmIGRlZmluZWQoX19taXBz
X242NCkgfHwgZGVmaW5lZChfX21pcHNfbjMyKSAvKiAgUEhZU0FERFJfNjRfQklUICovCisKKyNp
Zm5kZWYgX0xPQ09SRQorLyoKKyAqIENoZWNrIHRvIHNlZSBpZiBhIFBERSBpcyBhY3R1YWxseSBh
IHN1cGVycGFnZSAoUGFnZVNpemUgPiA0SykgUFRFLgorICoKKyAqIE9uIF9fbWlwc19uNjQgdGhl
IGtlcm5lbCB1c2VzIHRoZSB2aXJ0dWFsIG1lbW9yeSBhZGRyZXNzIHJhbmdlIGZyb20KKyAqIFZN
X01JTl9LRVJORUxfQUREUkVTUyAoMHhjMDAwMDAwMDAwMDAwMDAwKSB0byBWTV9NQVhfS0VSTkVM
X0FERFJFU1MKKyAqICgweGMwMDAwMDgwMDAwMDAwMDApLiBUaGVyZWZvcmUsIGEgdmFsaWQgdmly
dHVhbCBhZGRyZXNzIGluIHRoZSBQREUKKyAqIChhIHBvaW50ZXIgdG8gYSBwYWdlIHRhYmxlKSB3
aWxsIGhhdmUgYml0cyA2MSB0byA0MCBzZXQgdG8gemVyby4gQQorICogc3VwZXJwYWdlIHdpbGwg
aGF2ZSBvbmUgb2YgdGhlIHN1cGVycGFnZSBzaXplIGJpdHMgKGJpdHMgNTggdG8gNTYpCisgKiBz
ZXQuCisgKi8KKworLyogSXMgdGhlIFBERSBhIHN1cGVycGFnZSBvZiBhbnkgc2l6ZT8gKi8KK3N0
YXRpYyBfX2lubGluZSBpbnQKK3BkZV9pc19zdXBlcnBhZ2UocGRfZW50cnlfdCAqcGRlKQorewor
CisJcmV0dXJuICgoKHB0X2VudHJ5X3QpKnBkZSAmIFBURV9QU19JRFhfTUFTSykgIT0gMCk7Cit9
CisKKy8qIElzIHRoZSBQVEUgYSBzdXBlcnBhZ2Ugb2YgYW55IHNpemU/ICovCitzdGF0aWMgX19p
bmxpbmUgaW50CitwdGVfaXNfc3VwZXJwYWdlKHB0X2VudHJ5X3QgKnB0ZSkKK3sKKworCXJldHVy
biAoKCpwdGUgJiBQVEVfUFNfSURYX01BU0spICE9IDApOworfQorCisvKiBJcyB0aGUgUERFIGFu
IDFNQiBzdXBlcnBhZ2U/ICovCitzdGF0aWMgX19pbmxpbmUgaW50CitwZGVfaXNfMW1fc3VwZXJw
YWdlKHBkX2VudHJ5X3QgKnBkZSkKK3sKKworCXJldHVybiAoKChwdF9lbnRyeV90KSpwZGUgJiBQ
VEVfUFNfMU0pID09IFBURV9QU18xTSk7Cit9CisKKy8qIElzIHRoZSBQVEUgYW4gMU1CIHN1cGVy
cGFnZT8gKi8KK3N0YXRpYyBfX2lubGluZSBpbnQKK3B0ZV9pc18xbV9zdXBlcnBhZ2UocHRfZW50
cnlfdCAqcHRlKQoreworCisJcmV0dXJuICgoKnB0ZSAmIFBURV9QU18xTSkgPT0gUFRFX1BTXzFN
KTsKK30KKworLyogUGh5c2ljYWwgQWRkcmVzcyB0byBTdXBlcnBhZ2UgUGh5c2ljYWwgRnJhbWUg
TnVtYmVyLiAqLworc3RhdGljIF9faW5saW5lIHB0X2VudHJ5X3QKK1RMQkxPX1BBX1RPX1NQRk4o
dm1fcGFkZHJfdCBwYSkKK3sKKworCXJldHVybiAoKChwYSA+PiBUTEJfMU1fU1VQRVJQQUdFX1NI
SUZUKSA8PCBUTEJMT19QRk5fU0hJRlQpICYKKwkgICAgVExCTE9fUEZOX01BU0spOworfQorCisv
KiBTdXBlcnBhZ2UgUGh5c2ljYWwgRnJhbWUgTnVtYmVyIHRvIFBoeXNpY2FsIEFkZHJlc3MuICov
CitzdGF0aWMgX19pbmxpbmUgdm1fcGFkZHJfdAorVExCTE9fU1BGTl9UT19QQShwdF9lbnRyeV90
IHNwZm4pCit7CisKKwlyZXR1cm4gKCh2bV9wYWRkcl90KShzcGZuID4+IFRMQkxPX1BGTl9TSElG
VCkgPDwKKwkgICAgVExCXzFNX1NVUEVSUEFHRV9TSElGVCk7Cit9CisKKy8qIFN1cGVycGFnZSBQ
YWdlIFRhYmxlIEVudHJ5IHRvIFBoeXNpY2FsIEFkZHJlc3MuICovCitzdGF0aWMgX19pbmxpbmUg
dm1fcGFkZHJfdAorVExCTE9fU1BURV9UT19QQShwdF9lbnRyeV90IHB0ZSkKK3sKKwlyZXR1cm4g
KFRMQkxPX1NQRk5fVE9fUEEoVExCTE9fUFRFX1RPX1BGTihwdGUpKSk7Cit9CisKK3N0YXRpYyBf
X2lubGluZSB2bV9wYWRkcl90CitUTEJMT19TUERFX1RPX1BBKHBkX2VudHJ5X3QgcGRlKQorewor
CXJldHVybiAoVExCTE9fU1BGTl9UT19QQShUTEJMT19QVEVfVE9fUEZOKChwdF9lbnRyeV90KXBk
ZSkpKTsKK30KKworCisvKiBBbiA0S0IgUGFnZSBUYWJsZSBFbnRyeSB0byBQaHlzaWNhbCBBZGRy
ZXNzLiAqLworc3RhdGljIF9faW5saW5lIHZtX3BhZGRyX3QKK1RMQkxPX1BURV9UT19QQShwdF9l
bnRyeV90IHB0ZSkKK3sKKworCXJldHVybiAoVExCTE9fUEZOX1RPX1BBKFRMQkxPX1BURV9UT19Q
Rk4ocHRlKSkpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm1fcGFkZHJfdAorVExCTE9fUERFX1RP
X1BBKHBkX2VudHJ5X3QgcGRlKQoreworCisJcmV0dXJuIChUTEJMT19QRk5fVE9fUEEoVExCTE9f
UFRFX1RPX1BGTigocHRfZW50cnlfdClwZGUpKSk7Cit9CisjZW5kaWYgLyogISBfTE9DT1JFICov
CisKKyNlbHNlIC8qICEgUEhZU0FERFJfNjRfQklUICovCisKKyNkZWZpbmUJcHRlX2lzX3JlZmVy
ZW5jZWQocHRlKQkJMAorI2RlZmluZQlwdGVfcmVmZXJlbmNlX3Jlc2V0KHB0ZSkKKyNkZWZpbmUJ
cHRlX3JlZmVyZW5jZV9wYWdlKHB0ZSkKKyNkZWZpbmUJcGRlX2lzX3N1cGVycGFnZShwZGUpCQkw
CisjZGVmaW5lCXB0ZV9pc19zdXBlcnBhZ2UocGRlKQkJMAorI2RlZmluZSBwZGVfaXNfMW1fc3Vw
ZXJwYWdlKHB0ZSkJMAorI2RlZmluZSBwdGVfaXNfMW1fc3VwZXJwYWdlKHB0ZSkJMAorCisjaWZu
ZGVmIF9MT0NPUkUKK3N0YXRpYyBfX2lubGluZSB2bV9wYWRkcl90CitUTEJMT19QVEVfVE9fUEEo
cHRfZW50cnlfdCBwdGUpCit7CisKKwlyZXR1cm4gKFRMQkxPX1BGTl9UT19QQShUTEJMT19QVEVf
VE9fUEZOKHB0ZSkpKTsKK30KKyNlbmRpZiAvKiAhIF9MT0NPUkUgKi8KKyNlbmRpZiAvKiAhIFBI
WVNBRERSXzY0X0JJVCAqLwogCiAvKiBBc3NlbWJseSBzdXBwb3J0IGZvciBQVEUgYWNjZXNzKi8K
ICNpZmRlZiBMT0NPUkUKQEAgLTE2NywxNiArNTEwLDEwNCBAQAogI2RlZmluZQlQVEVNQVNLCQkJ
MHhmZjgKICNkZWZpbmUJUFRFU0laRQkJCTgKICNkZWZpbmUJUFRFX0wJCQlsZAorI2RlZmluZQlQ
VEVfUwkJCXNkCiAjZGVmaW5lCVBURV9NVEMwCQlkbXRjMAotI2RlZmluZQlDTEVBUl9QVEVfU1dC
SVRTKHByKQotI2Vsc2UKKyNkZWZpbmUJQ0xFQVJfUFRFX1NXQklUUyhyKQorCisjaWZkZWYgTUlQ
UzY0X05FV19QTUFQCisKKy8qIFN1cGVycGFnZSBhbmQgcmVmZXJlbmNlZCBiaXQgZW11bGF0aW9u
IEFTTSBtYWNyb3MuICovCisKKy8qCisgKiBHRVRfU1VQRVJQQUdFX0lEWChyKQorICoKKyAqIEdl
dCB0aGUgc3VwZXJwYWdlIGluZGV4IGZyb20gdGhlIFBURSBieSBzaGlmdGluZyBpdCBsZWZ0IGJ5
CisgKiBQVEVfUFNJRFhfTkJJVFNfVE9fTEVGVCAoY2xlYXJpbmcgdGhlIHVwcGVyIHNvZnRiaXRz
KSBhbmQgdGhlbiBiYWNrIHRvIHRoZQorICogcmlnaHQgYnkgKFBURV9QU0lEWF9OQklUU19UT19S
SUdIVCArIFBURV9QU0lEWF9OQklUU19UT19SSUdIVCkgY2xlYXJpbmcKKyAqIGFsbCB0aGUgbG93
ZXIgYml0cyBpbiB0aGUgcHJvY2Vzcy4KKyAqLworI2RlZmluZSBHRVRfU1VQRVJQQUdFX0lEWChy
KQkJCQlcCisJZHNsbAlyLCAoUFRFX1BTSURYX05CSVRTX1RPX0xFRlQpOwkJXAorCWRzcmwzMgly
LCAoUFRFX1BTSURYX05CSVRTX1RPX1JJR0hUICsgUFRFX1BTSURYX05CSVRTX1RPX0xFRlQgLSAz
MikKKworLyoKKyAqIEdFVF9IV19UTEJfRkxBR1MocikKKyAqCisgKiBHZXQgdGhlIGxvd2VyIGhh
cmR3YXJlIFRMQiBmbGFncyBidXQgc2hpZnRpbmcgbGVmdCB0aGVuIHJpZ2h0LgorICovCisjZGVm
aW5lIEdFVF9IV19UTEJfRkxBR1MocikJCQkJXAorCWRzbGwzMglyLCAoUFRFX0hXRkxBR1NfTkJJ
VFNfVE9fTEVGVCAtIDMyKTsJXAorCWRzcmwzMglyLCAoUFRFX0hXRkxBR1NfTkJJVFNfVE9fTEVG
VCAtIDMyKQorCisvKgorICogR0VUX09ERF8xTV9QRk5fRlJPTV9FVkVOKHIpCisgKgorICogR2V0
IHRoZSBvZGQgMU0gUEZOIChUTEIgbG8xKSBmcm9tIHRoZSBldmVuIDFNIFBURS4gIEZpcnN0LCBt
YXNrIG91dCB0aGUgUEZOCisgKiBmcm9tIHRoZSBldmVuIFBURS4gVGhlbiBhZGQgMU0gd29ydGgg
b2YgcGFnZXMgdG8gaXQgKDI1NikuIEZpbmFsbHksIHNoaWZ0IGl0CisgKiBiYWNrIHRvIGl0cyBw
b3NpdGlvbiBpbiB0aGUgUFRFLgorICovCisjZGVmaW5lIEdFVF9PRERfMU1fUEZOX0ZST01fRVZF
TihyKQkJCVwKKwlkc2xsCXIsIChQVEVfUEZOX05CSVRTX1RPX0xFRlQpOwkJXAorCWRzcmwJciwg
KFBURV9QRk5fTkJJVFNfVE9fTEVGVCArIFBURV9QRk5fTkJJVFNfVE9fUklHSFQpOyBcCisJZGFk
ZGl1CXIsIHIsICgxMDI0ICogMTAyNCAvIFBBR0VfU0laRSk7CVwKKwlkc2xsCXIsIChQVEVfUEZO
X05CSVRTX1RPX1JJR0hUKQorCisvKgorICogSUZfVkFMSURfU0VUX1JFRkJJVChyMCwgcjEsIG9m
ZnNldCwgdW5pcXVlKQorICoKKyAqIElmIGEgUERFIGlzIHZhbGlkIHRoZW4gc2V0IHRoZSByZWZl
cmVuY2VkIGJpdCAoUFRFX1ZSKS4gIFRoZSBmaXJzdCB2ZXJzaW9uCisgKiBkb2VzIGl0IGF0b21p
Y2FsbHkuCisgKi8KKyNkZWZpbmUgQVRPTUlDX1JFRkJJVF9VUERBVEUKKyNpZmRlZiBBVE9NSUNf
UkVGQklUX1VQREFURQorCisjZGVmaW5lIElGX1ZBTElEX1NFVF9SRUZCSVQocjAsIHIxLCBvZmZz
ZXQsIHVuaXF1ZSkJXAordHJ5X2FnYWluICMjIHVuaXF1ZSAjIyA6IDsJCQkJXAorCWRzcmwzMgly
MCwgKFRMQkxPX1NXQklUU19TSElGVCAtIDMyKTsJCVwKKwlhbmRpCXIwLCByMCwgU1dfVkFMSUQ7
CQkJXAorCWJlcXoJcjAsIG5vdF92YWxpZCAjIyB1bmlxdWUgOwkJXAorCVBURV9MCXIwLCBvZmZz
ZXQgIyMgKHIxKSA7CQkJXAorCWxsZAlyMCwgb2Zmc2V0ICMjIChyMSkgOwkJCVwKKwlvcmkJcjAs
IHIwLCBQVEVfVlIgOwkJCVwKKwlzY2QJcjAsIG9mZnNldCAjIyAocjEpIDsJCQlcCisJYmVxegly
MCwgdHJ5X2FnYWluICMjIHVuaXF1ZSA7CQlcCisJUFRFX0wJcjAsIG9mZnNldCAjIyAocjEpIDsJ
CQlcCitub3RfdmFsaWQgIyMgdW5pcXVlICMjIDoKKworI2Vsc2UgLyogISBBVE9NSUNfUkVGQklU
X1VQREFURSAqLworCisjZGVmaW5lIElGX1ZBTElEX1NFVF9SRUZCSVQocjAsIHIxLCBvZmZzZXQs
IHVuaXF1ZSkJXAordHJ5X2FnYWluICMjIHVuaXF1ZSAjIyA6IDsJCQkJXAorCWRzcmwzMglyMCwg
KFRMQkxPX1NXQklUU19TSElGVCAtIDMyKSA7CQlcCisJYW5kaQlyMCwgcjAsIFNXX1ZBTElEIDsJ
CQlcCisJYmVxeglyMCwgbm90X3ZhbGlkICMjIHVuaXF1ZSA7CQlcCisJUFRFX0wJcjAsIG9mZnNl
dCAjIyAocjEpIDsJCQlcCisJb3JpCXIwLCByMCwgUFRFX1ZSIDsJCQlcCisJUFRFX1MJcjAsIG9m
ZnNldCAjIyAocjEpIDsJCQlcCitub3RfdmFsaWQgIyMgdW5pcXVlICMjIDoKKyNlbmRpZiAvKiAh
IEFUT01JQ19SRUZCSVRfVVBEQVRFICovCisKKyNlbHNlIC8qICEgTUlQUzY0X05FV19QTUFQICov
CisKKyNkZWZpbmUJR0VUX1NVUEVSUEFHRV9JRFgocikKKyNkZWZpbmUgR0VUX0hXX1RMQl9GTEFH
UyhyKQorI2RlZmluZQlJRl9WQUxJRF9TRVRfUkVGQklUKHIwLCByMSwgb2Zmc2V0LCB1bmlxdWUp
CisKKyNlbmRpZiAvKiAhIE1JUFM2NF9ORVdfUE1BUCAqLworCisjZWxzZSAvKiAhIExPQ09SRSAq
LwogI2RlZmluZQlQVEVTSElGVAkJMgogI2RlZmluZQlQVEUyTUFTSwkJMHhmZjgJLyogZm9yIHRo
ZSAyLXBhZ2UgbG8wL2xvMSAqLwogI2RlZmluZQlQVEVNQVNLCQkJMHhmZmMKICNkZWZpbmUJUFRF
U0laRQkJCTQKICNkZWZpbmUJUFRFX0wJCQlsdworI2RlZmluZQlQVEVfUwkJCXN3CiAjZGVmaW5l
CVBURV9NVEMwCQltdGMwCiAjZGVmaW5lCUNMRUFSX1BURV9TV0JJVFMocikJTE9OR19TTEwgciwg
VExCTE9fU1dCSVRTX0NMRUFSX1NISUZUOyBMT05HX1NSTCByLCBUTEJMT19TV0JJVFNfQ0xFQVJf
U0hJRlQgLyogcmVtb3ZlIHN3Yml0cyAqLworCisjZGVmaW5lCUlTX1BURV9WQUxJRChyMCwgcjEs
IG9mZnNldCwgbGFiZWwpCisjZGVmaW5lCVNFVF9SRUZfQklUKHIwLCByMSwgb2Zmc2V0KQorCiAj
ZW5kaWYgLyogZGVmaW5lZChfX21pcHNfbjY0KSB8fCBkZWZpbmVkKF9fbWlwc19uMzIpICovCiAK
ICNpZiBkZWZpbmVkKF9fbWlwc19uNjQpCkBAIC0yMDEsNCArNjMyLDE3IEBACiAjZGVmaW5lCU1J
UFMzX1BHTUFTS182NE0JMHgwN2ZmZTAwMAogI2RlZmluZQlNSVBTM19QR01BU0tfMjU2TQkweDFm
ZmZlMDAwCiAKKworLyogUGFnZU1hc2sgUmVnaXN0ZXIgKENQMCBSZWdpc3RlciA1LCBTZWxlY3Qg
MCkgVmFsdWVzICovCisjZGVmaW5lCU1JUFMzX1BHTUFTS19NQVNLWAkweDAwMDAxODAwCisjZGVm
aW5lCU1JUFMzX1BHTUFTS180SwkJMHgwMDAwMDAwMAorI2RlZmluZQlNSVBTM19QR01BU0tfMTZL
CTB4MDAwMDYwMDAKKyNkZWZpbmUJTUlQUzNfUEdNQVNLXzY0SwkweDAwMDFlMDAwCisjZGVmaW5l
CU1JUFMzX1BHTUFTS18yNTZLCTB4MDAwN2UwMDAKKyNkZWZpbmUJTUlQUzNfUEdNQVNLXzFNCQkw
eDAwMWZlMDAwCisjZGVmaW5lCU1JUFMzX1BHTUFTS180TQkJMHgwMDdmZTAwMAorI2RlZmluZQlN
SVBTM19QR01BU0tfMTZNCTB4MDFmZmUwMDAKKyNkZWZpbmUJTUlQUzNfUEdNQVNLXzY0TQkweDA3
ZmZlMDAwCisjZGVmaW5lCU1JUFMzX1BHTUFTS18yNTZNCTB4MWZmZmUwMDAKKwogI2VuZGlmIC8q
ICFfTUFDSElORV9QVEVfSF8gKi8KZGlmZiAtLWdpdCBhL3N5cy9taXBzL2luY2x1ZGUvcG1hcC5o
IGIvc3lzL21pcHMvaW5jbHVkZS9wbWFwLmgKLS0tIGEvc3lzL21pcHMvaW5jbHVkZS9wbWFwLmgK
KysrIGIvc3lzL21pcHMvaW5jbHVkZS9wbWFwLmgKQEAgLTYyLDE1ICs2MiwyNCBAQAogI2luY2x1
ZGUgPHN5cy9fbG9jay5oPgogI2luY2x1ZGUgPHN5cy9fbXV0ZXguaD4KIAorI2lmZGVmIE1JUFM2
NF9ORVdfUE1BUAorI2luY2x1ZGUgPHZtL192bV9yYWRpeC5oPgorI2VuZGlmIC8qIE1JUFM2NF9O
RVdfUE1BUCAqLworCiAvKgogICogUG1hcCBzdHVmZgogICovCiBzdHJ1Y3QgcHZfZW50cnk7CiBz
dHJ1Y3QgcHZfY2h1bms7CiAKIHN0cnVjdCBtZF9wYWdlIHsKLQlpbnQgcHZfZmxhZ3M7CiAJVEFJ
TFFfSEVBRCgsIHB2X2VudHJ5KSBwdl9saXN0OworCXZtX21lbWF0dHJfdCBwdl9tZW1hdHRyOwor
I2lmZGVmIE1JUFM2NF9ORVdfUE1BUAorCWludCBwdl9nZW47CisjZWxzZSAvKiAhIE1JUFM2NF9O
RVdfUE1BUCAqLworCWludCBwdl9mbGFnczsKKyNlbmRpZiAvKiAhIE1JUFM2NF9ORVdfUE1BUCAq
LwogfTsKIAogI2RlZmluZQlQVl9UQUJMRV9SRUYJCTB4MDIJLyogcmVmZXJlbmNlZCAqLwpAQCAt
ODEsMTUgKzkwLDE4IEBACiAjZGVmaW5lCUFTSURHRU5fTUFTSwkJKCgxIDw8IEFTSURHRU5fQklU
UykgLSAxKQogCiBzdHJ1Y3QgcG1hcCB7CisJc3RydWN0IG10eCBwbV9tdHg7CiAJcGRfZW50cnlf
dCAqcG1fc2VndGFiOwkvKiBLVkEgb2Ygc2VnbWVudCB0YWJsZSAqLwogCVRBSUxRX0hFQUQoLCBw
dl9jaHVuaykJcG1fcHZjaHVuazsJLyogbGlzdCBvZiBtYXBwaW5ncyBpbiBwbWFwICovCiAJY3B1
c2V0X3QJcG1fYWN0aXZlOwkJLyogYWN0aXZlIG9uIGNwdXMgKi8KIAlzdHJ1Y3QgewogCQl1X2lu
dDMyX3QgYXNpZDpBU0lEX0JJVFM7CS8qIFRMQiBhZGRyZXNzIHNwYWNlIHRhZyAqLwogCQl1X2lu
dDMyX3QgZ2VuOkFTSURHRU5fQklUUzsJLyogaXRzIGdlbmVyYXRpb24gbnVtYmVyICovCiAJfSAg
ICAgIHBtX2FzaWRbTUFYU01QQ1BVXTsKIAlzdHJ1Y3QgcG1hcF9zdGF0aXN0aWNzIHBtX3N0YXRz
OwkvKiBwbWFwIHN0YXRpc3RpY3MgKi8KLQlzdHJ1Y3QgbXR4IHBtX210eDsKKyNpZmRlZiBNSVBT
NjRfTkVXX1BNQVAKKwlzdHJ1Y3Qgdm1fcmFkaXggcG1fcm9vdDsJCS8qIHNwYXJlIHBhZ2UgdGFi
bGUgcGFnZXMgKi8KKyNlbmRpZiAvKiBNSVBTNjRfTkVXX1BNQVAgKi8KIH07CiAKIHR5cGVkZWYg
c3RydWN0IHBtYXAgKnBtYXBfdDsKQEAgLTEyMSw3ICsxMzMsNyBAQAogICovCiB0eXBlZGVmIHN0
cnVjdCBwdl9lbnRyeSB7CiAJdm1fb2Zmc2V0X3QgcHZfdmE7CS8qIHZpcnR1YWwgYWRkcmVzcyBm
b3IgbWFwcGluZyAqLwotCVRBSUxRX0VOVFJZKHB2X2VudHJ5KSBwdl9saXN0OworCVRBSUxRX0VO
VFJZKHB2X2VudHJ5KSBwdl9uZXh0OwogfSAgICAgICAqcHZfZW50cnlfdDsKIAogLyoKQEAgLTE2
OSw2ICsxODEsOCBAQAogCiB2b2lkIHBtYXBfYm9vdHN0cmFwKHZvaWQpOwogdm9pZCAqcG1hcF9t
YXBkZXYodm1fcGFkZHJfdCwgdm1fc2l6ZV90KTsKK2Jvb2xlYW5fdCBwbWFwX3BhZ2VfaXNfbWFw
cGVkKHZtX3BhZ2VfdCBtKTsKK3ZvaWQgcG1hcF9wYWdlX3NldF9tZW1hdHRyKHZtX3BhZ2VfdCBt
LCB2bV9tZW1hdHRyX3QgbWEpOwogdm9pZCBwbWFwX3VubWFwZGV2KHZtX29mZnNldF90LCB2bV9z
aXplX3QpOwogdm1fb2Zmc2V0X3QgcG1hcF9zdGVhbF9tZW1vcnkodm1fc2l6ZV90IHNpemUpOwog
dm9pZCBwbWFwX2tlbnRlcih2bV9vZmZzZXRfdCB2YSwgdm1fcGFkZHJfdCBwYSk7CkBAIC0xNzgs
NiArMTkyLDcgQEAKIHZvaWQgcG1hcF9rZW50ZXJfdGVtcG9yYXJ5X2ZyZWUodm1fcGFkZHJfdCBw
YSk7CiB2b2lkIHBtYXBfZmx1c2hfcHZjYWNoZSh2bV9wYWdlX3QgbSk7CiBpbnQgcG1hcF9lbXVs
YXRlX21vZGlmaWVkKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSk7CitpbnQgcG1hcF9lbXVs
YXRlX3JlZmVyZW5jZWQocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhKTsKIHZvaWQgcG1hcF9w
YWdlX3NldF9tZW1hdHRyKHZtX3BhZ2VfdCwgdm1fbWVtYXR0cl90KTsKIAogI2VuZGlmCQkJCS8q
IF9LRVJORUwgKi8KZGlmZiAtLWdpdCBhL3N5cy9taXBzL2luY2x1ZGUvcGFyYW0uaCBiL3N5cy9t
aXBzL2luY2x1ZGUvcGFyYW0uaAotLS0gYS9zeXMvbWlwcy9pbmNsdWRlL3BhcmFtLmgKKysrIGIv
c3lzL21pcHMvaW5jbHVkZS9wYXJhbS5oCkBAIC0xNjMsMTcgKzE2MywzOCBAQAogCiAjZGVmaW5l
CU1BWERVTVBQR1MJCTEJCS8qIHh4eDogd2h5IGlzIHRoaXMgb25seSBvbmU/ICovCiAKKyNpZmRl
ZiBLU1RBQ0tfTEFSR0VfUEFHRQorLyoKKyAqIEZvciBhIGxhcmdlIGtlcm5lbCBzdGFjayBwYWdl
IHRoZSBLU1RBQ0tfU0laRSBuZWVkcyB0byBiZSBhIHBhZ2Ugc2l6ZQorICogc3VwcG9ydGVkIGJ5
IHRoZSBoYXJkd2FyZSAoZS5nLiAxNkspLgorICovCisjZGVmaW5lCUtTVEFDS19TSVpFCQkoMSA8
PCAxNCkJLyogU2luZ2xlIDE2SyBwYWdlICovCisjZGVmaW5lCUtTVEFDS19QQUdFX1NJWkUJS1NU
QUNLX1NJWkUKKyNkZWZpbmUJS1NUQUNLX1BBR0VfTUFTSwkoS1NUQUNLX1BBR0VfU0laRSAtIDEp
CisjZGVmaW5lCUtTVEFDS19QQUdFUwkJKEtTVEFDS19TSVpFIC8gUEFHRV9TSVpFKQorI2RlZmlu
ZQlLU1RBQ0tfVExCTUFTS19NQVNLCSgoS1NUQUNLX1BBR0VfTUFTSyA+PiAoVExCTUFTS19TSElG
VCAtIDEpKSBcCisJCQkJCTw8IFRMQk1BU0tfU0hJRlQpCisjZGVmaW5lCUtTVEFDS19HVUFSRF9Q
QUdFUwkoKEtTVEFDS19QQUdFX1NJWkUgKiAyKSAvIFBBR0VfU0laRSkKKworI2Vsc2UgLyogISBL
U1RBQ0tfTEFSR0VfUEFHRSAqLworCiAvKgogICogVGhlIGtlcm5lbCBzdGFjayBuZWVkcyB0byBi
ZSBhbGlnbmVkIG9uIGEgKFBBR0VfU0laRSAqIDIpIGJvdW5kYXJ5LgogICovCiAjZGVmaW5lCUtT
VEFDS19QQUdFUwkJMgkvKiBrZXJuZWwgc3RhY2sgKi8KKyNkZWZpbmUJS1NUQUNLX1NJWkUJCShL
U1RBQ0tfUEFHRVMgKiBQQUdFX1NJWkUpCisjZGVmaW5lCUtTVEFDS19QQUdFX1NJWkUJUEFHRV9T
SVpFCisjZGVmaW5lCUtTVEFDS19QQUdFX01BU0sJKFBBR0VfU0laRSAtIDEpCiAjZGVmaW5lCUtT
VEFDS19HVUFSRF9QQUdFUwkyCS8qIHBhZ2VzIG9mIGtzdGFjayBndWFyZDsgMCBkaXNhYmxlcyAq
LworI2VuZGlmIC8qICEgS1NUQUNLX0xBUkdFX1BBR0UgKi8KIAogLyoKICAqIE1hY2ggZGVyaXZl
ZCBjb252ZXJzaW9uIG1hY3JvcwogICovCiAjZGVmaW5lCXJvdW5kX3BhZ2UoeCkJCSgoKHgpICsg
UEFHRV9NQVNLKSAmIH5QQUdFX01BU0spCiAjZGVmaW5lCXRydW5jX3BhZ2UoeCkJCSgoeCkgJiB+
UEFHRV9NQVNLKQorI2RlZmluZQlyb3VuZF8ybXBhZ2UoeCkJCSgoKHgpICsgUERSTUFTSykgJiB+
UERSTUFTSykKKyNkZWZpbmUJdHJ1bmNfMm1wYWdlKHgpCQkoKHgpICYgflBEUk1BU0spCiAKICNk
ZWZpbmUJYXRvcCh4KQkJCSgoeCkgPj4gUEFHRV9TSElGVCkKICNkZWZpbmUJcHRvYSh4KQkJCSgo
eCkgPDwgUEFHRV9TSElGVCkKZGlmZiAtLWdpdCBhL3N5cy9jb25mL29wdGlvbnMubWlwcyBiL3N5
cy9jb25mL29wdGlvbnMubWlwcwotLS0gYS9zeXMvY29uZi9vcHRpb25zLm1pcHMKKysrIGIvc3lz
L2NvbmYvb3B0aW9ucy5taXBzCkBAIC05NywxMSArOTcsMjQgQEAKIEJFUklfTEFSR0VfVExCCQkJ
b3B0X2dsb2JhbC5oCiAKICMKKyMgVXNlIHRoZSBuZXcgcG1hcCBmb3IgTUlQUzY0IHRoYXQgaW5j
bHVkZXMgcmVmZXJlbmNlIGJpdCBlbXVsYXRpb24KKyMgYW5kIHN1cGVycGFnZSBzdXBwb3J0Lgor
IworTUlQUzY0X05FV19QTUFQCQkJb3B0X2dsb2JhbC5oCisKKyMKICMgT3B0aW9ucyB0aGF0IGNv
bnRyb2wgdGhlIE5ldEZQR0EtMTBHIEVtYmVkZGVkIENQVSBFdGhlcm5ldCBDb3JlLgogIwogTkYx
MEJNQUNfNjRCSVQJCQlvcHRfbmV0ZnBnYS5oCiAKICMKKyMgT3B0aW9ucyBmb3IgaGFyZHdhcmUg
d2l0aCBQYWdlTWFzayByZWdpc3RlciBzdXBwb3J0CisjCisKKyMgVXNlIG9uZSBsYXJnZSBwYWdl
IChjdXJyZW50bHkgMTZLKSBmb3IgdGhlIGtlcm5lbCB0aHJlYWQgc3RhY2sKK0tTVEFDS19MQVJH
RV9QQUdFICAgCQlvcHRfZ2xvYmFsLmgKKworIwogIyBPcHRpb25zIHRoYXQgY29udHJvbCB0aGUg
QXRoZXJvcyBTb0MgcGVyaXBoZXJhbHMKICMKIEFSR0VfREVCVUcJCQlvcHRfYXJnZS5oCmRpZmYg
LS1naXQgYS9zeXMvY29uZi9maWxlcy5taXBzIGIvc3lzL2NvbmYvZmlsZXMubWlwcwotLS0gYS9z
eXMvY29uZi9maWxlcy5taXBzCisrKyBiL3N5cy9jb25mL2ZpbGVzLm1pcHMKQEAgLTMxLDcgKzMx
LDggQEAKIG1pcHMvbWlwcy9uZXh1cy5jCQkJc3RhbmRhcmQKIG1pcHMvbWlwcy9vZndfbWFjaGRl
cC5jCQkJb3B0aW9uYWwJZmR0CiBtaXBzL21pcHMvcG1fbWFjaGRlcC5jCQkJc3RhbmRhcmQKLW1p
cHMvbWlwcy9wbWFwLmMJCQlzdGFuZGFyZAorbWlwcy9taXBzL3BtYXAuYwkJCW9wdGlvbmFsCSFt
aXBzNjRfbmV3X3BtYXAKK21pcHMvbWlwcy9wbWFwX21pcHM2NC5jCQkJb3B0aW9uYWwJbWlwczY0
X25ld19wbWFwCiBtaXBzL21pcHMvcHRyYWNlX21hY2hkZXAuYwkJc3RhbmRhcmQKIG1pcHMvbWlw
cy9zY19tYWNoZGVwLmMJCQlzdGFuZGFyZAogbWlwcy9taXBzL3N0YWNrX21hY2hkZXAuYwkJb3B0
aW9uYWwJZGRiIHwgc3RhY2sKCg==


--b1_8a01977bc2405e827dd78c8dca1d7216--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?8a01977bc2405e827dd78c8dca1d7216>