From gekauft@hoc.net Mon Aug 2 13:50:13 2004 From: gekauft@hoc.net (Christian Kristukat) Date: Mon, 02 Aug 2004 14:50:13 +0200 Subject: [f2py] bug in the method determineexprtype (crackfortran.py) Message-ID: <410E3885.8060606@hoc.net> I had the same problem recently and I thought this might be due to bad fortran code (which I know nothing about) but after looking at the crackfortran.py I found a solution which seems to work though I'm not sure if this is the intended behaviour. change if t: (around line 5) to if type(t) == dict: Regards, Christian Kristukat From pinted@tiscali.be Tue Aug 3 09:22:03 2004 From: pinted@tiscali.be (Didrik Pinte) Date: Tue, 03 Aug 2004 10:22:03 +0200 Subject: [f2py] bug in the method determineexprtype (crackfortran.py) In-Reply-To: <410E3885.8060606@hoc.net> References: <410E3885.8060606@hoc.net> Message-ID: <1091521323.12999.3.camel@geru-itea> Le lun 02/08/2004 =E0 14:50, Christian Kristukat a =E9crit : > I had the same problem recently and I thought this might be due to bad=20 > fortran code (which I know nothing about) but after looking at the=20 > crackfortran.py I found a solution which seems to work though I'm not=20 > sure if this is the intended behaviour. >=20 > change > if t: (around line 5) > to > if type(t) =3D=3D dict: >=20 > Regards, Christian Kristukat Hi, Thank you for the hint. It seems to be a workaround but not a real solution. When using this, it works for the problematic file but I have the following problem on another file now : Line #28 in mvMomVecAG2g.f:" PARAMETER(MAXNDIM =3D 20, MAXNL=3D101, MAXNMOM=3D10, MAXCDIM =3D (MAXNDIM*(MAXNDIM+1))/2 )" determineexprtype: could not determine expressions ('(MAXNDIM*(MAXNDIM+1))/2') type. Traceback (most recent call last): File "/usr/bin/f2py2.3", line 4, in ? f2py2e.main() File "/usr/lib/python2.3/site-packages/f2py2e/f2py2e.py", line 651, in main run_main(sys.argv[1:]) File "/usr/lib/python2.3/site-packages/f2py2e/f2py2e.py", line 398, in run_main postlist=3Dcallcrackfortran(files,options) File "/usr/lib/python2.3/site-packages/f2py2e/f2py2e.py", line 337, in callcrackfortran postlist=3Dcrackfortran.crackfortran(files) File "/usr/lib/python2.3/site-packages/f2py2e/crackfortran.py", line 2099, in crackfortran readfortrancode(files,crackline) File "/usr/lib/python2.3/site-packages/f2py2e/crackfortran.py", line 366, in readfortrancode dowithline(finalline) File "/usr/lib/python2.3/site-packages/f2py2e/crackfortran.py", line 555, in crackline analyzeline(m,pat[1],line) File "/usr/lib/python2.3/site-packages/f2py2e/crackfortran.py", line 806, in analyzeline if t['typespec']=3D=3D'real': KeyError: 'typespec' Didrik From charlie@iwec.com Tue Aug 10 17:02:40 2004 From: charlie@iwec.com (Charlie Taylor) Date: Tue, 10 Aug 2004 09:02:40 -0700 Subject: [f2py] file-like objects in parameter list Message-ID: This is a multi-part message in MIME format. ------=_NextPart_000_000C_01C47EB8.CA9C9C40 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit I have the desire to pass StringIO and tempfile objects into a FORTRAN routine. Is there a recommended way to pass a file-like object through a parameter list and connect it to a UNIT number inside the FORTRAN code? ------=_NextPart_000_000C_01C47EB8.CA9C9C40 Content-Type: text/html; charset="us-ascii" Content-Transfer-Encoding: quoted-printable

I have the desire to pass StringIO and tempfile = objects into a FORTRAN routine.

 

Is there a recommended way to pass a file-like object = through a parameter list and connect it to a UNIT number inside the FORTRAN = code?

------=_NextPart_000_000C_01C47EB8.CA9C9C40-- From pearu@cens.ioc.ee Tue Aug 10 20:51:16 2004 From: pearu@cens.ioc.ee (Pearu Peterson) Date: Tue, 10 Aug 2004 22:51:16 +0300 (EEST) Subject: [f2py] problem with : TypeError: unsubscriptable object In-Reply-To: <1089736844.12039.41.camel@geru-itea> Message-ID: On Tue, 13 Jul 2004, Didrik Pinte wrote: > Hi, i'm trying to use the fortran library developped by Alan Genz > (http://www.math.wsu.edu/faculty/genz/software/software.html). > > When trying to translate this file > http://www.math.wsu.edu/faculty/genz/software/dcuhre.f, I have the > following exception : > ----------------------------------------------------------------------- > did@geru-itea:~/projets/python/bmelibpy1.0c/mvnlib$ f2py2.3 --lower > dcuhre.f > Reading fortran codes... > Reading file 'dcuhre.f' > Traceback (most recent call last): > 805, in analy zeline > if t['typespec']=='real': > TypeError: unsubscriptable object > ----------------------------------------------------------------------- > > I'm running a Debian/Sid system with f2py Version: 2.39.235_1693. Is it > a problem in the file ? I've successfully translated example files from > the online user guide. I don't get the above error with the CVS version of f2py (I remember that I fixed similar problem some time ago). So, try updateing f2py from CVS. Anyways, here follows how I wrapped the dcuhre subroutine: 1) Create initial .pyf file: f2py -m foo dcuhre.f only: dcuhre -h foo.pyf 2) Modify by adding call funsub(ndim,a,numfun,result) line to the `subroutine dcuhre` block 3) Build extension module: f2py foo.pyf -c dcuhre.f 4) In Python: In [1]: import foo In [2]: print foo.__doc__ This module 'foo' is auto-generated with f2py (version:2.39.235_1756). Functions: dcuhre(a,b,minpts,maxpts,funsub,epsabs,epsrel,key,restar,result,abserr,neval,ifail,work,ndim=len(a),numfun=len(result),nw=len(work),funsub_extra_args=()) . That was a quick and dirty way. I am sure that the interface described in foo.pyf can be made more userfrienly than the above. HTH, Pearu From pearu@cens.ioc.ee Wed Aug 11 07:14:10 2004 From: pearu@cens.ioc.ee (Pearu Peterson) Date: Wed, 11 Aug 2004 09:14:10 +0300 (EEST) Subject: [f2py] file-like objects in parameter list In-Reply-To: Message-ID: On Tue, 10 Aug 2004, Charlie Taylor wrote: > I have the desire to pass StringIO and tempfile objects into a FORTRAN > routine. AFAIK, file objects in C and Fortran have different structures and therefore passing C file objects to Fortran is not a trivial task. > Is there a recommended way to pass a file-like object through a parameter > list and connect it to a UNIT number inside the FORTRAN code? I am not sure, never tried that myself. Pearu From pinted@tiscali.be Wed Aug 11 20:10:48 2004 From: pinted@tiscali.be (Didrik Pinte) Date: Wed, 11 Aug 2004 21:10:48 +0200 Subject: [f2py] module extension building problem In-Reply-To: References: Message-ID: <1092251448.20650.4.camel@geru-itea> Hi, I'm facing a little problem while building my extension module. The following warnings appears : /tmp/tmpLySnHJ/uvProNR.o(.text+0xac0): In function `uvfinit_': : multiple definition of `uvfinit_' /tmp/tmpLySnHJ/uvMomNR.o(.text+0xb40): first defined here /usr/bin/ld: Warning: size of symbol `uvfinit_' changed from 91 in /tmp/tmpLySnHJ/uvMomNR.o to 70 in /tmp/tmpLySnHJ/uvProNR.o /tmp/tmpLySnHJ/uvProNR.o(.text+0xa70): In function `uvf_': : multiple definition of `uvf_' /tmp/tmpLySnHJ/uvMomNR.o(.text+0xae0): first defined here /usr/bin/ld: Warning: size of symbol `uvf_' changed from 83 in /tmp/tmpLySnHJ/uvMomNR.o to 65 in /tmp/tmpLySnHJ/uvProNR.o And I receive the following error at the end : collect2: ld returned 1 exit status error: Command "/usr/bin/g77-3.3 -shared /tmp/tmpLySnHJ/tmp/tmpLySnHJ/src/mvnlibmodule.o /tmp/tmpLySnHJ/tmp/tmpLySnHJ/src/fortranobject.o /tmp/tmpLySnHJ/dcuhre.o /tmp/tmpLySnHJ/mvMomVecAG2.o /tmp/tmpLySnHJ/mvnPack.o /tmp/tmpLySnHJ/mvProAG2.o /tmp/tmpLySnHJ/polint3.o /tmp/tmpLySnHJ/qromb3.o /tmp/tmpLySnHJ/symInv.o /tmp/tmpLySnHJ/trapzd3.o /tmp/tmpLySnHJ/uvMomNR.o /tmp/tmpLySnHJ/uvProNR.o -lg2c-pic -o ./mvnlib.so" failed with exit status 1 Does anybody know where is the problem ? My .pyf file seems correct. I can provide the source code, signature file and full output of the module building. I'm running the last CVS version of f2py, numpy 23.3 and python 2.3.4. Thank you in advance for any help Didrik From pearu@cens.ioc.ee Wed Aug 11 21:45:24 2004 From: pearu@cens.ioc.ee (Pearu Peterson) Date: Wed, 11 Aug 2004 23:45:24 +0300 (EEST) Subject: [f2py] module extension building problem In-Reply-To: <1092251448.20650.4.camel@geru-itea> Message-ID: On Wed, 11 Aug 2004, Didrik Pinte wrote: > Hi, > > I'm facing a little problem while building my extension module. > > The following warnings appears : > > /tmp/tmpLySnHJ/uvProNR.o(.text+0xac0): In function `uvfinit_': > : multiple definition of `uvfinit_' > /tmp/tmpLySnHJ/uvMomNR.o(.text+0xb40): first defined here > /usr/bin/ld: Warning: size of symbol `uvfinit_' changed from 91 in > /tmp/tmpLySnHJ/uvMomNR.o to 70 in /tmp/tmpLySnHJ/uvProNR.o > /tmp/tmpLySnHJ/uvProNR.o(.text+0xa70): In function `uvf_': > : multiple definition of `uvf_' > /tmp/tmpLySnHJ/uvMomNR.o(.text+0xae0): first defined here > /usr/bin/ld: Warning: size of symbol `uvf_' changed from 83 in > /tmp/tmpLySnHJ/uvMomNR.o to 65 in /tmp/tmpLySnHJ/uvProNR.o > Does anybody know where is the problem ? Check why there are multiple definitions of some symbols and try to fix it. May be you shouldn't link both uvProNR.o and uvMomNR.o to the same extension module. > My .pyf file seems correct. > > I can provide the source code, signature file and full output of the > module building. Please include also f2py command line. Pearu From pinted@tiscali.be Thu Aug 12 10:23:45 2004 From: pinted@tiscali.be (Didrik Pinte) Date: Thu, 12 Aug 2004 11:23:45 +0200 Subject: [f2py] module extension building problem In-Reply-To: References: Message-ID: <1092302625.21372.14.camel@geru-itea> Le mer 11/08/2004 =E0 22:45, Pearu Peterson a =E9crit : > On Wed, 11 Aug 2004, Didrik Pinte wrote: >=20 > Check why there are multiple definitions of some symbols and try to fix = =20 > it. May be you shouldn't link both uvProNR.o and uvMomNR.o to the same > extension module. I've just checked the two .f files. I don't know Fortran coding so... I must admit I do not understand quiet well what it means. In both files we have the following information : dummy=3DuvfInit(softPdfType,Nl,Limi,Prob,C,Mean) ... DOUBLE PRECISION uvfInit ... ENTRY uvfInit(softPdfType,Nl,Limi,Prob,C,Mean,As,bs,p) But, you're wright, I do not have to compile those file together (see below). >=20 > Please include also f2py command line. >=20 > Pearu I think it could be interesting for you to know what i'm doing. I'm trying to translate a Matlab toolbox called BMELib into Python. That toolbox uses the fortran Genz functions. Reading the matlab function that compile the fortran code, I do think I need to do three different modules : --------------------------------------------------------------------- disp('Compiling the FORTRAN functions in the mvnlib directory'); disp('Compiling uvProNR'); mex -O uvProNR.f uvProNRg.f qromb3.f trapzd3.f polint3.f disp('Compiling uvMomNR'); mex -O uvMomNR.f uvMomNRg.f qromb3.f trapzd3.f polint3.f disp('Compiling mvMomVecAG2'); mex -O mvMomVecAG2.f mvMomVecAG2g.f dcuhre.f symInv.f disp('Compiling mvProAG2'); mex -O mvProAG2.f mvProAG2g.f dcuhre.f symInv.f disp('Compiling mvnAG1'); mex -O mvnPack.f mvnAG1g.f -output mvnAG1 disp('Compilation finished. Use MVNLIBtest to test the newly compiled functions'); --------------------------------------------------------------------- So, what I must do is to create one Python interface for each "mex line" of the previous matlab code. I've tested the last line using mvnPack.f, it works perfectly. Sorry for the too quick posts ... and thanks a lot for your really good advices. Didrik From jnh@llnl.gov Mon Aug 30 19:57:16 2004 From: jnh@llnl.gov (Jeff Hagelberg) Date: Mon, 30 Aug 2004 11:57:16 -0700 Subject: [f2py] Newbie: Using free form support Message-ID: <5.0.2.1.2.20040830114925.01bcec80@mail.llnl.gov> Hi, I am really new at using f2py and am trying to figure out how to tell it that my code is in free form. Does anyone know? I'm am trying to generate wrappers for my fortran code, and I get the error "Are you sure that this code is in fix form?". My code is not in fixed form, but I don't know how to tell that to f2py. I'm using F2PY-2.39.235_1693. [jhglbrg@mcr37 pythonTest]$ ~/usr/bin/f2py --verbose --overwrite-signature -m miranda *.f Reading fortran codes... Reading file 'interfaces.f' Traceback (most recent call last): File "/g/g14/jhglbrg/usr/bin/f2py", line 4, in ? f2py2e.main() File "/g/g14/jhglbrg/usr/lib/python/f2py2e/f2py2e.py", line 651, in main run_main(sys.argv[1:]) File "/g/g14/jhglbrg/usr/lib/python/f2py2e/f2py2e.py", line 398, in run_main postlist=callcrackfortran(files,options) File "/g/g14/jhglbrg/usr/lib/python/f2py2e/f2py2e.py", line 337, in callcrackfortran postlist=crackfortran.crackfortran(files) File "/g/g14/jhglbrg/usr/lib/python/f2py2e/crackfortran.py", line 2098, in crackfortran readfortrancode(files,crackline) File "/g/g14/jhglbrg/usr/lib/python/f2py2e/crackfortran.py", line 314, in readfortrancode raise 'readfortrancode: Found non-(space,digit) char in the first column.\n\tAre you sure that this code is in fix form?\n\tline=%s'%`l` readfortrancode: Found non-(space,digit) char in the first column. Are you sure that this code is in fix form? line='MODULE interfaces' Also, does it matter whether the files end in .f90 or .f? Thanks for any help!! -Jeff From pearu@cens.ioc.ee Mon Aug 30 20:48:52 2004 From: pearu@cens.ioc.ee (Pearu Peterson) Date: Mon, 30 Aug 2004 22:48:52 +0300 (EEST) Subject: [f2py] Newbie: Using free form support In-Reply-To: <5.0.2.1.2.20040830114925.01bcec80@mail.llnl.gov> Message-ID: On Mon, 30 Aug 2004, Jeff Hagelberg wrote: > Hi, > > > I am really new at using f2py and am trying to figure out how to tell it > that my code is in free form. Does anyone know? Use the following comment ! -*- f90 -*- in the first line of the file to specify that the file is in free format. > I'm am trying to generate wrappers for my fortran code, and I get the error > "Are you sure that this code is in fix form?". My code is not in fixed > form, but I don't know how to tell that to f2py. I'm using F2PY-2.39.235_1693. > > [jhglbrg@mcr37 pythonTest]$ ~/usr/bin/f2py --verbose --overwrite-signature > -m miranda *.f > Reading fortran codes... > Reading file 'interfaces.f' > Are you sure that this code is in fix form? > line='MODULE interfaces' > > Also, does it matter whether the files end in .f90 or .f? Yes, unless the first comment line of the file contains one of the following strings -*- f90 -*- - file contains F90 code in free format -*- fix -*- - file contains F90 code in fixed format -*- fortran -*- - file contains F77 code If not then it is assumed that files with extensions .for, .ftn, .f77, .f contain F77 code .f90, .f95, etc contain F90 code (the format will be detected automatically) HTH, Pearu From charlie@ezweave.com Thu Aug 12 18:33:44 2004 From: charlie@ezweave.com (Charlie Taylor) Date: Thu, 12 Aug 2004 10:33:44 -0700 Subject: [f2py] sharing temp files between python and FORTRAN Message-ID: <001101c48092$846ddeb0$7c78a8c0@CHARLIEXP> Is there a recommended approach to sharing a temp file between the calling python code and an f2py generated pyd file? Is it necessary to: 1) have python generate a temp file name 2) pass the file name as a CHARACTER variable to FORTRAN 3) have FORTRAN treat it as a permanent file 4) finally have python do any cleanup (i.e. manipulate and delete the file) From mtiller@ford.com Tue Aug 31 16:30:45 2004 From: mtiller@ford.com (Tiller, Michael (M.M.)) Date: Tue, 31 Aug 2004 11:30:45 -0400 Subject: [f2py] Error message Message-ID: This is a multi-part message in MIME format. ------_=_NextPart_001_01C48F6F.7BEFF18A Content-Type: multipart/alternative; boundary="----_=_NextPart_002_01C48F6F.7BEFF18A" ------_=_NextPart_002_01C48F6F.7BEFF18A Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable I'm using F2PY to try and build an extension for some FORTRAN code. F2PY looks awesome. However, I'm having some problems with the compilation stage (this is with f2py version 2.39.235_1695). I've generated the code but when I try to compile with the "-c" flag, I get some errors. The errors are from the C compiler complaining about undeclared identifiers. As far as I can tell, the compiler is correct. In other words, the generated code form f2py seems to be trying to use variables that it never declared. If you look at line 1300 of the attached file, you will see a variable "fcn_nofargs" that is used but never declared. Any suggestions? Thanks.=20 -- Mike <>=20 ------_=_NextPart_002_01C48F6F.7BEFF18A Content-Type: text/html; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Error message

Im using F2PY to try and build an extension for some = FORTRAN code.  F2PY looks awesome.  However, = Im having some problems with the compilation = stage = (this is with f2py version 2.39.235_1695).  = Ive generated the code but when I try to compile with = the -c flag, I get some errors.  The errors are from the C = compiler complaining about undeclared identifiers.  As far as I can = tell, the compiler is correct.  In other words, the generated code = form f2py seems to be trying to use variables that it never = declared.  If you look at line 1300 of the attached file, you will = see a variable fcn_nofargs that is used but never = declared.

Any = suggestions?

Thanks.

--

Mike

<<opt_sqpmodule.c>>

------_=_NextPart_002_01C48F6F.7BEFF18A-- ------_=_NextPart_001_01C48F6F.7BEFF18A Content-Type: application/octet-stream; name="opt_sqpmodule.c" Content-Transfer-Encoding: base64 Content-Description: opt_sqpmodule.c Content-Disposition: attachment; filename="opt_sqpmodule.c" LyogRmlsZTogb3B0X3NxcG1vZHVsZS5jDQogKiBUaGlzIGZpbGUgaXMgYXV0by1nZW5lcmF0ZWQg d2l0aCBmMnB5ICh2ZXJzaW9uOjIuMzkuMjM1XzE2OTUpLg0KICogZjJweSBpcyBhIEZvcnRyYW4g dG8gUHl0aG9uIEludGVyZmFjZSBHZW5lcmF0b3IgKEZQSUcpLCBTZWNvbmQgRWRpdGlvbiwNCiAq IHdyaXR0ZW4gYnkgUGVhcnUgUGV0ZXJzb24gPHBlYXJ1QGNlbnMuaW9jLmVlPi4NCiAqIFNlZSBo dHRwOi8vY2Vucy5pb2MuZWUvcHJvamVjdHMvZjJweTJlLw0KICogR2VuZXJhdGlvbiBkYXRlOiBU dWUgQXVnIDMxIDExOjE5OjQ5IDIwMDQNCiAqICRSZXZpc2lvbjokDQogKiAkRGF0ZTokDQogKiBE byBub3QgZWRpdCB0aGlzIGZpbGUgZGlyZWN0bHkgdW5sZXNzIHlvdSBrbm93IHdoYXQgeW91IGFy ZSBkb2luZyEhIQ0KICovDQojaWZkZWYgX19jcGx1c3BsdXMNCmV4dGVybiAiQyIgew0KI2VuZGlm DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKiBTZWUgZjJweTJlL2NmdW5jcy5weTogaW5jbHVk ZXMgKioqKioqKioqKioqKioqKioqKioqKiovDQojaW5jbHVkZSAiUHl0aG9uLmgiDQojaW5jbHVk ZSAiZm9ydHJhbm9iamVjdC5oIg0KI2luY2x1ZGUgPHNldGptcC5oPg0KI2luY2x1ZGUgPG1hdGgu aD4NCg0KLyoqKioqKioqKioqKioqKiogU2VlIGYycHkyZS9ydWxlcy5weTogbW9kX3J1bGVzWydt b2R1bGVib2R5J10gKioqKioqKioqKioqKioqKi8NCnN0YXRpYyBQeU9iamVjdCAqb3B0X3NxcF9l cnJvcjsNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqIFNlZSBmMnB5MmUvY2Z1bmNzLnB5OiB0 eXBlZGVmcyAqKioqKioqKioqKioqKioqKioqKioqKi8NCnR5cGVkZWYgc2lnbmVkIGNoYXIgc2ln bmVkX2NoYXI7DQoNCi8qKioqKioqKioqKioqKioqKioqKioqIFNlZSBmMnB5MmUvY2Z1bmNzLnB5 OiBjcHBtYWNyb3MgKioqKioqKioqKioqKioqKioqKioqKi8NCiNkZWZpbmUgUFJJTlRQWU9CSkVS UihvYmopXA0KICBmcHJpbnRmKHN0ZGVyciwib3B0X3NxcC5lcnJvciBpcyByZWxhdGVkIHRvICIp O1wNCiAgUHlPYmplY3RfUHJpbnQoKFB5T2JqZWN0ICopb2JqLHN0ZGVycixQeV9QUklOVF9SQVcp O1wNCiAgZnByaW50ZihzdGRlcnIsIlxuIik7DQoNCiNkZWZpbmUgcHlvYmpfZnJvbV9kb3VibGUx KHYpIChQeUZsb2F0X0Zyb21Eb3VibGUodikpDQojZGVmaW5lIHB5b2JqX2Zyb21faW50MSh2KSAo UHlJbnRfRnJvbUxvbmcodikpDQojaWZkZWYgREVCVUdDRlVOQ1MNCiNkZWZpbmUgQ0ZVTkNTTUVT UyhtZXNzKSBmcHJpbnRmKHN0ZGVyciwiZGVidWctY2FwaToibWVzcyk7DQojZGVmaW5lIENGVU5D U01FU1NQWShtZXNzLG9iaikgQ0ZVTkNTTUVTUyhtZXNzKSBcDQogIFB5T2JqZWN0X1ByaW50KChQ eU9iamVjdCAqKW9iaixzdGRlcnIsUHlfUFJJTlRfUkFXKTtcDQogIGZwcmludGYoc3RkZXJyLCJc biIpOw0KI2Vsc2UNCiNkZWZpbmUgQ0ZVTkNTTUVTUyhtZXNzKQ0KI2RlZmluZSBDRlVOQ1NNRVNT UFkobWVzcyxvYmopDQojZW5kaWYNCg0KI2lmIGRlZmluZWQoUFJFUEVORF9GT1JUUkFOKQ0KI2lm IGRlZmluZWQoTk9fQVBQRU5EX0ZPUlRSQU4pDQojaWYgZGVmaW5lZChVUFBFUkNBU0VfRk9SVFJB TikNCiNkZWZpbmUgRl9GVU5DKGYsRikgXyMjRg0KI2Vsc2UNCiNkZWZpbmUgRl9GVU5DKGYsRikg XyMjZg0KI2VuZGlmDQojZWxzZQ0KI2lmIGRlZmluZWQoVVBQRVJDQVNFX0ZPUlRSQU4pDQojZGVm aW5lIEZfRlVOQyhmLEYpIF8jI0YjI18NCiNlbHNlDQojZGVmaW5lIEZfRlVOQyhmLEYpIF8jI2Yj I18NCiNlbmRpZg0KI2VuZGlmDQojZWxzZQ0KI2lmIGRlZmluZWQoTk9fQVBQRU5EX0ZPUlRSQU4p DQojaWYgZGVmaW5lZChVUFBFUkNBU0VfRk9SVFJBTikNCiNkZWZpbmUgRl9GVU5DKGYsRikgRg0K I2Vsc2UNCiNkZWZpbmUgRl9GVU5DKGYsRikgZg0KI2VuZGlmDQojZWxzZQ0KI2lmIGRlZmluZWQo VVBQRVJDQVNFX0ZPUlRSQU4pDQojZGVmaW5lIEZfRlVOQyhmLEYpIEYjI18NCiNlbHNlDQojZGVm aW5lIEZfRlVOQyhmLEYpIGYjI18NCiNlbmRpZg0KI2VuZGlmDQojZW5kaWYNCg0KI2RlZmluZSBy YW5rKHZhcikgdmFyICMjIF9SYW5rDQojZGVmaW5lIHNoYXBlKHZhcixkaW0pIHZhciAjIyBfRGlt c1tkaW1dDQojZGVmaW5lIG9sZF9yYW5rKHZhcikgKCgoUHlBcnJheU9iamVjdCAqKShjYXBpXyAj IyB2YXIgIyMgX3RtcCkpLT5uZCkNCiNkZWZpbmUgb2xkX3NoYXBlKHZhcixkaW0pICgoKFB5QXJy YXlPYmplY3QgKikoY2FwaV8gIyMgdmFyICMjIF90bXApKS0+ZGltZW5zaW9uc1tkaW1dKQ0KI2Rl ZmluZSBmc2hhcGUodmFyLGRpbSkgc2hhcGUodmFyLHJhbmsodmFyKS1kaW0tMSkNCiNkZWZpbmUg bGVuKHZhcikgc2hhcGUodmFyLDApDQojZGVmaW5lIGZsZW4odmFyKSBmc2hhcGUodmFyLDApDQoj ZGVmaW5lIHNpemUodmFyKSBQeUFycmF5X1NJWkUoKFB5QXJyYXlPYmplY3QgKikoY2FwaV8gIyMg dmFyICMjIF90bXApKQ0KI2RlZmluZSBpbmRleChpKSBjYXBpX2kgIyMgaQ0KI2RlZmluZSBzbGVu KHZhcikgY2FwaV8gIyMgdmFyICMjIF9sZW4NCg0KI2RlZmluZSBDSEVDS1NDQUxBUihjaGVjayx0 Y2hlY2ssbmFtZSxzaG93LHZhcilcDQogIGlmICghKGNoZWNrKSkge1wNCiAgICBQeUVycl9TZXRT dHJpbmcob3B0X3NxcF9lcnJvciwiKCJ0Y2hlY2siKSBmYWlsZWQgZm9yICJuYW1lKTtcDQogICAg ZnByaW50ZihzdGRlcnIsc2hvdyJcbiIsdmFyKTtcDQogICAgLypnb3RvIGNhcGlfZmFpbDsqL1wN CiAgfSBlbHNlIA0KI2lmbmRlZiBNQVgNCiNkZWZpbmUgTUFYKGEsYikgKChhID4gYikgPyAoYSkg OiAoYikpDQojZW5kaWYNCiNpZm5kZWYgTUlODQojZGVmaW5lIE1JTihhLGIpICgoYSA8IGIpID8g KGEpIDogKGIpKQ0KI2VuZGlmDQoNCiNkZWZpbmUgU1dBUChhLGIsdCkge1wNCiAgdCAqYztcDQog IGMgPSBhO1wNCiAgYSA9IGI7XA0KICBiID0gYzt9DQoNCiNpZiBkZWZpbmVkKFBSRVBFTkRfRk9S VFJBTikNCiNpZiBkZWZpbmVkKE5PX0FQUEVORF9GT1JUUkFOKQ0KI2lmIGRlZmluZWQoVVBQRVJD QVNFX0ZPUlRSQU4pDQojZGVmaW5lIEZfV1JBUFBFREZVTkMoZixGKSBfRjJQWVdSQVAjI0YNCiNl bHNlDQojZGVmaW5lIEZfV1JBUFBFREZVTkMoZixGKSBfZjJweXdyYXAjI2YNCiNlbmRpZg0KI2Vs c2UNCiNpZiBkZWZpbmVkKFVQUEVSQ0FTRV9GT1JUUkFOKQ0KI2RlZmluZSBGX1dSQVBQRURGVU5D KGYsRikgX0YyUFlXUkFQIyNGIyNfDQojZWxzZQ0KI2RlZmluZSBGX1dSQVBQRURGVU5DKGYsRikg X2YycHl3cmFwIyNmIyNfDQojZW5kaWYNCiNlbmRpZg0KI2Vsc2UNCiNpZiBkZWZpbmVkKE5PX0FQ UEVORF9GT1JUUkFOKQ0KI2lmIGRlZmluZWQoVVBQRVJDQVNFX0ZPUlRSQU4pDQojZGVmaW5lIEZf V1JBUFBFREZVTkMoZixGKSBGMlBZV1JBUCMjRg0KI2Vsc2UNCiNkZWZpbmUgRl9XUkFQUEVERlVO QyhmLEYpIGYycHl3cmFwIyNmDQojZW5kaWYNCiNlbHNlDQojaWYgZGVmaW5lZChVUFBFUkNBU0Vf Rk9SVFJBTikNCiNkZWZpbmUgRl9XUkFQUEVERlVOQyhmLEYpIEYyUFlXUkFQIyNGIyNfDQojZWxz ZQ0KI2RlZmluZSBGX1dSQVBQRURGVU5DKGYsRikgZjJweXdyYXAjI2YjI18NCiNlbmRpZg0KI2Vu ZGlmDQojZW5kaWYNCg0KDQovKioqKioqKioqKioqKioqKioqKioqKioqIFNlZSBmMnB5MmUvY2Z1 bmNzLnB5OiBjZnVuY3MgKioqKioqKioqKioqKioqKioqKioqKioqLw0Kc3RhdGljIGludCBpbnRf ZnJvbV9weW9iaihpbnQqIHYsUHlPYmplY3QgKm9iaixjb25zdCBjaGFyICplcnJtZXNzKSB7DQog IFB5T2JqZWN0KiB0bXAgPSBOVUxMOw0KICBpZiAoUHlJbnRfQ2hlY2sob2JqKSkgew0KICAgICp2 ID0gKGludClQeUludF9BU19MT05HKG9iaik7DQogICAgcmV0dXJuIDE7DQogIH0NCiAgdG1wID0g UHlOdW1iZXJfSW50KG9iaik7DQogIGlmICh0bXApIHsNCiAgICAqdiA9IFB5SW50X0FTX0xPTkco dG1wKTsNCiAgICBQeV9ERUNSRUYodG1wKTsNCiAgICByZXR1cm4gMTsNCiAgfQ0KICBpZiAoUHlD b21wbGV4X0NoZWNrKG9iaikpDQogICAgdG1wID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhvYmos InJlYWwiKTsNCiAgZWxzZSBpZiAoUHlTdHJpbmdfQ2hlY2sob2JqKSkNCiAgICAvKnBhc3MqLzsN CiAgZWxzZSBpZiAoUHlTZXF1ZW5jZV9DaGVjayhvYmopKQ0KICAgIHRtcCA9IFB5U2VxdWVuY2Vf R2V0SXRlbShvYmosMCk7DQogIGlmICh0bXApIHsNCiAgICBQeUVycl9DbGVhcigpOw0KICAgIGlm IChpbnRfZnJvbV9weW9iaih2LHRtcCxlcnJtZXNzKSkge1B5X0RFQ1JFRih0bXApOyByZXR1cm4g MTt9DQogICAgUHlfREVDUkVGKHRtcCk7DQogIH0NCiAgew0KICAgIFB5T2JqZWN0KiBlcnIgPSBQ eUVycl9PY2N1cnJlZCgpOw0KICAgIGlmIChlcnI9PU5VTEwpIGVyciA9IG9wdF9zcXBfZXJyb3I7 DQogICAgUHlFcnJfU2V0U3RyaW5nKGVycixlcnJtZXNzKTsNCiAgfQ0KICByZXR1cm4gMDsNCn0N Cg0Kc3RhdGljIGludCBkb3VibGVfZnJvbV9weW9iaihkb3VibGUqIHYsUHlPYmplY3QgKm9iaixj b25zdCBjaGFyICplcnJtZXNzKSB7DQogIFB5T2JqZWN0KiB0bXAgPSBOVUxMOw0KICBpZiAoUHlG bG9hdF9DaGVjayhvYmopKSB7DQojaWZkZWYgX19zZ2kNCiAgICAqdiA9IFB5RmxvYXRfQXNEb3Vi bGUob2JqKTsNCiNlbHNlDQogICAgKnYgPSBQeUZsb2F0X0FTX0RPVUJMRShvYmopOw0KI2VuZGlm DQogICAgcmV0dXJuIDE7DQogIH0NCiAgdG1wID0gUHlOdW1iZXJfRmxvYXQob2JqKTsNCiAgaWYg KHRtcCkgew0KI2lmZGVmIF9fc2dpDQogICAgKnYgPSBQeUZsb2F0X0FzRG91YmxlKHRtcCk7DQoj ZWxzZQ0KICAgICp2ID0gUHlGbG9hdF9BU19ET1VCTEUodG1wKTsNCiNlbmRpZg0KICAgIFB5X0RF Q1JFRih0bXApOw0KICAgIHJldHVybiAxOw0KICB9DQogIGlmIChQeUNvbXBsZXhfQ2hlY2sob2Jq KSkNCiAgICB0bXAgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG9iaiwicmVhbCIpOw0KICBlbHNl IGlmIChQeVN0cmluZ19DaGVjayhvYmopKQ0KICAgIC8qcGFzcyovOw0KICBlbHNlIGlmIChQeVNl cXVlbmNlX0NoZWNrKG9iaikpDQogICAgdG1wID0gUHlTZXF1ZW5jZV9HZXRJdGVtKG9iaiwwKTsN CiAgaWYgKHRtcCkgew0KICAgIFB5RXJyX0NsZWFyKCk7DQogICAgaWYgKGRvdWJsZV9mcm9tX3B5 b2JqKHYsdG1wLGVycm1lc3MpKSB7UHlfREVDUkVGKHRtcCk7IHJldHVybiAxO30NCiAgICBQeV9E RUNSRUYodG1wKTsNCiAgfQ0KICB7DQogICAgUHlPYmplY3QqIGVyciA9IFB5RXJyX09jY3VycmVk KCk7DQogICAgaWYgKGVycj09TlVMTCkgZXJyID0gb3B0X3NxcF9lcnJvcjsNCiAgICBQeUVycl9T ZXRTdHJpbmcoZXJyLGVycm1lc3MpOw0KICB9DQogIHJldHVybiAwOw0KfQ0KDQpzdGF0aWMgaW50 IGNyZWF0ZV9jYl9hcmdsaXN0KFB5T2JqZWN0KiBmdW4sUHlUdXBsZU9iamVjdCogeGEsY29uc3Qg aW50IG1heG5vZmFyZ3MsY29uc3QgaW50IG5vZm9wdGFyZ3MsaW50ICpub2ZhcmdzLFB5VHVwbGVP YmplY3QgKiphcmdzLGNvbnN0IGNoYXIgKmVycm1lc3MpIHsNCiAgUHlPYmplY3QgKnRtcCA9IE5V TEw7DQogIFB5T2JqZWN0ICp0bXBfZnVuID0gTlVMTDsNCiAgaW50IHRvdCxvcHQsZXh0LHNpeixp LGRpPTA7DQogIENGVU5DU01FU1MoImNyZWF0ZV9jYl9hcmdsaXN0XG4iKTsNCiAgdG90PW9wdD1l eHQ9c2l6PTA7DQogIC8qIEdldCB0aGUgdG90YWwgbnVtYmVyIG9mIGFyZ3VtZW50cyAqLw0KICBp ZiAoUHlGdW5jdGlvbl9DaGVjayhmdW4pKQ0KICAgIHRtcF9mdW4gPSBmdW47DQogIGVsc2Ugew0K ICAgIGRpID0gMTsNCiAgICBpZiAoUHlPYmplY3RfSGFzQXR0clN0cmluZyhmdW4sImltX2Z1bmMi KSkgew0KICAgICAgdG1wX2Z1biA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZnVuLCJpbV9mdW5j Iik7DQogICAgfQ0KICAgIGVsc2UgaWYgKFB5T2JqZWN0X0hhc0F0dHJTdHJpbmcoZnVuLCJfX2Nh bGxfXyIpKSB7DQogICAgICB0bXBfZnVuID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhQeU9iamVj dF9HZXRBdHRyU3RyaW5nKGZ1biwiX19jYWxsX18iKSwiaW1fZnVuYyIpOw0KICAgIH0NCiAgfQ0K aWYgKHRtcF9mdW49PU5VTEwpIHsNCmZwcmludGYoc3RkZXJyLCJDYWxsLWJhY2sgYXJndW1lbnQg bXVzdCBiZSBmdW5jdGlvbnxpbnN0YW5jZXxpbnN0YW5jZS5fX2NhbGxfXyBidXQgZ290IHNvbWV0 aGluZyBkaWZmZXJlbnQuXG4iKTsNCmdvdG8gY2FwaV9mYWlsOw0KfQ0KICBpZiAoUHlPYmplY3Rf SGFzQXR0clN0cmluZyh0bXBfZnVuLCJmdW5jX2NvZGUiKSkNCiAgICBpZiAoUHlPYmplY3RfSGFz QXR0clN0cmluZyh0bXAgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHRtcF9mdW4sImZ1bmNfY29k ZSIpLCJjb19hcmdjb3VudCIpKQ0KICAgICAgdG90ID0gUHlJbnRfQXNMb25nKFB5T2JqZWN0X0dl dEF0dHJTdHJpbmcodG1wLCJjb19hcmdjb3VudCIpKSAtIGRpOw0KICAgIFB5X1hERUNSRUYodG1w KTsNCiAgLyogR2V0IHRoZSBudW1iZXIgb2Ygb3B0aW9uYWwgYXJndW1lbnRzICovDQogIGlmIChQ eU9iamVjdF9IYXNBdHRyU3RyaW5nKHRtcF9mdW4sImZ1bmNfZGVmYXVsdHMiKSkNCiAgICBpZiAo UHlUdXBsZV9DaGVjayh0bXAgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHRtcF9mdW4sImZ1bmNf ZGVmYXVsdHMiKSkpDQogICAgICBvcHQgPSBQeVR1cGxlX1NpemUodG1wKTsNCiAgICBQeV9YREVD UkVGKHRtcCk7DQogIC8qIEdldCB0aGUgbnVtYmVyIG9mIGV4dHJhIGFyZ3VtZW50cyAqLw0KICBp ZiAoeGEgIT0gTlVMTCkNCiAgICBleHQgPSBQeVR1cGxlX1NpemUoKFB5T2JqZWN0ICopeGEpOw0K ICAvKiBDYWxjdWxhdGUgdGhlIHNpemUgb2YgY2FsbC1iYWNrcyBhcmd1bWVudCBsaXN0ICovDQog IHNpeiA9IE1JTihtYXhub2ZhcmdzK2V4dCx0b3QpOw0KICAqbm9mYXJncyA9IE1BWCgwLHNpei1l eHQpOw0KI2lmZGVmIERFQlVHQ0ZVTkNTDQogIGZwcmludGYoc3RkZXJyLCJkZWJ1Zy1jYXBpOmNy ZWF0ZV9jYl9hcmdsaXN0Om1heG5vZmFyZ3MoLW5vZm9wdGFyZ3MpLHRvdCxvcHQsZXh0LHNpeixu b2ZhcmdzPSVkKC0lZCksJWQsJWQsJWQsJWQsJWRcbiIsbWF4bm9mYXJncyxub2ZvcHRhcmdzLHRv dCxvcHQsZXh0LHNpeiwqbm9mYXJncyk7DQojZW5kaWYNCiAgaWYgKHNpejx0b3Qtb3B0KSB7DQog ICAgZnByaW50ZihzdGRlcnIsImNyZWF0ZV9jYl9hcmdsaXN0OiBGYWlsZWQgdG8gYnVpbGQgYXJn dW1lbnQgbGlzdCAoc2l6KSB3aXRoIGVub3VnaCBhcmd1bWVudHMgKHRvdC1vcHQpIHJlcXVpcmVk IGJ5IHVzZXItc3VwcGxpZWQgZnVuY3Rpb24gKHNpeix0b3Qsb3B0PSVkLCVkLCVkKS5cbiIsc2l6 LHRvdCxvcHQpOw0KICAgIGdvdG8gY2FwaV9mYWlsOw0KICB9DQogIC8qIEluaXRpYWxpemUgYXJn dW1lbnQgbGlzdCAqLw0KICAqYXJncyA9IChQeVR1cGxlT2JqZWN0ICopUHlUdXBsZV9OZXcoc2l6 KTsNCiAgZm9yIChpPTA7aTwqbm9mYXJncztpKyspIHsNCiAgICBQeV9JTkNSRUYoUHlfTm9uZSk7 DQogICAgUHlUdXBsZV9TRVRfSVRFTSgoUHlPYmplY3QgKikoKmFyZ3MpLGksUHlfTm9uZSk7DQog IH0NCiAgaWYgKHhhICE9IE5VTEwpDQogICAgZm9yIChpPSgqbm9mYXJncyk7aTxzaXo7aSsrKSB7 DQogICAgICB0bXAgPSBQeVR1cGxlX0dldEl0ZW0oKFB5T2JqZWN0ICopeGEsaS0oKm5vZmFyZ3Mp KTsNCiAgICAgIFB5X0lOQ1JFRih0bXApOw0KICAgICAgUHlUdXBsZV9TRVRfSVRFTSgqYXJncyxp LHRtcCk7DQogICAgfQ0KICBDRlVOQ1NNRVNTKCJjcmVhdGVfY2JfYXJnbGlzdC1lbmRcbiIpOw0K ICByZXR1cm4gMTsNCmNhcGlfZmFpbDoNCiAgaWYgKChQeUVycl9PY2N1cnJlZCgpKT09TlVMTCkN CiAgICBQeUVycl9TZXRTdHJpbmcob3B0X3NxcF9lcnJvcixlcnJtZXNzKTsNCiAgcmV0dXJuIDA7 DQp9DQoNCg0KLyoqKioqKioqKioqKioqKioqKioqKiBTZWUgZjJweTJlL2NmdW5jcy5weTogdXNl cmluY2x1ZGVzICoqKioqKioqKioqKioqKioqKioqKi8NCi8qbmVlZF91c2VyaW5jbHVkZXMqLw0K DQovKioqKioqKioqKioqKioqKioqKioqIFNlZSBmMnB5MmUvY2FwaV9ydWxlcy5weTogdXNlcmNv ZGUgKioqKioqKioqKioqKioqKioqKioqLw0KDQoNCi8qKioqKioqKioqKioqKioqKioqIFNlZSBm MnB5MmUvY2JfcnVsZXMucHk6IGJ1aWxkY2FsbGJhY2sgKioqKioqKioqKioqKioqKioqKi8NCg0K LyoqKioqKioqKioqKioqKioqKioqKioqIGNiX2Zjbl9pbl9zcXBfX3VzZXJfX3JvdXRpbmVzICoq KioqKioqKioqKioqKioqKioqKioqLw0KUHlPYmplY3QgKmNiX2Zjbl9pbl9zcXBfX3VzZXJfX3Jv dXRpbmVzX2NhcGkgPSBOVUxMOy8qd2FzIFB5X05vbmUqLw0KUHlUdXBsZU9iamVjdCAqY2JfZmNu X2luX3NxcF9fdXNlcl9fcm91dGluZXNfYXJnc19jYXBpID0gTlVMTDsNCmludCBjYl9mY25faW5f c3FwX191c2VyX19yb3V0aW5lc19ub2ZhcmdzID0gMDsNCmptcF9idWYgY2JfZmNuX2luX3NxcF9f dXNlcl9fcm91dGluZXNfam1wYnVmOw0Kc3RhdGljIHZvaWQgY2JfZmNuX2luX3NxcF9fdXNlcl9f cm91dGluZXMgKGludCAqbl9jYl9jYXBpLGludCAqbV9jYl9jYXBpLGRvdWJsZSAqeCxkb3VibGUg Km9iamZfY2JfY2FwaSxkb3VibGUgKm9ial9mLGRvdWJsZSAqb2JqZyxkb3VibGUgKmZncmQsZG91 YmxlICpjb25mLGRvdWJsZSAqY25vcm0saW50ICpsY25vcm1fY2JfY2FwaSxpbnQgKmluZm9fY2Jf Y2FwaSkgew0KICBQeVR1cGxlT2JqZWN0ICpjYXBpX2FyZ2xpc3QgPSBjYl9mY25faW5fc3FwX191 c2VyX19yb3V0aW5lc19hcmdzX2NhcGk7DQogIFB5T2JqZWN0ICpjYXBpX3JldHVybiA9IE5VTEw7 DQogIFB5T2JqZWN0ICpjYXBpX3RtcCA9IE5VTEw7DQogIGludCBjYXBpX2osY2FwaV9pID0gMDsN Ci8qZGVjbCovDQogIGludCBuPSgqbl9jYl9jYXBpKTsNCiAgaW50IG09KCptX2NiX2NhcGkpOw0K ICBkb3VibGUgb2JqZj0oKm9iamZfY2JfY2FwaSk7DQogIGludCBsY25vcm09KCpsY25vcm1fY2Jf Y2FwaSk7DQogIGludCBpbmZvPSgqaW5mb19jYl9jYXBpKTsNCiAgaW50IGNvbmZfRGltc1sxXSA9 IHstMX07DQogIGludCB4X0RpbXNbMV0gPSB7LTF9Ow0KICBpbnQgY25vcm1fRGltc1syXSA9IHst MSwgLTF9Ow0KICBpbnQgb2JqX2ZfRGltc1sxXSA9IHstMX07DQogIGludCBvYmpnX0RpbXNbMV0g PSB7LTF9Ow0KICBpbnQgZmdyZF9EaW1zWzFdID0gey0xfTsNCiNpZmRlZiBGMlBZX1JFUE9SVF9B VEVYSVQNCmYycHlfY2Jfc3RhcnRfY2xvY2soKTsNCiNlbmRpZg0KICBDRlVOQ1NNRVNTKCJjYjpD YWxsLWJhY2sgZnVuY3Rpb24gY2JfZmNuX2luX3NxcF9fdXNlcl9fcm91dGluZXMgKG1heG5vZmFy Z3M9MTEoLTMpKVxuIik7DQogIGlmIChjYXBpX2FyZ2xpc3QgPT0gTlVMTCkgew0KICAgIGZwcmlu dGYoc3RkZXJyLCJjYXBpX2FyZ2xpc3QgaXMgTlVMTFxuIik7DQogICAgZ290byBjYXBpX2ZhaWw7 DQogIH0NCi8qc2V0ZGltcyovDQogIGNvbmZfRGltc1swXT1tOw0KICB4X0RpbXNbMF09bjsNCiAg Y25vcm1fRGltc1swXT1sY25vcm0sY25vcm1fRGltc1sxXT1tOw0KICBvYmpfZl9EaW1zWzBdPW4g KyAxOw0KICBvYmpnX0RpbXNbMF09biArIDE7DQogIGZncmRfRGltc1swXT1uOw0KLypweW9iamZy b20qLw0KICBpZiAoY2JfZmNuX2luX3NxcF9fdXNlcl9fcm91dGluZXNfbm9mYXJncz5jYXBpX2kp IHsNCiAgICBQeUFycmF5T2JqZWN0ICp0bXBfYXJyID0gKFB5QXJyYXlPYmplY3QgKilQeUFycmF5 X0Zyb21EaW1zQW5kRGF0YSgxLHhfRGltcyxQeUFycmF5X0RPVUJMRSwoY2hhciopeCk7IC8qWFhY OiBIbW0sIHdoYXQgd2lsbCBkZXN0cm95IHRoaXMgYXJyYXk/Pz8gKi8NCiAgICBpZiAodG1wX2Fy cj09TlVMTCkNCiAgICAgIGdvdG8gY2FwaV9mYWlsOw0KDQojaWYgKDE+MSkNCiAgICB0cmFuc3Bv c2Vfc3RyaWRlcyh0bXBfYXJyKTsNCiAgICANCnRtcF9hcnItPmZsYWdzICY9IH5DT05USUdVT1VT Ow0KI2VuZGlmDQoNCiAgICBpZiAoUHlUdXBsZV9TZXRJdGVtKChQeU9iamVjdCAqKWNhcGlfYXJn bGlzdCxjYXBpX2krKywoUHlPYmplY3QgKil0bXBfYXJyKSkNCiAgICAgIGdvdG8gY2FwaV9mYWls Ow0KfQ0KICBpZiAoY2JfZmNuX2luX3NxcF9fdXNlcl9fcm91dGluZXNfbm9mYXJncz5jYXBpX2kp DQogICAgaWYgKFB5VHVwbGVfU2V0SXRlbSgoUHlPYmplY3QgKiljYXBpX2FyZ2xpc3QsY2FwaV9p KysscHlvYmpfZnJvbV9kb3VibGUxKG9iamYpKSkNCiAgICAgIGdvdG8gY2FwaV9mYWlsOw0KICBp ZiAoY2JfZmNuX2luX3NxcF9fdXNlcl9fcm91dGluZXNfbm9mYXJncz5jYXBpX2kpIHsNCiAgICBQ eUFycmF5T2JqZWN0ICp0bXBfYXJyID0gKFB5QXJyYXlPYmplY3QgKilQeUFycmF5X0Zyb21EaW1z QW5kRGF0YSgxLG9ial9mX0RpbXMsUHlBcnJheV9ET1VCTEUsKGNoYXIqKW9ial9mKTsgLypYWFg6 IEhtbSwgd2hhdCB3aWxsIGRlc3Ryb3kgdGhpcyBhcnJheT8/PyAqLw0KICAgIGlmICh0bXBfYXJy PT1OVUxMKQ0KICAgICAgZ290byBjYXBpX2ZhaWw7DQoNCiNpZiAoMT4xKQ0KICAgIHRyYW5zcG9z ZV9zdHJpZGVzKHRtcF9hcnIpOw0KICAgIA0KdG1wX2Fyci0+ZmxhZ3MgJj0gfkNPTlRJR1VPVVM7 DQojZW5kaWYNCg0KICAgIGlmIChQeVR1cGxlX1NldEl0ZW0oKFB5T2JqZWN0ICopY2FwaV9hcmds aXN0LGNhcGlfaSsrLChQeU9iamVjdCAqKXRtcF9hcnIpKQ0KICAgICAgZ290byBjYXBpX2ZhaWw7 DQp9DQogIGlmIChjYl9mY25faW5fc3FwX191c2VyX19yb3V0aW5lc19ub2ZhcmdzPmNhcGlfaSkg ew0KICAgIFB5QXJyYXlPYmplY3QgKnRtcF9hcnIgPSAoUHlBcnJheU9iamVjdCAqKVB5QXJyYXlf RnJvbURpbXNBbmREYXRhKDEsb2JqZ19EaW1zLFB5QXJyYXlfRE9VQkxFLChjaGFyKilvYmpnKTsg LypYWFg6IEhtbSwgd2hhdCB3aWxsIGRlc3Ryb3kgdGhpcyBhcnJheT8/PyAqLw0KICAgIGlmICh0 bXBfYXJyPT1OVUxMKQ0KICAgICAgZ290byBjYXBpX2ZhaWw7DQoNCiNpZiAoMT4xKQ0KICAgIHRy YW5zcG9zZV9zdHJpZGVzKHRtcF9hcnIpOw0KICAgIA0KdG1wX2Fyci0+ZmxhZ3MgJj0gfkNPTlRJ R1VPVVM7DQojZW5kaWYNCg0KICAgIGlmIChQeVR1cGxlX1NldEl0ZW0oKFB5T2JqZWN0ICopY2Fw aV9hcmdsaXN0LGNhcGlfaSsrLChQeU9iamVjdCAqKXRtcF9hcnIpKQ0KICAgICAgZ290byBjYXBp X2ZhaWw7DQp9DQogIGlmIChjYl9mY25faW5fc3FwX191c2VyX19yb3V0aW5lc19ub2ZhcmdzPmNh cGlfaSkgew0KICAgIFB5QXJyYXlPYmplY3QgKnRtcF9hcnIgPSAoUHlBcnJheU9iamVjdCAqKVB5 QXJyYXlfRnJvbURpbXNBbmREYXRhKDEsZmdyZF9EaW1zLFB5QXJyYXlfRE9VQkxFLChjaGFyKilm Z3JkKTsgLypYWFg6IEhtbSwgd2hhdCB3aWxsIGRlc3Ryb3kgdGhpcyBhcnJheT8/PyAqLw0KICAg IGlmICh0bXBfYXJyPT1OVUxMKQ0KICAgICAgZ290byBjYXBpX2ZhaWw7DQoNCiNpZiAoMT4xKQ0K ICAgIHRyYW5zcG9zZV9zdHJpZGVzKHRtcF9hcnIpOw0KICAgIA0KdG1wX2Fyci0+ZmxhZ3MgJj0g fkNPTlRJR1VPVVM7DQojZW5kaWYNCg0KICAgIGlmIChQeVR1cGxlX1NldEl0ZW0oKFB5T2JqZWN0 ICopY2FwaV9hcmdsaXN0LGNhcGlfaSsrLChQeU9iamVjdCAqKXRtcF9hcnIpKQ0KICAgICAgZ290 byBjYXBpX2ZhaWw7DQp9DQogIGlmIChjYl9mY25faW5fc3FwX191c2VyX19yb3V0aW5lc19ub2Zh cmdzPmNhcGlfaSkgew0KICAgIFB5QXJyYXlPYmplY3QgKnRtcF9hcnIgPSAoUHlBcnJheU9iamVj dCAqKVB5QXJyYXlfRnJvbURpbXNBbmREYXRhKDEsY29uZl9EaW1zLFB5QXJyYXlfRE9VQkxFLChj aGFyKiljb25mKTsgLypYWFg6IEhtbSwgd2hhdCB3aWxsIGRlc3Ryb3kgdGhpcyBhcnJheT8/PyAq Lw0KICAgIGlmICh0bXBfYXJyPT1OVUxMKQ0KICAgICAgZ290byBjYXBpX2ZhaWw7DQoNCiNpZiAo MT4xKQ0KICAgIHRyYW5zcG9zZV9zdHJpZGVzKHRtcF9hcnIpOw0KICAgIA0KdG1wX2Fyci0+Zmxh Z3MgJj0gfkNPTlRJR1VPVVM7DQojZW5kaWYNCg0KICAgIGlmIChQeVR1cGxlX1NldEl0ZW0oKFB5 T2JqZWN0ICopY2FwaV9hcmdsaXN0LGNhcGlfaSsrLChQeU9iamVjdCAqKXRtcF9hcnIpKQ0KICAg ICAgZ290byBjYXBpX2ZhaWw7DQp9DQogIGlmIChjYl9mY25faW5fc3FwX191c2VyX19yb3V0aW5l c19ub2ZhcmdzPmNhcGlfaSkgew0KICAgIFB5QXJyYXlPYmplY3QgKnRtcF9hcnIgPSAoUHlBcnJh eU9iamVjdCAqKVB5QXJyYXlfRnJvbURpbXNBbmREYXRhKDIsY25vcm1fRGltcyxQeUFycmF5X0RP VUJMRSwoY2hhciopY25vcm0pOyAvKlhYWDogSG1tLCB3aGF0IHdpbGwgZGVzdHJveSB0aGlzIGFy cmF5Pz8/ICovDQogICAgaWYgKHRtcF9hcnI9PU5VTEwpDQogICAgICBnb3RvIGNhcGlfZmFpbDsN Cg0KI2lmICgyPjEpDQogICAgdHJhbnNwb3NlX3N0cmlkZXModG1wX2Fycik7DQogICAgDQp0bXBf YXJyLT5mbGFncyAmPSB+Q09OVElHVU9VUzsNCiNlbmRpZg0KDQogICAgaWYgKFB5VHVwbGVfU2V0 SXRlbSgoUHlPYmplY3QgKiljYXBpX2FyZ2xpc3QsY2FwaV9pKyssKFB5T2JqZWN0ICopdG1wX2Fy cikpDQogICAgICBnb3RvIGNhcGlfZmFpbDsNCn0NCiAgaWYgKGNiX2Zjbl9pbl9zcXBfX3VzZXJf X3JvdXRpbmVzX25vZmFyZ3M+Y2FwaV9pKQ0KICAgIGlmIChQeVR1cGxlX1NldEl0ZW0oKFB5T2Jq ZWN0ICopY2FwaV9hcmdsaXN0LGNhcGlfaSsrLHB5b2JqX2Zyb21faW50MShpbmZvKSkpDQogICAg ICBnb3RvIGNhcGlfZmFpbDsNCiAgaWYgKGNiX2Zjbl9pbl9zcXBfX3VzZXJfX3JvdXRpbmVzX25v ZmFyZ3M+Y2FwaV9pKQ0KICAgIGlmIChQeVR1cGxlX1NldEl0ZW0oKFB5T2JqZWN0ICopY2FwaV9h cmdsaXN0LGNhcGlfaSsrLHB5b2JqX2Zyb21faW50MShuKSkpDQogICAgICBnb3RvIGNhcGlfZmFp bDsNCiAgaWYgKGNiX2Zjbl9pbl9zcXBfX3VzZXJfX3JvdXRpbmVzX25vZmFyZ3M+Y2FwaV9pKQ0K ICAgIGlmIChQeVR1cGxlX1NldEl0ZW0oKFB5T2JqZWN0ICopY2FwaV9hcmdsaXN0LGNhcGlfaSsr LHB5b2JqX2Zyb21faW50MShtKSkpDQogICAgICBnb3RvIGNhcGlfZmFpbDsNCiAgaWYgKGNiX2Zj bl9pbl9zcXBfX3VzZXJfX3JvdXRpbmVzX25vZmFyZ3M+Y2FwaV9pKQ0KICAgIGlmIChQeVR1cGxl X1NldEl0ZW0oKFB5T2JqZWN0ICopY2FwaV9hcmdsaXN0LGNhcGlfaSsrLHB5b2JqX2Zyb21faW50 MShsY25vcm0pKSkNCiAgICAgIGdvdG8gY2FwaV9mYWlsOw0KICBDRlVOQ1NNRVNTUFkoImNiOmNh cGlfYXJnbGlzdD0iLGNhcGlfYXJnbGlzdCk7DQogIENGVU5DU01FU1MoImNiOkNhbGwtYmFjayBj YWxsaW5nIFB5dGhvbiBmdW5jdGlvbiBmY24uXG4iKTsNCiNpZmRlZiBGMlBZX1JFUE9SVF9BVEVY SVQNCmYycHlfY2Jfc3RhcnRfY2FsbF9jbG9jaygpOw0KI2VuZGlmDQogIGNhcGlfcmV0dXJuID0g UHlPYmplY3RfQ2FsbE9iamVjdChjYl9mY25faW5fc3FwX191c2VyX19yb3V0aW5lc19jYXBpLChQ eU9iamVjdCAqKWNhcGlfYXJnbGlzdCk7DQojaWZkZWYgRjJQWV9SRVBPUlRfQVRFWElUDQpmMnB5 X2NiX3N0b3BfY2FsbF9jbG9jaygpOw0KI2VuZGlmDQogIENGVU5DU01FU1NQWSgiY2I6Y2FwaV9y ZXR1cm49IixjYXBpX3JldHVybik7DQogIGlmIChjYXBpX3JldHVybiA9PSBOVUxMKSB7DQogICAg ZnByaW50ZihzdGRlcnIsImNhcGlfcmV0dXJuIGlzIE5VTExcbiIpOw0KICAgIGdvdG8gY2FwaV9m YWlsOw0KICB9DQogIGlmIChjYXBpX3JldHVybiA9PSBQeV9Ob25lKSB7DQogICAgUHlfREVDUkVG KGNhcGlfcmV0dXJuKTsNCiAgICBjYXBpX3JldHVybiA9IFB5X0J1aWxkVmFsdWUoIigpIik7DQog IH0NCiAgZWxzZSBpZiAoIVB5VHVwbGVfQ2hlY2soY2FwaV9yZXR1cm4pKSB7DQogICAgY2FwaV9y ZXR1cm4gPSBQeV9CdWlsZFZhbHVlKCIoTikiLGNhcGlfcmV0dXJuKTsNCiAgfQ0KICBjYXBpX2og PSBQeVR1cGxlX1NpemUoY2FwaV9yZXR1cm4pOw0KICBjYXBpX2kgPSAwOw0KLypmcm9tcHlvYmoq Lw0KICBDRlVOQ1NNRVNTKCJjYjpjYl9mY25faW5fc3FwX191c2VyX19yb3V0aW5lczpzdWNjZXNz ZnVsXG4iKTsNCiAgUHlfREVDUkVGKGNhcGlfcmV0dXJuKTsNCg0KICBnb3RvIGNhcGlfcmV0dXJu X3B0Ow0KY2FwaV9mYWlsOg0KICBmcHJpbnRmKHN0ZGVyciwiQ2FsbC1iYWNrIGNiX2Zjbl9pbl9z cXBfX3VzZXJfX3JvdXRpbmVzIGZhaWxlZC5cbiIpOw0KICBQeV9YREVDUkVGKGNhcGlfcmV0dXJu KTsNCiAgbG9uZ2ptcChjYl9mY25faW5fc3FwX191c2VyX19yb3V0aW5lc19qbXBidWYsLTEpOw0K Y2FwaV9yZXR1cm5fcHQ6DQogIDsNCiNpZmRlZiBGMlBZX1JFUE9SVF9BVEVYSVQNCmYycHlfY2Jf c3RvcF9jbG9jaygpOw0KI2VuZGlmDQp9DQovKioqKioqKioqKioqKioqKioqKiogZW5kIG9mIGNi X2Zjbl9pbl9zcXBfX3VzZXJfX3JvdXRpbmVzICoqKioqKioqKioqKioqKioqKioqLw0KDQoNCi8q KioqKioqKioqKioqKioqKioqKioqKiBTZWUgZjJweTJlL3J1bGVzLnB5OiBidWlsZGFwaSAqKioq KioqKioqKioqKioqKioqKioqKi8NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq Kiogb3B0aW1pemUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnN0YXRpYyBj aGFyIGRvY19mMnB5X3JvdXRfb3B0X3NxcF9vcHRpbWl6ZVtdID0gIlwNCkZ1bmN0aW9uIHNpZ25h dHVyZTpcblwNCiAgb3B0aW1pemUobSxtZXEsZGhoLHh4LHhtaW4sb2JqX2Ysb2JqZyxmbWluLGZz dW0xLGlpdixpaXRlcixpaXN0YXQsaWlzdGVwLGluc3RlcCxpc3BhcmsxLGlwaW4xLG1pbmRpcjEs aWJudW0saWJ1cm4sW25dKVxuXA0KUmVxdWlyZWQgYXJndW1lbnRzOlxuIg0KIiAgbSA6IGlucHV0 IGludFxuIg0KIiAgbWVxIDogaW5wdXQgaW50XG4iDQoiICBkaGggOiBpbnB1dCByYW5rLTEgYXJy YXkoJ2QnKSB3aXRoIGJvdW5kcyAobilcbiINCiIgIHh4IDogaW5wdXQgcmFuay0xIGFycmF5KCdk Jykgd2l0aCBib3VuZHMgKG4pXG4iDQoiICB4bWluIDogaW5wdXQgcmFuay0xIGFycmF5KCdkJykg d2l0aCBib3VuZHMgKG4pXG4iDQoiICBvYmpfZiA6IGlucHV0IHJhbmstMSBhcnJheSgnZCcpIHdp dGggYm91bmRzIChuICsgMSlcbiINCiIgIG9iamcgOiBpbnB1dCByYW5rLTEgYXJyYXkoJ2QnKSB3 aXRoIGJvdW5kcyAobiArIDEpXG4iDQoiICBmbWluIDogaW5wdXQgZmxvYXRcbiINCiIgIGZzdW0x IDogaW5wdXQgZmxvYXRcbiINCiIgIGlpdiA6IGlucHV0IGludFxuIg0KIiAgaWl0ZXIgOiBpbnB1 dCBpbnRcbiINCiIgIGlpc3RhdCA6IGlucHV0IGludFxuIg0KIiAgaWlzdGVwIDogaW5wdXQgaW50 XG4iDQoiICBpbnN0ZXAgOiBpbnB1dCBpbnRcbiINCiIgIGlzcGFyazEgOiBpbnB1dCBpbnRcbiIN CiIgIGlwaW4xIDogaW5wdXQgaW50XG4iDQoiICBtaW5kaXIxIDogaW5wdXQgaW50XG4iDQoiICBp Ym51bSA6IGlucHV0IGludFxuIg0KIiAgaWJ1cm4gOiBpbnB1dCBpbnRcbiINCiJPcHRpb25hbCBh cmd1bWVudHM6XG4iDQoiICBuIDo9IGxlbihkaGgpIGlucHV0IGludCI7DQovKiBleHRlcm4gdm9p ZCBGX0ZVTkMob3B0aW1pemUsT1BUSU1JWkUpKGludCosaW50KixpbnQqLGRvdWJsZSosZG91Ymxl Kixkb3VibGUqLGRvdWJsZSosZG91YmxlKixkb3VibGUqLGRvdWJsZSosaW50KixpbnQqLGludCos aW50KixpbnQqLGludCosaW50KixpbnQqLGludCosaW50Kik7ICovDQpzdGF0aWMgUHlPYmplY3Qg KmYycHlfcm91dF9vcHRfc3FwX29wdGltaXplKGNvbnN0IFB5T2JqZWN0ICpjYXBpX3NlbGYsDQog ICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqY2FwaV9hcmdzLA0KICAgICAgICAg ICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmNhcGlfa2V5d2RzLA0KICAgICAgICAgICAgICAg ICAgICAgICAgICAgdm9pZCAoKmYycHlfZnVuYykoaW50KixpbnQqLGludCosZG91YmxlKixkb3Vi bGUqLGRvdWJsZSosZG91YmxlKixkb3VibGUqLGRvdWJsZSosZG91YmxlKixpbnQqLGludCosaW50 KixpbnQqLGludCosaW50KixpbnQqLGludCosaW50KixpbnQqKSkgew0KICBQeU9iamVjdCAqIHZv bGF0aWxlIGNhcGlfYnVpbGR2YWx1ZSA9IE5VTEw7DQogIHZvbGF0aWxlIGludCBmMnB5X3N1Y2Nl c3MgPSAxOw0KLypkZWNsKi8NCg0KICBpbnQgbiA9IDA7DQogIFB5T2JqZWN0ICpuX2NhcGkgPSBQ eV9Ob25lOw0KICBpbnQgbSA9IDA7DQogIFB5T2JqZWN0ICptX2NhcGkgPSBQeV9Ob25lOw0KICBp bnQgbWVxID0gMDsNCiAgUHlPYmplY3QgKm1lcV9jYXBpID0gUHlfTm9uZTsNCiAgZG91YmxlICpk aGggPSBOVUxMOw0KICBpbnQgZGhoX0RpbXNbMV0gPSB7LTF9Ow0KICBjb25zdCBpbnQgZGhoX1Jh bmsgPSAxOw0KICBQeUFycmF5T2JqZWN0ICpjYXBpX2RoaF90bXAgPSBOVUxMOw0KICBpbnQgY2Fw aV9kaGhfaW50ZW50ID0gMDsNCiAgUHlPYmplY3QgKmRoaF9jYXBpID0gUHlfTm9uZTsNCiAgZG91 YmxlICp4eCA9IE5VTEw7DQogIGludCB4eF9EaW1zWzFdID0gey0xfTsNCiAgY29uc3QgaW50IHh4 X1JhbmsgPSAxOw0KICBQeUFycmF5T2JqZWN0ICpjYXBpX3h4X3RtcCA9IE5VTEw7DQogIGludCBj YXBpX3h4X2ludGVudCA9IDA7DQogIFB5T2JqZWN0ICp4eF9jYXBpID0gUHlfTm9uZTsNCiAgZG91 YmxlICp4bWluID0gTlVMTDsNCiAgaW50IHhtaW5fRGltc1sxXSA9IHstMX07DQogIGNvbnN0IGlu dCB4bWluX1JhbmsgPSAxOw0KICBQeUFycmF5T2JqZWN0ICpjYXBpX3htaW5fdG1wID0gTlVMTDsN CiAgaW50IGNhcGlfeG1pbl9pbnRlbnQgPSAwOw0KICBQeU9iamVjdCAqeG1pbl9jYXBpID0gUHlf Tm9uZTsNCiAgZG91YmxlICpvYmpfZiA9IE5VTEw7DQogIGludCBvYmpfZl9EaW1zWzFdID0gey0x fTsNCiAgY29uc3QgaW50IG9ial9mX1JhbmsgPSAxOw0KICBQeUFycmF5T2JqZWN0ICpjYXBpX29i al9mX3RtcCA9IE5VTEw7DQogIGludCBjYXBpX29ial9mX2ludGVudCA9IDA7DQogIFB5T2JqZWN0 ICpvYmpfZl9jYXBpID0gUHlfTm9uZTsNCiAgZG91YmxlICpvYmpnID0gTlVMTDsNCiAgaW50IG9i amdfRGltc1sxXSA9IHstMX07DQogIGNvbnN0IGludCBvYmpnX1JhbmsgPSAxOw0KICBQeUFycmF5 T2JqZWN0ICpjYXBpX29iamdfdG1wID0gTlVMTDsNCiAgaW50IGNhcGlfb2JqZ19pbnRlbnQgPSAw Ow0KICBQeU9iamVjdCAqb2JqZ19jYXBpID0gUHlfTm9uZTsNCiAgZG91YmxlIGZtaW4gPSAwOw0K ICBQeU9iamVjdCAqZm1pbl9jYXBpID0gUHlfTm9uZTsNCiAgZG91YmxlIGZzdW0xID0gMDsNCiAg UHlPYmplY3QgKmZzdW0xX2NhcGkgPSBQeV9Ob25lOw0KICBpbnQgaWl2ID0gMDsNCiAgUHlPYmpl Y3QgKmlpdl9jYXBpID0gUHlfTm9uZTsNCiAgaW50IGlpdGVyID0gMDsNCiAgUHlPYmplY3QgKmlp dGVyX2NhcGkgPSBQeV9Ob25lOw0KICBpbnQgaWlzdGF0ID0gMDsNCiAgUHlPYmplY3QgKmlpc3Rh dF9jYXBpID0gUHlfTm9uZTsNCiAgaW50IGlpc3RlcCA9IDA7DQogIFB5T2JqZWN0ICppaXN0ZXBf Y2FwaSA9IFB5X05vbmU7DQogIGludCBpbnN0ZXAgPSAwOw0KICBQeU9iamVjdCAqaW5zdGVwX2Nh cGkgPSBQeV9Ob25lOw0KICBpbnQgaXNwYXJrMSA9IDA7DQogIFB5T2JqZWN0ICppc3BhcmsxX2Nh cGkgPSBQeV9Ob25lOw0KICBpbnQgaXBpbjEgPSAwOw0KICBQeU9iamVjdCAqaXBpbjFfY2FwaSA9 IFB5X05vbmU7DQogIGludCBtaW5kaXIxID0gMDsNCiAgUHlPYmplY3QgKm1pbmRpcjFfY2FwaSA9 IFB5X05vbmU7DQogIGludCBpYm51bSA9IDA7DQogIFB5T2JqZWN0ICppYm51bV9jYXBpID0gUHlf Tm9uZTsNCiAgaW50IGlidXJuID0gMDsNCiAgUHlPYmplY3QgKmlidXJuX2NhcGkgPSBQeV9Ob25l Ow0KICBzdGF0aWMgY2hhciAqY2FwaV9rd2xpc3RbXSA9IHsibSIsIm1lcSIsImRoaCIsInh4Iiwi eG1pbiIsIm9ial9mIiwib2JqZyIsImZtaW4iLCJmc3VtMSIsImlpdiIsImlpdGVyIiwiaWlzdGF0 IiwiaWlzdGVwIiwiaW5zdGVwIiwiaXNwYXJrMSIsImlwaW4xIiwibWluZGlyMSIsImlibnVtIiwi aWJ1cm4iLCJuIixOVUxMfTsNCg0KLypyb3V0ZGVidWdlbnRlciovDQojaWZkZWYgRjJQWV9SRVBP UlRfQVRFWElUDQpmMnB5X3N0YXJ0X2Nsb2NrKCk7DQojZW5kaWYNCiAgaWYgKCFQeUFyZ19QYXJz ZVR1cGxlQW5kS2V5d29yZHMoY2FwaV9hcmdzLGNhcGlfa2V5d2RzLFwNCiAgICAiT09PT09PT09P T09PT09PT09PT3xPOm9wdF9zcXAub3B0aW1pemUiLFwNCiAgICBjYXBpX2t3bGlzdCwmbV9jYXBp LCZtZXFfY2FwaSwmZGhoX2NhcGksJnh4X2NhcGksJnhtaW5fY2FwaSwmb2JqX2ZfY2FwaSwmb2Jq Z19jYXBpLCZmbWluX2NhcGksJmZzdW0xX2NhcGksJmlpdl9jYXBpLCZpaXRlcl9jYXBpLCZpaXN0 YXRfY2FwaSwmaWlzdGVwX2NhcGksJmluc3RlcF9jYXBpLCZpc3BhcmsxX2NhcGksJmlwaW4xX2Nh cGksJm1pbmRpcjFfY2FwaSwmaWJudW1fY2FwaSwmaWJ1cm5fY2FwaSwmbl9jYXBpKSkNCiAgICBy ZXR1cm4gTlVMTDsNCi8qZnJvbXB5b2JqKi8NCiAgLyogUHJvY2Vzc2luZyB2YXJpYWJsZSBpaXN0 YXQgKi8NCiAgICBmMnB5X3N1Y2Nlc3MgPSBpbnRfZnJvbV9weW9iaigmaWlzdGF0LGlpc3RhdF9j YXBpLCJvcHRfc3FwLm9wdGltaXplKCkgMTJuZCBhcmd1bWVudCAoaWlzdGF0KSBjYW4ndCBiZSBj b252ZXJ0ZWQgdG8gaW50Iik7DQogIGlmIChmMnB5X3N1Y2Nlc3MpIHsNCiAgLyogUHJvY2Vzc2lu ZyB2YXJpYWJsZSBpcGluMSAqLw0KICAgIGYycHlfc3VjY2VzcyA9IGludF9mcm9tX3B5b2JqKCZp cGluMSxpcGluMV9jYXBpLCJvcHRfc3FwLm9wdGltaXplKCkgMTZ0aCBhcmd1bWVudCAoaXBpbjEp IGNhbid0IGJlIGNvbnZlcnRlZCB0byBpbnQiKTsNCiAgaWYgKGYycHlfc3VjY2Vzcykgew0KICAv KiBQcm9jZXNzaW5nIHZhcmlhYmxlIGluc3RlcCAqLw0KICAgIGYycHlfc3VjY2VzcyA9IGludF9m cm9tX3B5b2JqKCZpbnN0ZXAsaW5zdGVwX2NhcGksIm9wdF9zcXAub3B0aW1pemUoKSAxNHRoIGFy Z3VtZW50IChpbnN0ZXApIGNhbid0IGJlIGNvbnZlcnRlZCB0byBpbnQiKTsNCiAgaWYgKGYycHlf c3VjY2Vzcykgew0KICAvKiBQcm9jZXNzaW5nIHZhcmlhYmxlIGlpc3RlcCAqLw0KICAgIGYycHlf c3VjY2VzcyA9IGludF9mcm9tX3B5b2JqKCZpaXN0ZXAsaWlzdGVwX2NhcGksIm9wdF9zcXAub3B0 aW1pemUoKSAxM3JkIGFyZ3VtZW50IChpaXN0ZXApIGNhbid0IGJlIGNvbnZlcnRlZCB0byBpbnQi KTsNCiAgaWYgKGYycHlfc3VjY2Vzcykgew0KICAvKiBQcm9jZXNzaW5nIHZhcmlhYmxlIGlibnVt ICovDQogICAgZjJweV9zdWNjZXNzID0gaW50X2Zyb21fcHlvYmooJmlibnVtLGlibnVtX2NhcGks Im9wdF9zcXAub3B0aW1pemUoKSAxOHRoIGFyZ3VtZW50IChpYm51bSkgY2FuJ3QgYmUgY29udmVy dGVkIHRvIGludCIpOw0KICBpZiAoZjJweV9zdWNjZXNzKSB7DQogIC8qIFByb2Nlc3NpbmcgdmFy aWFibGUgZGhoICovDQogIDsNCiAgY2FwaV9kaGhfaW50ZW50IHw9IEYyUFlfSU5URU5UX0lOOw0K ICBjYXBpX2RoaF90bXAgPSBhcnJheV9mcm9tX3B5b2JqKFB5QXJyYXlfRE9VQkxFLGRoaF9EaW1z LGRoaF9SYW5rLGNhcGlfZGhoX2ludGVudCxkaGhfY2FwaSk7DQogIGlmIChjYXBpX2RoaF90bXAg PT0gTlVMTCkgew0KICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkNCiAgICAgIFB5RXJyX1NldFN0 cmluZyhvcHRfc3FwX2Vycm9yLCJmYWlsZWQgaW4gY29udmVydGluZyAzcmQgYXJndW1lbnQgYGRo aCcgb2Ygb3B0X3NxcC5vcHRpbWl6ZSB0byBDL0ZvcnRyYW4gYXJyYXkiICk7DQogIH0gZWxzZSB7 DQogICAgZGhoID0gKGRvdWJsZSAqKShjYXBpX2RoaF90bXAtPmRhdGEpOw0KICAvKiBQcm9jZXNz aW5nIHZhcmlhYmxlIGlpdGVyICovDQogICAgZjJweV9zdWNjZXNzID0gaW50X2Zyb21fcHlvYmoo JmlpdGVyLGlpdGVyX2NhcGksIm9wdF9zcXAub3B0aW1pemUoKSAxMXN0IGFyZ3VtZW50IChpaXRl cikgY2FuJ3QgYmUgY29udmVydGVkIHRvIGludCIpOw0KICBpZiAoZjJweV9zdWNjZXNzKSB7DQog IC8qIFByb2Nlc3NpbmcgdmFyaWFibGUgaXNwYXJrMSAqLw0KICAgIGYycHlfc3VjY2VzcyA9IGlu dF9mcm9tX3B5b2JqKCZpc3BhcmsxLGlzcGFyazFfY2FwaSwib3B0X3NxcC5vcHRpbWl6ZSgpIDE1 dGggYXJndW1lbnQgKGlzcGFyazEpIGNhbid0IGJlIGNvbnZlcnRlZCB0byBpbnQiKTsNCiAgaWYg KGYycHlfc3VjY2Vzcykgew0KICAvKiBQcm9jZXNzaW5nIHZhcmlhYmxlIGlpdiAqLw0KICAgIGYy cHlfc3VjY2VzcyA9IGludF9mcm9tX3B5b2JqKCZpaXYsaWl2X2NhcGksIm9wdF9zcXAub3B0aW1p emUoKSAxMHRoIGFyZ3VtZW50IChpaXYpIGNhbid0IGJlIGNvbnZlcnRlZCB0byBpbnQiKTsNCiAg aWYgKGYycHlfc3VjY2Vzcykgew0KICAvKiBQcm9jZXNzaW5nIHZhcmlhYmxlIG0gKi8NCiAgICBm MnB5X3N1Y2Nlc3MgPSBpbnRfZnJvbV9weW9iaigmbSxtX2NhcGksIm9wdF9zcXAub3B0aW1pemUo KSAxc3QgYXJndW1lbnQgKG0pIGNhbid0IGJlIGNvbnZlcnRlZCB0byBpbnQiKTsNCiAgaWYgKGYy cHlfc3VjY2Vzcykgew0KICAvKiBQcm9jZXNzaW5nIHZhcmlhYmxlIG1pbmRpcjEgKi8NCiAgICBm MnB5X3N1Y2Nlc3MgPSBpbnRfZnJvbV9weW9iaigmbWluZGlyMSxtaW5kaXIxX2NhcGksIm9wdF9z cXAub3B0aW1pemUoKSAxN3RoIGFyZ3VtZW50IChtaW5kaXIxKSBjYW4ndCBiZSBjb252ZXJ0ZWQg dG8gaW50Iik7DQogIGlmIChmMnB5X3N1Y2Nlc3MpIHsNCiAgLyogUHJvY2Vzc2luZyB2YXJpYWJs ZSBmc3VtMSAqLw0KICAgIGYycHlfc3VjY2VzcyA9IGRvdWJsZV9mcm9tX3B5b2JqKCZmc3VtMSxm c3VtMV9jYXBpLCJvcHRfc3FwLm9wdGltaXplKCkgOXRoIGFyZ3VtZW50IChmc3VtMSkgY2FuJ3Qg YmUgY29udmVydGVkIHRvIGRvdWJsZSIpOw0KICBpZiAoZjJweV9zdWNjZXNzKSB7DQogIC8qIFBy b2Nlc3NpbmcgdmFyaWFibGUgaWJ1cm4gKi8NCiAgICBmMnB5X3N1Y2Nlc3MgPSBpbnRfZnJvbV9w eW9iaigmaWJ1cm4saWJ1cm5fY2FwaSwib3B0X3NxcC5vcHRpbWl6ZSgpIDE5dGggYXJndW1lbnQg KGlidXJuKSBjYW4ndCBiZSBjb252ZXJ0ZWQgdG8gaW50Iik7DQogIGlmIChmMnB5X3N1Y2Nlc3Mp IHsNCiAgLyogUHJvY2Vzc2luZyB2YXJpYWJsZSBmbWluICovDQogICAgZjJweV9zdWNjZXNzID0g ZG91YmxlX2Zyb21fcHlvYmooJmZtaW4sZm1pbl9jYXBpLCJvcHRfc3FwLm9wdGltaXplKCkgOHRo IGFyZ3VtZW50IChmbWluKSBjYW4ndCBiZSBjb252ZXJ0ZWQgdG8gZG91YmxlIik7DQogIGlmIChm MnB5X3N1Y2Nlc3MpIHsNCiAgLyogUHJvY2Vzc2luZyB2YXJpYWJsZSBtZXEgKi8NCiAgICBmMnB5 X3N1Y2Nlc3MgPSBpbnRfZnJvbV9weW9iaigmbWVxLG1lcV9jYXBpLCJvcHRfc3FwLm9wdGltaXpl KCkgMm5kIGFyZ3VtZW50IChtZXEpIGNhbid0IGJlIGNvbnZlcnRlZCB0byBpbnQiKTsNCiAgaWYg KGYycHlfc3VjY2Vzcykgew0KICAvKiBQcm9jZXNzaW5nIHZhcmlhYmxlIG4gKi8NCiAgaWYgKG5f Y2FwaSA9PSBQeV9Ob25lKSBuID0gbGVuKGRoaCk7IGVsc2UNCiAgICBmMnB5X3N1Y2Nlc3MgPSBp bnRfZnJvbV9weW9iaigmbixuX2NhcGksIm9wdF9zcXAub3B0aW1pemUoKSAxc3Qga2V5d29yZCAo bikgY2FuJ3QgYmUgY29udmVydGVkIHRvIGludCIpOw0KICBpZiAoZjJweV9zdWNjZXNzKSB7DQog IENIRUNLU0NBTEFSKGxlbihkaGgpPj1uLCJsZW4oZGhoKT49biIsIjFzdCBrZXl3b3JkIG4iLCJv cHRpbWl6ZTpuPSVkIixuKSB7DQogIC8qIFByb2Nlc3NpbmcgdmFyaWFibGUgeHggKi8NCiAgeHhf RGltc1swXT1uOw0KICBjYXBpX3h4X2ludGVudCB8PSBGMlBZX0lOVEVOVF9JTjsNCiAgY2FwaV94 eF90bXAgPSBhcnJheV9mcm9tX3B5b2JqKFB5QXJyYXlfRE9VQkxFLHh4X0RpbXMseHhfUmFuayxj YXBpX3h4X2ludGVudCx4eF9jYXBpKTsNCiAgaWYgKGNhcGlfeHhfdG1wID09IE5VTEwpIHsNCiAg ICBpZiAoIVB5RXJyX09jY3VycmVkKCkpDQogICAgICBQeUVycl9TZXRTdHJpbmcob3B0X3NxcF9l cnJvciwiZmFpbGVkIGluIGNvbnZlcnRpbmcgNHRoIGFyZ3VtZW50IGB4eCcgb2Ygb3B0X3NxcC5v cHRpbWl6ZSB0byBDL0ZvcnRyYW4gYXJyYXkiICk7DQogIH0gZWxzZSB7DQogICAgeHggPSAoZG91 YmxlICopKGNhcGlfeHhfdG1wLT5kYXRhKTsNCiAgLyogUHJvY2Vzc2luZyB2YXJpYWJsZSBvYmpn ICovDQogIG9iamdfRGltc1swXT1uICsgMTsNCiAgY2FwaV9vYmpnX2ludGVudCB8PSBGMlBZX0lO VEVOVF9JTjsNCiAgY2FwaV9vYmpnX3RtcCA9IGFycmF5X2Zyb21fcHlvYmooUHlBcnJheV9ET1VC TEUsb2JqZ19EaW1zLG9iamdfUmFuayxjYXBpX29iamdfaW50ZW50LG9iamdfY2FwaSk7DQogIGlm IChjYXBpX29iamdfdG1wID09IE5VTEwpIHsNCiAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpDQog ICAgICBQeUVycl9TZXRTdHJpbmcob3B0X3NxcF9lcnJvciwiZmFpbGVkIGluIGNvbnZlcnRpbmcg N3RoIGFyZ3VtZW50IGBvYmpnJyBvZiBvcHRfc3FwLm9wdGltaXplIHRvIEMvRm9ydHJhbiBhcnJh eSIgKTsNCiAgfSBlbHNlIHsNCiAgICBvYmpnID0gKGRvdWJsZSAqKShjYXBpX29iamdfdG1wLT5k YXRhKTsNCiAgLyogUHJvY2Vzc2luZyB2YXJpYWJsZSB4bWluICovDQogIHhtaW5fRGltc1swXT1u Ow0KICBjYXBpX3htaW5faW50ZW50IHw9IEYyUFlfSU5URU5UX0lOOw0KICBjYXBpX3htaW5fdG1w ID0gYXJyYXlfZnJvbV9weW9iaihQeUFycmF5X0RPVUJMRSx4bWluX0RpbXMseG1pbl9SYW5rLGNh cGlfeG1pbl9pbnRlbnQseG1pbl9jYXBpKTsNCiAgaWYgKGNhcGlfeG1pbl90bXAgPT0gTlVMTCkg ew0KICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkNCiAgICAgIFB5RXJyX1NldFN0cmluZyhvcHRf c3FwX2Vycm9yLCJmYWlsZWQgaW4gY29udmVydGluZyA1dGggYXJndW1lbnQgYHhtaW4nIG9mIG9w dF9zcXAub3B0aW1pemUgdG8gQy9Gb3J0cmFuIGFycmF5IiApOw0KICB9IGVsc2Ugew0KICAgIHht aW4gPSAoZG91YmxlICopKGNhcGlfeG1pbl90bXAtPmRhdGEpOw0KICAvKiBQcm9jZXNzaW5nIHZh cmlhYmxlIG9ial9mICovDQogIG9ial9mX0RpbXNbMF09biArIDE7DQogIGNhcGlfb2JqX2ZfaW50 ZW50IHw9IEYyUFlfSU5URU5UX0lOOw0KICBjYXBpX29ial9mX3RtcCA9IGFycmF5X2Zyb21fcHlv YmooUHlBcnJheV9ET1VCTEUsb2JqX2ZfRGltcyxvYmpfZl9SYW5rLGNhcGlfb2JqX2ZfaW50ZW50 LG9ial9mX2NhcGkpOw0KICBpZiAoY2FwaV9vYmpfZl90bXAgPT0gTlVMTCkgew0KICAgIGlmICgh UHlFcnJfT2NjdXJyZWQoKSkNCiAgICAgIFB5RXJyX1NldFN0cmluZyhvcHRfc3FwX2Vycm9yLCJm YWlsZWQgaW4gY29udmVydGluZyA2dGggYXJndW1lbnQgYG9ial9mJyBvZiBvcHRfc3FwLm9wdGlt aXplIHRvIEMvRm9ydHJhbiBhcnJheSIgKTsNCiAgfSBlbHNlIHsNCiAgICBvYmpfZiA9IChkb3Vi bGUgKikoY2FwaV9vYmpfZl90bXAtPmRhdGEpOw0KLyplbmQgb2YgZnJvbXB5b2JqKi8NCiNpZmRl ZiBGMlBZX1JFUE9SVF9BVEVYSVQNCmYycHlfc3RhcnRfY2FsbF9jbG9jaygpOw0KI2VuZGlmDQov KmNhbGxmb3J0cmFucm91dGluZSovDQogICAgICAgICgqZjJweV9mdW5jKSgmbiwmbSwmbWVxLGRo aCx4eCx4bWluLG9ial9mLG9iamcsJmZtaW4sJmZzdW0xLCZpaXYsJmlpdGVyLCZpaXN0YXQsJmlp c3RlcCwmaW5zdGVwLCZpc3BhcmsxLCZpcGluMSwmbWluZGlyMSwmaWJudW0sJmlidXJuKTsNCiNp ZmRlZiBGMlBZX1JFUE9SVF9BVEVYSVQNCmYycHlfc3RvcF9jYWxsX2Nsb2NrKCk7DQojZW5kaWYN Ci8qZW5kIG9mIGNhbGxmb3J0cmFucm91dGluZSovDQogICAgaWYgKGYycHlfc3VjY2Vzcykgew0K LypweW9iamZyb20qLw0KLyplbmQgb2YgcHlvYmpmcm9tKi8NCiAgICBDRlVOQ1NNRVNTKCJCdWls ZGluZyByZXR1cm4gdmFsdWUuXG4iKTsNCiAgICBjYXBpX2J1aWxkdmFsdWUgPSBQeV9CdWlsZFZh bHVlKCIiKTsNCi8qY2xvc2VweW9iamZyb20qLw0KLyplbmQgb2YgY2xvc2VweW9iamZyb20qLw0K ICAgIH0gLyppZiAoZjJweV9zdWNjZXNzKSBhZnRlciBjYWxsZm9ydHJhbnJvdXRpbmUqLw0KLypj bGVhbnVwZnJvbXB5b2JqKi8NCiAgaWYoKFB5T2JqZWN0ICopY2FwaV9vYmpfZl90bXAhPW9ial9m X2NhcGkpIHsNCiAgICBQeV9YREVDUkVGKGNhcGlfb2JqX2ZfdG1wKTsgfQ0KICB9ICAvKmlmIChj YXBpX29ial9mX3RtcCA9PSBOVUxMKSAuLi4gZWxzZSBvZiBvYmpfZiovDQogIC8qIEVuZCBvZiBj bGVhbmluZyB2YXJpYWJsZSBvYmpfZiAqLw0KICBpZigoUHlPYmplY3QgKiljYXBpX3htaW5fdG1w IT14bWluX2NhcGkpIHsNCiAgICBQeV9YREVDUkVGKGNhcGlfeG1pbl90bXApOyB9DQogIH0gIC8q aWYgKGNhcGlfeG1pbl90bXAgPT0gTlVMTCkgLi4uIGVsc2Ugb2YgeG1pbiovDQogIC8qIEVuZCBv ZiBjbGVhbmluZyB2YXJpYWJsZSB4bWluICovDQogIGlmKChQeU9iamVjdCAqKWNhcGlfb2JqZ190 bXAhPW9iamdfY2FwaSkgew0KICAgIFB5X1hERUNSRUYoY2FwaV9vYmpnX3RtcCk7IH0NCiAgfSAg LyppZiAoY2FwaV9vYmpnX3RtcCA9PSBOVUxMKSAuLi4gZWxzZSBvZiBvYmpnKi8NCiAgLyogRW5k IG9mIGNsZWFuaW5nIHZhcmlhYmxlIG9iamcgKi8NCiAgaWYoKFB5T2JqZWN0ICopY2FwaV94eF90 bXAhPXh4X2NhcGkpIHsNCiAgICBQeV9YREVDUkVGKGNhcGlfeHhfdG1wKTsgfQ0KICB9ICAvKmlm IChjYXBpX3h4X3RtcCA9PSBOVUxMKSAuLi4gZWxzZSBvZiB4eCovDQogIC8qIEVuZCBvZiBjbGVh bmluZyB2YXJpYWJsZSB4eCAqLw0KICB9IC8qQ0hFQ0tTQ0FMQVIobGVuKGRoaCk+PW4pKi8NCiAg fSAvKmlmIChmMnB5X3N1Y2Nlc3MpIG9mIG4qLw0KICAvKiBFbmQgb2YgY2xlYW5pbmcgdmFyaWFi bGUgbiAqLw0KICB9IC8qaWYgKGYycHlfc3VjY2Vzcykgb2YgbWVxKi8NCiAgLyogRW5kIG9mIGNs ZWFuaW5nIHZhcmlhYmxlIG1lcSAqLw0KICB9IC8qaWYgKGYycHlfc3VjY2Vzcykgb2YgZm1pbiov DQogIC8qIEVuZCBvZiBjbGVhbmluZyB2YXJpYWJsZSBmbWluICovDQogIH0gLyppZiAoZjJweV9z dWNjZXNzKSBvZiBpYnVybiovDQogIC8qIEVuZCBvZiBjbGVhbmluZyB2YXJpYWJsZSBpYnVybiAq Lw0KICB9IC8qaWYgKGYycHlfc3VjY2Vzcykgb2YgZnN1bTEqLw0KICAvKiBFbmQgb2YgY2xlYW5p bmcgdmFyaWFibGUgZnN1bTEgKi8NCiAgfSAvKmlmIChmMnB5X3N1Y2Nlc3MpIG9mIG1pbmRpcjEq Lw0KICAvKiBFbmQgb2YgY2xlYW5pbmcgdmFyaWFibGUgbWluZGlyMSAqLw0KICB9IC8qaWYgKGYy cHlfc3VjY2Vzcykgb2YgbSovDQogIC8qIEVuZCBvZiBjbGVhbmluZyB2YXJpYWJsZSBtICovDQog IH0gLyppZiAoZjJweV9zdWNjZXNzKSBvZiBpaXYqLw0KICAvKiBFbmQgb2YgY2xlYW5pbmcgdmFy aWFibGUgaWl2ICovDQogIH0gLyppZiAoZjJweV9zdWNjZXNzKSBvZiBpc3BhcmsxKi8NCiAgLyog RW5kIG9mIGNsZWFuaW5nIHZhcmlhYmxlIGlzcGFyazEgKi8NCiAgfSAvKmlmIChmMnB5X3N1Y2Nl c3MpIG9mIGlpdGVyKi8NCiAgLyogRW5kIG9mIGNsZWFuaW5nIHZhcmlhYmxlIGlpdGVyICovDQog IGlmKChQeU9iamVjdCAqKWNhcGlfZGhoX3RtcCE9ZGhoX2NhcGkpIHsNCiAgICBQeV9YREVDUkVG KGNhcGlfZGhoX3RtcCk7IH0NCiAgfSAgLyppZiAoY2FwaV9kaGhfdG1wID09IE5VTEwpIC4uLiBl bHNlIG9mIGRoaCovDQogIC8qIEVuZCBvZiBjbGVhbmluZyB2YXJpYWJsZSBkaGggKi8NCiAgfSAv KmlmIChmMnB5X3N1Y2Nlc3MpIG9mIGlibnVtKi8NCiAgLyogRW5kIG9mIGNsZWFuaW5nIHZhcmlh YmxlIGlibnVtICovDQogIH0gLyppZiAoZjJweV9zdWNjZXNzKSBvZiBpaXN0ZXAqLw0KICAvKiBF bmQgb2YgY2xlYW5pbmcgdmFyaWFibGUgaWlzdGVwICovDQogIH0gLyppZiAoZjJweV9zdWNjZXNz KSBvZiBpbnN0ZXAqLw0KICAvKiBFbmQgb2YgY2xlYW5pbmcgdmFyaWFibGUgaW5zdGVwICovDQog IH0gLyppZiAoZjJweV9zdWNjZXNzKSBvZiBpcGluMSovDQogIC8qIEVuZCBvZiBjbGVhbmluZyB2 YXJpYWJsZSBpcGluMSAqLw0KICB9IC8qaWYgKGYycHlfc3VjY2Vzcykgb2YgaWlzdGF0Ki8NCiAg LyogRW5kIG9mIGNsZWFuaW5nIHZhcmlhYmxlIGlpc3RhdCAqLw0KLyplbmQgb2YgY2xlYW51cGZy b21weW9iaiovDQogIGlmIChjYXBpX2J1aWxkdmFsdWUgPT0gTlVMTCkgew0KLypyb3V0ZGVidWdm YWlsdXJlKi8NCiAgfSBlbHNlIHsNCi8qcm91dGRlYnVnbGVhdmUqLw0KICB9DQogIENGVU5DU01F U1MoIkZyZWVpbmcgbWVtb3J5LlxuIik7DQovKmZyZWVtZW0qLw0KI2lmZGVmIEYyUFlfUkVQT1JU X0FURVhJVA0KZjJweV9zdG9wX2Nsb2NrKCk7DQojZW5kaWYNCiAgcmV0dXJuIGNhcGlfYnVpbGR2 YWx1ZTsNCn0NCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogZW5kIG9mIG9wdGltaXpl ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KLyoqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqIG1vZGVsICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq Lw0Kc3RhdGljIGNoYXIgZG9jX2YycHlfcm91dF9vcHRfc3FwX21vZGVsW10gPSAiXA0KRnVuY3Rp b24gc2lnbmF0dXJlOlxuXA0KICBtb2RlbCgpXG5cDQoiOw0KLyogZXh0ZXJuIHZvaWQgRl9GVU5D KG1vZGVsLE1PREVMKSh2b2lkKTsgKi8NCnN0YXRpYyBQeU9iamVjdCAqZjJweV9yb3V0X29wdF9z cXBfbW9kZWwoY29uc3QgUHlPYmplY3QgKmNhcGlfc2VsZiwNCiAgICAgICAgICAgICAgICAgICAg ICAgICAgIFB5T2JqZWN0ICpjYXBpX2FyZ3MsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQ eU9iamVjdCAqY2FwaV9rZXl3ZHMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgq ZjJweV9mdW5jKSh2b2lkKSkgew0KICBQeU9iamVjdCAqIHZvbGF0aWxlIGNhcGlfYnVpbGR2YWx1 ZSA9IE5VTEw7DQogIHZvbGF0aWxlIGludCBmMnB5X3N1Y2Nlc3MgPSAxOw0KLypkZWNsKi8NCg0K ICBzdGF0aWMgY2hhciAqY2FwaV9rd2xpc3RbXSA9IHtOVUxMfTsNCg0KLypyb3V0ZGVidWdlbnRl ciovDQojaWZkZWYgRjJQWV9SRVBPUlRfQVRFWElUDQpmMnB5X3N0YXJ0X2Nsb2NrKCk7DQojZW5k aWYNCiAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoY2FwaV9hcmdzLGNhcGlfa2V5 d2RzLFwNCiAgICAifDpvcHRfc3FwLm1vZGVsIixcDQogICAgY2FwaV9rd2xpc3QpKQ0KICAgIHJl dHVybiBOVUxMOw0KLypmcm9tcHlvYmoqLw0KLyplbmQgb2YgZnJvbXB5b2JqKi8NCiNpZmRlZiBG MlBZX1JFUE9SVF9BVEVYSVQNCmYycHlfc3RhcnRfY2FsbF9jbG9jaygpOw0KI2VuZGlmDQovKmNh bGxmb3J0cmFucm91dGluZSovDQogICAgICAgICgqZjJweV9mdW5jKSgpOw0KI2lmZGVmIEYyUFlf UkVQT1JUX0FURVhJVA0KZjJweV9zdG9wX2NhbGxfY2xvY2soKTsNCiNlbmRpZg0KLyplbmQgb2Yg Y2FsbGZvcnRyYW5yb3V0aW5lKi8NCiAgICBpZiAoZjJweV9zdWNjZXNzKSB7DQovKnB5b2JqZnJv bSovDQovKmVuZCBvZiBweW9iamZyb20qLw0KICAgIENGVU5DU01FU1MoIkJ1aWxkaW5nIHJldHVy biB2YWx1ZS5cbiIpOw0KICAgIGNhcGlfYnVpbGR2YWx1ZSA9IFB5X0J1aWxkVmFsdWUoIiIpOw0K LypjbG9zZXB5b2JqZnJvbSovDQovKmVuZCBvZiBjbG9zZXB5b2JqZnJvbSovDQogICAgfSAvKmlm IChmMnB5X3N1Y2Nlc3MpIGFmdGVyIGNhbGxmb3J0cmFucm91dGluZSovDQovKmNsZWFudXBmcm9t cHlvYmoqLw0KLyplbmQgb2YgY2xlYW51cGZyb21weW9iaiovDQogIGlmIChjYXBpX2J1aWxkdmFs dWUgPT0gTlVMTCkgew0KLypyb3V0ZGVidWdmYWlsdXJlKi8NCiAgfSBlbHNlIHsNCi8qcm91dGRl YnVnbGVhdmUqLw0KICB9DQogIENGVU5DU01FU1MoIkZyZWVpbmcgbWVtb3J5LlxuIik7DQovKmZy ZWVtZW0qLw0KI2lmZGVmIEYyUFlfUkVQT1JUX0FURVhJVA0KZjJweV9zdG9wX2Nsb2NrKCk7DQoj ZW5kaWYNCiAgcmV0dXJuIGNhcGlfYnVpbGR2YWx1ZTsNCn0NCi8qKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKiBlbmQgb2YgbW9kZWwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KiovDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogZmNuMiAqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQpzdGF0aWMgY2hhciBkb2NfZjJweV9yb3V0 X29wdF9zcXBfZmNuMltdID0gIlwNCkZ1bmN0aW9uIHNpZ25hdHVyZTpcblwNCiAgZmNuMih4eCxv YmpmLG9ial9mLG9iamcsZmdyZCxjb25mLGNub3JtLGluZm8sW24sbSxsY25vcm1dKVxuXA0KUmVx dWlyZWQgYXJndW1lbnRzOlxuIg0KIiAgeHggOiBpbnB1dCByYW5rLTEgYXJyYXkoJ2QnKSB3aXRo IGJvdW5kcyAobilcbiINCiIgIG9iamYgOiBpbnB1dCBmbG9hdFxuIg0KIiAgb2JqX2YgOiBpbnB1 dCByYW5rLTEgYXJyYXkoJ2QnKSB3aXRoIGJvdW5kcyAobiArIDEpXG4iDQoiICBvYmpnIDogaW5w dXQgcmFuay0xIGFycmF5KCdkJykgd2l0aCBib3VuZHMgKG4gKyAxKVxuIg0KIiAgZmdyZCA6IGlu cHV0IHJhbmstMSBhcnJheSgnZCcpIHdpdGggYm91bmRzIChuKVxuIg0KIiAgY29uZiA6IGlucHV0 IHJhbmstMSBhcnJheSgnZCcpIHdpdGggYm91bmRzIChtKVxuIg0KIiAgY25vcm0gOiBpbnB1dCBy YW5rLTIgYXJyYXkoJ2QnKSB3aXRoIGJvdW5kcyAobGNub3JtLG0pXG4iDQoiICBpbmZvIDogaW5w dXQgaW50XG4iDQoiT3B0aW9uYWwgYXJndW1lbnRzOlxuIg0KIiAgbiA6PSBsZW4oeHgpIGlucHV0 IGludFxuIg0KIiAgbSA6PSBsZW4oY29uZikgaW5wdXQgaW50XG4iDQoiICBsY25vcm0gOj0gc2hh cGUoY25vcm0sMCkgaW5wdXQgaW50IjsNCi8qIGV4dGVybiB2b2lkIEZfRlVOQyhmY24yLEZDTjIp KGludCosaW50Kixkb3VibGUqLGRvdWJsZSosZG91YmxlKixkb3VibGUqLGRvdWJsZSosZG91Ymxl Kixkb3VibGUqLGludCosaW50Kik7ICovDQpzdGF0aWMgUHlPYmplY3QgKmYycHlfcm91dF9vcHRf c3FwX2ZjbjIoY29uc3QgUHlPYmplY3QgKmNhcGlfc2VsZiwNCiAgICAgICAgICAgICAgICAgICAg ICAgICAgIFB5T2JqZWN0ICpjYXBpX2FyZ3MsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQ eU9iamVjdCAqY2FwaV9rZXl3ZHMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgq ZjJweV9mdW5jKShpbnQqLGludCosZG91YmxlKixkb3VibGUqLGRvdWJsZSosZG91YmxlKixkb3Vi bGUqLGRvdWJsZSosZG91YmxlKixpbnQqLGludCopKSB7DQogIFB5T2JqZWN0ICogdm9sYXRpbGUg Y2FwaV9idWlsZHZhbHVlID0gTlVMTDsNCiAgdm9sYXRpbGUgaW50IGYycHlfc3VjY2VzcyA9IDE7 DQovKmRlY2wqLw0KDQogIGludCBuID0gMDsNCiAgUHlPYmplY3QgKm5fY2FwaSA9IFB5X05vbmU7 DQogIGludCBtID0gMDsNCiAgUHlPYmplY3QgKm1fY2FwaSA9IFB5X05vbmU7DQogIGRvdWJsZSAq eHggPSBOVUxMOw0KICBpbnQgeHhfRGltc1sxXSA9IHstMX07DQogIGNvbnN0IGludCB4eF9SYW5r ID0gMTsNCiAgUHlBcnJheU9iamVjdCAqY2FwaV94eF90bXAgPSBOVUxMOw0KICBpbnQgY2FwaV94 eF9pbnRlbnQgPSAwOw0KICBQeU9iamVjdCAqeHhfY2FwaSA9IFB5X05vbmU7DQogIGRvdWJsZSBv YmpmID0gMDsNCiAgUHlPYmplY3QgKm9iamZfY2FwaSA9IFB5X05vbmU7DQogIGRvdWJsZSAqb2Jq X2YgPSBOVUxMOw0KICBpbnQgb2JqX2ZfRGltc1sxXSA9IHstMX07DQogIGNvbnN0IGludCBvYmpf Zl9SYW5rID0gMTsNCiAgUHlBcnJheU9iamVjdCAqY2FwaV9vYmpfZl90bXAgPSBOVUxMOw0KICBp bnQgY2FwaV9vYmpfZl9pbnRlbnQgPSAwOw0KICBQeU9iamVjdCAqb2JqX2ZfY2FwaSA9IFB5X05v bmU7DQogIGRvdWJsZSAqb2JqZyA9IE5VTEw7DQogIGludCBvYmpnX0RpbXNbMV0gPSB7LTF9Ow0K ICBjb25zdCBpbnQgb2JqZ19SYW5rID0gMTsNCiAgUHlBcnJheU9iamVjdCAqY2FwaV9vYmpnX3Rt cCA9IE5VTEw7DQogIGludCBjYXBpX29iamdfaW50ZW50ID0gMDsNCiAgUHlPYmplY3QgKm9iamdf Y2FwaSA9IFB5X05vbmU7DQogIGRvdWJsZSAqZmdyZCA9IE5VTEw7DQogIGludCBmZ3JkX0RpbXNb MV0gPSB7LTF9Ow0KICBjb25zdCBpbnQgZmdyZF9SYW5rID0gMTsNCiAgUHlBcnJheU9iamVjdCAq Y2FwaV9mZ3JkX3RtcCA9IE5VTEw7DQogIGludCBjYXBpX2ZncmRfaW50ZW50ID0gMDsNCiAgUHlP YmplY3QgKmZncmRfY2FwaSA9IFB5X05vbmU7DQogIGRvdWJsZSAqY29uZiA9IE5VTEw7DQogIGlu dCBjb25mX0RpbXNbMV0gPSB7LTF9Ow0KICBjb25zdCBpbnQgY29uZl9SYW5rID0gMTsNCiAgUHlB cnJheU9iamVjdCAqY2FwaV9jb25mX3RtcCA9IE5VTEw7DQogIGludCBjYXBpX2NvbmZfaW50ZW50 ID0gMDsNCiAgUHlPYmplY3QgKmNvbmZfY2FwaSA9IFB5X05vbmU7DQogIGRvdWJsZSAqY25vcm0g PSBOVUxMOw0KICBpbnQgY25vcm1fRGltc1syXSA9IHstMSwgLTF9Ow0KICBjb25zdCBpbnQgY25v cm1fUmFuayA9IDI7DQogIFB5QXJyYXlPYmplY3QgKmNhcGlfY25vcm1fdG1wID0gTlVMTDsNCiAg aW50IGNhcGlfY25vcm1faW50ZW50ID0gMDsNCiAgUHlPYmplY3QgKmNub3JtX2NhcGkgPSBQeV9O b25lOw0KICBpbnQgbGNub3JtID0gMDsNCiAgUHlPYmplY3QgKmxjbm9ybV9jYXBpID0gUHlfTm9u ZTsNCiAgaW50IGluZm8gPSAwOw0KICBQeU9iamVjdCAqaW5mb19jYXBpID0gUHlfTm9uZTsNCiAg c3RhdGljIGNoYXIgKmNhcGlfa3dsaXN0W10gPSB7Inh4Iiwib2JqZiIsIm9ial9mIiwib2JqZyIs ImZncmQiLCJjb25mIiwiY25vcm0iLCJpbmZvIiwibiIsIm0iLCJsY25vcm0iLE5VTEx9Ow0KDQov KnJvdXRkZWJ1Z2VudGVyKi8NCiNpZmRlZiBGMlBZX1JFUE9SVF9BVEVYSVQNCmYycHlfc3RhcnRf Y2xvY2soKTsNCiNlbmRpZg0KICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhjYXBp X2FyZ3MsY2FwaV9rZXl3ZHMsXA0KICAgICJPT09PT09PT3xPT086b3B0X3NxcC5mY24yIixcDQog ICAgY2FwaV9rd2xpc3QsJnh4X2NhcGksJm9iamZfY2FwaSwmb2JqX2ZfY2FwaSwmb2JqZ19jYXBp LCZmZ3JkX2NhcGksJmNvbmZfY2FwaSwmY25vcm1fY2FwaSwmaW5mb19jYXBpLCZuX2NhcGksJm1f Y2FwaSwmbGNub3JtX2NhcGkpKQ0KICAgIHJldHVybiBOVUxMOw0KLypmcm9tcHlvYmoqLw0KICAv KiBQcm9jZXNzaW5nIHZhcmlhYmxlIGNvbmYgKi8NCiAgOw0KICBjYXBpX2NvbmZfaW50ZW50IHw9 IEYyUFlfSU5URU5UX0lOOw0KICBjYXBpX2NvbmZfdG1wID0gYXJyYXlfZnJvbV9weW9iaihQeUFy cmF5X0RPVUJMRSxjb25mX0RpbXMsY29uZl9SYW5rLGNhcGlfY29uZl9pbnRlbnQsY29uZl9jYXBp KTsNCiAgaWYgKGNhcGlfY29uZl90bXAgPT0gTlVMTCkgew0KICAgIGlmICghUHlFcnJfT2NjdXJy ZWQoKSkNCiAgICAgIFB5RXJyX1NldFN0cmluZyhvcHRfc3FwX2Vycm9yLCJmYWlsZWQgaW4gY29u dmVydGluZyA2dGggYXJndW1lbnQgYGNvbmYnIG9mIG9wdF9zcXAuZmNuMiB0byBDL0ZvcnRyYW4g YXJyYXkiICk7DQogIH0gZWxzZSB7DQogICAgY29uZiA9IChkb3VibGUgKikoY2FwaV9jb25mX3Rt cC0+ZGF0YSk7DQogIC8qIFByb2Nlc3NpbmcgdmFyaWFibGUgeHggKi8NCiAgOw0KICBjYXBpX3h4 X2ludGVudCB8PSBGMlBZX0lOVEVOVF9JTjsNCiAgY2FwaV94eF90bXAgPSBhcnJheV9mcm9tX3B5 b2JqKFB5QXJyYXlfRE9VQkxFLHh4X0RpbXMseHhfUmFuayxjYXBpX3h4X2ludGVudCx4eF9jYXBp KTsNCiAgaWYgKGNhcGlfeHhfdG1wID09IE5VTEwpIHsNCiAgICBpZiAoIVB5RXJyX09jY3VycmVk KCkpDQogICAgICBQeUVycl9TZXRTdHJpbmcob3B0X3NxcF9lcnJvciwiZmFpbGVkIGluIGNvbnZl cnRpbmcgMXN0IGFyZ3VtZW50IGB4eCcgb2Ygb3B0X3NxcC5mY24yIHRvIEMvRm9ydHJhbiBhcnJh eSIgKTsNCiAgfSBlbHNlIHsNCiAgICB4eCA9IChkb3VibGUgKikoY2FwaV94eF90bXAtPmRhdGEp Ow0KICAvKiBQcm9jZXNzaW5nIHZhcmlhYmxlIG9iamYgKi8NCiAgICBmMnB5X3N1Y2Nlc3MgPSBk b3VibGVfZnJvbV9weW9iaigmb2JqZixvYmpmX2NhcGksIm9wdF9zcXAuZmNuMigpIDJuZCBhcmd1 bWVudCAob2JqZikgY2FuJ3QgYmUgY29udmVydGVkIHRvIGRvdWJsZSIpOw0KICBpZiAoZjJweV9z dWNjZXNzKSB7DQogIC8qIFByb2Nlc3NpbmcgdmFyaWFibGUgaW5mbyAqLw0KICAgIGYycHlfc3Vj Y2VzcyA9IGludF9mcm9tX3B5b2JqKCZpbmZvLGluZm9fY2FwaSwib3B0X3NxcC5mY24yKCkgOHRo IGFyZ3VtZW50IChpbmZvKSBjYW4ndCBiZSBjb252ZXJ0ZWQgdG8gaW50Iik7DQogIGlmIChmMnB5 X3N1Y2Nlc3MpIHsNCiAgLyogUHJvY2Vzc2luZyB2YXJpYWJsZSBuICovDQogIGlmIChuX2NhcGkg PT0gUHlfTm9uZSkgbiA9IGxlbih4eCk7IGVsc2UNCiAgICBmMnB5X3N1Y2Nlc3MgPSBpbnRfZnJv bV9weW9iaigmbixuX2NhcGksIm9wdF9zcXAuZmNuMigpIDFzdCBrZXl3b3JkIChuKSBjYW4ndCBi ZSBjb252ZXJ0ZWQgdG8gaW50Iik7DQogIGlmIChmMnB5X3N1Y2Nlc3MpIHsNCiAgQ0hFQ0tTQ0FM QVIobGVuKHh4KT49biwibGVuKHh4KT49biIsIjFzdCBrZXl3b3JkIG4iLCJmY24yOm49JWQiLG4p IHsNCiAgLyogUHJvY2Vzc2luZyB2YXJpYWJsZSBvYmpfZiAqLw0KICBvYmpfZl9EaW1zWzBdPW4g KyAxOw0KICBjYXBpX29ial9mX2ludGVudCB8PSBGMlBZX0lOVEVOVF9JTjsNCiAgY2FwaV9vYmpf Zl90bXAgPSBhcnJheV9mcm9tX3B5b2JqKFB5QXJyYXlfRE9VQkxFLG9ial9mX0RpbXMsb2JqX2Zf UmFuayxjYXBpX29ial9mX2ludGVudCxvYmpfZl9jYXBpKTsNCiAgaWYgKGNhcGlfb2JqX2ZfdG1w ID09IE5VTEwpIHsNCiAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpDQogICAgICBQeUVycl9TZXRT dHJpbmcob3B0X3NxcF9lcnJvciwiZmFpbGVkIGluIGNvbnZlcnRpbmcgM3JkIGFyZ3VtZW50IGBv YmpfZicgb2Ygb3B0X3NxcC5mY24yIHRvIEMvRm9ydHJhbiBhcnJheSIgKTsNCiAgfSBlbHNlIHsN CiAgICBvYmpfZiA9IChkb3VibGUgKikoY2FwaV9vYmpfZl90bXAtPmRhdGEpOw0KICAvKiBQcm9j ZXNzaW5nIHZhcmlhYmxlIGZncmQgKi8NCiAgZmdyZF9EaW1zWzBdPW47DQogIGNhcGlfZmdyZF9p bnRlbnQgfD0gRjJQWV9JTlRFTlRfSU47DQogIGNhcGlfZmdyZF90bXAgPSBhcnJheV9mcm9tX3B5 b2JqKFB5QXJyYXlfRE9VQkxFLGZncmRfRGltcyxmZ3JkX1JhbmssY2FwaV9mZ3JkX2ludGVudCxm Z3JkX2NhcGkpOw0KICBpZiAoY2FwaV9mZ3JkX3RtcCA9PSBOVUxMKSB7DQogICAgaWYgKCFQeUVy cl9PY2N1cnJlZCgpKQ0KICAgICAgUHlFcnJfU2V0U3RyaW5nKG9wdF9zcXBfZXJyb3IsImZhaWxl ZCBpbiBjb252ZXJ0aW5nIDV0aCBhcmd1bWVudCBgZmdyZCcgb2Ygb3B0X3NxcC5mY24yIHRvIEMv Rm9ydHJhbiBhcnJheSIgKTsNCiAgfSBlbHNlIHsNCiAgICBmZ3JkID0gKGRvdWJsZSAqKShjYXBp X2ZncmRfdG1wLT5kYXRhKTsNCiAgLyogUHJvY2Vzc2luZyB2YXJpYWJsZSBtICovDQogIGlmICht X2NhcGkgPT0gUHlfTm9uZSkgbSA9IGxlbihjb25mKTsgZWxzZQ0KICAgIGYycHlfc3VjY2VzcyA9 IGludF9mcm9tX3B5b2JqKCZtLG1fY2FwaSwib3B0X3NxcC5mY24yKCkgMm5kIGtleXdvcmQgKG0p IGNhbid0IGJlIGNvbnZlcnRlZCB0byBpbnQiKTsNCiAgaWYgKGYycHlfc3VjY2Vzcykgew0KICBD SEVDS1NDQUxBUihsZW4oY29uZik+PW0sImxlbihjb25mKT49bSIsIjJuZCBrZXl3b3JkIG0iLCJm Y24yOm09JWQiLG0pIHsNCiAgLyogUHJvY2Vzc2luZyB2YXJpYWJsZSBjbm9ybSAqLw0KICBjbm9y bV9EaW1zWzFdPW07DQogIGNhcGlfY25vcm1faW50ZW50IHw9IEYyUFlfSU5URU5UX0lOOw0KICBj YXBpX2Nub3JtX3RtcCA9IGFycmF5X2Zyb21fcHlvYmooUHlBcnJheV9ET1VCTEUsY25vcm1fRGlt cyxjbm9ybV9SYW5rLGNhcGlfY25vcm1faW50ZW50LGNub3JtX2NhcGkpOw0KICBpZiAoY2FwaV9j bm9ybV90bXAgPT0gTlVMTCkgew0KICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkNCiAgICAgIFB5 RXJyX1NldFN0cmluZyhvcHRfc3FwX2Vycm9yLCJmYWlsZWQgaW4gY29udmVydGluZyA3dGggYXJn dW1lbnQgYGNub3JtJyBvZiBvcHRfc3FwLmZjbjIgdG8gQy9Gb3J0cmFuIGFycmF5IiApOw0KICB9 IGVsc2Ugew0KICAgIGNub3JtID0gKGRvdWJsZSAqKShjYXBpX2Nub3JtX3RtcC0+ZGF0YSk7DQog IC8qIFByb2Nlc3NpbmcgdmFyaWFibGUgb2JqZyAqLw0KICBvYmpnX0RpbXNbMF09biArIDE7DQog IGNhcGlfb2JqZ19pbnRlbnQgfD0gRjJQWV9JTlRFTlRfSU47DQogIGNhcGlfb2JqZ190bXAgPSBh cnJheV9mcm9tX3B5b2JqKFB5QXJyYXlfRE9VQkxFLG9iamdfRGltcyxvYmpnX1JhbmssY2FwaV9v YmpnX2ludGVudCxvYmpnX2NhcGkpOw0KICBpZiAoY2FwaV9vYmpnX3RtcCA9PSBOVUxMKSB7DQog ICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKQ0KICAgICAgUHlFcnJfU2V0U3RyaW5nKG9wdF9zcXBf ZXJyb3IsImZhaWxlZCBpbiBjb252ZXJ0aW5nIDR0aCBhcmd1bWVudCBgb2JqZycgb2Ygb3B0X3Nx cC5mY24yIHRvIEMvRm9ydHJhbiBhcnJheSIgKTsNCiAgfSBlbHNlIHsNCiAgICBvYmpnID0gKGRv dWJsZSAqKShjYXBpX29iamdfdG1wLT5kYXRhKTsNCiAgLyogUHJvY2Vzc2luZyB2YXJpYWJsZSBs Y25vcm0gKi8NCiAgaWYgKGxjbm9ybV9jYXBpID09IFB5X05vbmUpIGxjbm9ybSA9IHNoYXBlKGNu b3JtLDApOyBlbHNlDQogICAgZjJweV9zdWNjZXNzID0gaW50X2Zyb21fcHlvYmooJmxjbm9ybSxs Y25vcm1fY2FwaSwib3B0X3NxcC5mY24yKCkgM3JkIGtleXdvcmQgKGxjbm9ybSkgY2FuJ3QgYmUg Y29udmVydGVkIHRvIGludCIpOw0KICBpZiAoZjJweV9zdWNjZXNzKSB7DQogIENIRUNLU0NBTEFS KHNoYXBlKGNub3JtLDApPT1sY25vcm0sInNoYXBlKGNub3JtLDApPT1sY25vcm0iLCIzcmQga2V5 d29yZCBsY25vcm0iLCJmY24yOmxjbm9ybT0lZCIsbGNub3JtKSB7DQovKmVuZCBvZiBmcm9tcHlv YmoqLw0KI2lmZGVmIEYyUFlfUkVQT1JUX0FURVhJVA0KZjJweV9zdGFydF9jYWxsX2Nsb2NrKCk7 DQojZW5kaWYNCi8qY2FsbGZvcnRyYW5yb3V0aW5lKi8NCiAgICAgICAgKCpmMnB5X2Z1bmMpKCZu LCZtLHh4LCZvYmpmLG9ial9mLG9iamcsZmdyZCxjb25mLGNub3JtLCZsY25vcm0sJmluZm8pOw0K I2lmZGVmIEYyUFlfUkVQT1JUX0FURVhJVA0KZjJweV9zdG9wX2NhbGxfY2xvY2soKTsNCiNlbmRp Zg0KLyplbmQgb2YgY2FsbGZvcnRyYW5yb3V0aW5lKi8NCiAgICBpZiAoZjJweV9zdWNjZXNzKSB7 DQovKnB5b2JqZnJvbSovDQovKmVuZCBvZiBweW9iamZyb20qLw0KICAgIENGVU5DU01FU1MoIkJ1 aWxkaW5nIHJldHVybiB2YWx1ZS5cbiIpOw0KICAgIGNhcGlfYnVpbGR2YWx1ZSA9IFB5X0J1aWxk VmFsdWUoIiIpOw0KLypjbG9zZXB5b2JqZnJvbSovDQovKmVuZCBvZiBjbG9zZXB5b2JqZnJvbSov DQogICAgfSAvKmlmIChmMnB5X3N1Y2Nlc3MpIGFmdGVyIGNhbGxmb3J0cmFucm91dGluZSovDQov KmNsZWFudXBmcm9tcHlvYmoqLw0KICB9IC8qQ0hFQ0tTQ0FMQVIoc2hhcGUoY25vcm0sMCk9PWxj bm9ybSkqLw0KICB9IC8qaWYgKGYycHlfc3VjY2Vzcykgb2YgbGNub3JtKi8NCiAgLyogRW5kIG9m IGNsZWFuaW5nIHZhcmlhYmxlIGxjbm9ybSAqLw0KICBpZigoUHlPYmplY3QgKiljYXBpX29iamdf dG1wIT1vYmpnX2NhcGkpIHsNCiAgICBQeV9YREVDUkVGKGNhcGlfb2JqZ190bXApOyB9DQogIH0g IC8qaWYgKGNhcGlfb2JqZ190bXAgPT0gTlVMTCkgLi4uIGVsc2Ugb2Ygb2JqZyovDQogIC8qIEVu ZCBvZiBjbGVhbmluZyB2YXJpYWJsZSBvYmpnICovDQogIGlmKChQeU9iamVjdCAqKWNhcGlfY25v cm1fdG1wIT1jbm9ybV9jYXBpKSB7DQogICAgUHlfWERFQ1JFRihjYXBpX2Nub3JtX3RtcCk7IH0N CiAgfSAgLyppZiAoY2FwaV9jbm9ybV90bXAgPT0gTlVMTCkgLi4uIGVsc2Ugb2YgY25vcm0qLw0K ICAvKiBFbmQgb2YgY2xlYW5pbmcgdmFyaWFibGUgY25vcm0gKi8NCiAgfSAvKkNIRUNLU0NBTEFS KGxlbihjb25mKT49bSkqLw0KICB9IC8qaWYgKGYycHlfc3VjY2Vzcykgb2YgbSovDQogIC8qIEVu ZCBvZiBjbGVhbmluZyB2YXJpYWJsZSBtICovDQogIGlmKChQeU9iamVjdCAqKWNhcGlfZmdyZF90 bXAhPWZncmRfY2FwaSkgew0KICAgIFB5X1hERUNSRUYoY2FwaV9mZ3JkX3RtcCk7IH0NCiAgfSAg LyppZiAoY2FwaV9mZ3JkX3RtcCA9PSBOVUxMKSAuLi4gZWxzZSBvZiBmZ3JkKi8NCiAgLyogRW5k IG9mIGNsZWFuaW5nIHZhcmlhYmxlIGZncmQgKi8NCiAgaWYoKFB5T2JqZWN0ICopY2FwaV9vYmpf Zl90bXAhPW9ial9mX2NhcGkpIHsNCiAgICBQeV9YREVDUkVGKGNhcGlfb2JqX2ZfdG1wKTsgfQ0K ICB9ICAvKmlmIChjYXBpX29ial9mX3RtcCA9PSBOVUxMKSAuLi4gZWxzZSBvZiBvYmpfZiovDQog IC8qIEVuZCBvZiBjbGVhbmluZyB2YXJpYWJsZSBvYmpfZiAqLw0KICB9IC8qQ0hFQ0tTQ0FMQVIo bGVuKHh4KT49bikqLw0KICB9IC8qaWYgKGYycHlfc3VjY2Vzcykgb2YgbiovDQogIC8qIEVuZCBv ZiBjbGVhbmluZyB2YXJpYWJsZSBuICovDQogIH0gLyppZiAoZjJweV9zdWNjZXNzKSBvZiBpbmZv Ki8NCiAgLyogRW5kIG9mIGNsZWFuaW5nIHZhcmlhYmxlIGluZm8gKi8NCiAgfSAvKmlmIChmMnB5 X3N1Y2Nlc3MpIG9mIG9iamYqLw0KICAvKiBFbmQgb2YgY2xlYW5pbmcgdmFyaWFibGUgb2JqZiAq Lw0KICBpZigoUHlPYmplY3QgKiljYXBpX3h4X3RtcCE9eHhfY2FwaSkgew0KICAgIFB5X1hERUNS RUYoY2FwaV94eF90bXApOyB9DQogIH0gIC8qaWYgKGNhcGlfeHhfdG1wID09IE5VTEwpIC4uLiBl bHNlIG9mIHh4Ki8NCiAgLyogRW5kIG9mIGNsZWFuaW5nIHZhcmlhYmxlIHh4ICovDQogIGlmKChQ eU9iamVjdCAqKWNhcGlfY29uZl90bXAhPWNvbmZfY2FwaSkgew0KICAgIFB5X1hERUNSRUYoY2Fw aV9jb25mX3RtcCk7IH0NCiAgfSAgLyppZiAoY2FwaV9jb25mX3RtcCA9PSBOVUxMKSAuLi4gZWxz ZSBvZiBjb25mKi8NCiAgLyogRW5kIG9mIGNsZWFuaW5nIHZhcmlhYmxlIGNvbmYgKi8NCi8qZW5k IG9mIGNsZWFudXBmcm9tcHlvYmoqLw0KICBpZiAoY2FwaV9idWlsZHZhbHVlID09IE5VTEwpIHsN Ci8qcm91dGRlYnVnZmFpbHVyZSovDQogIH0gZWxzZSB7DQovKnJvdXRkZWJ1Z2xlYXZlKi8NCiAg fQ0KICBDRlVOQ1NNRVNTKCJGcmVlaW5nIG1lbW9yeS5cbiIpOw0KLypmcmVlbWVtKi8NCiNpZmRl ZiBGMlBZX1JFUE9SVF9BVEVYSVQNCmYycHlfc3RvcF9jbG9jaygpOw0KI2VuZGlmDQogIHJldHVy biBjYXBpX2J1aWxkdmFsdWU7DQp9DQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiog ZW5kIG9mIGZjbjIgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoNCi8qKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKiBwYXJzaCAqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKi8NCnN0YXRpYyBjaGFyIGRvY19mMnB5X3JvdXRfb3B0X3NxcF9wYXJzaFtd ID0gIlwNCkZ1bmN0aW9uIHNpZ25hdHVyZTpcblwNCiAgcGFyc2gob2JqX2Ysb2JqZyxbbl0pXG5c DQpSZXF1aXJlZCBhcmd1bWVudHM6XG4iDQoiICBvYmpfZiA6IGlucHV0IHJhbmstMSBhcnJheSgn ZCcpIHdpdGggYm91bmRzIChuICsgMSlcbiINCiIgIG9iamcgOiBpbnB1dCByYW5rLTEgYXJyYXko J2QnKSB3aXRoIGJvdW5kcyAobiArIDEpXG4iDQoiT3B0aW9uYWwgYXJndW1lbnRzOlxuIg0KIiAg biA6PSAobGVuKG9ial9mKS0xKSBpbnB1dCBpbnQiOw0KLyogZXh0ZXJuIHZvaWQgRl9GVU5DKHBh cnNoLFBBUlNIKShpbnQqLGRvdWJsZSosZG91YmxlKik7ICovDQpzdGF0aWMgUHlPYmplY3QgKmYy cHlfcm91dF9vcHRfc3FwX3BhcnNoKGNvbnN0IFB5T2JqZWN0ICpjYXBpX3NlbGYsDQogICAgICAg ICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqY2FwaV9hcmdzLA0KICAgICAgICAgICAgICAg ICAgICAgICAgICAgUHlPYmplY3QgKmNhcGlfa2V5d2RzLA0KICAgICAgICAgICAgICAgICAgICAg ICAgICAgdm9pZCAoKmYycHlfZnVuYykoaW50Kixkb3VibGUqLGRvdWJsZSopKSB7DQogIFB5T2Jq ZWN0ICogdm9sYXRpbGUgY2FwaV9idWlsZHZhbHVlID0gTlVMTDsNCiAgdm9sYXRpbGUgaW50IGYy cHlfc3VjY2VzcyA9IDE7DQovKmRlY2wqLw0KDQogIGludCBuID0gMDsNCiAgUHlPYmplY3QgKm5f Y2FwaSA9IFB5X05vbmU7DQogIGRvdWJsZSAqb2JqX2YgPSBOVUxMOw0KICBpbnQgb2JqX2ZfRGlt c1sxXSA9IHstMX07DQogIGNvbnN0IGludCBvYmpfZl9SYW5rID0gMTsNCiAgUHlBcnJheU9iamVj dCAqY2FwaV9vYmpfZl90bXAgPSBOVUxMOw0KICBpbnQgY2FwaV9vYmpfZl9pbnRlbnQgPSAwOw0K ICBQeU9iamVjdCAqb2JqX2ZfY2FwaSA9IFB5X05vbmU7DQogIGRvdWJsZSAqb2JqZyA9IE5VTEw7 DQogIGludCBvYmpnX0RpbXNbMV0gPSB7LTF9Ow0KICBjb25zdCBpbnQgb2JqZ19SYW5rID0gMTsN CiAgUHlBcnJheU9iamVjdCAqY2FwaV9vYmpnX3RtcCA9IE5VTEw7DQogIGludCBjYXBpX29iamdf aW50ZW50ID0gMDsNCiAgUHlPYmplY3QgKm9iamdfY2FwaSA9IFB5X05vbmU7DQogIHN0YXRpYyBj aGFyICpjYXBpX2t3bGlzdFtdID0geyJvYmpfZiIsIm9iamciLCJuIixOVUxMfTsNCg0KLypyb3V0 ZGVidWdlbnRlciovDQojaWZkZWYgRjJQWV9SRVBPUlRfQVRFWElUDQpmMnB5X3N0YXJ0X2Nsb2Nr KCk7DQojZW5kaWYNCiAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoY2FwaV9hcmdz LGNhcGlfa2V5d2RzLFwNCiAgICAiT098TzpvcHRfc3FwLnBhcnNoIixcDQogICAgY2FwaV9rd2xp c3QsJm9ial9mX2NhcGksJm9iamdfY2FwaSwmbl9jYXBpKSkNCiAgICByZXR1cm4gTlVMTDsNCi8q ZnJvbXB5b2JqKi8NCiAgLyogUHJvY2Vzc2luZyB2YXJpYWJsZSBvYmpfZiAqLw0KICA7DQogIGNh cGlfb2JqX2ZfaW50ZW50IHw9IEYyUFlfSU5URU5UX0lOOw0KICBjYXBpX29ial9mX3RtcCA9IGFy cmF5X2Zyb21fcHlvYmooUHlBcnJheV9ET1VCTEUsb2JqX2ZfRGltcyxvYmpfZl9SYW5rLGNhcGlf b2JqX2ZfaW50ZW50LG9ial9mX2NhcGkpOw0KICBpZiAoY2FwaV9vYmpfZl90bXAgPT0gTlVMTCkg ew0KICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkNCiAgICAgIFB5RXJyX1NldFN0cmluZyhvcHRf c3FwX2Vycm9yLCJmYWlsZWQgaW4gY29udmVydGluZyAxc3QgYXJndW1lbnQgYG9ial9mJyBvZiBv cHRfc3FwLnBhcnNoIHRvIEMvRm9ydHJhbiBhcnJheSIgKTsNCiAgfSBlbHNlIHsNCiAgICBvYmpf ZiA9IChkb3VibGUgKikoY2FwaV9vYmpfZl90bXAtPmRhdGEpOw0KICAvKiBQcm9jZXNzaW5nIHZh cmlhYmxlIG4gKi8NCiAgaWYgKG5fY2FwaSA9PSBQeV9Ob25lKSBuID0gKGxlbihvYmpfZiktMSk7 IGVsc2UNCiAgICBmMnB5X3N1Y2Nlc3MgPSBpbnRfZnJvbV9weW9iaigmbixuX2NhcGksIm9wdF9z cXAucGFyc2goKSAxc3Qga2V5d29yZCAobikgY2FuJ3QgYmUgY29udmVydGVkIHRvIGludCIpOw0K ICBpZiAoZjJweV9zdWNjZXNzKSB7DQogIENIRUNLU0NBTEFSKChsZW4ob2JqX2YpLTEpPj1uLCIo bGVuKG9ial9mKS0xKT49biIsIjFzdCBrZXl3b3JkIG4iLCJwYXJzaDpuPSVkIixuKSB7DQogIC8q IFByb2Nlc3NpbmcgdmFyaWFibGUgb2JqZyAqLw0KICBvYmpnX0RpbXNbMF09biArIDE7DQogIGNh cGlfb2JqZ19pbnRlbnQgfD0gRjJQWV9JTlRFTlRfSU47DQogIGNhcGlfb2JqZ190bXAgPSBhcnJh eV9mcm9tX3B5b2JqKFB5QXJyYXlfRE9VQkxFLG9iamdfRGltcyxvYmpnX1JhbmssY2FwaV9vYmpn X2ludGVudCxvYmpnX2NhcGkpOw0KICBpZiAoY2FwaV9vYmpnX3RtcCA9PSBOVUxMKSB7DQogICAg aWYgKCFQeUVycl9PY2N1cnJlZCgpKQ0KICAgICAgUHlFcnJfU2V0U3RyaW5nKG9wdF9zcXBfZXJy b3IsImZhaWxlZCBpbiBjb252ZXJ0aW5nIDJuZCBhcmd1bWVudCBgb2JqZycgb2Ygb3B0X3NxcC5w YXJzaCB0byBDL0ZvcnRyYW4gYXJyYXkiICk7DQogIH0gZWxzZSB7DQogICAgb2JqZyA9IChkb3Vi bGUgKikoY2FwaV9vYmpnX3RtcC0+ZGF0YSk7DQovKmVuZCBvZiBmcm9tcHlvYmoqLw0KI2lmZGVm IEYyUFlfUkVQT1JUX0FURVhJVA0KZjJweV9zdGFydF9jYWxsX2Nsb2NrKCk7DQojZW5kaWYNCi8q Y2FsbGZvcnRyYW5yb3V0aW5lKi8NCiAgICAgICAgKCpmMnB5X2Z1bmMpKCZuLG9ial9mLG9iamcp Ow0KI2lmZGVmIEYyUFlfUkVQT1JUX0FURVhJVA0KZjJweV9zdG9wX2NhbGxfY2xvY2soKTsNCiNl bmRpZg0KLyplbmQgb2YgY2FsbGZvcnRyYW5yb3V0aW5lKi8NCiAgICBpZiAoZjJweV9zdWNjZXNz KSB7DQovKnB5b2JqZnJvbSovDQovKmVuZCBvZiBweW9iamZyb20qLw0KICAgIENGVU5DU01FU1Mo IkJ1aWxkaW5nIHJldHVybiB2YWx1ZS5cbiIpOw0KICAgIGNhcGlfYnVpbGR2YWx1ZSA9IFB5X0J1 aWxkVmFsdWUoIiIpOw0KLypjbG9zZXB5b2JqZnJvbSovDQovKmVuZCBvZiBjbG9zZXB5b2JqZnJv bSovDQogICAgfSAvKmlmIChmMnB5X3N1Y2Nlc3MpIGFmdGVyIGNhbGxmb3J0cmFucm91dGluZSov DQovKmNsZWFudXBmcm9tcHlvYmoqLw0KICBpZigoUHlPYmplY3QgKiljYXBpX29iamdfdG1wIT1v YmpnX2NhcGkpIHsNCiAgICBQeV9YREVDUkVGKGNhcGlfb2JqZ190bXApOyB9DQogIH0gIC8qaWYg KGNhcGlfb2JqZ190bXAgPT0gTlVMTCkgLi4uIGVsc2Ugb2Ygb2JqZyovDQogIC8qIEVuZCBvZiBj bGVhbmluZyB2YXJpYWJsZSBvYmpnICovDQogIH0gLypDSEVDS1NDQUxBUigobGVuKG9ial9mKS0x KT49bikqLw0KICB9IC8qaWYgKGYycHlfc3VjY2Vzcykgb2YgbiovDQogIC8qIEVuZCBvZiBjbGVh bmluZyB2YXJpYWJsZSBuICovDQogIGlmKChQeU9iamVjdCAqKWNhcGlfb2JqX2ZfdG1wIT1vYmpf Zl9jYXBpKSB7DQogICAgUHlfWERFQ1JFRihjYXBpX29ial9mX3RtcCk7IH0NCiAgfSAgLyppZiAo Y2FwaV9vYmpfZl90bXAgPT0gTlVMTCkgLi4uIGVsc2Ugb2Ygb2JqX2YqLw0KICAvKiBFbmQgb2Yg Y2xlYW5pbmcgdmFyaWFibGUgb2JqX2YgKi8NCi8qZW5kIG9mIGNsZWFudXBmcm9tcHlvYmoqLw0K ICBpZiAoY2FwaV9idWlsZHZhbHVlID09IE5VTEwpIHsNCi8qcm91dGRlYnVnZmFpbHVyZSovDQog IH0gZWxzZSB7DQovKnJvdXRkZWJ1Z2xlYXZlKi8NCiAgfQ0KICBDRlVOQ1NNRVNTKCJGcmVlaW5n IG1lbW9yeS5cbiIpOw0KLypmcmVlbWVtKi8NCiNpZmRlZiBGMlBZX1JFUE9SVF9BVEVYSVQNCmYy cHlfc3RvcF9jbG9jaygpOw0KI2VuZGlmDQogIHJldHVybiBjYXBpX2J1aWxkdmFsdWU7DQp9DQov KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogZW5kIG9mIHBhcnNoICoqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqLw0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqIHNxcDEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kc3RhdGlj IGNoYXIgZG9jX2YycHlfcm91dF9vcHRfc3FwX3NxcDFbXSA9ICJcDQpGdW5jdGlvbiBzaWduYXR1 cmU6XG5cDQogIHNxcDEoZmNuLG1lcSx4LG9iamYsZmdyZCxjb25mLGNub3JtLHZsYW0sdG9sLGlw cmludCxud3JpdGUsaW5mbyx3YSxpd2Esb2JqX2Ysb2JqZyxpYm51bSxbbixtLGxjbm9ybSxsd2Es bGl3YSxmY25fZXh0cmFfYXJnc10pXG5cDQpSZXF1aXJlZCBhcmd1bWVudHM6XG4iDQoiICBmY24g OiBjYWxsLWJhY2sgZnVuY3Rpb25cbiINCiIgIG1lcSA6IGlucHV0IGludFxuIg0KIiAgeCA6IGlu cHV0IHJhbmstMSBhcnJheSgnZCcpIHdpdGggYm91bmRzIChuKVxuIg0KIiAgb2JqZiA6IGlucHV0 IGZsb2F0XG4iDQoiICBmZ3JkIDogaW5wdXQgcmFuay0xIGFycmF5KCdkJykgd2l0aCBib3VuZHMg KG4pXG4iDQoiICBjb25mIDogaW5wdXQgcmFuay0xIGFycmF5KCdkJykgd2l0aCBib3VuZHMgKG0p XG4iDQoiICBjbm9ybSA6IGlucHV0IHJhbmstMiBhcnJheSgnZCcpIHdpdGggYm91bmRzIChsY25v cm0sbSlcbiINCiIgIHZsYW0gOiBpbnB1dCByYW5rLTEgYXJyYXkoJ2QnKSB3aXRoIGJvdW5kcyAo bSlcbiINCiIgIHRvbCA6IGlucHV0IGZsb2F0XG4iDQoiICBpcHJpbnQgOiBpbnB1dCBpbnRcbiIN CiIgIG53cml0ZSA6IGlucHV0IGludFxuIg0KIiAgaW5mbyA6IGlucHV0IGludFxuIg0KIiAgd2Eg OiBpbnB1dCByYW5rLTEgYXJyYXkoJ2QnKSB3aXRoIGJvdW5kcyAobHdhKVxuIg0KIiAgaXdhIDog aW5wdXQgcmFuay0xIGFycmF5KCdpJykgd2l0aCBib3VuZHMgKGxpd2EpXG4iDQoiICBvYmpfZiA6 IGlucHV0IHJhbmstMSBhcnJheSgnZCcpIHdpdGggYm91bmRzIChuICsgMSlcbiINCiIgIG9iamcg OiBpbnB1dCByYW5rLTEgYXJyYXkoJ2QnKSB3aXRoIGJvdW5kcyAobiArIDEpXG4iDQoiICBpYm51 bSA6IGlucHV0IGludFxuIg0KIk9wdGlvbmFsIGFyZ3VtZW50czpcbiINCiIgIGZjbl9leHRyYV9h cmdzIDo9ICgpIGlucHV0IHR1cGxlXG4iDQoiICBuIDo9IGxlbih4KSBpbnB1dCBpbnRcbiINCiIg IG0gOj0gbGVuKGNvbmYpIGlucHV0IGludFxuIg0KIiAgbGNub3JtIDo9IHNoYXBlKGNub3JtLDAp IGlucHV0IGludFxuIg0KIiAgbHdhIDo9IGxlbih3YSkgaW5wdXQgaW50XG4iDQoiICBsaXdhIDo9 IGxlbihpd2EpIGlucHV0IGludFxuIg0KIkNhbGwtYmFjayBmdW5jdGlvbnM6XG4iDQoiI2NiZG9j c3RyIyI7DQovKiBleHRlcm4gdm9pZCBGX0ZVTkMoc3FwMSxTUVAxKSh2b2lkKixpbnQqLGludCos aW50Kixkb3VibGUqLGRvdWJsZSosZG91YmxlKixkb3VibGUqLGRvdWJsZSosaW50Kixkb3VibGUq LGRvdWJsZSosaW50KixpbnQqLGludCosZG91YmxlKixpbnQqLGludCosaW50Kixkb3VibGUqLGRv dWJsZSosaW50Kik7ICovDQpzdGF0aWMgUHlPYmplY3QgKmYycHlfcm91dF9vcHRfc3FwX3NxcDEo Y29uc3QgUHlPYmplY3QgKmNhcGlfc2VsZiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5 T2JqZWN0ICpjYXBpX2FyZ3MsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAq Y2FwaV9rZXl3ZHMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqZjJweV9mdW5j KSh2b2lkKixpbnQqLGludCosaW50Kixkb3VibGUqLGRvdWJsZSosZG91YmxlKixkb3VibGUqLGRv dWJsZSosaW50Kixkb3VibGUqLGRvdWJsZSosaW50KixpbnQqLGludCosZG91YmxlKixpbnQqLGlu dCosaW50Kixkb3VibGUqLGRvdWJsZSosaW50KikpIHsNCiAgUHlPYmplY3QgKiB2b2xhdGlsZSBj YXBpX2J1aWxkdmFsdWUgPSBOVUxMOw0KICB2b2xhdGlsZSBpbnQgZjJweV9zdWNjZXNzID0gMTsN Ci8qZGVjbCovDQoNCiAgUHlPYmplY3QgKmZjbl9jYXBpID0gUHlfTm9uZTsNCiAgUHlUdXBsZU9i amVjdCAqZmNuX3hhX2NhcGkgPSBOVUxMOw0KICBQeVR1cGxlT2JqZWN0ICpmY25fYXJnc19jYXBp ID0gTlVMTDsNCiAgaW50IGZjbl9ub2ZhcmdzX2NhcGkgPSAwOw0KICBpbnQgbiA9IDA7DQogIFB5 T2JqZWN0ICpuX2NhcGkgPSBQeV9Ob25lOw0KICBpbnQgbSA9IDA7DQogIFB5T2JqZWN0ICptX2Nh cGkgPSBQeV9Ob25lOw0KICBpbnQgbWVxID0gMDsNCiAgUHlPYmplY3QgKm1lcV9jYXBpID0gUHlf Tm9uZTsNCiAgZG91YmxlICp4ID0gTlVMTDsNCiAgaW50IHhfRGltc1sxXSA9IHstMX07DQogIGNv bnN0IGludCB4X1JhbmsgPSAxOw0KICBQeUFycmF5T2JqZWN0ICpjYXBpX3hfdG1wID0gTlVMTDsN CiAgaW50IGNhcGlfeF9pbnRlbnQgPSAwOw0KICBQeU9iamVjdCAqeF9jYXBpID0gUHlfTm9uZTsN CiAgZG91YmxlIG9iamYgPSAwOw0KICBQeU9iamVjdCAqb2JqZl9jYXBpID0gUHlfTm9uZTsNCiAg ZG91YmxlICpmZ3JkID0gTlVMTDsNCiAgaW50IGZncmRfRGltc1sxXSA9IHstMX07DQogIGNvbnN0 IGludCBmZ3JkX1JhbmsgPSAxOw0KICBQeUFycmF5T2JqZWN0ICpjYXBpX2ZncmRfdG1wID0gTlVM TDsNCiAgaW50IGNhcGlfZmdyZF9pbnRlbnQgPSAwOw0KICBQeU9iamVjdCAqZmdyZF9jYXBpID0g UHlfTm9uZTsNCiAgZG91YmxlICpjb25mID0gTlVMTDsNCiAgaW50IGNvbmZfRGltc1sxXSA9IHst MX07DQogIGNvbnN0IGludCBjb25mX1JhbmsgPSAxOw0KICBQeUFycmF5T2JqZWN0ICpjYXBpX2Nv bmZfdG1wID0gTlVMTDsNCiAgaW50IGNhcGlfY29uZl9pbnRlbnQgPSAwOw0KICBQeU9iamVjdCAq Y29uZl9jYXBpID0gUHlfTm9uZTsNCiAgZG91YmxlICpjbm9ybSA9IE5VTEw7DQogIGludCBjbm9y bV9EaW1zWzJdID0gey0xLCAtMX07DQogIGNvbnN0IGludCBjbm9ybV9SYW5rID0gMjsNCiAgUHlB cnJheU9iamVjdCAqY2FwaV9jbm9ybV90bXAgPSBOVUxMOw0KICBpbnQgY2FwaV9jbm9ybV9pbnRl bnQgPSAwOw0KICBQeU9iamVjdCAqY25vcm1fY2FwaSA9IFB5X05vbmU7DQogIGludCBsY25vcm0g PSAwOw0KICBQeU9iamVjdCAqbGNub3JtX2NhcGkgPSBQeV9Ob25lOw0KICBkb3VibGUgKnZsYW0g PSBOVUxMOw0KICBpbnQgdmxhbV9EaW1zWzFdID0gey0xfTsNCiAgY29uc3QgaW50IHZsYW1fUmFu ayA9IDE7DQogIFB5QXJyYXlPYmplY3QgKmNhcGlfdmxhbV90bXAgPSBOVUxMOw0KICBpbnQgY2Fw aV92bGFtX2ludGVudCA9IDA7DQogIFB5T2JqZWN0ICp2bGFtX2NhcGkgPSBQeV9Ob25lOw0KICBk b3VibGUgdG9sID0gMDsNCiAgUHlPYmplY3QgKnRvbF9jYXBpID0gUHlfTm9uZTsNCiAgaW50IGlw cmludCA9IDA7DQogIFB5T2JqZWN0ICppcHJpbnRfY2FwaSA9IFB5X05vbmU7DQogIGludCBud3Jp dGUgPSAwOw0KICBQeU9iamVjdCAqbndyaXRlX2NhcGkgPSBQeV9Ob25lOw0KICBpbnQgaW5mbyA9 IDA7DQogIFB5T2JqZWN0ICppbmZvX2NhcGkgPSBQeV9Ob25lOw0KICBkb3VibGUgKndhID0gTlVM TDsNCiAgaW50IHdhX0RpbXNbMV0gPSB7LTF9Ow0KICBjb25zdCBpbnQgd2FfUmFuayA9IDE7DQog IFB5QXJyYXlPYmplY3QgKmNhcGlfd2FfdG1wID0gTlVMTDsNCiAgaW50IGNhcGlfd2FfaW50ZW50 ID0gMDsNCiAgUHlPYmplY3QgKndhX2NhcGkgPSBQeV9Ob25lOw0KICBpbnQgbHdhID0gMDsNCiAg UHlPYmplY3QgKmx3YV9jYXBpID0gUHlfTm9uZTsNCiAgaW50ICppd2EgPSBOVUxMOw0KICBpbnQg aXdhX0RpbXNbMV0gPSB7LTF9Ow0KICBjb25zdCBpbnQgaXdhX1JhbmsgPSAxOw0KICBQeUFycmF5 T2JqZWN0ICpjYXBpX2l3YV90bXAgPSBOVUxMOw0KICBpbnQgY2FwaV9pd2FfaW50ZW50ID0gMDsN CiAgUHlPYmplY3QgKml3YV9jYXBpID0gUHlfTm9uZTsNCiAgaW50IGxpd2EgPSAwOw0KICBQeU9i amVjdCAqbGl3YV9jYXBpID0gUHlfTm9uZTsNCiAgZG91YmxlICpvYmpfZiA9IE5VTEw7DQogIGlu dCBvYmpfZl9EaW1zWzFdID0gey0xfTsNCiAgY29uc3QgaW50IG9ial9mX1JhbmsgPSAxOw0KICBQ eUFycmF5T2JqZWN0ICpjYXBpX29ial9mX3RtcCA9IE5VTEw7DQogIGludCBjYXBpX29ial9mX2lu dGVudCA9IDA7DQogIFB5T2JqZWN0ICpvYmpfZl9jYXBpID0gUHlfTm9uZTsNCiAgZG91YmxlICpv YmpnID0gTlVMTDsNCiAgaW50IG9iamdfRGltc1sxXSA9IHstMX07DQogIGNvbnN0IGludCBvYmpn X1JhbmsgPSAxOw0KICBQeUFycmF5T2JqZWN0ICpjYXBpX29iamdfdG1wID0gTlVMTDsNCiAgaW50 IGNhcGlfb2JqZ19pbnRlbnQgPSAwOw0KICBQeU9iamVjdCAqb2JqZ19jYXBpID0gUHlfTm9uZTsN CiAgaW50IGlibnVtID0gMDsNCiAgUHlPYmplY3QgKmlibnVtX2NhcGkgPSBQeV9Ob25lOw0KICBz dGF0aWMgY2hhciAqY2FwaV9rd2xpc3RbXSA9IHsiZmNuIiwibWVxIiwieCIsIm9iamYiLCJmZ3Jk IiwiY29uZiIsImNub3JtIiwidmxhbSIsInRvbCIsImlwcmludCIsIm53cml0ZSIsImluZm8iLCJ3 YSIsIml3YSIsIm9ial9mIiwib2JqZyIsImlibnVtIiwibiIsIm0iLCJsY25vcm0iLCJsd2EiLCJs aXdhIiwiZmNuX2V4dHJhX2FyZ3MiLE5VTEx9Ow0KDQovKnJvdXRkZWJ1Z2VudGVyKi8NCiNpZmRl ZiBGMlBZX1JFUE9SVF9BVEVYSVQNCmYycHlfc3RhcnRfY2xvY2soKTsNCiNlbmRpZg0KICBpZiAo IVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhjYXBpX2FyZ3MsY2FwaV9rZXl3ZHMsXA0KICAg ICJPT09PT09PT09PT09PT09PT3xPT09PT08hOm9wdF9zcXAuc3FwMSIsXA0KICAgIGNhcGlfa3ds aXN0LCZmY25fY2FwaSwmbWVxX2NhcGksJnhfY2FwaSwmb2JqZl9jYXBpLCZmZ3JkX2NhcGksJmNv bmZfY2FwaSwmY25vcm1fY2FwaSwmdmxhbV9jYXBpLCZ0b2xfY2FwaSwmaXByaW50X2NhcGksJm53 cml0ZV9jYXBpLCZpbmZvX2NhcGksJndhX2NhcGksJml3YV9jYXBpLCZvYmpfZl9jYXBpLCZvYmpn X2NhcGksJmlibnVtX2NhcGksJm5fY2FwaSwmbV9jYXBpLCZsY25vcm1fY2FwaSwmbHdhX2NhcGks Jmxpd2FfY2FwaSwmUHlUdXBsZV9UeXBlLCZmY25feGFfY2FwaSkpDQogICAgcmV0dXJuIE5VTEw7 DQovKmZyb21weW9iaiovDQogIC8qIFByb2Nlc3NpbmcgdmFyaWFibGUgY29uZiAqLw0KICA7DQog IGNhcGlfY29uZl9pbnRlbnQgfD0gRjJQWV9JTlRFTlRfSU47DQogIGNhcGlfY29uZl90bXAgPSBh cnJheV9mcm9tX3B5b2JqKFB5QXJyYXlfRE9VQkxFLGNvbmZfRGltcyxjb25mX1JhbmssY2FwaV9j b25mX2ludGVudCxjb25mX2NhcGkpOw0KICBpZiAoY2FwaV9jb25mX3RtcCA9PSBOVUxMKSB7DQog ICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKQ0KICAgICAgUHlFcnJfU2V0U3RyaW5nKG9wdF9zcXBf ZXJyb3IsImZhaWxlZCBpbiBjb252ZXJ0aW5nIDZ0aCBhcmd1bWVudCBgY29uZicgb2Ygb3B0X3Nx cC5zcXAxIHRvIEMvRm9ydHJhbiBhcnJheSIgKTsNCiAgfSBlbHNlIHsNCiAgICBjb25mID0gKGRv dWJsZSAqKShjYXBpX2NvbmZfdG1wLT5kYXRhKTsNCiAgLyogUHJvY2Vzc2luZyB2YXJpYWJsZSBv YmpmICovDQogICAgZjJweV9zdWNjZXNzID0gZG91YmxlX2Zyb21fcHlvYmooJm9iamYsb2JqZl9j YXBpLCJvcHRfc3FwLnNxcDEoKSA0dGggYXJndW1lbnQgKG9iamYpIGNhbid0IGJlIGNvbnZlcnRl ZCB0byBkb3VibGUiKTsNCiAgaWYgKGYycHlfc3VjY2Vzcykgew0KICAvKiBQcm9jZXNzaW5nIHZh cmlhYmxlIHdhICovDQogIDsNCiAgY2FwaV93YV9pbnRlbnQgfD0gRjJQWV9JTlRFTlRfSU47DQog IGNhcGlfd2FfdG1wID0gYXJyYXlfZnJvbV9weW9iaihQeUFycmF5X0RPVUJMRSx3YV9EaW1zLHdh X1JhbmssY2FwaV93YV9pbnRlbnQsd2FfY2FwaSk7DQogIGlmIChjYXBpX3dhX3RtcCA9PSBOVUxM KSB7DQogICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKQ0KICAgICAgUHlFcnJfU2V0U3RyaW5nKG9w dF9zcXBfZXJyb3IsImZhaWxlZCBpbiBjb252ZXJ0aW5nIDEzcmQgYXJndW1lbnQgYHdhJyBvZiBv cHRfc3FwLnNxcDEgdG8gQy9Gb3J0cmFuIGFycmF5IiApOw0KICB9IGVsc2Ugew0KICAgIHdhID0g KGRvdWJsZSAqKShjYXBpX3dhX3RtcC0+ZGF0YSk7DQogIC8qIFByb2Nlc3NpbmcgdmFyaWFibGUg aWJudW0gKi8NCiAgICBmMnB5X3N1Y2Nlc3MgPSBpbnRfZnJvbV9weW9iaigmaWJudW0saWJudW1f Y2FwaSwib3B0X3NxcC5zcXAxKCkgMTd0aCBhcmd1bWVudCAoaWJudW0pIGNhbid0IGJlIGNvbnZl cnRlZCB0byBpbnQiKTsNCiAgaWYgKGYycHlfc3VjY2Vzcykgew0KICAvKiBQcm9jZXNzaW5nIHZh cmlhYmxlIGZjbiAqLw0KICBmY25fbm9mYXJnc19jYXBpID0gZmNuX25vZmFyZ3M7DQogIGlmIChj cmVhdGVfY2JfYXJnbGlzdChmY25fY2FwaSxmY25feGFfY2FwaSwjbWF4bm9mYXJncyMsI25vZm9w dGFyZ3MjLCZmY25fbm9mYXJncywmZmNuX2FyZ3NfY2FwaSwiZmFpbGVkIGluIHByb2Nlc3Npbmcg YXJndW1lbnQgbGlzdCBmb3IgY2FsbC1iYWNrIGZjbi4iKSkgew0KICAgIGptcF9idWYgZmNuX2pt cGJ1ZjsNCiAgICBDRlVOQ1NNRVNTKCJTYXZpbmcgam1wYnVmIGZvciBgZmNuYC5cbiIpOw0KICAg IFNXQVAoZmNuX2NhcGksZmNuX2NhcGksUHlPYmplY3QpOw0KICAgIFNXQVAoZmNuX2FyZ3NfY2Fw aSxmY25fYXJnc19jYXBpLFB5VHVwbGVPYmplY3QpOw0KICAgIG1lbWNweSgmZmNuX2ptcGJ1Ziwm ZmNuX2ptcGJ1ZixzaXplb2Yoam1wX2J1ZikpOw0KICAvKiBQcm9jZXNzaW5nIHZhcmlhYmxlIHRv bCAqLw0KICAgIGYycHlfc3VjY2VzcyA9IGRvdWJsZV9mcm9tX3B5b2JqKCZ0b2wsdG9sX2NhcGks Im9wdF9zcXAuc3FwMSgpIDl0aCBhcmd1bWVudCAodG9sKSBjYW4ndCBiZSBjb252ZXJ0ZWQgdG8g ZG91YmxlIik7DQogIGlmIChmMnB5X3N1Y2Nlc3MpIHsNCiAgLyogUHJvY2Vzc2luZyB2YXJpYWJs ZSBpd2EgKi8NCiAgOw0KICBjYXBpX2l3YV9pbnRlbnQgfD0gRjJQWV9JTlRFTlRfSU47DQogIGNh cGlfaXdhX3RtcCA9IGFycmF5X2Zyb21fcHlvYmooUHlBcnJheV9JTlQsaXdhX0RpbXMsaXdhX1Jh bmssY2FwaV9pd2FfaW50ZW50LGl3YV9jYXBpKTsNCiAgaWYgKGNhcGlfaXdhX3RtcCA9PSBOVUxM KSB7DQogICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKQ0KICAgICAgUHlFcnJfU2V0U3RyaW5nKG9w dF9zcXBfZXJyb3IsImZhaWxlZCBpbiBjb252ZXJ0aW5nIDE0dGggYXJndW1lbnQgYGl3YScgb2Yg b3B0X3NxcC5zcXAxIHRvIEMvRm9ydHJhbiBhcnJheSIgKTsNCiAgfSBlbHNlIHsNCiAgICBpd2Eg PSAoaW50ICopKGNhcGlfaXdhX3RtcC0+ZGF0YSk7DQogIC8qIFByb2Nlc3NpbmcgdmFyaWFibGUg bWVxICovDQogICAgZjJweV9zdWNjZXNzID0gaW50X2Zyb21fcHlvYmooJm1lcSxtZXFfY2FwaSwi b3B0X3NxcC5zcXAxKCkgMm5kIGFyZ3VtZW50IChtZXEpIGNhbid0IGJlIGNvbnZlcnRlZCB0byBp bnQiKTsNCiAgaWYgKGYycHlfc3VjY2Vzcykgew0KICAvKiBQcm9jZXNzaW5nIHZhcmlhYmxlIGlu Zm8gKi8NCiAgICBmMnB5X3N1Y2Nlc3MgPSBpbnRfZnJvbV9weW9iaigmaW5mbyxpbmZvX2NhcGks Im9wdF9zcXAuc3FwMSgpIDEybmQgYXJndW1lbnQgKGluZm8pIGNhbid0IGJlIGNvbnZlcnRlZCB0 byBpbnQiKTsNCiAgaWYgKGYycHlfc3VjY2Vzcykgew0KICAvKiBQcm9jZXNzaW5nIHZhcmlhYmxl IGlwcmludCAqLw0KICAgIGYycHlfc3VjY2VzcyA9IGludF9mcm9tX3B5b2JqKCZpcHJpbnQsaXBy aW50X2NhcGksIm9wdF9zcXAuc3FwMSgpIDEwdGggYXJndW1lbnQgKGlwcmludCkgY2FuJ3QgYmUg Y29udmVydGVkIHRvIGludCIpOw0KICBpZiAoZjJweV9zdWNjZXNzKSB7DQogIC8qIFByb2Nlc3Np bmcgdmFyaWFibGUgbndyaXRlICovDQogICAgZjJweV9zdWNjZXNzID0gaW50X2Zyb21fcHlvYmoo Jm53cml0ZSxud3JpdGVfY2FwaSwib3B0X3NxcC5zcXAxKCkgMTFzdCBhcmd1bWVudCAobndyaXRl KSBjYW4ndCBiZSBjb252ZXJ0ZWQgdG8gaW50Iik7DQogIGlmIChmMnB5X3N1Y2Nlc3MpIHsNCiAg LyogUHJvY2Vzc2luZyB2YXJpYWJsZSB4ICovDQogIDsNCiAgY2FwaV94X2ludGVudCB8PSBGMlBZ X0lOVEVOVF9JTjsNCiAgY2FwaV94X3RtcCA9IGFycmF5X2Zyb21fcHlvYmooUHlBcnJheV9ET1VC TEUseF9EaW1zLHhfUmFuayxjYXBpX3hfaW50ZW50LHhfY2FwaSk7DQogIGlmIChjYXBpX3hfdG1w ID09IE5VTEwpIHsNCiAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpDQogICAgICBQeUVycl9TZXRT dHJpbmcob3B0X3NxcF9lcnJvciwiZmFpbGVkIGluIGNvbnZlcnRpbmcgM3JkIGFyZ3VtZW50IGB4 JyBvZiBvcHRfc3FwLnNxcDEgdG8gQy9Gb3J0cmFuIGFycmF5IiApOw0KICB9IGVsc2Ugew0KICAg IHggPSAoZG91YmxlICopKGNhcGlfeF90bXAtPmRhdGEpOw0KICAvKiBQcm9jZXNzaW5nIHZhcmlh YmxlIGx3YSAqLw0KICBpZiAobHdhX2NhcGkgPT0gUHlfTm9uZSkgbHdhID0gbGVuKHdhKTsgZWxz ZQ0KICAgIGYycHlfc3VjY2VzcyA9IGludF9mcm9tX3B5b2JqKCZsd2EsbHdhX2NhcGksIm9wdF9z cXAuc3FwMSgpIDR0aCBrZXl3b3JkIChsd2EpIGNhbid0IGJlIGNvbnZlcnRlZCB0byBpbnQiKTsN CiAgaWYgKGYycHlfc3VjY2Vzcykgew0KICBDSEVDS1NDQUxBUihsZW4od2EpPj1sd2EsImxlbih3 YSk+PWx3YSIsIjR0aCBrZXl3b3JkIGx3YSIsInNxcDE6bHdhPSVkIixsd2EpIHsNCiAgLyogUHJv Y2Vzc2luZyB2YXJpYWJsZSBtICovDQogIGlmIChtX2NhcGkgPT0gUHlfTm9uZSkgbSA9IGxlbihj b25mKTsgZWxzZQ0KICAgIGYycHlfc3VjY2VzcyA9IGludF9mcm9tX3B5b2JqKCZtLG1fY2FwaSwi b3B0X3NxcC5zcXAxKCkgMm5kIGtleXdvcmQgKG0pIGNhbid0IGJlIGNvbnZlcnRlZCB0byBpbnQi KTsNCiAgaWYgKGYycHlfc3VjY2Vzcykgew0KICBDSEVDS1NDQUxBUihsZW4oY29uZik+PW0sImxl bihjb25mKT49bSIsIjJuZCBrZXl3b3JkIG0iLCJzcXAxOm09JWQiLG0pIHsNCiAgLyogUHJvY2Vz c2luZyB2YXJpYWJsZSBuICovDQogIGlmIChuX2NhcGkgPT0gUHlfTm9uZSkgbiA9IGxlbih4KTsg ZWxzZQ0KICAgIGYycHlfc3VjY2VzcyA9IGludF9mcm9tX3B5b2JqKCZuLG5fY2FwaSwib3B0X3Nx cC5zcXAxKCkgMXN0IGtleXdvcmQgKG4pIGNhbid0IGJlIGNvbnZlcnRlZCB0byBpbnQiKTsNCiAg aWYgKGYycHlfc3VjY2Vzcykgew0KICBDSEVDS1NDQUxBUihsZW4oeCk+PW4sImxlbih4KT49biIs IjFzdCBrZXl3b3JkIG4iLCJzcXAxOm49JWQiLG4pIHsNCiAgLyogUHJvY2Vzc2luZyB2YXJpYWJs ZSBsaXdhICovDQogIGlmIChsaXdhX2NhcGkgPT0gUHlfTm9uZSkgbGl3YSA9IGxlbihpd2EpOyBl bHNlDQogICAgZjJweV9zdWNjZXNzID0gaW50X2Zyb21fcHlvYmooJmxpd2EsbGl3YV9jYXBpLCJv cHRfc3FwLnNxcDEoKSA1dGgga2V5d29yZCAobGl3YSkgY2FuJ3QgYmUgY29udmVydGVkIHRvIGlu dCIpOw0KICBpZiAoZjJweV9zdWNjZXNzKSB7DQogIENIRUNLU0NBTEFSKGxlbihpd2EpPj1saXdh LCJsZW4oaXdhKT49bGl3YSIsIjV0aCBrZXl3b3JkIGxpd2EiLCJzcXAxOmxpd2E9JWQiLGxpd2Ep IHsNCiAgLyogUHJvY2Vzc2luZyB2YXJpYWJsZSBjbm9ybSAqLw0KICBjbm9ybV9EaW1zWzFdPW07 DQogIGNhcGlfY25vcm1faW50ZW50IHw9IEYyUFlfSU5URU5UX0lOOw0KICBjYXBpX2Nub3JtX3Rt cCA9IGFycmF5X2Zyb21fcHlvYmooUHlBcnJheV9ET1VCTEUsY25vcm1fRGltcyxjbm9ybV9SYW5r LGNhcGlfY25vcm1faW50ZW50LGNub3JtX2NhcGkpOw0KICBpZiAoY2FwaV9jbm9ybV90bXAgPT0g TlVMTCkgew0KICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkNCiAgICAgIFB5RXJyX1NldFN0cmlu ZyhvcHRfc3FwX2Vycm9yLCJmYWlsZWQgaW4gY29udmVydGluZyA3dGggYXJndW1lbnQgYGNub3Jt JyBvZiBvcHRfc3FwLnNxcDEgdG8gQy9Gb3J0cmFuIGFycmF5IiApOw0KICB9IGVsc2Ugew0KICAg IGNub3JtID0gKGRvdWJsZSAqKShjYXBpX2Nub3JtX3RtcC0+ZGF0YSk7DQogIC8qIFByb2Nlc3Np bmcgdmFyaWFibGUgb2JqZyAqLw0KICBvYmpnX0RpbXNbMF09biArIDE7DQogIGNhcGlfb2JqZ19p bnRlbnQgfD0gRjJQWV9JTlRFTlRfSU47DQogIGNhcGlfb2JqZ190bXAgPSBhcnJheV9mcm9tX3B5 b2JqKFB5QXJyYXlfRE9VQkxFLG9iamdfRGltcyxvYmpnX1JhbmssY2FwaV9vYmpnX2ludGVudCxv YmpnX2NhcGkpOw0KICBpZiAoY2FwaV9vYmpnX3RtcCA9PSBOVUxMKSB7DQogICAgaWYgKCFQeUVy cl9PY2N1cnJlZCgpKQ0KICAgICAgUHlFcnJfU2V0U3RyaW5nKG9wdF9zcXBfZXJyb3IsImZhaWxl ZCBpbiBjb252ZXJ0aW5nIDE2dGggYXJndW1lbnQgYG9iamcnIG9mIG9wdF9zcXAuc3FwMSB0byBD L0ZvcnRyYW4gYXJyYXkiICk7DQogIH0gZWxzZSB7DQogICAgb2JqZyA9IChkb3VibGUgKikoY2Fw aV9vYmpnX3RtcC0+ZGF0YSk7DQogIC8qIFByb2Nlc3NpbmcgdmFyaWFibGUgb2JqX2YgKi8NCiAg b2JqX2ZfRGltc1swXT1uICsgMTsNCiAgY2FwaV9vYmpfZl9pbnRlbnQgfD0gRjJQWV9JTlRFTlRf SU47DQogIGNhcGlfb2JqX2ZfdG1wID0gYXJyYXlfZnJvbV9weW9iaihQeUFycmF5X0RPVUJMRSxv YmpfZl9EaW1zLG9ial9mX1JhbmssY2FwaV9vYmpfZl9pbnRlbnQsb2JqX2ZfY2FwaSk7DQogIGlm IChjYXBpX29ial9mX3RtcCA9PSBOVUxMKSB7DQogICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKQ0K ICAgICAgUHlFcnJfU2V0U3RyaW5nKG9wdF9zcXBfZXJyb3IsImZhaWxlZCBpbiBjb252ZXJ0aW5n IDE1dGggYXJndW1lbnQgYG9ial9mJyBvZiBvcHRfc3FwLnNxcDEgdG8gQy9Gb3J0cmFuIGFycmF5 IiApOw0KICB9IGVsc2Ugew0KICAgIG9ial9mID0gKGRvdWJsZSAqKShjYXBpX29ial9mX3RtcC0+ ZGF0YSk7DQogIC8qIFByb2Nlc3NpbmcgdmFyaWFibGUgbGNub3JtICovDQogIGlmIChsY25vcm1f Y2FwaSA9PSBQeV9Ob25lKSBsY25vcm0gPSBzaGFwZShjbm9ybSwwKTsgZWxzZQ0KICAgIGYycHlf c3VjY2VzcyA9IGludF9mcm9tX3B5b2JqKCZsY25vcm0sbGNub3JtX2NhcGksIm9wdF9zcXAuc3Fw MSgpIDNyZCBrZXl3b3JkIChsY25vcm0pIGNhbid0IGJlIGNvbnZlcnRlZCB0byBpbnQiKTsNCiAg aWYgKGYycHlfc3VjY2Vzcykgew0KICBDSEVDS1NDQUxBUihzaGFwZShjbm9ybSwwKT09bGNub3Jt LCJzaGFwZShjbm9ybSwwKT09bGNub3JtIiwiM3JkIGtleXdvcmQgbGNub3JtIiwic3FwMTpsY25v cm09JWQiLGxjbm9ybSkgew0KICAvKiBQcm9jZXNzaW5nIHZhcmlhYmxlIGZncmQgKi8NCiAgZmdy ZF9EaW1zWzBdPW47DQogIGNhcGlfZmdyZF9pbnRlbnQgfD0gRjJQWV9JTlRFTlRfSU47DQogIGNh cGlfZmdyZF90bXAgPSBhcnJheV9mcm9tX3B5b2JqKFB5QXJyYXlfRE9VQkxFLGZncmRfRGltcyxm Z3JkX1JhbmssY2FwaV9mZ3JkX2ludGVudCxmZ3JkX2NhcGkpOw0KICBpZiAoY2FwaV9mZ3JkX3Rt cCA9PSBOVUxMKSB7DQogICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKQ0KICAgICAgUHlFcnJfU2V0 U3RyaW5nKG9wdF9zcXBfZXJyb3IsImZhaWxlZCBpbiBjb252ZXJ0aW5nIDV0aCBhcmd1bWVudCBg ZmdyZCcgb2Ygb3B0X3NxcC5zcXAxIHRvIEMvRm9ydHJhbiBhcnJheSIgKTsNCiAgfSBlbHNlIHsN CiAgICBmZ3JkID0gKGRvdWJsZSAqKShjYXBpX2ZncmRfdG1wLT5kYXRhKTsNCiAgLyogUHJvY2Vz c2luZyB2YXJpYWJsZSB2bGFtICovDQogIHZsYW1fRGltc1swXT1tOw0KICBjYXBpX3ZsYW1faW50 ZW50IHw9IEYyUFlfSU5URU5UX0lOOw0KICBjYXBpX3ZsYW1fdG1wID0gYXJyYXlfZnJvbV9weW9i aihQeUFycmF5X0RPVUJMRSx2bGFtX0RpbXMsdmxhbV9SYW5rLGNhcGlfdmxhbV9pbnRlbnQsdmxh bV9jYXBpKTsNCiAgaWYgKGNhcGlfdmxhbV90bXAgPT0gTlVMTCkgew0KICAgIGlmICghUHlFcnJf T2NjdXJyZWQoKSkNCiAgICAgIFB5RXJyX1NldFN0cmluZyhvcHRfc3FwX2Vycm9yLCJmYWlsZWQg aW4gY29udmVydGluZyA4dGggYXJndW1lbnQgYHZsYW0nIG9mIG9wdF9zcXAuc3FwMSB0byBDL0Zv cnRyYW4gYXJyYXkiICk7DQogIH0gZWxzZSB7DQogICAgdmxhbSA9IChkb3VibGUgKikoY2FwaV92 bGFtX3RtcC0+ZGF0YSk7DQovKmVuZCBvZiBmcm9tcHlvYmoqLw0KI2lmZGVmIEYyUFlfUkVQT1JU X0FURVhJVA0KZjJweV9zdGFydF9jYWxsX2Nsb2NrKCk7DQojZW5kaWYNCi8qY2FsbGZvcnRyYW5y b3V0aW5lKi8NCiAgICBpZiAoKHNldGptcChmY25fam1wYnVmKSkpIHsNCiAgICAgIGYycHlfc3Vj Y2VzcyA9IDA7DQogICAgfSBlbHNlIHsNCiAgICAgICAgKCpmMnB5X2Z1bmMpKGZjbiwmbiwmbSwm bWVxLHgsJm9iamYsZmdyZCxjb25mLGNub3JtLCZsY25vcm0sdmxhbSwmdG9sLCZpcHJpbnQsJm53 cml0ZSwmaW5mbyx3YSwmbHdhLGl3YSwmbGl3YSxvYmpfZixvYmpnLCZpYm51bSk7DQogICAgfQ0K I2lmZGVmIEYyUFlfUkVQT1JUX0FURVhJVA0KZjJweV9zdG9wX2NhbGxfY2xvY2soKTsNCiNlbmRp Zg0KLyplbmQgb2YgY2FsbGZvcnRyYW5yb3V0aW5lKi8NCiAgICBpZiAoZjJweV9zdWNjZXNzKSB7 DQovKnB5b2JqZnJvbSovDQogIGYycHlfc3VjY2VzcyA9IDE7DQogIGlmIChQeUNhbGxhYmxlX0No ZWNrKGZjbl9jYXBpKSkgew0KICBmMnB5X3N1Y2Nlc3MgPSAwOw0KICBQeUVycl9TZXRTdHJpbmco UHlFeGNfVHlwZUVycm9yLCJzcXAxIGFyZ3VtZW50IGZjbiBtdXN0IGJlIGNhbGxhYmxlIik7DQp9 DQogIGlmIChmMnB5X3N1Y2Nlc3MpIHsNCi8qZW5kIG9mIHB5b2JqZnJvbSovDQogICAgQ0ZVTkNT TUVTUygiQnVpbGRpbmcgcmV0dXJuIHZhbHVlLlxuIik7DQogICAgY2FwaV9idWlsZHZhbHVlID0g UHlfQnVpbGRWYWx1ZSgiIik7DQovKmNsb3NlcHlvYmpmcm9tKi8NCiAgfSAvKmlmIChmMnB5X3N1 Y2Nlc3MpIG9mIGZjbiBweW9iamZyb20qLw0KLyplbmQgb2YgY2xvc2VweW9iamZyb20qLw0KICAg IH0gLyppZiAoZjJweV9zdWNjZXNzKSBhZnRlciBjYWxsZm9ydHJhbnJvdXRpbmUqLw0KLypjbGVh bnVwZnJvbXB5b2JqKi8NCiAgaWYoKFB5T2JqZWN0ICopY2FwaV92bGFtX3RtcCE9dmxhbV9jYXBp KSB7DQogICAgUHlfWERFQ1JFRihjYXBpX3ZsYW1fdG1wKTsgfQ0KICB9ICAvKmlmIChjYXBpX3Zs YW1fdG1wID09IE5VTEwpIC4uLiBlbHNlIG9mIHZsYW0qLw0KICAvKiBFbmQgb2YgY2xlYW5pbmcg dmFyaWFibGUgdmxhbSAqLw0KICBpZigoUHlPYmplY3QgKiljYXBpX2ZncmRfdG1wIT1mZ3JkX2Nh cGkpIHsNCiAgICBQeV9YREVDUkVGKGNhcGlfZmdyZF90bXApOyB9DQogIH0gIC8qaWYgKGNhcGlf ZmdyZF90bXAgPT0gTlVMTCkgLi4uIGVsc2Ugb2YgZmdyZCovDQogIC8qIEVuZCBvZiBjbGVhbmlu ZyB2YXJpYWJsZSBmZ3JkICovDQogIH0gLypDSEVDS1NDQUxBUihzaGFwZShjbm9ybSwwKT09bGNu b3JtKSovDQogIH0gLyppZiAoZjJweV9zdWNjZXNzKSBvZiBsY25vcm0qLw0KICAvKiBFbmQgb2Yg Y2xlYW5pbmcgdmFyaWFibGUgbGNub3JtICovDQogIGlmKChQeU9iamVjdCAqKWNhcGlfb2JqX2Zf dG1wIT1vYmpfZl9jYXBpKSB7DQogICAgUHlfWERFQ1JFRihjYXBpX29ial9mX3RtcCk7IH0NCiAg fSAgLyppZiAoY2FwaV9vYmpfZl90bXAgPT0gTlVMTCkgLi4uIGVsc2Ugb2Ygb2JqX2YqLw0KICAv KiBFbmQgb2YgY2xlYW5pbmcgdmFyaWFibGUgb2JqX2YgKi8NCiAgaWYoKFB5T2JqZWN0ICopY2Fw aV9vYmpnX3RtcCE9b2JqZ19jYXBpKSB7DQogICAgUHlfWERFQ1JFRihjYXBpX29iamdfdG1wKTsg fQ0KICB9ICAvKmlmIChjYXBpX29iamdfdG1wID09IE5VTEwpIC4uLiBlbHNlIG9mIG9iamcqLw0K ICAvKiBFbmQgb2YgY2xlYW5pbmcgdmFyaWFibGUgb2JqZyAqLw0KICBpZigoUHlPYmplY3QgKilj YXBpX2Nub3JtX3RtcCE9Y25vcm1fY2FwaSkgew0KICAgIFB5X1hERUNSRUYoY2FwaV9jbm9ybV90 bXApOyB9DQogIH0gIC8qaWYgKGNhcGlfY25vcm1fdG1wID09IE5VTEwpIC4uLiBlbHNlIG9mIGNu b3JtKi8NCiAgLyogRW5kIG9mIGNsZWFuaW5nIHZhcmlhYmxlIGNub3JtICovDQogIH0gLypDSEVD S1NDQUxBUihsZW4oaXdhKT49bGl3YSkqLw0KICB9IC8qaWYgKGYycHlfc3VjY2Vzcykgb2YgbGl3 YSovDQogIC8qIEVuZCBvZiBjbGVhbmluZyB2YXJpYWJsZSBsaXdhICovDQogIH0gLypDSEVDS1ND QUxBUihsZW4oeCk+PW4pKi8NCiAgfSAvKmlmIChmMnB5X3N1Y2Nlc3MpIG9mIG4qLw0KICAvKiBF bmQgb2YgY2xlYW5pbmcgdmFyaWFibGUgbiAqLw0KICB9IC8qQ0hFQ0tTQ0FMQVIobGVuKGNvbmYp Pj1tKSovDQogIH0gLyppZiAoZjJweV9zdWNjZXNzKSBvZiBtKi8NCiAgLyogRW5kIG9mIGNsZWFu aW5nIHZhcmlhYmxlIG0gKi8NCiAgfSAvKkNIRUNLU0NBTEFSKGxlbih3YSk+PWx3YSkqLw0KICB9 IC8qaWYgKGYycHlfc3VjY2Vzcykgb2YgbHdhKi8NCiAgLyogRW5kIG9mIGNsZWFuaW5nIHZhcmlh YmxlIGx3YSAqLw0KICBpZigoUHlPYmplY3QgKiljYXBpX3hfdG1wIT14X2NhcGkpIHsNCiAgICBQ eV9YREVDUkVGKGNhcGlfeF90bXApOyB9DQogIH0gIC8qaWYgKGNhcGlfeF90bXAgPT0gTlVMTCkg Li4uIGVsc2Ugb2YgeCovDQogIC8qIEVuZCBvZiBjbGVhbmluZyB2YXJpYWJsZSB4ICovDQogIH0g LyppZiAoZjJweV9zdWNjZXNzKSBvZiBud3JpdGUqLw0KICAvKiBFbmQgb2YgY2xlYW5pbmcgdmFy aWFibGUgbndyaXRlICovDQogIH0gLyppZiAoZjJweV9zdWNjZXNzKSBvZiBpcHJpbnQqLw0KICAv KiBFbmQgb2YgY2xlYW5pbmcgdmFyaWFibGUgaXByaW50ICovDQogIH0gLyppZiAoZjJweV9zdWNj ZXNzKSBvZiBpbmZvKi8NCiAgLyogRW5kIG9mIGNsZWFuaW5nIHZhcmlhYmxlIGluZm8gKi8NCiAg fSAvKmlmIChmMnB5X3N1Y2Nlc3MpIG9mIG1lcSovDQogIC8qIEVuZCBvZiBjbGVhbmluZyB2YXJp YWJsZSBtZXEgKi8NCiAgaWYoKFB5T2JqZWN0ICopY2FwaV9pd2FfdG1wIT1pd2FfY2FwaSkgew0K ICAgIFB5X1hERUNSRUYoY2FwaV9pd2FfdG1wKTsgfQ0KICB9ICAvKmlmIChjYXBpX2l3YV90bXAg PT0gTlVMTCkgLi4uIGVsc2Ugb2YgaXdhKi8NCiAgLyogRW5kIG9mIGNsZWFuaW5nIHZhcmlhYmxl IGl3YSAqLw0KICB9IC8qaWYgKGYycHlfc3VjY2Vzcykgb2YgdG9sKi8NCiAgLyogRW5kIG9mIGNs ZWFuaW5nIHZhcmlhYmxlIHRvbCAqLw0KICAgIENGVU5DU01FU1MoIlJlc3RvcmluZyBqbXBidWYg Zm9yIGBmY25gLlxuIik7DQogICAgZmNuX2NhcGkgPSBmY25fY2FwaTsNCiAgICBQeV9ERUNSRUYo ZmNuX2FyZ3NfY2FwaSk7DQogICAgZmNuX2FyZ3NfY2FwaSA9IGZjbl9hcmdzX2NhcGk7DQogICAg ZmNuX25vZmFyZ3MgPSBmY25fbm9mYXJnc19jYXBpOw0KICAgIG1lbWNweSgmZmNuX2ptcGJ1Ziwm ZmNuX2ptcGJ1ZixzaXplb2Yoam1wX2J1ZikpOw0KICB9DQogIC8qIEVuZCBvZiBjbGVhbmluZyB2 YXJpYWJsZSBmY24gKi8NCiAgfSAvKmlmIChmMnB5X3N1Y2Nlc3MpIG9mIGlibnVtKi8NCiAgLyog RW5kIG9mIGNsZWFuaW5nIHZhcmlhYmxlIGlibnVtICovDQogIGlmKChQeU9iamVjdCAqKWNhcGlf d2FfdG1wIT13YV9jYXBpKSB7DQogICAgUHlfWERFQ1JFRihjYXBpX3dhX3RtcCk7IH0NCiAgfSAg LyppZiAoY2FwaV93YV90bXAgPT0gTlVMTCkgLi4uIGVsc2Ugb2Ygd2EqLw0KICAvKiBFbmQgb2Yg Y2xlYW5pbmcgdmFyaWFibGUgd2EgKi8NCiAgfSAvKmlmIChmMnB5X3N1Y2Nlc3MpIG9mIG9iamYq Lw0KICAvKiBFbmQgb2YgY2xlYW5pbmcgdmFyaWFibGUgb2JqZiAqLw0KICBpZigoUHlPYmplY3Qg KiljYXBpX2NvbmZfdG1wIT1jb25mX2NhcGkpIHsNCiAgICBQeV9YREVDUkVGKGNhcGlfY29uZl90 bXApOyB9DQogIH0gIC8qaWYgKGNhcGlfY29uZl90bXAgPT0gTlVMTCkgLi4uIGVsc2Ugb2YgY29u ZiovDQogIC8qIEVuZCBvZiBjbGVhbmluZyB2YXJpYWJsZSBjb25mICovDQovKmVuZCBvZiBjbGVh bnVwZnJvbXB5b2JqKi8NCiAgaWYgKGNhcGlfYnVpbGR2YWx1ZSA9PSBOVUxMKSB7DQovKnJvdXRk ZWJ1Z2ZhaWx1cmUqLw0KICB9IGVsc2Ugew0KLypyb3V0ZGVidWdsZWF2ZSovDQogIH0NCiAgQ0ZV TkNTTUVTUygiRnJlZWluZyBtZW1vcnkuXG4iKTsNCi8qZnJlZW1lbSovDQojaWZkZWYgRjJQWV9S RVBPUlRfQVRFWElUDQpmMnB5X3N0b3BfY2xvY2soKTsNCiNlbmRpZg0KICByZXR1cm4gY2FwaV9i dWlsZHZhbHVlOw0KfQ0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIGVuZCBvZiBz cXAxICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQovKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqIHNxcCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKiovDQpzdGF0aWMgY2hhciBkb2NfZjJweV9yb3V0X29wdF9zcXBfc3FwW10gPSAiXA0KRnVu Y3Rpb24gc2lnbmF0dXJlOlxuXA0KICBzcXAoZmNuLG1vZGUsbWVxLHgsb2JqZixmZ3JkLGNvbmYs Y25vcm0sYix0b2wsbWF4ZmV2LGlwcmludCxud3JpdGUsaW5mbyxuZmV2LHZsYW0sZ2xhZyx2bXUs Y20sZ2xhZ2EsZ2FtbWEsZXRhLHhhLGJkZWx0YSxkZWx0YSxnbSxiZGwsYmR1LGgsd2EsaXdhLG9i al9mLG9iamcsaWJudW0sW24sbSxsY25vcm0sbGIsbGRlbCxsaCxsd2EsbGl3YSxmY25fZXh0cmFf YXJnc10pXG5cDQpSZXF1aXJlZCBhcmd1bWVudHM6XG4iDQoiICBmY24gOiBjYWxsLWJhY2sgZnVu Y3Rpb25cbiINCiIgIG1vZGUgOiBpbnB1dCBpbnRcbiINCiIgIG1lcSA6IGlucHV0IGludFxuIg0K IiAgeCA6IGlucHV0IHJhbmstMSBhcnJheSgnZCcpIHdpdGggYm91bmRzIChuKVxuIg0KIiAgb2Jq ZiA6IGlucHV0IGZsb2F0XG4iDQoiICBmZ3JkIDogaW5wdXQgcmFuay0xIGFycmF5KCdkJykgd2l0 aCBib3VuZHMgKG4pXG4iDQoiICBjb25mIDogaW5wdXQgcmFuay0xIGFycmF5KCdkJykgd2l0aCBi b3VuZHMgKG0pXG4iDQoiICBjbm9ybSA6IGlucHV0IHJhbmstMiBhcnJheSgnZCcpIHdpdGggYm91 bmRzIChsY25vcm0sbSlcbiINCiIgIGIgOiBpbnB1dCByYW5rLTIgYXJyYXkoJ2QnKSB3aXRoIGJv dW5kcyAobGIsbGIpXG4iDQoiICB0b2wgOiBpbnB1dCBmbG9hdFxuIg0KIiAgbWF4ZmV2IDogaW5w dXQgaW50XG4iDQoiICBpcHJpbnQgOiBpbnB1dCBpbnRcbiINCiIgIG53cml0ZSA6IGlucHV0IGlu dFxuIg0KIiAgaW5mbyA6IGlucHV0IGludFxuIg0KIiAgbmZldiA6IGlucHV0IGludFxuIg0KIiAg dmxhbSA6IGlucHV0IHJhbmstMSBhcnJheSgnZCcpIHdpdGggYm91bmRzIChtKVxuIg0KIiAgZ2xh ZyA6IGlucHV0IHJhbmstMSBhcnJheSgnZCcpIHdpdGggYm91bmRzIChuKVxuIg0KIiAgdm11IDog aW5wdXQgcmFuay0xIGFycmF5KCdkJykgd2l0aCBib3VuZHMgKG0pXG4iDQoiICBjbSA6IGlucHV0 IHJhbmstMSBhcnJheSgnZCcpIHdpdGggYm91bmRzIChtKVxuIg0KIiAgZ2xhZ2EgOiBpbnB1dCBy YW5rLTEgYXJyYXkoJ2QnKSB3aXRoIGJvdW5kcyAobilcbiINCiIgIGdhbW1hIDogaW5wdXQgcmFu ay0xIGFycmF5KCdkJykgd2l0aCBib3VuZHMgKG4pXG4iDQoiICBldGEgOiBpbnB1dCByYW5rLTEg YXJyYXkoJ2QnKSB3aXRoIGJvdW5kcyAobilcbiINCiIgIHhhIDogaW5wdXQgcmFuay0xIGFycmF5 KCdkJykgd2l0aCBib3VuZHMgKG4pXG4iDQoiICBiZGVsdGEgOiBpbnB1dCByYW5rLTEgYXJyYXko J2QnKSB3aXRoIGJvdW5kcyAobilcbiINCiIgIGRlbHRhIDogaW5wdXQgcmFuay0xIGFycmF5KCdk Jykgd2l0aCBib3VuZHMgKGxkZWwpXG4iDQoiICBnbSA6IGlucHV0IHJhbmstMSBhcnJheSgnZCcp IHdpdGggYm91bmRzICgxKVxuIg0KIiAgYmRsIDogaW5wdXQgcmFuay0xIGFycmF5KCdkJykgd2l0 aCBib3VuZHMgKDEpXG4iDQoiICBiZHUgOiBpbnB1dCByYW5rLTEgYXJyYXkoJ2QnKSB3aXRoIGJv dW5kcyAoMSlcbiINCiIgIGggOiBpbnB1dCByYW5rLTIgYXJyYXkoJ2QnKSB3aXRoIGJvdW5kcyAo bGgsbGgpXG4iDQoiICB3YSA6IGlucHV0IHJhbmstMSBhcnJheSgnZCcpIHdpdGggYm91bmRzIChs d2EpXG4iDQoiICBpd2EgOiBpbnB1dCByYW5rLTEgYXJyYXkoJ2knKSB3aXRoIGJvdW5kcyAobGl3 YSlcbiINCiIgIG9ial9mIDogaW5wdXQgcmFuay0xIGFycmF5KCdkJykgd2l0aCBib3VuZHMgKG4g KyAxKVxuIg0KIiAgb2JqZyA6IGlucHV0IHJhbmstMSBhcnJheSgnZCcpIHdpdGggYm91bmRzIChu ICsgMSlcbiINCiIgIGlibnVtIDogaW5wdXQgaW50XG4iDQoiT3B0aW9uYWwgYXJndW1lbnRzOlxu Ig0KIiAgZmNuX2V4dHJhX2FyZ3MgOj0gKCkgaW5wdXQgdHVwbGVcbiINCiIgIG4gOj0gbGVuKHgp IGlucHV0IGludFxuIg0KIiAgbSA6PSBsZW4oY29uZikgaW5wdXQgaW50XG4iDQoiICBsY25vcm0g Oj0gc2hhcGUoY25vcm0sMCkgaW5wdXQgaW50XG4iDQoiICBsYiA6PSBzaGFwZShiLDApIGlucHV0 IGludFxuIg0KIiAgbGRlbCA6PSBsZW4oZGVsdGEpIGlucHV0IGludFxuIg0KIiAgbGggOj0gc2hh cGUoaCwwKSBpbnB1dCBpbnRcbiINCiIgIGx3YSA6PSBsZW4od2EpIGlucHV0IGludFxuIg0KIiAg bGl3YSA6PSBsZW4oaXdhKSBpbnB1dCBpbnRcbiINCiJDYWxsLWJhY2sgZnVuY3Rpb25zOlxuIg0K IiAgZGVmIGZjbih4LG9iamYsb2JqX2Ysb2JqZyxmZ3JkLGNvbmYsY25vcm0saW5mbyxbbixtLGxj bm9ybV0pOiByZXR1cm4gXG5cDQogIFJlcXVpcmVkIGFyZ3VtZW50czpcbiINCiIgICAgeCA6IGlu cHV0IHJhbmstMSBhcnJheSgnZCcpIHdpdGggYm91bmRzIChuKVxuIg0KIiAgICBvYmpmIDogaW5w dXQgZmxvYXRcbiINCiIgICAgb2JqX2YgOiBpbnB1dCByYW5rLTEgYXJyYXkoJ2QnKSB3aXRoIGJv dW5kcyAobiArIDEpXG4iDQoiICAgIG9iamcgOiBpbnB1dCByYW5rLTEgYXJyYXkoJ2QnKSB3aXRo IGJvdW5kcyAobiArIDEpXG4iDQoiICAgIGZncmQgOiBpbnB1dCByYW5rLTEgYXJyYXkoJ2QnKSB3 aXRoIGJvdW5kcyAobilcbiINCiIgICAgY29uZiA6IGlucHV0IHJhbmstMSBhcnJheSgnZCcpIHdp dGggYm91bmRzIChtKVxuIg0KIiAgICBjbm9ybSA6IGlucHV0IHJhbmstMiBhcnJheSgnZCcpIHdp dGggYm91bmRzIChsY25vcm0sbSlcbiINCiIgICAgaW5mbyA6IGlucHV0IGludFxuIg0KIiAgT3B0 aW9uYWwgYXJndW1lbnRzOlxuIg0KIiAgICBuIDo9IGxlbih4KSBpbnB1dCBpbnRcbiINCiIgICAg bSA6PSBsZW4oY29uZikgaW5wdXQgaW50XG4iDQoiICAgIGxjbm9ybSA6PSBzaGFwZShjbm9ybSww KSBpbnB1dCBpbnQiOw0KLyogZXh0ZXJuIHZvaWQgRl9GVU5DKHNxcCxTUVApKHZvaWQqLGludCos aW50KixpbnQqLGludCosZG91YmxlKixkb3VibGUqLGRvdWJsZSosZG91YmxlKixkb3VibGUqLGlu dCosZG91YmxlKixpbnQqLGRvdWJsZSosaW50KixpbnQqLGludCosaW50KixpbnQqLGRvdWJsZSos ZG91YmxlKixkb3VibGUqLGRvdWJsZSosZG91YmxlKixkb3VibGUqLGRvdWJsZSosZG91YmxlKixk b3VibGUqLGRvdWJsZSosaW50Kixkb3VibGUqLGRvdWJsZSosZG91YmxlKixkb3VibGUqLGludCos ZG91YmxlKixpbnQqLGludCosaW50Kixkb3VibGUqLGRvdWJsZSosaW50Kik7ICovDQpzdGF0aWMg UHlPYmplY3QgKmYycHlfcm91dF9vcHRfc3FwX3NxcChjb25zdCBQeU9iamVjdCAqY2FwaV9zZWxm LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmNhcGlfYXJncywNCiAgICAg ICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpjYXBpX2tleXdkcywNCiAgICAgICAgICAg ICAgICAgICAgICAgICAgIHZvaWQgKCpmMnB5X2Z1bmMpKHZvaWQqLGludCosaW50KixpbnQqLGlu dCosZG91YmxlKixkb3VibGUqLGRvdWJsZSosZG91YmxlKixkb3VibGUqLGludCosZG91YmxlKixp bnQqLGRvdWJsZSosaW50KixpbnQqLGludCosaW50KixpbnQqLGRvdWJsZSosZG91YmxlKixkb3Vi bGUqLGRvdWJsZSosZG91YmxlKixkb3VibGUqLGRvdWJsZSosZG91YmxlKixkb3VibGUqLGRvdWJs ZSosaW50Kixkb3VibGUqLGRvdWJsZSosZG91YmxlKixkb3VibGUqLGludCosZG91YmxlKixpbnQq LGludCosaW50Kixkb3VibGUqLGRvdWJsZSosaW50KikpIHsNCiAgUHlPYmplY3QgKiB2b2xhdGls ZSBjYXBpX2J1aWxkdmFsdWUgPSBOVUxMOw0KICB2b2xhdGlsZSBpbnQgZjJweV9zdWNjZXNzID0g MTsNCi8qZGVjbCovDQoNCiAgUHlPYmplY3QgKmZjbl9jYXBpID0gUHlfTm9uZTsNCiAgUHlUdXBs ZU9iamVjdCAqZmNuX3hhX2NhcGkgPSBOVUxMOw0KICBQeVR1cGxlT2JqZWN0ICpmY25fYXJnc19j YXBpID0gTlVMTDsNCiAgaW50IGZjbl9ub2ZhcmdzX2NhcGkgPSAwOw0KICBpbnQgbW9kZSA9IDA7 DQogIFB5T2JqZWN0ICptb2RlX2NhcGkgPSBQeV9Ob25lOw0KICBpbnQgbiA9IDA7DQogIFB5T2Jq ZWN0ICpuX2NhcGkgPSBQeV9Ob25lOw0KICBpbnQgbSA9IDA7DQogIFB5T2JqZWN0ICptX2NhcGkg PSBQeV9Ob25lOw0KICBpbnQgbWVxID0gMDsNCiAgUHlPYmplY3QgKm1lcV9jYXBpID0gUHlfTm9u ZTsNCiAgZG91YmxlICp4ID0gTlVMTDsNCiAgaW50IHhfRGltc1sxXSA9IHstMX07DQogIGNvbnN0 IGludCB4X1JhbmsgPSAxOw0KICBQeUFycmF5T2JqZWN0ICpjYXBpX3hfdG1wID0gTlVMTDsNCiAg aW50IGNhcGlfeF9pbnRlbnQgPSAwOw0KICBQeU9iamVjdCAqeF9jYXBpID0gUHlfTm9uZTsNCiAg ZG91YmxlIG9iamYgPSAwOw0KICBQeU9iamVjdCAqb2JqZl9jYXBpID0gUHlfTm9uZTsNCiAgZG91 YmxlICpmZ3JkID0gTlVMTDsNCiAgaW50IGZncmRfRGltc1sxXSA9IHstMX07DQogIGNvbnN0IGlu dCBmZ3JkX1JhbmsgPSAxOw0KICBQeUFycmF5T2JqZWN0ICpjYXBpX2ZncmRfdG1wID0gTlVMTDsN CiAgaW50IGNhcGlfZmdyZF9pbnRlbnQgPSAwOw0KICBQeU9iamVjdCAqZmdyZF9jYXBpID0gUHlf Tm9uZTsNCiAgZG91YmxlICpjb25mID0gTlVMTDsNCiAgaW50IGNvbmZfRGltc1sxXSA9IHstMX07 DQogIGNvbnN0IGludCBjb25mX1JhbmsgPSAxOw0KICBQeUFycmF5T2JqZWN0ICpjYXBpX2NvbmZf dG1wID0gTlVMTDsNCiAgaW50IGNhcGlfY29uZl9pbnRlbnQgPSAwOw0KICBQeU9iamVjdCAqY29u Zl9jYXBpID0gUHlfTm9uZTsNCiAgZG91YmxlICpjbm9ybSA9IE5VTEw7DQogIGludCBjbm9ybV9E aW1zWzJdID0gey0xLCAtMX07DQogIGNvbnN0IGludCBjbm9ybV9SYW5rID0gMjsNCiAgUHlBcnJh eU9iamVjdCAqY2FwaV9jbm9ybV90bXAgPSBOVUxMOw0KICBpbnQgY2FwaV9jbm9ybV9pbnRlbnQg PSAwOw0KICBQeU9iamVjdCAqY25vcm1fY2FwaSA9IFB5X05vbmU7DQogIGludCBsY25vcm0gPSAw Ow0KICBQeU9iamVjdCAqbGNub3JtX2NhcGkgPSBQeV9Ob25lOw0KICBkb3VibGUgKmIgPSBOVUxM Ow0KICBpbnQgYl9EaW1zWzJdID0gey0xLCAtMX07DQogIGNvbnN0IGludCBiX1JhbmsgPSAyOw0K ICBQeUFycmF5T2JqZWN0ICpjYXBpX2JfdG1wID0gTlVMTDsNCiAgaW50IGNhcGlfYl9pbnRlbnQg PSAwOw0KICBQeU9iamVjdCAqYl9jYXBpID0gUHlfTm9uZTsNCiAgaW50IGxiID0gMDsNCiAgUHlP YmplY3QgKmxiX2NhcGkgPSBQeV9Ob25lOw0KICBkb3VibGUgdG9sID0gMDsNCiAgUHlPYmplY3Qg KnRvbF9jYXBpID0gUHlfTm9uZTsNCiAgaW50IG1heGZldiA9IDA7DQogIFB5T2JqZWN0ICptYXhm ZXZfY2FwaSA9IFB5X05vbmU7DQogIGludCBpcHJpbnQgPSAwOw0KICBQeU9iamVjdCAqaXByaW50 X2NhcGkgPSBQeV9Ob25lOw0KICBpbnQgbndyaXRlID0gMDsNCiAgUHlPYmplY3QgKm53cml0ZV9j YXBpID0gUHlfTm9uZTsNCiAgaW50IGluZm8gPSAwOw0KICBQeU9iamVjdCAqaW5mb19jYXBpID0g UHlfTm9uZTsNCiAgaW50IG5mZXYgPSAwOw0KICBQeU9iamVjdCAqbmZldl9jYXBpID0gUHlfTm9u ZTsNCiAgZG91YmxlICp2bGFtID0gTlVMTDsNCiAgaW50IHZsYW1fRGltc1sxXSA9IHstMX07DQog IGNvbnN0IGludCB2bGFtX1JhbmsgPSAxOw0KICBQeUFycmF5T2JqZWN0ICpjYXBpX3ZsYW1fdG1w ID0gTlVMTDsNCiAgaW50IGNhcGlfdmxhbV9pbnRlbnQgPSAwOw0KICBQeU9iamVjdCAqdmxhbV9j YXBpID0gUHlfTm9uZTsNCiAgZG91YmxlICpnbGFnID0gTlVMTDsNCiAgaW50IGdsYWdfRGltc1sx XSA9IHstMX07DQogIGNvbnN0IGludCBnbGFnX1JhbmsgPSAxOw0KICBQeUFycmF5T2JqZWN0ICpj YXBpX2dsYWdfdG1wID0gTlVMTDsNCiAgaW50IGNhcGlfZ2xhZ19pbnRlbnQgPSAwOw0KICBQeU9i amVjdCAqZ2xhZ19jYXBpID0gUHlfTm9uZTsNCiAgZG91YmxlICp2bXUgPSBOVUxMOw0KICBpbnQg dm11X0RpbXNbMV0gPSB7LTF9Ow0KICBjb25zdCBpbnQgdm11X1JhbmsgPSAxOw0KICBQeUFycmF5 T2JqZWN0ICpjYXBpX3ZtdV90bXAgPSBOVUxMOw0KICBpbnQgY2FwaV92bXVfaW50ZW50ID0gMDsN CiAgUHlPYmplY3QgKnZtdV9jYXBpID0gUHlfTm9uZTsNCiAgZG91YmxlICpjbSA9IE5VTEw7DQog IGludCBjbV9EaW1zWzFdID0gey0xfTsNCiAgY29uc3QgaW50IGNtX1JhbmsgPSAxOw0KICBQeUFy cmF5T2JqZWN0ICpjYXBpX2NtX3RtcCA9IE5VTEw7DQogIGludCBjYXBpX2NtX2ludGVudCA9IDA7 DQogIFB5T2JqZWN0ICpjbV9jYXBpID0gUHlfTm9uZTsNCiAgZG91YmxlICpnbGFnYSA9IE5VTEw7 DQogIGludCBnbGFnYV9EaW1zWzFdID0gey0xfTsNCiAgY29uc3QgaW50IGdsYWdhX1JhbmsgPSAx Ow0KICBQeUFycmF5T2JqZWN0ICpjYXBpX2dsYWdhX3RtcCA9IE5VTEw7DQogIGludCBjYXBpX2ds YWdhX2ludGVudCA9IDA7DQogIFB5T2JqZWN0ICpnbGFnYV9jYXBpID0gUHlfTm9uZTsNCiAgZG91 YmxlICpnYW1tYSA9IE5VTEw7DQogIGludCBnYW1tYV9EaW1zWzFdID0gey0xfTsNCiAgY29uc3Qg aW50IGdhbW1hX1JhbmsgPSAxOw0KICBQeUFycmF5T2JqZWN0ICpjYXBpX2dhbW1hX3RtcCA9IE5V TEw7DQogIGludCBjYXBpX2dhbW1hX2ludGVudCA9IDA7DQogIFB5T2JqZWN0ICpnYW1tYV9jYXBp ID0gUHlfTm9uZTsNCiAgZG91YmxlICpldGEgPSBOVUxMOw0KICBpbnQgZXRhX0RpbXNbMV0gPSB7 LTF9Ow0KICBjb25zdCBpbnQgZXRhX1JhbmsgPSAxOw0KICBQeUFycmF5T2JqZWN0ICpjYXBpX2V0 YV90bXAgPSBOVUxMOw0KICBpbnQgY2FwaV9ldGFfaW50ZW50ID0gMDsNCiAgUHlPYmplY3QgKmV0 YV9jYXBpID0gUHlfTm9uZTsNCiAgZG91YmxlICp4YSA9IE5VTEw7DQogIGludCB4YV9EaW1zWzFd ID0gey0xfTsNCiAgY29uc3QgaW50IHhhX1JhbmsgPSAxOw0KICBQeUFycmF5T2JqZWN0ICpjYXBp X3hhX3RtcCA9IE5VTEw7DQogIGludCBjYXBpX3hhX2ludGVudCA9IDA7DQogIFB5T2JqZWN0ICp4 YV9jYXBpID0gUHlfTm9uZTsNCiAgZG91YmxlICpiZGVsdGEgPSBOVUxMOw0KICBpbnQgYmRlbHRh X0RpbXNbMV0gPSB7LTF9Ow0KICBjb25zdCBpbnQgYmRlbHRhX1JhbmsgPSAxOw0KICBQeUFycmF5 T2JqZWN0ICpjYXBpX2JkZWx0YV90bXAgPSBOVUxMOw0KICBpbnQgY2FwaV9iZGVsdGFfaW50ZW50 ID0gMDsNCiAgUHlPYmplY3QgKmJkZWx0YV9jYXBpID0gUHlfTm9uZTsNCiAgZG91YmxlICpkZWx0 YSA9IE5VTEw7DQogIGludCBkZWx0YV9EaW1zWzFdID0gey0xfTsNCiAgY29uc3QgaW50IGRlbHRh X1JhbmsgPSAxOw0KICBQeUFycmF5T2JqZWN0ICpjYXBpX2RlbHRhX3RtcCA9IE5VTEw7DQogIGlu dCBjYXBpX2RlbHRhX2ludGVudCA9IDA7DQogIFB5T2JqZWN0ICpkZWx0YV9jYXBpID0gUHlfTm9u ZTsNCiAgaW50IGxkZWwgPSAwOw0KICBQeU9iamVjdCAqbGRlbF9jYXBpID0gUHlfTm9uZTsNCiAg ZG91YmxlICpnbSA9IE5VTEw7DQogIGludCBnbV9EaW1zWzFdID0gey0xfTsNCiAgY29uc3QgaW50 IGdtX1JhbmsgPSAxOw0KICBQeUFycmF5T2JqZWN0ICpjYXBpX2dtX3RtcCA9IE5VTEw7DQogIGlu dCBjYXBpX2dtX2ludGVudCA9IDA7DQogIFB5T2JqZWN0ICpnbV9jYXBpID0gUHlfTm9uZTsNCiAg ZG91YmxlICpiZGwgPSBOVUxMOw0KICBpbnQgYmRsX0RpbXNbMV0gPSB7LTF9Ow0KICBjb25zdCBp bnQgYmRsX1JhbmsgPSAxOw0KICBQeUFycmF5T2JqZWN0ICpjYXBpX2JkbF90bXAgPSBOVUxMOw0K ICBpbnQgY2FwaV9iZGxfaW50ZW50ID0gMDsNCiAgUHlPYmplY3QgKmJkbF9jYXBpID0gUHlfTm9u ZTsNCiAgZG91YmxlICpiZHUgPSBOVUxMOw0KICBpbnQgYmR1X0RpbXNbMV0gPSB7LTF9Ow0KICBj b25zdCBpbnQgYmR1X1JhbmsgPSAxOw0KICBQeUFycmF5T2JqZWN0ICpjYXBpX2JkdV90bXAgPSBO VUxMOw0KICBpbnQgY2FwaV9iZHVfaW50ZW50ID0gMDsNCiAgUHlPYmplY3QgKmJkdV9jYXBpID0g UHlfTm9uZTsNCiAgZG91YmxlICpoID0gTlVMTDsNCiAgaW50IGhfRGltc1syXSA9IHstMSwgLTF9 Ow0KICBjb25zdCBpbnQgaF9SYW5rID0gMjsNCiAgUHlBcnJheU9iamVjdCAqY2FwaV9oX3RtcCA9 IE5VTEw7DQogIGludCBjYXBpX2hfaW50ZW50ID0gMDsNCiAgUHlPYmplY3QgKmhfY2FwaSA9IFB5 X05vbmU7DQogIGludCBsaCA9IDA7DQogIFB5T2JqZWN0ICpsaF9jYXBpID0gUHlfTm9uZTsNCiAg ZG91YmxlICp3YSA9IE5VTEw7DQogIGludCB3YV9EaW1zWzFdID0gey0xfTsNCiAgY29uc3QgaW50 IHdhX1JhbmsgPSAxOw0KICBQeUFycmF5T2JqZWN0ICpjYXBpX3dhX3RtcCA9IE5VTEw7DQogIGlu dCBjYXBpX3dhX2ludGVudCA9IDA7DQogIFB5T2JqZWN0ICp3YV9jYXBpID0gUHlfTm9uZTsNCiAg aW50IGx3YSA9IDA7DQogIFB5T2JqZWN0ICpsd2FfY2FwaSA9IFB5X05vbmU7DQogIGludCAqaXdh ID0gTlVMTDsNCiAgaW50IGl3YV9EaW1zWzFdID0gey0xfTsNCiAgY29uc3QgaW50IGl3YV9SYW5r ID0gMTsNCiAgUHlBcnJheU9iamVjdCAqY2FwaV9pd2FfdG1wID0gTlVMTDsNCiAgaW50IGNhcGlf aXdhX2ludGVudCA9IDA7DQogIFB5T2JqZWN0ICppd2FfY2FwaSA9IFB5X05vbmU7DQogIGludCBs aXdhID0gMDsNCiAgUHlPYmplY3QgKmxpd2FfY2FwaSA9IFB5X05vbmU7DQogIGRvdWJsZSAqb2Jq X2YgPSBOVUxMOw0KICBpbnQgb2JqX2ZfRGltc1sxXSA9IHstMX07DQogIGNvbnN0IGludCBvYmpf Zl9SYW5rID0gMTsNCiAgUHlBcnJheU9iamVjdCAqY2FwaV9vYmpfZl90bXAgPSBOVUxMOw0KICBp bnQgY2FwaV9vYmpfZl9pbnRlbnQgPSAwOw0KICBQeU9iamVjdCAqb2JqX2ZfY2FwaSA9IFB5X05v bmU7DQogIGRvdWJsZSAqb2JqZyA9IE5VTEw7DQogIGludCBvYmpnX0RpbXNbMV0gPSB7LTF9Ow0K ICBjb25zdCBpbnQgb2JqZ19SYW5rID0gMTsNCiAgUHlBcnJheU9iamVjdCAqY2FwaV9vYmpnX3Rt cCA9IE5VTEw7DQogIGludCBjYXBpX29iamdfaW50ZW50ID0gMDsNCiAgUHlPYmplY3QgKm9iamdf Y2FwaSA9IFB5X05vbmU7DQogIGludCBpYm51bSA9IDA7DQogIFB5T2JqZWN0ICppYm51bV9jYXBp ID0gUHlfTm9uZTsNCiAgc3RhdGljIGNoYXIgKmNhcGlfa3dsaXN0W10gPSB7ImZjbiIsIm1vZGUi LCJtZXEiLCJ4Iiwib2JqZiIsImZncmQiLCJjb25mIiwiY25vcm0iLCJiIiwidG9sIiwibWF4ZmV2 IiwiaXByaW50IiwibndyaXRlIiwiaW5mbyIsIm5mZXYiLCJ2bGFtIiwiZ2xhZyIsInZtdSIsImNt IiwiZ2xhZ2EiLCJnYW1tYSIsImV0YSIsInhhIiwiYmRlbHRhIiwiZGVsdGEiLCJnbSIsImJkbCIs ImJkdSIsImgiLCJ3YSIsIml3YSIsIm9ial9mIiwib2JqZyIsImlibnVtIiwibiIsIm0iLCJsY25v cm0iLCJsYiIsImxkZWwiLCJsaCIsImx3YSIsImxpd2EiLCJmY25fZXh0cmFfYXJncyIsTlVMTH07 DQoNCi8qcm91dGRlYnVnZW50ZXIqLw0KI2lmZGVmIEYyUFlfUkVQT1JUX0FURVhJVA0KZjJweV9z dGFydF9jbG9jaygpOw0KI2VuZGlmDQogIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRz KGNhcGlfYXJncyxjYXBpX2tleXdkcyxcDQogICAgIk9PT09PT09PT09PT09PT09PT09PT09PT09P T09PT09PT098T09PT09PT09PITpvcHRfc3FwLnNxcCIsXA0KICAgIGNhcGlfa3dsaXN0LCZmY25f Y2FwaSwmbW9kZV9jYXBpLCZtZXFfY2FwaSwmeF9jYXBpLCZvYmpmX2NhcGksJmZncmRfY2FwaSwm Y29uZl9jYXBpLCZjbm9ybV9jYXBpLCZiX2NhcGksJnRvbF9jYXBpLCZtYXhmZXZfY2FwaSwmaXBy aW50X2NhcGksJm53cml0ZV9jYXBpLCZpbmZvX2NhcGksJm5mZXZfY2FwaSwmdmxhbV9jYXBpLCZn bGFnX2NhcGksJnZtdV9jYXBpLCZjbV9jYXBpLCZnbGFnYV9jYXBpLCZnYW1tYV9jYXBpLCZldGFf Y2FwaSwmeGFfY2FwaSwmYmRlbHRhX2NhcGksJmRlbHRhX2NhcGksJmdtX2NhcGksJmJkbF9jYXBp LCZiZHVfY2FwaSwmaF9jYXBpLCZ3YV9jYXBpLCZpd2FfY2FwaSwmb2JqX2ZfY2FwaSwmb2JqZ19j YXBpLCZpYm51bV9jYXBpLCZuX2NhcGksJm1fY2FwaSwmbGNub3JtX2NhcGksJmxiX2NhcGksJmxk ZWxfY2FwaSwmbGhfY2FwaSwmbHdhX2NhcGksJmxpd2FfY2FwaSwmUHlUdXBsZV9UeXBlLCZmY25f eGFfY2FwaSkpDQogICAgcmV0dXJuIE5VTEw7DQovKmZyb21weW9iaiovDQogIC8qIFByb2Nlc3Np bmcgdmFyaWFibGUgbmZldiAqLw0KICAgIGYycHlfc3VjY2VzcyA9IGludF9mcm9tX3B5b2JqKCZu ZmV2LG5mZXZfY2FwaSwib3B0X3NxcC5zcXAoKSAxNXRoIGFyZ3VtZW50IChuZmV2KSBjYW4ndCBi ZSBjb252ZXJ0ZWQgdG8gaW50Iik7DQogIGlmIChmMnB5X3N1Y2Nlc3MpIHsNCiAgLyogUHJvY2Vz c2luZyB2YXJpYWJsZSBvYmpmICovDQogICAgZjJweV9zdWNjZXNzID0gZG91YmxlX2Zyb21fcHlv YmooJm9iamYsb2JqZl9jYXBpLCJvcHRfc3FwLnNxcCgpIDV0aCBhcmd1bWVudCAob2JqZikgY2Fu J3QgYmUgY29udmVydGVkIHRvIGRvdWJsZSIpOw0KICBpZiAoZjJweV9zdWNjZXNzKSB7DQogIC8q IFByb2Nlc3NpbmcgdmFyaWFibGUgZ20gKi8NCiAgZ21fRGltc1swXT0xOw0KICBjYXBpX2dtX2lu dGVudCB8PSBGMlBZX0lOVEVOVF9JTjsNCiAgY2FwaV9nbV90bXAgPSBhcnJheV9mcm9tX3B5b2Jq KFB5QXJyYXlfRE9VQkxFLGdtX0RpbXMsZ21fUmFuayxjYXBpX2dtX2ludGVudCxnbV9jYXBpKTsN CiAgaWYgKGNhcGlfZ21fdG1wID09IE5VTEwpIHsNCiAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkp DQogICAgICBQeUVycl9TZXRTdHJpbmcob3B0X3NxcF9lcnJvciwiZmFpbGVkIGluIGNvbnZlcnRp bmcgMjZ0aCBhcmd1bWVudCBgZ20nIG9mIG9wdF9zcXAuc3FwIHRvIEMvRm9ydHJhbiBhcnJheSIg KTsNCiAgfSBlbHNlIHsNCiAgICBnbSA9IChkb3VibGUgKikoY2FwaV9nbV90bXAtPmRhdGEpOw0K ICAvKiBQcm9jZXNzaW5nIHZhcmlhYmxlIHRvbCAqLw0KICAgIGYycHlfc3VjY2VzcyA9IGRvdWJs ZV9mcm9tX3B5b2JqKCZ0b2wsdG9sX2NhcGksIm9wdF9zcXAuc3FwKCkgMTB0aCBhcmd1bWVudCAo dG9sKSBjYW4ndCBiZSBjb252ZXJ0ZWQgdG8gZG91YmxlIik7DQogIGlmIChmMnB5X3N1Y2Nlc3Mp IHsNCiAgLyogUHJvY2Vzc2luZyB2YXJpYWJsZSBtYXhmZXYgKi8NCiAgICBmMnB5X3N1Y2Nlc3Mg PSBpbnRfZnJvbV9weW9iaigmbWF4ZmV2LG1heGZldl9jYXBpLCJvcHRfc3FwLnNxcCgpIDExc3Qg YXJndW1lbnQgKG1heGZldikgY2FuJ3QgYmUgY29udmVydGVkIHRvIGludCIpOw0KICBpZiAoZjJw eV9zdWNjZXNzKSB7DQogIC8qIFByb2Nlc3NpbmcgdmFyaWFibGUgaW5mbyAqLw0KICAgIGYycHlf c3VjY2VzcyA9IGludF9mcm9tX3B5b2JqKCZpbmZvLGluZm9fY2FwaSwib3B0X3NxcC5zcXAoKSAx NHRoIGFyZ3VtZW50IChpbmZvKSBjYW4ndCBiZSBjb252ZXJ0ZWQgdG8gaW50Iik7DQogIGlmIChm MnB5X3N1Y2Nlc3MpIHsNCiAgLyogUHJvY2Vzc2luZyB2YXJpYWJsZSBiICovDQogIDsNCiAgY2Fw aV9iX2ludGVudCB8PSBGMlBZX0lOVEVOVF9JTjsNCiAgY2FwaV9iX3RtcCA9IGFycmF5X2Zyb21f cHlvYmooUHlBcnJheV9ET1VCTEUsYl9EaW1zLGJfUmFuayxjYXBpX2JfaW50ZW50LGJfY2FwaSk7 DQogIGlmIChjYXBpX2JfdG1wID09IE5VTEwpIHsNCiAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkp DQogICAgICBQeUVycl9TZXRTdHJpbmcob3B0X3NxcF9lcnJvciwiZmFpbGVkIGluIGNvbnZlcnRp bmcgOXRoIGFyZ3VtZW50IGBiJyBvZiBvcHRfc3FwLnNxcCB0byBDL0ZvcnRyYW4gYXJyYXkiICk7 DQogIH0gZWxzZSB7DQogICAgYiA9IChkb3VibGUgKikoY2FwaV9iX3RtcC0+ZGF0YSk7DQogIC8q IFByb2Nlc3NpbmcgdmFyaWFibGUgaXByaW50ICovDQogICAgZjJweV9zdWNjZXNzID0gaW50X2Zy b21fcHlvYmooJmlwcmludCxpcHJpbnRfY2FwaSwib3B0X3NxcC5zcXAoKSAxMm5kIGFyZ3VtZW50 IChpcHJpbnQpIGNhbid0IGJlIGNvbnZlcnRlZCB0byBpbnQiKTsNCiAgaWYgKGYycHlfc3VjY2Vz cykgew0KICAvKiBQcm9jZXNzaW5nIHZhcmlhYmxlIGggKi8NCiAgOw0KICBjYXBpX2hfaW50ZW50 IHw9IEYyUFlfSU5URU5UX0lOOw0KICBjYXBpX2hfdG1wID0gYXJyYXlfZnJvbV9weW9iaihQeUFy cmF5X0RPVUJMRSxoX0RpbXMsaF9SYW5rLGNhcGlfaF9pbnRlbnQsaF9jYXBpKTsNCiAgaWYgKGNh cGlfaF90bXAgPT0gTlVMTCkgew0KICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkNCiAgICAgIFB5 RXJyX1NldFN0cmluZyhvcHRfc3FwX2Vycm9yLCJmYWlsZWQgaW4gY29udmVydGluZyAyOXRoIGFy Z3VtZW50IGBoJyBvZiBvcHRfc3FwLnNxcCB0byBDL0ZvcnRyYW4gYXJyYXkiICk7DQogIH0gZWxz ZSB7DQogICAgaCA9IChkb3VibGUgKikoY2FwaV9oX3RtcC0+ZGF0YSk7DQogIC8qIFByb2Nlc3Np bmcgdmFyaWFibGUgbndyaXRlICovDQogICAgZjJweV9zdWNjZXNzID0gaW50X2Zyb21fcHlvYmoo Jm53cml0ZSxud3JpdGVfY2FwaSwib3B0X3NxcC5zcXAoKSAxM3JkIGFyZ3VtZW50IChud3JpdGUp IGNhbid0IGJlIGNvbnZlcnRlZCB0byBpbnQiKTsNCiAgaWYgKGYycHlfc3VjY2Vzcykgew0KICAv KiBQcm9jZXNzaW5nIHZhcmlhYmxlIHggKi8NCiAgOw0KICBjYXBpX3hfaW50ZW50IHw9IEYyUFlf SU5URU5UX0lOOw0KICBjYXBpX3hfdG1wID0gYXJyYXlfZnJvbV9weW9iaihQeUFycmF5X0RPVUJM RSx4X0RpbXMseF9SYW5rLGNhcGlfeF9pbnRlbnQseF9jYXBpKTsNCiAgaWYgKGNhcGlfeF90bXAg PT0gTlVMTCkgew0KICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkNCiAgICAgIFB5RXJyX1NldFN0 cmluZyhvcHRfc3FwX2Vycm9yLCJmYWlsZWQgaW4gY29udmVydGluZyA0dGggYXJndW1lbnQgYHgn IG9mIG9wdF9zcXAuc3FwIHRvIEMvRm9ydHJhbiBhcnJheSIgKTsNCiAgfSBlbHNlIHsNCiAgICB4 ID0gKGRvdWJsZSAqKShjYXBpX3hfdG1wLT5kYXRhKTsNCiAgLyogUHJvY2Vzc2luZyB2YXJpYWJs ZSBjb25mICovDQogIDsNCiAgY2FwaV9jb25mX2ludGVudCB8PSBGMlBZX0lOVEVOVF9JTjsNCiAg Y2FwaV9jb25mX3RtcCA9IGFycmF5X2Zyb21fcHlvYmooUHlBcnJheV9ET1VCTEUsY29uZl9EaW1z LGNvbmZfUmFuayxjYXBpX2NvbmZfaW50ZW50LGNvbmZfY2FwaSk7DQogIGlmIChjYXBpX2NvbmZf dG1wID09IE5VTEwpIHsNCiAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpDQogICAgICBQeUVycl9T ZXRTdHJpbmcob3B0X3NxcF9lcnJvciwiZmFpbGVkIGluIGNvbnZlcnRpbmcgN3RoIGFyZ3VtZW50 IGBjb25mJyBvZiBvcHRfc3FwLnNxcCB0byBDL0ZvcnRyYW4gYXJyYXkiICk7DQogIH0gZWxzZSB7 DQogICAgY29uZiA9IChkb3VibGUgKikoY2FwaV9jb25mX3RtcC0+ZGF0YSk7DQogIC8qIFByb2Nl c3NpbmcgdmFyaWFibGUgd2EgKi8NCiAgOw0KICBjYXBpX3dhX2ludGVudCB8PSBGMlBZX0lOVEVO VF9JTjsNCiAgY2FwaV93YV90bXAgPSBhcnJheV9mcm9tX3B5b2JqKFB5QXJyYXlfRE9VQkxFLHdh X0RpbXMsd2FfUmFuayxjYXBpX3dhX2ludGVudCx3YV9jYXBpKTsNCiAgaWYgKGNhcGlfd2FfdG1w ID09IE5VTEwpIHsNCiAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpDQogICAgICBQeUVycl9TZXRT dHJpbmcob3B0X3NxcF9lcnJvciwiZmFpbGVkIGluIGNvbnZlcnRpbmcgMzB0aCBhcmd1bWVudCBg d2EnIG9mIG9wdF9zcXAuc3FwIHRvIEMvRm9ydHJhbiBhcnJheSIgKTsNCiAgfSBlbHNlIHsNCiAg ICB3YSA9IChkb3VibGUgKikoY2FwaV93YV90bXAtPmRhdGEpOw0KICAvKiBQcm9jZXNzaW5nIHZh cmlhYmxlIGlibnVtICovDQogICAgZjJweV9zdWNjZXNzID0gaW50X2Zyb21fcHlvYmooJmlibnVt LGlibnVtX2NhcGksIm9wdF9zcXAuc3FwKCkgMzR0aCBhcmd1bWVudCAoaWJudW0pIGNhbid0IGJl IGNvbnZlcnRlZCB0byBpbnQiKTsNCiAgaWYgKGYycHlfc3VjY2Vzcykgew0KICAvKiBQcm9jZXNz aW5nIHZhcmlhYmxlIGJkbCAqLw0KICBiZGxfRGltc1swXT0xOw0KICBjYXBpX2JkbF9pbnRlbnQg fD0gRjJQWV9JTlRFTlRfSU47DQogIGNhcGlfYmRsX3RtcCA9IGFycmF5X2Zyb21fcHlvYmooUHlB cnJheV9ET1VCTEUsYmRsX0RpbXMsYmRsX1JhbmssY2FwaV9iZGxfaW50ZW50LGJkbF9jYXBpKTsN CiAgaWYgKGNhcGlfYmRsX3RtcCA9PSBOVUxMKSB7DQogICAgaWYgKCFQeUVycl9PY2N1cnJlZCgp KQ0KICAgICAgUHlFcnJfU2V0U3RyaW5nKG9wdF9zcXBfZXJyb3IsImZhaWxlZCBpbiBjb252ZXJ0 aW5nIDI3dGggYXJndW1lbnQgYGJkbCcgb2Ygb3B0X3NxcC5zcXAgdG8gQy9Gb3J0cmFuIGFycmF5 IiApOw0KICB9IGVsc2Ugew0KICAgIGJkbCA9IChkb3VibGUgKikoY2FwaV9iZGxfdG1wLT5kYXRh KTsNCiAgLyogUHJvY2Vzc2luZyB2YXJpYWJsZSBiZHUgKi8NCiAgYmR1X0RpbXNbMF09MTsNCiAg Y2FwaV9iZHVfaW50ZW50IHw9IEYyUFlfSU5URU5UX0lOOw0KICBjYXBpX2JkdV90bXAgPSBhcnJh eV9mcm9tX3B5b2JqKFB5QXJyYXlfRE9VQkxFLGJkdV9EaW1zLGJkdV9SYW5rLGNhcGlfYmR1X2lu dGVudCxiZHVfY2FwaSk7DQogIGlmIChjYXBpX2JkdV90bXAgPT0gTlVMTCkgew0KICAgIGlmICgh UHlFcnJfT2NjdXJyZWQoKSkNCiAgICAgIFB5RXJyX1NldFN0cmluZyhvcHRfc3FwX2Vycm9yLCJm YWlsZWQgaW4gY29udmVydGluZyAyOHRoIGFyZ3VtZW50IGBiZHUnIG9mIG9wdF9zcXAuc3FwIHRv IEMvRm9ydHJhbiBhcnJheSIgKTsNCiAgfSBlbHNlIHsNCiAgICBiZHUgPSAoZG91YmxlICopKGNh cGlfYmR1X3RtcC0+ZGF0YSk7DQogIC8qIFByb2Nlc3NpbmcgdmFyaWFibGUgbW9kZSAqLw0KICAg IGYycHlfc3VjY2VzcyA9IGludF9mcm9tX3B5b2JqKCZtb2RlLG1vZGVfY2FwaSwib3B0X3NxcC5z cXAoKSAybmQgYXJndW1lbnQgKG1vZGUpIGNhbid0IGJlIGNvbnZlcnRlZCB0byBpbnQiKTsNCiAg aWYgKGYycHlfc3VjY2Vzcykgew0KICAvKiBQcm9jZXNzaW5nIHZhcmlhYmxlIGl3YSAqLw0KICA7 DQogIGNhcGlfaXdhX2ludGVudCB8PSBGMlBZX0lOVEVOVF9JTjsNCiAgY2FwaV9pd2FfdG1wID0g YXJyYXlfZnJvbV9weW9iaihQeUFycmF5X0lOVCxpd2FfRGltcyxpd2FfUmFuayxjYXBpX2l3YV9p bnRlbnQsaXdhX2NhcGkpOw0KICBpZiAoY2FwaV9pd2FfdG1wID09IE5VTEwpIHsNCiAgICBpZiAo IVB5RXJyX09jY3VycmVkKCkpDQogICAgICBQeUVycl9TZXRTdHJpbmcob3B0X3NxcF9lcnJvciwi ZmFpbGVkIGluIGNvbnZlcnRpbmcgMzFzdCBhcmd1bWVudCBgaXdhJyBvZiBvcHRfc3FwLnNxcCB0 byBDL0ZvcnRyYW4gYXJyYXkiICk7DQogIH0gZWxzZSB7DQogICAgaXdhID0gKGludCAqKShjYXBp X2l3YV90bXAtPmRhdGEpOw0KICAvKiBQcm9jZXNzaW5nIHZhcmlhYmxlIG1lcSAqLw0KICAgIGYy cHlfc3VjY2VzcyA9IGludF9mcm9tX3B5b2JqKCZtZXEsbWVxX2NhcGksIm9wdF9zcXAuc3FwKCkg M3JkIGFyZ3VtZW50IChtZXEpIGNhbid0IGJlIGNvbnZlcnRlZCB0byBpbnQiKTsNCiAgaWYgKGYy cHlfc3VjY2Vzcykgew0KICAvKiBQcm9jZXNzaW5nIHZhcmlhYmxlIGZjbiAqLw0KICBmY25fbm9m YXJnc19jYXBpID0gY2JfZmNuX2luX3NxcF9fdXNlcl9fcm91dGluZXNfbm9mYXJnczsNCiAgaWYg KGNyZWF0ZV9jYl9hcmdsaXN0KGZjbl9jYXBpLGZjbl94YV9jYXBpLDExLDMsJmNiX2Zjbl9pbl9z cXBfX3VzZXJfX3JvdXRpbmVzX25vZmFyZ3MsJmZjbl9hcmdzX2NhcGksImZhaWxlZCBpbiBwcm9j ZXNzaW5nIGFyZ3VtZW50IGxpc3QgZm9yIGNhbGwtYmFjayBmY24uIikpIHsNCiAgICBqbXBfYnVm IGZjbl9qbXBidWY7DQogICAgQ0ZVTkNTTUVTUygiU2F2aW5nIGptcGJ1ZiBmb3IgYGZjbmAuXG4i KTsNCiAgICBTV0FQKGZjbl9jYXBpLGNiX2Zjbl9pbl9zcXBfX3VzZXJfX3JvdXRpbmVzX2NhcGks UHlPYmplY3QpOw0KICAgIFNXQVAoZmNuX2FyZ3NfY2FwaSxjYl9mY25faW5fc3FwX191c2VyX19y b3V0aW5lc19hcmdzX2NhcGksUHlUdXBsZU9iamVjdCk7DQogICAgbWVtY3B5KCZmY25fam1wYnVm LCZjYl9mY25faW5fc3FwX191c2VyX19yb3V0aW5lc19qbXBidWYsc2l6ZW9mKGptcF9idWYpKTsN CiAgLyogUHJvY2Vzc2luZyB2YXJpYWJsZSBkZWx0YSAqLw0KICA7DQogIGNhcGlfZGVsdGFfaW50 ZW50IHw9IEYyUFlfSU5URU5UX0lOOw0KICBjYXBpX2RlbHRhX3RtcCA9IGFycmF5X2Zyb21fcHlv YmooUHlBcnJheV9ET1VCTEUsZGVsdGFfRGltcyxkZWx0YV9SYW5rLGNhcGlfZGVsdGFfaW50ZW50 LGRlbHRhX2NhcGkpOw0KICBpZiAoY2FwaV9kZWx0YV90bXAgPT0gTlVMTCkgew0KICAgIGlmICgh UHlFcnJfT2NjdXJyZWQoKSkNCiAgICAgIFB5RXJyX1NldFN0cmluZyhvcHRfc3FwX2Vycm9yLCJm YWlsZWQgaW4gY29udmVydGluZyAyNXRoIGFyZ3VtZW50IGBkZWx0YScgb2Ygb3B0X3NxcC5zcXAg dG8gQy9Gb3J0cmFuIGFycmF5IiApOw0KICB9IGVsc2Ugew0KICAgIGRlbHRhID0gKGRvdWJsZSAq KShjYXBpX2RlbHRhX3RtcC0+ZGF0YSk7DQogIC8qIFByb2Nlc3NpbmcgdmFyaWFibGUgbGggKi8N CiAgaWYgKGxoX2NhcGkgPT0gUHlfTm9uZSkgbGggPSBzaGFwZShoLDApOyBlbHNlDQogICAgZjJw eV9zdWNjZXNzID0gaW50X2Zyb21fcHlvYmooJmxoLGxoX2NhcGksIm9wdF9zcXAuc3FwKCkgNnRo IGtleXdvcmQgKGxoKSBjYW4ndCBiZSBjb252ZXJ0ZWQgdG8gaW50Iik7DQogIGlmIChmMnB5X3N1 Y2Nlc3MpIHsNCiAgQ0hFQ0tTQ0FMQVIoc2hhcGUoaCwwKT09bGgsInNoYXBlKGgsMCk9PWxoIiwi NnRoIGtleXdvcmQgbGgiLCJzcXA6bGg9JWQiLGxoKSB7DQogIC8qIFByb2Nlc3NpbmcgdmFyaWFi bGUgbGIgKi8NCiAgaWYgKGxiX2NhcGkgPT0gUHlfTm9uZSkgbGIgPSBzaGFwZShiLDApOyBlbHNl DQogICAgZjJweV9zdWNjZXNzID0gaW50X2Zyb21fcHlvYmooJmxiLGxiX2NhcGksIm9wdF9zcXAu c3FwKCkgNHRoIGtleXdvcmQgKGxiKSBjYW4ndCBiZSBjb252ZXJ0ZWQgdG8gaW50Iik7DQogIGlm IChmMnB5X3N1Y2Nlc3MpIHsNCiAgQ0hFQ0tTQ0FMQVIoc2hhcGUoYiwwKT09bGIsInNoYXBlKGIs MCk9PWxiIiwiNHRoIGtleXdvcmQgbGIiLCJzcXA6bGI9JWQiLGxiKSB7DQogIC8qIFByb2Nlc3Np bmcgdmFyaWFibGUgbGRlbCAqLw0KICBpZiAobGRlbF9jYXBpID09IFB5X05vbmUpIGxkZWwgPSBs ZW4oZGVsdGEpOyBlbHNlDQogICAgZjJweV9zdWNjZXNzID0gaW50X2Zyb21fcHlvYmooJmxkZWws bGRlbF9jYXBpLCJvcHRfc3FwLnNxcCgpIDV0aCBrZXl3b3JkIChsZGVsKSBjYW4ndCBiZSBjb252 ZXJ0ZWQgdG8gaW50Iik7DQogIGlmIChmMnB5X3N1Y2Nlc3MpIHsNCiAgQ0hFQ0tTQ0FMQVIobGVu KGRlbHRhKT49bGRlbCwibGVuKGRlbHRhKT49bGRlbCIsIjV0aCBrZXl3b3JkIGxkZWwiLCJzcXA6 bGRlbD0lZCIsbGRlbCkgew0KICAvKiBQcm9jZXNzaW5nIHZhcmlhYmxlIGx3YSAqLw0KICBpZiAo bHdhX2NhcGkgPT0gUHlfTm9uZSkgbHdhID0gbGVuKHdhKTsgZWxzZQ0KICAgIGYycHlfc3VjY2Vz cyA9IGludF9mcm9tX3B5b2JqKCZsd2EsbHdhX2NhcGksIm9wdF9zcXAuc3FwKCkgN3RoIGtleXdv cmQgKGx3YSkgY2FuJ3QgYmUgY29udmVydGVkIHRvIGludCIpOw0KICBpZiAoZjJweV9zdWNjZXNz KSB7DQogIENIRUNLU0NBTEFSKGxlbih3YSk+PWx3YSwibGVuKHdhKT49bHdhIiwiN3RoIGtleXdv cmQgbHdhIiwic3FwOmx3YT0lZCIsbHdhKSB7DQogIC8qIFByb2Nlc3NpbmcgdmFyaWFibGUgbiAq Lw0KICBpZiAobl9jYXBpID09IFB5X05vbmUpIG4gPSBsZW4oeCk7IGVsc2UNCiAgICBmMnB5X3N1 Y2Nlc3MgPSBpbnRfZnJvbV9weW9iaigmbixuX2NhcGksIm9wdF9zcXAuc3FwKCkgMXN0IGtleXdv cmQgKG4pIGNhbid0IGJlIGNvbnZlcnRlZCB0byBpbnQiKTsNCiAgaWYgKGYycHlfc3VjY2Vzcykg ew0KICBDSEVDS1NDQUxBUihsZW4oeCk+PW4sImxlbih4KT49biIsIjFzdCBrZXl3b3JkIG4iLCJz cXA6bj0lZCIsbikgew0KICAvKiBQcm9jZXNzaW5nIHZhcmlhYmxlIGxpd2EgKi8NCiAgaWYgKGxp d2FfY2FwaSA9PSBQeV9Ob25lKSBsaXdhID0gbGVuKGl3YSk7IGVsc2UNCiAgICBmMnB5X3N1Y2Nl c3MgPSBpbnRfZnJvbV9weW9iaigmbGl3YSxsaXdhX2NhcGksIm9wdF9zcXAuc3FwKCkgOHRoIGtl eXdvcmQgKGxpd2EpIGNhbid0IGJlIGNvbnZlcnRlZCB0byBpbnQiKTsNCiAgaWYgKGYycHlfc3Vj Y2Vzcykgew0KICBDSEVDS1NDQUxBUihsZW4oaXdhKT49bGl3YSwibGVuKGl3YSk+PWxpd2EiLCI4 dGgga2V5d29yZCBsaXdhIiwic3FwOmxpd2E9JWQiLGxpd2EpIHsNCiAgLyogUHJvY2Vzc2luZyB2 YXJpYWJsZSBvYmpfZiAqLw0KICBvYmpfZl9EaW1zWzBdPW4gKyAxOw0KICBjYXBpX29ial9mX2lu dGVudCB8PSBGMlBZX0lOVEVOVF9JTjsNCiAgY2FwaV9vYmpfZl90bXAgPSBhcnJheV9mcm9tX3B5 b2JqKFB5QXJyYXlfRE9VQkxFLG9ial9mX0RpbXMsb2JqX2ZfUmFuayxjYXBpX29ial9mX2ludGVu dCxvYmpfZl9jYXBpKTsNCiAgaWYgKGNhcGlfb2JqX2ZfdG1wID09IE5VTEwpIHsNCiAgICBpZiAo IVB5RXJyX09jY3VycmVkKCkpDQogICAgICBQeUVycl9TZXRTdHJpbmcob3B0X3NxcF9lcnJvciwi ZmFpbGVkIGluIGNvbnZlcnRpbmcgMzJuZCBhcmd1bWVudCBgb2JqX2YnIG9mIG9wdF9zcXAuc3Fw IHRvIEMvRm9ydHJhbiBhcnJheSIgKTsNCiAgfSBlbHNlIHsNCiAgICBvYmpfZiA9IChkb3VibGUg KikoY2FwaV9vYmpfZl90bXAtPmRhdGEpOw0KICAvKiBQcm9jZXNzaW5nIHZhcmlhYmxlIGZncmQg Ki8NCiAgZmdyZF9EaW1zWzBdPW47DQogIGNhcGlfZmdyZF9pbnRlbnQgfD0gRjJQWV9JTlRFTlRf SU47DQogIGNhcGlfZmdyZF90bXAgPSBhcnJheV9mcm9tX3B5b2JqKFB5QXJyYXlfRE9VQkxFLGZn cmRfRGltcyxmZ3JkX1JhbmssY2FwaV9mZ3JkX2ludGVudCxmZ3JkX2NhcGkpOw0KICBpZiAoY2Fw aV9mZ3JkX3RtcCA9PSBOVUxMKSB7DQogICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKQ0KICAgICAg UHlFcnJfU2V0U3RyaW5nKG9wdF9zcXBfZXJyb3IsImZhaWxlZCBpbiBjb252ZXJ0aW5nIDZ0aCBh cmd1bWVudCBgZmdyZCcgb2Ygb3B0X3NxcC5zcXAgdG8gQy9Gb3J0cmFuIGFycmF5IiApOw0KICB9 IGVsc2Ugew0KICAgIGZncmQgPSAoZG91YmxlICopKGNhcGlfZmdyZF90bXAtPmRhdGEpOw0KICAv KiBQcm9jZXNzaW5nIHZhcmlhYmxlIGJkZWx0YSAqLw0KICBiZGVsdGFfRGltc1swXT1uOw0KICBj YXBpX2JkZWx0YV9pbnRlbnQgfD0gRjJQWV9JTlRFTlRfSU47DQogIGNhcGlfYmRlbHRhX3RtcCA9 IGFycmF5X2Zyb21fcHlvYmooUHlBcnJheV9ET1VCTEUsYmRlbHRhX0RpbXMsYmRlbHRhX1Jhbmss Y2FwaV9iZGVsdGFfaW50ZW50LGJkZWx0YV9jYXBpKTsNCiAgaWYgKGNhcGlfYmRlbHRhX3RtcCA9 PSBOVUxMKSB7DQogICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKQ0KICAgICAgUHlFcnJfU2V0U3Ry aW5nKG9wdF9zcXBfZXJyb3IsImZhaWxlZCBpbiBjb252ZXJ0aW5nIDI0dGggYXJndW1lbnQgYGJk ZWx0YScgb2Ygb3B0X3NxcC5zcXAgdG8gQy9Gb3J0cmFuIGFycmF5IiApOw0KICB9IGVsc2Ugew0K ICAgIGJkZWx0YSA9IChkb3VibGUgKikoY2FwaV9iZGVsdGFfdG1wLT5kYXRhKTsNCiAgLyogUHJv Y2Vzc2luZyB2YXJpYWJsZSBtICovDQogIGlmIChtX2NhcGkgPT0gUHlfTm9uZSkgbSA9IGxlbihj b25mKTsgZWxzZQ0KICAgIGYycHlfc3VjY2VzcyA9IGludF9mcm9tX3B5b2JqKCZtLG1fY2FwaSwi b3B0X3NxcC5zcXAoKSAybmQga2V5d29yZCAobSkgY2FuJ3QgYmUgY29udmVydGVkIHRvIGludCIp Ow0KICBpZiAoZjJweV9zdWNjZXNzKSB7DQogIENIRUNLU0NBTEFSKGxlbihjb25mKT49bSwibGVu KGNvbmYpPj1tIiwiMm5kIGtleXdvcmQgbSIsInNxcDptPSVkIixtKSB7DQogIC8qIFByb2Nlc3Np bmcgdmFyaWFibGUgZXRhICovDQogIGV0YV9EaW1zWzBdPW47DQogIGNhcGlfZXRhX2ludGVudCB8 PSBGMlBZX0lOVEVOVF9JTjsNCiAgY2FwaV9ldGFfdG1wID0gYXJyYXlfZnJvbV9weW9iaihQeUFy cmF5X0RPVUJMRSxldGFfRGltcyxldGFfUmFuayxjYXBpX2V0YV9pbnRlbnQsZXRhX2NhcGkpOw0K ICBpZiAoY2FwaV9ldGFfdG1wID09IE5VTEwpIHsNCiAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkp DQogICAgICBQeUVycl9TZXRTdHJpbmcob3B0X3NxcF9lcnJvciwiZmFpbGVkIGluIGNvbnZlcnRp bmcgMjJuZCBhcmd1bWVudCBgZXRhJyBvZiBvcHRfc3FwLnNxcCB0byBDL0ZvcnRyYW4gYXJyYXki ICk7DQogIH0gZWxzZSB7DQogICAgZXRhID0gKGRvdWJsZSAqKShjYXBpX2V0YV90bXAtPmRhdGEp Ow0KICAvKiBQcm9jZXNzaW5nIHZhcmlhYmxlIGNub3JtICovDQogIGNub3JtX0RpbXNbMV09bTsN CiAgY2FwaV9jbm9ybV9pbnRlbnQgfD0gRjJQWV9JTlRFTlRfSU47DQogIGNhcGlfY25vcm1fdG1w ID0gYXJyYXlfZnJvbV9weW9iaihQeUFycmF5X0RPVUJMRSxjbm9ybV9EaW1zLGNub3JtX1Jhbmss Y2FwaV9jbm9ybV9pbnRlbnQsY25vcm1fY2FwaSk7DQogIGlmIChjYXBpX2Nub3JtX3RtcCA9PSBO VUxMKSB7DQogICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKQ0KICAgICAgUHlFcnJfU2V0U3RyaW5n KG9wdF9zcXBfZXJyb3IsImZhaWxlZCBpbiBjb252ZXJ0aW5nIDh0aCBhcmd1bWVudCBgY25vcm0n IG9mIG9wdF9zcXAuc3FwIHRvIEMvRm9ydHJhbiBhcnJheSIgKTsNCiAgfSBlbHNlIHsNCiAgICBj bm9ybSA9IChkb3VibGUgKikoY2FwaV9jbm9ybV90bXAtPmRhdGEpOw0KICAvKiBQcm9jZXNzaW5n IHZhcmlhYmxlIGdhbW1hICovDQogIGdhbW1hX0RpbXNbMF09bjsNCiAgY2FwaV9nYW1tYV9pbnRl bnQgfD0gRjJQWV9JTlRFTlRfSU47DQogIGNhcGlfZ2FtbWFfdG1wID0gYXJyYXlfZnJvbV9weW9i aihQeUFycmF5X0RPVUJMRSxnYW1tYV9EaW1zLGdhbW1hX1JhbmssY2FwaV9nYW1tYV9pbnRlbnQs Z2FtbWFfY2FwaSk7DQogIGlmIChjYXBpX2dhbW1hX3RtcCA9PSBOVUxMKSB7DQogICAgaWYgKCFQ eUVycl9PY2N1cnJlZCgpKQ0KICAgICAgUHlFcnJfU2V0U3RyaW5nKG9wdF9zcXBfZXJyb3IsImZh aWxlZCBpbiBjb252ZXJ0aW5nIDIxc3QgYXJndW1lbnQgYGdhbW1hJyBvZiBvcHRfc3FwLnNxcCB0 byBDL0ZvcnRyYW4gYXJyYXkiICk7DQogIH0gZWxzZSB7DQogICAgZ2FtbWEgPSAoZG91YmxlICop KGNhcGlfZ2FtbWFfdG1wLT5kYXRhKTsNCiAgLyogUHJvY2Vzc2luZyB2YXJpYWJsZSBjbSAqLw0K ICBjbV9EaW1zWzBdPW07DQogIGNhcGlfY21faW50ZW50IHw9IEYyUFlfSU5URU5UX0lOOw0KICBj YXBpX2NtX3RtcCA9IGFycmF5X2Zyb21fcHlvYmooUHlBcnJheV9ET1VCTEUsY21fRGltcyxjbV9S YW5rLGNhcGlfY21faW50ZW50LGNtX2NhcGkpOw0KICBpZiAoY2FwaV9jbV90bXAgPT0gTlVMTCkg ew0KICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkNCiAgICAgIFB5RXJyX1NldFN0cmluZyhvcHRf c3FwX2Vycm9yLCJmYWlsZWQgaW4gY29udmVydGluZyAxOXRoIGFyZ3VtZW50IGBjbScgb2Ygb3B0 X3NxcC5zcXAgdG8gQy9Gb3J0cmFuIGFycmF5IiApOw0KICB9IGVsc2Ugew0KICAgIGNtID0gKGRv dWJsZSAqKShjYXBpX2NtX3RtcC0+ZGF0YSk7DQogIC8qIFByb2Nlc3NpbmcgdmFyaWFibGUgeGEg Ki8NCiAgeGFfRGltc1swXT1uOw0KICBjYXBpX3hhX2ludGVudCB8PSBGMlBZX0lOVEVOVF9JTjsN CiAgY2FwaV94YV90bXAgPSBhcnJheV9mcm9tX3B5b2JqKFB5QXJyYXlfRE9VQkxFLHhhX0RpbXMs eGFfUmFuayxjYXBpX3hhX2ludGVudCx4YV9jYXBpKTsNCiAgaWYgKGNhcGlfeGFfdG1wID09IE5V TEwpIHsNCiAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpDQogICAgICBQeUVycl9TZXRTdHJpbmco b3B0X3NxcF9lcnJvciwiZmFpbGVkIGluIGNvbnZlcnRpbmcgMjNyZCBhcmd1bWVudCBgeGEnIG9m IG9wdF9zcXAuc3FwIHRvIEMvRm9ydHJhbiBhcnJheSIgKTsNCiAgfSBlbHNlIHsNCiAgICB4YSA9 IChkb3VibGUgKikoY2FwaV94YV90bXAtPmRhdGEpOw0KICAvKiBQcm9jZXNzaW5nIHZhcmlhYmxl IG9iamcgKi8NCiAgb2JqZ19EaW1zWzBdPW4gKyAxOw0KICBjYXBpX29iamdfaW50ZW50IHw9IEYy UFlfSU5URU5UX0lOOw0KICBjYXBpX29iamdfdG1wID0gYXJyYXlfZnJvbV9weW9iaihQeUFycmF5 X0RPVUJMRSxvYmpnX0RpbXMsb2JqZ19SYW5rLGNhcGlfb2JqZ19pbnRlbnQsb2JqZ19jYXBpKTsN CiAgaWYgKGNhcGlfb2JqZ190bXAgPT0gTlVMTCkgew0KICAgIGlmICghUHlFcnJfT2NjdXJyZWQo KSkNCiAgICAgIFB5RXJyX1NldFN0cmluZyhvcHRfc3FwX2Vycm9yLCJmYWlsZWQgaW4gY29udmVy dGluZyAzM3JkIGFyZ3VtZW50IGBvYmpnJyBvZiBvcHRfc3FwLnNxcCB0byBDL0ZvcnRyYW4gYXJy YXkiICk7DQogIH0gZWxzZSB7DQogICAgb2JqZyA9IChkb3VibGUgKikoY2FwaV9vYmpnX3RtcC0+ ZGF0YSk7DQogIC8qIFByb2Nlc3NpbmcgdmFyaWFibGUgdm11ICovDQogIHZtdV9EaW1zWzBdPW07 DQogIGNhcGlfdm11X2ludGVudCB8PSBGMlBZX0lOVEVOVF9JTjsNCiAgY2FwaV92bXVfdG1wID0g YXJyYXlfZnJvbV9weW9iaihQeUFycmF5X0RPVUJMRSx2bXVfRGltcyx2bXVfUmFuayxjYXBpX3Zt dV9pbnRlbnQsdm11X2NhcGkpOw0KICBpZiAoY2FwaV92bXVfdG1wID09IE5VTEwpIHsNCiAgICBp ZiAoIVB5RXJyX09jY3VycmVkKCkpDQogICAgICBQeUVycl9TZXRTdHJpbmcob3B0X3NxcF9lcnJv ciwiZmFpbGVkIGluIGNvbnZlcnRpbmcgMTh0aCBhcmd1bWVudCBgdm11JyBvZiBvcHRfc3FwLnNx cCB0byBDL0ZvcnRyYW4gYXJyYXkiICk7DQogIH0gZWxzZSB7DQogICAgdm11ID0gKGRvdWJsZSAq KShjYXBpX3ZtdV90bXAtPmRhdGEpOw0KICAvKiBQcm9jZXNzaW5nIHZhcmlhYmxlIGdsYWdhICov DQogIGdsYWdhX0RpbXNbMF09bjsNCiAgY2FwaV9nbGFnYV9pbnRlbnQgfD0gRjJQWV9JTlRFTlRf SU47DQogIGNhcGlfZ2xhZ2FfdG1wID0gYXJyYXlfZnJvbV9weW9iaihQeUFycmF5X0RPVUJMRSxn bGFnYV9EaW1zLGdsYWdhX1JhbmssY2FwaV9nbGFnYV9pbnRlbnQsZ2xhZ2FfY2FwaSk7DQogIGlm IChjYXBpX2dsYWdhX3RtcCA9PSBOVUxMKSB7DQogICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKQ0K ICAgICAgUHlFcnJfU2V0U3RyaW5nKG9wdF9zcXBfZXJyb3IsImZhaWxlZCBpbiBjb252ZXJ0aW5n IDIwdGggYXJndW1lbnQgYGdsYWdhJyBvZiBvcHRfc3FwLnNxcCB0byBDL0ZvcnRyYW4gYXJyYXki ICk7DQogIH0gZWxzZSB7DQogICAgZ2xhZ2EgPSAoZG91YmxlICopKGNhcGlfZ2xhZ2FfdG1wLT5k YXRhKTsNCiAgLyogUHJvY2Vzc2luZyB2YXJpYWJsZSBsY25vcm0gKi8NCiAgaWYgKGxjbm9ybV9j YXBpID09IFB5X05vbmUpIGxjbm9ybSA9IHNoYXBlKGNub3JtLDApOyBlbHNlDQogICAgZjJweV9z dWNjZXNzID0gaW50X2Zyb21fcHlvYmooJmxjbm9ybSxsY25vcm1fY2FwaSwib3B0X3NxcC5zcXAo KSAzcmQga2V5d29yZCAobGNub3JtKSBjYW4ndCBiZSBjb252ZXJ0ZWQgdG8gaW50Iik7DQogIGlm IChmMnB5X3N1Y2Nlc3MpIHsNCiAgQ0hFQ0tTQ0FMQVIoc2hhcGUoY25vcm0sMCk9PWxjbm9ybSwi c2hhcGUoY25vcm0sMCk9PWxjbm9ybSIsIjNyZCBrZXl3b3JkIGxjbm9ybSIsInNxcDpsY25vcm09 JWQiLGxjbm9ybSkgew0KICAvKiBQcm9jZXNzaW5nIHZhcmlhYmxlIGdsYWcgKi8NCiAgZ2xhZ19E aW1zWzBdPW47DQogIGNhcGlfZ2xhZ19pbnRlbnQgfD0gRjJQWV9JTlRFTlRfSU47DQogIGNhcGlf Z2xhZ190bXAgPSBhcnJheV9mcm9tX3B5b2JqKFB5QXJyYXlfRE9VQkxFLGdsYWdfRGltcyxnbGFn X1JhbmssY2FwaV9nbGFnX2ludGVudCxnbGFnX2NhcGkpOw0KICBpZiAoY2FwaV9nbGFnX3RtcCA9 PSBOVUxMKSB7DQogICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKQ0KICAgICAgUHlFcnJfU2V0U3Ry aW5nKG9wdF9zcXBfZXJyb3IsImZhaWxlZCBpbiBjb252ZXJ0aW5nIDE3dGggYXJndW1lbnQgYGds YWcnIG9mIG9wdF9zcXAuc3FwIHRvIEMvRm9ydHJhbiBhcnJheSIgKTsNCiAgfSBlbHNlIHsNCiAg ICBnbGFnID0gKGRvdWJsZSAqKShjYXBpX2dsYWdfdG1wLT5kYXRhKTsNCiAgLyogUHJvY2Vzc2lu ZyB2YXJpYWJsZSB2bGFtICovDQogIHZsYW1fRGltc1swXT1tOw0KICBjYXBpX3ZsYW1faW50ZW50 IHw9IEYyUFlfSU5URU5UX0lOOw0KICBjYXBpX3ZsYW1fdG1wID0gYXJyYXlfZnJvbV9weW9iaihQ eUFycmF5X0RPVUJMRSx2bGFtX0RpbXMsdmxhbV9SYW5rLGNhcGlfdmxhbV9pbnRlbnQsdmxhbV9j YXBpKTsNCiAgaWYgKGNhcGlfdmxhbV90bXAgPT0gTlVMTCkgew0KICAgIGlmICghUHlFcnJfT2Nj dXJyZWQoKSkNCiAgICAgIFB5RXJyX1NldFN0cmluZyhvcHRfc3FwX2Vycm9yLCJmYWlsZWQgaW4g Y29udmVydGluZyAxNnRoIGFyZ3VtZW50IGB2bGFtJyBvZiBvcHRfc3FwLnNxcCB0byBDL0ZvcnRy YW4gYXJyYXkiICk7DQogIH0gZWxzZSB7DQogICAgdmxhbSA9IChkb3VibGUgKikoY2FwaV92bGFt X3RtcC0+ZGF0YSk7DQovKmVuZCBvZiBmcm9tcHlvYmoqLw0KI2lmZGVmIEYyUFlfUkVQT1JUX0FU RVhJVA0KZjJweV9zdGFydF9jYWxsX2Nsb2NrKCk7DQojZW5kaWYNCi8qY2FsbGZvcnRyYW5yb3V0 aW5lKi8NCiAgICBpZiAoKHNldGptcChjYl9mY25faW5fc3FwX191c2VyX19yb3V0aW5lc19qbXBi dWYpKSkgew0KICAgICAgZjJweV9zdWNjZXNzID0gMDsNCiAgICB9IGVsc2Ugew0KICAgICAgICAo KmYycHlfZnVuYykoY2JfZmNuX2luX3NxcF9fdXNlcl9fcm91dGluZXMsJm1vZGUsJm4sJm0sJm1l cSx4LCZvYmpmLGZncmQsY29uZixjbm9ybSwmbGNub3JtLGIsJmxiLCZ0b2wsJm1heGZldiwmaXBy aW50LCZud3JpdGUsJmluZm8sJm5mZXYsdmxhbSxnbGFnLHZtdSxjbSxnbGFnYSxnYW1tYSxldGEs eGEsYmRlbHRhLGRlbHRhLCZsZGVsLGdtLGJkbCxiZHUsaCwmbGgsd2EsJmx3YSxpd2EsJmxpd2Es b2JqX2Ysb2JqZywmaWJudW0pOw0KICAgIH0NCiNpZmRlZiBGMlBZX1JFUE9SVF9BVEVYSVQNCmYy cHlfc3RvcF9jYWxsX2Nsb2NrKCk7DQojZW5kaWYNCi8qZW5kIG9mIGNhbGxmb3J0cmFucm91dGlu ZSovDQogICAgaWYgKGYycHlfc3VjY2Vzcykgew0KLypweW9iamZyb20qLw0KICBmMnB5X3N1Y2Nl c3MgPSAxOw0KICBpZiAoUHlDYWxsYWJsZV9DaGVjayhmY25fY2FwaSkpIHsNCiAgZjJweV9zdWNj ZXNzID0gMDsNCiAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwic3FwIGFyZ3VtZW50 IGZjbiBtdXN0IGJlIGNhbGxhYmxlIik7DQp9DQogIGlmIChmMnB5X3N1Y2Nlc3MpIHsNCi8qZW5k IG9mIHB5b2JqZnJvbSovDQogICAgQ0ZVTkNTTUVTUygiQnVpbGRpbmcgcmV0dXJuIHZhbHVlLlxu Iik7DQogICAgY2FwaV9idWlsZHZhbHVlID0gUHlfQnVpbGRWYWx1ZSgiIik7DQovKmNsb3NlcHlv Ympmcm9tKi8NCiAgfSAvKmlmIChmMnB5X3N1Y2Nlc3MpIG9mIGZjbiBweW9iamZyb20qLw0KLypl bmQgb2YgY2xvc2VweW9iamZyb20qLw0KICAgIH0gLyppZiAoZjJweV9zdWNjZXNzKSBhZnRlciBj YWxsZm9ydHJhbnJvdXRpbmUqLw0KLypjbGVhbnVwZnJvbXB5b2JqKi8NCiAgaWYoKFB5T2JqZWN0 ICopY2FwaV92bGFtX3RtcCE9dmxhbV9jYXBpKSB7DQogICAgUHlfWERFQ1JFRihjYXBpX3ZsYW1f dG1wKTsgfQ0KICB9ICAvKmlmIChjYXBpX3ZsYW1fdG1wID09IE5VTEwpIC4uLiBlbHNlIG9mIHZs YW0qLw0KICAvKiBFbmQgb2YgY2xlYW5pbmcgdmFyaWFibGUgdmxhbSAqLw0KICBpZigoUHlPYmpl Y3QgKiljYXBpX2dsYWdfdG1wIT1nbGFnX2NhcGkpIHsNCiAgICBQeV9YREVDUkVGKGNhcGlfZ2xh Z190bXApOyB9DQogIH0gIC8qaWYgKGNhcGlfZ2xhZ190bXAgPT0gTlVMTCkgLi4uIGVsc2Ugb2Yg Z2xhZyovDQogIC8qIEVuZCBvZiBjbGVhbmluZyB2YXJpYWJsZSBnbGFnICovDQogIH0gLypDSEVD S1NDQUxBUihzaGFwZShjbm9ybSwwKT09bGNub3JtKSovDQogIH0gLyppZiAoZjJweV9zdWNjZXNz KSBvZiBsY25vcm0qLw0KICAvKiBFbmQgb2YgY2xlYW5pbmcgdmFyaWFibGUgbGNub3JtICovDQog IGlmKChQeU9iamVjdCAqKWNhcGlfZ2xhZ2FfdG1wIT1nbGFnYV9jYXBpKSB7DQogICAgUHlfWERF Q1JFRihjYXBpX2dsYWdhX3RtcCk7IH0NCiAgfSAgLyppZiAoY2FwaV9nbGFnYV90bXAgPT0gTlVM TCkgLi4uIGVsc2Ugb2YgZ2xhZ2EqLw0KICAvKiBFbmQgb2YgY2xlYW5pbmcgdmFyaWFibGUgZ2xh Z2EgKi8NCiAgaWYoKFB5T2JqZWN0ICopY2FwaV92bXVfdG1wIT12bXVfY2FwaSkgew0KICAgIFB5 X1hERUNSRUYoY2FwaV92bXVfdG1wKTsgfQ0KICB9ICAvKmlmIChjYXBpX3ZtdV90bXAgPT0gTlVM TCkgLi4uIGVsc2Ugb2Ygdm11Ki8NCiAgLyogRW5kIG9mIGNsZWFuaW5nIHZhcmlhYmxlIHZtdSAq Lw0KICBpZigoUHlPYmplY3QgKiljYXBpX29iamdfdG1wIT1vYmpnX2NhcGkpIHsNCiAgICBQeV9Y REVDUkVGKGNhcGlfb2JqZ190bXApOyB9DQogIH0gIC8qaWYgKGNhcGlfb2JqZ190bXAgPT0gTlVM TCkgLi4uIGVsc2Ugb2Ygb2JqZyovDQogIC8qIEVuZCBvZiBjbGVhbmluZyB2YXJpYWJsZSBvYmpn ICovDQogIGlmKChQeU9iamVjdCAqKWNhcGlfeGFfdG1wIT14YV9jYXBpKSB7DQogICAgUHlfWERF Q1JFRihjYXBpX3hhX3RtcCk7IH0NCiAgfSAgLyppZiAoY2FwaV94YV90bXAgPT0gTlVMTCkgLi4u IGVsc2Ugb2YgeGEqLw0KICAvKiBFbmQgb2YgY2xlYW5pbmcgdmFyaWFibGUgeGEgKi8NCiAgaWYo KFB5T2JqZWN0ICopY2FwaV9jbV90bXAhPWNtX2NhcGkpIHsNCiAgICBQeV9YREVDUkVGKGNhcGlf Y21fdG1wKTsgfQ0KICB9ICAvKmlmIChjYXBpX2NtX3RtcCA9PSBOVUxMKSAuLi4gZWxzZSBvZiBj bSovDQogIC8qIEVuZCBvZiBjbGVhbmluZyB2YXJpYWJsZSBjbSAqLw0KICBpZigoUHlPYmplY3Qg KiljYXBpX2dhbW1hX3RtcCE9Z2FtbWFfY2FwaSkgew0KICAgIFB5X1hERUNSRUYoY2FwaV9nYW1t YV90bXApOyB9DQogIH0gIC8qaWYgKGNhcGlfZ2FtbWFfdG1wID09IE5VTEwpIC4uLiBlbHNlIG9m IGdhbW1hKi8NCiAgLyogRW5kIG9mIGNsZWFuaW5nIHZhcmlhYmxlIGdhbW1hICovDQogIGlmKChQ eU9iamVjdCAqKWNhcGlfY25vcm1fdG1wIT1jbm9ybV9jYXBpKSB7DQogICAgUHlfWERFQ1JFRihj YXBpX2Nub3JtX3RtcCk7IH0NCiAgfSAgLyppZiAoY2FwaV9jbm9ybV90bXAgPT0gTlVMTCkgLi4u IGVsc2Ugb2YgY25vcm0qLw0KICAvKiBFbmQgb2YgY2xlYW5pbmcgdmFyaWFibGUgY25vcm0gKi8N CiAgaWYoKFB5T2JqZWN0ICopY2FwaV9ldGFfdG1wIT1ldGFfY2FwaSkgew0KICAgIFB5X1hERUNS RUYoY2FwaV9ldGFfdG1wKTsgfQ0KICB9ICAvKmlmIChjYXBpX2V0YV90bXAgPT0gTlVMTCkgLi4u IGVsc2Ugb2YgZXRhKi8NCiAgLyogRW5kIG9mIGNsZWFuaW5nIHZhcmlhYmxlIGV0YSAqLw0KICB9 IC8qQ0hFQ0tTQ0FMQVIobGVuKGNvbmYpPj1tKSovDQogIH0gLyppZiAoZjJweV9zdWNjZXNzKSBv ZiBtKi8NCiAgLyogRW5kIG9mIGNsZWFuaW5nIHZhcmlhYmxlIG0gKi8NCiAgaWYoKFB5T2JqZWN0 ICopY2FwaV9iZGVsdGFfdG1wIT1iZGVsdGFfY2FwaSkgew0KICAgIFB5X1hERUNSRUYoY2FwaV9i ZGVsdGFfdG1wKTsgfQ0KICB9ICAvKmlmIChjYXBpX2JkZWx0YV90bXAgPT0gTlVMTCkgLi4uIGVs c2Ugb2YgYmRlbHRhKi8NCiAgLyogRW5kIG9mIGNsZWFuaW5nIHZhcmlhYmxlIGJkZWx0YSAqLw0K ICBpZigoUHlPYmplY3QgKiljYXBpX2ZncmRfdG1wIT1mZ3JkX2NhcGkpIHsNCiAgICBQeV9YREVD UkVGKGNhcGlfZmdyZF90bXApOyB9DQogIH0gIC8qaWYgKGNhcGlfZmdyZF90bXAgPT0gTlVMTCkg Li4uIGVsc2Ugb2YgZmdyZCovDQogIC8qIEVuZCBvZiBjbGVhbmluZyB2YXJpYWJsZSBmZ3JkICov DQogIGlmKChQeU9iamVjdCAqKWNhcGlfb2JqX2ZfdG1wIT1vYmpfZl9jYXBpKSB7DQogICAgUHlf WERFQ1JFRihjYXBpX29ial9mX3RtcCk7IH0NCiAgfSAgLyppZiAoY2FwaV9vYmpfZl90bXAgPT0g TlVMTCkgLi4uIGVsc2Ugb2Ygb2JqX2YqLw0KICAvKiBFbmQgb2YgY2xlYW5pbmcgdmFyaWFibGUg b2JqX2YgKi8NCiAgfSAvKkNIRUNLU0NBTEFSKGxlbihpd2EpPj1saXdhKSovDQogIH0gLyppZiAo ZjJweV9zdWNjZXNzKSBvZiBsaXdhKi8NCiAgLyogRW5kIG9mIGNsZWFuaW5nIHZhcmlhYmxlIGxp d2EgKi8NCiAgfSAvKkNIRUNLU0NBTEFSKGxlbih4KT49bikqLw0KICB9IC8qaWYgKGYycHlfc3Vj Y2Vzcykgb2YgbiovDQogIC8qIEVuZCBvZiBjbGVhbmluZyB2YXJpYWJsZSBuICovDQogIH0gLypD SEVDS1NDQUxBUihsZW4od2EpPj1sd2EpKi8NCiAgfSAvKmlmIChmMnB5X3N1Y2Nlc3MpIG9mIGx3 YSovDQogIC8qIEVuZCBvZiBjbGVhbmluZyB2YXJpYWJsZSBsd2EgKi8NCiAgfSAvKkNIRUNLU0NB TEFSKGxlbihkZWx0YSk+PWxkZWwpKi8NCiAgfSAvKmlmIChmMnB5X3N1Y2Nlc3MpIG9mIGxkZWwq Lw0KICAvKiBFbmQgb2YgY2xlYW5pbmcgdmFyaWFibGUgbGRlbCAqLw0KICB9IC8qQ0hFQ0tTQ0FM QVIoc2hhcGUoYiwwKT09bGIpKi8NCiAgfSAvKmlmIChmMnB5X3N1Y2Nlc3MpIG9mIGxiKi8NCiAg LyogRW5kIG9mIGNsZWFuaW5nIHZhcmlhYmxlIGxiICovDQogIH0gLypDSEVDS1NDQUxBUihzaGFw ZShoLDApPT1saCkqLw0KICB9IC8qaWYgKGYycHlfc3VjY2Vzcykgb2YgbGgqLw0KICAvKiBFbmQg b2YgY2xlYW5pbmcgdmFyaWFibGUgbGggKi8NCiAgaWYoKFB5T2JqZWN0ICopY2FwaV9kZWx0YV90 bXAhPWRlbHRhX2NhcGkpIHsNCiAgICBQeV9YREVDUkVGKGNhcGlfZGVsdGFfdG1wKTsgfQ0KICB9 ICAvKmlmIChjYXBpX2RlbHRhX3RtcCA9PSBOVUxMKSAuLi4gZWxzZSBvZiBkZWx0YSovDQogIC8q IEVuZCBvZiBjbGVhbmluZyB2YXJpYWJsZSBkZWx0YSAqLw0KICAgIENGVU5DU01FU1MoIlJlc3Rv cmluZyBqbXBidWYgZm9yIGBmY25gLlxuIik7DQogICAgY2JfZmNuX2luX3NxcF9fdXNlcl9fcm91 dGluZXNfY2FwaSA9IGZjbl9jYXBpOw0KICAgIFB5X0RFQ1JFRihjYl9mY25faW5fc3FwX191c2Vy X19yb3V0aW5lc19hcmdzX2NhcGkpOw0KICAgIGNiX2Zjbl9pbl9zcXBfX3VzZXJfX3JvdXRpbmVz X2FyZ3NfY2FwaSA9IGZjbl9hcmdzX2NhcGk7DQogICAgY2JfZmNuX2luX3NxcF9fdXNlcl9fcm91 dGluZXNfbm9mYXJncyA9IGZjbl9ub2ZhcmdzX2NhcGk7DQogICAgbWVtY3B5KCZjYl9mY25faW5f c3FwX191c2VyX19yb3V0aW5lc19qbXBidWYsJmZjbl9qbXBidWYsc2l6ZW9mKGptcF9idWYpKTsN CiAgfQ0KICAvKiBFbmQgb2YgY2xlYW5pbmcgdmFyaWFibGUgZmNuICovDQogIH0gLyppZiAoZjJw eV9zdWNjZXNzKSBvZiBtZXEqLw0KICAvKiBFbmQgb2YgY2xlYW5pbmcgdmFyaWFibGUgbWVxICov DQogIGlmKChQeU9iamVjdCAqKWNhcGlfaXdhX3RtcCE9aXdhX2NhcGkpIHsNCiAgICBQeV9YREVD UkVGKGNhcGlfaXdhX3RtcCk7IH0NCiAgfSAgLyppZiAoY2FwaV9pd2FfdG1wID09IE5VTEwpIC4u LiBlbHNlIG9mIGl3YSovDQogIC8qIEVuZCBvZiBjbGVhbmluZyB2YXJpYWJsZSBpd2EgKi8NCiAg fSAvKmlmIChmMnB5X3N1Y2Nlc3MpIG9mIG1vZGUqLw0KICAvKiBFbmQgb2YgY2xlYW5pbmcgdmFy aWFibGUgbW9kZSAqLw0KICBpZigoUHlPYmplY3QgKiljYXBpX2JkdV90bXAhPWJkdV9jYXBpKSB7 DQogICAgUHlfWERFQ1JFRihjYXBpX2JkdV90bXApOyB9DQogIH0gIC8qaWYgKGNhcGlfYmR1X3Rt cCA9PSBOVUxMKSAuLi4gZWxzZSBvZiBiZHUqLw0KICAvKiBFbmQgb2YgY2xlYW5pbmcgdmFyaWFi bGUgYmR1ICovDQogIGlmKChQeU9iamVjdCAqKWNhcGlfYmRsX3RtcCE9YmRsX2NhcGkpIHsNCiAg ICBQeV9YREVDUkVGKGNhcGlfYmRsX3RtcCk7IH0NCiAgfSAgLyppZiAoY2FwaV9iZGxfdG1wID09 IE5VTEwpIC4uLiBlbHNlIG9mIGJkbCovDQogIC8qIEVuZCBvZiBjbGVhbmluZyB2YXJpYWJsZSBi ZGwgKi8NCiAgfSAvKmlmIChmMnB5X3N1Y2Nlc3MpIG9mIGlibnVtKi8NCiAgLyogRW5kIG9mIGNs ZWFuaW5nIHZhcmlhYmxlIGlibnVtICovDQogIGlmKChQeU9iamVjdCAqKWNhcGlfd2FfdG1wIT13 YV9jYXBpKSB7DQogICAgUHlfWERFQ1JFRihjYXBpX3dhX3RtcCk7IH0NCiAgfSAgLyppZiAoY2Fw aV93YV90bXAgPT0gTlVMTCkgLi4uIGVsc2Ugb2Ygd2EqLw0KICAvKiBFbmQgb2YgY2xlYW5pbmcg dmFyaWFibGUgd2EgKi8NCiAgaWYoKFB5T2JqZWN0ICopY2FwaV9jb25mX3RtcCE9Y29uZl9jYXBp KSB7DQogICAgUHlfWERFQ1JFRihjYXBpX2NvbmZfdG1wKTsgfQ0KICB9ICAvKmlmIChjYXBpX2Nv bmZfdG1wID09IE5VTEwpIC4uLiBlbHNlIG9mIGNvbmYqLw0KICAvKiBFbmQgb2YgY2xlYW5pbmcg dmFyaWFibGUgY29uZiAqLw0KICBpZigoUHlPYmplY3QgKiljYXBpX3hfdG1wIT14X2NhcGkpIHsN CiAgICBQeV9YREVDUkVGKGNhcGlfeF90bXApOyB9DQogIH0gIC8qaWYgKGNhcGlfeF90bXAgPT0g TlVMTCkgLi4uIGVsc2Ugb2YgeCovDQogIC8qIEVuZCBvZiBjbGVhbmluZyB2YXJpYWJsZSB4ICov DQogIH0gLyppZiAoZjJweV9zdWNjZXNzKSBvZiBud3JpdGUqLw0KICAvKiBFbmQgb2YgY2xlYW5p bmcgdmFyaWFibGUgbndyaXRlICovDQogIGlmKChQeU9iamVjdCAqKWNhcGlfaF90bXAhPWhfY2Fw aSkgew0KICAgIFB5X1hERUNSRUYoY2FwaV9oX3RtcCk7IH0NCiAgfSAgLyppZiAoY2FwaV9oX3Rt cCA9PSBOVUxMKSAuLi4gZWxzZSBvZiBoKi8NCiAgLyogRW5kIG9mIGNsZWFuaW5nIHZhcmlhYmxl IGggKi8NCiAgfSAvKmlmIChmMnB5X3N1Y2Nlc3MpIG9mIGlwcmludCovDQogIC8qIEVuZCBvZiBj bGVhbmluZyB2YXJpYWJsZSBpcHJpbnQgKi8NCiAgaWYoKFB5T2JqZWN0ICopY2FwaV9iX3RtcCE9 Yl9jYXBpKSB7DQogICAgUHlfWERFQ1JFRihjYXBpX2JfdG1wKTsgfQ0KICB9ICAvKmlmIChjYXBp X2JfdG1wID09IE5VTEwpIC4uLiBlbHNlIG9mIGIqLw0KICAvKiBFbmQgb2YgY2xlYW5pbmcgdmFy aWFibGUgYiAqLw0KICB9IC8qaWYgKGYycHlfc3VjY2Vzcykgb2YgaW5mbyovDQogIC8qIEVuZCBv ZiBjbGVhbmluZyB2YXJpYWJsZSBpbmZvICovDQogIH0gLyppZiAoZjJweV9zdWNjZXNzKSBvZiBt YXhmZXYqLw0KICAvKiBFbmQgb2YgY2xlYW5pbmcgdmFyaWFibGUgbWF4ZmV2ICovDQogIH0gLypp ZiAoZjJweV9zdWNjZXNzKSBvZiB0b2wqLw0KICAvKiBFbmQgb2YgY2xlYW5pbmcgdmFyaWFibGUg dG9sICovDQogIGlmKChQeU9iamVjdCAqKWNhcGlfZ21fdG1wIT1nbV9jYXBpKSB7DQogICAgUHlf WERFQ1JFRihjYXBpX2dtX3RtcCk7IH0NCiAgfSAgLyppZiAoY2FwaV9nbV90bXAgPT0gTlVMTCkg Li4uIGVsc2Ugb2YgZ20qLw0KICAvKiBFbmQgb2YgY2xlYW5pbmcgdmFyaWFibGUgZ20gKi8NCiAg fSAvKmlmIChmMnB5X3N1Y2Nlc3MpIG9mIG9iamYqLw0KICAvKiBFbmQgb2YgY2xlYW5pbmcgdmFy aWFibGUgb2JqZiAqLw0KICB9IC8qaWYgKGYycHlfc3VjY2Vzcykgb2YgbmZldiovDQogIC8qIEVu ZCBvZiBjbGVhbmluZyB2YXJpYWJsZSBuZmV2ICovDQovKmVuZCBvZiBjbGVhbnVwZnJvbXB5b2Jq Ki8NCiAgaWYgKGNhcGlfYnVpbGR2YWx1ZSA9PSBOVUxMKSB7DQovKnJvdXRkZWJ1Z2ZhaWx1cmUq Lw0KICB9IGVsc2Ugew0KLypyb3V0ZGVidWdsZWF2ZSovDQogIH0NCiAgQ0ZVTkNTTUVTUygiRnJl ZWluZyBtZW1vcnkuXG4iKTsNCi8qZnJlZW1lbSovDQojaWZkZWYgRjJQWV9SRVBPUlRfQVRFWElU DQpmMnB5X3N0b3BfY2xvY2soKTsNCiNlbmRpZg0KICByZXR1cm4gY2FwaV9idWlsZHZhbHVlOw0K fQ0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBlbmQgb2Ygc3FwICoqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqIHFwc3ViICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kc3Rh dGljIGNoYXIgZG9jX2YycHlfcm91dF9vcHRfc3FwX3Fwc3ViW10gPSAiXA0KRnVuY3Rpb24gc2ln bmF0dXJlOlxuXA0KICBxcHN1YihuLG1lcSxjb25mLGNub3JtLGIsZ20sYmRsLGJkdSxpbmZvLGRl bHRhLGNtLGgsbWFjdCx3YSxpd2EsW20sbGNub3JtLGxiLGxkZWwsbGgsbHdhLGxpd2FdKVxuXA0K UmVxdWlyZWQgYXJndW1lbnRzOlxuIg0KIiAgbiA6IGlucHV0IGludFxuIg0KIiAgbWVxIDogaW5w dXQgaW50XG4iDQoiICBjb25mIDogaW5wdXQgcmFuay0xIGFycmF5KCdkJykgd2l0aCBib3VuZHMg KG0pXG4iDQoiICBjbm9ybSA6IGlucHV0IHJhbmstMiBhcnJheSgnZCcpIHdpdGggYm91bmRzIChs Y25vcm0sbSlcbiINCiIgIGIgOiBpbnB1dCByYW5rLTIgYXJyYXkoJ2QnKSB3aXRoIGJvdW5kcyAo bGIsbGIpXG4iDQoiICBnbSA6IGlucHV0IHJhbmstMSBhcnJheSgnZCcpIHdpdGggYm91bmRzICgx KVxuIg0KIiAgYmRsIDogaW5wdXQgcmFuay0xIGFycmF5KCdkJykgd2l0aCBib3VuZHMgKDEpXG4i DQoiICBiZHUgOiBpbnB1dCByYW5rLTEgYXJyYXkoJ2QnKSB3aXRoIGJvdW5kcyAoMSlcbiINCiIg IGluZm8gOiBpbnB1dCBpbnRcbiINCiIgIGRlbHRhIDogaW5wdXQgcmFuay0xIGFycmF5KCdkJykg d2l0aCBib3VuZHMgKGxkZWwpXG4iDQoiICBjbSA6IGlucHV0IHJhbmstMSBhcnJheSgnZCcpIHdp dGggYm91bmRzIChtKVxuIg0KIiAgaCA6IGlucHV0IHJhbmstMiBhcnJheSgnZCcpIHdpdGggYm91 bmRzIChsaCxsaClcbiINCiIgIG1hY3QgOiBpbnB1dCBpbnRcbiINCiIgIHdhIDogaW5wdXQgcmFu ay0xIGFycmF5KCdkJykgd2l0aCBib3VuZHMgKGx3YSlcbiINCiIgIGl3YSA6IGlucHV0IHJhbmst MSBhcnJheSgnaScpIHdpdGggYm91bmRzIChsaXdhKVxuIg0KIk9wdGlvbmFsIGFyZ3VtZW50czpc biINCiIgIG0gOj0gbGVuKGNvbmYpIGlucHV0IGludFxuIg0KIiAgbGNub3JtIDo9IHNoYXBlKGNu b3JtLDApIGlucHV0IGludFxuIg0KIiAgbGIgOj0gc2hhcGUoYiwwKSBpbnB1dCBpbnRcbiINCiIg IGxkZWwgOj0gbGVuKGRlbHRhKSBpbnB1dCBpbnRcbiINCiIgIGxoIDo9IHNoYXBlKGgsMCkgaW5w dXQgaW50XG4iDQoiICBsd2EgOj0gbGVuKHdhKSBpbnB1dCBpbnRcbiINCiIgIGxpd2EgOj0gbGVu KGl3YSkgaW5wdXQgaW50IjsNCi8qIGV4dGVybiB2b2lkIEZfRlVOQyhxcHN1YixRUFNVQikoaW50 KixpbnQqLGludCosZG91YmxlKixkb3VibGUqLGludCosZG91YmxlKixpbnQqLGRvdWJsZSosZG91 YmxlKixkb3VibGUqLGludCosZG91YmxlKixpbnQqLGRvdWJsZSosZG91YmxlKixpbnQqLGludCos ZG91YmxlKixpbnQqLGludCosaW50Kik7ICovDQpzdGF0aWMgUHlPYmplY3QgKmYycHlfcm91dF9v cHRfc3FwX3Fwc3ViKGNvbnN0IFB5T2JqZWN0ICpjYXBpX3NlbGYsDQogICAgICAgICAgICAgICAg ICAgICAgICAgICBQeU9iamVjdCAqY2FwaV9hcmdzLA0KICAgICAgICAgICAgICAgICAgICAgICAg ICAgUHlPYmplY3QgKmNhcGlfa2V5d2RzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9p ZCAoKmYycHlfZnVuYykoaW50KixpbnQqLGludCosZG91YmxlKixkb3VibGUqLGludCosZG91Ymxl KixpbnQqLGRvdWJsZSosZG91YmxlKixkb3VibGUqLGludCosZG91YmxlKixpbnQqLGRvdWJsZSos ZG91YmxlKixpbnQqLGludCosZG91YmxlKixpbnQqLGludCosaW50KikpIHsNCiAgUHlPYmplY3Qg KiB2b2xhdGlsZSBjYXBpX2J1aWxkdmFsdWUgPSBOVUxMOw0KICB2b2xhdGlsZSBpbnQgZjJweV9z dWNjZXNzID0gMTsNCi8qZGVjbCovDQoNCiAgaW50IG4gPSAwOw0KICBQeU9iamVjdCAqbl9jYXBp ID0gUHlfTm9uZTsNCiAgaW50IG0gPSAwOw0KICBQeU9iamVjdCAqbV9jYXBpID0gUHlfTm9uZTsN CiAgaW50IG1lcSA9IDA7DQogIFB5T2JqZWN0ICptZXFfY2FwaSA9IFB5X05vbmU7DQogIGRvdWJs ZSAqY29uZiA9IE5VTEw7DQogIGludCBjb25mX0RpbXNbMV0gPSB7LTF9Ow0KICBjb25zdCBpbnQg Y29uZl9SYW5rID0gMTsNCiAgUHlBcnJheU9iamVjdCAqY2FwaV9jb25mX3RtcCA9IE5VTEw7DQog IGludCBjYXBpX2NvbmZfaW50ZW50ID0gMDsNCiAgUHlPYmplY3QgKmNvbmZfY2FwaSA9IFB5X05v bmU7DQogIGRvdWJsZSAqY25vcm0gPSBOVUxMOw0KICBpbnQgY25vcm1fRGltc1syXSA9IHstMSwg LTF9Ow0KICBjb25zdCBpbnQgY25vcm1fUmFuayA9IDI7DQogIFB5QXJyYXlPYmplY3QgKmNhcGlf Y25vcm1fdG1wID0gTlVMTDsNCiAgaW50IGNhcGlfY25vcm1faW50ZW50ID0gMDsNCiAgUHlPYmpl Y3QgKmNub3JtX2NhcGkgPSBQeV9Ob25lOw0KICBpbnQgbGNub3JtID0gMDsNCiAgUHlPYmplY3Qg Kmxjbm9ybV9jYXBpID0gUHlfTm9uZTsNCiAgZG91YmxlICpiID0gTlVMTDsNCiAgaW50IGJfRGlt c1syXSA9IHstMSwgLTF9Ow0KICBjb25zdCBpbnQgYl9SYW5rID0gMjsNCiAgUHlBcnJheU9iamVj dCAqY2FwaV9iX3RtcCA9IE5VTEw7DQogIGludCBjYXBpX2JfaW50ZW50ID0gMDsNCiAgUHlPYmpl Y3QgKmJfY2FwaSA9IFB5X05vbmU7DQogIGludCBsYiA9IDA7DQogIFB5T2JqZWN0ICpsYl9jYXBp ID0gUHlfTm9uZTsNCiAgZG91YmxlICpnbSA9IE5VTEw7DQogIGludCBnbV9EaW1zWzFdID0gey0x fTsNCiAgY29uc3QgaW50IGdtX1JhbmsgPSAxOw0KICBQeUFycmF5T2JqZWN0ICpjYXBpX2dtX3Rt cCA9IE5VTEw7DQogIGludCBjYXBpX2dtX2ludGVudCA9IDA7DQogIFB5T2JqZWN0ICpnbV9jYXBp ID0gUHlfTm9uZTsNCiAgZG91YmxlICpiZGwgPSBOVUxMOw0KICBpbnQgYmRsX0RpbXNbMV0gPSB7 LTF9Ow0KICBjb25zdCBpbnQgYmRsX1JhbmsgPSAxOw0KICBQeUFycmF5T2JqZWN0ICpjYXBpX2Jk bF90bXAgPSBOVUxMOw0KICBpbnQgY2FwaV9iZGxfaW50ZW50ID0gMDsNCiAgUHlPYmplY3QgKmJk bF9jYXBpID0gUHlfTm9uZTsNCiAgZG91YmxlICpiZHUgPSBOVUxMOw0KICBpbnQgYmR1X0RpbXNb MV0gPSB7LTF9Ow0KICBjb25zdCBpbnQgYmR1X1JhbmsgPSAxOw0KICBQeUFycmF5T2JqZWN0ICpj YXBpX2JkdV90bXAgPSBOVUxMOw0KICBpbnQgY2FwaV9iZHVfaW50ZW50ID0gMDsNCiAgUHlPYmpl Y3QgKmJkdV9jYXBpID0gUHlfTm9uZTsNCiAgaW50IGluZm8gPSAwOw0KICBQeU9iamVjdCAqaW5m b19jYXBpID0gUHlfTm9uZTsNCiAgZG91YmxlICpkZWx0YSA9IE5VTEw7DQogIGludCBkZWx0YV9E aW1zWzFdID0gey0xfTsNCiAgY29uc3QgaW50IGRlbHRhX1JhbmsgPSAxOw0KICBQeUFycmF5T2Jq ZWN0ICpjYXBpX2RlbHRhX3RtcCA9IE5VTEw7DQogIGludCBjYXBpX2RlbHRhX2ludGVudCA9IDA7 DQogIFB5T2JqZWN0ICpkZWx0YV9jYXBpID0gUHlfTm9uZTsNCiAgaW50IGxkZWwgPSAwOw0KICBQ eU9iamVjdCAqbGRlbF9jYXBpID0gUHlfTm9uZTsNCiAgZG91YmxlICpjbSA9IE5VTEw7DQogIGlu dCBjbV9EaW1zWzFdID0gey0xfTsNCiAgY29uc3QgaW50IGNtX1JhbmsgPSAxOw0KICBQeUFycmF5 T2JqZWN0ICpjYXBpX2NtX3RtcCA9IE5VTEw7DQogIGludCBjYXBpX2NtX2ludGVudCA9IDA7DQog IFB5T2JqZWN0ICpjbV9jYXBpID0gUHlfTm9uZTsNCiAgZG91YmxlICpoID0gTlVMTDsNCiAgaW50 IGhfRGltc1syXSA9IHstMSwgLTF9Ow0KICBjb25zdCBpbnQgaF9SYW5rID0gMjsNCiAgUHlBcnJh eU9iamVjdCAqY2FwaV9oX3RtcCA9IE5VTEw7DQogIGludCBjYXBpX2hfaW50ZW50ID0gMDsNCiAg UHlPYmplY3QgKmhfY2FwaSA9IFB5X05vbmU7DQogIGludCBsaCA9IDA7DQogIFB5T2JqZWN0ICps aF9jYXBpID0gUHlfTm9uZTsNCiAgaW50IG1hY3QgPSAwOw0KICBQeU9iamVjdCAqbWFjdF9jYXBp ID0gUHlfTm9uZTsNCiAgZG91YmxlICp3YSA9IE5VTEw7DQogIGludCB3YV9EaW1zWzFdID0gey0x fTsNCiAgY29uc3QgaW50IHdhX1JhbmsgPSAxOw0KICBQeUFycmF5T2JqZWN0ICpjYXBpX3dhX3Rt cCA9IE5VTEw7DQogIGludCBjYXBpX3dhX2ludGVudCA9IDA7DQogIFB5T2JqZWN0ICp3YV9jYXBp ID0gUHlfTm9uZTsNCiAgaW50IGx3YSA9IDA7DQogIFB5T2JqZWN0ICpsd2FfY2FwaSA9IFB5X05v bmU7DQogIGludCAqaXdhID0gTlVMTDsNCiAgaW50IGl3YV9EaW1zWzFdID0gey0xfTsNCiAgY29u c3QgaW50IGl3YV9SYW5rID0gMTsNCiAgUHlBcnJheU9iamVjdCAqY2FwaV9pd2FfdG1wID0gTlVM TDsNCiAgaW50IGNhcGlfaXdhX2ludGVudCA9IDA7DQogIFB5T2JqZWN0ICppd2FfY2FwaSA9IFB5 X05vbmU7DQogIGludCBsaXdhID0gMDsNCiAgUHlPYmplY3QgKmxpd2FfY2FwaSA9IFB5X05vbmU7 DQogIHN0YXRpYyBjaGFyICpjYXBpX2t3bGlzdFtdID0geyJuIiwibWVxIiwiY29uZiIsImNub3Jt IiwiYiIsImdtIiwiYmRsIiwiYmR1IiwiaW5mbyIsImRlbHRhIiwiY20iLCJoIiwibWFjdCIsIndh IiwiaXdhIiwibSIsImxjbm9ybSIsImxiIiwibGRlbCIsImxoIiwibHdhIiwibGl3YSIsTlVMTH07 DQoNCi8qcm91dGRlYnVnZW50ZXIqLw0KI2lmZGVmIEYyUFlfUkVQT1JUX0FURVhJVA0KZjJweV9z dGFydF9jbG9jaygpOw0KI2VuZGlmDQogIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRz KGNhcGlfYXJncyxjYXBpX2tleXdkcyxcDQogICAgIk9PT09PT09PT09PT09PT3xPT09PT09POm9w dF9zcXAucXBzdWIiLFwNCiAgICBjYXBpX2t3bGlzdCwmbl9jYXBpLCZtZXFfY2FwaSwmY29uZl9j YXBpLCZjbm9ybV9jYXBpLCZiX2NhcGksJmdtX2NhcGksJmJkbF9jYXBpLCZiZHVfY2FwaSwmaW5m b19jYXBpLCZkZWx0YV9jYXBpLCZjbV9jYXBpLCZoX2NhcGksJm1hY3RfY2FwaSwmd2FfY2FwaSwm aXdhX2NhcGksJm1fY2FwaSwmbGNub3JtX2NhcGksJmxiX2NhcGksJmxkZWxfY2FwaSwmbGhfY2Fw aSwmbHdhX2NhcGksJmxpd2FfY2FwaSkpDQogICAgcmV0dXJuIE5VTEw7DQovKmZyb21weW9iaiov DQogIC8qIFByb2Nlc3NpbmcgdmFyaWFibGUgaW5mbyAqLw0KICAgIGYycHlfc3VjY2VzcyA9IGlu dF9mcm9tX3B5b2JqKCZpbmZvLGluZm9fY2FwaSwib3B0X3NxcC5xcHN1YigpIDl0aCBhcmd1bWVu dCAoaW5mbykgY2FuJ3QgYmUgY29udmVydGVkIHRvIGludCIpOw0KICBpZiAoZjJweV9zdWNjZXNz KSB7DQogIC8qIFByb2Nlc3NpbmcgdmFyaWFibGUgbWFjdCAqLw0KICAgIGYycHlfc3VjY2VzcyA9 IGludF9mcm9tX3B5b2JqKCZtYWN0LG1hY3RfY2FwaSwib3B0X3NxcC5xcHN1YigpIDEzcmQgYXJn dW1lbnQgKG1hY3QpIGNhbid0IGJlIGNvbnZlcnRlZCB0byBpbnQiKTsNCiAgaWYgKGYycHlfc3Vj Y2Vzcykgew0KICAvKiBQcm9jZXNzaW5nIHZhcmlhYmxlIG1lcSAqLw0KICAgIGYycHlfc3VjY2Vz cyA9IGludF9mcm9tX3B5b2JqKCZtZXEsbWVxX2NhcGksIm9wdF9zcXAucXBzdWIoKSAybmQgYXJn dW1lbnQgKG1lcSkgY2FuJ3QgYmUgY29udmVydGVkIHRvIGludCIpOw0KICBpZiAoZjJweV9zdWNj ZXNzKSB7DQogIC8qIFByb2Nlc3NpbmcgdmFyaWFibGUgY29uZiAqLw0KICA7DQogIGNhcGlfY29u Zl9pbnRlbnQgfD0gRjJQWV9JTlRFTlRfSU47DQogIGNhcGlfY29uZl90bXAgPSBhcnJheV9mcm9t X3B5b2JqKFB5QXJyYXlfRE9VQkxFLGNvbmZfRGltcyxjb25mX1JhbmssY2FwaV9jb25mX2ludGVu dCxjb25mX2NhcGkpOw0KICBpZiAoY2FwaV9jb25mX3RtcCA9PSBOVUxMKSB7DQogICAgaWYgKCFQ eUVycl9PY2N1cnJlZCgpKQ0KICAgICAgUHlFcnJfU2V0U3RyaW5nKG9wdF9zcXBfZXJyb3IsImZh aWxlZCBpbiBjb252ZXJ0aW5nIDNyZCBhcmd1bWVudCBgY29uZicgb2Ygb3B0X3NxcC5xcHN1YiB0 byBDL0ZvcnRyYW4gYXJyYXkiICk7DQogIH0gZWxzZSB7DQogICAgY29uZiA9IChkb3VibGUgKiko Y2FwaV9jb25mX3RtcC0+ZGF0YSk7DQogIC8qIFByb2Nlc3NpbmcgdmFyaWFibGUgZGVsdGEgKi8N CiAgOw0KICBjYXBpX2RlbHRhX2ludGVudCB8PSBGMlBZX0lOVEVOVF9JTjsNCiAgY2FwaV9kZWx0 YV90bXAgPSBhcnJheV9mcm9tX3B5b2JqKFB5QXJyYXlfRE9VQkxFLGRlbHRhX0RpbXMsZGVsdGFf UmFuayxjYXBpX2RlbHRhX2ludGVudCxkZWx0YV9jYXBpKTsNCiAgaWYgKGNhcGlfZGVsdGFfdG1w ID09IE5VTEwpIHsNCiAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpDQogICAgICBQeUVycl9TZXRT dHJpbmcob3B0X3NxcF9lcnJvciwiZmFpbGVkIGluIGNvbnZlcnRpbmcgMTB0aCBhcmd1bWVudCBg ZGVsdGEnIG9mIG9wdF9zcXAucXBzdWIgdG8gQy9Gb3J0cmFuIGFycmF5IiApOw0KICB9IGVsc2Ug ew0KICAgIGRlbHRhID0gKGRvdWJsZSAqKShjYXBpX2RlbHRhX3RtcC0+ZGF0YSk7DQogIC8qIFBy b2Nlc3NpbmcgdmFyaWFibGUgZ20gKi8NCiAgZ21fRGltc1swXT0xOw0KICBjYXBpX2dtX2ludGVu dCB8PSBGMlBZX0lOVEVOVF9JTjsNCiAgY2FwaV9nbV90bXAgPSBhcnJheV9mcm9tX3B5b2JqKFB5 QXJyYXlfRE9VQkxFLGdtX0RpbXMsZ21fUmFuayxjYXBpX2dtX2ludGVudCxnbV9jYXBpKTsNCiAg aWYgKGNhcGlfZ21fdG1wID09IE5VTEwpIHsNCiAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpDQog ICAgICBQeUVycl9TZXRTdHJpbmcob3B0X3NxcF9lcnJvciwiZmFpbGVkIGluIGNvbnZlcnRpbmcg NnRoIGFyZ3VtZW50IGBnbScgb2Ygb3B0X3NxcC5xcHN1YiB0byBDL0ZvcnRyYW4gYXJyYXkiICk7 DQogIH0gZWxzZSB7DQogICAgZ20gPSAoZG91YmxlICopKGNhcGlfZ21fdG1wLT5kYXRhKTsNCiAg LyogUHJvY2Vzc2luZyB2YXJpYWJsZSB3YSAqLw0KICA7DQogIGNhcGlfd2FfaW50ZW50IHw9IEYy UFlfSU5URU5UX0lOOw0KICBjYXBpX3dhX3RtcCA9IGFycmF5X2Zyb21fcHlvYmooUHlBcnJheV9E T1VCTEUsd2FfRGltcyx3YV9SYW5rLGNhcGlfd2FfaW50ZW50LHdhX2NhcGkpOw0KICBpZiAoY2Fw aV93YV90bXAgPT0gTlVMTCkgew0KICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkNCiAgICAgIFB5 RXJyX1NldFN0cmluZyhvcHRfc3FwX2Vycm9yLCJmYWlsZWQgaW4gY29udmVydGluZyAxNHRoIGFy Z3VtZW50IGB3YScgb2Ygb3B0X3NxcC5xcHN1YiB0byBDL0ZvcnRyYW4gYXJyYXkiICk7DQogIH0g ZWxzZSB7DQogICAgd2EgPSAoZG91YmxlICopKGNhcGlfd2FfdG1wLT5kYXRhKTsNCiAgLyogUHJv Y2Vzc2luZyB2YXJpYWJsZSBiICovDQogIDsNCiAgY2FwaV9iX2ludGVudCB8PSBGMlBZX0lOVEVO VF9JTjsNCiAgY2FwaV9iX3RtcCA9IGFycmF5X2Zyb21fcHlvYmooUHlBcnJheV9ET1VCTEUsYl9E aW1zLGJfUmFuayxjYXBpX2JfaW50ZW50LGJfY2FwaSk7DQogIGlmIChjYXBpX2JfdG1wID09IE5V TEwpIHsNCiAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpDQogICAgICBQeUVycl9TZXRTdHJpbmco b3B0X3NxcF9lcnJvciwiZmFpbGVkIGluIGNvbnZlcnRpbmcgNXRoIGFyZ3VtZW50IGBiJyBvZiBv cHRfc3FwLnFwc3ViIHRvIEMvRm9ydHJhbiBhcnJheSIgKTsNCiAgfSBlbHNlIHsNCiAgICBiID0g KGRvdWJsZSAqKShjYXBpX2JfdG1wLT5kYXRhKTsNCiAgLyogUHJvY2Vzc2luZyB2YXJpYWJsZSBp d2EgKi8NCiAgOw0KICBjYXBpX2l3YV9pbnRlbnQgfD0gRjJQWV9JTlRFTlRfSU47DQogIGNhcGlf aXdhX3RtcCA9IGFycmF5X2Zyb21fcHlvYmooUHlBcnJheV9JTlQsaXdhX0RpbXMsaXdhX1Jhbmss Y2FwaV9pd2FfaW50ZW50LGl3YV9jYXBpKTsNCiAgaWYgKGNhcGlfaXdhX3RtcCA9PSBOVUxMKSB7 DQogICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKQ0KICAgICAgUHlFcnJfU2V0U3RyaW5nKG9wdF9z cXBfZXJyb3IsImZhaWxlZCBpbiBjb252ZXJ0aW5nIDE1dGggYXJndW1lbnQgYGl3YScgb2Ygb3B0 X3NxcC5xcHN1YiB0byBDL0ZvcnRyYW4gYXJyYXkiICk7DQogIH0gZWxzZSB7DQogICAgaXdhID0g KGludCAqKShjYXBpX2l3YV90bXAtPmRhdGEpOw0KICAvKiBQcm9jZXNzaW5nIHZhcmlhYmxlIGJk bCAqLw0KICBiZGxfRGltc1swXT0xOw0KICBjYXBpX2JkbF9pbnRlbnQgfD0gRjJQWV9JTlRFTlRf SU47DQogIGNhcGlfYmRsX3RtcCA9IGFycmF5X2Zyb21fcHlvYmooUHlBcnJheV9ET1VCTEUsYmRs X0RpbXMsYmRsX1JhbmssY2FwaV9iZGxfaW50ZW50LGJkbF9jYXBpKTsNCiAgaWYgKGNhcGlfYmRs X3RtcCA9PSBOVUxMKSB7DQogICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKQ0KICAgICAgUHlFcnJf U2V0U3RyaW5nKG9wdF9zcXBfZXJyb3IsImZhaWxlZCBpbiBjb252ZXJ0aW5nIDd0aCBhcmd1bWVu dCBgYmRsJyBvZiBvcHRfc3FwLnFwc3ViIHRvIEMvRm9ydHJhbiBhcnJheSIgKTsNCiAgfSBlbHNl IHsNCiAgICBiZGwgPSAoZG91YmxlICopKGNhcGlfYmRsX3RtcC0+ZGF0YSk7DQogIC8qIFByb2Nl c3NpbmcgdmFyaWFibGUgbiAqLw0KICAgIGYycHlfc3VjY2VzcyA9IGludF9mcm9tX3B5b2JqKCZu LG5fY2FwaSwib3B0X3NxcC5xcHN1YigpIDFzdCBhcmd1bWVudCAobikgY2FuJ3QgYmUgY29udmVy dGVkIHRvIGludCIpOw0KICBpZiAoZjJweV9zdWNjZXNzKSB7DQogIC8qIFByb2Nlc3NpbmcgdmFy aWFibGUgYmR1ICovDQogIGJkdV9EaW1zWzBdPTE7DQogIGNhcGlfYmR1X2ludGVudCB8PSBGMlBZ X0lOVEVOVF9JTjsNCiAgY2FwaV9iZHVfdG1wID0gYXJyYXlfZnJvbV9weW9iaihQeUFycmF5X0RP VUJMRSxiZHVfRGltcyxiZHVfUmFuayxjYXBpX2JkdV9pbnRlbnQsYmR1X2NhcGkpOw0KICBpZiAo Y2FwaV9iZHVfdG1wID09IE5VTEwpIHsNCiAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpDQogICAg ICBQeUVycl9TZXRTdHJpbmcob3B0X3NxcF9lcnJvciwiZmFpbGVkIGluIGNvbnZlcnRpbmcgOHRo IGFyZ3VtZW50IGBiZHUnIG9mIG9wdF9zcXAucXBzdWIgdG8gQy9Gb3J0cmFuIGFycmF5IiApOw0K ICB9IGVsc2Ugew0KICAgIGJkdSA9IChkb3VibGUgKikoY2FwaV9iZHVfdG1wLT5kYXRhKTsNCiAg LyogUHJvY2Vzc2luZyB2YXJpYWJsZSBoICovDQogIDsNCiAgY2FwaV9oX2ludGVudCB8PSBGMlBZ X0lOVEVOVF9JTjsNCiAgY2FwaV9oX3RtcCA9IGFycmF5X2Zyb21fcHlvYmooUHlBcnJheV9ET1VC TEUsaF9EaW1zLGhfUmFuayxjYXBpX2hfaW50ZW50LGhfY2FwaSk7DQogIGlmIChjYXBpX2hfdG1w ID09IE5VTEwpIHsNCiAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpDQogICAgICBQeUVycl9TZXRT dHJpbmcob3B0X3NxcF9lcnJvciwiZmFpbGVkIGluIGNvbnZlcnRpbmcgMTJuZCBhcmd1bWVudCBg aCcgb2Ygb3B0X3NxcC5xcHN1YiB0byBDL0ZvcnRyYW4gYXJyYXkiICk7DQogIH0gZWxzZSB7DQog ICAgaCA9IChkb3VibGUgKikoY2FwaV9oX3RtcC0+ZGF0YSk7DQogIC8qIFByb2Nlc3NpbmcgdmFy aWFibGUgbGIgKi8NCiAgaWYgKGxiX2NhcGkgPT0gUHlfTm9uZSkgbGIgPSBzaGFwZShiLDApOyBl bHNlDQogICAgZjJweV9zdWNjZXNzID0gaW50X2Zyb21fcHlvYmooJmxiLGxiX2NhcGksIm9wdF9z cXAucXBzdWIoKSAzcmQga2V5d29yZCAobGIpIGNhbid0IGJlIGNvbnZlcnRlZCB0byBpbnQiKTsN CiAgaWYgKGYycHlfc3VjY2Vzcykgew0KICBDSEVDS1NDQUxBUihzaGFwZShiLDApPT1sYiwic2hh cGUoYiwwKT09bGIiLCIzcmQga2V5d29yZCBsYiIsInFwc3ViOmxiPSVkIixsYikgew0KICAvKiBQ cm9jZXNzaW5nIHZhcmlhYmxlIGxkZWwgKi8NCiAgaWYgKGxkZWxfY2FwaSA9PSBQeV9Ob25lKSBs ZGVsID0gbGVuKGRlbHRhKTsgZWxzZQ0KICAgIGYycHlfc3VjY2VzcyA9IGludF9mcm9tX3B5b2Jq KCZsZGVsLGxkZWxfY2FwaSwib3B0X3NxcC5xcHN1YigpIDR0aCBrZXl3b3JkIChsZGVsKSBjYW4n dCBiZSBjb252ZXJ0ZWQgdG8gaW50Iik7DQogIGlmIChmMnB5X3N1Y2Nlc3MpIHsNCiAgQ0hFQ0tT Q0FMQVIobGVuKGRlbHRhKT49bGRlbCwibGVuKGRlbHRhKT49bGRlbCIsIjR0aCBrZXl3b3JkIGxk ZWwiLCJxcHN1YjpsZGVsPSVkIixsZGVsKSB7DQogIC8qIFByb2Nlc3NpbmcgdmFyaWFibGUgbSAq Lw0KICBpZiAobV9jYXBpID09IFB5X05vbmUpIG0gPSBsZW4oY29uZik7IGVsc2UNCiAgICBmMnB5 X3N1Y2Nlc3MgPSBpbnRfZnJvbV9weW9iaigmbSxtX2NhcGksIm9wdF9zcXAucXBzdWIoKSAxc3Qg a2V5d29yZCAobSkgY2FuJ3QgYmUgY29udmVydGVkIHRvIGludCIpOw0KICBpZiAoZjJweV9zdWNj ZXNzKSB7DQogIENIRUNLU0NBTEFSKGxlbihjb25mKT49bSwibGVuKGNvbmYpPj1tIiwiMXN0IGtl eXdvcmQgbSIsInFwc3ViOm09JWQiLG0pIHsNCiAgLyogUHJvY2Vzc2luZyB2YXJpYWJsZSBsaCAq Lw0KICBpZiAobGhfY2FwaSA9PSBQeV9Ob25lKSBsaCA9IHNoYXBlKGgsMCk7IGVsc2UNCiAgICBm MnB5X3N1Y2Nlc3MgPSBpbnRfZnJvbV9weW9iaigmbGgsbGhfY2FwaSwib3B0X3NxcC5xcHN1Yigp IDV0aCBrZXl3b3JkIChsaCkgY2FuJ3QgYmUgY29udmVydGVkIHRvIGludCIpOw0KICBpZiAoZjJw eV9zdWNjZXNzKSB7DQogIENIRUNLU0NBTEFSKHNoYXBlKGgsMCk9PWxoLCJzaGFwZShoLDApPT1s aCIsIjV0aCBrZXl3b3JkIGxoIiwicXBzdWI6bGg9JWQiLGxoKSB7DQogIC8qIFByb2Nlc3Npbmcg dmFyaWFibGUgbHdhICovDQogIGlmIChsd2FfY2FwaSA9PSBQeV9Ob25lKSBsd2EgPSBsZW4od2Ep OyBlbHNlDQogICAgZjJweV9zdWNjZXNzID0gaW50X2Zyb21fcHlvYmooJmx3YSxsd2FfY2FwaSwi b3B0X3NxcC5xcHN1YigpIDZ0aCBrZXl3b3JkIChsd2EpIGNhbid0IGJlIGNvbnZlcnRlZCB0byBp bnQiKTsNCiAgaWYgKGYycHlfc3VjY2Vzcykgew0KICBDSEVDS1NDQUxBUihsZW4od2EpPj1sd2Es Imxlbih3YSk+PWx3YSIsIjZ0aCBrZXl3b3JkIGx3YSIsInFwc3ViOmx3YT0lZCIsbHdhKSB7DQog IC8qIFByb2Nlc3NpbmcgdmFyaWFibGUgY25vcm0gKi8NCiAgY25vcm1fRGltc1sxXT1tOw0KICBj YXBpX2Nub3JtX2ludGVudCB8PSBGMlBZX0lOVEVOVF9JTjsNCiAgY2FwaV9jbm9ybV90bXAgPSBh cnJheV9mcm9tX3B5b2JqKFB5QXJyYXlfRE9VQkxFLGNub3JtX0RpbXMsY25vcm1fUmFuayxjYXBp X2Nub3JtX2ludGVudCxjbm9ybV9jYXBpKTsNCiAgaWYgKGNhcGlfY25vcm1fdG1wID09IE5VTEwp IHsNCiAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpDQogICAgICBQeUVycl9TZXRTdHJpbmcob3B0 X3NxcF9lcnJvciwiZmFpbGVkIGluIGNvbnZlcnRpbmcgNHRoIGFyZ3VtZW50IGBjbm9ybScgb2Yg b3B0X3NxcC5xcHN1YiB0byBDL0ZvcnRyYW4gYXJyYXkiICk7DQogIH0gZWxzZSB7DQogICAgY25v cm0gPSAoZG91YmxlICopKGNhcGlfY25vcm1fdG1wLT5kYXRhKTsNCiAgLyogUHJvY2Vzc2luZyB2 YXJpYWJsZSBsaXdhICovDQogIGlmIChsaXdhX2NhcGkgPT0gUHlfTm9uZSkgbGl3YSA9IGxlbihp d2EpOyBlbHNlDQogICAgZjJweV9zdWNjZXNzID0gaW50X2Zyb21fcHlvYmooJmxpd2EsbGl3YV9j YXBpLCJvcHRfc3FwLnFwc3ViKCkgN3RoIGtleXdvcmQgKGxpd2EpIGNhbid0IGJlIGNvbnZlcnRl ZCB0byBpbnQiKTsNCiAgaWYgKGYycHlfc3VjY2Vzcykgew0KICBDSEVDS1NDQUxBUihsZW4oaXdh KT49bGl3YSwibGVuKGl3YSk+PWxpd2EiLCI3dGgga2V5d29yZCBsaXdhIiwicXBzdWI6bGl3YT0l ZCIsbGl3YSkgew0KICAvKiBQcm9jZXNzaW5nIHZhcmlhYmxlIGNtICovDQogIGNtX0RpbXNbMF09 bTsNCiAgY2FwaV9jbV9pbnRlbnQgfD0gRjJQWV9JTlRFTlRfSU47DQogIGNhcGlfY21fdG1wID0g YXJyYXlfZnJvbV9weW9iaihQeUFycmF5X0RPVUJMRSxjbV9EaW1zLGNtX1JhbmssY2FwaV9jbV9p bnRlbnQsY21fY2FwaSk7DQogIGlmIChjYXBpX2NtX3RtcCA9PSBOVUxMKSB7DQogICAgaWYgKCFQ eUVycl9PY2N1cnJlZCgpKQ0KICAgICAgUHlFcnJfU2V0U3RyaW5nKG9wdF9zcXBfZXJyb3IsImZh aWxlZCBpbiBjb252ZXJ0aW5nIDExc3QgYXJndW1lbnQgYGNtJyBvZiBvcHRfc3FwLnFwc3ViIHRv IEMvRm9ydHJhbiBhcnJheSIgKTsNCiAgfSBlbHNlIHsNCiAgICBjbSA9IChkb3VibGUgKikoY2Fw aV9jbV90bXAtPmRhdGEpOw0KICAvKiBQcm9jZXNzaW5nIHZhcmlhYmxlIGxjbm9ybSAqLw0KICBp ZiAobGNub3JtX2NhcGkgPT0gUHlfTm9uZSkgbGNub3JtID0gc2hhcGUoY25vcm0sMCk7IGVsc2UN CiAgICBmMnB5X3N1Y2Nlc3MgPSBpbnRfZnJvbV9weW9iaigmbGNub3JtLGxjbm9ybV9jYXBpLCJv cHRfc3FwLnFwc3ViKCkgMm5kIGtleXdvcmQgKGxjbm9ybSkgY2FuJ3QgYmUgY29udmVydGVkIHRv IGludCIpOw0KICBpZiAoZjJweV9zdWNjZXNzKSB7DQogIENIRUNLU0NBTEFSKHNoYXBlKGNub3Jt LDApPT1sY25vcm0sInNoYXBlKGNub3JtLDApPT1sY25vcm0iLCIybmQga2V5d29yZCBsY25vcm0i LCJxcHN1YjpsY25vcm09JWQiLGxjbm9ybSkgew0KLyplbmQgb2YgZnJvbXB5b2JqKi8NCiNpZmRl ZiBGMlBZX1JFUE9SVF9BVEVYSVQNCmYycHlfc3RhcnRfY2FsbF9jbG9jaygpOw0KI2VuZGlmDQov KmNhbGxmb3J0cmFucm91dGluZSovDQogICAgICAgICgqZjJweV9mdW5jKSgmbiwmbSwmbWVxLGNv bmYsY25vcm0sJmxjbm9ybSxiLCZsYixnbSxiZGwsYmR1LCZpbmZvLGRlbHRhLCZsZGVsLGNtLGgs JmxoLCZtYWN0LHdhLCZsd2EsaXdhLCZsaXdhKTsNCiNpZmRlZiBGMlBZX1JFUE9SVF9BVEVYSVQN CmYycHlfc3RvcF9jYWxsX2Nsb2NrKCk7DQojZW5kaWYNCi8qZW5kIG9mIGNhbGxmb3J0cmFucm91 dGluZSovDQogICAgaWYgKGYycHlfc3VjY2Vzcykgew0KLypweW9iamZyb20qLw0KLyplbmQgb2Yg cHlvYmpmcm9tKi8NCiAgICBDRlVOQ1NNRVNTKCJCdWlsZGluZyByZXR1cm4gdmFsdWUuXG4iKTsN CiAgICBjYXBpX2J1aWxkdmFsdWUgPSBQeV9CdWlsZFZhbHVlKCIiKTsNCi8qY2xvc2VweW9iamZy b20qLw0KLyplbmQgb2YgY2xvc2VweW9iamZyb20qLw0KICAgIH0gLyppZiAoZjJweV9zdWNjZXNz KSBhZnRlciBjYWxsZm9ydHJhbnJvdXRpbmUqLw0KLypjbGVhbnVwZnJvbXB5b2JqKi8NCiAgfSAv KkNIRUNLU0NBTEFSKHNoYXBlKGNub3JtLDApPT1sY25vcm0pKi8NCiAgfSAvKmlmIChmMnB5X3N1 Y2Nlc3MpIG9mIGxjbm9ybSovDQogIC8qIEVuZCBvZiBjbGVhbmluZyB2YXJpYWJsZSBsY25vcm0g Ki8NCiAgaWYoKFB5T2JqZWN0ICopY2FwaV9jbV90bXAhPWNtX2NhcGkpIHsNCiAgICBQeV9YREVD UkVGKGNhcGlfY21fdG1wKTsgfQ0KICB9ICAvKmlmIChjYXBpX2NtX3RtcCA9PSBOVUxMKSAuLi4g ZWxzZSBvZiBjbSovDQogIC8qIEVuZCBvZiBjbGVhbmluZyB2YXJpYWJsZSBjbSAqLw0KICB9IC8q Q0hFQ0tTQ0FMQVIobGVuKGl3YSk+PWxpd2EpKi8NCiAgfSAvKmlmIChmMnB5X3N1Y2Nlc3MpIG9m IGxpd2EqLw0KICAvKiBFbmQgb2YgY2xlYW5pbmcgdmFyaWFibGUgbGl3YSAqLw0KICBpZigoUHlP YmplY3QgKiljYXBpX2Nub3JtX3RtcCE9Y25vcm1fY2FwaSkgew0KICAgIFB5X1hERUNSRUYoY2Fw aV9jbm9ybV90bXApOyB9DQogIH0gIC8qaWYgKGNhcGlfY25vcm1fdG1wID09IE5VTEwpIC4uLiBl bHNlIG9mIGNub3JtKi8NCiAgLyogRW5kIG9mIGNsZWFuaW5nIHZhcmlhYmxlIGNub3JtICovDQog IH0gLypDSEVDS1NDQUxBUihsZW4od2EpPj1sd2EpKi8NCiAgfSAvKmlmIChmMnB5X3N1Y2Nlc3Mp IG9mIGx3YSovDQogIC8qIEVuZCBvZiBjbGVhbmluZyB2YXJpYWJsZSBsd2EgKi8NCiAgfSAvKkNI RUNLU0NBTEFSKHNoYXBlKGgsMCk9PWxoKSovDQogIH0gLyppZiAoZjJweV9zdWNjZXNzKSBvZiBs aCovDQogIC8qIEVuZCBvZiBjbGVhbmluZyB2YXJpYWJsZSBsaCAqLw0KICB9IC8qQ0hFQ0tTQ0FM QVIobGVuKGNvbmYpPj1tKSovDQogIH0gLyppZiAoZjJweV9zdWNjZXNzKSBvZiBtKi8NCiAgLyog RW5kIG9mIGNsZWFuaW5nIHZhcmlhYmxlIG0gKi8NCiAgfSAvKkNIRUNLU0NBTEFSKGxlbihkZWx0 YSk+PWxkZWwpKi8NCiAgfSAvKmlmIChmMnB5X3N1Y2Nlc3MpIG9mIGxkZWwqLw0KICAvKiBFbmQg b2YgY2xlYW5pbmcgdmFyaWFibGUgbGRlbCAqLw0KICB9IC8qQ0hFQ0tTQ0FMQVIoc2hhcGUoYiww KT09bGIpKi8NCiAgfSAvKmlmIChmMnB5X3N1Y2Nlc3MpIG9mIGxiKi8NCiAgLyogRW5kIG9mIGNs ZWFuaW5nIHZhcmlhYmxlIGxiICovDQogIGlmKChQeU9iamVjdCAqKWNhcGlfaF90bXAhPWhfY2Fw aSkgew0KICAgIFB5X1hERUNSRUYoY2FwaV9oX3RtcCk7IH0NCiAgfSAgLyppZiAoY2FwaV9oX3Rt cCA9PSBOVUxMKSAuLi4gZWxzZSBvZiBoKi8NCiAgLyogRW5kIG9mIGNsZWFuaW5nIHZhcmlhYmxl IGggKi8NCiAgaWYoKFB5T2JqZWN0ICopY2FwaV9iZHVfdG1wIT1iZHVfY2FwaSkgew0KICAgIFB5 X1hERUNSRUYoY2FwaV9iZHVfdG1wKTsgfQ0KICB9ICAvKmlmIChjYXBpX2JkdV90bXAgPT0gTlVM TCkgLi4uIGVsc2Ugb2YgYmR1Ki8NCiAgLyogRW5kIG9mIGNsZWFuaW5nIHZhcmlhYmxlIGJkdSAq Lw0KICB9IC8qaWYgKGYycHlfc3VjY2Vzcykgb2YgbiovDQogIC8qIEVuZCBvZiBjbGVhbmluZyB2 YXJpYWJsZSBuICovDQogIGlmKChQeU9iamVjdCAqKWNhcGlfYmRsX3RtcCE9YmRsX2NhcGkpIHsN CiAgICBQeV9YREVDUkVGKGNhcGlfYmRsX3RtcCk7IH0NCiAgfSAgLyppZiAoY2FwaV9iZGxfdG1w ID09IE5VTEwpIC4uLiBlbHNlIG9mIGJkbCovDQogIC8qIEVuZCBvZiBjbGVhbmluZyB2YXJpYWJs ZSBiZGwgKi8NCiAgaWYoKFB5T2JqZWN0ICopY2FwaV9pd2FfdG1wIT1pd2FfY2FwaSkgew0KICAg IFB5X1hERUNSRUYoY2FwaV9pd2FfdG1wKTsgfQ0KICB9ICAvKmlmIChjYXBpX2l3YV90bXAgPT0g TlVMTCkgLi4uIGVsc2Ugb2YgaXdhKi8NCiAgLyogRW5kIG9mIGNsZWFuaW5nIHZhcmlhYmxlIGl3 YSAqLw0KICBpZigoUHlPYmplY3QgKiljYXBpX2JfdG1wIT1iX2NhcGkpIHsNCiAgICBQeV9YREVD UkVGKGNhcGlfYl90bXApOyB9DQogIH0gIC8qaWYgKGNhcGlfYl90bXAgPT0gTlVMTCkgLi4uIGVs c2Ugb2YgYiovDQogIC8qIEVuZCBvZiBjbGVhbmluZyB2YXJpYWJsZSBiICovDQogIGlmKChQeU9i amVjdCAqKWNhcGlfd2FfdG1wIT13YV9jYXBpKSB7DQogICAgUHlfWERFQ1JFRihjYXBpX3dhX3Rt cCk7IH0NCiAgfSAgLyppZiAoY2FwaV93YV90bXAgPT0gTlVMTCkgLi4uIGVsc2Ugb2Ygd2EqLw0K ICAvKiBFbmQgb2YgY2xlYW5pbmcgdmFyaWFibGUgd2EgKi8NCiAgaWYoKFB5T2JqZWN0ICopY2Fw aV9nbV90bXAhPWdtX2NhcGkpIHsNCiAgICBQeV9YREVDUkVGKGNhcGlfZ21fdG1wKTsgfQ0KICB9 ICAvKmlmIChjYXBpX2dtX3RtcCA9PSBOVUxMKSAuLi4gZWxzZSBvZiBnbSovDQogIC8qIEVuZCBv ZiBjbGVhbmluZyB2YXJpYWJsZSBnbSAqLw0KICBpZigoUHlPYmplY3QgKiljYXBpX2RlbHRhX3Rt cCE9ZGVsdGFfY2FwaSkgew0KICAgIFB5X1hERUNSRUYoY2FwaV9kZWx0YV90bXApOyB9DQogIH0g IC8qaWYgKGNhcGlfZGVsdGFfdG1wID09IE5VTEwpIC4uLiBlbHNlIG9mIGRlbHRhKi8NCiAgLyog RW5kIG9mIGNsZWFuaW5nIHZhcmlhYmxlIGRlbHRhICovDQogIGlmKChQeU9iamVjdCAqKWNhcGlf Y29uZl90bXAhPWNvbmZfY2FwaSkgew0KICAgIFB5X1hERUNSRUYoY2FwaV9jb25mX3RtcCk7IH0N CiAgfSAgLyppZiAoY2FwaV9jb25mX3RtcCA9PSBOVUxMKSAuLi4gZWxzZSBvZiBjb25mKi8NCiAg LyogRW5kIG9mIGNsZWFuaW5nIHZhcmlhYmxlIGNvbmYgKi8NCiAgfSAvKmlmIChmMnB5X3N1Y2Nl c3MpIG9mIG1lcSovDQogIC8qIEVuZCBvZiBjbGVhbmluZyB2YXJpYWJsZSBtZXEgKi8NCiAgfSAv KmlmIChmMnB5X3N1Y2Nlc3MpIG9mIG1hY3QqLw0KICAvKiBFbmQgb2YgY2xlYW5pbmcgdmFyaWFi bGUgbWFjdCAqLw0KICB9IC8qaWYgKGYycHlfc3VjY2Vzcykgb2YgaW5mbyovDQogIC8qIEVuZCBv ZiBjbGVhbmluZyB2YXJpYWJsZSBpbmZvICovDQovKmVuZCBvZiBjbGVhbnVwZnJvbXB5b2JqKi8N CiAgaWYgKGNhcGlfYnVpbGR2YWx1ZSA9PSBOVUxMKSB7DQovKnJvdXRkZWJ1Z2ZhaWx1cmUqLw0K ICB9IGVsc2Ugew0KLypyb3V0ZGVidWdsZWF2ZSovDQogIH0NCiAgQ0ZVTkNTTUVTUygiRnJlZWlu ZyBtZW1vcnkuXG4iKTsNCi8qZnJlZW1lbSovDQojaWZkZWYgRjJQWV9SRVBPUlRfQVRFWElUDQpm MnB5X3N0b3BfY2xvY2soKTsNCiNlbmRpZg0KICByZXR1cm4gY2FwaV9idWlsZHZhbHVlOw0KfQ0K LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIGVuZCBvZiBxcHN1YiAqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKi8NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqIHBueGZwICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kc3RhdGlj IGNoYXIgZG9jX2YycHlfcm91dF9vcHRfc3FwX3BueGZwW10gPSAiXA0KRnVuY3Rpb24gc2lnbmF0 dXJlOlxuXA0KICBwbnhmcChuLG0sYyxkLGJkbCxiZHUseCxrLGtlLGgsbHQsd2EsaXdhLGluZm8s W2ljLGloXSlcblwNClJlcXVpcmVkIGFyZ3VtZW50czpcbiINCiIgIG4gOiBpbnB1dCBpbnRcbiIN CiIgIG0gOiBpbnB1dCBpbnRcbiINCiIgIGMgOiBpbnB1dCByYW5rLTIgYXJyYXkoJ2QnKSB3aXRo IGJvdW5kcyAoaWMsMSlcbiINCiIgIGQgOiBpbnB1dCByYW5rLTEgYXJyYXkoJ2QnKSB3aXRoIGJv dW5kcyAoMSlcbiINCiIgIGJkbCA6IGlucHV0IHJhbmstMSBhcnJheSgnZCcpIHdpdGggYm91bmRz ICgxKVxuIg0KIiAgYmR1IDogaW5wdXQgcmFuay0xIGFycmF5KCdkJykgd2l0aCBib3VuZHMgKDEp XG4iDQoiICB4IDogaW5wdXQgcmFuay0xIGFycmF5KCdkJykgd2l0aCBib3VuZHMgKDEpXG4iDQoi ICBrIDogaW5wdXQgaW50XG4iDQoiICBrZSA6IGlucHV0IGludFxuIg0KIiAgaCA6IGlucHV0IHJh bmstMiBhcnJheSgnZCcpIHdpdGggYm91bmRzIChpaCwxKVxuIg0KIiAgbHQgOiBpbnB1dCByYW5r LTEgYXJyYXkoJ2knKSB3aXRoIGJvdW5kcyAoMSlcbiINCiIgIHdhIDogaW5wdXQgcmFuay0xIGFy cmF5KCdkJykgd2l0aCBib3VuZHMgKDEpXG4iDQoiICBpd2EgOiBpbnB1dCByYW5rLTEgYXJyYXko J2knKSB3aXRoIGJvdW5kcyAoMSlcbiINCiIgIGluZm8gOiBpbnB1dCBpbnRcbiINCiJPcHRpb25h bCBhcmd1bWVudHM6XG4iDQoiICBpYyA6PSBzaGFwZShjLDApIGlucHV0IGludFxuIg0KIiAgaWgg Oj0gc2hhcGUoaCwwKSBpbnB1dCBpbnQiOw0KLyogZXh0ZXJuIHZvaWQgRl9GVU5DKHBueGZwLFBO WEZQKShpbnQqLGludCosZG91YmxlKixpbnQqLGRvdWJsZSosZG91YmxlKixkb3VibGUqLGRvdWJs ZSosaW50KixpbnQqLGRvdWJsZSosaW50KixpbnQqLGRvdWJsZSosaW50KixpbnQqKTsgKi8NCnN0 YXRpYyBQeU9iamVjdCAqZjJweV9yb3V0X29wdF9zcXBfcG54ZnAoY29uc3QgUHlPYmplY3QgKmNh cGlfc2VsZiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpjYXBpX2FyZ3Ms DQogICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqY2FwaV9rZXl3ZHMsDQogICAg ICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqZjJweV9mdW5jKShpbnQqLGludCosZG91Ymxl KixpbnQqLGRvdWJsZSosZG91YmxlKixkb3VibGUqLGRvdWJsZSosaW50KixpbnQqLGRvdWJsZSos aW50KixpbnQqLGRvdWJsZSosaW50KixpbnQqKSkgew0KICBQeU9iamVjdCAqIHZvbGF0aWxlIGNh cGlfYnVpbGR2YWx1ZSA9IE5VTEw7DQogIHZvbGF0aWxlIGludCBmMnB5X3N1Y2Nlc3MgPSAxOw0K LypkZWNsKi8NCg0KICBpbnQgbiA9IDA7DQogIFB5T2JqZWN0ICpuX2NhcGkgPSBQeV9Ob25lOw0K ICBpbnQgbSA9IDA7DQogIFB5T2JqZWN0ICptX2NhcGkgPSBQeV9Ob25lOw0KICBkb3VibGUgKmMg PSBOVUxMOw0KICBpbnQgY19EaW1zWzJdID0gey0xLCAtMX07DQogIGNvbnN0IGludCBjX1Jhbmsg PSAyOw0KICBQeUFycmF5T2JqZWN0ICpjYXBpX2NfdG1wID0gTlVMTDsNCiAgaW50IGNhcGlfY19p bnRlbnQgPSAwOw0KICBQeU9iamVjdCAqY19jYXBpID0gUHlfTm9uZTsNCiAgaW50IGljID0gMDsN CiAgUHlPYmplY3QgKmljX2NhcGkgPSBQeV9Ob25lOw0KICBkb3VibGUgKmQgPSBOVUxMOw0KICBp bnQgZF9EaW1zWzFdID0gey0xfTsNCiAgY29uc3QgaW50IGRfUmFuayA9IDE7DQogIFB5QXJyYXlP YmplY3QgKmNhcGlfZF90bXAgPSBOVUxMOw0KICBpbnQgY2FwaV9kX2ludGVudCA9IDA7DQogIFB5 T2JqZWN0ICpkX2NhcGkgPSBQeV9Ob25lOw0KICBkb3VibGUgKmJkbCA9IE5VTEw7DQogIGludCBi ZGxfRGltc1sxXSA9IHstMX07DQogIGNvbnN0IGludCBiZGxfUmFuayA9IDE7DQogIFB5QXJyYXlP YmplY3QgKmNhcGlfYmRsX3RtcCA9IE5VTEw7DQogIGludCBjYXBpX2JkbF9pbnRlbnQgPSAwOw0K ICBQeU9iamVjdCAqYmRsX2NhcGkgPSBQeV9Ob25lOw0KICBkb3VibGUgKmJkdSA9IE5VTEw7DQog IGludCBiZHVfRGltc1sxXSA9IHstMX07DQogIGNvbnN0IGludCBiZHVfUmFuayA9IDE7DQogIFB5 QXJyYXlPYmplY3QgKmNhcGlfYmR1X3RtcCA9IE5VTEw7DQogIGludCBjYXBpX2JkdV9pbnRlbnQg PSAwOw0KICBQeU9iamVjdCAqYmR1X2NhcGkgPSBQeV9Ob25lOw0KICBkb3VibGUgKnggPSBOVUxM Ow0KICBpbnQgeF9EaW1zWzFdID0gey0xfTsNCiAgY29uc3QgaW50IHhfUmFuayA9IDE7DQogIFB5 QXJyYXlPYmplY3QgKmNhcGlfeF90bXAgPSBOVUxMOw0KICBpbnQgY2FwaV94X2ludGVudCA9IDA7 DQogIFB5T2JqZWN0ICp4X2NhcGkgPSBQeV9Ob25lOw0KICBpbnQgayA9IDA7DQogIFB5T2JqZWN0 ICprX2NhcGkgPSBQeV9Ob25lOw0KICBpbnQga2UgPSAwOw0KICBQeU9iamVjdCAqa2VfY2FwaSA9 IFB5X05vbmU7DQogIGRvdWJsZSAqaCA9IE5VTEw7DQogIGludCBoX0RpbXNbMl0gPSB7LTEsIC0x fTsNCiAgY29uc3QgaW50IGhfUmFuayA9IDI7DQogIFB5QXJyYXlPYmplY3QgKmNhcGlfaF90bXAg PSBOVUxMOw0KICBpbnQgY2FwaV9oX2ludGVudCA9IDA7DQogIFB5T2JqZWN0ICpoX2NhcGkgPSBQ eV9Ob25lOw0KICBpbnQgaWggPSAwOw0KICBQeU9iamVjdCAqaWhfY2FwaSA9IFB5X05vbmU7DQog IGludCAqbHQgPSBOVUxMOw0KICBpbnQgbHRfRGltc1sxXSA9IHstMX07DQogIGNvbnN0IGludCBs dF9SYW5rID0gMTsNCiAgUHlBcnJheU9iamVjdCAqY2FwaV9sdF90bXAgPSBOVUxMOw0KICBpbnQg Y2FwaV9sdF9pbnRlbnQgPSAwOw0KICBQeU9iamVjdCAqbHRfY2FwaSA9IFB5X05vbmU7DQogIGRv dWJsZSAqd2EgPSBOVUxMOw0KICBpbnQgd2FfRGltc1sxXSA9IHstMX07DQogIGNvbnN0IGludCB3 YV9SYW5rID0gMTsNCiAgUHlBcnJheU9iamVjdCAqY2FwaV93YV90bXAgPSBOVUxMOw0KICBpbnQg Y2FwaV93YV9pbnRlbnQgPSAwOw0KICBQeU9iamVjdCAqd2FfY2FwaSA9IFB5X05vbmU7DQogIGlu dCAqaXdhID0gTlVMTDsNCiAgaW50IGl3YV9EaW1zWzFdID0gey0xfTsNCiAgY29uc3QgaW50IGl3 YV9SYW5rID0gMTsNCiAgUHlBcnJheU9iamVjdCAqY2FwaV9pd2FfdG1wID0gTlVMTDsNCiAgaW50 IGNhcGlfaXdhX2ludGVudCA9IDA7DQogIFB5T2JqZWN0ICppd2FfY2FwaSA9IFB5X05vbmU7DQog IGludCBpbmZvID0gMDsNCiAgUHlPYmplY3QgKmluZm9fY2FwaSA9IFB5X05vbmU7DQogIHN0YXRp YyBjaGFyICpjYXBpX2t3bGlzdFtdID0geyJuIiwibSIsImMiLCJkIiwiYmRsIiwiYmR1IiwieCIs ImsiLCJrZSIsImgiLCJsdCIsIndhIiwiaXdhIiwiaW5mbyIsImljIiwiaWgiLE5VTEx9Ow0KDQov KnJvdXRkZWJ1Z2VudGVyKi8NCiNpZmRlZiBGMlBZX1JFUE9SVF9BVEVYSVQNCmYycHlfc3RhcnRf Y2xvY2soKTsNCiNlbmRpZg0KICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhjYXBp X2FyZ3MsY2FwaV9rZXl3ZHMsXA0KICAgICJPT09PT09PT09PT09PT3xPTzpvcHRfc3FwLnBueGZw IixcDQogICAgY2FwaV9rd2xpc3QsJm5fY2FwaSwmbV9jYXBpLCZjX2NhcGksJmRfY2FwaSwmYmRs X2NhcGksJmJkdV9jYXBpLCZ4X2NhcGksJmtfY2FwaSwma2VfY2FwaSwmaF9jYXBpLCZsdF9jYXBp LCZ3YV9jYXBpLCZpd2FfY2FwaSwmaW5mb19jYXBpLCZpY19jYXBpLCZpaF9jYXBpKSkNCiAgICBy ZXR1cm4gTlVMTDsNCi8qZnJvbXB5b2JqKi8NCiAgLyogUHJvY2Vzc2luZyB2YXJpYWJsZSB3YSAq Lw0KICB3YV9EaW1zWzBdPTE7DQogIGNhcGlfd2FfaW50ZW50IHw9IEYyUFlfSU5URU5UX0lOOw0K ICBjYXBpX3dhX3RtcCA9IGFycmF5X2Zyb21fcHlvYmooUHlBcnJheV9ET1VCTEUsd2FfRGltcyx3 YV9SYW5rLGNhcGlfd2FfaW50ZW50LHdhX2NhcGkpOw0KICBpZiAoY2FwaV93YV90bXAgPT0gTlVM TCkgew0KICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkNCiAgICAgIFB5RXJyX1NldFN0cmluZyhv cHRfc3FwX2Vycm9yLCJmYWlsZWQgaW4gY29udmVydGluZyAxMm5kIGFyZ3VtZW50IGB3YScgb2Yg b3B0X3NxcC5wbnhmcCB0byBDL0ZvcnRyYW4gYXJyYXkiICk7DQogIH0gZWxzZSB7DQogICAgd2Eg PSAoZG91YmxlICopKGNhcGlfd2FfdG1wLT5kYXRhKTsNCiAgLyogUHJvY2Vzc2luZyB2YXJpYWJs ZSBpd2EgKi8NCiAgaXdhX0RpbXNbMF09MTsNCiAgY2FwaV9pd2FfaW50ZW50IHw9IEYyUFlfSU5U RU5UX0lOOw0KICBjYXBpX2l3YV90bXAgPSBhcnJheV9mcm9tX3B5b2JqKFB5QXJyYXlfSU5ULGl3 YV9EaW1zLGl3YV9SYW5rLGNhcGlfaXdhX2ludGVudCxpd2FfY2FwaSk7DQogIGlmIChjYXBpX2l3 YV90bXAgPT0gTlVMTCkgew0KICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkNCiAgICAgIFB5RXJy X1NldFN0cmluZyhvcHRfc3FwX2Vycm9yLCJmYWlsZWQgaW4gY29udmVydGluZyAxM3JkIGFyZ3Vt ZW50IGBpd2EnIG9mIG9wdF9zcXAucG54ZnAgdG8gQy9Gb3J0cmFuIGFycmF5IiApOw0KICB9IGVs c2Ugew0KICAgIGl3YSA9IChpbnQgKikoY2FwaV9pd2FfdG1wLT5kYXRhKTsNCiAgLyogUHJvY2Vz c2luZyB2YXJpYWJsZSBpbmZvICovDQogICAgZjJweV9zdWNjZXNzID0gaW50X2Zyb21fcHlvYmoo JmluZm8saW5mb19jYXBpLCJvcHRfc3FwLnBueGZwKCkgMTR0aCBhcmd1bWVudCAoaW5mbykgY2Fu J3QgYmUgY29udmVydGVkIHRvIGludCIpOw0KICBpZiAoZjJweV9zdWNjZXNzKSB7DQogIC8qIFBy b2Nlc3NpbmcgdmFyaWFibGUgYyAqLw0KICBjX0RpbXNbMV09MTsNCiAgY2FwaV9jX2ludGVudCB8 PSBGMlBZX0lOVEVOVF9JTjsNCiAgY2FwaV9jX3RtcCA9IGFycmF5X2Zyb21fcHlvYmooUHlBcnJh eV9ET1VCTEUsY19EaW1zLGNfUmFuayxjYXBpX2NfaW50ZW50LGNfY2FwaSk7DQogIGlmIChjYXBp X2NfdG1wID09IE5VTEwpIHsNCiAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpDQogICAgICBQeUVy cl9TZXRTdHJpbmcob3B0X3NxcF9lcnJvciwiZmFpbGVkIGluIGNvbnZlcnRpbmcgM3JkIGFyZ3Vt ZW50IGBjJyBvZiBvcHRfc3FwLnBueGZwIHRvIEMvRm9ydHJhbiBhcnJheSIgKTsNCiAgfSBlbHNl IHsNCiAgICBjID0gKGRvdWJsZSAqKShjYXBpX2NfdG1wLT5kYXRhKTsNCiAgLyogUHJvY2Vzc2lu ZyB2YXJpYWJsZSBkICovDQogIGRfRGltc1swXT0xOw0KICBjYXBpX2RfaW50ZW50IHw9IEYyUFlf SU5URU5UX0lOOw0KICBjYXBpX2RfdG1wID0gYXJyYXlfZnJvbV9weW9iaihQeUFycmF5X0RPVUJM RSxkX0RpbXMsZF9SYW5rLGNhcGlfZF9pbnRlbnQsZF9jYXBpKTsNCiAgaWYgKGNhcGlfZF90bXAg PT0gTlVMTCkgew0KICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkNCiAgICAgIFB5RXJyX1NldFN0 cmluZyhvcHRfc3FwX2Vycm9yLCJmYWlsZWQgaW4gY29udmVydGluZyA0dGggYXJndW1lbnQgYGQn IG9mIG9wdF9zcXAucG54ZnAgdG8gQy9Gb3J0cmFuIGFycmF5IiApOw0KICB9IGVsc2Ugew0KICAg IGQgPSAoZG91YmxlICopKGNhcGlfZF90bXAtPmRhdGEpOw0KICAvKiBQcm9jZXNzaW5nIHZhcmlh YmxlIGtlICovDQogICAgZjJweV9zdWNjZXNzID0gaW50X2Zyb21fcHlvYmooJmtlLGtlX2NhcGks Im9wdF9zcXAucG54ZnAoKSA5dGggYXJndW1lbnQgKGtlKSBjYW4ndCBiZSBjb252ZXJ0ZWQgdG8g aW50Iik7DQogIGlmIChmMnB5X3N1Y2Nlc3MpIHsNCiAgLyogUHJvY2Vzc2luZyB2YXJpYWJsZSBi ZGwgKi8NCiAgYmRsX0RpbXNbMF09MTsNCiAgY2FwaV9iZGxfaW50ZW50IHw9IEYyUFlfSU5URU5U X0lOOw0KICBjYXBpX2JkbF90bXAgPSBhcnJheV9mcm9tX3B5b2JqKFB5QXJyYXlfRE9VQkxFLGJk bF9EaW1zLGJkbF9SYW5rLGNhcGlfYmRsX2ludGVudCxiZGxfY2FwaSk7DQogIGlmIChjYXBpX2Jk bF90bXAgPT0gTlVMTCkgew0KICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkNCiAgICAgIFB5RXJy X1NldFN0cmluZyhvcHRfc3FwX2Vycm9yLCJmYWlsZWQgaW4gY29udmVydGluZyA1dGggYXJndW1l bnQgYGJkbCcgb2Ygb3B0X3NxcC5wbnhmcCB0byBDL0ZvcnRyYW4gYXJyYXkiICk7DQogIH0gZWxz ZSB7DQogICAgYmRsID0gKGRvdWJsZSAqKShjYXBpX2JkbF90bXAtPmRhdGEpOw0KICAvKiBQcm9j ZXNzaW5nIHZhcmlhYmxlIGsgKi8NCiAgICBmMnB5X3N1Y2Nlc3MgPSBpbnRfZnJvbV9weW9iaigm ayxrX2NhcGksIm9wdF9zcXAucG54ZnAoKSA4dGggYXJndW1lbnQgKGspIGNhbid0IGJlIGNvbnZl cnRlZCB0byBpbnQiKTsNCiAgaWYgKGYycHlfc3VjY2Vzcykgew0KICAvKiBQcm9jZXNzaW5nIHZh cmlhYmxlIG0gKi8NCiAgICBmMnB5X3N1Y2Nlc3MgPSBpbnRfZnJvbV9weW9iaigmbSxtX2NhcGks Im9wdF9zcXAucG54ZnAoKSAybmQgYXJndW1lbnQgKG0pIGNhbid0IGJlIGNvbnZlcnRlZCB0byBp bnQiKTsNCiAgaWYgKGYycHlfc3VjY2Vzcykgew0KICAvKiBQcm9jZXNzaW5nIHZhcmlhYmxlIG4g Ki8NCiAgICBmMnB5X3N1Y2Nlc3MgPSBpbnRfZnJvbV9weW9iaigmbixuX2NhcGksIm9wdF9zcXAu cG54ZnAoKSAxc3QgYXJndW1lbnQgKG4pIGNhbid0IGJlIGNvbnZlcnRlZCB0byBpbnQiKTsNCiAg aWYgKGYycHlfc3VjY2Vzcykgew0KICAvKiBQcm9jZXNzaW5nIHZhcmlhYmxlIGJkdSAqLw0KICBi ZHVfRGltc1swXT0xOw0KICBjYXBpX2JkdV9pbnRlbnQgfD0gRjJQWV9JTlRFTlRfSU47DQogIGNh cGlfYmR1X3RtcCA9IGFycmF5X2Zyb21fcHlvYmooUHlBcnJheV9ET1VCTEUsYmR1X0RpbXMsYmR1 X1JhbmssY2FwaV9iZHVfaW50ZW50LGJkdV9jYXBpKTsNCiAgaWYgKGNhcGlfYmR1X3RtcCA9PSBO VUxMKSB7DQogICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKQ0KICAgICAgUHlFcnJfU2V0U3RyaW5n KG9wdF9zcXBfZXJyb3IsImZhaWxlZCBpbiBjb252ZXJ0aW5nIDZ0aCBhcmd1bWVudCBgYmR1JyBv ZiBvcHRfc3FwLnBueGZwIHRvIEMvRm9ydHJhbiBhcnJheSIgKTsNCiAgfSBlbHNlIHsNCiAgICBi ZHUgPSAoZG91YmxlICopKGNhcGlfYmR1X3RtcC0+ZGF0YSk7DQogIC8qIFByb2Nlc3NpbmcgdmFy aWFibGUgbHQgKi8NCiAgbHRfRGltc1swXT0xOw0KICBjYXBpX2x0X2ludGVudCB8PSBGMlBZX0lO VEVOVF9JTjsNCiAgY2FwaV9sdF90bXAgPSBhcnJheV9mcm9tX3B5b2JqKFB5QXJyYXlfSU5ULGx0 X0RpbXMsbHRfUmFuayxjYXBpX2x0X2ludGVudCxsdF9jYXBpKTsNCiAgaWYgKGNhcGlfbHRfdG1w ID09IE5VTEwpIHsNCiAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpDQogICAgICBQeUVycl9TZXRT dHJpbmcob3B0X3NxcF9lcnJvciwiZmFpbGVkIGluIGNvbnZlcnRpbmcgMTFzdCBhcmd1bWVudCBg bHQnIG9mIG9wdF9zcXAucG54ZnAgdG8gQy9Gb3J0cmFuIGFycmF5IiApOw0KICB9IGVsc2Ugew0K ICAgIGx0ID0gKGludCAqKShjYXBpX2x0X3RtcC0+ZGF0YSk7DQogIC8qIFByb2Nlc3NpbmcgdmFy aWFibGUgaCAqLw0KICBoX0RpbXNbMV09MTsNCiAgY2FwaV9oX2ludGVudCB8PSBGMlBZX0lOVEVO VF9JTjsNCiAgY2FwaV9oX3RtcCA9IGFycmF5X2Zyb21fcHlvYmooUHlBcnJheV9ET1VCTEUsaF9E aW1zLGhfUmFuayxjYXBpX2hfaW50ZW50LGhfY2FwaSk7DQogIGlmIChjYXBpX2hfdG1wID09IE5V TEwpIHsNCiAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpDQogICAgICBQeUVycl9TZXRTdHJpbmco b3B0X3NxcF9lcnJvciwiZmFpbGVkIGluIGNvbnZlcnRpbmcgMTB0aCBhcmd1bWVudCBgaCcgb2Yg b3B0X3NxcC5wbnhmcCB0byBDL0ZvcnRyYW4gYXJyYXkiICk7DQogIH0gZWxzZSB7DQogICAgaCA9 IChkb3VibGUgKikoY2FwaV9oX3RtcC0+ZGF0YSk7DQogIC8qIFByb2Nlc3NpbmcgdmFyaWFibGUg eCAqLw0KICB4X0RpbXNbMF09MTsNCiAgY2FwaV94X2ludGVudCB8PSBGMlBZX0lOVEVOVF9JTjsN CiAgY2FwaV94X3RtcCA9IGFycmF5X2Zyb21fcHlvYmooUHlBcnJheV9ET1VCTEUseF9EaW1zLHhf UmFuayxjYXBpX3hfaW50ZW50LHhfY2FwaSk7DQogIGlmIChjYXBpX3hfdG1wID09IE5VTEwpIHsN CiAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpDQogICAgICBQeUVycl9TZXRTdHJpbmcob3B0X3Nx cF9lcnJvciwiZmFpbGVkIGluIGNvbnZlcnRpbmcgN3RoIGFyZ3VtZW50IGB4JyBvZiBvcHRfc3Fw LnBueGZwIHRvIEMvRm9ydHJhbiBhcnJheSIgKTsNCiAgfSBlbHNlIHsNCiAgICB4ID0gKGRvdWJs ZSAqKShjYXBpX3hfdG1wLT5kYXRhKTsNCiAgLyogUHJvY2Vzc2luZyB2YXJpYWJsZSBpaCAqLw0K ICBpZiAoaWhfY2FwaSA9PSBQeV9Ob25lKSBpaCA9IHNoYXBlKGgsMCk7IGVsc2UNCiAgICBmMnB5 X3N1Y2Nlc3MgPSBpbnRfZnJvbV9weW9iaigmaWgsaWhfY2FwaSwib3B0X3NxcC5wbnhmcCgpIDJu ZCBrZXl3b3JkIChpaCkgY2FuJ3QgYmUgY29udmVydGVkIHRvIGludCIpOw0KICBpZiAoZjJweV9z dWNjZXNzKSB7DQogIENIRUNLU0NBTEFSKHNoYXBlKGgsMCk9PWloLCJzaGFwZShoLDApPT1paCIs IjJuZCBrZXl3b3JkIGloIiwicG54ZnA6aWg9JWQiLGloKSB7DQogIC8qIFByb2Nlc3NpbmcgdmFy aWFibGUgaWMgKi8NCiAgaWYgKGljX2NhcGkgPT0gUHlfTm9uZSkgaWMgPSBzaGFwZShjLDApOyBl bHNlDQogICAgZjJweV9zdWNjZXNzID0gaW50X2Zyb21fcHlvYmooJmljLGljX2NhcGksIm9wdF9z cXAucG54ZnAoKSAxc3Qga2V5d29yZCAoaWMpIGNhbid0IGJlIGNvbnZlcnRlZCB0byBpbnQiKTsN CiAgaWYgKGYycHlfc3VjY2Vzcykgew0KICBDSEVDS1NDQUxBUihzaGFwZShjLDApPT1pYywic2hh cGUoYywwKT09aWMiLCIxc3Qga2V5d29yZCBpYyIsInBueGZwOmljPSVkIixpYykgew0KLyplbmQg b2YgZnJvbXB5b2JqKi8NCiNpZmRlZiBGMlBZX1JFUE9SVF9BVEVYSVQNCmYycHlfc3RhcnRfY2Fs bF9jbG9jaygpOw0KI2VuZGlmDQovKmNhbGxmb3J0cmFucm91dGluZSovDQogICAgICAgICgqZjJw eV9mdW5jKSgmbiwmbSxjLCZpYyxkLGJkbCxiZHUseCwmaywma2UsaCwmaWgsbHQsd2EsaXdhLCZp bmZvKTsNCiNpZmRlZiBGMlBZX1JFUE9SVF9BVEVYSVQNCmYycHlfc3RvcF9jYWxsX2Nsb2NrKCk7 DQojZW5kaWYNCi8qZW5kIG9mIGNhbGxmb3J0cmFucm91dGluZSovDQogICAgaWYgKGYycHlfc3Vj Y2Vzcykgew0KLypweW9iamZyb20qLw0KLyplbmQgb2YgcHlvYmpmcm9tKi8NCiAgICBDRlVOQ1NN RVNTKCJCdWlsZGluZyByZXR1cm4gdmFsdWUuXG4iKTsNCiAgICBjYXBpX2J1aWxkdmFsdWUgPSBQ eV9CdWlsZFZhbHVlKCIiKTsNCi8qY2xvc2VweW9iamZyb20qLw0KLyplbmQgb2YgY2xvc2VweW9i amZyb20qLw0KICAgIH0gLyppZiAoZjJweV9zdWNjZXNzKSBhZnRlciBjYWxsZm9ydHJhbnJvdXRp bmUqLw0KLypjbGVhbnVwZnJvbXB5b2JqKi8NCiAgfSAvKkNIRUNLU0NBTEFSKHNoYXBlKGMsMCk9 PWljKSovDQogIH0gLyppZiAoZjJweV9zdWNjZXNzKSBvZiBpYyovDQogIC8qIEVuZCBvZiBjbGVh bmluZyB2YXJpYWJsZSBpYyAqLw0KICB9IC8qQ0hFQ0tTQ0FMQVIoc2hhcGUoaCwwKT09aWgpKi8N CiAgfSAvKmlmIChmMnB5X3N1Y2Nlc3MpIG9mIGloKi8NCiAgLyogRW5kIG9mIGNsZWFuaW5nIHZh cmlhYmxlIGloICovDQogIGlmKChQeU9iamVjdCAqKWNhcGlfeF90bXAhPXhfY2FwaSkgew0KICAg IFB5X1hERUNSRUYoY2FwaV94X3RtcCk7IH0NCiAgfSAgLyppZiAoY2FwaV94X3RtcCA9PSBOVUxM KSAuLi4gZWxzZSBvZiB4Ki8NCiAgLyogRW5kIG9mIGNsZWFuaW5nIHZhcmlhYmxlIHggKi8NCiAg aWYoKFB5T2JqZWN0ICopY2FwaV9oX3RtcCE9aF9jYXBpKSB7DQogICAgUHlfWERFQ1JFRihjYXBp X2hfdG1wKTsgfQ0KICB9ICAvKmlmIChjYXBpX2hfdG1wID09IE5VTEwpIC4uLiBlbHNlIG9mIGgq Lw0KICAvKiBFbmQgb2YgY2xlYW5pbmcgdmFyaWFibGUgaCAqLw0KICBpZigoUHlPYmplY3QgKilj YXBpX2x0X3RtcCE9bHRfY2FwaSkgew0KICAgIFB5X1hERUNSRUYoY2FwaV9sdF90bXApOyB9DQog IH0gIC8qaWYgKGNhcGlfbHRfdG1wID09IE5VTEwpIC4uLiBlbHNlIG9mIGx0Ki8NCiAgLyogRW5k IG9mIGNsZWFuaW5nIHZhcmlhYmxlIGx0ICovDQogIGlmKChQeU9iamVjdCAqKWNhcGlfYmR1X3Rt cCE9YmR1X2NhcGkpIHsNCiAgICBQeV9YREVDUkVGKGNhcGlfYmR1X3RtcCk7IH0NCiAgfSAgLypp ZiAoY2FwaV9iZHVfdG1wID09IE5VTEwpIC4uLiBlbHNlIG9mIGJkdSovDQogIC8qIEVuZCBvZiBj bGVhbmluZyB2YXJpYWJsZSBiZHUgKi8NCiAgfSAvKmlmIChmMnB5X3N1Y2Nlc3MpIG9mIG4qLw0K ICAvKiBFbmQgb2YgY2xlYW5pbmcgdmFyaWFibGUgbiAqLw0KICB9IC8qaWYgKGYycHlfc3VjY2Vz cykgb2YgbSovDQogIC8qIEVuZCBvZiBjbGVhbmluZyB2YXJpYWJsZSBtICovDQogIH0gLyppZiAo ZjJweV9zdWNjZXNzKSBvZiBrKi8NCiAgLyogRW5kIG9mIGNsZWFuaW5nIHZhcmlhYmxlIGsgKi8N CiAgaWYoKFB5T2JqZWN0ICopY2FwaV9iZGxfdG1wIT1iZGxfY2FwaSkgew0KICAgIFB5X1hERUNS RUYoY2FwaV9iZGxfdG1wKTsgfQ0KICB9ICAvKmlmIChjYXBpX2JkbF90bXAgPT0gTlVMTCkgLi4u IGVsc2Ugb2YgYmRsKi8NCiAgLyogRW5kIG9mIGNsZWFuaW5nIHZhcmlhYmxlIGJkbCAqLw0KICB9 IC8qaWYgKGYycHlfc3VjY2Vzcykgb2Yga2UqLw0KICAvKiBFbmQgb2YgY2xlYW5pbmcgdmFyaWFi bGUga2UgKi8NCiAgaWYoKFB5T2JqZWN0ICopY2FwaV9kX3RtcCE9ZF9jYXBpKSB7DQogICAgUHlf WERFQ1JFRihjYXBpX2RfdG1wKTsgfQ0KICB9ICAvKmlmIChjYXBpX2RfdG1wID09IE5VTEwpIC4u LiBlbHNlIG9mIGQqLw0KICAvKiBFbmQgb2YgY2xlYW5pbmcgdmFyaWFibGUgZCAqLw0KICBpZigo UHlPYmplY3QgKiljYXBpX2NfdG1wIT1jX2NhcGkpIHsNCiAgICBQeV9YREVDUkVGKGNhcGlfY190 bXApOyB9DQogIH0gIC8qaWYgKGNhcGlfY190bXAgPT0gTlVMTCkgLi4uIGVsc2Ugb2YgYyovDQog IC8qIEVuZCBvZiBjbGVhbmluZyB2YXJpYWJsZSBjICovDQogIH0gLyppZiAoZjJweV9zdWNjZXNz KSBvZiBpbmZvKi8NCiAgLyogRW5kIG9mIGNsZWFuaW5nIHZhcmlhYmxlIGluZm8gKi8NCiAgaWYo KFB5T2JqZWN0ICopY2FwaV9pd2FfdG1wIT1pd2FfY2FwaSkgew0KICAgIFB5X1hERUNSRUYoY2Fw aV9pd2FfdG1wKTsgfQ0KICB9ICAvKmlmIChjYXBpX2l3YV90bXAgPT0gTlVMTCkgLi4uIGVsc2Ug b2YgaXdhKi8NCiAgLyogRW5kIG9mIGNsZWFuaW5nIHZhcmlhYmxlIGl3YSAqLw0KICBpZigoUHlP YmplY3QgKiljYXBpX3dhX3RtcCE9d2FfY2FwaSkgew0KICAgIFB5X1hERUNSRUYoY2FwaV93YV90 bXApOyB9DQogIH0gIC8qaWYgKGNhcGlfd2FfdG1wID09IE5VTEwpIC4uLiBlbHNlIG9mIHdhKi8N CiAgLyogRW5kIG9mIGNsZWFuaW5nIHZhcmlhYmxlIHdhICovDQovKmVuZCBvZiBjbGVhbnVwZnJv bXB5b2JqKi8NCiAgaWYgKGNhcGlfYnVpbGR2YWx1ZSA9PSBOVUxMKSB7DQovKnJvdXRkZWJ1Z2Zh aWx1cmUqLw0KICB9IGVsc2Ugew0KLypyb3V0ZGVidWdsZWF2ZSovDQogIH0NCiAgQ0ZVTkNTTUVT UygiRnJlZWluZyBtZW1vcnkuXG4iKTsNCi8qZnJlZW1lbSovDQojaWZkZWYgRjJQWV9SRVBPUlRf QVRFWElUDQpmMnB5X3N0b3BfY2xvY2soKTsNCiNlbmRpZg0KICByZXR1cm4gY2FwaV9idWlsZHZh bHVlOw0KfQ0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIGVuZCBvZiBwbnhmcCAq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KLyoqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqIHBueHFwICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq Lw0Kc3RhdGljIGNoYXIgZG9jX2YycHlfcm91dF9vcHRfc3FwX3BueHFwW10gPSAiXA0KRnVuY3Rp b24gc2lnbmF0dXJlOlxuXA0KICBwbnhxcChuLGEsYixjLGQsYmRsLGJkdSx4LGssa2UsaCxsdCx3 YSxpd2EsaW5mbyxbaWEsaWMsaWhdKVxuXA0KUmVxdWlyZWQgYXJndW1lbnRzOlxuIg0KIiAgbiA6 IGlucHV0IGludFxuIg0KIiAgYSA6IGlucHV0IHJhbmstMiBhcnJheSgnZCcpIHdpdGggYm91bmRz IChpYSwxKVxuIg0KIiAgYiA6IGlucHV0IHJhbmstMSBhcnJheSgnZCcpIHdpdGggYm91bmRzICgx KVxuIg0KIiAgYyA6IGlucHV0IHJhbmstMiBhcnJheSgnZCcpIHdpdGggYm91bmRzIChpYywxKVxu Ig0KIiAgZCA6IGlucHV0IHJhbmstMSBhcnJheSgnZCcpIHdpdGggYm91bmRzICgxKVxuIg0KIiAg YmRsIDogaW5wdXQgcmFuay0xIGFycmF5KCdkJykgd2l0aCBib3VuZHMgKDEpXG4iDQoiICBiZHUg OiBpbnB1dCByYW5rLTEgYXJyYXkoJ2QnKSB3aXRoIGJvdW5kcyAoMSlcbiINCiIgIHggOiBpbnB1 dCByYW5rLTEgYXJyYXkoJ2QnKSB3aXRoIGJvdW5kcyAoMSlcbiINCiIgIGsgOiBpbnB1dCBpbnRc biINCiIgIGtlIDogaW5wdXQgaW50XG4iDQoiICBoIDogaW5wdXQgcmFuay0yIGFycmF5KCdkJykg d2l0aCBib3VuZHMgKGloLDEpXG4iDQoiICBsdCA6IGlucHV0IHJhbmstMSBhcnJheSgnaScpIHdp dGggYm91bmRzICgxKVxuIg0KIiAgd2EgOiBpbnB1dCByYW5rLTEgYXJyYXkoJ2QnKSB3aXRoIGJv dW5kcyAoMSlcbiINCiIgIGl3YSA6IGlucHV0IHJhbmstMSBhcnJheSgnaScpIHdpdGggYm91bmRz ICgxKVxuIg0KIiAgaW5mbyA6IGlucHV0IGludFxuIg0KIk9wdGlvbmFsIGFyZ3VtZW50czpcbiIN CiIgIGlhIDo9IHNoYXBlKGEsMCkgaW5wdXQgaW50XG4iDQoiICBpYyA6PSBzaGFwZShjLDApIGlu cHV0IGludFxuIg0KIiAgaWggOj0gc2hhcGUoaCwwKSBpbnB1dCBpbnQiOw0KLyogZXh0ZXJuIHZv aWQgRl9GVU5DKHBueHFwLFBOWFFQKShpbnQqLGRvdWJsZSosaW50Kixkb3VibGUqLGRvdWJsZSos aW50Kixkb3VibGUqLGRvdWJsZSosZG91YmxlKixkb3VibGUqLGludCosaW50Kixkb3VibGUqLGlu dCosaW50Kixkb3VibGUqLGludCosaW50Kik7ICovDQpzdGF0aWMgUHlPYmplY3QgKmYycHlfcm91 dF9vcHRfc3FwX3BueHFwKGNvbnN0IFB5T2JqZWN0ICpjYXBpX3NlbGYsDQogICAgICAgICAgICAg ICAgICAgICAgICAgICBQeU9iamVjdCAqY2FwaV9hcmdzLA0KICAgICAgICAgICAgICAgICAgICAg ICAgICAgUHlPYmplY3QgKmNhcGlfa2V5d2RzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAg dm9pZCAoKmYycHlfZnVuYykoaW50Kixkb3VibGUqLGludCosZG91YmxlKixkb3VibGUqLGludCos ZG91YmxlKixkb3VibGUqLGRvdWJsZSosZG91YmxlKixpbnQqLGludCosZG91YmxlKixpbnQqLGlu dCosZG91YmxlKixpbnQqLGludCopKSB7DQogIFB5T2JqZWN0ICogdm9sYXRpbGUgY2FwaV9idWls ZHZhbHVlID0gTlVMTDsNCiAgdm9sYXRpbGUgaW50IGYycHlfc3VjY2VzcyA9IDE7DQovKmRlY2wq Lw0KDQogIGludCBuID0gMDsNCiAgUHlPYmplY3QgKm5fY2FwaSA9IFB5X05vbmU7DQogIGRvdWJs ZSAqYSA9IE5VTEw7DQogIGludCBhX0RpbXNbMl0gPSB7LTEsIC0xfTsNCiAgY29uc3QgaW50IGFf UmFuayA9IDI7DQogIFB5QXJyYXlPYmplY3QgKmNhcGlfYV90bXAgPSBOVUxMOw0KICBpbnQgY2Fw aV9hX2ludGVudCA9IDA7DQogIFB5T2JqZWN0ICphX2NhcGkgPSBQeV9Ob25lOw0KICBpbnQgaWEg PSAwOw0KICBQeU9iamVjdCAqaWFfY2FwaSA9IFB5X05vbmU7DQogIGRvdWJsZSAqYiA9IE5VTEw7 DQogIGludCBiX0RpbXNbMV0gPSB7LTF9Ow0KICBjb25zdCBpbnQgYl9SYW5rID0gMTsNCiAgUHlB cnJheU9iamVjdCAqY2FwaV9iX3RtcCA9IE5VTEw7DQogIGludCBjYXBpX2JfaW50ZW50ID0gMDsN CiAgUHlPYmplY3QgKmJfY2FwaSA9IFB5X05vbmU7DQogIGRvdWJsZSAqYyA9IE5VTEw7DQogIGlu dCBjX0RpbXNbMl0gPSB7LTEsIC0xfTsNCiAgY29uc3QgaW50IGNfUmFuayA9IDI7DQogIFB5QXJy YXlPYmplY3QgKmNhcGlfY190bXAgPSBOVUxMOw0KICBpbnQgY2FwaV9jX2ludGVudCA9IDA7DQog IFB5T2JqZWN0ICpjX2NhcGkgPSBQeV9Ob25lOw0KICBpbnQgaWMgPSAwOw0KICBQeU9iamVjdCAq aWNfY2FwaSA9IFB5X05vbmU7DQogIGRvdWJsZSAqZCA9IE5VTEw7DQogIGludCBkX0RpbXNbMV0g PSB7LTF9Ow0KICBjb25zdCBpbnQgZF9SYW5rID0gMTsNCiAgUHlBcnJheU9iamVjdCAqY2FwaV9k X3RtcCA9IE5VTEw7DQogIGludCBjYXBpX2RfaW50ZW50ID0gMDsNCiAgUHlPYmplY3QgKmRfY2Fw aSA9IFB5X05vbmU7DQogIGRvdWJsZSAqYmRsID0gTlVMTDsNCiAgaW50IGJkbF9EaW1zWzFdID0g ey0xfTsNCiAgY29uc3QgaW50IGJkbF9SYW5rID0gMTsNCiAgUHlBcnJheU9iamVjdCAqY2FwaV9i ZGxfdG1wID0gTlVMTDsNCiAgaW50IGNhcGlfYmRsX2ludGVudCA9IDA7DQogIFB5T2JqZWN0ICpi ZGxfY2FwaSA9IFB5X05vbmU7DQogIGRvdWJsZSAqYmR1ID0gTlVMTDsNCiAgaW50IGJkdV9EaW1z WzFdID0gey0xfTsNCiAgY29uc3QgaW50IGJkdV9SYW5rID0gMTsNCiAgUHlBcnJheU9iamVjdCAq Y2FwaV9iZHVfdG1wID0gTlVMTDsNCiAgaW50IGNhcGlfYmR1X2ludGVudCA9IDA7DQogIFB5T2Jq ZWN0ICpiZHVfY2FwaSA9IFB5X05vbmU7DQogIGRvdWJsZSAqeCA9IE5VTEw7DQogIGludCB4X0Rp bXNbMV0gPSB7LTF9Ow0KICBjb25zdCBpbnQgeF9SYW5rID0gMTsNCiAgUHlBcnJheU9iamVjdCAq Y2FwaV94X3RtcCA9IE5VTEw7DQogIGludCBjYXBpX3hfaW50ZW50ID0gMDsNCiAgUHlPYmplY3Qg KnhfY2FwaSA9IFB5X05vbmU7DQogIGludCBrID0gMDsNCiAgUHlPYmplY3QgKmtfY2FwaSA9IFB5 X05vbmU7DQogIGludCBrZSA9IDA7DQogIFB5T2JqZWN0ICprZV9jYXBpID0gUHlfTm9uZTsNCiAg ZG91YmxlICpoID0gTlVMTDsNCiAgaW50IGhfRGltc1syXSA9IHstMSwgLTF9Ow0KICBjb25zdCBp bnQgaF9SYW5rID0gMjsNCiAgUHlBcnJheU9iamVjdCAqY2FwaV9oX3RtcCA9IE5VTEw7DQogIGlu dCBjYXBpX2hfaW50ZW50ID0gMDsNCiAgUHlPYmplY3QgKmhfY2FwaSA9IFB5X05vbmU7DQogIGlu dCBpaCA9IDA7DQogIFB5T2JqZWN0ICppaF9jYXBpID0gUHlfTm9uZTsNCiAgaW50ICpsdCA9IE5V TEw7DQogIGludCBsdF9EaW1zWzFdID0gey0xfTsNCiAgY29uc3QgaW50IGx0X1JhbmsgPSAxOw0K ICBQeUFycmF5T2JqZWN0ICpjYXBpX2x0X3RtcCA9IE5VTEw7DQogIGludCBjYXBpX2x0X2ludGVu dCA9IDA7DQogIFB5T2JqZWN0ICpsdF9jYXBpID0gUHlfTm9uZTsNCiAgZG91YmxlICp3YSA9IE5V TEw7DQogIGludCB3YV9EaW1zWzFdID0gey0xfTsNCiAgY29uc3QgaW50IHdhX1JhbmsgPSAxOw0K ICBQeUFycmF5T2JqZWN0ICpjYXBpX3dhX3RtcCA9IE5VTEw7DQogIGludCBjYXBpX3dhX2ludGVu dCA9IDA7DQogIFB5T2JqZWN0ICp3YV9jYXBpID0gUHlfTm9uZTsNCiAgaW50ICppd2EgPSBOVUxM Ow0KICBpbnQgaXdhX0RpbXNbMV0gPSB7LTF9Ow0KICBjb25zdCBpbnQgaXdhX1JhbmsgPSAxOw0K ICBQeUFycmF5T2JqZWN0ICpjYXBpX2l3YV90bXAgPSBOVUxMOw0KICBpbnQgY2FwaV9pd2FfaW50 ZW50ID0gMDsNCiAgUHlPYmplY3QgKml3YV9jYXBpID0gUHlfTm9uZTsNCiAgaW50IGluZm8gPSAw Ow0KICBQeU9iamVjdCAqaW5mb19jYXBpID0gUHlfTm9uZTsNCiAgc3RhdGljIGNoYXIgKmNhcGlf a3dsaXN0W10gPSB7Im4iLCJhIiwiYiIsImMiLCJkIiwiYmRsIiwiYmR1IiwieCIsImsiLCJrZSIs ImgiLCJsdCIsIndhIiwiaXdhIiwiaW5mbyIsImlhIiwiaWMiLCJpaCIsTlVMTH07DQoNCi8qcm91 dGRlYnVnZW50ZXIqLw0KI2lmZGVmIEYyUFlfUkVQT1JUX0FURVhJVA0KZjJweV9zdGFydF9jbG9j aygpOw0KI2VuZGlmDQogIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGNhcGlfYXJn cyxjYXBpX2tleXdkcyxcDQogICAgIk9PT09PT09PT09PT09PT3xPT086b3B0X3NxcC5wbnhxcCIs XA0KICAgIGNhcGlfa3dsaXN0LCZuX2NhcGksJmFfY2FwaSwmYl9jYXBpLCZjX2NhcGksJmRfY2Fw aSwmYmRsX2NhcGksJmJkdV9jYXBpLCZ4X2NhcGksJmtfY2FwaSwma2VfY2FwaSwmaF9jYXBpLCZs dF9jYXBpLCZ3YV9jYXBpLCZpd2FfY2FwaSwmaW5mb19jYXBpLCZpYV9jYXBpLCZpY19jYXBpLCZp aF9jYXBpKSkNCiAgICByZXR1cm4gTlVMTDsNCi8qZnJvbXB5b2JqKi8NCiAgLyogUHJvY2Vzc2lu ZyB2YXJpYWJsZSBpbmZvICovDQogICAgZjJweV9zdWNjZXNzID0gaW50X2Zyb21fcHlvYmooJmlu Zm8saW5mb19jYXBpLCJvcHRfc3FwLnBueHFwKCkgMTV0aCBhcmd1bWVudCAoaW5mbykgY2FuJ3Qg YmUgY29udmVydGVkIHRvIGludCIpOw0KICBpZiAoZjJweV9zdWNjZXNzKSB7DQogIC8qIFByb2Nl c3NpbmcgdmFyaWFibGUgaXdhICovDQogIGl3YV9EaW1zWzBdPTE7DQogIGNhcGlfaXdhX2ludGVu dCB8PSBGMlBZX0lOVEVOVF9JTjsNCiAgY2FwaV9pd2FfdG1wID0gYXJyYXlfZnJvbV9weW9iaihQ eUFycmF5X0lOVCxpd2FfRGltcyxpd2FfUmFuayxjYXBpX2l3YV9pbnRlbnQsaXdhX2NhcGkpOw0K ICBpZiAoY2FwaV9pd2FfdG1wID09IE5VTEwpIHsNCiAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkp DQogICAgICBQeUVycl9TZXRTdHJpbmcob3B0X3NxcF9lcnJvciwiZmFpbGVkIGluIGNvbnZlcnRp bmcgMTR0aCBhcmd1bWVudCBgaXdhJyBvZiBvcHRfc3FwLnBueHFwIHRvIEMvRm9ydHJhbiBhcnJh eSIgKTsNCiAgfSBlbHNlIHsNCiAgICBpd2EgPSAoaW50ICopKGNhcGlfaXdhX3RtcC0+ZGF0YSk7 DQogIC8qIFByb2Nlc3NpbmcgdmFyaWFibGUgYSAqLw0KICBhX0RpbXNbMV09MTsNCiAgY2FwaV9h X2ludGVudCB8PSBGMlBZX0lOVEVOVF9JTjsNCiAgY2FwaV9hX3RtcCA9IGFycmF5X2Zyb21fcHlv YmooUHlBcnJheV9ET1VCTEUsYV9EaW1zLGFfUmFuayxjYXBpX2FfaW50ZW50LGFfY2FwaSk7DQog IGlmIChjYXBpX2FfdG1wID09IE5VTEwpIHsNCiAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpDQog ICAgICBQeUVycl9TZXRTdHJpbmcob3B0X3NxcF9lcnJvciwiZmFpbGVkIGluIGNvbnZlcnRpbmcg Mm5kIGFyZ3VtZW50IGBhJyBvZiBvcHRfc3FwLnBueHFwIHRvIEMvRm9ydHJhbiBhcnJheSIgKTsN CiAgfSBlbHNlIHsNCiAgICBhID0gKGRvdWJsZSAqKShjYXBpX2FfdG1wLT5kYXRhKTsNCiAgLyog UHJvY2Vzc2luZyB2YXJpYWJsZSBjICovDQogIGNfRGltc1sxXT0xOw0KICBjYXBpX2NfaW50ZW50 IHw9IEYyUFlfSU5URU5UX0lOOw0KICBjYXBpX2NfdG1wID0gYXJyYXlfZnJvbV9weW9iaihQeUFy cmF5X0RPVUJMRSxjX0RpbXMsY19SYW5rLGNhcGlfY19pbnRlbnQsY19jYXBpKTsNCiAgaWYgKGNh cGlfY190bXAgPT0gTlVMTCkgew0KICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkNCiAgICAgIFB5 RXJyX1NldFN0cmluZyhvcHRfc3FwX2Vycm9yLCJmYWlsZWQgaW4gY29udmVydGluZyA0dGggYXJn dW1lbnQgYGMnIG9mIG9wdF9zcXAucG54cXAgdG8gQy9Gb3J0cmFuIGFycmF5IiApOw0KICB9IGVs c2Ugew0KICAgIGMgPSAoZG91YmxlICopKGNhcGlfY190bXAtPmRhdGEpOw0KICAvKiBQcm9jZXNz aW5nIHZhcmlhYmxlIGIgKi8NCiAgYl9EaW1zWzBdPTE7DQogIGNhcGlfYl9pbnRlbnQgfD0gRjJQ WV9JTlRFTlRfSU47DQogIGNhcGlfYl90bXAgPSBhcnJheV9mcm9tX3B5b2JqKFB5QXJyYXlfRE9V QkxFLGJfRGltcyxiX1JhbmssY2FwaV9iX2ludGVudCxiX2NhcGkpOw0KICBpZiAoY2FwaV9iX3Rt cCA9PSBOVUxMKSB7DQogICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKQ0KICAgICAgUHlFcnJfU2V0 U3RyaW5nKG9wdF9zcXBfZXJyb3IsImZhaWxlZCBpbiBjb252ZXJ0aW5nIDNyZCBhcmd1bWVudCBg Yicgb2Ygb3B0X3NxcC5wbnhxcCB0byBDL0ZvcnRyYW4gYXJyYXkiICk7DQogIH0gZWxzZSB7DQog ICAgYiA9IChkb3VibGUgKikoY2FwaV9iX3RtcC0+ZGF0YSk7DQogIC8qIFByb2Nlc3NpbmcgdmFy aWFibGUgZCAqLw0KICBkX0RpbXNbMF09MTsNCiAgY2FwaV9kX2ludGVudCB8PSBGMlBZX0lOVEVO VF9JTjsNCiAgY2FwaV9kX3RtcCA9IGFycmF5X2Zyb21fcHlvYmooUHlBcnJheV9ET1VCTEUsZF9E aW1zLGRfUmFuayxjYXBpX2RfaW50ZW50LGRfY2FwaSk7DQogIGlmIChjYXBpX2RfdG1wID09IE5V TEwpIHsNCiAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpDQogICAgICBQeUVycl9TZXRTdHJpbmco b3B0X3NxcF9lcnJvciwiZmFpbGVkIGluIGNvbnZlcnRpbmcgNXRoIGFyZ3VtZW50IGBkJyBvZiBv cHRfc3FwLnBueHFwIHRvIEMvRm9ydHJhbiBhcnJheSIgKTsNCiAgfSBlbHNlIHsNCiAgICBkID0g KGRvdWJsZSAqKShjYXBpX2RfdG1wLT5kYXRhKTsNCiAgLyogUHJvY2Vzc2luZyB2YXJpYWJsZSBr ZSAqLw0KICAgIGYycHlfc3VjY2VzcyA9IGludF9mcm9tX3B5b2JqKCZrZSxrZV9jYXBpLCJvcHRf c3FwLnBueHFwKCkgMTB0aCBhcmd1bWVudCAoa2UpIGNhbid0IGJlIGNvbnZlcnRlZCB0byBpbnQi KTsNCiAgaWYgKGYycHlfc3VjY2Vzcykgew0KICAvKiBQcm9jZXNzaW5nIHZhcmlhYmxlIGJkbCAq Lw0KICBiZGxfRGltc1swXT0xOw0KICBjYXBpX2JkbF9pbnRlbnQgfD0gRjJQWV9JTlRFTlRfSU47 DQogIGNhcGlfYmRsX3RtcCA9IGFycmF5X2Zyb21fcHlvYmooUHlBcnJheV9ET1VCTEUsYmRsX0Rp bXMsYmRsX1JhbmssY2FwaV9iZGxfaW50ZW50LGJkbF9jYXBpKTsNCiAgaWYgKGNhcGlfYmRsX3Rt cCA9PSBOVUxMKSB7DQogICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKQ0KICAgICAgUHlFcnJfU2V0 U3RyaW5nKG9wdF9zcXBfZXJyb3IsImZhaWxlZCBpbiBjb252ZXJ0aW5nIDZ0aCBhcmd1bWVudCBg YmRsJyBvZiBvcHRfc3FwLnBueHFwIHRvIEMvRm9ydHJhbiBhcnJheSIgKTsNCiAgfSBlbHNlIHsN CiAgICBiZGwgPSAoZG91YmxlICopKGNhcGlfYmRsX3RtcC0+ZGF0YSk7DQogIC8qIFByb2Nlc3Np bmcgdmFyaWFibGUgayAqLw0KICAgIGYycHlfc3VjY2VzcyA9IGludF9mcm9tX3B5b2JqKCZrLGtf Y2FwaSwib3B0X3NxcC5wbnhxcCgpIDl0aCBhcmd1bWVudCAoaykgY2FuJ3QgYmUgY29udmVydGVk IHRvIGludCIpOw0KICBpZiAoZjJweV9zdWNjZXNzKSB7DQogIC8qIFByb2Nlc3NpbmcgdmFyaWFi bGUgbiAqLw0KICAgIGYycHlfc3VjY2VzcyA9IGludF9mcm9tX3B5b2JqKCZuLG5fY2FwaSwib3B0 X3NxcC5wbnhxcCgpIDFzdCBhcmd1bWVudCAobikgY2FuJ3QgYmUgY29udmVydGVkIHRvIGludCIp Ow0KICBpZiAoZjJweV9zdWNjZXNzKSB7DQogIC8qIFByb2Nlc3NpbmcgdmFyaWFibGUgYmR1ICov DQogIGJkdV9EaW1zWzBdPTE7DQogIGNhcGlfYmR1X2ludGVudCB8PSBGMlBZX0lOVEVOVF9JTjsN CiAgY2FwaV9iZHVfdG1wID0gYXJyYXlfZnJvbV9weW9iaihQeUFycmF5X0RPVUJMRSxiZHVfRGlt cyxiZHVfUmFuayxjYXBpX2JkdV9pbnRlbnQsYmR1X2NhcGkpOw0KICBpZiAoY2FwaV9iZHVfdG1w ID09IE5VTEwpIHsNCiAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpDQogICAgICBQeUVycl9TZXRT dHJpbmcob3B0X3NxcF9lcnJvciwiZmFpbGVkIGluIGNvbnZlcnRpbmcgN3RoIGFyZ3VtZW50IGBi ZHUnIG9mIG9wdF9zcXAucG54cXAgdG8gQy9Gb3J0cmFuIGFycmF5IiApOw0KICB9IGVsc2Ugew0K ICAgIGJkdSA9IChkb3VibGUgKikoY2FwaV9iZHVfdG1wLT5kYXRhKTsNCiAgLyogUHJvY2Vzc2lu ZyB2YXJpYWJsZSBsdCAqLw0KICBsdF9EaW1zWzBdPTE7DQogIGNhcGlfbHRfaW50ZW50IHw9IEYy UFlfSU5URU5UX0lOOw0KICBjYXBpX2x0X3RtcCA9IGFycmF5X2Zyb21fcHlvYmooUHlBcnJheV9J TlQsbHRfRGltcyxsdF9SYW5rLGNhcGlfbHRfaW50ZW50LGx0X2NhcGkpOw0KICBpZiAoY2FwaV9s dF90bXAgPT0gTlVMTCkgew0KICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkNCiAgICAgIFB5RXJy X1NldFN0cmluZyhvcHRfc3FwX2Vycm9yLCJmYWlsZWQgaW4gY29udmVydGluZyAxMm5kIGFyZ3Vt ZW50IGBsdCcgb2Ygb3B0X3NxcC5wbnhxcCB0byBDL0ZvcnRyYW4gYXJyYXkiICk7DQogIH0gZWxz ZSB7DQogICAgbHQgPSAoaW50ICopKGNhcGlfbHRfdG1wLT5kYXRhKTsNCiAgLyogUHJvY2Vzc2lu ZyB2YXJpYWJsZSBoICovDQogIGhfRGltc1sxXT0xOw0KICBjYXBpX2hfaW50ZW50IHw9IEYyUFlf SU5URU5UX0lOOw0KICBjYXBpX2hfdG1wID0gYXJyYXlfZnJvbV9weW9iaihQeUFycmF5X0RPVUJM RSxoX0RpbXMsaF9SYW5rLGNhcGlfaF9pbnRlbnQsaF9jYXBpKTsNCiAgaWYgKGNhcGlfaF90bXAg PT0gTlVMTCkgew0KICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkNCiAgICAgIFB5RXJyX1NldFN0 cmluZyhvcHRfc3FwX2Vycm9yLCJmYWlsZWQgaW4gY29udmVydGluZyAxMXN0IGFyZ3VtZW50IGBo JyBvZiBvcHRfc3FwLnBueHFwIHRvIEMvRm9ydHJhbiBhcnJheSIgKTsNCiAgfSBlbHNlIHsNCiAg ICBoID0gKGRvdWJsZSAqKShjYXBpX2hfdG1wLT5kYXRhKTsNCiAgLyogUHJvY2Vzc2luZyB2YXJp YWJsZSB4ICovDQogIHhfRGltc1swXT0xOw0KICBjYXBpX3hfaW50ZW50IHw9IEYyUFlfSU5URU5U X0lOOw0KICBjYXBpX3hfdG1wID0gYXJyYXlfZnJvbV9weW9iaihQeUFycmF5X0RPVUJMRSx4X0Rp bXMseF9SYW5rLGNhcGlfeF9pbnRlbnQseF9jYXBpKTsNCiAgaWYgKGNhcGlfeF90bXAgPT0gTlVM TCkgew0KICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkNCiAgICAgIFB5RXJyX1NldFN0cmluZyhv cHRfc3FwX2Vycm9yLCJmYWlsZWQgaW4gY29udmVydGluZyA4dGggYXJndW1lbnQgYHgnIG9mIG9w dF9zcXAucG54cXAgdG8gQy9Gb3J0cmFuIGFycmF5IiApOw0KICB9IGVsc2Ugew0KICAgIHggPSAo ZG91YmxlICopKGNhcGlfeF90bXAtPmRhdGEpOw0KICAvKiBQcm9jZXNzaW5nIHZhcmlhYmxlIHdh ICovDQogIHdhX0RpbXNbMF09MTsNCiAgY2FwaV93YV9pbnRlbnQgfD0gRjJQWV9JTlRFTlRfSU47 DQogIGNhcGlfd2FfdG1wID0gYXJyYXlfZnJvbV9weW9iaihQeUFycmF5X0RPVUJMRSx3YV9EaW1z LHdhX1JhbmssY2FwaV93YV9pbnRlbnQsd2FfY2FwaSk7DQogIGlmIChjYXBpX3dhX3RtcCA9PSBO VUxMKSB7DQogICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKQ0KICAgICAgUHlFcnJfU2V0U3RyaW5n KG9wdF9zcXBfZXJyb3IsImZhaWxlZCBpbiBjb252ZXJ0aW5nIDEzcmQgYXJndW1lbnQgYHdhJyBv ZiBvcHRfc3FwLnBueHFwIHRvIEMvRm9ydHJhbiBhcnJheSIgKTsNCiAgfSBlbHNlIHsNCiAgICB3 YSA9IChkb3VibGUgKikoY2FwaV93YV90bXAtPmRhdGEpOw0KICAvKiBQcm9jZXNzaW5nIHZhcmlh YmxlIGloICovDQogIGlmIChpaF9jYXBpID09IFB5X05vbmUpIGloID0gc2hhcGUoaCwwKTsgZWxz ZQ0KICAgIGYycHlfc3VjY2VzcyA9IGludF9mcm9tX3B5b2JqKCZpaCxpaF9jYXBpLCJvcHRfc3Fw LnBueHFwKCkgM3JkIGtleXdvcmQgKGloKSBjYW4ndCBiZSBjb252ZXJ0ZWQgdG8gaW50Iik7DQog IGlmIChmMnB5X3N1Y2Nlc3MpIHsNCiAgQ0hFQ0tTQ0FMQVIoc2hhcGUoaCwwKT09aWgsInNoYXBl KGgsMCk9PWloIiwiM3JkIGtleXdvcmQgaWgiLCJwbnhxcDppaD0lZCIsaWgpIHsNCiAgLyogUHJv Y2Vzc2luZyB2YXJpYWJsZSBpYSAqLw0KICBpZiAoaWFfY2FwaSA9PSBQeV9Ob25lKSBpYSA9IHNo YXBlKGEsMCk7IGVsc2UNCiAgICBmMnB5X3N1Y2Nlc3MgPSBpbnRfZnJvbV9weW9iaigmaWEsaWFf Y2FwaSwib3B0X3NxcC5wbnhxcCgpIDFzdCBrZXl3b3JkIChpYSkgY2FuJ3QgYmUgY29udmVydGVk IHRvIGludCIpOw0KICBpZiAoZjJweV9zdWNjZXNzKSB7DQogIENIRUNLU0NBTEFSKHNoYXBlKGEs MCk9PWlhLCJzaGFwZShhLDApPT1pYSIsIjFzdCBrZXl3b3JkIGlhIiwicG54cXA6aWE9JWQiLGlh KSB7DQogIC8qIFByb2Nlc3NpbmcgdmFyaWFibGUgaWMgKi8NCiAgaWYgKGljX2NhcGkgPT0gUHlf Tm9uZSkgaWMgPSBzaGFwZShjLDApOyBlbHNlDQogICAgZjJweV9zdWNjZXNzID0gaW50X2Zyb21f cHlvYmooJmljLGljX2NhcGksIm9wdF9zcXAucG54cXAoKSAybmQga2V5d29yZCAoaWMpIGNhbid0 IGJlIGNvbnZlcnRlZCB0byBpbnQiKTsNCiAgaWYgKGYycHlfc3VjY2Vzcykgew0KICBDSEVDS1ND QUxBUihzaGFwZShjLDApPT1pYywic2hhcGUoYywwKT09aWMiLCIybmQga2V5d29yZCBpYyIsInBu eHFwOmljPSVkIixpYykgew0KLyplbmQgb2YgZnJvbXB5b2JqKi8NCiNpZmRlZiBGMlBZX1JFUE9S VF9BVEVYSVQNCmYycHlfc3RhcnRfY2FsbF9jbG9jaygpOw0KI2VuZGlmDQovKmNhbGxmb3J0cmFu cm91dGluZSovDQogICAgICAgICgqZjJweV9mdW5jKSgmbixhLCZpYSxiLGMsJmljLGQsYmRsLGJk dSx4LCZrLCZrZSxoLCZpaCxsdCx3YSxpd2EsJmluZm8pOw0KI2lmZGVmIEYyUFlfUkVQT1JUX0FU RVhJVA0KZjJweV9zdG9wX2NhbGxfY2xvY2soKTsNCiNlbmRpZg0KLyplbmQgb2YgY2FsbGZvcnRy YW5yb3V0aW5lKi8NCiAgICBpZiAoZjJweV9zdWNjZXNzKSB7DQovKnB5b2JqZnJvbSovDQovKmVu ZCBvZiBweW9iamZyb20qLw0KICAgIENGVU5DU01FU1MoIkJ1aWxkaW5nIHJldHVybiB2YWx1ZS5c biIpOw0KICAgIGNhcGlfYnVpbGR2YWx1ZSA9IFB5X0J1aWxkVmFsdWUoIiIpOw0KLypjbG9zZXB5 b2JqZnJvbSovDQovKmVuZCBvZiBjbG9zZXB5b2JqZnJvbSovDQogICAgfSAvKmlmIChmMnB5X3N1 Y2Nlc3MpIGFmdGVyIGNhbGxmb3J0cmFucm91dGluZSovDQovKmNsZWFudXBmcm9tcHlvYmoqLw0K ICB9IC8qQ0hFQ0tTQ0FMQVIoc2hhcGUoYywwKT09aWMpKi8NCiAgfSAvKmlmIChmMnB5X3N1Y2Nl c3MpIG9mIGljKi8NCiAgLyogRW5kIG9mIGNsZWFuaW5nIHZhcmlhYmxlIGljICovDQogIH0gLypD SEVDS1NDQUxBUihzaGFwZShhLDApPT1pYSkqLw0KICB9IC8qaWYgKGYycHlfc3VjY2Vzcykgb2Yg aWEqLw0KICAvKiBFbmQgb2YgY2xlYW5pbmcgdmFyaWFibGUgaWEgKi8NCiAgfSAvKkNIRUNLU0NB TEFSKHNoYXBlKGgsMCk9PWloKSovDQogIH0gLyppZiAoZjJweV9zdWNjZXNzKSBvZiBpaCovDQog IC8qIEVuZCBvZiBjbGVhbmluZyB2YXJpYWJsZSBpaCAqLw0KICBpZigoUHlPYmplY3QgKiljYXBp X3dhX3RtcCE9d2FfY2FwaSkgew0KICAgIFB5X1hERUNSRUYoY2FwaV93YV90bXApOyB9DQogIH0g IC8qaWYgKGNhcGlfd2FfdG1wID09IE5VTEwpIC4uLiBlbHNlIG9mIHdhKi8NCiAgLyogRW5kIG9m IGNsZWFuaW5nIHZhcmlhYmxlIHdhICovDQogIGlmKChQeU9iamVjdCAqKWNhcGlfeF90bXAhPXhf Y2FwaSkgew0KICAgIFB5X1hERUNSRUYoY2FwaV94X3RtcCk7IH0NCiAgfSAgLyppZiAoY2FwaV94 X3RtcCA9PSBOVUxMKSAuLi4gZWxzZSBvZiB4Ki8NCiAgLyogRW5kIG9mIGNsZWFuaW5nIHZhcmlh YmxlIHggKi8NCiAgaWYoKFB5T2JqZWN0ICopY2FwaV9oX3RtcCE9aF9jYXBpKSB7DQogICAgUHlf WERFQ1JFRihjYXBpX2hfdG1wKTsgfQ0KICB9ICAvKmlmIChjYXBpX2hfdG1wID09IE5VTEwpIC4u LiBlbHNlIG9mIGgqLw0KICAvKiBFbmQgb2YgY2xlYW5pbmcgdmFyaWFibGUgaCAqLw0KICBpZigo UHlPYmplY3QgKiljYXBpX2x0X3RtcCE9bHRfY2FwaSkgew0KICAgIFB5X1hERUNSRUYoY2FwaV9s dF90bXApOyB9DQogIH0gIC8qaWYgKGNhcGlfbHRfdG1wID09IE5VTEwpIC4uLiBlbHNlIG9mIGx0 Ki8NCiAgLyogRW5kIG9mIGNsZWFuaW5nIHZhcmlhYmxlIGx0ICovDQogIGlmKChQeU9iamVjdCAq KWNhcGlfYmR1X3RtcCE9YmR1X2NhcGkpIHsNCiAgICBQeV9YREVDUkVGKGNhcGlfYmR1X3RtcCk7 IH0NCiAgfSAgLyppZiAoY2FwaV9iZHVfdG1wID09IE5VTEwpIC4uLiBlbHNlIG9mIGJkdSovDQog IC8qIEVuZCBvZiBjbGVhbmluZyB2YXJpYWJsZSBiZHUgKi8NCiAgfSAvKmlmIChmMnB5X3N1Y2Nl c3MpIG9mIG4qLw0KICAvKiBFbmQgb2YgY2xlYW5pbmcgdmFyaWFibGUgbiAqLw0KICB9IC8qaWYg KGYycHlfc3VjY2Vzcykgb2YgayovDQogIC8qIEVuZCBvZiBjbGVhbmluZyB2YXJpYWJsZSBrICov DQogIGlmKChQeU9iamVjdCAqKWNhcGlfYmRsX3RtcCE9YmRsX2NhcGkpIHsNCiAgICBQeV9YREVD UkVGKGNhcGlfYmRsX3RtcCk7IH0NCiAgfSAgLyppZiAoY2FwaV9iZGxfdG1wID09IE5VTEwpIC4u LiBlbHNlIG9mIGJkbCovDQogIC8qIEVuZCBvZiBjbGVhbmluZyB2YXJpYWJsZSBiZGwgKi8NCiAg fSAvKmlmIChmMnB5X3N1Y2Nlc3MpIG9mIGtlKi8NCiAgLyogRW5kIG9mIGNsZWFuaW5nIHZhcmlh YmxlIGtlICovDQogIGlmKChQeU9iamVjdCAqKWNhcGlfZF90bXAhPWRfY2FwaSkgew0KICAgIFB5 X1hERUNSRUYoY2FwaV9kX3RtcCk7IH0NCiAgfSAgLyppZiAoY2FwaV9kX3RtcCA9PSBOVUxMKSAu Li4gZWxzZSBvZiBkKi8NCiAgLyogRW5kIG9mIGNsZWFuaW5nIHZhcmlhYmxlIGQgKi8NCiAgaWYo KFB5T2JqZWN0ICopY2FwaV9iX3RtcCE9Yl9jYXBpKSB7DQogICAgUHlfWERFQ1JFRihjYXBpX2Jf dG1wKTsgfQ0KICB9ICAvKmlmIChjYXBpX2JfdG1wID09IE5VTEwpIC4uLiBlbHNlIG9mIGIqLw0K ICAvKiBFbmQgb2YgY2xlYW5pbmcgdmFyaWFibGUgYiAqLw0KICBpZigoUHlPYmplY3QgKiljYXBp X2NfdG1wIT1jX2NhcGkpIHsNCiAgICBQeV9YREVDUkVGKGNhcGlfY190bXApOyB9DQogIH0gIC8q aWYgKGNhcGlfY190bXAgPT0gTlVMTCkgLi4uIGVsc2Ugb2YgYyovDQogIC8qIEVuZCBvZiBjbGVh bmluZyB2YXJpYWJsZSBjICovDQogIGlmKChQeU9iamVjdCAqKWNhcGlfYV90bXAhPWFfY2FwaSkg ew0KICAgIFB5X1hERUNSRUYoY2FwaV9hX3RtcCk7IH0NCiAgfSAgLyppZiAoY2FwaV9hX3RtcCA9 PSBOVUxMKSAuLi4gZWxzZSBvZiBhKi8NCiAgLyogRW5kIG9mIGNsZWFuaW5nIHZhcmlhYmxlIGEg Ki8NCiAgaWYoKFB5T2JqZWN0ICopY2FwaV9pd2FfdG1wIT1pd2FfY2FwaSkgew0KICAgIFB5X1hE RUNSRUYoY2FwaV9pd2FfdG1wKTsgfQ0KICB9ICAvKmlmIChjYXBpX2l3YV90bXAgPT0gTlVMTCkg Li4uIGVsc2Ugb2YgaXdhKi8NCiAgLyogRW5kIG9mIGNsZWFuaW5nIHZhcmlhYmxlIGl3YSAqLw0K ICB9IC8qaWYgKGYycHlfc3VjY2Vzcykgb2YgaW5mbyovDQogIC8qIEVuZCBvZiBjbGVhbmluZyB2 YXJpYWJsZSBpbmZvICovDQovKmVuZCBvZiBjbGVhbnVwZnJvbXB5b2JqKi8NCiAgaWYgKGNhcGlf YnVpbGR2YWx1ZSA9PSBOVUxMKSB7DQovKnJvdXRkZWJ1Z2ZhaWx1cmUqLw0KICB9IGVsc2Ugew0K Lypyb3V0ZGVidWdsZWF2ZSovDQogIH0NCiAgQ0ZVTkNTTUVTUygiRnJlZWluZyBtZW1vcnkuXG4i KTsNCi8qZnJlZW1lbSovDQojaWZkZWYgRjJQWV9SRVBPUlRfQVRFWElUDQpmMnB5X3N0b3BfY2xv Y2soKTsNCiNlbmRpZg0KICByZXR1cm4gY2FwaV9idWlsZHZhbHVlOw0KfQ0KLyoqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqIGVuZCBvZiBwbnhxcCAqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKi8NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIGlkYW1h eCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnN0YXRpYyBjaGFyIGRvY19m MnB5X3JvdXRfb3B0X3NxcF9pZGFtYXhbXSA9ICJcDQpGdW5jdGlvbiBzaWduYXR1cmU6XG5cDQog IGlkYW1heCA9IGlkYW1heChuLGR4LGluY3gpXG5cDQpSZXF1aXJlZCBhcmd1bWVudHM6XG4iDQoi ICBuIDogaW5wdXQgaW50XG4iDQoiICBkeCA6IGlucHV0IHJhbmstMSBhcnJheSgnZCcpIHdpdGgg Ym91bmRzICgxKVxuIg0KIiAgaW5jeCA6IGlucHV0IGludFxuIg0KIlJldHVybiBvYmplY3RzOlxu Ig0KIiAgaWRhbWF4IDogaW50IjsNCi8qIGV4dGVybiB2b2lkIEZfV1JBUFBFREZVTkMoaWRhbWF4 LElEQU1BWCkoaW50KixpbnQqLGRvdWJsZSosaW50Kik7ICovDQpzdGF0aWMgUHlPYmplY3QgKmYy cHlfcm91dF9vcHRfc3FwX2lkYW1heChjb25zdCBQeU9iamVjdCAqY2FwaV9zZWxmLA0KICAgICAg ICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmNhcGlfYXJncywNCiAgICAgICAgICAgICAg ICAgICAgICAgICAgIFB5T2JqZWN0ICpjYXBpX2tleXdkcywNCiAgICAgICAgICAgICAgICAgICAg ICAgICAgIHZvaWQgKCpmMnB5X2Z1bmMpKGludCosaW50Kixkb3VibGUqLGludCopKSB7DQogIFB5 T2JqZWN0ICogdm9sYXRpbGUgY2FwaV9idWlsZHZhbHVlID0gTlVMTDsNCiAgdm9sYXRpbGUgaW50 IGYycHlfc3VjY2VzcyA9IDE7DQovKmRlY2wqLw0KDQogIGludCBpZGFtYXggPSAwOw0KICBpbnQg biA9IDA7DQogIFB5T2JqZWN0ICpuX2NhcGkgPSBQeV9Ob25lOw0KICBkb3VibGUgKmR4ID0gTlVM TDsNCiAgaW50IGR4X0RpbXNbMV0gPSB7LTF9Ow0KICBjb25zdCBpbnQgZHhfUmFuayA9IDE7DQog IFB5QXJyYXlPYmplY3QgKmNhcGlfZHhfdG1wID0gTlVMTDsNCiAgaW50IGNhcGlfZHhfaW50ZW50 ID0gMDsNCiAgUHlPYmplY3QgKmR4X2NhcGkgPSBQeV9Ob25lOw0KICBpbnQgaW5jeCA9IDA7DQog IFB5T2JqZWN0ICppbmN4X2NhcGkgPSBQeV9Ob25lOw0KICBzdGF0aWMgY2hhciAqY2FwaV9rd2xp c3RbXSA9IHsibiIsImR4IiwiaW5jeCIsTlVMTH07DQoNCi8qcm91dGRlYnVnZW50ZXIqLw0KI2lm ZGVmIEYyUFlfUkVQT1JUX0FURVhJVA0KZjJweV9zdGFydF9jbG9jaygpOw0KI2VuZGlmDQogIGlm ICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGNhcGlfYXJncyxjYXBpX2tleXdkcyxcDQog ICAgIk9PT3w6b3B0X3NxcC5pZGFtYXgiLFwNCiAgICBjYXBpX2t3bGlzdCwmbl9jYXBpLCZkeF9j YXBpLCZpbmN4X2NhcGkpKQ0KICAgIHJldHVybiBOVUxMOw0KLypmcm9tcHlvYmoqLw0KICAvKiBQ cm9jZXNzaW5nIHZhcmlhYmxlIGlkYW1heCAqLw0KICAvKiBQcm9jZXNzaW5nIHZhcmlhYmxlIGR4 ICovDQogIGR4X0RpbXNbMF09MTsNCiAgY2FwaV9keF9pbnRlbnQgfD0gRjJQWV9JTlRFTlRfSU47 DQogIGNhcGlfZHhfdG1wID0gYXJyYXlfZnJvbV9weW9iaihQeUFycmF5X0RPVUJMRSxkeF9EaW1z LGR4X1JhbmssY2FwaV9keF9pbnRlbnQsZHhfY2FwaSk7DQogIGlmIChjYXBpX2R4X3RtcCA9PSBO VUxMKSB7DQogICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKQ0KICAgICAgUHlFcnJfU2V0U3RyaW5n KG9wdF9zcXBfZXJyb3IsImZhaWxlZCBpbiBjb252ZXJ0aW5nIDJuZCBhcmd1bWVudCBgZHgnIG9m IG9wdF9zcXAuaWRhbWF4IHRvIEMvRm9ydHJhbiBhcnJheSIgKTsNCiAgfSBlbHNlIHsNCiAgICBk eCA9IChkb3VibGUgKikoY2FwaV9keF90bXAtPmRhdGEpOw0KICAvKiBQcm9jZXNzaW5nIHZhcmlh YmxlIGluY3ggKi8NCiAgICBmMnB5X3N1Y2Nlc3MgPSBpbnRfZnJvbV9weW9iaigmaW5jeCxpbmN4 X2NhcGksIm9wdF9zcXAuaWRhbWF4KCkgM3JkIGFyZ3VtZW50IChpbmN4KSBjYW4ndCBiZSBjb252 ZXJ0ZWQgdG8gaW50Iik7DQogIGlmIChmMnB5X3N1Y2Nlc3MpIHsNCiAgLyogUHJvY2Vzc2luZyB2 YXJpYWJsZSBuICovDQogICAgZjJweV9zdWNjZXNzID0gaW50X2Zyb21fcHlvYmooJm4sbl9jYXBp LCJvcHRfc3FwLmlkYW1heCgpIDFzdCBhcmd1bWVudCAobikgY2FuJ3QgYmUgY29udmVydGVkIHRv IGludCIpOw0KICBpZiAoZjJweV9zdWNjZXNzKSB7DQovKmVuZCBvZiBmcm9tcHlvYmoqLw0KI2lm ZGVmIEYyUFlfUkVQT1JUX0FURVhJVA0KZjJweV9zdGFydF9jYWxsX2Nsb2NrKCk7DQojZW5kaWYN Ci8qY2FsbGZvcnRyYW5yb3V0aW5lKi8NCiAgKCpmMnB5X2Z1bmMpKCZpZGFtYXgsJm4sZHgsJmlu Y3gpOw0KI2lmZGVmIEYyUFlfUkVQT1JUX0FURVhJVA0KZjJweV9zdG9wX2NhbGxfY2xvY2soKTsN CiNlbmRpZg0KLyplbmQgb2YgY2FsbGZvcnRyYW5yb3V0aW5lKi8NCiAgICBpZiAoZjJweV9zdWNj ZXNzKSB7DQovKnB5b2JqZnJvbSovDQovKmVuZCBvZiBweW9iamZyb20qLw0KICAgIENGVU5DU01F U1MoIkJ1aWxkaW5nIHJldHVybiB2YWx1ZS5cbiIpOw0KICAgIGNhcGlfYnVpbGR2YWx1ZSA9IFB5 X0J1aWxkVmFsdWUoImkiLGlkYW1heCk7DQovKmNsb3NlcHlvYmpmcm9tKi8NCi8qZW5kIG9mIGNs b3NlcHlvYmpmcm9tKi8NCiAgICB9IC8qaWYgKGYycHlfc3VjY2VzcykgYWZ0ZXIgY2FsbGZvcnRy YW5yb3V0aW5lKi8NCi8qY2xlYW51cGZyb21weW9iaiovDQogIH0gLyppZiAoZjJweV9zdWNjZXNz KSBvZiBuKi8NCiAgLyogRW5kIG9mIGNsZWFuaW5nIHZhcmlhYmxlIG4gKi8NCiAgfSAvKmlmIChm MnB5X3N1Y2Nlc3MpIG9mIGluY3gqLw0KICAvKiBFbmQgb2YgY2xlYW5pbmcgdmFyaWFibGUgaW5j eCAqLw0KICBpZigoUHlPYmplY3QgKiljYXBpX2R4X3RtcCE9ZHhfY2FwaSkgew0KICAgIFB5X1hE RUNSRUYoY2FwaV9keF90bXApOyB9DQogIH0gIC8qaWYgKGNhcGlfZHhfdG1wID09IE5VTEwpIC4u LiBlbHNlIG9mIGR4Ki8NCiAgLyogRW5kIG9mIGNsZWFuaW5nIHZhcmlhYmxlIGR4ICovDQogIC8q IEVuZCBvZiBjbGVhbmluZyB2YXJpYWJsZSBpZGFtYXggKi8NCi8qZW5kIG9mIGNsZWFudXBmcm9t cHlvYmoqLw0KICBpZiAoY2FwaV9idWlsZHZhbHVlID09IE5VTEwpIHsNCi8qcm91dGRlYnVnZmFp bHVyZSovDQogIH0gZWxzZSB7DQovKnJvdXRkZWJ1Z2xlYXZlKi8NCiAgfQ0KICBDRlVOQ1NNRVNT KCJGcmVlaW5nIG1lbW9yeS5cbiIpOw0KLypmcmVlbWVtKi8NCiNpZmRlZiBGMlBZX1JFUE9SVF9B VEVYSVQNCmYycHlfc3RvcF9jbG9jaygpOw0KI2VuZGlmDQogIHJldHVybiBjYXBpX2J1aWxkdmFs dWU7DQp9DQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBlbmQgb2YgaWRhbWF4ICoq KioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoNCi8qKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKiBkc2NhbCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8N CnN0YXRpYyBjaGFyIGRvY19mMnB5X3JvdXRfb3B0X3NxcF9kc2NhbFtdID0gIlwNCkZ1bmN0aW9u IHNpZ25hdHVyZTpcblwNCiAgZHNjYWwobixkYSxkeCxpbmN4KVxuXA0KUmVxdWlyZWQgYXJndW1l bnRzOlxuIg0KIiAgbiA6IGlucHV0IGludFxuIg0KIiAgZGEgOiBpbnB1dCBmbG9hdFxuIg0KIiAg ZHggOiBpbnB1dCByYW5rLTEgYXJyYXkoJ2QnKSB3aXRoIGJvdW5kcyAoMSlcbiINCiIgIGluY3gg OiBpbnB1dCBpbnQiOw0KLyogZXh0ZXJuIHZvaWQgRl9GVU5DKGRzY2FsLERTQ0FMKShpbnQqLGRv dWJsZSosZG91YmxlKixpbnQqKTsgKi8NCnN0YXRpYyBQeU9iamVjdCAqZjJweV9yb3V0X29wdF9z cXBfZHNjYWwoY29uc3QgUHlPYmplY3QgKmNhcGlfc2VsZiwNCiAgICAgICAgICAgICAgICAgICAg ICAgICAgIFB5T2JqZWN0ICpjYXBpX2FyZ3MsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQ eU9iamVjdCAqY2FwaV9rZXl3ZHMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgq ZjJweV9mdW5jKShpbnQqLGRvdWJsZSosZG91YmxlKixpbnQqKSkgew0KICBQeU9iamVjdCAqIHZv bGF0aWxlIGNhcGlfYnVpbGR2YWx1ZSA9IE5VTEw7DQogIHZvbGF0aWxlIGludCBmMnB5X3N1Y2Nl c3MgPSAxOw0KLypkZWNsKi8NCg0KICBpbnQgbiA9IDA7DQogIFB5T2JqZWN0ICpuX2NhcGkgPSBQ eV9Ob25lOw0KICBkb3VibGUgZGEgPSAwOw0KICBQeU9iamVjdCAqZGFfY2FwaSA9IFB5X05vbmU7 DQogIGRvdWJsZSAqZHggPSBOVUxMOw0KICBpbnQgZHhfRGltc1sxXSA9IHstMX07DQogIGNvbnN0 IGludCBkeF9SYW5rID0gMTsNCiAgUHlBcnJheU9iamVjdCAqY2FwaV9keF90bXAgPSBOVUxMOw0K ICBpbnQgY2FwaV9keF9pbnRlbnQgPSAwOw0KICBQeU9iamVjdCAqZHhfY2FwaSA9IFB5X05vbmU7 DQogIGludCBpbmN4ID0gMDsNCiAgUHlPYmplY3QgKmluY3hfY2FwaSA9IFB5X05vbmU7DQogIHN0 YXRpYyBjaGFyICpjYXBpX2t3bGlzdFtdID0geyJuIiwiZGEiLCJkeCIsImluY3giLE5VTEx9Ow0K DQovKnJvdXRkZWJ1Z2VudGVyKi8NCiNpZmRlZiBGMlBZX1JFUE9SVF9BVEVYSVQNCmYycHlfc3Rh cnRfY2xvY2soKTsNCiNlbmRpZg0KICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkcyhj YXBpX2FyZ3MsY2FwaV9rZXl3ZHMsXA0KICAgICJPT09PfDpvcHRfc3FwLmRzY2FsIixcDQogICAg Y2FwaV9rd2xpc3QsJm5fY2FwaSwmZGFfY2FwaSwmZHhfY2FwaSwmaW5jeF9jYXBpKSkNCiAgICBy ZXR1cm4gTlVMTDsNCi8qZnJvbXB5b2JqKi8NCiAgLyogUHJvY2Vzc2luZyB2YXJpYWJsZSBkeCAq Lw0KICBkeF9EaW1zWzBdPTE7DQogIGNhcGlfZHhfaW50ZW50IHw9IEYyUFlfSU5URU5UX0lOOw0K ICBjYXBpX2R4X3RtcCA9IGFycmF5X2Zyb21fcHlvYmooUHlBcnJheV9ET1VCTEUsZHhfRGltcyxk eF9SYW5rLGNhcGlfZHhfaW50ZW50LGR4X2NhcGkpOw0KICBpZiAoY2FwaV9keF90bXAgPT0gTlVM TCkgew0KICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkNCiAgICAgIFB5RXJyX1NldFN0cmluZyhv cHRfc3FwX2Vycm9yLCJmYWlsZWQgaW4gY29udmVydGluZyAzcmQgYXJndW1lbnQgYGR4JyBvZiBv cHRfc3FwLmRzY2FsIHRvIEMvRm9ydHJhbiBhcnJheSIgKTsNCiAgfSBlbHNlIHsNCiAgICBkeCA9 IChkb3VibGUgKikoY2FwaV9keF90bXAtPmRhdGEpOw0KICAvKiBQcm9jZXNzaW5nIHZhcmlhYmxl IGluY3ggKi8NCiAgICBmMnB5X3N1Y2Nlc3MgPSBpbnRfZnJvbV9weW9iaigmaW5jeCxpbmN4X2Nh cGksIm9wdF9zcXAuZHNjYWwoKSA0dGggYXJndW1lbnQgKGluY3gpIGNhbid0IGJlIGNvbnZlcnRl ZCB0byBpbnQiKTsNCiAgaWYgKGYycHlfc3VjY2Vzcykgew0KICAvKiBQcm9jZXNzaW5nIHZhcmlh YmxlIG4gKi8NCiAgICBmMnB5X3N1Y2Nlc3MgPSBpbnRfZnJvbV9weW9iaigmbixuX2NhcGksIm9w dF9zcXAuZHNjYWwoKSAxc3QgYXJndW1lbnQgKG4pIGNhbid0IGJlIGNvbnZlcnRlZCB0byBpbnQi KTsNCiAgaWYgKGYycHlfc3VjY2Vzcykgew0KICAvKiBQcm9jZXNzaW5nIHZhcmlhYmxlIGRhICov DQogICAgZjJweV9zdWNjZXNzID0gZG91YmxlX2Zyb21fcHlvYmooJmRhLGRhX2NhcGksIm9wdF9z cXAuZHNjYWwoKSAybmQgYXJndW1lbnQgKGRhKSBjYW4ndCBiZSBjb252ZXJ0ZWQgdG8gZG91Ymxl Iik7DQogIGlmIChmMnB5X3N1Y2Nlc3MpIHsNCi8qZW5kIG9mIGZyb21weW9iaiovDQojaWZkZWYg RjJQWV9SRVBPUlRfQVRFWElUDQpmMnB5X3N0YXJ0X2NhbGxfY2xvY2soKTsNCiNlbmRpZg0KLypj YWxsZm9ydHJhbnJvdXRpbmUqLw0KICAgICAgICAoKmYycHlfZnVuYykoJm4sJmRhLGR4LCZpbmN4 KTsNCiNpZmRlZiBGMlBZX1JFUE9SVF9BVEVYSVQNCmYycHlfc3RvcF9jYWxsX2Nsb2NrKCk7DQoj ZW5kaWYNCi8qZW5kIG9mIGNhbGxmb3J0cmFucm91dGluZSovDQogICAgaWYgKGYycHlfc3VjY2Vz cykgew0KLypweW9iamZyb20qLw0KLyplbmQgb2YgcHlvYmpmcm9tKi8NCiAgICBDRlVOQ1NNRVNT KCJCdWlsZGluZyByZXR1cm4gdmFsdWUuXG4iKTsNCiAgICBjYXBpX2J1aWxkdmFsdWUgPSBQeV9C dWlsZFZhbHVlKCIiKTsNCi8qY2xvc2VweW9iamZyb20qLw0KLyplbmQgb2YgY2xvc2VweW9iamZy b20qLw0KICAgIH0gLyppZiAoZjJweV9zdWNjZXNzKSBhZnRlciBjYWxsZm9ydHJhbnJvdXRpbmUq Lw0KLypjbGVhbnVwZnJvbXB5b2JqKi8NCiAgfSAvKmlmIChmMnB5X3N1Y2Nlc3MpIG9mIGRhKi8N CiAgLyogRW5kIG9mIGNsZWFuaW5nIHZhcmlhYmxlIGRhICovDQogIH0gLyppZiAoZjJweV9zdWNj ZXNzKSBvZiBuKi8NCiAgLyogRW5kIG9mIGNsZWFuaW5nIHZhcmlhYmxlIG4gKi8NCiAgfSAvKmlm IChmMnB5X3N1Y2Nlc3MpIG9mIGluY3gqLw0KICAvKiBFbmQgb2YgY2xlYW5pbmcgdmFyaWFibGUg aW5jeCAqLw0KICBpZigoUHlPYmplY3QgKiljYXBpX2R4X3RtcCE9ZHhfY2FwaSkgew0KICAgIFB5 X1hERUNSRUYoY2FwaV9keF90bXApOyB9DQogIH0gIC8qaWYgKGNhcGlfZHhfdG1wID09IE5VTEwp IC4uLiBlbHNlIG9mIGR4Ki8NCiAgLyogRW5kIG9mIGNsZWFuaW5nIHZhcmlhYmxlIGR4ICovDQov KmVuZCBvZiBjbGVhbnVwZnJvbXB5b2JqKi8NCiAgaWYgKGNhcGlfYnVpbGR2YWx1ZSA9PSBOVUxM KSB7DQovKnJvdXRkZWJ1Z2ZhaWx1cmUqLw0KICB9IGVsc2Ugew0KLypyb3V0ZGVidWdsZWF2ZSov DQogIH0NCiAgQ0ZVTkNTTUVTUygiRnJlZWluZyBtZW1vcnkuXG4iKTsNCi8qZnJlZW1lbSovDQoj aWZkZWYgRjJQWV9SRVBPUlRfQVRFWElUDQpmMnB5X3N0b3BfY2xvY2soKTsNCiNlbmRpZg0KICBy ZXR1cm4gY2FwaV9idWlsZHZhbHVlOw0KfQ0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqIGVuZCBvZiBkc2NhbCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KLyoq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIGVub3JtICoqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqLw0Kc3RhdGljIGNoYXIgZG9jX2YycHlfcm91dF9vcHRfc3FwX2Vu b3JtW10gPSAiXA0KRnVuY3Rpb24gc2lnbmF0dXJlOlxuXA0KICBlbm9ybSA9IGVub3JtKHgsW25d KVxuXA0KUmVxdWlyZWQgYXJndW1lbnRzOlxuIg0KIiAgeCA6IGlucHV0IHJhbmstMSBhcnJheSgn ZCcpIHdpdGggYm91bmRzIChuKVxuIg0KIk9wdGlvbmFsIGFyZ3VtZW50czpcbiINCiIgIG4gOj0g bGVuKHgpIGlucHV0IGludFxuIg0KIlJldHVybiBvYmplY3RzOlxuIg0KIiAgZW5vcm0gOiBmbG9h dCI7DQovKiBleHRlcm4gdm9pZCBGX1dSQVBQRURGVU5DKGVub3JtLEVOT1JNKShkb3VibGUqLGlu dCosZG91YmxlKik7ICovDQpzdGF0aWMgUHlPYmplY3QgKmYycHlfcm91dF9vcHRfc3FwX2Vub3Jt KGNvbnN0IFB5T2JqZWN0ICpjYXBpX3NlbGYsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQ eU9iamVjdCAqY2FwaV9hcmdzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3Qg KmNhcGlfa2V5d2RzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKmYycHlfZnVu YykoZG91YmxlKixpbnQqLGRvdWJsZSopKSB7DQogIFB5T2JqZWN0ICogdm9sYXRpbGUgY2FwaV9i dWlsZHZhbHVlID0gTlVMTDsNCiAgdm9sYXRpbGUgaW50IGYycHlfc3VjY2VzcyA9IDE7DQovKmRl Y2wqLw0KDQogIGRvdWJsZSBlbm9ybSA9IDA7DQogIGludCBuID0gMDsNCiAgUHlPYmplY3QgKm5f Y2FwaSA9IFB5X05vbmU7DQogIGRvdWJsZSAqeCA9IE5VTEw7DQogIGludCB4X0RpbXNbMV0gPSB7 LTF9Ow0KICBjb25zdCBpbnQgeF9SYW5rID0gMTsNCiAgUHlBcnJheU9iamVjdCAqY2FwaV94X3Rt cCA9IE5VTEw7DQogIGludCBjYXBpX3hfaW50ZW50ID0gMDsNCiAgUHlPYmplY3QgKnhfY2FwaSA9 IFB5X05vbmU7DQogIHN0YXRpYyBjaGFyICpjYXBpX2t3bGlzdFtdID0geyJ4IiwibiIsTlVMTH07 DQoNCi8qcm91dGRlYnVnZW50ZXIqLw0KI2lmZGVmIEYyUFlfUkVQT1JUX0FURVhJVA0KZjJweV9z dGFydF9jbG9jaygpOw0KI2VuZGlmDQogIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRz KGNhcGlfYXJncyxjYXBpX2tleXdkcyxcDQogICAgIk98TzpvcHRfc3FwLmVub3JtIixcDQogICAg Y2FwaV9rd2xpc3QsJnhfY2FwaSwmbl9jYXBpKSkNCiAgICByZXR1cm4gTlVMTDsNCi8qZnJvbXB5 b2JqKi8NCiAgLyogUHJvY2Vzc2luZyB2YXJpYWJsZSB4ICovDQogIDsNCiAgY2FwaV94X2ludGVu dCB8PSBGMlBZX0lOVEVOVF9JTjsNCiAgY2FwaV94X3RtcCA9IGFycmF5X2Zyb21fcHlvYmooUHlB cnJheV9ET1VCTEUseF9EaW1zLHhfUmFuayxjYXBpX3hfaW50ZW50LHhfY2FwaSk7DQogIGlmIChj YXBpX3hfdG1wID09IE5VTEwpIHsNCiAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpDQogICAgICBQ eUVycl9TZXRTdHJpbmcob3B0X3NxcF9lcnJvciwiZmFpbGVkIGluIGNvbnZlcnRpbmcgMXN0IGFy Z3VtZW50IGB4JyBvZiBvcHRfc3FwLmVub3JtIHRvIEMvRm9ydHJhbiBhcnJheSIgKTsNCiAgfSBl bHNlIHsNCiAgICB4ID0gKGRvdWJsZSAqKShjYXBpX3hfdG1wLT5kYXRhKTsNCiAgLyogUHJvY2Vz c2luZyB2YXJpYWJsZSBlbm9ybSAqLw0KICAvKiBQcm9jZXNzaW5nIHZhcmlhYmxlIG4gKi8NCiAg aWYgKG5fY2FwaSA9PSBQeV9Ob25lKSBuID0gbGVuKHgpOyBlbHNlDQogICAgZjJweV9zdWNjZXNz ID0gaW50X2Zyb21fcHlvYmooJm4sbl9jYXBpLCJvcHRfc3FwLmVub3JtKCkgMXN0IGtleXdvcmQg KG4pIGNhbid0IGJlIGNvbnZlcnRlZCB0byBpbnQiKTsNCiAgaWYgKGYycHlfc3VjY2Vzcykgew0K ICBDSEVDS1NDQUxBUihsZW4oeCk+PW4sImxlbih4KT49biIsIjFzdCBrZXl3b3JkIG4iLCJlbm9y bTpuPSVkIixuKSB7DQovKmVuZCBvZiBmcm9tcHlvYmoqLw0KI2lmZGVmIEYyUFlfUkVQT1JUX0FU RVhJVA0KZjJweV9zdGFydF9jYWxsX2Nsb2NrKCk7DQojZW5kaWYNCi8qY2FsbGZvcnRyYW5yb3V0 aW5lKi8NCiAgKCpmMnB5X2Z1bmMpKCZlbm9ybSwmbix4KTsNCiNpZmRlZiBGMlBZX1JFUE9SVF9B VEVYSVQNCmYycHlfc3RvcF9jYWxsX2Nsb2NrKCk7DQojZW5kaWYNCi8qZW5kIG9mIGNhbGxmb3J0 cmFucm91dGluZSovDQogICAgaWYgKGYycHlfc3VjY2Vzcykgew0KLypweW9iamZyb20qLw0KLypl bmQgb2YgcHlvYmpmcm9tKi8NCiAgICBDRlVOQ1NNRVNTKCJCdWlsZGluZyByZXR1cm4gdmFsdWUu XG4iKTsNCiAgICBjYXBpX2J1aWxkdmFsdWUgPSBQeV9CdWlsZFZhbHVlKCJkIixlbm9ybSk7DQov KmNsb3NlcHlvYmpmcm9tKi8NCi8qZW5kIG9mIGNsb3NlcHlvYmpmcm9tKi8NCiAgICB9IC8qaWYg KGYycHlfc3VjY2VzcykgYWZ0ZXIgY2FsbGZvcnRyYW5yb3V0aW5lKi8NCi8qY2xlYW51cGZyb21w eW9iaiovDQogIH0gLypDSEVDS1NDQUxBUihsZW4oeCk+PW4pKi8NCiAgfSAvKmlmIChmMnB5X3N1 Y2Nlc3MpIG9mIG4qLw0KICAvKiBFbmQgb2YgY2xlYW5pbmcgdmFyaWFibGUgbiAqLw0KICAvKiBF bmQgb2YgY2xlYW5pbmcgdmFyaWFibGUgZW5vcm0gKi8NCiAgaWYoKFB5T2JqZWN0ICopY2FwaV94 X3RtcCE9eF9jYXBpKSB7DQogICAgUHlfWERFQ1JFRihjYXBpX3hfdG1wKTsgfQ0KICB9ICAvKmlm IChjYXBpX3hfdG1wID09IE5VTEwpIC4uLiBlbHNlIG9mIHgqLw0KICAvKiBFbmQgb2YgY2xlYW5p bmcgdmFyaWFibGUgeCAqLw0KLyplbmQgb2YgY2xlYW51cGZyb21weW9iaiovDQogIGlmIChjYXBp X2J1aWxkdmFsdWUgPT0gTlVMTCkgew0KLypyb3V0ZGVidWdmYWlsdXJlKi8NCiAgfSBlbHNlIHsN Ci8qcm91dGRlYnVnbGVhdmUqLw0KICB9DQogIENGVU5DU01FU1MoIkZyZWVpbmcgbWVtb3J5Llxu Iik7DQovKmZyZWVtZW0qLw0KI2lmZGVmIEYyUFlfUkVQT1JUX0FURVhJVA0KZjJweV9zdG9wX2Ns b2NrKCk7DQojZW5kaWYNCiAgcmV0dXJuIGNhcGlfYnVpbGR2YWx1ZTsNCn0NCi8qKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKiBlbmQgb2YgZW5vcm0gKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKiovDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogaGlu diAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQpzdGF0aWMgY2hhciBkb2Nf ZjJweV9yb3V0X29wdF9zcXBfaGludltdID0gIlwNCkZ1bmN0aW9uIHNpZ25hdHVyZTpcblwNCiAg aGludihoLHdvcmssaXB2dCxpbmZvLFtpaCxuXSlcblwNClJlcXVpcmVkIGFyZ3VtZW50czpcbiIN CiIgIGggOiBpbnB1dCByYW5rLTIgYXJyYXkoJ2QnKSB3aXRoIGJvdW5kcyAoaWgsaWgpXG4iDQoi ICB3b3JrIDogaW5wdXQgcmFuay0xIGFycmF5KCdkJykgd2l0aCBib3VuZHMgKG4pXG4iDQoiICBp cHZ0IDogaW5wdXQgcmFuay0xIGFycmF5KCdpJykgd2l0aCBib3VuZHMgKG4pXG4iDQoiICBpbmZv IDogaW5wdXQgaW50XG4iDQoiT3B0aW9uYWwgYXJndW1lbnRzOlxuIg0KIiAgaWggOj0gc2hhcGUo aCwwKSBpbnB1dCBpbnRcbiINCiIgIG4gOj0gbGVuKHdvcmspIGlucHV0IGludCI7DQovKiBleHRl cm4gdm9pZCBGX0ZVTkMoaGludixISU5WKShkb3VibGUqLGludCosaW50Kixkb3VibGUqLGludCos aW50Kik7ICovDQpzdGF0aWMgUHlPYmplY3QgKmYycHlfcm91dF9vcHRfc3FwX2hpbnYoY29uc3Qg UHlPYmplY3QgKmNhcGlfc2VsZiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0 ICpjYXBpX2FyZ3MsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqY2FwaV9r ZXl3ZHMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqZjJweV9mdW5jKShkb3Vi bGUqLGludCosaW50Kixkb3VibGUqLGludCosaW50KikpIHsNCiAgUHlPYmplY3QgKiB2b2xhdGls ZSBjYXBpX2J1aWxkdmFsdWUgPSBOVUxMOw0KICB2b2xhdGlsZSBpbnQgZjJweV9zdWNjZXNzID0g MTsNCi8qZGVjbCovDQoNCiAgZG91YmxlICpoID0gTlVMTDsNCiAgaW50IGhfRGltc1syXSA9IHst MSwgLTF9Ow0KICBjb25zdCBpbnQgaF9SYW5rID0gMjsNCiAgUHlBcnJheU9iamVjdCAqY2FwaV9o X3RtcCA9IE5VTEw7DQogIGludCBjYXBpX2hfaW50ZW50ID0gMDsNCiAgUHlPYmplY3QgKmhfY2Fw aSA9IFB5X05vbmU7DQogIGludCBpaCA9IDA7DQogIFB5T2JqZWN0ICppaF9jYXBpID0gUHlfTm9u ZTsNCiAgaW50IG4gPSAwOw0KICBQeU9iamVjdCAqbl9jYXBpID0gUHlfTm9uZTsNCiAgZG91Ymxl ICp3b3JrID0gTlVMTDsNCiAgaW50IHdvcmtfRGltc1sxXSA9IHstMX07DQogIGNvbnN0IGludCB3 b3JrX1JhbmsgPSAxOw0KICBQeUFycmF5T2JqZWN0ICpjYXBpX3dvcmtfdG1wID0gTlVMTDsNCiAg aW50IGNhcGlfd29ya19pbnRlbnQgPSAwOw0KICBQeU9iamVjdCAqd29ya19jYXBpID0gUHlfTm9u ZTsNCiAgaW50ICppcHZ0ID0gTlVMTDsNCiAgaW50IGlwdnRfRGltc1sxXSA9IHstMX07DQogIGNv bnN0IGludCBpcHZ0X1JhbmsgPSAxOw0KICBQeUFycmF5T2JqZWN0ICpjYXBpX2lwdnRfdG1wID0g TlVMTDsNCiAgaW50IGNhcGlfaXB2dF9pbnRlbnQgPSAwOw0KICBQeU9iamVjdCAqaXB2dF9jYXBp ID0gUHlfTm9uZTsNCiAgaW50IGluZm8gPSAwOw0KICBQeU9iamVjdCAqaW5mb19jYXBpID0gUHlf Tm9uZTsNCiAgc3RhdGljIGNoYXIgKmNhcGlfa3dsaXN0W10gPSB7ImgiLCJ3b3JrIiwiaXB2dCIs ImluZm8iLCJpaCIsIm4iLE5VTEx9Ow0KDQovKnJvdXRkZWJ1Z2VudGVyKi8NCiNpZmRlZiBGMlBZ X1JFUE9SVF9BVEVYSVQNCmYycHlfc3RhcnRfY2xvY2soKTsNCiNlbmRpZg0KICBpZiAoIVB5QXJn X1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhjYXBpX2FyZ3MsY2FwaV9rZXl3ZHMsXA0KICAgICJPT09P fE9POm9wdF9zcXAuaGludiIsXA0KICAgIGNhcGlfa3dsaXN0LCZoX2NhcGksJndvcmtfY2FwaSwm aXB2dF9jYXBpLCZpbmZvX2NhcGksJmloX2NhcGksJm5fY2FwaSkpDQogICAgcmV0dXJuIE5VTEw7 DQovKmZyb21weW9iaiovDQogIC8qIFByb2Nlc3NpbmcgdmFyaWFibGUgaW5mbyAqLw0KICAgIGYy cHlfc3VjY2VzcyA9IGludF9mcm9tX3B5b2JqKCZpbmZvLGluZm9fY2FwaSwib3B0X3NxcC5oaW52 KCkgNHRoIGFyZ3VtZW50IChpbmZvKSBjYW4ndCBiZSBjb252ZXJ0ZWQgdG8gaW50Iik7DQogIGlm IChmMnB5X3N1Y2Nlc3MpIHsNCiAgLyogUHJvY2Vzc2luZyB2YXJpYWJsZSBoICovDQogIDsNCiAg Y2FwaV9oX2ludGVudCB8PSBGMlBZX0lOVEVOVF9JTjsNCiAgY2FwaV9oX3RtcCA9IGFycmF5X2Zy b21fcHlvYmooUHlBcnJheV9ET1VCTEUsaF9EaW1zLGhfUmFuayxjYXBpX2hfaW50ZW50LGhfY2Fw aSk7DQogIGlmIChjYXBpX2hfdG1wID09IE5VTEwpIHsNCiAgICBpZiAoIVB5RXJyX09jY3VycmVk KCkpDQogICAgICBQeUVycl9TZXRTdHJpbmcob3B0X3NxcF9lcnJvciwiZmFpbGVkIGluIGNvbnZl cnRpbmcgMXN0IGFyZ3VtZW50IGBoJyBvZiBvcHRfc3FwLmhpbnYgdG8gQy9Gb3J0cmFuIGFycmF5 IiApOw0KICB9IGVsc2Ugew0KICAgIGggPSAoZG91YmxlICopKGNhcGlfaF90bXAtPmRhdGEpOw0K ICAvKiBQcm9jZXNzaW5nIHZhcmlhYmxlIHdvcmsgKi8NCiAgOw0KICBjYXBpX3dvcmtfaW50ZW50 IHw9IEYyUFlfSU5URU5UX0lOOw0KICBjYXBpX3dvcmtfdG1wID0gYXJyYXlfZnJvbV9weW9iaihQ eUFycmF5X0RPVUJMRSx3b3JrX0RpbXMsd29ya19SYW5rLGNhcGlfd29ya19pbnRlbnQsd29ya19j YXBpKTsNCiAgaWYgKGNhcGlfd29ya190bXAgPT0gTlVMTCkgew0KICAgIGlmICghUHlFcnJfT2Nj dXJyZWQoKSkNCiAgICAgIFB5RXJyX1NldFN0cmluZyhvcHRfc3FwX2Vycm9yLCJmYWlsZWQgaW4g Y29udmVydGluZyAybmQgYXJndW1lbnQgYHdvcmsnIG9mIG9wdF9zcXAuaGludiB0byBDL0ZvcnRy YW4gYXJyYXkiICk7DQogIH0gZWxzZSB7DQogICAgd29yayA9IChkb3VibGUgKikoY2FwaV93b3Jr X3RtcC0+ZGF0YSk7DQogIC8qIFByb2Nlc3NpbmcgdmFyaWFibGUgaWggKi8NCiAgaWYgKGloX2Nh cGkgPT0gUHlfTm9uZSkgaWggPSBzaGFwZShoLDApOyBlbHNlDQogICAgZjJweV9zdWNjZXNzID0g aW50X2Zyb21fcHlvYmooJmloLGloX2NhcGksIm9wdF9zcXAuaGludigpIDFzdCBrZXl3b3JkIChp aCkgY2FuJ3QgYmUgY29udmVydGVkIHRvIGludCIpOw0KICBpZiAoZjJweV9zdWNjZXNzKSB7DQog IENIRUNLU0NBTEFSKHNoYXBlKGgsMCk9PWloLCJzaGFwZShoLDApPT1paCIsIjFzdCBrZXl3b3Jk IGloIiwiaGludjppaD0lZCIsaWgpIHsNCiAgLyogUHJvY2Vzc2luZyB2YXJpYWJsZSBuICovDQog IGlmIChuX2NhcGkgPT0gUHlfTm9uZSkgbiA9IGxlbih3b3JrKTsgZWxzZQ0KICAgIGYycHlfc3Vj Y2VzcyA9IGludF9mcm9tX3B5b2JqKCZuLG5fY2FwaSwib3B0X3NxcC5oaW52KCkgMm5kIGtleXdv cmQgKG4pIGNhbid0IGJlIGNvbnZlcnRlZCB0byBpbnQiKTsNCiAgaWYgKGYycHlfc3VjY2Vzcykg ew0KICBDSEVDS1NDQUxBUihsZW4od29yayk+PW4sImxlbih3b3JrKT49biIsIjJuZCBrZXl3b3Jk IG4iLCJoaW52Om49JWQiLG4pIHsNCiAgLyogUHJvY2Vzc2luZyB2YXJpYWJsZSBpcHZ0ICovDQog IGlwdnRfRGltc1swXT1uOw0KICBjYXBpX2lwdnRfaW50ZW50IHw9IEYyUFlfSU5URU5UX0lOOw0K ICBjYXBpX2lwdnRfdG1wID0gYXJyYXlfZnJvbV9weW9iaihQeUFycmF5X0lOVCxpcHZ0X0RpbXMs aXB2dF9SYW5rLGNhcGlfaXB2dF9pbnRlbnQsaXB2dF9jYXBpKTsNCiAgaWYgKGNhcGlfaXB2dF90 bXAgPT0gTlVMTCkgew0KICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkNCiAgICAgIFB5RXJyX1Nl dFN0cmluZyhvcHRfc3FwX2Vycm9yLCJmYWlsZWQgaW4gY29udmVydGluZyAzcmQgYXJndW1lbnQg YGlwdnQnIG9mIG9wdF9zcXAuaGludiB0byBDL0ZvcnRyYW4gYXJyYXkiICk7DQogIH0gZWxzZSB7 DQogICAgaXB2dCA9IChpbnQgKikoY2FwaV9pcHZ0X3RtcC0+ZGF0YSk7DQovKmVuZCBvZiBmcm9t cHlvYmoqLw0KI2lmZGVmIEYyUFlfUkVQT1JUX0FURVhJVA0KZjJweV9zdGFydF9jYWxsX2Nsb2Nr KCk7DQojZW5kaWYNCi8qY2FsbGZvcnRyYW5yb3V0aW5lKi8NCiAgICAgICAgKCpmMnB5X2Z1bmMp KGgsJmloLCZuLHdvcmssaXB2dCwmaW5mbyk7DQojaWZkZWYgRjJQWV9SRVBPUlRfQVRFWElUDQpm MnB5X3N0b3BfY2FsbF9jbG9jaygpOw0KI2VuZGlmDQovKmVuZCBvZiBjYWxsZm9ydHJhbnJvdXRp bmUqLw0KICAgIGlmIChmMnB5X3N1Y2Nlc3MpIHsNCi8qcHlvYmpmcm9tKi8NCi8qZW5kIG9mIHB5 b2JqZnJvbSovDQogICAgQ0ZVTkNTTUVTUygiQnVpbGRpbmcgcmV0dXJuIHZhbHVlLlxuIik7DQog ICAgY2FwaV9idWlsZHZhbHVlID0gUHlfQnVpbGRWYWx1ZSgiIik7DQovKmNsb3NlcHlvYmpmcm9t Ki8NCi8qZW5kIG9mIGNsb3NlcHlvYmpmcm9tKi8NCiAgICB9IC8qaWYgKGYycHlfc3VjY2Vzcykg YWZ0ZXIgY2FsbGZvcnRyYW5yb3V0aW5lKi8NCi8qY2xlYW51cGZyb21weW9iaiovDQogIGlmKChQ eU9iamVjdCAqKWNhcGlfaXB2dF90bXAhPWlwdnRfY2FwaSkgew0KICAgIFB5X1hERUNSRUYoY2Fw aV9pcHZ0X3RtcCk7IH0NCiAgfSAgLyppZiAoY2FwaV9pcHZ0X3RtcCA9PSBOVUxMKSAuLi4gZWxz ZSBvZiBpcHZ0Ki8NCiAgLyogRW5kIG9mIGNsZWFuaW5nIHZhcmlhYmxlIGlwdnQgKi8NCiAgfSAv KkNIRUNLU0NBTEFSKGxlbih3b3JrKT49bikqLw0KICB9IC8qaWYgKGYycHlfc3VjY2Vzcykgb2Yg biovDQogIC8qIEVuZCBvZiBjbGVhbmluZyB2YXJpYWJsZSBuICovDQogIH0gLypDSEVDS1NDQUxB UihzaGFwZShoLDApPT1paCkqLw0KICB9IC8qaWYgKGYycHlfc3VjY2Vzcykgb2YgaWgqLw0KICAv KiBFbmQgb2YgY2xlYW5pbmcgdmFyaWFibGUgaWggKi8NCiAgaWYoKFB5T2JqZWN0ICopY2FwaV93 b3JrX3RtcCE9d29ya19jYXBpKSB7DQogICAgUHlfWERFQ1JFRihjYXBpX3dvcmtfdG1wKTsgfQ0K ICB9ICAvKmlmIChjYXBpX3dvcmtfdG1wID09IE5VTEwpIC4uLiBlbHNlIG9mIHdvcmsqLw0KICAv KiBFbmQgb2YgY2xlYW5pbmcgdmFyaWFibGUgd29yayAqLw0KICBpZigoUHlPYmplY3QgKiljYXBp X2hfdG1wIT1oX2NhcGkpIHsNCiAgICBQeV9YREVDUkVGKGNhcGlfaF90bXApOyB9DQogIH0gIC8q aWYgKGNhcGlfaF90bXAgPT0gTlVMTCkgLi4uIGVsc2Ugb2YgaCovDQogIC8qIEVuZCBvZiBjbGVh bmluZyB2YXJpYWJsZSBoICovDQogIH0gLyppZiAoZjJweV9zdWNjZXNzKSBvZiBpbmZvKi8NCiAg LyogRW5kIG9mIGNsZWFuaW5nIHZhcmlhYmxlIGluZm8gKi8NCi8qZW5kIG9mIGNsZWFudXBmcm9t cHlvYmoqLw0KICBpZiAoY2FwaV9idWlsZHZhbHVlID09IE5VTEwpIHsNCi8qcm91dGRlYnVnZmFp bHVyZSovDQogIH0gZWxzZSB7DQovKnJvdXRkZWJ1Z2xlYXZlKi8NCiAgfQ0KICBDRlVOQ1NNRVNT KCJGcmVlaW5nIG1lbW9yeS5cbiIpOw0KLypmcmVlbWVtKi8NCiNpZmRlZiBGMlBZX1JFUE9SVF9B VEVYSVQNCmYycHlfc3RvcF9jbG9jaygpOw0KI2VuZGlmDQogIHJldHVybiBjYXBpX2J1aWxkdmFs dWU7DQp9DQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogZW5kIG9mIGhpbnYgKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoNCi8qKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKiBkZ2VmYSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8N CnN0YXRpYyBjaGFyIGRvY19mMnB5X3JvdXRfb3B0X3NxcF9kZ2VmYVtdID0gIlwNCkZ1bmN0aW9u IHNpZ25hdHVyZTpcblwNCiAgZGdlZmEoYSxuLGlwdnQsaW5mbyxbbGRhXSlcblwNClJlcXVpcmVk IGFyZ3VtZW50czpcbiINCiIgIGEgOiBpbnB1dCByYW5rLTIgYXJyYXkoJ2QnKSB3aXRoIGJvdW5k cyAobGRhLDEpXG4iDQoiICBuIDogaW5wdXQgaW50XG4iDQoiICBpcHZ0IDogaW5wdXQgcmFuay0x IGFycmF5KCdpJykgd2l0aCBib3VuZHMgKDEpXG4iDQoiICBpbmZvIDogaW5wdXQgaW50XG4iDQoi T3B0aW9uYWwgYXJndW1lbnRzOlxuIg0KIiAgbGRhIDo9IHNoYXBlKGEsMCkgaW5wdXQgaW50IjsN Ci8qIGV4dGVybiB2b2lkIEZfRlVOQyhkZ2VmYSxER0VGQSkoZG91YmxlKixpbnQqLGludCosaW50 KixpbnQqKTsgKi8NCnN0YXRpYyBQeU9iamVjdCAqZjJweV9yb3V0X29wdF9zcXBfZGdlZmEoY29u c3QgUHlPYmplY3QgKmNhcGlfc2VsZiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2Jq ZWN0ICpjYXBpX2FyZ3MsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqY2Fw aV9rZXl3ZHMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqZjJweV9mdW5jKShk b3VibGUqLGludCosaW50KixpbnQqLGludCopKSB7DQogIFB5T2JqZWN0ICogdm9sYXRpbGUgY2Fw aV9idWlsZHZhbHVlID0gTlVMTDsNCiAgdm9sYXRpbGUgaW50IGYycHlfc3VjY2VzcyA9IDE7DQov KmRlY2wqLw0KDQogIGRvdWJsZSAqYSA9IE5VTEw7DQogIGludCBhX0RpbXNbMl0gPSB7LTEsIC0x fTsNCiAgY29uc3QgaW50IGFfUmFuayA9IDI7DQogIFB5QXJyYXlPYmplY3QgKmNhcGlfYV90bXAg PSBOVUxMOw0KICBpbnQgY2FwaV9hX2ludGVudCA9IDA7DQogIFB5T2JqZWN0ICphX2NhcGkgPSBQ eV9Ob25lOw0KICBpbnQgbGRhID0gMDsNCiAgUHlPYmplY3QgKmxkYV9jYXBpID0gUHlfTm9uZTsN CiAgaW50IG4gPSAwOw0KICBQeU9iamVjdCAqbl9jYXBpID0gUHlfTm9uZTsNCiAgaW50ICppcHZ0 ID0gTlVMTDsNCiAgaW50IGlwdnRfRGltc1sxXSA9IHstMX07DQogIGNvbnN0IGludCBpcHZ0X1Jh bmsgPSAxOw0KICBQeUFycmF5T2JqZWN0ICpjYXBpX2lwdnRfdG1wID0gTlVMTDsNCiAgaW50IGNh cGlfaXB2dF9pbnRlbnQgPSAwOw0KICBQeU9iamVjdCAqaXB2dF9jYXBpID0gUHlfTm9uZTsNCiAg aW50IGluZm8gPSAwOw0KICBQeU9iamVjdCAqaW5mb19jYXBpID0gUHlfTm9uZTsNCiAgc3RhdGlj IGNoYXIgKmNhcGlfa3dsaXN0W10gPSB7ImEiLCJuIiwiaXB2dCIsImluZm8iLCJsZGEiLE5VTEx9 Ow0KDQovKnJvdXRkZWJ1Z2VudGVyKi8NCiNpZmRlZiBGMlBZX1JFUE9SVF9BVEVYSVQNCmYycHlf c3RhcnRfY2xvY2soKTsNCiNlbmRpZg0KICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jk cyhjYXBpX2FyZ3MsY2FwaV9rZXl3ZHMsXA0KICAgICJPT09PfE86b3B0X3NxcC5kZ2VmYSIsXA0K ICAgIGNhcGlfa3dsaXN0LCZhX2NhcGksJm5fY2FwaSwmaXB2dF9jYXBpLCZpbmZvX2NhcGksJmxk YV9jYXBpKSkNCiAgICByZXR1cm4gTlVMTDsNCi8qZnJvbXB5b2JqKi8NCiAgLyogUHJvY2Vzc2lu ZyB2YXJpYWJsZSBhICovDQogIGFfRGltc1sxXT0xOw0KICBjYXBpX2FfaW50ZW50IHw9IEYyUFlf SU5URU5UX0lOOw0KICBjYXBpX2FfdG1wID0gYXJyYXlfZnJvbV9weW9iaihQeUFycmF5X0RPVUJM RSxhX0RpbXMsYV9SYW5rLGNhcGlfYV9pbnRlbnQsYV9jYXBpKTsNCiAgaWYgKGNhcGlfYV90bXAg PT0gTlVMTCkgew0KICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkNCiAgICAgIFB5RXJyX1NldFN0 cmluZyhvcHRfc3FwX2Vycm9yLCJmYWlsZWQgaW4gY29udmVydGluZyAxc3QgYXJndW1lbnQgYGEn IG9mIG9wdF9zcXAuZGdlZmEgdG8gQy9Gb3J0cmFuIGFycmF5IiApOw0KICB9IGVsc2Ugew0KICAg IGEgPSAoZG91YmxlICopKGNhcGlfYV90bXAtPmRhdGEpOw0KICAvKiBQcm9jZXNzaW5nIHZhcmlh YmxlIGluZm8gKi8NCiAgICBmMnB5X3N1Y2Nlc3MgPSBpbnRfZnJvbV9weW9iaigmaW5mbyxpbmZv X2NhcGksIm9wdF9zcXAuZGdlZmEoKSA0dGggYXJndW1lbnQgKGluZm8pIGNhbid0IGJlIGNvbnZl cnRlZCB0byBpbnQiKTsNCiAgaWYgKGYycHlfc3VjY2Vzcykgew0KICAvKiBQcm9jZXNzaW5nIHZh cmlhYmxlIGlwdnQgKi8NCiAgaXB2dF9EaW1zWzBdPTE7DQogIGNhcGlfaXB2dF9pbnRlbnQgfD0g RjJQWV9JTlRFTlRfSU47DQogIGNhcGlfaXB2dF90bXAgPSBhcnJheV9mcm9tX3B5b2JqKFB5QXJy YXlfSU5ULGlwdnRfRGltcyxpcHZ0X1JhbmssY2FwaV9pcHZ0X2ludGVudCxpcHZ0X2NhcGkpOw0K ICBpZiAoY2FwaV9pcHZ0X3RtcCA9PSBOVUxMKSB7DQogICAgaWYgKCFQeUVycl9PY2N1cnJlZCgp KQ0KICAgICAgUHlFcnJfU2V0U3RyaW5nKG9wdF9zcXBfZXJyb3IsImZhaWxlZCBpbiBjb252ZXJ0 aW5nIDNyZCBhcmd1bWVudCBgaXB2dCcgb2Ygb3B0X3NxcC5kZ2VmYSB0byBDL0ZvcnRyYW4gYXJy YXkiICk7DQogIH0gZWxzZSB7DQogICAgaXB2dCA9IChpbnQgKikoY2FwaV9pcHZ0X3RtcC0+ZGF0 YSk7DQogIC8qIFByb2Nlc3NpbmcgdmFyaWFibGUgbiAqLw0KICAgIGYycHlfc3VjY2VzcyA9IGlu dF9mcm9tX3B5b2JqKCZuLG5fY2FwaSwib3B0X3NxcC5kZ2VmYSgpIDJuZCBhcmd1bWVudCAobikg Y2FuJ3QgYmUgY29udmVydGVkIHRvIGludCIpOw0KICBpZiAoZjJweV9zdWNjZXNzKSB7DQogIC8q IFByb2Nlc3NpbmcgdmFyaWFibGUgbGRhICovDQogIGlmIChsZGFfY2FwaSA9PSBQeV9Ob25lKSBs ZGEgPSBzaGFwZShhLDApOyBlbHNlDQogICAgZjJweV9zdWNjZXNzID0gaW50X2Zyb21fcHlvYmoo JmxkYSxsZGFfY2FwaSwib3B0X3NxcC5kZ2VmYSgpIDFzdCBrZXl3b3JkIChsZGEpIGNhbid0IGJl IGNvbnZlcnRlZCB0byBpbnQiKTsNCiAgaWYgKGYycHlfc3VjY2Vzcykgew0KICBDSEVDS1NDQUxB UihzaGFwZShhLDApPT1sZGEsInNoYXBlKGEsMCk9PWxkYSIsIjFzdCBrZXl3b3JkIGxkYSIsImRn ZWZhOmxkYT0lZCIsbGRhKSB7DQovKmVuZCBvZiBmcm9tcHlvYmoqLw0KI2lmZGVmIEYyUFlfUkVQ T1JUX0FURVhJVA0KZjJweV9zdGFydF9jYWxsX2Nsb2NrKCk7DQojZW5kaWYNCi8qY2FsbGZvcnRy YW5yb3V0aW5lKi8NCiAgICAgICAgKCpmMnB5X2Z1bmMpKGEsJmxkYSwmbixpcHZ0LCZpbmZvKTsN CiNpZmRlZiBGMlBZX1JFUE9SVF9BVEVYSVQNCmYycHlfc3RvcF9jYWxsX2Nsb2NrKCk7DQojZW5k aWYNCi8qZW5kIG9mIGNhbGxmb3J0cmFucm91dGluZSovDQogICAgaWYgKGYycHlfc3VjY2Vzcykg ew0KLypweW9iamZyb20qLw0KLyplbmQgb2YgcHlvYmpmcm9tKi8NCiAgICBDRlVOQ1NNRVNTKCJC dWlsZGluZyByZXR1cm4gdmFsdWUuXG4iKTsNCiAgICBjYXBpX2J1aWxkdmFsdWUgPSBQeV9CdWls ZFZhbHVlKCIiKTsNCi8qY2xvc2VweW9iamZyb20qLw0KLyplbmQgb2YgY2xvc2VweW9iamZyb20q Lw0KICAgIH0gLyppZiAoZjJweV9zdWNjZXNzKSBhZnRlciBjYWxsZm9ydHJhbnJvdXRpbmUqLw0K LypjbGVhbnVwZnJvbXB5b2JqKi8NCiAgfSAvKkNIRUNLU0NBTEFSKHNoYXBlKGEsMCk9PWxkYSkq Lw0KICB9IC8qaWYgKGYycHlfc3VjY2Vzcykgb2YgbGRhKi8NCiAgLyogRW5kIG9mIGNsZWFuaW5n IHZhcmlhYmxlIGxkYSAqLw0KICB9IC8qaWYgKGYycHlfc3VjY2Vzcykgb2YgbiovDQogIC8qIEVu ZCBvZiBjbGVhbmluZyB2YXJpYWJsZSBuICovDQogIGlmKChQeU9iamVjdCAqKWNhcGlfaXB2dF90 bXAhPWlwdnRfY2FwaSkgew0KICAgIFB5X1hERUNSRUYoY2FwaV9pcHZ0X3RtcCk7IH0NCiAgfSAg LyppZiAoY2FwaV9pcHZ0X3RtcCA9PSBOVUxMKSAuLi4gZWxzZSBvZiBpcHZ0Ki8NCiAgLyogRW5k IG9mIGNsZWFuaW5nIHZhcmlhYmxlIGlwdnQgKi8NCiAgfSAvKmlmIChmMnB5X3N1Y2Nlc3MpIG9m IGluZm8qLw0KICAvKiBFbmQgb2YgY2xlYW5pbmcgdmFyaWFibGUgaW5mbyAqLw0KICBpZigoUHlP YmplY3QgKiljYXBpX2FfdG1wIT1hX2NhcGkpIHsNCiAgICBQeV9YREVDUkVGKGNhcGlfYV90bXAp OyB9DQogIH0gIC8qaWYgKGNhcGlfYV90bXAgPT0gTlVMTCkgLi4uIGVsc2Ugb2YgYSovDQogIC8q IEVuZCBvZiBjbGVhbmluZyB2YXJpYWJsZSBhICovDQovKmVuZCBvZiBjbGVhbnVwZnJvbXB5b2Jq Ki8NCiAgaWYgKGNhcGlfYnVpbGR2YWx1ZSA9PSBOVUxMKSB7DQovKnJvdXRkZWJ1Z2ZhaWx1cmUq Lw0KICB9IGVsc2Ugew0KLypyb3V0ZGVidWdsZWF2ZSovDQogIH0NCiAgQ0ZVTkNTTUVTUygiRnJl ZWluZyBtZW1vcnkuXG4iKTsNCi8qZnJlZW1lbSovDQojaWZkZWYgRjJQWV9SRVBPUlRfQVRFWElU DQpmMnB5X3N0b3BfY2xvY2soKTsNCiNlbmRpZg0KICByZXR1cm4gY2FwaV9idWlsZHZhbHVlOw0K fQ0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIGVuZCBvZiBkZ2VmYSAqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqIGRvdHBtYyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnN0 YXRpYyBjaGFyIGRvY19mMnB5X3JvdXRfb3B0X3NxcF9kb3RwbWNbXSA9ICJcDQpGdW5jdGlvbiBz aWduYXR1cmU6XG5cDQogIGRvdHBtYyh4LGl4LHksaXksYyxzdW0sbixpZmxhZylcblwNClJlcXVp cmVkIGFyZ3VtZW50czpcbiINCiIgIHggOiBpbnB1dCByYW5rLTEgYXJyYXkoJ2QnKSB3aXRoIGJv dW5kcyAoMSlcbiINCiIgIGl4IDogaW5wdXQgaW50XG4iDQoiICB5IDogaW5wdXQgcmFuay0xIGFy cmF5KCdkJykgd2l0aCBib3VuZHMgKDEpXG4iDQoiICBpeSA6IGlucHV0IGludFxuIg0KIiAgYyA6 IGlucHV0IGZsb2F0XG4iDQoiICBzdW0gOiBpbnB1dCBmbG9hdFxuIg0KIiAgbiA6IGlucHV0IGlu dFxuIg0KIiAgaWZsYWcgOiBpbnB1dCBpbnQiOw0KLyogZXh0ZXJuIHZvaWQgRl9GVU5DKGRvdHBt YyxET1RQTUMpKGRvdWJsZSosaW50Kixkb3VibGUqLGludCosZG91YmxlKixkb3VibGUqLGludCos aW50Kik7ICovDQpzdGF0aWMgUHlPYmplY3QgKmYycHlfcm91dF9vcHRfc3FwX2RvdHBtYyhjb25z dCBQeU9iamVjdCAqY2FwaV9zZWxmLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmpl Y3QgKmNhcGlfYXJncywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpjYXBp X2tleXdkcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpmMnB5X2Z1bmMpKGRv dWJsZSosaW50Kixkb3VibGUqLGludCosZG91YmxlKixkb3VibGUqLGludCosaW50KikpIHsNCiAg UHlPYmplY3QgKiB2b2xhdGlsZSBjYXBpX2J1aWxkdmFsdWUgPSBOVUxMOw0KICB2b2xhdGlsZSBp bnQgZjJweV9zdWNjZXNzID0gMTsNCi8qZGVjbCovDQoNCiAgZG91YmxlICp4ID0gTlVMTDsNCiAg aW50IHhfRGltc1sxXSA9IHstMX07DQogIGNvbnN0IGludCB4X1JhbmsgPSAxOw0KICBQeUFycmF5 T2JqZWN0ICpjYXBpX3hfdG1wID0gTlVMTDsNCiAgaW50IGNhcGlfeF9pbnRlbnQgPSAwOw0KICBQ eU9iamVjdCAqeF9jYXBpID0gUHlfTm9uZTsNCiAgaW50IGl4ID0gMDsNCiAgUHlPYmplY3QgKml4 X2NhcGkgPSBQeV9Ob25lOw0KICBkb3VibGUgKnkgPSBOVUxMOw0KICBpbnQgeV9EaW1zWzFdID0g ey0xfTsNCiAgY29uc3QgaW50IHlfUmFuayA9IDE7DQogIFB5QXJyYXlPYmplY3QgKmNhcGlfeV90 bXAgPSBOVUxMOw0KICBpbnQgY2FwaV95X2ludGVudCA9IDA7DQogIFB5T2JqZWN0ICp5X2NhcGkg PSBQeV9Ob25lOw0KICBpbnQgaXkgPSAwOw0KICBQeU9iamVjdCAqaXlfY2FwaSA9IFB5X05vbmU7 DQogIGRvdWJsZSBjID0gMDsNCiAgUHlPYmplY3QgKmNfY2FwaSA9IFB5X05vbmU7DQogIGRvdWJs ZSBzdW0gPSAwOw0KICBQeU9iamVjdCAqc3VtX2NhcGkgPSBQeV9Ob25lOw0KICBpbnQgbiA9IDA7 DQogIFB5T2JqZWN0ICpuX2NhcGkgPSBQeV9Ob25lOw0KICBpbnQgaWZsYWcgPSAwOw0KICBQeU9i amVjdCAqaWZsYWdfY2FwaSA9IFB5X05vbmU7DQogIHN0YXRpYyBjaGFyICpjYXBpX2t3bGlzdFtd ID0geyJ4IiwiaXgiLCJ5IiwiaXkiLCJjIiwic3VtIiwibiIsImlmbGFnIixOVUxMfTsNCg0KLypy b3V0ZGVidWdlbnRlciovDQojaWZkZWYgRjJQWV9SRVBPUlRfQVRFWElUDQpmMnB5X3N0YXJ0X2Ns b2NrKCk7DQojZW5kaWYNCiAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoY2FwaV9h cmdzLGNhcGlfa2V5d2RzLFwNCiAgICAiT09PT09PT098Om9wdF9zcXAuZG90cG1jIixcDQogICAg Y2FwaV9rd2xpc3QsJnhfY2FwaSwmaXhfY2FwaSwmeV9jYXBpLCZpeV9jYXBpLCZjX2NhcGksJnN1 bV9jYXBpLCZuX2NhcGksJmlmbGFnX2NhcGkpKQ0KICAgIHJldHVybiBOVUxMOw0KLypmcm9tcHlv YmoqLw0KICAvKiBQcm9jZXNzaW5nIHZhcmlhYmxlIGl5ICovDQogICAgZjJweV9zdWNjZXNzID0g aW50X2Zyb21fcHlvYmooJml5LGl5X2NhcGksIm9wdF9zcXAuZG90cG1jKCkgNHRoIGFyZ3VtZW50 IChpeSkgY2FuJ3QgYmUgY29udmVydGVkIHRvIGludCIpOw0KICBpZiAoZjJweV9zdWNjZXNzKSB7 DQogIC8qIFByb2Nlc3NpbmcgdmFyaWFibGUgaXggKi8NCiAgICBmMnB5X3N1Y2Nlc3MgPSBpbnRf ZnJvbV9weW9iaigmaXgsaXhfY2FwaSwib3B0X3NxcC5kb3RwbWMoKSAybmQgYXJndW1lbnQgKGl4 KSBjYW4ndCBiZSBjb252ZXJ0ZWQgdG8gaW50Iik7DQogIGlmIChmMnB5X3N1Y2Nlc3MpIHsNCiAg LyogUHJvY2Vzc2luZyB2YXJpYWJsZSBjICovDQogICAgZjJweV9zdWNjZXNzID0gZG91YmxlX2Zy b21fcHlvYmooJmMsY19jYXBpLCJvcHRfc3FwLmRvdHBtYygpIDV0aCBhcmd1bWVudCAoYykgY2Fu J3QgYmUgY29udmVydGVkIHRvIGRvdWJsZSIpOw0KICBpZiAoZjJweV9zdWNjZXNzKSB7DQogIC8q IFByb2Nlc3NpbmcgdmFyaWFibGUgc3VtICovDQogICAgZjJweV9zdWNjZXNzID0gZG91YmxlX2Zy b21fcHlvYmooJnN1bSxzdW1fY2FwaSwib3B0X3NxcC5kb3RwbWMoKSA2dGggYXJndW1lbnQgKHN1 bSkgY2FuJ3QgYmUgY29udmVydGVkIHRvIGRvdWJsZSIpOw0KICBpZiAoZjJweV9zdWNjZXNzKSB7 DQogIC8qIFByb2Nlc3NpbmcgdmFyaWFibGUgbiAqLw0KICAgIGYycHlfc3VjY2VzcyA9IGludF9m cm9tX3B5b2JqKCZuLG5fY2FwaSwib3B0X3NxcC5kb3RwbWMoKSA3dGggYXJndW1lbnQgKG4pIGNh bid0IGJlIGNvbnZlcnRlZCB0byBpbnQiKTsNCiAgaWYgKGYycHlfc3VjY2Vzcykgew0KICAvKiBQ cm9jZXNzaW5nIHZhcmlhYmxlIGlmbGFnICovDQogICAgZjJweV9zdWNjZXNzID0gaW50X2Zyb21f cHlvYmooJmlmbGFnLGlmbGFnX2NhcGksIm9wdF9zcXAuZG90cG1jKCkgOHRoIGFyZ3VtZW50IChp ZmxhZykgY2FuJ3QgYmUgY29udmVydGVkIHRvIGludCIpOw0KICBpZiAoZjJweV9zdWNjZXNzKSB7 DQogIC8qIFByb2Nlc3NpbmcgdmFyaWFibGUgeSAqLw0KICB5X0RpbXNbMF09MTsNCiAgY2FwaV95 X2ludGVudCB8PSBGMlBZX0lOVEVOVF9JTjsNCiAgY2FwaV95X3RtcCA9IGFycmF5X2Zyb21fcHlv YmooUHlBcnJheV9ET1VCTEUseV9EaW1zLHlfUmFuayxjYXBpX3lfaW50ZW50LHlfY2FwaSk7DQog IGlmIChjYXBpX3lfdG1wID09IE5VTEwpIHsNCiAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpDQog ICAgICBQeUVycl9TZXRTdHJpbmcob3B0X3NxcF9lcnJvciwiZmFpbGVkIGluIGNvbnZlcnRpbmcg M3JkIGFyZ3VtZW50IGB5JyBvZiBvcHRfc3FwLmRvdHBtYyB0byBDL0ZvcnRyYW4gYXJyYXkiICk7 DQogIH0gZWxzZSB7DQogICAgeSA9IChkb3VibGUgKikoY2FwaV95X3RtcC0+ZGF0YSk7DQogIC8q IFByb2Nlc3NpbmcgdmFyaWFibGUgeCAqLw0KICB4X0RpbXNbMF09MTsNCiAgY2FwaV94X2ludGVu dCB8PSBGMlBZX0lOVEVOVF9JTjsNCiAgY2FwaV94X3RtcCA9IGFycmF5X2Zyb21fcHlvYmooUHlB cnJheV9ET1VCTEUseF9EaW1zLHhfUmFuayxjYXBpX3hfaW50ZW50LHhfY2FwaSk7DQogIGlmIChj YXBpX3hfdG1wID09IE5VTEwpIHsNCiAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpDQogICAgICBQ eUVycl9TZXRTdHJpbmcob3B0X3NxcF9lcnJvciwiZmFpbGVkIGluIGNvbnZlcnRpbmcgMXN0IGFy Z3VtZW50IGB4JyBvZiBvcHRfc3FwLmRvdHBtYyB0byBDL0ZvcnRyYW4gYXJyYXkiICk7DQogIH0g ZWxzZSB7DQogICAgeCA9IChkb3VibGUgKikoY2FwaV94X3RtcC0+ZGF0YSk7DQovKmVuZCBvZiBm cm9tcHlvYmoqLw0KI2lmZGVmIEYyUFlfUkVQT1JUX0FURVhJVA0KZjJweV9zdGFydF9jYWxsX2Ns b2NrKCk7DQojZW5kaWYNCi8qY2FsbGZvcnRyYW5yb3V0aW5lKi8NCiAgICAgICAgKCpmMnB5X2Z1 bmMpKHgsJml4LHksJml5LCZjLCZzdW0sJm4sJmlmbGFnKTsNCiNpZmRlZiBGMlBZX1JFUE9SVF9B VEVYSVQNCmYycHlfc3RvcF9jYWxsX2Nsb2NrKCk7DQojZW5kaWYNCi8qZW5kIG9mIGNhbGxmb3J0 cmFucm91dGluZSovDQogICAgaWYgKGYycHlfc3VjY2Vzcykgew0KLypweW9iamZyb20qLw0KLypl bmQgb2YgcHlvYmpmcm9tKi8NCiAgICBDRlVOQ1NNRVNTKCJCdWlsZGluZyByZXR1cm4gdmFsdWUu XG4iKTsNCiAgICBjYXBpX2J1aWxkdmFsdWUgPSBQeV9CdWlsZFZhbHVlKCIiKTsNCi8qY2xvc2Vw eW9iamZyb20qLw0KLyplbmQgb2YgY2xvc2VweW9iamZyb20qLw0KICAgIH0gLyppZiAoZjJweV9z dWNjZXNzKSBhZnRlciBjYWxsZm9ydHJhbnJvdXRpbmUqLw0KLypjbGVhbnVwZnJvbXB5b2JqKi8N CiAgaWYoKFB5T2JqZWN0ICopY2FwaV94X3RtcCE9eF9jYXBpKSB7DQogICAgUHlfWERFQ1JFRihj YXBpX3hfdG1wKTsgfQ0KICB9ICAvKmlmIChjYXBpX3hfdG1wID09IE5VTEwpIC4uLiBlbHNlIG9m IHgqLw0KICAvKiBFbmQgb2YgY2xlYW5pbmcgdmFyaWFibGUgeCAqLw0KICBpZigoUHlPYmplY3Qg KiljYXBpX3lfdG1wIT15X2NhcGkpIHsNCiAgICBQeV9YREVDUkVGKGNhcGlfeV90bXApOyB9DQog IH0gIC8qaWYgKGNhcGlfeV90bXAgPT0gTlVMTCkgLi4uIGVsc2Ugb2YgeSovDQogIC8qIEVuZCBv ZiBjbGVhbmluZyB2YXJpYWJsZSB5ICovDQogIH0gLyppZiAoZjJweV9zdWNjZXNzKSBvZiBpZmxh ZyovDQogIC8qIEVuZCBvZiBjbGVhbmluZyB2YXJpYWJsZSBpZmxhZyAqLw0KICB9IC8qaWYgKGYy cHlfc3VjY2Vzcykgb2YgbiovDQogIC8qIEVuZCBvZiBjbGVhbmluZyB2YXJpYWJsZSBuICovDQog IH0gLyppZiAoZjJweV9zdWNjZXNzKSBvZiBzdW0qLw0KICAvKiBFbmQgb2YgY2xlYW5pbmcgdmFy aWFibGUgc3VtICovDQogIH0gLyppZiAoZjJweV9zdWNjZXNzKSBvZiBjKi8NCiAgLyogRW5kIG9m IGNsZWFuaW5nIHZhcmlhYmxlIGMgKi8NCiAgfSAvKmlmIChmMnB5X3N1Y2Nlc3MpIG9mIGl4Ki8N CiAgLyogRW5kIG9mIGNsZWFuaW5nIHZhcmlhYmxlIGl4ICovDQogIH0gLyppZiAoZjJweV9zdWNj ZXNzKSBvZiBpeSovDQogIC8qIEVuZCBvZiBjbGVhbmluZyB2YXJpYWJsZSBpeSAqLw0KLyplbmQg b2YgY2xlYW51cGZyb21weW9iaiovDQogIGlmIChjYXBpX2J1aWxkdmFsdWUgPT0gTlVMTCkgew0K Lypyb3V0ZGVidWdmYWlsdXJlKi8NCiAgfSBlbHNlIHsNCi8qcm91dGRlYnVnbGVhdmUqLw0KICB9 DQogIENGVU5DU01FU1MoIkZyZWVpbmcgbWVtb3J5LlxuIik7DQovKmZyZWVtZW0qLw0KI2lmZGVm IEYyUFlfUkVQT1JUX0FURVhJVA0KZjJweV9zdG9wX2Nsb2NrKCk7DQojZW5kaWYNCiAgcmV0dXJu IGNhcGlfYnVpbGR2YWx1ZTsNCn0NCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIGVu ZCBvZiBkb3RwbWMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KLyoqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqIGRzd2FwICoqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqLw0Kc3RhdGljIGNoYXIgZG9jX2YycHlfcm91dF9vcHRfc3FwX2Rzd2FwW10g PSAiXA0KRnVuY3Rpb24gc2lnbmF0dXJlOlxuXA0KICBkc3dhcChuLGR4LGluY3gsZHksaW5jeSlc blwNClJlcXVpcmVkIGFyZ3VtZW50czpcbiINCiIgIG4gOiBpbnB1dCBpbnRcbiINCiIgIGR4IDog aW5wdXQgcmFuay0xIGFycmF5KCdkJykgd2l0aCBib3VuZHMgKDEpXG4iDQoiICBpbmN4IDogaW5w dXQgaW50XG4iDQoiICBkeSA6IGlucHV0IHJhbmstMSBhcnJheSgnZCcpIHdpdGggYm91bmRzICgx KVxuIg0KIiAgaW5jeSA6IGlucHV0IGludCI7DQovKiBleHRlcm4gdm9pZCBGX0ZVTkMoZHN3YXAs RFNXQVApKGludCosZG91YmxlKixpbnQqLGRvdWJsZSosaW50Kik7ICovDQpzdGF0aWMgUHlPYmpl Y3QgKmYycHlfcm91dF9vcHRfc3FwX2Rzd2FwKGNvbnN0IFB5T2JqZWN0ICpjYXBpX3NlbGYsDQog ICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqY2FwaV9hcmdzLA0KICAgICAgICAg ICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmNhcGlfa2V5d2RzLA0KICAgICAgICAgICAgICAg ICAgICAgICAgICAgdm9pZCAoKmYycHlfZnVuYykoaW50Kixkb3VibGUqLGludCosZG91YmxlKixp bnQqKSkgew0KICBQeU9iamVjdCAqIHZvbGF0aWxlIGNhcGlfYnVpbGR2YWx1ZSA9IE5VTEw7DQog IHZvbGF0aWxlIGludCBmMnB5X3N1Y2Nlc3MgPSAxOw0KLypkZWNsKi8NCg0KICBpbnQgbiA9IDA7 DQogIFB5T2JqZWN0ICpuX2NhcGkgPSBQeV9Ob25lOw0KICBkb3VibGUgKmR4ID0gTlVMTDsNCiAg aW50IGR4X0RpbXNbMV0gPSB7LTF9Ow0KICBjb25zdCBpbnQgZHhfUmFuayA9IDE7DQogIFB5QXJy YXlPYmplY3QgKmNhcGlfZHhfdG1wID0gTlVMTDsNCiAgaW50IGNhcGlfZHhfaW50ZW50ID0gMDsN CiAgUHlPYmplY3QgKmR4X2NhcGkgPSBQeV9Ob25lOw0KICBpbnQgaW5jeCA9IDA7DQogIFB5T2Jq ZWN0ICppbmN4X2NhcGkgPSBQeV9Ob25lOw0KICBkb3VibGUgKmR5ID0gTlVMTDsNCiAgaW50IGR5 X0RpbXNbMV0gPSB7LTF9Ow0KICBjb25zdCBpbnQgZHlfUmFuayA9IDE7DQogIFB5QXJyYXlPYmpl Y3QgKmNhcGlfZHlfdG1wID0gTlVMTDsNCiAgaW50IGNhcGlfZHlfaW50ZW50ID0gMDsNCiAgUHlP YmplY3QgKmR5X2NhcGkgPSBQeV9Ob25lOw0KICBpbnQgaW5jeSA9IDA7DQogIFB5T2JqZWN0ICpp bmN5X2NhcGkgPSBQeV9Ob25lOw0KICBzdGF0aWMgY2hhciAqY2FwaV9rd2xpc3RbXSA9IHsibiIs ImR4IiwiaW5jeCIsImR5IiwiaW5jeSIsTlVMTH07DQoNCi8qcm91dGRlYnVnZW50ZXIqLw0KI2lm ZGVmIEYyUFlfUkVQT1JUX0FURVhJVA0KZjJweV9zdGFydF9jbG9jaygpOw0KI2VuZGlmDQogIGlm ICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGNhcGlfYXJncyxjYXBpX2tleXdkcyxcDQog ICAgIk9PT09PfDpvcHRfc3FwLmRzd2FwIixcDQogICAgY2FwaV9rd2xpc3QsJm5fY2FwaSwmZHhf Y2FwaSwmaW5jeF9jYXBpLCZkeV9jYXBpLCZpbmN5X2NhcGkpKQ0KICAgIHJldHVybiBOVUxMOw0K Lypmcm9tcHlvYmoqLw0KICAvKiBQcm9jZXNzaW5nIHZhcmlhYmxlIGR4ICovDQogIGR4X0RpbXNb MF09MTsNCiAgY2FwaV9keF9pbnRlbnQgfD0gRjJQWV9JTlRFTlRfSU47DQogIGNhcGlfZHhfdG1w ID0gYXJyYXlfZnJvbV9weW9iaihQeUFycmF5X0RPVUJMRSxkeF9EaW1zLGR4X1JhbmssY2FwaV9k eF9pbnRlbnQsZHhfY2FwaSk7DQogIGlmIChjYXBpX2R4X3RtcCA9PSBOVUxMKSB7DQogICAgaWYg KCFQeUVycl9PY2N1cnJlZCgpKQ0KICAgICAgUHlFcnJfU2V0U3RyaW5nKG9wdF9zcXBfZXJyb3Is ImZhaWxlZCBpbiBjb252ZXJ0aW5nIDJuZCBhcmd1bWVudCBgZHgnIG9mIG9wdF9zcXAuZHN3YXAg dG8gQy9Gb3J0cmFuIGFycmF5IiApOw0KICB9IGVsc2Ugew0KICAgIGR4ID0gKGRvdWJsZSAqKShj YXBpX2R4X3RtcC0+ZGF0YSk7DQogIC8qIFByb2Nlc3NpbmcgdmFyaWFibGUgZHkgKi8NCiAgZHlf RGltc1swXT0xOw0KICBjYXBpX2R5X2ludGVudCB8PSBGMlBZX0lOVEVOVF9JTjsNCiAgY2FwaV9k eV90bXAgPSBhcnJheV9mcm9tX3B5b2JqKFB5QXJyYXlfRE9VQkxFLGR5X0RpbXMsZHlfUmFuayxj YXBpX2R5X2ludGVudCxkeV9jYXBpKTsNCiAgaWYgKGNhcGlfZHlfdG1wID09IE5VTEwpIHsNCiAg ICBpZiAoIVB5RXJyX09jY3VycmVkKCkpDQogICAgICBQeUVycl9TZXRTdHJpbmcob3B0X3NxcF9l cnJvciwiZmFpbGVkIGluIGNvbnZlcnRpbmcgNHRoIGFyZ3VtZW50IGBkeScgb2Ygb3B0X3NxcC5k c3dhcCB0byBDL0ZvcnRyYW4gYXJyYXkiICk7DQogIH0gZWxzZSB7DQogICAgZHkgPSAoZG91Ymxl ICopKGNhcGlfZHlfdG1wLT5kYXRhKTsNCiAgLyogUHJvY2Vzc2luZyB2YXJpYWJsZSBpbmN4ICov DQogICAgZjJweV9zdWNjZXNzID0gaW50X2Zyb21fcHlvYmooJmluY3gsaW5jeF9jYXBpLCJvcHRf c3FwLmRzd2FwKCkgM3JkIGFyZ3VtZW50IChpbmN4KSBjYW4ndCBiZSBjb252ZXJ0ZWQgdG8gaW50 Iik7DQogIGlmIChmMnB5X3N1Y2Nlc3MpIHsNCiAgLyogUHJvY2Vzc2luZyB2YXJpYWJsZSBpbmN5 ICovDQogICAgZjJweV9zdWNjZXNzID0gaW50X2Zyb21fcHlvYmooJmluY3ksaW5jeV9jYXBpLCJv cHRfc3FwLmRzd2FwKCkgNXRoIGFyZ3VtZW50IChpbmN5KSBjYW4ndCBiZSBjb252ZXJ0ZWQgdG8g aW50Iik7DQogIGlmIChmMnB5X3N1Y2Nlc3MpIHsNCiAgLyogUHJvY2Vzc2luZyB2YXJpYWJsZSBu ICovDQogICAgZjJweV9zdWNjZXNzID0gaW50X2Zyb21fcHlvYmooJm4sbl9jYXBpLCJvcHRfc3Fw LmRzd2FwKCkgMXN0IGFyZ3VtZW50IChuKSBjYW4ndCBiZSBjb252ZXJ0ZWQgdG8gaW50Iik7DQog IGlmIChmMnB5X3N1Y2Nlc3MpIHsNCi8qZW5kIG9mIGZyb21weW9iaiovDQojaWZkZWYgRjJQWV9S RVBPUlRfQVRFWElUDQpmMnB5X3N0YXJ0X2NhbGxfY2xvY2soKTsNCiNlbmRpZg0KLypjYWxsZm9y dHJhbnJvdXRpbmUqLw0KICAgICAgICAoKmYycHlfZnVuYykoJm4sZHgsJmluY3gsZHksJmluY3kp Ow0KI2lmZGVmIEYyUFlfUkVQT1JUX0FURVhJVA0KZjJweV9zdG9wX2NhbGxfY2xvY2soKTsNCiNl bmRpZg0KLyplbmQgb2YgY2FsbGZvcnRyYW5yb3V0aW5lKi8NCiAgICBpZiAoZjJweV9zdWNjZXNz KSB7DQovKnB5b2JqZnJvbSovDQovKmVuZCBvZiBweW9iamZyb20qLw0KICAgIENGVU5DU01FU1Mo IkJ1aWxkaW5nIHJldHVybiB2YWx1ZS5cbiIpOw0KICAgIGNhcGlfYnVpbGR2YWx1ZSA9IFB5X0J1 aWxkVmFsdWUoIiIpOw0KLypjbG9zZXB5b2JqZnJvbSovDQovKmVuZCBvZiBjbG9zZXB5b2JqZnJv bSovDQogICAgfSAvKmlmIChmMnB5X3N1Y2Nlc3MpIGFmdGVyIGNhbGxmb3J0cmFucm91dGluZSov DQovKmNsZWFudXBmcm9tcHlvYmoqLw0KICB9IC8qaWYgKGYycHlfc3VjY2Vzcykgb2YgbiovDQog IC8qIEVuZCBvZiBjbGVhbmluZyB2YXJpYWJsZSBuICovDQogIH0gLyppZiAoZjJweV9zdWNjZXNz KSBvZiBpbmN5Ki8NCiAgLyogRW5kIG9mIGNsZWFuaW5nIHZhcmlhYmxlIGluY3kgKi8NCiAgfSAv KmlmIChmMnB5X3N1Y2Nlc3MpIG9mIGluY3gqLw0KICAvKiBFbmQgb2YgY2xlYW5pbmcgdmFyaWFi bGUgaW5jeCAqLw0KICBpZigoUHlPYmplY3QgKiljYXBpX2R5X3RtcCE9ZHlfY2FwaSkgew0KICAg IFB5X1hERUNSRUYoY2FwaV9keV90bXApOyB9DQogIH0gIC8qaWYgKGNhcGlfZHlfdG1wID09IE5V TEwpIC4uLiBlbHNlIG9mIGR5Ki8NCiAgLyogRW5kIG9mIGNsZWFuaW5nIHZhcmlhYmxlIGR5ICov DQogIGlmKChQeU9iamVjdCAqKWNhcGlfZHhfdG1wIT1keF9jYXBpKSB7DQogICAgUHlfWERFQ1JF RihjYXBpX2R4X3RtcCk7IH0NCiAgfSAgLyppZiAoY2FwaV9keF90bXAgPT0gTlVMTCkgLi4uIGVs c2Ugb2YgZHgqLw0KICAvKiBFbmQgb2YgY2xlYW5pbmcgdmFyaWFibGUgZHggKi8NCi8qZW5kIG9m IGNsZWFudXBmcm9tcHlvYmoqLw0KICBpZiAoY2FwaV9idWlsZHZhbHVlID09IE5VTEwpIHsNCi8q cm91dGRlYnVnZmFpbHVyZSovDQogIH0gZWxzZSB7DQovKnJvdXRkZWJ1Z2xlYXZlKi8NCiAgfQ0K ICBDRlVOQ1NNRVNTKCJGcmVlaW5nIG1lbW9yeS5cbiIpOw0KLypmcmVlbWVtKi8NCiNpZmRlZiBG MlBZX1JFUE9SVF9BVEVYSVQNCmYycHlfc3RvcF9jbG9jaygpOw0KI2VuZGlmDQogIHJldHVybiBj YXBpX2J1aWxkdmFsdWU7DQp9DQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogZW5k IG9mIGRzd2FwICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQovKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKiogZGF4cHkgKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKiovDQpzdGF0aWMgY2hhciBkb2NfZjJweV9yb3V0X29wdF9zcXBfZGF4cHlbXSA9 ICJcDQpGdW5jdGlvbiBzaWduYXR1cmU6XG5cDQogIGRheHB5KG4sZGEsZHgsaW5jeCxkeSxpbmN5 KVxuXA0KUmVxdWlyZWQgYXJndW1lbnRzOlxuIg0KIiAgbiA6IGlucHV0IGludFxuIg0KIiAgZGEg OiBpbnB1dCBmbG9hdFxuIg0KIiAgZHggOiBpbnB1dCByYW5rLTEgYXJyYXkoJ2QnKSB3aXRoIGJv dW5kcyAoMSlcbiINCiIgIGluY3ggOiBpbnB1dCBpbnRcbiINCiIgIGR5IDogaW5wdXQgcmFuay0x IGFycmF5KCdkJykgd2l0aCBib3VuZHMgKDEpXG4iDQoiICBpbmN5IDogaW5wdXQgaW50IjsNCi8q IGV4dGVybiB2b2lkIEZfRlVOQyhkYXhweSxEQVhQWSkoaW50Kixkb3VibGUqLGRvdWJsZSosaW50 Kixkb3VibGUqLGludCopOyAqLw0Kc3RhdGljIFB5T2JqZWN0ICpmMnB5X3JvdXRfb3B0X3NxcF9k YXhweShjb25zdCBQeU9iamVjdCAqY2FwaV9zZWxmLA0KICAgICAgICAgICAgICAgICAgICAgICAg ICAgUHlPYmplY3QgKmNhcGlfYXJncywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2Jq ZWN0ICpjYXBpX2tleXdkcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpmMnB5 X2Z1bmMpKGludCosZG91YmxlKixkb3VibGUqLGludCosZG91YmxlKixpbnQqKSkgew0KICBQeU9i amVjdCAqIHZvbGF0aWxlIGNhcGlfYnVpbGR2YWx1ZSA9IE5VTEw7DQogIHZvbGF0aWxlIGludCBm MnB5X3N1Y2Nlc3MgPSAxOw0KLypkZWNsKi8NCg0KICBpbnQgbiA9IDA7DQogIFB5T2JqZWN0ICpu X2NhcGkgPSBQeV9Ob25lOw0KICBkb3VibGUgZGEgPSAwOw0KICBQeU9iamVjdCAqZGFfY2FwaSA9 IFB5X05vbmU7DQogIGRvdWJsZSAqZHggPSBOVUxMOw0KICBpbnQgZHhfRGltc1sxXSA9IHstMX07 DQogIGNvbnN0IGludCBkeF9SYW5rID0gMTsNCiAgUHlBcnJheU9iamVjdCAqY2FwaV9keF90bXAg PSBOVUxMOw0KICBpbnQgY2FwaV9keF9pbnRlbnQgPSAwOw0KICBQeU9iamVjdCAqZHhfY2FwaSA9 IFB5X05vbmU7DQogIGludCBpbmN4ID0gMDsNCiAgUHlPYmplY3QgKmluY3hfY2FwaSA9IFB5X05v bmU7DQogIGRvdWJsZSAqZHkgPSBOVUxMOw0KICBpbnQgZHlfRGltc1sxXSA9IHstMX07DQogIGNv bnN0IGludCBkeV9SYW5rID0gMTsNCiAgUHlBcnJheU9iamVjdCAqY2FwaV9keV90bXAgPSBOVUxM Ow0KICBpbnQgY2FwaV9keV9pbnRlbnQgPSAwOw0KICBQeU9iamVjdCAqZHlfY2FwaSA9IFB5X05v bmU7DQogIGludCBpbmN5ID0gMDsNCiAgUHlPYmplY3QgKmluY3lfY2FwaSA9IFB5X05vbmU7DQog IHN0YXRpYyBjaGFyICpjYXBpX2t3bGlzdFtdID0geyJuIiwiZGEiLCJkeCIsImluY3giLCJkeSIs ImluY3kiLE5VTEx9Ow0KDQovKnJvdXRkZWJ1Z2VudGVyKi8NCiNpZmRlZiBGMlBZX1JFUE9SVF9B VEVYSVQNCmYycHlfc3RhcnRfY2xvY2soKTsNCiNlbmRpZg0KICBpZiAoIVB5QXJnX1BhcnNlVHVw bGVBbmRLZXl3b3JkcyhjYXBpX2FyZ3MsY2FwaV9rZXl3ZHMsXA0KICAgICJPT09PT098Om9wdF9z cXAuZGF4cHkiLFwNCiAgICBjYXBpX2t3bGlzdCwmbl9jYXBpLCZkYV9jYXBpLCZkeF9jYXBpLCZp bmN4X2NhcGksJmR5X2NhcGksJmluY3lfY2FwaSkpDQogICAgcmV0dXJuIE5VTEw7DQovKmZyb21w eW9iaiovDQogIC8qIFByb2Nlc3NpbmcgdmFyaWFibGUgZHggKi8NCiAgZHhfRGltc1swXT0xOw0K ICBjYXBpX2R4X2ludGVudCB8PSBGMlBZX0lOVEVOVF9JTjsNCiAgY2FwaV9keF90bXAgPSBhcnJh eV9mcm9tX3B5b2JqKFB5QXJyYXlfRE9VQkxFLGR4X0RpbXMsZHhfUmFuayxjYXBpX2R4X2ludGVu dCxkeF9jYXBpKTsNCiAgaWYgKGNhcGlfZHhfdG1wID09IE5VTEwpIHsNCiAgICBpZiAoIVB5RXJy X09jY3VycmVkKCkpDQogICAgICBQeUVycl9TZXRTdHJpbmcob3B0X3NxcF9lcnJvciwiZmFpbGVk IGluIGNvbnZlcnRpbmcgM3JkIGFyZ3VtZW50IGBkeCcgb2Ygb3B0X3NxcC5kYXhweSB0byBDL0Zv cnRyYW4gYXJyYXkiICk7DQogIH0gZWxzZSB7DQogICAgZHggPSAoZG91YmxlICopKGNhcGlfZHhf dG1wLT5kYXRhKTsNCiAgLyogUHJvY2Vzc2luZyB2YXJpYWJsZSBkeSAqLw0KICBkeV9EaW1zWzBd PTE7DQogIGNhcGlfZHlfaW50ZW50IHw9IEYyUFlfSU5URU5UX0lOOw0KICBjYXBpX2R5X3RtcCA9 IGFycmF5X2Zyb21fcHlvYmooUHlBcnJheV9ET1VCTEUsZHlfRGltcyxkeV9SYW5rLGNhcGlfZHlf aW50ZW50LGR5X2NhcGkpOw0KICBpZiAoY2FwaV9keV90bXAgPT0gTlVMTCkgew0KICAgIGlmICgh UHlFcnJfT2NjdXJyZWQoKSkNCiAgICAgIFB5RXJyX1NldFN0cmluZyhvcHRfc3FwX2Vycm9yLCJm YWlsZWQgaW4gY29udmVydGluZyA1dGggYXJndW1lbnQgYGR5JyBvZiBvcHRfc3FwLmRheHB5IHRv IEMvRm9ydHJhbiBhcnJheSIgKTsNCiAgfSBlbHNlIHsNCiAgICBkeSA9IChkb3VibGUgKikoY2Fw aV9keV90bXAtPmRhdGEpOw0KICAvKiBQcm9jZXNzaW5nIHZhcmlhYmxlIGluY3ggKi8NCiAgICBm MnB5X3N1Y2Nlc3MgPSBpbnRfZnJvbV9weW9iaigmaW5jeCxpbmN4X2NhcGksIm9wdF9zcXAuZGF4 cHkoKSA0dGggYXJndW1lbnQgKGluY3gpIGNhbid0IGJlIGNvbnZlcnRlZCB0byBpbnQiKTsNCiAg aWYgKGYycHlfc3VjY2Vzcykgew0KICAvKiBQcm9jZXNzaW5nIHZhcmlhYmxlIGluY3kgKi8NCiAg ICBmMnB5X3N1Y2Nlc3MgPSBpbnRfZnJvbV9weW9iaigmaW5jeSxpbmN5X2NhcGksIm9wdF9zcXAu ZGF4cHkoKSA2dGggYXJndW1lbnQgKGluY3kpIGNhbid0IGJlIGNvbnZlcnRlZCB0byBpbnQiKTsN CiAgaWYgKGYycHlfc3VjY2Vzcykgew0KICAvKiBQcm9jZXNzaW5nIHZhcmlhYmxlIG4gKi8NCiAg ICBmMnB5X3N1Y2Nlc3MgPSBpbnRfZnJvbV9weW9iaigmbixuX2NhcGksIm9wdF9zcXAuZGF4cHko KSAxc3QgYXJndW1lbnQgKG4pIGNhbid0IGJlIGNvbnZlcnRlZCB0byBpbnQiKTsNCiAgaWYgKGYy cHlfc3VjY2Vzcykgew0KICAvKiBQcm9jZXNzaW5nIHZhcmlhYmxlIGRhICovDQogICAgZjJweV9z dWNjZXNzID0gZG91YmxlX2Zyb21fcHlvYmooJmRhLGRhX2NhcGksIm9wdF9zcXAuZGF4cHkoKSAy bmQgYXJndW1lbnQgKGRhKSBjYW4ndCBiZSBjb252ZXJ0ZWQgdG8gZG91YmxlIik7DQogIGlmIChm MnB5X3N1Y2Nlc3MpIHsNCi8qZW5kIG9mIGZyb21weW9iaiovDQojaWZkZWYgRjJQWV9SRVBPUlRf QVRFWElUDQpmMnB5X3N0YXJ0X2NhbGxfY2xvY2soKTsNCiNlbmRpZg0KLypjYWxsZm9ydHJhbnJv dXRpbmUqLw0KICAgICAgICAoKmYycHlfZnVuYykoJm4sJmRhLGR4LCZpbmN4LGR5LCZpbmN5KTsN CiNpZmRlZiBGMlBZX1JFUE9SVF9BVEVYSVQNCmYycHlfc3RvcF9jYWxsX2Nsb2NrKCk7DQojZW5k aWYNCi8qZW5kIG9mIGNhbGxmb3J0cmFucm91dGluZSovDQogICAgaWYgKGYycHlfc3VjY2Vzcykg ew0KLypweW9iamZyb20qLw0KLyplbmQgb2YgcHlvYmpmcm9tKi8NCiAgICBDRlVOQ1NNRVNTKCJC dWlsZGluZyByZXR1cm4gdmFsdWUuXG4iKTsNCiAgICBjYXBpX2J1aWxkdmFsdWUgPSBQeV9CdWls ZFZhbHVlKCIiKTsNCi8qY2xvc2VweW9iamZyb20qLw0KLyplbmQgb2YgY2xvc2VweW9iamZyb20q Lw0KICAgIH0gLyppZiAoZjJweV9zdWNjZXNzKSBhZnRlciBjYWxsZm9ydHJhbnJvdXRpbmUqLw0K LypjbGVhbnVwZnJvbXB5b2JqKi8NCiAgfSAvKmlmIChmMnB5X3N1Y2Nlc3MpIG9mIGRhKi8NCiAg LyogRW5kIG9mIGNsZWFuaW5nIHZhcmlhYmxlIGRhICovDQogIH0gLyppZiAoZjJweV9zdWNjZXNz KSBvZiBuKi8NCiAgLyogRW5kIG9mIGNsZWFuaW5nIHZhcmlhYmxlIG4gKi8NCiAgfSAvKmlmIChm MnB5X3N1Y2Nlc3MpIG9mIGluY3kqLw0KICAvKiBFbmQgb2YgY2xlYW5pbmcgdmFyaWFibGUgaW5j eSAqLw0KICB9IC8qaWYgKGYycHlfc3VjY2Vzcykgb2YgaW5jeCovDQogIC8qIEVuZCBvZiBjbGVh bmluZyB2YXJpYWJsZSBpbmN4ICovDQogIGlmKChQeU9iamVjdCAqKWNhcGlfZHlfdG1wIT1keV9j YXBpKSB7DQogICAgUHlfWERFQ1JFRihjYXBpX2R5X3RtcCk7IH0NCiAgfSAgLyppZiAoY2FwaV9k eV90bXAgPT0gTlVMTCkgLi4uIGVsc2Ugb2YgZHkqLw0KICAvKiBFbmQgb2YgY2xlYW5pbmcgdmFy aWFibGUgZHkgKi8NCiAgaWYoKFB5T2JqZWN0ICopY2FwaV9keF90bXAhPWR4X2NhcGkpIHsNCiAg ICBQeV9YREVDUkVGKGNhcGlfZHhfdG1wKTsgfQ0KICB9ICAvKmlmIChjYXBpX2R4X3RtcCA9PSBO VUxMKSAuLi4gZWxzZSBvZiBkeCovDQogIC8qIEVuZCBvZiBjbGVhbmluZyB2YXJpYWJsZSBkeCAq Lw0KLyplbmQgb2YgY2xlYW51cGZyb21weW9iaiovDQogIGlmIChjYXBpX2J1aWxkdmFsdWUgPT0g TlVMTCkgew0KLypyb3V0ZGVidWdmYWlsdXJlKi8NCiAgfSBlbHNlIHsNCi8qcm91dGRlYnVnbGVh dmUqLw0KICB9DQogIENGVU5DU01FU1MoIkZyZWVpbmcgbWVtb3J5LlxuIik7DQovKmZyZWVtZW0q Lw0KI2lmZGVmIEYyUFlfUkVQT1JUX0FURVhJVA0KZjJweV9zdG9wX2Nsb2NrKCk7DQojZW5kaWYN CiAgcmV0dXJuIGNhcGlfYnVpbGR2YWx1ZTsNCn0NCi8qKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKiBlbmQgb2YgZGF4cHkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoN Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogZGRvdCAqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKiovDQpzdGF0aWMgY2hhciBkb2NfZjJweV9yb3V0X29wdF9z cXBfZGRvdFtdID0gIlwNCkZ1bmN0aW9uIHNpZ25hdHVyZTpcblwNCiAgZGRvdCA9IGRkb3Qobixk eCxpbmN4LGR5LGluY3kpXG5cDQpSZXF1aXJlZCBhcmd1bWVudHM6XG4iDQoiICBuIDogaW5wdXQg aW50XG4iDQoiICBkeCA6IGlucHV0IHJhbmstMSBhcnJheSgnZCcpIHdpdGggYm91bmRzICgxKVxu Ig0KIiAgaW5jeCA6IGlucHV0IGludFxuIg0KIiAgZHkgOiBpbnB1dCByYW5rLTEgYXJyYXkoJ2Qn KSB3aXRoIGJvdW5kcyAoMSlcbiINCiIgIGluY3kgOiBpbnB1dCBpbnRcbiINCiJSZXR1cm4gb2Jq ZWN0czpcbiINCiIgIGRkb3QgOiBmbG9hdCI7DQovKiBleHRlcm4gdm9pZCBGX1dSQVBQRURGVU5D KGRkb3QsRERPVCkoZG91YmxlKixpbnQqLGRvdWJsZSosaW50Kixkb3VibGUqLGludCopOyAqLw0K c3RhdGljIFB5T2JqZWN0ICpmMnB5X3JvdXRfb3B0X3NxcF9kZG90KGNvbnN0IFB5T2JqZWN0ICpj YXBpX3NlbGYsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqY2FwaV9hcmdz LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmNhcGlfa2V5d2RzLA0KICAg ICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKmYycHlfZnVuYykoZG91YmxlKixpbnQqLGRv dWJsZSosaW50Kixkb3VibGUqLGludCopKSB7DQogIFB5T2JqZWN0ICogdm9sYXRpbGUgY2FwaV9i dWlsZHZhbHVlID0gTlVMTDsNCiAgdm9sYXRpbGUgaW50IGYycHlfc3VjY2VzcyA9IDE7DQovKmRl Y2wqLw0KDQogIGRvdWJsZSBkZG90ID0gMDsNCiAgaW50IG4gPSAwOw0KICBQeU9iamVjdCAqbl9j YXBpID0gUHlfTm9uZTsNCiAgZG91YmxlICpkeCA9IE5VTEw7DQogIGludCBkeF9EaW1zWzFdID0g ey0xfTsNCiAgY29uc3QgaW50IGR4X1JhbmsgPSAxOw0KICBQeUFycmF5T2JqZWN0ICpjYXBpX2R4 X3RtcCA9IE5VTEw7DQogIGludCBjYXBpX2R4X2ludGVudCA9IDA7DQogIFB5T2JqZWN0ICpkeF9j YXBpID0gUHlfTm9uZTsNCiAgaW50IGluY3ggPSAwOw0KICBQeU9iamVjdCAqaW5jeF9jYXBpID0g UHlfTm9uZTsNCiAgZG91YmxlICpkeSA9IE5VTEw7DQogIGludCBkeV9EaW1zWzFdID0gey0xfTsN CiAgY29uc3QgaW50IGR5X1JhbmsgPSAxOw0KICBQeUFycmF5T2JqZWN0ICpjYXBpX2R5X3RtcCA9 IE5VTEw7DQogIGludCBjYXBpX2R5X2ludGVudCA9IDA7DQogIFB5T2JqZWN0ICpkeV9jYXBpID0g UHlfTm9uZTsNCiAgaW50IGluY3kgPSAwOw0KICBQeU9iamVjdCAqaW5jeV9jYXBpID0gUHlfTm9u ZTsNCiAgc3RhdGljIGNoYXIgKmNhcGlfa3dsaXN0W10gPSB7Im4iLCJkeCIsImluY3giLCJkeSIs ImluY3kiLE5VTEx9Ow0KDQovKnJvdXRkZWJ1Z2VudGVyKi8NCiNpZmRlZiBGMlBZX1JFUE9SVF9B VEVYSVQNCmYycHlfc3RhcnRfY2xvY2soKTsNCiNlbmRpZg0KICBpZiAoIVB5QXJnX1BhcnNlVHVw bGVBbmRLZXl3b3JkcyhjYXBpX2FyZ3MsY2FwaV9rZXl3ZHMsXA0KICAgICJPT09PT3w6b3B0X3Nx cC5kZG90IixcDQogICAgY2FwaV9rd2xpc3QsJm5fY2FwaSwmZHhfY2FwaSwmaW5jeF9jYXBpLCZk eV9jYXBpLCZpbmN5X2NhcGkpKQ0KICAgIHJldHVybiBOVUxMOw0KLypmcm9tcHlvYmoqLw0KICAv KiBQcm9jZXNzaW5nIHZhcmlhYmxlIGRkb3QgKi8NCiAgLyogUHJvY2Vzc2luZyB2YXJpYWJsZSBk eCAqLw0KICBkeF9EaW1zWzBdPTE7DQogIGNhcGlfZHhfaW50ZW50IHw9IEYyUFlfSU5URU5UX0lO Ow0KICBjYXBpX2R4X3RtcCA9IGFycmF5X2Zyb21fcHlvYmooUHlBcnJheV9ET1VCTEUsZHhfRGlt cyxkeF9SYW5rLGNhcGlfZHhfaW50ZW50LGR4X2NhcGkpOw0KICBpZiAoY2FwaV9keF90bXAgPT0g TlVMTCkgew0KICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkNCiAgICAgIFB5RXJyX1NldFN0cmlu ZyhvcHRfc3FwX2Vycm9yLCJmYWlsZWQgaW4gY29udmVydGluZyAybmQgYXJndW1lbnQgYGR4JyBv ZiBvcHRfc3FwLmRkb3QgdG8gQy9Gb3J0cmFuIGFycmF5IiApOw0KICB9IGVsc2Ugew0KICAgIGR4 ID0gKGRvdWJsZSAqKShjYXBpX2R4X3RtcC0+ZGF0YSk7DQogIC8qIFByb2Nlc3NpbmcgdmFyaWFi bGUgZHkgKi8NCiAgZHlfRGltc1swXT0xOw0KICBjYXBpX2R5X2ludGVudCB8PSBGMlBZX0lOVEVO VF9JTjsNCiAgY2FwaV9keV90bXAgPSBhcnJheV9mcm9tX3B5b2JqKFB5QXJyYXlfRE9VQkxFLGR5 X0RpbXMsZHlfUmFuayxjYXBpX2R5X2ludGVudCxkeV9jYXBpKTsNCiAgaWYgKGNhcGlfZHlfdG1w ID09IE5VTEwpIHsNCiAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpDQogICAgICBQeUVycl9TZXRT dHJpbmcob3B0X3NxcF9lcnJvciwiZmFpbGVkIGluIGNvbnZlcnRpbmcgNHRoIGFyZ3VtZW50IGBk eScgb2Ygb3B0X3NxcC5kZG90IHRvIEMvRm9ydHJhbiBhcnJheSIgKTsNCiAgfSBlbHNlIHsNCiAg ICBkeSA9IChkb3VibGUgKikoY2FwaV9keV90bXAtPmRhdGEpOw0KICAvKiBQcm9jZXNzaW5nIHZh cmlhYmxlIGluY3ggKi8NCiAgICBmMnB5X3N1Y2Nlc3MgPSBpbnRfZnJvbV9weW9iaigmaW5jeCxp bmN4X2NhcGksIm9wdF9zcXAuZGRvdCgpIDNyZCBhcmd1bWVudCAoaW5jeCkgY2FuJ3QgYmUgY29u dmVydGVkIHRvIGludCIpOw0KICBpZiAoZjJweV9zdWNjZXNzKSB7DQogIC8qIFByb2Nlc3Npbmcg dmFyaWFibGUgaW5jeSAqLw0KICAgIGYycHlfc3VjY2VzcyA9IGludF9mcm9tX3B5b2JqKCZpbmN5 LGluY3lfY2FwaSwib3B0X3NxcC5kZG90KCkgNXRoIGFyZ3VtZW50IChpbmN5KSBjYW4ndCBiZSBj b252ZXJ0ZWQgdG8gaW50Iik7DQogIGlmIChmMnB5X3N1Y2Nlc3MpIHsNCiAgLyogUHJvY2Vzc2lu ZyB2YXJpYWJsZSBuICovDQogICAgZjJweV9zdWNjZXNzID0gaW50X2Zyb21fcHlvYmooJm4sbl9j YXBpLCJvcHRfc3FwLmRkb3QoKSAxc3QgYXJndW1lbnQgKG4pIGNhbid0IGJlIGNvbnZlcnRlZCB0 byBpbnQiKTsNCiAgaWYgKGYycHlfc3VjY2Vzcykgew0KLyplbmQgb2YgZnJvbXB5b2JqKi8NCiNp ZmRlZiBGMlBZX1JFUE9SVF9BVEVYSVQNCmYycHlfc3RhcnRfY2FsbF9jbG9jaygpOw0KI2VuZGlm DQovKmNhbGxmb3J0cmFucm91dGluZSovDQogICgqZjJweV9mdW5jKSgmZGRvdCwmbixkeCwmaW5j eCxkeSwmaW5jeSk7DQojaWZkZWYgRjJQWV9SRVBPUlRfQVRFWElUDQpmMnB5X3N0b3BfY2FsbF9j bG9jaygpOw0KI2VuZGlmDQovKmVuZCBvZiBjYWxsZm9ydHJhbnJvdXRpbmUqLw0KICAgIGlmIChm MnB5X3N1Y2Nlc3MpIHsNCi8qcHlvYmpmcm9tKi8NCi8qZW5kIG9mIHB5b2JqZnJvbSovDQogICAg Q0ZVTkNTTUVTUygiQnVpbGRpbmcgcmV0dXJuIHZhbHVlLlxuIik7DQogICAgY2FwaV9idWlsZHZh bHVlID0gUHlfQnVpbGRWYWx1ZSgiZCIsZGRvdCk7DQovKmNsb3NlcHlvYmpmcm9tKi8NCi8qZW5k IG9mIGNsb3NlcHlvYmpmcm9tKi8NCiAgICB9IC8qaWYgKGYycHlfc3VjY2VzcykgYWZ0ZXIgY2Fs bGZvcnRyYW5yb3V0aW5lKi8NCi8qY2xlYW51cGZyb21weW9iaiovDQogIH0gLyppZiAoZjJweV9z dWNjZXNzKSBvZiBuKi8NCiAgLyogRW5kIG9mIGNsZWFuaW5nIHZhcmlhYmxlIG4gKi8NCiAgfSAv KmlmIChmMnB5X3N1Y2Nlc3MpIG9mIGluY3kqLw0KICAvKiBFbmQgb2YgY2xlYW5pbmcgdmFyaWFi bGUgaW5jeSAqLw0KICB9IC8qaWYgKGYycHlfc3VjY2Vzcykgb2YgaW5jeCovDQogIC8qIEVuZCBv ZiBjbGVhbmluZyB2YXJpYWJsZSBpbmN4ICovDQogIGlmKChQeU9iamVjdCAqKWNhcGlfZHlfdG1w IT1keV9jYXBpKSB7DQogICAgUHlfWERFQ1JFRihjYXBpX2R5X3RtcCk7IH0NCiAgfSAgLyppZiAo Y2FwaV9keV90bXAgPT0gTlVMTCkgLi4uIGVsc2Ugb2YgZHkqLw0KICAvKiBFbmQgb2YgY2xlYW5p bmcgdmFyaWFibGUgZHkgKi8NCiAgaWYoKFB5T2JqZWN0ICopY2FwaV9keF90bXAhPWR4X2NhcGkp IHsNCiAgICBQeV9YREVDUkVGKGNhcGlfZHhfdG1wKTsgfQ0KICB9ICAvKmlmIChjYXBpX2R4X3Rt cCA9PSBOVUxMKSAuLi4gZWxzZSBvZiBkeCovDQogIC8qIEVuZCBvZiBjbGVhbmluZyB2YXJpYWJs ZSBkeCAqLw0KICAvKiBFbmQgb2YgY2xlYW5pbmcgdmFyaWFibGUgZGRvdCAqLw0KLyplbmQgb2Yg Y2xlYW51cGZyb21weW9iaiovDQogIGlmIChjYXBpX2J1aWxkdmFsdWUgPT0gTlVMTCkgew0KLypy b3V0ZGVidWdmYWlsdXJlKi8NCiAgfSBlbHNlIHsNCi8qcm91dGRlYnVnbGVhdmUqLw0KICB9DQog IENGVU5DU01FU1MoIkZyZWVpbmcgbWVtb3J5LlxuIik7DQovKmZyZWVtZW0qLw0KI2lmZGVmIEYy UFlfUkVQT1JUX0FURVhJVA0KZjJweV9zdG9wX2Nsb2NrKCk7DQojZW5kaWYNCiAgcmV0dXJuIGNh cGlfYnVpbGR2YWx1ZTsNCn0NCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBlbmQg b2YgZGRvdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KLyoqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqIGRnZWRpICoqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqLw0Kc3RhdGljIGNoYXIgZG9jX2YycHlfcm91dF9vcHRfc3FwX2RnZWRpW10gPSAi XA0KRnVuY3Rpb24gc2lnbmF0dXJlOlxuXA0KICBkZ2VkaShhLG4saXB2dCxkZXQsd29yayxqb2Is W2xkYV0pXG5cDQpSZXF1aXJlZCBhcmd1bWVudHM6XG4iDQoiICBhIDogaW5wdXQgcmFuay0yIGFy cmF5KCdkJykgd2l0aCBib3VuZHMgKGxkYSwxKVxuIg0KIiAgbiA6IGlucHV0IGludFxuIg0KIiAg aXB2dCA6IGlucHV0IHJhbmstMSBhcnJheSgnaScpIHdpdGggYm91bmRzICgxKVxuIg0KIiAgZGV0 IDogaW5wdXQgcmFuay0xIGFycmF5KCdkJykgd2l0aCBib3VuZHMgKDIpXG4iDQoiICB3b3JrIDog aW5wdXQgcmFuay0xIGFycmF5KCdkJykgd2l0aCBib3VuZHMgKDEpXG4iDQoiICBqb2IgOiBpbnB1 dCBpbnRcbiINCiJPcHRpb25hbCBhcmd1bWVudHM6XG4iDQoiICBsZGEgOj0gc2hhcGUoYSwwKSBp bnB1dCBpbnQiOw0KLyogZXh0ZXJuIHZvaWQgRl9GVU5DKGRnZWRpLERHRURJKShkb3VibGUqLGlu dCosaW50KixpbnQqLGRvdWJsZSosZG91YmxlKixpbnQqKTsgKi8NCnN0YXRpYyBQeU9iamVjdCAq ZjJweV9yb3V0X29wdF9zcXBfZGdlZGkoY29uc3QgUHlPYmplY3QgKmNhcGlfc2VsZiwNCiAgICAg ICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpjYXBpX2FyZ3MsDQogICAgICAgICAgICAg ICAgICAgICAgICAgICBQeU9iamVjdCAqY2FwaV9rZXl3ZHMsDQogICAgICAgICAgICAgICAgICAg ICAgICAgICB2b2lkICgqZjJweV9mdW5jKShkb3VibGUqLGludCosaW50KixpbnQqLGRvdWJsZSos ZG91YmxlKixpbnQqKSkgew0KICBQeU9iamVjdCAqIHZvbGF0aWxlIGNhcGlfYnVpbGR2YWx1ZSA9 IE5VTEw7DQogIHZvbGF0aWxlIGludCBmMnB5X3N1Y2Nlc3MgPSAxOw0KLypkZWNsKi8NCg0KICBk b3VibGUgKmEgPSBOVUxMOw0KICBpbnQgYV9EaW1zWzJdID0gey0xLCAtMX07DQogIGNvbnN0IGlu dCBhX1JhbmsgPSAyOw0KICBQeUFycmF5T2JqZWN0ICpjYXBpX2FfdG1wID0gTlVMTDsNCiAgaW50 IGNhcGlfYV9pbnRlbnQgPSAwOw0KICBQeU9iamVjdCAqYV9jYXBpID0gUHlfTm9uZTsNCiAgaW50 IGxkYSA9IDA7DQogIFB5T2JqZWN0ICpsZGFfY2FwaSA9IFB5X05vbmU7DQogIGludCBuID0gMDsN CiAgUHlPYmplY3QgKm5fY2FwaSA9IFB5X05vbmU7DQogIGludCAqaXB2dCA9IE5VTEw7DQogIGlu dCBpcHZ0X0RpbXNbMV0gPSB7LTF9Ow0KICBjb25zdCBpbnQgaXB2dF9SYW5rID0gMTsNCiAgUHlB cnJheU9iamVjdCAqY2FwaV9pcHZ0X3RtcCA9IE5VTEw7DQogIGludCBjYXBpX2lwdnRfaW50ZW50 ID0gMDsNCiAgUHlPYmplY3QgKmlwdnRfY2FwaSA9IFB5X05vbmU7DQogIGRvdWJsZSAqZGV0ID0g TlVMTDsNCiAgaW50IGRldF9EaW1zWzFdID0gey0xfTsNCiAgY29uc3QgaW50IGRldF9SYW5rID0g MTsNCiAgUHlBcnJheU9iamVjdCAqY2FwaV9kZXRfdG1wID0gTlVMTDsNCiAgaW50IGNhcGlfZGV0 X2ludGVudCA9IDA7DQogIFB5T2JqZWN0ICpkZXRfY2FwaSA9IFB5X05vbmU7DQogIGRvdWJsZSAq d29yayA9IE5VTEw7DQogIGludCB3b3JrX0RpbXNbMV0gPSB7LTF9Ow0KICBjb25zdCBpbnQgd29y a19SYW5rID0gMTsNCiAgUHlBcnJheU9iamVjdCAqY2FwaV93b3JrX3RtcCA9IE5VTEw7DQogIGlu dCBjYXBpX3dvcmtfaW50ZW50ID0gMDsNCiAgUHlPYmplY3QgKndvcmtfY2FwaSA9IFB5X05vbmU7 DQogIGludCBqb2IgPSAwOw0KICBQeU9iamVjdCAqam9iX2NhcGkgPSBQeV9Ob25lOw0KICBzdGF0 aWMgY2hhciAqY2FwaV9rd2xpc3RbXSA9IHsiYSIsIm4iLCJpcHZ0IiwiZGV0Iiwid29yayIsImpv YiIsImxkYSIsTlVMTH07DQoNCi8qcm91dGRlYnVnZW50ZXIqLw0KI2lmZGVmIEYyUFlfUkVQT1JU X0FURVhJVA0KZjJweV9zdGFydF9jbG9jaygpOw0KI2VuZGlmDQogIGlmICghUHlBcmdfUGFyc2VU dXBsZUFuZEtleXdvcmRzKGNhcGlfYXJncyxjYXBpX2tleXdkcyxcDQogICAgIk9PT09PT3xPOm9w dF9zcXAuZGdlZGkiLFwNCiAgICBjYXBpX2t3bGlzdCwmYV9jYXBpLCZuX2NhcGksJmlwdnRfY2Fw aSwmZGV0X2NhcGksJndvcmtfY2FwaSwmam9iX2NhcGksJmxkYV9jYXBpKSkNCiAgICByZXR1cm4g TlVMTDsNCi8qZnJvbXB5b2JqKi8NCiAgLyogUHJvY2Vzc2luZyB2YXJpYWJsZSBhICovDQogIGFf RGltc1sxXT0xOw0KICBjYXBpX2FfaW50ZW50IHw9IEYyUFlfSU5URU5UX0lOOw0KICBjYXBpX2Ff dG1wID0gYXJyYXlfZnJvbV9weW9iaihQeUFycmF5X0RPVUJMRSxhX0RpbXMsYV9SYW5rLGNhcGlf YV9pbnRlbnQsYV9jYXBpKTsNCiAgaWYgKGNhcGlfYV90bXAgPT0gTlVMTCkgew0KICAgIGlmICgh UHlFcnJfT2NjdXJyZWQoKSkNCiAgICAgIFB5RXJyX1NldFN0cmluZyhvcHRfc3FwX2Vycm9yLCJm YWlsZWQgaW4gY29udmVydGluZyAxc3QgYXJndW1lbnQgYGEnIG9mIG9wdF9zcXAuZGdlZGkgdG8g Qy9Gb3J0cmFuIGFycmF5IiApOw0KICB9IGVsc2Ugew0KICAgIGEgPSAoZG91YmxlICopKGNhcGlf YV90bXAtPmRhdGEpOw0KICAvKiBQcm9jZXNzaW5nIHZhcmlhYmxlIGlwdnQgKi8NCiAgaXB2dF9E aW1zWzBdPTE7DQogIGNhcGlfaXB2dF9pbnRlbnQgfD0gRjJQWV9JTlRFTlRfSU47DQogIGNhcGlf aXB2dF90bXAgPSBhcnJheV9mcm9tX3B5b2JqKFB5QXJyYXlfSU5ULGlwdnRfRGltcyxpcHZ0X1Jh bmssY2FwaV9pcHZ0X2ludGVudCxpcHZ0X2NhcGkpOw0KICBpZiAoY2FwaV9pcHZ0X3RtcCA9PSBO VUxMKSB7DQogICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKQ0KICAgICAgUHlFcnJfU2V0U3RyaW5n KG9wdF9zcXBfZXJyb3IsImZhaWxlZCBpbiBjb252ZXJ0aW5nIDNyZCBhcmd1bWVudCBgaXB2dCcg b2Ygb3B0X3NxcC5kZ2VkaSB0byBDL0ZvcnRyYW4gYXJyYXkiICk7DQogIH0gZWxzZSB7DQogICAg aXB2dCA9IChpbnQgKikoY2FwaV9pcHZ0X3RtcC0+ZGF0YSk7DQogIC8qIFByb2Nlc3NpbmcgdmFy aWFibGUgd29yayAqLw0KICB3b3JrX0RpbXNbMF09MTsNCiAgY2FwaV93b3JrX2ludGVudCB8PSBG MlBZX0lOVEVOVF9JTjsNCiAgY2FwaV93b3JrX3RtcCA9IGFycmF5X2Zyb21fcHlvYmooUHlBcnJh eV9ET1VCTEUsd29ya19EaW1zLHdvcmtfUmFuayxjYXBpX3dvcmtfaW50ZW50LHdvcmtfY2FwaSk7 DQogIGlmIChjYXBpX3dvcmtfdG1wID09IE5VTEwpIHsNCiAgICBpZiAoIVB5RXJyX09jY3VycmVk KCkpDQogICAgICBQeUVycl9TZXRTdHJpbmcob3B0X3NxcF9lcnJvciwiZmFpbGVkIGluIGNvbnZl cnRpbmcgNXRoIGFyZ3VtZW50IGB3b3JrJyBvZiBvcHRfc3FwLmRnZWRpIHRvIEMvRm9ydHJhbiBh cnJheSIgKTsNCiAgfSBlbHNlIHsNCiAgICB3b3JrID0gKGRvdWJsZSAqKShjYXBpX3dvcmtfdG1w LT5kYXRhKTsNCiAgLyogUHJvY2Vzc2luZyB2YXJpYWJsZSBkZXQgKi8NCiAgZGV0X0RpbXNbMF09 MjsNCiAgY2FwaV9kZXRfaW50ZW50IHw9IEYyUFlfSU5URU5UX0lOOw0KICBjYXBpX2RldF90bXAg PSBhcnJheV9mcm9tX3B5b2JqKFB5QXJyYXlfRE9VQkxFLGRldF9EaW1zLGRldF9SYW5rLGNhcGlf ZGV0X2ludGVudCxkZXRfY2FwaSk7DQogIGlmIChjYXBpX2RldF90bXAgPT0gTlVMTCkgew0KICAg IGlmICghUHlFcnJfT2NjdXJyZWQoKSkNCiAgICAgIFB5RXJyX1NldFN0cmluZyhvcHRfc3FwX2Vy cm9yLCJmYWlsZWQgaW4gY29udmVydGluZyA0dGggYXJndW1lbnQgYGRldCcgb2Ygb3B0X3NxcC5k Z2VkaSB0byBDL0ZvcnRyYW4gYXJyYXkiICk7DQogIH0gZWxzZSB7DQogICAgZGV0ID0gKGRvdWJs ZSAqKShjYXBpX2RldF90bXAtPmRhdGEpOw0KICAvKiBQcm9jZXNzaW5nIHZhcmlhYmxlIGpvYiAq Lw0KICAgIGYycHlfc3VjY2VzcyA9IGludF9mcm9tX3B5b2JqKCZqb2Isam9iX2NhcGksIm9wdF9z cXAuZGdlZGkoKSA2dGggYXJndW1lbnQgKGpvYikgY2FuJ3QgYmUgY29udmVydGVkIHRvIGludCIp Ow0KICBpZiAoZjJweV9zdWNjZXNzKSB7DQogIC8qIFByb2Nlc3NpbmcgdmFyaWFibGUgbiAqLw0K ICAgIGYycHlfc3VjY2VzcyA9IGludF9mcm9tX3B5b2JqKCZuLG5fY2FwaSwib3B0X3NxcC5kZ2Vk aSgpIDJuZCBhcmd1bWVudCAobikgY2FuJ3QgYmUgY29udmVydGVkIHRvIGludCIpOw0KICBpZiAo ZjJweV9zdWNjZXNzKSB7DQogIC8qIFByb2Nlc3NpbmcgdmFyaWFibGUgbGRhICovDQogIGlmIChs ZGFfY2FwaSA9PSBQeV9Ob25lKSBsZGEgPSBzaGFwZShhLDApOyBlbHNlDQogICAgZjJweV9zdWNj ZXNzID0gaW50X2Zyb21fcHlvYmooJmxkYSxsZGFfY2FwaSwib3B0X3NxcC5kZ2VkaSgpIDFzdCBr ZXl3b3JkIChsZGEpIGNhbid0IGJlIGNvbnZlcnRlZCB0byBpbnQiKTsNCiAgaWYgKGYycHlfc3Vj Y2Vzcykgew0KICBDSEVDS1NDQUxBUihzaGFwZShhLDApPT1sZGEsInNoYXBlKGEsMCk9PWxkYSIs IjFzdCBrZXl3b3JkIGxkYSIsImRnZWRpOmxkYT0lZCIsbGRhKSB7DQovKmVuZCBvZiBmcm9tcHlv YmoqLw0KI2lmZGVmIEYyUFlfUkVQT1JUX0FURVhJVA0KZjJweV9zdGFydF9jYWxsX2Nsb2NrKCk7 DQojZW5kaWYNCi8qY2FsbGZvcnRyYW5yb3V0aW5lKi8NCiAgICAgICAgKCpmMnB5X2Z1bmMpKGEs JmxkYSwmbixpcHZ0LGRldCx3b3JrLCZqb2IpOw0KI2lmZGVmIEYyUFlfUkVQT1JUX0FURVhJVA0K ZjJweV9zdG9wX2NhbGxfY2xvY2soKTsNCiNlbmRpZg0KLyplbmQgb2YgY2FsbGZvcnRyYW5yb3V0 aW5lKi8NCiAgICBpZiAoZjJweV9zdWNjZXNzKSB7DQovKnB5b2JqZnJvbSovDQovKmVuZCBvZiBw eW9iamZyb20qLw0KICAgIENGVU5DU01FU1MoIkJ1aWxkaW5nIHJldHVybiB2YWx1ZS5cbiIpOw0K ICAgIGNhcGlfYnVpbGR2YWx1ZSA9IFB5X0J1aWxkVmFsdWUoIiIpOw0KLypjbG9zZXB5b2JqZnJv bSovDQovKmVuZCBvZiBjbG9zZXB5b2JqZnJvbSovDQogICAgfSAvKmlmIChmMnB5X3N1Y2Nlc3Mp IGFmdGVyIGNhbGxmb3J0cmFucm91dGluZSovDQovKmNsZWFudXBmcm9tcHlvYmoqLw0KICB9IC8q Q0hFQ0tTQ0FMQVIoc2hhcGUoYSwwKT09bGRhKSovDQogIH0gLyppZiAoZjJweV9zdWNjZXNzKSBv ZiBsZGEqLw0KICAvKiBFbmQgb2YgY2xlYW5pbmcgdmFyaWFibGUgbGRhICovDQogIH0gLyppZiAo ZjJweV9zdWNjZXNzKSBvZiBuKi8NCiAgLyogRW5kIG9mIGNsZWFuaW5nIHZhcmlhYmxlIG4gKi8N CiAgfSAvKmlmIChmMnB5X3N1Y2Nlc3MpIG9mIGpvYiovDQogIC8qIEVuZCBvZiBjbGVhbmluZyB2 YXJpYWJsZSBqb2IgKi8NCiAgaWYoKFB5T2JqZWN0ICopY2FwaV9kZXRfdG1wIT1kZXRfY2FwaSkg ew0KICAgIFB5X1hERUNSRUYoY2FwaV9kZXRfdG1wKTsgfQ0KICB9ICAvKmlmIChjYXBpX2RldF90 bXAgPT0gTlVMTCkgLi4uIGVsc2Ugb2YgZGV0Ki8NCiAgLyogRW5kIG9mIGNsZWFuaW5nIHZhcmlh YmxlIGRldCAqLw0KICBpZigoUHlPYmplY3QgKiljYXBpX3dvcmtfdG1wIT13b3JrX2NhcGkpIHsN CiAgICBQeV9YREVDUkVGKGNhcGlfd29ya190bXApOyB9DQogIH0gIC8qaWYgKGNhcGlfd29ya190 bXAgPT0gTlVMTCkgLi4uIGVsc2Ugb2Ygd29yayovDQogIC8qIEVuZCBvZiBjbGVhbmluZyB2YXJp YWJsZSB3b3JrICovDQogIGlmKChQeU9iamVjdCAqKWNhcGlfaXB2dF90bXAhPWlwdnRfY2FwaSkg ew0KICAgIFB5X1hERUNSRUYoY2FwaV9pcHZ0X3RtcCk7IH0NCiAgfSAgLyppZiAoY2FwaV9pcHZ0 X3RtcCA9PSBOVUxMKSAuLi4gZWxzZSBvZiBpcHZ0Ki8NCiAgLyogRW5kIG9mIGNsZWFuaW5nIHZh cmlhYmxlIGlwdnQgKi8NCiAgaWYoKFB5T2JqZWN0ICopY2FwaV9hX3RtcCE9YV9jYXBpKSB7DQog ICAgUHlfWERFQ1JFRihjYXBpX2FfdG1wKTsgfQ0KICB9ICAvKmlmIChjYXBpX2FfdG1wID09IE5V TEwpIC4uLiBlbHNlIG9mIGEqLw0KICAvKiBFbmQgb2YgY2xlYW5pbmcgdmFyaWFibGUgYSAqLw0K LyplbmQgb2YgY2xlYW51cGZyb21weW9iaiovDQogIGlmIChjYXBpX2J1aWxkdmFsdWUgPT0gTlVM TCkgew0KLypyb3V0ZGVidWdmYWlsdXJlKi8NCiAgfSBlbHNlIHsNCi8qcm91dGRlYnVnbGVhdmUq Lw0KICB9DQogIENGVU5DU01FU1MoIkZyZWVpbmcgbWVtb3J5LlxuIik7DQovKmZyZWVtZW0qLw0K I2lmZGVmIEYyUFlfUkVQT1JUX0FURVhJVA0KZjJweV9zdG9wX2Nsb2NrKCk7DQojZW5kaWYNCiAg cmV0dXJuIGNhcGlfYnVpbGR2YWx1ZTsNCn0NCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKiBlbmQgb2YgZGdlZGkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQovKmVv ZiBib2R5Ki8NCg0KLyoqKioqKioqKioqKioqKioqKiogU2VlIGYycHkyZS9mOTBtb2RfcnVsZXMu cHk6IGJ1aWxkaG9va3MgKioqKioqKioqKioqKioqKioqKi8NCi8qbmVlZF9mOTBtb2Rob29rcyov DQoNCi8qKioqKioqKioqKioqKiBTZWUgZjJweTJlL3J1bGVzLnB5OiBtb2R1bGVfcnVsZXNbJ21v ZHVsZWJvZHknXSAqKioqKioqKioqKioqKi8NCg0KLyoqKioqKioqKioqKioqKioqKiogU2VlIGYy cHkyZS9jb21tb25fcnVsZXMucHk6IGJ1aWxkaG9va3MgKioqKioqKioqKioqKioqKioqKi8NCg0K c3RhdGljIEZvcnRyYW5EYXRhRGVmIGYycHlfc2hhcjEzX2RlZltdID0gew0KICB7ImpzZXEiLDEs e3sxMDB9fSxQeUFycmF5X0lOVH0sDQogIHsibmVxIiwwLHt7LTF9fSxQeUFycmF5X0lOVH0sDQog IHtOVUxMfQ0KfTsNCnN0YXRpYyB2b2lkIGYycHlfc2V0dXBfc2hhcjEzKGNoYXIgKmpzZXEsY2hh ciAqbmVxKSB7DQogIGludCBpX2YycHk9MDsNCiAgZjJweV9zaGFyMTNfZGVmW2lfZjJweSsrXS5k YXRhID0ganNlcTsNCiAgZjJweV9zaGFyMTNfZGVmW2lfZjJweSsrXS5kYXRhID0gbmVxOw0KfQ0K ZXh0ZXJuIHZvaWQgRl9GVU5DKGYycHlpbml0c2hhcjEzLEYyUFlJTklUU0hBUjEzKSgpOw0Kc3Rh dGljIHZvaWQgZjJweV9pbml0X3NoYXIxMygpIHsNCiAgRl9GVU5DKGYycHlpbml0c2hhcjEzLEYy UFlJTklUU0hBUjEzKShmMnB5X3NldHVwX3NoYXIxMyk7DQp9DQoNCnN0YXRpYyBGb3J0cmFuRGF0 YURlZiBmMnB5X3NoYXIxNV9kZWZbXSA9IHsNCiAgeyJoaCIsMCx7ey0xfX0sUHlBcnJheV9ET1VC TEV9LA0KICB7ImlyZWwiLDAse3stMX19LFB5QXJyYXlfSU5UfSwNCiAgeyJpcHJpbnQiLDAse3st MX19LFB5QXJyYXlfSU5UfSwNCiAge05VTEx9DQp9Ow0Kc3RhdGljIHZvaWQgZjJweV9zZXR1cF9z aGFyMTUoY2hhciAqaGgsY2hhciAqaXJlbCxjaGFyICppcHJpbnQpIHsNCiAgaW50IGlfZjJweT0w Ow0KICBmMnB5X3NoYXIxNV9kZWZbaV9mMnB5KytdLmRhdGEgPSBoaDsNCiAgZjJweV9zaGFyMTVf ZGVmW2lfZjJweSsrXS5kYXRhID0gaXJlbDsNCiAgZjJweV9zaGFyMTVfZGVmW2lfZjJweSsrXS5k YXRhID0gaXByaW50Ow0KfQ0KZXh0ZXJuIHZvaWQgRl9GVU5DKGYycHlpbml0c2hhcjE1LEYyUFlJ TklUU0hBUjE1KSgpOw0Kc3RhdGljIHZvaWQgZjJweV9pbml0X3NoYXIxNSgpIHsNCiAgRl9GVU5D KGYycHlpbml0c2hhcjE1LEYyUFlJTklUU0hBUjE1KShmMnB5X3NldHVwX3NoYXIxNSk7DQp9DQoN CnN0YXRpYyBGb3J0cmFuRGF0YURlZiBmMnB5X3NoYXIxN19kZWZbXSA9IHsNCiAgeyJncmFkbCIs MCx7ey0xfX0sUHlBcnJheV9ET1VCTEV9LA0KICB7Iml2bWNvbiIsMCx7ey0xfX0sUHlBcnJheV9J TlR9LA0KICB7TlVMTH0NCn07DQpzdGF0aWMgdm9pZCBmMnB5X3NldHVwX3NoYXIxNyhjaGFyICpn cmFkbCxjaGFyICppdm1jb24pIHsNCiAgaW50IGlfZjJweT0wOw0KICBmMnB5X3NoYXIxN19kZWZb aV9mMnB5KytdLmRhdGEgPSBncmFkbDsNCiAgZjJweV9zaGFyMTdfZGVmW2lfZjJweSsrXS5kYXRh ID0gaXZtY29uOw0KfQ0KZXh0ZXJuIHZvaWQgRl9GVU5DKGYycHlpbml0c2hhcjE3LEYyUFlJTklU U0hBUjE3KSgpOw0Kc3RhdGljIHZvaWQgZjJweV9pbml0X3NoYXIxNygpIHsNCiAgRl9GVU5DKGYy cHlpbml0c2hhcjE3LEYyUFlJTklUU0hBUjE3KShmMnB5X3NldHVwX3NoYXIxNyk7DQp9DQoNCnN0 YXRpYyBGb3J0cmFuRGF0YURlZiBmMnB5X29wdGltX2RlZltdID0gew0KICB7ImZfbWluIiwwLHt7 LTF9fSxQeUFycmF5X0RPVUJMRX0sDQogIHsiZnN1bSIsMCx7ey0xfX0sUHlBcnJheV9ET1VCTEV9 LA0KICB7InhfbWluIiwxLHt7NTB9fSxQeUFycmF5X0RPVUJMRX0sDQogIHsiaHQiLDEse3s1MH19 LFB5QXJyYXlfRE9VQkxFfSwNCiAgeyJnZyIsMSx7ezUwfX0sUHlBcnJheV9ET1VCTEV9LA0KICB7 InhzcGFyayIsMCx7ey0xfX0sUHlBcnJheV9ET1VCTEV9LA0KICB7InhwaW4iLDAse3stMX19LFB5 QXJyYXlfRE9VQkxFfSwNCiAge05VTEx9DQp9Ow0Kc3RhdGljIHZvaWQgZjJweV9zZXR1cF9vcHRp bShjaGFyICpmX21pbixjaGFyICpmc3VtLGNoYXIgKnhfbWluLGNoYXIgKmh0LGNoYXIgKmdnLGNo YXIgKnhzcGFyayxjaGFyICp4cGluKSB7DQogIGludCBpX2YycHk9MDsNCiAgZjJweV9vcHRpbV9k ZWZbaV9mMnB5KytdLmRhdGEgPSBmX21pbjsNCiAgZjJweV9vcHRpbV9kZWZbaV9mMnB5KytdLmRh dGEgPSBmc3VtOw0KICBmMnB5X29wdGltX2RlZltpX2YycHkrK10uZGF0YSA9IHhfbWluOw0KICBm MnB5X29wdGltX2RlZltpX2YycHkrK10uZGF0YSA9IGh0Ow0KICBmMnB5X29wdGltX2RlZltpX2Yy cHkrK10uZGF0YSA9IGdnOw0KICBmMnB5X29wdGltX2RlZltpX2YycHkrK10uZGF0YSA9IHhzcGFy azsNCiAgZjJweV9vcHRpbV9kZWZbaV9mMnB5KytdLmRhdGEgPSB4cGluOw0KfQ0KZXh0ZXJuIHZv aWQgRl9GVU5DKGYycHlpbml0b3B0aW0sRjJQWUlOSVRPUFRJTSkoKTsNCnN0YXRpYyB2b2lkIGYy cHlfaW5pdF9vcHRpbSgpIHsNCiAgRl9GVU5DKGYycHlpbml0b3B0aW0sRjJQWUlOSVRPUFRJTSko ZjJweV9zZXR1cF9vcHRpbSk7DQp9DQoNCnN0YXRpYyBGb3J0cmFuRGF0YURlZiBmMnB5X2l0ZXIy X2RlZltdID0gew0KICB7ImlibWVwIiwwLHt7LTF9fSxQeUFycmF5X0lOVH0sDQogIHsiaXAiLDAs e3stMX19LFB5QXJyYXlfSU5UfSwNCiAgeyJpcGluIiwwLHt7LTF9fSxQeUFycmF5X0lOVH0sDQog IHsiaW5vazEiLDAse3stMX19LFB5QXJyYXlfSU5UfSwNCiAgeyJpbm9raW5kZXgiLDAse3stMX19 LFB5QXJyYXlfSU5UfSwNCiAge05VTEx9DQp9Ow0Kc3RhdGljIHZvaWQgZjJweV9zZXR1cF9pdGVy MihjaGFyICppYm1lcCxjaGFyICppcCxjaGFyICppcGluLGNoYXIgKmlub2sxLGNoYXIgKmlub2tp bmRleCkgew0KICBpbnQgaV9mMnB5PTA7DQogIGYycHlfaXRlcjJfZGVmW2lfZjJweSsrXS5kYXRh ID0gaWJtZXA7DQogIGYycHlfaXRlcjJfZGVmW2lfZjJweSsrXS5kYXRhID0gaXA7DQogIGYycHlf aXRlcjJfZGVmW2lfZjJweSsrXS5kYXRhID0gaXBpbjsNCiAgZjJweV9pdGVyMl9kZWZbaV9mMnB5 KytdLmRhdGEgPSBpbm9rMTsNCiAgZjJweV9pdGVyMl9kZWZbaV9mMnB5KytdLmRhdGEgPSBpbm9r aW5kZXg7DQp9DQpleHRlcm4gdm9pZCBGX0ZVTkMoZjJweWluaXRpdGVyMixGMlBZSU5JVElURVIy KSgpOw0Kc3RhdGljIHZvaWQgZjJweV9pbml0X2l0ZXIyKCkgew0KICBGX0ZVTkMoZjJweWluaXRp dGVyMixGMlBZSU5JVElURVIyKShmMnB5X3NldHVwX2l0ZXIyKTsNCn0NCg0Kc3RhdGljIEZvcnRy YW5EYXRhRGVmIGYycHlfaXRlcjFfZGVmW10gPSB7DQogIHsiaXRlciIsMCx7ey0xfX0sUHlBcnJh eV9JTlR9LA0KICB7Imlza2lwIiwwLHt7LTF9fSxQeUFycmF5X0lOVH0sDQogIHsiaXYiLDAse3st MX19LFB5QXJyYXlfSU5UfSwNCiAgeyJpc3RhdCIsMCx7ey0xfX0sUHlBcnJheV9JTlR9LA0KICB7 ImlzdGVwIiwwLHt7LTF9fSxQeUFycmF5X0lOVH0sDQogIHsibnN0ZXAiLDAse3stMX19LFB5QXJy YXlfSU5UfSwNCiAgeyJtaW5kaXIiLDAse3stMX19LFB5QXJyYXlfSU5UfSwNCiAgeyJpc3Bhcmsi LDAse3stMX19LFB5QXJyYXlfSU5UfSwNCiAge05VTEx9DQp9Ow0Kc3RhdGljIHZvaWQgZjJweV9z ZXR1cF9pdGVyMShjaGFyICppdGVyLGNoYXIgKmlza2lwLGNoYXIgKml2LGNoYXIgKmlzdGF0LGNo YXIgKmlzdGVwLGNoYXIgKm5zdGVwLGNoYXIgKm1pbmRpcixjaGFyICppc3BhcmspIHsNCiAgaW50 IGlfZjJweT0wOw0KICBmMnB5X2l0ZXIxX2RlZltpX2YycHkrK10uZGF0YSA9IGl0ZXI7DQogIGYy cHlfaXRlcjFfZGVmW2lfZjJweSsrXS5kYXRhID0gaXNraXA7DQogIGYycHlfaXRlcjFfZGVmW2lf ZjJweSsrXS5kYXRhID0gaXY7DQogIGYycHlfaXRlcjFfZGVmW2lfZjJweSsrXS5kYXRhID0gaXN0 YXQ7DQogIGYycHlfaXRlcjFfZGVmW2lfZjJweSsrXS5kYXRhID0gaXN0ZXA7DQogIGYycHlfaXRl cjFfZGVmW2lfZjJweSsrXS5kYXRhID0gbnN0ZXA7DQogIGYycHlfaXRlcjFfZGVmW2lfZjJweSsr XS5kYXRhID0gbWluZGlyOw0KICBmMnB5X2l0ZXIxX2RlZltpX2YycHkrK10uZGF0YSA9IGlzcGFy azsNCn0NCmV4dGVybiB2b2lkIEZfRlVOQyhmMnB5aW5pdGl0ZXIxLEYyUFlJTklUSVRFUjEpKCk7 DQpzdGF0aWMgdm9pZCBmMnB5X2luaXRfaXRlcjEoKSB7DQogIEZfRlVOQyhmMnB5aW5pdGl0ZXIx LEYyUFlJTklUSVRFUjEpKGYycHlfc2V0dXBfaXRlcjEpOw0KfQ0KDQpzdGF0aWMgRm9ydHJhbkRh dGFEZWYgZjJweV9zaGFyZTNfZGVmW10gPSB7DQogIHsiZ3JhZGYiLDEse3sxMDB9fSxQeUFycmF5 X0RPVUJMRX0sDQogIHsiZ3JhZGciLDIse3sxMDAsMTAwfX0sUHlBcnJheV9ET1VCTEV9LA0KICB7 TlVMTH0NCn07DQpzdGF0aWMgdm9pZCBmMnB5X3NldHVwX3NoYXJlMyhjaGFyICpncmFkZixjaGFy ICpncmFkZykgew0KICBpbnQgaV9mMnB5PTA7DQogIGYycHlfc2hhcmUzX2RlZltpX2YycHkrK10u ZGF0YSA9IGdyYWRmOw0KICBmMnB5X3NoYXJlM19kZWZbaV9mMnB5KytdLmRhdGEgPSBncmFkZzsN Cn0NCmV4dGVybiB2b2lkIEZfRlVOQyhmMnB5aW5pdHNoYXJlMyxGMlBZSU5JVFNIQVJFMykoKTsN CnN0YXRpYyB2b2lkIGYycHlfaW5pdF9zaGFyZTMoKSB7DQogIEZfRlVOQyhmMnB5aW5pdHNoYXJl MyxGMlBZSU5JVFNIQVJFMykoZjJweV9zZXR1cF9zaGFyZTMpOw0KfQ0KDQpzdGF0aWMgRm9ydHJh bkRhdGFEZWYgZjJweV9zaGFyZTJfZGVmW10gPSB7DQogIHsieCIsMSx7ezEwMH19LFB5QXJyYXlf RE9VQkxFfSwNCiAgeyJnIiwxLHt7MTAwfX0sUHlBcnJheV9ET1VCTEV9LA0KICB7ImYiLDAse3st MX19LFB5QXJyYXlfRE9VQkxFfSwNCiAgeyJudiIsMCx7ey0xfX0sUHlBcnJheV9JTlR9LA0KICB7 Im5jIiwwLHt7LTF9fSxQeUFycmF5X0lOVH0sDQogIHtOVUxMfQ0KfTsNCnN0YXRpYyB2b2lkIGYy cHlfc2V0dXBfc2hhcmUyKGNoYXIgKngsY2hhciAqZyxjaGFyICpmLGNoYXIgKm52LGNoYXIgKm5j KSB7DQogIGludCBpX2YycHk9MDsNCiAgZjJweV9zaGFyZTJfZGVmW2lfZjJweSsrXS5kYXRhID0g eDsNCiAgZjJweV9zaGFyZTJfZGVmW2lfZjJweSsrXS5kYXRhID0gZzsNCiAgZjJweV9zaGFyZTJf ZGVmW2lfZjJweSsrXS5kYXRhID0gZjsNCiAgZjJweV9zaGFyZTJfZGVmW2lfZjJweSsrXS5kYXRh ID0gbnY7DQogIGYycHlfc2hhcmUyX2RlZltpX2YycHkrK10uZGF0YSA9IG5jOw0KfQ0KZXh0ZXJu IHZvaWQgRl9GVU5DKGYycHlpbml0c2hhcmUyLEYyUFlJTklUU0hBUkUyKSgpOw0Kc3RhdGljIHZv aWQgZjJweV9pbml0X3NoYXJlMigpIHsNCiAgRl9GVU5DKGYycHlpbml0c2hhcmUyLEYyUFlJTklU U0hBUkUyKShmMnB5X3NldHVwX3NoYXJlMik7DQp9DQoNCnN0YXRpYyBGb3J0cmFuRGF0YURlZiBm MnB5X2libnVtXzBfZGVmW10gPSB7DQogIHsiaWJudW0wIiwwLHt7LTF9fSxQeUFycmF5X0lOVH0s DQogIHsiaWJ1cm4wIiwwLHt7LTF9fSxQeUFycmF5X0lOVH0sDQogIHtOVUxMfQ0KfTsNCnN0YXRp YyB2b2lkIGYycHlfc2V0dXBfaWJudW1fMChjaGFyICppYm51bTAsY2hhciAqaWJ1cm4wKSB7DQog IGludCBpX2YycHk9MDsNCiAgZjJweV9pYm51bV8wX2RlZltpX2YycHkrK10uZGF0YSA9IGlibnVt MDsNCiAgZjJweV9pYm51bV8wX2RlZltpX2YycHkrK10uZGF0YSA9IGlidXJuMDsNCn0NCmV4dGVy biB2b2lkIEZfRlVOQyhmMnB5aW5pdGlibnVtXzAsRjJQWUlOSVRJQk5VTV8wKSgpOw0Kc3RhdGlj IHZvaWQgZjJweV9pbml0X2libnVtXzAoKSB7DQogIEZfRlVOQyhmMnB5aW5pdGlibnVtXzAsRjJQ WUlOSVRJQk5VTV8wKShmMnB5X3NldHVwX2libnVtXzApOw0KfQ0KDQpzdGF0aWMgRm9ydHJhbkRh dGFEZWYgZjJweV9pdGxpbV9kZWZbXSA9IHsNCiAgeyJucXBsaW0iLDAse3stMX19LFB5QXJyYXlf SU5UfSwNCiAge05VTEx9DQp9Ow0Kc3RhdGljIHZvaWQgZjJweV9zZXR1cF9pdGxpbShjaGFyICpu cXBsaW0pIHsNCiAgaW50IGlfZjJweT0wOw0KICBmMnB5X2l0bGltX2RlZltpX2YycHkrK10uZGF0 YSA9IG5xcGxpbTsNCn0NCmV4dGVybiB2b2lkIEZfRlVOQyhmMnB5aW5pdGl0bGltLEYyUFlJTklU SVRMSU0pKCk7DQpzdGF0aWMgdm9pZCBmMnB5X2luaXRfaXRsaW0oKSB7DQogIEZfRlVOQyhmMnB5 aW5pdGl0bGltLEYyUFlJTklUSVRMSU0pKGYycHlfc2V0dXBfaXRsaW0pOw0KfQ0KDQpzdGF0aWMg Rm9ydHJhbkRhdGFEZWYgZjJweV9zaGFyZTlfZGVmW10gPSB7DQogIHsibmYiLDAse3stMX19LFB5 QXJyYXlfSU5UfSwNCiAgeyJuZyIsMCx7ey0xfX0sUHlBcnJheV9JTlR9LA0KICB7Im5kZiIsMCx7 ey0xfX0sUHlBcnJheV9JTlR9LA0KICB7Im5kZyIsMCx7ey0xfX0sUHlBcnJheV9JTlR9LA0KICB7 Im5hY3RjIiwwLHt7LTF9fSxQeUFycmF5X0lOVH0sDQogIHtOVUxMfQ0KfTsNCnN0YXRpYyB2b2lk IGYycHlfc2V0dXBfc2hhcmU5KGNoYXIgKm5mLGNoYXIgKm5nLGNoYXIgKm5kZixjaGFyICpuZGcs Y2hhciAqbmFjdGMpIHsNCiAgaW50IGlfZjJweT0wOw0KICBmMnB5X3NoYXJlOV9kZWZbaV9mMnB5 KytdLmRhdGEgPSBuZjsNCiAgZjJweV9zaGFyZTlfZGVmW2lfZjJweSsrXS5kYXRhID0gbmc7DQog IGYycHlfc2hhcmU5X2RlZltpX2YycHkrK10uZGF0YSA9IG5kZjsNCiAgZjJweV9zaGFyZTlfZGVm W2lfZjJweSsrXS5kYXRhID0gbmRnOw0KICBmMnB5X3NoYXJlOV9kZWZbaV9mMnB5KytdLmRhdGEg PSBuYWN0YzsNCn0NCmV4dGVybiB2b2lkIEZfRlVOQyhmMnB5aW5pdHNoYXJlOSxGMlBZSU5JVFNI QVJFOSkoKTsNCnN0YXRpYyB2b2lkIGYycHlfaW5pdF9zaGFyZTkoKSB7DQogIEZfRlVOQyhmMnB5 aW5pdHNoYXJlOSxGMlBZSU5JVFNIQVJFOSkoZjJweV9zZXR1cF9zaGFyZTkpOw0KfQ0KDQpzdGF0 aWMgRm9ydHJhbkRhdGFEZWYgZjJweV9vcHRpbTFfZGVmW10gPSB7DQogIHsiZ19pcDAiLDAse3st MX19LFB5QXJyYXlfRE9VQkxFfSwNCiAgeyJnX2lwMSIsMCx7ey0xfX0sUHlBcnJheV9ET1VCTEV9 LA0KICB7InhwaW4wIiwwLHt7LTF9fSxQeUFycmF5X0RPVUJMRX0sDQogIHsieHBpbjEiLDAse3st MX19LFB5QXJyYXlfRE9VQkxFfSwNCiAgeyJnZzEiLDEse3s1MH19LFB5QXJyYXlfRE9VQkxFfSwN CiAge05VTEx9DQp9Ow0Kc3RhdGljIHZvaWQgZjJweV9zZXR1cF9vcHRpbTEoY2hhciAqZ19pcDAs Y2hhciAqZ19pcDEsY2hhciAqeHBpbjAsY2hhciAqeHBpbjEsY2hhciAqZ2cxKSB7DQogIGludCBp X2YycHk9MDsNCiAgZjJweV9vcHRpbTFfZGVmW2lfZjJweSsrXS5kYXRhID0gZ19pcDA7DQogIGYy cHlfb3B0aW0xX2RlZltpX2YycHkrK10uZGF0YSA9IGdfaXAxOw0KICBmMnB5X29wdGltMV9kZWZb aV9mMnB5KytdLmRhdGEgPSB4cGluMDsNCiAgZjJweV9vcHRpbTFfZGVmW2lfZjJweSsrXS5kYXRh ID0geHBpbjE7DQogIGYycHlfb3B0aW0xX2RlZltpX2YycHkrK10uZGF0YSA9IGdnMTsNCn0NCmV4 dGVybiB2b2lkIEZfRlVOQyhmMnB5aW5pdG9wdGltMSxGMlBZSU5JVE9QVElNMSkoKTsNCnN0YXRp YyB2b2lkIGYycHlfaW5pdF9vcHRpbTEoKSB7DQogIEZfRlVOQyhmMnB5aW5pdG9wdGltMSxGMlBZ SU5JVE9QVElNMSkoZjJweV9zZXR1cF9vcHRpbTEpOw0KfQ0KDQpzdGF0aWMgRm9ydHJhbkRhdGFE ZWYgZjJweV9zaGFyZTFfZGVmW10gPSB7DQogIHsianMxIiwxLHt7MTAwfX0sUHlBcnJheV9JTlR9 LA0KICB7ImpkMSIsMSx7ezEwMH19LFB5QXJyYXlfSU5UfSwNCiAgeyJqczIiLDEse3sxMDB9fSxQ eUFycmF5X0lOVH0sDQogIHsiamQyIiwxLHt7MTAwfX0sUHlBcnJheV9JTlR9LA0KICB7Iml0ciIs MCx7ey0xfX0sUHlBcnJheV9JTlR9LA0KICB7TlVMTH0NCn07DQpzdGF0aWMgdm9pZCBmMnB5X3Nl dHVwX3NoYXJlMShjaGFyICpqczEsY2hhciAqamQxLGNoYXIgKmpzMixjaGFyICpqZDIsY2hhciAq aXRyKSB7DQogIGludCBpX2YycHk9MDsNCiAgZjJweV9zaGFyZTFfZGVmW2lfZjJweSsrXS5kYXRh ID0ganMxOw0KICBmMnB5X3NoYXJlMV9kZWZbaV9mMnB5KytdLmRhdGEgPSBqZDE7DQogIGYycHlf c2hhcmUxX2RlZltpX2YycHkrK10uZGF0YSA9IGpzMjsNCiAgZjJweV9zaGFyZTFfZGVmW2lfZjJw eSsrXS5kYXRhID0gamQyOw0KICBmMnB5X3NoYXJlMV9kZWZbaV9mMnB5KytdLmRhdGEgPSBpdHI7 DQp9DQpleHRlcm4gdm9pZCBGX0ZVTkMoZjJweWluaXRzaGFyZTEsRjJQWUlOSVRTSEFSRTEpKCk7 DQpzdGF0aWMgdm9pZCBmMnB5X2luaXRfc2hhcmUxKCkgew0KICBGX0ZVTkMoZjJweWluaXRzaGFy ZTEsRjJQWUlOSVRTSEFSRTEpKGYycHlfc2V0dXBfc2hhcmUxKTsNCn0NCg0Kc3RhdGljIEZvcnRy YW5EYXRhRGVmIGYycHlfZHVtbXlfZGVmW10gPSB7DQogIHsibXRvdGFsIiwwLHt7LTF9fSxQeUFy cmF5X0lOVH0sDQogIHsibW9kZSIsMCx7ey0xfX0sUHlBcnJheV9JTlR9LA0KICB7TlVMTH0NCn07 DQpzdGF0aWMgdm9pZCBmMnB5X3NldHVwX2R1bW15KGNoYXIgKm10b3RhbCxjaGFyICptb2RlKSB7 DQogIGludCBpX2YycHk9MDsNCiAgZjJweV9kdW1teV9kZWZbaV9mMnB5KytdLmRhdGEgPSBtdG90 YWw7DQogIGYycHlfZHVtbXlfZGVmW2lfZjJweSsrXS5kYXRhID0gbW9kZTsNCn0NCmV4dGVybiB2 b2lkIEZfRlVOQyhmMnB5aW5pdGR1bW15LEYyUFlJTklURFVNTVkpKCk7DQpzdGF0aWMgdm9pZCBm MnB5X2luaXRfZHVtbXkoKSB7DQogIEZfRlVOQyhmMnB5aW5pdGR1bW15LEYyUFlJTklURFVNTVkp KGYycHlfc2V0dXBfZHVtbXkpOw0KfQ0KDQovKm5lZWRfY29tbW9uaG9va3MqLw0KDQovKioqKioq KioqKioqKioqKioqKioqKioqKioqKiBTZWUgZjJweTJlL3J1bGVzLnB5ICoqKioqKioqKioqKioq KioqKioqKioqKioqKiovDQpleHRlcm4gdm9pZCBGX0ZVTkMob3B0aW1pemUsT1BUSU1JWkUpKGlu dCosaW50KixpbnQqLGRvdWJsZSosZG91YmxlKixkb3VibGUqLGRvdWJsZSosZG91YmxlKixkb3Vi bGUqLGRvdWJsZSosaW50KixpbnQqLGludCosaW50KixpbnQqLGludCosaW50KixpbnQqLGludCos aW50Kik7DQpleHRlcm4gdm9pZCBGX0ZVTkMobW9kZWwsTU9ERUwpKHZvaWQpOw0KZXh0ZXJuIHZv aWQgRl9GVU5DKGZjbjIsRkNOMikoaW50KixpbnQqLGRvdWJsZSosZG91YmxlKixkb3VibGUqLGRv dWJsZSosZG91YmxlKixkb3VibGUqLGRvdWJsZSosaW50KixpbnQqKTsNCmV4dGVybiB2b2lkIEZf RlVOQyhwYXJzaCxQQVJTSCkoaW50Kixkb3VibGUqLGRvdWJsZSopOw0KZXh0ZXJuIHZvaWQgRl9G VU5DKHNxcDEsU1FQMSkodm9pZCosaW50KixpbnQqLGludCosZG91YmxlKixkb3VibGUqLGRvdWJs ZSosZG91YmxlKixkb3VibGUqLGludCosZG91YmxlKixkb3VibGUqLGludCosaW50KixpbnQqLGRv dWJsZSosaW50KixpbnQqLGludCosZG91YmxlKixkb3VibGUqLGludCopOw0KZXh0ZXJuIHZvaWQg Rl9GVU5DKHNxcCxTUVApKHZvaWQqLGludCosaW50KixpbnQqLGludCosZG91YmxlKixkb3VibGUq LGRvdWJsZSosZG91YmxlKixkb3VibGUqLGludCosZG91YmxlKixpbnQqLGRvdWJsZSosaW50Kixp bnQqLGludCosaW50KixpbnQqLGRvdWJsZSosZG91YmxlKixkb3VibGUqLGRvdWJsZSosZG91Ymxl Kixkb3VibGUqLGRvdWJsZSosZG91YmxlKixkb3VibGUqLGRvdWJsZSosaW50Kixkb3VibGUqLGRv dWJsZSosZG91YmxlKixkb3VibGUqLGludCosZG91YmxlKixpbnQqLGludCosaW50Kixkb3VibGUq LGRvdWJsZSosaW50Kik7DQpleHRlcm4gdm9pZCBGX0ZVTkMocXBzdWIsUVBTVUIpKGludCosaW50 KixpbnQqLGRvdWJsZSosZG91YmxlKixpbnQqLGRvdWJsZSosaW50Kixkb3VibGUqLGRvdWJsZSos ZG91YmxlKixpbnQqLGRvdWJsZSosaW50Kixkb3VibGUqLGRvdWJsZSosaW50KixpbnQqLGRvdWJs ZSosaW50KixpbnQqLGludCopOw0KZXh0ZXJuIHZvaWQgRl9GVU5DKHBueGZwLFBOWEZQKShpbnQq LGludCosZG91YmxlKixpbnQqLGRvdWJsZSosZG91YmxlKixkb3VibGUqLGRvdWJsZSosaW50Kixp bnQqLGRvdWJsZSosaW50KixpbnQqLGRvdWJsZSosaW50KixpbnQqKTsNCmV4dGVybiB2b2lkIEZf RlVOQyhwbnhxcCxQTlhRUCkoaW50Kixkb3VibGUqLGludCosZG91YmxlKixkb3VibGUqLGludCos ZG91YmxlKixkb3VibGUqLGRvdWJsZSosZG91YmxlKixpbnQqLGludCosZG91YmxlKixpbnQqLGlu dCosZG91YmxlKixpbnQqLGludCopOw0KZXh0ZXJuIHZvaWQgRl9XUkFQUEVERlVOQyhpZGFtYXgs SURBTUFYKShpbnQqLGludCosZG91YmxlKixpbnQqKTsNCmV4dGVybiB2b2lkIEZfRlVOQyhkc2Nh bCxEU0NBTCkoaW50Kixkb3VibGUqLGRvdWJsZSosaW50Kik7DQpleHRlcm4gdm9pZCBGX1dSQVBQ RURGVU5DKGVub3JtLEVOT1JNKShkb3VibGUqLGludCosZG91YmxlKik7DQpleHRlcm4gdm9pZCBG X0ZVTkMoaGludixISU5WKShkb3VibGUqLGludCosaW50Kixkb3VibGUqLGludCosaW50Kik7DQpl eHRlcm4gdm9pZCBGX0ZVTkMoZGdlZmEsREdFRkEpKGRvdWJsZSosaW50KixpbnQqLGludCosaW50 Kik7DQpleHRlcm4gdm9pZCBGX0ZVTkMoZG90cG1jLERPVFBNQykoZG91YmxlKixpbnQqLGRvdWJs ZSosaW50Kixkb3VibGUqLGRvdWJsZSosaW50KixpbnQqKTsNCmV4dGVybiB2b2lkIEZfRlVOQyhk c3dhcCxEU1dBUCkoaW50Kixkb3VibGUqLGludCosZG91YmxlKixpbnQqKTsNCmV4dGVybiB2b2lk IEZfRlVOQyhkYXhweSxEQVhQWSkoaW50Kixkb3VibGUqLGRvdWJsZSosaW50Kixkb3VibGUqLGlu dCopOw0KZXh0ZXJuIHZvaWQgRl9XUkFQUEVERlVOQyhkZG90LERET1QpKGRvdWJsZSosaW50Kixk b3VibGUqLGludCosZG91YmxlKixpbnQqKTsNCmV4dGVybiB2b2lkIEZfRlVOQyhkZ2VkaSxER0VE SSkoZG91YmxlKixpbnQqLGludCosaW50Kixkb3VibGUqLGRvdWJsZSosaW50Kik7DQovKmVvZiBl eHRlcm5yb3V0aW5lcyovDQoNCnN0YXRpYyBjaGFyIGRvY19mMnB5X2hhc19jb2x1bW5fbWFqb3Jf c3RvcmFnZVtdID0gIlwNCkZ1bmN0aW9uIGhhc19jb2x1bW5fbWFqb3Jfc3RvcmFnZShvYmopOlxu XA0KICBSZXR1cm4gdHJhbnNwb3NlKG9iaikuaXNjb250aWd1b3VzKCkuXG4iOw0Kc3RhdGljIFB5 T2JqZWN0ICpmMnB5X2hhc19jb2x1bW5fbWFqb3Jfc3RvcmFnZShQeU9iamVjdCAqc2VsZixQeU9i amVjdCAqYXJncykgew0KICBQeU9iamVjdCAqIG9iaiA9IE5VTEw7DQogIGlmICghUHlBcmdfUGFy c2VUdXBsZShhcmdzLCAiTyIsJm9iaikpDQogICAgcmV0dXJuIE5VTEw7DQogIHJldHVybiBQeV9C dWlsZFZhbHVlKCJpIiwoUHlBcnJheV9DaGVjayhvYmopPyBhcnJheV9oYXNfY29sdW1uX21ham9y X3N0b3JhZ2UoKFB5QXJyYXlPYmplY3QqKShvYmopKTowKSk7DQp9DQoNCnN0YXRpYyBjaGFyIGRv Y19mMnB5X2FzX2NvbHVtbl9tYWpvcl9zdG9yYWdlW10gPSAiXA0KRnVuY3Rpb24gYXNfY29sdW1u X21ham9yX3N0b3JhZ2UoYXJyKTpcblwNCiAgUmV0dXJuIGFycmF5IGluIGNvbHVtbiBtYWpvciBk YXRhIHN0b3JhZ2Ugb3JkZXIuXG4iOw0Kc3RhdGljIFB5T2JqZWN0ICpmMnB5X2FzX2NvbHVtbl9t YWpvcl9zdG9yYWdlKFB5T2JqZWN0ICpzZWxmLFB5T2JqZWN0ICphcmdzKSB7DQogIFB5T2JqZWN0 ICogb2JqID0gTlVMTDsNCiAgUHlBcnJheU9iamVjdCAqIGFyciA9IE5VTEw7DQogIGlmICghUHlB cmdfUGFyc2VUdXBsZShhcmdzLCAiTyIsJm9iaikpDQogICAgcmV0dXJuIE5VTEw7DQogIGlmICgh UHlBcnJheV9DaGVjayhvYmopKSB7DQogICAgUHlFcnJfU2V0U3RyaW5nKG9wdF9zcXBfZXJyb3Is ImV4cGVjdGVkIGFycmF5IG9iamVjdFxuIik7DQogICAgcmV0dXJuIE5VTEw7DQogIH0NCiAgYXJy ID0gKFB5QXJyYXlPYmplY3QqKW9iajsNCiAgYXJyID0gYXJyYXlfZnJvbV9weW9iaihhcnItPmRl c2NyLT50eXBlX251bSwgYXJyLT5kaW1lbnNpb25zLCBhcnItPm5kLA0KICAgICAgICAgICAgICAg ICAgICAgICAgIEYyUFlfSU5URU5UX09VVHxGMlBZX0lOVEVOVF9JTiwgb2JqKTsNCiAgaWYgKGFy ciA9PSBOVUxMKSB7DQogICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKQ0KICAgICAgUHlFcnJfU2V0 U3RyaW5nKG9wdF9zcXBfZXJyb3IsDQogICAgICAgICJmYWlsZWQgaW4gY29udmVydGluZyBhcmd1 bWVudCB0byBDL0ZvcnRyYW4gYXJyYXkiKTsNCiAgICByZXR1cm4gTlVMTDsNCiAgfQ0KICByZXR1 cm4gUHlfQnVpbGRWYWx1ZSgiTiIsYXJyKTsNCn0NCg0Kc3RhdGljIEZvcnRyYW5EYXRhRGVmIGYy cHlfcm91dGluZV9kZWZzW10gPSB7DQogIHsib3B0aW1pemUiLC0xLHt7LTF9fSwwLChjaGFyICop Rl9GVU5DKG9wdGltaXplLE9QVElNSVpFKSwoZjJweV9pbml0X2Z1bmMpZjJweV9yb3V0X29wdF9z cXBfb3B0aW1pemUsZG9jX2YycHlfcm91dF9vcHRfc3FwX29wdGltaXplfSwNCiAgeyJtb2RlbCIs LTEse3stMX19LDAsKGNoYXIgKilGX0ZVTkMobW9kZWwsTU9ERUwpLChmMnB5X2luaXRfZnVuYylm MnB5X3JvdXRfb3B0X3NxcF9tb2RlbCxkb2NfZjJweV9yb3V0X29wdF9zcXBfbW9kZWx9LA0KICB7 ImZjbjIiLC0xLHt7LTF9fSwwLChjaGFyICopRl9GVU5DKGZjbjIsRkNOMiksKGYycHlfaW5pdF9m dW5jKWYycHlfcm91dF9vcHRfc3FwX2ZjbjIsZG9jX2YycHlfcm91dF9vcHRfc3FwX2ZjbjJ9LA0K ICB7InBhcnNoIiwtMSx7ey0xfX0sMCwoY2hhciAqKUZfRlVOQyhwYXJzaCxQQVJTSCksKGYycHlf aW5pdF9mdW5jKWYycHlfcm91dF9vcHRfc3FwX3BhcnNoLGRvY19mMnB5X3JvdXRfb3B0X3NxcF9w YXJzaH0sDQogIHsic3FwMSIsLTEse3stMX19LDAsKGNoYXIgKilGX0ZVTkMoc3FwMSxTUVAxKSwo ZjJweV9pbml0X2Z1bmMpZjJweV9yb3V0X29wdF9zcXBfc3FwMSxkb2NfZjJweV9yb3V0X29wdF9z cXBfc3FwMX0sDQogIHsic3FwIiwtMSx7ey0xfX0sMCwoY2hhciAqKUZfRlVOQyhzcXAsU1FQKSwo ZjJweV9pbml0X2Z1bmMpZjJweV9yb3V0X29wdF9zcXBfc3FwLGRvY19mMnB5X3JvdXRfb3B0X3Nx cF9zcXB9LA0KICB7InFwc3ViIiwtMSx7ey0xfX0sMCwoY2hhciAqKUZfRlVOQyhxcHN1YixRUFNV QiksKGYycHlfaW5pdF9mdW5jKWYycHlfcm91dF9vcHRfc3FwX3Fwc3ViLGRvY19mMnB5X3JvdXRf b3B0X3NxcF9xcHN1Yn0sDQogIHsicG54ZnAiLC0xLHt7LTF9fSwwLChjaGFyICopRl9GVU5DKHBu eGZwLFBOWEZQKSwoZjJweV9pbml0X2Z1bmMpZjJweV9yb3V0X29wdF9zcXBfcG54ZnAsZG9jX2Yy cHlfcm91dF9vcHRfc3FwX3BueGZwfSwNCiAgeyJwbnhxcCIsLTEse3stMX19LDAsKGNoYXIgKilG X0ZVTkMocG54cXAsUE5YUVApLChmMnB5X2luaXRfZnVuYylmMnB5X3JvdXRfb3B0X3NxcF9wbnhx cCxkb2NfZjJweV9yb3V0X29wdF9zcXBfcG54cXB9LA0KICB7ImlkYW1heCIsLTEse3stMX19LDAs KGNoYXIgKilGX1dSQVBQRURGVU5DKGlkYW1heCxJREFNQVgpLChmMnB5X2luaXRfZnVuYylmMnB5 X3JvdXRfb3B0X3NxcF9pZGFtYXgsZG9jX2YycHlfcm91dF9vcHRfc3FwX2lkYW1heH0sDQogIHsi ZHNjYWwiLC0xLHt7LTF9fSwwLChjaGFyICopRl9GVU5DKGRzY2FsLERTQ0FMKSwoZjJweV9pbml0 X2Z1bmMpZjJweV9yb3V0X29wdF9zcXBfZHNjYWwsZG9jX2YycHlfcm91dF9vcHRfc3FwX2RzY2Fs fSwNCiAgeyJlbm9ybSIsLTEse3stMX19LDAsKGNoYXIgKilGX1dSQVBQRURGVU5DKGVub3JtLEVO T1JNKSwoZjJweV9pbml0X2Z1bmMpZjJweV9yb3V0X29wdF9zcXBfZW5vcm0sZG9jX2YycHlfcm91 dF9vcHRfc3FwX2Vub3JtfSwNCiAgeyJoaW52IiwtMSx7ey0xfX0sMCwoY2hhciAqKUZfRlVOQyho aW52LEhJTlYpLChmMnB5X2luaXRfZnVuYylmMnB5X3JvdXRfb3B0X3NxcF9oaW52LGRvY19mMnB5 X3JvdXRfb3B0X3NxcF9oaW52fSwNCiAgeyJkZ2VmYSIsLTEse3stMX19LDAsKGNoYXIgKilGX0ZV TkMoZGdlZmEsREdFRkEpLChmMnB5X2luaXRfZnVuYylmMnB5X3JvdXRfb3B0X3NxcF9kZ2VmYSxk b2NfZjJweV9yb3V0X29wdF9zcXBfZGdlZmF9LA0KICB7ImRvdHBtYyIsLTEse3stMX19LDAsKGNo YXIgKilGX0ZVTkMoZG90cG1jLERPVFBNQyksKGYycHlfaW5pdF9mdW5jKWYycHlfcm91dF9vcHRf c3FwX2RvdHBtYyxkb2NfZjJweV9yb3V0X29wdF9zcXBfZG90cG1jfSwNCiAgeyJkc3dhcCIsLTEs e3stMX19LDAsKGNoYXIgKilGX0ZVTkMoZHN3YXAsRFNXQVApLChmMnB5X2luaXRfZnVuYylmMnB5 X3JvdXRfb3B0X3NxcF9kc3dhcCxkb2NfZjJweV9yb3V0X29wdF9zcXBfZHN3YXB9LA0KICB7ImRh eHB5IiwtMSx7ey0xfX0sMCwoY2hhciAqKUZfRlVOQyhkYXhweSxEQVhQWSksKGYycHlfaW5pdF9m dW5jKWYycHlfcm91dF9vcHRfc3FwX2RheHB5LGRvY19mMnB5X3JvdXRfb3B0X3NxcF9kYXhweX0s DQogIHsiZGRvdCIsLTEse3stMX19LDAsKGNoYXIgKilGX1dSQVBQRURGVU5DKGRkb3QsRERPVCks KGYycHlfaW5pdF9mdW5jKWYycHlfcm91dF9vcHRfc3FwX2Rkb3QsZG9jX2YycHlfcm91dF9vcHRf c3FwX2Rkb3R9LA0KICB7ImRnZWRpIiwtMSx7ey0xfX0sMCwoY2hhciAqKUZfRlVOQyhkZ2VkaSxE R0VESSksKGYycHlfaW5pdF9mdW5jKWYycHlfcm91dF9vcHRfc3FwX2RnZWRpLGRvY19mMnB5X3Jv dXRfb3B0X3NxcF9kZ2VkaX0sDQoNCi8qZW9mIHJvdXRpbmVfZGVmcyovDQogIHtOVUxMfQ0KfTsN Cg0Kc3RhdGljIFB5TWV0aG9kRGVmIGYycHlfbW9kdWxlX21ldGhvZHNbXSA9IHsNCg0KICB7Imhh c19jb2x1bW5fbWFqb3Jfc3RvcmFnZSIsZjJweV9oYXNfY29sdW1uX21ham9yX3N0b3JhZ2UsTUVU SF9WQVJBUkdTLGRvY19mMnB5X2hhc19jb2x1bW5fbWFqb3Jfc3RvcmFnZX0sDQogIHsiYXNfY29s dW1uX21ham9yX3N0b3JhZ2UiLGYycHlfYXNfY29sdW1uX21ham9yX3N0b3JhZ2UsTUVUSF9WQVJB UkdTLGRvY19mMnB5X2FzX2NvbHVtbl9tYWpvcl9zdG9yYWdlfSwNCiAge05VTEwsTlVMTH0NCn07 DQoNCkRMX0VYUE9SVCh2b2lkKSBpbml0b3B0X3NxcCh2b2lkKSB7DQogIGludCBpOw0KICBQeU9i amVjdCAqbSwqZCwgKnM7DQogIG0gPSBQeV9Jbml0TW9kdWxlKCJvcHRfc3FwIiwgZjJweV9tb2R1 bGVfbWV0aG9kcyk7DQogIFB5Rm9ydHJhbl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7DQog IGltcG9ydF9hcnJheSgpOw0KICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkNCiAgICBQeV9GYXRhbEVy cm9yKCJjYW4ndCBpbml0aWFsaXplIG1vZHVsZSBvcHRfc3FwIChmYWlsZWQgdG8gaW1wb3J0IF9u dW1weSkiKTsNCiNpZiAhZGVmaW5lZChOVU1BUlJBWSkNCiAgaWYgKFB5SW1wb3J0X0ltcG9ydE1v ZHVsZSgiTnVtZXJpYyIpPT1OVUxMKSB7DQogICAgUHlFcnJfUHJpbnQoKTsNCiAgICBQeV9GYXRh bEVycm9yKCJjYW4ndCBpbml0aWFsaXplIG1vZHVsZSBvcHRfc3FwIik7DQogIH0NCiNlbmRpZg0K ICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsNCiAgcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiRS ZXZpc2lvbjogJCIpOw0KICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiX192ZXJzaW9uX18iLCBz KTsNCiAgcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIlRoaXMgbW9kdWxlICdvcHRfc3FwJyBpcyBh dXRvLWdlbmVyYXRlZCB3aXRoIGYycHkgKHZlcnNpb246Mi4zOS4yMzVfMTY5NSkuXG5GdW5jdGlv bnM6XG4iDQoiICBvcHRpbWl6ZShtLG1lcSxkaGgseHgseG1pbixvYmpfZixvYmpnLGZtaW4sZnN1 bTEsaWl2LGlpdGVyLGlpc3RhdCxpaXN0ZXAsaW5zdGVwLGlzcGFyazEsaXBpbjEsbWluZGlyMSxp Ym51bSxpYnVybixuPWxlbihkaGgpKVxuIg0KIiAgbW9kZWwoKVxuIg0KIiAgZmNuMih4eCxvYmpm LG9ial9mLG9iamcsZmdyZCxjb25mLGNub3JtLGluZm8sbj1sZW4oeHgpLG09bGVuKGNvbmYpLGxj bm9ybT1zaGFwZShjbm9ybSwwKSlcbiINCiIgIHBhcnNoKG9ial9mLG9iamcsbj0obGVuKG9ial9m KS0xKSlcbiINCiIgIHNxcDEoZmNuLG1lcSx4LG9iamYsZmdyZCxjb25mLGNub3JtLHZsYW0sdG9s LGlwcmludCxud3JpdGUsaW5mbyx3YSxpd2Esb2JqX2Ysb2JqZyxpYm51bSxuPWxlbih4KSxtPWxl bihjb25mKSxsY25vcm09c2hhcGUoY25vcm0sMCksbHdhPWxlbih3YSksbGl3YT1sZW4oaXdhKSxm Y25fZXh0cmFfYXJncz0oKSlcbiINCiIgIHNxcChmY24sbW9kZSxtZXEseCxvYmpmLGZncmQsY29u Zixjbm9ybSxiLHRvbCxtYXhmZXYsaXByaW50LG53cml0ZSxpbmZvLG5mZXYsdmxhbSxnbGFnLHZt dSxjbSxnbGFnYSxnYW1tYSxldGEseGEsYmRlbHRhLGRlbHRhLGdtLGJkbCxiZHUsaCx3YSxpd2Es b2JqX2Ysb2JqZyxpYm51bSxuPWxlbih4KSxtPWxlbihjb25mKSxsY25vcm09c2hhcGUoY25vcm0s MCksbGI9c2hhcGUoYiwwKSxsZGVsPWxlbihkZWx0YSksbGg9c2hhcGUoaCwwKSxsd2E9bGVuKHdh KSxsaXdhPWxlbihpd2EpLGZjbl9leHRyYV9hcmdzPSgpKVxuIg0KIiAgcXBzdWIobixtZXEsY29u Zixjbm9ybSxiLGdtLGJkbCxiZHUsaW5mbyxkZWx0YSxjbSxoLG1hY3Qsd2EsaXdhLG09bGVuKGNv bmYpLGxjbm9ybT1zaGFwZShjbm9ybSwwKSxsYj1zaGFwZShiLDApLGxkZWw9bGVuKGRlbHRhKSxs aD1zaGFwZShoLDApLGx3YT1sZW4od2EpLGxpd2E9bGVuKGl3YSkpXG4iDQoiICBwbnhmcChuLG0s YyxkLGJkbCxiZHUseCxrLGtlLGgsbHQsd2EsaXdhLGluZm8saWM9c2hhcGUoYywwKSxpaD1zaGFw ZShoLDApKVxuIg0KIiAgcG54cXAobixhLGIsYyxkLGJkbCxiZHUseCxrLGtlLGgsbHQsd2EsaXdh LGluZm8saWE9c2hhcGUoYSwwKSxpYz1zaGFwZShjLDApLGloPXNoYXBlKGgsMCkpXG4iDQoiICBp ZGFtYXggPSBpZGFtYXgobixkeCxpbmN4KVxuIg0KIiAgZHNjYWwobixkYSxkeCxpbmN4KVxuIg0K IiAgZW5vcm0gPSBlbm9ybSh4LG49bGVuKHgpKVxuIg0KIiAgaGludihoLHdvcmssaXB2dCxpbmZv LGloPXNoYXBlKGgsMCksbj1sZW4od29yaykpXG4iDQoiICBkZ2VmYShhLG4saXB2dCxpbmZvLGxk YT1zaGFwZShhLDApKVxuIg0KIiAgZG90cG1jKHgsaXgseSxpeSxjLHN1bSxuLGlmbGFnKVxuIg0K IiAgZHN3YXAobixkeCxpbmN4LGR5LGluY3kpXG4iDQoiICBkYXhweShuLGRhLGR4LGluY3gsZHks aW5jeSlcbiINCiIgIGRkb3QgPSBkZG90KG4sZHgsaW5jeCxkeSxpbmN5KVxuIg0KIiAgZGdlZGko YSxuLGlwdnQsZGV0LHdvcmssam9iLGxkYT1zaGFwZShhLDApKVxuIg0KIkNPTU1PTiBibG9ja3M6 XG4iIiAgL3NoYXIxMy8ganNlcSgxMDApLG5lcVxuIiIgIC9zaGFyMTUvIGhoLGlyZWwsaXByaW50 XG4iIiAgL3NoYXIxNy8gZ3JhZGwsaXZtY29uXG4iIiAgL29wdGltLyBmX21pbixmc3VtLHhfbWlu KDUwKSxodCg1MCksZ2coNTApLHhzcGFyayx4cGluXG4iIiAgL2l0ZXIyLyBpYm1lcCxpcCxpcGlu LGlub2sxLGlub2tpbmRleFxuIiIgIC9pdGVyMS8gaXRlcixpc2tpcCxpdixpc3RhdCxpc3RlcCxu c3RlcCxtaW5kaXIsaXNwYXJrXG4iIiAgL3NoYXJlMy8gZ3JhZGYoMTAwKSxncmFkZygxMDAsMTAw KVxuIiIgIC9zaGFyZTIvIHgoMTAwKSxnKDEwMCksZixudixuY1xuIiIgIC9pYm51bV8wLyBpYm51 bTAsaWJ1cm4wXG4iIiAgL2l0bGltLyBucXBsaW1cbiIiICAvc2hhcmU5LyBuZixuZyxuZGYsbmRn LG5hY3RjXG4iIiAgL29wdGltMS8gZ19pcDAsZ19pcDEseHBpbjAseHBpbjEsZ2cxKDUwKVxuIiIg IC9zaGFyZTEvIGpzMSgxMDApLGpkMSgxMDApLGpzMigxMDApLGpkMigxMDApLGl0clxuIiIgIC9k dW1teS8gbXRvdGFsLG1vZGVcbiIiLiIpOw0KICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiX19k b2NfXyIsIHMpOw0KICBvcHRfc3FwX2Vycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uICgib3B0X3Nx cC5lcnJvciIsIE5VTEwsIE5VTEwpOw0KICBQeV9ERUNSRUYocyk7DQogIGZvcihpPTA7ZjJweV9y b3V0aW5lX2RlZnNbaV0ubmFtZSE9TlVMTDtpKyspDQogICAgUHlEaWN0X1NldEl0ZW1TdHJpbmco ZCwgZjJweV9yb3V0aW5lX2RlZnNbaV0ubmFtZSxQeUZvcnRyYW5PYmplY3RfTmV3QXNBdHRyKCZm MnB5X3JvdXRpbmVfZGVmc1tpXSkpOw0KLyplb2YgaW5pdGY5MG1vZGhvb2tzKi8NCg0KICBQeURp Y3RfU2V0SXRlbVN0cmluZyhkLCAic2hhcjEzIiwgUHlGb3J0cmFuT2JqZWN0X05ldyhmMnB5X3No YXIxM19kZWYsZjJweV9pbml0X3NoYXIxMykpOw0KICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAi c2hhcjE1IiwgUHlGb3J0cmFuT2JqZWN0X05ldyhmMnB5X3NoYXIxNV9kZWYsZjJweV9pbml0X3No YXIxNSkpOw0KICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAic2hhcjE3IiwgUHlGb3J0cmFuT2Jq ZWN0X05ldyhmMnB5X3NoYXIxN19kZWYsZjJweV9pbml0X3NoYXIxNykpOw0KICBQeURpY3RfU2V0 SXRlbVN0cmluZyhkLCAib3B0aW0iLCBQeUZvcnRyYW5PYmplY3RfTmV3KGYycHlfb3B0aW1fZGVm LGYycHlfaW5pdF9vcHRpbSkpOw0KICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiaXRlcjIiLCBQ eUZvcnRyYW5PYmplY3RfTmV3KGYycHlfaXRlcjJfZGVmLGYycHlfaW5pdF9pdGVyMikpOw0KICBQ eURpY3RfU2V0SXRlbVN0cmluZyhkLCAiaXRlcjEiLCBQeUZvcnRyYW5PYmplY3RfTmV3KGYycHlf aXRlcjFfZGVmLGYycHlfaW5pdF9pdGVyMSkpOw0KICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAi c2hhcmUzIiwgUHlGb3J0cmFuT2JqZWN0X05ldyhmMnB5X3NoYXJlM19kZWYsZjJweV9pbml0X3No YXJlMykpOw0KICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAic2hhcmUyIiwgUHlGb3J0cmFuT2Jq ZWN0X05ldyhmMnB5X3NoYXJlMl9kZWYsZjJweV9pbml0X3NoYXJlMikpOw0KICBQeURpY3RfU2V0 SXRlbVN0cmluZyhkLCAiaWJudW1fMCIsIFB5Rm9ydHJhbk9iamVjdF9OZXcoZjJweV9pYm51bV8w X2RlZixmMnB5X2luaXRfaWJudW1fMCkpOw0KICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiaXRs aW0iLCBQeUZvcnRyYW5PYmplY3RfTmV3KGYycHlfaXRsaW1fZGVmLGYycHlfaW5pdF9pdGxpbSkp Ow0KICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAic2hhcmU5IiwgUHlGb3J0cmFuT2JqZWN0X05l dyhmMnB5X3NoYXJlOV9kZWYsZjJweV9pbml0X3NoYXJlOSkpOw0KICBQeURpY3RfU2V0SXRlbVN0 cmluZyhkLCAib3B0aW0xIiwgUHlGb3J0cmFuT2JqZWN0X05ldyhmMnB5X29wdGltMV9kZWYsZjJw eV9pbml0X29wdGltMSkpOw0KICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAic2hhcmUxIiwgUHlG b3J0cmFuT2JqZWN0X05ldyhmMnB5X3NoYXJlMV9kZWYsZjJweV9pbml0X3NoYXJlMSkpOw0KICBQ eURpY3RfU2V0SXRlbVN0cmluZyhkLCAiZHVtbXkiLCBQeUZvcnRyYW5PYmplY3RfTmV3KGYycHlf ZHVtbXlfZGVmLGYycHlfaW5pdF9kdW1teSkpOw0KLyplb2YgaW5pdGNvbW1vbmhvb2tzKi8NCg0K ICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkNCiAgICBQeV9GYXRhbEVycm9yKCJjYW4ndCBpbml0aWFs aXplIG1vZHVsZSBvcHRfc3FwIik7DQoNCiNpZmRlZiBGMlBZX1JFUE9SVF9BVEVYSVQNCiAgb25f ZXhpdChmMnB5X3JlcG9ydF9vbl9leGl0LCh2b2lkKikib3B0X3NxcCIpOw0KI2VuZGlmDQoNCn0N CiNpZmRlZiBfX2NwbHVzcGx1cw0KfQ0KI2VuZGlmDQo= ------_=_NextPart_001_01C48F6F.7BEFF18A--