delorie.com/archives/browse.cgi   search  
Mail Archives: cygwin/1997/07/08/08:21:32

From: skw AT hplb DOT hpl DOT hp DOT com (Stuart Williams)
Subject: Re: GDB problem
8 Jul 1997 08:21:32 -0700 :
Approved: cygnus DOT gnu-win32 AT cygnus DOT com
Distribution: cygnus
Message-ID: <33C23C2E.898AE9F7.cygnus.gnu-win32@hplb.hpl.hp.com>
References: <199707080756 DOT AAA01589 AT rtl DOT cygnus DOT com>
Reply-To: skw AT hplb DOT hpl DOT hp DOT com
Mime-Version: 1.0
X-Mailer: Mozilla 4.0b5 [en] (Win95; I)
Original-To: Geoffrey Noer <noer AT cygnus DOT com>
Original-Cc: "J.R. Dean" <jrd AT enclave DOT org>, gnu-win32 AT cygnus DOT com
X-Priority: 3 (Normal)
Original-Sender: owner-gnu-win32 AT cygnus DOT com

This is a multi-part message in MIME format.
--------------5AAB448694FE76ACD5311E42
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

I have tracked down a few problems that cause GDB to bail out,
some related to memory allocation/deallocation. I have (re-)build
i386-cygwin32-gdb.exe and m68000-coff-gdb.exe with these patches applied
which has greatly improved their stability. 

I hope they help.

Regards

Stuart Williams
HP Labs, Bristol

I sent a the patches that we applied to Geof a little while back,
but

Geoffrey Noer wrote:
> 
> J.R. Dean wrote:
> >
> > >My main problem with the gdb in beta 18 is the crash on exit
> > >problem.  I hope it will be fixed in future releases...
> >
> > Oh, so it *is* a bug?  Whoops.
> >
> > Well, so much for debugging with gdb.
> 
> My consistent problem is quitting the tcl/tk gdb (I believe the problem
> is actually in tcl/tk rather than in gdb).  That said, I find the b18 gdb
> to be fairly usable so you may not need to completely abandon using it
> because of this problem.
> 
> --
> Geoffrey Noer
> noer AT cygnus DOT com
> -
> For help on using this list (especially unsubscribing), send a message to
> "gnu-win32-request AT cygnus DOT com" with one line of text: "help".

----------
From:   Stuart Williams[SMTP:skw AT hplb DOT hpl DOT hp DOT com]
Sent:   02 June 1997 15:51
To:     'Geoffrey Noer'
Subject:        GDB Problems/Fixs

Geof,

I've been building GNU Win32 to cross develop on 68k from a Win32
platform.
I was pleased to see that GDB has been ported to support the Tk/Tcl UI
under
Win32. We had enormous problems trying to build and use the windows
based 
gdb in the mswin subdirectory. Functionally at least, the Tk/Tcl based
GDB is
a big improvement. 

To get things working properly I had to patch a couple of files. In
gdbtk.c some
of the Tcl_ function calls return dynamically allocated structures that
are then
subsequently free'ed. Unfortunately the allocation happens within the
Tk/Tcl
DLL while the freeing does not. For example, things go bang (well
abort())
at the free in 'gdbtk_query' when it frees 'command'. Try it... if you
do something
that throws a query, gdb.exe (the one in the binary distribution) exits
without 
warning. 'free' calls 'mfree' which in turn checks for magic value
before and after
the allocated memory region. However, they're not there because the
allocation
was done within a call to 'Tcl_Merge'.

I've fixed this by '#ifdef WINNT' around the Tcl_Alloc and Tcl_Free
definitions (I have
no idea how the Tk/Tcl DLL is expected to call them) and #ifdef'd around
the 'free'
calls to substitute Tcl_Free which now resolves through libtcl7.6.a to
the DLL.
Result... no bang.

Later hit a second problem (don't recall the symptom now) that turned
out to be
a SEGV due to chasing a null pointer in 'infcmd.c'. I suspect there are
more of
these to find!

Attached are my gdbtk.c and infcmd.c and corresponding diff files. I
still have an
intermitent and annoying SEGV that occurs when GDB exits under win 95. I
haven't
tracked it down yet, but the report is:

        GDB caused an invalid page fault in
        module CW3215.DLL at 0137:005e3f66.
        Registers:
        EAX=0280fffc CS=0137 EIP=005e3f66 EFLGS=00010203
        EBX=0492fc08 SS=013f ESP=0492fbfc EBP=0492fc28
        ECX=00000001 DS=013f ESI=00000000 FS=3bef
        EDX=00000020 ES=013f EDI=0060002c GS=0000
        Bytes at CS:EIP:
        8b 00 89 43 1c 64 67 a1 00 00 89 03 64 67 89 1e 

Looks like it happens between the 'exit() call and the end of the
program.

Anyway, I hope that you can use these fixes next time around.

Regards

Stuart Williams
HP Labs, Bristol, UK.
--------------5AAB448694FE76ACD5311E42
Content-Type: text/plain; charset=us-ascii; name="infcmd.diff"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline; filename="infcmd.diff"

*** infcmd.c	Tue May 20 19:00:08 1997
--- infcmd.c.orig	Tue May 20 18:59:04 1997
***************
*** 443,450 ****
  	}
      }
    fixup_symbol_section (sfn, 0);
!   if (sfn!=NULL &&
!       section_is_overlay (SYMBOL_BFD_SECTION (sfn)) && 
        !section_is_mapped (SYMBOL_BFD_SECTION (sfn)))
      {
        if (!query ("WARNING!!!  Destination is in unmapped overlay!  Jump anyway? "))
--- 443,449 ----
  	}
      }
    fixup_symbol_section (sfn, 0);
