Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 4 May 2012 12:23:06 -0400
From:      Patrick Kelsey <kelsey@ieee.org>
To:        freebsd-mips@freebsd.org
Subject:   Re: [PATCH] MMC/SD SPI-mode driver
Message-ID:  <CAD44qMUTc06kQQo9aa9gZ-eYFrJMAYd1L1cnBz25XBzPJ7zcyw@mail.gmail.com>
In-Reply-To: <CAD44qMW5jyno5BB%2BQg0Tg_wZA3opK%2BYVUzXHO69Y27ZKtDm7Ew@mail.gmail.com>
References:  <CAD44qMW5jyno5BB%2BQg0Tg_wZA3opK%2BYVUzXHO69Y27ZKtDm7Ew@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
--0023544706e0e22de504bf385516
Content-Type: text/plain; charset=ISO-8859-1

On Sat, Mar 10, 2012 at 9:13 PM, Patrick Kelsey <kelsey@ieee.org> wrote:

> There are two .diff files attached to this message.  The first is an
> MMC/SD SPI-mode driver (mmcspi) that implements the existing mmc/sd
> bridge interface and talks to the spibus interface (the latter with a
> few modifications).  The second is the changes to the ar71xx_spi
> driver that I made to support the mmcspi driver.  I developed these
> patches using a MikroTik RB450G and tested it with 31 different
> microSD cards.
>
> Change details for mmcspi.diff:
>
> Existing mmc/sd stack:
> - Added concept of bus type (bus_type_sd vs. bus_type_spi)
> - Fixed some typos
> - Fixed some math errors in csd decode
> - Fixed bad lookup table
> - Fixed bad arg to mmc_send_app_op_cond() during probe
> - Added setting of block length on card
> - Added detection (and skipping) of password-locked cards
> - Avoid card select and bus timing commands when bus type is bus_type_spi
> - Added new command flag MMC_CMD_IS_APP to annotate ACMD_x commands
>
> Existing spibus interface:
> - Incorporated Luiz Otavio O Souza's acquire/release/write patch
> - Added configuration methods
> - Added flag to allow transactions with chip select high (needed for
>  proper sd card init)
>
>
> Change details for ar71xx_spi.diff
> - Incorporated Luiz Otavio O Souza's patch implementing his changes to
> spibus_if
> - Added configuration methods and clock setting support
>
>

I updated the patches to apply cleanly against -HEAD (r234999) and removed
a lookup table bug fix in mmc.c that has since been fixed separately.

-Patrick

--0023544706e0e22de504bf385516
Content-Type: application/octet-stream; name="mmcspi_r234999.diff"
Content-Disposition: attachment; filename="mmcspi_r234999.diff"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_h1tgbboq2

