RE: Less talk

[email protected] (Tels) Mon, 11 Feb 2002 00:21:27 +0100 (CET)
Newsgroups perl.perl6.internals.bignum
Organization none
Message-ID <[email protected]>
--_=XFMail.1.4.0.Linux:020211002047:666=_
Content-Type: text/plain; charset=iso-8859-1

-----BEGIN PGP SIGNED MESSAGE-----

Moin,

On 11-Feb-02 Alex Gough tried to scribble about:
>   5) I'd like very much to be able to back-port this into perl5 as it
>      lacks a decimal arithmetic library, 

What's wrong with Math::BigInt as a "decimal arithmetic library"?

Cheers,

Tels


- -- 
 perl -MDev::Bollocks -e'print Dev::Bollocks->rand(),"\n"'
 professionally expedite dynamic e-business

 http://bloodgate.com/perl       My current Perl projects
 PGP key available on http://bloodgate.com/tels.asc or via email 

-----BEGIN PGP SIGNATURE-----
Version: 2.6.3i
Charset: latin1

iQEVAwUBPGcAT3cLPEOTuEwVAQGqtgf/VPLFnTudg+c3PIy/OCVIAdBKhLTn3sDo
xRZaxhF586HsAaqdPfnOz66eE4exOBoo7FtQkiz9s6MLgsvntKl3Qfq1oYvjCwWt
uOfgNJ7LUmFI6T1NK6U99Bkm+DlKGHGXh7i0aDpAl45mM7C74JHyAN8ONKDI3ril
pRWPELF9Wp9VryDqWmHIPIup5ngt5sQ06RZWUJG6EPU3jJuj5yEBk13VcJ4vPNYu
gd/W65KYwGJNpcZPL1xjulimbqdtFb8vH8FIg5jzcG6pw/zpO+JSviJzmyZaMYw6
tFDlloY3VqWv6/sc/O99XLLaF42OOvLztc790kV8cXjcVwnPKY2Ysg==
=JjU3
-----END PGP SIGNATURE-----

--_=XFMail.1.4.0.Linux:020211002047:666=_
Content-Type: TEXT/PLAIN; charset=US-ASCII; name="bignum.c"
Content-Transfer-Encoding: BASE64
Content-ID: <[email protected]>
Content-Description: bignum.c
Content-Disposition: attachment; filename="bignum.c"

