Re: Decreasing seams in scaled windows

Neil Hodgson <[email protected]> Wed, 24 Jun 2026 08:28:14 +1000
Newsgroups gmane.comp.lib.scintilla.devel
Message-ID <CACWkrTjzHj5q=xbTxtu2X7O0xb=03oqpCXubsb0+t6Z8rXJugg@mail.gmail.com>
--0000000000002936a10654f347a4
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

John:

> I=E2=80=99ve been unable to reproduce, possibly because my Wayland setup =
is different than yours.

Yes, it could be system, library, or font matching issues. It could
also be occurring or not because of minor differences: lucking into an
evenly divisible line height or having the top of Scintilla at
different scale phases.

> I=E2=80=99m using a Ubuntu 24.04 based system and when the system display=
 magnification is set to 150%, Wayland uses a 2.0 device pixel ratio and th=
en scales the 200% to 150%.

OK, that is probably what is occurring to me since there is an initial
integer devicePixelRatioF then the DevicePixelRatioChange event
arrives and it updates to 1.5.

> My take now is that Qt scaling is buggy on macOS and Wayland =E2=80=94 th=
e listbox and menus show more debris than scintilla does when the highlight=
ed item moves.

So, should I commit a version (attached) that leaves Wayland with
full-window invalidation for non-integer scaling? That would make it
easier for people to experiment with this since the bulk of the code
is more easily downloaded.

Patch includes your SCINTILLA_QT_BACKINGSTORE_FIXED change for macOS.

Neil

--=20
You received this message because you are subscribed to the Google Groups "=
scintilla-interest" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to [email protected].
To view this discussion visit https://groups.google.com/d/msgid/scintilla-i=
nterest/CACWkrTjzHj5q%3DxbTxtu2X7O0xb%3D03oqpCXubsb0%2Bt6Z8rXJugg%40mail.gm=
ail.com.

--0000000000002936a10654f347a4
Content-Type: application/octet-stream; name="QtScaleK.patch"
Content-Disposition: attachment; filename="QtScaleK.patch"
Content-Transfer-Encoding: base64
Content-ID: <f_mqr7sgj80>
X-Attachment-Id: f_mqr7sgj80