SW5kZXg6IHN5cy9hcm0vYXQ5MS9hdDkxX21jaS5jCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHN5cy9hcm0vYXQ5
MS9hdDkxX21jaS5jCShyZXZpc2lvbiAyMzQ5OTkpCisrKyBzeXMvYXJtL2F0OTEvYXQ5MV9tY2ku
Ywkod29ya2luZyBjb3B5KQpAQCAtNjk5LDYgKzY5OSw5IEBACiAJc3dpdGNoICh3aGljaCkgewog
CWRlZmF1bHQ6CiAJCXJldHVybiAoRUlOVkFMKTsKKwljYXNlIE1NQ0JSX0lWQVJfQlVTX1RZUEU6
CisJCSooaW50ICopcmVzdWx0ID0gYnVzX3R5cGVfc2Q7CisJCWJyZWFrOwogCWNhc2UgTU1DQlJf
SVZBUl9CVVNfTU9ERToKIAkJKihpbnQgKilyZXN1bHQgPSBzYy0+aG9zdC5pb3MuYnVzX21vZGU7
CiAJCWJyZWFrOwpAQCAtNzgyLDYgKzc4NSw3IEBACiAJCXNjLT5ob3N0Lmlvcy52ZGQgPSB2YWx1
ZTsKIAkJYnJlYWs7CiAJLyogVGhlc2UgYXJlIHJlYWQtb25seSAqLworCWNhc2UgTU1DQlJfSVZB
Ul9CVVNfVFlQRToKIAljYXNlIE1NQ0JSX0lWQVJfQ0FQUzoKIAljYXNlIE1NQ0JSX0lWQVJfSE9T
VF9PQ1I6CiAJY2FzZSBNTUNCUl9JVkFSX0ZfTUlOOgpJbmRleDogc3lzL2NvbmYvZmlsZXMKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gc3lzL2NvbmYvZmlsZXMJKHJldmlzaW9uIDIzNDk5OSkKKysrIHN5cy9jb25m
L2ZpbGVzCSh3b3JraW5nIGNvcHkpCkBAIC0xNjA2LDYgKzE2MDYsNyBAQAogZGV2L21tYy9tbWNi
cl9pZi5tCQlzdGFuZGFyZAogZGV2L21tYy9tbWNidXNfaWYubQkJc3RhbmRhcmQKIGRldi9tbWMv
bW1jc2QuYwkJCW9wdGlvbmFsIG1tY3NkCitkZXYvbW1jL21tY3NwaS5jCQlvcHRpb25hbCBtbWNz
cGkKIGRldi9tbi9pZl9tbi5jCQkJb3B0aW9uYWwgbW4gcGNpCiBkZXYvbXBzL21wcy5jCQkJb3B0
aW9uYWwgbXBzCiBkZXYvbXBzL21wc19jb25maWcuYwkJb3B0aW9uYWwgbXBzCkluZGV4OiBzeXMv
bW9kdWxlcy9tbWNzcGkvTWFrZWZpbGUKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gc3lzL21vZHVsZXMvbW1jc3Bp
L01ha2VmaWxlCShyZXZpc2lvbiAwKQorKysgc3lzL21vZHVsZXMvbW1jc3BpL01ha2VmaWxlCShy
ZXZpc2lvbiAwKQpAQCAtMCwwICsxLDcgQEAKKworLlBBVEg6ICR7LkNVUkRJUn0vLi4vLi4vZGV2
L21tYworCitLTU9EPQltbWNzcGkKK1NSQ1M9CW1tY3NwaS5jIG1tY2JyX2lmLmggc3BpYnVzX2lm
LmggZGV2aWNlX2lmLmggYnVzX2lmLmgKKworLmluY2x1ZGUgPGJzZC5rbW9kLm1rPgpJbmRleDog
c3lzL2Rldi9tbWMvbW1jYnJ2YXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBzeXMvZGV2L21tYy9tbWNicnZh
ci5oCShyZXZpc2lvbiAyMzQ5OTkpCisrKyBzeXMvZGV2L21tYy9tbWNicnZhci5oCSh3b3JraW5n
IGNvcHkpCkBAIC02MCw2ICs2MCw3IEBACiAjaW5jbHVkZSAibW1jYnJfaWYuaCIKIAogZW51bSBt
bWNicl9kZXZpY2VfaXZhcnMgeworICAgIE1NQ0JSX0lWQVJfQlVTX1RZUEUsCiAgICAgTU1DQlJf
SVZBUl9CVVNfTU9ERSwKICAgICBNTUNCUl9JVkFSX0JVU19XSURUSCwKICAgICBNTUNCUl9JVkFS
X0NISVBfU0VMRUNULApAQCAtODIsNiArODMsNyBAQAogI2RlZmluZSBNTUNCUl9BQ0NFU1NPUih2
YXIsIGl2YXIsIHR5cGUpCQkJCQlcCiAJX19CVVNfQUNDRVNTT1IobW1jYnIsIHZhciwgTU1DQlIs
IGl2YXIsIHR5cGUpCiAKK01NQ0JSX0FDQ0VTU09SKGJ1c190eXBlLCBCVVNfVFlQRSwgaW50KQog
TU1DQlJfQUNDRVNTT1IoYnVzX21vZGUsIEJVU19NT0RFLCBpbnQpCiBNTUNCUl9BQ0NFU1NPUihi
dXNfd2lkdGgsIEJVU19XSURUSCwgaW50KQogTU1DQlJfQUNDRVNTT1IoY2hpcF9zZWxlY3QsIENI
SVBfU0VMRUNULCBpbnQpCkluZGV4OiBzeXMvZGV2L21tYy9tbWNyZWcuaAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBzeXMvZGV2L21tYy9tbWNyZWcuaAkocmV2aXNpb24gMjM0OTk5KQorKysgc3lzL2Rldi9tbWMv
bW1jcmVnLmgJKHdvcmtpbmcgY29weSkKQEAgLTc4LDYgKzc4LDcgQEAKICNkZWZpbmUJTU1DX0NN
RF9CQwkoMnVsIDw8IDUpCS8qIEJyb2FkY2FzdCBjb21tYW5kLCBubyByZXNwb25zZSAqLwogI2Rl
ZmluZQlNTUNfQ01EX0JDUgkoM3VsIDw8IDUpCS8qIEJyb2FkY2FzdCBjb21tYW5kIHdpdGggcmVz
cG9uc2UgKi8KICNkZWZpbmUJTU1DX0NNRF9NQVNLCSgzdWwgPDwgNSkKKyNkZWZpbmUJTU1DX0NN
RF9JU19BUFAgICgxdWwgPDwgOCkJLyogQ29tbWFuZCBpcyBiZWluZyBzZW50IGFzIGFuIEFQUCBj
b21tYW5kICovCiAKIC8qIFBvc3NpYmxlIHJlc3BvbnNlIHR5cGVzIGRlZmluZWQgaW4gdGhlIHN0
YW5kYXJkOiAqLwogI2RlZmluZQlNTUNfUlNQX05PTkUJKDApCkluZGV4OiBzeXMvZGV2L21tYy9i
cmlkZ2UuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBzeXMvZGV2L21tYy9icmlkZ2UuaAkocmV2aXNpb24gMjM0
OTk5KQorKysgc3lzL2Rldi9tbWMvYnJpZGdlLmgJKHdvcmtpbmcgY29weSkKQEAgLTEwMCw2ICsx
MDAsMTAgQEAKIAljc19kb250Y2FyZSA9IDAsIGNzX2hpZ2gsIGNzX2xvdwogfTsKIAorZW51bSBt
bWNfYnVzX3R5cGUgeworCWJ1c190eXBlX3NkID0gMCwgYnVzX3R5cGVfc3BpCit9OworCiBlbnVt
IG1tY19idXNfd2lkdGggewogCWJ1c193aWR0aF8xID0gMCwgYnVzX3dpZHRoXzQgPSAyLCBidXNf
d2lkdGhfOCA9IDMKIH07CkBAIC0xMTEsNiArMTE1LDcgQEAKIHN0cnVjdCBtbWNfaW9zIHsKIAl1
aW50MzJfdAljbG9jazsJLyogU3BlZWQgb2YgdGhlIGNsb2NrIGluIEh6IHRvIG1vdmUgZGF0YSAq
LwogCWVudW0gbW1jX3ZkZAl2ZGQ7CS8qIFZvbHRhZ2UgdG8gYXBwbHkgdG8gdGhlIHBvd2VyIHBp
bnMvICovCisJZW51bSBtbWNfYnVzX3R5cGUgYnVzX3R5cGU7CiAJZW51bSBtbWNfYnVzX21vZGUg
YnVzX21vZGU7CiAJZW51bSBtbWNfY2hpcF9zZWxlY3QgY2hpcF9zZWxlY3Q7CiAJZW51bSBtbWNf
YnVzX3dpZHRoIGJ1c193aWR0aDsKSW5kZXg6IHN5cy9kZXYvbW1jL21tY3NwaS5jCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIHN5cy9kZXYvbW1jL21tY3NwaS5jCShyZXZpc2lvbiAwKQorKysgc3lzL2Rldi9tbWMv
bW1jc3BpLmMJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMjU1OSBAQAorLyotCisgKiBDb3B5cmln
aHQgKGMpIDIwMTIgUGF0cmljayBLZWxzZXkuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVVUSE9SIEFORCBDT05UUklC
VVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9T
RQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBVVRIT1IgT1IgQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
CisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9S
IFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBQb3J0aW9ucyBv
ZiB0aGlzIHNvZnR3YXJlIG1heSBoYXZlIGJlZW4gZGV2ZWxvcGVkIHdpdGggcmVmZXJlbmNlIHRv
CisgKiB0aGUgU0QgU2ltcGxpZmllZCBTcGVjaWZpY2F0aW9uLiAgVGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIG1heSBhcHBseToKKyAqCisgKiBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXBwbHkg
dG8gdGhlIHJlbGVhc2Ugb2YgdGhlIHNpbXBsaWZpZWQKKyAqIHNwZWNpZmljYXRpb24gKCJTaW1w
bGlmaWVkIFNwZWNpZmljYXRpb24iKSBieSB0aGUgU0QgQ2FyZCBBc3NvY2lhdGlvbiBhbmQKKyAq
IHRoZSBTRCBHcm91cC4gVGhlIFNpbXBsaWZpZWQgU3BlY2lmaWNhdGlvbiBpcyBhIHN1YnNldCBv
ZiB0aGUgY29tcGxldGUgU0QKKyAqIFNwZWNpZmljYXRpb24gd2hpY2ggaXMgb3duZWQgYnkgdGhl
IFNEIENhcmQgQXNzb2NpYXRpb24gYW5kIHRoZSBTRAorICogR3JvdXAuIFRoaXMgU2ltcGxpZmll
ZCBTcGVjaWZpY2F0aW9uIGlzIHByb3ZpZGVkIG9uIGEgbm9uLWNvbmZpZGVudGlhbAorICogYmFz
aXMgc3ViamVjdCB0byB0aGUgZGlzY2xhaW1lcnMgYmVsb3cuIEFueSBpbXBsZW1lbnRhdGlvbiBv
ZiB0aGUKKyAqIFNpbXBsaWZpZWQgU3BlY2lmaWNhdGlvbiBtYXkgcmVxdWlyZSBhIGxpY2Vuc2Ug
ZnJvbSB0aGUgU0QgQ2FyZAorICogQXNzb2NpYXRpb24sIFNEIEdyb3VwLCBTRC0zQyBMTEMgb3Ig
b3RoZXIgdGhpcmQgcGFydGllcy4KKyAqCisgKiBEaXNjbGFpbWVyczoKKyAqCisgKiBUaGUgaW5m
b3JtYXRpb24gY29udGFpbmVkIGluIHRoZSBTaW1wbGlmaWVkIFNwZWNpZmljYXRpb24gaXMgcHJl
c2VudGVkIG9ubHkKKyAqIGFzIGEgc3RhbmRhcmQgc3BlY2lmaWNhdGlvbiBmb3IgU0QgQ2FyZHMg
YW5kIFNEIEhvc3QvQW5jaWxsYXJ5IHByb2R1Y3RzIGFuZAorICogaXMgcHJvdmlkZWQgIkFTLUlT
IiB3aXRob3V0IGFueSByZXByZXNlbnRhdGlvbnMgb3Igd2FycmFudGllcyBvZiBhbnkKKyAqIGtp
bmQuIE5vIHJlc3BvbnNpYmlsaXR5IGlzIGFzc3VtZWQgYnkgdGhlIFNEIEdyb3VwLCBTRC0zQyBM
TEMgb3IgdGhlIFNECisgKiBDYXJkIEFzc29jaWF0aW9uIGZvciBhbnkgZGFtYWdlcywgYW55IGlu
ZnJpbmdlbWVudHMgb2YgcGF0ZW50cyBvciBvdGhlcgorICogcmlnaHQgb2YgdGhlIFNEIEdyb3Vw
LCBTRC0zQyBMTEMsIHRoZSBTRCBDYXJkIEFzc29jaWF0aW9uIG9yIGFueSB0aGlyZAorICogcGFy
dGllcywgd2hpY2ggbWF5IHJlc3VsdCBmcm9tIGl0cyB1c2UuIE5vIGxpY2Vuc2UgaXMgZ3JhbnRl
ZCBieQorICogaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZSB1bmRlciBhbnkgcGF0
ZW50IG9yIG90aGVyIHJpZ2h0cyBvZiB0aGUKKyAqIFNEIEdyb3VwLCBTRC0zQyBMTEMsIHRoZSBT
RCBDYXJkIEFzc29jaWF0aW9uIG9yIGFueSB0aGlyZCBwYXJ0eS4gTm90aGluZworICogaGVyZWlu
IHNoYWxsIGJlIGNvbnN0cnVlZCBhcyBhbiBvYmxpZ2F0aW9uIGJ5IHRoZSBTRCBHcm91cCwgdGhl
IFNELTNDIExMQworICogb3IgdGhlIFNEIENhcmQgQXNzb2NpYXRpb24gdG8gZGlzY2xvc2Ugb3Ig
ZGlzdHJpYnV0ZSBhbnkgdGVjaG5pY2FsCisgKiBpbmZvcm1hdGlvbiwga25vdy1ob3cgb3Igb3Ro
ZXIgY29uZmlkZW50aWFsIGluZm9ybWF0aW9uIHRvIGFueSB0aGlyZCBwYXJ0eS4KKyAqCisgKgor
ICogQ1JDIHJvdXRpbmVzIGFkYXB0ZWQgZnJvbSBwdWJsaWMgZG9tYWluIGNvZGUgd3JpdHRlbiBi
eSBMYW1tZXJ0IEJpZXMuCisgKgorICogCisgKiBUaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIG9m
IG1tY2JyIHRoYXQgY29tbXVuaWNhdGVzIHdpdGggU0QvTU1DIGNhcmRzIGluCisgKiBTUEkgbW9k
ZSB2aWEgc3BpYnVzX2lmLiAgSW4gb3JkZXIgdG8gbWluaW1pemUgY2hhbmdlcyB0byB0aGUgZXhp
c3RpbmcKKyAqIE1NQy9TRCBzdGFjayAoYW5kIGFsbG93IGZvciBtYXhpbWFsIHJldXNlIG9mIHRo
ZSBzYW1lKSwgdGhlIGJlaGF2aW9yIG9mCisgKiB0aGUgU0QtYnVzIGNvbW1hbmQgc2V0IGlzIGVt
dWxhdGVkIGFzIG11Y2ggYXMgcG9zc2libGUsIHdoZXJlIHJlcXVpcmVkLgorICoKKyAqIFRoZSBT
UEkgYnVzIG93bmVyc2hpcCBiZWhhdmlvciBpcyB0byBhY3F1aXJlIHRoZSBTUEkgYnVzIGZvciB0
aGUgZW50aXJlCisgKiBkdXJhdGlvbiB0aGF0IHRoZSBNTUMgaG9zdCBpcyBhY3F1aXJlZC4KKyAq
CisgKiBDUkMgY2hlY2tpbmcgaXMgZW5hYmxlZCBieSBkZWZhdWx0LCBidXQgY2FuIGJlIGRpc2Fi
bGVkIGF0IHJ1bnRpbWUKKyAqIHBlci1jYXJkIHZpYSBzeXNjdGwgKGUuZy4gc3lzY3RsIGRldi5t
bWNzcGkuMC51c2VfY3JjPTApLgorICoKKyAqIENvbnNpZGVyZWQsIGJ1dCBub3QgaW1wbGVtZW50
ZWQ6CisgKiAgIC0gQ2FyZCBwcmVzZW5jZSBkZXRlY3Rpb24KKyAqICAgLSBDYXJkIHBvd2VyIGNv
bnRyb2wKKyAqICAgLSBEZXRlY3Rpb24gb2YgbG9jayBzd2l0Y2ggc3RhdGUgb24gY2FyZHMgdGhh
dCBoYXZlIHRoZW0KKyAqICAgLSBZaWVsZGluZyB0aGUgQ1BVIGR1cmluZyBsb25nIGNhcmQgYnVz
eSBjeWNsZXMKKyAqCisgKiBPcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgdGVzdGVkIHVzaW5nIGEg
TWljcm9UaWsgUm91dGVyQk9BUkQgUkI0NTBHIGFuZAorICogdGhlIDMxIG1pY3JvU0QgY2FyZHMg
bGlzdGVkIGF0IHRoZSBlbmQgb2YgdGhpcyBmaWxlLgorICovCisKKyNpbmNsdWRlIDxzeXMvY2Rl
ZnMuaD4KK19fRkJTRElEKCIkRnJlZUJTRCQiKTsKKworCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+
CisjaW5jbHVkZSA8c3lzL3N5c3RtLmg+CisjaW5jbHVkZSA8c3lzL2J1cy5oPgorI2luY2x1ZGUg
PHN5cy9jb25mLmg+CisjaW5jbHVkZSA8c3lzL2tlcm5lbC5oPgorI2luY2x1ZGUgPHN5cy9sb2Nr
Lmg+CisjaW5jbHVkZSA8c3lzL21vZHVsZS5oPgorI2luY2x1ZGUgPHN5cy9tdXRleC5oPgorI2lu
Y2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorI2luY2x1ZGUgPHN5cy9zeXNjdGwuaD4KKworI2luY2x1
ZGUgPGRldi9tbWMvYnJpZGdlLmg+CisjaW5jbHVkZSA8ZGV2L21tYy9tbWNyZWcuaD4KKyNpbmNs
dWRlIDxkZXYvbW1jL21tY2JydmFyLmg+CisjaW5jbHVkZSA8ZGV2L3NwaWJ1cy9zcGkuaD4KKwor
CisjaW5jbHVkZSAibW1jYnJfaWYuaCIKKyNpbmNsdWRlICJzcGlidXNfaWYuaCIKKworI2RlZmlu
ZSBNTUNTUElfUkVUUklFUyAzIC8qIG51bWJlciBvZiByZXRyaWVzIGZvciBpbnRlcm5hbGx5IG9y
aWdpbmF0ZWQgY29tbWFuZHMgKi8KKyNkZWZpbmUgTU1DU1BJX1RJTUVPVVRfU0VDIDMKKworI2Rl
ZmluZSBNTUNTUElfTUFYX1JTUF9MRU4gNSAgLyogbWF4IGxlbmd0aCBvZiBhbiBSbiByZXNwb25z
ZSAqLworI2RlZmluZSBNTUNTUElfT0NSX0xFTiAgICAgNAorCisjZGVmaW5lIE1NQ1NQSV9EQVRB
X0JMT0NLX0xFTiA1MTIKKyNkZWZpbmUgTU1DU1BJX0RBVEFfQ1JDX0xFTiAgIDIKKworI2RlZmlu
ZSBNTUNTUElfUE9MTF9MRU4gOCAgLyogYW1vdW50IHRvIHJlYWQgd2hlbiBzZWFyY2hpbmcgKi8K
KworI2RlZmluZSBNTUNTUElfUjFfTUFTSyAgMHg4MCAgLyogbWFzayB1c2VkIHRvIHNlYXJjaCBm
b3IgUjEgdG9rZW5zICovCisjZGVmaW5lIE1NQ1NQSV9SMV9WQUxVRSAweDAwICAvKiB2YWx1ZSB1
c2VkIHRvIHNlYXJjaCBmb3IgUjEgdG9rZW5zICovCisjZGVmaW5lIE1NQ1NQSV9EUl9NQVNLICAw
eDExICAvKiBtYXNrIHVzZWQgdG8gc2VhcmNoIGZvciBkYXRhIHJlc3BvbnNlIHRva2VucyAqLwor
I2RlZmluZSBNTUNTUElfRFJfVkFMVUUgMHgwMSAgLyogdmFsdWUgdXNlZCB0byBzZWFyY2ggZm9y
IGRhdGEgcmVzcG9uc2UgdG9rZW5zICovCisKKyNkZWZpbmUgTU1DU1BJX0RSX0VSUl9NQVNLICAw
eDBlCisjZGVmaW5lIE1NQ1NQSV9EUl9FUlJfTk9ORSAgMHgwNAorI2RlZmluZSBNTUNTUElfRFJf
RVJSX0NSQyAgIDB4MGEKKyNkZWZpbmUgTU1DU1BJX0RSX0VSUl9XUklURSAweDBjCisKKyNkZWZp
bmUgTU1DU1BJX1RPS0VOX1NCICAgICAgMHhmZSAgLyogc3RhcnQgYmxvY2sgdG9rZW4gZm9yIHJl
YWQgc2luZ2xlLAorCQkJCSAgICAgIHJlYWQgbXVsdGksIGFuZCB3cml0ZSBzaW5nbGUgKi8KKyNk
ZWZpbmUgTU1DU1BJX1RPS0VOX1NCX1dNICAgMHhmYyAgLyogc3RhcnQgYmxvY2sgdG9rZW4gZm9y
IHdyaXRlIG11bHRpICovCisjZGVmaW5lIE1NQ1NQSV9UT0tFTl9TVCAgICAgIDB4ZmQgIC8qIHN0
b3AgdHJhbnNtaXNzaW9uIHRva2VuICovCisjZGVmaW5lIE1NQ1NQSV9JU19ERV9UT0tFTih4KSAo
MCA9PSAoKHgpICYgMHhmMCkpICAvKiBkZXRlY3RvciBmb3IgZGF0YSBlcnJvciB0b2tlbiAqLwor
CisKKyNkZWZpbmUgTU1DU1BJX1IxX0lETEUgICAgICAweDAxCisjZGVmaW5lIE1NQ1NQSV9SMV9F
UkFTRV9SU1QgMHgwMgorI2RlZmluZSBNTUNTUElfUjFfSUxMX0NNRCAgIDB4MDQKKyNkZWZpbmUg
TU1DU1BJX1IxX0NSQ19FUlIgICAweDA4CisjZGVmaW5lIE1NQ1NQSV9SMV9FUkFTRV9FUlIgMHgx
MAorI2RlZmluZSBNTUNTUElfUjFfQUREUl9FUlIgIDB4MjAKKyNkZWZpbmUgTU1DU1BJX1IxX1BB
UkFNX0VSUiAweDQwCisKKyNkZWZpbmUgTU1DU1BJX1IxX0VSUl9NQVNLIChNTUNTUElfUjFfUEFS
QU1fRVJSIHwgTU1DU1BJX1IxX0FERFJfRVJSIHwJXAorCQkJICAgIE1NQ1NQSV9SMV9FUkFTRV9F
UlIgfCBNTUNTUElfUjFfQ1JDX0VSUiB8CVwKKwkJCSAgICBNTUNTUElfUjFfSUxMX0NNRCkKKwor
I2RlZmluZSBNTUNTUElfUjJfTE9DS0VEICAgICAgMHgwMQorI2RlZmluZSBNTUNTUElfUjJfV1Bf
RVJfTENLICAgMHgwMgorI2RlZmluZSBNTUNTUElfUjJfRVJSICAgICAgICAgMHgwNAorI2RlZmlu
ZSBNTUNTUElfUjJfQ0NfRVJSICAgICAgMHgwOAorI2RlZmluZSBNTUNTUElfUjJfRUNDX0ZBSUwg
ICAgMHgxMAorI2RlZmluZSBNTUNTUElfUjJfV1BfVklPTEFURSAgMHgyMAorI2RlZmluZSBNTUNT
UElfUjJfRVJBU0VfUEFSQU0gMHg0MAorI2RlZmluZSBNTUNTUElfUjJfT09SX0NTRF9PVyAgMHg4
MAorCisvKiBjb21tYW5kcyB0aGF0IG9ubHkgYXBwbHkgdG8gdGhlIFNQSSBpbnRlcmZhY2UgKi8K
KyNkZWZpbmUgTU1DU1BJX1JFQURfT0NSICAgNTgKKyNkZWZpbmUgTU1DU1BJX0NSQ19PTl9PRkYg
NTkKKworCitzdHJ1Y3QgbW1jc3BpX2NvbW1hbmQgeworCXN0cnVjdCBtbWNfY29tbWFuZAkqbW1j
X2NtZDsJLyogY29tbWFuZCBwYXNzZWQgZnJvbSBtbWMgbGF5ZXIgKi8KKwl1aW50MzJfdAkJb3Bj
b2RlOwkJLyogcG9zc2libHkgdHJhbnNsYXRlZCBvcGNvZGUgKi8KKwl1aW50MzJfdAkJYXJnOwkJ
LyogcG9zc2libHkgdHJhbnNsYXRlZCBhcmcgKi8KKwl1aW50MzJfdAkJZmxhZ3M7CQkvKiBwb3Nz
aWJseSB0cmFuc2xhdGVkIGZsYWdzICovCisJdWludDMyX3QJCXJldHJpZXM7CS8qIHBvc3NpYmx5
IHRyYW5zbGF0ZWQgcmV0cnkgY291bnQgKi8KKwlzdHJ1Y3QgbW1jX2RhdGEJCSpkYXRhOwkJLyog
cG9zc2libHkgcmVkaXJlY3RlZCBkYXRhIHNlZ21lbnQgKi8KKwl1bnNpZ25lZCBpbnQJCWVycm9y
X21hc2s7CS8qIG1hc2sgdG8gdXNlIHdoZW4gY2hlY2tpbmcgZm9yIFIxIGVycm9ycyAqLworCXVu
c2lnbmVkIGNoYXIJCXVzZV9jcmM7CS8qIGRvIGNyYyBjaGVja2luZyBmb3IgdGhpcyBjb21tYW5k
ICovCisJdW5zaWduZWQgY2hhcgkJcnNwX3R5cGU7CS8qIHR5cGUgb2YgcmVzcG9uc2UgdG8gdGhp
cyBjb21tYW5kICovCisjZGVmaW5lIE1NQ1NQSV9SU1BfUjEgICAgMAorI2RlZmluZSBNTUNTUElf
UlNQX1IxQiAgIDEKKyNkZWZpbmUgTU1DU1BJX1JTUF9SMiAgICAyCisjZGVmaW5lIE1NQ1NQSV9S
U1BfUjMgICAgMworI2RlZmluZSBNTUNTUElfUlNQX1I3ICAgIDQKKwl1bnNpZ25lZCBjaGFyCQly
c3BfbGVuOwkvKiBsZW5ndGggb2YgcmVzcG9uc2UgdG8gdGhpcyBjb21tYW5kICovCisJc3RydWN0
IG1tY19kYXRhCQlsZGF0YTsJCS8qIGxvY2FsIHJlYWQgZGF0YSAqLworfTsKKworc3RydWN0IG1t
Y3NwaV9zbG90IHsKKwlzdHJ1Y3QgbW1jc3BpX3NvZnRjCSpzYzsJCS8qIGJhY2sgcG9pbnRlciB0
byBwYXJlbnQgYnJpZGdlICovCisJZGV2aWNlX3QJCWRldjsJCS8qIG1tYyBkZXZpY2UgZm9yIHNs
b3QgKi8KKwlib29sZWFuX3QJCWJ1c19idXN5OyAgICAgICAvKiBpbmRpY2F0ZXMgd2hldGhlciBo
b3N0IGhhcyBiZWVuIGFjcXVpcmVkICovCisJc3RydWN0IG1tY19ob3N0IAlob3N0OwkJLyogaG9z
dCBwYXJhbWV0ZXJzICovCisJc3RydWN0IG10eAkJbXR4OwkJLyogc2xvdCBtdXRleCAqLworCXVp
bnQ4X3QJCQlsYXN0X29jcltNTUNTUElfT0NSX0xFTl07IC8qIGxhc3Qgb2NyIHJldHJpZXZlZCBh
ZnRlciBDTUQ4ICovCisJdWludDMyX3QJCWxhc3Rfb3Bjb2RlOwkvKiBsYXN0IG9wY29kZSByZXF1
ZXN0ZWQgYnkgbW1jIGxheWVyICovCisJdWludDMyX3QJCWxhc3RfZmxhZ3M7CS8qIGxhc3QgZmxh
Z3MgcmVxdWVzdGVkIGJ5IG1tYyBsYXllciAqLworCXVuc2lnbmVkIGludAkJY3JjX2VuYWJsZWQ7
CS8qIHdoZXRoZXIgY3JjIGNoZWNraW5nIGlzIGVuYWJsZWQgb24gdGhlIGNhcmQgKi8KKwl1bnNp
Z25lZCBpbnQJCWNyY19pbml0X2RvbmU7ICAvKiB3aGV0aGVyIHRoZSBpbml0aWFsIGNyYyBzZXR0
aW5nIGhhcworCQkJCQkJICAgYmVlbiBzZW50IHRvIHRoZSBjYXJkICovCisjZGVmaW5lIE1NQ1NQ
SV9NQVhfTERBVEFfTEVOIDE2CisJdWludDhfdAkJCWxkYXRhX2J1ZltNTUNTUElfTUFYX0xEQVRB
X0xFTl07Cit9OworCisKK3N0cnVjdCBtbWNzcGlfc29mdGMgeworCWRldmljZV90CQlkZXY7CQkv
KiB0aGlzIG1tYyBicmlkZ2UgZGV2aWNlICovCisJZGV2aWNlX3QJCWJ1c2RldjsJCS8qIHNwaSBi
dXMgZGV2aWNlIHRoaXMgYnJpZGdlIGlzIG9uICovCisJc3RydWN0IG1tY3NwaV9zbG90CXNsb3Q7
CQkvKiBzdGF0ZSBmb3IgdGhlIHNpbmdsZSBzdXBwb3J0ZWQgc2xvdCAqLworCXVuc2lnbmVkIGlu
dAkJdXNlX2NyYzsJLyogd2hldGhlciB0byBlbmFibGUgY29tbWFuZCBDUkMgY2hlY2tpbmcgKi8K
K307CisKKworLyogZGV2aWNlIGludGVyZmFjZSAqLworc3RhdGljIGludCBtbWNzcGlfcHJvYmUo
ZGV2aWNlX3QgZGV2KTsKK3N0YXRpYyBpbnQgbW1jc3BpX2F0dGFjaChkZXZpY2VfdCBkZXYpOwor
c3RhdGljIGludCBtbWNzcGlfZGV0YWNoKGRldmljZV90IGRldik7CitzdGF0aWMgaW50IG1tY3Nw
aV9zdXNwZW5kKGRldmljZV90IGRldik7CitzdGF0aWMgaW50IG1tY3NwaV9yZXN1bWUoZGV2aWNl
X3QgZGV2KTsKKworLyogYnVzIGludGVyZmFjZSAqLworc3RhdGljIGludCBtbWNzcGlfcmVhZF9p
dmFyKGRldmljZV90IGJ1cywgZGV2aWNlX3QgY2hpbGQsIGludCB3aGljaCwKKwkJCSAgICB1aW50
cHRyX3QgKnJlc3VsdCk7CitzdGF0aWMgaW50IG1tY3NwaV93cml0ZV9pdmFyKGRldmljZV90IGJ1
cywgZGV2aWNlX3QgY2hpbGQsIGludCB3aGljaCwKKwkJCSAgICAgdWludHB0cl90IHZhbHVlKTsK
KworLyogbW1jYnIgaW50ZXJmYWNlICovCitzdGF0aWMgaW50IG1tY3NwaV91cGRhdGVfaW9zKGRl
dmljZV90IGJyZGV2LCBkZXZpY2VfdCByZXFkZXYpOworc3RhdGljIGludCBtbWNzcGlfcmVxdWVz
dChkZXZpY2VfdCBicmRldiwgZGV2aWNlX3QgcmVxZGV2LAorCQkJICBzdHJ1Y3QgbW1jX3JlcXVl
c3QgKnJlcSk7CitzdGF0aWMgaW50IG1tY3NwaV9nZXRfcm8oZGV2aWNlX3QgYnJkZXYsIGRldmlj
ZV90IHJlcWRldik7CitzdGF0aWMgaW50IG1tY3NwaV9hY3F1aXJlX2hvc3QoZGV2aWNlX3QgYnJk
ZXYsIGRldmljZV90IHJlcWRldik7CitzdGF0aWMgaW50IG1tY3NwaV9yZWxlYXNlX2hvc3QoZGV2
aWNlX3QgYnJkZXYsIGRldmljZV90IHJlcWRldik7CisKKy8qIHN1cHBvcnRpbmcgY2FzdCAqLwor
c3RhdGljIHZvaWQgbW1jc3BpX3Nsb3RfaW5pdChkZXZpY2VfdCBicmRldiwgc3RydWN0IG1tY3Nw
aV9zbG90ICpzbG90KTsKK3N0YXRpYyB2b2lkIG1tY3NwaV9zbG90X2ZpbmkoZGV2aWNlX3QgYnJk
ZXYsIHN0cnVjdCBtbWNzcGlfc2xvdCAqc2xvdCk7CisKK3N0YXRpYyB2b2lkIG1tY3NwaV9jYXJk
X2FkZChzdHJ1Y3QgbW1jc3BpX3Nsb3QgKnNsb3QpOworc3RhdGljIHZvaWQgbW1jc3BpX2NhcmRf
ZGVsZXRlKHN0cnVjdCBtbWNzcGlfc2xvdCAqc2xvdCk7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQg
bW1jc3BpX2RvX3NwaV9yZWFkKGRldmljZV90IGRldiwgdWludDhfdCAqZGF0YSwKKwkJCQkgICAg
ICAgdW5zaWduZWQgaW50IGxlbik7CitzdGF0aWMgdW5zaWduZWQgaW50IG1tY3NwaV9kb19zcGlf
d3JpdGUoZGV2aWNlX3QgZGV2LCB1aW50OF90ICpjbWQsCisJCQkJCXVuc2lnbmVkIGludCBjbWRs
ZW4sIHVpbnQ4X3QgKmRhdGEsCisJCQkJCXVuc2lnbmVkIGludCBkYXRhbGVuKTsKKworc3RhdGlj
IHVuc2lnbmVkIGludCBtbWNzcGlfd2FpdF9mb3Jfbm90X2J1c3koZGV2aWNlX3QgZGV2KTsKK3N0
YXRpYyB1bnNpZ25lZCBpbnQgbW1jc3BpX3NoaWZ0X2NvcHkodWludDhfdCAqZGVzdCwgdWludDhf
dCAqc3JjLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBzcmNfbGVuLCB1bnNpZ25lZCBpbnQgc2hp
ZnQpOworc3RhdGljIHVuc2lnbmVkIGludCBtbWNzcGlfZ2V0X3Jlc3BvbnNlX3Rva2VuKGRldmlj
ZV90IGRldiwgdWludDhfdCBtYXNrLAorCQkJCQkgICAgICB1aW50OF90IHZhbHVlLCB1bnNpZ25l
ZCBpbnQgbGVuLAorCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgaGFzX2J1c3ksCisJCQkJCSAgICAg
IHVpbnQ4X3QgKnJzcGJ1Zik7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbW1jc3BpX3NldF91cF9j
b21tYW5kKGRldmljZV90IGRldiwKKwkJCQkJICBzdHJ1Y3QgbW1jc3BpX2NvbW1hbmQgKm1tY3Nw
aV9jbWQsCisJCQkJCSAgc3RydWN0IG1tY19jb21tYW5kICptbWNfY21kKTsKK3N0YXRpYyB1bnNp
Z25lZCBpbnQgbW1jc3BpX3NlbmRfY21kKGRldmljZV90IGRldiwgc3RydWN0IG1tY3NwaV9jb21t
YW5kICpjbWQsCisJCQkJICAgIHVpbnQ4X3QgKnJzcGJ1Zik7CisKK3N0YXRpYyB1bnNpZ25lZCBp
bnQgbW1jc3BpX3JlYWRfYmxvY2soZGV2aWNlX3QgZGV2LCB1aW50OF90ICpkYXRhLAorCQkJCSAg
ICAgIHVuc2lnbmVkIGludCBsZW4sIHVuc2lnbmVkIGludCBjaGVja19jcmMxNiwKKwkJCQkgICAg
ICB1bnNpZ25lZCBpbnQgY2hlY2tfY3JjNyk7CitzdGF0aWMgdW5zaWduZWQgaW50IG1tY3NwaV9z
ZW5kX3N0b3AoZGV2aWNlX3QgZGV2LCB1bnNpZ25lZCBpbnQgcmV0cmllcyk7CitzdGF0aWMgdW5z
aWduZWQgaW50IG1tY3NwaV9yZWFkX3BoYXNlKGRldmljZV90IGRldiwgc3RydWN0IG1tY3NwaV9j
b21tYW5kICpjbWQpOworc3RhdGljIHVuc2lnbmVkIGludCBtbWNzcGlfd3JpdGVfYmxvY2soZGV2
aWNlX3QgZGV2LCB1aW50OF90ICpkYXRhLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgaXNfbXVs
dGksCisJCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgdXNlX2NyYywgdWludDhfdCAqc3RhdHVzKTsK
K3N0YXRpYyB1bnNpZ25lZCBpbnQgbW1jc3BpX3dyaXRlX3BoYXNlKGRldmljZV90IGRldiwgc3Ry
dWN0IG1tY3NwaV9jb21tYW5kICpjbWQpOworc3RhdGljIHVuc2lnbmVkIGludCBtbWNzcGlfdHJh
bnNsYXRlX3Jlc3BvbnNlKGRldmljZV90IGRldiwKKwkJCQkJICAgICAgc3RydWN0IG1tY3NwaV9j
b21tYW5kICpjbWQsCisJCQkJCSAgICAgIHVpbnQ4X3QgKnJzcGJ1Zik7CitzdGF0aWMgdW5zaWdu
ZWQgaW50IG1tY3NwaV9nZXRfb2NyKGRldmljZV90IGRldiwgdWludDhfdCAqb2NyYnVmKTsKK3N0
YXRpYyB1bnNpZ25lZCBpbnQgbW1jc3BpX3NldF9jcmNfb25fb2ZmKGRldmljZV90IGRldiwgdW5z
aWduZWQgaW50IGNyY19vbik7CitzdGF0aWMgdW5zaWduZWQgaW50IG1tY3NwaV91cGRhdGVfY3Jj
X3NldHRpbmcoZGV2aWNlX3QgZGV2LCB1bnNpZ25lZCBpbnQgY3JjX29uKTsKKworc3RhdGljIHVp
bnQ4X3QgdXBkYXRlX2NyYzcodWludDhfdCBjcmMsIHVpbnQ4X3QgKmJ1ZiwgdW5zaWduZWQgaW50
IGxlbik7CitzdGF0aWMgdWludDE2X3QgdXBkYXRlX2NyYzE2KHVpbnQxNl90IGNyYywgdWludDhf
dCAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuKTsKK3N0YXRpYyB2b2lkIGluaXRfY3JjN3RhYih2b2lk
KTsKK3N0YXRpYyB2b2lkIGluaXRfY3JjMTZ0YWIodm9pZCk7CisKK3N0YXRpYyBpbnQgbW1jc3Bp
X21vZGV2ZW50X2hhbmRsZXIobW9kdWxlX3QgbW9kLCBpbnQgd2hhdCwgdm9pZCAqYXJnKTsKKwor
I2lmIGRlZmluZWQoTU1DU1BJX0VOQUJMRV9ERUJVR19GVU5DUykKK3N0YXRpYyB2b2lkIG1tY3Nw
aV9kdW1wX2RhdGEoZGV2aWNlX3QgZGV2LCBjb25zdCBjaGFyICpsYWJlbCwgdWludDhfdCAqZGF0
YSwKKwkJCSAgICAgdW5zaWduZWQgaW50IGxlbik7CitzdGF0aWMgdm9pZCBtbWNzcGlfZHVtcF9z
cGlfYnVzKGRldmljZV90IGRldiwgdW5zaWduZWQgaW50IGxlbik7CisjZW5kaWYKKworCisjZGVm
aW5lIE1NQ1NQSV9MT0NLX1NMT1QoX3Nsb3QpCQkJbXR4X2xvY2soJihfc2xvdCktPm10eCkKKyNk
ZWZpbmUJTU1DU1BJX1VOTE9DS19TTE9UKF9zbG90KQkJbXR4X3VubG9jaygmKF9zbG90KS0+bXR4
KQorI2RlZmluZSBNTUNTUElfU0xPVF9MT0NLX0lOSVQoX3Nsb3QpCQlcCisgIG10eF9pbml0KCYo
X3Nsb3QpLT5tdHgsICJTRCBzbG90IG10eCIsICJtbWNzcGkiLCBNVFhfREVGKQorI2RlZmluZSBN
TUNTUElfU0xPVF9MT0NLX0RFU1RST1koX3Nsb3QpCQltdHhfZGVzdHJveSgmKF9zbG90KS0+bXR4
KTsKKyNkZWZpbmUgTU1DU1BJX0FTU0VSVF9TTE9UX0xPQ0tFRChfc2xvdCkJbXR4X2Fzc2VydCgm
KF9zbG90KS0+bXR4LCBNQV9PV05FRCk7CisjZGVmaW5lIE1NQ1NQSV9BU1NFUlRfU0xPVF9VTkxP
Q0tFRChfc2xvdCkJbXR4X2Fzc2VydCgmKF9zbG90KS0+bXR4LCBNQV9OT1RPV05FRCk7CisKKwor
I2RlZmluZSBUUkFDRV9aT05FX0VOQUJMRUQoem9uZSkgKHRyYWNlX3pvbmVfbWFzayAmIFRSQUNF
X1pPTkVfIyN6b25lKQorCisjZGVmaW5lIFRSQUNFX0VOVEVSKGRldikJCQkJCVwKKwlpZiAoVFJB
Q0VfWk9ORV9FTkFCTEVEKEVOVEVSKSkgewkJCVwKKwkJZGV2aWNlX3ByaW50ZihkZXYsICIlczog
ZW50ZXJcbiIsIF9fZnVuY19fKTsJXAorCX0KKworI2RlZmluZSBUUkFDRV9FWElUKGRldikJCQkJ
CQlcCisJaWYgKFRSQUNFX1pPTkVfRU5BQkxFRChFWElUKSkgewkJCQlcCisJCWRldmljZV9wcmlu
dGYoZGV2LCAiJXM6IGV4aXRcbiIsIF9fZnVuY19fKTsJXAorCX0KKworI2RlZmluZSBUUkFDRShk
ZXYsIHpvbmUsIC4uLikJCQkJXAorCWlmIChUUkFDRV9aT05FX0VOQUJMRUQoem9uZSkpIHsJCQlc
CisJCWRldmljZV9wcmludGYoZGV2LCBfX1ZBX0FSR1NfXyk7CVwKKwl9CisKKworI2RlZmluZSBU
UkFDRV9aT05FX0VOVEVSICAgKDF1bCA8PCAwKSAgLyogZnVuY3Rpb24gZW50cmFuY2UgKi8KKyNk
ZWZpbmUgVFJBQ0VfWk9ORV9FWElUICAgICgxdWwgPDwgMSkgIC8qIGZ1bmN0aW9uIGV4aXQgKi8K
KyNkZWZpbmUgVFJBQ0VfWk9ORV9BQ1RJT04gICgxdWwgPDwgMikgIC8qIGZvciBuYXJyYXRpbmcg
bWFqb3IgYWN0aW9ucyB0YWtlbiAqLworI2RlZmluZSBUUkFDRV9aT05FX1JFU1VMVCAgKDF1bCA8
PCAzKSAgLyogZm9yIG5hcnJhdGluZyByZXN1bHRzIG9mIGFjdGlvbnMgKi8KKyNkZWZpbmUgVFJB
Q0VfWk9ORV9FUlJPUiAgICgxdWwgPDwgNCkgIC8qIGZvciByZXBvcnRpbmcgZXJyb3JzICovCisj
ZGVmaW5lIFRSQUNFX1pPTkVfREFUQSAgICAoMXVsIDw8IDUpICAvKiBmb3IgZHVtcGluZyBidXMg
ZGF0YSAqLworI2RlZmluZSBUUkFDRV9aT05FX0RFVEFJTFMgKDF1bCA8PCA2KSAgLyogZm9yIG5h
cnJhdGluZyBtaW5vciBhY3Rpb25zIGFuZCByZXN1bHRzICovCisKKyNkZWZpbmUgVFJBQ0VfWk9O
RV9OT05FICAgIDAKKyNkZWZpbmUgVFJBQ0VfWk9ORV9BTEwgICAgIDB4ZmZmZmZmZmYKKworCisj
ZGVmaW5lIENSQzdfSU5JVElBTCAweDAwCisjZGVmaW5lIENSQzE2X0lOSVRJQUwgMHgwMDAwCisK
KworU1lTQ1RMX05PREUoX2h3LCBPSURfQVVUTywgbW1jc3BpLCBDVExGTEFHX1JELCAwLCAibW1j
c3BpIGRyaXZlciIpOworCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdHJhY2Vfem9uZV9tYXNrID0g
VFJBQ0VfWk9ORV9FUlJPUjsKKworc3RhdGljIHVpbnQ4X3QgY3JjN3RhYlsyNTZdOworc3RhdGlj
IHVpbnQxNl90IGNyYzE2dGFiWzI1Nl07CitzdGF0aWMgdWludDhfdCBvbmVzYnVmW01NQ1NQSV9E
QVRBX0JMT0NLX0xFTl07ICAvKiBmb3IgZHJpdmluZyB0aGUgdHggbGluZQorCQkJCQkJICAgd2hl
biByZWNlaXZpbmcgKi8KK3N0YXRpYyB1aW50OF90IGp1bmtidWZbTU1DU1BJX0RBVEFfQkxPQ0tf
TEVOXTsgIC8qIGZvciByZWNlaXZpbmcgZGF0YSB3aGVuCisJCQkJCQkgICB0cmFuc21pdHRpbmcg
Ki8KKworc3RhdGljIGludAorbW1jc3BpX3Byb2JlKGRldmljZV90IGRldikKK3sKKwlUUkFDRV9F
TlRFUihkZXYpOworCQorCWRldmljZV9zZXRfZGVzYyhkZXYsICJtbWMgc3BpLW1vZGUgYnJpZGdl
Iik7CisKKwlUUkFDRV9FWElUKGRldik7CisJcmV0dXJuICgwKTsKK30KKworCitzdGF0aWMgdm9p
ZAorbW1jc3BpX3Nsb3RfaW5pdChkZXZpY2VfdCBicmRldiwgc3RydWN0IG1tY3NwaV9zbG90ICpz
bG90KQoreworCVRSQUNFX0VOVEVSKGJyZGV2KTsKKworCXN0cnVjdCBtbWNzcGlfc29mdGMgKnNj
ID0gZGV2aWNlX2dldF9zb2Z0YyhicmRldik7CisJc3RydWN0IHNwaV9jb25maWcgY2ZnOworCisJ
c2xvdC0+c2MgPSBzYzsKKwlzbG90LT5kZXYgPSBOVUxMOyAgLyogd2lsbCBnZXQgcmVhbCB2YWx1
ZSB3aGVuIGNhcmQgaXMgYWRkZWQgKi8KKwlzbG90LT5idXNfYnVzeSA9IGZhbHNlOworCXNsb3Qt
Pmhvc3QuZl9taW4gPSAxMDAwMDA7IC8qIHRoaXMgc2hvdWxkIGJlIGFzIGxvdyBhcyB3ZSBuZWVk
IHRvIGdvCisJCQkJICAgICAgZm9yIGFueSBjYXJkICovCisJc2xvdC0+aG9zdC5jYXBzID0gMDsK
KworCVNQSUJVU19BQ1FVSVJFX0JVUyhzYy0+YnVzZGV2LCBzYy0+ZGV2KTsKKworCWNmZy5jbG9j
a19oeiA9IDA7CisJU1BJQlVTX1NFVF9DT05GSUcoc2MtPmJ1c2RldiwgJmNmZyk7CisKKwlTUElC
VVNfR0VUX0NPTkZJRyhzYy0+YnVzZGV2LCAmY2ZnKTsKKwlzbG90LT5ob3N0LmZfbWF4ID0gY2Zn
LmNsb2NrX2h6OworCisJaWYgKHNsb3QtPmhvc3QuZl9tYXggPiAyNTAwMDAwMCkgeworCQlzbG90
LT5ob3N0LmNhcHMgfD0gTU1DX0NBUF9IU1BFRUQ7CisJfQorCisJU1BJQlVTX1JFTEVBU0VfQlVT
KHNjLT5idXNkZXYsIHNjLT5kZXYpOworCisJLyogU1BJIG1vZGUgcmVxdWlyZXMgMy4zViBvcGVy
YXRpb24gKi8KKwlzbG90LT5ob3N0Lmhvc3Rfb2NyID0gTU1DX09DUl8zMjBfMzMwIHwgTU1DX09D
Ul8zMzBfMzQwOyAgCisKKwlNTUNTUElfU0xPVF9MT0NLX0lOSVQoc2xvdCk7CisKKwlUUkFDRV9F
WElUKGJyZGV2KTsKK30KKworCitzdGF0aWMgdm9pZAorbW1jc3BpX3Nsb3RfZmluaShkZXZpY2Vf
dCBicmRldiwgc3RydWN0IG1tY3NwaV9zbG90ICpzbG90KQoreworCVRSQUNFX0VOVEVSKGJyZGV2
KTsKKworCU1NQ1NQSV9TTE9UX0xPQ0tfREVTVFJPWShzbG90KTsKKworCVRSQUNFX0VYSVQoYnJk
ZXYpOworfQorCisKK3N0YXRpYyB2b2lkCittbWNzcGlfY2FyZF9hZGQoc3RydWN0IG1tY3NwaV9z
bG90ICpzbG90KQoreworCWRldmljZV90IGJyZGV2ID0gc2xvdC0+c2MtPmRldjsKKworCVRSQUNF
X0VOVEVSKGJyZGV2KTsKKworCU1NQ1NQSV9MT0NLX1NMT1Qoc2xvdCk7CisJc2xvdC0+ZGV2ID0g
ZGV2aWNlX2FkZF9jaGlsZChicmRldiwgIm1tYyIsIC0xKTsKKwlkZXZpY2Vfc2V0X2l2YXJzKHNs
b3QtPmRldiwgc2xvdCk7CisJTU1DU1BJX1VOTE9DS19TTE9UKHNsb3QpOworCisJZGV2aWNlX3By
b2JlX2FuZF9hdHRhY2goc2xvdC0+ZGV2KTsKKworCVRSQUNFX0VYSVQoYnJkZXYpOworfQorCisK
K3N0YXRpYyB2b2lkCittbWNzcGlfY2FyZF9kZWxldGUoc3RydWN0IG1tY3NwaV9zbG90ICpzbG90
KQoreworCWRldmljZV90IGJyZGV2ID0gc2xvdC0+c2MtPmRldjsKKwlkZXZpY2VfdCBkZXY7CisK
KwlUUkFDRV9FTlRFUihicmRldik7CisKKwlNTUNTUElfTE9DS19TTE9UKHNsb3QpOworCWRldiA9
IHNsb3QtPmRldjsKKwlzbG90LT5kZXYgPSBOVUxMOworCU1NQ1NQSV9VTkxPQ0tfU0xPVChzbG90
KTsKKwlkZXZpY2VfZGVsZXRlX2NoaWxkKGJyZGV2LCBkZXYpOworCisJVFJBQ0VfRVhJVChicmRl
dik7Cit9CisKKworc3RhdGljIGludAorbW1jc3BpX2F0dGFjaChkZXZpY2VfdCBkZXYpCit7CisJ
c3RydWN0IG1tY3NwaV9zb2Z0YyAqc2MgPSBkZXZpY2VfZ2V0X3NvZnRjKGRldik7CisJc3RydWN0
IHN5c2N0bF9jdHhfbGlzdCAqY3R4ID0gZGV2aWNlX2dldF9zeXNjdGxfY3R4KGRldik7CisJc3Ry
dWN0IHN5c2N0bF9vaWQgKnRyZWUgPSBkZXZpY2VfZ2V0X3N5c2N0bF90cmVlKGRldik7CisJc3Ry
dWN0IHN5c2N0bF9vaWRfbGlzdCAqY2hpbGQgPSBTWVNDVExfQ0hJTERSRU4odHJlZSk7CisKKwlU
UkFDRV9FTlRFUihkZXYpOworCisJc2MtPmRldiA9IGRldjsKKwlzYy0+YnVzZGV2ID0gZGV2aWNl
X2dldF9wYXJlbnQoZGV2KTsKKwlzYy0+dXNlX2NyYyA9IDE7CisKKwlTWVNDVExfQUREX1VJTlQo
Y3R4LCBjaGlsZCwgT0lEX0FVVE8sCisJCQkidXNlX2NyYyIsIENUTEZMQUdfUlcsICZzYy0+dXNl
X2NyYywgc2l6ZW9mKHNjLT51c2VfY3JjKSwKKwkJCSJFbmFibGUvZGlzYWJsZSBjcmMgY2hlY2tp
bmciKTsKKworCVNZU0NUTF9BRERfVUlOVChjdHgsIGNoaWxkLCBPSURfQVVUTywKKwkJCSJ0cmFj
ZV9tYXNrIiwgQ1RMRkxBR19SVywgJnRyYWNlX3pvbmVfbWFzaywKKwkJCXNpemVvZih0cmFjZV96
b25lX21hc2spLAorCQkJIkJpdG1hc2sgZm9yIGFkanVzdGluZyB0cmFjZSBtZXNzYWdlcyIpOwor
CisJbW1jc3BpX3Nsb3RfaW5pdChkZXYsICZzYy0+c2xvdCk7CisJCisJLyogWFhYIHRyaWdnZXIg
dGhpcyBmcm9tIGNhcmQgaW5zZXJ0IGRldGVjdGlvbiAqLworCW1tY3NwaV9jYXJkX2FkZCgmc2Mt
PnNsb3QpOworCQorCVRSQUNFX0VYSVQoZGV2KTsKKwlyZXR1cm4gKDApOworfQorCisKK3N0YXRp
YyBpbnQKK21tY3NwaV9kZXRhY2goZGV2aWNlX3QgZGV2KQoreworCVRSQUNFX0VOVEVSKGRldik7
CisKKyAgCXN0cnVjdCBtbWNzcGlfc29mdGMgKnNjID0gZGV2aWNlX2dldF9zb2Z0YyhkZXYpOwor
CisJLyogWFhYIHRyaWdnZXIgdGhpcyBmcm9tIGNhcmQgcmVtb3ZhbCBkZXRlY3Rpb24gKi8KKwlt
bWNzcGlfY2FyZF9kZWxldGUoJnNjLT5zbG90KTsKKworCW1tY3NwaV9zbG90X2ZpbmkoZGV2LCAm
c2MtPnNsb3QpOworCisJVFJBQ0VfRVhJVChkZXYpOworCisJcmV0dXJuICgwKTsKK30KKworCitz
dGF0aWMgaW50CittbWNzcGlfc3VzcGVuZChkZXZpY2VfdCBkZXYpCit7CisJaW50IGVycjsKKwlU
UkFDRV9FTlRFUihkZXYpOworCisJZXJyID0gYnVzX2dlbmVyaWNfc3VzcGVuZChkZXYpOworCWlm
IChlcnIpIHsKKwkJVFJBQ0VfRVhJVChkZXYpOworCQlyZXR1cm4gKGVycik7CisJfQorCisJVFJB
Q0VfRVhJVChkZXYpOworCXJldHVybiAoMCk7Cit9CisKKworc3RhdGljIGludAorbW1jc3BpX3Jl
c3VtZShkZXZpY2VfdCBkZXYpCit7CisJaW50IGVycjsKKwlUUkFDRV9FTlRFUihkZXYpOworCisJ
ZXJyID0gYnVzX2dlbmVyaWNfcmVzdW1lKGRldik7CisJaWYgKGVycikgeworCQlUUkFDRV9FWElU
KGRldik7CisJCXJldHVybiAoZXJyKTsKKwl9CisKKwlUUkFDRV9FWElUKGRldik7CisJcmV0dXJu
ICgwKTsKK30KKworCitzdGF0aWMgaW50CittbWNzcGlfcmVhZF9pdmFyKGRldmljZV90IGJ1cywg
ZGV2aWNlX3QgY2hpbGQsIGludCB3aGljaCwgdWludHB0cl90ICpyZXN1bHQpCit7CisJVFJBQ0Vf
RU5URVIoYnVzKTsKKworCXN0cnVjdCBtbWNzcGlfc2xvdCAqc2xvdCA9IGRldmljZV9nZXRfaXZh
cnMoY2hpbGQpOworCisJc3dpdGNoICh3aGljaCkgeworCWNhc2UgTU1DQlJfSVZBUl9CVVNfVFlQ
RToKKwkJKnJlc3VsdCA9IGJ1c190eXBlX3NwaTsKKwkJYnJlYWs7CisJY2FzZSBNTUNCUl9JVkFS
X0JVU19NT0RFOgorCQkqcmVzdWx0ID0gc2xvdC0+aG9zdC5pb3MuYnVzX21vZGU7CisJCWJyZWFr
OworCWNhc2UgTU1DQlJfSVZBUl9CVVNfV0lEVEg6CisJCSpyZXN1bHQgPSBzbG90LT5ob3N0Lmlv
cy5idXNfd2lkdGg7CisJCWJyZWFrOworCWNhc2UgTU1DQlJfSVZBUl9DSElQX1NFTEVDVDoKKwkJ
KnJlc3VsdCA9IHNsb3QtPmhvc3QuaW9zLmNoaXBfc2VsZWN0OworCQlicmVhazsKKwljYXNlIE1N
Q0JSX0lWQVJfQ0xPQ0s6CisJCSpyZXN1bHQgPSBzbG90LT5ob3N0Lmlvcy5jbG9jazsKKwkJYnJl
YWs7CisJY2FzZSBNTUNCUl9JVkFSX0ZfTUlOOgorCQkqcmVzdWx0ID0gc2xvdC0+aG9zdC5mX21p
bjsKKwkJYnJlYWs7CisJY2FzZSBNTUNCUl9JVkFSX0ZfTUFYOgorCQkqcmVzdWx0ID0gc2xvdC0+
aG9zdC5mX21heDsKKwkJYnJlYWs7CisJY2FzZSBNTUNCUl9JVkFSX0hPU1RfT0NSOgorCQkqcmVz
dWx0ID0gc2xvdC0+aG9zdC5ob3N0X29jcjsKKwkJYnJlYWs7CisJY2FzZSBNTUNCUl9JVkFSX01P
REU6CisJCSpyZXN1bHQgPSBzbG90LT5ob3N0Lm1vZGU7CisJCWJyZWFrOworCWNhc2UgTU1DQlJf
SVZBUl9PQ1I6CisJCSpyZXN1bHQgPSBzbG90LT5ob3N0Lm9jcjsKKwkJYnJlYWs7CisJY2FzZSBN
TUNCUl9JVkFSX1BPV0VSX01PREU6CisJCSpyZXN1bHQgPSBzbG90LT5ob3N0Lmlvcy5wb3dlcl9t
b2RlOworCQlicmVhazsKKwljYXNlIE1NQ0JSX0lWQVJfVkREOgorCQkqcmVzdWx0ID0gc2xvdC0+
aG9zdC5pb3MudmRkOworCQlicmVhazsKKwljYXNlIE1NQ0JSX0lWQVJfQ0FQUzoKKwkJKnJlc3Vs
dCA9IHNsb3QtPmhvc3QuY2FwczsKKwkJYnJlYWs7CisJY2FzZSBNTUNCUl9JVkFSX1RJTUlORzoK
KwkJKnJlc3VsdCA9IHNsb3QtPmhvc3QuaW9zLnRpbWluZzsKKwkJYnJlYWs7CisJY2FzZSBNTUNC
Ul9JVkFSX01BWF9EQVRBOgorCQkqcmVzdWx0ID0gNjQqMTAyNDsgIC8qIHNlZW1zIHJlYXNvbmFi
bGUsIG5vdCBkaWN0YXRlZCBieSBhbnl0aGluZyAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQly
ZXR1cm4gKEVJTlZBTCk7CisJfQorCisJVFJBQ0VfRVhJVChidXMpOworCisJcmV0dXJuICgwKTsK
K30KKworCitzdGF0aWMgaW50CittbWNzcGlfd3JpdGVfaXZhcihkZXZpY2VfdCBidXMsIGRldmlj
ZV90IGNoaWxkLCBpbnQgd2hpY2gsIHVpbnRwdHJfdCB2YWx1ZSkKK3sKKwlUUkFDRV9FTlRFUihi
dXMpOworCisJc3RydWN0IG1tY3NwaV9zbG90ICpzbG90ID0gZGV2aWNlX2dldF9pdmFycyhjaGls
ZCk7CisKKwlzd2l0Y2ggKHdoaWNoKSB7CisJZGVmYXVsdDoKKwkJcmV0dXJuIChFSU5WQUwpOwor
CWNhc2UgTU1DQlJfSVZBUl9CVVNfTU9ERToKKwkJc2xvdC0+aG9zdC5pb3MuYnVzX21vZGUgPSB2
YWx1ZTsKKwkJYnJlYWs7CisJY2FzZSBNTUNCUl9JVkFSX0JVU19XSURUSDoKKwkJc2xvdC0+aG9z
dC5pb3MuYnVzX3dpZHRoID0gdmFsdWU7CisJCWJyZWFrOworCWNhc2UgTU1DQlJfSVZBUl9DTE9D
SzoKKwkJc2xvdC0+aG9zdC5pb3MuY2xvY2sgPSB2YWx1ZTsKKwkJYnJlYWs7CisJY2FzZSBNTUNC
Ul9JVkFSX0NISVBfU0VMRUNUOgorCQlzbG90LT5ob3N0Lmlvcy5jaGlwX3NlbGVjdCA9IHZhbHVl
OworCQlicmVhazsKKwljYXNlIE1NQ0JSX0lWQVJfTU9ERToKKwkJc2xvdC0+aG9zdC5tb2RlID0g
dmFsdWU7CisJCWJyZWFrOworCWNhc2UgTU1DQlJfSVZBUl9PQ1I6CisJCXNsb3QtPmhvc3Qub2Ny
ID0gdmFsdWU7CisJCWJyZWFrOworCWNhc2UgTU1DQlJfSVZBUl9QT1dFUl9NT0RFOgorCQlzbG90
LT5ob3N0Lmlvcy5wb3dlcl9tb2RlID0gdmFsdWU7CisJCWJyZWFrOworCWNhc2UgTU1DQlJfSVZB
Ul9WREQ6CisJCXNsb3QtPmhvc3QuaW9zLnZkZCA9IHZhbHVlOworCQlicmVhazsKKwljYXNlIE1N
Q0JSX0lWQVJfVElNSU5HOgorCQlzbG90LT5ob3N0Lmlvcy50aW1pbmcgPSB2YWx1ZTsKKwkJYnJl
YWs7CisJY2FzZSBNTUNCUl9JVkFSX0JVU19UWVBFOgorCWNhc2UgTU1DQlJfSVZBUl9DQVBTOgor
CWNhc2UgTU1DQlJfSVZBUl9IT1NUX09DUjoKKwljYXNlIE1NQ0JSX0lWQVJfRl9NSU46CisJY2Fz
ZSBNTUNCUl9JVkFSX0ZfTUFYOgorCWNhc2UgTU1DQlJfSVZBUl9NQVhfREFUQToKKwkJcmV0dXJu
IChFSU5WQUwpOworCX0KKwlUUkFDRV9FWElUKGJ1cyk7CisKKwlyZXR1cm4gKDApOworfQorCisK
K3N0YXRpYyBpbnQKK21tY3NwaV91cGRhdGVfaW9zKGRldmljZV90IGJyZGV2LCBkZXZpY2VfdCBy
ZXFkZXYpCit7CisJVFJBQ0VfRU5URVIoYnJkZXYpOworCXN0cnVjdCBtbWNzcGlfc29mdGMgKnNj
ID0gZGV2aWNlX2dldF9zb2Z0YyhicmRldik7CisJc3RydWN0IG1tY3NwaV9zbG90ICpzbG90ID0g
ZGV2aWNlX2dldF9pdmFycyhyZXFkZXYpOworCXN0cnVjdCBzcGlfY29uZmlnIGNmZzsKKwlzdHJ1
Y3Qgc3BpX2NvbW1hbmQgc3BpX2NtZDsKKworCWlmIChwb3dlcl91cCA9PSBzbG90LT5ob3N0Lmlv
cy5wb3dlcl9tb2RlKSB7CisJCS8qCisJCSAqIFRoaXMgc2VxdWVuY2UgcHJvdmlkZXMgdGhlIGlu
aXRpYWxpemF0aW9uIHN0ZXBzIHJlcXVpcmVkCisJCSAqIGJ5IHRoZSBzcGVjIGFmdGVyIGNhcmQg
cG93ZXIgaXMgYXBwbGllZCwgYnV0IGJlZm9yZSBhbnkKKwkJICogY29tbWFuZHMgYXJlIGlzc3Vl
ZC4gIFRoZXNlIG9wZXJhdGlvbnMgYXJlIGhhcm1sZXNzIGlmCisJCSAqIGFwcGxpZWQgYXQgYW55
IG90aGVyIHRpbWUgKGFmdGVyIGEgd2FybSByZXNldCwgZm9yCisJCSAqIGV4YW1wbGUpLgorCQkg
Ki8KKworCQkvKiAKKwkJICogWFhYIFBvd2VyLW9uIHBvcnRpb24gb2YgaW1wbGVtZW50YXRpb24g
b2YgY2FyZCBwb3dlcgorCQkgKiBjb250cm9sIHNob3VsZCBnbyBoZXJlLiAgU2hvdWxkIHByb2Jh
Ymx5IGluY2x1ZGUgYSBwb3dlcgorCQkgKiBvZmYgZmlyc3QgdG8gZW5zdXJlIGNhcmQgaXMgZnVs
bHkgcmVzZXQgZnJvbSBhbnkgcHJldmlvdXMKKwkJICogc3RhdGUuCisJCSAqLworCisJCS8qIAor
CQkgKiBNYWtlIHN1cmUgcG93ZXIgdG8gY2FyZCBoYXMgcmFtcGVkIHVwLiAgVGhlIHNwZWMgcmVx
dWlyZXMKKwkJICogcG93ZXIgdG8gcmFtcCB1cCBpbiAzNW1zIG9yIGxlc3MuCisJCSAqLworCQlE
RUxBWSgzNTAwMCk7CisKKwkJLyoKKwkJICogUHJvdmlkZSBhdCBsZWFzdCA3NCBjbG9ja3Mgd2l0
aCBDUyBhbmQgTU9TSSBoaWdoIHRoYXQgdGhlCisJCSAqIHNwZWMgcmVxdWlyZXMgYWZ0ZXIgY2Fy
ZCBwb3dlciBzdGFiaWxpemVzLgorCQkgKi8KKworCQkvKiBVc2UgMTAwIGtIeiBmb3IgbWF4aW11
bSBjb21wYXRpYmlsaXR5LiAqLworCQljZmcuY2xvY2tfaHogPSAxMDAwMDA7CisJCVNQSUJVU19T
RVRfQ09ORklHKHNjLT5idXNkZXYsICZjZmcpOworCQlTUElCVVNfR0VUX0NPTkZJRyhzYy0+YnVz
ZGV2LCAmY2ZnKTsKKwkJc2xvdC0+aG9zdC5pb3MuY2xvY2sgPSBjZmcuY2xvY2tfaHo7CisKKwkJ
c3BpX2NtZC50eF9jbWQgPSBvbmVzYnVmOworCQlzcGlfY21kLnJ4X2NtZCA9IGp1bmtidWY7CisJ
CXNwaV9jbWQudHhfY21kX3N6ID0gc3BpX2NtZC5yeF9jbWRfc3ogPSAxMDsKKwkJc3BpX2NtZC50
eF9kYXRhID0gc3BpX2NtZC5yeF9kYXRhID0gTlVMTDsKKwkJc3BpX2NtZC50eF9kYXRhX3N6ID0g
c3BpX2NtZC5yeF9kYXRhX3N6ID0gMDsKKwkJc3BpX2NtZC5mbGFncyA9IFNQSV9TS0lQX0NISVBf
U0VMRUNUIHwgU1BJX0NISVBfU0VMRUNUX0hJR0g7CisKKwkJU1BJQlVTX1RSQU5TRkVSKHNjLT5i
dXNkZXYsIHNjLT5kZXYsICZzcGlfY21kKTsKKworCQkvKiAKKwkJICogUGVyaGFwcyB0aGlzIHdh
cyBhIHdhcm0gcmVzZXQgYW5kIHRoZSBjYXJkIGlzIGluIHRoZQorCQkgKiBtaWRkbGUgb2YgYSBs
b25nIG9wZXJhdGlvbi4KKwkJICovCisJCW1tY3NwaV93YWl0X2Zvcl9ub3RfYnVzeShicmRldik7
CisKKwkJc2xvdC0+bGFzdF9vcGNvZGUgPSAweGZmZmZmZmZmOworCQlzbG90LT5sYXN0X2ZsYWdz
ID0gMDsKKwkJbWVtc2V0KHNsb3QtPmxhc3Rfb2NyLCAwLCBNTUNTUElfT0NSX0xFTik7CisJCXNs
b3QtPmNyY19lbmFibGVkID0gMDsKKwkJc2xvdC0+Y3JjX2luaXRfZG9uZSA9IDA7CisJfQorCQor
CisJLyogCisJICogQSBjbG9jayB2YWx1ZSBvZiB6ZXJvIG1lYW5zIHNldCB0aGUgY2xvY2sgbGlu
ZSBsb3csIHdoaWNoIGlzIHRoZQorCSAqIG5vcm1hbCBzcGkgaWRsZSBzdGF0ZS4KKwkgKi8KKwlp
ZiAoc2xvdC0+aG9zdC5pb3MuY2xvY2sgPiAwKSB7CisJCWNmZy5jbG9ja19oeiA9IHNsb3QtPmhv
c3QuaW9zLmNsb2NrOworCQlTUElCVVNfU0VUX0NPTkZJRyhzYy0+YnVzZGV2LCAmY2ZnKTsKKwkJ
CQorCQkvKiByZXRyaWV2ZSB0aGUgcG9zc2libHkgYWRqdXN0ZWVkIGRvd253YXJkIHNldHRpbmcg
Ki8KKwkJU1BJQlVTX0dFVF9DT05GSUcoc2MtPmJ1c2RldiwgJmNmZyk7CisJCXNsb3QtPmhvc3Qu
aW9zLmNsb2NrID0gY2ZnLmNsb2NrX2h6OworCX0KKworCWlmIChwb3dlcl9vZmYgPT0gc2xvdC0+
aG9zdC5pb3MucG93ZXJfbW9kZSkgeworCQkvKgorCQkgKiBYWFggUG93ZXItb2ZmIHBvcnRpb24g
b2YgaW1wbGVtZW50YXRpb24gb2YgY2FyZCBwb3dlcgorCQkgKiBjb250cm9sIHNob3VsZCBnbyBo
ZXJlLgorCQkgKi8KKwl9CQorCisJVFJBQ0VfRVhJVChicmRldik7CisKKwlyZXR1cm4gKDApOwor
fQorCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK21tY3NwaV9kb19zcGlfcmVhZChkZXZpY2VfdCBk
ZXYsIHVpbnQ4X3QgKmRhdGEsIHVuc2lnbmVkIGludCBsZW4pCit7CisJVFJBQ0VfRU5URVIoZGV2
KTsKKwkKKwlzdHJ1Y3QgbW1jc3BpX3NvZnRjICpzYyA9IGRldmljZV9nZXRfc29mdGMoZGV2KTsK
KwlzdHJ1Y3Qgc3BpX2NvbW1hbmQgc3BpX2NtZDsKKwlpbnQgZXJyOworCisJc3BpX2NtZC50eF9j
bWQgPSBvbmVzYnVmOworCXNwaV9jbWQucnhfY21kID0gZGF0YTsKKwlzcGlfY21kLnR4X2NtZF9z
eiA9IHNwaV9jbWQucnhfY21kX3N6ID0gbGVuOworCXNwaV9jbWQudHhfZGF0YSA9IE5VTEw7CisJ
c3BpX2NtZC5yeF9kYXRhID0gTlVMTDsKKwlzcGlfY21kLnR4X2RhdGFfc3ogPSBzcGlfY21kLnJ4
X2RhdGFfc3ogPSAwOworCXNwaV9jbWQuZmxhZ3MgPSBTUElfU0tJUF9DSElQX1NFTEVDVDsKKwor
CWVyciA9IFNQSUJVU19UUkFOU0ZFUihzYy0+YnVzZGV2LCBzYy0+ZGV2LCAmc3BpX2NtZCk7CisK
KwlUUkFDRV9FWElUKGRldik7CisJcmV0dXJuIChlcnIgPyBNTUNfRVJSX0ZBSUxFRCA6IE1NQ19F
UlJfTk9ORSk7Cit9CisKKworc3RhdGljIHVuc2lnbmVkIGludAorbW1jc3BpX2RvX3NwaV93cml0
ZShkZXZpY2VfdCBkZXYsIHVpbnQ4X3QgKmNtZCwgdW5zaWduZWQgaW50IGNtZGxlbiwKKwkJICAg
IHVpbnQ4X3QgKmRhdGEsIHVuc2lnbmVkIGludCBkYXRhbGVuKQoreworCVRSQUNFX0VOVEVSKGRl
dik7CisJCisJc3RydWN0IG1tY3NwaV9zb2Z0YyAqc2MgPSBkZXZpY2VfZ2V0X3NvZnRjKGRldik7
CisJc3RydWN0IHNwaV9jb21tYW5kIHNwaV9jbWQ7CisJaW50IGVycjsKKworCXNwaV9jbWQudHhf
Y21kID0gY21kOworCXNwaV9jbWQucnhfY21kID0ganVua2J1ZjsKKwlzcGlfY21kLnR4X2NtZF9z
eiA9IHNwaV9jbWQucnhfY21kX3N6ID0gY21kbGVuOworCXNwaV9jbWQudHhfZGF0YSA9IGRhdGE7
CisJc3BpX2NtZC5yeF9kYXRhID0ganVua2J1ZjsKKwlzcGlfY21kLnR4X2RhdGFfc3ogPSBzcGlf
Y21kLnJ4X2RhdGFfc3ogPSBkYXRhbGVuOworCXNwaV9jbWQuZmxhZ3MgPSBTUElfU0tJUF9DSElQ
X1NFTEVDVDsKKworCWVyciA9IFNQSUJVU19UUkFOU0ZFUihzYy0+YnVzZGV2LCBzYy0+ZGV2LCAm
c3BpX2NtZCk7CisKKwlUUkFDRV9FWElUKGRldik7CisJcmV0dXJuIChlcnIgPyBNTUNfRVJSX0ZB
SUxFRCA6IE1NQ19FUlJfTk9ORSk7Cit9CisKKworc3RhdGljIHVuc2lnbmVkIGludAorbW1jc3Bp
X3dhaXRfZm9yX25vdF9idXN5KGRldmljZV90IGRldikKK3sKKwlUUkFDRV9FTlRFUihkZXYpOwor
CQorCWludCBpOworCXVuc2lnbmVkIGludCBlcnI7CisJdW5zaWduZWQgaW50IGJ1c3lfbGVuZ3Ro
ID0gMDsKKwl1aW50OF90IHBvbGxidWZbTU1DU1BJX1BPTExfTEVOXTsKKwlzdHJ1Y3QgYmludGlt
ZSBzdGFydCwgZWxhcHNlZDsKKworCVRSQUNFKGRldiwgQUNUSU9OLCAid2FpdGluZyBmb3Igbm90
IGJ1c3lcbiIpOworCisJZ2V0YmludGltZSgmc3RhcnQpOworCWRvIHsKKwkJVFJBQ0UoZGV2LCBE
RVRBSUxTLCAibG9va2luZyBmb3IgZW5kIG9mIGJ1c3lcbiIpOworCQllcnIgPSBtbWNzcGlfZG9f
c3BpX3JlYWQoZGV2LCBwb2xsYnVmLCBNTUNTUElfUE9MTF9MRU4pOworCQlpZiAoTU1DX0VSUl9O
T05FICE9IGVycikgeworCQkJVFJBQ0UoZGV2LCBFUlJPUiwgInNwaSByZWFkIGZhaWxlZFxuIik7
CisJCQlUUkFDRV9FWElUKGRldik7CisJCQlyZXR1cm4gKGVycik7CisJCX0KKworCQlmb3IgKGkg
PSAwOyBpIDwgTU1DU1BJX1BPTExfTEVOOyBpKyspIHsKKwkJCWlmIChwb2xsYnVmW2ldICE9IDB4
MDApIHsKKwkJCQlUUkFDRShkZXYsIERFVEFJTFMsCisJCQkJICAgICAgImVuZCBvZiBidXN5IGZv
dW5kIGF0ICVkXG4iLCBpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJ1c3lfbGVuZ3RoKys7CisJ
CX0KKworCQlnZXRiaW50aW1lKCZlbGFwc2VkKTsKKwkJYmludGltZV9zdWIoJmVsYXBzZWQsICZz
dGFydCk7CisKKwkJaWYgKGVsYXBzZWQuc2VjID4gTU1DU1BJX1RJTUVPVVRfU0VDKSB7CisJCQlU
UkFDRShkZXYsIEVSUk9SLCAiY2FyZCBidXN5IGZvciBsb25nZXIgdGhhbiB0aW1lb3V0XG4iKTsK
KwkJCXJldHVybiAoTU1DX0VSUl9USU1FT1VUKTsKKwkJfQorCX0gd2hpbGUgKE1NQ1NQSV9QT0xM
X0xFTiA9PSBpKTsKKworCVRSQUNFKGRldiwgUkVTVUxULCAiYnVzeSBmb3IgJXUgYnl0ZSBzbG90
c1xuIiwgYnVzeV9sZW5ndGgpOworCisJVFJBQ0VfRVhJVChkZXYpOworCXJldHVybiAoTU1DX0VS
Ul9OT05FKTsKK30KKworCitzdGF0aWMgdW5zaWduZWQgaW50CittbWNzcGlfc2hpZnRfY29weSh1
aW50OF90ICpkZXN0LCB1aW50OF90ICpzcmMsIHVuc2lnbmVkIGludCBkZXN0X2xlbiwKKwkJICB1
bnNpZ25lZCBpbnQgc2hpZnQpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlpZiAoMCA9PSBzaGlm
dCkgeworCQltZW1jcHkoZGVzdCwgc3JjLCBkZXN0X2xlbik7CisJfSBlbHNlIHsKKwkJZm9yIChp
ID0gMDsgaSA8IGRlc3RfbGVuOyBpKyspIHsKKwkJCWRlc3RbaV0gPQorCQkJICAgIChzcmNbaV0g
PDwgc2hpZnQpIHwgCisJCQkgICAgKHNyY1tpICsgMV0gPj4gKDggLSBzaGlmdCkpOworCQl9CisJ
fQorCisJcmV0dXJuIChkZXN0X2xlbik7Cit9CisKKworc3RhdGljIHVuc2lnbmVkIGludAorbW1j
c3BpX2dldF9yZXNwb25zZV90b2tlbihkZXZpY2VfdCBkZXYsIHVpbnQ4X3QgbWFzaywgdWludDhf
dCB2YWx1ZSwKKwkJCSAgdW5zaWduZWQgaW50IGxlbiwgdW5zaWduZWQgaW50IGhhc19idXN5LAor
CQkJICB1aW50OF90ICpyc3BidWYpCit7CisJaW50IGk7CisJdW5zaWduZWQgaW50IGVycjsKKwl1
bnNpZ25lZCBpbnQgb2Zmc2V0OworCXVuc2lnbmVkIGludCBzaGlmdCA9IDA7CisJdW5zaWduZWQg
aW50IHJlbWFpbmluZzsKKwlib29sZWFuX3QgZm91bmQ7CisJdWludDhfdCBwb2xsYnVmWzIgKiBN
TUNTUElfTUFYX1JTUF9MRU5dOworCXN0cnVjdCBiaW50aW1lIHN0YXJ0LCBlbGFwc2VkOworCisJ
VFJBQ0VfRU5URVIoZGV2KTsKKworCS8qCisJICogVGhpcyBsb29wIHNlYXJjaGVzIGRhdGEgY2xv
Y2tlZCBvdXQgb2YgdGhlIGNhcmQgZm9yIGEgcmVzcG9uc2UKKwkgKiB0b2tlbiBtYXRjaGluZyB0
aGUgZ2l2ZW4gbWFzayBhbmQgdmFsdWUuICBJdCB3aWxsIGxvY2F0ZSB0b2tlbnMKKwkgKiB0aGF0
IGFyZSBub3QgYnl0ZS1hbGlnbmVkLCBhcyBzb21lIGNhcmRzIHNlbmQgbm9uLWJ5dGUtYWxpZ25l
ZAorCSAqIHJlc3BvbnNlIHRva2VucyBpbiBzb21lIHNpdHVhdGlvbnMuICBGb3IgZXhhbXBsZSwg
dGhlIGZvbGxvd2luZworCSAqIGNhcmQgY29uc2lzdGVudGx5IHNlbmRzIGFuIHVuYWxpZ25lZCBy
ZXNwb25zZSB0b2tlbiB0byB0aGUgc3RvcAorCSAqIGNvbW1hbmQgdXNlZCB0byB0ZXJtaW5hdGUg
bXVsdGktYmxvY2sgcmVhZHM6CisJICoKKwkgKiBUcmFuc2NlbmQgMkdCIFNEU0MgY2FyZCwgY2lk
OgorCSAqIG1pZD0weDFiIG9pZD0weDUzNGQgcG5tPSIwMDAwMCIgcHJ2PTEuMCBtZHQ9MDAuMjAw
MAorCSAqLworCisJb2Zmc2V0ID0gMDsKKwlmb3VuZCA9IGZhbHNlOworCWdldGJpbnRpbWUoJnN0
YXJ0KTsKKwlkbyB7CisJCVRSQUNFKGRldiwgREVUQUlMUywKKwkJICAgICAgImxvb2tpbmcgZm9y
IHJlc3BvbnNlIHRva2VuIHdpdGggbWFzayAweCUwMngsIHZhbHVlIDB4JTAyeFxuIiwKKwkJICAg
ICAgbWFzaywgdmFsdWUpOworCQllcnIgPSBtbWNzcGlfZG9fc3BpX3JlYWQoZGV2LCAmcG9sbGJ1
ZltvZmZzZXRdLCBsZW4pOworCQlpZiAoTU1DX0VSUl9OT05FICE9IGVycikgeworCQkJVFJBQ0Uo
ZGV2LCBFUlJPUiwgInNwaSByZWFkIG9mIHJlc3BvbnNlIHRva2VuIGZhaWxlZFxuIik7CisJCQlU
UkFDRV9FWElUKGRldik7CisJCQlyZXR1cm4gKGVycik7CisJCX0KKworCisJCWZvciAoaSA9IDA7
IGkgPCBsZW4gKyBvZmZzZXQ7IGkrKykgeworCQkJaWYgKChwb2xsYnVmW2ldICYgbWFzaykgPT0g
dmFsdWUpIHsKKwkJCQlUUkFDRShkZXYsIERFVEFJTFMsCisJCQkJICAgICAgInJlc3BvbnNlIHRv
a2VuIGZvdW5kIGF0ICVkICgweCUwMngpXG4iLAorCQkJCSAgICAgIGksIHBvbGxidWZbaV0pOwor
CQkJCXNoaWZ0ID0gMDsKKwkJCQlmb3VuZCA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9IGVsc2Ug
aWYgKGkgPCBsZW4gKyBvZmZzZXQgLSAxKSB7CisJCQkJLyogCisJCQkJICogTm90IHRoZSBsYXN0
IGJ5dGUgaW4gdGhlIGJ1ZmZlciwgc28gY2hlY2sKKwkJCQkgKiBmb3IgYSBub24tYWxpZ25lZCBy
ZXNwb25zZS4KKwkJCQkgKi8KKwkJCQl1aW50MTZfdCBzZWFyY2hfc3BhY2UgPQorCQkJCSAgICAo
KHVpbnQxNl90KXBvbGxidWZbaV0gPDwgOCkgfCBwb2xsYnVmW2kgKyAxXTsKKwkJCQl1aW50MTZf
dCBzZWFyY2hfbWFzayA9ICh1aW50MTZfdCltYXNrIDw8IDg7CisJCQkJdWludDE2X3Qgc2VhcmNo
X3ZhbHVlID0gKHVpbnQxNl90KXZhbHVlIDw8IDg7CisKKwkJCQlUUkFDRShkZXYsIERFVEFJTFMs
CisJCQkJICAgICAgInNlYXJjaDogc3BhY2U9MHglMDR4IG1hc2s9MHglMDR4IHZhbD0weCUwNHhc
biIsIAorCQkJCSAgICAgIHNlYXJjaF9zcGFjZSwgc2VhcmNoX21hc2ssIHNlYXJjaF92YWx1ZSk7
CisKKwkJCQlmb3IgKHNoaWZ0ID0gMTsgc2hpZnQgPCA4OyBzaGlmdCsrKSB7CisJCQkJCXNlYXJj
aF9zcGFjZSA8PD0gMTsKKwkJCQkJaWYgKChzZWFyY2hfc3BhY2UgJiBzZWFyY2hfbWFzaykgPT0K
KwkJCQkJICAgIHNlYXJjaF92YWx1ZSkgeworCQkJCQkJZm91bmQgPSB0cnVlOworCQkJCQkJVFJB
Q0UoZGV2LCBERVRBSUxTLAorCQkJCQkJICAgICAgIkZvdW5kIG1hdGNoIGF0IHNoaWZ0ICV1XG4i
LAorCQkJCQkJICAgICAgc2hpZnQpOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisKKwkJ
CQlpZiAoc2hpZnQgPCA4KSB7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJ
LyogCisJCQkJICogTW92ZSB0aGUgbGFzdCBieXRlIHRvIHRoZSBmaXJzdCBwb3NpdGlvbgorCQkJ
CSAqIGFuZCBnbyAncm91bmQgYWdhaW4uCisJCQkJICovCisJCQkJcG9sbGJ1ZlswXSA9IHBvbGxi
dWZbaV07CisJCQl9CisJCX0KKworCQlpZiAoIWZvdW5kKSB7CisJCQlvZmZzZXQgPSAxOworCisJ
CQlnZXRiaW50aW1lKCZlbGFwc2VkKTsKKwkJCWJpbnRpbWVfc3ViKCZlbGFwc2VkLCAmc3RhcnQp
OworCisJCQlpZiAoZWxhcHNlZC5zZWMgPiBNTUNTUElfVElNRU9VVF9TRUMpIHsKKwkJCQlUUkFD
RShkZXYsIEVSUk9SLAorCQkJCSAgICAgICJ0aW1lb3V0IHdoaWxlIGxvb2tpbmcgZm9yIHJlcG9u
c2UgdG9rZW5cbiIpOworCQkJCXJldHVybiAoTU1DX0VSUl9USU1FT1VUKTsKKwkJCX0KKwkJfQor
CX0gd2hpbGUgKCFmb3VuZCk7CisKKwkvKiAKKwkgKiBOb3RlIHRoYXQgaWYgaSA9PSAwIGFuZCBv
ZmZzZXQgPT0gMSwgc2hpZnQgaXMgYWx3YXlzIGdyZWF0ZXIgdGhhbgorCSAqIHplcm8uCisJICov
CisJcmVtYWluaW5nID0gaSAtIG9mZnNldCArIChzaGlmdCA/IDEgOiAwKTsKKworCVRSQUNFKGRl
diwgREVUQUlMUywgImxlbj0ldSBpPSV1IHJlbT0ldSBzaGlmdD0ldVxuIiwKKwkgICAgICBsZW4s
IGksIHJlbWFpbmluZywgc2hpZnQpOworCisJaWYgKHJlbWFpbmluZykgeworCQllcnIgPSBtbWNz
cGlfZG9fc3BpX3JlYWQoZGV2LCAmcG9sbGJ1ZltsZW4gKyBvZmZzZXRdLCByZW1haW5pbmcpOwor
CQlpZiAoTU1DX0VSUl9OT05FICE9IGVycikgeworCQkJVFJBQ0UoZGV2LCBFUlJPUiwKKwkJCSAg
ICAgICJzcGkgcmVhZCBvZiByZW1haW5kZXIgb2YgcmVzcG9uc2UgdG9rZW4gZmFpbGVkXG4iKTsK
KwkJCVRSQUNFX0VYSVQoZGV2KTsKKwkJCXJldHVybiAoZXJyKTsKKwkJfQorCX0KKworCW1tY3Nw
aV9zaGlmdF9jb3B5KHJzcGJ1ZiwgJnBvbGxidWZbaV0sIGxlbiwgc2hpZnQpOworCisJaWYgKFRS
QUNFX1pPTkVfRU5BQkxFRChSRVNVTFQpKSB7CisJCVRSQUNFKGRldiwgUkVTVUxULCAicmVzcG9u
c2UgPSIpOworCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJCXByaW50ZigiIDB4JTAy
eCIsIHJzcGJ1ZltpXSk7CisJCX0KKwkJcHJpbnRmKCJcbiIpOworCX0KKworCWlmIChoYXNfYnVz
eSkgeworCQllcnIgPSBtbWNzcGlfd2FpdF9mb3Jfbm90X2J1c3koZGV2KTsKKwkJaWYgKE1NQ19F
UlJfTk9ORSAhPSBlcnIpIHsKKwkJCVRSQUNFX0VYSVQoZGV2KTsKKwkJCXJldHVybiAoZXJyKTsK
KwkJfQorCX0KKwkKKwlUUkFDRV9FWElUKGRldik7CisKKwlyZXR1cm4gKE1NQ19FUlJfTk9ORSk7
Cit9CisKKworc3RhdGljIHVuc2lnbmVkIGludAorbW1jc3BpX3NldF91cF9jb21tYW5kKGRldmlj
ZV90IGRldiwgc3RydWN0IG1tY3NwaV9jb21tYW5kICptbWNzcGlfY21kLAorCQkgICAgICBzdHJ1
Y3QgbW1jX2NvbW1hbmQgKm1tY19jbWQpCit7CisJc3RydWN0IG1tY3NwaV9zb2Z0YyAqc2MgPSBk
ZXZpY2VfZ2V0X3NvZnRjKGRldik7CisJc3RydWN0IG1tY3NwaV9zbG90ICpzbG90ID0gJnNjLT5z
bG90OworCXVpbnQzMl90IG9wY29kZSA9IG1tY19jbWQtPm9wY29kZTsKKwl1aW50MzJfdCBhcmcg
PSBtbWNfY21kLT5hcmc7CisJdWludDMyX3QgZmxhZ3MgPSBtbWNfY21kLT5mbGFnczsKKwl1aW50
MzJfdCByZXRyaWVzID0gbW1jX2NtZC0+cmV0cmllczsKKwl1bnNpZ25lZCBjaGFyIHJzcF90eXBl
OworCXVuc2lnbmVkIGNoYXIgcnNwX2xlbjsKKwl1bnNpZ25lZCBpbnQgbGRhdGFfbGVuID0gMDsK
Kwl1bnNpZ25lZCBpbnQgdXNlX2NyYyA9IHNsb3QtPmNyY19lbmFibGVkOworCisJaWYgKGZsYWdz
ICYgTU1DX0NNRF9JU19BUFApIHsKKwkJc3dpdGNoIChvcGNvZGUpIHsKKwkJY2FzZSBBQ01EX1NE
X1NUQVRVUzoKKwkJCXJzcF90eXBlID0gTU1DU1BJX1JTUF9SMjsKKwkJCWJyZWFrOworCQljYXNl
IEFDTURfU0VORF9OVU1fV1JfQkxPQ0tTOgorCQljYXNlIEFDTURfU0VUX1dSX0JMS19FUkFTRV9D
T1VOVDoKKwkJY2FzZSBBQ01EX1NFVF9DTFJfQ0FSRF9ERVRFQ1Q6CisJCWNhc2UgQUNNRF9TRU5E
X1NDUjoKKwkJCXJzcF90eXBlID0gTU1DU1BJX1JTUF9SMTsKKwkJCWJyZWFrOworCQljYXNlIEFD
TURfU0RfU0VORF9PUF9DT05EOgorCQkJLyogb25seSBIQ1MgYml0IGlzIHZhbGlkIGluIHNwaSBt
b2RlICovCisJCQlhcmcgJj0gMHg0MDAwMDAwMDsKKwkJCXJzcF90eXBlID0gTU1DU1BJX1JTUF9S
MTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJVFJBQ0UoZGV2LCBFUlJPUiwgIkludmFsaWQg
YXBwIGNvbW1hbmQgb3Bjb2RlICV1XG4iLAorCQkJICAgICAgb3Bjb2RlKTsKKwkJCXJldHVybiAo
TU1DX0VSUl9JTlZBTElEKTsKKwkJfQorCX0gZWxzZSB7CisJCXN3aXRjaCAob3Bjb2RlKSB7CisJ
CWNhc2UgTU1DX0dPX0lETEVfU1RBVEU6CisJCQl1c2VfY3JjID0gMTsKKwkJCXJzcF90eXBlID0g
TU1DU1BJX1JTUF9SMTsKKwkJCWJyZWFrOworCisJCWNhc2UgTU1DX1NFTkRfT1BfQ09ORDoKKwkJ
Y2FzZSBNTUNfU1dJVENIX0ZVTkM6ICAvKiBhbHNvIFNEX1NXSVRDSF9GVU5DICovCisJCWNhc2Ug
TU1DX1NFVF9CTE9DS0xFTjoKKwkJY2FzZSBNTUNfUkVBRF9TSU5HTEVfQkxPQ0s6CisJCWNhc2Ug
TU1DX1JFQURfTVVMVElQTEVfQkxPQ0s6CisJCWNhc2UgTU1DX1dSSVRFX0JMT0NLOgorCQljYXNl
IE1NQ19XUklURV9NVUxUSVBMRV9CTE9DSzoKKwkJY2FzZSBNTUNfUFJPR1JBTV9DU0Q6CisJCWNh
c2UgTU1DX1NFTkRfV1JJVEVfUFJPVDoKKwkJY2FzZSBTRF9FUkFTRV9XUl9CTEtfU1RBUlQ6CisJ
CWNhc2UgU0RfRVJBU0VfV1JfQkxLX0VORDoKKwkJY2FzZSBNTUNfTE9DS19VTkxPQ0s6CisJCWNh
c2UgTU1DX0dFTl9DTUQ6CisJCWNhc2UgTU1DU1BJX0NSQ19PTl9PRkY6CisJCQlyc3BfdHlwZSA9
IE1NQ1NQSV9SU1BfUjE7CisJCQlicmVhazsKKworCQljYXNlIE1NQ19TRU5EX0NTRDoKKwkJY2Fz
ZSBNTUNfU0VORF9DSUQ6CisJCQlhcmcgPSAwOyAvKiBubyByY2EgaW4gc3BpIG1vZGUgKi8KKwkJ
CXJzcF90eXBlID0gTU1DU1BJX1JTUF9SMTsKKwkJCWxkYXRhX2xlbiA9IDE2OworCQkJYnJlYWs7
CisKKwkJY2FzZSBNTUNfQVBQX0NNRDoKKwkJCWFyZyA9IDA7IC8qIG5vIHJjYSBpbiBzcGkgbW9k
ZSAqLworCQkJcnNwX3R5cGUgPSBNTUNTUElfUlNQX1IxOworCQkJYnJlYWs7CisKKwkJY2FzZSBN
TUNfU1RPUF9UUkFOU01JU1NJT046CisJCWNhc2UgTU1DX1NFVF9XUklURV9QUk9UOgorCQljYXNl
IE1NQ19DTFJfV1JJVEVfUFJPVDoKKwkJY2FzZSBNTUNfRVJBU0U6CisJCQlyc3BfdHlwZSA9IE1N
Q1NQSV9SU1BfUjFCOworCQkJYnJlYWs7CisKKwkJY2FzZSBNTUNfQUxMX1NFTkRfQ0lEOgorCQkJ
LyogaGFuZGxlIE1NQ19BTExfU0VORF9DSUQgYXMgTU1DX1NFTkRfQ0lEICovCisJCQlvcGNvZGUg
PSBNTUNfU0VORF9DSUQ7CisJCQlyc3BfdHlwZSA9IE1NQ1NQSV9SU1BfUjE7CisJCQlsZGF0YV9s
ZW4gPSAxNjsKKwkJCWJyZWFrOworCisJCWNhc2UgTU1DX1NFTkRfU1RBVFVTOgorCQkJYXJnID0g
MDsgLyogbm8gcmNhIGluIHNwaSBtb2RlICovCisJCQlyc3BfdHlwZSA9IE1NQ1NQSV9SU1BfUjI7
CisJCQlicmVhazsKKworCisJCWNhc2UgTU1DU1BJX1JFQURfT0NSOgorCQkJcnNwX3R5cGUgPSBN
TUNTUElfUlNQX1IzOworCQkJYnJlYWs7CisKKwkJY2FzZSBTRF9TRU5EX1JFTEFUSVZFX0FERFI6
CisJCQkvKiAKKwkJCSAqIEhhbmRsZSBTRF9TRU5EX1JFTEFUSVZFX0FERFIgYXMgTU1DX1NFTkRf
U1RBVFVTIC0KKwkJCSAqIHRoZSByY2EgcmV0dXJuZWQgdG8gdGhlIGNhbGxlciB3aWxsIGFsd2F5
cyBiZSAwLgorCQkJICovCisJCQlvcGNvZGUgPSBNTUNfU0VORF9TVEFUVVM7CisJCQlyc3BfdHlw
ZSA9IE1NQ1NQSV9SU1BfUjI7CisJCQlicmVhazsKKworCQljYXNlIFNEX1NFTkRfSUZfQ09ORDoK
KwkJCXVzZV9jcmMgPSAxOworCQkJcnNwX3R5cGUgPSBNTUNTUElfUlNQX1I3OworCQkJYnJlYWs7
CisKKwkJZGVmYXVsdDoKKwkJCVRSQUNFKGRldiwgRVJST1IsICJJbnZhbGlkIGNvbW1hbmQgb3Bj
b2RlICV1XG4iLCBvcGNvZGUpOworCQkJcmV0dXJuIChNTUNfRVJSX0lOVkFMSUQpOworCQl9CQkK
Kwl9CisKKwlzd2l0Y2ggKHJzcF90eXBlKSB7CisJY2FzZSBNTUNTUElfUlNQX1IxOgorCWNhc2Ug
TU1DU1BJX1JTUF9SMUI6IHJzcF9sZW4gPSAxOyBicmVhazsgCisKKwljYXNlIE1NQ1NQSV9SU1Bf
UjI6ICByc3BfbGVuID0gMjsgYnJlYWs7IAorCisJY2FzZSBNTUNTUElfUlNQX1IzOgorCWNhc2Ug
TU1DU1BJX1JTUF9SNzogIHJzcF9sZW4gPSA1OyBicmVhazsKKworCWRlZmF1bHQ6CisJCVRSQUNF
KGRldiwgRVJST1IsICJVbmtub3duIHJlc3BvbnNlIHR5cGUgJXVcbiIsIHJzcF90eXBlKTsKKwkJ
cmV0dXJuIChNTUNfRVJSX0lOVkFMSUQpOworCX0KKworCW1tY3NwaV9jbWQtPm1tY19jbWQgPSBt
bWNfY21kOworCisJbW1jc3BpX2NtZC0+b3Bjb2RlID0gb3Bjb2RlOworCW1tY3NwaV9jbWQtPmFy
ZyA9IGFyZzsKKwltbWNzcGlfY21kLT5mbGFncyA9IGZsYWdzOworCW1tY3NwaV9jbWQtPnJldHJp
ZXMgPSByZXRyaWVzOworCW1tY3NwaV9jbWQtPnVzZV9jcmMgPSB1c2VfY3JjOworCW1tY3NwaV9j
bWQtPmVycm9yX21hc2sgPSBNTUNTUElfUjFfRVJSX01BU0s7CisJaWYgKG1tY3NwaV9jbWQtPnVz
ZV9jcmMpIHsKKwkJbW1jc3BpX2NtZC0+ZXJyb3JfbWFzayAmPSB+TU1DU1BJX1IxX0NSQ19FUlI7
CisJfQorCW1tY3NwaV9jbWQtPnJzcF90eXBlID0gcnNwX3R5cGU7CisJbW1jc3BpX2NtZC0+cnNw
X2xlbiA9IHJzcF9sZW47CisKKwltZW1zZXQoJm1tY3NwaV9jbWQtPmxkYXRhLCAwLCBzaXplb2Yo
c3RydWN0IG1tY19kYXRhKSk7CisJbW1jc3BpX2NtZC0+bGRhdGEubGVuID0gbGRhdGFfbGVuOwor
CWlmIChsZGF0YV9sZW4pIHsKKwkJbW1jc3BpX2NtZC0+bGRhdGEuZGF0YSA9IHNjLT5zbG90Lmxk
YXRhX2J1ZjsKKwkJbW1jc3BpX2NtZC0+bGRhdGEuZmxhZ3MgPSBNTUNfREFUQV9SRUFEOworCQkK
KwkJbW1jc3BpX2NtZC0+ZGF0YSA9ICZtbWNzcGlfY21kLT5sZGF0YTsKKwl9IGVsc2UgeworCQlt
bWNzcGlfY21kLT5kYXRhID0gbW1jX2NtZC0+ZGF0YTsKKwl9CisKKwlyZXR1cm4gKE1NQ19FUlJf
Tk9ORSk7Cit9CisKKworc3RhdGljIHVuc2lnbmVkIGludAorbW1jc3BpX3NlbmRfY21kKGRldmlj
ZV90IGRldiwgc3RydWN0IG1tY3NwaV9jb21tYW5kICpjbWQsIHVpbnQ4X3QgKnJzcGJ1ZikKK3sK
KwlUUkFDRV9FTlRFUihkZXYpOworCisJdW5zaWduZWQgaW50IGVycjsKKwl1aW50MzJfdCBvcGNv
ZGUgPSBjbWQtPm9wY29kZTsKKwl1aW50MzJfdCBhcmcgPSBjbWQtPmFyZzsKKwl1aW50OF90IHR4
YnVmWzhdOworCXVpbnQ4X3QgY3JjOworCisJVFJBQ0UoZGV2LCBBQ1RJT04sICJzZW5kaW5nICVz
TUQldSgweCUwOHgpXG4iLAorCSAgICAgIGNtZC0+ZmxhZ3MgJiBNTUNfQ01EX0lTX0FQUCA/ICJB
QyI6ICJDIiwgb3Bjb2RlLCBhcmcpOworCisJLyoKKwkgKiBTZW5kaW5nIHRoaXMgYnl0ZSBhaGVh
ZCBvZiBlYWNoIGNvbW1hbmQgcHJldmVudHMgc29tZSBjYXJkcyBmcm9tCisJICogcmVzcG9uZGlu
ZyB3aXRoIHVuYWxpZ25lZCBkYXRhLCBhbmQgZG9lc24ndCBib3RoZXIgdGhlIG90aGVycy4KKwkg
KiBFeGFtcGxlczoKKwkgKgorCSAqIFNhbmRpc2sgMzJHQiBTREhDIGNhcmQsIGNpZDoKKwkgKiBt
aWQ9MHgwMyBvaWQ9MHg1MzQ0IHBubT0iU1UzMkciIHBydj04LjAgbWR0PTAwLjIwMDAKKwkgKi8K
Kwl0eGJ1ZlswXSA9IDB4ZmY7CisKKwl0eGJ1ZlsxXSA9IDB4NDAgfCAob3Bjb2RlICYgMHgzZik7
CisJdHhidWZbMl0gPSBhcmcgPj4gMjQ7CisJdHhidWZbM10gPSAoYXJnID4+IDE2KSAmIDB4ZmY7
CisJdHhidWZbNF0gPSAoYXJnID4+IDgpICYgMHhmZjsKKwl0eGJ1Zls1XSA9IGFyZyAmIDB4ZmY7
CisKKwlpZiAoY21kLT51c2VfY3JjKSB7CisJCWNyYyA9IHVwZGF0ZV9jcmM3KENSQzdfSU5JVElB
TCwgJnR4YnVmWzFdLCA1KTsKKwl9IGVsc2UgeworCQljcmMgPSAwOworCX0KKwkKKwl0eGJ1Zls2
XSA9IChjcmMgPDwgMSkgfCAweDAxOworCisJIC8qCisJICAqIFNvbWUgY2FyZHMgaGF2ZSBnYXJi
YWdlIG9uIHRoZSBidXMgaW4gdGhlIGZpcnN0IGJ5dGUgc2xvdCBhZnRlcgorCSAgKiB0aGUgbGFz
dCBjb21tYW5kIGJ5dGUuICBUaGlzIHNlZW1zIHRvIGJlIGNvbW1vbiB3aXRoIHRoZSBzdG9wCisJ
ICAqIGNvbW1hbmQuICBDbG9ja2luZyBvdXQgYW4gZXh0cmEgYnl0ZSB3aXRoIHRoZSBjb21tYW5k
IHdpbGwKKwkgICogcmVzdWx0IGluIHRoYXQgZGF0YSBub3QgYmVpbmcgc2VhcmNoZWQgZm9yIHRo
ZSByZXNwb25zZSB0b2tlbiwKKwkgICogd2hpY2ggaXMgb2ssIGJlY2F1c2Ugbm8gY2FyZHMgcmVz
cG9uZCB0aGF0IGZhc3QuCisJICAqLworCXR4YnVmWzddID0gMHhmZjsKKworCWVyciA9IG1tY3Nw
aV9kb19zcGlfd3JpdGUoZGV2LCB0eGJ1Ziwgc2l6ZW9mKHR4YnVmKSwgTlVMTCwgMCk7CisJaWYg
KE1NQ19FUlJfTk9ORSAhPSBlcnIpIHsKKwkJVFJBQ0UoZGV2LCBFUlJPUiwgInNwaSB3cml0ZSBv
ZiBjb21tYW5kIGZhaWxlZFxuIik7CisJCVRSQUNFX0VYSVQoZGV2KTsKKwkJcmV0dXJuIChlcnIp
OworCX0KKworCVRSQUNFKGRldiwgREVUQUlMUywKKwkgICAgICAicnggY21kIGJ5dGVzIDB4JTAy
eCAweCUwMnggMHglMDJ4IDB4JTAyeCAweCUwMnggMHglMDJ4XG4iLAorCSAgICAgIGp1bmtidWZb
MF0sIGp1bmtidWZbMV0sIGp1bmtidWZbMl0sIGp1bmtidWZbM10sIGp1bmtidWZbNF0sCisJICAg
ICAganVua2J1Zls1XSApOworCVRSQUNFKGRldiwgREVUQUlMUywgInNraXBwZWQgcmVzcG9uc2Ug
Ynl0ZSBpcyAweCUwMnhcbiIsIGp1bmtidWZbNl0pOworCisJZXJyID0gbW1jc3BpX2dldF9yZXNw
b25zZV90b2tlbihkZXYsIE1NQ1NQSV9SMV9NQVNLLCBNTUNTUElfUjFfVkFMVUUsCisJCQkJCWNt
ZC0+cnNwX2xlbiwKKwkJCQkJTU1DU1BJX1JTUF9SMUIgPT0gY21kLT5yc3BfdHlwZSwgcnNwYnVm
KTsKKworCWlmIChNTUNfRVJSX05PTkUgPT0gZXJyKSB7CisJCWlmIChyc3BidWZbMF0gJiBjbWQt
PmVycm9yX21hc2sgJiBNTUNTUElfUjFfQ1JDX0VSUikgeworCQkJZXJyID0gTU1DX0VSUl9CQURD
UkM7CisJCX0gZWxzZSBpZiAocnNwYnVmWzBdICYgY21kLT5lcnJvcl9tYXNrKSB7CisJCQllcnIg
PSBNTUNfRVJSX0lOVkFMSUQ7CisJCX0KKwl9CisKKwlUUkFDRV9FWElUKGRldik7CisJcmV0dXJu
IChlcnIpOworfQorCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK21tY3NwaV9yZWFkX2Jsb2NrKGRl
dmljZV90IGRldiwgdWludDhfdCAqZGF0YSwgdW5zaWduZWQgaW50IGxlbiwKKwkJICB1bnNpZ25l
ZCBpbnQgY2hlY2tfY3JjMTYsIHVuc2lnbmVkIGludCBjaGVja19jcmM3KQoreworCVRSQUNFX0VO
VEVSKGRldik7CisJCisJaW50IGk7CisJdW5zaWduZWQgaW50IGVycjsKKwl1bnNpZ25lZCBpbnQg
bm9uX3Rva2VuX2J5dGVzOworCXVuc2lnbmVkIGludCBkYXRhX2NhcHR1cmVkOworCXVuc2lnbmVk
IGludCBjcmNfY2FwdHVyZWQ7CisJdW5zaWduZWQgaW50IHBvbGxidWZwb3M7CisJdW5zaWduZWQg
aW50IGNyYzE2X21pc21hdGNoID0gMDsKKwl1aW50MTZfdCBjcmMxNiwgY29tcHV0ZWRfY3JjMTY7
CisJdWludDhfdCBjcmM3LCBjb21wdXRlZF9jcmM3OworCXVpbnQ4X3QgcG9sbGJ1ZltNTUNTUElf
UE9MTF9MRU5dOworCXVpbnQ4X3QgY3JjYnVmW01NQ1NQSV9EQVRBX0NSQ19MRU5dOworCXN0cnVj
dCBiaW50aW1lIHN0YXJ0OworCXN0cnVjdCBiaW50aW1lIGVsYXBzZWQ7CisKKwlUUkFDRShkZXYs
IEFDVElPTiwgInJlYWQgYmxvY2soJXUpXG4iLCBsZW4pOworCisJLyogCisJICogV2l0aCB0aGlz
IGFwcHJvYWNoLCB3ZSBjb3VsZCBwb2ludGxlc3NseSByZWFkIHVwIHRvCisJICogKE1NQ1NQSV9Q
T0xMX0xFTiAtIDMgLSBsZW4pIGJ5dGVzIGZyb20gdGhlIHNwaSBidXMsIGJ1dCBvbmx5IGluCisJ
ICogdGhlIG9kZCBzaXR1YXRpb24gd2hlcmUgTU1DU1BJX1BPTExfTEVOIGlzIGdyZWF0ZXIgdGhh
biBsZW4gKyAzLgorCSAqLworCWdldGJpbnRpbWUoJnN0YXJ0KTsKKwlkbyB7CisJCVRSQUNFKGRl
diwgREVUQUlMUywgImxvb2tpbmcgZm9yIHJlYWQgdG9rZW5cbiIpOworCQllcnIgPSBtbWNzcGlf
ZG9fc3BpX3JlYWQoZGV2LCBwb2xsYnVmLCBNTUNTUElfUE9MTF9MRU4pOworCQlpZiAoTU1DX0VS
Ul9OT05FICE9IGVycikgeworCQkJVFJBQ0UoZGV2LCBFUlJPUiwgInRva2VuIHJlYWQgb24gc3Bp
IGZhaWxlZFxuIik7CisJCQlUUkFDRV9FWElUKGRldik7CisJCQlyZXR1cm4gKGVycik7CisJCX0K
KwkgIAorCQlmb3IgKGkgPSAwOyBpIDwgTU1DU1BJX1BPTExfTEVOOyBpKyspIHsKKwkJCWlmIChN
TUNTUElfVE9LRU5fU0IgPT0gcG9sbGJ1ZltpXSkgeworCQkJCVRSQUNFKGRldiwgUkVTVUxULAor
CQkJCSAgICAgICJmb3VuZCBzdGFydCBibG9jayB0b2tlbiBhdCAlZFxuIiwgaSk7CisJCQkJYnJl
YWs7CisJCQl9IGVsc2UgaWYgKE1NQ1NQSV9JU19ERV9UT0tFTihwb2xsYnVmW2ldKSkgeyAKKwkJ
CQlUUkFDRShkZXYsIEVSUk9SLAorCQkJCSAgICAgICJmb3VuZCBkYXRhIGVycm9yIHRva2VuIGF0
ICVkXG4iLCBpKTsKKwkJCQlUUkFDRV9FWElUKGRldik7CisJCQkJcmV0dXJuIChNTUNfRVJSX0ZB
SUxFRCk7CisJCQl9CisJCX0KKworCQlnZXRiaW50aW1lKCZlbGFwc2VkKTsKKwkJYmludGltZV9z
dWIoJmVsYXBzZWQsICZzdGFydCk7CisKKwkJaWYgKGVsYXBzZWQuc2VjID4gTU1DU1BJX1RJTUVP
VVRfU0VDKSB7CisJCQlUUkFDRShkZXYsIEVSUk9SLAorCQkJICAgICAgInRpbWVvdXQgd2hpbGUg
bG9va2luZyBmb3IgcmVhZCB0b2tlblxuIik7CisJCQlyZXR1cm4gKE1NQ19FUlJfVElNRU9VVCk7
CisJCX0KKwl9IHdoaWxlIChNTUNTUElfUE9MTF9MRU4gPT0gaSk7CisJCisJLyogY29weSBhbnkg
ZGF0YSBjYXB0dXJlZCBpbiB0YWlsIG9mIHBvbGwgYnVmIHRvIGRhdGEgYnVmICovCisJbm9uX3Rv
a2VuX2J5dGVzID0gTU1DU1BJX1BPTExfTEVOIC0gaSAtIDE7CisJZGF0YV9jYXB0dXJlZCA9IG1p
bihub25fdG9rZW5fYnl0ZXMsIGxlbik7CisJY3JjX2NhcHR1cmVkID0gbm9uX3Rva2VuX2J5dGVz
IC0gZGF0YV9jYXB0dXJlZDsKKwlwb2xsYnVmcG9zID0gaSArIDE7CisKKwlUUkFDRShkZXYsIERF
VEFJTFMsICJkYXRhIGJ5dGVzIGNhcHR1cmVkIGluIHBvbGxidWYgPSAldVxuIiwKKwkgICAgICBk
YXRhX2NhcHR1cmVkKTsKKworCW1lbWNweShkYXRhLCAmcG9sbGJ1Zltwb2xsYnVmcG9zXSwgZGF0
YV9jYXB0dXJlZCk7CisJcG9sbGJ1ZnBvcyArPSBkYXRhX2NhcHR1cmVkOworCisJVFJBQ0UoZGV2
LCBERVRBSUxTLCAiZGF0YSBieXRlcyB0byByZWFkID0gJXUsIGNyY19jYXB0dXJlZCA9ICV1XG4i
LAorCSAgICAgIGxlbiAtIGRhdGFfY2FwdHVyZWQsIGNyY19jYXB0dXJlZCk7CisKKwkvKiBnZXQg
YW55IHJlbWFpbmluZyBkYXRhIGZyb20gdGhlIHNwaSBidXMgKi8KKwlpZiAoZGF0YV9jYXB0dXJl
ZCA8IGxlbikgeworCQllcnIgPSBtbWNzcGlfZG9fc3BpX3JlYWQoZGV2LCAmZGF0YVtkYXRhX2Nh
cHR1cmVkXSwKKwkJCQkJIGxlbiAtIGRhdGFfY2FwdHVyZWQpOworCQlpZiAoTU1DX0VSUl9OT05F
ICE9IGVycikgeworCQkJVFJBQ0UoZGV2LCBFUlJPUiwKKwkJCSAgICAgICJzcGkgcmVhZCBvZiBy
ZW1haW5kZXIgb2YgYmxvY2sgZmFpbGVkXG4iKTsKKwkJCVRSQUNFX0VYSVQoZGV2KTsKKwkJCXJl
dHVybiAoZXJyKTsKKwkJfQorCisJfQorCisJLyogY29weSBhbnkgY3JjIGNhcHR1cmVkIGluIHRo
ZSBwb2xsIGJ1ZiB0byB0aGUgY3JjIGJ1ZiAqLworCW1lbWNweShjcmNidWYsICZwb2xsYnVmW3Bv
bGxidWZwb3NdLCBjcmNfY2FwdHVyZWQpOworCisJLyogZ2V0IGFueSByZW1haW5pbmcgY3JjICov
CisJaWYgKGNyY19jYXB0dXJlZCA8IE1NQ1NQSV9EQVRBX0NSQ19MRU4pIHsKKwkJVFJBQ0UoZGV2
LCBERVRBSUxTLCAiY3JjIGJ5dGVzIHRvIHJlYWQgPSAldVxuIiwKKwkJICAgICAgTU1DU1BJX0RB
VEFfQ1JDX0xFTiAtIGNyY19jYXB0dXJlZCk7CisKKwkJZXJyID0gbW1jc3BpX2RvX3NwaV9yZWFk
KGRldiwgJmNyY2J1ZltjcmNfY2FwdHVyZWRdLAorCQkJCQkgTU1DU1BJX0RBVEFfQ1JDX0xFTiAt
IGNyY19jYXB0dXJlZCk7CisJCWlmIChNTUNfRVJSX05PTkUgIT0gZXJyKSB7CisJCQlUUkFDRShk
ZXYsIEVSUk9SLCAic3BpIHJlYWQgb2YgY3JjIGZhaWxlZFxuIik7CisJCQlUUkFDRV9FWElUKGRl
dik7CisJCQlyZXR1cm4gKGVycik7CisJCX0KKwl9CisKKworCS8qIAorCSAqIFRoZSBmb2xsb3dp
bmcgY3JjIGNoZWNraW5nIGNvZGUgaXMgZGVsaWJlcmF0ZWx5IHN0cnVjdHVyZWQgdG8KKwkgKiBi
b3RoIHJlcXVpcmUgYSBwYXNzaW5nIGNyYy03IGNoZWNrIGFuZCBhbGxvdyBhIHBhc3NpbmcgY3Jj
LTcKKwkgKiBjaGVjayB0byBvdmVycmlkZSBhIGZhaWxpbmcgY3JjLTE2IGNoZWNrIHdoZW4gY3Jj
LTcgY2hlY2tpbmcgaXMKKwkgKiBlbmFibGVkLgorCSAqLworCWlmIChjaGVja19jcmMxNikgewor
CQljcmMxNiA9ICgodWludDE2X3QpY3JjYnVmWzBdIDw8IDgpIHwgY3JjYnVmWzFdOworCQljb21w
dXRlZF9jcmMxNiA9IHVwZGF0ZV9jcmMxNihDUkMxNl9JTklUSUFMLCBkYXRhLCBsZW4pOworCQlU
UkFDRShkZXYsIFJFU1VMVCwgInNlbnRfY3JjMTY9MHglMDR4IGNvbXB1dGVkX2NyYzE2PTB4JTA0
eFxuIiwKKwkJICAgICAgY3JjMTYsIGNvbXB1dGVkX2NyYzE2KTsKKworCQlpZiAoY29tcHV0ZWRf
Y3JjMTYgIT0gY3JjMTYpIHsKKwkJCWNyYzE2X21pc21hdGNoID0gMTsKKworCQkJVFJBQ0UoZGV2
LCBFUlJPUiwKKwkJCSAgICAgICJjcmMxNiBtaXNtYXRjaCwgc2hvdWxkIGJlIDB4JTA0eCwgaXMg
MHglMDR4XG4iLAorCQkJICAgICAgY3JjMTYsIGNvbXB1dGVkX2NyYzE2KTsKKwkJCQorCQkJaWYg
KCFjaGVja19jcmM3KSB7CisJCQkJVFJBQ0VfRVhJVChkZXYpOworCQkJCXJldHVybiAoTU1DX0VS
Ul9CQURDUkMpOworCQkJfQorCQl9CisJfQorCisJaWYgKGNoZWNrX2NyYzcpIHsKKwkJaWYgKGNy
YzE2X21pc21hdGNoKSB7CisJCQkvKgorCQkJICogTGV0IHRoZSB1c2VyIGtub3cgc29tZXRoaW5n
IGVsc2UgaXMgYmVpbmcgY2hlY2tlZAorCQkJICogYWZ0ZXIgYW5ub3VuY2luZyBhbiBlcnJvciBh
Ym92ZS4KKwkJCSAqLworCQkJVFJBQ0UoZGV2LCBFUlJPUiwgImNoZWNraW5nIGNyYzdcbiIpOwor
CQl9CisKKwkJY3JjNyA9IGRhdGFbbGVuIC0gMV0gPj4gMTsKKwkJY29tcHV0ZWRfY3JjNyA9IHVw
ZGF0ZV9jcmM3KENSQzdfSU5JVElBTCwgZGF0YSwgbGVuIC0gMSk7CisJCVRSQUNFKGRldiwgUkVT
VUxULCAic2VudF9jcmM3PTB4JTAyeCBjb21wdXRlZF9jcmM3PTB4JTAyeFxuIiwKKwkJICAgICAg
Y3JjNywgY29tcHV0ZWRfY3JjNyk7CisKKwkJaWYgKGNvbXB1dGVkX2NyYzcgIT0gY3JjNykgewor
CQkJVFJBQ0UoZGV2LCBFUlJPUiwKKwkJCSAgICAgICJjcmM3IG1pc21hdGNoLCBzaG91bGQgYmUg
MHglMDJ4LCBpcyAweCUwMnhcbiIsCisJCQkgICAgICBjcmM3LCBjb21wdXRlZF9jcmM3KTsKKwkJ
CQorCQkJVFJBQ0VfRVhJVChkZXYpOworCQkJcmV0dXJuIChNTUNfRVJSX0JBRENSQyk7CisJCX0K
Kwl9CisJCisJVFJBQ0VfRVhJVChkZXYpOworCisJcmV0dXJuIChNTUNfRVJSX05PTkUpOworfQor
CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK21tY3NwaV9zZW5kX3N0b3AoZGV2aWNlX3QgZGV2LCB1
bnNpZ25lZCBpbnQgcmV0cmllcykKK3sKKwlUUkFDRV9FTlRFUihkZXYpOworCWludCBpOworCXVu
c2lnbmVkIGludCBlcnI7CisJc3RydWN0IG1tY3NwaV9jb21tYW5kIHN0b3A7CisJc3RydWN0IG1t
Y19jb21tYW5kIG1tY19zdG9wOworCXVpbnQ4X3Qgc3RvcF9yZXNwb25zZTsKKworCW1lbXNldCgm
bW1jX3N0b3AsIDAsIHNpemVvZihtbWNfc3RvcCkpOworCW1tY19zdG9wLm9wY29kZSA9IE1NQ19T
VE9QX1RSQU5TTUlTU0lPTjsKKwltbWNfc3RvcC5mbGFncyA9IE1NQ19SU1BfUjFCIHwgTU1DX0NN
RF9BQzsKKworCWVyciA9IG1tY3NwaV9zZXRfdXBfY29tbWFuZChkZXYsICZzdG9wLCAmbW1jX3N0
b3ApOworCWlmIChNTUNfRVJSX05PTkUgIT0gZXJyKSB7CisJCVRSQUNFX0VYSVQoZGV2KTsKKwkJ
cmV0dXJuIChlcnIpOworCX0KKworCS8qIAorCSAqIFJldHJ5IHN0b3AgY29tbWFuZHMgdGhhdCBm
YWlsIGR1ZSB0byBiYWQgY3JjIGhlcmUgYmVjYXVzZSBoYXZpbmcKKwkgKiB0aGUgY2FsbGVyIHJl
dHJ5IHRoZSBlbnRpcmUgcmVhZC93cml0ZSBjb21tYW5kIGR1ZSB0byBzdWNoIGEKKwkgKiBmYWls
dXJlIGlzIHBvaW50bGVzc2x5IGV4cGVuc2l2ZS4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDw9IHJl
dHJpZXM7IGkrKykgeworCQlUUkFDRShkZXYsIEFDVElPTiwgInNlbmRpbmcgc3RvcCBtZXNzYWdl
XG4iKTsKKworCQllcnIgPSBtbWNzcGlfc2VuZF9jbWQoZGV2LCAmc3RvcCwgJnN0b3BfcmVzcG9u
c2UpOworCQlpZiAoTU1DX0VSUl9OT05FICE9IGVycikgeworCQkJVFJBQ0VfRVhJVChkZXYpOwor
CQkJcmV0dXJuIChlcnIpOworCQl9CisKKwkJVFJBQ0UoZGV2LCBSRVNVTFQsICJzdG9wIHJlc3Bv
bnNlPTB4JTAyeFxuIiwgc3RvcF9yZXNwb25zZSk7CisKKwkJLyogcmV0cnkgb24gY3JjIGVycm9y
ICovCisJCWlmIChzdG9wX3Jlc3BvbnNlICYgc3RvcC5lcnJvcl9tYXNrICYgTU1DU1BJX1IxX0NS
Q19FUlIpIHsKKwkJCWNvbnRpbnVlOworCQl9CisJfQorCisJaWYgKHN0b3BfcmVzcG9uc2UgJiBz
dG9wLmVycm9yX21hc2spIHsKKwkJVFJBQ0VfRVhJVChkZXYpOworCisJCS8qIAorCQkgKiBEb24n
dCByZXR1cm4gTU1DX0VSUl9CQURDUkMgaGVyZSwgZXZlbiBpZgorCQkgKiBNTUNTUElfUjFfQ1JD
X0VSUiBpcyBzZXQsIGJlY2F1c2UgdGhhdCB3b3VsZCB0cmlnZ2VyIHRoZQorCQkgKiBjYWxsZXIn
cyByZXRyeS1vbi1jcmMtZXJyb3IgbWVjaGFuaXNtLCBlZmZlY3RpdmVseQorCQkgKiBzcXVhcmlu
ZyB0aGUgbWF4aW11bSBudW1iZXIgb2YgcmV0cmllcyBvZiB0aGUgc3RvcAorCQkgKiBjb21tYW5k
LgorCQkgKi8KKwkJcmV0dXJuIChNTUNfRVJSX0ZBSUxFRCk7CisJfQorCVRSQUNFX0VYSVQoZGV2
KTsKKworCXJldHVybiAoTU1DX0VSUl9OT05FKTsKK30KKworCitzdGF0aWMgdW5zaWduZWQgaW50
CittbWNzcGlfcmVhZF9waGFzZShkZXZpY2VfdCBkZXYsIHN0cnVjdCBtbWNzcGlfY29tbWFuZCAq
Y21kKQoreworCVRSQUNFX0VOVEVSKGRldik7CisKKwlzdHJ1Y3QgbW1jX2RhdGEgKmRhdGEgPSBj
bWQtPmRhdGE7CisJdWludDhfdCAqZGF0YTg7CisJdW5zaWduZWQgaW50IGRhdGFfb2Zmc2V0Owor
CXVuc2lnbmVkIGludCBudW1fYmxvY2tzOworCXVuc2lnbmVkIGludCBsZW47CisJdW5zaWduZWQg
aW50IGVycjsKKwlpbnQgaTsKKworCWRhdGE4ID0gKHVpbnQ4X3QgKilkYXRhLT5kYXRhOworCWRh
dGFfb2Zmc2V0ID0gMDsKKworCWlmIChkYXRhLT5sZW4gPCBNTUNTUElfREFUQV9CTE9DS19MRU4p
IHsKKwkJbnVtX2Jsb2NrcyA9IDE7CisJCWxlbiA9IGRhdGEtPmxlbjsKKwl9IGVsc2UgeworCQlu
dW1fYmxvY2tzID0gZGF0YS0+bGVuIC8gTU1DU1BJX0RBVEFfQkxPQ0tfTEVOOworCQlsZW4gPSBN
TUNTUElfREFUQV9CTE9DS19MRU47CisJfQorCisJZm9yIChpID0gMDsgaSA8IG51bV9ibG9ja3M7
IGkrKykgeworCQkKKwkJLyoKKwkJICogVGhlIENJRCBhbmQgQ1NEIGRhdGEgYmxvY2tzIGNvbnRh
aW4gYm90aCBhIHRyYWlsaW5nIGNyYy03CisJCSAqIGluc2lkZSB0aGUgZGF0YSBibG9jayBhbmQg
dGhlIHN0YW5kYXJkIGNyYy0xNiBmb2xsb3dpbmcKKwkJICogdGhlIGRhdGEgYmxvY2ssIHNvIGJv
dGggYXJlIGNoZWNrZWQgd2hlbiB1c2VfY3JjIGlzIHRydWUuCisJCSAqCisJCSAqIFdoZW4gY3Jj
IGNoZWNraW5nIGhhcyBiZWVuIGVuYWJsZWQgdmlhIENNRDU5LCBzb21lIGNhcmRzCisJCSAqIHNl
bmQgQ0lEIGFuZCBDU0QgZGF0YSBibG9ja3Mgd2l0aCBjb3JyZWN0IGNyYy03IHZhbHVlcworCQkg
KiBidXQgaW5jb3JyZWN0IGNyYy0xNiB2YWx1ZXMuICByZWFkX2Jsb2NrIHdpbGwgYWNjZXB0CisJ
CSAqIHRob3NlIHJlc3BvbnNlcyBhcyB2YWxpZCBhcyBsb25nIGFzIHRoZSBjcmMtNyBpcyBjb3Jy
ZWN0LgorCQkgKgorCQkgKiBFeGFtcGxlczoKKwkJICoKKwkJICogU3VwZXIgVGFsZW50IDFHQiBT
RFNDIGNhcmQsIGNpZDoKKwkJICogbWlkPTB4MWIgb2lkPTB4NTM0ZCBwbm09IjAwMDAwIiBwcnY9
MS4wIG1kdD0wMi4yMDEwCisJCSAqLworCQllcnIgPSBtbWNzcGlfcmVhZF9ibG9jayhkZXYsICZk
YXRhOFtkYXRhX29mZnNldF0sIGxlbiwKKwkJCQkJY21kLT51c2VfY3JjLAorCQkJCQljbWQtPnVz
ZV9jcmMgJiYKKwkJCQkJKChNTUNfU0VORF9DSUQgPT0gY21kLT5vcGNvZGUpIHx8CisJCQkJCSAo
TU1DX1NFTkRfQ1NEID09IGNtZC0+b3Bjb2RlKSkpOworCisJCWlmIChNTUNfRVJSX05PTkUgIT0g
ZXJyKSB7CisJCQlUUkFDRV9FWElUKGRldik7CisJCQlyZXR1cm4gKGVycik7CisJCX0KKwkJCQkJ
CisJCWRhdGFfb2Zmc2V0ICs9IE1NQ1NQSV9EQVRBX0JMT0NLX0xFTjsKKwl9CisKKwkvKiBtdWx0
aS1ibG9jayByZWFkIGNvbW1hbmRzIHJlcXVpcmUgYSBzdG9wICovCisJaWYgKG51bV9ibG9ja3Mg
PiAxKSB7CisJCWVyciA9IG1tY3NwaV9zZW5kX3N0b3AoZGV2LCBjbWQtPnJldHJpZXMpOworCQlp
ZiAoTU1DX0VSUl9OT05FICE9IGVycikgeworCQkJVFJBQ0VfRVhJVChkZXYpOworCQkJcmV0dXJu
IChlcnIpOworCQl9CisJfQorCisJVFJBQ0VfRVhJVChkZXYpOworCisJcmV0dXJuIChNTUNfRVJS
X05PTkUpOworfQorCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK21tY3NwaV93cml0ZV9ibG9jayhk
ZXZpY2VfdCBkZXYsIHVpbnQ4X3QgKmRhdGEsIHVuc2lnbmVkIGludCBpc19tdWx0aSwKKwkJICAg
dW5zaWduZWQgY2hhciB1c2VfY3JjLCB1aW50OF90ICpzdGF0dXMpCit7CisJVFJBQ0VfRU5URVIo
ZGV2KTsKKwkKKwl1bnNpZ25lZCBpbnQgZXJyOworCXVpbnQxNl90IGNyYzsKKwl1aW50OF90IHJl
c3BvbnNlX3Rva2VuOworCXVpbnQ4X3QgdHhidWZbbWF4KE1NQ1NQSV9QT0xMX0xFTiwgMildOwor
CisJaWYgKHVzZV9jcmMpIHsKKwkJY3JjID0gdXBkYXRlX2NyYzE2KENSQzE2X0lOSVRJQUwsIGRh
dGEsIE1NQ1NQSV9EQVRBX0JMT0NLX0xFTik7CisJfSBlbHNlIHsKKwkJY3JjID0gMDsKKwl9CisK
KwlUUkFDRShkZXYsIEFDVElPTiwgIndyaXRlIGJsb2NrKDUxMikgY3JjPTB4JTA0eFxuIiwgY3Jj
KTsKKworCXR4YnVmWzBdID0gaXNfbXVsdGkgPyBNTUNTUElfVE9LRU5fU0JfV00gOiBNTUNTUElf
VE9LRU5fU0I7CisJZXJyID0gbW1jc3BpX2RvX3NwaV93cml0ZShkZXYsIHR4YnVmLCAxLCBkYXRh
LCBNTUNTUElfREFUQV9CTE9DS19MRU4pOworCWlmIChNTUNfRVJSX05PTkUgIT0gZXJyKSB7CisJ
CVRSQUNFX0VYSVQoZGV2KTsKKwkJcmV0dXJuIChlcnIpOworCX0KKworCXR4YnVmWzBdID0gY3Jj
ID4+IDg7CisJdHhidWZbMV0gPSBjcmMgJiAweGZmOworCWVyciA9IG1tY3NwaV9kb19zcGlfd3Jp
dGUoZGV2LCB0eGJ1ZiwgMiwgTlVMTCwgMCk7CisJaWYgKE1NQ19FUlJfTk9ORSAhPSBlcnIpIHsK
KwkJVFJBQ0VfRVhJVChkZXYpOworCQlyZXR1cm4gKGVycik7CisJfQorCisJZXJyID0gbW1jc3Bp
X2dldF9yZXNwb25zZV90b2tlbihkZXYsIE1NQ1NQSV9EUl9NQVNLLCBNTUNTUElfRFJfVkFMVUUs
IAorCQkJCQkxLCAxLCAmcmVzcG9uc2VfdG9rZW4pOworCWlmIChNTUNfRVJSX05PTkUgIT0gZXJy
KSB7CisJCVRSQUNFX0VYSVQoZGV2KTsKKwkJcmV0dXJuIChlcnIpOworCX0KKworCSpzdGF0dXMg
PSByZXNwb25zZV90b2tlbiAmIE1NQ1NQSV9EUl9FUlJfTUFTSzsKKworCVRSQUNFX0VYSVQoZGV2
KTsKKworCXJldHVybiAoTU1DX0VSUl9OT05FKTsKK30KKworCitzdGF0aWMgdW5zaWduZWQgaW50
CittbWNzcGlfd3JpdGVfcGhhc2UoZGV2aWNlX3QgZGV2LCBzdHJ1Y3QgbW1jc3BpX2NvbW1hbmQg
KmNtZCkKK3sKKwlUUkFDRV9FTlRFUihkZXYpOworCisJc3RydWN0IG1tY19kYXRhICpkYXRhID0g
Y21kLT5kYXRhOworCXVpbnQ4X3QgKmRhdGE4OworCXVuc2lnbmVkIGludCBkYXRhX29mZnNldDsK
Kwl1bnNpZ25lZCBpbnQgbnVtX2Jsb2NrczsKKwl1bnNpZ25lZCBpbnQgZXJyOworCWludCBpOwor
CXVpbnQ4X3QgdG9rZW5bMl07CisJdWludDhfdCBzdGF0dXM7CisKKwlkYXRhOCA9ICh1aW50OF90
ICopZGF0YS0+ZGF0YTsKKwlkYXRhX29mZnNldCA9IDA7CisJbnVtX2Jsb2NrcyA9IGRhdGEtPmxl
biAvIE1NQ1NQSV9EQVRBX0JMT0NLX0xFTjsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2Jsb2Nrczsg
aSsrKSB7CisJCWVyciA9IG1tY3NwaV93cml0ZV9ibG9jayhkZXYsICZkYXRhOFtkYXRhX29mZnNl
dF0sCisJCQkJCSBudW1fYmxvY2tzID4gMSwgY21kLT51c2VfY3JjLCAmc3RhdHVzKTsKKworCQlp
ZiAoTU1DX0VSUl9OT05FICE9IGVycikgeworCQkJVFJBQ0VfRVhJVChkZXYpOworCQkJcmV0dXJu
IChlcnIpOworCQl9CisKKwkJaWYgKE1NQ1NQSV9EUl9FUlJfTk9ORSAhPSBzdGF0dXMpIHsKKwkJ
CWlmIChudW1fYmxvY2tzID4gMSkgeworCQkJCS8qCisJCQkJICogSWdub3JlIGFueSBmYWlsdXJl
IHJlcG9ydGVkIGZvciB0aGUgc3RvcAorCQkJCSAqIGNvbW1hbmQsIGFzIHRoZSByZXR1cm4gc3Rh
dHVzIGZvciB0aGUKKwkJCQkgKiB3cml0ZSBwaGFzZSB3aWxsIGJlIHdoYXRldmVyIGVycm9yIHdh
cworCQkJCSAqIGluZGljYXRlZCBpbiB0aGUgZGF0YSByZXNwb25lIHRva2VuLgorCQkJCSAqLwor
CQkJCW1tY3NwaV9zZW5kX3N0b3AoZGV2LCBjbWQtPnJldHJpZXMpOworCQkJfQorCisJCQkvKiAK
KwkJCSAqIEEgQ1JDIGVycm9yIGNhbid0IGJlIGlnbm9yZWQgaGVyZSwgZXZlbiBpZiBjcmMKKwkJ
CSAqIHVzZSBpcyBkaXNhYmxlZCwgYXMgdGhlcmUgaXMgbm8gd2F5IHRvIHNpbXBseQorCQkJICog
Y2Fycnkgb24gd2hlbiBhIGRhdGEgZXJyb3IgdG9rZW4gaGFzIGJlZW4gc2VudC4KKwkJCSAqLwor
CQkJaWYgKE1NQ1NQSV9EUl9FUlJfQ1JDID09IHN0YXR1cykgeworCQkJCVRSQUNFX0VYSVQoZGV2
KTsKKwkJCQlyZXR1cm4gKE1NQ19FUlJfQkFEQ1JDKTsKKwkJCX0gZWxzZSB7CisJCQkJVFJBQ0Vf
RVhJVChkZXYpOworCQkJCXJldHVybiAoTU1DX0VSUl9GQUlMRUQpOworCQkJfQorCQl9CisJCQkJ
CQorCQlkYXRhX29mZnNldCArPSBNTUNTUElfREFUQV9CTE9DS19MRU47CisJfQorCisJLyogc3Vj
Y2Vzc2Z1bCBtdWx0aS1ibG9jayB3cml0ZSBjb21tYW5kcyByZXF1aXJlIGEgc3RvcCB0b2tlbiAq
LworCWlmIChudW1fYmxvY2tzID4gMSkgeworCQlUUkFDRShkZXYsIEFDVElPTiwgIlNlbmRpbmcg
c3RvcCB0b2tlblxuIik7CisKKwkJLyogCisJCSAqIE1vc3QvYWxsIGNhcmRzIGFyZSBhIGJpdCBz
bHVnZ2lzaCBpbiBhc3NzZXJ0aW5nIGJ1c3kKKwkJICogYWZ0ZXIgcmVjZWlwdCBvZiB0aGUgU1RP
UF9UUkFOIHRva2VuLiBDbG9ja2luZyBvdXQgYW4KKwkJICogZXh0cmEgYnl0ZSBoZXJlIHByb3Zp
ZGVzIGEgYnl0ZSBvZiBkZWFkIHRpbWUgYmVmb3JlCisJCSAqIGxvb2tpbmcgZm9yIG5vdCBidXN5
LCBhdm9pZGluZyBhIHByZW1hdHVyZSBub3QtYnVzeQorCQkgKiBkZXRlcm1pbmF0aW9uIHdpdGgg
c3VjaCBjYXJkcy4KKwkJICovCisJCXRva2VuWzBdID0gTU1DU1BJX1RPS0VOX1NUOworCQl0b2tl
blsxXSA9IDB4ZmY7CisKKwkJZXJyID0gbW1jc3BpX2RvX3NwaV93cml0ZShkZXYsIHRva2VuLCBz
aXplb2YodG9rZW4pLCBOVUxMLCAwKTsKKwkJaWYgKE1NQ19FUlJfTk9ORSAhPSBlcnIpIHsKKwkJ
CVRSQUNFX0VYSVQoZGV2KTsKKwkJCXJldHVybiAoZXJyKTsKKwkJfQorCisJCWVyciA9IG1tY3Nw
aV93YWl0X2Zvcl9ub3RfYnVzeShkZXYpOworCQlpZiAoTU1DX0VSUl9OT05FICE9IGVycikgewor
CQkJVFJBQ0VfRVhJVChkZXYpOworCQkJcmV0dXJuIChlcnIpOworCQl9CisJfQorCisJVFJBQ0Vf
RVhJVChkZXYpOworCisJcmV0dXJuIChNTUNfRVJSX05PTkUpOworfQorCisKK3N0YXRpYyB1bnNp
Z25lZCBpbnQKK21tY3NwaV90cmFuc2xhdGVfcmVzcG9uc2UoZGV2aWNlX3QgZGV2LCBzdHJ1Y3Qg
bW1jc3BpX2NvbW1hbmQgKmNtZCwgCisJCQkgIHVpbnQ4X3QgKnJzcGJ1ZikKK3sKKwlUUkFDRV9F
TlRFUihkZXYpOworCisJc3RydWN0IG1tY19jb21tYW5kICptbWNfY21kID0gY21kLT5tbWNfY21k
OworCXVpbnQzMl90IG1tY19yc3BfdHlwZSA9IE1NQ19SU1AoY21kLT5mbGFncyk7CisJdWludDhf
dCAqbGRhdGEgPSBjbWQtPmxkYXRhLmRhdGE7CisKKwlUUkFDRShkZXYsIEFDVElPTiwgInRyYW5z
bGF0aW5nIFNQSSByc3AgJXUgdG8gU0QgcnNwICV1XG4iLAorCSAgICAgIGNtZC0+cnNwX3R5cGUs
IG1tY19yc3BfdHlwZSk7CisKKwlpZiAoKE1NQ19SU1BfUjEgPT0gbW1jX3JzcF90eXBlKSB8fAor
CSAgICAoTU1DX1JTUF9SMUIgPT0gbW1jX3JzcF90eXBlKSkgeworCisJCVRSQUNFKGRldiwgQUNU
SU9OLCAidHJhbnNsYXRpbmcgU1BJLVIxLzIgdG8gU0QtUjFcbiIpOworCisJCWlmICgoTU1DU1BJ
X1JTUF9SMSA9PSBjbWQtPnJzcF90eXBlKSB8fAorCQkgICAgKE1NQ1NQSV9SU1BfUjFCID09IGNt
ZC0+cnNwX3R5cGUpIHx8CisJCSAgICAoTU1DU1BJX1JTUF9SMiA9PSBjbWQtPnJzcF90eXBlKSkg
eworCQkJbW1jX2NtZC0+cmVzcFswXSA9IDA7CisKKwkJCWlmIChyc3BidWZbMF0gJiBNTUNTUElf
UjFfUEFSQU1fRVJSKQorCQkJCW1tY19jbWQtPnJlc3BbMF0gfD0gUjFfT1VUX09GX1JBTkdFOwor
CisJCQlpZiAocnNwYnVmWzBdICYgTU1DU1BJX1IxX0FERFJfRVJSKQorCQkJCW1tY19jbWQtPnJl
c3BbMF0gfD0gUjFfQUREUkVTU19FUlJPUjsKKworCQkJaWYgKHJzcGJ1ZlswXSAmIE1NQ1NQSV9S
MV9FUkFTRV9FUlIpCisJCQkJbW1jX2NtZC0+cmVzcFswXSB8PSBSMV9FUkFTRV9TRVFfRVJST1I7
CisKKwkJCWlmIChyc3BidWZbMF0gJiBNTUNTUElfUjFfQ1JDX0VSUikKKwkJCQltbWNfY21kLT5y
ZXNwWzBdIHw9IFIxX0NPTV9DUkNfRVJST1I7CisKKwkJCWlmIChyc3BidWZbMF0gJiBNTUNTUElf
UjFfSUxMX0NNRCkKKwkJCQltbWNfY21kLT5yZXNwWzBdIHw9IFIxX0lMTEVHQUxfQ09NTUFORDsK
KworCQkJaWYgKHJzcGJ1ZlswXSAmIE1NQ1NQSV9SMV9FUkFTRV9SU1QpCisJCQkJbW1jX2NtZC0+
cmVzcFswXSB8PSBSMV9FUkFTRV9SRVNFVDsKKworCQkJaWYgKHJzcGJ1ZlswXSAmIE1NQ1NQSV9S
MV9JRExFKSB7CisJCQkJbW1jX2NtZC0+cmVzcFswXSB8PSAodWludDMyX3QpUjFfU1RBVEVfSURM
RSA8PCA5OworCQkJfSBlbHNlIHsKKwkJCQltbWNfY21kLT5yZXNwWzBdIHw9ICh1aW50MzJfdClS
MV9TVEFURV9SRUFEWSA8PCA5OworCQkJfQorCisJCQkvKiBXaGVuIE1NQ19DTURfSVNfQVBQIGlz
IHNlbnQsIGVtdWxhdGUgUjFfQVBQX0NNRAorCQkJICAgU0QtYnVzIHN0YXR1cyBiaXQuICovCisJ
CQlpZiAoIShjbWQtPmZsYWdzICYgTU1DX0NNRF9JU19BUFApICYmCisJCQkgICAgKE1NQ19BUFBf
Q01EID09IGNtZC0+b3Bjb2RlKSkgeworCQkJCW1tY19jbWQtPnJlc3BbMF0gfD0gUjFfQVBQX0NN
RDsKKwkJCX0KKworCQkJaWYgKE1NQ1NQSV9SU1BfUjIgPT0gY21kLT5yc3BfdHlwZSkgeworCQkJ
CWlmIChyc3BidWZbMV0gJiBNTUNTUElfUjJfT09SX0NTRF9PVykKKwkJCQkJbW1jX2NtZC0+cmVz
cFswXSB8PQorCQkJCQkgICAgUjFfT1VUX09GX1JBTkdFIHwKKwkJCQkJICAgIFIxX0NTRF9PVkVS
V1JJVEU7CisKKwkJCQlpZiAocnNwYnVmWzFdICYgTU1DU1BJX1IyX0VSQVNFX1BBUkFNKQorCQkJ
CQltbWNfY21kLT5yZXNwWzBdIHw9IFIxX0VSQVNFX1BBUkFNOworCisJCQkJaWYgKHJzcGJ1Zlsx
XSAmIE1NQ1NQSV9SMl9XUF9WSU9MQVRFKQorCQkJCQltbWNfY21kLT5yZXNwWzBdIHw9IFIxX1dQ
X1ZJT0xBVElPTjsKKworCQkJCWlmIChyc3BidWZbMV0gJiBNTUNTUElfUjJfRUNDX0ZBSUwpCisJ
CQkJCW1tY19jbWQtPnJlc3BbMF0gfD0gUjFfQ0FSRF9FQ0NfRkFJTEVEOworCisJCQkJaWYgKHJz
cGJ1ZlsxXSAmIE1NQ1NQSV9SMl9DQ19FUlIpCisJCQkJCW1tY19jbWQtPnJlc3BbMF0gfD0gUjFf
Q0NfRVJST1I7CisKKwkJCQlpZiAocnNwYnVmWzFdICYgTU1DU1BJX1IyX0VSUikKKwkJCQkJbW1j
X2NtZC0+cmVzcFswXSB8PSBSMV9FUlJPUjsKKworCQkJCWlmIChyc3BidWZbMV0gJiBNTUNTUElf
UjJfV1BfRVJfTENLKQorCQkJCQltbWNfY21kLT5yZXNwWzBdIHw9CisJCQkJCSAgICBSMV9MT0NL
X1VOTE9DS19GQUlMRUQgfAorCQkJCQkgICAgUjFfV1BfRVJBU0VfU0tJUDsKKworCQkJCWlmIChy
c3BidWZbMV0gJiBNTUNTUElfUjJfTE9DS0VEKQorCQkJCQltbWNfY21kLT5yZXNwWzBdIHw9IFIx
X0NBUkRfSVNfTE9DS0VEOworCisJCQl9CisJCisJCX0gZWxzZSB7CisJCQlyZXR1cm4gKE1NQ19F
UlJfSU5WQUxJRCk7CisJCX0KKworCX0gZWxzZSBpZiAoTU1DX1JTUF9SMiA9PSBtbWNfcnNwX3R5
cGUpIHsKKworCQlpZiAoMTYgPT0gY21kLT5sZGF0YS5sZW4pIHsKKworCQkJVFJBQ0UoZGV2LCBB
Q1RJT04sICJ0cmFuc2xhdGluZyBTUEktUjEvbGRhdGEoMTYpIHRvIFNELVIyXG4iKTsKKworCQkJ
LyogbGRhdGEgY29udGFpbnMgYml0cyAxMjc6MCBvZiB0aGUgc3BpIHJlc3BvbnNlICovCisKKwkJ
CW1tY19jbWQtPnJlc3BbMF0gPQorCQkJICAgICh1aW50MzJfdClsZGF0YVswXSA8PCAyNCB8CisJ
CQkgICAgKHVpbnQzMl90KWxkYXRhWzFdIDw8IDE2IHwKKwkJCSAgICAodWludDMyX3QpbGRhdGFb
Ml0gPDwgOCAgfAorCQkJICAgICh1aW50MzJfdClsZGF0YVszXTsKKworCQkJbW1jX2NtZC0+cmVz
cFsxXSA9CisJCQkgICAgKHVpbnQzMl90KWxkYXRhWzRdIDw8IDI0IHwKKwkJCSAgICAodWludDMy
X3QpbGRhdGFbNV0gPDwgMTYgfAorCQkJICAgICh1aW50MzJfdClsZGF0YVs2XSA8PCA4ICB8CisJ
CQkgICAgKHVpbnQzMl90KWxkYXRhWzddOworCisJCQltbWNfY21kLT5yZXNwWzJdID0KKwkJCSAg
ICAodWludDMyX3QpbGRhdGFbOF0gPDwgMjQgfAorCQkJICAgICh1aW50MzJfdClsZGF0YVs5XSA8
PCAxNiB8CisJCQkgICAgKHVpbnQzMl90KWxkYXRhWzEwXSA8PCA4ICB8CisJCQkgICAgKHVpbnQz
Ml90KWxkYXRhWzExXTsKKworCQkJbW1jX2NtZC0+cmVzcFszXSA9CisJCQkgICAgKHVpbnQzMl90
KWxkYXRhWzEyXSA8PCAyNCB8CisJCQkgICAgKHVpbnQzMl90KWxkYXRhWzEzXSA8PCAxNiB8CisJ
CQkgICAgKHVpbnQzMl90KWxkYXRhWzE0XSA8PCAgODsKKworCQl9IGVsc2UgeworCQkJcmV0dXJu
IChNTUNfRVJSX0lOVkFMSUQpOworCQl9CisKKwl9IGVsc2UgaWYgKE1NQ19SU1BfUjMgPT0gbW1j
X3JzcF90eXBlKSB7CisKKwkJaWYgKE1NQ1NQSV9SU1BfUjMgPT0gY21kLT5yc3BfdHlwZSkgewor
CisJCQlUUkFDRShkZXYsIEFDVElPTiwgInRyYW5zbGF0aW5nIFNQSS1SMyB0byBTRC1SM1xuIik7
CisJCQkKKwkJCS8qIHJzcGJ1ZiBjb250YWlucyBhIDQwLWJpdCBzcGktUjMgZnJvbSB0aGUKKwkJ
CSAgIE1NQ1NQSV9SRUFEX09DUiByZXNwb25zZSwgb2Ygd2hpY2ggYml0cyAzMTowIGFyZQorCQkJ
ICAgdGhlIE9DUiB2YWx1ZSAqLworCisJCQkvKiBzcGkgIHJlc3BvbnNlIGJpdHMgMzE6MCBtYXBw
ZWQgdG8KKwkJCSAgIHNkaGMgcmVnaXN0ZXIgYml0cyAzMTowICovCisJCQltbWNfY21kLT5yZXNw
WzBdID0KKwkJCSAgICAodWludDMyX3QpcnNwYnVmWzFdIDw8IDI0IHwKKwkJCSAgICAodWludDMy
X3QpcnNwYnVmWzJdIDw8IDE2IHwKKwkJCSAgICAodWludDMyX3QpcnNwYnVmWzNdIDw8IDggIHwK
KwkJCSAgICAodWludDMyX3QpcnNwYnVmWzRdOworCisJCQkvKiBDbGVhciBjYXJkIGJ1c3kgYml0
IChpbmRpY2F0aW5nIGJ1c3kpIGlmIHRoZQorCQkJICAgU1BJLVIxIGlkbGUgYml0IGlzIHNldC4g
Ki8KKwkJCWlmIChyc3BidWZbMF0gJiBNTUNTUElfUjFfSURMRSkgeworCQkJCW1tY19jbWQtPnJl
c3BbMF0gJj0gfk1NQ19PQ1JfQ0FSRF9CVVNZOworCQkJfSBlbHNlIHsKKwkJCQltbWNfY21kLT5y
ZXNwWzBdIHw9IE1NQ19PQ1JfQ0FSRF9CVVNZOworCQkJfQorCisJCQlUUkFDRShkZXYsIERFVEFJ
TFMsICJvY3I9MHglMDh4XG4iLCBtbWNfY21kLT5yZXNwWzBdKTsKKwkJfSBlbHNlIHsKKwkJCXJl
dHVybiAoTU1DX0VSUl9JTlZBTElEKTsKKwkJfQorCisJfSBlbHNlIGlmIChNTUNfUlNQX1I3ID09
IG1tY19yc3BfdHlwZSkgeworCQkvKiBOb3RlIE1NQ19SU1BfUjYgYW5kIE1NQ19SU1BfUjcgYXJl
IG51bWVyaWNhbGx5IGVxdWFsLCBzbworCQkgICB0aGlzIGhhbmRsZXMgYm90aCBjYXNlcy4gKi8K
KworCQlpZiAoTU1DU1BJX1JTUF9SMiA9PSBjbWQtPnJzcF90eXBlKSB7CisKKwkJCVRSQUNFKGRl
diwgQUNUSU9OLCAidHJhbnNsYXRpbmcgU1BJLVIyIHRvIFNELVI2XG4iKTsKKworCQkJLyogcmNh
IHJldHVybmVkIHdpbGwgYWx3YXlzIGJlIHplcm8gKi8KKwkJCW1tY19jbWQtPnJlc3BbMF0gPSAw
OworCisJCQlpZiAocnNwYnVmWzBdICYgTU1DU1BJX1IxX0NSQ19FUlIpCisJCQkJbW1jX2NtZC0+
cmVzcFswXSB8PSAweDgwMDA7CisKKwkJCWlmIChyc3BidWZbMF0gJiBNTUNTUElfUjFfSUxMX0NN
RCkKKwkJCQltbWNfY21kLT5yZXNwWzBdIHw9IDB4NDAwMDsKKwkJCQorCQkJaWYgKHJzcGJ1Zlsx
XSAmIE1NQ1NQSV9SMl9FUlIpCisJCQkJbW1jX2NtZC0+cmVzcFswXSB8PSAweDIwMDA7CisKKwkJ
CWlmIChyc3BidWZbMF0gJiBNTUNTUElfUjFfSURMRSkgeworCQkJCW1tY19jbWQtPnJlc3BbMF0g
fD0gKHVpbnQzMl90KVIxX1NUQVRFX0lETEUgPDwgOTsKKwkJCX0gZWxzZSB7CisJCQkJbW1jX2Nt
ZC0+cmVzcFswXSB8PSAodWludDMyX3QpUjFfU1RBVEVfUkVBRFkgPDwgOTsKKwkJCX0KKworCQl9
IGVsc2UgaWYgKE1NQ1NQSV9SU1BfUjcgPT0gY21kLT5yc3BfdHlwZSkgeworCisJCQlUUkFDRShk
ZXYsIEFDVElPTiwgInRyYW5zbGF0aW5nIFNQSS1SNyB0byBTRC1SN1xuIik7CisKKwkJCS8qIHJz
cCBidWYgY29udGFpbnMgYSA0MC1iaXQgc3BpLVI3LCBvZiB3aGljaCBiaXRzCisJCQkgICAxMTow
IG5lZWQgdG8gYmUgdHJhbnNmZXJyZWQgKi8KKwkJCQorCQkJLyogc3BpICByZXNwb25zZSBiaXRz
IDExOjAgbWFwcGVkIHRvCisJCQkgICBzZGhjIHJlZ2lzdGVyIGJpdHMgMTE6MCAqLworCQkJbW1j
X2NtZC0+cmVzcFswXSA9CisJCQkgICAgKHVpbnQzMl90KShyc3BidWZbM10gJiAweGYpIDw8IDgg
fAorCQkJICAgICh1aW50MzJfdClyc3BidWZbNF07CisKKwkJfSBlbHNlIHsKKwkJCXJldHVybiAo
TU1DX0VSUl9JTlZBTElEKTsKKwkJfQorCisJfSBlbHNlIGlmIChNTUNfUlNQX05PTkUgIT0gbW1j
X3JzcF90eXBlKSB7CisJCXJldHVybiAoTU1DX0VSUl9JTlZBTElEKTsKKwl9CisKKwlUUkFDRV9F
WElUKGRldik7CisKKwlyZXR1cm4gKE1NQ19FUlJfTk9ORSk7Cit9CisKKworc3RhdGljIHVuc2ln
bmVkIGludAorbW1jc3BpX2dldF9vY3IoZGV2aWNlX3QgZGV2LCB1aW50OF90ICpvY3JidWYpCit7
CisJVFJBQ0VfRU5URVIoZGV2KTsKKworCXN0cnVjdCBtbWNfY29tbWFuZCBtbWNfY21kOworCXN0
cnVjdCBtbWNzcGlfY29tbWFuZCBjbWQ7CisJdW5zaWduZWQgaW50IGVycjsKKwl1aW50OF90IHIx
X3N0YXR1czsKKwl1aW50OF90IHJzcGJ1ZltNTUNTUElfTUFYX1JTUF9MRU5dOworCisJbWVtc2V0
KCZtbWNfY21kLCAwLCBzaXplb2Yoc3RydWN0IG1tY19jb21tYW5kKSk7CisJbW1jX2NtZC5vcGNv
ZGUgPSBNTUNTUElfUkVBRF9PQ1I7CisJbW1jX2NtZC5mbGFncyA9IE1NQ19SU1BfUjMgfCBNTUNf
Q01EX0FDOworCisJZXJyID0gbW1jc3BpX3NldF91cF9jb21tYW5kKGRldiwgJmNtZCwgJm1tY19j
bWQpOworCWlmIChNTUNfRVJSX05PTkUgIT0gZXJyKSB7CisJCVRSQUNFX0VYSVQoZGV2KTsKKwkJ
cmV0dXJuIChlcnIpOworCX0KKwkJCQorCWVyciA9IG1tY3NwaV9zZW5kX2NtZChkZXYsICZjbWQs
IHJzcGJ1Zik7CisJaWYgKE1NQ19FUlJfTk9ORSAhPSBlcnIpIHsKKwkJVFJBQ0VfRVhJVChkZXYp
OworCQlyZXR1cm4gKGVycik7CisJfQorCQkKKwlyMV9zdGF0dXMgPSByc3BidWZbMF0gJiBjbWQu
ZXJyb3JfbWFzazsKKwlpZiAocjFfc3RhdHVzKSB7CisJCWlmIChyMV9zdGF0dXMgJiBNTUNTUElf
UjFfQ1JDX0VSUikgeworCQkJZXJyID0gTU1DX0VSUl9CQURDUkM7CisJCX0gZWxzZSB7CisJCQll
cnIgPSBNTUNfRVJSX0lOVkFMSUQ7CisJCX0KKwkJCisJCVRSQUNFX0VYSVQoZGV2KTsKKwkJcmV0
dXJuIChlcnIpOworCX0KKworCW1lbWNweShvY3JidWYsICZyc3BidWZbMV0sIE1NQ1NQSV9PQ1Jf
TEVOKTsKKworCVRSQUNFX0VYSVQoZGV2KTsKKworCXJldHVybiAoTU1DX0VSUl9OT05FKTsKK30K
KworCitzdGF0aWMgdW5zaWduZWQgaW50CittbWNzcGlfc2V0X2NyY19vbl9vZmYoZGV2aWNlX3Qg
ZGV2LCB1bnNpZ25lZCBpbnQgY3JjX29uKQoreworCXN0cnVjdCBtbWNfY29tbWFuZCBtbWNfY21k
OworCXN0cnVjdCBtbWNzcGlfY29tbWFuZCBjbWQ7CisJdW5zaWduZWQgaW50IGVycjsKKwl1aW50
OF90IHIxX3N0YXR1czsKKwl1aW50OF90IHJzcGJ1ZltNTUNTUElfTUFYX1JTUF9MRU5dOworCisJ
VFJBQ0VfRU5URVIoZGV2KTsKKworCW1lbXNldCgmbW1jX2NtZCwgMCwgc2l6ZW9mKHN0cnVjdCBt
bWNfY29tbWFuZCkpOworCW1tY19jbWQub3Bjb2RlID0gTU1DU1BJX0NSQ19PTl9PRkY7CisJbW1j
X2NtZC5hcmcgPSBjcmNfb24gPyAxIDogMDsKKwltbWNfY21kLmZsYWdzID0gTU1DX1JTUF9OT05F
IHwgTU1DX0NNRF9BQzsKKworCWVyciA9IG1tY3NwaV9zZXRfdXBfY29tbWFuZChkZXYsICZjbWQs
ICZtbWNfY21kKTsKKwlpZiAoTU1DX0VSUl9OT05FICE9IGVycikgeworCQlUUkFDRV9FWElUKGRl
dik7CisJCXJldHVybiAoZXJyKTsKKwl9CisJCQkKKwllcnIgPSBtbWNzcGlfc2VuZF9jbWQoZGV2
LCAmY21kLCByc3BidWYpOworCWlmIChNTUNfRVJSX05PTkUgIT0gZXJyKSB7CisJCVRSQUNFX0VY
SVQoZGV2KTsKKwkJcmV0dXJuIChlcnIpOworCX0KKwkJCisJcjFfc3RhdHVzID0gcnNwYnVmWzBd
ICYgY21kLmVycm9yX21hc2s7CisJaWYgKHIxX3N0YXR1cykgeworCQlpZiAocjFfc3RhdHVzICYg
TU1DU1BJX1IxX0NSQ19FUlIpIHsKKwkJCWVyciA9IE1NQ19FUlJfQkFEQ1JDOworCQl9IGVsc2Ug
eworCQkJZXJyID0gTU1DX0VSUl9JTlZBTElEOworCQl9CisJCQorCQlUUkFDRV9FWElUKGRldik7
CisJCXJldHVybiAoZXJyKTsKKwl9CisKKwlUUkFDRV9FWElUKGRldik7CisJcmV0dXJuIChNTUNf
RVJSX05PTkUpOworfQorCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK21tY3NwaV91cGRhdGVfY3Jj
X3NldHRpbmcoZGV2aWNlX3QgZGV2LCB1bnNpZ25lZCBpbnQgY3JjX29uKQoreworCVRSQUNFX0VO
VEVSKGRldik7CisJc3RydWN0IG1tY3NwaV9zb2Z0YyAqc2MgPSBkZXZpY2VfZ2V0X3NvZnRjKGRl
dik7CisJc3RydWN0IG1tY3NwaV9zbG90ICpzbG90ID0gJnNjLT5zbG90OworCXVuc2lnbmVkIGlu
dCBlcnI7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDw9IE1NQ1NQSV9SRVRSSUVTOyBpKysp
IHsKKwkJZXJyID0gbW1jc3BpX3NldF9jcmNfb25fb2ZmKGRldiwgY3JjX29uKTsKKwkJaWYgKE1N
Q19FUlJfQkFEQ1JDICE9IGVycikgeworCQkJYnJlYWs7CisJCX0KKwl9CisJCisJaWYgKE1NQ19F
UlJfTk9ORSAhPSBlcnIpIHsKKwkJVFJBQ0VfRVhJVChkZXYpOworCQlyZXR1cm4gKGVycik7CisJ
fQorCQorCWlmIChjcmNfb24pIHsKKwkJc2xvdC0+Y3JjX2VuYWJsZWQgPSAxOworCX0gZWxzZSB7
CisJCXNsb3QtPmNyY19lbmFibGVkID0gMDsKKwl9CisKKwlUUkFDRV9FWElUKGRldik7CisJcmV0
dXJuIChNTUNfRVJSX05PTkUpOworfQorCisKK3N0YXRpYyBpbnQKK21tY3NwaV9yZXF1ZXN0KGRl
dmljZV90IGJyZGV2LCBkZXZpY2VfdCByZXFkZXYsIHN0cnVjdCBtbWNfcmVxdWVzdCAqcmVxKQor
eworCVRSQUNFX0VOVEVSKGJyZGV2KTsKKworCXN0cnVjdCBtbWNzcGlfc29mdGMgKnNjID0gZGV2
aWNlX2dldF9zb2Z0YyhicmRldik7CisJc3RydWN0IG1tY3NwaV9zbG90ICpzbG90ID0gJnNjLT5z
bG90OworCXN0cnVjdCBtbWNzcGlfY29tbWFuZCBjbWQ7CisJc3RydWN0IG1tY19jb21tYW5kICpt
bWNfY21kID0gcmVxLT5jbWQ7CisJc3RydWN0IG1tY19kYXRhICpkYXRhOworCXVuc2lnbmVkIGlu
dCBlcnI7CisJdW5zaWduZWQgaW50IHVzZV9jcmNfc2FtcGxlOworCWludCBpLCBqOworCXVpbnQz
Ml90IG9wY29kZTsKKwl1aW50MzJfdCBmbGFnczsKKwl1aW50MzJfdCBsYXN0X29wY29kZTsKKwl1
aW50MzJfdCBsYXN0X2ZsYWdzOworCXVpbnQ4X3QgcnNwYnVmW01NQ1NQSV9NQVhfUlNQX0xFTl07
CisKKyNkZWZpbmUgSVNfQ01EKGNvZGUsIGNtZCwgZmxhZ3MpICghKChmbGFncykgJiBNTUNfQ01E
X0lTX0FQUCkgJiYgKChjb2RlKSA9PSAoY21kKSkpCisjZGVmaW5lIElTX0FDTUQoY29kZSwgY21k
LCBmbGFncykgKCgoZmxhZ3MpICYgTU1DX0NNRF9JU19BUFApICYmICgoY29kZSkgPT0gKGNtZCkp
KQorCisJaWYgKHBvd2VyX29uICE9IHNsb3QtPmhvc3QuaW9zLnBvd2VyX21vZGUpIHsKKwkJcmV0
dXJuIChNTUNfRVJSX0lOVkFMSUQpOworCX0KKworCS8qIAorCSAqIFNhbXBsZSB1c2VfY3JjIHN5
c2N0bCBhbmQgYWRqdXN0IGNhcmQgc2V0dGluZyBpZiByZXF1aXJlZCBhbmQKKwkgKiBhcHByb3By
aWF0ZS4KKwkgKi8KKwl1c2VfY3JjX3NhbXBsZSA9IHNjLT51c2VfY3JjOworCWlmIChzbG90LT5j
cmNfaW5pdF9kb25lICYmCisJICAgICh1c2VfY3JjX3NhbXBsZSAhPSBzbG90LT5jcmNfZW5hYmxl
ZCkpIHsKKwkJZXJyID0gbW1jc3BpX3VwZGF0ZV9jcmNfc2V0dGluZyhicmRldiwgdXNlX2NyY19z
YW1wbGUpOworCQlpZiAoTU1DX0VSUl9OT05FICE9IGVycikgeworCQkJZ290byBvdXQ7CisJCX0K
KwkJc2xvdC0+Y3JjX2luaXRfZG9uZSA9IDE7CisJfQorCisJZXJyID0gbW1jc3BpX3NldF91cF9j
b21tYW5kKGJyZGV2LCAmY21kLCBtbWNfY21kKTsKKwlpZiAoTU1DX0VSUl9OT05FICE9IGVycikg
eworCQlnb3RvIG91dDsKKwl9CisKKwlvcGNvZGUgPSBjbWQub3Bjb2RlOworCWZsYWdzID0gY21k
LmZsYWdzOworCWRhdGEgPSBjbWQuZGF0YTsKKworCWxhc3Rfb3Bjb2RlID0gc2xvdC0+bGFzdF9v
cGNvZGU7CisJbGFzdF9mbGFncyA9IHNsb3QtPmxhc3RfZmxhZ3M7CisKKwkvKiBlbmZvcmNlIHJl
c3RyaWN0aW9ucyBvbiByZXF1ZXN0IHBhcmFtZXRlcnMgKi8KKwlpZiAoZGF0YSkgeworCisJCS8q
IAorCQkgKiBBbGwgd3JpdGVzIG11c3QgYmUgYSBtdWx0aXBsZSBvZiB0aGUgYmxvY2sgbGVuZ3Ro
LiBBbGwKKwkJICogcmVhZHMgZ3JlYXRlciB0aGFuIHRoZSBibG9jayBsZW5ndGggbXVzdCBiZSBh
IG11bHRpcGxlIG9mCisJCSAqIHRoZSBibG9jayBsZW5ndGguCisJCSAqLworCQlpZiAoKGRhdGEt
PmxlbiAlIE1NQ1NQSV9EQVRBX0JMT0NLX0xFTikgJiYKKwkJICAgICEoKGRhdGEtPmZsYWdzICYg
TU1DX0RBVEFfUkVBRCkgJiYKKwkJICAgICAgKGRhdGEtPmxlbiA8IE1NQ1NQSV9EQVRBX0JMT0NL
X0xFTikpKSB7CisJCQlUUkFDRShicmRldiwgRVJST1IsCisJCQkgICAgICAicmVxdWVzdGVkIGRh
dGEgcGhhc2Ugbm90IGEgbXVsdGlwbGUgb2YgJXVcbiIsCisJCQkgICAgICBNTUNTUElfREFUQV9C
TE9DS19MRU4pOworCQkJZXJyID0gTU1DX0VSUl9JTlZBTElEOworCQkJZ290byBvdXQ7CisJCX0K
KworCQlpZiAoKChkYXRhLT5mbGFncyAmIE1NQ19EQVRBX1JFQUQpICYmCisJCSAgICAgKGRhdGEt
PmZsYWdzICYgTU1DX0RBVEFfV1JJVEUpKSB8fAorCQkgICAgKGRhdGEtPmZsYWdzICYgTU1DX0RB
VEFfU1RSRUFNKSkgeworCQkJVFJBQ0UoYnJkZXYsIEVSUk9SLCAiaWxsZWdhbCBkYXRhIHBoYXNl
IGZsYWdzIDB4JTAyeFxuIiwKKwkJCSAgICAgIGRhdGEtPmZsYWdzKTsKKwkJCWVyciA9IE1NQ19F
UlJfSU5WQUxJRDsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8PSBj
bWQucmV0cmllczsgaSsrKSB7CisJCS8qIAorCQkgKiBPbiB0aGUgbmV4dCBjb21tYW5kIGZvbGxv
d2luZyBhIENNRDgsIGNvbGxlY3QgdGhlIE9DUiBhbmQKKwkJICogc2F2ZSBpdCBvZmYgZm9yIHVz
ZSBpbiB0aGUgbmV4dCBBQ01ENDEuCisJCSAqLworCQlpZiAoSVNfQ01EKFNEX1NFTkRfSUZfQ09O
RCwgbGFzdF9vcGNvZGUsIGxhc3RfZmxhZ3MpKSB7CisJCQllcnIgPSBtbWNzcGlfZ2V0X29jcihi
cmRldiwgc2xvdC0+bGFzdF9vY3IpOworCQkJaWYgKE1NQ19FUlJfTk9ORSAhPSBlcnIpIHsKKwkJ
CQlpZiAoTU1DX0VSUl9CQURDUkMgPT0gZXJyKSB7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJ
CQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCisJCWVyciA9IG1tY3NwaV9zZW5kX2NtZChicmRldiwg
JmNtZCwgcnNwYnVmKTsKKwkJaWYgKE1NQ19FUlJfTk9ORSAhPSBlcnIpIHsKKwkJCWlmIChNTUNf
RVJSX0JBRENSQyA9PSBlcnIpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWdvdG8gb3V0Owor
CQl9CisKKwkJaWYgKGRhdGEpIHsKKwkJCWlmIChkYXRhLT5mbGFncyAmIE1NQ19EQVRBX1JFQUQp
IHsKKwkJCQllcnIgPSBtbWNzcGlfcmVhZF9waGFzZShicmRldiwgJmNtZCk7CisJCQl9IGVsc2Ug
eyAgLyogTU1DX0RBVEFfV1JJVEUgKi8KKwkJCQllcnIgPSBtbWNzcGlfd3JpdGVfcGhhc2UoYnJk
ZXYsICZjbWQpOworCQkJfQorCisJCQlpZiAoTU1DX0VSUl9OT05FICE9IGVycikgeworCQkJCWlm
IChNTUNfRVJSX0JBRENSQyA9PSBlcnIpIHsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWdv
dG8gb3V0OworCQkJfQorCQl9IAorCisJCWJyZWFrOworCX0KKworCWlmIChNTUNfRVJSX05PTkUg
IT0gZXJyKSB7CisJCWdvdG8gb3V0OworCX0KKworCisJLyogCisJICogSWYgdGhpcyB3YXMgYW4g
QUNNRF9TRF9TRU5EX09QX0NPTkQgb3IgTU1DX1NFTkRfT1BfQ09ORCwgd2UgbmVlZAorCSAqIHRv
IHJldHVybiBhbiBPQ1IgdmFsdWUgaW4gdGhlIHJlc3VsdC4gIElmIHRoZSByZXNwb25zZSBmcm9t
IHRoZQorCSAqIGNhcmQgaW5kaWNhdGVzIGl0IGlzIHN0aWxsIGluIHRoZSBJRExFIHN0YXRlLCBz
dXBwbHkgdGhlIE9DUgorCSAqIHZhbHVlIG9idGFpbmVkIGFmdGVyIHRoZSBsYXN0IENNRDgsIG90
aGVyd2lzZSBpc3N1ZSBhbgorCSAqIE1NQ1NQSV9SRUFEX09DUiB0byBnZXQgdGhlIGN1cnJlbnQg
dmFsdWUsIHdoaWNoIHdpbGwgaGF2ZSBhIHZhbGlkCisJICogQ0NTIGJpdC4KKwkgKgorCSAqIFRo
aXMgZGFuY2UgaXMgcmVxdWlyZWQgdW5kZXIgdGhpcyBlbXVsYXRpb24gYXBwcm9hY2ggYmVjYXVz
ZSB0aGUKKwkgKiBzcGVjIHN0aXB1bGF0ZXMgdGhhdCBubyBvdGhlciBjb21tYW5kcyBzaG91bGQg
YmUgc2VudCB3aGlsZQorCSAqIEFDTURfU0RfU0VORF9PUF9DT05EIGlzIGJlaW5nIHVzZWQgdG8g
cG9sbCBmb3IgdGhlIGVuZCBvZiB0aGUKKwkgKiBJRExFIHN0YXRlLCBhbmQgc29tZSBjYXJkcyBk
byBlbmZvcmNlIHRoYXQgcmVxdWlyZW1lbnQuCisJICovCisJaWYgKElTX0FDTUQoQUNNRF9TRF9T
RU5EX09QX0NPTkQsIG9wY29kZSwgZmxhZ3MpIHx8CisJICAgIElTX0NNRChNTUNfU0VORF9PUF9D
T05ELCBvcGNvZGUsIGZsYWdzKSkgeworCisJCWlmIChyc3BidWZbMF0gJiBNTUNTUElfUjFfSURM
RSkgeworCQkJbWVtY3B5KCZyc3BidWZbMV0sIHNsb3QtPmxhc3Rfb2NyLCBNTUNTUElfT0NSX0xF
Tik7CisJCX0gZWxzZSB7CisKKwkJCS8qCisJCQkgKiBTb21lIGNhcmRzIHdvbid0IGFjY2VwdCB0
aGUgTU1DU1BJX0NSQ19PTl9PRkYKKwkJCSAqIGNvbW1hbmQgdW50aWwgaW5pdGlhbGl6YXRpb24g
aXMgY29tcGxldGUuCisJCQkgKgorCQkJICogRXhhbXBsZXM6CisJCQkgKgorCQkJICogU3VwZXIg
VGFsZW50IDFHQiBTRFNDIGNhcmQsIGNpZDoKKwkJCSAqIG1pZD0weDFiIG9pZD0weDUzNGQgcG5t
PSIwMDAwMCIgcHJ2PTEuMCBtZHQ9MDIuMjAxMAorCQkJICovCisJCQlpZiAoIXNsb3QtPmNyY19p
bml0X2RvbmUpIHsKKwkJCQllcnIgPSBtbWNzcGlfdXBkYXRlX2NyY19zZXR0aW5nKGJyZGV2LAor
CQkJCQkJCQlzYy0+dXNlX2NyYyk7CisJCQkJaWYgKE1NQ19FUlJfTk9ORSAhPSBlcnIpIHsKKwkJ
CQkJZ290byBvdXQ7CisJCQkJfQorCQkJCXNsb3QtPmNyY19pbml0X2RvbmUgPSAxOworCQkJfQor
CisJCQlmb3IgKGogPSAwOyBqIDw9IGNtZC5yZXRyaWVzOyBqKyspIHsKKwkJCQkvKiAKKwkJCQkg
KiBOb3RlIHRoYXQgaW4gdGhpcyBjYXNlLCB3ZSBwYXNzIG9uIHRoZSBSMQorCQkJCSAqIGZyb20g
UkVBRF9PQ1IuCisJCQkJICovCisJCQkJZXJyID0gbW1jc3BpX2dldF9vY3IoYnJkZXYsIHJzcGJ1
Zik7CisJCQkJaWYgKE1NQ19FUlJfTk9ORSAhPSBlcnIpIHsKKwkJCQkJaWYgKE1NQ19FUlJfQkFE
Q1JDID09IGVycikgeworCQkJCQkJY29udGludWU7CisJCQkJCX0KKwkJCQkJCisJCQkJCWdvdG8g
b3V0OworCQkJCX0KKworCQkJfQorCisJCQlpZiAoTU1DX0VSUl9OT05FICE9IGVycikgeworCQkJ
CWdvdG8gb3V0OworCQkJfQorCisJCX0KKworCQkvKiBhZGp1c3QgdGhlIFNQSSByZXNwb25zZSB0
eXBlIHRvIGluY2x1ZGUgdGhlIE9DUiAqLworCQljbWQucnNwX3R5cGUgPSBNTUNTUElfUlNQX1Iz
OworCX0KKworCWVyciA9IG1tY3NwaV90cmFuc2xhdGVfcmVzcG9uc2UoYnJkZXYsICZjbWQsIHJz
cGJ1Zik7CisJaWYgKE1NQ19FUlJfTk9ORSAhPSBlcnIpIHsKKwkJZ290byBvdXQ7CisJfQorCisg
b3V0OgorCXNsb3QtPmxhc3Rfb3Bjb2RlID0gbW1jX2NtZC0+b3Bjb2RlOworCXNsb3QtPmxhc3Rf
ZmxhZ3MgPSBtbWNfY21kLT5mbGFnczsKKworCW1tY19jbWQtPmVycm9yID0gZXJyOworCisJaWYg
KHJlcS0+ZG9uZSkgeworCQlyZXEtPmRvbmUocmVxKTsKKwl9CisJCisJVFJBQ0VfRVhJVChicmRl
dik7CisKKwlyZXR1cm4gKGVycik7Cit9CisKKworc3RhdGljIGludAorbW1jc3BpX2dldF9ybyhk
ZXZpY2VfdCBicmRldiwgZGV2aWNlX3QgcmVxZGV2KQoreworCVRSQUNFX0VOVEVSKGJyZGV2KTsK
KwlUUkFDRV9FWElUKGJyZGV2KTsKKworCS8qIFhYWCBubyBzdXBwb3J0IGZvciB0aGlzIGN1cnJl
bnRseSAqLworCXJldHVybiAoMCk7Cit9CisKKworc3RhdGljIGludAorbW1jc3BpX2FjcXVpcmVf
aG9zdChkZXZpY2VfdCBicmRldiwgZGV2aWNlX3QgcmVxZGV2KQoreworCVRSQUNFX0VOVEVSKGJy
ZGV2KTsKKworCXN0cnVjdCBtbWNzcGlfc29mdGMgKnNjID0gZGV2aWNlX2dldF9zb2Z0YyhicmRl
dik7CisJc3RydWN0IG1tY3NwaV9zbG90ICpzbG90ID0gZGV2aWNlX2dldF9pdmFycyhyZXFkZXYp
OworCXN0cnVjdCBzcGlfY29uZmlnIGNmZzsKKwlpbnQgZXJyID0gMDsKKworCU1NQ1NQSV9MT0NL
X1NMT1Qoc2xvdCk7CisJd2hpbGUgKHNsb3QtPmJ1c19idXN5KSB7CisJCW10eF9zbGVlcChzbG90
LCAmc2xvdC0+bXR4LCAwLCAibW1jc3BpYWgiLCAwKTsKKwl9CisJc2xvdC0+YnVzX2J1c3krKzsK
KwlNTUNTUElfVU5MT0NLX1NMT1Qoc2xvdCk7CisKKwlTUElCVVNfQUNRVUlSRV9CVVMoc2MtPmJ1
c2Rldiwgc2MtPmRldik7CisKKwkvKiBSZXN0b3JlIHRoZSBjbG9jayB0byB0aGUgbGFzdCBzZXR0
aW5nLCBhcyBpdCBtYXkgaGF2ZSBiZWVuCisJICAgY2hhbmdlZCBieSBhbm90aGVyIHNwaWJ1cyBk
ZXZpY2UuICovCisJY2ZnLmNsb2NrX2h6ID0gc2xvdC0+aG9zdC5pb3MuY2xvY2s7CisJU1BJQlVT
X1NFVF9DT05GSUcoc2xvdC0+c2MtPmJ1c2RldiwgJmNmZyk7CisKKwlUUkFDRV9FWElUKGJyZGV2
KTsKKworCXJldHVybiAoZXJyKTsKK30KKworCitzdGF0aWMgaW50CittbWNzcGlfcmVsZWFzZV9o
b3N0KGRldmljZV90IGJyZGV2LCBkZXZpY2VfdCByZXFkZXYpCit7CisJVFJBQ0VfRU5URVIoYnJk
ZXYpOworCisJc3RydWN0IG1tY3NwaV9zb2Z0YyAqc2MgPSBkZXZpY2VfZ2V0X3NvZnRjKGJyZGV2
KTsKKwlzdHJ1Y3QgbW1jc3BpX3Nsb3QgKnNsb3QgPSBkZXZpY2VfZ2V0X2l2YXJzKHJlcWRldik7
CisKKwlTUElCVVNfUkVMRUFTRV9CVVMoc2MtPmJ1c2Rldiwgc2MtPmRldik7CisKKwlNTUNTUElf
TE9DS19TTE9UKHNsb3QpOworCXNsb3QtPmJ1c19idXN5LS07CisJTU1DU1BJX1VOTE9DS19TTE9U
KHNsb3QpOworCisJd2FrZXVwKHNsb3QpOworCisJVFJBQ0VfRVhJVChicmRldik7CisKKwlyZXR1
cm4gKDApOworfQorCisKK3N0YXRpYyB1aW50OF90Cit1cGRhdGVfY3JjNyh1aW50OF90IGNyYywg
dWludDhfdCAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCWludCBpOworCXVpbnQ4X3QgdG1w
OworCQorCWZvciAoaT0wOyBpPGxlbjsgaSsrKSB7CisJCXRtcCA9IChjcmMgPDwgMSkgXiBidWZb
aV07CisJCWNyYyA9IGNyYzd0YWJbdG1wXTsKKwl9CisJCisJcmV0dXJuIGNyYzsKK30KKworCitz
dGF0aWMgdWludDE2X3QKK3VwZGF0ZV9jcmMxNih1aW50MTZfdCBjcmMsIHVpbnQ4X3QgKmJ1Ziwg
dW5zaWduZWQgaW50IGxlbikKK3sKKworCWludCBpOworCXVpbnQxNl90IHRtcCwgYzE2OworCisJ
Zm9yIChpPTA7IGk8bGVuOyBpKyspIHsKKwkJYzE2ICA9IDB4MDBmZiAmICh1aW50MTZfdClidWZb
aV07CisKKwkJdG1wID0gKGNyYyA+PiA4KSBeIGMxNjsKKwkJY3JjID0gKGNyYyA8PCA4KSBeIGNy
YzE2dGFiW3RtcF07CisJfQorCisJcmV0dXJuIGNyYzsKK30KKworCitzdGF0aWMgdm9pZAoraW5p
dF9jcmM3dGFiKHZvaWQpCit7CisjZGVmaW5lIFBfQ1JDNyAweDg5CisKKwlpbnQgaSwgajsKKwl1
aW50OF90IGNyYywgYzsKKyAgICAKKwlmb3IgKGk9MDsgaTwyNTY7IGkrKykgeworCSAgICAKKwkJ
YyA9ICh1aW50OF90KWk7CisJCWNyYyA9IChjICYgMHg4MCkgPyBjIF4gUF9DUkM3IDogYzsKKwor
CQlmb3IgKGo9MTsgajw4OyBqKyspIHsKKwkJCWNyYyA9IGNyYyA8PCAxOworCisJCQlpZiAoY3Jj
ICYgMHg4MCkgeworCQkJCWNyYyA9IGNyYyBeIFBfQ1JDNzsKKwkJCX0KKwkJfQorCisJCWNyYzd0
YWJbaV0gPSBjcmM7CisJfQorfQorCisKK3N0YXRpYyB2b2lkCitpbml0X2NyYzE2dGFiKHZvaWQp
Cit7CisjZGVmaW5lIFBfQ0NJVFQgMHgxMDIxCisKKwlpbnQgaSwgajsKKwl1aW50MTZfdCBjcmMs
IGM7CisKKwlmb3IgKGk9MDsgaTwyNTY7IGkrKykgeworCisJCWNyYyA9IDA7CisJCWMgICA9ICgo
dWludDE2X3QpIGkpIDw8IDg7CisKKwkJZm9yIChqPTA7IGo8ODsgaisrKSB7CisKKwkJCWlmICgo
Y3JjIF4gYykgJiAweDgwMDApIGNyYyA9ICggY3JjIDw8IDEgKSBeIFBfQ0NJVFQ7CisJCQllbHNl
ICAgICAgICAgICAgICAgICAgICBjcmMgPSAgIGNyYyA8PCAxOworCisJCQljID0gYyA8PCAxOwor
CQl9CisKKwkJY3JjMTZ0YWJbaV0gPSBjcmM7CisJfQorfQorCisKK3N0YXRpYyBpbnQKK21tY3Nw
aV9tb2RldmVudF9oYW5kbGVyKG1vZHVsZV90IG1vZCwgaW50IHdoYXQsIHZvaWQgKmFyZykKK3sK
Kwlzd2l0Y2ggKHdoYXQpIHsKKwljYXNlIE1PRF9MT0FEOgorCQlpbml0X2NyYzd0YWIoKTsKKwkJ
aW5pdF9jcmMxNnRhYigpOworCQltZW1zZXQob25lc2J1ZiwgMHhmZiwgc2l6ZW9mKG9uZXNidWYp
KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIChFT1BOT1RTVVBQKTsKKwl9CisKKwly
ZXR1cm4gKDApOworfQorCisgCisKK3N0YXRpYyBkZXZpY2VfbWV0aG9kX3QgbW1jc3BpX21ldGhv
ZHNbXSA9IHsKKwkvKiBkZXZpY2VfaWYgKi8KKwlERVZNRVRIT0QoZGV2aWNlX3Byb2JlLCBtbWNz
cGlfcHJvYmUpLAorCURFVk1FVEhPRChkZXZpY2VfYXR0YWNoLCBtbWNzcGlfYXR0YWNoKSwKKwlE
RVZNRVRIT0QoZGV2aWNlX2RldGFjaCwgbW1jc3BpX2RldGFjaCksCisJREVWTUVUSE9EKGRldmlj
ZV9zdXNwZW5kLCBtbWNzcGlfc3VzcGVuZCksCisJREVWTUVUSE9EKGRldmljZV9yZXN1bWUsIG1t
Y3NwaV9yZXN1bWUpLAorCisJLyogQnVzIGludGVyZmFjZSAqLworCURFVk1FVEhPRChidXNfcmVh
ZF9pdmFyLAltbWNzcGlfcmVhZF9pdmFyKSwKKwlERVZNRVRIT0QoYnVzX3dyaXRlX2l2YXIsCW1t
Y3NwaV93cml0ZV9pdmFyKSwKKworCS8qIG1tY2JyX2lmICovCisJREVWTUVUSE9EKG1tY2JyX3Vw
ZGF0ZV9pb3MsIG1tY3NwaV91cGRhdGVfaW9zKSwKKwlERVZNRVRIT0QobW1jYnJfcmVxdWVzdCwg
bW1jc3BpX3JlcXVlc3QpLAorCURFVk1FVEhPRChtbWNicl9nZXRfcm8sIG1tY3NwaV9nZXRfcm8p
LAorCURFVk1FVEhPRChtbWNicl9hY3F1aXJlX2hvc3QsIG1tY3NwaV9hY3F1aXJlX2hvc3QpLAor
CURFVk1FVEhPRChtbWNicl9yZWxlYXNlX2hvc3QsIG1tY3NwaV9yZWxlYXNlX2hvc3QpLAorCisJ
ezAsIDB9LAorfTsKKworCitzdGF0aWMgZHJpdmVyX3QgbW1jc3BpX2RyaXZlciA9IHsKKwkibW1j
c3BpIiwKKwltbWNzcGlfbWV0aG9kcywKKwlzaXplb2Yoc3RydWN0IG1tY3NwaV9zb2Z0YyksCit9
Oworc3RhdGljIGRldmNsYXNzX3QgbW1jc3BpX2RldmNsYXNzOworCisKK0RSSVZFUl9NT0RVTEUo
bW1jc3BpLCBzcGlidXMsIG1tY3NwaV9kcml2ZXIsIG1tY3NwaV9kZXZjbGFzcywgbW1jc3BpX21v
ZGV2ZW50X2hhbmRsZXIsIDApOworCisKKworCisjaWYgZGVmaW5lZChNTUNTUElfRU5BQkxFX0RF
QlVHX0ZVTkNTKQorc3RhdGljIHZvaWQKK21tY3NwaV9kdW1wX2RhdGEoZGV2aWNlX3QgZGV2LCBj
b25zdCBjaGFyICpsYWJlbCwgdWludDhfdCAqZGF0YSwKKwkJIHVuc2lnbmVkIGludCBsZW4pCit7
CisJVFJBQ0VfRU5URVIoZGV2KTsKKworCXVuc2lnbmVkIGludCBpLCBqOworCXVuc2lnbmVkIGlu
dCBudW1fbGluZXM7CisJdW5zaWduZWQgaW50IHJlc2lkdWFsOworCisJbnVtX2xpbmVzID0gbGVu
IC8gMTY7CisJcmVzaWR1YWwgPSBsZW4gLSAxNiAqIG51bV9saW5lczsKKworCWZvcihpID0gMDsg
aSA8IG51bV9saW5lczsgaSsrKSB7CisJCWRldmljZV9wcmludGYoZGV2LCAiJXM6IiwgbGFiZWwp
OworCQlmb3IoaiA9IDA7IGogPCAxNjsgaisrKSB7CisJCQlwcmludGYoIiAlMDJ4IiwgZGF0YVtp
ICogMTYgKyBqXSk7IAorCQl9CisJCXByaW50ZigiXG4iKTsKKwl9CisKKwlpZiAocmVzaWR1YWwp
IHsKKwkJZGV2aWNlX3ByaW50ZihkZXYsICIlczoiLCBsYWJlbCk7CisJCWZvcihqID0gMDsgaiA8
IHJlc2lkdWFsOyBqKyspIHsKKwkJCXByaW50ZigiICUwMngiLCBkYXRhW251bV9saW5lcyAqIDE2
ICsgal0pOyAKKwkJfQorCQlwcmludGYoIlxuIik7CisJfQorCisJVFJBQ0VfRVhJVChkZXYpOwor
fQorCisKK3N0YXRpYyB2b2lkCittbWNzcGlfZHVtcF9zcGlfYnVzKGRldmljZV90IGRldiwgdW5z
aWduZWQgaW50IGxlbikKK3sKKwlUUkFDRV9FTlRFUihkZXYpOworCisJdW5zaWduZWQgaW50IG51
bV9ibG9ja3MgPSBsZW4gLyBNTUNTUElfREFUQV9CTE9DS19MRU47CisJdW5zaWduZWQgaW50IHJl
c2lkdWFsID0gbGVuIC0gbnVtX2Jsb2NrcyAqIE1NQ1NQSV9EQVRBX0JMT0NLX0xFTjsKKwl1bnNp
Z25lZCBpbnQgaTsKKworCWZvcihpID0gMDsgaSA8IG51bV9ibG9ja3M7IGkrKykgeworCQlpZiAo
TU1DX0VSUl9OT05FICE9CisJCSAgICBtbWNzcGlfZG9fc3BpX3JlYWQoZGV2LCBqdW5rYnVmLCBN
TUNTUElfREFUQV9CTE9DS19MRU4pKSB7CisJCQlkZXZpY2VfcHJpbnRmKGRldiwgInNwaSByZWFk
IGZhaWxlZFxuIik7CisJCQlyZXR1cm47CisJCX0KKworCQltbWNzcGlfZHVtcF9kYXRhKGRldiwg
ImJ1c19kYXRhIiwganVua2J1ZiwKKwkJCQkgTU1DU1BJX0RBVEFfQkxPQ0tfTEVOKTsKKwl9CisK
KwlpZiAocmVzaWR1YWwpIHsKKwkJaWYgKE1NQ19FUlJfTk9ORSAhPQorCQkgICAgbW1jc3BpX2Rv
X3NwaV9yZWFkKGRldiwganVua2J1ZiwgcmVzaWR1YWwpKSB7CisJCQlkZXZpY2VfcHJpbnRmKGRl
diwgInNwaSByZWFkIGZhaWxlZFxuIik7CisJCQlyZXR1cm47CisJCX0KKworCQltbWNzcGlfZHVt
cF9kYXRhKGRldiwgImJ1c19kYXRhIiwganVua2J1ZiwgcmVzaWR1YWwpOworCX0KKwkKKworCVRS
QUNFX0VYSVQoZGV2KTsKK30KKyNlbmRpZgorCisKKy8qCisgKiBUaGVzZSBhcmUgdGhlIGNhcmRz
IHRoaXMgY29kZSB3YXMgdGVzdGVkIHdpdGggKGluaXRpYWxpemF0aW9uLAorICogaWRlbnRpZmlj
YXRpb24sIGFuZCBzaW5nbGUgYW5kIG11bHRpIGJsb2NrIHJlYWQgYW5kIHdyaXRlIHdpdGggY3Jj
CisgKiBjaGVja2luZyBkaXNhYmxlZCBhbmQgZW5hYmxlZCksIHNvcnRlZCBieSBDSUQ6CisgKgor
ICogRGVsa2luIERldmljZXMgICAgMkdCIG1pZD0weDAyIG9pZD0weDU0NGQgcG5tPSJTQTAyRyIg
cHJ2PTAuNCBtZHQ9MDUuMjAxMAorICogY2lkPTAyNTQ0ZDUzNDEzMDMyNDcwNDljMTAwMTJlMDBh
NTAwIGNzZD0wMDJlMDAzMjViNWFhM2E5ZmZmZmZmODAwYTgwMDAwMAorICoKKyAqIEtpbmdzdG9u
ICAgICAgICAgIDRHQiBtaWQ9MHgwMiBvaWQ9MHg1NDRkIHBubT0iU0EwNEciIHBydj0wLjkgbWR0
PTEyLjIwMTEKKyAqIGNpZD0wMjU0NGQ1MzQxMzAzNDQ3MDkyN2ZlYzJlMDAwYmMwMCBjc2Q9NDAw
ZTAwMzI1YjU5MDAwMDFkYTc3ZjgwMGE0MDAwMDAKKyAqCisgKiBQTlkgICAgICAgICAgICAgICA4
R0IgbWlkPTB4MDIgb2lkPTB4NTQ0ZCBwbm09IlNBMDhHIiBwcnY9MC42IG1kdD0wOC4yMDExCisg
KiBjaWQ9MDI1NDRkNTM0MTMwMzg0NzA2MTVhNjNmZjUwMGI4MDAgY3NkPTQwMGUwMDMyNWI1OTAw
MDAzYjRmN2Y4MDBhNDAwMDAwCisgKgorICogRHVyYWNlbGwgICAgICAgICAgMkdCIG1pZD0weDAz
IG9pZD0weDUzNDQgcG5tPSJTVTAyRyIgcHJ2PTguMCBtZHQ9MDEuMjAxMQorICogY2lkPTAzNTM0
NDUzNTUzMDMyNDc4MDBjOGE2NzE4MDBiMTAwIGNzZD0wMDI2MDAzMjVmNWE4M2FlZmVmYmNmZmY5
MjgwNDAwMAorICoKKyAqIEFEQVRBICAgICAgICAgICAgIDRHQiBtaWQ9MHgwMyBvaWQ9MHg1MzQ0
IHBubT0iU1UwNEciIHBydj04LjAgbWR0PTA4LjIwMTEKKyAqIGNpZD0wMzUzNDQ1MzU1MzAzNDQ3
ODAwMmJjMWVhZTAwYjgwMCBjc2Q9NDAwZTAwMzI1YjU5MDAwMDFkOGE3ZjgwMGE0MDQwMDAKKyAq
CisgKiBTYW5kaXNrICAgICAgICAgICA0R0IgbWlkPTB4MDMgb2lkPTB4NTM0NCBwbm09IlNVMDRH
IiBwcnY9OC4wIG1kdD0xMC4yMDEwCisgKiBjaWQ9MDM1MzQ0NTM1NTMwMzQ0NzgwMGFjY2JhOWUw
MGFhMDAgY3NkPTQwMGUwMDMyNWI1OTAwMDAxZDhhN2Y4MDBhNDA0MDAwCisgKgorICogUFFJICAg
ICAgICAgICAgICAgNEdCIG1pZD0weDAzIG9pZD0weDUzNDQgcG5tPSJTVTA0RyIgcHJ2PTguMCBt
ZHQ9MDEuMjAxMQorICogY2lkPTAzNTM0NDUzNTUzMDM0NDc4MDBjOTgxZjdmMDBiMTAwIGNzZD00
MDBlMDAzMjViNTkwMDAwMWQ4YTdmODAwYTQwNDAwMAorICoKKyAqIFNpbGljb24gUG93ZXIgICAg
IDRHQiBtaWQ9MHgwMyBvaWQ9MHg1MzQ0IHBubT0iU1UwNEciIHBydj04LjAgbWR0PTExLjIwMTEK
KyAqIGNpZD0wMzUzNDQ1MzU1MzAzNDQ3ODAxMzZmMzlhODAwYmIwMCBjc2Q9NDAwZTAwMzI1YjU5
MDAwMDFkOGE3ZjgwMGE0MDQwMDAKKyAqCisgKiBUZWFtIEdyb3VwICAgICAgICA0R0IgbWlkPTB4
MDMgb2lkPTB4NTM0NCBwbm09IlNVMDRHIiBwcnY9OC4wIG1kdD0xMi4yMDExCisgKiBjaWQ9MDM1
MzQ0NTM1NTMwMzQ0NzgwMTQ1ZDZlNDUwMGJjMDAgY3NkPTQwMGUwMDMyNWI1OTAwMDAxZDhhN2Y4
MDBhNDA0MDAwCisgKgorICogRnVqaWZpbG0gICAgICAgICAgNEdCIG1pZD0weDAzIG9pZD0weDUz
NDQgcG5tPSJTVTA0RyIgcHJ2PTguMCBtZHQ9MDMuMjAxMQorICogY2lkPTAzNTM0NDUzNTUzMDM0
NDc4MDIxNGE3OTA1MDBiMzAwIGNzZD00MDBlMDAzMjViNTkwMDAwMWQ4YTdmODAwYTQwNDAwMAor
ICoKKyAqIFBhdHJpb3QgTWVtb3J5ICAgIDRHQiBtaWQ9MHgwMyBvaWQ9MHg1MzQ0IHBubT0iU1Uw
NEciIHBydj04LjAgbWR0PTA1LjIwMTEKKyAqIGNpZD0wMzUzNDQ1MzU1MzAzNDQ3ODA4MDg1Mzlj
MDAwYjUwMCBjc2Q9NDAwZTAwMzI1YjU5MDAwMDFkOGE3ZjgwMGE0MDQwMDAKKyAqCisgKiBTYW5k
aXNrICAgICAgICAgIDMyR0IgbWlkPTB4MDMgb2lkPTB4NTM0NCBwbm09IlNVMzJHIiBwcnY9OC4w
IG1kdD0wMC4yMDAwCisgKiBjaWQ9MDM1MzQ0NTM1NTMzMzI0NzgwNjFiYmZkNjUwMGJiMDAgY3Nk
PTQwMGUwMDMyNWI1OTAwMDBlZGM4N2Y4MDBhNDA0MDAwCisgKgorICogU2FuZGlzayAgICAgICAg
ICA2NEdCIG1pZD0weDAzIG9pZD0weDUzNDQgcG5tPSJTVTY0RyIgcHJ2PTguMCBtZHQ9MTIuMjAx
MQorICogY2lkPTAzNTM0NDUzNTUzNjM0NDc4MDcxOGZjMWE0MDBiYzAwIGNzZD00MDBlMDAzMjVi
NTkwMDAxZGJkMzdmODAwYTQwNDAwMAorICoKKyAqIERhbmUtRWxlYyAgICAgICAgIDRHQiBtaWQ9
MHgxMiBvaWQ9MHgzNDU2IHBubT0iU01JICAiIHBydj0xLjAgbWR0PTEwLjIwMTEKKyAqIGNpZD0x
MjM0NTY1MzRkNDkyMDIwMTA0MjAyMGFiZDAwYmEwMCBjc2Q9NDAwZTAwMzI1YjU5MDAwMDFkNmY3
ZjgwMGE0MDAwMDAKKyAqCisgKiBHLlNLSUxMICAgICAgICAgICA0R0IgbWlkPTB4MWIgb2lkPTB4
NTM0ZCBwbm09IjAwMDAwIiBwcnY9MS4wIG1kdD0wMC4yMDAwCisgKiBjaWQ9MWI1MzRkMzAzMDMw
MzAzMDEwMDgxMDFmNDEwMGJjMDAgY3NkPTQwMGUwMDMyNWI1OTAwMDAxZDliN2Y4MDBhNDAwMDAw
CisgKgorICogVHJhbnNjZW5kICAgICAgICAgMkdCIG1pZD0weDFiIG9pZD0weDUzNGQgcG5tPSIw
MDAwMCIgcHJ2PTEuMCBtZHQ9MDAuMjAwMAorICogY2lkPTFiNTM0ZDMwMzAzMDMwMzAxMDA4ZDFm
NjY5MDBiMzAwIGNzZD0wMDdmZmYzMjViNWE4M2JhZjZkYmRmZmYwZTgwMDAwMAorICoKKyAqIFNh
bXN1bmcgICAgICAgICAgIDJHQiBtaWQ9MHgxYiBvaWQ9MHg1MzRkIHBubT0iMDAwMDAiIHBydj0x
LjAgbWR0PTEwLjIwMTEKKyAqIGNpZD0xYjUzNGQzMDMwMzAzMDMwMTAxZjljYTk2NzAwYmEwMCBj
c2Q9MDA3ZmZmMzI1YjVhODNiYWY2ZGJkZmZmMGU4MDAwMDAKKyAqCisgKiBUcmFuc2NlbmQgICAg
ICAgICAyR0IgbWlkPTB4MWIgb2lkPTB4NTM0ZCBwbm09IjAwMDAwIiBwcnY9MS4wIG1kdD0wMC4y
MDAwCisgKiBjaWQ9MWI1MzRkMzAzMDMwMzAzMDEwMjllZjFjMjEwMGIzMDAgY3NkPTAwN2ZmZjMy
NWI1YTgzYmFmNmRiZGZmZjBlODAwMDAwCisgKgorICogU3VwZXIgVGFsZW50ICAgICAgMUdCIG1p
ZD0weDFiIG9pZD0weDUzNGQgcG5tPSIwMDAwMCIgcHJ2PTEuMCBtZHQ9MDIuMjAxMAorICogY2lk
PTFiNTM0ZDMwMzAzMDMwMzAxMGIxYzY4ZTIxMDBhMjAwIGNzZD0wMDdmZmYzMjVmNTk4M2NiNzZk
YmRmZmY5NjQwMDAwMAorICoKKyAqIFRyaWJlY2EgICAgICAgICAgIDFHQiBtaWQ9MHgxYiBvaWQ9
MHg1MzRkIHBubT0iVUQgICAiIHBydj0xLjAgbWR0PTA5LjIwMDcKKyAqIGNpZD0xYjUzNGQ1NTQ0
MjAyMDIwMTBkMzkwNTcwNDAwNzkwMCBjc2Q9MDAyZjAwMzI1ZjU5ODNjYTZkYjdmZjlmOTY0MDAw
MDAKKyAqCisgKiBWZXJiYXRpbSAgICAgICAgICAyR0IgbWlkPTB4Mjcgb2lkPTB4NTA0OCBwbm09
IlNEMDJHIiBwcnY9My4wIG1kdD0wOC4yMDExCisgKiBjaWQ9Mjc1MDQ4NTM0NDMwMzI0NzMwOWQw
NzNhOGYwMGI4MDAgY3NkPTAwNWUwMDMyNWI1YWEzYTlmZmZmZmY4MDBhODAwMDAwCisgKgorICog
TWF4ZWxsICAgICAgICAgICAgNEdCIG1pZD0weDI3IG9pZD0weDUwNDggcG5tPSJTRDA0RyIgcHJ2
PTMuMCBtZHQ9MTAuMjAxMQorICogY2lkPTI3NTA0ODUzNDQzMDM0NDczMDdjMTlhMmYxMDBiYTAw
IGNzZD00MDBlMDAzMjViNTkwMDAwMWRhNzdmODAwYTQwMDAwMAorICoKKyAqIE11c2hraW4gICAg
ICAgICAgIDRHQiBtaWQ9MHgyNyBvaWQ9MHg1MDQ4IHBubT0iU0QwNEciIHBydj0zLjAgbWR0PTA4
LjIwMTEKKyAqIGNpZD0yNzUwNDg1MzQ0MzAzNDQ3MzA3Y2RhNDBlODAwYjgwMCBjc2Q9NDAwZTAw
MzI1YjU5MDAwMDFkNmY3ZjgwMGE0MDAwMDAKKyAqCisgKiBTb255ICAgICAgICAgICAgICA0R0Ig
bWlkPTB4Mjcgb2lkPTB4NTA0OCBwbm09IlNEMDRHIiBwcnY9My4wIG1kdD0wOS4yMDExCisgKiBj
aWQ9Mjc1MDQ4NTM0NDMwMzQ0NzMwN2NlYWRkNGMwMGI5MDAgY3NkPTQwMGUwMDMyNWI1OTAwMDAx
ZDZmN2Y4MDBhNDAwMDAwCisgKgorICogV2ludGVjICAgICAgICAgICAxNkdCIG1pZD0weDI3IG9p
ZD0weDUwNDggcG5tPSJTRDE2RyIgcHJ2PTMuMCBtZHQ9MTAuMjAxMQorICogY2lkPTI3NTA0ODUz
NDQzMTM2NDczMDdjMmY4YzljMDBiYTAwIGNzZD00MDBlMDAzMjViNTkwMDAwNzczZjdmODAwYTQw
MDAwMAorICoKKyAqIExleGFyICAgICAgICAgICAgIDRHQiBtaWQ9MHgyOCBvaWQ9MHg0MjQ1IHBu
bT0iTEVYQVIiIHBydj0xLjAgbWR0PTEwLjIwMTEKKyAqIGNpZD0yODQyNDU0YzQ1NTg0MTUyMTBi
ZTAzZDQ4MTAwYmEwMCBjc2Q9NDAwZTAwMzI1YjU5MDAwMDFkZGQ3ZjgwMGE0MDAwMDAKKyAqCisg
KiBIUCAgICAgICAgICAgICAgICAyR0IgbWlkPTB4Mjggb2lkPTB4NDI0NSBwbm09IlNEVTJHIiBw
cnY9MC4wIG1kdD0wNy4yMDExCisgKiBjaWQ9Mjg0MjQ1NTM0NDU1MzI0NzAwMDAwMDE0NGYwMGI3
MDAgY3NkPTAwMmYwMDMyNWI1YTgzODU2ZGI3ZmZiZjE2ODAwMDAwCisgKgorICogRVAgTWVtb3J5
ICAgICAgICAgNEdCIG1pZD0weDM2IG9pZD0weDQxNGYgcG5tPSJNU0QgICIgcHJ2PTEuMCBtZHQ9
MDcuMjAxMAorICogY2lkPTM2NDE0ZjRkNTM0NDIwMjAxMDAwMDA4NWI3MDBhNzAwIGNzZD00MDBl
MDAzMjViNTkwMDAwMWRmZjdmODAwYTQwMDAwMAorICoKKyAqIFJpREFUQSAgICAgICAgICAgIDRH
QiBtaWQ9MHg3MyBvaWQ9MHg0MjQ3IHBubT0iTkNhcmQiIHBydj0wLjAgbWR0PTEyLjIwMTEKKyAq
IGNpZD03MzQyNDc0ZTQzNjE3MjY0MDAwMDAwMDM1MjAwYmMwMCBjc2Q9NDAwZTAwMzI1YjU5MDAw
MDFkOTk3ZjgwMGE0MDAwMDAKKyAqCisgKiBQcmV0ZWMgICAgICAgICAgICA4R0IgbWlkPTB4NzMg
b2lkPTB4NDI0NyBwbm09Ik5DYXJkIiBwcnY9MS4wIG1kdD0xMi4yMDExCisgKiBjaWQ9NzM0MjQ3
NGU0MzYxNzI2NDEwMjYwMDE0NjQwMGJjMDAgY3NkPTQwMGUwMDMyNWI1OTAwMDAzYmRkN2Y4MDBh
NDAwMDAwCisgKgorICogVHJhbnNjZW5kICAgICAgICAgOEdCIG1pZD0weDc0IG9pZD0weDRhNDUg
cG5tPSJVU0QgICIgcHJ2PTEuMCBtZHQ9MDAuMjAwMAorICogY2lkPTc0NGE0NTU1NTM0NDIwMjAx
MDA1MTAwNGE5MDBiYjAwIGNzZD00MDBlMDAzMjViNTkwMDAwM2JiZDdmODAwYTQwMDAwMAorICoK
KyAqLwpJbmRleDogc3lzL2Rldi9tbWMvbW1jLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gc3lzL2Rldi9tbWMv
bW1jLmMJKHJldmlzaW9uIDIzNDk5OSkKKysrIHN5cy9kZXYvbW1jL21tYy5jCSh3b3JraW5nIGNv
cHkpCkBAIC0yMjQsNyArMjI0LDcgQEAKIAlzYyA9IGRldmljZV9nZXRfc29mdGMoYnVzZGV2KTsK
IAlNTUNfTE9DSyhzYyk7CiAJaWYgKHNjLT5vd25lcikKLQkJcGFuaWMoIm1tYzogaG9zdCBicmlk
Z2UgZGlkbid0IHNlcmFsaXplIHVzLiIpOworCQlwYW5pYygibW1jOiBob3N0IGJyaWRnZSBkaWRu
J3Qgc2VyaWFsaXplIHVzLiIpOwogCXNjLT5vd25lciA9IGRldjsKIAlNTUNfVU5MT0NLKHNjKTsK
IApAQCAtMzY5LDYgKzM2OSw4IEBACiAJc3RydWN0IG1tY19jb21tYW5kIGFwcGNtZDsKIAlpbnQg
ZXJyID0gTU1DX0VSUl9OT05FLCBpOwogCisJY21kLT5mbGFncyB8PSBNTUNfQ01EX0lTX0FQUDsK
KwogCWZvciAoaSA9IDA7IGkgPD0gcmV0cmllczsgaSsrKSB7CiAJCWFwcGNtZC5vcGNvZGUgPSBN
TUNfQVBQX0NNRDsKIAkJYXBwY21kLmFyZyA9IHJjYSA8PCAxNjsKQEAgLTU0OSw5ICs1NTEsMTQg
QEAKIHsKIAlpbnQgZmxhZ3M7CiAKLQlmbGFncyA9IChyY2EgPyBNTUNfUlNQX1IxQiA6IE1NQ19S
U1BfTk9ORSkgfCBNTUNfQ01EX0FDOwotCXJldHVybiAobW1jX3dhaXRfZm9yX2NvbW1hbmQoc2Ms
IE1NQ19TRUxFQ1RfQ0FSRCwgKHVpbnQzMl90KXJjYSA8PCAxNiwKLQkgICAgZmxhZ3MsIE5VTEws
IENNRF9SRVRSSUVTKSk7CisJaWYgKGJ1c190eXBlX3NwaSA9PSBtbWNicl9nZXRfYnVzX3R5cGUo
c2MtPmRldikpIHsKKwkJLyogY2FyZCBzZWxlY3Rpb24gaXNuJ3QgcmVxdWlyZWQgKi8KKwkJcmV0
dXJuIChNTUNfRVJSX05PTkUpOworCX0gZWxzZSB7CisJCWZsYWdzID0gKHJjYSA/IE1NQ19SU1Bf
UjFCIDogTU1DX1JTUF9OT05FKSB8IE1NQ19DTURfQUM7CisJCXJldHVybiAobW1jX3dhaXRfZm9y
X2NvbW1hbmQoc2MsIE1NQ19TRUxFQ1RfQ0FSRCwgKHVpbnQzMl90KXJjYSA8PCAxNiwKKwkJICAg
IGZsYWdzLCBOVUxMLCBDTURfUkVUUklFUykpOworCX0KIH0KIAogc3RhdGljIGludApAQCAtNjU1
LDYgKzY2MiwxMSBAQAogCXVpbnQ4X3QJdmFsdWU7CiAJdV9jaGFyIHN3aXRjaF9yZXNbNjRdOwog
CisJaWYgKGJ1c190eXBlX3NwaSA9PSBtbWNicl9nZXRfYnVzX3R5cGUoc2MtPmRldikpIHsKKwkJ
LyogYnVzIHRpbWluZyBjYW4ndCBiZSBzZXQgb24gdGhlIGNhcmQgaW4gc3BpIG1vZGUgKi8KKwkJ
cmV0dXJuIChNTUNfRVJSX05PTkUpOworCX0KKwogCXN3aXRjaCAodGltaW5nKSB7CiAJY2FzZSBi
dXNfdGltaW5nX25vcm1hbDoKIAkJdmFsdWUgPSAwOwpAQCAtODU5LDcgKzg3MSw3IEBACiAJaWYg
KHYgPT0gMCkgewogCQltID0gbW1jX2dldF9iaXRzKHJhd19jc2QsIDEyOCwgMTE1LCA0KTsKIAkJ
ZSA9IG1tY19nZXRfYml0cyhyYXdfY3NkLCAxMjgsIDExMiwgMyk7Ci0JCWNzZC0+dGFjYyA9IGV4
cFtlXSAqIG1hbnRbbV0gKyA5IC8gMTA7CisJCWNzZC0+dGFjYyA9IChleHBbZV0gKiBtYW50W21d
ICsgOSkgLyAxMDsKIAkJY3NkLT5uc2FjID0gbW1jX2dldF9iaXRzKHJhd19jc2QsIDEyOCwgMTA0
LCA4KSAqIDEwMDsKIAkJbSA9IG1tY19nZXRfYml0cyhyYXdfY3NkLCAxMjgsIDk5LCA0KTsKIAkJ
ZSA9IG1tY19nZXRfYml0cyhyYXdfY3NkLCAxMjgsIDk2LCAzKTsKQEAgLTg4Nyw3ICs4OTksNyBA
QAogCX0gZWxzZSBpZiAodiA9PSAxKSB7CiAJCW0gPSBtbWNfZ2V0X2JpdHMocmF3X2NzZCwgMTI4
LCAxMTUsIDQpOwogCQllID0gbW1jX2dldF9iaXRzKHJhd19jc2QsIDEyOCwgMTEyLCAzKTsKLQkJ
Y3NkLT50YWNjID0gZXhwW2VdICogbWFudFttXSArIDkgLyAxMDsKKwkJY3NkLT50YWNjID0gKGV4
cFtlXSAqIG1hbnRbbV0gKyA5KSAvIDEwOwogCQljc2QtPm5zYWMgPSBtbWNfZ2V0X2JpdHMocmF3
X2NzZCwgMTI4LCAxMDQsIDgpICogMTAwOwogCQltID0gbW1jX2dldF9iaXRzKHJhd19jc2QsIDEy
OCwgOTksIDQpOwogCQllID0gbW1jX2dldF9iaXRzKHJhd19jc2QsIDEyOCwgOTYsIDMpOwpAQCAt
MTAwMiw3ICsxMDE0LDcgQEAKIH0KIAogc3RhdGljIGludAotbW1jX3NlbmRfY3NkKHN0cnVjdCBt
bWNfc29mdGMgKnNjLCB1aW50MTZfdCByY2EsIHVpbnQzMl90ICpyYXdjaWQpCittbWNfc2VuZF9j
c2Qoc3RydWN0IG1tY19zb2Z0YyAqc2MsIHVpbnQxNl90IHJjYSwgdWludDMyX3QgKnJhd2NzZCkK
IHsKIAlzdHJ1Y3QgbW1jX2NvbW1hbmQgY21kOwogCWludCBlcnI7CkBAIC0xMDEyLDcgKzEwMjQs
NyBAQAogCWNtZC5mbGFncyA9IE1NQ19SU1BfUjIgfCBNTUNfQ01EX0JDUjsKIAljbWQuZGF0YSA9
IE5VTEw7CiAJZXJyID0gbW1jX3dhaXRfZm9yX2NtZChzYywgJmNtZCwgMCk7Ci0JbWVtY3B5KHJh
d2NpZCwgY21kLnJlc3AsIDQgKiBzaXplb2YodWludDMyX3QpKTsKKwltZW1jcHkocmF3Y3NkLCBj
bWQucmVzcCwgNCAqIHNpemVvZih1aW50MzJfdCkpOwogCXJldHVybiAoZXJyKTsKIH0KIApAQCAt
MTEyMSw2ICsxMTMzLDM2IEBACiAJcmV0dXJuIChlcnIpOwogfQogCitzdGF0aWMgaW50CittbWNf
c2VuZF9zdGF0dXMoc3RydWN0IG1tY19zb2Z0YyAqc2MsIHVpbnQxNl90IHJjYSwgdWludDMyX3Qg
KnN0YXR1cykKK3sKKwlzdHJ1Y3QgbW1jX2NvbW1hbmQgY21kOworCWludCBlcnI7CisKKwljbWQu
b3Bjb2RlID0gTU1DX1NFTkRfU1RBVFVTOworCWNtZC5hcmcgPSByY2EgPDwgMTY7CisJY21kLmZs
YWdzID0gTU1DX1JTUF9SMSB8IE1NQ19DTURfQUM7CisJY21kLmRhdGEgPSBOVUxMOworCWVyciA9
IG1tY193YWl0X2Zvcl9jbWQoc2MsICZjbWQsIDApOworCSpzdGF0dXMgPSBjbWQucmVzcFswXTsK
KwlyZXR1cm4gKGVycik7Cit9CisKK3N0YXRpYyBpbnQKK21tY19zZXRfYmxvY2tsZW4oc3RydWN0
IG1tY19zb2Z0YyAqc2MsIHVpbnQzMl90IGxlbikKK3sKKwlzdHJ1Y3QgbW1jX2NvbW1hbmQgY21k
OworCWludCBlcnI7CisKKwljbWQub3Bjb2RlID0gTU1DX1NFVF9CTE9DS0xFTjsKKwljbWQuYXJn
ID0gbGVuOworCWNtZC5mbGFncyA9IE1NQ19SU1BfUjEgfCBNTUNfQ01EX0FDOworCWNtZC5kYXRh
ID0gTlVMTDsKKwllcnIgPSBtbWNfd2FpdF9mb3JfY21kKHNjLCAmY21kLCAwKTsKKwlyZXR1cm4g
KGVycik7Cit9CisKKwogc3RhdGljIHZvaWQKIG1tY19sb2dfY2FyZChkZXZpY2VfdCBkZXYsIHN0
cnVjdCBtbWNfaXZhcnMgKml2YXIsIGludCBuZXdjYXJkKQogewpAQCAtMTE0NCw2ICsxMTg2LDcg
QEAKIAlzdHJ1Y3QgbW1jX2l2YXJzICppdmFyID0gTlVMTDsKIAlkZXZpY2VfdCAqZGV2bGlzdDsK
IAlpbnQgZXJyLCBpLCBkZXZjb3VudCwgbmV3Y2FyZDsKKwl1aW50MzJfdCBzdGF0dXM7CiAJdWlu
dDMyX3QgcmF3X2NpZFs0XTsKIAl1aW50MzJfdCByZXNwLCBzZWNfY291bnQ7CiAJZGV2aWNlX3Qg
Y2hpbGQ7CkBAIC0xMTk0LDYgKzEyMzcsMTEgQEAKIAkJCWl2YXItPnJjYSA9IHJlc3AgPj4gMTY7
CiAJCQkvKiBHZXQgY2FyZCBDU0QuICovCiAJCQltbWNfc2VuZF9jc2Qoc2MsIGl2YXItPnJjYSwg
aXZhci0+cmF3X2NzZCk7CisJCQlpZiAoYm9vdHZlcmJvc2UgfHwgbW1jX2RlYnVnKSB7CisJCQkJ
ZGV2aWNlX3ByaW50ZihzYy0+ZGV2LCAiJXNhcmQgZGV0ZWN0ZWQgKENTRCAlMDh4JTA4eCUwOHgl
MDh4KVxuIiwKKwkJCQkJICAgICAgbmV3Y2FyZCA/ICJOZXcgYyIgOiAiQyIsCisJCQkJCSAgICAg
IGl2YXItPnJhd19jc2RbMF0sIGl2YXItPnJhd19jc2RbMV0sIGl2YXItPnJhd19jc2RbMl0sIGl2
YXItPnJhd19jc2RbM10pOworCQkJfQogCQkJbW1jX2RlY29kZV9jc2Rfc2QoaXZhci0+cmF3X2Nz
ZCwgJml2YXItPmNzZCk7CiAJCQlpdmFyLT5zZWNfY291bnQgPSBpdmFyLT5jc2QuY2FwYWNpdHkg
LyBNTUNfU0VDVE9SX1NJWkU7CiAJCQlpZiAoaXZhci0+Y3NkLmNzZF9zdHJ1Y3R1cmUgPiAwKQpA
QCAtMTIwMSw2ICsxMjQ5LDE3IEBACiAJCQlpdmFyLT50cmFuX3NwZWVkID0gaXZhci0+Y3NkLnRy
YW5fc3BlZWQ7CiAJCQlpdmFyLT5lcmFzZV9zZWN0b3IgPSBpdmFyLT5jc2QuZXJhc2Vfc2VjdG9y
ICogCiAJCQkgICAgaXZhci0+Y3NkLndyaXRlX2JsX2xlbiAvIE1NQ19TRUNUT1JfU0laRTsKKwkJ
CQorCQkJZXJyID0gbW1jX3NlbmRfc3RhdHVzKHNjLCBpdmFyLT5yY2EsICZzdGF0dXMpOworCQkJ
aWYgKGVyciAhPSBNTUNfRVJSX05PTkUpIHsKKwkJCQlkZXZpY2VfcHJpbnRmKHNjLT5kZXYsICJF
cnJvciByZWFkaW5nIGNhcmQgc3RhdHVzICVkXG4iLCBlcnIpOworCQkJCWJyZWFrOworCQkJfQor
CQkJaWYgKHN0YXR1cyAmIFIxX0NBUkRfSVNfTE9DS0VEKSB7CisJCQkJZGV2aWNlX3ByaW50Zihz
Yy0+ZGV2LCAiQ2FyZCBpcyBwYXNzd29yZCBwcm90ZWN0ZWQsIHNraXBwaW5nLlxuIik7CisJCQkJ
YnJlYWs7CisJCQl9CisKIAkJCS8qIEdldCBjYXJkIFNDUi4gQ2FyZCBtdXN0IGJlIHNlbGVjdGVk
IHRvIGZldGNoIGl0LiAqLwogCQkJbW1jX3NlbGVjdF9jYXJkKHNjLCBpdmFyLT5yY2EpOwogCQkJ
bW1jX2FwcF9zZW5kX3NjcihzYywgaXZhci0+cmNhLCBpdmFyLT5yYXdfc2NyKTsKQEAgLTEyMjgs
NyArMTI4NywyMyBAQAogCQkJaWYgKChtbWNicl9nZXRfY2FwcyhzYy0+ZGV2KSAmIE1NQ19DQVBf
NF9CSVRfREFUQSkgJiYKIAkJCSAgICAoaXZhci0+c2NyLmJ1c193aWR0aHMgJiBTRF9TQ1JfQlVT
X1dJRFRIXzQpKQogCQkJCWl2YXItPmJ1c193aWR0aCA9IGJ1c193aWR0aF80OworCisJCQkvKiAK
KwkJCSAqIFNvbWUgY2FyZHMgdGhhdCByZXBvcnQgbWF4aW11bSBJL08gYmxvY2sgc2l6ZXMKKwkJ
CSAqIGdyZWF0ZXIgdGhhbiA1MTIgcmVxdWlyZSB0aGUgYmxvY2sgbGVuZ3RoIHRvIGJlCisJCQkg
KiBzZXQgdG8gNTEyLCBldmVuIHRob3VnaCB0aGF0IGlzIHN1cHBvc2VkIHRvIGJlCisJCQkgKiB0
aGUgZGVmYXVsdC4gIEV4YW1wbGVzOgorCQkJICoKKwkJCSAqIFRyYW5zY2VuZCAyR0IgU0RTQyBj
YXJkLCBjaWQ6CisJCQkgKiBtaWQ9MHgxYiBvaWQ9MHg1MzRkIHBubT0iMDAwMDAiIHBydj0xLjAg
bWR0PTAwLjIwMDAKKwkJCSAqLworCQkJaWYgKChNTUNfU0VDVE9SX1NJWkUgIT0gaXZhci0+Y3Nk
LnJlYWRfYmxfbGVuKSB8fAorCQkJICAgIChNTUNfU0VDVE9SX1NJWkUgIT0gaXZhci0+Y3NkLndy
aXRlX2JsX2xlbikpIHsKKwkJCQltbWNfc2V0X2Jsb2NrbGVuKHNjLCBNTUNfU0VDVE9SX1NJWkUp
OyAKKwkJCX0KKwogCQkJbW1jX2Zvcm1hdF9jYXJkX2lkX3N0cmluZyhpdmFyKTsKKwogCQkJaWYg
KGJvb3R2ZXJib3NlIHx8IG1tY19kZWJ1ZykKIAkJCQltbWNfbG9nX2NhcmQoc2MtPmRldiwgaXZh
ciwgbmV3Y2FyZCk7CiAJCQlpZiAobmV3Y2FyZCkgewpAQCAtMTI0MywxMSArMTMxOCwyOCBAQAog
CQltbWNfc2V0X3JlbGF0aXZlX2FkZHIoc2MsIGl2YXItPnJjYSk7CiAJCS8qIEdldCBjYXJkIENT
RC4gKi8KIAkJbW1jX3NlbmRfY3NkKHNjLCBpdmFyLT5yY2EsIGl2YXItPnJhd19jc2QpOworCQlp
ZiAoYm9vdHZlcmJvc2UgfHwgbW1jX2RlYnVnKSB7CisJCQlkZXZpY2VfcHJpbnRmKHNjLT5kZXYs
ICIlc2FyZCBkZXRlY3RlZCAoQ1NEICUwOHglMDh4JTA4eCUwOHgpXG4iLAorCQkJICAgIG5ld2Nh
cmQgPyAiTmV3IGMiIDogIkMiLAorCQkJICAgIGl2YXItPnJhd19jc2RbMF0sIGl2YXItPnJhd19j
c2RbMV0sIGl2YXItPnJhd19jc2RbMl0sIGl2YXItPnJhd19jc2RbM10pOworCQl9CisKIAkJbW1j
X2RlY29kZV9jc2RfbW1jKGl2YXItPnJhd19jc2QsICZpdmFyLT5jc2QpOwogCQlpdmFyLT5zZWNf
Y291bnQgPSBpdmFyLT5jc2QuY2FwYWNpdHkgLyBNTUNfU0VDVE9SX1NJWkU7CiAJCWl2YXItPnRy
YW5fc3BlZWQgPSBpdmFyLT5jc2QudHJhbl9zcGVlZDsKIAkJaXZhci0+ZXJhc2Vfc2VjdG9yID0g
aXZhci0+Y3NkLmVyYXNlX3NlY3RvciAqIAogCQkgICAgaXZhci0+Y3NkLndyaXRlX2JsX2xlbiAv
IE1NQ19TRUNUT1JfU0laRTsKKworCQllcnIgPSBtbWNfc2VuZF9zdGF0dXMoc2MsIGl2YXItPnJj
YSwgJnN0YXR1cyk7CisJCWlmIChlcnIgIT0gTU1DX0VSUl9OT05FKSB7CisJCQlkZXZpY2VfcHJp
bnRmKHNjLT5kZXYsICJFcnJvciByZWFkaW5nIGNhcmQgc3RhdHVzICVkXG4iLCBlcnIpOworCQkJ
YnJlYWs7CisJCX0KKwkJaWYgKHN0YXR1cyAmIFIxX0NBUkRfSVNfTE9DS0VEKSB7CisJCQlkZXZp
Y2VfcHJpbnRmKHNjLT5kZXYsICJDYXJkIGlzIHBhc3N3b3JkIHByb3RlY3RlZCwgc2tpcHBpbmcu
XG4iKTsKKwkJCWJyZWFrOworCQl9CisKIAkJLyogT25seSBNTUMgPj0gNC54IGNhcmRzIHN1cHBv
cnQgRVhUX0NTRC4gKi8KIAkJaWYgKGl2YXItPmNzZC5zcGVjX3ZlcnMgPj0gNCkgewogCQkJLyog
Q2FyZCBtdXN0IGJlIHNlbGVjdGVkIHRvIGZldGNoIEVYVF9DU0QuICovCkBAIC0xMjg2LDcgKzEz
NzgsMjIgQEAKIAkJCWl2YXItPmJ1c193aWR0aCA9IGJ1c193aWR0aF8xOwogCQkJaXZhci0+dGlt
aW5nID0gYnVzX3RpbWluZ19ub3JtYWw7CiAJCX0KKworCQkvKgorCQkgKiBTb21lIGNhcmRzIHRo
YXQgcmVwb3J0IG1heGltdW0gSS9PIGJsb2NrIHNpemVzIGdyZWF0ZXIKKwkJICogdGhhbiA1MTIg
cmVxdWlyZSB0aGUgYmxvY2sgbGVuZ3RoIHRvIGJlIHNldCB0byA1MTIsIGV2ZW4KKwkJICogdGhv
dWdoIHRoYXQgaXMgc3VwcG9zZWQgdG8gYmUgdGhlIGRlZmF1bHQuICBFeGFtcGxlczoKKwkJICoK
KwkJICogVHJhbnNjZW5kIDJHQiBTRFNDIGNhcmQsIGNpZDoKKwkJICogbWlkPTB4MWIgb2lkPTB4
NTM0ZCBwbm09IjAwMDAwIiBwcnY9MS4wIG1kdD0wMC4yMDAwCisJCSAqLworCQlpZiAoKE1NQ19T
RUNUT1JfU0laRSAhPSBpdmFyLT5jc2QucmVhZF9ibF9sZW4pIHx8CisJCSAgICAoTU1DX1NFQ1RP
Ul9TSVpFICE9IGl2YXItPmNzZC53cml0ZV9ibF9sZW4pKSB7CisJCQltbWNfc2V0X2Jsb2NrbGVu
KHNjLCBNTUNfU0VDVE9SX1NJWkUpOyAKKwkJfQorCiAJCW1tY19mb3JtYXRfY2FyZF9pZF9zdHJp
bmcoaXZhcik7CisKIAkJaWYgKGJvb3R2ZXJib3NlIHx8IG1tY19kZWJ1ZykKIAkJCW1tY19sb2df
Y2FyZChzYy0+ZGV2LCBpdmFyLCBuZXdjYXJkKTsKIAkJaWYgKG5ld2NhcmQpIHsKQEAgLTEzNjIs
NyArMTQ2OSw3IEBACiAJCWVyciA9IG1tY19zZW5kX2lmX2NvbmQoc2MsIDEpOwogCQlpZiAoKGJv
b3R2ZXJib3NlIHx8IG1tY19kZWJ1ZykgJiYgZXJyID09IDApCiAJCQlkZXZpY2VfcHJpbnRmKHNj
LT5kZXYsICJTRCAyLjAgaW50ZXJmYWNlIGNvbmRpdGlvbnM6IE9LXG4iKTsKLQkJaWYgKG1tY19z
ZW5kX2FwcF9vcF9jb25kKHNjLCBlcnIgPyAwIDogTU1DX09DUl9DQ1MsICZvY3IpICE9CisJCWlm
IChtbWNfc2VuZF9hcHBfb3BfY29uZChzYywgMCwgJm9jcikgIT0KIAkJICAgIE1NQ19FUlJfTk9O
RSkgewogCQkJaWYgKGJvb3R2ZXJib3NlIHx8IG1tY19kZWJ1ZykKIAkJCQlkZXZpY2VfcHJpbnRm
KHNjLT5kZXYsICJTRCBwcm9iZTogZmFpbGVkXG4iKTsKQEAgLTE1ODQsMyArMTY5MSw0IEBACiAK
IERSSVZFUl9NT0RVTEUobW1jLCBhdDkxX21jaSwgbW1jX2RyaXZlciwgbW1jX2RldmNsYXNzLCBO
VUxMLCBOVUxMKTsKIERSSVZFUl9NT0RVTEUobW1jLCBzZGhjaSwgbW1jX2RyaXZlciwgbW1jX2Rl
dmNsYXNzLCBOVUxMLCBOVUxMKTsKK0RSSVZFUl9NT0RVTEUobW1jLCBtbWNzcGksIG1tY19kcml2
ZXIsIG1tY19kZXZjbGFzcywgTlVMTCwgTlVMTCk7CkluZGV4OiBzeXMvZGV2L3NkaGNpL3NkaGNp
LmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gc3lzL2Rldi9zZGhjaS9zZGhjaS5jCShyZXZpc2lvbiAyMzQ5OTkp
CisrKyBzeXMvZGV2L3NkaGNpL3NkaGNpLmMJKHdvcmtpbmcgY29weSkKQEAgLTE0NjcsNiArMTQ2
Nyw5IEBACiAJc3dpdGNoICh3aGljaCkgewogCWRlZmF1bHQ6CiAJCXJldHVybiAoRUlOVkFMKTsK
KwljYXNlIE1NQ0JSX0lWQVJfQlVTX1RZUEU6CisJCSpyZXN1bHQgPSBidXNfdHlwZV9zZDsKKwkJ
YnJlYWs7CiAJY2FzZSBNTUNCUl9JVkFSX0JVU19NT0RFOgogCQkqcmVzdWx0ID0gc2xvdC0+aG9z
dC5pb3MuYnVzX21vZGU7CiAJCWJyZWFrOwpAQCAtMTU1OSw2ICsxNTYyLDcgQEAKIAljYXNlIE1N
Q0JSX0lWQVJfVElNSU5HOgogCQlzbG90LT5ob3N0Lmlvcy50aW1pbmcgPSB2YWx1ZTsKIAkJYnJl
YWs7CisJY2FzZSBNTUNCUl9JVkFSX0JVU19UWVBFOgogCWNhc2UgTU1DQlJfSVZBUl9DQVBTOgog
CWNhc2UgTU1DQlJfSVZBUl9IT1NUX09DUjoKIAljYXNlIE1NQ0JSX0lWQVJfRl9NSU46CkluZGV4
OiBzeXMvZGV2L3NwaWJ1cy9zcGkuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBzeXMvZGV2L3NwaWJ1cy9zcGku
aAkocmV2aXNpb24gMjM0OTk5KQorKysgc3lzL2Rldi9zcGlidXMvc3BpLmgJKHdvcmtpbmcgY29w
eSkKQEAgLTEsNSArMSw5IEBACiAvKiAkRnJlZUJTRCQgKi8KIAorI2RlZmluZQlTUElfU0tJUF9D
SElQX1NFTEVDVAkJMHgwMDAxIC8qIGJ1cyBpcyBhbHJlYWR5IGFjcXVpcmVkICovCisjZGVmaW5l
CVNQSV9DSElQX1NFTEVDVF9ISUdICQkweDAwMDIgLyogc2V0IGNoaXAgc2VsZWN0IGhpZ2ggZm9y
CisJCQkJCQkgIGR1cmF0aW9uIG9mIHRyYW5zZmVyICovCisKIHN0cnVjdCBzcGlfY29tbWFuZCB7
CiAJdm9pZAkqdHhfY21kOwogCXVpbnQzMl90IHR4X2NtZF9zejsKQEAgLTksNCArMTMsMTEgQEAK
IAl1aW50MzJfdCB0eF9kYXRhX3N6OwogCXZvaWQJKnJ4X2RhdGE7CiAJdWludDMyX3QgcnhfZGF0
YV9zejsKKwl1aW50MTZfdCBmbGFnczsKIH07CisKK3N0cnVjdCBzcGlfY29uZmlnIHsKKwl1bnNp
Z25lZCBpbnQgY2xvY2tfaHo7ICAvKiBzZW5kaW5nIGEgMCB0byBzcGlidXNfc2V0X2NvbmZpZwor
CQkJCSAgIHJlcXVlc3RzIHRoZSBtYXhpbXVtIHBvc3NpYmxlCisJCQkJICAgZnJlcXVlbmN5ICov
Cit9OwpJbmRleDogc3lzL2Rldi9zcGlidXMvc3BpYnVzLmMKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gc3lzL2Rl
di9zcGlidXMvc3BpYnVzLmMJKHJldmlzaW9uIDIzNDk5OSkKKysrIHN5cy9kZXYvc3BpYnVzL3Nw
aWJ1cy5jCSh3b3JraW5nIGNvcHkpCkBAIC0yMiw2ICsyMiw3IEBACiBzdGF0aWMgaW50CiBzcGli
dXNfcHJvYmUoZGV2aWNlX3QgZGV2KQogeworCiAJZGV2aWNlX3NldF9kZXNjKGRldiwgInNwaWJ1
cyBidXMiKTsKIAlyZXR1cm4gKDApOwogfQpAQCAtNjAsNiArNjEsNyBAQAogc3RhdGljIGludAog
c3BpYnVzX3N1c3BlbmQoZGV2aWNlX3QgZGV2KQogeworCiAJcmV0dXJuIChidXNfZ2VuZXJpY19z
dXNwZW5kKGRldikpOwogfQogCkBAIC02Nyw2ICs2OSw3IEBACiBpbnQKIHNwaWJ1c19yZXN1bWUo
ZGV2aWNlX3QgZGV2KQogeworCiAJcmV0dXJuIChidXNfZ2VuZXJpY19yZXN1bWUoZGV2KSk7CiB9
CiAKQEAgLTEwNyw2ICsxMTAsNyBAQAogc3BpYnVzX2NoaWxkX3BucGluZm9fc3RyKGRldmljZV90
IGJ1cywgZGV2aWNlX3QgY2hpbGQsIGNoYXIgKmJ1ZiwKICAgICBzaXplX3QgYnVmbGVuKQogewor
CiAJKmJ1ZiA9ICdcMCc7CiAJcmV0dXJuICgwKTsKIH0KQEAgLTE1NSwxMiArMTU5LDQ4IEBACiAJ
cmVzb3VyY2VfaW50X3ZhbHVlKGRuYW1lLCBkdW5pdCwgImNzIiwgJmRldmktPmNzKTsKIH0KIAor
c3RhdGljIHZvaWQKK3NwaWJ1c19hY3F1aXJlX2J1c19pbXBsKGRldmljZV90IGRldiwgZGV2aWNl
X3QgY2hpbGQpCit7CisKKwlTUElCVVNfQUNRVUlSRV9CVVMoZGV2aWNlX2dldF9wYXJlbnQoZGV2
KSwgY2hpbGQpOworfQorCitzdGF0aWMgdm9pZAorc3BpYnVzX3JlbGVhc2VfYnVzX2ltcGwoZGV2
aWNlX3QgZGV2LCBkZXZpY2VfdCBjaGlsZCkKK3sKKworCVNQSUJVU19SRUxFQVNFX0JVUyhkZXZp
Y2VfZ2V0X3BhcmVudChkZXYpLCBjaGlsZCk7Cit9CisKIHN0YXRpYyBpbnQKIHNwaWJ1c190cmFu
c2Zlcl9pbXBsKGRldmljZV90IGRldiwgZGV2aWNlX3QgY2hpbGQsIHN0cnVjdCBzcGlfY29tbWFu
ZCAqY21kKQogeworCiAJcmV0dXJuIChTUElCVVNfVFJBTlNGRVIoZGV2aWNlX2dldF9wYXJlbnQo
ZGV2KSwgY2hpbGQsIGNtZCkpOwogfQogCitzdGF0aWMgaW50CitzcGlidXNfd3JpdGVfaW1wbChk
ZXZpY2VfdCBkZXYsIHVpbnQzMl90IHJlZywgdWludDMyX3QgZGF0YSkKK3sKKworCXJldHVybiAo
U1BJQlVTX1dSSVRFKGRldmljZV9nZXRfcGFyZW50KGRldiksIHJlZywgZGF0YSkpOworfQorCitz
dGF0aWMgaW50CitzcGlidXNfZ2V0X2NvbmZpZ19pbXBsKGRldmljZV90IGRldiwgc3RydWN0IHNw
aV9jb25maWcgKmNmZykKK3sKKworCXJldHVybiAoU1BJQlVTX0dFVF9DT05GSUcoZGV2aWNlX2dl
dF9wYXJlbnQoZGV2KSwgY2ZnKSk7Cit9CisKK3N0YXRpYyBpbnQKK3NwaWJ1c19zZXRfY29uZmln
X2ltcGwoZGV2aWNlX3QgZGV2LCBzdHJ1Y3Qgc3BpX2NvbmZpZyAqY2ZnKQoreworCisJcmV0dXJu
IChTUElCVVNfU0VUX0NPTkZJRyhkZXZpY2VfZ2V0X3BhcmVudChkZXYpLCBjZmcpKTsKK30KKwog
c3RhdGljIGRldmljZV9tZXRob2RfdCBzcGlidXNfbWV0aG9kc1tdID0gewogCS8qIERldmljZSBp
bnRlcmZhY2UgKi8KIAlERVZNRVRIT0QoZGV2aWNlX3Byb2JlLAkJc3BpYnVzX3Byb2JlKSwKQEAg
LTE4MCw3ICsyMjAsMTIgQEAKIAlERVZNRVRIT0QoYnVzX2hpbnRlZF9jaGlsZCwJc3BpYnVzX2hp
bnRlZF9jaGlsZCksCiAKIAkvKiBzcGlidXMgaW50ZXJmYWNlICovCisJREVWTUVUSE9EKHNwaWJ1
c19hY3F1aXJlX2J1cywJc3BpYnVzX2FjcXVpcmVfYnVzX2ltcGwpLAorCURFVk1FVEhPRChzcGli
dXNfcmVsZWFzZV9idXMsCXNwaWJ1c19yZWxlYXNlX2J1c19pbXBsKSwKIAlERVZNRVRIT0Qoc3Bp
YnVzX3RyYW5zZmVyLAlzcGlidXNfdHJhbnNmZXJfaW1wbCksCisJREVWTUVUSE9EKHNwaWJ1c193
cml0ZSwJCXNwaWJ1c193cml0ZV9pbXBsKSwKKwlERVZNRVRIT0Qoc3BpYnVzX2dldF9jb25maWcs
CXNwaWJ1c19nZXRfY29uZmlnX2ltcGwpLAorCURFVk1FVEhPRChzcGlidXNfc2V0X2NvbmZpZywJ
c3BpYnVzX3NldF9jb25maWdfaW1wbCksCiAKIAlERVZNRVRIT0RfRU5ECiB9OwpJbmRleDogc3lz
L2Rldi9zcGlidXMvc3BpYnVzX2lmLm0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gc3lzL2Rldi9zcGlidXMvc3Bp
YnVzX2lmLm0JKHJldmlzaW9uIDIzNDk5OSkKKysrIHN5cy9kZXYvc3BpYnVzL3NwaWJ1c19pZi5t
CSh3b3JraW5nIGNvcHkpCkBAIC0zMiw2ICszMiwyMiBAQAogSU5URVJGQUNFIHNwaWJ1czsKIAog
IworIyBBY3F1aXJlIGJ1cyBhbmQgc2VsZWN0IHRoZSBkZXZpY2UKKyMKK01FVEhPRCB2b2lkIGFj
cXVpcmVfYnVzIHsKKwlkZXZpY2VfdCBkZXY7CisJZGV2aWNlX3QgY2hpbGQ7Cit9OworCisjCisj
IFJlbGVhc2UgYnVzIGFuZCBkZXNlbGVjdCB0aGUgZGV2aWNlCisjCitNRVRIT0Qgdm9pZCByZWxl
YXNlX2J1cyB7CisJZGV2aWNlX3QgZGV2OworCWRldmljZV90IGNoaWxkOworfTsKKworIwogIyBE
byBhIHNwaSBjb21tYW5kCiAjCiBNRVRIT0QgaW50IHRyYW5zZmVyIHsKQEAgLTM5LDMgKzU1LDI4
IEBACiAJZGV2aWNlX3QgY2hpbGQ7CiAJc3RydWN0IHNwaV9jb21tYW5kICpjbWQ7CiB9OworCisj
CisjIFdyaXRlIGEgY29tbWFuZCB0byBzcGlidXMKKyMKK01FVEhPRCBpbnQgd3JpdGUgeworCWRl
dmljZV90IGRldjsKKwl1aW50MzJfdCByZWc7CisJdWludDMyX3QgZGF0YTsKK307CisKKyMKKyMg
R2V0IHNwaWJ1cyBjb25maWd1cmF0aW9uCisjCitNRVRIT0QgaW50IGdldF9jb25maWcgeworCWRl
dmljZV90IGRldjsKKwlzdHJ1Y3Qgc3BpX2NvbmZpZyAqY2ZnOworfTsKKworIworIyBTZXQgc3Bp
YnVzIGNvbmZpZ3VyYXRpb24KKyMKK01FVEhPRCBpbnQgc2V0X2NvbmZpZyB7CisJZGV2aWNlX3Qg
ZGV2OworCXN0cnVjdCBzcGlfY29uZmlnICpjZmc7Cit9Owo=
--0023544706e0e22de504bf385516
Content-Type: application/octet-stream; name="ar71xx_spi_r234999.diff"
Content-Disposition: attachment; filename="ar71xx_spi_r234999.diff"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_h1tgbi423