LyoNCiAgJElkJA0KDQogIGJpZ251bS5jIC0tIEEgZGVjaW1hbCBhcml0aG1l
dGljIGxpYnJhcnkgZm9yIFBlcmwgYW5kIFBhcnJvdA0KDQogIFRoaXMgY29k
ZSBpcyBpbnRlbmRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBwYXJyb3QgcHJv
amVjdCwgYW5kIGFsc28NCiAgZm9yIGJhY2twb3J0aW5nIGludG8gUGVybDUg
KGFzIGEgQ1BBTiBtb2R1bGUpLiAgQW55IHBhdGNoZXMgdG8gdGhpcw0KICBj
b2RlIHdpbGwgbGlrZWx5IGZpbmQgdGhlaXIgd2F5IGJhY2sgdG8gdGhlIE1v
dGhlciBTaGlwLCBhcyBpdCB3ZXJlLg0KDQogIFRoZXJlIGlzIGEgZ29vZCBk
ZWFsIG9mIHNjb3BlIGZvciBpbXByb3ZpbmcgdGhlIHNwZWVkIG9mIHRoaXMg
Y29kZSwNCiAgbW9kaWZpY2F0aW9ucyBhcmUgZW5jb3VyYWdlZCBhcyBsb25n
IGFzIHRoZSBleHRlbmRlZCByZWdyZXNzaW9ucyB0ZXN0cw0KICBjb250aW51
ZSB0byBwYXNzLg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBBbGV4IEdvdWdoLCAyMDAyDQoNCiAg
VGhpcyBjb2RlIGlzIGNvcHlyaWdodCBZZXQgQW5vdGhlciBTb2NpZXR5IDIw
MDIuDQoNCiovDQoNCi8qDQogIEl0IHdhcyBhIHZlcnkgaW5jb252ZW5pZW50
IGhhYml0IG9mIGtpdHRlbnMgKEFsaWNlIGhhZCBvbmNlIG1hZGUgdGhlDQog
IHJlbWFyaykgdGhhdCwgd2hhdGV2ZXIgeW91IHNheSB0byB0aGVtLCB0aGV5
IGFsd2F5cyBwdXJyLiAgIklmIHRoZXkNCiAgd291bGQgb25seSBwdXJyIGZv
ciBgeWVzLCcgYW5kIG1ldyBmb3IgYG5vLCcgb3IgYW55IHJ1bGUgb2YgdGhh
dA0KICBzb3J0LCIgc2hlIGhhZCBzYWlkLCAic28gdGhhdCBvbmUgY291bGQg
a2VlcCB1cCBhIGNvbnZlcnNhdGlvbiEgIEJ1dA0KICBob3cgY2FuIHlvdSB0
YWxrIHdpdGggYSBwZXJzb24gaWYgdGhleSBhbHdheXMgc2F5IHRoZSBzYW1l
IHRoaW5nPyINCg0KICBPbiB0aGlzIG9jY2FzaW9uIHRoZSBraXR0ZW4gb25s
eSBwdXJyZWQ6IGFuZCBpdCB3YXMgaW1wb3NzaWJsZSB0bw0KICBndWVzcyB3
aGV0aGVyIGl0IG1lYW50IGB5ZXMnIG9yIGBubycuDQoqLw0KDQojaW5jbHVk
ZSA8c3RkaW8uaD4NCiNpbmNsdWRlICJiaWdudW0uaCINCiNpbmNsdWRlIDxh
c3NlcnQuaD4NCg0KLyo9aGVhZDEgV2hlbiBpbiBwYXJyb3QNCg0KV2hlbiB0
aGUgbGlicmFyeSBpcyB1c2VkIHdpdGhpbiBwYXJyb3QsIGFsbCBjYWxscyBl
eHBlY3QgYW4gYWRkaXRpb25hbA0KZmlyc3QgYXJndW1lbnQgb2YgYW4gaW50
ZXJwcmV0ZXIsIGZvciB0aGUgcHVycG9zZXMgb2YgbWVtb3J5IGFsbG9jYXRp
b24sDQpzb21lIGludGVybmFsIG1hY3JvcyBkbyBub3QgKGdldGQvc2V0ZCBh
bmQgQ0hFQ0soT3xVKUZMT1cuDQoNCklmIHlvdSdyZSBiZWluZyB1c2VmdWwg
YW5kIGluc2VydGluZyBwcm9wZXIgcmFwaWQgZmlsbGlucywgc3RhcnQNCndp
dGggdGhlIEJOX2kqIG1ldGhvZHMsIGJ1dCBtYWtlIHN1cmUgYW55IGVycm9y
cyBjYW4gc3RpbGwgYmUNCnRocm93bi4NCg0KPWhlYWQyIFRPRE8NCg0KUGFy
cm90IHN0cmluZyBwbGF5aW5nLCBleGNlcHRpb24gcmFpc2luZw0KDQoqLw0K
DQovKiBBY2Nlc3MgZGlnaXRzLCBtYWNyb3MgYXNzdW1lIGxlbmd0aCBnaXZl
biAqLw0KLyo9aGVhZDEgQWNjZXNzIG1hY3Jvcw0KDQo9aGVhZDIgQk5fc2V0
ZChCSUdOVU0qLCBwb3MsIHZhbHVlKQ0KDQpTZXQgZGlnaXQgYXQgcG9zICh6
ZXJvIGlzIGxzZCkgdG8gdmFsdWUNCg0KPWhlYWQyIEJOX2dldGQoQklHTlVN
KiwgcG9zKQ0KDQpHZXQgdmFsdWUgb2YgZGlnaXQgYXQgcG9zLg0KDQo9Y3V0
Ki8NCiNkZWZpbmUgQk5fc2V0ZCh4LCB5LCB6KSBcDQogICAgKCB4LT5idWZm
ZXJbKHkpIC8gQk5fRF9QRVJfTklCXSA9IFwNCiAgICAgKCh6KSA8PCAoICh5
KSAlIEJOX0RfUEVSX05JQikqNCkgfCBcDQogICAgICh4LT5idWZmZXJbKHkp
IC8gQk5fRF9QRVJfTklCXSAmIH4oMTU8PCAoICh5KSAlIEJOX0RfUEVSX05J
QikqNCkpKSANCiNkZWZpbmUgQk5fZ2V0ZCh4LHkpIFwNCiAgICAoICh4LT5i
dWZmZXJbKHkpIC8gQk5fRF9QRVJfTklCXSA+PiBcDQogICAgICggKHkpICUg
Qk5fRF9QRVJfTklCKSo0KSAmIDE1ICkNCg0KI2RlZmluZSBDSEVDS19PVkVS
RkxPVyhleHBuLCBhZGQsIG1heCwgbXNnKSBcDQogICAgaWYgKG1heCAtIGV4
cG4gPCBhZGQpIHsgQk5fRVhDRVBUKFBJTlRfIEJOX09WRVJGTE9XLCBtc2cp
OyB9DQojZGVmaW5lIENIRUNLX1VOREVSRkxPVyhleHBuLCBzdWIsIG1pbiwg
bXNnKSBcDQogICAgaWYgKG1pbiAtIGV4cG4gPiAoLXN1YikpIHsgQk5fRVhD
RVBUKFBJTlRfIEJOX1VOREVSRkxPVywgbXNnKTsgfQ0KDQpjaGFyKiBsYXp5
Z2RicHJpbnQoQklHTlVNKiBmb28pIHsNCiAgY2hhcipzOw0KICBCTl90b19z
Y2llbnRpZmljX3N0cmluZyhmb28sICZzKTsNCiAgcmV0dXJuIHM7DQp9DQoN
Ci8qIEludGVybmFsIGZ1bmN0aW9ucyArIHR5cGVzICovDQp0eXBlZGVmIGVu
dW0gew0KICBCTl9ESVZfRElWSURFLA0KICBCTl9ESVZfRElWSU5ULA0KICBC
Tl9ESVZfUkVNQUlODQp9IEJOX0RJVl9FTlVNOw0Kdm9pZA0KQk5faWRpdmlk
ZSAoUElOVERfIEJJR05VTSogcmVzdWx0LCBCSUdOVU0gKm9uZSwgQklHTlVN
ICp0d28sIEJOX0NPTlRFWFQgKmNvbnRleHQsDQoJICAgIEJOX0RJVl9FTlVN
IG9wZXJhdGlvbiwgQklHTlVNKiByZW0pOw0KSU5UVkFMIEJOX3RvX3NjaWVu
Z19zdHJpbmcoUElOVERfIEJJR05VTSogYm4sIGNoYXIgKipkZXN0LCBpbnQg
ZW5nKTsNCnZvaWQgQk5fc3RyaXBfbGVhZF96ZXJvcyhQSU5URF8gQklHTlVN
KiB2aWN0aW0pOw0Kdm9pZCBCTl9zdHJpcF90YWlsX3plcm9zKFBJTlREXyBC
SUdOVU0qIHZpY3RpbSk7DQppbnQgQk5fcm91bmRfdXAoUElOVERfIEJJR05V
TSAqdmljdGltLCBCTl9DT05URVhUKiBjb250ZXh0KTsNCmludCBCTl9yb3Vu
ZF9kb3duKFBJTlREXyBCSUdOVU0gKnZpY3RpbSwgQk5fQ09OVEVYVCogY29u
dGV4dCk7DQp2b2lkIEJOX21ha2VfaW50ZWdlcihQSU5URF8gQklHTlVNKiBi
biwgQk5fQ09OVEVYVCogY29udGV4dCk7DQp2b2lkIEJOX3JlYWxseV96ZXJv
KFBJTlREXyBCSUdOVU0qIGJuKTsNCnZvaWQNCkJOX2FyaXRoX3NldHVwKFBJ
TlREXyBCSUdOVU0qIHJlc3VsdCwgQklHTlVNICpvbmUsIEJJR05VTSAqdHdv
LCBCTl9DT05URVhUICpjb250ZXh0KTsNCnZvaWQNCkJOX2FyaXRoX2NsZWFu
dXAoUElOVERfIEJJR05VTSogcmVzdWx0LCBCSUdOVU0gKm9uZSwgQklHTlVN
ICp0d28sIEJOX0NPTlRFWFQgKmNvbnRleHQpOw0Kdm9pZCBCTl9pYWRkKFBJ
TlREXyBCSUdOVU0qIHJlc3VsdCwgQklHTlVNICpvbmUsIEJJR05VTSAqdHdv
LCBCTl9DT05URVhUICpjb250ZXh0KTsNCnZvaWQgQk5faXN1YnRyYWN0KFBJ
TlREXyBCSUdOVU0qIHJlc3VsdCwgQklHTlVNICpvbmUsIEJJR05VTSAqdHdv
LCBCTl9DT05URVhUICpjb250ZXh0KTsNCnZvaWQgQk5fYWxpZ24oUElOVERf
IEJJR05VTSogb25lLCBCSUdOVU0qIHR3byk7DQppbnQgQk5fY29tcCAoUElO
VERfIEJJR05VTSAqb25lLCBCSUdOVU0gKnR3byk7DQoNCi8qPWhlYWQxIE1l
bW9yeSBNYW5hZ2VtZW50IGFuZCBCSUdOVU0gY3JlYXRpb24NCg0KPWN1dCov
DQoNCi8qPWhlYWQyIEJJR05VTSogQk5fbmV3KElOVFZBTCBsZW5ndGgpDQoN
CkNyZWF0ZSBhIG5ldyBCTi4gIGxlbmd0aCBpcyBudW1iZXIgb2YgSTxkZWNp
bWFsPiBkaWdpdHMgcmVxdWlyZWQuDQoNCj1jdXQqLw0KQklHTlVNKiBCTl9u
ZXcoUElOVERfIElOVFZBTCBsZW5ndGgpIHsNCiAgQklHTlVNKiBibjsNCiAg
Ym4gPSAoQklHTlVNKilCTl9hbGxvYyhQSU5UXyBzaXplb2YoQklHTlVNKSk7
DQogIGlmIChOVUxMID09IGJuKQ0KICAgIEJOX0VYQ0VQVChQSU5UXyBCTl9J
TlNVRkZJQ0lFTlRfU1RPUkFHRSwgIkNhbm5vdCBhbGxvY2F0ZSBuZXcgQmln
TnVtIik7DQogIA0KICBibi0+bmlicyA9IDEgKyBsZW5ndGggLyBCTl9EX1BF
Ul9OSUI7DQogIGJuLT5idWZmZXIgPSAoQk5fTklCKilCTl9hbGxvYyhQSU5U
XyBzaXplb2YoQk5fTklCKSAqIGJuLT5uaWJzKTsNCiAgaWYgKE5VTEwgPT0g
Ym4tPmJ1ZmZlcikNCiAgICBCTl9FWENFUFQoUElOVF8gQk5fSU5TVUZGSUNJ
RU5UX1NUT1JBR0UsICJDYW5ub3QgYWxsb2NhdGUgbmV3IEJpZ051bSIpOw0K
DQogIGJuLT5zaWduID0gMDsNCiAgYm4tPmV4cG4gPSAwOw0KICBibi0+ZGln
aXRzID0gMTsNCg0KICByZXR1cm4gYm47DQp9DQoNCi8qPWhlYWQyIGludCBC
Tl9ncm93KEJJR05VTSAqaW4sIElOVFZBTCBsZW5ndGgpDQoNCkdyb3dzIGlu
IHNvIHRoYXQgaXQgY2FuIGNvbnRhaW4gbGVuZ3RoIEk8ZGVjaW1hbD4gZGln
aXRzLg0KDQo9Y3V0Ki8NCmludCBCTl9ncm93KFBJTlREXyBCSUdOVU0gKmlu
LCBJTlRWQUwgbGVuZ3RoKSB7DQogIGFzc2VydChpbiAhPSBOVUxMKTsNCiAg
aWYgKGxlbmd0aCA8PSBpbi0+bmlicyAqIDgpDQogICAgcmV0dXJuIDA7DQoN
CiAgaWYgKGxlbmd0aCA+IEJOX01BWF9ESUdJVFMpDQogICAgQk5fRVhDRVBU
KFBJTlRfIEJOX09WRVJGTE9XLCAiQXR0ZW1wdCB0byBncm93IEJJR05VTSBi
ZXlvbmQgbGltaXRzIik7DQoNCiAgaW4tPm5pYnMgPSAxKyBsZW5ndGggLyBC
Tl9EX1BFUl9OSUI7DQogIGluLT5idWZmZXIgPSAoQk5fTklCKilCTl9yZWFs
bG9jKFBJTlRfIGluLT5idWZmZXIsIHNpemVvZihCTl9OSUIpKiAoaW4tPm5p
YnMpICk7DQogIGlmIChOVUxMPT1pbi0+YnVmZmVyKQ0KICAgIEJOX0VYQ0VQ
VChQSU5UXyBCTl9JTlNVRkZJQ0lFTlRfU1RPUkFHRSwgIkNhbm5vdCBncm93
IEJJR05VTSIpOw0KICByZXR1cm4gMDsNCn0NCg0KLyo9aGVhZDIgaW50IEJO
X2Rlc3Ryb3koQklHTlVNICpibikNCg0KRnJlZXMgdGhlIG1lbW9yeSB1c2Vk
IGJ5IHRoZSBCSUdOVU0uDQoNCj1jdXQqLw0KaW50IEJOX2Rlc3Ryb3koUElO
VERfIEJJR05VTSAqYm4pIHsNCiAgYXNzZXJ0KGJuIT1OVUxMKTsNCg0KICBC
Tl9mcmVlKFBJTlRfIGJuLT5idWZmZXIpOw0KICBCTl9mcmVlKFBJTlRfIGJu
KTsNCiAgcmV0dXJuIDA7DQp9DQoNCi8qPWhlYWQxIEdldHRpbmcgZGF0YSBp
bnRvIGEgYmlnbnVtDQoNCj1oZWFkMiBCTl9zZXRfZGlnaXQoQklHTlVNKiBi
biwgSU5UVkFMIHBvcywgaW50IHZhbHVlKQ0KDQpTZXRzIGRpZ2l0IGF0IHBv
cyB0byB2YWx1ZS4gIEV4dGVuZHMgaWYgbmVlZGVkLg0KDQo9Y3V0Ki8NCmlu
dCBCTl9zZXRfZGlnaXQoUElOVF8gQklHTlVNKiBibiwgSU5UVkFMIHBvcywg
aW50IHZhbHVlKSB7DQogIGFzc2VydChibiAhPSBOVUxMKTsNCiAgaWYgKHBv
cyA+IGJuLT5uaWJzICogQk5fRF9QRVJfTklCKQ0KICAgIEJOX2dyb3coYm4s
IHBvcyk7DQogIGFzc2VydCh2YWx1ZSA8IDEwKTsNCiAgQk5fc2V0ZChibiwg
cG9zLCB2YWx1ZSk7DQogIGlmIChibi0+ZGlnaXRzIDwgcG9zKzEpDQogICAg
Ym4tPmRpZ2l0cyA9IHBvcysxOw0KICByZXR1cm4gdmFsdWU7DQp9DQoNCi8q
PWhlYWQyIGludCBCTl9nZXRfZGlnaXQoQklHTlVNKiBibiwgSU5UVkFMIHBv
cykNCg0KR2V0IHRoZSB2YWx1ZSBvZiB0aGUgZGVjaW1hbCBkaWdpdCBhdCBw
b3MuDQoNCj1jdXQqLw0KaW50IEJOX2dldF9kaWdpdChQSU5URF8gQklHTlVN
KiBibiwgSU5UVkFMIHBvcykgew0KICBhc3NlcnQoYm4gIT0gTlVMTCk7DQog
IHJldHVybiBCTl9nZXRkKGJuLCBwb3MpOw0KfQ0KDQovKj1oZWFkMiBCSUdO
VU0gKkJOX2NvcHkoQklHTlVNKiBvbmUsIEJJR05VTSogdHdvKQ0KDQpDb3Bp
ZXMgdHdvIGludG8gb25lLCByZXR1cm5pbmcgb25lIGZvciBjb252ZW5pZW5j
ZS4NCg0KPWN1dCovDQpCSUdOVU0qIEJOX2NvcHkoUElOVERfIEJJR05VTSog
b25lLCBCSUdOVU0qIHR3bykgew0KICBhc3NlcnQob25lICE9IE5VTEwpOyBh
c3NlcnQodHdvICE9IE5VTEwpOw0KDQogIEJOX2dyb3coUElOVF8gdHdvLCBv
bmUtPmRpZ2l0cyk7DQogIG1lbWNweSgodm9pZCopb25lLT5idWZmZXIsICh2
b2lkKil0d28tPmJ1ZmZlciwNCgkgKDErdHdvLT5kaWdpdHMgLyBCTl9EX1BF
Ul9OSUIpICogc2l6ZW9mKEJOX05JQikpOw0KICBvbmUtPmRpZ2l0cyA9IHR3
by0+ZGlnaXRzOw0KICBvbmUtPmV4cG4gPSB0d28tPmV4cG47DQogIG9uZS0+
c2lnbiA9IHR3by0+c2lnbjsNCiAgcmV0dXJuIG9uZTsNCn0NCg0KLyo9aGVh
ZDIgQklHTlVNKiBCTl9uZXdfZnJvbV9pbnQoSU5UVkFMIHZhbHVlKQ0KDQpD
cmVhdGUgYSBuZXcgYmlnbnVtIGZyb20gYSAoc2lnbmVkKSBpbnRlZ2VyIHZh
bHVlIChJTlRWQUwpDQpXZSBhc3N1bWUgdGhhdCB0aGUgaW1wbGVtZW50YXRp
b24gbGltaXRzIGFyZSBzb21ld2hhdCBsYXJnZXIgdGhhbg0KdGhvc2UgcmVx
dWlyZWQgdG8gc3RvcmUgYSBzaW5nbGUgaW50ZWdlciBpbnRvIGEgYmlnbnVt
Lg0KDQo9Y3V0Ki8NCkJJR05VTSogQk5fbmV3X2Zyb21faW50KFBJTlREXyBJ
TlRWQUwgdmFsdWUpIHsNCiAgQklHTlVNICpuZXc7DQogIGludCBpLCBjdXJy
ZW50Ow0KICBuZXcgPSBCTl9uZXcoUElOVF8gQk5fRF9QRVJfSU5UKTsNCiAg
aWYgKHZhbHVlIDwgMCkgew0KICAgIG5ldy0+c2lnbiA9IDE7DQogICAgdmFs
dWUgPSAtdmFsdWU7DQogIH0NCiAgaSA9IDA7DQogIHdoaWxlICh2YWx1ZSkg
ew0KICAgIGN1cnJlbnQgPSB2YWx1ZSAlIDEwOw0KICAgIEJOX3NldGQobmV3
LCBpLCBjdXJyZW50KTsNCiAgICB2YWx1ZSA9IHZhbHVlIC8gMTA7DQogICAg
aSsrOw0KICB9DQogIG5ldy0+ZGlnaXRzID0gaTsgLyogQXMgQk5fbmV3IHJl
dHVybnMgYDAnLCB3aGljaCBoYXMgb25lIGRpZ2l0ICovDQogIG5ldy0+ZXhw
biA9IDA7DQogIHJldHVybiBuZXc7DQp9DQoNCi8qPWhlYWQyIEJOX1BSSU5U
X0RFQlVHDQoNCkR1bXAgdGhlIGJpZ251bSBmb3IgdGVzdGluZyAoc2hvdWxk
IHRoZSB0b18qX3N0cmluZyB2ZXJzaW9ucyBiZSBicm9rZWQpLg0KDQo9Y3V0
Ki8NCnZvaWQgQk5fUFJJTlRfREVCVUcgKEJJR05VTSAqYm4sIGNoYXIqIG1l
c2cpIHsNCiAgSU5UVkFMIGk7DQogIHByaW50ZigiJXM6IG5pYnMgJWkgZGln
aXRzICVpIHNpZ24gJWkgZXhwbiAlaSBcbiIsbWVzZywNCgkgYm4tPm5pYnMs
IGJuLT5kaWdpdHMsIGJuLT5zaWduLCBibi0+ZXhwbik7DQogIGZvciAoaT1i
bi0+ZGlnaXRzLTE7IGk+LTE7IGktLSkgew0KICAgIHByaW50ZigiJWQiLCBC
Tl9nZXRkKGJuLCBpKSk7DQogICAgaWYgKCEoaSU0KSkgcHJpbnRmKCIgIik7
DQogIH0NCiAgcHJpbnRmKCJcbiIpOw0KfQ0KDQovKj1oZWFkMiB2b2lkIEJO
X2V4Y2VwdGlvbihCTl9FWENFUFRJT05TIGV4Y2VwdGlvbikNCg0KVGhyb3cg
YGV4Y2VwdGlvbicuICBTaG91bGQgYmUgYWNjZXNzZWQgdmlhIGEgQk5fRVhD
RVBUIG1hY3JvDQoNCj1jdXQgKi8NCnZvaWQgQk5fZXhjZXB0aW9uKFBJTlRE
XyBCTl9FWENFUFRJT05TIGV4Y2VwdGlvbiwgY2hhciogbWVzc2FnZSkgew0K
ICBwcmludGYoIkV4Y2VwdGlvbiAlZCAlc1xuIiwgZXhjZXB0aW9uLCBtZXNz
YWdlKTsNCiAgYWJvcnQoKTsNCiAgZXhpdCgwKTsNCn0NCg0KLyo9aGVhZDEg
Q29udmVyc2lvbiB0byBhbmQgZnJvbSBzdHJpbmdzDQoNCj1oZWFkMiBJTlRW
QUwgQk5fdG9fc2NpZW50aWZpY19zdHJpbmcoQklHTlVNKiBibiwgY2hhciog
ZGVzdCkNCg0KQ29udmVydHMgYm4gaW50byBhIHNjaWVudGlmaWMgcmVwcmVz
ZW50YXRpb24sIHN0b3JlZCBpbiBkZXN0Lg0KDQo9aGVhZDIgSU5UVkFMIEJO
X3RvX2VuZ2luZWVyaW5nX3N0cmluZyhCSUdOVU0qIGJuLCBjaGFyKiBkZXN0
KQ0KDQpDb252ZXJ0cyBibiBpbnRvIGEgZW5naW5lZXJpbmcgcmVwcmVzZW50
YXRpb24sIHN0b3JlZCBpbiBkZXN0Lg0KDQpUaGVzZSBmdW5jdGlvbnMgcmV0
dXJuIGNoYXIqIHN0cmluZ3Mgb25seSwgcGFycm90IG1heSB3YW50IHRvDQpy
ZWltcGxlbWVudCB0aGVzZSBzbyB0aGF0IGxvY2FscyBhbmQgdGhlIGxpa2Ug
YXJlIG5pY2VseSBjb3BlZCB3aXRoLg0KDQo9Y3V0Ki8NCg0KSU5UVkFMIEJO
X3RvX3NjaWVudGlmaWNfc3RyaW5nKFBJTlREXyBCSUdOVU0qYm4sIGNoYXIg
KipkZXN0KSB7DQogIEJOX3RvX3NjaWVuZ19zdHJpbmcoUElOVF8gYm4sIGRl
c3QsIDApOw0KfQ0KSU5UVkFMIEJOX3RvX2VuZ2luZWVyaW5nX3N0cmluZyhQ
SU5URF8gQklHTlVNKmJuLCBjaGFyICoqZGVzdCkgew0KICBCTl90b19zY2ll
bmdfc3RyaW5nKFBJTlRfIGJuLCBkZXN0LCAxKTsNCn0NCg0KSU5UVkFMIEJO
X3RvX3NjaWVuZ19zdHJpbmcoUElOVERfIEJJR05VTSogYm4sIGNoYXIgKipk
ZXN0LCBpbnQgZW5nKSB7DQogIGNoYXIqIGN1cjsNCiAgSU5UVkFMIGFkal9l
eHAgPSAwOw0KICBJTlRWQUwgY3VyX2RpZyA9IDA7DQogIGFzc2VydChibiE9
TlVMTCk7DQogICpkZXN0ID0gKGNoYXIqKUJOX2FsbG9jKFBJTlRfIGJuLT5k
aWdpdHMgKyA1ICsgQk5fRF9QRVJfSU5UKTsNCiAgaWYgKGRlc3QgPT0gTlVM
TCkgew0KICAgIEJOX0VYQ0VQVChQSU5UXyBCTl9JTlNVRkZJQ0lFTlRfU1RP
UkFHRSwNCgkgICAgICAiQ2Fubm90IGNyZWF0ZSBidWZmZXIgdG8gaG9sZCBv
dXRwdXQgc3RyaW5nIik7DQogIH0NCg0KICBjdXIgPSAqZGVzdDsNCg0KICBh
ZGpfZXhwID0gYm4tPmRpZ2l0cyArIGJuLT5leHBuIC0xOw0KICAgLyogRm9y
IHZhbHVlcyBuZWFyIHRvIHplcm8sIHdlIGRvIG5vdCB1c2UgZXhwb25lbnRp
YWwgbm90YXRpb24gKi8NCiAgaWYgKGJuLT5leHBuIDw9IDAgJiYgYWRqX2V4
cCA+PSAtNikgew0KICAgIGlmIChibi0+c2lnbikgew0KICAgICAgKmN1cisr
ID0gJy0nOw0KICAgIH0NCiAgICAvKnBhZCB3aXRoIHplcm9zIGlmIGFwcHJv
cHJpYXRlLCBwbG9uayBhIHBvaW50IHdoZXJlIHdlIHdhbnQgaXQgKi8NCiAg
ICBpZiAoYm4tPmRpZ2l0cyArIGJuLT5leHBuIDw9IDApIHsNCiAgICAgIGlu
dCBpOw0KICAgICAgKmN1cisrID0gJzAnOw0KICAgICAgaWYgKGJuLT5kaWdp
dHMrYm4tPmV4cG48MCkgKmN1cisrID0gJy4nOyAvKlhYWDogbG9jYWxlcyAq
Lw0KICAgICAgZm9yIChpPTE7IGkgPCAtKGJuLT5kaWdpdHMgKyBibi0+ZXhw
bik7IGkrKykgKmN1cisrID0gJzAnOw0KICAgIH0NCiAgICBmb3IgKGN1cl9k
aWcgPSBibi0+ZGlnaXRzLTE7IGN1cl9kaWcgPi0xOyBjdXJfZGlnLS0pIHsN
CiAgICAgIGlmICgxK2N1cl9kaWcgKyBibi0+ZXhwbiA9PSAwKSAqY3VyKysg
PScuJzsNCiAgICAgICpjdXIrKyA9ICcwJyArIEJOX2dldGQoYm4sIGN1cl9k
aWcpOw0KICAgIH0NCiAgICAqY3VyID0gMDsNCiAgfQ0KICBlbHNlIHsgLyog
VXNlIGV4cG9uZW50aWFsIG5vdGF0aW9uLCBkaWZmZXJlbnQgZm9yIHNjaSBh
bmQgZW5nICovDQogICAgaWYgKGJuLT5zaWduKSAqY3VyKysgPSAnLSc7DQog
ICAgDQogICAgaWYgKGVuZykgew0KICAgICAgaW50IGRlZmljaXQ7DQogICAg
ICBpZiAoYWRqX2V4cCA8IDApIHsNCglkZWZpY2l0ID0gKC1hZGpfZXhwKSAl
IDM7DQoJaWYgKGRlZmljaXQgPT0gMSkgew0KCSAgZGVmaWNpdCA9IDI7DQoJ
ICBhZGpfZXhwIC09IDI7IA0KCX0NCgllbHNlIGlmIChkZWZpY2l0ID09IDIp
IHsNCgkgIGRlZmljaXQgPSAxOw0KCSAgYWRqX2V4cCAtPTE7DQoJfQ0KICAg
ICAgfQ0KICAgICAgZWxzZSB7DQoJZGVmaWNpdCA9IGFkal9leHAgJSAzOw0K
CWFkal9leHAgLT0gZGVmaWNpdDsNCiAgICAgIH0NCiAgICAgIC8qIHNvLCBk
ID0gMC4geC55eXl5LCBkPTEgeHgueSBkPTIgeHh4Lnl5eSBzcGVjaWFsIGNh
c2UgaWYgeHh4Ki8NCg0KICAgICAgKmN1cisrID0gJzAnICsgQk5fZ2V0ZChi
bixibi0+ZGlnaXRzLTEpOw0KICAgICAgaWYgKGRlZmljaXQgPT0gMCkgKmN1
cisrID0gJy4nOw0KDQogICAgICBpZiAoYm4tPmRpZ2l0cyA9PSAxKSB7DQoJ
KmN1cisrID0gJzAnOw0KCWlmIChkZWZpY2l0ID09IDEpICpjdXIrKyA9ICcu
JzsNCgkqY3VyKysgPSAnMCc7DQogICAgICB9DQogICAgICBlbHNlIGlmIChi
bi0+ZGlnaXRzID09IDIpIHsNCgkqY3VyKysgPSAnMCcgKyBCTl9nZXRkKGJu
LGJuLT5kaWdpdHMtMik7DQoJaWYgKGRlZmljaXQgPT0gMSkgKmN1cisrID0g
Jy4nOw0KCSpjdXIrKyA9ICcwJzsgDQogICAgICB9DQogICAgICBlbHNlIHsN
CgkqY3VyKysgPSAnMCcgKyBCTl9nZXRkKGJuLGJuLT5kaWdpdHMtMik7DQoJ
aWYgKGRlZmljaXQgPT0gMSkgKmN1cisrID0gJy4nOw0KCSpjdXIrKyA9ICcw
JyArIEJOX2dldGQoYm4sYm4tPmRpZ2l0cy0zKTsNCglpZiAoYm4tPmRpZ2l0
cyAhPSAzICYmIGRlZmljaXQgPT0gMikgKmN1cisrID0gJy4nOw0KDQoJZm9y
IChjdXJfZGlnPWJuLT5kaWdpdHMtNDsgY3VyX2RpZz4tMTsgY3VyX2RpZy0t
KSB7DQoJICAqY3VyKysgPSAnMCcgKyBCTl9nZXRkKGJuLCBjdXJfZGlnKTsN
Cgl9DQogICAgICB9DQoNCiAgICAgICpjdXIrKyA9ICdFJzsNCiAgICAgIHNw
cmludGYoY3VyLCAiJWkiLCBhZGpfZXhwKTsNCg0KICAgIH0NCiAgICBlbHNl
IHsgLyogU2NpZW50aWZpYyAqLw0KICAgICAgaWYgKGJuLT5kaWdpdHMgPT0g
MSkgew0KCSpjdXIrKyA9ICcwJysgQk5fZ2V0ZChibiwgMCk7DQogICAgICB9
DQogICAgICBlbHNlIHsNCgkqY3VyKysgPSAnMCcgKyBCTl9nZXRkKGJuLCBi
bi0+ZGlnaXRzLTEpOw0KCSpjdXIrKyA9ICcuJzsNCglmb3IgKGN1cl9kaWcg
PSBibi0+ZGlnaXRzLTI7IGN1cl9kaWcgPiAtMTsgY3VyX2RpZy0tKSB7DQoJ
ICAqY3VyKysgPSAnMCcgKyBCTl9nZXRkKGJuLCBjdXJfZGlnKTsNCgl9DQog
ICAgICB9DQogICAgICAqY3VyKysgPSAnRSc7IC8qIEV6YSBHb29kLCBFemEg
R29vZCAqLw0KICAgICAgc3ByaW50ZihjdXIsICIlaSIsIGFkal9leHApOyAg
ICAgIA0KICAgIH0NCiAgfQ0KDQogIHJldHVybiAwOw0KfQ0KDQovKj1oZWFk
MiBCSUdOVU0qIEJOX2Zyb21fc3RyaW5nKGNoYXIqIHN0cmluZykgDQoNCkNv
bnZlcnQgYSBzY2llbnRpZmljIHN0cmluZyB0byBhIEJJR05VTS4gIFRoaXMg
ZnVuY3Rpb24gZGVhbHMgZW50aXJlbHkNCndpdGggY29tbW9uLW9yLWdhcmRl
biBDIGJ5dGUgc3RyaW5ncywgc28gdGhlIGxpYnJhcnkgY2FuIHdvcmsNCmFu
eXdoZXJlLiAgQW5vdGhlciB2ZXJzaW9uIHdpbGwgYmUgZXZlbnR1YWxseSBy
ZXF1aXJlZCB0byBjb3BlIHdpdGgNCnRoZSBwYXJyb3Qgc3RyaW5nIGZ1bi4N
Cg0KVGhpcyBpcyB0aGUgSGlnaGx5IFBlZGFudGljIHN0cmluZyBjb252ZXJz
aW9uLg0KDQpEb2VzIG5vdCB5ZXQgY2hlY2sgZm9yIGV4cG9uZW50IG92ZXJm
bG93Lg0KDQo9Y3V0Ki8NCkJJR05VTSogQk5fZnJvbV9zdHJpbmcoUElOVERf
IGNoYXIqIHMyKSB7DQogIEJJR05VTSAqcmVzdWx0Ow0KICBCSUdOVU0gKnRl
bXA7DQoNCiAgSU5UVkFMIHBvcyA9IDA7DQogIElOVFZBTCBuZWdhdGl2ZSA9
IDA7DQogIElOVFZBTCBzZWVuX2RvdCA9IDA7DQogIElOVFZBTCBzZWVuX2Ug
PSAwOw0KICBJTlRWQUwgZXhwX3NpZ24gPSAwOw0KICBJTlRWQUwgaW5fZXhw
ID0gMDsNCiAgSU5UVkFMIGluX251bWJlciA9IDA7DQogIElOVFZBTCBleHBv
bmVudCA9IDA7DQogIElOVFZBTCBmYWtlX2V4cG9uZW50ID0gMDsNCiAgSU5U
VkFMIGkgPSAwOw0KDQogIHRlbXAgPSBCTl9uZXcoUElOVF8gMSk7DQogIA0K
ICB3aGlsZSAoczIpIHsgLyogY2hhcmdlIHRocm91Z2ggdGhlIHN0cmluZyAq
Lw0KICAgIGlmIChpc2RpZ2l0KCpzMikgJiYgIWluX2V4cCkgew0KICAgICAg
LyogV2UncmUgc29tZXdoZXJlIGluIHRoZSBtYWluIHN0cmluZyBvZiBudW1i
ZXJzICovDQogICAgICBpbl9udW1iZXIgPSAxOw0KICAgICAgQk5fZ3JvdyhQ
SU5UXyB0ZW1wLCBwb3MrMTApOw0KICAgICAgQk5fc2V0ZCh0ZW1wLCBwb3Ms
ICpzMiAtICcwJyk7IC8qIGJ5dGUgbWUhICovDQogICAgICBpZiAoc2Vlbl9k
b3QpIHsNCglmYWtlX2V4cG9uZW50LS07DQogICAgICB9DQogICAgfQ0KICAg
IGVsc2UgaWYgKGlzZGlnaXQoKnMyKSAmJiBpbl9leHApIHsNCiAgICAgIGV4
cG9uZW50ID0gMTAgKiBleHBvbmVudCArICgqczIgLSAnMCcpOyAvKlhYWDog
b3ZlcmZsb3cgY2hlY2sgKi8NCiAgICB9DQogICAgZWxzZSBpZiAoIWluX251
bWJlcikgew0KICAgICAgLyogd2UndmUgbm90IHlldCBzZWVuIGFueSBkaWdp
dHMgKi8NCiAgICAgIGlmICgqczIgPT0gJy0nKSB7DQoJbmVnYXRpdmUgPSAx
Ow0KICAgICAgfQ0KICAgICAgZWxzZSBpZiAoKnMyID09ICcuJykgew0KCXNl
ZW5fZG90ID0gMTsNCiAgICAgIH0NCiAgICAgIGVsc2Ugew0KCUJOX0VYQ0VQ
VChQSU5UXyBCTl9DT05WRVJTSU9OX1NZTlRBWCwgIkluY29ycmVjdCBudW1i
ZXIgZm9ybWF0Iik7DQogICAgICB9DQogICAgfQ0KICAgIGVsc2Ugew0KICAg
ICAgLyogd2UndmUgc2VlbiBzb21lIGRpZ2l0cywgYXJlIHdlIGRvbmUgeWV0
PyAqLw0KICAgICAgaWYgKCFzZWVuX2RvdCAmJiAqczIgPT0gJy4nICYmICFp
bl9leHApIHsNCglzZWVuX2RvdCA9IDE7DQogICAgICB9DQogICAgICBlbHNl
IGlmICghc2Vlbl9lICYmICgqczIgPT0gJ2UnIHx8ICpzMiA9PSAnRScpKSB7
DQoJc2Vlbl9lID0gMTsNCglpbl9leHAgPSAxOw0KICAgICAgfQ0KICAgICAg
ZWxzZSBpZiAoc2Vlbl9lICYmICFleHBfc2lnbikgew0KCWlmICgqczIgPT0g
JysnKSB7DQoJICBleHBfc2lnbiA9IDE7DQoJfQ0KCWVsc2UgaWYgKCpzMiA9
PSAnLScpIHsNCgkgIGV4cF9zaWduID0gLTE7DQoJfQ0KCWVsc2Ugew0KCSAg
Qk5fRVhDRVBUKFBJTlRfIEJOX0NPTlZFUlNJT05fU1lOVEFYLCAiSW5jb3Jy
ZWN0IG51bWJlciBmb3JtYXQiKTsNCgl9DQogICAgICB9DQogICAgICBlbHNl
IHsNCglCTl9FWENFUFQoUElOVF8gQk5fQ09OVkVSU0lPTl9TWU5UQVgsICJJ
bmNvcnJlY3QgbnVtYmVyIGZvcm1hdCIpOw0KICAgICAgfQ0KICAgIH0NCiAg
ICBzMisrOyAvKiByaW5zZSwgbGF0aGVyLi4uICovDQogIH0NCiAgaWYgKHBv
cz09MCkgew0KICAgIEJOX0VYQ0VQVChQSU5UXyBCTl9DT05WRVJTSU9OX1NZ
TlRBWCwgIm5vIGRpZ2l0cyBpbiBzdHJpbmciKTsNCiAgfQ0KDQoNCiAgdGVt
cC0+ZGlnaXRzID0gcG9zKzE7DQogIHJlc3VsdCA9IEJOX25ldyhwb3MrMSk7
DQoNCiAgZm9yIChpPTA7IGk8IHRlbXAtPmRpZ2l0czsgaSsrKSB7DQogICAg
Qk5fc2V0ZChyZXN1bHQsIGksIEJOX2dldGQodGVtcCwgdGVtcC0+ZGlnaXRz
LWktMSkpOw0KICB9DQogIA0KICByZXN1bHQtPnNpZ24gPSBuZWdhdGl2ZTsN
CiAgcmVzdWx0LT5kaWdpdHMgPSBwb3MrMTsNCg0KICBCTl9kZXN0cm95KFBJ
TlRfIHRlbXApOw0KDQogIGlmIChleHBfc2lnbiA9PSAtMSkgew0KICAgIHJl
c3VsdC0+ZXhwbiA9IGZha2VfZXhwb25lbnQgLSBleHBvbmVudDsNCiAgfQ0K
ICBlbHNlIHsNCiAgICByZXN1bHQtPmV4cG4gPSBmYWtlX2V4cG9uZW50ICsg
ZXhwb25lbnQ7DQogIH0NCg0KICByZXR1cm4gcmVzdWx0Ow0KfQ0KDQoNCi8q
PWhlYWQxIEFyaXRobWV0aWMgT3BlcmF0aW9ucw0KDQpUaGVzZSBkbyB3aGF0
IHRoZXkgc2F5IG9uIHRoZSB0aW4sIGlmIG5vIHByZWNpc2lvbiBpcyBzdXBw
bGllZCB0aGVuDQpzb21lIGFwcHJvcHJpYXRlIGdsb2JhbCB2ZXJzaW9uIGlz
IHVzZWQgaW5zdGVhZC4NCg0KPWhlYWQyIEhlbHBlciByb3V0aW5lcw0KDQo9
b3ZlciA0DQoNCj1pdGVtIEJOX3N0cmlwX3plcm9zKEJJR05VTSogdmljdGlt
KQ0KDQpSZW1vdmVzIGFueSB6ZXJvcyBiZWZvcmUgdGhlIG1zZCBhbmQgYWZ0
ZXIgdGhlIGxzZA0KDQo9Y3V0Ki8NCnZvaWQgQk5fc3RyaXBfbGVhZF96ZXJv
cyhQSU5URF8gQklHTlVNKiBibikgew0KICBJTlRWQUwgbXNkLCBpOw0KICAN
CiAgbXNkID0gYm4tPmRpZ2l0cy0xOw0KDQogIHdoaWxlICgwPT1CTl9nZXRk
KGJuLCBtc2QpICYmIG1zZCA+IDApIHsNCiAgICBtc2QtLTsNCiAgfQ0KDQog
IGJuLT5kaWdpdHMgLT0gYm4tPmRpZ2l0cy0xIC0gbXNkOw0KDQp9DQoNCi8q
PWl0ZW0gQk5fc3RyaXBfdGFpbF96ZXJvcyhCSUdOVU0gKnZpY3RpbSkNCg0K
UmVtb3ZlcyB0cmFpbGluZyB6ZXJvcyBhbmQgaW5jcmVhc2VzIHRoZSBleHBv
bmVudCBhcHByb3ByaWF0ZWx5Lg0KDQo9Y3V0Ki8NCg0Kdm9pZCBCTl9zdHJp
cF90YWlsX3plcm9zKFBJTlREXyBCSUdOVU0gKmJuKSB7DQogIElOVFZBTCBs
c2QsIGk7DQoNCiAgbHNkID0gMDsNCg0KICB3aGlsZSAoMD09Qk5fZ2V0ZChi
biwgbHNkKSkgew0KICAgIGxzZCsrOw0KICB9DQoNCiAgZm9yIChpPTA7IGk8
IGJuLT5kaWdpdHMgLWxzZDsgaSsrKSB7DQogICAgQk5fc2V0ZChibiwgaSwg
Qk5fZ2V0ZChibiwgaStsc2QpKTsNCiAgfQ0KICBDSEVDS19PVkVSRkxPVygg
Ym4tPmV4cG4sIGxzZCwgQk5fRVhQTl9NQVgsICJvdmVyZmxvdyB3aGVuIHN0
cmlwaW5nIHplcm9zIik7DQogIGJuLT5leHBuICs9IGxzZDsNCiAgYm4tPmRp
Z2l0cyAtPSBsc2Q7DQp9DQoNCi8qPWl0ZW0gQk5fbWFrZV9pbnRlZ2VyKEJJ
R05VTSogdmljdGltLCBCTl9DT05URVhUKiBjb250ZXh0KQ0KDQpDb252ZXJ0
IHRoZSBudW1iZXIgdG8gYSBwbGFpbiBpbnRlZ2VyICppZiogcHJlY2lzaW9u
IHN1Y2ggdGhhdCB0aGlzDQppcyBwb3NzaWJsZS4NCg0KPWN1dCovDQp2b2lk
IEJOX21ha2VfaW50ZWdlcihQSU5URF8gQklHTlVNKiBibiwgQk5fQ09OVEVY
VCogY29udGV4dCkgew0KICBpZiAoYm4tPmV4cG4gPiAwICYmIGJuLT5kaWdp
dHMgKyBibi0+ZXhwbiA8PSBjb250ZXh0LT5wcmVjaXNpb24pIHsNCiAgICBJ
TlRWQUwgaTsNCiAgICBCTl9ncm93KFBJTlRfIGJuLCBjb250ZXh0LT5wcmVj
aXNpb24pOw0KICAgIGZvciAoaT1ibi0+ZGlnaXRzLTE7IGk+PSAwOyBpLS0p
IHsNCiAgICAgIEJOX3NldGQoYm4sIGkrYm4tPmV4cG4sIEJOX2dldGQoYm4s
IGkpKTsNCiAgICB9DQogICAgZm9yIChpPTA7IGk8Ym4tPmV4cG47IGkrKykg
ew0KICAgICAgQk5fc2V0ZChibiwgaSwgMCk7DQogICAgfQ0KICAgIGJuLT5k
aWdpdHMgKz0gYm4tPmV4cG47DQogICAgYm4tPmV4cG4gPSAwOw0KICB9DQog
IGVsc2Ugew0KICAgIHJldHVybjsNCiAgfQ0KfQ0KDQovKj1pdGVtIEJOX3Jl
YWxseV96ZXJvKEJJR05VTSogdmljdGltKQ0KDQpTZXRzIGFueSBudW1iZXIg
d2hpY2ggc2hvdWxkIGJlIHplcm8gdG8gYSBjYW5ub25pY2FsIHplcm8uDQoN
Cj1jdXQqLw0Kdm9pZCBCTl9yZWFsbHlfemVybyhQSU5URF8gQklHTlVNKiBi
bikgew0KICBJTlRWQUwgaTsNCiAgZm9yIChpPTA7IGk8IGJuLT5kaWdpdHM7
IGkrKykNCiAgICBpZiAoQk5fZ2V0ZChibiwgaSkgIT0gMCkgcmV0dXJuOw0K
ICANCiAgYm4tPmRpZ2l0cyA9IDE7DQogIGJuLT5leHBuID0gMDsNCiAgYm4t
PnNpZ24gPSAwOw0KICByZXR1cm47DQp9DQoNCi8qPWl0ZW0gQk5fcm91bmQo
QklHTlVNICp2aWN0aW0sIEJOX0NPTlRFWFQqIGNvbnRleHQpDQoNClJvdW5k
cyB2aWN0aW0gYWNjb3JkaW5nIHRvIGNvbnRleHQ7DQoNCj1jdXQqLw0KDQpp
bnQgQk5fcm91bmQgKFBJTlREXyBCSUdOVU0gKmJuLCBCTl9DT05URVhUKiBj
b250ZXh0KSB7DQogIGFzc2VydChibiE9IE5VTEwpOw0KICBhc3NlcnQoY29u
dGV4dCAhPSBOVUxMKTsNCg0KICBCTl9zdHJpcF9sZWFkX3plcm9zKFBJTlRf
IGJuKTsNCiAgaWYgKGNvbnRleHQtPnByZWNpc2lvbiA8IDApIHJldHVybiAx
OyAvKiBBcyBpcyBhIGJpZ2ludCwgbm8gcm91bmRpbmcgKi8NCg0KICBpZiAo
Ym4tPmRpZ2l0cyA+IGNvbnRleHQtPnByZWNpc2lvbikgew0KICAgIGlmIChj
b250ZXh0LT5sb3N0X2RpZ2l0cykgew0KICAgICAgSU5UVkFMIGRpZ2l0Ow0K
ICAgICAgZm9yIChkaWdpdCA9IDA7IGRpZ2l0IDwgYm4tPmRpZ2l0cyAtIGNv
bnRleHQtPnByZWNpc2lvbjsgZGlnaXQrKykgew0KCWlmIChCTl9nZXRkKGJu
LCBkaWdpdCkgIT0gMCkNCgkgIEJOX0VYQ0VQVChQSU5UXyBCTl9MT1NUX0RJ
R0lUUywgImluZm9ybWF0aW9uIGxvc3Qgd2hpbGUgcm91bmRpbmciICk7DQog
ICAgICB9DQogICAgfQ0KDQogICAgaWYgKGNvbnRleHQtPnJvdW5kaW5nID09
IFJPVU5EX0RPV04pIHsNCiAgICAgIHJldHVybiBCTl9yb3VuZF9kb3duKFBJ
TlRfIGJuLCBjb250ZXh0KTsNCiAgICB9DQogICAgZWxzZSBpZiAoY29udGV4
dC0+cm91bmRpbmcgPT0gUk9VTkRfSEFMRl9VUCkgew0KICAgICAgaWYgKEJO
X2dldGQoYm4sIGJuLT5kaWdpdHMgLSBjb250ZXh0LT5wcmVjaXNpb24gLTEp
ID4gNCkgew0KCXJldHVybiBCTl9yb3VuZF91cChQSU5UXyBibiwgY29udGV4
dCk7DQogICAgICB9DQogICAgICBlbHNlIHsNCglyZXR1cm4gQk5fcm91bmRf
ZG93bihQSU5UXyBibiwgY29udGV4dCk7DQogICAgICB9DQogICAgfQ0KICAg
IGVsc2UgaWYgKGNvbnRleHQtPnJvdW5kaW5nID09IFJPVU5EX0hBTEZfRVZF
Tikgew0KDQogICAgICBpZiAoQk5fZ2V0ZChibiwgYm4tPmRpZ2l0cyAtIGNv
bnRleHQtPnByZWNpc2lvbiAtMSkgPiA1KSB7DQoJcmV0dXJuIEJOX3JvdW5k
X3VwKFBJTlRfIGJuLCBjb250ZXh0KTsNCiAgICAgIH0NCiAgICAgIGVsc2Ug
aWYgKEJOX2dldGQoYm4sIGJuLT5kaWdpdHMgLSBjb250ZXh0LT5wcmVjaXNp
b24gLTEpIDwgNSkgew0KCXJldHVybiBCTl9yb3VuZF9kb3duKFBJTlRfIGJu
LCBjb250ZXh0KTsNCiAgICAgIH0NCiAgICAgIGVsc2Ugew0KCUlOVFZBTCBp
ID0gYm4tPmRpZ2l0cyAtIGNvbnRleHQtPnByZWNpc2lvbiAtMjsNCglpZiAo
aSA8IDApIHJldHVybiBCTl9yb3VuZF91cChQSU5UXyBibiwgY29udGV4dCk7
DQoJd2hpbGUgKGk+PTApIHsNCgkgIGlmIChCTl9nZXRkKGJuLCBpKSAhPSAw
KSByZXR1cm4gQk5fcm91bmRfdXAoUElOVF8gYm4sIGNvbnRleHQpOw0KCSAg
aS0tOw0KCX0NCglzd2l0Y2goQk5fZ2V0ZChibiwgYm4tPmRpZ2l0cy1jb250
ZXh0LT5wcmVjaXNpb24pKSB7DQoJY2FzZSAwIDoNCgljYXNlIDIgOg0KCWNh
c2UgNCA6DQoJY2FzZSA2IDoNCgljYXNlIDggOg0KCSAgcmV0dXJuIEJOX3Jv
dW5kX2Rvd24oUElOVF8gYm4sIGNvbnRleHQpOw0KCWRlZmF1bHQ6DQoJICBy
ZXR1cm4gQk5fcm91bmRfdXAoUElOVF8gYm4sIGNvbnRleHQpOw0KCX0NCiAg
ICAgIH0NCg0KICAgIH0NCiAgICBCTl9FWENFUFQoUElOVF8gQk5fSU5WQUxJ
RF9PUEVSQVRJT04sICJVbmtub3duIHJvdW5kaW5nIGF0dGVtcHRlZCIpOw0K
ICB9DQogIHJldHVybjsNCn0NCg0KaW50IEJOX3JvdW5kX3VwKFBJTlREXyBC
SUdOVU0gKmJuLCBCTl9DT05URVhUKiBjb250ZXh0KSB7DQogIElOVFZBTCBp
LCBjYXJyeTsNCg0KICBjYXJyeSA9IDE7DQogIGZvciAoaSA9IGJuLT5kaWdp
dHMgLSBjb250ZXh0LT5wcmVjaXNpb247IGk8IGJuLT5kaWdpdHM7IGkrKykg
ew0KICAgIGNhcnJ5ICs9IEJOX2dldGQoYm4sIGkpOw0KICAgIEJOX3NldGQo
Ym4sIGktYm4tPmRpZ2l0cyArIGNvbnRleHQtPnByZWNpc2lvbiwgY2Fycnkl
MTApOw0KICAgIGNhcnJ5ID0gY2FycnkgLyAxMDsNCiAgfQ0KICBpZiAoY2Fy
cnkpIHsNCiAgICBJTlRWQUwgZXh0cmEgPSBibi0+ZGlnaXRzIC0gY29udGV4
dC0+cHJlY2lzaW9uOw0KICAgIEJOX3NldGQoYm4sIGNvbnRleHQtPnByZWNp
c2lvbiwgY2FycnkpOw0KICAgIENIRUNLX09WRVJGTE9XKGJuLT5leHBuLCBl
eHRyYSwgQk5fRVhQTl9NQVgsDQoJCSAgICJvdmVyZmxvdyB3aGlsZSByb3Vu
ZGluZyIpOw0KICAgIGJuLT5leHBuICs9IGV4dHJhOw0KICAgIGJuLT5kaWdp
dHMgPSBjb250ZXh0LT5wcmVjaXNpb24gKzE7DQogICAgcmV0dXJuIEJOX3Jv
dW5kKFBJTlRfIGJuLCBjb250ZXh0KTsNCiAgfQ0KICBlbHNlIHsNCiAgICBJ
TlRWQUwgZXh0cmEgPSBibi0+ZGlnaXRzIC0gY29udGV4dC0+cHJlY2lzaW9u
Ow0KICAgIENIRUNLX09WRVJGTE9XKGJuLT5leHBuLCBleHRyYSwgQk5fRVhQ
Tl9NQVgsDQoJCSAgICJvdmVyZmxvdyB3aGlsZSByb3VuZGluZyIpOw0KICAg
IGJuLT5leHBuICs9IGV4dHJhOw0KICAgIGJuLT5kaWdpdHMgPSBjb250ZXh0
LT5wcmVjaXNpb247DQogICAgcmV0dXJuOw0KICB9DQp9DQoNCmludCBCTl9y
b3VuZF9kb3duKFBJTlRfIEJJR05VTSAqYm4sIEJOX0NPTlRFWFQqIGNvbnRl
eHQpIHsNCiAgSU5UVkFMIGkgPTA7DQogIElOVFZBTCBleHRyYTsNCg0KICBm
b3IgKGk9MDsgaTxjb250ZXh0LT5wcmVjaXNpb247IGkrKykgew0KICAgIGlu
dCB0ZW1wID0gQk5fZ2V0ZChibiwgaStibi0+ZGlnaXRzIC0gY29udGV4dC0+
cHJlY2lzaW9uKTsNCiAgICBCTl9zZXRkKGJuLCBpLCB0ZW1wKTsNCiAgfQ0K
ICBleHRyYSA9IGJuLT5kaWdpdHMgLSBjb250ZXh0LT5wcmVjaXNpb247DQog
IENIRUNLX09WRVJGTE9XKGJuLT5leHBuLCBleHRyYSwgQk5fRVhQTl9NQVgs
DQoJCSAib3ZlcmZsb3cgd2hpbGUgcm91bmRpbmciKTsNCiAgYm4tPmV4cG4g
Kz0gZXh0cmE7DQogIGJuLT5kaWdpdHMgPSBjb250ZXh0LT5wcmVjaXNpb247
DQoNCiAgcmV0dXJuOw0KfQ0KDQovKj1iYWNrKi8NCg0KLyo9aGVhZDEgQXJp
dGhtZXRpYyBvcGVyYXRpb25zIA0KDQpPcGVyYXRpb25zIGFyZSBwZXJmb3Jt
ZWQgbGlrZSB0aGlzOg0KDQo9b3ZlciA0DQoNCj1pdGVtIFJvdW5kaW5nDQoN
CkJvdGggb3BlcmFuZHMgYXJlIHJvdW5kZWQgdG8gaGF2ZSBubyBtb3JlIHRo
YW4gY29udGV4dC0+cHJlY2lzaW9uIGRpZ2l0cy4NCg0KPWl0ZW0gQ29tcHV0
YXRpb24NCg0KVGhlIG9wZXJhdGlvbiBpcyBjb21wdXRlZC4NCg0KPWl0ZW0g
Um91bmRpbmcgb2YgcmVzdWx0DQoNClRoZSByZXN1bHQgaXMgdGhlbiByb3Vu
ZGVkIHRvIGNvbnRleHQtPnByZWNpc2lvbiBkaWdpdHMuDQoNCj1pdGVtIENv
bnZlcnNpb24gdG8gemVybyBhbmQgaW50ZWdlcmlzYXRpb24NCg0KSWYgdGhl
IHJlc3VsdCBpcyBlcXVhbCB0byB6ZXJvLCBpdCBpcyBtYWRlIGV4YWN0bHkg
emVyby4NCg0KV2hlcmUgdGhlIGxlbmd0aCBvZiB0aGUgY29lZmZpY2llbnQg
KyB0aGUgZXhwb25lbnQgb2YgdGhlIHJlc3VsdCBpcw0KbGVzcyB0aGFuIGNv
bnRleHQtPnByZWNpc2lvbiwgdGhlIHJlc3VsdCBpcyBjb252ZXJ0ZWQgaW50
byBhbiBpbnRlZ2VyLg0KDQo9YmFjaw0KDQpUaGUgZ2VuZXJhbCBmb3JtIGZv
ciBhbGwgYXJpdGhtZXRpYyBvcGVyYXRpb25zIGlzDQoNCiB2b2lkIEJOX29w
ZXJhdGlvbihyZXN1bHQsIG9uZSwgdHdvLCBjb250ZXh0KQ0KDQo9Y3V0Ki8N
Cg0KLyo9aGVhZDIgQk5fYXJpdGhfc2V0dXAocmVzdWx0LCBvbmUsIHR3bywg
Y29udGV4dCkNCg0Kcm91bmRzIG9uZSBhbmQgdHdvIHJlYWR5IGZvciBhcml0
aG1ldGljIG9wZXJhdGlvbi4NCg0KPWN1dCovDQp2b2lkDQpCTl9hcml0aF9z
ZXR1cChQSU5URF8gQklHTlVNKiByZXN1bHQsIEJJR05VTSAqb25lLCBCSUdO
VU0gKnR3bywgQk5fQ09OVEVYVCAqY29udGV4dCkgew0KICBCTl9zdHJpcF9s
ZWFkX3plcm9zKFBJTlRfIG9uZSk7DQogIEJOX3N0cmlwX2xlYWRfemVyb3Mo
UElOVF8gdHdvKTsNCiAgQk5fcm91bmQoUElOVF8gb25lLCBjb250ZXh0KTsN
CiAgQk5fcm91bmQoUElOVF8gdHdvLCBjb250ZXh0KTsNCn0NCg0KLyo9aGVh
ZDIgQk5fYXJpdGhfY2xlYW51cChyZXN1bHQsIG9uZSwgdHdvLCBjb250ZXh0
KQ0KDQpSb3VuZHMgcmVzdWx0LCBvbmUsIHR3bywgY2hlY2tzIGZvciB6ZXJv
bmVzcyBhbmQgbWFrZXMgaW50ZWdlcnMuDQoNCj1jdXQqLw0Kdm9pZA0KQk5f
YXJpdGhfY2xlYW51cChQSU5URF8gQklHTlVNKiByZXN1bHQsIEJJR05VTSAq
b25lLCBCSUdOVU0gKnR3bywgQk5fQ09OVEVYVCAqY29udGV4dCkgew0KICBC
Tl9yb3VuZChQSU5UXyBvbmUsIGNvbnRleHQpOw0KICBCTl9yb3VuZChQSU5U
XyB0d28sIGNvbnRleHQpOw0KICBCTl9zdHJpcF9sZWFkX3plcm9zKFBJTlRf
IHJlc3VsdCk7DQogIEJOX3JvdW5kKFBJTlRfIHJlc3VsdCwgY29udGV4dCk7
DQogIEJOX3JlYWxseV96ZXJvKFBJTlRfIHJlc3VsdCk7DQogIEJOX21ha2Vf
aW50ZWdlcihQSU5UXyByZXN1bHQsIGNvbnRleHQpOw0KfQ0KDQovKj1oZWFk
MiBCTl9hbGlnbihCSUdOVU0qIG9uZSwgQklHTlVNKiB0d28pIA0KDQpBZGRz
IHplcm8gZGlnaXRzIHNvIHRoYXQgZGVjaW1hbCBwb2ludHMgb2YgZWFjaCBu
dW1iZXIgYXJlIGF0IHRoZSBzYW1lDQpwbGFjZS4NCg0KPWN1dCovDQp2b2lk
IEJOX2FsaWduKFBJTlREXyBCSUdOVU0qIG9uZSwgQklHTlVNKiB0d28pIHsN
CiAgSU5UVkFMIGk7DQogIElOVFZBTCBkaWZmOw0KDQogIGRpZmYgPSBvbmUt
PmV4cG4gLSB0d28tPmV4cG47DQogIA0KICBpZiAoZGlmZiA9PSAwKSB7DQog
ICAgaWYgKG9uZS0+ZGlnaXRzIDwgdHdvLT5kaWdpdHMpIHsNCiAgICAgIEJJ
R05VTSAqdGVtcCA9IG9uZTsNCiAgICAgIG9uZSA9IHR3bzsNCiAgICAgIHR3
byA9IHRlbXA7DQogICAgfQ0KDQogICAgQk5fZ3JvdyhQSU5UXyB0d28sIG9u
ZS0+ZGlnaXRzKTsNCiAgICBmb3IgKGk9dHdvLT5kaWdpdHM7IGk8b25lLT5k
aWdpdHM7IGkrKykgew0KICAgICAgQk5fc2V0ZCh0d28sIGksIDApOw0KICAg
IH0NCiAgICB0d28tPmRpZ2l0cyA9IG9uZS0+ZGlnaXRzOw0KICB9DQogIGVs
c2UgaWYgKGRpZmYgPiAwKSB7IC8qIG9uZSA+IHR3bywgcHV0IDBzIGF0IHN0
YXJ0IG9mIHR3bywgZW5kIG9mIG9uZSAqLw0KICAgIEJOX2dyb3coUElOVF8g
b25lLCBvbmUtPmRpZ2l0cyArIGRpZmYpOw0KICAgIEJOX2dyb3coUElOVF8g
dHdvLCB0d28tPmRpZ2l0cyArIGRpZmYpOw0KDQogICAgZm9yIChpPXR3by0+
ZGlnaXRzOyBpPG9uZS0+ZGlnaXRzOyBpKyspIHsNCiAgICAgIEJOX3NldGQo
dHdvLCBpLCAwKTsNCiAgICB9DQogICAgdHdvLT5kaWdpdHMgPSBvbmUtPmRp
Z2l0czsNCiAgICBmb3IgKGk9b25lLT5kaWdpdHMgLTE7IGkgPiAtMTsgaS0t
KSB7DQogICAgICBCTl9zZXRkKG9uZSwgaSArIGRpZmYsIEJOX2dldGQob25l
LCBpKSk7DQogICAgfQ0KICAgIGZvciAoaT0wOyBpPGRpZmY7IGkrKykgew0K
ICAgICAgQk5fc2V0ZChvbmUsIGksIDApOw0KICAgIH0NCiAgICBDSEVDS19V
TkRFUkZMT1cob25lLT5leHBuLCBkaWZmLCBCTl9FWFBOX01JTiwgInVuZGVy
ZmxvdyBpbiBhbGlnbiIpOw0KICAgIG9uZS0+ZXhwbiAtPSBkaWZmOw0KICAg
IG9uZS0+ZGlnaXRzID0gdHdvLT5kaWdpdHMgPSBvbmUtPmRpZ2l0cyArIGRp
ZmY7DQogIH0NCiAgZWxzZSB7IC8qIG9uZSA8IHR3bywgcHV0IDBzIGF0IHN0
YXJ0IG9mIG9uZSwgZW5kIG9mIHR3byAqLw0KICAgIEJOX2dyb3coUElOVF8g
dHdvLCB0d28tPmV4cG4gKyBkaWZmKTsNCiAgICBCTl9ncm93KFBJTlRfIG9u
ZSwgdHdvLT5leHBuICsgZGlmZik7DQoNCiAgICBmb3IgKGk9b25lLT5kaWdp
dHM7IGk8dHdvLT5kaWdpdHM7IGkrKykgew0KICAgICAgQk5fc2V0ZChvbmUs
IGksIDApOw0KICAgIH0NCiAgICBvbmUtPmRpZ2l0cyA9IHR3by0+ZGlnaXRz
Ow0KICAgIGZvciAoaT10d28tPmRpZ2l0cyAtMTsgaSA+IC0xOyBpLS0pIHsN
CiAgICAgIEJOX3NldGQodHdvLCBpICsgZGlmZiwgQk5fZ2V0ZCh0d28sIGkp
KTsNCiAgICB9DQogICAgZm9yIChpPTA7IGk8ZGlmZjsgaSsrKSB7DQogICAg
ICBCTl9zZXRkKHR3bywgaSwgMCk7DQogICAgfQ0KICAgIENIRUNLX1VOREVS
RkxPVyh0d28tPmV4cG4sIGRpZmYsIEJOX0VYUE5fTUlOLCAidW5kZXJmbG93
IGluIGFsaWduIik7DQogICAgdHdvLT5leHBuIC09IGRpZmY7DQogICAgdHdv
LT5kaWdpdHMgPSBvbmUtPmRpZ2l0cyA9IHR3by0+ZGlnaXRzICsgZGlmZjsN
CiAgfQ0KfQ0KLyo9aGVhZDIgQk5fYWRkKEJJR05VTSogcmVzdWx0LCBCSUdO
VU0gKm9uZSwgQklHTlVNICp0d28sIEJOX0NPTlRFWFQgKmNvbnRleHQpDQoN
Cj1jdXQqLw0Kdm9pZA0KQk5fYWRkKFBJTlREXyBCSUdOVU0qIHJlc3VsdCwg
QklHTlVNICpvbmUsIEJJR05VTSAqdHdvLCBCTl9DT05URVhUICpjb250ZXh0
KSB7DQogIEJOX2FyaXRoX3NldHVwKFBJTlRfIHJlc3VsdCwgb25lLCB0d28s
IGNvbnRleHQpOw0KDQogIC8qIERvIHdlIG1lYW4gYWRkLCBvciBkbyB3ZSBt
ZWFuIHN1YnRyYWN0PyAqLw0KICBpZiAob25lLT5zaWduICYmICF0d28tPnNp
Z24pIHsgICAgICAgICAgICAgLyogLWEgKyAgYiA9ICAoYi1hKSAqLw0KICAg
IEJOX2lzdWJ0cmFjdChQSU5UXyByZXN1bHQsIHR3bywgb25lLCBjb250ZXh0
KTsNCiAgfQ0KICBlbHNlIGlmIChvbmUtPnNpZ24gJiYgdHdvLT5zaWduKSB7
ICAgICAgICAgLyogLWEgKyAtYiA9IC0oYStiKSAqLw0KICAgIEJOX2lhZGQo
UElOVF8gcmVzdWx0LCBvbmUsIHR3bywgY29udGV4dCk7DQogICAgcmVzdWx0
LT5zaWduID0gMTsNCiAgfQ0KICBlbHNlIGlmICh0d28tPnNpZ24pIHsgICAg
ICAgICAgICAgICAgICAgICAgLyogIGEgKyAtYiA9ICAoYS1iKSAqLw0KICAg
IEJOX2lzdWJ0cmFjdChQSU5UXyByZXN1bHQsIG9uZSwgdHdvLCBjb250ZXh0
KTsNCiAgfQ0KICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgLyogIGEgKyAgYiA9ICAoYStiKSAqLw0KICAgIEJOX2lhZGQo
UElOVF8gcmVzdWx0LCBvbmUsIHR3bywgY29udGV4dCk7DQogIH0NCg0KICBC
Tl9hcml0aF9jbGVhbnVwKFBJTlRfIHJlc3VsdCwgb25lLCB0d28sIGNvbnRl
eHQpOw0KfQ0KDQovKiBBY3R1YWwgYWRkaXRpb24gY29kZSwgYXNzdW1lcyB0
d28gcG9zaXRpdmUgb3BlcmFuZHMgYW5kDQogICBhbiBhbGxvY2F0ZWQgcmVz
dWx0IG9iamVjdCBhbmQgY29udGV4dCAqLw0Kdm9pZCBCTl9pYWRkIChQSU5U
RF8gQklHTlVNKiByZXN1bHQsIEJJR05VTSAqb25lLCBCSUdOVU0gKnR3bywg
Qk5fQ09OVEVYVCAqY29udGV4dCkgew0KICBJTlRWQUwgaTsNCiAgaW50IGNh
cnJ5LCBkaWc7DQoNCiAgQk5fYWxpZ24oUElOVF8gb25lLCB0d28pOw0KICBC
Tl9ncm93KFBJTlRfIHJlc3VsdCwgb25lLT5kaWdpdHMgKyAxKTsNCg0KICBj
YXJyeSA9IDA7DQogIGZvciAoaT0wOyBpPCBvbmUtPmRpZ2l0czsgaSsrKSB7
DQogICAgY2FycnkgKz0gQk5fZ2V0ZChvbmUsIGkpICsgQk5fZ2V0ZCh0d28s
IGkpOw0KICAgIGRpZyA9IGNhcnJ5ICUgMTA7DQogICAgQk5fc2V0ZChyZXN1
bHQsIGksIGRpZyk7DQogICAgY2FycnkgPSBjYXJyeSAvIDEwOw0KICB9DQog
IGlmIChjYXJyeSkgew0KICAgIEJOX3NldGQocmVzdWx0LCBpLCBjYXJyeSk7
DQogICAgcmVzdWx0LT5kaWdpdHMgPSBpKzE7DQogIH0NCiAgZWxzZSB7DQog
ICAgcmVzdWx0LT5kaWdpdHMgPSBpOw0KICB9DQogIHJlc3VsdC0+c2lnbiA9
IDA7DQogIHJlc3VsdC0+ZXhwbiA9IG9uZS0+ZXhwbjsNCn0NCg0KLyo9aGVh
ZDIgQk5fc3VidHJhY3QoQklHTlVNKiByZXN1bHQsIEJJR05VTSAqb25lLCBC
SUdOVU0gKnR3bywgQk5fQ09OVEVYVCAqY29udGV4dCkNCg0KPWN1dCovDQp2
b2lkDQpCTl9zdWJ0cmFjdChQSU5URF8gQklHTlVNKiByZXN1bHQsIEJJR05V
TSAqb25lLCBCSUdOVU0gKnR3bywgQk5fQ09OVEVYVCAqY29udGV4dCkgew0K
DQogIEJOX2FyaXRoX3NldHVwKFBJTlRfIHJlc3VsdCwgb25lLCB0d28sIGNv
bnRleHQpOw0KDQogIC8qIERvIHdlIG1lYW4gc3VidHJhY3QsIG9yIGRvIHdl
IG1lYW4gYWRkPyAqLw0KICBpZiAob25lLT5zaWduICYmICF0d28tPnNpZ24p
IHsgICAgICAgICAvKiAtYSAtICBiID0gLShhK2IpICovDQogICAgQk5faWFk
ZChQSU5UXyByZXN1bHQsIG9uZSwgdHdvLCBjb250ZXh0KTsNCiAgICByZXN1
bHQtPnNpZ24gPSAxOw0KICB9DQogIGVsc2UgaWYgKG9uZS0+c2lnbiAmJiB0
d28tPnNpZ24pIHsgICAgIC8qIC1hIC0gLWIgPSAoYi1hKSAgKi8NCiAgICBC
Tl9pc3VidHJhY3QoUElOVF8gcmVzdWx0LCB0d28sIG9uZSwgY29udGV4dCk7
DQogIH0NCiAgZWxzZSBpZiAodHdvLT5zaWduKSB7ICAgICAgICAgICAgICAg
ICAgLyogIGEgLSAtYiA9IChhK2IpICAqLw0KICAgIEJOX2lhZGQoUElOVF8g
cmVzdWx0LCBvbmUsIHR3bywgY29udGV4dCk7DQogIH0NCiAgZWxzZSB7ICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGEgLSAgYiA9IChh
LWIpICAqLw0KICAgIEJOX2lzdWJ0cmFjdChQSU5UXyByZXN1bHQsIG9uZSwg
dHdvLCBjb250ZXh0KTsNCiAgfQ0KDQogIEJOX2FyaXRoX2NsZWFudXAoUElO
VF8gcmVzdWx0LCBvbmUsIHR3bywgY29udGV4dCk7DQp9DQoNCnZvaWQNCkJO
X2lzdWJ0cmFjdCAoUElOVERfIEJJR05VTSogcmVzdWx0LCBCSUdOVU0gKm9u
ZSwgQklHTlVNICp0d28sIEJOX0NPTlRFWFQgKmNvbnRleHQpIHsNCiAgSU5U
VkFMIGk7DQogIGludCBjYXJyeSwgZGlnOw0KDQogIEJOX2FsaWduKFBJTlRf
IG9uZSwgdHdvKTsNCg0KICAvKiBhcyBhLWIgPT0gLShiLWEpLCB3ZSBmaW5k
IGxhcmdlciBvZiBhIGFuZCBiIGFuZCBtYWtlIHN1cmUgaXQgaXMgaW4gb25l
ICovDQogIGNhcnJ5ID0gMDsNCiAgZm9yIChpPW9uZS0+ZGlnaXRzIC0xOyBp
Pi0xOyBpLS0pIHsNCiAgICBjYXJyeSA9IEJOX2dldGQob25lLCBpKSAtIEJO
X2dldGQodHdvLCBpKTsNCiAgICBpZiAoY2FycnkpIGJyZWFrOw0KICB9DQoN
CiAgaWYgKCFjYXJyeSkgeyAvKiBhPT1iKi8NCiAgICByZXN1bHQtPmRpZ2l0
cyA9IDE7DQogICAgcmVzdWx0LT5zaWduID0gMDsNCiAgICBCTl9zZXRkKHJl
c3VsdCwgMCwwKTsNCiAgICByZXR1cm47DQogIH0NCiAgZWxzZSBpZiAoY2Fy
cnkgPCAwKSB7IC8qIGIgPiBhICovDQogICAgQk5faXN1YnRyYWN0KFBJTlRf
IHJlc3VsdCwgdHdvLCBvbmUsIGNvbnRleHQpOw0KICAgIHJlc3VsdC0+c2ln
biA9IDE7DQogIH0NCiAgZWxzZSB7DQogICAgQk5fZ3JvdyhQSU5UXyByZXN1
bHQsIG9uZS0+ZGlnaXRzICsgMSk7DQoNCiAgICBjYXJyeSA9IDA7DQogICAg
Zm9yIChpPTA7IGk8b25lLT5kaWdpdHM7IGkrKykgew0KICAgICAgY2Fycnkg
PSBjYXJyeSArIEJOX2dldGQob25lLCBpKSAtIEJOX2dldGQodHdvLGkpOw0K
ICAgICAgaWYgKGNhcnJ5IDwgMCkgew0KCUJOX3NldGQocmVzdWx0LCBpLCAx
MCtjYXJyeSk7DQoJY2FycnkgPSAtMTsNCiAgICAgIH0NCiAgICAgIGVsc2Ug
ew0KCUJOX3NldGQocmVzdWx0LCBpLCBjYXJyeSk7DQoJY2FycnkgPSAwOw0K
ICAgICAgfQ0KICAgIH0NCg0KICAgIGFzc2VydCghY2FycnkpOyAvKiBhcyB0
byBnZXQgaGVyZSBhID4gYiovDQoNCiAgICByZXN1bHQtPmRpZ2l0cyA9IG9u
ZS0+ZGlnaXRzOw0KICAgIHJlc3VsdC0+ZXhwbiA9IG9uZS0+ZXhwbjsNCiAg
ICByZXN1bHQtPnNpZ24gPSAwOw0KICB9DQoNCn0NCg0KLyo9aGVhZDIgQk5f
cGx1cyhyZXN1bHQsIG9uZSwgY29udGV4dCkgDQoNClBlcmZvcm0gdW5hcnkg
KyBvbiBvbmUuICBEb2VzIGFsbCB0aGUgcm91bmRpbmcgYW5kIHdoYXQgaGF2
ZSB5b3UuDQoNCj1jdXQqLw0Kdm9pZCBCTl9wbHVzKFBJTlREXyBCSUdOVU0q
IHJlc3VsdCwgQklHTlVNICpvbmUsIEJOX0NPTlRFWFQgKmNvbnRleHQpIHsN
CiAgQk5fYXJpdGhfc2V0dXAoUElOVF8gcmVzdWx0LCBvbmUsIG9uZSwgY29u
dGV4dCk7DQogIEJOX2NvcHkoUElOVF8gcmVzdWx0LCBvbmUpOw0KICBCTl9h
cml0aF9jbGVhbnVwKFBJTlRfIHJlc3VsdCwgb25lLCBvbmUsIGNvbnRleHQp
Ow0KfQ0KDQovKj1oZWFkMiBCTl9taW51cyhyZXN1bHQsIG9uZSwgY29udGV4
dCkgDQoNClBlcmZvcm0gdW5hcnkgLSBvbiBvbmUuICBEb2VzIGFsbCB0aGUg
cm91bmRpbmcgYW5kIHdoYXQgaGF2ZSB5b3UuDQoNCj1jdXQqLw0Kdm9pZCBC
Tl9taW51cyhQSU5URF8gQklHTlVNKiByZXN1bHQsIEJJR05VTSAqb25lLCBC
Tl9DT05URVhUICpjb250ZXh0KSB7DQogIEJOX2FyaXRoX3NldHVwKFBJTlRf
IHJlc3VsdCwgb25lLCBvbmUsIGNvbnRleHQpOw0KICBCTl9jb3B5KFBJTlRf
IHJlc3VsdCwgb25lKTsNCiAgcmVzdWx0LT5zaWduID0gcmVzdWx0LT5zaWdu
ID8gMCA6IDE7DQogIEJOX2FyaXRoX2NsZWFudXAoUElOVF8gcmVzdWx0LCBv
bmUsIG9uZSwgY29udGV4dCk7DQp9DQoNCi8qPWhlYWQyIEJOX2NvbXBhcmUo
cmVzdWx0LCBvbmUsIHR3bywgY29udGV4dCkNCg0KTnVtZXJpY2FsbHkgY29t
cGFyZXMgb25lIGFuZCB0d28sIHN0b3JpbmcgdGhlIHJlc3VsdCAoYXMgYSBC
SUdOVU0pIGluDQpyZXN1bHQuDQoNCiByZXN1bHQgPSAxICA9PiBvbmUgPiB0
d28NCiByZXN1bHQgPSAtMSA9PiB0d28gPiBvbmUNCiByZXN1bHQgPSAwICA9
PiBvbmUgPT0gdHdvDQoNCj1jdXQqLw0Kdm9pZA0KQk5fY29tcGFyZSAoUElO
VF8gQklHTlVNKiByZXN1bHQsIEJJR05VTSAqb25lLCBCSUdOVU0gKnR3bywg
Qk5fQ09OVEVYVCAqY29udGV4dCkgew0KICBJTlRWQUwgaSxqOw0KICBpbnQg
Y21wOw0KICANCiAgQk5fYXJpdGhfc2V0dXAoUElOVF8gcmVzdWx0LCBvbmUs
IHR3bywgY29udGV4dCk7DQogIHJlc3VsdC0+ZGlnaXRzID0gMTsNCiAgcmVz
dWx0LT5leHBuID0gMDsNCg0KICBpZiAob25lLT5zaWduICE9IHR3by0+c2ln
bikgew0KICAgIHJlc3VsdC0+c2lnbiA9IG9uZS0+c2lnbjsNCiAgICBCTl9z
ZXRkKHJlc3VsdCwgMCwgMSk7DQogIH0NCiAgZWxzZSBpZiAob25lLT5leHBu
ICsgb25lLT5kaWdpdHMgPiB0d28tPmV4cG4gKyB0d28tPmRpZ2l0cykgew0K
ICAgIHJlc3VsdC0+c2lnbiA9IG9uZS0+c2lnbjsNCiAgICBCTl9zZXRkKHJl
c3VsdCwgMCwgMSk7DQogIH0NCiAgZWxzZSBpZiAob25lLT5leHBuICsgb25l
LT5kaWdpdHMgPCB0d28tPmV4cG4gKyB0d28tPmRpZ2l0cykgew0KICAgIHJl
c3VsdC0+c2lnbiA9IG9uZS0+c2lnbiA/IDA6MTsNCiAgICBCTl9zZXRkKHJl
c3VsdCwgMCwgMSk7DQogIH0NCiAgZWxzZSB7IC8qIFNhbWUgc2lnbiwgc2Ft
ZSAic2l6ZSIgKi8NCiAgICBmb3IgKGk9MDsgaTxvbmUtPmRpZ2l0cyAmJiBp
PHR3by0+ZGlnaXRzOyBpKyspIHsNCiAgICAgIGNtcCA9IEJOX2dldGQob25l
LCBvbmUtPmRpZ2l0cy0xLWkpIC0gQk5fZ2V0ZCh0d28sIHR3by0+ZGlnaXRz
LTEtaSk7DQogICAgICBpZiAoY21wKSBicmVhazsNCiAgICB9DQogICAgaWYg
KCFjbXApIHsNCiAgICAgIGlmIChpPT1vbmUtPmRpZ2l0cykgew0KCWZvciAo
aT1pOyBpPHR3by0+ZGlnaXRzOyBpKyspIHsNCgkgIGNtcCA9IDAtQk5fZ2V0
ZCh0d28sIHR3by0+ZGlnaXRzLTEtaSk7DQoJICBpZiAoY21wKSBicmVhazsN
Cgl9DQogICAgICB9DQogICAgICBlbHNlIGlmIChpPT10d28tPmRpZ2l0cykg
ew0KCWZvciAoaT1pOyBpPG9uZS0+ZGlnaXRzOyBpKyspIHsNCgkgIGNtcCA9
IEJOX2dldGQob25lLCBvbmUtPmRpZ2l0cy0xLWkpOw0KCSAgaWYgKGNtcCkg
YnJlYWs7DQoJfQ0KICAgICAgfQ0KICAgIH0NCiAgICAvKiBub3cgY2hlY2sg
dGhlIHZhbHVlIG9mIGNtcCAqLw0KICAgIGlmIChjbXAgPiAwKSB7DQogICAg
ICByZXN1bHQtPnNpZ24gPSBvbmUtPnNpZ247DQogICAgICBCTl9zZXRkKHJl
c3VsdCwgMCwgMSk7DQogICAgfQ0KICAgIGVsc2UgaWYgKGNtcCA8IDApIHsN
CiAgICAgIHJlc3VsdC0+c2lnbiA9IG9uZS0+c2lnbiA/IDAgOiAxOw0KICAg
ICAgQk5fc2V0ZChyZXN1bHQsIDAsIDEpOw0KICAgIH0NCiAgICBlbHNlIHsN
CiAgICAgIHJlc3VsdC0+c2lnbiA9IDA7DQogICAgICBCTl9zZXRkKHJlc3Vs
dCwwLDApOw0KICAgIH0NCiAgfQ0KDQogIEJOX2FyaXRoX2NsZWFudXAoUElO
VF8gcmVzdWx0LCBvbmUsIHR3bywgY29udGV4dCk7DQp9DQoNCi8qPWhlYWQy
IEJOX211bHRpcGx5KHJlc3VsdCwgb25lLCB0d28sIGNvbnRleHQpIA0KDQpN
dWx0aXBsaWVzIG9uZSBhbmQgdHdvLCBzdG9yaW5nIHRoZSByZXN1bHQgaW4g
cmVzdWx0Lg0KDQo9Y3V0Ki8NCnZvaWQgDQpCTl9tdWx0aXBseSAoUElOVERf
IEJJR05VTSogcmVzdWx0LCBCSUdOVU0gKm9uZSwgQklHTlVNICp0d28sIEJO
X0NPTlRFWFQgKmNvbnRleHQpIHsNCiAgSU5UVkFMIGksajsNCiAgaW50IGNh
cnJ5LCBkaWc7DQoNCiAgQk5fYXJpdGhfc2V0dXAoUElOVF8gcmVzdWx0LCBv
bmUsIHR3bywgY29udGV4dCk7DQoNCiAgQk5fZ3JvdyhQSU5UXyByZXN1bHQs
IG9uZS0+ZGlnaXRzICsgdHdvLT5kaWdpdHMgKyAyKTsNCiAgLyogemVybyBj
b250ZW50cyBvZiByZXN1bHQgc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBhcyBp
bnRlcm1lZGlhdGUgKi8NCiAgZm9yIChpPTA7IGk8b25lLT5kaWdpdHMgKyB0
d28tPmRpZ2l0cyArMjsgaSsrKQ0KICAgIEJOX3NldGQocmVzdWx0LCBpLCAw
KTsNCg0KICAvKiBtYWtlIHN1cmUgbGFyZ2VzdCBjb2VmZiBpcyBpbiBvbmUg
Ki8NCiAgaWYgKG9uZS0+ZGlnaXRzIDwgdHdvLT5kaWdpdHMpIHsNCiAgICBC
SUdOVU0qIHRlbXAgPSBvbmU7DQogICAgb25lID0gdHdvOw0KICAgIHR3byA9
IHRlbXA7DQogIH0NCg0KICBmb3IgKGk9MDsgaTx0d28tPmRpZ2l0czsgaSsr
KSB7DQogICAgZGlnID0gQk5fZ2V0ZCh0d28sIGkpOw0KICAgIGNhcnJ5ID0g
MDsNCiAgICBmb3IgKGo9MDsgajxvbmUtPmRpZ2l0czsgaisrKSB7DQogICAg
ICBjYXJyeSArPSBCTl9nZXRkKG9uZSxqKSAqIGRpZyArIEJOX2dldGQocmVz
dWx0LCBpK2opOw0KICAgICAgQk5fc2V0ZChyZXN1bHQsIGkraiwgY2Fycnkg
JSAxMCk7DQogICAgICBjYXJyeSA9IGNhcnJ5IC8gMTA7DQogICAgfQ0KICAg
IGlmIChjYXJyeSkgew0KICAgICAgQk5fc2V0ZChyZXN1bHQsIGkraiwgY2Fy
cnkpOw0KICAgIH0NCiAgfQ0KICBpZiAoY2FycnkpIHsNCiAgICByZXN1bHQt
PmRpZ2l0cyA9IG9uZS0+ZGlnaXRzICsgdHdvLT5kaWdpdHMgKyAxOw0KICB9
DQogIGVsc2UgaWYgKEJOX2dldGQocmVzdWx0LCBvbmUtPmRpZ2l0cyArIHR3
by0+ZGlnaXRzIC0gMSkpIHsNCiAgICByZXN1bHQtPmRpZ2l0cyA9IG9uZS0+
ZGlnaXRzICsgdHdvLT5kaWdpdHM7DQogIH0NCiAgZWxzZSB7DQogICAgcmVz
dWx0LT5kaWdpdHMgPSBvbmUtPmRpZ2l0cyArIHR3by0+ZGlnaXRzIC0gMTsN
CiAgfQ0KICANCiAgaSA9IG9uZS0+ZXhwbiArIHR3by0+ZXhwbjsNCiAgQ0hF
Q0tfT1ZFUkZMT1cocmVzdWx0LT5leHBuLCBpLCBCTl9FWFBOX01BWCwgIm92
ZXJmbG93IGluIG11bHRpcGxpY2F0aW9uIik7DQogIENIRUNLX1VOREVSRkxP
VyhyZXN1bHQtPmV4cG4sLWksIEJOX0VYUE5fTUlOLCAidW5kZXJmbG93IGlu
IG11bHRpcGxpYWN0aW9uIik7DQogIHJlc3VsdC0+ZXhwbiA9IGk7DQogIA0K
ICByZXN1bHQtPnNpZ24gPSAxICYgKG9uZS0+c2lnbiBeIHR3by0+c2lnbik7
DQoNCiAgQk5fYXJpdGhfY2xlYW51cChQSU5UXyByZXN1bHQsIG9uZSwgdHdv
LCBjb250ZXh0KTsNCn0NCg0KLyo9aGVhZDIgQk5fZGl2aWRlKHJlc3VsdCwg
b25lLCB0d28sIGNvbnRleHQpDQoNCkRpdmlkZSB0d28gaW50byBvbmUsIHN0
b3JpbmcgdXAgdG8gSTxwcmVjaXNpb24+IGRpZ2l0cyBpbiByZXN1bHQuDQpQ
ZXJmb3JtcyBvd24gcm91bmRpbmcuDQoNCj1jdXQqLw0KDQp2b2lkIEJOX2Rp
dmlkZShQSU5URF8gQklHTlVNKiByZXN1bHQsIEJJR05VTSAqb25lLCBCSUdO
VU0gKnR3bywgQk5fQ09OVEVYVCAqY29udGV4dCkgew0KICBCSUdOVU0qIHJl
bSA9IEJOX25ldyhQSU5UXyAxKTsNCiAgQk5fYXJpdGhfc2V0dXAoUElOVF8g
cmVzdWx0LCBvbmUsIHR3bywgY29udGV4dCk7DQogIEJOX2lkaXZpZGUoUElO
VF8gcmVzdWx0LCBvbmUsIHR3bywgY29udGV4dCwgQk5fRElWX0RJVklERSwg
cmVtKTsNCg0KICAvKiBVc2UgcmVtIHRvIHdvcmsgb3V0IHRoaW5ncyBsaWtl
IHJvdW5kaW5nIGhlcmUsIHdlJ2xsIGRvIG91cg0KICAgICBvd24gY2xlYW4g
dXAgYXMgaXQncyBhbGwgYSBsaXR0bGUgb2RkICovDQogIEJOX3JvdW5kKFBJ
TlRfIG9uZSwgY29udGV4dCk7DQogIEJOX3JvdW5kKFBJTlRfIHR3bywgY29u
dGV4dCk7DQogIEJOX3N0cmlwX2xlYWRfemVyb3MoUElOVF8gcmVzdWx0KTsN
Cg0KICBpZiAoY29udGV4dC0+cHJlY2lzaW9uID09IFJPVU5EX0hBTEZfRVZF
Tikgew0KICAgIGlmIChyZXN1bHQtPmRpZ2l0cyA+IGNvbnRleHQtPnByZWNp
c2lvbikgew0KICAgICAgaWYgKGNvbnRleHQtPmxvc3RfZGlnaXRzKSB7DQoJ
Qk5fRVhDRVBUKFBJTlRfIEJOX0xPU1RfRElHSVRTLCAiZGlnaXRzIGxvc3Qg
YWZ0ZXIgZGl2aXNpb24iKTsNCiAgICAgIH0NCiAgICAgIC8qIFdlIGNvbGxl
Y3RlZCBwcmVjaXNpb24gKyAxIGRpZ2l0cy4uLiAqLw0KICAgICAgQk5fcmVh
bGx5X3plcm8oUElOVF8gcmVtKTsNCiAgICAgIGlmIChCTl9nZXRkKHJlc3Vs
dCwgMCkgPiA1KSB7DQoJQk5fcm91bmRfdXAoUElOVF8gcmVzdWx0LCBjb250
ZXh0KTsNCiAgICAgIH0NCiAgICAgIGVsc2UgaWYgKEJOX2dldGQocmVzdWx0
LCAwKSA9PSA1KSB7DQoJaWYgKHJlbS0+ZGlnaXRzID09IDAgJiYgQk5fZ2V0
ZChyZW0sIDApPT0wKSB7DQoJICBzd2l0Y2ggKEJOX2dldGQocmVzdWx0LCAx
KSkgew0KCSAgY2FzZSAwOg0KCSAgY2FzZSAyOg0KCSAgY2FzZSA0Og0KCSAg
Y2FzZSA2Og0KCSAgY2FzZSA4Og0KCSAgICBCTl9yb3VuZF91cChQSU5UXyBy
ZXN1bHQsIGNvbnRleHQpOw0KCSAgICBicmVhazsNCgkgIGRlZmF1bHQgOg0K
CSAgICBCTl9yb3VuZF9kb3duKFBJTlRfIHJlc3VsdCwgY29udGV4dCk7DQoJ
ICB9DQoJfQ0KCWVsc2Ugew0KCSAgQk5fcm91bmRfdXAoUElOVF8gcmVzdWx0
LCBjb250ZXh0KTsNCgl9DQogICAgICB9DQogICAgICBlbHNlIHsNCglCTl9y
b3VuZF9kb3duKFBJTlRfIHJlc3VsdCwgY29udGV4dCk7DQogICAgICB9DQog
ICAgfQ0KICAgIA0KICB9DQogIGVsc2UgeyAvKiBPdGhlciByb3VuZGluZ3Mg
anVzdCBuZWVkIGRpZ2l0cyB0byBwbGF5IHdpdGggKi8NCiAgICBCTl9yb3Vu
ZChQSU5UXyByZXN1bHQsIGNvbnRleHQpOw0KICB9DQogIEJOX3JlYWxseV96
ZXJvKFBJTlRfIHJlc3VsdCk7DQogIEJOX21ha2VfaW50ZWdlcihQSU5UXyBy
ZXN1bHQsIGNvbnRleHQpOw0KICAvKiBSZW1vdmUgdHJhaWxpbmcgemVyb3Mg
aWYgcG9zaXRpdmUgZXhwb25lbnQgKi8NCiAgaWYgKHJlc3VsdC0+ZXhwbiA+
IDApIHsNCiAgICBJTlRWQUwgaSxqOw0KICAgIGZvciAoaT0wOyBpPHJlc3Vs
dC0+ZGlnaXRzOyBpKyspIHsNCiAgICAgIGlmIChCTl9nZXRkKHJlc3VsdCwg
aSkgIT0gMCkgYnJlYWs7DQogICAgfQ0KICAgIGlmIChpKSB7DQogICAgICBm
b3IgKGo9aTsgajxyZXN1bHQtPmRpZ2l0czsgaisrKSB7DQoJQk5fc2V0ZChy
ZXN1bHQsIGotaSwgQk5fZ2V0ZChyZXN1bHQsIGopKTsNCiAgICAgIH0NCiAg
ICB9DQogICAgQ0hFQ0tfT1ZFUkZMT1cocmVzdWx0LT5leHBuLCBpLCBCTl9F
WFBOX01BWCwgIm92ZXJmbG93IGluIGRpdmlkZSIpOw0KICAgIHJlc3VsdC0+
ZXhwbiArPSBpOw0KICB9DQogIA0KICBCTl9kZXN0cm95KFBJTlRfIHJlbSk7
DQp9DQoNCi8qPWhlYWQyIEJOX2RpdmlkZV9pbnRlZ2VyKHJlc3VsdCwgb25l
LCB0d28sIGNvbnRleHQpDQoNCnBsYWNlcyB0aGUgaW50ZWdlciBwYXJ0IG9m
IG9uZSAvIHR3byBpbnRvIHJlc3VsdC4NCg0KPWN1dCovDQp2b2lkDQpCTl9k
aXZpZGVfaW50ZWdlciAoUElOVERfIEJJR05VTSogcmVzdWx0LCBCSUdOVU0g
Km9uZSwgQklHTlVNICp0d28sIEJOX0NPTlRFWFQgKmNvbnRleHQpIHsNCiAg
QklHTlVNKiByZW0gPSBCTl9uZXcoUElOVF8gMSk7DQogIEJOX2FyaXRoX3Nl
dHVwKFBJTlRfIHJlc3VsdCwgb25lLCB0d28sIGNvbnRleHQpOw0KICBCTl9p
ZGl2aWRlKFBJTlRfIHJlc3VsdCwgb25lLCB0d28sIGNvbnRleHQsIEJOX0RJ
Vl9ESVZJTlQsIHJlbSk7DQogIA0KICBCTl9yZWFsbHlfemVybyhQSU5UXyBy
ZW0pOw0KICBpZiAocmVzdWx0LT5leHBuID4wICYmIA0KICAgICAgcmVzdWx0
LT5leHBuICsgcmVzdWx0LT5kaWdpdHMgPiBjb250ZXh0LT5wcmVjaXNpb24g
JiYNCiAgICAgICEocmVtLT5kaWdpdHMgPT0gMCAmJiBCTl9nZXRkKHJlbSwg
MCkgPT0gMCkpIHsNCiAgICBCTl9FWENFUFQoUElOVF8gQk5fRElWSVNJT05f
SU1QT1NTSUJMRSwNCgkgICAgICAiZGl2aWRlLWludGVnZXIgcmVxdWlyZXMg
bW9yZSBwcmVjaXNpb24gdGhhbiBhdmFpbGFibGUiKTsNCiAgfQ0KICBCTl9k
ZXN0cm95KFBJTlRfIHJlbSk7DQogIGlmIChyZXN1bHQtPmV4cG4gIT0gMCkg
ew0KICAgIElOVFZBTCBpOw0KICAgIEJOX2dyb3coUElOVF8gcmVzdWx0LCBy
ZXN1bHQtPmV4cG4gKyByZXN1bHQtPmRpZ2l0cyk7DQogICAgZm9yIChpPTA7
IGk8cmVzdWx0LT5kaWdpdHM7IGkrKykgew0KICAgICAgQk5fc2V0ZChyZXN1
bHQsIHJlc3VsdC0+ZXhwbiArIHJlc3VsdC0+ZGlnaXRzIC0xIC1pLCBCTl9n
ZXRkKHJlc3VsdCwgaSkpOw0KICAgIH0NCiAgICBmb3IgKGk9MDsgaTxyZXN1
bHQtPmV4cG47IGkrKykgew0KICAgICAgQk5fc2V0ZChyZXN1bHQsIGkgLDAp
Ow0KICAgIH0NCiAgICByZXN1bHQtPmRpZ2l0cyArPSByZXN1bHQtPmV4cG47
DQogICAgcmVzdWx0LT5leHBuID0gMDsNCiAgfQ0KICBCTl9yb3VuZChQSU5U
XyBvbmUsIGNvbnRleHQpOw0KICBCTl9yb3VuZChQSU5UXyB0d28sIGNvbnRl
eHQpOw0KICBCTl9tYWtlX2ludGVnZXIoUElOVF8gcmVzdWx0LCBjb250ZXh0
KTsNCn0NCg0KLyo9aGVhZDIgQk5fcmVtYWluZGVyKHJlc3VsdCwgb25lLCB0
d28sIGNvbnRleHQpDQoNCnBsYWNlcyB0aGUgcmVtYWluZGVyIGZyb20gZGl2
aWRlLWludGVnZXIgKGFib3ZlKSBpbnRvIHJlc3VsdC4NCg0KPWN1dCovDQp2
b2lkDQpCTl9yZW1haW5kZXIgKFBJTlREXyBCSUdOVU0qIHJlc3VsdCwgQklH
TlVNICpvbmUsIEJJR05VTSAqdHdvLCBCTl9DT05URVhUICpjb250ZXh0KSB7
DQogIEJJR05VTSogZmFrZSA9IEJOX25ldygxKTsNCiAgDQogIEJOX2lkaXZp
ZGUoUElOVF8gZmFrZSwgb25lLCB0d28sIGNvbnRleHQsIEJOX0RJVl9SRU1B
SU4sIHJlc3VsdCk7DQoNCiAgQk5fcmVhbGx5X3plcm8oUElOVF8gcmVzdWx0
KTsNCiAgaWYgKGZha2UtPmV4cG4gPjAgJiYgDQogICAgICBmYWtlLT5leHBu
ICsgcmVzdWx0LT5kaWdpdHMgPiBjb250ZXh0LT5wcmVjaXNpb24gJiYNCiAg
ICAgICEocmVzdWx0LT5kaWdpdHMgPT0gMCAmJiBCTl9nZXRkKHJlc3VsdCwg
MCkgPT0gMCkpIHsNCiAgICBCTl9FWENFUFQoUElOVF8gQk5fRElWSVNJT05f
SU1QT1NTSUJMRSwNCgkgICAgICAicmVtYWluZGVyIHJlcXVpcmVzIG1vcmUg
cHJlY2lzaW9uIHRoYW4gYXZhaWxhYmxlIik7DQogIH0NCg0KDQogIEJOX2Rl
c3Ryb3koUElOVF8gZmFrZSk7DQoNCiAgQk5fcm91bmQoUElOVF8gb25lLCBj
b250ZXh0KTsNCiAgQk5fcm91bmQoUElOVF8gdHdvLCBjb250ZXh0KTsNCiAg
Qk5fc3RyaXBfbGVhZF96ZXJvcyhQSU5UXyByZXN1bHQpOw0KICBCTl9yb3Vu
ZChQSU5UXyByZXN1bHQsIGNvbnRleHQpOw0KICBCTl9yZWFsbHlfemVybyhQ
SU5UXyByZXN1bHQpOw0KfQ0KDQovKiBEb2VzIHRoZSBoZWF2eSB3b3JrIGZv
ciB0aGUgdmFyaW91cyBkaXZpc2lvbiB3b3NzbmFtZXMgKi8NCnZvaWQNCkJO
X2lkaXZpZGUgKFBJTlRfIEJJR05VTSogcmVzdWx0LCBCSUdOVU0gKm9uZSwg
QklHTlVNICp0d28sDQogICAgICAgICAgICBCTl9DT05URVhUICpjb250ZXh0
LCBCTl9ESVZfRU5VTSBvcGVyYXRpb24sIEJJR05VTSogcmVtKXsNCiAgSU5U
VkFMIGksIGosIGRpdmlkZWQsIG5ld2V4cG47DQogIEJJR05VTSAqZGl2LCp0
MSwgKnQyOw0KICBpbnQgczIsIHZhbHVlOw0KDQogIC8qIEFyZSB3ZSBkb2lu
ZyBzb21ldGhpbmcgc3R1cGlkLCBjYW4gd2Ugc2tpcCBhbGwgdGhlIGhhc3Ns
ZT8gKi8NCiAgaWYgKG9uZS0+ZGlnaXRzID09IDEgJiYgQk5fZ2V0ZChvbmUs
IDApPT0wKSB7DQogICAgaWYgKHR3by0+ZGlnaXRzID09IDEgJiYgQk5fZ2V0
ZCh0d28sIDApPT0wKXsNCiAgICAgIEJOX0VYQ0VQVChQSU5UXyBCTl9ESVZJ
U0lPTl9VTkRFRklORUQsICIwLzAgaW4gZGl2aXNpb24iKTsNCiAgICB9DQog
ICAgcmVzdWx0LT5kaWdpdHMgPSAxOw0KICAgIHJlc3VsdC0+c2lnbiA9IDA7
DQogICAgQk5fc2V0ZChyZXN1bHQsIDAsIDApOw0KICAgIHJldHVybjsNCiAg
fQ0KICBpZiAodHdvLT5kaWdpdHMgPT0gMSkgew0KICAgIGlmIChCTl9nZXRk
KHR3bywgMCk9PTApIHsNCiAgICAgIEJOX0VYQ0VQVChQSU5UXyBCTl9ESVZJ
U0lPTl9CWV9aRVJPLCAieC8wIGluIGRpdmlzaW9uIik7DQogICAgfQ0KICAg
IGlmIChCTl9nZXRkKHR3bywwKT09MSkgeyAvKiB4IC8gMSoqTiAqLw0KICAg
ICAgQk5fY29weShQSU5UXyByZXN1bHQsIG9uZSk7DQogICAgICByZXN1bHQt
PnNpZ24gPSAxJihvbmUtPnNpZ24gXiB0d28tPnNpZ24pOw0KICAgICAgQ0hF
Q0tfVU5ERVJGTE9XKHJlc3VsdC0+ZXhwbiwgdHdvLT5leHBuIC0gb25lLT5l
eHBuLCBCTl9FWFBOX01JTiwNCgkJICAgICAgIlVuZGVyZmxvdyBpbiBkaXZp
c2lvbiIpOw0KICAgICAgQ0hFQ0tfT1ZFUkZMT1cocmVzdWx0LT5leHBuLCBv
bmUtPmV4cG4tdHdvLT5leHBuLCBCTl9FWFBOX01BWCwNCgkJICAgICAiT3Zl
cmZsb3cgaW4gZGl2aXNpb24iKTsNCiAgICAgIHJlc3VsdC0+ZXhwbiA9IG9u
ZS0+ZXhwbiAtIHR3by0+ZXhwbjsNCiAgICAgIHJldHVybjsNCiAgICB9DQog
IH0NCiAgLyogVGhhdCdzIHF1aXRlIGVub3VnaCBzaG9ydGN1dHMgZm9yIG5v
dy4uLiAqLw0KDQogIC8qIE1ha2Ugc29tZSB0ZW1wb3Jhcmllcywgc2V0IGFs
bCBzaWducyB0byBwb3NpdGl2ZSBmb3Igc2ltcGxpY2l0eSAqLw0KICAvKiBX
ZSB1c2UgcmVzdWx0IGFzIGEgdGVtcG9yeSwgYW5kIHN0b3JlIHRoZSByZXZl
cnNlZCByZXN1bHQgaW4gdDIgKi8NCiAgZGl2ID0gQk5fbmV3KFBJTlRfIDEp
Ow0KICBCTl9jb3B5KFBJTlRfIGRpdiwgb25lKTsNCiAgQk5fY29weShQSU5U
XyByZW0sIGRpdik7IC8qIEluIGNhc2UgZG9pbmcgaW50LWRpdiBhbmQgZG9u
J3QgZGl2Ki8NCiAgZGl2LT5zaWduID0gMDsNCiAgdDEgPSBCTl9uZXcoUElO
VF8gMSk7DQogIHQyID0gQk5fbmV3KFBJTlRfIDEpOw0KICBCTl9ncm93KFBJ
TlRfIHQyLCBjb250ZXh0LT5wcmVjaXNpb24rMSk7DQogIHQyLT5kaWdpdHMg
PSAwOw0KICBzMiA9IHR3by0+c2lnbjsNCiAgdHdvLT5zaWduID0gMDsNCiAg
cmVzdWx0LT5kaWdpdHMgPSAxOw0KICByZW0tPmRpZ2l0cyA9IDE7DQoNCiAg
LyogRmlyc3QgcG9zaXRpb24gdG8gdHJ5IHRvIGZpbGwgKi8NCiAgbmV3ZXhw
biA9IG9uZS0+ZGlnaXRzICsgb25lLT5leHBuIC0gdHdvLT5kaWdpdHMgLSB0
d28tPmV4cG47DQogIENIRUNLX09WRVJGTE9XKHQxLT5leHBuLCBuZXdleHBu
LCBCTl9FWFBOX01BWCwgIm92ZXJmbG93IGluIGRpdmlkZSIpOw0KICBDSEVD
S19VTkRFUkZMT1codDEtPmV4cG4sIC1uZXdleHBuLCBCTl9FWFBOX01JTiwg
InVuZGVyZmxvdyBpbiBkaXZpZGUiKTsNCiAgdDEtPmV4cG4gPSBuZXdleHBu
Ow0KDQogIHZhbHVlID0gMDsNCiAgZm9yICg7Oykgew0KICAgIGRpdmlkZWQg
PSAwOw0KICAgIGZvciAoaj0xOyBqPDEwO2orKykgew0KICAgICAgQk5fc2V0
ZCh0MSwgMCwgaik7DQogICAgICBCTl9tdWx0aXBseShQSU5UXyByZXN1bHQs
IHQxLCB0d28sIGNvbnRleHQpOw0KICAgICAgaWYgKEJOX2NvbXAoUElOVF8g
cmVzdWx0LCBkaXYpID4gMCkgew0KCWlmIChqPT0xICYmIHZhbHVlID09IDAp
IGJyZWFrOyAvKiBkb24ndCBjb2xsZWN0IGxlYWRpbmcgMHMgKi8NCglCTl9z
ZXRkKHQyLCB2YWx1ZSwgai0xKTsNCgl0Mi0+ZGlnaXRzKys7DQoJdmFsdWUr
KzsNCglkaXZpZGVkID0gMTsNCglicmVhazsNCiAgICAgIH0NCiAgICB9DQog
ICAgaWYgKGRpdmlkZWQpIHsNCiAgICAgIEJOX3NldGQodDEsMCxqLTEpOw0K
ICAgICAgQk5fbXVsdGlwbHkoUElOVF8gcmVzdWx0LCB0MSwgdHdvLCBjb250
ZXh0KTsNCiAgICAgIEJOX2lzdWJ0cmFjdChQSU5UXyByZW0sIGRpdiwgcmVz
dWx0LCBjb250ZXh0KTsNCiAgICB9DQogICAgLyogQXJlIHdlIGRvbmUgeWV0
PyAqLw0KICAgIGlmICh2YWx1ZSAmJiByZW0tPmRpZ2l0cyA9PTEgJiYgQk5f
Z2V0ZChyZW0sIDApPT0wKSBicmVhazsNCiAgICBpZiAodDItPmRpZ2l0cyA9
PSBjb250ZXh0LT5wcmVjaXNpb24gKzEpIGJyZWFrOw0KICAgIGlmIChvcGVy
YXRpb24gPT0gQk5fRElWX0RJVklOVHx8IG9wZXJhdGlvbiA9PSBCTl9ESVZf
UkVNQUlOKSB7DQogICAgICBpZiAodDEtPmV4cG4gPT0wKSBicmVhazsNCiAg
ICB9DQogICAgQ0hFQ0tfT1ZFUkZMT1codDEtPmV4cG4sIDEsIEJOX0VYUE5f
TUFYLCAib3ZlcmZsb3cgaW4gZGl2aWRlIik7DQogICAgQ0hFQ0tfVU5ERVJG
TE9XKHQxLT5leHBuLCAtMSwgQk5fRVhQTl9NSU4sICJ1bmRlcmZsb3cgaW4g
ZGl2aWRlIik7DQogICAgdDEtPmV4cG4tLTsNCiAgICBpZiAoZGl2aWRlZCkg
Qk5fY29weShQSU5UXyBkaXYsIHJlbSk7DQogIH0NCg0KICAvKiBXb3JrIG91
dCB0aGUgc2lnbiBhbmQgZXhwb25lbnQgb2YgdGhlIHJlc3VsdCAqLw0KICBm
b3IgKGk9MDsgaTwgdDItPmRpZ2l0czsgaSsrKSB7DQogICAgQk5fc2V0ZChy
ZXN1bHQsIGksIEJOX2dldGQodDIsIHQyLT5kaWdpdHMgLSAxIC1pKSk7DQog
IH0NCiAgaWYgKHQyLT5kaWdpdHMgPT0gMCkgew0KICAgIHJlc3VsdC0+ZGln
aXRzID0gMTsNCiAgICBCTl9zZXRkKHJlc3VsdCwgMCwgMCk7DQogICAgcmVz
dWx0LT5zaWduID0gMDsNCiAgfQ0KICBlbHNlIHsNCiAgICByZXN1bHQtPmRp
Z2l0cyA9IHQyLT5kaWdpdHM7DQogICAgcmVzdWx0LT5zaWduID0gMSYob25l
LT5zaWduIF4gczIpOw0KICAgIHJlc3VsdC0+ZXhwbiA9IHQxLT5leHBuOyAv
KiBXZSBrbm93IHRoaXMgaXMgZmluZSwgZnJvbSBhYm92ZSAqLw0KICB9DQog
IHR3by0+c2lnbiA9IHMyOw0KICByZW0tPnNpZ24gPSAxJihvbmUtPnNpZ24g
XiBzMik7DQoNCiAgQk5fZGVzdHJveShQSU5UXyB0MSk7DQogIEJOX2Rlc3Ry
b3koUElOVF8gdDIpOw0KICBCTl9kZXN0cm95KFBJTlRfIGRpdik7DQogIA0K
ICByZXR1cm47IC8qIHBoZXchICovDQp9DQoNCi8qIENvbXBhcmlzb24gd2l0
aCBubyByb3VuZGluZyBldGMuICovDQppbnQgQk5fY29tcCAoUElOVERfIEJJ
R05VTSAqb25lLCBCSUdOVU0gKnR3bykgew0KICBJTlRWQUwgaSxqOw0KICBp
bnQgY21wOw0KDQogIEJOX3N0cmlwX2xlYWRfemVyb3MoUElOVF8gb25lKTsN
CiAgQk5fc3RyaXBfbGVhZF96ZXJvcyhQSU5UXyB0d28pOw0KDQogIGlmIChv
bmUtPnNpZ24gIT0gdHdvLT5zaWduKSB7DQogICAgcmV0dXJuIG9uZS0+c2ln
biA/IDEgOiAtMTsNCiAgfQ0KICBlbHNlIGlmIChvbmUtPmV4cG4gKyBvbmUt
PmRpZ2l0cyA+IHR3by0+ZXhwbiArIHR3by0+ZGlnaXRzKSB7DQogICAgcmV0
dXJuIG9uZS0+c2lnbiA/IC0xIDogMTsNCiAgfQ0KICBlbHNlIGlmIChvbmUt
PmV4cG4gKyBvbmUtPmRpZ2l0cyA8IHR3by0+ZXhwbiArIHR3by0+ZGlnaXRz
KSB7DQogICAgcmV0dXJuIG9uZS0+c2lnbiA/IDEgOiAtMTsNCiAgfQ0KICBl
bHNlIHsgLyogU2FtZSBzaWduLCBzYW1lICJzaXplIiAqLw0KICAgIGZvciAo
aT0wOyBpPG9uZS0+ZGlnaXRzICYmIGk8dHdvLT5kaWdpdHM7IGkrKykgew0K
ICAgICAgY21wID0gQk5fZ2V0ZChvbmUsIG9uZS0+ZGlnaXRzLTEtaSkgLSBC
Tl9nZXRkKHR3bywgdHdvLT5kaWdpdHMtMS1pKTsNCiAgICAgIGlmIChjbXAp
IHJldHVybiBjbXA7DQogICAgfQ0KICAgIGlmICghY21wKSB7DQogICAgICBp
ZiAoaT09b25lLT5kaWdpdHMpIHsNCglmb3IgKGk9aTsgaTx0d28tPmRpZ2l0
czsgaSsrKSB7DQoJICBjbXAgPSAwLUJOX2dldGQodHdvLCB0d28tPmRpZ2l0
cy0xLWkpOw0KCSAgaWYgKGNtcCkgcmV0dXJuIGNtcDsNCgl9DQogICAgICB9
DQogICAgICBlbHNlIGlmIChpPT10d28tPmRpZ2l0cykgew0KCWZvciAoaT1p
OyBpPG9uZS0+ZGlnaXRzOyBpKyspIHsNCgkgIGNtcCA9IEJOX2dldGQob25l
LCBvbmUtPmRpZ2l0cy0xLWkpOw0KCSAgaWYgKGNtcCkgcmV0dXJuIGNtcDsN
Cgl9DQogICAgICB9DQogICAgICByZXR1cm4gY21wOw0KICAgIH0NCiAgfQ0K
fQ0KDQovKj1oZWFkMiBCTl9wb3dlcihyZXN1bHQsIGJpZ251bSwgZXhwbiwg
Y29udGV4dCkNCg0KQ2FsY3VsYXRlIHJlc3VsdCA9IGJpZ251bSAqKiBleHBu
Ow0KDQpYWFggVG8gRG8NCg0KPWN1dCovDQp2b2lkIEJOX3Bvd2VyKFBJTlRE
XyBCSUdOVU0qIHJlc3VsdCwgQklHTlVNKiBiaWdudW0sDQogICAgICAgICAg
ICAgIEJJR05VTSogZXhwbiwgQk5fQ09OVEVYVCogY29udGV4dCkgew0KDQp9
DQoNCi8qPWhlYWQyIEJOX3Jlc2NhbGUocmVzdWx0LCBiaWdudW0sIGV4cG4s
IGNvbnRleHQpDQoNClJlc2NhbGVzIGJpZ251bSB0byBoYXZlIGFuIGV4cG9u
ZW50IG9mIGV4cG4uDQoNClhYWCBUbyBEbw0KDQo9Y3V0Ki8NCnZvaWQgQk5f
cmVzY2FsZShQSU5URF8gQklHTlVNKiByZXN1bHQsIEJJR05VTSogb25lLCBC
SUdOVU0qIHR3bywgQk5fQ09OVEVYVCogY29udGV4dCkgew0KICBJTlRWQUwg
ZXhwbjsNCiAgSU5UVkFMIGxvc3QgPSBjb250ZXh0LT5sb3N0X2RpZ2l0czsN
Cg0KICBCTl9hcml0aF9zZXR1cChQSU5UXyByZXN1bHQsIG9uZSwgdHdvLCBj
b250ZXh0KTsNCg0KICBjb250ZXh0LT5sb3N0X2RpZ2l0cyA9IDE7DQogIGV4
cG4gPSBCTl90b19pbnQoUElOVF8gdHdvLCBjb250ZXh0KTsNCiAgY29udGV4
dC0+bG9zdF9kaWdpdHMgPSBsb3N0Ow0KfQ0KDQovKj1oZWFkMiBJTlRWQUwg
Qk5fdG9faW50KEJJR05VTSogYmlnbnVtLCBCTl9DT05URVhUKiBjb250ZXh0
KQ0KDQpDb252ZXJ0cyB0aGUgYmlnbnVtIGludG8gYW4gaW50ZWdlciwgcmFp
c2VzIG92ZXJmbG93IGlmIGFuIGV4YWN0DQpyZXByZXNlbnRhdGlvbiBjYW5u
b3QgYmUgY3JlYXRlZC4NCg0KPWN1dCovDQpJTlRWQUwgQk5fdG9faW50KFBJ
TlRfIEJJR05VTSogYm4sIEJOX0NPTlRFWFQqIGNvbnRleHQpIHsNCiAgSU5U
VkFMIGluc2lnLCBpOw0KICBJTlRWQUwgcmVzdWx0ID0gMDsNCiAgSU5UVkFM
IG1heGRpZ3MgPSBCTl9EX1BFUl9JTlQgPCBjb250ZXh0LT5wcmVjaXNpb24g
Pw0KICAgICAgICAgICAgICAgICAgIEJOX0RfUEVSX0lOVCA6IGNvbnRleHQt
PnByZWNpc2lvbjsNCg0KDQogIEJOX3N0cmlwX2xlYWRfemVyb3MoUElOVF8g
Ym4pOw0KICAvKiBDaGVjayBmb3IgZGVmaW5pdGUgYmlnIGFzIHlvdXIgaGVh
ZCBvdmVyZmxvdyAqLw0KICBpZiAoYm4tPmV4cG4gPj0gMCAmJiBibi0+ZXhw
biArIGJuLT5kaWdpdHMgPiBCTl9EX1BFUl9JTlQpIHsNCiAgICBCTl9FWENF
UFQoUElOVF8gQk5fT1ZFUkZMT1csICJiaWdudW0gdG9vIGxhcmdlIHRvIGZp
dCBpbiBhbiBpbnQiKTsNCiAgfQ0KICBpZiAoYm4tPmV4cG4gPCAwICYmIGJu
LT5leHBuICsgYm4tPmRpZ2l0cyA+IEJOX0RfUEVSX0lOVCApIHsNCg0KICAg
IEJOX0VYQ0VQVChQSU5UXyBCTl9PVkVSRkxPVywgImJpZ251bSB0b28gbGFy
Z2UgdG8gZml0IGluIGFuIGludCIpOw0KICB9DQoNCiAgLyogaWYgZT4wLCBp
ZiB3ZSdsbCBsb3NlIHByZWNpc2lvbiB3ZSdsbCBhbHNvIGJlIHRvbyBiaWcs
IHNvIGxvc2UNCiAgICAgYWJvdmUgYW55d2F5LiAgT24gdGhlIG90aGVyIGhh
bmQsIHdpdGggZTwwLCB3ZSBjYW4gbG9zZSBkaWdpdHMgPA0KICAgICAuIGZy
b20gdGhpcyBzbyBuZWVkIHRvIGNoZWNrIHRoYXQgd2UgZG9uJ3QgbG9zZSBw
cmVjaXNpb24gKi8NCiAgaWYgKGJuLT5leHBuPDAgJiYgY29udGV4dC0+bG9z
dF9kaWdpdHMpIHsNCiAgICBCTl9FWENFUFQoUElOVF8gQk5fTE9TVF9ESUdJ
VFMsICJkaWdpdHMgbG9zdCBpbiBjb252IC0+IGludCIpOw0KICB9DQoNCiAg
aWYgKGJuLT5kaWdpdHMgKyBibi0+ZXhwbiA+IGNvbnRleHQtPnByZWNpc2lv
bikgew0KICAgIEJOX0VYQ0VQVChQSU5UXyBCTl9MT1NUX0RJR0lUUywgImRp
Z2l0cyBsb3N0IGluIGNvbnYgLT4gaW50Iik7DQogIH0NCg0KICAvKiBsdWNr
aWx5LCB3ZSBnZXQgdG8ga2VlcCBvdXIgZGlnaXRzLCBzbyBsZXQncyBnZXQg
YXQgJ2VtICovDQogIGlmIChibi0+ZXhwbiA+PSAwKSB7DQogICAgZm9yIChp
ID0gYm4tPmRpZ2l0cy0xOyBpPi0xOyBpLS0pIHsNCiAgICAgIHJlc3VsdCA9
IHJlc3VsdCAqIDEwICsgQk5fZ2V0ZChibiwgaSk7DQogICAgfQ0KICAgIGZv
ciAoaT0wOyBpPGJuLT5leHBuOyBpKyspIHJlc3VsdCA9IHJlc3VsdCAqIDEw
Ow0KICB9IA0KICBlbHNlIHsNCiAgICBmb3IgKGk9Ym4tPmRpZ2l0cy0xOyBp
Pi0xLWJuLT5leHBuOyBpLS0pIHsNCiAgICAgIHJlc3VsdCA9IHJlc3VsdCAq
IDEwICsgQk5fZ2V0ZChibiwgaSk7DQogICAgfQ0KICB9DQogIA0KICByZXR1
cm4gYm4tPnNpZ24gPyAtcmVzdWx0IDogcmVzdWx0Ow0KfQ0K

