This is the mail archive of the gcc-prs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

c/932: gcc compiler internal error



>Number:         932
>Category:       c
>Synopsis:       gcc compiler internal error
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    unassigned
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Wed Nov 29 19:06:00 PST 2000
>Closed-Date:
>Last-Modified:
>Originator:     John Bourg
>Release:        2.95.2 (made w/ gnu make etc) Note: Has worked well
>Organization:
>Environment:
SunOS quark 5.6 Generic_105181-19 sun4u sparc SUNW,UltraSPARC-IIi-Engine
>Description:
Compiler internal error with unmodifed imap-2000 code.
Distribution location: ./imap-2000/c-client/mbx.c

Transcript:

gcc -g -O2    -c -o mbx.o mbx.c
mbx.c: In function `mbx_hdrpos':
mbx.c:1371: internal error--unrecognizable insn:
(insn 78 76 80 (set (reg:SI 129)
        (minus:SI (const_int 4 [0x4])
            (const_int -4096 [0xfffff000]))) -1 (nil)
    (expr_list:REG_EQUAL (const_int 4100 [0x1004])
        (nil)))

Changing the optimization level does not affect the error.
>How-To-Repeat:
Compile attached code.  I can't seem to include mbx.h but
both .c and .h are available in the standard imap-2000
distrubution.  mbx.c as attached is unmodified.
>Fix:

>Release-Note:
>Audit-Trail:
>Unformatted:
----gnatsweb-attachment----
Content-Type: application/octet-stream; name="mbx.c"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="mbx.c"

LyoKICogUHJvZ3JhbToJTUJYIG1haWwgcm91dGluZXMKICoKICogQXV0aG9yOglNYXJrIENyaXNw
aW4KICoJCU5ldHdvcmtzIGFuZCBEaXN0cmlidXRlZCBDb21wdXRpbmcKICoJCUNvbXB1dGluZyAm
IENvbW11bmljYXRpb25zCiAqCQlVbml2ZXJzaXR5IG9mIFdhc2hpbmd0b24KICoJCUFkbWluaXN0
cmF0aW9uIEJ1aWxkaW5nLCBBRy00NAogKgkJU2VhdHRsZSwgV0EgIDk4MTk1CiAqCQlJbnRlcm5l
dDogTVJDQENBQy5XYXNoaW5ndG9uLkVEVQogKgogKiBEYXRlOgkzIE9jdG9iZXIgMTk5NQogKiBM
YXN0IEVkaXRlZDoJMjQgT2N0b2JlciAyMDAwCiAqIAogKiBUaGUgSU1BUCB0b29sa2l0IHByb3Zp
ZGVkIGluIHRoaXMgRGlzdHJpYnV0aW9uIGlzCiAqIENvcHlyaWdodCAyMDAwIFVuaXZlcnNpdHkg
b2YgV2FzaGluZ3Rvbi4KICogVGhlIGZ1bGwgdGV4dCBvZiBvdXIgbGVnYWwgbm90aWNlcyBpcyBj
b250YWluZWQgaW4gdGhlIGZpbGUgY2FsbGVkCiAqIENQWVJJR0hULCBpbmNsdWRlZCB3aXRoIHRo
aXMgRGlzdHJpYnV0aW9uLgogKi8KCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPGN0eXBl
Lmg+CiNpbmNsdWRlIDxlcnJuby5oPgpleHRlcm4gaW50IGVycm5vOwkJLyoganVzdCBpbiBjYXNl
ICovCiNpbmNsdWRlICJtYWlsLmgiCiNpbmNsdWRlICJvc2RlcC5oIgojaW5jbHVkZSA8cHdkLmg+
CiNpbmNsdWRlIDxzeXMvc3RhdC5oPgojaW5jbHVkZSA8c3lzL3RpbWUuaD4KI2luY2x1ZGUgIm1i
eC5oIgojaW5jbHVkZSAibWlzYy5oIgojaW5jbHVkZSAiZHVtbXkuaCIKDAovKiBNQlggbWFpbCBy
b3V0aW5lcyAqLwoKCi8qIERyaXZlciBkaXNwYXRjaCB1c2VkIGJ5IE1BSUwgKi8KCkRSSVZFUiBt
Ynhkcml2ZXIgPSB7CiAgIm1ieCIsCQkJLyogZHJpdmVyIG5hbWUgKi8KICBEUl9MT0NBTHxEUl9N
QUlMfERSX0NSTEYsCS8qIGRyaXZlciBmbGFncyAqLwogIChEUklWRVIgKikgTklMLAkJLyogbmV4
dCBkcml2ZXIgKi8KICBtYnhfdmFsaWQsCQkJLyogbWFpbGJveCBpcyB2YWxpZCBmb3IgdXMgKi8K
ICBtYnhfcGFyYW1ldGVycywJCS8qIG1hbmlwdWxhdGUgcGFyYW1ldGVycyAqLwogIG1ieF9zY2Fu
LAkJCS8qIHNjYW4gbWFpbGJveGVzICovCiAgbWJ4X2xpc3QsCQkJLyogbGlzdCBtYWlsYm94ZXMg
Ki8KICBtYnhfbHN1YiwJCQkvKiBsaXN0IHN1YnNjcmliZWQgbWFpbGJveGVzICovCiAgTklMLAkJ
CQkvKiBzdWJzY3JpYmUgdG8gbWFpbGJveCAqLwogIE5JTCwJCQkJLyogdW5zdWJzY3JpYmUgZnJv
bSBtYWlsYm94ICovCiAgbWJ4X2NyZWF0ZSwJCQkvKiBjcmVhdGUgbWFpbGJveCAqLwogIG1ieF9k
ZWxldGUsCQkJLyogZGVsZXRlIG1haWxib3ggKi8KICBtYnhfcmVuYW1lLAkJCS8qIHJlbmFtZSBt
YWlsYm94ICovCiAgbWJ4X3N0YXR1cywJCQkvKiBzdGF0dXMgb2YgbWFpbGJveCAqLwogIG1ieF9v
cGVuLAkJCS8qIG9wZW4gbWFpbGJveCAqLwogIG1ieF9jbG9zZSwJCQkvKiBjbG9zZSBtYWlsYm94
ICovCiAgbWJ4X2ZsYWdzLAkJCS8qIGZldGNoIG1lc3NhZ2UgImZhc3QiIGF0dHJpYnV0ZXMgKi8K
ICBtYnhfZmxhZ3MsCQkJLyogZmV0Y2ggbWVzc2FnZSBmbGFncyAqLwogIE5JTCwJCQkJLyogZmV0
Y2ggb3ZlcnZpZXcgKi8KICBOSUwsCQkJCS8qIGZldGNoIG1lc3NhZ2UgZW52ZWxvcGVzICovCiAg
bWJ4X2hlYWRlciwJCQkvKiBmZXRjaCBtZXNzYWdlIGhlYWRlciAqLwogIG1ieF90ZXh0LAkJCS8q
IGZldGNoIG1lc3NhZ2UgYm9keSAqLwogIE5JTCwJCQkJLyogZmV0Y2ggcGFydGlhbCBtZXNzYWdl
IHRleHQgKi8KICBOSUwsCQkJCS8qIHVuaXF1ZSBpZGVudGlmaWVyICovCiAgTklMLAkJCQkvKiBt
ZXNzYWdlIG51bWJlciAqLwogIG1ieF9mbGFnLAkJCS8qIG1vZGlmeSBmbGFncyAqLwogIG1ieF9m
bGFnbXNnLAkJCS8qIHBlci1tZXNzYWdlIG1vZGlmeSBmbGFncyAqLwogIE5JTCwJCQkJLyogc2Vh
cmNoIGZvciBtZXNzYWdlIGJhc2VkIG9uIGNyaXRlcmlhICovCiAgTklMLAkJCQkvKiBzb3J0IG1l
c3NhZ2VzICovCiAgTklMLAkJCQkvKiB0aHJlYWQgbWVzc2FnZXMgKi8KICBtYnhfcGluZywJCQkv
KiBwaW5nIG1haWxib3ggdG8gc2VlIGlmIHN0aWxsIGFsaXZlICovCiAgbWJ4X2NoZWNrLAkJCS8q
IGNoZWNrIGZvciBuZXcgbWVzc2FnZXMgKi8KICBtYnhfZXhwdW5nZSwJCQkvKiBleHB1bmdlIGRl
bGV0ZWQgbWVzc2FnZXMgKi8KICBtYnhfY29weSwJCQkvKiBjb3B5IG1lc3NhZ2VzIHRvIGFub3Ro
ZXIgbWFpbGJveCAqLwogIG1ieF9hcHBlbmQsCQkJLyogYXBwZW5kIHN0cmluZyBtZXNzYWdlIHRv
IG1haWxib3ggKi8KICBOSUwJCQkJLyogZ2FyYmFnZSBjb2xsZWN0IHN0cmVhbSAqLwp9OwoKCQkJ
CS8qIHByb3RvdHlwZSBzdHJlYW0gKi8KTUFJTFNUUkVBTSBtYnhwcm90byA9IHsmbWJ4ZHJpdmVy
fTsKDAovKiBNQlggbWFpbCB2YWxpZGF0ZSBtYWlsYm94CiAqIEFjY2VwdHM6IG1haWxib3ggbmFt
ZQogKiBSZXR1cm5zOiBvdXIgZHJpdmVyIGlmIG5hbWUgaXMgdmFsaWQsIE5JTCBvdGhlcndpc2UK
ICovCgpEUklWRVIgKm1ieF92YWxpZCAoY2hhciAqbmFtZSkKewogIGNoYXIgdG1wW01BSUxUTVBM
RU5dOwogIHJldHVybiBtYnhfaXN2YWxpZCAobmFtZSx0bXApID8gJm1ieGRyaXZlciA6IE5JTDsK
fQoKCi8qIE1CWCBtYWlsIHRlc3QgZm9yIHZhbGlkIG1haWxib3gKICogQWNjZXB0czogbWFpbGJv
eCBuYW1lCiAqCSAgICBzY3JhdGNoIGJ1ZmZlcgogKiBSZXR1cm5zOiBUIGlmIHZhbGlkLCBOSUwg
b3RoZXJ3aXNlCiAqLwoKaW50IG1ieF9pc3ZhbGlkIChjaGFyICpuYW1lLGNoYXIgKnRtcCkKewog
IGludCBmZDsKICBpbnQgcmV0ID0gTklMOwogIGNoYXIgKnMsaGRyW0hEUlNJWkVdOwogIHN0cnVj
dCBzdGF0IHNidWY7CiAgdGltZV90IHRwWzJdOwogIGVycm5vID0gRUlOVkFMOwkJLyogYXNzdW1l
IGludmFsaWQgYXJndW1lbnQgKi8KICBpZiAoKHMgPSBtYnhfZmlsZSAodG1wLG5hbWUpKSAmJiAh
c3RhdCAocywmc2J1ZikgJiYKICAgICAgKChmZCA9IG9wZW4gKHRtcCxPX1JET05MWSxOSUwpKSA+
PSAwKSkgewogICAgZXJybm8gPSAtMTsJCQkvKiBib2d1cyBmb3JtYXQgKi8KICAgIC8qIEkgbG92
ZSBjcmV0aW5vdXMgQyBjb21waWxlcnMgLS0gZG9uJ3QgeW91PyAqLwogICAgaWYgKHJlYWQgKGZk
LGhkcixIRFJTSVpFKSA9PSBIRFJTSVpFKQogICAgICBpZiAoKGhkclswXSA9PSAnKicpICYmICho
ZHJbMV0gPT0gJ20nKSAmJiAoaGRyWzJdID09ICdiJykgJiYKCSAgKGhkclszXSA9PSAneCcpICYm
IChoZHJbNF0gPT0gJyonKSAmJiAoaGRyWzVdID09ICdcMDE1JykgJiYKCSAgKGhkcls2XSA9PSAn
XDAxMicpICYmIGlzeGRpZ2l0IChoZHJbN10pICYmIGlzeGRpZ2l0IChoZHJbOF0pKQoJaWYgKGlz
eGRpZ2l0IChoZHJbOV0pICYmIGlzeGRpZ2l0IChoZHJbMTBdKSAmJiBpc3hkaWdpdCAoaGRyWzEx
XSkgJiYKCSAgICBpc3hkaWdpdCAoaGRyWzEyXSkgJiYgaXN4ZGlnaXQgKGhkclsxM10pICYmIGlz
eGRpZ2l0IChoZHJbMTRdKSAmJgoJICAgIGlzeGRpZ2l0IChoZHJbMTVdKSAmJiBpc3hkaWdpdCAo
aGRyWzE2XSkpCgkgIGlmIChpc3hkaWdpdCAoaGRyWzE3XSkgJiYgaXN4ZGlnaXQgKGhkclsxOF0p
ICYmCgkgICAgICBpc3hkaWdpdCAoaGRyWzE5XSkgJiYgaXN4ZGlnaXQgKGhkclsyMF0pICYmCgkg
ICAgICBpc3hkaWdpdCAoaGRyWzIxXSkgJiYgaXN4ZGlnaXQgKGhkclsyMl0pICYmCgkgICAgICAo
aGRyWzIzXSA9PSAnXDAxNScpICYmIChoZHJbMjRdID09ICdcMDEyJykpIHJldCA9IFQ7CiAgICBj
bG9zZSAoZmQpOwkJCS8qIGNsb3NlIHRoZSBmaWxlICovCiAgICB0cFswXSA9IHNidWYuc3RfYXRp
bWU7CS8qIHByZXNlcnZlIGF0aW1lIGFuZCBtdGltZSAqLwogICAgdHBbMV0gPSBzYnVmLnN0X210
aW1lOwogICAgdXRpbWUgKHRtcCx0cCk7CQkvKiBzZXQgdGhlIHRpbWVzICovCiAgfQoJCQkJLyog
aW4gY2FzZSBJTkJPWCBidXQgbm90IG1ieCBmb3JtYXQgKi8KICBlbHNlIGlmICgoZXJybm8gPT0g
RU5PRU5UKSAmJiAoKG5hbWVbMF0gPT0gJ0knKSB8fCAobmFtZVswXSA9PSAnaScpKSAmJgoJICAg
KChuYW1lWzFdID09ICdOJykgfHwgKG5hbWVbMV0gPT0gJ24nKSkgJiYKCSAgICgobmFtZVsyXSA9
PSAnQicpIHx8IChuYW1lWzJdID09ICdiJykpICYmCgkgICAoKG5hbWVbM10gPT0gJ08nKSB8fCAo
bmFtZVszXSA9PSAnbycpKSAmJgoJICAgKChuYW1lWzRdID09ICdYJykgfHwgKG5hbWVbNF0gPT0g
J3gnKSkgJiYgIW5hbWVbNV0pIGVycm5vID0gLTE7CiAgcmV0dXJuIHJldDsJCQkvKiByZXR1cm4g
d2hhdCB3ZSBzaG91bGQgKi8KfQoMCi8qIE1CWCBtYW5pcHVsYXRlIGRyaXZlciBwYXJhbWV0ZXJz
CiAqIEFjY2VwdHM6IGZ1bmN0aW9uIGNvZGUKICoJICAgIGZ1bmN0aW9uLWRlcGVuZGVudCB2YWx1
ZQogKiBSZXR1cm5zOiBmdW5jdGlvbi1kZXBlbmRlbnQgcmV0dXJuIHZhbHVlCiAqLwoKdm9pZCAq
bWJ4X3BhcmFtZXRlcnMgKGxvbmcgZnVuY3Rpb24sdm9pZCAqdmFsdWUpCnsKICB2b2lkICpyZXQg
PSBOSUw7CiAgc3dpdGNoICgoaW50KSBmdW5jdGlvbikgewogIGNhc2UgU0VUX09ORVRJTUVFWFBV
TkdFQVRQSU5HOgogICAgaWYgKHZhbHVlICYmICgoKE1CWExPQ0FMICopICgoTUFJTFNUUkVBTSAq
KSB2YWx1ZSktPmxvY2FsKS0+ZXhwdW5nZWQpKQogICAgICAoKE1CWExPQ0FMICopICgoTUFJTFNU
UkVBTSAqKSB2YWx1ZSktPmxvY2FsKS0+ZnVsbGNoZWNrID0gVDsKICBjYXNlIEdFVF9PTkVUSU1F
RVhQVU5HRUFUUElORzoKICAgIGlmICh2YWx1ZSkgcmV0ID0gKHZvaWQgKikKICAgICAgKChNQlhM
T0NBTCAqKSAoKE1BSUxTVFJFQU0gKikgdmFsdWUpLT5sb2NhbCktPmZ1bGxjaGVjazsKICAgIGJy
ZWFrOwogIH0KICByZXR1cm4gcmV0Owp9CgoKLyogTUJYIG1haWwgc2NhbiBtYWlsYm94ZXMKICog
QWNjZXB0czogbWFpbCBzdHJlYW0KICoJICAgIHJlZmVyZW5jZQogKgkgICAgcGF0dGVybiB0byBz
ZWFyY2gKICoJICAgIHN0cmluZyB0byBzY2FuCiAqLwoKdm9pZCBtYnhfc2NhbiAoTUFJTFNUUkVB
TSAqc3RyZWFtLGNoYXIgKnJlZixjaGFyICpwYXQsY2hhciAqY29udGVudHMpCnsKICBpZiAoc3Ry
ZWFtKSBkdW1teV9zY2FuIChOSUwscmVmLHBhdCxjb250ZW50cyk7Cn0KCgovKiBNQlggbWFpbCBs
aXN0IG1haWxib3hlcwogKiBBY2NlcHRzOiBtYWlsIHN0cmVhbQogKgkgICAgcmVmZXJlbmNlCiAq
CSAgICBwYXR0ZXJuIHRvIHNlYXJjaAogKi8KCnZvaWQgbWJ4X2xpc3QgKE1BSUxTVFJFQU0gKnN0
cmVhbSxjaGFyICpyZWYsY2hhciAqcGF0KQp7CiAgaWYgKHN0cmVhbSkgZHVtbXlfbGlzdCAoTklM
LHJlZixwYXQpOwp9CgoKLyogTUJYIG1haWwgbGlzdCBzdWJzY3JpYmVkIG1haWxib3hlcwogKiBB
Y2NlcHRzOiBtYWlsIHN0cmVhbQogKgkgICAgcmVmZXJlbmNlCiAqCSAgICBwYXR0ZXJuIHRvIHNl
YXJjaAogKi8KCnZvaWQgbWJ4X2xzdWIgKE1BSUxTVFJFQU0gKnN0cmVhbSxjaGFyICpyZWYsY2hh
ciAqcGF0KQp7CiAgaWYgKHN0cmVhbSkgZHVtbXlfbHN1YiAoTklMLHJlZixwYXQpOwp9CgwKLyog
TUJYIG1haWwgY3JlYXRlIG1haWxib3gKICogQWNjZXB0czogTUFJTCBzdHJlYW0KICoJICAgIG1h
aWxib3ggbmFtZSB0byBjcmVhdGUKICogUmV0dXJuczogVCBvbiBzdWNjZXNzLCBOSUwgb24gZmFp
bHVyZQogKi8KCmxvbmcgbWJ4X2NyZWF0ZSAoTUFJTFNUUkVBTSAqc3RyZWFtLGNoYXIgKm1haWxi
b3gpCnsKICBjaGFyICpzLCp0LG1ieFtNQUlMVE1QTEVOXSx0bXBbSERSU0laRV07CiAgbG9uZyBy
ZXQgPSBOSUw7CiAgaW50IGksZmQ7CiAgaWYgKCEocyA9IG1ieF9maWxlIChtYngsbWFpbGJveCkp
KSB7CiAgICBzcHJpbnRmIChtYngsIkNhbid0IGNyZWF0ZSAlLjgwczogaW52YWxpZCBuYW1lIixt
YWlsYm94KTsKICAgIG1tX2xvZyAobWJ4LEVSUk9SKTsKICB9CgkJCQkvKiBjcmVhdGUgdW5kZXJs
eWluZyBmaWxlICovCiAgZWxzZSBpZiAoZHVtbXlfY3JlYXRlX3BhdGggKHN0cmVhbSxzKSkgewoJ
CQkJLyogZG9uZSBpZiBtYWRlIGRpcmVjdG9yeSAqLwogICAgaWYgKChzID0gc3RycmNociAocywn
LycpKSAmJiAhc1sxXSkgcmV0dXJuIFQ7CiAgICBpZiAoKGZkID0gb3BlbiAobWJ4LE9fV1JPTkxZ
LAoJCSAgICAoaW50KSBtYWlsX3BhcmFtZXRlcnMgKE5JTCxHRVRfTUJYUFJPVEVDVElPTixOSUwp
KSkgPCAwKSB7CiAgICAgIHNwcmludGYgKHRtcCwiQ2FuJ3QgcmVvcGVuIG1haWxib3ggbm9kZSAl
LjgwczogJXMiLG1ieCxzdHJlcnJvciAoZXJybm8pKTsKICAgICAgbW1fbG9nICh0bXAsRVJST1Ip
OwogICAgICB1bmxpbmsgKG1ieCk7CQkvKiBkZWxldGUgdGhlIGZpbGUgKi8KICAgIH0KICAgIGVs
c2UgewkJCS8qIGluaXRpYWxpemUgaGVhZGVyICovCiAgICAgIG1lbXNldCAodG1wLCdcMCcsSERS
U0laRSk7CiAgICAgIHNwcmludGYgKHMgPSB0bXAsIiptYngqXDAxNVwwMTIlMDhseDAwMDAwMDAw
XDAxNVwwMTIiLAoJICAgICAgICh1bnNpZ25lZCBsb25nKSB0aW1lICgwKSk7CiAgICAgIGZvciAo
aSA9IDA7IGkgPCBOVVNFUkZMQUdTOyArK2kpCglzcHJpbnRmIChzICs9IHN0cmxlbiAocyksIiVz
XDAxNVwwMTIiLCh0ID0gZGVmYXVsdF91c2VyX2ZsYWcgKGkpKSA/CgkJIHQgOiAiIik7CiAgICAg
IGlmICh3cml0ZSAoZmQsdG1wLEhEUlNJWkUpICE9IEhEUlNJWkUpIHsKCXNwcmludGYgKHRtcCwi
Q2FuJ3QgaW5pdGlhbGl6ZSBtYWlsYm94IG5vZGUgJS44MHM6ICVzIiwKCQkgbWJ4LHN0cmVycm9y
IChlcnJubykpOwoJbW1fbG9nICh0bXAsRVJST1IpOwoJdW5saW5rIChtYngpOwkJLyogZGVsZXRl
IHRoZSBmaWxlICovCiAgICAgIH0KICAgICAgZWxzZSByZXQgPSBUOwkJLyogc3VjY2VzcyAqLwog
ICAgfQogICAgY2xvc2UgKGZkKTsJCQkvKiBjbG9zZSBmaWxlLCBzZXQgcHJvcGVyIHByb3RlY3Rp
b25zICovCiAgfQogIHJldHVybiByZXQgPyBzZXRfbWJ4X3Byb3RlY3Rpb25zIChtYWlsYm94LG1i
eCkgOiBOSUw7Cn0KCgovKiBNQlggbWFpbCBkZWxldGUgbWFpbGJveAogKiBBY2NlcHRzOiBNQUlM
IHN0cmVhbQogKgkgICAgbWFpbGJveCBuYW1lIHRvIGRlbGV0ZQogKiBSZXR1cm5zOiBUIG9uIHN1
Y2Nlc3MsIE5JTCBvbiBmYWlsdXJlCiAqLwoKbG9uZyBtYnhfZGVsZXRlIChNQUlMU1RSRUFNICpz
dHJlYW0sY2hhciAqbWFpbGJveCkKewogIHJldHVybiBtYnhfcmVuYW1lIChzdHJlYW0sbWFpbGJv
eCxOSUwpOwp9CgwKLyogTUJYIG1haWwgcmVuYW1lIG1haWxib3gKICogQWNjZXB0czogTUFJTCBz
dHJlYW0KICoJICAgIG9sZCBtYWlsYm94IG5hbWUKICoJICAgIG5ldyBtYWlsYm94IG5hbWUgKG9y
IE5JTCBmb3IgZGVsZXRlKQogKiBSZXR1cm5zOiBUIG9uIHN1Y2Nlc3MsIE5JTCBvbiBmYWlsdXJl
CiAqLwoKbG9uZyBtYnhfcmVuYW1lIChNQUlMU1RSRUFNICpzdHJlYW0sY2hhciAqb2xkLGNoYXIg
Km5ld25hbWUpCnsKICBsb25nIHJldCA9IFQ7CiAgY2hhciBjLCpzLHRtcFtNQUlMVE1QTEVOXSxm
aWxlW01BSUxUTVBMRU5dLGxvY2tbTUFJTFRNUExFTl07CiAgaW50IGxkOwogIGludCBmZCA9IG9w
ZW4gKG1ieF9maWxlIChmaWxlLG9sZCksT19SRFdSLE5JTCk7CiAgc3RydWN0IHN0YXQgc2J1ZjsK
ICBpZiAoZmQgPCAwKSB7CQkJLyogb3BlbiBtYWlsYm94ICovCiAgICBzcHJpbnRmICh0bXAsIkNh
bid0IG9wZW4gbWFpbGJveCAlLjgwczogJXMiLG9sZCxzdHJlcnJvciAoZXJybm8pKTsKICAgIG1t
X2xvZyAodG1wLEVSUk9SKTsKICAgIHJldHVybiBOSUw7CiAgfQoJCQkJLyogZ2V0IHBhcnNlL2Fw
cGVuZCBwZXJtaXNzaW9uICovCiAgaWYgKChsZCA9IGxvY2tmZCAoZmQsbG9jayxMT0NLX0VYKSkg
PCAwKSB7CiAgICBtbV9sb2cgKCJVbmFibGUgdG8gbG9jayByZW5hbWUgbWFpbGJveCIsRVJST1Ip
OwogICAgcmV0dXJuIE5JTDsKICB9CgkJCQkvKiBsb2NrIG91dCBvdGhlciB1c2VycyAqLwogIGlm
IChmbG9jayAoZmQsTE9DS19FWHxMT0NLX05CKSkgewogICAgY2xvc2UgKGZkKTsJCQkvKiBjb3Vs
ZG4ndCBsb2NrLCBnaXZlIHVwIG9uIGl0IHRoZW4gKi8KICAgIHNwcmludGYgKHRtcCwiTWFpbGJv
eCAlLjgwcyBpcyBpbiB1c2UgYnkgYW5vdGhlciBwcm9jZXNzIixvbGQpOwogICAgbW1fbG9nICh0
bXAsRVJST1IpOwogICAgdW5sb2NrZmQgKGxkLGxvY2spOwkJLyogcmVsZWFzZSBleGNsdXNpdmUg
cGFyc2UvYXBwZW5kIHBlcm1pc3Npb24gKi8KICAgIHJldHVybiBOSUw7CiAgfQogIGlmIChuZXdu
YW1lKSB7CQkvKiB3YW50IHJlbmFtZT8gKi8KICAgIGlmICghKChzID0gbWJ4X2ZpbGUgKHRtcCxu
ZXduYW1lKSkgJiYgKnMpKSB7CiAgICAgIHNwcmludGYgKHRtcCwiQ2FuJ3QgcmVuYW1lIG1haWxi
b3ggJS44MHMgdG8gJS44MHM6IGludmFsaWQgbmFtZSIsCgkgICAgICAgb2xkLG5ld25hbWUpOwog
ICAgICBtbV9sb2cgKHRtcCxFUlJPUik7CiAgICAgIHJldCA9IE5JTDsJCS8qIHNldCBmYWlsdXJl
ICovCiAgICB9CiAgICBpZiAocyA9IHN0cnJjaHIgKHMsJy8nKSkgewkvKiBmb3VuZCBzdXBlcmlv
ciB0byBkZXN0aW5hdGlvbiBuYW1lPyAqLwogICAgICBjID0gKisrczsJCQkvKiByZW1lbWJlciBm
aXJzdCBjaGFyYWN0ZXIgb2YgaW5mZXJpb3IgKi8KICAgICAgKnMgPSAnXDAnOwkJLyogdGllIG9m
ZiB0byBnZXQganVzdCBzdXBlcmlvciAqLwoJCQkJLyogbmFtZSBkb2Vzbid0IGV4aXN0LCBjcmVh
dGUgaXQgKi8KICAgICAgaWYgKChzdGF0ICh0bXAsJnNidWYpIHx8ICgoc2J1Zi5zdF9tb2RlICYg
U19JRk1UKSAhPSBTX0lGRElSKSkgJiYKCSAgIWR1bW15X2NyZWF0ZSAoc3RyZWFtLHRtcCkpIHJl
dCA9IE5JTDsKICAgICAgZWxzZSAqcyA9IGM7CQkvKiByZXN0b3JlIGZ1bGwgbmFtZSAqLwogICAg
fQoJCQkJLyogcmVuYW1lIHRoZSBmaWxlICovCiAgICBpZiAocmV0ICYmIHJlbmFtZSAoZmlsZSx0
bXApKSB7CiAgICAgIHNwcmludGYgKHRtcCwiQ2FuJ3QgcmVuYW1lIG1haWxib3ggJS44MHMgdG8g
JS44MHM6ICVzIixvbGQsbmV3bmFtZSwKCSAgICAgICBzdHJlcnJvciAoZXJybm8pKTsKICAgICAg
bW1fbG9nICh0bXAsRVJST1IpOwogICAgICByZXQgPSBOSUw7CQkvKiBzZXQgZmFpbHVyZSAqLwog
ICAgfQogIH0KICBlbHNlIGlmICh1bmxpbmsgKGZpbGUpKSB7CiAgICBzcHJpbnRmICh0bXAsIkNh
bid0IGRlbGV0ZSBtYWlsYm94ICUuODBzOiAlcyIsb2xkLHN0cmVycm9yIChlcnJubykpOwogICAg
bW1fbG9nICh0bXAsRVJST1IpOwogICAgcmV0ID0gTklMOwkJCS8qIHNldCBmYWlsdXJlICovCiAg
fQogIGZsb2NrIChmZCxMT0NLX1VOKTsJCS8qIHJlbGVhc2UgbG9jayBvbiB0aGUgZmlsZSAqLwog
IHVubG9ja2ZkIChsZCxsb2NrKTsJCS8qIHJlbGVhc2UgZXhjbHVzaXZlIHBhcnNlL2FwcGVuZCBw
ZXJtaXNzaW9uICovCiAgY2xvc2UgKGZkKTsJCQkvKiBjbG9zZSB0aGUgZmlsZSAqLwoJCQkJLyog
cmVjcmVhdGUgZmlsZSBpZiByZW5hbWVkIElOQk9YICovCiAgaWYgKHJldCAmJiAhc3RyY21wICh1
Y2FzZSAoc3RyY3B5ICh0bXAsb2xkKSksIklOQk9YIikpCiAgICBtYnhfY3JlYXRlIChOSUwsIklO
Qk9YIik7CiAgcmV0dXJuIHJldDsJCQkvKiByZXR1cm4gc3VjY2VzcyAqLwp9CgwKLyogTUJYIE1h
aWwgc3RhdHVzCiAqIEFjY2VwdHM6IG1haWwgc3RyZWFtCiAqCSAgICBtYWlsYm94IG5hbWUKICoJ
ICAgIHN0YXR1cyBmbGFncwogKiBSZXR1cm5zOiBUIG9uIHN1Y2Nlc3MsIE5JTCBvbiBmYWlsdXJl
CiAqLwoKbG9uZyBtYnhfc3RhdHVzIChNQUlMU1RSRUFNICpzdHJlYW0sY2hhciAqbWJ4LGxvbmcg
ZmxhZ3MpCnsKICBNQUlMU1RBVFVTIHN0YXR1czsKICB1bnNpZ25lZCBsb25nIGk7CiAgTUFJTFNU
UkVBTSAqdHN0cmVhbSA9IE5JTDsKICBNQUlMU1RSRUFNICpzeXN0cmVhbSA9IE5JTDsKCQkJCS8q
IG1ha2UgdGVtcG9yYXJ5IHN0cmVhbSAodW5sZXNzIHRoaXMgbWJ4KSAqLwogIGlmICghc3RyZWFt
ICYmICEoc3RyZWFtID0gdHN0cmVhbSA9CgkJICAgbWFpbF9vcGVuIChOSUwsbWJ4LE9QX1JFQURP
TkxZfE9QX1NJTEVOVCkpKSByZXR1cm4gTklMOwogIHN0YXR1cy5mbGFncyA9IGZsYWdzOwkJLyog
cmV0dXJuIHN0YXR1cyB2YWx1ZXMgKi8KICBzdGF0dXMubWVzc2FnZXMgPSBzdHJlYW0tPm5tc2dz
OwogIHN0YXR1cy5yZWNlbnQgPSBzdHJlYW0tPnJlY2VudDsKICBpZiAoZmxhZ3MgJiBTQV9VTlNF
RU4pCS8qIG11c3Qgc2VhcmNoIHRvIGdldCB1bnNlZW4gbWVzc2FnZXMgKi8KICAgIGZvciAoaSA9
IDEsc3RhdHVzLnVuc2VlbiA9IDA7IGkgPD0gc3RyZWFtLT5ubXNnczsgaSsrKQogICAgICBpZiAo
IW1haWxfZWx0IChzdHJlYW0saSktPnNlZW4pIHN0YXR1cy51bnNlZW4rKzsKICBzdGF0dXMudWlk
bmV4dCA9IHN0cmVhbS0+dWlkX2xhc3QgKyAxOwogIHN0YXR1cy51aWR2YWxpZGl0eSA9IHN0cmVh
bS0+dWlkX3ZhbGlkaXR5OwoJCQkJLyogY2FsY3VsYXRlIHBvc3Qtc25hcmYgcmVzdWx0cyAqLwog
IGlmICghc3RhdHVzLnJlY2VudCAmJiBzdHJlYW0tPmluYm94ICYmCiAgICAgIChzeXN0cmVhbSA9
IG1haWxfb3BlbiAoTklMLHN5c2luYm94ICgpLE9QX1JFQURPTkxZfE9QX1NJTEVOVCkpKSB7CiAg
ICBzdGF0dXMubWVzc2FnZXMgKz0gc3lzdHJlYW0tPm5tc2dzOwogICAgc3RhdHVzLnJlY2VudCAr
PSBzeXN0cmVhbS0+cmVjZW50OwogICAgaWYgKGZsYWdzICYgU0FfVU5TRUVOKQkvKiBtdXN0IHNl
YXJjaCB0byBnZXQgdW5zZWVuIG1lc3NhZ2VzICovCiAgICAgIGZvciAoaSA9IDE7IGkgPD0gc3lz
dHJlYW0tPm5tc2dzOyBpKyspCglpZiAoIW1haWxfZWx0IChzeXN0cmVhbSxpKS0+c2Vlbikgc3Rh
dHVzLnVuc2VlbisrOwoJCQkJLyoga2x1ZGdlIGJ1dCBwcm9iYWJseSBnb29kIGVub3VnaCAqLwog
ICAgc3RhdHVzLnVpZG5leHQgKz0gc3lzdHJlYW0tPm5tc2dzOwogIH0KCQkJCS8qIHBhc3Mgc3Rh
dHVzIHRvIG1haW4gcHJvZ3JhbSAqLwogIG1tX3N0YXR1cyAoc3RyZWFtLG1ieCwmc3RhdHVzKTsK
ICBpZiAodHN0cmVhbSkgbWFpbF9jbG9zZSAodHN0cmVhbSk7CiAgaWYgKHN5c3RyZWFtKSBtYWls
X2Nsb3NlIChzeXN0cmVhbSk7CiAgcmV0dXJuIFQ7CQkJLyogc3VjY2VzcyAqLwp9CgwKLyogTUJY
IG1haWwgb3BlbgogKiBBY2NlcHRzOiBzdHJlYW0gdG8gb3BlbgogKiBSZXR1cm5zOiBzdHJlYW0g
b24gc3VjY2VzcywgTklMIG9uIGZhaWx1cmUKICovCgpNQUlMU1RSRUFNICptYnhfb3BlbiAoTUFJ
TFNUUkVBTSAqc3RyZWFtKQp7CiAgaW50IGZkLGxkOwogIHNob3J0IHNpbGVudDsKICBjaGFyIHRt
cFtNQUlMVE1QTEVOXTsKICBibG9ja25vdGlmeV90IGJuID0gKGJsb2Nrbm90aWZ5X3QpIG1haWxf
cGFyYW1ldGVycyAoTklMLEdFVF9CTE9DS05PVElGWSxOSUwpOwoJCQkJLyogcmV0dXJuIHByb3Rv
dHlwZSBmb3IgT1BfUFJPVE9UWVBFIGNhbGwgKi8KICBpZiAoIXN0cmVhbSkgcmV0dXJuIHVzZXJf
ZmxhZ3MgKCZtYnhwcm90byk7CiAgaWYgKHN0cmVhbS0+bG9jYWwpIGZhdGFsICgibWJ4IHJlY3lj
bGUgc3RyZWFtIik7CiAgaWYgKHN0cmVhbS0+cmRvbmx5IHx8CiAgICAgIChmZCA9IG9wZW4gKG1i
eF9maWxlICh0bXAsc3RyZWFtLT5tYWlsYm94KSxPX1JEV1IsTklMKSkgPCAwKSB7CiAgICBpZiAo
KGZkID0gb3BlbiAobWJ4X2ZpbGUgKHRtcCxzdHJlYW0tPm1haWxib3gpLE9fUkRPTkxZLE5JTCkp
IDwgMCkgewogICAgICBzcHJpbnRmICh0bXAsIkNhbid0IG9wZW4gbWFpbGJveDogJXMiLHN0cmVy
cm9yIChlcnJubykpOwogICAgICBtbV9sb2cgKHRtcCxFUlJPUik7CiAgICAgIHJldHVybiBOSUw7
CiAgICB9CiAgICBlbHNlIGlmICghc3RyZWFtLT5yZG9ubHkpIHsJLyogZ290IGl0LCBidXQgcmVh
ZG9ubHkgKi8KICAgICAgbW1fbG9nICgiQ2FuJ3QgZ2V0IHdyaXRlIGFjY2VzcyB0byBtYWlsYm94
LCBhY2Nlc3MgaXMgcmVhZG9ubHkiLFdBUk4pOwogICAgICBzdHJlYW0tPnJkb25seSA9IFQ7CiAg
ICB9CiAgfQoMCiAgc3RyZWFtLT5sb2NhbCA9IG1lbXNldCAoZnNfZ2V0IChzaXplb2YgKE1CWExP
Q0FMKSksTklMLHNpemVvZiAoTUJYTE9DQUwpKTsKICBMT0NBTC0+ZmQgPSBmZDsJCS8qIGJpbmQg
dGhlIGZpbGUgKi8KICBMT0NBTC0+YnVmID0gKGNoYXIgKikgZnNfZ2V0IChNQVhNRVNTQUdFU0la
RSArIDEpOwogIExPQ0FMLT5idWZsZW4gPSBNQVhNRVNTQUdFU0laRTsKCQkJCS8qIG5vdGUgaWYg
YW4gSU5CT1ggb3Igbm90ICovCiAgc3RyZWFtLT5pbmJveCA9ICFzdHJjbXAodWNhc2UgKHN0cmNw
eSAoTE9DQUwtPmJ1ZixzdHJlYW0tPm1haWxib3gpKSwiSU5CT1giKTsKICBmc19naXZlICgodm9p
ZCAqKikgJnN0cmVhbS0+bWFpbGJveCk7CiAgc3RyZWFtLT5tYWlsYm94ID0gY3B5c3RyICh0bXAp
OwoJCQkJLyogZ2V0IHBhcnNlL2FwcGVuZCBwZXJtaXNzaW9uICovCiAgaWYgKChsZCA9IGxvY2tm
ZCAoTE9DQUwtPmZkLHRtcCxMT0NLX0VYKSkgPCAwKSB7CiAgICBtbV9sb2cgKCJVbmFibGUgdG8g
bG9jayBvcGVuIG1haWxib3giLEVSUk9SKTsKICAgIHJldHVybiBOSUw7CiAgfQogICgqYm4pIChC
TE9DS19GSUxFTE9DSyxOSUwpOwogIGZsb2NrIChMT0NBTC0+ZmQsTE9DS19TSCk7CS8qIGxvY2sg
dGhlIGZpbGUgKi8KICAoKmJuKSAoQkxPQ0tfTk9ORSxOSUwpOwogIHVubG9ja2ZkIChsZCx0bXAp
OwkJLyogcmVsZWFzZSBzaGFyZWQgcGFyc2UgcGVybWlzc2lvbiAqLwogIExPQ0FMLT5maWxlc2l6
ZSA9IEhEUlNJWkU7CS8qIGluaXRpYWxpemUgcGFyc2VkIGZpbGUgc2l6ZSAqLwoJCQkJLyogdGlt
ZSBub3Qgc2V0IHVwIHlldCAqLwogIExPQ0FMLT5sYXN0c25hcmYgPSBMT0NBTC0+ZmlsZXRpbWUg
PSAwOwogIExPQ0FMLT5mdWxsY2hlY2sgPSBMT0NBTC0+ZmxhZ2NoZWNrID0gTklMOwogIHN0cmVh
bS0+c2VxdWVuY2UrKzsJCS8qIGJ1bXAgc2VxdWVuY2UgbnVtYmVyICovCgkJCQkvKiBwYXJzZSBt
YWlsYm94ICovCiAgc3RyZWFtLT5ubXNncyA9IHN0cmVhbS0+cmVjZW50ID0gMDsKICBzaWxlbnQg
PSBzdHJlYW0tPnNpbGVudDsJLyogZGVmZXIgZXZlbnRzICovCiAgc3RyZWFtLT5zaWxlbnQgPSBU
OwogIGlmIChtYnhfcGluZyAoc3RyZWFtKSAmJiAhc3RyZWFtLT5ubXNncykKICAgIG1tX2xvZyAo
Ik1haWxib3ggaXMgZW1wdHkiLChsb25nKSBOSUwpOwogIHN0cmVhbS0+c2lsZW50ID0gc2lsZW50
OwkvKiBub3cgbm90aWZ5IHVwcGVyIGxldmVsICovCiAgbWFpbF9leGlzdHMgKHN0cmVhbSxzdHJl
YW0tPm5tc2dzKTsKICBtYWlsX3JlY2VudCAoc3RyZWFtLHN0cmVhbS0+cmVjZW50KTsKICBpZiAo
IUxPQ0FMKSByZXR1cm4gTklMOwkvKiBmYWlsdXJlIGlmIHN0cmVhbSBkaWVkICovCiAgc3RyZWFt
LT5wZXJtX3NlZW4gPSBzdHJlYW0tPnBlcm1fZGVsZXRlZCA9IHN0cmVhbS0+cGVybV9mbGFnZ2Vk
ID0KICAgIHN0cmVhbS0+cGVybV9hbnN3ZXJlZCA9IHN0cmVhbS0+cGVybV9kcmFmdCA9IHN0cmVh
bS0+cmRvbmx5ID8gTklMIDogVDsKICBzdHJlYW0tPnBlcm1fdXNlcl9mbGFncyA9IHN0cmVhbS0+
cmRvbmx5ID8gTklMIDogMHhmZmZmZmZmZjsKICBzdHJlYW0tPmt3ZF9jcmVhdGUgPSAoc3RyZWFt
LT51c2VyX2ZsYWdzW05VU0VSRkxBR1MtMV0gfHwgc3RyZWFtLT5yZG9ubHkpID8KICAgIE5JTCA6
IFQ7CQkJLyogY2FuIHdlIGNyZWF0ZSBuZXcgdXNlciBmbGFncz8gKi8KICByZXR1cm4gc3RyZWFt
OwkJLyogcmV0dXJuIHN0cmVhbSB0byBjYWxsZXIgKi8KfQoMCi8qIE1CWCBtYWlsIGNsb3NlCiAq
IEFjY2VwdHM6IE1BSUwgc3RyZWFtCiAqCSAgICBjbG9zZSBvcHRpb25zCiAqLwoKdm9pZCBtYnhf
Y2xvc2UgKE1BSUxTVFJFQU0gKnN0cmVhbSxsb25nIG9wdGlvbnMpCnsKICBpZiAoc3RyZWFtICYm
IExPQ0FMKSB7CS8qIG9ubHkgaWYgYSBmaWxlIGlzIG9wZW4gKi8KICAgIGludCBzaWxlbnQgPSBz
dHJlYW0tPnNpbGVudDsKICAgIHN0cmVhbS0+c2lsZW50ID0gVDsJCS8qIG5vdGUgdGhpcyBzdHJl
YW0gaXMgZHlpbmcgKi8KCQkJCS8qIGRvIGFuIGV4cHVuZ2UgaWYgcmVxdWVzdGVkICovCiAgICBp
ZiAob3B0aW9ucyAmIENMX0VYUFVOR0UpIG1ieF9leHB1bmdlIChzdHJlYW0pOwogICAgZWxzZSB7
CQkJLyogb3RoZXJ3aXNlIGRvIGEgY2hlY2twb2ludCB0byBwdXJnZSAqLwogICAgICBMT0NBTC0+
ZnVsbGNoZWNrID0gVDsJLyogIHBvc3NpYmxlIGV4cHVuZ2VkIG1lc3NhZ2VzICovCiAgICAgIG1i
eF9waW5nIChzdHJlYW0pOwogICAgfQogICAgc3RyZWFtLT5zaWxlbnQgPSBzaWxlbnQ7CS8qIHJl
c3RvcmUgcHJldmlvdXMgc3RhdHVzICovCiAgICBtYnhfYWJvcnQgKHN0cmVhbSk7CiAgfQp9CgoK
LyogTUJYIG1haWwgYWJvcnQgc3RyZWFtCiAqIEFjY2VwdHM6IE1BSUwgc3RyZWFtCiAqLwoKdm9p
ZCBtYnhfYWJvcnQgKE1BSUxTVFJFQU0gKnN0cmVhbSkKewogIGlmIChzdHJlYW0gJiYgTE9DQUwp
IHsJLyogb25seSBpZiBhIGZpbGUgaXMgb3BlbiAqLwogICAgZmxvY2sgKExPQ0FMLT5mZCxMT0NL
X1VOKTsJLyogdW5sb2NrIGxvY2FsIGZpbGUgKi8KICAgIGNsb3NlIChMT0NBTC0+ZmQpOwkJLyog
Y2xvc2UgdGhlIGxvY2FsIGZpbGUgKi8KCQkJCS8qIGZyZWUgbG9jYWwgdGV4dCBidWZmZXIgKi8K
ICAgIGlmIChMT0NBTC0+YnVmKSBmc19naXZlICgodm9pZCAqKikgJkxPQ0FMLT5idWYpOwoJCQkJ
LyogbnVrZSB0aGUgbG9jYWwgZGF0YSAqLwogICAgZnNfZ2l2ZSAoKHZvaWQgKiopICZzdHJlYW0t
PmxvY2FsKTsKICAgIHN0cmVhbS0+ZHRiID0gTklMOwkJLyogbG9nIG91dCB0aGUgRFRCICovCiAg
fQp9CgoKLyogTUJYIG1haWwgZmV0Y2ggZmxhZ3MKICogQWNjZXB0czogTUFJTCBzdHJlYW0KICoJ
ICAgIHNlcXVlbmNlCiAqCSAgICBvcHRpb24gZmxhZ3MKICogU25pZmZzIGF0IGZpbGUgdG8gc2Vl
IGlmIHNvbWUgb3RoZXIgcHJvY2VzcyBjaGFuZ2VkIHRoZSBmbGFncwogKi8KCnZvaWQgbWJ4X2Zs
YWdzIChNQUlMU1RSRUFNICpzdHJlYW0sY2hhciAqc2VxdWVuY2UsbG9uZyBmbGFncykKewogIHVu
c2lnbmVkIGxvbmcgaTsKICBpZiAobWJ4X3BpbmcgKHN0cmVhbSkgJiYgCS8qIHBpbmcgbWFpbGJv
eCwgZ2V0IG5ldyBzdGF0dXMgZm9yIG1lc3NhZ2VzICovCiAgICAgICgoZmxhZ3MgJiBGVF9VSUQp
ID8gbWFpbF91aWRfc2VxdWVuY2UgKHN0cmVhbSxzZXF1ZW5jZSkgOgogICAgICAgbWFpbF9zZXF1
ZW5jZSAoc3RyZWFtLHNlcXVlbmNlKSkpCiAgICBmb3IgKGkgPSAxOyBpIDw9IHN0cmVhbS0+bm1z
Z3M7IGkrKykgCiAgICAgIGlmIChtYWlsX2VsdCAoc3RyZWFtLGkpLT5zZXF1ZW5jZSkgbWJ4X2Vs
dCAoc3RyZWFtLGksTklMKTsKfQoMCi8qIE1CWCBtYWlsIGZldGNoIG1lc3NhZ2UgaGVhZGVyCiAq
IEFjY2VwdHM6IE1BSUwgc3RyZWFtCiAqCSAgICBtZXNzYWdlICMgdG8gZmV0Y2gKICoJICAgIHBv
aW50ZXIgdG8gcmV0dXJuZWQgaGVhZGVyIHRleHQgbGVuZ3RoCiAqCSAgICBvcHRpb24gZmxhZ3MK
ICogUmV0dXJuczogbWVzc2FnZSBoZWFkZXIgaW4gUkZDODIyIGZvcm1hdAogKi8KCmNoYXIgKm1i
eF9oZWFkZXIgKE1BSUxTVFJFQU0gKnN0cmVhbSx1bnNpZ25lZCBsb25nIG1zZ25vLHVuc2lnbmVk
IGxvbmcgKmxlbmd0aCwKCQkgIGxvbmcgZmxhZ3MpCnsKICB1bnNpZ25lZCBsb25nIGk7CiAgY2hh
ciAqczsKICAqbGVuZ3RoID0gMDsJCQkvKiBkZWZhdWx0IHRvIGVtcHR5ICovCiAgaWYgKGZsYWdz
ICYgRlRfVUlEKSByZXR1cm4gIiI7LyogVUlEIGNhbGwgImltcG9zc2libGUiICovCgkJCQkvKiBn
ZXQgaGVhZGVyIHBvc2l0aW9uLCBwb3NzaWJseSBoZWFkZXIgKi8KICBpID0gbWJ4X2hkcnBvcyAo
c3RyZWFtLG1zZ25vLGxlbmd0aCwmcyk7CiAgaWYgKHMpIHJldHVybiBzOwkJLyogbWJ4X2hkcnBv
cygpIHJldHVybmVkIGhlYWRlciAqLwogIGxzZWVrIChMT0NBTC0+ZmQsaSxMX1NFVCk7CS8qIGdl
dCB0byBoZWFkZXIgcG9zaXRpb24gKi8KCQkJCS8qIGlzIGJ1ZmZlciBiaWcgZW5vdWdoPyAqLwog
IGlmICgqbGVuZ3RoID4gTE9DQUwtPmJ1ZmxlbikgewogICAgZnNfZ2l2ZSAoKHZvaWQgKiopICZM
T0NBTC0+YnVmKTsKICAgIExPQ0FMLT5idWYgPSAoY2hhciAqKSBmc19nZXQgKChMT0NBTC0+YnVm
bGVuID0gKmxlbmd0aCkgKyAxKTsKICB9CiAgTE9DQUwtPmJ1ZlsqbGVuZ3RoXSA9ICdcMCc7CS8q
IHRpZSBvZmYgc3RyaW5nICovCgkJCQkvKiBzbHVycCB0aGUgZGF0YSAqLwogIHJlYWQgKExPQ0FM
LT5mZCxMT0NBTC0+YnVmLCpsZW5ndGgpOwogIHJldHVybiBMT0NBTC0+YnVmOwp9CgwKLyogTUJY
IG1haWwgZmV0Y2ggbWVzc2FnZSB0ZXh0IChib2R5IG9ubHkpCiAqIEFjY2VwdHM6IE1BSUwgc3Ry
ZWFtCiAqCSAgICBtZXNzYWdlICMgdG8gZmV0Y2gKICoJICAgIHBvaW50ZXIgdG8gcmV0dXJuZWQg
aGVhZGVyIHRleHQgbGVuZ3RoCiAqCSAgICBvcHRpb24gZmxhZ3MKICogUmV0dXJuczogVCwgYWx3
YXlzCiAqLwoKbG9uZyBtYnhfdGV4dCAoTUFJTFNUUkVBTSAqc3RyZWFtLHVuc2lnbmVkIGxvbmcg
bXNnbm8sU1RSSU5HICpicyxsb25nIGZsYWdzKQp7CiAgdW5zaWduZWQgbG9uZyBpLGo7CiAgTUVT
U0FHRUNBQ0hFICplbHQ7CgkJCQkvKiBVSUQgY2FsbCAiaW1wb3NzaWJsZSIgKi8KICBpZiAoZmxh
Z3MgJiBGVF9VSUQpIHJldHVybiBOSUw7CgkJCQkvKiBnZXQgbWVzc2FnZSBzdGF0dXMgKi8KICBl
bHQgPSBtYnhfZWx0IChzdHJlYW0sbXNnbm8sTklMKTsKCQkJCS8qIGlmIG1lc3NhZ2Ugbm90IHNl
ZW4gKi8KICBpZiAoIShmbGFncyAmIEZUX1BFRUspICYmICFlbHQtPnNlZW4pIHsKICAgIGVsdC0+
c2VlbiA9IFQ7CQkvKiBtYXJrIG1lc3NhZ2UgYXMgc2VlbiAqLwoJCQkJLyogcmVjYWxjdWxhdGUg
c3RhdHVzICovCiAgICBtYnhfdXBkYXRlX3N0YXR1cyAoc3RyZWFtLG1zZ25vLG11c19TWU5DKTsK
ICAgIG1tX2ZsYWdzIChzdHJlYW0sbXNnbm8pOwogIH0KCQkJCS8qIGZpbmQgaGVhZGVyIHBvc2l0
aW9uICovCiAgaSA9IG1ieF9oZHJwb3MgKHN0cmVhbSxtc2dubywmaixOSUwpOwoJCQkJLyogZ28g
dG8gdGV4dCBwb3NpdGlvbiAqLwogIGxzZWVrIChMT0NBTC0+ZmQsaSArIGosTF9TRVQpOwoJCQkJ
LyogaXMgYnVmZmVyIGJpZyBlbm91Z2g/ICovCiAgaWYgKChpID0gZWx0LT5yZmM4MjJfc2l6ZSAt
IGopID4gTE9DQUwtPmJ1ZmxlbikgewogICAgZnNfZ2l2ZSAoKHZvaWQgKiopICZMT0NBTC0+YnVm
KTsKICAgIExPQ0FMLT5idWYgPSAoY2hhciAqKSBmc19nZXQgKChMT0NBTC0+YnVmbGVuID0gaSkg
KyAxKTsKICB9CiAgcmVhZCAoTE9DQUwtPmZkLExPQ0FMLT5idWYsaSk7Lyogc2x1cnAgdGhlIGRh
dGEgKi8KICBMT0NBTC0+YnVmW2ldID0gJ1wwJzsJCS8qIHRpZSBvZmYgc3RyaW5nICovCgkJCQkv
KiBzZXQgdXAgc3RyaW5nc3RydWN0ICovCiAgSU5JVCAoYnMsbWFpbF9zdHJpbmcsTE9DQUwtPmJ1
ZixpKTsKICByZXR1cm4gVDsJCQkvKiBzdWNjZXNzICovCn0KDAovKiBNQlggbWFpbCBtb2RpZnkg
ZmxhZ3MKICogQWNjZXB0czogTUFJTCBzdHJlYW0KICoJICAgIHNlcXVlbmNlCiAqCSAgICBmbGFn
KHMpCiAqCSAgICBvcHRpb24gZmxhZ3MKICovCgp2b2lkIG1ieF9mbGFnIChNQUlMU1RSRUFNICpz
dHJlYW0sY2hhciAqc2VxdWVuY2UsY2hhciAqZmxhZyxsb25nIGZsYWdzKQp7CiAgc3RydWN0IHN0
YXQgc2J1ZjsKICBpZiAoIXN0cmVhbS0+cmRvbmx5KSB7CS8qIG1ha2Ugc3VyZSB0aGUgdXBkYXRl
IHRha2VzICovCiAgICBmc3luYyAoTE9DQUwtPmZkKTsKICAgIGZzdGF0IChMT0NBTC0+ZmQsJnNi
dWYpOwkvKiBnZXQgY3VycmVudCB3cml0ZSB0aW1lICovCiAgICBMT0NBTC0+ZmlsZXRpbWUgPSBz
YnVmLnN0X210aW1lOwogIH0KICBpZiAoKExPQ0FMLT5mZnVzZXJmbGFnIDwgTlVTRVJGTEFHUykm
JnN0cmVhbS0+dXNlcl9mbGFnc1tMT0NBTC0+ZmZ1c2VyZmxhZ10pCiAgICBtYnhfdXBkYXRlX2hl
YWRlciAoc3RyZWFtKTsJLyogdXBkYXRlIGhlYWRlciAqLwp9CgoKLyogTUJYIG1haWwgcGVyLW1l
c3NhZ2UgbW9kaWZ5IGZsYWdzCiAqIEFjY2VwdHM6IE1BSUwgc3RyZWFtCiAqCSAgICBtZXNzYWdl
IGNhY2hlIGVsZW1lbnQKICovCgp2b2lkIG1ieF9mbGFnbXNnIChNQUlMU1RSRUFNICpzdHJlYW0s
TUVTU0FHRUNBQ0hFICplbHQpCnsKICBzdHJ1Y3Qgc3RhdCBzYnVmOwoJCQkJLyogbWF5YmUgbmVl
ZCB0byBkbyBhIGNoZWNrcG9pbnQ/ICovCiAgaWYgKExPQ0FMLT5maWxldGltZSAmJiAhTE9DQUwt
PmZsYWdjaGVjaykgewogICAgZnN0YXQgKExPQ0FMLT5mZCwmc2J1Zik7CS8qIGdldCBjdXJyZW50
IHdyaXRlIHRpbWUgKi8KICAgIGlmIChMT0NBTC0+ZmlsZXRpbWUgPCBzYnVmLnN0X210aW1lKSBM
T0NBTC0+ZmxhZ2NoZWNrID0gVDsKICAgIExPQ0FMLT5maWxldGltZSA9IDA7CS8qIGRvbid0IGRv
IHRoaXMgdGVzdCBmb3IgYW55IG90aGVyIG1lc3NhZ2VzICovCiAgfQoJCQkJLyogcmVjYWxjdWxh
dGUgc3RhdHVzICovCiAgbWJ4X3VwZGF0ZV9zdGF0dXMgKHN0cmVhbSxlbHQtPm1zZ25vLE5JTCk7
Cn0KDAovKiBNQlggbWFpbCBwaW5nIG1haWxib3gKICogQWNjZXB0czogTUFJTCBzdHJlYW0KICog
UmV0dXJuczogVCBpZiBzdHJlYW0gc3RpbGwgYWxpdmUsIE5JTCBpZiBub3QKICovCgpsb25nIG1i
eF9waW5nIChNQUlMU1RSRUFNICpzdHJlYW0pCnsKICB1bnNpZ25lZCBsb25nIGkgPSAxOwogIGxv
bmcgciA9IFQ7CiAgaW50IGxkOwogIGNoYXIgbG9ja1tNQUlMVE1QTEVOXTsKICBzdHJ1Y3Qgc3Rh
dCBzYnVmOwogIGlmIChzdHJlYW0gJiYgTE9DQUwpIHsJLyogb25seSBpZiBzdHJlYW0gYWxyZWFk
eSBvcGVuICovCiAgICBpbnQgc25hcmYgPSBzdHJlYW0tPmluYm94ICYmICFzdHJlYW0tPnJkb25s
eTsKICAgIGZzdGF0IChMT0NBTC0+ZmQsJnNidWYpOwkvKiBnZXQgY3VycmVudCBmaWxlIHBvb3Ag
Ki8KICAgIGlmICghTE9DQUwtPmZ1bGxjaGVjaykgewkvKiBkb24ndCBib3RoZXIgaWYgYWxyZWFk
eSBmdWxsIGNoZWNraW5nICovCiAgICAgIGlmIChMT0NBTC0+ZXhwdW5nZWQgJiYgbWFpbF9wYXJh
bWV0ZXJzIChOSUwsR0VUX0VYUFVOR0VBVFBJTkcsTklMKSkKCUxPQ0FMLT5mdWxsY2hlY2sgPSBU
OwkvKiB1cGdyYWRlIHRvIGV4cHVuZ2VkIG1lc3NhZ2UgY2hlY2tpbmcgKi8KICAgICAgZWxzZSBp
ZiAoTE9DQUwtPmZpbGV0aW1lICYmIChMT0NBTC0+ZmlsZXRpbWUgPCBzYnVmLnN0X210aW1lKSkK
CUxPQ0FMLT5mbGFnY2hlY2sgPSBUOwkvKiB1cGdyYWRlIHRvIGZsYWcgY2hlY2tpbmcgKi8KICAg
IH0KCQkJCS8qIHN3ZWVwIG1haWxib3ggZm9yIGNoYW5nZWQgbWVzc2FnZSBzdGF0dXMgKi8KICAg
IGlmIChMT0NBTC0+ZnVsbGNoZWNrIHx8IExPQ0FMLT5mbGFnY2hlY2spIHsKICAgICAgd2hpbGUg
KGkgPD0gc3RyZWFtLT5ubXNncykgaWYgKG1ieF9lbHQgKHN0cmVhbSxpLExPQ0FMLT5mdWxsY2hl
Y2spKSArK2k7CiAgICAgIExPQ0FMLT5mbGFnY2hlY2sgPSBOSUw7CS8qIGdvdCBhbGwgdGhlIHVw
ZGF0ZXMgKi8KICAgIH0KICAgIGlmICgoc25hcmYgfHwgKGkgPSAoc2J1Zi5zdF9zaXplIC0gTE9D
QUwtPmZpbGVzaXplKSB8fCAhc3RyZWFtLT5ubXNncykpICYmCgkoKGxkID0gbG9ja2ZkIChMT0NB
TC0+ZmQsbG9jayxMT0NLX0VYKSkgPj0gMCkpIHsKCQkJCS8qIHBhcnNlIG5ldyBtZXNzYWdlcyBp
biBtYWlsYm94ICovCiAgICAgIGlmIChpKSByID0gbWJ4X3BhcnNlIChzdHJlYW0pOwogICAgICBp
ZiAoTE9DQUwgJiYgc25hcmYpIHsJLyogc25hcmYgbmV3IG1lc3NhZ2VzIGlmIHN0aWxsIE9LICov
CgltYnhfc25hcmYgKHN0cmVhbSk7CglyID0gbWJ4X3BhcnNlIChzdHJlYW0pOwkvKiBwYXJzZSBz
bmFyZmVkIG1lc3NhZ2VzICovCiAgICAgIH0KICAgICAgdW5sb2NrZmQgKGxkLGxvY2spOwkvKiBy
ZWxlYXNlIHNoYXJlZCBwYXJzZS9hcHBlbmQgcGVybWlzc2lvbiAqLwogICAgfQogICAgZWxzZSBp
ZiAoKHNidWYuc3RfY3RpbWUgPiBzYnVmLnN0X2F0aW1lKXx8KHNidWYuc3RfY3RpbWUgPiBzYnVm
LnN0X210aW1lKSl7CiAgICAgIHRpbWVfdCB0cFsyXTsJCS8qIHdoYWNrIHRoZSB0aW1lcyBpZiBu
ZWNlc3NhcnkgKi8KICAgICAgTE9DQUwtPmZpbGV0aW1lID0gdHBbMF0gPSB0cFsxXSA9IHRpbWUg
KDApOwogICAgICB1dGltZSAoc3RyZWFtLT5tYWlsYm94LHRwKTsKICAgIH0KICAgIGlmIChyICYm
IExPQ0FMLT5mdWxsY2hlY2spIHsvKiBmdWxsIGNoZWNrIHJlcXVlc3RlZD8gKi8KCQkJCS8qIG5v
IG1vcmUgZnVsbCBjaGVjayBvciBwZW5kaW5nIGV4cHVuZ2UgKi8KICAgICAgTE9DQUwtPmZ1bGxj
aGVjayA9IExPQ0FMLT5leHB1bmdlZCA9IE5JTDsKICAgICAgaWYgKCFzdHJlYW0tPnJkb25seSkg
ewkvKiByZXdyaXRlIGlmIG5vdCByZWFkb25seSAqLwoJaWYgKG1ieF9yZXdyaXRlIChzdHJlYW0s
JmksTklMKSkgZmF0YWwgKCJleHB1bmdlIG9uIGNoZWNrIik7CglpZiAoaSkgewoJICBzcHJpbnRm
IChMT0NBTC0+YnVmLCJSZWNsYWltZWQgJWx1IGJ5dGVzIG9mIGV4cHVuZ2VkIHNwYWNlIixpKTsK
CSAgbW1fbG9nIChMT0NBTC0+YnVmLChsb25nKSBOSUwpOwoJfQogICAgICB9CiAgICB9CiAgfQog
IHJldHVybiByOwkJCS8qIHJldHVybiByZXN1bHQgb2YgdGhlIHBhcnNlICovCn0KDAovKiBNQlgg
bWFpbCBjaGVjayBtYWlsYm94IChyZXBhcnNlcyBzdGF0dXMgdG9vKQogKiBBY2NlcHRzOiBNQUlM
IHN0cmVhbQogKi8KCnZvaWQgbWJ4X2NoZWNrIChNQUlMU1RSRUFNICpzdHJlYW0pCnsKCQkJCS8q
IG1hcmsgdGhhdCBhIGNoZWNrIGlzIGRlc2lyZWQgKi8KICBpZiAoTE9DQUwpIExPQ0FMLT5mdWxs
Y2hlY2sgPSBUOwogIGlmIChtYnhfcGluZyAoc3RyZWFtKSkgbW1fbG9nICgiQ2hlY2sgY29tcGxl
dGVkIiwobG9uZykgTklMKTsKfQoKCi8qIE1CWCBtYWlsIGV4cHVuZ2UgbWFpbGJveAogKiBBY2Nl
cHRzOiBNQUlMIHN0cmVhbQogKi8KCnZvaWQgbWJ4X2V4cHVuZ2UgKE1BSUxTVFJFQU0gKnN0cmVh
bSkKewogIHN0cnVjdCBzdGF0IHNidWY7CiAgdW5zaWduZWQgbG9uZyBuZXhwLHJlY2xhaW1lZDsK
ICBpZiAoIW1ieF9waW5nIChzdHJlYW0pKTsJLyogZG8gbm90aGluZyBpZiBzdHJlYW0gZGVhZCAq
LwogIGVsc2UgaWYgKHN0cmVhbS0+cmRvbmx5KQkvKiB3b24ndCBkbyBvbiByZWFkb25seSBmaWxl
cyEgKi8KICAgIG1tX2xvZyAoIkV4cHVuZ2UgaWdub3JlZCBvbiByZWFkb25seSBtYWlsYm94IixX
QVJOKTsKICBlbHNlIHsJCQkvKiBzZWUgaWYgd2lsbCBuZWVkIGEgZmxhZ2NoZWNrIGFmdGVyIHRo
aXMgKi8KICAgIGlmIChMT0NBTC0+ZmlsZXRpbWUgJiYgIUxPQ0FMLT5mbGFnY2hlY2spIHsKICAg
ICAgZnN0YXQgKExPQ0FMLT5mZCwmc2J1Zik7CS8qIGdldCBjdXJyZW50IHdyaXRlIHRpbWUgKi8K
ICAgICAgaWYgKExPQ0FMLT5maWxldGltZSA8IHNidWYuc3RfbXRpbWUpIExPQ0FMLT5mbGFnY2hl
Y2sgPSBUOwogICAgfQoJCQkJLyogaWYgZXhwdW5nZWQgYW55IG1lc3NhZ2VzICovCiAgICBpZiAo
bmV4cCA9IG1ieF9yZXdyaXRlIChzdHJlYW0sJnJlY2xhaW1lZCxUKSkgewogICAgICBzcHJpbnRm
IChMT0NBTC0+YnVmLCJFeHB1bmdlZCAlbHUgbWVzc2FnZXMiLG5leHApOwogICAgICBtbV9sb2cg
KExPQ0FMLT5idWYsKGxvbmcpIE5JTCk7CiAgICB9CiAgICBlbHNlIGlmIChyZWNsYWltZWQpIHsJ
Lyogb3IgaWYgYW55IHByaW9yIGV4cHVuZ2VkIHNwYWNlIHJlY2xhaW1lZCAqLwogICAgICBzcHJp
bnRmIChMT0NBTC0+YnVmLCJSZWNsYWltZWQgJWx1IGJ5dGVzIG9mIGV4cHVuZ2VkIHNwYWNlIixy
ZWNsYWltZWQpOwogICAgICBtbV9sb2cgKExPQ0FMLT5idWYsKGxvbmcpIE5JTCk7CiAgICB9CiAg
ICBlbHNlIG1tX2xvZyAoIk5vIG1lc3NhZ2VzIGRlbGV0ZWQsIHNvIG5vIHVwZGF0ZSBuZWVkZWQi
LChsb25nKSBOSUwpOwogIH0KfQoMCi8qIE1CWCBtYWlsIHNuYXJmIG1lc3NhZ2VzIGZyb20gc3lz
dGVtIGluYm94CiAqIEFjY2VwdHM6IE1BSUwgc3RyZWFtLCBhbHJlYWR5IGxvY2tlZAogKi8KCnZv
aWQgbWJ4X3NuYXJmIChNQUlMU1RSRUFNICpzdHJlYW0pCnsKICB1bnNpZ25lZCBsb25nIGkgPSAw
OwogIHVuc2lnbmVkIGxvbmcgaixyLGhkcmxlbix0eHRsZW47CiAgc3RydWN0IHN0YXQgc2J1ZjsK
ICBjaGFyICpoZHIsKnR4dCx0bXBbTUFJTFRNUExFTl07CiAgTUVTU0FHRUNBQ0hFICplbHQ7CiAg
TUFJTFNUUkVBTSAqc3lzaWJ4ID0gTklMOwoJCQkJLyogZ2l2ZSB1cCBpZiBjYW4ndCBnZXQgZXhj
bHVzaXZlIHBlcm1pc3Npb24gKi8KICBpZiAoKHRpbWUgKDApIDwgKExPQ0FMLT5sYXN0c25hcmYg
KyAzMCkpIHx8CiAgICAgICFzdHJjbXAgKHN5c2luYm94ICgpLHN0cmVhbS0+bWFpbGJveCkpIHJl
dHVybjsKICBtbV9jcml0aWNhbCAoc3RyZWFtKTsJCS8qIGdvIGNyaXRpY2FsICovCgkJCQkvKiBz
ZWUgaWYgYW55dGhpbmcgdGhlcmUgKi8KICBpZiAoIXN0YXQgKHN5c2luYm94ICgpLCZzYnVmKSAm
JiBzYnVmLnN0X3NpemUpIHsKICAgIGZzdGF0IChMT0NBTC0+ZmQsJnNidWYpOwkvKiB5ZXMsIGdl
dCBjdXJyZW50IGZpbGUgc2l6ZSAqLwoJCQkJLyogc2l6ZXMgbWF0Y2ggYW5kIGNhbiBnZXQgc3lz
aWJ4IG1haWxib3g/ICovCiAgICBpZiAoKHNidWYuc3Rfc2l6ZSA9PSBMT0NBTC0+ZmlsZXNpemUp
ICYmIAoJKHN5c2lieCA9IG1haWxfb3BlbiAoc3lzaWJ4LHN5c2luYm94ICgpLE9QX1NJTEVOVCkp
ICYmCgkoIXN5c2lieC0+cmRvbmx5KSAmJiAociA9IHN5c2lieC0+bm1zZ3MpKSB7CgkJCQkvKiB5
ZXMsIGdvIHRvIGVuZCBvZiBmaWxlIGluIG91ciBtYWlsYm94ICovCiAgICAgIGxzZWVrIChMT0NB
TC0+ZmQsc2J1Zi5zdF9zaXplLExfU0VUKTsKCQkJCS8qIGZvciBlYWNoIG1lc3NhZ2UgaW4gc3lz
aWJ4IG1haWxib3ggKi8KICAgICAgd2hpbGUgKHIgJiYgKCsraSA8PSBzeXNpYngtPm5tc2dzKSkg
ewoJCQkJLyogc25hcmYgbWVzc2FnZSBmcm9tIHN5c3RlbSBJTkJPWCAqLwoJaGRyID0gY3B5c3Ry
IChtYWlsX2ZldGNoaGVhZGVyX2Z1bGwgKHN5c2lieCxpLE5JTCwmaGRybGVuLE5JTCkpOwoJdHh0
ID0gbWFpbF9mZXRjaHRleHRfZnVsbCAoc3lzaWJ4LGksJnR4dGxlbixGVF9QRUVLKTsKCWlmIChq
ID0gaGRybGVuICsgdHh0bGVuKSB7CgkJCQkvKiBjYWxjdWxhdGUgaGVhZGVyIGxpbmUgKi8KCSAg
bWFpbF9kYXRlIChMT0NBTC0+YnVmLGVsdCA9IG1haWxfZWx0IChzeXNpYngsaSkpOwoJICBzcHJp
bnRmIChMT0NBTC0+YnVmICsgc3RybGVuIChMT0NBTC0+YnVmKSwKCQkgICAiLCVsdTswMDAwMDAw
MCUwNHgtMDAwMDAwMDBcMDE1XDAxMiIsaiwodW5zaWduZWQpCgkJICAgKChmU0VFTiAqIGVsdC0+
c2VlbikgKwoJCSAgICAoZkRFTEVURUQgKiBlbHQtPmRlbGV0ZWQpICsgKGZGTEFHR0VEICogZWx0
LT5mbGFnZ2VkKSArCgkJICAgIChmQU5TV0VSRUQgKiBlbHQtPmFuc3dlcmVkKSArIChmRFJBRlQg
KiBlbHQtPmRyYWZ0KSkpOwoJCQkJLyogY29weSBtZXNzYWdlICovCgkgIGlmICgod3JpdGUgKExP
Q0FMLT5mZCxMT0NBTC0+YnVmLHN0cmxlbiAoTE9DQUwtPmJ1ZikpIDwgMCkgfHwKCSAgICAgICh3
cml0ZSAoTE9DQUwtPmZkLGhkcixoZHJsZW4pIDwgMCkgfHwKCSAgICAgICh3cml0ZSAoTE9DQUwt
PmZkLHR4dCx0eHRsZW4pIDwgMCkpIHIgPSAwOwoJfQoJZnNfZ2l2ZSAoKHZvaWQgKiopICZoZHIp
OwogICAgICB9CgwKCQkJCS8qIG1ha2Ugc3VyZSBhbGwgdGhlIHVwZGF0ZXMgdGFrZSAqLwogICAg
ICBpZiAoZnN5bmMgKExPQ0FMLT5mZCkpIHIgPSAwOwogICAgICBpZiAocikgewkJCS8qIGRlbGV0
ZSBhbGwgdGhlIG1lc3NhZ2VzIHdlIGNvcGllZCAqLwoJaWYgKHIgPT0gMSkgc3RyY3B5ICh0bXAs
IjEiKTsKCWVsc2Ugc3ByaW50ZiAodG1wLCIxOiVsdSIscik7CgltYWlsX3NldGZsYWcgKHN5c2li
eCx0bXAsIlxcRGVsZXRlZCIpOwoJbWFpbF9leHB1bmdlIChzeXNpYngpOwkvKiBub3cgZXhwdW5n
ZSBhbGwgdGhvc2UgbWVzc2FnZXMgKi8KICAgICAgfQogICAgICBlbHNlIHsKCXNwcmludGYgKExP
Q0FMLT5idWYsIkNhbid0IGNvcHkgbmV3IG1haWw6ICVzIixzdHJlcnJvciAoZXJybm8pKTsKCW1t
X2xvZyAoTE9DQUwtPmJ1ZixFUlJPUik7CglmdHJ1bmNhdGUgKExPQ0FMLT5mZCxzYnVmLnN0X3Np
emUpOwogICAgICB9CiAgICAgIGZzdGF0IChMT0NBTC0+ZmQsJnNidWYpOwkvKiB5ZXMsIGdldCBj
dXJyZW50IGZpbGUgc2l6ZSAqLwogICAgICBMT0NBTC0+ZmlsZXRpbWUgPSBzYnVmLnN0X210aW1l
OwogICAgfQogICAgaWYgKHN5c2lieCkgbWFpbF9jbG9zZSAoc3lzaWJ4KTsKICB9CiAgbW1fbm9j
cml0aWNhbCAoc3RyZWFtKTsJLyogcmVsZWFzZSBjcml0aWNhbCAqLwogIExPQ0FMLT5sYXN0c25h
cmYgPSB0aW1lICgwKTsJLyogbm90ZSB0aW1lIG9mIGxhc3Qgc25hcmYgKi8KfQoMCi8qIE1CWCBt
YWlsIGNvcHkgbWVzc2FnZShzKQogKiBBY2NlcHRzOiBNQUlMIHN0cmVhbQogKgkgICAgc2VxdWVu
Y2UKICoJICAgIGRlc3RpbmF0aW9uIG1haWxib3gKICoJICAgIGNvcHkgb3B0aW9ucwogKiBSZXR1
cm5zOiBUIGlmIHN1Y2Nlc3MsIE5JTCBpZiBmYWlsZWQKICovCgpsb25nIG1ieF9jb3B5IChNQUlM
U1RSRUFNICpzdHJlYW0sY2hhciAqc2VxdWVuY2UsY2hhciAqbWFpbGJveCxsb25nIG9wdGlvbnMp
CnsKICBzdHJ1Y3Qgc3RhdCBzYnVmOwogIHRpbWVfdCB0cFsyXTsKICBNRVNTQUdFQ0FDSEUgKmVs
dDsKICB1bnNpZ25lZCBsb25nIGksaixrOwogIGxvbmcgcmV0ID0gTE9OR1Q7CiAgaW50IGZkLGxk
OwogIGNoYXIgZmlsZVtNQUlMVE1QTEVOXSxsb2NrW01BSUxUTVBMRU5dOwogIG1haWxwcm94eWNv
cHlfdCBwYyA9CiAgICAobWFpbHByb3h5Y29weV90KSBtYWlsX3BhcmFtZXRlcnMgKHN0cmVhbSxH
RVRfTUFJTFBST1hZQ09QWSxOSUwpOwoJCQkJLyogbWFrZSBzdXJlIHZhbGlkIG1haWxib3ggKi8K
ICBpZiAoIW1ieF9pc3ZhbGlkIChtYWlsYm94LExPQ0FMLT5idWYpKSBzd2l0Y2ggKGVycm5vKSB7
CiAgY2FzZSBFTk9FTlQ6CQkJLyogbm8gc3VjaCBmaWxlPyAqLwogICAgbW1fbm90aWZ5IChzdHJl
YW0sIltUUllDUkVBVEVdIE11c3QgY3JlYXRlIG1haWxib3ggYmVmb3JlIGNvcHkiLE5JTCk7CiAg
ICByZXR1cm4gTklMOwogIGNhc2UgRUlOVkFMOgogICAgaWYgKHBjKSByZXR1cm4gKCpwYykgKHN0
cmVhbSxzZXF1ZW5jZSxtYWlsYm94LG9wdGlvbnMpOwogICAgc3ByaW50ZiAoTE9DQUwtPmJ1Ziwi
SW52YWxpZCBNQlgtZm9ybWF0IG1haWxib3ggbmFtZTogJS44MHMiLG1haWxib3gpOwogICAgbW1f
bG9nIChMT0NBTC0+YnVmLEVSUk9SKTsKICAgIHJldHVybiBOSUw7CiAgZGVmYXVsdDoKICAgIGlm
IChwYykgcmV0dXJuICgqcGMpIChzdHJlYW0sc2VxdWVuY2UsbWFpbGJveCxvcHRpb25zKTsKICAg
IHNwcmludGYgKExPQ0FMLT5idWYsIk5vdCBhIE1CWC1mb3JtYXQgbWFpbGJveDogJS44MHMiLG1h
aWxib3gpOwogICAgbW1fbG9nIChMT0NBTC0+YnVmLEVSUk9SKTsKICAgIHJldHVybiBOSUw7CiAg
fQogIGlmICghKChvcHRpb25zICYgQ1BfVUlEKSA/IG1haWxfdWlkX3NlcXVlbmNlIChzdHJlYW0s
c2VxdWVuY2UpIDoKCW1haWxfc2VxdWVuY2UgKHN0cmVhbSxzZXF1ZW5jZSkpKSByZXR1cm4gTklM
OwoJCQkJLyogZ290IGZpbGU/ICovICAKICBpZiAoKGZkPW9wZW4obWJ4X2ZpbGUoZmlsZSxtYWls
Ym94KSxPX1JEV1J8T19DUkVBVCxTX0lSRUFEfFNfSVdSSVRFKSk8MCkgewogICAgc3ByaW50ZiAo
TE9DQUwtPmJ1ZiwiVW5hYmxlIHRvIG9wZW4gY29weSBtYWlsYm94OiAlcyIsc3RyZXJyb3IgKGVy
cm5vKSk7CiAgICBtbV9sb2cgKExPQ0FMLT5idWYsRVJST1IpOwogICAgcmV0dXJuIE5JTDsKICB9
CiAgbW1fY3JpdGljYWwgKHN0cmVhbSk7CQkvKiBnbyBjcml0aWNhbCAqLwoJCQkJLyogZ2V0IHBh
cnNlL2FwcGVuZCBwZXJtaXNzaW9uICovCiAgaWYgKChsZCA9IGxvY2tmZCAoZmQsbG9jayxMT0NL
X0VYKSkgPCAwKSB7CiAgICBtbV9sb2cgKCJVbmFibGUgdG8gbG9jayBjb3B5IG1haWxib3giLEVS
Uk9SKTsKICAgIHJldHVybiBOSUw7CiAgfQogIGZzdGF0IChmZCwmc2J1Zik7CQkvKiBnZXQgY3Vy
cmVudCBmaWxlIHNpemUgKi8KICBsc2VlayAoZmQsc2J1Zi5zdF9zaXplLExfU0VUKTsvKiBtb3Zl
IHRvIGVuZCBvZiBmaWxlICovCgwKCQkJCS8qIGZvciBlYWNoIHJlcXVlc3RlZCBtZXNzYWdlICov
CiAgZm9yIChpID0gMTsgcmV0ICYmIChpIDw9IHN0cmVhbS0+bm1zZ3MpOyBpKyspIAogICAgaWYg
KChlbHQgPSBtYWlsX2VsdCAoc3RyZWFtLGkpKS0+c2VxdWVuY2UpIHsKICAgICAgbHNlZWsgKExP
Q0FMLT5mZCxlbHQtPnByaXZhdGUuc3BlY2lhbC5vZmZzZXQgKwoJICAgICBlbHQtPnByaXZhdGUu
c3BlY2lhbC50ZXh0LnNpemUsTF9TRVQpOwogICAgICBtYWlsX2RhdGUoTE9DQUwtPmJ1ZixlbHQp
Oy8qIGJ1aWxkIHRhcmdldCBoZWFkZXIgKi8KICAgICAgc3ByaW50ZiAoTE9DQUwtPmJ1ZitzdHJs
ZW4oTE9DQUwtPmJ1ZiksIiwlbHU7JTA4bHglMDR4LTAwMDAwMDAwXDAxNVwwMTIiLAoJICAgICAg
IGVsdC0+cmZjODIyX3NpemUsZWx0LT51c2VyX2ZsYWdzLCh1bnNpZ25lZCkKCSAgICAgICAoKGZT
RUVOICogZWx0LT5zZWVuKSArIChmREVMRVRFRCAqIGVsdC0+ZGVsZXRlZCkgKwoJCShmRkxBR0dF
RCAqIGVsdC0+ZmxhZ2dlZCkgKyAoZkFOU1dFUkVEICogZWx0LT5hbnN3ZXJlZCkgKwoJCShmRFJB
RlQgKiBlbHQtPmRyYWZ0KSkpOwoJCQkJLyogd3JpdGUgdGFyZ2V0IGhlYWRlciAqLwogICAgICBp
ZiAocmV0ID0gKHdyaXRlIChmZCxMT0NBTC0+YnVmLHN0cmxlbiAoTE9DQUwtPmJ1ZikpID4gMCkp
Cglmb3IgKGsgPSBlbHQtPnJmYzgyMl9zaXplOyByZXQgJiYgKGogPSBtaW4gKGssTE9DQUwtPmJ1
ZmxlbikpOyBrIC09IGopewoJICByZWFkIChMT0NBTC0+ZmQsTE9DQUwtPmJ1ZixqKTsKCSAgcmV0
ID0gd3JpdGUgKGZkLExPQ0FMLT5idWYsaikgPj0gMDsKCX0KICAgIH0KCQkJCS8qIG1ha2Ugc3Vy
ZSBhbGwgdGhlIHVwZGF0ZXMgdGFrZSAqLwogIGlmICghKHJldCAmJiAocmV0ID0gIWZzeW5jIChm
ZCkpKSkgewogICAgc3ByaW50ZiAoTE9DQUwtPmJ1ZiwiVW5hYmxlIHRvIHdyaXRlIG1lc3NhZ2U6
ICVzIixzdHJlcnJvciAoZXJybm8pKTsKICAgIG1tX2xvZyAoTE9DQUwtPmJ1ZixFUlJPUik7CiAg
ICBmdHJ1bmNhdGUgKGZkLHNidWYuc3Rfc2l6ZSk7CiAgfQogIHRwWzBdID0gc2J1Zi5zdF9hdGlt
ZTsJLyogcHJlc2VydmUgYXRpbWUgYW5kIG10aW1lICovCiAgdHBbMV0gPSBzYnVmLnN0X210aW1l
OwogIHV0aW1lIChmaWxlLHRwKTsJCS8qIHNldCB0aGUgdGltZXMgKi8KICBjbG9zZSAoZmQpOwkJ
CS8qIGNsb3NlIHRoZSBmaWxlICovCiAgdW5sb2NrZmQgKGxkLGxvY2spOwkJLyogcmVsZWFzZSBl
eGNsdXNpdmUgcGFyc2UvYXBwZW5kIHBlcm1pc3Npb24gKi8KICBtbV9ub2NyaXRpY2FsIChzdHJl
YW0pOwkvKiByZWxlYXNlIGNyaXRpY2FsICovCgkJCQkvKiBkZWxldGUgYWxsIHJlcXVlc3RlZCBt
ZXNzYWdlcyAqLwogIGlmIChyZXQgJiYgKG9wdGlvbnMgJiBDUF9NT1ZFKSkgewogICAgZm9yIChp
ID0gMTsgaSA8PSBzdHJlYW0tPm5tc2dzOyApIGlmIChlbHQgPSBtYnhfZWx0IChzdHJlYW0saSxU
KSkgewogICAgICBpZiAoZWx0LT5zZXF1ZW5jZSkgewkvKiB3YW50IHRvIGRvIHRoaXMgbWVzc2Fn
ZT8gKi8KCWVsdC0+ZGVsZXRlZCA9IFQ7CS8qIG1hcmsgbWVzc2FnZSBkZWxldGVkICovCgkJCQkv
KiByZWNhbGN1bGF0ZSBzdGF0dXMgKi8KCW1ieF91cGRhdGVfc3RhdHVzIChzdHJlYW0saSxOSUwp
OwogICAgICB9CiAgICAgIGkrKzsJCQkvKiBtb3ZlIHRvIG5leHQgbWVzc2FnZSAqLwogICAgfQog
ICAgaWYgKCFzdHJlYW0tPnJkb25seSkgewkvKiBtYWtlIHN1cmUgdGhlIHVwZGF0ZSB0YWtlcyAq
LwogICAgICBmc3luYyAoTE9DQUwtPmZkKTsKICAgICAgZnN0YXQgKExPQ0FMLT5mZCwmc2J1Zik7
CS8qIGdldCBjdXJyZW50IHdyaXRlIHRpbWUgKi8KICAgICAgTE9DQUwtPmZpbGV0aW1lID0gc2J1
Zi5zdF9tdGltZTsKICAgIH0KICB9CiAgcmV0dXJuIHJldDsKfQoMCi8qIE1CWCBtYWlsIGFwcGVu
ZCBtZXNzYWdlIGZyb20gc3RyaW5nc3RydWN0CiAqIEFjY2VwdHM6IE1BSUwgc3RyZWFtCiAqCSAg
ICBkZXN0aW5hdGlvbiBtYWlsYm94CiAqCSAgICBhcHBlbmQgY2FsbGJhY2sKICoJICAgIGRhdGEg
Zm9yIGNhbGxiYWNrCiAqIFJldHVybnM6IFQgaWYgYXBwZW5kIHN1Y2Nlc3NmdWwsIGVsc2UgTklM
CiAqLwoKbG9uZyBtYnhfYXBwZW5kIChNQUlMU1RSRUFNICpzdHJlYW0sY2hhciAqbWFpbGJveCxh
cHBlbmRfdCBhZix2b2lkICpkYXRhKQp7CiAgc3RydWN0IHN0YXQgc2J1ZjsKICBpbnQgZmQsbGQs
YzsKICBjaGFyICpmbGFncywqZGF0ZSx0bXBbTUFJTFRNUExFTl0sZmlsZVtNQUlMVE1QTEVOXSxs
b2NrW01BSUxUTVBMRU5dOwogIHRpbWVfdCB0cFsyXTsKICBGSUxFICpkZjsKICBNRVNTQUdFQ0FD
SEUgZWx0OwogIGxvbmcgZjsKICB1bnNpZ25lZCBsb25nIGksdWY7CiAgU1RSSU5HICptZXNzYWdl
OwogIGxvbmcgcmV0ID0gTE9OR1Q7CgkJCQkvKiBkZWZhdWx0IHN0cmVhbSB0byBwcm90b3R5cGUg
Ki8KICBpZiAoIXN0cmVhbSkgc3RyZWFtID0gdXNlcl9mbGFncyAoJm1ieHByb3RvKTsKCQkJCS8q
IG1ha2Ugc3VyZSB2YWxpZCBtYWlsYm94ICovCiAgaWYgKCFtYnhfaXN2YWxpZCAobWFpbGJveCx0
bXApKSBzd2l0Y2ggKGVycm5vKSB7CiAgY2FzZSBFTk9FTlQ6CQkJLyogbm8gc3VjaCBmaWxlPyAq
LwogICAgaWYgKCgobWFpbGJveFswXSA9PSAnSScpIHx8IChtYWlsYm94WzBdID09ICdpJykpICYm
CgkoKG1haWxib3hbMV0gPT0gJ04nKSB8fCAobWFpbGJveFsxXSA9PSAnbicpKSAmJgoJKChtYWls
Ym94WzJdID09ICdCJykgfHwgKG1haWxib3hbMl0gPT0gJ2InKSkgJiYKCSgobWFpbGJveFszXSA9
PSAnTycpIHx8IChtYWlsYm94WzNdID09ICdvJykpICYmCgkoKG1haWxib3hbNF0gPT0gJ1gnKSB8
fCAobWFpbGJveFs0XSA9PSAneCcpKSAmJiAhbWFpbGJveFs1XSkKICAgICAgbWJ4X2NyZWF0ZSAo
TklMLCJJTkJPWCIpOwogICAgZWxzZSB7CiAgICAgIG1tX25vdGlmeSAoc3RyZWFtLCJbVFJZQ1JF
QVRFXSBNdXN0IGNyZWF0ZSBtYWlsYm94IGJlZm9yZSBhcHBlbmQiLE5JTCk7CiAgICAgIHJldHVy
biBOSUw7CiAgICB9CgkJCQkvKiBmYWxscyB0aHJvdWdoICovCiAgY2FzZSAwOgkJCS8qIG1lcmVs
eSBlbXB0eSBmaWxlPyAqLwogICAgYnJlYWs7CiAgY2FzZSBFSU5WQUw6CiAgICBzcHJpbnRmICh0
bXAsIkludmFsaWQgTUJYLWZvcm1hdCBtYWlsYm94IG5hbWU6ICUuODBzIixtYWlsYm94KTsKICAg
IG1tX2xvZyAodG1wLEVSUk9SKTsKICAgIHJldHVybiBOSUw7CiAgZGVmYXVsdDoKICAgIHNwcmlu
dGYgKHRtcCwiTm90IGEgTUJYLWZvcm1hdCBtYWlsYm94OiAlLjgwcyIsbWFpbGJveCk7CiAgICBt
bV9sb2cgKHRtcCxFUlJPUik7CiAgICByZXR1cm4gTklMOwogIH0KCQkJCS8qIGdldCBmaXJzdCBt
ZXNzYWdlICovCiAgaWYgKCEoKmFmKSAoc3RyZWFtLGRhdGEsJmZsYWdzLCZkYXRlLCZtZXNzYWdl
KSkgcmV0dXJuIE5JTDsKDAoJCQkJLyogb3BlbiBkZXN0aW5hdGlvbiBtYWlsYm94ICovCiAgaWYg
KCgoZmQgPSBvcGVuIChtYnhfZmlsZSAoZmlsZSxtYWlsYm94KSxPX1dST05MWXxPX0FQUEVORHxP
X0NSRUFULAoJCSAgIFNfSVJFQUR8U19JV1JJVEUpKSA8IDApIHx8ICEoZGYgPSBmZG9wZW4gKGZk
LCJhYiIpKSkgewogICAgc3ByaW50ZiAodG1wLCJDYW4ndCBvcGVuIGFwcGVuZCBtYWlsYm94OiAl
cyIsc3RyZXJyb3IgKGVycm5vKSk7CiAgICBtbV9sb2cgKHRtcCxFUlJPUik7CiAgICByZXR1cm4g
TklMOwogIH0KCQkJCS8qIGdldCBwYXJzZS9hcHBlbmQgcGVybWlzc2lvbiAqLwogIGlmICgobGQg
PSBsb2NrZmQgKGZkLGxvY2ssTE9DS19FWCkpIDwgMCkgewogICAgbW1fbG9nICgiVW5hYmxlIHRv
IGxvY2sgYXBwZW5kIG1haWxib3giLEVSUk9SKTsKICAgIGNsb3NlIChmZCk7CiAgICByZXR1cm4g
TklMOwogIH0KICBtbV9jcml0aWNhbCAoc3RyZWFtKTsJCS8qIGdvIGNyaXRpY2FsICovCiAgZnN0
YXQgKGZkLCZzYnVmKTsJCS8qIGdldCBjdXJyZW50IGZpbGUgc2l6ZSAqLwogIGRvIHsJCQkJLyog
cGFyc2UgZmxhZ3MgKi8KICAgIGYgPSBtYWlsX3BhcnNlX2ZsYWdzIChzdHJlYW0sZmxhZ3MsJnVm
KTsKICAgIGlmIChkYXRlKSB7CQkJLyogcGFyc2UgZGF0ZSBpZiBnaXZlbiAqLwogICAgICBpZiAo
IW1haWxfcGFyc2VfZGF0ZSAoJmVsdCxkYXRlKSkgewoJc3ByaW50ZiAodG1wLCJCYWQgZGF0ZSBp
biBhcHBlbmQ6ICUuODBzIixkYXRlKTsKCW1tX2xvZyAodG1wLEVSUk9SKTsKCXJldCA9IE5JTDsJ
CS8qIG1hcmsgZmFpbHVyZSAqLwoJYnJlYWs7CiAgICAgIH0KICAgICAgbWFpbF9kYXRlICh0bXAs
JmVsdCk7CS8qIHdyaXRlIHByZXNldmVkIGRhdGUgKi8KICAgIH0KICAgIGVsc2UgaW50ZXJuYWxf
ZGF0ZSAodG1wKTsJLyogZ2V0IGN1cnJlbnQgZGF0ZSBpbiBJTUFQIGZvcm1hdCAqLwoJCQkJLyog
d3JpdGUgaGVhZGVyICovCiAgICBpZiAoZnByaW50ZiAoZGYsIiVzLCVsdTslMDhseCUwNGx4LTAw
MDAwMDAwXDAxNVwwMTIiLHRtcCwKCQkgaSA9IFNJWkUgKG1lc3NhZ2UpLHVmLCh1bnNpZ25lZCBs
b25nKSBmKSA8IDApIHJldCA9IE5JTDsKICAgIGVsc2UgewkJCS8qIHdyaXRlIG1lc3NhZ2UgKi8K
ICAgICAgaWYgKGkpIGRvIGMgPSAweGZmICYgU05YIChtZXNzYWdlKTsKICAgICAgd2hpbGUgKChw
dXRjIChjLGRmKSAhPSBFT0YpICYmIC0taSk7CgkJCQkvKiBnZXQgbmV4dCBtZXNzYWdlICovCiAg
ICAgIGlmIChpIHx8ICEoKmFmKSAoc3RyZWFtLGRhdGEsJmZsYWdzLCZkYXRlLCZtZXNzYWdlKSkg
cmV0ID0gTklMOwogICAgfQogIH0gd2hpbGUgKHJldCAmJiBtZXNzYWdlKTsKCQkJCS8qIGlmIGVy
cm9yLi4uICovCiAgaWYgKCFyZXQgfHwgKGZmbHVzaCAoZGYpID09IEVPRikpIHsKICAgIGZ0cnVu
Y2F0ZSAoZmQsc2J1Zi5zdF9zaXplKTsvKiByZXZlcnQgZmlsZSAqLwogICAgY2xvc2UgKGZkKTsJ
CQkvKiBtYWtlIHN1cmUgZmNsb3NlKCkgZG9lc24ndCBjb3JydXB0IHVzICovCiAgICBzcHJpbnRm
ICh0bXAsIk1lc3NhZ2UgYXBwZW5kIGZhaWxlZDogJXMiLHN0cmVycm9yIChlcnJubykpOwogICAg
bW1fbG9nICh0bXAsRVJST1IpOwogICAgcmV0ID0gTklMOwogIH0KICB0cFswXSA9IHNidWYuc3Rf
YXRpbWU7CS8qIHByZXNlcnZlIGF0aW1lIGFuZCBtdGltZSAqLwogIHRwWzFdID0gc2J1Zi5zdF9t
dGltZTsKICB1dGltZSAoZmlsZSx0cCk7CQkvKiBzZXQgdGhlIHRpbWVzICovCiAgZmNsb3NlIChk
Zik7CQkJLyogY2xvc2UgdGhlIGZpbGUgKi8KICB1bmxvY2tmZCAobGQsbG9jayk7CQkvKiByZWxl
YXNlIGV4Y2x1c2l2ZSBwYXJzZS9hcHBlbmQgcGVybWlzc2lvbiAqLwogIG1tX25vY3JpdGljYWwg
KHN0cmVhbSk7CS8qIHJlbGVhc2UgY3JpdGljYWwgKi8KICByZXR1cm4gcmV0Owp9CgwKLyogSW50
ZXJuYWwgcm91dGluZXMgKi8KCgovKiBNQlggbWFpbCBnZW5lcmF0ZSBmaWxlIHN0cmluZwogKiBB
Y2NlcHRzOiB0ZW1wb3JhcnkgYnVmZmVyIHRvIHdyaXRlIGludG8KICoJICAgIG1haWxib3ggbmFt
ZSBzdHJpbmcKICogUmV0dXJuczogbG9jYWwgZmlsZSBzdHJpbmcgb3IgTklMIGlmIGZhaWx1cmUK
ICovCgpjaGFyICptYnhfZmlsZSAoY2hhciAqZHN0LGNoYXIgKm5hbWUpCnsKICBjaGFyICpzID0g
bWFpbGJveGZpbGUgKGRzdCxuYW1lKTsKICByZXR1cm4gKHMgJiYgISpzKSA/IG1haWxib3hmaWxl
IChkc3QsIn4vSU5CT1giKSA6IHM7Cn0KDAovKiBNQlggbWFpbCBwYXJzZSBtYWlsYm94CiAqIEFj
Y2VwdHM6IE1BSUwgc3RyZWFtCiAqIFJldHVybnM6IFQgaWYgcGFyc2UgT0sKICoJICAgIE5JTCBp
ZiBmYWlsdXJlLCBzdHJlYW0gYWJvcnRlZAogKi8KCmxvbmcgbWJ4X3BhcnNlIChNQUlMU1RSRUFN
ICpzdHJlYW0pCnsKICBzdHJ1Y3Qgc3RhdCBzYnVmOwogIE1FU1NBR0VDQUNIRSAqZWx0ID0gTklM
OwogIGNoYXIgYywqcywqdCwqeDsKICBjaGFyIHRtcFtNQUlMVE1QTEVOXTsKICB1bnNpZ25lZCBs
b25nIGksaixrLG07CiAgb2ZmX3QgY3VycG9zID0gTE9DQUwtPmZpbGVzaXplOwogIHVuc2lnbmVk
IGxvbmcgbm1zZ3MgPSBzdHJlYW0tPm5tc2dzOwogIHVuc2lnbmVkIGxvbmcgcmVjZW50ID0gc3Ry
ZWFtLT5yZWNlbnQ7CiAgdW5zaWduZWQgbG9uZyBsYXN0dWlkID0gMDsKICBzaG9ydCBzaWxlbnQg
PSBzdHJlYW0tPnNpbGVudDsKICBmc3RhdCAoTE9DQUwtPmZkLCZzYnVmKTsJLyogZ2V0IHN0YXR1
cyAqLwogIGlmIChzYnVmLnN0X3NpemUgPCBjdXJwb3MpIHsJLyogc2FuaXR5IGNoZWNrICovCiAg
ICBzcHJpbnRmICh0bXAsIk1haWxib3ggc2hyYW5rIGZyb20gJWx1IHRvICVsdSEiLAoJICAgICAo
dW5zaWduZWQgbG9uZykgY3VycG9zLCh1bnNpZ25lZCBsb25nKSBzYnVmLnN0X3NpemUpOwogICAg
bW1fbG9nICh0bXAsRVJST1IpOwogICAgbWJ4X2Fib3J0IChzdHJlYW0pOwogICAgcmV0dXJuIE5J
TDsKICB9CiAgbHNlZWsgKExPQ0FMLT5mZCwwLExfU0VUKTsJLyogcmV3aW5kIGZpbGUgKi8KCQkJ
CS8qIHJlYWQgaW50ZXJuYWwgaGVhZGVyICovCiAgcmVhZCAoTE9DQUwtPmZkLExPQ0FMLT5idWYs
SERSU0laRSk7CiAgTE9DQUwtPmJ1ZltIRFJTSVpFXSA9ICdcMCc7CS8qIHRpZSBvZmYgaGVhZGVy
ICovCiAgYyA9IExPQ0FMLT5idWZbMTVdOwkJLyogc2F2ZSBmaXJzdCBjaGFyYWN0ZXIgb2YgbGFz
dCBVSUQgKi8KICBMT0NBTC0+YnVmWzE1XSA9ICdcMCc7CgkJCQkvKiBwYXJzZSBVSUQgdmFsaWRp
dHkgKi8KICBzdHJlYW0tPnVpZF92YWxpZGl0eSA9IHN0cnRvdWwgKExPQ0FMLT5idWYgKyA3LE5J
TCwxNik7CiAgTE9DQUwtPmJ1ZlsxNV0gPSBjOwkJLyogcmVzdG9yZSBmaXJzdCBjaGFyYWN0ZXIg
b2YgbGFzdCBVSUQgKi8KCQkJCS8qIHBhcnNlIGxhc3QgVUlEICovCiAgaSA9IHN0cnRvdWwgKExP
Q0FMLT5idWYgKyAxNSxOSUwsMTYpOwogIHN0cmVhbS0+dWlkX2xhc3QgPSBzdHJlYW0tPnJkb25s
eSA/IG1heCAoaSxzdHJlYW0tPnVpZF9sYXN0KSA6IGk7CgkJCQkvKiBwYXJzZSB1c2VyIGZsYWdz
ICovCiAgZm9yIChpID0gMCwgcyA9IExPQ0FMLT5idWYgKyAyNTsKICAgICAgIChpIDwgTlVTRVJG
TEFHUykgJiYgKHQgPSBzdHJjaHIgKHMsJ1wwMTUnKSkgJiYgKHQgLSBzKTsKICAgICAgIGkrKywg
cyA9IHQgKyAyKSB7CiAgICAqdCA9ICdcMCc7CQkJLyogdGllIG9mZiBmbGFnICovCiAgICBpZiAo
IXN0cmVhbS0+dXNlcl9mbGFnc1tpXSAmJiAoc3RybGVuIChzKSA8PSBNQVhVU0VSRkxBRykpCiAg
ICAgIHN0cmVhbS0+dXNlcl9mbGFnc1tpXSA9IGNweXN0ciAocyk7CiAgfQogIExPQ0FMLT5mZnVz
ZXJmbGFnID0gKGludCkgaTsJLyogZmlyc3QgZnJlZSB1c2VyIGZsYWcgKi8KDAogIHN0cmVhbS0+
c2lsZW50ID0gVDsJCS8qIGRvbid0IHBhc3MgdXAgbW1fZXhpc3RzKCkgZXZlbnRzIHlldCAqLwog
IHdoaWxlIChzYnVmLnN0X3NpemUgLSBjdXJwb3Mpey8qIHdoaWxlIHRoZXJlIGlzIHN0dWZmIHRv
IHBhcnNlICovCgkJCQkvKiBnZXQgdG8gdGhhdCBwb3NpdGlvbiBpbiB0aGUgZmlsZSAqLwogICAg
bHNlZWsgKExPQ0FMLT5mZCxjdXJwb3MsTF9TRVQpOwogICAgaWYgKChpID0gcmVhZCAoTE9DQUwt
PmZkLExPQ0FMLT5idWYsNjQpKSA8PSAwKSB7CiAgICAgIHNwcmludGYgKHRtcCwiVW5hYmxlIHRv
IHJlYWQgaW50ZXJuYWwgaGVhZGVyIGF0ICVsdSwgc2l6ZSA9ICVsdTogJXMiLAoJICAgICAgICh1
bnNpZ25lZCBsb25nKSBjdXJwb3MsKHVuc2lnbmVkIGxvbmcpIHNidWYuc3Rfc2l6ZSwKCSAgICAg
ICBpID8gc3RyZXJyb3IgKGVycm5vKSA6ICJubyBkYXRhIHJlYWQiKTsKICAgICAgbW1fbG9nICh0
bXAsRVJST1IpOwogICAgICBtYnhfYWJvcnQgKHN0cmVhbSk7CiAgICAgIHJldHVybiBOSUw7CiAg
ICB9CiAgICBMT0NBTC0+YnVmW2ldID0gJ1wwJzsJLyogdGllIG9mZiBidWZmZXIganVzdCBpbiBj
YXNlICovCiAgICBpZiAoISgocyA9IHN0cmNociAoTE9DQUwtPmJ1ZiwnXDAxNScpKSAmJiAoc1sx
XSA9PSAnXDAxMicpKSkgewogICAgICBzcHJpbnRmICh0bXAsIlVuYWJsZSB0byBmaW5kIENSTEYg
YXQgJWx1IGluICVsdSBieXRlcywgdGV4dDogJS44MHMiLAoJICAgICAgICh1bnNpZ25lZCBsb25n
KSBjdXJwb3MsaSxMT0NBTC0+YnVmKTsKICAgICAgbW1fbG9nICh0bXAsRVJST1IpOwogICAgICBt
YnhfYWJvcnQgKHN0cmVhbSk7CiAgICAgIHJldHVybiBOSUw7CiAgICB9CiAgICAqcyA9ICdcMCc7
CQkJLyogdGllIG9mZiBoZWFkZXIgbGluZSAqLwogICAgaSA9IChzICsgMikgLSBMT0NBTC0+YnVm
OwkvKiBub3RlIHN0YXJ0IG9mIHRleHQgb2Zmc2V0ICovCiAgICBpZiAoISgocyA9IHN0cmNociAo
TE9DQUwtPmJ1ZiwnLCcpKSAmJiAodCA9IHN0cmNociAocysxLCc7JykpKSkgewogICAgICBzcHJp
bnRmICh0bXAsIlVuYWJsZSB0byBwYXJzZSBpbnRlcm5hbCBoZWFkZXIgYXQgJWx1OiAlLjgwcyIs
CgkgICAgICAgKHVuc2lnbmVkIGxvbmcpIGN1cnBvcyxMT0NBTC0+YnVmKTsKICAgICAgbW1fbG9n
ICh0bXAsRVJST1IpOwogICAgICBtYnhfYWJvcnQgKHN0cmVhbSk7CiAgICAgIHJldHVybiBOSUw7
CiAgICB9CiAgICBpZiAoIShpc3hkaWdpdCAodFsxXSkgJiYgaXN4ZGlnaXQgKHRbMl0pICYmIGlz
eGRpZ2l0ICh0WzNdKSAmJgoJICBpc3hkaWdpdCAodFs0XSkgJiYgaXN4ZGlnaXQgKHRbNV0pICYm
IGlzeGRpZ2l0ICh0WzZdKSAmJgoJICBpc3hkaWdpdCAodFs3XSkgJiYgaXN4ZGlnaXQgKHRbOF0p
ICYmIGlzeGRpZ2l0ICh0WzldKSAmJgoJICBpc3hkaWdpdCAodFsxMF0pICYmIGlzeGRpZ2l0ICh0
WzExXSkgJiYgaXN4ZGlnaXQgKHRbMTJdKSkpIHsKICAgICAgc3ByaW50ZiAodG1wLCJVbmFibGUg
dG8gcGFyc2UgbWVzc2FnZSBmbGFncyBhdCAlbHU6ICUuODBzIiwKCSAgICAgICAodW5zaWduZWQg
bG9uZykgY3VycG9zLExPQ0FMLT5idWYpOwogICAgICBtbV9sb2cgKHRtcCxFUlJPUik7CiAgICAg
IG1ieF9hYm9ydCAoc3RyZWFtKTsKICAgICAgcmV0dXJuIE5JTDsKICAgIH0KICAgIGlmICgodFsx
M10gIT0gJy0nKSB8fCB0WzIyXSB8fAoJIShpc3hkaWdpdCAodFsxNF0pICYmIGlzeGRpZ2l0ICh0
WzE1XSkgJiYgaXN4ZGlnaXQgKHRbMTZdKSAmJgoJICBpc3hkaWdpdCAodFsxN10pICYmIGlzeGRp
Z2l0ICh0WzE4XSkgJiYgaXN4ZGlnaXQgKHRbMTldKSAmJgoJICBpc3hkaWdpdCAodFsyMF0pICYm
IGlzeGRpZ2l0ICh0WzIxXSkpKSB7CiAgICAgIHNwcmludGYgKHRtcCwiVW5hYmxlIHRvIHBhcnNl
IG1lc3NhZ2UgVUlEIGF0ICVsdTogJS44MHMiLAoJICAgICAgICh1bnNpZ25lZCBsb25nKSBjdXJw
b3MsTE9DQUwtPmJ1Zik7CiAgICAgIG1tX2xvZyAodG1wLEVSUk9SKTsKICAgICAgbWJ4X2Fib3J0
IChzdHJlYW0pOwogICAgICByZXR1cm4gTklMOwogICAgfQoMCiAgICAqcysrID0gJ1wwJzsgKnQr
KyA9ICdcMCc7CS8qIGJyZWFrIHVwIGZpZWxkcyAqLwoJCQkJLyogZ2V0IG1lc3NhZ2Ugc2l6ZSAq
LwogICAgaWYgKCEoaiA9IHN0cnRvdWwgKHMsJngsMTApKSAmJiAoISh4ICYmICp4KSkpIHsKICAg
ICAgc3ByaW50ZiAodG1wLCJVbmFibGUgdG8gcGFyc2UgbWVzc2FnZSBzaXplIGF0ICVsdTogJS44
MHMsJS44MHM7JS44MHMiLAoJICAgICAgICh1bnNpZ25lZCBsb25nKSBjdXJwb3MsTE9DQUwtPmJ1
ZixzLHQpOwogICAgICBtbV9sb2cgKHRtcCxFUlJPUik7CiAgICAgIG1ieF9hYm9ydCAoc3RyZWFt
KTsKICAgICAgcmV0dXJuIE5JTDsKICAgIH0KCQkJCS8qIG1ha2Ugc3VyZSBkaWRuJ3QgcnVuIG9m
ZiBlbmQgb2YgZmlsZSAqLwogICAgaWYgKCgob2ZmX3QpIChjdXJwb3MgKyBpICsgaikpID4gc2J1
Zi5zdF9zaXplKSB7CiAgICAgIHNwcmludGYgKHRtcCwiTGFzdCBtZXNzYWdlIChhdCAlbHUpIHJ1
bnMgcGFzdCBlbmQgb2YgZmlsZSAoJWx1ID4gJWx1KSIsCgkgICAgICAgKHVuc2lnbmVkIGxvbmcp
IGN1cnBvcywodW5zaWduZWQgbG9uZykgKGN1cnBvcyArIGkgKyBqKSwKCSAgICAgICAodW5zaWdu
ZWQgbG9uZykgc2J1Zi5zdF9zaXplKTsKICAgICAgbW1fbG9nICh0bXAsRVJST1IpOwogICAgICBt
YnhfYWJvcnQgKHN0cmVhbSk7CiAgICAgIHJldHVybiBOSUw7CiAgICB9CgkJCQkvKiBwYXJzZSBV
SUQgKi8KICAgIGlmICgobSA9IHN0cnRvdWwgKHQrMTMsTklMLDE2KSkgJiYKCSgobSA8PSBsYXN0
dWlkKSB8fCAobSA+IHN0cmVhbS0+dWlkX2xhc3QpKSkgewogICAgICBzcHJpbnRmICh0bXAsIklu
dmFsaWQgVUlEICUwOGx4IGluIG1lc3NhZ2UgJWx1LCByZWJ1aWxkaW5nIFVJRHMiLAoJCSBtLG5t
c2dzKzEpOwogICAgICBtbV9sb2cgKHRtcCxXQVJOKTsKICAgICAgbSA9IDA7CQkJLyogbG9zZSB0
aGlzIFVJRCAqLwoJCQkJLyogcmVzdGFydCBVSUQgdmFsaWRpdHkgYW5kIGxhc3QgVUlEICovCiAg
ICAgIHN0cmVhbS0+dWlkX3ZhbGlkaXR5ID0gdGltZSAoMCk7CiAgICAgIHN0cmVhbS0+dWlkX2xh
c3QgPSBsYXN0dWlkOwogICAgfQoMCiAgICB0WzEyXSA9ICdcMCc7CQkvKiBwYXJzZSBzeXN0ZW0g
ZmxhZ3MgKi8KICAgIGlmICgoayA9IHN0cnRvdWwgKHQrOCxOSUwsMTYpKSAmIGZFWFBVTkdFRCkK
CQkJCS8qIGV4cHVuZ2VkIG1lc3NhZ2UsIHVwZGF0ZSBsYXN0IFVJRCAqLwogICAgICBsYXN0dWlk
ID0gbSA/IG0gOiArK3N0cmVhbS0+dWlkX2xhc3Q7CiAgICBlbHNlIHsJCQkvKiBub3QgZXhwdW5n
ZWQsIHN3ZWxsIHRoZSBjYWNoZSAqLwogICAgICBtYWlsX2V4aXN0cyAoc3RyZWFtLCsrbm1zZ3Mp
OwoJCQkJLyogaW5zdGFudGlhdGUgYW4gZWx0IGZvciB0aGlzIG1lc3NhZ2UgKi8KICAgICAgKGVs
dCA9IG1haWxfZWx0IChzdHJlYW0sbm1zZ3MpKS0+dmFsaWQgPSBUOwoJCQkJLyogcGFyc2UgdGhl
IGRhdGUgKi8KICAgICAgaWYgKCFtYWlsX3BhcnNlX2RhdGUgKGVsdCxMT0NBTC0+YnVmKSkgewoJ
c3ByaW50ZiAodG1wLCJVbmFibGUgdG8gcGFyc2UgbWVzc2FnZSBkYXRlIGF0ICVsdTogJS44MHMi
LAoJCSAodW5zaWduZWQgbG9uZykgY3VycG9zLExPQ0FMLT5idWYpOwoJbW1fbG9nICh0bXAsRVJS
T1IpOwoJbWJ4X2Fib3J0IChzdHJlYW0pOwoJcmV0dXJuIE5JTDsKICAgICAgfQoJCQkJLyogbm90
ZSBmaWxlIG9mZnNldCBvZiBoZWFkZXIgKi8KICAgICAgZWx0LT5wcml2YXRlLnNwZWNpYWwub2Zm
c2V0ID0gY3VycG9zOwoJCQkJLyogYW5kIGludGVybmFsIGhlYWRlciBzaXplICovCiAgICAgIGVs
dC0+cHJpdmF0ZS5zcGVjaWFsLnRleHQuc2l6ZSA9IGk7CgkJCQkvKiBoZWFkZXIgc2l6ZSBub3Qg
a25vd24geWV0ICovCiAgICAgIGVsdC0+cHJpdmF0ZS5tc2cuaGVhZGVyLnRleHQuc2l6ZSA9IDA7
CiAgICAgIGVsdC0+cmZjODIyX3NpemUgPSBqOwkvKiBub3RlIG1lc3NhZ2Ugc2l6ZSAqLwoJCQkJ
LyogY2FsY3VsYXRlIHN5c3RlbSBmbGFncyAqLwogICAgICBpZiAoayAmIGZTRUVOKSBlbHQtPnNl
ZW4gPSBUOwogICAgICBpZiAoayAmIGZERUxFVEVEKSBlbHQtPmRlbGV0ZWQgPSBUOwogICAgICBp
ZiAoayAmIGZGTEFHR0VEKSBlbHQtPmZsYWdnZWQgPSBUOwogICAgICBpZiAoayAmIGZBTlNXRVJF
RCkgZWx0LT5hbnN3ZXJlZCA9IFQ7CiAgICAgIGlmIChrICYgZkRSQUZUKSBlbHQtPmRyYWZ0ID0g
VDsKICAgICAgdFs4XSA9ICdcMCc7CQkvKiBnZXQgdXNlciBmbGFncyB2YWx1ZSAqLwogICAgICBl
bHQtPnVzZXJfZmxhZ3MgPSBzdHJ0b3VsICh0LE5JTCwxNik7CgkJCQkvKiBVSUQgYWxyZWFkeSBh
c3NpZ25lZD8gKi8KICAgICAgaWYgKCEoZWx0LT5wcml2YXRlLnVpZCA9IG0pKSB7CgllbHQtPnJl
Y2VudCA9IFQ7CS8qIG5vLCBtYXJrIGFzIHJlY2VudCAqLwoJKytyZWNlbnQ7CQkvKiBjb3VudCB1
cCBhIG5ldyByZWNlbnQgbWVzc2FnZSAqLwoJCQkJLyogYXNzaWduIG5ldyBVSUQgKi8KCWVsdC0+
cHJpdmF0ZS51aWQgPSArK3N0cmVhbS0+dWlkX2xhc3Q7CgltYnhfdXBkYXRlX3N0YXR1cyAoc3Ry
ZWFtLGVsdC0+bXNnbm8sTklMKTsKICAgICAgfQoJCQkJLyogdXBkYXRlIGxhc3QgcGFyc2VkIFVJ
RCAqLwogICAgICBsYXN0dWlkID0gZWx0LT5wcml2YXRlLnVpZDsKICAgIH0KICAgIGN1cnBvcyAr
PSBpICsgajsJCS8qIHVwZGF0ZSBwb3NpdGlvbiAqLwogIH0KDAoJCQkJLyogdXBkYXRlIGhlYWRl
ciAqLwogIGlmICghc3RyZWFtLT5yZG9ubHkpIG1ieF91cGRhdGVfaGVhZGVyIChzdHJlYW0pOwog
IGZzeW5jIChMT0NBTC0+ZmQpOwkJLyogbWFrZSBzdXJlIGFsbCB0aGUgVUlEIHVwZGF0ZXMgdGFr
ZSAqLwoJCQkJLyogdXBkYXRlIHBhcnNlZCBmaWxlIHNpemUgYW5kIHRpbWUgKi8KICBMT0NBTC0+
ZmlsZXNpemUgPSBzYnVmLnN0X3NpemU7CiAgZnN0YXQgKExPQ0FMLT5mZCwmc2J1Zik7CS8qIGdl
dCBzdGF0dXMgYWdhaW4gdG8gZW5zdXJlIHRpbWUgaXMgcmlnaHQgKi8KICBMT0NBTC0+ZmlsZXRp
bWUgPSBzYnVmLnN0X210aW1lOwogIHN0cmVhbS0+c2lsZW50ID0gc2lsZW50OwkvKiBjYW4gcGFz
cyB1cCBldmVudHMgbm93ICovCiAgbWFpbF9leGlzdHMgKHN0cmVhbSxubXNncyk7CS8qIG5vdGlm
eSB1cHBlciBsZXZlbCBvZiBuZXcgbWFpbGJveCBzaXplICovCiAgbWFpbF9yZWNlbnQgKHN0cmVh
bSxyZWNlbnQpOwkvKiBhbmQgb2YgY2hhbmdlIGluIHJlY2VudCBtZXNzYWdlcyAqLwogIHJldHVy
biBMT05HVDsJCQkvKiByZXR1cm4gdGhlIHdpbm5hZ2UgKi8KfQoMCi8qIE1CWCBnZXQgY2FjaGUg
ZWxlbWVudCB3aXRoIHN0YXR1cyB1cGRhdGluZyBmcm9tIGZpbGUKICogQWNjZXB0czogTUFJTCBz
dHJlYW0KICoJICAgIG1lc3NhZ2UgbnVtYmVyCiAqCSAgICBleHB1bmdlIE9LIGZsYWcKICogUmV0
dXJuczogY2FjaGUgZWxlbWVudAogKi8KCk1FU1NBR0VDQUNIRSAqbWJ4X2VsdCAoTUFJTFNUUkVB
TSAqc3RyZWFtLHVuc2lnbmVkIGxvbmcgbXNnbm8sbG9uZyBleHBvaykKewogIE1FU1NBR0VDQUNI
RSAqZWx0ID0gbWFpbF9lbHQgKHN0cmVhbSxtc2dubyk7CiAgc3RydWN0IHsJCQkvKiBvbGQgZmxh
Z3MgKi8KICAgIHVuc2lnbmVkIGludCBzZWVuIDogMTsKICAgIHVuc2lnbmVkIGludCBkZWxldGVk
IDogMTsKICAgIHVuc2lnbmVkIGludCBmbGFnZ2VkIDogMTsKICAgIHVuc2lnbmVkIGludCBhbnN3
ZXJlZCA6IDE7CiAgICB1bnNpZ25lZCBpbnQgZHJhZnQgOiAxOwogICAgdW5zaWduZWQgbG9uZyB1
c2VyX2ZsYWdzOwogIH0gb2xkOwogIG9sZC5zZWVuID0gZWx0LT5zZWVuOyBvbGQuZGVsZXRlZCA9
IGVsdC0+ZGVsZXRlZDsgb2xkLmZsYWdnZWQgPSBlbHQtPmZsYWdnZWQ7CiAgb2xkLmFuc3dlcmVk
ID0gZWx0LT5hbnN3ZXJlZDsgb2xkLmRyYWZ0ID0gZWx0LT5kcmFmdDsKICBvbGQudXNlcl9mbGFn
cyA9IGVsdC0+dXNlcl9mbGFnczsKCQkJCS8qIGdldCBuZXcgZmxhZ3MgKi8KICBpZiAobWJ4X3Jl
YWRfZmxhZ3MgKHN0cmVhbSxlbHQpICYmIGV4cG9rKSB7CiAgICBtYWlsX2V4cHVuZ2VkIChzdHJl
YW0sZWx0LT5tc2dubyk7CiAgICByZXR1cm4gTklMOwkJCS8qIHJldHVybiB0aGlzIG1lc3NhZ2Ug
d2FzIGV4cHVuZ2VkICovCiAgfQogIGlmICgob2xkLnNlZW4gIT0gZWx0LT5zZWVuKSB8fCAob2xk
LmRlbGV0ZWQgIT0gZWx0LT5kZWxldGVkKSB8fAogICAgICAob2xkLmZsYWdnZWQgIT0gZWx0LT5m
bGFnZ2VkKSB8fCAob2xkLmFuc3dlcmVkICE9IGVsdC0+YW5zd2VyZWQpIHx8CiAgICAgIChvbGQu
ZHJhZnQgIT0gZWx0LT5kcmFmdCkgfHwgKG9sZC51c2VyX2ZsYWdzICE9IGVsdC0+dXNlcl9mbGFn
cykpCiAgICBtbV9mbGFncyAoc3RyZWFtLG1zZ25vKTsJLyogbGV0IHRvcCBsZXZlbCBrbm93ICov
CiAgcmV0dXJuIGVsdDsKfQoMCi8qIE1CWCByZWFkIGZsYWdzIGZyb20gZmlsZQogKiBBY2NlcHRz
OiBNQUlMIHN0cmVhbQogKgkgICAgY2FjaGUgZWxlbWVudAogKiBSZXR1cm5zOiBub24tTklMIGlm
IG1lc3NhZ2UgZXhwdW5nZWQKICovCgp1bnNpZ25lZCBsb25nIG1ieF9yZWFkX2ZsYWdzIChNQUlM
U1RSRUFNICpzdHJlYW0sTUVTU0FHRUNBQ0hFICplbHQpCnsKICB1bnNpZ25lZCBsb25nIGk7CgkJ
CQkvKiBub29wIGlmIHJlYWRvbmx5IGFuZCBoYXZlIHZhbGlkIGZsYWdzICovCiAgaWYgKHN0cmVh
bS0+cmRvbmx5ICYmIGVsdC0+dmFsaWQpIHJldHVybiBOSUw7CgkJCQkvKiBzZXQgdGhlIHNlZWsg
cG9pbnRlciAqLwogIGxzZWVrIChMT0NBTC0+ZmQsKG9mZl90KSBlbHQtPnByaXZhdGUuc3BlY2lh
bC5vZmZzZXQgKwoJIGVsdC0+cHJpdmF0ZS5zcGVjaWFsLnRleHQuc2l6ZSAtIDIzLExfU0VUKTsK
CQkJCS8qIHJlYWQgdGhlIG5ldyBmbGFncyAqLwogIGlmIChyZWFkIChMT0NBTC0+ZmQsTE9DQUwt
PmJ1ZiwxMikgPCAwKSB7CiAgICBzcHJpbnRmIChMT0NBTC0+YnVmLCJVbmFibGUgdG8gcmVhZCBu
ZXcgc3RhdHVzOiAlcyIsc3RyZXJyb3IgKGVycm5vKSk7CiAgICBmYXRhbCAoTE9DQUwtPmJ1Zik7
CiAgfQogIExPQ0FMLT5idWZbMTJdID0gJ1wwJzsJLyogdGllIG9mZiBidWZmZXIgKi8KCQkJCS8q
IGNhbGN1bGF0ZSBzeXN0ZW0gZmxhZ3MgKi8KICBpID0gc3RydG91bCAoTE9DQUwtPmJ1Zis4LE5J
TCwxNik7CiAgZWx0LT5zZWVuID0gaSAmIGZTRUVOID8gVCA6IE5JTDsKICBlbHQtPmRlbGV0ZWQg
PSBpICYgZkRFTEVURUQgPyBUIDogTklMOwogIGVsdC0+ZmxhZ2dlZCA9IGkgJiBmRkxBR0dFRCA/
IFQgOiBOSUw7CiAgZWx0LT5hbnN3ZXJlZCA9IGkgJiBmQU5TV0VSRUQgPyBUIDogTklMOwogIGVs
dC0+ZHJhZnQgPSBpICYgZkRSQUZUID8gVCA6IE5JTDsKICBMT0NBTC0+ZXhwdW5nZWQgfD0gaSAm
IGZFWFBVTkdFRCA/IFQgOiBOSUw7CiAgTE9DQUwtPmJ1Zls4XSA9ICdcMCc7CQkvKiB0aWUgb2Zm
IGZsYWdzICovCgkJCQkvKiBnZXQgdXNlciBmbGFncyB2YWx1ZSAqLwogIGVsdC0+dXNlcl9mbGFn
cyA9IHN0cnRvdWwgKExPQ0FMLT5idWYsTklMLDE2KTsKICBlbHQtPnZhbGlkID0gVDsJCS8qIGhh
dmUgdmFsaWQgZmxhZ3Mgbm93ICovCiAgcmV0dXJuIGkgJiBmRVhQVU5HRUQ7Cn0KDAovKiBNQlgg
dXBkYXRlIGhlYWRlcgogKiBBY2NlcHRzOiBNQUlMIHN0cmVhbQogKi8KCnZvaWQgbWJ4X3VwZGF0
ZV9oZWFkZXIgKE1BSUxTVFJFQU0gKnN0cmVhbSkKewogIGludCBpOwogIGNoYXIgKnMgPSBMT0NB
TC0+YnVmOwogIG1lbXNldCAocywnXDAnLEhEUlNJWkUpOwkvKiBpbml0aWFsaXplIGhlYWRlciAq
LwogIHNwcmludGYgKHMsIiptYngqXDAxNVwwMTIlMDhseCUwOGx4XDAxNVwwMTIiLAoJICAgc3Ry
ZWFtLT51aWRfdmFsaWRpdHksc3RyZWFtLT51aWRfbGFzdCk7CiAgZm9yIChpID0gMDsgKGkgPCBO
VVNFUkZMQUdTKSAmJiBzdHJlYW0tPnVzZXJfZmxhZ3NbaV07ICsraSkKICAgIHNwcmludGYgKHMg
Kz0gc3RybGVuIChzKSwiJXNcMDE1XDAxMiIsc3RyZWFtLT51c2VyX2ZsYWdzW2ldKTsKICBMT0NB
TC0+ZmZ1c2VyZmxhZyA9IGk7CS8qIGZpcnN0IGZyZWUgdXNlciBmbGFnICovCgkJCQkvKiBjYW4g
d2UgY3JlYXRlIG1vcmUgdXNlciBmbGFncz8gKi8KICBzdHJlYW0tPmt3ZF9jcmVhdGUgPSAoaSA8
IE5VU0VSRkxBR1MpID8gVCA6IE5JTDsKCQkJCS8qIHdyaXRlIHJlc2VydmVkIGxpbmVzICovCiAg
d2hpbGUgKGkrKyA8IE5VU0VSRkxBR1MpIHN0cmNhdCAocywiXDAxNVwwMTIiKTsKICB3aGlsZSAo
VCkgewogICAgbHNlZWsgKExPQ0FMLT5mZCwwLExfU0VUKTsJLyogcmV3aW5kIGZpbGUgKi8KCQkJ
CS8qIHdyaXRlIG5ldyBoZWFkZXIgKi8KICAgIGlmICh3cml0ZSAoTE9DQUwtPmZkLExPQ0FMLT5i
dWYsSERSU0laRSkgPiAwKSBicmVhazsKICAgIG1tX25vdGlmeSAoc3RyZWFtLHN0cmVycm9yIChl
cnJubyksV0FSTik7CiAgICBtbV9kaXNrZXJyb3IgKHN0cmVhbSxlcnJubyxUKTsKICB9Cn0KDAov
KiBNQlggdXBkYXRlIHN0YXR1cyBzdHJpbmcKICogQWNjZXB0czogTUFJTCBzdHJlYW0KICoJICAg
IG1lc3NhZ2UgbnVtYmVyCiAqCSAgICBmbGFncwogKi8KCnZvaWQgbWJ4X3VwZGF0ZV9zdGF0dXMg
KE1BSUxTVFJFQU0gKnN0cmVhbSx1bnNpZ25lZCBsb25nIG1zZ25vLGxvbmcgZmxhZ3MpCnsKICBN
RVNTQUdFQ0FDSEUgKmVsdCA9IG1haWxfZWx0IChzdHJlYW0sbXNnbm8pOwogIHN0cnVjdCBzdGF0
IHNidWY7CiAgaW50IGV4cGZsYWc7CgkJCQkvKiByZWFkb25seSAqLwogIGlmIChzdHJlYW0tPnJk
b25seSB8fCAhZWx0LT52YWxpZCkgbWJ4X3JlYWRfZmxhZ3MgKHN0cmVhbSxlbHQpOwogIGVsc2Ug
ewkJCS8qIHJlYWR3cml0ZSAqLwoJCQkJLyogd2FudCB0byBleHB1bmdlIG1lc3NhZ2U/ICovCiAg
ICBpZiAoZWx0LT5kZWxldGVkICYmIChmbGFncyAmIG11c19FWFBVTkdFKSkgZXhwZmxhZyA9IGZF
WFBVTkdFRDsKICAgIGVsc2UgewkJCS8qIHNlZWsgdG8gc3lzdGVtIGZsYWdzICovCiAgICAgIGxz
ZWVrIChMT0NBTC0+ZmQsKG9mZl90KSBlbHQtPnByaXZhdGUuc3BlY2lhbC5vZmZzZXQgKwoJICAg
ICBlbHQtPnByaXZhdGUuc3BlY2lhbC50ZXh0LnNpemUgLSAxNSxMX1NFVCk7CgkJCQkvKiByZWFk
IHRoZSBjdXJyZW50IHN5c3RlbSBmbGFncyAqLwogICAgICBpZiAocmVhZCAoTE9DQUwtPmZkLExP
Q0FMLT5idWYsNCkgPCAwKSB7CglzcHJpbnRmIChMT0NBTC0+YnVmLCJVbmFibGUgdG8gcmVhZCBz
eXN0ZW0gZmxhZ3M6ICVzIiwKCQkgc3RyZXJyb3IgKGVycm5vKSk7CglmYXRhbCAoTE9DQUwtPmJ1
Zik7CiAgICAgIH0KICAgICAgTE9DQUwtPmJ1Zls0XSA9ICdcMCc7CS8qIHRpZSBvZmYgYnVmZmVy
ICovCgkJCQkvKiBub3RlIGN1cnJlbnQgc2V0IG9mIGV4cHVuZ2VkIGZsYWcgKi8KICAgICAgZXhw
ZmxhZyA9IChzdHJ0b3VsIChMT0NBTC0+YnVmLE5JTCwxNikpICYgZkVYUFVOR0VEOwogICAgfQoJ
CQkJLyogcHJpbnQgbmV3IGZsYWcgc3RyaW5nICovCiAgICBzcHJpbnRmIChMT0NBTC0+YnVmLCIl
MDhseCUwNHgtJTA4bHgiLGVsdC0+dXNlcl9mbGFncywodW5zaWduZWQpCgkgICAgIChleHBmbGFn
ICsgKGZTRUVOICogZWx0LT5zZWVuKSArIChmREVMRVRFRCAqIGVsdC0+ZGVsZXRlZCkgKwoJICAg
ICAgKGZGTEFHR0VEICogZWx0LT5mbGFnZ2VkKSArIChmQU5TV0VSRUQgKiBlbHQtPmFuc3dlcmVk
KSArCgkgICAgICAoZkRSQUZUICogZWx0LT5kcmFmdCkpLGVsdC0+cHJpdmF0ZS51aWQpOwogICAg
d2hpbGUgKFQpIHsJCQkvKiBnZXQgdG8gdGhhdCBwbGFjZSBpbiB0aGUgZmlsZSAqLwogICAgICBs
c2VlayAoTE9DQUwtPmZkLChvZmZfdCkgZWx0LT5wcml2YXRlLnNwZWNpYWwub2Zmc2V0ICsKCSAg
ICAgZWx0LT5wcml2YXRlLnNwZWNpYWwudGV4dC5zaXplIC0gMjMsTF9TRVQpOwoJCQkJLyogd3Jp
dGUgbmV3IGZsYWdzIGFuZCBVSUQgKi8KICAgICAgaWYgKHdyaXRlIChMT0NBTC0+ZmQsTE9DQUwt
PmJ1ZiwyMSkgPiAwKSBicmVhazsKICAgICAgbW1fbm90aWZ5IChzdHJlYW0sc3RyZXJyb3IgKGVy
cm5vKSxXQVJOKTsKICAgICAgbW1fZGlza2Vycm9yIChzdHJlYW0sZXJybm8sVCk7CiAgICB9CiAg
ICBpZiAoZmxhZ3MgJiBtdXNfU1lOQykgewkvKiBzeW5jIGlmIHJlcXVlc3RlZCAqLwogICAgICBm
c3luYyAoTE9DQUwtPmZkKTsKICAgICAgZnN0YXQgKExPQ0FMLT5mZCwmc2J1Zik7CS8qIGdldCBu
ZXcgd3JpdGUgdGltZSAqLwogICAgICBMT0NBTC0+ZmlsZXRpbWUgPSBzYnVmLnN0X210aW1lOwog
ICAgfQogIH0KfQoMCi8qIE1CWCBsb2NhdGUgaGVhZGVyIGZvciBhIG1lc3NhZ2UKICogQWNjZXB0
czogTUFJTCBzdHJlYW0KICoJICAgIG1lc3NhZ2UgbnVtYmVyCiAqCSAgICBwb2ludGVyIHRvIHJl
dHVybmVkIGhlYWRlciBzaXplCiAqCSAgICBwb2ludGVyIHRvIHBvc3NpYmxlIHJldHVybmVkIGhl
YWRlcgogKiBSZXR1cm5zOiBwb3NpdGlvbiBvZiBoZWFkZXIgaW4gZmlsZQogKi8KCiNkZWZpbmUg
SERSQlVGTEVOIDQwOTYJCS8qIGdvb2QgZW5vdWdoIGZvciBtb3N0IGhlYWRlcnMgKi8KI2RlZmlu
ZSBTTE9QIDQJCQkvKiBDUiBMRiBDUiBMRiAqLwoKdW5zaWduZWQgbG9uZyBtYnhfaGRycG9zIChN
QUlMU1RSRUFNICpzdHJlYW0sdW5zaWduZWQgbG9uZyBtc2dubywKCQkJICB1bnNpZ25lZCBsb25n
ICpzaXplLGNoYXIgKipoZHIpCnsKICB1bnNpZ25lZCBsb25nIHNpejsKICBsb25nIGk7CiAgY2hh
ciAqcywqdCwqdGU7CiAgTUVTU0FHRUNBQ0hFICplbHQgPSBtYnhfZWx0IChzdHJlYW0sbXNnbm8s
TklMKTsKICB1bnNpZ25lZCBsb25nIHJldCA9IGVsdC0+cHJpdmF0ZS5zcGVjaWFsLm9mZnNldCAr
CiAgICBlbHQtPnByaXZhdGUuc3BlY2lhbC50ZXh0LnNpemU7CiAgaWYgKGhkcikgKmhkciA9IE5J
TDsJCS8qIGFzc3VtZSBubyBoZWFkZXIgcmV0dXJuZWQgKi8KCQkJCS8qIGlzIGhlYWRlciBzaXpl
IGtub3duPyAqLyAKICBpZiAoKnNpemUgPSBlbHQtPnByaXZhdGUubXNnLmhlYWRlci50ZXh0LnNp
emUpIHJldHVybiByZXQ7CgkJCQkvKiBwYXJhbm9pYSBjaGVjayAqLwogIGlmIChMT0NBTC0+YnVm
bGVuIDwgKEhEUkJVRkxFTiArIFNMT1ApKSB7CiAgICBmc19naXZlICgodm9pZCAqKikgJkxPQ0FM
LT5idWYpOwogICAgTE9DQUwtPmJ1ZiA9IChjaGFyICopIGZzX2dldCAoKExPQ0FMLT5idWZsZW4g
PSBIRFJCVUZMRU4pICsgU0xPUCk7CiAgfQogIGxzZWVrIChMT0NBTC0+ZmQscmV0LExfU0VUKTsJ
LyogZ2V0IHRvIGhlYWRlciBwb3NpdGlvbiAqLwogIGZvciAoc2l6ID0gMCwgcyA9IExPQ0FMLT5i
dWY7CS8qIHJlYWQgSERSQlVGTEVOIGNodW5rcyB3aXRoIDQgYnl0ZSBzbG9wICovCiAgICAgICAo
aSA9IG1pbiAoKGxvbmcpIChlbHQtPnJmYzgyMl9zaXplIC0gc2l6KSwobG9uZykgSERSQlVGTEVO
KSkgJiYKICAgICAgIChyZWFkIChMT0NBTC0+ZmQscyxpKSA9PSBpKTsKICAgICAgIHNpeiArPSAo
dCAtIExPQ0FMLT5idWYpIC0gU0xPUCwgcyA9IExPQ0FMLT5idWYgKyBTTE9QKSB7CiAgICB0ZSA9
ICh0ID0gcyArIGkpIC0gMTI7CS8qIGNhbGN1bGF0ZSBlbmQgb2YgZmFzdCBzY2FuICovCgkJCQkv
KiBmYXN0IHNjYW4gZm9yIENSICovCiAgICBmb3IgKHMgPSBMT0NBTC0+YnVmOyBzIDwgdGU7KQog
ICAgICBpZiAoKCgqcysrID09ICdcMDE1JykgfHwgKCpzKysgPT0gJ1wwMTUnKSB8fCAoKnMrKyA9
PSAnXDAxNScpIHx8CgkgICAoKnMrKyA9PSAnXDAxNScpIHx8ICgqcysrID09ICdcMDE1JykgfHwg
KCpzKysgPT0gJ1wwMTUnKSB8fAoJICAgKCpzKysgPT0gJ1wwMTUnKSB8fCAoKnMrKyA9PSAnXDAx
NScpIHx8ICgqcysrID09ICdcMDE1JykgfHwKCSAgICgqcysrID09ICdcMDE1JykgfHwgKCpzKysg
PT0gJ1wwMTUnKSB8fCAoKnMrKyA9PSAnXDAxNScpKSAmJgoJICAoKnMgPT0gJ1wwMTInKSAmJiAo
KisrcyA9PSAnXDAxNScpICYmICgqKytzID09ICdcMDEyJykpIHsKCSpzaXplID0gZWx0LT5wcml2
YXRlLm1zZy5oZWFkZXIudGV4dC5zaXplID0gc2l6ICsgKCsrcyAtIExPQ0FMLT5idWYpOwoJaWYg
KGhkcikgKmhkciA9IExPQ0FMLT5idWY7CglyZXR1cm4gcmV0OwogICAgICB9CiAgICBmb3IgKHRl
ID0gdCAtIDM7IChzIDwgdGUpOykJLyogZmluYWwgY2hhcmFjdGVyLWF0LWEtdGltZSBzY2FuICov
CiAgICAgIGlmICgoKnMrKyA9PSAnXDAxNScpICYmICgqcyA9PSAnXDAxMicpICYmICgqKytzID09
ICdcMDE1JykgJiYKCSAgKCorK3MgPT0gJ1wwMTInKSkgewoJKnNpemUgPSBlbHQtPnByaXZhdGUu
bXNnLmhlYWRlci50ZXh0LnNpemUgPSBzaXogKyAoKytzIC0gTE9DQUwtPmJ1Zik7CglpZiAoaGRy
KSAqaGRyID0gTE9DQUwtPmJ1ZjsKCXJldHVybiByZXQ7CiAgICAgIH0KICAgIGlmIChpIDw9IFNM
T1ApIGJyZWFrOwkvKiBlbmQgb2YgZGF0YSAqLwoJCQkJLyogc2xpZGUgb3ZlciBsYXN0IDQgYnl0
ZXMgKi8KICAgIG1lbW1vdmUgKExPQ0FMLT5idWYsdCAtIFNMT1AsU0xPUCk7CiAgICBoZHIgPSBO
SUw7CQkJLyogY2FuJ3QgcmV0dXJuIGhlYWRlciB0aGlzIHdheSAqLwogIH0KCQkJCS8qIG5vdCBm
b3VuZDogaGVhZGVyIGNvbnN1bWVzIGVudGlyZSBtZXNzYWdlICovCiAgZWx0LT5wcml2YXRlLm1z
Zy5oZWFkZXIudGV4dC5zaXplID0gKnNpemUgPSBlbHQtPnJmYzgyMl9zaXplOwogIGlmIChoZHIp
ICpoZHIgPSBMT0NBTC0+YnVmOwkvKiBwb3NzaWJseSByZXR1cm4gaGVhZGVyIHRvbyAqLwogIHJl
dHVybiByZXQ7Cn0KDAovKiBNQlggbWFpbCByZXdyaXRlIG1haWxib3gKICogQWNjZXB0czogTUFJ
TCBzdHJlYW0KICoJICAgIHBvaW50ZXIgdG8gcmV0dXJuIHJlY2xhaW1lZCBzaXplCiAqCSAgICBm
bGFncyAobm9uLU5JTCB0byBkbyBleHB1bmdlKQogKiBSZXR1cm5zOiBudW1iZXIgb2YgZXhwdW5n
ZWQgbWVzc2FnZXMKICovCgp1bnNpZ25lZCBsb25nIG1ieF9yZXdyaXRlIChNQUlMU1RSRUFNICpz
dHJlYW0sdW5zaWduZWQgbG9uZyAqcmVjbGFpbWVkLAoJCQkgICBsb25nIGZsYWdzKQp7CiAgc3Ry
dWN0IHN0YXQgc2J1ZjsKICBvZmZfdCBwb3MscHBvczsKICBpbnQgbGQ7CiAgdW5zaWduZWQgbG9u
ZyBpLGosayxtLG4sZGVsdGE7CiAgdW5zaWduZWQgbG9uZyByZWNlbnQgPSAwOwogIGNoYXIgbG9j
a1tNQUlMVE1QTEVOXTsKICBNRVNTQUdFQ0FDSEUgKmVsdDsKICBibG9ja25vdGlmeV90IGJuID0g
KGJsb2Nrbm90aWZ5X3QpIG1haWxfcGFyYW1ldGVycyAoTklMLEdFVF9CTE9DS05PVElGWSxOSUwp
OwogIC8qIFRoZSBjcmV0aW5zIHdobyBkZXNpZ25lZCBmbG9jaygpIGNyZWF0ZWQgYSB3aW5kb3cg
b2YgdnVsbmVyYWJpbGl0eSBpbgogICAqIHVwZ3JhZGluZyBsb2NrcyBmcm9tIHNoYXJlZCB0byBl
eGNsdXNpdmUgb3IgZG93bmdyYWRpbmcgZnJvbSBleGNsdXNpdmUKICAgKiB0byBzaGFyZWQuICBS
YXRoZXIgdGhhbiBtYWludGFpbiB0aGUgbG9jayBhdCBzaGFyZWQgc3RhdHVzIGF0IGEgbWluaW11
bSwKICAgKiBmbG9jaygpIGFjdHVhbGx5ICpyZWxlYXNlcyogdGhlIGZvcm1lciBsb2NrLiAgT2J2
aW91c2x5IHRoZXkgbmV2ZXIgdGFsa2VkCiAgICogdG8gYW55IGRhdGFiYXNlIGd1eXMuICBGb3J0
dW5hdGVseSwgd2UgaGF2ZSB0aGUgcGFyc2UvYXBwZW5kIHBlcm1pc3Npb24KICAgKiBsb2NrLiAg
SWYgd2UgcmVxdWlyZSB0aGlzIGxvY2sgYmVmb3JlIGdvaW5nIGV4Y2x1c2l2ZSBvbiB0aGUgbWFp
bGJveCwKICAgKiBhbm90aGVyIHByb2Nlc3MgY2FuIG5vdCBzbmVhayBpbiBhbmQgc3RlYWwgdGhl
IGV4Y2x1c2l2ZSBtYWlsYm94IGxvY2sgb24KICAgKiB1cywgYmVjYXVzZSBpdCB3aWxsIGJsb2Nr
IG9uIHRyeWluZyB0byBnZXQgcGFyc2UvYXBwZW5kIHBlcm1pc3Npb24gZmlyc3QuCiAgICovCgkJ
CQkvKiBnZXQgcGFyc2UvYXBwZW5kIHBlcm1pc3Npb24gKi8KICBpZiAoKGxkID0gbG9ja2ZkIChM
T0NBTC0+ZmQsbG9jayxMT0NLX0VYKSkgPCAwKSB7CiAgICBtbV9sb2cgKCJVbmFibGUgdG8gbG9j
ayBtYWlsYm94IGZvciByZXdyaXRlIixFUlJPUik7CiAgICByZXR1cm4gKnJlY2xhaW1lZCA9IDA7
CiAgfQoMCgkJCQkvKiBnZXQgZXhjbHVzaXZlIGFjY2VzcyAqLwogIGlmICghZmxvY2sgKExPQ0FM
LT5mZCxMT0NLX0VYfExPQ0tfTkIpKSB7CiAgICBtbV9jcml0aWNhbCAoc3RyZWFtKTsJLyogZ28g
Y3JpdGljYWwgKi8KICAgIGZvciAoaSA9IDEsbiA9IGRlbHRhID0gKnJlY2xhaW1lZCA9IDAscG9z
ID0gcHBvcyA9IEhEUlNJWkU7CgkgaSA8PSBzdHJlYW0tPm5tc2dzOyApIHsKICAgICAgZWx0ID0g
bWJ4X2VsdCAoc3RyZWFtLGksTklMKTsKCQkJCS8qIG5vdGUgaWYgbWVzc2FnZSBub3QgYXQgcHJl
ZGljdGVkIGxvY2F0aW9uICovCiAgICAgIGlmIChtID0gZWx0LT5wcml2YXRlLnNwZWNpYWwub2Zm
c2V0IC0gcHBvcykgewoJcHBvcyA9IGVsdC0+cHJpdmF0ZS5zcGVjaWFsLm9mZnNldDsKCSpyZWNs
YWltZWQgKz0gbTsJLyogbm90ZSByZWNsYWltZWQgbWVzc2FnZSBzcGFjZSAqLwoJZGVsdGEgKz0g
bTsJCS8qIGFuZCBhcyBleHB1bmdlIGRlbHRhICAqLwogICAgICB9CgkJCQkvKiBudW1iZXIgb2Yg
Ynl0ZXMgdG8gc21hc2ggb3IgcHJlc2VydmUgKi8KICAgICAgcHBvcyArPSAoayA9IGVsdC0+cHJp
dmF0ZS5zcGVjaWFsLnRleHQuc2l6ZSArIGVsdC0+cmZjODIyX3NpemUpOwoJCQkJLyogaWYgZGVs
ZXRlZCAqLwogICAgICBpZiAoZmxhZ3MgJiYgZWx0LT5kZWxldGVkKSB7CglkZWx0YSArPSBrOwkJ
LyogbnVtYmVyIG9mIGJ5dGVzIHRvIGRlbGV0ZSAqLwoJbWFpbF9leHB1bmdlZChzdHJlYW0saSk7
Lyogbm90aWZ5IHVwcGVyIGxldmVscyAqLwoJbisrOwkJCS8qIGNvdW50IHVwIG9uZSBtb3JlIGV4
cHVuZ2VkIG1lc3NhZ2UgKi8KICAgICAgfQogICAgICBlbHNlIGlmIChpKysgJiYgZGVsdGEpIHsJ
LyogcHJlc2VydmVkIG1lc3NhZ2UgKi8KCWlmIChlbHQtPnJlY2VudCkgKytyZWNlbnQ7CgkJCQkv
KiBmaXJzdCBieXRlIHRvIHByZXNlcnZlICovCglqID0gZWx0LT5wcml2YXRlLnNwZWNpYWwub2Zm
c2V0OwoJZG8gewkJCS8qIHJlYWQgZnJvbSBzb3VyY2UgcG9zaXRpb24gKi8KCSAgbSA9IG1pbiAo
ayxMT0NBTC0+YnVmbGVuKTsKCSAgbHNlZWsgKExPQ0FMLT5mZCxqLExfU0VUKTsKCSAgcmVhZCAo
TE9DQUwtPmZkLExPQ0FMLT5idWYsbSk7CgkgIHBvcyA9IGogLSBkZWx0YTsJLyogd3JpdGUgdG8g
ZGVzdGluYXRpb24gcG9zaXRpb24gKi8KCSAgd2hpbGUgKFQpIHsKCSAgICBsc2VlayAoTE9DQUwt
PmZkLHBvcyxMX1NFVCk7CgkgICAgaWYgKHdyaXRlIChMT0NBTC0+ZmQsTE9DQUwtPmJ1ZixtKSA+
IDApIGJyZWFrOwoJICAgIG1tX25vdGlmeSAoc3RyZWFtLHN0cmVycm9yIChlcnJubyksV0FSTik7
CgkgICAgbW1fZGlza2Vycm9yIChzdHJlYW0sZXJybm8sVCk7CgkgIH0KCSAgcG9zICs9IG07CQkv
KiBuZXcgcG9zaXRpb24gKi8KCSAgaiArPSBtOwkJLyogbmV4dCBjaHVuaywgcGVyaGFwcyAqLwoJ
fSB3aGlsZSAoayAtPSBtKTsJLyogdW50aWwgZG9uZSAqLwoJCQkJLyogbm90ZSB0aGUgbmV3IGFk
ZHJlc3Mgb2YgdGhpcyB0ZXh0ICovCgllbHQtPnByaXZhdGUuc3BlY2lhbC5vZmZzZXQgLT0gZGVs
dGE7CiAgICAgIH0KCQkJCS8qIHByZXNlcnZlZCBidXQgbm8gZGVsZXRlZCBtZXNzYWdlcyB5ZXQg
Ki8KICAgICAgZWxzZSBwb3MgPSBlbHQtPnByaXZhdGUuc3BlY2lhbC5vZmZzZXQgKyBrOwogICAg
fQoJCQkJLyogZGVsdGFlZCBmaWxlIHNpemUgbWF0Y2ggcG9zaXRpb24/ICovCiAgICBpZiAobSA9
IChMT0NBTC0+ZmlsZXNpemUgLT0gZGVsdGEpIC0gcG9zKSB7CiAgICAgICpyZWNsYWltZWQgKz0g
bTsJCS8qIHByb2JhYmx5IGFuIGZFWFBVTkdFRCBtc2cgKi8KICAgICAgTE9DQUwtPmZpbGVzaXpl
ID0gcG9zOwkvKiBzZXQgY29ycmVjdCBzaXplICovCiAgICB9CgkJCQkvKiB0cnVuY2F0ZSBmaWxl
IGFmdGVyIGxhc3QgbWVzc2FnZSAqLwogICAgZnRydW5jYXRlIChMT0NBTC0+ZmQsTE9DQUwtPmZp
bGVzaXplKTsKICAgIGZzeW5jIChMT0NBTC0+ZmQpOwkJLyogZm9yY2UgZGlzayB1cGRhdGUgKi8K
ICAgIG1tX25vY3JpdGljYWwgKHN0cmVhbSk7CS8qIHJlbGVhc2UgY3JpdGljYWwgKi8KICAgICgq
Ym4pIChCTE9DS19GSUxFTE9DSyxOSUwpOwogICAgZmxvY2sgKExPQ0FMLT5mZCxMT0NLX1NIKTsJ
LyogYWxsb3cgc2hhcmVycyBhZ2FpbiAqLwogICAgKCpibikgKEJMT0NLX05PTkUsTklMKTsKICAg
IHVubG9ja2ZkIChsZCxsb2NrKTsJCS8qIHJlbGVhc2UgZXhjbHVzaXZlIHBhcnNlL2FwcGVuZCBw
ZXJtaXNzaW9uICovCiAgfQoMCiAgZWxzZSB7CQkJLyogY2FuJ3QgZ2V0IGV4Y2x1c2l2ZSAqLwog
ICAgKCpibikgKEJMT0NLX0ZJTEVMT0NLLE5JTCk7CiAgICBmbG9jayAoTE9DQUwtPmZkLExPQ0tf
U0gpOwkvKiByZWNvdmVyIHByZXZpb3VzIHNoYXJlZCBtYWlsYm94IGxvY2sgKi8KICAgICgqYm4p
IChCTE9DS19OT05FLE5JTCk7CiAgICB1bmxvY2tmZCAobGQsbG9jayk7CQkvKiByZWxlYXNlIGV4
Y2x1c2l2ZSBwYXJzZS9hcHBlbmQgcGVybWlzc2lvbiAqLwoJCQkJLyogY2hlY2twb2ludCB3aGls
ZSBzaGFyZWQ/ICovCiAgICBpZiAoIWZsYWdzKSBuID0gKnJlY2xhaW1lZCA9IDA7CgkJCQkvKiBu
bywgZG8gaGlkZS1leHB1bmdlICovCiAgICBlbHNlIGZvciAoaSA9IDEsbiA9ICpyZWNsYWltZWQg
PSAwOyBpIDw9IHN0cmVhbS0+bm1zZ3M7ICkgewogICAgICBpZiAoZWx0ID0gbWJ4X2VsdCAoc3Ry
ZWFtLGksVCkpIHsKCWlmIChlbHQtPmRlbGV0ZWQpIHsJLyogbWFrZSBkZWxldGVkIG1lc3NhZ2Ug
aW52aXNpYmxlICovCgkgIG1ieF91cGRhdGVfc3RhdHVzIChzdHJlYW0sZWx0LT5tc2dubyxtdXNf
RVhQVU5HRSk7CgkJCQkvKiBub3RpZnkgdXBwZXIgbGV2ZWxzICovCgkgIG1haWxfZXhwdW5nZWQg
KHN0cmVhbSxpKTsKCSAgbisrOwkJCS8qIGNvdW50IHVwIG9uZSBtb3JlIGV4cHVuZ2VkIG1lc3Nh
Z2UgKi8KCX0KCWVsc2UgewoJICBpKys7CQkJLyogcHJlc2VydmVkIG1lc3NhZ2UgKi8KCSAgaWYg
KGVsdC0+cmVjZW50KSArK3JlY2VudDsKCX0KICAgICAgfQogICAgICBlbHNlIG4rKzsJCQkvKiBj
b3VudCB1cCBvbmUgbW9yZSBleHB1bmdlZCBtZXNzYWdlICovCiAgICB9CiAgICBmc3luYyAoTE9D
QUwtPmZkKTsJCS8qIGZvcmNlIGRpc2sgdXBkYXRlICovCiAgfQogIGZzdGF0IChMT0NBTC0+ZmQs
JnNidWYpOwkvKiBnZXQgbmV3IHdyaXRlIHRpbWUgKi8KICBMT0NBTC0+ZmlsZXRpbWUgPSBzYnVm
LnN0X210aW1lOwoJCQkJLyogbm90aWZ5IHVwcGVyIGxldmVsIG9mIG5ldyBtYWlsYm94IHNpemUg
Ki8KICBtYWlsX2V4aXN0cyAoc3RyZWFtLHN0cmVhbS0+bm1zZ3MpOwogIG1haWxfcmVjZW50IChz
dHJlYW0scmVjZW50KTsKICByZXR1cm4gbjsJCQkvKiByZXR1cm4gbnVtYmVyIG9mIGV4cHVuZ2Vk
IG1lc3NhZ2VzICovCn0K

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]