SW5kZXg6IHN5cy9taXBzL2F0aGVyb3MvYXI3MXh4X3NwaS5jCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHN5cy9t
aXBzL2F0aGVyb3MvYXI3MXh4X3NwaS5jCShyZXZpc2lvbiAyMzQ5OTkpCisrKyBzeXMvbWlwcy9h
dGhlcm9zL2FyNzF4eF9zcGkuYwkod29ya2luZyBjb3B5KQpAQCAtMzUsNyArMzUsOSBAQAogI2lu
Y2x1ZGUgPHN5cy9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxzeXMvbWFsbG9jLmg+CiAjaW5jbHVk
ZSA8c3lzL2tlcm5lbC5oPgorI2luY2x1ZGUgPHN5cy9sb2NrLmg+CiAjaW5jbHVkZSA8c3lzL21v
ZHVsZS5oPgorI2luY2x1ZGUgPHN5cy9tdXRleC5oPgogI2luY2x1ZGUgPHN5cy9ybWFuLmg+CiAK
ICNpbmNsdWRlIDx2bS92bS5oPgpAQCAtNTEsNiArNTMsNyBAQAogI2luY2x1ZGUgInNwaWJ1c19p
Zi5oIgogCiAjaW5jbHVkZSA8bWlwcy9hdGhlcm9zL2FyNzF4eHJlZy5oPgorI2luY2x1ZGUgPG1p
cHMvYXRoZXJvcy9hcjcxeHhfY3B1ZGVmLmg+CiAKICN1bmRlZiBBUjcxWFhfU1BJX0RFQlVHCiAj
aWZkZWYgQVI3MVhYX1NQSV9ERUJVRwpAQCAtNTksNiArNjIsNyBAQAogI2RlZmluZSBkcHJpbnRm
KHgsIGFyZy4uLikKICNlbmRpZgogCisKIC8qCiAgKiByZWdpc3RlciBzcGFjZSBhY2Nlc3MgbWFj
cm9zCiAgKi8KQEAgLTc2LDE4ICs4MCwxMjUgQEAKIAogc3RydWN0IGFyNzF4eF9zcGlfc29mdGMg
ewogCWRldmljZV90CQlzY19kZXY7CisJZGV2aWNlX3QJCXNjX293bmVyOworCXN0cnVjdCBtdHgJ
CXNjX210eDsKIAlzdHJ1Y3QgcmVzb3VyY2UJCSpzY19tZW1fcmVzOwogCXVpbnQzMl90CQlzY19y
ZWdfY3RybDsKKwlzdHJ1Y3Qgc3BpX2NvbmZpZwlzY19jb25maWc7CisJaW50CQkJc2NfcHJlX2Rl
bGF5OworCWludAkJCXNjX3Bvc3RfZGVsYXk7CiB9OwogCisjZGVmaW5lCUFSNzFYWF9TUElfTE9D
Syhfc2MpIG10eF9sb2NrKCYoX3NjKS0+c2NfbXR4KQorI2RlZmluZQlBUjcxWFhfU1BJX1VOTE9D
Syhfc2MpIG10eF91bmxvY2soJihfc2MpLT5zY19tdHgpCisjZGVmaW5lCUFSNzFYWF9TUElfTE9D
S19JTklUKF9zYykgXAorCW10eF9pbml0KCZfc2MtPnNjX210eCwgZGV2aWNlX2dldF9uYW1ldW5p
dChfc2MtPnNjX2RldiksIFwKKwkgICAgImFyNzF4eF9zcGkiLCBNVFhfREVGKQorI2RlZmluZQlB
UjcxWFhfU1BJX0xPQ0tfREVTVFJPWShfc2MpIG10eF9kZXN0cm95KCZfc2MtPnNjX210eCk7Cisj
ZGVmaW5lCUFSNzFYWF9TUElfQVNTRVJUX0xPQ0tFRChfc2MpIG10eF9hc3NlcnQoJl9zYy0+c2Nf
bXR4LCBNQV9PV05FRCk7CisjZGVmaW5lCUFSNzFYWF9TUElfQVNTRVJUX1VOTE9DS0VEKF9zYykg
bXR4X2Fzc2VydCgmX3NjLT5zY19tdHgsIE1BX05PVE9XTkVEKTsKKwogc3RhdGljIGludAogYXI3
MXh4X3NwaV9wcm9iZShkZXZpY2VfdCBkZXYpCiB7CisKIAlkZXZpY2Vfc2V0X2Rlc2MoZGV2LCAi
QVI3MVhYIFNQSSIpOwogCXJldHVybiAoMCk7CiB9CiAKKworLyogCisgKiBDb25maWd1cmUgdGhl
IGhhcmR3YXJlIGNsb2NrIHRvIGFjaGlldmUgdGhlIHJlcXVlc3RlZCBmcmVxdWVuY3kgd2l0aG91
dAorICogZ29pbmcgb3Zlci4gIElmIHRoZSByZXF1ZXN0ZWQgZnJlcXVlbmN5IGlzIGxlc3MgdGhh
biB0aGUgbWluaW11bSBwb3NzaWJsZQorICogaGFyZHdhcmUgZnJlcXVlbmN5LCBzb2Z0d2FyZSBk
ZWxheXMgd2lsbCBiZSB1c2VkIHRvIG1lZXQgdGhlIHRhcmdldC4KKyAqLwogc3RhdGljIGludAor
YXI3MXh4X3NwaV9zZXRfY2xvY2soc3RydWN0IGFyNzF4eF9zcGlfc29mdGMgKnNjLCB1bnNpZ25l
ZCBpbnQgaHopCit7CisJdW5zaWduZWQgaW50IGRpdjsKKwl1bnNpZ25lZCBpbnQgYWN0dWFsX2Rp
dmlzb3I7CisJdW5zaWduZWQgaW50IGFjdHVhbF9oejsKKwl1bnNpZ25lZCBpbnQgYWRkbF9wZXJp
b2RfdXM7CisJdWludDY0X3QgdGVtcDY0OworCisJaWYgKDAgPT0gaHopIHsKKwkJLyogbWF4aW11
bSBmcmVxdWVuY3kgcG9zc2libGUgKi8KKwkJZGl2ID0gMDsKKwl9IGVsc2UgeworCQkvKiAKKwkJ
ICogRmlndXJlIHRoZSBkaXZpZGVyIHZhbHVlIHRoYXQgd291bGQgYWNoaWV2ZSB0aGUgY2xvc2Vz
dAorCQkgKiBmcmVxdWVuY3kgdG8gdGhhdCByZXF1ZXN0ZWQgd2l0aG91dCBnb2luZyBvdmVyLgor
CQkgKi8KKwkJZGl2ID0gKGFyNzF4eF9haGJfZnJlcSgpIC0gMSkgLyAoMiAqIGh6KTsKKwl9CisK
KwkKKwkvKiBBdm9pZCBjaGlwIGJ1ZyBhdCAwID09IGRpdiAqLworCWlmICgwID09IGRpdikgewor
CQlkaXYgPSAxOworCX0KKworCWlmIChkaXYgPiBTUElfQ1RSTF9DTE9DS19ESVZJREVSX01BWCkg
eworCQlkaXYgPSBTUElfQ1RSTF9DTE9DS19ESVZJREVSX01BWDsKKwl9CisKKwlhY3R1YWxfZGl2
aXNvciA9IDIgKiAoZGl2ICsgMSk7CisKKwkvKiBXaGF0IHRoZSBoYXJkd2FyZSB3aWxsIGdlbmVy
YXRlLCByb3VuZGVkIHVwLiAqLworCWFjdHVhbF9oeiA9IChhcjcxeHhfYWhiX2ZyZXEoKSArIGFj
dHVhbF9kaXZpc29yIC0gMSkgLyBhY3R1YWxfZGl2aXNvcjsKKwkKKwlpZiAoMCA9PSBoeikgewor
CQloeiA9IGFjdHVhbF9oejsKKwl9CisKKwkvKiAKKwkgKiBBdCByZXF1ZXN0ZWQgY2xvY2sgcmF0
ZXMgYmVsb3cgdGhlIGhhcmR3YXJlIG1pbmltdW0sIGZpZ3VyZSBvdXQKKwkgKiB3aGF0IGRlbGF5
cyBuZWVkIHRvIGJlIGluc2VydGVkIHdoZW4gZmVlZGluZyBiaXRzIHRvIHRoZSBoYXJkd2FyZQor
CSAqIGluIG9yZGVyIHRvIHN0YXkgdW5kZXIgdGhlIHRhcmdldC4KKwkgKi8KKwlpZiAoYWN0dWFs
X2h6ID4gaHopIHsKKworCQkvKiAKKwkJICogQ29tcHV0ZSB0aGUgYWRkaXRpb25hbCBudW1iZXIg
b2YgbWljcm9zZWNvbmRzIHdlIG5lZWQgaW4KKwkJICogdGhlIGNsb2NrIHBlcmlvZC4gIEluIHRo
ZSBzcGlyaXQgb2Ygbm90IGV4Y2VlZGluZyB0aGUKKwkJICogdGFyZ2V0IGZyZXF1ZW5jeSwgcm91
bmQgd2hhdCB3ZSBuZWVkIHVwLCByb3VuZCB3aGF0IHRoZQorCQkgKiBoYXJkd2FyZSBnaXZlcyB1
cyBkb3duLgorCQkgKi8KKwkJYWRkbF9wZXJpb2RfdXMgPSAoMTAwMDAwMCArIGh6IC0gMSkgLyBo
eiArIDEwMDAwMDAgLyBhY3R1YWxfaHo7CisKKwkJc2MtPnNjX3ByZV9kZWxheSA9IGFkZGxfcGVy
aW9kX3VzIC8gMjsKKwkJc2MtPnNjX3Bvc3RfZGVsYXkgPSBhZGRsX3BlcmlvZF91cyAtIHNjLT5z
Y19wcmVfZGVsYXk7CisKKwkJLyogCisJCSAqIEEgaGlnaCByZXNvbHV0aW9uLCByb3VuZGVkIHVw
IGludmVyc2lvbiBvZiBzdW0gb2YKKwkJICogaGFyZHdhcmUgYW5kIHNvZnR3YXJlIHBlcmlvZCBj
b21wb25lbnRzLCBzbyBvbmUgY2FuIGJlCisJCSAqIGNvbmZpZGVudCBhIHJlcXVlc3RlZCBoYXJk
d2FyZSBtYXhpbXVtIGNsb2NrIHJhdGUgaXMgbm90CisJCSAqIGJlaW5nIGV4Y2VlZGVkLgorCQkg
Ki8KKwkJdGVtcDY0ID0gMTAwMDAwMHVsbCAqIGFjdHVhbF9kaXZpc29yICArIAorCQkgICAgKHVp
bnQ2NF90KWFkZGxfcGVyaW9kX3VzICogKHVpbnQ2NF90KWFyNzF4eF9haGJfZnJlcSgpOworCisJ
CXNjLT5zY19jb25maWcuY2xvY2tfaHogPSAKKwkJICAgICgxMDAwMDAwdWxsICogKHVpbnQ2NF90
KWFyNzF4eF9haGJfZnJlcSgpICsgdGVtcDY0IC0gMSkgLworCQkgICAgdGVtcDY0OworCX0gZWxz
ZSB7CisJCXNjLT5zY19wcmVfZGVsYXkgPSAwOworCQlzYy0+c2NfcG9zdF9kZWxheSA9IDA7CisJ
CXNjLT5zY19jb25maWcuY2xvY2tfaHogPSBhcjcxeHhfYWhiX2ZyZXEoKSAvIGFjdHVhbF9kaXZp
c29yOworCX0KKworI2lmIDAKKwlkZXZpY2VfcHJpbnRmKHNjLT5zY19kZXYsICJSZXF1ZXN0ZWQg
aHo9JXUgcmVnPTB4JTAyeCBwcmU9JXUgcG9zdD0ldVxuIiwKKwkJICAgICAgaHosIGRpdiwKKwkJ
ICAgICAgc2MtPnNjX3ByZV9kZWxheSwgc2MtPnNjX3Bvc3RfZGVsYXkpOworI2VuZGlmCisKKwlT
UElfV1JJVEUoc2MsIEFSNzFYWF9TUElfQ1RSTCwgU1BJX0NUUkxfUkVNQVBfRElTQUJMRSB8IGRp
dik7CQorCisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludAogYXI3MXh4X3NwaV9hdHRhY2go
ZGV2aWNlX3QgZGV2KQogewogCXN0cnVjdCBhcjcxeHhfc3BpX3NvZnRjICpzYyA9IGRldmljZV9n
ZXRfc29mdGMoZGV2KTsKQEAgLTEwMiwxMiArMjEzLDIwIEBACiAJCXJldHVybiAoRU5YSU8pOwog
CX0KIAorCUFSNzFYWF9TUElfTE9DS19JTklUKHNjKTsKIAogCVNQSV9XUklURShzYywgQVI3MVhY
X1NQSV9GUywgMSk7Ci0Jc2MtPnNjX3JlZ19jdHJsICA9IFNQSV9SRUFEKHNjLCBBUjcxWFhfU1BJ
X0NUUkwpOwotCVNQSV9XUklURShzYywgQVI3MVhYX1NQSV9DVFJMLCAweDQzKTsKLQlTUElfV1JJ
VEUoc2MsIEFSNzFYWF9TUElfSU9fQ1RSTCwgU1BJX0lPX0NUUkxfQ1NNQVNLKTsKKwlzYy0+c2Nf
cmVnX2N0cmwgPSBTUElfUkVBRChzYywgQVI3MVhYX1NQSV9DVFJMKTsKKwkKKwkvKgorCSAqIFRo
ZSBmb2xsb3dpbmcgaXMgZXF1aXZhbGVudCB0byBBUjcxWFhfU1BJX0NUUkwgPSAweDQzLCB3aGlj
aCBoYXMKKwkgKiBiZWVuIHRoZSBoaXN0b3JpY2FsIGRlZmF1bHQuCisJICovCisJYXI3MXh4X3Nw
aV9zZXRfY2xvY2soc2MsIChhcjcxeHhfYWhiX2ZyZXEoKSAtIDEpIC8gNik7CiAKKwlTUElfV1JJ
VEUoc2MsIEFSNzFYWF9TUElfSU9fQ1RSTCwgU1BJX0lPX0NUUkxfQ1MoMCkpOworCisJZGV2aWNl
X3ByaW50ZihkZXYsICJhdHRhY2hpbmcgYXQgc3BpYnVzMFxuIik7CiAJZGV2aWNlX2FkZF9jaGls
ZChkZXYsICJzcGlidXMiLCAwKTsKIAlyZXR1cm4gKGJ1c19nZW5lcmljX2F0dGFjaChkZXYpKTsK
IH0KQEAgLTExNSw0OSArMjM0LDk3IEBACiBzdGF0aWMgdm9pZAogYXI3MXh4X3NwaV9jaGlwX2Fj
dGl2YXRlKHN0cnVjdCBhcjcxeHhfc3BpX3NvZnRjICpzYywgaW50IGNzKQogewotCXVpbnQzMl90
IGlvY3RybCA9IFNQSV9JT19DVFJMX0NTTUFTSzsKKwogCS8qCi0JICogUHV0IHJlc3BlY3RpdmUg
Q1N4IHRvIGxvdworCSAqIEFjdGl2YXRlIHRoZSByZXNwZWN0aXZlIGRldmljZSAod2UgaGF2ZSB0
aHJlZSBDUyBwaW5zIGFsbG93aW5nCisJICogNyBtdXhlZCBkZXZpY2VzIG9uIGJ1cykuCisJICog
QXQgYW55IGdpdmVuIG1vbWVudCBvbmx5IG9uZSBkZXZpY2Ugc2hvdWxkIGJlIHNlbGVjdGVkIG9u
IGJ1cy4gCisJICogaWYgY3MgaXMgc2V0IHRvIDAgaXQgd2lsbCBiZSB0aGUgc2FtZSBhcyBTUElf
SU9fQ1RSTF9DU01BU0sKKwkgKiAoMHg3IC0gYWxsIHBpbnMgaGlnaCAtIG5vIGRldmljZSBzZWxl
Y3RlZCkuCiAJICovCi0JaW9jdHJsICY9IH4oU1BJX0lPX0NUUkxfQ1MwIDw8IGNzKTsKLQotCVNQ
SV9XUklURShzYywgQVI3MVhYX1NQSV9JT19DVFJMLCBpb2N0cmwpOworCVNQSV9XUklURShzYywg
QVI3MVhYX1NQSV9JT19DVFJMLCBTUElfSU9fQ1RSTF9DUyhjcykpOwogfQogCiBzdGF0aWMgdm9p
ZAogYXI3MXh4X3NwaV9jaGlwX2RlYWN0aXZhdGUoc3RydWN0IGFyNzF4eF9zcGlfc29mdGMgKnNj
LCBpbnQgY3MpCiB7CisKIAkvKgotCSAqIFB1dCBhbGwgQ1N4IHRvIGhpZ2gKKwkgKiBEZWFjdGl2
YXRlIGFsbCBkZXZpY2VzLCBwdXQgYWxsIENTeCB0byBoaWdoCiAJICovCi0JU1BJX1dSSVRFKHNj
LCBBUjcxWFhfU1BJX0lPX0NUUkwsIFNQSV9JT19DVFJMX0NTTUFTSyk7CisJU1BJX1dSSVRFKHNj
LCBBUjcxWFhfU1BJX0lPX0NUUkwsIFNQSV9JT19DVFJMX0NTKDApKTsKIH0KIAorc3RhdGljIHZv
aWQKK2FyNzF4eF9zcGlfYWNxdWlyZV9idXMoZGV2aWNlX3QgZGV2LCBkZXZpY2VfdCBjaGlsZCkK
K3sKKwlzdHJ1Y3Qgc3BpYnVzX2l2YXIgKmRldmkgPSBTUElCVVNfSVZBUihjaGlsZCk7CisJc3Ry
dWN0IGFyNzF4eF9zcGlfc29mdGMgKnNjOworCisJc2MgPSBkZXZpY2VfZ2V0X3NvZnRjKGRldik7
CisJQVI3MVhYX1NQSV9BU1NFUlRfVU5MT0NLRUQoc2MpOworCisJQVI3MVhYX1NQSV9MT0NLKHNj
KTsKKwlpZiAoc2MtPnNjX293bmVyKQorCQlwYW5pYygiYXI3MXh4X3NwaTogY2Fubm90IHNlcmlh
bGl6ZSB0aGUgYWNjZXNzIHRvIGRldmljZS4iKTsKKworCXNjLT5zY19vd25lciA9IGNoaWxkOwor
CWFyNzF4eF9zcGlfY2hpcF9hY3RpdmF0ZShzYywgZGV2aS0+Y3MpOworfQorCitzdGF0aWMgdm9p
ZAorYXI3MXh4X3NwaV9yZWxlYXNlX2J1cyhkZXZpY2VfdCBkZXYsIGRldmljZV90IGNoaWxkKQor
eworCXN0cnVjdCBzcGlidXNfaXZhciAqZGV2aSA9IFNQSUJVU19JVkFSKGNoaWxkKTsKKwlzdHJ1
Y3QgYXI3MXh4X3NwaV9zb2Z0YyAqc2M7CisKKwlzYyA9IGRldmljZV9nZXRfc29mdGMoZGV2KTsK
KwlBUjcxWFhfU1BJX0FTU0VSVF9MT0NLRUQoc2MpOworCisJaWYgKCFzYy0+c2Nfb3duZXIpCisJ
CXBhbmljKCJhcjcxeHhfc3BpOiByZWxlYXNpbmcgdW5vd25lZCBidXMuIik7CisJaWYgKHNjLT5z
Y19vd25lciAhPSBjaGlsZCkKKwkJcGFuaWMoImFyNzF4eF9zcGk6IHlvdSBkb24ndCBvd24gdGhl
IGJ1cy4gZ2FtZSBvdmVyLiIpOworCisJYXI3MXh4X3NwaV9jaGlwX2RlYWN0aXZhdGUoc2MsIGRl
dmktPmNzKTsKKwlzYy0+c2Nfb3duZXIgPSBOVUxMOworCUFSNzFYWF9TUElfVU5MT0NLKHNjKTsK
K30KKwogc3RhdGljIHVpbnQ4X3QKIGFyNzF4eF9zcGlfdHhyeChzdHJ1Y3QgYXI3MXh4X3NwaV9z
b2Z0YyAqc2MsIGludCBjcywgdWludDhfdCBkYXRhKQogewogCWludCBiaXQ7Ci0JLyogQ1MwICov
Ci0JdWludDMyX3QgaW9jdHJsID0gU1BJX0lPX0NUUkxfQ1NNQVNLOworCXVpbnQzMl90IGlvY3Ry
bDsKKworCUFSNzFYWF9TUElfQVNTRVJUX0xPQ0tFRChzYyk7CisKIAkvKgotCSAqIGxvdy1sZXZl
bCBmb3Igc2VsZWN0ZWQgQ1MKKwkgKiBhY3RpdmF0ZSB0aGUgc2VsZWN0ZWQgQ1MKIAkgKi8KLQlp
b2N0cmwgJj0gfihTUElfSU9fQ1RSTF9DUzAgPDwgY3MpOworCWlvY3RybCA9IFNQSV9JT19DVFJM
X0NTKGNzKTsKIAotCXVpbnQzMl90IGlvZCwgcmRzOworCXVpbnQzMl90IGlvZCA9IDAsIHJkczsK
IAlmb3IgKGJpdCA9IDc7IGJpdCA+PTA7IGJpdC0tKSB7CiAJCWlmIChkYXRhICYgKDEgPDwgYml0
KSkKIAkJCWlvZCA9IGlvY3RybCB8IFNQSV9JT19DVFJMX0RPOwogCQllbHNlCiAJCQlpb2QgPSBp
b2N0cmwgJiB+U1BJX0lPX0NUUkxfRE87CisKIAkJU1BJX1dSSVRFKHNjLCBBUjcxWFhfU1BJX0lP
X0NUUkwsIGlvZCk7CisJCWlmIChzYy0+c2NfcHJlX2RlbGF5KSB7CisJCQlERUxBWShzYy0+c2Nf
cHJlX2RlbGF5KTsKKwkJfQogCQlTUElfV1JJVEUoc2MsIEFSNzFYWF9TUElfSU9fQ1RSTCwgaW9k
IHwgU1BJX0lPX0NUUkxfQ0xLKTsKKwkJaWYgKHNjLT5zY19wb3N0X2RlbGF5KSB7CisJCQlERUxB
WShzYy0+c2NfcG9zdF9kZWxheSk7CisJCX0KIAl9CiAKIAkvKgogCSAqIFByb3ZpZGUgZmFsbGlu
ZyBlZGdlIGZvciBjb25uZWN0ZWQgZGV2aWNlIGJ5IGNsZWFyIGNsb2NrIGJpdC4KIAkgKi8KLQlT
UElfV1JJVEUoc2MsIEFSNzFYWF9TUElfSU9fQ1RSTCwgaW9kKTsKKwlTUElfV1JJVEUoc2MsIEFS
NzFYWF9TUElfSU9fQ1RSTCwgaW9kKTsJCiAJcmRzID0gU1BJX1JFQUQoc2MsIEFSNzFYWF9TUElf
UkRTKTsKIAogCXJldHVybiAocmRzICYgMHhmZik7CkBAIC0xNjksMTIgKzMzNiwxOSBAQAogCXN0
cnVjdCBhcjcxeHhfc3BpX3NvZnRjICpzYzsKIAl1aW50OF90ICpidWZfaW4sICpidWZfb3V0Owog
CXN0cnVjdCBzcGlidXNfaXZhciAqZGV2aSA9IFNQSUJVU19JVkFSKGNoaWxkKTsKKwlpbnQgY3Mg
PSBkZXZpLT5jczsKIAlpbnQgaTsKIAogCXNjID0gZGV2aWNlX2dldF9zb2Z0YyhkZXYpOwogCi0J
YXI3MXh4X3NwaV9jaGlwX2FjdGl2YXRlKHNjLCBkZXZpLT5jcyk7CisJaWYgKChjbWQtPmZsYWdz
ICYgU1BJX1NLSVBfQ0hJUF9TRUxFQ1QpID09IDApCisJCWFyNzF4eF9zcGlfYWNxdWlyZV9idXMo
ZGV2LCBjaGlsZCk7CiAKKwlpZiAoY21kLT5mbGFncyAmIFNQSV9DSElQX1NFTEVDVF9ISUdIKSB7
CisJCWFyNzF4eF9zcGlfY2hpcF9kZWFjdGl2YXRlKHNjLCBkZXZpLT5jcyk7CisJCWNzID0gMDsK
Kwl9CisKIAlLQVNTRVJUKGNtZC0+dHhfY21kX3N6ID09IGNtZC0+cnhfY21kX3N6LCAKIAkgICAg
KCJUWC9SWCBjb21tYW5kIHNpemVzIHNob3VsZCBiZSBlcXVhbCIpKTsKIAlLQVNTRVJUKGNtZC0+
dHhfZGF0YV9zeiA9PSBjbWQtPnJ4X2RhdGFfc3osIApAQCAtMTg2LDcgKzM2MCw3IEBACiAJYnVm
X291dCA9ICh1aW50OF90ICopY21kLT50eF9jbWQ7CiAJYnVmX2luID0gKHVpbnQ4X3QgKiljbWQt
PnJ4X2NtZDsKIAlmb3IgKGkgPSAwOyBpIDwgY21kLT50eF9jbWRfc3o7IGkrKykKLQkJYnVmX2lu
W2ldID0gYXI3MXh4X3NwaV90eHJ4KHNjLCBkZXZpLT5jcywgYnVmX291dFtpXSk7CisJCWJ1Zl9p
bltpXSA9IGFyNzF4eF9zcGlfdHhyeChzYywgY3MsIGJ1Zl9vdXRbaV0pOwogCiAJLyoKIAkgKiBS
ZWNlaXZlL3RyYW5zbWl0IGRhdGEgKGRlcGVuZHMgb24gIGNvbW1hbmQpCkBAIC0xOTQsMTQgKzM2
OCw1MyBAQAogCWJ1Zl9vdXQgPSAodWludDhfdCAqKWNtZC0+dHhfZGF0YTsKIAlidWZfaW4gPSAo
dWludDhfdCAqKWNtZC0+cnhfZGF0YTsKIAlmb3IgKGkgPSAwOyBpIDwgY21kLT50eF9kYXRhX3N6
OyBpKyspCi0JCWJ1Zl9pbltpXSA9IGFyNzF4eF9zcGlfdHhyeChzYywgZGV2aS0+Y3MsIGJ1Zl9v
dXRbaV0pOworCQlidWZfaW5baV0gPSBhcjcxeHhfc3BpX3R4cngoc2MsIGNzLCBidWZfb3V0W2ld
KTsKIAotCWFyNzF4eF9zcGlfY2hpcF9kZWFjdGl2YXRlKHNjLCBkZXZpLT5jcyk7CisJaWYgKChj
bWQtPmZsYWdzICYgU1BJX1NLSVBfQ0hJUF9TRUxFQ1QpID09IDApIHsKKwkJYXI3MXh4X3NwaV9y
ZWxlYXNlX2J1cyhkZXYsIGNoaWxkKTsKKwl9IGVsc2UgaWYgKGNtZC0+ZmxhZ3MgJiBTUElfQ0hJ
UF9TRUxFQ1RfSElHSCkgeworCQlhcjcxeHhfc3BpX2NoaXBfYWN0aXZhdGUoc2MsIGRldmktPmNz
KTsKKwl9CiAKIAlyZXR1cm4gKDApOwogfQogCiBzdGF0aWMgaW50CithcjcxeHhfc3BpX3dyaXRl
KGRldmljZV90IGRldiwgdWludDMyX3QgcmVnLCB1aW50MzJfdCBkYXRhKQoreworCXN0cnVjdCBh
cjcxeHhfc3BpX3NvZnRjICpzYyA9IGRldmljZV9nZXRfc29mdGMoZGV2KTsKKworCUFSNzFYWF9T
UElfQVNTRVJUX0xPQ0tFRChzYyk7CisJU1BJX1dSSVRFKHNjLCByZWcsIGRhdGEpOworCXJldHVy
biAoMCk7Cit9CisKK3N0YXRpYyBpbnQKK2FyNzF4eF9zcGlfc2V0X2NvbmZpZyhkZXZpY2VfdCBk
ZXYsIHN0cnVjdCBzcGlfY29uZmlnICpjZmcpCit7CisJc3RydWN0IGFyNzF4eF9zcGlfc29mdGMg
KnNjID0gZGV2aWNlX2dldF9zb2Z0YyhkZXYpOworCisJQVI3MVhYX1NQSV9BU1NFUlRfTE9DS0VE
KHNjKTsKKwlpZiAoYXI3MXh4X3NwaV9zZXRfY2xvY2soc2MsIGNmZy0+Y2xvY2tfaHopKSB7CisJ
CXJldHVybiAoRU5YSU8pOworCX0KKworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQKK2Fy
NzF4eF9zcGlfZ2V0X2NvbmZpZyhkZXZpY2VfdCBkZXYsIHN0cnVjdCBzcGlfY29uZmlnICpjZmcp
Cit7CisJc3RydWN0IGFyNzF4eF9zcGlfc29mdGMgKnNjID0gZGV2aWNlX2dldF9zb2Z0YyhkZXYp
OworCisJQVI3MVhYX1NQSV9BU1NFUlRfTE9DS0VEKHNjKTsKKworCSpjZmcgPSBzYy0+c2NfY29u
ZmlnOworCisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludAogYXI3MXh4X3NwaV9kZXRhY2go
ZGV2aWNlX3QgZGV2KQogewogCXN0cnVjdCBhcjcxeHhfc3BpX3NvZnRjICpzYyA9IGRldmljZV9n
ZXRfc29mdGMoZGV2KTsKQEAgLTIwOSw2ICs0MjIsOCBAQAogCVNQSV9XUklURShzYywgQVI3MVhY
X1NQSV9DVFJMLCBzYy0+c2NfcmVnX2N0cmwpOwogCVNQSV9XUklURShzYywgQVI3MVhYX1NQSV9G
UywgMCk7CiAKKwlBUjcxWFhfU1BJX0xPQ0tfREVTVFJPWShzYyk7CisKIAlpZiAoc2MtPnNjX21l
bV9yZXMpCiAJCWJ1c19yZWxlYXNlX3Jlc291cmNlKGRldiwgU1lTX1JFU19NRU1PUlksIDAsIHNj
LT5zY19tZW1fcmVzKTsKIApAQCAtMjIxLDcgKzQzNiwxMiBAQAogCURFVk1FVEhPRChkZXZpY2Vf
YXR0YWNoLAlhcjcxeHhfc3BpX2F0dGFjaCksCiAJREVWTUVUSE9EKGRldmljZV9kZXRhY2gsCWFy
NzF4eF9zcGlfZGV0YWNoKSwKIAorCURFVk1FVEhPRChzcGlidXNfYWNxdWlyZV9idXMsCWFyNzF4
eF9zcGlfYWNxdWlyZV9idXMpLAorCURFVk1FVEhPRChzcGlidXNfcmVsZWFzZV9idXMsCWFyNzF4
eF9zcGlfcmVsZWFzZV9idXMpLAogCURFVk1FVEhPRChzcGlidXNfdHJhbnNmZXIsCWFyNzF4eF9z
cGlfdHJhbnNmZXIpLAorCURFVk1FVEhPRChzcGlidXNfd3JpdGUsCQlhcjcxeHhfc3BpX3dyaXRl
KSwKKwlERVZNRVRIT0Qoc3BpYnVzX2dldF9jb25maWcsCWFyNzF4eF9zcGlfZ2V0X2NvbmZpZyks
CisJREVWTUVUSE9EKHNwaWJ1c19zZXRfY29uZmlnLAlhcjcxeHhfc3BpX3NldF9jb25maWcpLAog
CiAJezAsIDB9CiB9OwpJbmRleDogc3lzL21pcHMvYXRoZXJvcy9hcjcxeHhyZWcuaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBzeXMvbWlwcy9hdGhlcm9zL2FyNzF4eHJlZy5oCShyZXZpc2lvbiAyMzQ5OTkpCisr
KyBzeXMvbWlwcy9hdGhlcm9zL2FyNzF4eHJlZy5oCSh3b3JraW5nIGNvcHkpCkBAIC0yOTksNiAr
Mjk5LDEzIEBACiAvKgogICogR2lnRSBhZGFwdGVycyByZWdpb24KICAqLworI2RlZmluZSBBUjcx
WFhfTUlJMF9DVFJMCTB4MTgwNzAwMDAKKyNkZWZpbmUgQVI3MVhYX01JSTFfQ1RSTAkweDE4MDcw
MDA0CisjZGVmaW5lCQlNSUlfQ1RSTF9TUEVFRF9TSElGVAk0CisjZGVmaW5lCQlNSUlfQ1RSTF9T
UEVFRF9NQVNLCTMKKyNkZWZpbmUJCU1JSV9DVFJMX1NQRUVEXzEwCTAKKyNkZWZpbmUJCU1JSV9D
VFJMX1NQRUVEXzEwMAkxCisjZGVmaW5lCQlNSUlfQ1RSTF9TUEVFRF8xMDAwCTIKICNkZWZpbmUg
QVI3MVhYX01BQzBfQkFTRQkweDE5MDAwMDAwCiAjZGVmaW5lIEFSNzFYWF9NQUMxX0JBU0UJMHgx
QTAwMDAwMAogCkBAIC01MDEsMTEgKzUwOCwxMiBAQAogI2RlZmluZQkJQVI3MVhYX1NQSV9DVFJM
CQkweDA0CiAjZGVmaW5lCQkJU1BJX0NUUkxfUkVNQVBfRElTQUJMRQkJKDEgPDwgNikKICNkZWZp
bmUJCQlTUElfQ1RSTF9DTE9DS19ESVZJREVSX01BU0sJKCgxIDw8IDYpIC0gMSkKKyNkZWZpbmUg
IAkJU1BJX0NUUkxfQ0xPQ0tfRElWSURFUl9NQVgJU1BJX0NUUkxfQ0xPQ0tfRElWSURFUl9NQVNL
CiAjZGVmaW5lCQlBUjcxWFhfU1BJX0lPX0NUUkwJMHgwOAogI2RlZmluZQkJCVNQSV9JT19DVFJM
X0NTMgkJCSgxIDw8IDE4KQogI2RlZmluZQkJCVNQSV9JT19DVFJMX0NTMQkJCSgxIDw8IDE3KQog
I2RlZmluZQkJCVNQSV9JT19DVFJMX0NTMAkJCSgxIDw8IDE2KQotI2RlZmluZQkJCVNQSV9JT19D
VFJMX0NTTUFTSwkJKDcgPDwgMTYpCisjZGVmaW5lCQkJU1BJX0lPX0NUUkxfQ1MoY3MpCQkoKDcg
LSBjcykgPDwgMTYpCiAjZGVmaW5lCQkJU1BJX0lPX0NUUkxfQ0xLCQkJKDEgPDwgOCkKICNkZWZp
bmUJCQlTUElfSU9fQ1RSTF9ETwkJCTEKICNkZWZpbmUJCUFSNzFYWF9TUElfUkRTCQkweDBDCg==
--0023544706e0e22de504bf385516--



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