--_=XFMail.1.4.0.Linux:020211002047:666=_
Content-Type: TEXT/PLAIN; charset=US-ASCII; name="bignum.h"
Content-Transfer-Encoding: BASE64
Content-ID: <[email protected]>
Content-Description: bignum.h
Content-Disposition: attachment; filename="bignum.h"

LyogYmlnbnVtLmggLS0gSW5maW5pdGUgcHJlY2lzaW9uIGJjZCBmb3IgcGFy
cm90ICovDQoNCi8qIFN0dWZmIHRvIGJlIHBhcnJvdC1saWtlIGluIHNvdXJj
ZSwgZXZlbiBpZiBub3QgYmVpbmcgdXNlZCBpbiBwYXJyb3QgKi8NCiNpZmRl
ZiBQQVJST1RfSU5fQ09SRQ0KI2RlZmluZSBQSU5UXyBpbnRlcnByZXRlciwg
DQojZGVmaW5lIFBJTlREXyBJTlRFUlAqIGludGVycHJldGVyLA0KI2RlZmlu
ZSBCTl9hbGxvYyhpLCB4KSBtYWxsb2MoeCkNCiNkZWZpbmUgQk5fcmVhbGxv
YyhpLCB4LCB5KSByZWFsbG9jKHgsIHkpDQojZGVmaW5lIEJOX2ZyZWUoaSwg
eCkgZnJlZSh4KQ0KI2RlZmluZSBCTl9GQVRBTChpLCB4KSBibl9mYXRhbF9l
cnJvcih4KQ0KI2RlZmluZSBCTl9FWENFUFQoaSwgZXhjcCwgbWVzZykgQk5f
ZXhjZXB0aW9uKGksIGV4Y3AsIG1lc2cpDQojZWxzZSAvKiBOb3QgaW4gcGFy
cm90IGNvcmUgKi8NCnR5cGVkZWYgbG9uZyBJTlRWQUw7DQp0eXBlZGVmIHVu
c2lnbmVkIGxvbmcgVUlOVFZBTDsNCnR5cGVkZWYgZG91YmxlIEZMT0FUVkFM
Ow0KI2RlZmluZSBQSU5URF8NCiNkZWZpbmUgUElOVF8NCiNkZWZpbmUgQk5f
YWxsb2MoeCkgbWFsbG9jKHgpDQojZGVmaW5lIEJOX3JlYWxsb2MoeCwgeSkg
cmVhbGxvYyh4LCB5KQ0KI2RlZmluZSBCTl9mcmVlKHgpIGZyZWUoeCkNCiNk
ZWZpbmUgQk5fRkFUQUwoeCkgYm5fZmF0YWxfZXJyb3IoeCkNCiNkZWZpbmUg
Qk5fRVhDRVBUKGV4Y3AsIG1lc2cpIEJOX2V4Y2VwdGlvbihleGNwLCBtZXNn
KQ0KI2VuZGlmIC8qIGlmZGVmIFBBUlJPVF9JTl9DT1JFIGVsc2UgKi8NCg0K
LyogU3R1ZmYgY29uZmlndXJlIHNob3VsZCBkZXRlcm1pbmUqLw0KI2RlZmlu
ZSBCTl9EX1BFUl9OSUIgOCAgICAgICAvKiBkaWdpdHMgc3RvcmVkIGluIGEg
Qk5fTklCICovDQojZGVmaW5lIEJOX0RfUEVSX0lOVCAxMCAgICAgIC8qIERl
Y2ltYWwgZGlnaXRzIGluIGFuIElOVFZBTCAqLw0KI2RlZmluZSBCTl9EX1BF
Ul9GTE9BVCAzMiAgICAvKiBEZWNpbWFsIGRpZ2l0cyBpbiBhIEZMT0FUVkFM
ICovDQojZGVmaW5lIEJOX0VYUE5fTUFYIDEwMDAwICAgIC8qIG1heGltdW0g
dmFsdWUgb2YgZXhwbiovDQojZGVmaW5lIEJOX0VYUE5fTUlOIC0xMDAwMCAg
IC8qIG1pbmltdW0gdmFsdWUgb2YgZXhwbiAqLw0KI2RlZmluZSBCTl9NQVhf
RElHSVRTIDEwMDAwICAvKiBtYXggbnVtYmVyIG9mIGRpZ2l0cyBpbiBjb2Vm
ZiAqLw0KDQp0eXBlZGVmIFVJTlRWQUwgQk5fTklCOw0KDQovKiBCSUdOVU06
IDEyMzQ1Njc4OTAxMjM0eHh4eHh4eHh4eCAsIGV4cG4gPSAtNSwgc2lnbiA9
IDENCiAgICAgICAgICAgXiAgICAgICBeICAgICAgICBeICAgICAgDQogdmFs
dWUgPSAtMTIzNDU2Nzg5LjAxMjM0DQoNCiBidWZmZXIgcG9pbnRzIHRvIGZp
cnN0IGNhcmV0IChoZXJlIGFuIElOVFZBTCkNCiBuaWJzID09IDMsIGRpZ2l0
cyA9PSAxNA0KKi8NCg0KdHlwZWRlZiBzdHJ1Y3Qgew0KICBCTl9OSUIqIGJ1
ZmZlcjsgIC8qIHN0cmluZyBvZiBuaWJibGVzICovDQogIFVJTlRWQUwgbmli
czsgICAgICAvKiBuaWJzIGFsbG9jYXRlZCAqLw0KICBJTlRWQUwgZGlnaXRz
OyAgICAvKiBkaWdpdHMgdXNlZCAqLw0KICBpbnQgc2lnbjsgICAgICAgICAv
KiBzaWduIG9mIG51bWJlciwgMD0+IHBvc2l0aXZlIG9yIHplcm8sIDEgPT4g
bmVnYXRpdmUgKi8NCiAgSU5UVkFMIGV4cG47ICAgICAgLyogZXhwb25lbnQg
b2YgbnVtYmVyICovDQp9IEJJR05VTTsNCg0KLyogQ09OVEVYVDogZGVmaW5l
cyB0aGUgY29udGV4dCBmb3IgdGhlIG9wZXJhdGlvbiwgcHJlY2lzaW9uIGFu
ZCByb3VuZGluZyAqLw0KDQp0eXBlZGVmIGVudW0gew0KICBST1VORF9IQUxG
X1VQLA0KICBST1VORF9ET1dOLA0KICBST1VORF9IQUxGX0VWRU4NCn0gQk5f
Uk9VTkRJTkc7DQoNCnR5cGVkZWYgc3RydWN0IHsNCiAgSU5UVkFMIHByZWNp
c2lvbjsgICAgIC8qIG51bWJlciBvZiBkaWdpdHMgdG8gcmV0YWluICgtdmUg
Zm9yIG5vbmUpKi8NCiAgQk5fUk9VTkRJTkcgcm91bmRpbmc7IC8qIHJvdW5k
aW5nIHR5cGUgdG8gcGVyZm9ybSAqLw0KICBpbnQgbG9zdF9kaWdpdHM7ICAg
ICAgLyogMCA9PiByb3VuZCwgMSA9PiByYWlzZSBleGNlcHRpb24gKi8NCn0g
Qk5fQ09OVEVYVDsNCg0KLyogRXhjZXB0aW9uYWwgQ29uZGl0aW9ucyAqLw0K
DQp0eXBlZGVmIGVudW0gew0KICBCTl9DT05WRVJTSU9OX09WRVJGTE9XID0g
MTw8MCwNCiAgLyogQXNrZWQgdG8gaG9sZCBjb2VmZnxleHBuIHRvbyBsYXJn
ZSB2YWx1ZSAqLw0KICBCTl9DT05WRVJTSU9OX1NZTlRBWCA9IDE8PDEsDQog
IC8qIHN0cmluZyBub3QgY29uZm9ybWluZyB0byBudW1lcmljIGZvcm0gKi8N
CiAgQk5fQ09OVkVSU0lPTl9VTkRFUkZMT1cgPSAxPDwyLA0KICAvKiBleHBu
IG9mIHN0cmluZyB0b28gc21hbGwgdG8gYmUgaGVsZCAgKi8NCiAgQk5fRElW
SVNJT05fQllfWkVSTyA9IDE8PDMsDQogIC8qIGRpdmlkZW5kIG9mIGRpdi9k
aXYtaW50IG9yIHBvdyB6ZXJvICAqLw0KICBCTl9ESVZJU0lPTl9JTVBPU1NJ
QkxFID0gMTw8NCwNCiAgLyogaW50ZWdlciByZXN1bHQgb2YgZGl2LWludCBv
ciByZW0gPiBwcmVjaXNpb24gKi8NCiAgQk5fRElWSVNJT05fVU5ERUZJTkVE
ID0gMTw8NSwNCiAgLyogZGl2IGJ5IHplcm8gd2l0aCB6ZXJvIG9uIHRvcCBh
bHNvICovDQogIEJOX0lOU1VGRklDSUVOVF9TVE9SQUdFID0gMTw8NiwNCiAg
Lyogbm90IGVub3VnaCBzcGFjZSB0byBob2xkIGludGVybWVkaWF0ZSByZXN1
bHRzICovDQogIEJOX0lOVkFMSURfQ09OVEVYVCA9IDE8PDcsDQogIC8qIGNv
bnRleHQgZ2l2ZW4gd2FzIG5vdCB2YWxpZCAodW5rbm93biByb3VuZCkgKi8N
CiAgQk5fSU5WQUxJRF9PUEVSQVRJT04gPSAxPDw4LA0KICAvKiBvcGVyYXRp
b24gd2hpY2ggaXMgbm90IHZhbGlkICovDQogIEJOX0xPU1RfRElHSVRTID0g
MTw8OSwNCiAgLyogZGlnaXRzIGxvc3QgaW4gcm91bmRpbmcgICovDQogIEJO
X09WRVJGTE9XID0gMTw8MTAsDQogIC8qIGV4cG4gYmVjb21lcyBsYXJnZXIg
dGhhbiBtYXggYWxsb3dlZCAqLw0KICBCTl9VTkRFUkZMT1cgPSAxPDwxMQ0K
ICAvKiBleHBuIGJlY29tZXMgc21hbGxlciB0aGFuIG1pbiBhbGxvd2VkICov
DQp9IEJOX0VYQ0VQVElPTlM7DQoNCi8qQ2FwbicgQ3V0LW4tcGFzdGUgZnVu
Y3Rpb25zICovDQpCSUdOVU0qIEJOX25ldyhQSU5URF8gSU5UVkFMIGxlbmd0
aCk7DQppbnQgQk5fZ3JvdyhQSU5URF8gQklHTlVNICppbiwgSU5UVkFMIGxl
bmd0aCk7DQppbnQgQk5fZGVzdHJveShQSU5URF8gQklHTlVNICpibik7DQp2
b2lkIGJuX2ZhdGFsX2Vycm9yIChQSU5URF8gY2hhciogbWVzZyk7DQppbnQg
Qk5fc2V0X2RpZ2l0KFBJTlREXyBCSUdOVU0qIGJuLCBJTlRWQUwgcG9zLCBp
bnQgdmFsdWUpOw0KaW50IEJOX2dldF9kaWdpdChQSU5URF8gQklHTlVNKiBi
biwgSU5UVkFMIHBvcyk7DQpCSUdOVU0qIEJOX2NvcHkoUElOVERfIEJJR05V
TSosIEJJR05VTSopOw0KQklHTlVNKiBCTl9uZXdfZnJvbV9pbnQoUElOVERf
IElOVFZBTCB2YWx1ZSk7DQpJTlRWQUwgQk5fdG9fc2NpZW50aWZpY19zdHJp
bmcoUElOVERfIEJJR05VTSogYm4sIGNoYXIgKipkZXN0KTsNCklOVFZBTCBC
Tl90b19lbmdpbmVlcmluZ19zdHJpbmcoUElOVERfIEJJR05VTSpibiwgY2hh
ciAqKmRlc3QpOw0KaW50IEJOX3JvdW5kIChQSU5URF8gQklHTlVNICp2aWN0
aW0sIEJOX0NPTlRFWFQqIGNvbnRleHQpOw0Kdm9pZCBCTl9FWENFUFQoUElO
VERfIEJOX0VYQ0VQVElPTlMsIGNoYXIqKTsNCnZvaWQgQk5fYWRkKFBJTlRE
XyBCSUdOVU0qIHJlc3VsdCwgQklHTlVNICpvbmUsIEJJR05VTSAqdHdvLCBC
Tl9DT05URVhUICpjb250ZXh0KTsNCnZvaWQNCkJOX3N1YnRyYWN0KFBJTlRE
XyBCSUdOVU0qIHJlc3VsdCwgQklHTlVNICpvbmUsIEJJR05VTSAqdHdvLCBC
Tl9DT05URVhUICpjb250ZXh0KTsNCnZvaWQgQk5fcGx1cyhQSU5URF8gQklH
TlVNKiByZXN1bHQsIEJJR05VTSAqb25lLCBCTl9DT05URVhUICpjb250ZXh0
KTsNCnZvaWQgQk5fbWludXMoUElOVERfIEJJR05VTSogcmVzdWx0LCBCSUdO
VU0gKm9uZSwgQk5fQ09OVEVYVCAqY29udGV4dCk7DQp2b2lkIA0KQk5fY29t
cGFyZSAoUElOVERfIEJJR05VTSogcmVzdWx0LCBCSUdOVU0gKm9uZSwgQklH
TlVNICp0d28sIEJOX0NPTlRFWFQgKmNvbnRleHQpOw0Kdm9pZCANCkJOX211
bHRpcGx5IChQSU5URF8gQklHTlVNKiByZXN1bHQsIEJJR05VTSAqb25lLCBC
SUdOVU0gKnR3bywgQk5fQ09OVEVYVCAqY29udGV4dCk7DQp2b2lkIA0KQk5f
ZGl2aWRlIChQSU5URF8gQklHTlVNKiByZXN1bHQsIEJJR05VTSAqb25lLCBC
SUdOVU0gKnR3bywgQk5fQ09OVEVYVCAqY29udGV4dCk7DQp2b2lkDQpCTl9k
aXZpZGVfaW50ZWdlciAoUElOVERfIEJJR05VTSogcmVzdWx0LCBCSUdOVU0g
Km9uZSwgQklHTlVNICp0d28sIEJOX0NPTlRFWFQgKmNvbnRleHQpOw0Kdm9p
ZCBCTl9yZXNjYWxlKFBJTlREXyBCSUdOVU0qIHJlc3VsdCwgQklHTlVNKiBi
aWdudW0sIEJJR05VTSogZXhwbiwgQk5fQ09OVEVYVCogY29udGV4dCk7DQpJ
TlRWQUwgQk5fdG9faW50KFBJTlREXyBCSUdOVU0qIGJpZ251bSwgQk5fQ09O
VEVYVCogY29udGV4dCk7DQp2b2lkIEJOX3Bvd2VyKFBJTlREXyBCSUdOVU0q
IHJlc3VsdCwgQklHTlVNKiBiaWdudW0sDQogICAgICAgICAgICAgIEJJR05V
TSogZXhwbiwgQk5fQ09OVEVYVCogY29udGV4dCk7DQo=

--_=XFMail.1.4.0.Linux:020211002047:666=_--
End of MIME message