Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 31 Jul 2010 05:17:36 +0530
From:      "Jayachandran C." <c.jayachandran@gmail.com>
To:        Juli Mallett <jmallett@freebsd.org>
Cc:        freebsd-mips@freebsd.org
Subject:   Re: Support for 64bit userspace.
Message-ID:  <AANLkTin4eNd4KGfWPKXKLDHyuFZs0a3pdVoeW_qA-e0P@mail.gmail.com>
In-Reply-To: <AANLkTinz-Gs-iojO9PYS%2BV3Qr-TPSfWhKCwnX9XN_rbq@mail.gmail.com>
References:  <AANLkTikZKS8iuST1dp5yfo6P6kaif4b1YzsKAskk_wB=@mail.gmail.com> <AANLkTinXdCLinp=07dsPYs3qr7nWJ6nZzKF5DV=z1R59@mail.gmail.com> <AANLkTinwi7v3wANCd5EGA9GHuWUrnAEP3Rq6EedGpGKe@mail.gmail.com> <20100729.131134.4959786895411328.imp@bsdimp.com> <AANLkTimOM-LmBChHPgU%2Bqa7Q_YFwc5ZYv7JkOfiV3FDU@mail.gmail.com> <AANLkTinz-Gs-iojO9PYS%2BV3Qr-TPSfWhKCwnX9XN_rbq@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
--0016364166e9bf4987048ca37966
Content-Type: text/plain; charset=windows-1252
Content-Transfer-Encoding: quoted-printable

On Fri, Jul 30, 2010 at 2:07 PM, Juli Mallett <jmallett@freebsd.org> wrote:

> On Fri, Jul 30, 2010 at 01:15, Jayachandran C. <c.jayachandran@gmail.com>
> wrote:
> > I will look at merging them without too many ifdefs. Another
> > possibility is to have a pmap.c, pmap32.c and pmap64.c, so that the
> > common code is not duplicated, but that too (as far as I can see) will
> > require a config option.
>
> I'm not really sure what the aversion to ifdefs is =97 they kind of come
> with the territory and this is exactly the part of the system where
> you expect to have them to conditionalize exactly this kind of
> behavior.  If you were going to split out some subroutines for 32-bit
> and 64-bit, there are two ways you can do it without a config option
> (and I agree with you that avoiding one is very desirable =97 we already
> use too many knobs to get the right ABI in kernel configs).  You could
> do:
>
> #ifndef __mips_n64
> #include "pmap32.c"
> #else
> #include "pmap64.c"
> #endif
>
> Or you could wrap the whole 32/64 files (modulo a "struct __hack;" or
> whatever to avoid an empty translation unit) with ifdefs.
>
> Personally, I find having two implementations of a function a lot
> harder to read and keep track of than a single implementation with
> ifdefs in the body =97 there's very few places in the kernel where we do
> the former.  If you do split out functions into separate files I would
> beg you to only split out the really big functions that are actually
> doing things based on different levels of page tables and then it's
> obvious why those things have two implementations and what needs to be
> abstracted to merge them.  Having two copies of trivial functions or
> non-trivial functions that are mostly identical is a bad thing.
>
> You're doing the work, so at some point it's kind of your call, but I
> feel like you're making style changes to things that I cleaned up and
> tried to unify in pmap.c and that the way that they're done is pretty
> significant given how intimidating people find pmap.  If we were going
> to support different kinds of MMUs (e.g. adding support for BAT-based
> MMUs) I'd be in favor of splitting things up, but then I'd want to
> follow PowerPC's lead.  For now I think the appropriate thing to do is
> to follow the lead of my 64-bit work in the MIPS pmap and the PAE work
> in the i386 pmap and to use ifdefs and to try to abstract out the
> page-table differences.
>

I had not looked at merging the files so far (mostly because it was easier
to do it this way), so I will see how best this can be done.

I'm really thrilled with the work you're doing and can't wait for it
> to be in head =97 I'm quite eager to move everything on Octeon to n64 :)
>

I have checked in everything except the page table implementation code.

If you like to try the current code, the attached patch has the rest of the
changes.  This has a few more issues fixed, n64 mostly works for me, except
a csh crash I'm looking at.

I'll have a look at merging pmap.c with pmap64.c, and have another look at
the PAE.

JC.

--0016364166e9bf4987048ca37966
Content-Type: application/octet-stream; name="mips-3lvl-pt.patch"
Content-Disposition: attachment; filename="mips-3lvl-pt.patch"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_gc9o4ist0

