[3.12] gh-149079: Fix O(n^2) canonical ordering in unicodedata.normalize() (GH-149080) (#150843)

Yhg1s <[email protected]> Tue, 04 Aug 2026 05:25:56 -0400 (EDT)
Newsgroups gmane.comp.python.cvs
Message-ID <[email protected]>
aHR0cHM6Ly9naXRodWIuY29tL3B5dGhvbi9jcHl0aG9uL2NvbW1pdC9kM2FiOTQ1YWYyNWIyOGRm
ZTEzYWM2Y2I0MGMxMjRhMDFiMzNjZTFmDQpjb21taXQ6IGQzYWI5NDVhZjI1YjI4ZGZlMTNhYzZj
YjQwYzEyNGEwMWIzM2NlMWYNCmJyYW5jaDogMy4xMg0KYXV0aG9yOiBQZXRyIFZpa3RvcmluIDxl
bmN1a291QGdtYWlsLmNvbT4NCmNvbW1pdHRlcjogWWhnMXMgPHRob21hc0BweXRob24ub3JnPg0K
ZGF0ZTogMjAyNi0wOC0wNFQxMToyMjoxMSswMjowMA0Kc3VtbWFyeToNCg0KWzMuMTJdIGdoLTE0
OTA3OTogRml4IE8obl4yKSBjYW5vbmljYWwgb3JkZXJpbmcgaW4gdW5pY29kZWRhdGEubm9ybWFs
aXplKCkgKEdILTE0OTA4MCkgKCMxNTA4NDMpDQoNClJlcGxhY2UgdGhlIGluc2VydGlvbiBzb3J0
IHVzZWQgZm9yIGNhbm9uaWNhbCBvcmRlcmluZyBvZiBjb21iaW5pbmcNCmNoYXJhY3RlcnMgd2l0
aCBhIGh5YnJpZCBhcHByb2FjaDogaW5zZXJ0aW9uIHNvcnQgZm9yIHNob3J0IHJ1bnMgKDwgMjAp
DQphbmQgY291bnRpbmcgc29ydCBmb3IgbG9uZ2VyIHJ1bnMsIHJlZHVjaW5nIHdvcnN0LWNhc2Ug
Y29tcGxleGl0eSBmcm9tDQpPKG5eMikgdG8gTyhuKS4gVGhpcyBwcmV2ZW50cyBkZW5pYWwgb2Yg
c2VydmljZSB2aWEgY3JhZnRlZCBVbmljb2RlDQpzdHJpbmdzIHdpdGggbWFueSBjb21iaW5pbmcg
Y2hhcmFjdGVycyBpbiBhbHRlcm5hdGluZyBDQ0Mgb3JkZXIuDQoNCihjaGVycnkgcGlja2VkIGZy
b20gY29tbWl0IDk5MTIyNGIxZTgzMTFjODVmMTk4ZjZkZDgyMDhiZjhjZmY3ZmMyNmYpDQoNCkNv
LWF1dGhvcmVkLWJ5OiBTZXRoIExhcnNvbiA8c2V0aEBweXRob24ub3JnPg0KQ28tYXV0aG9yZWQt
Ynk6IGNoNG4zLXlvb24gPGNoNG4zLnlvb25AZ21haWwuY29tPg0KQ28tYXV0aG9yZWQtYnk6IFNl
b2tjaGFuIFlvb24gPDEzODUyOTI1K2NoNG4zLXlvb25AdXNlcnMubm9yZXBseS5naXRodWIuY29t
Pg0KQ28tYXV0aG9yZWQtYnk6IFN0YW4gVWxicnljaCA8c3RhbkBweXRob24ub3JnPg0KQ28tYXV0
aG9yZWQtYnk6IELDqW7DqWRpa3QgVHJhbiA8MTA3OTY2MDArcGljbml4ekB1c2Vycy5ub3JlcGx5
LmdpdGh1Yi5jb20+DQpDby1hdXRob3JlZC1ieTogU2VyaGl5IFN0b3JjaGFrYSA8c3RvcmNoYWth
QGdtYWlsLmNvbT4NCkNvLWF1dGhvcmVkLWJ5OiBNYXVyeWN5IFBhd8WCb3dza2ktV2llcm/FhHNr
aSA8bWF1cnljeUBtYXVyeWN5LmNvbT4NCg0KZmlsZXM6DQpBIE1pc2MvTkVXUy5kL25leHQvU2Vj
dXJpdHkvMjAyNi0wNC0yNy0xNi0zNi0xMS5naC1pc3N1ZS0xNDkwNzkudktsLUxNLnJzdA0KTSBM
aWIvdGVzdC90ZXN0X3VuaWNvZGVkYXRhLnB5DQpNIE1vZHVsZXMvdW5pY29kZWRhdGEuYw0KDQpk
aWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF91bmljb2RlZGF0YS5weSBiL0xpYi90ZXN0L3Rlc3Rf
dW5pY29kZWRhdGEucHkNCmluZGV4IDUxNWMzODQwY2IzNjQ3Li42YjRiZmYxOTRlYjRiNSAxMDA2
NDQNCi0tLSBhL0xpYi90ZXN0L3Rlc3RfdW5pY29kZWRhdGEucHkNCisrKyBiL0xpYi90ZXN0L3Rl
c3RfdW5pY29kZWRhdGEucHkNCkBAIC0yMDMsNiArMjAzLDM0IEBAIGRlZiB0ZXN0X2lzc3VlMTAy
NTQoc2VsZik6DQogICAgICAgICBiID0gJ0NcdTAzMzgnICogMjAgICsgJ1x4QzcnDQogICAgICAg
ICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGIubm9ybWFsaXplKCdORkMnLCBhKSwgYikNCiANCisg
ICAgZGVmIHRlc3RfbG9uZ19jb21iaW5pbmdfbWFya19ydW4oc2VsZik6DQorICAgICAgICAjIGdo
LTE0OTA3OTogYXZvaWQgcXVhZHJhdGljIGNhbm9uaWNhbCBvcmRlcmluZy4NCisgICAgICAgIHBh
eWxvYWQgPSAiYSIgKyAoIlx1MDMwMFx1MDMyNyIgKiAzMikNCisgICAgICAgIG5mZCA9ICJhIiAr
ICgiXHUwMzI3IiAqIDMyKSArICgiXHUwMzAwIiAqIDMyKQ0KKyAgICAgICAgbmZjID0gIlx1MDBl
MCIgKyAoIlx1MDMyNyIgKiAzMikgKyAoIlx1MDMwMCIgKiAzMSkNCisNCisgICAgICAgIHNlbGYu
YXNzZXJ0RXF1YWwoc2VsZi5kYi5ub3JtYWxpemUoIk5GRCIsIHBheWxvYWQpLCBuZmQpDQorICAg
ICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGIubm9ybWFsaXplKCJORktEIiwgcGF5bG9hZCks
IG5mZCkNCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kYi5ub3JtYWxpemUoIk5GQyIs
IHBheWxvYWQpLCBuZmMpDQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGIubm9ybWFs
aXplKCJORktDIiwgcGF5bG9hZCksIG5mYykNCisNCisgICAgZGVmIHRlc3RfY29tYmluaW5nX21h
cmtfcnVuX2Zhc3RfcGF0aHMoc2VsZik6DQorICAgICAgICAjIGdoLTE0OTA3OTogY292ZXIgc2hv
cnQgcnVucyBhbmQgYWxyZWFkeS1zb3J0ZWQgbG9uZyBydW5zLg0KKyAgICAgICAgc2hvcnRfcGF5
bG9hZCA9ICJhIiArICgiXHUwMzAwXHUwMzI3IiAqIDkpICsgIlx1MDMwMCINCisgICAgICAgIHNo
b3J0X25mZCA9ICJhIiArICgiXHUwMzI3IiAqIDkpICsgKCJcdTAzMDAiICogMTApDQorICAgICAg
ICBzaG9ydF9uZmMgPSAiXHUwMGUwIiArICgiXHUwMzI3IiAqIDkpICsgKCJcdTAzMDAiICogOSkN
CisgICAgICAgIGxvbmdfc29ydGVkID0gImEiICsgKCJcdTAzMjciICogMzApICsgKCJcdTAzMDAi
ICogMzApDQorICAgICAgICBsb25nX3NvcnRlZF9uZmMgPSAiXHUwMGUwIiArICgiXHUwMzI3IiAq
IDMwKSArICgiXHUwMzAwIiAqIDI5KQ0KKw0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxm
LmRiLm5vcm1hbGl6ZSgiTkZEIiwgc2hvcnRfcGF5bG9hZCksIHNob3J0X25mZCkNCisgICAgICAg
IHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kYi5ub3JtYWxpemUoIk5GS0QiLCBzaG9ydF9wYXlsb2Fk
KSwgc2hvcnRfbmZkKQ0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRiLm5vcm1hbGl6
ZSgiTkZDIiwgc2hvcnRfcGF5bG9hZCksIHNob3J0X25mYykNCisgICAgICAgIHNlbGYuYXNzZXJ0
RXF1YWwoc2VsZi5kYi5ub3JtYWxpemUoIk5GS0MiLCBzaG9ydF9wYXlsb2FkKSwgc2hvcnRfbmZj
KQ0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRiLm5vcm1hbGl6ZSgiTkZEIiwgbG9u
Z19zb3J0ZWQpLCBsb25nX3NvcnRlZCkNCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5k
Yi5ub3JtYWxpemUoIk5GS0QiLCBsb25nX3NvcnRlZCksIGxvbmdfc29ydGVkKQ0KKyAgICAgICAg
c2VsZi5hc3NlcnRFcXVhbChzZWxmLmRiLm5vcm1hbGl6ZSgiTkZDIiwgbG9uZ19zb3J0ZWQpLCBs
b25nX3NvcnRlZF9uZmMpDQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGIubm9ybWFs
aXplKCJORktDIiwgbG9uZ19zb3J0ZWQpLCBsb25nX3NvcnRlZF9uZmMpDQorDQogICAgIGRlZiB0
ZXN0X2lzc3VlMjk0NTYoc2VsZik6DQogICAgICAgICAjIEZpeCAjMjk0NTYNCiAgICAgICAgIHUx
MTc2X3N0cl9hID0gJ1x1MTEwMFx1MTE3Nlx1MTFhOCcNCmRpZmYgLS1naXQgYS9NaXNjL05FV1Mu
ZC9uZXh0L1NlY3VyaXR5LzIwMjYtMDQtMjctMTYtMzYtMTEuZ2gtaXNzdWUtMTQ5MDc5LnZLbC1M
TS5yc3QgYi9NaXNjL05FV1MuZC9uZXh0L1NlY3VyaXR5LzIwMjYtMDQtMjctMTYtMzYtMTEuZ2gt
aXNzdWUtMTQ5MDc5LnZLbC1MTS5yc3QNCm5ldyBmaWxlIG1vZGUgMTAwNjQ0DQppbmRleCAwMDAw
MDAwMDAwMDAwMC4uNGVkMjJiNThmNzQwNWYNCi0tLSAvZGV2L251bGwNCisrKyBiL01pc2MvTkVX
Uy5kL25leHQvU2VjdXJpdHkvMjAyNi0wNC0yNy0xNi0zNi0xMS5naC1pc3N1ZS0xNDkwNzkudkts
LUxNLnJzdA0KQEAgLTAsMCArMSw1IEBADQorRml4IGEgcG90ZW50aWFsIGRlbmlhbCBvZiBzZXJ2
aWNlIGluIDpmdW5jOmB1bmljb2RlZGF0YS5ub3JtYWxpemVgLiBUaGUNCitjYW5vbmljYWwgb3Jk
ZXJpbmcgc3RlcCBvZiBVbmljb2RlIG5vcm1hbGl6YXRpb24gdXNlZCBhIHF1YWRyYXRpYy10aW1l
IGluc2VydGlvbg0KK3NvcnQgZm9yIHJlb3JkZXJpbmcgY29tYmluaW5nIGNoYXJhY3RlcnMsIHdo
aWNoIGNvdWxkIGJlIGV4cGxvaXRlZCB3aXRoDQorY3JhZnRlZCBpbnB1dCBjb250YWluaW5nIG1h
bnkgY29tYmluaW5nIGNoYXJhY3RlcnMgaW4gbm9uLWNhbm9uaWNhbCBvcmRlci4NCitSZXBsYWNl
ZCB3aXRoIGEgbGluZWFyLXRpbWUgY291bnRpbmcgc29ydCBmb3IgbG9uZyBydW5zLg0KZGlmZiAt
LWdpdCBhL01vZHVsZXMvdW5pY29kZWRhdGEuYyBiL01vZHVsZXMvdW5pY29kZWRhdGEuYw0KaW5k
ZXggNDFkY2Q1ZjhmODgzZjIuLmRlMzQ1MTYyOGM2ZWY5IDEwMDY0NA0KLS0tIGEvTW9kdWxlcy91
bmljb2RlZGF0YS5jDQorKysgYi9Nb2R1bGVzL3VuaWNvZGVkYXRhLmMNCkBAIC00OTAsMTkgKzQ5
MCw4MCBAQCBnZXRfZGVjb21wX3JlY29yZChQeU9iamVjdCAqc2VsZiwgUHlfVUNTNCBjb2RlLA0K
ICNkZWZpbmUgTkNvdW50ICAoVkNvdW50KlRDb3VudCkNCiAjZGVmaW5lIFNDb3VudCAgKExDb3Vu
dCpOQ291bnQpDQogDQorLyogU21hbGwgY29tYmluaW5nIHJ1bnMgYXJlIHVzdWFsbHkgY2hlYXBl
ciB3aXRoIGluc2VydGlvbiBzb3J0LiAqLw0KKyNkZWZpbmUgQ0FOT05JQ0FMX09SREVSSU5HX0NP
VU5USU5HX1NPUlRfVEhSRVNIT0xEIDIwDQorDQorc3RhdGljIHZvaWQNCitjYW5vbmljYWxfb3Jk
ZXJpbmdfc29ydF9pbnNlcnRpb24oaW50IGtpbmQsIHZvaWQgKmRhdGEsDQorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3Qgc3RhcnQsIFB5X3NzaXplX3QgZW5kKQ0K
K3sNCisgICAgZm9yIChQeV9zc2l6ZV90IGkgPSBzdGFydCArIDE7IGkgPCBlbmQ7IGkrKykgew0K
KyAgICAgICAgUHlfVUNTNCBjb2RlID0gUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgaSk7DQor
ICAgICAgICB1bnNpZ25lZCBjaGFyIGNvbWJpbmluZyA9IF9nZXRyZWNvcmRfZXgoY29kZSktPmNv
bWJpbmluZzsNCisgICAgICAgIFB5X3NzaXplX3QgaiA9IGk7DQorDQorICAgICAgICB3aGlsZSAo
aiA+IHN0YXJ0KSB7DQorICAgICAgICAgICAgUHlfVUNTNCBwcmV2aW91cyA9IFB5VW5pY29kZV9S
RUFEKGtpbmQsIGRhdGEsIGogLSAxKTsNCisgICAgICAgICAgICBpZiAoX2dldHJlY29yZF9leChw
cmV2aW91cyktPmNvbWJpbmluZyA8PSBjb21iaW5pbmcpIHsNCisgICAgICAgICAgICAgICAgYnJl
YWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIFB5VW5pY29kZV9XUklURShraW5kLCBk
YXRhLCBqLCBwcmV2aW91cyk7DQorICAgICAgICAgICAgai0tOw0KKyAgICAgICAgfQ0KKyAgICAg
ICAgaWYgKGogIT0gaSkgew0KKyAgICAgICAgICAgIFB5VW5pY29kZV9XUklURShraW5kLCBkYXRh
LCBqLCBjb2RlKTsNCisgICAgICAgIH0NCisgICAgfQ0KK30NCisNCitzdGF0aWMgdm9pZA0KK2Nh
bm9uaWNhbF9vcmRlcmluZ19zb3J0X2NvdW50aW5nKGludCBraW5kLCB2b2lkICpkYXRhLA0KKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3Qgc3RhcnQsIFB5X3NzaXpl
X3QgZW5kLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1VDUzQgKnNvcnRi
dWYpDQorew0KKyAgICBQeV9zc2l6ZV90IGNvdW50c1syNTZdID0gezB9Ow0KKyAgICBQeV9zc2l6
ZV90IHJ1bl9sZW5ndGggPSBlbmQgLSBzdGFydDsNCisgICAgUHlfc3NpemVfdCB0b3RhbCA9IDA7
DQorDQorICAgIGZvciAoUHlfc3NpemVfdCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgew0KKyAg
ICAgICAgUHlfVUNTNCBjb2RlID0gUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgaSk7DQorICAg
ICAgICB1bnNpZ25lZCBjaGFyIGNvbWJpbmluZyA9IF9nZXRyZWNvcmRfZXgoY29kZSktPmNvbWJp
bmluZzsNCisgICAgICAgIGNvdW50c1tjb21iaW5pbmddKys7DQorICAgIH0NCisNCisgICAgZm9y
IChzaXplX3QgaSA9IDA7IGkgPCBQeV9BUlJBWV9MRU5HVEgoY291bnRzKTsgaSsrKSB7DQorICAg
ICAgICBQeV9zc2l6ZV90IGNvdW50ID0gY291bnRzW2ldOw0KKyAgICAgICAgY291bnRzW2ldID0g
dG90YWw7DQorICAgICAgICB0b3RhbCArPSBjb3VudDsNCisgICAgfQ0KKw0KKyAgICAvKiBSZXVz
ZSBjb3VudHNbXSBhcyB0aGUgbmV4dCBvdXRwdXQgc2xvdCBmb3IgZWFjaCBDQ0MuICovDQorICAg
IGZvciAoUHlfc3NpemVfdCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgew0KKyAgICAgICAgUHlf
VUNTNCBjb2RlID0gUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgaSk7DQorICAgICAgICB1bnNp
Z25lZCBjaGFyIGNvbWJpbmluZyA9IF9nZXRyZWNvcmRfZXgoY29kZSktPmNvbWJpbmluZzsNCisg
ICAgICAgIHNvcnRidWZbY291bnRzW2NvbWJpbmluZ10rK10gPSBjb2RlOw0KKyAgICB9DQorICAg
IGZvciAoUHlfc3NpemVfdCBpID0gMDsgaSA8IHJ1bl9sZW5ndGg7IGkrKykgew0KKyAgICAgICAg
UHlVbmljb2RlX1dSSVRFKGtpbmQsIGRhdGEsIHN0YXJ0ICsgaSwgc29ydGJ1ZltpXSk7DQorICAg
IH0NCit9DQorDQogc3RhdGljIFB5T2JqZWN0Kg0KIG5mZF9uZmtkKFB5T2JqZWN0ICpzZWxmLCBQ
eU9iamVjdCAqaW5wdXQsIGludCBrKQ0KIHsNCiAgICAgUHlPYmplY3QgKnJlc3VsdDsNCiAgICAg
UHlfVUNTNCAqb3V0cHV0Ow0KICAgICBQeV9zc2l6ZV90IGksIG8sIG9zaXplOw0KLSAgICBpbnQg
a2luZDsNCi0gICAgY29uc3Qgdm9pZCAqZGF0YTsNCisgICAgaW50IGlucHV0X2tpbmQsIHJlc3Vs
dF9raW5kOw0KKyAgICBjb25zdCB2b2lkICppbnB1dF9kYXRhOw0KKyAgICB2b2lkICpyZXN1bHRf
ZGF0YTsNCiAgICAgLyogTG9uZ2VzdCBkZWNvbXBvc2l0aW9uIGluIFVuaWNvZGUgMy4yOiBVK0ZE
RkEgKi8NCiAgICAgUHlfVUNTNCBzdGFja1syMF07DQogICAgIFB5X3NzaXplX3Qgc3BhY2UsIGlz
aXplOw0KICAgICBpbnQgaW5kZXgsIHByZWZpeCwgY291bnQsIHN0YWNrcHRyOw0KICAgICB1bnNp
Z25lZCBjaGFyIHByZXYsIGN1cjsNCisgICAgUHlfVUNTNCAqc29ydGJ1ZiA9IE5VTEw7DQorICAg
IFB5X3NzaXplX3Qgc29ydGJ1ZmxlbiA9IDA7DQogDQogICAgIHN0YWNrcHRyID0gMDsNCiAgICAg
aXNpemUgPSBQeVVuaWNvZGVfR0VUX0xFTkdUSChpbnB1dCk7DQpAQCAtNTIyLDExICs1ODMsMTEg
QEAgbmZkX25ma2QoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICppbnB1dCwgaW50IGspDQogICAg
ICAgICByZXR1cm4gTlVMTDsNCiAgICAgfQ0KICAgICBpID0gbyA9IDA7DQotICAgIGtpbmQgPSBQ
eVVuaWNvZGVfS0lORChpbnB1dCk7DQotICAgIGRhdGEgPSBQeVVuaWNvZGVfREFUQShpbnB1dCk7
DQorICAgIGlucHV0X2tpbmQgPSBQeVVuaWNvZGVfS0lORChpbnB1dCk7DQorICAgIGlucHV0X2Rh
dGEgPSBQeVVuaWNvZGVfREFUQShpbnB1dCk7DQogDQogICAgIHdoaWxlIChpIDwgaXNpemUpIHsN
Ci0gICAgICAgIHN0YWNrW3N0YWNrcHRyKytdID0gUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwg
aSsrKTsNCisgICAgICAgIHN0YWNrW3N0YWNrcHRyKytdID0gUHlVbmljb2RlX1JFQUQoaW5wdXRf
a2luZCwgaW5wdXRfZGF0YSwgaSsrKTsNCiAgICAgICAgIHdoaWxlKHN0YWNrcHRyKSB7DQogICAg
ICAgICAgICAgUHlfVUNTNCBjb2RlID0gc3RhY2tbLS1zdGFja3B0cl07DQogICAgICAgICAgICAg
LyogSGFuZ3VsIERlY29tcG9zaXRpb24gYWRkcyB0aHJlZSBjaGFyYWN0ZXJzIGluDQpAQCAtNTkx
LDM1ICs2NTIsNjYgQEAgbmZkX25ma2QoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICppbnB1dCwg
aW50IGspDQogICAgIFB5TWVtX0ZyZWUob3V0cHV0KTsNCiAgICAgaWYgKCFyZXN1bHQpDQogICAg
ICAgICByZXR1cm4gTlVMTDsNCisNCiAgICAgLyogcmVzdWx0IGlzIGd1YXJhbnRlZWQgdG8gYmUg
cmVhZHksIGFzIGl0IGlzIGNvbXBhY3QuICovDQotICAgIGtpbmQgPSBQeVVuaWNvZGVfS0lORChy
ZXN1bHQpOw0KLSAgICBkYXRhID0gUHlVbmljb2RlX0RBVEEocmVzdWx0KTsNCisgICAgcmVzdWx0
X2tpbmQgPSBQeVVuaWNvZGVfS0lORChyZXN1bHQpOw0KKyAgICByZXN1bHRfZGF0YSA9IFB5VW5p
Y29kZV9EQVRBKHJlc3VsdCk7DQogDQotICAgIC8qIFNvcnQgY2Fub25pY2FsbHkuICovDQorICAg
IC8qIFNvcnQgZWFjaCBjb25zZWN1dGl2ZSBjb21iaW5pbmctY2hhcmFjdGVyIHJ1biBjYW5vbmlj
YWxseS4gKi8NCiAgICAgaSA9IDA7DQotICAgIHByZXYgPSBfZ2V0cmVjb3JkX2V4KFB5VW5pY29k
ZV9SRUFEKGtpbmQsIGRhdGEsIGkpKS0+Y29tYmluaW5nOw0KLSAgICBmb3IgKGkrKzsgaSA8IFB5
VW5pY29kZV9HRVRfTEVOR1RIKHJlc3VsdCk7IGkrKykgew0KLSAgICAgICAgY3VyID0gX2dldHJl
Y29yZF9leChQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCBpKSktPmNvbWJpbmluZzsNCi0gICAg
ICAgIGlmIChwcmV2ID09IDAgfHwgY3VyID09IDAgfHwgcHJldiA8PSBjdXIpIHsNCi0gICAgICAg
ICAgICBwcmV2ID0gY3VyOw0KKyAgICB3aGlsZSAoaSA8IG8pIHsNCisgICAgICAgIFB5X3NzaXpl
X3QgcnVuX2xlbmd0aCwgcnVuX3N0YXJ0Ow0KKyAgICAgICAgaW50IG5lZWRzX3NvcnQgPSAwOw0K
Kw0KKyAgICAgICAgUHlfVUNTNCBjaCA9IFB5VW5pY29kZV9SRUFEKHJlc3VsdF9raW5kLCByZXN1
bHRfZGF0YSwgaSk7DQorICAgICAgICBwcmV2ID0gX2dldHJlY29yZF9leChjaCktPmNvbWJpbmlu
ZzsNCisgICAgICAgIGlmIChwcmV2ID09IDApIHsNCisgICAgICAgICAgICBpKys7DQogICAgICAg
ICAgICAgY29udGludWU7DQogICAgICAgICB9DQotICAgICAgICAvKiBOb24tY2Fub25pY2FsIG9y
ZGVyLiBOZWVkIHRvIHN3aXRjaCAqaSB3aXRoIHByZXZpb3VzLiAqLw0KLSAgICAgICAgbyA9IGkg
LSAxOw0KLSAgICAgICAgd2hpbGUgKDEpIHsNCi0gICAgICAgICAgICBQeV9VQ1M0IHRtcCA9IFB5
VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsIG8rMSk7DQotICAgICAgICAgICAgUHlVbmljb2RlX1dS
SVRFKGtpbmQsIGRhdGEsIG8rMSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlVbmlj
b2RlX1JFQUQoa2luZCwgZGF0YSwgbykpOw0KLSAgICAgICAgICAgIFB5VW5pY29kZV9XUklURShr
aW5kLCBkYXRhLCBvLCB0bXApOw0KLSAgICAgICAgICAgIG8tLTsNCi0gICAgICAgICAgICBpZiAo
byA8IDApDQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIHByZXYgPSBfZ2V0
cmVjb3JkX2V4KFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsIG8pKS0+Y29tYmluaW5nOw0KLSAg
ICAgICAgICAgIGlmIChwcmV2ID09IDAgfHwgcHJldiA8PSBjdXIpDQorDQorICAgICAgICBydW5f
c3RhcnQgPSBpKys7DQorICAgICAgICB3aGlsZSAoaSA8IG8pIHsNCisgICAgICAgICAgICBQeV9V
Q1M0IGNoID0gUHlVbmljb2RlX1JFQUQocmVzdWx0X2tpbmQsIHJlc3VsdF9kYXRhLCBpKTsNCisg
ICAgICAgICAgICBjdXIgPSBfZ2V0cmVjb3JkX2V4KGNoKS0+Y29tYmluaW5nOw0KKyAgICAgICAg
ICAgIGlmIChjdXIgPT0gMCkgew0KICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAg
ICB9DQorICAgICAgICAgICAgaWYgKHByZXYgPiBjdXIpIHsNCisgICAgICAgICAgICAgICAgbmVl
ZHNfc29ydCA9IDE7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHByZXYgPSBjdXI7DQor
ICAgICAgICAgICAgaSsrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKCFuZWVkc19zb3J0KSB7
DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorDQorICAgICAgICBydW5fbGVu
Z3RoID0gaSAtIHJ1bl9zdGFydDsNCisgICAgICAgIGlmIChydW5fbGVuZ3RoIDwgQ0FOT05JQ0FM
X09SREVSSU5HX0NPVU5USU5HX1NPUlRfVEhSRVNIT0xEKSB7DQorICAgICAgICAgICAgY2Fub25p
Y2FsX29yZGVyaW5nX3NvcnRfaW5zZXJ0aW9uKHJlc3VsdF9raW5kLCByZXN1bHRfZGF0YSwNCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuX3N0YXJ0LCBp
KTsNCisgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgIH0NCi0gICAgICAgIHByZXYgPSBf
Z2V0cmVjb3JkX2V4KFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsIGkpKS0+Y29tYmluaW5nOw0K
Kw0KKyAgICAgICAgaWYgKHJ1bl9sZW5ndGggPiBzb3J0YnVmbGVuKSB7DQorICAgICAgICAgICAg
UHlfVUNTNCAqbmV3X3NvcnRidWYgPSBQeU1lbV9SZXNpemUoc29ydGJ1ZiwNCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9VQ1M0LA0KKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bl9sZW5ndGgpOw0KKyAg
ICAgICAgICAgIGlmIChuZXdfc29ydGJ1ZiA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgIFB5
RXJyX05vTWVtb3J5KCk7DQorICAgICAgICAgICAgICAgIFB5TWVtX0ZyZWUoc29ydGJ1Zik7DQor
ICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOw0KKyAgICAgICAgICAgICAgICByZXR1
cm4gTlVMTDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgc29ydGJ1ZiA9IG5ld19zb3J0
YnVmOw0KKyAgICAgICAgICAgIHNvcnRidWZsZW4gPSBydW5fbGVuZ3RoOw0KKyAgICAgICAgfQ0K
Kw0KKyAgICAgICAgY2Fub25pY2FsX29yZGVyaW5nX3NvcnRfY291bnRpbmcocmVzdWx0X2tpbmQs
IHJlc3VsdF9kYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
cnVuX3N0YXJ0LCBpLCBzb3J0YnVmKTsNCiAgICAgfQ0KKyAgICBQeU1lbV9GcmVlKHNvcnRidWYp
Ow0KICAgICByZXR1cm4gcmVzdWx0Ow0KIH0NCiANCg0KX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX18KUHl0aG9uLWNoZWNraW5zIG1haWxpbmcgbGlzdCAtLSBw
eXRob24tY2hlY2tpbnNAcHl0aG9uLm9yZwpUbyB1bnN1YnNjcmliZSBzZW5kIGFuIGVtYWlsIHRv
IHB5dGhvbi1jaGVja2lucy1sZWF2ZUBweXRob24ub3JnCmh0dHBzOi8vbWFpbC5weXRob24ub3Jn
L21haWxtYW4zLy9saXN0cy9weXRob24tY2hlY2tpbnMucHl0aG9uLm9yZwpNZW1iZXIgYWRkcmVz
czogcHl0aG9uLXB5dGhvbi1jaGVja2luc0BtLmdtYW5lLW14Lm9yZwo=