Prototype of C extension using Python limited API

Matthieu Longo via Gdb <[email protected]> Thu, 28 May 2026 17:25:16 +0100
Newsgroups gmane.comp.gdb.devel
Message-ID <[email protected]>
--------------cppodQLVXVysT6VYZf3htHxi
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit

Hi Tom,

As I previously told you (at least, I believe so but I am not 100% sure), I finished migrating all 
the Python C extensions some time ago. I had discovered some issues with a case of inheritance 
causing unexpected crashes.
To facilitate the debugging, I decided to implement a prototype outside of GDB, and managed to make 
it work. I finally got the prototype reviewed by Victor Stinner, a Python core developer, to 
double-check whether my design was working as expected.

Please find attached my last iteration. I also provided an archive which should be more convenient 
for you if you want to compile and test it.

Could you please review it so that we validate this new approach before I migrate all my previous 
patches to it ?

PS:
- a README is provided with all the needed instruction inside.
- this patch contains code from outside GDB's repository, and should not be merged inside GDB's 
repository.

Regards,
Matthieu
--------------cppodQLVXVysT6VYZf3htHxi
Content-Type: text/plain; charset=UTF-8; name="prototype.patch"
Content-Disposition: attachment; filename="prototype.patch"
Content-Transfer-Encoding: base64