ZGlmZiAtciA1NGQ4MTE4ZTkzOGYgY2FsbC9TY2ludGlsbGFDYWxsLmN4eAotLS0gYS9jYWxsL1Nj
aW50aWxsYUNhbGwuY3h4CVRodSBKdW4gMTggMTM6MDQ6NDYgMjAyNiArMTAwMAorKysgYi9jYWxs
L1NjaW50aWxsYUNhbGwuY3h4CVNhdCBKdW4gMjAgMDk6MjM6MzcgMjAyNiArMTAwMApAQCAtMzU1
OSw2ICszNTU5LDE0IEBACiAJQ2FsbFBvaW50ZXIoTWVzc2FnZTo6U2V0SUxleGVyLCAwLCBpbGV4
ZXIpOwogfQogCit2b2lkIFNjaW50aWxsYUNhbGw6OlNldFNjYWxlVGVjaG5pcXVlKFNjaW50aWxs
YTo6U2NhbGVUZWNobmlxdWUgdGVjaG5pcXVlKSB7CisJQ2FsbChNZXNzYWdlOjpTZXRTY2FsZVRl
Y2huaXF1ZSwgc3RhdGljX2Nhc3Q8dWludHB0cl90Pih0ZWNobmlxdWUpKTsKK30KKworU2NhbGVU
ZWNobmlxdWUgU2NpbnRpbGxhQ2FsbDo6U2NhbGVUZWNobmlxdWUoKSB7CisJcmV0dXJuIHN0YXRp
Y19jYXN0PFNjaW50aWxsYTo6U2NhbGVUZWNobmlxdWU+KENhbGwoTWVzc2FnZTo6R2V0U2NhbGVU
ZWNobmlxdWUpKTsKK30KKwogQmlkaXJlY3Rpb25hbCBTY2ludGlsbGFDYWxsOjpCaWRpcmVjdGlv
bmFsKCkgewogCXJldHVybiBzdGF0aWNfY2FzdDxTY2ludGlsbGE6OkJpZGlyZWN0aW9uYWw+KENh
bGwoTWVzc2FnZTo6R2V0QmlkaXJlY3Rpb25hbCkpOwogfQpkaWZmIC1yIDU0ZDgxMThlOTM4ZiBk
b2MvU2NpbnRpbGxhRG9jLmh0bWwKLS0tIGEvZG9jL1NjaW50aWxsYURvYy5odG1sCVRodSBKdW4g
MTggMTM6MDQ6NDYgMjAyNiArMTAwMAorKysgYi9kb2MvU2NpbnRpbGxhRG9jLmh0bWwJU2F0IEp1
biAyMCAwOToyMzozNyAyMDI2ICsxMDAwCkBAIC01MTA2LDYgKzUxMDYsOCBAQAogICAgIDwvY29k
ZT4KIDxkaXYgIGNsYXNzPSJwcm92aXNpb25hbCI+CiAgICAgPGNvZGU+CisgICAgIDxhIGNsYXNz
PSJtZXNzYWdlIiBocmVmPSIjU0NJX1NFVFNDQUxFVEVDSE5JUVVFIj5TQ0lfU0VUU0NBTEVURUNI
TklRVUUoaW50IHRlY2huaXF1ZSk8L2E+PGJyIC8+CisgICAgIDxhIGNsYXNzPSJtZXNzYWdlIiBo
cmVmPSIjU0NJX0dFVFNDQUxFVEVDSE5JUVVFIj5TQ0lfR0VUU0NBTEVURUNITklRVUUgJnJhcnI7
IGludDwvYT48YnIgLz4KICAgICAgPGEgY2xhc3M9Im1lc3NhZ2UiIGhyZWY9IiNTQ0lfU0VUQklE
SVJFQ1RJT05BTCI+PHNwYW4gY2xhc3M9InByb3Zpc2lvbmFsIj5TQ0lfU0VUQklESVJFQ1RJT05B
TChpbnQgYmlkaXJlY3Rpb25hbCk8L3NwYW4+PC9hPjxiciAvPgogICAgICA8YSBjbGFzcz0ibWVz
c2FnZSIgaHJlZj0iI1NDSV9HRVRCSURJUkVDVElPTkFMIj5TQ0lfR0VUQklESVJFQ1RJT05BTCAm
cmFycjsgaW50PC9hPjxiciAvPgogICAgIDwvY29kZT4KQEAgLTUzNTYsNiArNTM1OCwzNSBAQAog
ICAgICBub3RpZmljYXRpb24gKHdpdGggPGNvZGUgY2xhc3M9InBhcmFtZXRlciI+Y2hhcmFjdGVy
U291cmNlPC9jb2RlPiBzZXQgdG8gPGNvZGU+U0NfQ0hBUkFDVEVSU09VUkNFX1RFTlRBVElWRV9J
TlBVVDwvY29kZT4pIGlzIHNlbnQgZm9yIGVhY2ggY2hhcmFjdGVyLjwvcD4KIAogPGRpdiAgY2xh
c3M9InByb3Zpc2lvbmFsIj4KKyAgIDxwPjxiIGlkPSJTQ0lfU0VUU0NBTEVURUNITklRVUUiPlND
SV9TRVRTQ0FMRVRFQ0hOSVFVRShpbnQgdGVjaG5pcXVlKTwvYj48YnIgLz4KKyAgICAgPGIgaWQ9
IlNDSV9HRVRTQ0FMRVRFQ0hOSVFVRSI+U0NJX0dFVFNDQUxFVEVDSE5JUVVFICZyYXJyOyBpbnQ8
L2I+PGJyIC8+CisgICAgIFRoaXMgc2V0dGluZyBjaGFuZ2VzIHRoZSBpbXBsZW1lbnRhdGlvbiBv
ZiBkaXNwbGF5IHNjYWxpbmcgb24gc29tZSBwbGF0Zm9ybXMuPC9wPgorCisgICAgPHRhYmxlIGNs
YXNzPSJzdGFuZGFyZCIgc3VtbWFyeT0iVGVjaG5vbG9neSBjaG9pY2UiPgorICAgICAgPHRib2R5
IHZhbGlnbj0idG9wIj4KKyAgICAgICAgPHRyPgorICAgICAgICAgIDx0aCBhbGlnbj0ibGVmdCI+
PGNvZGU+U0NBTEVfVEVDSE5JUVVFX0RFRkFVTFQ8L2NvZGU+PC90aD4KKworICAgICAgICAgIDx0
ZD4wPC90ZD4KKworICAgICAgICAgIDx0ZD5EZWZhdWx0IGJlaGF2aW91ciBmb3IgdGhlIHBsYXRm
b3JtLjwvdGQ+CisgICAgICAgIDwvdHI+CisKKyAgICAgICAgPHRyPgorICAgICAgICAgIDx0aCBh
bGlnbj0ibGVmdCI+PGNvZGU+U0NBTEVfVEVDSE5JUVVFX1BJWEVMX0FMSUdORUQ8L2NvZGU+PC90
aD4KKworICAgICAgICAgIDx0ZD4xPC90ZD4KKworICAgICAgICAgIDx0ZD5BbGlnbiB0b3AgYW5k
IGJvdHRvbSBvZiBsaW5lcyB0byBwaHlzaWNhbCBwaXhlbHMgYW5kIGF2b2lkICdzZWFtcycgYmV0
d2VlbiBiYWNrZ3JvdW5kIHJlY3RhbmdsZXMgZm9yIGZyYWN0aW9uYWwgc2NhbGluZy4KKwkgIElt
cGxlbWVudGVkIG9uIFF0LiBUaGlzIG1vZGUgbWF5IGJlIHNsb3dlciB0aGFuIHRoZSBkZWZhdWx0
LjwvdGQ+CisgICAgICAgIDwvdHI+CisKKyAgICAgIDwvdGJvZHk+CisgICAgPC90YWJsZT4KKzwv
ZGl2PgorICAgIDxiciAvPgorCis8ZGl2ICBjbGFzcz0icHJvdmlzaW9uYWwiPgogICAgIDxhIGhy
ZWY9IiNQcm92aXNpb25hbE1lc3NhZ2VzIj5UaGVzZSBiaWRpcmVjdGlvbmFsIGZlYXR1cmVzIGFy
ZSBleHBlcmltZW50YWwgYW5kIGluY29tcGxldGUuPC9hPjxiciAvPgogICAgIDxwPjxiIGlkPSJT
Q0lfU0VUQklESVJFQ1RJT05BTCI+U0NJX1NFVEJJRElSRUNUSU9OQUwoaW50IGJpZGlyZWN0aW9u
YWwpPC9iPjxiciAvPgogICAgICA8YiBpZD0iU0NJX0dFVEJJRElSRUNUSU9OQUwiPlNDSV9HRVRC
SURJUkVDVElPTkFMICZyYXJyOyBpbnQ8L2I+PGJyIC8+CmRpZmYgLXIgNTRkODExOGU5MzhmIGlu
Y2x1ZGUvU2NpbnRpbGxhLmgKLS0tIGEvaW5jbHVkZS9TY2ludGlsbGEuaAlUaHUgSnVuIDE4IDEz
OjA0OjQ2IDIwMjYgKzEwMDAKKysrIGIvaW5jbHVkZS9TY2ludGlsbGEuaAlTYXQgSnVuIDIwIDA5
OjIzOjM3IDIwMjYgKzEwMDAKQEAgLTEzMzMsNiArMTMzMywxMCBAQAogI2RlZmluZSBTQ05fTUFS
R0lOUklHSFRDTElDSyAyMDMxCiAjZGVmaW5lIFNDTl9BVVRPQ1NFTEVDVElPTkNIQU5HRSAyMDMy
CiAjaWZuZGVmIFNDSV9ESVNBQkxFX1BST1ZJU0lPTkFMCisjZGVmaW5lIFNDQUxFX1RFQ0hOSVFV
RV9ERUZBVUxUIDAKKyNkZWZpbmUgU0NBTEVfVEVDSE5JUVVFX1BJWEVMX0FMSUdORUQgMQorI2Rl
ZmluZSBTQ0lfU0VUU0NBTEVURUNITklRVUUgMjgyMAorI2RlZmluZSBTQ0lfR0VUU0NBTEVURUNI
TklRVUUgMjgyMQogI2RlZmluZSBTQ19CSURJUkVDVElPTkFMX0RJU0FCTEVEIDAKICNkZWZpbmUg
U0NfQklESVJFQ1RJT05BTF9MMlIgMQogI2RlZmluZSBTQ19CSURJUkVDVElPTkFMX1IyTCAyCmRp
ZmYgLXIgNTRkODExOGU5MzhmIGluY2x1ZGUvU2NpbnRpbGxhLmlmYWNlCi0tLSBhL2luY2x1ZGUv
U2NpbnRpbGxhLmlmYWNlCVRodSBKdW4gMTggMTM6MDQ6NDYgMjAyNiArMTAwMAorKysgYi9pbmNs
dWRlL1NjaW50aWxsYS5pZmFjZQlTYXQgSnVuIDIwIDA5OjIzOjM3IDIwMjYgKzEwMDAKQEAgLTM1
NDIsNiArMzU0MiwxNiBAQAogCiBjYXQgUHJvdmlzaW9uYWwKIAorZW51IFNjYWxlVGVjaG5pcXVl
PVNDQUxFX1RFQ0hOSVFVRV8KK3ZhbCBTQ0FMRV9URUNITklRVUVfREVGQVVMVD0wCit2YWwgU0NB
TEVfVEVDSE5JUVVFX1BJWEVMX0FMSUdORUQ9MQorCisjIFNldCB0aGUgc2NhbGUgdGVjaG5pcXVl
CitzZXQgdm9pZCBTZXRTY2FsZVRlY2huaXF1ZT0yODIwKFNjYWxlVGVjaG5pcXVlIHRlY2huaXF1
ZSwpCisKKyMgR2V0IHRoZSBzY2FsZSB0ZWNobmlxdWUKK2dldCBTY2FsZVRlY2huaXF1ZSBHZXRT
Y2FsZVRlY2huaXF1ZT0yODIxKCwpCisKIGVudSBCaWRpcmVjdGlvbmFsPVNDX0JJRElSRUNUSU9O
QUxfCiB2YWwgU0NfQklESVJFQ1RJT05BTF9ESVNBQkxFRD0wCiB2YWwgU0NfQklESVJFQ1RJT05B
TF9MMlI9MQpkaWZmIC1yIDU0ZDgxMThlOTM4ZiBpbmNsdWRlL1NjaW50aWxsYUNhbGwuaAotLS0g
YS9pbmNsdWRlL1NjaW50aWxsYUNhbGwuaAlUaHUgSnVuIDE4IDEzOjA0OjQ2IDIwMjYgKzEwMDAK
KysrIGIvaW5jbHVkZS9TY2ludGlsbGFDYWxsLmgJU2F0IEp1biAyMCAwOToyMzozNyAyMDI2ICsx
MDAwCkBAIC05MzUsNiArOTM1LDggQEAKIAlpbnQgRGVzY3JpcHRpb25PZlN0eWxlKGludCBzdHls
ZSwgY2hhciAqZGVzY3JpcHRpb24pOwogCXN0ZDo6c3RyaW5nIERlc2NyaXB0aW9uT2ZTdHlsZShp
bnQgc3R5bGUpOwogCXZvaWQgU2V0SUxleGVyKHZvaWQgKmlsZXhlcik7CisJdm9pZCBTZXRTY2Fs
ZVRlY2huaXF1ZShTY2ludGlsbGE6OlNjYWxlVGVjaG5pcXVlIHRlY2huaXF1ZSk7CisJU2NpbnRp
bGxhOjpTY2FsZVRlY2huaXF1ZSBTY2FsZVRlY2huaXF1ZSgpOwogCVNjaW50aWxsYTo6QmlkaXJl
Y3Rpb25hbCBCaWRpcmVjdGlvbmFsKCk7CiAJdm9pZCBTZXRCaWRpcmVjdGlvbmFsKFNjaW50aWxs
YTo6QmlkaXJlY3Rpb25hbCBiaWRpcmVjdGlvbmFsKTsKIApkaWZmIC1yIDU0ZDgxMThlOTM4ZiBp
bmNsdWRlL1NjaW50aWxsYU1lc3NhZ2VzLmgKLS0tIGEvaW5jbHVkZS9TY2ludGlsbGFNZXNzYWdl
cy5oCVRodSBKdW4gMTggMTM6MDQ6NDYgMjAyNiArMTAwMAorKysgYi9pbmNsdWRlL1NjaW50aWxs
YU1lc3NhZ2VzLmgJU2F0IEp1biAyMCAwOToyMzozNyAyMDI2ICsxMDAwCkBAIC04MzEsNiArODMx
LDggQEAKIAlUYWdzT2ZTdHlsZSA9IDQwMzEsCiAJRGVzY3JpcHRpb25PZlN0eWxlID0gNDAzMiwK
IAlTZXRJTGV4ZXIgPSA0MDMzLAorCVNldFNjYWxlVGVjaG5pcXVlID0gMjgyMCwKKwlHZXRTY2Fs
ZVRlY2huaXF1ZSA9IDI4MjEsCiAJR2V0QmlkaXJlY3Rpb25hbCA9IDI3MDgsCiAJU2V0QmlkaXJl
Y3Rpb25hbCA9IDI3MDksCiB9OwpkaWZmIC1yIDU0ZDgxMThlOTM4ZiBpbmNsdWRlL1NjaW50aWxs
YVR5cGVzLmgKLS0tIGEvaW5jbHVkZS9TY2ludGlsbGFUeXBlcy5oCVRodSBKdW4gMTggMTM6MDQ6
NDYgMjAyNiArMTAwMAorKysgYi9pbmNsdWRlL1NjaW50aWxsYVR5cGVzLmgJU2F0IEp1biAyMCAw
OToyMzozNyAyMDI2ICsxMDAwCkBAIC02NTcsNiArNjU3LDExIEBACiAJSW1lUmVzdWx0ID0gMiwK
IH07CiAKK2VudW0gY2xhc3MgU2NhbGVUZWNobmlxdWUgeworCURlZmF1bHQgPSAwLAorCVBpeGVs
QWxpZ25lZCA9IDEsCit9OworCiBlbnVtIGNsYXNzIEJpZGlyZWN0aW9uYWwgewogCURpc2FibGVk
ID0gMCwKIAlMMlIgPSAxLApkaWZmIC1yIDU0ZDgxMThlOTM4ZiBxdC9TY2ludGlsbGFFZGl0QmFz
ZS9QbGF0UXQuY3BwCi0tLSBhL3F0L1NjaW50aWxsYUVkaXRCYXNlL1BsYXRRdC5jcHAJVGh1IEp1
biAxOCAxMzowNDo0NiAyMDI2ICsxMDAwCisrKyBiL3F0L1NjaW50aWxsYUVkaXRCYXNlL1BsYXRR
dC5jcHAJU2F0IEp1biAyMCAwOToyMzozNyAyMDI2ICsxMDAwCkBAIC0xODMsMTMgKzE4MywxNCBA
QAogCiBTdXJmYWNlSW1wbDo6U3VyZmFjZUltcGwoKSA9IGRlZmF1bHQ7CiAKLVN1cmZhY2VJbXBs
OjpTdXJmYWNlSW1wbChpbnQgd2lkdGgsIGludCBoZWlnaHQsIFN1cmZhY2VNb2RlIG1vZGVfKQor
U3VyZmFjZUltcGw6OlN1cmZhY2VJbXBsKGludCB3aWR0aCwgaW50IGhlaWdodCwgU3VyZmFjZU1v
ZGUgbW9kZV8sIHFyZWFsIHNjYWxlXykKIHsKIAlpZiAod2lkdGggPCAxKSB3aWR0aCA9IDE7CiAJ
aWYgKGhlaWdodCA8IDEpIGhlaWdodCA9IDE7CiAJZGV2aWNlT3duZWQgPSB0cnVlOwogCWRldmlj
ZSA9IG5ldyBRUGl4bWFwKHdpZHRoLCBoZWlnaHQpOwogCW1vZGUgPSBtb2RlXzsKKwlzY2FsZSA9
IHNjYWxlXzsKIH0KIAogU3VyZmFjZUltcGw6On5TdXJmYWNlSW1wbCgpCkBAIC0yMTIsMjEgKzIx
Myw4OCBAQAogCXBhaW50ZXJPd25lZCA9IGZhbHNlOwogfQogCitkb3VibGUgU2NhbGVPZldpbmRv
dyhXaW5kb3dJRCB3aWQpCit7CisJY29uc3QgUVdpZGdldCAqd2lkZ2V0ID0gd2luZG93KHdpZCk7
CisJaWYgKCF3aWRnZXQpIHsKKwkJcmV0dXJuIDEuMDsKKwl9CisJY29uc3QgUVZhcmlhbnQgdmFy
aWFudCA9IHdpZGdldC0+cHJvcGVydHkoIlNjaW50aWxsYVNjYWxlIik7CisJcmV0dXJuIHZhcmlh
bnQudG9Eb3VibGUoKTsKK30KKworLy8gRGVmaW5lIFNDSU5USUxMQV9RVF9CQUNLSU5HU1RPUkVf
RklYRUQgd2hlbiBidWlsZGluZyBhZ2FpbnN0IGEgUXQgd2hvc2UKKy8vIGJhY2tpbmcgc3RvcmUg
dHJhY2tzIGRpcnR5IHN0YXRlIGF0IGRldmljZS1waXhlbCByZXNvbHV0aW9uOyB0aGF0IG1ha2Vz
IHRoZQorLy8gZnJhY3Rpb25hbC1zY2FsaW5nIHdvcmthcm91bmRzIGJlbG93IGNvbXBpbGUgb3V0
IGVudGlyZWx5LgorCisjaWYgZGVmaW5lZChRX09TX0FQUExFKSAmJiAhZGVmaW5lZChTQ0lOVElM
TEFfUVRfQkFDS0lOR1NUT1JFX0ZJWEVEKQorLy8gR3JvdyBhIGxvZ2ljYWwgdXBkYXRlIHJlY3Qg
c28gaXRzIGNvb3JkaW5hdGVzIHRyYW5zbGF0ZSBpbnRvIGV2ZW4gZGV2aWNlCisvLyBwaXhlbHMg
dy9vIHJvdW5kaW5nLiBUaGUgY29vcmRpbmF0ZXMgbmVlZCB0byBiZSBldmVuIGJlY2F1c2UgdGhl
cmUncworLy8gYSBkaXJ0eSBncmlkIHRoYXQncyAxLzIgdGhlIHNpemUgb2YgdGhlIGRldmljZSBw
aXhlbCBncmlkIG9uIFJldGluYQorLy8gZGlzcGxheXMuIFRoaXMgbWF5IGdyb3cgdGhlIHJlY3Qg
bW9yZSB0aGFuIG5lZWRlZCBvbiBub24tUmV0aW5hIGRpc3BsYXlzCitzdGF0aWMgUVJlY3QgU25h
cFRvRGV2aWNlUGl4ZWxHcmlkKFFSZWN0IHVwZCwgcXJlYWwgc2NhbGUsIFFTaXplIHdpZGdldFNp
emUpCit7CisJY29uc3QgaW50IGJhY2tpbmcgPSAoc2NhbGUgPj0gMi4wKSA/IDIgOiAxOworCWlm
IChiYWNraW5nID09IDEpCisJCXJldHVybiB1cGQ7ICAgLy8gZ3JpZCBpcyBhbHJlYWR5IGRldmlj
ZS1waXhlbCByZXNvbHV0aW9uOyBub3RoaW5nIHRvIHNuYXAKKworCS8vIHEgbG9naWNhbCBwaXhl
bHMgc3BhbiBxICogKHNjYWxlL2JhY2tpbmcpIGdyaWQgY2VsbHMuICBUaGUgc21hbGxlc3QgcQor
CS8vIHRoYXQgbWFrZXMgdGhpcyB3aG9sZSBpcyB0aGUgc25hcCBwZXJpb2Qgd2hvc2UgbXVsdGlw
bGVzIHB1dCBsb2dpY2FsCisJLy8gZWRnZXMgb24gdGhlIGRldmljZS1waXhlbCBncmlkLiAgKHNj
YWxlL2JhY2tpbmcgaXMgdGhlIGZyYWN0aW9uYWwKKwkvLyBRVF9TQ0FMRV9GQUNUT1IsIGUuZy4g
MS41IC0+IHEgPT0gMiwgMS4yNSAtPiBxID09IDQuKQorCWNvbnN0IGRvdWJsZSB6b29tID0gc2Nh
bGUgLyBiYWNraW5nOworCWludCBxID0gMDsKKwlmb3IgKGludCBuID0gMTsgbiA8PSA4OyArK24p
IHsKKwkJaWYgKHN0ZDo6ZmFicyh6b29tICogbiAtIHN0ZDo6cm91bmQoem9vbSAqIG4pKSA8IDFl
LTQpIHsKKwkJCXEgPSBuOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKHEgPT0gMCkKKwkJcmV0
dXJuIFFSZWN0KCk7ICAgLy8gbm90IGEgc2ltcGxlIHJhdGlvCisJaWYgKHEgPT0gMSkKKwkJcmV0
dXJuIHVwZDsgICAgICAgLy8gYWxyZWFkeSBvbiB0aGUgZ3JpZAorCisJYXV0byBmbG9vclRvID0g
W10oaW50IHYsIGludCBuKSB7IGludCByID0gdiAlIG47IGlmIChyIDwgMCkgciArPSBuOyByZXR1
cm4gdiAtIHI7IH07CisJY29uc3QgaW50IGwgPSBmbG9vclRvKHVwZC5sZWZ0KCksICAgcSk7CisJ
Y29uc3QgaW50IHQgPSBmbG9vclRvKHVwZC50b3AoKSwgICAgcSk7CisJY29uc3QgaW50IHIgPSBm
bG9vclRvKHVwZC5yaWdodCgpICArIHEsIHEpIC0gMTsgICAvLyBjZWlsIHRoZSBleGNsdXNpdmUg
ZWRnZQorCWNvbnN0IGludCBiID0gZmxvb3JUbyh1cGQuYm90dG9tKCkgKyBxLCBxKSAtIDE7CisJ
Y29uc3QgUVJlY3Qgc25hcHBlZChRUG9pbnQobCwgdCksIFFQb2ludChyLCBiKSk7CisJaWYgKHNu
YXBwZWQud2lkdGgoKSA+PSB3aWRnZXRTaXplLndpZHRoKCkgJiYgc25hcHBlZC5oZWlnaHQoKSA+
PSB3aWRnZXRTaXplLmhlaWdodCgpKQorCQlyZXR1cm4gUVJlY3QoKTsgICAvLyB3b3VsZCBjb3Zl
ciB0aGUgd2hvbGUgd2lkZ2V0CisJcmV0dXJuIHNuYXBwZWQ7Cit9CisjZW5kaWYKKworZG91Ymxl
IFNjYWxlVG9NdWx0aXBseShXaW5kb3dJRCB3aWQpCit7CisJY29uc3QgcXJlYWwgc2NhbGUgPSBT
Y2FsZU9mV2luZG93KHdpZCk7CisJcmV0dXJuIHNjYWxlID8gc2NhbGUgOiAxLjA7Cit9CisKIHZv
aWQgU3VyZmFjZUltcGw6OkluaXQoV2luZG93SUQgd2lkKQogewogCVJlbGVhc2UoKTsKLQlkZXZp
Y2UgPSBzdGF0aWNfY2FzdDxRV2lkZ2V0ICo+KHdpZCk7CisJZGV2aWNlID0gd2luZG93KHdpZCk7
CisJc2NhbGUgPSBTY2FsZU9mV2luZG93KHdpZCk7CiB9CiAKIHZvaWQgU3VyZmFjZUltcGw6Oklu
aXQoU3VyZmFjZUlEIHNpZCwgV2luZG93SUQgLyp3aWQqLykKIHsKIAlSZWxlYXNlKCk7CiAJZGV2
aWNlID0gc3RhdGljX2Nhc3Q8UVBhaW50RGV2aWNlICo+KHNpZCk7CisJc2NhbGUgPSAwLjA7CiB9
CiAKIHN0ZDo6dW5pcXVlX3B0cjxTdXJmYWNlPiBTdXJmYWNlSW1wbDo6QWxsb2NhdGVQaXhNYXAo
aW50IHdpZHRoLCBpbnQgaGVpZ2h0KQogewotCXJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPFN1cmZh
Y2VJbXBsPih3aWR0aCwgaGVpZ2h0LCBtb2RlKTsKKwlyZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxT
dXJmYWNlSW1wbD4od2lkdGgsIGhlaWdodCwgbW9kZSwgc2NhbGUpOworfQorCitzdGQ6OnVuaXF1
ZV9wdHI8U3VyZmFjZT4gU3VyZmFjZUltcGxfQWxsb2NhdGVQaXhNYXAoaW50IHdpZHRoLCBpbnQg
aGVpZ2h0LCBTdXJmYWNlTW9kZSBtb2RlLCBxcmVhbCBzY2FsZSkKK3sKKwlyZXR1cm4gc3RkOjpt
YWtlX3VuaXF1ZTxTdXJmYWNlSW1wbD4od2lkdGgsIGhlaWdodCwgbW9kZSwgc2NhbGUpOwogfQog
CiB2b2lkIFN1cmZhY2VJbXBsOjpTZXRNb2RlKFN1cmZhY2VNb2RlIG1vZGVfKQpAQCAtMzA5LDcg
KzM3NywxMSBAQAogCiBpbnQgU3VyZmFjZUltcGw6OkRldmljZUhlaWdodEZvbnQoaW50IHBvaW50
cykKIHsKLQlyZXR1cm4gcG9pbnRzOworCWlmIChzY2FsZSkgeworCQlyZXR1cm4gcG9pbnRzICog
c2NhbGU7CisJfSBlbHNlIHsKKwkJcmV0dXJuIHBvaW50czsKKwl9CiB9CiAKIHZvaWQgU3VyZmFj
ZUltcGw6OkxpbmVEcmF3KFBvaW50IHN0YXJ0LCBQb2ludCBlbmQsIFN0cm9rZSBzdHJva2UpCkBA
IC03OTYsNiArODY4LDEwIEBACiAJCXBhaW50ZXItPnNldFJlbmRlckhpbnQoUVBhaW50ZXI6OlRl
eHRBbnRpYWxpYXNpbmcsIHRydWUpOwogCiAJCXBhaW50ZXItPnNldFJlbmRlckhpbnQoUVBhaW50
ZXI6OkFudGlhbGlhc2luZywgdHJ1ZSk7CisKKwkJaWYgKHNjYWxlKSB7CisJCQlwYWludGVyLT5z
Y2FsZSgxLjAgLyBzY2FsZSwgMS4wIC8gc2NhbGUpOworCQl9CiAJfQogCiAJcmV0dXJuIHBhaW50
ZXI7CkBAIC04MTEsMTEgKzg4Nyw2IEBACiAKIG5hbWVzcGFjZSB7CiAKLVFXaWRnZXQgKndpbmRv
dyhXaW5kb3dJRCB3aWQpIG5vZXhjZXB0Ci17Ci0JcmV0dXJuIHN0YXRpY19jYXN0PFFXaWRnZXQg
Kj4od2lkKTsKLX0KLQogUVJlY3QgU2NyZWVuUmVjdGFuZ2xlRm9yUG9pbnQoUVBvaW50IHBvc0ds
b2JhbCkKIHsKICNpZiBRVF9WRVJTSU9OID49IFFUX1ZFUlNJT05fQ0hFQ0soNSwgMTAsIDApCkBA
IC04NTQsNiArOTI1LDggQEAKIAogdm9pZCBXaW5kb3c6OlNldFBvc2l0aW9uUmVsYXRpdmUoUFJl
Y3RhbmdsZSByYywgY29uc3QgV2luZG93ICpyZWxhdGl2ZVRvKQogeworCWNvbnN0IHFyZWFsIHNj
YWxlID0gU2NhbGVUb011bHRpcGx5KHJlbGF0aXZlVG8tPndpZCk7CisJcmMgPSByYyAvIHNjYWxl
OwogCVFQb2ludCBvUG9zID0gd2luZG93KHJlbGF0aXZlVG8tPndpZCktPm1hcFRvR2xvYmFsKFFQ
b2ludCgwLDApKTsKIAlpbnQgb3ggPSBvUG9zLngoKTsKIAlpbnQgb3kgPSBvUG9zLnkoKTsKQEAg
LTg4NCw3ICs5NTcsOSBAQAogUFJlY3RhbmdsZSBXaW5kb3c6OkdldENsaWVudFBvc2l0aW9uKCkg
Y29uc3QKIHsKIAkvLyBUaGUgY2xpZW50IHBvc2l0aW9uIGlzIHRoZSB3aW5kb3cgcG9zaXRpb24K
LQlyZXR1cm4gR2V0UG9zaXRpb24oKTsKKwljb25zdCBxcmVhbCBzY2FsZSA9IFNjYWxlVG9NdWx0
aXBseSh3aWQpOworCWNvbnN0IFBSZWN0YW5nbGUgcmMgPSBHZXRQb3NpdGlvbigpOworCXJldHVy
biByYyAqIHNjYWxlOwogfQogCiB2b2lkIFdpbmRvdzo6U2hvdyhib29sIHNob3cpCkBAIC05MDEs
OCArOTc2LDM2IEBACiAKIHZvaWQgV2luZG93OjpJbnZhbGlkYXRlUmVjdGFuZ2xlKFBSZWN0YW5n
bGUgcmMpCiB7Ci0JaWYgKHdpZCkKLQkJd2luZG93KHdpZCktPnVwZGF0ZShRUmVjdEZyb21QUmVj
dChyYykpOworCWlmICh3aWQpIHsKKwkJY29uc3QgcXJlYWwgc2NhbGUgPSBTY2FsZU9mV2luZG93
KHdpZCk7CisJCVFSZWN0IHVwZDsKKwkJCisJCWlmICghc2NhbGUpIHsKKwkJCXVwZCA9IFFSZWN0
RnJvbVBSZWN0KHJjKTsKKwkJfQorCQllbHNlIHsKKyNpZiAhZGVmaW5lZChRX09TX1dJTikgJiYg
IWRlZmluZWQoUV9PU19BUFBMRSkKKwkJCS8vIFVzaW5nIFgxMSBvciBXYXlsYW5kLCBsaWtlbHkg
TGludXggYnV0IG1heSBiZSBhIEJTRCBvciBzaW1pbGFyCisJCQlpZiAoc2NhbGUgIT0gMS4wICYm
IHNjYWxlICE9IDIuMCkgeworCQkJCXdpbmRvdyh3aWQpLT51cGRhdGUoKTsKKwkJCQlyZXR1cm47
CisJCQl9CisjZW5kaWYKKwkJCXVwZCA9IFFSZWN0RkZyb21QUmVjdChyYyAvIHNjYWxlKS50b0Fs
aWduZWRSZWN0KCk7CisJCX0KKworI2lmIGRlZmluZWQoUV9PU19BUFBMRSkgJiYgIWRlZmluZWQo
U0NJTlRJTExBX1FUX0JBQ0tJTkdTVE9SRV9GSVhFRCkKKwkJLy8gbWFjT1M6IHNuYXAgdGhlIHVw
ZGF0ZSB0byB0aGUgYmFja2luZyBzdG9yZSdzIGRldmljZS1waXhlbCBncmlkLgorCQljb25zdCBR
UmVjdCBzbmFwcGVkID0gU25hcFRvRGV2aWNlUGl4ZWxHcmlkKHVwZCwgc2NhbGUsIHdpbmRvdyh3
aWQpLT5zaXplKCkpOworCQlpZiAoc25hcHBlZC5pc051bGwoKSkgeworCQkJd2luZG93KHdpZCkt
PnVwZGF0ZSgpOworCQkJcmV0dXJuOworCQl9CisJCXVwZCA9IHNuYXBwZWQ7CisjZW5kaWYKKwor
CQl3aW5kb3cod2lkKS0+dXBkYXRlKHVwZCk7CisJfQogfQogCiB2b2lkIFdpbmRvdzo6U2V0Q3Vy
c29yKEN1cnNvciBjdXJzKQpAQCAtOTk5LDYgKzExMDIsNyBAQAogCWludCB2aXNpYmxlUm93c3s1
fTsKIAlRTWFwPGludCxRUGl4bWFwPiBpbWFnZXM7CiAJZmxvYXQgaW1hZ2VTY2FsZXsxLjB9Owor
CVFXaWRnZXQgKm93bmVyID0gbnVsbHB0cjsKIH07CiBMaXN0Qm94SW1wbDo6TGlzdEJveEltcGwo
KSBub2V4Y2VwdCA9IGRlZmF1bHQ7CiAKQEAgLTEwMTIsNyArMTExNiwxMCBAQAogCXVuaWNvZGVN
b2RlID0gdW5pY29kZU1vZGVfOwogCiAJUVdpZGdldCAqcXBhcmVudCA9IHN0YXRpY19jYXN0PFFX
aWRnZXQgKj4ocGFyZW50LkdldElEKCkpOworCW93bmVyID0gcXBhcmVudDsKIAlMaXN0V2lkZ2V0
ICpsaXN0ID0gbmV3IExpc3RXaWRnZXQocXBhcmVudCk7CisJY29uc3QgcXJlYWwgc2NhbGUgPSBT
Y2FsZU9mV2luZG93KHBhcmVudC5HZXRJRCgpKTsKKwlsaXN0LT5zZXRQcm9wZXJ0eSgiU2NpbnRp
bGxhU2NhbGUiLCBzY2FsZSk7CiAKICNpZiBkZWZpbmVkKFFfT1NfV0lOKQogCS8vIE9uIFdpbmRv
d3MsIFF0OjpUb29sVGlwIGNhdXNlcyBhIGNyYXNoIHdoZW4gdGhlIGxpc3QgaXMgY2xpY2tlZCBv
bgpAQCAtMTA1NCw3ICsxMTYxLDE0IEBACiAJTGlzdFdpZGdldCAqbGlzdCA9IEdldFdpZGdldCgp
OwogCWNvbnN0IEZvbnRBbmRDaGFyYWN0ZXJTZXQgKnBmYWNzID0gQXNGb250QW5kQ2hhcmFjdGVy
U2V0KGZvbnQpOwogCWlmIChwZmFjcyAmJiBwZmFjcy0+cGZvbnQpIHsKLQkJbGlzdC0+c2V0Rm9u
dCgqKHBmYWNzLT5wZm9udCkpOworCQlRRm9udCBmb250RGVTY2FsZWQgPSAqKHBmYWNzLT5wZm9u
dCk7CisJCWNvbnN0IHFyZWFsIHNjYWxlT3duZXIgPSBTY2FsZU9mV2luZG93KG93bmVyKTsKKwkJ
aWYgKHNjYWxlT3duZXIpIHsKKwkJCWNvbnN0IHFyZWFsIHNjYWxlID0gd2luZG93KG93bmVyKS0+
ZGV2aWNlUGl4ZWxSYXRpb0YoKTsKKwkJCXFyZWFsIHBvaW50U2l6ZSA9IGZvbnREZVNjYWxlZC5w
b2ludFNpemVGKCkgLyBzY2FsZTsKKwkJCWZvbnREZVNjYWxlZC5zZXRQb2ludFNpemVGKHBvaW50
U2l6ZSk7CisJCX0KKwkJbGlzdC0+c2V0Rm9udChmb250RGVTY2FsZWQpOwogCX0KIH0KIHZvaWQg
TGlzdEJveEltcGw6OlNldEF2ZXJhZ2VDaGFyV2lkdGgoaW50IC8qd2lkdGgqLykge30KQEAgLTEw
ODEsMTAgKzExOTUsMTEgQEAKIAlRU3R5bGUgKnN0eWxlID0gUUFwcGxpY2F0aW9uOjpzdHlsZSgp
OwogCWludCB3aWR0aCA9IGxpc3QtPnNpemVIaW50Rm9yQ29sdW1uKDApICsgKDIgKiBsaXN0LT5m
cmFtZVdpZHRoKCkpOwogCWlmIChMZW5ndGgoKSA+IHJvd3MpIHsKLQkJd2lkdGggKz0gc3R5bGUt
PnBpeGVsTWV0cmljKFFTdHlsZTo6UE1fU2Nyb2xsQmFyRXh0ZW50KTsKKwkJd2lkdGggKz0gc3R5
bGUtPnBpeGVsTWV0cmljKFFTdHlsZTo6UE1fU2Nyb2xsQmFyRXh0ZW50KSArIDE7CiAJfQogCi0J
cmV0dXJuIFBSZWN0YW5nbGUoMCwgMCwgd2lkdGgsIGhlaWdodCk7CisJY29uc3QgcXJlYWwgc2Nh
bGUgPSBTY2FsZU9mV2luZG93KHdpZCk7CisJcmV0dXJuIFBSZWN0YW5nbGUoMCwgMCwgd2lkdGgs
IGhlaWdodCkgKiAoc2NhbGUgPyBzY2FsZSA6IDEuMCk7CiB9CiBpbnQgTGlzdEJveEltcGw6OkNh
cmV0RnJvbUVkZ2UoKQogewpkaWZmIC1yIDU0ZDgxMThlOTM4ZiBxdC9TY2ludGlsbGFFZGl0QmFz
ZS9QbGF0UXQuaAotLS0gYS9xdC9TY2ludGlsbGFFZGl0QmFzZS9QbGF0UXQuaAlUaHUgSnVuIDE4
IDEzOjA0OjQ2IDIwMjYgKzEwMDAKKysrIGIvcXQvU2NpbnRpbGxhRWRpdEJhc2UvUGxhdFF0LmgJ
U2F0IEp1biAyMCAwOToyMzozNyAyMDI2ICsxMDAwCkBAIC03NCw2ICs3NCwxMyBAQAogCXJldHVy
biBRUG9pbnRGKHFwLngsIHFwLnkpOwogfQogCitpbmxpbmUgUVdpZGdldCAqd2luZG93KFdpbmRv
d0lEIHdpZCkgbm9leGNlcHQKK3sKKwlyZXR1cm4gc3RhdGljX2Nhc3Q8UVdpZGdldCAqPih3aWQp
OworfQorCitkb3VibGUgU2NhbGVPZldpbmRvdyhXaW5kb3dJRCB3aWQpOworCiBjbGFzcyBTdXJm
YWNlSW1wbCA6IHB1YmxpYyBTdXJmYWNlIHsKIHByaXZhdGU6CiAJUVBhaW50RGV2aWNlICpkZXZp
Y2UgPSBudWxscHRyOwpAQCAtODEsNiArODgsNyBAQAogCWJvb2wgZGV2aWNlT3duZWQgPSBmYWxz
ZTsKIAlib29sIHBhaW50ZXJPd25lZCA9IGZhbHNlOwogCVN1cmZhY2VNb2RlIG1vZGU7CisJcXJl
YWwgc2NhbGUgPSAwLjA7CiAJY29uc3QgY2hhciAqY29kZWNOYW1lID0gbnVsbHB0cjsKIAlRVGV4
dENvZGVjICpjb2RlYyA9IG51bGxwdHI7CiAKQEAgLTg4LDcgKzk2LDcgQEAKIAogcHVibGljOgog
CVN1cmZhY2VJbXBsKCk7Ci0JU3VyZmFjZUltcGwoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBTdXJm
YWNlTW9kZSBtb2RlXyk7CisJU3VyZmFjZUltcGwoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBTdXJm
YWNlTW9kZSBtb2RlXywgcXJlYWwgc2NhbGVfKTsKIAl2aXJ0dWFsIH5TdXJmYWNlSW1wbCgpIG92
ZXJyaWRlOwogCiAJdm9pZCBJbml0KFdpbmRvd0lEIHdpZCkgb3ZlcnJpZGU7CkBAIC0xNjQsNiAr
MTcyLDggQEAKIAlRUGFpbnRlciAqR2V0UGFpbnRlcigpOwogfTsKIAorc3RkOjp1bmlxdWVfcHRy
PFN1cmZhY2U+IFN1cmZhY2VJbXBsX0FsbG9jYXRlUGl4TWFwKGludCB3aWR0aCwgaW50IGhlaWdo
dCwgU3VyZmFjZU1vZGUgbW9kZSwgcXJlYWwgc2NhbGUpOworCiB9CiAKICNlbmRpZgpkaWZmIC1y
IDU0ZDgxMThlOTM4ZiBxdC9TY2ludGlsbGFFZGl0QmFzZS9TY2ludGlsbGFFZGl0QmFzZS5jcHAK
LS0tIGEvcXQvU2NpbnRpbGxhRWRpdEJhc2UvU2NpbnRpbGxhRWRpdEJhc2UuY3BwCVRodSBKdW4g
MTggMTM6MDQ6NDYgMjAyNiArMTAwMAorKysgYi9xdC9TY2ludGlsbGFFZGl0QmFzZS9TY2ludGls
bGFFZGl0QmFzZS5jcHAJU2F0IEp1biAyMCAwOToyMzozNyAyMDI2ICsxMDAwCkBAIC0xMjcsNiAr
MTI3LDEzIEBACiAJfSBlbHNlIGlmIChldmVudC0+dHlwZSgpID09IFFFdmVudDo6SGlkZSkgewog
CQlzZXRNb3VzZVRyYWNraW5nKGZhbHNlKTsKIAkJcmVzdWx0ID0gUUFic3RyYWN0U2Nyb2xsQXJl
YTo6ZXZlbnQoZXZlbnQpOworI2lmIFFUX1ZFUlNJT04gPj0gUVRfVkVSU0lPTl9DSEVDSyg2LCA2
LCAwKQorCX0gZWxzZSBpZiAoZXZlbnQtPnR5cGUoKSA9PSBRRXZlbnQ6OkRldmljZVBpeGVsUmF0
aW9DaGFuZ2UpIHsKKwkJLy8gUmVzZXQgY2FjaGVkIGRhdGEKKwkJc3F0LT5TZXRTY2FsZVByb3Bl
cnR5KCk7CisJCXNxdC0+SW52YWxpZGF0ZVN0eWxlUmVkcmF3KCk7CisJCXJlc3VsdCA9IFFBYnN0
cmFjdFNjcm9sbEFyZWE6OmV2ZW50KGV2ZW50KTsKKyNlbmRpZgogCX0gZWxzZSB7CiAJCXJlc3Vs
dCA9IFFBYnN0cmFjdFNjcm9sbEFyZWE6OmV2ZW50KGV2ZW50KTsKIAl9CkBAIC0zMTgsNyArMzI1
LDcgQEAKIAogdm9pZCBTY2ludGlsbGFFZGl0QmFzZTo6bW91c2VQcmVzc0V2ZW50KFFNb3VzZUV2
ZW50ICpldmVudCkKIHsKLQljb25zdCBQb2ludCBwb3MgPSBQb2ludEZyb21RUG9pbnQoZXZlbnQt
PnBvcygpKTsKKwljb25zdCBQb2ludCBwb3MgPSBQb2ludEZyb21RUG9pbnQoZXZlbnQtPnBvcygp
KSAqIChzcXQtPklzUGl4ZWxBbGlnbmVkU2NhbGUoKSA/IGRldmljZVBpeGVsUmF0aW9GKCkgOiAx
LjApOwogCiAJZW1pdCBidXR0b25QcmVzc2VkKGV2ZW50KTsKIApAQCAtMzQ3LDcgKzM1NCw3IEBA
CiAKIHZvaWQgU2NpbnRpbGxhRWRpdEJhc2U6Om1vdXNlUmVsZWFzZUV2ZW50KFFNb3VzZUV2ZW50
ICpldmVudCkKIHsKLQljb25zdCBRUG9pbnQgcG9pbnQgPSBldmVudC0+cG9zKCk7CisJY29uc3Qg
UVBvaW50IHBvaW50ID0gZXZlbnQtPnBvcygpICogKHNxdC0+SXNQaXhlbEFsaWduZWRTY2FsZSgp
ID8gZGV2aWNlUGl4ZWxSYXRpb0YoKSA6IDEuMCk7CiAJaWYgKGV2ZW50LT5idXR0b24oKSA9PSBR
dDo6TGVmdEJ1dHRvbikKIAkJc3F0LT5CdXR0b25VcFdpdGhNb2RpZmllcnMoUG9pbnRGcm9tUVBv
aW50KHBvaW50KSwgVGltZU9mRXZlbnQodGltZSksIE1vZGlmaWVyc09mS2V5Ym9hcmQoKSk7CiAK
QEAgLTM2Nyw3ICszNzQsNyBAQAogCiB2b2lkIFNjaW50aWxsYUVkaXRCYXNlOjptb3VzZU1vdmVF
dmVudChRTW91c2VFdmVudCAqZXZlbnQpCiB7Ci0JY29uc3QgUG9pbnQgcG9zID0gUG9pbnRGcm9t
UVBvaW50KGV2ZW50LT5wb3MoKSk7CisJY29uc3QgUG9pbnQgcG9zID0gUG9pbnRGcm9tUVBvaW50
KGV2ZW50LT5wb3MoKSkgICogKHNxdC0+SXNQaXhlbEFsaWduZWRTY2FsZSgpID8gZGV2aWNlUGl4
ZWxSYXRpb0YoKSA6IDEuMCk7CiAKIAljb25zdCBib29sIHNoaWZ0ID0gUUFwcGxpY2F0aW9uOjpr
ZXlib2FyZE1vZGlmaWVycygpICYgUXQ6OlNoaWZ0TW9kaWZpZXI7CiAJY29uc3QgYm9vbCBjdHJs
ICA9IFFBcHBsaWNhdGlvbjo6a2V5Ym9hcmRNb2RpZmllcnMoKSAmIFF0OjpDb250cm9sTW9kaWZp
ZXI7CmRpZmYgLXIgNTRkODExOGU5MzhmIHF0L1NjaW50aWxsYUVkaXRCYXNlL1NjaW50aWxsYUVk
aXRCYXNlLnBybwotLS0gYS9xdC9TY2ludGlsbGFFZGl0QmFzZS9TY2ludGlsbGFFZGl0QmFzZS5w
cm8JVGh1IEp1biAxOCAxMzowNDo0NiAyMDI2ICsxMDAwCisrKyBiL3F0L1NjaW50aWxsYUVkaXRC
YXNlL1NjaW50aWxsYUVkaXRCYXNlLnBybwlTYXQgSnVuIDIwIDA5OjIzOjM3IDIwMjYgKzEwMDAK
QEAgLTEwMCw3ICsxMDAsNyBAQAogICAgIERFRklORVMgKz0gTkRFQlVHPTEKIH0KIAotREVTVERJ
UiA9IC4uLy4uL2JpbgorREVTVERJUiA9ICQkX1BST19GSUxFX1BXRF8vLi4vLi4vYmluCiAKIG1h
Y3ggewogCVFNQUtFX0xGTEFHU19TT05BTUUgPSAtV2wsLWluc3RhbGxfbmFtZSxAZXhlY3V0YWJs
ZV9wYXRoLy4uL0ZyYW1ld29ya3MvCmRpZmYgLXIgNTRkODExOGU5MzhmIHF0L1NjaW50aWxsYUVk
aXRCYXNlL1NjaW50aWxsYVF0LmNwcAotLS0gYS9xdC9TY2ludGlsbGFFZGl0QmFzZS9TY2ludGls
bGFRdC5jcHAJVGh1IEp1biAxOCAxMzowNDo0NiAyMDI2ICsxMDAwCisrKyBiL3F0L1NjaW50aWxs
YUVkaXRCYXNlL1NjaW50aWxsYVF0LmNwcAlTYXQgSnVuIDIwIDA5OjIzOjM3IDIwMjYgKzEwMDAK
QEAgLTMzLDYgKzMzLDcgQEAKIHsKIAogCXdNYWluID0gc2Nyb2xsQXJlYS0+dmlld3BvcnQoKTsK
KwlzY3JvbGxBcmVhLT52aWV3cG9ydCgpLT5zZXRQcm9wZXJ0eSgiU2NpbnRpbGxhU2NhbGUiLCAw
LjApOwogCiAJaW1lSW50ZXJhY3Rpb24gPSBJTUVJbnRlcmFjdGlvbjo6SW5saW5lOwogCkBAIC0y
NzYsNiArMjc3LDExIEBACiB2b2lkIFNjaW50aWxsYVF0OjpTY3JvbGxUZXh0KFNjaTo6TGluZSBs
aW5lc1RvTW92ZSkKIHsKIAlpbnQgZHkgPSB2cy5saW5lSGVpZ2h0ICogKGxpbmVzVG9Nb3ZlKTsK
KwlpZiAoSXNQaXhlbEFsaWduZWRTY2FsZSgpKSB7CisJCS8vIGxpbmVIZWlnaHQgaXMgaW4gZGV2
aWNlIHBpeGVscywgdmlld3BvcnQoKS0+c2Nyb2xsKCkgbmVlZHMgbG9naWNhbCBwaXhlbHMKKwkJ
Y29uc3QgcXJlYWwgc2NhbGUgPSB3aW5kb3cod01haW4uR2V0SUQoKSktPmRldmljZVBpeGVsUmF0
aW9GKCk7CisJCWR5ID0gcVJvdW5kKGR5IC8gc2NhbGUpOworCX0KIAlzY3JvbGxBcmVhLT52aWV3
cG9ydCgpLT5zY3JvbGwoMCwgZHkpOwogfQogCkBAIC03MTUsNyArNzIxLDEzIEBACiAKIAlpZiAo
IWN0LndDYWxsVGlwLkNyZWF0ZWQoKSkgewogCQlRV2lkZ2V0ICpwQ2FsbFRpcCA9IG5ldyBDYWxs
VGlwSW1wbChzY3JvbGxBcmVhLT53aW5kb3coKS0+d2luZG93SGFuZGxlKCksICZjdCk7CisJCWNv
bnN0IHFyZWFsIHNjYWxlRGV2aWNlID0gU2NhbGVPZldpbmRvdyh3TWFpbi5HZXRJRCgpKTsKKwkJ
cENhbGxUaXAtPnNldFByb3BlcnR5KCJTY2ludGlsbGFTY2FsZSIsCisJCQlzY2FsZVRlY2huaXF1
ZSA9PSBTY2FsZVRlY2huaXF1ZTo6UGl4ZWxBbGlnbmVkID8gc2NhbGVEZXZpY2UgOiAwLjApOwor
CiAJCWN0LndDYWxsVGlwID0gcENhbGxUaXA7CisJCWlmIChzY2FsZURldmljZSkKKwkJCXJjID0g
cmMgKiBzY2FsZURldmljZTsKIAkJcENhbGxUaXAtPm1vdmUocmMubGVmdCwgcmMudG9wKTsKIAkJ
cENhbGxUaXAtPnJlc2l6ZShyYy5XaWR0aCgpLCByYy5IZWlnaHQoKSk7CiAJfQpAQCAtNzcxLDYg
Kzc4MywxNiBAQAogCQljYXNlIE1lc3NhZ2U6OkdldFJlY3Rhbmd1bGFyU2VsZWN0aW9uTW9kaWZp
ZXI6CiAJCQlyZXR1cm4gcmVjdGFuZ3VsYXJTZWxlY3Rpb25Nb2RpZmllcjsKIAorCQljYXNlIE1l
c3NhZ2U6OlNldFNjYWxlVGVjaG5pcXVlOgorCQkJc2NhbGVUZWNobmlxdWUgPSBzdGF0aWNfY2Fz
dDxTY2FsZVRlY2huaXF1ZT4od1BhcmFtKTsKKwkJCS8vIFNjYWxlIHByb3BlcnR5IG5lZWRzIHRv
IGJlIHNldCBiZWZvcmUgSW52YWxpZGF0ZVN0eWxlUmVkcmF3KCkKKwkJCVNldFNjYWxlUHJvcGVy
dHkoKTsKKwkJCUludmFsaWRhdGVTdHlsZVJlZHJhdygpOworCQkJYnJlYWs7CisKKwkJY2FzZSBN
ZXNzYWdlOjpHZXRTY2FsZVRlY2huaXF1ZToKKwkJCXJldHVybiBzdGF0aWNfY2FzdDxzcHRyX3Q+
KHNjYWxlVGVjaG5pcXVlKTsKKwogCQlkZWZhdWx0OgogCQkJcmV0dXJuIFNjaW50aWxsYUJhc2U6
OlduZFByb2MoaU1lc3NhZ2UsIHdQYXJhbSwgbFBhcmFtKTsKIAkJfQpAQCAtODA1LDIwICs4Mjcs
NTUgQEAKIAlyZXR1cm4gcmV0dXJuVmFsdWU7CiB9CiAKK3ZvaWQgU2NpbnRpbGxhUXQ6OlNldFNj
YWxlUHJvcGVydHkoKQoreworCXFyZWFsIHNjYWxlID0gMC4wOworCWlmIChzY2FsZVRlY2huaXF1
ZSA9PSBTY2FsZVRlY2huaXF1ZTo6UGl4ZWxBbGlnbmVkKSB7CisJCVFXaWRnZXQgKndpZGdldCA9
IHdpbmRvdyh3TWFpbi5HZXRJRCgpKTsKKwkJc2NhbGUgPSB3aWRnZXQtPmRldmljZVBpeGVsUmF0
aW9GKCk7CisJfQorCXNjcm9sbEFyZWEtPnZpZXdwb3J0KCktPnNldFByb3BlcnR5KCJTY2ludGls
bGFTY2FsZSIsIHNjYWxlKTsKK30KKwogLy8gQWRkaXRpb25zIHRvIG1lcmdlIGluIFNjaWVudGlm
aWMgVG9vbHdvcmtzIHdpZGdldCBzdHJ1Y3R1cmUKIAogdm9pZCBTY2ludGlsbGFRdDo6UGFydGlh
bFBhaW50KGNvbnN0IFBSZWN0YW5nbGUgJnJlY3QpCiB7Ci0JcmNQYWludCA9IHJlY3Q7CisJU2V0
U2NhbGVQcm9wZXJ0eSgpOworCWlmIChzY2FsZVRlY2huaXF1ZSA9PSBTY2FsZVRlY2huaXF1ZTo6
UGl4ZWxBbGlnbmVkKSB7CisJCVFXaWRnZXQgKndpZGdldCA9IHdpbmRvdyh3TWFpbi5HZXRJRCgp
KTsKKwkJcmNQYWludCA9IHJlY3QgKiB3aWRnZXQtPmRldmljZVBpeGVsUmF0aW9GKCk7CisJfSBl
bHNlIHsKKwkJcmNQYWludCA9IHJlY3Q7CisJfQogCXBhaW50U3RhdGUgPSBQYWludFN0YXRlOjpw
YWludGluZzsKIAlQUmVjdGFuZ2xlIHJjQ2xpZW50ID0gR2V0Q2xpZW50UmVjdGFuZ2xlKCk7CiAJ
cGFpbnRpbmdBbGxUZXh0ID0gcmNQYWludC5Db250YWlucyhyY0NsaWVudCk7CiAKIAlBdXRvU3Vy
ZmFjZSBzdXJmYWNlUGFpbnQodGhpcyk7Ci0JUGFpbnQoc3VyZmFjZVBhaW50LCByY1BhaW50KTsK
KwlpZiAoc2NhbGVUZWNobmlxdWUgPT0gU2NhbGVUZWNobmlxdWU6OlBpeGVsQWxpZ25lZCkgewor
CQkvLyBDcmVhdGUgQml0bWFwIG9mIGV4YWN0bHkgd2luZG93IHNpemUgdGhlbiBibGl0IGFmdGVy
IFBhaW50IGNhbGwKKwkJUVdpZGdldCAqd2lkZ2V0ID0gd2luZG93KHdNYWluLkdldElEKCkpOwor
CQljb25zdCBxcmVhbCBzY2FsZSA9IHdpZGdldC0+ZGV2aWNlUGl4ZWxSYXRpb0YoKTsKKwkJY29u
c3QgUVNpemUgc3ogPSB3aWRnZXQtPnNpemUoKSAqIHNjYWxlOworCQljb25zdCBpbnQgdyA9IHN6
LndpZHRoKCk7CisJCWNvbnN0IGludCBoID0gc3ouaGVpZ2h0KCk7CisJCXN0ZDo6dW5pcXVlX3B0
cjxTdXJmYWNlPiBzdXJmUGl4ID0gU3VyZmFjZUltcGxfQWxsb2NhdGVQaXhNYXAodywgaCwgQ3Vy
cmVudFN1cmZhY2VNb2RlKCksIDAuMCk7CisJCVBSZWN0YW5nbGUgcmNTY2FsZWQgPSBQUmVjdGFu
Z2xlOjpGcm9tSW50cygwLCAwLCB3LCBoKTsKKwkJUGFpbnQoc3VyZlBpeC5nZXQoKSwgcmNTY2Fs
ZWQpOworCQlzdXJmYWNlUGFpbnQtPkNvcHkocmNTY2FsZWQsIFBvaW50KDAsMCksICpzdXJmUGl4
KTsKKwl9IGVsc2UgeworCQlQYWludChzdXJmYWNlUGFpbnQsIHJjUGFpbnQpOworCX0KIAlzdXJm
YWNlUGFpbnQtPlJlbGVhc2UoKTsKIAogCWlmIChwYWludFN0YXRlID09IFBhaW50U3RhdGU6OmFi
YW5kb25lZCkgeworCQlpZiAoc2NhbGVUZWNobmlxdWUgPT0gU2NhbGVUZWNobmlxdWU6OlBpeGVs
QWxpZ25lZCkgeworCQkJLy8gU2hvdWxkIHRyeSBtb3JlIHJlcGFpciBidXQganVzdCBxdWV1ZSBh
IGZ1bGwgcmVwYWludC4KKwkJCXNjcm9sbEFyZWEtPnZpZXdwb3J0KCktPnVwZGF0ZSgpOworCQkJ
cGFpbnRTdGF0ZSA9IFBhaW50U3RhdGU6Om5vdFBhaW50aW5nOworCQkJcmV0dXJuOworCQl9CiAJ
CS8vIEZJWE1FOiBGYWlsdXJlIHRvIHBhaW50IHRoZSByZXF1ZXN0ZWQgcmVjdGFuZ2xlIGluIGVh
Y2gKIAkJLy8gcGFpbnQgZXZlbnQgY2F1c2VzIGZsaWNrZXIgb24gc29tZSBwbGF0Zm9ybXMgKE1h
Yz8pCiAJCS8vIFBhaW50IHJlY3QgaW1tZWRpYXRlbHkuCmRpZmYgLXIgNTRkODExOGU5MzhmIHF0
L1NjaW50aWxsYUVkaXRCYXNlL1NjaW50aWxsYVF0LmgKLS0tIGEvcXQvU2NpbnRpbGxhRWRpdEJh
c2UvU2NpbnRpbGxhUXQuaAlUaHUgSnVuIDE4IDEzOjA0OjQ2IDIwMjYgKzEwMDAKKysrIGIvcXQv
U2NpbnRpbGxhRWRpdEJhc2UvU2NpbnRpbGxhUXQuaAlTYXQgSnVuIDIwIDA5OjIzOjM3IDIwMjYg
KzEwMDAKQEAgLTE1Niw2ICsxNTYsMTEgQEAKIAlzdGF0aWMgc3B0cl90IERpcmVjdFN0YXR1c0Z1
bmN0aW9uKHNwdHJfdCBwdHIsCiAJCQkJICAgICB1bnNpZ25lZCBpbnQgaU1lc3NhZ2UsIHVwdHJf
dCB3UGFyYW0sIHNwdHJfdCBsUGFyYW0sIGludCAqcFN0YXR1cyk7CiAKKwl2b2lkIFNldFNjYWxl
UHJvcGVydHkoKTsKKwlib29sIElzUGl4ZWxBbGlnbmVkU2NhbGUoKSBjb25zdCBub2V4Y2VwdCB7
CisJCXJldHVybiBzY2FsZVRlY2huaXF1ZSA9PSBTY2FsZVRlY2huaXF1ZTo6UGl4ZWxBbGlnbmVk
OworCX0KKwogcHJvdGVjdGVkOgogCiAJdm9pZCBQYXJ0aWFsUGFpbnQoY29uc3QgUFJlY3Rhbmds
ZSAmcmVjdCk7CkBAIC0xNzgsNiArMTgzLDggQEAKIAlib29sIGRyYWdXYXNEcm9wcGVkOwogCWlu
dCByZWN0YW5ndWxhclNlbGVjdGlvbk1vZGlmaWVyOwogCisJU2NhbGVUZWNobmlxdWUgc2NhbGVU
ZWNobmlxdWUgPSBTY2FsZVRlY2huaXF1ZTo6RGVmYXVsdDsKKwogCWZyaWVuZCBjbGFzcyA6OlNj
aW50aWxsYUVkaXRCYXNlOwogfTsKIApkaWZmIC1yIDU0ZDgxMThlOTM4ZiBzcmMvR2VvbWV0cnku
aAotLS0gYS9zcmMvR2VvbWV0cnkuaAlUaHUgSnVuIDE4IDEzOjA0OjQ2IDIwMjYgKzEwMDAKKysr
IGIvc3JjL0dlb21ldHJ5LmgJU2F0IEp1biAyMCAwOToyMzozNyAyMDI2ICsxMDAwCkBAIC00NSw2
ICs0NSwxMCBAQAogCQlyZXR1cm4gUG9pbnQoeCAtIG90aGVyLngsIHkgLSBvdGhlci55KTsKIAl9
CiAKKwljb25zdGV4cHIgUG9pbnQgb3BlcmF0b3IqKFhZUE9TSVRJT04gbXVsdGlwbGllcikgY29u
c3Qgbm9leGNlcHQgeworCQlyZXR1cm4gUG9pbnQoeCAqIG11bHRpcGxpZXIsIHkgKiBtdWx0aXBs
aWVyKTsKKwl9CisKIAkvLyBPdGhlciBhdXRvbWF0aWNhbGx5IGRlZmluZWQgbWV0aG9kcyAoYXNz
aWdubWVudCwgY29weSBjb25zdHJ1Y3RvciwgZGVzdHJ1Y3RvcikgYXJlIGZpbmUKIH07CiAKQEAg
LTEwMSw2ICsxMDUsMTUgQEAKIAkJcmV0dXJuIChyYy5sZWZ0ID09IGxlZnQpICYmIChyYy5yaWdo
dCA9PSByaWdodCkgJiYKIAkJCShyYy50b3AgPT0gdG9wKSAmJiAocmMuYm90dG9tID09IGJvdHRv
bSk7CiAJfQorCQorCWNvbnN0ZXhwciBQUmVjdGFuZ2xlIG9wZXJhdG9yKihYWVBPU0lUSU9OIG11
bHRpcGxpZXIpIGNvbnN0IG5vZXhjZXB0IHsKKwkJcmV0dXJuIFBSZWN0YW5nbGUobGVmdCAqIG11
bHRpcGxpZXIsIHRvcCAqIG11bHRpcGxpZXIsIHJpZ2h0ICogbXVsdGlwbGllciwgYm90dG9tICog
bXVsdGlwbGllcik7CisJfQorCisJY29uc3RleHByIFBSZWN0YW5nbGUgb3BlcmF0b3IvKFhZUE9T
SVRJT04gZGl2aXNvcikgY29uc3Qgbm9leGNlcHQgeworCQlyZXR1cm4gUFJlY3RhbmdsZShsZWZ0
IC8gZGl2aXNvciwgdG9wIC8gZGl2aXNvciwgcmlnaHQgLyBkaXZpc29yLCBib3R0b20gLyBkaXZp
c29yKTsKKwl9CisKIAljb25zdGV4cHIgYm9vbCBDb250YWlucyhQb2ludCBwdCkgY29uc3Qgbm9l
eGNlcHQgewogCQlyZXR1cm4gKHB0LnggPj0gbGVmdCkgJiYgKHB0LnggPD0gcmlnaHQpICYmCiAJ
CQkocHQueSA+PSB0b3ApICYmIChwdC55IDw9IGJvdHRvbSk7Cg==
--0000000000002936a10654f347a4--