!   if (section_is_overlay (SYMBOL_BFD_SECTION (sfn)) && 
        !section_is_mapped (SYMBOL_BFD_SECTION (sfn)))
      {
        if (!query ("WARNING!!!  Destination is in unmapped overlay!  Jump anyway? "))

--------------5AAB448694FE76ACD5311E42
Content-Type: application/x-unknown-content-type-c_auto_file; name="gdbtk.c"
Content-Transfer-Encoding: base64
Content-Disposition: inline; filename="gdbtk.c"

LyogVGNsL1RrIGludGVyZmFjZSByb3V0aW5lcy4KICAgQ29weXJpZ2h0IDE5OTQsIDE5OTUs
IDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCgogICBXcml0dGVu
IGJ5IFN0dSBHcm9zc21hbiA8Z3Jvc3NtYW5AY3lnbnVzLmNvbT4gb2YgQ3lnbnVzIFN1cHBv
cnQuCgpUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCgpUaGlzIHByb2dyYW0gaXMgZnJlZSBz
b2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQppdCB1bmRl
ciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxp
c2hlZCBieQp0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAy
IG9mIHRoZSBMaWNlbnNlLCBvcgooYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9u
LgoKVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2ls
bCBiZSB1c2VmdWwsCmJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRo
ZSBpbXBsaWVkIHdhcnJhbnR5IG9mCk1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKR05VIEdlbmVyYWwgUHVibGljIExpY2Vu
c2UgZm9yIG1vcmUgZGV0YWlscy4KCllvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkg
b2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCmFsb25nIHdpdGggdGhpcyBwcm9n
cmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCkZvdW5kYXRpb24sIElu
Yy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3
LCBVU0EuICAqLwoKI2luY2x1ZGUgImRlZnMuaCIKI2luY2x1ZGUgInN5bXRhYi5oIgojaW5j
bHVkZSAiaW5mZXJpb3IuaCIKI2luY2x1ZGUgImNvbW1hbmQuaCIKI2luY2x1ZGUgImJmZC5o
IgojaW5jbHVkZSAic3ltZmlsZS5oIgojaW5jbHVkZSAib2JqZmlsZXMuaCIKI2luY2x1ZGUg
InRhcmdldC5oIgojaW5jbHVkZSA8dGNsLmg+CiNpbmNsdWRlIDx0ay5oPgovKiAjaW5jbHVk
ZSA8aXRjbC5oPiAqLwojaWZkZWYgQU5TSV9QUk9UT1RZUEVTCiNpbmNsdWRlIDxzdGRhcmcu
aD4KI2Vsc2UKI2luY2x1ZGUgPHZhcmFyZ3MuaD4KI2VuZGlmCiNpbmNsdWRlIDxzaWduYWwu
aD4KI2luY2x1ZGUgPGZjbnRsLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUgPHNl
dGptcC5oPgojaW5jbHVkZSAidG9wLmgiCiNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KI2luY2x1
ZGUgImdkYl9zdHJpbmcuaCIKI2luY2x1ZGUgImRpcy1hc20uaCIKI2luY2x1ZGUgPHN0ZGlv
Lmg+CiNpbmNsdWRlICJnZGJjbWQuaCIKCiNpZm5kZWYgV0lOTlQKI2lmbmRlZiBGSU9BU1lO
QwojaW5jbHVkZSA8c3lzL3N0cm9wdHMuaD4KI2VuZGlmCiNlbmRpZgoKI2lmZGVmIFdJTk5U
CiNkZWZpbmUgR0RCVEtfUEFUSF9TRVAgIjsiCiNlbHNlCiNkZWZpbmUgR0RCVEtfUEFUSF9T
RVAgIjoiCiNlbmRpZgoKLyogU29tZSB2ZXJzaW9ucyAoMS4zLjc5LCAxLjMuODEpIG9mIExp
bnV4IGRvbid0IHN1cHBvcnQgU0lPQ1NQR1JQIHRoZSB3YXkKICAgZ2RidGsgd2FudHMgdG8g
dXNlIGl0Li4uICovCiNpZmRlZiBfX2xpbnV4X18KI3VuZGVmIFNJT0NTUEdSUAojZW5kaWYK
CnN0YXRpYyB2b2lkIG51bGxfcm91dGluZSBQQVJBTVMgKChpbnQpKTsKc3RhdGljIHZvaWQg
Z2RidGtfZmx1c2ggUEFSQU1TICgoRklMRSAqKSk7CnN0YXRpYyB2b2lkIGdkYnRrX2ZwdXRz
IFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgRklMRSAqKSk7CnN0YXRpYyBpbnQgZ2RidGtfcXVl
cnkgUEFSQU1TICgoY29uc3QgY2hhciAqLCB2YV9saXN0KSk7CnN0YXRpYyBjaGFyICpnZGJ0
a19yZWFkbGluZSBQQVJBTVMgKChjaGFyICopKTsKc3RhdGljIHZvaWQgZ2RidGtfaW5pdCBQ
QVJBTVMgKCh2b2lkKSk7CnN0YXRpYyB2b2lkIHRrX2NvbW1hbmRfbG9vcCBQQVJBTVMgKCh2
b2lkKSk7CnN0YXRpYyB2b2lkIGdkYnRrX2NhbGxfY29tbWFuZCBQQVJBTVMgKChzdHJ1Y3Qg
Y21kX2xpc3RfZWxlbWVudCAqLCBjaGFyICosIGludCkpOwpzdGF0aWMgaW50IGdkYnRrX3dh
aXQgUEFSQU1TICgoaW50LCBzdHJ1Y3QgdGFyZ2V0X3dhaXRzdGF0dXMgKikpOwpzdGF0aWMg
dm9pZCB4X2V2ZW50IFBBUkFNUyAoKGludCkpOwpzdGF0aWMgdm9pZCBnZGJ0a19pbnRlcmFj
dGl2ZSBQQVJBTVMgKCh2b2lkKSk7CnN0YXRpYyB2b2lkIGNsZWFudXBfaW5pdCBQQVJBTVMg
KChpbnQpKTsKc3RhdGljIHZvaWQgdGtfY29tbWFuZCBQQVJBTVMgKChjaGFyICosIGludCkp
OwpzdGF0aWMgaW50IGdkYl9kaXNhc3NlbWJsZSBQQVJBTVMgKChDbGllbnREYXRhLCBUY2xf
SW50ZXJwICosIGludCwgY2hhciAqW10pKTsKc3RhdGljIGludCBjb21wYXJlX2xpbmVzIFBB
UkFNUyAoKGNvbnN0IFBUUiwgY29uc3QgUFRSKSk7CnN0YXRpYyBpbnQgZ2RidGtfZGlzX2Fz
bV9yZWFkX21lbW9yeSBQQVJBTVMgKChiZmRfdm1hLCBiZmRfYnl0ZSAqLCBpbnQsIGRpc2Fz
c2VtYmxlX2luZm8gKikpOwpzdGF0aWMgaW50IGdkYl9wYXRoX2NvbnYgUEFSQU1TICgoQ2xp
ZW50RGF0YSwgVGNsX0ludGVycCAqLCBpbnQsIGNoYXIgKltdKSk7CnN0YXRpYyBpbnQgZ2Ri
X3N0b3AgUEFSQU1TICgoQ2xpZW50RGF0YSwgVGNsX0ludGVycCAqLCBpbnQsIGNoYXIgKltd
KSk7CnN0YXRpYyBpbnQgZ2RiX2xpc3RmaWxlcyBQQVJBTVMgKChDbGllbnREYXRhLCBUY2xf
SW50ZXJwICosIGludCwgY2hhciAqW10pKTsKc3RhdGljIGludCBjYWxsX3dyYXBwZXIgUEFS
QU1TICgoQ2xpZW50RGF0YSwgVGNsX0ludGVycCAqLCBpbnQsIGNoYXIgKltdKSk7CnN0YXRp
YyBpbnQgZ2RiX2NtZCBQQVJBTVMgKChDbGllbnREYXRhLCBUY2xfSW50ZXJwICosIGludCwg
Y2hhciAqYXJndltdKSk7CnN0YXRpYyBpbnQgZ2RiX2ZldGNoX3JlZ2lzdGVycyBQQVJBTVMg
KChDbGllbnREYXRhLCBUY2xfSW50ZXJwICosIGludCwgY2hhciAqW10pKTsKc3RhdGljIHZv
aWQgZ2RidGtfcmVhZGxpbmVfZW5kIFBBUkFNUyAoKHZvaWQpKTsKc3RhdGljIGludCBnZGJf
Y2hhbmdlZF9yZWdpc3Rlcl9saXN0IFBBUkFNUyAoKENsaWVudERhdGEsIFRjbF9JbnRlcnAg
KiwgaW50LCBjaGFyICpbXSkpOwpzdGF0aWMgdm9pZCByZWdpc3Rlcl9jaGFuZ2VkX3AgUEFS
QU1TICgoaW50LCB2b2lkICopKTsKc3RhdGljIGludCBnZGJfZ2V0X2JyZWFrcG9pbnRfbGlz
dCBQQVJBTVMgKChDbGllbnREYXRhLCBUY2xfSW50ZXJwICosIGludCwgY2hhciAqW10pKTsK
c3RhdGljIGludCBnZGJfZ2V0X2JyZWFrcG9pbnRfaW5mbyBQQVJBTVMgKChDbGllbnREYXRh
LCBUY2xfSW50ZXJwICosIGludCwgY2hhciAqW10pKTsKc3RhdGljIHZvaWQgYnJlYWtwb2lu
dF9ub3RpZnkgUEFSQU1TICgoc3RydWN0IGJyZWFrcG9pbnQgKiwgY29uc3QgY2hhciAqKSk7
CnN0YXRpYyB2b2lkIGdkYnRrX2NyZWF0ZV9icmVha3BvaW50IFBBUkFNUyAoKHN0cnVjdCBi
cmVha3BvaW50ICopKTsKc3RhdGljIHZvaWQgZ2RidGtfZGVsZXRlX2JyZWFrcG9pbnQgUEFS
QU1TICgoc3RydWN0IGJyZWFrcG9pbnQgKikpOwpzdGF0aWMgdm9pZCBnZGJ0a19tb2RpZnlf
YnJlYWtwb2ludCBQQVJBTVMgKChzdHJ1Y3QgYnJlYWtwb2ludCAqKSk7CnN0YXRpYyBpbnQg
Z2RiX2xvYyBQQVJBTVMgKChDbGllbnREYXRhLCBUY2xfSW50ZXJwICosIGludCwgY2hhciAq
W10pKTsKc3RhdGljIGludCBnZGJfZXZhbCBQQVJBTVMgKChDbGllbnREYXRhLCBUY2xfSW50
ZXJwICosIGludCwgY2hhciAqW10pKTsKc3RhdGljIGludCBnZGJfc291cmNlbGluZXMgUEFS
QU1TICgoQ2xpZW50RGF0YSwgVGNsX0ludGVycCAqLCBpbnQsIGNoYXIgKltdKSk7CnN0YXRp
YyBpbnQgbWFwX2FyZ19yZWdpc3RlcnMgUEFSQU1TICgoaW50LCBjaGFyICpbXSwgdm9pZCAo
KikgKGludCwgdm9pZCAqKSwgdm9pZCAqKSk7CnN0YXRpYyB2b2lkIGdldF9yZWdpc3Rlcl9u
YW1lIFBBUkFNUyAoKGludCwgdm9pZCAqKSk7CnN0YXRpYyBpbnQgZ2RiX3JlZ25hbWVzIFBB
UkFNUyAoKENsaWVudERhdGEsIFRjbF9JbnRlcnAgKiwgaW50LCBjaGFyICpbXSkpOwpzdGF0
aWMgdm9pZCBnZXRfcmVnaXN0ZXIgUEFSQU1TICgoaW50LCB2b2lkICopKTsKCi8qIEhhbmRs
ZSBmb3IgVENMIGludGVycHJldGVyICovCgpzdGF0aWMgVGNsX0ludGVycCAqaW50ZXJwID0g
TlVMTDsKCnN0YXRpYyBpbnQgeF9mZDsJCS8qIFggbmV0d29yayBzb2NrZXQgKi8KCi8qIFRo
aXMgdmFyaWFibGUgaXMgdHJ1ZSB3aGVuIHRoZSBpbmZlcmlvciBpcyBydW5uaW5nLiAgQWx0
aG91Z2ggaXQncwogICBwb3NzaWJsZSB0byBkaXNhYmxlIG1vc3QgaW5wdXQgZnJvbSB3aWRn
ZXRzIGFuZCB0aHVzIHByZXZlbnQKICAgYXR0ZW1wdHMgdG8gZG8gYW55dGhpbmcgd2hpbGUg
dGhlIGluZmVyaW9yIGlzIHJ1bm5pbmcsIGFueSBjb21tYW5kcwogICB0aGF0IGdldCB0aHJv
dWdoIC0gZXZlbiBhIHNpbXBsZSBtZW1vcnkgcmVhZCAtIGFyZSBWZXJ5IEJhZCwgYW5kCiAg
IG1heSBjYXVzZSBHREIgdG8gY3Jhc2ggb3IgYmVoYXZlIHN0cmFuZ2VseS4gIFNvLCB0aGlz
IHZhcmlhYmxlCiAgIHByb3ZpZGVzIGFuIGV4dHJhIGxheWVyIG9mIGRlZmVuc2UuICAqLwoK
c3RhdGljIGludCBydW5uaW5nX25vdzsKCi8qIFRoaXMgdmFyaWFibGUgZGV0ZXJtaW5lcyB3
aGVyZSBtZW1vcnkgdXNlZCBmb3IgZGlzYXNzZW1ibHkgaXMgcmVhZCBmcm9tLgogICBJZiA+
IDAsIHRoZW4gZGlzYXNzZW1ibHkgY29tZXMgZnJvbSB0aGUgZXhlYyBmaWxlIHJhdGhlciB0
aGFuIHRoZQogICB0YXJnZXQgKHdoaWNoIG1pZ2h0IGJlIGF0IHRoZSBvdGhlciBlbmQgb2Yg
YSBzbG93IHNlcmlhbCBsaW5rKS4gIElmCiAgID09IDAgdGhlbiBkaXNhc3NlbWJseSBjb21l
cyBmcm9tIHRhcmdldC4gIElmIDwgMCBkaXNhc3NlbWJseSBpcwogICBhdXRvbWF0aWNhbGx5
IHN3aXRjaGVkIHRvIHRoZSB0YXJnZXQgaWYgaXQncyBhbiBpbmZlcmlvciBwcm9jZXNzLAog
ICBvdGhlcndpc2UgdGhlIGV4ZWMgZmlsZSBpcyB1c2VkLiAgKi8KCnN0YXRpYyBpbnQgZGlz
YXNzZW1ibGVfZnJvbV9leGVjID0gLTE7CgpzdGF0aWMgY2hhciAqR2RidGtfTGlicmFyeTsK
CiNpZm5kZWYgV0lOTlQKLyogU3VwcGx5IG1hbGxvYyBjYWxscyBmb3IgdGNsL3RrLiAgKi8K
CmNoYXIgKgpUY2xfQWxsb2MgKHNpemUpCiAgICAgdW5zaWduZWQgaW50IHNpemU7CnsKICBy
ZXR1cm4geG1hbGxvYyAoc2l6ZSk7Cn0KCmNoYXIgKgpUY2xfUmVhbGxvYyAocHRyLCBzaXpl
KQogICAgIGNoYXIgKnB0cjsKICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKewogIHJldHVybiB4
cmVhbGxvYyAocHRyLCBzaXplKTsKfQoKdm9pZApUY2xfRnJlZShwdHIpCiAgICAgY2hhciAq
cHRyOwp7CiAgZnJlZSAocHRyKTsKfQoKI2VuZGlmCgpzdGF0aWMgdm9pZApudWxsX3JvdXRp
bmUoYXJnKQogICAgIGludCBhcmc7CnsKfQoKLyogVGhlIGZvbGxvd2luZyByb3V0aW5lcyBk
ZWFsIHdpdGggc3Rkb3V0L3N0ZGVyciBkYXRhLCB3aGljaCBpcyBjcmVhdGVkIGJ5CiAgIHtm
fXByaW50Zl97dW59ZmlsdGVyZWQgYW5kIGZyaWVuZHMuICBnZGJ0a19mcHV0cyBhbmQgZ2Ri
dGtfZmx1c2ggYXJlIHRoZQogICBsb3dlc3QgbGV2ZWwgb2YgdGhlc2Ugcm91dGluZXMgYW5k
IGNhcHR1cmUgYWxsIG91dHB1dCBmcm9tIHRoZSByZXN0IG9mIEdEQi4KICAgTm9ybWFsbHkg
dGhleSBwcmVzZW50IHRoZWlyIGRhdGEgdG8gdGNsIHZpYSBjYWxsYmFja3MgdG8gdGhlIGZv
bGxvd2luZyB0Y2wKICAgcm91dGluZXM6ICBnZGJ0a190Y2xfZnB1dHMsIGdkYnRrX3RjbF9m
cHV0c19lcnJvciwgYW5kIGdkYnRrX2ZsdXNoLiAgVGhlc2UKICAgaW4gdHVybiBjYWxsIHRr
IHJvdXRpbmVzIHRvIHVwZGF0ZSB0aGUgZGlzcGxheS4KCiAgIFVuZGVyIHNvbWUgY2lyY3Vt
c3RhbmNlcywgeW91IG1heSB3YW50IHRvIGNvbGxlY3QgdGhlIG91dHB1dCBzbyB0aGF0IGl0
IGNhbgogICBiZSByZXR1cm5lZCBhcyB0aGUgdmFsdWUgb2YgYSB0Y2wgcHJvY2VkdXJlLiAg
VGhpcyBjYW4gYmUgZG9uZSBieQogICBzdXJyb3VuZGluZyB0aGUgb3V0cHV0IHJvdXRpbmVz
IHdpdGggY2FsbHMgdG8gc3RhcnRfc2F2aW5nX291dHB1dCBhbmQKICAgZmluaXNoX3Nhdmlu
Z19vdXRwdXQuICBUaGUgc2F2ZWQgZGF0YSBjYW4gdGhlbiBiZSByZXRyaWV2ZWQgd2l0aAog
ICBnZXRfc2F2ZWRfb3V0cHV0IChidXQgdGhpcyBtdXN0IGJlIGRvbmUgYmVmb3JlIHRoZSBj
YWxsIHRvCiAgIGZpbmlzaF9zYXZpbmdfb3V0cHV0KS4gICovCgovKiBEeW5hbWljIHN0cmlu
ZyBoZWFkZXIgZm9yIHN0ZG91dC4gKi8KCnN0YXRpYyBUY2xfRFN0cmluZyAqcmVzdWx0X3B0
cjsKDApzdGF0aWMgdm9pZApnZGJ0a19mbHVzaCAoc3RyZWFtKQogICAgIEZJTEUgKnN0cmVh
bTsKewojaWYgMAogIC8qIEZvcmNlIGltbWVkaWF0ZSBzY3JlZW4gdXBkYXRlICovCgogIFRj
bF9WYXJFdmFsIChpbnRlcnAsICJnZGJ0a190Y2xfZmx1c2giLCBOVUxMKTsKI2VuZGlmCn0K
CnN0YXRpYyB2b2lkCmdkYnRrX2ZwdXRzIChwdHIsIHN0cmVhbSkKICAgICBjb25zdCBjaGFy
ICpwdHI7CiAgICAgRklMRSAqc3RyZWFtOwp7CgogIGlmIChyZXN1bHRfcHRyKQogICAgVGNs
X0RTdHJpbmdBcHBlbmQgKHJlc3VsdF9wdHIsIChjaGFyICopcHRyLCAtMSk7CiAgZWxzZQog
ICAgewogICAgICBUY2xfRFN0cmluZyBzdHI7CgogICAgICBUY2xfRFN0cmluZ0luaXQgKCZz
dHIpOwoKICAgICAgVGNsX0RTdHJpbmdBcHBlbmQgKCZzdHIsICJnZGJ0a190Y2xfZnB1dHMi
LCAtMSk7CiAgICAgIFRjbF9EU3RyaW5nQXBwZW5kRWxlbWVudCAoJnN0ciwgKGNoYXIgKilw
dHIpOwoKICAgICAgVGNsX0V2YWwgKGludGVycCwgVGNsX0RTdHJpbmdWYWx1ZSAoJnN0cikp
OwogICAgICBUY2xfRFN0cmluZ0ZyZWUgKCZzdHIpOwogICAgfQp9CgpzdGF0aWMgaW50Cmdk
YnRrX3F1ZXJ5IChxdWVyeSwgYXJncykKICAgICBjb25zdCBjaGFyICpxdWVyeTsKICAgICB2
YV9saXN0IGFyZ3M7CnsKICBjaGFyIGJ1ZlsyMDBdLCAqbWVyZ2VbMl07CiAgY2hhciAqY29t
bWFuZDsKICBsb25nIHZhbDsKCiAgdnNwcmludGYgKGJ1ZiwgcXVlcnksIGFyZ3MpOwogIG1l
cmdlWzBdID0gImdkYnRrX3RjbF9xdWVyeSI7CiAgbWVyZ2VbMV0gPSBidWY7CiAgY29tbWFu
ZCA9IFRjbF9NZXJnZSAoMiwgbWVyZ2UpOwogIFRjbF9FdmFsIChpbnRlcnAsIGNvbW1hbmQp
OwoKI2lmbmRlZiBXSU5OVAogIGZyZWUgKGNvbW1hbmQpOwojZWxzZQogIFRjbF9GcmVlIChj
b21tYW5kKTsKI2VuZGlmCgoKICB2YWwgPSBhdG9sIChpbnRlcnAtPnJlc3VsdCk7CiAgcmV0
dXJuIHZhbDsKfQoKLyogVkFSQVJHUyAqLwpzdGF0aWMgdm9pZAojaWZkZWYgQU5TSV9QUk9U
T1RZUEVTCmdkYnRrX3JlYWRsaW5lX2JlZ2luIChjaGFyICpmb3JtYXQsIC4uLikKI2Vsc2UK
Z2RidGtfcmVhZGxpbmVfYmVnaW4gKHZhX2FsaXN0KQogICAgIHZhX2RjbAojZW5kaWYKewog
IHZhX2xpc3QgYXJnczsKICBjaGFyIGJ1ZlsyMDBdLCAqbWVyZ2VbMl07CiAgY2hhciAqY29t
bWFuZDsKCiNpZmRlZiBBTlNJX1BST1RPVFlQRVMKICB2YV9zdGFydCAoYXJncywgZm9ybWF0
KTsKI2Vsc2UKICBjaGFyICpmb3JtYXQ7CiAgdmFfc3RhcnQgKGFyZ3MpOwogIGZvcm1hdCA9
IHZhX2FyZyAoYXJncywgY2hhciAqKTsKI2VuZGlmCgogIHZzcHJpbnRmIChidWYsIGZvcm1h
dCwgYXJncyk7CiAgbWVyZ2VbMF0gPSAiZ2RidGtfdGNsX3JlYWRsaW5lX2JlZ2luIjsKICBt
ZXJnZVsxXSA9IGJ1ZjsKICBjb21tYW5kID0gVGNsX01lcmdlICgyLCBtZXJnZSk7CiAgVGNs
X0V2YWwgKGludGVycCwgY29tbWFuZCk7CiNpZm5kZWYgV0lOTlQKICBmcmVlIChjb21tYW5k
KTsKI2Vsc2UKICBUY2xfRnJlZSAoY29tbWFuZCk7CiNlbmRpZgp9CgpzdGF0aWMgY2hhciAq
CmdkYnRrX3JlYWRsaW5lIChwcm9tcHQpCiAgICAgY2hhciAqcHJvbXB0Owp7CiAgY2hhciAq
bWVyZ2VbMl07CiAgY2hhciAqY29tbWFuZDsKICBpbnQgcmVzdWx0OwoKICBtZXJnZVswXSA9
ICJnZGJ0a190Y2xfcmVhZGxpbmUiOwogIG1lcmdlWzFdID0gcHJvbXB0OwogIGNvbW1hbmQg
PSBUY2xfTWVyZ2UgKDIsIG1lcmdlKTsKICByZXN1bHQgPSBUY2xfRXZhbCAoaW50ZXJwLCBj
b21tYW5kKTsKCiNpZm5kZWYgV0lOTlQKICBmcmVlIChjb21tYW5kKTsKI2Vsc2UKICBUY2xf
RnJlZSAoY29tbWFuZCk7CiNlbmRpZgoKICBpZiAocmVzdWx0ID09IFRDTF9PSykKICAgIHsK
ICAgICAgcmV0dXJuIChzdHJkdXAgKGludGVycCAtPiByZXN1bHQpKTsKICAgIH0KICBlbHNl
CiAgICB7CiAgICAgIGdkYnRrX2ZwdXRzIChpbnRlcnAgLT4gcmVzdWx0LCBnZGJfc3Rkb3V0
KTsKICAgICAgZ2RidGtfZnB1dHMgKCJcbiIsIGdkYl9zdGRvdXQpOwogICAgICByZXR1cm4g
KE5VTEwpOwogICAgfQp9CgpzdGF0aWMgdm9pZApnZGJ0a19yZWFkbGluZV9lbmQgKCkKewog
IFRjbF9FdmFsIChpbnRlcnAsICJnZGJ0a190Y2xfcmVhZGxpbmVfZW5kIik7Cn0KCgwKc3Rh
dGljIHZvaWQKI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwpkc3ByaW50Zl9hcHBlbmRfZWxlbWVu
dCAoVGNsX0RTdHJpbmcgKmRzcCwgY2hhciAqZm9ybWF0LCAuLi4pCiNlbHNlCmRzcHJpbnRm
X2FwcGVuZF9lbGVtZW50ICh2YV9hbGlzdCkKICAgICB2YV9kY2wKI2VuZGlmCnsKICB2YV9s
aXN0IGFyZ3M7CiAgY2hhciBidWZbMTAyNF07CgojaWZkZWYgQU5TSV9QUk9UT1RZUEVTCiAg
dmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7CiNlbHNlCiAgVGNsX0RTdHJpbmcgKmRzcDsKICBj
aGFyICpmb3JtYXQ7CgogIHZhX3N0YXJ0IChhcmdzKTsKICBkc3AgPSB2YV9hcmcgKGFyZ3Ms
IFRjbF9EU3RyaW5nICopOwogIGZvcm1hdCA9IHZhX2FyZyAoYXJncywgY2hhciAqKTsKI2Vu
ZGlmCgogIHZzcHJpbnRmIChidWYsIGZvcm1hdCwgYXJncyk7CgogIFRjbF9EU3RyaW5nQXBw
ZW5kRWxlbWVudCAoZHNwLCBidWYpOwp9CgpzdGF0aWMgaW50CmdkYl9wYXRoX2NvbnYgKGNs
aWVudERhdGEsIGludGVycCwgYXJnYywgYXJndikKICAgICBDbGllbnREYXRhIGNsaWVudERh
dGE7CiAgICAgVGNsX0ludGVycCAqaW50ZXJwOwogICAgIGludCBhcmdjOwogICAgIGNoYXIg
KmFyZ3ZbXTsKewojaWZkZWYgV0lOTlQKICBjaGFyIHBhdGhuYW1lWzI1Nl0sICpwdHI7CiAg
aWYgKGFyZ2MgIT0gMikKICAgIGVycm9yICgid3JvbmcgIyBhcmdzIik7CiAgY3lnd2luMzJf
Y29udl90b19mdWxsX3dpbjMyX3BhdGggKGFyZ3ZbMV0sIHBhdGhuYW1lKTsKICBmb3IgKHB0
ciA9IHBhdGhuYW1lOyAqcHRyOyBwdHIrKykKICAgIHsKICAgICAgaWYgKCpwdHIgPT0gJ1xc
JykKCSpwdHIgPSAnLyc7CiAgICB9CiNlbHNlCiAgY2hhciAqcGF0aG5hbWUgPSBhcmd2WzFd
OwojZW5kaWYKICBUY2xfRFN0cmluZ0FwcGVuZCAocmVzdWx0X3B0ciwgcGF0aG5hbWUsIHN0
cmxlbihwYXRobmFtZSkpOwogIHJldHVybiBUQ0xfT0s7Cn0KCnN0YXRpYyBpbnQKZ2RiX2dl
dF9icmVha3BvaW50X2xpc3QgKGNsaWVudERhdGEsIGludGVycCwgYXJnYywgYXJndikKICAg
ICBDbGllbnREYXRhIGNsaWVudERhdGE7CiAgICAgVGNsX0ludGVycCAqaW50ZXJwOwogICAg
IGludCBhcmdjOwogICAgIGNoYXIgKmFyZ3ZbXTsKewogIHN0cnVjdCBicmVha3BvaW50ICpi
OwogIGV4dGVybiBzdHJ1Y3QgYnJlYWtwb2ludCAqYnJlYWtwb2ludF9jaGFpbjsKCiAgaWYg
KGFyZ2MgIT0gMSkKICAgIGVycm9yICgid3JvbmcgIyBhcmdzIik7CgogIGZvciAoYiA9IGJy
ZWFrcG9pbnRfY2hhaW47IGI7IGIgPSBiLT5uZXh0KQogICAgaWYgKGItPnR5cGUgPT0gYnBf
YnJlYWtwb2ludCkKICAgICAgZHNwcmludGZfYXBwZW5kX2VsZW1lbnQgKHJlc3VsdF9wdHIs
ICIlZCIsIGItPm51bWJlcik7CgogIHJldHVybiBUQ0xfT0s7Cn0KCnN0YXRpYyBpbnQKZ2Ri
X2dldF9icmVha3BvaW50X2luZm8gKGNsaWVudERhdGEsIGludGVycCwgYXJnYywgYXJndikK
ICAgICBDbGllbnREYXRhIGNsaWVudERhdGE7CiAgICAgVGNsX0ludGVycCAqaW50ZXJwOwog
ICAgIGludCBhcmdjOwogICAgIGNoYXIgKmFyZ3ZbXTsKewogIHN0cnVjdCBzeW10YWJfYW5k
X2xpbmUgc2FsOwogIHN0YXRpYyBjaGFyICpicHR5cGVzW10gPSB7ImJyZWFrcG9pbnQiLCAi
aGFyZHdhcmUgYnJlYWtwb2ludCIsICJ1bnRpbCIsCgkJCSAgICAgICJmaW5pc2giLCAid2F0
Y2hwb2ludCIsICJoYXJkd2FyZSB3YXRjaHBvaW50IiwKCQkJICAgICAgInJlYWQgd2F0Y2hw
b2ludCIsICJhY2Nlc3Mgd2F0Y2hwb2ludCIsCgkJCSAgICAgICJsb25nam1wIiwgImxvbmdq
bXAgcmVzdW1lIiwgInN0ZXAgcmVzdW1lIiwKCQkJICAgICAgInRocm91Z2ggc2lndHJhbXAi
LCAid2F0Y2hwb2ludCBzY29wZSIsCgkJCSAgICAgICJjYWxsIGR1bW15IiB9OwogIHN0YXRp
YyBjaGFyICpicGRpc3BbXSA9IHsiZGVsZXRlIiwgImRpc2FibGUiLCAiZG9udHRvdWNoIn07
CiAgc3RydWN0IGNvbW1hbmRfbGluZSAqY21kOwogIGludCBicG51bTsKICBzdHJ1Y3QgYnJl
YWtwb2ludCAqYjsKICBleHRlcm4gc3RydWN0IGJyZWFrcG9pbnQgKmJyZWFrcG9pbnRfY2hh
aW47CgogIGlmIChhcmdjICE9IDIpCiAgICBlcnJvciAoIndyb25nICMgYXJncyIpOwoKICBi
cG51bSA9IGF0b2kgKGFyZ3ZbMV0pOwoKICBmb3IgKGIgPSBicmVha3BvaW50X2NoYWluOyBi
OyBiID0gYi0+bmV4dCkKICAgIGlmIChiLT5udW1iZXIgPT0gYnBudW0pCiAgICAgIGJyZWFr
OwoKICBpZiAoIWIgfHwgYi0+dHlwZSAhPSBicF9icmVha3BvaW50KQogICAgZXJyb3IgKCJC
cmVha3BvaW50ICMlZCBkb2VzIG5vdCBleGlzdCIsIGJwbnVtKTsKCiAgc2FsID0gZmluZF9w
Y19saW5lIChiLT5hZGRyZXNzLCAwKTsKCiAgVGNsX0RTdHJpbmdBcHBlbmRFbGVtZW50IChy
ZXN1bHRfcHRyLCBzeW10YWJfdG9fZmlsZW5hbWUgKHNhbC5zeW10YWIpKTsKICBkc3ByaW50
Zl9hcHBlbmRfZWxlbWVudCAocmVzdWx0X3B0ciwgIiVkIiwgc2FsLmxpbmUpOwogIGRzcHJp
bnRmX2FwcGVuZF9lbGVtZW50IChyZXN1bHRfcHRyLCAiMHglbHgiLCBiLT5hZGRyZXNzKTsK
ICBUY2xfRFN0cmluZ0FwcGVuZEVsZW1lbnQgKHJlc3VsdF9wdHIsIGJwdHlwZXNbYi0+dHlw
ZV0pOwogIFRjbF9EU3RyaW5nQXBwZW5kRWxlbWVudCAocmVzdWx0X3B0ciwgYi0+ZW5hYmxl
ID09IGVuYWJsZWQgPyAiMSIgOiAiMCIpOwogIFRjbF9EU3RyaW5nQXBwZW5kRWxlbWVudCAo
cmVzdWx0X3B0ciwgYnBkaXNwW2ItPmRpc3Bvc2l0aW9uXSk7CiAgZHNwcmludGZfYXBwZW5k
X2VsZW1lbnQgKHJlc3VsdF9wdHIsICIlZCIsIGItPnNpbGVudCk7CiAgZHNwcmludGZfYXBw
ZW5kX2VsZW1lbnQgKHJlc3VsdF9wdHIsICIlZCIsIGItPmlnbm9yZV9jb3VudCk7CgogIFRj
bF9EU3RyaW5nU3RhcnRTdWJsaXN0IChyZXN1bHRfcHRyKTsKICBmb3IgKGNtZCA9IGItPmNv
bW1hbmRzOyBjbWQ7IGNtZCA9IGNtZC0+bmV4dCkKICAgIFRjbF9EU3RyaW5nQXBwZW5kRWxl
bWVudCAocmVzdWx0X3B0ciwgY21kLT5saW5lKTsKICBUY2xfRFN0cmluZ0VuZFN1Ymxpc3Qg
KHJlc3VsdF9wdHIpOwoKICBUY2xfRFN0cmluZ0FwcGVuZEVsZW1lbnQgKHJlc3VsdF9wdHIs
IGItPmNvbmRfc3RyaW5nKTsKCiAgZHNwcmludGZfYXBwZW5kX2VsZW1lbnQgKHJlc3VsdF9w
dHIsICIlZCIsIGItPnRocmVhZCk7CiAgZHNwcmludGZfYXBwZW5kX2VsZW1lbnQgKHJlc3Vs
dF9wdHIsICIlZCIsIGItPmhpdF9jb3VudCk7CgogIHJldHVybiBUQ0xfT0s7Cn0KCnN0YXRp
YyB2b2lkCmJyZWFrcG9pbnRfbm90aWZ5KGIsIGFjdGlvbikKICAgICBzdHJ1Y3QgYnJlYWtw
b2ludCAqYjsKICAgICBjb25zdCBjaGFyICphY3Rpb247CnsKICBjaGFyIGJ1ZlsxMDBdOwog
IGludCB2OwoKICBpZiAoYi0+dHlwZSAhPSBicF9icmVha3BvaW50KQogICAgcmV0dXJuOwoK
ICAvKiBXZSBlbnN1cmUgdGhhdCBBQ1RJT04gY29udGFpbnMgbm8gc3BlY2lhbCBUY2wgY2hh
cmFjdGVycywgc28gd2UKICAgICBjYW4gZG8gdGhpcy4gICovCiAgc3ByaW50ZiAoYnVmLCAi
Z2RidGtfdGNsX2JyZWFrcG9pbnQgJXMgJWQiLCBhY3Rpb24sIGItPm51bWJlcik7CgogIHYg
PSBUY2xfRXZhbCAoaW50ZXJwLCBidWYpOwoKICBpZiAodiAhPSBUQ0xfT0spCiAgICB7CiAg
ICAgIGdkYnRrX2ZwdXRzIChpbnRlcnAtPnJlc3VsdCwgZ2RiX3N0ZG91dCk7CiAgICAgIGdk
YnRrX2ZwdXRzICgiXG4iLCBnZGJfc3Rkb3V0KTsKICAgIH0KfQoKc3RhdGljIHZvaWQKZ2Ri
dGtfY3JlYXRlX2JyZWFrcG9pbnQoYikKICAgICBzdHJ1Y3QgYnJlYWtwb2ludCAqYjsKewog
IGJyZWFrcG9pbnRfbm90aWZ5IChiLCAiY3JlYXRlIik7Cn0KCnN0YXRpYyB2b2lkCmdkYnRr
X2RlbGV0ZV9icmVha3BvaW50KGIpCiAgICAgc3RydWN0IGJyZWFrcG9pbnQgKmI7CnsKICBi
cmVha3BvaW50X25vdGlmeSAoYiwgImRlbGV0ZSIpOwp9CgpzdGF0aWMgdm9pZApnZGJ0a19t
b2RpZnlfYnJlYWtwb2ludChiKQogICAgIHN0cnVjdCBicmVha3BvaW50ICpiOwp7CiAgYnJl
YWtwb2ludF9ub3RpZnkgKGIsICJtb2RpZnkiKTsKfQoMCi8qIFRoaXMgaW1wbGVtZW50cyB0
aGUgVENMIGNvbW1hbmQgYGdkYl9sb2MnLCB3aGljaCByZXR1cm5zIGEgbGlzdCBjb25zaXN0
aW5nCiAgIG9mIHRoZSBzb3VyY2UgYW5kIGxpbmUgbnVtYmVyIGFzc29jaWF0ZWQgd2l0aCB0
aGUgY3VycmVudCBwYy4gKi8KCnN0YXRpYyBpbnQKZ2RiX2xvYyAoY2xpZW50RGF0YSwgaW50
ZXJwLCBhcmdjLCBhcmd2KQogICAgIENsaWVudERhdGEgY2xpZW50RGF0YTsKICAgICBUY2xf
SW50ZXJwICppbnRlcnA7CiAgICAgaW50IGFyZ2M7CiAgICAgY2hhciAqYXJndltdOwp7CiAg
Y2hhciAqZmlsZW5hbWU7CiAgc3RydWN0IHN5bXRhYl9hbmRfbGluZSBzYWw7CiAgY2hhciAq
ZnVuY25hbWU7CiAgQ09SRV9BRERSIHBjOwoKICBpZiAoYXJnYyA9PSAxKQogICAgewogICAg
ICBwYyA9IHNlbGVjdGVkX2ZyYW1lID8gc2VsZWN0ZWRfZnJhbWUtPnBjIDogc3RvcF9wYzsK
ICAgICAgc2FsID0gZmluZF9wY19saW5lIChwYywgMCk7CiAgICB9CiAgZWxzZSBpZiAoYXJn
YyA9PSAyKQogICAgewogICAgICBzdHJ1Y3Qgc3ltdGFic19hbmRfbGluZXMgc2FsczsKICAg
ICAgaW50IG5lbHRzOwoKICAgICAgc2FscyA9IGRlY29kZV9saW5lX3NwZWMgKGFyZ3ZbMV0s
IDEpOwoKICAgICAgbmVsdHMgPSBzYWxzLm5lbHRzOwogICAgICBzYWwgPSBzYWxzLnNhbHNb
MF07CiAgICAgIGZyZWUgKHNhbHMuc2Fscyk7CgogICAgICBpZiAoc2Fscy5uZWx0cyAhPSAx
KQoJZXJyb3IgKCJBbWJpZ3VvdXMgbGluZSBzcGVjIik7CgogICAgICBwYyA9IHNhbC5wYzsK
ICAgIH0KICBlbHNlCiAgICBlcnJvciAoIndyb25nICMgYXJncyIpOwoKICBpZiAoc2FsLnN5
bXRhYikKICAgIFRjbF9EU3RyaW5nQXBwZW5kRWxlbWVudCAocmVzdWx0X3B0ciwgc2FsLnN5
bXRhYi0+ZmlsZW5hbWUpOwogIGVsc2UKICAgIFRjbF9EU3RyaW5nQXBwZW5kRWxlbWVudCAo
cmVzdWx0X3B0ciwgIiIpOwoKICBmaW5kX3BjX3BhcnRpYWxfZnVuY3Rpb24gKHBjLCAmZnVu
Y25hbWUsIE5VTEwsIE5VTEwpOwogIFRjbF9EU3RyaW5nQXBwZW5kRWxlbWVudCAocmVzdWx0
X3B0ciwgZnVuY25hbWUpOwoKICBmaWxlbmFtZSA9IHN5bXRhYl90b19maWxlbmFtZSAoc2Fs
LnN5bXRhYik7CiAgVGNsX0RTdHJpbmdBcHBlbmRFbGVtZW50IChyZXN1bHRfcHRyLCBmaWxl
bmFtZSk7CgogIGRzcHJpbnRmX2FwcGVuZF9lbGVtZW50IChyZXN1bHRfcHRyLCAiJWQiLCBz
YWwubGluZSk7IC8qIGxpbmUgbnVtYmVyICovCgogIGRzcHJpbnRmX2FwcGVuZF9lbGVtZW50
IChyZXN1bHRfcHRyLCAiMHglcyIsIHBhZGRyX256KHBjKSk7IC8qIFBDICovCgogIHJldHVy
biBUQ0xfT0s7Cn0KDAovKiBUaGlzIGltcGxlbWVudHMgdGhlIFRDTCBjb21tYW5kIGBnZGJf
ZXZhbCcuICovCgpzdGF0aWMgaW50CmdkYl9ldmFsIChjbGllbnREYXRhLCBpbnRlcnAsIGFy
Z2MsIGFyZ3YpCiAgICAgQ2xpZW50RGF0YSBjbGllbnREYXRhOwogICAgIFRjbF9JbnRlcnAg
KmludGVycDsKICAgICBpbnQgYXJnYzsKICAgICBjaGFyICphcmd2W107CnsKICBzdHJ1Y3Qg
ZXhwcmVzc2lvbiAqZXhwcjsKICBzdHJ1Y3QgY2xlYW51cCAqb2xkX2NoYWluOwogIHZhbHVl
X3B0ciB2YWw7CgogIGlmIChhcmdjICE9IDIpCiAgICBlcnJvciAoIndyb25nICMgYXJncyIp
OwoKICBleHByID0gcGFyc2VfZXhwcmVzc2lvbiAoYXJndlsxXSk7CgogIG9sZF9jaGFpbiA9
IG1ha2VfY2xlYW51cCAoZnJlZV9jdXJyZW50X2NvbnRlbnRzLCAmZXhwcik7CgogIHZhbCA9
IGV2YWx1YXRlX2V4cHJlc3Npb24gKGV4cHIpOwoKICB2YWxfcHJpbnQgKFZBTFVFX1RZUEUg
KHZhbCksIFZBTFVFX0NPTlRFTlRTICh2YWwpLCBWQUxVRV9BRERSRVNTICh2YWwpLAoJICAg
ICBnZGJfc3Rkb3V0LCAwLCAwLCAwLCAwKTsKCiAgZG9fY2xlYW51cHMgKG9sZF9jaGFpbik7
CgogIHJldHVybiBUQ0xfT0s7Cn0KDAovKiBUaGlzIGltcGxlbWVudHMgdGhlIFRDTCBjb21t
YW5kIGBnZGJfc291cmNlbGluZXMnLCB3aGljaCByZXR1cm5zIGEgbGlzdCBvZgogICBhbGwg
b2YgdGhlIGxpbmVzIGNvbnRhaW5pbmcgZXhlY3V0YWJsZSBjb2RlIGZvciB0aGUgc3BlY2lm
aWVkIHNvdXJjZSBmaWxlCiAgIChpZTogbGluZXMgd2hlcmUgeW91IGNhbiBwdXQgYnJlYWtw
b2ludHMpLiAqLwoKc3RhdGljIGludApnZGJfc291cmNlbGluZXMgKGNsaWVudERhdGEsIGlu
dGVycCwgYXJnYywgYXJndikKICAgICBDbGllbnREYXRhIGNsaWVudERhdGE7CiAgICAgVGNs
X0ludGVycCAqaW50ZXJwOwogICAgIGludCBhcmdjOwogICAgIGNoYXIgKmFyZ3ZbXTsKewog
IHN0cnVjdCBzeW10YWIgKnN5bXRhYjsKICBzdHJ1Y3QgbGluZXRhYmxlX2VudHJ5ICpsZTsK
ICBpbnQgbmxpbmVzOwoKICBpZiAoYXJnYyAhPSAyKQogICAgZXJyb3IgKCJ3cm9uZyAjIGFy
Z3MiKTsKCiAgc3ltdGFiID0gbG9va3VwX3N5bXRhYiAoYXJndlsxXSk7CgogIGlmICghc3lt
dGFiKQogICAgZXJyb3IgKCJObyBzdWNoIGZpbGUiKTsKCiAgLyogSWYgdGhlcmUncyBubyBs
aW5ldGFibGUsIG9yIG5vIGVudHJpZXMsIHRoZW4gd2UgYXJlIGRvbmUuICovCgogIGlmICgh
c3ltdGFiLT5saW5ldGFibGUKICAgICAgfHwgc3ltdGFiLT5saW5ldGFibGUtPm5pdGVtcyA9
PSAwKQogICAgewogICAgICBUY2xfRFN0cmluZ0FwcGVuZEVsZW1lbnQgKHJlc3VsdF9wdHIs
ICIiKTsKICAgICAgcmV0dXJuIFRDTF9PSzsKICAgIH0KCiAgbGUgPSBzeW10YWItPmxpbmV0
YWJsZS0+aXRlbTsKICBubGluZXMgPSBzeW10YWItPmxpbmV0YWJsZS0+bml0ZW1zOwoKICBm
b3IgKDtubGluZXMgPiAwOyBubGluZXMtLSwgbGUrKykKICAgIHsKICAgICAgLyogSWYgdGhl
IHBjIG9mIHRoaXMgbGluZSBpcyB0aGUgc2FtZSBhcyB0aGUgcGMgb2YgdGhlIG5leHQgbGlu
ZSwgdGhlbgoJIGp1c3Qgc2tpcCBpdC4gICovCiAgICAgIGlmIChubGluZXMgPiAxCgkgICYm
IGxlLT5wYyA9PSAobGUgKyAxKS0+cGMpCgljb250aW51ZTsKCiAgICAgIGRzcHJpbnRmX2Fw
cGVuZF9lbGVtZW50IChyZXN1bHRfcHRyLCAiJWQiLCBsZS0+bGluZSk7CiAgICB9CgogIHJl
dHVybiBUQ0xfT0s7Cn0KDApzdGF0aWMgaW50Cm1hcF9hcmdfcmVnaXN0ZXJzIChhcmdjLCBh
cmd2LCBmdW5jLCBhcmdwKQogICAgIGludCBhcmdjOwogICAgIGNoYXIgKmFyZ3ZbXTsKICAg
ICB2b2lkICgqZnVuYykgUEFSQU1TICgoaW50IHJlZ251bSwgdm9pZCAqYXJncCkpOwogICAg
IHZvaWQgKmFyZ3A7CnsKICBpbnQgcmVnbnVtOwoKICAvKiBOb3RlIHRoYXQgdGhlIHRlc3Qg
Zm9yIGEgdmFsaWQgcmVnaXN0ZXIgbXVzdCBpbmNsdWRlIGNoZWNraW5nIHRoZQogICAgIHJl
Z19uYW1lcyBhcnJheSBiZWNhdXNlIE5VTV9SRUdTIG1heSBiZSBhbGxvY2F0ZWQgZm9yIHRo
ZSB1bmlvbiBvZiB0aGUKICAgICByZWdpc3RlciBzZXRzIHdpdGhpbiBhIGZhbWlseSBvZiBy
ZWxhdGVkIHByb2Nlc3NvcnMuICBJbiB0aGlzIGNhc2UsIHRoZQogICAgIHRyYWlsaW5nIGVu
dHJpZXMgb2YgcmVnX25hbWVzIHdpbGwgY2hhbmdlIGRlcGVuZGluZyB1cG9uIHRoZSBwYXJ0
aWN1bGFyCiAgICAgcHJvY2Vzc29yIGJlaW5nIGRlYnVnZ2VkLiAgKi8KCiAgaWYgKGFyZ2Mg
PT0gMCkJCS8qIE5vIGFyZ3MsIGp1c3QgZG8gYWxsIHRoZSByZWdzICovCiAgICB7CiAgICAg
IGZvciAocmVnbnVtID0gMDsKCSAgIHJlZ251bSA8IE5VTV9SRUdTCgkgICAmJiByZWdfbmFt
ZXNbcmVnbnVtXSAhPSBOVUxMCgkgICAmJiAqcmVnX25hbWVzW3JlZ251bV0gIT0gJ1wwMDAn
OwoJICAgcmVnbnVtKyspCglmdW5jIChyZWdudW0sIGFyZ3ApOwoKICAgICAgcmV0dXJuIFRD
TF9PSzsKICAgIH0KCiAgLyogRWxzZSwgbGlzdCBvZiByZWdpc3RlciAjcywganVzdCBkbyBs
aXN0ZWQgcmVncyAqLwogIGZvciAoOyBhcmdjID4gMDsgYXJnYy0tLCBhcmd2KyspCiAgICB7
CiAgICAgIHJlZ251bSA9IGF0b2kgKCphcmd2KTsKCiAgICAgIGlmIChyZWdudW0gPj0gMAoJ
ICAmJiByZWdudW0gPCBOVU1fUkVHUwoJICAmJiByZWdfbmFtZXNbcmVnbnVtXSAhPSBOVUxM
CgkgICYmICpyZWdfbmFtZXNbcmVnbnVtXSAhPSAnXDAwMCcpCglmdW5jIChyZWdudW0sIGFy
Z3ApOwogICAgICBlbHNlCgllcnJvciAoImJhZCByZWdpc3RlciBudW1iZXIiKTsKICAgIH0K
CiAgcmV0dXJuIFRDTF9PSzsKfQoKc3RhdGljIHZvaWQKZ2V0X3JlZ2lzdGVyX25hbWUgKHJl
Z251bSwgYXJncCkKICAgICBpbnQgcmVnbnVtOwogICAgIHZvaWQgKmFyZ3A7CQkvKiBJZ25v
cmVkICovCnsKICBUY2xfRFN0cmluZ0FwcGVuZEVsZW1lbnQgKHJlc3VsdF9wdHIsIHJlZ19u
YW1lc1tyZWdudW1dKTsKfQoKLyogVGhpcyBpbXBsZW1lbnRzIHRoZSBUQ0wgY29tbWFuZCBg
Z2RiX3JlZ25hbWVzJywgd2hpY2ggcmV0dXJucyBhIGxpc3Qgb2YKICAgYWxsIG9mIHRoZSBy
ZWdpc3RlciBuYW1lcy4gKi8KCnN0YXRpYyBpbnQKZ2RiX3JlZ25hbWVzIChjbGllbnREYXRh
LCBpbnRlcnAsIGFyZ2MsIGFyZ3YpCiAgICAgQ2xpZW50RGF0YSBjbGllbnREYXRhOwogICAg
IFRjbF9JbnRlcnAgKmludGVycDsKICAgICBpbnQgYXJnYzsKICAgICBjaGFyICphcmd2W107
CnsKICBhcmdjLS07CiAgYXJndisrOwoKICByZXR1cm4gbWFwX2FyZ19yZWdpc3RlcnMgKGFy
Z2MsIGFyZ3YsIGdldF9yZWdpc3Rlcl9uYW1lLCBOVUxMKTsKfQoKI2lmbmRlZiBSRUdJU1RF
Ul9DT05WRVJUSUJMRQojZGVmaW5lIFJFR0lTVEVSX0NPTlZFUlRJQkxFKHgpICgwICE9IDAp
CiNlbmRpZgoKI2lmbmRlZiBSRUdJU1RFUl9DT05WRVJUX1RPX1ZJUlRVQUwKI2RlZmluZSBS
RUdJU1RFUl9DT05WRVJUX1RPX1ZJUlRVQUwoeCwgeSwgeiwgYSkKI2VuZGlmCgojaWZuZGVm
IElOVkFMSURfRkxPQVQKI2RlZmluZSBJTlZBTElEX0ZMT0FUKHgsIHkpICgwICE9IDApCiNl
bmRpZgoKc3RhdGljIHZvaWQKZ2V0X3JlZ2lzdGVyIChyZWdudW0sIGZwKQogICAgIGludCBy
ZWdudW07CiAgICAgdm9pZCAqZnA7CnsKICBjaGFyIHJhd19idWZmZXJbTUFYX1JFR0lTVEVS
X1JBV19TSVpFXTsKICBjaGFyIHZpcnR1YWxfYnVmZmVyW01BWF9SRUdJU1RFUl9WSVJUVUFM
X1NJWkVdOwogIGludCBmb3JtYXQgPSAoaW50KWZwOwoKICBpZiAocmVhZF9yZWxhdGl2ZV9y
ZWdpc3Rlcl9yYXdfYnl0ZXMgKHJlZ251bSwgcmF3X2J1ZmZlcikpCiAgICB7CiAgICAgIFRj
bF9EU3RyaW5nQXBwZW5kRWxlbWVudCAocmVzdWx0X3B0ciwgIk9wdGltaXplZCBvdXQiKTsK
ICAgICAgcmV0dXJuOwogICAgfQoKICAvKiBDb252ZXJ0IHJhdyBkYXRhIHRvIHZpcnR1YWwg
Zm9ybWF0IGlmIG5lY2Vzc2FyeS4gICovCgogIGlmIChSRUdJU1RFUl9DT05WRVJUSUJMRSAo
cmVnbnVtKSkKICAgIHsKICAgICAgUkVHSVNURVJfQ09OVkVSVF9UT19WSVJUVUFMIChyZWdu
dW0sIFJFR0lTVEVSX1ZJUlRVQUxfVFlQRSAocmVnbnVtKSwKCQkJCSAgIHJhd19idWZmZXIs
IHZpcnR1YWxfYnVmZmVyKTsKICAgIH0KICBlbHNlCiAgICBtZW1jcHkgKHZpcnR1YWxfYnVm
ZmVyLCByYXdfYnVmZmVyLCBSRUdJU1RFUl9WSVJUVUFMX1NJWkUgKHJlZ251bSkpOwoKICBp
ZiAoZm9ybWF0ID09ICdyJykKICAgIHsKICAgICAgaW50IGo7CiAgICAgIHByaW50Zl9maWx0
ZXJlZCAoIjB4Iik7CiAgICAgIGZvciAoaiA9IDA7IGogPCBSRUdJU1RFUl9SQVdfU0laRSAo
cmVnbnVtKTsgaisrKQoJewoJICByZWdpc3RlciBpbnQgaWR4ID0gVEFSR0VUX0JZVEVfT1JE
RVIgPT0gQklHX0VORElBTiA/IGoKCSAgICA6IFJFR0lTVEVSX1JBV19TSVpFIChyZWdudW0p
IC0gMSAtIGo7CgkgIHByaW50Zl9maWx0ZXJlZCAoIiUwMngiLCAodW5zaWduZWQgY2hhcily
YXdfYnVmZmVyW2lkeF0pOwoJfQogICAgfQogIGVsc2UKICAgIHZhbF9wcmludCAoUkVHSVNU
RVJfVklSVFVBTF9UWVBFIChyZWdudW0pLCB2aXJ0dWFsX2J1ZmZlciwgMCwKCSAgICAgICBn
ZGJfc3Rkb3V0LCBmb3JtYXQsIDEsIDAsIFZhbF9wcmV0dHlfZGVmYXVsdCk7CgogIFRjbF9E
U3RyaW5nQXBwZW5kIChyZXN1bHRfcHRyLCAiICIsIC0xKTsKfQoKc3RhdGljIGludApnZGJf
ZmV0Y2hfcmVnaXN0ZXJzIChjbGllbnREYXRhLCBpbnRlcnAsIGFyZ2MsIGFyZ3YpCiAgICAg
Q2xpZW50RGF0YSBjbGllbnREYXRhOwogICAgIFRjbF9JbnRlcnAgKmludGVycDsKICAgICBp
bnQgYXJnYzsKICAgICBjaGFyICphcmd2W107CnsKICBpbnQgZm9ybWF0OwoKICBpZiAoYXJn
YyA8IDIpCiAgICBlcnJvciAoIndyb25nICMgYXJncyIpOwoKICBhcmdjLS07CiAgYXJndisr
OwoKICBhcmdjLS07CiAgZm9ybWF0ID0gKiphcmd2Kys7CgogIHJldHVybiBtYXBfYXJnX3Jl
Z2lzdGVycyAoYXJnYywgYXJndiwgZ2V0X3JlZ2lzdGVyLCAodm9pZCAqKSBmb3JtYXQpOwp9
CgovKiBUaGlzIGNvbnRhaW5zIHRoZSBwcmV2aW91cyB2YWx1ZXMgb2YgdGhlIHJlZ2lzdGVy
cywgc2luY2UgdGhlIGxhc3QgY2FsbCB0bwogICBnZGJfY2hhbmdlZF9yZWdpc3Rlcl9saXN0
LiAgKi8KCnN0YXRpYyBjaGFyIG9sZF9yZWdzW1JFR0lTVEVSX0JZVEVTXTsKCnN0YXRpYyB2
b2lkCnJlZ2lzdGVyX2NoYW5nZWRfcCAocmVnbnVtLCBhcmdwKQogICAgIGludCByZWdudW07
CiAgICAgdm9pZCAqYXJncDsJCS8qIElnbm9yZWQgKi8KewogIGNoYXIgcmF3X2J1ZmZlcltN
QVhfUkVHSVNURVJfUkFXX1NJWkVdOwoKICBpZiAocmVhZF9yZWxhdGl2ZV9yZWdpc3Rlcl9y
YXdfYnl0ZXMgKHJlZ251bSwgcmF3X2J1ZmZlcikpCiAgICByZXR1cm47CgogIGlmIChtZW1j
bXAgKCZvbGRfcmVnc1tSRUdJU1RFUl9CWVRFIChyZWdudW0pXSwgcmF3X2J1ZmZlciwKCSAg
ICAgIFJFR0lTVEVSX1JBV19TSVpFIChyZWdudW0pKSA9PSAwKQogICAgcmV0dXJuOwoKICAv
KiBGb3VuZCBhIGNoYW5nZWQgcmVnaXN0ZXIuICBTYXZlIG5ldyB2YWx1ZSBhbmQgcmV0dXJu
IGl0cyBudW1iZXIuICovCgogIG1lbWNweSAoJm9sZF9yZWdzW1JFR0lTVEVSX0JZVEUgKHJl
Z251bSldLCByYXdfYnVmZmVyLAoJICBSRUdJU1RFUl9SQVdfU0laRSAocmVnbnVtKSk7Cgog
IGRzcHJpbnRmX2FwcGVuZF9lbGVtZW50IChyZXN1bHRfcHRyLCAiJWQiLCByZWdudW0pOwp9
CgpzdGF0aWMgaW50CmdkYl9jaGFuZ2VkX3JlZ2lzdGVyX2xpc3QgKGNsaWVudERhdGEsIGlu
dGVycCwgYXJnYywgYXJndikKICAgICBDbGllbnREYXRhIGNsaWVudERhdGE7CiAgICAgVGNs
X0ludGVycCAqaW50ZXJwOwogICAgIGludCBhcmdjOwogICAgIGNoYXIgKmFyZ3ZbXTsKewog
IGFyZ2MtLTsKICBhcmd2Kys7CgogIHJldHVybiBtYXBfYXJnX3JlZ2lzdGVycyAoYXJnYywg
YXJndiwgcmVnaXN0ZXJfY2hhbmdlZF9wLCBOVUxMKTsKfQoMCi8qIFRoaXMgaW1wbGVtZW50
cyB0aGUgVENMIGNvbW1hbmQgYGdkYl9jbWQnLCB3aGljaCBzZW5kcyBpdHMgYXJndW1lbnQg
aW50bwogICB0aGUgR0RCIGNvbW1hbmQgc2Nhbm5lci4gICovCgpzdGF0aWMgaW50CmdkYl9j
bWQgKGNsaWVudERhdGEsIGludGVycCwgYXJnYywgYXJndikKICAgICBDbGllbnREYXRhIGNs
aWVudERhdGE7CiAgICAgVGNsX0ludGVycCAqaW50ZXJwOwogICAgIGludCBhcmdjOwogICAg
IGNoYXIgKmFyZ3ZbXTsKewogIGlmIChhcmdjICE9IDIpCiAgICBlcnJvciAoIndyb25nICMg
YXJncyIpOwoKICBpZiAocnVubmluZ19ub3cpCiAgICByZXR1cm4gVENMX09LOwoKICBleGVj
dXRlX2NvbW1hbmQgKGFyZ3ZbMV0sIDEpOwoKICBicHN0YXRfZG9fYWN0aW9ucyAoJnN0b3Bf
YnBzdGF0KTsKCiAgcmV0dXJuIFRDTF9PSzsKfQoKLyogVGhpcyByb3V0aW5lIGFjdHMgYXMg
YSB0b3AtbGV2ZWwgZm9yIGFsbCBHREIgY29kZSBjYWxsZWQgYnkgdGNsL1RrLiAgSXQKICAg
aGFuZGxlcyBjbGVhbnVwcywgYW5kIGNhbGxzIHRvIHJldHVybl90b190b3BfbGV2ZWwgKHVz
dWFsbHkgdmlhIGVycm9yKS4KICAgVGhpcyBpcyBuZWNlc3NhcnkgaW4gb3JkZXIgdG8gcHJl
dmVudCBhIGxvbmdqbXAgb3V0IG9mIHRoZSBib3dlbHMgb2YgVGssCiAgIHBvc3NpYmx5IGxl
YXZpbmcgdGhpbmdzIGluIGEgYmFkIHN0YXRlLiAgU2luY2UgdGhpcyByb3V0aW5lIGNhbiBi
ZSBjYWxsZWQKICAgcmVjdXJzaXZlbHksIGl0IG5lZWRzIHRvIHNhdmUgYW5kIHJlc3RvcmUg
dGhlIGNvbnRlbnRzIG9mIHRoZSBqbXBfYnVmIGFzCiAgIG5lY2Vzc2FyeS4gICovCgpzdGF0
aWMgaW50CmNhbGxfd3JhcHBlciAoY2xpZW50RGF0YSwgaW50ZXJwLCBhcmdjLCBhcmd2KQog
ICAgIENsaWVudERhdGEgY2xpZW50RGF0YTsKICAgICBUY2xfSW50ZXJwICppbnRlcnA7CiAg
ICAgaW50IGFyZ2M7CiAgICAgY2hhciAqYXJndltdOwp7CiAgaW50IHZhbDsKICBzdHJ1Y3Qg
Y2xlYW51cCAqc2F2ZWRfY2xlYW51cF9jaGFpbjsKICBUY2xfQ21kUHJvYyAqZnVuYzsKICBq
bXBfYnVmIHNhdmVkX2Vycm9yX3JldHVybjsKICBUY2xfRFN0cmluZyByZXN1bHQsICpvbGRf
cmVzdWx0X3B0cjsKCiAgVGNsX0RTdHJpbmdJbml0ICgmcmVzdWx0KTsKICBvbGRfcmVzdWx0
X3B0ciA9IHJlc3VsdF9wdHI7CiAgcmVzdWx0X3B0ciA9ICZyZXN1bHQ7CgogIGZ1bmMgPSAo
VGNsX0NtZFByb2MgKiljbGllbnREYXRhOwogIG1lbWNweSAoc2F2ZWRfZXJyb3JfcmV0dXJu
LCBlcnJvcl9yZXR1cm4sIHNpemVvZiAoam1wX2J1ZikpOwoKICBzYXZlZF9jbGVhbnVwX2No
YWluID0gc2F2ZV9jbGVhbnVwcyAoKTsKCiAgaWYgKCFzZXRqbXAgKGVycm9yX3JldHVybikp
CiAgICB2YWwgPSBmdW5jIChjbGllbnREYXRhLCBpbnRlcnAsIGFyZ2MsIGFyZ3YpOwogIGVs
c2UKICAgIHsKICAgICAgdmFsID0gVENMX0VSUk9SOwkJLyogRmxhZyBhbiBlcnJvciBmb3Ig
VENMICovCgogICAgICBnZGJfZmx1c2ggKGdkYl9zdGRlcnIpOwkvKiBGbHVzaCBlcnJvciBv
dXRwdXQgKi8KCiAgICAgIGdkYl9mbHVzaCAoZ2RiX3N0ZG91dCk7CS8qIFNvbWV0aW1lcyBl
cnJvciBvdXRwdXQgY29tZXMgaGVyZSBhcyB3ZWxsICovCgogICAgICAvKiBJbiBjYXNlIG9m
IGFuIGVycm9yLCB3ZSBtYXkgbmVlZCB0byBmb3JjZSB0aGUgR1VJIGludG8gaWRsZQoJIG1v
ZGUgYmVjYXVzZSBnZGJ0a19jYWxsX2NvbW1hbmQgbWF5IGhhdmUgYm9tYmVkIG91dCB3aGls
ZSBpbgoJIHRoZSBjb21tYW5kIHJvdXRpbmUuICAqLwoKICAgICAgcnVubmluZ19ub3cgPSAw
OwogICAgICBUY2xfRXZhbCAoaW50ZXJwLCAiZ2RidGtfdGNsX2lkbGUiKTsKICAgIH0KCiAg
ZG9fY2xlYW51cHMgKEFMTF9DTEVBTlVQUyk7CgogIHJlc3RvcmVfY2xlYW51cHMgKHNhdmVk
X2NsZWFudXBfY2hhaW4pOwoKICBtZW1jcHkgKGVycm9yX3JldHVybiwgc2F2ZWRfZXJyb3Jf
cmV0dXJuLCBzaXplb2YgKGptcF9idWYpKTsKCiAgVGNsX0RTdHJpbmdSZXN1bHQgKGludGVy
cCwgJnJlc3VsdCk7CiAgcmVzdWx0X3B0ciA9IG9sZF9yZXN1bHRfcHRyOwoKICByZXR1cm4g
dmFsOwp9CgpzdGF0aWMgaW50CmdkYl9saXN0ZmlsZXMgKGNsaWVudERhdGEsIGludGVycCwg
YXJnYywgYXJndikKICAgICBDbGllbnREYXRhIGNsaWVudERhdGE7CiAgICAgVGNsX0ludGVy
cCAqaW50ZXJwOwogICAgIGludCBhcmdjOwogICAgIGNoYXIgKmFyZ3ZbXTsKewogIHN0cnVj
dCBvYmpmaWxlICpvYmpmaWxlOwogIHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqcHN5bXRhYjsK
ICBzdHJ1Y3Qgc3ltdGFiICpzeW10YWI7CgogIEFMTF9QU1lNVEFCUyAob2JqZmlsZSwgcHN5
bXRhYikKICAgIFRjbF9EU3RyaW5nQXBwZW5kRWxlbWVudCAocmVzdWx0X3B0ciwgcHN5bXRh
Yi0+ZmlsZW5hbWUpOwoKICBBTExfU1lNVEFCUyAob2JqZmlsZSwgc3ltdGFiKQogICAgVGNs
X0RTdHJpbmdBcHBlbmRFbGVtZW50IChyZXN1bHRfcHRyLCBzeW10YWItPmZpbGVuYW1lKTsK
CiAgcmV0dXJuIFRDTF9PSzsKfQoKc3RhdGljIGludApnZGJfc3RvcCAoY2xpZW50RGF0YSwg
aW50ZXJwLCBhcmdjLCBhcmd2KQogICAgIENsaWVudERhdGEgY2xpZW50RGF0YTsKICAgICBU
Y2xfSW50ZXJwICppbnRlcnA7CiAgICAgaW50IGFyZ2M7CiAgICAgY2hhciAqYXJndltdOwp7
CiAgdGFyZ2V0X3N0b3AgKCk7CgogIHJldHVybiBUQ0xfT0s7Cn0KDAovKiBUaGlzIGltcGxl
bWVudHMgdGhlIFRDTCBjb21tYW5kIGBnZGJfZGlzYXNzZW1ibGUnLiAgKi8KCnN0YXRpYyBp
bnQKZ2RidGtfZGlzX2FzbV9yZWFkX21lbW9yeSAobWVtYWRkciwgbXlhZGRyLCBsZW4sIGlu
Zm8pCiAgICAgYmZkX3ZtYSBtZW1hZGRyOwogICAgIGJmZF9ieXRlICpteWFkZHI7CiAgICAg
aW50IGxlbjsKICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwp7CiAgZXh0ZXJuIHN0cnVj
dCB0YXJnZXRfb3BzIGV4ZWNfb3BzOwogIGludCByZXM7CgogIGVycm5vID0gMDsKICByZXMg
PSB4ZmVyX21lbW9yeSAobWVtYWRkciwgbXlhZGRyLCBsZW4sIDAsICZleGVjX29wcyk7Cgog
IGlmIChyZXMgPT0gbGVuKQogICAgcmV0dXJuIDA7CiAgZWxzZQogICAgaWYgKGVycm5vID09
IDApCiAgICAgIHJldHVybiBFSU87CiAgICBlbHNlCiAgICAgIHJldHVybiBlcnJubzsKfQoK
LyogV2UgbmVlZCBhIGRpZmZlcmVudCBzb3J0IG9mIGxpbmUgdGFibGUgZnJvbSB0aGUgbm9y
bWFsIG9uZSBjdXogd2UgY2FuJ3QKICAgZGVwZW5kIHVwb24gaW1wbGljaXQgbGluZS1lbmQg
cGMncyBmb3IgbGluZXMuICBUaGlzIGlzIGJlY2F1c2Ugb2YgdGhlCiAgIHJlb3JkZXJpbmcg
d2UgYXJlIGFib3V0IHRvIGRvLiAgKi8KCnN0cnVjdCBteV9saW5lX2VudHJ5IHsKICBpbnQg
bGluZTsKICBDT1JFX0FERFIgc3RhcnRfcGM7CiAgQ09SRV9BRERSIGVuZF9wYzsKfTsKCnN0
YXRpYyBpbnQKY29tcGFyZV9saW5lcyAobWxlMXAsIG1sZTJwKQogICAgIGNvbnN0IFBUUiBt
bGUxcDsKICAgICBjb25zdCBQVFIgbWxlMnA7CnsKICBzdHJ1Y3QgbXlfbGluZV9lbnRyeSAq
bWxlMSwgKm1sZTI7CiAgaW50IHZhbDsKCiAgbWxlMSA9IChzdHJ1Y3QgbXlfbGluZV9lbnRy
eSAqKSBtbGUxcDsKICBtbGUyID0gKHN0cnVjdCBteV9saW5lX2VudHJ5ICopIG1sZTJwOwoK
ICB2YWwgPSAgbWxlMS0+bGluZSAtIG1sZTItPmxpbmU7CgogIGlmICh2YWwgIT0gMCkKICAg
IHJldHVybiB2YWw7CgogIHJldHVybiBtbGUxLT5zdGFydF9wYyAtIG1sZTItPnN0YXJ0X3Bj
Owp9CgpzdGF0aWMgaW50CmdkYl9kaXNhc3NlbWJsZSAoY2xpZW50RGF0YSwgaW50ZXJwLCBh
cmdjLCBhcmd2KQogICAgIENsaWVudERhdGEgY2xpZW50RGF0YTsKICAgICBUY2xfSW50ZXJw
ICppbnRlcnA7CiAgICAgaW50IGFyZ2M7CiAgICAgY2hhciAqYXJndltdOwp7CiAgQ09SRV9B
RERSIHBjLCBsb3csIGhpZ2g7CiAgaW50IG1peGVkX3NvdXJjZV9hbmRfYXNzZW1ibHk7CiAg
c3RhdGljIGRpc2Fzc2VtYmxlX2luZm8gZGk7CiAgc3RhdGljIGludCBkaV9pbml0aWFsaXpl
ZDsKCiAgaWYgKCEgZGlfaW5pdGlhbGl6ZWQpCiAgICB7CiAgICAgIElOSVRfRElTQVNTRU1C
TEVfSU5GT19OT19BUkNIIChkaSwgZ2RiX3N0ZG91dCwKCQkJCSAgICAgKGZwcmludGZfZnR5
cGUpIGZwcmludGZfdW5maWx0ZXJlZCk7CiAgICAgIGRpLmZsYXZvdXIgPSBiZmRfdGFyZ2V0
X3Vua25vd25fZmxhdm91cjsKICAgICAgZGkubWVtb3J5X2Vycm9yX2Z1bmMgPSBkaXNfYXNt
X21lbW9yeV9lcnJvcjsKICAgICAgZGkucHJpbnRfYWRkcmVzc19mdW5jID0gZGlzX2FzbV9w
cmludF9hZGRyZXNzOwogICAgICBkaV9pbml0aWFsaXplZCA9IDE7CiAgICB9CgogIGRpLm1h
Y2ggPSB0bV9wcmludF9pbnNuX2luZm8ubWFjaDsKICBpZiAoVEFSR0VUX0JZVEVfT1JERVIg
PT0gQklHX0VORElBTikKICAgIHRtX3ByaW50X2luc25faW5mby5lbmRpYW4gPSBCRkRfRU5E
SUFOX0JJRzsKICBlbHNlCiAgICB0bV9wcmludF9pbnNuX2luZm8uZW5kaWFuID0gQkZEX0VO
RElBTl9MSVRUTEU7CgogIGlmIChhcmdjICE9IDMgJiYgYXJnYyAhPSA0KQogICAgZXJyb3Ig
KCJ3cm9uZyAjIGFyZ3MiKTsKCiAgaWYgKHN0cmNtcCAoYXJndlsxXSwgInNvdXJjZSIpID09
IDApCiAgICBtaXhlZF9zb3VyY2VfYW5kX2Fzc2VtYmx5ID0gMTsKICBlbHNlIGlmIChzdHJj
bXAgKGFyZ3ZbMV0sICJub3NvdXJjZSIpID09IDApCiAgICBtaXhlZF9zb3VyY2VfYW5kX2Fz
c2VtYmx5ID0gMDsKICBlbHNlCiAgICBlcnJvciAoIkZpcnN0IGFyZyBtdXN0IGJlICdzb3Vy
Y2UnIG9yICdub3NvdXJjZSciKTsKCiAgbG93ID0gcGFyc2VfYW5kX2V2YWxfYWRkcmVzcyAo
YXJndlsyXSk7CgogIGlmIChhcmdjID09IDMpCiAgICB7CiAgICAgIGlmIChmaW5kX3BjX3Bh
cnRpYWxfZnVuY3Rpb24gKGxvdywgTlVMTCwgJmxvdywgJmhpZ2gpID09IDApCgllcnJvciAo
Ik5vIGZ1bmN0aW9uIGNvbnRhaW5zIHNwZWNpZmllZCBhZGRyZXNzIik7CiAgICB9CiAgZWxz
ZQogICAgaGlnaCA9IHBhcnNlX2FuZF9ldmFsX2FkZHJlc3MgKGFyZ3ZbM10pOwoKICAvKiBJ
ZiBkaXNhc3NlbWJsZV9mcm9tX2V4ZWMgPT0gLTEsIHRoZW4gd2UgdXNlIHRoZSBmb2xsb3dp
bmcgaGV1cmlzdGljIHRvCiAgICAgZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHRvIGRvIGRp
c2Fzc2VtYmx5IGZyb20gdGFyZ2V0IG1lbW9yeSBvciBmcm9tIHRoZQogICAgIGV4ZWMgZmls
ZToKCiAgICAgSWYgd2UncmUgZGVidWdnaW5nIGEgbG9jYWwgcHJvY2VzcywgcmVhZCB0YXJn
ZXQgbWVtb3J5LCBpbnN0ZWFkIG9mIHRoZQogICAgIGV4ZWMgZmlsZS4gIFRoaXMgbWFrZXMg
ZGlzYXNzZW1ibHkgb2YgZnVuY3Rpb25zIGluIHNoYXJlZCBsaWJzIHdvcmsKICAgICBjb3Jy
ZWN0bHkuCgogICAgIEVsc2UsIHdlJ3JlIGRlYnVnZ2luZyBhIHJlbW90ZSBwcm9jZXNzLCBh
bmQgc2hvdWxkIGRpc2Fzc2VtYmxlIGZyb20gdGhlCiAgICAgZXhlYyBmaWxlIGZvciBzcGVl
ZC4gIEhvd2V2ZXIsIHRoaXMgaXMgbm8gZ29vZCBpZiB0aGUgdGFyZ2V0IG1vZGlmaWVzIGl0
cwogICAgIGNvZGUgKGZvciByZWxvY2F0aW9uLCBvciB3aGF0ZXZlcikuCiAgICovCgogIGlm
IChkaXNhc3NlbWJsZV9mcm9tX2V4ZWMgPT0gLTEpCiAgICBpZiAoc3RyY21wICh0YXJnZXRf
c2hvcnRuYW1lLCAiY2hpbGQiKSA9PSAwCgl8fCBzdHJjbXAgKHRhcmdldF9zaG9ydG5hbWUs
ICJwcm9jZnMiKSA9PSAwCgl8fCBzdHJjbXAgKHRhcmdldF9zaG9ydG5hbWUsICJ2eHByb2Nl
c3MiKSA9PSAwKQogICAgICBkaXNhc3NlbWJsZV9mcm9tX2V4ZWMgPSAwOyAvKiBJdCdzIGEg
Y2hpbGQgcHJvY2VzcywgcmVhZCBpbmZlcmlvciBtZW0gKi8KICAgIGVsc2UKICAgICAgZGlz
YXNzZW1ibGVfZnJvbV9leGVjID0gMTsgLyogSXQncyByZW1vdGUsIHJlYWQgdGhlIGV4ZWMg
ZmlsZSAqLwoKICBpZiAoZGlzYXNzZW1ibGVfZnJvbV9leGVjKQogICAgZGkucmVhZF9tZW1v
cnlfZnVuYyA9IGdkYnRrX2Rpc19hc21fcmVhZF9tZW1vcnk7CiAgZWxzZQogICAgZGkucmVh
ZF9tZW1vcnlfZnVuYyA9IGRpc19hc21fcmVhZF9tZW1vcnk7CgogIC8qIElmIGp1c3QgZG9p
bmcgc3RyYWlnaHQgYXNzZW1ibHksIGFsbCB3ZSBuZWVkIHRvIGRvIGlzIGRpc2Fzc2VtYmxl
CiAgICAgZXZlcnl0aGluZyBiZXR3ZWVuIGxvdyBhbmQgaGlnaC4gIElmIGRvaW5nIG1peGVk
IHNvdXJjZS9hc3NlbWJseSwgd2UndmUKICAgICBnb3QgYSB0b3RhbGx5IGRpZmZlcmVudCBw
YXRoIHRvIGZvbGxvdy4gICovCgogIGlmIChtaXhlZF9zb3VyY2VfYW5kX2Fzc2VtYmx5KQog
ICAgewkJCQkvKiBDb21lIGhlcmUgZm9yIG1peGVkIHNvdXJjZS9hc3NlbWJseSAqLwogICAg
ICAvKiBUaGUgaWRlYSBoZXJlIGlzIHRvIHByZXNlbnQgYSBzb3VyY2UtTy1jZW50cmljIHZp
ZXcgb2YgYSBmdW5jdGlvbiB0bwoJIHRoZSB1c2VyLiAgVGhpcyBtZWFucyB0aGF0IHRoaW5n
cyBhcmUgcHJlc2VudGVkIGluIHNvdXJjZSBvcmRlciwgd2l0aAoJIChwb3NzaWJseSkgb3V0
IG9mIG9yZGVyIGFzc2VtYmx5IGltbWVkaWF0ZWx5IGZvbGxvd2luZy4gICovCiAgICAgIHN0
cnVjdCBzeW10YWIgKnN5bXRhYjsKICAgICAgc3RydWN0IGxpbmV0YWJsZV9lbnRyeSAqbGU7
CiAgICAgIGludCBubGluZXM7CiAgICAgIGludCBuZXdsaW5lczsKICAgICAgc3RydWN0IG15
X2xpbmVfZW50cnkgKm1sZTsKICAgICAgc3RydWN0IHN5bXRhYl9hbmRfbGluZSBzYWw7CiAg
ICAgIGludCBpOwogICAgICBpbnQgb3V0X29mX29yZGVyOwogICAgICBpbnQgbmV4dF9saW5l
OwoKICAgICAgc3ltdGFiID0gZmluZF9wY19zeW10YWIgKGxvdyk7IC8qIEFzc3VtZSBzeW10
YWIgaXMgdmFsaWQgZm9yIHdob2xlIFBDIHJhbmdlICovCgogICAgICBpZiAoIXN5bXRhYikK
CWdvdG8gYXNzZW1ibHlfb25seTsKCi8qIEZpcnN0LCBjb252ZXJ0IHRoZSBsaW5ldGFibGUg
dG8gYSBidW5jaCBvZiBteV9saW5lX2VudHJ5J3MuICAqLwoKICAgICAgbGUgPSBzeW10YWIt
PmxpbmV0YWJsZS0+aXRlbTsKICAgICAgbmxpbmVzID0gc3ltdGFiLT5saW5ldGFibGUtPm5p
dGVtczsKCiAgICAgIGlmIChubGluZXMgPD0gMCkKCWdvdG8gYXNzZW1ibHlfb25seTsKCiAg
ICAgIG1sZSA9IChzdHJ1Y3QgbXlfbGluZV9lbnRyeSAqKSBhbGxvY2EgKG5saW5lcyAqIHNp
emVvZiAoc3RydWN0IG15X2xpbmVfZW50cnkpKTsKCiAgICAgIG91dF9vZl9vcmRlciA9IDA7
CgovKiBDb3B5IGxpbmV0YWJsZSBlbnRyaWVzIGZvciB0aGlzIGZ1bmN0aW9uIGludG8gb3Vy
IGRhdGEgc3RydWN0dXJlLCBjcmVhdGluZwogICBlbmRfcGMncyBhbmQgc2V0dGluZyBvdXRf
b2Zfb3JkZXIgYXMgYXBwcm9wcmlhdGUuICAqLwoKLyogRmlyc3QsIHNraXAgYWxsIHRoZSBw
cmVjZWRpbmcgZnVuY3Rpb25zLiAgKi8KCiAgICAgIGZvciAoaSA9IDA7IGkgPCBubGluZXMg
LSAxICYmIGxlW2ldLnBjIDwgbG93OyBpKyspIDsKCi8qIE5vdywgY29weSBhbGwgZW50cmll
cyBiZWZvcmUgdGhlIGVuZCBvZiB0aGlzIGZ1bmN0aW9uLiAgKi8KCiAgICAgIG5ld2xpbmVz
ID0gMDsKICAgICAgZm9yICg7IGkgPCBubGluZXMgLSAxICYmIGxlW2ldLnBjIDwgaGlnaDsg
aSsrKQoJewoJICBpZiAobGVbaV0ubGluZSA9PSBsZVtpICsgMV0ubGluZQoJICAgICAgJiYg
bGVbaV0ucGMgPT0gbGVbaSArIDFdLnBjKQoJICAgIGNvbnRpbnVlOwkJLyogSWdub3JlIGR1
cGxpY2F0ZXMgKi8KCgkgIG1sZVtuZXdsaW5lc10ubGluZSA9IGxlW2ldLmxpbmU7CgkgIGlm
IChsZVtpXS5saW5lID4gbGVbaSArIDFdLmxpbmUpCgkgICAgb3V0X29mX29yZGVyID0gMTsK
CSAgbWxlW25ld2xpbmVzXS5zdGFydF9wYyA9IGxlW2ldLnBjOwoJICBtbGVbbmV3bGluZXNd
LmVuZF9wYyA9IGxlW2kgKyAxXS5wYzsKCSAgbmV3bGluZXMrKzsKCX0KCi8qIElmIHdlJ3Jl
IG9uIHRoZSBsYXN0IGxpbmUsIGFuZCBpdCdzIHBhcnQgb2YgdGhlIGZ1bmN0aW9uLCB0aGVu
IHdlIG5lZWQgdG8KICAgZ2V0IHRoZSBlbmQgcGMgaW4gYSBzcGVjaWFsIHdheS4gICovCgog
ICAgICBpZiAoaSA9PSBubGluZXMgLSAxCgkgICYmIGxlW2ldLnBjIDwgaGlnaCkKCXsKCSAg
bWxlW25ld2xpbmVzXS5saW5lID0gbGVbaV0ubGluZTsKCSAgbWxlW25ld2xpbmVzXS5zdGFy
dF9wYyA9IGxlW2ldLnBjOwoJICBzYWwgPSBmaW5kX3BjX2xpbmUgKGxlW2ldLnBjLCAwKTsK
CSAgbWxlW25ld2xpbmVzXS5lbmRfcGMgPSBzYWwuZW5kOwoJICBuZXdsaW5lcysrOwoJfQoK
LyogTm93LCBzb3J0IG1sZSBieSBsaW5lICNzIChhbmQsIHRoZW4gYnkgYWRkcmVzc2VzIHdp
dGhpbiBsaW5lcykuICovCgogICAgICBpZiAob3V0X29mX29yZGVyKQoJcXNvcnQgKG1sZSwg
bmV3bGluZXMsIHNpemVvZiAoc3RydWN0IG15X2xpbmVfZW50cnkpLCBjb21wYXJlX2xpbmVz
KTsKCi8qIE5vdywgZm9yIGVhY2ggbGluZSBlbnRyeSwgZW1pdCB0aGUgc3BlY2lmaWVkIGxp
bmVzICh1bmxlc3MgdGhleSBoYXZlIGJlZW4KICAgZW1pdHRlZCBiZWZvcmUpLCBmb2xsb3dl
ZCBieSB0aGUgYXNzZW1ibHkgY29kZSBmb3IgdGhhdCBsaW5lLiAgKi8KCiAgICAgIG5leHRf
bGluZSA9IDA7CQkvKiBGb3JjZSBvdXQgZmlyc3QgbGluZSAqLwogICAgICBmb3IgKGkgPSAw
OyBpIDwgbmV3bGluZXM7IGkrKykKCXsKLyogUHJpbnQgb3V0IGV2ZXJ5dGhpbmcgZnJvbSBu
ZXh0X2xpbmUgdG8gdGhlIGN1cnJlbnQgbGluZS4gICovCgoJICBpZiAobWxlW2ldLmxpbmUg
Pj0gbmV4dF9saW5lKQoJICAgIHsKCSAgICAgIGlmIChuZXh0X2xpbmUgIT0gMCkKCQlwcmlu
dF9zb3VyY2VfbGluZXMgKHN5bXRhYiwgbmV4dF9saW5lLCBtbGVbaV0ubGluZSArIDEsIDAp
OwoJICAgICAgZWxzZQoJCXByaW50X3NvdXJjZV9saW5lcyAoc3ltdGFiLCBtbGVbaV0ubGlu
ZSwgbWxlW2ldLmxpbmUgKyAxLCAwKTsKCgkgICAgICBuZXh0X2xpbmUgPSBtbGVbaV0ubGlu
ZSArIDE7CgkgICAgfQoKCSAgZm9yIChwYyA9IG1sZVtpXS5zdGFydF9wYzsgcGMgPCBtbGVb
aV0uZW5kX3BjOyApCgkgICAgewoJICAgICAgUVVJVDsKCSAgICAgIGZwdXRzX3VuZmlsdGVy
ZWQgKCIgICAgIiwgZ2RiX3N0ZG91dCk7CgkgICAgICBwcmludF9hZGRyZXNzIChwYywgZ2Ri
X3N0ZG91dCk7CgkgICAgICBmcHV0c191bmZpbHRlcmVkICgiOlx0ICAgICIsIGdkYl9zdGRv
dXQpOwoJICAgICAgcGMgKz0gKCp0bV9wcmludF9pbnNuKSAocGMsICZkaSk7CgkgICAgICBm
cHV0c191bmZpbHRlcmVkICgiXG4iLCBnZGJfc3Rkb3V0KTsKCSAgICB9Cgl9CiAgICB9CiAg
ZWxzZQogICAgewphc3NlbWJseV9vbmx5OgogICAgICBmb3IgKHBjID0gbG93OyBwYyA8IGhp
Z2g7ICkKCXsKCSAgUVVJVDsKCSAgZnB1dHNfdW5maWx0ZXJlZCAoIiAgICAiLCBnZGJfc3Rk
b3V0KTsKCSAgcHJpbnRfYWRkcmVzcyAocGMsIGdkYl9zdGRvdXQpOwoJICBmcHV0c191bmZp
bHRlcmVkICgiOlx0ICAgICIsIGdkYl9zdGRvdXQpOwoJICBwYyArPSAoKnRtX3ByaW50X2lu
c24pIChwYywgJmRpKTsKCSAgZnB1dHNfdW5maWx0ZXJlZCAoIlxuIiwgZ2RiX3N0ZG91dCk7
Cgl9CiAgICB9CgogIGdkYl9mbHVzaCAoZ2RiX3N0ZG91dCk7CgogIHJldHVybiBUQ0xfT0s7
Cn0KDApzdGF0aWMgdm9pZAp0a19jb21tYW5kIChjbWQsIGZyb21fdHR5KQogICAgIGNoYXIg
KmNtZDsKICAgICBpbnQgZnJvbV90dHk7CnsKICBpbnQgcmV0dmFsOwogIGNoYXIgKnJlc3Vs
dDsKICBzdHJ1Y3QgY2xlYW51cCAqb2xkX2NoYWluOwoKICAvKiBDYXRjaCBjYXNlIG9mIG5v
IGFyZ3VtZW50LCBzaW5jZSB0aGlzIHdpbGwgbWFrZSB0aGUgdGNsIGludGVycHJldGVyIGR1
bXAgY29yZS4gKi8KICBpZiAoY21kID09IE5VTEwpCiAgICBlcnJvcl9ub19hcmcgKCJ0Y2wg
Y29tbWFuZCB0byBpbnRlcnByZXQiKTsKCiAgcmV0dmFsID0gVGNsX0V2YWwgKGludGVycCwg
Y21kKTsKCiAgcmVzdWx0ID0gc3RyZHVwIChpbnRlcnAtPnJlc3VsdCk7CgogIG9sZF9jaGFp
biA9IG1ha2VfY2xlYW51cCAoZnJlZSwgcmVzdWx0KTsKCiAgaWYgKHJldHZhbCAhPSBUQ0xf
T0spCiAgICBlcnJvciAocmVzdWx0KTsKCiAgcHJpbnRmX3VuZmlsdGVyZWQgKCIlc1xuIiwg
cmVzdWx0KTsKCiAgZG9fY2xlYW51cHMgKG9sZF9jaGFpbik7Cn0KCnN0YXRpYyB2b2lkCmNs
ZWFudXBfaW5pdCAoaWdub3JlZCkKICAgICBpbnQgaWdub3JlZDsKewogIGlmIChpbnRlcnAg
IT0gTlVMTCkKICAgIFRjbF9EZWxldGVJbnRlcnAgKGludGVycCk7CiAgaW50ZXJwID0gTlVM
TDsKfQoKLyogQ29tZSBoZXJlIGR1cmluZyBsb25nIGNhbGN1bGF0aW9ucyB0byBjaGVjayBm
b3IgR1VJIGV2ZW50cy4gIFVzdWFsbHkgaW52b2tlZAogICB2aWEgdGhlIFFVSVQgbWFjcm8u
ICAqLwoKc3RhdGljIHZvaWQKZ2RidGtfaW50ZXJhY3RpdmUgKCkKewogIC8qIFRrX0RvT25l
RXZlbnQgKFRLX0RPTlRfV0FJVHxUS19JRExFX0VWRU5UUyk7ICovCn0KCi8qIENvbWUgaGVy
ZSB3aGVuIHRoZXJlIGlzIGFjdGl2aXR5IG9uIHRoZSBYIGZpbGUgZGVzY3JpcHRvci4gKi8K
CnN0YXRpYyB2b2lkCnhfZXZlbnQgKHNpZ25vKQogICAgIGludCBzaWdubzsKewogIC8qIFBy
b2Nlc3MgcGVuZGluZyBldmVudHMgKi8KCiAgd2hpbGUgKFRjbF9Eb09uZUV2ZW50IChUQ0xf
RE9OVF9XQUlUfFRDTF9BTExfRVZFTlRTKSAhPSAwKTsKfQoKc3RhdGljIGludApnZGJ0a193
YWl0IChwaWQsIG91cnN0YXR1cykKICAgICBpbnQgcGlkOwogICAgIHN0cnVjdCB0YXJnZXRf
d2FpdHN0YXR1cyAqb3Vyc3RhdHVzOwp7CiAgc3RydWN0IHNpZ2FjdGlvbiBhY3Rpb247CiAg
c3RhdGljIHNpZ3NldF90IG51bGxzaWdtYXNrID0gezB9OwoKI2lmbmRlZiBTQV9SRVNUQVJU
CiAgLyogTmVlZGVkIGZvciBTdW5PUyA0LjEueCAqLwojZGVmaW5lIFNBX1JFU1RBUlQgMAoj
ZW5kaWYKCiAgYWN0aW9uLnNhX2hhbmRsZXIgPSB4X2V2ZW50OwogIGFjdGlvbi5zYV9tYXNr
ID0gbnVsbHNpZ21hc2s7CiAgYWN0aW9uLnNhX2ZsYWdzID0gU0FfUkVTVEFSVDsKI2lmbmRl
ZiBXSU5OVAogIHNpZ2FjdGlvbihTSUdJTywgJmFjdGlvbiwgTlVMTCk7CiNlbmRpZgoKICBw
aWQgPSB0YXJnZXRfd2FpdCAocGlkLCBvdXJzdGF0dXMpOwoKICBhY3Rpb24uc2FfaGFuZGxl
ciA9IFNJR19JR047CiNpZm5kZWYgV0lOTlQKICBzaWdhY3Rpb24oU0lHSU8sICZhY3Rpb24s
IE5VTEwpOyAKI2VuZGlmCgogIHJldHVybiBwaWQ7Cn0KCi8qIFRoaXMgaXMgY2FsbGVkIGZy
b20gZXhlY3V0ZV9jb21tYW5kLCBhbmQgcHJvdmlkZXMgYSB3cmFwcGVyIGFyb3VuZAogICB2
YXJpb3VzIGNvbW1hbmQgcm91dGluZXMgaW4gYSBwbGFjZSB3aGVyZSBib3RoIHByb3RvY29s
IG1lc3NhZ2VzIGFuZAogICB1c2VyIGlucHV0IGJvdGggZmxvdyB0aHJvdWdoLiAgTW9zdGx5
IHRoaXMgaXMgdXNlZCBmb3IgaW5kaWNhdGluZyB3aGV0aGVyCiAgIHRoZSB0YXJnZXQgcHJv
Y2VzcyBpcyBydW5uaW5nIG9yIG5vdC4KKi8KCnN0YXRpYyB2b2lkCmdkYnRrX2NhbGxfY29t
bWFuZCAoY21kYmxrLCBhcmcsIGZyb21fdHR5KQogICAgIHN0cnVjdCBjbWRfbGlzdF9lbGVt
ZW50ICpjbWRibGs7CiAgICAgY2hhciAqYXJnOwogICAgIGludCBmcm9tX3R0eTsKewogIHJ1
bm5pbmdfbm93ID0gMDsKICBpZiAoY21kYmxrLT5jbGFzcyA9PSBjbGFzc19ydW4pCiAgICB7
CiAgICAgIHJ1bm5pbmdfbm93ID0gMTsKICAgICAgVGNsX0V2YWwgKGludGVycCwgImdkYnRr
X3RjbF9idXN5Iik7CiAgICAgICgqY21kYmxrLT5mdW5jdGlvbi5jZnVuYykoYXJnLCBmcm9t
X3R0eSk7CiAgICAgIFRjbF9FdmFsIChpbnRlcnAsICJnZGJ0a190Y2xfaWRsZSIpOwogICAg
ICBydW5uaW5nX25vdyA9IDA7CiAgICB9CiAgZWxzZQogICAgKCpjbWRibGstPmZ1bmN0aW9u
LmNmdW5jKShhcmcsIGZyb21fdHR5KTsKfQoKLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQg
aW5zdGVhZCBvZiBnZGIncyBpbnRlcm5hbCBjb21tYW5kIGxvb3AuICBUaGlzIGlzIHRoZQog
ICBsYXN0IGNoYW5jZSB0byBkbyBhbnl0aGluZyBiZWZvcmUgZW50ZXJpbmcgdGhlIG1haW4g
VGsgZXZlbnQgbG9vcC4gKi8KCnN0YXRpYyB2b2lkCnRrX2NvbW1hbmRfbG9vcCAoKQp7CiAg
ZXh0ZXJuIEdEQl9GSUxFICppbnN0cmVhbTsKCiAgLyogV2Ugbm8gbG9uZ2VyIHdhbnQgdG8g
dXNlIHN0ZGluIGFzIHRoZSBjb21tYW5kIGlucHV0IHN0cmVhbSAqLwogIGluc3RyZWFtID0g
TlVMTDsKICBUY2xfRXZhbCAoaW50ZXJwLCAiZ2RidGtfdGNsX3ByZWxvb3AiKTsKICBUa19N
YWluTG9vcCAoKTsKfQoKc3RhdGljIHZvaWQKZ2RidGtfaW5pdCAoKQp7CiAgc3RydWN0IGNs
ZWFudXAgKm9sZF9jaGFpbjsKICBjaGFyICpsaWIsICpnZGJ0a19saWIsIGdkYnRrX2xpYl90
bXBbMTAyNF0sZ2RidGtfZmlsZVsxMjhdOwogIGludCBpLCBmb3VuZF9tYWluOwogIHN0cnVj
dCBzaWdhY3Rpb24gYWN0aW9uOwogIHN0YXRpYyBzaWdzZXRfdCBudWxsc2lnbWFzayA9IHsw
fTsKCiAgLyogSWYgdGhlcmUgaXMgbm8gRElTUExBWSBlbnZpcm9ubWVudCB2YXJpYWJsZSwg
VGtfSW5pdCBiZWxvdyB3aWxsIGZhaWwsCiAgICAgY2F1c2luZyBnZGIgdG8gYWJvcnQuICBJ
ZiBpbnN0ZWFkIHdlIHNpbXBseSByZXR1cm4gaGVyZSwgZ2RiIHdpbGwKICAgICBncmFjZWZ1
bGx5IGRlZ3JhZGUgdG8gdXNpbmcgdGhlIGNvbW1hbmQgbGluZSBpbnRlcmZhY2UuICovCgoj
aWZuZGVmIFdJTk5UCiAgaWYgKGdldGVudiAoIkRJU1BMQVkiKSA9PSBOVUxMKQogICAgcmV0
dXJuOwojZW5kaWYKCiAgb2xkX2NoYWluID0gbWFrZV9jbGVhbnVwIChjbGVhbnVwX2luaXQs
IDApOwoKICAvKiBGaXJzdCBpbml0IHRjbCBhbmQgdGsuICovCgogIGludGVycCA9IFRjbF9D
cmVhdGVJbnRlcnAgKCk7CgogIGlmICghaW50ZXJwKQogICAgZXJyb3IgKCJUY2xfQ3JlYXRl
SW50ZXJwIGZhaWxlZCIpOwoKICBpZiAoVGNsX0luaXQoaW50ZXJwKSAhPSBUQ0xfT0spCiAg
ICBlcnJvciAoIlRjbF9Jbml0IGZhaWxlZDogJXMiLCBpbnRlcnAtPnJlc3VsdCk7CgogIC8q
CiAgICBpZiAoSXRjbF9Jbml0KGludGVycCkgPT0gVENMX0VSUk9SKSAKICBlcnJvciAoIkl0
Y2xfSW5pdCBmYWlsZWQ6ICVzIiwgaW50ZXJwLT5yZXN1bHQpOwogICAgKi8KICAKICBpZiAo
VGtfSW5pdChpbnRlcnApICE9IFRDTF9PSykKICAgIGVycm9yICgiVGtfSW5pdCBmYWlsZWQ6
ICVzIiwgaW50ZXJwLT5yZXN1bHQpOwoKICBUY2xfQ3JlYXRlQ29tbWFuZCAoaW50ZXJwLCAi
Z2RiX2NtZCIsIGNhbGxfd3JhcHBlciwgZ2RiX2NtZCwgTlVMTCk7CiAgVGNsX0NyZWF0ZUNv
bW1hbmQgKGludGVycCwgImdkYl9sb2MiLCBjYWxsX3dyYXBwZXIsIGdkYl9sb2MsIE5VTEwp
OwogIFRjbF9DcmVhdGVDb21tYW5kIChpbnRlcnAsICJnZGJfcGF0aF9jb252IiwgY2FsbF93
cmFwcGVyLCBnZGJfcGF0aF9jb252LCBOVUxMKTsKICBUY2xfQ3JlYXRlQ29tbWFuZCAoaW50
ZXJwLCAiZ2RiX3NvdXJjZWxpbmVzIiwgY2FsbF93cmFwcGVyLCBnZGJfc291cmNlbGluZXMs
CgkJICAgICBOVUxMKTsKICBUY2xfQ3JlYXRlQ29tbWFuZCAoaW50ZXJwLCAiZ2RiX2xpc3Rm
aWxlcyIsIGNhbGxfd3JhcHBlciwgZ2RiX2xpc3RmaWxlcywKCQkgICAgIE5VTEwpOwogIFRj
bF9DcmVhdGVDb21tYW5kIChpbnRlcnAsICJnZGJfc3RvcCIsIGNhbGxfd3JhcHBlciwgZ2Ri
X3N0b3AsIE5VTEwpOwogIFRjbF9DcmVhdGVDb21tYW5kIChpbnRlcnAsICJnZGJfcmVnbmFt
ZXMiLCBjYWxsX3dyYXBwZXIsIGdkYl9yZWduYW1lcywgTlVMTCk7CiAgVGNsX0NyZWF0ZUNv
bW1hbmQgKGludGVycCwgImdkYl9mZXRjaF9yZWdpc3RlcnMiLCBjYWxsX3dyYXBwZXIsCgkJ
ICAgICBnZGJfZmV0Y2hfcmVnaXN0ZXJzLCBOVUxMKTsKICBUY2xfQ3JlYXRlQ29tbWFuZCAo
aW50ZXJwLCAiZ2RiX2NoYW5nZWRfcmVnaXN0ZXJfbGlzdCIsIGNhbGxfd3JhcHBlciwKCQkg
ICAgIGdkYl9jaGFuZ2VkX3JlZ2lzdGVyX2xpc3QsIE5VTEwpOwogIFRjbF9DcmVhdGVDb21t
YW5kIChpbnRlcnAsICJnZGJfZGlzYXNzZW1ibGUiLCBjYWxsX3dyYXBwZXIsCgkJICAgICBn
ZGJfZGlzYXNzZW1ibGUsIE5VTEwpOwogIFRjbF9DcmVhdGVDb21tYW5kIChpbnRlcnAsICJn
ZGJfZXZhbCIsIGNhbGxfd3JhcHBlciwgZ2RiX2V2YWwsIE5VTEwpOwogIFRjbF9DcmVhdGVD
b21tYW5kIChpbnRlcnAsICJnZGJfZ2V0X2JyZWFrcG9pbnRfbGlzdCIsIGNhbGxfd3JhcHBl
ciwKCQkgICAgIGdkYl9nZXRfYnJlYWtwb2ludF9saXN0LCBOVUxMKTsKICBUY2xfQ3JlYXRl
Q29tbWFuZCAoaW50ZXJwLCAiZ2RiX2dldF9icmVha3BvaW50X2luZm8iLCBjYWxsX3dyYXBw
ZXIsCgkJICAgICBnZGJfZ2V0X2JyZWFrcG9pbnRfaW5mbywgTlVMTCk7CgogIGNvbW1hbmRf
bG9vcF9ob29rID0gdGtfY29tbWFuZF9sb29wOwogIHByaW50X2ZyYW1lX2luZm9fbGlzdGlu
Z19ob29rID0KICAgICh2b2lkICgqKSBQQVJBTVMgKChzdHJ1Y3Qgc3ltdGFiICosIGludCwg
aW50LCBpbnQpKSkgbnVsbF9yb3V0aW5lOwogIHF1ZXJ5X2hvb2sgPSBnZGJ0a19xdWVyeTsK
ICBmbHVzaF9ob29rID0gZ2RidGtfZmx1c2g7CiAgY3JlYXRlX2JyZWFrcG9pbnRfaG9vayA9
IGdkYnRrX2NyZWF0ZV9icmVha3BvaW50OwogIGRlbGV0ZV9icmVha3BvaW50X2hvb2sgPSBn
ZGJ0a19kZWxldGVfYnJlYWtwb2ludDsKICBtb2RpZnlfYnJlYWtwb2ludF9ob29rID0gZ2Ri
dGtfbW9kaWZ5X2JyZWFrcG9pbnQ7CiAgaW50ZXJhY3RpdmVfaG9vayA9IGdkYnRrX2ludGVy
YWN0aXZlOwogIHRhcmdldF93YWl0X2hvb2sgPSBnZGJ0a193YWl0OwogIGNhbGxfY29tbWFu
ZF9ob29rID0gZ2RidGtfY2FsbF9jb21tYW5kOwogIHJlYWRsaW5lX2JlZ2luX2hvb2sgPSBn
ZGJ0a19yZWFkbGluZV9iZWdpbjsKICByZWFkbGluZV9ob29rID0gZ2RidGtfcmVhZGxpbmU7
CiAgcmVhZGxpbmVfZW5kX2hvb2sgPSBnZGJ0a19yZWFkbGluZV9lbmQ7CgogIC8qIEdldCB0
aGUgZmlsZSBkZXNjcmlwdG9yIGZvciB0aGUgWCBzZXJ2ZXIgKi8KCiAgeF9mZCA9IENvbm5l
Y3Rpb25OdW1iZXIgKFRrX0Rpc3BsYXkgKFRrX01haW5XaW5kb3cgKGludGVycCkpKTsKCiAg
LyogU2V0dXAgZm9yIEkvTyBpbnRlcnJ1cHRzICovCgogIGFjdGlvbi5zYV9tYXNrID0gbnVs
bHNpZ21hc2s7CiAgYWN0aW9uLnNhX2ZsYWdzID0gMDsKICBhY3Rpb24uc2FfaGFuZGxlciA9
IFNJR19JR047CiNpZm5kZWYgV0lOTlQKICBzaWdhY3Rpb24oU0lHSU8sICZhY3Rpb24sIE5V
TEwpOwojZW5kaWYKCiNpZmRlZiBGSU9BU1lOQwogIGkgPSAxOwogIGlmIChpb2N0bCAoeF9m
ZCwgRklPQVNZTkMsICZpKSkKICAgIHBlcnJvcl93aXRoX25hbWUgKCJnZGJ0a19pbml0OiBp
b2N0bCBGSU9BU1lOQyBmYWlsZWQiKTsKCiNpZmRlZiBTSU9DU1BHUlAKICBpID0gZ2V0cGlk
KCk7CiAgaWYgKGlvY3RsICh4X2ZkLCBTSU9DU1BHUlAsICZpKSkKICAgIHBlcnJvcl93aXRo
X25hbWUgKCJnZGJ0a19pbml0OiBpb2N0bCBTSU9DU1BHUlAgZmFpbGVkIik7CgojZWxzZQoj
aWZkZWYgRl9TRVRPV04KICBpID0gZ2V0cGlkKCk7CiAgaWYgKGZjbnRsICh4X2ZkLCBGX1NF
VE9XTiwgaSkpCiAgICBwZXJyb3Jfd2l0aF9uYW1lICgiZ2RidGtfaW5pdDogZmNudGwgRl9T
RVRPV04gZmFpbGVkIik7CiNlbmRpZgkvKiBGX1NFVE9XTiAqLwojZW5kaWYJLyogIVNJT0NT
UEdSUCAqLwojZWxzZQojaWZuZGVmIFdJTk5UCiAgaWYgKGlvY3RsICh4X2ZkLCAgSV9TRVRT
SUcsIFNfSU5QVVR8U19SRE5PUk0pIDwgMCkKICAgIHBlcnJvcl93aXRoX25hbWUgKCJnZGJ0
a19pbml0OiBpb2N0bCBJX1NFVFNJRyBmYWlsZWQiKTsKI2VuZGlmCgojZW5kaWYgLyogaWZu
ZGVmIEZJT0FTWU5DICovCgogIGFkZF9jb20gKCJ0ayIsIGNsYXNzX29ic2N1cmUsIHRrX2Nv
bW1hbmQsCgkgICAiU2VuZCBhIGNvbW1hbmQgZGlyZWN0bHkgaW50byB0ay4iKTsKCiAgVGNs
X0xpbmtWYXIgKGludGVycCwgImRpc2Fzc2VtYmxlLWZyb20tZXhlYyIsIChjaGFyICopJmRp
c2Fzc2VtYmxlX2Zyb21fZXhlYywKCSAgICAgICBUQ0xfTElOS19JTlQpOwoKICAvKiBmaW5k
IHRoZSBnZGIgdGNsIGxpYnJhcnkgYW5kIHNvdXJjZSBtYWluLnRjbCAqLwoKICBnZGJ0a19s
aWIgPSBnZXRlbnYgKCJHREJUS19MSUJSQVJZIik7CiAgaWYgKCFnZGJ0a19saWIpCiAgICBp
ZiAoYWNjZXNzICgiZ2RidGNsL21haW4udGNsIiwgUl9PSykgPT0gMCkKICAgICAgZ2RidGtf
bGliID0gImdkYnRjbCI7CiAgICBlbHNlCiAgICAgIGdkYnRrX2xpYiA9IEdEQlRLX0xJQlJB
Ulk7CgogIHN0cmNweSAoZ2RidGtfbGliX3RtcCwgZ2RidGtfbGliKTsKICBmb3VuZF9tYWlu
ID0gMDsKICAvKiBzZWUgaWYgR0RCVEtfTElCUkFSWSBpcyBhIHBhdGggbGlzdCAqLwogIGxp
YiA9IHN0cnRvayAoZ2RidGtfbGliX3RtcCwgR0RCVEtfUEFUSF9TRVApOwogIGRvCiAgICB7
CiAgICAgIGlmIChUY2xfVmFyRXZhbCAoaW50ZXJwLCAibGFwcGVuZCBhdXRvX3BhdGggIiwg
bGliLCBOVUxMKSAhPSBUQ0xfT0spCgl7CgkgIGZwdXRzX3VuZmlsdGVyZWQgKFRjbF9HZXRW
YXIgKGludGVycCwgImVycm9ySW5mbyIsIDApLCBnZGJfc3RkZXJyKTsKCSAgZXJyb3IgKCIi
KTsKCX0KICAgICAgaWYgKCFmb3VuZF9tYWluKQoJewoJICBzdHJjcHkgKGdkYnRrX2ZpbGUs
IGxpYik7CgkgIHN0cmNhdCAoZ2RidGtfZmlsZSwgIi9tYWluLnRjbCIpOwoJICBpZiAoYWNj
ZXNzIChnZGJ0a19maWxlLCBSX09LKSA9PSAwKQoJICAgIHsKCSAgICAgIGZvdW5kX21haW4r
KzsKCSAgICAgIFRjbF9TZXRWYXIgKGludGVycCwgIkdEQlRLX0xJQlJBUlkiLCBsaWIsIDAp
OwoJICAgIH0KCX0KICAgICB9IAogIHdoaWxlIChsaWIgPSBzdHJ0b2sgKE5VTEwsICI6Iikp
OwogIAogIGlmICghZm91bmRfbWFpbikKICAgIHsKICAgICAgZnB1dHNfdW5maWx0ZXJlZF9o
b29rID0gTlVMTDsgLyogRm9yY2UgZXJyb3JzIHRvIHN0ZG91dC9zdGRlcnIgKi8KICAgICAg
aWYgKGdldGVudigiR0RCVEtfTElCUkFSWSIpKQoJewoJICBmcHJpbnRmX3VuZmlsdGVyZWQg
KHN0ZGVyciwgIlVuYWJsZSB0byBmaW5kIG1haW4udGNsIGluICVzXG4iLGdldGVudigiR0RC
VEtfTElCUkFSWSIpKTsKCSAgZnByaW50Zl91bmZpbHRlcmVkIChzdGRlcnIsIAoJCQkgICAg
ICAiUGxlYXNlIHNldCBHREJUS19MSUJSQVJZIHRvIGEgcGF0aCB0aGF0IGluY2x1ZGVzIHRo
ZSBHREIgdGNsIGZpbGVzLlxuIik7Cgl9CiAgICAgIGVsc2UKCXsKCSAgZnByaW50Zl91bmZp
bHRlcmVkIChzdGRlcnIsICJVbmFibGUgdG8gZmluZCBtYWluLnRjbCBpbiAlc1xuIiwgR0RC
VEtfTElCUkFSWSk7CgkgIGZwcmludGZfdW5maWx0ZXJlZCAoc3RkZXJyLCAiWW91IG1pZ2h0
IHdhbnQgdG8gc2V0IEdEQlRLX0xJQlJBUllcbiIpOwkgIAoJfQogICAgICBlcnJvcigiIik7
CiAgICB9CgovKiBEZWZlciBzZXR1cCBvZiBmcHV0c191bmZpbHRlcmVkX2hvb2sgdG8gbmVh
ciB0aGUgZW5kIHNvIHRoYXQgZXJyb3IgbWVzc2FnZXMKICAgcHJpb3IgdG8gdGhpcyBwb2lu
dCBnbyB0byBzdGRvdXQvc3RkZXJyLiAgKi8KCiAgZnB1dHNfdW5maWx0ZXJlZF9ob29rID0g
Z2RidGtfZnB1dHM7CgogIGlmIChUY2xfRXZhbEZpbGUgKGludGVycCwgZ2RidGtfZmlsZSkg
IT0gVENMX09LKQogICAgewogICAgICBmcHV0c191bmZpbHRlcmVkX2hvb2sgPSBOVUxMOyAv
KiBGb3JjZSBlcnJvcnMgdG8gc3Rkb3V0L3N0ZGVyciAqLwoKICAgICAgZnByaW50Zl91bmZp
bHRlcmVkIChzdGRlcnIsICIlczolZDogJXNcbiIsIGdkYnRrX2ZpbGUsCgkJCSAgaW50ZXJw
LT5lcnJvckxpbmUsIGludGVycC0+cmVzdWx0KTsKCiAgICAgIGZwdXRzX3VuZmlsdGVyZWQg
KCJTdGFjayB0cmFjZTpcbiIsIGdkYl9zdGRlcnIpOwogICAgICBmcHV0c191bmZpbHRlcmVk
IChUY2xfR2V0VmFyIChpbnRlcnAsICJlcnJvckluZm8iLCAwKSwgZ2RiX3N0ZGVycik7CiAg
ICAgIGVycm9yICgiIik7CiAgICB9CgogIGRpc2NhcmRfY2xlYW51cHMgKG9sZF9jaGFpbik7
Cn0KCi8qIENvbWUgaGVyZSBkdXJpbmcgaW5pdGlhbGl6ZV9hbGxfZmlsZXMgKCkgKi8KCnZv
aWQKX2luaXRpYWxpemVfZ2RidGsgKCkKewogIGlmICh1c2Vfd2luZG93cykKICAgIHsKICAg
ICAgLyogVGVsbCB0aGUgcmVzdCBvZiB0aGUgd29ybGQgdGhhdCBHZGJ0ayBpcyBub3cgc2V0
IHVwLiAqLwoKICAgICAgaW5pdF91aV9ob29rID0gZ2RidGtfaW5pdDsKICAgIH0KfQo=
--------------5AAB448694FE76ACD5311E42
Content-Type: text/plain; charset=us-ascii; name="gdbtk.diff"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline; filename="gdbtk.diff"

*** gdbtk.c	Mon May 19 19:34:53 1997
--- gdbtk.c.orig	Mon May 19 19:22:58 1997
***************
*** 129,135 ****
  
  static char *Gdbtk_Library;
  
- #ifndef WINNT
  /* Supply malloc calls for tcl/tk.  */
  
  char *
--- 129,134 ----
***************
*** 154,161 ****
    free (ptr);
  }
  
