Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 13 Aug 2013 20:21:58 +0800
From:      Chenchong Qin <qinchenchong@gmail.com>
To:        Adrian Chadd <adrian@freebsd.org>
Cc:        freebsd-wireless@freebsd.org
Subject:   Re: Chenchong's work on net80211_ratectl
Message-ID:  <CAFnsE3df=1WEuLZh5355v_K2eBgcuBbpoza74Y-5vvNupBz22A@mail.gmail.com>
In-Reply-To: <CAJ-Vmo=mzvS0UBC7fGx2t501%2Bfioi4DJcw8qobOpbYOUiraqGg@mail.gmail.com>
References:  <CAFnsE3dYdPf5yGTFH683Q1Zh0mc-g%2B_YtCTraNNt28z2vBoSKw@mail.gmail.com> <CAJ-Vmom4sY7jcNwWmJkrDwfWjsok2fk8UEwTi5A=egj1JyerLw@mail.gmail.com> <CAFnsE3cyg=msBfQqqKUMmLABSL=j24VoMBwbBjxQ6b7Dyy7Mqg@mail.gmail.com> <CAJ-Vmo=k8NddAYyAJCkx4eOaA_8XsSxg6uKrdddx%2BgmeT%2BX9KA@mail.gmail.com> <CAFnsE3eaOyRcO3LXSi3L=jbzpyMv5Nt_jRGKt_mmA0WV-EV5vA@mail.gmail.com> <CAJ-VmokdxLhK5x6kO=jJzk-dv61EDK-ZgmndOimoyWWf76HiZA@mail.gmail.com> <CAJ-VmonMjR5iVTMVN9532d%2BPqOXWNUoZvxPtQir5h=yGxU-XdQ@mail.gmail.com> <CAFnsE3d9nG-X2b=z1srKfTtpxC3w5L%2B6Hg3TbOnAQrJN%2Bt19GA@mail.gmail.com> <CAJ-VmokF6hPtg9FoEdeJXLLaZRNhzd=nr_o6nHE%2BjYiQKTg3zQ@mail.gmail.com> <CAFnsE3eMwX-GiRzJt8jk4r9mxwSAQkcrDwk%2BnWVG7q6dabeA3A@mail.gmail.com> <CAJ-Vmo=mzvS0UBC7fGx2t501%2Bfioi4DJcw8qobOpbYOUiraqGg@mail.gmail.com>

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

Hi!

Here is an update of work these days.

I've added a new struct called ieee80211_rc_info to the ratectl API. It
contains tx completing information, i.e. txcnt, retrycnt, finaltsi, etc,
which
can be provided to ratectl algo during the __complete__ period. ir_rates,
ieee80211_ratectl_rates and ieee80211_ratectl_complete_rcflags are
adapted to accept the ieee80211_rc_info pointer through which framelen
and shortpreamble can also be reached. Then I added __complete__ stuff
and ir_rates to ieee80211_rc_sample.

Thanks!

Chenchong


On Tue, Aug 6, 2013 at 12:03 AM, Adrian Chadd <adrian@freebsd.org> wrote:

> Hi!
>
> Great!
>
> So what's the problem with complete? Linux just provides all the
> information that the NIC supplies - how many attempts were made, how
> many attempts failed, which rate suceeded, etc. It looks a lot like it
> was designed around the requirements for the atheros driver (that has
> the most interesting information available) and other NICs just have
> to fake it somehow.
>
>
>
> -adrian
>
> On 5 August 2013 08:58, Chenchong Qin <qinchenchong@gmail.com> wrote:
> > Hi!
> >
> > Here is my work done these days on porting ath_rate_sample to net80211.
> It
> > has not been finished yet. _complete_ and _update_ are to be added.
> >
> > _complete_ is really a tricky thing. We have to provide rc algos with rc
> > information
> > during the frame completion period. Different rc algos may need
> different rc
> > information. What makes things more thornier is that different drivers
> > provide
> > different rc information in different ways. So, it seems we need a
> unified
> > way to
> > provide the rc information during completion of a frame.
> >
> > I'm browsing mac80211 these days to see what Linux do about _complete_.
> And,
> > looking forward to your commets!
> >
> > Thanks!
> >
> > Chenchong
> >
> >
> > On Sat, Aug 3, 2013 at 1:30 AM, Adrian Chadd <adrian@freebsd.org> wrote:
> >>
> >> Well just remember you can always ask me/us questions!
> >>
> >> What's your latest diff against -HEAD? Maybe I can start looking at
> >> including parts of it in the tree.
> >>
> >>
> >>
> >>
> >> -adrian
> >>
> >> On 2 August 2013 09:17, Chenchong Qin <qinchenchong@gmail.com> wrote:
> >> > Hi!
> >> >
> >> > These days, I'm taking a further look at what Linux done for the
> >> > _completion_ of a
> >> > frame. Some updates will be posted here later.
> >> >
> >> > And, with ir_rates, we can return/fill an rc array rather than just
> >> > returning the rix.
> >> >
> >> > Thanks!
> >> >
> >> > Chenchong
> >> >
> >> >
> >> >
> >> >
> >> >
> >> > On Thu, Aug 1, 2013 at 12:21 AM, Adrian Chadd <adrian@freebsd.org>
> >> > wrote:
> >> >>
> >> >> Boo!
> >> >>
> >> >> Do you have another update?
> >> >>
> >> >>
> >> >>
> >> >> -adrian
> >> >>
> >> >> On 24 July 2013 06:44, Adrian Chadd <adrian@freebsd.org> wrote:
> >> >> > On 24 July 2013 06:38, Chenchong Qin <qinchenchong@gmail.com>
> wrote:
> >> >> >>
> >> >> >> My pleasure!
> >> >> >>
> >> >> >> It's also against HEAD.
> >> >> >>
> >> >> >> Thanks!
> >> >> >
> >> >> > Ok. This is looking great!
> >> >> >
> >> >> > Next - we need to update the rate control API to now populate an rc
> >> >> > array rather than just returning the rix.
> >> >> >
> >> >> > This is the tricky part - as we're going to have to modify all the
> >> >> > drivers that use the rate control API to use this.
> >> >> > Which is fine, as there's only a handful. It's just annoying.
> >> >> >
> >> >> > Then we have to provide the rate control information during frame
> >> >> > _completion_, so the rate control code knows which transmission
> rates
> >> >> > succeeded or failed. I'm still not sure what to do about it here.
> >> >> > Maybe do something like Linux and attach TX rate control and
> >> >> > completion information as an mbuf tag?
> >> >> >
> >> >> > _Then_ we can start doing interesting thing with it. :)
> >> >> >
> >> >> >
> >> >> >
> >> >> > -adrian
> >> >
> >> >
> >
> >
>

--047d7b3434b695a01504e3d34963
Content-Type: application/octet-stream; 
	name="20130812-net80211-ratectl.diff"
Content-Disposition: attachment; filename="20130812-net80211-ratectl.diff"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_hkb2x1090