SW5kZXg6IHN5cy9jb25mL29wdGlvbnMubWlwcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBzeXMvY29uZi9vcHRp
b25zLm1pcHMJKHJldmlzaW9uIDIxMDYwMSkKKysrIHN5cy9jb25mL29wdGlvbnMubWlwcwkod29y
a2luZyBjb3B5KQpAQCAtNTMsNiArNTMsOSBAQAogVEFSR0VUX0VNVUxBVE9SCW9wdF9kZGIuaAog
VEFSR0VUX1hMUl9YTFMgIG9wdF9nbG9iYWwuaAogCitLRVJORUxfNjQJb3B0X2dsb2JhbC5oCitL
RVJORUxfMzIJb3B0X2dsb2JhbC5oCisKIFRJQ0tfVVNFX1lBTU9OX0ZSRVEJb3B0X2dsb2JhbC5o
CiBUSUNLX1VTRV9NQUxUQV9SVEMJb3B0X2dsb2JhbC5oCiAKSW5kZXg6IHN5cy9jb25mL2ZpbGVz
Lm1pcHMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gc3lzL2NvbmYvZmlsZXMubWlwcwkocmV2aXNpb24gMjEwNjAx
KQorKysgc3lzL2NvbmYvZmlsZXMubWlwcwkod29ya2luZyBjb3B5KQpAQCAtMzIsNyArMzIsOCBA
QAogbWlwcy9taXBzL2V4Y2VwdGlvbi5TCQlzdGFuZGFyZAogbWlwcy9taXBzL2dkYl9tYWNoZGVw
LmMJCXN0YW5kYXJkCiAjIG1pcHMvbWlwcy9tYWluYnVzLmMJCXN0YW5kYXJkCi1taXBzL21pcHMv
cG1hcC5jCQlzdGFuZGFyZAorbWlwcy9taXBzL3BtYXAuYwkJb3B0aW9uYWwga2VybmVsXzMyCitt
aXBzL21pcHMvcG1hcDY0LmMJCW9wdGlvbmFsIGtlcm5lbF82NAogbWlwcy9taXBzL3RyYXAuYwkJ
c3RhbmRhcmQKIG1pcHMvbWlwcy92bV9tYWNoZGVwLmMJCXN0YW5kYXJkCiAjIC0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0KSW5kZXg6IHN5cy9taXBzL2luY2x1ZGUvcGFyYW0uaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBzeXMvbWlw
cy9pbmNsdWRlL3BhcmFtLmgJKHJldmlzaW9uIDIxMDYyNykKKysrIHN5cy9taXBzL2luY2x1ZGUv
cGFyYW0uaAkod29ya2luZyBjb3B5KQpAQCAtMTA3LDggKzEwNywxNiBAQAogI2RlZmluZQlOUFRF
UEcJCShQQUdFX1NJWkUvKHNpemVvZiAocHRfZW50cnlfdCkpKQogI2RlZmluZQlOUERFUEcJCShQ
QUdFX1NJWkUvKHNpemVvZiAocGRfZW50cnlfdCkpKQogCisjaWYgZGVmaW5lZChfX21pcHNfbjY0
KQorI2RlZmluZQlTRUdTSElGVAkzMQkJLyogTE9HMihOQlNFRykgKi8KKyNkZWZpbmUJTkJTRUcJ
CSgxdWwgPDwgU0VHU0hJRlQpCS8qIGJ5dGVzL3NlZ21lbnQgKi8KKyNlbHNlCiAjZGVmaW5lCVNF
R1NISUZUCTIyCQkvKiBMT0cyKE5CU0VHKSAqLwogI2RlZmluZQlOQlNFRwkJKDEgPDwgU0VHU0hJ
RlQpCS8qIGJ5dGVzL3NlZ21lbnQgKi8KKyNlbmRpZgorI2RlZmluZQlQRFJTSElGVAkyMiAgICAg
ICAgICAgICAgLyogb25seSB1c2VkIGluIG42NCAqLworI2RlZmluZQlQRFJNQVNLCQkoKDEgPDwg
UERSU0hJRlQpIC0gMSkKKyNkZWZpbmUJTkJQRFIJCSgxIDw8IFBEUlNISUZUKQkvKiBieXRlcy9w
YWdlZGlyICovCiAjZGVmaW5lCVNFR01BU0sJCShOQlNFRy0xKQkvKiBieXRlIG9mZnNldCBpbnRv
IHNlZ21lbnQgKi8KIAogI2RlZmluZQlNQVhQQUdFU0laRVMJMQkJLyogbWF4aW11bSBudW1iZXIg
b2Ygc3VwcG9ydGVkIHBhZ2Ugc2l6ZXMgKi8KSW5kZXg6IHN5cy9taXBzL2NvbmYvWExSNjQKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gc3lzL21pcHMvY29uZi9YTFI2NAkocmV2aXNpb24gMjEwNjAxKQorKysgc3lz
L21pcHMvY29uZi9YTFI2NAkod29ya2luZyBjb3B5KQpAQCAtMjUsNiArMjUsOCBAQAogbWFrZW9w
dGlvbnMgICAgIFRBUkdFVF9CSUdfRU5ESUFOCiAKIGluY2x1ZGUJCSIuLi9ybWkvc3RkLnhsciIK
K25vb3B0aW9uCUtFUk5FTF8zMgorb3B0aW9ucwkJS0VSTkVMXzY0CiAKIG1ha2VvcHRpb25zCURF
QlVHPS1nCQkjIEJ1aWxkIGtlcm5lbCB3aXRoIGdkYigxKSBkZWJ1ZyBzeW1ib2xzCiBtYWtlb3B0
aW9ucwlBUkNIX0ZMQUdTPSItbWFyY2g9bWlwczY0IC1tYWJpPTY0IgpJbmRleDogc3lzL21pcHMv
Y29uZi9ERUZBVUxUUwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBzeXMvbWlwcy9jb25mL0RFRkFVTFRTCShyZXZp
c2lvbiAyMTA2MDEpCisrKyBzeXMvbWlwcy9jb25mL0RFRkFVTFRTCSh3b3JraW5nIGNvcHkpCkBA
IC0xMSwzICsxMSw0IEBACiAKIG9wdGlvbnMgCUdFT01fUEFSVF9CU0QKIG9wdGlvbnMgCUdFT01f
UEFSVF9NQlIKK29wdGlvbnMJCUtFUk5FTF8zMgpJbmRleDogc3lzL21pcHMvbWlwcy9wbWFwNjQu
Ywo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBzeXMvbWlwcy9taXBzL3BtYXA2NC5jCShyZXZpc2lvbiAwKQorKysg
c3lzL21pcHMvbWlwcy9wbWFwNjQuYwkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwyOTk5IEBACisv
KgorICogQ29weXJpZ2h0IChjKSAxOTkxIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2Fs
aWZvcm5pYS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQg
Sm9obiBTLiBEeXNvbgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykg
MTk5NCBEYXZpZCBHcmVlbm1hbgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlz
IGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5
CisgKiB0aGUgU3lzdGVtcyBQcm9ncmFtbWluZyBHcm91cCBvZiB0aGUgVW5pdmVyc2l0eSBvZiBV
dGFoIENvbXB1dGVyCisgKiBTY2llbmNlIERlcGFydG1lbnQgYW5kIFdpbGxpYW0gSm9saXR6IG9m
IFVVTkVUIFRlY2hub2xvZ2llcyBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1l
IG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICog
ICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJv
bSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVy
bWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRT
IEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUg
UkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAor
ICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1Ig
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QK
KyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgor
ICoKKyAqCWZyb206CUAoIylwbWFwLmMJNy43IChCZXJrZWxleSkJNS8xMi85MQorICoJZnJvbTog
c3JjL3N5cy9pMzg2L2kzODYvcG1hcC5jLHYgMS4yNTAuMi44IDIwMDAvMTEvMjEgMDA6MDk6MTQg
cHMKKyAqCUpOUFI6IHBtYXAuYyx2IDEuMTEuMi4xIDIwMDcvMDgvMTYgMTE6NTE6MDYgZ2lyaXNo
CisgKi8KKworLyoKKyAqCU1hbmFnZXMgcGh5c2ljYWwgYWRkcmVzcyBtYXBzLgorICoKKyAqCUlu
IGFkZGl0aW9uIHRvIGhhcmR3YXJlIGFkZHJlc3MgbWFwcywgdGhpcworICoJbW9kdWxlIGlzIGNh
bGxlZCB1cG9uIHRvIHByb3ZpZGUgc29mdHdhcmUtdXNlLW9ubHkKKyAqCW1hcHMgd2hpY2ggbWF5
IG9yIG1heSBub3QgYmUgc3RvcmVkIGluIHRoZSBzYW1lCisgKglmb3JtIGFzIGhhcmR3YXJlIG1h
cHMuCVRoZXNlIHBzZXVkby1tYXBzIGFyZQorICoJdXNlZCB0byBzdG9yZSBpbnRlcm1lZGlhdGUg
cmVzdWx0cyBmcm9tIGNvcHkKKyAqCW9wZXJhdGlvbnMgdG8gYW5kIGZyb20gYWRkcmVzcyBzcGFj
ZXMuCisgKgorICoJU2luY2UgdGhlIGluZm9ybWF0aW9uIG1hbmFnZWQgYnkgdGhpcyBtb2R1bGUg
aXMKKyAqCWFsc28gc3RvcmVkIGJ5IHRoZSBsb2dpY2FsIGFkZHJlc3MgbWFwcGluZyBtb2R1bGUs
CisgKgl0aGlzIG1vZHVsZSBtYXkgdGhyb3cgYXdheSB2YWxpZCB2aXJ0dWFsLXRvLXBoeXNpY2Fs
CisgKgltYXBwaW5ncyBhdCBhbG1vc3QgYW55IHRpbWUuICBIb3dldmVyLCBpbnZhbGlkYXRpb25z
CisgKglvZiB2aXJ0dWFsLXRvLXBoeXNpY2FsIG1hcHBpbmdzIG11c3QgYmUgZG9uZSBhcworICoJ
cmVxdWVzdGVkLgorICoKKyAqCUluIG9yZGVyIHRvIGNvcGUgd2l0aCBoYXJkd2FyZSBhcmNoaXRl
Y3R1cmVzIHdoaWNoCisgKgltYWtlIHZpcnR1YWwtdG8tcGh5c2ljYWwgbWFwIGludmFsaWRhdGVz
IGV4cGVuc2l2ZSwKKyAqCXRoaXMgbW9kdWxlIG1heSBkZWxheSBpbnZhbGlkYXRlIG9yIHJlZHVj
ZWQgcHJvdGVjdGlvbgorICoJb3BlcmF0aW9ucyB1bnRpbCBzdWNoIHRpbWUgYXMgdGhleSBhcmUg
YWN0dWFsbHkKKyAqCW5lY2Vzc2FyeS4gIFRoaXMgbW9kdWxlIGlzIGdpdmVuIGZ1bGwgaW5mb3Jt
YXRpb24gYXMKKyAqCXRvIHdoaWNoIHByb2Nlc3NvcnMgYXJlIGN1cnJlbnRseSB1c2luZyB3aGlj
aCBtYXBzLAorICoJYW5kIHRvIHdoZW4gcGh5c2ljYWwgbWFwcyBtdXN0IGJlIG1hZGUgY29ycmVj
dC4KKyAqLworCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CitfX0ZCU0RJRCgiJEZyZWVCU0Q6IGhl
YWQvc3lzL21pcHMvbWlwcy9wbWFwLmMgMjEwMzI3IDIwMTAtMDctMjEgMDk6Mjc6MDBaIGpjaGFu
ZHJhICQiKTsKKworI2luY2x1ZGUgIm9wdF9tc2didWYuaCIKKyNpbmNsdWRlICJvcHRfZGRiLmgi
CisKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzeXMvc3lzdG0uaD4KKyNpbmNs
dWRlIDxzeXMvcHJvYy5oPgorI2luY2x1ZGUgPHN5cy9tc2didWYuaD4KKyNpbmNsdWRlIDxzeXMv
dm1tZXRlci5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8c3lzL3NtcC5oPgor
I2lmZGVmIEREQgorI2luY2x1ZGUgPGRkYi9kZGIuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8dm0v
dm0uaD4KKyNpbmNsdWRlIDx2bS92bV9wYXJhbS5oPgorI2luY2x1ZGUgPHZtL3ZtX3BoeXMuaD4K
KyNpbmNsdWRlIDxzeXMvbG9jay5oPgorI2luY2x1ZGUgPHN5cy9tdXRleC5oPgorI2luY2x1ZGUg
PHZtL3ZtX2tlcm4uaD4KKyNpbmNsdWRlIDx2bS92bV9wYWdlLmg+CisjaW5jbHVkZSA8dm0vdm1f
bWFwLmg+CisjaW5jbHVkZSA8dm0vdm1fb2JqZWN0Lmg+CisjaW5jbHVkZSA8dm0vdm1fZXh0ZXJu
Lmg+CisjaW5jbHVkZSA8dm0vdm1fcGFnZW91dC5oPgorI2luY2x1ZGUgPHZtL3ZtX3BhZ2VyLmg+
CisjaW5jbHVkZSA8dm0vdW1hLmg+CisjaW5jbHVkZSA8c3lzL3BjcHUuaD4KKyNpbmNsdWRlIDxz
eXMvc2NoZWQuaD4KKyNpZmRlZiBTTVAKKyNpbmNsdWRlIDxzeXMvc21wLmg+CisjZW5kaWYKKwor
I2luY2x1ZGUgPG1hY2hpbmUvY2FjaGUuaD4KKyNpbmNsdWRlIDxtYWNoaW5lL21kX3Zhci5oPgor
I2luY2x1ZGUgPG1hY2hpbmUvdGxiLmg+CisKKyNpZiBkZWZpbmVkKERJQUdOT1NUSUMpCisjZGVm
aW5lCVBNQVBfRElBR05PU1RJQworI2VuZGlmCisKKyN1bmRlZiBQTUFQX0RFQlVHCisKKyNpZm5k
ZWYgUE1BUF9TSFBHUEVSUFJPQworI2RlZmluZQlQTUFQX1NIUEdQRVJQUk9DIDIwMAorI2VuZGlm
CisKKyNpZiAhZGVmaW5lZChQTUFQX0RJQUdOT1NUSUMpCisjZGVmaW5lCVBNQVBfSU5MSU5FIF9f
aW5saW5lCisjZWxzZQorI2RlZmluZQlQTUFQX0lOTElORQorI2VuZGlmCisKKy8qCisgKiBHZXQg
UERFcyBhbmQgUFRFcyBmb3IgdXNlci9rZXJuZWwgYWRkcmVzcyBzcGFjZQorICoKKyAqIFhYWCBU
aGUgJiBmb3IgcG1hcF9zZWdzaGlmdCgpIGlzIHdyb25nLCBhcyBpcyB0aGUgZmFjdCB0aGF0IGl0
IGRvZXNuJ3QKKyAqICAgICB0cmltIG9mZiBncmF0dWl0b3VzIGJpdHMgb2YgdGhlIGFkZHJlc3Mg
c3BhY2UuICBCeSBoYXZpbmcgdGhlICYKKyAqICAgICB0aGVyZSwgd2UgYnJlYWsgZGVmaW5pbmcg
TlVTRVJQR1RCTFMgYmVsb3cgYmVjYXVzZSB0aGUgYWRkcmVzcyBzcGFjZQorICogICAgIGlzIGRl
ZmluZWQgc3VjaCB0aGF0IGl0IGVuZHMgaW1tZWRpYXRlbHkgYWZ0ZXIgTlBERVBHKk5QVEVQRypQ
QUdFX1NJWkUsCisgKiAgICAgc28gd2UgZW5kIHVwIGdldHRpbmcgTlVTRVJQR1RCTFMgb2YgMC4K
KyAqLworCisjZGVmaW5lCXBtYXBfc2VnX2luZGV4KHYpCSgoKHYpID4+IFNFR1NISUZUKSAmIChO
UERFUEcgLSAxKSkKKyNkZWZpbmUJcG1hcF9wZGVfaW5kZXgodikJKCgodikgPj4gUERSU0hJRlQp
ICYgKE5QREVQRyAtIDEpKQorI2RlZmluZQlwbWFwX3B0ZV9pbmRleCh2KQkoKCh2KSA+PiBQQUdF
X1NISUZUKSAmIChOUFRFUEcgLSAxKSkKKyNkZWZpbmUgcG1hcF9wZGVfcGluZGV4KHYpICAgICAg
KCh2KSA+PiBQRFJTSElGVCkKKyAgCisjZGVmaW5lCU5VUERFCQkJKE5QREVQRyAqIE5QREVQRykK
KyNkZWZpbmUJTlVTRVJQR1RCTFMJCShOVVBERSArIE5QREVQRykgIC8qIFhYWCA6IG5vdCByZWFs
bHkgdXNlZCAqLworCisjZGVmaW5lCWlzX2tlcm5lbF9wbWFwKHgpCSgoeCkgPT0ga2VybmVsX3Bt
YXApCisKK3N0cnVjdCBwbWFwIGtlcm5lbF9wbWFwX3N0b3JlOworcGRfZW50cnlfdCAqa2VybmVs
X3NlZ21hcDsKKwordm1fb2Zmc2V0X3QgdmlydHVhbF9hdmFpbDsJLyogVkEgb2YgZmlyc3QgYXZh
aWwgcGFnZSAoYWZ0ZXIga2VybmVsIGJzcykgKi8KK3ZtX29mZnNldF90IHZpcnR1YWxfZW5kOwkv
KiBWQSBvZiBsYXN0IGF2YWlsIHBhZ2UgKGVuZCBvZiBrZXJuZWwgQVMpICovCisKK3N0YXRpYyBp
bnQgbmtwdDsKK3Vuc2lnbmVkIHBtYXBfbWF4X2FzaWQ7CQkvKiBtYXggQVNJRCBzdXBwb3J0ZWQg
YnkgdGhlIHN5c3RlbSAqLworCisjZGVmaW5lCVBNQVBfQVNJRF9SRVNFUlZFRAkwCisKK3ZtX29m
ZnNldF90IGtlcm5lbF92bV9lbmQgPSBWTV9NSU5fS0VSTkVMX0FERFJFU1M7CisKK3N0YXRpYyB2
b2lkIHBtYXBfYXNpZF9hbGxvYyhwbWFwX3QgcG1hcCk7CisKKy8qCisgKiBEYXRhIGZvciB0aGUg
cHYgZW50cnkgYWxsb2NhdGlvbiBtZWNoYW5pc20KKyAqLworc3RhdGljIHVtYV96b25lX3QgcHZ6
b25lOworc3RhdGljIHN0cnVjdCB2bV9vYmplY3QgcHZ6b25lX29iajsKK3N0YXRpYyBpbnQgcHZf
ZW50cnlfY291bnQgPSAwLCBwdl9lbnRyeV9tYXggPSAwLCBwdl9lbnRyeV9oaWdoX3dhdGVyID0g
MDsKKworc3RhdGljIFBNQVBfSU5MSU5FIHZvaWQgZnJlZV9wdl9lbnRyeShwdl9lbnRyeV90IHB2
KTsKK3N0YXRpYyBwdl9lbnRyeV90IGdldF9wdl9lbnRyeShwbWFwX3QgbG9ja2VkX3BtYXApOwor
c3RhdGljIHZvaWQgcG1hcF9wdmhfZnJlZShzdHJ1Y3QgbWRfcGFnZSAqcHZoLCBwbWFwX3QgcG1h
cCwgdm1fb2Zmc2V0X3QgdmEpOworc3RhdGljIHB2X2VudHJ5X3QgcG1hcF9wdmhfcmVtb3ZlKHN0
cnVjdCBtZF9wYWdlICpwdmgsIHBtYXBfdCBwbWFwLAorICAgIHZtX29mZnNldF90IHZhKTsKK3N0
YXRpYyBfX2lubGluZSB2b2lkIHBtYXBfY2hhbmdlYml0KHZtX3BhZ2VfdCBtLCBpbnQgYml0LCBi
b29sZWFuX3Qgc2V0ZW0pOworCitzdGF0aWMgdm1fcGFnZV90IHBtYXBfZW50ZXJfcXVpY2tfbG9j
a2VkKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwKKyAgICB2bV9wYWdlX3QgbSwgdm1fcHJv
dF90IHByb3QsIHZtX3BhZ2VfdCBtcHRlKTsKK3N0YXRpYyBpbnQgcG1hcF9yZW1vdmVfcHRlKHN0
cnVjdCBwbWFwICpwbWFwLCBwdF9lbnRyeV90ICpwdHEsIHZtX29mZnNldF90IHZhKTsKK3N0YXRp
YyB2b2lkIHBtYXBfcmVtb3ZlX3BhZ2Uoc3RydWN0IHBtYXAgKnBtYXAsIHZtX29mZnNldF90IHZh
KTsKK3N0YXRpYyB2b2lkIHBtYXBfcmVtb3ZlX2VudHJ5KHN0cnVjdCBwbWFwICpwbWFwLCB2bV9w
YWdlX3QgbSwgdm1fb2Zmc2V0X3QgdmEpOworc3RhdGljIGJvb2xlYW5fdCBwbWFwX3RyeV9pbnNl
cnRfcHZfZW50cnkocG1hcF90IHBtYXAsIHZtX3BhZ2VfdCBtcHRlLAorICAgIHZtX29mZnNldF90
IHZhLCB2bV9wYWdlX3QgbSk7CitzdGF0aWMgX19pbmxpbmUgdm9pZCBwbWFwX2ludmFsaWRhdGVf
cGFnZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEpOworc3RhdGljIGludCBfcG1hcF91bndp
cmVfcHRlX2hvbGQocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhLCB2bV9wYWdlX3QgbSk7CisK
K3N0YXRpYyB2bV9wYWdlX3QgcG1hcF9hbGxvY3B0ZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3Qg
dmEsIGludCBmbGFncyk7CitzdGF0aWMgdm1fcGFnZV90IF9wbWFwX2FsbG9jcHRlKHBtYXBfdCBw
bWFwLCB1bnNpZ25lZCBwdGVwaW5kZXgsIGludCBmbGFncyk7CitzdGF0aWMgaW50IHBtYXBfdW51
c2VfcHQocG1hcF90LCB2bV9vZmZzZXRfdCwgdm1fcGFnZV90KTsKK3N0YXRpYyBpbnQgaW5pdF9w
dGVfcHJvdCh2bV9vZmZzZXRfdCB2YSwgdm1fcGFnZV90IG0sIHZtX3Byb3RfdCBwcm90KTsKK3N0
YXRpYyB2bV9wYWdlX3QgcG1hcF9hbGxvY19wdGVfcGFnZSh1bnNpZ25lZCBpbnQgaW5kZXgsIGlu
dCByZXEpOworc3RhdGljIHZvaWQgcG1hcF9ncm93X3B0ZV9wYWdlX2NhY2hlKHZvaWQpOworCisj
aWZkZWYgU01QCitzdGF0aWMgdm9pZCBwbWFwX2ludmFsaWRhdGVfcGFnZV9hY3Rpb24odm9pZCAq
YXJnKTsKK3N0YXRpYyB2b2lkIHBtYXBfaW52YWxpZGF0ZV9hbGxfYWN0aW9uKHZvaWQgKmFyZyk7
CitzdGF0aWMgdm9pZCBwbWFwX3VwZGF0ZV9wYWdlX2FjdGlvbih2b2lkICphcmcpOworI2VuZGlm
CisKKy8qCisgKiBUb3AgbGV2ZWwgcGFnZSB0YWJsZSBlbnRyeSBmb3IgYSB2YQorICovCitzdGF0
aWMgaW5saW5lIHBkX2VudHJ5X3QgKgorcG1hcF9zZWdtYXAocG1hcF90IHBtYXAsIHZtX29mZnNl
dF90IHZhKQoreworCXJldHVybiAoJnBtYXAtPnBtX3NlZ3RhYltwbWFwX3NlZ19pbmRleCh2YSld
KTsKK30KKworc3RhdGljIGlubGluZSBwZF9lbnRyeV90ICoKK3BtYXBfcGRwZV90b19wZGUocGRf
ZW50cnlfdCAqcGRwZSwgdm1fb2Zmc2V0X3QgdmEpCit7CisJcGRfZW50cnlfdCAqcGRlOworCisJ
cGRlID0gKHBkX2VudHJ5X3QgKikqcGRwZTsKKwlyZXR1cm4gKCZwZGVbcG1hcF9wZGVfaW5kZXgo
dmEpXSk7Cit9CisKKy8qCisgKiBSZXR1cm4gcGFnZSBkaXJlY3RvcnkgZW50cnkgZm9yIGEgdmEK
KyAqLworc3RhdGljIF9faW5saW5lIHBkX2VudHJ5X3QgKgorcG1hcF9wZGUocG1hcF90IHBtYXAs
IHZtX29mZnNldF90IHZhKQoreworCXBkX2VudHJ5X3QgKnBkcGU7CisKKwlwZHBlID0gcG1hcF9z
ZWdtYXAocG1hcCwgdmEpOworCWlmIChwZHBlID09IE5VTEwgfHwgKnBkcGUgPT0gTlVMTCkKKwkJ
cmV0dXJuIChOVUxMKTsKKworCXJldHVybiAocG1hcF9wZHBlX3RvX3BkZShwZHBlLCB2YSkpOwor
fQorCitzdGF0aWMgaW5saW5lIHB0X2VudHJ5X3QgKgorcG1hcF9wZGVfdG9fcHRlKHBkX2VudHJ5
X3QgKnBkZSwgdm1fb2Zmc2V0X3QgdmEpCit7CisJcHRfZW50cnlfdCAqcHRlOworCisJcHRlID0g
KHB0X2VudHJ5X3QgKikqcGRlOworCXJldHVybiAoJnB0ZVtwbWFwX3B0ZV9pbmRleCh2YSldKTsK
K30KKworLyoKKyAqCVJvdXRpbmU6CXBtYXBfcHRlCisgKglGdW5jdGlvbjoKKyAqCQlFeHRyYWN0
IHRoZSBwYWdlIHRhYmxlIGVudHJ5IGFzc29jaWF0ZWQKKyAqCQl3aXRoIHRoZSBnaXZlbiBtYXAv
dmlydHVhbF9hZGRyZXNzIHBhaXIuCisgKi8KK3B0X2VudHJ5X3QgKgorcG1hcF9wdGUocG1hcF90
IHBtYXAsIHZtX29mZnNldF90IHZhKQoreworCXBkX2VudHJ5X3QgKnBkZTsKKworCXBkZSA9IHBt
YXBfcGRlKHBtYXAsIHZhKTsKKwlpZiAocGRlID09IE5VTEwgfHwgKnBkZSA9PSBOVUxMKQorCQly
ZXR1cm4gKE5VTEwpOworCisJcmV0dXJuIChwbWFwX3BkZV90b19wdGUocGRlLCB2YSkpOworfQor
Cit2bV9vZmZzZXRfdAorcG1hcF9zdGVhbF9tZW1vcnkodm1fc2l6ZV90IHNpemUpCit7CisJdm1f
c2l6ZV90IGJhbmtfc2l6ZTsKKwl2bV9vZmZzZXRfdCBwYSwgdmE7CisKKwlzaXplID0gcm91bmRf
cGFnZShzaXplKTsKKworCWJhbmtfc2l6ZSA9IHBoeXNfYXZhaWxbMV0gLSBwaHlzX2F2YWlsWzBd
OworCXdoaWxlIChzaXplID4gYmFua19zaXplKSB7CisJCWludCBpOworCisJCWZvciAoaSA9IDA7
IHBoeXNfYXZhaWxbaSArIDJdOyBpICs9IDIpIHsKKwkJCXBoeXNfYXZhaWxbaV0gPSBwaHlzX2F2
YWlsW2kgKyAyXTsKKwkJCXBoeXNfYXZhaWxbaSArIDFdID0gcGh5c19hdmFpbFtpICsgM107CisJ
CX0KKwkJcGh5c19hdmFpbFtpXSA9IDA7CisJCXBoeXNfYXZhaWxbaSArIDFdID0gMDsKKwkJaWYg
KCFwaHlzX2F2YWlsWzBdKQorCQkJcGFuaWMoInBtYXBfc3RlYWxfbWVtb3J5OiBvdXQgb2YgbWVt
b3J5Iik7CisJCWJhbmtfc2l6ZSA9IHBoeXNfYXZhaWxbMV0gLSBwaHlzX2F2YWlsWzBdOworCX0K
KworCXBhID0gcGh5c19hdmFpbFswXTsKKwlwaHlzX2F2YWlsWzBdICs9IHNpemU7CisJaWYgKHBh
ID49IE1JUFNfS1NFRzBfTEFSR0VTVF9QSFlTKSB7CisJCXBhbmljKCJPdXQgb2YgbWVtb3J5IGJl
bG93IDUxMk1lZz8iKTsKKwl9CisJdmEgPSBNSVBTX1BIWVNfVE9fS1NFRzAocGEpOworCWJ6ZXJv
KChjYWRkcl90KXZhLCBzaXplKTsKKwlyZXR1cm4gdmE7Cit9CisKKy8qCisgKiBCb290c3RyYXAg
dGhlIHN5c3RlbSBlbm91Z2ggdG8gcnVuIHdpdGggdmlydHVhbCBtZW1vcnkuICBUaGlzCisgKiBh
c3N1bWVzIHRoYXQgdGhlIHBoeXNfYXZhaWwgYXJyYXkgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuCisg
Ki8KK3N0YXRpYyB2b2lkIAorY3JlYXRlX2tlcm5fcGFnZV90YWJsZSh2b2lkKQoreworCWludCBu
cGRlOworCWludCBpLCBqLCBucHQ7CisJdm1fb2Zmc2V0X3QgcGRhZGRyLCBwdGFkZHI7CisJcGRf
ZW50cnlfdCAqcGRlOworCXB0X2VudHJ5X3QgKnB0ZTsKKworCWtlcm5lbF9zZWdtYXAgPSAocGRf
ZW50cnlfdCAqKXBtYXBfc3RlYWxfbWVtb3J5KFBBR0VfU0laRSk7CisKKwkvKgorCSAqIEFsbG9j
YXRlIHNlY29uZCBsZXZlbCBwYWdlIHRhYmxlcyBmb3IgdGhlIGtlcm5lbAorCSAqLworCW5wZGUg
PSBob3dtYW55KE5LUFQsIE5QREVQRyk7CisJbmtwdCA9IE5LUFQ7CisJcGRhZGRyID0gcG1hcF9z
dGVhbF9tZW1vcnkoUEFHRV9TSVpFICogbnBkZSk7CisJcHRhZGRyID0gcG1hcF9zdGVhbF9tZW1v
cnkoUEFHRV9TSVpFICogbmtwdCk7CisJcHJpbnRmKCJOUERFICVseCBOUEtQVCAlbHggXG4iLCAo
dV9sb25nKW5wZGUsICh1X2xvbmcpbmtwdCk7CisJLyoKKwkgKiBUaGUgUls0LTddPzAwIHN0b3Jl
cyBvbmx5IG9uZSBjb3B5IG9mIHRoZSBHbG9iYWwgYml0IGluIHRoZQorCSAqIHRyYW5zbGF0aW9u
IGxvb2thc2lkZSBidWZmZXIgZm9yIGVhY2ggMiBwYWdlIGVudHJ5LiBUaHVzIGludmFsaWQKKwkg
KiBlbnRyeXMgbXVzdCBoYXZlIHRoZSBHbG9iYWwgYml0IHNldCBzbyB3aGVuIEVudHJ5IExPIGFu
ZCBFbnRyeSBISQorCSAqIEcgYml0cyBhcmUgYW5kZWQgdG9nZXRoZXIgdGhleSB3aWxsIHByb2R1
Y2UgYSBnbG9iYWwgYml0IHRvIHN0b3JlCisJICogaW4gdGhlIHRsYi4KKwkgKi8KKwlmb3IgKGkg
PSAwLCBwdGUgPSAocHRfZW50cnlfdCAqKXB0YWRkcjsgaSA8IChua3B0ICogTlBURVBHKTsgaSsr
LCBwdGUrKykKKwkJKnB0ZSA9IFBURV9HOworCisJZm9yIChpID0gMCwgIG5wdCA9IG5rcHQ7IG5w
dCA+IDA7IGkrKykgeworCQlrZXJuZWxfc2VnbWFwW2ldID0gKHBkX2VudHJ5X3QpKHBkYWRkciAr
IGkgKiBQQUdFX1NJWkUpOworCQlwZGUgPSAocGRfZW50cnlfdCAqKWtlcm5lbF9zZWdtYXBbaV07
CisKKwkJZm9yIChqID0gMDsgaiA8IE5QREVQRyAmJiBucHQgPiAwOyBqKyssIG5wdC0tKQorCQkJ
cGRlW2pdID0gKHBkX2VudHJ5X3QpKHB0YWRkciArIChpICogTlBERVBHICsgaikgKiBQQUdFX1NJ
WkUpOworCX0KKworCVBNQVBfTE9DS19JTklUKGtlcm5lbF9wbWFwKTsKKwlrZXJuZWxfcG1hcC0+
cG1fc2VndGFiID0ga2VybmVsX3NlZ21hcDsKKwlrZXJuZWxfcG1hcC0+cG1fYWN0aXZlID0gfjA7
CisJVEFJTFFfSU5JVCgma2VybmVsX3BtYXAtPnBtX3B2bGlzdCk7CisJa2VybmVsX3BtYXAtPnBt
X2FzaWRbMF0uYXNpZCA9IFBNQVBfQVNJRF9SRVNFUlZFRDsKKwlrZXJuZWxfcG1hcC0+cG1fYXNp
ZFswXS5nZW4gPSAwOworfQorCit2b2lkCitwbWFwX2Jvb3RzdHJhcCh2b2lkKQoreworCWludCBp
OworCisJLyogU29ydC4gKi8KK2FnYWluOgorCWZvciAoaSA9IDA7IHBoeXNfYXZhaWxbaSArIDFd
ICE9IDA7IGkgKz0gMikgeworCQkvKgorCQkgKiBLZWVwIHRoZSBtZW1vcnkgYWxpZ25lZCBvbiBw
YWdlIGJvdW5kYXJ5LgorCQkgKi8KKwkJcGh5c19hdmFpbFtpXSA9IHJvdW5kX3BhZ2UocGh5c19h
dmFpbFtpXSk7CisJCXBoeXNfYXZhaWxbaSArIDFdID0gdHJ1bmNfcGFnZShwaHlzX2F2YWlsW2kg
KyAxXSk7CisKKwkJaWYgKGkgPCAyKQorCQkJY29udGludWU7CisJCWlmIChwaHlzX2F2YWlsW2kg
LSAyXSA+IHBoeXNfYXZhaWxbaV0pIHsKKwkJCXZtX3BhZGRyX3QgcHRlbXBbMl07CisKKwkJCXB0
ZW1wWzBdID0gcGh5c19hdmFpbFtpICsgMF07CisJCQlwdGVtcFsxXSA9IHBoeXNfYXZhaWxbaSAr
IDFdOworCisJCQlwaHlzX2F2YWlsW2kgKyAwXSA9IHBoeXNfYXZhaWxbaSAtIDJdOworCQkJcGh5
c19hdmFpbFtpICsgMV0gPSBwaHlzX2F2YWlsW2kgLSAxXTsKKworCQkJcGh5c19hdmFpbFtpIC0g
Ml0gPSBwdGVtcFswXTsKKwkJCXBoeXNfYXZhaWxbaSAtIDFdID0gcHRlbXBbMV07CisJCQlnb3Rv
IGFnYWluOworCQl9CisJfQorCisJLyoKKwkgKiBDb3B5IHRoZSBwaHlzX2F2YWlsW10gYXJyYXkg
YmVmb3JlIHdlIHN0YXJ0IHN0ZWFsaW5nIG1lbW9yeSBmcm9tIGl0LgorCSAqLworCWZvciAoaSA9
IDA7IHBoeXNfYXZhaWxbaSArIDFdICE9IDA7IGkgKz0gMikgeworCQlwaHlzbWVtX2Rlc2NbaV0g
PSBwaHlzX2F2YWlsW2ldOworCQlwaHlzbWVtX2Rlc2NbaSArIDFdID0gcGh5c19hdmFpbFtpICsg
MV07CisJfQorCisJTWF4bWVtID0gYXRvcChwaHlzX2F2YWlsW2kgLSAxXSk7CisKKwlpZiAoYm9v
dHZlcmJvc2UpIHsKKwkJcHJpbnRmKCJQaHlzaWNhbCBtZW1vcnkgY2h1bmsocyk6XG4iKTsKKwkJ
Zm9yIChpID0gMDsgcGh5c19hdmFpbFtpICsgMV0gIT0gMDsgaSArPSAyKSB7CisJCQl2bV9wYWRk
cl90IHNpemU7CisKKwkJCXNpemUgPSBwaHlzX2F2YWlsW2kgKyAxXSAtIHBoeXNfYXZhaWxbaV07
CisJCQlwcmludGYoIiUjMDhqeCAtICUjMDhqeCwgJWp1IGJ5dGVzICglanUgcGFnZXMpXG4iLAor
CQkJICAgICh1aW50bWF4X3QpIHBoeXNfYXZhaWxbaV0sCisJCQkgICAgKHVpbnRtYXhfdCkgcGh5
c19hdmFpbFtpICsgMV0gLSAxLAorCQkJICAgICh1aW50bWF4X3QpIHNpemUsICh1aW50bWF4X3Qp
IHNpemUgLyBQQUdFX1NJWkUpOworCQl9CisJCXByaW50ZigiTWF4bWVtIGlzIDB4JTBseFxuIiwg
cHRvYShNYXhtZW0pKTsKKwl9CisJLyoKKwkgKiBTdGVhbCB0aGUgbWVzc2FnZSBidWZmZXIgZnJv
bSB0aGUgYmVnaW5uaW5nIG9mIG1lbW9yeS4KKwkgKi8KKwltc2didWZwID0gKHN0cnVjdCBtc2di
dWYgKilwbWFwX3N0ZWFsX21lbW9yeShNU0dCVUZfU0laRSk7CisJbXNnYnVmaW5pdChtc2didWZw
LCBNU0dCVUZfU0laRSk7CisKKwkvKgorCSAqIFN0ZWFsIHRocmVhZDAga3N0YWNrLgorCSAqLwor
CWtzdGFjazAgPSBwbWFwX3N0ZWFsX21lbW9yeShLU1RBQ0tfUEFHRVMgPDwgUEFHRV9TSElGVCk7
CisKKwl2aXJ0dWFsX2F2YWlsID0gVk1fTUlOX0tFUk5FTF9BRERSRVNTOworCXZpcnR1YWxfZW5k
ID0gVk1fTUFYX0tFUk5FTF9BRERSRVNTOworCisjaWZkZWYgU01QCisJLyoKKwkgKiBTdGVhbCBz
b21lIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSB0byBtYXAgdGhlIHBjcHUgYXJlYS4KKwkgKi8KKwl2
aXJ0dWFsX2F2YWlsID0gcm91bmR1cDIodmlydHVhbF9hdmFpbCwgUEFHRV9TSVpFICogMik7CisJ
cGNwdXAgPSAoc3RydWN0IHBjcHUgKil2aXJ0dWFsX2F2YWlsOworCXZpcnR1YWxfYXZhaWwgKz0g
UEFHRV9TSVpFICogMjsKKworCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgd2lyZWQgVExCIGVudHJ5
IG1hcHBpbmcgdGhlIHBjcHUgcmVnaW9uIGZvcgorCSAqIHRoZSBCU1AgYXQgJ3BjcHVwJy4gVXAg
dW50aWwgdGhpcyBwb2ludCB3ZSB3ZXJlIG9wZXJhdGluZworCSAqIHdpdGggdGhlICdwY3B1cCcg
Zm9yIHRoZSBCU1AgcG9pbnRpbmcgdG8gYSB2aXJ0dWFsIGFkZHJlc3MKKwkgKiBpbiBLU0VHMCBz
byB0aGVyZSB3YXMgbm8gbmVlZCBmb3IgYSBUTEIgbWFwcGluZy4KKwkgKi8KKwltaXBzX3BjcHVf
dGxiX2luaXQoUENQVV9BRERSKDApKTsKKworCWlmIChib290dmVyYm9zZSkKKwkJcHJpbnRmKCJw
Y3B1IGlzIGF2YWlsYWJsZSBhdCB2aXJ0dWFsIGFkZHJlc3MgJXAuXG4iLCBwY3B1cCk7CisjZW5k
aWYKKworCS8qCisJICogQWxsb2NhdGUgc2VnbWVudCB0YWJsZSBmb3IgdGhlIGtlcm5lbAorCSAq
LworCWNyZWF0ZV9rZXJuX3BhZ2VfdGFibGUoKTsKKwlwbWFwX21heF9hc2lkID0gVk1OVU1fUElE
UzsKKwltaXBzX3dyX2VudHJ5aGkoMCk7CisJbWlwc193cl9wYWdlbWFzaygwKTsKK30KKworLyoK
KyAqIEluaXRpYWxpemUgYSB2bV9wYWdlJ3MgbWFjaGluZS1kZXBlbmRlbnQgZmllbGRzLgorICov
Cit2b2lkCitwbWFwX3BhZ2VfaW5pdCh2bV9wYWdlX3QgbSkKK3sKKworCVRBSUxRX0lOSVQoJm0t
Pm1kLnB2X2xpc3QpOworCW0tPm1kLnB2X2xpc3RfY291bnQgPSAwOworCW0tPm1kLnB2X2ZsYWdz
ID0gMDsKK30KKworLyoKKyAqCUluaXRpYWxpemUgdGhlIHBtYXAgbW9kdWxlLgorICoJQ2FsbGVk
IGJ5IHZtX2luaXQsIHRvIGluaXRpYWxpemUgYW55IHN0cnVjdHVyZXMgdGhhdCB0aGUgcG1hcAor
ICoJc3lzdGVtIG5lZWRzIHRvIG1hcCB2aXJ0dWFsIG1lbW9yeS4KKyAqCXBtYXBfaW5pdCBoYXMg
YmVlbiBlbmhhbmNlZCB0byBzdXBwb3J0IGluIGEgZmFpcmx5IGNvbnNpc3RhbnQKKyAqCXdheSwg
ZGlzY29udGlndW91cyBwaHlzaWNhbCBtZW1vcnkuCisgKi8KK3ZvaWQKK3BtYXBfaW5pdCh2b2lk
KQoreworCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBhZGRyZXNzIHNwYWNlICh6b25lKSBmb3Ig
dGhlIHB2IGVudHJpZXMuICBTZXQgYQorCSAqIGhpZ2ggd2F0ZXIgbWFyayBzbyB0aGF0IHRoZSBz
eXN0ZW0gY2FuIHJlY292ZXIgZnJvbSBleGNlc3NpdmUKKwkgKiBudW1iZXJzIG9mIHB2IGVudHJp
ZXMuCisJICovCisJcHZ6b25lID0gdW1hX3pjcmVhdGUoIlBWIEVOVFJZIiwgc2l6ZW9mKHN0cnVj
dCBwdl9lbnRyeSksIE5VTEwsIE5VTEwsCisJICAgIE5VTEwsIE5VTEwsIFVNQV9BTElHTl9QVFIs
IFVNQV9aT05FX1ZNIHwgVU1BX1pPTkVfTk9GUkVFKTsKKwlwdl9lbnRyeV9tYXggPSBQTUFQX1NI
UEdQRVJQUk9DICogbWF4cHJvYyArIGNudC52X3BhZ2VfY291bnQ7CisJcHZfZW50cnlfaGlnaF93
YXRlciA9IDkgKiAocHZfZW50cnlfbWF4IC8gMTApOworCXVtYV96b25lX3NldF9vYmoocHZ6b25l
LCAmcHZ6b25lX29iaiwgcHZfZW50cnlfbWF4KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTG93IGxldmVsIGhlbHBlciByb3V0
aW5lcy4uLi4uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqLworCisjaWYgZGVmaW5lZChQTUFQX0RJQUdOT1NUSUMpCisKKy8qCisgKiBUaGlzIGNv
ZGUgY2hlY2tzIGZvciBub24td3JpdGVhYmxlL21vZGlmaWVkIHBhZ2VzLgorICogVGhpcyBzaG91
bGQgYmUgYW4gaW52YWxpZCBjb25kaXRpb24uCisgKi8KK3N0YXRpYyBpbnQKK3BtYXBfbndfbW9k
aWZpZWQocHRfZW50cnlfdCBwdGUpCit7CisJaWYgKChwdGUgJiAoUFRFX0QgfCBQVEVfUk8pKSA9
PSAoUFRFX0QgfCBQVEVfUk8pKQorCQlyZXR1cm4gKDEpOworCWVsc2UKKwkJcmV0dXJuICgwKTsK
K30KKworI2VuZGlmCisKK3N0YXRpYyB2b2lkCitwbWFwX2ludmFsaWRhdGVfYWxsKHBtYXBfdCBw
bWFwKQoreworI2lmZGVmIFNNUAorCXNtcF9yZW5kZXp2b3VzKDAsIHBtYXBfaW52YWxpZGF0ZV9h
bGxfYWN0aW9uLCAwLCAodm9pZCAqKXBtYXApOworfQorCitzdGF0aWMgdm9pZAorcG1hcF9pbnZh
bGlkYXRlX2FsbF9hY3Rpb24odm9pZCAqYXJnKQoreworCXBtYXBfdCBwbWFwID0gKHBtYXBfdClh
cmc7CisKKyNlbmRpZgorCisJaWYgKHBtYXAgPT0ga2VybmVsX3BtYXApIHsKKwkJdGxiX2ludmFs
aWRhdGVfYWxsKCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAocG1hcC0+cG1fYWN0aXZlICYgUENQ
VV9HRVQoY3B1bWFzaykpCisJCXRsYl9pbnZhbGlkYXRlX2FsbF91c2VyKHBtYXApOworCWVsc2UK
KwkJcG1hcC0+cG1fYXNpZFtQQ1BVX0dFVChjcHVpZCldLmdlbiA9IDA7Cit9CisKK3N0cnVjdCBw
bWFwX2ludmFsaWRhdGVfcGFnZV9hcmcgeworCXBtYXBfdCBwbWFwOworCXZtX29mZnNldF90IHZh
OworfTsKKworc3RhdGljIF9faW5saW5lIHZvaWQKK3BtYXBfaW52YWxpZGF0ZV9wYWdlKHBtYXBf
dCBwbWFwLCB2bV9vZmZzZXRfdCB2YSkKK3sKKyNpZmRlZiBTTVAKKwlzdHJ1Y3QgcG1hcF9pbnZh
bGlkYXRlX3BhZ2VfYXJnIGFyZzsKKworCWFyZy5wbWFwID0gcG1hcDsKKwlhcmcudmEgPSB2YTsK
KworCXNtcF9yZW5kZXp2b3VzKDAsIHBtYXBfaW52YWxpZGF0ZV9wYWdlX2FjdGlvbiwgMCwgKHZv
aWQgKikmYXJnKTsKK30KKworc3RhdGljIHZvaWQKK3BtYXBfaW52YWxpZGF0ZV9wYWdlX2FjdGlv
bih2b2lkICphcmcpCit7CisJcG1hcF90IHBtYXAgPSAoKHN0cnVjdCBwbWFwX2ludmFsaWRhdGVf
cGFnZV9hcmcgKilhcmcpLT5wbWFwOworCXZtX29mZnNldF90IHZhID0gKChzdHJ1Y3QgcG1hcF9p
bnZhbGlkYXRlX3BhZ2VfYXJnICopYXJnKS0+dmE7CisKKyNlbmRpZgorCisJaWYgKGlzX2tlcm5l
bF9wbWFwKHBtYXApKSB7CisJCXRsYl9pbnZhbGlkYXRlX2FkZHJlc3MocG1hcCwgdmEpOworCQly
ZXR1cm47CisJfQorCWlmIChwbWFwLT5wbV9hc2lkW1BDUFVfR0VUKGNwdWlkKV0uZ2VuICE9IFBD
UFVfR0VUKGFzaWRfZ2VuZXJhdGlvbikpCisJCXJldHVybjsKKwllbHNlIGlmICghKHBtYXAtPnBt
X2FjdGl2ZSAmIFBDUFVfR0VUKGNwdW1hc2spKSkgeworCQlwbWFwLT5wbV9hc2lkW1BDUFVfR0VU
KGNwdWlkKV0uZ2VuID0gMDsKKwkJcmV0dXJuOworCX0KKwl0bGJfaW52YWxpZGF0ZV9hZGRyZXNz
KHBtYXAsIHZhKTsKK30KKworc3RydWN0IHBtYXBfdXBkYXRlX3BhZ2VfYXJnIHsKKwlwbWFwX3Qg
cG1hcDsKKwl2bV9vZmZzZXRfdCB2YTsKKwlwdF9lbnRyeV90IHB0ZTsKK307CisKK3ZvaWQKK3Bt
YXBfdXBkYXRlX3BhZ2UocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhLCBwdF9lbnRyeV90IHB0
ZSkKK3sKKyNpZmRlZiBTTVAKKwlzdHJ1Y3QgcG1hcF91cGRhdGVfcGFnZV9hcmcgYXJnOworCisJ
YXJnLnBtYXAgPSBwbWFwOworCWFyZy52YSA9IHZhOworCWFyZy5wdGUgPSBwdGU7CisKKwlzbXBf
cmVuZGV6dm91cygwLCBwbWFwX3VwZGF0ZV9wYWdlX2FjdGlvbiwgMCwgKHZvaWQgKikmYXJnKTsK
K30KKworc3RhdGljIHZvaWQKK3BtYXBfdXBkYXRlX3BhZ2VfYWN0aW9uKHZvaWQgKmFyZykKK3sK
KwlwbWFwX3QgcG1hcCA9ICgoc3RydWN0IHBtYXBfdXBkYXRlX3BhZ2VfYXJnICopYXJnKS0+cG1h
cDsKKwl2bV9vZmZzZXRfdCB2YSA9ICgoc3RydWN0IHBtYXBfdXBkYXRlX3BhZ2VfYXJnICopYXJn
KS0+dmE7CisJcHRfZW50cnlfdCBwdGUgPSAoKHN0cnVjdCBwbWFwX3VwZGF0ZV9wYWdlX2FyZyAq
KWFyZyktPnB0ZTsKKworI2VuZGlmCisJaWYgKGlzX2tlcm5lbF9wbWFwKHBtYXApKSB7CisJCXRs
Yl91cGRhdGUocG1hcCwgdmEsIHB0ZSk7CisJCXJldHVybjsKKwl9CisJaWYgKHBtYXAtPnBtX2Fz
aWRbUENQVV9HRVQoY3B1aWQpXS5nZW4gIT0gUENQVV9HRVQoYXNpZF9nZW5lcmF0aW9uKSkKKwkJ
cmV0dXJuOworCWVsc2UgaWYgKCEocG1hcC0+cG1fYWN0aXZlICYgUENQVV9HRVQoY3B1bWFzaykp
KSB7CisJCXBtYXAtPnBtX2FzaWRbUENQVV9HRVQoY3B1aWQpXS5nZW4gPSAwOworCQlyZXR1cm47
CisJfQorCXRsYl91cGRhdGUocG1hcCwgdmEsIHB0ZSk7Cit9CisKKy8qCisgKglSb3V0aW5lOglw
bWFwX2V4dHJhY3QKKyAqCUZ1bmN0aW9uOgorICoJCUV4dHJhY3QgdGhlIHBoeXNpY2FsIHBhZ2Ug
YWRkcmVzcyBhc3NvY2lhdGVkCisgKgkJd2l0aCB0aGUgZ2l2ZW4gbWFwL3ZpcnR1YWxfYWRkcmVz
cyBwYWlyLgorICovCit2bV9wYWRkcl90CitwbWFwX2V4dHJhY3QocG1hcF90IHBtYXAsIHZtX29m
ZnNldF90IHZhKQoreworCXB0X2VudHJ5X3QgKnB0ZTsKKwl2bV9vZmZzZXRfdCByZXR2YWwgPSAw
OworCisJUE1BUF9MT0NLKHBtYXApOworCXB0ZSA9IHBtYXBfcHRlKHBtYXAsIHZhKTsKKwlpZiAo
cHRlKSB7CisJCXJldHZhbCA9IFRMQkxPX1BURV9UT19QQSgqcHRlKSB8ICh2YSAmIFBBR0VfTUFT
Syk7CisJfQorCVBNQVBfVU5MT0NLKHBtYXApOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qCisg
KglSb3V0aW5lOglwbWFwX2V4dHJhY3RfYW5kX2hvbGQKKyAqCUZ1bmN0aW9uOgorICoJCUF0b21p
Y2FsbHkgZXh0cmFjdCBhbmQgaG9sZCB0aGUgcGh5c2ljYWwgcGFnZQorICoJCXdpdGggdGhlIGdp
dmVuIHBtYXAgYW5kIHZpcnR1YWwgYWRkcmVzcyBwYWlyCisgKgkJaWYgdGhhdCBtYXBwaW5nIHBl
cm1pdHMgdGhlIGdpdmVuIHByb3RlY3Rpb24uCisgKi8KK3ZtX3BhZ2VfdAorcG1hcF9leHRyYWN0
X2FuZF9ob2xkKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgdm1fcHJvdF90IHByb3QpCit7
CisJcHRfZW50cnlfdCBwdGU7CisJdm1fcGFnZV90IG07CisJdm1fcGFkZHJfdCBwYTsKKworCW0g
PSBOVUxMOworCXBhID0gMDsKKwlQTUFQX0xPQ0socG1hcCk7CityZXRyeToKKwlwdGUgPSAqcG1h
cF9wdGUocG1hcCwgdmEpOworCWlmIChwdGUgIT0gMCAmJiBwdGVfdGVzdCgmcHRlLCBQVEVfVikg
JiYKKwkgICAgKHB0ZV90ZXN0KCZwdGUsIFBURV9EKSB8fCAocHJvdCAmIFZNX1BST1RfV1JJVEUp
ID09IDApKSB7CisJCWlmICh2bV9wYWdlX3BhX3RyeXJlbG9jayhwbWFwLCBUTEJMT19QVEVfVE9f
UEEocHRlKSwgJnBhKSkKKwkJCWdvdG8gcmV0cnk7CisKKwkJbSA9IFBIWVNfVE9fVk1fUEFHRShU
TEJMT19QVEVfVE9fUEEocHRlKSk7CisJCXZtX3BhZ2VfaG9sZChtKTsKKwl9CisJUEFfVU5MT0NL
X0NPTkQocGEpOworCVBNQVBfVU5MT0NLKHBtYXApOworCXJldHVybiAobSk7Cit9CisKKy8qKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIExvdyBs
ZXZlbCBtYXBwaW5nIHJvdXRpbmVzLi4uLi4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBhZGQgYSB3aXJlZCBwYWdlIHRvIHRo
ZSBrdmEKKyAqLworIC8qIFBNQVBfSU5MSU5FICovIHZvaWQKK3BtYXBfa2VudGVyKHZtX29mZnNl
dF90IHZhLCB2bV9wYWRkcl90IHBhKQoreworCXB0X2VudHJ5X3QgKnB0ZTsKKwlwdF9lbnRyeV90
IG9wdGUsIG5wdGU7CisKKyNpZmRlZiBQTUFQX0RFQlVHCisJcHJpbnRmKCJwbWFwX2tlbnRlcjog
IHZhOiAlcCAtPiBwYTogJXBcbiIsICh2b2lkICopdmEsICh2b2lkICopcGEpOworI2VuZGlmCisJ
bnB0ZSA9IFRMQkxPX1BBX1RPX1BGTihwYSkgfCBQVEVfRCB8IFBURV9WIHwgUFRFX0cgfCBQVEVf
VzsKKworCWlmIChpc19jYWNoZWFibGVfbWVtKHBhKSkKKwkJbnB0ZSB8PSBQVEVfQ19DQUNIRTsK
KwllbHNlCisJCW5wdGUgfD0gUFRFX0NfVU5DQUNIRUQ7CisKKwlwdGUgPSBwbWFwX3B0ZShrZXJu
ZWxfcG1hcCwgdmEpOworCW9wdGUgPSAqcHRlOworCSpwdGUgPSBucHRlOworCisJcG1hcF91cGRh
dGVfcGFnZShrZXJuZWxfcG1hcCwgdmEsIG5wdGUpOworfQorCisvKgorICogcmVtb3ZlIGEgcGFn
ZSBmcm9tIHRoZSBrZXJuZWwgcGFnZXRhYmxlcworICovCisgLyogUE1BUF9JTkxJTkUgKi8gdm9p
ZAorcG1hcF9rcmVtb3ZlKHZtX29mZnNldF90IHZhKQoreworCXB0X2VudHJ5X3QgKnB0ZTsKKwor
CS8qCisJICogV3JpdGUgYmFjayBhbGwgY2FjaGVzIGZyb20gdGhlIHBhZ2UgYmVpbmcgZGVzdHJv
eWVkCisJICovCisJbWlwc19kY2FjaGVfd2JpbnZfcmFuZ2VfaW5kZXgodmEsIFBBR0VfU0laRSk7
CisKKwlwdGUgPSBwbWFwX3B0ZShrZXJuZWxfcG1hcCwgdmEpOworCSpwdGUgPSBQVEVfRzsKKwlw
bWFwX2ludmFsaWRhdGVfcGFnZShrZXJuZWxfcG1hcCwgdmEpOworfQorCisvKgorICoJVXNlZCB0
byBtYXAgYSByYW5nZSBvZiBwaHlzaWNhbCBhZGRyZXNzZXMgaW50byBrZXJuZWwKKyAqCXZpcnR1
YWwgYWRkcmVzcyBzcGFjZS4KKyAqCisgKglUaGUgdmFsdWUgcGFzc2VkIGluICcqdmlydCcgaXMg
YSBzdWdnZXN0ZWQgdmlydHVhbCBhZGRyZXNzIGZvcgorICoJdGhlIG1hcHBpbmcuIEFyY2hpdGVj
dHVyZXMgd2hpY2ggY2FuIHN1cHBvcnQgYSBkaXJlY3QtbWFwcGVkCisgKglwaHlzaWNhbCB0byB2
aXJ0dWFsIHJlZ2lvbiBjYW4gcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBhZGRyZXNzCisgKgl3aXRo
aW4gdGhhdCByZWdpb24sIGxlYXZpbmcgJyp2aXJ0JyB1bmNoYW5nZWQuIE90aGVyCisgKglhcmNo
aXRlY3R1cmVzIHNob3VsZCBtYXAgdGhlIHBhZ2VzIHN0YXJ0aW5nIGF0ICcqdmlydCcgYW5kCisg
Kgl1cGRhdGUgJyp2aXJ0JyB3aXRoIHRoZSBmaXJzdCB1c2FibGUgYWRkcmVzcyBhZnRlciB0aGUg
bWFwcGVkCisgKglyZWdpb24uCisgKgorICoJVXNlIFhLUEhZUyBmb3IgNjQgYml0LCBhbmQgS1NF
RzAgd2hlcmUgcG9zc2libGUgZm9yIDMyIGJpdC4KKyAqLwordm1fb2Zmc2V0X3QKK3BtYXBfbWFw
KHZtX29mZnNldF90ICp2aXJ0LCB2bV9vZmZzZXRfdCBzdGFydCwgdm1fb2Zmc2V0X3QgZW5kLCBp
bnQgcHJvdCkKK3sKKwlyZXR1cm4gKE1JUFNfUEhZU19UT19YS1BIWVNfQ0FDSEVEKHN0YXJ0KSk7
Cit9CisKKy8qCisgKiBBZGQgYSBsaXN0IG9mIHdpcmVkIHBhZ2VzIHRvIHRoZSBrdmEKKyAqIHRo
aXMgcm91dGluZSBpcyBvbmx5IHVzZWQgZm9yIHRlbXBvcmFyeQorICoga2VybmVsIG1hcHBpbmdz
IHRoYXQgZG8gbm90IG5lZWQgdG8gaGF2ZQorICogcGFnZSBtb2RpZmljYXRpb24gb3IgcmVmZXJl
bmNlcyByZWNvcmRlZC4KKyAqIE5vdGUgdGhhdCBvbGQgbWFwcGluZ3MgYXJlIHNpbXBseSB3cml0
dGVuCisgKiBvdmVyLiAgVGhlIHBhZ2UgKm11c3QqIGJlIHdpcmVkLgorICovCit2b2lkCitwbWFw
X3FlbnRlcih2bV9vZmZzZXRfdCB2YSwgdm1fcGFnZV90ICptLCBpbnQgY291bnQpCit7CisJaW50
IGk7CisJdm1fb2Zmc2V0X3Qgb3JpZ3ZhID0gdmE7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7
IGkrKykgeworCQlwbWFwX2ZsdXNoX3B2Y2FjaGUobVtpXSk7CisJCXBtYXBfa2VudGVyKHZhLCBW
TV9QQUdFX1RPX1BIWVMobVtpXSkpOworCQl2YSArPSBQQUdFX1NJWkU7CisJfQorCisJbWlwc19k
Y2FjaGVfd2JpbnZfcmFuZ2VfaW5kZXgob3JpZ3ZhLCBQQUdFX1NJWkUqY291bnQpOworfQorCisv
KgorICogdGhpcyByb3V0aW5lIGplcmtzIHBhZ2UgbWFwcGluZ3MgZnJvbSB0aGUKKyAqIGtlcm5l
bCAtLSBpdCBpcyBtZWFudCBvbmx5IGZvciB0ZW1wb3JhcnkgbWFwcGluZ3MuCisgKi8KK3ZvaWQK
K3BtYXBfcXJlbW92ZSh2bV9vZmZzZXRfdCB2YSwgaW50IGNvdW50KQoreworCS8qCisJICogTm8g
bmVlZCB0byB3Yi9pbnYgY2FjaGVzIGhlcmUsIAorCSAqICAgcG1hcF9rcmVtb3ZlIHdpbGwgZG8g
aXQgZm9yIHVzCisJICovCisKKwl3aGlsZSAoY291bnQtLSA+IDApIHsKKwkJcG1hcF9rcmVtb3Zl
KHZhKTsKKwkJdmEgKz0gUEFHRV9TSVpFOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUGFnZSB0YWJsZSBwYWdlIG1hbmFn
ZW1lbnQgcm91dGluZXMuLi4uLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKi8KKworLyogIFJldmlzaW9uIDEuNTA3CisgKgorICogU2ltcGxpZnkg
dGhlIHJlZmVyZW5jZSBjb3VudGluZyBvZiBwYWdlIHRhYmxlIHBhZ2VzLgkgU3BlY2lmaWNhbGx5
LCB1c2UKKyAqIHRoZSBwYWdlIHRhYmxlIHBhZ2UncyB3aXJlZCBjb3VudCByYXRoZXIgdGhhbiBp
dHMgaG9sZCBjb3VudCB0byBjb250YWluCisgKiB0aGUgcmVmZXJlbmNlIGNvdW50LgorICovCisK
Ky8qCisgKiBUaGlzIHJvdXRpbmUgdW5ob2xkcyBwYWdlIHRhYmxlIHBhZ2VzLCBhbmQgaWYgdGhl
IGhvbGQgY291bnQKKyAqIGRyb3BzIHRvIHplcm8sIHRoZW4gaXQgZGVjcmVtZW50cyB0aGUgd2ly
ZSBjb3VudC4KKyAqLworc3RhdGljIFBNQVBfSU5MSU5FIGludAorcG1hcF91bndpcmVfcHRlX2hv
bGQocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhLCB2bV9wYWdlX3QgbSkKK3sKKwktLW0tPndp
cmVfY291bnQ7CisJaWYgKG0tPndpcmVfY291bnQgPT0gMCkKKwkJcmV0dXJuIChfcG1hcF91bndp
cmVfcHRlX2hvbGQocG1hcCwgdmEsIG0pKTsKKwllbHNlCisJCXJldHVybiAoMCk7Cit9CisKK3N0
YXRpYyBpbnQKK19wbWFwX3Vud2lyZV9wdGVfaG9sZChwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3Qg
dmEsIHZtX3BhZ2VfdCBtKQoreworCXBkX2VudHJ5X3QgKnBkZSwgKnBkcDsKKwl2bV9wYWdlX3Qg
cGRwZzsKKworICAgICAgICBQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsKKwkvKgor
CSAqIHVubWFwIHRoZSBwYWdlIHRhYmxlIHBhZ2UKKwkgKi8KKworCWlmIChtLT5waW5kZXggPCBO
VVBERSkKKwkJcGRlID0gcG1hcF9wZGUocG1hcCwgdmEpOworCWVsc2UKKwkJcGRlID0gcG1hcF9z
ZWdtYXAocG1hcCwgdmEpOworCSpwZGUgPSAwOworCisgICAgICAgIHBtYXAtPnBtX3N0YXRzLnJl
c2lkZW50X2NvdW50LS07CisKKwlpZiAobS0+cGluZGV4IDwgTlVQREUpIHsKKwkJLyoKKwkJICog
UmVjdXJzaXZlbHkgZGVjcmVtZW50IG5leHQgbGV2ZWwgcGFnZXRhYmxlIHJlZmNvdW50CisJCSAq
LworCQlpZiAocG1hcC0+cG1fcHRwaGludCA9PSBtKQorCQkJcG1hcC0+cG1fcHRwaGludCA9IE5V
TEw7CisKKwkJcGRwID0gKHBkX2VudHJ5X3QgKikqcG1hcF9zZWdtYXAocG1hcCwgdmEpOworCQlw
ZHBnID0gUEhZU19UT19WTV9QQUdFKE1JUFNfS1NFRzBfVE9fUEhZUyhwZHApKTsKKwkJcG1hcF91
bndpcmVfcHRlX2hvbGQocG1hcCwgdmEsIHBkcGcpOworCX0KKwkvKgorCSAqIElmIHRoZSBwYWdl
IGlzIGZpbmFsbHkgdW53aXJlZCwgc2ltcGx5IGZyZWUgaXQuCisJICovCisJaWYgKDApIHByaW50
ZigiWyVkXSBmcmVlIHBpbmRleFsleF0gbSAlcCwgdmEgJXBcbiIsCisJCWN1cnRocmVhZC0+dGRf
cHJvYy0+cF9waWQsIChpbnQpbS0+cGluZGV4LCBtLCAodm9pZCAqKXZhKTsKKworCXZtX3BhZ2Vf
ZnJlZV96ZXJvKG0pOworCWF0b21pY19zdWJ0cmFjdF9pbnQoJmNudC52X3dpcmVfY291bnQsIDEp
OworCXJldHVybiAoMSk7Cit9CisKKy8qCisgKiBBZnRlciByZW1vdmluZyBhIHBhZ2UgdGFibGUg
ZW50cnksIHRoaXMgcm91dGluZSBpcyB1c2VkIHRvCisgKiBjb25kaXRpb25hbGx5IGZyZWUgdGhl
IHBhZ2UsIGFuZCBtYW5hZ2UgdGhlIGhvbGQvd2lyZSBjb3VudHMuCisgKi8KK3N0YXRpYyBpbnQK
K3BtYXBfdW51c2VfcHQocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhLCB2bV9wYWdlX3QgbXB0
ZSkKK3sKKwl1bnNpZ25lZCBwdGVwaW5kZXg7CisJcGRfZW50cnlfdCBwdGV2YTsKKworCWlmICh2
YSA+PSBWTV9NQVhVU0VSX0FERFJFU1MpCisJCXJldHVybiAoMCk7CisKKwlpZiAobXB0ZSA9PSBO
VUxMKSB7CisJCXB0ZXBpbmRleCA9IHBtYXBfcGRlX3BpbmRleCh2YSk7CisJCWlmIChwbWFwLT5w
bV9wdHBoaW50ICYmCisJCSAgICAocG1hcC0+cG1fcHRwaGludC0+cGluZGV4ID09IHB0ZXBpbmRl
eCkpIHsKKwkJCW1wdGUgPSBwbWFwLT5wbV9wdHBoaW50OworCQl9IGVsc2UgeworCQkJcHRldmEg
PSAqcG1hcF9wZGUocG1hcCwgdmEpOworCQkJbXB0ZSA9IFBIWVNfVE9fVk1fUEFHRShNSVBTX0tT
RUcwX1RPX1BIWVMocHRldmEpKTsKKwkJCXBtYXAtPnBtX3B0cGhpbnQgPSBtcHRlOworCQl9CisJ
fQorCXJldHVybiBwbWFwX3Vud2lyZV9wdGVfaG9sZChwbWFwLCB2YSwgbXB0ZSk7Cit9CisKK3Zv
aWQKK3BtYXBfcGluaXQwKHBtYXBfdCBwbWFwKQoreworCWludCBpOworCisJUE1BUF9MT0NLX0lO
SVQocG1hcCk7CisJcG1hcC0+cG1fc2VndGFiID0ga2VybmVsX3NlZ21hcDsKKwlwbWFwLT5wbV9h
Y3RpdmUgPSAwOworCXBtYXAtPnBtX3B0cGhpbnQgPSBOVUxMOworCWZvciAoaSA9IDA7IGkgPCBN
QVhDUFU7IGkrKykgeworCQlwbWFwLT5wbV9hc2lkW2ldLmFzaWQgPSBQTUFQX0FTSURfUkVTRVJW
RUQ7CisJCXBtYXAtPnBtX2FzaWRbaV0uZ2VuID0gMDsKKwl9CisJUENQVV9TRVQoY3VycG1hcCwg
cG1hcCk7CisJVEFJTFFfSU5JVCgmcG1hcC0+cG1fcHZsaXN0KTsKKwliemVybygmcG1hcC0+cG1f
c3RhdHMsIHNpemVvZiBwbWFwLT5wbV9zdGF0cyk7Cit9CisKK3N0YXRpYyB2b2lkCitwbWFwX2dy
b3dfcHRlX3BhZ2VfY2FjaGUoKQoreworCisJdm1fY29udGlnX2dyb3dfY2FjaGUoMywgMCwgTUlQ
U19LU0VHMF9MQVJHRVNUX1BIWVMpOworfQorCitzdGF0aWMgdm1fcGFnZV90CitwbWFwX2FsbG9j
X3B0ZV9wYWdlKHVuc2lnbmVkIGludCBpbmRleCwgaW50IHJlcSkKK3sKKwl2bV9wYWdlX3QgbTsK
KworCW0gPSB2bV9wYWdlX2FsbG9jX2ZyZWVsaXN0KFZNX0ZSRUVMSVNUX0RJUkVDVCwgMCwgcmVx
KTsKKwlpZiAobSA9PSBOVUxMKQorCQlyZXR1cm4gKE5VTEwpOworCisJaWYgKChtLT5mbGFncyAm
IFBHX1pFUk8pID09IDApCisJCXBtYXBfemVyb19wYWdlKG0pOworCisJbS0+cGluZGV4ID0gaW5k
ZXg7CisJYXRvbWljX2FkZF9pbnQoJmNudC52X3dpcmVfY291bnQsIDEpOworCW0tPndpcmVfY291
bnQgPSAxOworCXJldHVybiAobSk7Cit9CisKKy8qCisgKiBJbml0aWFsaXplIGEgcHJlYWxsb2Nh
dGVkIGFuZCB6ZXJvZWQgcG1hcCBzdHJ1Y3R1cmUsCisgKiBzdWNoIGFzIG9uZSBpbiBhIHZtc3Bh
Y2Ugc3RydWN0dXJlLgorICovCitpbnQKK3BtYXBfcGluaXQocG1hcF90IHBtYXApCit7CisJdm1f
b2Zmc2V0X3QgcHRkdmE7CisJdm1fcGFnZV90IHB0ZHBnOworCWludCBpOworCisJUE1BUF9MT0NL
X0lOSVQocG1hcCk7CisKKwkvKgorCSAqIGFsbG9jYXRlIHRoZSBwYWdlIGRpcmVjdG9yeSBwYWdl
CisJICovCisJd2hpbGUgKChwdGRwZyA9IHBtYXBfYWxsb2NfcHRlX3BhZ2UoTlVTRVJQR1RCTFMs
IFZNX0FMTE9DX05PUk1BTCkpID09IE5VTEwpCisJICAgICAgIHBtYXBfZ3Jvd19wdGVfcGFnZV9j
YWNoZSgpOworCisJcHRkdmEgPSBNSVBTX1BIWVNfVE9fS1NFRzAoVk1fUEFHRV9UT19QSFlTKHB0
ZHBnKSk7CisJcG1hcC0+cG1fc2VndGFiID0gKHBkX2VudHJ5X3QgKilwdGR2YTsKKwlwbWFwLT5w
bV9hY3RpdmUgPSAwOworCXBtYXAtPnBtX3B0cGhpbnQgPSBOVUxMOworCWZvciAoaSA9IDA7IGkg
PCBNQVhDUFU7IGkrKykgeworCQlwbWFwLT5wbV9hc2lkW2ldLmFzaWQgPSBQTUFQX0FTSURfUkVT
RVJWRUQ7CisJCXBtYXAtPnBtX2FzaWRbaV0uZ2VuID0gMDsKKwl9CisJVEFJTFFfSU5JVCgmcG1h
cC0+cG1fcHZsaXN0KTsKKwliemVybygmcG1hcC0+cG1fc3RhdHMsIHNpemVvZiBwbWFwLT5wbV9z
dGF0cyk7CisKKwlyZXR1cm4gKDEpOworfQorCisvKgorICogdGhpcyByb3V0aW5lIGlzIGNhbGxl
ZCBpZiB0aGUgcGFnZSB0YWJsZSBwYWdlIGlzIG5vdAorICogbWFwcGVkIGNvcnJlY3RseS4KKyAq
Lworc3RhdGljIHZtX3BhZ2VfdAorX3BtYXBfYWxsb2NwdGUocG1hcF90IHBtYXAsIHVuc2lnbmVk
IHB0ZXBpbmRleCwgaW50IGZsYWdzKQoreworCXZtX29mZnNldF90IHBhZ2V2YTsKKwl2bV9wYWdl
X3QgbTsKKwlpbnQgcGlkID0gY3VydGhyZWFkLT50ZF9wcm9jLT5wX3BpZDsKKworCUtBU1NFUlQo
KGZsYWdzICYgKE1fTk9XQUlUIHwgTV9XQUlUT0spKSA9PSBNX05PV0FJVCB8fAorCSAgICAoZmxh
Z3MgJiAoTV9OT1dBSVQgfCBNX1dBSVRPSykpID09IE1fV0FJVE9LLAorCSAgICAoIl9wbWFwX2Fs
bG9jcHRlOiBmbGFncyBpcyBuZWl0aGVyIE1fTk9XQUlUIG5vciBNX1dBSVRPSyIpKTsKKworCS8q
CisJICogRmluZCBvciBmYWJyaWNhdGUgYSBuZXcgcGFnZXRhYmxlIHBhZ2UKKwkgKi8KKwlpZiAo
KG0gPSBwbWFwX2FsbG9jX3B0ZV9wYWdlKHB0ZXBpbmRleCwgVk1fQUxMT0NfTk9STUFMKSkgPT0g
TlVMTCkgeworCQlpZiAoZmxhZ3MgJiBNX1dBSVRPSykgeworCQkJUE1BUF9VTkxPQ0socG1hcCk7
CisJCQl2bV9wYWdlX3VubG9ja19xdWV1ZXMoKTsKKwkJCXBtYXBfZ3Jvd19wdGVfcGFnZV9jYWNo
ZSgpOworCQkJdm1fcGFnZV9sb2NrX3F1ZXVlcygpOworCQkJUE1BUF9MT0NLKHBtYXApOworCQl9
CisKKwkJLyoKKwkJICogSW5kaWNhdGUgdGhlIG5lZWQgdG8gcmV0cnkuCVdoaWxlIHdhaXRpbmcs
IHRoZSBwYWdlCisJCSAqIHRhYmxlIHBhZ2UgbWF5IGhhdmUgYmVlbiBhbGxvY2F0ZWQuCisJCSAq
LworCQlyZXR1cm4gKE5VTEwpOworCX0KKworCXBhZ2V2YSA9IE1JUFNfUEhZU19UT19LU0VHMChW
TV9QQUdFX1RPX1BIWVMobSkpOworCWlmICgwKSBwcmludGYoIl9wbWFwX2FsbG9jcHRlOiBpbmRl
eCAleCAoJWx4KSwgZmxhZ3MgJXggcGFnZXZhICVseFxuIiwKKwkJCXB0ZXBpbmRleCwgTlVQREUs
IGZsYWdzLCAodV9sb25nKXBhZ2V2YSk7CisJLyoKKwkgKiBNYXAgdGhlIHBhZ2V0YWJsZSBwYWdl
IGludG8gdGhlIHByb2Nlc3MgYWRkcmVzcyBzcGFjZSwgaWYgaXQKKwkgKiBpc24ndCBhbHJlYWR5
IHRoZXJlLgorCSAqLworCWlmIChwdGVwaW5kZXggPj0gTlVQREUpIHsKKwkJcG1hcC0+cG1fc2Vn
dGFiW3B0ZXBpbmRleCAtIE5VUERFXSA9IChwZF9lbnRyeV90KXBhZ2V2YTsKKwkJaWYoMCkgcHJp
bnRmKCJbJWRdc2VndGFiWyVsdV0gPSAlcFxuIiwgcGlkLCBwdGVwaW5kZXggLSBOVVBERSwgKHZv
aWQgKilwYWdldmEpOworCX0gZWxzZSB7CisJCXBkX2VudHJ5X3QgKnBkZXAsICpwZGU7CisJCWlu
dCBzZWdpbmRleCA9IHB0ZXBpbmRleCA+PiAoU0VHU0hJRlQgLSBQRFJTSElGVCk7CisJCWludCBw
ZGVpbmRleCA9IHB0ZXBpbmRleCAmIChOUERFUEcgLSAxKTsKKwkJdm1fcGFnZV90IHBnOworCQkK
KwkJcGRlcCA9ICZwbWFwLT5wbV9zZWd0YWJbc2VnaW5kZXhdOworCQlpZiAoKnBkZXAgPT0gTlVM
TCkgeyAKKwkJCS8qIHJlY3Vyc2UgZm9yIGFsbG9jYXRpbmcgcGFnZSBkaXIgKi8KKwkJCWlmIChf
cG1hcF9hbGxvY3B0ZShwbWFwLCBOVVBERSArIHNlZ2luZGV4LCAKKwkJCSAgICBmbGFncykgPT0g
TlVMTCkgeworCQkJCS8qIGFsbG9jIGZhaWxlZCwgcmVsZWFzZSBjdXJyZW50ICovCisJCQkJLS1t
LT53aXJlX2NvdW50OworCQkJCWF0b21pY19zdWJ0cmFjdF9pbnQoJmNudC52X3dpcmVfY291bnQs
IDEpOworCQkJCXZtX3BhZ2VfZnJlZV96ZXJvKG0pOworCQkJCXJldHVybiAoTlVMTCk7CisJCQl9
CisJCX0gZWxzZSB7CisJCQlwZyA9IFBIWVNfVE9fVk1fUEFHRShNSVBTX0tTRUcwX1RPX1BIWVMo
KnBkZXApKTsKKwkJCXBnLT53aXJlX2NvdW50Kys7CisJCX0KKwkJLyogTmV4dCBsZXZlbCBlbnRy
eSAqLworCQlwZGUgPSAocGRfZW50cnlfdCAqKSpwZGVwOworCQlwZGVbcGRlaW5kZXhdID0gKHBk
X2VudHJ5X3QpcGFnZXZhOworCQlwbWFwLT5wbV9wdHBoaW50ID0gbTsKKwkJaWYoMClwcmludGYo
IlslZF0gcGRlKCVwKVslZF0gPSAlcFxuIiwgcGlkLCBwZGUsIHBkZWluZGV4LCAodm9pZCAqKXBh
Z2V2YSk7CisJfQorCXBtYXAtPnBtX3N0YXRzLnJlc2lkZW50X2NvdW50Kys7CisKKwkvKgorCSAq
IFNldCB0aGUgcGFnZSB0YWJsZSBoaW50CisJICovCisJcG1hcC0+cG1fcHRwaGludCA9IG07CisJ
cmV0dXJuIChtKTsKK30KKworc3RhdGljIHZtX3BhZ2VfdAorcG1hcF9hbGxvY3B0ZShwbWFwX3Qg
cG1hcCwgdm1fb2Zmc2V0X3QgdmEsIGludCBmbGFncykKK3sKKwl1bnNpZ25lZCBwdGVwaW5kZXg7
CisJcGRfZW50cnlfdCAqcGRlOworCXZtX3BhZ2VfdCBtOworCisJS0FTU0VSVCgoZmxhZ3MgJiAo
TV9OT1dBSVQgfCBNX1dBSVRPSykpID09IE1fTk9XQUlUIHx8CisJICAgIChmbGFncyAmIChNX05P
V0FJVCB8IE1fV0FJVE9LKSkgPT0gTV9XQUlUT0ssCisJICAgICgicG1hcF9hbGxvY3B0ZTogZmxh
Z3MgaXMgbmVpdGhlciBNX05PV0FJVCBub3IgTV9XQUlUT0siKSk7CisKKwkvKgorCSAqIENhbGN1
bGF0ZSBwYWdldGFibGUgcGFnZSBpbmRleAorCSAqLworCXB0ZXBpbmRleCA9IHBtYXBfcGRlX3Bp
bmRleCh2YSk7CityZXRyeToKKwkvKgorCSAqIEdldCB0aGUgcGFnZSBkaXJlY3RvcnkgZW50cnkK
KwkgKi8KKwlwZGUgPSBwbWFwX3BkZShwbWFwLCB2YSk7CisKKwkvKgorCSAqIElmIHRoZSBwYWdl
IHRhYmxlIHBhZ2UgaXMgbWFwcGVkLCB3ZSBqdXN0IGluY3JlbWVudCB0aGUgaG9sZAorCSAqIGNv
dW50LCBhbmQgYWN0aXZhdGUgaXQuCisJICovCisJaWYgKHBkZSAhPSBOVUxMICYmICpwZGUgIT0g
TlVMTCkgeworCQkvKgorCQkgKiBJbiBvcmRlciB0byBnZXQgdGhlIHBhZ2UgdGFibGUgcGFnZSwg
dHJ5IHRoZSBoaW50IGZpcnN0LgorCQkgKi8KKwkJaWYgKHBtYXAtPnBtX3B0cGhpbnQgJiYKKwkJ
ICAgIChwbWFwLT5wbV9wdHBoaW50LT5waW5kZXggPT0gcHRlcGluZGV4KSkgeworCQkJbSA9IHBt
YXAtPnBtX3B0cGhpbnQ7CisJCX0gZWxzZSB7CisJCQltID0gUEhZU19UT19WTV9QQUdFKE1JUFNf
S1NFRzBfVE9fUEhZUygqcGRlKSk7CisJCQlwbWFwLT5wbV9wdHBoaW50ID0gbTsKKwkJfQorCQlt
LT53aXJlX2NvdW50Kys7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogSGVyZSBpZiB0aGUgcHRlIHBh
Z2UgaXNuJ3QgbWFwcGVkLCBvciBpZiBpdCBoYXMgYmVlbgorCQkgKiBkZWFsbG9jYXRlZC4KKwkJ
ICovCisJCW0gPSBfcG1hcF9hbGxvY3B0ZShwbWFwLCBwdGVwaW5kZXgsIGZsYWdzKTsKKwkJaWYg
KG0gPT0gTlVMTCAmJiAoZmxhZ3MgJiBNX1dBSVRPSykpCisJCQlnb3RvIHJldHJ5OworCX0KKwly
ZXR1cm4gKG0pOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioKKyogUG1hcCBhbGxvY2F0aW9uL2RlYWxsb2NhdGlvbiByb3V0aW5lcy4K
KyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisv
KgorICogIFJldmlzaW9uIDEuMzk3CisgKiAgLSBNZXJnZWQgcG1hcF9yZWxlYXNlIGFuZCBwbWFw
X3JlbGVhc2VfZnJlZV9wYWdlLiAgV2hlbiBwbWFwX3JlbGVhc2UgaXMKKyAqICAgIGNhbGxlZCBv
bmx5IHRoZSBwYWdlIGRpcmVjdG9yeSBwYWdlKHMpIGNhbiBiZSBsZWZ0IGluIHRoZSBwbWFwIHB0
ZQorICogICAgb2JqZWN0LCBzaW5jZSBhbGwgcGFnZSB0YWJsZSBwYWdlcyB3aWxsIGhhdmUgYmVl
biBmcmVlZCBieQorICogICAgcG1hcF9yZW1vdmVfcGFnZXMgYW5kIHBtYXBfcmVtb3ZlLiAgSW4g
YWRkaXRpb24sIHRoZXJlIGNhbiBvbmx5IGJlIG9uZQorICogICAgcmVmZXJlbmNlIHRvIHRoZSBw
bWFwIGFuZCB0aGUgcGFnZSBkaXJlY3RvcnkgaXMgd2lyZWQsIHNvIHRoZSBwYWdlKHMpCisgKiAg
ICBjYW4gbmV2ZXIgYmUgYnVzeS4gIFNvIGFsbCB0aGVyZSBpcyB0byBkbyBpcyBjbGVhciB0aGUg
bWFnaWMgbWFwcGluZ3MKKyAqICAgIGZyb20gdGhlIHBhZ2UgZGlyZWN0b3J5IGFuZCBmcmVlIHRo
ZSBwYWdlKHMpLgorICovCisKKworLyoKKyAqIFJlbGVhc2UgYW55IHJlc291cmNlcyBoZWxkIGJ5
IHRoZSBnaXZlbiBwaHlzaWNhbCBtYXAuCisgKiBDYWxsZWQgd2hlbiBhIHBtYXAgaW5pdGlhbGl6
ZWQgYnkgcG1hcF9waW5pdCBpcyBiZWluZyByZWxlYXNlZC4KKyAqIFNob3VsZCBvbmx5IGJlIGNh
bGxlZCBpZiB0aGUgbWFwIGNvbnRhaW5zIG5vIHZhbGlkIG1hcHBpbmdzLgorICovCit2b2lkCitw
bWFwX3JlbGVhc2UocG1hcF90IHBtYXApCit7CisJdm1fb2Zmc2V0X3QgcHRkdmE7CisJdm1fcGFn
ZV90IHB0ZHBnOworCisJS0FTU0VSVChwbWFwLT5wbV9zdGF0cy5yZXNpZGVudF9jb3VudCA9PSAw
LAorCSAgICAoInBtYXBfcmVsZWFzZTogcG1hcCByZXNpZGVudCBjb3VudCAlbGQgIT0gMCIsCisJ
ICAgIHBtYXAtPnBtX3N0YXRzLnJlc2lkZW50X2NvdW50KSk7CisKKwlwdGR2YSA9ICh2bV9vZmZz
ZXRfdClwbWFwLT5wbV9zZWd0YWI7CisJcHRkcGcgPSBQSFlTX1RPX1ZNX1BBR0UoTUlQU19LU0VH
MF9UT19QSFlTKHB0ZHZhKSk7CisKKwlwdGRwZy0+d2lyZV9jb3VudC0tOworCWF0b21pY19zdWJ0
cmFjdF9pbnQoJmNudC52X3dpcmVfY291bnQsIDEpOworCXZtX3BhZ2VfZnJlZV96ZXJvKHB0ZHBn
KTsKKwlQTUFQX0xPQ0tfREVTVFJPWShwbWFwKTsKK30KKworLyoKKyAqIGdyb3cgdGhlIG51bWJl
ciBvZiBrZXJuZWwgcGFnZSB0YWJsZSBlbnRyaWVzLCBpZiBuZWVkZWQKKyAqLwordm9pZAorcG1h
cF9ncm93a2VybmVsKHZtX29mZnNldF90IGFkZHIpCit7CisJdm1fcGFnZV90IG5rcGc7CisJcHRf
ZW50cnlfdCAqcHRlOworCXBkX2VudHJ5X3QgKnBkcGUsICpwZGU7CisJaW50IGk7CisKKwlpZiAo
MCkgcHJpbnRmKCJwbWFwX2dyb3drZXJuZWwsIGFkZHIgJWx4IG1heF9vZmZzZXQgJWx4LCBrZXJu
ZWxfdm1fZW5kICVseCwgbmtwdCAlZFxuIiwKKwkgICAgICAgKHVfbG9uZylhZGRyLCAodV9sb25n
KWtlcm5lbF9tYXAtPm1heF9vZmZzZXQsICh1X2xvbmcpa2VybmVsX3ZtX2VuZCwgbmtwdCk7CisJ
bXR4X2Fzc2VydCgma2VybmVsX21hcC0+c3lzdGVtX210eCwgTUFfT1dORUQpOworCWFkZHIgPSBy
b3VuZHVwMihhZGRyLCBQQUdFX1NJWkUgKiBOUFRFUEcpOworCWlmIChhZGRyIC0gMSA+PSBrZXJu
ZWxfbWFwLT5tYXhfb2Zmc2V0KQorCQlhZGRyID0ga2VybmVsX21hcC0+bWF4X29mZnNldDsKKwl3
aGlsZSAoa2VybmVsX3ZtX2VuZCA8IGFkZHIpIHsKKwkJcGRwZSA9IHBtYXBfc2VnbWFwKGtlcm5l
bF9wbWFwLCBrZXJuZWxfdm1fZW5kKTsKKwkJaWYgKCpwZHBlID09IDApIHsKKwkJCS8qIG5ldyBp
bnRlcm1lZGlhdGUgcGFnZSB0YWJsZSBlbnRyeSAqLworCQkJbmtwZyA9IHBtYXBfYWxsb2NfcHRl
X3BhZ2UobmtwdCwgVk1fQUxMT0NfSU5URVJSVVBUKTsKKwkJCWlmIChua3BnID09IE5VTEwpCisJ
CQkJcGFuaWMoInBtYXBfZ3Jvd2tlcm5lbDogbm8gbWVtb3J5IHRvIGdyb3cga2VybmVsIik7CisJ
CQkqcGRwZSA9IChwZF9lbnRyeV90KU1JUFNfUEhZU19UT19LU0VHMChWTV9QQUdFX1RPX1BIWVMo
bmtwZykpOworCQkJY29udGludWU7IC8qIHRyeSBhZ2FpbiAqLworCQl9CisKKwkJcGRlID0gcG1h
cF9wZHBlX3RvX3BkZShwZHBlLCBrZXJuZWxfdm1fZW5kKTsKKwkJaWYgKCpwZGUgIT0gMCkgewor
CQkJa2VybmVsX3ZtX2VuZCA9IChrZXJuZWxfdm1fZW5kICsgTkJQRFIpICYgflBEUk1BU0s7CisJ
CQlpZiAoa2VybmVsX3ZtX2VuZCAtIDEgPj0ga2VybmVsX21hcC0+bWF4X29mZnNldCkgeworCQkJ
CWtlcm5lbF92bV9lbmQgPSBrZXJuZWxfbWFwLT5tYXhfb2Zmc2V0OworCQkJCWJyZWFrOworCQkJ
fQorCQkJY29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBUaGlzIGluZGV4IGlzIGJvZ3VzLCBi
dXQgb3V0IG9mIHRoZSB3YXkKKwkJKi8KKwkJbmtwZyA9IHBtYXBfYWxsb2NfcHRlX3BhZ2Uobmtw
dCwgVk1fQUxMT0NfSU5URVJSVVBUKTsKKwkJaWYgKCFua3BnKQorCQkJcGFuaWMoInBtYXBfZ3Jv
d2tlcm5lbDogbm8gbWVtb3J5IHRvIGdyb3cga2VybmVsIik7CisJCW5rcHQrKzsKKwkJKnBkZSA9
IChwZF9lbnRyeV90KU1JUFNfUEhZU19UT19LU0VHMChWTV9QQUdFX1RPX1BIWVMobmtwZykpOwor
CisJCS8qCisJCSAqIFRoZSBSWzQtN10/MDAgc3RvcmVzIG9ubHkgb25lIGNvcHkgb2YgdGhlIEds
b2JhbCBiaXQgaW4KKwkJICogdGhlIHRyYW5zbGF0aW9uIGxvb2thc2lkZSBidWZmZXIgZm9yIGVh
Y2ggMiBwYWdlIGVudHJ5LgorCQkgKiBUaHVzIGludmFsaWQgZW50cnlzIG11c3QgaGF2ZSB0aGUg
R2xvYmFsIGJpdCBzZXQgc28gd2hlbgorCQkgKiBFbnRyeSBMTyBhbmQgRW50cnkgSEkgRyBiaXRz
IGFyZSBhbmRlZCB0b2dldGhlciB0aGV5IHdpbGwKKwkJICogcHJvZHVjZSBhIGdsb2JhbCBiaXQg
dG8gc3RvcmUgaW4gdGhlIHRsYi4KKwkJICovCisJCXB0ZSA9IChwdF9lbnRyeV90ICopKnBkZTsK
KwkJZm9yIChpID0gMDsgaSA8IE5QVEVQRzsgaSsrKQorCQkJcHRlW2ldID0gUFRFX0c7CisKKwkJ
a2VybmVsX3ZtX2VuZCA9IChrZXJuZWxfdm1fZW5kICsgTkJQRFIpICYgflBEUk1BU0s7CisJCWlm
IChrZXJuZWxfdm1fZW5kIC0gMSA+PSBrZXJuZWxfbWFwLT5tYXhfb2Zmc2V0KSB7CisJCQlrZXJu
ZWxfdm1fZW5kID0ga2VybmVsX21hcC0+bWF4X29mZnNldDsKKwkJCWJyZWFrOworCQl9CisJfQor
fQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
CisqIHBhZ2UgbWFuYWdlbWVudCByb3V0aW5lcy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBmcmVlIHRoZSBwdl9lbnRyeSBi
YWNrIHRvIHRoZSBmcmVlIGxpc3QKKyAqLworc3RhdGljIFBNQVBfSU5MSU5FIHZvaWQKK2ZyZWVf
cHZfZW50cnkocHZfZW50cnlfdCBwdikKK3sKKworCXB2X2VudHJ5X2NvdW50LS07CisJdW1hX3pm
cmVlKHB2em9uZSwgcHYpOworfQorCisvKgorICogZ2V0IGEgbmV3IHB2X2VudHJ5LCBhbGxvY2F0
aW5nIGEgYmxvY2sgZnJvbSB0aGUgc3lzdGVtCisgKiB3aGVuIG5lZWRlZC4KKyAqIHRoZSBtZW1v
cnkgYWxsb2NhdGlvbiBpcyBwZXJmb3JtZWQgYnlwYXNzaW5nIHRoZSBtYWxsb2MgY29kZQorICog
YmVjYXVzZSBvZiB0aGUgcG9zc2liaWxpdHkgb2YgYWxsb2NhdGlvbnMgYXQgaW50ZXJydXB0IHRp
bWUuCisgKi8KK3N0YXRpYyBwdl9lbnRyeV90CitnZXRfcHZfZW50cnkocG1hcF90IGxvY2tlZF9w
bWFwKQoreworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgdGltZXZhbCBwcmludGludGVydmFsID0geyA2
MCwgMCB9OworCXN0YXRpYyBzdHJ1Y3QgdGltZXZhbCBsYXN0cHJpbnQ7CisJc3RydWN0IHZwZ3F1
ZXVlcyAqdnBxOworCXB0X2VudHJ5X3QgKnB0ZSwgb2xkcHRlOworCXBtYXBfdCBwbWFwOworCXB2
X2VudHJ5X3QgYWxsb2NhdGVkX3B2LCBuZXh0X3B2LCBwdjsKKwl2bV9vZmZzZXRfdCB2YTsKKwl2
bV9wYWdlX3QgbTsKKworCVBNQVBfTE9DS19BU1NFUlQobG9ja2VkX3BtYXAsIE1BX09XTkVEKTsK
KwltdHhfYXNzZXJ0KCZ2bV9wYWdlX3F1ZXVlX210eCwgTUFfT1dORUQpOworCWFsbG9jYXRlZF9w
diA9IHVtYV96YWxsb2MocHZ6b25lLCBNX05PV0FJVCk7CisJaWYgKGFsbG9jYXRlZF9wdiAhPSBO
VUxMKSB7CisJCXB2X2VudHJ5X2NvdW50Kys7CisJCWlmIChwdl9lbnRyeV9jb3VudCA+IHB2X2Vu
dHJ5X2hpZ2hfd2F0ZXIpCisJCQlwYWdlZGFlbW9uX3dha2V1cCgpOworCQllbHNlCisJCQlyZXR1
cm4gKGFsbG9jYXRlZF9wdik7CisJfQorCS8qCisJICogUmVjbGFpbSBwdiBlbnRyaWVzOiBBdCBm
aXJzdCwgZGVzdHJveSBtYXBwaW5ncyB0byBpbmFjdGl2ZQorCSAqIHBhZ2VzLiAgQWZ0ZXIgdGhh
dCwgaWYgYSBwdiBlbnRyeSBpcyBzdGlsbCBuZWVkZWQsIGRlc3Ryb3kKKwkgKiBtYXBwaW5ncyB0
byBhY3RpdmUgcGFnZXMuCisJICovCisJaWYgKHJhdGVjaGVjaygmbGFzdHByaW50LCAmcHJpbnRp
bnRlcnZhbCkpCisJCXByaW50ZigiQXBwcm9hY2hpbmcgdGhlIGxpbWl0IG9uIFBWIGVudHJpZXMs
ICIKKwkJICAgICJpbmNyZWFzZSB0aGUgdm0ucG1hcC5zaHBncGVycHJvYyB0dW5hYmxlLlxuIik7
CisJdnBxID0gJnZtX3BhZ2VfcXVldWVzW1BRX0lOQUNUSVZFXTsKK3JldHJ5OgorCVRBSUxRX0ZP
UkVBQ0gobSwgJnZwcS0+cGwsIHBhZ2VxKSB7CisJCWlmIChtLT5ob2xkX2NvdW50IHx8IG0tPmJ1
c3kpCisJCQljb250aW51ZTsKKwkJVEFJTFFfRk9SRUFDSF9TQUZFKHB2LCAmbS0+bWQucHZfbGlz
dCwgcHZfbGlzdCwgbmV4dF9wdikgeworCQkJdmEgPSBwdi0+cHZfdmE7CisJCQlwbWFwID0gcHYt
PnB2X3BtYXA7CisJCQkvKiBBdm9pZCBkZWFkbG9jayBhbmQgbG9jayByZWN1cnNpb24uICovCisJ
CQlpZiAocG1hcCA+IGxvY2tlZF9wbWFwKQorCQkJCVBNQVBfTE9DSyhwbWFwKTsKKwkJCWVsc2Ug
aWYgKHBtYXAgIT0gbG9ja2VkX3BtYXAgJiYgIVBNQVBfVFJZTE9DSyhwbWFwKSkKKwkJCQljb250
aW51ZTsKKwkJCXBtYXAtPnBtX3N0YXRzLnJlc2lkZW50X2NvdW50LS07CisJCQlwdGUgPSBwbWFw
X3B0ZShwbWFwLCB2YSk7CisJCQlLQVNTRVJUKHB0ZSAhPSBOVUxMLCAoInB0ZSIpKTsKKwkJCW9s
ZHB0ZSA9IGxvYWRhbmRjbGVhcigodV9pbnQgKilwdGUpOworCQkJaWYgKGlzX2tlcm5lbF9wbWFw
KHBtYXApKQorCQkJCSpwdGUgPSBQVEVfRzsKKwkJCUtBU1NFUlQoIXB0ZV90ZXN0KCZvbGRwdGUs
IFBURV9XKSwKKwkJCSAgICAoIndpcmVkIHB0ZSBmb3IgdW53aXJlZCBwYWdlIikpOworCQkJaWYg
KG0tPm1kLnB2X2ZsYWdzICYgUFZfVEFCTEVfUkVGKQorCQkJCXZtX3BhZ2VfZmxhZ19zZXQobSwg
UEdfUkVGRVJFTkNFRCk7CisJCQlpZiAocHRlX3Rlc3QoJm9sZHB0ZSwgUFRFX0QpKQorCQkJCXZt
X3BhZ2VfZGlydHkobSk7CisJCQlwbWFwX2ludmFsaWRhdGVfcGFnZShwbWFwLCB2YSk7CisJCQlU
QUlMUV9SRU1PVkUoJnBtYXAtPnBtX3B2bGlzdCwgcHYsIHB2X3BsaXN0KTsKKwkJCW0tPm1kLnB2
X2xpc3RfY291bnQtLTsKKwkJCVRBSUxRX1JFTU9WRSgmbS0+bWQucHZfbGlzdCwgcHYsIHB2X2xp
c3QpOworCQkJcG1hcF91bnVzZV9wdChwbWFwLCB2YSwgcHYtPnB2X3B0ZW0pOworCQkJaWYgKHBt
YXAgIT0gbG9ja2VkX3BtYXApCisJCQkJUE1BUF9VTkxPQ0socG1hcCk7CisJCQlpZiAoYWxsb2Nh
dGVkX3B2ID09IE5VTEwpCisJCQkJYWxsb2NhdGVkX3B2ID0gcHY7CisJCQllbHNlCisJCQkJZnJl
ZV9wdl9lbnRyeShwdik7CisJCX0KKwkJaWYgKFRBSUxRX0VNUFRZKCZtLT5tZC5wdl9saXN0KSkg
eworCQkJdm1fcGFnZV9mbGFnX2NsZWFyKG0sIFBHX1dSSVRFQUJMRSk7CisJCQltLT5tZC5wdl9m
bGFncyAmPSB+KFBWX1RBQkxFX1JFRiB8IFBWX1RBQkxFX01PRCk7CisJCX0KKwl9CisJaWYgKGFs
bG9jYXRlZF9wdiA9PSBOVUxMKSB7CisJCWlmICh2cHEgPT0gJnZtX3BhZ2VfcXVldWVzW1BRX0lO
QUNUSVZFXSkgeworCQkJdnBxID0gJnZtX3BhZ2VfcXVldWVzW1BRX0FDVElWRV07CisJCQlnb3Rv
IHJldHJ5OworCQl9CisJCXBhbmljKCJnZXRfcHZfZW50cnk6IGluY3JlYXNlIHRoZSB2bS5wbWFw
LnNocGdwZXJwcm9jIHR1bmFibGUiKTsKKwl9CisJcmV0dXJuIChhbGxvY2F0ZWRfcHYpOworfQor
CisvKgorICogIFJldmlzaW9uIDEuMzcwCisgKgorICogIE1vdmUgcG1hcF9jb2xsZWN0KCkgb3V0
IG9mIHRoZSBtYWNoaW5lLWRlcGVuZGVudCBjb2RlLCByZW5hbWUgaXQKKyAqICB0byByZWZsZWN0
IGl0cyBuZXcgbG9jYXRpb24sIGFuZCBhZGQgcGFnZSBxdWV1ZSBhbmQgZmxhZyBsb2NraW5nLgor
ICoKKyAqICBOb3RlczogKDEpIGFscGhhLCBpMzg2LCBhbmQgaWE2NCBoYWQgaWRlbnRpY2FsIGlt
cGxlbWVudGF0aW9ucworICogIG9mIHBtYXBfY29sbGVjdCgpIGluIHRlcm1zIG9mIG1hY2hpbmUt
aW5kZXBlbmRlbnQgaW50ZXJmYWNlczsKKyAqICAoMikgc3BhcmM2NCBkb2Vzbid0IHJlcXVpcmUg
aXQ7ICgzKSBwb3dlcnBjIGhhZCBpdCBhcyBhIFRPRE8uCisgKgorICogIE1JUFMgaW1wbGVtZW50
YXRpb24gd2FzIGlkZW50aWNhbCB0byBhbHBoYSBbSnVub3MgOC4yXQorICovCisKKy8qCisgKiBJ
ZiBpdCBpcyB0aGUgZmlyc3QgZW50cnkgb24gdGhlIGxpc3QsIGl0IGlzIGFjdHVhbGx5CisgKiBp
biB0aGUgaGVhZGVyIGFuZCB3ZSBtdXN0IGNvcHkgdGhlIGZvbGxvd2luZyBlbnRyeSB1cAorICog
dG8gdGhlIGhlYWRlci4gIE90aGVyd2lzZSB3ZSBtdXN0IHNlYXJjaCB0aGUgbGlzdCBmb3IKKyAq
IHRoZSBlbnRyeS4gIEluIGVpdGhlciBjYXNlIHdlIGZyZWUgdGhlIG5vdyB1bnVzZWQgZW50cnku
CisgKi8KKworc3RhdGljIHB2X2VudHJ5X3QKK3BtYXBfcHZoX3JlbW92ZShzdHJ1Y3QgbWRfcGFn
ZSAqcHZoLCBwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEpCit7CisJcHZfZW50cnlfdCBwdjsK
KworCVBNQVBfTE9DS19BU1NFUlQocG1hcCwgTUFfT1dORUQpOworCW10eF9hc3NlcnQoJnZtX3Bh
Z2VfcXVldWVfbXR4LCBNQV9PV05FRCk7CisJaWYgKHB2aC0+cHZfbGlzdF9jb3VudCA8IHBtYXAt
PnBtX3N0YXRzLnJlc2lkZW50X2NvdW50KSB7CisJCVRBSUxRX0ZPUkVBQ0gocHYsICZwdmgtPnB2
X2xpc3QsIHB2X2xpc3QpIHsKKwkJCWlmIChwbWFwID09IHB2LT5wdl9wbWFwICYmIHZhID09IHB2
LT5wdl92YSkKKwkJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CisJCVRBSUxRX0ZPUkVBQ0gocHYs
ICZwbWFwLT5wbV9wdmxpc3QsIHB2X3BsaXN0KSB7CisJCQlpZiAodmEgPT0gcHYtPnB2X3ZhKQor
CQkJCWJyZWFrOworCQl9CisJfQorCWlmIChwdiAhPSBOVUxMKSB7CisJCVRBSUxRX1JFTU9WRSgm
cHZoLT5wdl9saXN0LCBwdiwgcHZfbGlzdCk7CisJCXB2aC0+cHZfbGlzdF9jb3VudC0tOworCQlU
QUlMUV9SRU1PVkUoJnBtYXAtPnBtX3B2bGlzdCwgcHYsIHB2X3BsaXN0KTsKKwl9CisJcmV0dXJu
IChwdik7Cit9CisKK3N0YXRpYyB2b2lkCitwbWFwX3B2aF9mcmVlKHN0cnVjdCBtZF9wYWdlICpw
dmgsIHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSkKK3sKKwlwdl9lbnRyeV90IHB2OworCisJ
cHYgPSBwbWFwX3B2aF9yZW1vdmUocHZoLCBwbWFwLCB2YSk7CisJS0FTU0VSVChwdiAhPSBOVUxM
LCAoInBtYXBfcHZoX2ZyZWU6IHB2IG5vdCBmb3VuZCwgcGEgJWx4IHZhICVseCIsCisJICAgICAo
dV9sb25nKVZNX1BBR0VfVE9fUEhZUyhtZW1iZXIyc3RydWN0KHZtX3BhZ2UsIG1kLCBwdmgpKSwK
KwkgICAgICh1X2xvbmcpdmEpKTsKKwlmcmVlX3B2X2VudHJ5KHB2KTsKK30KKworc3RhdGljIHZv
aWQKK3BtYXBfcmVtb3ZlX2VudHJ5KHBtYXBfdCBwbWFwLCB2bV9wYWdlX3QgbSwgdm1fb2Zmc2V0
X3QgdmEpCit7CisKKwltdHhfYXNzZXJ0KCZ2bV9wYWdlX3F1ZXVlX210eCwgTUFfT1dORUQpOwor
CXBtYXBfcHZoX2ZyZWUoJm0tPm1kLCBwbWFwLCB2YSk7CisJaWYgKFRBSUxRX0VNUFRZKCZtLT5t
ZC5wdl9saXN0KSkKKwkJdm1fcGFnZV9mbGFnX2NsZWFyKG0sIFBHX1dSSVRFQUJMRSk7Cit9CisK
Ky8qCisgKiBDb25kaXRpb25hbGx5IGNyZWF0ZSBhIHB2IGVudHJ5LgorICovCitzdGF0aWMgYm9v
bGVhbl90CitwbWFwX3RyeV9pbnNlcnRfcHZfZW50cnkocG1hcF90IHBtYXAsIHZtX3BhZ2VfdCBt
cHRlLCB2bV9vZmZzZXRfdCB2YSwKKyAgICB2bV9wYWdlX3QgbSkKK3sKKwlwdl9lbnRyeV90IHB2
OworCisJUE1BUF9MT0NLX0FTU0VSVChwbWFwLCBNQV9PV05FRCk7CisJbXR4X2Fzc2VydCgmdm1f
cGFnZV9xdWV1ZV9tdHgsIE1BX09XTkVEKTsKKwlpZiAocHZfZW50cnlfY291bnQgPCBwdl9lbnRy
eV9oaWdoX3dhdGVyICYmIAorCSAgICAocHYgPSB1bWFfemFsbG9jKHB2em9uZSwgTV9OT1dBSVQp
KSAhPSBOVUxMKSB7CisJCXB2X2VudHJ5X2NvdW50Kys7CisJCXB2LT5wdl92YSA9IHZhOworCQlw
di0+cHZfcG1hcCA9IHBtYXA7CisJCXB2LT5wdl9wdGVtID0gbXB0ZTsKKwkJcHYtPnB2X3dpcmVk
ID0gRkFMU0U7CisJCVRBSUxRX0lOU0VSVF9UQUlMKCZwbWFwLT5wbV9wdmxpc3QsIHB2LCBwdl9w
bGlzdCk7CisJCVRBSUxRX0lOU0VSVF9UQUlMKCZtLT5tZC5wdl9saXN0LCBwdiwgcHZfbGlzdCk7
CisJCW0tPm1kLnB2X2xpc3RfY291bnQrKzsKKwkJcmV0dXJuIChUUlVFKTsKKwl9IGVsc2UKKwkJ
cmV0dXJuIChGQUxTRSk7Cit9CisKKy8qCisgKiBwbWFwX3JlbW92ZV9wdGU6IGRvIHRoZSB0aGlu
Z3MgdG8gdW5tYXAgYSBwYWdlIGluIGEgcHJvY2VzcworICovCitzdGF0aWMgaW50CitwbWFwX3Jl
bW92ZV9wdGUoc3RydWN0IHBtYXAgKnBtYXAsIHB0X2VudHJ5X3QgKnB0cSwgdm1fb2Zmc2V0X3Qg
dmEpCit7CisJcHRfZW50cnlfdCBvbGRwdGU7CisJdm1fcGFnZV90IG07CisJdm1fb2Zmc2V0X3Qg
cGE7CisKKwltdHhfYXNzZXJ0KCZ2bV9wYWdlX3F1ZXVlX210eCwgTUFfT1dORUQpOworCVBNQVBf
TE9DS19BU1NFUlQocG1hcCwgTUFfT1dORUQpOworCisJb2xkcHRlID0gbG9hZGFuZGNsZWFyKCh1
X2ludCAqKXB0cSk7CisJaWYgKGlzX2tlcm5lbF9wbWFwKHBtYXApKQorCQkqcHRxID0gUFRFX0c7
CisKKwlpZiAocHRlX3Rlc3QoJm9sZHB0ZSwgUFRFX1cpKQorCQlwbWFwLT5wbV9zdGF0cy53aXJl
ZF9jb3VudCAtPSAxOworCisJcG1hcC0+cG1fc3RhdHMucmVzaWRlbnRfY291bnQgLT0gMTsKKwlw
YSA9IFRMQkxPX1BURV9UT19QQShvbGRwdGUpOworCisJaWYgKHBhZ2VfaXNfbWFuYWdlZChwYSkp
IHsKKwkJbSA9IFBIWVNfVE9fVk1fUEFHRShwYSk7CisJCWlmIChwdGVfdGVzdCgmb2xkcHRlLCBQ
VEVfRCkpIHsKKyNpZiBkZWZpbmVkKFBNQVBfRElBR05PU1RJQykKKwkJCWlmIChwbWFwX253X21v
ZGlmaWVkKG9sZHB0ZSkpIHsKKwkJCQlwcmludGYoCisJCQkJICAgICJwbWFwX3JlbW92ZTogbW9k
aWZpZWQgcGFnZSBub3Qgd3JpdGFibGU6IHZhOiAweCV4LCBwdGU6IDB4JXhcbiIsCisJCQkJICAg
IHZhLCBvbGRwdGUpOworCQkJfQorI2VuZGlmCisJCQl2bV9wYWdlX2RpcnR5KG0pOworCQl9CisJ
CWlmIChtLT5tZC5wdl9mbGFncyAmIFBWX1RBQkxFX1JFRikKKwkJCXZtX3BhZ2VfZmxhZ19zZXQo
bSwgUEdfUkVGRVJFTkNFRCk7CisJCW0tPm1kLnB2X2ZsYWdzICY9IH4oUFZfVEFCTEVfUkVGIHwg
UFZfVEFCTEVfTU9EKTsKKworCQlwbWFwX3JlbW92ZV9lbnRyeShwbWFwLCBtLCB2YSk7CisJfQor
CXJldHVybiBwbWFwX3VudXNlX3B0KHBtYXAsIHZhLCBOVUxMKTsKK30KKworLyoKKyAqIFJlbW92
ZSBhIHNpbmdsZSBwYWdlIGZyb20gYSBwcm9jZXNzIGFkZHJlc3Mgc3BhY2UKKyAqLworc3RhdGlj
IHZvaWQKK3BtYXBfcmVtb3ZlX3BhZ2Uoc3RydWN0IHBtYXAgKnBtYXAsIHZtX29mZnNldF90IHZh
KQoreworCXB0X2VudHJ5X3QgKnB0cTsKKworCW10eF9hc3NlcnQoJnZtX3BhZ2VfcXVldWVfbXR4
LCBNQV9PV05FRCk7CisJUE1BUF9MT0NLX0FTU0VSVChwbWFwLCBNQV9PV05FRCk7CisJcHRxID0g
cG1hcF9wdGUocG1hcCwgdmEpOworCisJLyoKKwkgKiBpZiB0aGVyZSBpcyBubyBwdGUgZm9yIHRo
aXMgYWRkcmVzcywganVzdCBza2lwIGl0ISEhCisJICovCisJaWYgKCFwdHEgfHwgIXB0ZV90ZXN0
KHB0cSwgUFRFX1YpKSB7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIFdyaXRlIGJhY2sgYWxs
IGNhY2hlcyBmcm9tIHRoZSBwYWdlIGJlaW5nIGRlc3Ryb3llZAorCSAqLworCW1pcHNfZGNhY2hl
X3diaW52X3JhbmdlX2luZGV4KHZhLCBQQUdFX1NJWkUpOworCisJLyoKKwkgKiBnZXQgYSBsb2Nh
bCB2YSBmb3IgbWFwcGluZ3MgZm9yIHRoaXMgcG1hcC4KKwkgKi8KKwkodm9pZClwbWFwX3JlbW92
ZV9wdGUocG1hcCwgcHRxLCB2YSk7CisJcG1hcF9pbnZhbGlkYXRlX3BhZ2UocG1hcCwgdmEpOwor
CisJcmV0dXJuOworfQorCisvKgorICoJUmVtb3ZlIHRoZSBnaXZlbiByYW5nZSBvZiBhZGRyZXNz
ZXMgZnJvbSB0aGUgc3BlY2lmaWVkIG1hcC4KKyAqCisgKglJdCBpcyBhc3N1bWVkIHRoYXQgdGhl
IHN0YXJ0IGFuZCBlbmQgYXJlIHByb3Blcmx5CisgKglyb3VuZGVkIHRvIHRoZSBwYWdlIHNpemUu
CisgKi8KK3ZvaWQKK3BtYXBfcmVtb3ZlKHN0cnVjdCBwbWFwICpwbWFwLCB2bV9vZmZzZXRfdCBz
dmEsIHZtX29mZnNldF90IGV2YSkKK3sKKwl2bV9vZmZzZXRfdCB2YV9uZXh0OworCXBkX2VudHJ5
X3QgKnBkcGUsICpwZGU7CisJcHRfZW50cnlfdCAqcHRlOworCisJaWYgKHBtYXAgPT0gTlVMTCkK
KwkJcmV0dXJuOworCisJaWYgKHBtYXAtPnBtX3N0YXRzLnJlc2lkZW50X2NvdW50ID09IDApCisJ
CXJldHVybjsKKworCXZtX3BhZ2VfbG9ja19xdWV1ZXMoKTsKKwlQTUFQX0xPQ0socG1hcCk7CisK
KwkvKgorCSAqIHNwZWNpYWwgaGFuZGxpbmcgb2YgcmVtb3Zpbmcgb25lIHBhZ2UuICBhIHZlcnkg
Y29tbW9uIG9wZXJhdGlvbgorCSAqIGFuZCBlYXN5IHRvIHNob3J0IGNpcmN1aXQgc29tZSBjb2Rl
LgorCSAqLworCWlmICgoc3ZhICsgUEFHRV9TSVpFKSA9PSBldmEpIHsKKwkJcG1hcF9yZW1vdmVf
cGFnZShwbWFwLCBzdmEpOworCQlnb3RvIG91dDsKKwl9CisJZm9yICg7IHN2YSA8IGV2YTsgc3Zh
ID0gdmFfbmV4dCkgeworCQlwZHBlID0gcG1hcF9zZWdtYXAocG1hcCwgc3ZhKTsKKwkJaWYgKCpw
ZHBlID09IDApIHsKKwkJCXZhX25leHQgPSAoc3ZhICsgTkJTRUcpICYgflNFR01BU0s7CisJCQlp
ZiAodmFfbmV4dCA8IHN2YSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbmV4
dCA9IGV2YTsKKwkJCWNvbnRpbnVlOworCQl9CisgCisJCXZhX25leHQgPSAoc3ZhICsgTkJQRFIp
ICYgflBEUk1BU0s7CisJCWlmICh2YV9uZXh0IDwgc3ZhKQorCQkJdmFfbmV4dCA9IGV2YTsKKwor
CQlwZGUgPSBwbWFwX3BkcGVfdG9fcGRlKHBkcGUsIHN2YSk7CisJCWlmICgqcGRlID09IDApCisJ
CQljb250aW51ZTsKKwkJcHRlID0gcG1hcF9wZGVfdG9fcHRlKHBkZSwgc3ZhKTsKKworCQlmb3Ig
KDsgc3ZhICE9IHZhX25leHQ7IHB0ZSsrLCBzdmEgKz0gUEFHRV9TSVpFKSB7CisJCSAgICAgICBp
ZiAoKnB0ZSA9PSAwKQorCQkJICAgICAgIGNvbnRpbnVlOworCQkgICAgICAgcG1hcF9yZW1vdmVf
cGFnZShwbWFwLCBzdmEpOworCQl9CisKKyAgICAgICAgfQorb3V0OgorCXZtX3BhZ2VfdW5sb2Nr
X3F1ZXVlcygpOworCVBNQVBfVU5MT0NLKHBtYXApOworfQorCisvKgorICoJUm91dGluZToJcG1h
cF9yZW1vdmVfYWxsCisgKglGdW5jdGlvbjoKKyAqCQlSZW1vdmVzIHRoaXMgcGh5c2ljYWwgcGFn
ZSBmcm9tCisgKgkJYWxsIHBoeXNpY2FsIG1hcHMgaW4gd2hpY2ggaXQgcmVzaWRlcy4KKyAqCQlS
ZWZsZWN0cyBiYWNrIG1vZGlmeSBiaXRzIHRvIHRoZSBwYWdlci4KKyAqCisgKglOb3RlczoKKyAq
CQlPcmlnaW5hbCB2ZXJzaW9ucyBvZiB0aGlzIHJvdXRpbmUgd2VyZSB2ZXJ5CisgKgkJaW5lZmZp
Y2llbnQgYmVjYXVzZSB0aGV5IGl0ZXJhdGl2ZWx5IGNhbGxlZAorICoJCXBtYXBfcmVtb3ZlIChz
bG93Li4uKQorICovCisKK3ZvaWQKK3BtYXBfcmVtb3ZlX2FsbCh2bV9wYWdlX3QgbSkKK3sKKwlw
dl9lbnRyeV90IHB2OworCXB0X2VudHJ5X3QgKnB0ZSwgdHB0ZTsKKworCUtBU1NFUlQoKG0tPmZs
YWdzICYgUEdfRklDVElUSU9VUykgPT0gMCwKKwkgICAgKCJwbWFwX3JlbW92ZV9hbGw6IHBhZ2Ug
JXAgaXMgZmljdGl0aW91cyIsIG0pKTsKKwl2bV9wYWdlX2xvY2tfcXVldWVzKCk7CisKKwlpZiAo
bS0+bWQucHZfZmxhZ3MgJiBQVl9UQUJMRV9SRUYpCisJCXZtX3BhZ2VfZmxhZ19zZXQobSwgUEdf
UkVGRVJFTkNFRCk7CisKKwl3aGlsZSAoKHB2ID0gVEFJTFFfRklSU1QoJm0tPm1kLnB2X2xpc3Qp
KSAhPSBOVUxMKSB7CisJCVBNQVBfTE9DSyhwdi0+cHZfcG1hcCk7CisKKwkJLyoKKwkJICogSWYg
aXQncyBsYXN0IG1hcHBpbmcgd3JpdGViYWNrIGFsbCBjYWNoZXMgZnJvbSAKKwkJICogdGhlIHBh
Z2UgYmVpbmcgZGVzdHJveWVkCisJIAkgKi8KKwkJaWYgKG0tPm1kLnB2X2xpc3RfY291bnQgPT0g
MSkgCisJCQltaXBzX2RjYWNoZV93Ymludl9yYW5nZV9pbmRleChwdi0+cHZfdmEsIFBBR0VfU0la
RSk7CisKKwkJcHYtPnB2X3BtYXAtPnBtX3N0YXRzLnJlc2lkZW50X2NvdW50LS07CisKKwkJcHRl
ID0gcG1hcF9wdGUocHYtPnB2X3BtYXAsIHB2LT5wdl92YSk7CisKKwkJdHB0ZSA9IGxvYWRhbmRj
bGVhcigodV9pbnQgKilwdGUpOworCQlpZiAoaXNfa2VybmVsX3BtYXAocHYtPnB2X3BtYXApKQor
CQkJKnB0ZSA9IFBURV9HOworCisJCWlmIChwdGVfdGVzdCgmdHB0ZSwgUFRFX1cpKQorCQkJcHYt
PnB2X3BtYXAtPnBtX3N0YXRzLndpcmVkX2NvdW50LS07CisKKwkJLyoKKwkJICogVXBkYXRlIHRo
ZSB2bV9wYWdlX3QgY2xlYW4gYW5kIHJlZmVyZW5jZSBiaXRzLgorCQkgKi8KKwkJaWYgKHB0ZV90
ZXN0KCZ0cHRlLCBQVEVfRCkpIHsKKyNpZiBkZWZpbmVkKFBNQVBfRElBR05PU1RJQykKKwkJCWlm
IChwbWFwX253X21vZGlmaWVkKHRwdGUpKSB7CisJCQkJcHJpbnRmKAorCQkJCSAgICAicG1hcF9y
ZW1vdmVfYWxsOiBtb2RpZmllZCBwYWdlIG5vdCB3cml0YWJsZTogdmE6IDB4JXgsIHB0ZTogMHgl
eFxuIiwKKwkJCQkgICAgcHYtPnB2X3ZhLCB0cHRlKTsKKwkJCX0KKyNlbmRpZgorCQkJdm1fcGFn
ZV9kaXJ0eShtKTsKKwkJfQorCQlwbWFwX2ludmFsaWRhdGVfcGFnZShwdi0+cHZfcG1hcCwgcHYt
PnB2X3ZhKTsKKworCQlUQUlMUV9SRU1PVkUoJnB2LT5wdl9wbWFwLT5wbV9wdmxpc3QsIHB2LCBw
dl9wbGlzdCk7CisJCVRBSUxRX1JFTU9WRSgmbS0+bWQucHZfbGlzdCwgcHYsIHB2X2xpc3QpOwor
CQltLT5tZC5wdl9saXN0X2NvdW50LS07CisJCXBtYXBfdW51c2VfcHQocHYtPnB2X3BtYXAsIHB2
LT5wdl92YSwgcHYtPnB2X3B0ZW0pOworCQlQTUFQX1VOTE9DSyhwdi0+cHZfcG1hcCk7CisJCWZy
ZWVfcHZfZW50cnkocHYpOworCX0KKworCXZtX3BhZ2VfZmxhZ19jbGVhcihtLCBQR19XUklURUFC
TEUpOworCW0tPm1kLnB2X2ZsYWdzICY9IH4oUFZfVEFCTEVfUkVGIHwgUFZfVEFCTEVfTU9EKTsK
Kwl2bV9wYWdlX3VubG9ja19xdWV1ZXMoKTsKK30KKworLyoKKyAqCVNldCB0aGUgcGh5c2ljYWwg
cHJvdGVjdGlvbiBvbiB0aGUKKyAqCXNwZWNpZmllZCByYW5nZSBvZiB0aGlzIG1hcCBhcyByZXF1
ZXN0ZWQuCisgKi8KK3ZvaWQKK3BtYXBfcHJvdGVjdChwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3Qg
c3ZhLCB2bV9vZmZzZXRfdCBldmEsIHZtX3Byb3RfdCBwcm90KQoreworCXB0X2VudHJ5X3QgKnB0
ZTsKKwlwZF9lbnRyeV90ICpwZHBlLCAqcGRlOworCXZtX29mZnNldF90IHZhX25leHQ7CisKKwlp
ZiAocG1hcCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpZiAoKHByb3QgJiBWTV9QUk9UX1JFQUQp
ID09IFZNX1BST1RfTk9ORSkgeworCQlwbWFwX3JlbW92ZShwbWFwLCBzdmEsIGV2YSk7CisJCXJl
dHVybjsKKwl9CisJaWYgKDApIHByaW50ZigiUE1BUCBwcm90ICVwIC0gJXAgJWRcbiIsICh2b2lk
ICopc3ZhLCAodm9pZCAqKWV2YSwgKGludClwcm90KTsKKwlpZiAocHJvdCAmIFZNX1BST1RfV1JJ
VEUpCisJCXJldHVybjsKKworCXZtX3BhZ2VfbG9ja19xdWV1ZXMoKTsKKwlQTUFQX0xPQ0socG1h
cCk7CisJZm9yICg7IHN2YSA8IGV2YTsgc3ZhID0gdmFfbmV4dCkgeworCQlwZHBlID0gcG1hcF9z
ZWdtYXAocG1hcCwgc3ZhKTsKKwkJaWYgKCpwZHBlID09IDApIHsKKwkJCXZhX25leHQgPSAoc3Zh
ICsgTkJTRUcpICYgflNFR01BU0s7CisJCQlpZiAodmFfbmV4dCA8IHN2YSkKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgdmFfbmV4dCA9IGV2YTsKKwkJCWNvbnRpbnVlOworCQl9CisK
KwkJdmFfbmV4dCA9IChzdmEgKyBOQlBEUikgJiB+UERSTUFTSzsKKyAgICAgICAgICAgICAgICBp
ZiAodmFfbmV4dCA8IHN2YSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhX25leHQgPSBldmE7
CisKKyAgICAgICAgICAgICAgICBwZGUgPSBwbWFwX3BkcGVfdG9fcGRlKHBkcGUsIHN2YSk7CisJ
CS8qCisgICAgICAgICAgICAgICAgICogV2VlZCBvdXQgaW52YWxpZCBtYXBwaW5ncy4KKwkJICov
CisgICAgICAgICAgICAgICAgaWYgKCpwZGUgPT0gMCkKKwkJCWNvbnRpbnVlOworCisgICAgICAg
ICAgICAgICAgaWYgKHZhX25leHQgPiBldmEpCisgICAgICAgICAgICAgICAgICAgICAgICB2YV9u
ZXh0ID0gZXZhOworCisgICAgICAgICAgICAgICAgZm9yIChwdGUgPSBwbWFwX3BkZV90b19wdGUo
cGRlLCBzdmEpOyBzdmEgIT0gdmFfbmV4dDsgcHRlKyssCisJCQkgICAgIHN2YSArPSBQQUdFX1NJ
WkUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0X2VudHJ5X3Qgb2JpdHMsIHBiaXRzOwor
ICAgICAgICAgICAgICAgICAgICAgICAgdm1fcGFnZV90IG07CisJCQl2bV9wYWRkcl90IHBhOwor
CityZXRyeToKKwkJCWlmICghcHRlX3Rlc3QocHRlLCBQVEVfVikpCisJCQkJY29udGludWU7CisK
KwkJCW9iaXRzID0gcGJpdHMgPSAqcHRlOworCQkJcGEgPSBUTEJMT19QVEVfVE9fUEEocGJpdHMp
OworCisJCQlpZiAocGFnZV9pc19tYW5hZ2VkKHBhKSAmJiBwdGVfdGVzdCgmcGJpdHMsIFBURV9E
KSkgeworCQkJCW0gPSBQSFlTX1RPX1ZNX1BBR0UocGEpOworCQkJCXZtX3BhZ2VfZGlydHkobSk7
CisJCQkJbS0+bWQucHZfZmxhZ3MgJj0gflBWX1RBQkxFX01PRDsKKwkJCX0KKwkJCXB0ZV9jbGVh
cigmcGJpdHMsIFBURV9EKTsKKwkJCXB0ZV9zZXQoJnBiaXRzLCBQVEVfUk8pOworCisJCQlpZiAo
cGJpdHMgIT0gKnB0ZSkgeworCQkJCWlmICghYXRvbWljX2NtcHNldF9pbnQoKHVfaW50ICopcHRl
LCBvYml0cywgcGJpdHMpKQorCQkJCQlnb3RvIHJldHJ5OworCQkJCXBtYXBfdXBkYXRlX3BhZ2Uo
cG1hcCwgc3ZhLCBwYml0cyk7CisJCQl9CisJCX0KKwl9CisJdm1fcGFnZV91bmxvY2tfcXVldWVz
KCk7CisJUE1BUF9VTkxPQ0socG1hcCk7Cit9CisKKy8qCisgKglJbnNlcnQgdGhlIGdpdmVuIHBo
eXNpY2FsIHBhZ2UgKHApIGF0CisgKgl0aGUgc3BlY2lmaWVkIHZpcnR1YWwgYWRkcmVzcyAodikg
aW4gdGhlCisgKgl0YXJnZXQgcGh5c2ljYWwgbWFwIHdpdGggdGhlIHByb3RlY3Rpb24gcmVxdWVz
dGVkLgorICoKKyAqCUlmIHNwZWNpZmllZCwgdGhlIHBhZ2Ugd2lsbCBiZSB3aXJlZCBkb3duLCBt
ZWFuaW5nCisgKgl0aGF0IHRoZSByZWxhdGVkIHB0ZSBjYW4gbm90IGJlIHJlY2xhaW1lZC4KKyAq
CisgKglOQjogIFRoaXMgaXMgdGhlIG9ubHkgcm91dGluZSB3aGljaCBNQVkgTk9UIGxhenktZXZh
bHVhdGUKKyAqCW9yIGxvc2UgaW5mb3JtYXRpb24uICBUaGF0IGlzLCB0aGlzIHJvdXRpbmUgbXVz
dCBhY3R1YWxseQorICoJaW5zZXJ0IHRoaXMgcGFnZSBpbnRvIHRoZSBnaXZlbiBtYXAgTk9XLgor
ICovCit2b2lkCitwbWFwX2VudGVyKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgdm1fcHJv
dF90IGFjY2Vzcywgdm1fcGFnZV90IG0sCisgICAgdm1fcHJvdF90IHByb3QsIGJvb2xlYW5fdCB3
aXJlZCkKK3sKKwl2bV9vZmZzZXRfdCBwYSwgb3BhOworCXB0X2VudHJ5X3QgKnB0ZTsKKwlwdF9l
bnRyeV90IG9yaWdwdGUsIG5ld3B0ZTsKKwlwdl9lbnRyeV90IHB2OworCXZtX3BhZ2VfdCBtcHRl
LCBvbTsKKwlpbnQgcncgPSAwOworCWludCBkZWJ1ZyA9IDA7IC8qdmEgPCBWTV9NQVhVU0VSX0FE
RFJFU1M7Ki8KKwlpbnQgcGlkID0gY3VydGhyZWFkLT50ZF9wcm9jLT5wX3BpZDsKKworCWlmIChw
bWFwID09IE5VTEwpIHsKKwkJcHJpbnRmKCJOdWxsIHBtcFxuIik7CisJCXJldHVybjsKKwl9CisJ
aWYgKGRlYnVnKQorCQlwcmludGYoIlslZF1WQSAlbHggcGFnZSAlcFxuIiwgcGlkLCAodV9sb25n
KXZhLCBtKTsKKworCXZhICY9IH5QQUdFX01BU0s7CisgCUtBU1NFUlQodmEgPD0gVk1fTUFYX0tF
Uk5FTF9BRERSRVNTLCAoInBtYXBfZW50ZXI6IHRvb2JpZyIpKTsKKwlLQVNTRVJUKChtLT5mbGFn
cyAmIChQR19GSUNUSVRJT1VTIHwgUEdfVU5NQU5BR0VEKSkgIT0gMCB8fAorCSAgICAobS0+b2Zs
YWdzICYgVlBPX0JVU1kpICE9IDAsCisJICAgICgicG1hcF9lbnRlcjogcGFnZSAlcCBpcyBub3Qg
YnVzeSIsIG0pKTsKKworCW1wdGUgPSBOVUxMOworCisJdm1fcGFnZV9sb2NrX3F1ZXVlcygpOwor
CVBNQVBfTE9DSyhwbWFwKTsKKworCS8qCisJICogSW4gdGhlIGNhc2UgdGhhdCBhIHBhZ2UgdGFi
bGUgcGFnZSBpcyBub3QgcmVzaWRlbnQsIHdlIGFyZQorCSAqIGNyZWF0aW5nIGl0IGhlcmUuCisJ
ICovCisJaWYgKHZhIDwgVk1fTUFYVVNFUl9BRERSRVNTKSB7CisJCW1wdGUgPSBwbWFwX2FsbG9j
cHRlKHBtYXAsIHZhLCBNX1dBSVRPSyk7CisJfQorCXB0ZSA9IHBtYXBfcHRlKHBtYXAsIHZhKTsK
KworCS8qCisJICogUGFnZSBEaXJlY3RvcnkgdGFibGUgZW50cnkgbm90IHZhbGlkLCB3ZSBuZWVk
IGEgbmV3IFBUIHBhZ2UKKwkgKi8KKwlpZiAocHRlID09IE5VTEwpIHsKKwkJcGFuaWMoInBtYXBf
ZW50ZXI6IGludmFsaWQgcGFnZSBkaXJlY3RvcnksIHBkaXI9JXAsIHZhPSVwXG4iLAorCQkgICAg
KHZvaWQgKilwbWFwLT5wbV9zZWd0YWIsICh2b2lkICopdmEpOworCX0KKwlwYSA9IFZNX1BBR0Vf
VE9fUEhZUyhtKTsKKwlvbSA9IE5VTEw7CisJb3JpZ3B0ZSA9ICpwdGU7CisJb3BhID0gVExCTE9f
UFRFX1RPX1BBKG9yaWdwdGUpOworCisJLyoKKwkgKiBNYXBwaW5nIGhhcyBub3QgY2hhbmdlZCwg
bXVzdCBiZSBwcm90ZWN0aW9uIG9yIHdpcmluZyBjaGFuZ2UuCisJICovCisJaWYgKHB0ZV90ZXN0
KCZvcmlncHRlLCBQVEVfVikgJiYgb3BhID09IHBhKSB7CisJCS8qCisJCSAqIFdpcmluZyBjaGFu
Z2UsIGp1c3QgdXBkYXRlIHN0YXRzLiBXZSBkb24ndCB3b3JyeSBhYm91dAorCQkgKiB3aXJpbmcg
UFQgcGFnZXMgYXMgdGhleSByZW1haW4gcmVzaWRlbnQgYXMgbG9uZyBhcyB0aGVyZQorCQkgKiBh
cmUgdmFsaWQgbWFwcGluZ3MgaW4gdGhlbS4gSGVuY2UsIGlmIGEgdXNlciBwYWdlIGlzCisJCSAq
IHdpcmVkLCB0aGUgUFQgcGFnZSB3aWxsIGJlIGFsc28uCisJCSAqLworCQlpZiAod2lyZWQgJiYg
IXB0ZV90ZXN0KCZvcmlncHRlLCBQVEVfVykpCisJCQlwbWFwLT5wbV9zdGF0cy53aXJlZF9jb3Vu
dCsrOworCQllbHNlIGlmICghd2lyZWQgJiYgcHRlX3Rlc3QoJm9yaWdwdGUsIFBURV9XKSkKKwkJ
CXBtYXAtPnBtX3N0YXRzLndpcmVkX2NvdW50LS07CisKKyNpZiBkZWZpbmVkKFBNQVBfRElBR05P
U1RJQykKKwkJaWYgKHBtYXBfbndfbW9kaWZpZWQob3JpZ3B0ZSkpIHsKKwkJCXByaW50ZigKKwkJ
CSAgICAicG1hcF9lbnRlcjogbW9kaWZpZWQgcGFnZSBub3Qgd3JpdGFibGU6IHZhOiAweCV4LCBw
dGU6IDB4JXhcbiIsCisJCQkgICAgdmEsIG9yaWdwdGUpOworCQl9CisjZW5kaWYKKwkJLyoKKwkJ
ICogUmVtb3ZlIGV4dHJhIHB0ZSByZWZlcmVuY2UKKwkJICovCisJCWlmIChtcHRlKQorCQkJbXB0
ZS0+d2lyZV9jb3VudC0tOworCisJCWlmIChwYWdlX2lzX21hbmFnZWQob3BhKSkgeworCQkJb20g
PSBtOworCQl9CisJCWdvdG8gdmFsaWRhdGU7CisJfQorCisJcHYgPSBOVUxMOworCisJLyoKKwkg
KiBNYXBwaW5nIGhhcyBjaGFuZ2VkLCBpbnZhbGlkYXRlIG9sZCByYW5nZSBhbmQgZmFsbCB0aHJv
dWdoIHRvCisJICogaGFuZGxlIHZhbGlkYXRpbmcgbmV3IG1hcHBpbmcuCisJICovCisJaWYgKG9w
YSkgeworCQlpZiAocHRlX3Rlc3QoJm9yaWdwdGUsIFBURV9XKSkKKwkJCXBtYXAtPnBtX3N0YXRz
LndpcmVkX2NvdW50LS07CisKKwkJaWYgKHBhZ2VfaXNfbWFuYWdlZChvcGEpKSB7CisJCQlvbSA9
IFBIWVNfVE9fVk1fUEFHRShvcGEpOworCQkJcHYgPSBwbWFwX3B2aF9yZW1vdmUoJm9tLT5tZCwg
cG1hcCwgdmEpOworCQl9CisJCWlmIChtcHRlICE9IE5VTEwpIHsKKwkJCW1wdGUtPndpcmVfY291
bnQtLTsKKwkJCUtBU1NFUlQobXB0ZS0+d2lyZV9jb3VudCA+IDAsCisJCQkgICAgKCJwbWFwX2Vu
dGVyOiBtaXNzaW5nIHJlZmVyZW5jZSB0byBwYWdlIHRhYmxlIHBhZ2UsIgorCQkJICAgICIgdmE6
ICVwIiwgKHZvaWQgKil2YSkpOworCQl9CisJfSBlbHNlCisJCXBtYXAtPnBtX3N0YXRzLnJlc2lk
ZW50X2NvdW50Kys7CisKKwkvKgorCSAqIEVudGVyIG9uIHRoZSBQViBsaXN0IGlmIHBhcnQgb2Yg
b3VyIG1hbmFnZWQgbWVtb3J5LiBOb3RlIHRoYXQgd2UKKwkgKiByYWlzZSBJUEwgd2hpbGUgbWFu
aXB1bGF0aW5nIHB2X3RhYmxlIHNpbmNlIHBtYXBfZW50ZXIgY2FuIGJlCisJICogY2FsbGVkIGF0
IGludGVycnVwdCB0aW1lLgorCSAqLworCWlmICgobS0+ZmxhZ3MgJiAoUEdfRklDVElUSU9VUyB8
IFBHX1VOTUFOQUdFRCkpID09IDApIHsKKwkJS0FTU0VSVCh2YSA8IGttaS5jbGVhbl9zdmEgfHwg
dmEgPj0ga21pLmNsZWFuX2V2YSwKKwkJICAgICgicG1hcF9lbnRlcjogbWFuYWdlZCBtYXBwaW5n
IHdpdGhpbiB0aGUgY2xlYW4gc3VibWFwIikpOworCQlpZiAocHYgPT0gTlVMTCkKKwkJCXB2ID0g
Z2V0X3B2X2VudHJ5KHBtYXApOworCQlwdi0+cHZfdmEgPSB2YTsKKwkJcHYtPnB2X3BtYXAgPSBw
bWFwOworCQlwdi0+cHZfcHRlbSA9IG1wdGU7CisJCXB2LT5wdl93aXJlZCA9IHdpcmVkOworCQlU
QUlMUV9JTlNFUlRfVEFJTCgmcG1hcC0+cG1fcHZsaXN0LCBwdiwgcHZfcGxpc3QpOworCQlUQUlM
UV9JTlNFUlRfVEFJTCgmbS0+bWQucHZfbGlzdCwgcHYsIHB2X2xpc3QpOworCQltLT5tZC5wdl9s
aXN0X2NvdW50Kys7CisJfSBlbHNlIGlmIChwdiAhPSBOVUxMKQorCQlmcmVlX3B2X2VudHJ5KHB2
KTsKKworCS8qCisJICogSW5jcmVtZW50IGNvdW50ZXJzCisJICovCisJaWYgKHdpcmVkKQorCQlw
bWFwLT5wbV9zdGF0cy53aXJlZF9jb3VudCsrOworCit2YWxpZGF0ZToKKwlpZiAoKGFjY2VzcyAm
IFZNX1BST1RfV1JJVEUpICE9IDApCisJCW0tPm1kLnB2X2ZsYWdzIHw9IFBWX1RBQkxFX01PRCB8
IFBWX1RBQkxFX1JFRjsKKwlydyA9IGluaXRfcHRlX3Byb3QodmEsIG0sIHByb3QpOworCisjaWZk
ZWYgUE1BUF9ERUJVRworCXByaW50ZigiWyVkXSBwbWFwX2VudGVyOiAgdmE6ICVwIC0+IHBhOiAl
cFxuIiwgcGlkLCAodm9pZCAqKXZhLCAodm9pZCAqKXBhKTsKKyNlbmRpZgorCS8qCisJICogTm93
IHZhbGlkYXRlIG1hcHBpbmcgd2l0aCBkZXNpcmVkIHByb3RlY3Rpb24vd2lyaW5nLgorCSAqLwor
CW5ld3B0ZSA9IFRMQkxPX1BBX1RPX1BGTihwYSkgfCBydyB8IFBURV9WOworCisJaWYgKGlzX2Nh
Y2hlYWJsZV9tZW0ocGEpKQorCQluZXdwdGUgfD0gUFRFX0NfQ0FDSEU7CisJZWxzZQorCQluZXdw
dGUgfD0gUFRFX0NfVU5DQUNIRUQ7CisKKwlpZiAod2lyZWQpCisJCW5ld3B0ZSB8PSBQVEVfVzsK
KworCWlmIChpc19rZXJuZWxfcG1hcChwbWFwKSkKKwkgICAgICAgICBuZXdwdGUgfD0gUFRFX0c7
CisKKwkvKgorCSAqIGlmIHRoZSBtYXBwaW5nIG9yIHBlcm1pc3Npb24gYml0cyBhcmUgZGlmZmVy
ZW50LCB3ZSBuZWVkIHRvCisJICogdXBkYXRlIHRoZSBwdGUuCisJICovCisJaWYgKG9yaWdwdGUg
IT0gbmV3cHRlKSB7CisJCWlmIChwdGVfdGVzdCgmb3JpZ3B0ZSwgUFRFX1YpKSB7CisJCQkqcHRl
ID0gbmV3cHRlOworCQkJaWYgKHBhZ2VfaXNfbWFuYWdlZChvcGEpICYmIChvcGEgIT0gcGEpKSB7
CisJCQkJaWYgKG9tLT5tZC5wdl9mbGFncyAmIFBWX1RBQkxFX1JFRikKKwkJCQkJdm1fcGFnZV9m
bGFnX3NldChvbSwgUEdfUkVGRVJFTkNFRCk7CisJCQkJb20tPm1kLnB2X2ZsYWdzICY9CisJCQkJ
ICAgIH4oUFZfVEFCTEVfUkVGIHwgUFZfVEFCTEVfTU9EKTsKKwkJCX0KKwkJCWlmIChwdGVfdGVz
dCgmb3JpZ3B0ZSwgUFRFX0QpKSB7CisJCQkJS0FTU0VSVCghcHRlX3Rlc3QoJm9yaWdwdGUsIFBU
RV9STyksCisJCQkJICAgICgicG1hcF9lbnRlcjogbW9kaWZpZWQgcGFnZSBub3Qgd3JpdGFibGU6
IgorCQkJCSAgICAiIHZhOiAlcCwgcHRlOiAweCV4IiwgKHZvaWQgKil2YSwgb3JpZ3B0ZSkpOwor
CQkJCWlmIChwYWdlX2lzX21hbmFnZWQob3BhKSkKKwkJCQkJdm1fcGFnZV9kaXJ0eShvbSk7CisJ
CQl9CisJCQlpZiAocGFnZV9pc19tYW5hZ2VkKG9wYSkgJiYKKwkJCSAgICBUQUlMUV9FTVBUWSgm
b20tPm1kLnB2X2xpc3QpKQorCQkJCXZtX3BhZ2VfZmxhZ19jbGVhcihvbSwgUEdfV1JJVEVBQkxF
KTsKKwkJfSBlbHNlIHsKKwkJCSpwdGUgPSBuZXdwdGU7CisJCX0KKwl9CisJcG1hcF91cGRhdGVf
cGFnZShwbWFwLCB2YSwgbmV3cHRlKTsKKworCS8qCisJICogU3luYyBJICYgRCBjYWNoZXMgZm9y
IGV4ZWN1dGFibGUgcGFnZXMuICBEbyB0aGlzIG9ubHkgaWYgdGhlIHRoZQorCSAqIHRhcmdldCBw
bWFwIGJlbG9uZ3MgdG8gdGhlIGN1cnJlbnQgcHJvY2Vzcy4gIE90aGVyd2lzZSwgYW4KKwkgKiB1
bnJlc29sdmFibGUgVExCIG1pc3MgbWF5IG9jY3VyLgorCSAqLworCWlmICghaXNfa2VybmVsX3Bt
YXAocG1hcCkgJiYgKHBtYXAgPT0gJmN1cnByb2MtPnBfdm1zcGFjZS0+dm1fcG1hcCkgJiYKKwkg
ICAgKHByb3QgJiBWTV9QUk9UX0VYRUNVVEUpKSB7CisJCW1pcHNfaWNhY2hlX3N5bmNfcmFuZ2Uo
dmEsIFBBR0VfU0laRSk7CisJCW1pcHNfZGNhY2hlX3diaW52X3JhbmdlKHZhLCBQQUdFX1NJWkUp
OworCX0KKwl2bV9wYWdlX3VubG9ja19xdWV1ZXMoKTsKKwlQTUFQX1VOTE9DSyhwbWFwKTsKKwlp
ZiAoZGVidWcpIHsKKwkJaW50IGksIGosIGs7CisJCXBkX2VudHJ5X3QgKnAxOworCSAgICAgICAJ
cHRfZW50cnlfdCAqcDI7CisKKwkJaSA9IHBtYXBfc2VnX2luZGV4KHZhKTsKKwkJcDEgPSAocGRf
ZW50cnlfdCAqKXBtYXAtPnBtX3NlZ3RhYltpXTsKKwkJaiA9IHBtYXBfcGRlX2luZGV4KHZhKTsK
KwkJcDIgPSAocHRfZW50cnlfdCAqKXAxW2pdOworCQlrID0gcG1hcF9wdGVfaW5kZXgodmEpOwor
CisJCXByaW50Zigic2VnbWFwWyVkXSA9ICVwLCBwZGVbJWRdID0gJXAgcHRlWyVkXSA9ICV4XG4i
LAorCQkJaSwgcDEsIGosIHAyLCBrICwgcDJba10pOworCQlwcmludGYoInBtYXAgZW50ZXIgLSAl
cCAleCAtPiAleCBkb25lXG4iLCBwdGUsIG9yaWdwdGUsIG5ld3B0ZSk7CisJfQorfQorCisvKgor
ICogdGhpcyBjb2RlIG1ha2VzIHNvbWUgKk1BSk9SKiBhc3N1bXB0aW9uczoKKyAqIDEuIEN1cnJl
bnQgcG1hcCAmIHBtYXAgZXhpc3RzLgorICogMi4gTm90IHdpcmVkLgorICogMy4gUmVhZCBhY2Nl
c3MuCisgKiA0LiBObyBwYWdlIHRhYmxlIHBhZ2VzLgorICogYnV0IGlzICpNVUNIKiBmYXN0ZXIg
dGhhbiBwbWFwX2VudGVyLi4uCisgKi8KKwordm9pZAorcG1hcF9lbnRlcl9xdWljayhwbWFwX3Qg
cG1hcCwgdm1fb2Zmc2V0X3QgdmEsIHZtX3BhZ2VfdCBtLCB2bV9wcm90X3QgcHJvdCkKK3sKKwor
CXZtX3BhZ2VfbG9ja19xdWV1ZXMoKTsKKwlQTUFQX0xPQ0socG1hcCk7CisJKHZvaWQpcG1hcF9l
bnRlcl9xdWlja19sb2NrZWQocG1hcCwgdmEsIG0sIHByb3QsIE5VTEwpOworCXZtX3BhZ2VfdW5s
b2NrX3F1ZXVlcygpOworCVBNQVBfVU5MT0NLKHBtYXApOworfQorCitzdGF0aWMgdm1fcGFnZV90
CitwbWFwX2VudGVyX3F1aWNrX2xvY2tlZChwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEsIHZt
X3BhZ2VfdCBtLAorICAgIHZtX3Byb3RfdCBwcm90LCB2bV9wYWdlX3QgbXB0ZSkKK3sKKwlwdF9l
bnRyeV90ICpwdGU7CisJdm1fb2Zmc2V0X3QgcGE7CisKKwlLQVNTRVJUKHZhIDwga21pLmNsZWFu
X3N2YSB8fCB2YSA+PSBrbWkuY2xlYW5fZXZhIHx8CisJICAgIChtLT5mbGFncyAmIChQR19GSUNU
SVRJT1VTIHwgUEdfVU5NQU5BR0VEKSkgIT0gMCwKKwkgICAgKCJwbWFwX2VudGVyX3F1aWNrX2xv
Y2tlZDogbWFuYWdlZCBtYXBwaW5nIHdpdGhpbiB0aGUgY2xlYW4gc3VibWFwIikpOworCW10eF9h
c3NlcnQoJnZtX3BhZ2VfcXVldWVfbXR4LCBNQV9PV05FRCk7CisJUE1BUF9MT0NLX0FTU0VSVChw
bWFwLCBNQV9PV05FRCk7CisKKwkvKgorCSAqIEluIHRoZSBjYXNlIHRoYXQgYSBwYWdlIHRhYmxl
IHBhZ2UgaXMgbm90IHJlc2lkZW50LCB3ZSBhcmUKKwkgKiBjcmVhdGluZyBpdCBoZXJlLgorCSAq
LworCWlmICh2YSA8IFZNX01BWFVTRVJfQUREUkVTUykgeworCQlwZF9lbnRyeV90ICpwZGU7CisJ
CXVuc2lnbmVkIHB0ZXBpbmRleDsKKworCQkvKgorCQkgKiBDYWxjdWxhdGUgcGFnZXRhYmxlIHBh
Z2UgaW5kZXgKKwkJICovCisJCXB0ZXBpbmRleCA9IHBtYXBfcGRlX3BpbmRleCh2YSk7CisJCWlm
IChtcHRlICYmIChtcHRlLT5waW5kZXggPT0gcHRlcGluZGV4KSkgeworCQkJbXB0ZS0+d2lyZV9j
b3VudCsrOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIEdldCB0aGUgcGFnZSBkaXJlY3Rvcnkg
ZW50cnkKKwkJCSAqLworCQkJcGRlID0gcG1hcF9wZGUocG1hcCwgdmEpOworCisJCQkvKgorCQkJ
ICogSWYgdGhlIHBhZ2UgdGFibGUgcGFnZSBpcyBtYXBwZWQsIHdlIGp1c3QKKwkJCSAqIGluY3Jl
bWVudCB0aGUgaG9sZCBjb3VudCwgYW5kIGFjdGl2YXRlIGl0LgorCQkJICovCisJCQlpZiAocGRl
ICYmICpwZGUgIT0gMCkgeworCQkJCWlmIChwbWFwLT5wbV9wdHBoaW50ICYmCisJCQkJICAgIChw
bWFwLT5wbV9wdHBoaW50LT5waW5kZXggPT0gcHRlcGluZGV4KSkgeworCQkJCQltcHRlID0gcG1h
cC0+cG1fcHRwaGludDsKKwkJCQl9IGVsc2UgeworCQkJCQltcHRlID0gUEhZU19UT19WTV9QQUdF
KAorCQkJCQkJTUlQU19LU0VHMF9UT19QSFlTKCpwZGUpKTsKKwkJCQkJcG1hcC0+cG1fcHRwaGlu
dCA9IG1wdGU7CisJCQkJfQorCQkJCW1wdGUtPndpcmVfY291bnQrKzsKKwkJCX0gZWxzZSB7CisJ
CQkJbXB0ZSA9IF9wbWFwX2FsbG9jcHRlKHBtYXAsIHB0ZXBpbmRleCwKKwkJCQkgICAgTV9OT1dB
SVQpOworCQkJCWlmIChtcHRlID09IE5VTEwpCisJCQkJCXJldHVybiAobXB0ZSk7CisJCQl9CisJ
CX0KKwl9IGVsc2UgeworCQltcHRlID0gTlVMTDsKKwl9CisKKwlwdGUgPSBwbWFwX3B0ZShwbWFw
LCB2YSk7CisJaWYgKHB0ZV90ZXN0KHB0ZSwgUFRFX1YpKSB7CisJCWlmIChtcHRlICE9IE5VTEwp
IHsKKwkJCW1wdGUtPndpcmVfY291bnQtLTsKKwkJCW1wdGUgPSBOVUxMOworCQl9CisJCXJldHVy
biAobXB0ZSk7CisJfQorCisJLyoKKwkgKiBFbnRlciBvbiB0aGUgUFYgbGlzdCBpZiBwYXJ0IG9m
IG91ciBtYW5hZ2VkIG1lbW9yeS4KKwkgKi8KKwlpZiAoKG0tPmZsYWdzICYgKFBHX0ZJQ1RJVElP
VVMgfCBQR19VTk1BTkFHRUQpKSA9PSAwICYmCisJICAgICFwbWFwX3RyeV9pbnNlcnRfcHZfZW50
cnkocG1hcCwgbXB0ZSwgdmEsIG0pKSB7CisJCWlmIChtcHRlICE9IE5VTEwpIHsKKwkJCXBtYXBf
dW53aXJlX3B0ZV9ob2xkKHBtYXAsIHZhLCBtcHRlKTsKKwkJCW1wdGUgPSBOVUxMOworCQl9CisJ
CXJldHVybiAobXB0ZSk7CisJfQorCisJLyoKKwkgKiBJbmNyZW1lbnQgY291bnRlcnMKKwkgKi8K
KwlwbWFwLT5wbV9zdGF0cy5yZXNpZGVudF9jb3VudCsrOworCisJcGEgPSBWTV9QQUdFX1RPX1BI
WVMobSk7CisKKwkvKgorCSAqIE5vdyB2YWxpZGF0ZSBtYXBwaW5nIHdpdGggUk8gcHJvdGVjdGlv
bgorCSAqLworCSpwdGUgPSBUTEJMT19QQV9UT19QRk4ocGEpIHwgUFRFX1Y7CisKKwlpZiAoaXNf
Y2FjaGVhYmxlX21lbShwYSkpCisJCSpwdGUgfD0gUFRFX0NfQ0FDSEU7CisJZWxzZQorCQkqcHRl
IHw9IFBURV9DX1VOQ0FDSEVEOworCisJaWYgKGlzX2tlcm5lbF9wbWFwKHBtYXApKQorCQkqcHRl
IHw9IFBURV9HOworCWVsc2UgeworCQkqcHRlIHw9IFBURV9STzsKKwkJLyoKKwkJICogU3luYyBJ
ICYgRCBjYWNoZXMuICBEbyB0aGlzIG9ubHkgaWYgdGhlIHRoZSB0YXJnZXQgcG1hcAorCQkgKiBi
ZWxvbmdzIHRvIHRoZSBjdXJyZW50IHByb2Nlc3MuICBPdGhlcndpc2UsIGFuCisJCSAqIHVucmVz
b2x2YWJsZSBUTEIgbWlzcyBtYXkgb2NjdXIuICovCisJCWlmIChwbWFwID09ICZjdXJwcm9jLT5w
X3Ztc3BhY2UtPnZtX3BtYXApIHsKKwkJCXZhICY9IH5QQUdFX01BU0s7CisJCQltaXBzX2ljYWNo
ZV9zeW5jX3JhbmdlKHZhLCBQQUdFX1NJWkUpOworCQkJbWlwc19kY2FjaGVfd2JpbnZfcmFuZ2Uo
dmEsIFBBR0VfU0laRSk7CisJCX0KKwl9CisJcmV0dXJuIChtcHRlKTsKK30KKworLyoKKyAqIE1h
a2UgYSB0ZW1wb3JhcnkgbWFwcGluZyBmb3IgYSBwaHlzaWNhbCBhZGRyZXNzLiAgVGhpcyBpcyBv
bmx5IGludGVuZGVkCisgKiB0byBiZSB1c2VkIGZvciBwYW5pYyBkdW1wcy4KKyAqCisgKiBVc2Ug
WEtQSFlTIGZvciA2NCBiaXQsIGFuZCBLU0VHMCB3aGVyZSBwb3NzaWJsZSBmb3IgMzIgYml0Lgor
ICovCit2b2lkICoKK3BtYXBfa2VudGVyX3RlbXBvcmFyeSh2bV9wYWRkcl90IHBhLCBpbnQgaSkK
K3sKKwlyZXR1cm4gKCh2b2lkICopTUlQU19QSFlTX1RPX1hLUEhZU19DQUNIRUQocGEpKTsKK30K
K3ZvaWQKK3BtYXBfa2VudGVyX3RlbXBvcmFyeV9mcmVlKHZtX3BhZGRyX3QgcGEpCit7Cit9CisK
Ky8qCisgKiBNb3ZlZCB0aGUgY29kZSB0byBNYWNoaW5lIEluZGVwZW5kZW50CisgKgkgdm1fbWFw
X3BtYXBfZW50ZXIoKQorICovCisKKy8qCisgKiBNYXBzIGEgc2VxdWVuY2Ugb2YgcmVzaWRlbnQg
cGFnZXMgYmVsb25naW5nIHRvIHRoZSBzYW1lIG9iamVjdC4KKyAqIFRoZSBzZXF1ZW5jZSBiZWdp
bnMgd2l0aCB0aGUgZ2l2ZW4gcGFnZSBtX3N0YXJ0LiAgVGhpcyBwYWdlIGlzCisgKiBtYXBwZWQg
YXQgdGhlIGdpdmVuIHZpcnR1YWwgYWRkcmVzcyBzdGFydC4gIEVhY2ggc3Vic2VxdWVudCBwYWdl
IGlzCisgKiBtYXBwZWQgYXQgYSB2aXJ0dWFsIGFkZHJlc3MgdGhhdCBpcyBvZmZzZXQgZnJvbSBz
dGFydCBieSB0aGUgc2FtZQorICogYW1vdW50IGFzIHRoZSBwYWdlIGlzIG9mZnNldCBmcm9tIG1f
c3RhcnQgd2l0aGluIHRoZSBvYmplY3QuICBUaGUKKyAqIGxhc3QgcGFnZSBpbiB0aGUgc2VxdWVu
Y2UgaXMgdGhlIHBhZ2Ugd2l0aCB0aGUgbGFyZ2VzdCBvZmZzZXQgZnJvbQorICogbV9zdGFydCB0
aGF0IGNhbiBiZSBtYXBwZWQgYXQgYSB2aXJ0dWFsIGFkZHJlc3MgbGVzcyB0aGFuIHRoZSBnaXZl
bgorICogdmlydHVhbCBhZGRyZXNzIGVuZC4gIE5vdCBldmVyeSB2aXJ0dWFsIHBhZ2UgYmV0d2Vl
biBzdGFydCBhbmQgZW5kCisgKiBpcyBtYXBwZWQ7IG9ubHkgdGhvc2UgZm9yIHdoaWNoIGEgcmVz
aWRlbnQgcGFnZSBleGlzdHMgd2l0aCB0aGUKKyAqIGNvcnJlc3BvbmRpbmcgb2Zmc2V0IGZyb20g
bV9zdGFydCBhcmUgbWFwcGVkLgorICovCit2b2lkCitwbWFwX2VudGVyX29iamVjdChwbWFwX3Qg
cG1hcCwgdm1fb2Zmc2V0X3Qgc3RhcnQsIHZtX29mZnNldF90IGVuZCwKKyAgICB2bV9wYWdlX3Qg
bV9zdGFydCwgdm1fcHJvdF90IHByb3QpCit7CisJdm1fcGFnZV90IG0sIG1wdGU7CisJdm1fcGlu
ZGV4X3QgZGlmZiwgcHNpemU7CisKKwlWTV9PQkpFQ1RfTE9DS19BU1NFUlQobV9zdGFydC0+b2Jq
ZWN0LCBNQV9PV05FRCk7CisJcHNpemUgPSBhdG9wKGVuZCAtIHN0YXJ0KTsKKwltcHRlID0gTlVM
TDsKKwltID0gbV9zdGFydDsKKwl2bV9wYWdlX2xvY2tfcXVldWVzKCk7CisJUE1BUF9MT0NLKHBt
YXApOworCXdoaWxlIChtICE9IE5VTEwgJiYgKGRpZmYgPSBtLT5waW5kZXggLSBtX3N0YXJ0LT5w
aW5kZXgpIDwgcHNpemUpIHsKKwkJbXB0ZSA9IHBtYXBfZW50ZXJfcXVpY2tfbG9ja2VkKHBtYXAs
IHN0YXJ0ICsgcHRvYShkaWZmKSwgbSwKKwkJICAgIHByb3QsIG1wdGUpOworCQltID0gVEFJTFFf
TkVYVChtLCBsaXN0cSk7CisJfQorCXZtX3BhZ2VfdW5sb2NrX3F1ZXVlcygpOworIAlQTUFQX1VO
TE9DSyhwbWFwKTsKK30KKworLyoKKyAqIHBtYXBfb2JqZWN0X2luaXRfcHQgcHJlbG9hZHMgdGhl
IHB0ZXMgZm9yIGEgZ2l2ZW4gb2JqZWN0CisgKiBpbnRvIHRoZSBzcGVjaWZpZWQgcG1hcC4gIFRo
aXMgZWxpbWluYXRlcyB0aGUgYmxhc3Qgb2Ygc29mdAorICogZmF1bHRzIG9uIHByb2Nlc3Mgc3Rh
cnR1cCBhbmQgaW1tZWRpYXRlbHkgYWZ0ZXIgYW4gbW1hcC4KKyAqLwordm9pZAorcG1hcF9vYmpl
Y3RfaW5pdF9wdChwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgYWRkciwKKyAgICB2bV9vYmplY3Rf
dCBvYmplY3QsIHZtX3BpbmRleF90IHBpbmRleCwgdm1fc2l6ZV90IHNpemUpCit7CisJVk1fT0JK
RUNUX0xPQ0tfQVNTRVJUKG9iamVjdCwgTUFfT1dORUQpOworCUtBU1NFUlQob2JqZWN0LT50eXBl
ID09IE9CSlRfREVWSUNFIHx8IG9iamVjdC0+dHlwZSA9PSBPQkpUX1NHLAorCSAgICAoInBtYXBf
b2JqZWN0X2luaXRfcHQ6IG5vbi1kZXZpY2Ugb2JqZWN0IikpOworfQorCisvKgorICoJUm91dGlu
ZToJcG1hcF9jaGFuZ2Vfd2lyaW5nCisgKglGdW5jdGlvbjoJQ2hhbmdlIHRoZSB3aXJpbmcgYXR0
cmlidXRlIGZvciBhIG1hcC92aXJ0dWFsLWFkZHJlc3MKKyAqCQkJcGFpci4KKyAqCUluL291dCBj
b25kaXRpb25zOgorICoJCQlUaGUgbWFwcGluZyBtdXN0IGFscmVhZHkgZXhpc3QgaW4gdGhlIHBt
YXAuCisgKi8KK3ZvaWQKK3BtYXBfY2hhbmdlX3dpcmluZyhwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0
X3QgdmEsIGJvb2xlYW5fdCB3aXJlZCkKK3sKKwlwdF9lbnRyeV90ICpwdGU7CisKKwlpZiAocG1h
cCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlQTUFQX0xPQ0socG1hcCk7CisJcHRlID0gcG1hcF9w
dGUocG1hcCwgdmEpOworCisJaWYgKHdpcmVkICYmICFwdGVfdGVzdChwdGUsIFBURV9XKSkKKwkJ
cG1hcC0+cG1fc3RhdHMud2lyZWRfY291bnQrKzsKKwllbHNlIGlmICghd2lyZWQgJiYgcHRlX3Rl
c3QocHRlLCBQVEVfVykpCisJCXBtYXAtPnBtX3N0YXRzLndpcmVkX2NvdW50LS07CisKKwkvKgor
CSAqIFdpcmluZyBpcyBub3QgYSBoYXJkd2FyZSBjaGFyYWN0ZXJpc3RpYyBzbyB0aGVyZSBpcyBu
byBuZWVkIHRvCisJICogaW52YWxpZGF0ZSBUTEIuCisJICovCisJaWYgKHdpcmVkKQorCQlwdGVf
c2V0KHB0ZSwgUFRFX1cpOworCWVsc2UKKwkJcHRlX2NsZWFyKHB0ZSwgUFRFX1cpOworCVBNQVBf
VU5MT0NLKHBtYXApOworfQorCisvKgorICoJQ29weSB0aGUgcmFuZ2Ugc3BlY2lmaWVkIGJ5IHNy
Y19hZGRyL2xlbgorICoJZnJvbSB0aGUgc291cmNlIG1hcCB0byB0aGUgcmFuZ2UgZHN0X2FkZHIv
bGVuCisgKglpbiB0aGUgZGVzdGluYXRpb24gbWFwLgorICoKKyAqCVRoaXMgcm91dGluZSBpcyBv
bmx5IGFkdmlzb3J5IGFuZCBuZWVkIG5vdCBkbyBhbnl0aGluZy4KKyAqLworCit2b2lkCitwbWFw
X2NvcHkocG1hcF90IGRzdF9wbWFwLCBwbWFwX3Qgc3JjX3BtYXAsIHZtX29mZnNldF90IGRzdF9h
ZGRyLAorICAgIHZtX3NpemVfdCBsZW4sIHZtX29mZnNldF90IHNyY19hZGRyKQoreworfQorCisv
KgorICoJcG1hcF96ZXJvX3BhZ2UgemVyb3MgdGhlIHNwZWNpZmllZCBoYXJkd2FyZSBwYWdlIGJ5
IG1hcHBpbmcKKyAqCXRoZSBwYWdlIGludG8gS1ZNIGFuZCB1c2luZyBiemVybyB0byBjbGVhciBp
dHMgY29udGVudHMuCisgKgorICogCVVzZSBYS1BIWVMgZm9yIDY0IGJpdCwgYW5kIEtTRUcwIHdo
ZXJlIHBvc3NpYmxlIGZvciAzMiBiaXQuCisgKi8KK3ZvaWQKK3BtYXBfemVyb19wYWdlKHZtX3Bh
Z2VfdCBtKQoreworCXZtX29mZnNldF90IHZhOworCXZtX3BhZGRyX3QgcGh5cyA9IFZNX1BBR0Vf
VE9fUEhZUyhtKTsKKworCXZhID0gTUlQU19QSFlTX1RPX1hLUEhZU19DQUNIRUQocGh5cyk7CisJ
Ynplcm8oKGNhZGRyX3QpdmEsIFBBR0VfU0laRSk7CisJbWlwc19kY2FjaGVfd2JpbnZfcmFuZ2Uo
dmEsIFBBR0VfU0laRSk7Cit9CisKKy8qCisgKglwbWFwX3plcm9fcGFnZV9hcmVhIHplcm9zIHRo
ZSBzcGVjaWZpZWQgaGFyZHdhcmUgcGFnZSBieSBtYXBwaW5nCisgKgl0aGUgcGFnZSBpbnRvIEtW
TSBhbmQgdXNpbmcgYnplcm8gdG8gY2xlYXIgaXRzIGNvbnRlbnRzLgorICoKKyAqCW9mZiBhbmQg
c2l6ZSBtYXkgbm90IGNvdmVyIGFuIGFyZWEgYmV5b25kIGEgc2luZ2xlIGhhcmR3YXJlIHBhZ2Uu
CisgKi8KK3ZvaWQKK3BtYXBfemVyb19wYWdlX2FyZWEodm1fcGFnZV90IG0sIGludCBvZmYsIGlu
dCBzaXplKQoreworCXZtX29mZnNldF90IHZhOworCXZtX3BhZGRyX3QgcGh5cyA9IFZNX1BBR0Vf
VE9fUEhZUyhtKTsKKworCXZhID0gTUlQU19QSFlTX1RPX1hLUEhZU19DQUNIRUQocGh5cyk7CisJ
Ynplcm8oKGNoYXIgKikoY2FkZHJfdCl2YSArIG9mZiwgc2l6ZSk7CisJbWlwc19kY2FjaGVfd2Jp
bnZfcmFuZ2UodmEgKyBvZmYsIHNpemUpOworfQorCit2b2lkCitwbWFwX3plcm9fcGFnZV9pZGxl
KHZtX3BhZ2VfdCBtKQoreworCXZtX29mZnNldF90IHZhOworCXZtX3BhZGRyX3QgcGh5cyA9IFZN
X1BBR0VfVE9fUEhZUyhtKTsKKworCXZhID0gTUlQU19QSFlTX1RPX1hLUEhZU19DQUNIRUQocGh5
cyk7CisJYnplcm8oKGNhZGRyX3QpdmEsIFBBR0VfU0laRSk7CisJbWlwc19kY2FjaGVfd2JpbnZf
cmFuZ2UodmEsIFBBR0VfU0laRSk7Cit9CisKKy8qCisgKglwbWFwX2NvcHlfcGFnZSBjb3BpZXMg
dGhlIHNwZWNpZmllZCAobWFjaGluZSBpbmRlcGVuZGVudCkKKyAqCXBhZ2UgYnkgbWFwcGluZyB0
aGUgcGFnZSBpbnRvIHZpcnR1YWwgbWVtb3J5IGFuZCB1c2luZworICoJYmNvcHkgdG8gY29weSB0
aGUgcGFnZSwgb25lIG1hY2hpbmUgZGVwZW5kZW50IHBhZ2UgYXQgYQorICoJdGltZS4KKyAqCisg
KiAJVXNlIFhLUEhZUyBmb3IgNjQgYml0LCBhbmQgS1NFRzAgd2hlcmUgcG9zc2libGUgZm9yIDMy
IGJpdC4KKyAqLwordm9pZAorcG1hcF9jb3B5X3BhZ2Uodm1fcGFnZV90IHNyYywgdm1fcGFnZV90
IGRzdCkKK3sKKwl2bV9vZmZzZXRfdCB2YV9zcmMsIHZhX2RzdDsKKwl2bV9wYWRkcl90IHBoeV9z
cmMgPSBWTV9QQUdFX1RPX1BIWVMoc3JjKTsKKwl2bV9wYWRkcl90IHBoeV9kc3QgPSBWTV9QQUdF
X1RPX1BIWVMoZHN0KTsKKworCXBtYXBfZmx1c2hfcHZjYWNoZShzcmMpOworCW1pcHNfZGNhY2hl
X3diaW52X3JhbmdlX2luZGV4KE1JUFNfUEhZU19UT19YS1BIWVNfQ0FDSEVEKHBoeV9kc3QpLCBQ
QUdFX1NJWkUpOworCXZhX3NyYyA9IE1JUFNfUEhZU19UT19YS1BIWVNfQ0FDSEVEKHBoeV9zcmMp
OworCXZhX2RzdCA9IE1JUFNfUEhZU19UT19YS1BIWVNfQ0FDSEVEKHBoeV9kc3QpOworCWJjb3B5
KChjYWRkcl90KXZhX3NyYywgKGNhZGRyX3QpdmFfZHN0LCBQQUdFX1NJWkUpOworCW1pcHNfZGNh
Y2hlX3diaW52X3JhbmdlKHZhX2RzdCwgUEFHRV9TSVpFKTsKK30KKworLyoKKyAqIFJldHVybnMg
dHJ1ZSBpZiB0aGUgcG1hcCdzIHB2IGlzIG9uZSBvZiB0aGUgZmlyc3QKKyAqIDE2IHB2cyBsaW5r
ZWQgdG8gZnJvbSB0aGlzIHBhZ2UuICBUaGlzIGNvdW50IG1heQorICogYmUgY2hhbmdlZCB1cHdh
cmRzIG9yIGRvd253YXJkcyBpbiB0aGUgZnV0dXJlOyBpdAorICogaXMgb25seSBuZWNlc3Nhcnkg
dGhhdCB0cnVlIGJlIHJldHVybmVkIGZvciBhIHNtYWxsCisgKiBzdWJzZXQgb2YgcG1hcHMgZm9y
IHByb3BlciBwYWdlIGFnaW5nLgorICovCitib29sZWFuX3QKK3BtYXBfcGFnZV9leGlzdHNfcXVp
Y2socG1hcF90IHBtYXAsIHZtX3BhZ2VfdCBtKQoreworCXB2X2VudHJ5X3QgcHY7CisJaW50IGxv
b3BzID0gMDsKKwlib29sZWFuX3QgcnY7CisKKwlLQVNTRVJUKChtLT5mbGFncyAmIChQR19GSUNU
SVRJT1VTIHwgUEdfVU5NQU5BR0VEKSkgPT0gMCwKKwkgICAgKCJwbWFwX3BhZ2VfZXhpc3RzX3F1
aWNrOiBwYWdlICVwIGlzIG5vdCBtYW5hZ2VkIiwgbSkpOworCXJ2ID0gRkFMU0U7CisJdm1fcGFn
ZV9sb2NrX3F1ZXVlcygpOworCVRBSUxRX0ZPUkVBQ0gocHYsICZtLT5tZC5wdl9saXN0LCBwdl9s
aXN0KSB7CisJCWlmIChwdi0+cHZfcG1hcCA9PSBwbWFwKSB7CisJCQlydiA9IFRSVUU7CisJCQli
cmVhazsKKwkJfQorCQlsb29wcysrOworCQlpZiAobG9vcHMgPj0gMTYpCisJCQlicmVhazsKKwl9
CisJdm1fcGFnZV91bmxvY2tfcXVldWVzKCk7CisJcmV0dXJuIChydik7Cit9CisKKy8qCisgKiBS
ZW1vdmUgYWxsIHBhZ2VzIGZyb20gc3BlY2lmaWVkIGFkZHJlc3Mgc3BhY2UKKyAqIHRoaXMgYWlk
cyBwcm9jZXNzIGV4aXQgc3BlZWRzLiAgQWxzbywgdGhpcyBjb2RlCisgKiBpcyBzcGVjaWFsIGNh
c2VkIGZvciBjdXJyZW50IHByb2Nlc3Mgb25seSwgYnV0CisgKiBjYW4gaGF2ZSB0aGUgbW9yZSBn
ZW5lcmljIChhbmQgc2xpZ2h0bHkgc2xvd2VyKQorICogbW9kZSBlbmFibGVkLiAgVGhpcyBpcyBt
dWNoIGZhc3RlciB0aGFuIHBtYXBfcmVtb3ZlCisgKiBpbiB0aGUgY2FzZSBvZiBydW5uaW5nIGRv
d24gYW4gZW50aXJlIGFkZHJlc3Mgc3BhY2UuCisgKi8KK3ZvaWQKK3BtYXBfcmVtb3ZlX3BhZ2Vz
KHBtYXBfdCBwbWFwKQoreworCXB0X2VudHJ5X3QgKnB0ZSwgdHB0ZTsKKwlwdl9lbnRyeV90IHB2
LCBucHY7CisJdm1fcGFnZV90IG07CisKKwlpZiAocG1hcCAhPSB2bXNwYWNlX3BtYXAoY3VydGhy
ZWFkLT50ZF9wcm9jLT5wX3Ztc3BhY2UpKSB7CisJCXByaW50Zigid2FybmluZzogcG1hcF9yZW1v
dmVfcGFnZXMgY2FsbGVkIHdpdGggbm9uLWN1cnJlbnQgcG1hcFxuIik7CisJCXJldHVybjsKKwl9
CisJdm1fcGFnZV9sb2NrX3F1ZXVlcygpOworCVBNQVBfTE9DSyhwbWFwKTsKKwlzY2hlZF9waW4o
KTsKKwkvL1hYWCBuZWVkIHRvIGJlIFRBSUxRX0ZPUkVBQ0hfU0FGRSA/CisJZm9yIChwdiA9IFRB
SUxRX0ZJUlNUKCZwbWFwLT5wbV9wdmxpc3QpOyBwdjsgcHYgPSBucHYpIHsKKwkJcHRlID0gcG1h
cF9wdGUocHYtPnB2X3BtYXAsIHB2LT5wdl92YSk7CisJCWlmIChwdGUgPT0gTlVMTCkKKwkJCXBy
aW50ZigicHRlIGZhaWwgLSAlcCB2YSAlcFxuIiwKKwkJCQkJcHYtPnB2X3BtYXAsICh2b2lkICop
cHYtPnB2X3ZhKTsKKwkJaWYgKCFwdGVfdGVzdChwdGUsIFBURV9WKSkKKwkJCXBhbmljKCJwbWFw
X3JlbW92ZV9wYWdlczogcGFnZSBvbiBwbV9wdmxpc3QgaGFzIG5vIHB0ZVxuIik7CisJCXRwdGUg
PSAqcHRlOworCisvKgorICogV2UgY2Fubm90IHJlbW92ZSB3aXJlZCBwYWdlcyBmcm9tIGEgcHJv
Y2VzcycgbWFwcGluZyBhdCB0aGlzIHRpbWUKKyAqLworCQlpZiAocHRlX3Rlc3QoJnRwdGUsIFBU
RV9XKSkgeworCQkJbnB2ID0gVEFJTFFfTkVYVChwdiwgcHZfcGxpc3QpOworCQkJY29udGludWU7
CisJCX0KKwkJKnB0ZSA9IGlzX2tlcm5lbF9wbWFwKHBtYXApID8gUFRFX0cgOiAwOworCisJCW0g
PSBQSFlTX1RPX1ZNX1BBR0UoVExCTE9fUFRFX1RPX1BBKHRwdGUpKTsKKwkJS0FTU0VSVChtICE9
IE5VTEwsCisJCSAgICAoInBtYXBfcmVtb3ZlX3BhZ2VzOiBiYWQgdHB0ZSAleCIsIHRwdGUpKTsK
KworCQlwdi0+cHZfcG1hcC0+cG1fc3RhdHMucmVzaWRlbnRfY291bnQtLTsKKworCQkvKgorCQkg
KiBVcGRhdGUgdGhlIHZtX3BhZ2VfdCBjbGVhbiBhbmQgcmVmZXJlbmNlIGJpdHMuCisJCSAqLwor
CQlpZiAocHRlX3Rlc3QoJnRwdGUsIFBURV9EKSkKKwkJCXZtX3BhZ2VfZGlydHkobSk7CisJCW5w
diA9IFRBSUxRX05FWFQocHYsIHB2X3BsaXN0KTsKKwkJVEFJTFFfUkVNT1ZFKCZwdi0+cHZfcG1h
cC0+cG1fcHZsaXN0LCBwdiwgcHZfcGxpc3QpOworCisJCW0tPm1kLnB2X2xpc3RfY291bnQtLTsK
KwkJVEFJTFFfUkVNT1ZFKCZtLT5tZC5wdl9saXN0LCBwdiwgcHZfbGlzdCk7CisJCWlmIChUQUlM
UV9GSVJTVCgmbS0+bWQucHZfbGlzdCkgPT0gTlVMTCkgeworCQkJdm1fcGFnZV9mbGFnX2NsZWFy
KG0sIFBHX1dSSVRFQUJMRSk7CisJCX0KKwkJcG1hcF91bnVzZV9wdChwdi0+cHZfcG1hcCwgcHYt
PnB2X3ZhLCBwdi0+cHZfcHRlbSk7CisJCWZyZWVfcHZfZW50cnkocHYpOworCX0KKwlzY2hlZF91
bnBpbigpOworCXBtYXBfaW52YWxpZGF0ZV9hbGwocG1hcCk7CisJUE1BUF9VTkxPQ0socG1hcCk7
CisJdm1fcGFnZV91bmxvY2tfcXVldWVzKCk7Cit9CisKKy8qCisgKiBwbWFwX3Rlc3RiaXQgdGVz
dHMgYml0cyBpbiBwdGUncworICogbm90ZSB0aGF0IHRoZSB0ZXN0Yml0L2NoYW5nZWJpdCByb3V0
aW5lcyBhcmUgaW5saW5lLAorICogYW5kIGEgbG90IG9mIHRoaW5ncyBjb21waWxlLXRpbWUgZXZh
bHVhdGUuCisgKi8KK3N0YXRpYyBib29sZWFuX3QKK3BtYXBfdGVzdGJpdCh2bV9wYWdlX3QgbSwg
aW50IGJpdCkKK3sKKwlwdl9lbnRyeV90IHB2OworCXB0X2VudHJ5X3QgKnB0ZTsKKwlib29sZWFu
X3QgcnYgPSBGQUxTRTsKKworCWlmIChtLT5mbGFncyAmIFBHX0ZJQ1RJVElPVVMpCisJCXJldHVy
biBydjsKKworCWlmIChUQUlMUV9GSVJTVCgmbS0+bWQucHZfbGlzdCkgPT0gTlVMTCkKKwkJcmV0
dXJuIHJ2OworCisJbXR4X2Fzc2VydCgmdm1fcGFnZV9xdWV1ZV9tdHgsIE1BX09XTkVEKTsKKwlU
QUlMUV9GT1JFQUNIKHB2LCAmbS0+bWQucHZfbGlzdCwgcHZfbGlzdCkgeworI2lmIGRlZmluZWQo
UE1BUF9ESUFHTk9TVElDKQorCQlpZiAoIXB2LT5wdl9wbWFwKSB7CisJCQlwcmludGYoIk51bGwg
cG1hcCAodGIpIGF0IHZhOiAweCV4XG4iLCBwdi0+cHZfdmEpOworCQkJY29udGludWU7CisJCX0K
KyNlbmRpZgorCQlQTUFQX0xPQ0socHYtPnB2X3BtYXApOworCQlwdGUgPSBwbWFwX3B0ZShwdi0+
cHZfcG1hcCwgcHYtPnB2X3ZhKTsKKwkJcnYgPSBwdGVfdGVzdChwdGUsIGJpdCk7CisJCVBNQVBf
VU5MT0NLKHB2LT5wdl9wbWFwKTsKKwkJaWYgKHJ2KQorCQkJYnJlYWs7CisJfQorCXJldHVybiAo
cnYpOworfQorCisvKgorICogdGhpcyByb3V0aW5lIGlzIHVzZWQgdG8gY2xlYXIgZGlydHkgYml0
cyBpbiBwdGVzCisgKi8KK3N0YXRpYyBfX2lubGluZSB2b2lkCitwbWFwX2NoYW5nZWJpdCh2bV9w
YWdlX3QgbSwgaW50IGJpdCwgYm9vbGVhbl90IHNldGVtKQoreworCXB2X2VudHJ5X3QgcHY7CisJ
cHRfZW50cnlfdCAqcHRlOworCisJaWYgKG0tPmZsYWdzICYgUEdfRklDVElUSU9VUykKKwkJcmV0
dXJuOworCisJbXR4X2Fzc2VydCgmdm1fcGFnZV9xdWV1ZV9tdHgsIE1BX09XTkVEKTsKKwkvKgor
CSAqIExvb3Agb3ZlciBhbGwgY3VycmVudCBtYXBwaW5ncyBzZXR0aW5nL2NsZWFyaW5nIGFzIGFw
cHJvcG9zIElmCisJICogc2V0dGluZyBSTyBkbyB3ZSBuZWVkIHRvIGNsZWFyIHRoZSBWQUM/CisJ
ICovCisJVEFJTFFfRk9SRUFDSChwdiwgJm0tPm1kLnB2X2xpc3QsIHB2X2xpc3QpIHsKKyNpZiBk
ZWZpbmVkKFBNQVBfRElBR05PU1RJQykKKwkJaWYgKCFwdi0+cHZfcG1hcCkgeworCQkJcHJpbnRm
KCJOdWxsIHBtYXAgKGNiKSBhdCB2YTogMHgleFxuIiwgcHYtPnB2X3ZhKTsKKwkJCWNvbnRpbnVl
OworCQl9CisjZW5kaWYKKworCQlQTUFQX0xPQ0socHYtPnB2X3BtYXApOworCQlwdGUgPSBwbWFw
X3B0ZShwdi0+cHZfcG1hcCwgcHYtPnB2X3ZhKTsKKwkJaWYgKHNldGVtKSB7CisJCQkqcHRlIHw9
IGJpdDsKKwkJCXBtYXBfdXBkYXRlX3BhZ2UocHYtPnB2X3BtYXAsIHB2LT5wdl92YSwgKnB0ZSk7
CisJCX0gZWxzZSB7CisJCQlwdF9lbnRyeV90ICBwYml0cyA9ICpwdGU7CisKKwkJCWlmIChwYml0
cyAmIGJpdCkgeworCQkJCWlmIChiaXQgPT0gUFRFX0QpIHsKKwkJCQkJaWYgKHBiaXRzICYgUFRF
X0QpCisJCQkJCQl2bV9wYWdlX2RpcnR5KG0pOworCQkJCQkqcHRlID0gKHBiaXRzICYgflBURV9E
KSB8IFBURV9STzsKKwkJCQl9IGVsc2UgeworCQkJCQkqcHRlID0gcGJpdHMgJiB+Yml0OworCQkJ
CX0KKwkJCQlwbWFwX3VwZGF0ZV9wYWdlKHB2LT5wdl9wbWFwLCBwdi0+cHZfdmEsICpwdGUpOwor
CQkJfQorCQl9CisJCVBNQVBfVU5MT0NLKHB2LT5wdl9wbWFwKTsKKwl9CisJaWYgKCFzZXRlbSAm
JiBiaXQgPT0gUFRFX0QpCisJCXZtX3BhZ2VfZmxhZ19jbGVhcihtLCBQR19XUklURUFCTEUpOwor
fQorCisvKgorICoJcG1hcF9wYWdlX3dpcmVkX21hcHBpbmdzOgorICoKKyAqCVJldHVybiB0aGUg
bnVtYmVyIG9mIG1hbmFnZWQgbWFwcGluZ3MgdG8gdGhlIGdpdmVuIHBoeXNpY2FsIHBhZ2UKKyAq
CXRoYXQgYXJlIHdpcmVkLgorICovCitpbnQKK3BtYXBfcGFnZV93aXJlZF9tYXBwaW5ncyh2bV9w
YWdlX3QgbSkKK3sKKwlwdl9lbnRyeV90IHB2OworCWludCBjb3VudDsKKworCWNvdW50ID0gMDsK
KwlpZiAoKG0tPmZsYWdzICYgUEdfRklDVElUSU9VUykgIT0gMCkKKwkJcmV0dXJuIChjb3VudCk7
CisJdm1fcGFnZV9sb2NrX3F1ZXVlcygpOworCVRBSUxRX0ZPUkVBQ0gocHYsICZtLT5tZC5wdl9s
aXN0LCBwdl9saXN0KQorCSAgICBpZiAocHYtPnB2X3dpcmVkKQorCQljb3VudCsrOworCXZtX3Bh
Z2VfdW5sb2NrX3F1ZXVlcygpOworCXJldHVybiAoY291bnQpOworfQorCisvKgorICogQ2xlYXIg
dGhlIHdyaXRlIGFuZCBtb2RpZmllZCBiaXRzIGluIGVhY2ggb2YgdGhlIGdpdmVuIHBhZ2UncyBt
YXBwaW5ncy4KKyAqLwordm9pZAorcG1hcF9yZW1vdmVfd3JpdGUodm1fcGFnZV90IG0pCit7CisJ
cHZfZW50cnlfdCBwdiwgbnB2OworCXZtX29mZnNldF90IHZhOworCXB0X2VudHJ5X3QgKnB0ZTsK
KworCUtBU1NFUlQoKG0tPmZsYWdzICYgKFBHX0ZJQ1RJVElPVVMgfCBQR19VTk1BTkFHRUQpKSA9
PSAwLAorCSAgICAoInBtYXBfcmVtb3ZlX3dyaXRlOiBwYWdlICVwIGlzIG5vdCBtYW5hZ2VkIiwg
bSkpOworCisJLyoKKwkgKiBJZiB0aGUgcGFnZSBpcyBub3QgVlBPX0JVU1ksIHRoZW4gUEdfV1JJ
VEVBQkxFIGNhbm5vdCBiZSBzZXQgYnkKKwkgKiBhbm90aGVyIHRocmVhZCB3aGlsZSB0aGUgb2Jq
ZWN0IGlzIGxvY2tlZC4gIFRodXMsIGlmIFBHX1dSSVRFQUJMRQorCSAqIGlzIGNsZWFyLCBubyBw
YWdlIHRhYmxlIGVudHJpZXMgbmVlZCB1cGRhdGluZy4KKwkgKi8KKwlWTV9PQkpFQ1RfTE9DS19B
U1NFUlQobS0+b2JqZWN0LCBNQV9PV05FRCk7CisJaWYgKChtLT5vZmxhZ3MgJiBWUE9fQlVTWSkg
PT0gMCAmJgorCSAgICAobS0+ZmxhZ3MgJiBQR19XUklURUFCTEUpID09IDApCisJCXJldHVybjsK
KworCS8qCisJICogTG9vcCBvdmVyIGFsbCBjdXJyZW50IG1hcHBpbmdzIHNldHRpbmcvY2xlYXJp
bmcgYXMgYXBwcm9wb3MuCisJICovCisJdm1fcGFnZV9sb2NrX3F1ZXVlcygpOworCWZvciAocHYg
PSBUQUlMUV9GSVJTVCgmbS0+bWQucHZfbGlzdCk7IHB2OyBwdiA9IG5wdikgeworCQlucHYgPSBU
QUlMUV9ORVhUKHB2LCBwdl9wbGlzdCk7CisJCXB0ZSA9IHBtYXBfcHRlKHB2LT5wdl9wbWFwLCBw
di0+cHZfdmEpOworCQlpZiAocHRlID09IE5VTEwgfHwgIXB0ZV90ZXN0KHB0ZSwgUFRFX1YpKQor
CQkJcGFuaWMoInBhZ2Ugb24gcG1fcHZsaXN0IGhhcyBubyBwdGVcbiIpOworCisJCXZhID0gcHYt
PnB2X3ZhOworCQlwbWFwX3Byb3RlY3QocHYtPnB2X3BtYXAsIHZhLCB2YSArIFBBR0VfU0laRSwK
KwkJICAgIFZNX1BST1RfUkVBRCB8IFZNX1BST1RfRVhFQ1VURSk7CisJfQorCXZtX3BhZ2VfZmxh
Z19jbGVhcihtLCBQR19XUklURUFCTEUpOworCXZtX3BhZ2VfdW5sb2NrX3F1ZXVlcygpOworfQor
CisvKgorICoJcG1hcF90c19yZWZlcmVuY2VkOgorICoKKyAqCVJldHVybiB0aGUgY291bnQgb2Yg
cmVmZXJlbmNlIGJpdHMgZm9yIGEgcGFnZSwgY2xlYXJpbmcgYWxsIG9mIHRoZW0uCisgKi8KK2lu
dAorcG1hcF90c19yZWZlcmVuY2VkKHZtX3BhZ2VfdCBtKQoreworCisJS0FTU0VSVCgobS0+Zmxh
Z3MgJiAoUEdfRklDVElUSU9VUyB8IFBHX1VOTUFOQUdFRCkpID09IDAsCisJICAgICgicG1hcF90
c19yZWZlcmVuY2VkOiBwYWdlICVwIGlzIG5vdCBtYW5hZ2VkIiwgbSkpOworCWlmIChtLT5tZC5w
dl9mbGFncyAmIFBWX1RBQkxFX1JFRikgeworCQl2bV9wYWdlX2xvY2tfcXVldWVzKCk7CisJCW0t
Pm1kLnB2X2ZsYWdzICY9IH5QVl9UQUJMRV9SRUY7CisJCXZtX3BhZ2VfdW5sb2NrX3F1ZXVlcygp
OworCQlyZXR1cm4gKDEpOworCX0KKwlyZXR1cm4gKDApOworfQorCisvKgorICoJcG1hcF9pc19t
b2RpZmllZDoKKyAqCisgKglSZXR1cm4gd2hldGhlciBvciBub3QgdGhlIHNwZWNpZmllZCBwaHlz
aWNhbCBwYWdlIHdhcyBtb2RpZmllZAorICoJaW4gYW55IHBoeXNpY2FsIG1hcHMuCisgKi8KK2Jv
b2xlYW5fdAorcG1hcF9pc19tb2RpZmllZCh2bV9wYWdlX3QgbSkKK3sKKwlib29sZWFuX3QgcnY7
CisKKwlLQVNTRVJUKChtLT5mbGFncyAmIChQR19GSUNUSVRJT1VTIHwgUEdfVU5NQU5BR0VEKSkg
PT0gMCwKKwkgICAgKCJwbWFwX2lzX21vZGlmaWVkOiBwYWdlICVwIGlzIG5vdCBtYW5hZ2VkIiwg
bSkpOworCisJLyoKKwkgKiBJZiB0aGUgcGFnZSBpcyBub3QgVlBPX0JVU1ksIHRoZW4gUEdfV1JJ
VEVBQkxFIGNhbm5vdCBiZQorCSAqIGNvbmN1cnJlbnRseSBzZXQgd2hpbGUgdGhlIG9iamVjdCBp
cyBsb2NrZWQuICBUaHVzLCBpZiBQR19XUklURUFCTEUKKwkgKiBpcyBjbGVhciwgbm8gUFRFcyBj
YW4gaGF2ZSBQVEVfRCBzZXQuCisJICovCisJVk1fT0JKRUNUX0xPQ0tfQVNTRVJUKG0tPm9iamVj
dCwgTUFfT1dORUQpOworCWlmICgobS0+b2ZsYWdzICYgVlBPX0JVU1kpID09IDAgJiYKKwkgICAg
KG0tPmZsYWdzICYgUEdfV1JJVEVBQkxFKSA9PSAwKQorCQlyZXR1cm4gKEZBTFNFKTsKKwl2bV9w
YWdlX2xvY2tfcXVldWVzKCk7CisJaWYgKG0tPm1kLnB2X2ZsYWdzICYgUFZfVEFCTEVfTU9EKQor
CQlydiA9IFRSVUU7CisJZWxzZQorCQlydiA9IHBtYXBfdGVzdGJpdChtLCBQVEVfRCk7CisJdm1f
cGFnZV91bmxvY2tfcXVldWVzKCk7CisJcmV0dXJuIChydik7Cit9CisKKy8qIE4vQyAqLworCisv
KgorICoJcG1hcF9pc19wcmVmYXVsdGFibGU6CisgKgorICoJUmV0dXJuIHdoZXRoZXIgb3Igbm90
IHRoZSBzcGVjaWZpZWQgdmlydHVhbCBhZGRyZXNzIGlzIGVsZ2libGUKKyAqCWZvciBwcmVmYXVs
dC4KKyAqLworYm9vbGVhbl90CitwbWFwX2lzX3ByZWZhdWx0YWJsZShwbWFwX3QgcG1hcCwgdm1f
b2Zmc2V0X3QgYWRkcikKK3sKKwlwdF9lbnRyeV90ICpwdGU7CisJYm9vbGVhbl90IHJ2OworCisJ
cnYgPSBGQUxTRTsKKwlQTUFQX0xPQ0socG1hcCk7CisJaWYgKHBtYXBfc2VnbWFwKHBtYXAsIGFk
ZHIpICE9IE5VTEwpIHsKKwkJcHRlID0gcG1hcF9wdGUocG1hcCwgYWRkcik7CisJCXJ2ID0gKCpw
dGUgPT0gMCk7CisJfQorCVBNQVBfVU5MT0NLKHBtYXApOworCXJldHVybiAocnYpOworfQorCisv
KgorICoJQ2xlYXIgdGhlIG1vZGlmeSBiaXRzIG9uIHRoZSBzcGVjaWZpZWQgcGh5c2ljYWwgcGFn
ZS4KKyAqLwordm9pZAorcG1hcF9jbGVhcl9tb2RpZnkodm1fcGFnZV90IG0pCit7CisKKwlLQVNT
RVJUKChtLT5mbGFncyAmIChQR19GSUNUSVRJT1VTIHwgUEdfVU5NQU5BR0VEKSkgPT0gMCwKKwkg
ICAgKCJwbWFwX2NsZWFyX21vZGlmeTogcGFnZSAlcCBpcyBub3QgbWFuYWdlZCIsIG0pKTsKKwlW
TV9PQkpFQ1RfTE9DS19BU1NFUlQobS0+b2JqZWN0LCBNQV9PV05FRCk7CisJS0FTU0VSVCgobS0+
b2ZsYWdzICYgVlBPX0JVU1kpID09IDAsCisJICAgICgicG1hcF9jbGVhcl9tb2RpZnk6IHBhZ2Ug
JXAgaXMgYnVzeSIsIG0pKTsKKworCS8qCisJICogSWYgdGhlIHBhZ2UgaXMgbm90IFBHX1dSSVRF
QUJMRSwgdGhlbiBubyBQVEVzIGNhbiBoYXZlIFBURV9EIHNldC4KKwkgKiBJZiB0aGUgb2JqZWN0
IGNvbnRhaW5pbmcgdGhlIHBhZ2UgaXMgbG9ja2VkIGFuZCB0aGUgcGFnZSBpcyBub3QKKwkgKiBW
UE9fQlVTWSwgdGhlbiBQR19XUklURUFCTEUgY2Fubm90IGJlIGNvbmN1cnJlbnRseSBzZXQuCisJ
ICovCisJaWYgKChtLT5mbGFncyAmIFBHX1dSSVRFQUJMRSkgPT0gMCkKKwkJcmV0dXJuOworCXZt
X3BhZ2VfbG9ja19xdWV1ZXMoKTsKKwlpZiAobS0+bWQucHZfZmxhZ3MgJiBQVl9UQUJMRV9NT0Qp
IHsKKwkJcG1hcF9jaGFuZ2ViaXQobSwgUFRFX0QsIEZBTFNFKTsKKwkJbS0+bWQucHZfZmxhZ3Mg
Jj0gflBWX1RBQkxFX01PRDsKKwl9CisJdm1fcGFnZV91bmxvY2tfcXVldWVzKCk7Cit9CisKKy8q
CisgKglwbWFwX2lzX3JlZmVyZW5jZWQ6CisgKgorICoJUmV0dXJuIHdoZXRoZXIgb3Igbm90IHRo
ZSBzcGVjaWZpZWQgcGh5c2ljYWwgcGFnZSB3YXMgcmVmZXJlbmNlZAorICoJaW4gYW55IHBoeXNp
Y2FsIG1hcHMuCisgKi8KK2Jvb2xlYW5fdAorcG1hcF9pc19yZWZlcmVuY2VkKHZtX3BhZ2VfdCBt
KQoreworCisJS0FTU0VSVCgobS0+ZmxhZ3MgJiAoUEdfRklDVElUSU9VUyB8IFBHX1VOTUFOQUdF
RCkpID09IDAsCisJICAgICgicG1hcF9pc19yZWZlcmVuY2VkOiBwYWdlICVwIGlzIG5vdCBtYW5h
Z2VkIiwgbSkpOworCXJldHVybiAoKG0tPm1kLnB2X2ZsYWdzICYgUFZfVEFCTEVfUkVGKSAhPSAw
KTsKK30KKworLyoKKyAqCXBtYXBfY2xlYXJfcmVmZXJlbmNlOgorICoKKyAqCUNsZWFyIHRoZSBy
ZWZlcmVuY2UgYml0IG9uIHRoZSBzcGVjaWZpZWQgcGh5c2ljYWwgcGFnZS4KKyAqLwordm9pZAor
cG1hcF9jbGVhcl9yZWZlcmVuY2Uodm1fcGFnZV90IG0pCit7CisKKwlLQVNTRVJUKChtLT5mbGFn
cyAmIChQR19GSUNUSVRJT1VTIHwgUEdfVU5NQU5BR0VEKSkgPT0gMCwKKwkgICAgKCJwbWFwX2Ns
ZWFyX3JlZmVyZW5jZTogcGFnZSAlcCBpcyBub3QgbWFuYWdlZCIsIG0pKTsKKwl2bV9wYWdlX2xv
Y2tfcXVldWVzKCk7CisJaWYgKG0tPm1kLnB2X2ZsYWdzICYgUFZfVEFCTEVfUkVGKSB7CisJCW0t
Pm1kLnB2X2ZsYWdzICY9IH5QVl9UQUJMRV9SRUY7CisJfQorCXZtX3BhZ2VfdW5sb2NrX3F1ZXVl
cygpOworfQorCisvKgorICogTWlzY2VsbGFuZW91cyBzdXBwb3J0IHJvdXRpbmVzIGZvbGxvdwor
ICovCisKKy8qCisgKiBNYXAgYSBzZXQgb2YgcGh5c2ljYWwgbWVtb3J5IHBhZ2VzIGludG8gdGhl
IGtlcm5lbCB2aXJ0dWFsCisgKiBhZGRyZXNzIHNwYWNlLiBSZXR1cm4gYSBwb2ludGVyIHRvIHdo
ZXJlIGl0IGlzIG1hcHBlZC4gVGhpcworICogcm91dGluZSBpcyBpbnRlbmRlZCB0byBiZSB1c2Vk
IGZvciBtYXBwaW5nIGRldmljZSBtZW1vcnksCisgKiBOT1QgcmVhbCBtZW1vcnkuCisgKi8KKwor
LyoKKyAqIE1hcCBhIHNldCBvZiBwaHlzaWNhbCBtZW1vcnkgcGFnZXMgaW50byB0aGUga2VybmVs
IHZpcnR1YWwKKyAqIGFkZHJlc3Mgc3BhY2UuIFJldHVybiBhIHBvaW50ZXIgdG8gd2hlcmUgaXQg
aXMgbWFwcGVkLiBUaGlzCisgKiByb3V0aW5lIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgZm9yIG1h
cHBpbmcgZGV2aWNlIG1lbW9yeSwKKyAqIE5PVCByZWFsIG1lbW9yeS4KKyAqCisgKiBVc2UgWEtQ
SFlTIHVuY2FjaGVkIGZvciA2NCBiaXQsIGFuZCBLU0VHMSB3aGVyZSBwb3NzaWJsZSBmb3IgMzIg
Yml0LgorICovCit2b2lkICoKK3BtYXBfbWFwZGV2KHZtX29mZnNldF90IHBhLCB2bV9zaXplX3Qg
c2l6ZSkKK3sKKwlyZXR1cm4gKCh2b2lkICopTUlQU19QSFlTX1RPX1hLUEhZU19VTkNBQ0hFRChw
YSkpOworfQorCit2b2lkCitwbWFwX3VubWFwZGV2KHZtX29mZnNldF90IHZhLCB2bV9zaXplX3Qg
c2l6ZSkKK3sKK30KKworLyoKKyAqIHBlcmZvcm0gdGhlIHBtYXAgd29yayBmb3IgbWluY29yZQor
ICovCitpbnQKK3BtYXBfbWluY29yZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgYWRkciwgdm1f
cGFkZHJfdCAqbG9ja2VkX3BhKQoreworCXB0X2VudHJ5X3QgKnB0ZXAsIHB0ZTsKKwl2bV9vZmZz
ZXRfdCBwYTsKKwl2bV9wYWdlX3QgbTsKKwlpbnQgdmFsOworCWJvb2xlYW5fdCBtYW5hZ2VkOwor
CisJUE1BUF9MT0NLKHBtYXApOworcmV0cnk6CisJcHRlcCA9IHBtYXBfcHRlKHBtYXAsIGFkZHIp
OworCXB0ZSA9IChwdGVwICE9IE5VTEwpID8gKnB0ZXAgOiAwOworCWlmICghcHRlX3Rlc3QoJnB0
ZSwgUFRFX1YpKSB7CisJCXZhbCA9IDA7CisJCWdvdG8gb3V0OworCX0KKwl2YWwgPSBNSU5DT1JF
X0lOQ09SRTsKKwlpZiAocHRlX3Rlc3QoJnB0ZSwgUFRFX0QpKQorCQl2YWwgfD0gTUlOQ09SRV9N
T0RJRklFRCB8IE1JTkNPUkVfTU9ESUZJRURfT1RIRVI7CisJcGEgPSBUTEJMT19QVEVfVE9fUEEo
cHRlKTsKKwltYW5hZ2VkID0gcGFnZV9pc19tYW5hZ2VkKHBhKTsKKwlpZiAobWFuYWdlZCkgewor
CQkvKgorCQkgKiBUaGlzIG1heSBmYWxzZWx5IHJlcG9ydCB0aGUgZ2l2ZW4gYWRkcmVzcyBhcwor
CQkgKiBNSU5DT1JFX1JFRkVSRU5DRUQuICBVbmZvcnR1bmF0ZWx5LCBkdWUgdG8gdGhlIGxhY2sg
b2YKKwkJICogcGVyLVBURSByZWZlcmVuY2UgaW5mb3JtYXRpb24sIGl0IGlzIGltcG9zc2libGUg
dG8KKwkJICogZGV0ZXJtaW5lIGlmIHRoZSBhZGRyZXNzIGlzIE1JTkNPUkVfUkVGRVJFTkNFRC4g
IAorCQkgKi8KKwkJbSA9IFBIWVNfVE9fVk1fUEFHRShwYSk7CisJCWlmICgobS0+ZmxhZ3MgJiBQ
R19SRUZFUkVOQ0VEKSAhPSAwKQorCQkJdmFsIHw9IE1JTkNPUkVfUkVGRVJFTkNFRCB8IE1JTkNP
UkVfUkVGRVJFTkNFRF9PVEhFUjsKKwl9CisJaWYgKCh2YWwgJiAoTUlOQ09SRV9NT0RJRklFRF9P
VEhFUiB8IE1JTkNPUkVfUkVGRVJFTkNFRF9PVEhFUikpICE9CisJICAgIChNSU5DT1JFX01PRElG
SUVEX09USEVSIHwgTUlOQ09SRV9SRUZFUkVOQ0VEX09USEVSKSAmJiBtYW5hZ2VkKSB7CisJCS8q
IEVuc3VyZSB0aGF0ICJQSFlTX1RPX1ZNX1BBR0UocGEpLT5vYmplY3QiIGRvZXNuJ3QgY2hhbmdl
LiAqLworCQlpZiAodm1fcGFnZV9wYV90cnlyZWxvY2socG1hcCwgcGEsIGxvY2tlZF9wYSkpCisJ
CQlnb3RvIHJldHJ5OworCX0gZWxzZQorb3V0OgorCQlQQV9VTkxPQ0tfQ09ORCgqbG9ja2VkX3Bh
KTsKKwlQTUFQX1VOTE9DSyhwbWFwKTsKKwlyZXR1cm4gKHZhbCk7Cit9CisKK3ZvaWQKK3BtYXBf
YWN0aXZhdGUoc3RydWN0IHRocmVhZCAqdGQpCit7CisJcG1hcF90IHBtYXAsIG9sZHBtYXA7CisJ
c3RydWN0IHByb2MgKnAgPSB0ZC0+dGRfcHJvYzsKKworCWNyaXRpY2FsX2VudGVyKCk7CisKKwlw
bWFwID0gdm1zcGFjZV9wbWFwKHAtPnBfdm1zcGFjZSk7CisJb2xkcG1hcCA9IFBDUFVfR0VUKGN1
cnBtYXApOworCisJaWYgKG9sZHBtYXApCisJCWF0b21pY19jbGVhcl8zMigmb2xkcG1hcC0+cG1f
YWN0aXZlLCBQQ1BVX0dFVChjcHVtYXNrKSk7CisJYXRvbWljX3NldF8zMigmcG1hcC0+cG1fYWN0
aXZlLCBQQ1BVX0dFVChjcHVtYXNrKSk7CisJcG1hcF9hc2lkX2FsbG9jKHBtYXApOworCWlmICh0
ZCA9PSBjdXJ0aHJlYWQpIHsKKwkJUENQVV9TRVQoc2VnYmFzZSwgcG1hcC0+cG1fc2VndGFiKTsK
KwkJbWlwc193cl9lbnRyeWhpKHBtYXAtPnBtX2FzaWRbUENQVV9HRVQoY3B1aWQpXS5hc2lkKTsK
Kwl9CisKKwlQQ1BVX1NFVChjdXJwbWFwLCBwbWFwKTsKKwljcml0aWNhbF9leGl0KCk7Cit9CisK
K3ZvaWQKK3BtYXBfc3luY19pY2FjaGUocG1hcF90IHBtLCB2bV9vZmZzZXRfdCB2YSwgdm1fc2l6
ZV90IHN6KQoreworfQorCisvKgorICoJSW5jcmVhc2UgdGhlIHN0YXJ0aW5nIHZpcnR1YWwgYWRk
cmVzcyBvZiB0aGUgZ2l2ZW4gbWFwcGluZyBpZiBhCisgKglkaWZmZXJlbnQgYWxpZ25tZW50IG1p
Z2h0IHJlc3VsdCBpbiBtb3JlIHN1cGVycGFnZSBtYXBwaW5ncy4KKyAqLwordm9pZAorcG1hcF9h
bGlnbl9zdXBlcnBhZ2Uodm1fb2JqZWN0X3Qgb2JqZWN0LCB2bV9vb2Zmc2V0X3Qgb2Zmc2V0LAor
ICAgIHZtX29mZnNldF90ICphZGRyLCB2bV9zaXplX3Qgc2l6ZSkKK3sKKwl2bV9vZmZzZXRfdCBz
dXBlcnBhZ2Vfb2Zmc2V0OworCisJaWYgKHNpemUgPCBOQlNFRykKKwkJcmV0dXJuOworCWlmIChv
YmplY3QgIT0gTlVMTCAmJiAob2JqZWN0LT5mbGFncyAmIE9CSl9DT0xPUkVEKSAhPSAwKQorCQlv
ZmZzZXQgKz0gcHRvYShvYmplY3QtPnBnX2NvbG9yKTsKKwlzdXBlcnBhZ2Vfb2Zmc2V0ID0gb2Zm
c2V0ICYgU0VHTUFTSzsKKwlpZiAoc2l6ZSAtICgoTkJTRUcgLSBzdXBlcnBhZ2Vfb2Zmc2V0KSAm
IFNFR01BU0spIDwgTkJTRUcgfHwKKwkgICAgKCphZGRyICYgU0VHTUFTSykgPT0gc3VwZXJwYWdl
X29mZnNldCkKKwkJcmV0dXJuOworCWlmICgoKmFkZHIgJiBTRUdNQVNLKSA8IHN1cGVycGFnZV9v
ZmZzZXQpCisJCSphZGRyID0gKCphZGRyICYgflNFR01BU0spICsgc3VwZXJwYWdlX29mZnNldDsK
KwllbHNlCisJCSphZGRyID0gKCgqYWRkciArIFNFR01BU0spICYgflNFR01BU0spICsgc3VwZXJw
YWdlX29mZnNldDsKK30KKworLyoKKyAqIAlJbmNyZWFzZSB0aGUgc3RhcnRpbmcgdmlydHVhbCBh
ZGRyZXNzIG9mIHRoZSBnaXZlbiBtYXBwaW5nIHNvCisgKiAJdGhhdCBpdCBpcyBhbGlnbmVkIHRv
IG5vdCBiZSB0aGUgc2Vjb25kIHBhZ2UgaW4gYSBUTEIgZW50cnkuCisgKiAJVGhpcyByb3V0aW5l
IGFzc3VtZXMgdGhhdCB0aGUgbGVuZ3RoIGlzIGFwcHJvcHJpYXRlbHktc2l6ZWQgc28KKyAqIAl0
aGF0IHRoZSBhbGxvY2F0aW9uIGRvZXMgbm90IHNoYXJlIGEgVExCIGVudHJ5IGF0IGFsbCBpZiBy
ZXF1aXJlZC4KKyAqLwordm9pZAorcG1hcF9hbGlnbl90bGIodm1fb2Zmc2V0X3QgKmFkZHIpCit7
CisJaWYgKCgqYWRkciAmIFBBR0VfU0laRSkgPT0gMCkKKwkJcmV0dXJuOworCSphZGRyICs9IFBB
R0VfU0laRTsKKwlyZXR1cm47Cit9CisKK0RCX1NIT1dfQ09NTUFORChwdGFibGUsIGRkYl9waWRf
ZHVtcCkKK3sKKwlwbWFwX3QgcG1hcDsKKwlzdHJ1Y3QgdGhyZWFkICp0ZCA9IE5VTEw7CisJc3Ry
dWN0IHByb2MgKnA7CisJaW50IGksIGosIGs7CisJdm1fcGFkZHJfdCBwYTsKKwl2bV9vZmZzZXRf
dCB2YTsKKworCWlmIChoYXZlX2FkZHIpIHsKKwkJdGQgPSBkYl9sb29rdXBfdGhyZWFkKGFkZHIs
IFRSVUUpOworCQlpZiAodGQgPT0gTlVMTCkgeworCQkJZGJfcHJpbnRmKCJJbnZhbGlkIHBpZCBv
ciB0aWQiKTsKKwkJCXJldHVybjsKKwkJfQorCQlwID0gdGQtPnRkX3Byb2M7CisJCWlmIChwLT5w
X3Ztc3BhY2UgPT0gTlVMTCkgeworCQkJZGJfcHJpbnRmKCJObyB2bXNwYWNlIGZvciBwcm9jZXNz
Iik7CisJCQlyZXR1cm47CisJCX0KKwkJCXBtYXAgPSB2bXNwYWNlX3BtYXAocC0+cF92bXNwYWNl
KTsKKwl9IGVsc2UKKwkJcG1hcCA9IGtlcm5lbF9wbWFwOworCisJcHJpbnRmKCJwbWFwOiVwIHNl
Z3RhYjolcCBhc2lkOiV4IGdlbmVyYXRpb246JXhcbiIsCisJICAgIHBtYXAsIHBtYXAtPnBtX3Nl
Z3RhYiwKKwkJCSAgICAgICBwbWFwLT5wbV9hc2lkWzBdLmFzaWQsCisJCQkgICAgICAgcG1hcC0+
cG1fYXNpZFswXS5nZW4pOworCWZvciAoaSA9IDA7IGkgPCBOUERFUEc7IGkrKykgeworCQlwZF9l
bnRyeV90ICpwZHBlOworCQlwdF9lbnRyeV90ICpwZGU7CisJCXB0X2VudHJ5X3QgcHRlOworCisJ
CXBkcGUgPSAocGRfZW50cnlfdCAqKXBtYXAtPnBtX3NlZ3RhYltpXTsKKwkJaWYgKHBkcGUgPT0g
TlVMTCkKKwkJCWNvbnRpbnVlOworCQlkYl9wcmludGYoIlslNGRdICVwXG4iLCBpLCBwZHBlKTsK
KwkJZm9yIChqID0gMDsgaiA8IE5QREVQRzsgaisrKSB7CisJCQlwZGUgPSAocHRfZW50cnlfdCAq
KXBkcGVbal07CisJCQlpZiAocGRlID09IE5VTEwpCisJCQkJY29udGludWU7CisJCQlkYl9wcmlu
dGYoIlx0WyU0ZF0gJXBcbiIsIGosIHBkZSk7CisJCQlmb3IgKGsgPSAwOyBrIDwgTlBURVBHOyBr
KyspIHsKKwkJCQlwdGUgPSBwZGVba107CisJCQkJaWYgKHB0ZSA9PSAwIHx8ICFwdGVfdGVzdCgm
cHRlLCBQVEVfVikpCisJCQkJCWNvbnRpbnVlOworCQkJCXBhID0gVExCTE9fUFRFX1RPX1BBKHB0
ZSk7CisJCQkJdmEgPSAoKHVfbG9uZylpIDw8IFNFR1NISUZUKSB8IChqIDw8IFBEUlNISUZUKSB8
IChrIDw8IFBBR0VfU0hJRlQpOworCQkJCXByaW50ZigiXHRcdFslMDRkXSB2YTogJXAgcHRlOiAl
OHggcGE6JWx4XG4iLAorCQkJCQkJaywgKHZvaWQgKil2YSwgcHRlLCAodV9sb25nKXBhKTsKKwor
I2lmIDAKKwkJCQkJCQltID0gUEhZU19UT19WTV9QQUdFKHBhKTsKKwkJCQlwcmludGYoIlx0XHRb
JTA0ZF0gdmE6ICVwLCBwdDogJXAsIGg6ICVkLCB3OiAlZCwgZjogMHgleFxuIiwKKwkJCQkgICAg
ICAgaywgKHZvaWQgKil2YSwgKHZvaWQgKilwYSwgIG0tPmhvbGRfY291bnQsCisJCQkJCQkJICAg
IG0tPndpcmVfY291bnQsCisJCQkJCQkJICAgIG0tPmZsYWdzKTsKKyNlbmRpZgorCQkJfQorCQl9
CisJfQorfQorCisKKyNpZiBkZWZpbmVkKERFQlVHKQorCitzdGF0aWMgdm9pZCBwYWRzKHBtYXBf
dCBwbSk7Cit2b2lkIHBtYXBfcHZkdW1wKHZtX29mZnNldF90IHBhKTsKKworLyogcHJpbnQgYWRk
cmVzcyBzcGFjZSBvZiBwbWFwKi8KK3N0YXRpYyB2b2lkCitwYWRzKHBtYXBfdCBwbSkKK3sKKwl1
bnNpZ25lZCB2YSwgaSwgajsKKwlwdF9lbnRyeV90ICpwdGVwOworCisJaWYgKHBtID09IGtlcm5l
bF9wbWFwKQorCQlyZXR1cm47CisJZm9yIChpID0gMDsgaSA8IE5QVEVQRzsgaSsrKQorCQlpZiAo
cG0tPnBtX3NlZ3RhYltpXSkKKwkJCWZvciAoaiA9IDA7IGogPCBOUFRFUEc7IGorKykgeworCQkJ
CXZhID0gKGkgPDwgU0VHU0hJRlQpICsgKGogPDwgUEFHRV9TSElGVCk7CisJCQkJaWYgKHBtID09
IGtlcm5lbF9wbWFwICYmIHZhIDwgS0VSTkJBU0UpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmIChw
bSAhPSBrZXJuZWxfcG1hcCAmJgorCQkJCSAgICB2YSA+PSBWTV9NQVhVU0VSX0FERFJFU1MpCisJ
CQkJCWNvbnRpbnVlOworCQkJCXB0ZXAgPSBwbWFwX3B0ZShwbSwgdmEpOworCQkJCWlmIChwbWFw
X3B0ZV92KHB0ZXApKQorCQkJCQlwcmludGYoIiV4OiV4ICIsIHZhLCAqKGludCAqKXB0ZXApOwor
CQkJfQorCit9CisKK3ZvaWQKK3BtYXBfcHZkdW1wKHZtX29mZnNldF90IHBhKQoreworCXJlZ2lz
dGVyIHB2X2VudHJ5X3QgcHY7CisJdm1fcGFnZV90IG07CisKKwlwcmludGYoInBhICV4IiwgcGEp
OworCW0gPSBQSFlTX1RPX1ZNX1BBR0UocGEpOworCWZvciAocHYgPSBUQUlMUV9GSVJTVCgmbS0+
bWQucHZfbGlzdCk7IHB2OworCSAgICBwdiA9IFRBSUxRX05FWFQocHYsIHB2X2xpc3QpKSB7CisJ
CXByaW50ZigiIC0+IHBtYXAgJXAsIHZhICV4IiwgKHZvaWQgKilwdi0+cHZfcG1hcCwgcHYtPnB2
X3ZhKTsKKwkJcGFkcyhwdi0+cHZfcG1hcCk7CisJfQorCXByaW50ZigiICIpOworfQorCisvKiBO
L0MgKi8KKyNlbmRpZgorCisKKy8qCisgKiBBbGxvY2F0ZSBUTEIgYWRkcmVzcyBzcGFjZSB0YWcg
KGNhbGxlZCBBU0lEIG9yIFRMQlBJRCkgYW5kIHJldHVybiBpdC4KKyAqIEl0IHRha2VzIGFsbW9z
dCBhcyBtdWNoIG9yIG1vcmUgdGltZSB0byBzZWFyY2ggdGhlIFRMQiBmb3IgYQorICogc3BlY2lm
aWMgQVNJRCBhbmQgZmx1c2ggdGhvc2UgZW50cmllcyBhcyBpdCBkb2VzIHRvIGZsdXNoIHRoZSBl
bnRpcmUgVExCLgorICogVGhlcmVmb3JlLCB3aGVuIHdlIGFsbG9jYXRlIGEgbmV3IEFTSUQsIHdl
IGp1c3QgdGFrZSB0aGUgbmV4dCBudW1iZXIuIFdoZW4KKyAqIHdlIHJ1biBvdXQgb2YgbnVtYmVy
cywgd2UgZmx1c2ggdGhlIFRMQiwgaW5jcmVtZW50IHRoZSBnZW5lcmF0aW9uIGNvdW50CisgKiBh
bmQgc3RhcnQgb3Zlci4gQVNJRCB6ZXJvIGlzIHJlc2VydmVkIGZvciBrZXJuZWwgdXNlLgorICov
CitzdGF0aWMgdm9pZAorcG1hcF9hc2lkX2FsbG9jKHBtYXApCisJcG1hcF90IHBtYXA7Cit7CisJ
aWYgKHBtYXAtPnBtX2FzaWRbUENQVV9HRVQoY3B1aWQpXS5hc2lkICE9IFBNQVBfQVNJRF9SRVNF
UlZFRCAmJgorCSAgICBwbWFwLT5wbV9hc2lkW1BDUFVfR0VUKGNwdWlkKV0uZ2VuID09IFBDUFVf
R0VUKGFzaWRfZ2VuZXJhdGlvbikpOworCWVsc2UgeworCQlpZiAoUENQVV9HRVQobmV4dF9hc2lk
KSA9PSBwbWFwX21heF9hc2lkKSB7CisJCQl0bGJfaW52YWxpZGF0ZV9hbGxfdXNlcihOVUxMKTsK
KwkJCVBDUFVfU0VUKGFzaWRfZ2VuZXJhdGlvbiwKKwkJCSAgICAoUENQVV9HRVQoYXNpZF9nZW5l
cmF0aW9uKSArIDEpICYgQVNJREdFTl9NQVNLKTsKKwkJCWlmIChQQ1BVX0dFVChhc2lkX2dlbmVy
YXRpb24pID09IDApIHsKKwkJCQlQQ1BVX1NFVChhc2lkX2dlbmVyYXRpb24sIDEpOworCQkJfQor
CQkJUENQVV9TRVQobmV4dF9hc2lkLCAxKTsJLyogMCBtZWFucyBpbnZhbGlkICovCisJCX0KKwkJ
cG1hcC0+cG1fYXNpZFtQQ1BVX0dFVChjcHVpZCldLmFzaWQgPSBQQ1BVX0dFVChuZXh0X2FzaWQp
OworCQlwbWFwLT5wbV9hc2lkW1BDUFVfR0VUKGNwdWlkKV0uZ2VuID0gUENQVV9HRVQoYXNpZF9n
ZW5lcmF0aW9uKTsKKwkJUENQVV9TRVQobmV4dF9hc2lkLCBQQ1BVX0dFVChuZXh0X2FzaWQpICsg
MSk7CisJfQorfQorCitpbnQKK3BhZ2VfaXNfbWFuYWdlZCh2bV9vZmZzZXRfdCBwYSkKK3sKKwl2
bV9vZmZzZXRfdCBwZ251bSA9IG1pcHNfYnRvcChwYSk7CisKKwlpZiAocGdudW0gPj0gZmlyc3Rf
cGFnZSkgeworCQl2bV9wYWdlX3QgbTsKKworCQltID0gUEhZU19UT19WTV9QQUdFKHBhKTsKKwkJ
aWYgKG0gPT0gTlVMTCkKKwkJCXJldHVybiAwOworCQlpZiAoKG0tPmZsYWdzICYgKFBHX0ZJQ1RJ
VElPVVMgfCBQR19VTk1BTkFHRUQpKSA9PSAwKQorCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiAw
OworfQorCitzdGF0aWMgaW50Citpbml0X3B0ZV9wcm90KHZtX29mZnNldF90IHZhLCB2bV9wYWdl
X3QgbSwgdm1fcHJvdF90IHByb3QpCit7CisJaW50IHJ3OworCisJaWYgKCEocHJvdCAmIFZNX1BS
T1RfV1JJVEUpKQorCQlydyA9ICBQVEVfViB8IFBURV9STyB8IFBURV9DX0NBQ0hFOworCWVsc2Ug
aWYgKChtLT5mbGFncyAmIChQR19GSUNUSVRJT1VTIHwgUEdfVU5NQU5BR0VEKSkgPT0gMCkgewor
CQlpZiAoKG0tPm1kLnB2X2ZsYWdzICYgUFZfVEFCTEVfTU9EKSAhPSAwKQorCQkJcncgPSAgUFRF
X1YgfCBQVEVfRCB8IFBURV9DX0NBQ0hFOworCQllbHNlCisJCQlydyA9IFBURV9WIHwgUFRFX0Nf
Q0FDSEU7CisJCXZtX3BhZ2VfZmxhZ19zZXQobSwgUEdfV1JJVEVBQkxFKTsKKwl9IGVsc2UKKwkJ
LyogTmVlZG4ndCBlbXVsYXRlIGEgbW9kaWZpZWQgYml0IGZvciB1bm1hbmFnZWQgcGFnZXMuICov
CisJCXJ3ID0gIFBURV9WIHwgUFRFX0QgfCBQVEVfQ19DQUNIRTsKKwlyZXR1cm4gKHJ3KTsKK30K
KworLyoKKyAqCXBtYXBfc2V0X21vZGlmaWVkOgorICoKKyAqCVNldHMgdGhlIHBhZ2UgbW9kaWZp
ZWQgYW5kIHJlZmVyZW5jZSBiaXRzIGZvciB0aGUgc3BlY2lmaWVkIHBhZ2UuCisgKi8KK3ZvaWQK
K3BtYXBfc2V0X21vZGlmaWVkKHZtX29mZnNldF90IHBhKQoreworCisJUEhZU19UT19WTV9QQUdF
KHBhKS0+bWQucHZfZmxhZ3MgfD0gKFBWX1RBQkxFX1JFRiB8IFBWX1RBQkxFX01PRCk7Cit9CisK
KworLyoKKyAqCVJvdXRpbmU6CXBtYXBfa2V4dHJhY3QKKyAqCUZ1bmN0aW9uOgorICoJCUV4dHJh
Y3QgdGhlIHBoeXNpY2FsIHBhZ2UgYWRkcmVzcyBhc3NvY2lhdGVkCisgKgkJdmlydHVhbCBhZGRy
ZXNzLgorICovCisgLyogUE1BUF9JTkxJTkUgKi8gdm1fb2Zmc2V0X3QKK3BtYXBfa2V4dHJhY3Qo
dm1fb2Zmc2V0X3QgdmEpCit7CisJaW50IG1hcHBlZDsKKworCS8qCisJICogRmlyc3QsIHRoZSBk
aXJlY3QtbWFwcGVkIHJlZ2lvbnMuCisJICovCisJaWYgKHZhID49IE1JUFNfWEtQSFlTX1NUQVJU
ICYmIHZhIDwgTUlQU19YS1BIWVNfRU5EKQorCQlyZXR1cm4gKE1JUFNfWEtQSFlTX1RPX1BIWVMo
dmEpKTsKKworCWlmICh2YSA+PSBNSVBTX0tTRUcwX1NUQVJUICYmIHZhIDwgTUlQU19LU0VHMF9F
TkQpCisJCXJldHVybiAoTUlQU19LU0VHMF9UT19QSFlTKHZhKSk7CisKKwlpZiAodmEgPj0gTUlQ
U19LU0VHMV9TVEFSVCAmJiB2YSA8IE1JUFNfS1NFRzFfRU5EKQorCQlyZXR1cm4gKE1JUFNfS1NF
RzFfVE9fUEhZUyh2YSkpOworCisJLyoKKwkgKiBVc2VyIHZpcnR1YWwgYWRkcmVzc2VzLgorCSAq
LworCWlmICh2YSA8IFZNX01BWFVTRVJfQUREUkVTUykgeworCQlwdF9lbnRyeV90ICpwdGVwOwor
CisJCWlmIChjdXJwcm9jICYmIGN1cnByb2MtPnBfdm1zcGFjZSkgeworCQkJcHRlcCA9IHBtYXBf
cHRlKCZjdXJwcm9jLT5wX3Ztc3BhY2UtPnZtX3BtYXAsIHZhKTsKKwkJCWlmIChwdGVwKSB7CisJ
CQkJcmV0dXJuIChUTEJMT19QVEVfVE9fUEEoKnB0ZXApIHwKKwkJCQkgICAgKHZhICYgUEFHRV9N
QVNLKSk7CisJCQl9CisJCQlyZXR1cm4gKDApOworCQl9CisJfQorCisJLyoKKwkgKiBTaG91bGQg
YmUga2VybmVsIHZpcnR1YWwgaGVyZSwgb3RoZXJ3aXNlIGZhaWwKKwkgKi8KKwltYXBwZWQgPSAo
dmEgPj0gTUlQU19LU0VHMl9TVEFSVCB8fCB2YSA8IE1JUFNfS1NFRzJfRU5EKTsKKwltYXBwZWQg
PSBtYXBwZWQgfHwgKHZhID49IE1JUFNfWEtTRUdfU1RBUlQgfHwgdmEgPCBNSVBTX1hLU0VHX0VO
RCk7CisJLyoKKwkgKiBLZXJuZWwgdmlydHVhbC4KKwkgKi8KKworCWlmIChtYXBwZWQpIHsKKwkJ
cHRfZW50cnlfdCAqcHRlcDsKKworCQkvKiBJcyB0aGUga2VybmVsIHBtYXAgaW5pdGlhbGl6ZWQ/
ICovCisJCWlmIChrZXJuZWxfcG1hcC0+cG1fYWN0aXZlKSB7CisJCQkvKiBJdCdzIGluc2lkZSB0
aGUgdmlydHVhbCBhZGRyZXNzIHJhbmdlICovCisJCQlwdGVwID0gcG1hcF9wdGUoa2VybmVsX3Bt
YXAsIHZhKTsKKwkJCWlmIChwdGVwKSB7CisJCQkJcmV0dXJuIChUTEJMT19QVEVfVE9fUEEoKnB0
ZXApIHwKKwkJCQkgICAgKHZhICYgUEFHRV9NQVNLKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuICgw
KTsKKwl9CisKKwlwYW5pYygiJXMgZm9yIHVua25vd24gYWRkcmVzcyBzcGFjZSAlcC4iLCBfX2Z1
bmNfXywgKHZvaWQgKil2YSk7Cit9CisKKwordm9pZCAKK3BtYXBfZmx1c2hfcHZjYWNoZSh2bV9w
YWdlX3QgbSkKK3sKKwlwdl9lbnRyeV90IHB2OworCisJaWYgKG0gIT0gTlVMTCkgeworCQlmb3Ig
KHB2ID0gVEFJTFFfRklSU1QoJm0tPm1kLnB2X2xpc3QpOyBwdjsKKwkgICAgCSAgICBwdiA9IFRB
SUxRX05FWFQocHYsIHB2X2xpc3QpKSB7CisJCQltaXBzX2RjYWNoZV93Ymludl9yYW5nZV9pbmRl
eChwdi0+cHZfdmEsIFBBR0VfU0laRSk7CisJCX0KKwl9Cit9CkluZGV4OiBzeXMvbWlwcy9taXBz
L2V4Y2VwdGlvbi5TCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHN5cy9taXBzL21pcHMvZXhjZXB0aW9uLlMJKHJl
dmlzaW9uIDIxMDY0NCkKKysrIHN5cy9taXBzL21pcHMvZXhjZXB0aW9uLlMJKHdvcmtpbmcgY29w
eSkKQEAgLTEzNyw3ICsxMzcsMTUgQEAKIAlQVFJfTAkJazEsIDAoazEpCQkJIzA4OiBrMT1zZWcg
ZW50cnkKIAlNRkMwCQlrMCwgTUlQU19DT1BfMF9CQURfVkFERFIJIzA5OiBrMD1iYWQgYWRkcmVz
cyAoYWdhaW4pCiAJYmVxCQlrMSwgemVybywgMmYJCQkjMGE6ID09MCAtLSBubyBwYWdlIHRhYmxl
Ci0Jc3JsCQlrMCwgUEFHRV9TSElGVCAtIDIJCSMwYjogazA9VlBOIChha2EgdmE+PjEwKQorI2lm
ZGVmIF9fbWlwc19uNjQKKwlQVFJfU1JMCQlrMCwgUERSU0hJRlQgLSBQVFJTSElGVAkJIyBrMD1W
UE4KKwlhbmRpCQlrMCwgazAsIFBUUk1BU0sJCQkjIGswPXBkZSBvZmZzZXQKKwlQVFJfQUREVQlr
MSwgazAsIGsxCQkJIyBrMT1wZGUgZW50cnkgYWRkcmVzcworCVBUUl9MCQlrMSwgMChrMSkJCQkj
IGsxPXBkZSBlbnRyeQorCU1GQzAJCWswLCBNSVBTX0NPUF8wX0JBRF9WQUREUgkjIGswPWJhZCBh
ZGRyZXNzIChhZ2FpbikKKwliZXEJCWsxLCB6ZXJvLCAyZgkJCSMgPT0wIC0tIG5vIHBhZ2UgdGFi
bGUKKyNlbmRpZgorCVBUUl9TUkwJCWswLCBQQUdFX1NISUZUIC0gMgkJIzBiOiBrMD1WUE4gKGFr
YSB2YT4+MTApCiAJYW5kaQkJazAsIGswLCAweGZmOAkJCSMwYzogazA9cGFnZSB0YWIgb2Zmc2V0
CiAJUFRSX0FERFUJazEsIGsxLCBrMAkJCSMwZDogazE9cHRlIGFkZHJlc3MKIAlsdwkJazAsIDAo
azEpCQkJIzBlOiBrMD1sbzAgcHRlCkBAIC04MzYsNiArODQ0LDE4IEBACiAJYmVxegkJazEsIDNm
CiAJbm9wCiAKKyNpZmRlZiBfX21pcHNfbjY0CisJTUZDMAkJazAsIE1JUFNfQ09QXzBfQkFEX1ZB
RERSCisJUFRSX1NSTAkJazAsIFBEUlNISUZUIC0gUFRSU0hJRlQJCSMgazA9cGRlIG9mZnNldCAo
YWxtb3N0KQorCWJlcQkJazEsIHplcm8sIE1pcHNLZXJuR2VuRXhjZXB0aW9uCSMgPT0wIC0tIG5v
IHBkZSB0YWIKKwlhbmRpCQlrMCwgazAsIFBUUk1BU0sJCQkjIGswPXBkZSBvZmZzZXQKKwlQVFJf
QUREVQlrMSwgazAsIGsxCQkJIyBrMT1wZGUgZW50cnkgYWRkcmVzcworCVBUUl9MCQlrMSwgMChr
MSkJCQkjIGsxPXBkZSBlbnRyeQorCisJLyogVmFsaWRhdGUgcGRlIHRhYmxlIHBvaW50ZXIuICAq
LworCWJlcXoJCWsxLCAzZgorCW5vcAorI2VuZGlmCiAJTUZDMAkJazAsIE1JUFNfQ09QXzBfQkFE
X1ZBRERSCSMgazA9YmFkIGFkZHJlc3MgKGFnYWluKQogCVBUUl9TUkwJCWswLCBQQUdFX1NISUZU
IC0gMgkJIyBrMD1WUE4KIAlhbmRpCQlrMCwgazAsIDB4ZmZjCQkJIyBrMD1wYWdlIHRhYiBvZmZz
ZXQKQEAgLTk5Niw2ICsxMDE2LDE0IEBACiAJUFRSX0wJCWsxLCAwKGsxKQkJCSMgazE9c2VnIGVu
dHJ5CiAJTUZDMAkJazAsIE1JUFNfQ09QXzBfQkFEX1ZBRERSCSMgazA9YmFkIGFkZHJlc3MgKGFn
YWluKQogCWJlcQkJazEsIHplcm8sIE1pcHNLZXJuR2VuRXhjZXB0aW9uCSMgPT0wIC0tIG5vIHBh
Z2UgdGFibGUKKyNpZmRlZiBfX21pcHNfbjY0CisJUFRSX1NSTAkJazAsIFBEUlNISUZUIC0gUFRS
U0hJRlQJCSMgazA9VlBOCisJYW5kaQkJazAsIGswLCBQVFJNQVNLCQkJIyBrMD1wZGUgb2Zmc2V0
CisJUFRSX0FERFUJazEsIGswLCBrMQkJCSMgazE9cGRlIGVudHJ5IGFkZHJlc3MKKwlQVFJfTAkJ
azEsIDAoazEpCQkJIyBrMT1wZGUgZW50cnkKKwlNRkMwCQlrMCwgTUlQU19DT1BfMF9CQURfVkFE
RFIJIyBrMD1iYWQgYWRkcmVzcyAoYWdhaW4pCisgIAliZXEJCWsxLCB6ZXJvLCBNaXBzS2Vybkdl
bkV4Y2VwdGlvbgkjID09MCAtLSBubyBwYWdlIHRhYmxlCisjZW5kaWYKIAlQVFJfU1JMCQlrMCwg
UEFHRV9TSElGVCAtIDIJCSMgazA9VlBOCiAJYW5kaQkJazAsIGswLCAweGZmOAkJCSMgazA9cGFn
ZSB0YWIgb2Zmc2V0CiAJUFRSX0FERFUJazEsIGsxLCBrMAkJCSMgazE9cHRlIGFkZHJlc3MKSW5k
ZXg6IHN5cy9taXBzL21pcHMvZ2VuYXNzeW0uYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBzeXMvbWlwcy9taXBz
L2dlbmFzc3ltLmMJKHJldmlzaW9uIDIxMDYzOCkKKysrIHN5cy9taXBzL21pcHMvZ2VuYXNzeW0u
Ywkod29ya2luZyBjb3B5KQpAQCAtOTMsNiArOTMsNyBAQAogQVNTWU0oUEFHRV9TSElGVCwgUEFH
RV9TSElGVCk7CiBBU1NZTShQQUdFX1NJWkUsIFBBR0VfU0laRSk7CiBBU1NZTShQQUdFX01BU0ss
IFBBR0VfTUFTSyk7CitBU1NZTShQRFJTSElGVCwgUERSU0hJRlQpOwogQVNTWU0oU0VHU0hJRlQs
IFNFR1NISUZUKTsKIEFTU1lNKE5QVEVQRywgTlBURVBHKTsKIEFTU1lNKFRERl9ORUVEUkVTQ0hF
RCwgVERGX05FRURSRVNDSEVEKTsK
--0016364166e9bf4987048ca37966--



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