Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 29 Oct 2010 19:22:41 -0700
From:      "Ricky  Charlet" <RCharlet@adaranet.com>
To:        Jack Vogel <jfvogel@gmail.com>
Cc:        "freebsd-net@freebsd.org" <freebsd-net@freebsd.org>
Subject:   RE: em driver problem on vmware
Message-ID:  <32AB5C9615CC494997D9ABB1DB12783C024CA4A7E3@SJ-EXCH-1.adaranet.com>
In-Reply-To: <AANLkTimO30iVaH=AOCCFaWadtXaqzadxEmksFP9fzJ2A@mail.gmail.com>
References:  <32AB5C9615CC494997D9ABB1DB12783C024CA4A7BF@SJ-EXCH-1.adaranet.com> <32AB5C9615CC494997D9ABB1DB12783C024CA4A7DF@SJ-EXCH-1.adaranet.com> <AANLkTimO30iVaH=AOCCFaWadtXaqzadxEmksFP9fzJ2A@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
--_004_32AB5C9615CC494997D9ABB1DB12783C024CA4A7E3SJEXCH1adaran_
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: quoted-printable

Thanks Jack,

                The failure is that ifconfig is unaware of em0.  My em0 is =
not configured, so link partners are also unaware of it.
ifconfig em0
ifconfig: interface em0 does not exist

and you already have my dmes stuff on em0 (which I am now up to agreeing lo=
oks positive and would not indicate a problem)


My amalgamated file is a private combination of some 8.1, some 9.0, some st=
uff a cohort did.  We have been motivated to 'upgrade' from e1000 in 8.0 to=
 a newer/modified e1000 because of our desire to incorporate the altq patch=
es.

                For the curious and the diligent, the e1000/if_em.c file I =
am using is attached.

Ricky


From: Jack Vogel [mailto:jfvogel@gmail.com]
Sent: Friday, October 29, 2010 7:13 PM
To: Ricky Charlet
Cc: freebsd-net@freebsd.org
Subject: Re: em driver problem on vmware

I remember seeing the same thing when running a FreeBSD guest on
Linux/KVM, its informational, the code will enable said bits right after
it says that.

So, the focus should be on the data, you are saying the delivered
driver in 8.0 out of the box works and which driver exactly are you
trying to use, my last checked in?

More on the failure,  does it ping, does its link partner see anything,
etc, etc..

Jack

On Fri, Oct 29, 2010 at 6:27 PM, Ricky Charlet <RCharlet@adaranet.com<mailt=
o:RCharlet@adaranet.com>> wrote:
FYI,
That dmesg output I get from my franken-driver on vmware is exactly the sam=
e output I get from the *working* bsd80Release on vmware:

------------cut--------------------
[root@npx7511 /usr/src/sys/dev/e1000]# dmesg | grep em0
em0: <Intel(R) PRO/1000 Network Connection 6.9.14> port 0x2000-0x203f mem 0=
xd8940000-0xd895ffff,0xd8900000-0xd890ffff irq 18 at device 0.0 on pci2
em0: Memory Access and/or Bus Master bits were not set!
em0: [FILTER]
em0: Ethernet address: 00:0c:29:57:d7:7f
-----------paste-------------------


So I don't think the clue is hiding in dmesg.

---
Ricky Charlet
Adara Networks
USA 408-433-4942

-----Original Message-----
From: owner-freebsd-net@freebsd.org<mailto:owner-freebsd-net@freebsd.org> [=
mailto:owner-freebsd-net@freebsd.org<mailto:owner-freebsd-net@freebsd.org>]=
 On Behalf Of Ricky Charlet
Sent: Friday, October 29, 2010 5:07 PM
To: freebsd-net@freebsd.org<mailto:freebsd-net@freebsd.org>
Subject: em driver problem on vmware

Howdy,
       I have freebsd80-release with an upgraded em0 driver from freebsd8.1=
 (and an appropriate touch of if_var.h). I'm running an amd64 on a  vmware =
vm.  And I see this in dmesg:

------------cut-------------
em0: <Intel(R) PRO/1000 Network Connection 6.9.14> port 0x2000-203f mem 0xd=
8940000-0xd895ffff, 0xd8900000-0xd890ffff irq 18 at device 0.0 on pci2
em0: Memory Access and/or Bus Master bits were not set
em0: [FILTER]
em0: Ethernet address: 00:0c:29:57:d7:7f
------------paste------------

       Now, I certainly may have done something wrong with my code switch (=
just copied over the sys/dev/e1000 directory from 8.1 and defined drbr_need=
s_enqueue in if_var.h). I'll start double checking.

       But, on the other hand, has anyone seen the new em driver working/fa=
iling on a vmware vm?


Thanks


---
Ricky Charlet
Adara Networks
USA 408-433-4942

_______________________________________________
freebsd-net@freebsd.org<mailto:freebsd-net@freebsd.org> mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-net
To unsubscribe, send any mail to "freebsd-net-unsubscribe@freebsd.org<mailt=
o:freebsd-net-unsubscribe@freebsd.org>"
_______________________________________________
freebsd-net@freebsd.org<mailto:freebsd-net@freebsd.org> mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-net
To unsubscribe, send any mail to "freebsd-net-unsubscribe@freebsd.org<mailt=
o:freebsd-net-unsubscribe@freebsd.org>"


--_004_32AB5C9615CC494997D9ABB1DB12783C024CA4A7E3SJEXCH1adaran_
Content-Type: text/plain; name="if_em.c"
Content-Description: if_em.c
Content-Disposition: attachment; filename="if_em.c"; size=152527;
	creation-date="Fri, 29 Oct 2010 19:18:38 GMT";
	modification-date="Sun, 03 Oct 2010 11:39:16 GMT"
Content-Transfer-Encoding: base64

LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKgoKICBDb3B5cmlnaHQgKGMpIDIwMDEtMjAxMCwgSW50ZWwg
Q29ycG9yYXRpb24gCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAKICBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgCiAgbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zIGFyZSBtZXQ6CiAgCiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgCiAgICAgIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAgCiAgIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0IAogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlIAogICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogIAogICAzLiBOZWl0aGVy
IHRoZSBuYW1lIG9mIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cyAK
ICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9k
dWN0cyBkZXJpdmVkIGZyb20gCiAgICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBw
cmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAgCiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCiAgQU5EIEFO
WSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRSAKICBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSAKICBBUkUgRElTQ0xBSU1FRC4gSU4gTk8g
RVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgCiAgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBM
QVJZLCBPUiAKICBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBQUk9DVVJFTUVOVCBPRiAKICBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCiAgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gCiAgQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgCiAgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKICBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4KCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyokRnJlZUJTRCQqLwoKI2lm
ZGVmIEhBVkVfS0VSTkVMX09QVElPTl9IRUFERVJTCiNpbmNsdWRlICJvcHRfZGV2aWNlX3BvbGxp
bmcuaCIKI2luY2x1ZGUgIm9wdF9pbmV0LmgiCiNlbmRpZgoKI2luY2x1ZGUgPHN5cy9wYXJhbS5o
PgojaW5jbHVkZSA8c3lzL3N5c3RtLmg+CiNpZiBfX0ZyZWVCU0RfdmVyc2lvbiA+PSA4MDAwMDAK
I2luY2x1ZGUgPHN5cy9idWZfcmluZy5oPgojZW5kaWYKI2luY2x1ZGUgPHN5cy9idXMuaD4KI2lu
Y2x1ZGUgPHN5cy9lbmRpYW4uaD4KI2luY2x1ZGUgPHN5cy9rZXJuZWwuaD4KI2luY2x1ZGUgPHN5
cy9rdGhyZWFkLmg+CiNpbmNsdWRlIDxzeXMvbWFsbG9jLmg+CiNpbmNsdWRlIDxzeXMvbWJ1Zi5o
PgojaW5jbHVkZSA8c3lzL21vZHVsZS5oPgojaW5jbHVkZSA8c3lzL3JtYW4uaD4KI2luY2x1ZGUg
PHN5cy9zb2NrZXQuaD4KI2luY2x1ZGUgPHN5cy9zb2NraW8uaD4KI2luY2x1ZGUgPHN5cy9zeXNj
dGwuaD4KI2luY2x1ZGUgPHN5cy90YXNrcXVldWUuaD4KI2luY2x1ZGUgPHN5cy9ldmVudGhhbmRs
ZXIuaD4KI2luY2x1ZGUgPG1hY2hpbmUvYnVzLmg+CiNpbmNsdWRlIDxtYWNoaW5lL3Jlc291cmNl
Lmg+CgojaW5jbHVkZSA8bmV0L2JwZi5oPgojaW5jbHVkZSA8bmV0L2V0aGVybmV0Lmg+CiNpbmNs
dWRlIDxuZXQvaWYuaD4KI2luY2x1ZGUgPG5ldC9pZl9hcnAuaD4KI2luY2x1ZGUgPG5ldC9pZl9k
bC5oPgojaW5jbHVkZSA8bmV0L2lmX21lZGlhLmg+CgojaW5jbHVkZSA8bmV0L2lmX3R5cGVzLmg+
CiNpbmNsdWRlIDxuZXQvaWZfdmxhbl92YXIuaD4KCiNpbmNsdWRlIDxuZXRpbmV0L2luX3N5c3Rt
Lmg+CiNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CiNpbmNsdWRlIDxuZXRpbmV0L2lmX2V0aGVyLmg+
CiNpbmNsdWRlIDxuZXRpbmV0L2lwLmg+CiNpbmNsdWRlIDxuZXRpbmV0L2lwNi5oPgojaW5jbHVk
ZSA8bmV0aW5ldC90Y3AuaD4KI2luY2x1ZGUgPG5ldGluZXQvdWRwLmg+CgojaW5jbHVkZSA8bWFj
aGluZS9pbl9ja3N1bS5oPgojaW5jbHVkZSA8ZGV2L2xlZC9sZWQuaD4KI2luY2x1ZGUgPGRldi9w
Y2kvcGNpdmFyLmg+CiNpbmNsdWRlIDxkZXYvcGNpL3BjaXJlZy5oPgoKI2luY2x1ZGUgImUxMDAw
X2FwaS5oIgojaW5jbHVkZSAiZTEwMDBfODI1NzEuaCIKI2luY2x1ZGUgImlmX2VtLmgiCgojaW5j
bHVkZSA8c3lzL3RpbWVzcGVjLmg+CiNpbmNsdWRlIDxzeXMvc3lzcHJvdG8uaD4KCgovKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqCiAqICBTZXQgdGhpcyB0byBvbmUgdG8gZGlzcGxheSBkZWJ1ZyBzdGF0aXN0aWNzCiAq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKiovCmludAllbV9kaXNwbGF5X2RlYnVnX3N0YXRzID0gMDsKCi8qKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioKICogIERyaXZlciB2ZXJzaW9uOgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpjaGFyIGVtX2RyaXZlcl92ZXJz
aW9uW10gPSAiNy4wLjUiOwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogIFBDSSBEZXZpY2UgSUQgVGFibGUK
ICoKICogIFVzZWQgYnkgcHJvYmUgdG8gc2VsZWN0IGRldmljZXMgdG8gbG9hZCBvbgogKiAgTGFz
dCBmaWVsZCBzdG9yZXMgYW4gaW5kZXggaW50byBlMTAwMF9zdHJpbmdzCiAqICBMYXN0IGVudHJ5
IG11c3QgYmUgYWxsIDBzCiAqCiAqICB7IFZlbmRvciBJRCwgRGV2aWNlIElELCBTdWJWZW5kb3Ig
SUQsIFN1YkRldmljZSBJRCwgU3RyaW5nIEluZGV4IH0KICoqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyBl
bV92ZW5kb3JfaW5mb190IGVtX3ZlbmRvcl9pbmZvX2FycmF5W10gPQp7CgkvKiBJbnRlbChSKSBQ
Uk8vMTAwMCBOZXR3b3JrIENvbm5lY3Rpb24gKi8KCXsgMHg4MDg2LCBFMTAwMF9ERVZfSURfODI1
NzFFQl9DT1BQRVIsCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDB9LAoJeyAweDgwODYsIEUxMDAw
X0RFVl9JRF84MjU3MUVCX0ZJQkVSLAlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwfSwKCXsgMHg4
MDg2LCBFMTAwMF9ERVZfSURfODI1NzFFQl9TRVJERVMsCVBDSV9BTllfSUQsIFBDSV9BTllfSUQs
IDB9LAoJeyAweDgwODYsIEUxMDAwX0RFVl9JRF84MjU3MUVCX1NFUkRFU19EVUFMLAoJCQkJCQlQ
Q0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwfSwKCXsgMHg4MDg2LCBFMTAwMF9ERVZfSURfODI1NzFF
Ql9TRVJERVNfUVVBRCwKCQkJCQkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMH0sCgl7IDB4ODA4
NiwgRTEwMDBfREVWX0lEXzgyNTcxRUJfUVVBRF9DT1BQRVIsCgkJCQkJCVBDSV9BTllfSUQsIFBD
SV9BTllfSUQsIDB9LAoJeyAweDgwODYsIEUxMDAwX0RFVl9JRF84MjU3MUVCX1FVQURfQ09QUEVS
X0xQLAoJCQkJCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwfSwKCXsgMHg4MDg2LCBFMTAwMF9E
RVZfSURfODI1NzFFQl9RVUFEX0ZJQkVSLAoJCQkJCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAw
fSwKCXsgMHg4MDg2LCBFMTAwMF9ERVZfSURfODI1NzFQVF9RVUFEX0NPUFBFUiwKCQkJCQkJUENJ
X0FOWV9JRCwgUENJX0FOWV9JRCwgMH0sCgl7IDB4ODA4NiwgRTEwMDBfREVWX0lEXzgyNTcyRUlf
Q09QUEVSLAlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwfSwKCXsgMHg4MDg2LCBFMTAwMF9ERVZf
SURfODI1NzJFSV9GSUJFUiwJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMH0sCgl7IDB4ODA4Niwg
RTEwMDBfREVWX0lEXzgyNTcyRUlfU0VSREVTLAlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwfSwK
CXsgMHg4MDg2LCBFMTAwMF9ERVZfSURfODI1NzJFSSwJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQs
IDB9LAoKCXsgMHg4MDg2LCBFMTAwMF9ERVZfSURfODI1NzNFLAkJUENJX0FOWV9JRCwgUENJX0FO
WV9JRCwgMH0sCgl7IDB4ODA4NiwgRTEwMDBfREVWX0lEXzgyNTczRV9JQU1ULAlQQ0lfQU5ZX0lE
LCBQQ0lfQU5ZX0lELCAwfSwKCXsgMHg4MDg2LCBFMTAwMF9ERVZfSURfODI1NzNMLAkJUENJX0FO
WV9JRCwgUENJX0FOWV9JRCwgMH0sCgl7IDB4ODA4NiwgRTEwMDBfREVWX0lEXzgyNTgzViwJCVBD
SV9BTllfSUQsIFBDSV9BTllfSUQsIDB9LAoJeyAweDgwODYsIEUxMDAwX0RFVl9JRF84MDAwM0VT
MkxBTl9DT1BQRVJfU1BULAoJCQkJCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwfSwKCXsgMHg4
MDg2LCBFMTAwMF9ERVZfSURfODAwMDNFUzJMQU5fU0VSREVTX1NQVCwKCQkJCQkJUENJX0FOWV9J
RCwgUENJX0FOWV9JRCwgMH0sCgl7IDB4ODA4NiwgRTEwMDBfREVWX0lEXzgwMDAzRVMyTEFOX0NP
UFBFUl9EUFQsCgkJCQkJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDB9LAoJeyAweDgwODYsIEUx
MDAwX0RFVl9JRF84MDAwM0VTMkxBTl9TRVJERVNfRFBULAoJCQkJCQlQQ0lfQU5ZX0lELCBQQ0lf
QU5ZX0lELCAwfSwKCXsgMHg4MDg2LCBFMTAwMF9ERVZfSURfSUNIOF9JR1BfTV9BTVQsCVBDSV9B
TllfSUQsIFBDSV9BTllfSUQsIDB9LAoJeyAweDgwODYsIEUxMDAwX0RFVl9JRF9JQ0g4X0lHUF9B
TVQsCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDB9LAoJeyAweDgwODYsIEUxMDAwX0RFVl9JRF9J
Q0g4X0lHUF9DLAlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwfSwKCXsgMHg4MDg2LCBFMTAwMF9E
RVZfSURfSUNIOF9JRkUsCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDB9LAoJeyAweDgwODYsIEUx
MDAwX0RFVl9JRF9JQ0g4X0lGRV9HVCwJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMH0sCgl7IDB4
ODA4NiwgRTEwMDBfREVWX0lEX0lDSDhfSUZFX0csCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDB9
LAoJeyAweDgwODYsIEUxMDAwX0RFVl9JRF9JQ0g4X0lHUF9NLAlQQ0lfQU5ZX0lELCBQQ0lfQU5Z
X0lELCAwfSwKCXsgMHg4MDg2LCBFMTAwMF9ERVZfSURfSUNIOF84MjU2N1ZfMywJUENJX0FOWV9J
RCwgUENJX0FOWV9JRCwgMH0sCgl7IDB4ODA4NiwgRTEwMDBfREVWX0lEX0lDSDlfSUdQX01fQU1U
LAlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwfSwKCXsgMHg4MDg2LCBFMTAwMF9ERVZfSURfSUNI
OV9JR1BfQU1ULAlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwfSwKCXsgMHg4MDg2LCBFMTAwMF9E
RVZfSURfSUNIOV9JR1BfQywJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMH0sCgl7IDB4ODA4Niwg
RTEwMDBfREVWX0lEX0lDSDlfSUdQX00sCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDB9LAoJeyAw
eDgwODYsIEUxMDAwX0RFVl9JRF9JQ0g5X0lHUF9NX1YsCVBDSV9BTllfSUQsIFBDSV9BTllfSUQs
IDB9LAoJeyAweDgwODYsIEUxMDAwX0RFVl9JRF9JQ0g5X0lGRSwJUENJX0FOWV9JRCwgUENJX0FO
WV9JRCwgMH0sCgl7IDB4ODA4NiwgRTEwMDBfREVWX0lEX0lDSDlfSUZFX0dULAlQQ0lfQU5ZX0lE
LCBQQ0lfQU5ZX0lELCAwfSwKCXsgMHg4MDg2LCBFMTAwMF9ERVZfSURfSUNIOV9JRkVfRywJUENJ
X0FOWV9JRCwgUENJX0FOWV9JRCwgMH0sCgl7IDB4ODA4NiwgRTEwMDBfREVWX0lEX0lDSDlfQk0s
CQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwfSwKCXsgMHg4MDg2LCBFMTAwMF9ERVZfSURfODI1
NzRMLAkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMH0sCgl7IDB4ODA4NiwgRTEwMDBfREVWX0lE
XzgyNTc0TEEsCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwfSwKCXsgMHg4MDg2LCBFMTAwMF9E
RVZfSURfSUNIMTBfUl9CTV9MTSwJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMH0sCgl7IDB4ODA4
NiwgRTEwMDBfREVWX0lEX0lDSDEwX1JfQk1fTEYsCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDB9
LAoJeyAweDgwODYsIEUxMDAwX0RFVl9JRF9JQ0gxMF9SX0JNX1YsCVBDSV9BTllfSUQsIFBDSV9B
TllfSUQsIDB9LAoJeyAweDgwODYsIEUxMDAwX0RFVl9JRF9JQ0gxMF9EX0JNX0xNLAlQQ0lfQU5Z
X0lELCBQQ0lfQU5ZX0lELCAwfSwKCXsgMHg4MDg2LCBFMTAwMF9ERVZfSURfSUNIMTBfRF9CTV9M
RiwJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMH0sCgl7IDB4ODA4NiwgRTEwMDBfREVWX0lEX1BD
SF9NX0hWX0xNLAlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwfSwKCXsgMHg4MDg2LCBFMTAwMF9E
RVZfSURfUENIX01fSFZfTEMsCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDB9LAoJeyAweDgwODYs
IEUxMDAwX0RFVl9JRF9QQ0hfRF9IVl9ETSwJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMH0sCgl7
IDB4ODA4NiwgRTEwMDBfREVWX0lEX1BDSF9EX0hWX0RDLAlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lE
LCAwfSwKCS8qIHJlcXVpcmVkIGxhc3QgZW50cnkgKi8KCXsgMCwgMCwgMCwgMCwgMH0KfTsKCi8q
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioKICogIFRhYmxlIG9mIGJyYW5kaW5nIHN0cmluZ3MgZm9yIGFsbCBzdXBwb3J0
ZWQgTklDcy4KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyBjaGFyICplbV9zdHJpbmdzW10gPSB7Cgki
SW50ZWwoUikgUFJPLzEwMDAgTmV0d29yayBDb25uZWN0aW9uIgp9OwoKLyoqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgog
KiAgRnVuY3Rpb24gcHJvdG90eXBlcwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgaW50CWVtX3Byb2Jl
KGRldmljZV90KTsKc3RhdGljIGludAllbV9hdHRhY2goZGV2aWNlX3QpOwpzdGF0aWMgaW50CWVt
X2RldGFjaChkZXZpY2VfdCk7CnN0YXRpYyBpbnQJZW1fc2h1dGRvd24oZGV2aWNlX3QpOwpzdGF0
aWMgaW50CWVtX3N1c3BlbmQoZGV2aWNlX3QpOwpzdGF0aWMgaW50CWVtX3Jlc3VtZShkZXZpY2Vf
dCk7CnN0YXRpYyB2b2lkCWVtX3N0YXJ0KHN0cnVjdCBpZm5ldCAqKTsKc3RhdGljIHZvaWQJZW1f
c3RhcnRfbG9ja2VkKHN0cnVjdCBpZm5ldCAqLCBzdHJ1Y3QgdHhfcmluZyAqKTsKI2lmZGVmIEVN
X01VTFRJUVVFVUUKc3RhdGljIGludAllbV9tcV9zdGFydChzdHJ1Y3QgaWZuZXQgKiwgc3RydWN0
IG1idWYgKik7CnN0YXRpYyBpbnQJZW1fbXFfc3RhcnRfbG9ja2VkKHN0cnVjdCBpZm5ldCAqLAoJ
CSAgICBzdHJ1Y3QgdHhfcmluZyAqLCBzdHJ1Y3QgbWJ1ZiAqKTsKc3RhdGljIHZvaWQJZW1fcWZs
dXNoKHN0cnVjdCBpZm5ldCAqKTsKI2VuZGlmCnN0YXRpYyBpbnQJZW1faW9jdGwoc3RydWN0IGlm
bmV0ICosIHVfbG9uZywgY2FkZHJfdCk7CnN0YXRpYyB2b2lkCWVtX2luaXQodm9pZCAqKTsKc3Rh
dGljIHZvaWQJZW1faW5pdF9sb2NrZWQoc3RydWN0IGFkYXB0ZXIgKik7CnN0YXRpYyB2b2lkCWVt
X3N0b3Aodm9pZCAqKTsKc3RhdGljIHZvaWQJZW1fbWVkaWFfc3RhdHVzKHN0cnVjdCBpZm5ldCAq
LCBzdHJ1Y3QgaWZtZWRpYXJlcSAqKTsKc3RhdGljIGludAllbV9tZWRpYV9jaGFuZ2Uoc3RydWN0
IGlmbmV0ICopOwpzdGF0aWMgdm9pZAllbV9pZGVudGlmeV9oYXJkd2FyZShzdHJ1Y3QgYWRhcHRl
ciAqKTsKc3RhdGljIGludAllbV9hbGxvY2F0ZV9wY2lfcmVzb3VyY2VzKHN0cnVjdCBhZGFwdGVy
ICopOwpzdGF0aWMgaW50CWVtX2FsbG9jYXRlX2xlZ2FjeShzdHJ1Y3QgYWRhcHRlciAqKTsKc3Rh
dGljIGludAllbV9hbGxvY2F0ZV9tc2l4KHN0cnVjdCBhZGFwdGVyICopOwpzdGF0aWMgaW50CWVt
X2FsbG9jYXRlX3F1ZXVlcyhzdHJ1Y3QgYWRhcHRlciAqKTsKc3RhdGljIGludAllbV9zZXR1cF9t
c2l4KHN0cnVjdCBhZGFwdGVyICopOwpzdGF0aWMgdm9pZAllbV9mcmVlX3BjaV9yZXNvdXJjZXMo
c3RydWN0IGFkYXB0ZXIgKik7CnN0YXRpYyB2b2lkCWVtX2xvY2FsX3RpbWVyKHZvaWQgKik7CnN0
YXRpYyB2b2lkCWVtX3Jlc2V0KHN0cnVjdCBhZGFwdGVyICopOwpzdGF0aWMgdm9pZAllbV9zZXR1
cF9pbnRlcmZhY2UoZGV2aWNlX3QsIHN0cnVjdCBhZGFwdGVyICopOwoKc3RhdGljIHZvaWQJZW1f
c2V0dXBfdHJhbnNtaXRfc3RydWN0dXJlcyhzdHJ1Y3QgYWRhcHRlciAqKTsKc3RhdGljIHZvaWQJ
ZW1faW5pdGlhbGl6ZV90cmFuc21pdF91bml0KHN0cnVjdCBhZGFwdGVyICopOwpzdGF0aWMgaW50
CWVtX2FsbG9jYXRlX3RyYW5zbWl0X2J1ZmZlcnMoc3RydWN0IHR4X3JpbmcgKik7CnN0YXRpYyB2
b2lkCWVtX2ZyZWVfdHJhbnNtaXRfc3RydWN0dXJlcyhzdHJ1Y3QgYWRhcHRlciAqKTsKc3RhdGlj
IHZvaWQJZW1fZnJlZV90cmFuc21pdF9idWZmZXJzKHN0cnVjdCB0eF9yaW5nICopOwoKc3RhdGlj
IGludAllbV9zZXR1cF9yZWNlaXZlX3N0cnVjdHVyZXMoc3RydWN0IGFkYXB0ZXIgKik7CnN0YXRp
YyBpbnQJZW1fYWxsb2NhdGVfcmVjZWl2ZV9idWZmZXJzKHN0cnVjdCByeF9yaW5nICopOwpzdGF0
aWMgdm9pZAllbV9pbml0aWFsaXplX3JlY2VpdmVfdW5pdChzdHJ1Y3QgYWRhcHRlciAqKTsKc3Rh
dGljIHZvaWQJZW1fZnJlZV9yZWNlaXZlX3N0cnVjdHVyZXMoc3RydWN0IGFkYXB0ZXIgKik7CnN0
YXRpYyB2b2lkCWVtX2ZyZWVfcmVjZWl2ZV9idWZmZXJzKHN0cnVjdCByeF9yaW5nICopOwoKc3Rh
dGljIHZvaWQJZW1fZW5hYmxlX2ludHIoc3RydWN0IGFkYXB0ZXIgKik7CnN0YXRpYyB2b2lkCWVt
X2Rpc2FibGVfaW50cihzdHJ1Y3QgYWRhcHRlciAqKTsKc3RhdGljIHZvaWQJZW1fdXBkYXRlX3N0
YXRzX2NvdW50ZXJzKHN0cnVjdCBhZGFwdGVyICopOwpzdGF0aWMgdm9pZAllbV9hZGRfaHdfc3Rh
dHMoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpOwpzdGF0aWMgYm9vbAllbV90eGVvZihzdHJ1Y3Qg
dHhfcmluZyAqKTsKc3RhdGljIGJvb2wJZW1fcnhlb2Yoc3RydWN0IHJ4X3JpbmcgKiwgaW50LCBp
bnQgKik7CiNpZm5kZWYgX19OT19TVFJJQ1RfQUxJR05NRU5UCnN0YXRpYyBpbnQJZW1fZml4dXBf
cngoc3RydWN0IHJ4X3JpbmcgKik7CiNlbmRpZgpzdGF0aWMgdm9pZAllbV9yZWNlaXZlX2NoZWNr
c3VtKHN0cnVjdCBlMTAwMF9yeF9kZXNjICosIHN0cnVjdCBtYnVmICopOwpzdGF0aWMgdm9pZAll
bV90cmFuc21pdF9jaGVja3N1bV9zZXR1cChzdHJ1Y3QgdHhfcmluZyAqLCBzdHJ1Y3QgbWJ1ZiAq
LAoJCSAgICB1MzIgKiwgdTMyICopOwpzdGF0aWMgYm9vbAllbV90c29fc2V0dXAoc3RydWN0IHR4
X3JpbmcgKiwgc3RydWN0IG1idWYgKiwgdTMyICosIHUzMiAqKTsKc3RhdGljIHZvaWQJZW1fc2V0
X3Byb21pc2Moc3RydWN0IGFkYXB0ZXIgKik7CnN0YXRpYyB2b2lkCWVtX2Rpc2FibGVfcHJvbWlz
YyhzdHJ1Y3QgYWRhcHRlciAqKTsKc3RhdGljIHZvaWQJZW1fc2V0X211bHRpKHN0cnVjdCBhZGFw
dGVyICopOwpzdGF0aWMgdm9pZAllbV91cGRhdGVfbGlua19zdGF0dXMoc3RydWN0IGFkYXB0ZXIg
Kik7CnN0YXRpYyB2b2lkCWVtX3JlZnJlc2hfbWJ1ZnMoc3RydWN0IHJ4X3JpbmcgKiwgaW50KTsK
c3RhdGljIHZvaWQJZW1fcmVnaXN0ZXJfdmxhbih2b2lkICosIHN0cnVjdCBpZm5ldCAqLCB1MTYp
OwpzdGF0aWMgdm9pZAllbV91bnJlZ2lzdGVyX3ZsYW4odm9pZCAqLCBzdHJ1Y3QgaWZuZXQgKiwg
dTE2KTsKc3RhdGljIHZvaWQJZW1fc2V0dXBfdmxhbl9od19zdXBwb3J0KHN0cnVjdCBhZGFwdGVy
ICopOwpzdGF0aWMgaW50CWVtX3htaXQoc3RydWN0IHR4X3JpbmcgKiwgc3RydWN0IG1idWYgKiop
OwpzdGF0aWMgaW50CWVtX2RtYV9tYWxsb2Moc3RydWN0IGFkYXB0ZXIgKiwgYnVzX3NpemVfdCwK
CQkgICAgc3RydWN0IGVtX2RtYV9hbGxvYyAqLCBpbnQpOwpzdGF0aWMgdm9pZAllbV9kbWFfZnJl
ZShzdHJ1Y3QgYWRhcHRlciAqLCBzdHJ1Y3QgZW1fZG1hX2FsbG9jICopOwpzdGF0aWMgaW50CWVt
X3N5c2N0bF9udm1faW5mbyhTWVNDVExfSEFORExFUl9BUkdTKTsKc3RhdGljIHZvaWQJZW1fcHJp
bnRfbnZtX2luZm8oc3RydWN0IGFkYXB0ZXIgKik7CnN0YXRpYyBpbnQgCWVtX2lzX3ZhbGlkX2V0
aGVyX2FkZHIodTggKik7CnN0YXRpYyBpbnQJZW1fc3lzY3RsX2ludF9kZWxheShTWVNDVExfSEFO
RExFUl9BUkdTKTsKc3RhdGljIHZvaWQJZW1fYWRkX2ludF9kZWxheV9zeXNjdGwoc3RydWN0IGFk
YXB0ZXIgKiwgY29uc3QgY2hhciAqLAoJCSAgICBjb25zdCBjaGFyICosIHN0cnVjdCBlbV9pbnRf
ZGVsYXlfaW5mbyAqLCBpbnQsIGludCk7Ci8qIE1hbmFnZW1lbnQgYW5kIFdPTCBTdXBwb3J0ICov
CnN0YXRpYyB2b2lkCWVtX2luaXRfbWFuYWdlYWJpbGl0eShzdHJ1Y3QgYWRhcHRlciAqKTsKc3Rh
dGljIHZvaWQJZW1fcmVsZWFzZV9tYW5hZ2VhYmlsaXR5KHN0cnVjdCBhZGFwdGVyICopOwpzdGF0
aWMgdm9pZCAgICAgZW1fZ2V0X2h3X2NvbnRyb2woc3RydWN0IGFkYXB0ZXIgKik7CnN0YXRpYyB2
b2lkICAgICBlbV9yZWxlYXNlX2h3X2NvbnRyb2woc3RydWN0IGFkYXB0ZXIgKik7CnN0YXRpYyB2
b2lkCWVtX2dldF93YWtldXAoZGV2aWNlX3QpOwpzdGF0aWMgdm9pZCAgICAgZW1fZW5hYmxlX3dh
a2V1cChkZXZpY2VfdCk7CnN0YXRpYyBpbnQJZW1fZW5hYmxlX3BoeV93YWtldXAoc3RydWN0IGFk
YXB0ZXIgKik7CnN0YXRpYyB2b2lkCWVtX2xlZF9mdW5jKHZvaWQgKiwgaW50KTsKCnN0YXRpYyBp
bnQJZW1faXJxX2Zhc3Qodm9pZCAqKTsKCi8qIE1TSVggaGFuZGxlcnMgKi8Kc3RhdGljIHZvaWQJ
ZW1fbXNpeF90eCh2b2lkICopOwpzdGF0aWMgdm9pZAllbV9tc2l4X3J4KHZvaWQgKik7CnN0YXRp
YyB2b2lkCWVtX21zaXhfbGluayh2b2lkICopOwpzdGF0aWMgdm9pZAllbV9oYW5kbGVfdHgodm9p
ZCAqY29udGV4dCwgaW50IHBlbmRpbmcpOwpzdGF0aWMgdm9pZAllbV9oYW5kbGVfcngodm9pZCAq
Y29udGV4dCwgaW50IHBlbmRpbmcpOwpzdGF0aWMgdm9pZAllbV9oYW5kbGVfbGluayh2b2lkICpj
b250ZXh0LCBpbnQgcGVuZGluZyk7CgpzdGF0aWMgdm9pZAllbV9hZGRfcnhfcHJvY2Vzc19saW1p
dChzdHJ1Y3QgYWRhcHRlciAqLCBjb25zdCBjaGFyICosCgkJICAgIGNvbnN0IGNoYXIgKiwgaW50
ICosIGludCk7CgojaWZkZWYgREVWSUNFX1BPTExJTkcKc3RhdGljIHBvbGxfaGFuZGxlcl90IGVt
X3BvbGw7CiNlbmRpZiAvKiBQT0xMSU5HICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICBGcmVlQlNEIERl
dmljZSBJbnRlcmZhY2UgRW50cnkgUG9pbnRzCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgZGV2aWNl
X21ldGhvZF90IGVtX21ldGhvZHNbXSA9IHsKCS8qIERldmljZSBpbnRlcmZhY2UgKi8KCURFVk1F
VEhPRChkZXZpY2VfcHJvYmUsIGVtX3Byb2JlKSwKCURFVk1FVEhPRChkZXZpY2VfYXR0YWNoLCBl
bV9hdHRhY2gpLAoJREVWTUVUSE9EKGRldmljZV9kZXRhY2gsIGVtX2RldGFjaCksCglERVZNRVRI
T0QoZGV2aWNlX3NodXRkb3duLCBlbV9zaHV0ZG93biksCglERVZNRVRIT0QoZGV2aWNlX3N1c3Bl
bmQsIGVtX3N1c3BlbmQpLAoJREVWTUVUSE9EKGRldmljZV9yZXN1bWUsIGVtX3Jlc3VtZSksCgl7
MCwgMH0KfTsKCnN0YXRpYyBkcml2ZXJfdCBlbV9kcml2ZXIgPSB7CgkiZW0iLCBlbV9tZXRob2Rz
LCBzaXplb2Yoc3RydWN0IGFkYXB0ZXIpLAp9OwoKZGV2Y2xhc3NfdCBlbV9kZXZjbGFzczsKRFJJ
VkVSX01PRFVMRShlbSwgcGNpLCBlbV9kcml2ZXIsIGVtX2RldmNsYXNzLCAwLCAwKTsKTU9EVUxF
X0RFUEVORChlbSwgcGNpLCAxLCAxLCAxKTsKTU9EVUxFX0RFUEVORChlbSwgZXRoZXIsIDEsIDEs
IDEpOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKgogKiAgVHVuYWJsZSBkZWZhdWx0IHZhbHVlcy4KICoqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKi8KCiNkZWZpbmUgRU1fVElDS1NfVE9fVVNFQ1ModGlja3MpCSgoMTAyNCAqICh0aWNrcykg
KyA1MDApIC8gMTAwMCkKI2RlZmluZSBFTV9VU0VDU19UT19USUNLUyh1c2VjcykJKCgxMDAwICog
KHVzZWNzKSArIDUxMikgLyAxMDI0KQojZGVmaW5lIE1fVFNPX0xFTgkJCTY2CgovKiBBbGxvdyBj
b21tb24gY29kZSB3aXRob3V0IFRTTyAqLwojaWZuZGVmIENTVU1fVFNPCiNkZWZpbmUgQ1NVTV9U
U08JMAojZW5kaWYKCnN0YXRpYyBpbnQgZW1fdHhfaW50X2RlbGF5X2RmbHQgPSBFTV9USUNLU19U
T19VU0VDUyhFTV9USURWKTsKc3RhdGljIGludCBlbV9yeF9pbnRfZGVsYXlfZGZsdCA9IEVNX1RJ
Q0tTX1RPX1VTRUNTKEVNX1JEVFIpOwpUVU5BQkxFX0lOVCgiaHcuZW0udHhfaW50X2RlbGF5Iiwg
JmVtX3R4X2ludF9kZWxheV9kZmx0KTsKVFVOQUJMRV9JTlQoImh3LmVtLnJ4X2ludF9kZWxheSIs
ICZlbV9yeF9pbnRfZGVsYXlfZGZsdCk7CgpzdGF0aWMgaW50IGVtX3R4X2Fic19pbnRfZGVsYXlf
ZGZsdCA9IEVNX1RJQ0tTX1RPX1VTRUNTKEVNX1RBRFYpOwpzdGF0aWMgaW50IGVtX3J4X2Fic19p
bnRfZGVsYXlfZGZsdCA9IEVNX1RJQ0tTX1RPX1VTRUNTKEVNX1JBRFYpOwpUVU5BQkxFX0lOVCgi
aHcuZW0udHhfYWJzX2ludF9kZWxheSIsICZlbV90eF9hYnNfaW50X2RlbGF5X2RmbHQpOwpUVU5B
QkxFX0lOVCgiaHcuZW0ucnhfYWJzX2ludF9kZWxheSIsICZlbV9yeF9hYnNfaW50X2RlbGF5X2Rm
bHQpOwoKc3RhdGljIGludCBlbV9yeGQgPSBFTV9ERUZBVUxUX1JYRDsKc3RhdGljIGludCBlbV90
eGQgPSBFTV9ERUZBVUxUX1RYRDsKVFVOQUJMRV9JTlQoImh3LmVtLnJ4ZCIsICZlbV9yeGQpOwpU
VU5BQkxFX0lOVCgiaHcuZW0udHhkIiwgJmVtX3R4ZCk7CgpzdGF0aWMgaW50IGVtX3NtYXJ0X3B3
cl9kb3duID0gRkFMU0U7ClRVTkFCTEVfSU5UKCJody5lbS5zbWFydF9wd3JfZG93biIsICZlbV9z
bWFydF9wd3JfZG93bik7CgovKiBDb250cm9scyB3aGV0aGVyIHByb21pc2N1b3VzIGFsc28gc2hv
d3MgYmFkIHBhY2tldHMgKi8Kc3RhdGljIGludCBlbV9kZWJ1Z19zYnAgPSBGQUxTRTsKVFVOQUJM
RV9JTlQoImh3LmVtLnNicCIsICZlbV9kZWJ1Z19zYnApOwoKLyogTG9jYWwgY29udHJvbHMgZm9y
IE1TSS9NU0lYICovCiNpZmRlZiBFTV9NVUxUSVFVRVVFCnN0YXRpYyBpbnQgZW1fZW5hYmxlX21z
aXggPSBUUlVFOwpzdGF0aWMgaW50IGVtX21zaXhfcXVldWVzID0gMjsgLyogZm9yIDgyNTc0LCBj
YW4gYmUgMSBvciAyICovCiNlbHNlCnN0YXRpYyBpbnQgZW1fZW5hYmxlX21zaXggPSBGQUxTRTsK
c3RhdGljIGludCBlbV9tc2l4X3F1ZXVlcyA9IDA7IC8qIGRpc2FibGUgKi8KI2VuZGlmClRVTkFC
TEVfSU5UKCJody5lbS5lbmFibGVfbXNpeCIsICZlbV9lbmFibGVfbXNpeCk7ClRVTkFCTEVfSU5U
KCJody5lbS5tc2l4X3F1ZXVlcyIsICZlbV9tc2l4X3F1ZXVlcyk7CgovKiBIb3cgbWFueSBwYWNr
ZXRzIHJ4ZW9mIHRyaWVzIHRvIGNsZWFuIGF0IGEgdGltZSAqLwpzdGF0aWMgaW50IGVtX3J4X3By
b2Nlc3NfbGltaXQgPSAxMDA7ClRVTkFCTEVfSU5UKCJody5lbS5yeF9wcm9jZXNzX2xpbWl0Iiwg
JmVtX3J4X3Byb2Nlc3NfbGltaXQpOwoKLyogRmxvdyBjb250cm9sIHNldHRpbmcgLSBkZWZhdWx0
IHRvIEZVTEwgKi8Kc3RhdGljIGludCBlbV9mY19zZXR0aW5nID0gZTEwMDBfZmNfZnVsbDsKVFVO
QUJMRV9JTlQoImh3LmVtLmZjX3NldHRpbmciLCAmZW1fZmNfc2V0dGluZyk7CgovKgoqKiBTaGFk
b3cgVkZUQSB0YWJsZSwgdGhpcyBpcyBuZWVkZWQgYmVjYXVzZQoqKiB0aGUgcmVhbCB2bGFuIGZp
bHRlciB0YWJsZSBnZXRzIGNsZWFyZWQgZHVyaW5nCioqIGEgc29mdCByZXNldCBhbmQgdGhlIGRy
aXZlciBuZWVkcyB0byBiZSBhYmxlCioqIHRvIHJlcG9wdWxhdGUgaXQuCiovCnN0YXRpYyB1MzIg
ZW1fc2hhZG93X3ZmdGFbRU1fVkZUQV9TSVpFXTsKCi8qIEdsb2JhbCB1c2VkIGluIFdPTCBzZXR1
cCB3aXRoIG11bHRpcG9ydCBjYXJkcyAqLwpzdGF0aWMgaW50IGdsb2JhbF9xdWFkX3BvcnRfYSA9
IDA7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqCiAqICBEZXZpY2UgaWRlbnRpZmljYXRpb24gcm91dGluZQogKgog
KiAgZW1fcHJvYmUgZGV0ZXJtaW5lcyBpZiB0aGUgZHJpdmVyIHNob3VsZCBiZSBsb2FkZWQgb24K
ICogIGFkYXB0ZXIgYmFzZWQgb24gUENJIHZlbmRvci9kZXZpY2UgaWQgb2YgdGhlIGFkYXB0ZXIu
CiAqCiAqICByZXR1cm4gQlVTX1BST0JFX0RFRkFVTFQgb24gc3VjY2VzcywgcG9zaXRpdmUgb24g
ZmFpbHVyZQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqLwoKc3RhdGljIGludAplbV9wcm9iZShkZXZpY2VfdCBkZXYp
CnsKCWNoYXIJCWFkYXB0ZXJfbmFtZVs2MF07Cgl1MTYJCXBjaV92ZW5kb3JfaWQgPSAwOwoJdTE2
CQlwY2lfZGV2aWNlX2lkID0gMDsKCXUxNgkJcGNpX3N1YnZlbmRvcl9pZCA9IDA7Cgl1MTYJCXBj
aV9zdWJkZXZpY2VfaWQgPSAwOwoJZW1fdmVuZG9yX2luZm9fdCAqZW50OwoKCUlOSVRfREVCVUdP
VVQoImVtX3Byb2JlOiBiZWdpbiIpOwoKCXBjaV92ZW5kb3JfaWQgPSBwY2lfZ2V0X3ZlbmRvcihk
ZXYpOwoJaWYgKHBjaV92ZW5kb3JfaWQgIT0gRU1fVkVORE9SX0lEKQoJCXJldHVybiAoRU5YSU8p
OwoKCXBjaV9kZXZpY2VfaWQgPSBwY2lfZ2V0X2RldmljZShkZXYpOwoJcGNpX3N1YnZlbmRvcl9p
ZCA9IHBjaV9nZXRfc3VidmVuZG9yKGRldik7CglwY2lfc3ViZGV2aWNlX2lkID0gcGNpX2dldF9z
dWJkZXZpY2UoZGV2KTsKCgllbnQgPSBlbV92ZW5kb3JfaW5mb19hcnJheTsKCXdoaWxlIChlbnQt
PnZlbmRvcl9pZCAhPSAwKSB7CgkJaWYgKChwY2lfdmVuZG9yX2lkID09IGVudC0+dmVuZG9yX2lk
KSAmJgoJCSAgICAocGNpX2RldmljZV9pZCA9PSBlbnQtPmRldmljZV9pZCkgJiYKCgkJICAgICgo
cGNpX3N1YnZlbmRvcl9pZCA9PSBlbnQtPnN1YnZlbmRvcl9pZCkgfHwKCQkgICAgKGVudC0+c3Vi
dmVuZG9yX2lkID09IFBDSV9BTllfSUQpKSAmJgoKCQkgICAgKChwY2lfc3ViZGV2aWNlX2lkID09
IGVudC0+c3ViZGV2aWNlX2lkKSB8fAoJCSAgICAoZW50LT5zdWJkZXZpY2VfaWQgPT0gUENJX0FO
WV9JRCkpKSB7CgkJCXNwcmludGYoYWRhcHRlcl9uYW1lLCAiJXMgJXMiLAoJCQkJZW1fc3RyaW5n
c1tlbnQtPmluZGV4XSwKCQkJCWVtX2RyaXZlcl92ZXJzaW9uKTsKCQkJZGV2aWNlX3NldF9kZXNj
X2NvcHkoZGV2LCBhZGFwdGVyX25hbWUpOwoJCQlyZXR1cm4gKEJVU19QUk9CRV9ERUZBVUxUKTsK
CQl9CgkJZW50Kys7Cgl9CgoJcmV0dXJuIChFTlhJTyk7Cn0KCi8qKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogIERl
dmljZSBpbml0aWFsaXphdGlvbiByb3V0aW5lCiAqCiAqICBUaGUgYXR0YWNoIGVudHJ5IHBvaW50
IGlzIGNhbGxlZCB3aGVuIHRoZSBkcml2ZXIgaXMgYmVpbmcgbG9hZGVkLgogKiAgVGhpcyByb3V0
aW5lIGlkZW50aWZpZXMgdGhlIHR5cGUgb2YgaGFyZHdhcmUsIGFsbG9jYXRlcyBhbGwgcmVzb3Vy
Y2VzCiAqICBhbmQgaW5pdGlhbGl6ZXMgdGhlIGhhcmR3YXJlLgogKgogKiAgcmV0dXJuIDAgb24g
c3VjY2VzcywgcG9zaXRpdmUgb24gZmFpbHVyZQogKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc3RhdGljIGludApl
bV9hdHRhY2goZGV2aWNlX3QgZGV2KQp7CglzdHJ1Y3QgYWRhcHRlcgkqYWRhcHRlcjsKCWludAkJ
ZXJyb3IgPSAwOwoKCUlOSVRfREVCVUdPVVQoImVtX2F0dGFjaDogYmVnaW4iKTsKCglhZGFwdGVy
ID0gZGV2aWNlX2dldF9zb2Z0YyhkZXYpOwoJYWRhcHRlci0+ZGV2ID0gYWRhcHRlci0+b3NkZXAu
ZGV2ID0gZGV2OwoJRU1fQ09SRV9MT0NLX0lOSVQoYWRhcHRlciwgZGV2aWNlX2dldF9uYW1ldW5p
dChkZXYpKTsKCgkvKiBTWVNDVEwgc3R1ZmYgKi8KCVNZU0NUTF9BRERfUFJPQyhkZXZpY2VfZ2V0
X3N5c2N0bF9jdHgoZGV2KSwKCSAgICBTWVNDVExfQ0hJTERSRU4oZGV2aWNlX2dldF9zeXNjdGxf
dHJlZShkZXYpKSwKCSAgICBPSURfQVVUTywgIm52bSIsIENUTFRZUEVfSU5UfENUTEZMQUdfUlcs
IGFkYXB0ZXIsIDAsCgkgICAgZW1fc3lzY3RsX252bV9pbmZvLCAiSSIsICJOVk0gSW5mb3JtYXRp
b24iKTsKCgljYWxsb3V0X2luaXRfbXR4KCZhZGFwdGVyLT50aW1lciwgJmFkYXB0ZXItPmNvcmVf
bXR4LCAwKTsKCgkvKiBEZXRlcm1pbmUgaGFyZHdhcmUgYW5kIG1hYyBpbmZvICovCgllbV9pZGVu
dGlmeV9oYXJkd2FyZShhZGFwdGVyKTsKCgkvKiBTZXR1cCBQQ0kgcmVzb3VyY2VzICovCglpZiAo
ZW1fYWxsb2NhdGVfcGNpX3Jlc291cmNlcyhhZGFwdGVyKSkgewoJCWRldmljZV9wcmludGYoZGV2
LCAiQWxsb2NhdGlvbiBvZiBQQ0kgcmVzb3VyY2VzIGZhaWxlZFxuIik7CgkJZXJyb3IgPSBFTlhJ
TzsKCQlnb3RvIGVycl9wY2k7Cgl9CgoJLyoKCSoqIEZvciBJQ0g4IGFuZCBmYW1pbHkgd2UgbmVl
ZCB0bwoJKiogbWFwIHRoZSBmbGFzaCBtZW1vcnksIGFuZCB0aGlzCgkqKiBtdXN0IGhhcHBlbiBh
ZnRlciB0aGUgTUFDIGlzIAoJKiogaWRlbnRpZmllZAoJKi8KCWlmICgoYWRhcHRlci0+aHcubWFj
LnR5cGUgPT0gZTEwMDBfaWNoOGxhbikgfHwKCSAgICAoYWRhcHRlci0+aHcubWFjLnR5cGUgPT0g
ZTEwMDBfcGNobGFuKSB8fAoJICAgIChhZGFwdGVyLT5ody5tYWMudHlwZSA9PSBlMTAwMF9pY2g5
bGFuKSB8fAoJICAgIChhZGFwdGVyLT5ody5tYWMudHlwZSA9PSBlMTAwMF9pY2gxMGxhbikpIHsK
CQlpbnQgcmlkID0gRU1fQkFSX1RZUEVfRkxBU0g7CgkJYWRhcHRlci0+Zmxhc2ggPSBidXNfYWxs
b2NfcmVzb3VyY2VfYW55KGRldiwKCQkgICAgU1lTX1JFU19NRU1PUlksICZyaWQsIFJGX0FDVElW
RSk7CgkJaWYgKGFkYXB0ZXItPmZsYXNoID09IE5VTEwpIHsKCQkJZGV2aWNlX3ByaW50ZihkZXYs
ICJNYXBwaW5nIG9mIEZsYXNoIGZhaWxlZFxuIik7CgkJCWVycm9yID0gRU5YSU87CgkJCWdvdG8g
ZXJyX3BjaTsKCQl9CgkJLyogVGhpcyBpcyB1c2VkIGluIHRoZSBzaGFyZWQgY29kZSAqLwoJCWFk
YXB0ZXItPmh3LmZsYXNoX2FkZHJlc3MgPSAodTggKilhZGFwdGVyLT5mbGFzaDsKCQlhZGFwdGVy
LT5vc2RlcC5mbGFzaF9idXNfc3BhY2VfdGFnID0KCQkgICAgcm1hbl9nZXRfYnVzdGFnKGFkYXB0
ZXItPmZsYXNoKTsKCQlhZGFwdGVyLT5vc2RlcC5mbGFzaF9idXNfc3BhY2VfaGFuZGxlID0KCQkg
ICAgcm1hbl9nZXRfYnVzaGFuZGxlKGFkYXB0ZXItPmZsYXNoKTsKCX0KCgkvKiBEbyBTaGFyZWQg
Q29kZSBpbml0aWFsaXphdGlvbiAqLwoJaWYgKGUxMDAwX3NldHVwX2luaXRfZnVuY3MoJmFkYXB0
ZXItPmh3LCBUUlVFKSkgewoJCWRldmljZV9wcmludGYoZGV2LCAiU2V0dXAgb2YgU2hhcmVkIGNv
ZGUgZmFpbGVkXG4iKTsKCQllcnJvciA9IEVOWElPOwoJCWdvdG8gZXJyX3BjaTsKCX0KCgllMTAw
MF9nZXRfYnVzX2luZm8oJmFkYXB0ZXItPmh3KTsKCgkvKiBTZXQgdXAgc29tZSBzeXNjdGxzIGZv
ciB0aGUgdHVuYWJsZSBpbnRlcnJ1cHQgZGVsYXlzICovCgllbV9hZGRfaW50X2RlbGF5X3N5c2N0
bChhZGFwdGVyLCAicnhfaW50X2RlbGF5IiwKCSAgICAicmVjZWl2ZSBpbnRlcnJ1cHQgZGVsYXkg
aW4gdXNlY3MiLCAmYWRhcHRlci0+cnhfaW50X2RlbGF5LAoJICAgIEUxMDAwX1JFR0lTVEVSKCZh
ZGFwdGVyLT5odywgRTEwMDBfUkRUUiksIGVtX3J4X2ludF9kZWxheV9kZmx0KTsKCWVtX2FkZF9p
bnRfZGVsYXlfc3lzY3RsKGFkYXB0ZXIsICJ0eF9pbnRfZGVsYXkiLAoJICAgICJ0cmFuc21pdCBp
bnRlcnJ1cHQgZGVsYXkgaW4gdXNlY3MiLCAmYWRhcHRlci0+dHhfaW50X2RlbGF5LAoJICAgIEUx
MDAwX1JFR0lTVEVSKCZhZGFwdGVyLT5odywgRTEwMDBfVElEViksIGVtX3R4X2ludF9kZWxheV9k
Zmx0KTsKCWVtX2FkZF9pbnRfZGVsYXlfc3lzY3RsKGFkYXB0ZXIsICJyeF9hYnNfaW50X2RlbGF5
IiwKCSAgICAicmVjZWl2ZSBpbnRlcnJ1cHQgZGVsYXkgbGltaXQgaW4gdXNlY3MiLAoJICAgICZh
ZGFwdGVyLT5yeF9hYnNfaW50X2RlbGF5LAoJICAgIEUxMDAwX1JFR0lTVEVSKCZhZGFwdGVyLT5o
dywgRTEwMDBfUkFEViksCgkgICAgZW1fcnhfYWJzX2ludF9kZWxheV9kZmx0KTsKCWVtX2FkZF9p
bnRfZGVsYXlfc3lzY3RsKGFkYXB0ZXIsICJ0eF9hYnNfaW50X2RlbGF5IiwKCSAgICAidHJhbnNt
aXQgaW50ZXJydXB0IGRlbGF5IGxpbWl0IGluIHVzZWNzIiwKCSAgICAmYWRhcHRlci0+dHhfYWJz
X2ludF9kZWxheSwKCSAgICBFMTAwMF9SRUdJU1RFUigmYWRhcHRlci0+aHcsIEUxMDAwX1RBRFYp
LAoJICAgIGVtX3R4X2Fic19pbnRfZGVsYXlfZGZsdCk7CgoJLyogU3lzY3RscyBmb3IgbGltaXRp
bmcgdGhlIGFtb3VudCBvZiB3b3JrIGRvbmUgaW4gdGhlIHRhc2txdWV1ZSAqLwoJZW1fYWRkX3J4
X3Byb2Nlc3NfbGltaXQoYWRhcHRlciwgInJ4X3Byb2Nlc3NpbmdfbGltaXQiLAoJICAgICJtYXgg
bnVtYmVyIG9mIHJ4IHBhY2tldHMgdG8gcHJvY2VzcyIsICZhZGFwdGVyLT5yeF9wcm9jZXNzX2xp
bWl0LAoJICAgIGVtX3J4X3Byb2Nlc3NfbGltaXQpOwoKCS8qCgkgKiBWYWxpZGF0ZSBudW1iZXIg
b2YgdHJhbnNtaXQgYW5kIHJlY2VpdmUgZGVzY3JpcHRvcnMuIEl0CgkgKiBtdXN0IG5vdCBleGNl
ZWQgaGFyZHdhcmUgbWF4aW11bSwgYW5kIG11c3QgYmUgbXVsdGlwbGUKCSAqIG9mIEUxMDAwX0RC
QV9BTElHTi4KCSAqLwoJaWYgKCgoZW1fdHhkICogc2l6ZW9mKHN0cnVjdCBlMTAwMF90eF9kZXNj
KSkgJSBFTV9EQkFfQUxJR04pICE9IDAgfHwKCSAgICAoZW1fdHhkID4gRU1fTUFYX1RYRCkgfHwg
KGVtX3R4ZCA8IEVNX01JTl9UWEQpKSB7CgkJZGV2aWNlX3ByaW50ZihkZXYsICJVc2luZyAlZCBU
WCBkZXNjcmlwdG9ycyBpbnN0ZWFkIG9mICVkIVxuIiwKCQkgICAgRU1fREVGQVVMVF9UWEQsIGVt
X3R4ZCk7CgkJYWRhcHRlci0+bnVtX3R4X2Rlc2MgPSBFTV9ERUZBVUxUX1RYRDsKCX0gZWxzZQoJ
CWFkYXB0ZXItPm51bV90eF9kZXNjID0gZW1fdHhkOwoKCWlmICgoKGVtX3J4ZCAqIHNpemVvZihz
dHJ1Y3QgZTEwMDBfcnhfZGVzYykpICUgRU1fREJBX0FMSUdOKSAhPSAwIHx8CgkgICAgKGVtX3J4
ZCA+IEVNX01BWF9SWEQpIHx8IChlbV9yeGQgPCBFTV9NSU5fUlhEKSkgewoJCWRldmljZV9wcmlu
dGYoZGV2LCAiVXNpbmcgJWQgUlggZGVzY3JpcHRvcnMgaW5zdGVhZCBvZiAlZCFcbiIsCgkJICAg
IEVNX0RFRkFVTFRfUlhELCBlbV9yeGQpOwoJCWFkYXB0ZXItPm51bV9yeF9kZXNjID0gRU1fREVG
QVVMVF9SWEQ7Cgl9IGVsc2UKCQlhZGFwdGVyLT5udW1fcnhfZGVzYyA9IGVtX3J4ZDsKCglhZGFw
dGVyLT5ody5tYWMuYXV0b25lZyA9IERPX0FVVE9fTkVHOwoJYWRhcHRlci0+aHcucGh5LmF1dG9u
ZWdfd2FpdF90b19jb21wbGV0ZSA9IEZBTFNFOwoJYWRhcHRlci0+aHcucGh5LmF1dG9uZWdfYWR2
ZXJ0aXNlZCA9IEFVVE9ORUdfQURWX0RFRkFVTFQ7CgoJLyogQ29wcGVyIG9wdGlvbnMgKi8KCWlm
IChhZGFwdGVyLT5ody5waHkubWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcikg
ewoJCWFkYXB0ZXItPmh3LnBoeS5tZGl4ID0gQVVUT19BTExfTU9ERVM7CgkJYWRhcHRlci0+aHcu
cGh5LmRpc2FibGVfcG9sYXJpdHlfY29ycmVjdGlvbiA9IEZBTFNFOwoJCWFkYXB0ZXItPmh3LnBo
eS5tc190eXBlID0gRU1fTUFTVEVSX1NMQVZFOwoJfQoKCS8qCgkgKiBTZXQgdGhlIGZyYW1lIGxp
bWl0cyBhc3N1bWluZwoJICogc3RhbmRhcmQgZXRoZXJuZXQgc2l6ZWQgZnJhbWVzLgoJICovCglh
ZGFwdGVyLT5tYXhfZnJhbWVfc2l6ZSA9IEVUSEVSTVRVICsgRVRIRVJfSERSX0xFTiArIEVUSEVS
TkVUX0ZDU19TSVpFOwoJYWRhcHRlci0+bWluX2ZyYW1lX3NpemUgPSBFVEhfWkxFTiArIEVUSEVS
TkVUX0ZDU19TSVpFOwoKCS8qCgkgKiBUaGlzIGNvbnRyb2xzIHdoZW4gaGFyZHdhcmUgcmVwb3J0
cyB0cmFuc21pdCBjb21wbGV0aW9uCgkgKiBzdGF0dXMuCgkgKi8KCWFkYXB0ZXItPmh3Lm1hYy5y
ZXBvcnRfdHhfZWFybHkgPSAxOwoKCS8qIAoJKiogR2V0IHF1ZXVlL3JpbmcgbWVtb3J5CgkqLwoJ
aWYgKGVtX2FsbG9jYXRlX3F1ZXVlcyhhZGFwdGVyKSkgewoJCWVycm9yID0gRU5PTUVNOwoJCWdv
dG8gZXJyX3BjaTsKCX0KCgkvKgoJKiogU3RhcnQgZnJvbSBhIGtub3duIHN0YXRlLCB0aGlzIGlz
CgkqKiBpbXBvcnRhbnQgaW4gcmVhZGluZyB0aGUgbnZtIGFuZAoJKiogbWFjIGZyb20gdGhhdC4K
CSovCgllMTAwMF9yZXNldF9odygmYWRhcHRlci0+aHcpOwoKCS8qIE1ha2Ugc3VyZSB3ZSBoYXZl
IGEgZ29vZCBFRVBST00gYmVmb3JlIHdlIHJlYWQgZnJvbSBpdCAqLwoJaWYgKGUxMDAwX3ZhbGlk
YXRlX252bV9jaGVja3N1bSgmYWRhcHRlci0+aHcpIDwgMCkgewoJCS8qCgkJKiogU29tZSBQQ0kt
RSBwYXJ0cyBmYWlsIHRoZSBmaXJzdCBjaGVjayBkdWUgdG8KCQkqKiB0aGUgbGluayBiZWluZyBp
biBzbGVlcCBzdGF0ZSwgY2FsbCBpdCBhZ2FpbiwKCQkqKiBpZiBpdCBmYWlscyBhIHNlY29uZCB0
aW1lIGl0cyBhIHJlYWwgaXNzdWUuCgkJKi8KCQlpZiAoZTEwMDBfdmFsaWRhdGVfbnZtX2NoZWNr
c3VtKCZhZGFwdGVyLT5odykgPCAwKSB7CgkJCWRldmljZV9wcmludGYoZGV2LAoJCQkgICAgIlRo
ZSBFRVBST00gQ2hlY2tzdW0gSXMgTm90IFZhbGlkXG4iKTsKCQkJZXJyb3IgPSBFSU87CgkJCWdv
dG8gZXJyX2xhdGU7CgkJfQoJfQoKCS8qIENvcHkgdGhlIHBlcm1hbmVudCBNQUMgYWRkcmVzcyBv
dXQgb2YgdGhlIEVFUFJPTSAqLwoJaWYgKGUxMDAwX3JlYWRfbWFjX2FkZHIoJmFkYXB0ZXItPmh3
KSA8IDApIHsKCQlkZXZpY2VfcHJpbnRmKGRldiwgIkVFUFJPTSByZWFkIGVycm9yIHdoaWxlIHJl
YWRpbmcgTUFDIgoJCSAgICAiIGFkZHJlc3NcbiIpOwoJCWVycm9yID0gRUlPOwoJCWdvdG8gZXJy
X2xhdGU7Cgl9CgoJaWYgKCFlbV9pc192YWxpZF9ldGhlcl9hZGRyKGFkYXB0ZXItPmh3Lm1hYy5h
ZGRyKSkgewoJCWRldmljZV9wcmludGYoZGV2LCAiSW52YWxpZCBNQUMgYWRkcmVzc1xuIik7CgkJ
ZXJyb3IgPSBFSU87CgkJZ290byBlcnJfbGF0ZTsKCX0KCgkvKgoJKiogIERvIGludGVycnVwdCBj
b25maWd1cmF0aW9uCgkqLwoJaWYgKGFkYXB0ZXItPm1zaXggPiAxKSAvKiBEbyBNU0lYICovCgkJ
ZXJyb3IgPSBlbV9hbGxvY2F0ZV9tc2l4KGFkYXB0ZXIpOwoJZWxzZSAgLyogTVNJIG9yIExlZ2Fj
eSAqLwoJCWVycm9yID0gZW1fYWxsb2NhdGVfbGVnYWN5KGFkYXB0ZXIpOwoJaWYgKGVycm9yKQoJ
CWdvdG8gZXJyX2xhdGU7CgoJLyoKCSAqIEdldCBXYWtlLW9uLUxhbiBhbmQgTWFuYWdlbWVudCBp
bmZvIGZvciBsYXRlciB1c2UKCSAqLwoJZW1fZ2V0X3dha2V1cChkZXYpOwoKCS8qIFNldHVwIE9T
IHNwZWNpZmljIG5ldHdvcmsgaW50ZXJmYWNlICovCgllbV9zZXR1cF9pbnRlcmZhY2UoZGV2LCBh
ZGFwdGVyKTsKCgllbV9yZXNldChhZGFwdGVyKTsKCgkvKiBJbml0aWFsaXplIHN0YXRpc3RpY3Mg
Ki8KCWVtX3VwZGF0ZV9zdGF0c19jb3VudGVycyhhZGFwdGVyKTsKCglhZGFwdGVyLT5ody5tYWMu
Z2V0X2xpbmtfc3RhdHVzID0gMTsKCWVtX3VwZGF0ZV9saW5rX3N0YXR1cyhhZGFwdGVyKTsKCgkv
KiBJbmRpY2F0ZSBTT0wvSURFUiB1c2FnZSAqLwoJaWYgKGUxMDAwX2NoZWNrX3Jlc2V0X2Jsb2Nr
KCZhZGFwdGVyLT5odykpCgkJZGV2aWNlX3ByaW50ZihkZXYsCgkJICAgICJQSFkgcmVzZXQgaXMg
YmxvY2tlZCBkdWUgdG8gU09ML0lERVIgc2Vzc2lvbi5cbiIpOwoKCS8qIFJlZ2lzdGVyIGZvciBW
TEFOIGV2ZW50cyAqLwoJYWRhcHRlci0+dmxhbl9hdHRhY2ggPSBFVkVOVEhBTkRMRVJfUkVHSVNU
RVIodmxhbl9jb25maWcsCgkgICAgZW1fcmVnaXN0ZXJfdmxhbiwgYWRhcHRlciwgRVZFTlRIQU5E
TEVSX1BSSV9GSVJTVCk7CglhZGFwdGVyLT52bGFuX2RldGFjaCA9IEVWRU5USEFORExFUl9SRUdJ
U1RFUih2bGFuX3VuY29uZmlnLAoJICAgIGVtX3VucmVnaXN0ZXJfdmxhbiwgYWRhcHRlciwgRVZF
TlRIQU5ETEVSX1BSSV9GSVJTVCk7IAoKCWVtX2FkZF9od19zdGF0cyhhZGFwdGVyKTsKCgkvKiBO
b24tQU1UIGJhc2VkIGhhcmR3YXJlIGNhbiBub3cgdGFrZSBjb250cm9sIGZyb20gZmlybXdhcmUg
Ki8KCWlmIChhZGFwdGVyLT5oYXNfbWFuYWdlICYmICFhZGFwdGVyLT5oYXNfYW10KQoJCWVtX2dl
dF9od19jb250cm9sKGFkYXB0ZXIpOwoKCS8qIFRlbGwgdGhlIHN0YWNrIHRoYXQgdGhlIGludGVy
ZmFjZSBpcyBub3QgYWN0aXZlICovCglhZGFwdGVyLT5pZnAtPmlmX2Rydl9mbGFncyAmPSB+KElG
Rl9EUlZfUlVOTklORyB8IElGRl9EUlZfT0FDVElWRSk7CgoJYWRhcHRlci0+bGVkX2RldiA9IGxl
ZF9jcmVhdGUoZW1fbGVkX2Z1bmMsIGFkYXB0ZXIsCgkgICAgZGV2aWNlX2dldF9uYW1ldW5pdChk
ZXYpKTsKCglJTklUX0RFQlVHT1VUKCJlbV9hdHRhY2g6IGVuZCIpOwoKCXJldHVybiAoMCk7Cgpl
cnJfbGF0ZToKCWVtX2ZyZWVfdHJhbnNtaXRfc3RydWN0dXJlcyhhZGFwdGVyKTsKCWVtX2ZyZWVf
cmVjZWl2ZV9zdHJ1Y3R1cmVzKGFkYXB0ZXIpOwoJZW1fcmVsZWFzZV9od19jb250cm9sKGFkYXB0
ZXIpOwplcnJfcGNpOgoJZW1fZnJlZV9wY2lfcmVzb3VyY2VzKGFkYXB0ZXIpOwoJRU1fQ09SRV9M
T0NLX0RFU1RST1koYWRhcHRlcik7CgoJcmV0dXJuIChlcnJvcik7Cn0KCi8qKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioK
ICogIERldmljZSByZW1vdmFsIHJvdXRpbmUKICoKICogIFRoZSBkZXRhY2ggZW50cnkgcG9pbnQg
aXMgY2FsbGVkIHdoZW4gdGhlIGRyaXZlciBpcyBiZWluZyByZW1vdmVkLgogKiAgVGhpcyByb3V0
aW5lIHN0b3BzIHRoZSBhZGFwdGVyIGFuZCBkZWFsbG9jYXRlcyBhbGwgdGhlIHJlc291cmNlcwog
KiAgdGhhdCB3ZXJlIGFsbG9jYXRlZCBmb3IgZHJpdmVyIG9wZXJhdGlvbi4KICoKICogIHJldHVy
biAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIG9uIGZhaWx1cmUKICoqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRp
YyBpbnQKZW1fZGV0YWNoKGRldmljZV90IGRldikKewoJc3RydWN0IGFkYXB0ZXIJKmFkYXB0ZXIg
PSBkZXZpY2VfZ2V0X3NvZnRjKGRldik7CglzdHJ1Y3QgaWZuZXQJKmlmcCA9IGFkYXB0ZXItPmlm
cDsKCglJTklUX0RFQlVHT1VUKCJlbV9kZXRhY2g6IGJlZ2luIik7CgoJLyogTWFrZSBzdXJlIFZM
QU5TIGFyZSBub3QgdXNpbmcgZHJpdmVyICovCglpZiAoYWRhcHRlci0+aWZwLT5pZl92bGFudHJ1
bmsgIT0gTlVMTCkgewoJCWRldmljZV9wcmludGYoZGV2LCJWbGFuIGluIHVzZSwgZGV0YWNoIGZp
cnN0XG4iKTsKCQlyZXR1cm4gKEVCVVNZKTsKCX0KCiNpZmRlZiBERVZJQ0VfUE9MTElORwoJaWYg
KGlmcC0+aWZfY2FwZW5hYmxlICYgSUZDQVBfUE9MTElORykKCQlldGhlcl9wb2xsX2RlcmVnaXN0
ZXIoaWZwKTsKI2VuZGlmCgoJaWYgKGFkYXB0ZXItPmxlZF9kZXYgIT0gTlVMTCkKCQlsZWRfZGVz
dHJveShhZGFwdGVyLT5sZWRfZGV2KTsKCglFTV9DT1JFX0xPQ0soYWRhcHRlcik7CglhZGFwdGVy
LT5pbl9kZXRhY2ggPSAxOwoJZW1fc3RvcChhZGFwdGVyKTsKCUVNX0NPUkVfVU5MT0NLKGFkYXB0
ZXIpOwoJRU1fQ09SRV9MT0NLX0RFU1RST1koYWRhcHRlcik7CgoJZTEwMDBfcGh5X2h3X3Jlc2V0
KCZhZGFwdGVyLT5odyk7CgoJZW1fcmVsZWFzZV9tYW5hZ2VhYmlsaXR5KGFkYXB0ZXIpOwoJZW1f
cmVsZWFzZV9od19jb250cm9sKGFkYXB0ZXIpOwoKCS8qIFVucmVnaXN0ZXIgVkxBTiBldmVudHMg
Ki8KCWlmIChhZGFwdGVyLT52bGFuX2F0dGFjaCAhPSBOVUxMKQoJCUVWRU5USEFORExFUl9ERVJF
R0lTVEVSKHZsYW5fY29uZmlnLCBhZGFwdGVyLT52bGFuX2F0dGFjaCk7CglpZiAoYWRhcHRlci0+
dmxhbl9kZXRhY2ggIT0gTlVMTCkKCQlFVkVOVEhBTkRMRVJfREVSRUdJU1RFUih2bGFuX3VuY29u
ZmlnLCBhZGFwdGVyLT52bGFuX2RldGFjaCk7IAoKCWV0aGVyX2lmZGV0YWNoKGFkYXB0ZXItPmlm
cCk7CgljYWxsb3V0X2RyYWluKCZhZGFwdGVyLT50aW1lcik7CgoJZW1fZnJlZV9wY2lfcmVzb3Vy
Y2VzKGFkYXB0ZXIpOwoJYnVzX2dlbmVyaWNfZGV0YWNoKGRldik7CglpZl9mcmVlKGlmcCk7CgoJ
ZW1fZnJlZV90cmFuc21pdF9zdHJ1Y3R1cmVzKGFkYXB0ZXIpOwoJZW1fZnJlZV9yZWNlaXZlX3N0
cnVjdHVyZXMoYWRhcHRlcik7CgoJZW1fcmVsZWFzZV9od19jb250cm9sKGFkYXB0ZXIpOwoKCXJl
dHVybiAoMCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIFNodXRkb3duIGVudHJ5IHBvaW50CiAq
CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqLwoKc3RhdGljIGludAplbV9zaHV0ZG93bihkZXZpY2VfdCBkZXYpCnsK
CXJldHVybiBlbV9zdXNwZW5kKGRldik7Cn0KCi8qCiAqIFN1c3BlbmQvcmVzdW1lIGRldmljZSBt
ZXRob2RzLgogKi8Kc3RhdGljIGludAplbV9zdXNwZW5kKGRldmljZV90IGRldikKewoJc3RydWN0
IGFkYXB0ZXIgKmFkYXB0ZXIgPSBkZXZpY2VfZ2V0X3NvZnRjKGRldik7CgoJRU1fQ09SRV9MT0NL
KGFkYXB0ZXIpOwoKICAgICAgICBlbV9yZWxlYXNlX21hbmFnZWFiaWxpdHkoYWRhcHRlcik7Cgll
bV9yZWxlYXNlX2h3X2NvbnRyb2woYWRhcHRlcik7CgllbV9lbmFibGVfd2FrZXVwKGRldik7CgoJ
RU1fQ09SRV9VTkxPQ0soYWRhcHRlcik7CgoJcmV0dXJuIGJ1c19nZW5lcmljX3N1c3BlbmQoZGV2
KTsKfQoKc3RhdGljIGludAplbV9yZXN1bWUoZGV2aWNlX3QgZGV2KQp7CglzdHJ1Y3QgYWRhcHRl
ciAqYWRhcHRlciA9IGRldmljZV9nZXRfc29mdGMoZGV2KTsKCXN0cnVjdCBpZm5ldCAqaWZwID0g
YWRhcHRlci0+aWZwOwoKCUVNX0NPUkVfTE9DSyhhZGFwdGVyKTsKCWVtX2luaXRfbG9ja2VkKGFk
YXB0ZXIpOwoJZW1faW5pdF9tYW5hZ2VhYmlsaXR5KGFkYXB0ZXIpOwoJRU1fQ09SRV9VTkxPQ0so
YWRhcHRlcik7CgllbV9zdGFydChpZnApOwoKCXJldHVybiBidXNfZ2VuZXJpY19yZXN1bWUoZGV2
KTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioKICogIFRyYW5zbWl0IGVudHJ5IHBvaW50CiAqCiAqICBlbV9z
dGFydCBpcyBjYWxsZWQgYnkgdGhlIHN0YWNrIHRvIGluaXRpYXRlIGEgdHJhbnNtaXQuCiAqICBU
aGUgZHJpdmVyIHdpbGwgcmVtYWluIGluIHRoaXMgcm91dGluZSBhcyBsb25nIGFzIHRoZXJlIGFy
ZQogKiAgcGFja2V0cyB0byB0cmFuc21pdCBhbmQgdHJhbnNtaXQgcmVzb3VyY2VzIGFyZSBhdmFp
bGFibGUuCiAqICBJbiBjYXNlIHJlc291cmNlcyBhcmUgbm90IGF2YWlsYWJsZSBzdGFjayBpcyBu
b3RpZmllZCBhbmQKICogIHRoZSBwYWNrZXQgaXMgcmVxdWV1ZWQuCiAqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoK
I2lmZGVmIEVNX01VTFRJUVVFVUUKc3RhdGljIGludAplbV9tcV9zdGFydF9sb2NrZWQoc3RydWN0
IGlmbmV0ICppZnAsIHN0cnVjdCB0eF9yaW5nICp0eHIsIHN0cnVjdCBtYnVmICptKQp7CglzdHJ1
Y3QgYWRhcHRlciAgKmFkYXB0ZXIgPSB0eHItPmFkYXB0ZXI7CiAgICAgICAgc3RydWN0IG1idWYg
ICAgICpuZXh0OwogICAgICAgIGludCAgICAgICAgICAgICBlcnIgPSAwLCBlbnEgPSAwOwoKCWlm
ICgoaWZwLT5pZl9kcnZfZmxhZ3MgJiAoSUZGX0RSVl9SVU5OSU5HIHwgSUZGX0RSVl9PQUNUSVZF
KSkgIT0KCSAgICBJRkZfRFJWX1JVTk5JTkcgfHwgYWRhcHRlci0+bGlua19hY3RpdmUgPT0gMCkg
ewoJCWlmIChtICE9IE5VTEwpCgkJCWVyciA9IGRyYnJfZW5xdWV1ZShpZnAsIHR4ci0+YnIsIG0p
OwoJCXJldHVybiAoZXJyKTsKCX0KCiAgICAgICAgLyogQ2FsbCBjbGVhbnVwIGlmIG51bWJlciBv
ZiBUWCBkZXNjcmlwdG9ycyBsb3cgKi8KCWlmICh0eHItPnR4X2F2YWlsIDw9IEVNX1RYX0NMRUFO
VVBfVEhSRVNIT0xEKQoJCWVtX3R4ZW9mKHR4cik7CgoJZW5xID0gMDsKCWlmIChtID09IE5VTEwp
IHsKCQluZXh0ID0gZHJicl9kZXF1ZXVlKGlmcCwgdHhyLT5icik7Cgl9IGVsc2UgaWYgKGRyYnJf
bmVlZHNfZW5xdWV1ZShpZnAsIHR4ci0+YnIpKSB7CgkJaWYgKChlcnIgPSBkcmJyX2VucXVldWUo
aWZwLCB0eHItPmJyLCBtKSkgIT0gMCkKCQkJcmV0dXJuIChlcnIpOwoJCW5leHQgPSBkcmJyX2Rl
cXVldWUoaWZwLCB0eHItPmJyKTsKCX0gZWxzZQoJCW5leHQgPSBtOwoKCS8qIFByb2Nlc3MgdGhl
IHF1ZXVlICovCgl3aGlsZSAobmV4dCAhPSBOVUxMKSB7CgkJaWYgKChlcnIgPSBlbV94bWl0KHR4
ciwgJm5leHQpKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ICE9IE5V
TEwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gZHJicl9lbnF1ZXVlKGlm
cCwgdHhyLT5iciwgbmV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJCX0KCQll
bnErKzsKCQlkcmJyX3N0YXRzX3VwZGF0ZShpZnAsIG5leHQtPm1fcGt0aGRyLmxlbiwgbmV4dC0+
bV9mbGFncyk7CgkJRVRIRVJfQlBGX01UQVAoaWZwLCBuZXh0KTsKCQlpZiAoKGlmcC0+aWZfZHJ2
X2ZsYWdzICYgSUZGX0RSVl9SVU5OSU5HKSA9PSAwKQogICAgICAgICAgICAgICAgICAgICAgICBi
cmVhazsKCQlpZiAodHhyLT50eF9hdmFpbCA8IEVNX01BWF9TQ0FUVEVSKSB7CgkJCWlmcC0+aWZf
ZHJ2X2ZsYWdzIHw9IElGRl9EUlZfT0FDVElWRTsKCQkJYnJlYWs7CgkJfQoJCW5leHQgPSBkcmJy
X2RlcXVldWUoaWZwLCB0eHItPmJyKTsKCX0KCglpZiAoZW5xID4gMCkgewogICAgICAgICAgICAg
ICAgLyogU2V0IHRoZSB3YXRjaGRvZyAqLwogICAgICAgICAgICAgICAgdHhyLT53YXRjaGRvZ19j
aGVjayA9IFRSVUU7CgkJdHhyLT53YXRjaGRvZ190aW1lID0gdGlja3M7Cgl9CglyZXR1cm4gKGVy
cik7Cn0KCi8qCioqIE11bHRpcXVldWUgY2FwYWJsZSBzdGFjayBpbnRlcmZhY2UsIHRoaXMgaXMg
bm90CioqIHlldCB0cnVlbHkgbXVsdGlxdWV1ZSwgYnV0IHRoYXQgaXMgY29taW5nLi4uCiovCnN0
YXRpYyBpbnQKZW1fbXFfc3RhcnQoc3RydWN0IGlmbmV0ICppZnAsIHN0cnVjdCBtYnVmICptKQp7
CglzdHJ1Y3QgYWRhcHRlcgkqYWRhcHRlciA9IGlmcC0+aWZfc29mdGM7CglzdHJ1Y3QgdHhfcmlu
ZwkqdHhyOwoJaW50IAkJaSwgZXJyb3IgPSAwOwoKCS8qIFdoaWNoIHF1ZXVlIHRvIHVzZSAqLwoJ
aWYgKChtLT5tX2ZsYWdzICYgTV9GTE9XSUQpICE9IDApCiAgICAgICAgICAgICAgICBpID0gbS0+
bV9wa3RoZHIuZmxvd2lkICUgYWRhcHRlci0+bnVtX3F1ZXVlczsKCWVsc2UKCQlpID0gY3VyY3B1
ICUgYWRhcHRlci0+bnVtX3F1ZXVlczsKCgl0eHIgPSAmYWRhcHRlci0+dHhfcmluZ3NbaV07CgoJ
aWYgKEVNX1RYX1RSWUxPQ0sodHhyKSkgewoJCWVycm9yID0gZW1fbXFfc3RhcnRfbG9ja2VkKGlm
cCwgdHhyLCBtKTsKCQlFTV9UWF9VTkxPQ0sodHhyKTsKCX0gZWxzZSAKCQllcnJvciA9IGRyYnJf
ZW5xdWV1ZShpZnAsIHR4ci0+YnIsIG0pOwoKCXJldHVybiAoZXJyb3IpOwp9CgovKgoqKiBGbHVz
aCBhbGwgcmluZyBidWZmZXJzCiovCnN0YXRpYyB2b2lkCmVtX3FmbHVzaChzdHJ1Y3QgaWZuZXQg
KmlmcCkKewoJc3RydWN0IGFkYXB0ZXIgICphZGFwdGVyID0gaWZwLT5pZl9zb2Z0YzsKCXN0cnVj
dCB0eF9yaW5nICAqdHhyID0gYWRhcHRlci0+dHhfcmluZ3M7CglzdHJ1Y3QgbWJ1ZiAgICAgKm07
CgoJZm9yIChpbnQgaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1fcXVldWVzOyBpKyssIHR4cisrKSB7
CgkJRU1fVFhfTE9DSyh0eHIpOwoJCXdoaWxlICgobSA9IGJ1Zl9yaW5nX2RlcXVldWVfc2ModHhy
LT5icikpICE9IE5VTEwpCgkJCW1fZnJlZW0obSk7CgkJRU1fVFhfVU5MT0NLKHR4cik7Cgl9Cglp
Zl9xZmx1c2goaWZwKTsKfQoKI2VuZGlmIC8qIEVNX01VTFRJUVVFVUUgKi8KCnN0YXRpYyB2b2lk
CmVtX3N0YXJ0X2xvY2tlZChzdHJ1Y3QgaWZuZXQgKmlmcCwgc3RydWN0IHR4X3JpbmcgKnR4cikK
ewoJc3RydWN0IGFkYXB0ZXIJKmFkYXB0ZXIgPSBpZnAtPmlmX3NvZnRjOwoJc3RydWN0IG1idWYJ
Km1faGVhZDsKCglFTV9UWF9MT0NLX0FTU0VSVCh0eHIpOwoKCWlmICgoaWZwLT5pZl9kcnZfZmxh
Z3MgJiAoSUZGX0RSVl9SVU5OSU5HfElGRl9EUlZfT0FDVElWRSkpICE9CgkgICAgSUZGX0RSVl9S
VU5OSU5HKQoJCXJldHVybjsKCglpZiAoIWFkYXB0ZXItPmxpbmtfYWN0aXZlKQoJCXJldHVybjsK
CiAgICAgICAgLyogQ2FsbCBjbGVhbnVwIGlmIG51bWJlciBvZiBUWCBkZXNjcmlwdG9ycyBsb3cg
Ki8KCWlmICh0eHItPnR4X2F2YWlsIDw9IEVNX1RYX0NMRUFOVVBfVEhSRVNIT0xEKQoJCWVtX3R4
ZW9mKHR4cik7CgoJd2hpbGUgKCFJRlFfRFJWX0lTX0VNUFRZKCZpZnAtPmlmX3NuZCkpIHsKCQlp
ZiAodHhyLT50eF9hdmFpbCA8IEVNX01BWF9TQ0FUVEVSKSB7CgkJCWlmcC0+aWZfZHJ2X2ZsYWdz
IHw9IElGRl9EUlZfT0FDVElWRTsKCQkJYnJlYWs7CgkJfQogICAgICAgICAgICAgICAgSUZRX0RS
Vl9ERVFVRVVFKCZpZnAtPmlmX3NuZCwgbV9oZWFkKTsKCQlpZiAobV9oZWFkID09IE5VTEwpCgkJ
CWJyZWFrOwoJCS8qCgkJICogIEVuY2Fwc3VsYXRpb24gY2FuIG1vZGlmeSBvdXIgcG9pbnRlciwg
YW5kIG9yIG1ha2UgaXQKCQkgKiAgTlVMTCBvbiBmYWlsdXJlLiAgSW4gdGhhdCBldmVudCwgd2Ug
Y2FuJ3QgcmVxdWV1ZS4KCQkgKi8KCQlpZihtX2hlYWQtPm1fZmxhZ3MgJiBNX0JZUEFTU19IRUFE
KSB7CgkJCXN0cnVjdCB0aW1lc3BlYyB0bSA7CgkJCXVuc2lnbmVkIGNoYXIgYnVmWzEyOF07CgoJ
CQluYW5vdXB0aW1lKCAmdG0gKTsKCQkJc3ByaW50ZiggYnVmLCAiJWxkLiUwNmxkIiwgdG0udHZf
c2VjLCB0bS50dl9uc2VjICkgOwoJCQlpZiAoYWx0cV9kZWJ1ZyAmIDB4MTApCgkJCQlwcmludGYo
IiVzIG1idWYgJXBcbiIsX19GVU5DVElPTl9fLG1faGVhZCk7CgkJCWRldmN0bF9ub3RpZnkoIlNZ
U1RFTSIsICJCWVBBU1MiLCAiVElNRSIsIGJ1ZiApIDsKCgoJCX0KCgkJaWYgKGVtX3htaXQodHhy
LCAmbV9oZWFkKSkgewoJCQlpZiAobV9oZWFkID09IE5VTEwpCgkJCQlicmVhazsKCQkJaWZwLT5p
Zl9kcnZfZmxhZ3MgfD0gSUZGX0RSVl9PQUNUSVZFOwoJCQlJRlFfRFJWX1BSRVBFTkQoJmlmcC0+
aWZfc25kLCBtX2hlYWQpOwoJCQlicmVhazsKCQl9CgoJCS8qIFNlbmQgYSBjb3B5IG9mIHRoZSBm
cmFtZSB0byB0aGUgQlBGIGxpc3RlbmVyICovCgkJRVRIRVJfQlBGX01UQVAoaWZwLCBtX2hlYWQp
OwoKCQkvKiBTZXQgdGltZW91dCBpbiBjYXNlIGhhcmR3YXJlIGhhcyBwcm9ibGVtcyB0cmFuc21p
dHRpbmcuICovCgkJdHhyLT53YXRjaGRvZ190aW1lID0gdGlja3M7CgkJdHhyLT53YXRjaGRvZ19j
aGVjayA9IFRSVUU7Cgl9CgoJcmV0dXJuOwp9CgpzdGF0aWMgdm9pZAplbV9zdGFydChzdHJ1Y3Qg
aWZuZXQgKmlmcCkKewoJc3RydWN0IGFkYXB0ZXIJKmFkYXB0ZXIgPSBpZnAtPmlmX3NvZnRjOwoJ
c3RydWN0IHR4X3JpbmcJKnR4ciA9IGFkYXB0ZXItPnR4X3JpbmdzOwoKCWlmIChpZnAtPmlmX2Ry
dl9mbGFncyAmIElGRl9EUlZfUlVOTklORykgewoJCUVNX1RYX0xPQ0sodHhyKTsKCQllbV9zdGFy
dF9sb2NrZWQoaWZwLCB0eHIpOwoJCUVNX1RYX1VOTE9DSyh0eHIpOwoJfQoJcmV0dXJuOwp9Cgov
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqCiAqICBJb2N0bCBlbnRyeSBwb2ludAogKgogKiAgZW1faW9jdGwgaXMgY2Fs
bGVkIHdoZW4gdGhlIHVzZXIgd2FudHMgdG8gY29uZmlndXJlIHRoZQogKiAgaW50ZXJmYWNlLgog
KgogKiAgcmV0dXJuIDAgb24gc3VjY2VzcywgcG9zaXRpdmUgb24gZmFpbHVyZQogKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKi8KCnN0YXRpYyBpbnQKZW1faW9jdGwoc3RydWN0IGlmbmV0ICppZnAsIHVfbG9uZyBjb21t
YW5kLCBjYWRkcl90IGRhdGEpCnsKCXN0cnVjdCBhZGFwdGVyCSphZGFwdGVyID0gaWZwLT5pZl9z
b2Z0YzsKCXN0cnVjdCBpZnJlcSAqaWZyID0gKHN0cnVjdCBpZnJlcSAqKWRhdGE7CiNpZmRlZiBJ
TkVUCglzdHJ1Y3QgaWZhZGRyICppZmEgPSAoc3RydWN0IGlmYWRkciAqKWRhdGE7CiNlbmRpZgoJ
aW50IGVycm9yID0gMDsKCglpZiAoYWRhcHRlci0+aW5fZGV0YWNoKQoJCXJldHVybiAoZXJyb3Ip
OwoKCXN3aXRjaCAoY29tbWFuZCkgewoJY2FzZSBTSU9DU0lGQUREUjoKI2lmZGVmIElORVQKCQlp
ZiAoaWZhLT5pZmFfYWRkci0+c2FfZmFtaWx5ID09IEFGX0lORVQpIHsKCQkJLyoKCQkJICogWFhY
CgkJCSAqIFNpbmNlIHJlc2V0dGluZyBoYXJkd2FyZSB0YWtlcyBhIHZlcnkgbG9uZyB0aW1lCgkJ
CSAqIGFuZCByZXN1bHRzIGluIGxpbmsgcmVuZWdvdGlhdGlvbiB3ZSBvbmx5CgkJCSAqIGluaXRp
YWxpemUgdGhlIGhhcmR3YXJlIG9ubHkgd2hlbiBpdCBpcyBhYnNvbHV0ZWx5CgkJCSAqIHJlcXVp
cmVkLgoJCQkgKi8KCQkJaWZwLT5pZl9mbGFncyB8PSBJRkZfVVA7CgkJCWlmICghKGlmcC0+aWZf
ZHJ2X2ZsYWdzICYgSUZGX0RSVl9SVU5OSU5HKSkgewoJCQkJRU1fQ09SRV9MT0NLKGFkYXB0ZXIp
OwoJCQkJZW1faW5pdF9sb2NrZWQoYWRhcHRlcik7CgkJCQlFTV9DT1JFX1VOTE9DSyhhZGFwdGVy
KTsKCQkJfQoJCQlhcnBfaWZpbml0KGlmcCwgaWZhKTsKCQl9IGVsc2UKI2VuZGlmCgkJCWVycm9y
ID0gZXRoZXJfaW9jdGwoaWZwLCBjb21tYW5kLCBkYXRhKTsKCQlicmVhazsKCWNhc2UgU0lPQ1NJ
Rk1UVToKCSAgICB7CgkJaW50IG1heF9mcmFtZV9zaXplOwoKCQlJT0NUTF9ERUJVR09VVCgiaW9j
dGwgcmN2J2Q6IFNJT0NTSUZNVFUgKFNldCBJbnRlcmZhY2UgTVRVKSIpOwoKCQlFTV9DT1JFX0xP
Q0soYWRhcHRlcik7CgkJc3dpdGNoIChhZGFwdGVyLT5ody5tYWMudHlwZSkgewoJCWNhc2UgZTEw
MDBfODI1NzE6CgkJY2FzZSBlMTAwMF84MjU3MjoKCQljYXNlIGUxMDAwX2ljaDlsYW46CgkJY2Fz
ZSBlMTAwMF9pY2gxMGxhbjoKCQljYXNlIGUxMDAwXzgyNTc0OgoJCWNhc2UgZTEwMDBfODAwMDNl
czJsYW46CS8qIDlLIEp1bWJvIEZyYW1lIHNpemUgKi8KCQkJbWF4X2ZyYW1lX3NpemUgPSA5MjM0
OwoJCQlicmVhazsKCQljYXNlIGUxMDAwX3BjaGxhbjoKCQkJbWF4X2ZyYW1lX3NpemUgPSA0MDk2
OwoJCQlicmVhazsKCQkJLyogQWRhcHRlcnMgdGhhdCBkbyBub3Qgc3VwcG9ydCBqdW1ibyBmcmFt
ZXMgKi8KCQljYXNlIGUxMDAwXzgyNTgzOgoJCWNhc2UgZTEwMDBfaWNoOGxhbjoKCQkJbWF4X2Zy
YW1lX3NpemUgPSBFVEhFUl9NQVhfTEVOOwoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQltYXhfZnJh
bWVfc2l6ZSA9IE1BWF9KVU1CT19GUkFNRV9TSVpFOwoJCX0KCQlpZiAoaWZyLT5pZnJfbXR1ID4g
bWF4X2ZyYW1lX3NpemUgLSBFVEhFUl9IRFJfTEVOIC0KCQkgICAgRVRIRVJfQ1JDX0xFTikgewoJ
CQlFTV9DT1JFX1VOTE9DSyhhZGFwdGVyKTsKCQkJZXJyb3IgPSBFSU5WQUw7CgkJCWJyZWFrOwoJ
CX0KCgkJaWZwLT5pZl9tdHUgPSBpZnItPmlmcl9tdHU7CgkJYWRhcHRlci0+bWF4X2ZyYW1lX3Np
emUgPQoJCSAgICBpZnAtPmlmX210dSArIEVUSEVSX0hEUl9MRU4gKyBFVEhFUl9DUkNfTEVOOwoJ
CWVtX2luaXRfbG9ja2VkKGFkYXB0ZXIpOwoJCUVNX0NPUkVfVU5MT0NLKGFkYXB0ZXIpOwoJCWJy
ZWFrOwoJICAgIH0KCWNhc2UgU0lPQ1NJRkZMQUdTOgoJCUlPQ1RMX0RFQlVHT1VUKCJpb2N0bCBy
Y3YnZDpcCgkJICAgIFNJT0NTSUZGTEFHUyAoU2V0IEludGVyZmFjZSBGbGFncykiKTsKCQlFTV9D
T1JFX0xPQ0soYWRhcHRlcik7CgkJaWYgKGlmcC0+aWZfZmxhZ3MgJiBJRkZfVVApIHsKCQkJaWYg
KChpZnAtPmlmX2Rydl9mbGFncyAmIElGRl9EUlZfUlVOTklORykpIHsKCQkJCWlmICgoaWZwLT5p
Zl9mbGFncyBeIGFkYXB0ZXItPmlmX2ZsYWdzKSAmCgkJCQkgICAgKElGRl9QUk9NSVNDIHwgSUZG
X0FMTE1VTFRJKSkgewoJCQkJCWVtX2Rpc2FibGVfcHJvbWlzYyhhZGFwdGVyKTsKCQkJCQllbV9z
ZXRfcHJvbWlzYyhhZGFwdGVyKTsKCQkJCX0KCQkJfSBlbHNlCgkJCQllbV9pbml0X2xvY2tlZChh
ZGFwdGVyKTsKCQl9IGVsc2UKCQkJaWYgKGlmcC0+aWZfZHJ2X2ZsYWdzICYgSUZGX0RSVl9SVU5O
SU5HKQoJCQkJZW1fc3RvcChhZGFwdGVyKTsKCQlhZGFwdGVyLT5pZl9mbGFncyA9IGlmcC0+aWZf
ZmxhZ3M7CgkJRU1fQ09SRV9VTkxPQ0soYWRhcHRlcik7CgkJYnJlYWs7CgljYXNlIFNJT0NBRERN
VUxUSToKCWNhc2UgU0lPQ0RFTE1VTFRJOgoJCUlPQ1RMX0RFQlVHT1VUKCJpb2N0bCByY3YnZDog
U0lPQyhBRER8REVMKU1VTFRJIik7CgkJaWYgKGlmcC0+aWZfZHJ2X2ZsYWdzICYgSUZGX0RSVl9S
VU5OSU5HKSB7CgkJCUVNX0NPUkVfTE9DSyhhZGFwdGVyKTsKCQkJZW1fZGlzYWJsZV9pbnRyKGFk
YXB0ZXIpOwoJCQllbV9zZXRfbXVsdGkoYWRhcHRlcik7CiNpZmRlZiBERVZJQ0VfUE9MTElORwoJ
CQlpZiAoIShpZnAtPmlmX2NhcGVuYWJsZSAmIElGQ0FQX1BPTExJTkcpKQojZW5kaWYKCQkJCWVt
X2VuYWJsZV9pbnRyKGFkYXB0ZXIpOwoJCQlFTV9DT1JFX1VOTE9DSyhhZGFwdGVyKTsKCQl9CgkJ
YnJlYWs7CgljYXNlIFNJT0NTSUZNRURJQToKCQkvKiBDaGVjayBTT0wvSURFUiB1c2FnZSAqLwoJ
CUVNX0NPUkVfTE9DSyhhZGFwdGVyKTsKCQlpZiAoZTEwMDBfY2hlY2tfcmVzZXRfYmxvY2soJmFk
YXB0ZXItPmh3KSkgewoJCQlFTV9DT1JFX1VOTE9DSyhhZGFwdGVyKTsKCQkJZGV2aWNlX3ByaW50
ZihhZGFwdGVyLT5kZXYsICJNZWRpYSBjaGFuZ2UgaXMiCgkJCSAgICAiIGJsb2NrZWQgZHVlIHRv
IFNPTC9JREVSIHNlc3Npb24uXG4iKTsKCQkJYnJlYWs7CgkJfQoJCUVNX0NPUkVfVU5MT0NLKGFk
YXB0ZXIpOwoJY2FzZSBTSU9DR0lGTUVESUE6CgkJSU9DVExfREVCVUdPVVQoImlvY3RsIHJjdidk
OiBcCgkJICAgIFNJT0N4SUZNRURJQSAoR2V0L1NldCBJbnRlcmZhY2UgTWVkaWEpIik7CgkJZXJy
b3IgPSBpZm1lZGlhX2lvY3RsKGlmcCwgaWZyLCAmYWRhcHRlci0+bWVkaWEsIGNvbW1hbmQpOwoJ
CWJyZWFrOwoJY2FzZSBTSU9DU0lGQ0FQOgoJICAgIHsKCQlpbnQgbWFzaywgcmVpbml0OwoKCQlJ
T0NUTF9ERUJVR09VVCgiaW9jdGwgcmN2J2Q6IFNJT0NTSUZDQVAgKFNldCBDYXBhYmlsaXRpZXMp
Iik7CgkJcmVpbml0ID0gMDsKCQltYXNrID0gaWZyLT5pZnJfcmVxY2FwIF4gaWZwLT5pZl9jYXBl
bmFibGU7CiNpZmRlZiBERVZJQ0VfUE9MTElORwoJCWlmIChtYXNrICYgSUZDQVBfUE9MTElORykg
ewoJCQlpZiAoaWZyLT5pZnJfcmVxY2FwICYgSUZDQVBfUE9MTElORykgewoJCQkJZXJyb3IgPSBl
dGhlcl9wb2xsX3JlZ2lzdGVyKGVtX3BvbGwsIGlmcCk7CgkJCQlpZiAoZXJyb3IpCgkJCQkJcmV0
dXJuIChlcnJvcik7CgkJCQlFTV9DT1JFX0xPQ0soYWRhcHRlcik7CgkJCQllbV9kaXNhYmxlX2lu
dHIoYWRhcHRlcik7CgkJCQlpZnAtPmlmX2NhcGVuYWJsZSB8PSBJRkNBUF9QT0xMSU5HOwoJCQkJ
RU1fQ09SRV9VTkxPQ0soYWRhcHRlcik7CgkJCX0gZWxzZSB7CgkJCQllcnJvciA9IGV0aGVyX3Bv
bGxfZGVyZWdpc3RlcihpZnApOwoJCQkJLyogRW5hYmxlIGludGVycnVwdCBldmVuIGluIGVycm9y
IGNhc2UgKi8KCQkJCUVNX0NPUkVfTE9DSyhhZGFwdGVyKTsKCQkJCWVtX2VuYWJsZV9pbnRyKGFk
YXB0ZXIpOwoJCQkJaWZwLT5pZl9jYXBlbmFibGUgJj0gfklGQ0FQX1BPTExJTkc7CgkJCQlFTV9D
T1JFX1VOTE9DSyhhZGFwdGVyKTsKCQkJfQoJCX0KI2VuZGlmCgkJaWYgKG1hc2sgJiBJRkNBUF9I
V0NTVU0pIHsKCQkJaWZwLT5pZl9jYXBlbmFibGUgXj0gSUZDQVBfSFdDU1VNOwoJCQlyZWluaXQg
PSAxOwoJCX0KCQlpZiAobWFzayAmIElGQ0FQX1RTTzQpIHsKCQkJaWZwLT5pZl9jYXBlbmFibGUg
Xj0gSUZDQVBfVFNPNDsKCQkJcmVpbml0ID0gMTsKCQl9CgkJaWYgKG1hc2sgJiBJRkNBUF9WTEFO
X0hXVEFHR0lORykgewoJCQlpZnAtPmlmX2NhcGVuYWJsZSBePSBJRkNBUF9WTEFOX0hXVEFHR0lO
RzsKCQkJcmVpbml0ID0gMTsKCQl9CgkJaWYgKG1hc2sgJiBJRkNBUF9WTEFOX0hXRklMVEVSKSB7
CgkJCWlmcC0+aWZfY2FwZW5hYmxlIF49IElGQ0FQX1ZMQU5fSFdGSUxURVI7CgkJCXJlaW5pdCA9
IDE7CgkJfQoJCWlmICgobWFzayAmIElGQ0FQX1dPTCkgJiYKCQkgICAgKGlmcC0+aWZfY2FwYWJp
bGl0aWVzICYgSUZDQVBfV09MKSAhPSAwKSB7CgkJCWlmIChtYXNrICYgSUZDQVBfV09MX01DQVNU
KQoJCQkJaWZwLT5pZl9jYXBlbmFibGUgXj0gSUZDQVBfV09MX01DQVNUOwoJCQlpZiAobWFzayAm
IElGQ0FQX1dPTF9NQUdJQykKCQkJCWlmcC0+aWZfY2FwZW5hYmxlIF49IElGQ0FQX1dPTF9NQUdJ
QzsKCQl9CgkJaWYgKHJlaW5pdCAmJiAoaWZwLT5pZl9kcnZfZmxhZ3MgJiBJRkZfRFJWX1JVTk5J
TkcpKQoJCQllbV9pbml0KGFkYXB0ZXIpOwoJCVZMQU5fQ0FQQUJJTElUSUVTKGlmcCk7CgkJYnJl
YWs7CgkgICAgfQoKCWRlZmF1bHQ6CgkJZXJyb3IgPSBldGhlcl9pb2N0bChpZnAsIGNvbW1hbmQs
IGRhdGEpOwoJCWJyZWFrOwoJfQoKCXJldHVybiAoZXJyb3IpOwp9CgoKLyoqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgog
KiAgSW5pdCBlbnRyeSBwb2ludAogKgogKiAgVGhpcyByb3V0aW5lIGlzIHVzZWQgaW4gdHdvIHdh
eXMuIEl0IGlzIHVzZWQgYnkgdGhlIHN0YWNrIGFzCiAqICBpbml0IGVudHJ5IHBvaW50IGluIG5l
dHdvcmsgaW50ZXJmYWNlIHN0cnVjdHVyZS4gSXQgaXMgYWxzbyB1c2VkCiAqICBieSB0aGUgZHJp
dmVyIGFzIGEgaHcvc3cgaW5pdGlhbGl6YXRpb24gcm91dGluZSB0byBnZXQgdG8gYQogKiAgY29u
c2lzdGVudCBzdGF0ZS4KICoKICogIHJldHVybiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIG9uIGZh
aWx1cmUKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgdm9pZAplbV9pbml0X2xvY2tlZChzdHJ1Y3Qg
YWRhcHRlciAqYWRhcHRlcikKewoJc3RydWN0IGlmbmV0CSppZnAgPSBhZGFwdGVyLT5pZnA7Cglk
ZXZpY2VfdAlkZXYgPSBhZGFwdGVyLT5kZXY7Cgl1MzIJCXBiYTsKCglJTklUX0RFQlVHT1VUKCJl
bV9pbml0OiBiZWdpbiIpOwoKCUVNX0NPUkVfTE9DS19BU1NFUlQoYWRhcHRlcik7CgoJZW1fZGlz
YWJsZV9pbnRyKGFkYXB0ZXIpOwoJY2FsbG91dF9zdG9wKCZhZGFwdGVyLT50aW1lcik7CgoJLyoK
CSAqIFBhY2tldCBCdWZmZXIgQWxsb2NhdGlvbiAoUEJBKQoJICogV3JpdGluZyBQQkEgc2V0cyB0
aGUgcmVjZWl2ZSBwb3J0aW9uIG9mIHRoZSBidWZmZXIKCSAqIHRoZSByZW1haW5kZXIgaXMgdXNl
ZCBmb3IgdGhlIHRyYW5zbWl0IGJ1ZmZlci4KCSAqLwoJc3dpdGNoIChhZGFwdGVyLT5ody5tYWMu
dHlwZSkgewoJLyogVG90YWwgUGFja2V0IEJ1ZmZlciBvbiB0aGVzZSBpcyA0OEsgKi8KCWNhc2Ug
ZTEwMDBfODI1NzE6CgljYXNlIGUxMDAwXzgyNTcyOgoJY2FzZSBlMTAwMF84MDAwM2VzMmxhbjoK
CQkJcGJhID0gRTEwMDBfUEJBXzMySzsgLyogMzJLIGZvciBSeCwgMTZLIGZvciBUeCAqLwoJCWJy
ZWFrOwoJY2FzZSBlMTAwMF84MjU3MzogLyogODI1NzM6IFRvdGFsIFBhY2tldCBCdWZmZXIgaXMg
MzJLICovCgkJCXBiYSA9IEUxMDAwX1BCQV8xMks7IC8qIDEySyBmb3IgUngsIDIwSyBmb3IgVHgg
Ki8KCQlicmVhazsKCWNhc2UgZTEwMDBfODI1NzQ6CgljYXNlIGUxMDAwXzgyNTgzOgoJCQlwYmEg
PSBFMTAwMF9QQkFfMjBLOyAvKiAyMEsgZm9yIFJ4LCAyMEsgZm9yIFR4ICovCgkJYnJlYWs7Cglj
YXNlIGUxMDAwX2ljaDlsYW46CgljYXNlIGUxMDAwX2ljaDEwbGFuOgoJY2FzZSBlMTAwMF9wY2hs
YW46CgkJcGJhID0gRTEwMDBfUEJBXzEwSzsKCQlicmVhazsKCWNhc2UgZTEwMDBfaWNoOGxhbjoK
CQlwYmEgPSBFMTAwMF9QQkFfOEs7CgkJYnJlYWs7CglkZWZhdWx0OgoJCWlmIChhZGFwdGVyLT5t
YXhfZnJhbWVfc2l6ZSA+IDgxOTIpCgkJCXBiYSA9IEUxMDAwX1BCQV80MEs7IC8qIDQwSyBmb3Ig
UngsIDI0SyBmb3IgVHggKi8KCQllbHNlCgkJCXBiYSA9IEUxMDAwX1BCQV80OEs7IC8qIDQ4SyBm
b3IgUngsIDE2SyBmb3IgVHggKi8KCX0KCglJTklUX0RFQlVHT1VUMSgiZW1faW5pdDogcGJhPSVk
SyIscGJhKTsKCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIEUxMDAwX1BCQSwgcGJhKTsK
CQoJLyogR2V0IHRoZSBsYXRlc3QgbWFjIGFkZHJlc3MsIFVzZXIgY2FuIHVzZSBhIExBQSAqLwog
ICAgICAgIGJjb3B5KElGX0xMQUREUihhZGFwdGVyLT5pZnApLCBhZGFwdGVyLT5ody5tYWMuYWRk
ciwKICAgICAgICAgICAgICBFVEhFUl9BRERSX0xFTik7CgoJLyogUHV0IHRoZSBhZGRyZXNzIGlu
dG8gdGhlIFJlY2VpdmUgQWRkcmVzcyBBcnJheSAqLwoJZTEwMDBfcmFyX3NldCgmYWRhcHRlci0+
aHcsIGFkYXB0ZXItPmh3Lm1hYy5hZGRyLCAwKTsKCgkvKgoJICogV2l0aCB0aGUgODI1NzEgYWRh
cHRlciwgUkFSWzBdIG1heSBiZSBvdmVyd3JpdHRlbgoJICogd2hlbiB0aGUgb3RoZXIgcG9ydCBp
cyByZXNldCwgd2UgbWFrZSBhIGR1cGxpY2F0ZQoJICogaW4gUkFSWzE0XSBmb3IgdGhhdCBldmVu
dHVhbGl0eSwgdGhpcyBhc3N1cmVzCgkgKiB0aGUgaW50ZXJmYWNlIGNvbnRpbnVlcyB0byBmdW5j
dGlvbi4KCSAqLwoJaWYgKGFkYXB0ZXItPmh3Lm1hYy50eXBlID09IGUxMDAwXzgyNTcxKSB7CgkJ
ZTEwMDBfc2V0X2xhYV9zdGF0ZV84MjU3MSgmYWRhcHRlci0+aHcsIFRSVUUpOwoJCWUxMDAwX3Jh
cl9zZXQoJmFkYXB0ZXItPmh3LCBhZGFwdGVyLT5ody5tYWMuYWRkciwKCQkgICAgRTEwMDBfUkFS
X0VOVFJJRVMgLSAxKTsKCX0KCgkvKiBJbml0aWFsaXplIHRoZSBoYXJkd2FyZSAqLwoJZW1fcmVz
ZXQoYWRhcHRlcik7CgllbV91cGRhdGVfbGlua19zdGF0dXMoYWRhcHRlcik7CgoJLyogU2V0dXAg
VkxBTiBzdXBwb3J0LCBiYXNpYyBhbmQgb2ZmbG9hZCBpZiBhdmFpbGFibGUgKi8KCUUxMDAwX1dS
SVRFX1JFRygmYWRhcHRlci0+aHcsIEUxMDAwX1ZFVCwgRVRIRVJUWVBFX1ZMQU4pOwoKCS8qIFVz
ZSByZWFsIFZMQU4gRmlsdGVyIHN1cHBvcnQ/ICovCglpZiAoaWZwLT5pZl9jYXBlbmFibGUgJiBJ
RkNBUF9WTEFOX0hXVEFHR0lORykgewoJCWlmIChpZnAtPmlmX2NhcGVuYWJsZSAmIElGQ0FQX1ZM
QU5fSFdGSUxURVIpCgkJCS8qIFVzZSByZWFsIFZMQU4gRmlsdGVyIHN1cHBvcnQgKi8KCQkJZW1f
c2V0dXBfdmxhbl9od19zdXBwb3J0KGFkYXB0ZXIpOwoJCWVsc2UgewoJCQl1MzIgY3RybDsKCQkJ
Y3RybCA9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgRTEwMDBfQ1RSTCk7CgkJCWN0cmwg
fD0gRTEwMDBfQ1RSTF9WTUU7CgkJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIEUxMDAw
X0NUUkwsIGN0cmwpOwoJCX0KCX0KCgkvKiBTZXQgaGFyZHdhcmUgb2ZmbG9hZCBhYmlsaXRpZXMg
Ki8KCWlmcC0+aWZfaHdhc3Npc3QgPSAwOwoJaWYgKGlmcC0+aWZfY2FwZW5hYmxlICYgSUZDQVBf
VFhDU1VNKQoJCWlmcC0+aWZfaHdhc3Npc3QgfD0gKENTVU1fVENQIHwgQ1NVTV9VRFApOwoJaWYg
KGlmcC0+aWZfY2FwZW5hYmxlICYgSUZDQVBfVFNPNCkKCQlpZnAtPmlmX2h3YXNzaXN0IHw9IENT
VU1fVFNPOwoKCS8qIENvbmZpZ3VyZSBmb3IgT1MgcHJlc2VuY2UgKi8KCWVtX2luaXRfbWFuYWdl
YWJpbGl0eShhZGFwdGVyKTsKCgkvKiBQcmVwYXJlIHRyYW5zbWl0IGRlc2NyaXB0b3JzIGFuZCBi
dWZmZXJzICovCgllbV9zZXR1cF90cmFuc21pdF9zdHJ1Y3R1cmVzKGFkYXB0ZXIpOwoJZW1faW5p
dGlhbGl6ZV90cmFuc21pdF91bml0KGFkYXB0ZXIpOwoKCS8qIFNldHVwIE11bHRpY2FzdCB0YWJs
ZSAqLwoJZW1fc2V0X211bHRpKGFkYXB0ZXIpOwoKCS8qIFByZXBhcmUgcmVjZWl2ZSBkZXNjcmlw
dG9ycyBhbmQgYnVmZmVycyAqLwoJaWYgKGVtX3NldHVwX3JlY2VpdmVfc3RydWN0dXJlcyhhZGFw
dGVyKSkgewoJCWRldmljZV9wcmludGYoZGV2LCAiQ291bGQgbm90IHNldHVwIHJlY2VpdmUgc3Ry
dWN0dXJlc1xuIik7CgkJZW1fc3RvcChhZGFwdGVyKTsKCQlyZXR1cm47Cgl9CgllbV9pbml0aWFs
aXplX3JlY2VpdmVfdW5pdChhZGFwdGVyKTsKCgkvKiBEb24ndCBsb3NlIHByb21pc2N1b3VzIHNl
dHRpbmdzICovCgllbV9zZXRfcHJvbWlzYyhhZGFwdGVyKTsKCglpZnAtPmlmX2Rydl9mbGFncyB8
PSBJRkZfRFJWX1JVTk5JTkc7CglpZnAtPmlmX2Rydl9mbGFncyAmPSB+SUZGX0RSVl9PQUNUSVZF
OwoKCWNhbGxvdXRfcmVzZXQoJmFkYXB0ZXItPnRpbWVyLCBoeiwgZW1fbG9jYWxfdGltZXIsIGFk
YXB0ZXIpOwoJZTEwMDBfY2xlYXJfaHdfY250cnNfYmFzZV9nZW5lcmljKCZhZGFwdGVyLT5odyk7
CgoJLyogTVNJL1ggY29uZmlndXJhdGlvbiBmb3IgODI1NzQgKi8KCWlmIChhZGFwdGVyLT5ody5t
YWMudHlwZSA9PSBlMTAwMF84MjU3NCkgewoJCWludCB0bXA7CgkJdG1wID0gRTEwMDBfUkVBRF9S
RUcoJmFkYXB0ZXItPmh3LCBFMTAwMF9DVFJMX0VYVCk7CgkJdG1wIHw9IEUxMDAwX0NUUkxfRVhU
X1BCQV9DTFI7CgkJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgRTEwMDBfQ1RSTF9FWFQs
IHRtcCk7CgkJLyogU2V0IHRoZSBJVkFSIC0gaW50ZXJydXB0IHZlY3RvciByb3V0aW5nLiAqLwoJ
CUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIEUxMDAwX0lWQVIsIGFkYXB0ZXItPml2YXJz
KTsKCX0KCiNpZmRlZiBERVZJQ0VfUE9MTElORwoJLyoKCSAqIE9ubHkgZW5hYmxlIGludGVycnVw
dHMgaWYgd2UgYXJlIG5vdCBwb2xsaW5nLCBtYWtlIHN1cmUKCSAqIHRoZXkgYXJlIG9mZiBvdGhl
cndpc2UuCgkgKi8KCWlmIChpZnAtPmlmX2NhcGVuYWJsZSAmIElGQ0FQX1BPTExJTkcpCgkJZW1f
ZGlzYWJsZV9pbnRyKGFkYXB0ZXIpOwoJZWxzZQojZW5kaWYgLyogREVWSUNFX1BPTExJTkcgKi8K
CQllbV9lbmFibGVfaW50cihhZGFwdGVyKTsKCgkvKiBBTVQgYmFzZWQgaGFyZHdhcmUgY2FuIG5v
dyB0YWtlIGNvbnRyb2wgZnJvbSBmaXJtd2FyZSAqLwoJaWYgKGFkYXB0ZXItPmhhc19tYW5hZ2Ug
JiYgYWRhcHRlci0+aGFzX2FtdCkKCQllbV9nZXRfaHdfY29udHJvbChhZGFwdGVyKTsKCgkvKiBE
b24ndCByZXNldCB0aGUgcGh5IG5leHQgdGltZSBpbml0IGdldHMgY2FsbGVkICovCglhZGFwdGVy
LT5ody5waHkucmVzZXRfZGlzYWJsZSA9IFRSVUU7Cn0KCnN0YXRpYyB2b2lkCmVtX2luaXQodm9p
ZCAqYXJnKQp7CglzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IGFyZzsKCglFTV9DT1JFX0xPQ0so
YWRhcHRlcik7CgllbV9pbml0X2xvY2tlZChhZGFwdGVyKTsKCUVNX0NPUkVfVU5MT0NLKGFkYXB0
ZXIpOwp9CgoKI2lmZGVmIERFVklDRV9QT0xMSU5HCi8qKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIExlZ2Fj
eSBwb2xsaW5nIHJvdXRpbmU6IG5vdGUgdGhpcyBvbmx5IHdvcmtzIHdpdGggc2luZ2xlIHF1ZXVl
CiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKiovCnN0YXRpYyBpbnQKZW1fcG9sbChzdHJ1Y3QgaWZuZXQgKmlmcCwg
ZW51bSBwb2xsX2NtZCBjbWQsIGludCBjb3VudCkKewoJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIg
PSBpZnAtPmlmX3NvZnRjOwoJc3RydWN0IHR4X3JpbmcJKnR4ciA9IGFkYXB0ZXItPnR4X3Jpbmdz
OwoJc3RydWN0IHJ4X3JpbmcJKnJ4ciA9IGFkYXB0ZXItPnJ4X3JpbmdzOwoJdTMyCQlyZWdfaWNy
OwoJaW50CQlyeF9kb25lOwoKCUVNX0NPUkVfTE9DSyhhZGFwdGVyKTsKCWlmICgoaWZwLT5pZl9k
cnZfZmxhZ3MgJiBJRkZfRFJWX1JVTk5JTkcpID09IDApIHsKCQlFTV9DT1JFX1VOTE9DSyhhZGFw
dGVyKTsKCQlyZXR1cm4gKDApOwoJfQoKCWlmIChjbWQgPT0gUE9MTF9BTkRfQ0hFQ0tfU1RBVFVT
KSB7CgkJcmVnX2ljciA9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgRTEwMDBfSUNSKTsK
CQlpZiAocmVnX2ljciAmIChFMTAwMF9JQ1JfUlhTRVEgfCBFMTAwMF9JQ1JfTFNDKSkgewoJCQlj
YWxsb3V0X3N0b3AoJmFkYXB0ZXItPnRpbWVyKTsKCQkJYWRhcHRlci0+aHcubWFjLmdldF9saW5r
X3N0YXR1cyA9IDE7CgkJCWVtX3VwZGF0ZV9saW5rX3N0YXR1cyhhZGFwdGVyKTsKCQkJY2FsbG91
dF9yZXNldCgmYWRhcHRlci0+dGltZXIsIGh6LAoJCQkgICAgZW1fbG9jYWxfdGltZXIsIGFkYXB0
ZXIpOwoJCX0KCX0KCUVNX0NPUkVfVU5MT0NLKGFkYXB0ZXIpOwoKCWVtX3J4ZW9mKHJ4ciwgY291
bnQsICZyeF9kb25lKTsKCglFTV9UWF9MT0NLKHR4cik7CgllbV90eGVvZih0eHIpOwojaWZkZWYg
RU1fTVVMVElRVUVVRQoJaWYgKCFkcmJyX2VtcHR5KGlmcCwgdHhyLT5icikpCgkJZW1fbXFfc3Rh
cnRfbG9ja2VkKGlmcCwgdHhyLCBOVUxMKTsKI2Vsc2UKCWlmICghSUZRX0RSVl9JU19FTVBUWSgm
aWZwLT5pZl9zbmQpKQoJCWVtX3N0YXJ0X2xvY2tlZChpZnAsIHR4cik7CiNlbmRpZgoJRU1fVFhf
VU5MT0NLKHR4cik7CgoJcmV0dXJuIChyeF9kb25lKTsKfQojZW5kaWYgLyogREVWSUNFX1BPTExJ
TkcgKi8KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBGYXN0IExlZ2FjeS9NU0kgQ29tYmluZWQgSW50
ZXJydXB0IFNlcnZpY2Ugcm91dGluZSAgCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBpbnQKZW1f
aXJxX2Zhc3Qodm9pZCAqYXJnKQp7CglzdHJ1Y3QgYWRhcHRlcgkqYWRhcHRlciA9IGFyZzsKCXN0
cnVjdCBpZm5ldAkqaWZwOwoJdTMyCQlyZWdfaWNyOwoKCWlmcCA9IGFkYXB0ZXItPmlmcDsKCgly
ZWdfaWNyID0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBFMTAwMF9JQ1IpOwoKCS8qIEhv
dCBlamVjdD8gICovCglpZiAocmVnX2ljciA9PSAweGZmZmZmZmZmKQoJCXJldHVybiBGSUxURVJf
U1RSQVk7CgoJLyogRGVmaW5pdGVseSBub3Qgb3VyIGludGVycnVwdC4gICovCglpZiAocmVnX2lj
ciA9PSAweDApCgkJcmV0dXJuIEZJTFRFUl9TVFJBWTsKCgkvKgoJICogU3RhcnRpbmcgd2l0aCB0
aGUgODI1NzEgY2hpcCwgYml0IDMxIHNob3VsZCBiZSB1c2VkIHRvCgkgKiBkZXRlcm1pbmUgd2hl
dGhlciB0aGUgaW50ZXJydXB0IGJlbG9uZ3MgdG8gdXMuCgkgKi8KCWlmIChhZGFwdGVyLT5ody5t
YWMudHlwZSA+PSBlMTAwMF84MjU3MSAmJgoJICAgIChyZWdfaWNyICYgRTEwMDBfSUNSX0lOVF9B
U1NFUlRFRCkgPT0gMCkKCQlyZXR1cm4gRklMVEVSX1NUUkFZOwoKCWVtX2Rpc2FibGVfaW50cihh
ZGFwdGVyKTsKCXRhc2txdWV1ZV9lbnF1ZXVlKGFkYXB0ZXItPnRxLCAmYWRhcHRlci0+cXVlX3Rh
c2spOwoKCS8qIExpbmsgc3RhdHVzIGNoYW5nZSAqLwoJaWYgKHJlZ19pY3IgJiAoRTEwMDBfSUNS
X1JYU0VRIHwgRTEwMDBfSUNSX0xTQykpIHsKCQlhZGFwdGVyLT5ody5tYWMuZ2V0X2xpbmtfc3Rh
dHVzID0gMTsKCQl0YXNrcXVldWVfZW5xdWV1ZSh0YXNrcXVldWVfZmFzdCwgJmFkYXB0ZXItPmxp
bmtfdGFzayk7Cgl9CgoJaWYgKHJlZ19pY3IgJiBFMTAwMF9JQ1JfUlhPKQoJCWFkYXB0ZXItPnJ4
X292ZXJydW5zKys7CglyZXR1cm4gRklMVEVSX0hBTkRMRUQ7Cn0KCi8qIENvbWJpbmVkIFJYL1RY
IGhhbmRsZXIsIHVzZWQgYnkgTGVnYWN5IGFuZCBNU0kgKi8Kc3RhdGljIHZvaWQKZW1faGFuZGxl
X3F1ZSh2b2lkICpjb250ZXh0LCBpbnQgcGVuZGluZykKewoJc3RydWN0IGFkYXB0ZXIJKmFkYXB0
ZXIgPSBjb250ZXh0OwoJc3RydWN0IGlmbmV0CSppZnAgPSBhZGFwdGVyLT5pZnA7CglzdHJ1Y3Qg
dHhfcmluZwkqdHhyID0gYWRhcHRlci0+dHhfcmluZ3M7CglzdHJ1Y3QgcnhfcmluZwkqcnhyID0g
YWRhcHRlci0+cnhfcmluZ3M7Cglib29sCQltb3JlOwoKCglpZiAoaWZwLT5pZl9kcnZfZmxhZ3Mg
JiBJRkZfRFJWX1JVTk5JTkcpIHsKCQltb3JlID0gZW1fcnhlb2YocnhyLCBhZGFwdGVyLT5yeF9w
cm9jZXNzX2xpbWl0LCBOVUxMKTsKCgkJRU1fVFhfTE9DSyh0eHIpOwoJCWlmIChlbV90eGVvZih0
eHIpKQoJCQltb3JlID0gVFJVRTsKI2lmZGVmIEVNX01VTFRJUVVFVUUKCQlpZiAoIWRyYnJfZW1w
dHkoaWZwLCB0eHItPmJyKSkKCQkJZW1fbXFfc3RhcnRfbG9ja2VkKGlmcCwgdHhyLCBOVUxMKTsK
I2Vsc2UKCQlpZiAoIUlGUV9EUlZfSVNfRU1QVFkoJmlmcC0+aWZfc25kKSkKCQkJZW1fc3RhcnRf
bG9ja2VkKGlmcCwgdHhyKTsKI2VuZGlmCgkJRU1fVFhfVU5MT0NLKHR4cik7CgkJaWYgKG1vcmUp
IHsKCQkJdGFza3F1ZXVlX2VucXVldWUoYWRhcHRlci0+dHEsICZhZGFwdGVyLT5xdWVfdGFzayk7
CgkJCXJldHVybjsKCQl9Cgl9CgoJZW1fZW5hYmxlX2ludHIoYWRhcHRlcik7CglyZXR1cm47Cn0K
CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqCiAqCiAqICBNU0lYIEludGVycnVwdCBTZXJ2aWNlIFJvdXRpbmVzCiAq
CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqLwpzdGF0aWMgdm9pZAplbV9tc2l4X3R4KHZvaWQgKmFyZykKewoJc3Ry
dWN0IHR4X3JpbmcgKnR4ciA9IGFyZzsKCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gdHhyLT5h
ZGFwdGVyOwoJYm9vbAkJbW9yZTsKCgkrK3R4ci0+dHhfaXJxOwoJRU1fVFhfTE9DSyh0eHIpOwoJ
bW9yZSA9IGVtX3R4ZW9mKHR4cik7CglFTV9UWF9VTkxPQ0sodHhyKTsKCWlmIChtb3JlKQoJCXRh
c2txdWV1ZV9lbnF1ZXVlKHR4ci0+dHEsICZ0eHItPnR4X3Rhc2spOwoJZWxzZQoJCS8qIFJlZW5h
YmxlIHRoaXMgaW50ZXJydXB0ICovCgkJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgRTEw
MDBfSU1TLCB0eHItPmltcyk7CglyZXR1cm47Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIE1TSVgg
UlggSW50ZXJydXB0IFNlcnZpY2Ugcm91dGluZQogKgogKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyB2
b2lkCmVtX21zaXhfcngodm9pZCAqYXJnKQp7CglzdHJ1Y3QgcnhfcmluZwkqcnhyID0gYXJnOwoJ
c3RydWN0IGFkYXB0ZXIJKmFkYXB0ZXIgPSByeHItPmFkYXB0ZXI7Cglib29sCQltb3JlOwoKCSsr
cnhyLT5yeF9pcnE7Cgltb3JlID0gZW1fcnhlb2YocnhyLCBhZGFwdGVyLT5yeF9wcm9jZXNzX2xp
bWl0LCBOVUxMKTsKCWlmIChtb3JlKQoJCXRhc2txdWV1ZV9lbnF1ZXVlKHJ4ci0+dHEsICZyeHIt
PnJ4X3Rhc2spOwoJZWxzZQoJCS8qIFJlZW5hYmxlIHRoaXMgaW50ZXJydXB0ICovCgkJRTEwMDBf
V1JJVEVfUkVHKCZhZGFwdGVyLT5odywgRTEwMDBfSU1TLCByeHItPmltcyk7CglyZXR1cm47Cn0K
Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioKICoKICogIE1TSVggTGluayBGYXN0IEludGVycnVwdCBTZXJ2aWNlIHJv
dXRpbmUKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyB2b2lkCmVtX21zaXhfbGluayh2b2lkICph
cmcpCnsKCXN0cnVjdCBhZGFwdGVyCSphZGFwdGVyID0gYXJnOwoJdTMyCQlyZWdfaWNyOwoKCSsr
YWRhcHRlci0+bGlua19pcnE7CglyZWdfaWNyID0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3
LCBFMTAwMF9JQ1IpOwoKCWlmIChyZWdfaWNyICYgKEUxMDAwX0lDUl9SWFNFUSB8IEUxMDAwX0lD
Ul9MU0MpKSB7CgkJYWRhcHRlci0+aHcubWFjLmdldF9saW5rX3N0YXR1cyA9IDE7CgkJZW1faGFu
ZGxlX2xpbmsoYWRhcHRlciwgMCk7Cgl9IGVsc2UKCQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXIt
Pmh3LCBFMTAwMF9JTVMsCgkJICAgIEVNX01TSVhfTElOSyB8IEUxMDAwX0lNU19MU0MpOwoJcmV0
dXJuOwp9CgpzdGF0aWMgdm9pZAplbV9oYW5kbGVfcngodm9pZCAqY29udGV4dCwgaW50IHBlbmRp
bmcpCnsKCXN0cnVjdCByeF9yaW5nCSpyeHIgPSBjb250ZXh0OwoJc3RydWN0IGFkYXB0ZXIJKmFk
YXB0ZXIgPSByeHItPmFkYXB0ZXI7CiAgICAgICAgYm9vbCAgICAgICAgICAgIG1vcmU7CgoJbW9y
ZSA9IGVtX3J4ZW9mKHJ4ciwgYWRhcHRlci0+cnhfcHJvY2Vzc19saW1pdCwgTlVMTCk7CglpZiAo
bW9yZSkKCQl0YXNrcXVldWVfZW5xdWV1ZShyeHItPnRxLCAmcnhyLT5yeF90YXNrKTsKCWVsc2UK
CQkvKiBSZWVuYWJsZSB0aGlzIGludGVycnVwdCAqLwoJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRl
ci0+aHcsIEUxMDAwX0lNUywgcnhyLT5pbXMpOwp9CgpzdGF0aWMgdm9pZAplbV9oYW5kbGVfdHgo
dm9pZCAqY29udGV4dCwgaW50IHBlbmRpbmcpCnsKCXN0cnVjdCB0eF9yaW5nCSp0eHIgPSBjb250
ZXh0OwoJc3RydWN0IGFkYXB0ZXIJKmFkYXB0ZXIgPSB0eHItPmFkYXB0ZXI7CglzdHJ1Y3QgaWZu
ZXQJKmlmcCA9IGFkYXB0ZXItPmlmcDsKCglpZiAoIUVNX1RYX1RSWUxPQ0sodHhyKSkKCQlyZXR1
cm47CgoJZW1fdHhlb2YodHhyKTsKCiNpZmRlZiBFTV9NVUxUSVFVRVVFCglpZiAoIWRyYnJfZW1w
dHkoaWZwLCB0eHItPmJyKSkKCQllbV9tcV9zdGFydF9sb2NrZWQoaWZwLCB0eHIsIE5VTEwpOwoj
ZWxzZQoJaWYgKCFJRlFfRFJWX0lTX0VNUFRZKCZpZnAtPmlmX3NuZCkpCgkJZW1fc3RhcnRfbG9j
a2VkKGlmcCwgdHhyKTsKI2VuZGlmCglFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBFMTAw
MF9JTVMsIHR4ci0+aW1zKTsKCUVNX1RYX1VOTE9DSyh0eHIpOwp9CgpzdGF0aWMgdm9pZAplbV9o
YW5kbGVfbGluayh2b2lkICpjb250ZXh0LCBpbnQgcGVuZGluZykKewoJc3RydWN0IGFkYXB0ZXIJ
KmFkYXB0ZXIgPSBjb250ZXh0OwoJc3RydWN0IGlmbmV0ICppZnAgPSBhZGFwdGVyLT5pZnA7CgoJ
aWYgKCEoaWZwLT5pZl9kcnZfZmxhZ3MgJiBJRkZfRFJWX1JVTk5JTkcpKQoJCXJldHVybjsKCglF
TV9DT1JFX0xPQ0soYWRhcHRlcik7CgljYWxsb3V0X3N0b3AoJmFkYXB0ZXItPnRpbWVyKTsKCWVt
X3VwZGF0ZV9saW5rX3N0YXR1cyhhZGFwdGVyKTsKCWNhbGxvdXRfcmVzZXQoJmFkYXB0ZXItPnRp
bWVyLCBoeiwgZW1fbG9jYWxfdGltZXIsIGFkYXB0ZXIpOwoJRTEwMDBfV1JJVEVfUkVHKCZhZGFw
dGVyLT5odywgRTEwMDBfSU1TLAoJICAgIEVNX01TSVhfTElOSyB8IEUxMDAwX0lNU19MU0MpOwoJ
RU1fQ09SRV9VTkxPQ0soYWRhcHRlcik7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBNZWRpYSBJ
b2N0bCBjYWxsYmFjawogKgogKiAgVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB3aGVuZXZlciB0aGUg
dXNlciBxdWVyaWVzIHRoZSBzdGF0dXMgb2YKICogIHRoZSBpbnRlcmZhY2UgdXNpbmcgaWZjb25m
aWcuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgdm9pZAplbV9tZWRpYV9zdGF0dXMoc3RydWN0
IGlmbmV0ICppZnAsIHN0cnVjdCBpZm1lZGlhcmVxICppZm1yKQp7CglzdHJ1Y3QgYWRhcHRlciAq
YWRhcHRlciA9IGlmcC0+aWZfc29mdGM7Cgl1X2NoYXIgZmliZXJfdHlwZSA9IElGTV8xMDAwX1NY
OwoKCUlOSVRfREVCVUdPVVQoImVtX21lZGlhX3N0YXR1czogYmVnaW4iKTsKCglFTV9DT1JFX0xP
Q0soYWRhcHRlcik7CgllbV91cGRhdGVfbGlua19zdGF0dXMoYWRhcHRlcik7CgoJaWZtci0+aWZt
X3N0YXR1cyA9IElGTV9BVkFMSUQ7CglpZm1yLT5pZm1fYWN0aXZlID0gSUZNX0VUSEVSOwoKCWlm
ICghYWRhcHRlci0+bGlua19hY3RpdmUpIHsKCQlFTV9DT1JFX1VOTE9DSyhhZGFwdGVyKTsKCQly
ZXR1cm47Cgl9CgoJaWZtci0+aWZtX3N0YXR1cyB8PSBJRk1fQUNUSVZFOwoKCWlmICgoYWRhcHRl
ci0+aHcucGh5Lm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9maWJlcikgfHwKCSAgICAo
YWRhcHRlci0+aHcucGh5Lm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9pbnRlcm5hbF9z
ZXJkZXMpKSB7CgkJaWZtci0+aWZtX2FjdGl2ZSB8PSBmaWJlcl90eXBlIHwgSUZNX0ZEWDsKCX0g
ZWxzZSB7CgkJc3dpdGNoIChhZGFwdGVyLT5saW5rX3NwZWVkKSB7CgkJY2FzZSAxMDoKCQkJaWZt
ci0+aWZtX2FjdGl2ZSB8PSBJRk1fMTBfVDsKCQkJYnJlYWs7CgkJY2FzZSAxMDA6CgkJCWlmbXIt
PmlmbV9hY3RpdmUgfD0gSUZNXzEwMF9UWDsKCQkJYnJlYWs7CgkJY2FzZSAxMDAwOgoJCQlpZm1y
LT5pZm1fYWN0aXZlIHw9IElGTV8xMDAwX1Q7CgkJCWJyZWFrOwoJCX0KCQlpZiAoYWRhcHRlci0+
bGlua19kdXBsZXggPT0gRlVMTF9EVVBMRVgpCgkJCWlmbXItPmlmbV9hY3RpdmUgfD0gSUZNX0ZE
WDsKCQllbHNlCgkJCWlmbXItPmlmbV9hY3RpdmUgfD0gSUZNX0hEWDsKCX0KCUVNX0NPUkVfVU5M
T0NLKGFkYXB0ZXIpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBNZWRpYSBJb2N0bCBjYWxsYmFj
awogKgogKiAgVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB3aGVuIHRoZSB1c2VyIGNoYW5nZXMgc3Bl
ZWQvZHVwbGV4IHVzaW5nCiAqICBtZWRpYS9tZWRpb3B0IG9wdGlvbiB3aXRoIGlmY29uZmlnLgog
KgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKi8Kc3RhdGljIGludAplbV9tZWRpYV9jaGFuZ2Uoc3RydWN0IGlmbmV0
ICppZnApCnsKCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gaWZwLT5pZl9zb2Z0YzsKCXN0cnVj
dCBpZm1lZGlhICAqaWZtID0gJmFkYXB0ZXItPm1lZGlhOwoKCUlOSVRfREVCVUdPVVQoImVtX21l
ZGlhX2NoYW5nZTogYmVnaW4iKTsKCglpZiAoSUZNX1RZUEUoaWZtLT5pZm1fbWVkaWEpICE9IElG
TV9FVEhFUikKCQlyZXR1cm4gKEVJTlZBTCk7CgoJRU1fQ09SRV9MT0NLKGFkYXB0ZXIpOwoJc3dp
dGNoIChJRk1fU1VCVFlQRShpZm0tPmlmbV9tZWRpYSkpIHsKCWNhc2UgSUZNX0FVVE86CgkJYWRh
cHRlci0+aHcubWFjLmF1dG9uZWcgPSBET19BVVRPX05FRzsKCQlhZGFwdGVyLT5ody5waHkuYXV0
b25lZ19hZHZlcnRpc2VkID0gQVVUT05FR19BRFZfREVGQVVMVDsKCQlicmVhazsKCWNhc2UgSUZN
XzEwMDBfTFg6CgljYXNlIElGTV8xMDAwX1NYOgoJY2FzZSBJRk1fMTAwMF9UOgoJCWFkYXB0ZXIt
Pmh3Lm1hYy5hdXRvbmVnID0gRE9fQVVUT19ORUc7CgkJYWRhcHRlci0+aHcucGh5LmF1dG9uZWdf
YWR2ZXJ0aXNlZCA9IEFEVkVSVElTRV8xMDAwX0ZVTEw7CgkJYnJlYWs7CgljYXNlIElGTV8xMDBf
VFg6CgkJYWRhcHRlci0+aHcubWFjLmF1dG9uZWcgPSBGQUxTRTsKCQlhZGFwdGVyLT5ody5waHku
YXV0b25lZ19hZHZlcnRpc2VkID0gMDsKCQlpZiAoKGlmbS0+aWZtX21lZGlhICYgSUZNX0dNQVNL
KSA9PSBJRk1fRkRYKQoJCQlhZGFwdGVyLT5ody5tYWMuZm9yY2VkX3NwZWVkX2R1cGxleCA9IEFE
VkVSVElTRV8xMDBfRlVMTDsKCQllbHNlCgkJCWFkYXB0ZXItPmh3Lm1hYy5mb3JjZWRfc3BlZWRf
ZHVwbGV4ID0gQURWRVJUSVNFXzEwMF9IQUxGOwoJCWJyZWFrOwoJY2FzZSBJRk1fMTBfVDoKCQlh
ZGFwdGVyLT5ody5tYWMuYXV0b25lZyA9IEZBTFNFOwoJCWFkYXB0ZXItPmh3LnBoeS5hdXRvbmVn
X2FkdmVydGlzZWQgPSAwOwoJCWlmICgoaWZtLT5pZm1fbWVkaWEgJiBJRk1fR01BU0spID09IElG
TV9GRFgpCgkJCWFkYXB0ZXItPmh3Lm1hYy5mb3JjZWRfc3BlZWRfZHVwbGV4ID0gQURWRVJUSVNF
XzEwX0ZVTEw7CgkJZWxzZQoJCQlhZGFwdGVyLT5ody5tYWMuZm9yY2VkX3NwZWVkX2R1cGxleCA9
IEFEVkVSVElTRV8xMF9IQUxGOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlkZXZpY2VfcHJpbnRmKGFk
YXB0ZXItPmRldiwgIlVuc3VwcG9ydGVkIG1lZGlhIHR5cGVcbiIpOwoJfQoKCS8qIEFzIHRoZSBz
cGVlZC9kdXBsZXggc2V0dGluZ3MgbXkgaGF2ZSBjaGFuZ2VkIHdlIG5lZWQgdG8KCSAqIHJlc2V0
IHRoZSBQSFkuCgkgKi8KCWFkYXB0ZXItPmh3LnBoeS5yZXNldF9kaXNhYmxlID0gRkFMU0U7CgoJ
ZW1faW5pdF9sb2NrZWQoYWRhcHRlcik7CglFTV9DT1JFX1VOTE9DSyhhZGFwdGVyKTsKCglyZXR1
cm4gKDApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBUaGlzIHJvdXRpbmUgbWFwcyB0aGUgbWJ1
ZnMgdG8gdHggZGVzY3JpcHRvcnMuCiAqCiAqICByZXR1cm4gMCBvbiBzdWNjZXNzLCBwb3NpdGl2
ZSBvbiBmYWlsdXJlCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc3RhdGljIGludAplbV94bWl0KHN0cnVjdCB0
eF9yaW5nICp0eHIsIHN0cnVjdCBtYnVmICoqbV9oZWFkcCkKewoJc3RydWN0IGFkYXB0ZXIJCSph
ZGFwdGVyID0gdHhyLT5hZGFwdGVyOwoJYnVzX2RtYV9zZWdtZW50X3QJc2Vnc1tFTV9NQVhfU0NB
VFRFUl07CglidXNfZG1hbWFwX3QJCW1hcDsKCXN0cnVjdCBlbV9idWZmZXIJKnR4X2J1ZmZlciwg
KnR4X2J1ZmZlcl9tYXBwZWQ7CglzdHJ1Y3QgZTEwMDBfdHhfZGVzYwkqY3R4ZCA9IE5VTEw7Cglz
dHJ1Y3QgbWJ1ZgkJKm1faGVhZDsKCXUzMgkJCXR4ZF91cHBlciwgdHhkX2xvd2VyLCB0eGRfdXNl
ZCwgdHhkX3NhdmVkOwoJaW50CQkJbnNlZ3MsIGksIGosIGZpcnN0LCBsYXN0ID0gMDsKCWludAkJ
CWVycm9yLCBkb190c28sIHRzb19kZXNjID0gMDsKCgltX2hlYWQgPSAqbV9oZWFkcDsKCXR4ZF91
cHBlciA9IHR4ZF9sb3dlciA9IHR4ZF91c2VkID0gdHhkX3NhdmVkID0gMDsKCWRvX3RzbyA9ICgo
bV9oZWFkLT5tX3BrdGhkci5jc3VtX2ZsYWdzICYgQ1NVTV9UU08pICE9IDApOwoKCS8qCgkgKiBU
U08gd29ya2Fyb3VuZDogCgkgKiAgSWYgYW4gbWJ1ZiBpcyBvbmx5IGhlYWRlciB3ZSBuZWVkICAK
CSAqICAgICB0byBwdWxsIDQgYnl0ZXMgb2YgZGF0YSBpbnRvIGl0LiAKCSAqLwoJaWYgKGRvX3Rz
byAmJiAobV9oZWFkLT5tX2xlbiA8PSBNX1RTT19MRU4pKSB7CgkJbV9oZWFkID0gbV9wdWxsdXAo
bV9oZWFkLCBNX1RTT19MRU4gKyA0KTsKCQkqbV9oZWFkcCA9IG1faGVhZDsKCQlpZiAobV9oZWFk
ID09IE5VTEwpCgkJCXJldHVybiAoRU5PQlVGUyk7Cgl9CgoJLyoKCSAqIE1hcCB0aGUgcGFja2V0
IGZvciBETUEKCSAqCgkgKiBDYXB0dXJlIHRoZSBmaXJzdCBkZXNjcmlwdG9yIGluZGV4LAoJICog
dGhpcyBkZXNjcmlwdG9yIHdpbGwgaGF2ZSB0aGUgaW5kZXgKCSAqIG9mIHRoZSBFT1Agd2hpY2gg
aXMgdGhlIG9ubHkgb25lIHRoYXQKCSAqIG5vdyBnZXRzIGEgRE9ORSBiaXQgd3JpdGViYWNrLgoJ
ICovCglmaXJzdCA9IHR4ci0+bmV4dF9hdmFpbF9kZXNjOwoJdHhfYnVmZmVyID0gJnR4ci0+dHhf
YnVmZmVyc1tmaXJzdF07Cgl0eF9idWZmZXJfbWFwcGVkID0gdHhfYnVmZmVyOwoJbWFwID0gdHhf
YnVmZmVyLT5tYXA7CgoJZXJyb3IgPSBidXNfZG1hbWFwX2xvYWRfbWJ1Zl9zZyh0eHItPnR4dGFn
LCBtYXAsCgkgICAgKm1faGVhZHAsIHNlZ3MsICZuc2VncywgQlVTX0RNQV9OT1dBSVQpOwoKCS8q
CgkgKiBUaGVyZSBhcmUgdHdvIHR5cGVzIG9mIGVycm9ycyB3ZSBjYW4gKHRyeSkgdG8gaGFuZGxl
OgoJICogLSBFRkJJRyBtZWFucyB0aGUgbWJ1ZiBjaGFpbiB3YXMgdG9vIGxvbmcgYW5kIGJ1c19k
bWEgcmFuCgkgKiAgIG91dCBvZiBzZWdtZW50cy4gIERlZnJhZ21lbnQgdGhlIG1idWYgY2hhaW4g
YW5kIHRyeSBhZ2Fpbi4KCSAqIC0gRU5PTUVNIG1lYW5zIGJ1c19kbWEgY291bGQgbm90IG9idGFp
biBlbm91Z2ggYm91bmNlIGJ1ZmZlcnMKCSAqICAgYXQgdGhpcyBwb2ludCBpbiB0aW1lLiAgRGVm
ZXIgc2VuZGluZyBhbmQgdHJ5IGFnYWluIGxhdGVyLgoJICogQWxsIG90aGVyIGVycm9ycywgaW4g
cGFydGljdWxhciBFSU5WQUwsIGFyZSBmYXRhbCBhbmQgcHJldmVudCB0aGUKCSAqIG1idWYgY2hh
aW4gZnJvbSBldmVyIGdvaW5nIHRocm91Z2guICBEcm9wIGl0IGFuZCByZXBvcnQgZXJyb3IuCgkg
Ki8KCWlmIChlcnJvciA9PSBFRkJJRykgewoJCXN0cnVjdCBtYnVmICptOwoKCQltID0gbV9kZWZy
YWcoKm1faGVhZHAsIE1fRE9OVFdBSVQpOwoJCWlmIChtID09IE5VTEwpIHsKCQkJYWRhcHRlci0+
bWJ1Zl9hbGxvY19mYWlsZWQrKzsKCQkJbV9mcmVlbSgqbV9oZWFkcCk7CgkJCSptX2hlYWRwID0g
TlVMTDsKCQkJcmV0dXJuIChFTk9CVUZTKTsKCQl9CgkJKm1faGVhZHAgPSBtOwoKCQkvKiBUcnkg
aXQgYWdhaW4gKi8KCQllcnJvciA9IGJ1c19kbWFtYXBfbG9hZF9tYnVmX3NnKHR4ci0+dHh0YWcs
IG1hcCwKCQkgICAgKm1faGVhZHAsIHNlZ3MsICZuc2VncywgQlVTX0RNQV9OT1dBSVQpOwoKCQlp
ZiAoZXJyb3IpIHsKCQkJYWRhcHRlci0+bm9fdHhfZG1hX3NldHVwKys7CgkJCW1fZnJlZW0oKm1f
aGVhZHApOwoJCQkqbV9oZWFkcCA9IE5VTEw7CgkJCXJldHVybiAoZXJyb3IpOwoJCX0KCX0gZWxz
ZSBpZiAoZXJyb3IgIT0gMCkgewoJCWFkYXB0ZXItPm5vX3R4X2RtYV9zZXR1cCsrOwoJCXJldHVy
biAoZXJyb3IpOwoJfQoKCS8qCgkgKiBUU08gSGFyZHdhcmUgd29ya2Fyb3VuZCwgaWYgdGhpcyBw
YWNrZXQgaXMgbm90CgkgKiBUU08sIGFuZCBpcyBvbmx5IGEgc2luZ2xlIGRlc2NyaXB0b3IgbG9u
ZywgYW5kCgkgKiBpdCBmb2xsb3dzIGEgVFNPIGJ1cnN0LCB0aGVuIHdlIG5lZWQgdG8gYWRkIGEK
CSAqIHNlbnRpbmVsIGRlc2NyaXB0b3IgdG8gcHJldmVudCBwcmVtYXR1cmUgd3JpdGViYWNrLgoJ
ICovCglpZiAoKGRvX3RzbyA9PSAwKSAmJiAodHhyLT50eF90c28gPT0gVFJVRSkpIHsKCQlpZiAo
bnNlZ3MgPT0gMSkKCQkJdHNvX2Rlc2MgPSBUUlVFOwoJCXR4ci0+dHhfdHNvID0gRkFMU0U7Cgl9
CgogICAgICAgIGlmIChuc2VncyA+ICh0eHItPnR4X2F2YWlsIC0gMikpIHsKICAgICAgICAgICAg
ICAgIHR4ci0+bm9fZGVzY19hdmFpbCsrOwoJCWJ1c19kbWFtYXBfdW5sb2FkKHR4ci0+dHh0YWcs
IG1hcCk7CgkJcmV0dXJuIChFTk9CVUZTKTsKICAgICAgICB9CgltX2hlYWQgPSAqbV9oZWFkcDsK
CgkvKiBEbyBoYXJkd2FyZSBhc3Npc3RzICovCiNpZiBfX0ZyZWVCU0RfdmVyc2lvbiA+PSA3MDAw
MDAKCWlmIChtX2hlYWQtPm1fcGt0aGRyLmNzdW1fZmxhZ3MgJiBDU1VNX1RTTykgewoJCWVycm9y
ID0gZW1fdHNvX3NldHVwKHR4ciwgbV9oZWFkLCAmdHhkX3VwcGVyLCAmdHhkX2xvd2VyKTsKCQlp
ZiAoZXJyb3IgIT0gVFJVRSkKCQkJcmV0dXJuIChFTlhJTyk7IC8qIHNvbWV0aGluZyBmb29iYXIg
Ki8KCQkvKiB3ZSBuZWVkIHRvIG1ha2UgYSBmaW5hbCBzZW50aW5lbCB0cmFuc21pdCBkZXNjICov
CgkJdHNvX2Rlc2MgPSBUUlVFOwoJfSBlbHNlCiNlbmRpZgoJaWYgKG1faGVhZC0+bV9wa3RoZHIu
Y3N1bV9mbGFncyAmIENTVU1fT0ZGTE9BRCkKCQllbV90cmFuc21pdF9jaGVja3N1bV9zZXR1cCh0
eHIsICBtX2hlYWQsCgkJICAgICZ0eGRfdXBwZXIsICZ0eGRfbG93ZXIpOwoKCWkgPSB0eHItPm5l
eHRfYXZhaWxfZGVzYzsKCgkvKiBTZXQgdXAgb3VyIHRyYW5zbWl0IGRlc2NyaXB0b3JzICovCglm
b3IgKGogPSAwOyBqIDwgbnNlZ3M7IGorKykgewoJCWJ1c19zaXplX3Qgc2VnX2xlbjsKCQlidXNf
YWRkcl90IHNlZ19hZGRyOwoKCQl0eF9idWZmZXIgPSAmdHhyLT50eF9idWZmZXJzW2ldOwoJCWN0
eGQgPSAmdHhyLT50eF9iYXNlW2ldOwoJCXNlZ19hZGRyID0gc2Vnc1tqXS5kc19hZGRyOwoJCXNl
Z19sZW4gID0gc2Vnc1tqXS5kc19sZW47CgkJLyoKCQkqKiBUU08gV29ya2Fyb3VuZDoKCQkqKiBJ
ZiB0aGlzIGlzIHRoZSBsYXN0IGRlc2NyaXB0b3IsIHdlIHdhbnQgdG8KCQkqKiBzcGxpdCBpdCBz
byB3ZSBoYXZlIGEgc21hbGwgZmluYWwgc2VudGluZWwKCQkqLwoJCWlmICh0c29fZGVzYyAmJiAo
aiA9PSAobnNlZ3MgLTEpKSAmJiAoc2VnX2xlbiA+IDgpKSB7CgkJCXNlZ19sZW4gLT0gNDsKCQkJ
Y3R4ZC0+YnVmZmVyX2FkZHIgPSBodG9sZTY0KHNlZ19hZGRyKTsKCQkJY3R4ZC0+bG93ZXIuZGF0
YSA9IGh0b2xlMzIoCgkJCWFkYXB0ZXItPnR4ZF9jbWQgfCB0eGRfbG93ZXIgfCBzZWdfbGVuKTsK
CQkJY3R4ZC0+dXBwZXIuZGF0YSA9CgkJCSAgICBodG9sZTMyKHR4ZF91cHBlcik7CgkJCWlmICgr
K2kgPT0gYWRhcHRlci0+bnVtX3R4X2Rlc2MpCgkJCQlpID0gMDsKCQkJLyogTm93IG1ha2UgdGhl
IHNlbnRpbmVsICovCQoJCQkrK3R4ZF91c2VkOyAvKiB1c2luZyBhbiBleHRyYSB0eGQgKi8KCQkJ
Y3R4ZCA9ICZ0eHItPnR4X2Jhc2VbaV07CgkJCXR4X2J1ZmZlciA9ICZ0eHItPnR4X2J1ZmZlcnNb
aV07CgkJCWN0eGQtPmJ1ZmZlcl9hZGRyID0KCQkJICAgIGh0b2xlNjQoc2VnX2FkZHIgKyBzZWdf
bGVuKTsKCQkJY3R4ZC0+bG93ZXIuZGF0YSA9IGh0b2xlMzIoCgkJCWFkYXB0ZXItPnR4ZF9jbWQg
fCB0eGRfbG93ZXIgfCA0KTsKCQkJY3R4ZC0+dXBwZXIuZGF0YSA9CgkJCSAgICBodG9sZTMyKHR4
ZF91cHBlcik7CgkJCWxhc3QgPSBpOwoJCQlpZiAoKytpID09IGFkYXB0ZXItPm51bV90eF9kZXNj
KQoJCQkJaSA9IDA7CgkJfSBlbHNlIHsKCQkJY3R4ZC0+YnVmZmVyX2FkZHIgPSBodG9sZTY0KHNl
Z19hZGRyKTsKCQkJY3R4ZC0+bG93ZXIuZGF0YSA9IGh0b2xlMzIoCgkJCWFkYXB0ZXItPnR4ZF9j
bWQgfCB0eGRfbG93ZXIgfCBzZWdfbGVuKTsKCQkJY3R4ZC0+dXBwZXIuZGF0YSA9CgkJCSAgICBo
dG9sZTMyKHR4ZF91cHBlcik7CgkJCWxhc3QgPSBpOwoJCQlpZiAoKytpID09IGFkYXB0ZXItPm51
bV90eF9kZXNjKQoJCQkJaSA9IDA7CgkJfQoJCXR4X2J1ZmZlci0+bV9oZWFkID0gTlVMTDsKCQl0
eF9idWZmZXItPm5leHRfZW9wID0gLTE7Cgl9CgoJdHhyLT5uZXh0X2F2YWlsX2Rlc2MgPSBpOwoJ
dHhyLT50eF9hdmFpbCAtPSBuc2VnczsKCWlmICh0c29fZGVzYykgLyogVFNPIHVzZWQgYW4gZXh0
cmEgZm9yIHNlbnRpbmVsICovCgkJdHhyLT50eF9hdmFpbCAtPSB0eGRfdXNlZDsKCglpZiAobV9o
ZWFkLT5tX2ZsYWdzICYgTV9WTEFOVEFHKSB7CgkJLyogU2V0IHRoZSB2bGFuIGlkLiAqLwoJCWN0
eGQtPnVwcGVyLmZpZWxkcy5zcGVjaWFsID0KCQkgICAgaHRvbGUxNihtX2hlYWQtPm1fcGt0aGRy
LmV0aGVyX3Z0YWcpOwogICAgICAgICAgICAgICAgLyogVGVsbCBoYXJkd2FyZSB0byBhZGQgdGFn
ICovCiAgICAgICAgICAgICAgICBjdHhkLT5sb3dlci5kYXRhIHw9IGh0b2xlMzIoRTEwMDBfVFhE
X0NNRF9WTEUpOwogICAgICAgIH0KCiAgICAgICAgdHhfYnVmZmVyLT5tX2hlYWQgPSBtX2hlYWQ7
Cgl0eF9idWZmZXJfbWFwcGVkLT5tYXAgPSB0eF9idWZmZXItPm1hcDsKCXR4X2J1ZmZlci0+bWFw
ID0gbWFwOwogICAgICAgIGJ1c19kbWFtYXBfc3luYyh0eHItPnR4dGFnLCBtYXAsIEJVU19ETUFT
WU5DX1BSRVdSSVRFKTsKCiAgICAgICAgLyoKICAgICAgICAgKiBMYXN0IERlc2NyaXB0b3Igb2Yg
UGFja2V0CgkgKiBuZWVkcyBFbmQgT2YgUGFja2V0IChFT1ApCgkgKiBhbmQgUmVwb3J0IFN0YXR1
cyAoUlMpCiAgICAgICAgICovCiAgICAgICAgY3R4ZC0+bG93ZXIuZGF0YSB8PQoJICAgIGh0b2xl
MzIoRTEwMDBfVFhEX0NNRF9FT1AgfCBFMTAwMF9UWERfQ01EX1JTKTsKCS8qCgkgKiBLZWVwIHRy
YWNrIGluIHRoZSBmaXJzdCBidWZmZXIgd2hpY2gKCSAqIGRlc2NyaXB0b3Igd2lsbCBiZSB3cml0
dGVuIGJhY2sKCSAqLwoJdHhfYnVmZmVyID0gJnR4ci0+dHhfYnVmZmVyc1tmaXJzdF07Cgl0eF9i
dWZmZXItPm5leHRfZW9wID0gbGFzdDsKCgkvKgoJICogQWR2YW5jZSB0aGUgVHJhbnNtaXQgRGVz
Y3JpcHRvciBUYWlsIChURFQpLCB0aGlzIHRlbGxzIHRoZSBFMTAwMAoJICogdGhhdCB0aGlzIGZy
YW1lIGlzIGF2YWlsYWJsZSB0byB0cmFuc21pdC4KCSAqLwoJYnVzX2RtYW1hcF9zeW5jKHR4ci0+
dHhkbWEuZG1hX3RhZywgdHhyLT50eGRtYS5kbWFfbWFwLAoJICAgIEJVU19ETUFTWU5DX1BSRVJF
QUQgfCBCVVNfRE1BU1lOQ19QUkVXUklURSk7CglFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3
LCBFMTAwMF9URFQodHhyLT5tZSksIGkpOwoKCXJldHVybiAoMCk7Cn0KCnN0YXRpYyB2b2lkCmVt
X3NldF9wcm9taXNjKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQp7CglzdHJ1Y3QgaWZuZXQJKmlm
cCA9IGFkYXB0ZXItPmlmcDsKCXUzMgkJcmVnX3JjdGw7CgoJcmVnX3JjdGwgPSBFMTAwMF9SRUFE
X1JFRygmYWRhcHRlci0+aHcsIEUxMDAwX1JDVEwpOwoKCWlmIChpZnAtPmlmX2ZsYWdzICYgSUZG
X1BST01JU0MpIHsKCQlyZWdfcmN0bCB8PSAoRTEwMDBfUkNUTF9VUEUgfCBFMTAwMF9SQ1RMX01Q
RSk7CgkJLyogVHVybiB0aGlzIG9uIGlmIHlvdSB3YW50IHRvIHNlZSBiYWQgcGFja2V0cyAqLwoJ
CWlmIChlbV9kZWJ1Z19zYnApCgkJCXJlZ19yY3RsIHw9IEUxMDAwX1JDVExfU0JQOwoJCUUxMDAw
X1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIEUxMDAwX1JDVEwsIHJlZ19yY3RsKTsKCX0gZWxzZSBp
ZiAoaWZwLT5pZl9mbGFncyAmIElGRl9BTExNVUxUSSkgewoJCXJlZ19yY3RsIHw9IEUxMDAwX1JD
VExfTVBFOwoJCXJlZ19yY3RsICY9IH5FMTAwMF9SQ1RMX1VQRTsKCQlFMTAwMF9XUklURV9SRUco
JmFkYXB0ZXItPmh3LCBFMTAwMF9SQ1RMLCByZWdfcmN0bCk7Cgl9Cn0KCnN0YXRpYyB2b2lkCmVt
X2Rpc2FibGVfcHJvbWlzYyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKewoJdTMyCXJlZ19yY3Rs
OwoKCXJlZ19yY3RsID0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBFMTAwMF9SQ1RMKTsK
CglyZWdfcmN0bCAmPSAgKH5FMTAwMF9SQ1RMX1VQRSk7CglyZWdfcmN0bCAmPSAgKH5FMTAwMF9S
Q1RMX01QRSk7CglyZWdfcmN0bCAmPSAgKH5FMTAwMF9SQ1RMX1NCUCk7CglFMTAwMF9XUklURV9S
RUcoJmFkYXB0ZXItPmh3LCBFMTAwMF9SQ1RMLCByZWdfcmN0bCk7Cn0KCgovKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
CiAqICBNdWx0aWNhc3QgVXBkYXRlCiAqCiAqICBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHdoZW5l
dmVyIG11bHRpY2FzdCBhZGRyZXNzIGxpc3QgaXMgdXBkYXRlZC4KICoKICoqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiov
CgpzdGF0aWMgdm9pZAplbV9zZXRfbXVsdGkoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCnsKCXN0
cnVjdCBpZm5ldAkqaWZwID0gYWRhcHRlci0+aWZwOwoJc3RydWN0IGlmbXVsdGlhZGRyICppZm1h
OwoJdTMyIHJlZ19yY3RsID0gMDsKCXU4ICAqbXRhOyAvKiBNdWx0aWNhc3QgYXJyYXkgbWVtb3J5
ICovCglpbnQgbWNudCA9IDA7CgoJSU9DVExfREVCVUdPVVQoImVtX3NldF9tdWx0aTogYmVnaW4i
KTsKCglpZiAoYWRhcHRlci0+aHcubWFjLnR5cGUgPT0gZTEwMDBfODI1NDIgJiYgCgkgICAgYWRh
cHRlci0+aHcucmV2aXNpb25faWQgPT0gRTEwMDBfUkVWSVNJT05fMikgewoJCXJlZ19yY3RsID0g
RTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBFMTAwMF9SQ1RMKTsKCQlpZiAoYWRhcHRlci0+
aHcuYnVzLnBjaV9jbWRfd29yZCAmIENNRF9NRU1fV1JUX0lOVkFMSURBVEUpCgkJCWUxMDAwX3Bj
aV9jbGVhcl9td2koJmFkYXB0ZXItPmh3KTsKCQlyZWdfcmN0bCB8PSBFMTAwMF9SQ1RMX1JTVDsK
CQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBFMTAwMF9SQ1RMLCByZWdfcmN0bCk7CgkJ
bXNlY19kZWxheSg1KTsKCX0KCgkvKiBBbGxvY2F0ZSB0ZW1wb3JhcnkgbWVtb3J5IHRvIHNldHVw
IGFycmF5ICovCgltdGEgPSBtYWxsb2Moc2l6ZW9mKHU4KSAqCgkgICAgKEVUSF9BRERSX0xFTiAq
IE1BWF9OVU1fTVVMVElDQVNUX0FERFJFU1NFUyksCgkgICAgTV9ERVZCVUYsIE1fTk9XQUlUIHwg
TV9aRVJPKTsKCWlmIChtdGEgPT0gTlVMTCkKCQlwYW5pYygiZW1fc2V0X211bHRpIG1lbW9yeSBm
YWlsdXJlXG4iKTsKCiNpZiBfX0ZyZWVCU0RfdmVyc2lvbiA8IDgwMDAwMAoJSUZfQUREUl9MT0NL
KGlmcCk7CiNlbHNlCglpZl9tYWRkcl9ybG9jayhpZnApOwojZW5kaWYKCVRBSUxRX0ZPUkVBQ0go
aWZtYSwgJmlmcC0+aWZfbXVsdGlhZGRycywgaWZtYV9saW5rKSB7CgkJaWYgKGlmbWEtPmlmbWFf
YWRkci0+c2FfZmFtaWx5ICE9IEFGX0xJTkspCgkJCWNvbnRpbnVlOwoKCQlpZiAobWNudCA9PSBN
QVhfTlVNX01VTFRJQ0FTVF9BRERSRVNTRVMpCgkJCWJyZWFrOwoKCQliY29weShMTEFERFIoKHN0
cnVjdCBzb2NrYWRkcl9kbCAqKWlmbWEtPmlmbWFfYWRkciksCgkJICAgICZtdGFbbWNudCAqIEVU
SF9BRERSX0xFTl0sIEVUSF9BRERSX0xFTik7CgkJbWNudCsrOwoJfQojaWYgX19GcmVlQlNEX3Zl
cnNpb24gPCA4MDAwMDAKCUlGX0FERFJfVU5MT0NLKGlmcCk7CiNlbHNlCglpZl9tYWRkcl9ydW5s
b2NrKGlmcCk7CiNlbmRpZgoJaWYgKG1jbnQgPj0gTUFYX05VTV9NVUxUSUNBU1RfQUREUkVTU0VT
KSB7CgkJcmVnX3JjdGwgPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIEUxMDAwX1JDVEwp
OwoJCXJlZ19yY3RsIHw9IEUxMDAwX1JDVExfTVBFOwoJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRl
ci0+aHcsIEUxMDAwX1JDVEwsIHJlZ19yY3RsKTsKCX0gZWxzZQoJCWUxMDAwX3VwZGF0ZV9tY19h
ZGRyX2xpc3QoJmFkYXB0ZXItPmh3LCBtdGEsIG1jbnQpOwoKCWlmIChhZGFwdGVyLT5ody5tYWMu
dHlwZSA9PSBlMTAwMF84MjU0MiAmJiAKCSAgICBhZGFwdGVyLT5ody5yZXZpc2lvbl9pZCA9PSBF
MTAwMF9SRVZJU0lPTl8yKSB7CgkJcmVnX3JjdGwgPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+
aHcsIEUxMDAwX1JDVEwpOwoJCXJlZ19yY3RsICY9IH5FMTAwMF9SQ1RMX1JTVDsKCQlFMTAwMF9X
UklURV9SRUcoJmFkYXB0ZXItPmh3LCBFMTAwMF9SQ1RMLCByZWdfcmN0bCk7CgkJbXNlY19kZWxh
eSg1KTsKCQlpZiAoYWRhcHRlci0+aHcuYnVzLnBjaV9jbWRfd29yZCAmIENNRF9NRU1fV1JUX0lO
VkFMSURBVEUpCgkJCWUxMDAwX3BjaV9zZXRfbXdpKCZhZGFwdGVyLT5odyk7Cgl9CglmcmVlKG10
YSwgTV9ERVZCVUYpOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgVGltZXIgcm91dGluZQogKgogKiAg
VGhpcyByb3V0aW5lIGNoZWNrcyBmb3IgbGluayBzdGF0dXMgYW5kIHVwZGF0ZXMgc3RhdGlzdGlj
cy4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgdm9pZAplbV9sb2NhbF90aW1lcih2b2lkICph
cmcpCnsKCXN0cnVjdCBhZGFwdGVyCSphZGFwdGVyID0gYXJnOwoJc3RydWN0IGlmbmV0CSppZnAg
PSBhZGFwdGVyLT5pZnA7CglzdHJ1Y3QgdHhfcmluZwkqdHhyID0gYWRhcHRlci0+dHhfcmluZ3M7
CgoJRU1fQ09SRV9MT0NLX0FTU0VSVChhZGFwdGVyKTsKCgllbV91cGRhdGVfbGlua19zdGF0dXMo
YWRhcHRlcik7CgllbV91cGRhdGVfc3RhdHNfY291bnRlcnMoYWRhcHRlcik7CgoJLyogUmVzZXQg
TEFBIGludG8gUkFSWzBdIG9uIDgyNTcxICovCglpZiAoZTEwMDBfZ2V0X2xhYV9zdGF0ZV84MjU3
MSgmYWRhcHRlci0+aHcpID09IFRSVUUpCgkJZTEwMDBfcmFyX3NldCgmYWRhcHRlci0+aHcsIGFk
YXB0ZXItPmh3Lm1hYy5hZGRyLCAwKTsKCgkvKgoJKiogQ2hlY2sgZm9yIHRpbWUgc2luY2UgYW55
IGRlc2NyaXB0b3Igd2FzIGNsZWFuZWQKCSovCglmb3IgKGludCBpID0gMDsgaSA8IGFkYXB0ZXIt
Pm51bV9xdWV1ZXM7IGkrKywgdHhyKyspIHsKCQlFTV9UWF9MT0NLKHR4cik7CgkJaWYgKHR4ci0+
d2F0Y2hkb2dfY2hlY2sgPT0gRkFMU0UpIHsKCQkJRU1fVFhfVU5MT0NLKHR4cik7CgkJCWNvbnRp
bnVlOwoJCX0KCQlpZiAoKHRpY2tzIC0gdHhyLT53YXRjaGRvZ190aW1lKSA+IEVNX1dBVENIRE9H
KQoJCQlnb3RvIGh1bmc7CgkJRU1fVFhfVU5MT0NLKHR4cik7Cgl9CgoJY2FsbG91dF9yZXNldCgm
YWRhcHRlci0+dGltZXIsIGh6LCBlbV9sb2NhbF90aW1lciwgYWRhcHRlcik7CglyZXR1cm47Cmh1
bmc6CglkZXZpY2VfcHJpbnRmKGFkYXB0ZXItPmRldiwgIldhdGNoZG9nIHRpbWVvdXQgLS0gcmVz
ZXR0aW5nXG4iKTsKCWlmcC0+aWZfZHJ2X2ZsYWdzICY9IH5JRkZfRFJWX1JVTk5JTkc7CglhZGFw
dGVyLT53YXRjaGRvZ19ldmVudHMrKzsKCUVNX1RYX1VOTE9DSyh0eHIpOwoJZW1faW5pdF9sb2Nr
ZWQoYWRhcHRlcik7Cn0KCgpzdGF0aWMgdm9pZAplbV91cGRhdGVfbGlua19zdGF0dXMoc3RydWN0
IGFkYXB0ZXIgKmFkYXB0ZXIpCnsKCXN0cnVjdCBlMTAwMF9odyAqaHcgPSAmYWRhcHRlci0+aHc7
CglzdHJ1Y3QgaWZuZXQgKmlmcCA9IGFkYXB0ZXItPmlmcDsKCWRldmljZV90IGRldiA9IGFkYXB0
ZXItPmRldjsKCXUzMiBsaW5rX2NoZWNrID0gMDsKCgkvKiBHZXQgdGhlIGNhY2hlZCBsaW5rIHZh
bHVlIG9yIHJlYWQgcGh5IGZvciByZWFsICovCglzd2l0Y2ggKGh3LT5waHkubWVkaWFfdHlwZSkg
ewoJY2FzZSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcjoKCQlpZiAoaHctPm1hYy5nZXRfbGlua19z
dGF0dXMpIHsKCQkJLyogRG8gdGhlIHdvcmsgdG8gcmVhZCBwaHkgKi8KCQkJZTEwMDBfY2hlY2tf
Zm9yX2xpbmsoaHcpOwoJCQlsaW5rX2NoZWNrID0gIWh3LT5tYWMuZ2V0X2xpbmtfc3RhdHVzOwoJ
CQlpZiAobGlua19jaGVjaykgLyogRVNCMiBmaXggKi8KCQkJCWUxMDAwX2NmZ19vbl9saW5rX3Vw
KGh3KTsKCQl9IGVsc2UKCQkJbGlua19jaGVjayA9IFRSVUU7CgkJYnJlYWs7CgljYXNlIGUxMDAw
X21lZGlhX3R5cGVfZmliZXI6CgkJZTEwMDBfY2hlY2tfZm9yX2xpbmsoaHcpOwoJCWxpbmtfY2hl
Y2sgPSAoRTEwMDBfUkVBRF9SRUcoaHcsIEUxMDAwX1NUQVRVUykgJgogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBFMTAwMF9TVEFUVVNfTFUpOwoJCWJyZWFrOwoJY2FzZSBlMTAwMF9t
ZWRpYV90eXBlX2ludGVybmFsX3NlcmRlczoKCQllMTAwMF9jaGVja19mb3JfbGluayhodyk7CgkJ
bGlua19jaGVjayA9IGFkYXB0ZXItPmh3Lm1hYy5zZXJkZXNfaGFzX2xpbms7CgkJYnJlYWs7Cglk
ZWZhdWx0OgoJY2FzZSBlMTAwMF9tZWRpYV90eXBlX3Vua25vd246CgkJYnJlYWs7Cgl9CgoJLyog
Tm93IGNoZWNrIGZvciBhIHRyYW5zaXRpb24gKi8KCWlmIChsaW5rX2NoZWNrICYmIChhZGFwdGVy
LT5saW5rX2FjdGl2ZSA9PSAwKSkgewoJCWUxMDAwX2dldF9zcGVlZF9hbmRfZHVwbGV4KGh3LCAm
YWRhcHRlci0+bGlua19zcGVlZCwKCQkgICAgJmFkYXB0ZXItPmxpbmtfZHVwbGV4KTsKCQkvKiBD
aGVjayBpZiB3ZSBtdXN0IGRpc2FibGUgU1BFRURfTU9ERSBiaXQgb24gUENJLUUgKi8KCQlpZiAo
KGFkYXB0ZXItPmxpbmtfc3BlZWQgIT0gU1BFRURfMTAwMCkgJiYKCQkgICAgKChody0+bWFjLnR5
cGUgPT0gZTEwMDBfODI1NzEpIHx8CgkJICAgIChody0+bWFjLnR5cGUgPT0gZTEwMDBfODI1NzIp
KSkgewoJCQlpbnQgdGFyYzA7CgkJCXRhcmMwID0gRTEwMDBfUkVBRF9SRUcoaHcsIEUxMDAwX1RB
UkMoMCkpOwoJCQl0YXJjMCAmPSB+U1BFRURfTU9ERV9CSVQ7CgkJCUUxMDAwX1dSSVRFX1JFRyho
dywgRTEwMDBfVEFSQygwKSwgdGFyYzApOwoJCX0KCQlpZiAoYm9vdHZlcmJvc2UpCgkJCWRldmlj
ZV9wcmludGYoZGV2LCAiTGluayBpcyB1cCAlZCBNYnBzICVzXG4iLAoJCQkgICAgYWRhcHRlci0+
bGlua19zcGVlZCwKCQkJICAgICgoYWRhcHRlci0+bGlua19kdXBsZXggPT0gRlVMTF9EVVBMRVgp
ID8KCQkJICAgICJGdWxsIER1cGxleCIgOiAiSGFsZiBEdXBsZXgiKSk7CgkJYWRhcHRlci0+bGlu
a19hY3RpdmUgPSAxOwoJCWFkYXB0ZXItPnNtYXJ0c3BlZWQgPSAwOwoJCWlmcC0+aWZfYmF1ZHJh
dGUgPSBhZGFwdGVyLT5saW5rX3NwZWVkICogMTAwMDAwMDsKCQlpZl9saW5rX3N0YXRlX2NoYW5n
ZShpZnAsIExJTktfU1RBVEVfVVApOwoJfSBlbHNlIGlmICghbGlua19jaGVjayAmJiAoYWRhcHRl
ci0+bGlua19hY3RpdmUgPT0gMSkpIHsKCQlpZnAtPmlmX2JhdWRyYXRlID0gYWRhcHRlci0+bGlu
a19zcGVlZCA9IDA7CgkJYWRhcHRlci0+bGlua19kdXBsZXggPSAwOwoJCWlmIChib290dmVyYm9z
ZSkKCQkJZGV2aWNlX3ByaW50ZihkZXYsICJMaW5rIGlzIERvd25cbiIpOwoJCWFkYXB0ZXItPmxp
bmtfYWN0aXZlID0gMDsKCQkvKiBMaW5rIGRvd24sIGRpc2FibGUgd2F0Y2hkb2cgKi8KCQkvLyBK
RlYgY2hhbmdlIGxhdGVyCgkJLy9hZGFwdGVyLT53YXRjaGRvZ19jaGVjayA9IEZBTFNFOwoJCWlm
X2xpbmtfc3RhdGVfY2hhbmdlKGlmcCwgTElOS19TVEFURV9ET1dOKTsKCX0KfQoKLyoqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKgogKgogKiAgVGhpcyByb3V0aW5lIGRpc2FibGVzIGFsbCB0cmFmZmljIG9uIHRoZSBhZGFw
dGVyIGJ5IGlzc3VpbmcgYQogKiAgZ2xvYmFsIHJlc2V0IG9uIHRoZSBNQUMgYW5kIGRlYWxsb2Nh
dGVzIFRYL1JYIGJ1ZmZlcnMuCiAqCiAqICBUaGlzIHJvdXRpbmUgc2hvdWxkIGFsd2F5cyBiZSBj
YWxsZWQgd2l0aCBCT1RIIHRoZSBDT1JFCiAqICBhbmQgVFggbG9ja3MuCiAqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
LwoKc3RhdGljIHZvaWQKZW1fc3RvcCh2b2lkICphcmcpCnsKCXN0cnVjdCBhZGFwdGVyCSphZGFw
dGVyID0gYXJnOwoJc3RydWN0IGlmbmV0CSppZnAgPSBhZGFwdGVyLT5pZnA7CglzdHJ1Y3QgdHhf
cmluZwkqdHhyID0gYWRhcHRlci0+dHhfcmluZ3M7CgoJRU1fQ09SRV9MT0NLX0FTU0VSVChhZGFw
dGVyKTsKCglJTklUX0RFQlVHT1VUKCJlbV9zdG9wOiBiZWdpbiIpOwoKCWVtX2Rpc2FibGVfaW50
cihhZGFwdGVyKTsKCWNhbGxvdXRfc3RvcCgmYWRhcHRlci0+dGltZXIpOwoKCS8qIFRlbGwgdGhl
IHN0YWNrIHRoYXQgdGhlIGludGVyZmFjZSBpcyBubyBsb25nZXIgYWN0aXZlICovCglpZnAtPmlm
X2Rydl9mbGFncyAmPSB+KElGRl9EUlZfUlVOTklORyB8IElGRl9EUlZfT0FDVElWRSk7CgogICAg
ICAgIC8qIFVuYXJtIHdhdGNoZG9nIHRpbWVyLiAqLwoJZm9yIChpbnQgaSA9IDA7IGkgPCBhZGFw
dGVyLT5udW1fcXVldWVzOyBpKyssIHR4cisrKSB7CgkJRU1fVFhfTE9DSyh0eHIpOwoJCXR4ci0+
d2F0Y2hkb2dfY2hlY2sgPSBGQUxTRTsKCQlFTV9UWF9VTkxPQ0sodHhyKTsKCX0KCgllMTAwMF9y
ZXNldF9odygmYWRhcHRlci0+aHcpOwoJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgRTEw
MDBfV1VDLCAwKTsKCgllMTAwMF9sZWRfb2ZmKCZhZGFwdGVyLT5odyk7CgllMTAwMF9jbGVhbnVw
X2xlZCgmYWRhcHRlci0+aHcpOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgRGV0ZXJtaW5lIGhh
cmR3YXJlIHJldmlzaW9uLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQKZW1faWRlbnRp
ZnlfaGFyZHdhcmUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCnsKCWRldmljZV90IGRldiA9IGFk
YXB0ZXItPmRldjsKCgkvKiBNYWtlIHN1cmUgb3VyIFBDSSBjb25maWcgc3BhY2UgaGFzIHRoZSBu
ZWNlc3Nhcnkgc3R1ZmYgc2V0ICovCglhZGFwdGVyLT5ody5idXMucGNpX2NtZF93b3JkID0gcGNp
X3JlYWRfY29uZmlnKGRldiwgUENJUl9DT01NQU5ELCAyKTsKCWlmICghKChhZGFwdGVyLT5ody5i
dXMucGNpX2NtZF93b3JkICYgUENJTV9DTURfQlVTTUFTVEVSRU4pICYmCgkgICAgKGFkYXB0ZXIt
Pmh3LmJ1cy5wY2lfY21kX3dvcmQgJiBQQ0lNX0NNRF9NRU1FTikpKSB7CgkJZGV2aWNlX3ByaW50
ZihkZXYsICJNZW1vcnkgQWNjZXNzIGFuZC9vciBCdXMgTWFzdGVyIGJpdHMgIgoJCSAgICAid2Vy
ZSBub3Qgc2V0IVxuIik7CgkJYWRhcHRlci0+aHcuYnVzLnBjaV9jbWRfd29yZCB8PQoJCShQQ0lN
X0NNRF9CVVNNQVNURVJFTiB8IFBDSU1fQ01EX01FTUVOKTsKCQlwY2lfd3JpdGVfY29uZmlnKGRl
diwgUENJUl9DT01NQU5ELAoJCSAgICBhZGFwdGVyLT5ody5idXMucGNpX2NtZF93b3JkLCAyKTsK
CX0KCgkvKiBTYXZlIG9mZiB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBib2FyZCAqLwoJYWRh
cHRlci0+aHcudmVuZG9yX2lkID0gcGNpX2dldF92ZW5kb3IoZGV2KTsKCWFkYXB0ZXItPmh3LmRl
dmljZV9pZCA9IHBjaV9nZXRfZGV2aWNlKGRldik7CglhZGFwdGVyLT5ody5yZXZpc2lvbl9pZCA9
IHBjaV9yZWFkX2NvbmZpZyhkZXYsIFBDSVJfUkVWSUQsIDEpOwoJYWRhcHRlci0+aHcuc3Vic3lz
dGVtX3ZlbmRvcl9pZCA9CgkgICAgcGNpX3JlYWRfY29uZmlnKGRldiwgUENJUl9TVUJWRU5EXzAs
IDIpOwoJYWRhcHRlci0+aHcuc3Vic3lzdGVtX2RldmljZV9pZCA9CgkgICAgcGNpX3JlYWRfY29u
ZmlnKGRldiwgUENJUl9TVUJERVZfMCwgMik7CgoJLyogRG8gU2hhcmVkIENvZGUgSW5pdCBhbmQg
U2V0dXAgKi8KCWlmIChlMTAwMF9zZXRfbWFjX3R5cGUoJmFkYXB0ZXItPmh3KSkgewoJCWRldmlj
ZV9wcmludGYoZGV2LCAiU2V0dXAgaW5pdCBmYWlsdXJlXG4iKTsKCQlyZXR1cm47Cgl9Cn0KCnN0
YXRpYyBpbnQKZW1fYWxsb2NhdGVfcGNpX3Jlc291cmNlcyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRl
cikKewoJZGV2aWNlX3QJZGV2ID0gYWRhcHRlci0+ZGV2OwoJaW50CQlyaWQ7CgoJcmlkID0gUENJ
Ul9CQVIoMCk7CglhZGFwdGVyLT5tZW1vcnkgPSBidXNfYWxsb2NfcmVzb3VyY2VfYW55KGRldiwg
U1lTX1JFU19NRU1PUlksCgkgICAgJnJpZCwgUkZfQUNUSVZFKTsKCWlmIChhZGFwdGVyLT5tZW1v
cnkgPT0gTlVMTCkgewoJCWRldmljZV9wcmludGYoZGV2LCAiVW5hYmxlIHRvIGFsbG9jYXRlIGJ1
cyByZXNvdXJjZTogbWVtb3J5XG4iKTsKCQlyZXR1cm4gKEVOWElPKTsKCX0KCWFkYXB0ZXItPm9z
ZGVwLm1lbV9idXNfc3BhY2VfdGFnID0KCSAgICBybWFuX2dldF9idXN0YWcoYWRhcHRlci0+bWVt
b3J5KTsKCWFkYXB0ZXItPm9zZGVwLm1lbV9idXNfc3BhY2VfaGFuZGxlID0KCSAgICBybWFuX2dl
dF9idXNoYW5kbGUoYWRhcHRlci0+bWVtb3J5KTsKCWFkYXB0ZXItPmh3Lmh3X2FkZHIgPSAodTgg
KikmYWRhcHRlci0+b3NkZXAubWVtX2J1c19zcGFjZV9oYW5kbGU7CgoJLyogRGVmYXVsdCB0byBh
IHNpbmdsZSBxdWV1ZSAqLwoJYWRhcHRlci0+bnVtX3F1ZXVlcyA9IDE7CgoJLyoKCSAqIFNldHVw
IE1TSS9YIG9yIE1TSSBpZiBQQ0kgRXhwcmVzcwoJICovCglhZGFwdGVyLT5tc2l4ID0gZW1fc2V0
dXBfbXNpeChhZGFwdGVyKTsKCglhZGFwdGVyLT5ody5iYWNrID0gJmFkYXB0ZXItPm9zZGVwOwoK
CXJldHVybiAoMCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIFNldHVwIHRoZSBMZWdhY3kgb3Ig
TVNJIEludGVycnVwdCBoYW5kbGVyCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQKZW1fYWxsb2NhdGVf
bGVnYWN5KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQp7CglkZXZpY2VfdCBkZXYgPSBhZGFwdGVy
LT5kZXY7CglpbnQgZXJyb3IsIHJpZCA9IDA7CgoJLyogTWFudWFsbHkgdHVybiBvZmYgYWxsIGlu
dGVycnVwdHMgKi8KCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIEUxMDAwX0lNQywgMHhm
ZmZmZmZmZik7CgoJaWYgKGFkYXB0ZXItPm1zaXggPT0gMSkgLyogdXNpbmcgTVNJICovCgkJcmlk
ID0gMTsKCS8qIFdlIGFsbG9jYXRlIGEgc2luZ2xlIGludGVycnVwdCByZXNvdXJjZSAqLwoJYWRh
cHRlci0+cmVzID0gYnVzX2FsbG9jX3Jlc291cmNlX2FueShkZXYsCgkgICAgU1lTX1JFU19JUlEs
ICZyaWQsIFJGX1NIQVJFQUJMRSB8IFJGX0FDVElWRSk7CglpZiAoYWRhcHRlci0+cmVzID09IE5V
TEwpIHsKCQlkZXZpY2VfcHJpbnRmKGRldiwgIlVuYWJsZSB0byBhbGxvY2F0ZSBidXMgcmVzb3Vy
Y2U6ICIKCQkgICAgImludGVycnVwdFxuIik7CgkJcmV0dXJuIChFTlhJTyk7Cgl9CgoJLyoKCSAq
IEFsbG9jYXRlIGEgZmFzdCBpbnRlcnJ1cHQgYW5kIHRoZSBhc3NvY2lhdGVkCgkgKiBkZWZlcnJl
ZCBwcm9jZXNzaW5nIGNvbnRleHRzLgoJICovCglUQVNLX0lOSVQoJmFkYXB0ZXItPnF1ZV90YXNr
LCAwLCBlbV9oYW5kbGVfcXVlLCBhZGFwdGVyKTsKCVRBU0tfSU5JVCgmYWRhcHRlci0+bGlua190
YXNrLCAwLCBlbV9oYW5kbGVfbGluaywgYWRhcHRlcik7CglhZGFwdGVyLT50cSA9IHRhc2txdWV1
ZV9jcmVhdGVfZmFzdCgiZW1fdGFza3EiLCBNX05PV0FJVCwKCSAgICB0YXNrcXVldWVfdGhyZWFk
X2VucXVldWUsICZhZGFwdGVyLT50cSk7Cgl0YXNrcXVldWVfc3RhcnRfdGhyZWFkcygmYWRhcHRl
ci0+dHEsIDEsIFBJX05FVCwgIiVzIHRhc2txIiwKCSAgICBkZXZpY2VfZ2V0X25hbWV1bml0KGFk
YXB0ZXItPmRldikpOwoJaWYgKChlcnJvciA9IGJ1c19zZXR1cF9pbnRyKGRldiwgYWRhcHRlci0+
cmVzLCBJTlRSX1RZUEVfTkVULAoJICAgIGVtX2lycV9mYXN0LCBOVUxMLCBhZGFwdGVyLCAmYWRh
cHRlci0+dGFnKSkgIT0gMCkgewoJCWRldmljZV9wcmludGYoZGV2LCAiRmFpbGVkIHRvIHJlZ2lz
dGVyIGZhc3QgaW50ZXJydXB0ICIKCQkJICAgICJoYW5kbGVyOiAlZFxuIiwgZXJyb3IpOwoJCXRh
c2txdWV1ZV9mcmVlKGFkYXB0ZXItPnRxKTsKCQlhZGFwdGVyLT50cSA9IE5VTEw7CgkJcmV0dXJu
IChlcnJvcik7Cgl9CgkKCXJldHVybiAoMCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIFNldHVw
IHRoZSBNU0lYIEludGVycnVwdCBoYW5kbGVycwogKiAgIFRoaXMgaXMgbm90IHJlYWxseSBNdWx0
aXF1ZXVlLCByYXRoZXIKICogICBpdHMganVzdCBtdWx0aXBsZSBpbnRlcnJ1cHQgdmVjdG9ycy4K
ICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKiovCmludAplbV9hbGxvY2F0ZV9tc2l4KHN0cnVjdCBhZGFwdGVyICph
ZGFwdGVyKQp7CglkZXZpY2VfdAlkZXYgPSBhZGFwdGVyLT5kZXY7CglzdHJ1Y3QJCXR4X3Jpbmcg
KnR4ciA9IGFkYXB0ZXItPnR4X3JpbmdzOwoJc3RydWN0CQlyeF9yaW5nICpyeHIgPSBhZGFwdGVy
LT5yeF9yaW5nczsKCWludAkJZXJyb3IsIHJpZCwgdmVjdG9yID0gMDsKCgoJLyogTWFrZSBzdXJl
IGFsbCBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCAqLwoJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVy
LT5odywgRTEwMDBfSU1DLCAweGZmZmZmZmZmKTsKCgkvKiBGaXJzdCBzZXQgdXAgcmluZyByZXNv
dXJjZXMgKi8KCWZvciAoaW50IGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtX3F1ZXVlczsgaSsrLCB0
eHIrKywgcnhyKyspIHsKCgkJLyogUlggcmluZyAqLwoJCXJpZCA9IHZlY3RvciArIDE7CgoJCXJ4
ci0+cmVzID0gYnVzX2FsbG9jX3Jlc291cmNlX2FueShkZXYsCgkJICAgIFNZU19SRVNfSVJRLCAm
cmlkLCBSRl9BQ1RJVkUpOwoJCWlmIChyeHItPnJlcyA9PSBOVUxMKSB7CgkJCWRldmljZV9wcmlu
dGYoZGV2LAoJCQkgICAgIlVuYWJsZSB0byBhbGxvY2F0ZSBidXMgcmVzb3VyY2U6ICIKCQkJICAg
ICJSWCBNU0lYIEludGVycnVwdCAlZFxuIiwgaSk7CgkJCXJldHVybiAoRU5YSU8pOwoJCX0KCQlp
ZiAoKGVycm9yID0gYnVzX3NldHVwX2ludHIoZGV2LCByeHItPnJlcywKCQkgICAgSU5UUl9UWVBF
X05FVCB8IElOVFJfTVBTQUZFLCBOVUxMLCBlbV9tc2l4X3J4LAoJCSAgICByeHIsICZyeHItPnRh
ZykpICE9IDApIHsKCQkJZGV2aWNlX3ByaW50ZihkZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgUlgg
aGFuZGxlciIpOwoJCQlyZXR1cm4gKGVycm9yKTsKCQl9CgkJcnhyLT5tc2l4ID0gdmVjdG9yKys7
IC8qIE5PVEUgaW5jcmVtZW50IHZlY3RvciBmb3IgVFggKi8KCQlUQVNLX0lOSVQoJnJ4ci0+cnhf
dGFzaywgMCwgZW1faGFuZGxlX3J4LCByeHIpOwoJCXJ4ci0+dHEgPSB0YXNrcXVldWVfY3JlYXRl
X2Zhc3QoImVtX3J4cSIsIE1fTk9XQUlULAoJCSAgICB0YXNrcXVldWVfdGhyZWFkX2VucXVldWUs
ICZyeHItPnRxKTsKCQl0YXNrcXVldWVfc3RhcnRfdGhyZWFkcygmcnhyLT50cSwgMSwgUElfTkVU
LCAiJXMgcnhxIiwKCQkgICAgZGV2aWNlX2dldF9uYW1ldW5pdChhZGFwdGVyLT5kZXYpKTsKCQkv
KgoJCSoqIFNldCB0aGUgYml0IHRvIGVuYWJsZSBpbnRlcnJ1cHQKCQkqKiBpbiBFMTAwMF9JTVMg
LS0gYml0cyAyMCBhbmQgMjEKCQkqKiBhcmUgZm9yIFJYMCBhbmQgUlgxLCBub3RlIHRoaXMgaGFz
CgkJKiogTk9USElORyB0byBkbyB3aXRoIHRoZSBNU0lYIHZlY3RvcgoJCSovCgkJcnhyLT5pbXMg
PSAxIDw8ICgyMCArIGkpOwoJCWFkYXB0ZXItPml2YXJzIHw9ICg4IHwgcnhyLT5tc2l4KSA8PCAo
aSAqIDQpOwoKCQkvKiBUWCByaW5nICovCgkJcmlkID0gdmVjdG9yICsgMTsKCQl0eHItPnJlcyA9
IGJ1c19hbGxvY19yZXNvdXJjZV9hbnkoZGV2LAoJCSAgICBTWVNfUkVTX0lSUSwgJnJpZCwgUkZf
QUNUSVZFKTsKCQlpZiAodHhyLT5yZXMgPT0gTlVMTCkgewoJCQlkZXZpY2VfcHJpbnRmKGRldiwK
CQkJICAgICJVbmFibGUgdG8gYWxsb2NhdGUgYnVzIHJlc291cmNlOiAiCgkJCSAgICAiVFggTVNJ
WCBJbnRlcnJ1cHQgJWRcbiIsIGkpOwoJCQlyZXR1cm4gKEVOWElPKTsKCQl9CgkJaWYgKChlcnJv
ciA9IGJ1c19zZXR1cF9pbnRyKGRldiwgdHhyLT5yZXMsCgkJICAgIElOVFJfVFlQRV9ORVQgfCBJ
TlRSX01QU0FGRSwgTlVMTCwgZW1fbXNpeF90eCwKCQkgICAgdHhyLCAmdHhyLT50YWcpKSAhPSAw
KSB7CgkJCWRldmljZV9wcmludGYoZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIFRYIGhhbmRsZXIi
KTsKCQkJcmV0dXJuIChlcnJvcik7CgkJfQoJCXR4ci0+bXNpeCA9IHZlY3RvcisrOyAvKiBJbmNy
ZW1lbnQgdmVjdG9yIGZvciBuZXh0IHBhc3MgKi8KCQlUQVNLX0lOSVQoJnR4ci0+dHhfdGFzaywg
MCwgZW1faGFuZGxlX3R4LCB0eHIpOwoJCXR4ci0+dHEgPSB0YXNrcXVldWVfY3JlYXRlX2Zhc3Qo
ImVtX3R4cSIsIE1fTk9XQUlULAoJCSAgICB0YXNrcXVldWVfdGhyZWFkX2VucXVldWUsICZ0eHIt
PnRxKTsKCQl0YXNrcXVldWVfc3RhcnRfdGhyZWFkcygmdHhyLT50cSwgMSwgUElfTkVULCAiJXMg
dHhxIiwKCQkgICAgZGV2aWNlX2dldF9uYW1ldW5pdChhZGFwdGVyLT5kZXYpKTsKCQkvKgoJCSoq
IFNldCB0aGUgYml0IHRvIGVuYWJsZSBpbnRlcnJ1cHQKCQkqKiBpbiBFMTAwMF9JTVMgLS0gYml0
cyAyMiBhbmQgMjMKCQkqKiBhcmUgZm9yIFRYMCBhbmQgVFgxLCBub3RlIHRoaXMgaGFzCgkJKiog
Tk9USElORyB0byBkbyB3aXRoIHRoZSBNU0lYIHZlY3RvcgoJCSovCgkJdHhyLT5pbXMgPSAxIDw8
ICgyMiArIGkpOwoJCWFkYXB0ZXItPml2YXJzIHw9ICg4IHwgdHhyLT5tc2l4KSA8PCAoOCArIChp
ICogNCkpOwoJfQoKCS8qIExpbmsgaW50ZXJydXB0ICovCgkrK3JpZDsKCWFkYXB0ZXItPnJlcyA9
IGJ1c19hbGxvY19yZXNvdXJjZV9hbnkoZGV2LAoJICAgIFNZU19SRVNfSVJRLCAmcmlkLCBSRl9B
Q1RJVkUpOwoJaWYgKCFhZGFwdGVyLT5yZXMpIHsKCQlkZXZpY2VfcHJpbnRmKGRldiwiVW5hYmxl
IHRvIGFsbG9jYXRlICIKCQkgICAgImJ1cyByZXNvdXJjZTogTGluayBpbnRlcnJ1cHQgWyVkXVxu
IiwgcmlkKTsKCQlyZXR1cm4gKEVOWElPKTsKICAgICAgICB9CgkvKiBTZXQgdGhlIGxpbmsgaGFu
ZGxlciBmdW5jdGlvbiAqLwoJZXJyb3IgPSBidXNfc2V0dXBfaW50cihkZXYsIGFkYXB0ZXItPnJl
cywKCSAgICBJTlRSX1RZUEVfTkVUIHwgSU5UUl9NUFNBRkUsIE5VTEwsCgkgICAgZW1fbXNpeF9s
aW5rLCBhZGFwdGVyLCAmYWRhcHRlci0+dGFnKTsKCWlmIChlcnJvcikgewoJCWFkYXB0ZXItPnJl
cyA9IE5VTEw7CgkJZGV2aWNlX3ByaW50ZihkZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgTElOSyBo
YW5kbGVyIik7CgkJcmV0dXJuIChlcnJvcik7Cgl9CglhZGFwdGVyLT5saW5rdmVjID0gdmVjdG9y
OwoJYWRhcHRlci0+aXZhcnMgfD0gICg4IHwgdmVjdG9yKSA8PCAxNjsKCWFkYXB0ZXItPml2YXJz
IHw9IDB4ODAwMDAwMDA7CgoJcmV0dXJuICgwKTsKfQoKCnN0YXRpYyB2b2lkCmVtX2ZyZWVfcGNp
X3Jlc291cmNlcyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKewoJZGV2aWNlX3QJZGV2ID0gYWRh
cHRlci0+ZGV2OwoJc3RydWN0IHR4X3JpbmcJKnR4cjsKCXN0cnVjdCByeF9yaW5nCSpyeHI7Cglp
bnQJCXJpZDsKCgoJLyoKCSoqIFJlbGVhc2UgYWxsIHRoZSBxdWV1ZSBpbnRlcnJ1cHQgcmVzb3Vy
Y2VzOgoJKi8KCWZvciAoaW50IGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtX3F1ZXVlczsgaSsrKSB7
CgkJdHhyID0gJmFkYXB0ZXItPnR4X3JpbmdzW2ldOwoJCXJ4ciA9ICZhZGFwdGVyLT5yeF9yaW5n
c1tpXTsKCQlyaWQgPSB0eHItPm1zaXggKzE7CgkJaWYgKHR4ci0+dGFnICE9IE5VTEwpIHsKCQkJ
YnVzX3RlYXJkb3duX2ludHIoZGV2LCB0eHItPnJlcywgdHhyLT50YWcpOwoJCQl0eHItPnRhZyA9
IE5VTEw7CgkJfQoJCWlmICh0eHItPnJlcyAhPSBOVUxMKQoJCQlidXNfcmVsZWFzZV9yZXNvdXJj
ZShkZXYsIFNZU19SRVNfSVJRLAoJCQkgICAgcmlkLCB0eHItPnJlcyk7CgkJcmlkID0gcnhyLT5t
c2l4ICsxOwoJCWlmIChyeHItPnRhZyAhPSBOVUxMKSB7CgkJCWJ1c190ZWFyZG93bl9pbnRyKGRl
diwgcnhyLT5yZXMsIHJ4ci0+dGFnKTsKCQkJcnhyLT50YWcgPSBOVUxMOwoJCX0KCQlpZiAocnhy
LT5yZXMgIT0gTlVMTCkKCQkJYnVzX3JlbGVhc2VfcmVzb3VyY2UoZGV2LCBTWVNfUkVTX0lSUSwK
CQkJICAgIHJpZCwgcnhyLT5yZXMpOwoJfQoKICAgICAgICBpZiAoYWRhcHRlci0+bGlua3ZlYykg
Lyogd2UgYXJlIGRvaW5nIE1TSVggKi8KICAgICAgICAgICAgICAgIHJpZCA9IGFkYXB0ZXItPmxp
bmt2ZWMgKyAxOwogICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIChhZGFwdGVyLT5tc2l4ICE9
IDApID8gKHJpZCA9IDEpOihyaWQgPSAwKTsKCglpZiAoYWRhcHRlci0+dGFnICE9IE5VTEwpIHsK
CQlidXNfdGVhcmRvd25faW50cihkZXYsIGFkYXB0ZXItPnJlcywgYWRhcHRlci0+dGFnKTsKCQlh
ZGFwdGVyLT50YWcgPSBOVUxMOwoJfQoKCWlmIChhZGFwdGVyLT5yZXMgIT0gTlVMTCkKCQlidXNf
cmVsZWFzZV9yZXNvdXJjZShkZXYsIFNZU19SRVNfSVJRLCByaWQsIGFkYXB0ZXItPnJlcyk7CgoK
CWlmIChhZGFwdGVyLT5tc2l4KQoJCXBjaV9yZWxlYXNlX21zaShkZXYpOwoKCWlmIChhZGFwdGVy
LT5tc2l4X21lbSAhPSBOVUxMKQoJCWJ1c19yZWxlYXNlX3Jlc291cmNlKGRldiwgU1lTX1JFU19N
RU1PUlksCgkJICAgIFBDSVJfQkFSKEVNX01TSVhfQkFSKSwgYWRhcHRlci0+bXNpeF9tZW0pOwoK
CWlmIChhZGFwdGVyLT5tZW1vcnkgIT0gTlVMTCkKCQlidXNfcmVsZWFzZV9yZXNvdXJjZShkZXYs
IFNZU19SRVNfTUVNT1JZLAoJCSAgICBQQ0lSX0JBUigwKSwgYWRhcHRlci0+bWVtb3J5KTsKCglp
ZiAoYWRhcHRlci0+Zmxhc2ggIT0gTlVMTCkKCQlidXNfcmVsZWFzZV9yZXNvdXJjZShkZXYsIFNZ
U19SRVNfTUVNT1JZLAoJCSAgICBFTV9GTEFTSCwgYWRhcHRlci0+Zmxhc2gpOwp9CgovKgogKiBT
ZXR1cCBNU0kgb3IgTVNJL1gKICovCnN0YXRpYyBpbnQKZW1fc2V0dXBfbXNpeChzdHJ1Y3QgYWRh
cHRlciAqYWRhcHRlcikKewoJZGV2aWNlX3QgZGV2ID0gYWRhcHRlci0+ZGV2OwoJaW50IHZhbCA9
IDA7CgoKCS8qIFNldHVwIE1TSS9YIGZvciBIYXJ0d2VsbCAqLwoJaWYgKChhZGFwdGVyLT5ody5t
YWMudHlwZSA9PSBlMTAwMF84MjU3NCkgJiYKCSAgICAoZW1fZW5hYmxlX21zaXggPT0gVFJVRSkp
IHsKCQkvKiBNYXAgdGhlIE1TSVggQkFSICovCgkJaW50IHJpZCA9IFBDSVJfQkFSKEVNX01TSVhf
QkFSKTsKCQlhZGFwdGVyLT5tc2l4X21lbSA9IGJ1c19hbGxvY19yZXNvdXJjZV9hbnkoZGV2LAoJ
CSAgICBTWVNfUkVTX01FTU9SWSwgJnJpZCwgUkZfQUNUSVZFKTsKICAgICAgIAkJaWYgKCFhZGFw
dGVyLT5tc2l4X21lbSkgewoJCQkvKiBNYXkgbm90IGJlIGVuYWJsZWQgKi8KICAgICAgICAgICAg
ICAgCQlkZXZpY2VfcHJpbnRmKGFkYXB0ZXItPmRldiwKCQkJICAgICJVbmFibGUgdG8gbWFwIE1T
SVggdGFibGUgXG4iKTsKCQkJZ290byBtc2k7CiAgICAgICAJCX0KCQl2YWwgPSBwY2lfbXNpeF9j
b3VudChkZXYpOyAKCQlpZiAodmFsICE9IDUpIHsKCQkJYnVzX3JlbGVhc2VfcmVzb3VyY2UoZGV2
LCBTWVNfUkVTX01FTU9SWSwKCQkJICAgIFBDSVJfQkFSKEVNX01TSVhfQkFSKSwgYWRhcHRlci0+
bXNpeF9tZW0pOwoJCQlhZGFwdGVyLT5tc2l4X21lbSA9IE5VTEw7CiAgICAgICAgICAgICAgIAkJ
ZGV2aWNlX3ByaW50ZihhZGFwdGVyLT5kZXYsCgkJCSAgICAiTVNJWCB2ZWN0b3JzIHdyb25nLCB1
c2luZyBNU0kgXG4iKTsKCQkJZ290byBtc2k7CgkJfQoJCWlmIChlbV9tc2l4X3F1ZXVlcyA9PSAy
KSB7CgkJCXZhbCA9IDU7CgkJCWFkYXB0ZXItPm51bV9xdWV1ZXMgPSAyOwoJCX0gZWxzZSB7CgkJ
CXZhbCA9IDM7CgkJCWFkYXB0ZXItPm51bV9xdWV1ZXMgPSAxOwoJCX0KCQlpZiAocGNpX2FsbG9j
X21zaXgoZGV2LCAmdmFsKSA9PSAwKSB7CgkJCWRldmljZV9wcmludGYoYWRhcHRlci0+ZGV2LAoJ
CQkgICAgIlVzaW5nIE1TSVggaW50ZXJydXB0cyAiCgkJCSAgICAid2l0aCAlZCB2ZWN0b3JzXG4i
LCB2YWwpOwoJCX0KCgkJcmV0dXJuICh2YWwpOwoJfQptc2k6CiAgICAgICAJdmFsID0gcGNpX21z
aV9jb3VudChkZXYpOwogICAgICAgCWlmICh2YWwgPT0gMSAmJiBwY2lfYWxsb2NfbXNpKGRldiwg
JnZhbCkgPT0gMCkgewogICAgICAgICAgICAgICAJYWRhcHRlci0+bXNpeCA9IDE7CiAgICAgICAg
ICAgICAgIAlkZXZpY2VfcHJpbnRmKGFkYXB0ZXItPmRldiwiVXNpbmcgTVNJIGludGVycnVwdFxu
Iik7CgkJcmV0dXJuICh2YWwpOwoJfSAKCS8qIFNob3VsZCBvbmx5IGhhcHBlbiBkdWUgdG8gbWFu
dWFsIGludmVudGlvbiAqLwoJZGV2aWNlX3ByaW50ZihhZGFwdGVyLT5kZXYsIlNldHVwIE1TSVgg
ZmFpbHVyZVxuIik7CglyZXR1cm4gKDApOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgSW5pdGlh
bGl6ZSB0aGUgaGFyZHdhcmUgdG8gYSBjb25maWd1cmF0aW9uCiAqICBhcyBzcGVjaWZpZWQgYnkg
dGhlIGFkYXB0ZXIgc3RydWN0dXJlLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQKZW1f
cmVzZXQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCnsKCWRldmljZV90CWRldiA9IGFkYXB0ZXIt
PmRldjsKCXN0cnVjdCBlMTAwMF9odwkqaHcgPSAmYWRhcHRlci0+aHc7Cgl1MTYJCXJ4X2J1ZmZl
cl9zaXplOwoKCUlOSVRfREVCVUdPVVQoImVtX3Jlc2V0OiBiZWdpbiIpOwoKCS8qIFNldCB1cCBz
bWFydCBwb3dlciBkb3duIGFzIGRlZmF1bHQgb2ZmIG9uIG5ld2VyIGFkYXB0ZXJzLiAqLwoJaWYg
KCFlbV9zbWFydF9wd3JfZG93biAmJiAoaHctPm1hYy50eXBlID09IGUxMDAwXzgyNTcxIHx8Cgkg
ICAgaHctPm1hYy50eXBlID09IGUxMDAwXzgyNTcyKSkgewoJCXUxNiBwaHlfdG1wID0gMDsKCgkJ
LyogU3BlZWQgdXAgdGltZSB0byBsaW5rIGJ5IGRpc2FibGluZyBzbWFydCBwb3dlciBkb3duLiAq
LwoJCWUxMDAwX3JlYWRfcGh5X3JlZyhodywgSUdQMDJFMTAwMF9QSFlfUE9XRVJfTUdNVCwgJnBo
eV90bXApOwoJCXBoeV90bXAgJj0gfklHUDAyRTEwMDBfUE1fU1BEOwoJCWUxMDAwX3dyaXRlX3Bo
eV9yZWcoaHcsIElHUDAyRTEwMDBfUEhZX1BPV0VSX01HTVQsIHBoeV90bXApOwoJfQoKCS8qCgkg
KiBUaGVzZSBwYXJhbWV0ZXJzIGNvbnRyb2wgdGhlIGF1dG9tYXRpYyBnZW5lcmF0aW9uIChUeCkg
YW5kCgkgKiByZXNwb25zZSAoUngpIHRvIEV0aGVybmV0IFBBVVNFIGZyYW1lcy4KCSAqIC0gSGln
aCB3YXRlciBtYXJrIHNob3VsZCBhbGxvdyBmb3IgYXQgbGVhc3QgdHdvIGZyYW1lcyB0byBiZQoJ
ICogICByZWNlaXZlZCBhZnRlciBzZW5kaW5nIGFuIFhPRkYuCgkgKiAtIExvdyB3YXRlciBtYXJr
IHdvcmtzIGJlc3Qgd2hlbiBpdCBpcyB2ZXJ5IG5lYXIgdGhlIGhpZ2ggd2F0ZXIgbWFyay4KCSAq
ICAgVGhpcyBhbGxvd3MgdGhlIHJlY2VpdmVyIHRvIHJlc3RhcnQgYnkgc2VuZGluZyBYT04gd2hl
biBpdCBoYXMKCSAqICAgZHJhaW5lZCBhIGJpdC4gSGVyZSB3ZSB1c2UgYW4gYXJiaXRhcnkgdmFs
dWUgb2YgMTUwMCB3aGljaCB3aWxsCgkgKiAgIHJlc3RhcnQgYWZ0ZXIgb25lIGZ1bGwgZnJhbWUg
aXMgcHVsbGVkIGZyb20gdGhlIGJ1ZmZlci4gVGhlcmUKCSAqICAgY291bGQgYmUgc2V2ZXJhbCBz
bWFsbGVyIGZyYW1lcyBpbiB0aGUgYnVmZmVyIGFuZCBpZiBzbyB0aGV5IHdpbGwKCSAqICAgbm90
IHRyaWdnZXIgdGhlIFhPTiB1bnRpbCB0aGVpciB0b3RhbCBudW1iZXIgcmVkdWNlcyB0aGUgYnVm
ZmVyCgkgKiAgIGJ5IDE1MDAuCgkgKiAtIFRoZSBwYXVzZSB0aW1lIGlzIGZhaXJseSBsYXJnZSBh
dCAxMDAwIHggNTEybnMgPSA1MTIgdXNlYy4KCSAqLwoJcnhfYnVmZmVyX3NpemUgPSAoKEUxMDAw
X1JFQURfUkVHKGh3LCBFMTAwMF9QQkEpICYgMHhmZmZmKSA8PCAxMCApOwoKCWh3LT5mYy5oaWdo
X3dhdGVyID0gcnhfYnVmZmVyX3NpemUgLQoJICAgIHJvdW5kdXAyKGFkYXB0ZXItPm1heF9mcmFt
ZV9zaXplLCAxMDI0KTsKCWh3LT5mYy5sb3dfd2F0ZXIgPSBody0+ZmMuaGlnaF93YXRlciAtIDE1
MDA7CgoJaWYgKGh3LT5tYWMudHlwZSA9PSBlMTAwMF84MDAwM2VzMmxhbikKCQlody0+ZmMucGF1
c2VfdGltZSA9IDB4RkZGRjsKCWVsc2UKCQlody0+ZmMucGF1c2VfdGltZSA9IEVNX0ZDX1BBVVNF
X1RJTUU7CgoJaHctPmZjLnNlbmRfeG9uID0gVFJVRTsKCiAgICAgICAgLyogU2V0IEZsb3cgY29u
dHJvbCwgdXNlIHRoZSB0dW5hYmxlIGxvY2F0aW9uIGlmIHNhbmUgKi8KICAgICAgICBpZiAoKGVt
X2ZjX3NldHRpbmcgPj0gMCkgfHwgKGVtX2ZjX3NldHRpbmcgPCA0KSkKCQlody0+ZmMucmVxdWVz
dGVkX21vZGUgPSBlbV9mY19zZXR0aW5nOwoJZWxzZQoJCWh3LT5mYy5yZXF1ZXN0ZWRfbW9kZSA9
IGUxMDAwX2ZjX25vbmU7CgoJLyogT3ZlcnJpZGUgLSB3b3JrYXJvdW5kIGZvciBQQ0hMQU4gaXNz
dWUgKi8KCWlmIChody0+bWFjLnR5cGUgPT0gZTEwMDBfcGNobGFuKQogICAgICAgICAgICAgICAg
aHctPmZjLnJlcXVlc3RlZF9tb2RlID0gZTEwMDBfZmNfcnhfcGF1c2U7CgoJLyogSXNzdWUgYSBn
bG9iYWwgcmVzZXQgKi8KCWUxMDAwX3Jlc2V0X2h3KGh3KTsKCUUxMDAwX1dSSVRFX1JFRyhodywg
RTEwMDBfV1VDLCAwKTsKCglpZiAoZTEwMDBfaW5pdF9odyhodykgPCAwKSB7CgkJZGV2aWNlX3By
aW50ZihkZXYsICJIYXJkd2FyZSBJbml0aWFsaXphdGlvbiBGYWlsZWRcbiIpOwoJCXJldHVybjsK
CX0KCglFMTAwMF9XUklURV9SRUcoaHcsIEUxMDAwX1ZFVCwgRVRIRVJUWVBFX1ZMQU4pOwoJZTEw
MDBfZ2V0X3BoeV9pbmZvKGh3KTsKCWUxMDAwX2NoZWNrX2Zvcl9saW5rKGh3KTsKCXJldHVybjsK
fQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKgogKgogKiAgU2V0dXAgbmV0d29ya2luZyBkZXZpY2Ugc3RydWN0dXJl
IGFuZCByZWdpc3RlciBhbiBpbnRlcmZhY2UuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgdm9p
ZAplbV9zZXR1cF9pbnRlcmZhY2UoZGV2aWNlX3QgZGV2LCBzdHJ1Y3QgYWRhcHRlciAqYWRhcHRl
cikKewoJc3RydWN0IGlmbmV0ICAgKmlmcDsKCglJTklUX0RFQlVHT1VUKCJlbV9zZXR1cF9pbnRl
cmZhY2U6IGJlZ2luIik7CgoJaWZwID0gYWRhcHRlci0+aWZwID0gaWZfYWxsb2MoSUZUX0VUSEVS
KTsKCWlmIChpZnAgPT0gTlVMTCkKCQlwYW5pYygiJXM6IGNhbiBub3QgaWZfYWxsb2MoKSIsIGRl
dmljZV9nZXRfbmFtZXVuaXQoZGV2KSk7CglpZl9pbml0bmFtZShpZnAsIGRldmljZV9nZXRfbmFt
ZShkZXYpLCBkZXZpY2VfZ2V0X3VuaXQoZGV2KSk7CglpZnAtPmlmX210dSA9IEVUSEVSTVRVOwoJ
aWZwLT5pZl9pbml0ID0gIGVtX2luaXQ7CglpZnAtPmlmX3NvZnRjID0gYWRhcHRlcjsKCWlmcC0+
aWZfZmxhZ3MgPSBJRkZfQlJPQURDQVNUIHwgSUZGX1NJTVBMRVggfCBJRkZfTVVMVElDQVNUOwoJ
aWZwLT5pZl9pb2N0bCA9IGVtX2lvY3RsOwoJaWZwLT5pZl9zdGFydCA9IGVtX3N0YXJ0OwoJSUZR
X1NFVF9NQVhMRU4oJmlmcC0+aWZfc25kLCBhZGFwdGVyLT5udW1fdHhfZGVzYyAtIDEpOwoJaWZw
LT5pZl9zbmQuaWZxX2Rydl9tYXhsZW4gPSBhZGFwdGVyLT5udW1fdHhfZGVzYyAtIDE7CglJRlFf
U0VUX1JFQURZKCZpZnAtPmlmX3NuZCk7CgoJZXRoZXJfaWZhdHRhY2goaWZwLCBhZGFwdGVyLT5o
dy5tYWMuYWRkcik7CgoJaWZwLT5pZl9jYXBhYmlsaXRpZXMgPSBpZnAtPmlmX2NhcGVuYWJsZSA9
IDA7CgojaWZkZWYgRU1fTVVMVElRVUVVRQoJLyogTXVsdGlxdWV1ZSB0eCBmdW5jdGlvbnMgKi8K
CWlmcC0+aWZfdHJhbnNtaXQgPSBlbV9tcV9zdGFydDsKCWlmcC0+aWZfcWZsdXNoID0gZW1fcWZs
dXNoOwojZW5kaWYJCgoJaWZwLT5pZl9jYXBhYmlsaXRpZXMgfD0gSUZDQVBfSFdDU1VNIHwgSUZD
QVBfVkxBTl9IV0NTVU07CglpZnAtPmlmX2NhcGVuYWJsZSB8PSBJRkNBUF9IV0NTVU0gfCBJRkNB
UF9WTEFOX0hXQ1NVTTsKCgkvKiBFbmFibGUgVFNPIGJ5IGRlZmF1bHQsIGNhbiBkaXNhYmxlIHdp
dGggaWZjb25maWcgKi8KCWlmcC0+aWZfY2FwYWJpbGl0aWVzIHw9IElGQ0FQX1RTTzQ7CglpZnAt
PmlmX2NhcGVuYWJsZSB8PSBJRkNBUF9UU080OwoKCS8qCgkgKiBUZWxsIHRoZSB1cHBlciBsYXll
cihzKSB3ZQoJICogc3VwcG9ydCBmdWxsIFZMQU4gY2FwYWJpbGl0eQoJICovCglpZnAtPmlmX2Rh
dGEuaWZpX2hkcmxlbiA9IHNpemVvZihzdHJ1Y3QgZXRoZXJfdmxhbl9oZWFkZXIpOwoJaWZwLT5p
Zl9jYXBhYmlsaXRpZXMgfD0gSUZDQVBfVkxBTl9IV1RBR0dJTkcgfCBJRkNBUF9WTEFOX01UVTsK
CWlmcC0+aWZfY2FwZW5hYmxlIHw9IElGQ0FQX1ZMQU5fSFdUQUdHSU5HIHwgSUZDQVBfVkxBTl9N
VFU7CgoJLyoKCSoqIERvbnQgdHVybiB0aGlzIG9uIGJ5IGRlZmF1bHQsIGlmIHZsYW5zIGFyZQoJ
KiogY3JlYXRlZCBvbiBhbm90aGVyIHBzZXVkbyBkZXZpY2UgKGVnLiBsYWdnKQoJKiogdGhlbiB2
bGFuIGV2ZW50cyBhcmUgbm90IHBhc3NlZCB0aHJ1LCBicmVha2luZwoJKiogb3BlcmF0aW9uLCBi
dXQgd2l0aCBIVyBGSUxURVIgb2ZmIGl0IHdvcmtzLiBJZgoJKiogdXNpbmcgdmxhbnMgZGlyZWN0
bHkgb24gdGhlIGVtIGRyaXZlciB5b3UgY2FuCgkqKiBlbmFibGUgdGhpcyBhbmQgZ2V0IGZ1bGwg
aGFyZHdhcmUgdGFnIGZpbHRlcmluZy4KCSovCglpZnAtPmlmX2NhcGFiaWxpdGllcyB8PSBJRkNB
UF9WTEFOX0hXRklMVEVSOwoKI2lmZGVmIERFVklDRV9QT0xMSU5HCglpZnAtPmlmX2NhcGFiaWxp
dGllcyB8PSBJRkNBUF9QT0xMSU5HOwojZW5kaWYKCgkvKiBFbmFibGUgb25seSBXT0wgTUFHSUMg
YnkgZGVmYXVsdCAqLwoJaWYgKGFkYXB0ZXItPndvbCkgewoJCWlmcC0+aWZfY2FwYWJpbGl0aWVz
IHw9IElGQ0FQX1dPTDsKCQlpZnAtPmlmX2NhcGVuYWJsZSB8PSBJRkNBUF9XT0xfTUFHSUM7Cgl9
CgkJCgkvKgoJICogU3BlY2lmeSB0aGUgbWVkaWEgdHlwZXMgc3VwcG9ydGVkIGJ5IHRoaXMgYWRh
cHRlciBhbmQgcmVnaXN0ZXIKCSAqIGNhbGxiYWNrcyB0byB1cGRhdGUgbWVkaWEgYW5kIGxpbmsg
aW5mb3JtYXRpb24KCSAqLwoJaWZtZWRpYV9pbml0KCZhZGFwdGVyLT5tZWRpYSwgSUZNX0lNQVNL
LAoJICAgIGVtX21lZGlhX2NoYW5nZSwgZW1fbWVkaWFfc3RhdHVzKTsKCWlmICgoYWRhcHRlci0+
aHcucGh5Lm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9maWJlcikgfHwKCSAgICAoYWRh
cHRlci0+aHcucGh5Lm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9pbnRlcm5hbF9zZXJk
ZXMpKSB7CgkJdV9jaGFyIGZpYmVyX3R5cGUgPSBJRk1fMTAwMF9TWDsJLyogZGVmYXVsdCB0eXBl
ICovCgoJCWlmbWVkaWFfYWRkKCZhZGFwdGVyLT5tZWRpYSwgSUZNX0VUSEVSIHwgZmliZXJfdHlw
ZSB8IElGTV9GRFgsIAoJCQkgICAgMCwgTlVMTCk7CgkJaWZtZWRpYV9hZGQoJmFkYXB0ZXItPm1l
ZGlhLCBJRk1fRVRIRVIgfCBmaWJlcl90eXBlLCAwLCBOVUxMKTsKCX0gZWxzZSB7CgkJaWZtZWRp
YV9hZGQoJmFkYXB0ZXItPm1lZGlhLCBJRk1fRVRIRVIgfCBJRk1fMTBfVCwgMCwgTlVMTCk7CgkJ
aWZtZWRpYV9hZGQoJmFkYXB0ZXItPm1lZGlhLCBJRk1fRVRIRVIgfCBJRk1fMTBfVCB8IElGTV9G
RFgsCgkJCSAgICAwLCBOVUxMKTsKCQlpZm1lZGlhX2FkZCgmYWRhcHRlci0+bWVkaWEsIElGTV9F
VEhFUiB8IElGTV8xMDBfVFgsCgkJCSAgICAwLCBOVUxMKTsKCQlpZm1lZGlhX2FkZCgmYWRhcHRl
ci0+bWVkaWEsIElGTV9FVEhFUiB8IElGTV8xMDBfVFggfCBJRk1fRkRYLAoJCQkgICAgMCwgTlVM
TCk7CgkJaWYgKGFkYXB0ZXItPmh3LnBoeS50eXBlICE9IGUxMDAwX3BoeV9pZmUpIHsKCQkJaWZt
ZWRpYV9hZGQoJmFkYXB0ZXItPm1lZGlhLAoJCQkJSUZNX0VUSEVSIHwgSUZNXzEwMDBfVCB8IElG
TV9GRFgsIDAsIE5VTEwpOwoJCQlpZm1lZGlhX2FkZCgmYWRhcHRlci0+bWVkaWEsCgkJCQlJRk1f
RVRIRVIgfCBJRk1fMTAwMF9ULCAwLCBOVUxMKTsKCQl9Cgl9CglpZm1lZGlhX2FkZCgmYWRhcHRl
ci0+bWVkaWEsIElGTV9FVEhFUiB8IElGTV9BVVRPLCAwLCBOVUxMKTsKCWlmbWVkaWFfc2V0KCZh
ZGFwdGVyLT5tZWRpYSwgSUZNX0VUSEVSIHwgSUZNX0FVVE8pOwp9CgoKLyoKICogTWFuYWdlIERN
QSdhYmxlIG1lbW9yeS4KICovCnN0YXRpYyB2b2lkCmVtX2RtYW1hcF9jYih2b2lkICphcmcsIGJ1
c19kbWFfc2VnbWVudF90ICpzZWdzLCBpbnQgbnNlZywgaW50IGVycm9yKQp7CglpZiAoZXJyb3Ip
CgkJcmV0dXJuOwoJKihidXNfYWRkcl90ICopIGFyZyA9IHNlZ3NbMF0uZHNfYWRkcjsKfQoKc3Rh
dGljIGludAplbV9kbWFfbWFsbG9jKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBidXNfc2l6ZV90
IHNpemUsCiAgICAgICAgc3RydWN0IGVtX2RtYV9hbGxvYyAqZG1hLCBpbnQgbWFwZmxhZ3MpCnsK
CWludCBlcnJvcjsKCgllcnJvciA9IGJ1c19kbWFfdGFnX2NyZWF0ZShidXNfZ2V0X2RtYV90YWco
YWRhcHRlci0+ZGV2KSwgLyogcGFyZW50ICovCgkJCQlFTV9EQkFfQUxJR04sIDAsCS8qIGFsaWdu
bWVudCwgYm91bmRzICovCgkJCQlCVVNfU1BBQ0VfTUFYQUREUiwJLyogbG93YWRkciAqLwoJCQkJ
QlVTX1NQQUNFX01BWEFERFIsCS8qIGhpZ2hhZGRyICovCgkJCQlOVUxMLCBOVUxMLAkJLyogZmls
dGVyLCBmaWx0ZXJhcmcgKi8KCQkJCXNpemUsCQkJLyogbWF4c2l6ZSAqLwoJCQkJMSwJCQkvKiBu
c2VnbWVudHMgKi8KCQkJCXNpemUsCQkJLyogbWF4c2Vnc2l6ZSAqLwoJCQkJMCwJCQkvKiBmbGFn
cyAqLwoJCQkJTlVMTCwJCQkvKiBsb2NrZnVuYyAqLwoJCQkJTlVMTCwJCQkvKiBsb2NrYXJnICov
CgkJCQkmZG1hLT5kbWFfdGFnKTsKCWlmIChlcnJvcikgewoJCWRldmljZV9wcmludGYoYWRhcHRl
ci0+ZGV2LAoJCSAgICAiJXM6IGJ1c19kbWFfdGFnX2NyZWF0ZSBmYWlsZWQ6ICVkXG4iLAoJCSAg
ICBfX2Z1bmNfXywgZXJyb3IpOwoJCWdvdG8gZmFpbF8wOwoJfQoKCWVycm9yID0gYnVzX2RtYW1l
bV9hbGxvYyhkbWEtPmRtYV90YWcsICh2b2lkKiopICZkbWEtPmRtYV92YWRkciwKCSAgICBCVVNf
RE1BX05PV0FJVCB8IEJVU19ETUFfQ09IRVJFTlQsICZkbWEtPmRtYV9tYXApOwoJaWYgKGVycm9y
KSB7CgkJZGV2aWNlX3ByaW50ZihhZGFwdGVyLT5kZXYsCgkJICAgICIlczogYnVzX2RtYW1lbV9h
bGxvYyglanUpIGZhaWxlZDogJWRcbiIsCgkJICAgIF9fZnVuY19fLCAodWludG1heF90KXNpemUs
IGVycm9yKTsKCQlnb3RvIGZhaWxfMjsKCX0KCglkbWEtPmRtYV9wYWRkciA9IDA7CgllcnJvciA9
IGJ1c19kbWFtYXBfbG9hZChkbWEtPmRtYV90YWcsIGRtYS0+ZG1hX21hcCwgZG1hLT5kbWFfdmFk
ZHIsCgkgICAgc2l6ZSwgZW1fZG1hbWFwX2NiLCAmZG1hLT5kbWFfcGFkZHIsIG1hcGZsYWdzIHwg
QlVTX0RNQV9OT1dBSVQpOwoJaWYgKGVycm9yIHx8IGRtYS0+ZG1hX3BhZGRyID09IDApIHsKCQlk
ZXZpY2VfcHJpbnRmKGFkYXB0ZXItPmRldiwKCQkgICAgIiVzOiBidXNfZG1hbWFwX2xvYWQgZmFp
bGVkOiAlZFxuIiwKCQkgICAgX19mdW5jX18sIGVycm9yKTsKCQlnb3RvIGZhaWxfMzsKCX0KCgly
ZXR1cm4gKDApOwoKZmFpbF8zOgoJYnVzX2RtYW1hcF91bmxvYWQoZG1hLT5kbWFfdGFnLCBkbWEt
PmRtYV9tYXApOwpmYWlsXzI6CglidXNfZG1hbWVtX2ZyZWUoZG1hLT5kbWFfdGFnLCBkbWEtPmRt
YV92YWRkciwgZG1hLT5kbWFfbWFwKTsKCWJ1c19kbWFfdGFnX2Rlc3Ryb3koZG1hLT5kbWFfdGFn
KTsKZmFpbF8wOgoJZG1hLT5kbWFfbWFwID0gTlVMTDsKCWRtYS0+ZG1hX3RhZyA9IE5VTEw7CgoJ
cmV0dXJuIChlcnJvcik7Cn0KCnN0YXRpYyB2b2lkCmVtX2RtYV9mcmVlKHN0cnVjdCBhZGFwdGVy
ICphZGFwdGVyLCBzdHJ1Y3QgZW1fZG1hX2FsbG9jICpkbWEpCnsKCWlmIChkbWEtPmRtYV90YWcg
PT0gTlVMTCkKCQlyZXR1cm47CglpZiAoZG1hLT5kbWFfbWFwICE9IE5VTEwpIHsKCQlidXNfZG1h
bWFwX3N5bmMoZG1hLT5kbWFfdGFnLCBkbWEtPmRtYV9tYXAsCgkJICAgIEJVU19ETUFTWU5DX1BP
U1RSRUFEIHwgQlVTX0RNQVNZTkNfUE9TVFdSSVRFKTsKCQlidXNfZG1hbWFwX3VubG9hZChkbWEt
PmRtYV90YWcsIGRtYS0+ZG1hX21hcCk7CgkJYnVzX2RtYW1lbV9mcmVlKGRtYS0+ZG1hX3RhZywg
ZG1hLT5kbWFfdmFkZHIsIGRtYS0+ZG1hX21hcCk7CgkJZG1hLT5kbWFfbWFwID0gTlVMTDsKCX0K
CWJ1c19kbWFfdGFnX2Rlc3Ryb3koZG1hLT5kbWFfdGFnKTsKCWRtYS0+ZG1hX3RhZyA9IE5VTEw7
Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqCiAqCiAqICBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSB0cmFuc21p
dCBhbmQgcmVjZWl2ZSByaW5ncywgYW5kIHRoZW4KICogIHRoZSBkZXNjcmlwdG9ycyBhc3NvY2lh
dGVkIHdpdGggZWFjaCwgY2FsbGVkIG9ubHkgb25jZSBhdCBhdHRhY2guCiAqCiAqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqLwpzdGF0aWMgaW50CmVtX2FsbG9jYXRlX3F1ZXVlcyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRl
cikKewoJZGV2aWNlX3QJCWRldiA9IGFkYXB0ZXItPmRldjsKCXN0cnVjdCB0eF9yaW5nCQkqdHhy
ID0gTlVMTDsKCXN0cnVjdCByeF9yaW5nCQkqcnhyID0gTlVMTDsKCWludCByc2l6ZSwgdHNpemUs
IGVycm9yID0gRTEwMDBfU1VDQ0VTUzsKCWludCB0eGNvbmYgPSAwLCByeGNvbmYgPSAwOwoKCgkv
KiBBbGxvY2F0ZSB0aGUgVFggcmluZyBzdHJ1Y3QgbWVtb3J5ICovCglpZiAoIShhZGFwdGVyLT50
eF9yaW5ncyA9CgkgICAgKHN0cnVjdCB0eF9yaW5nICopIG1hbGxvYyhzaXplb2Yoc3RydWN0IHR4
X3JpbmcpICoKCSAgICBhZGFwdGVyLT5udW1fcXVldWVzLCBNX0RFVkJVRiwgTV9OT1dBSVQgfCBN
X1pFUk8pKSkgewoJCWRldmljZV9wcmludGYoZGV2LCAiVW5hYmxlIHRvIGFsbG9jYXRlIFRYIHJp
bmcgbWVtb3J5XG4iKTsKCQllcnJvciA9IEVOT01FTTsKCQlnb3RvIGZhaWw7Cgl9CgoJLyogTm93
IGFsbG9jYXRlIHRoZSBSWCAqLwoJaWYgKCEoYWRhcHRlci0+cnhfcmluZ3MgPQoJICAgIChzdHJ1
Y3QgcnhfcmluZyAqKSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCByeF9yaW5nKSAqCgkgICAgYWRhcHRl
ci0+bnVtX3F1ZXVlcywgTV9ERVZCVUYsIE1fTk9XQUlUIHwgTV9aRVJPKSkpIHsKCQlkZXZpY2Vf
cHJpbnRmKGRldiwgIlVuYWJsZSB0byBhbGxvY2F0ZSBSWCByaW5nIG1lbW9yeVxuIik7CgkJZXJy
b3IgPSBFTk9NRU07CgkJZ290byByeF9mYWlsOwoJfQoKCXRzaXplID0gcm91bmR1cDIoYWRhcHRl
ci0+bnVtX3R4X2Rlc2MgKgoJICAgIHNpemVvZihzdHJ1Y3QgZTEwMDBfdHhfZGVzYyksIEVNX0RC
QV9BTElHTik7CgkvKgoJICogTm93IHNldCB1cCB0aGUgVFggcXVldWVzLCB0eGNvbmYgaXMgbmVl
ZGVkIHRvIGhhbmRsZSB0aGUKCSAqIHBvc3NpYmlsaXR5IHRoYXQgdGhpbmdzIGZhaWwgbWlkY291
cnNlIGFuZCB3ZSBuZWVkIHRvCgkgKiB1bmRvIG1lbW9yeSBncmFjZWZ1bGx5CgkgKi8gCglmb3Ig
KGludCBpID0gMDsgaSA8IGFkYXB0ZXItPm51bV9xdWV1ZXM7IGkrKywgdHhjb25mKyspIHsKCQkv
KiBTZXQgdXAgc29tZSBiYXNpY3MgKi8KCQl0eHIgPSAmYWRhcHRlci0+dHhfcmluZ3NbaV07CgkJ
dHhyLT5hZGFwdGVyID0gYWRhcHRlcjsKCQl0eHItPm1lID0gaTsKCgkJLyogSW5pdGlhbGl6ZSB0
aGUgVFggbG9jayAqLwoJCXNucHJpbnRmKHR4ci0+bXR4X25hbWUsIHNpemVvZih0eHItPm10eF9u
YW1lKSwgIiVzOnR4KCVkKSIsCgkJICAgIGRldmljZV9nZXRfbmFtZXVuaXQoZGV2KSwgdHhyLT5t
ZSk7CgkJbXR4X2luaXQoJnR4ci0+dHhfbXR4LCB0eHItPm10eF9uYW1lLCBOVUxMLCBNVFhfREVG
KTsKCgkJaWYgKGVtX2RtYV9tYWxsb2MoYWRhcHRlciwgdHNpemUsCgkJCSZ0eHItPnR4ZG1hLCBC
VVNfRE1BX05PV0FJVCkpIHsKCQkJZGV2aWNlX3ByaW50ZihkZXYsCgkJCSAgICAiVW5hYmxlIHRv
IGFsbG9jYXRlIFRYIERlc2NyaXB0b3IgbWVtb3J5XG4iKTsKCQkJZXJyb3IgPSBFTk9NRU07CgkJ
CWdvdG8gZXJyX3R4X2Rlc2M7CgkJfQoJCXR4ci0+dHhfYmFzZSA9IChzdHJ1Y3QgZTEwMDBfdHhf
ZGVzYyAqKXR4ci0+dHhkbWEuZG1hX3ZhZGRyOwoJCWJ6ZXJvKCh2b2lkICopdHhyLT50eF9iYXNl
LCB0c2l6ZSk7CgogICAgICAgIAlpZiAoZW1fYWxsb2NhdGVfdHJhbnNtaXRfYnVmZmVycyh0eHIp
KSB7CgkJCWRldmljZV9wcmludGYoZGV2LAoJCQkgICAgIkNyaXRpY2FsIEZhaWx1cmUgc2V0dGlu
ZyB1cCB0cmFuc21pdCBidWZmZXJzXG4iKTsKCQkJZXJyb3IgPSBFTk9NRU07CgkJCWdvdG8gZXJy
X3R4X2Rlc2M7CiAgICAgICAgCX0KI2lmIF9fRnJlZUJTRF92ZXJzaW9uID49IDgwMDAwMAoJCS8q
IEFsbG9jYXRlIGEgYnVmIHJpbmcgKi8KCQl0eHItPmJyID0gYnVmX3JpbmdfYWxsb2MoNDA5Niwg
TV9ERVZCVUYsCgkJICAgIE1fV0FJVE9LLCAmdHhyLT50eF9tdHgpOwojZW5kaWYKCX0KCgkvKgoJ
ICogTmV4dCB0aGUgUlggcXVldWVzLi4uCgkgKi8gCglyc2l6ZSA9IHJvdW5kdXAyKGFkYXB0ZXIt
Pm51bV9yeF9kZXNjICoKCSAgICBzaXplb2Yoc3RydWN0IGUxMDAwX3J4X2Rlc2MpLCBFTV9EQkFf
QUxJR04pOwoJZm9yIChpbnQgaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1fcXVldWVzOyBpKyssIHJ4
Y29uZisrKSB7CgkJcnhyID0gJmFkYXB0ZXItPnJ4X3JpbmdzW2ldOwoJCXJ4ci0+YWRhcHRlciA9
IGFkYXB0ZXI7CgkJcnhyLT5tZSA9IGk7CgoJCS8qIEluaXRpYWxpemUgdGhlIFJYIGxvY2sgKi8K
CQlzbnByaW50ZihyeHItPm10eF9uYW1lLCBzaXplb2YocnhyLT5tdHhfbmFtZSksICIlczpyeCgl
ZCkiLAoJCSAgICBkZXZpY2VfZ2V0X25hbWV1bml0KGRldiksIHR4ci0+bWUpOwoJCW10eF9pbml0
KCZyeHItPnJ4X210eCwgcnhyLT5tdHhfbmFtZSwgTlVMTCwgTVRYX0RFRik7CgoJCWlmIChlbV9k
bWFfbWFsbG9jKGFkYXB0ZXIsIHJzaXplLAoJCQkmcnhyLT5yeGRtYSwgQlVTX0RNQV9OT1dBSVQp
KSB7CgkJCWRldmljZV9wcmludGYoZGV2LAoJCQkgICAgIlVuYWJsZSB0byBhbGxvY2F0ZSBSeERl
c2NyaXB0b3IgbWVtb3J5XG4iKTsKCQkJZXJyb3IgPSBFTk9NRU07CgkJCWdvdG8gZXJyX3J4X2Rl
c2M7CgkJfQoJCXJ4ci0+cnhfYmFzZSA9IChzdHJ1Y3QgZTEwMDBfcnhfZGVzYyAqKXJ4ci0+cnhk
bWEuZG1hX3ZhZGRyOwoJCWJ6ZXJvKCh2b2lkICopcnhyLT5yeF9iYXNlLCByc2l6ZSk7CgogICAg
ICAgIAkvKiBBbGxvY2F0ZSByZWNlaXZlIGJ1ZmZlcnMgZm9yIHRoZSByaW5nKi8KCQlpZiAoZW1f
YWxsb2NhdGVfcmVjZWl2ZV9idWZmZXJzKHJ4cikpIHsKCQkJZGV2aWNlX3ByaW50ZihkZXYsCgkJ
CSAgICAiQ3JpdGljYWwgRmFpbHVyZSBzZXR0aW5nIHVwIHJlY2VpdmUgYnVmZmVyc1xuIik7CgkJ
CWVycm9yID0gRU5PTUVNOwoJCQlnb3RvIGVycl9yeF9kZXNjOwoJCX0KCX0KCglyZXR1cm4gKDAp
OwoKZXJyX3J4X2Rlc2M6Cglmb3IgKHJ4ciA9IGFkYXB0ZXItPnJ4X3JpbmdzOyByeGNvbmYgPiAw
OyByeHIrKywgcnhjb25mLS0pCgkJZW1fZG1hX2ZyZWUoYWRhcHRlciwgJnJ4ci0+cnhkbWEpOwpl
cnJfdHhfZGVzYzoKCWZvciAodHhyID0gYWRhcHRlci0+dHhfcmluZ3M7IHR4Y29uZiA+IDA7IHR4
cisrLCB0eGNvbmYtLSkKCQllbV9kbWFfZnJlZShhZGFwdGVyLCAmdHhyLT50eGRtYSk7CglmcmVl
KGFkYXB0ZXItPnJ4X3JpbmdzLCBNX0RFVkJVRik7CnJ4X2ZhaWw6CiNpZiBfX0ZyZWVCU0RfdmVy
c2lvbiA+PSA4MDAwMDAKCWJ1Zl9yaW5nX2ZyZWUodHhyLT5iciwgTV9ERVZCVUYpOwojZW5kaWYK
CWZyZWUoYWRhcHRlci0+dHhfcmluZ3MsIE1fREVWQlVGKTsKZmFpbDoKCXJldHVybiAoZXJyb3Ip
Owp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKgogKgogKiAgQWxsb2NhdGUgbWVtb3J5IGZvciB0eF9idWZmZXIg
c3RydWN0dXJlcy4gVGhlIHR4X2J1ZmZlciBzdG9yZXMgYWxsCiAqICB0aGUgaW5mb3JtYXRpb24g
bmVlZGVkIHRvIHRyYW5zbWl0IGEgcGFja2V0IG9uIHRoZSB3aXJlLiBUaGlzIGlzCiAqICBjYWxs
ZWQgb25seSBvbmNlIGF0IGF0dGFjaCwgc2V0dXAgaXMgZG9uZSBldmVyeSByZXNldC4KICoKICoq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKiovCnN0YXRpYyBpbnQKZW1fYWxsb2NhdGVfdHJhbnNtaXRfYnVmZmVycyhzdHJ1
Y3QgdHhfcmluZyAqdHhyKQp7CglzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IHR4ci0+YWRhcHRl
cjsKCWRldmljZV90IGRldiA9IGFkYXB0ZXItPmRldjsKCXN0cnVjdCBlbV9idWZmZXIgKnR4YnVm
OwoJaW50IGVycm9yLCBpOwoKCS8qCgkgKiBTZXR1cCBETUEgZGVzY3JpcHRvciBhcmVhcy4KCSAq
LwoJaWYgKChlcnJvciA9IGJ1c19kbWFfdGFnX2NyZWF0ZShidXNfZ2V0X2RtYV90YWcoZGV2KSwK
CQkJICAgICAgIDEsIDAsCQkJLyogYWxpZ25tZW50LCBib3VuZHMgKi8KCQkJICAgICAgIEJVU19T
UEFDRV9NQVhBRERSLAkvKiBsb3dhZGRyICovCgkJCSAgICAgICBCVVNfU1BBQ0VfTUFYQUREUiwJ
LyogaGlnaGFkZHIgKi8KCQkJICAgICAgIE5VTEwsIE5VTEwsCQkvKiBmaWx0ZXIsIGZpbHRlcmFy
ZyAqLwoJCQkgICAgICAgRU1fVFNPX1NJWkUsCQkvKiBtYXhzaXplICovCgkJCSAgICAgICBFTV9N
QVhfU0NBVFRFUiwJCS8qIG5zZWdtZW50cyAqLwoJCQkgICAgICAgUEFHRV9TSVpFLAkJLyogbWF4
c2Vnc2l6ZSAqLwoJCQkgICAgICAgMCwJCQkvKiBmbGFncyAqLwoJCQkgICAgICAgTlVMTCwJCQkv
KiBsb2NrZnVuYyAqLwoJCQkgICAgICAgTlVMTCwJCQkvKiBsb2NrZnVuY2FyZyAqLwoJCQkgICAg
ICAgJnR4ci0+dHh0YWcpKSkgewoJCWRldmljZV9wcmludGYoZGV2LCJVbmFibGUgdG8gYWxsb2Nh
dGUgVFggRE1BIHRhZ1xuIik7CgkJZ290byBmYWlsOwoJfQoKCWlmICghKHR4ci0+dHhfYnVmZmVy
cyA9CgkgICAgKHN0cnVjdCBlbV9idWZmZXIgKikgbWFsbG9jKHNpemVvZihzdHJ1Y3QgZW1fYnVm
ZmVyKSAqCgkgICAgYWRhcHRlci0+bnVtX3R4X2Rlc2MsIE1fREVWQlVGLCBNX05PV0FJVCB8IE1f
WkVSTykpKSB7CgkJZGV2aWNlX3ByaW50ZihkZXYsICJVbmFibGUgdG8gYWxsb2NhdGUgdHhfYnVm
ZmVyIG1lbW9yeVxuIik7CgkJZXJyb3IgPSBFTk9NRU07CgkJZ290byBmYWlsOwoJfQoKICAgICAg
ICAvKiBDcmVhdGUgdGhlIGRlc2NyaXB0b3IgYnVmZmVyIGRtYSBtYXBzICovCgl0eGJ1ZiA9IHR4
ci0+dHhfYnVmZmVyczsKCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1fdHhfZGVzYzsgaSsr
LCB0eGJ1ZisrKSB7CgkJZXJyb3IgPSBidXNfZG1hbWFwX2NyZWF0ZSh0eHItPnR4dGFnLCAwLCAm
dHhidWYtPm1hcCk7CgkJaWYgKGVycm9yICE9IDApIHsKCQkJZGV2aWNlX3ByaW50ZihkZXYsICJV
bmFibGUgdG8gY3JlYXRlIFRYIERNQSBtYXBcbiIpOwoJCQlnb3RvIGZhaWw7CgkJfQoJfQoKCXJl
dHVybiAwOwpmYWlsOgoJLyogV2UgZnJlZSBhbGwsIGl0IGhhbmRsZXMgY2FzZSB3aGVyZSB3ZSBh
cmUgaW4gdGhlIG1pZGRsZSAqLwoJZW1fZnJlZV90cmFuc21pdF9zdHJ1Y3R1cmVzKGFkYXB0ZXIp
OwoJcmV0dXJuIChlcnJvcik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIEluaXRpYWxpemUgYSB0
cmFuc21pdCByaW5nLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQKZW1fc2V0dXBfdHJh
bnNtaXRfcmluZyhzdHJ1Y3QgdHhfcmluZyAqdHhyKQp7CglzdHJ1Y3QgYWRhcHRlciAqYWRhcHRl
ciA9IHR4ci0+YWRhcHRlcjsKCXN0cnVjdCBlbV9idWZmZXIgKnR4YnVmOwoJaW50IGk7CgoJLyog
Q2xlYXIgdGhlIG9sZCBkZXNjcmlwdG9yIGNvbnRlbnRzICovCglFTV9UWF9MT0NLKHR4cik7Cgli
emVybygodm9pZCAqKXR4ci0+dHhfYmFzZSwKCSAgICAgIChzaXplb2Yoc3RydWN0IGUxMDAwX3R4
X2Rlc2MpKSAqIGFkYXB0ZXItPm51bV90eF9kZXNjKTsKCS8qIFJlc2V0IGluZGljZXMgKi8KCXR4
ci0+bmV4dF9hdmFpbF9kZXNjID0gMDsKCXR4ci0+bmV4dF90b19jbGVhbiA9IDA7CgoJLyogRnJl
ZSBhbnkgZXhpc3RpbmcgdHggYnVmZmVycy4gKi8KICAgICAgICB0eGJ1ZiA9IHR4ci0+dHhfYnVm
ZmVyczsKCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1fdHhfZGVzYzsgaSsrLCB0eGJ1Zisr
KSB7CgkJaWYgKHR4YnVmLT5tX2hlYWQgIT0gTlVMTCkgewoJCQlidXNfZG1hbWFwX3N5bmModHhy
LT50eHRhZywgdHhidWYtPm1hcCwKCQkJICAgIEJVU19ETUFTWU5DX1BPU1RXUklURSk7CgkJCWJ1
c19kbWFtYXBfdW5sb2FkKHR4ci0+dHh0YWcsIHR4YnVmLT5tYXApOwoJCQltX2ZyZWVtKHR4YnVm
LT5tX2hlYWQpOwoJCQl0eGJ1Zi0+bV9oZWFkID0gTlVMTDsKCQl9CgkJLyogY2xlYXIgdGhlIHdh
dGNoIGluZGV4ICovCgkJdHhidWYtPm5leHRfZW9wID0gLTE7CiAgICAgICAgfQoKCS8qIFNldCBu
dW1iZXIgb2YgZGVzY3JpcHRvcnMgYXZhaWxhYmxlICovCgl0eHItPnR4X2F2YWlsID0gYWRhcHRl
ci0+bnVtX3R4X2Rlc2M7CgoJYnVzX2RtYW1hcF9zeW5jKHR4ci0+dHhkbWEuZG1hX3RhZywgdHhy
LT50eGRtYS5kbWFfbWFwLAoJICAgIEJVU19ETUFTWU5DX1BSRVJFQUQgfCBCVVNfRE1BU1lOQ19Q
UkVXUklURSk7CglFTV9UWF9VTkxPQ0sodHhyKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgSW5p
dGlhbGl6ZSBhbGwgdHJhbnNtaXQgcmluZ3MuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgdm9p
ZAplbV9zZXR1cF90cmFuc21pdF9zdHJ1Y3R1cmVzKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQp7
CglzdHJ1Y3QgdHhfcmluZyAqdHhyID0gYWRhcHRlci0+dHhfcmluZ3M7CgoJZm9yIChpbnQgaSA9
IDA7IGkgPCBhZGFwdGVyLT5udW1fcXVldWVzOyBpKyssIHR4cisrKQoJCWVtX3NldHVwX3RyYW5z
bWl0X3JpbmcodHhyKTsKCglyZXR1cm47Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIEVuYWJsZSB0
cmFuc21pdCB1bml0LgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQKZW1faW5pdGlhbGl6
ZV90cmFuc21pdF91bml0KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQp7CglzdHJ1Y3QgdHhfcmlu
ZwkqdHhyID0gYWRhcHRlci0+dHhfcmluZ3M7CglzdHJ1Y3QgZTEwMDBfaHcJKmh3ID0gJmFkYXB0
ZXItPmh3OwoJdTMyCXRjdGwsIHRhcmMsIHRpcGcgPSAwOwoKCSBJTklUX0RFQlVHT1VUKCJlbV9p
bml0aWFsaXplX3RyYW5zbWl0X3VuaXQ6IGJlZ2luIik7CgoJZm9yIChpbnQgaSA9IDA7IGkgPCBh
ZGFwdGVyLT5udW1fcXVldWVzOyBpKyssIHR4cisrKSB7CgkJdTY0IGJ1c19hZGRyID0gdHhyLT50
eGRtYS5kbWFfcGFkZHI7CgkJLyogQmFzZSBhbmQgTGVuIG9mIFRYIFJpbmcgKi8KCQlFMTAwMF9X
UklURV9SRUcoaHcsIEUxMDAwX1RETEVOKGkpLAoJICAgIAkgICAgYWRhcHRlci0+bnVtX3R4X2Rl
c2MgKiBzaXplb2Yoc3RydWN0IGUxMDAwX3R4X2Rlc2MpKTsKCQlFMTAwMF9XUklURV9SRUcoaHcs
IEUxMDAwX1REQkFIKGkpLAoJICAgIAkgICAgKHUzMikoYnVzX2FkZHIgPj4gMzIpKTsKCQlFMTAw
MF9XUklURV9SRUcoaHcsIEUxMDAwX1REQkFMKGkpLAoJICAgIAkgICAgKHUzMilidXNfYWRkcik7
CgkJLyogSW5pdCB0aGUgSEVBRC9UQUlMIGluZGljZXMgKi8KCQlFMTAwMF9XUklURV9SRUcoaHcs
IEUxMDAwX1REVChpKSwgMCk7CgkJRTEwMDBfV1JJVEVfUkVHKGh3LCBFMTAwMF9UREgoaSksIDAp
OwoKCQlIV19ERUJVR09VVDIoIkJhc2UgPSAleCwgTGVuZ3RoID0gJXhcbiIsCgkJICAgIEUxMDAw
X1JFQURfUkVHKCZhZGFwdGVyLT5odywgRTEwMDBfVERCQUwoaSkpLAoJCSAgICBFMTAwMF9SRUFE
X1JFRygmYWRhcHRlci0+aHcsIEUxMDAwX1RETEVOKGkpKSk7CgoJCXR4ci0+d2F0Y2hkb2dfY2hl
Y2sgPSBGQUxTRTsKCX0KCgkvKiBTZXQgdGhlIGRlZmF1bHQgdmFsdWVzIGZvciB0aGUgVHggSW50
ZXIgUGFja2V0IEdhcCB0aW1lciAqLwoJc3dpdGNoIChhZGFwdGVyLT5ody5tYWMudHlwZSkgewoJ
Y2FzZSBlMTAwMF84MjU0MjoKCQl0aXBnID0gREVGQVVMVF84MjU0Ml9USVBHX0lQR1Q7CgkJdGlw
ZyB8PSBERUZBVUxUXzgyNTQyX1RJUEdfSVBHUjEgPDwgRTEwMDBfVElQR19JUEdSMV9TSElGVDsK
CQl0aXBnIHw9IERFRkFVTFRfODI1NDJfVElQR19JUEdSMiA8PCBFMTAwMF9USVBHX0lQR1IyX1NI
SUZUOwoJCWJyZWFrOwoJY2FzZSBlMTAwMF84MDAwM2VzMmxhbjoKCQl0aXBnID0gREVGQVVMVF84
MjU0M19USVBHX0lQR1IxOwoJCXRpcGcgfD0gREVGQVVMVF84MDAwM0VTMkxBTl9USVBHX0lQR1Iy
IDw8CgkJICAgIEUxMDAwX1RJUEdfSVBHUjJfU0hJRlQ7CgkJYnJlYWs7CglkZWZhdWx0OgoJCWlm
ICgoYWRhcHRlci0+aHcucGh5Lm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9maWJlcikg
fHwKCQkgICAgKGFkYXB0ZXItPmh3LnBoeS5tZWRpYV90eXBlID09CgkJICAgIGUxMDAwX21lZGlh
X3R5cGVfaW50ZXJuYWxfc2VyZGVzKSkKCQkJdGlwZyA9IERFRkFVTFRfODI1NDNfVElQR19JUEdU
X0ZJQkVSOwoJCWVsc2UKCQkJdGlwZyA9IERFRkFVTFRfODI1NDNfVElQR19JUEdUX0NPUFBFUjsK
CQl0aXBnIHw9IERFRkFVTFRfODI1NDNfVElQR19JUEdSMSA8PCBFMTAwMF9USVBHX0lQR1IxX1NI
SUZUOwoJCXRpcGcgfD0gREVGQVVMVF84MjU0M19USVBHX0lQR1IyIDw8IEUxMDAwX1RJUEdfSVBH
UjJfU0hJRlQ7Cgl9CgoJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgRTEwMDBfVElQRywg
dGlwZyk7CglFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBFMTAwMF9USURWLCBhZGFwdGVy
LT50eF9pbnRfZGVsYXkudmFsdWUpOwoKCWlmKGFkYXB0ZXItPmh3Lm1hYy50eXBlID49IGUxMDAw
XzgyNTQwKQoJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIEUxMDAwX1RBRFYsCgkJICAg
IGFkYXB0ZXItPnR4X2Fic19pbnRfZGVsYXkudmFsdWUpOwoKCWlmICgoYWRhcHRlci0+aHcubWFj
LnR5cGUgPT0gZTEwMDBfODI1NzEpIHx8CgkgICAgKGFkYXB0ZXItPmh3Lm1hYy50eXBlID09IGUx
MDAwXzgyNTcyKSkgewoJCXRhcmMgPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIEUxMDAw
X1RBUkMoMCkpOwoJCXRhcmMgfD0gU1BFRURfTU9ERV9CSVQ7CgkJRTEwMDBfV1JJVEVfUkVHKCZh
ZGFwdGVyLT5odywgRTEwMDBfVEFSQygwKSwgdGFyYyk7Cgl9IGVsc2UgaWYgKGFkYXB0ZXItPmh3
Lm1hYy50eXBlID09IGUxMDAwXzgwMDAzZXMybGFuKSB7CgkJdGFyYyA9IEUxMDAwX1JFQURfUkVH
KCZhZGFwdGVyLT5odywgRTEwMDBfVEFSQygwKSk7CgkJdGFyYyB8PSAxOwoJCUUxMDAwX1dSSVRF
X1JFRygmYWRhcHRlci0+aHcsIEUxMDAwX1RBUkMoMCksIHRhcmMpOwoJCXRhcmMgPSBFMTAwMF9S
RUFEX1JFRygmYWRhcHRlci0+aHcsIEUxMDAwX1RBUkMoMSkpOwoJCXRhcmMgfD0gMTsKCQlFMTAw
MF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBFMTAwMF9UQVJDKDEpLCB0YXJjKTsKCX0KCglhZGFw
dGVyLT50eGRfY21kID0gRTEwMDBfVFhEX0NNRF9JRkNTOwoJaWYgKGFkYXB0ZXItPnR4X2ludF9k
ZWxheS52YWx1ZSA+IDApCgkJYWRhcHRlci0+dHhkX2NtZCB8PSBFMTAwMF9UWERfQ01EX0lERTsK
CgkvKiBQcm9ncmFtIHRoZSBUcmFuc21pdCBDb250cm9sIFJlZ2lzdGVyICovCgl0Y3RsID0gRTEw
MDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBFMTAwMF9UQ1RMKTsKCXRjdGwgJj0gfkUxMDAwX1RD
VExfQ1Q7Cgl0Y3RsIHw9IChFMTAwMF9UQ1RMX1BTUCB8IEUxMDAwX1RDVExfUlRMQyB8IEUxMDAw
X1RDVExfRU4gfAoJCSAgIChFMTAwMF9DT0xMSVNJT05fVEhSRVNIT0xEIDw8IEUxMDAwX0NUX1NI
SUZUKSk7CgoJaWYgKGFkYXB0ZXItPmh3Lm1hYy50eXBlID49IGUxMDAwXzgyNTcxKQoJCXRjdGwg
fD0gRTEwMDBfVENUTF9NVUxSOwoKCS8qIFRoaXMgd3JpdGUgd2lsbCBlZmZlY3RpdmVseSB0dXJu
IG9uIHRoZSB0cmFuc21pdCB1bml0LiAqLwoJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywg
RTEwMDBfVENUTCwgdGN0bCk7Cgp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgRnJlZSBhbGwgdHJh
bnNtaXQgcmluZ3MuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgdm9pZAplbV9mcmVlX3RyYW5z
bWl0X3N0cnVjdHVyZXMoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCnsKCXN0cnVjdCB0eF9yaW5n
ICp0eHIgPSBhZGFwdGVyLT50eF9yaW5nczsKCglmb3IgKGludCBpID0gMDsgaSA8IGFkYXB0ZXIt
Pm51bV9xdWV1ZXM7IGkrKywgdHhyKyspIHsKCQlFTV9UWF9MT0NLKHR4cik7CgkJZW1fZnJlZV90
cmFuc21pdF9idWZmZXJzKHR4cik7CgkJZW1fZG1hX2ZyZWUoYWRhcHRlciwgJnR4ci0+dHhkbWEp
OwoJCUVNX1RYX1VOTE9DSyh0eHIpOwoJCUVNX1RYX0xPQ0tfREVTVFJPWSh0eHIpOwoJfQoKCWZy
ZWUoYWRhcHRlci0+dHhfcmluZ3MsIE1fREVWQlVGKTsKfQoKLyoqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAg
RnJlZSB0cmFuc21pdCByaW5nIHJlbGF0ZWQgZGF0YSBzdHJ1Y3R1cmVzLgogKgogKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKi8Kc3RhdGljIHZvaWQKZW1fZnJlZV90cmFuc21pdF9idWZmZXJzKHN0cnVjdCB0eF9yaW5n
ICp0eHIpCnsKCXN0cnVjdCBhZGFwdGVyCQkqYWRhcHRlciA9IHR4ci0+YWRhcHRlcjsKCXN0cnVj
dCBlbV9idWZmZXIJKnR4YnVmOwoKCUlOSVRfREVCVUdPVVQoImZyZWVfdHJhbnNtaXRfcmluZzog
YmVnaW4iKTsKCglpZiAodHhyLT50eF9idWZmZXJzID09IE5VTEwpCgkJcmV0dXJuOwoKCWZvciAo
aW50IGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtX3R4X2Rlc2M7IGkrKykgewoJCXR4YnVmID0gJnR4
ci0+dHhfYnVmZmVyc1tpXTsKCQlpZiAodHhidWYtPm1faGVhZCAhPSBOVUxMKSB7CgkJCWJ1c19k
bWFtYXBfc3luYyh0eHItPnR4dGFnLCB0eGJ1Zi0+bWFwLAoJCQkgICAgQlVTX0RNQVNZTkNfUE9T
VFdSSVRFKTsKCQkJYnVzX2RtYW1hcF91bmxvYWQodHhyLT50eHRhZywKCQkJICAgIHR4YnVmLT5t
YXApOwoJCQltX2ZyZWVtKHR4YnVmLT5tX2hlYWQpOwoJCQl0eGJ1Zi0+bV9oZWFkID0gTlVMTDsK
CQkJaWYgKHR4YnVmLT5tYXAgIT0gTlVMTCkgewoJCQkJYnVzX2RtYW1hcF9kZXN0cm95KHR4ci0+
dHh0YWcsCgkJCQkgICAgdHhidWYtPm1hcCk7CgkJCQl0eGJ1Zi0+bWFwID0gTlVMTDsKCQkJfQoJ
CX0gZWxzZSBpZiAodHhidWYtPm1hcCAhPSBOVUxMKSB7CgkJCWJ1c19kbWFtYXBfdW5sb2FkKHR4
ci0+dHh0YWcsCgkJCSAgICB0eGJ1Zi0+bWFwKTsKCQkJYnVzX2RtYW1hcF9kZXN0cm95KHR4ci0+
dHh0YWcsCgkJCSAgICB0eGJ1Zi0+bWFwKTsKCQkJdHhidWYtPm1hcCA9IE5VTEw7CgkJfQoJfQoj
aWYgX19GcmVlQlNEX3ZlcnNpb24gPj0gODAwMDAwCglpZiAodHhyLT5iciAhPSBOVUxMKQoJCWJ1
Zl9yaW5nX2ZyZWUodHhyLT5iciwgTV9ERVZCVUYpOwojZW5kaWYKCWlmICh0eHItPnR4X2J1ZmZl
cnMgIT0gTlVMTCkgewoJCWZyZWUodHhyLT50eF9idWZmZXJzLCBNX0RFVkJVRik7CgkJdHhyLT50
eF9idWZmZXJzID0gTlVMTDsKCX0KCWlmICh0eHItPnR4dGFnICE9IE5VTEwpIHsKCQlidXNfZG1h
X3RhZ19kZXN0cm95KHR4ci0+dHh0YWcpOwoJCXR4ci0+dHh0YWcgPSBOVUxMOwoJfQoJcmV0dXJu
Owp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKgogKgogKiAgVGhlIG9mZmxvYWQgY29udGV4dCBuZWVkcyB0byBi
ZSBzZXQgd2hlbiB3ZSB0cmFuc2ZlciB0aGUgZmlyc3QKICogIHBhY2tldCBvZiBhIHBhcnRpY3Vs
YXIgcHJvdG9jb2wgKFRDUC9VRFApLiBUaGlzIHJvdXRpbmUgaGFzIGJlZW4KICogIGVuaGFuY2Vk
IHRvIGRlYWwgd2l0aCBpbnNlcnRlZCBWTEFOIGhlYWRlcnMsIGFuZCBJUFY2IChub3QgY29tcGxl
dGUpCiAqCiAqICBBZGRlZCBiYWNrIHRoZSBvbGQgbWV0aG9kIG9mIGtlZXBpbmcgdGhlIGN1cnJl
bnQgY29udGV4dCB0eXBlCiAqICBhbmQgbm90IHNldHRpbmcgaWYgdW5uZWNlc3NhcnksIGFzIHRo
aXMgaXMgcmVwb3J0ZWQgdG8gYmUgYQogKiAgYmlnIHBlcmZvcm1hbmNlIHdpbi4gIC1qZnYKICoq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKiovCnN0YXRpYyB2b2lkCmVtX3RyYW5zbWl0X2NoZWNrc3VtX3NldHVwKHN0cnVj
dCB0eF9yaW5nICp0eHIsIHN0cnVjdCBtYnVmICptcCwKICAgIHUzMiAqdHhkX3VwcGVyLCB1MzIg
KnR4ZF9sb3dlcikKewoJc3RydWN0IGFkYXB0ZXIJCQkqYWRhcHRlciA9IHR4ci0+YWRhcHRlcjsK
CXN0cnVjdCBlMTAwMF9jb250ZXh0X2Rlc2MJKlRYRCA9IE5VTEw7CglzdHJ1Y3QgZW1fYnVmZmVy
ICp0eF9idWZmZXI7CglzdHJ1Y3QgZXRoZXJfdmxhbl9oZWFkZXIgKmVoOwoJc3RydWN0IGlwICpp
cCA9IE5VTEw7CglzdHJ1Y3QgaXA2X2hkciAqaXA2OwoJaW50IGN1ciwgZWhkcmxlbjsKCXUzMiBj
bWQsIGhkcl9sZW4sIGlwX2hsZW47Cgl1MTYgZXR5cGU7Cgl1OCBpcHByb3RvOwoKCgljbWQgPSBo
ZHJfbGVuID0gaXBwcm90byA9IDA7CgljdXIgPSB0eHItPm5leHRfYXZhaWxfZGVzYzsKCgkvKgoJ
ICogRGV0ZXJtaW5lIHdoZXJlIGZyYW1lIHBheWxvYWQgc3RhcnRzLgoJICogSnVtcCBvdmVyIHZs
YW4gaGVhZGVycyBpZiBhbHJlYWR5IHByZXNlbnQsCgkgKiBoZWxwZnVsIGZvciBRaW5RIHRvby4K
CSAqLwoJZWggPSBtdG9kKG1wLCBzdHJ1Y3QgZXRoZXJfdmxhbl9oZWFkZXIgKik7CglpZiAoZWgt
PmV2bF9lbmNhcF9wcm90byA9PSBodG9ucyhFVEhFUlRZUEVfVkxBTikpIHsKCQlldHlwZSA9IG50
b2hzKGVoLT5ldmxfcHJvdG8pOwoJCWVoZHJsZW4gPSBFVEhFUl9IRFJfTEVOICsgRVRIRVJfVkxB
Tl9FTkNBUF9MRU47Cgl9IGVsc2UgewoJCWV0eXBlID0gbnRvaHMoZWgtPmV2bF9lbmNhcF9wcm90
byk7CgkJZWhkcmxlbiA9IEVUSEVSX0hEUl9MRU47Cgl9CgoJLyoKCSAqIFdlIG9ubHkgc3VwcG9y
dCBUQ1AvVURQIGZvciBJUHY0IGFuZCBJUHY2IGZvciB0aGUgbW9tZW50LgoJICogVE9ETzogU3Vw
cG9ydCBTQ1RQIHRvbyB3aGVuIGl0IGhpdHMgdGhlIHRyZWUuCgkgKi8KCXN3aXRjaCAoZXR5cGUp
IHsKCWNhc2UgRVRIRVJUWVBFX0lQOgoJCWlwID0gKHN0cnVjdCBpcCAqKShtcC0+bV9kYXRhICsg
ZWhkcmxlbik7CgkJaXBfaGxlbiA9IGlwLT5pcF9obCA8PCAyOwoKCQkvKiBTZXR1cCBvZiBJUCBo
ZWFkZXIgY2hlY2tzdW0uICovCgkJaWYgKG1wLT5tX3BrdGhkci5jc3VtX2ZsYWdzICYgQ1NVTV9J
UCkgewoJCQkvKgoJCQkgKiBTdGFydCBvZmZzZXQgZm9yIGhlYWRlciBjaGVja3N1bSBjYWxjdWxh
dGlvbi4KCQkJICogRW5kIG9mZnNldCBmb3IgaGVhZGVyIGNoZWNrc3VtIGNhbGN1bGF0aW9uLgoJ
CQkgKiBPZmZzZXQgb2YgcGxhY2UgdG8gcHV0IHRoZSBjaGVja3N1bS4KCQkJICovCgkJCVRYRCA9
IChzdHJ1Y3QgZTEwMDBfY29udGV4dF9kZXNjICopCgkJCSAgICAmdHhyLT50eF9iYXNlW2N1cl07
CgkJCVRYRC0+bG93ZXJfc2V0dXAuaXBfZmllbGRzLmlwY3NzID0gZWhkcmxlbjsKCQkJVFhELT5s
b3dlcl9zZXR1cC5pcF9maWVsZHMuaXBjc2UgPQoJCQkgICAgaHRvbGUxNihlaGRybGVuICsgaXBf
aGxlbik7CgkJCVRYRC0+bG93ZXJfc2V0dXAuaXBfZmllbGRzLmlwY3NvID0KCQkJICAgIGVoZHJs
ZW4gKyBvZmZzZXRvZihzdHJ1Y3QgaXAsIGlwX3N1bSk7CgkJCWNtZCB8PSBFMTAwMF9UWERfQ01E
X0lQOwoJCQkqdHhkX3VwcGVyIHw9IEUxMDAwX1RYRF9QT1BUU19JWFNNIDw8IDg7CgkJfQoKCQlp
ZiAobXAtPm1fbGVuIDwgZWhkcmxlbiArIGlwX2hsZW4pCgkJCXJldHVybjsJLyogZmFpbHVyZSAq
LwoKCQloZHJfbGVuID0gZWhkcmxlbiArIGlwX2hsZW47CgkJaXBwcm90byA9IGlwLT5pcF9wOwoK
CQlicmVhazsKCWNhc2UgRVRIRVJUWVBFX0lQVjY6CgkJaXA2ID0gKHN0cnVjdCBpcDZfaGRyICop
KG1wLT5tX2RhdGEgKyBlaGRybGVuKTsKCQlpcF9obGVuID0gc2l6ZW9mKHN0cnVjdCBpcDZfaGRy
KTsgLyogWFhYOiBObyBoZWFkZXIgc3RhY2tpbmcuICovCgoJCWlmIChtcC0+bV9sZW4gPCBlaGRy
bGVuICsgaXBfaGxlbikKCQkJcmV0dXJuOwkvKiBmYWlsdXJlICovCgoJCS8qIElQdjYgZG9lc24n
dCBoYXZlIGEgaGVhZGVyIGNoZWNrc3VtLiAqLwoKCQloZHJfbGVuID0gZWhkcmxlbiArIGlwX2hs
ZW47CgkJaXBwcm90byA9IGlwNi0+aXA2X254dDsKCgkJYnJlYWs7CglkZWZhdWx0OgoJCSp0eGRf
dXBwZXIgPSAwOwoJCSp0eGRfbG93ZXIgPSAwOwoJCXJldHVybjsKCX0KCglzd2l0Y2ggKGlwcHJv
dG8pIHsKCWNhc2UgSVBQUk9UT19UQ1A6CgkJaWYgKG1wLT5tX3BrdGhkci5jc3VtX2ZsYWdzICYg
Q1NVTV9UQ1ApIHsKCQkJKnR4ZF9sb3dlciA9IEUxMDAwX1RYRF9DTURfREVYVCB8IEUxMDAwX1RY
RF9EVFlQX0Q7CgkJCSp0eGRfdXBwZXIgfD0gRTEwMDBfVFhEX1BPUFRTX1RYU00gPDwgODsKCQkJ
Lyogbm8gbmVlZCBmb3IgY29udGV4dCBpZiBhbHJlYWR5IHNldCAqLwoJCQlpZiAodHhyLT5sYXN0
X2h3X29mZmxvYWQgPT0gQ1NVTV9UQ1ApCgkJCQlyZXR1cm47CgkJCXR4ci0+bGFzdF9od19vZmZs
b2FkID0gQ1NVTV9UQ1A7CgkJCS8qCgkJCSAqIFN0YXJ0IG9mZnNldCBmb3IgcGF5bG9hZCBjaGVj
a3N1bSBjYWxjdWxhdGlvbi4KCQkJICogRW5kIG9mZnNldCBmb3IgcGF5bG9hZCBjaGVja3N1bSBj
YWxjdWxhdGlvbi4KCQkJICogT2Zmc2V0IG9mIHBsYWNlIHRvIHB1dCB0aGUgY2hlY2tzdW0uCgkJ
CSAqLwoJCQlUWEQgPSAoc3RydWN0IGUxMDAwX2NvbnRleHRfZGVzYyAqKQoJCQkgICAgJnR4ci0+
dHhfYmFzZVtjdXJdOwoJCQlUWEQtPnVwcGVyX3NldHVwLnRjcF9maWVsZHMudHVjc3MgPSBoZHJf
bGVuOwoJCQlUWEQtPnVwcGVyX3NldHVwLnRjcF9maWVsZHMudHVjc2UgPSBodG9sZTE2KDApOwoJ
CQlUWEQtPnVwcGVyX3NldHVwLnRjcF9maWVsZHMudHVjc28gPQoJCQkgICAgaGRyX2xlbiArIG9m
ZnNldG9mKHN0cnVjdCB0Y3BoZHIsIHRoX3N1bSk7CgkJCWNtZCB8PSBFMTAwMF9UWERfQ01EX1RD
UDsKCQl9CgkJYnJlYWs7CgljYXNlIElQUFJPVE9fVURQOgoJewoJCWlmIChtcC0+bV9wa3RoZHIu
Y3N1bV9mbGFncyAmIENTVU1fVURQKSB7CgkJCSp0eGRfbG93ZXIgPSBFMTAwMF9UWERfQ01EX0RF
WFQgfCBFMTAwMF9UWERfRFRZUF9EOwoJCQkqdHhkX3VwcGVyIHw9IEUxMDAwX1RYRF9QT1BUU19U
WFNNIDw8IDg7CgkJCS8qIG5vIG5lZWQgZm9yIGNvbnRleHQgaWYgYWxyZWFkeSBzZXQgKi8KCQkJ
aWYgKHR4ci0+bGFzdF9od19vZmZsb2FkID09IENTVU1fVURQKQoJCQkJcmV0dXJuOwoJCQl0eHIt
Pmxhc3RfaHdfb2ZmbG9hZCA9IENTVU1fVURQOwoJCQkvKgoJCQkgKiBTdGFydCBvZmZzZXQgZm9y
IGhlYWRlciBjaGVja3N1bSBjYWxjdWxhdGlvbi4KCQkJICogRW5kIG9mZnNldCBmb3IgaGVhZGVy
IGNoZWNrc3VtIGNhbGN1bGF0aW9uLgoJCQkgKiBPZmZzZXQgb2YgcGxhY2UgdG8gcHV0IHRoZSBj
aGVja3N1bS4KCQkJICovCgkJCVRYRCA9IChzdHJ1Y3QgZTEwMDBfY29udGV4dF9kZXNjICopCgkJ
CSAgICAmdHhyLT50eF9iYXNlW2N1cl07CgkJCVRYRC0+dXBwZXJfc2V0dXAudGNwX2ZpZWxkcy50
dWNzcyA9IGhkcl9sZW47CgkJCVRYRC0+dXBwZXJfc2V0dXAudGNwX2ZpZWxkcy50dWNzZSA9IGh0
b2xlMTYoMCk7CgkJCVRYRC0+dXBwZXJfc2V0dXAudGNwX2ZpZWxkcy50dWNzbyA9CgkJCSAgICBo
ZHJfbGVuICsgb2Zmc2V0b2Yoc3RydWN0IHVkcGhkciwgdWhfc3VtKTsKCQl9CgkJLyogRmFsbCBU
aHJ1ICovCgl9CglkZWZhdWx0OgoJCWJyZWFrOwoJfQoKCVRYRC0+dGNwX3NlZ19zZXR1cC5kYXRh
ID0gaHRvbGUzMigwKTsKCVRYRC0+Y21kX2FuZF9sZW5ndGggPQoJICAgIGh0b2xlMzIoYWRhcHRl
ci0+dHhkX2NtZCB8IEUxMDAwX1RYRF9DTURfREVYVCB8IGNtZCk7Cgl0eF9idWZmZXIgPSAmdHhy
LT50eF9idWZmZXJzW2N1cl07Cgl0eF9idWZmZXItPm1faGVhZCA9IE5VTEw7Cgl0eF9idWZmZXIt
Pm5leHRfZW9wID0gLTE7CgoJaWYgKCsrY3VyID09IGFkYXB0ZXItPm51bV90eF9kZXNjKQoJCWN1
ciA9IDA7CgoJdHhyLT50eF9hdmFpbC0tOwoJdHhyLT5uZXh0X2F2YWlsX2Rlc2MgPSBjdXI7Cn0K
CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKgogKgogKiAgU2V0dXAgd29yayBmb3IgaGFyZHdhcmUgc2VnbWVudGF0
aW9uIG9mZmxvYWQgKFRTTykKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBib29sCmVtX3Rzb19z
ZXR1cChzdHJ1Y3QgdHhfcmluZyAqdHhyLCBzdHJ1Y3QgbWJ1ZiAqbXAsIHUzMiAqdHhkX3VwcGVy
LAogICB1MzIgKnR4ZF9sb3dlcikKewoJc3RydWN0IGFkYXB0ZXIJCQkqYWRhcHRlciA9IHR4ci0+
YWRhcHRlcjsKCXN0cnVjdCBlMTAwMF9jb250ZXh0X2Rlc2MJKlRYRDsKCXN0cnVjdCBlbV9idWZm
ZXIJCSp0eF9idWZmZXI7CglzdHJ1Y3QgZXRoZXJfdmxhbl9oZWFkZXIJKmVoOwoJc3RydWN0IGlw
CQkJKmlwOwoJc3RydWN0IGlwNl9oZHIJCQkqaXA2OwoJc3RydWN0IHRjcGhkcgkJCSp0aDsKCWlu
dCBjdXIsIGVoZHJsZW4sIGhkcl9sZW4sIGlwX2hsZW4sIGlzaXA2OwoJdTE2IGV0eXBlOwoKCS8q
CgkgKiBUaGlzIGZ1bmN0aW9uIGNvdWxkL3Nob3VsZCBiZSBleHRlbmRlZCB0byBzdXBwb3J0IElQ
L0lQdjYKCSAqIGZyYWdtZW50YXRpb24gYXMgd2VsbC4gIEJ1dCBhcyB0aGV5IHNheSwgb25lIHN0
ZXAgYXQgYSB0aW1lLgoJICovCgoJLyoKCSAqIERldGVybWluZSB3aGVyZSBmcmFtZSBwYXlsb2Fk
IHN0YXJ0cy4KCSAqIEp1bXAgb3ZlciB2bGFuIGhlYWRlcnMgaWYgYWxyZWFkeSBwcmVzZW50LAoJ
ICogaGVscGZ1bCBmb3IgUWluUSB0b28uCgkgKi8KCWVoID0gbXRvZChtcCwgc3RydWN0IGV0aGVy
X3ZsYW5faGVhZGVyICopOwoJaWYgKGVoLT5ldmxfZW5jYXBfcHJvdG8gPT0gaHRvbnMoRVRIRVJU
WVBFX1ZMQU4pKSB7CgkJZXR5cGUgPSBudG9ocyhlaC0+ZXZsX3Byb3RvKTsKCQllaGRybGVuID0g
RVRIRVJfSERSX0xFTiArIEVUSEVSX1ZMQU5fRU5DQVBfTEVOOwoJfSBlbHNlIHsKCQlldHlwZSA9
IG50b2hzKGVoLT5ldmxfZW5jYXBfcHJvdG8pOwoJCWVoZHJsZW4gPSBFVEhFUl9IRFJfTEVOOwoJ
fQoKCS8qIEVuc3VyZSB3ZSBoYXZlIGF0IGxlYXN0IHRoZSBJUCtUQ1AgaGVhZGVyIGluIHRoZSBm
aXJzdCBtYnVmLiAqLwoJaWYgKG1wLT5tX2xlbiA8IGVoZHJsZW4gKyBzaXplb2Yoc3RydWN0IGlw
KSArIHNpemVvZihzdHJ1Y3QgdGNwaGRyKSkKCQlyZXR1cm4gRkFMU0U7CS8qIC0xICovCgoJLyoK
CSAqIFdlIG9ubHkgc3VwcG9ydCBUQ1AgZm9yIElQdjQgYW5kIElQdjYgKG5vdHlldCkgZm9yIHRo
ZSBtb21lbnQuCgkgKiBUT0RPOiBTdXBwb3J0IFNDVFAgdG9vIHdoZW4gaXQgaGl0cyB0aGUgdHJl
ZS4KCSAqLwoJc3dpdGNoIChldHlwZSkgewoJY2FzZSBFVEhFUlRZUEVfSVA6CgkJaXNpcDYgPSAw
OwoJCWlwID0gKHN0cnVjdCBpcCAqKShtcC0+bV9kYXRhICsgZWhkcmxlbik7CgkJaWYgKGlwLT5p
cF9wICE9IElQUFJPVE9fVENQKQoJCQlyZXR1cm4gRkFMU0U7CS8qIDAgKi8KCQlpcC0+aXBfbGVu
ID0gMDsKCQlpcC0+aXBfc3VtID0gMDsKCQlpcF9obGVuID0gaXAtPmlwX2hsIDw8IDI7CgkJaWYg
KG1wLT5tX2xlbiA8IGVoZHJsZW4gKyBpcF9obGVuICsgc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpKQoJ
CQlyZXR1cm4gRkFMU0U7CS8qIC0xICovCgkJdGggPSAoc3RydWN0IHRjcGhkciAqKSgoY2FkZHJf
dClpcCArIGlwX2hsZW4pOwojaWYgMQoJCXRoLT50aF9zdW0gPSBpbl9wc2V1ZG8oaXAtPmlwX3Ny
Yy5zX2FkZHIsCgkJICAgIGlwLT5pcF9kc3Quc19hZGRyLCBodG9ucyhJUFBST1RPX1RDUCkpOwoj
ZWxzZQoJCXRoLT50aF9zdW0gPSBtcC0+bV9wa3RoZHIuY3N1bV9kYXRhOwojZW5kaWYKCQlicmVh
azsKCWNhc2UgRVRIRVJUWVBFX0lQVjY6CgkJaXNpcDYgPSAxOwoJCXJldHVybiBGQUxTRTsJCQkv
KiBOb3Qgc3VwcG9ydGVkIHlldC4gKi8KCQlpcDYgPSAoc3RydWN0IGlwNl9oZHIgKikobXAtPm1f
ZGF0YSArIGVoZHJsZW4pOwoJCWlmIChpcDYtPmlwNl9ueHQgIT0gSVBQUk9UT19UQ1ApCgkJCXJl
dHVybiBGQUxTRTsJLyogMCAqLwoJCWlwNi0+aXA2X3BsZW4gPSAwOwoJCWlwX2hsZW4gPSBzaXpl
b2Yoc3RydWN0IGlwNl9oZHIpOyAvKiBYWFg6IG5vIGhlYWRlciBzdGFja2luZy4gKi8KCQlpZiAo
bXAtPm1fbGVuIDwgZWhkcmxlbiArIGlwX2hsZW4gKyBzaXplb2Yoc3RydWN0IHRjcGhkcikpCgkJ
CXJldHVybiBGQUxTRTsJLyogLTEgKi8KCQl0aCA9IChzdHJ1Y3QgdGNwaGRyICopKChjYWRkcl90
KWlwNiArIGlwX2hsZW4pOwojaWYgMAoJCXRoLT50aF9zdW0gPSBpbjZfcHNldWRvKGlwNi0+aXA2
X3NyYywgaXAtPmlwNl9kc3QsCgkJICAgIGh0b25zKElQUFJPVE9fVENQKSk7CS8qIFhYWDogZnVu
Y3Rpb24gbm90eWV0LiAqLwojZWxzZQoJCXRoLT50aF9zdW0gPSBtcC0+bV9wa3RoZHIuY3N1bV9k
YXRhOwojZW5kaWYKCQlicmVhazsKCWRlZmF1bHQ6CgkJcmV0dXJuIEZBTFNFOwoJfQoJaGRyX2xl
biA9IGVoZHJsZW4gKyBpcF9obGVuICsgKHRoLT50aF9vZmYgPDwgMik7CgoJKnR4ZF9sb3dlciA9
IChFMTAwMF9UWERfQ01EX0RFWFQgfAkvKiBFeHRlbmRlZCBkZXNjciB0eXBlICovCgkJICAgICAg
RTEwMDBfVFhEX0RUWVBfRCB8CS8qIERhdGEgZGVzY3IgdHlwZSAqLwoJCSAgICAgIEUxMDAwX1RY
RF9DTURfVFNFKTsJLyogRG8gVFNFIG9uIHRoaXMgcGFja2V0ICovCgoJLyogSVAgYW5kL29yIFRD
UCBoZWFkZXIgY2hlY2tzdW0gY2FsY3VsYXRpb24gYW5kIGluc2VydGlvbi4gKi8KCSp0eGRfdXBw
ZXIgPSAoKGlzaXA2ID8gMCA6IEUxMDAwX1RYRF9QT1BUU19JWFNNKSB8CgkJICAgICAgRTEwMDBf
VFhEX1BPUFRTX1RYU00pIDw8IDg7CgoJY3VyID0gdHhyLT5uZXh0X2F2YWlsX2Rlc2M7Cgl0eF9i
dWZmZXIgPSAmdHhyLT50eF9idWZmZXJzW2N1cl07CglUWEQgPSAoc3RydWN0IGUxMDAwX2NvbnRl
eHRfZGVzYyAqKSAmdHhyLT50eF9iYXNlW2N1cl07CgoJLyogSVB2NiBkb2Vzbid0IGhhdmUgYSBo
ZWFkZXIgY2hlY2tzdW0uICovCglpZiAoIWlzaXA2KSB7CgkJLyoKCQkgKiBTdGFydCBvZmZzZXQg
Zm9yIGhlYWRlciBjaGVja3N1bSBjYWxjdWxhdGlvbi4KCQkgKiBFbmQgb2Zmc2V0IGZvciBoZWFk
ZXIgY2hlY2tzdW0gY2FsY3VsYXRpb24uCgkJICogT2Zmc2V0IG9mIHBsYWNlIHB1dCB0aGUgY2hl
Y2tzdW0uCgkJICovCgkJVFhELT5sb3dlcl9zZXR1cC5pcF9maWVsZHMuaXBjc3MgPSBlaGRybGVu
OwoJCVRYRC0+bG93ZXJfc2V0dXAuaXBfZmllbGRzLmlwY3NlID0KCQkgICAgaHRvbGUxNihlaGRy
bGVuICsgaXBfaGxlbiAtIDEpOwoJCVRYRC0+bG93ZXJfc2V0dXAuaXBfZmllbGRzLmlwY3NvID0K
CQkgICAgZWhkcmxlbiArIG9mZnNldG9mKHN0cnVjdCBpcCwgaXBfc3VtKTsKCX0KCS8qCgkgKiBT
dGFydCBvZmZzZXQgZm9yIHBheWxvYWQgY2hlY2tzdW0gY2FsY3VsYXRpb24uCgkgKiBFbmQgb2Zm
c2V0IGZvciBwYXlsb2FkIGNoZWNrc3VtIGNhbGN1bGF0aW9uLgoJICogT2Zmc2V0IG9mIHBsYWNl
IHRvIHB1dCB0aGUgY2hlY2tzdW0uCgkgKi8KCVRYRC0+dXBwZXJfc2V0dXAudGNwX2ZpZWxkcy50
dWNzcyA9CgkgICAgZWhkcmxlbiArIGlwX2hsZW47CglUWEQtPnVwcGVyX3NldHVwLnRjcF9maWVs
ZHMudHVjc2UgPSAwOwoJVFhELT51cHBlcl9zZXR1cC50Y3BfZmllbGRzLnR1Y3NvID0KCSAgICBl
aGRybGVuICsgaXBfaGxlbiArIG9mZnNldG9mKHN0cnVjdCB0Y3BoZHIsIHRoX3N1bSk7CgkvKgoJ
ICogUGF5bG9hZCBzaXplIHBlciBwYWNrZXQgdy9vIGFueSBoZWFkZXJzLgoJICogTGVuZ3RoIG9m
IGFsbCBoZWFkZXJzIHVwIHRvIHBheWxvYWQuCgkgKi8KCVRYRC0+dGNwX3NlZ19zZXR1cC5maWVs
ZHMubXNzID0gaHRvbGUxNihtcC0+bV9wa3RoZHIudHNvX3NlZ3N6KTsKCVRYRC0+dGNwX3NlZ19z
ZXR1cC5maWVsZHMuaGRyX2xlbiA9IGhkcl9sZW47CgoJVFhELT5jbWRfYW5kX2xlbmd0aCA9IGh0
b2xlMzIoYWRhcHRlci0+dHhkX2NtZCB8CgkJCQlFMTAwMF9UWERfQ01EX0RFWFQgfAkvKiBFeHRl
bmRlZCBkZXNjciAqLwoJCQkJRTEwMDBfVFhEX0NNRF9UU0UgfAkvKiBUU0UgY29udGV4dCAqLwoJ
CQkJKGlzaXA2ID8gMCA6IEUxMDAwX1RYRF9DTURfSVApIHwgCgkJCQlFMTAwMF9UWERfQ01EX1RD
UCB8CS8qIERvIFRDUCBjaGVja3N1bSAqLwoJCQkJKG1wLT5tX3BrdGhkci5sZW4gLSAoaGRyX2xl
bikpKTsgLyogVG90YWwgbGVuICovCgoJdHhfYnVmZmVyLT5tX2hlYWQgPSBOVUxMOwoJdHhfYnVm
ZmVyLT5uZXh0X2VvcCA9IC0xOwoKCWlmICgrK2N1ciA9PSBhZGFwdGVyLT5udW1fdHhfZGVzYykK
CQljdXIgPSAwOwoKCXR4ci0+dHhfYXZhaWwtLTsKCXR4ci0+bmV4dF9hdmFpbF9kZXNjID0gY3Vy
OwoJdHhyLT50eF90c28gPSBUUlVFOwoKCXJldHVybiBUUlVFOwp9CgoKLyoqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioK
ICoKICogIEV4YW1pbmUgZWFjaCB0eF9idWZmZXIgaW4gdGhlIHVzZWQgcXVldWUuIElmIHRoZSBo
YXJkd2FyZSBpcyBkb25lCiAqICBwcm9jZXNzaW5nIHRoZSBwYWNrZXQgdGhlbiBmcmVlIGFzc29j
aWF0ZWQgcmVzb3VyY2VzLiBUaGUKICogIHR4X2J1ZmZlciBpcyBwdXQgYmFjayBvbiB0aGUgZnJl
ZSBxdWV1ZS4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBib29sCmVtX3R4ZW9mKHN0cnVjdCB0
eF9yaW5nICp0eHIpCnsKCXN0cnVjdCBhZGFwdGVyCSphZGFwdGVyID0gdHhyLT5hZGFwdGVyOwog
ICAgICAgIGludCBmaXJzdCwgbGFzdCwgZG9uZSwgbnVtX2F2YWlsOwogICAgICAgIHN0cnVjdCBl
bV9idWZmZXIgKnR4X2J1ZmZlcjsKICAgICAgICBzdHJ1Y3QgZTEwMDBfdHhfZGVzYyAgICp0eF9k
ZXNjLCAqZW9wX2Rlc2M7CglzdHJ1Y3QgaWZuZXQgICAqaWZwID0gYWRhcHRlci0+aWZwOwoKCUVN
X1RYX0xPQ0tfQVNTRVJUKHR4cik7CgogICAgICAgIGlmICh0eHItPnR4X2F2YWlsID09IGFkYXB0
ZXItPm51bV90eF9kZXNjKQogICAgICAgICAgICAgICAgcmV0dXJuIChGQUxTRSk7CgogICAgICAg
IG51bV9hdmFpbCA9IHR4ci0+dHhfYXZhaWw7CiAgICAgICAgZmlyc3QgPSB0eHItPm5leHRfdG9f
Y2xlYW47CiAgICAgICAgdHhfZGVzYyA9ICZ0eHItPnR4X2Jhc2VbZmlyc3RdOwogICAgICAgIHR4
X2J1ZmZlciA9ICZ0eHItPnR4X2J1ZmZlcnNbZmlyc3RdOwoJbGFzdCA9IHR4X2J1ZmZlci0+bmV4
dF9lb3A7CiAgICAgICAgZW9wX2Rlc2MgPSAmdHhyLT50eF9iYXNlW2xhc3RdOwoKCS8qCgkgKiBX
aGF0IHRoaXMgZG9lcyBpcyBnZXQgdGhlIGluZGV4IG9mIHRoZQoJICogZmlyc3QgZGVzY3JpcHRv
ciBBRlRFUiB0aGUgRU9QIG9mIHRoZSAKCSAqIGZpcnN0IHBhY2tldCwgdGhhdCB3YXkgd2UgY2Fu
IGRvIHRoZQoJICogc2ltcGxlIGNvbXBhcmlzb24gb24gdGhlIGlubmVyIHdoaWxlIGxvb3AuCgkg
Ki8KCWlmICgrK2xhc3QgPT0gYWRhcHRlci0+bnVtX3R4X2Rlc2MpCiAJCWxhc3QgPSAwOwoJZG9u
ZSA9IGxhc3Q7CgogICAgICAgIGJ1c19kbWFtYXBfc3luYyh0eHItPnR4ZG1hLmRtYV90YWcsIHR4
ci0+dHhkbWEuZG1hX21hcCwKICAgICAgICAgICAgQlVTX0RNQVNZTkNfUE9TVFJFQUQpOwoKICAg
ICAgICB3aGlsZSAoZW9wX2Rlc2MtPnVwcGVyLmZpZWxkcy5zdGF0dXMgJiBFMTAwMF9UWERfU1RB
VF9ERCkgewoJCS8qIFdlIGNsZWFuIHRoZSByYW5nZSBvZiB0aGUgcGFja2V0ICovCgkJd2hpbGUg
KGZpcnN0ICE9IGRvbmUpIHsKICAgICAgICAgICAgICAgIAl0eF9kZXNjLT51cHBlci5kYXRhID0g
MDsKICAgICAgICAgICAgICAgIAl0eF9kZXNjLT5sb3dlci5kYXRhID0gMDsKICAgICAgICAgICAg
ICAgIAl0eF9kZXNjLT5idWZmZXJfYWRkciA9IDA7CiAgICAgICAgICAgICAgICAJKytudW1fYXZh
aWw7CgoJCQlpZiAodHhfYnVmZmVyLT5tX2hlYWQpIHsKCQkJCWlmcC0+aWZfb3BhY2tldHMrKzsK
CQkJCWJ1c19kbWFtYXBfc3luYyh0eHItPnR4dGFnLAoJCQkJICAgIHR4X2J1ZmZlci0+bWFwLAoJ
CQkJICAgIEJVU19ETUFTWU5DX1BPU1RXUklURSk7CgkJCQlidXNfZG1hbWFwX3VubG9hZCh0eHIt
PnR4dGFnLAoJCQkJICAgIHR4X2J1ZmZlci0+bWFwKTsKCiAgICAgICAgICAgICAgICAgICAgICAg
IAltX2ZyZWVtKHR4X2J1ZmZlci0+bV9oZWFkKTsKICAgICAgICAgICAgICAgICAgICAgICAgCXR4
X2J1ZmZlci0+bV9oZWFkID0gTlVMTDsKICAgICAgICAgICAgICAgIAl9CgkJCXR4X2J1ZmZlci0+
bmV4dF9lb3AgPSAtMTsKCQkJdHhyLT53YXRjaGRvZ190aW1lID0gdGlja3M7CgoJICAgICAgICAg
ICAgICAgIGlmICgrK2ZpcnN0ID09IGFkYXB0ZXItPm51bV90eF9kZXNjKQoJCQkJZmlyc3QgPSAw
OwoKCSAgICAgICAgICAgICAgICB0eF9idWZmZXIgPSAmdHhyLT50eF9idWZmZXJzW2ZpcnN0XTsK
CQkJdHhfZGVzYyA9ICZ0eHItPnR4X2Jhc2VbZmlyc3RdOwoJCX0KCQkvKiBTZWUgaWYgd2UgY2Fu
IGNvbnRpbnVlIHRvIHRoZSBuZXh0IHBhY2tldCAqLwoJCWxhc3QgPSB0eF9idWZmZXItPm5leHRf
ZW9wOwoJCWlmIChsYXN0ICE9IC0xKSB7CiAgICAgICAgCQllb3BfZGVzYyA9ICZ0eHItPnR4X2Jh
c2VbbGFzdF07CgkJCS8qIEdldCBuZXcgZG9uZSBwb2ludCAqLwoJCQlpZiAoKytsYXN0ID09IGFk
YXB0ZXItPm51bV90eF9kZXNjKSBsYXN0ID0gMDsKCQkJZG9uZSA9IGxhc3Q7CgkJfSBlbHNlCgkJ
CWJyZWFrOwogICAgICAgIH0KICAgICAgICBidXNfZG1hbWFwX3N5bmModHhyLT50eGRtYS5kbWFf
dGFnLCB0eHItPnR4ZG1hLmRtYV9tYXAsCiAgICAgICAgICAgIEJVU19ETUFTWU5DX1BSRVJFQUQg
fCBCVVNfRE1BU1lOQ19QUkVXUklURSk7CgogICAgICAgIHR4ci0+bmV4dF90b19jbGVhbiA9IGZp
cnN0OwoKICAgICAgICAvKgogICAgICAgICAqIElmIHdlIGhhdmUgZW5vdWdoIHJvb20sIGNsZWFy
IElGRl9EUlZfT0FDVElWRSB0bwogICAgICAgICAqIHRlbGwgdGhlIHN0YWNrIHRoYXQgaXQgaXMg
T0sgdG8gc2VuZCBwYWNrZXRzLgogICAgICAgICAqIElmIHRoZXJlIGFyZSBubyBwZW5kaW5nIGRl
c2NyaXB0b3JzLCBjbGVhciB0aGUgd2F0Y2hkb2cuCiAgICAgICAgICovCiAgICAgICAgaWYgKG51
bV9hdmFpbCA+IEVNX1RYX0NMRUFOVVBfVEhSRVNIT0xEKSB7ICAgICAgICAgICAgICAgIAogICAg
ICAgICAgICAgICAgaWZwLT5pZl9kcnZfZmxhZ3MgJj0gfklGRl9EUlZfT0FDVElWRTsKICAgICAg
ICAgICAgICAgIGlmIChudW1fYXZhaWwgPT0gYWRhcHRlci0+bnVtX3R4X2Rlc2MpIHsKCQkJdHhy
LT53YXRjaGRvZ19jaGVjayA9IEZBTFNFOwogICAgICAgIAkJdHhyLT50eF9hdmFpbCA9IG51bV9h
dmFpbDsKCQkJcmV0dXJuIChGQUxTRSk7CgkJfSAKICAgICAgICB9CgogICAgICAgIHR4ci0+dHhf
YXZhaWwgPSBudW1fYXZhaWw7CglyZXR1cm4gKFRSVUUpOwp9CgoKLyoqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgog
KiAgUmVmcmVzaCBSWCBkZXNjcmlwdG9yIG1idWZzIGZyb20gc3lzdGVtIG1idWYgYnVmZmVyIHBv
b2wuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgdm9pZAplbV9yZWZyZXNoX21idWZzKHN0cnVj
dCByeF9yaW5nICpyeHIsIGludCBsaW1pdCkKewoJc3RydWN0IGFkYXB0ZXIJCSphZGFwdGVyID0g
cnhyLT5hZGFwdGVyOwoJc3RydWN0IG1idWYJCSptOwoJYnVzX2RtYV9zZWdtZW50X3QJc2Vnc1sx
XTsKCWJ1c19kbWFtYXBfdAkJbWFwOwoJc3RydWN0IGVtX2J1ZmZlcgkqcnhidWY7CglpbnQJCQlp
LCBlcnJvciwgbnNlZ3MsIGNsZWFuZWQ7CgoJaSA9IHJ4ci0+bmV4dF90b19yZWZyZXNoOwoJY2xl
YW5lZCA9IC0xOwoJd2hpbGUgKGkgIT0gbGltaXQpIHsKCQltID0gbV9nZXRjbChNX0RPTlRXQUlU
LCBNVF9EQVRBLCBNX1BLVEhEUik7CgkJaWYgKG0gPT0gTlVMTCkKCQkJZ290byB1cGRhdGU7CgkJ
bS0+bV9sZW4gPSBtLT5tX3BrdGhkci5sZW4gPSBNQ0xCWVRFUzsKCgkJaWYgKGFkYXB0ZXItPm1h
eF9mcmFtZV9zaXplIDw9IChNQ0xCWVRFUyAtIEVUSEVSX0FMSUdOKSkKCQkJbV9hZGoobSwgRVRI
RVJfQUxJR04pOwoKCQkvKgoJCSAqIFVzaW5nIG1lbW9yeSBmcm9tIHRoZSBtYnVmIGNsdXN0ZXIg
cG9vbCwgaW52b2tlIHRoZQoJCSAqIGJ1c19kbWEgbWFjaGluZXJ5IHRvIGFycmFuZ2UgdGhlIG1l
bW9yeSBtYXBwaW5nLgoJCSAqLwoJCWVycm9yID0gYnVzX2RtYW1hcF9sb2FkX21idWZfc2cocnhy
LT5yeHRhZywgcnhyLT5yeF9zcGFyZW1hcCwKCQkgICAgbSwgc2VncywgJm5zZWdzLCBCVVNfRE1B
X05PV0FJVCk7CgkJaWYgKGVycm9yICE9IDApIHsKCQkJbV9mcmVlKG0pOwoJCQlnb3RvIHVwZGF0
ZTsKCQl9CgoJCS8qIElmIG5zZWdzIGlzIHdyb25nIHRoZW4gdGhlIHN0YWNrIGlzIGNvcnJ1cHQu
ICovCgkJS0FTU0VSVChuc2VncyA9PSAxLCAoIlRvbyBtYW55IHNlZ21lbnRzIHJldHVybmVkISIp
KTsKCQoJCXJ4YnVmID0gJnJ4ci0+cnhfYnVmZmVyc1tpXTsKCQlpZiAocnhidWYtPm1faGVhZCAh
PSBOVUxMKQoJCQlidXNfZG1hbWFwX3VubG9hZChyeHItPnJ4dGFnLCByeGJ1Zi0+bWFwKTsKCQoJ
CW1hcCA9IHJ4YnVmLT5tYXA7CgkJcnhidWYtPm1hcCA9IHJ4ci0+cnhfc3BhcmVtYXA7CgkJcnhy
LT5yeF9zcGFyZW1hcCA9IG1hcDsKCQlidXNfZG1hbWFwX3N5bmMocnhyLT5yeHRhZywKCQkgICAg
cnhidWYtPm1hcCwgQlVTX0RNQVNZTkNfUFJFUkVBRCk7CgkJcnhidWYtPm1faGVhZCA9IG07CgkJ
cnhyLT5yeF9iYXNlW2ldLmJ1ZmZlcl9hZGRyID0gaHRvbGU2NChzZWdzWzBdLmRzX2FkZHIpOwoK
CQljbGVhbmVkID0gaTsKCQkvKiBDYWxjdWxhdGUgbmV4dCBpbmRleCAqLwoJCWlmICgrK2kgPT0g
YWRhcHRlci0+bnVtX3J4X2Rlc2MpCgkJCWkgPSAwOwoJCS8qIFRoaXMgaXMgdGhlIHdvcmsgbWFy
a2VyIGZvciByZWZyZXNoICovCgkJcnhyLT5uZXh0X3RvX3JlZnJlc2ggPSBpOwoJfQp1cGRhdGU6
CglidXNfZG1hbWFwX3N5bmMocnhyLT5yeGRtYS5kbWFfdGFnLCByeHItPnJ4ZG1hLmRtYV9tYXAs
CgkgICAgQlVTX0RNQVNZTkNfUFJFUkVBRCB8IEJVU19ETUFTWU5DX1BSRVdSSVRFKTsKCWlmIChj
bGVhbmVkICE9IC0xKSAvKiBVcGRhdGUgdGFpbCBpbmRleCAqLwoJCUUxMDAwX1dSSVRFX1JFRygm
YWRhcHRlci0+aHcsCgkJICAgIEUxMDAwX1JEVChyeHItPm1lKSwgY2xlYW5lZCk7CgoJcmV0dXJu
Owp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKgogKgogKiAgQWxsb2NhdGUgbWVtb3J5IGZvciByeF9idWZmZXIg
c3RydWN0dXJlcy4gU2luY2Ugd2UgdXNlIG9uZQogKiAgcnhfYnVmZmVyIHBlciByZWNlaXZlZCBw
YWNrZXQsIHRoZSBtYXhpbXVtIG51bWJlciBvZiByeF9idWZmZXIncwogKiAgdGhhdCB3ZSdsbCBu
ZWVkIGlzIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgcmVjZWl2ZSBkZXNjcmlwdG9ycwogKiAgdGhh
dCB3ZSd2ZSBhbGxvY2F0ZWQuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgaW50CmVtX2FsbG9j
YXRlX3JlY2VpdmVfYnVmZmVycyhzdHJ1Y3QgcnhfcmluZyAqcnhyKQp7CglzdHJ1Y3QgYWRhcHRl
cgkJKmFkYXB0ZXIgPSByeHItPmFkYXB0ZXI7CglkZXZpY2VfdAkJZGV2ID0gYWRhcHRlci0+ZGV2
OwoJc3RydWN0IGVtX2J1ZmZlcgkqcnhidWY7CglpbnQJCQllcnJvcjsKCglyeHItPnJ4X2J1ZmZl
cnMgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBlbV9idWZmZXIpICoKCSAgICBhZGFwdGVyLT5udW1f
cnhfZGVzYywgTV9ERVZCVUYsIE1fTk9XQUlUIHwgTV9aRVJPKTsKCWlmIChyeHItPnJ4X2J1ZmZl
cnMgPT0gTlVMTCkgewoJCWRldmljZV9wcmludGYoZGV2LCAiVW5hYmxlIHRvIGFsbG9jYXRlIHJ4
X2J1ZmZlciBtZW1vcnlcbiIpOwoJCXJldHVybiAoRU5PTUVNKTsKCX0KCgllcnJvciA9IGJ1c19k
bWFfdGFnX2NyZWF0ZShidXNfZ2V0X2RtYV90YWcoZGV2KSwgLyogcGFyZW50ICovCgkJCQkxLCAw
LAkJCS8qIGFsaWdubWVudCwgYm91bmRzICovCgkJCQlCVVNfU1BBQ0VfTUFYQUREUiwJLyogbG93
YWRkciAqLwoJCQkJQlVTX1NQQUNFX01BWEFERFIsCS8qIGhpZ2hhZGRyICovCgkJCQlOVUxMLCBO
VUxMLAkJLyogZmlsdGVyLCBmaWx0ZXJhcmcgKi8KCQkJCU1DTEJZVEVTLAkJLyogbWF4c2l6ZSAq
LwoJCQkJMSwJCQkvKiBuc2VnbWVudHMgKi8KCQkJCU1DTEJZVEVTLAkJLyogbWF4c2Vnc2l6ZSAq
LwoJCQkJMCwJCQkvKiBmbGFncyAqLwoJCQkJTlVMTCwJCQkvKiBsb2NrZnVuYyAqLwoJCQkJTlVM
TCwJCQkvKiBsb2NrYXJnICovCgkJCQkmcnhyLT5yeHRhZyk7CglpZiAoZXJyb3IpIHsKCQlkZXZp
Y2VfcHJpbnRmKGRldiwgIiVzOiBidXNfZG1hX3RhZ19jcmVhdGUgZmFpbGVkICVkXG4iLAoJCSAg
ICBfX2Z1bmNfXywgZXJyb3IpOwoJCWdvdG8gZmFpbDsKCX0KCgkvKiBDcmVhdGUgdGhlIHNwYXJl
IG1hcCAodXNlZCBieSBnZXRidWYpICovCgllcnJvciA9IGJ1c19kbWFtYXBfY3JlYXRlKHJ4ci0+
cnh0YWcsIEJVU19ETUFfTk9XQUlULAoJICAgICAmcnhyLT5yeF9zcGFyZW1hcCk7CglpZiAoZXJy
b3IpIHsKCQlkZXZpY2VfcHJpbnRmKGRldiwgIiVzOiBidXNfZG1hbWFwX2NyZWF0ZSBmYWlsZWQ6
ICVkXG4iLAoJCSAgICBfX2Z1bmNfXywgZXJyb3IpOwoJCWdvdG8gZmFpbDsKCX0KCglyeGJ1ZiA9
IHJ4ci0+cnhfYnVmZmVyczsKCWZvciAoaW50IGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtX3J4X2Rl
c2M7IGkrKywgcnhidWYrKykgewoJCXJ4YnVmID0gJnJ4ci0+cnhfYnVmZmVyc1tpXTsKCQllcnJv
ciA9IGJ1c19kbWFtYXBfY3JlYXRlKHJ4ci0+cnh0YWcsIEJVU19ETUFfTk9XQUlULAoJCSAgICAm
cnhidWYtPm1hcCk7CgkJaWYgKGVycm9yKSB7CgkJCWRldmljZV9wcmludGYoZGV2LCAiJXM6IGJ1
c19kbWFtYXBfY3JlYXRlIGZhaWxlZDogJWRcbiIsCgkJCSAgICBfX2Z1bmNfXywgZXJyb3IpOwoJ
CQlnb3RvIGZhaWw7CgkJfQoJfQoKCXJldHVybiAoMCk7CgpmYWlsOgoJZW1fZnJlZV9yZWNlaXZl
X3N0cnVjdHVyZXMoYWRhcHRlcik7CglyZXR1cm4gKGVycm9yKTsKfQoKCi8qKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioK
ICoKICogIEluaXRpYWxpemUgYSByZWNlaXZlIHJpbmcgYW5kIGl0cyBidWZmZXJzLgogKgogKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKi8Kc3RhdGljIGludAplbV9zZXR1cF9yZWNlaXZlX3Jpbmcoc3RydWN0IHJ4X3Jp
bmcgKnJ4cikKewoJc3RydWN0CWFkYXB0ZXIgCSphZGFwdGVyID0gcnhyLT5hZGFwdGVyOwoJc3Ry
dWN0IGVtX2J1ZmZlcgkqcnhidWY7CglidXNfZG1hX3NlZ21lbnRfdAlzZWdbMV07CglpbnQJCQly
c2l6ZSwgbnNlZ3MsIGVycm9yOwoKCgkvKiBDbGVhciB0aGUgcmluZyBjb250ZW50cyAqLwoJRU1f
UlhfTE9DSyhyeHIpOwoJcnNpemUgPSByb3VuZHVwMihhZGFwdGVyLT5udW1fcnhfZGVzYyAqCgkg
ICAgc2l6ZW9mKHN0cnVjdCBlMTAwMF9yeF9kZXNjKSwgRU1fREJBX0FMSUdOKTsKCWJ6ZXJvKCh2
b2lkICopcnhyLT5yeF9iYXNlLCByc2l6ZSk7CgoJLyoKCSoqIEZyZWUgY3VycmVudCBSWCBidWZm
ZXIgc3RydWN0cyBhbmQgdGhlaXIgbWJ1ZnMKCSovCglmb3IgKGludCBpID0gMDsgaSA8IGFkYXB0
ZXItPm51bV9yeF9kZXNjOyBpKyspIHsKCQlyeGJ1ZiA9ICZyeHItPnJ4X2J1ZmZlcnNbaV07CgkJ
aWYgKHJ4YnVmLT5tX2hlYWQgIT0gTlVMTCkgewoJCQlidXNfZG1hbWFwX3N5bmMocnhyLT5yeHRh
ZywgcnhidWYtPm1hcCwKCQkJICAgIEJVU19ETUFTWU5DX1BPU1RSRUFEKTsKCQkJYnVzX2RtYW1h
cF91bmxvYWQocnhyLT5yeHRhZywgcnhidWYtPm1hcCk7CgkJCW1fZnJlZW0ocnhidWYtPm1faGVh
ZCk7CgkJfQoJfQoKCS8qIE5vdyByZXBsZW5pc2ggdGhlIG1idWZzICovCglmb3IgKGludCBqID0g
MDsgaiAhPSBhZGFwdGVyLT5udW1fcnhfZGVzYzsgKytqKSB7CgoJCXJ4YnVmID0gJnJ4ci0+cnhf
YnVmZmVyc1tqXTsKCQlyeGJ1Zi0+bV9oZWFkID0gbV9nZXRjbChNX0RPTlRXQUlULCBNVF9EQVRB
LCBNX1BLVEhEUik7CgkJaWYgKHJ4YnVmLT5tX2hlYWQgPT0gTlVMTCkKCQkJcGFuaWMoIlJYIHJp
bmcgaGRyIGluaXRpYWxpemF0aW9uIGZhaWxlZCFcbiIpOwoJCXJ4YnVmLT5tX2hlYWQtPm1fbGVu
ID0gTUNMQllURVM7CgkJcnhidWYtPm1faGVhZC0+bV9mbGFncyAmPSB+TV9IQVNGQ1M7IC8qIHdl
IHN0cmlwIGl0ICovCgkJcnhidWYtPm1faGVhZC0+bV9wa3RoZHIubGVuID0gTUNMQllURVM7CgoJ
CS8qIEdldCB0aGUgbWVtb3J5IG1hcHBpbmcgKi8KCQllcnJvciA9IGJ1c19kbWFtYXBfbG9hZF9t
YnVmX3NnKHJ4ci0+cnh0YWcsCgkJICAgIHJ4YnVmLT5tYXAsIHJ4YnVmLT5tX2hlYWQsIHNlZywK
CQkgICAgJm5zZWdzLCBCVVNfRE1BX05PV0FJVCk7CgkJaWYgKGVycm9yICE9IDApCgkJCXBhbmlj
KCJSWCByaW5nIGRtYSBpbml0aWFsaXphdGlvbiBmYWlsZWQhXG4iKTsKCQlidXNfZG1hbWFwX3N5
bmMocnhyLT5yeHRhZywKCQkgICAgcnhidWYtPm1hcCwgQlVTX0RNQVNZTkNfUFJFUkVBRCk7CgoJ
CS8qIFVwZGF0ZSBkZXNjcmlwdG9yICovCgkJcnhyLT5yeF9iYXNlW2pdLmJ1ZmZlcl9hZGRyID0g
aHRvbGU2NChzZWdbMF0uZHNfYWRkcik7Cgl9CgoKCS8qIFNldHVwIG91ciBkZXNjcmlwdG9yIGlu
ZGljZXMgKi8KCXJ4ci0+bmV4dF90b19jaGVjayA9IDA7CglyeHItPm5leHRfdG9fcmVmcmVzaCA9
IDA7CgoJYnVzX2RtYW1hcF9zeW5jKHJ4ci0+cnhkbWEuZG1hX3RhZywgcnhyLT5yeGRtYS5kbWFf
bWFwLAoJICAgIEJVU19ETUFTWU5DX1BSRVJFQUQgfCBCVVNfRE1BU1lOQ19QUkVXUklURSk7CgoJ
RU1fUlhfVU5MT0NLKHJ4cik7CglyZXR1cm4gKDApOwp9CgovKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBJ
bml0aWFsaXplIGFsbCByZWNlaXZlIHJpbmdzLgogKgogKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIGlu
dAplbV9zZXR1cF9yZWNlaXZlX3N0cnVjdHVyZXMoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCnsK
CXN0cnVjdCByeF9yaW5nICpyeHIgPSBhZGFwdGVyLT5yeF9yaW5nczsKCWludCBqOwoKCWZvciAo
aiA9IDA7IGogPCBhZGFwdGVyLT5udW1fcXVldWVzOyBqKyssIHJ4cisrKQoJCWlmIChlbV9zZXR1
cF9yZWNlaXZlX3JpbmcocnhyKSkKCQkJZ290byBmYWlsOwoKCXJldHVybiAoMCk7CmZhaWw6Cgkv
KgoJICogRnJlZSBSWCBidWZmZXJzIGFsbG9jYXRlZCBzbyBmYXIsIHdlIHdpbGwgb25seSBoYW5k
bGUKCSAqIHRoZSByaW5ncyB0aGF0IGNvbXBsZXRlZCwgdGhlIGZhaWxpbmcgY2FzZSB3aWxsIGhh
dmUKCSAqIGNsZWFuZWQgdXAgZm9yIGl0c2VsZi4gJ2onIGZhaWxlZCwgc28gaXRzIHRoZSB0ZXJt
aW51cy4KCSAqLwoJZm9yIChpbnQgaSA9IDA7IGkgPCBqOyArK2kpIHsKCQlyeHIgPSAmYWRhcHRl
ci0+cnhfcmluZ3NbaV07CgkJZm9yIChpbnQgbiA9IDA7IG4gPCBhZGFwdGVyLT5udW1fcnhfZGVz
YzsgbisrKSB7CgkJCXN0cnVjdCBlbV9idWZmZXIgKnJ4YnVmOwoJCQlyeGJ1ZiA9ICZyeHItPnJ4
X2J1ZmZlcnNbbl07CgkJCWlmIChyeGJ1Zi0+bV9oZWFkICE9IE5VTEwpIHsKCQkJCWJ1c19kbWFt
YXBfc3luYyhyeHItPnJ4dGFnLCByeGJ1Zi0+bWFwLAoJCQkgIAkgIEJVU19ETUFTWU5DX1BPU1RS
RUFEKTsKCQkJCWJ1c19kbWFtYXBfdW5sb2FkKHJ4ci0+cnh0YWcsIHJ4YnVmLT5tYXApOwoJCQkJ
bV9mcmVlbShyeGJ1Zi0+bV9oZWFkKTsKCQkJCXJ4YnVmLT5tX2hlYWQgPSBOVUxMOwoJCQl9CgkJ
fQoJfQoKCXJldHVybiAoRU5PQlVGUyk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIEZyZWUgYWxs
IHJlY2VpdmUgcmluZ3MuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgdm9pZAplbV9mcmVlX3Jl
Y2VpdmVfc3RydWN0dXJlcyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKewoJc3RydWN0IHJ4X3Jp
bmcgKnJ4ciA9IGFkYXB0ZXItPnJ4X3JpbmdzOwoKCWZvciAoaW50IGkgPSAwOyBpIDwgYWRhcHRl
ci0+bnVtX3F1ZXVlczsgaSsrLCByeHIrKykgewoJCWVtX2ZyZWVfcmVjZWl2ZV9idWZmZXJzKHJ4
cik7CgkJLyogRnJlZSB0aGUgcmluZyBtZW1vcnkgYXMgd2VsbCAqLwoJCWVtX2RtYV9mcmVlKGFk
YXB0ZXIsICZyeHItPnJ4ZG1hKTsKCQlFTV9SWF9MT0NLX0RFU1RST1kocnhyKTsKCX0KCglmcmVl
KGFkYXB0ZXItPnJ4X3JpbmdzLCBNX0RFVkJVRik7Cn0KCgovKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBG
cmVlIHJlY2VpdmUgcmluZyBkYXRhIHN0cnVjdHVyZXMKICoKICoqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRp
YyB2b2lkCmVtX2ZyZWVfcmVjZWl2ZV9idWZmZXJzKHN0cnVjdCByeF9yaW5nICpyeHIpCnsKCXN0
cnVjdCBhZGFwdGVyCQkqYWRhcHRlciA9IHJ4ci0+YWRhcHRlcjsKCXN0cnVjdCBlbV9idWZmZXIJ
KnJ4YnVmID0gTlVMTDsKCglJTklUX0RFQlVHT1VUKCJmcmVlX3JlY2VpdmVfYnVmZmVyczogYmVn
aW4iKTsKCglpZiAocnhyLT5yeF9zcGFyZW1hcCkgewoJCWJ1c19kbWFtYXBfZGVzdHJveShyeHIt
PnJ4dGFnLCByeHItPnJ4X3NwYXJlbWFwKTsKCQlyeHItPnJ4X3NwYXJlbWFwID0gTlVMTDsKCX0K
CglpZiAocnhyLT5yeF9idWZmZXJzICE9IE5VTEwpIHsKCQlmb3IgKGludCBpID0gMDsgaSA8IGFk
YXB0ZXItPm51bV9yeF9kZXNjOyBpKyspIHsKCQkJcnhidWYgPSAmcnhyLT5yeF9idWZmZXJzW2ld
OwoJCQlpZiAocnhidWYtPm1hcCAhPSBOVUxMKSB7CgkJCQlidXNfZG1hbWFwX3N5bmMocnhyLT5y
eHRhZywgcnhidWYtPm1hcCwKCQkJCSAgICBCVVNfRE1BU1lOQ19QT1NUUkVBRCk7CgkJCQlidXNf
ZG1hbWFwX3VubG9hZChyeHItPnJ4dGFnLCByeGJ1Zi0+bWFwKTsKCQkJCWJ1c19kbWFtYXBfZGVz
dHJveShyeHItPnJ4dGFnLCByeGJ1Zi0+bWFwKTsKCQkJfQoJCQlpZiAocnhidWYtPm1faGVhZCAh
PSBOVUxMKSB7CgkJCQltX2ZyZWVtKHJ4YnVmLT5tX2hlYWQpOwoJCQkJcnhidWYtPm1faGVhZCA9
IE5VTEw7CgkJCX0KCQl9CgkJZnJlZShyeHItPnJ4X2J1ZmZlcnMsIE1fREVWQlVGKTsKCQlyeHIt
PnJ4X2J1ZmZlcnMgPSBOVUxMOwoJfQoKCWlmIChyeHItPnJ4dGFnICE9IE5VTEwpIHsKCQlidXNf
ZG1hX3RhZ19kZXN0cm95KHJ4ci0+cnh0YWcpOwoJCXJ4ci0+cnh0YWcgPSBOVUxMOwoJfQoKCXJl
dHVybjsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioKICoKICogIEVuYWJsZSByZWNlaXZlIHVuaXQuCiAqCiAq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqLwojZGVmaW5lIE1BWF9JTlRTX1BFUl9TRUMJODAwMAojZGVmaW5lIERFRkFV
TFRfSVRSCSAgICAgMTAwMDAwMDAwMC8oTUFYX0lOVFNfUEVSX1NFQyAqIDI1NikKCnN0YXRpYyB2
b2lkCmVtX2luaXRpYWxpemVfcmVjZWl2ZV91bml0KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQp7
CglzdHJ1Y3QgcnhfcmluZwkqcnhyID0gYWRhcHRlci0+cnhfcmluZ3M7CglzdHJ1Y3QgaWZuZXQJ
KmlmcCA9IGFkYXB0ZXItPmlmcDsKCXN0cnVjdCBlMTAwMF9odwkqaHcgPSAmYWRhcHRlci0+aHc7
Cgl1NjQJYnVzX2FkZHI7Cgl1MzIJcmN0bCwgcnhjc3VtOwoKCUlOSVRfREVCVUdPVVQoImVtX2lu
aXRpYWxpemVfcmVjZWl2ZV91bml0czogYmVnaW4iKTsKCgkvKgoJICogTWFrZSBzdXJlIHJlY2Vp
dmVzIGFyZSBkaXNhYmxlZCB3aGlsZSBzZXR0aW5nCgkgKiB1cCB0aGUgZGVzY3JpcHRvciByaW5n
CgkgKi8KCXJjdGwgPSBFMTAwMF9SRUFEX1JFRyhodywgRTEwMDBfUkNUTCk7CglFMTAwMF9XUklU
RV9SRUcoaHcsIEUxMDAwX1JDVEwsIHJjdGwgJiB+RTEwMDBfUkNUTF9FTik7CgoJRTEwMDBfV1JJ
VEVfUkVHKCZhZGFwdGVyLT5odywgRTEwMDBfUkFEViwKCSAgICBhZGFwdGVyLT5yeF9hYnNfaW50
X2RlbGF5LnZhbHVlKTsKCS8qCgkgKiBTZXQgdGhlIGludGVycnVwdCB0aHJvdHRsaW5nIHJhdGUu
IFZhbHVlIGlzIGNhbGN1bGF0ZWQKCSAqIGFzIERFRkFVTFRfSVRSID0gMS8oTUFYX0lOVFNfUEVS
X1NFQyAqIDI1Nm5zKQoJICovCglFMTAwMF9XUklURV9SRUcoaHcsIEUxMDAwX0lUUiwgREVGQVVM
VF9JVFIpOwoKCS8qCgkqKiBXaGVuIHVzaW5nIE1TSVggaW50ZXJydXB0cyB3ZSBuZWVkIHRvIHRo
cm90dGxlCgkqKiB1c2luZyB0aGUgRUlUUiByZWdpc3RlciAoODI1NzQgb25seSkKCSovCglpZiAo
aHctPm1hYy50eXBlID09IGUxMDAwXzgyNTc0KQoJCWZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsr
KQoJCQlFMTAwMF9XUklURV9SRUcoaHcsIEUxMDAwX0VJVFJfODI1NzQoaSksCgkJCSAgICBERUZB
VUxUX0lUUik7CgoJLyogRGlzYWJsZSBhY2NlbGVyYXRlZCBhY2trbm93bGVkZ2UgKi8KCWlmIChh
ZGFwdGVyLT5ody5tYWMudHlwZSA9PSBlMTAwMF84MjU3NCkKCQlFMTAwMF9XUklURV9SRUcoaHcs
IEUxMDAwX1JGQ1RMLCBFMTAwMF9SRkNUTF9BQ0tfRElTKTsKCglpZiAoaWZwLT5pZl9jYXBlbmFi
bGUgJiBJRkNBUF9SWENTVU0pIHsKCQlyeGNzdW0gPSBFMTAwMF9SRUFEX1JFRyhodywgRTEwMDBf
UlhDU1VNKTsKCQlyeGNzdW0gfD0gKEUxMDAwX1JYQ1NVTV9JUE9GTCB8IEUxMDAwX1JYQ1NVTV9U
VU9GTCk7CgkJRTEwMDBfV1JJVEVfUkVHKGh3LCBFMTAwMF9SWENTVU0sIHJ4Y3N1bSk7Cgl9CgoJ
LyoKCSoqIFhYWCBURU1QT1JBUlkgV09SS0FST1VORDogb24gc29tZSBzeXN0ZW1zIHdpdGggODI1
NzMKCSoqIGxvbmcgbGF0ZW5jaWVzIGFyZSBvYnNlcnZlZCwgbGlrZSBMZW5vdm8gWDYwLiBUaGlz
CgkqKiBjaGFuZ2UgZWxpbWluYXRlcyB0aGUgcHJvYmxlbSwgYnV0IHNpbmNlIGhhdmluZyBwb3Np
dGl2ZQoJKiogdmFsdWVzIGluIFJEVFIgaXMgYSBrbm93biBzb3VyY2Ugb2YgcHJvYmxlbXMgb24g
b3RoZXIKCSoqIHBsYXRmb3JtcyBhbm90aGVyIHNvbHV0aW9uIGlzIGJlaW5nIHNvdWdodC4KCSov
CglpZiAoaHctPm1hYy50eXBlID09IGUxMDAwXzgyNTczKQoJCUUxMDAwX1dSSVRFX1JFRyhodywg
RTEwMDBfUkRUUiwgMHgyMCk7CgoJZm9yIChpbnQgaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1fcXVl
dWVzOyBpKyssIHJ4cisrKSB7CgkJLyogU2V0dXAgdGhlIEJhc2UgYW5kIExlbmd0aCBvZiB0aGUg
UnggRGVzY3JpcHRvciBSaW5nICovCgkJYnVzX2FkZHIgPSByeHItPnJ4ZG1hLmRtYV9wYWRkcjsK
CQlFMTAwMF9XUklURV9SRUcoaHcsIEUxMDAwX1JETEVOKGkpLAoJCSAgICBhZGFwdGVyLT5udW1f
cnhfZGVzYyAqIHNpemVvZihzdHJ1Y3QgZTEwMDBfcnhfZGVzYykpOwoJCUUxMDAwX1dSSVRFX1JF
RyhodywgRTEwMDBfUkRCQUgoaSksICh1MzIpKGJ1c19hZGRyID4+IDMyKSk7CgkJRTEwMDBfV1JJ
VEVfUkVHKGh3LCBFMTAwMF9SREJBTChpKSwgKHUzMilidXNfYWRkcik7CgkJLyogU2V0dXAgdGhl
IEhlYWQgYW5kIFRhaWwgRGVzY3JpcHRvciBQb2ludGVycyAqLwoJCUUxMDAwX1dSSVRFX1JFRyho
dywgRTEwMDBfUkRIKGkpLCAwKTsKCQlFMTAwMF9XUklURV9SRUcoaHcsIEUxMDAwX1JEVChpKSwg
YWRhcHRlci0+bnVtX3J4X2Rlc2MgLSAxKTsKCX0KCgkvKiBTZXR1cCB0aGUgUmVjZWl2ZSBDb250
cm9sIFJlZ2lzdGVyICovCglyY3RsICY9IH4oMyA8PCBFMTAwMF9SQ1RMX01PX1NISUZUKTsKCXJj
dGwgfD0gRTEwMDBfUkNUTF9FTiB8IEUxMDAwX1JDVExfQkFNIHwKCSAgICBFMTAwMF9SQ1RMX0xC
TV9OTyB8IEUxMDAwX1JDVExfUkRNVFNfSEFMRiB8CgkgICAgKGh3LT5tYWMubWNfZmlsdGVyX3R5
cGUgPDwgRTEwMDBfUkNUTF9NT19TSElGVCk7CgogICAgICAgIC8qIFN0cmlwIHRoZSBDUkMgKi8K
ICAgICAgICByY3RsIHw9IEUxMDAwX1JDVExfU0VDUkM7CgogICAgICAgIC8qIE1ha2Ugc3VyZSBW
TEFOIEZpbHRlcnMgYXJlIG9mZiAqLwogICAgICAgIHJjdGwgJj0gfkUxMDAwX1JDVExfVkZFOwoJ
cmN0bCAmPSB+RTEwMDBfUkNUTF9TQlA7CglyY3RsIHw9IEUxMDAwX1JDVExfU1pfMjA0ODsKCWlm
IChpZnAtPmlmX210dSA+IEVUSEVSTVRVKQoJCXJjdGwgfD0gRTEwMDBfUkNUTF9MUEU7CgllbHNl
CgkJcmN0bCAmPSB+RTEwMDBfUkNUTF9MUEU7CgoJLyogV3JpdGUgb3V0IHRoZSBzZXR0aW5ncyAq
LwoJRTEwMDBfV1JJVEVfUkVHKGh3LCBFMTAwMF9SQ1RMLCByY3RsKTsKCglyZXR1cm47Cn0KCgov
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqCiAqCiAqICBUaGlzIHJvdXRpbmUgZXhlY3V0ZXMgaW4gaW50ZXJydXB0IGNv
bnRleHQuIEl0IHJlcGxlbmlzaGVzCiAqICB0aGUgbWJ1ZnMgaW4gdGhlIGRlc2NyaXB0b3IgYW5k
IHNlbmRzIGRhdGEgd2hpY2ggaGFzIGJlZW4KICogIGRtYSdlZCBpbnRvIGhvc3QgbWVtb3J5IHRv
IHVwcGVyIGxheWVyLgogKgogKiAgV2UgbG9vcCBhdCBtb3N0IGNvdW50IHRpbWVzIGlmIGNvdW50
IGlzID4gMCwgb3IgdW50aWwgZG9uZSBpZgogKiAgY291bnQgPCAwLgogKiAgCiAqICBGb3IgcG9s
bGluZyB3ZSBhbHNvIG5vdyByZXR1cm4gdGhlIG51bWJlciBvZiBjbGVhbmVkIHBhY2tldHMKICoq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKi8Kc3RhdGljIGJvb2wKZW1fcnhlb2Yoc3RydWN0IHJ4X3JpbmcgKnJ4ciwgaW50
IGNvdW50LCBpbnQgKmRvbmUpCnsKCXN0cnVjdCBhZGFwdGVyCQkqYWRhcHRlciA9IHJ4ci0+YWRh
cHRlcjsKCXN0cnVjdCBpZm5ldAkJKmlmcCA9IGFkYXB0ZXItPmlmcDsKCXN0cnVjdCBtYnVmCQkq
bXAsICpzZW5kbXA7Cgl1OAkJCXN0YXR1cyA9IDA7Cgl1MTYgCQkJbGVuOwoJaW50CQkJaSwgcHJv
Y2Vzc2VkLCByeGRvbmUgPSAwOwoJYm9vbAkJCWVvcDsKCXN0cnVjdCBlMTAwMF9yeF9kZXNjCSpj
dXI7CgoJRU1fUlhfTE9DSyhyeHIpOwoKCWZvciAoaSA9IHJ4ci0+bmV4dF90b19jaGVjaywgcHJv
Y2Vzc2VkID0gMDsgY291bnQgIT0gMDspIHsKCgkJaWYgKChpZnAtPmlmX2Rydl9mbGFncyAmIElG
Rl9EUlZfUlVOTklORykgPT0gMCkKCQkJYnJlYWs7CgoJCWJ1c19kbWFtYXBfc3luYyhyeHItPnJ4
ZG1hLmRtYV90YWcsIHJ4ci0+cnhkbWEuZG1hX21hcCwKCQkgICAgQlVTX0RNQVNZTkNfUE9TVFJF
QUQgfCBCVVNfRE1BU1lOQ19QT1NUV1JJVEUpOwoKCQljdXIgPSAmcnhyLT5yeF9iYXNlW2ldOwoJ
CXN0YXR1cyA9IGN1ci0+c3RhdHVzOwoJCW1wID0gc2VuZG1wID0gTlVMTDsKCgkJaWYgKChzdGF0
dXMgJiBFMTAwMF9SWERfU1RBVF9ERCkgPT0gMCkKCQkJYnJlYWs7CgoJCWxlbiA9IGxlMTZ0b2go
Y3VyLT5sZW5ndGgpOwoJCWVvcCA9IChzdGF0dXMgJiBFMTAwMF9SWERfU1RBVF9FT1ApICE9IDA7
CgkJY291bnQtLTsKCgkJaWYgKChjdXItPmVycm9ycyAmIEUxMDAwX1JYRF9FUlJfRlJBTUVfRVJS
X01BU0spID09IDApIHsKCgkJCS8qIEFzc2lnbiBjb3JyZWN0IGxlbmd0aCB0byB0aGUgY3VycmVu
dCBmcmFnbWVudCAqLwoJCQltcCA9IHJ4ci0+cnhfYnVmZmVyc1tpXS5tX2hlYWQ7CgkJCW1wLT5t
X2xlbiA9IGxlbjsKCgkJCWlmIChyeHItPmZtcCA9PSBOVUxMKSB7CgkJCQltcC0+bV9wa3RoZHIu
bGVuID0gbGVuOwoJCQkJcnhyLT5mbXAgPSBtcDsgLyogU3RvcmUgdGhlIGZpcnN0IG1idWYgKi8K
CQkJCXJ4ci0+bG1wID0gbXA7CgkJCX0gZWxzZSB7CgkJCQkvKiBDaGFpbiBtYnVmJ3MgdG9nZXRo
ZXIgKi8KCQkJCW1wLT5tX2ZsYWdzICY9IH5NX1BLVEhEUjsKCQkJCXJ4ci0+bG1wLT5tX25leHQg
PSBtcDsKCQkJCXJ4ci0+bG1wID0gcnhyLT5sbXAtPm1fbmV4dDsKCQkJCXJ4ci0+Zm1wLT5tX3Br
dGhkci5sZW4gKz0gbGVuOwoJCQl9CgoJCQlpZiAoZW9wKSB7CgkJCQlyeHItPmZtcC0+bV9wa3Ro
ZHIucmN2aWYgPSBpZnA7CgkJCQlpZnAtPmlmX2lwYWNrZXRzKys7CgkJCQllbV9yZWNlaXZlX2No
ZWNrc3VtKGN1ciwgcnhyLT5mbXApOwojaWZuZGVmIF9fTk9fU1RSSUNUX0FMSUdOTUVOVAoJCQkJ
aWYgKGFkYXB0ZXItPm1heF9mcmFtZV9zaXplID4KCQkJCSAgICAoTUNMQllURVMgLSBFVEhFUl9B
TElHTikgJiYKCQkJCSAgICBlbV9maXh1cF9yeChyeHIpICE9IDApCgkJCQkJZ290byBza2lwOwoj
ZW5kaWYKCQkJCWlmIChzdGF0dXMgJiBFMTAwMF9SWERfU1RBVF9WUCkgewoJCQkJCXJ4ci0+Zm1w
LT5tX3BrdGhkci5ldGhlcl92dGFnID0KCQkJCQkgICAgKGxlMTZ0b2goY3VyLT5zcGVjaWFsKSAm
CgkJCQkJICAgIEUxMDAwX1JYRF9TUENfVkxBTl9NQVNLKTsKCQkJCQlyeHItPmZtcC0+bV9mbGFn
cyB8PSBNX1ZMQU5UQUc7CgkJCQl9CiNpZmRlZiBFTV9NVUxUSVFVRVVFCgkJCQlyeHItPmZtcC0+
bV9wa3RoZHIuZmxvd2lkID0gY3VyY3B1OwoJCQkJcnhyLT5mbXAtPm1fZmxhZ3MgfD0gTV9GTE9X
SUQ7CiNlbmRpZgojaWZuZGVmIF9fTk9fU1RSSUNUX0FMSUdOTUVOVApza2lwOgojZW5kaWYKCQkJ
CXNlbmRtcCA9IHJ4ci0+Zm1wOwoJCQkJcnhyLT5mbXAgPSBOVUxMOwoJCQkJcnhyLT5sbXAgPSBO
VUxMOwoJCQl9CgkJfSBlbHNlIHsKCQkJaWZwLT5pZl9pZXJyb3JzKys7CgkJCS8qIFJldXNlIGxv
YWRlZCBETUEgbWFwIGFuZCBqdXN0IHVwZGF0ZSBtYnVmIGNoYWluICovCgkJCW1wID0gcnhyLT5y
eF9idWZmZXJzW2ldLm1faGVhZDsKCQkJbXAtPm1fbGVuID0gbXAtPm1fcGt0aGRyLmxlbiA9IE1D
TEJZVEVTOwoJCQltcC0+bV9kYXRhID0gbXAtPm1fZXh0LmV4dF9idWY7CgkJCW1wLT5tX25leHQg
PSBOVUxMOwoJCQlpZiAoYWRhcHRlci0+bWF4X2ZyYW1lX3NpemUgPD0KCQkJICAgIChNQ0xCWVRF
UyAtIEVUSEVSX0FMSUdOKSkKCQkJCW1fYWRqKG1wLCBFVEhFUl9BTElHTik7CgkJCWlmIChyeHIt
PmZtcCAhPSBOVUxMKSB7CgkJCQltX2ZyZWVtKHJ4ci0+Zm1wKTsKCQkJCXJ4ci0+Zm1wID0gTlVM
TDsKCQkJCXJ4ci0+bG1wID0gTlVMTDsKCQkJfQoJCQlzZW5kbXAgPSBOVUxMOwoJCX0KCgkJLyog
WmVybyBvdXQgdGhlIHJlY2VpdmUgZGVzY3JpcHRvcnMgc3RhdHVzLiAqLwoJCWN1ci0+c3RhdHVz
ID0gMDsKCQkrK3J4ZG9uZTsJLyogY3VtdWxhdGl2ZSBmb3IgUE9MTCAqLwoJCSsrcHJvY2Vzc2Vk
OwoKCQkvKiBBZHZhbmNlIG91ciBwb2ludGVycyB0byB0aGUgbmV4dCBkZXNjcmlwdG9yLiAqLwoJ
CWlmICgrK2kgPT0gYWRhcHRlci0+bnVtX3J4X2Rlc2MpCgkJCWkgPSAwOwoKCQkvKiBTZW5kIHRv
IHRoZSBzdGFjayAqLwoJCWlmIChzZW5kbXAgIT0gTlVMTCkgewoJCQlyeHItPm5leHRfdG9fY2hl
Y2sgPSBpOwoJCQlFTV9SWF9VTkxPQ0socnhyKTsKCQkJKCppZnAtPmlmX2lucHV0KShpZnAsIHNl
bmRtcCk7CgkJCUVNX1JYX0xPQ0socnhyKTsKCQkJaSA9IHJ4ci0+bmV4dF90b19jaGVjazsKCQl9
CgoJCS8qIE9ubHkgcmVmcmVzaCBtYnVmcyBldmVyeSA4IGRlc2NyaXB0b3JzICovCgkJaWYgKHBy
b2Nlc3NlZCA9PSA4KSB7CgkJCWVtX3JlZnJlc2hfbWJ1ZnMocnhyLCBpKTsKCQkJcHJvY2Vzc2Vk
ID0gMDsKCQl9Cgl9CgoJLyogQ2F0Y2ggYW55IHJlbWFpbmluZyByZWZyZXNoIHdvcmsgKi8KCWlm
IChwcm9jZXNzZWQgIT0gMCkgewoJCWVtX3JlZnJlc2hfbWJ1ZnMocnhyLCBpKTsKCQlwcm9jZXNz
ZWQgPSAwOwoJfQoKCXJ4ci0+bmV4dF90b19jaGVjayA9IGk7CglpZiAoZG9uZSAhPSBOVUxMKQoJ
CSpkb25lID0gcnhkb25lOwoJRU1fUlhfVU5MT0NLKHJ4cik7CgoJcmV0dXJuICgoc3RhdHVzICYg
RTEwMDBfUlhEX1NUQVRfREQpID8gVFJVRSA6IEZBTFNFKTsKfQoKI2lmbmRlZiBfX05PX1NUUklD
VF9BTElHTk1FTlQKLyoKICogV2hlbiBqdW1ibyBmcmFtZXMgYXJlIGVuYWJsZWQgd2Ugc2hvdWxk
IHJlYWxpZ24gZW50aXJlIHBheWxvYWQgb24KICogYXJjaGl0ZWN1cmVzIHdpdGggc3RyaWN0IGFs
aWdubWVudC4gVGhpcyBpcyBzZXJpb3VzIGRlc2lnbiBtaXN0YWtlIG9mIDgyNTR4CiAqIGFzIGl0
IG51bGxpZmllcyBETUEgb3BlcmF0aW9ucy4gODI1NHgganVzdCBhbGxvd3MgUlggYnVmZmVyIHNp
emUgdG8gYmUKICogMjA0OC80MDk2LzgxOTIvMTYzODQuIFdoYXQgd2UgcmVhbGx5IHdhbnQgaXMg
MjA0OCAtIEVUSEVSX0FMSUdOIHRvIGFsaWduIGl0cwogKiBwYXlsb2FkLiBPbiBhcmNoaXRlY3Vy
ZXMgd2l0aG91dCBzdHJpY3QgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyA4MjU0eCBzdGlsbAogKiBw
ZXJmb3JtcyB1bmFsaWduZWQgbWVtb3J5IGFjY2VzcyB3aGljaCB3b3VsZCByZWR1Y2UgdGhlIHBl
cmZvcm1hbmNlIHRvby4KICogVG8gYXZvaWQgY29weWluZyBvdmVyIGFuIGVudGlyZSBmcmFtZSB0
byBhbGlnbiwgd2UgYWxsb2NhdGUgYSBuZXcgbWJ1ZiBhbmQKICogY29weSBldGhlcm5ldCBoZWFk
ZXIgdG8gdGhlIG5ldyBtYnVmLiBUaGUgbmV3IG1idWYgaXMgcHJlcGVuZGVkIGludG8gdGhlCiAq
IGV4aXN0aW5nIG1idWYgY2hhaW4uCiAqCiAqIEJlIGF3YXJlLCBiZXN0IHBlcmZvcm1hbmNlIG9m
IHRoZSA4MjU0eCBpcyBhY2hpdmVkIG9ubHkgd2hlbiBqdW1ibyBmcmFtZSBpcwogKiBub3QgdXNl
ZCBhdCBhbGwgb24gYXJjaGl0ZWN0dXJlcyB3aXRoIHN0cmljdCBhbGlnbm1lbnQuCiAqLwpzdGF0
aWMgaW50CmVtX2ZpeHVwX3J4KHN0cnVjdCByeF9yaW5nICpyeHIpCnsKCXN0cnVjdCBhZGFwdGVy
ICphZGFwdGVyID0gcnhyLT5hZGFwdGVyOwoJc3RydWN0IG1idWYgKm0sICpuOwoJaW50IGVycm9y
OwoKCWVycm9yID0gMDsKCW0gPSByeHItPmZtcDsKCWlmIChtLT5tX2xlbiA8PSAoTUNMQllURVMg
LSBFVEhFUl9IRFJfTEVOKSkgewoJCWJjb3B5KG0tPm1fZGF0YSwgbS0+bV9kYXRhICsgRVRIRVJf
SERSX0xFTiwgbS0+bV9sZW4pOwoJCW0tPm1fZGF0YSArPSBFVEhFUl9IRFJfTEVOOwoJfSBlbHNl
IHsKCQlNR0VUSERSKG4sIE1fRE9OVFdBSVQsIE1UX0RBVEEpOwoJCWlmIChuICE9IE5VTEwpIHsK
CQkJYmNvcHkobS0+bV9kYXRhLCBuLT5tX2RhdGEsIEVUSEVSX0hEUl9MRU4pOwoJCQltLT5tX2Rh
dGEgKz0gRVRIRVJfSERSX0xFTjsKCQkJbS0+bV9sZW4gLT0gRVRIRVJfSERSX0xFTjsKCQkJbi0+
bV9sZW4gPSBFVEhFUl9IRFJfTEVOOwoJCQlNX01PVkVfUEtUSERSKG4sIG0pOwoJCQluLT5tX25l
eHQgPSBtOwoJCQlyeHItPmZtcCA9IG47CgkJfSBlbHNlIHsKCQkJYWRhcHRlci0+ZHJvcHBlZF9w
a3RzKys7CgkJCW1fZnJlZW0ocnhyLT5mbXApOwoJCQlyeHItPmZtcCA9IE5VTEw7CgkJCWVycm9y
ID0gRU5PTUVNOwoJCX0KCX0KCglyZXR1cm4gKGVycm9yKTsKfQojZW5kaWYKCi8qKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioKICoKICogIFZlcmlmeSB0aGF0IHRoZSBoYXJkd2FyZSBpbmRpY2F0ZWQgdGhhdCB0aGUgY2hl
Y2tzdW0gaXMgdmFsaWQuCiAqICBJbmZvcm0gdGhlIHN0YWNrIGFib3V0IHRoZSBzdGF0dXMgb2Yg
Y2hlY2tzdW0gc28gdGhhdCBzdGFjawogKiAgZG9lc24ndCBzcGVuZCB0aW1lIHZlcmlmeWluZyB0
aGUgY2hlY2tzdW0uCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyB2b2lkCmVtX3JlY2VpdmVfY2hl
Y2tzdW0oc3RydWN0IGUxMDAwX3J4X2Rlc2MgKnJ4X2Rlc2MsIHN0cnVjdCBtYnVmICptcCkKewoJ
LyogSWdub3JlIENoZWNrc3VtIGJpdCBpcyBzZXQgKi8KCWlmIChyeF9kZXNjLT5zdGF0dXMgJiBF
MTAwMF9SWERfU1RBVF9JWFNNKSB7CgkJbXAtPm1fcGt0aGRyLmNzdW1fZmxhZ3MgPSAwOwoJCXJl
dHVybjsKCX0KCglpZiAocnhfZGVzYy0+c3RhdHVzICYgRTEwMDBfUlhEX1NUQVRfSVBDUykgewoJ
CS8qIERpZCBpdCBwYXNzPyAqLwoJCWlmICghKHJ4X2Rlc2MtPmVycm9ycyAmIEUxMDAwX1JYRF9F
UlJfSVBFKSkgewoJCQkvKiBJUCBDaGVja3N1bSBHb29kICovCgkJCW1wLT5tX3BrdGhkci5jc3Vt
X2ZsYWdzID0gQ1NVTV9JUF9DSEVDS0VEOwoJCQltcC0+bV9wa3RoZHIuY3N1bV9mbGFncyB8PSBD
U1VNX0lQX1ZBTElEOwoKCQl9IGVsc2UgewoJCQltcC0+bV9wa3RoZHIuY3N1bV9mbGFncyA9IDA7
CgkJfQoJfQoKCWlmIChyeF9kZXNjLT5zdGF0dXMgJiBFMTAwMF9SWERfU1RBVF9UQ1BDUykgewoJ
CS8qIERpZCBpdCBwYXNzPyAqLwoJCWlmICghKHJ4X2Rlc2MtPmVycm9ycyAmIEUxMDAwX1JYRF9F
UlJfVENQRSkpIHsKCQkJbXAtPm1fcGt0aGRyLmNzdW1fZmxhZ3MgfD0KCQkJKENTVU1fREFUQV9W
QUxJRCB8IENTVU1fUFNFVURPX0hEUik7CgkJCW1wLT5tX3BrdGhkci5jc3VtX2RhdGEgPSBodG9u
cygweGZmZmYpOwoJCX0KCX0KfQoKLyoKICogVGhpcyByb3V0aW5lIGlzIHJ1biB2aWEgYW4gdmxh
bgogKiBjb25maWcgRVZFTlQKICovCnN0YXRpYyB2b2lkCmVtX3JlZ2lzdGVyX3ZsYW4odm9pZCAq
YXJnLCBzdHJ1Y3QgaWZuZXQgKmlmcCwgdTE2IHZ0YWcpCnsKCXN0cnVjdCBhZGFwdGVyCSphZGFw
dGVyID0gaWZwLT5pZl9zb2Z0YzsKCXUzMgkJaW5kZXgsIGJpdDsKCglpZiAoaWZwLT5pZl9zb2Z0
YyAhPSAgYXJnKSAgIC8qIE5vdCBvdXIgZXZlbnQgKi8KCQlyZXR1cm47CgoJaWYgKCh2dGFnID09
IDApIHx8ICh2dGFnID4gNDA5NSkpICAgICAgIC8qIEludmFsaWQgSUQgKi8KICAgICAgICAgICAg
ICAgIHJldHVybjsKCglpbmRleCA9ICh2dGFnID4+IDUpICYgMHg3RjsKCWJpdCA9IHZ0YWcgJiAw
eDFGOwoJZW1fc2hhZG93X3ZmdGFbaW5kZXhdIHw9ICgxIDw8IGJpdCk7CgkrK2FkYXB0ZXItPm51
bV92bGFuczsKCS8qIFJlLWluaXQgdG8gbG9hZCB0aGUgY2hhbmdlcyAqLwoJZW1faW5pdChhZGFw
dGVyKTsKfQoKLyoKICogVGhpcyByb3V0aW5lIGlzIHJ1biB2aWEgYW4gdmxhbgogKiB1bmNvbmZp
ZyBFVkVOVAogKi8Kc3RhdGljIHZvaWQKZW1fdW5yZWdpc3Rlcl92bGFuKHZvaWQgKmFyZywgc3Ry
dWN0IGlmbmV0ICppZnAsIHUxNiB2dGFnKQp7CglzdHJ1Y3QgYWRhcHRlcgkqYWRhcHRlciA9IGlm
cC0+aWZfc29mdGM7Cgl1MzIJCWluZGV4LCBiaXQ7CgoJaWYgKGlmcC0+aWZfc29mdGMgIT0gIGFy
ZykKCQlyZXR1cm47CgoJaWYgKCh2dGFnID09IDApIHx8ICh2dGFnID4gNDA5NSkpICAgICAgIC8q
IEludmFsaWQgKi8KICAgICAgICAgICAgICAgIHJldHVybjsKCglpbmRleCA9ICh2dGFnID4+IDUp
ICYgMHg3RjsKCWJpdCA9IHZ0YWcgJiAweDFGOwoJZW1fc2hhZG93X3ZmdGFbaW5kZXhdICY9IH4o
MSA8PCBiaXQpOwoJLS1hZGFwdGVyLT5udW1fdmxhbnM7CgkvKiBSZS1pbml0IHRvIGxvYWQgdGhl
IGNoYW5nZXMgKi8KCWVtX2luaXQoYWRhcHRlcik7Cn0KCnN0YXRpYyB2b2lkCmVtX3NldHVwX3Zs
YW5faHdfc3VwcG9ydChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKewoJc3RydWN0IGUxMDAwX2h3
ICpodyA9ICZhZGFwdGVyLT5odzsKCXUzMiAgICAgICAgICAgICByZWc7CgoJLyoKCSoqIFdlIGdl
dCBoZXJlIHRocnUgaW5pdF9sb2NrZWQsIG1lYW5pbmcKCSoqIGEgc29mdCByZXNldCwgdGhpcyBo
YXMgYWxyZWFkeSBjbGVhcmVkCgkqKiB0aGUgVkZUQSBhbmQgb3RoZXIgc3RhdGUsIHNvIGlmIHRo
ZXJlCgkqKiBoYXZlIGJlZW4gbm8gdmxhbidzIHJlZ2lzdGVyZWQgZG8gbm90aGluZy4KCSovCglp
ZiAoYWRhcHRlci0+bnVtX3ZsYW5zID09IDApCiAgICAgICAgICAgICAgICByZXR1cm47CgoJLyoK
CSoqIEEgc29mdCByZXNldCB6ZXJvJ3Mgb3V0IHRoZSBWRlRBLCBzbwoJKiogd2UgbmVlZCB0byBy
ZXBvcHVsYXRlIGl0IG5vdy4KCSovCglmb3IgKGludCBpID0gMDsgaSA8IEVNX1ZGVEFfU0laRTsg
aSsrKQogICAgICAgICAgICAgICAgaWYgKGVtX3NoYWRvd192ZnRhW2ldICE9IDApCgkJCUUxMDAw
X1dSSVRFX1JFR19BUlJBWShodywgRTEwMDBfVkZUQSwKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGksIGVtX3NoYWRvd192ZnRhW2ldKTsKCglyZWcgPSBFMTAwMF9SRUFEX1JFRyhodywgRTEw
MDBfQ1RSTCk7CglyZWcgfD0gRTEwMDBfQ1RSTF9WTUU7CglFMTAwMF9XUklURV9SRUcoaHcsIEUx
MDAwX0NUUkwsIHJlZyk7CgoJLyogRW5hYmxlIHRoZSBGaWx0ZXIgVGFibGUgKi8KCXJlZyA9IEUx
MDAwX1JFQURfUkVHKGh3LCBFMTAwMF9SQ1RMKTsKCXJlZyAmPSB+RTEwMDBfUkNUTF9DRklFTjsK
CXJlZyB8PSBFMTAwMF9SQ1RMX1ZGRTsKCUUxMDAwX1dSSVRFX1JFRyhodywgRTEwMDBfUkNUTCwg
cmVnKTsKCgkvKiBVcGRhdGUgdGhlIGZyYW1lIHNpemUgKi8KCUUxMDAwX1dSSVRFX1JFRygmYWRh
cHRlci0+aHcsIEUxMDAwX1JMUE1MLAoJICAgIGFkYXB0ZXItPm1heF9mcmFtZV9zaXplICsgVkxB
Tl9UQUdfU0laRSk7Cn0KCnN0YXRpYyB2b2lkCmVtX2VuYWJsZV9pbnRyKHN0cnVjdCBhZGFwdGVy
ICphZGFwdGVyKQp7CglzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwoJdTMyIGlt
c19tYXNrID0gSU1TX0VOQUJMRV9NQVNLOwoKCWlmIChody0+bWFjLnR5cGUgPT0gZTEwMDBfODI1
NzQpIHsKCQlFMTAwMF9XUklURV9SRUcoaHcsIEVNX0VJQUMsIEVNX01TSVhfTUFTSyk7CgkJaW1z
X21hc2sgfD0gRU1fTVNJWF9NQVNLOwoJfSAKCUUxMDAwX1dSSVRFX1JFRyhodywgRTEwMDBfSU1T
LCBpbXNfbWFzayk7Cn0KCnN0YXRpYyB2b2lkCmVtX2Rpc2FibGVfaW50cihzdHJ1Y3QgYWRhcHRl
ciAqYWRhcHRlcikKewoJc3RydWN0IGUxMDAwX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKCglpZiAo
aHctPm1hYy50eXBlID09IGUxMDAwXzgyNTc0KQoJCUUxMDAwX1dSSVRFX1JFRyhodywgRU1fRUlB
QywgMCk7CglFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBFMTAwMF9JTUMsIDB4ZmZmZmZm
ZmYpOwp9CgovKgogKiBCaXQgb2YgYSBtaXNub21lciwgd2hhdCB0aGlzIHJlYWxseSBtZWFucyBp
cwogKiB0byBlbmFibGUgT1MgbWFuYWdlbWVudCBvZiB0aGUgc3lzdGVtLi4uIGFrYQogKiB0byBk
aXNhYmxlIHNwZWNpYWwgaGFyZHdhcmUgbWFuYWdlbWVudCBmZWF0dXJlcyAKICovCnN0YXRpYyB2
b2lkCmVtX2luaXRfbWFuYWdlYWJpbGl0eShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKewoJLyog
QSBzaGFyZWQgY29kZSB3b3JrYXJvdW5kICovCiNkZWZpbmUgRTEwMDBfODI1NDJfTUFOQzJIIEUx
MDAwX01BTkMySAoJaWYgKGFkYXB0ZXItPmhhc19tYW5hZ2UpIHsKCQlpbnQgbWFuYzJoID0gRTEw
MDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBFMTAwMF9NQU5DMkgpOwoJCWludCBtYW5jID0gRTEw
MDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBFMTAwMF9NQU5DKTsKCgkJLyogZGlzYWJsZSBoYXJk
d2FyZSBpbnRlcmNlcHRpb24gb2YgQVJQICovCgkJbWFuYyAmPSB+KEUxMDAwX01BTkNfQVJQX0VO
KTsKCiAgICAgICAgICAgICAgICAvKiBlbmFibGUgcmVjZWl2aW5nIG1hbmFnZW1lbnQgcGFja2V0
cyB0byB0aGUgaG9zdCAqLwoJCW1hbmMgfD0gRTEwMDBfTUFOQ19FTl9NTkcySE9TVDsKI2RlZmlu
ZSBFMTAwMF9NTkcySE9TVF9QT1JUXzYyMyAoMSA8PCA1KQojZGVmaW5lIEUxMDAwX01ORzJIT1NU
X1BPUlRfNjY0ICgxIDw8IDYpCgkJbWFuYzJoIHw9IEUxMDAwX01ORzJIT1NUX1BPUlRfNjIzOwoJ
CW1hbmMyaCB8PSBFMTAwMF9NTkcySE9TVF9QT1JUXzY2NDsKCQlFMTAwMF9XUklURV9SRUcoJmFk
YXB0ZXItPmh3LCBFMTAwMF9NQU5DMkgsIG1hbmMyaCk7CgkJRTEwMDBfV1JJVEVfUkVHKCZhZGFw
dGVyLT5odywgRTEwMDBfTUFOQywgbWFuYyk7Cgl9Cn0KCi8qCiAqIEdpdmUgY29udHJvbCBiYWNr
IHRvIGhhcmR3YXJlIG1hbmFnZW1lbnQKICogY29udHJvbGxlciBpZiB0aGVyZSBpcyBvbmUuCiAq
LwpzdGF0aWMgdm9pZAplbV9yZWxlYXNlX21hbmFnZWFiaWxpdHkoc3RydWN0IGFkYXB0ZXIgKmFk
YXB0ZXIpCnsKCWlmIChhZGFwdGVyLT5oYXNfbWFuYWdlKSB7CgkJaW50IG1hbmMgPSBFMTAwMF9S
RUFEX1JFRygmYWRhcHRlci0+aHcsIEUxMDAwX01BTkMpOwoKCQkvKiByZS1lbmFibGUgaGFyZHdh
cmUgaW50ZXJjZXB0aW9uIG9mIEFSUCAqLwoJCW1hbmMgfD0gRTEwMDBfTUFOQ19BUlBfRU47CgkJ
bWFuYyAmPSB+RTEwMDBfTUFOQ19FTl9NTkcySE9TVDsKCgkJRTEwMDBfV1JJVEVfUkVHKCZhZGFw
dGVyLT5odywgRTEwMDBfTUFOQywgbWFuYyk7Cgl9Cn0KCi8qCiAqIGVtX2dldF9od19jb250cm9s
IHNldHMgdGhlIHtDVFJMX0VYVHxGV1NNfTpEUlZfTE9BRCBiaXQuCiAqIEZvciBBU0YgYW5kIFBh
c3MgVGhyb3VnaCB2ZXJzaW9ucyBvZiBmL3cgdGhpcyBtZWFucwogKiB0aGF0IHRoZSBkcml2ZXIg
aXMgbG9hZGVkLiBGb3IgQU1UIHZlcnNpb24gdHlwZSBmL3cKICogdGhpcyBtZWFucyB0aGF0IHRo
ZSBuZXR3b3JrIGkvZiBpcyBvcGVuLgogKi8Kc3RhdGljIHZvaWQKZW1fZ2V0X2h3X2NvbnRyb2wo
c3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCnsKCXUzMiBjdHJsX2V4dCwgc3dzbTsKCglpZiAoYWRh
cHRlci0+aHcubWFjLnR5cGUgPT0gZTEwMDBfODI1NzMpIHsKCQlzd3NtID0gRTEwMDBfUkVBRF9S
RUcoJmFkYXB0ZXItPmh3LCBFMTAwMF9TV1NNKTsKCQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXIt
Pmh3LCBFMTAwMF9TV1NNLAoJCSAgICBzd3NtIHwgRTEwMDBfU1dTTV9EUlZfTE9BRCk7CgkJcmV0
dXJuOwoJfQoJLyogZWxzZSAqLwoJY3RybF9leHQgPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+
aHcsIEUxMDAwX0NUUkxfRVhUKTsKCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIEUxMDAw
X0NUUkxfRVhULAoJICAgIGN0cmxfZXh0IHwgRTEwMDBfQ1RSTF9FWFRfRFJWX0xPQUQpOwoJcmV0
dXJuOwp9CgovKgogKiBlbV9yZWxlYXNlX2h3X2NvbnRyb2wgcmVzZXRzIHtDVFJMX0VYVHxGV1NN
fTpEUlZfTE9BRCBiaXQuCiAqIEZvciBBU0YgYW5kIFBhc3MgVGhyb3VnaCB2ZXJzaW9ucyBvZiBm
L3cgdGhpcyBtZWFucyB0aGF0CiAqIHRoZSBkcml2ZXIgaXMgbm8gbG9uZ2VyIGxvYWRlZC4gRm9y
IEFNVCB2ZXJzaW9ucyBvZiB0aGUKICogZi93IHRoaXMgbWVhbnMgdGhhdCB0aGUgbmV0d29yayBp
L2YgaXMgY2xvc2VkLgogKi8Kc3RhdGljIHZvaWQKZW1fcmVsZWFzZV9od19jb250cm9sKHN0cnVj
dCBhZGFwdGVyICphZGFwdGVyKQp7Cgl1MzIgY3RybF9leHQsIHN3c207CgoJaWYgKCFhZGFwdGVy
LT5oYXNfbWFuYWdlKQoJCXJldHVybjsKCglpZiAoYWRhcHRlci0+aHcubWFjLnR5cGUgPT0gZTEw
MDBfODI1NzMpIHsKCQlzd3NtID0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBFMTAwMF9T
V1NNKTsKCQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBFMTAwMF9TV1NNLAoJCSAgICBz
d3NtICYgfkUxMDAwX1NXU01fRFJWX0xPQUQpOwoJCXJldHVybjsKCX0KCS8qIGVsc2UgKi8KCWN0
cmxfZXh0ID0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBFMTAwMF9DVFJMX0VYVCk7CglF
MTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBFMTAwMF9DVFJMX0VYVCwKCSAgICBjdHJsX2V4
dCAmIH5FMTAwMF9DVFJMX0VYVF9EUlZfTE9BRCk7CglyZXR1cm47Cn0KCnN0YXRpYyBpbnQKZW1f
aXNfdmFsaWRfZXRoZXJfYWRkcih1OCAqYWRkcikKewoJY2hhciB6ZXJvX2FkZHJbNl0gPSB7IDAs
IDAsIDAsIDAsIDAsIDAgfTsKCglpZiAoKGFkZHJbMF0gJiAxKSB8fCAoIWJjbXAoYWRkciwgemVy
b19hZGRyLCBFVEhFUl9BRERSX0xFTikpKSB7CgkJcmV0dXJuIChGQUxTRSk7Cgl9CgoJcmV0dXJu
IChUUlVFKTsKfQoKLyoKKiogUGFyc2UgdGhlIGludGVyZmFjZSBjYXBhYmlsaXRpZXMgd2l0aCBy
ZWdhcmQKKiogdG8gYm90aCBzeXN0ZW0gbWFuYWdlbWVudCBhbmQgd2FrZS1vbi1sYW4gZm9yCioq
IGxhdGVyIHVzZS4KKi8Kc3RhdGljIHZvaWQKZW1fZ2V0X3dha2V1cChkZXZpY2VfdCBkZXYpCnsK
CXN0cnVjdCBhZGFwdGVyCSphZGFwdGVyID0gZGV2aWNlX2dldF9zb2Z0YyhkZXYpOwoJdTE2CQll
ZXByb21fZGF0YSA9IDAsIGRldmljZV9pZCwgYXBtZV9tYXNrOwoKCWFkYXB0ZXItPmhhc19tYW5h
Z2UgPSBlMTAwMF9lbmFibGVfbW5nX3Bhc3NfdGhydSgmYWRhcHRlci0+aHcpOwoJYXBtZV9tYXNr
ID0gRU1fRUVQUk9NX0FQTUU7CgoJc3dpdGNoIChhZGFwdGVyLT5ody5tYWMudHlwZSkgewoJY2Fz
ZSBlMTAwMF84MjU3MzoKCWNhc2UgZTEwMDBfODI1ODM6CgkJYWRhcHRlci0+aGFzX2FtdCA9IFRS
VUU7CgkJLyogRmFsbHMgdGhydSAqLwoJY2FzZSBlMTAwMF84MjU3MToKCWNhc2UgZTEwMDBfODI1
NzI6CgljYXNlIGUxMDAwXzgwMDAzZXMybGFuOgoJCWlmIChhZGFwdGVyLT5ody5idXMuZnVuYyA9
PSAxKSB7CgkJCWUxMDAwX3JlYWRfbnZtKCZhZGFwdGVyLT5odywKCQkJICAgIE5WTV9JTklUX0NP
TlRST0wzX1BPUlRfQiwgMSwgJmVlcHJvbV9kYXRhKTsKCQkJYnJlYWs7CgkJfSBlbHNlCgkJCWUx
MDAwX3JlYWRfbnZtKCZhZGFwdGVyLT5odywKCQkJICAgIE5WTV9JTklUX0NPTlRST0wzX1BPUlRf
QSwgMSwgJmVlcHJvbV9kYXRhKTsKCQlicmVhazsKCWNhc2UgZTEwMDBfaWNoOGxhbjoKCWNhc2Ug
ZTEwMDBfaWNoOWxhbjoKCWNhc2UgZTEwMDBfaWNoMTBsYW46CgljYXNlIGUxMDAwX3BjaGxhbjoK
CQlhcG1lX21hc2sgPSBFMTAwMF9XVUNfQVBNRTsKCQlhZGFwdGVyLT5oYXNfYW10ID0gVFJVRTsK
CQllZXByb21fZGF0YSA9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgRTEwMDBfV1VDKTsK
CQlicmVhazsKCWRlZmF1bHQ6CgkJZTEwMDBfcmVhZF9udm0oJmFkYXB0ZXItPmh3LAoJCSAgICBO
Vk1fSU5JVF9DT05UUk9MM19QT1JUX0EsIDEsICZlZXByb21fZGF0YSk7CgkJYnJlYWs7Cgl9Cglp
ZiAoZWVwcm9tX2RhdGEgJiBhcG1lX21hc2spCgkJYWRhcHRlci0+d29sID0gKEUxMDAwX1dVRkNf
TUFHIHwgRTEwMDBfV1VGQ19NQyk7CgkvKgogICAgICAgICAqIFdlIGhhdmUgdGhlIGVlcHJvbSBz
ZXR0aW5ncywgbm93IGFwcGx5IHRoZSBzcGVjaWFsIGNhc2VzCiAgICAgICAgICogd2hlcmUgdGhl
IGVlcHJvbSBtYXkgYmUgd3Jvbmcgb3IgdGhlIGJvYXJkIHdvbid0IHN1cHBvcnQKICAgICAgICAg
KiB3YWtlIG9uIGxhbiBvbiBhIHBhcnRpY3VsYXIgcG9ydAoJICovCglkZXZpY2VfaWQgPSBwY2lf
Z2V0X2RldmljZShkZXYpOwogICAgICAgIHN3aXRjaCAoZGV2aWNlX2lkKSB7CgljYXNlIEUxMDAw
X0RFVl9JRF84MjU3MUVCX0ZJQkVSOgoJCS8qIFdha2UgZXZlbnRzIG9ubHkgc3VwcG9ydGVkIG9u
IHBvcnQgQSBmb3IgZHVhbCBmaWJlcgoJCSAqIHJlZ2FyZGxlc3Mgb2YgZWVwcm9tIHNldHRpbmcg
Ki8KCQlpZiAoRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBFMTAwMF9TVEFUVVMpICYKCQkg
ICAgRTEwMDBfU1RBVFVTX0ZVTkNfMSkKCQkJYWRhcHRlci0+d29sID0gMDsKCQlicmVhazsKCWNh
c2UgRTEwMDBfREVWX0lEXzgyNTcxRUJfUVVBRF9DT1BQRVI6CgljYXNlIEUxMDAwX0RFVl9JRF84
MjU3MUVCX1FVQURfRklCRVI6CgljYXNlIEUxMDAwX0RFVl9JRF84MjU3MUVCX1FVQURfQ09QUEVS
X0xQOgogICAgICAgICAgICAgICAgLyogaWYgcXVhZCBwb3J0IGFkYXB0ZXIsIGRpc2FibGUgV29M
IG9uIGFsbCBidXQgcG9ydCBBICovCgkJaWYgKGdsb2JhbF9xdWFkX3BvcnRfYSAhPSAwKQoJCQlh
ZGFwdGVyLT53b2wgPSAwOwoJCS8qIFJlc2V0IGZvciBtdWx0aXBsZSBxdWFkIHBvcnQgYWRhcHRl
cnMgKi8KCQlpZiAoKytnbG9iYWxfcXVhZF9wb3J0X2EgPT0gNCkKCQkJZ2xvYmFsX3F1YWRfcG9y
dF9hID0gMDsKICAgICAgICAgICAgICAgIGJyZWFrOwoJfQoJcmV0dXJuOwp9CgoKLyoKICogRW5h
YmxlIFBDSSBXYWtlIE9uIExhbiBjYXBhYmlsaXR5CiAqLwpzdGF0aWMgdm9pZAplbV9lbmFibGVf
d2FrZXVwKGRldmljZV90IGRldikKewoJc3RydWN0IGFkYXB0ZXIJKmFkYXB0ZXIgPSBkZXZpY2Vf
Z2V0X3NvZnRjKGRldik7CglzdHJ1Y3QgaWZuZXQJKmlmcCA9IGFkYXB0ZXItPmlmcDsKCXUzMgkJ
cG1jLCBjdHJsLCBjdHJsX2V4dCwgcmN0bDsKCXUxNiAgICAgCXN0YXR1czsKCglpZiAoKHBjaV9m
aW5kX2V4dGNhcChkZXYsIFBDSVlfUE1HLCAmcG1jKSAhPSAwKSkKCQlyZXR1cm47CgoJLyogQWR2
ZXJ0aXNlIHRoZSB3YWtldXAgY2FwYWJpbGl0eSAqLwoJY3RybCA9IEUxMDAwX1JFQURfUkVHKCZh
ZGFwdGVyLT5odywgRTEwMDBfQ1RSTCk7CgljdHJsIHw9IChFMTAwMF9DVFJMX1NXRFBJTjIgfCBF
MTAwMF9DVFJMX1NXRFBJTjMpOwoJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgRTEwMDBf
Q1RSTCwgY3RybCk7CglFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBFMTAwMF9XVUMsIEUx
MDAwX1dVQ19QTUVfRU4pOwoKCWlmICgoYWRhcHRlci0+aHcubWFjLnR5cGUgPT0gZTEwMDBfaWNo
OGxhbikgfHwKCSAgICAoYWRhcHRlci0+aHcubWFjLnR5cGUgPT0gZTEwMDBfcGNobGFuKSB8fAoJ
ICAgIChhZGFwdGVyLT5ody5tYWMudHlwZSA9PSBlMTAwMF9pY2g5bGFuKSB8fAoJICAgIChhZGFw
dGVyLT5ody5tYWMudHlwZSA9PSBlMTAwMF9pY2gxMGxhbikpIHsKCQllMTAwMF9kaXNhYmxlX2dp
Z193b2xfaWNoOGxhbigmYWRhcHRlci0+aHcpOwoJCWUxMDAwX2h2X3BoeV9wb3dlcmRvd25fd29y
a2Fyb3VuZF9pY2g4bGFuKCZhZGFwdGVyLT5odyk7Cgl9CgoJLyogS2VlcCB0aGUgbGFzZXIgcnVu
bmluZyBvbiBGaWJlciBhZGFwdGVycyAqLwoJaWYgKGFkYXB0ZXItPmh3LnBoeS5tZWRpYV90eXBl
ID09IGUxMDAwX21lZGlhX3R5cGVfZmliZXIgfHwKCSAgICBhZGFwdGVyLT5ody5waHkubWVkaWFf
dHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ludGVybmFsX3NlcmRlcykgewoJCWN0cmxfZXh0ID0g
RTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBFMTAwMF9DVFJMX0VYVCk7CgkJY3RybF9leHQg
fD0gRTEwMDBfQ1RSTF9FWFRfU0RQM19EQVRBOwoJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+
aHcsIEUxMDAwX0NUUkxfRVhULCBjdHJsX2V4dCk7Cgl9CgoJLyoKCSoqIERldGVybWluZSB0eXBl
IG9mIFdha2V1cDogbm90ZSB0aGF0IHdvbAoJKiogaXMgc2V0IHdpdGggYWxsIGJpdHMgb24gYnkg
ZGVmYXVsdC4KCSovCglpZiAoKGlmcC0+aWZfY2FwZW5hYmxlICYgSUZDQVBfV09MX01BR0lDKSA9
PSAwKQoJCWFkYXB0ZXItPndvbCAmPSB+RTEwMDBfV1VGQ19NQUc7CgoJaWYgKChpZnAtPmlmX2Nh
cGVuYWJsZSAmIElGQ0FQX1dPTF9NQ0FTVCkgPT0gMCkKCQlhZGFwdGVyLT53b2wgJj0gfkUxMDAw
X1dVRkNfTUM7CgllbHNlIHsKCQlyY3RsID0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBF
MTAwMF9SQ1RMKTsKCQlyY3RsIHw9IEUxMDAwX1JDVExfTVBFOwoJCUUxMDAwX1dSSVRFX1JFRygm
YWRhcHRlci0+aHcsIEUxMDAwX1JDVEwsIHJjdGwpOwoJfQoKCWlmIChhZGFwdGVyLT5ody5tYWMu
dHlwZSA9PSBlMTAwMF9wY2hsYW4pIHsKCQlpZiAoZW1fZW5hYmxlX3BoeV93YWtldXAoYWRhcHRl
cikpCgkJCXJldHVybjsKCX0gZWxzZSB7CgkJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywg
RTEwMDBfV1VDLCBFMTAwMF9XVUNfUE1FX0VOKTsKCQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXIt
Pmh3LCBFMTAwMF9XVUZDLCBhZGFwdGVyLT53b2wpOwoJfQoKCWlmIChhZGFwdGVyLT5ody5waHku
dHlwZSA9PSBlMTAwMF9waHlfaWdwXzMpCgkJZTEwMDBfaWdwM19waHlfcG93ZXJkb3duX3dvcmth
cm91bmRfaWNoOGxhbigmYWRhcHRlci0+aHcpOwoKICAgICAgICAvKiBSZXF1ZXN0IFBNRSAqLwog
ICAgICAgIHN0YXR1cyA9IHBjaV9yZWFkX2NvbmZpZyhkZXYsIHBtYyArIFBDSVJfUE9XRVJfU1RB
VFVTLCAyKTsKCXN0YXR1cyAmPSB+KFBDSU1fUFNUQVRfUE1FIHwgUENJTV9QU1RBVF9QTUVFTkFC
TEUpOwoJaWYgKGlmcC0+aWZfY2FwZW5hYmxlICYgSUZDQVBfV09MKQoJCXN0YXR1cyB8PSBQQ0lN
X1BTVEFUX1BNRSB8IFBDSU1fUFNUQVRfUE1FRU5BQkxFOwogICAgICAgIHBjaV93cml0ZV9jb25m
aWcoZGV2LCBwbWMgKyBQQ0lSX1BPV0VSX1NUQVRVUywgc3RhdHVzLCAyKTsKCglyZXR1cm47Cn0K
Ci8qCioqIFdPTCBpbiB0aGUgbmV3ZXIgY2hpcHNldCBpbnRlcmZhY2VzIChwY2hsYW4pCioqIHJl
cXVpcmUgdGhpbmcgdG8gYmUgY29waWVkIGludG8gdGhlIHBoeQoqLwpzdGF0aWMgaW50CmVtX2Vu
YWJsZV9waHlfd2FrZXVwKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQp7CglzdHJ1Y3QgZTEwMDBf
aHcgKmh3ID0gJmFkYXB0ZXItPmh3OwoJdTMyIG1yZWcsIHJldCA9IDA7Cgl1MTYgcHJlZzsKCgkv
KiBjb3B5IE1BQyBSQVJzIHRvIFBIWSBSQVJzICovCglmb3IgKGludCBpID0gMDsgaSA8IGFkYXB0
ZXItPmh3Lm1hYy5yYXJfZW50cnlfY291bnQ7IGkrKykgewoJCW1yZWcgPSBFMTAwMF9SRUFEX1JF
RyhodywgRTEwMDBfUkFMKGkpKTsKCQllMTAwMF93cml0ZV9waHlfcmVnKGh3LCBCTV9SQVJfTChp
KSwgKHUxNikobXJlZyAmIDB4RkZGRikpOwoJCWUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIEJNX1JB
Ul9NKGkpLAoJCSAgICAodTE2KSgobXJlZyA+PiAxNikgJiAweEZGRkYpKTsKCQltcmVnID0gRTEw
MDBfUkVBRF9SRUcoaHcsIEUxMDAwX1JBSChpKSk7CgkJZTEwMDBfd3JpdGVfcGh5X3JlZyhodywg
Qk1fUkFSX0goaSksICh1MTYpKG1yZWcgJiAweEZGRkYpKTsKCQllMTAwMF93cml0ZV9waHlfcmVn
KGh3LCBCTV9SQVJfQ1RSTChpKSwKCQkgICAgKHUxNikoKG1yZWcgPj4gMTYpICYgMHhGRkZGKSk7
Cgl9CgoJLyogY29weSBNQUMgTVRBIHRvIFBIWSBNVEEgKi8KCWZvciAoaW50IGkgPSAwOyBpIDwg
YWRhcHRlci0+aHcubWFjLm10YV9yZWdfY291bnQ7IGkrKykgewoJCW1yZWcgPSBFMTAwMF9SRUFE
X1JFR19BUlJBWShodywgRTEwMDBfTVRBLCBpKTsKCQllMTAwMF93cml0ZV9waHlfcmVnKGh3LCBC
TV9NVEEoaSksICh1MTYpKG1yZWcgJiAweEZGRkYpKTsKCQllMTAwMF93cml0ZV9waHlfcmVnKGh3
LCBCTV9NVEEoaSkgKyAxLAoJCSAgICAodTE2KSgobXJlZyA+PiAxNikgJiAweEZGRkYpKTsKCX0K
CgkvKiBjb25maWd1cmUgUEhZIFJ4IENvbnRyb2wgcmVnaXN0ZXIgKi8KCWUxMDAwX3JlYWRfcGh5
X3JlZygmYWRhcHRlci0+aHcsIEJNX1JDVEwsICZwcmVnKTsKCW1yZWcgPSBFMTAwMF9SRUFEX1JF
RyhodywgRTEwMDBfUkNUTCk7CglpZiAobXJlZyAmIEUxMDAwX1JDVExfVVBFKQoJCXByZWcgfD0g
Qk1fUkNUTF9VUEU7CglpZiAobXJlZyAmIEUxMDAwX1JDVExfTVBFKQoJCXByZWcgfD0gQk1fUkNU
TF9NUEU7CglwcmVnICY9IH4oQk1fUkNUTF9NT19NQVNLKTsKCWlmIChtcmVnICYgRTEwMDBfUkNU
TF9NT18zKQoJCXByZWcgfD0gKCgobXJlZyAmIEUxMDAwX1JDVExfTU9fMykgPj4gRTEwMDBfUkNU
TF9NT19TSElGVCkKCQkJCTw8IEJNX1JDVExfTU9fU0hJRlQpOwoJaWYgKG1yZWcgJiBFMTAwMF9S
Q1RMX0JBTSkKCQlwcmVnIHw9IEJNX1JDVExfQkFNOwoJaWYgKG1yZWcgJiBFMTAwMF9SQ1RMX1BN
Q0YpCgkJcHJlZyB8PSBCTV9SQ1RMX1BNQ0Y7CgltcmVnID0gRTEwMDBfUkVBRF9SRUcoaHcsIEUx
MDAwX0NUUkwpOwoJaWYgKG1yZWcgJiBFMTAwMF9DVFJMX1JGQ0UpCgkJcHJlZyB8PSBCTV9SQ1RM
X1JGQ0U7CgllMTAwMF93cml0ZV9waHlfcmVnKCZhZGFwdGVyLT5odywgQk1fUkNUTCwgcHJlZyk7
CgoJLyogZW5hYmxlIFBIWSB3YWtldXAgaW4gTUFDIHJlZ2lzdGVyICovCglFMTAwMF9XUklURV9S
RUcoaHcsIEUxMDAwX1dVQywKCSAgICBFMTAwMF9XVUNfUEhZX1dBS0UgfCBFMTAwMF9XVUNfUE1F
X0VOKTsKCUUxMDAwX1dSSVRFX1JFRyhodywgRTEwMDBfV1VGQywgYWRhcHRlci0+d29sKTsKCgkv
KiBjb25maWd1cmUgYW5kIGVuYWJsZSBQSFkgd2FrZXVwIGluIFBIWSByZWdpc3RlcnMgKi8KCWUx
MDAwX3dyaXRlX3BoeV9yZWcoJmFkYXB0ZXItPmh3LCBCTV9XVUZDLCBhZGFwdGVyLT53b2wpOwoJ
ZTEwMDBfd3JpdGVfcGh5X3JlZygmYWRhcHRlci0+aHcsIEJNX1dVQywgRTEwMDBfV1VDX1BNRV9F
Tik7CgoJLyogYWN0aXZhdGUgUEhZIHdha2V1cCAqLwoJcmV0ID0gaHctPnBoeS5vcHMuYWNxdWly
ZShodyk7CglpZiAocmV0KSB7CgkJcHJpbnRmKCJDb3VsZCBub3QgYWNxdWlyZSBQSFlcbiIpOwoJ
CXJldHVybiByZXQ7Cgl9CgllMTAwMF93cml0ZV9waHlfcmVnX21kaWMoaHcsIElHUDAxRTEwMDBf
UEhZX1BBR0VfU0VMRUNULAoJICAgICAgICAgICAgICAgICAgICAgICAgIChCTV9XVUNfRU5BQkxF
X1BBR0UgPDwgSUdQX1BBR0VfU0hJRlQpKTsKCXJldCA9IGUxMDAwX3JlYWRfcGh5X3JlZ19tZGlj
KGh3LCBCTV9XVUNfRU5BQkxFX1JFRywgJnByZWcpOwoJaWYgKHJldCkgewoJCXByaW50ZigiQ291
bGQgbm90IHJlYWQgUEhZIHBhZ2UgNzY5XG4iKTsKCQlnb3RvIG91dDsKCX0KCXByZWcgfD0gQk1f
V1VDX0VOQUJMRV9CSVQgfCBCTV9XVUNfSE9TVF9XVV9CSVQ7CglyZXQgPSBlMTAwMF93cml0ZV9w
aHlfcmVnX21kaWMoaHcsIEJNX1dVQ19FTkFCTEVfUkVHLCBwcmVnKTsKCWlmIChyZXQpCgkJcHJp
bnRmKCJDb3VsZCBub3Qgc2V0IFBIWSBIb3N0IFdha2V1cCBiaXRcbiIpOwpvdXQ6Cglody0+cGh5
Lm9wcy5yZWxlYXNlKGh3KTsKCglyZXR1cm4gcmV0Owp9CgpzdGF0aWMgdm9pZAplbV9sZWRfZnVu
Yyh2b2lkICphcmcsIGludCBvbm9mZikKewoJc3RydWN0IGFkYXB0ZXIJKmFkYXB0ZXIgPSBhcmc7
CiAKCUVNX0NPUkVfTE9DSyhhZGFwdGVyKTsKCWlmIChvbm9mZikgewoJCWUxMDAwX3NldHVwX2xl
ZCgmYWRhcHRlci0+aHcpOwoJCWUxMDAwX2xlZF9vbigmYWRhcHRlci0+aHcpOwoJfSBlbHNlIHsK
CQllMTAwMF9sZWRfb2ZmKCZhZGFwdGVyLT5odyk7CgkJZTEwMDBfY2xlYW51cF9sZWQoJmFkYXB0
ZXItPmh3KTsKCX0KCUVNX0NPUkVfVU5MT0NLKGFkYXB0ZXIpOwp9CgovKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgog
KgogKiAgVXBkYXRlIHRoZSBib2FyZCBzdGF0aXN0aWNzIGNvdW50ZXJzLgogKgogKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKi8Kc3RhdGljIHZvaWQKZW1fdXBkYXRlX3N0YXRzX2NvdW50ZXJzKHN0cnVjdCBhZGFwdGVy
ICphZGFwdGVyKQp7CglzdHJ1Y3QgaWZuZXQgICAqaWZwOwoKCWlmKGFkYXB0ZXItPmh3LnBoeS5t
ZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfY29wcGVyIHx8CgkgICAoRTEwMDBfUkVBRF9S
RUcoJmFkYXB0ZXItPmh3LCBFMTAwMF9TVEFUVVMpICYgRTEwMDBfU1RBVFVTX0xVKSkgewoJCWFk
YXB0ZXItPnN0YXRzLnN5bWVycnMgKz0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBFMTAw
MF9TWU1FUlJTKTsKCQlhZGFwdGVyLT5zdGF0cy5zZWMgKz0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0
ZXItPmh3LCBFMTAwMF9TRUMpOwoJfQoJYWRhcHRlci0+c3RhdHMuY3JjZXJycyArPSBFMTAwMF9S
RUFEX1JFRygmYWRhcHRlci0+aHcsIEUxMDAwX0NSQ0VSUlMpOwoJYWRhcHRlci0+c3RhdHMubXBj
ICs9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgRTEwMDBfTVBDKTsKCWFkYXB0ZXItPnN0
YXRzLnNjYyArPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIEUxMDAwX1NDQyk7CglhZGFw
dGVyLT5zdGF0cy5lY29sICs9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgRTEwMDBfRUNP
TCk7CgoJYWRhcHRlci0+c3RhdHMubWNjICs9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywg
RTEwMDBfTUNDKTsKCWFkYXB0ZXItPnN0YXRzLmxhdGVjb2wgKz0gRTEwMDBfUkVBRF9SRUcoJmFk
YXB0ZXItPmh3LCBFMTAwMF9MQVRFQ09MKTsKCWFkYXB0ZXItPnN0YXRzLmNvbGMgKz0gRTEwMDBf
UkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBFMTAwMF9DT0xDKTsKCWFkYXB0ZXItPnN0YXRzLmRjICs9
IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgRTEwMDBfREMpOwoJYWRhcHRlci0+c3RhdHMu
cmxlYyArPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIEUxMDAwX1JMRUMpOwoJYWRhcHRl
ci0+c3RhdHMueG9ucnhjICs9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgRTEwMDBfWE9O
UlhDKTsKCWFkYXB0ZXItPnN0YXRzLnhvbnR4YyArPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+
aHcsIEUxMDAwX1hPTlRYQyk7CglhZGFwdGVyLT5zdGF0cy54b2ZmcnhjICs9IEUxMDAwX1JFQURf
UkVHKCZhZGFwdGVyLT5odywgRTEwMDBfWE9GRlJYQyk7CglhZGFwdGVyLT5zdGF0cy54b2ZmdHhj
ICs9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgRTEwMDBfWE9GRlRYQyk7CglhZGFwdGVy
LT5zdGF0cy5mY3J1YyArPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIEUxMDAwX0ZDUlVD
KTsKCWFkYXB0ZXItPnN0YXRzLnByYzY0ICs9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywg
RTEwMDBfUFJDNjQpOwoJYWRhcHRlci0+c3RhdHMucHJjMTI3ICs9IEUxMDAwX1JFQURfUkVHKCZh
ZGFwdGVyLT5odywgRTEwMDBfUFJDMTI3KTsKCWFkYXB0ZXItPnN0YXRzLnByYzI1NSArPSBFMTAw
MF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIEUxMDAwX1BSQzI1NSk7CglhZGFwdGVyLT5zdGF0cy5w
cmM1MTEgKz0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBFMTAwMF9QUkM1MTEpOwoJYWRh
cHRlci0+c3RhdHMucHJjMTAyMyArPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIEUxMDAw
X1BSQzEwMjMpOwoJYWRhcHRlci0+c3RhdHMucHJjMTUyMiArPSBFMTAwMF9SRUFEX1JFRygmYWRh
cHRlci0+aHcsIEUxMDAwX1BSQzE1MjIpOwoJYWRhcHRlci0+c3RhdHMuZ3ByYyArPSBFMTAwMF9S
RUFEX1JFRygmYWRhcHRlci0+aHcsIEUxMDAwX0dQUkMpOwoJYWRhcHRlci0+c3RhdHMuYnByYyAr
PSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIEUxMDAwX0JQUkMpOwoJYWRhcHRlci0+c3Rh
dHMubXByYyArPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIEUxMDAwX01QUkMpOwoJYWRh
cHRlci0+c3RhdHMuZ3B0YyArPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIEUxMDAwX0dQ
VEMpOwoKCS8qIEZvciB0aGUgNjQtYml0IGJ5dGUgY291bnRlcnMgdGhlIGxvdyBkd29yZCBtdXN0
IGJlIHJlYWQgZmlyc3QuICovCgkvKiBCb3RoIHJlZ2lzdGVycyBjbGVhciBvbiB0aGUgcmVhZCBv
ZiB0aGUgaGlnaCBkd29yZCAqLwoKCWFkYXB0ZXItPnN0YXRzLmdvcmMgKz0gRTEwMDBfUkVBRF9S
RUcoJmFkYXB0ZXItPmh3LCBFMTAwMF9HT1JDSCk7CglhZGFwdGVyLT5zdGF0cy5nb3RjICs9IEUx
MDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgRTEwMDBfR09UQ0gpOwoKCWFkYXB0ZXItPnN0YXRz
LnJuYmMgKz0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBFMTAwMF9STkJDKTsKCWFkYXB0
ZXItPnN0YXRzLnJ1YyArPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIEUxMDAwX1JVQyk7
CglhZGFwdGVyLT5zdGF0cy5yZmMgKz0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBFMTAw
MF9SRkMpOwoJYWRhcHRlci0+c3RhdHMucm9jICs9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5o
dywgRTEwMDBfUk9DKTsKCWFkYXB0ZXItPnN0YXRzLnJqYyArPSBFMTAwMF9SRUFEX1JFRygmYWRh
cHRlci0+aHcsIEUxMDAwX1JKQyk7CgoJYWRhcHRlci0+c3RhdHMudG9yICs9IEUxMDAwX1JFQURf
UkVHKCZhZGFwdGVyLT5odywgRTEwMDBfVE9SSCk7CglhZGFwdGVyLT5zdGF0cy50b3QgKz0gRTEw
MDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBFMTAwMF9UT1RIKTsKCglhZGFwdGVyLT5zdGF0cy50
cHIgKz0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBFMTAwMF9UUFIpOwoJYWRhcHRlci0+
c3RhdHMudHB0ICs9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgRTEwMDBfVFBUKTsKCWFk
YXB0ZXItPnN0YXRzLnB0YzY0ICs9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgRTEwMDBf
UFRDNjQpOwoJYWRhcHRlci0+c3RhdHMucHRjMTI3ICs9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVy
LT5odywgRTEwMDBfUFRDMTI3KTsKCWFkYXB0ZXItPnN0YXRzLnB0YzI1NSArPSBFMTAwMF9SRUFE
X1JFRygmYWRhcHRlci0+aHcsIEUxMDAwX1BUQzI1NSk7CglhZGFwdGVyLT5zdGF0cy5wdGM1MTEg
Kz0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBFMTAwMF9QVEM1MTEpOwoJYWRhcHRlci0+
c3RhdHMucHRjMTAyMyArPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIEUxMDAwX1BUQzEw
MjMpOwoJYWRhcHRlci0+c3RhdHMucHRjMTUyMiArPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+
aHcsIEUxMDAwX1BUQzE1MjIpOwoJYWRhcHRlci0+c3RhdHMubXB0YyArPSBFMTAwMF9SRUFEX1JF
RygmYWRhcHRlci0+aHcsIEUxMDAwX01QVEMpOwoJYWRhcHRlci0+c3RhdHMuYnB0YyArPSBFMTAw
MF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIEUxMDAwX0JQVEMpOwoKCWlmIChhZGFwdGVyLT5ody5t
YWMudHlwZSA+PSBlMTAwMF84MjU0MykgewoJCWFkYXB0ZXItPnN0YXRzLmFsZ25lcnJjICs9IAoJ
CUUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgRTEwMDBfQUxHTkVSUkMpOwoJCWFkYXB0ZXIt
PnN0YXRzLnJ4ZXJyYyArPSAKCQlFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIEUxMDAwX1JY
RVJSQyk7CgkJYWRhcHRlci0+c3RhdHMudG5jcnMgKz0gCgkJRTEwMDBfUkVBRF9SRUcoJmFkYXB0
ZXItPmh3LCBFMTAwMF9UTkNSUyk7CgkJYWRhcHRlci0+c3RhdHMuY2V4dGVyciArPSAKCQlFMTAw
MF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIEUxMDAwX0NFWFRFUlIpOwoJCWFkYXB0ZXItPnN0YXRz
LnRzY3RjICs9IAoJCUUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgRTEwMDBfVFNDVEMpOwoJ
CWFkYXB0ZXItPnN0YXRzLnRzY3RmYyArPSAKCQlFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcs
IEUxMDAwX1RTQ1RGQyk7Cgl9CglpZnAgPSBhZGFwdGVyLT5pZnA7CgoJaWZwLT5pZl9jb2xsaXNp
b25zID0gYWRhcHRlci0+c3RhdHMuY29sYzsKCgkvKiBSeCBFcnJvcnMgKi8KCWlmcC0+aWZfaWVy
cm9ycyA9IGFkYXB0ZXItPmRyb3BwZWRfcGt0cyArIGFkYXB0ZXItPnN0YXRzLnJ4ZXJyYyArCgkg
ICAgYWRhcHRlci0+c3RhdHMuY3JjZXJycyArIGFkYXB0ZXItPnN0YXRzLmFsZ25lcnJjICsKCSAg
ICBhZGFwdGVyLT5zdGF0cy5ydWMgKyBhZGFwdGVyLT5zdGF0cy5yb2MgKwoJICAgIGFkYXB0ZXIt
PnN0YXRzLm1wYyArIGFkYXB0ZXItPnN0YXRzLmNleHRlcnI7CgoJLyogVHggRXJyb3JzICovCglp
ZnAtPmlmX29lcnJvcnMgPSBhZGFwdGVyLT5zdGF0cy5lY29sICsKCSAgICBhZGFwdGVyLT5zdGF0
cy5sYXRlY29sICsgYWRhcHRlci0+d2F0Y2hkb2dfZXZlbnRzOwp9CgoKLyoKICogQWRkIHN5c2N0
bCB2YXJpYWJsZXMsIG9uZSBwZXIgc3RhdGlzdGljLCB0byB0aGUgc3lzdGVtLgogKi8Kc3RhdGlj
IHZvaWQKZW1fYWRkX2h3X3N0YXRzKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQp7CgoJZGV2aWNl
X3QgZGV2ID0gYWRhcHRlci0+ZGV2OwoKCXN0cnVjdCBzeXNjdGxfY3R4X2xpc3QgKmN0eCA9IGRl
dmljZV9nZXRfc3lzY3RsX2N0eChkZXYpOwoJc3RydWN0IHN5c2N0bF9vaWQgKnRyZWUgPSBkZXZp
Y2VfZ2V0X3N5c2N0bF90cmVlKGRldik7CglzdHJ1Y3Qgc3lzY3RsX29pZF9saXN0ICpjaGlsZCA9
IFNZU0NUTF9DSElMRFJFTih0cmVlKTsKCXN0cnVjdCBlMTAwMF9od19zdGF0cyAqc3RhdHMgPSAm
YWRhcHRlci0+c3RhdHM7CgoJc3RydWN0IHN5c2N0bF9vaWQgKnN0YXRfbm9kZSwgKmludF9ub2Rl
LCAqaG9zdF9ub2RlOwoJc3RydWN0IHN5c2N0bF9vaWRfbGlzdCAqc3RhdF9saXN0LCAqaW50X2xp
c3QsICpob3N0X2xpc3Q7CgoJLyogRHJpdmVyIFN0YXRpc3RpY3MgKi8KCVNZU0NUTF9BRERfVUlO
VChjdHgsIGNoaWxkLCBPSURfQVVUTywgImxpbmtfaXJxIiwgCgkJCUNUTEZMQUdfUkQsICZhZGFw
dGVyLT5saW5rX2lycSwgMCwKCQkJIkxpbmsgTVNJWCBJUlEgSGFuZGxlZCIpOwoJU1lTQ1RMX0FE
RF9VTE9ORyhjdHgsIGNoaWxkLCBPSURfQVVUTywgIm1idWZfYWxsb2NfZmFpbCIsIAoJCQkgQ1RM
RkxBR19SRCwgJmFkYXB0ZXItPm1idWZfYWxsb2NfZmFpbGVkLAoJCQkgIlN0ZCBtYnVmIGZhaWxl
ZCIpOwoJU1lTQ1RMX0FERF9VTE9ORyhjdHgsIGNoaWxkLCBPSURfQVVUTywgImNsdXN0ZXJfYWxs
b2NfZmFpbCIsIAoJCQkgQ1RMRkxBR19SRCwgJmFkYXB0ZXItPm1idWZfY2x1c3Rlcl9mYWlsZWQs
CgkJCSAiU3RkIG1idWYgY2x1c3RlciBmYWlsZWQiKTsKCVNZU0NUTF9BRERfVUxPTkcoY3R4LCBj
aGlsZCwgT0lEX0FVVE8sICJkcm9wcGVkIiwgCgkJCUNUTEZMQUdfUkQsICZhZGFwdGVyLT5kcm9w
cGVkX3BrdHMsCgkJCSJEcml2ZXIgZHJvcHBlZCBwYWNrZXRzIik7CglTWVNDVExfQUREX1VMT05H
KGN0eCwgY2hpbGQsIE9JRF9BVVRPLCAidHhfZG1hX2ZhaWwiLCAKCQkJQ1RMRkxBR19SRCwgJmFk
YXB0ZXItPm5vX3R4X2RtYV9zZXR1cCwKCQkJIkRyaXZlciB0eCBkbWEgZmFpbHVyZSBpbiB4bWl0
Iik7CgoJU1lTQ1RMX0FERF9VSU5UKGN0eCwgY2hpbGQsIE9JRF9BVVRPLCAiZmNfaGlnaF93YXRl
ciIsCgkJCUNUTEZMQUdfUkQsICZhZGFwdGVyLT5ody5mYy5oaWdoX3dhdGVyLCAwLAoJCQkiRmxv
dyBDb250cm9sIEhpZ2ggV2F0ZXJtYXJrIik7CglTWVNDVExfQUREX1VJTlQoY3R4LCBjaGlsZCwg
T0lEX0FVVE8sICJmY19sb3dfd2F0ZXIiLCAKCQkJQ1RMRkxBR19SRCwgJmFkYXB0ZXItPmh3LmZj
Lmxvd193YXRlciwgMCwKCQkJIkZsb3cgQ29udHJvbCBMb3cgV2F0ZXJtYXJrIik7CgoJLyogTUFD
IHN0YXRzIGdldCB0aGUgb3duIHN1YiBub2RlICovCgoJc3RhdF9ub2RlID0gU1lTQ1RMX0FERF9O
T0RFKGN0eCwgY2hpbGQsIE9JRF9BVVRPLCAibWFjX3N0YXRzIiwgCgkJCQkgICAgQ1RMRkxBR19S
RCwgTlVMTCwgIlN0YXRpc3RpY3MiKTsKCXN0YXRfbGlzdCA9IFNZU0NUTF9DSElMRFJFTihzdGF0
X25vZGUpOwoKCVNZU0NUTF9BRERfUVVBRChjdHgsIHN0YXRfbGlzdCwgT0lEX0FVVE8sICJleGNl
c3NfY29sbCIsIAoJCQlDVExGTEFHX1JELCAmc3RhdHMtPmVjb2wsCgkJCSJFeGNlc3NpdmUgY29s
bGlzaW9ucyIpOwoJU1lTQ1RMX0FERF9RVUFEKGN0eCwgc3RhdF9saXN0LCBPSURfQVVUTywgInN5
bWJvbF9lcnJvcnMiLAoJCQlDVExGTEFHX1JELCAmYWRhcHRlci0+c3RhdHMuc3ltZXJycywKCQkJ
IlN5bWJvbCBFcnJvcnMiKTsKCVNZU0NUTF9BRERfUVVBRChjdHgsIHN0YXRfbGlzdCwgT0lEX0FV
VE8sICJzZXF1ZW5jZV9lcnJvcnMiLAoJCQlDVExGTEFHX1JELCAmYWRhcHRlci0+c3RhdHMuc2Vj
LAoJCQkiU2VxdWVuY2UgRXJyb3JzIik7CglTWVNDVExfQUREX1FVQUQoY3R4LCBzdGF0X2xpc3Qs
IE9JRF9BVVRPLCAiZGVmZXJfY291bnQiLAoJCQlDVExGTEFHX1JELCAmYWRhcHRlci0+c3RhdHMu
ZGMsCgkJCSJEZWZlciBDb3VudCIpOwoJU1lTQ1RMX0FERF9RVUFEKGN0eCwgc3RhdF9saXN0LCBP
SURfQVVUTywgIm1pc3NlZF9wYWNrZXRzIiwKCQkJQ1RMRkxBR19SRCwgJmFkYXB0ZXItPnN0YXRz
Lm1wYywKCQkJIk1pc3NlZCBQYWNrZXRzIik7CglTWVNDVExfQUREX1FVQUQoY3R4LCBzdGF0X2xp
c3QsIE9JRF9BVVRPLCAicmVjdl9ub19idWZmIiwKCQkJQ1RMRkxBR19SRCwgJmFkYXB0ZXItPnN0
YXRzLnJuYmMsCgkJCSJSZWNlaXZlIE5vIEJ1ZmZlcnMiKTsKCS8qIFJMRUMgaXMgaW5hY2N1cmF0
ZSBvbiBzb21lIGhhcmR3YXJlLCBjYWxjdWxhdGUgb3VyIG93bi4gKi8KLyogCVNZU0NUTF9BRERf
UVVBRChjdHgsIHN0YXRfbGlzdCwgT0lEX0FVVE8sICJyZWN2X2xlbl9lcnJzIiwgKi8KLyogCQkJ
Q1RMRkxBR19SRCwgYWRhcHRlci0+c3RhdHMucm9jICsgYWRhcHRlci0+c3RhdHMucnVjLCAqLwov
KiAJCQkiUmVjZWl2ZSBMZW5ndGggRXJyb3JzIik7ICovCgoJU1lTQ1RMX0FERF9RVUFEKGN0eCwg
c3RhdF9saXN0LCBPSURfQVVUTywgInJlY3ZfZXJycyIsCgkJCUNUTEZMQUdfUkQsICZhZGFwdGVy
LT5zdGF0cy5yeGVycmMsCgkJCSJSZWNlaXZlIEVycm9ycyIpOwoJU1lTQ1RMX0FERF9RVUFEKGN0
eCwgc3RhdF9saXN0LCBPSURfQVVUTywgImNyY19lcnJzIiwKCQkJQ1RMRkxBR19SRCwgJmFkYXB0
ZXItPnN0YXRzLmNyY2VycnMsCgkJCSJDUkMgZXJyb3JzIik7CglTWVNDVExfQUREX1FVQUQoY3R4
LCBzdGF0X2xpc3QsIE9JRF9BVVRPLCAiYWxpZ25tZW50X2VycnMiLAoJCQlDVExGTEFHX1JELCAm
YWRhcHRlci0+c3RhdHMuYWxnbmVycmMsCgkJCSJBbGlnbm1lbnQgRXJyb3JzIik7CgkvKiBPbiA4
MjU3NSB0aGVzZSBhcmUgY29sbGlzaW9uIGNvdW50cyAqLwoJU1lTQ1RMX0FERF9RVUFEKGN0eCwg
c3RhdF9saXN0LCBPSURfQVVUTywgImNvbGxfZXh0X2VycnMiLAoJCQlDVExGTEFHX1JELCAmYWRh
cHRlci0+c3RhdHMuY2V4dGVyciwKCQkJIkNvbGxpc2lvbi9DYXJyaWVyIGV4dGVuc2lvbiBlcnJv
cnMiKTsKCVNZU0NUTF9BRERfUVVBRChjdHgsIHN0YXRfbGlzdCwgT0lEX0FVVE8sICJyeF9vdmVy
cnVucyIsCgkJCUNUTEZMQUdfUkQsICZhZGFwdGVyLT5yeF9vdmVycnVucywKCQkJIlJYIG92ZXJy
dW5zIik7CglTWVNDVExfQUREX1FVQUQoY3R4LCBzdGF0X2xpc3QsIE9JRF9BVVRPLCAid2F0Y2hk
b2dfdGltZW91dHMiLAoJCQlDVExGTEFHX1JELCAmYWRhcHRlci0+d2F0Y2hkb2dfZXZlbnRzLAoJ
CQkiV2F0Y2hkb2cgdGltZW91dHMiKTsKCVNZU0NUTF9BRERfUVVBRChjdHgsIHN0YXRfbGlzdCwg
T0lEX0FVVE8sICJ4b25fcmVjdmQiLAoJCQlDVExGTEFHX1JELCAmYWRhcHRlci0+c3RhdHMueG9u
cnhjLAoJCQkiWE9OIFJlY2VpdmVkIik7CglTWVNDVExfQUREX1FVQUQoY3R4LCBzdGF0X2xpc3Qs
IE9JRF9BVVRPLCAieG9uX3R4ZCIsCgkJCUNUTEZMQUdfUkQsICZhZGFwdGVyLT5zdGF0cy54b250
eGMsCgkJCSJYT04gVHJhbnNtaXR0ZWQiKTsKCVNZU0NUTF9BRERfUVVBRChjdHgsIHN0YXRfbGlz
dCwgT0lEX0FVVE8sICJ4b2ZmX3JlY3ZkIiwKCQkJQ1RMRkxBR19SRCwgJmFkYXB0ZXItPnN0YXRz
LnhvZmZyeGMsCgkJCSJYT0ZGIFJlY2VpdmVkIik7CglTWVNDVExfQUREX1FVQUQoY3R4LCBzdGF0
X2xpc3QsIE9JRF9BVVRPLCAieG9mZl90eGQiLAoJCQlDVExGTEFHX1JELCAmYWRhcHRlci0+c3Rh
dHMueG9mZnR4YywKCQkJIlhPRkYgVHJhbnNtaXR0ZWQiKTsKCgkvKiBQYWNrZXQgUmVjZXB0aW9u
IFN0YXRzICovCglTWVNDVExfQUREX1FVQUQoY3R4LCBzdGF0X2xpc3QsIE9JRF9BVVRPLCAidG90
YWxfcGt0c19yZWN2ZCIsCgkJCUNUTEZMQUdfUkQsICZhZGFwdGVyLT5zdGF0cy50cHIsCgkJCSJU
b3RhbCBQYWNrZXRzIFJlY2VpdmVkICIpOwoJU1lTQ1RMX0FERF9RVUFEKGN0eCwgc3RhdF9saXN0
LCBPSURfQVVUTywgImdvb2RfcGt0c19yZWN2ZCIsCgkJCUNUTEZMQUdfUkQsICZhZGFwdGVyLT5z
dGF0cy5ncHJjLAoJCQkiR29vZCBQYWNrZXRzIFJlY2VpdmVkIik7CglTWVNDVExfQUREX1FVQUQo
Y3R4LCBzdGF0X2xpc3QsIE9JRF9BVVRPLCAiYmNhc3RfcGt0c19yZWN2ZCIsCgkJCUNUTEZMQUdf
UkQsICZhZGFwdGVyLT5zdGF0cy5icHJjLAoJCQkiQnJvYWRjYXN0IFBhY2tldHMgUmVjZWl2ZWQi
KTsKCVNZU0NUTF9BRERfUVVBRChjdHgsIHN0YXRfbGlzdCwgT0lEX0FVVE8sICJtY2FzdF9wa3Rz
X3JlY3ZkIiwKCQkJQ1RMRkxBR19SRCwgJmFkYXB0ZXItPnN0YXRzLm1wcmMsCgkJCSJNdWx0aWNh
c3QgUGFja2V0cyBSZWNlaXZlZCIpOwoJU1lTQ1RMX0FERF9RVUFEKGN0eCwgc3RhdF9saXN0LCBP
SURfQVVUTywgInJ4X2ZyYW1lc182NCIsCgkJCUNUTEZMQUdfUkQsICZhZGFwdGVyLT5zdGF0cy5w
cmM2NCwKCQkJIjY0IGJ5dGUgZnJhbWVzIHJlY2VpdmVkICIpOwoJU1lTQ1RMX0FERF9RVUFEKGN0
eCwgc3RhdF9saXN0LCBPSURfQVVUTywgInJ4X2ZyYW1lc182NV8xMjciLAoJCQlDVExGTEFHX1JE
LCAmYWRhcHRlci0+c3RhdHMucHJjMTI3LAoJCQkiNjUtMTI3IGJ5dGUgZnJhbWVzIHJlY2VpdmVk
Iik7CglTWVNDVExfQUREX1FVQUQoY3R4LCBzdGF0X2xpc3QsIE9JRF9BVVRPLCAicnhfZnJhbWVz
XzEyOF8yNTUiLAoJCQlDVExGTEFHX1JELCAmYWRhcHRlci0+c3RhdHMucHJjMjU1LAoJCQkiMTI4
LTI1NSBieXRlIGZyYW1lcyByZWNlaXZlZCIpOwoJU1lTQ1RMX0FERF9RVUFEKGN0eCwgc3RhdF9s
aXN0LCBPSURfQVVUTywgInJ4X2ZyYW1lc18yNTZfNTExIiwKCQkJQ1RMRkxBR19SRCwgJmFkYXB0
ZXItPnN0YXRzLnByYzUxMSwKCQkJIjI1Ni01MTEgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQiKTsKCVNZ
U0NUTF9BRERfUVVBRChjdHgsIHN0YXRfbGlzdCwgT0lEX0FVVE8sICJyeF9mcmFtZXNfNTEyXzEw
MjMiLAoJCQlDVExGTEFHX1JELCAmYWRhcHRlci0+c3RhdHMucHJjMTAyMywKCQkJIjUxMi0xMDIz
IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIik7CglTWVNDVExfQUREX1FVQUQoY3R4LCBzdGF0X2xpc3Qs
IE9JRF9BVVRPLCAicnhfZnJhbWVzXzEwMjRfMTUyMiIsCgkJCUNUTEZMQUdfUkQsICZhZGFwdGVy
LT5zdGF0cy5wcmMxNTIyLAoJCQkiMTAyMy0xNTIyIGJ5dGUgZnJhbWVzIHJlY2VpdmVkIik7CiAJ
U1lTQ1RMX0FERF9RVUFEKGN0eCwgc3RhdF9saXN0LCBPSURfQVVUTywgImdvb2Rfb2N0ZXRzX3Jl
Y3ZkIiwgCiAJCQlDVExGTEFHX1JELCAmYWRhcHRlci0+c3RhdHMuZ29yYywgCiAJCQkiR29vZCBP
Y3RldHMgUmVjZWl2ZWQiKTsgCgoJLyogUGFja2V0IFRyYW5zbWlzc2lvbiBTdGF0cyAqLwogCVNZ
U0NUTF9BRERfUVVBRChjdHgsIHN0YXRfbGlzdCwgT0lEX0FVVE8sICJnb29kX29jdGVzdF90eGQi
LCAKIAkJCUNUTEZMQUdfUkQsICZhZGFwdGVyLT5zdGF0cy5nb3RjLCAKIAkJCSJHb29kIE9jdGVz
dCBUcmFuc21pdHRlZCIpOyAKCVNZU0NUTF9BRERfUVVBRChjdHgsIHN0YXRfbGlzdCwgT0lEX0FV
VE8sICJ0b3RhbF9wa3RzX3R4ZCIsCgkJCUNUTEZMQUdfUkQsICZhZGFwdGVyLT5zdGF0cy50cHQs
CgkJCSJUb3RhbCBQYWNrZXRzIFRyYW5zbWl0dGVkIik7CglTWVNDVExfQUREX1FVQUQoY3R4LCBz
dGF0X2xpc3QsIE9JRF9BVVRPLCAiZ29vZF9wa3RzX3R4ZCIsCgkJCUNUTEZMQUdfUkQsICZhZGFw
dGVyLT5zdGF0cy5ncHRjLAoJCQkiR29vZCBQYWNrZXRzIFRyYW5zbWl0dGVkIik7CglTWVNDVExf
QUREX1FVQUQoY3R4LCBzdGF0X2xpc3QsIE9JRF9BVVRPLCAiYmNhc3RfcGt0c190eGQiLAoJCQlD
VExGTEFHX1JELCAmYWRhcHRlci0+c3RhdHMuYnB0YywKCQkJIkJyb2FkY2FzdCBQYWNrZXRzIFRy
YW5zbWl0dGVkIik7CglTWVNDVExfQUREX1FVQUQoY3R4LCBzdGF0X2xpc3QsIE9JRF9BVVRPLCAi
bWNhc3RfcGt0c190eGQiLAoJCQlDVExGTEFHX1JELCAmYWRhcHRlci0+c3RhdHMubXB0YywKCQkJ
Ik11bHRpY2FzdCBQYWNrZXRzIFRyYW5zbWl0dGVkIik7CglTWVNDVExfQUREX1FVQUQoY3R4LCBz
dGF0X2xpc3QsIE9JRF9BVVRPLCAidHhfZnJhbWVzXzY0IiwKCQkJQ1RMRkxBR19SRCwgJmFkYXB0
ZXItPnN0YXRzLnB0YzY0LAoJCQkiNjQgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgIik7CglTWVND
VExfQUREX1FVQUQoY3R4LCBzdGF0X2xpc3QsIE9JRF9BVVRPLCAidHhfZnJhbWVzXzY1XzEyNyIs
CgkJCUNUTEZMQUdfUkQsICZhZGFwdGVyLT5zdGF0cy5wdGMxMjcsCgkJCSI2NS0xMjcgYnl0ZSBm
cmFtZXMgdHJhbnNtaXR0ZWQiKTsKCVNZU0NUTF9BRERfUVVBRChjdHgsIHN0YXRfbGlzdCwgT0lE
X0FVVE8sICJ0eF9mcmFtZXNfMTI4XzI1NSIsCgkJCUNUTEZMQUdfUkQsICZhZGFwdGVyLT5zdGF0
cy5wdGMyNTUsCgkJCSIxMjgtMjU1IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIik7CglTWVNDVExf
QUREX1FVQUQoY3R4LCBzdGF0X2xpc3QsIE9JRF9BVVRPLCAidHhfZnJhbWVzXzI1Nl81MTEiLAoJ
CQlDVExGTEFHX1JELCAmYWRhcHRlci0+c3RhdHMucHRjNTExLAoJCQkiMjU2LTUxMSBieXRlIGZy
YW1lcyB0cmFuc21pdHRlZCIpOwoJU1lTQ1RMX0FERF9RVUFEKGN0eCwgc3RhdF9saXN0LCBPSURf
QVVUTywgInR4X2ZyYW1lc181MTJfMTAyMyIsCgkJCUNUTEZMQUdfUkQsICZhZGFwdGVyLT5zdGF0
cy5wdGMxMDIzLAoJCQkiNTEyLTEwMjMgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQiKTsKCVNZU0NU
TF9BRERfUVVBRChjdHgsIHN0YXRfbGlzdCwgT0lEX0FVVE8sICJ0eF9mcmFtZXNfMTAyNF8xNTIy
IiwKCQkJQ1RMRkxBR19SRCwgJmFkYXB0ZXItPnN0YXRzLnB0YzE1MjIsCgkJCSIxMDI0LTE1MjIg
Ynl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQiKTsKCVNZU0NUTF9BRERfUVVBRChjdHgsIHN0YXRfbGlz
dCwgT0lEX0FVVE8sICJ0c29fdHhkIiwKCQkJQ1RMRkxBR19SRCwgJmFkYXB0ZXItPnN0YXRzLnRz
Y3RjLAoJCQkiVFNPIENvbnRleHRzIFRyYW5zbWl0dGVkIik7CglTWVNDVExfQUREX1FVQUQoY3R4
LCBzdGF0X2xpc3QsIE9JRF9BVVRPLCAidHNvX2N0eF9mYWlsIiwKCQkJQ1RMRkxBR19SRCwgJmFk
YXB0ZXItPnN0YXRzLnRzY3RmYywKCQkJIlRTTyBDb250ZXh0cyBGYWlsZWQiKTsKCgoJLyogSW50
ZXJydXB0IFN0YXRzICovCgoJaW50X25vZGUgPSBTWVNDVExfQUREX05PREUoY3R4LCBjaGlsZCwg
T0lEX0FVVE8sICJpbnRlcnJ1cHRzIiwgCgkJCQkgICAgQ1RMRkxBR19SRCwgTlVMTCwgIkludGVy
cnVwdCBTdGF0aXN0aWNzIik7CglpbnRfbGlzdCA9IFNZU0NUTF9DSElMRFJFTihpbnRfbm9kZSk7
CgoJU1lTQ1RMX0FERF9RVUFEKGN0eCwgaW50X2xpc3QsIE9JRF9BVVRPLCAiYXNzZXJ0cyIsCgkJ
CUNUTEZMQUdfUkQsICZhZGFwdGVyLT5zdGF0cy5pYWMsCgkJCSJJbnRlcnJ1cHQgQXNzZXJ0aW9u
IENvdW50Iik7CgoJU1lTQ1RMX0FERF9RVUFEKGN0eCwgaW50X2xpc3QsIE9JRF9BVVRPLCAicnhf
cGt0X3RpbWVyIiwKCQkJQ1RMRkxBR19SRCwgJmFkYXB0ZXItPnN0YXRzLmljcnhwdGMsCgkJCSJJ
bnRlcnJ1cHQgQ2F1c2UgUnggUGt0IFRpbWVyIEV4cGlyZSBDb3VudCIpOwoKCVNZU0NUTF9BRERf
UVVBRChjdHgsIGludF9saXN0LCBPSURfQVVUTywgInJ4X2Fic190aW1lciIsCgkJCUNUTEZMQUdf
UkQsICZhZGFwdGVyLT5zdGF0cy5pY3J4YXRjLAoJCQkiSW50ZXJydXB0IENhdXNlIFJ4IEFicyBU
aW1lciBFeHBpcmUgQ291bnQiKTsKCglTWVNDVExfQUREX1FVQUQoY3R4LCBpbnRfbGlzdCwgT0lE
X0FVVE8sICJ0eF9wa3RfdGltZXIiLAoJCQlDVExGTEFHX1JELCAmYWRhcHRlci0+c3RhdHMuaWN0
eHB0YywKCQkJIkludGVycnVwdCBDYXVzZSBUeCBQa3QgVGltZXIgRXhwaXJlIENvdW50Iik7CgoJ
U1lTQ1RMX0FERF9RVUFEKGN0eCwgaW50X2xpc3QsIE9JRF9BVVRPLCAidHhfYWJzX3RpbWVyIiwK
CQkJQ1RMRkxBR19SRCwgJmFkYXB0ZXItPnN0YXRzLmljdHhhdGMsCgkJCSJJbnRlcnJ1cHQgQ2F1
c2UgVHggQWJzIFRpbWVyIEV4cGlyZSBDb3VudCIpOwoKCVNZU0NUTF9BRERfUVVBRChjdHgsIGlu
dF9saXN0LCBPSURfQVVUTywgInR4X3F1ZXVlX2VtcHR5IiwKCQkJQ1RMRkxBR19SRCwgJmFkYXB0
ZXItPnN0YXRzLmljdHhxZWMsCgkJCSJJbnRlcnJ1cHQgQ2F1c2UgVHggUXVldWUgRW1wdHkgQ291
bnQiKTsKCglTWVNDVExfQUREX1FVQUQoY3R4LCBpbnRfbGlzdCwgT0lEX0FVVE8sICJ0eF9xdWV1
ZV9taW5fdGhyZXNoIiwKCQkJQ1RMRkxBR19SRCwgJmFkYXB0ZXItPnN0YXRzLmljdHhxbXRjLAoJ
CQkiSW50ZXJydXB0IENhdXNlIFR4IFF1ZXVlIE1pbiBUaHJlc2ggQ291bnQiKTsKCglTWVNDVExf
QUREX1FVQUQoY3R4LCBpbnRfbGlzdCwgT0lEX0FVVE8sICJyeF9kZXNjX21pbl90aHJlc2giLAoJ
CQlDVExGTEFHX1JELCAmYWRhcHRlci0+c3RhdHMuaWNyeGRtdGMsCgkJCSJJbnRlcnJ1cHQgQ2F1
c2UgUnggRGVzYyBNaW4gVGhyZXNoIENvdW50Iik7CgoJU1lTQ1RMX0FERF9RVUFEKGN0eCwgaW50
X2xpc3QsIE9JRF9BVVRPLCAicnhfb3ZlcnJ1biIsCgkJCUNUTEZMQUdfUkQsICZhZGFwdGVyLT5z
dGF0cy5pY3J4b2MsCgkJCSJJbnRlcnJ1cHQgQ2F1c2UgUmVjZWl2ZXIgT3ZlcnJ1biBDb3VudCIp
OwoKCS8qIEhvc3QgdG8gQ2FyZCBTdGF0cyAqLwoKCWhvc3Rfbm9kZSA9IFNZU0NUTF9BRERfTk9E
RShjdHgsIGNoaWxkLCBPSURfQVVUTywgImhvc3QiLCAKCQkJCSAgICBDVExGTEFHX1JELCBOVUxM
LCAKCQkJCSAgICAiSG9zdCB0byBDYXJkIFN0YXRpc3RpY3MiKTsKCglob3N0X2xpc3QgPSBTWVND
VExfQ0hJTERSRU4oaG9zdF9ub2RlKTsKCglTWVNDVExfQUREX1FVQUQoY3R4LCBob3N0X2xpc3Qs
IE9JRF9BVVRPLCAiYnJlYWtlcl90eF9wa3QiLAoJCQlDVExGTEFHX1JELCAmYWRhcHRlci0+c3Rh
dHMuY2J0bXBjLAoJCQkiQ2lyY3VpdCBCcmVha2VyIFR4IFBhY2tldCBDb3VudCIpOwoKCVNZU0NU
TF9BRERfUVVBRChjdHgsIGhvc3RfbGlzdCwgT0lEX0FVVE8sICJob3N0X3R4X3BrdF9kaXNjYXJk
IiwKCQkJQ1RMRkxBR19SRCwgJmFkYXB0ZXItPnN0YXRzLmh0ZHBtYywKCQkJIkhvc3QgVHJhbnNt
aXQgRGlzY2FyZGVkIFBhY2tldHMiKTsKCglTWVNDVExfQUREX1FVQUQoY3R4LCBob3N0X2xpc3Qs
IE9JRF9BVVRPLCAicnhfcGt0IiwKCQkJQ1RMRkxBR19SRCwgJmFkYXB0ZXItPnN0YXRzLnJwdGhj
LAoJCQkiUnggUGFja2V0cyBUbyBIb3N0Iik7CgoJU1lTQ1RMX0FERF9RVUFEKGN0eCwgaG9zdF9s
aXN0LCBPSURfQVVUTywgImJyZWFrZXJfcnhfcGt0cyIsCgkJCUNUTEZMQUdfUkQsICZhZGFwdGVy
LT5zdGF0cy5jYnJtcGMsCgkJCSJDaXJjdWl0IEJyZWFrZXIgUnggUGFja2V0IENvdW50Iik7CgoJ
U1lTQ1RMX0FERF9RVUFEKGN0eCwgaG9zdF9saXN0LCBPSURfQVVUTywgImJyZWFrZXJfcnhfcGt0
X2Ryb3AiLAoJCQlDVExGTEFHX1JELCAmYWRhcHRlci0+c3RhdHMuY2JyZHBjLAoJCQkiQ2lyY3Vp
dCBCcmVha2VyIFJ4IERyb3BwZWQgQ291bnQiKTsKCglTWVNDVExfQUREX1FVQUQoY3R4LCBob3N0
X2xpc3QsIE9JRF9BVVRPLCAidHhfZ29vZF9wa3QiLAoJCQlDVExGTEFHX1JELCAmYWRhcHRlci0+
c3RhdHMuaGdwdGMsCgkJCSJIb3N0IEdvb2QgUGFja2V0cyBUeCBDb3VudCIpOwoKCVNZU0NUTF9B
RERfUVVBRChjdHgsIGhvc3RfbGlzdCwgT0lEX0FVVE8sICJicmVha2VyX3R4X3BrdF9kcm9wIiwK
CQkJQ1RMRkxBR19SRCwgJmFkYXB0ZXItPnN0YXRzLmh0Y2JkcGMsCgkJCSJIb3N0IFR4IENpcmN1
aXQgQnJlYWtlciBEcm9wcGVkIENvdW50Iik7CgoJU1lTQ1RMX0FERF9RVUFEKGN0eCwgaG9zdF9s
aXN0LCBPSURfQVVUTywgInJ4X2dvb2RfYnl0ZXMiLAoJCQlDVExGTEFHX1JELCAmYWRhcHRlci0+
c3RhdHMuaGdvcmMsCgkJCSJIb3N0IEdvb2QgT2N0ZXRzIFJlY2VpdmVkIENvdW50Iik7CgoJU1lT
Q1RMX0FERF9RVUFEKGN0eCwgaG9zdF9saXN0LCBPSURfQVVUTywgInR4X2dvb2RfYnl0ZXMiLAoJ
CQlDVExGTEFHX1JELCAmYWRhcHRlci0+c3RhdHMuaGdvdGMsCgkJCSJIb3N0IEdvb2QgT2N0ZXRz
IFRyYW5zbWl0IENvdW50Iik7CgoJU1lTQ1RMX0FERF9RVUFEKGN0eCwgaG9zdF9saXN0LCBPSURf
QVVUTywgImxlbmd0aF9lcnJvcnMiLAoJCQlDVExGTEFHX1JELCAmYWRhcHRlci0+c3RhdHMubGVu
ZXJycywKCQkJIkxlbmd0aCBFcnJvcnMiKTsKCglTWVNDVExfQUREX1FVQUQoY3R4LCBob3N0X2xp
c3QsIE9JRF9BVVRPLCAic2VyZGVzX3Zpb2xhdGlvbl9wa3QiLAoJCQlDVExGTEFHX1JELCAmYWRh
cHRlci0+c3RhdHMuc2N2cGMsCgkJCSJTZXJEZXMvU0dNSUkgQ29kZSBWaW9sYXRpb24gUGt0IENv
dW50Iik7CgoJU1lTQ1RMX0FERF9RVUFEKGN0eCwgaG9zdF9saXN0LCBPSURfQVVUTywgImhlYWRl
cl9yZWRpcl9taXNzZWQiLAoJCQlDVExGTEFHX1JELCAmYWRhcHRlci0+c3RhdHMuaHJtcGMsCgkJ
CSJIZWFkZXIgUmVkaXJlY3Rpb24gTWlzc2VkIFBhY2tldCBDb3VudCIpOwoKCgp9CgovKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKgogKgogKiAgVGhpcyByb3V0aW5lIHByb3ZpZGVzIGEgd2F5IHRvIGR1bXAgb3V0IHRo
ZSBhZGFwdGVyIGVlcHJvbSwKICogIG9mdGVuIGEgdXNlZnVsIGRlYnVnL3NlcnZpY2UgdG9vbC4g
VGhpcyBvbmx5IGR1bXBzIHRoZSBmaXJzdAogKiAgMzIgd29yZHMsIHN0dWZmIHRoYXQgbWF0dGVy
cyBpcyBpbiB0aGF0IGV4dGVudC4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgaW50CmVtX3N5
c2N0bF9udm1faW5mbyhTWVNDVExfSEFORExFUl9BUkdTKQp7CglzdHJ1Y3QgYWRhcHRlciAqYWRh
cHRlcjsKCWludCBlcnJvcjsKCWludCByZXN1bHQ7CgoJcmVzdWx0ID0gLTE7CgllcnJvciA9IHN5
c2N0bF9oYW5kbGVfaW50KG9pZHAsICZyZXN1bHQsIDAsIHJlcSk7CgoJaWYgKGVycm9yIHx8ICFy
ZXEtPm5ld3B0cikKCQlyZXR1cm4gKGVycm9yKTsKCgkvKgoJICogVGhpcyB2YWx1ZSB3aWxsIGNh
dXNlIGEgaGV4IGR1bXAgb2YgdGhlCgkgKiBmaXJzdCAzMiAxNi1iaXQgd29yZHMgb2YgdGhlIEVF
UFJPTSB0bwoJICogdGhlIHNjcmVlbi4KCSAqLwoJaWYgKHJlc3VsdCA9PSAxKSB7CgkJYWRhcHRl
ciA9IChzdHJ1Y3QgYWRhcHRlciAqKWFyZzE7CgkJZW1fcHJpbnRfbnZtX2luZm8oYWRhcHRlcik7
CiAgICAgICAgfQoKCXJldHVybiAoZXJyb3IpOwp9CgpzdGF0aWMgdm9pZAplbV9wcmludF9udm1f
aW5mbyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKewoJdTE2CWVlcHJvbV9kYXRhOwoJaW50CWks
IGosIHJvdyA9IDA7CgoJLyogSXRzIGEgYml0IGNydWRlLCBidXQgaXQgZ2V0cyB0aGUgam9iIGRv
bmUgKi8KCXByaW50ZigiXG5JbnRlcmZhY2UgRUVQUk9NIER1bXA6XG4iKTsKCXByaW50ZigiT2Zm
c2V0XG4weDAwMDAgICIpOwoJZm9yIChpID0gMCwgaiA9IDA7IGkgPCAzMjsgaSsrLCBqKyspIHsK
CQlpZiAoaiA9PSA4KSB7IC8qIE1ha2UgdGhlIG9mZnNldCBibG9jayAqLwoJCQlqID0gMDsgKyty
b3c7CgkJCXByaW50ZigiXG4weDAwJXgwICAiLHJvdyk7CgkJfQoJCWUxMDAwX3JlYWRfbnZtKCZh
ZGFwdGVyLT5odywgaSwgMSwgJmVlcHJvbV9kYXRhKTsKCQlwcmludGYoIiUwNHggIiwgZWVwcm9t
X2RhdGEpOwoJfQoJcHJpbnRmKCJcbiIpOwp9CgpzdGF0aWMgaW50CmVtX3N5c2N0bF9pbnRfZGVs
YXkoU1lTQ1RMX0hBTkRMRVJfQVJHUykKewoJc3RydWN0IGVtX2ludF9kZWxheV9pbmZvICppbmZv
OwoJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXI7Cgl1MzIgcmVndmFsOwoJaW50IGVycm9yLCB1c2Vj
cywgdGlja3M7CgoJaW5mbyA9IChzdHJ1Y3QgZW1faW50X2RlbGF5X2luZm8gKilhcmcxOwoJdXNl
Y3MgPSBpbmZvLT52YWx1ZTsKCWVycm9yID0gc3lzY3RsX2hhbmRsZV9pbnQob2lkcCwgJnVzZWNz
LCAwLCByZXEpOwoJaWYgKGVycm9yICE9IDAgfHwgcmVxLT5uZXdwdHIgPT0gTlVMTCkKCQlyZXR1
cm4gKGVycm9yKTsKCWlmICh1c2VjcyA8IDAgfHwgdXNlY3MgPiBFTV9USUNLU19UT19VU0VDUyg2
NTUzNSkpCgkJcmV0dXJuIChFSU5WQUwpOwoJaW5mby0+dmFsdWUgPSB1c2VjczsKCXRpY2tzID0g
RU1fVVNFQ1NfVE9fVElDS1ModXNlY3MpOwoKCWFkYXB0ZXIgPSBpbmZvLT5hZGFwdGVyOwoJCglF
TV9DT1JFX0xPQ0soYWRhcHRlcik7CglyZWd2YWwgPSBFMTAwMF9SRUFEX09GRlNFVCgmYWRhcHRl
ci0+aHcsIGluZm8tPm9mZnNldCk7CglyZWd2YWwgPSAocmVndmFsICYgfjB4ZmZmZikgfCAodGlj
a3MgJiAweGZmZmYpOwoJLyogSGFuZGxlIGEgZmV3IHNwZWNpYWwgY2FzZXMuICovCglzd2l0Y2gg
KGluZm8tPm9mZnNldCkgewoJY2FzZSBFMTAwMF9SRFRSOgoJCWJyZWFrOwoJY2FzZSBFMTAwMF9U
SURWOgoJCWlmICh0aWNrcyA9PSAwKSB7CgkJCWFkYXB0ZXItPnR4ZF9jbWQgJj0gfkUxMDAwX1RY
RF9DTURfSURFOwoJCQkvKiBEb24ndCB3cml0ZSAwIGludG8gdGhlIFRJRFYgcmVnaXN0ZXIuICov
CgkJCXJlZ3ZhbCsrOwoJCX0gZWxzZQoJCQlhZGFwdGVyLT50eGRfY21kIHw9IEUxMDAwX1RYRF9D
TURfSURFOwoJCWJyZWFrOwoJfQoJRTEwMDBfV1JJVEVfT0ZGU0VUKCZhZGFwdGVyLT5odywgaW5m
by0+b2Zmc2V0LCByZWd2YWwpOwoJRU1fQ09SRV9VTkxPQ0soYWRhcHRlcik7CglyZXR1cm4gKDAp
Owp9CgpzdGF0aWMgdm9pZAplbV9hZGRfaW50X2RlbGF5X3N5c2N0bChzdHJ1Y3QgYWRhcHRlciAq
YWRhcHRlciwgY29uc3QgY2hhciAqbmFtZSwKCWNvbnN0IGNoYXIgKmRlc2NyaXB0aW9uLCBzdHJ1
Y3QgZW1faW50X2RlbGF5X2luZm8gKmluZm8sCglpbnQgb2Zmc2V0LCBpbnQgdmFsdWUpCnsKCWlu
Zm8tPmFkYXB0ZXIgPSBhZGFwdGVyOwoJaW5mby0+b2Zmc2V0ID0gb2Zmc2V0OwoJaW5mby0+dmFs
dWUgPSB2YWx1ZTsKCVNZU0NUTF9BRERfUFJPQyhkZXZpY2VfZ2V0X3N5c2N0bF9jdHgoYWRhcHRl
ci0+ZGV2KSwKCSAgICBTWVNDVExfQ0hJTERSRU4oZGV2aWNlX2dldF9zeXNjdGxfdHJlZShhZGFw
dGVyLT5kZXYpKSwKCSAgICBPSURfQVVUTywgbmFtZSwgQ1RMVFlQRV9JTlR8Q1RMRkxBR19SVywK
CSAgICBpbmZvLCAwLCBlbV9zeXNjdGxfaW50X2RlbGF5LCAiSSIsIGRlc2NyaXB0aW9uKTsKfQoK
c3RhdGljIHZvaWQKZW1fYWRkX3J4X3Byb2Nlc3NfbGltaXQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0
ZXIsIGNvbnN0IGNoYXIgKm5hbWUsCgljb25zdCBjaGFyICpkZXNjcmlwdGlvbiwgaW50ICpsaW1p
dCwgaW50IHZhbHVlKQp7CgkqbGltaXQgPSB2YWx1ZTsKCVNZU0NUTF9BRERfSU5UKGRldmljZV9n
ZXRfc3lzY3RsX2N0eChhZGFwdGVyLT5kZXYpLAoJICAgIFNZU0NUTF9DSElMRFJFTihkZXZpY2Vf
Z2V0X3N5c2N0bF90cmVlKGFkYXB0ZXItPmRldikpLAoJICAgIE9JRF9BVVRPLCBuYW1lLCBDVExU
WVBFX0lOVHxDVExGTEFHX1JXLCBsaW1pdCwgdmFsdWUsIGRlc2NyaXB0aW9uKTsKfQoKCg==

--_004_32AB5C9615CC494997D9ABB1DB12783C024CA4A7E3SJEXCH1adaran_--



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