SW5kZXg6IHN5cy9uZXQ4MDIxMS9pZWVlODAyMTFfcmNfc2FtcGxlLmMKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
c3lzL25ldDgwMjExL2llZWU4MDIxMV9yY19zYW1wbGUuYwkocmV2aXNpb24gMCkKKysrIHN5cy9u
ZXQ4MDIxMS9pZWVlODAyMTFfcmNfc2FtcGxlLmMJKHJldmlzaW9uIDI1NTg3MikKQEAgLTAsMCAr
MSwxMTYyIEBACisvKiAkRnJlZUJTRDogaGVhZC9zeXMvZGV2L2F0aC9hdGhfcmF0ZS9zYW1wbGUv
c2FtcGxlLmMgMjQ4NTczIDIwMTMtMDItMjcgMDQ6MzM6MDZaIGFkcmlhbiAkKi8KKworLyotCisg
KiBDb3B5cmlnaHQgKGMpIDIwMTMgQ2hlbmNob25nIFFpbiA8Y2NxaW5ARnJlZUJTRC5vcmc+Cisg
KiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1Q
TElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwg
VEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURF
TlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9S
WSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8
c3lzL2NkZWZzLmg+CisKKyNpbmNsdWRlICJvcHRfd2xhbi5oIgorCisjaW5jbHVkZSA8c3lzL3Bh
cmFtLmg+CisjaW5jbHVkZSA8c3lzL2tlcm5lbC5oPgorI2luY2x1ZGUgPHN5cy9tb2R1bGUuaD4K
KyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL3N5c2N0bC5oPgorCisjaW5j
bHVkZSA8bmV0L2lmLmg+CisjaW5jbHVkZSA8bmV0L2lmX21lZGlhLmg+CisKKyNpZmRlZiBJTkVU
CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPG5ldGluZXQvaWZfZXRoZXIuaD4K
KyNlbmRpZgorCisjaW5jbHVkZSA8bmV0ODAyMTEvaWVlZTgwMjExX3Zhci5oPgorI2luY2x1ZGUg
PG5ldDgwMjExL2llZWU4MDIxMV9odC5oPgorI2luY2x1ZGUgPG5ldDgwMjExL2llZWU4MDIxMV9y
YXRlY3RsLmg+CisjaW5jbHVkZSA8bmV0ODAyMTEvaWVlZTgwMjExX3JjX3NhbXBsZS5oPgorI2lu
Y2x1ZGUgPG5ldDgwMjExL2llZWU4MDIxMV9yY19zYW1wbGVfdHhzY2hlZC5oPgorCitzdGF0aWMg
dm9pZAlzYW1wbGVfaW5pdChzdHJ1Y3QgaWVlZTgwMjExdmFwICopOworc3RhdGljIHZvaWQJc2Ft
cGxlX2RlaW5pdChzdHJ1Y3QgaWVlZTgwMjExdmFwICopOworc3RhdGljIHZvaWQJc2FtcGxlX25v
ZGVfaW5pdChzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKik7CitzdGF0aWMgdm9pZAlzYW1wbGVfbm9k
ZV9kZWluaXQoc3RydWN0IGllZWU4MDIxMV9ub2RlICopOworc3RhdGljIGludAlzYW1wbGVfcmF0
ZShzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKiwgdm9pZCAqLCB1aW50MzJfdCk7CitzdGF0aWMgdm9p
ZAlzYW1wbGVfdHhfY29tcGxldGUoY29uc3Qgc3RydWN0IGllZWU4MDIxMXZhcCAqLAorICAgIAkJ
CWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqLCBpbnQsIAorCQkJdm9pZCAqLCB2b2lkICop
Oworc3RhdGljIHZvaWQJc2FtcGxlX3R4X3VwZGF0ZShjb25zdCBzdHJ1Y3QgaWVlZTgwMjExdmFw
ICp2YXAsCisJCQljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKiwgdm9pZCAqLCB2b2lkICos
IHZvaWQgKik7CitzdGF0aWMgdm9pZAlzYW1wbGVfc2V0aW50ZXJ2YWwoY29uc3Qgc3RydWN0IGll
ZWU4MDIxMXZhcCAqLCBpbnQpOworCisvKiBudW1iZXIgb2YgcmVmZXJlbmNlcyBmcm9tIG5ldDgw
MjExIGxheWVyICovCitzdGF0aWMJaW50IG5yZWZzID0gMDsKKworc3RhdGljIGNvbnN0IHN0cnVj
dCBpZWVlODAyMTFfcmF0ZWN0bCBzYW1wbGUgPSB7CisJLmlyX25hbWUJPSAic2FtcGxlIiwKKwku
aXJfYXR0YWNoCT0gTlVMTCwKKwkuaXJfZGV0YWNoCT0gTlVMTCwKKwkuaXJfaW5pdAk9IHNhbXBs
ZV9pbml0LAorCS5pcl9kZWluaXQJPSBzYW1wbGVfZGVpbml0LAorCS5pcl9ub2RlX2luaXQJPSBz
YW1wbGVfbm9kZV9pbml0LAorCS5pcl9ub2RlX2RlaW5pdAk9IHNhbXBsZV9ub2RlX2RlaW5pdCwK
KwkuaXJfcmF0ZQk9IHNhbXBsZV9yYXRlLAorCS5pcl9yYXRlcwk9IHNhbXBsZV9yYXRlcywKKwku
aXJfdHhfY29tcGxldGUJPSBzYW1wbGVfdHhfY29tcGxldGUsCisJLmlyX3R4X3VwZGF0ZQk9IHNh
bXBsZV90eF91cGRhdGUsCisJLmlyX3NldGludGVydmFsCT0gc2FtcGxlX3NldGludGVydmFsLAor
fTsKK0lFRUU4MDIxMV9SQVRFQ1RMX01PRFVMRShzYW1wbGUsIDEpOworSUVFRTgwMjExX1JBVEVD
VExfQUxHKHNhbXBsZSwgSUVFRTgwMjExX1JBVEVDVExfU0FNUExFLCBzYW1wbGUpOworCitzdGF0
aWMgdm9pZAorc2FtcGxlX2luaXQoc3RydWN0IGllZWU4MDIxMXZhcCAqdmFwKQoreworCXN0cnVj
dCBpZWVlODAyMTFfc2FtcGxlICpzYW1wbGU7CisKKwlLQVNTRVJUKHZhcC0+aXZfcnMgPT0gTlVM
TCwgKCIlcyBjYWxsZWQgbXVsdGlwbGUgdGltZXMiLCBfX2Z1bmNfXykpOworCisJc2FtcGxlID0g
dmFwLT5pdl9ycyA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9zYW1wbGUpLAorCSAg
ICBNXzgwMjExX1JBVEVDVEwsIE1fTk9XQUlUfE1fWkVSTyk7CisJaWYgKHNhbXBsZSA9PSBOVUxM
KSB7CisJCWlmX3ByaW50Zih2YXAtPml2X2lmcCwgImNvdWxkbid0IGFsbG9jIHJhdGVjdGwgc3Ry
dWN0dXJlXG4iKTsKKwkJcmV0dXJuOworCX0KKwlzYW1wbGUtPnNhbXBsZV9zbW9vdGhpbmdfcmF0
ZSA9IDc1OwkJLyogZXdtYSBwZXJjZW50YWdlIChbMC4uOTldKSAqLworCXNhbXBsZS0+c2FtcGxl
X3Ntb290aGluZ19taW5wYWNrZXRzID0gMTAwIC8gKDEwMCAtIHNhbXBsZS0+c2FtcGxlX3Ntb290
aGluZ19yYXRlKTsKKwlzYW1wbGUtPnNhbXBsZV9yYXRlID0gMTA7CQkJLyogJXRpbWUgdG8gdHJ5
IGRpZmYgdHggcmF0ZXMgKi8KKwlzYW1wbGUtPnNhbXBsZV9tYXhfc3VjY2Vzc2l2ZV9mYWlsdXJl
cyA9IDM7CS8qIHRocmVzaG9sZCBmb3IgcmF0ZSBzYW1wbGluZyovCisJc2FtcGxlLT5zYW1wbGVf
c3RhbGVfZmFpbHVyZV90aW1lb3V0ID0gMTAgKiBoejsJLyogMTAgc2Vjb25kcyAqLworCXNhbXBs
ZS0+c2FtcGxlX21pbl9zd2l0Y2ggPSBoejsJCQkvKiAxIHNlY29uZCAqLworCXNhbXBsZV9zZXRp
bnRlcnZhbCh2YXAsIDUwMCAvKiBtcyAqLyk7IAkvKiBhY3R1YWxseSBkbyBub3RoaW5nICovCisJ
c2FtcGxlX3N5c2N0bGF0dGFjaCh2YXAsIHZhcC0+aXZfc3lzY3RsLCB2YXAtPml2X29pZCk7Cit9
CisKK3N0YXRpYyB2b2lkCitzYW1wbGVfZGVpbml0KHN0cnVjdCBpZWVlODAyMTF2YXAgKnZhcCkK
K3sKKwlmcmVlKHZhcC0+aXZfcnMsIE1fODAyMTFfUkFURUNUTCk7Cit9CisKKy8vIFhYWCBzaG91
bGQgYmUgc2hhcmVkIGJ5IHJhdGVjdGwgYWxnb3MKK3N0YXRpYyBpbnQKK3NhbXBsZV9ub2RlX2lz
XzExbihzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5pKQoreworCisJaWYgKG5pLT5uaV9jaGFuID09
IE5VTEwpCisJCXJldHVybiAoMCk7CisJaWYgKG5pLT5uaV9jaGFuID09IElFRUU4MDIxMV9DSEFO
X0FOWUMpCisJCXJldHVybiAoMCk7CisJcmV0dXJuIChJRUVFODAyMTFfSVNfQ0hBTl9IVChuaS0+
bmlfY2hhbikpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHR4c2NoZWR1bGUgKm1ycl9zY2hl
ZHVsZXNbSUVFRTgwMjExX01PREVfTUFYKzJdID0geworCU5VTEwsCQkvKiBJRUVFODAyMTFfTU9E
RV9BVVRPICovCisJc2VyaWVzXzExYSwJLyogSUVFRTgwMjExX01PREVfMTFBICovCisJc2VyaWVz
XzExZywJLyogSUVFRTgwMjExX01PREVfMTFCICovCisJc2VyaWVzXzExZywJLyogSUVFRTgwMjEx
X01PREVfMTFHICovCisJTlVMTCwJCS8qIElFRUU4MDIxMV9NT0RFX0ZIICovCisJc2VyaWVzXzEx
YSwJLyogSUVFRTgwMjExX01PREVfVFVSQk9fQSAqLworCXNlcmllc18xMWcsCS8qIElFRUU4MDIx
MV9NT0RFX1RVUkJPX0cgKi8KKwlzZXJpZXNfMTFhLAkvKiBJRUVFODAyMTFfTU9ERV9TVFVSQk9f
QSAqLworCXNlcmllc18xMW5hLAkvKiBJRUVFODAyMTFfTU9ERV8xMU5BICovCisJc2VyaWVzXzEx
bmcsCS8qIElFRUU4MDIxMV9NT0RFXzExTkcgKi8KKwlzZXJpZXNfaGFsZiwJLyogSUVFRTgwMjEx
X01PREVfSEFMRiAqLworCXNlcmllc19xdWFydGVyLAkvKiBJRUVFODAyMTFfTU9ERV9RVUFSVEVS
ICovCit9OworCitzdGF0aWMgdm9pZAorc2FtcGxlX25vZGVfaW5pdChzdHJ1Y3QgaWVlZTgwMjEx
X25vZGUgKm5pKQoreworI2RlZmluZQlSQVRFKF9peCkJKG5pLT5uaV9yYXRlcy5yc19yYXRlc1so
X2l4KV0gJiBJRUVFODAyMTFfUkFURV9WQUwpCisjZGVmaW5lCURPVDExUkFURShfaXgpCShydC0+
aW5mb1soX2l4KV0uZG90MTFSYXRlICYgSUVFRTgwMjExX1JBVEVfVkFMKQorI2RlZmluZQlNQ1Mo
X2l4KQkobmktPm5pX2h0cmF0ZXMucnNfcmF0ZXNbX2l4XSB8IElFRUU4MDIxMV9SQVRFX01DUykK
KwlzdHJ1Y3QgaWVlZTgwMjExdmFwICp2YXAgPSBuaS0+bmlfdmFwOworCXN0cnVjdCBpZWVlODAy
MTFfc2FtcGxlICpzYW1wbGUgPSB2YXAtPml2X3JzOworCXN0cnVjdCBpZWVlODAyMTFfc2FtcGxl
X25vZGUgKnNhbiA9IE5VTEw7CisJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yYXRlX3RhYmxlICpy
dCA9IGllZWU4MDIxMV9nZXRfcmF0ZXRhYmxlKHZhcC0+aXZfaWMtPmljX2N1cmNoYW4pOworCWVu
dW0gaWVlZTgwMjExX3BoeW1vZGUgY3VybW9kZSA9IGllZWU4MDIxMV9jaGFuMm1vZGUodmFwLT5p
dl9pYy0+aWNfY3VyY2hhbik7CisJaW50IHgsIHksIHJpeDsKKworCWlmIChuaS0+bmlfcmN0bHMg
PT0gTlVMTCkgeworCQluaS0+bmlfcmN0bHMgPSBzYW4gPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBp
ZWVlODAyMTFfc2FtcGxlX25vZGUpLAorCQkgICAgTV84MDIxMV9SQVRFQ1RMLCBNX05PV0FJVHxN
X1pFUk8pOworCQlpZiAoc2FuID09IE5VTEwpIHsKKwkJCWlmX3ByaW50Zih2YXAtPml2X2lmcCwg
ImNvdWxkbid0IGFsbG9jIHBlci1ub2RlIHJhdGVjdGwgIgorCQkJICAgICJzdHJ1Y3R1cmVcbiIp
OworCQkJcmV0dXJuOworCQl9CisJfSBlbHNlCisJCXNhbiA9IG5pLT5uaV9yY3RsczsKKwlzYW4t
PnNhbl9zYW1wbGUgPSBzYW1wbGU7CisKKwlLQVNTRVJUKHJ0ICE9IE5VTEwsICgibm8gcmF0ZSB0
YWJsZSwgbW9kZSAldSIsIGN1cm1vZGUpKTsKKworCXNhbi0+c2NoZWQgPSBtcnJfc2NoZWR1bGVz
W2N1cm1vZGVdOworCUtBU1NFUlQoc2FuLT5zY2hlZCAhPSBOVUxMLCAoIm5vIG1yciBzY2hlZHVs
ZSBmb3IgbW9kZSAldSIsIGN1cm1vZGUpKTsKKworCXNhbi0+c3RhdGljX3JpeCA9IC0xOworCXNh
bXBsZV91cGRhdGVfc3RhdGljX3JpeChuaSk7CisKKwkvKgorCSAqIENvbnN0cnVjdCBhIGJpdG1h
c2sgb2YgdXNhYmxlIHJhdGVzLiAgVGhpcyBoYXMgYWxsCisJICogbmVnb3RpYXRlZCByYXRlcyBt
aW51cyB0aG9zZSBtYXJrZWQgYnkgdGhlIGhhbCBhcworCSAqIHRvIGJlIGlnbm9yZWQgZm9yIGRv
aW5nIHJhdGUgY29udHJvbC4KKwkgKi8KKwlzYW4tPnJhdGVtYXNrID0gMDsKKworCS8qIE1DUyBy
YXRlcyAqLworCWlmIChuaS0+bmlfZmxhZ3MgJiBJRUVFODAyMTFfTk9ERV9IVCkgeworCQlmb3Ig
KHggPSAwOyB4IDwgbmktPm5pX2h0cmF0ZXMucnNfbnJhdGVzOyB4KyspIHsKKwkJCXJpeCA9IHJ0
LT5yYXRlQ29kZVRvSW5kZXhbTUNTKHgpXTsKKwkJCWlmIChyaXggPT0gMHhmZikKKwkJCQljb250
aW51ZTsKKwkJCS8qIHNraXAgcmF0ZXMgbWFya2VkIGJyb2tlbiBieSBoYWwgKi8KKwkJCWlmICgh
cnQtPmluZm9bcml4XS52YWxpZCkKKwkJCQljb250aW51ZTsKKwkJCUtBU1NFUlQocml4IDwgU0FN
UExFX01BWFJBVEVTLAorCQkJICAgICgibWNzICV1IGhhcyByaXggJWQiLCBNQ1MoeCksIHJpeCkp
OworCQkJc2FuLT5yYXRlbWFzayB8PSAodWludDY0X3QpIDE8PHJpeDsKKwkJfQorCX0KKworCS8q
IExlZ2FjeSByYXRlcyAqLworCWZvciAoeCA9IDA7IHggPCBuaS0+bmlfcmF0ZXMucnNfbnJhdGVz
OyB4KyspIHsKKwkJcml4ID0gcnQtPnJhdGVDb2RlVG9JbmRleFtSQVRFKHgpXTsKKwkJaWYgKHJp
eCA9PSAweGZmKQorCQkJY29udGludWU7CisJCS8qIHNraXAgcmF0ZXMgbWFya2VkIGJyb2tlbiBi
eSBoYWwgKi8KKwkJaWYgKCFydC0+aW5mb1tyaXhdLnZhbGlkKQorCQkJY29udGludWU7CisJCUtB
U1NFUlQocml4IDwgU0FNUExFX01BWFJBVEVTLAorCQkgICAgKCJyYXRlICV1IGhhcyByaXggJWQi
LCBSQVRFKHgpLCByaXgpKTsKKwkJc2FuLT5yYXRlbWFzayB8PSAodWludDY0X3QpIDE8PHJpeDsK
Kwl9CisKKwlmb3IgKHkgPSAwOyB5IDwgTlVNX1BBQ0tFVF9TSVpFX0JJTlM7IHkrKykgeworCQlp
bnQgc2l6ZSA9IGJpbl90b19zaXplKHkpOworCQl1aW50NjRfdCBtYXNrOworCisJCXNhbi0+cGFj
a2V0c19zZW50W3ldID0gMDsKKwkJc2FuLT5jdXJyZW50X3NhbXBsZV9yaXhbeV0gPSAtMTsKKwkJ
c2FuLT5sYXN0X3NhbXBsZV9yaXhbeV0gPSAwOworCQkvKiBYWFggc3RhcnQgd2l0aCBmaXJzdCB2
YWxpZCByYXRlICovCisJCXNhbi0+Y3VycmVudF9yaXhbeV0gPSBmZnMoc2FuLT5yYXRlbWFzaykt
MTsKKwkJCisJCS8qCisJCSAqIEluaXRpYWxpemUgdGhlIHN0YXRpc3RpY3MgYnVja2V0czsgdGhl
c2UgYXJlCisJCSAqIGluZGV4ZWQgYnkgdGhlIHJhdGUgY29kZSBpbmRleC4KKwkJICovCisJCWZv
ciAocml4ID0gMCwgbWFzayA9IHNhbi0+cmF0ZW1hc2s7IG1hc2sgIT0gMDsgcml4KyssIG1hc2sg
Pj49IDEpIHsKKwkJCWlmICgobWFzayAmIDEpID09IDApCQkvKiBub3QgYSB2YWxpZCByYXRlICov
CisJCQkJY29udGludWU7CisJCQlzYW4tPnN0YXRzW3ldW3JpeF0uc3VjY2Vzc2l2ZV9mYWlsdXJl
cyA9IDA7CisJCQlzYW4tPnN0YXRzW3ldW3JpeF0udHJpZXMgPSAwOworCQkJc2FuLT5zdGF0c1t5
XVtyaXhdLnRvdGFsX3BhY2tldHMgPSAwOworCQkJc2FuLT5zdGF0c1t5XVtyaXhdLnBhY2tldHNf
YWNrZWQgPSAwOworCQkJc2FuLT5zdGF0c1t5XVtyaXhdLmxhc3RfdHggPSAwOworCQkJc2FuLT5z
dGF0c1t5XVtyaXhdLmV3bWFfcGN0ID0gMDsKKwkJCQorCQkJc2FuLT5zdGF0c1t5XVtyaXhdLnBl
cmZlY3RfdHhfdGltZSA9CisJCQkgICAgY2FsY191c2Vjc191bmljYXN0X3BhY2tldCh2YXAsIHNp
emUsIHJpeCwgMCwgMCwKKwkJCSAgICAobmktPm5pX2NodyA9PSA0MCkpOworCQkJc2FuLT5zdGF0
c1t5XVtyaXhdLmF2ZXJhZ2VfdHhfdGltZSA9CisJCQkgICAgc2FuLT5zdGF0c1t5XVtyaXhdLnBl
cmZlY3RfdHhfdGltZTsKKwkJfQorCX0KKworCS8qIHNldCB0aGUgdmlzaWJsZSBiaXQtcmF0ZSAq
LworCWlmIChzYW4tPnN0YXRpY19yaXggIT0gLTEpCisJCW5pLT5uaV90eHJhdGUgPSBET1QxMVJB
VEUoc2FuLT5zdGF0aWNfcml4KTsKKwllbHNlCisJCW5pLT5uaV90eHJhdGUgPSBSQVRFKDApOwor
I3VuZGVmIFJBVEUKKyN1bmRlZiBET1QxMVJBVEUKKyN1bmRlZiBNQ1MKK30KKworc3RhdGljIHZv
aWQKK3NhbXBsZV9ub2RlX2RlaW5pdChzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5pKQoreworCWZy
ZWUobmktPm5pX3JjdGxzLCBNXzgwMjExX1JBVEVDVEwpOworfQorCitzdGF0aWMgaW50Citkb3Qx
MXJhdGUoY29uc3QgaWVlZTgwMjExX3JhdGVfdGFibGUgKnJ0LCBpbnQgcml4KQoreworCWlmIChy
aXggPCAwKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIHJ0LT5pbmZvW3JpeF0ucGh5ID09IElFRUU4
MDIxMV9UX0hUID8KKwkgICAgcnQtPmluZm9bcml4XS5kb3QxMVJhdGUgOiAocnQtPmluZm9bcml4
XS5kb3QxMVJhdGUgJiBJRUVFODAyMTFfUkFURV9WQUwpIC8gMjsKK30KKworc3RhdGljIGNvbnN0
IGNoYXIgKgorZG90MTFyYXRlX2xhYmVsKGNvbnN0IGllZWU4MDIxMV9yYXRlX3RhYmxlICpydCwg
aW50IHJpeCkKK3sKKwlpZiAocml4IDwgMCkKKwkJcmV0dXJuICIiOworCXJldHVybiBydC0+aW5m
b1tyaXhdLnBoeSA9PSBJRUVFODAyMTFfVF9IVCA/ICJNQ1MiIDogIk1iICI7Cit9CisKKy8qCisg
KiBSZXR1cm4gdGhlIHJpeCB3aXRoIHRoZSBsb3dlc3QgYXZlcmFnZV90eF90aW1lLAorICogb3Ig
LTEgaWYgYWxsIHRoZSBhdmVyYWdlX3R4X3RpbWVzIGFyZSAwLgorICovCitzdGF0aWMgX19pbmxp
bmUgaW50CitwaWNrX2Jlc3RfcmF0ZShjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5pLCBj
b25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JhdGVfdGFibGUgKnJ0LAorICAgIGludCBzaXplX2Jpbiwg
aW50IHJlcXVpcmVfYWNrZWRfYmVmb3JlKQoreworCXN0cnVjdCBpZWVlODAyMTFfc2FtcGxlX25v
ZGUgKnNhbiA9IG5pLT5uaV9yY3RsczsKKyAgICBpbnQgYmVzdF9yYXRlX3JpeCwgYmVzdF9yYXRl
X3R0LCBiZXN0X3JhdGVfcGN0OworCXVpbnQ2NF90IG1hc2s7CisJaW50IHJpeCwgdHQsIHBjdDsK
KworICAgIGJlc3RfcmF0ZV9yaXggPSAwOworICAgIGJlc3RfcmF0ZV90dCA9IDA7CisJYmVzdF9y
YXRlX3BjdCA9IDA7CisKKwlmb3IgKG1hc2sgPSBzYW4tPnJhdGVtYXNrLCByaXggPSAwOyBtYXNr
ICE9IDA7IG1hc2sgPj49IDEsIHJpeCsrKSB7CisJCWlmICgobWFzayAmIDEpID09IDApCQkvKiBu
b3QgYSBzdXBwb3J0ZWQgcmF0ZSAqLworCQkJY29udGludWU7CisKKwkJLyogRG9uJ3QgcGljayBh
IG5vbi1IVCByYXRlIGZvciBhIEhUIG5vZGUgKi8KKwkJaWYgKChuaS0+bmlfZmxhZ3MgJiBJRUVF
ODAyMTFfTk9ERV9IVCkgJiYKKwkJICAgIChydC0+aW5mb1tyaXhdLnBoeSAhPSBJRUVFODAyMTFf
VF9IVCkpIHsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJdHQgPSBzYW4tPnN0YXRzW3NpemVfYmlu
XVtyaXhdLmF2ZXJhZ2VfdHhfdGltZTsKKwkJaWYgKHR0IDw9IDAgfHwKKwkJICAgIChyZXF1aXJl
X2Fja2VkX2JlZm9yZSAmJgorCQkgICAgICFzYW4tPnN0YXRzW3NpemVfYmluXVtyaXhdLnBhY2tl
dHNfYWNrZWQpKQorCQkJY29udGludWU7CisKKwkJLyogQ2FsY3VsYXRlIHBlcmNlbnRhZ2UgaWYg
cG9zc2libGUgKi8KKwkJaWYgKHNhbi0+c3RhdHNbc2l6ZV9iaW5dW3JpeF0udG90YWxfcGFja2V0
cyA+IDApIHsKKwkJCXBjdCA9IHNhbi0+c3RhdHNbc2l6ZV9iaW5dW3JpeF0uZXdtYV9wY3Q7CisJ
CX0gZWxzZSB7CisJCQkvKiBYWFggZm9yIG5vdywgYXNzdW1lIDk1JSBvayAqLworCQkJcGN0ID0g
OTU7CisJCX0KKworCQkvKiBkb24ndCB1c2UgYSBiaXQtcmF0ZSB0aGF0IGhhcyBiZWVuIGZhaWxp
bmcgKi8KKwkJaWYgKHNhbi0+c3RhdHNbc2l6ZV9iaW5dW3JpeF0uc3VjY2Vzc2l2ZV9mYWlsdXJl
cyA+IDMpCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBGb3IgSFQsIERvbid0IHVzZSBhIGJp
dCByYXRlIHRoYXQgaXMgbXVjaCBtb3JlCisJCSAqIGxvc3N5IHRoYW4gdGhlIGJlc3QuCisJCSAq
CisJCSAqIFhYWCB0aGlzIGlzbid0IG9wdGltYWw7IGl0J3MganVzdCBkZXNpZ25lZCB0bworCQkg
KiBlbGltaW5hdGUgcmF0ZXMgdGhhdCBhcmUgZ29pbmcgdG8gYmUgb2J2aW91c2x5CisJCSAqIHdv
cnNlLgorCQkgKi8KKwkJaWYgKG5pLT5uaV9mbGFncyAmIElFRUU4MDIxMV9OT0RFX0hUKSB7CisJ
CQlpZiAoYmVzdF9yYXRlX3BjdCA+IChwY3QgKyA1MCkpCisJCQkJY29udGludWU7CisJCX0KKwor
CQkvKgorCQkgKiBGb3Igbm9uLU1DUyByYXRlcywgdXNlIHRoZSBjdXJyZW50IGF2ZXJhZ2UgdHh0
aW1lIGZvcgorCQkgKiBjb21wYXJpc29uLgorCQkgKi8KKwkJaWYgKCEgKG5pLT5uaV9mbGFncyAm
IElFRUU4MDIxMV9OT0RFX0hUKSkgeworCQkJaWYgKGJlc3RfcmF0ZV90dCA9PSAwIHx8IHR0IDw9
IGJlc3RfcmF0ZV90dCkgeworCQkJCWJlc3RfcmF0ZV90dCA9IHR0OworCQkJCWJlc3RfcmF0ZV9y
aXggPSByaXg7CisJCQkJYmVzdF9yYXRlX3BjdCA9IHBjdDsKKwkJCX0KKwkJfQorCisJCS8qCisJ
CSAqIFNpbmNlIDIgc3RyZWFtIHJhdGVzIGhhdmUgc2xpZ2h0bHkgaGlnaGVyIFRYIHRpbWVzLAor
CQkgKiBhbGxvdyBhIGxpdHRsZSBiaXQgb2YgbGVld2F5LiBUaGlzIHNob3VsZCBsYXRlcgorCQkg
KiBiZSBhYnN0cmFjdGVkIG91dCBhbmQgcHJvcGVybHkgaGFuZGxlZC4KKwkJICovCisJCWlmIChu
aS0+bmlfZmxhZ3MgJiBJRUVFODAyMTFfTk9ERV9IVCkgeworCQkJaWYgKGJlc3RfcmF0ZV90dCA9
PSAwIHx8ICh0dCAqIDggPD0gYmVzdF9yYXRlX3R0ICogMTApKSB7CisJCQkJYmVzdF9yYXRlX3R0
ID0gdHQ7CisJCQkJYmVzdF9yYXRlX3JpeCA9IHJpeDsKKwkJCQliZXN0X3JhdGVfcGN0ID0gcGN0
OworCQkJfQorCQl9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChiZXN0X3JhdGVfdHQgPyBi
ZXN0X3JhdGVfcml4IDogLTEpOworfQorCisvKgorICogUGljayBhIGdvb2QgInJhbmRvbSIgYml0
LXJhdGUgdG8gc2FtcGxlIG90aGVyIHRoYW4gdGhlIGN1cnJlbnQgb25lLgorICovCitzdGF0aWMg
X19pbmxpbmUgaW50CitwaWNrX3NhbXBsZV9yYXRlKGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfbm9k
ZSAqbmksIGNvbnN0IGllZWU4MDIxMV9yYXRlX3RhYmxlICpydCwgCisJaW50IHNpemVfYmluKQor
eworI2RlZmluZQlET1QxMVJBVEUoaXgpCShydC0+aW5mb1tpeF0uZG90MTFSYXRlICYgSUVFRTgw
MjExX1JBVEVfVkFMKQorI2RlZmluZQlNQ1MoaXgpCQkocnQtPmluZm9baXhdLmRvdDExUmF0ZSB8
IElFRUU4MDIxMV9SQVRFX01DUykKKwlzdHJ1Y3QgaWVlZTgwMjExX3NhbXBsZV9ub2RlICpzYW4g
PSBuaS0+bmlfcmN0bHM7CisJc3RydWN0IGllZWU4MDIxMV9zYW1wbGUgKnNhbXBsZSA9IHNhbi0+
c2FuX3NhbXBsZTsKKwlpbnQgY3VycmVudF9yaXgsIHJpeDsKKwl1bnNpZ25lZCBjdXJyZW50X3R0
OworCXVpbnQ2NF90IG1hc2s7CisJCisJY3VycmVudF9yaXggPSBzYW4tPmN1cnJlbnRfcml4W3Np
emVfYmluXTsKKwlpZiAoY3VycmVudF9yaXggPCAwKSB7CisJCS8qIG5vIHN1Y2Nlc3NlcyB5ZXQs
IHNlbmQgYXQgdGhlIGxvd2VzdCBiaXQtcmF0ZSAqLworCQkvKiBYWFggc2hvdWxkIHJldHVybiBN
Q1MwIGlmIEhUICovCisJCXJldHVybiAwOworCX0KKworCWN1cnJlbnRfdHQgPSBzYW4tPnN0YXRz
W3NpemVfYmluXVtjdXJyZW50X3JpeF0uYXZlcmFnZV90eF90aW1lOworCisJcml4ID0gc2FuLT5s
YXN0X3NhbXBsZV9yaXhbc2l6ZV9iaW5dKzE7CS8qIG5leHQgc2FtcGxlIHJhdGUgKi8KKwltYXNr
ID0gc2FuLT5yYXRlbWFzayAmfiAoKHVpbnQ2NF90KSAxPDxjdXJyZW50X3JpeCk7LyogZG9uJ3Qg
c2FtcGxlIGN1cnJlbnQgcmF0ZSAqLworCXdoaWxlIChtYXNrICE9IDApIHsKKwkJaWYgKChtYXNr
ICYgKCh1aW50NjRfdCkgMTw8cml4KSkgPT0gMCkgewkvKiBub3QgYSBzdXBwb3J0ZWQgcmF0ZSAq
LworCW5leHRyYXRlOgorCQkJaWYgKCsrcml4ID49IHJ0LT5yYXRlQ291bnQpCisJCQkJcml4ID0g
MDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJICogVGhlIGZvbGxvd2luZyBjb2RlIHN0
b3BzIHRyeWluZyB0byBzYW1wbGUKKwkJICogbm9uLU1DUyByYXRlcyB3aGVuIHNwZWFraW5nIHRv
IGFuIE1DUyBub2RlLgorCQkgKiBIb3dldmVyLCBhdCBsZWFzdCBmb3IgQ0NLIHJhdGVzIGluIDIu
NEdIeiBtb2RlLAorCQkgKiB0aGUgbm9uLU1DUyByYXRlcyBNQVkgYWN0dWFsbHkgcHJvdmlkZSBi
ZXR0ZXIKKwkJICogUEVSIGF0IHRoZSB2ZXJ5IGZhciBlZGdlIG9mIHJlY2VwdGlvbi4KKwkJICoK
KwkJICogSG93ZXZlciEgVW50aWwgYXRoX3JhdGVfZm9ybV9hZ2dyKCkgZ3Jvd3MKKwkJICogc29t
ZSBsb2dpYyB0byBub3QgZm9ybSBhZ2dyZWdhdGVzIGlmIHRoZQorCQkgKiBzZWxlY3RlZCByYXRl
IGlzIG5vbi1NQ1MsIHRoaXMgd29uJ3Qgd29yay4KKwkJICoKKwkJICogU28gZG9uJ3QgZGlzYWJs
ZSB0aGlzIGNvZGUgdW50aWwgeW91J3ZlIHRhdWdodAorCQkgKiBhdGhfcmF0ZV9mb3JtX2FnZ3Io
KSB0byBkcm9wIG91dCBpZiBhbnkgb2YKKwkJICogdGhlIHNlbGVjdGVkIHJhdGVzIGFyZSBub24t
TUNTLgorCQkgKi8KKyNpZiAxCisJCS8qIGlmIHRoZSBub2RlIGlzIEhUIGFuZCB0aGUgcmF0ZSBp
c24ndCBIVCwgZG9uJ3QgYm90aGVyIHNhbXBsZSAqLworCQlpZiAoKG5pLT5uaV9mbGFncyAmIElF
RUU4MDIxMV9OT0RFX0hUKSAmJgorCQkgICAgKHJ0LT5pbmZvW3JpeF0ucGh5ICE9IElFRUU4MDIx
MV9UX0hUKSkgeworCQkJbWFzayAmPSB+KCh1aW50NjRfdCkgMTw8cml4KTsKKwkJCWdvdG8gbmV4
dHJhdGU7CisJCX0KKyNlbmRpZgorCisJCS8qIHRoaXMgYml0LXJhdGUgaXMgYWx3YXlzIHdvcnNl
IHRoYW4gdGhlIGN1cnJlbnQgb25lICovCisJCWlmIChzYW4tPnN0YXRzW3NpemVfYmluXVtyaXhd
LnBlcmZlY3RfdHhfdGltZSA+IGN1cnJlbnRfdHQpIHsKKwkJCW1hc2sgJj0gfigodWludDY0X3Qp
IDE8PHJpeCk7CisJCQlnb3RvIG5leHRyYXRlOworCQl9CisKKwkJLyogcmFyZWx5IHNhbXBsZSBi
aXQtcmF0ZXMgdGhhdCBmYWlsIGEgbG90ICovCisJCWlmIChzYW4tPnN0YXRzW3NpemVfYmluXVty
aXhdLnN1Y2Nlc3NpdmVfZmFpbHVyZXMgPiBzYW1wbGUtPnNhbXBsZV9tYXhfc3VjY2Vzc2l2ZV9m
YWlsdXJlcyAmJgorCQkgICAgdGlja3MgLSBzYW4tPnN0YXRzW3NpemVfYmluXVtyaXhdLmxhc3Rf
dHggPCBzYW1wbGUtPnNhbXBsZV9zdGFsZV9mYWlsdXJlX3RpbWVvdXQpIHsKKwkJCW1hc2sgJj0g
figodWludDY0X3QpIDE8PHJpeCk7CisJCQlnb3RvIG5leHRyYXRlOworCQl9CisKKwkJLyoKKwkJ
ICogRm9yIEhULCBvbmx5IHNhbXBsZSBhIGZldyByYXRlcyBvbiBlaXRoZXIgc2lkZSBvZiB0aGUK
KwkJICogY3VycmVudCByaXg7IHRoZXJlJ3MgcXVpdGUgbGlrZWx5IGEgbG90IG9mIHRoZW0uCisJ
CSAqLworCQlpZiAobmktPm5pX2ZsYWdzICYgSUVFRTgwMjExX05PREVfSFQpIHsKKwkJCWlmIChy
aXggPCAoY3VycmVudF9yaXggLSAzKSB8fAorCQkJICAgIHJpeCA+IChjdXJyZW50X3JpeCArIDMp
KSB7CisJCQkJbWFzayAmPSB+KCh1aW50NjRfdCkgMTw8cml4KTsKKwkJCQlnb3RvIG5leHRyYXRl
OworCQkJfQorCQl9CisKKwkJLyogRG9uJ3Qgc2FtcGxlIG1vcmUgdGhhbiAyIHJhdGVzIGhpZ2hl
ciBmb3IgcmF0ZXMgPiAxMU0gZm9yIG5vbi1IVCByYXRlcyAqLworCQlpZiAoISAobmktPm5pX2Zs
YWdzICYgSUVFRTgwMjExX05PREVfSFQpKSB7CisJCQlpZiAoRE9UMTFSQVRFKHJpeCkgPiAyKjEx
ICYmIHJpeCA+IGN1cnJlbnRfcml4ICsgMikgeworCQkJCW1hc2sgJj0gfigodWludDY0X3QpIDE8
PHJpeCk7CisJCQkJZ290byBuZXh0cmF0ZTsKKwkJCX0KKwkJfQorCisJCXNhbi0+bGFzdF9zYW1w
bGVfcml4W3NpemVfYmluXSA9IHJpeDsKKwkJcmV0dXJuIHJpeDsKKwl9CisJcmV0dXJuIGN1cnJl
bnRfcml4OworI3VuZGVmIERPVDExUkFURQorI3VuZGVmIE1DUworfQorCitzdGF0aWMgaW50Citz
YW1wbGVfZ2V0X3N0YXRpY19yaXgoY29uc3Qgc3RydWN0IGllZWU4MDIxMV9ub2RlICpuaSkKK3sK
KyNkZWZpbmUJUkFURShfaXgpCShuaS0+bmlfcmF0ZXMucnNfcmF0ZXNbKF9peCldICYgSUVFRTgw
MjExX1JBVEVfVkFMKQorI2RlZmluZQlNQ1MoX2l4KQkobmktPm5pX2h0cmF0ZXMucnNfcmF0ZXNb
X2l4XSB8IElFRUU4MDIxMV9SQVRFX01DUykKKwlzdHJ1Y3QgaWVlZTgwMjExdmFwICp2YXAgPSBu
aS0+bmlfdmFwOworCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmF0ZV90YWJsZSAqcnQgPSBpZWVl
ODAyMTFfZ2V0X3JhdGV0YWJsZSh2YXAtPml2X2ljLT5pY19jdXJjaGFuKTsKKwljb25zdCBzdHJ1
Y3QgaWVlZTgwMjExX3R4cGFyYW0gKnRwID0gbmktPm5pX3R4cGFybXM7CisJaW50IHNyYXRlOwor
CisJLyogQ2hlY2sgTUNTIHJhdGVzICovCisJZm9yIChzcmF0ZSA9IG5pLT5uaV9odHJhdGVzLnJz
X25yYXRlcyAtIDE7IHNyYXRlID49IDA7IHNyYXRlLS0pIHsKKwkJaWYgKE1DUyhzcmF0ZSkgPT0g
dHAtPnVjYXN0cmF0ZSkKKwkJCXJldHVybiBydC0+cmF0ZUNvZGVUb0luZGV4W3RwLT51Y2FzdHJh
dGVdOworCX0KKworCS8qIENoZWNrIGxlZ2FjeSByYXRlcyAqLworCWZvciAoc3JhdGUgPSBuaS0+
bmlfcmF0ZXMucnNfbnJhdGVzIC0gMTsgc3JhdGUgPj0gMDsgc3JhdGUtLSkgeworCQlpZiAoUkFU
RShzcmF0ZSkgPT0gdHAtPnVjYXN0cmF0ZSkKKwkJCXJldHVybiBydC0+cmF0ZUNvZGVUb0luZGV4
W3RwLT51Y2FzdHJhdGVdOworCX0KKwlyZXR1cm4gLTE7CisjdW5kZWYJUkFURQorI3VuZGVmCU1D
UworfQorCitzdGF0aWMgdm9pZAorc2FtcGxlX3VwZGF0ZV9zdGF0aWNfcml4KHN0cnVjdCBpZWVl
ODAyMTFfbm9kZSAqbmkpCit7CisJc3RydWN0IGllZWU4MDIxMV9zYW1wbGVfbm9kZSAqc2FuID0g
bmktPm5pX3JjdGxzOworCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfdHhwYXJhbSAqdHAgPSBuaS0+
bmlfdHhwYXJtczsKKworCWlmICh0cCAhPSBOVUxMICYmIHRwLT51Y2FzdHJhdGUgIT0gSUVFRTgw
MjExX0ZJWEVEX1JBVEVfTk9ORSkgeworCQkvKgorCQkgKiBBIGZpeGVkIHJhdGUgaXMgdG8gYmUg
dXNlZDsgdWNhc3RyYXRlIGlzIHRoZSBJRUVFIGNvZGUKKwkJICogZm9yIHRoaXMgcmF0ZSAoc2Fu
cyBiYXNpYyBiaXQpLiAgQ2hlY2sgdGhpcyBhZ2FpbnN0IHRoZQorCQkgKiBuZWdvdGlhdGVkIHJh
dGUgc2V0IGZvciB0aGUgbm9kZS4gIE5vdGUgdGhlIGZpeGVkIHJhdGUKKwkJICogbWF5IG5vdCBi
ZSBhdmFpbGFibGUgZm9yIHZhcmlvdXMgcmVhc29ucyBzbyB3ZSBvbmx5CisJCSAqIHNldHVwIHRo
ZSBzdGF0aWMgcmF0ZSBpbmRleCBpZiB0aGUgbG9va3VwIGlzIHN1Y2Nlc3NmdWwuCisJCSAqLwor
CQlzYW4tPnN0YXRpY19yaXggPSBzYW1wbGVfZ2V0X3N0YXRpY19yaXgobmkpOworCX0gZWxzZSB7
CisJCXNhbi0+c3RhdGljX3JpeCA9IC0xOworCX0KK30KKworLyoKKyAqIFBpY2sgYSBub24tSFQg
cmF0ZSB0byBiZWdpbiB1c2luZy4KKyAqLworc3RhdGljIGludAorc2FtcGxlX3BpY2tfc2VlZF9y
YXRlX2xlZ2FjeShjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5pLCBpbnQgZnJhbWVMZW4p
Cit7CisjZGVmaW5lCURPVDExUkFURShpeCkJKHJ0LT5pbmZvW2l4XS5kb3QxMVJhdGUgJiBJRUVF
ODAyMTFfUkFURV9WQUwpCisJc3RydWN0IGllZWU4MDIxMXZhcCAqdmFwID0gbmktPm5pX3ZhcDsK
KwlzdHJ1Y3QgaWVlZTgwMjExX3NhbXBsZV9ub2RlICpzYW4gPSBuaS0+bmlfcmN0bHM7CisJY29u
c3Qgc3RydWN0IGllZWU4MDIxMV9yYXRlX3RhYmxlICpydCA9IGllZWU4MDIxMV9nZXRfcmF0ZXRh
YmxlKHZhcC0+aXZfaWMtPmljX2N1cmNoYW4pOworCQorCWNvbnN0IGludCBzaXplX2JpbiA9IHNp
emVfdG9fYmluKGZyYW1lTGVuKTsKKwlpbnQgcml4ID0gLTE7CisKKwkvKiBubyBwYWNrZXQgaGFz
IGJlZW4gc2VudCBzdWNjZXNzZnVsbHkgeWV0ICovCisJZm9yIChyaXggPSBydC0+cmF0ZUNvdW50
LTE7IHJpeCA+IDA7IHJpeC0tKSB7CisJCWlmICgoc2FuLT5yYXRlbWFzayAmICgodWludDY0X3Qp
IDE8PHJpeCkpID09IDApCisJCQljb250aW51ZTsKKworCQkvKiBTa2lwIEhUIHJhdGVzICovCisJ
CWlmIChydC0+aW5mb1tyaXhdLnBoeSA9PSBJRUVFODAyMTFfVF9IVCkKKwkJCWNvbnRpbnVlOwor
CisJCS8qCisJCSAqIFBpY2sgdGhlIGhpZ2hlc3QgcmF0ZSA8PSAzNiBNYnBzCisJCSAqIHRoYXQg
aGFzbid0IGZhaWxlZC4KKwkJICovCisJCWlmIChET1QxMVJBVEUocml4KSA8PSA3MiAmJgorCQkg
ICAgc2FuLT5zdGF0c1tzaXplX2Jpbl1bcml4XS5zdWNjZXNzaXZlX2ZhaWx1cmVzID09IDApIHsK
KwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiByaXg7CisjdW5kZWYgRE9UMTFSQVRFCit9CisK
Ky8qCisgKiBQaWNrIGEgSFQgcmF0ZSB0byBiZWdpbiB1c2luZy4KKyAqCisgKiBEb24ndCB1c2Ug
YW55IG5vbi1IVCByYXRlczsgb25seSBjb25zaWRlciBIVCByYXRlcy4KKyAqLworc3RhdGljIGlu
dAorc2FtcGxlX3BpY2tfc2VlZF9yYXRlX2h0KGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfbm9kZSAq
bmksIGludCBmcmFtZUxlbikKK3sKKyNkZWZpbmUJTUNTKGl4KQkJKHJ0LT5pbmZvW2l4XS5kb3Qx
MVJhdGUgfCBJRUVFODAyMTFfUkFURV9NQ1MpCisJc3RydWN0IGllZWU4MDIxMXZhcCAqdmFwID0g
bmktPm5pX3ZhcDsKKwlzdHJ1Y3QgaWVlZTgwMjExX3NhbXBsZV9ub2RlICpzYW4gPSBuaS0+bmlf
cmN0bHM7CisJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yYXRlX3RhYmxlICpydCA9IGllZWU4MDIx
MV9nZXRfcmF0ZXRhYmxlKHZhcC0+aXZfaWMtPmljX2N1cmNoYW4pOworCQorCWNvbnN0IGludCBz
aXplX2JpbiA9IHNpemVfdG9fYmluKGZyYW1lTGVuKTsKKwlpbnQgcml4ID0gLTEsIGh0X3JpeCA9
IC0xOworCisJLyogbm8gcGFja2V0IGhhcyBiZWVuIHNlbnQgc3VjY2Vzc2Z1bGx5IHlldCAqLwor
CWZvciAocml4ID0gcnQtPnJhdGVDb3VudC0xOyByaXggPiAwOyByaXgtLSkgeworCQkvKiBTa2lw
IHJhdGVzIHdlIGNhbid0IHVzZSAqLworCQlpZiAoKHNhbi0+cmF0ZW1hc2sgJiAoKHVpbnQ2NF90
KSAxPDxyaXgpKSA9PSAwKQorCQkJY29udGludWU7CisKKwkJLyogS2VlcCBhIGNvcHkgb2YgdGhl
IGxhc3Qgc2VlbiBIVCByYXRlIGluZGV4ICovCisJCWlmIChydC0+aW5mb1tyaXhdLnBoeSA9PSBJ
RUVFODAyMTFfVF9IVCkKKwkJCWh0X3JpeCA9IHJpeDsKKworCQkvKiBTa2lwIG5vbi1IVCByYXRl
cyAqLworCQlpZiAocnQtPmluZm9bcml4XS5waHkgIT0gSUVFRTgwMjExX1RfSFQpCisJCQljb250
aW51ZTsKKworCQkvKgorCQkgKiBQaWNrIGEgbWVkaXVtLXNwZWVkIHJhdGUgcmVnYXJkbGVzcyBv
ZiBzdHJlYW0gY291bnQKKwkJICogd2hpY2ggaGFzIG5vdCBzZWVuIGFueSBmYWlsdXJlcy4gSGln
aGVyIHJhdGVzIG1heSBmYWlsOworCQkgKiB3ZSdsbCB0cnkgdGhlbSBsYXRlci4KKwkJICovCisJ
CWlmICgoKE1DUyhyaXgpICYgMHg3KSA8PSA0KSAmJgorCQkgICAgc2FuLT5zdGF0c1tzaXplX2Jp
bl1bcml4XS5zdWNjZXNzaXZlX2ZhaWx1cmVzID09IDApIHsKKwkJCWJyZWFrOworCQl9CisJfQor
CisJLyoKKwkgKiBJZiBhbGwgdGhlIE1DUyByYXRlcyBoYXZlIHN1Y2Nlc3NpdmUgZmFpbHVyZXMs
IHJpeCBzaG91bGQgYmUKKwkgKiA+IDA7IG90aGVyd2lzZSB1c2UgdGhlIGxvd2VzdCBNQ1Mgcml4
IChob3BlZnVsbHkgTUNTIDAuKQorCSAqLworCXJldHVybiBNQVgocml4LCBodF9yaXgpOworI3Vu
ZGVmIE1DUworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yYXRlc2V0ICoKK3Nh
bXBsZV9nZXRfcmF0ZXNldChjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5pKQoreworCWNv
bnN0IHN0cnVjdCBpZWVlODAyMTFfcmF0ZXNldCAqcnMgPSBOVUxMOworCS8qIDExbiBvciBub3Q/
IFBpY2sgdGhlIHJpZ2h0IHJhdGVzZXQgKi8KKwlpZiAoc2FtcGxlX25vZGVfaXNfMTFuKG5pKSkg
eworCQkvKiBYWFggZXcgKi8KKwkJSUVFRTgwMjExX05PVEUobmktPm5pX3ZhcCwgSUVFRTgwMjEx
X01TR19SQVRFQ1RMLCBuaSwKKwkJICAgICIlczogMTFuIG5vZGUiLCBfX2Z1bmNfXyk7CisJCXJz
ID0gKHN0cnVjdCBpZWVlODAyMTFfcmF0ZXNldCAqKSAmbmktPm5pX2h0cmF0ZXM7CisJfSBlbHNl
IHsKKwkJSUVFRTgwMjExX05PVEUobmktPm5pX3ZhcCwgSUVFRTgwMjExX01TR19SQVRFQ1RMLCBu
aSwKKwkJICAgICIlczogbm9uLTExbiBub2RlIiwgX19mdW5jX18pOworCQlycyA9ICZuaS0+bmlf
cmF0ZXM7CisJfQorCXJldHVybiByczsKK30KKworc3RhdGljIGludAorc2FtcGxlX3JhdGUoc3Ry
dWN0IGllZWU4MDIxMV9ub2RlICpuaSwgdm9pZCAqYXJnIF9fdW51c2VkLCB1aW50MzJfdCBpYXJn
IF9fdW51c2VkKQoreworI2RlZmluZQlET1QxMVJBVEUoaXgpCShydC0+aW5mb1tpeF0uZG90MTFS
YXRlICYgSUVFRTgwMjExX1JBVEVfVkFMKQorI2RlZmluZQlNQ1MoaXgpCQkocnQtPmluZm9baXhd
LmRvdDExUmF0ZSB8IElFRUU4MDIxMV9SQVRFX01DUykKKyNkZWZpbmUJUkFURShpeCkJKERPVDEx
UkFURShpeCkgLyAyKQorCXN0cnVjdCBpZWVlODAyMTF2YXAgKnZhcCA9IG5pLT5uaV92YXA7CisJ
c3RydWN0IGllZWU4MDIxMV9zYW1wbGVfbm9kZSAqc2FuID0gbmktPm5pX3JjdGxzOworCXN0cnVj
dCBpZWVlODAyMTFfc2FtcGxlICpzYW1wbGUgPSBzYW4tPnNhbl9zYW1wbGU7CisJY29uc3Qgc3Ry
dWN0IGllZWU4MDIxMV9yYXRlX3RhYmxlICpydCA9IGllZWU4MDIxMV9nZXRfcmF0ZXRhYmxlKHZh
cC0+aXZfaWMtPmljX2N1cmNoYW4pOworCQorCWludCByaXgsIG1yciwgYmVzdF9yaXgsIGNoYW5n
ZV9yYXRlczsKKwl1bnNpZ25lZCBhdmVyYWdlX3R4X3RpbWU7CisJCisJc2l6ZV90IGZyYW1lTGVu
ID0gKHNpemVfdClpYXJnOworCWNvbnN0IGludCBzaXplX2JpbiA9IHNpemVfdG9fYmluKGZyYW1l
TGVuKTsKKworCXNhbXBsZV91cGRhdGVfc3RhdGljX3JpeChuaSk7CisKKwlpZiAoc2FuLT5zdGF0
aWNfcml4ICE9IC0xKSB7CisJCXJpeCA9IHNhbi0+c3RhdGljX3JpeDsKKwkJZ290byBkb25lOwor
CX0KKworCWlmICh2YXAtPml2X3JhdGUtPmlyX2NhcGFiaWxpdGllcyAmIElFRUU4MDIxMV9SQVRF
Q1RMX0NBUF9NUlIpCisJCW1yciA9IDE7CisJaWYgKCEodmFwLT5pdl9yYXRlLT5pcl9jYXBhYmls
aXRpZXMgJiBJRUVFODAyMTFfUkFURUNUTF9DQVBfTVJSUFJPVCkpCisJCW1yciA9IDA7CisKKwli
ZXN0X3JpeCA9IHBpY2tfYmVzdF9yYXRlKG5pLCBydCwgc2l6ZV9iaW4sICFtcnIpOworCWlmIChi
ZXN0X3JpeCA+PSAwKSB7CisJCWF2ZXJhZ2VfdHhfdGltZSA9IHNhbi0+c3RhdHNbc2l6ZV9iaW5d
W2Jlc3Rfcml4XS5hdmVyYWdlX3R4X3RpbWU7CisJfSBlbHNlIHsKKwkJYXZlcmFnZV90eF90aW1l
ID0gMDsKKwl9CisKKwkvKgorCSAqIExpbWl0IHRoZSB0aW1lIG1lYXN1cmluZyB0aGUgcGVyZm9y
bWFuY2Ugb2Ygb3RoZXIgdHgKKwkgKiByYXRlcyB0byBzYW1wbGVfcmF0ZSUgb2YgdGhlIHRvdGFs
IHRyYW5zbWlzc2lvbiB0aW1lLgorCSAqLworCWlmIChzYW4tPnNhbXBsZV90dFtzaXplX2Jpbl0g
PCBhdmVyYWdlX3R4X3RpbWUgKiAoc2FuLT5wYWNrZXRzX3NpbmNlX3NhbXBsZVtzaXplX2Jpbl0g
KgorCQlzYW1wbGUtPnNhbXBsZV9yYXRlLzEwMCkpIHsKKwkJcml4ID0gcGlja19zYW1wbGVfcmF0
ZShuaSwgcnQsIHNpemVfYmluKTsKKwkJSUVFRTgwMjExX05PVEUodmFwLCBJRUVFODAyMTFfTVNH
X1JBVEVDVEwsCisJCSAgICAgJm5pLCAiYXR0ICVkIHNhbXBsZV90dCAlZCBzaXplICV1IHNhbXBs
ZSByYXRlICVkICVzIGN1cnJlbnQgcmF0ZSAlZCAlcyIsCisJCSAgICAgYXZlcmFnZV90eF90aW1l
LAorCQkgICAgIHNhbi0+c2FtcGxlX3R0W3NpemVfYmluXSwKKwkJICAgICBiaW5fdG9fc2l6ZShz
aXplX2JpbiksCisJCSAgICAgZG90MTFyYXRlKHJ0LCByaXgpLAorCQkgICAgIGRvdDExcmF0ZV9s
YWJlbChydCwgcml4KSwKKwkJICAgICBkb3QxMXJhdGUocnQsIHNhbi0+Y3VycmVudF9yaXhbc2l6
ZV9iaW5dKSwKKwkJICAgICBkb3QxMXJhdGVfbGFiZWwocnQsIHNhbi0+Y3VycmVudF9yaXhbc2l6
ZV9iaW5dKSk7CisJCWlmIChyaXggIT0gc2FuLT5jdXJyZW50X3JpeFtzaXplX2Jpbl0pIHsKKwkJ
CXNhbi0+Y3VycmVudF9zYW1wbGVfcml4W3NpemVfYmluXSA9IHJpeDsKKwkJfSBlbHNlIHsKKwkJ
CXNhbi0+Y3VycmVudF9zYW1wbGVfcml4W3NpemVfYmluXSA9IC0xOworCQl9CisJCXNhbi0+cGFj
a2V0c19zaW5jZV9zYW1wbGVbc2l6ZV9iaW5dID0gMDsKKwl9IGVsc2UgeworCQljaGFuZ2VfcmF0
ZXMgPSAwOworCQlpZiAoIXNhbi0+cGFja2V0c19zZW50W3NpemVfYmluXSB8fCBiZXN0X3JpeCA9
PSAtMSkgeworCQkJLyogbm8gcGFja2V0IGhhcyBiZWVuIHNlbnQgc3VjY2Vzc2Z1bGx5IHlldCAq
LworCQkJY2hhbmdlX3JhdGVzID0gMTsKKwkJCWlmIChuaS0+bmlfZmxhZ3MgJiBJRUVFODAyMTFf
Tk9ERV9IVCkKKwkJCQliZXN0X3JpeCA9IHNhbXBsZV9waWNrX3NlZWRfcmF0ZV9odChuaSwgZnJh
bWVMZW4pOworCQkJZWxzZQorCQkJCWJlc3Rfcml4ID0gc2FtcGxlX3BpY2tfc2VlZF9yYXRlX2xl
Z2FjeShuaSwgZnJhbWVMZW4pOworCQl9IGVsc2UgaWYgKHNhbi0+cGFja2V0c19zZW50W3NpemVf
YmluXSA8IDIwKSB7CisJCQkvKiBsZXQgdGhlIGJpdC1yYXRlIHN3aXRjaCBxdWlja2x5IGR1cmlu
ZyB0aGUgZmlyc3QgZmV3IHBhY2tldHMgKi8KKwkJCUlFRUU4MDIxMV9OT1RFKHZhcCwKKwkJCSAg
ICBJRUVFODAyMTFfTVNHX1JBVEVDVEwsICZuaSwKKwkJCSAgICAiJXM6IHN3aXRjaGluZyBxdWlj
a2x5Li4iLCBfX2Z1bmNfXyk7CisJCQljaGFuZ2VfcmF0ZXMgPSAxOworCQl9IGVsc2UgaWYgKHRp
Y2tzIC0gc2FtcGxlLT5zYW1wbGVfbWluX3N3aXRjaCA+IHNhbi0+dGlja3Nfc2luY2Vfc3dpdGNo
W3NpemVfYmluXSkgeworCQkJLyogbWluX3N3aXRjaCBzZWNvbmRzIGhhdmUgZ29uZSBieSAqLwor
CQkJSUVFRTgwMjExX05PVEUodmFwLAorCQkJICAgIElFRUU4MDIxMV9NU0dfUkFURUNUTCwgJm5p
LAorCQkJICAgICIlczogbWluX3N3aXRjaCAlZCA+IHRpY2tzX3NpbmNlX3N3aXRjaCAlZC4uIiwK
KwkJCSAgICBfX2Z1bmNfXywgdGlja3MgLSBzYW1wbGUtPnNhbXBsZV9taW5fc3dpdGNoLCBzYW4t
PnRpY2tzX3NpbmNlX3N3aXRjaFtzaXplX2Jpbl0pOworCQkJY2hhbmdlX3JhdGVzID0gMTsKKwkJ
fSBlbHNlIGlmICgoISAobmktPm5pX2ZsYWdzICYgSUVFRTgwMjExX05PREVfSFQpKSAmJgorCQkg
ICAgKDIqYXZlcmFnZV90eF90aW1lIDwgc2FuLT5zdGF0c1tzaXplX2Jpbl1bc2FuLT5jdXJyZW50
X3JpeFtzaXplX2Jpbl1dLmF2ZXJhZ2VfdHhfdGltZSkpIHsKKwkJCS8qIHRoZSBjdXJyZW50IGJp
dC1yYXRlIGlzIHR3aWNlIGFzIHNsb3cgYXMgdGhlIGJlc3Qgb25lICovCisJCQlJRUVFODAyMTFf
Tk9URSh2YXAsCisJCQkgICAgSUVFRTgwMjExX01TR19SQVRFQ1RMLCAmbmksCisJCQkgICAgIiVz
OiAyeCBhdHQgKD0gJWQpIDwgY3VyX3JpeCBhdHQgJWQiLAorCQkJICAgIF9fZnVuY19fLAorCQkJ
ICAgIDIgKiBhdmVyYWdlX3R4X3RpbWUsIHNhbi0+c3RhdHNbc2l6ZV9iaW5dW3Nhbi0+Y3VycmVu
dF9yaXhbc2l6ZV9iaW5dXS5hdmVyYWdlX3R4X3RpbWUpOworCQkJY2hhbmdlX3JhdGVzID0gMTsK
KwkJfSBlbHNlIGlmICgobmktPm5pX2ZsYWdzICYgSUVFRTgwMjExX05PREVfSFQpKSB7CisJCQlp
bnQgY3VyX3JpeCA9IHNhbi0+Y3VycmVudF9yaXhbc2l6ZV9iaW5dOworCQkJaW50IGN1cl9hdHQg
PSBzYW4tPnN0YXRzW3NpemVfYmluXVtjdXJfcml4XS5hdmVyYWdlX3R4X3RpbWU7CisJCQkvKgor
CQkJICogSWYgdGhlIG5vZGUgaXMgSFQsIHVwZ3JhZGUgaXQgaWYgdGhlIE1DUyByYXRlIGlzCisJ
CQkgKiBoaWdoZXIgYW5kIHRoZSBhdmVyYWdlIHR4IHRpbWUgaXMgd2l0aGluIDIwJSBvZgorCQkJ
ICogdGhlIGN1cnJlbnQgcmF0ZS4gSXQgY2FuIGZhaWwgYSBsaXR0bGUuCisJCQkgKgorCQkJICog
VGhpcyBpcyBsaWtlbHkgbm90IG9wdGltYWwhCisJCQkgKi8KKyNpZiAwCisJCQlwcmludGYoImN1
ciByaXgvYXR0ICV4LyVkLCBiZXN0IHJpeC9hdHQgJXgvJWRcbiIsCisJCQkgICAgTUNTKGN1cl9y
aXgpLCBjdXJfYXR0LCBNQ1MoYmVzdF9yaXgpLCBhdmVyYWdlX3R4X3RpbWUpOworI2VuZGlmCisJ
CQlpZiAoKE1DUyhiZXN0X3JpeCkgPiBNQ1MoY3VyX3JpeCkpICYmCisJCQkgICAgKGF2ZXJhZ2Vf
dHhfdGltZSAqIDgpIDw9IChjdXJfYXR0ICogMTApKSB7CisJCQkJSUVFRTgwMjExX05PVEUodmFw
LAorCQkJCSAgICBJRUVFODAyMTFfTVNHX1JBVEVDVEwsICZuaSwKKwkJCQkgICAgIiVzOiBIVDog
YmVzdF9yaXggMHglZCA+IGN1cl9yaXggMHgleCwgYXZlcmFnZV90eF90aW1lICVkLCBjdXJfYXR0
ICVkIiwKKwkJCQkgICAgX19mdW5jX18sCisJCQkJICAgIE1DUyhiZXN0X3JpeCksIE1DUyhjdXJf
cml4KSwgYXZlcmFnZV90eF90aW1lLCBjdXJfYXR0KTsKKwkJCQljaGFuZ2VfcmF0ZXMgPSAxOwor
CQkJfQorCQl9CisKKwkJc2FuLT5wYWNrZXRzX3NpbmNlX3NhbXBsZVtzaXplX2Jpbl0rKzsKKwkJ
CisJCWlmIChjaGFuZ2VfcmF0ZXMpIHsKKwkJCWlmIChiZXN0X3JpeCAhPSBzYW4tPmN1cnJlbnRf
cml4W3NpemVfYmluXSkgeworCQkJCUlFRUU4MDIxMV9OT1RFKHZhcCwKKwkJCQkgICAgSUVFRTgw
MjExX01TR19SQVRFQ1RMLAorCQkJCSAgICAmbmksCisiJXM6IHNpemUgJWQgc3dpdGNoIHJhdGUg
JWQgKCVkLyVkKSAtPiAlZCAoJWQvJWQpIGFmdGVyICVkIHBhY2tldHMgbXJyICVkIiwKKwkJCQkg
ICAgX19mdW5jX18sCisJCQkJICAgIGJpbl90b19zaXplKHNpemVfYmluKSwKKwkJCQkgICAgUkFU
RShzYW4tPmN1cnJlbnRfcml4W3NpemVfYmluXSksCisJCQkJICAgIHNhbi0+c3RhdHNbc2l6ZV9i
aW5dW3Nhbi0+Y3VycmVudF9yaXhbc2l6ZV9iaW5dXS5hdmVyYWdlX3R4X3RpbWUsCisJCQkJICAg
IHNhbi0+c3RhdHNbc2l6ZV9iaW5dW3Nhbi0+Y3VycmVudF9yaXhbc2l6ZV9iaW5dXS5wZXJmZWN0
X3R4X3RpbWUsCisJCQkJICAgIFJBVEUoYmVzdF9yaXgpLAorCQkJCSAgICBzYW4tPnN0YXRzW3Np
emVfYmluXVtiZXN0X3JpeF0uYXZlcmFnZV90eF90aW1lLAorCQkJCSAgICBzYW4tPnN0YXRzW3Np
emVfYmluXVtiZXN0X3JpeF0ucGVyZmVjdF90eF90aW1lLAorCQkJCSAgICBzYW4tPnBhY2tldHNf
c2luY2Vfc3dpdGNoW3NpemVfYmluXSwKKwkJCQkgICAgbXJyKTsKKwkJCX0KKwkJCXNhbi0+cGFj
a2V0c19zaW5jZV9zd2l0Y2hbc2l6ZV9iaW5dID0gMDsKKwkJCXNhbi0+Y3VycmVudF9yaXhbc2l6
ZV9iaW5dID0gYmVzdF9yaXg7CisJCQlzYW4tPnRpY2tzX3NpbmNlX3N3aXRjaFtzaXplX2Jpbl0g
PSB0aWNrczsKKwkJCS8qIAorCQkJICogU2V0IHRoZSB2aXNpYmxlIHR4cmF0ZSBmb3IgdGhpcyBu
b2RlLgorCQkJICovCisJCQluaS0+bmlfdHhyYXRlID0gZG90MTFyYXRlKHJ0LCBiZXN0X3JpeCk7
CisJCX0KKwkJcml4ID0gc2FuLT5jdXJyZW50X3JpeFtzaXplX2Jpbl07CisJCXNhbi0+cGFja2V0
c19zaW5jZV9zd2l0Y2hbc2l6ZV9iaW5dKys7CisJfQorCS8vICp0cnkwID0gbXJyID8gc2FuLT5z
Y2hlZFtyaXhdLnQwIDogQVRIX1RYTUFYVFJZOworZG9uZToKKworCS8qCisJICogVGhpcyBidWcg
dG90YWxseSBzdWNrcyBhbmQgc2hvdWxkIGJlIGZpeGVkLgorCSAqCisJICogRm9yIG5vdyB0aG91
Z2gsIGxldCdzIG5vdCBwYW5pYywgc28gd2UgY2FuIHN0YXJ0IHRvIGZpZ3VyZQorCSAqIG91dCBo
b3cgdG8gYmV0dGVyIHJlcHJvZHVjZSBpdC4KKwkgKi8KKwlpZiAocml4IDwgMCB8fCByaXggPj0g
cnQtPnJhdGVDb3VudCkgeworCQlwcmludGYoIiVzOiBFUlJPUjogcml4ICVkIG91dCBvZiBib3Vu
ZHMgKHJhdGVDb3VudD0lZClcbiIsCisJCSAgICBfX2Z1bmNfXywKKwkJICAgIHJpeCwKKwkJICAg
IHJ0LT5yYXRlQ291bnQpOworCQkgICAgcml4ID0gMDsJLyogWFhYIGp1c3QgZGVmYXVsdCBmb3Ig
bm93ICovCisJfQorCUtBU1NFUlQocml4ID49IDAgJiYgcml4IDwgcnQtPnJhdGVDb3VudCwgKCJy
aXggaXMgJWQiLCByaXgpKTsKKworCS8vICpyaXgwID0gcml4OworCS8vICp0eHJhdGUgPSBydC0+
aW5mb1tyaXhdLnJhdGVDb2RlCisJLy8gCXwgKHNob3J0UHJlYW1ibGUgPyBydC0+aW5mb1tyaXhd
LnNob3J0UHJlYW1ibGUgOiAwKTsKKwlzYW4tPnBhY2tldHNfc2VudFtzaXplX2Jpbl0rKzsKKwor
CXJldHVybiByaXg7CisjdW5kZWYgRE9UMTFSQVRFCisjdW5kZWYgTUNTCisjdW5kZWYgUkFURQor
fQorCitzdGF0aWMgdm9pZAorc2FtcGxlX3JhdGVzKHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqbmks
IHN0cnVjdCBpZWVlODAyMTFfcmNfaW5mbyAqcmNfaW5mbykKK3sKKwlzdHJ1Y3QgaWVlZTgwMjEx
X3NhbXBsZV9ub2RlICpzYW4gPSBuaS0+bmlfcmN0bHM7CisJdWludDhfdCByaXgwID0gc2FtcGxl
X3JhdGUobmksIE5VTEwsIDApOworCWNvbnN0IHN0cnVjdCB0eHNjaGVkdWxlICpzY2hlZCA9ICZz
YW4tPnNjaGVkW3JpeDBdOworCXN0cnVjdCBpZWVlODAyMTFfcmNfc2VyaWVzICpyYyA9IHJjX2lu
Zm8tPnJpX3JjOworCisJS0FTU0VSVChyaXgwID09IHNjaGVkLT5yMCwgKCJyaXgwICgleCkgIT0g
c2NoZWQtPnIwICgleCkhXG4iLAorCSAgICByaXgwLCBzY2hlZC0+cjApKTsKKwkvKiBYWFggKi8K
KwlyY1swXS5mbGFncyA9IHJjWzFdLmZsYWdzID0gcmNbMl0uZmxhZ3MgPSByY1szXS5mbGFncyA9
IDA7CisKKwlyY1swXS5yaXggPSBzY2hlZC0+cjA7CisJcmNbMV0ucml4ID0gc2NoZWQtPnIxOwor
CXJjWzJdLnJpeCA9IHNjaGVkLT5yMjsKKwlyY1szXS5yaXggPSBzY2hlZC0+cjM7CisKKwlyY1sw
XS50cmllcyA9IHNjaGVkLT50MDsKKwlyY1sxXS50cmllcyA9IHNjaGVkLT50MTsKKwlyY1syXS50
cmllcyA9IHNjaGVkLT50MjsKKwlyY1szXS50cmllcyA9IHNjaGVkLT50MzsKK30KKworc3RhdGlj
IHZvaWQKK3VwZGF0ZV9zdGF0cyhjb25zdCBzdHJ1Y3QgaWVlZTgwMjExdmFwICp2YXAsCisgICAg
CSAgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9ub2RlICpuaSwKKwkJICBpbnQgZnJhbWVfc2l6ZSwK
KwkJICBpbnQgcml4MCwgaW50IHRyaWVzMCwKKwkJICBpbnQgcml4MSwgaW50IHRyaWVzMSwKKwkJ
ICBpbnQgcml4MiwgaW50IHRyaWVzMiwKKwkJICBpbnQgcml4MywgaW50IHRyaWVzMywKKwkJICBp
bnQgc2hvcnRfdHJpZXMsIGludCB0cmllcywKKwkJICBpbnQgbmZyYW1lcywgaW50IG5iYWQpCit7
CisJc3RydWN0IGllZWU4MDIxMV9zYW1wbGVfbm9kZSAqc2FuID0gbmktPm5pX3JjdGxzOworCXN0
cnVjdCBpZWVlODAyMTFfc2FtcGxlICpzYW1wbGUgPSBzYW4tPnNhbl9zYW1wbGU7CisKKwljb25z
dCBpbnQgc2l6ZV9iaW4gPSBzaXplX3RvX2JpbihmcmFtZV9zaXplKTsKKwljb25zdCBpbnQgc2l6
ZSA9IGJpbl90b19zaXplKHNpemVfYmluKTsKKworCWludCBpc19odDQwID0gaWVlZTgwMjExX3Jh
dGVjdGxfaGFzY2FwX2N3NDAodmFwLCBuaSk7CisJaW50IHR0LCB0cmllc19zb19mYXI7CisJaW50
IHBjdDsKKworCWlmICghSVNfUkFURV9ERUZJTkVEKHNhbiwgcml4MCkpCisJCXJldHVybjsKKwl0
dCA9IGNhbGNfdXNlY3NfdW5pY2FzdF9wYWNrZXQodmFwLCBzaXplLCByaXgwLCBzaG9ydF90cmll
cywKKwkJTUlOKHRyaWVzMCwgdHJpZXMpIC0gMSwgaXNfaHQ0MCk7CisJdHJpZXNfc29fZmFyID0g
dHJpZXMwOworCisJaWYgKHRyaWVzMSAmJiB0cmllc19zb19mYXIgPCB0cmllcykgeworCQlpZiAo
IUlTX1JBVEVfREVGSU5FRChzYW4sIHJpeDEpKQorCQkJcmV0dXJuOworCQl0dCArPSBjYWxjX3Vz
ZWNzX3VuaWNhc3RfcGFja2V0KHZhcCwgc2l6ZSwgcml4MSwgc2hvcnRfdHJpZXMsCisJCQlNSU4o
dHJpZXMxICsgdHJpZXNfc29fZmFyLCB0cmllcykgLSB0cmllc19zb19mYXIgLSAxLCBpc19odDQw
KTsKKwkJdHJpZXNfc29fZmFyICs9IHRyaWVzMTsKKwl9CisKKwlpZiAodHJpZXMyICYmIHRyaWVz
X3NvX2ZhciA8IHRyaWVzKSB7CisJCWlmICghSVNfUkFURV9ERUZJTkVEKHNhbiwgcml4MikpCisJ
CQlyZXR1cm47CisJCXR0ICs9IGNhbGNfdXNlY3NfdW5pY2FzdF9wYWNrZXQodmFwLCBzaXplLCBy
aXgyLCBzaG9ydF90cmllcywKKwkJCU1JTih0cmllczIgKyB0cmllc19zb19mYXIsIHRyaWVzKSAt
IHRyaWVzX3NvX2ZhciAtIDEsIGlzX2h0NDApOworCQl0cmllc19zb19mYXIgKz0gdHJpZXMyOwor
CX0KKworCWlmICh0cmllczMgJiYgdHJpZXNfc29fZmFyIDwgdHJpZXMpIHsKKwkJaWYgKCFJU19S
QVRFX0RFRklORUQoc2FuLCByaXgzKSkKKwkJCXJldHVybjsKKwkJdHQgKz0gY2FsY191c2Vjc191
bmljYXN0X3BhY2tldCh2YXAsIHNpemUsIHJpeDMsIHNob3J0X3RyaWVzLAorCQkJTUlOKHRyaWVz
MyArIHRyaWVzX3NvX2ZhciwgdHJpZXMpIC0gdHJpZXNfc29fZmFyIC0gMSwgaXNfaHQ0MCk7CisJ
fQorCisJaWYgKHNhbi0+c3RhdHNbc2l6ZV9iaW5dW3JpeDBdLnRvdGFsX3BhY2tldHMgPCBzYW1w
bGUtPnNhbnBsZV9zbW9vdGhpbmdfbWlucGFja2V0cykgeworCQkvKiBqdXN0IGF2ZXJhZ2UgdGhl
IGZpcnN0IGZldyBwYWNrZXRzICovCisJCWludCBhdmdfdHggPSBzYW4tPnN0YXRzW3NpemVfYmlu
XVtyaXgwXS5hdmVyYWdlX3R4X3RpbWU7CisJCWludCBwYWNrZXRzID0gc2FuLT5zdGF0c1tzaXpl
X2Jpbl1bcml4MF0udG90YWxfcGFja2V0czsKKwkJc2FuLT5zdGF0c1tzaXplX2Jpbl1bcml4MF0u
YXZlcmFnZV90eF90aW1lID0gKHR0KyhhdmdfdHgqcGFja2V0cykpLyhwYWNrZXRzK25mcmFtZXMp
OworCX0gZWxzZSB7CisJCS8qIHVzZSBhIGV3bWEgKi8KKwkJc2FuLT5zdGF0c1tzaXplX2Jpbl1b
cml4MF0uYXZlcmFnZV90eF90aW1lID0gCisJCQkoKHNhbi0+c3RhdHNbc2l6ZV9iaW5dW3JpeDBd
LmF2ZXJhZ2VfdHhfdGltZSAqIHNhbXBsZS0+c2FucGxlX3Ntb290aGluZ19yYXRlKSArIAorCQkJ
ICh0dCAqICgxMDAgLSBzYW1wbGUtPnNhbnBsZV9zbW9vdGhpbmdfcmF0ZSkpKSAvIDEwMDsKKwl9
CisJCisJLyoKKwkgKiBYWFggRG9uJ3QgbWFyayB0aGUgaGlnaGVyIGJpdCByYXRlcyBhcyBhbHNv
IGhhdmluZyBmYWlsZWQ7IGFzIHRoaXMKKwkgKiB1bmZvcnR1bmF0ZWx5IHN0b3BzIHRob3NlIHJh
dGVzIGZyb20gYmVpbmcgdGFzdGVkIHdoZW4gdHJ5aW5nIHRvCisJICogVFguIFRoaXMgaGFwcGVu
cyB3aXRoIDExbiBhZ2dyZWdhdGlvbi4KKwkgKi8KKwlpZiAobmZyYW1lcyA9PSBuYmFkKSB7CisJ
CXNhbi0+c3RhdHNbc2l6ZV9iaW5dW3JpeDBdLnN1Y2Nlc3NpdmVfZmFpbHVyZXMgKz0gbmJhZDsK
KworCX0gZWxzZSB7CisJCXNhbi0+c3RhdHNbc2l6ZV9iaW5dW3JpeDBdLnBhY2tldHNfYWNrZWQg
Kz0gKG5mcmFtZXMgLSBuYmFkKTsKKwkJc2FuLT5zdGF0c1tzaXplX2Jpbl1bcml4MF0uc3VjY2Vz
c2l2ZV9mYWlsdXJlcyA9IDA7CisJfQorCXNhbi0+c3RhdHNbc2l6ZV9iaW5dW3JpeDBdLnRyaWVz
ICs9IHRyaWVzOworCXNhbi0+c3RhdHNbc2l6ZV9iaW5dW3JpeDBdLmxhc3RfdHggPSB0aWNrczsK
KwlzYW4tPnN0YXRzW3NpemVfYmluXVtyaXgwXS50b3RhbF9wYWNrZXRzICs9IG5mcmFtZXM7CisK
KwkvKiB1cGRhdGUgRVdNQSBmb3IgdGhpcyByaXggKi8KKworCS8qIENhbGN1bGF0ZSBwZXJjZW50
YWdlIGJhc2VkIG9uIGN1cnJlbnQgcmF0ZSAqLworCWlmIChuZnJhbWVzID09IDApCisJCW5mcmFt
ZXMgPSBuYmFkID0gMTsKKwlwY3QgPSAoKG5mcmFtZXMgLSBuYmFkKSAqIDEwMDApIC8gbmZyYW1l
czsKKworCWlmIChzYW4tPnN0YXRzW3NpemVfYmluXVtyaXgwXS50b3RhbF9wYWNrZXRzIDwKKwkg
ICAgc2FtcGxlLT5zYW5wbGVfc21vb3RoaW5nX21pbnBhY2tldHMpIHsKKwkJLyoganVzdCBhdmVy
YWdlIHRoZSBmaXJzdCBmZXcgcGFja2V0cyAqLworCQlpbnQgYV9wY3QgPSAoc2FuLT5zdGF0c1tz
aXplX2Jpbl1bcml4MF0ucGFja2V0c19hY2tlZCAqIDEwMDApIC8KKwkJICAgIChzYW4tPnN0YXRz
W3NpemVfYmluXVtyaXgwXS50b3RhbF9wYWNrZXRzKTsKKwkJc2FuLT5zdGF0c1tzaXplX2Jpbl1b
cml4MF0uZXdtYV9wY3QgPSBhX3BjdDsKKwl9IGVsc2UgeworCQkvKiB1c2UgYSBld21hICovCisJ
CXNhbi0+c3RhdHNbc2l6ZV9iaW5dW3JpeDBdLmV3bWFfcGN0ID0KKwkJCSgoc2FuLT5zdGF0c1tz
aXplX2Jpbl1bcml4MF0uZXdtYV9wY3QgKiBzYW1wbGUtPnNhbnBsZV9zbW9vdGhpbmdfcmF0ZSkg
KworCQkJIChwY3QgKiAoMTAwIC0gc2FtcGxlLT5zYW5wbGVfc21vb3RoaW5nX3JhdGUpKSkgLyAx
MDA7CisJfQorCisJaWYgKHJpeDAgPT0gc2FuLT5jdXJyZW50X3NhbXBsZV9yaXhbc2l6ZV9iaW5d
KSB7CisJCXNhbi0+c2FtcGxlX3R0W3NpemVfYmluXSA9IHR0OworCQlzYW4tPmN1cnJlbnRfc2Ft
cGxlX3JpeFtzaXplX2Jpbl0gPSAtMTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitzYW1wbGVfdHhf
Y29tcGxldGUoY29uc3Qgc3RydWN0IGllZWU4MDIxMXZhcCAqdmFwLAorICAgIGNvbnN0IHN0cnVj
dCBpZWVlODAyMTFfbm9kZSAqbmksIGludCBvaywKKyAgICB2b2lkICphcmcxLCB2b2lkICphcmcy
KQoreworCXN0cnVjdCBpZWVlODAyMTFfc2FtcGxlX25vZGUgKnNhbiA9IG5pLT5uaV9yY3RsczsK
Kwljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JhdGVfdGFibGUgKnJ0ID0gaWVlZTgwMjExX2dldF9y
YXRldGFibGUodmFwLT5pdl9pYy0+aWNfY3VyY2hhbik7CisKKwkvKiBYWFggbmVlZCB0byBjaGFu
Z2UgYXJnMiB0byBwb2ludGVyIG9mIGllZWU4MDIxMV9yY19pbmZvICovCisJc3RydWN0IGllZWU4
MDIxMV9yY19pbmZvICpyY19pbmZvID0gKHN0cnVjdCBpZWVlODAyMTFfcmNfaW5mbyopYXJnMjsK
KworCWludCBmaW5hbF9yaXgsIHNob3J0X3RyaWVzLCBsb25nX3RyaWVzOworCWludCBuZnJhbWVz
LCBuYmFkOworCWludCBmcmFtZV9zaXplLCBtcnI7CisKKwlmaW5hbF9yaXggPSBydC0+cmF0ZUNv
ZGVUb0luZGV4W3JjX2luZm8tPnJpX3R4cmF0ZV07CisJc2hvcnRfdHJpZXMgPSByY19pbmZvLT5y
aV9zaG9ydHJldHJ5OworCS8qIFhYWCB3aHkgcGx1cyAxIGhlcmU/ICovCisJbG9uZ190cmllcyA9
IHJjX2luZm8tPnJpX2xvbmdyZXRyeSArIDE7CisKKwluZnJhbWVzID0gcmNfaW5mby0+cmlfdHhj
bnQ7CisJbmJhZCA9IHJjX2luZm8tPnJpX2ZhaWxjbnQ7CisKKwlmcmFtZV9zaXplID0gcmNfaW5m
by0+cmlfZnJhbWVsZW47CisJbXJyID0gMDsKKworCWlmIChuZnJhbWVzID09IDApIHsKKwkJcmV0
dXJuOworCX0KKworCWlmIChmcmFtZV9zaXplID09IDApCQkgICAgLyogTkI6IHNob3VsZCBub3Qg
aGFwcGVuICovCisJCWZyYW1lX3NpemUgPSAxNTAwOworCisJaWYgKHNhbi0+cmF0ZW1hc2sgPT0g
MCkgeworCQlyZXR1cm47CisJfQorCQorCWlmICh2YXAtPml2X3JhdGUtPmlyX2NhcGFiaWxpdGll
cyAmIElFRUU4MDIxMV9SQVRFQ1RMX0NBUF9NUlIpCisJCW1yciA9IDE7CisJLyogWFhYIGNoZWNr
IEhUIHByb3Rtb2RlIHRvbyAqLworCWlmIChtcnIgJiYgISh2YXAtPml2X3JhdGUtPmlyX2NhcGFi
aWxpdGllcyAmIElFRUU4MDIxMV9SQVRFQ1RMX0NBUF9NUlJQUk9UKSkKKwkJbXJyID0gMDsKKwor
CWlmICghbXJyIHx8IHJjX2luZm8tPnJpX2ZpbmFsdHNpID09IDApIHsKKwkJaWYgKCFJU19SQVRF
X0RFRklORUQoc2FuLCBmaW5hbF9yaXgpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJLyoKKwkJICog
T25seSBvbmUgcmF0ZSB3YXMgdXNlZDsgb3B0aW1pemUgd29yay4KKwkJICovCisJCXVwZGF0ZV9z
dGF0cyh2YXAsIG5pLCBmcmFtZV9zaXplLCAKKwkJCSAgICAgZmluYWxfcml4LCBsb25nX3RyaWVz
LAorCQkJICAgICAwLCAwLAorCQkJICAgICAwLCAwLAorCQkJICAgICAwLCAwLAorCQkJICAgICBz
aG9ydF90cmllcywgbG9uZ190cmllcywKKwkJCSAgICAgbmZyYW1lcywgbmJhZCk7CisKKwl9IGVs
c2UgeworCQlpbnQgZmluYWxUU0lkeCA9IHJjX2luZm8tPnJpX2ZpbmFsdHNpOworCQlpbnQgaTsK
KworCQkvKgorCQkgKiBOQjogc2VyaWVzID4gMCBhcmUgbm90IHBlbmFsaXplZCBmb3IgZmFpbHVy
ZQorCQkgKiBiYXNlZCBvbiB0aGUgdHJ5IGNvdW50cyB1bmRlciB0aGUgYXNzdW1wdGlvbgorCQkg
KiB0aGF0IGxvc3NlcyBhcmUgb2Z0ZW4gYnVyc3R5IGFuZCBzaW5jZSB3ZQorCQkgKiBzYW1wbGUg
aGlnaGVyIHJhdGVzIDEgdHJ5IGF0IGEgdGltZSBkb2luZyBzbworCQkgKiBtYXkgdW5mYWlybHkg
cGVuYWxpemUgdGhlbS4KKwkJICovCisJCWlmIChyY1swXS50cmllcykgeworCQkJdXBkYXRlX3N0
YXRzKHZhcCwgbmksIGZyYW1lX3NpemUsCisJCQkJICAgICByY1swXS5yaXgsIHJjWzBdLnRyaWVz
LAorCQkJCSAgICAgcmNbMV0ucml4LCByY1sxXS50cmllcywKKwkJCQkgICAgIHJjWzJdLnJpeCwg
cmNbMl0udHJpZXMsCisJCQkJICAgICByY1szXS5yaXgsIHJjWzNdLnRyaWVzLAorCQkJCSAgICAg
c2hvcnRfdHJpZXMsIGxvbmdfdHJpZXMsCisJCQkJICAgICBuZnJhbWVzLCBuYmFkKTsKKwkJCWxv
bmdfdHJpZXMgLT0gcmNbMF0udHJpZXM7CisJCX0KKwkJCisJCWlmIChyY1sxXS50cmllcyAmJiBm
aW5hbFRTSWR4ID4gMCkgeworCQkJdXBkYXRlX3N0YXRzKHZhcCwgbmksIGZyYW1lX3NpemUsCisJ
CQkJICAgICByY1sxXS5yaXgsIHJjWzFdLnRyaWVzLAorCQkJCSAgICAgcmNbMl0ucml4LCByY1sy
XS50cmllcywKKwkJCQkgICAgIHJjWzNdLnJpeCwgcmNbM10udHJpZXMsCisJCQkJICAgICAwLCAw
LAorCQkJCSAgICAgc2hvcnRfdHJpZXMsIGxvbmdfdHJpZXMsCisJCQkJICAgICBuZnJhbWVzLCBu
YmFkKTsKKwkJCWxvbmdfdHJpZXMgLT0gcmNbMV0udHJpZXM7CisJCX0KKworCQlpZiAocmNbMl0u
dHJpZXMgJiYgZmluYWxUU0lkeCA+IDEpIHsKKwkJCXVwZGF0ZV9zdGF0cyh2YXAsIG5pLCBmcmFt
ZV9zaXplLAorCQkJCSAgICAgcmNbMl0ucml4LCByY1syXS50cmllcywKKwkJCQkgICAgIHJjWzNd
LnJpeCwgcmNbM10udHJpZXMsCisJCQkJICAgICAwLCAwLAorCQkJCSAgICAgMCwgMCwKKwkJCQkg
ICAgIHNob3J0X3RyaWVzLCBsb25nX3RyaWVzLAorCQkJCSAgICAgbmZyYW1lcywgbmJhZCk7CisJ
CQlsb25nX3RyaWVzIC09IHJjWzJdLnRyaWVzOworCQl9CisKKwkJaWYgKHJjWzNdLnRyaWVzICYm
IGZpbmFsVFNJZHggPiAyKSB7CisJCQl1cGRhdGVfc3RhdHModmFwLCBuaSwgZnJhbWVfc2l6ZSwK
KwkJCQkgICAgIHJjWzNdLnJpeCwgcmNbM10udHJpZXMsCisJCQkJICAgICAwLCAwLAorCQkJCSAg
ICAgMCwgMCwKKwkJCQkgICAgIDAsIDAsCisJCQkJICAgICBzaG9ydF90cmllcywgbG9uZ190cmll
cywKKwkJCQkgICAgIG5mcmFtZXMsIG5iYWQpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZAor
c2FtcGxlX3R4X3VwZGF0ZShjb25zdCBzdHJ1Y3QgaWVlZTgwMjExdmFwICp2YXAsIGNvbnN0IHN0
cnVjdCBpZWVlODAyMTFfbm9kZSAqbmksCisgICAgdm9pZCAqYXJnMSwgdm9pZCAqYXJnMiwgdm9p
ZCAqYXJnMykKK3sKKwkvKiBub3RoaW5nIGhlcmUuICovCit9CisKK3N0YXRpYyB2b2lkCitzYW1w
bGVfc2V0aW50ZXJ2YWwoY29uc3Qgc3RydWN0IGllZWU4MDIxMXZhcCAqdmFwLCBpbnQgbXNlY3Mp
Cit7CisJc3RydWN0IGllZWU4MDIxMV9zYW1wbGUgKnNhbXBsZSA9IHZhcC0+aXZfcnM7CisJaW50
IHQ7CisKKwlpZiAobXNlY3MgPCAxMDApCisJCW1zZWNzID0gMTAwOworCXQgPSBtc2Vjc190b190
aWNrcyhtc2Vjcyk7CisJLyogaWVlZTgwMjExX3NhbXBsZSBkb2Vzbid0IGhhdmUgdGhlIHNhbXBs
ZV9pbnRlcnZhbCBmaWVsZCBieSBub3cgKi8KKwkvLyBzYW1wbGUtPnNhbXBsZV9pbnRlcnZhbCA9
ICh0IDwgMSkgPyAxIDogdDsKK30KKworc3RhdGljIHZvaWQKK3NhbXBsZV9zdGF0cyh2b2lkICph
cmcsIHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqbmkpCit7CisJc3RydWN0IGllZWU4MDIxMXZhcCAq
dmFwID0gbmktPm5pX3ZhcDsKKwlzdHJ1Y3QgaWVlZTgwMjExX3NhbXBsZV9ub2RlICpzYW4gPSBu
aS0+bmlfcmN0bHM7CisJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yYXRlX3RhYmxlICpydCA9IGll
ZWU4MDIxMV9nZXRfcmF0ZXRhYmxlKHZhcC0+aXZfaWMtPmljX2N1cmNoYW4pOworCXVpbnQ2NF90
IG1hc2s7CisJaW50IHJpeCwgeTsKKworCXByaW50ZigiXG5bJXNdIHJlZmNudCAlZCBzdGF0aWNf
cml4ICglZCAlcykgcmF0ZW1hc2sgMHglanhcbiIsCisJICAgIGV0aGVyX3NwcmludGYobmktPm5p
X21hY2FkZHIpLCBpZWVlODAyMTFfbm9kZV9yZWZjbnQobmkpLAorCSAgICBkb3QxMXJhdGUocnQs
IHNhbi0+c3RhdGljX3JpeCksCisJICAgIGRvdDExcmF0ZV9sYWJlbChydCwgc2FuLT5zdGF0aWNf
cml4KSwKKwkgICAgKHVpbnRtYXhfdClzYW4tPnJhdGVtYXNrKTsKKwlmb3IgKHkgPSAwOyB5IDwg
TlVNX1BBQ0tFVF9TSVpFX0JJTlM7IHkrKykgeworCQlwcmludGYoIlslNHVdIGN1ciByaXggJWQg
KCVkICVzKSBzaW5jZSBzd2l0Y2g6IHBhY2tldHMgJWQgdGlja3MgJXVcbiIsCisJCSAgICBiaW5f
dG9fc2l6ZSh5KSwgc2FuLT5jdXJyZW50X3JpeFt5XSwKKwkJICAgIGRvdDExcmF0ZShydCwgc2Fu
LT5jdXJyZW50X3JpeFt5XSksCisJCSAgICBkb3QxMXJhdGVfbGFiZWwocnQsIHNhbi0+Y3VycmVu
dF9yaXhbeV0pLAorCQkgICAgc2FuLT5wYWNrZXRzX3NpbmNlX3N3aXRjaFt5XSwgc2FuLT50aWNr
c19zaW5jZV9zd2l0Y2hbeV0pOworCQlwcmludGYoIlslNHVdIGxhc3Qgc2FtcGxlICglZCAlcykg
Y3VyIHNhbXBsZSAoJWQgJXMpIHBhY2tldHMgc2VudCAlZFxuIiwKKwkJICAgIGJpbl90b19zaXpl
KHkpLAorCQkgICAgZG90MTFyYXRlKHJ0LCBzYW4tPmxhc3Rfc2FtcGxlX3JpeFt5XSksCisJCSAg
ICBkb3QxMXJhdGVfbGFiZWwocnQsIHNhbi0+bGFzdF9zYW1wbGVfcml4W3ldKSwKKwkJICAgIGRv
dDExcmF0ZShydCwgc2FuLT5jdXJyZW50X3NhbXBsZV9yaXhbeV0pLAorCQkgICAgZG90MTFyYXRl
X2xhYmVsKHJ0LCBzYW4tPmN1cnJlbnRfc2FtcGxlX3JpeFt5XSksCisJCSAgICBzYW4tPnBhY2tl
dHNfc2VudFt5XSk7CisJCXByaW50ZigiWyU0dV0gcGFja2V0cyBzaW5jZSBzYW1wbGUgJWQgc2Ft
cGxlIHR0ICV1XG4iLAorCQkgICAgYmluX3RvX3NpemUoeSksIHNhbi0+cGFja2V0c19zaW5jZV9z
YW1wbGVbeV0sCisJCSAgICBzYW4tPnNhbXBsZV90dFt5XSk7CisJfQorCWZvciAobWFzayA9IHNh
bi0+cmF0ZW1hc2ssIHJpeCA9IDA7IG1hc2sgIT0gMDsgbWFzayA+Pj0gMSwgcml4KyspIHsKKwkJ
aWYgKChtYXNrICYgMSkgPT0gMCkKKwkJCQljb250aW51ZTsKKwkJZm9yICh5ID0gMDsgeSA8IE5V
TV9QQUNLRVRfU0laRV9CSU5TOyB5KyspIHsKKwkJCWlmIChzYW4tPnN0YXRzW3ldW3JpeF0udG90
YWxfcGFja2V0cyA9PSAwKQorCQkJCWNvbnRpbnVlOworCQkJcHJpbnRmKCJbJTJ1ICVzOiU0dV0g
JThqdTolLThqdSAoJTNkJSUpIChFV01BICUzZC4lMWQlJSkgVCAlOGp1IEYgJTRkIGF2ZyAlNXUg
bGFzdCAldVxuIiwKKwkJCSAgICBkb3QxMXJhdGUocnQsIHJpeCksIGRvdDExcmF0ZV9sYWJlbChy
dCwgcml4KSwKKwkJCSAgICBiaW5fdG9fc2l6ZSh5KSwKKwkJCSAgICAodWludG1heF90KSBzYW4t
PnN0YXRzW3ldW3JpeF0udG90YWxfcGFja2V0cywKKwkJCSAgICAodWludG1heF90KSBzYW4tPnN0
YXRzW3ldW3JpeF0ucGFja2V0c19hY2tlZCwKKwkJCSAgICAoaW50KSAoKHNhbi0+c3RhdHNbeV1b
cml4XS5wYWNrZXRzX2Fja2VkICogMTAwVUxMKSAvCisJCQkgICAgIHNhbi0+c3RhdHNbeV1bcml4
XS50b3RhbF9wYWNrZXRzKSwKKwkJCSAgICBzYW4tPnN0YXRzW3ldW3JpeF0uZXdtYV9wY3QgLyAx
MCwKKwkJCSAgICBzYW4tPnN0YXRzW3ldW3JpeF0uZXdtYV9wY3QgJSAxMCwKKwkJCSAgICAodWlu
dG1heF90KSBzYW4tPnN0YXRzW3ldW3JpeF0udHJpZXMsCisJCQkgICAgc2FuLT5zdGF0c1t5XVty
aXhdLnN1Y2Nlc3NpdmVfZmFpbHVyZXMsCisJCQkgICAgc2FuLT5zdGF0c1t5XVtyaXhdLmF2ZXJh
Z2VfdHhfdGltZSwKKwkJCSAgICB0aWNrcyAtIHNhbi0+c3RhdHNbeV1bcml4XS5sYXN0X3R4KTsK
KwkJfQorCX0KK30KKworc3RhdGljIGludAorc2FtcGxlX3N5c2N0bF9zdGF0cyhTWVNDVExfSEFO
RExFUl9BUkdTKQoreworCXN0cnVjdCBpZWVlODAyMTF2YXAgKnZhcCA9IGFyZzE7CisJc3RydWN0
IGllZWU4MDIxMWNvbSAqaWMgPSB2YXAtPml2X2lmcC0+aWZfbDJjb207CisJaW50IGVycm9yLCB2
OworCisJdiA9IDA7CisJZXJyb3IgPSBzeXNjdGxfaGFuZGxlX2ludChvaWRwLCAmdiwgMCwgcmVx
KTsKKwlpZiAoZXJyb3IgfHwgIXJlcS0+bmV3cHRyKQorCQlyZXR1cm4gZXJyb3I7CisJaWVlZTgw
MjExX2l0ZXJhdGVfbm9kZXMoJmljLT5pY19zdGEsIHNhbXBsZV9zdGF0cywgTlVMTCk7CisJcmV0
dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3NhbXBsZV9zeXNjdGxfc21vb3RoaW5nX3JhdGUoU1lT
Q1RMX0hBTkRMRVJfQVJHUykKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExdmFwICp2YXAgPSBhcmcxOwor
CXN0cnVjdCBpZWVlODAyMTFfc2FtcGxlICpzYW1wbGUgPSB2YXAtPml2X3JzOworCWludCByYXRl
LCBlcnJvcjsKKworCXJhdGUgPSBzYW1wbGUtPnNhbXBsZV9zbW9vdGhpbmdfcmF0ZTsKKwllcnJv
ciA9IHN5c2N0bF9oYW5kbGVfaW50KG9pZHAsICZyYXRlLCAwLCByZXEpOworCWlmIChlcnJvciB8
fCAhcmVxLT5uZXdwdHIpCisJCXJldHVybiBlcnJvcjsKKwlpZiAoISgwIDw9IHJhdGUgJiYgcmF0
ZSA8IDEwMCkpCisJCXJldHVybiBFSU5WQUw7CisJc2FtcGxlLT5zYW1wbGVfc21vb3RoaW5nX3Jh
dGUgPSByYXRlOworCXNhbXBsZS0+c2FtcGxlX3Ntb290aGluZ19taW5wYWNrZXRzID0gMTAwIC8g
KDEwMCAtIHJhdGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitzYW1wbGVfc3lzY3Rs
X3NhbXBsZV9yYXRlKFNZU0NUTF9IQU5ETEVSX0FSR1MpCit7CisJc3RydWN0IGllZWU4MDIxMXZh
cCAqdmFwID0gYXJnMTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3NhbXBsZSAqc2FtcGxlID0gdmFwLT5p
dl9yczsKKwlpbnQgcmF0ZSwgZXJyb3I7CisKKwlyYXRlID0gc2FtcGxlLT5zYW1wbGVfcmF0ZTsK
KwllcnJvciA9IHN5c2N0bF9oYW5kbGVfaW50KG9pZHAsICZyYXRlLCAwLCByZXEpOworCWlmIChl
cnJvciB8fCAhcmVxLT5uZXdwdHIpCisJCXJldHVybiBlcnJvcjsKKwlpZiAoISgyIDw9IHJhdGUg
JiYgcmF0ZSA8PSAxMDApKQorCQlyZXR1cm4gRUlOVkFMOworCXNhbXBsZS0+c2FtcGxlX3JhdGUg
PSByYXRlOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorc2FtcGxlX3N5c2N0bGF0dGFj
aChzdHJ1Y3QgaWVlZTgwMjExdmFwICp2YXAsCisgICAgc3RydWN0IHN5c2N0bF9jdHhfbGlzdCAq
Y3R4LCBzdHJ1Y3Qgc3lzY3RsX29pZCAqdHJlZSkKK3sKKwlTWVNDVExfQUREX1BST0MoY3R4LCBT
WVNDVExfQ0hJTERSRU4odHJlZSksIE9JRF9BVVRPLAorCSAgICAic2FtcGxlX3Ntb290aGluZ19y
YXRlIiwgQ1RMVFlQRV9JTlQgfCBDVExGTEFHX1JXLCB2YXAsIDAsCisJICAgIHNhbXBsZV9zeXNj
dGxfc21vb3RoaW5nX3JhdGUsICJJIiwKKwkgICAgInNhbXBsZTogc21vb3RoaW5nIHJhdGUgZm9y
IGF2ZyB0eCB0aW1lICglJSkiKTsKKwlTWVNDVExfQUREX1BST0MoY3R4LCBTWVNDVExfQ0hJTERS
RU4odHJlZSksIE9JRF9BVVRPLAorCSAgICAic2FtcGxlX3JhdGUiLCBDVExUWVBFX0lOVCB8IENU
TEZMQUdfUlcsIHZhcCwgMCwKKwkgICAgc2FtcGxlX3N5c2N0bF9zYW1wbGVfcmF0ZSwgIkkiLAor
CSAgICAic2FtcGxlOiBwZXJjZW50IGFpciB0aW1lIGRldm90ZWQgdG8gc2FtcGxpbmcgbmV3IHJh
dGVzICglJSkiKTsKKwkvKiBYWFggbWF4X3N1Y2Nlc3NpdmVfZmFpbHVyZXMsIHN0YWxlX2ZhaWx1
cmVfdGltZW91dCwgbWluX3N3aXRjaCAqLworCVNZU0NUTF9BRERfUFJPQyhjdHgsIFNZU0NUTF9D
SElMRFJFTih0cmVlKSwgT0lEX0FVVE8sCisJICAgICJzYW1wbGVfc3RhdHMiLCBDVExUWVBFX0lO
VCB8IENUTEZMQUdfUlcsIHZhcCwgMCwKKwkgICAgc2FtcGxlX3N5c2N0bF9zdGF0cywgIkkiLCAi
c2FtcGxlOiBwcmludCBzdGF0aXN0aWNzIik7Cit9CkluZGV4OiBzeXMvbmV0ODAyMTEvaWVlZTgw
MjExX3JjX3NhbXBsZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHN5cy9uZXQ4MDIxMS9pZWVlODAyMTFfcmNf
c2FtcGxlLmgJKHJldmlzaW9uIDApCisrKyBzeXMvbmV0ODAyMTEvaWVlZTgwMjExX3JjX3NhbXBs
ZS5oCShyZXZpc2lvbiAyNTU4NzIpCkBAIC0wLDAgKzEsMjgzIEBACisvKiAkRnJlZUJTRDogaGVh
ZC9zeXMvZGV2L2F0aC9hdGhfcmF0ZS9zYW1wbGUvc2FtcGxlLmggMjQwMzgyIDIwMTItMDgtMTUg
MDc6MTA6MTBaIGFkcmlhbiAkKi8KKworLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgQ2hlbmNo
b25nIFFpbiA8Y2NxaW5ARnJlZUJTRC5vcmc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVy
CisgKiAgICBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cgKCJE
aXNjbGFpbWVyIikgYW5kIGFueQorICogICAgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRp
b25lZCB1cG9uIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkKKyAqICAgIHNpbWlsYXIgRGlzY2xh
aW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlciBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAz
LiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJz
IG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8g
ZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0
d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBB
bHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUg
dGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNp
b24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisg
KgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENP
UFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqIGBgQVMgSVMnJyBBTkQgQU5ZIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlU
RUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTk9OSU5GUklOR0VNRU5ULCBNRVJDSEFO
VElCSUxJVFkKKyAqIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSUyBPUiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksCisgKiBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJF
TUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUgorICogSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRVMuCisgKi8KKworI2lmbmRlZiBfTkVUODAyMTFfSUVFRTgwMjExX1JBVEVDVExfU0FNUExF
X0hfCisjZGVmaW5lIF9ORVQ4MDIxMV9JRUVFODAyMTFfUkFURUNUTF9TQU1QTEVfSF8KKworLyoK
KyAqIGZvciBub3csIHdlIHRyYWNrIHBlcmZvcm1hbmNlIGZvciB0aHJlZSBkaWZmZXJlbnQgcGFj
a2V0CisgKiBzaXplIGJ1Y2tldHMKKyAqLworI2RlZmluZSBOVU1fUEFDS0VUX1NJWkVfQklOUyAy
CisjZGVmaW5lCVNBTVBMRV9NQVhSQVRFUwk2NAkJLyogTkI6IGNvcnJlc3BvbmRzIHRvIGhhbCBp
bmZvWzMyXSAqLworCisvKgorICogUmF0ZSBjb250cm9sIHNldHRpbmdzLgorICovCitzdHJ1Y3Qg
aWVlZTgwMjExX3NhbXBsZSB7CisJaW50CXNhbXBsZV9zbW9vdGhpbmdfcmF0ZTsJCQkvKiBld21h
IHBlcmNlbnRhZ2UgWzAuLjk5XSAqLworCWludAlzYW1wbGVfc21vb3RoaW5nX21pbnBhY2tldHM7
CisJaW50CXNhbXBsZV9yYXRlOwkJCS8qICV0aW1lIHRvIHRyeSBkaWZmZXJlbnQgdHggcmF0ZXMg
Ki8KKwlpbnQJc2FtcGxlX21heF9zdWNjZXNzaXZlX2ZhaWx1cmVzOworCWludAlzYW1wbGVfc3Rh
bGVfZmFpbHVyZV90aW1lb3V0OwkvKiBob3cgbG9uZyB0byBob25vciBtYXhfc3VjY2Vzc2l2ZV9m
YWlsdXJlcyAqLworCWludAlzYW1wbGVfbWluX3N3aXRjaDsJCS8qIG1pbiB0aW1lIGJldHdlZW4g
cmF0ZSBjaGFuZ2VzICovCisJaW50CXNhbXBsZV9taW5fZ29vZF9wY3Q7CS8qIG1pbiBnb29kIHBl
cmNlbnRhZ2UgZm9yIGEgcmF0ZSB0byBiZSBjb25zaWRlcmVkICovCit9OworCitzdHJ1Y3QgcmF0
ZV9zdGF0cyB7CQorCXVuc2lnbmVkIGF2ZXJhZ2VfdHhfdGltZTsKKwlpbnQgc3VjY2Vzc2l2ZV9m
YWlsdXJlczsKKwl1aW50NjRfdCB0cmllczsKKwl1aW50NjRfdCB0b3RhbF9wYWNrZXRzOwkvKiBw
a3RzIHRvdGFsIHNpbmNlIGFzc29jICovCisJdWludDY0X3QgcGFja2V0c19hY2tlZDsJLyogcGt0
cyBhY2tlZCBzaW5jZSBhc3NvYyAqLworCWludCBld21hX3BjdDsJLyogRVdNQSBwZXJjZW50YWdl
ICovCisJdW5zaWduZWQgcGVyZmVjdF90eF90aW1lOyAvKiB0cmFuc21pdCB0aW1lIGZvciAwIHJl
dHJpZXMgKi8KKwlpbnQgbGFzdF90eDsKK307CisKK3N0cnVjdCB0eHNjaGVkdWxlIHsKKwl1aW50
OF90CXQwLCByMDsJCS8qIHNlcmllcyAwOiB0cmllcywgcmF0ZSBjb2RlICovCisJdWludDhfdAl0
MSwgcjE7CQkvKiBzZXJpZXMgMTogdHJpZXMsIHJhdGUgY29kZSAqLworCXVpbnQ4X3QJdDIsIHIy
OwkJLyogc2VyaWVzIDI6IHRyaWVzLCByYXRlIGNvZGUgKi8KKwl1aW50OF90CXQzLCByMzsJCS8q
IHNlcmllcyAzOiB0cmllcywgcmF0ZSBjb2RlICovCit9OworCisvKgorICogUmF0ZSBjb250cm9s
IHN0YXRlIGZvciBhIGdpdmVuIG5vZGUuCisgKi8KKy8qIFhYWCBjaGFuZ2UgbmFtaW5nIGNvbnZl
cnNpb24/ICovCitzdHJ1Y3QgaWVlZTgwMjExX3NhbXBsZV9ub2RlIHsKKwlzdHJ1Y3QgaWVlZTgw
MjExX3NhbXBsZSAqc2FuX3NhbXBsZTsvKiBiYWNrcG9pbnRlciAqLworCWludCBzdGF0aWNfcml4
OwkJCS8qIHJhdGUgaW5kZXggb2YgZml4ZWQgdHggcmF0ZSAqLworCXVpbnQ2NF90IHJhdGVtYXNr
OwkJLyogYml0IG1hc2sgb2YgdmFsaWQgcmF0ZSBpbmRpY2VzICovCisJY29uc3Qgc3RydWN0IHR4
c2NoZWR1bGUgKnNjaGVkOwkvKiB0eCBzY2hlZHVsZSB0YWJsZSAqLworCisJc3RydWN0IHJhdGVf
c3RhdHMgc3RhdHNbTlVNX1BBQ0tFVF9TSVpFX0JJTlNdW1NBTVBMRV9NQVhSQVRFU107CisJaW50
IGxhc3Rfc2FtcGxlX3JpeFtOVU1fUEFDS0VUX1NJWkVfQklOU107CisKKwlpbnQgY3VycmVudF9z
YW1wbGVfcml4W05VTV9QQUNLRVRfU0laRV9CSU5TXTsgICAgICAgCisJaW50IHBhY2tldHNfc2Vu
dFtOVU1fUEFDS0VUX1NJWkVfQklOU107CisKKwlpbnQgY3VycmVudF9yaXhbTlVNX1BBQ0tFVF9T
SVpFX0JJTlNdOworCWludCBwYWNrZXRzX3NpbmNlX3N3aXRjaFtOVU1fUEFDS0VUX1NJWkVfQklO
U107CisJdW5zaWduZWQgdGlja3Nfc2luY2Vfc3dpdGNoW05VTV9QQUNLRVRfU0laRV9CSU5TXTsK
KworCWludCBwYWNrZXRzX3NpbmNlX3NhbXBsZVtOVU1fUEFDS0VUX1NJWkVfQklOU107CisJdW5z
aWduZWQgc2FtcGxlX3R0W05VTV9QQUNLRVRfU0laRV9CSU5TXTsKK307CisKKyNkZWZpbmUJSVNf
UkFURV9ERUZJTkVEKHNhbiwgcml4KQkoKChzYW4pLT5yYXRlbWFzayAmICgxPDwocml4KSkpICE9
IDApCisKKyNpZm5kZWYgTUlOCisjZGVmaW5lCU1JTihhLGIpCSgoYSkgPCAoYikgPyAoYSkgOiAo
YikpCisjZW5kaWYKKyNpZm5kZWYgTUFYCisjZGVmaW5lCU1BWChhLGIpCSgoYSkgPiAoYikgPyAo
YSkgOiAoYikpCisjZW5kaWYKKworc3RhdGljIGNvbnN0IGludCBwYWNrZXRfc2l6ZV9iaW5zW05V
TV9QQUNLRVRfU0laRV9CSU5TXSAgPSB7IDI1MCwgMTYwMCB9OworCitzdGF0aWMgaW5saW5lIGlu
dAorYmluX3RvX3NpemUoaW50IGluZGV4KQoreworCXJldHVybiBwYWNrZXRfc2l6ZV9iaW5zW2lu
ZGV4XTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK3NpemVfdG9fYmluKGludCBzaXplKSAKK3sK
KyNpZiBOVU1fUEFDS0VUX1NJWkVfQklOUyA+IDEKKwlpZiAoc2l6ZSA8PSBwYWNrZXRfc2l6ZV9i
aW5zWzBdKQorCQlyZXR1cm4gMDsKKyNlbmRpZgorI2lmIE5VTV9QQUNLRVRfU0laRV9CSU5TID4g
MgorCWlmIChzaXplIDw9IHBhY2tldF9zaXplX2JpbnNbMV0pCisJCXJldHVybiAxOworI2VuZGlm
CisjaWYgTlVNX1BBQ0tFVF9TSVpFX0JJTlMgPiAzCisJaWYgKHNpemUgPD0gcGFja2V0X3NpemVf
Ymluc1syXSkKKwkJcmV0dXJuIDI7CisjZW5kaWYKKyNpZiBOVU1fUEFDS0VUX1NJWkVfQklOUyA+
IDQKKyNlcnJvciAiYWRkIHN1cHBvcnQgZm9yIG1vcmUgcGFja2V0IHNpemVzIgorI2VuZGlmCisJ
cmV0dXJuIE5VTV9QQUNLRVRfU0laRV9CSU5TLTE7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBzYW1w
bGVfcGt0X3R4dGltZShjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JhdGVfdGFibGUgKnJ0LAorCXVp
bnQzMl90IGZyYW1lTGVuLCB1aW50MTZfdCByYXRlaXgsIGludCBpc2h0NDAsIGludCBpc1Nob3J0
UHJlYW1ibGUpCit7CisJdWludDhfdCByYzsKKyAgICBpbnQgbnVtU3RyZWFtczsKKworICAgIHJj
ID0gcnQtPmluZm9bcmF0ZWl4XS5yYXRlQ29kZTsKKworICAgIC8qIExlZ2FjeSByYXRlPyBSZXR1
cm4gdGhlIG9sZCB3YXkgKi8KKyAgICBpZiAoISBJU19IVF9SQVRFKHJjKSkKKyAgICAJcmV0dXJu
IGllZWU4MDIxMV9jb21wdXRlX2R1cmF0aW9uKHJ0LCBmcmFtZUxlbiwgcmF0ZWl4LCBpc1Nob3J0
UHJlYW1ibGUpOworCisgICAgLyogMTFuIGZyYW1lIC0gZXh0cmFjdCBvdXQgdGhlIG51bWJlciBv
ZiBzcGF0aWFsIHN0cmVhbXMgKi8KKyAgICBudW1TdHJlYW1zID0gSFRfUkNfMl9TVFJFQU1TKHJj
KTsKKyAgICBLQVNTRVJUKG51bVN0cmVhbXMgPiAwICYmIG51bVN0cmVhbXMgPD0gNCwKKyAgICAg
ICAgKCJudW1iZXIgb2Ygc3BhdGlhbCBzdHJlYW1zIG5lZWRzIHRvIGJlIDEuLjM6IE1DUyByYXRl
IDB4JXghIiwKKyAgICAgICAgcmF0ZWl4KSk7CisKKyAgICByZXR1cm4gaWVlZTgwMjExX2NvbXB1
dGVfZHVyYXRpb25faHQoZnJhbWVMZW4sIHJjLCBudW1TdHJlYW1zLCBpc2h0NDAsIGlzU2hvcnRQ
cmVhbWJsZSk7Cit9CisKKyNkZWZpbmUgV0lGSV9DV19NSU4gMzEKKyNkZWZpbmUgV0lGSV9DV19N
QVggMTAyMworCisvKgorICogQ2FsY3VsYXRlIHRoZSB0cmFuc21pdCBkdXJhdGlvbiBvZiBhIGZy
YW1lLgorICovCitzdGF0aWMgdW5zaWduZWQgY2FsY191c2Vjc191bmljYXN0X3BhY2tldChjb25z
dCBzdHJ1Y3QgaWVlZTgwMjExdmFwICp2YXAsCisJCQkJaW50IGxlbmd0aCwKKwkJCQlpbnQgcml4
LCBpbnQgc2hvcnRfcmV0cmllcywKKwkJCQlpbnQgbG9uZ19yZXRyaWVzLCBpbnQgaXNfaHQ0MCkK
K3sKKwljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JhdGVfdGFibGUgKnJ0ID0gaWVlZTgwMjExX2dl
dF9yYXRldGFibGUodmFwLT5pdl9pYy0+aWNfY3VyY2hhbik7CisJc3RydWN0IGllZWU4MDIxMWNv
bSAqaWMgPSB2YXAtPml2X2ljOworCWludCBjdXJtb2RlID0gaWVlZTgwMjExX2NoYW4ybW9kZSh2
YXAtPml2X2ljLT5pY19jdXJjaGFuKTsKKwkKKwl1bnNpZ25lZCB0X3Nsb3QsIHRfZGlmcywgdF9z
aWZzOyAKKwlpbnQgcnRzLCBjdHM7CisJaW50IHR0LCB4LCBjdywgY2l4OworCisJaW50IHR0ID0g
MDsKKwlpbnQgeCA9IDA7CisJaW50IGN3ID0gV0lGSV9DV19NSU47CisKKwlLQVNTRVJUKHJ0ICE9
IE5VTEwsICgibm8gcmF0ZSB0YWJsZSwgbW9kZSAldSIsIGN1cm1vZGUpKTsKKworCWlmIChyaXgg
Pj0gcnQtPnJhdGVDb3VudCkgeworCQlwcmludGYoImJvZ3VzIHJpeCAlZCwgbWF4ICV1LCBtb2Rl
ICV1XG4iLAorCQkgICAgICAgcml4LCBydC0+cmF0ZUNvdW50LCBjdXJtb2RlKTsKKwkJcmV0dXJu
IDA7CisJfQorCWNpeCA9IHJ0LT5pbmZvW3JpeF0uY29udHJvbFJhdGU7CisJLyogCisJICogWFhY
IGdldHRpbmcgbWFjL3BoeSBsZXZlbCB0aW1pbmdzIHNob3VsZCBiZSBmaXhlZCBmb3IgdHVyYm8K
KwkgKiByYXRlcywgYW5kIHRoZXJlIGlzIHByb2JhYmx5IGEgd2F5IHRvIGdldCB0aGlzIGZyb20g
dGhlCisJICogaGFsLi4uCisJICovCisJc3dpdGNoIChydC0+aW5mb1tyaXhdLnBoeSkgeworCWNh
c2UgSUVFRTgwMjExX1RfT0ZETToKKwkJdF9zbG90ID0gOTsKKwkJdF9zaWZzID0gMTY7CisJCXRf
ZGlmcyA9IDI4OworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIElFRUU4MDIxMV9UX1RVUkJP
OgorCQl0X3Nsb3QgPSA5OworCQl0X3NpZnMgPSA4OworCQl0X2RpZnMgPSAyODsKKwkJYnJlYWs7
CisJY2FzZSBJRUVFODAyMTFfVF9IVDoKKwkJdF9zbG90ID0gOTsKKwkJdF9zaWZzID0gODsKKwkJ
dF9kaWZzID0gMjg7CisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX1RfRFM6CisJCS8qIGZhbGwg
dGhyb3VnaCB0byBkZWZhdWx0ICovCisJZGVmYXVsdDoKKwkJLyogcGcgMjA1IGllZWUuODAyLjEx
LnBkZiAqLworCQl0X3Nsb3QgPSAyMDsKKwkJdF9kaWZzID0gNTA7CisJCXRfc2lmcyA9IDEwOwor
CX0KKworCXJ0cyA9IGN0cyA9IDA7CisKKwlpZiAoKGljLT5pY19mbGFncyAmIElFRUU4MDIxMV9G
X1VTRVBST1QpICYmCisJICAgIHJ0LT5pbmZvW3JpeF0ucGh5ID09IElFRUU4MDIxMV9UX09GRE0p
IHsKKwkJaWYgKGljLT5pY19wcm90bW9kZSA9PSBJRUVFODAyMTFfUFJPVF9SVFNDVFMpCisJCQly
dHMgPSAxOworCQllbHNlIGlmIChpYy0+aWNfcHJvdG1vZGUgPT0gSUVFRTgwMjExX1BST1RfQ1RT
T05MWSkKKwkJCWN0cyA9IDE7CisKKwkJaW50IHByb3RyaXg7CisgICAgCWlmIChjdXJtb2RlID09
IElFRUU4MDIxMV9NT0RFXzExRykKKyAgICAJICAgIHByb3RyaXggPSBydC0+cmF0ZUNvZGVUb0lu
ZGV4WzIqMl07CisgICAgCWVsc2UgCisgICAgCSAgICBwcm90cml4ID0gcnQtPnJhdGVDb2RlVG9J
bmRleFsyKjFdOworICAgIAlpZiAoMHhmZiA9PSBwcm90cml4KQorICAgIAkJcHJvdHJpeCA9IDA7
CisKKwkJY2l4ID0gcnQtPmluZm9bcHJvdHJpeF0uY29udHJvbFJhdGU7CisJfQorCisJaWYgKDAg
LypsZW5ndGggPiBpYy0+aWNfcnRzdGhyZXNob2xkICovKSB7CisJCXJ0cyA9IDE7CisJfQorCisJ
aWYgKHJ0cyB8fCBjdHMpIHsKKwkJaW50IGN0c3JhdGU7CisJCWludCBjdHNkdXJhdGlvbiA9IDA7
CisKKwkJLyogTkI6IHRoaXMgaXMgaW50ZW50aW9uYWxseSBub3QgYSBydW50aW1lIGNoZWNrICov
CisJCUtBU1NFUlQoY2l4IDwgcnQtPnJhdGVDb3VudCwKKwkJICAgICgiYm9ndXMgY2l4ICVkLCBt
YXggJXUsIG1vZGUgJXVcbiIsIGNpeCwgcnQtPnJhdGVDb3VudCwKKwkJICAgICBjdXJtb2RlKSk7
CisKKwkJY3RzcmF0ZSA9IHJ0LT5pbmZvW2NpeF0ucmF0ZUNvZGUgfCBydC0+aW5mb1tjaXhdLnNo
b3J0UHJlYW1ibGU7CisJCWlmIChydHMpCQkvKiBTSUZTICsgQ1RTICovCisJCQljdHNkdXJhdGlv
biArPSBydC0+aW5mb1tjaXhdLnNwQWNrRHVyYXRpb247CisKKwkJLyogWFhYIGFzc3VtZXMgc2hv
cnQgcHJlYW1ibGUgKi8KKwkJY3RzZHVyYXRpb24gKz0gc2FtcGxlX3BrdF90eHRpbWUocnQsIGxl
bmd0aCwgcml4LCBpc19odDQwLCAwKTsKKworCQlpZiAoY3RzKQkvKiBTSUZTICsgQUNLICovCisJ
CQljdHNkdXJhdGlvbiArPSBydC0+aW5mb1tjaXhdLnNwQWNrRHVyYXRpb247CisKKwkJdHQgKz0g
KHNob3J0X3JldHJpZXMgKyAxKSAqIGN0c2R1cmF0aW9uOworCX0KKwl0dCArPSB0X2RpZnM7CisK
KwkvKiBYWFggYXNzdW1lcyBzaG9ydCBwcmVhbWJsZSAqLworCXR0ICs9IChsb25nX3JldHJpZXMr
MSkqc2FtcGxlX3BrdF90eHRpbWUocnQsIGxlbmd0aCwgcml4LCBpc19odDQwLCAwKTsKKworCXR0
ICs9IChsb25nX3JldHJpZXMrMSkqKHRfc2lmcyArIHJ0LT5pbmZvW3JpeF0uc3BBY2tEdXJhdGlv
bik7CisKKwlmb3IgKHggPSAwOyB4IDw9IHNob3J0X3JldHJpZXMgKyBsb25nX3JldHJpZXM7IHgr
KykgeworCQljdyA9IE1JTihXSUZJX0NXX01BWCwgKGN3ICsgMSkgKiAyKTsKKwkJdHQgKz0gKHRf
c2xvdCAqIGN3LzIpOworCX0KKwlyZXR1cm4gdHQ7Cit9CisKKyNlbmRpZiAvKiBfTkVUODAyMTFf
SUVFRTgwMjExX1JBVEVDVExfU0FNUExFX0hfICovCkluZGV4OiBzeXMvbmV0ODAyMTEvaWVlZTgw
MjExX3JjX3NhbXBsZV90eHNjaGVkLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gc3lzL25ldDgwMjExL2llZWU4
MDIxMV9yY19zYW1wbGVfdHhzY2hlZC5oCShyZXZpc2lvbiAwKQorKysgc3lzL25ldDgwMjExL2ll
ZWU4MDIxMV9yY19zYW1wbGVfdHhzY2hlZC5oCShyZXZpc2lvbiAyNTU4NzIpCkBAIC0wLDAgKzEs
MjQxIEBACisvKiAkRnJlZUJTRDogaGVhZC9zeXMvZGV2L2F0aC9hdGhfcmF0ZS9zYW1wbGUvdHhf
c2NoZWR1bGVzLmggMjQwMzg0IDIwMTItMDgtMTUgMDc6NTA6NDJaIGFkcmlhbiAkKi8KKworLyot
CisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgSm9obiBCaWNrZXQKKyAqIENvcHlyaWdodCAoYykgMjAx
MyBDaGVuY2hvbmcgUWluIDxjY3FpbkBGcmVlQlNELm9yZz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRp
c2NsYWltZXIKKyAqICAgIHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBi
ZWxvdyAoIkRpc2NsYWltZXIiKSBhbmQgYW55CisgKiAgICByZWRpc3RyaWJ1dGlvbiBtdXN0IGJl
IGNvbmRpdGlvbmVkIHVwb24gaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseQorICogICAgc2ltaWxh
ciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyIGJpbmFyeSByZWRpc3RyaWJ1dGlv
bi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0
IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUg
dXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0
aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgor
ICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVu
ZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BM
IikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRh
dGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogYGBBUyBJUycnIEFO
RCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAor
ICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBOT05JTkZSSU5HRU1FTlQs
IE1FUkNIQU5USUJJTElUWQorICogQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xE
RVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwKKyAq
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFUy4KKyAqCisgKi8KKyNpZm5kZWYJX19BVEhfUkFURV9TQU1QTEVfVFhTQ0hF
RFVMRVNfSF9fCisjZGVmaW5lCV9fQVRIX1JBVEVfU0FNUExFX1RYU0NIRURVTEVTX0hfXworCisj
aW5jbHVkZSA8c3lzL2NkZWZzLmg+CisKKyNkZWZpbmUgQShfcikgXAorICAgICgoKF9yKSA9PSA2
KSAgID8gMCA6ICgoKF9yKSA9PSA5KSAgID8gMSA6ICgoKF9yKSA9PSAxMikgID8gMiA6IFwKKyAg
ICAoKChfcikgPT0gMTgpICA/IDMgOiAoKChfcikgPT0gMjQpICA/IDQgOiAoKChfcikgPT0gMzYp
ICA/IDUgOiBcCisgICAgKCgoX3IpID09IDQ4KSAgPyA2IDogKCgoX3IpID09IDU0KSAgPyA3IDog
MCkpKSkpKSkpCitzdGF0aWMgY29uc3Qgc3RydWN0IHR4c2NoZWR1bGUgc2VyaWVzXzExYVtdID0g
eworCXsgMyxBKCA2KSwgMyxBKCAgNiksIDAsQSggIDYpLCAwLEEoIDYpIH0sCS8qICAgNk1iL3Mg
Ki8KKwl7IDQsQSggOSksIDMsQSggIDYpLCA0LEEoICA2KSwgMCxBKCA2KSB9LAkvKiAgIDlNYi9z
ICovCisJeyA0LEEoMTIpLCAzLEEoICA2KSwgNCxBKCAgNiksIDAsQSggNikgfSwJLyogIDEyTWIv
cyAqLworCXsgNCxBKDE4KSwgMyxBKCAxMiksIDQsQSggIDYpLCAyLEEoIDYpIH0sCS8qICAxOE1i
L3MgKi8KKwl7IDQsQSgyNCksIDMsQSggMTgpLCA0LEEoIDEyKSwgMixBKCA2KSB9LAkvKiAgMjRN
Yi9zICovCisJeyA0LEEoMzYpLCAzLEEoIDI0KSwgNCxBKCAxOCksIDIsQSggNikgfSwJLyogIDM2
TWIvcyAqLworCXsgNCxBKDQ4KSwgMyxBKCAzNiksIDQsQSggMjQpLCAyLEEoMTIpIH0sCS8qICA0
OE1iL3MgKi8KKwl7IDQsQSg1NCksIDMsQSggNDgpLCA0LEEoIDM2KSwgMixBKDI0KSB9CS8qICA1
NE1iL3MgKi8KK307CisKKyNkZWZpbmUgTkExKF9yKSBcCisJKCgoX3IpID09IDYuNSkgID8gOCA6
ICgoKF9yKSA9PSAxMykgID8gIDkgOiAoKChfcikgPT0gMTkuNSk/IDEwIDogXAorCSgoKF9yKSA9
PSAyNikgID8gMTEgOiAoKChfcikgPT0gMzkpICA/IDEyIDogKCgoX3IpID09IDUyKSAgPyAxMyA6
IFwKKwkoKChfcikgPT0gNTguNSk/IDE0IDogKCgoX3IpID09IDY1KSAgPyAxNSA6IDApKSkpKSkp
KQorI2RlZmluZSBOQTIoX3IpIFwKKwkoKChfcikgPT0gMTMpID8gMTYgOiAoKChfcikgPT0gMjYp
ID8gMTcgOiAoKChfcikgPT0gMzkpID8gMTggOiBcCisJKCgoX3IpID09IDUyKSA/IDE5IDogKCgo
X3IpID09IDc4KSA/IDIwIDogKCgoX3IpID09IDEwNCk/IDIxIDogXAorCSgoKF9yKSA9PSAxMTcp
PyAyMiA6ICgoKF9yKSA9PSAxMzApPyAyMyA6IDApKSkpKSkpKQorI2RlZmluZSBOQTMoX3IpIFwK
KwkoKChfcikgPT0gMTkuNSkgID8gMjQgOiAoKChfcikgPT0gMzkpID8gMjUgOiAoKChfcikgPT0g
NTguNSkgID8gMjYgOiBcCisJKCgoX3IpID09IDc4KSAgPyAyNyA6ICgoKF9yKSA9PSAxMTcpID8g
MjggOiAoKChfcikgPT0gMTU2KSA/IDI5IDogXAorCSgoKF9yKSA9PSAxNzUuNSkgPyAzMCA6ICgo
KF9yKSA9PSAxOTUpPyAzMSA6IDApKSkpKSkpKQorc3RhdGljIGNvbnN0IHN0cnVjdCB0eHNjaGVk
dWxlIHNlcmllc18xMW5hW10gPSB7CisJeyAzLEEoIDYpLCAzLEEoICA2KSwgMCxBKCAgNiksIDAs
QSggNikgfSwgICAgICAgLyogICA2TWIvcyAqLworCXsgNCxBKCA5KSwgMyxBKCAgNiksIDQsQSgg
IDYpLCAwLEEoIDYpIH0sICAgICAgIC8qICAgOU1iL3MgKi8KKwl7IDQsQSgxMiksIDMsQSggIDYp
LCA0LEEoICA2KSwgMCxBKCA2KSB9LCAgICAgICAvKiAgMTJNYi9zICovCisJeyA0LEEoMTgpLCAz
LEEoIDEyKSwgNCxBKCAgNiksIDIsQSggNikgfSwgICAgICAgLyogIDE4TWIvcyAqLworCXsgNCxB
KDI0KSwgMyxBKCAxOCksIDQsQSggMTIpLCAyLEEoIDYpIH0sICAgICAgIC8qICAyNE1iL3MgKi8K
Kwl7IDQsQSgzNiksIDMsQSggMjQpLCA0LEEoIDE4KSwgMixBKCA2KSB9LCAgICAgICAvKiAgMzZN
Yi9zICovCisJeyA0LEEoNDgpLCAzLEEoIDM2KSwgNCxBKCAyNCksIDIsQSgxMikgfSwgICAgICAg
LyogIDQ4TWIvcyAqLworCXsgNCxBKDU0KSwgMyxBKCA0OCksIDQsQSggMzYpLCAyLEEoMjQpIH0s
ICAgICAgIC8qICA1NE1iL3MgKi8KKworCS8qIDEgc3RyZWFtIHJhdGVzICovCisKKwl7IDMsTkEx
KCA2LjUpLCAzLE5BMSggNi41KSwgMCxOQTEoIDYuNSksIDAsTkExKDYuNSkgfSwgIC8qIDYuNU1i
L3MgKi8KKwl7IDQsTkExKCAgMTMpLCAzLE5BMSggNi41KSwgNCxOQTEoIDYuNSksIDAsTkExKDYu
NSkgfSwgIC8qICAxM01iL3MgKi8KKwl7IDQsTkExKDE5LjUpLCAzLE5BMSggNi41KSwgNCxOQTEo
IDYuNSksIDAsTkExKDYuNSkgfSwgIC8qMTkuNU1iL3MgKi8KKwl7IDQsTkExKCAgMjYpLCAzLE5B
MSgxOS41KSwgNCxOQTEoIDYuNSksIDIsTkExKDYuNSkgfSwgIC8qICAyNk1iL3MgKi8KKwl7IDQs
TkExKCAgMzkpLCAzLE5BMSggIDI2KSwgNCxOQTEoMTkuNSksIDIsTkExKDYuNSkgfSwgIC8qICAz
OU1iL3MgKi8KKwl7IDQsTkExKCAgNTIpLCAzLE5BMSggIDM5KSwgNCxOQTEoICAyNiksIDIsTkEx
KDYuNSkgfSwgIC8qICA1Mk1iL3MgKi8KKwl7IDQsTkExKDU4LjUpLCAzLE5BMSggIDUyKSwgNCxO
QTEoICAzOSksIDIsTkExKCAxMykgfSwgIC8qNTguNU1iL3MgKi8KKwl7IDQsTkExKCAgNjUpLCAz
LE5BMSg1OC41KSwgNCxOQTEoICA1MiksIDIsTkExKCAxMykgfSwgIC8qICA2NU1iL3MgKi8KKwor
CS8qIDIgc3RyZWFtIHJhdGVzICovCisKKwl7IDMsTkEyKCAgMTMpLCAzLE5BMiggIDEzKSwgMCxO
QTIoICAxMyksIDAsTkEyKCAxMykgfSwgIC8qICAxM01iL3MgKi8KKwl7IDQsTkEyKCAgMjYpLCAz
LE5BMiggIDEzKSwgNCxOQTIoICAxMyksIDAsTkEyKCAxMykgfSwgIC8qICAyNk1iL3MgKi8KKwl7
IDQsTkEyKCAgMzkpLCAzLE5BMiggIDI2KSwgNCxOQTIoICAxMyksIDIsTkEyKCAxMykgfSwgIC8q
ICAzOU1iL3MgKi8KKwl7IDQsTkEyKCAgNTIpLCAzLE5BMiggIDM5KSwgNCxOQTIoICAyNiksIDIs
TkEyKCAxMykgfSwgIC8qICA1Mk1iL3MgKi8KKwl7IDQsTkEyKCAgNzgpLCAzLE5BMiggIDUyKSwg
NCxOQTIoICAzOSksIDIsTkEyKCAxMykgfSwgIC8qICA3OE1iL3MgKi8KKwl7IDQsTkEyKCAxMDQp
LCAzLE5BMiggIDc4KSwgNCxOQTIoICA1MiksIDIsTkEyKCAxMykgfSwgIC8qIDEwNE1iL3MgKi8K
Kwl7IDQsTkEyKCAxMTcpLCAzLE5BMiggMTA0KSwgNCxOQTIoICA3OCksIDIsTkEyKCAyNikgfSwg
IC8qIDExN01iL3MgKi8KKwl7IDQsTkEyKCAxMzApLCAzLE5BMiggMTE3KSwgNCxOQTIoIDEwNCks
IDIsTkEyKCAyNikgfSwgICAvKiAxMzBNYi9zICovCisKKwkvKiAzIHN0cmVhbSByYXRlcyAqLwor
CisJeyAzLE5BMygxOS41KSwgMyxOQTMoMTkuNSksIDAsTkEzKDE5LjUpLCAwLE5BMygxOS41KSB9
LCAgLyogIDE5TWIvcyAqLworCXsgMyxOQTMoICAzOSksIDMsTkEzKDE5LjUpLCAwLE5BMygxOS41
KSwgMCxOQTMoMTkuNSkgfSwgIC8qICAzOU1iL3MgKi8KKwl7IDMsTkEzKDU4LjUpLCAzLE5BMygg
IDM5KSwgMCxOQTMoMTkuNSksIDAsTkEzKDE5LjUpIH0sICAvKiAgNThNYi9zICovCisJeyAzLE5B
MyggIDc4KSwgMyxOQTMoNTguNSksIDAsTkEzKCAgMzkpLCAwLE5BMygxOS41KSB9LCAgLyogIDc4
TWIvcyAqLworCXsgMyxOQTMoIDExNyksIDMsTkEzKCAgNzgpLCAwLE5BMyg1OC41KSwgMCxOQTMo
MTkuNSkgfSwgIC8qIDExN01iL3MgKi8KKwl7IDMsTkEzKCAxNTYpLCAzLE5BMyggMTE3KSwgMCxO
QTMoICA3OCksIDAsTkEzKDE5LjUpIH0sICAvKiAgMTU2TWIvcyAqLworCXsgMyxOQTMoMTc1LjUp
LCAzLE5BMyggMTU2KSwgMCxOQTMoIDExNyksIDAsTkEzKCAgMzkpIH0sICAvKiAgMTc1TWIvcyAq
LworCXsgMyxOQTMoIDE5NSksIDMsTkEzKCAxOTUpLCAwLE5BMyggMTU2KSwgMCxOQTMoNTguNSkg
fSwgIC8qIDE5NU1iL3MgKi8KK307CisjdW5kZWYgQQorI3VuZGVmIE5BMworI3VuZGVmIE5BMgor
I3VuZGVmIE5BMQorCisjZGVmaW5lIEcoX3IpIFwKKyAgICAoKChfcikgPT0gMSkgICA/IDAgOiAo
KChfcikgPT0gMikgICA/IDEgOiAoKChfcikgPT0gNS41KSA/IDIgOiBcCisgICAgKCgoX3IpID09
IDExKSAgPyAzIDogKCgoX3IpID09IDYpICAgPyA0IDogKCgoX3IpID09IDkpICAgPyA1IDogXAor
ICAgICgoKF9yKSA9PSAxMikgID8gNiA6ICgoKF9yKSA9PSAxOCkgID8gNyA6ICgoKF9yKSA9PSAy
NCkgID8gOCA6IFwKKyAgICAoKChfcikgPT0gMzYpICA/IDkgOiAoKChfcikgPT0gNDgpICA/IDEw
IDogKCgoX3IpID09IDU0KSAgPyAxMSA6IDApKSkpKSkpKSkpKSkKK3N0YXRpYyBjb25zdCBzdHJ1
Y3QgdHhzY2hlZHVsZSBzZXJpZXNfMTFnW10gPSB7CisJeyAzLEcoIDEpLCAzLEcoICAxKSwgMCxH
KCAgMSksIDAsRyggMSkgfSwJLyogICAxTWIvcyAqLworCXsgNCxHKCAyKSwgMyxHKCAgMSksIDQs
RyggIDEpLCAwLEcoIDEpIH0sCS8qICAgMk1iL3MgKi8KKwl7IDQsRyg1LjUpLDMsRyggIDIpLCA0
LEcoICAxKSwgMixHKCAxKSB9LAkvKiA1LjVNYi9zICovCisJeyA0LEcoMTEpLCAzLEcoNS41KSwg
NCxHKCAgMiksIDIsRyggMSkgfSwJLyogIDExTWIvcyAqLworCXsgNCxHKCA2KSwgMyxHKDUuNSks
IDQsRyggIDIpLCAyLEcoIDEpIH0sCS8qICAgNk1iL3MgKi8KKwl7IDQsRyggOSksIDMsRyggIDYp
LCA0LEcoNS41KSwgMixHKCAxKSB9LAkvKiAgIDlNYi9zICovCisJeyA0LEcoMTIpLCAzLEcoIDEx
KSwgNCxHKDUuNSksIDIsRyggMSkgfSwJLyogIDEyTWIvcyAqLworCXsgNCxHKDE4KSwgMyxHKCAx
MiksIDQsRyggMTEpLCAyLEcoIDEpIH0sCS8qICAxOE1iL3MgKi8KKwl7IDQsRygyNCksIDMsRygg
MTgpLCA0LEcoIDEyKSwgMixHKCAxKSB9LAkvKiAgMjRNYi9zICovCisJeyA0LEcoMzYpLCAzLEco
IDI0KSwgNCxHKCAxOCksIDIsRyggMSkgfSwJLyogIDM2TWIvcyAqLworCXsgNCxHKDQ4KSwgMyxH
KCAzNiksIDQsRyggMjQpLCAyLEcoIDEpIH0sCS8qICA0OE1iL3MgKi8KKwl7IDQsRyg1NCksIDMs
RyggNDgpLCA0LEcoIDM2KSwgMixHKCAxKSB9CS8qICA1NE1iL3MgKi8KK307CisKKyNkZWZpbmUg
TkcxKF9yKSBcCisJKCgoX3IpID09IDYuNSkgPyAxMiA6ICgoKF9yKSA9PSAxMykgPyAxMyA6ICgo
KF9yKSA9PSAxOS41KT8gMTQgOiBcCisJKCgoX3IpID09IDI2KSAgPyAxNSA6ICgoKF9yKSA9PSAz
OSkgPyAxNiA6ICgoKF9yKSA9PSA1MikgID8gMTcgOiBcCisJKCgoX3IpID09IDU4LjUpPyAxOCA6
ICgoKF9yKSA9PSA2NSkgPyAxOSA6IDApKSkpKSkpKQorI2RlZmluZSBORzIoX3IpIFwKKwkoKChf
cikgPT0gMTMpICA/IDIwIDogKCgoX3IpID09IDI2KSA/IDIxIDogKCgoX3IpID09IDM5KSAgPyAy
MiA6IFwKKwkoKChfcikgPT0gNTIpICA/IDIzIDogKCgoX3IpID09IDc4KSA/IDI0IDogKCgoX3Ip
ID09IDEwNCkgPyAyNSA6IFwKKwkoKChfcikgPT0gMTE3KSA/IDI2IDogKCgoX3IpID09IDEzMCk/
IDI3IDogMCkpKSkpKSkpCisjZGVmaW5lIE5HMyhfcikgXAorCSgoKF9yKSA9PSAxOS41KSAgPyAy
OCA6ICgoKF9yKSA9PSAzOSkgPyAyOSA6ICgoKF9yKSA9PSA1OC41KSAgPyAzMCA6IFwKKwkoKChf
cikgPT0gNzgpICA/IDMxIDogKCgoX3IpID09IDExNykgPyAzMiA6ICgoKF9yKSA9PSAxNTYpID8g
MzMgOiBcCisJKCgoX3IpID09IDE3NS41KSA/IDM0IDogKCgoX3IpID09IDE5NSk/IDM1IDogMCkp
KSkpKSkpCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdHhzY2hlZHVsZSBzZXJpZXNfMTFuZ1tdID0g
eworCXsgMyxHKCAxKSwgMyxHKCAgMSksIDAsRyggIDEpLCAwLEcoIDEpIH0sICAgICAgIC8qICAg
MU1iL3MgKi8KKwl7IDQsRyggMiksIDMsRyggIDEpLCA0LEcoICAxKSwgMCxHKCAxKSB9LCAgICAg
ICAvKiAgIDJNYi9zICovCisJeyA0LEcoNS41KSwzLEcoICAyKSwgNCxHKCAgMSksIDIsRyggMSkg
fSwgICAgICAgLyogNS41TWIvcyAqLworCXsgNCxHKDExKSwgMyxHKDUuNSksIDQsRyggIDIpLCAy
LEcoIDEpIH0sICAgICAgIC8qICAxMU1iL3MgKi8KKwl7IDQsRyggNiksIDMsRyg1LjUpLCA0LEco
ICAyKSwgMixHKCAxKSB9LCAgICAgICAvKiAgIDZNYi9zICovCisJeyA0LEcoIDkpLCAzLEcoICA2
KSwgNCxHKDUuNSksIDIsRyggMSkgfSwgICAgICAgLyogICA5TWIvcyAqLworCXsgNCxHKDEyKSwg
MyxHKCAxMSksIDQsRyg1LjUpLCAyLEcoIDEpIH0sICAgICAgIC8qICAxMk1iL3MgKi8KKwl7IDQs
RygxOCksIDMsRyggMTIpLCA0LEcoIDExKSwgMixHKCAxKSB9LCAgICAgICAvKiAgMThNYi9zICov
CisJeyA0LEcoMjQpLCAzLEcoIDE4KSwgNCxHKCAxMiksIDIsRyggMSkgfSwgICAgICAgLyogIDI0
TWIvcyAqLworCXsgNCxHKDM2KSwgMyxHKCAyNCksIDQsRyggMTgpLCAyLEcoIDEpIH0sICAgICAg
IC8qICAzNk1iL3MgKi8KKwl7IDQsRyg0OCksIDMsRyggMzYpLCA0LEcoIDI0KSwgMixHKCAxKSB9
LCAgICAgICAvKiAgNDhNYi9zICovCisJeyA0LEcoNTQpLCAzLEcoIDQ4KSwgNCxHKCAzNiksIDIs
RyggMSkgfSwgICAgICAgLyogIDU0TWIvcyAqLworCisJLyogMSBzdHJlYW0gcmF0ZXMgKi8KKwor
CXsgMyxORzEoIDYuNSksIDMsTkcxKCA2LjUpLCAwLE5HMSggNi41KSwgMCxORzEoNi41KSB9LCAg
LyogNi41TWIvcyAqLworCXsgNCxORzEoICAxMyksIDMsTkcxKCA2LjUpLCA0LE5HMSggNi41KSwg
MCxORzEoNi41KSB9LCAgLyogIDEzTWIvcyAqLworCXsgNCxORzEoMTkuNSksIDMsTkcxKCA2LjUp
LCA0LE5HMSggNi41KSwgMCxORzEoNi41KSB9LCAgLyoxOS41TWIvcyAqLworCXsgNCxORzEoICAy
NiksIDMsTkcxKDE5LjUpLCA0LE5HMSggNi41KSwgMixORzEoNi41KSB9LCAgLyogIDI2TWIvcyAq
LworCXsgNCxORzEoICAzOSksIDMsTkcxKCAgMjYpLCA0LE5HMSgxOS41KSwgMixORzEoNi41KSB9
LCAgLyogIDM5TWIvcyAqLworCXsgNCxORzEoICA1MiksIDMsTkcxKCAgMzkpLCA0LE5HMSggIDI2
KSwgMixORzEoNi41KSB9LCAgLyogIDUyTWIvcyAqLworCXsgNCxORzEoNTguNSksIDMsTkcxKCAg
NTIpLCA0LE5HMSggIDM5KSwgMixORzEoIDEzKSB9LCAgLyo1OC41TWIvcyAqLworCXsgNCxORzEo
ICA2NSksIDMsTkcxKDU4LjUpLCA0LE5HMSggIDUyKSwgMixORzEoIDEzKSB9LCAgLyogIDY1TWIv
cyAqLworCisJLyogMiBzdHJlYW0gcmF0ZXMgKi8KKworCXsgMyxORzIoICAxMyksIDMsTkcyKCAg
MTMpLCAwLE5HMiggIDEzKSwgMCxORzIoIDEzKSB9LCAgLyogIDEzTWIvcyAqLworCXsgNCxORzIo
ICAyNiksIDMsTkcyKCAgMTMpLCA0LE5HMiggIDEzKSwgMCxORzIoIDEzKSB9LCAgLyogIDI2TWIv
cyAqLworCXsgNCxORzIoICAzOSksIDMsTkcyKCAgMjYpLCA0LE5HMiggIDEzKSwgMixORzIoIDEz
KSB9LCAgLyogIDM5TWIvcyAqLworCXsgNCxORzIoICA1MiksIDMsTkcyKCAgMzkpLCA0LE5HMigg
IDI2KSwgMixORzIoIDEzKSB9LCAgLyogIDUyTWIvcyAqLworCXsgNCxORzIoICA3OCksIDMsTkcy
KCAgNTIpLCA0LE5HMiggIDM5KSwgMixORzIoIDEzKSB9LCAgLyogIDc4TWIvcyAqLworCXsgNCxO
RzIoIDEwNCksIDMsTkcyKCAgNzgpLCA0LE5HMiggIDUyKSwgMixORzIoIDEzKSB9LCAgLyogMTA0
TWIvcyAqLworCXsgNCxORzIoIDExNyksIDMsTkcyKCAxMDQpLCA0LE5HMiggIDc4KSwgMixORzIo
IDI2KSB9LCAgLyogMTE3TWIvcyAqLworCXsgNCxORzIoIDEzMCksIDMsTkcyKCAxMTcpLCA0LE5H
MiggMTA0KSwgMixORzIoIDI2KSB9LCAgLyogMTMwTWIvcyAqLworCisJLyogMyBzdHJlYW0gcmF0
ZXMgKi8KKworCXsgMyxORzMoMTkuNSksIDMsTkczKDE5LjUpLCAwLE5HMygxOS41KSwgMCxORzMo
MTkuNSkgfSwgIC8qICAxOU1iL3MgKi8KKwl7IDMsTkczKCAgMzkpLCAzLE5HMygxOS41KSwgMCxO
RzMoMTkuNSksIDAsTkczKDE5LjUpIH0sICAvKiAgMzlNYi9zICovCisJeyAzLE5HMyg1OC41KSwg
MyxORzMoICAzOSksIDAsTkczKDE5LjUpLCAwLE5HMygxOS41KSB9LCAgLyogIDU4TWIvcyAqLwor
CXsgMyxORzMoICA3OCksIDMsTkczKDU4LjUpLCAwLE5HMyggIDM5KSwgMCxORzMoMTkuNSkgfSwg
IC8qICA3OE1iL3MgKi8KKwl7IDMsTkczKCAxMTcpLCAzLE5HMyggIDc4KSwgMCxORzMoNTguNSks
IDAsTkczKDE5LjUpIH0sICAvKiAxMTdNYi9zICovCisJeyAzLE5HMyggMTU2KSwgMyxORzMoIDEx
NyksIDAsTkczKCAgNzgpLCAwLE5HMygxOS41KSB9LCAgLyogIDE1Nk1iL3MgKi8KKwl7IDMsTkcz
KDE3NS41KSwgMyxORzMoIDE1NiksIDAsTkczKCAxMTcpLCAwLE5HMyggIDM5KSB9LCAgLyogIDE3
NU1iL3MgKi8KKwl7IDMsTkczKCAxOTUpLCAzLE5HMyggMTk1KSwgMCxORzMoIDE1NiksIDAsTkcz
KDU4LjUpIH0sICAvKiAxOTVNYi9zICovCisKK307CisjdW5kZWYgRworI3VuZGVmIE5HMworI3Vu
ZGVmIE5HMgorI3VuZGVmIE5HMQorCisjZGVmaW5lIEgoX3IpIFwKKyAgICAoKChfcikgPT0gMykg
ICA/IDAgOiAoKChfcikgPT0gNC41KSA/IDEgOiAoKChfcikgPT0gNikgID8gMiA6IFwKKyAgICAo
KChfcikgPT0gOSkgICA/IDMgOiAoKChfcikgPT0gMTIpICA/IDQgOiAoKChfcikgPT0gMTgpID8g
NSA6IFwKKyAgICAoKChfcikgPT0gMjQpICA/IDYgOiAoKChfcikgPT0gMjcpICA/IDcgOiAwKSkp
KSkpKSkKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdHhzY2hlZHVsZSBzZXJpZXNfaGFsZltdID0gewor
CXsgMyxIKCAzKSwgMyxIKCAgMyksIDAsSCggIDMpLCAwLEgoIDMpIH0sCS8qICAgM01iL3MgKi8K
Kwl7IDQsSCg0LjUpLDMsSCggIDMpLCA0LEgoICAzKSwgMCxIKCAzKSB9LAkvKiA0LjVNYi9zICov
CisJeyA0LEgoIDYpLCAzLEgoICAzKSwgNCxIKCAgMyksIDAsSCggMykgfSwJLyogICA2TWIvcyAq
LworCXsgNCxIKCA5KSwgMyxIKCAgNiksIDQsSCggIDMpLCAyLEgoIDMpIH0sCS8qICAgOU1iL3Mg
Ki8KKwl7IDQsSCgxMiksIDMsSCggIDkpLCA0LEgoICA2KSwgMixIKCAzKSB9LAkvKiAgMTJNYi9z
ICovCisJeyA0LEgoMTgpLCAzLEgoIDEyKSwgNCxIKCAgOSksIDIsSCggMykgfSwJLyogIDE4TWIv
cyAqLworCXsgNCxIKDI0KSwgMyxIKCAxOCksIDQsSCggMTIpLCAyLEgoIDYpIH0sCS8qICAyNE1i
L3MgKi8KKwl7IDQsSCgyNyksIDMsSCggMjQpLCA0LEgoIDE4KSwgMixIKDEyKSB9CS8qICAyN01i
L3MgKi8KK307CisjdW5kZWYgSAorCisjaWZkZWYgUQorI3VuZGVmIFEKKyNlbmRpZgorI2RlZmlu
ZSBRKF9yKSBcCisgICAgKCgoX3IpID09IDEuNSkgPyAwIDogKCgoX3IpID09Mi4yNSkgPyAxIDog
KCgoX3IpID09IDMpICA/IDIgOiBcCisgICAgKCgoX3IpID09IDQuNSkgPyAzIDogKCgoX3IpID09
ICA2KSAgPyA0IDogKCgoX3IpID09IDkpICA/IDUgOiBcCisgICAgKCgoX3IpID09IDEyKSAgPyA2
IDogKCgoX3IpID09IDEzLjUpPyA3IDogMCkpKSkpKSkpCitzdGF0aWMgY29uc3Qgc3RydWN0IHR4
c2NoZWR1bGUgc2VyaWVzX3F1YXJ0ZXJbXSA9IHsKKwl7IDMsUSggMS41KSwzLFEoMS41KSwgMCxR
KDEuNSksIDAsUSgxLjUpIH0sCS8qIDEuNU1iL3MgKi8KKwl7IDQsUSgyLjI1KSwzLFEoMS41KSwg
NCxRKDEuNSksIDAsUSgxLjUpIH0sCS8qMi4yNU1iL3MgKi8KKwl7IDQsUSggICAzKSwzLFEoMS41
KSwgNCxRKDEuNSksIDAsUSgxLjUpIH0sCS8qICAgM01iL3MgKi8KKwl7IDQsUSggNC41KSwzLFEo
ICAzKSwgNCxRKDEuNSksIDIsUSgxLjUpIH0sCS8qIDQuNU1iL3MgKi8KKwl7IDQsUSggICA2KSwz
LFEoNC41KSwgNCxRKCAgMyksIDIsUSgxLjUpIH0sCS8qICAgNk1iL3MgKi8KKwl7IDQsUSggICA5
KSwzLFEoICA2KSwgNCxRKDQuNSksIDIsUSgxLjUpIH0sCS8qICAgOU1iL3MgKi8KKwl7IDQsUSgg
IDEyKSwzLFEoICA5KSwgNCxRKCAgNiksIDIsUSggIDMpIH0sCS8qICAxMk1iL3MgKi8KKwl7IDQs
USgxMy41KSwzLFEoIDEyKSwgNCxRKCAgOSksIDIsUSggIDYpIH0JLyoxMy41TWIvcyAqLworfTsK
KyN1bmRlZiBRCisKKyNlbmRpZgpJbmRleDogc3lzL25ldDgwMjExL2llZWU4MDIxMV9yYXRlY3Rs
LmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gc3lzL25ldDgwMjExL2llZWU4MDIxMV9yYXRlY3RsLmMJKHJldmlz
aW9uIDI1NDgyNikKKysrIHN5cy9uZXQ4MDIxMS9pZWVlODAyMTFfcmF0ZWN0bC5jCShyZXZpc2lv
biAyNTU4NzIpCkBAIC0xLDUgKzEsNiBAQAogLyotCiAgKiBDb3B5cmlnaHQgKGMpIDIwMTAgUnVp
IFBhdWxvIDxycGF1bG9ARnJlZUJTRC5vcmc+CisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgQ2hlbmNo
b25nIFFpbiA8Y2NxaW5ARnJlZUJTRC5vcmc+CiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoK
ICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dApAQCAtNDksNiArNTAsMzMgQEAKIAogTUFMTE9DX0RFRklORShNXzgwMjEx
X1JBVEVDVEwsICI4MDIxMXJhdGVjdGwiLCAiODAyLjExIHJhdGUgY29udHJvbCIpOwogCitpbnQg
bWF4XzRtc19mcmFtZWxlbls0XVszMl0gPSB7CisJW01DU19IVDIwXSA9IHsKKwkJMzIxMiwgIDY0
MzIsICA5NjQ4LCAgMTI4NjQsICAxOTMwMCwgIDI1NzM2LCAgMjg5NTIsICAzMjE3MiwKKwkJNjQy
NCwgIDEyODUyLCAxOTI4MCwgMjU3MDgsICAzODU2OCwgIDUxNDI0LCAgNTc4NTIsICA2NDI4MCwK
KwkJOTYyOCwgIDE5MjYwLCAyODg5NiwgMzg1MjgsICA1Nzc5MiwgIDY1NTMyLCAgNjU1MzIsICA2
NTUzMiwKKwkJMTI4MjgsIDI1NjU2LCAzODQ4OCwgNTEzMjAsICA2NTUzMiwgIDY1NTMyLCAgNjU1
MzIsICA2NTUzMiwKKwl9LAorCVtNQ1NfSFQyMF9TR0ldID0geworCQkzNTcyLCAgNzE0NCwgIDEw
NzIwLCAgMTQyOTYsICAyMTQ0NCwgIDI4NTk2LCAgMzIxNzIsICAzNTc0NCwKKwkJNzE0MCwgIDE0
Mjg0LCAyMTQyOCwgIDI4NTY4LCAgNDI4NTYsICA1NzE0NCwgIDY0Mjg4LCAgNjU1MzIsCisJCTEw
NzAwLCAyMTQwOCwgMzIxMTIsICA0MjgxNiwgIDY0MjI4LCAgNjU1MzIsICA2NTUzMiwgIDY1NTMy
LAorCQkxNDI1NiwgMjg1MTYsIDQyNzgwLCAgNTcwNDAsICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIs
ICA2NTUzMiwKKwl9LAorCVtNQ1NfSFQ0MF0gPSB7CisJCTY2ODAsICAxMzM2MCwgIDIwMDQ0LCAg
MjY3MjQsICA0MDA5MiwgIDUzNDU2LCAgNjAxNDAsICA2NTUzMiwKKwkJMTMzNDgsIDI2NzAwLCAg
NDAwNTIsICA1MzQwMCwgIDY1NTMyLCAgNjU1MzIsICA2NTUzMiwgIDY1NTMyLAorCQkyMDAwNCwg
NDAwMDgsICA2MDAxNiwgIDY1NTMyLCAgNjU1MzIsICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIsCisJ
CTI2NjQ0LCA1MzI5MiwgIDY1NTMyLCAgNjU1MzIsICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIsICA2
NTUzMiwKKwl9LAorCVtNQ1NfSFQ0MF9TR0ldID0geworCQk3NDIwLCAgMTQ4NDQsICAyMjI3Miwg
IDI5Njk2LCAgNDQ1NDQsICA1OTM5NiwgIDY1NTMyLCAgNjU1MzIsCisJCTE0ODMyLCAyOTY2OCwg
IDQ0NTA0LCAgNTkzNDAsICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIsICA2NTUzMiwKKwkJMjIyMzIs
IDQ0NDY0LCAgNjU1MzIsICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIsICA2NTUzMiwgIDY1NTMyLAor
CQkyOTYxNiwgNTkyMzIsICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIsICA2NTUzMiwgIDY1NTMyLCAg
NjU1MzIsCisJfQorfTsKKwogdm9pZAogaWVlZTgwMjExX3JhdGVjdGxfcmVnaXN0ZXIoaW50IHR5
cGUsIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmF0ZWN0bCAqcmF0ZWN0bCkKIHsKQEAgLTY2LDEw
ICs5NCwxMSBAQAogfQogCiB2b2lkCi1pZWVlODAyMTFfcmF0ZWN0bF9pbml0KHN0cnVjdCBpZWVl
ODAyMTF2YXAgKnZhcCkKK2llZWU4MDIxMV9yYXRlY3RsX2luaXQoc3RydWN0IGllZWU4MDIxMXZh
cCAqdmFwLCB1aW50MzJfdCBjYXBhYmlsaXRpZXMpCiB7CiAJaWYgKHZhcC0+aXZfcmF0ZSA9PSBy
YXRlY3Rsc1tJRUVFODAyMTFfUkFURUNUTF9OT05FXSkKIAkJaWVlZTgwMjExX3JhdGVjdGxfc2V0
KHZhcCwgSUVFRTgwMjExX1JBVEVDVExfQU1SUik7CisJdmFwLT5pdl9yYXRlLmlyX2NhcGFiaWxp
dGllcyA9IGNhcGFiaWxpdGllczsKIAl2YXAtPml2X3JhdGUtPmlyX2luaXQodmFwKTsKIH0KIApA
QCAtOTAsMyArMTE5LDk3IEBACiAJfQogCXZhcC0+aXZfcmF0ZSA9IHJhdGVjdGxzW3R5cGVdOwog
fQorCit2b2lkCitpZWVlODAyMTFfcmF0ZWN0bF9jb21wbGV0ZV9yY2ZsYWdzKGNvbnN0IHN0cnVj
dCBpZWVlODAyMTFfbm9kZSAqbmksCisJCXN0cnVjdCBpZWVlODAyMTFfcmNfaW5mbyAqcmNfaW5m
bykKK3sKKwljb25zdCBzdHJ1Y3QgaWVlZTgwMjExY29tICppYyA9IG5pLT5uaV9pYzsKKwljb25z
dCBzdHJ1Y3QgaWVlZTgwMjExdmFwICp2YXAgPSBuaS0+bmlfdmFwOworCWNvbnN0IHN0cnVjdCBp
ZWVlODAyMTFfcmF0ZV90YWJsZSAqIHJ0ID0gaWMtPmljX3J0OworCXN0cnVjdCBpZWVlODAyMTFf
cmNfc2VyaWVzICpyYyA9IHJjX2luZm8tPnJpX3JjOworCWludCBzaG9ydFByZWFtYmxlID0gcmNf
aW5mby0+cmlfc2hvcnRQcmVhbWJsZTsKKwl1aW50OF90IHJhdGU7CisJaW50IGk7CisKKwkvKiBN
YWtlIHN1cmUgdGhhdCByYXRlIGNvbnRyb2wgY29kZSBkb2Vzbid0IG1lc3MgaXQgdXAuCisJICog
SWYgZW5hYmxlIHJ0cy9jdHMgYW5kIGlzIHByZS04MDIuMTFuLCBibGFuayB0cmllcyAxLCAyLCAz
IAorCSAqLworCisJaWYgKCEgKHZhcC0+aXZfcmF0ZS0+aXJfY2FwYWJpbGl0aWVzICYgSUVFRTgw
MjExX1JBVEVDVExfQ0FQX01SUlBST1QpKQorCXsKKwkJZm9yIChpID0gMTsgaSA8IElFRUU4MDIx
MV9SQVRFQ1RMX05VTTsgaSsrKQorCQl7CisJCQlpZiAocmNbMF0uZmxhZ3MgJiBJRUVFODAyMTFf
UkFURUNUTF9SVFNDVFNfRkxBRykKKwkJCQlyY1tpXS50cmllcyA9IDA7CisJCQlyY1tpXS5mbGFn
cyAmPSB+SUVFRTgwMjExX1JBVEVDVExfUlRTQ1RTX0ZMQUc7IAorCQl9CisJfQorCisJZm9yIChp
ID0gMDsgaSA8IElFRUU4MDIxMV9SQVRFQ1RMX05VTTsgaSsrKSB7CisJCQorCQlpZiAocmNbaV0u
dHJpZXMgPT0gMCkKKwkJCWNvbnRpbnVlOworCisJCXJhdGUgPSBydC0+aW5mb1tyY1tpXS5yaXhd
LnJhdGVDb2RlOworCisJCS8qCisJCSAqIE9ubHkgZW5hYmxlIHNob3J0IHByZWFtYmxlIGZvciBs
ZWdhY3kgcmF0ZXMKKwkJICovCisJCWlmICgoISBJU19IVF9SQVRFKHJhdGUpKSAmJiBzaG9ydFBy
ZWFtYmxlKQorCQkJcmF0ZSB8PSBydC0+aW5mb1tyY1tpXS5yaXhdLnNob3J0UHJlYW1ibGU7CisK
KwkJLyoKKwkJICogU2F2ZSB0aGlzLCB1c2VkIGJ5IHRoZSBUWCBhbmQgY29tcGxldGlvbiBjb2Rl
CisJCSAqLworCQlyY1tpXS5yYXRlY29kZSA9IHJhdGU7CisKKwkJLyogT25seSBlbmFibGUgc2hv
cnRnaSwgMjA0MCwgZHVhbC1zdHJlYW0gaWYgSFQgaXMgc2V0ICovCisJCWlmIChJU19IVF9SQVRF
KHJhdGUpKSB7CisJCQlyY1tpXS5mbGFncyB8PSBJRUVFODAyMTFfUkFURUNUTF9IVF9GTEFHOwor
CisJCQkvKgorCQkJICogWFhYIFRPRE86IExEUEMKKwkJCSAqLworCisJCQkvKgorCQkJICogRHVh
bCAvIFRyaXBsZSBzdHJlYW0gcmF0ZT8KKwkJCSAqLworCQkJaWYgKEhUX1JDXzJfU1RSRUFNUyhy
YXRlKSA9PSAyKQorCQkJCXJjW2ldLmZsYWdzIHw9IElFRUU4MDIxMV9SQVRFQ1RMX0RTX0ZMQUc7
CisJCQllbHNlIGlmIChIVF9SQ18yX1NUUkVBTVMocmF0ZSkgPT0gMykKKwkJCQlyY1tpXS5mbGFn
cyB8PSBJRUVFODAyMTFfUkFURUNUTF9UU19GTEFHOworCQl9CisKKwkJLyoKKwkJICogQ2FsY3Vs
YXRlIHRoZSBtYXhpbXVtIFRYIHBvd2VyIGNhcCBmb3IgdGhlIGN1cnJlbnQKKwkJICogbm9kZS4g
CisJCSAqIFJhdGUgY29udHJvbCBhbGdvIGNhbid0IGNvbnRyb2wgVFggcG93ZXIgYnkgbm93Lgor
CQkgKi8KKwkJcmNbaV0udHhfcG93ZXJfY2FwID0gaWVlZTgwMjExX2dldF9ub2RlX3R4cG93ZXIo
bmkpOworCQkKKwkJLyoKKwkJICogQ2FsY3VsYXRlIHRoZSBtYXhpbXVtIDRtcyBmcmFtZSBsZW5n
dGggYmFzZWQKKwkJICogb24gdGhlIE1DUyByYXRlLCBTR0kgYW5kIGNoYW5uZWwgd2lkdGggZmxh
Z3MuCisJCSAqLworCQlpZiAoKHJjW2ldLmZsYWdzICYgSUVFRTgwMjExX1JBVEVDVExfSFRfRkxB
RykgJiYKKwkJICAgIChIVF9SQ18yX01DUyhyYXRlKSA8IDMyKSkgeworCQkJaW50IGo7CisJCQlp
ZiAocmNbaV0uZmxhZ3MgJiBJRUVFODAyMTFfUkFURUNUTF9DVzQwX0ZMQUcpIHsKKwkJCQlpZiAo
cmNbaV0uZmxhZ3MgJiBJRUVFODAyMTFfUkFURUNUTF9TR0lfRkxBRykKKwkJCQkJaiA9IE1DU19I
VDQwX1NHSTsKKwkJCQllbHNlCisJCQkJCWogPSBNQ1NfSFQ0MDsKKwkJCX0gZWxzZSB7CisJCQkJ
aWYgKHJjW2ldLmZsYWdzICYgSUVFRTgwMjExX1JBVEVDVExfU0dJX0ZMQUcpCisJCQkJCWogPSBN
Q1NfSFQyMF9TR0k7CisJCQkJZWxzZQorCQkJCQlqID0gTUNTX0hUMjA7CisJCQl9CisJCQlyY1tp
XS5tYXg0bXNmcmFtZWxlbiA9CisJCQkgICAgbWF4XzRtc19mcmFtZWxlbltqXVtIVF9SQ18yX01D
UyhyYXRlKV07CisJCX0gZWxzZQorCQkJcmNbaV0ubWF4NG1zZnJhbWVsZW4gPSAwOworCX0KK30K
KwpJbmRleDogc3lzL25ldDgwMjExL2llZWU4MDIxMV9yYXRlY3RsLmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
c3lzL25ldDgwMjExL2llZWU4MDIxMV9yYXRlY3RsLmgJKHJldmlzaW9uIDI1NDgyNikKKysrIHN5
cy9uZXQ4MDIxMS9pZWVlODAyMTFfcmF0ZWN0bC5oCShyZXZpc2lvbiAyNTU4NzIpCkBAIC0xLDUg
KzEsNiBAQAogLyotCiAgKiBDb3B5cmlnaHQgKGMpIDIwMTAgUnVpIFBhdWxvIDxycGF1bG9ARnJl
ZUJTRC5vcmc+CisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgQ2hlbmNob25nIFFpbiA8Y2NxaW5ARnJl
ZUJTRC5vcmc+CiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAt
MjQsNiArMjUsOCBAQAogICoKICAqICRGcmVlQlNEJAogICovCisjaWZuZGVmIF9ORVQ4MDIxMV9J
RUVFODAyMTFfUkFURUNUTF9IXworI2RlZmluZSBfTkVUODAyMTFfSUVFRTgwMjExX1JBVEVDVExf
SF8KIAogZW51bSBpZWVlODAyMTFfcmF0ZWFsZ3MgewogCUlFRUU4MDIxMV9SQVRFQ1RMX0FNUlIJ
CT0gMCwKQEAgLTM0LDExICszNyw3NCBAQAogCUlFRUU4MDIxMV9SQVRFQ1RMX01BWAogfTsKIAor
ZW51bSB7CisJTUNTX0hUMjAsCisJTUNTX0hUMjBfU0dJLAorCU1DU19IVDQwLAorCU1DU19IVDQw
X1NHSSwKK307CisKICNkZWZpbmUJSUVFRTgwMjExX1JBVEVDVExfVFhfU1VDQ0VTUwkxCiAjZGVm
aW5lCUlFRUU4MDIxMV9SQVRFQ1RMX1RYX0ZBSUxVUkUJMAogCisjZGVmaW5lCUlFRUU4MDIxMV9S
QVRFQ1RMX1RSVUUJCTEKKyNkZWZpbmUJSUVFRTgwMjExX1JBVEVDVExfRkFMU0UJCTAKKworI2Rl
ZmluZQlJRUVFODAyMTFfUkFURUNUTF9OVU0JCTQKKworI2RlZmluZQlJRUVFODAyMTFfUkFURUNU
TF9EU19GTEFHCQkweDAxCS8qIGR1YWwtc3RyZWFtIHJhdGUgKi8KKyNkZWZpbmUJSUVFRTgwMjEx
X1JBVEVDVExfQ1c0MF9GTEFHCQkweDAyCS8qIHVzZSBIVDQwICovCisjZGVmaW5lCUlFRUU4MDIx
MV9SQVRFQ1RMX1NHSV9GTEFHCQkweDA0CS8qIHVzZSBzaG9ydC1HSSAqLworI2RlZmluZQlJRUVF
ODAyMTFfUkFURUNUTF9IVF9GTEFHCQkweDA4CS8qIHVzZSBIVCAqLworI2RlZmluZQlJRUVFODAy
MTFfUkFURUNUTF9SVFNDVFNfRkxBRwkweDEwCS8qIGVuYWJsZSBSVFMvQ1RTIHByb3RlY3Rpb24g
Ki8KKyNkZWZpbmUJSUVFRTgwMjExX1JBVEVDVExfU1RCQ19GTEFHCQkweDIwCS8qIGVuYWJsZSBT
VEJDICovCisjZGVmaW5lCUlFRUU4MDIxMV9SQVRFQ1RMX1RTX0ZMQUcJCTB4NDAJLyogdHJpcGxl
LXN0cmVhbSByYXRlICovCisKKy8qIEhhcmR3YXJlIENBUHMgY2hpcCBvZmZlcmVkIHRvIHJhdGUg
Y29udHJvbCBjb2RlICovCisjZGVmaW5lCUlFRUU4MDIxMV9SQVRFQ1RMX0NBUF9NUlIJCQkweDAx
CS8qIHN1cHBvcnQgTVJSICovCisjZGVmaW5lCUlFRUU4MDIxMV9SQVRFQ1RMX0NBUF9NUlJQUk9U
CQkweDAyCS8qIHN1cHBvcnQgTVJSICsgcHJvdGVjdCAqLworI2RlZmluZQlJRUVFODAyMTFfUkFU
RUNUTF9DQVBfTVVMVFhDSEFJTgkweDA0CS8qIGhhcyBtb3JlIHRoYW4gMSB0eGNoYWluICovCisK
KyNkZWZpbmUgSVNfVkFQX0hUKHZhcCkJKCh2YXApLT5pdl9odGNhcHMgJiBJRUVFODAyMTFfSFRD
X0hUKQorCisjZGVmaW5lIElTX0hUX1JBVEUoX3JhdGUpICAgKChfcmF0ZSkgJiAweDgwKQorI2Rl
ZmluZSBIVF9SQ18yX01DUyhfcmMpICAgICgoX3JjKSAmIDB4N2YpCisjZGVmaW5lIEhUX1JDXzJf
U1RSRUFNUyhfcmMpICAgICgoKChfcmMpICYgMHg3OCkgPj4gMykgKyAxKQorCisKK2V4dGVybiBp
bnQgbWF4XzRtc19mcmFtZWxlbls0XVszMl07CisKK3N0cnVjdCBpZWVlODAyMTFfcmNfc2VyaWVz
IHsKKwl1aW50OF90IHJpeDsJCS8qIHJhdGV0YWJsZSBpbmRleCwgbm90IHJhdGUgY29kZSAqLwor
CXVpbnQ4X3QgcmF0ZWNvZGU7CS8qIGhhcmR3YXJlIHJhdGUgY29kZSAqLworCXVpbnQ4X3QgdHJp
ZXM7CisJdWludDhfdCB0eF9wb3dlcl9jYXA7CisJdWludDE2X3QgZmxhZ3M7CisJdWludDE2X3Qg
bWF4NG1zZnJhbWVsZW47Cit9OworCisvKiAgKi8KK3N0cnVjdCBpZWVlODAyMTFfcmNfaW5mbyB7
CisJc3RydWN0IGllZWU4MDIxMV9yY19zZXJpZXMgcmlfcmNbSUVFRTgwMjExX1JBVEVDVExfTlVN
XTsKKwlpbnQgcmlfZnJhbWVsZW47CisJaW50IHJpX3Nob3J0UHJlYW1ibGU7CisKKwkvKiBUWCBp
bmZvICovCisJaW50IHJpX3N1Y2Nlc3M7CQkvKiBUWCBzdWNjZXNzIG9yIG5vdCAqLworCWludCBy
aV9va2NudDsJCS8qIFRYIG9rIHdpdGggb3Igd2l0aG91dCByZXRyeSAqLworCWludCByaV9mYWls
Y250OwkJLyogVFggcmV0cnktZmFpbCBjb3VudCAqLworCWludCByaV90eGNudDsJCS8qIFRYIGNv
dW50ICovCisJaW50IHJpX3JldHJ5Y250OwkvKiBUWCByZXRyeSBjb3VudCAqLworCWludCByaV9z
aG9ydHJldHJ5OworCWludCByaV9sb25ncmV0cnk7CisJaW50IHJpX2ZpbmFsdHNpOworCWludCBy
aV90eHJhdGU7CQkvKiBodyB0eCByYXRlICovCit9OworCiBzdHJ1Y3QgaWVlZTgwMjExX3JhdGVj
dGwgewogCWNvbnN0IGNoYXIgKmlyX25hbWU7CisJdWludDMyX3QgaXJfY2FwYWJpbGl0aWVzOwkJ
LyogaGFyZHdhcmUgY2FwYWJpbGl0aWVzIG9mZmVyZWQgdG8gcmMgKi8KKwogCWludAkoKmlyX2F0
dGFjaCkoY29uc3Qgc3RydWN0IGllZWU4MDIxMXZhcCAqKTsKIAl2b2lkCSgqaXJfZGV0YWNoKShj
b25zdCBzdHJ1Y3QgaWVlZTgwMjExdmFwICopOwogCXZvaWQJKCppcl9pbml0KShzdHJ1Y3QgaWVl
ZTgwMjExdmFwICopOwpAQCAtNDYsNiArMTEyLDcgQEAKIAl2b2lkCSgqaXJfbm9kZV9pbml0KShz
dHJ1Y3QgaWVlZTgwMjExX25vZGUgKik7CiAJdm9pZAkoKmlyX25vZGVfZGVpbml0KShzdHJ1Y3Qg
aWVlZTgwMjExX25vZGUgKik7CiAJaW50CSgqaXJfcmF0ZSkoc3RydWN0IGllZWU4MDIxMV9ub2Rl
ICosIHZvaWQgKiwgdWludDMyX3QpOworCXZvaWQJKCppcl9yYXRlcykoc3RydWN0IGllZWU4MDIx
MV9ub2RlICosIHN0cnVjdCBpZWVlODAyMTFfcmNfaW5mbyAqKTsKIAl2b2lkCSgqaXJfdHhfY29t
cGxldGUpKGNvbnN0IHN0cnVjdCBpZWVlODAyMTF2YXAgKiwKIAkgICAgCQkJICBjb25zdCBzdHJ1
Y3QgaWVlZTgwMjExX25vZGUgKiwgaW50LAogCSAgICAJCQkgIHZvaWQgKiwgdm9pZCAqKTsKQEAg
LTU3LDggKzEyNCwxMCBAQAogCiB2b2lkCWllZWU4MDIxMV9yYXRlY3RsX3JlZ2lzdGVyKGludCwg
Y29uc3Qgc3RydWN0IGllZWU4MDIxMV9yYXRlY3RsICopOwogdm9pZAlpZWVlODAyMTFfcmF0ZWN0
bF91bnJlZ2lzdGVyKGludCk7Ci12b2lkCWllZWU4MDIxMV9yYXRlY3RsX2luaXQoc3RydWN0IGll
ZWU4MDIxMXZhcCAqKTsKK3ZvaWQJaWVlZTgwMjExX3JhdGVjdGxfaW5pdChzdHJ1Y3QgaWVlZTgw
MjExdmFwICosIHVpbnQzMl90KTsKIHZvaWQJaWVlZTgwMjExX3JhdGVjdGxfc2V0KHN0cnVjdCBp
ZWVlODAyMTF2YXAgKiwgaW50KTsKK3ZvaWQJaWVlZTgwMjExX3JhdGVjdGxfY29tcGxldGVfcmNm
bGFncyhjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKiwgCisJCXN0cnVjdCBpZWVlODAyMTFf
cmNfaW5mbyopCiAKIE1BTExPQ19ERUNMQVJFKE1fODAyMTFfUkFURUNUTCk7CiAKQEAgLTkzLDYg
KzE2MiwxNSBAQAogfQogCiBzdGF0aWMgdm9pZCBfX2lubGluZQoraWVlZTgwMjExX3JhdGVjdGxf
cmF0ZXMoc3RydWN0IGllZWU4MDIxMV9ub2RlICpuaSwgc3RydWN0IGllZWU4MDIxMV9yY19pbmZv
ICpyY19pbmZvKQoreworCWNvbnN0IHN0cnVjdCBpZWVlODAyMTF2YXAgKnZhcCA9IG5pLT5uaV92
YXA7CisKKwl2YXAtPml2X3JhdGUtPmlyX3JhdGVzKG5pLCByY19pbmZvKTsKKwlpZWVlODAyMTFf
cmF0ZWN0bF9jb21wbGV0ZV9yY2ZsYWdzKG5pLCByY19pbmZvKTsKK30KKworc3RhdGljIHZvaWQg
X19pbmxpbmUKIGllZWU4MDIxMV9yYXRlY3RsX3R4X2NvbXBsZXRlKGNvbnN0IHN0cnVjdCBpZWVl
ODAyMTF2YXAgKnZhcCwKICAgICBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5pLCBpbnQg
c3RhdHVzLCB2b2lkICphcmcxLCB2b2lkICphcmcyKQogewpAQCAtMTE1LDMgKzE5Myw0MCBAQAog
CQlyZXR1cm47CiAJdmFwLT5pdl9yYXRlLT5pcl9zZXRpbnRlcnZhbCh2YXAsIG1zZWNzKTsKIH0K
Kworc3RhdGljIGludCBfX2lubGluZQoraWVlZTgwMjExX3JhdGVjdGxfaGFzY2FwX2N3NDAoY29u
c3Qgc3RydWN0IGllZWU4MDIxMXZhcCAqdmFwLAorCQljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX25v
ZGUgKm5pKQoreworCXJldHVybiBJU19WQVBfSFQodmFwKSAmJiAobmktPm5pX2NodyA9PSA0MCk7
Cit9CisKK3N0YXRpYyBpbnQgX19pbmxpbmUKK2llZWU4MDIxMV9yYXRlY3RsX2hhc2NhcF9zaG9y
dGdpKGNvbnN0IHN0cnVjdCBpZWVlODAyMTF2YXAgKnZhcCwKKwkJY29uc3Qgc3RydWN0IGllZWU4
MDIxMV9ub2RlICpuaSkKK3sKKwlpZiAoISBJU19WQVBfSFQodmFwKSkKKwkJcmV0dXJuIElFRUU4
MDIxMV9SQVRFQ1RMX0ZBTFNFOworCisJaWYgKG5pLT5uaV9jaHcgPT0gNDAgJiYKKwkJCXZhcC0+
aXZfaHRjYXBzICYgSUVFRTgwMjExX0hUQ0FQX1NIT1JUR0k0MCAmJgorCQkJbmktPm5pX2h0Y2Fw
ICYgSUVFRTgwMjExX0hUQ0FQX1NIT1JUR0k0MCkKKwkJcmV0dXJuIElFRUU4MDIxMV9SQVRFQ1RM
X1RSVUU7CisKKwlpZiAobmktPm5pX2NodyA9PSAyMCAmJgorCQkJdmFwLT5pdl9odGNhcHMgJiBJ
RUVFODAyMTFfSFRDQVBfU0hPUlRHSTIwICYmCisJCQluaS0+bmlfaHRjYXAgJiBJRUVFODAyMTFf
SFRDQVBfU0hPUlRHSTIwKQorCQlyZXR1cm4gSUVFRTgwMjExX1JBVEVDVExfVFJVRTsKK30KKwor
CitzdGF0aWMgaW50IF9faW5saW5lCitpZWVlODAyMTFfcmF0ZWN0bF9oYXNjYXBfc3RiYyhjb25z
dCBzdHJ1Y3QgaWVlZTgwMjExdmFwICp2YXAsCisJCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfbm9k
ZSAqbmkpCit7CisgICByZXR1cm4gSVNfVkFQX0hUKHZhcCkgJiYgKHZhcC0+aXZfaHRjYXBzICYg
SUVFRTgwMjExX0hUQ0FQX1RYU1RCQykgJiYKKwkJCSAgICAobmktPm5pX2h0Y2FwICYgSUVFRTgw
MjExX0hUQ0FQX1JYU1RCQ18xU1RSRUFNKSAmJgorCQkJICAgICh2YXAtPml2X3JhdGUtPmlyX2Nh
cGFiaWxpdGllcyAmIElFRUU4MDIxMV9SQVRFQ1RMX0NBUF9NVUxUWENIQUlOKTsKK30KKworI2Vu
ZGlmCg==
--047d7b3434b695a01504e3d34963--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAFnsE3df=1WEuLZh5355v_K2eBgcuBbpoza74Y-5vvNupBz22A>