ZGlmZiAtLWdpdCBhL0NNYWtlTGlzdHMudHh0IGIvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMyMDAwMAotLS0gL2Rldi9udWxsCisrKyBiL0NNYWtl
TGlzdHMudHh0CkBAIC0wLDAgKzEsNTUgQEAKK2NtYWtlX21pbmltdW1fcmVxdWlyZWQoVkVSU0lP
TiA0LjMpCitwcm9qZWN0KFB5dGhvbkNwcEV4dGVuc2lvbikKK3NldChDTUFLRV9DWFhfU1RBTkRB
UkQgMTcpCitzZXQoQ01BS0VfQ1hYX1NUQU5EQVJEX1JFUVVJUkVEIE9OKQorc2V0KENNQUtFX0NY
WF9FWFRFTlNJT05TIE9GRikKKworZmluZF9wYWNrYWdlKFB5dGhvbjMgIjMuMTQiIENPTVBPTkVO
VFMgSW50ZXJwcmV0ZXIgRGV2ZWxvcG1lbnQpCisKK3NldCAoQ01BS0VfQ19GTEFHUyAiJHtDTUFL
RV9DX0ZMQUdTfSAtZmRpYWdub3N0aWNzLWNvbG9yPWFsd2F5cyIpCitzZXQgKENNQUtFX0NYWF9G
TEFHUyAiJHtDTUFLRV9DWFhfRkxBR1N9IC1mZGlhZ25vc3RpY3MtY29sb3I9YWx3YXlzIikKKwor
I3NldCAoQ01BS0VfQ19GTEFHUyAiJHtDTUFLRV9DX0ZMQUdTfSAtZnNhbml0aXplPWFkZHJlc3Mg
LWZzYW5pdGl6ZT1sZWFrIikKKyNzZXQgKENNQUtFX0NYWF9GTEFHUyAiJHtDTUFLRV9DWFhfRkxB
R1N9IC1mc2FuaXRpemU9YWRkcmVzcyAtZnNhbml0aXplPWxlYWsiKQorCitzZXQoU1JDUworICAg
ICJzcmMvZ2RiLW90aGVycy5jcHAiCisgICAgInNyYy9weS1vYmotdHlwZS5jcHAiCisgICAgInNy
Yy9weXRob24taW50ZXJuYWwuY3BwIgorICAgICJzcmMvbXlfcHlfbW9kdWxlLmNwcCIKKyAgICAi
c3JjL0EuY3BwIgorICAgICJzcmMvQi5jcHAiCisgICAgInNyYy9PYmpXaXRoQWxsb2MuY3BwIikK
K2FkZF9saWJyYXJ5KE15TW9kdWxlIFNIQVJFRCAke1NSQ1N9KQorc2V0X3RhcmdldF9wcm9wZXJ0
aWVzKAorICAgIE15TW9kdWxlCisgICAgUFJPUEVSVElFUworICAgICAgICBQUkVGSVggIiIKKyAg
ICAgICAgT1VUUFVUX05BTUUgIk15TW9kdWxlIgorICAgICAgICBMSU5LRVJfTEFOR1VBR0UgQwor
ICAgICAgICBMSU5LX0xJQlJBUklFUyBQeXRob24zOjpQeXRob24KKyAgICAgICAgSU5DTFVERV9E
SVJFQ1RPUklFUyAiJHtQWVRIT05fSU5DTFVERV9ESVJ9OyR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0Vf
RElSfS9pbmNsdWRlOyR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9zcmMiCisgICAgICAgIENP
TVBJTEVfREVGSU5JVElPTlMgIlB5X0xJTUlURURfQVBJPTB4MDMwZTAwMDAiCisgICAgKQorCith
ZGRfZXhlY3V0YWJsZShQeURlYnVnICJweWRiZy5jcHAiKQordGFyZ2V0X2xpbmtfbGlicmFyaWVz
KFB5RGVidWcgJHtQWVRIT05fTElCUkFSSUVTfSkKK3NldF90YXJnZXRfcHJvcGVydGllcygKKyAg
ICBQeURlYnVnCisgICAgUFJPUEVSVElFUworICAgICAgICBQUkVGSVggIiIKKyAgICAgICAgT1VU
UFVUX05BTUUgIlB5RGVidWciCisgICAgICAgIExJTktFUl9MQU5HVUFHRSBDCisgICAgICAgIExJ
TktfTElCUkFSSUVTIFB5dGhvbjM6OlB5dGhvbgorICAgICAgICBJTkNMVURFX0RJUkVDVE9SSUVT
ICIke1BZVEhPTl9JTkNMVURFX0RJUn07JHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9IgorICAg
ICkKKworYWRkX2N1c3RvbV90YXJnZXQodGVzdC1weWRlYnVnCisgICAgICAgICAgICAgICAgICBD
T01NQU5EIGNtYWtlIC1FIGVudiBQWVRIT05QQVRIPSR7Q01BS0VfQklOQVJZX0RJUn0gJHtDTUFL
RV9CSU5BUllfRElSfS9QeURlYnVnIDI+JjEKKyAgICAgICAgICAgICAgICAgIFZFUkJBVElNKQor
YWRkX2RlcGVuZGVuY2llcyh0ZXN0LXB5ZGVidWcgUHlEZWJ1ZykKKworYWRkX2N1c3RvbV90YXJn
ZXQodGVzdC1weQorICAgICAgICAgICAgICAgICAgQ09NTUFORCBjbWFrZSAtRSBlbnYgUFlUSE9O
UEFUSD0ke0NNQUtFX0JJTkFSWV9ESVJ9IHB5dGhvbjMgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9E
SVJ9L3Rlc3QucHkKKyAgICAgICAgICAgICAgICAgIFZFUkJBVElNKQorYWRkX2RlcGVuZGVuY2ll
cyh0ZXN0LXB5IE15TW9kdWxlKQpkaWZmIC0tZ2l0IGEvUkVBRE1FLm1kIGIvUkVBRE1FLm1kCm5l
dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjOWZhZmUKLS0tIC9kZXYvbnVsbAor
KysgYi9SRUFETUUubWQKQEAgLTAsMCArMSw2NSBAQAorIyMgQnVpbGQKKworYGBgYmFzaAorY21h
a2UgLUcgTmluamEgLURDTUFLRV9CVUlMRF9UWVBFPURlYnVnIC1CIGJ1aWxkLWRpcgorYGBgCisK
KyMjIFRlc3RpbmcKKworYGBgYmFzaAorY2QgYnVpbGQtZGlyCituaW5qYSAmJiBuaW5qYSB0ZXN0
LXB5ZGVidWcKKyMgT1IgdG8gZ2V0IHRoZSBlcnJvciBtZXNzYWdlIHRoYXQgaXMgc3dhbGxlZCBi
eSBDTWFrZQorUFlUSE9OUEFUSD0kKHB3ZCkgLi9QeURlYnVnCitgYGAKKworIyMjIEV4cGVjdGVk
IG91dHB1dAorCitgYGB0ZXh0CitbJ19fY2xhc3NfXycsICdfX2RlbGF0dHJfXycsICdfX2RpY3Rf
XycsICdfX2Rpcl9fJywgJ19fZG9jX18nLCAnX19lcV9fJywgJ19fZmlyc3RsaW5lbm9fXycsICdf
X2Zvcm1hdF9fJywgJ19fZ2VfXycsICdfX2dldGF0dHJpYnV0ZV9fJywgJ19fZ2V0c3RhdGVfXycs
ICdfX2d0X18nLCAnX19oYXNoX18nLCAnX19pbml0X18nLCAnX19pbml0X3N1YmNsYXNzX18nLCAn
X19sZV9fJywgJ19fbHRfXycsICdfX21vZHVsZV9fJywgJ19fbmVfXycsICdfX25ld19fJywgJ19f
cmVkdWNlX18nLCAnX19yZWR1Y2VfZXhfXycsICdfX3JlcHJfXycsICdfX3NldGF0dHJfXycsICdf
X3NpemVvZl9fJywgJ19fc3RhdGljX2F0dHJpYnV0ZXNfXycsICdfX3N0cl9fJywgJ19fc3ViY2xh
c3Nob29rX18nLCAnX193ZWFrcmVmX18nLCAnX2N5Y2xlJywgJ2ZvbycsICdpYW1hJywgJ2lhbWIn
LCAnbmFtZSddCitCIEhlbGxvIEkgYW0gQSBIZWxsbyBJIGFtIGJvdGggQSBhbmQgQgorQ2FsbGlu
ZyBFOjp0cF90cmF2ZXJzZV9pbXBsCistLT4gQl90cmF2ZXJzZQorRTogY2FsbGluZyBNeU1vZHVs
ZS5BOjp0cF90cmF2ZXJzZQorQ2FsbGluZyBFOjp0cF90cmF2ZXJzZV9pbXBsCistLT4gQV90cmF2
ZXJzZQordmlzaXRpbmcgX19kaWN0X18KK0U6IGNhbGxpbmcgUHlfVklTSVQgKFB5X1RZUEUgKHNl
bGYpKQorRTogc2tpcHBpbmcgUHlfVklTSVQgKFB5X1RZUEUgKHNlbGYpKSwgd2lsbCBjYWxsIGl0
IGluIE15TW9kdWxlLkEKK0NhbGxpbmcgRTo6dHBfdHJhdmVyc2VfaW1wbAorLS0+IEJfdHJhdmVy
c2UKK0U6IGNhbGxpbmcgTXlNb2R1bGUuQTo6dHBfdHJhdmVyc2UKK0NhbGxpbmcgRTo6dHBfdHJh
dmVyc2VfaW1wbAorLS0+IEFfdHJhdmVyc2UKK3Zpc2l0aW5nIF9fZGljdF9fCitFOiBjYWxsaW5n
IFB5X1ZJU0lUIChQeV9UWVBFIChzZWxmKSkKK0U6IHNraXBwaW5nIFB5X1ZJU0lUIChQeV9UWVBF
IChzZWxmKSksIHdpbGwgY2FsbCBpdCBpbiBNeU1vZHVsZS5BCitDYWxsaW5nIChudWxsKTo6dHBf
Y2xlYXJfaW1wbAorLS0+IEJfY2xlYXIKKyhudWxsKTogY2FsbGluZyBNeU1vZHVsZS5BOjp0cF9j
bGVhcgorVW5leGNlcHRlZCBlcnJvciBvY2N1cnJlZCAoVE8gSU5WRVNUSUdBVEUpCitBdHRyaWJ1
dGVFcnJvcjogX19tb2R1bGVfXworQ2FsbGluZyAobnVsbCk6OnRwX2NsZWFyX2ltcGwKKy0tPiBB
X2NsZWFyCitjbGVhcmluZyBfX2RpY3RfXworRXhjZXB0aW9uIGlnbm9yZWQgaW4gdHBfY2xlYXIg
b2YgRToKK0F0dHJpYnV0ZUVycm9yOiBfX21vZHVsZV9fCitDYWxsaW5nIChudWxsKTo6dHBfZGVh
bGxvYworVW5leGNlcHRlZCBlcnJvciBvY2N1cnJlZCAoVE8gSU5WRVNUSUdBVEUpCitBdHRyaWJ1
dGVFcnJvcjogX19tb2R1bGVfXworQ2FsbGluZyAobnVsbCk6OnRwX2NsZWFyX2ltcGwKKy0tPiBC
X2NsZWFyCisobnVsbCk6IGNhbGxpbmcgTXlNb2R1bGUuQTo6dHBfY2xlYXIKK1VuZXhjZXB0ZWQg
ZXJyb3Igb2NjdXJyZWQgKFRPIElOVkVTVElHQVRFKQorQXR0cmlidXRlRXJyb3I6IF9fbW9kdWxl
X18KK0NhbGxpbmcgKG51bGwpOjp0cF9jbGVhcl9pbXBsCistLT4gQV9jbGVhcgorY2xlYXJpbmcg
X19kaWN0X18KK0RlbGV0aW5nIHR5cGUgKG51bGwpCitgYGAKKworIyMjIElzc3VlcworCisxLiBO
b3Qgc3VyZSB3aHkgQV9jbGVhciBhbmQgQl9jbGVhciBhcmUgY2FsbGVkIHR3aWNlLiBJcyBpdCBk
dWUgdG8gdGhlIGN5Y2xlID8KKzIuIFRoZSB0eXBlIG5hbWUgaXMgYChudWxsKWAgYmVjYXVzZSBg
UHlUeXBlX0dldEZ1bGx5UXVhbGlmaWVkTmFtZSgpYCByZXR1cm5zIGBOVUxMYCBmb3IgYW4gdW5r
bm93biByZWFzb24uIFBsZWFzZSBjb3VsZCB5b3UgZXhwbGFpbiBtZSB3aHkgPworMy4gVGhlcmUg
aXMgYW4gdW5leHBlY3RlZCBlcnJvciBgQXR0cmlidXRlRXJyb3I6IF9fbW9kdWxlX19gLiBJIGRv
bid0IHVuZGVyc3RhbmQgd2hlcmUgaXQgY29tZXMgZnJvbS4KZGlmZiAtLWdpdCBhL2luY2x1ZGUv
Z2RiLW90aGVycy5ocHAgYi9pbmNsdWRlL2dkYi1vdGhlcnMuaHBwCm5ldyBmaWxlIG1vZGUgMTAw
NjQ0CmluZGV4IDAwMDAwMDAuLjM2Nzk4YjMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2dk
Yi1vdGhlcnMuaHBwCkBAIC0wLDAgKzEsNjQgQEAKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8
UHl0aG9uLmg+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKworZXh0ZXJuICJDIiB7CisKKyNkZWZpbmUg
QVRUUklCVVRFX1VOVVNFRF9SRVNVTFQgX19hdHRyaWJ1dGVfXyAoKF9fd2Fybl91bnVzZWRfcmVz
dWx0X18pKQorI2RlZmluZSBBVFRSSUJVVEVfVVNFRCBfX2F0dHJpYnV0ZV9fICgoX191c2VkX18p
KQorI2RlZmluZSBBVFRSSUJVVEVfVU5VU0VEIF9fYXR0cmlidXRlX18oKHVudXNlZCkpCisKKyNk
ZWZpbmUgZ2RiX2Fzc2VydChleHByKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIFwKKyAgKCh2b2lkKSAoKGV4cHIpID8gMCA6ICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAoZ2RiX2Fz
c2VydF9mYWlsICgjZXhwciwgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyksIDApKSkKKwor
LyogVGhpcyBwcmludHMgYW4gIkFzc2VydGlvbiBmYWlsZWQiIG1lc3NhZ2UsIGFza2luZyB0aGUg
dXNlciBpZiB0aGV5CisgICB3YW50IHRvIGNvbnRpbnVlLCBkdW1wIGNvcmUsIG9yIGp1c3QgZXhp
dC4gICovCisjZGVmaW5lIGdkYl9hc3NlcnRfZmFpbChhc3NlcnRpb24sIGZpbGUsIGxpbmUsIGZ1
bmN0aW9uKSAgICAgICAgICAgICAgICAgICBcCisgIGludGVybmFsX2Vycm9yX2xvYyAoZmlsZSwg
bGluZSwgIiVzOiBBc3NlcnRpb24gYCVzJyBmYWlsZWQuIiwgICAgICAgICAgICBcCisJCSAgICAg
IGZ1bmN0aW9uLCBhc3NlcnRpb24pCisKKy8qIFRoZSBjYW5vbmljYWwgZm9ybSBvZiBnZGJfYXNz
ZXJ0ICgwKS4KKyAgIE1FU1NBR0UgaXMgYSBzdHJpbmcgdG8gaW5jbHVkZSBpbiB0aGUgZXJyb3Ig
bWVzc2FnZS4gICovCisKKyNkZWZpbmUgZ2RiX2Fzc2VydF9ub3RfcmVhY2hlZChtZXNzYWdlLCAu
Li4pIFwKKyAgaW50ZXJuYWxfZXJyb3JfbG9jIChfX0ZJTEVfXywgX19MSU5FX18sIF8oIiVzOiAi
IG1lc3NhZ2UpLCBfX2Z1bmNfXywgXAorCQkgICAgICAjI19fVkFfQVJHU19fKQorCitbW25vcmV0
dXJuXV0gZXh0ZXJuIHZvaWQgaW50ZXJuYWxfZXJyb3JfbG9jIChjb25zdCBjaGFyICpmaWxlLCBp
bnQgbGluZSwKKwkJCQkJICAgICBjb25zdCBjaGFyICpmbXQsIC4uLikKKyAgX19hdHRyaWJ1dGVf
XyAoKGZvcm1hdCAocHJpbnRmLCAzLCA0KSkpOzsKKworfQorCisKKy8qIFdyYXAgUHlHZXRTZXRE
ZWYgdG8gYWxsb3cgY29udmVuaWVudCBjb25zdHJ1Y3Rpb24gd2l0aCBzdHJpbmcKKyAgIGxpdGVy
YWxzLiAgVW5mb3J0dW5hdGVseSwgUHlHZXRTZXREZWYncyAnbmFtZScgYW5kICdkb2MnIG1lbWJl
cnMKKyAgIGFyZSAnY2hhciAqJyBpbnN0ZWFkIG9mICdjb25zdCBjaGFyIConLCBtZWFuaW5nIHRo
YXQgaW4gb3JkZXIgdG8KKyAgIGxpc3QtaW5pdGlhbGl6ZSBQeUdldFNldERlZiBhcnJheXMgd2l0
aCBzdHJpbmcgbGl0ZXJhbHMgKGFuZAorICAgd2l0aG91dCB0aGUgd3JhcHBpbmcgYmVsb3cpIHdv
dWxkIHJlcXVpcmUgd3JpdGluZyBleHBsaWNpdCAnY2hhciAqJworICAgY2FzdHMuICBJbnN0ZWFk
LCB3ZSBleHRlbmQgUHlHZXRTZXREZWYgYW5kIGFkZCBjb25zdGV4cHIKKyAgIGNvbnN0cnVjdG9y
cyB0aGF0IGFjY2VwdCBjb25zdCAnbmFtZScgYW5kICdkb2MnLCBoaWRpbmcgdGhlIHVnbHkKKyAg
IGNhc3RzIGhlcmUgaW4gYSBzaW5nbGUgcGxhY2UuICAqLworCitzdHJ1Y3QgZ2RiX1B5R2V0U2V0
RGVmIDogUHlHZXRTZXREZWYKK3sKKyAgY29uc3RleHByIGdkYl9QeUdldFNldERlZiAoY29uc3Qg
Y2hhciAqbmFtZV8sIGdldHRlciBnZXRfLCBzZXR0ZXIgc2V0XywKKwkJCSAgICAgY29uc3QgY2hh
ciAqZG9jXywgdm9pZCAqY2xvc3VyZV8pCisgICAgOiBQeUdldFNldERlZiB7Y29uc3RfY2FzdDxj
aGFyICo+IChuYW1lXyksIGdldF8sIHNldF8sCisJCSAgIGNvbnN0X2Nhc3Q8Y2hhciAqPiAoZG9j
XyksIGNsb3N1cmVffQorICB7fQorCisgIC8qIEFsdGVybmF0aXZlIGNvbnN0cnVjdG9yIHRoYXQg
YWxsb3dzIG9taXR0aW5nIHRoZSBjbG9zdXJlIGluIGxpc3QKKyAgICAgaW5pdGlhbGl6YXRpb24u
ICAqLworICBjb25zdGV4cHIgZ2RiX1B5R2V0U2V0RGVmIChjb25zdCBjaGFyICpuYW1lXywgZ2V0
dGVyIGdldF8sIHNldHRlciBzZXRfLAorCQkJICAgICBjb25zdCBjaGFyICpkb2NfKQorICAgIDog
Z2RiX1B5R2V0U2V0RGVmIHtuYW1lXywgZ2V0Xywgc2V0XywgZG9jXywgTlVMTH0KKyAge30KKwor
ICAvKiBDb25zdHJ1Y3RvciBmb3IgdGhlIHNlbnRpbmVsIGVudHJpZXMuICAqLworICBjb25zdGV4
cHIgZ2RiX1B5R2V0U2V0RGVmIChzdGQ6Om51bGxwdHJfdCkKKyAgICA6IGdkYl9QeUdldFNldERl
ZiB7TlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTH0KKyAge30KK307CmRpZmYgLS1naXQgYS9p
bmNsdWRlL2dkYl9yZWZfcHRyLmhwcCBiL2luY2x1ZGUvZ2RiX3JlZl9wdHIuaHBwCm5ldyBmaWxl
IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3OTg1MGYKLS0tIC9kZXYvbnVsbAorKysgYi9p
bmNsdWRlL2dkYl9yZWZfcHRyLmhwcApAQCAtMCwwICsxLDMwMSBAQAorLyogUmVmZXJlbmNlLWNv
dW50ZWQgc21hcnQgcG9pbnRlciBjbGFzcworCisgICBDb3B5cmlnaHQgKEMpIDIwMTYtMjAyNiBG
cmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2Yg
R0RCLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3Ry
aWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUg
R2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3
YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAo
YXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMg
ZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBX
SVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9m
CisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0Uu
ICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxz
LgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJh
bCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNl
ZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisjaWZuZGVmIEdEQlNVUFBP
UlRfR0RCX1JFRl9QVFJfSAorI2RlZmluZSBHREJTVVBQT1JUX0dEQl9SRUZfUFRSX0gKKworI2lu
Y2x1ZGUgPGNzdGRkZWY+CisKK3N0cnVjdCBnZGJweV9yZWZfcG9saWN5OworCituYW1lc3BhY2Ug
Z2RiCit7CisKKy8qIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgZWl0aGVyIGhvbGRzIGEgcmVm
ZXJlbmNlIHRvIGEKKyAgIHJlZmVyZW5jZS1jb3VudGVkIG9iamVjdCBvciBpcyAiTlVMTCIuICBS
ZWZlcmVuY2UgY291bnRpbmcgaXMKKyAgIGhhbmRsZWQgZXh0ZXJuYWxseSBieSBhIHBvbGljeSBj
bGFzcy4gIElmIHRoZSBvYmplY3QgaG9sZHMgYQorICAgcmVmZXJlbmNlLCB0aGVuIHdoZW4gdGhl
IG9iamVjdCBpcyBkZXN0cm95ZWQsIHRoZSByZWZlcmVuY2UgaXMKKyAgIGRlY3JlZidkLgorCisg
ICBOb3JtYWxseSBhbiBpbnN0YW5jZSBpcyBjb25zdHJ1Y3RlZCB1c2luZyBhIHBvaW50ZXIuICBU
aGlzIHNvcnQgb2YKKyAgIGluaXRpYWxpemF0aW9uIGxldHMgdGhpcyBjbGFzcyBtYW5hZ2UgdGhl
IGxpZmV0aW1lIG9mIHRoYXQKKyAgIHJlZmVyZW5jZS4KKworICAgQXNzaWdubWVudCBhbmQgY29w
eSBjb25zdHJ1Y3Rpb24gd2lsbCBtYWtlIGEgbmV3IHJlZmVyZW5jZSBhcworICAgYXBwcm9wcmlh
dGUuICBBc3NpZ25tZW50IGZyb20gYSBwbGFpbiBwb2ludGVyIGlzIGRpc2FsbG93ZWQgdG8KKyAg
IGF2b2lkIGNvbmZ1c2lvbiBhYm91dCB3aGV0aGVyIHRoaXMgYWNxdWlyZXMgYSBuZXcgcmVmZXJl
bmNlOworICAgaW5zdGVhZCB1c2UgdGhlICJyZXNldCIgbWV0aG9kIC0tIHdoaWNoLCBsaWtlIHRo
ZSBwb2ludGVyCisgICBjb25zdHJ1Y3RvciwgdHJhbnNmZXJzIG93bmVyc2hpcC4KKworICAgVGhl
IHBvbGljeSBjbGFzcyBtdXN0IHByb3ZpZGUgdHdvIHN0YXRpYyBtZXRob2RzOgorICAgdm9pZCBp
bmNyZWYgKFQgKik7CisgICB2b2lkIGRlY3JlZiAoVCAqKTsKKyovCit0ZW1wbGF0ZTx0eXBlbmFt
ZSBULCB0eXBlbmFtZSBQb2xpY3k+CitjbGFzcyByZWZfcHRyCit7CitwdWJsaWM6CisKKyAgLyog
QmVmcmllbmQgYWxsIGluc3RhbnRpYXRpb25zIG9mIHRoaXMgdGVtcGxhdGUsIHNvIHRoYXQgdGhl
CisgICAgIHRlbXBsYXRlZCBjb3B5IGNvbnN0cnVjdG9ycyBhbmQgYXNzaWdubWVudCBvcGVyYXRv
cnMgY2FuIGFjY2VzcworICAgICB0aGUgZGF0YS4gICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIFgs
IHR5cGVuYW1lIFk+IGZyaWVuZCBjbGFzcyByZWZfcHRyOworCisgIC8qIENyZWF0ZSBhIG5ldyBO
VUxMIGluc3RhbmNlLiAgKi8KKyAgcmVmX3B0ciAoKSBub2V4Y2VwdAorICAgIDogbV9vYmogKE5V
TEwpCisgIHsKKyAgfQorCisgIC8qIENyZWF0ZSBhIG5ldyBOVUxMIGluc3RhbmNlLiAgTm90ZSB0
aGF0IHRoaXMgaXMgbm90IGV4cGxpY2l0LiAgKi8KKyAgcmVmX3B0ciAoY29uc3Qgc3RkOjpudWxs
cHRyX3QpIG5vZXhjZXB0CisgICAgOiBtX29iaiAoTlVMTCkKKyAgeworICB9CisKKyAgLyogQ3Jl
YXRlIGEgbmV3IGluc3RhbmNlLiAgT0JKIGlzIGEgcmVmZXJlbmNlLCBtYW5hZ2VtZW50IG9mIHdo
aWNoCisgICAgIGlzIG5vdyB0cmFuc2ZlcnJlZCB0byB0aGlzIGNsYXNzLiAgKi8KKyAgZXhwbGlj
aXQgcmVmX3B0ciAoVCAqb2JqKSBub2V4Y2VwdAorICAgIDogbV9vYmogKG9iaikKKyAgeworICB9
CisKKyAgLyogQ29weSBhbm90aGVyIGluc3RhbmNlLiAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUg
VSwKKwkgICB0eXBlbmFtZSA9IHN0ZDo6aXNfY29udmVydGlibGU8VSAqLCBUKj4+CisgIHJlZl9w
dHIgKGNvbnN0IHJlZl9wdHI8VSwgUG9saWN5PiAmb3RoZXIpCisgICAgOiBtX29iaiAob3RoZXIu
bV9vYmopCisgIHsKKyAgICBpZiAobV9vYmogIT0gTlVMTCkKKyAgICAgIFBvbGljeTo6aW5jcmVm
IChtX29iaik7CisgIH0KKworICByZWZfcHRyIChjb25zdCByZWZfcHRyICZvdGhlcikKKyAgICA6
IG1fb2JqIChvdGhlci5tX29iaikKKyAgeworICAgIGlmIChtX29iaiAhPSBOVUxMKQorICAgICAg
UG9saWN5OjppbmNyZWYgKG1fb2JqKTsKKyAgfQorCisgIC8qIFRyYW5zZmVyIG93bmVyc2hpcCBm
cm9tIE9USEVSLiAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgVSwKKwkgICB0eXBlbmFtZSA9IHN0
ZDo6aXNfY29udmVydGlibGU8VSAqLCBUKj4+CisgIHJlZl9wdHIgKHJlZl9wdHI8VSwgUG9saWN5
PiAmJm90aGVyKSBub2V4Y2VwdAorICAgIDogbV9vYmogKG90aGVyLm1fb2JqKQorICB7CisgICAg
b3RoZXIubV9vYmogPSBOVUxMOworICB9CisKKyAgcmVmX3B0ciAocmVmX3B0ciAmJm90aGVyKSBu
b2V4Y2VwdAorICAgIDogbV9vYmogKG90aGVyLm1fb2JqKQorICB7CisgICAgb3RoZXIubV9vYmog
PSBOVUxMOworICB9CisKKyAgLyogRGVzdHJveSB0aGlzIGluc3RhbmNlLiAgKi8KKyAgfnJlZl9w
dHIgKCkKKyAgeworICAgIGlmIChtX29iaiAhPSBOVUxMKQorICAgICAgUG9saWN5OjpkZWNyZWYg
KG1fb2JqKTsKKyAgfQorCisgIC8qIENvcHkgYW5vdGhlciBpbnN0YW5jZS4gICovCisgIHRlbXBs
YXRlPHR5cGVuYW1lIFUsCisJICAgdHlwZW5hbWUgPSBzdGQ6OmlzX2NvbnZlcnRpYmxlPFUgKiwg
VCo+PgorICByZWZfcHRyICZvcGVyYXRvcj0gKGNvbnN0IHJlZl9wdHI8VSwgUG9saWN5PiAmb3Ro
ZXIpCisgIHsKKyAgICAvKiBOb3RlIHRoYXQgc2VsZi1hc3NpZ25tZW50IGlzIG5vdCBjaGVja2Vk
IGhlcmUsIGFzIGl0IGlzbid0CisgICAgICAgcG9zc2libGU6IHNlbGYtYXNzaWdubWVudHMgd2ls
bCBjaG9vc2UgdGhlIG5vbi10ZW1wbGF0ZQorICAgICAgIGZ1bmN0aW9uLiAgKi8KKyAgICByZXNl
dCAob3RoZXIubV9vYmopOworICAgIGlmIChtX29iaiAhPSBOVUxMKQorICAgICAgUG9saWN5Ojpp
bmNyZWYgKG1fb2JqKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICByZWZfcHRyICZvcGVy
YXRvcj0gKGNvbnN0IHJlZl9wdHIgJm90aGVyKQorICB7CisgICAgLyogRG8gbm90aGluZyBvbiBz
ZWxmLWFzc2lnbm1lbnQuICAqLworICAgIGlmICh0aGlzICE9ICZvdGhlcikKKyAgICAgIHsKKwly
ZXNldCAob3RoZXIubV9vYmopOworCWlmIChtX29iaiAhPSBOVUxMKQorCSAgUG9saWN5OjppbmNy
ZWYgKG1fb2JqKTsKKyAgICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvKiBUcmFu
c2ZlciBvd25lcnNoaXAgZnJvbSBPVEhFUi4gICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIFUsCisJ
ICAgdHlwZW5hbWUgPSBzdGQ6OmlzX2NvbnZlcnRpYmxlPFUgKiwgVCo+PgorICByZWZfcHRyICZv
cGVyYXRvcj0gKHJlZl9wdHI8VSwgUG9saWN5PiAmJm90aGVyKQorICB7CisgICAgLyogTm90ZSB0
aGF0IHNlbGYtYXNzaWdubWVudCBpcyBub3QgY2hlY2tlZCBoZXJlLCBhcyBpdCBpc24ndAorICAg
ICAgIHBvc3NpYmxlOiBzZWxmLWFzc2lnbm1lbnRzIHdpbGwgY2hvb3NlIHRoZSBub24tdGVtcGxh
dGUKKyAgICAgICBmdW5jdGlvbi4gICovCisgICAgcmVzZXQgKG90aGVyLm1fb2JqKTsKKyAgICBv
dGhlci5tX29iaiA9IE5VTEw7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgcmVmX3B0ciAm
b3BlcmF0b3I9IChyZWZfcHRyICYmb3RoZXIpCisgIHsKKyAgICAvKiBEbyBub3RoaW5nIG9uIHNl
bGYtYXNzaWdubWVudC4gICovCisgICAgaWYgKHRoaXMgIT0gJm90aGVyKQorICAgICAgeworCXJl
c2V0IChvdGhlci5tX29iaik7CisJb3RoZXIubV9vYmogPSBOVUxMOworICAgICAgfQorICAgIHJl
dHVybiAqdGhpczsKKyAgfQorCisgIC8qIENoYW5nZSB0aGlzIGluc3RhbmNlJ3MgcmVmZXJlbnQu
ICBPQkogaXMgYSByZWZlcmVuY2UsIG1hbmFnZW1lbnQKKyAgICAgb2Ygd2hpY2ggaXMgbm93IHRy
YW5zZmVycmVkIHRvIHRoaXMgY2xhc3MuICAqLworICB2b2lkIHJlc2V0IChUICpvYmopCisgIHsK
KyAgICBpZiAobV9vYmogIT0gTlVMTCkKKyAgICAgIFBvbGljeTo6ZGVjcmVmIChtX29iaik7Cisg
ICAgbV9vYmogPSBvYmo7CisgIH0KKworICBvcGVyYXRvciBib29sICgpIGNvbnN0IG5vZXhjZXB0
CisgIHsKKyAgICByZXR1cm4gbV9vYmogIT0gbnVsbHB0cjsKKyAgfQorCisgIC8qIFJldHVybiB0
aGlzIGluc3RhbmNlJ3MgcmVmZXJlbnQgd2l0aG91dCBjaGFuZ2luZyB0aGUgc3RhdGUgb2YKKyAg
ICAgdGhpcyBjbGFzcy4gICovCisgIFQgKmdldCAoKSBjb25zdCBub2V4Y2VwdAorICB7CisgICAg
cmV0dXJuIG1fb2JqOworICB9CisKKyAgLyogUmV0dXJuIHRoaXMgaW5zdGFuY2UncyByZWZlcmVu
dCwgYW5kIHN0b3AgbWFuYWdpbmcgdGhpcworICAgICByZWZlcmVuY2UuICBUaGUgY2FsbGVyIGlz
IG5vdyByZXNwb25zaWJsZSBmb3IgdGhlIG93bmVyc2hpcCBvZgorICAgICB0aGUgcmVmZXJlbmNl
LiAgKi8KKyAgQVRUUklCVVRFX1VOVVNFRF9SRVNVTFQgVCAqcmVsZWFzZSAoKSBub2V4Y2VwdAor
ICB7CisgICAgVCAqcmVzdWx0ID0gbV9vYmo7CisKKyAgICBtX29iaiA9IE5VTEw7CisgICAgcmV0
dXJuIHJlc3VsdDsKKyAgfQorCisgIC8qIExldCB1c2VycyByZWZlciB0byBtZW1iZXJzIG9mIHRo
ZSB1bmRlcmx5aW5nIHBvaW50ZXIuICAqLworICBUICpvcGVyYXRvci0+ICgpIGNvbnN0IG5vZXhj
ZXB0CisgIHsKKyAgICByZXR1cm4gbV9vYmo7CisgIH0KKworICAvKiBBY3F1aXJlIGEgbmV3IHJl
ZmVyZW5jZSBhbmQgcmV0dXJuIGEgcmVmX3B0ciB0aGF0IG93bnMgaXQuICAqLworICB0ZW1wbGF0
ZSA8Y2xhc3MgVE9iaj4KKyAgc3RhdGljIHJlZl9wdHI8VCwgUG9saWN5PiBuZXdfcmVmZXJlbmNl
IChUT2JqICpvYmopCisgIHsKKyAgICBQb2xpY3k6OmluY3JlZiAob2JqKTsKKyAgICBpZiBjb25z
dGV4cHIgKHN0ZDo6aXNfYmFzZV9vZjxULCBUT2JqPjo6dmFsdWUKKwkJICB8fCBzdGQ6OmlzX2Jh
c2Vfb2Y8VE9iaiwgVD46OnZhbHVlKQorICAgICAgcmV0dXJuIHJlZl9wdHI8VCwgUG9saWN5PiAo
c3RhdGljX2Nhc3Q8VCAqPiAob2JqKSk7CisgICAgZWxzZQorICAgICAgcmV0dXJuIHJlZl9wdHI8
VCwgUG9saWN5PiAob2JqKTsKKyAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIFAgPSBQb2xpY3ks
IHR5cGVuYW1lID0gc3RkOjplbmFibGVfaWZfdDwKKwkgICBzdGQ6OmlzX3NhbWU8UCwgZ2RicHlf
cmVmX3BvbGljeT46OnZhbHVlPj4KKyAgaW50IHZpc2l0ICh0eXBlbmFtZSBQOjp2aXNpdHByb2Mg
dmlzaXQsIHZvaWQgKmFyZykgbm9leGNlcHQKKyAgeworICAgIHJldHVybiBQOjp2aXNpdCAobV9v
YmosIHZpc2l0LCBhcmcpOworICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgUCA9IFBvbGljeSwg
dHlwZW5hbWUgPSBzdGQ6OmVuYWJsZV9pZl90PAorCSAgIHN0ZDo6aXNfc2FtZTxQLCBnZGJweV9y
ZWZfcG9saWN5Pjo6dmFsdWU+PgorICB2b2lkIGNsZWFyIChQICogPSBudWxscHRyKSBub2V4Y2Vw
dAorICB7CisgICAgUDo6Y2xlYXIgKCZtX29iaik7CisgIH0KKworIHByaXZhdGU6CisKKyAgVCAq
bV9vYmo7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVLCB0eXBlbmFtZSBQ
b2xpY3k+CitpbmxpbmUgYm9vbCBvcGVyYXRvcj09IChjb25zdCByZWZfcHRyPFQsIFBvbGljeT4g
JmxocywKKwkJCWNvbnN0IHJlZl9wdHI8VSwgUG9saWN5PiAmcmhzKQoreworICByZXR1cm4gbGhz
LmdldCAoKSA9PSByaHMuZ2V0ICgpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFt
ZSBVLCB0eXBlbmFtZSBQb2xpY3k+CitpbmxpbmUgYm9vbCBvcGVyYXRvcj09IChjb25zdCByZWZf
cHRyPFQsIFBvbGljeT4gJmxocywgY29uc3QgVSAqcmhzKQoreworICByZXR1cm4gbGhzLmdldCAo
KSA9PSByaHM7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFBvbGljeT4KK2lu
bGluZSBib29sIG9wZXJhdG9yPT0gKGNvbnN0IHJlZl9wdHI8VCwgUG9saWN5PiAmbGhzLCBjb25z
dCBzdGQ6Om51bGxwdHJfdCkKK3sKKyAgcmV0dXJuIGxocy5nZXQgKCkgPT0gbnVsbHB0cjsKK30K
KwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVSwgdHlwZW5hbWUgUG9saWN5PgoraW5s
aW5lIGJvb2wgb3BlcmF0b3I9PSAoY29uc3QgVCAqbGhzLCBjb25zdCByZWZfcHRyPFUsIFBvbGlj
eT4gJnJocykKK3sKKyAgcmV0dXJuIGxocyA9PSByaHMuZ2V0ICgpOworfQorCit0ZW1wbGF0ZTx0
eXBlbmFtZSBULCB0eXBlbmFtZSBQb2xpY3k+CitpbmxpbmUgYm9vbCBvcGVyYXRvcj09IChjb25z
dCBzdGQ6Om51bGxwdHJfdCwgY29uc3QgcmVmX3B0cjxULCBQb2xpY3k+ICZyaHMpCit7CisgIHJl
dHVybiBudWxscHRyID09IHJocy5nZXQgKCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5
cGVuYW1lIFUsIHR5cGVuYW1lIFBvbGljeT4KK2lubGluZSBib29sIG9wZXJhdG9yIT0gKGNvbnN0
IHJlZl9wdHI8VCwgUG9saWN5PiAmbGhzLAorCQkJY29uc3QgcmVmX3B0cjxVLCBQb2xpY3k+ICZy
aHMpCit7CisgIHJldHVybiBsaHMuZ2V0ICgpICE9IHJocy5nZXQgKCk7Cit9CisKK3RlbXBsYXRl
PHR5cGVuYW1lIFQsIHR5cGVuYW1lIFUsIHR5cGVuYW1lIFBvbGljeT4KK2lubGluZSBib29sIG9w
ZXJhdG9yIT0gKGNvbnN0IHJlZl9wdHI8VCwgUG9saWN5PiAmbGhzLCBjb25zdCBVICpyaHMpCit7
CisgIHJldHVybiBsaHMuZ2V0ICgpICE9IHJoczsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVCwg
dHlwZW5hbWUgUG9saWN5PgoraW5saW5lIGJvb2wgb3BlcmF0b3IhPSAoY29uc3QgcmVmX3B0cjxU
LCBQb2xpY3k+ICZsaHMsIGNvbnN0IHN0ZDo6bnVsbHB0cl90KQoreworICByZXR1cm4gbGhzLmdl
dCAoKSAhPSBudWxscHRyOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVLCB0
eXBlbmFtZSBQb2xpY3k+CitpbmxpbmUgYm9vbCBvcGVyYXRvciE9IChjb25zdCBUICpsaHMsIGNv
bnN0IHJlZl9wdHI8VSwgUG9saWN5PiAmcmhzKQoreworICByZXR1cm4gbGhzICE9IHJocy5nZXQg
KCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFBvbGljeT4KK2lubGluZSBi
b29sIG9wZXJhdG9yIT0gKGNvbnN0IHN0ZDo6bnVsbHB0cl90LCBjb25zdCByZWZfcHRyPFQsIFBv
bGljeT4gJnJocykKK3sKKyAgcmV0dXJuIG51bGxwdHIgIT0gcmhzLmdldCAoKTsKK30KKworfQor
CisjZW5kaWYgLyogR0RCU1VQUE9SVF9HREJfUkVGX1BUUl9IICovCmRpZmYgLS1naXQgYS9pbmNs
dWRlL3B5LW9iai1kaWN0LmhwcCBiL2luY2x1ZGUvcHktb2JqLWRpY3QuaHBwCm5ldyBmaWxlIG1v
ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMTU0YmEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNs
dWRlL3B5LW9iai1kaWN0LmhwcApAQCAtMCwwICsxLDE4OSBAQAorI3ByYWdtYSBvbmNlCisKKyNp
bmNsdWRlICJweS1vYmotdHlwZS5ocHAiCisKKy8qIEhlbHBlcnMgZm9yIFB5dGhvbiBleHRlbnNp
b24gb2JqZWN0cyB0aGF0IGhhdmUgYSBfX2RpY3RfXyBhdHRyaWJ1dGUuCisKKyAgIEFueSBQeXRo
b24gQyBvYmplY3QgZXh0ZW5zaW9uIChmb3IgaW5zdGFuY2UsIGEgY2xhc3MgQSBpbmhlcml0aW5n
IFB5T2JqZWN0KQorICAgbmVlZGluZyBfX2RpY3RfXyBzaG91bGQgb3duIGFuIGF0dHJpYnV0ZSBH
REJQWU9CSkVDVF9ESUNUX0FUVFIgKEEpLgorCisgICBBY2Nlc3MgdG8gdGhlIGRpY3QgcmVxdWly
ZXMgYSBjdXN0b20gZ2V0dGVyIGRlZmluZWQgdmlhIFB5R2V0U2V0RGVmLgorICAgICBnZGJfUHlH
ZXRTZXREZWYgbXlfb2JqZWN0X2dldHNldFtdID0KKyAgICAgeworICAgICAgIGdkYnB5X2RpY3Rf
YXR0cl9nZXR0ZXIgKEEsICJvYmplY3QiKSwKKyAgICAgICAuLi4KKyAgICAgICB7IG51bGxwdHIg
fQorICAgICB9OworCisgICBJdCBpcyBhbHNvIGltcG9ydGFudCB0byBub3RlIHRoYXQgX19kaWN0
X18gaXMgdXNlZCBkdXJpbmcgdGhlIGF0dHJpYnV0ZQorICAgbG9vay11cC4gU2luY2UgdGhpcyBk
aWN0aW9uYXJ5IGlzIG5vdCBtYW5hZ2VkIGJ5IFB5dGhvbiBhbmQgaXMgbm90IGV4cG9zZWQKKyAg
IHZpYSB0cF9kaWN0b2Zmc2V0LCBjdXN0b20gYXR0cmlidXRlIGdldHRlciAodHBfZ2V0YXR0cm8p
IGFuZCBzZXR0ZXIKKyAgICh0cF9zZXRhdHRybykgYXJlIHJlcXVpcmVkIHRvIGNvcnJlY3RseSBy
ZWRpcmVjdCBhdHRyaWJ1dGUgYWNjZXNzIHRvIHRoZQorICAgZGljdGlvbmFyeToKKyAgICAgUHlU
eXBlX1Nsb3Qgb2JqZWN0X3R5cGVfc2xvdFtdID0geworICAgICAgIC4uLiwKKyAgICAgICBnZGJw
eV9kaWN0X2F0dHJfUHlUeXBlX1Nsb3RzIChBKSwKKyAgICAgICAuLi4KKyAgICAgfTsKKworICAg
RmluYWxseSwgaGVhcC1hbGxvY2F0ZWQgdHlwZXMgb3duaW5nIGEgX19kaWN0X18gc2hvdWxkIHZp
c2l0IGFuZCBjbGVhciB0aGVpcgorICAgX19kaWN0X18uCisgICAgIHN0YXRpYyBpbnQKKyAgICAg
QV90cF90cmF2ZXJzZSAoUHlPYmplY3QgKnNlbGYsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJn
KQorICAgICB7CisgICAgICAgYXV0byAqb2JqID0gKEEgKikgc2VsZjsKKyAgICAgICBnZGJweV9k
aWN0X2F0dHJfUHlfVklTSVQgKG9iaik7CisgICAgICAgLi4uCisgICAgICAgcmV0dXJuIDA7Cisg
ICAgIH0KKworICAgICBzdGF0aWMgdm9pZAorICAgICBBX3RwX2NsZWFyIChQeU9iamVjdCAqc2Vs
ZikKKyAgICAgeworICAgICAgIGF1dG8gKm9iaiA9IChBICopIHNlbGY7CisgICAgICAgZ2RicHlf
ZGljdF9hdHRyX1B5X0NMRUFSIChvYmopOworICAgICAgIC4uLgorICAgICB9CisgICAqLwordGVt
cGxhdGUgPGNsYXNzIFQ+CitzdHJ1Y3QgZ2RicHlfZGljdF9oZWxwZXJzCit7Citwcml2YXRlOgor
CisgIC8qIENvbXB1dGUgdGhlIGFkZHJlc3Mgb2YgdGhlIF9fZGljdF9fIGF0dHJpYnV0ZSBmb3Ig
dGhlIGdpdmVuIFB5T2JqZWN0LiAgKi8KKyAgc3RhdGljIFB5T2JqZWN0ICoqY29tcHV0ZV9hZGRy
IChQeU9iamVjdCAqc2VsZikKKyAgeworICAgIGF1dG8gKmRpY3Rfb3duZXIgPSByZWludGVycHJl
dF9jYXN0PFQgKj4gKHNlbGYpOworICAgIHJldHVybiAmZGljdF9vd25lci0+ZGljdDsKKyAgfQor
CitwdWJsaWM6CisKKyAgc3RhdGljIFB5T2JqZWN0ICoKKyAgYWxsb2NhdGUgKFB5T2JqZWN0ICpz
ZWxmKQorICB7CisgICAgUHlPYmplY3QgKipweV9kaWN0X3B0ciA9IGdkYnB5X2RpY3RfaGVscGVy
czo6Y29tcHV0ZV9hZGRyIChzZWxmKTsKKyAgICBQeU9iamVjdCAqcHlfZGljdCA9ICpweV9kaWN0
X3B0cjsKKyAgICBnZGJfYXNzZXJ0IChweV9kaWN0ID09IG51bGxwdHIpOworICAgICpweV9kaWN0
X3B0ciA9IFB5RGljdF9OZXcgKCk7CisgICAgcHlfZGljdCA9ICpweV9kaWN0X3B0cjsKKyAgICBy
ZXR1cm4gcHlfZGljdDsKKyAgfQorCisKKyAgLyogR2VuZXJpYyBpbXBsZW1lbnRhdGlvbiBvZiB0
aGUgZ2V0dGVyIGZvciB0aGUgX19kaWN0X18gYXR0cmlidXRlIGZvciBvYmplY3RzCisgICBoYXZp
bmcgYSBkaWN0aW9uYXJ5LiAgVGhlIENMT1NVUkUgYXJndW1lbnQgaXMgdW51c2VkLiAgKi8KKwor
ICBzdGF0aWMgUHlPYmplY3QgKgorICBnZXR0ZXIgKFB5T2JqZWN0ICpzZWxmLCB2b2lkICpjbG9z
dXJlIEFUVFJJQlVURV9VTlVTRUQpCisgIHsKKyAgICBQeU9iamVjdCAqKnB5X2RpY3RfcHRyID0g
Z2RicHlfZGljdF9oZWxwZXJzOjpjb21wdXRlX2FkZHIgKHNlbGYpOworICAgIFB5T2JqZWN0ICpw
eV9kaWN0ID0gKnB5X2RpY3RfcHRyOworICAgIGlmIChweV9kaWN0ID09IG51bGxwdHIpCisgICAg
ICB7CisJUHlFcnJfU2V0U3RyaW5nIChQeUV4Y19BdHRyaWJ1dGVFcnJvciwKKwkJCSAiVGhpcyBv
YmplY3QgaGFzIG5vIF9fZGljdF9fIik7CisJcmV0dXJuIG51bGxwdHI7CisgICAgICB9CisgICAg
Ly9pZiAocHlfZGljdCA9PSBudWxscHRyKQorICAgIC8vICBweV9kaWN0ID0gZ2RicHlfZGljdF9o
ZWxwZXJzOjphbGxvY2F0ZSAoc2VsZiwgcHlfZGljdF9wdHIpOworICAgIHJldHVybiBQeV9OZXdS
ZWYgKHB5X2RpY3QpOworICB9CisKKyAgLyogR2VuZXJpYyBhdHRyaWJ1dGUgZ2V0dGVyIGZ1bmN0
aW9uIHNpbWlsYXIgdG8gUHlPYmplY3RfR2VuZXJpY0dldEF0dHIgKCkgYnV0CisgICAgIHRoYXQg
c2hvdWxkIGJlIHVzZWQgd2hlbiB0aGUgb2JqZWN0IGhhcyBhIGRpY3Rpb25hcnkgX19kaWN0X18u
ICAqLworICBzdGF0aWMgUHlPYmplY3QgKgorICBnZXRhdHRybyAoUHlPYmplY3QgKnNlbGYsIFB5
T2JqZWN0ICphdHRyKQorICB7CisgICAgUHlPYmplY3QgKnZhbHVlID0gUHlPYmplY3RfR2VuZXJp
Y0dldEF0dHIgKHNlbGYsIGF0dHIpOworICAgIGlmICh2YWx1ZSAhPSBudWxscHRyKQorICAgICAg
cmV0dXJuIHZhbHVlOworCisgICAgaWYgKCEgUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyAoUHlFeGNf
QXR0cmlidXRlRXJyb3IpKQorICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICBnZGJweV9yZWY8
PiBkaWN0IChnZGJweV9kaWN0X2hlbHBlcnM6OmdldHRlciAoc2VsZiwgbnVsbHB0cikpOworICAg
IGlmIChkaWN0ID09IG51bGxwdHIpCisgICAgICByZXR1cm4gbnVsbHB0cjsKKworICAgIC8qIENs
ZWFyIHByZXZpb3VzIEF0dHJpYnV0ZUVycm9yIHNldCBieSBQeU9iamVjdF9HZW5lcmljR2V0QXR0
ciB3aGVuIGl0CisgICAgICAgZGlkIG5vdCBmaW5kIHRoZSBhdHRyaWJ1dGUsIGFuZCB0cnkgdG8g
Z2V0IHRoZSBhdHRyaWJ1dGUgZnJvbSBfX2RpY3RfXy4gICovCisgICAgUHlFcnJfQ2xlYXIoKTsK
KworICAgIHZhbHVlID0gUHlEaWN0X0dldEl0ZW1XaXRoRXJyb3IgKGRpY3QuZ2V0ICgpLCBhdHRy
KTsKKyAgICBpZiAodmFsdWUgIT0gbnVsbHB0cikKKyAgICAgIHJldHVybiBQeV9OZXdSZWYgKHZh
bHVlKTsKKworICAgIC8qIElmIFB5RGljdF9HZXRJdGVtV2l0aEVycm9yKCkgcmV0dXJucyBOVUxM
IGJlY2F1c2UgYW4gZXJyb3Igb2NjdXJyZWQsIGl0CisgICAgICAgc2V0cyBhbiBleGNlcHRpb24u
ICBQcm9wYWdhdGUgaXQgYnkgcmV0dXJuaW5nIE5VTEwuICAqLworICAgIGlmIChQeUVycl9PY2N1
cnJlZCAoKSAhPSBudWxscHRyKQorICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICAvKiBJZiB0
aGUga2V5IGlzIG5vdCBmb3VuZCwgUHlEaWN0X0dldEl0ZW1XaXRoRXJyb3IoKSByZXR1cm5zIE5V
TEwgd2l0aG91dAorICAgICAgIHNldHRpbmcgYW4gZXhjZXB0aW9uLiAgRmFpbGluZyB0byBzZXQg
b25lIGhlcmUgd291bGQgbGF0ZXIgcmVzdWx0IGluOgorCSA8Y2xhc3MgJ1N5c3RlbUVycm9yJz46
IGVycm9yIHJldHVybiB3aXRob3V0IGV4Y2VwdGlvbiBzZXQKKyAgICAgICBUaGVyZWZvcmUsIHdl
IG11c3QgZXhwbGljaXRseSByYWlzZSBhbiBBdHRyaWJ1dGVFcnJvciBpbiB0aGlzIGNhc2UuICAq
LworICAgIFB5RXJyX0Zvcm1hdCAoUHlFeGNfQXR0cmlidXRlRXJyb3IsCisJCSAgIiclcycgb2Jq
ZWN0IGhhcyBubyBhdHRyaWJ1dGUgJyVzJyIsCisJCSAgZ2RicHlfcHlfb2JqX3RwX25hbWUgKHNl
bGYpLAorCQkgIFB5VW5pY29kZV9Bc1VURjhBbmRTaXplIChhdHRyLCBudWxscHRyKSk7CisgICAg
cmV0dXJuIG51bGxwdHI7CisgIH0KKworICAvKiBHZW5lcmljIGF0dHJpYnV0ZSBzZXR0ZXIgZnVu
Y3Rpb24gc2ltaWxhciB0byBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciAoKSBidXQKKyAgICAgdGhh
dCBzaG91bGQgYmUgdXNlZCB3aGVuIHRoZSBvYmplY3QgaGFzIGEgZGljdGlvbmFyeSBfX2RpY3Rf
Xy4gICovCisgIHN0YXRpYyBpbnQKKyAgc2V0YXR0cm8gKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVj
dCAqYXR0ciwgUHlPYmplY3QgKnZhbHVlKQorICB7CisgICAgaWYgKFB5T2JqZWN0X0dlbmVyaWNT
ZXRBdHRyIChzZWxmLCBhdHRyLCB2YWx1ZSkgPT0gMCkKKyAgICAgIHJldHVybiAwOworCisgICAg
aWYgKCEgUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyAoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQorICAg
ICAgcmV0dXJuIC0xOworCisgICAgZ2RicHlfcmVmPD4gZGljdCAoZ2RicHlfZGljdF9oZWxwZXJz
OjpnZXR0ZXIgKHNlbGYsIG51bGxwdHIpKTsKKyAgICBpZiAoZGljdCA9PSBudWxscHRyKQorICAg
ICAgcmV0dXJuIC0xOworCisgICAgLyogQ2xlYXIgcHJldmlvdXMgQXR0cmlidXRlRXJyb3Igc2V0
IGJ5IFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyKCkgd2hlbiBpdAorICAgICAgIGRpZCBub3QgZmlu
ZCB0aGUgYXR0cmlidXRlLCBhbmQgdHJ5IHRvIHNldCB0aGUgYXR0cmlidXRlIGludG8gX19kaWN0
X18uICAqLworICAgIFB5RXJyX0NsZWFyKCk7CisKKyAgICAvKiBTZXQgdGhlIG5ldyB2YWx1ZS4K
KyAgICAgICBOb3RlOiB0aGUgb2xkIHZhbHVlIGlzIG1hbmFnZWQgYnkgUHlEaWN0X1NldEl0ZW0o
KSwgc28gbm8gbmVlZCB0byBnZXQKKyAgICAgICBhIGJvcnJvd2VkIHJlZmVyZW5jZSBvbiBpdCBh
bmQgZGVjcmVtZW50IGl0cyByZWZlcmVuY2UgY291bnRlciBiZWZvcmUKKyAgICAgICBzZXR0aW5n
IGEgbmV3IHZhbHVlLiAgKi8KKyAgICByZXR1cm4gUHlEaWN0X1NldEl0ZW0gKGRpY3QuZ2V0ICgp
LCBhdHRyLCB2YWx1ZSk7CisgIH0KK307CisKKyNkZWZpbmUgR0RCUFlPQkpFQ1RfRElDVF9BVFRS
KE8pCQlcCisgIFB5T2JqZWN0ICpkaWN0OwkJCQlcCisgIHVzaW5nIGRpY3RfYXR0ciA9IGdkYnB5
X2RpY3RfaGVscGVyczxPPgorCisjZGVmaW5lIGdkYnB5X2RpY3RfYXR0cl9nZXR0ZXIoTywgb2Jq
ZWN0X25hbWUpCQlcCisgIHsJCQkJCQkJXAorICAgICJfX2RpY3RfXyIsIC8qIG5hbWUgKi8JCQkJ
XAorICAgIChnZXR0ZXIpIE86OmRpY3RfYXR0cjo6Z2V0dGVyLAkJCVwKKyAgICAoc2V0dGVyKSBu
dWxscHRyLAkJCQkJXAorICAgICJUaGUgX19kaWN0X18gZm9yIHRoaXMgIiBvYmplY3RfbmFtZSAi
LiIsIC8qIGRvYyAqLwlcCisgICAgbnVsbHB0ciwgLyogY2xvc3VyZSAqLwkJCQlcCisgIH0KKwor
I2RlZmluZSBnZGJweV9kaWN0X2F0dHJfUHlUeXBlX1Nsb3RzKE8pCQkJCQlcCisgIHtQeV90cF9n
ZXRhdHRybywgcmVpbnRlcnByZXRfY2FzdDx2b2lkICo+KE86OmRpY3RfYXR0cjo6Z2V0YXR0cm8p
fSwJXAorICB7UHlfdHBfc2V0YXR0cm8sIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCAqPihPOjpkaWN0
X2F0dHI6OnNldGF0dHJvKX0KKworI2RlZmluZSBnZGJweV9kaWN0X2F0dHJfUHlfQUxMT0MoVCwg
c2VsZilcCisgIGdkYnB5X2RpY3RfaGVscGVyczxUPjo6YWxsb2NhdGUgKHNlbGYpCisKKyNkZWZp
bmUgZ2RicHlfZGljdF9hdHRyX1B5X1ZJU0lUKG9iaikJXAorICBwcmludGYgKCJ2aXNpdGluZyBf
X2RpY3RfX1xuIik7CVwKKyAgUHlfVklTSVQgKG9iai0+ZGljdCkKKworI2RlZmluZSBnZGJweV9k
aWN0X2F0dHJfUHlfQ0xFQVIob2JqKQlcCisgIHByaW50ZiAoImNsZWFyaW5nIF9fZGljdF9fXG4i
KTsJXAorICBQeV9DTEVBUiAob2JqLT5kaWN0KQorCisjZGVmaW5lIGdkYnB5X2RpY3RfYXR0cl9Q
eV9BTExPQyhULCBzZWxmKQlcCisgIGdkYnB5X2RpY3RfaGVscGVyczxUPjo6YWxsb2NhdGUgKHNl
bGYpCmRpZmYgLS1naXQgYS9pbmNsdWRlL3B5LW9iai10eXBlLmhwcCBiL2luY2x1ZGUvcHktb2Jq
LXR5cGUuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NjI1MTkKLS0t
IC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3B5LW9iai10eXBlLmhwcApAQCAtMCwwICsxLDQyNCBA
QAorLyogSGVscGVycyByZWxhdGVkIHRvIFB5dGhvbiBvYmplY3QgdHlwZQorCisgICBDb3B5cmln
aHQgKEMpIDIwMjYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmls
ZSBpcyBwYXJ0IG9mIEdEQi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlv
dSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJt
cyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0
aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNl
bnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhp
cyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2Vm
dWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGll
ZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9y
IG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0
aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFt
LiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworI2lm
bmRlZiBHREJfUFlUSE9OX1BZX09CSl9UWVBFX0gKKyNkZWZpbmUgR0RCX1BZVEhPTl9QWV9PQkpf
VFlQRV9ICisKKyNpbmNsdWRlICJweS1yZWYuaHBwIgorI2luY2x1ZGUgPGNzdGRpbz4KKyNpbmNs
dWRlIDxzdHJpbmc+CisKKy8qIFJldHVybiB0aGUgdHlwZSdzIGZ1bGx5IHF1YWxpZmllZCBuYW1l
IGZyb20gYSBQeVR5cGVPYmplY3QuICAqLworZXh0ZXJuIHN0ZDo6c3RyaW5nIGdkYl9weV90cF9u
YW1lIChQeVR5cGVPYmplY3QgKnB5X3R5cGUpIG5vZXhjZXB0OworCisvKiBSZXR1cm4gdGhlIHR5
cGUncyBmdWxseSBxdWFsaWZpZWQgbmFtZSBmcm9tIGEgUHlPYmplY3QuICAqLworZXh0ZXJuIHN0
ZDo6c3RyaW5nIGdkYnB5X3B5X29ial90cF9uYW1lIChQeU9iamVjdCAqc2VsZikgbm9leGNlcHQ7
CisKK3VzaW5nIGdkYnB5X2JyZWZfcHl0eXBlID0gZ2RicHlfYm9ycm93ZWRfcmVmPFB5VHlwZU9i
amVjdD47CisKK25hbWVzcGFjZSBnZGJweSB7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBz
dHJ1Y3QgaXNfcHlvYmplY3Rfd3JhcHBlcjogc3RkOjpmYWxzZV90eXBlIHt9OworCisgIHRlbXBs
YXRlIDx0eXBlbmFtZSBUPgorICBzdHJ1Y3QgaXNfcHlvYmplY3Rfd3JhcHBlcjxnZGJweV9yZWYg
PFQ+Pjogc3RkOjp0cnVlX3R5cGUge307CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHN0
cnVjdCBpc19weW9iamVjdF93cmFwcGVyPGdkYnB5X2JvcnJvd2VkX3JlZiA8VD4+OiBzdGQ6OnRy
dWVfdHlwZSB7fTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgY29uc3RleHByIGJvb2wg
aXNfcHlvYmplY3Rfd3JhcHBlcl92ID0gaXNfcHlvYmplY3Rfd3JhcHBlcjxUPjo6dmFsdWU7Cit9
IC8vIG5hbWVzcGFjZSBnZGJweQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHlwZVdyYXBwZXI+CitzdHJ1
Y3QgZ2RicHlfb2JqZWN0X3R5cGUKK3sKK3ByaXZhdGU6CisgIFB5VHlwZU9iamVjdCAqcHl0eXBl
XyAoKSBjb25zdCBub2V4Y2VwdAorICB7CisgICAgcmV0dXJuICgoVHlwZVdyYXBwZXIgKikgdGhp
cyktPnB5dHlwZSAoKTsKKyAgfQorCitwdWJsaWM6CisKKyAgb3BlcmF0b3IgUHlUeXBlT2JqZWN0
ICooKSBjb25zdCBub2V4Y2VwdAorICB7CisgICAgcmV0dXJuIHRoaXMtPnB5dHlwZV8gKCk7Cisg
IH0KKworICBzdGQ6OnN0cmluZyB0cF9uYW1lICgpIGNvbnN0IG5vZXhjZXB0CisgIHsKKyAgICBy
ZXR1cm4gZ2RiX3B5X3RwX25hbWUgKHRoaXMtPnB5dHlwZV8gKCkpOworICB9CisKKyAgYm9vbCBv
cGVyYXRvcj09IChjb25zdCBUeXBlV3JhcHBlciAmb3RoZXIpIGNvbnN0IG5vZXhjZXB0CisgIHsK
KyAgICByZXR1cm4gdGhpcy0+cHl0eXBlXyAoKSA9PSBvdGhlci5weXR5cGVfICgpOworICB9CisK
KyAgYm9vbCBzYW1lX2FzIChQeVR5cGVPYmplY3QgKm9ianR5cGUpIGNvbnN0IG5vZXhjZXB0Cisg
IHsKKyAgICByZXR1cm4gb2JqdHlwZSA9PSB0aGlzLT5weXR5cGVfICgpOworICB9CisKKyAgYm9v
bCBzYW1lX2FzIChQeU9iamVjdCAqb2JqKSBjb25zdCBub2V4Y2VwdAorICB7CisgICAgLyogTm90
ZTogaWYgdGhlIHR5cGUgb2JqZWN0cyBhcmUgdGhlIHNhbWUsIHRoZWlyIGFkZHJlc3Mgc2hvdWxk
IGJlCisgICAgICAgdGhlIHNhbWUgYmVjYXVzZSBHREIgbWFuYWdlcyBhbGwgdGhvc2UgdHlwZXMg
YXMgc2luZ2xldG9ucy4gICovCisgICAgcmV0dXJuIChvYmogIT0gbnVsbHB0cgorCSAgICAmJiAo
KFB5VHlwZV9DaGVjayAob2JqKSAhPSAwCisJCSAmJiB0aGlzLT5zYW1lX2FzIChyZWludGVycHJl
dF9jYXN0IDxQeVR5cGVPYmplY3QgKj4gKG9iaikpKQorCQl8fCB0aGlzLT5zYW1lX2FzIChQeV9U
WVBFIChvYmopKSkpCisJICAgfHwgdGhpcy0+cHl0eXBlXyAoKSA9PSBudWxscHRyOworICB9CisK
KyAgYm9vbCBzYW1lX2FzIChzdGQ6Om51bGxwdHJfdCkgY29uc3Qgbm9leGNlcHQKKyAgeworICAg
IHJldHVybiB0aGlzLT5weXR5cGVfICgpID09IG51bGxwdHI7CisgIH0KKworICBib29sIHNhbWVf
YXMgKGNvbnN0IGdkYnB5X2JvcnJvd2VkX3JlZiA8UHlUeXBlT2JqZWN0PiAmd3JhcHBlcikgY29u
c3Qgbm9leGNlcHQKKyAgeworICAgIHJldHVybiB0aGlzLT5weXR5cGVfICgpID09IHdyYXBwZXIu
Z2V0ICgpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIGJvb2wgc2FtZV9hcyAo
Y29uc3QgZ2RicHlfcmVmIDxUPiAmd3JhcHBlcikgY29uc3Qgbm9leGNlcHQKKyAgeworICAgIHJl
dHVybiB0aGlzLT5zYW1lX2FzIChzdGF0aWNfY2FzdCA8UHlPYmplY3QgKj4gKHdyYXBwZXIuZ2V0
ICgpKSk7CisgIH0KKworICB2b2lkICpzbG90IChpbnQgc2xvdF9pZCkgY29uc3Qgbm9leGNlcHQK
KyAgeworICAgIHJldHVybiBQeVR5cGVfR2V0U2xvdCAodGhpcy0+cHl0eXBlXyAoKSwgc2xvdF9p
ZCk7CisgIH0KKworICBnZGJweV9ib3Jyb3dlZF9yZWYgPFB5VHlwZU9iamVjdD4gYmFzZV90eXBl
ICgpIGNvbnN0IG5vZXhjZXB0CisgIHsKKyAgICByZXR1cm4gZ2RicHlfYm9ycm93ZWRfcmVmIDxQ
eVR5cGVPYmplY3Q+CisgICAgICAoKFB5VHlwZU9iamVjdCAqKSB0aGlzLT5zbG90IChQeV90cF9i
YXNlKSk7CisgIH0KKworICBib29sIGhlYXBfdHlwZSAoKSBjb25zdCBub2V4Y2VwdAorICB7Cisg
ICAgcmV0dXJuIFB5VHlwZV9HZXRGbGFncyAodGhpcy0+cHl0eXBlXyAoKSkgfCBQeV9UUEZMQUdT
X0hFQVBUWVBFOworICB9Cit9OworCitzdHJ1Y3QgZ2RicHlfb2JqZWN0X3R5cGVfcmVmOgorICBw
dWJsaWMgZ2RicHlfb2JqZWN0X3R5cGUgPGdkYnB5X29iamVjdF90eXBlX3JlZj4sCisgIHB1Ymxp
YyBnZGJweV9yZWYgPD4KK3sKKyAgZ2RicHlfb2JqZWN0X3R5cGVfcmVmICgpIG5vZXhjZXB0ID0g
ZGVmYXVsdDsKKyAgZ2RicHlfb2JqZWN0X3R5cGVfcmVmIChnZGJweV9vYmplY3RfdHlwZV9yZWYg
JiZvdGhlcikgbm9leGNlcHQgPSBkZWZhdWx0OworICBnZGJweV9vYmplY3RfdHlwZV9yZWYmIG9w
ZXJhdG9yPSAoZ2RicHlfb2JqZWN0X3R5cGVfcmVmICYmb3RoZXIpIG5vZXhjZXB0ID0gZGVmYXVs
dDsKKworICBnZGJweV9vYmplY3RfdHlwZV9yZWYgKHN0ZDo6bnVsbHB0cl90KSBub2V4Y2VwdAor
ICAgIDogZ2RicHlfcmVmPD4gKG51bGxwdHIpCisgIHsKKyAgfQorCisgIGdkYnB5X29iamVjdF90
eXBlX3JlZiAoZ2RicHlfcmVmIDw+ICYmb3RoZXIpIG5vZXhjZXB0CisgICAgOiBnZGJweV9yZWY8
PiAoc3RkOjptb3ZlKG90aGVyKSkKKyAgeworICAgIGdkYl9hc3NlcnQgKFB5VHlwZV9DaGVjayAo
dGhpcy0+Z2V0ICgpKSAhPSAwKTsKKyAgfQorCisgIFB5VHlwZU9iamVjdCAqcHl0eXBlICgpIGNv
bnN0IG5vZXhjZXB0CisgIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdCA8UHlUeXBlT2Jq
ZWN0ICo+ICh0aGlzLT5nZXQgKCkpOworICB9Cit9OworCitzdHJ1Y3QgZ2RicHlfb2JqZWN0X3R5
cGVfYnJlZjoKKyAgcHVibGljIGdkYnB5X29iamVjdF90eXBlIDxnZGJweV9vYmplY3RfdHlwZV9i
cmVmPiwKKyAgcHVibGljIGdkYnB5X2JvcnJvd2VkX3JlZiA8PgoreworICBnZGJweV9vYmplY3Rf
dHlwZV9icmVmICgpIG5vZXhjZXB0ID0gZGVmYXVsdDsKKyAgZ2RicHlfb2JqZWN0X3R5cGVfYnJl
ZiAoY29uc3QgZ2RicHlfb2JqZWN0X3R5cGVfYnJlZiAmb3RoZXIpIG5vZXhjZXB0ID0gZGVmYXVs
dDsKKyAgZ2RicHlfb2JqZWN0X3R5cGVfYnJlZiYgb3BlcmF0b3I9IChjb25zdCBnZGJweV9vYmpl
Y3RfdHlwZV9icmVmICZvdGhlcikgbm9leGNlcHQgPSBkZWZhdWx0OworCisgIGdkYnB5X29iamVj
dF90eXBlX2JyZWYgKGNvbnN0IGdkYnB5X29iamVjdF90eXBlX3JlZiYgb3RoZXIpIG5vZXhjZXB0
CisgICAgOiBnZGJweV9ib3Jyb3dlZF9yZWY8PiAob3RoZXIuZ2V0ICgpKQorICB7CisgIH0KKwor
ICBnZGJweV9vYmplY3RfdHlwZV9icmVmIChzdGQ6Om51bGxwdHJfdCkgbm9leGNlcHQKKyAgICA6
IGdkYnB5X2JvcnJvd2VkX3JlZjw+IChudWxscHRyKQorICB7CisgIH0KKworICBQeVR5cGVPYmpl
Y3QgKnB5dHlwZSAoKSBjb25zdCBub2V4Y2VwdAorICB7CisgICAgaWYgKHRoaXMtPmdldCAoKSA9
PSBudWxscHRyKQorICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0
X2Nhc3QgPFB5VHlwZU9iamVjdCAqPiAodGhpcy0+Z2V0ICgpKTsKKyAgfQorfTsKKworc3RydWN0
IGdkYnB5X3B5X29ial90eXBlX2JyZWY6CisgIHB1YmxpYyBnZGJweV9vYmplY3RfdHlwZSA8Z2Ri
cHlfcHlfb2JqX3R5cGVfYnJlZj4sCisgIHB1YmxpYyBnZGJweV9ib3Jyb3dlZF9yZWYgPFB5VHlw
ZU9iamVjdD4KK3sKKyAgZ2RicHlfcHlfb2JqX3R5cGVfYnJlZiAoKSBub2V4Y2VwdCA9IGRlZmF1
bHQ7CisgIGdkYnB5X3B5X29ial90eXBlX2JyZWYgKGNvbnN0IGdkYnB5X3B5X29ial90eXBlX2Jy
ZWYgJm90aGVyKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CisgIGdkYnB5X3B5X29ial90eXBlX2JyZWYm
IG9wZXJhdG9yPSAoZ2RicHlfcHlfb2JqX3R5cGVfYnJlZiAmJm90aGVyKSBub2V4Y2VwdCA9IGRl
ZmF1bHQ7CisKKyAgZ2RicHlfcHlfb2JqX3R5cGVfYnJlZiAoY29uc3QgZ2RicHlfYm9ycm93ZWRf
cmVmIDxQeVR5cGVPYmplY3Q+ICZweXR5cGUpIG5vZXhjZXB0CisgICAgOiBnZGJweV9ib3Jyb3dl
ZF9yZWY8UHlUeXBlT2JqZWN0PiAocHl0eXBlKQorICB7CisgIH0KKworICBnZGJweV9weV9vYmpf
dHlwZV9icmVmIChQeVR5cGVPYmplY3QgKnB5dHlwZSkgbm9leGNlcHQKKyAgICA6IGdkYnB5X2Jv
cnJvd2VkX3JlZjxQeVR5cGVPYmplY3Q+IChweXR5cGUpCisgIHsKKyAgfQorCisgIFB5VHlwZU9i
amVjdCAqcHl0eXBlICgpIGNvbnN0IG5vZXhjZXB0CisgIHsKKyAgICByZXR1cm4gdGhpcy0+Z2V0
ICgpOworICB9Cit9OworCisvKiBXcmFwcGVyIGFyb3VuZCBQeU9iamVjdF9UeXBlQ2hlY2soKS4K
KyAgIE5vdGU6IHRoaXMgd3JhcHBlciB3aWxsIGJlIGRlY29tbWlzc2lvbmVkIG9uY2UgYWxsIHRo
ZSBQeXRob24gZXh0ZW5zaW9uCisgICB0eXBlcyB3aWxsIGhhdmUgYmVlbiBtaWdyYXRlZCB0byB0
aGUgUHl0aG9uIGxpbWl0ZWQgQVBJLiAgKi8KK2lubGluZSBib29sCitnZGJweV90eXBlX2NoZWNr
IChQeU9iamVjdCAqb2JqLCBjb25zdCBQeVR5cGVPYmplY3QgJm9ial90eXBlKQoreworICByZXR1
cm4gUHlPYmplY3RfVHlwZUNoZWNrIChvYmosIGNvbnN0X2Nhc3Q8UHlUeXBlT2JqZWN0ICo+ICgm
b2JqX3R5cGUpKTsKK30KKworLyogV3JhcHBlciBhcm91bmQgUHlPYmplY3RfVHlwZUNoZWNrKCkg
dG8gY29tcGFyZSBhZ2FpbnN0IGFueSB3cmFwcGVyCisgICBjb252ZXJ0aWJsZSB0byAnUHlUeXBl
T2JqZWN0IConLiAgKi8KK3RlbXBsYXRlIDxjbGFzcyBPVHlwZSwKKwkgIHR5cGVuYW1lID0gc3Rk
Ojppc19jb252ZXJ0aWJsZTxPVHlwZSwgUHlUeXBlT2JqZWN0ICo+PgoraW5saW5lIGJvb2wKK2dk
YnB5X3R5cGVfY2hlY2sgKFB5T2JqZWN0ICpvYmosIGNvbnN0IE9UeXBlICZvYmpfdHlwZSkKK3sK
KyAgcmV0dXJuIFB5T2JqZWN0X1R5cGVDaGVjayAob2JqLCBvYmpfdHlwZS5weXR5cGUgKCkpOwor
fQorCisvKiBXcmFwcGVyIGFyb3VuZCBQeU9iamVjdF9UeXBlQ2hlY2soKSBzaW1pbGFyIHRvIHRo
ZSBwcmV2aW91cyBvbmUsIGJ1dAorICAgYWNjZXB0aW5nICdnZGJweV9yZWY8VD4nIGFuZCAnZ2Ri
cHlfYm9ycm93ZWRfcmVmJyBpbnN0ZWFkIG9mIHJhdworICAgJ1B5T2JqZWN0IConLiAgKi8KK3Rl
bXBsYXRlIDxjbGFzcyBXcmFwcGVyLAorCSAgY2xhc3MgT1R5cGUsCisJICB0eXBlbmFtZSA9IGdk
YnB5Ojppc19weW9iamVjdF93cmFwcGVyPFdyYXBwZXI+LAorCSAgdHlwZW5hbWUgPSBzdGQ6Omlz
X2NvbnZlcnRpYmxlPE9UeXBlLCBQeVR5cGVPYmplY3QgKj4+CitpbmxpbmUgYm9vbAorZ2RicHlf
dHlwZV9jaGVjayAoY29uc3QgV3JhcHBlciAmb2JqLCBjb25zdCBPVHlwZSAmb2JqX3R5cGUpCit7
CisgIHJldHVybiBQeU9iamVjdF9UeXBlQ2hlY2sgKG9iai5nZXQgKCksIG9ial90eXBlLnB5dHlw
ZSAoKSk7Cit9CisKK3N0cnVjdCBnZGJweV9oZWFwX3R5cGUKK3sKKyAgdXNpbmcgdHBfdHJhdmVy
c2VfdCA9IGludCAoKikgKFB5T2JqZWN0ICpzZWxmLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFy
Zyk7CisgIHVzaW5nIHRwX2NsZWFyX3QgPSB2b2lkICgqKSAoUHlPYmplY3QgKnNlbGYpOworCisg
IHN0YXRpYyBjb25zdGV4cHIgdW5zaWduZWQgbG9uZworICB0cF9mbGFnc19kZWZhdWx0ICgpCisg
IHsgcmV0dXJuIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQzsgfQorCisg
IHN0YXRpYyBpbnQKKyAgdHBfdHJhdmVyc2UgKFB5T2JqZWN0ICpzZWxmLCB2aXNpdHByb2Mgdmlz
aXQsIHZvaWQgKmFyZywKKwkgICAgICAgY29uc3QgZ2RicHlfb2JqZWN0X3R5cGVfYnJlZiAmYmFz
ZV90eXBlLAorCSAgICAgICB0cF90cmF2ZXJzZV90IHRwX3RyYXZlcnNlX2ltcGwpCisgIHsKKyAg
ICBpbnQgcmVzID0gMDsKKworICAgIC8qIFRyYXZlcnNlIHRoZSBvYmplY3QncyBhdHRyaWJ1dGVz
LiAgKi8KKyAgICBpZiAodHBfdHJhdmVyc2VfaW1wbCAhPSBudWxscHRyKQorICAgICAgeworCWlm
ICgocmVzID0gdHBfdHJhdmVyc2VfaW1wbCAoc2VsZiwgdmlzaXQsIGFyZykpICE9IDApCisJICBy
ZXR1cm4gcmVzOworICAgICAgfQorCisgICAgLyogRG9uJ3QgZm9yZ2V0IHRvIGNhbGwgdHBfdHJh
dmVyc2Ugb2YgdGhlIGJhc2UgY2xhc3MuICAqLworICAgIGlmIChiYXNlX3R5cGUgIT0gbnVsbHB0
cikKKyAgICAgIHsKKwlhdXRvIGJhc2VfdHBfdHJhdmVyc2UKKwkgID0gKGdkYnB5X2hlYXBfdHlw
ZTo6dHBfdHJhdmVyc2VfdCkgYmFzZV90eXBlLnNsb3QgKFB5X3RwX3RyYXZlcnNlKTsKKwlpZiAo
KHJlcyA9IGJhc2VfdHBfdHJhdmVyc2UgKHNlbGYsIHZpc2l0LCBhcmcpKSAhPSAwKQorCSAgcmV0
dXJuIHJlczsKKyAgICAgIH0KKworICAgIC8qIEZyb20gUHl0aG9uIDMuOSwgdHBfdHJhdmVyc2Ug
bXVzdCB2aXNpdCB0aGUgdHlwZSBmb3IgaGVhcC1hbGxvY2F0ZWQKKyAgICAgICB0eXBlcy4gIE9s
ZGVyIHZlcnNpb25zIG11c3Qgbm90IHZpc2l0IGl0LgorICAgICAgIE5vdGUgdGhhdCwgaW4gY2Fz
ZSBvZiBpbmhlcml0YW5jZSwgdGhlIHR5cGUgc2hvdWxkIGJlIHZpc2l0ZWQgb25seQorICAgICAg
IG9uY2UuICAqLworI2lmIFBZX1ZFUlNJT05fSEVYID49IDB4MDMwOTAwMDAKKyAgICBpZiAoYmFz
ZV90eXBlID09IG51bGxwdHIpCisgICAgICB7CisJcHJpbnRmICgiY2FsbGluZyBQeV9WSVNJVCAo
UHlfVFlQRSAoc2VsZikpXG4iKTsKKwlQeV9WSVNJVCAoUHlfVFlQRSAoc2VsZikpOworICAgICAg
fQorI2VuZGlmCisKKyAgICByZXR1cm4gcmVzOworICB9CisKKyAgc3RhdGljIHZvaWQKKyAgdHBf
Y2xlYXIgKFB5T2JqZWN0ICpzZWxmLAorCSAgICBjb25zdCBnZGJweV9vYmplY3RfdHlwZV9icmVm
ICZiYXNlX3R5cGUsCisJICAgIHRwX2NsZWFyX3QgdHBfY2xlYXJfaW1wbCkKKyAgeworICAgIC8q
IENsZWFyIGFueSBmaWVsZHMgc3BlY2lmaWMgdG8gdGhlIHR5cGUuICAqLworICAgIGlmICh0cF9j
bGVhcl9pbXBsICE9IG51bGxwdHIpCisgICAgICB0cF9jbGVhcl9pbXBsIChzZWxmKTsKKworICAg
IC8qIERvbid0IGZvcmdldCB0byBjYWxsIHRwX2NsZWFyIG9mIHRoZSBiYXNlIGNsYXNzLiAgKi8K
KyAgICBpZiAoYmFzZV90eXBlICE9IG51bGxwdHIpCisgICAgICB7CisJYXV0byBiYXNlX3RwX2Ns
ZWFyCisJICA9IChnZGJweV9oZWFwX3R5cGU6OnRwX2NsZWFyX3QpIGJhc2VfdHlwZS5zbG90IChQ
eV90cF9jbGVhcik7CisJYmFzZV90cF9jbGVhciAoc2VsZik7CisgICAgICB9CisgIH0KKworICBz
dGF0aWMgdm9pZAorICB0cF9kZWFsbG9jIChQeU9iamVjdCAqc2VsZikKKyAgeworICAgIGF1dG8g
KnRwID0gUHlfVFlQRSAoc2VsZik7CisKKyAgICAvKiBDYWxsIFB5T2JqZWN0X0dDX1VuVHJhY2so
KSBiZWZvcmUgYW55IGZpZWxkcyBhcmUgaW52YWxpZGF0ZWQuICAqLworICAgIFB5T2JqZWN0X0dD
X1VuVHJhY2sgKHNlbGYpOworCisgICAgLyogQ2xlYXIgdGhlIG9iamVjdCdzIGF0dHJpYnV0ZXMu
ICAqLworICAgIGF1dG8gc2VsZl90cF9jbGVhciA9ICh0cF9jbGVhcl90KSBQeVR5cGVfR2V0U2xv
dCAodHAsIFB5X3RwX2NsZWFyKTsKKyAgICBpZiAoc2VsZl90cF9jbGVhcikKKyAgICAgIHNlbGZf
dHBfY2xlYXIgKHNlbGYpOworCisgICAgLyogRGVsZXRlIHRoZSBvYmplY3QuICAqLworICAgIFB5
T2JqZWN0X0dDX0RlbCAoc2VsZik7CisKKyAgICAvKiBEZWNyZW1lbnQgdGhlIHJlZmVyZW5jZSBj
b3VudCBvZiB0aGUgdHlwZS4gICovCisgICAgcHJpbnRmICgiZGVjcmVtZW50IHJlZiBjb3VudCBv
biBQeV9UWVBFIChzZWxmKVxuIik7CisgICAgUHlfREVDUkVGICh0cCk7CisgIH0KKworICAvKiBB
IGNvbnZlbmllbnQgd3JhcHBlciBlbmZvcmNpbmcgdGhlIGNhbGwgdG8gUHlPYmplY3RfR0NfVHJh
Y2soKSBvbiBhIG5ld2x5CisgICAgIGFsbG9jYXRlZCBQeXRob24gb2JqZWN0IGJlZm9yZSBpdCBn
b2VzIG91dCBvZiBzY29wZS4gIElmIGEgZGV2ZWxvcGVyCisgICAgIGZvcmdldHMgdG8gY2FsbCB0
cmFjaygpLCB0aGUgZGVzdHJ1Y3RvciByYWlzZXMgYSBydW50aW1lIGFzc2VydGlvbiBpbiB0aGUK
KyAgICAgZGVzdHJ1Y3Rvci4gICovCisgIHRlbXBsYXRlIDxjbGFzcyBUPgorICBzdHJ1Y3QgYXV0
b19nY190cmFjaworICAgIDogcHJpdmF0ZSBnZGJweV9yZWY8VD4KKyAgeworICAgIGF1dG9fZ2Nf
dHJhY2sgKFQgKm9iaikKKyAgICAgIDogZ2RicHlfcmVmPFQ+IChvYmopCisgICAge30KKworICAg
IGF1dG9fZ2NfdHJhY2sgKGF1dG9fZ2NfdHJhY2sgJiZvdGhlcikKKyAgICAgIDogZ2RicHlfcmVm
PFQ+IChzdGQ6Om1vdmUgKG90aGVyKSkKKyAgICB7fQorCisgICAgYXV0b19nY190cmFjayAmb3Bl
cmF0b3I9IChhdXRvX2djX3RyYWNrICYmb3RoZXIpCisgICAgeworICAgICAgaWYgKHRoaXMgIT0g
b3RoZXIpCisJZ2RicHlfcmVmPFQ+OjpvcGVyYXRvcj0gKHN0ZDo6bW92ZSAob3RoZXIpKTsKKyAg
ICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBnZGJweV9ib3Jyb3dlZF9yZWY8VD4gYm9y
cm93ZWRfcmVmICgpIGNvbnN0IG5vZXhjZXB0CisgICAgeworICAgICAgcmV0dXJuIGdkYnB5X3Jl
ZjxUPjo6Z2V0ICgpOworICAgIH0KKworICAgIGdkYnB5X3JlZjxUPiBzdHJvbmdfcmVmICgpIGNv
bnN0IG5vZXhjZXB0CisgICAgeworICAgICAgcmV0dXJuIGdkYnB5X3JlZjxUPigqdGhpcyk7Cisg
ICAgfQorCisgICAgLyogU3RhcnQgdHJhY2tpbmcgb2YgdGhlIG5ld2x5IGFsbG9jYXRlZCBvYmpl
Y3Qgd2l0aCB0aGUgR0MuCisgICAgICAgUmV0dXJuIGdkYnB5X3JlZjxUPiBhcyB0aGUgZmluYWxp
emVkIG9iamVjdC4gICovCisgICAgZ2RicHlfcmVmPFQ+IHRyYWNrICgpCisgICAgeworICAgICAg
UHlPYmplY3RfR0NfVHJhY2sgKHRoaXMtPmdldCAoKSk7CisgICAgICByZXR1cm4gc3RkOjptb3Zl
ICgqdGhpcyk7CisgICAgfQorCisgICAgLyogQmFpbCBvdXQsIGkuZS4gZnJlZSB0aGUgbmV3bHkg
YWxsb2NhdGVkIG9iamVjdCBhbmQgcmV0dXJuIE5VTEwuICAqLworICAgIHN0ZDo6bnVsbHB0cl90
IGJhaWxvdXQgKCkKKyAgICB7CisgICAgICBhdXRvIG9iaiA9IHRoaXMtPnRyYWNrICgpOworICAg
ICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgaW5saW5lIGV4cGxpY2l0IG9wZXJhdG9y
IGJvb2wgKCkgY29uc3Qgbm9leGNlcHQKKyAgICB7CisgICAgICByZXR1cm4gZ2RicHlfcmVmPFQ+
OjpnZXQgKCkgIT0gbnVsbHB0cjsKKyAgICB9CisKKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09
IChjb25zdCBzdGQ6Om51bGxwdHJfdCkgY29uc3Qgbm9leGNlcHQKKyAgICB7CisgICAgICByZXR1
cm4gZ2RicHlfcmVmPFQ+OjpnZXQgKCkgPT0gbnVsbHB0cjsKKyAgICB9CisKKyAgICBUICpvcGVy
YXRvci0+ICgpIGNvbnN0IG5vZXhjZXB0CisgICAgeworICAgICAgcmV0dXJuIGdkYnB5X3JlZjxU
Pjo6Z2V0ICgpOworICAgIH0KKworICAgIH5hdXRvX2djX3RyYWNrICgpCisgICAgeworICAgICAg
LyogVGhlIG9iamVjdCBzaG91bGQgaGF2ZSBiZWVuIHRyYWNrZWQgYnkgdGhlIEdDLCBhbmQgcmVs
ZWFzZWQgYmVmb3JlCisJIHRoaXMgZGVzdHJ1Y3RvciBpcyBjYWxsZWQuICAqLworICAgICAgZ2Ri
X2Fzc2VydCAoZ2RicHlfcmVmPFQ+OjpnZXQgKCkgPT0gbnVsbHB0cik7CisgICAgfQorICB9Owor
CisgIC8qIENvbnZlbmllbnQgd3JhcHBlciB0byBQeU9iamVjdF9HQ19OZXcoKSByZXR1cm5pbmcg
YW4gYXV0b19nY190cmFjazxUPgorICAgICBvYmplY3QsIHVzZWQgdG8gZW5mb3JjZSB0aGUgY2Fs
bCB0byBQeU9iamVjdF9HQ19UcmFjaygpIG9uIHRoZSBuZXdseQorICAgICBhbGxvY2F0ZWQgUHl0
aG9uIG9iamVjdCBiZWZvcmUgYXV0b19nY190cmFjazxUPiBnb2VzIG91dCBvZiBzY29wZS4gICov
CisgIHRlbXBsYXRlIDxjbGFzcyBUPgorICBzdGF0aWMgYXV0b19nY190cmFjazxUPgorICBtYWtl
X3B5b2JqIChjb25zdCBnZGJweV9vYmplY3RfdHlwZV9icmVmICZvYmpfdHlwZSkKKyAgeworICAg
IGF1dG9fZ2NfdHJhY2s8VD4gb2JqCisgICAgICAoc3RhdGljX2Nhc3Q8VCAqPiAoUHlPYmplY3Rf
R0NfTmV3IChULCBvYmpfdHlwZS5weXR5cGUgKCkpKSk7CisgICAgcmV0dXJuIG9iajsKKyAgfQor
fTsKKworLyogSGVscGVyIG1hY3JvIHRvIGluaXRpYWxpemUgbWFuZGF0b3J5IHNsb3QgSURzIChp
LmUuIFB5X3RwX3RyYXZlcnNlLAorICAgUHlfdHBfY2xlYXIsIGFuZCBQeV90cF9kZWFsbG9jKSBm
b3IgZ2FyYmFnZS1jb2xsZWN0ZWQgdHlwZXMsIHVzaW5nCisgICBkZWZhdWx0IG1ldGhvZHMuCisg
ICBOb3RlOiB0aG9zZSBkZWZhdWx0cyBhcmUgaWRlYWwgZm9yIGNsYXNzZXMgY29udGFpbmluZyBu
byBzdHJvbmcKKyAgIHJlZmVyZW5jZXMgb2YgUHl0aG9uIG9iamVjdHMgaW4gdGhlaXIgYXR0cmli
dXRlcy4gICovCisKKy8qIEhlbHBlciBtYWNybyB0byBpbml0aWFsaXplIG1hbmRhdG9yeSBzbG90
IElEcyAoaS5lLiBQeV90cF90cmF2ZXJzZSwKKyAgIFB5X3RwX2NsZWFyLCBhbmQgUHlfdHBfZGVh
bGxvYykgZm9yIGdhcmJhZ2UtY29sbGVjdGVkIHR5cGVzLCBwcm92aWRpbmcKKyAgIGN1c3RvbSBt
ZXRob2RzIGZvciB0cF90cmF2ZXJzZSBhbmQgdHBfY2xlYXIuICAqLworI2RlZmluZSBnZGJweV9o
ZWFwX3R5cGVfbWV0aG9kcyhmbl90cmF2ZXJzZSwgZm5fY2xlYXIpCVwKKyAge1B5X3RwX3RyYXZl
cnNlLCAodm9pZCAqKSBmbl90cmF2ZXJzZX0sCQlcCisgIHtQeV90cF9jbGVhciwgICAgKHZvaWQg
KikgZm5fY2xlYXJ9LAkJCVwKKyAge1B5X3RwX2RlYWxsb2MsICAodm9pZCAqKSBnZGJweV9oZWFw
X3R5cGU6OnRwX2RlYWxsb2N9CisKKy8qIEhlbHBlciBtYWNybyBkZWNsYXJpbmcgJ3Zhcm5hbWUn
LCBjcmVhdGluZyBhIG5ldyBoZWFwLWFsbG9jYXRlZCBvYmplY3Qgb2YKKyAgIHN0YXRpYyB0eXBl
IE9CSlRZUEUsIGluaXRpYWxpemluZyBpdCBmb2xsb3dpbmcgc3BlY3MgZGVjbGFyZWQgaW4gcHlf
b2JqdHlwZQorICAgKHRoZSBkeW5hbWljYWxseS1hbGxvY2F0ZWQgdHlwZSBjb3JyZXNwb25kaW5n
IHRvIE9CSlRZUEUpLCBhbmQgdmFsaWRhdGluZworICAgaXRzIGNyZWF0aW9uIG9yIGJhaWxpbmcg
b3V0LiAgKi8KKyNkZWZpbmUgZ2RicHlfaGVhcF90eXBlX2FsbG9jYXRlX29yX2JhaWxvdXQodmFy
bmFtZSwgT0JKVFlQRSwgcHlfb2JqdHlwZSlcCisgIGF1dG8gdmFybmFtZSA9IGdkYnB5X2hlYXBf
dHlwZTo6bWFrZV9weW9iajxPQkpUWVBFPiAocHlfb2JqdHlwZSk7CVwKKyAgaWYgKHZhcm5hbWUg
PT0gbnVsbHB0cikJCQkJCQlcCisgICAgcmV0dXJuIG51bGxwdHIKKworI2VuZGlmIC8qIEdEQl9Q
WVRIT05fUFlfT0JKX1RZUEVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9weS1yZWYuaHBwIGIv
aW5jbHVkZS9weS1yZWYuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4
ZWEzYTAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3B5LXJlZi5ocHAKQEAgLTAsMCArMSwy
MDQgQEAKKy8qIFB5dGhvbiByZWZlcmVuY2UtaG9sZGluZyBjbGFzcworCisgICBDb3B5cmlnaHQg
KEMpIDIwMTYtMjAyNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBm
aWxlIGlzIHBhcnQgb2YgR0RCLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsg
eW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRl
cm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAg
IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExp
Y2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBU
aGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVz
ZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBs
aWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBm
b3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9m
IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dy
YW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisj
aWZuZGVmIEdEQl9QWVRIT05fUFlfUkVGX0gKKyNkZWZpbmUgR0RCX1BZVEhPTl9QWV9SRUZfSAor
CisjaW5jbHVkZSAiZ2RiX3JlZl9wdHIuaHBwIgorI2luY2x1ZGUgPFB5dGhvbi5oPgorI2luY2x1
ZGUgInB5dGhvbi10cmFpdHMuaHBwIgorCisvKiBBIHBvbGljeSBjbGFzcyBmb3IgZ2RiOjpyZWZf
cHRyIGZvciBQeXRob24gcmVmZXJlbmNlIGNvdW50aW5nLiAgKi8KK3N0cnVjdCBnZGJweV9yZWZf
cG9saWN5Cit7CisgIHN0YXRpYyB2b2lkIGluY3JlZiAoUHlPYmplY3QgKnB0cikKKyAgeworICAg
IFB5X0lOQ1JFRiAocHRyKTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIGRlY3JlZiAoUHlPYmplY3Qg
KnB0cikKKyAgeworICAgIFB5X0RFQ1JFRiAocHRyKTsKKyAgfQorCisgIHVzaW5nIHZpc2l0cHJv
YyA9IGludCAoKikoUHlPYmplY3QgKm9iamVjdCwgdm9pZCAqYXJnKTsKKworICBzdGF0aWMgaW50
IHZpc2l0IChQeU9iamVjdCAqcHRyLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykgbm9leGNl
cHQKKyAgeworICAgIFB5X1ZJU0lUIChwdHIpOworICAgIHJldHVybiAwOworICB9CisKKyAgdGVt
cGxhdGUgPHR5cGVuYW1lIFQ+CisgIHN0YXRpYyB2b2lkIGNsZWFyIChUICoqcHRyKSBub2V4Y2Vw
dAorICB7CisgICAgUHlfQ0xFQVIgKCpwdHIpOworICB9Cit9OworCisvKiBIZWxwZXIgbWFjcm8g
dG8gYWxsb2NhdGUgYW5kIGJ1aWxkIGEgbmV3IGdkYnB5X3JlZjxUPiBmcm9tIGEgcG9pbnRlcgor
ICAgd2hpbGUgaW5jcmVtZW50aW5nIHRoZSByZWYgY291bnRlci4gICovCisjZGVmaW5lIGdkYnB5
X3JlZl9ORVdSRUYoVCwgcHRyX29iaikgXAorICBuZXcgZ2RicHlfcmVmPFQ+IChnZGJweV9yZWY8
VD46Om5ld19yZWZlcmVuY2UgKHB0cl9vYmopKQorCisvKiBDb3VzaW4gbWFjcm8gb2YgUHlfVklT
SVQgc3BlY2lhbGl6ZWQgZm9yIGdkYnB5X3JlZjxUPi4KKyAgIE5vdGU6IHRoaXMgbWFjcm8gaGFz
IHRvIGJlIHVzZWQgaW5zaWRlIHRoZSBjdXN0b20gdHBfdHJhdmVyc2UgZnVuY3Rpb24gZm9yCisg
ICB0eXBlIFQgc28gdGhhdCBpdHMgcGFyYW1ldGVycyB2aXNpdCBhbmQgYXJnIGFyZSBrbm93bi4g
ICovCisjZGVmaW5lIGdkYnB5X3JlZl9WSVNJVChwdHJfZ2RicHlfcmVmKQkJCVwKKyAgZG8JCQkJ
CQkJXAorICAgIHsJCQkJCQkJXAorICAgICAgaWYgKHB0cl9nZGJweV9yZWYpCQkJCVwKKwl7CQkJ
CQkJXAorCSAgaW50IHJldAkJCQkJXAorCSAgICA9IChwdHJfZ2RicHlfcmVmKS0+dmlzaXQgKHZp
c2l0LCBhcmcpOwlcCisJICBpZiAocmV0KQkJCQkJXAorCSAgICByZXR1cm4gcmV0OwkJCQkJXAor
CX0JCQkJCQlcCisgICAgfQkJCQkJCQlcCisgIHdoaWxlICgwKQorCisvKiBDb3VzaW4gbWFjcm8g
b2YgUHlfQ0xFQVIgc3BlY2lhbGl6ZWQgZm9yIGdkYnB5X3JlZjxUPi4gICovCisjZGVmaW5lIGdk
YnB5X3JlZl9DTEVBUihvYmopCVwKKyAgZG8JCQkJXAorICAgIHsJCQkJXAorICAgICAgaWYgKG9i
aikJCQlcCisJewkJCVwKKwkgIChvYmopLT5jbGVhciAoKTsJXAorCSAgZGVsZXRlIChvYmopOwkJ
XAorCSAgKG9iaikgPSBudWxscHRyOwlcCisJfQkJCVwKKyAgICB9CQkJCVwKKyAgd2hpbGUgKDAp
CisKKy8qIEEgZ2RiOjpyZWZfcHRyIHRoYXQgaGFzIGJlZW4gc3BlY2lhbGl6ZWQgZm9yIFB5dGhv
biBvYmplY3RzIG9yCisgICB0aGVpciAic3ViY2xhc3NlcyIuICAqLwordGVtcGxhdGU8dHlwZW5h
bWUgVCA9IFB5T2JqZWN0PiB1c2luZyBnZGJweV9yZWYKKyAgPSBnZGI6OnJlZl9wdHI8VCwgZ2Ri
cHlfcmVmX3BvbGljeT47CisKKy8qIEEgY2xhc3MgcmVwcmVzZW50aW5nIGEgYm9ycm93ZWQgcmVm
ZXJlbmNlLgorCisgICBUaGlzIGlzIGEgc2ltcGxlIHdyYXBwZXIgZm9yIGEgUHlPYmplY3QqLiAg
QXNpZGUgZnJvbSBkb2N1bWVudGluZworICAgd2hhdCB0aGUgY29kZSBkb2VzLCB0aGUgbWFpbiBh
ZHZhbnRhZ2Ugb2YgdXNpbmcgdGhpcyBpcyB0aGF0CisgICBjb252ZXJzaW9uIHRvIGEgZ2RicHlf
cmVmPD4gaXMgZ3VhcmFudGVlZCB0byBtYWtlIGEgbmV3CisgICByZWZlcmVuY2UuICAqLwordGVt
cGxhdGUgPGNsYXNzIFQgPSBQeU9iamVjdD4KK2NsYXNzIGdkYnB5X2JvcnJvd2VkX3JlZgorewor
cHVibGljOgorCisgIGdkYnB5X2JvcnJvd2VkX3JlZiAoKSBub2V4Y2VwdAorICAgIDogbV9vYmog
KG51bGxwdHIpCisgIHsKKyAgfQorCisgIGdkYnB5X2JvcnJvd2VkX3JlZiAoY29uc3Qgc3RkOjpu
dWxscHRyX3QpIG5vZXhjZXB0CisgICAgOiBtX29iaiAobnVsbHB0cikKKyAgeworICB9CisKKyAg
dGVtcGxhdGUgPHR5cGVuYW1lIFUsCisJICAgIHR5cGVuYW1lID0gc3RkOjppc19jb252ZXJ0aWJs
ZTxVICosIFQqPj4KKyAgZ2RicHlfYm9ycm93ZWRfcmVmIChVICpvYmopIG5vZXhjZXB0CisgICAg
OiBtX29iaiAob2JqKQorICB7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVSwKKwkgICAg
dHlwZW5hbWUgPSBzdGQ6OmlzX2NvbnZlcnRpYmxlPFUgKiwgVCo+PgorICBnZGJweV9ib3Jyb3dl
ZF9yZWYgKGNvbnN0IGdkYnB5X3JlZjxVPiAmcmVmKSBub2V4Y2VwdAorICAgIDogbV9vYmogKHJl
Zi5nZXQgKCkpCisgIHsKKyAgfQorCisgIGdkYnB5X2JvcnJvd2VkX3JlZiAoY29uc3QgZ2RicHlf
Ym9ycm93ZWRfcmVmICZvdGhlcikgbm9leGNlcHQKKyAgICA6IG1fb2JqIChvdGhlci5tX29iaikK
KyAgeworICB9CisKKyAgZ2RicHlfYm9ycm93ZWRfcmVmICZvcGVyYXRvcj0gKGNvbnN0IGdkYnB5
X2JvcnJvd2VkX3JlZiAmb3RoZXIpCisgIHsKKyAgICBtX29iaiA9IG90aGVyLm1fb2JqOworICAg
IHJldHVybiAqdGhpczsKKyAgfQorCisgIG9wZXJhdG9yIGJvb2wgKCkgY29uc3Qgbm9leGNlcHQK
KyAgeworICAgIHJldHVybiBtX29iaiAhPSBudWxscHRyOworICB9CisKKyAgb3BlcmF0b3IgVCAq
ICgpIGNvbnN0IG5vZXhjZXB0CisgIHsKKyAgICByZXR1cm4gbV9vYmo7CisgIH0KKworICAvKiBX
aGVuIGNvbnZlcnRpbmcgYSBib3Jyb3dlZCByZWZlcmVuY2UgdG8gYSBnZGJweV9yZWY8PiwgYSBu
ZXcKKyAgICAgcmVmZXJlbmNlIGlzIGFjcXVpcmVkLiAgKi8KKyAgdGVtcGxhdGUgPHR5cGVuYW1l
IFRPYmosCisJICAgIHR5cGVuYW1lID0gc3RkOjppc19jb252ZXJ0aWJsZTxUT2JqICosIFQgKj4+
CisgIG9wZXJhdG9yIGdkYnB5X3JlZjxUT2JqPiAoKQorICB7CisgICAgZ2RiX2Fzc2VydCAobV9v
YmogIT0gbnVsbHB0cik7CisgICAgcmV0dXJuIGdkYnB5X3JlZjxUT2JqPjo6bmV3X3JlZmVyZW5j
ZSAobV9vYmopOworICB9CisKKyAgZ2RicHlfcmVmPFQ+IHN0cm9uZ19yZWYgKCkgY29uc3Qgbm9l
eGNlcHQKKyAgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxnZGJweV9yZWY8VD4+ICgqdGhpcyk7
CisgIH0KKworICAvKiBMZXQgdXNlcnMgcmVmZXIgdG8gbWVtYmVycyBvZiB0aGUgdW5kZXJseWlu
ZyBwb2ludGVyLiAgKi8KKyAgVCAqb3BlcmF0b3ItPiAoKSBjb25zdCBub2V4Y2VwdAorICB7Cisg
ICAgcmV0dXJuIG1fb2JqOworICB9CisKKyAgVCAqZ2V0ICgpIGNvbnN0IG5vZXhjZXB0CisgIHsK
KyAgICByZXR1cm4gbV9vYmo7CisgIH0KKworcHJpdmF0ZToKKyAgVCAqbV9vYmo7Cit9OworCit0
ZW1wbGF0ZTx0eXBlbmFtZSBUPgoraW5saW5lIGJvb2wgb3BlcmF0b3I9PSAoY29uc3QgZ2RicHlf
Ym9ycm93ZWRfcmVmPFQ+ICZsaHMsIGNvbnN0IHN0ZDo6bnVsbHB0cl90KQoreworICByZXR1cm4g
bGhzLmdldCAoKSA9PSBudWxscHRyOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgoraW5saW5l
IGJvb2wgb3BlcmF0b3IhPSAoY29uc3QgZ2RicHlfYm9ycm93ZWRfcmVmPFQ+ICZsaHMsIGNvbnN0
IHN0ZDo6bnVsbHB0cl90KQoreworICByZXR1cm4gbGhzLmdldCAoKSAhPSBudWxscHRyOworfQor
Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgoraW5saW5lIGJvb2wgb3BlcmF0b3I9PSAoY29uc3Qgc3Rk
OjpudWxscHRyX3QsIGNvbnN0IGdkYnB5X2JvcnJvd2VkX3JlZjxUPiAmcmhzKQoreworICByZXR1
cm4gbnVsbHB0ciA9PSByaHMuZ2V0ICgpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgoraW5s
aW5lIGJvb2wgb3BlcmF0b3IhPSAoY29uc3Qgc3RkOjpudWxscHRyX3QsIGNvbnN0IGdkYnB5X2Jv
cnJvd2VkX3JlZjxUPiAmcmhzKQoreworICByZXR1cm4gbnVsbHB0ciAhPSByaHMuZ2V0ICgpOwor
fQorCisjZW5kaWYgLyogR0RCX1BZVEhPTl9QWV9SRUZfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVk
ZS9weXRob24taW50ZXJuYWwuaHBwIGIvaW5jbHVkZS9weXRob24taW50ZXJuYWwuaHBwCm5ldyBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1MWFkNDcKLS0tIC9kZXYvbnVsbAorKysg
Yi9pbmNsdWRlL3B5dGhvbi1pbnRlcm5hbC5ocHAKQEAgLTAsMCArMSwxNCBAQAorI3ByYWdtYSBv
bmNlCisKKyNpbmNsdWRlIDxQeXRob24uaD4KKworI2luY2x1ZGUgImdkYi1vdGhlcnMuaHBwIgor
I2luY2x1ZGUgInB5LXJlZi5ocHAiCisjaW5jbHVkZSAicHktb2JqLWRpY3QuaHBwIgorI2luY2x1
ZGUgInB5LW9iai10eXBlLmhwcCIKKworZXh0ZXJuIGdkYnB5X29iamVjdF90eXBlX3JlZgorZ2Ri
cHlfdHlwZV9pbml0aWFsaXplIChnZGJweV9ib3Jyb3dlZF9yZWY8PiAmbW9kLAorCQkgICAgICAg
UHlUeXBlX1NwZWMgKnNwZWMsCisJCSAgICAgICBQeU9iamVjdCAqYmFzZXMgPSBudWxscHRyLAor
CQkgICAgICAgYm9vbCBkaXNhbGxvd19pbnN0YW50aWF0aW9uID0gZmFsc2UpOwpkaWZmIC0tZ2l0
IGEvaW5jbHVkZS9weXRob24tdHJhaXRzLmhwcCBiL2luY2x1ZGUvcHl0aG9uLXRyYWl0cy5ocHAK
bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFkMzA1MwotLS0gL2Rldi9udWxs
CisrKyBiL2luY2x1ZGUvcHl0aG9uLXRyYWl0cy5ocHAKQEAgLTAsMCArMSw5MyBAQAorLyogVHlw
ZSB0cmFpdHMgcmVsYXRpbmcgdG8gR0RCJ3MgUHl0aG9uIGludGVncmF0aW9uLgorCisgICBDb3B5
cmlnaHQgKEMpIDIwMDgtMjAyNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAg
VGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0
d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIg
dGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQg
YnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2Yg
dGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgor
CisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxs
IGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRo
ZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGlj
ZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBj
b3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlz
IHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAq
LworCisjaWZuZGVmIEdEQl9QWVRIT05fUFlUSE9OX1RSQUlUU19ICisjZGVmaW5lIEdEQl9QWVRI
T05fUFlUSE9OX1RSQUlUU19ICisKK25hbWVzcGFjZSBnZGIKK3sKKy8qIEFsbCBvZiBvdXIgY3Vz
dG9tIFB5dGhvbiB0eXBlcyBhcmUgY3JlYXRlZCBhcyBzdHJ1Y3RzLCBsaWtlIHRoaXM6CisKKyAg
IHN0cnVjdCBzb21lX25ld190eXBlIDogcHVibGljIFB5T2JqZWN0CisgICB7CisgICAgIC4uLiB2
YXJpb3VzIGZpZWxkcyAuLi4KKyAgIH07CisKKyAgIFRoZW4gaW5zdGFuY2VzIG9mIHRoaXMgc3Ry
dWN0IGFyZSBjcmVhdGVkIGJ5IGNhbGxpbmcgUHlPYmplY3RfTmV3LAorICAgZWl0aGVyIGRpcmVj
dGx5IHdpdGhpbiBHREIncyBDKysgY29kZSwgb3Igd2l0aGluIFB5dGhvbiB3aGVuIGEgdXNlcidz
CisgICBQeXRob24gc2NyaXB0IGNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhhdCBjbGFzcy4KKwor
ICAgVGhlIHByb2JsZW0gaXMgdGhhdCBQeXRob24gaXMgd3JpdHRlbiBpbiBDLCBhbmQgUHlPYmpl
Y3RfTmV3IGRvZXNuJ3QKKyAgIGNhbGwgYW55IGNvbnN0cnVjdG9ycyBmb3IgYHNvbWVfbmV3X3R5
cGVgLCBub3IgZm9yIGFueSBvZiB0aGUgZmllbGRzCisgICB3aXRoaW4gYHNvbWVfbmV3X3R5cGVg
LgorCisgICBJZiBgc29tZV9uZXdfdHlwZWAgaXMgUGxhaW4gT2xkIERhdGEgKFBPRCksIHRoZW4g
dGhpcyBpcyBmaW5lLiAgT3IsIHRvCisgICBiZSBtb3JlIEMrKyBzcGVjaWZpYywgaWYgYHNvbWVf
bmV3X3R5cGVgIGlzIHRyaXZpYWxseSBkZWZhdWx0CisgICBjb25zdHJ1Y3RhYmxlLCB0aGVuIHdl
J3JlIGZpbmUuCisKKyAgIEJ1dCBpZiBhIGZpZWxkIHdpdGhpbiBgc29tZV9uZXdfdHlwZWAgaGFz
IGEgbm9uLXRyaXZpYWwgY29uc3RydWN0b3IsCisgICB0aGVuIHdlJ3JlIGluIHRyb3VibGUgYXMg
dGhhdCBjb25zdHJ1Y3RvciB3aWxsIG5ldmVyIGJlIHJ1bi4KKworICAgQW4gZXhhbXBsZSBvZiBh
IHByb2JsZW1hdGljIGZpZWxkIHR5cGUgaXMgZnJhbWVfaW5mb19wdHIuICBUaGUKKyAgIGNvbnN0
cnVjdG9yIGZvciB0aGlzIHR5cGUgcmVnaXN0ZXJzIHRoZSBuZXcgb2JqZWN0IHdpdGggYSBjZW50
cmFsCisgICBtYW5hZ2VtZW50IG9iamVjdCwgcmVjb3JkaW5nIHRoZSBgdGhpc2AgcG9pbnRlciwg
dXNpbmcgdGhpcyB0eXBlIHdpdGhpbgorICAgYHNvbWVfbmV3X3R5cGVgIHdpbGwgbm90IHdvcmsg
YXMgZXhwZWN0ZWQ7IGZyYW1lIGludmFsaWRhdGlvbiB3aWxsIG5vdAorICAgc2hvdyB1cCB3aXRo
aW4gdGhlIGZyYW1lX2luZm9fcHRyIGFzIHlvdSBtaWdodCBleHBlY3QuCisKKyAgIEFuZCBzbywg
dGhpcyB0eXBlIHRyYWl0IGV4aXN0cy4gIFdoZW5ldmVyIGEgc3RydWN0IGlzIGNyZWF0ZWQgdG8g
ZGVmaW5lCisgICBhIG5ldyBQeXRob24gdHlwZSB3ZSBzaG91bGQgYWRkIGEgbGluZSBsaWtlOgor
CisgICAgIHN0YXRpY19hc3NlcnQgKGdkYjo6aXNfcHl0aG9uX2FsbG9jYXRhYmxlX3Y8c29tZV9u
ZXdfdHlwZT4pOworCisgICBUaGlzIHdpbGwgZmFpbCBpZiBhbnkgZmllbGQgb2YgYHNvbWVfbmV3
X3R5cGVgIGlzIHVuc3VpdGFibGUgZm9yIHRoaXMKKyAgIHVzZS4KKworICAgV2UgZG9uJ3QgYWN0
dWFsbHkgY2hlY2sgaXNfdHJpdmlhbGx5X2RlZmF1bHRfY29uc3RydWN0aWJsZSBoZXJlLiAgU29t
ZQorICAgdHlwZXMsIGUuZy4gdWlfZmlsZV9zdHlsZTo6Y29sb3IsIGhhdmUgbm9uLXRyaXZpYWwg
KG9yIG5vIGRlZmF1bHQpCisgICBjb25zdHJ1Y3RvcnMsIGJ1dCBhcmUgc3RpbGwgc2FmZSB0byB1
c2Ugd2l0aGluIGBzb21lX25ld190eXBlYCBiZWNhdXNlCisgICB0aGVpciBjb25zdHJ1Y3RvcnMg
anVzdCBpbml0aWFsaXNlIGRhdGEgZmllbGRzOyB0aGVyZSdzIG5vdGhpbmcKKyAgICJzcGVjaWFs
IiB0aGF0IHRoZSBjb25zdHJ1Y3RvciBkb2VzIHRoYXQgY2Fubm90IGJlIGFjaGlldmVkIGJ5Cisg
ICBhc3NpZ25pbmcgdGhlIGZpZWxkcyBhZnRlciBjcmVhdGlvbiB3aXRoIFB5T2JqZWN0X05ldy4K
KworICAgV2hhdCBhY3R1YWxseSBtYXR0ZXJzIGlzIHRoYXQgdGhlIHR5cGUgaXMgdHJpdmlhbGx5
IGRlc3RydWN0aWJsZQorICAgKFB5dGhvbiB3b24ndCBjYWxsIEMrKyBkZXN0cnVjdG9ycywgc28g
ZGVzdHJ1Y3RvcnMgd2l0aCBzaWRlIGVmZmVjdHMsCisgICBsaWtlIGRlcmVnaXN0ZXJpbmcgZnJv
bSBhIGxpc3QsIHdvdWxkIGJlIHNraXBwZWQpIGFuZCB0cml2aWFsbHkKKyAgIGNvcHlhYmxlIChQ
eXRob24gbWF5IGNvcHkgb2JqZWN0cyB3aXRoIG1lbWNweSkuICBUeXBlcyBsaWtlCisgICBmcmFt
ZV9pbmZvX3B0ciwgd2hvc2UgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycyBoYXZlIHNpZGUg
ZWZmZWN0cworICAgc3VjaCBhcyByZWdpc3RlcmluZyB3aXRoIGEgY2VudHJhbCBtYW5hZ2VtZW50
IG9iamVjdCwgd2lsbCBiZSBjYXVnaHQKKyAgIGJlY2F1c2UgdGhleSBhcmUgbmVpdGhlciB0cml2
aWFsbHkgZGVzdHJ1Y3RpYmxlIG5vciB0cml2aWFsbHkgY29weWFibGUuCisgICBUeXBlcyBsaWtl
IHVpX2ZpbGVfc3R5bGUgYXJlIHRyaXZpYWxseSBkZXN0cnVjdGlibGUgYW5kIGNvcHlhYmxlLCBz
bworICAgcGFzcyB0aGlzIHRyYWl0LiAgKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVj
dCBpc19weXRob25fYWxsb2NhdGFibGUKK3sKKyAgc3RhdGljIGNvbnN0ZXhwciBib29sIHZhbHVl
ID0KKyAgICBzdGQ6OmlzX3RyaXZpYWxseV9kZXN0cnVjdGlibGVfdjxUPgorICAgICYmIHN0ZDo6
aXNfdHJpdmlhbGx5X2NvcHlhYmxlX3Y8VD47Cit9OworCisvKiBIZWxwZXIgZm9yIHRoZSBhYm92
ZSB0cmFpdCB0byBtYWtlIGl0IG1vcmUgdXNhYmxlLiAgKi8KKwordGVtcGxhdGU8dHlwZW5hbWUg
VD4KK2lubGluZSBjb25zdGV4cHIgYm9vbCBpc19weXRob25fYWxsb2NhdGFibGVfdgorICA9IGlz
X3B5dGhvbl9hbGxvY2F0YWJsZTxUPjo6dmFsdWU7Cit9CisKKyNlbmRpZiAvKiBHREJfUFlUSE9O
X1BZVEhPTl9UUkFJVFNfSCAqLwpkaWZmIC0tZ2l0IGEvcHlkYmcuY3BwIGIvcHlkYmcuY3BwCm5l
dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjZmFlMmUKLS0tIC9kZXYvbnVsbAor
KysgYi9weWRiZy5jcHAKQEAgLTAsMCArMSw4MCBAQAorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5j
bHVkZSA8aW9zdHJlYW0+CisKKyNpbmNsdWRlIDxQeXRob24uaD4KKworaW50IG1haW4oaW50IGFy
Z2MsIGNoYXIgKmFyZ3ZbXSwgY2hhciAqZW52cFtdKQoreworICAgIFB5X0luaXRpYWxpemUoKTsK
KworICAgIFB5T2JqZWN0ICpwbW9kdWxlID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlKCJNeU1vZHVs
ZSIpOworICAgIGlmICghcG1vZHVsZSkgeworICAgICAgICBQeUVycl9QcmludCgpOworICAgICAg
ICBzdGQ6OmNlcnIgPDwgIkZhaWxlZCB0byBpbXBvcnQgbW9kdWxlIE15TW9kdWxlIiA8PCBzdGQ6
OmVuZGw7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBQeU9iamVjdCAqY2xhc3NB
ID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhwbW9kdWxlLCAiQSIpOworICAgIGlmICghY2xhc3NB
KSB7CisgICAgICAgIHN0ZDo6Y2VyciA8PCAiVW5hYmxlIHRvIGdldCB0eXBlIEEgZnJvbSBNeU1v
ZHVsZSIgPDwgc3RkOjplbmRsOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgUHlP
YmplY3QgKmNsYXNzQiA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcocG1vZHVsZSwgIkIiKTsKKyAg
ICBpZiAoIWNsYXNzQikgeworICAgICAgICBzdGQ6OmNlcnIgPDwgIlVuYWJsZSB0byBnZXQgdHlw
ZSBCIGZyb20gTXlNb2R1bGUiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgcmV0dXJuIC0xOworICAg
IH0KKworICAgIFB5T2JqZWN0ICpteUFJbnN0YW5jZSA9IFB5T2JqZWN0X0NhbGxPYmplY3QoY2xh
c3NBLCBOVUxMKTsKKyAgICBpZiAoIW15QUluc3RhbmNlKSB7CisgICAgICAgIHN0ZDo6Y2VyciA8
PCAiSW5zdGFudGlvYXRpb24gb2YgTXlDbGFzcyBmYWlsZWQiIDw8IHN0ZDo6ZW5kbDsKKyAgICAg
ICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBQeV9ERUNSRUYobXlBSW5zdGFuY2UpOworCisgICAg
UHlPYmplY3QgKnBHbG9iYWwgPSBQeURpY3RfTmV3KCk7CisgICAgUHlPYmplY3QgKnBWYWx1ZSA9
IFB5UnVuX1N0cmluZygKKyAgICAgICAgImltcG9ydCBNeU1vZHVsZSBhcyBNTVxuIgorICAgICAg
ICAiYiA9IE1NLkIoKVxuIgorICAgICAgICAiYi5mb28gPSAxMjM0XG4iCisgICAgICAgICJwcmlu
dChiLm5hbWUoKSwgYi5pYW1iKCkpXG4iCisgICAgICAgICJcbiIKKyAgICAgICAgImNsYXNzIEMo
TU0uQik6XG4iCisgICAgICAgICIgIHBhc3NcbiIKKyAgICAgICAgImMgPSBDKClcbiIKKyAgICAg
ICAgImMuZm9vID0gMTIzNFxuIgorICAgICAgICAicHJpbnQoZGlyKGMpKVxuIgorICAgICAgICAi
cHJpbnQoYy5uYW1lKCksIGMuaWFtYigpKVxuIgorICAgICAgICAiXG4iCisgICAgICAgICJjbGFz
cyBEKE1NLkEpOlxuIgorICAgICAgICAiICBkZWYgX19pbml0X18oc2VsZik6XG4iCisgICAgICAg
ICIgICAgc3VwZXIoKS5fX2luaXRfXygpXG4iCisgICAgICAgICIgICAgc2VsZi5fY3ljbGUgPSBz
ZWxmXG4iCisgICAgICAgICJcbiIKKyAgICAgICAgImQgPSBEKClcbiIKKyAgICAgICAgImQuZm9v
ID0gMTIzNFxuIgorICAgICAgICAicHJpbnQoZGlyKGQpKVxuIgorICAgICAgICAicHJpbnQoZC5u
YW1lKCksIGQuaWFtYSgpKVxuIgorICAgICAgICAiXG4iCisgICAgICAgICJjbGFzcyBFKE1NLkIp
OlxuIgorICAgICAgICAiICBkZWYgX19pbml0X18oc2VsZik6XG4iCisgICAgICAgICIgICAgc3Vw
ZXIoKS5fX2luaXRfXygpXG4iCisgICAgICAgICIgICAgc2VsZi5fY3ljbGUgPSBzZWxmXG4iCisg
ICAgICAgICJcbiIKKyAgICAgICAgImUgPSBFKClcbiIKKyAgICAgICAgImUuZm9vID0gMTIzNFxu
IgorICAgICAgICAicHJpbnQoZGlyKGUpKVxuIgorICAgICAgICAicHJpbnQoZS5uYW1lKCksIGUu
aWFtYSgpLCBlLmlhbWIoKSlcbiIKKyAgICAgICAgIlxuIgorICAgICAgICAiZiA9IE1NLk9ialdp
dGhBbGxvYygpXG4iCisgICAgICAgICJwcmludCgne30ge30nLmZvcm1hdChmLm5hbWUoKSwgZi53
aG9hbWkoKSkpXG4iCisgICAgICAgICJwcmludChmLnNwZWFrKCkpXG4iCisgICAgICAgICwgUHlf
ZmlsZV9pbnB1dCwgcEdsb2JhbCwgcEdsb2JhbCk7CisgICAgUHlfWERFQ1JFRihwVmFsdWUpOwor
ICAgIFB5X0RFQ1JFRihwR2xvYmFsKTsKKworICAgIFB5X0ZpbmFsaXplKCk7CisKKyAgICByZXR1
cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NyYy9BLmNwcCBiL3NyYy9BLmNwcApuZXcgZmlsZSBtb2Rl
IDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjczOGE1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0Eu
Y3BwCkBAIC0wLDAgKzEsMTEzIEBACisjaW5jbHVkZSAibXlfcHlfbW9kdWxlLmhwcCIKKworbmFt
ZXNwYWNlIHsKKyAgZXh0ZXJuIFB5VHlwZV9TcGVjIEFfb2JqZWN0X3R5cGVfc3BlYzsKK30gLyog
bmFtZXNwYWNlIGFub255bW91cyAqLworCituYW1lc3BhY2UgeworCitzdGF0aWMgaW50CitBX2lu
aXQgKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCit7Cisg
IGF1dG8qIG9iaiA9IChBICopIHNlbGY7CisgIGdkYnB5X2RpY3RfYXR0cl9QeV9BTExPQyAoQSwg
c2VsZik7CisgIG9iai0+bV9hID0gUHlVbmljb2RlX0Zyb21TdHJpbmcgKCJBIik7CisgIHJldHVy
biAwOworfQorCisvKiBUaGUgdHBfdHJhdmVyc2UgY2FsbGJhY2sgZm9yIHRoZSBBIHR5cGUuICAq
Lworc3RhdGljIGludAorQV90cmF2ZXJzZV9pbXBsIChQeU9iamVjdCAqc2VsZiwgdmlzaXRwcm9j
IHZpc2l0LCB2b2lkICphcmcpCit7CisgIGF1dG8gKm9iaiA9IChBICopIHNlbGY7CisgIHByaW50
ZiAoIi0tPiBBX3RyYXZlcnNlX2ltcGxcbiIpOworICBnZGJweV9kaWN0X2F0dHJfUHlfVklTSVQg
KG9iaik7CisgIFB5X1ZJU0lUIChvYmotPm1fYSk7CisgIHJldHVybiAwOworfQorCitzdGF0aWMg
aW50CitBX3RyYXZlcnNlIChQeU9iamVjdCAqc2VsZiwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICph
cmcpCit7CisgIHJldHVybiBnZGJweV9oZWFwX3R5cGU6OnRwX3RyYXZlcnNlIChzZWxmLCB2aXNp
dCwgYXJnLAorCQkJCSAgICAgICBudWxscHRyLCBBX3RyYXZlcnNlX2ltcGwpOworfQorCisvKiBU
aGUgdHBfY2xlYXIgY2FsbGJhY2sgZm9yIHRoZSBBIHR5cGUuICAqLworCitzdGF0aWMgdm9pZAor
QV9jbGVhcl9pbXBsIChQeU9iamVjdCAqc2VsZikKK3sKKyAgYXV0byAqb2JqID0gKEEgKikgc2Vs
ZjsKKyAgcHJpbnRmICgiLS0+IEFfY2xlYXJfaW1wbFxuIik7CisgIGdkYnB5X2RpY3RfYXR0cl9Q
eV9DTEVBUiAob2JqKTsKKyAgUHlfQ0xFQVIgKG9iai0+bV9hKTsKK30KKworc3RhdGljIHZvaWQK
K0FfY2xlYXIgKFB5T2JqZWN0ICpzZWxmKQoreworICByZXR1cm4gZ2RicHlfaGVhcF90eXBlOjp0
cF9jbGVhciAoc2VsZiwgbnVsbHB0ciwgQV9jbGVhcl9pbXBsKTsKK30KKworUHlPYmplY3QgKgor
QV9uYW1lIChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisgIGF1dG8gKm9iaiA9
IChBICopIHNlbGY7CisgIFB5X0lOQ1JFRiAob2JqLT5tX2EpOworICByZXR1cm4gb2JqLT5tX2E7
Cit9CisKK1B5T2JqZWN0ICoKK0FfaWFtYSAoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdz
KQoreworICBhdXRvICpvYmogPSAoQSAqKSBzZWxmOworICByZXR1cm4gUHlVbmljb2RlX0Zyb21G
b3JtYXQgKCJIZWxsbyBJIGFtICVVIiwgb2JqLT5tX2EpOworfQorCitnZGJfUHlHZXRTZXREZWYg
QV9vYmplY3RfZ2V0c2V0W10gPQoreworICBnZGJweV9kaWN0X2F0dHJfZ2V0dGVyIChBLCAiQSIp
LAorICB7IG51bGxwdHIgfSAvKiBTZW50aW5lbCAqLworfTsKKworUHlNZXRob2REZWYgQV9vYmpl
Y3RfbWV0aG9kcyBbXSA9IHsKKyAgeyAibmFtZSIsIEFfbmFtZSwgTUVUSF9OT0FSR1MsCisgICAg
Im5hbWUgKCkgLT4gU3RyaW5nLlxuXAorUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyBhcyBh
IHN0cmluZyB2YWx1ZS4iIH0sCisgIHsgImlhbWEiLCBBX2lhbWEsIE1FVEhfTk9BUkdTLAorICAg
ICJpYW1hICgpIC0+IFN0cmluZy5cblwKK1JldHVybiB0aGUgb2JqZWN0J3MgZ3JlZXRpbmcgYXMg
YSBzdHJpbmcgdmFsdWUuIiB9LAorICB7bnVsbHB0cn0gLyogU2VudGluZWwgKi8KK307CisKK1B5
VHlwZV9TbG90IEFfb2JqZWN0X3R5cGVfc2xvdFtdID0geworICB7UHlfdHBfZG9jLCAgICAgY29u
c3RfY2FzdDxjaGFyICo+KCJBIG9iamVjdCIpfSwKKyAgZ2RicHlfaGVhcF90eXBlX21ldGhvZHMg
KEFfdHJhdmVyc2UsIEFfY2xlYXIpLAorICBnZGJweV9kaWN0X2F0dHJfUHlUeXBlX1Nsb3RzIChB
KSwKKyAge1B5X3RwX2luaXQsICh2b2lkKikgQV9pbml0fSwKKyAge1B5X3RwX21ldGhvZHMsIEFf
b2JqZWN0X21ldGhvZHN9LAorICB7UHlfdHBfZ2V0c2V0LCAgQV9vYmplY3RfZ2V0c2V0fSwKKyAg
ezAsIG51bGxwdHJ9LCAvKiBTZW50aW5lbCAqLworfTsKKworUHlUeXBlX1NwZWMgQV9vYmplY3Rf
dHlwZV9zcGVjID0geworICAiTXlNb2R1bGUuQSIsIC8qIHRwX25hbWUgKi8KKyAgc2l6ZW9mIChB
KSwgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgMCwgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAq
LworICBnZGJweV9oZWFwX3R5cGU6OnRwX2ZsYWdzX2RlZmF1bHQgKCkKKyAgfCBQeV9UUEZMQUdT
X0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICBBX29iamVjdF90eXBlX3Nsb3QsCit9OworCit9
IC8vIG5hbWVzcGFjZSBhbm9ueW1vdXMKKworZ2RicHlfb2JqZWN0X3R5cGVfcmVmCitBOjpyZWNv
cmRfY2xhc3MgKGdkYnB5X2JvcnJvd2VkX3JlZjw+IG1vZHVsZSwKKwkJIGdkYnB5X29iamVjdF90
eXBlX2JyZWYgYmFzZV9jbGFzcyBBVFRSSUJVVEVfVU5VU0VEKQoreworICBnZGJweV9vYmplY3Rf
dHlwZV9yZWYgb2JqX3R5cGUKKyAgICA9IGdkYnB5X3R5cGVfaW5pdGlhbGl6ZSAobW9kdWxlLAor
CQkJICAgICAmQV9vYmplY3RfdHlwZV9zcGVjKTsKKyAgcmV0dXJuIG9ial90eXBlOworfQpkaWZm
IC0tZ2l0IGEvc3JjL0IuY3BwIGIvc3JjL0IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4
IDAwMDAwMDAuLjRkZmQzYTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvQi5jcHAKQEAgLTAsMCAr
MSwxMTYgQEAKKyNpbmNsdWRlICJteV9weV9tb2R1bGUuaHBwIgorCituYW1lc3BhY2UgeworICBl
eHRlcm4gUHlUeXBlX1NwZWMgQl9vYmplY3RfdHlwZV9zcGVjOworICBnZGJweV9vYmplY3RfdHlw
ZV9icmVmIEJfYmFzZV90eXBlID0gbnVsbHB0cjsKK30gLyogbmFtZXNwYWNlIGFub255bW91cyAq
LworCituYW1lc3BhY2UgeworCitzdGF0aWMgaW50CitCX2luaXQoUHlPYmplY3QgKnNlbGYsIFB5
T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKK3sKKyAgYXV0byogb2JqID0gKEIgKikgc2Vs
ZjsKKworICAvKiBzdXBlcigpLl9faW5pdF9fKCphcmdzLCAqKmt3YXJncykgKi8KKyAgaW5pdHBy
b2MgYmFzZV9mdW5jX2luaXQgPSAoaW5pdHByb2MpIEJfYmFzZV90eXBlLnNsb3QgKFB5X3RwX2lu
aXQpOworICBnZGJfYXNzZXJ0IChiYXNlX2Z1bmNfaW5pdCAhPSBudWxscHRyKTsKKyAgaWYgKGJh
c2VfZnVuY19pbml0IChzZWxmLCBhcmdzLCBrd2RzKSAhPSAwKQorICAgIHJldHVybiAtMTsKKwor
ICBvYmotPm1fYiA9IFB5VW5pY29kZV9Gcm9tU3RyaW5nICgiQiIpOworICByZXR1cm4gMDsKK30K
KworLyogVGhlIHRwX3RyYXZlcnNlIGNhbGxiYWNrIGZvciB0aGUgQSB0eXBlLiAgKi8KK3N0YXRp
YyBpbnQKK0JfdHJhdmVyc2VfaW1wbCAoUHlPYmplY3QgKnNlbGYsIHZpc2l0cHJvYyB2aXNpdCwg
dm9pZCAqYXJnKQoreworICBhdXRvICpvYmogPSAoQiAqKSBzZWxmOworICBwcmludGYgKCItLT4g
Ql90cmF2ZXJzZV9pbXBsXG4iKTsKKyAgUHlfVklTSVQgKG9iai0+bV9iKTsKKyAgcmV0dXJuIDA7
Cit9CisKK3N0YXRpYyBpbnQKK0JfdHJhdmVyc2UoUHlPYmplY3QgKnNlbGYsIHZpc2l0cHJvYyB2
aXNpdCwgdm9pZCAqYXJnKQoreworICByZXR1cm4gZ2RicHlfaGVhcF90eXBlOjp0cF90cmF2ZXJz
ZShzZWxmLCB2aXNpdCwgYXJnLAorCQkJCSAgICAgIEJfYmFzZV90eXBlLCBCX3RyYXZlcnNlX2lt
cGwpOworfQorCisvKiBUaGUgdHBfY2xlYXIgY2FsbGJhY2sgZm9yIHRoZSBBIHR5cGUuICAqLwor
CitzdGF0aWMgdm9pZAorQl9jbGVhcl9pbXBsIChQeU9iamVjdCAqc2VsZikKK3sKKyAgYXV0byAq
b2JqID0gKEIgKikgc2VsZjsKKyAgcHJpbnRmICgiLS0+IEJfY2xlYXJfaW1wbFxuIik7CisgIFB5
X0NMRUFSIChvYmotPm1fYik7Cit9CisKK3N0YXRpYyB2b2lkCitCX2NsZWFyIChQeU9iamVjdCAq
c2VsZikKK3sKKyAgZ2RicHlfaGVhcF90eXBlOjp0cF9jbGVhcihzZWxmLCBCX2Jhc2VfdHlwZSwg
Ql9jbGVhcl9pbXBsKTsKK30KKworUHlPYmplY3QgKgorQl9uYW1lIChQeU9iamVjdCAqc2VsZiwg
UHlPYmplY3QgKmFyZ3MpCit7CisgIGF1dG8gKm9iaiA9IChCICopIHNlbGY7CisgIGdkYl9hc3Nl
cnQgKG9iai0+bV9iICE9IG51bGxwdHIpOworICBQeV9JTkNSRUYgKG9iai0+bV9iKTsKKyAgcmV0
dXJuIG9iai0+bV9iOworfQorCitQeU9iamVjdCAqCitCX2lhbWIgKFB5T2JqZWN0ICpzZWxmLCBQ
eU9iamVjdCAqYXJncykKK3sKKyAgYXV0byAqb2JqID0gKEIgKikgc2VsZjsKKyAgZ2RiX2Fzc2Vy
dCAob2JqLT5tX2EgIT0gbnVsbHB0cik7CisgIGdkYl9hc3NlcnQgKG9iai0+bV9iICE9IG51bGxw
dHIpOworICByZXR1cm4gUHlVbmljb2RlX0Zyb21Gb3JtYXQgKCJIZWxsbyBJIGFtIGJvdGggJVUg
YW5kICVVIiwgb2JqLT5tX2EsIG9iai0+bV9iKTsKK30KKworUHlNZXRob2REZWYgQl9vYmplY3Rf
bWV0aG9kcyBbXSA9IHsKKyAgeyAibmFtZSIsIEJfbmFtZSwgTUVUSF9OT0FSR1MsCisgICAgIm5h
bWUgKCkgLT4gU3RyaW5nLlxuXAorUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyBhcyBhIHN0
cmluZyB2YWx1ZS4iIH0sCisgIHsgImlhbWIiLCBCX2lhbWIsIE1FVEhfTk9BUkdTLAorICAgICJp
YW1iICgpIC0+IFN0cmluZy5cblwKK1JldHVybiB0aGUgb2JqZWN0J3MgZ3JlZXRpbmcgYXMgYSBz
dHJpbmcgdmFsdWUuIiB9LAorICB7bnVsbHB0cn0gLyogU2VudGluZWwgKi8KK307CisKK1B5VHlw
ZV9TbG90IEJfb2JqZWN0X3R5cGVfc2xvdFtdID0geworICB7UHlfdHBfZG9jLCAgICAgY29uc3Rf
Y2FzdDxjaGFyICo+KCJCIG9iamVjdCIpfSwKKyAgZ2RicHlfaGVhcF90eXBlX21ldGhvZHMgKEJf
dHJhdmVyc2UsIEJfY2xlYXIpLAorICB7UHlfdHBfaW5pdCwgKHZvaWQqKSBCX2luaXR9LAorICB7
UHlfdHBfbWV0aG9kcywgQl9vYmplY3RfbWV0aG9kc30sCisgIHswLCBudWxscHRyfSwgLyogU2Vu
dGluZWwgKi8KK307CisKK1B5VHlwZV9TcGVjIEJfb2JqZWN0X3R5cGVfc3BlYyA9IHsKKyAgIk15
TW9kdWxlLkIiLCAvKiB0cF9uYW1lICovCisgIHNpemVvZiAoQiksICAgLyogdHBfYmFzaWNzaXpl
ICovCisgIDAsICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgZ2RicHlfaGVhcF90eXBl
Ojp0cF9mbGFnc19kZWZhdWx0ICgpCisgIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxh
Z3MgKi8KKyAgQl9vYmplY3RfdHlwZV9zbG90LAorfTsKKworfSAvLyBuYW1lc3BhY2UgYW5vbnlt
b3VzCisKK2dkYnB5X29iamVjdF90eXBlX3JlZgorQjo6cmVjb3JkX2NsYXNzIChnZGJweV9ib3Jy
b3dlZF9yZWY8PiBtb2R1bGUsCisJCSBnZGJweV9vYmplY3RfdHlwZV9icmVmIEFfYmFzZV9jbGFz
cykKK3sKKyAgQl9iYXNlX3R5cGUgPSBBX2Jhc2VfY2xhc3M7CisKKyAgZ2RicHlfb2JqZWN0X3R5
cGVfcmVmIG9ial90eXBlCisgICAgPSBnZGJweV90eXBlX2luaXRpYWxpemUgKG1vZHVsZSwKKwkJ
CSAgICAgJkJfb2JqZWN0X3R5cGVfc3BlYywKKwkJCSAgICAgQV9iYXNlX2NsYXNzLmdldCAoKSk7
CisgIHJldHVybiBvYmpfdHlwZTsKK30KZGlmZiAtLWdpdCBhL3NyYy9PYmpXaXRoQWxsb2MuY3Bw
IGIvc3JjL09ialdpdGhBbGxvYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw
MC4uZWQwYjM3NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9PYmpXaXRoQWxsb2MuY3BwCkBAIC0w
LDAgKzEsMTQwIEBACisjaW5jbHVkZSAibXlfcHlfbW9kdWxlLmhwcCIKKworbmFtZXNwYWNlIHsK
KyAgZXh0ZXJuIFB5VHlwZV9TcGVjIE9ialdpdGhBbGxvY19vYmplY3RfdHlwZV9zcGVjOworICBn
ZGJweV9vYmplY3RfdHlwZV9icmVmIE9ialdpdGhBbGxvY19vYmplY3RfdHlwZTsKK30gLyogbmFt
ZXNwYWNlIGFub255bW91cyAqLworCituYW1lc3BhY2UgeworCitzdGF0aWMgUHlPYmplY3QgKgor
T2JqV2l0aEFsbG9jX2FsbG9jICgpCit7CisgIGdkYnB5X2hlYXBfdHlwZV9hbGxvY2F0ZV9vcl9i
YWlsb3V0CisgICAgKG15X25ld19vYmosIE9ialdpdGhBbGxvYywgT2JqV2l0aEFsbG9jX29iamVj
dF90eXBlKTsKKworICBteV9uZXdfb2JqLT5tc2cgPSBuZXcgc3RkOjpzdHJpbmcgKAorICAgICJO
ZXF1ZSBwb3JybyBxdWlzcXVhbSBlc3QgcXVpIGRvbG9yZW0gaXBzdW0gcXVpYSBkb2xvciBzaXQg
YW1ldCwgIgorICAgICJjb25zZWN0ZXR1ciwgYWRpcGlzY2kgdmVsaXQuLi4iKTsKKworICBteV9u
ZXdfb2JqLT5tX25hbWUgPSBQeVVuaWNvZGVfRnJvbVN0cmluZyAoIk9ialdpdGhBbGxvYyIpOwor
CisgIG15X25ld19vYmotPnNlbGZfY3ljbGUgPSBteV9uZXdfb2JqLnN0cm9uZ19yZWYgKCkucmVs
ZWFzZSAoKTsKKworICAvKiBUaGlzIGlzIG9ubHkgYW4gZXhhbXBsZSB0byBpbGx1c3RyYXRlIHRo
ZSB1c2FnZSBvZiBiYWlsb3V0KCkuICAqLworICBpZiAoKm15X25ld19vYmotPm1zZyA9PSAiaGVs
bG8gd29ybGQgISIpCisgICAgeworICAgICAgZGVsZXRlIG15X25ld19vYmotPm1zZzsKKyAgICAg
IFB5X1hERUNSRUYgKG15X25ld19vYmotPm1fbmFtZSk7CisgICAgICBQeV9YREVDUkVGIChteV9u
ZXdfb2JqLT5zZWxmX2N5Y2xlKTsKKyAgICAgIHJldHVybiBteV9uZXdfb2JqLmJhaWxvdXQgKCk7
CisgICAgfQorICByZXR1cm4gbXlfbmV3X29iai50cmFjayAoKS5yZWxlYXNlICgpOworfQorCisv
KiBUaGUgdHBfdHJhdmVyc2UgY2FsbGJhY2sgZm9yIHRoZSBBIHR5cGUuICAqLworc3RhdGljIGlu
dAorT2JqV2l0aEFsbG9jX3RyYXZlcnNlX2ltcGwgKFB5T2JqZWN0ICpzZWxmLCB2aXNpdHByb2Mg
dmlzaXQsIHZvaWQgKmFyZykKK3sKKyAgYXV0byAqb2JqID0gKE9ialdpdGhBbGxvYyAqKSBzZWxm
OworICBwcmludGYgKCItLT4gT2JqV2l0aEFsbG9jX3RyYXZlcnNlX2ltcGxcbiIpOworICBQeV9W
SVNJVCAob2JqLT5tX25hbWUpOworICBQeV9WSVNJVCAob2JqLT5zZWxmX2N5Y2xlKTsKKyAgcmV0
dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK09ialdpdGhBbGxvY190cmF2ZXJzZSAoUHlPYmplY3Qg
KnNlbGYsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQoreworICByZXR1cm4gZ2RicHlfaGVh
cF90eXBlOjp0cF90cmF2ZXJzZSAoc2VsZiwgdmlzaXQsIGFyZywKKwkJCQkgICAgICAgbnVsbHB0
ciwgT2JqV2l0aEFsbG9jX3RyYXZlcnNlX2ltcGwpOworfQorCisvKiBUaGUgdHBfY2xlYXIgY2Fs
bGJhY2sgZm9yIHRoZSBBIHR5cGUuICAqLworCitzdGF0aWMgdm9pZAorT2JqV2l0aEFsbG9jX2Ns
ZWFyX2ltcGwgKFB5T2JqZWN0ICpzZWxmKQoreworICBhdXRvICpvYmogPSAoT2JqV2l0aEFsbG9j
ICopIHNlbGY7CisgIHByaW50ZiAoIi0tPiBPYmpXaXRoQWxsb2NfY2xlYXJfaW1wbFxuIik7Cisg
IFB5X0NMRUFSIChvYmotPm1fbmFtZSk7CisgIFB5X0NMRUFSIChvYmotPnNlbGZfY3ljbGUpOwor
ICBpZiAob2JqLT5tc2cgIT0gbnVsbHB0cikKKyAgICB7CisgICAgICBkZWxldGUgb2JqLT5tc2c7
CisgICAgICBvYmotPm1zZyA9IG51bGxwdHI7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorT2Jq
V2l0aEFsbG9jX2NsZWFyIChQeU9iamVjdCAqc2VsZikKK3sKKyAgcmV0dXJuIGdkYnB5X2hlYXBf
dHlwZTo6dHBfY2xlYXIgKHNlbGYsIG51bGxwdHIsIE9ialdpdGhBbGxvY19jbGVhcl9pbXBsKTsK
K30KKworUHlPYmplY3QgKgorT2JqV2l0aEFsbG9jX25hbWUgKFB5T2JqZWN0ICpzZWxmLCBQeU9i
amVjdCAqYXJncykKK3sKKyAgYXV0byAqb2JqID0gKE9ialdpdGhBbGxvYyAqKSBzZWxmOworICBQ
eV9JTkNSRUYgKG9iai0+bV9uYW1lKTsKKyAgcmV0dXJuIG9iai0+bV9uYW1lOworfQorCitQeU9i
amVjdCAqCitPYmpXaXRoQWxsb2Nfd2hvYW1pIChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFy
Z3MpCit7CisgIGF1dG8gKm9iaiA9IChPYmpXaXRoQWxsb2MgKikgc2VsZjsKKyAgcmV0dXJuIFB5
VW5pY29kZV9Gcm9tRm9ybWF0ICgiSGVsbG8gSSBhbSAlVSIsIG9iai0+bV9uYW1lKTsKK30KKwor
UHlPYmplY3QgKgorT2JqV2l0aEFsbG9jX3NwZWFrIChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3Qg
KmFyZ3MpCit7CisgIGF1dG8gKm9iaiA9IChPYmpXaXRoQWxsb2MgKikgc2VsZjsKKyAgcmV0dXJu
IFB5VW5pY29kZV9Gcm9tRm9ybWF0ICgiSSwgJVUsICVzIiwgb2JqLT5tX25hbWUsIG9iai0+bXNn
LT5jX3N0ciAoKSk7Cit9CisKK1B5TWV0aG9kRGVmIE9ialdpdGhBbGxvY19vYmplY3RfbWV0aG9k
cyBbXSA9IHsKKyAgeyAibmFtZSIsIE9ialdpdGhBbGxvY19uYW1lLCBNRVRIX05PQVJHUywKKyAg
ICAibmFtZSAoKSAtPiBTdHJpbmcuXG5cCitSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGNsYXNzIGFz
IGEgc3RyaW5nIHZhbHVlLiIgfSwKKyAgeyAid2hvYW1pIiwgT2JqV2l0aEFsbG9jX3dob2FtaSwg
TUVUSF9OT0FSR1MsCisgICAgIndob2FtaSAoKSAtPiBTdHJpbmcuXG5cCitSZXR1cm4gdGhlIG9i
amVjdCdzIGdyZWV0aW5nIGFzIGEgc3RyaW5nIHZhbHVlLiIgfSwKKyAgeyAic3BlYWsiLCBPYmpX
aXRoQWxsb2Nfc3BlYWssIE1FVEhfTk9BUkdTLAorICAgICJzcGVhayAoKSAtPiBTdHJpbmcuXG5c
CitSZXR1cm4gdGhlIG9iamVjdCdzIHNwZWVjaCBhcyBhIHN0cmluZyB2YWx1ZS4iIH0sCisgIHtu
dWxscHRyfSAvKiBTZW50aW5lbCAqLworfTsKKworUHlUeXBlX1Nsb3QgT2JqV2l0aEFsbG9jX29i
amVjdF90eXBlX3Nsb3RbXSA9IHsKKyAge1B5X3RwX2RvYywgICAgIGNvbnN0X2Nhc3Q8Y2hhciAq
PigiT2JqV2l0aEFsbG9jIG9iamVjdCIpfSwKKyAgZ2RicHlfaGVhcF90eXBlX21ldGhvZHMgKE9i
aldpdGhBbGxvY190cmF2ZXJzZSwgT2JqV2l0aEFsbG9jX2NsZWFyKSwKKyAge1B5X3RwX2FsbG9j
LCAgICh2b2lkKikgT2JqV2l0aEFsbG9jX2FsbG9jfSwKKyAge1B5X3RwX21ldGhvZHMsIE9ialdp
dGhBbGxvY19vYmplY3RfbWV0aG9kc30sCisgIHswLCBudWxscHRyfSwgLyogU2VudGluZWwgKi8K
K307CisKK1B5VHlwZV9TcGVjIE9ialdpdGhBbGxvY19vYmplY3RfdHlwZV9zcGVjID0geworICAi
TXlNb2R1bGUuT2JqV2l0aEFsbG9jIiwgLyogdHBfbmFtZSAqLworICBzaXplb2YgKE9ialdpdGhB
bGxvYyksICAgLyogdHBfYmFzaWNzaXplICovCisgIDAsICAgICAgICAgICAgLyogdHBfaXRlbXNp
emUgKi8KKyAgZ2RicHlfaGVhcF90eXBlOjp0cF9mbGFnc19kZWZhdWx0ICgpCisgIHwgUHlfVFBG
TEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgT2JqV2l0aEFsbG9jX29iamVjdF90eXBl
X3Nsb3QsCit9OworCit9IC8vIG5hbWVzcGFjZSBhbm9ueW1vdXMKKworZ2RicHlfb2JqZWN0X3R5
cGVfcmVmCitPYmpXaXRoQWxsb2M6OnJlY29yZF9jbGFzcworICAoZ2RicHlfYm9ycm93ZWRfcmVm
PD4gbW9kdWxlLAorICAgZ2RicHlfb2JqZWN0X3R5cGVfYnJlZiBiYXNlX2NsYXNzIEFUVFJJQlVU
RV9VTlVTRUQpCit7CisgIGdkYnB5X29iamVjdF90eXBlX3JlZiBvYmpfdHlwZQorICAgID0gZ2Ri
cHlfdHlwZV9pbml0aWFsaXplIChtb2R1bGUsCisJCQkgICAgICZPYmpXaXRoQWxsb2Nfb2JqZWN0
X3R5cGVfc3BlYyk7CisKKyAgT2JqV2l0aEFsbG9jX29iamVjdF90eXBlID0gb2JqX3R5cGU7Cisg
IHJldHVybiBvYmpfdHlwZTsKK30KZGlmZiAtLWdpdCBhL3NyYy9nZGItb3RoZXJzLmNwcCBiL3Ny
Yy9nZGItb3RoZXJzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGU1
MWQxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dkYi1vdGhlcnMuY3BwCkBAIC0wLDAgKzEsMzEg
QEAKKyNpbmNsdWRlICJnZGItb3RoZXJzLmhwcCIKKworI2RlZmluZSBUT09MTkFNRSAiR0RCIgor
CisjaW5jbHVkZSA8Y3N0ZGFyZz4KKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPGNzdGRp
bz4KKworZXh0ZXJuICJDIiB7CisKK1tbbm9yZXR1cm5dXSBzdGF0aWMgdm9pZAoraW50ZXJuYWxf
dmVycm9yIChjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgY29uc3QgY2hhciAqZm10LCB2YV9s
aXN0IGFyZ3MpCit7CisgIGZwcmludGYgKHN0ZGVyciwgICJcCislczolZDogQSBwcm9ibGVtIGlu
dGVybmFsIHRvICIgVE9PTE5BTUUgIiBoYXMgYmVlbiBkZXRlY3RlZC5cbiIsIGZpbGUsIGxpbmUp
OworICB2ZnByaW50ZiAoc3RkZXJyLCBmbXQsIGFyZ3MpOworICBmcHJpbnRmIChzdGRlcnIsICJc
biIpOworICBhYm9ydCAoKTsKK30KKwordm9pZAoraW50ZXJuYWxfZXJyb3JfbG9jIChjb25zdCBj
aGFyICpmaWxlLCBpbnQgbGluZSwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisgIHZhX2xpc3Qg
YXA7CisKKyAgdmFfc3RhcnQgKGFwLCBmbXQpOworICBpbnRlcm5hbF92ZXJyb3IgKGZpbGUsIGxp
bmUsIGZtdCwgYXApOworICB2YV9lbmQgKGFwKTsKK30KKworfQpkaWZmIC0tZ2l0IGEvc3JjL215
X3B5X21vZHVsZS5jcHAgYi9zcmMvbXlfcHlfbW9kdWxlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCAwMDAwMDAwLi5lZGI2MmNjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL215X3B5X21v
ZHVsZS5jcHAKQEAgLTAsMCArMSwyOSBAQAorI2luY2x1ZGUgPFB5dGhvbi5oPgorCisjaW5jbHVk
ZSAibXlfcHlfbW9kdWxlLmhwcCIKKworbmFtZXNwYWNlIHsKKworLy8gQSBzdHJ1Y3QgY29udGFp
bnMgdGhlIGRlZmluaXRpb24gb2YgYSBtb2R1bGUKK1B5TW9kdWxlRGVmIG15X21vZHVsZSA9IHsK
KyAgUHlNb2R1bGVEZWZfSEVBRF9JTklULAorICAiTXlNb2R1bGUiLAorICAiVGhpcyBpcyBNeU1v
ZHVsZSdzIGRvY3N0cmluZyIsCisgIC0xLCAgIC8vIE9wdGlvbmFsIHNpemUgb2YgdGhlIG1vZHVs
ZSBzdGF0ZSBtZW1vcnkKKyAgTlVMTCwgLy8gT3B0aW9uYWwgbW9kdWxlIG1ldGhvZHMKKyAgTlVM
TCwgLy8gT3B0aW9uYWwgc2xvdCBkZWZpbml0aW9ucworICBOVUxMLCAvLyBPcHRpb25hbCB0cmF2
ZXJzYWwgZnVuY3Rpb24KKyAgTlVMTCwgLy8gT3B0aW9uYWwgY2xlYXIgZnVuY3Rpb24KKyAgTlVM
TCAgLy8gT3B0aW9uYWwgbW9kdWxlIGRlYWxsb2NhdGlvbiBmdW5jdGlvbgorfTsKKworfSAvLyBu
YW1lc3BhY2UgYW5vbnltb3VzCisKK1B5TU9ESU5JVF9GVU5DCitQeUluaXRfTXlNb2R1bGUodm9p
ZCkgeworICBnZGJweV9ib3Jyb3dlZF9yZWY8PiBtb2R1bGUgPSBQeU1vZHVsZV9DcmVhdGUoJm15
X21vZHVsZSk7CisgIGF1dG8gQV9vYmplY3RfdHlwZSA9IEE6OnJlY29yZF9jbGFzcyAobW9kdWxl
KTsKKyAgYXV0byBCX29iamVjdF90eXBlID0gQjo6cmVjb3JkX2NsYXNzIChtb2R1bGUsIEFfb2Jq
ZWN0X3R5cGUpOworICBhdXRvIE9ialdpdGhBbGxvY19vYmplY3RfdHlwZSA9IE9ialdpdGhBbGxv
Yzo6cmVjb3JkX2NsYXNzIChtb2R1bGUpOworICByZXR1cm4gbW9kdWxlOworfQpkaWZmIC0tZ2l0
IGEvc3JjL215X3B5X21vZHVsZS5ocHAgYi9zcmMvbXlfcHlfbW9kdWxlLmhwcApuZXcgZmlsZSBt
b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmMxNzNmCi0tLSAvZGV2L251bGwKKysrIGIvc3Jj
L215X3B5X21vZHVsZS5ocHAKQEAgLTAsMCArMSw0NSBAQAorI3ByYWdtYSBvbmNlCisKKyNpbmNs
dWRlICJweXRob24taW50ZXJuYWwuaHBwIgorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUg
PHN0cmluZ192aWV3PgorCitzdHJ1Y3QgQTogcHVibGljIFB5T2JqZWN0Cit7CisgIC8qIERpY3Rp
b25hcnkgaG9sZGluZyB1c2VyLWFkZGVkIGF0dHJpYnV0ZXMuCisgICAgIFRoaXMgaXMgdGhlIF9f
ZGljdF9fIGF0dHJpYnV0ZSBvZiB0aGUgb2JqZWN0LiAgKi8KKyAgR0RCUFlPQkpFQ1RfRElDVF9B
VFRSIChBKTsKKworICBQeU9iamVjdCAqbV9hOworCisgIHN0YXRpYyBnZGJweV9vYmplY3RfdHlw
ZV9yZWYKKyAgcmVjb3JkX2NsYXNzIChnZGJweV9ib3Jyb3dlZF9yZWY8PiBtb2R1bGUsCisgICAg
ICAgICAgICAgICAgZ2RicHlfb2JqZWN0X3R5cGVfYnJlZiBiYXNlX2NsYXNzID0gbnVsbHB0cik7
Cit9OworCitzdGF0aWNfYXNzZXJ0IChnZGI6OmlzX3B5dGhvbl9hbGxvY2F0YWJsZV92PEE+KTsK
Kworc3RydWN0IEI6IHB1YmxpYyBBCit7CisgIFB5T2JqZWN0ICptX2I7CisKKyAgc3RhdGljIGdk
YnB5X29iamVjdF90eXBlX3JlZgorICByZWNvcmRfY2xhc3MgKGdkYnB5X2JvcnJvd2VkX3JlZjw+
IG1vZHVsZSwKKyAgICAgICAgICAgICAgICBnZGJweV9vYmplY3RfdHlwZV9icmVmIGJhc2VfY2xh
c3MgPSBudWxscHRyKTsKK307CisKK3N0YXRpY19hc3NlcnQgKGdkYjo6aXNfcHl0aG9uX2FsbG9j
YXRhYmxlX3Y8Qj4pOworCitzdHJ1Y3QgT2JqV2l0aEFsbG9jOiBwdWJsaWMgUHlPYmplY3QKK3sK
KyAgY29uc3Qgc3RkOjpzdHJpbmcgKm1zZzsKKyAgUHlPYmplY3QgKm1fbmFtZTsKKyAgUHlPYmpl
Y3QgKnNlbGZfY3ljbGU7CisKKyAgc3RhdGljIGdkYnB5X29iamVjdF90eXBlX3JlZgorICByZWNv
cmRfY2xhc3MgKGdkYnB5X2JvcnJvd2VkX3JlZjw+IG1vZHVsZSwKKyAgICAgICAgICAgICAgICBn
ZGJweV9vYmplY3RfdHlwZV9icmVmIGJhc2VfY2xhc3MgPSBudWxscHRyKTsKK307CisKK3N0YXRp
Y19hc3NlcnQgKGdkYjo6aXNfcHl0aG9uX2FsbG9jYXRhYmxlX3Y8T2JqV2l0aEFsbG9jPik7CmRp
ZmYgLS1naXQgYS9zcmMvcHktb2JqLXR5cGUuY3BwIGIvc3JjL3B5LW9iai10eXBlLmNwcApuZXcg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWRkMTA4Ci0tLSAvZGV2L251bGwKKysr
IGIvc3JjL3B5LW9iai10eXBlLmNwcApAQCAtMCwwICsxLDgwIEBACisvKiBIZWxwZXJzIHJlbGF0
ZWQgdG8gUHl0aG9uIG9iamVjdCB0eXBlCisKKyAgIENvcHlyaWdodCAoQykgMjAyNiBGcmVlIFNv
ZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgor
CisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUg
aXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJh
bCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZv
dW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91
ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJp
YnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VU
IEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBN
RVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUg
dGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisg
ICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJs
aWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0
cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisjaW5jbHVkZSAicHl0aG9uLWludGVy
bmFsLmhwcCIKKyNpbmNsdWRlICJweS1vYmotdHlwZS5ocHAiCisKKy8qIFJldHVybiB0aGUgdHlw
ZSdzIGZ1bGx5IHF1YWxpZmllZCBuYW1lIGZyb20gYSBQeVR5cGVPYmplY3QuICAqLworc3RkOjpz
dHJpbmcKK2dkYl9weV90cF9uYW1lIChQeVR5cGVPYmplY3QgKnB5X3R5cGUpIG5vZXhjZXB0Cit7
CisgIGF1dG8gcHlvYmpfdG9fc3RyID0gW10oUHlPYmplY3QgKm5hbWUpIC0+IHN0ZDo6c3RyaW5n
CisgIHsKKyAgICBjb25zdCBjaGFyICpzID0gUHlVbmljb2RlX0FzVVRGOEFuZFNpemUgKG5hbWUs
IG51bGxwdHIpOworICAgIHJldHVybiAocyA9PSBudWxscHRyKSA/ICIiIDogczsKKyAgfTsKKwor
I2lmIFBZX1ZFUlNJT05fSEVYID49IDB4MDMwZDAwMDAKKyAgLyogTm90ZTogUHlUeXBlX0dldEZ1
bGx5UXVhbGlmaWVkTmFtZSgpIHdhcyBhZGRlZCBpbiB2ZXJzaW9uIDMuMTMsIGFuZCBpcworICAg
ICBwYXJ0IG9mIHRoZSBzdGFibGUgQUJJIHNpbmNlIHZlcnNpb24gMy4xMy4gICovCisgIGdkYnB5
X3JlZjw+IGZ1bGx5X3F1YWxpZmllZF9uYW1lIChQeVR5cGVfR2V0RnVsbHlRdWFsaWZpZWROYW1l
IChweV90eXBlKSk7CisgIGlmIChmdWxseV9xdWFsaWZpZWRfbmFtZSA9PSBudWxscHRyKQorICAg
IHJldHVybiB7fTsKKworICByZXR1cm4gcHlvYmpfdG9fc3RyIChmdWxseV9xdWFsaWZpZWRfbmFt
ZS5nZXQgKCkpOworCisjZWxzZSAvKiBQWV9WRVJTSU9OX0hFWCA8IDB4MDMwZDAwMDAgJiYgISBk
ZWZpbmVkIChQeV9MSU1JVEVEX0FQSSkgICovCisgIC8qIEZvciBub24taGVhcCB0eXBlcywgdGhl
IGZ1bGx5IHF1YWxpZmllZCBuYW1lIGNvcnJlc3BvbmRzIHRvIHRwX25hbWUuICAqLworICBpZiAo
ISAoUHlUeXBlX0dldEZsYWdzIChweV90eXBlKSAmIFB5X1RQRkxBR1NfSEVBUFRZUEUpKQorICAg
IHJldHVybiBweV90eXBlLT50cF9uYW1lOworCisgIC8qIEluIHRoZSBhYnNlbmNlIG9mIFB5VHlw
ZV9HZXRGdWxseVF1YWxpZmllZE5hbWUoKSwgd2UgZmFsbGJhY2sgdXNpbmcKKyAgICAgX19xdWFs
bmFtZV9fIGluc3RlYWQuIEhvd2V2ZXIsIHRoZSByZXN1bHQgbWF5IGRpZmZlciBzbGlnaHRseSBp
biBzb21lCisgICAgIGNhc2VzLCBlLmcuIHRoZSBtb2R1bGUgbmFtZSBtYXkgYmUgbWlzc2luZy4g
ICovCisKKyMgaWYgUFlfVkVSU0lPTl9IRVggPj0gMHgwMzBiMDAwMAorICAvKiBOb3RlOiBQeVR5
cGVfR2V0UXVhbE5hbWUoKSB3YXMgYWRkZWQgaW4gdmVyc2lvbiAzLjExLiAgKi8KKyAgZ2RicHlf
cmVmPD4gcXVhbG5hbWUgKFB5VHlwZV9HZXRRdWFsTmFtZSAocHlfdHlwZSkpOworICBpZiAocXVh
bG5hbWUgPT0gbnVsbHB0cikKKyAgICByZXR1cm4ge307CisKKyAgcmV0dXJuIHB5b2JqX3RvX3N0
ciAocXVhbG5hbWUuZ2V0ICgpKTsKKworIyBlbHNlCisgIC8qIEluIHRoZSBhYnNlbmNlIG9mIFB5
VHlwZV9HZXRRdWFsTmFtZSgpLCBmYWxsYmFjayBvbiB1c2luZyBQeUhlYXBUeXBlT2JqZWN0Cisg
ICAgIHdoaWNoIGlzIG5vdCBwYXJ0IG9mIHRoZSBwdWJsaWMgQVBJLgorICAgICBUZXN0ZWQgb24g
My4xMCB3aGljaCBpcyB0aGUgb2xkZXN0IHN1cHBvcnRlZCB2ZXJzaW9uIGF0IHRoZSB0aW1lIG9m
IHRoaXMKKyAgICAgd3JpdGluZywgaS5lLiBGZWJydWFyeSAyMDI2LiAgSG9wZWZ1bGx5LCB0aGlz
IHdvcmthcm91bmQgc2hvdWxkIGdvIGF3YXkKKyAgICAgd2hlbiB0aGUgbWluaW11bSBzdXBwb3J0
ZWQgUHl0aG9uIHZlcnNpb24gaXMgaW5jcmVhc2VkIGFib3ZlIDMuMTAuICAqLworICBQeUhlYXBU
eXBlT2JqZWN0ICpodCA9IChQeUhlYXBUeXBlT2JqZWN0ICopIHB5X3R5cGU7CisgIGlmIChodC0+
aHRfcXVhbG5hbWUgPT0gbnVsbHB0cikKKyAgICByZXR1cm4ge307CisKKyAgcmV0dXJuIHB5b2Jq
X3RvX3N0ciAoaHQtPmh0X3F1YWxuYW1lKTsKKyMgZW5kaWYKKyNlbmRpZgorfQorCisvKiBSZXR1
cm4gdGhlIHR5cGUncyBmdWxseSBxdWFsaWZpZWQgbmFtZSBmcm9tIGEgUHlPYmplY3QuICAqLwor
c3RkOjpzdHJpbmcKK2dkYnB5X3B5X29ial90cF9uYW1lIChQeU9iamVjdCAqc2VsZikgbm9leGNl
cHQKK3sKKyAgLyogTm90ZTogUHlfVFlQRSAoKSBpcyBwYXJ0IG9mIHRoZSBzdGFibGUgQUJJIHNp
bmNlIHZlcnNpb24gMy4xNC4gICovCisgIHJldHVybiBnZGJfcHlfdHBfbmFtZSAoUHlfVFlQRSAo
c2VsZikpOworfQpkaWZmIC0tZ2l0IGEvc3JjL3B5dGhvbi1pbnRlcm5hbC5jcHAgYi9zcmMvcHl0
aG9uLWludGVybmFsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjFh
MjYyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3B5dGhvbi1pbnRlcm5hbC5jcHAKQEAgLTAsMCAr
MSw4NyBAQAorI2luY2x1ZGUgInB5dGhvbi1pbnRlcm5hbC5ocHAiCisjaW5jbHVkZSA8Y3N0cmlu
Zz4KKworbmFtZXNwYWNlIHsKKworLyogTGlrZSBQeU1vZHVsZV9BZGRPYmplY3QsIGJ1dCBkb2Vz
IG5vdCBzdGVhbCBhIHJlZmVyZW5jZSB0bworICAgT0JKRUNULiAgKi8KKworYm9vbAorZ2RiX3B5
bW9kdWxlX2FkZG9iamVjdCAoUHlPYmplY3QgKm1vZCwgY29uc3QgY2hhciAqbmFtZSwgUHlPYmpl
Y3QgKm9iamVjdCkKK3sKKyAgUHlfSU5DUkVGIChvYmplY3QpOworICBpbnQgcmVzdWx0ID0gUHlN
b2R1bGVfQWRkT2JqZWN0IChtb2QsIG5hbWUsIG9iamVjdCk7CisgIGlmIChyZXN1bHQgPCAwKQor
ICAgIFB5X0RFQ1JFRiAob2JqZWN0KTsKKyAgcmV0dXJuIHJlc3VsdCA9PSAwOworfQorCit9IC8v
IG5hbWVzcGFjZSBhbm9ueW1vdXMKKworLyogQSB3cmFwcGVyIGZvciBhbGwgdGhlIGluaXRpYWxp
emF0aW9uIGxvZ2ljIG9mIHRoZSBQeXRob24gdHlwZS4KKyAgIC0gUHlUeXBlX0Zyb21TcGVjIG9y
IFB5VHlwZV9Gcm9tU3BlY1dpdGhCYXNlcyBpbml0aWFsaXplcyB0aGUgb3BhcXVlIHR5cGUKKyAg
ICAgUHlUeXBlT2JqZWN0ICh3aGljaCBpcyBpdHNlbGYgYSBQeU9iamVjdCkgZnJvbSB0aGUgcHJv
dmlkZWQgUHlUeXBlX1NwZWMuCisgICAtIGdkYl9weW1vZHVsZV9hZGRvYmplY3QgcmVnaXN0ZXJz
IHRoZSB0eXBlIGluIHRoZSBhcHByb3ByaWF0ZSBtb2R1bGUuCisgICBJZiBNT0QgaXMgc3VwcGxp
ZWQsIHRoZW4gdGhlIHR5cGUgaXMgYWRkZWQgdG8gdGhhdCBtb2R1bGUuICBJZiBNT0QKKyAgIGlz
IG5vdCBzdXBwbGllZCwgdGhlIHR5cGUgbmFtZSAoUHlUeXBlX1NwZWMubmFtZSBmaWVsZCkgbXVz
dCBiZSBvZgorICAgdGhlIGZvcm0gImdkYi5NdW1ibGUiLCBhbmQgdGhlIHR5cGUgd2lsbCBiZSBh
ZGRlZCB0byB0aGUgZ2RiIG1vZHVsZS4KKyAgIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLCBmYWxz
ZSBvbiBlcnJvci4gICovCisKK2dkYnB5X29iamVjdF90eXBlX3JlZgorZ2RicHlfdHlwZV9pbml0
aWFsaXplIChnZGJweV9ib3Jyb3dlZF9yZWY8PiAmbW9kLAorCQkgICAgICAgUHlUeXBlX1NwZWMg
KnNwZWMsCisJCSAgICAgICBQeU9iamVjdCAqYmFzZXMsCisJCSAgICAgICBib29sIGRpc2FsbG93
X2luc3RhbnRpYXRpb24pCit7CisgIGdkYnB5X3JlZjw+IHJlcyAoYmFzZXMgPT0gbnVsbHB0cgor
CQkgICA/IFB5VHlwZV9Gcm9tU3BlYyAoc3BlYykKKwkJICAgOiBQeVR5cGVfRnJvbVNwZWNXaXRo
QmFzZXMgKHNwZWMsIGJhc2VzKSk7CisgIGlmIChyZXMgPT0gbnVsbHB0cikKKyAgICByZXR1cm4g
bnVsbHB0cjsKKworICBnZGJweV9vYmplY3RfdHlwZV9yZWYgb2JqZWN0X3R5cGUgKHN0ZDo6bW92
ZSAocmVzKSk7CisKKyAgaWYgKG9iamVjdF90eXBlLnNhbWVfYXMgKG51bGxwdHIpKQorICAgIHsK
KyAgICAgIFB5RXJyX1ByaW50ICgpOworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisj
aWYgUFlfVkVSU0lPTl9IRVggPCAweDAzMGEwMDAwCisgIC8qIFdoZW4gdXNpbmcgdGhlIFB5dGhv
biB1bmxpbWl0ZWQgQVBJLCBkaXNhbGxvd2luZyB0aGUgY3JlYXRpb24gb2YgaW5zdGFuY2VzCisg
ICAgIG9mIHRoZSB0eXBlIGluIFB5dGhvbiBpcyBkb25lIGJ5IHNldHRpbmcgdHBfZnJlZSB0byBO
VUxMLgorICAgICBXaGVuIHVzaW5nIHRoZSBQeXRob24gbGltaXRlZCBBUEksIFB5VHlwZV9Gcm9t
U3BlYyBhbmQgaXRzIHNpYmxpbmdzCisgICAgIGF1dG9tYXRpY2FsbHkgc2V0IHRwX25ldyB0byBQ
eVR5cGVfR2VuZXJpY05ldygpLCB3aGljaCBoYXMgZm9yIGNvbnNlcXVlbmNlCisgICAgIG9mIGFs
bG93aW5nIHRoZSBjcmVhdGlvbiBvZiBpbnN0YW5jZXMgb2YgdGhlIHR5cGUgaW4gUHl0aG9uLgor
ICAgICBUbyBkaXNhbGxvdyB0aGlzIGJlaGF2aW9yIHdpdGggdGhlIGxpbWl0ZWQgQVBJLCBhIG5l
dyBmbGFnIHdhcyBpbnRyb2R1Y2VkCisgICAgIGluIFB5dGhvbiAzLjk6IFB5X1RQRkxBR1NfRElT
QUxMT1dfSU5TVEFOVElBVElPTi4KKyAgICAgRm9yIFB5dGhvbiB2ZXJzaW9ucyBvbGRlciB0aGFu
IDMuOSwgd2UgbmVlZCB0byBzZXQgZXhwbGljaXRseSB0cF9mcmVlIHRvCisgICAgIE5VTEwgb25j
ZSB0aGUgdHlwZSBvYmplY3Qgd2FzIGNyZWF0ZWQuICBUaGlzIHdvcmthcm91bmQgaXMgb25seSBh
dmFpbGFibGUKKyAgICAgd2hlbiB0aGUgbGltaXRlZCBBUEkgaXMgZGlzYWJsZWQuICAqLworI2lm
IGRlZmluZWQgKFB5X0xJTUlURURfQVBJKQorICAjZXJyb3IgIlRoZSB2ZXJzaW9uIG9mIFB5dGhv
biB5b3UgYXJlIHVzaW5nIGRvZXMgbm90IGV4cG9zZSAiIFwKKwkgIlB5X1RQRkxBR1NfRElTQUxM
T1dfSU5TVEFOVElBVElPTiBhcyBhIHBhcnQgb2YgdGhlIGxpbWl0ZWQgQyBBUEkuIgorI2Vsc2UK
KyAgaWYgKGRpc2FsbG93X2luc3RhbnRpYXRpb24pCisgICAgb2JqZWN0X3R5cGUucHl0eXBlICgp
LT50cF9uZXcgPSBudWxscHRyOworCisgIC8qIFB5VHlwZV9SZWFkeSgpIGlzIGFscmVhZHkgY2Fs
bGVkIGF0IHRoZSBlbmQgb2YgUHlUeXBlX0Zyb21NZXRhY2xhc3MoKQorICAgICAoY2FsbGVkIGJ5
IGJvdGggUHlUeXBlX0Zyb21TcGVjIGFuZCBQeVR5cGVfRnJvbVNwZWNXaXRoQmFzZXMpLCBzbyBu
bworICAgICBuZWVkIHRvIGNhbGwgaXQgYWdhaW4gdW5sZXNzIHRoZSBQeXRob24gdmVyc2lvbiBk
b2VzIG5vdCBoYXZlIHRoZSBmbGFnCisgICAgIFB5X1RQRkxBR1NfRElTQUxMT1dfSU5TVEFOVElB
VElPTi4gIEluIHRoaXMgY2FzZSwgYSBzZWNvbmQgY2FsbCBhZnRlcgorICAgICBzZXR0aW5nIHRw
X25ldyB0byBOVUxMIHdpbGwgZGlzYWxsb3cgdGhlIGluc3RhbnRpYXRpb24gZm9yIHRoZSB0eXBl
IGFzCisgICAgIGl0IHVzZWQgdG8gYmUgdGhlIGNhc2Ugd2l0aCBub24taGVhcCB0eXBlcy4gICov
CisgIGlmIChQeVR5cGVfUmVhZHkgKG9iamVjdF90eXBlKSA8IDApCisgICAgcmV0dXJuIG51bGxw
dHI7CisjZW5kaWYKKyNlbHNlCisgICh2b2lkKSBkaXNhbGxvd19pbnN0YW50aWF0aW9uOworI2Vu
ZGlmCisKKyAgY29uc3QgY2hhciAqZG90ID0gc3RycmNociAoc3BlYy0+bmFtZSwgJy4nKTsKKyAg
Z2RiX2Fzc2VydCAoZG90ICE9IG51bGxwdHIpOworICBpZiAoZ2RiX3B5bW9kdWxlX2FkZG9iamVj
dCAobW9kLmdldCAoKSwgZG90ICsgMSwgb2JqZWN0X3R5cGUuZ2V0ICgpKSA8IDApCisgICAgcmV0
dXJuIG51bGxwdHI7CisKKyAgcmV0dXJuIG9iamVjdF90eXBlOworfQorCg==

--------------cppodQLVXVysT6VYZf3htHxi--