- #endif
- 
  static void
  null_routine(arg)
       int arg;
--- 153,158 ----
***************
*** 227,239 ****
    merge[1] = buf;
    command = Tcl_Merge (2, merge);
    Tcl_Eval (interp, command);
- 
- #ifndef WINNT
    free (command);
- #else
-   Tcl_Free (command);
- #endif
- 
  
    val = atol (interp->result);
    return val;
--- 224,230 ----
***************
*** 265,275 ****
    merge[1] = buf;
    command = Tcl_Merge (2, merge);
    Tcl_Eval (interp, command);
- #ifndef WINNT
    free (command);
- #else
-   Tcl_Free (command);
- #endif
  }
  
  static char *
--- 256,262 ----
***************
*** 284,296 ****
    merge[1] = prompt;
    command = Tcl_Merge (2, merge);
    result = Tcl_Eval (interp, command);
- 
- #ifndef WINNT
    free (command);
- #else
-   Tcl_Free (command);
- #endif
- 
    if (result == TCL_OK)
      {
        return (strdup (interp -> result));
--- 271,277 ----

--------------5AAB448694FE76ACD5311E42
Content-Type: application/x-unknown-content-type-c_auto_file; name="infcmd.c"
Content-Transfer-Encoding: base64
Content-Disposition: inline; filename="infcmd.c"

LyogTWVtb3J5LWFjY2VzcyBhbmQgY29tbWFuZHMgZm9yICJpbmZlcmlvciIgcHJvY2Vzcywg
Zm9yIEdEQi4KICAgQ29weXJpZ2h0IDE5ODYsIDE5ODcsIDE5ODgsIDE5ODksIDE5OTEsIDE5
OTIsIDE5OTUsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCgpUaGlzIGZp
bGUgaXMgcGFydCBvZiBHREIuCgpUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91
IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQppdCB1bmRlciB0aGUgdGVybXMg
b2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQp0aGUg
RnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNl
bnNlLCBvcgooYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKVGhpcyBwcm9n
cmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWws
CmJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdh
cnJhbnR5IG9mCk1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIg
UFVSUE9TRS4gIFNlZSB0aGUKR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUg
ZGV0YWlscy4KCllvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBH
ZW5lcmFsIFB1YmxpYyBMaWNlbnNlCmFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3Qs
IHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCkZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBs
ZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwoK
I2luY2x1ZGUgImRlZnMuaCIKI2luY2x1ZGUgPHNpZ25hbC5oPgojaW5jbHVkZSAiZ2RiX3N0
cmluZy5oIgojaW5jbHVkZSAic3ltdGFiLmgiCiNpbmNsdWRlICJnZGJ0eXBlcy5oIgojaW5j
bHVkZSAiZnJhbWUuaCIKI2luY2x1ZGUgImluZmVyaW9yLmgiCiNpbmNsdWRlICJlbnZpcm9u
LmgiCiNpbmNsdWRlICJ2YWx1ZS5oIgojaW5jbHVkZSAiZ2RiY21kLmgiCiNpbmNsdWRlICJn
ZGJjb3JlLmgiCiNpbmNsdWRlICJ0YXJnZXQuaCIKI2luY2x1ZGUgImxhbmd1YWdlLmgiCiNp
bmNsdWRlICJzeW1maWxlLmgiCgpzdGF0aWMgdm9pZCBjb250aW51ZV9jb21tYW5kIFBBUkFN
UyAoKGNoYXIgKiwgaW50KSk7CgpzdGF0aWMgdm9pZCB1bnRpbF9uZXh0X2NvbW1hbmQgUEFS
QU1TICgoaW50KSk7CgpzdGF0aWMgdm9pZCB1bnRpbF9jb21tYW5kIFBBUkFNUyAoKGNoYXIg
KiwgaW50KSk7CgpzdGF0aWMgdm9pZCBwYXRoX2luZm8gUEFSQU1TICgoY2hhciAqLCBpbnQp
KTsKCnN0YXRpYyB2b2lkIHBhdGhfY29tbWFuZCBQQVJBTVMgKChjaGFyICosIGludCkpOwoK
c3RhdGljIHZvaWQgdW5zZXRfY29tbWFuZCBQQVJBTVMgKChjaGFyICosIGludCkpOwoKc3Rh
dGljIHZvaWQgZmxvYXRfaW5mbyBQQVJBTVMgKChjaGFyICosIGludCkpOwoKc3RhdGljIHZv
aWQgZGV0YWNoX2NvbW1hbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKCnN0YXRpYyB2b2lk
IG5vZnBfcmVnaXN0ZXJzX2luZm8gUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKCnN0YXRpYyB2
b2lkIGFsbF9yZWdpc3RlcnNfaW5mbyBQQVJBTVMgKChjaGFyICosIGludCkpOwoKc3RhdGlj
IHZvaWQgcmVnaXN0ZXJzX2luZm8gUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKCiNpZiAhZGVm
aW5lZCAoRE9fUkVHSVNURVJTX0lORk8pCnN0YXRpYyB2b2lkIGRvX3JlZ2lzdGVyc19pbmZv
IFBBUkFNUyAoKGludCwgaW50KSk7CiNlbmRpZgoKc3RhdGljIHZvaWQgdW5zZXRfZW52aXJv
bm1lbnRfY29tbWFuZCBQQVJBTVMgKChjaGFyICosIGludCkpOwoKc3RhdGljIHZvaWQgc2V0
X2Vudmlyb25tZW50X2NvbW1hbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKCnN0YXRpYyB2
b2lkIGVudmlyb25tZW50X2luZm8gUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKCnN0YXRpYyB2
b2lkIHByb2dyYW1faW5mbyBQQVJBTVMgKChjaGFyICosIGludCkpOwoKc3RhdGljIHZvaWQg
ZmluaXNoX2NvbW1hbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKCnN0YXRpYyB2b2lkIHNp
Z25hbF9jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CgpzdGF0aWMgdm9pZCBqdW1w
X2NvbW1hbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKCnN0YXRpYyB2b2lkIHN0ZXBfMSBQ
QVJBTVMgKChpbnQsIGludCwgY2hhciAqKSk7CgpzdGF0aWMgdm9pZCBuZXh0aV9jb21tYW5k
IFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CgpzdGF0aWMgdm9pZCBzdGVwaV9jb21tYW5kIFBB
UkFNUyAoKGNoYXIgKiwgaW50KSk7CgpzdGF0aWMgdm9pZCBuZXh0X2NvbW1hbmQgUEFSQU1T
ICgoY2hhciAqLCBpbnQpKTsKCnN0YXRpYyB2b2lkIHN0ZXBfY29tbWFuZCBQQVJBTVMgKChj
aGFyICosIGludCkpOwoKc3RhdGljIHZvaWQgcnVuX2NvbW1hbmQgUEFSQU1TICgoY2hhciAq
LCBpbnQpKTsKCiNpZmRlZiBDQUxMX0RVTU1ZX0JSRUFLUE9JTlRfT0ZGU0VUCnN0YXRpYyB2
b2lkIGJyZWFrcG9pbnRfYXV0b19kZWxldGVfY29udGVudHMgUEFSQU1TICgoUFRSKSk7CiNl
bmRpZgoKI2RlZmluZSBFUlJPUl9OT19JTkZFUklPUiBcCiAgIGlmICghdGFyZ2V0X2hhc19l
eGVjdXRpb24pIGVycm9yICgiVGhlIHByb2dyYW0gaXMgbm90IGJlaW5nIHJ1bi4iKTsKCi8q
IFN0cmluZyBjb250YWluaW5nIGFyZ3VtZW50cyB0byBnaXZlIHRvIHRoZSBwcm9ncmFtLCBz
ZXBhcmF0ZWQgYnkgc3BhY2VzLgogICBFbXB0eSBzdHJpbmcgKHBvaW50ZXIgdG8gJ1wwJykg
bWVhbnMgbm8gYXJncy4gICovCgpzdGF0aWMgY2hhciAqaW5mZXJpb3JfYXJnczsKCi8qIEZp
bGUgbmFtZSBmb3IgZGVmYXVsdCB1c2UgZm9yIHN0YW5kYXJkIGluL291dCBpbiB0aGUgaW5m
ZXJpb3IuICAqLwoKY2hhciAqaW5mZXJpb3JfaW9fdGVybWluYWw7CgovKiBQaWQgb2Ygb3Vy
IGRlYnVnZ2VkIGluZmVyaW9yLCBvciAwIGlmIG5vIGluZmVyaW9yIG5vdy4KICAgU2luY2Ug
dmFyaW91cyBwYXJ0cyBvZiBpbmZydW4uYyB0ZXN0IHRoaXMgdG8gc2VlIHdoZXRoZXIgdGhl
cmUgaXMgYSBwcm9ncmFtCiAgIGJlaW5nIGRlYnVnZ2VkIGl0IHNob3VsZCBiZSBub256ZXJv
IChjdXJyZW50bHkgMyBpcyB1c2VkKSBmb3IgcmVtb3RlCiAgIGRlYnVnZ2luZy4gICovCgpp
bnQgaW5mZXJpb3JfcGlkOwoKLyogTGFzdCBzaWduYWwgdGhhdCB0aGUgaW5mZXJpb3IgcmVj
ZWl2ZWQgKHdoeSBpdCBzdG9wcGVkKS4gICovCgplbnVtIHRhcmdldF9zaWduYWwgc3RvcF9z
aWduYWw7CgovKiBBZGRyZXNzIGF0IHdoaWNoIGluZmVyaW9yIHN0b3BwZWQuICAqLwoKQ09S
RV9BRERSIHN0b3BfcGM7CgovKiBDaGFpbiBjb250YWluaW5nIHN0YXR1cyBvZiBicmVha3Bv
aW50KHMpIHRoYXQgd2UgaGF2ZSBzdG9wcGVkIGF0LiAgKi8KCmJwc3RhdCBzdG9wX2Jwc3Rh
dDsKCi8qIEZsYWcgaW5kaWNhdGluZyB0aGF0IGEgY29tbWFuZCBoYXMgcHJvY2VlZGVkIHRo
ZSBpbmZlcmlvciBwYXN0IHRoZQogICBjdXJyZW50IGJyZWFrcG9pbnQuICAqLwoKaW50IGJy
ZWFrcG9pbnRfcHJvY2VlZGVkOwoKLyogTm9uemVybyBpZiBzdG9wcGVkIGR1ZSB0byBhIHN0
ZXAgY29tbWFuZC4gICovCgppbnQgc3RvcF9zdGVwOwoKLyogTm9uemVybyBpZiBzdG9wcGVk
IGR1ZSB0byBjb21wbGV0aW9uIG9mIGEgc3RhY2sgZHVtbXkgcm91dGluZS4gICovCgppbnQg
c3RvcF9zdGFja19kdW1teTsKCi8qIE5vbnplcm8gaWYgc3RvcHBlZCBkdWUgdG8gYSByYW5k
b20gKHVuZXhwZWN0ZWQpIHNpZ25hbCBpbiBpbmZlcmlvcgogICBwcm9jZXNzLiAgKi8KCmlu
dCBzdG9wcGVkX2J5X3JhbmRvbV9zaWduYWw7CgovKiBSYW5nZSB0byBzaW5nbGUgc3RlcCB3
aXRoaW4uCiAgIElmIHRoaXMgaXMgbm9uemVybywgcmVzcG9uZCB0byBhIHNpbmdsZS1zdGVw
IHNpZ25hbAogICBieSBjb250aW51aW5nIHRvIHN0ZXAgaWYgdGhlIHBjIGlzIGluIHRoaXMg
cmFuZ2UuICAqLwoKQ09SRV9BRERSIHN0ZXBfcmFuZ2Vfc3RhcnQ7IC8qIEluY2x1c2l2ZSAq
LwpDT1JFX0FERFIgc3RlcF9yYW5nZV9lbmQ7IC8qIEV4Y2x1c2l2ZSAqLwoKLyogU3RhY2sg
ZnJhbWUgYWRkcmVzcyBhcyBvZiB3aGVuIHN0ZXBwaW5nIGNvbW1hbmQgd2FzIGlzc3VlZC4K
ICAgVGhpcyBpcyBob3cgd2Uga25vdyB3aGVuIHdlIHN0ZXAgaW50byBhIHN1YnJvdXRpbmUg
Y2FsbCwKICAgYW5kIGhvdyB0byBzZXQgdGhlIGZyYW1lIGZvciB0aGUgYnJlYWtwb2ludCB1
c2VkIHRvIHN0ZXAgb3V0LiAgKi8KCkNPUkVfQUREUiBzdGVwX2ZyYW1lX2FkZHJlc3M7Cgov
KiBPdXIgbm90aW9uIG9mIHRoZSBjdXJyZW50IHN0YWNrIHBvaW50ZXIuICAqLwoKQ09SRV9B
RERSIHN0ZXBfc3A7CgovKiAxIG1lYW5zIHN0ZXAgb3ZlciBhbGwgc3Vicm91dGluZSBjYWxs
cy4KICAgMCBtZWFucyBkb24ndCBzdGVwIG92ZXIgY2FsbHMgKHVzZWQgYnkgc3RlcGkpLgog
ICAtMSBtZWFucyBzdGVwIG92ZXIgY2FsbHMgdG8gdW5kZWJ1Z2dhYmxlIGZ1bmN0aW9ucy4g
ICovCgppbnQgc3RlcF9vdmVyX2NhbGxzOwoKLyogSWYgc3RlcHBpbmcsIG5vbnplcm8gbWVh
bnMgc3RlcCBjb3VudCBpcyA+IDEKICAgc28gZG9uJ3QgcHJpbnQgZnJhbWUgbmV4dCB0aW1l
IGluZmVyaW9yIHN0b3BzCiAgIGlmIGl0IHN0b3BzIGR1ZSB0byBzdGVwcGluZy4gICovCgpp
bnQgc3RlcF9tdWx0aTsKCi8qIEVudmlyb25tZW50IHRvIHVzZSBmb3IgcnVubmluZyBpbmZl
cmlvciwKICAgaW4gZm9ybWF0IGRlc2NyaWJlZCBpbiBlbnZpcm9uLmguICAqLwoKc3RydWN0
IGVudmlyb24gKmluZmVyaW9yX2Vudmlyb247CgoMCi8qIEFSR1NVU0VEICovCnZvaWQKdHR5
X2NvbW1hbmQgKGZpbGUsIGZyb21fdHR5KQogICAgIGNoYXIgKmZpbGU7CiAgICAgaW50IGZy
b21fdHR5Owp7CiAgaWYgKGZpbGUgPT0gMCkKICAgIGVycm9yX25vX2FyZyAoInRlcm1pbmFs
IG5hbWUgZm9yIHJ1bm5pbmcgdGFyZ2V0IHByb2Nlc3MiKTsKCiAgaW5mZXJpb3JfaW9fdGVy
bWluYWwgPSBzYXZlc3RyaW5nIChmaWxlLCBzdHJsZW4gKGZpbGUpKTsKfQoKc3RhdGljIHZv
aWQKcnVuX2NvbW1hbmQgKGFyZ3MsIGZyb21fdHR5KQogICAgIGNoYXIgKmFyZ3M7CiAgICAg
aW50IGZyb21fdHR5Owp7CiAgY2hhciAqZXhlY19maWxlOwoKICBkb250X3JlcGVhdCAoKTsK
CiAgaWYgKGluZmVyaW9yX3BpZCAhPSAwICYmIHRhcmdldF9oYXNfZXhlY3V0aW9uKQogICAg
ewogICAgICBpZiAoCgkgICFxdWVyeSAoIlRoZSBwcm9ncmFtIGJlaW5nIGRlYnVnZ2VkIGhh
cyBiZWVuIHN0YXJ0ZWQgYWxyZWFkeS5cblwKU3RhcnQgaXQgZnJvbSB0aGUgYmVnaW5uaW5n
PyAiKSkKCWVycm9yICgiUHJvZ3JhbSBub3QgcmVzdGFydGVkLiIpOwogICAgICB0YXJnZXRf
a2lsbCAoKTsKICAgIH0KCiAgY2xlYXJfYnJlYWtwb2ludF9oaXRfY291bnRzICgpOwoKICBl
eGVjX2ZpbGUgPSAoY2hhciAqKSBnZXRfZXhlY19maWxlICgwKTsKCiAgLyogVGhlIGV4ZWMg
ZmlsZSBpcyByZS1yZWFkIGV2ZXJ5IHRpbWUgd2UgZG8gYSBnZW5lcmljX21vdXJuX2luZmVy
aW9yLCBzbwogICAgIHdlIGp1c3QgaGF2ZSB0byB3b3JyeSBhYm91dCB0aGUgc3ltYm9sIGZp
bGUuICAqLwogIHJlcmVhZF9zeW1ib2xzICgpOwoKICAvKiBXZSBrZWVwIHN5bWJvbHMgZnJv
bSBhZGQtc3ltYm9sLWZpbGUsIG9uIHRoZSBncm91bmRzIHRoYXQgdGhlCiAgICAgdXNlciBt
aWdodCB3YW50IHRvIGFkZCBzb21lIHN5bWJvbHMgYmVmb3JlIHJ1bm5pbmcgdGhlIHByb2dy
YW0KICAgICAocmlnaHQ/KS4gIEJ1dCBzb21ldGltZXMgKGR5bmFtaWMgbG9hZGluZyB3aGVy
ZSB0aGUgdXNlciBtYW51YWxseQogICAgIGludHJvZHVjZXMgdGhlIG5ldyBzeW1ib2xzIHdp
dGggYWRkLXN5bWJvbC1maWxlKSwgdGhlIGNvZGUgd2hpY2gKICAgICB0aGUgc3ltYm9scyBk
ZXNjcmliZSBkb2VzIG5vdCBwZXJzaXN0IGJldHdlZW4gcnVucy4gIEN1cnJlbnRseQogICAg
IHRoZSB1c2VyIGhhcyB0byBtYW51YWxseSBudWtlIGFsbCBzeW1ib2xzIGJldHdlZW4gcnVu
cyBpZiB0aGV5CiAgICAgd2FudCB0aGVtIHRvIGdvIGF3YXkgKFBSIDIyMDcpLiAgVGhpcyBp
cyBwcm9iYWJseSByZWFzb25hYmxlLiAgKi8KCiAgaWYgKGFyZ3MpCiAgICB7CiAgICAgIGNo
YXIgKmNtZDsKICAgICAgY21kID0gY29uY2F0ICgic2V0IGFyZ3MgIiwgYXJncywgTlVMTCk7
CiAgICAgIG1ha2VfY2xlYW51cCAoZnJlZSwgY21kKTsKICAgICAgZXhlY3V0ZV9jb21tYW5k
IChjbWQsIGZyb21fdHR5KTsKICAgIH0KCiAgaWYgKGZyb21fdHR5KQogICAgewogICAgICBw
dXRzX2ZpbHRlcmVkKCJTdGFydGluZyBwcm9ncmFtOiAiKTsKICAgICAgaWYgKGV4ZWNfZmls
ZSkKCXB1dHNfZmlsdGVyZWQoZXhlY19maWxlKTsKICAgICAgcHV0c19maWx0ZXJlZCgiICIp
OwogICAgICBwdXRzX2ZpbHRlcmVkKGluZmVyaW9yX2FyZ3MpOwogICAgICBwdXRzX2ZpbHRl
cmVkKCJcbiIpOwogICAgICBnZGJfZmx1c2ggKGdkYl9zdGRvdXQpOwogICAgfQoKICB0YXJn
ZXRfY3JlYXRlX2luZmVyaW9yIChleGVjX2ZpbGUsIGluZmVyaW9yX2FyZ3MsCgkJCSAgZW52
aXJvbl92ZWN0b3IgKGluZmVyaW9yX2Vudmlyb24pKTsKfQoMCnN0YXRpYyB2b2lkCmNvbnRp
bnVlX2NvbW1hbmQgKHByb2NfY291bnRfZXhwLCBmcm9tX3R0eSkKICAgICBjaGFyICpwcm9j
X2NvdW50X2V4cDsKICAgICBpbnQgZnJvbV90dHk7CnsKICBFUlJPUl9OT19JTkZFUklPUjsK
CiAgLyogSWYgaGF2ZSBhcmd1bWVudCwgc2V0IHByb2NlZWQgY291bnQgb2YgYnJlYWtwb2lu
dCB3ZSBzdG9wcGVkIGF0LiAgKi8KCiAgaWYgKHByb2NfY291bnRfZXhwICE9IE5VTEwpCiAg
ICB7CiAgICAgIGJwc3RhdCBicyA9IHN0b3BfYnBzdGF0OwogICAgICBpbnQgbnVtID0gYnBz
dGF0X251bSAoJmJzKTsKICAgICAgaWYgKG51bSA9PSAwICYmIGZyb21fdHR5KQoJewoJICBw
cmludGZfZmlsdGVyZWQKCSAgICAoIk5vdCBzdG9wcGVkIGF0IGFueSBicmVha3BvaW50OyBh
cmd1bWVudCBpZ25vcmVkLlxuIik7Cgl9CiAgICAgIHdoaWxlIChudW0gIT0gMCkKCXsKCSAg
c2V0X2lnbm9yZV9jb3VudCAobnVtLAoJCQkgICAgcGFyc2VfYW5kX2V2YWxfYWRkcmVzcyAo
cHJvY19jb3VudF9leHApIC0gMSwKCQkJICAgIGZyb21fdHR5KTsKCSAgLyogc2V0X2lnbm9y
ZV9jb3VudCBwcmludHMgYSBtZXNzYWdlIGVuZGluZyB3aXRoIGEgcGVyaW9kLgoJICAgICBT
byBwcmludCB0d28gc3BhY2VzIGJlZm9yZSAiQ29udGludWluZy4iLiAgKi8KCSAgaWYgKGZy
b21fdHR5KQoJICAgIHByaW50Zl9maWx0ZXJlZCAoIiAgIik7CgkgIG51bSA9IGJwc3RhdF9u
dW0gKCZicyk7Cgl9CiAgICB9CgogIGlmIChmcm9tX3R0eSkKICAgIHByaW50Zl9maWx0ZXJl
ZCAoIkNvbnRpbnVpbmcuXG4iKTsKCiAgY2xlYXJfcHJvY2VlZF9zdGF0dXMgKCk7CgogIHBy
b2NlZWQgKChDT1JFX0FERFIpIC0xLCBUQVJHRVRfU0lHTkFMX0RFRkFVTFQsIDApOwp9CgwK
LyogU3RlcCB1bnRpbCBvdXRzaWRlIG9mIGN1cnJlbnQgc3RhdGVtZW50LiAgKi8KCi8qIEFS
R1NVU0VEICovCnN0YXRpYyB2b2lkCnN0ZXBfY29tbWFuZCAoY291bnRfc3RyaW5nLCBmcm9t
X3R0eSkKICAgICBjaGFyICpjb3VudF9zdHJpbmc7CiAgICAgaW50IGZyb21fdHR5Owp7CiAg
c3RlcF8xICgwLCAwLCBjb3VudF9zdHJpbmcpOwp9CgovKiBMaWtld2lzZSwgYnV0IHNraXAg
b3ZlciBzdWJyb3V0aW5lIGNhbGxzIGFzIGlmIHNpbmdsZSBpbnN0cnVjdGlvbnMuICAqLwoK
LyogQVJHU1VTRUQgKi8Kc3RhdGljIHZvaWQKbmV4dF9jb21tYW5kIChjb3VudF9zdHJpbmcs
IGZyb21fdHR5KQogICAgIGNoYXIgKmNvdW50X3N0cmluZzsKICAgICBpbnQgZnJvbV90dHk7
CnsKICBzdGVwXzEgKDEsIDAsIGNvdW50X3N0cmluZyk7Cn0KCi8qIExpa2V3aXNlLCBidXQg
c3RlcCBvbmx5IG9uZSBpbnN0cnVjdGlvbi4gICovCgovKiBBUkdTVVNFRCAqLwpzdGF0aWMg
dm9pZApzdGVwaV9jb21tYW5kIChjb3VudF9zdHJpbmcsIGZyb21fdHR5KQogICAgIGNoYXIg
KmNvdW50X3N0cmluZzsKICAgICBpbnQgZnJvbV90dHk7CnsKICBzdGVwXzEgKDAsIDEsIGNv
dW50X3N0cmluZyk7Cn0KCi8qIEFSR1NVU0VEICovCnN0YXRpYyB2b2lkCm5leHRpX2NvbW1h
bmQgKGNvdW50X3N0cmluZywgZnJvbV90dHkpCiAgICAgY2hhciAqY291bnRfc3RyaW5nOwog
ICAgIGludCBmcm9tX3R0eTsKewogIHN0ZXBfMSAoMSwgMSwgY291bnRfc3RyaW5nKTsKfQoK
c3RhdGljIHZvaWQKc3RlcF8xIChza2lwX3N1YnJvdXRpbmVzLCBzaW5nbGVfaW5zdCwgY291
bnRfc3RyaW5nKQogICAgIGludCBza2lwX3N1YnJvdXRpbmVzOwogICAgIGludCBzaW5nbGVf
aW5zdDsKICAgICBjaGFyICpjb3VudF9zdHJpbmc7CnsKICByZWdpc3RlciBpbnQgY291bnQg
PSAxOwogIHN0cnVjdCBmcmFtZV9pbmZvICpmcmFtZTsKICBzdHJ1Y3QgY2xlYW51cCAqY2xl
YW51cHMgPSAwOwoKICBFUlJPUl9OT19JTkZFUklPUjsKICBjb3VudCA9IGNvdW50X3N0cmlu
ZyA/IHBhcnNlX2FuZF9ldmFsX2FkZHJlc3MgKGNvdW50X3N0cmluZykgOiAxOwoKICBpZiAo
IXNpbmdsZV9pbnN0IHx8IHNraXBfc3Vicm91dGluZXMpIC8qIGxlYXZlIHNpIGNvbW1hbmQg
YWxvbmUgKi8KICAgIHsKICAgICAgZW5hYmxlX2xvbmdqbXBfYnJlYWtwb2ludCgpOwogICAg
ICBjbGVhbnVwcyA9IG1ha2VfY2xlYW51cChkaXNhYmxlX2xvbmdqbXBfYnJlYWtwb2ludCwg
MCk7CiAgICB9CgogIGZvciAoOyBjb3VudCA+IDA7IGNvdW50LS0pCiAgICB7CiAgICAgIGNs
ZWFyX3Byb2NlZWRfc3RhdHVzICgpOwoKICAgICAgZnJhbWUgPSBnZXRfY3VycmVudF9mcmFt
ZSAoKTsKICAgICAgaWYgKCFmcmFtZSkJCQkvKiBBdm9pZCBjb3JlZHVtcCBoZXJlLiAgV2h5
IHRobz8gKi8KCWVycm9yICgiTm8gY3VycmVudCBmcmFtZSIpOwogICAgICBzdGVwX2ZyYW1l
X2FkZHJlc3MgPSBGUkFNRV9GUCAoZnJhbWUpOwogICAgICBzdGVwX3NwID0gcmVhZF9zcCAo
KTsKCiAgICAgIGlmICghIHNpbmdsZV9pbnN0KQoJewoJICBmaW5kX3BjX2xpbmVfcGNfcmFu
Z2UgKHN0b3BfcGMsICZzdGVwX3JhbmdlX3N0YXJ0LCAmc3RlcF9yYW5nZV9lbmQpOwoJICBp
ZiAoc3RlcF9yYW5nZV9lbmQgPT0gMCkKCSAgICB7CgkgICAgICBjaGFyICpuYW1lOwoJICAg
ICAgaWYgKGZpbmRfcGNfcGFydGlhbF9mdW5jdGlvbiAoc3RvcF9wYywgJm5hbWUsICZzdGVw
X3JhbmdlX3N0YXJ0LAoJCQkJCSAgICAmc3RlcF9yYW5nZV9lbmQpID09IDApCgkJZXJyb3Ig
KCJDYW5ub3QgZmluZCBib3VuZHMgb2YgY3VycmVudCBmdW5jdGlvbiIpOwoKCSAgICAgIHRh
cmdldF90ZXJtaW5hbF9vdXJzICgpOwoJICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiXApTaW5n
bGUgc3RlcHBpbmcgdW50aWwgZXhpdCBmcm9tIGZ1bmN0aW9uICVzLCBcblwKd2hpY2ggaGFz
IG5vIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uLlxuIiwgbmFtZSk7CgkgICAgfQoJfQogICAg
ICBlbHNlCgl7CgkgIC8qIFNheSB3ZSBhcmUgc3RlcHBpbmcsIGJ1dCBzdG9wIGFmdGVyIG9u
ZSBpbnNuIHdoYXRldmVyIGl0IGRvZXMuICAqLwoJICBzdGVwX3JhbmdlX3N0YXJ0ID0gc3Rl
cF9yYW5nZV9lbmQgPSAxOwoJICBpZiAoIXNraXBfc3Vicm91dGluZXMpCgkgICAgLyogSXQg
aXMgc3RlcGkuCgkgICAgICAgRG9uJ3Qgc3RlcCBvdmVyIGZ1bmN0aW9uIGNhbGxzLCBub3Qg
ZXZlbiB0byBmdW5jdGlvbnMgbGFja2luZwoJICAgICAgIGxpbmUgbnVtYmVycy4gICovCgkg
ICAgc3RlcF9vdmVyX2NhbGxzID0gMDsKCX0KCiAgICAgIGlmIChza2lwX3N1YnJvdXRpbmVz
KQoJc3RlcF9vdmVyX2NhbGxzID0gMTsKCiAgICAgIHN0ZXBfbXVsdGkgPSAoY291bnQgPiAx
KTsKICAgICAgcHJvY2VlZCAoKENPUkVfQUREUikgLTEsIFRBUkdFVF9TSUdOQUxfREVGQVVM
VCwgMSk7CiAgICAgIGlmICghIHN0b3Bfc3RlcCkKCWJyZWFrOwoKICAgICAgLyogRklYTUU6
IE9uIG5leHRpLCB0aGlzIG1heSBoYXZlIGFscmVhZHkgYmVlbiBkb25lICh3aGVuIHdlIGhp
dCB0aGUKCSBzdGVwIHJlc3VtZSBicmVhaywgSSB0aGluaykuICBQcm9iYWJseSB0aGlzIHNo
b3VsZCBiZSBtb3ZlZCB0bwoJIHdhaXRfZm9yX2luZmVyaW9yIChuZWFyIHRoZSB0b3ApLiAg
Ki8KI2lmIGRlZmluZWQgKFNISUZUX0lOU1RfUkVHUykKICAgICAgU0hJRlRfSU5TVF9SRUdT
KCk7CiNlbmRpZgogICAgfQoKICBpZiAoIXNpbmdsZV9pbnN0IHx8IHNraXBfc3Vicm91dGlu
ZXMpCiAgICBkb19jbGVhbnVwcyhjbGVhbnVwcyk7Cn0KDAovKiBDb250aW51ZSBwcm9ncmFt
IGF0IHNwZWNpZmllZCBhZGRyZXNzLiAgKi8KCnN0YXRpYyB2b2lkCmp1bXBfY29tbWFuZCAo
YXJnLCBmcm9tX3R0eSkKICAgICBjaGFyICphcmc7CiAgICAgaW50IGZyb21fdHR5Owp7CiAg
cmVnaXN0ZXIgQ09SRV9BRERSIGFkZHI7CiAgc3RydWN0IHN5bXRhYnNfYW5kX2xpbmVzIHNh
bHM7CiAgc3RydWN0IHN5bXRhYl9hbmRfbGluZSBzYWw7CiAgc3RydWN0IHN5bWJvbCAqZm47
CiAgc3RydWN0IHN5bWJvbCAqc2ZuOwoKICBFUlJPUl9OT19JTkZFUklPUjsKCiAgaWYgKCFh
cmcpCiAgICBlcnJvcl9ub19hcmcgKCJzdGFydGluZyBhZGRyZXNzIik7CgogIHNhbHMgPSBk
ZWNvZGVfbGluZV9zcGVjXzEgKGFyZywgMSk7CiAgaWYgKHNhbHMubmVsdHMgIT0gMSkKICAg
IHsKICAgICAgZXJyb3IgKCJVbnJlYXNvbmFibGUganVtcCByZXF1ZXN0Iik7CiAgICB9Cgog
IHNhbCA9IHNhbHMuc2Fsc1swXTsKICBmcmVlICgoUFRSKXNhbHMuc2Fscyk7CgogIGlmIChz
YWwuc3ltdGFiID09IDAgJiYgc2FsLnBjID09IDApCiAgICBlcnJvciAoIk5vIHNvdXJjZSBm
aWxlIGhhcyBiZWVuIHNwZWNpZmllZC4iKTsKCiAgcmVzb2x2ZV9zYWxfcGMgKCZzYWwpOwkJ
CS8qIE1heSBlcnJvciBvdXQgKi8KCiAgLyogU2VlIGlmIHdlIGFyZSB0cnlpbmcgdG8ganVt
cCB0byBhbm90aGVyIGZ1bmN0aW9uLiAqLwogIGZuID0gZ2V0X2ZyYW1lX2Z1bmN0aW9uIChn
ZXRfY3VycmVudF9mcmFtZSAoKSk7CiAgc2ZuID0gZmluZF9wY19mdW5jdGlvbiAoc2FsLnBj
KTsKICBpZiAoZm4gIT0gTlVMTCAmJiBzZm4gIT0gZm4pCiAgICB7CiAgICAgIGlmICghcXVl
cnkgKCJMaW5lICVkIGlzIG5vdCBpbiBgJXMnLiAgSnVtcCBhbnl3YXk/ICIsIHNhbC5saW5l
LAoJCSAgU1lNQk9MX1NPVVJDRV9OQU1FIChmbikpKQoJewoJICBlcnJvciAoIk5vdCBjb25m
aXJtZWQuIik7CgkgIC8qIE5PVFJFQUNIRUQgKi8KCX0KICAgIH0KICBmaXh1cF9zeW1ib2xf
c2VjdGlvbiAoc2ZuLCAwKTsKICBpZiAoc2ZuIT1OVUxMICYmCiAgICAgIHNlY3Rpb25faXNf
b3ZlcmxheSAoU1lNQk9MX0JGRF9TRUNUSU9OIChzZm4pKSAmJiAKICAgICAgIXNlY3Rpb25f
aXNfbWFwcGVkIChTWU1CT0xfQkZEX1NFQ1RJT04gKHNmbikpKQogICAgewogICAgICBpZiAo
IXF1ZXJ5ICgiV0FSTklORyEhISAgRGVzdGluYXRpb24gaXMgaW4gdW5tYXBwZWQgb3Zlcmxh
eSEgIEp1bXAgYW55d2F5PyAiKSkKCXsKCSAgZXJyb3IgKCJOb3QgY29uZmlybWVkLiIpOwoJ
ICAvKiBOT1RSRUFDSEVEICovCgl9CiAgICB9CgoKICBhZGRyID0gc2FsLnBjOwoKICBpZiAo
ZnJvbV90dHkpCiAgICB7CiAgICAgIHByaW50Zl9maWx0ZXJlZCAoIkNvbnRpbnVpbmcgYXQg
Iik7CiAgICAgIHByaW50X2FkZHJlc3NfbnVtZXJpYyAoYWRkciwgMSwgZ2RiX3N0ZG91dCk7
CiAgICAgIHByaW50Zl9maWx0ZXJlZCAoIi5cbiIpOwogICAgfQoKICBjbGVhcl9wcm9jZWVk
X3N0YXR1cyAoKTsKICBwcm9jZWVkIChhZGRyLCBUQVJHRVRfU0lHTkFMXzAsIDApOwp9Cgov
KiBDb250aW51ZSBwcm9ncmFtIGdpdmluZyBpdCBzcGVjaWZpZWQgc2lnbmFsLiAgKi8KCnN0
YXRpYyB2b2lkCnNpZ25hbF9jb21tYW5kIChzaWdudW1fZXhwLCBmcm9tX3R0eSkKICAgICBj
aGFyICpzaWdudW1fZXhwOwogICAgIGludCBmcm9tX3R0eTsKewogIGVudW0gdGFyZ2V0X3Np
Z25hbCBvdXJzaWc7CgogIGRvbnRfcmVwZWF0ICgpOwkJLyogVG9vIGRhbmdlcm91cy4gICov
CiAgRVJST1JfTk9fSU5GRVJJT1I7CgogIGlmICghc2lnbnVtX2V4cCkKICAgIGVycm9yX25v
X2FyZyAoInNpZ25hbCBudW1iZXIiKTsKCiAgLyogSXQgd291bGQgYmUgZXZlbiBzbGlja2Vy
IHRvIG1ha2Ugc2lnbmFsIG5hbWVzIGJlIHZhbGlkIGV4cHJlc3Npb25zLAogICAgICh0aGUg
dHlwZSBjb3VsZCBiZSAiZW51bSAkc2lnbmFsIiBvciBzb21lIHN1Y2gpLCB0aGVuIHRoZSB1
c2VyIGNvdWxkCiAgICAgYXNzaWduIHRoZW0gdG8gY29udmVuaWVuY2UgdmFyaWFibGVzLiAg
Ki8KICBvdXJzaWcgPSB0YXJnZXRfc2lnbmFsX2Zyb21fbmFtZSAoc2lnbnVtX2V4cCk7Cgog
IGlmIChvdXJzaWcgPT0gVEFSR0VUX1NJR05BTF9VTktOT1dOKQogICAgewogICAgICAvKiBO
bywgdHJ5IG51bWVyaWMuICAqLwogICAgICBpbnQgbnVtID0gcGFyc2VfYW5kX2V2YWxfYWRk
cmVzcyAoc2lnbnVtX2V4cCk7CgogICAgICBpZiAobnVtID09IDApCglvdXJzaWcgPSBUQVJH
RVRfU0lHTkFMXzA7CiAgICAgIGVsc2UKCW91cnNpZyA9IHRhcmdldF9zaWduYWxfZnJvbV9j
b21tYW5kIChudW0pOwogICAgfQoKICBpZiAoZnJvbV90dHkpCiAgICB7CiAgICAgIGlmIChv
dXJzaWcgPT0gVEFSR0VUX1NJR05BTF8wKQoJcHJpbnRmX2ZpbHRlcmVkICgiQ29udGludWlu
ZyB3aXRoIG5vIHNpZ25hbC5cbiIpOwogICAgICBlbHNlCglwcmludGZfZmlsdGVyZWQgKCJD
b250aW51aW5nIHdpdGggc2lnbmFsICVzLlxuIiwKCQkJIHRhcmdldF9zaWduYWxfdG9fbmFt
ZSAob3Vyc2lnKSk7CiAgICB9CgogIGNsZWFyX3Byb2NlZWRfc3RhdHVzICgpOwogIC8qICJz
aWduYWwgMCIgc2hvdWxkIG5vdCBnZXQgc3R1Y2sgaWYgd2UgYXJlIHN0b3BwZWQgYXQgYSBi
cmVha3BvaW50LgogICAgIEZJWE1FOiBOZWl0aGVyIHNob3VsZCAic2lnbmFsIGZvbyIgYnV0
IHdoZW4gSSB0cmllZCBwYXNzaW5nCiAgICAgKENPUkVfQUREUiktMSB1bmNvbmRpdGlvbmFs
bHkgSSBnb3QgYSB0ZXN0c3VpdGUgZmFpbHVyZSB3aGljaCBJIGhhdmVuJ3QKICAgICB0cmll
ZCB0byB0cmFjayBkb3duIHlldC4gICovCiAgcHJvY2VlZCAob3Vyc2lnID09IFRBUkdFVF9T
SUdOQUxfMCA/IChDT1JFX0FERFIpIC0xIDogc3RvcF9wYywgb3Vyc2lnLCAwKTsKfQoKLyog
Q2FsbCBicmVha3BvaW50X2F1dG9fZGVsZXRlIG9uIHRoZSBjdXJyZW50IGNvbnRlbnRzIG9m
IHRoZSBicHN0YXQKICAgcG9pbnRlZCB0byBieSBhcmcgKHdoaWNoIGlzIHJlYWxseSBhIGJw
c3RhdCAqKS4gICovCgojaWZkZWYgQ0FMTF9EVU1NWV9CUkVBS1BPSU5UX09GRlNFVAoKc3Rh
dGljIHZvaWQKYnJlYWtwb2ludF9hdXRvX2RlbGV0ZV9jb250ZW50cyAoYXJnKQogICAgIFBU
UiBhcmc7CnsKICBicmVha3BvaW50X2F1dG9fZGVsZXRlICgqKGJwc3RhdCAqKWFyZyk7Cn0K
CiNlbmRpZgkvKiBDQUxMX0RVTU1ZX0JSRUFLUE9JTlRfT0ZGU0VUICovCgovKiBFeGVjdXRl
IGEgInN0YWNrIGR1bW15IiwgYSBwaWVjZSBvZiBjb2RlIHN0b3JlZCBpbiB0aGUgc3RhY2sK
ICAgYnkgdGhlIGRlYnVnZ2VyIHRvIGJlIGV4ZWN1dGVkIGluIHRoZSBpbmZlcmlvci4KCiAg
IFRvIGNhbGw6IGZpcnN0LCBkbyBQVVNIX0RVTU1ZX0ZSQU1FLgogICBUaGVuIHB1c2ggdGhl
IGNvbnRlbnRzIG9mIHRoZSBkdW1teS4gIEl0IHNob3VsZCBlbmQgd2l0aCBhIGJyZWFrcG9p
bnQgaW5zbi4KICAgVGhlbiBjYWxsIGhlcmUsIHBhc3NpbmcgYWRkcmVzcyBhdCB3aGljaCB0
byBzdGFydCB0aGUgZHVtbXkuCgogICBUaGUgY29udGVudHMgb2YgYWxsIHJlZ2lzdGVycyBh
cmUgc2F2ZWQgYmVmb3JlIHRoZSBkdW1teSBmcmFtZSBpcyBwb3BwZWQKICAgYW5kIGNvcGll
ZCBpbnRvIHRoZSBidWZmZXIgQlVGRkVSLgoKICAgVGhlIGR1bW15J3MgZnJhbWUgaXMgYXV0
b21hdGljYWxseSBwb3BwZWQgd2hlbmV2ZXIgdGhhdCBicmVhayBpcyBoaXQuCiAgIElmIHRo
YXQgaXMgdGhlIGZpcnN0IHRpbWUgdGhlIHByb2dyYW0gc3RvcHMsIHJ1bl9zdGFja19kdW1t
eQogICByZXR1cm5zIHRvIGl0cyBjYWxsZXIgd2l0aCB0aGF0IGZyYW1lIGFscmVhZHkgZ29u
ZSBhbmQgcmV0dXJucyAwLgogICBPdGhlcndpc2UsIHJ1bl9zdGFjay1kdW1teSByZXR1cm5z
IDEgKHRoZSBmcmFtZSB3aWxsIGV2ZW50dWFsbHkgYmUgcG9wcGVkCiAgIHdoZW4gd2UgZG8g
aGl0IHRoYXQgYnJlYWtwb2ludCkuICAqLwoKLyogREVCVUcgSE9PSzogIDQgPT4gcmV0dXJu
IGluc3RlYWQgb2YgbGV0dGluZyB0aGUgc3RhY2sgZHVtbXkgcnVuLiAgKi8KCnN0YXRpYyBp
bnQgc3RhY2tfZHVtbXlfdGVzdGluZyA9IDA7CgppbnQKcnVuX3N0YWNrX2R1bW15IChhZGRy
LCBidWZmZXIpCiAgICAgQ09SRV9BRERSIGFkZHI7CiAgICAgY2hhciBidWZmZXJbUkVHSVNU
RVJfQllURVNdOwp7CiAgc3RydWN0IGNsZWFudXAgKm9sZF9jbGVhbnVwcyA9IG1ha2VfY2xl
YW51cCAobnVsbF9jbGVhbnVwLCAwKTsKCiAgLyogTm93IHByb2NlZWQsIGhhdmluZyByZWFj
aGVkIHRoZSBkZXNpcmVkIHBsYWNlLiAgKi8KICBjbGVhcl9wcm9jZWVkX3N0YXR1cyAoKTsK
ICBpZiAoc3RhY2tfZHVtbXlfdGVzdGluZyAmIDQpCiAgICB7CiAgICAgIFBPUF9GUkFNRTsK
ICAgICAgcmV0dXJuKDApOwogICAgfQojaWZkZWYgQ0FMTF9EVU1NWV9CUkVBS1BPSU5UX09G
RlNFVAogIHsKICAgIHN0cnVjdCBicmVha3BvaW50ICpicHQ7CiAgICBzdHJ1Y3Qgc3ltdGFi
X2FuZF9saW5lIHNhbDsKCiAgICBJTklUX1NBTCAoJnNhbCk7CS8qIGluaXRpYWxpemUgdG8g
emVyb2VzICovCiNpZiBDQUxMX0RVTU1ZX0xPQ0FUSU9OICE9IEFUX0VOVFJZX1BPSU5UCiAg
ICBzYWwucGMgPSBhZGRyIC0gQ0FMTF9EVU1NWV9TVEFSVF9PRkZTRVQgKyBDQUxMX0RVTU1Z
X0JSRUFLUE9JTlRfT0ZGU0VUOwojZWxzZQogICAgc2FsLnBjID0gQ0FMTF9EVU1NWV9BRERS
RVNTICgpOwojZW5kaWYKICAgIHNhbC5zZWN0aW9uID0gZmluZF9wY19vdmVybGF5IChzYWwu
cGMpOwoKICAgIC8qIFNldCB1cCBhIEZSQU1FIGZvciB0aGUgZHVtbXkgZnJhbWUgc28gd2Ug
Y2FuIHBhc3MgaXQgdG8KICAgICAgIHNldF9tb21lbnRhcnlfYnJlYWtwb2ludC4gIFdlIG5l
ZWQgdG8gZ2l2ZSB0aGUgYnJlYWtwb2ludCBhCiAgICAgICBmcmFtZSBpbiBjYXNlIHRoZXJl
IGlzIG9ubHkgb25lIGNvcHkgb2YgdGhlIGR1bW15IChlLmcuCiAgICAgICBDQUxMX0RVTU1Z
X0xPQ0FUSU9OID09IEFGVEVSX1RFWFRfRU5EKS4gICovCiAgICBmbHVzaF9jYWNoZWRfZnJh
bWVzICgpOwogICAgc2V0X2N1cnJlbnRfZnJhbWUgKGNyZWF0ZV9uZXdfZnJhbWUgKHJlYWRf
ZnAgKCksIHNhbC5wYykpOwoKICAgIC8qIElmIGRlZmluZWQsIENBTExfRFVNTVlfQlJFQUtQ
T0lOVF9PRkZTRVQgaXMgd2hlcmUgd2UgbmVlZCB0byBwdXQKICAgICAgIGEgYnJlYWtwb2lu
dCBpbnN0cnVjdGlvbi4gIElmIG5vdCwgdGhlIGNhbGwgZHVtbXkgYWxyZWFkeSBoYXMgdGhl
CiAgICAgICBicmVha3BvaW50IGluc3RydWN0aW9uIGluIGl0LgoKICAgICAgIGFkZHIgaXMg
dGhlIGFkZHJlc3Mgb2YgdGhlIGNhbGwgZHVtbXkgcGx1cyB0aGUgQ0FMTF9EVU1NWV9TVEFS
VF9PRkZTRVQsCiAgICAgICBzbyB3ZSBuZWVkIHRvIHN1YnRyYWN0IHRoZSBDQUxMX0RVTU1Z
X1NUQVJUX09GRlNFVC4gICovCiAgICBicHQgPSBzZXRfbW9tZW50YXJ5X2JyZWFrcG9pbnQg
KHNhbCwKCQkJCSAgICBnZXRfY3VycmVudF9mcmFtZSAoKSwKCQkJCSAgICBicF9jYWxsX2R1
bW15KTsKICAgIGJwdC0+ZGlzcG9zaXRpb24gPSBkZWw7CgogICAgLyogSWYgYWxsIGVycm9y
KClzIG91dCBvZiBwcm9jZWVkIGVuZGVkIHVwIGNhbGxpbmcgbm9ybWFsX3N0b3AgKGFuZAog
ICAgICAgcGVyaGFwcyB0aGV5IHNob3VsZDsgaXQgYWxyZWFkeSBkb2VzIGluIHRoZSBzcGVj
aWFsIGNhc2Ugb2YgZXJyb3IKICAgICAgIG91dCBvZiByZXN1bWUoKSksIHRoZW4gd2Ugd291
bGRuJ3QgbmVlZCB0aGlzLiAgKi8KICAgIG1ha2VfY2xlYW51cCAoYnJlYWtwb2ludF9hdXRv
X2RlbGV0ZV9jb250ZW50cywgJnN0b3BfYnBzdGF0KTsKICB9CiNlbmRpZiAvKiBDQUxMX0RV
TU1ZX0JSRUFLUE9JTlRfT0ZGU0VULiAgKi8KCiAgcHJvY2VlZF90b19maW5pc2ggPSAxOwkv
KiBXZSB3YW50IHN0b3BfcmVnaXN0ZXJzLCBwbGVhc2UuLi4gKi8KICBwcm9jZWVkIChhZGRy
LCBUQVJHRVRfU0lHTkFMXzAsIDApOwoKICBkaXNjYXJkX2NsZWFudXBzIChvbGRfY2xlYW51
cHMpOwoKICBpZiAoIXN0b3Bfc3RhY2tfZHVtbXkpCiAgICByZXR1cm4gMTsKCiAgLyogT24g
cmV0dXJuLCB0aGUgc3RhY2sgZHVtbXkgaGFzIGJlZW4gcG9wcGVkIGFscmVhZHkuICAqLwoK
ICBtZW1jcHkgKGJ1ZmZlciwgc3RvcF9yZWdpc3RlcnMsIHNpemVvZiBzdG9wX3JlZ2lzdGVy
cyk7CiAgcmV0dXJuIDA7Cn0KDAovKiBQcm9jZWVkIHVudGlsIHdlIHJlYWNoIGEgZGlmZmVy
ZW50IHNvdXJjZSBsaW5lIHdpdGggcGMgZ3JlYXRlciB0aGFuCiAgIG91ciBjdXJyZW50IG9u
ZSBvciBleGl0IHRoZSBmdW5jdGlvbi4gIFdlIHNraXAgY2FsbHMgaW4gYm90aCBjYXNlcy4K
CiAgIE5vdGUgdGhhdCBldmVudHVhbGx5IHRoaXMgY29tbWFuZCBzaG91bGQgcHJvYmFibHkg
YmUgY2hhbmdlZCBzbwogICB0aGF0IG9ubHkgc291cmNlIGxpbmVzIGFyZSBwcmludGVkIG91
dCB3aGVuIHdlIGhpdCB0aGUgYnJlYWtwb2ludAogICB3ZSBzZXQuICBUaGlzIG1heSBpbnZv
bHZlIGNoYW5nZXMgdG8gd2FpdF9mb3JfaW5mZXJpb3IgYW5kIHRoZQogICBwcm9jZWVkIHN0
YXR1cyBjb2RlLiAgKi8KCi8qIEFSR1NVU0VEICovCnN0YXRpYyB2b2lkCnVudGlsX25leHRf
Y29tbWFuZCAoZnJvbV90dHkpCiAgICAgaW50IGZyb21fdHR5Owp7CiAgc3RydWN0IGZyYW1l
X2luZm8gKmZyYW1lOwogIENPUkVfQUREUiBwYzsKICBzdHJ1Y3Qgc3ltYm9sICpmdW5jOwog
IHN0cnVjdCBzeW10YWJfYW5kX2xpbmUgc2FsOwogCiAgY2xlYXJfcHJvY2VlZF9zdGF0dXMg
KCk7CgogIGZyYW1lID0gZ2V0X2N1cnJlbnRfZnJhbWUgKCk7CgogIC8qIFN0ZXAgdW50aWwg
ZWl0aGVyIGV4aXRlZCBmcm9tIHRoaXMgZnVuY3Rpb24gb3IgZ3JlYXRlcgogICAgIHRoYW4g
dGhlIGN1cnJlbnQgbGluZSAoaWYgaW4gc3ltYm9saWMgc2VjdGlvbikgb3IgcGMgKGlmCiAg
ICAgbm90KS4gKi8KCiAgcGMgPSByZWFkX3BjICgpOwogIGZ1bmMgPSBmaW5kX3BjX2Z1bmN0
aW9uIChwYyk7CiAgCiAgaWYgKCFmdW5jKQogICAgewogICAgICBzdHJ1Y3QgbWluaW1hbF9z
eW1ib2wgKm1zeW1ib2wgPSBsb29rdXBfbWluaW1hbF9zeW1ib2xfYnlfcGMgKHBjKTsKICAg
ICAgCiAgICAgIGlmIChtc3ltYm9sID09IE5VTEwpCgllcnJvciAoIkV4ZWN1dGlvbiBpcyBu
b3Qgd2l0aGluIGEga25vd24gZnVuY3Rpb24uIik7CiAgICAgIAogICAgICBzdGVwX3Jhbmdl
X3N0YXJ0ID0gU1lNQk9MX1ZBTFVFX0FERFJFU1MgKG1zeW1ib2wpOwogICAgICBzdGVwX3Jh
bmdlX2VuZCA9IHBjOwogICAgfQogIGVsc2UKICAgIHsKICAgICAgc2FsID0gZmluZF9wY19s
aW5lIChwYywgMCk7CiAgICAgIAogICAgICBzdGVwX3JhbmdlX3N0YXJ0ID0gQkxPQ0tfU1RB
UlQgKFNZTUJPTF9CTE9DS19WQUxVRSAoZnVuYykpOwogICAgICBzdGVwX3JhbmdlX2VuZCA9
IHNhbC5lbmQ7CiAgICB9CiAgCiAgc3RlcF9vdmVyX2NhbGxzID0gMTsKICBzdGVwX2ZyYW1l
X2FkZHJlc3MgPSBGUkFNRV9GUCAoZnJhbWUpOwogIHN0ZXBfc3AgPSByZWFkX3NwICgpOwoK
ICBzdGVwX211bHRpID0gMDsJCS8qIE9ubHkgb25lIGNhbGwgdG8gcHJvY2VlZCAqLwogIAog
IHByb2NlZWQgKChDT1JFX0FERFIpIC0xLCBUQVJHRVRfU0lHTkFMX0RFRkFVTFQsIDEpOwp9
CgpzdGF0aWMgdm9pZCAKdW50aWxfY29tbWFuZCAoYXJnLCBmcm9tX3R0eSkKICAgICBjaGFy
ICphcmc7CiAgICAgaW50IGZyb21fdHR5Owp7CiAgaWYgKCF0YXJnZXRfaGFzX2V4ZWN1dGlv
bikKICAgIGVycm9yICgiVGhlIHByb2dyYW0gaXMgbm90IHJ1bm5pbmcuIik7CiAgaWYgKGFy
ZykKICAgIHVudGlsX2JyZWFrX2NvbW1hbmQgKGFyZywgZnJvbV90dHkpOwogIGVsc2UKICAg
IHVudGlsX25leHRfY29tbWFuZCAoZnJvbV90dHkpOwp9CgwKLyogImZpbmlzaCI6IFNldCBh
IHRlbXBvcmFyeSBicmVha3BvaW50IGF0IHRoZSBwbGFjZQogICB0aGUgc2VsZWN0ZWQgZnJh
bWUgd2lsbCByZXR1cm4gdG8sIHRoZW4gY29udGludWUuICAqLwoKc3RhdGljIHZvaWQKZmlu
aXNoX2NvbW1hbmQgKGFyZywgZnJvbV90dHkpCiAgICAgY2hhciAqYXJnOwogICAgIGludCBm
cm9tX3R0eTsKewogIHN0cnVjdCBzeW10YWJfYW5kX2xpbmUgc2FsOwogIHJlZ2lzdGVyIHN0
cnVjdCBmcmFtZV9pbmZvICpmcmFtZTsKICByZWdpc3RlciBzdHJ1Y3Qgc3ltYm9sICpmdW5j
dGlvbjsKICBzdHJ1Y3QgYnJlYWtwb2ludCAqYnJlYWtwb2ludDsKICBzdHJ1Y3QgY2xlYW51
cCAqb2xkX2NoYWluOwoKICBpZiAoYXJnKQogICAgZXJyb3IgKCJUaGUgXCJmaW5pc2hcIiBj
b21tYW5kIGRvZXMgbm90IHRha2UgYW55IGFyZ3VtZW50cy4iKTsKICBpZiAoIXRhcmdldF9o
YXNfZXhlY3V0aW9uKQogICAgZXJyb3IgKCJUaGUgcHJvZ3JhbSBpcyBub3QgcnVubmluZy4i
KTsKICBpZiAoc2VsZWN0ZWRfZnJhbWUgPT0gTlVMTCkKICAgIGVycm9yICgiTm8gc2VsZWN0
ZWQgZnJhbWUuIik7CgogIGZyYW1lID0gZ2V0X3ByZXZfZnJhbWUgKHNlbGVjdGVkX2ZyYW1l
KTsKICBpZiAoZnJhbWUgPT0gMCkKICAgIGVycm9yICgiXCJmaW5pc2hcIiBub3QgbWVhbmlu
Z2Z1bCBpbiB0aGUgb3V0ZXJtb3N0IGZyYW1lLiIpOwoKICBjbGVhcl9wcm9jZWVkX3N0YXR1
cyAoKTsKCiAgc2FsID0gZmluZF9wY19saW5lIChmcmFtZS0+cGMsIDApOwogIHNhbC5wYyA9
IGZyYW1lLT5wYzsKCiAgYnJlYWtwb2ludCA9IHNldF9tb21lbnRhcnlfYnJlYWtwb2ludCAo
c2FsLCBmcmFtZSwgYnBfZmluaXNoKTsKCiAgb2xkX2NoYWluID0gbWFrZV9jbGVhbnVwKGRl
bGV0ZV9icmVha3BvaW50LCBicmVha3BvaW50KTsKCiAgLyogRmluZCB0aGUgZnVuY3Rpb24g
d2Ugd2lsbCByZXR1cm4gZnJvbS4gICovCgogIGZ1bmN0aW9uID0gZmluZF9wY19mdW5jdGlv
biAoc2VsZWN0ZWRfZnJhbWUtPnBjKTsKCiAgLyogUHJpbnQgaW5mbyBvbiB0aGUgc2VsZWN0
ZWQgZnJhbWUsIGluY2x1ZGluZyBsZXZlbCBudW1iZXIKICAgICBidXQgbm90IHNvdXJjZS4g
ICovCiAgaWYgKGZyb21fdHR5KQogICAgewogICAgICBwcmludGZfZmlsdGVyZWQgKCJSdW4g
dGlsbCBleGl0IGZyb20gIik7CiAgICAgIHByaW50X3N0YWNrX2ZyYW1lIChzZWxlY3RlZF9m
cmFtZSwgc2VsZWN0ZWRfZnJhbWVfbGV2ZWwsIDApOwogICAgfQoKICBwcm9jZWVkX3RvX2Zp
bmlzaCA9IDE7CQkvKiBXZSB3YW50IHN0b3BfcmVnaXN0ZXJzLCBwbGVhc2UuLi4gKi8KICBw
cm9jZWVkICgoQ09SRV9BRERSKSAtMSwgVEFSR0VUX1NJR05BTF9ERUZBVUxULCAwKTsKCiAg
LyogRGlkIHdlIHN0b3AgYXQgb3VyIGJyZWFrcG9pbnQ/ICovCiAgaWYgKGJwc3RhdF9maW5k
X2JyZWFrcG9pbnQoc3RvcF9icHN0YXQsIGJyZWFrcG9pbnQpICE9IE5VTEwKICAgICAgJiYg
ZnVuY3Rpb24gIT0gMCkKICAgIHsKICAgICAgc3RydWN0IHR5cGUgKnZhbHVlX3R5cGU7CiAg
ICAgIHJlZ2lzdGVyIHZhbHVlX3B0ciB2YWw7CiAgICAgIENPUkVfQUREUiBmdW5jYWRkcjsK
CiAgICAgIHZhbHVlX3R5cGUgPSBUWVBFX1RBUkdFVF9UWVBFIChTWU1CT0xfVFlQRSAoZnVu
Y3Rpb24pKTsKICAgICAgaWYgKCF2YWx1ZV90eXBlKQoJZmF0YWwgKCJpbnRlcm5hbDogZmlu
aXNoX2NvbW1hbmQ6IGZ1bmN0aW9uIGhhcyBubyB0YXJnZXQgdHlwZSIpOwogICAgICAKICAg
ICAgaWYgKFRZUEVfQ09ERSAodmFsdWVfdHlwZSkgPT0gVFlQRV9DT0RFX1ZPSUQpCglyZXR1
cm47CgogICAgICBmdW5jYWRkciA9IEJMT0NLX1NUQVJUIChTWU1CT0xfQkxPQ0tfVkFMVUUg
KGZ1bmN0aW9uKSk7CgogICAgICB2YWwgPSB2YWx1ZV9iZWluZ19yZXR1cm5lZCAodmFsdWVf
dHlwZSwgc3RvcF9yZWdpc3RlcnMsCgkgICAgICB1c2luZ19zdHJ1Y3RfcmV0dXJuICh2YWx1
ZV9vZl92YXJpYWJsZSAoZnVuY3Rpb24sIE5VTEwpLAoJCQkJICAgZnVuY2FkZHIsCgkJCQkg
ICBjaGVja190eXBlZGVmICh2YWx1ZV90eXBlKSwKCQlCTE9DS19HQ0NfQ09NUElMRUQgKFNZ
TUJPTF9CTE9DS19WQUxVRSAoZnVuY3Rpb24pKSkpOwoKICAgICAgcHJpbnRmX2ZpbHRlcmVk
ICgiVmFsdWUgcmV0dXJuZWQgaXMgJCVkID0gIiwgcmVjb3JkX2xhdGVzdF92YWx1ZSAodmFs
KSk7CiAgICAgIHZhbHVlX3ByaW50ICh2YWwsIGdkYl9zdGRvdXQsIDAsIFZhbF9ub19wcmV0
dHlwcmludCk7CiAgICAgIHByaW50Zl9maWx0ZXJlZCAoIlxuIik7CiAgICB9CiAgZG9fY2xl
YW51cHMob2xkX2NoYWluKTsKfQoMCi8qIEFSR1NVU0VEICovCnN0YXRpYyB2b2lkCnByb2dy
YW1faW5mbyAoYXJncywgZnJvbV90dHkpCiAgICBjaGFyICphcmdzOwogICAgaW50IGZyb21f
dHR5Owp7CiAgYnBzdGF0IGJzID0gc3RvcF9icHN0YXQ7CiAgaW50IG51bSA9IGJwc3RhdF9u
dW0gKCZicyk7CiAgCiAgaWYgKCF0YXJnZXRfaGFzX2V4ZWN1dGlvbikKICAgIHsKICAgICAg
cHJpbnRmX2ZpbHRlcmVkICgiVGhlIHByb2dyYW0gYmVpbmcgZGVidWdnZWQgaXMgbm90IGJl
aW5nIHJ1bi5cbiIpOwogICAgICByZXR1cm47CiAgICB9CgogIHRhcmdldF9maWxlc19pbmZv
ICgpOwogIHByaW50Zl9maWx0ZXJlZCAoIlByb2dyYW0gc3RvcHBlZCBhdCAlcy5cbiIsCgkJ
ICAgbG9jYWxfaGV4X3N0cmluZygodW5zaWduZWQgbG9uZykgc3RvcF9wYykpOwogIGlmIChz
dG9wX3N0ZXApCiAgICBwcmludGZfZmlsdGVyZWQgKCJJdCBzdG9wcGVkIGFmdGVyIGJlaW5n
IHN0ZXBwZWQuXG4iKTsKICBlbHNlIGlmIChudW0gIT0gMCkKICAgIHsKICAgICAgLyogVGhl
cmUgbWF5IGJlIHNldmVyYWwgYnJlYWtwb2ludHMgaW4gdGhlIHNhbWUgcGxhY2UsIHNvIHRo
aXMKCSBpc24ndCBhcyBzdHJhbmdlIGFzIGl0IHNlZW1zLiAgKi8KICAgICAgd2hpbGUgKG51
bSAhPSAwKQoJewoJICBpZiAobnVtIDwgMCkKCSAgICBwcmludGZfZmlsdGVyZWQgKCJJdCBz
dG9wcGVkIGF0IGEgYnJlYWtwb2ludCB0aGF0IGhhcyBzaW5jZSBiZWVuIGRlbGV0ZWQuXG4i
KTsKCSAgZWxzZQoJICAgIHByaW50Zl9maWx0ZXJlZCAoIkl0IHN0b3BwZWQgYXQgYnJlYWtw
b2ludCAlZC5cbiIsIG51bSk7CgkgIG51bSA9IGJwc3RhdF9udW0gKCZicyk7Cgl9CiAgICB9
CiAgZWxzZSBpZiAoc3RvcF9zaWduYWwgIT0gVEFSR0VUX1NJR05BTF8wKQogICAgewogICAg
ICBwcmludGZfZmlsdGVyZWQgKCJJdCBzdG9wcGVkIHdpdGggc2lnbmFsICVzLCAlcy5cbiIs
CgkJICAgICAgIHRhcmdldF9zaWduYWxfdG9fbmFtZSAoc3RvcF9zaWduYWwpLAoJCSAgICAg
ICB0YXJnZXRfc2lnbmFsX3RvX3N0cmluZyAoc3RvcF9zaWduYWwpKTsKICAgIH0KCiAgaWYg
KCFmcm9tX3R0eSkKICAgIHByaW50Zl9maWx0ZXJlZCAoIlR5cGUgXCJpbmZvIHN0YWNrXCIg
b3IgXCJpbmZvIHJlZ2lzdGVyc1wiIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuIik7Cn0KDApz
dGF0aWMgdm9pZAplbnZpcm9ubWVudF9pbmZvICh2YXIsIGZyb21fdHR5KQogICAgIGNoYXIg
KnZhcjsKICAgICBpbnQgZnJvbV90dHk7CnsKICBpZiAodmFyKQogICAgewogICAgICByZWdp
c3RlciBjaGFyICp2YWwgPSBnZXRfaW5fZW52aXJvbiAoaW5mZXJpb3JfZW52aXJvbiwgdmFy
KTsKICAgICAgaWYgKHZhbCkKCXsKCSAgcHV0c19maWx0ZXJlZCAodmFyKTsKCSAgcHV0c19m
aWx0ZXJlZCAoIiA9ICIpOwoJICBwdXRzX2ZpbHRlcmVkICh2YWwpOwoJICBwdXRzX2ZpbHRl
cmVkICgiXG4iKTsKCX0KICAgICAgZWxzZQoJewoJICBwdXRzX2ZpbHRlcmVkICgiRW52aXJv
bm1lbnQgdmFyaWFibGUgXCIiKTsKCSAgcHV0c19maWx0ZXJlZCAodmFyKTsKCSAgcHV0c19m
aWx0ZXJlZCAoIlwiIG5vdCBkZWZpbmVkLlxuIik7Cgl9CiAgICB9CiAgZWxzZQogICAgewog
ICAgICByZWdpc3RlciBjaGFyICoqdmVjdG9yID0gZW52aXJvbl92ZWN0b3IgKGluZmVyaW9y
X2Vudmlyb24pOwogICAgICB3aGlsZSAoKnZlY3RvcikKCXsKCSAgcHV0c19maWx0ZXJlZCAo
KnZlY3RvcisrKTsKCSAgcHV0c19maWx0ZXJlZCAoIlxuIik7Cgl9CiAgICB9Cn0KCnN0YXRp
YyB2b2lkCnNldF9lbnZpcm9ubWVudF9jb21tYW5kIChhcmcsIGZyb21fdHR5KQogICAgIGNo
YXIgKmFyZzsKICAgICBpbnQgZnJvbV90dHk7CnsKICByZWdpc3RlciBjaGFyICpwLCAqdmFs
LCAqdmFyOwogIGludCBudWxsc2V0ID0gMDsKCiAgaWYgKGFyZyA9PSAwKQogICAgZXJyb3Jf
bm9fYXJnICgiZW52aXJvbm1lbnQgdmFyaWFibGUgYW5kIHZhbHVlIik7CgogIC8qIEZpbmQg
c2VwZXJhdGlvbiBiZXR3ZWVuIHZhcmlhYmxlIG5hbWUgYW5kIHZhbHVlICovCiAgcCA9IChj
aGFyICopIHN0cmNociAoYXJnLCAnPScpOwogIHZhbCA9IChjaGFyICopIHN0cmNociAoYXJn
LCAnICcpOwoKICBpZiAocCAhPSAwICYmIHZhbCAhPSAwKQogICAgewogICAgICAvKiBXZSBo
YXZlIGJvdGggYSBzcGFjZSBhbmQgYW4gZXF1YWxzLiAgSWYgdGhlIHNwYWNlIGlzIGJlZm9y
ZSB0aGUKCSBlcXVhbHMsIHdhbGsgZm9yd2FyZCBvdmVyIHRoZSBzcGFjZXMgdGlsIHdlIHNl
ZSBhIG5vbnNwYWNlIAoJIChwb3NzaWJseSB0aGUgZXF1YWxzKS4gKi8KICAgICAgaWYgKHAg
PiB2YWwpCgl3aGlsZSAoKnZhbCA9PSAnICcpCgkgIHZhbCsrOwoKICAgICAgLyogTm93IGlm
IHRoZSA9IGlzIGFmdGVyIHRoZSBjaGFyIGZvbGxvd2luZyB0aGUgc3BhY2VzLAoJIHRha2Ug
dGhlIGNoYXIgZm9sbG93aW5nIHRoZSBzcGFjZXMuICAqLwogICAgICBpZiAocCA+IHZhbCkK
CXAgPSB2YWwgLSAxOwogICAgfQogIGVsc2UgaWYgKHZhbCAhPSAwICYmIHAgPT0gMCkKICAg
IHAgPSB2YWw7CgogIGlmIChwID09IGFyZykKICAgIGVycm9yX25vX2FyZyAoImVudmlyb25t
ZW50IHZhcmlhYmxlIHRvIHNldCIpOwoKICBpZiAocCA9PSAwIHx8IHBbMV0gPT0gMCkKICAg
IHsKICAgICAgbnVsbHNldCA9IDE7CiAgICAgIGlmIChwID09IDApCglwID0gYXJnICsgc3Ry
bGVuIChhcmcpOwkvKiBTbyB0aGF0IHNhdmVzdHJpbmcgYmVsb3cgd2lsbCB3b3JrICovCiAg
ICB9CiAgZWxzZQogICAgewogICAgICAvKiBOb3Qgc2V0dGluZyB2YXJpYWJsZSB2YWx1ZSB0
byBudWxsICovCiAgICAgIHZhbCA9IHAgKyAxOwogICAgICB3aGlsZSAoKnZhbCA9PSAnICcg
fHwgKnZhbCA9PSAnXHQnKQoJdmFsKys7CiAgICB9CgogIHdoaWxlIChwICE9IGFyZyAmJiAo
cFstMV0gPT0gJyAnIHx8IHBbLTFdID09ICdcdCcpKSBwLS07CgogIHZhciA9IHNhdmVzdHJp
bmcgKGFyZywgcCAtIGFyZyk7CiAgaWYgKG51bGxzZXQpCiAgICB7CiAgICAgIHByaW50Zl9m
aWx0ZXJlZCAoIlNldHRpbmcgZW52aXJvbm1lbnQgdmFyaWFibGUgXCIlc1wiIHRvIG51bGwg
dmFsdWUuXG4iLCB2YXIpOwogICAgICBzZXRfaW5fZW52aXJvbiAoaW5mZXJpb3JfZW52aXJv
biwgdmFyLCAiIik7CiAgICB9CiAgZWxzZQogICAgc2V0X2luX2Vudmlyb24gKGluZmVyaW9y
X2Vudmlyb24sIHZhciwgdmFsKTsKICBmcmVlICh2YXIpOwp9CgpzdGF0aWMgdm9pZAp1bnNl
dF9lbnZpcm9ubWVudF9jb21tYW5kICh2YXIsIGZyb21fdHR5KQogICAgIGNoYXIgKnZhcjsK
ICAgICBpbnQgZnJvbV90dHk7CnsKICBpZiAodmFyID09IDApCiAgICB7CiAgICAgIC8qIElm
IHRoZXJlIGlzIG5vIGFyZ3VtZW50LCBkZWxldGUgYWxsIGVudmlyb25tZW50IHZhcmlhYmxl
cy4KCSBBc2sgZm9yIGNvbmZpcm1hdGlvbiBpZiByZWFkaW5nIGZyb20gdGhlIHRlcm1pbmFs
LiAgKi8KICAgICAgaWYgKCFmcm9tX3R0eSB8fCBxdWVyeSAoIkRlbGV0ZSBhbGwgZW52aXJv
bm1lbnQgdmFyaWFibGVzPyAiKSkKCXsKCSAgZnJlZV9lbnZpcm9uIChpbmZlcmlvcl9lbnZp
cm9uKTsKCSAgaW5mZXJpb3JfZW52aXJvbiA9IG1ha2VfZW52aXJvbiAoKTsKCX0KICAgIH0K
ICBlbHNlCiAgICB1bnNldF9pbl9lbnZpcm9uIChpbmZlcmlvcl9lbnZpcm9uLCB2YXIpOwp9
CgovKiBIYW5kbGUgdGhlIGV4ZWN1dGlvbiBwYXRoIChQQVRIIHZhcmlhYmxlKSAqLwoKc3Rh
dGljIGNvbnN0IGNoYXIgcGF0aF92YXJfbmFtZVtdID0gIlBBVEgiOwoKLyogQVJHU1VTRUQg
Ki8Kc3RhdGljIHZvaWQKcGF0aF9pbmZvIChhcmdzLCBmcm9tX3R0eSkKICAgICBjaGFyICph
cmdzOwogICAgIGludCBmcm9tX3R0eTsKewogIHB1dHNfZmlsdGVyZWQgKCJFeGVjdXRhYmxl
IGFuZCBvYmplY3QgZmlsZSBwYXRoOiAiKTsKICBwdXRzX2ZpbHRlcmVkIChnZXRfaW5fZW52
aXJvbiAoaW5mZXJpb3JfZW52aXJvbiwgcGF0aF92YXJfbmFtZSkpOwogIHB1dHNfZmlsdGVy
ZWQgKCJcbiIpOwp9CgovKiBBZGQgemVybyBvciBtb3JlIGRpcmVjdG9yaWVzIHRvIHRoZSBm
cm9udCBvZiB0aGUgZXhlY3V0aW9uIHBhdGguICAqLwoKc3RhdGljIHZvaWQKcGF0aF9jb21t
YW5kIChkaXJuYW1lLCBmcm9tX3R0eSkKICAgICBjaGFyICpkaXJuYW1lOwogICAgIGludCBm
cm9tX3R0eTsKewogIGNoYXIgKmV4ZWNfcGF0aDsKICBjaGFyICplbnY7CiAgZG9udF9yZXBl
YXQgKCk7CiAgZW52ID0gZ2V0X2luX2Vudmlyb24gKGluZmVyaW9yX2Vudmlyb24sIHBhdGhf
dmFyX25hbWUpOwogIC8qIENhbiBiZSBudWxsIGlmIHBhdGggaXMgbm90IHNldCAqLwogIGlm
ICghZW52KQogICAgZW52ID0gIiI7CiAgZXhlY19wYXRoID0gc3Ryc2F2ZSAoZW52KTsKICBt
b2RfcGF0aCAoZGlybmFtZSwgJmV4ZWNfcGF0aCk7CiAgc2V0X2luX2Vudmlyb24gKGluZmVy
aW9yX2Vudmlyb24sIHBhdGhfdmFyX25hbWUsIGV4ZWNfcGF0aCk7CiAgZnJlZSAoZXhlY19w
YXRoKTsKICBpZiAoZnJvbV90dHkpCiAgICBwYXRoX2luZm8gKChjaGFyICopTlVMTCwgZnJv
bV90dHkpOwp9CgwKLyogVGhlIGFycmF5IG9mIHJlZ2lzdGVyIG5hbWVzLiAgKi8KCmNoYXIg
KnJlZ19uYW1lc1tdID0gUkVHSVNURVJfTkFNRVM7CgovKiBQcmludCBvdXQgdGhlIG1hY2hp
bmUgcmVnaXN0ZXIgcmVnbnVtLiBJZiByZWdudW0gaXMgLTEsCiAgIHByaW50IGFsbCByZWdp
c3RlcnMgKGZwcmVncyA9PSAxKSBvciBhbGwgbm9uLWZsb2F0IHJlZ2lzdGVycwogICAoZnBy
ZWdzID09IDApLgoKICAgRm9yIG1vc3QgbWFjaGluZXMsIGhhdmluZyBhbGxfcmVnaXN0ZXJz
X2luZm8oKSBwcmludCB0aGUKICAgcmVnaXN0ZXIocykgb25lIHBlciBsaW5lIGlzIGdvb2Qg
ZW5vdWdoLiBJZiBhIGRpZmZlcmVudCBmb3JtYXQKICAgaXMgcmVxdWlyZWQsIChlZywgZm9y
IE1JUFMgb3IgUHlyYW1pZCA5MHgsIHdoaWNoIGJvdGggaGF2ZQogICBsb3RzIG9mIHJlZ3Mp
LCBvciB0aGVyZSBpcyBhbiBleGlzdGluZyBjb252ZW50aW9uIGZvciBzaG93aW5nCiAgIGFs
bCB0aGUgcmVnaXN0ZXJzLCBkZWZpbmUgdGhlIG1hY3JvIERPX1JFR0lTVEVSU19JTkZPKHJl
Z251bSwgZnApCiAgIHRvIHByb3ZpZGUgdGhhdCBmb3JtYXQuICAqLyAgCgojaWYgIWRlZmlu
ZWQgKERPX1JFR0lTVEVSU19JTkZPKQoKI2RlZmluZSBET19SRUdJU1RFUlNfSU5GTyhyZWdu
dW0sIGZwKSBkb19yZWdpc3RlcnNfaW5mbyhyZWdudW0sIGZwKQoKc3RhdGljIHZvaWQKZG9f
cmVnaXN0ZXJzX2luZm8gKHJlZ251bSwgZnByZWdzKQogICAgIGludCByZWdudW07CiAgICAg
aW50IGZwcmVnczsKewogIHJlZ2lzdGVyIGludCBpOwogIGludCBudW1yZWdzID0gQVJDSF9O
VU1fUkVHUzsKCiAgZm9yIChpID0gMDsgaSA8IG51bXJlZ3M7IGkrKykKICAgIHsKICAgICAg
Y2hhciByYXdfYnVmZmVyW01BWF9SRUdJU1RFUl9SQVdfU0laRV07CiAgICAgIGNoYXIgdmly
dHVhbF9idWZmZXJbTUFYX1JFR0lTVEVSX1ZJUlRVQUxfU0laRV07CgogICAgICAvKiBEZWNp
ZGUgYmV0d2VlbiBwcmludGluZyBhbGwgcmVncywgbm9uZmxvYXQgcmVncywgb3Igc3BlY2lm
aWMgcmVnLiAgKi8KICAgICAgaWYgKHJlZ251bSA9PSAtMSkgewoJaWYgKFRZUEVfQ09ERSAo
UkVHSVNURVJfVklSVFVBTF9UWVBFIChpKSkgPT0gVFlQRV9DT0RFX0ZMVCAmJiAhZnByZWdz
KQoJICBjb250aW51ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoaSAhPSByZWdudW0p
CgkgIGNvbnRpbnVlOwogICAgICB9CgogICAgICAvKiBJZiB0aGUgcmVnaXN0ZXIgbmFtZSBp
cyBlbXB0eSwgaXQgaXMgdW5kZWZpbmVkIGZvciB0aGlzCgkgcHJvY2Vzc29yLCBzbyBkb24n
dCBkaXNwbGF5IGFueXRoaW5nLiAgKi8KICAgICAgaWYgKHJlZ19uYW1lc1tpXSA9PSBOVUxM
IHx8ICoocmVnX25hbWVzW2ldKSA9PSAnXDAnKQoJY29udGludWU7CgogICAgICBmcHV0c19m
aWx0ZXJlZCAocmVnX25hbWVzW2ldLCBnZGJfc3Rkb3V0KTsKICAgICAgcHJpbnRfc3BhY2Vz
X2ZpbHRlcmVkICgxNSAtIHN0cmxlbiAocmVnX25hbWVzW2ldKSwgZ2RiX3N0ZG91dCk7Cgog
ICAgICAvKiBHZXQgdGhlIGRhdGEgaW4gcmF3IGZvcm1hdC4gICovCiAgICAgIGlmIChyZWFk
X3JlbGF0aXZlX3JlZ2lzdGVyX3Jhd19ieXRlcyAoaSwgcmF3X2J1ZmZlcikpCgl7CgkgIHBy
aW50Zl9maWx0ZXJlZCAoIkludmFsaWQgcmVnaXN0ZXIgY29udGVudHNcbiIpOwoJICBjb250
aW51ZTsKCX0KCiAgICAgIC8qIENvbnZlcnQgcmF3IGRhdGEgdG8gdmlydHVhbCBmb3JtYXQg
aWYgbmVjZXNzYXJ5LiAgKi8KI2lmZGVmIFJFR0lTVEVSX0NPTlZFUlRJQkxFCiAgICAgIGlm
IChSRUdJU1RFUl9DT05WRVJUSUJMRSAoaSkpCgl7CgkgIFJFR0lTVEVSX0NPTlZFUlRfVE9f
VklSVFVBTCAoaSwgUkVHSVNURVJfVklSVFVBTF9UWVBFIChpKSwKCQkJCSAgICAgICByYXdf
YnVmZmVyLCB2aXJ0dWFsX2J1ZmZlcik7Cgl9CiAgICAgIGVsc2UKI2VuZGlmCgltZW1jcHkg
KHZpcnR1YWxfYnVmZmVyLCByYXdfYnVmZmVyLAoJCVJFR0lTVEVSX1ZJUlRVQUxfU0laRSAo
aSkpOwoKICAgICAgLyogSWYgdmlydHVhbCBmb3JtYXQgaXMgZmxvYXRpbmcsIHByaW50IGl0
IHRoYXQgd2F5LCBhbmQgaW4gcmF3IGhleC4gICovCiAgICAgIGlmIChUWVBFX0NPREUgKFJF
R0lTVEVSX1ZJUlRVQUxfVFlQRSAoaSkpID09IFRZUEVfQ09ERV9GTFQpCgl7CgkgIHJlZ2lz
dGVyIGludCBqOwoKI2lmZGVmIElOVkFMSURfRkxPQVQKCSAgaWYgKElOVkFMSURfRkxPQVQg
KHZpcnR1YWxfYnVmZmVyLCBSRUdJU1RFUl9WSVJUVUFMX1NJWkUgKGkpKSkKCSAgICBwcmlu
dGZfZmlsdGVyZWQgKCI8aW52YWxpZCBmbG9hdD4iKTsKCSAgZWxzZQojZW5kaWYKCSAgICB2
YWxfcHJpbnQgKFJFR0lTVEVSX1ZJUlRVQUxfVFlQRSAoaSksIHZpcnR1YWxfYnVmZmVyLCAw
LAoJCSAgICAgICBnZGJfc3Rkb3V0LCAwLCAxLCAwLCBWYWxfcHJldHR5X2RlZmF1bHQpOwoK
CSAgcHJpbnRmX2ZpbHRlcmVkICgiXHQocmF3IDB4Iik7CgkgIGZvciAoaiA9IDA7IGogPCBS
RUdJU1RFUl9SQVdfU0laRSAoaSk7IGorKykKCSAgICB7CgkgICAgICByZWdpc3RlciBpbnQg
aWR4ID0gVEFSR0VUX0JZVEVfT1JERVIgPT0gQklHX0VORElBTiA/IGoKCQk6IFJFR0lTVEVS
X1JBV19TSVpFIChpKSAtIDEgLSBqOwoJICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiJTAyeCIs
ICh1bnNpZ25lZCBjaGFyKXJhd19idWZmZXJbaWR4XSk7CgkgICAgfQoJICBwcmludGZfZmls
dGVyZWQgKCIpIik7Cgl9CgovKiBGSVhNRSEgIHZhbF9wcmludCBwcm9iYWJseSBjYW4gaGFu
ZGxlIGFsbCBvZiB0aGVzZSBjYXNlcyBub3cuLi4gICovCgogICAgICAvKiBFbHNlIGlmIHZp
cnR1YWwgZm9ybWF0IGlzIHRvbyBsb25nIGZvciBwcmludGYsCgkgcHJpbnQgaW4gaGV4IGEg
Ynl0ZSBhdCBhIHRpbWUuICAqLwogICAgICBlbHNlIGlmIChSRUdJU1RFUl9WSVJUVUFMX1NJ
WkUgKGkpID4gKGludCkgc2l6ZW9mIChsb25nKSkKCXsKCSAgcmVnaXN0ZXIgaW50IGo7Cgkg
IHByaW50Zl9maWx0ZXJlZCAoIjB4Iik7CgkgIGZvciAoaiA9IDA7IGogPCBSRUdJU1RFUl9W
SVJUVUFMX1NJWkUgKGkpOyBqKyspCgkgICAgcHJpbnRmX2ZpbHRlcmVkICgiJTAyeCIsICh1
bnNpZ25lZCBjaGFyKXZpcnR1YWxfYnVmZmVyW2pdKTsKCX0KICAgICAgLyogRWxzZSBwcmlu
dCBhcyBpbnRlZ2VyIGluIGhleCBhbmQgaW4gZGVjaW1hbC4gICovCiAgICAgIGVsc2UKCXsK
CSAgdmFsX3ByaW50IChSRUdJU1RFUl9WSVJUVUFMX1RZUEUgKGkpLCB2aXJ0dWFsX2J1ZmZl
ciwgMCwKCQkgICAgIGdkYl9zdGRvdXQsICd4JywgMSwgMCwgVmFsX3ByZXR0eV9kZWZhdWx0
KTsKCSAgcHJpbnRmX2ZpbHRlcmVkICgiXHQiKTsKCSAgdmFsX3ByaW50IChSRUdJU1RFUl9W
SVJUVUFMX1RZUEUgKGkpLCB2aXJ0dWFsX2J1ZmZlciwgMCwKCQkgICAgIGdkYl9zdGRvdXQs
ICAgMCwgMSwgMCwgVmFsX3ByZXR0eV9kZWZhdWx0KTsKCX0KCiAgICAgIC8qIFRoZSBTUEFS
QyB3YW50cyB0byBwcmludCBldmVuLW51bWJlcmVkIGZsb2F0IHJlZ3MgYXMgZG91YmxlcwoJ
IGluIGFkZGl0aW9uIHRvIHByaW50aW5nIHRoZW0gYXMgZmxvYXRzLiAgKi8KI2lmZGVmIFBS
SU5UX1JFR0lTVEVSX0hPT0sKICAgICAgUFJJTlRfUkVHSVNURVJfSE9PSyAoaSk7CiNlbmRp
ZgoKICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiXG4iKTsKICAgIH0KfQojZW5kaWYgLyogbm8g
RE9fUkVHSVNURVJTX0lORk8uICAqLwoKc3RhdGljIHZvaWQKcmVnaXN0ZXJzX2luZm8gKGFk
ZHJfZXhwLCBmcHJlZ3MpCiAgICAgY2hhciAqYWRkcl9leHA7CiAgICAgaW50IGZwcmVnczsK
ewogIGludCByZWdudW0sIG51bXJlZ3M7CiAgcmVnaXN0ZXIgY2hhciAqZW5kOwoKICBpZiAo
IXRhcmdldF9oYXNfcmVnaXN0ZXJzKQogICAgZXJyb3IgKCJUaGUgcHJvZ3JhbSBoYXMgbm8g
cmVnaXN0ZXJzIG5vdy4iKTsKICBpZiAoc2VsZWN0ZWRfZnJhbWUgPT0gTlVMTCkKICAgIGVy
cm9yICgiTm8gc2VsZWN0ZWQgZnJhbWUuIik7CgogIGlmICghYWRkcl9leHApCiAgICB7CiAg
ICAgIERPX1JFR0lTVEVSU19JTkZPKC0xLCBmcHJlZ3MpOwogICAgICByZXR1cm47CiAgICB9
CgogIGRvCiAgICB7ICAgICAgCiAgICAgIGlmIChhZGRyX2V4cFswXSA9PSAnJCcpCglhZGRy
X2V4cCsrOwogICAgICBlbmQgPSBhZGRyX2V4cDsKICAgICAgd2hpbGUgKCplbmQgIT0gJ1ww
JyAmJiAqZW5kICE9ICcgJyAmJiAqZW5kICE9ICdcdCcpCgkrK2VuZDsKICAgICAgbnVtcmVn
cyA9IEFSQ0hfTlVNX1JFR1M7CiAgICAgIGZvciAocmVnbnVtID0gMDsgcmVnbnVtIDwgbnVt
cmVnczsgcmVnbnVtKyspCglpZiAoIXN0cm5jbXAgKGFkZHJfZXhwLCByZWdfbmFtZXNbcmVn
bnVtXSwgZW5kIC0gYWRkcl9leHApCgkgICAgJiYgc3RybGVuIChyZWdfbmFtZXNbcmVnbnVt
XSkgPT0gZW5kIC0gYWRkcl9leHApCgkgIGdvdG8gZm91bmQ7CiAgICAgIGlmICgqYWRkcl9l
eHAgPj0gJzAnICYmICphZGRyX2V4cCA8PSAnOScpCglyZWdudW0gPSBhdG9pIChhZGRyX2V4
cCk7CQkvKiBUYWtlIGEgbnVtYmVyICovCiAgICAgIGlmIChyZWdudW0gPj0gbnVtcmVncykJ
CS8qIEJhZCBuYW1lLCBvciBiYWQgbnVtYmVyICovCgllcnJvciAoIiUuKnM6IGludmFsaWQg
cmVnaXN0ZXIiLCBlbmQgLSBhZGRyX2V4cCwgYWRkcl9leHApOwoKZm91bmQ6CiAgICAgIERP
X1JFR0lTVEVSU19JTkZPKHJlZ251bSwgZnByZWdzKTsKCiAgICAgIGFkZHJfZXhwID0gZW5k
OwogICAgICB3aGlsZSAoKmFkZHJfZXhwID09ICcgJyB8fCAqYWRkcl9leHAgPT0gJ1x0JykK
CSsrYWRkcl9leHA7CiAgICB9IHdoaWxlICgqYWRkcl9leHAgIT0gJ1wwJyk7Cn0KCnN0YXRp
YyB2b2lkCmFsbF9yZWdpc3RlcnNfaW5mbyAoYWRkcl9leHAsIGZyb21fdHR5KQogICAgIGNo
YXIgKmFkZHJfZXhwOwogICAgIGludCBmcm9tX3R0eTsKewogIHJlZ2lzdGVyc19pbmZvIChh
ZGRyX2V4cCwgMSk7Cn0KCnN0YXRpYyB2b2lkCm5vZnBfcmVnaXN0ZXJzX2luZm8gKGFkZHJf
ZXhwLCBmcm9tX3R0eSkKICAgICBjaGFyICphZGRyX2V4cDsKICAgICBpbnQgZnJvbV90dHk7
CnsKICByZWdpc3RlcnNfaW5mbyAoYWRkcl9leHAsIDApOwp9CgwKLyoKICogVE9ETzoKICog
U2hvdWxkIHNhdmUvcmVzdG9yZSB0aGUgdHR5IHN0YXRlIHNpbmNlIGl0IG1pZ2h0IGJlIHRo
YXQgdGhlCiAqIHByb2dyYW0gdG8gYmUgZGVidWdnZWQgd2FzIHN0YXJ0ZWQgb24gdGhpcyB0
dHkgYW5kIGl0IHdhbnRzCiAqIHRoZSB0dHkgaW4gc29tZSBzdGF0ZSBvdGhlciB0aGFuIHdo
YXQgd2Ugd2FudC4gIElmIGl0J3MgcnVubmluZwogKiBvbiBhbm90aGVyIHRlcm1pbmFsIG9y
IHdpdGhvdXQgYSB0ZXJtaW5hbCwgdGhlbiBzYXZpbmcgYW5kCiAqIHJlc3RvcmluZyB0aGUg
dHR5IHN0YXRlIGlzIGEgaGFybWxlc3Mgbm8tb3AuCiAqIFRoaXMgb25seSBuZWVkcyB0byBi
ZSBkb25lIGlmIHdlIGFyZSBhdHRhY2hpbmcgdG8gYSBwcm9jZXNzLgogKi8KCi8qCiAgIGF0
dGFjaF9jb21tYW5kIC0tCiAgIHRha2VzIGEgcHJvZ3JhbSBzdGFydGVkIHVwIG91dHNpZGUg
b2YgZ2RiIGFuZCBgYGF0dGFjaGVzJycgdG8gaXQuCiAgIFRoaXMgc3RvcHMgaXQgY29sZCBp
biBpdHMgdHJhY2tzIGFuZCBhbGxvd3MgdXMgdG8gc3RhcnQgZGVidWdnaW5nIGl0LgogICBh
bmQgd2FpdCBmb3IgdGhlIHRyYWNlLXRyYXAgdGhhdCByZXN1bHRzIGZyb20gYXR0YWNoaW5n
LiAgKi8KCnZvaWQKYXR0YWNoX2NvbW1hbmQgKGFyZ3MsIGZyb21fdHR5KQogICAgIGNoYXIg
KmFyZ3M7CiAgICAgaW50IGZyb21fdHR5Owp7CiNpZmRlZiBTT0xJQl9BREQKICBleHRlcm4g
aW50IGF1dG9fc29saWJfYWRkOwojZW5kaWYKCiAgZG9udF9yZXBlYXQgKCk7CQkJLyogTm90
IGZvciB0aGUgZmFpbnQgb2YgaGVhcnQgKi8KCiAgaWYgKHRhcmdldF9oYXNfZXhlY3V0aW9u
KQogICAgewogICAgICBpZiAocXVlcnkgKCJBIHByb2dyYW0gaXMgYmVpbmcgZGVidWdnZWQg
YWxyZWFkeS4gIEtpbGwgaXQ/ICIpKQoJdGFyZ2V0X2tpbGwgKCk7CiAgICAgIGVsc2UKCWVy
cm9yICgiTm90IGtpbGxlZC4iKTsKICAgIH0KCiAgdGFyZ2V0X2F0dGFjaCAoYXJncywgZnJv
bV90dHkpOwoKICAvKiBTZXQgdXAgdGhlICJzYXZlZCB0ZXJtaW5hbCBtb2RlcyIgb2YgdGhl
IGluZmVyaW9yCiAgICAgYmFzZWQgb24gd2hhdCBtb2RlcyB3ZSBhcmUgc3RhcnRpbmcgaXQg
d2l0aC4gICovCiAgdGFyZ2V0X3Rlcm1pbmFsX2luaXQgKCk7CgogIC8qIEluc3RhbGwgaW5m
ZXJpb3IncyB0ZXJtaW5hbCBtb2Rlcy4gICovCiAgdGFyZ2V0X3Rlcm1pbmFsX2luZmVyaW9y
ICgpOwoKICAvKiBTZXQgdXAgZXhlY3V0aW9uIGNvbnRleHQgdG8ga25vdyB0aGF0IHdlIHNo
b3VsZCByZXR1cm4gZnJvbQogICAgIHdhaXRfZm9yX2luZmVyaW9yIGFzIHNvb24gYXMgdGhl
IHRhcmdldCByZXBvcnRzIGEgc3RvcC4gICovCiAgaW5pdF93YWl0X2Zvcl9pbmZlcmlvciAo
KTsKICBjbGVhcl9wcm9jZWVkX3N0YXR1cyAoKTsKICBzdG9wX3Nvb25fcXVpZXRseSA9IDE7
CgogIC8qIE5vIHRyYXBzIGFyZSBnZW5lcmF0ZWQgd2hlbiBhdHRhY2hpbmcgdG8gaW5mZXJp
b3IgdW5kZXIgTWFjaCAzCiAgICAgb3IgR05VIGh1cmQuICAqLwojaWZuZGVmIEFUVEFDSF9O
T19XQUlUCiAgd2FpdF9mb3JfaW5mZXJpb3IgKCk7CiNlbmRpZgoKI2lmZGVmIFNPTElCX0FE
RAogIGlmIChhdXRvX3NvbGliX2FkZCkKICAgIHsKICAgICAgLyogQWRkIHNoYXJlZCBsaWJy
YXJ5IHN5bWJvbHMgZnJvbSB0aGUgbmV3bHkgYXR0YWNoZWQgcHJvY2VzcywgaWYgYW55LiAg
Ki8KICAgICAgU09MSUJfQUREICgoY2hhciAqKTAsIGZyb21fdHR5LCAoc3RydWN0IHRhcmdl
dF9vcHMgKikwKTsKICAgICAgcmVfZW5hYmxlX2JyZWFrcG9pbnRzX2luX3NobGlicyAoKTsK
ICAgIH0KI2VuZGlmCgogIG5vcm1hbF9zdG9wICgpOwp9CgovKgogKiBkZXRhY2hfY29tbWFu
ZCAtLQogKiB0YWtlcyBhIHByb2dyYW0gcHJldmlvdXNseSBhdHRhY2hlZCB0byBhbmQgZGV0
YWNoZXMgaXQuCiAqIFRoZSBwcm9ncmFtIHJlc3VtZXMgZXhlY3V0aW9uIGFuZCB3aWxsIG5v
IGxvbmdlciBzdG9wCiAqIG9uIHNpZ25hbHMsIGV0Yy4gIFdlIGJldHRlciBub3QgaGF2ZSBs
ZWZ0IGFueSBicmVha3BvaW50cwogKiBpbiB0aGUgcHJvZ3JhbSBvciBpdCdsbCBkaWUgd2hl
biBpdCBoaXRzIG9uZS4gIEZvciB0aGlzCiAqIHRvIHdvcmssIGl0IG1heSBiZSBuZWNlc3Nh
cnkgZm9yIHRoZSBwcm9jZXNzIHRvIGhhdmUgYmVlbgogKiBwcmV2aW91c2x5IGF0dGFjaGVk
LiAgSXQgKm1pZ2h0KiB3b3JrIGlmIHRoZSBwcm9ncmFtIHdhcwogKiBzdGFydGVkIHZpYSB0
aGUgbm9ybWFsIHB0cmFjZSAoUFRSQUNFX1RSQUNFTUUpLgogKi8KCnN0YXRpYyB2b2lkCmRl
dGFjaF9jb21tYW5kIChhcmdzLCBmcm9tX3R0eSkKICAgICBjaGFyICphcmdzOwogICAgIGlu
dCBmcm9tX3R0eTsKewogIGRvbnRfcmVwZWF0ICgpOwkJCS8qIE5vdCBmb3IgdGhlIGZhaW50
IG9mIGhlYXJ0ICovCiAgdGFyZ2V0X2RldGFjaCAoYXJncywgZnJvbV90dHkpOwp9CgovKiBB
UkdTVVNFRCAqLwpzdGF0aWMgdm9pZApmbG9hdF9pbmZvIChhZGRyX2V4cCwgZnJvbV90dHkp
CiAgICAgY2hhciAqYWRkcl9leHA7CiAgICAgaW50IGZyb21fdHR5Owp7CiNpZmRlZiBGTE9B
VF9JTkZPCglGTE9BVF9JTkZPOwojZWxzZQoJcHJpbnRmX2ZpbHRlcmVkICgiTm8gZmxvYXRp
bmcgcG9pbnQgaW5mbyBhdmFpbGFibGUgZm9yIHRoaXMgcHJvY2Vzc29yLlxuIik7CiNlbmRp
Zgp9CgwKLyogQVJHU1VTRUQgKi8Kc3RhdGljIHZvaWQKdW5zZXRfY29tbWFuZCAoYXJncywg
ZnJvbV90dHkpCiAgICAgY2hhciAqYXJnczsKICAgICBpbnQgZnJvbV90dHk7CnsKICBwcmlu
dGZfZmlsdGVyZWQgKCJcInVuc2V0XCIgbXVzdCBiZSBmb2xsb3dlZCBieSB0aGUgbmFtZSBv
ZiBhbiB1bnNldCBzdWJjb21tYW5kLlxuIik7CiAgaGVscF9saXN0ICh1bnNldGxpc3QsICJ1
bnNldCAiLCAtMSwgZ2RiX3N0ZG91dCk7Cn0KCnZvaWQKX2luaXRpYWxpemVfaW5mY21kICgp
CnsKICBzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqYzsKICAKICBhZGRfY29tICgidHR5Iiwg
Y2xhc3NfcnVuLCB0dHlfY29tbWFuZCwKCSAgICJTZXQgdGVybWluYWwgZm9yIGZ1dHVyZSBy
dW5zIG9mIHByb2dyYW0gYmVpbmcgZGVidWdnZWQuIik7CgogIGFkZF9zaG93X2Zyb21fc2V0
CiAgICAoYWRkX3NldF9jbWQgKCJhcmdzIiwgY2xhc3NfcnVuLCB2YXJfc3RyaW5nX25vZXNj
YXBlLCAoY2hhciAqKSZpbmZlcmlvcl9hcmdzLAoJCSAgCiJTZXQgYXJndW1lbnRzIHRvIGdp
dmUgcHJvZ3JhbSBiZWluZyBkZWJ1Z2dlZCB3aGVuIGl0IGlzIHN0YXJ0ZWQuXG5cCkZvbGxv
dyB0aGlzIGNvbW1hbmQgd2l0aCBhbnkgbnVtYmVyIG9mIGFyZ3MsIHRvIGJlIHBhc3NlZCB0
byB0aGUgcHJvZ3JhbS4iLAoJCSAgJnNldGxpc3QpLAogICAgICZzaG93bGlzdCk7CgogIGMg
PSBhZGRfY21kCiAgICAoImVudmlyb25tZW50Iiwgbm9fY2xhc3MsIGVudmlyb25tZW50X2lu
Zm8sCiAgICAgIlRoZSBlbnZpcm9ubWVudCB0byBnaXZlIHRoZSBwcm9ncmFtLCBvciBvbmUg
dmFyaWFibGUncyB2YWx1ZS5cblwKV2l0aCBhbiBhcmd1bWVudCBWQVIsIHByaW50cyB0aGUg
dmFsdWUgb2YgZW52aXJvbm1lbnQgdmFyaWFibGUgVkFSIHRvXG5cCmdpdmUgdGhlIHByb2dy
YW0gYmVpbmcgZGVidWdnZWQuICBXaXRoIG5vIGFyZ3VtZW50cywgcHJpbnRzIHRoZSBlbnRp
cmVcblwKZW52aXJvbm1lbnQgdG8gYmUgZ2l2ZW4gdG8gdGhlIHByb2dyYW0uIiwgJnNob3ds
aXN0KTsKICBjLT5jb21wbGV0ZXIgPSBub29wX2NvbXBsZXRlcjsKCiAgYWRkX3ByZWZpeF9j
bWQgKCJ1bnNldCIsIG5vX2NsYXNzLCB1bnNldF9jb21tYW5kLAoJCSAgIkNvbXBsZW1lbnQg
dG8gY2VydGFpbiBcInNldFwiIGNvbW1hbmRzIiwKCQkgICZ1bnNldGxpc3QsICJ1bnNldCAi
LCAwLCAmY21kbGlzdCk7CiAgCiAgYyA9IGFkZF9jbWQgKCJlbnZpcm9ubWVudCIsIGNsYXNz
X3J1biwgdW5zZXRfZW52aXJvbm1lbnRfY29tbWFuZCwKCSAgICAgICJDYW5jZWwgZW52aXJv
bm1lbnQgdmFyaWFibGUgVkFSIGZvciB0aGUgcHJvZ3JhbS5cblwKVGhpcyBkb2VzIG5vdCBh
ZmZlY3QgdGhlIHByb2dyYW0gdW50aWwgdGhlIG5leHQgXCJydW5cIiBjb21tYW5kLiIsCgkg
ICAmdW5zZXRsaXN0KTsKICBjLT5jb21wbGV0ZXIgPSBub29wX2NvbXBsZXRlcjsKCiAgYyA9
IGFkZF9jbWQgKCJlbnZpcm9ubWVudCIsIGNsYXNzX3J1biwgc2V0X2Vudmlyb25tZW50X2Nv
bW1hbmQsCgkgICAgICAgIlNldCBlbnZpcm9ubWVudCB2YXJpYWJsZSB2YWx1ZSB0byBnaXZl
IHRoZSBwcm9ncmFtLlxuXApBcmd1bWVudHMgYXJlIFZBUiBWQUxVRSB3aGVyZSBWQVIgaXMg
dmFyaWFibGUgbmFtZSBhbmQgVkFMVUUgaXMgdmFsdWUuXG5cClZBTFVFUyBvZiBlbnZpcm9u
bWVudCB2YXJpYWJsZXMgYXJlIHVuaW50ZXJwcmV0ZWQgc3RyaW5ncy5cblwKVGhpcyBkb2Vz
IG5vdCBhZmZlY3QgdGhlIHByb2dyYW0gdW50aWwgdGhlIG5leHQgXCJydW5cIiBjb21tYW5k
LiIsCgkgICAmc2V0bGlzdCk7CiAgYy0+Y29tcGxldGVyID0gbm9vcF9jb21wbGV0ZXI7CiAK
ICBhZGRfY29tICgicGF0aCIsIGNsYXNzX2ZpbGVzLCBwYXRoX2NvbW1hbmQsCiAgICAgICAi
QWRkIGRpcmVjdG9yeSBESVIocykgdG8gYmVnaW5uaW5nIG9mIHNlYXJjaCBwYXRoIGZvciBv
YmplY3QgZmlsZXMuXG5cCiRjd2QgaW4gdGhlIHBhdGggbWVhbnMgdGhlIGN1cnJlbnQgd29y
a2luZyBkaXJlY3RvcnkuXG5cClRoaXMgcGF0aCBpcyBlcXVpdmFsZW50IHRvIHRoZSAkUEFU
SCBzaGVsbCB2YXJpYWJsZS4gIEl0IGlzIGEgbGlzdCBvZlxuXApkaXJlY3Rvcmllcywgc2Vw
YXJhdGVkIGJ5IGNvbG9ucy4gIFRoZXNlIGRpcmVjdG9yaWVzIGFyZSBzZWFyY2hlZCB0byBm
aW5kXG5cCmZ1bGx5IGxpbmtlZCBleGVjdXRhYmxlIGZpbGVzIGFuZCBzZXBhcmF0ZWx5IGNv
bXBpbGVkIG9iamVjdCBmaWxlcyBhcyBuZWVkZWQuIik7CgogIGMgPSBhZGRfY21kICgicGF0
aHMiLCBub19jbGFzcywgcGF0aF9pbmZvLAoJICAgICJDdXJyZW50IHNlYXJjaCBwYXRoIGZv
ciBmaW5kaW5nIG9iamVjdCBmaWxlcy5cblwKJGN3ZCBpbiB0aGUgcGF0aCBtZWFucyB0aGUg
Y3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS5cblwKVGhpcyBwYXRoIGlzIGVxdWl2YWxlbnQg
dG8gdGhlICRQQVRIIHNoZWxsIHZhcmlhYmxlLiAgSXQgaXMgYSBsaXN0IG9mXG5cCmRpcmVj
dG9yaWVzLCBzZXBhcmF0ZWQgYnkgY29sb25zLiAgVGhlc2UgZGlyZWN0b3JpZXMgYXJlIHNl
YXJjaGVkIHRvIGZpbmRcblwKZnVsbHkgbGlua2VkIGV4ZWN1dGFibGUgZmlsZXMgYW5kIHNl
cGFyYXRlbHkgY29tcGlsZWQgb2JqZWN0IGZpbGVzIGFzIG5lZWRlZC4iLCAmc2hvd2xpc3Qp
OwogIGMtPmNvbXBsZXRlciA9IG5vb3BfY29tcGxldGVyOwoKIGFkZF9jb20gKCJhdHRhY2gi
LCBjbGFzc19ydW4sIGF0dGFjaF9jb21tYW5kLAogCSAgICJBdHRhY2ggdG8gYSBwcm9jZXNz
IG9yIGZpbGUgb3V0c2lkZSBvZiBHREIuXG5cClRoaXMgY29tbWFuZCBhdHRhY2hlcyB0byBh
bm90aGVyIHRhcmdldCwgb2YgdGhlIHNhbWUgdHlwZSBhcyB5b3VyIGxhc3RcblwKYHRhcmdl
dCcgY29tbWFuZCAoYGluZm8gZmlsZXMnIHdpbGwgc2hvdyB5b3VyIHRhcmdldCBzdGFjayku
XG5cClRoZSBjb21tYW5kIG1heSB0YWtlIGFzIGFyZ3VtZW50IGEgcHJvY2VzcyBpZCBvciBh
IGRldmljZSBmaWxlLlxuXApGb3IgYSBwcm9jZXNzIGlkLCB5b3UgbXVzdCBoYXZlIHBlcm1p
c3Npb24gdG8gc2VuZCB0aGUgcHJvY2VzcyBhIHNpZ25hbCxcblwKYW5kIGl0IG11c3QgaGF2
ZSB0aGUgc2FtZSBlZmZlY3RpdmUgdWlkIGFzIHRoZSBkZWJ1Z2dlci5cblwKV2hlbiB1c2lu
ZyBcImF0dGFjaFwiLCB5b3Ugc2hvdWxkIHVzZSB0aGUgXCJmaWxlXCIgY29tbWFuZCB0byBz
cGVjaWZ5XG5cCnRoZSBwcm9ncmFtIHJ1bm5pbmcgaW4gdGhlIHByb2Nlc3MsIGFuZCB0byBs
b2FkIGl0cyBzeW1ib2wgdGFibGUuIik7CgogIGFkZF9jb20gKCJkZXRhY2giLCBjbGFzc19y
dW4sIGRldGFjaF9jb21tYW5kLAoJICAgIkRldGFjaCBhIHByb2Nlc3Mgb3IgZmlsZSBwcmV2
aW91c2x5IGF0dGFjaGVkLlxuXApJZiBhIHByb2Nlc3MsIGl0IGlzIG5vIGxvbmdlciB0cmFj
ZWQsIGFuZCBpdCBjb250aW51ZXMgaXRzIGV4ZWN1dGlvbi4gIElmIHlvdVxuXAp3ZXJlIGRl
YnVnZ2luZyBhIGZpbGUsIHRoZSBmaWxlIGlzIGNsb3NlZCBhbmQgZ2RiIG5vIGxvbmdlciBh
Y2Nlc3NlcyBpdC4iKTsKCiAgYWRkX2NvbSAoInNpZ25hbCIsIGNsYXNzX3J1biwgc2lnbmFs
X2NvbW1hbmQsCgkgICAiQ29udGludWUgcHJvZ3JhbSBnaXZpbmcgaXQgc2lnbmFsIHNwZWNp
ZmllZCBieSB0aGUgYXJndW1lbnQuXG5cCkFuIGFyZ3VtZW50IG9mIFwiMFwiIG1lYW5zIGNv
bnRpbnVlIHByb2dyYW0gd2l0aG91dCBnaXZpbmcgaXQgYSBzaWduYWwuIik7CgogIGFkZF9j
b20gKCJzdGVwaSIsIGNsYXNzX3J1biwgc3RlcGlfY29tbWFuZCwKCSAgICJTdGVwIG9uZSBp
bnN0cnVjdGlvbiBleGFjdGx5LlxuXApBcmd1bWVudCBOIG1lYW5zIGRvIHRoaXMgTiB0aW1l
cyAob3IgdGlsbCBwcm9ncmFtIHN0b3BzIGZvciBhbm90aGVyIHJlYXNvbikuIik7CiAgYWRk
X2NvbV9hbGlhcyAoInNpIiwgInN0ZXBpIiwgY2xhc3NfYWxpYXMsIDApOwoKICBhZGRfY29t
ICgibmV4dGkiLCBjbGFzc19ydW4sIG5leHRpX2NvbW1hbmQsCgkgICAiU3RlcCBvbmUgaW5z
dHJ1Y3Rpb24sIGJ1dCBwcm9jZWVkIHRocm91Z2ggc3Vicm91dGluZSBjYWxscy5cblwKQXJn
dW1lbnQgTiBtZWFucyBkbyB0aGlzIE4gdGltZXMgKG9yIHRpbGwgcHJvZ3JhbSBzdG9wcyBm
b3IgYW5vdGhlciByZWFzb24pLiIpOwogIGFkZF9jb21fYWxpYXMgKCJuaSIsICJuZXh0aSIs
IGNsYXNzX2FsaWFzLCAwKTsKCiAgYWRkX2NvbSAoImZpbmlzaCIsIGNsYXNzX3J1biwgZmlu
aXNoX2NvbW1hbmQsCgkgICAiRXhlY3V0ZSB1bnRpbCBzZWxlY3RlZCBzdGFjayBmcmFtZSBy
ZXR1cm5zLlxuXApVcG9uIHJldHVybiwgdGhlIHZhbHVlIHJldHVybmVkIGlzIHByaW50ZWQg
YW5kIHB1dCBpbiB0aGUgdmFsdWUgaGlzdG9yeS4iKTsKCiAgYWRkX2NvbSAoIm5leHQiLCBj
bGFzc19ydW4sIG5leHRfY29tbWFuZCwKCSAgICJTdGVwIHByb2dyYW0sIHByb2NlZWRpbmcg
dGhyb3VnaCBzdWJyb3V0aW5lIGNhbGxzLlxuXApMaWtlIHRoZSBcInN0ZXBcIiBjb21tYW5k
IGFzIGxvbmcgYXMgc3Vicm91dGluZSBjYWxscyBkbyBub3QgaGFwcGVuO1xuXAp3aGVuIHRo
ZXkgZG8sIHRoZSBjYWxsIGlzIHRyZWF0ZWQgYXMgb25lIGluc3RydWN0aW9uLlxuXApBcmd1
bWVudCBOIG1lYW5zIGRvIHRoaXMgTiB0aW1lcyAob3IgdGlsbCBwcm9ncmFtIHN0b3BzIGZv
ciBhbm90aGVyIHJlYXNvbikuIik7CiAgYWRkX2NvbV9hbGlhcyAoIm4iLCAibmV4dCIsIGNs
YXNzX3J1biwgMSk7CgogIGFkZF9jb20gKCJzdGVwIiwgY2xhc3NfcnVuLCBzdGVwX2NvbW1h
bmQsCgkgICAiU3RlcCBwcm9ncmFtIHVudGlsIGl0IHJlYWNoZXMgYSBkaWZmZXJlbnQgc291
cmNlIGxpbmUuXG5cCkFyZ3VtZW50IE4gbWVhbnMgZG8gdGhpcyBOIHRpbWVzIChvciB0aWxs
IHByb2dyYW0gc3RvcHMgZm9yIGFub3RoZXIgcmVhc29uKS4iKTsKICBhZGRfY29tX2FsaWFz
ICgicyIsICJzdGVwIiwgY2xhc3NfcnVuLCAxKTsKCiAgYWRkX2NvbSAoInVudGlsIiwgY2xh
c3NfcnVuLCB1bnRpbF9jb21tYW5kLAoJICAgIkV4ZWN1dGUgdW50aWwgdGhlIHByb2dyYW0g
cmVhY2hlcyBhIHNvdXJjZSBsaW5lIGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudFxuXApvciBh
IHNwZWNpZmllZCBsaW5lIG9yIGFkZHJlc3Mgb3IgZnVuY3Rpb24gKHNhbWUgYXJncyBhcyBi
cmVhayBjb21tYW5kKS5cblwKRXhlY3V0aW9uIHdpbGwgYWxzbyBzdG9wIHVwb24gZXhpdCBm
cm9tIHRoZSBjdXJyZW50IHN0YWNrIGZyYW1lLiIpOwogIGFkZF9jb21fYWxpYXMgKCJ1Iiwg
InVudGlsIiwgY2xhc3NfcnVuLCAxKTsKICAKICBhZGRfY29tICgianVtcCIsIGNsYXNzX3J1
biwganVtcF9jb21tYW5kLAoJICAgIkNvbnRpbnVlIHByb2dyYW0gYmVpbmcgZGVidWdnZWQg
YXQgc3BlY2lmaWVkIGxpbmUgb3IgYWRkcmVzcy5cblwKR2l2ZSBhcyBhcmd1bWVudCBlaXRo
ZXIgTElORU5VTSBvciAqQUREUiwgd2hlcmUgQUREUiBpcyBhbiBleHByZXNzaW9uXG5cCmZv
ciBhbiBhZGRyZXNzIHRvIHN0YXJ0IGF0LiIpOwoKICBhZGRfY29tICgiY29udGludWUiLCBj
bGFzc19ydW4sIGNvbnRpbnVlX2NvbW1hbmQsCgkgICAiQ29udGludWUgcHJvZ3JhbSBiZWlu
ZyBkZWJ1Z2dlZCwgYWZ0ZXIgc2lnbmFsIG9yIGJyZWFrcG9pbnQuXG5cCklmIHByb2NlZWRp
bmcgZnJvbSBicmVha3BvaW50LCBhIG51bWJlciBOIG1heSBiZSB1c2VkIGFzIGFuIGFyZ3Vt
ZW50LFxuXAp3aGljaCBtZWFucyB0byBzZXQgdGhlIGlnbm9yZSBjb3VudCBvZiB0aGF0IGJy
ZWFrcG9pbnQgdG8gTiAtIDEgKHNvIHRoYXRcblwKdGhlIGJyZWFrcG9pbnQgd29uJ3QgYnJl
YWsgdW50aWwgdGhlIE50aCB0aW1lIGl0IGlzIHJlYWNoZWQpLiIpOwogIGFkZF9jb21fYWxp
YXMgKCJjIiwgImNvbnQiLCBjbGFzc19ydW4sIDEpOwogIGFkZF9jb21fYWxpYXMgKCJmZyIs
ICJjb250IiwgY2xhc3NfcnVuLCAxKTsKCiAgYWRkX2NvbSAoInJ1biIsIGNsYXNzX3J1biwg
cnVuX2NvbW1hbmQsCgkgICAiU3RhcnQgZGVidWdnZWQgcHJvZ3JhbS4gIFlvdSBtYXkgc3Bl
Y2lmeSBhcmd1bWVudHMgdG8gZ2l2ZSBpdC5cblwKQXJncyBtYXkgaW5jbHVkZSBcIipcIiwg
b3IgXCJbLi4uXVwiOyB0aGV5IGFyZSBleHBhbmRlZCB1c2luZyBcInNoXCIuXG5cCklucHV0
IGFuZCBvdXRwdXQgcmVkaXJlY3Rpb24gd2l0aCBcIj5cIiwgXCI8XCIsIG9yIFwiPj5cIiBh
cmUgYWxzbyBhbGxvd2VkLlxuXG5cCldpdGggbm8gYXJndW1lbnRzLCB1c2VzIGFyZ3VtZW50
cyBsYXN0IHNwZWNpZmllZCAod2l0aCBcInJ1blwiIG9yIFwic2V0IGFyZ3NcIikuXG5cClRv
IGNhbmNlbCBwcmV2aW91cyBhcmd1bWVudHMgYW5kIHJ1biB3aXRoIG5vIGFyZ3VtZW50cyxc
blwKdXNlIFwic2V0IGFyZ3NcIiB3aXRob3V0IGFyZ3VtZW50cy4iKTsKICBhZGRfY29tX2Fs
aWFzICgiciIsICJydW4iLCBjbGFzc19ydW4sIDEpOwoKICBhZGRfaW5mbyAoInJlZ2lzdGVy
cyIsIG5vZnBfcmVnaXN0ZXJzX2luZm8sCiAgICAiTGlzdCBvZiBpbnRlZ2VyIHJlZ2lzdGVy
cyBhbmQgdGhlaXIgY29udGVudHMsIGZvciBzZWxlY3RlZCBzdGFjayBmcmFtZS5cblwKUmVn
aXN0ZXIgbmFtZSBhcyBhcmd1bWVudCBtZWFucyBkZXNjcmliZSBvbmx5IHRoYXQgcmVnaXN0
ZXIuIik7CgogIGFkZF9pbmZvICgiYWxsLXJlZ2lzdGVycyIsIGFsbF9yZWdpc3RlcnNfaW5m
bywKIkxpc3Qgb2YgYWxsIHJlZ2lzdGVycyBhbmQgdGhlaXIgY29udGVudHMsIGZvciBzZWxl
Y3RlZCBzdGFjayBmcmFtZS5cblwKUmVnaXN0ZXIgbmFtZSBhcyBhcmd1bWVudCBtZWFucyBk
ZXNjcmliZSBvbmx5IHRoYXQgcmVnaXN0ZXIuIik7CgogIGFkZF9pbmZvICgicHJvZ3JhbSIs
IHByb2dyYW1faW5mbywKCSAgICAiRXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgcHJvZ3JhbS4i
KTsKCiAgYWRkX2luZm8gKCJmbG9hdCIsIGZsb2F0X2luZm8sCgkgICAgIlByaW50IHRoZSBz
dGF0dXMgb2YgdGhlIGZsb2F0aW5nIHBvaW50IHVuaXRcbiIpOwoKICBpbmZlcmlvcl9hcmdz
ID0gc2F2ZXN0cmluZyAoIiIsIDEpOwkvKiBJbml0aWFsbHkgbm8gYXJncyAqLwogIGluZmVy
aW9yX2Vudmlyb24gPSBtYWtlX2Vudmlyb24gKCk7CiAgaW5pdF9lbnZpcm9uIChpbmZlcmlv
cl9lbnZpcm9uKTsKfQo=
--------------5AAB448694FE76ACD5311E42
Content-Type: text/x-vcard; charset=us-ascii; name="vcard.vcf"
Content-Transfer-Encoding: 7bit
Content-Description: Card for Stuart Williams
Content-Disposition: attachment; filename="vcard.vcf"

begin:          vcard
fn:             Stuart Williams
n:              Williams;Stuart
org:            Hewlett-Packard Laboratories
adr:            Hewlett-Packard Laboratories;;Filton Road, ;Stoke Gifford,;Bristol;BS12 6QZ;UK
email;internet: skw AT hplb DOT hpl DOT hp DOT com
tel;work:       +44 1179 228285
tel;fax:        +44 1179 229286
x-mozilla-cpt:  ;0
x-mozilla-html: FALSE
end:            vcard


--------------5AAB448694FE76ACD5311E42--

-
For help on using this list (especially unsubscribing), send a message to
"gnu-win32-request AT cygnus DOT com" with one line of text: "help".

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019