[Mapserver-dev] OUTPUTFORMAT selection and IMAGETYPE parameter

Ed McNierney ed at topozone.com
Fri Feb 21 10:55:36 EST 2003


This is a multi-part message in MIME format.

------_=_NextPart_001_01C2D9C1.AC928D21
Content-Type: text/plain;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

Frank -

I think Steve Woodbridge's problem with OUTPUTFORMAT selection will be =
fixed by the same code I sent you a few weeks ago to check in to =
implement the IMAGETYPE parameter on the CGI command line.

I've attached the original message with the code.  I first implemented =
the querystring parameter and set the msObj->Map->imagetype to whatever =
string was passed in the IMAGETYPE=3Dxxx parameter.  This didn't work, =
and a few folks pointed out that I call msSelectOutputFormat to make it =
work - that wasn't enough, either, because it simply returned the =
outputformat object without doing anything with it.  I had to call =
msApplyOutputFormat, passing it the object returned by =
msSelectOutputFormat, to make it stick.

I was puzzled by Steve's bug (he wants the first OUTPUTFORMAT block in =
the file to be the default) because it works correctly on my build!  I =
am now suspecting that the second half of my changed also fixes this =
problem.  I'm *guessing* that msObj->Map->imagetype is ALWAYS being set =
at startup time, even if there is no IMAGETYPE statement in the map file =
or on the querystring.  If that's the case, then my change forces the =
outputformat object associated with that imagetype label to be =
"applied", which was not being done before.

	- Ed

Ed McNierney
President and Chief Mapmaker
TopoZone.com / Maps a la carte, Inc.
73 Princeton Street, Suite 305
North Chelmsford, MA  01863
ed at topozone.com
(978) 251-4242=20

------_=_NextPart_001_01C2D9C1.AC928D21
Content-Type: message/rfc822
Content-Transfer-Encoding: 7bit

MIME-Version: 1.0
Content-Type: multipart/mixed;
	boundary="----_=_NextPart_002_01C2CBCC.2AA56D66"
Subject: RE: [Mapserver-users] Querystring parameters for selecting OUTPUTFORMAT
X-MimeOLE: Produced By Microsoft Exchange V6.0.6249.0
content-class: urn:content-classes:message
Date: Mon, 3 Feb 2003 16:35:26 -0500
Message-ID: <13858AA1A74F30419F319ACB66A9D1221F3C5A at mercator.topozone.com>
X-MS-Has-Attach: yes
X-MS-TNEF-Correlator: 
Thread-Topic: [Mapserver-users] Querystring parameters for selecting OUTPUTFORMAT
Thread-Index: AcLJb1nlXCJaC1BdQ5eWmqXOGYltAwCXCNgQ
From: "Ed McNierney" <ed at topozone.com>
To: "Frank Warmerdam" <warmerdam at pobox.com>

This is a multi-part message in MIME format.

------_=_NextPart_002_01C2CBCC.2AA56D66
Content-Type: text/plain;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

Frank -

Attached is a new mapserv.c that implements the IMAGETYPE querystring =
parameter.  This is the only file changed; I just reapplied the changes =
to a fresh CVS checkout of mapserv.c.

The changes occur in two places.

First, the querystring parameter is checked in the usual manner:

/*
	Allow selection of IMAGETYPE from the command line
*/

    if(strncasecmp(msObj->ParamNames[i],"imagetype", 9) =3D=3D 0) { // =
select an image type defined by an OUTPUTFORMAT
      msObj->Map->imagetype =3D strdup(msObj->ParamValues[i]);
      continue;
    }

This saves the string label for the imagetype in the =
msObj->Map->imagetype object, which is where it's stored when read from =
the MAP file.

Second, I had to make a larger change than you suggested to implement =
the output setting.  You suggested calling msSelectOutputFormat with the =
new output imagetype string, but that seems to simply return a format =
object that matches the string - I then needed to pass that format =
object to msApplyOutputFormat in order to make it work.  It seemed like =
the best place to do this was immediately after the loadForm call that =
would load the querystring parameter:

	if(msObj->Map->imagetype !=3D NULL) {								/* If imagetype is set =
from the MAP file or a form variable */=09
	    msApplyOutputFormat( &(msObj->Map->outputformat),			/* Select the =
new output format from the table and apply it */
			msSelectOutputFormat(msObj->Map, msObj->Map->imagetype), =
msObj->Map->transparent, msObj->Map->interlace, msObj->Map->imagequality =
);
	}

Let me know if you have any questions - thanks!

	- Ed

Ed McNierney
President and Chief Mapmaker
TopoZone.com / Maps a la carte, Inc.
73 Princeton Street, Suite 305
North Chelmsford, MA  01863
ed at topozone.com
(978) 251-4242=20

-----Original Message-----
From: Frank Warmerdam [mailto:warmerdam at pobox.com]
Sent: Friday, January 31, 2003 4:26 PM
To: Ed McNierney
Subject: Re: [Mapserver-users] Querystring parameters for selecting
OUTPUTFORMAT


Ed McNierney wrote:
> Frank -
>=20
> Thanks for the quick reply.  Yes, this is to support regular CGI =
usage.  I'm
> not comfortable committing code changes to CVS, but this should be a =
short
> snippet and I'll send it to you for checkin.


Ed,

Sure thing.

Later,

--=20
---------------------------------------+---------------------------------=
-----
I set the clouds in motion - turn up   | Frank Warmerdam, =
warmerdam at pobox.com
light and sound - activate the windows | http://pobox.com/~warmerdam
and watch the world go round - Rush    | Geospatial Programmer for Rent



------_=_NextPart_002_01C2CBCC.2AA56D66
Content-Type: application/octet-stream;
	name="mapserv.c"
Content-Transfer-Encoding: base64
Content-Description: mapserv.c
Content-Disposition: attachment;
	filename="mapserv.c"

I2luY2x1ZGUgIm1hcHNlcnYuaCINCg0KI2lmZGVmIFVTRV9FR0lTIA0KI2luY2x1ZGUgPGVyckxv
Zy5oPiAgCS8vIGVnaXMgLSBpbmNsdWRlcw0KI2luY2x1ZGUgImVnaXMuaCINCiNpbmNsdWRlICJn
bG9iYWxTdHJ1Y3QuaCINCiNpbmNsdWRlICJlZ2lzSFRNTC5oIg0KDQovLyB0ZW1wbGF0ZSBzdHVm
Zg0KLy8jaW5jbHVkZSAibWFwdGVtcGxhdGUuYyINCg0KLy9PViAtZWdpcy0gZm9yIGxvY2FsIGRl
YnVnZ2luZywgaWYgc2V0IHZhcmlvdXMgbWVzc2FnZSB3aWxsIGJlIA0KLy8gcHJpbnRlZCB0byAv
dG1wL2VnaXNFcnJvci5sb2cNCg0KI2RlZmluZSBteURlYnVnIDAgDQojZGVmaW5lIG15RGVidWdI
dG1sIDANCg0KY2hhciBlcnJMb2dNc2dbODBdOwkvLyBlZ2lzIC0gZm9yIHN0b3JpbmcgYW5kIHBy
aW50aW5nIGVycm9yIG1lc3NhZ2VzDQojZW5kaWYNCg0KZXh0ZXJuIGRvdWJsZSBpbmNoZXNQZXJV
bml0WzZdOw0KDQptYXBzZXJ2T2JqKiBtc09iajsNCg0KaW50IHdyaXRlTG9nKGludCBzaG93X2Vy
cm9yKQ0Kew0KICBGSUxFICpzdHJlYW07DQogIGludCBpOw0KICB0aW1lX3QgdDsNCiAgY2hhciBz
elBhdGhbTVNfTUFYUEFUSExFTl07DQoNCiAgaWYoIW1zT2JqLT5NYXApIHJldHVybigwKTsNCiAg
aWYoIW1zT2JqLT5NYXAtPndlYi5sb2cpIHJldHVybigwKTsNCiAgDQogIGlmKChzdHJlYW0gPSBm
b3Blbihtc0J1aWxkUGF0aChzelBhdGgsIG1zT2JqLT5NYXAtPm1hcHBhdGgsIA0KICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBtc09iai0+TWFwLT53ZWIubG9nKSwiYSIpKSA9PSBO
VUxMKSB7DQogICAgbXNTZXRFcnJvcihNU19JT0VSUiwgbXNPYmotPk1hcC0+d2ViLmxvZywgIndy
aXRlTG9nKCkiKTsNCiAgICByZXR1cm4oLTEpOw0KICB9DQoNCiAgdCA9IHRpbWUoTlVMTCk7DQog
IGZwcmludGYoc3RyZWFtLCIlcywiLGNob3AoY3RpbWUoJnQpKSk7DQogIGZwcmludGYoc3RyZWFt
LCIlZCwiLChpbnQpZ2V0cGlkKCkpOw0KICANCiAgaWYoZ2V0ZW52KCJSRU1PVEVfQUREUiIpICE9
IE5VTEwpDQogICAgZnByaW50ZihzdHJlYW0sIiVzLCIsZ2V0ZW52KCJSRU1PVEVfQUREUiIpKTsN
CiAgZWxzZQ0KICAgIGZwcmludGYoc3RyZWFtLCJOVUxMLCIpOw0KIA0KICBmcHJpbnRmKHN0cmVh
bSwiJXMsIixtc09iai0+TWFwLT5uYW1lKTsNCiAgZnByaW50ZihzdHJlYW0sIiVkLCIsbXNPYmot
Pk1vZGUpOw0KDQogIGZwcmludGYoc3RyZWFtLCIlZiAlZiAlZiAlZiwiLCBtc09iai0+TWFwLT5l
eHRlbnQubWlueCwgbXNPYmotPk1hcC0+ZXh0ZW50Lm1pbnksIG1zT2JqLT5NYXAtPmV4dGVudC5t
YXh4LCBtc09iai0+TWFwLT5leHRlbnQubWF4eSk7DQoNCiAgZnByaW50ZihzdHJlYW0sIiVmICVm
LCIsIG1zT2JqLT5NYXBQbnQueCwgbXNPYmotPk1hcFBudC55KTsNCg0KICBmb3IoaT0wO2k8bXNP
YmotPk51bUxheWVycztpKyspDQogICAgZnByaW50ZihzdHJlYW0sICIlcyAiLCBtc09iai0+TGF5
ZXJzW2ldKTsNCiAgZnByaW50ZihzdHJlYW0sIiwiKTsNCg0KICBpZihzaG93X2Vycm9yID09IE1T
X1RSVUUpDQogICAgbXNXcml0ZUVycm9yKHN0cmVhbSk7DQogIGVsc2UNCiAgICBmcHJpbnRmKHN0
cmVhbSwgIm5vcm1hbCBleGVjdXRpb24iKTsNCg0KICBmcHJpbnRmKHN0cmVhbSwiXG4iKTsNCg0K
ICBmY2xvc2Uoc3RyZWFtKTsNCiAgcmV0dXJuKDApOw0KfQ0KDQp2b2lkIHdyaXRlRXJyb3IoKQ0K
ew0KICBlcnJvck9iaiAqbXNfZXJyb3IgPSBtc0dldEVycm9yT2JqKCk7DQoNCiAgd3JpdGVMb2co
TVNfVFJVRSk7DQoNCiAgaWYoIW1zT2JqLT5NYXApIHsNCiAgICBwcmludGYoIkNvbnRlbnQtdHlw
ZTogdGV4dC9odG1sJWMlYyIsMTAsMTApOw0KICAgIHByaW50ZigiPEhUTUw+XG4iKTsNCiAgICBw
cmludGYoIjxIRUFEPjxUSVRMRT5NYXBTZXJ2ZXIgTWVzc2FnZTwvVElUTEU+PC9IRUFEPlxuIik7
DQogICAgcHJpbnRmKCI8IS0tICVzIC0tPlxuIiwgbXNHZXRWZXJzaW9uKCkpOw0KICAgIHByaW50
ZigiPEJPRFkgQkdDT0xPUj1cIiNGRkZGRkZcIj5cbiIpOw0KICAgIG1zV3JpdGVFcnJvcihzdGRv
dXQpOw0KICAgIHByaW50ZigiPC9CT0RZPjwvSFRNTD4iKTsNCiAgICBleGl0KDApOw0KICB9DQoN
CiAgaWYoKG1zX2Vycm9yLT5jb2RlID09IE1TX05PVEZPVU5EKSAmJiAobXNPYmotPk1hcC0+d2Vi
LmVtcHR5KSkgew0KICAgIG1zUmVkaXJlY3QobXNPYmotPk1hcC0+d2ViLmVtcHR5KTsNCiAgfSBl
bHNlIHsNCiAgICBpZihtc09iai0+TWFwLT53ZWIuZXJyb3IpIHsgICAgICANCiAgICAgIG1zUmVk
aXJlY3QobXNPYmotPk1hcC0+d2ViLmVycm9yKTsNCiAgICB9IGVsc2Ugew0KICAgICAgcHJpbnRm
KCJDb250ZW50LXR5cGU6IHRleHQvaHRtbCVjJWMiLDEwLDEwKTsNCiAgICAgIHByaW50ZigiPEhU
TUw+XG4iKTsNCiAgICAgIHByaW50ZigiPEhFQUQ+PFRJVExFPk1hcFNlcnZlciBNZXNzYWdlPC9U
SVRMRT48L0hFQUQ+XG4iKTsNCiAgICAgIHByaW50ZigiPCEtLSAlcyAtLT5cbiIsIG1zR2V0VmVy
c2lvbigpKTsNCiAgICAgIHByaW50ZigiPEJPRFkgQkdDT0xPUj1cIiNGRkZGRkZcIj5cbiIpOw0K
ICAgICAgbXNXcml0ZUVycm9yKHN0ZG91dCk7DQogICAgICBwcmludGYoIjwvQk9EWT48L0hUTUw+
Iik7DQogICAgfQ0KICB9DQoNCiAgLyoNCiAgKiogQ2xlYW4gVXANCiAgKi8NCiAgZnJlZShJdGVt
KTsNCiAgZnJlZShWYWx1ZSk7ICAgICAgDQogIGZyZWUoUXVlcnlGaWxlKTsNCiAgZnJlZShRdWVy
eUxheWVyKTsgICAgICANCiAgZnJlZShTZWxlY3RMYXllcik7DQoNCiAgbXNGcmVlTWFwU2Vydk9i
aihtc09iaik7DQoNCiAgZXhpdCgwKTsgLy8gYmFpbA0KfQ0KDQovKg0KKiogQ29udmVydHMgYSBz
dHJpbmcgKGUuZy4gZm9ybSBwYXJhbWV0ZXIpIHRvIGEgZG91YmxlLCBmaXJzdCBjaGVja2luZyB0
aGUgZm9ybWF0IGFnYWluc3QNCioqIGEgcmVndWxhciBleHByZXNzaW9uLiBEdW1wcyBhbiBlcnJv
ciBpbW1lZGlhdGVseSBpZiB0aGUgZm9ybWF0IHRlc3QgZmFpbHMuDQoqLw0Kc3RhdGljIGRvdWJs
ZSBnZXROdW1lcmljKHJlZ2V4X3QgcmUsIGNoYXIgKnMpDQp7DQogIHJlZ21hdGNoX3QgKm1hdGNo
Ow0KICANCiAgaWYoKG1hdGNoID0gKHJlZ21hdGNoX3QgKiltYWxsb2Moc2l6ZW9mKHJlZ21hdGNo
X3QpKSkgPT0gTlVMTCkgew0KICAgIG1zU2V0RXJyb3IoTVNfTUVNRVJSLCBOVUxMLCAiZ2V0TnVt
ZXJpYygpIik7DQogICAgd3JpdGVFcnJvcigpOw0KICB9DQogIA0KICBpZihyZWdleGVjKCZyZSwg
cywgKHNpemVfdCkxLCBtYXRjaCwgMCkgPT0gUkVHX05PTUFUQ0gpIHsNCiAgICBmcmVlKG1hdGNo
KTsNCiAgICBtc1NldEVycm9yKE1TX1RZUEVFUlIsIE5VTEwsICJnZXROdW1lcmljKCkiKTsgDQog
ICAgd3JpdGVFcnJvcigpOw0KICB9DQogIA0KICBpZihzdHJsZW4ocykgIT0gKG1hdGNoLT5ybV9l
byAtIG1hdGNoLT5ybV9zbykpIHsgLyogd2hvbGUgc3RyaW5nIG11c3QgbWF0Y2ggKi8gICAgDQog
ICAgZnJlZShtYXRjaCk7DQogICAgbXNTZXRFcnJvcihNU19UWVBFRVJSLCBOVUxMLCAiZ2V0TnVt
ZXJpYygpIik7IA0KICAgIHdyaXRlRXJyb3IoKTsNCiAgfQ0KICANCiAgZnJlZShtYXRjaCk7DQog
IHJldHVybihhdG9mKHMpKTsNCn0NCg0KLyoNCioqIEV4dHJhY3QgTWFwIEZpbGUgbmFtZSBmcm9t
IHBhcmFtcyBhbmQgbG9hZCBpdC4gIA0KKiogUmV0dXJucyBtYXAgb2JqZWN0IG9yIE5VTEwgb24g
ZXJyb3IuDQoqLw0KbWFwT2JqICpsb2FkTWFwKCkNCnsNCiAgaW50IGksaixrOw0KICBtYXBPYmog
Km1hcCA9IE5VTEw7DQogIGNoYXIgKnRtcHN0cjsNCg0KICBmb3IoaT0wO2k8bXNPYmotPk51bVBh
cmFtcztpKyspIC8vIGZpbmQgdGhlIG1hcGZpbGUgcGFyYW1ldGVyIGZpcnN0DQogICAgaWYoc3Ry
Y2FzZWNtcChtc09iai0+UGFyYW1OYW1lc1tpXSwgIm1hcCIpID09IDApIGJyZWFrOw0KICANCiAg
aWYoaSA9PSBtc09iai0+TnVtUGFyYW1zKSB7DQogICAgaWYoZ2V0ZW52KCJNU19NQVBGSUxFIikp
IC8vIGhhcyBhIGRlZmF1bHQgZmlsZSBoYXMgbm90IGJlZW4gc2V0DQogICAgICBtYXAgPSBtc0xv
YWRNYXAoZ2V0ZW52KCJNU19NQVBGSUxFIiksIE5VTEwpOw0KICAgIGVsc2Ugew0KICAgICAgbXNT
ZXRFcnJvcihNU19XRUJFUlIsICJDR0kgdmFyaWFibGUgXCJtYXBcIiBpcyBub3Qgc2V0LiIsICJs
b2FkTWFwKCkiKTsgLy8gbm8gZGVmYXVsdCwgb3V0dGEgaGVyZQ0KICAgICAgd3JpdGVFcnJvcigp
Ow0KICAgIH0NCiAgfSBlbHNlIHsNCiAgICBpZihnZXRlbnYobXNPYmotPlBhcmFtVmFsdWVzW2ld
KSkgLy8gYW4gZW52aXJvbm1lbnQgcmVmZXJlbmNlcyB0aGUgYWN0dWFsIGZpbGUgdG8gdXNlDQog
ICAgICBtYXAgPSBtc0xvYWRNYXAoZ2V0ZW52KG1zT2JqLT5QYXJhbVZhbHVlc1tpXSksIE5VTEwp
Ow0KICAgIGVsc2UNCiAgICAgIG1hcCA9IG1zTG9hZE1hcChtc09iai0+UGFyYW1WYWx1ZXNbaV0s
IE5VTEwpOw0KICB9DQoNCiAgaWYoIW1hcCkgd3JpdGVFcnJvcigpOw0KDQogIC8vIGNoZWNrIGZv
ciBhbnkgJXZhcmlhYmxlJSBzdWJzdGl0dXRpb25zIGhlcmUsIHdlIGRvIHRoaXMgaGVyZSBzbyBX
TVMvV0ZTIHNlcnZpY2VzIGNhbiB0YWtlIGFkdmFudGFnZSBvZiB0aGlzDQogIGZvcihpPTA7aTxt
c09iai0+TnVtUGFyYW1zO2krKykgew0KICAgIHRtcHN0ciA9IChjaGFyICopbWFsbG9jKHNpemVv
ZihjaGFyKSpzdHJsZW4obXNPYmotPlBhcmFtTmFtZXNbaV0pICsgMyk7DQogICAgc3ByaW50Zih0
bXBzdHIsIiUlJXMlJSIsIG1zT2JqLT5QYXJhbU5hbWVzW2ldKTsNCiAgICANCiAgICBmb3Ioaj0w
OyBqPG1hcC0+bnVtbGF5ZXJzOyBqKyspIHsNCiAgICAgIGlmKG1hcC0+bGF5ZXJzW2pdLmRhdGEg
JiYgKHN0cnN0cihtYXAtPmxheWVyc1tqXS5kYXRhLCB0bXBzdHIpICE9IE5VTEwpKSBtYXAtPmxh
eWVyc1tqXS5kYXRhID0gZ3N1YihtYXAtPmxheWVyc1tqXS5kYXRhLCB0bXBzdHIsIG1zT2JqLT5Q
YXJhbVZhbHVlc1tpXSk7DQogICAgICBpZihtYXAtPmxheWVyc1tqXS5jb25uZWN0aW9uICYmIChz
dHJzdHIobWFwLT5sYXllcnNbal0uY29ubmVjdGlvbiwgdG1wc3RyKSAhPSBOVUxMKSkgbWFwLT5s
YXllcnNbal0uY29ubmVjdGlvbiA9IGdzdWIobWFwLT5sYXllcnNbal0uY29ubmVjdGlvbiwgdG1w
c3RyLCBtc09iai0+UGFyYW1WYWx1ZXNbaV0pOw0KICAgICAgaWYobWFwLT5sYXllcnNbal0uZmls
dGVyLnN0cmluZyAmJiAoc3Ryc3RyKG1hcC0+bGF5ZXJzW2pdLmZpbHRlci5zdHJpbmcsIHRtcHN0
cikgIT0gTlVMTCkpIG1hcC0+bGF5ZXJzW2pdLmZpbHRlci5zdHJpbmcgPSBnc3ViKG1hcC0+bGF5
ZXJzW2pdLmZpbHRlci5zdHJpbmcsIHRtcHN0ciwgbXNPYmotPlBhcmFtVmFsdWVzW2ldKTsNCiAg
ICAgIGZvcihrPTA7IGs8bWFwLT5sYXllcnNbal0ubnVtY2xhc3NlczsgaysrKQ0KCWlmKG1hcC0+
bGF5ZXJzW2pdLmNsYXNzW2tdLmV4cHJlc3Npb24uc3RyaW5nICYmIChzdHJzdHIobWFwLT5sYXll
cnNbal0uY2xhc3Nba10uZXhwcmVzc2lvbi5zdHJpbmcsIHRtcHN0cikgIT0gTlVMTCkpIG1hcC0+
bGF5ZXJzW2pdLmNsYXNzW2tdLmV4cHJlc3Npb24uc3RyaW5nID0gZ3N1YihtYXAtPmxheWVyc1tq
XS5jbGFzc1trXS5leHByZXNzaW9uLnN0cmluZywgdG1wc3RyLCBtc09iai0+UGFyYW1WYWx1ZXNb
aV0pOw0KICAgIH0NCiAgICANCiAgICBmcmVlKHRtcHN0cik7DQogIH0NCg0KICByZXR1cm4gbWFw
Ow0KfQ0KDQovKg0KKiogUHJvY2VzcyBDR0kgcGFyYW1ldGVycy4NCiovDQp2b2lkIGxvYWRGb3Jt
KCkNCnsNCiAgaW50IGksaixuOw0KICBjaGFyICoqdG9rZW5zLCAqdG1wc3RyOw0KICByZWdleF90
IHJlOw0KICBpbnQgcm9zYV90eXBlPTA7DQoNCiAgaWYocmVnY29tcCgmcmUsIE5VTUVYUCwgUkVH
X0VYVEVOREVEKSAhPSAwKSB7IC8vIHdoYXQgaXMgYSBudW1iZXINCiAgICBtc1NldEVycm9yKE1T
X1JFR0VYRVJSLCBOVUxMLCAibG9hZEZvcm0oKSIpOyANCiAgICB3cml0ZUVycm9yKCk7DQogIH0N
Cg0KICBmb3IoaT0wO2k8bXNPYmotPk51bVBhcmFtcztpKyspIHsgLy8gbm93IHByb2Nlc3MgdGhl
IHJlc3Qgb2YgdGhlIGZvcm0gdmFyaWFibGVzDQogICAgaWYoc3RybGVuKG1zT2JqLT5QYXJhbVZh
bHVlc1tpXSkgPT0gMCkNCiAgICAgIGNvbnRpbnVlOw0KICAgIA0KICAgIGlmKHN0cmNhc2VjbXAo
bXNPYmotPlBhcmFtTmFtZXNbaV0sInF1ZXJ5ZmlsZSIpID09IDApIHsgICAgICANCiAgICAgIFF1
ZXJ5RmlsZSA9IHN0cmR1cChtc09iai0+UGFyYW1WYWx1ZXNbaV0pOw0KICAgICAgY29udGludWU7
DQogICAgfQ0KICAgIA0KICAgIGlmKHN0cmNhc2VjbXAobXNPYmotPlBhcmFtTmFtZXNbaV0sInNh
dmVxdWVyeSIpID09IDApIHsNCiAgICAgIG1zT2JqLT5TYXZlUXVlcnkgPSBNU19UUlVFOw0KICAg
ICAgY29udGludWU7DQogICAgfQ0KICAgIA0KICAgIC8qIEluc2VjdXJlIGFzIGltcGxlbWVudGVk
LCBuZWVkIHRvIHNhdmUgc29tZXBsYWNlIG5vbiBhY2Nlc3NpYmxlIGJ5IGV2ZXJ5b25lIGluIHRo
ZSB1bml2ZXJzZQ0KICAgICAgICBpZihzdHJjYXNlY21wKG1zT2JqLT5QYXJhbU5hbWVzW2ldLCJz
YXZlbWFwIikgPT0gMCkgeyAgICAgIA0KICAgICAgICAgbXNPYmotPlNhdmVNYXAgPSBNU19UUlVF
Ow0KICAgICAgICAgY29udGludWU7DQogICAgICAgIH0NCiAgICAqLw0KDQogICAgaWYoc3RyY2Fz
ZWNtcChtc09iai0+UGFyYW1OYW1lc1tpXSwiem9vbSIpID09IDApIHsNCiAgICAgIG1zT2JqLT5a
b29tID0gZ2V0TnVtZXJpYyhyZSwgbXNPYmotPlBhcmFtVmFsdWVzW2ldKTsgICAgICANCiAgICAg
IGlmKChtc09iai0+Wm9vbSA+IE1BWFpPT00pIHx8IChtc09iai0+Wm9vbSA8IE1JTlpPT00pKSB7
DQoJbXNTZXRFcnJvcihNU19XRUJFUlIsICJab29tIHZhbHVlIG91dCBvZiByYW5nZS4iLCAibG9h
ZEZvcm0oKSIpOw0KCXdyaXRlRXJyb3IoKTsNCiAgICAgIH0NCiAgICAgIGNvbnRpbnVlOw0KICAg
IH0NCg0KICAgIGlmKHN0cmNhc2VjbXAobXNPYmotPlBhcmFtTmFtZXNbaV0sInpvb21kaXIiKSA9
PSAwKSB7DQogICAgICBtc09iai0+Wm9vbURpcmVjdGlvbiA9IGdldE51bWVyaWMocmUsIG1zT2Jq
LT5QYXJhbVZhbHVlc1tpXSk7DQogICAgICBpZigobXNPYmotPlpvb21EaXJlY3Rpb24gIT0gLTEp
ICYmIChtc09iai0+Wm9vbURpcmVjdGlvbiAhPSAxKSAmJiAobXNPYmotPlpvb21EaXJlY3Rpb24g
IT0gMCkpIHsNCgltc1NldEVycm9yKE1TX1dFQkVSUiwgIlpvb20gZGlyZWN0aW9uIG11c3QgYmUg
MSwgMCBvciAtMS4iLCAibG9hZEZvcm0oKSIpOw0KCXdyaXRlRXJyb3IoKTsNCiAgICAgIH0NCiAg
ICAgIGNvbnRpbnVlOw0KICAgIH0NCg0KICAgIGlmKHN0cmNhc2VjbXAobXNPYmotPlBhcmFtTmFt
ZXNbaV0sInpvb21zaXplIikgPT0gMCkgeyAvLyBhYnNvbHV0ZSB6b29tIG1hZ25pdHVkZQ0KICAg
ICAgWm9vbVNpemUgPSBnZXROdW1lcmljKHJlLCBtc09iai0+UGFyYW1WYWx1ZXNbaV0pOyAgICAg
IA0KICAgICAgaWYoKFpvb21TaXplID4gTUFYWk9PTSkgfHwgKFpvb21TaXplIDwgMSkpIHsNCglt
c1NldEVycm9yKE1TX1dFQkVSUiwgIkludmFsaWQgem9vbSBzaXplLiIsICJsb2FkRm9ybSgpIik7
DQoJd3JpdGVFcnJvcigpOw0KICAgICAgfQkNCiAgICAgIGNvbnRpbnVlOw0KICAgIH0NCiAgICAN
CiAgICBpZihzdHJjYXNlY21wKG1zT2JqLT5QYXJhbU5hbWVzW2ldLCJpbWdleHQiKSA9PSAwKSB7
IC8vIGV4dGVudCBvZiBhbiBleGlzdGluZyBpbWFnZSBpbiBhIHdlYiBhcHBsaWNhdGlvbg0KICAg
ICAgdG9rZW5zID0gc3BsaXQobXNPYmotPlBhcmFtVmFsdWVzW2ldLCAnICcsICZuKTsNCg0KICAg
ICAgaWYoIXRva2Vucykgew0KCW1zU2V0RXJyb3IoTVNfTUVNRVJSLCBOVUxMLCAibG9hZEZvcm0o
KSIpOw0KCXdyaXRlRXJyb3IoKTsNCiAgICAgIH0NCg0KICAgICAgaWYobiAhPSA0KSB7DQoJbXNT
ZXRFcnJvcihNU19XRUJFUlIsICJOb3QgZW5vdWdoIGFyZ3VtZW50cyBmb3IgaW1nZXh0LiIsICJs
b2FkRm9ybSgpIik7DQoJd3JpdGVFcnJvcigpOw0KICAgICAgfQ0KDQogICAgICBtc09iai0+SW1n
RXh0Lm1pbnggPSBnZXROdW1lcmljKHJlLCB0b2tlbnNbMF0pOw0KICAgICAgbXNPYmotPkltZ0V4
dC5taW55ID0gZ2V0TnVtZXJpYyhyZSwgdG9rZW5zWzFdKTsNCiAgICAgIG1zT2JqLT5JbWdFeHQu
bWF4eCA9IGdldE51bWVyaWMocmUsIHRva2Vuc1syXSk7DQogICAgICBtc09iai0+SW1nRXh0Lm1h
eHkgPSBnZXROdW1lcmljKHJlLCB0b2tlbnNbM10pOw0KDQogICAgICBtc0ZyZWVDaGFyQXJyYXko
dG9rZW5zLCA0KTsNCiAgICAgIGNvbnRpbnVlOw0KICAgIH0NCg0KICAgIGlmKHN0cmNhc2VjbXAo
bXNPYmotPlBhcmFtTmFtZXNbaV0sInNlYXJjaG1hcCIpID09IDApIHsgICAgICANCiAgICAgIFNl
YXJjaE1hcCA9IE1TX1RSVUU7DQogICAgICBjb250aW51ZTsNCiAgICB9DQoNCiAgICBpZihzdHJj
YXNlY21wKG1zT2JqLT5QYXJhbU5hbWVzW2ldLCJpZCIpID09IDApIHsNCiAgICAgIHN0cm5jcHko
bXNPYmotPklkLCBtc09iai0+UGFyYW1WYWx1ZXNbaV0sIElEU0laRSk7DQogICAgICBjb250aW51
ZTsNCiAgICB9DQoNCiAgICBpZihzdHJjYXNlY21wKG1zT2JqLT5QYXJhbU5hbWVzW2ldLCJtYXBl
eHQiKSA9PSAwKSB7IC8vIGV4dGVudCBvZiB0aGUgbmV3IG1hcCBvciBxdWVyeQ0KDQogICAgICBp
ZihzdHJuY2FzZWNtcChtc09iai0+UGFyYW1WYWx1ZXNbaV0sInNoYXBlIiw1KSA9PSAwKQ0KICAg
ICAgICBtc09iai0+VXNlU2hhcGVzID0gTVNfVFJVRTsNCiAgICAgIGVsc2Ugew0KCXRva2VucyA9
IHNwbGl0KG1zT2JqLT5QYXJhbVZhbHVlc1tpXSwgJyAnLCAmbik7DQoJDQoJaWYoIXRva2Vucykg
ew0KCSAgbXNTZXRFcnJvcihNU19NRU1FUlIsIE5VTEwsICJsb2FkRm9ybSgpIik7DQoJICB3cml0
ZUVycm9yKCk7DQoJfQ0KCQ0KCWlmKG4gIT0gNCkgew0KCSAgbXNTZXRFcnJvcihNU19XRUJFUlIs
ICJOb3QgZW5vdWdoIGFyZ3VtZW50cyBmb3IgbWFwZXh0LiIsICJsb2FkRm9ybSgpIik7DQoJICB3
cml0ZUVycm9yKCk7DQoJfQ0KCQ0KCW1zT2JqLT5NYXAtPmV4dGVudC5taW54ID0gZ2V0TnVtZXJp
YyhyZSwgdG9rZW5zWzBdKTsNCgltc09iai0+TWFwLT5leHRlbnQubWlueSA9IGdldE51bWVyaWMo
cmUsIHRva2Vuc1sxXSk7DQoJbXNPYmotPk1hcC0+ZXh0ZW50Lm1heHggPSBnZXROdW1lcmljKHJl
LCB0b2tlbnNbMl0pOw0KCW1zT2JqLT5NYXAtPmV4dGVudC5tYXh5ID0gZ2V0TnVtZXJpYyhyZSwg
dG9rZW5zWzNdKTsJDQoJDQoJbXNGcmVlQ2hhckFycmF5KHRva2VucywgNCk7DQoJDQojaWZkZWYg
VVNFX1BST0oNCglpZihtc09iai0+TWFwLT5wcm9qZWN0aW9uLnByb2ogJiYgIXBqX2lzX2xhdGxv
bmcobXNPYmotPk1hcC0+cHJvamVjdGlvbi5wcm9qKQ0KICAgICAgICAgICAmJiAobXNPYmotPk1h
cC0+ZXh0ZW50Lm1pbnggPj0gLTE4MC4wICYmIG1zT2JqLT5NYXAtPmV4dGVudC5taW54IDw9IDE4
MC4wKSANCiAgICAgICAgICAgJiYgKG1zT2JqLT5NYXAtPmV4dGVudC5taW55ID49IC05MC4wICYm
IG1zT2JqLT5NYXAtPmV4dGVudC5taW55IDw9IDkwLjApKQ0KCSAgbXNQcm9qZWN0UmVjdCgmKG1z
T2JqLT5NYXAtPmxhdGxvbiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgJihtc09iai0+TWFw
LT5wcm9qZWN0aW9uKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAmKG1zT2JqLT5NYXAtPmV4
dGVudCkpOyAvLyBleHRlbnQgaXMgYSBpbiBsYXQvbG9uDQojZW5kaWYNCg0KCWlmKChtc09iai0+
TWFwLT5leHRlbnQubWlueCAhPSBtc09iai0+TWFwLT5leHRlbnQubWF4eCkgJiYgKG1zT2JqLT5N
YXAtPmV4dGVudC5taW55ICE9IG1zT2JqLT5NYXAtPmV4dGVudC5tYXh5KSkgeyAvLyBleHRlbnQg
c2VlbXMgb2sNCgkgIG1zT2JqLT5Db29yZFNvdXJjZSA9IEZST01VU0VSQk9YOw0KCSAgUXVlcnlD
b29yZFNvdXJjZSA9IEZST01VU0VSQk9YOw0KCX0NCiAgICAgIH0NCg0KICAgICAgY29udGludWU7
DQogICAgfQ0KDQogICAgaWYoc3RyY2FzZWNtcChtc09iai0+UGFyYW1OYW1lc1tpXSwibWlueCIp
ID09IDApIHsgLy8gZXh0ZW50IG9mIHRoZSBuZXcgbWFwLCBpbiBwaWVjZXMNCiAgICAgIG1zT2Jq
LT5NYXAtPmV4dGVudC5taW54ID0gZ2V0TnVtZXJpYyhyZSwgbXNPYmotPlBhcmFtVmFsdWVzW2ld
KTsgICAgICANCiAgICAgIGNvbnRpbnVlOw0KICAgIH0NCiAgICBpZihzdHJjYXNlY21wKG1zT2Jq
LT5QYXJhbU5hbWVzW2ldLCJtYXh4IikgPT0gMCkgeyAgICAgIA0KICAgICAgbXNPYmotPk1hcC0+
ZXh0ZW50Lm1heHggPSBnZXROdW1lcmljKHJlLCBtc09iai0+UGFyYW1WYWx1ZXNbaV0pOw0KICAg
ICAgY29udGludWU7DQogICAgfQ0KICAgIGlmKHN0cmNhc2VjbXAobXNPYmotPlBhcmFtTmFtZXNb
aV0sIm1pbnkiKSA9PSAwKSB7DQogICAgICBtc09iai0+TWFwLT5leHRlbnQubWlueSA9IGdldE51
bWVyaWMocmUsIG1zT2JqLT5QYXJhbVZhbHVlc1tpXSk7DQogICAgICBjb250aW51ZTsNCiAgICB9
DQogICAgaWYoc3RyY2FzZWNtcChtc09iai0+UGFyYW1OYW1lc1tpXSwibWF4eSIpID09IDApIHsN
CiAgICAgIG1zT2JqLT5NYXAtPmV4dGVudC5tYXh5ID0gZ2V0TnVtZXJpYyhyZSwgbXNPYmotPlBh
cmFtVmFsdWVzW2ldKTsNCiAgICAgIG1zT2JqLT5Db29yZFNvdXJjZSA9IEZST01VU0VSQk9YOw0K
ICAgICAgUXVlcnlDb29yZFNvdXJjZSA9IEZST01VU0VSQk9YOw0KICAgICAgY29udGludWU7DQog
ICAgfSANCg0KICAgIGlmKHN0cmNhc2VjbXAobXNPYmotPlBhcmFtTmFtZXNbaV0sIm1hcHh5Iikg
PT0gMCkgeyAvLyB1c2VyIG1hcCBjb29yZGluYXRlDQogICAgICANCiAgICAgIGlmKHN0cm5jYXNl
Y21wKG1zT2JqLT5QYXJhbVZhbHVlc1tpXSwic2hhcGUiLDUpID09IDApIHsNCiAgICAgICAgbXNP
YmotPlVzZVNoYXBlcyA9IE1TX1RSVUU7CQ0KICAgICAgfSBlbHNlIHsNCgl0b2tlbnMgPSBzcGxp
dChtc09iai0+UGFyYW1WYWx1ZXNbaV0sICcgJywgJm4pOw0KDQoJaWYoIXRva2Vucykgew0KCSAg
bXNTZXRFcnJvcihNU19NRU1FUlIsIE5VTEwsICJsb2FkRm9ybSgpIik7DQoJICB3cml0ZUVycm9y
KCk7DQoJfQ0KCQ0KCWlmKG4gIT0gMikgew0KCSAgbXNTZXRFcnJvcihNU19XRUJFUlIsICJOb3Qg
ZW5vdWdoIGFyZ3VtZW50cyBmb3IgbWFweHkuIiwgImxvYWRGb3JtKCkiKTsNCgkgIHdyaXRlRXJy
b3IoKTsNCgl9DQoJDQoJbXNPYmotPk1hcFBudC54ID0gZ2V0TnVtZXJpYyhyZSwgdG9rZW5zWzBd
KTsNCgltc09iai0+TWFwUG50LnkgPSBnZXROdW1lcmljKHJlLCB0b2tlbnNbMV0pOw0KCQ0KCW1z
RnJlZUNoYXJBcnJheSh0b2tlbnMsIDIpOw0KDQojaWZkZWYgVVNFX1BST0oNCglpZihtc09iai0+
TWFwLT5wcm9qZWN0aW9uLnByb2ogJiYgIXBqX2lzX2xhdGxvbmcobXNPYmotPk1hcC0+cHJvamVj
dGlvbi5wcm9qKQ0KICAgICAgICAgICAmJiAobXNPYmotPk1hcFBudC54ID49IC0xODAuMCAmJiBt
c09iai0+TWFwUG50LnggPD0gMTgwLjApIA0KICAgICAgICAgICAmJiAobXNPYmotPk1hcFBudC55
ID49IC05MC4wICYmIG1zT2JqLT5NYXBQbnQueSA8PSA5MC4wKSkNCgkgIG1zUHJvamVjdFBvaW50
KCYobXNPYmotPk1hcC0+cHJvamVjdGlvbiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICYo
bXNPYmotPk1hcC0+cHJvamVjdGlvbiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICZtc09i
ai0+TWFwUG50KTsgLy8gcG9pbnQgaXMgYSBpbiBsYXQvbG9uDQojZW5kaWYNCg0KCWlmKG1zT2Jq
LT5Db29yZFNvdXJjZSA9PSBOT05FKSB7IC8vIGRvbid0IG92ZXJyaWRlIHByZXZpb3VzIHNldHRp
bmdzIChpLmUuIGJ1ZmZlciBvciBzY2FsZSApDQoJICBtc09iai0+Q29vcmRTb3VyY2UgPSBGUk9N
VVNFUlBOVDsNCgkgIFF1ZXJ5Q29vcmRTb3VyY2UgPSBGUk9NVVNFUlBOVDsNCgl9DQogICAgICB9
DQogICAgICBjb250aW51ZTsNCiAgICB9DQoNCiAgICBpZihzdHJjYXNlY21wKG1zT2JqLT5QYXJh
bU5hbWVzW2ldLCJtYXBzaGFwZSIpID09IDApIHsgLy8gcXVlcnkgc2hhcGUNCiAgICAgIGxpbmVP
YmogbGluZT17MCxOVUxMfTsNCiAgICAgIGNoYXIgKip0bXA9TlVMTDsNCiAgICAgIGludCBuLCBq
Ow0KICAgICAgDQogICAgICB0bXAgPSBzcGxpdChtc09iai0+UGFyYW1WYWx1ZXNbaV0sICcgJywg
Jm4pOw0KDQogICAgICBpZigobGluZS5wb2ludCA9IChwb2ludE9iaiAqKW1hbGxvYyhzaXplb2Yo
cG9pbnRPYmopKihuLzIpKSkgPT0gTlVMTCkgew0KCW1zU2V0RXJyb3IoTVNfTUVNRVJSLCBOVUxM
LCAibG9hZEZvcm0oKSIpOw0KCXdyaXRlRXJyb3IoKTsNCiAgICAgIH0NCiAgICAgIGxpbmUubnVt
cG9pbnRzID0gbi8yOw0KDQogICAgICBtc0luaXRTaGFwZSgmKG1zT2JqLT5TZWxlY3RTaGFwZSkp
Ow0KICAgICAgbXNPYmotPlNlbGVjdFNoYXBlLnR5cGUgPSBNU19TSEFQRV9QT0xZR09OOw0KDQog
ICAgICBmb3Ioaj0wOyBqPG4vMjsgaisrKSB7DQoJbGluZS5wb2ludFtqXS54ID0gYXRvZih0bXBb
MipqXSk7DQoJbGluZS5wb2ludFtqXS55ID0gYXRvZih0bXBbMipqKzFdKTsNCg0KI2lmZGVmIFVT
RV9QUk9KDQoJaWYobXNPYmotPk1hcC0+cHJvamVjdGlvbi5wcm9qICYmICFwal9pc19sYXRsb25n
KG1zT2JqLT5NYXAtPnByb2plY3Rpb24ucHJvaikNCiAgICAgICAgICAgJiYgKGxpbmUucG9pbnRb
al0ueCA+PSAtMTgwLjAgJiYgbGluZS5wb2ludFtqXS54IDw9IDE4MC4wKSANCiAgICAgICAgICAg
JiYgKGxpbmUucG9pbnRbal0ueSA+PSAtOTAuMCAmJiBsaW5lLnBvaW50W2pdLnkgPD0gOTAuMCkp
DQoJICBtc1Byb2plY3RQb2ludCgmKG1zT2JqLT5NYXAtPmxhdGxvbiksIA0KICAgICAgICAgICAg
ICAgICAgICAgICAgICYobXNPYmotPk1hcC0+cHJvamVjdGlvbiksIA0KICAgICAgICAgICAgICAg
ICAgICAgICAgICZsaW5lLnBvaW50W2pdKTsgLy8gcG9pbnQgaXMgYSBpbiBsYXQvbG9uDQojZW5k
aWYNCiAgICAgIH0NCg0KICAgICAgaWYobXNBZGRMaW5lKCZtc09iai0+U2VsZWN0U2hhcGUsICZs
aW5lKSA9PSAtMSkgd3JpdGVFcnJvcigpOw0KDQogICAgICBtc0ZyZWUobGluZS5wb2ludCk7CQ0K
ICAgICAgbXNGcmVlQ2hhckFycmF5KHRtcCwgbik7DQoNCiAgICAgIFF1ZXJ5Q29vcmRTb3VyY2Ug
PSBGUk9NVVNFUlNIQVBFOw0KICAgICAgY29udGludWU7DQogICAgfQ0KDQogICAgaWYoc3RyY2Fz
ZWNtcChtc09iai0+UGFyYW1OYW1lc1tpXSwiaW1nLngiKSA9PSAwKSB7IC8vIG1vdXNlIGNsaWNr
LCBpbiBwaWVjZXMNCiAgICAgIG1zT2JqLT5JbWdQbnQueCA9IGdldE51bWVyaWMocmUsIG1zT2Jq
LT5QYXJhbVZhbHVlc1tpXSk7DQogICAgICBpZigobXNPYmotPkltZ1BudC54ID4gKDIqTVNfTUFY
SU1HU0laRSkpIHx8IChtc09iai0+SW1nUG50LnggPCAoLTIqTVNfTUFYSU1HU0laRSkpKSB7DQoJ
bXNTZXRFcnJvcihNU19XRUJFUlIsICJDb29yZGluYXRlIG91dCBvZiByYW5nZS4iLCAibG9hZEZv
cm0oKSIpOw0KCXdyaXRlRXJyb3IoKTsNCiAgICAgIH0NCiAgICAgIG1zT2JqLT5Db29yZFNvdXJj
ZSA9IEZST01JTUdQTlQ7DQogICAgICBRdWVyeUNvb3JkU291cmNlID0gRlJPTUlNR1BOVDsNCiAg
ICAgIGNvbnRpbnVlOw0KICAgIH0NCiAgICBpZihzdHJjYXNlY21wKG1zT2JqLT5QYXJhbU5hbWVz
W2ldLCJpbWcueSIpID09IDApIHsNCiAgICAgIG1zT2JqLT5JbWdQbnQueSA9IGdldE51bWVyaWMo
cmUsIG1zT2JqLT5QYXJhbVZhbHVlc1tpXSk7ICAgICAgDQogICAgICBpZigobXNPYmotPkltZ1Bu
dC55ID4gKDIqTVNfTUFYSU1HU0laRSkpIHx8IChtc09iai0+SW1nUG50LnkgPCAoLTIqTVNfTUFY
SU1HU0laRSkpKSB7DQoJbXNTZXRFcnJvcihNU19XRUJFUlIsICJDb29yZGluYXRlIG91dCBvZiBy
YW5nZS4iLCAibG9hZEZvcm0oKSIpOw0KCXdyaXRlRXJyb3IoKTsNCiAgICAgIH0NCiAgICAgIG1z
T2JqLT5Db29yZFNvdXJjZSA9IEZST01JTUdQTlQ7DQogICAgICBRdWVyeUNvb3JkU291cmNlID0g
RlJPTUlNR1BOVDsNCiAgICAgIGNvbnRpbnVlOw0KICAgIH0NCg0KICAgIGlmKHN0cmNhc2VjbXAo
bXNPYmotPlBhcmFtTmFtZXNbaV0sImltZ3h5IikgPT0gMCkgeyAvLyBtb3VzZSBjbGljaywgc2lu
Z2xlIHZhcmlhYmxlDQogICAgICBpZihtc09iai0+Q29vcmRTb3VyY2UgPT0gRlJPTUlNR1BOVCkN
Cgljb250aW51ZTsNCg0KICAgICAgdG9rZW5zID0gc3BsaXQobXNPYmotPlBhcmFtVmFsdWVzW2ld
LCAnICcsICZuKTsNCg0KICAgICAgaWYoIXRva2Vucykgew0KCW1zU2V0RXJyb3IoTVNfTUVNRVJS
LCBOVUxMLCAibG9hZEZvcm0oKSIpOw0KCXdyaXRlRXJyb3IoKTsNCiAgICAgIH0NCg0KICAgICAg
aWYobiAhPSAyKSB7DQoJbXNTZXRFcnJvcihNU19XRUJFUlIsICJOb3QgZW5vdWdoIGFyZ3VtZW50
cyBmb3IgaW1neHkuIiwgImxvYWRGb3JtKCkiKTsNCgl3cml0ZUVycm9yKCk7DQogICAgICB9DQoN
CiAgICAgIG1zT2JqLT5JbWdQbnQueCA9IGdldE51bWVyaWMocmUsIHRva2Vuc1swXSk7DQogICAg
ICBtc09iai0+SW1nUG50LnkgPSBnZXROdW1lcmljKHJlLCB0b2tlbnNbMV0pOw0KDQogICAgICBt
c0ZyZWVDaGFyQXJyYXkodG9rZW5zLCAyKTsNCg0KICAgICAgaWYoKG1zT2JqLT5JbWdQbnQueCA+
ICgyKk1TX01BWElNR1NJWkUpKSB8fCAobXNPYmotPkltZ1BudC54IDwgKC0yKk1TX01BWElNR1NJ
WkUpKSB8fCAobXNPYmotPkltZ1BudC55ID4gKDIqTVNfTUFYSU1HU0laRSkpIHx8IChtc09iai0+
SW1nUG50LnkgPCAoLTIqTVNfTUFYSU1HU0laRSkpKSB7DQoJbXNTZXRFcnJvcihNU19XRUJFUlIs
ICJSZWZlcmVuY2UgbWFwIGNvb3JkaW5hdGUgb3V0IG9mIHJhbmdlLiIsICJsb2FkRm9ybSgpIik7
DQoJd3JpdGVFcnJvcigpOw0KICAgICAgfQ0KDQogICAgICBpZihtc09iai0+Q29vcmRTb3VyY2Ug
PT0gTk9ORSkgeyAvLyBvdmVycmlkZSBub3RoaW5nIHNpbmNlIHRoaXMgcGFyYW1ldGVyIGlzIHVz
dWFsbHkgdXNlZCB0byBob2xkIGEgZGVmYXVsdCB2YWx1ZQ0KCW1zT2JqLT5Db29yZFNvdXJjZSA9
IEZST01JTUdQTlQ7DQoJUXVlcnlDb29yZFNvdXJjZSA9IEZST01JTUdQTlQ7DQogICAgICB9DQog
ICAgICBjb250aW51ZTsNCiAgICB9DQoNCiAgICBpZihzdHJjYXNlY21wKG1zT2JqLT5QYXJhbU5h
bWVzW2ldLCJpbWdib3giKSA9PSAwKSB7IC8vIHNlbGVjdGlvbiBib3ggKGVnLiBtb3VzZSBkcmFn
KQ0KICAgICAgdG9rZW5zID0gc3BsaXQobXNPYmotPlBhcmFtVmFsdWVzW2ldLCAnICcsICZuKTsN
CiAgICAgIA0KICAgICAgaWYoIXRva2Vucykgew0KCW1zU2V0RXJyb3IoTVNfTUVNRVJSLCBOVUxM
LCAibG9hZEZvcm0oKSIpOw0KCXdyaXRlRXJyb3IoKTsNCiAgICAgIH0NCiAgICAgIA0KICAgICAg
aWYobiAhPSA0KSB7DQoJbXNTZXRFcnJvcihNU19XRUJFUlIsICJOb3QgZW5vdWdoIGFyZ3VtZW50
cyBmb3IgaW1nYm94LiIsICJsb2FkRm9ybSgpIik7DQoJd3JpdGVFcnJvcigpOw0KICAgICAgfQ0K
ICAgICAgDQogICAgICBtc09iai0+SW1nQm94Lm1pbnggPSBnZXROdW1lcmljKHJlLCB0b2tlbnNb
MF0pOw0KICAgICAgbXNPYmotPkltZ0JveC5taW55ID0gZ2V0TnVtZXJpYyhyZSwgdG9rZW5zWzFd
KTsNCiAgICAgIG1zT2JqLT5JbWdCb3gubWF4eCA9IGdldE51bWVyaWMocmUsIHRva2Vuc1syXSk7
DQogICAgICBtc09iai0+SW1nQm94Lm1heHkgPSBnZXROdW1lcmljKHJlLCB0b2tlbnNbM10pOw0K
ICAgICAgDQogICAgICBtc0ZyZWVDaGFyQXJyYXkodG9rZW5zLCA0KTsNCg0KICAgICAgaWYoKG1z
T2JqLT5JbWdCb3gubWlueCAhPSBtc09iai0+SW1nQm94Lm1heHgpICYmIChtc09iai0+SW1nQm94
Lm1pbnkgIT0gbXNPYmotPkltZ0JveC5tYXh5KSkgeyAvLyBtdXN0IG5vdCBkZWdlbmVyYXRlIGlu
dG8gYSBwb2ludA0KCW1zT2JqLT5Db29yZFNvdXJjZSA9IEZST01JTUdCT1g7DQoJUXVlcnlDb29y
ZFNvdXJjZSA9IEZST01JTUdCT1g7DQogICAgICB9DQogICAgICBjb250aW51ZTsNCiAgICB9DQoN
CiAgICBpZihzdHJjYXNlY21wKG1zT2JqLT5QYXJhbU5hbWVzW2ldLCJpbWdzaGFwZSIpID09IDAp
IHsgLy8gc2hhcGUgZ2l2ZW4gaW4gaW1hZ2UgY29vcmRpbmF0ZXMNCiAgICAgIGxpbmVPYmogbGlu
ZT17MCxOVUxMfTsNCiAgICAgIGNoYXIgKip0bXA9TlVMTDsNCiAgICAgIGludCBuLCBqOw0KICAg
ICAgDQogICAgICB0bXAgPSBzcGxpdChtc09iai0+UGFyYW1WYWx1ZXNbaV0sICcgJywgJm4pOw0K
DQogICAgICBpZigobGluZS5wb2ludCA9IChwb2ludE9iaiAqKW1hbGxvYyhzaXplb2YocG9pbnRP
YmopKihuLzIpKSkgPT0gTlVMTCkgew0KCW1zU2V0RXJyb3IoTVNfTUVNRVJSLCBOVUxMLCAibG9h
ZEZvcm0oKSIpOw0KCXdyaXRlRXJyb3IoKTsNCiAgICAgIH0NCiAgICAgIGxpbmUubnVtcG9pbnRz
ID0gbi8yOw0KDQogICAgICBtc0luaXRTaGFwZSgmbXNPYmotPlNlbGVjdFNoYXBlKTsNCiAgICAg
IG1zT2JqLT5TZWxlY3RTaGFwZS50eXBlID0gTVNfU0hBUEVfUE9MWUdPTjsNCg0KICAgICAgZm9y
KGo9MDsgajxuLzI7IGorKykgew0KCWxpbmUucG9pbnRbal0ueCA9IGF0b2YodG1wWzIqal0pOw0K
CWxpbmUucG9pbnRbal0ueSA9IGF0b2YodG1wWzIqaisxXSk7DQogICAgICB9DQoNCiAgICAgIGlm
KG1zQWRkTGluZSgmbXNPYmotPlNlbGVjdFNoYXBlLCAmbGluZSkgPT0gLTEpIHdyaXRlRXJyb3Io
KTsNCg0KICAgICAgbXNGcmVlKGxpbmUucG9pbnQpOw0KICAgICAgbXNGcmVlQ2hhckFycmF5KHRt
cCwgbik7DQoNCiAgICAgIFF1ZXJ5Q29vcmRTb3VyY2UgPSBGUk9NSU1HU0hBUEU7DQogICAgICBj
b250aW51ZTsNCiAgICB9DQoNCiAgICBpZihzdHJjYXNlY21wKG1zT2JqLT5QYXJhbU5hbWVzW2ld
LCJyZWYueCIpID09IDApIHsgLy8gbW91c2UgY2xpY2sgaW4gcmVmZXJlbmNlIGltYWdlLCBpbiBw
aWVjZXMNCiAgICAgIG1zT2JqLT5SZWZQbnQueCA9IGdldE51bWVyaWMocmUsIG1zT2JqLT5QYXJh
bVZhbHVlc1tpXSk7ICAgICAgDQogICAgICBpZigobXNPYmotPlJlZlBudC54ID4gKDIqTVNfTUFY
SU1HU0laRSkpIHx8IChtc09iai0+UmVmUG50LnggPCAoLTIqTVNfTUFYSU1HU0laRSkpKSB7DQoJ
bXNTZXRFcnJvcihNU19XRUJFUlIsICJDb29yZGluYXRlIG91dCBvZiByYW5nZS4iLCAibG9hZEZv
cm0oKSIpOw0KCXdyaXRlRXJyb3IoKTsNCiAgICAgIH0NCiAgICAgIG1zT2JqLT5Db29yZFNvdXJj
ZSA9IEZST01SRUZQTlQ7DQogICAgICBjb250aW51ZTsNCiAgICB9DQogICAgaWYoc3RyY2FzZWNt
cChtc09iai0+UGFyYW1OYW1lc1tpXSwicmVmLnkiKSA9PSAwKSB7DQogICAgICBtc09iai0+UmVm
UG50LnkgPSBnZXROdW1lcmljKHJlLCBtc09iai0+UGFyYW1WYWx1ZXNbaV0pOyANCiAgICAgIGlm
KChtc09iai0+UmVmUG50LnkgPiAoMipNU19NQVhJTUdTSVpFKSkgfHwgKG1zT2JqLT5SZWZQbnQu
eSA8ICgtMipNU19NQVhJTUdTSVpFKSkpIHsNCgltc1NldEVycm9yKE1TX1dFQkVSUiwgIkNvb3Jk
aW5hdGUgb3V0IG9mIHJhbmdlLiIsICJsb2FkRm9ybSgpIik7DQoJd3JpdGVFcnJvcigpOw0KICAg
ICAgfQ0KICAgICAgbXNPYmotPkNvb3JkU291cmNlID0gRlJPTVJFRlBOVDsNCiAgICAgIGNvbnRp
bnVlOw0KICAgIH0NCg0KICAgIGlmKHN0cmNhc2VjbXAobXNPYmotPlBhcmFtTmFtZXNbaV0sInJl
Znh5IikgPT0gMCkgeyAvKiBtb3VzZSBjbGljayBpbiByZWZlcmVuY2UgaW1hZ2UsIHNpbmdsZSB2
YXJpYWJsZSAqLw0KICAgICAgdG9rZW5zID0gc3BsaXQobXNPYmotPlBhcmFtVmFsdWVzW2ldLCAn
ICcsICZuKTsNCg0KICAgICAgaWYoIXRva2Vucykgew0KCW1zU2V0RXJyb3IoTVNfTUVNRVJSLCBO
VUxMLCAibG9hZEZvcm0oKSIpOw0KCXdyaXRlRXJyb3IoKTsNCiAgICAgIH0NCg0KICAgICAgaWYo
biAhPSAyKSB7DQoJbXNTZXRFcnJvcihNU19XRUJFUlIsICJOb3QgZW5vdWdoIGFyZ3VtZW50cyBm
b3IgaW1neHkuIiwgImxvYWRGb3JtKCkiKTsNCgl3cml0ZUVycm9yKCk7DQogICAgICB9DQoNCiAg
ICAgIG1zT2JqLT5SZWZQbnQueCA9IGdldE51bWVyaWMocmUsIHRva2Vuc1swXSk7DQogICAgICBt
c09iai0+UmVmUG50LnkgPSBnZXROdW1lcmljKHJlLCB0b2tlbnNbMV0pOw0KDQogICAgICBtc0Zy
ZWVDaGFyQXJyYXkodG9rZW5zLCAyKTsNCiAgICAgIA0KICAgICAgaWYoKG1zT2JqLT5SZWZQbnQu
eCA+ICgyKk1TX01BWElNR1NJWkUpKSB8fCAobXNPYmotPlJlZlBudC54IDwgKC0yKk1TX01BWElN
R1NJWkUpKSB8fCAobXNPYmotPlJlZlBudC55ID4gKDIqTVNfTUFYSU1HU0laRSkpIHx8IChtc09i
ai0+UmVmUG50LnkgPCAoLTIqTVNfTUFYSU1HU0laRSkpKSB7DQoJbXNTZXRFcnJvcihNU19XRUJF
UlIsICJSZWZlcmVuY2UgbWFwIGNvb3JkaW5hdGUgb3V0IG9mIHJhbmdlLiIsICJsb2FkRm9ybSgp
Iik7DQoJd3JpdGVFcnJvcigpOw0KICAgICAgfQ0KICAgICAgDQogICAgICBtc09iai0+Q29vcmRT
b3VyY2UgPSBGUk9NUkVGUE5UOw0KICAgICAgY29udGludWU7DQogICAgfQ0KDQogICAgaWYoc3Ry
Y2FzZWNtcChtc09iai0+UGFyYW1OYW1lc1tpXSwiYnVmZmVyIikgPT0gMCkgeyAvLyByYWRpdXMg
KG1hcCB1bml0cyksIGFjdHVhbGx5IDEvMiBzcXVhcmUgc2lkZQ0KICAgICAgbXNPYmotPkJ1ZmZl
ciA9IGdldE51bWVyaWMocmUsIG1zT2JqLT5QYXJhbVZhbHVlc1tpXSk7ICAgICAgDQogICAgICBt
c09iai0+Q29vcmRTb3VyY2UgPSBGUk9NQlVGOw0KICAgICAgUXVlcnlDb29yZFNvdXJjZSA9IEZS
T01VU0VSUE5UOw0KICAgICAgY29udGludWU7DQogICAgfQ0KDQogICAgaWYoc3RyY2FzZWNtcCht
c09iai0+UGFyYW1OYW1lc1tpXSwic2NhbGUiKSA9PSAwKSB7IC8vIHNjYWxlIGZvciBuZXcgbWFw
DQogICAgICBtc09iai0+U2NhbGUgPSBnZXROdW1lcmljKHJlLCBtc09iai0+UGFyYW1WYWx1ZXNb
aV0pOyAgICAgIA0KICAgICAgaWYobXNPYmotPlNjYWxlIDw9IDApIHsNCgltc1NldEVycm9yKE1T
X1dFQkVSUiwgIlNjYWxlIG91dCBvZiByYW5nZS4iLCAibG9hZEZvcm0oKSIpOw0KCXdyaXRlRXJy
b3IoKTsNCiAgICAgIH0NCiAgICAgIG1zT2JqLT5Db29yZFNvdXJjZSA9IEZST01TQ0FMRTsNCiAg
ICAgIFF1ZXJ5Q29vcmRTb3VyY2UgPSBGUk9NVVNFUlBOVDsNCiAgICAgIGNvbnRpbnVlOw0KICAg
IH0NCiAgICANCiAgICBpZihzdHJjYXNlY21wKG1zT2JqLT5QYXJhbU5hbWVzW2ldLCJpbWdzaXpl
IikgPT0gMCkgeyAvLyBzaXplIG9mIGV4aXN0aW5nIGltYWdlIChwaXhlbHMpDQogICAgICB0b2tl
bnMgPSBzcGxpdChtc09iai0+UGFyYW1WYWx1ZXNbaV0sICcgJywgJm4pOw0KDQogICAgICBpZigh
dG9rZW5zKSB7DQoJbXNTZXRFcnJvcihNU19NRU1FUlIsIE5VTEwsICJsb2FkRm9ybSgpIik7DQoJ
d3JpdGVFcnJvcigpOw0KICAgICAgfQ0KDQogICAgICBpZihuICE9IDIpIHsNCgltc1NldEVycm9y
KE1TX1dFQkVSUiwgIk5vdCBlbm91Z2ggYXJndW1lbnRzIGZvciBpbWdzaXplLiIsICJsb2FkRm9y
bSgpIik7DQoJd3JpdGVFcnJvcigpOw0KICAgICAgfQ0KDQogICAgICBtc09iai0+SW1nQ29scyA9
IGdldE51bWVyaWMocmUsIHRva2Vuc1swXSk7DQogICAgICBtc09iai0+SW1nUm93cyA9IGdldE51
bWVyaWMocmUsIHRva2Vuc1sxXSk7DQoNCiAgICAgIG1zRnJlZUNoYXJBcnJheSh0b2tlbnMsIDIp
Ow0KICAgICAgDQogICAgICBpZihtc09iai0+SW1nQ29scyA+IE1TX01BWElNR1NJWkUgfHwgbXNP
YmotPkltZ1Jvd3MgPiBNU19NQVhJTUdTSVpFIHx8IG1zT2JqLT5JbWdDb2xzIDwgMCB8fCBtc09i
ai0+SW1nUm93cyA8IDApIHsNCgltc1NldEVycm9yKE1TX1dFQkVSUiwgIkltYWdlIHNpemUgb3V0
IG9mIHJhbmdlLiIsICJsb2FkRm9ybSgpIik7DQoJd3JpdGVFcnJvcigpOw0KICAgICAgfQ0KIA0K
ICAgICAgY29udGludWU7DQogICAgfQ0KDQogICAgaWYoc3RyY2FzZWNtcChtc09iai0+UGFyYW1O
YW1lc1tpXSwibWFwc2l6ZSIpID09IDApIHsgLy8gc2l6ZSBvZiBuZXcgbWFwIChwaXhlbHMpDQog
ICAgICB0b2tlbnMgPSBzcGxpdChtc09iai0+UGFyYW1WYWx1ZXNbaV0sICcgJywgJm4pOw0KDQog
ICAgICBpZighdG9rZW5zKSB7DQoJbXNTZXRFcnJvcihNU19NRU1FUlIsIE5VTEwsICJsb2FkRm9y
bSgpIik7DQoJd3JpdGVFcnJvcigpOw0KICAgICAgfQ0KDQogICAgICBpZihuICE9IDIpIHsNCglt
c1NldEVycm9yKE1TX1dFQkVSUiwgIk5vdCBlbm91Z2ggYXJndW1lbnRzIGZvciBtYXBzaXplLiIs
ICJsb2FkRm9ybSgpIik7DQoJd3JpdGVFcnJvcigpOw0KICAgICAgfQ0KDQogICAgICBtc09iai0+
TWFwLT53aWR0aCA9IGdldE51bWVyaWMocmUsIHRva2Vuc1swXSk7DQogICAgICBtc09iai0+TWFw
LT5oZWlnaHQgPSBnZXROdW1lcmljKHJlLCB0b2tlbnNbMV0pOw0KDQogICAgICBtc0ZyZWVDaGFy
QXJyYXkodG9rZW5zLCAyKTsNCiAgICAgIA0KICAgICAgaWYobXNPYmotPk1hcC0+d2lkdGggPiBN
U19NQVhJTUdTSVpFIHx8IG1zT2JqLT5NYXAtPmhlaWdodCA+IE1TX01BWElNR1NJWkUgfHwgbXNP
YmotPk1hcC0+d2lkdGggPCAwIHx8IG1zT2JqLT5NYXAtPmhlaWdodCA8IDApIHsNCgltc1NldEVy
cm9yKE1TX1dFQkVSUiwgIkltYWdlIHNpemUgb3V0IG9mIHJhbmdlLiIsICJsb2FkRm9ybSgpIik7
DQoJd3JpdGVFcnJvcigpOw0KICAgICAgfQ0KICAgICAgY29udGludWU7DQogICAgfQ0KDQogICAg
aWYoc3RybmNhc2VjbXAobXNPYmotPlBhcmFtTmFtZXNbaV0sImxheWVycyIsIDYpID09IDApIHsg
Ly8gdHVybiBhIHNldCBvZiBsYXllcnMsIGRlbGltaXRlZCBieSBzcGFjZXMsIG9uDQogICAgICBp
bnQgbnVtX2xheWVycz0wLCBsOw0KICAgICAgY2hhciAqKmxheWVycz1OVUxMOw0KDQogICAgICBs
YXllcnMgPSBzcGxpdChtc09iai0+UGFyYW1WYWx1ZXNbaV0sICcgJywgJihudW1fbGF5ZXJzKSk7
DQogICAgICBmb3IobD0wOyBsPG51bV9sYXllcnM7IGwrKykNCgltc09iai0+TGF5ZXJzW21zT2Jq
LT5OdW1MYXllcnMrbF0gPSBzdHJkdXAobGF5ZXJzW2xdKTsNCiAgICAgIG1zT2JqLT5OdW1MYXll
cnMgKz0gbDsNCg0KICAgICAgbXNGcmVlQ2hhckFycmF5KGxheWVycywgbnVtX2xheWVycyk7DQog
ICAgICBudW1fbGF5ZXJzID0gMDsNCiAgICAgIGNvbnRpbnVlOw0KICAgIH0NCg0KICAgIGlmKHN0
cm5jYXNlY21wKG1zT2JqLT5QYXJhbU5hbWVzW2ldLCJsYXllciIsIDUpID09IDApIHsgLy8gdHVy
biBhIHNpbmdsZSBsYXllci9ncm91cCBvbg0KICAgICAgbXNPYmotPkxheWVyc1ttc09iai0+TnVt
TGF5ZXJzXSA9IHN0cmR1cChtc09iai0+UGFyYW1WYWx1ZXNbaV0pOw0KICAgICAgbXNPYmotPk51
bUxheWVycysrOw0KICAgICAgY29udGludWU7DQogICAgfQ0KDQogICAgaWYoc3RyY2FzZWNtcCht
c09iai0+UGFyYW1OYW1lc1tpXSwicWxheWVyIikgPT0gMCkgeyAvLyBsYXllciB0byBxdWVyeSAo
aS5lIHNlYXJjaCkNCiAgICAgIFF1ZXJ5TGF5ZXIgPSBzdHJkdXAobXNPYmotPlBhcmFtVmFsdWVz
W2ldKTsNCiAgICAgIGNvbnRpbnVlOw0KICAgIH0NCg0KICAgIGlmKHN0cmNhc2VjbXAobXNPYmot
PlBhcmFtTmFtZXNbaV0sInFpdGVtIikgPT0gMCkgeyAvLyBhdHRyaWJ1dGUgdG8gcXVlcnkgb24g
KG9wdGlvbmFsKQ0KICAgICAgUXVlcnlJdGVtID0gc3RyZHVwKG1zT2JqLT5QYXJhbVZhbHVlc1tp
XSk7DQogICAgICBjb250aW51ZTsNCiAgICB9DQoNCiAgICBpZihzdHJjYXNlY21wKG1zT2JqLT5Q
YXJhbU5hbWVzW2ldLCJxc3RyaW5nIikgPT0gMCkgeyAvLyBhdHRyaWJ1dGUgcXVlcnkgc3RyaW5n
DQogICAgICBRdWVyeVN0cmluZyA9IHN0cmR1cChtc09iai0+UGFyYW1WYWx1ZXNbaV0pOw0KICAg
ICAgY29udGludWU7DQogICAgfQ0KDQogICAgaWYoc3RyY2FzZWNtcChtc09iai0+UGFyYW1OYW1l
c1tpXSwic2xheWVyIikgPT0gMCkgeyAvLyBsYXllciB0byBzZWxlY3QgKGZvciBmZWF0dXJlIGJh
c2VkIHNlYXJjaCkNCiAgICAgIFNlbGVjdExheWVyID0gc3RyZHVwKG1zT2JqLT5QYXJhbVZhbHVl
c1tpXSk7DQogICAgICBjb250aW51ZTsNCiAgICB9DQoNCiAgICBpZihzdHJjYXNlY21wKG1zT2Jq
LT5QYXJhbU5hbWVzW2ldLCJpdGVtIikgPT0gMCkgeyAvLyBzZWFyY2ggaXRlbQ0KICAgICAgSXRl
bSA9IHN0cmR1cChtc09iai0+UGFyYW1WYWx1ZXNbaV0pOw0KICAgICAgY29udGludWU7DQogICAg
fQ0KDQogICAgaWYoc3RyY2FzZWNtcChtc09iai0+UGFyYW1OYW1lc1tpXSwidmFsdWUiKSA9PSAw
KSB7IC8vIHNlYXJjaCBleHByZXNzaW9uDQogICAgICBpZighVmFsdWUpDQoJVmFsdWUgPSBzdHJk
dXAobXNPYmotPlBhcmFtVmFsdWVzW2ldKTsNCiAgICAgIGVsc2UgeyAvKiBuZWVkIHRvIGFwcGVu
ZCAqLw0KCXRtcHN0ciA9IHN0cmR1cChWYWx1ZSk7DQoJZnJlZShWYWx1ZSk7DQoJVmFsdWUgPSAo
Y2hhciAqKW1hbGxvYyhzdHJsZW4odG1wc3RyKStzdHJsZW4obXNPYmotPlBhcmFtVmFsdWVzW2ld
KSsyKTsNCglzcHJpbnRmKFZhbHVlLCAiJXN8JXMiLCB0bXBzdHIsIG1zT2JqLT5QYXJhbVZhbHVl
c1tpXSk7DQoJZnJlZSh0bXBzdHIpOw0KICAgICAgfQ0KICAgICAgY29udGludWU7DQogICAgfQ0K
DQojaWZkZWYgVVNFX0VHSVMNCg0KICAgIC8vIE9WIC0gZWdpcyAtIGFkZGl0aW9uYWwgdG9rZW4g
Im5vbmUiIGlzIGRlZmluZWQgdG8gY3JlYXRlIHNvbWV3aGF0DQogICAgLy8gbXV0dWFsIGV4Y3Vs
c2l2ZW5lc3MgYmV0d2VlbiBtYXBzZXJ2ZXIgYW5kIGVnaXMNCiANCiAgICBpZihzdHJjYXNlY21w
KG1zT2JqLT5QYXJhbU5hbWVzW2ldLCJlZ2lzIikgPT0gMCkNCiAgICB7DQogICAgICAgIGlmKHN0
cmNhc2VjbXAobXNPYmotPlBhcmFtVmFsdWVzW2ldLCJub25lIikgIT0gMCkNCiAgICAgICAgew0K
ICAgICAgICAgICAgICAgIG1zT2JqLT5Nb2RlID0gUFJPQ0VTU0lORzsNCiAgICAgICAgfQ0KICAg
ICAgICBjb250aW51ZTsNCiAgICB9DQojZW5kaWYNCg0KICAgIGlmKHN0cmNhc2VjbXAobXNPYmot
PlBhcmFtTmFtZXNbaV0sInNoYXBlaW5kZXgiKSA9PSAwKSB7IC8vIHVzZWQgZm9yIGluZGV4IHF1
ZXJpZXMNCiAgICAgIFNoYXBlSW5kZXggPSBnZXROdW1lcmljKHJlLCBtc09iai0+UGFyYW1WYWx1
ZXNbaV0pOw0KICAgICAgY29udGludWU7DQogICAgfQ0KICAgIGlmKHN0cmNhc2VjbXAobXNPYmot
PlBhcmFtTmFtZXNbaV0sInRpbGVpbmRleCIpID09IDApIHsNCiAgICAgIFRpbGVJbmRleCA9IGdl
dE51bWVyaWMocmUsIG1zT2JqLT5QYXJhbVZhbHVlc1tpXSk7DQogICAgICBjb250aW51ZTsNCiAg
ICB9DQoNCiAgICBpZihzdHJjYXNlY21wKG1zT2JqLT5QYXJhbU5hbWVzW2ldLCJtb2RlIikgPT0g
MCkgeyAvLyBzZXQgb3BlcmF0aW9uIG1vZGUNCiAgICAgIGZvcihqPTA7IGo8bnVtTW9kZXM7IGor
Kykgew0KCWlmKHN0cmNhc2VjbXAobXNPYmotPlBhcmFtVmFsdWVzW2ldLCBtb2RlU3RyaW5nc1tq
XSkgPT0gMCkgew0KCSAgbXNPYmotPk1vZGUgPSBqOw0KDQoJICBpZihtc09iai0+TW9kZSA9PSBa
T09NSU4pIHsNCgkgICAgbXNPYmotPlpvb21EaXJlY3Rpb24gPSAxOw0KCSAgICBtc09iai0+TW9k
ZSA9IEJST1dTRTsNCgkgIH0NCgkgIGlmKG1zT2JqLT5Nb2RlID09IFpPT01PVVQpIHsNCgkgICAg
bXNPYmotPlpvb21EaXJlY3Rpb24gPSAtMTsNCgkgICAgbXNPYmotPk1vZGUgPSBCUk9XU0U7DQoJ
ICB9DQoNCgkgIGJyZWFrOw0KCX0NCiAgICAgIH0NCg0KICAgICAgaWYoaiA9PSBudW1Nb2Rlcykg
ew0KCW1zU2V0RXJyb3IoTVNfV0VCRVJSLCAiSW52YWxpZCBtb2RlLiIsICJsb2FkRm9ybSgpIik7
DQoJd3JpdGVFcnJvcigpOw0KICAgICAgfQ0KDQogICAgICBjb250aW51ZTsNCiAgICB9DQoNCiAg
ICBpZihzdHJuY2FzZWNtcChtc09iai0+UGFyYW1OYW1lc1tpXSwibWFwXyIsNCkgPT0gMCkgeyAv
LyBjaGVjayB0byBzZWUgaWYgdGhlcmUgYXJlIGFueSBhZGRpdGlvbnMgdG8gdGhlIG1hcGZpbGUN
CiAgICAgIGlmKG1zTG9hZE1hcFN0cmluZyhtc09iai0+TWFwLCBtc09iai0+UGFyYW1OYW1lc1tp
XSwgbXNPYmotPlBhcmFtVmFsdWVzW2ldKSA9PSAtMSkNCgl3cml0ZUVycm9yKCk7DQogICAgICBj
b250aW51ZTsNCiAgICB9DQovKg0KCUFsbG93IHNlbGVjdGlvbiBvZiBJTUFHRVRZUEUgZnJvbSB0
aGUgY29tbWFuZCBsaW5lDQoqLw0KDQogICAgaWYoc3RybmNhc2VjbXAobXNPYmotPlBhcmFtTmFt
ZXNbaV0sImltYWdldHlwZSIsIDkpID09IDApIHsgLy8gc2VsZWN0IGFuIGltYWdlIHR5cGUgZGVm
aW5lZCBieSBhbiBPVVRQVVRGT1JNQVQNCiAgICAgIG1zT2JqLT5NYXAtPmltYWdldHlwZSA9IHN0
cmR1cChtc09iai0+UGFyYW1WYWx1ZXNbaV0pOw0KICAgICAgY29udGludWU7DQogICAgfQ0KDQov
KiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLSAqLw0KLyogICAgICBUaGUgZm9sbG93aW5nIGNvZGUgaXMgdXNlZCB0byBz
dXBwb3J0IHRoZSByb3NhIGFwcGxldCAoZm9yICAgICAgKi8NCi8qICAgICAgbW9yZSBpbmZvcm1h
dGlvbiBvbiBSb3NhLCBwbGVhc2UgY29uc3VsdCA6ICAgICAgICAgICAgICAgICAgICAgICovDQov
KiAgICAgIGh0dHA6Ly93d3cyLmRtc29sdXRpb25zLmNhL3dlYnRvb2xzL3Jvc2EvaW5kZXguaHRt
bCkgLiAgICAgICAgICAqLw0KLyogICAgICBUaGlzIGNvZGUgd2FzIHByb3ZpZGVkIGJ5IFRpbS5N
YWNrZXlAYWdzby5nb3YuYXUuICAgICAgICAgICAgICAgKi8NCi8qICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQov
KiAgICAgIEZvciBBcHBsaWNhdGlvbiB1c2luZyBpdCBjYW4gYmUgc2VlbiBhdCA6ICAgICAgICAg
ICAgICAgICAgICAgICAqLw0KLypodHRwOi8vbWFwc2VydmVyLmdpcy51bW4uZWR1L3dpbG1hL21h
cHNlcnZlci11c2Vycy8wMDExL21zZzAwMDc3Lmh0bWwgKi8NCi8qICAgaHR0cDovL3d3dy5hZ3Nv
Lmdvdi5hdS9tYXAvcGlsYmFyYS8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQov
KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAqLw0KLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCg0KICAgIGlmKHN0cmNhc2VjbXAo
bXNPYmotPlBhcmFtTmFtZXNbaV0sIklOUFVUX1RZUEUiKSA9PSAwKQ0KICAgIHsgLyogUm9zYSBp
bnB1dCB0eXBlICovDQogICAgICAgIGlmKHN0cmNhc2VjbXAobXNPYmotPlBhcmFtVmFsdWVzW2ld
LCJhdXRvX3JlY3QiKSA9PSAwKSANCiAgICAgICAgew0KICAgICAgICAgICAgcm9zYV90eXBlPTE7
IC8qIHJlY3RhbmdsZSAqLw0KICAgICAgICAgICAgY29udGludWU7DQogICAgICAgIH0NCiAgICAg
ICAgICAgIA0KICAgICAgICBpZihzdHJjYXNlY21wKG1zT2JqLT5QYXJhbVZhbHVlc1tpXSwiYXV0
b19wb2ludCIpID09IDApIA0KICAgICAgICB7DQogICAgICAgICAgICByb3NhX3R5cGU9MjsgLyog
cG9pbnQgKi8NCiAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICB9DQogICAgfQ0KICAgIGlm
KHN0cmNhc2VjbXAobXNPYmotPlBhcmFtTmFtZXNbaV0sIklOUFVUX0NPT1JEIikgPT0gMCkgDQog
ICAgeyAvKiBSb3NhIGNvb3JkaW5hdGVzICovDQogDQogICAgICAgc3dpdGNoKHJvc2FfdHlwZSkN
CiAgICAgICB7DQogICAgICAgICBjYXNlIDE6DQogICAgICAgICAgICAgc3NjYW5mKG1zT2JqLT5Q
YXJhbVZhbHVlc1tpXSwiJWxmLCVsZjslbGYsJWxmIiwNCiAgICAgICAgICAgICAgICAgICAgJm1z
T2JqLT5JbWdCb3gubWlueCwmbXNPYmotPkltZ0JveC5taW55LCZtc09iai0+SW1nQm94Lm1heHgs
DQogICAgICAgICAgICAgICAgICAgICZtc09iai0+SW1nQm94Lm1heHkpOw0KICAgICAgICAgICAg
IGlmKChtc09iai0+SW1nQm94Lm1pbnggIT0gbXNPYmotPkltZ0JveC5tYXh4KSAmJiANCiAgICAg
ICAgICAgICAgICAobXNPYmotPkltZ0JveC5taW55ICE9IG1zT2JqLT5JbWdCb3gubWF4eSkpIA0K
ICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgbXNPYmotPkNvb3JkU291cmNlID0gRlJP
TUlNR0JPWDsNCiAgICAgICAgICAgICAgICAgUXVlcnlDb29yZFNvdXJjZSA9IEZST01JTUdCT1g7
DQogICAgICAgICAgICAgfQ0KICAgICAgICAgICAgIGVsc2UgDQogICAgICAgICAgICAgew0KICAg
ICAgICAgICAgICAgICBtc09iai0+Q29vcmRTb3VyY2UgPSBGUk9NSU1HUE5UOw0KICAgICAgICAg
ICAgICAgICBRdWVyeUNvb3JkU291cmNlID0gRlJPTUlNR1BOVDsNCiAgICAgICAgICAgICAgICAg
bXNPYmotPkltZ1BudC54PW1zT2JqLT5JbWdCb3gubWlueDsNCiAgICAgICAgICAgICAgICAgbXNP
YmotPkltZ1BudC55PW1zT2JqLT5JbWdCb3gubWlueTsNCgkgICB9DQogICAgICAgICAgIGJyZWFr
Ow0KICAgICAgICAgY2FzZSAyOg0KICAgICAgICAgICBzc2NhbmYobXNPYmotPlBhcmFtVmFsdWVz
W2ldLCIlbGYsJWxmIiwmbXNPYmotPkltZ1BudC54LA0KICAgICAgICAgICAgICAgICAgICZtc09i
ai0+SW1nUG50LnkpOw0KICAgICAgICAgICBtc09iai0+Q29vcmRTb3VyY2UgPSBGUk9NSU1HUE5U
Ow0KICAgICAgICAgICBRdWVyeUNvb3JkU291cmNlID0gRlJPTUlNR1BOVDsNCiAgICAgICAgICAg
YnJlYWs7DQogICAgICAgICB9DQogICAgICAgY29udGludWU7DQogICAgfSAgICANCi8qIC0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tICovDQovKiAgICAgIGVuZCBvZiBjb2RlIGZvciBSb3NhIHN1cHBvcnQuICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCg0KDQogIH0N
Cg0KICByZWdmcmVlKCZyZSk7DQoNCiAgaWYoWm9vbVNpemUgIT0gMCkgeyAvLyB1c2UgZGlyZWN0
aW9uIGFuZCBtYWduaXR1ZGUgdG8gY2FsY3VsYXRlIHpvb20NCiAgICBpZihtc09iai0+Wm9vbURp
cmVjdGlvbiA9PSAwKSB7DQogICAgICBtc09iai0+Zlpvb20gPSAxOw0KICAgIH0gZWxzZSB7DQog
ICAgICBtc09iai0+Zlpvb20gPSBab29tU2l6ZSptc09iai0+Wm9vbURpcmVjdGlvbjsNCiAgICAg
IGlmKG1zT2JqLT5mWm9vbSA8IDApDQoJbXNPYmotPmZab29tID0gMS4wL01TX0FCUyhtc09iai0+
Zlpvb20pOw0KICAgIH0NCiAgfSBlbHNlIHsgLy8gdXNlIHNpbmdsZSB2YWx1ZSBmb3Igem9vbQ0K
ICAgIGlmKChtc09iai0+Wm9vbSA+PSAtMSkgJiYgKG1zT2JqLT5ab29tIDw9IDEpKSB7DQogICAg
ICBtc09iai0+Zlpvb20gPSAxOyAvLyBwYW4NCiAgICB9IGVsc2Ugew0KICAgICAgaWYobXNPYmot
Plpvb20gPCAwKQ0KCW1zT2JqLT5mWm9vbSA9IDEuMC9NU19BQlMobXNPYmotPlpvb20pOw0KICAg
ICAgZWxzZQ0KCW1zT2JqLT5mWm9vbSA9IG1zT2JqLT5ab29tOw0KICAgIH0NCiAgfQ0KDQogIGlm
KG1zT2JqLT5JbWdSb3dzID09IC0xKSBtc09iai0+SW1nUm93cyA9IG1zT2JqLT5NYXAtPmhlaWdo
dDsNCiAgaWYobXNPYmotPkltZ0NvbHMgPT0gLTEpIG1zT2JqLT5JbWdDb2xzID0gbXNPYmotPk1h
cC0+d2lkdGg7ICANCiAgaWYobXNPYmotPk1hcC0+aGVpZ2h0ID09IC0xKSBtc09iai0+TWFwLT5o
ZWlnaHQgPSBtc09iai0+SW1nUm93czsNCiAgaWYobXNPYmotPk1hcC0+d2lkdGggPT0gLTEpIG1z
T2JqLT5NYXAtPndpZHRoID0gbXNPYmotPkltZ0NvbHM7DQoNCiAgDQp9DQoNCnZvaWQgc2V0RXh0
ZW50RnJvbVNoYXBlcygpIHsNCiAgaW50IGZvdW5kPTA7DQogIGRvdWJsZSBkeCwgZHksIGNlbGxz
aXplOw0KDQogIHJlY3RPYmogdG1wZXh0PXstMS4wLC0xLjAsLTEuMCwtMS4wfTsNCiAgcG9pbnRP
YmogdG1wcG50PXstMS4wLC0xLjB9Ow0KDQogIGZvdW5kID0gbXNHZXRRdWVyeVJlc3VsdEJvdW5k
cyhtc09iai0+TWFwLCAmKHRtcGV4dCkpOw0KDQogIGR4ID0gdG1wZXh0Lm1heHggLSB0bXBleHQu
bWlueDsNCiAgZHkgPSB0bXBleHQubWF4eSAtIHRtcGV4dC5taW55Ow0KIA0KICB0bXBwbnQueCA9
ICh0bXBleHQubWF4eCArIHRtcGV4dC5taW54KS8yOw0KICB0bXBwbnQueSA9ICh0bXBleHQubWF4
eSArIHRtcGV4dC5taW55KS8yOw0KICB0bXBleHQubWlueCAtPSBkeCpFWFRFTlRfUEFERElORy8y
LjA7DQogIHRtcGV4dC5tYXh4ICs9IGR4KkVYVEVOVF9QQURESU5HLzIuMDsNCiAgdG1wZXh0Lm1p
bnkgLT0gZHkqRVhURU5UX1BBRERJTkcvMi4wOw0KICB0bXBleHQubWF4eSArPSBkeSpFWFRFTlRf
UEFERElORy8yLjA7DQoNCiAgaWYobXNPYmotPlNjYWxlICE9IDApIHsgLy8gYXBwbHkgdGhlIHNj
YWxlIGFyb3VuZCB0aGUgY2VudGVyIHBvaW50ICh0bXBwbnQpDQogICAgY2VsbHNpemUgPSAobXNP
YmotPlNjYWxlL21zT2JqLT5NYXAtPnJlc29sdXRpb24pL2luY2hlc1BlclVuaXRbbXNPYmotPk1h
cC0+dW5pdHNdOyAvLyB1c2VyIHN1cHBsaWVkIGEgcG9pbnQgYW5kIGEgc2NhbGUNCiAgICB0bXBl
eHQubWlueCA9IHRtcHBudC54IC0gY2VsbHNpemUqbXNPYmotPk1hcC0+d2lkdGgvMi4wOw0KICAg
IHRtcGV4dC5taW55ID0gdG1wcG50LnkgLSBjZWxsc2l6ZSptc09iai0+TWFwLT5oZWlnaHQvMi4w
Ow0KICAgIHRtcGV4dC5tYXh4ID0gdG1wcG50LnggKyBjZWxsc2l6ZSptc09iai0+TWFwLT53aWR0
aC8yLjA7DQogICAgdG1wZXh0Lm1heHkgPSB0bXBwbnQueSArIGNlbGxzaXplKm1zT2JqLT5NYXAt
PmhlaWdodC8yLjA7DQogIH0gZWxzZSBpZihtc09iai0+QnVmZmVyICE9IDApIHsgLy8gYXBwbHkg
dGhlIGJ1ZmZlciBhcm91bmQgdGhlIGNlbnRlciBwb2ludCAodG1wcG50KQ0KICAgIHRtcGV4dC5t
aW54ID0gdG1wcG50LnggLSBtc09iai0+QnVmZmVyOw0KICAgIHRtcGV4dC5taW55ID0gdG1wcG50
LnkgLSBtc09iai0+QnVmZmVyOw0KICAgIHRtcGV4dC5tYXh4ID0gdG1wcG50LnggKyBtc09iai0+
QnVmZmVyOw0KICAgIHRtcGV4dC5tYXh5ID0gdG1wcG50LnkgKyBtc09iai0+QnVmZmVyOw0KICB9
DQoNCiAgLy8gaW4gY2FzZSB3ZSBkb24ndCBnZXQgIHVzYWJsZSBleHRlbnQgYXQgdGhpcyBwb2lu
dCAoaS5lLiBzaW5nbGUgcG9pbnQgcmVzdWx0KQ0KICBpZighTVNfVkFMSURfRVhURU5UKHRtcGV4
dC5taW54LCB0bXBleHQubWlueSwgdG1wZXh0Lm1heHgsIHRtcGV4dC5tYXh5KSkgew0KICAgIGlm
KG1zT2JqLT5NYXAtPndlYi5taW5zY2FsZSA+IDApIHsgLy8gdHJ5IHdlYiBvYmplY3QgbWluc2Nh
bGUgZmlyc3QNCiAgICAgIGNlbGxzaXplID0gKG1zT2JqLT5NYXAtPndlYi5taW5zY2FsZS9tc09i
ai0+TWFwLT5yZXNvbHV0aW9uKS9pbmNoZXNQZXJVbml0W21zT2JqLT5NYXAtPnVuaXRzXTsgLy8g
dXNlciBzdXBwbGllZCBhIHBvaW50IGFuZCBhIHNjYWxlDQogICAgICB0bXBleHQubWlueCA9IHRt
cHBudC54IC0gY2VsbHNpemUqbXNPYmotPk1hcC0+d2lkdGgvMi4wOw0KICAgICAgdG1wZXh0Lm1p
bnkgPSB0bXBwbnQueSAtIGNlbGxzaXplKm1zT2JqLT5NYXAtPmhlaWdodC8yLjA7DQogICAgICB0
bXBleHQubWF4eCA9IHRtcHBudC54ICsgY2VsbHNpemUqbXNPYmotPk1hcC0+d2lkdGgvMi4wOw0K
ICAgICAgdG1wZXh0Lm1heHkgPSB0bXBwbnQueSArIGNlbGxzaXplKm1zT2JqLT5NYXAtPmhlaWdo
dC8yLjA7DQogICAgfSBlbHNlIHsNCiAgICAgIG1zU2V0RXJyb3IoTVNfV0VCRVJSLCAiTm8gd2F5
IHRvIGdlbmVyYXRlIGEgdmFsaWQgbWFwIGV4dGVudCBmcm9tIHNlbGVjdGVkIHNoYXBlcy4iLCAi
bWFwc2VydigpIik7DQogICAgICB3cml0ZUVycm9yKCk7DQogICAgfQ0KICB9DQoNCiAgbXNPYmot
Pk1hcFBudCA9IHRtcHBudDsNCiAgbXNPYmotPk1hcC0+ZXh0ZW50ID0gbXNPYmotPlJhd0V4dCA9
IHRtcGV4dDsgLy8gc2F2ZSB1bmFkanVzdGVkIGV4dGVudA0KDQogIHJldHVybjsNCn0NCg0KDQov
KiBGSVg6IE5FRUQgRVJST1IgQ0hFQ0tJTkcgSEVSRSBGT1IgSU1HUE5UIG9yIE1BUFBOVCAqLw0K
dm9pZCBzZXRDb29yZGluYXRlKCkNCnsNCiAgZG91YmxlIGNlbGx4LGNlbGx5Ow0KDQogIGNlbGx4
ID0gTVNfQ0VMTFNJWkUobXNPYmotPkltZ0V4dC5taW54LCBtc09iai0+SW1nRXh0Lm1heHgsIG1z
T2JqLT5JbWdDb2xzKTsNCiAgY2VsbHkgPSBNU19DRUxMU0laRShtc09iai0+SW1nRXh0Lm1pbnks
IG1zT2JqLT5JbWdFeHQubWF4eSwgbXNPYmotPkltZ1Jvd3MpOw0KDQogIG1zT2JqLT5NYXBQbnQu
eCA9IE1TX0lNQUdFMk1BUF9YKG1zT2JqLT5JbWdQbnQueCwgbXNPYmotPkltZ0V4dC5taW54LCBj
ZWxseCk7DQogIG1zT2JqLT5NYXBQbnQueSA9IE1TX0lNQUdFMk1BUF9ZKG1zT2JqLT5JbWdQbnQu
eSwgbXNPYmotPkltZ0V4dC5tYXh5LCBjZWxseSk7DQoNCiAgcmV0dXJuOw0KfQ0KDQp2b2lkIHJl
dHVybkNvb3JkaW5hdGUoKQ0Kew0KICBtc1NldEVycm9yKE1TX05PRVJSLCANCiAgICAgICAgICAg
ICAiWW91ciBcIjxpPmNsaWNrPC9pPlwiIGNvcnJlc3BvbmRzIHRvIChhcHByb3hpbWF0ZWx5KTog
KCVnLCAlZykuIiwNCiAgICAgICAgICAgICBOVUxMLA0KICAgICAgICAgICAgIG1zT2JqLT5NYXBQ
bnQueCwgbXNPYmotPk1hcFBudC55KTsNCg0KI2lmZGVmIFVTRV9QUk9KDQogIGlmKG1zT2JqLT5N
YXAtPnByb2plY3Rpb24ucHJvaiAhPSBOVUxMICYmICFwal9pc19sYXRsb25nKG1zT2JqLT5NYXAt
PnByb2plY3Rpb24ucHJvaikgKSB7DQogICAgcG9pbnRPYmogcD1tc09iai0+TWFwUG50Ow0KICAg
IG1zUHJvamVjdFBvaW50KCYobXNPYmotPk1hcC0+cHJvamVjdGlvbiksICYobXNPYmotPk1hcC0+
bGF0bG9uKSwgJnApOw0KICAgIG1zU2V0RXJyb3IoIE1TX05PRVJSLCANCiAgICAgICAgICAgICAg
ICAiJXMgQ29tcHV0ZWQgbGF0L2xvbiB2YWx1ZSBpcyAoJWcsICVnKS5cbiIsIE5VTEwsIHAueCwg
cC55KTsNCiAgfQ0KI2VuZGlmDQoNCiAgd3JpdGVFcnJvcigpOw0KfQ0KDQoNCi8vIEZJWDogbmVl
ZCB0byBjb25zaWRlciBKT0lOUw0KLy8gRklYOiBuZWVkIHRvIGNvbnNpZGVyIDUlIHNoYXBlIGV4
dGVudCBleHBhbnNpb24NCg0KLyoNCioqDQoqKiBTdGFydCBvZiBtYWluIHByb2dyYW0NCioqDQoq
Lw0KaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgew0KICAgIGludCBpLGo7DQogICAg
Y2hhciBidWZmZXJbMTAyNF07DQogICAgaW1hZ2VPYmogKmltZz1OVUxMOw0KICAgIGludCBzdGF0
dXM7DQoNCiAgICBtc09iaiA9IG1zQWxsb2NNYXBTZXJ2T2JqKCk7DQoNCiNpZmRlZiBVU0VfRUdJ
Uw0KICAgIC8vIE9WIC1lZ2lzLSBJbml0aWFsaXplIGVnaXMgZXJyb3IgbG9nIGZpbGUgaGVyZS4u
Lg0KICAgIGluaXRFcnJMb2coIi9leHBvcnQvaG9tZS90bXAvbXNFcnJvci5sb2ciKTsNCiAgICB3
cml0ZUVyckxvZygiRXJyb3JMb2dmaWxlIGlzIGluaXRpYWxpemVkXG4iKTsNCiAgICBmZmx1c2go
ZnBFcnJMb2cpOw0KI2VuZGlmDQoNCiAgICBpZihhcmdjID4gMSAmJiBzdHJjbXAoYXJndlsxXSwg
Ii12IikgPT0gMCkgew0KICAgICAgcHJpbnRmKCIlc1xuIiwgbXNHZXRWZXJzaW9uKCkpOw0KICAg
ICAgZmZsdXNoKHN0ZG91dCk7DQogICAgICBleGl0KDApOw0KICAgIH0NCiAgICBlbHNlIGlmKGFy
Z2MgPiAyICYmIHN0cmNtcChhcmd2WzFdLCAiLXQiKSA9PSAwKSANCiAgICB7DQogICAgICAgIGNo
YXIgKip0b2tlbnM7DQogICAgICAgIGludCBudW10b2tlbnM9MDsNCiAgICAgICAgaWYgKCh0b2tl
bnM9bXNUb2tlbml6ZU1hcChhcmd2WzJdLCAmbnVtdG9rZW5zKSkgIT0gTlVMTCkNCiAgICAgICAg
ew0KICAgICAgICAgICAgaW50IGk7DQogICAgICAgICAgICBmb3IoaT0wOyBpPG51bXRva2Vuczsg
aSsrKQ0KICAgICAgICAgICAgICAgIHByaW50ZigiJXNcbiIsIHRva2Vuc1tpXSk7DQogICAgICAg
ICAgICBtc0ZyZWVDaGFyQXJyYXkodG9rZW5zLCBudW10b2tlbnMpOw0KICAgICAgICB9DQogICAg
ICAgIGVsc2UNCiAgICAgICAgew0KICAgICAgICAgICAgd3JpdGVFcnJvcigpOw0KICAgICAgICB9
DQoNCiAgICAgIGV4aXQoMCk7DQogICAgfQ0KICAgIGVsc2UgaWYgKGFyZ2MgPiAxICYmIHN0cm5j
bXAoYXJndlsxXSwgIlFVRVJZX1NUUklORz0iLCAxMykgPT0gMCkgew0KICAgICAgLyogRGVidWdn
aW5nIGhvb2suLi4gcGFzcyAiUVVFUllfU1RSSU5HPS4uLiIgb24gdGhlIGNvbW1hbmQtbGluZSAq
Lw0KICAgICAgY2hhciAqYnVmOw0KICAgICAgYnVmID0gc3RyZHVwKCJSRVFVRVNUX01FVEhPRD1H
RVQiKTsNCiAgICAgIHB1dGVudihidWYpOw0KICAgICAgYnVmID0gc3RyZHVwKGFyZ3ZbMV0pOw0K
ICAgICAgcHV0ZW52KGJ1Zik7DQogICAgfQ0KDQogICAgc3ByaW50Zihtc09iai0+SWQsICIlbGQl
ZCIsKGxvbmcpdGltZShOVUxMKSwoaW50KWdldHBpZCgpKTsgLy8gYXNpZ24gbm93IHNvIGl0IGNh
biBiZSBvdmVycmlkZGVuDQoNCiAgICBtc09iai0+UGFyYW1OYW1lcyA9IChjaGFyICoqKSBtYWxs
b2MoTUFYX1BBUkFNUypzaXplb2YoY2hhciopKTsNCiAgICBtc09iai0+UGFyYW1WYWx1ZXMgPSAo
Y2hhciAqKikgbWFsbG9jKE1BWF9QQVJBTVMqc2l6ZW9mKGNoYXIqKSk7DQogICAgaWYgKG1zT2Jq
LT5QYXJhbU5hbWVzPT1OVUxMIHx8IG1zT2JqLT5QYXJhbVZhbHVlcz09TlVMTCkgew0KCW1zU2V0
RXJyb3IoTVNfTUVNRVJSLCBOVUxMLCAibWFwc2VydigpIik7DQoJd3JpdGVFcnJvcigpOw0KICAg
IH0NCg0KICAgIG1zT2JqLT5OdW1QYXJhbXMgPSBsb2FkUGFyYW1zKG1zT2JqLT5QYXJhbU5hbWVz
LCBtc09iai0+UGFyYW1WYWx1ZXMpOw0KICAgIG1zT2JqLT5NYXAgPSBsb2FkTWFwKCk7DQoNCiAg
ICAvKg0KICAgICoqIFN0YXJ0IGJ5IGNhbGxpbmcgdGhlIFdNUy9XRlMgRGlzcGF0Y2hlcnMuICBJ
ZiB0aGV5IGZhaWwgdGhlbiB3ZSdsbCANCiAgICAqKiBwcm9jZXNzIHRoaXMgYXMgYSByZWd1bGFy
IE1hcFNlcnZlciByZXF1ZXN0Lg0KICAgICovDQojaWYgZGVmaW5lZChVU0VfV01TX1NWUikgfHwg
ZGVmaW5lZChVU0VfV0ZTX1NWUikNCiAgICBpZiAoKHN0YXR1cyA9IG1zT1dTRGlzcGF0Y2gobXNP
YmotPk1hcCwgbXNPYmotPlBhcmFtTmFtZXMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBtc09iai0+UGFyYW1WYWx1ZXMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBtc09iai0+TnVtUGFyYW1zKSkgIT0gTVNfRE9ORSAgKSANCiAgICB7DQogICAgICAvKiBUaGlz
IHdhcyBhIFdNUy9XRlMgcmVxdWVzdC4uLiBjbGVhbnVwIGFuZCBleGl0IA0KICAgICAgICogQXQg
dGhpcyBwb2ludCBhbnkgZXJyb3IgaGFzIGFscmVhZHkgYmVlbiBoYW5kbGVkDQogICAgICAgKiBh
cyBhbiBYTUwgZXhjZXB0aW9uIGJ5IHRoZSBPR0Mgc2VydmljZS4NCiAgICAgICAqLw0KICAgICAg
bXNGcmVlTWFwKG1zT2JqLT5NYXApOw0KICAgICAgbXNGcmVlQ2hhckFycmF5KG1zT2JqLT5QYXJh
bU5hbWVzLCBtc09iai0+TnVtUGFyYW1zKTsNCiAgICAgIG1zRnJlZUNoYXJBcnJheShtc09iai0+
UGFyYW1WYWx1ZXMsIG1zT2JqLT5OdW1QYXJhbXMpOw0KICAgICAgIA0KICAgICAgZXhpdCgwKTsN
CiAgICB9DQojZW5kaWYNCg0KICAgIGxvYWRGb3JtKCk7DQogDQoJaWYobXNPYmotPk1hcC0+aW1h
Z2V0eXBlICE9IE5VTEwpIHsJCQkJCQkJCS8qIElmIGltYWdldHlwZSBpcyBzZXQgZnJvbSB0aGUg
TUFQIGZpbGUgb3IgYSBmb3JtIHZhcmlhYmxlICovCQ0KCSAgICBtc0FwcGx5T3V0cHV0Rm9ybWF0
KCAmKG1zT2JqLT5NYXAtPm91dHB1dGZvcm1hdCksCQkJLyogU2VsZWN0IHRoZSBuZXcgb3V0cHV0
IGZvcm1hdCBmcm9tIHRoZSB0YWJsZSBhbmQgYXBwbHkgaXQgKi8NCgkJCW1zU2VsZWN0T3V0cHV0
Rm9ybWF0KG1zT2JqLT5NYXAsIG1zT2JqLT5NYXAtPmltYWdldHlwZSksIG1zT2JqLT5NYXAtPnRy
YW5zcGFyZW50LCBtc09iai0+TWFwLT5pbnRlcmxhY2UsIG1zT2JqLT5NYXAtPmltYWdlcXVhbGl0
eSApOw0KCX0NCg0KICAgIGlmKG1zT2JqLT5TYXZlTWFwKSB7DQogICAgICBzcHJpbnRmKGJ1ZmZl
ciwgIiVzJXMlcy5tYXAiLCBtc09iai0+TWFwLT53ZWIuaW1hZ2VwYXRoLCBtc09iai0+TWFwLT5u
YW1lLCBtc09iai0+SWQpOw0KICAgICAgaWYobXNTYXZlTWFwKG1zT2JqLT5NYXAsIGJ1ZmZlcikg
PT0gLTEpIHdyaXRlRXJyb3IoKTsNCiAgICB9DQoNCiAgICBpZigobXNPYmotPkNvb3JkU291cmNl
ID09IEZST01JTUdQTlQpIHx8IChtc09iai0+Q29vcmRTb3VyY2UgPT0gRlJPTUlNR0JPWCkpIC8q
IG1ha2Ugc3VyZSBleHRlbnQgb2YgZXhpc3RpbmcgaW1hZ2UgbWF0Y2hlcyBzaGFwZSBvZiBpbWFn
ZSAqLw0KICAgICAgbXNPYmotPk1hcC0+Y2VsbHNpemUgPSBtc0FkanVzdEV4dGVudCgmbXNPYmot
PkltZ0V4dCwgbXNPYmotPkltZ0NvbHMsIG1zT2JqLT5JbWdSb3dzKTsNCg0KICAgIC8qDQogICAg
KiogRm9yIGVhY2ggbGF5ZXIgbGV0cyBzZXQgbGF5ZXIgc3RhdHVzDQogICAgKi8NCiAgICBmb3Io
aT0wO2k8bXNPYmotPk1hcC0+bnVtbGF5ZXJzO2krKykgew0KICAgICAgaWYoKG1zT2JqLT5NYXAt
PmxheWVyc1tpXS5zdGF0dXMgIT0gTVNfREVGQVVMVCkpIHsNCglpZihpc09uKG1zT2JqLCBtc09i
ai0+TWFwLT5sYXllcnNbaV0ubmFtZSwgbXNPYmotPk1hcC0+bGF5ZXJzW2ldLmdyb3VwKSA9PSBN
U19UUlVFKSAvKiBTZXQgbGF5ZXIgc3RhdHVzICovDQoJICBtc09iai0+TWFwLT5sYXllcnNbaV0u
c3RhdHVzID0gTVNfT047DQoJZWxzZQ0KCSAgbXNPYmotPk1hcC0+bGF5ZXJzW2ldLnN0YXR1cyA9
IE1TX09GRjsNCiAgICAgIH0gICAgIA0KICAgIH0NCg0KICAgIGlmKG1zT2JqLT5Db29yZFNvdXJj
ZSA9PSBGUk9NUkVGUE5UKSAvKiBmb3JjZSBicm93c2UgbW9kZSBpZiB0aGUgcmVmZXJlbmNlIGNv
b3JkcyBhcmUgc2V0ICovDQogICAgICBtc09iai0+TW9kZSA9IEJST1dTRTsNCg0KICAgIGlmKG1z
T2JqLT5Nb2RlID09IEJST1dTRSkgew0KDQogICAgICBpZighbXNPYmotPk1hcC0+d2ViLnRlbXBs
YXRlKSB7DQoJbXNTZXRFcnJvcihNU19XRUJFUlIsICJObyB0ZW1wbGF0ZSBwcm92aWRlZC4iLCAi
bWFwc2VydigpIik7DQoJd3JpdGVFcnJvcigpOw0KICAgICAgfQ0KDQogICAgICBpZihRdWVyeUZp
bGUpIHsNCglzdGF0dXMgPSBtc0xvYWRRdWVyeShtc09iai0+TWFwLCBRdWVyeUZpbGUpOw0KCWlm
KHN0YXR1cyAhPSBNU19TVUNDRVNTKSB3cml0ZUVycm9yKCk7DQogICAgICB9DQogICAgICANCiAg
ICAgIHNldEV4dGVudChtc09iaik7DQogICAgICBjaGVja1dlYlNjYWxlKG1zT2JqKTsNCiAgICAg
ICANCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiAgICAgIGdlbmVyYXRlIG1hcCwgbGVnZW5kLCBzY2Fs
ZWJhciBhbmQgcmVmZXJuY2UgaW1hZ2VzLiAgICAgICAgICAgICAqLw0KLyogLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0g
Ki8NCiAgICAgIGlmIChtc0dlbmVyYXRlSW1hZ2VzKG1zT2JqLCBRdWVyeUZpbGUsIE1TX1RSVUUp
ID09IE1TX0ZBTFNFKQ0KICAgICAgICB3cml0ZUVycm9yKCk7DQogICAgICANCiAgICAgIGlmKFF1
ZXJ5RmlsZSkgew0KICAgICAgICAgIGlmIChtc1JldHVyblF1ZXJ5KG1zT2JqLCAidGV4dC9odG1s
IiwgTlVMTCkgIT0gTVNfU1VDQ0VTUykNCiAgICAgICAgICAgd3JpdGVFcnJvcigpOw0KICAgICAg
fSBlbHNlIHsNCglpZihURU1QTEFURV9UWVBFKG1zT2JqLT5NYXAtPndlYi50ZW1wbGF0ZSkgPT0g
TVNfRklMRSkgeyAvKiBpZiB0aGVycydzIGFuIGh0bWwgdGVtcGxhdGUsIHRoZW4gdXNlIGl0ICov
DQoJICBwcmludGYoIkNvbnRlbnQtdHlwZTogdGV4dC9odG1sJWMlYyIsIDEwLCAxMCk7IC8qIHdy
aXRlIE1JTUUgaGVhZGVyICovDQoJICBwcmludGYoIjwhLS0gJXMgLS0+XG4iLCBtc0dldFZlcnNp
b24oKSk7DQoJICBmZmx1c2goc3Rkb3V0KTsNCgkgIGlmIChtc1JldHVyblBhZ2UobXNPYmosIG1z
T2JqLT5NYXAtPndlYi50ZW1wbGF0ZSwgQlJPV1NFLCBOVUxMKSAhPSBNU19TVUNDRVNTKQ0KICAg
ICAgICAgd3JpdGVFcnJvcigpOw0KCX0gZWxzZSB7CQ0KCSAgaWYgKG1zUmV0dXJuVVJMKG1zT2Jq
LCBtc09iai0+TWFwLT53ZWIudGVtcGxhdGUsIEJST1dTRSkgIT0gTVNfU1VDQ0VTUykNCiAgICAg
ICAgIHdyaXRlRXJyb3IoKTsNCgl9DQogICAgICB9DQoNCiAgICB9IGVsc2UgaWYobXNPYmotPk1v
ZGUgPT0gTUFQIHx8IG1zT2JqLT5Nb2RlID09IFNDQUxFQkFSIHx8IG1zT2JqLT5Nb2RlID09IFJF
RkVSRU5DRSkgeyAvLyAiaW1hZ2UiIG9ubHkgbW9kZXMNCiAgICAgIHNldEV4dGVudChtc09iaik7
DQogICAgICBjaGVja1dlYlNjYWxlKG1zT2JqKTsNCiAgICAgIA0KICAgICAgc3dpdGNoKG1zT2Jq
LT5Nb2RlKSB7DQogICAgICBjYXNlIE1BUDoNCglpZihRdWVyeUZpbGUpIHsNCgkgIHN0YXR1cyA9
IG1zTG9hZFF1ZXJ5KG1zT2JqLT5NYXAsIFF1ZXJ5RmlsZSk7DQoJICBpZihzdGF0dXMgIT0gTVNf
U1VDQ0VTUykgd3JpdGVFcnJvcigpOw0KCSAgaW1nID0gbXNEcmF3UXVlcnlNYXAobXNPYmotPk1h
cCk7DQoJfSBlbHNlDQoJICBpbWcgPSBtc0RyYXdNYXAobXNPYmotPk1hcCk7DQoJYnJlYWs7DQog
ICAgICBjYXNlIFJFRkVSRU5DRToNCgltc09iai0+TWFwLT5jZWxsc2l6ZSA9IG1zQWRqdXN0RXh0
ZW50KCYobXNPYmotPk1hcC0+ZXh0ZW50KSwgbXNPYmotPk1hcC0+d2lkdGgsIG1zT2JqLT5NYXAt
PmhlaWdodCk7DQoJaW1nID0gbXNEcmF3UmVmZXJlbmNlTWFwKG1zT2JqLT5NYXApOw0KCWJyZWFr
OyAgICAgIA0KICAgICAgY2FzZSBTQ0FMRUJBUjoNCglpbWcgPSBtc0RyYXdTY2FsZWJhcihtc09i
ai0+TWFwKTsNCglicmVhazsNCiAgICAgIH0NCiAgICAgIA0KICAgICAgaWYoIWltZykgd3JpdGVF
cnJvcigpOw0KDQogICAgICBwcmludGYoIkNvbnRlbnQtdHlwZTogJXMlYyVjIixNU19JTUFHRV9N
SU1FX1RZUEUobXNPYmotPk1hcC0+b3V0cHV0Zm9ybWF0KSwgMTAsMTApOw0KICAgICAgaWYoIG1z
T2JqLT5Nb2RlID09IE1BUCApDQogICAgICAgICAgc3RhdHVzID0gbXNTYXZlSW1hZ2UobXNPYmot
Pk1hcCxpbWcsIE5VTEwpOw0KICAgICAgZWxzZQ0KICAgICAgICAgIHN0YXR1cyA9IG1zU2F2ZUlt
YWdlKE5VTEwsaW1nLCBOVUxMKTsNCiAgICAgICAgICANCiAgICAgIGlmKHN0YXR1cyAhPSBNU19T
VUNDRVNTKSB3cml0ZUVycm9yKCk7DQogICAgICANCiAgICAgIG1zRnJlZUltYWdlKGltZyk7DQog
ICAgfSBlbHNlIGlmIChtc09iai0+TW9kZSA9PSBMRUdFTkQpIHsNCiAgICAgICBpZiAobXNPYmot
Pk1hcC0+bGVnZW5kLnRlbXBsYXRlKSANCiAgICAgICB7DQogICAgICAgICAgY2hhciAqbGVnZW5k
VGVtcGxhdGU7DQoNCiAgICAgICAgICBsZWdlbmRUZW1wbGF0ZSA9IGdlbmVyYXRlTGVnZW5kVGVt
cGxhdGUobXNPYmopOw0KICAgICAgICAgIGlmIChsZWdlbmRUZW1wbGF0ZSkgew0KICAgICAgICAg
ICAgIHByaW50ZigiQ29udGVudC10eXBlOiB0ZXh0L2h0bWxcblxuJXMiLCBsZWdlbmRUZW1wbGF0
ZSk7DQoNCiAgICAgICAgICAgICBmcmVlKGxlZ2VuZFRlbXBsYXRlKTsNCiAgICAgICAgICB9DQog
ICAgICAgICAgZWxzZSAvLyBlcnJvciBhbHJlYWR5IGdlbmVyYXRlZCBieSAoZ2VuZXJhdGVMZWdl
bmRUZW1wbGF0ZSgpKQ0KICAgICAgICAgICAgd3JpdGVFcnJvcigpOzsNCiAgICAgICB9ICAgICAg
ICAgDQogICAgICAgZWxzZQ0KICAgICAgIHsNCiAgICAgICAgICBpbWcgPSBtc0RyYXdMZWdlbmQo
bXNPYmotPk1hcCk7DQogICAgICAgICAgaWYoIWltZykgd3JpdGVFcnJvcigpOw0KDQogICAgICAg
ICAgcHJpbnRmKCJDb250ZW50LXR5cGU6ICVzJWMlYyIsTVNfSU1BR0VfTUlNRV9UWVBFKG1zT2Jq
LT5NYXAtPm91dHB1dGZvcm1hdCksIDEwLDEwKTsNCiAgICAgICAgICBzdGF0dXMgPSBtc1NhdmVJ
bWFnZShOVUxMLCBpbWcsIE5VTEwpOw0KICAgICAgICAgIGlmKHN0YXR1cyAhPSBNU19TVUNDRVNT
KSB3cml0ZUVycm9yKCk7DQogICAgICAgICAgDQogICAgICAgICAgbXNGcmVlSW1hZ2UoaW1nKTsg
ICAgICAgICAgICANCiAgICAgICB9DQogICAgfSBlbHNlIGlmKG1zT2JqLT5Nb2RlID49IFFVRVJZ
KSB7IC8vIHF1ZXJ5IG1vZGVzDQoNCiAgICAgIGlmKFF1ZXJ5RmlsZSkgeyAvLyBhbHJlYWR5IGdv
dCBhIGNvbXBsZXRlZCBxdWVyeQ0KCXN0YXR1cyA9IG1zTG9hZFF1ZXJ5KG1zT2JqLT5NYXAsIFF1
ZXJ5RmlsZSk7DQoJaWYoc3RhdHVzICE9IE1TX1NVQ0NFU1MpIHdyaXRlRXJyb3IoKTsNCiAgICAg
IH0gZWxzZSB7DQoNCglpZigoUXVlcnlMYXllckluZGV4ID0gbXNHZXRMYXllckluZGV4KG1zT2Jq
LT5NYXAsIFF1ZXJ5TGF5ZXIpKSAhPSAtMSkgLyogZm9yY2UgdGhlIHF1ZXJ5IGxheWVyIG9uICov
DQoJICBtc09iai0+TWFwLT5sYXllcnNbUXVlcnlMYXllckluZGV4XS5zdGF0dXMgPSBNU19PTjsN
Cg0KICAgICAgICBzd2l0Y2gobXNPYmotPk1vZGUpIHsNCgljYXNlIElURU1GRUFUVVJFUVVFUlk6
DQogICAgICAgIGNhc2UgSVRFTUZFQVRVUkVOUVVFUlk6DQoJY2FzZSBJVEVNRkVBVFVSRVFVRVJZ
TUFQOg0KICAgICAgICBjYXNlIElURU1GRUFUVVJFTlFVRVJZTUFQOg0KCSAgaWYoKFNlbGVjdExh
eWVySW5kZXggPSBtc0dldExheWVySW5kZXgobXNPYmotPk1hcCwgU2VsZWN0TGF5ZXIpKSA9PSAt
MSkgeyAvKiBmb3JjZSB0aGUgc2VsZWN0aW9uIGxheWVyIG9uICovDQoJICAgIG1zU2V0RXJyb3Io
TVNfV0VCRVJSLCAiU2VsZWN0aW9uIGxheWVyIG5vdCBzZXQgb3IgcmVmZXJlbmNlcyBhbiBpbnZh
bGlkIGxheWVyLiIsICJtYXBzZXJ2KCkiKTsgDQoJICAgIHdyaXRlRXJyb3IoKTsNCgkgIH0NCgkg
IG1zT2JqLT5NYXAtPmxheWVyc1tTZWxlY3RMYXllckluZGV4XS5zdGF0dXMgPSBNU19PTjsNCg0K
CSAgaWYoUXVlcnlDb29yZFNvdXJjZSAhPSBOT05FICYmICFtc09iai0+VXNlU2hhcGVzKQ0KCSAg
ICBzZXRFeHRlbnQobXNPYmopOyAvKiBzZXQgdXNlciBhcmVhIG9mIGludGVyZXN0ICovDQoNCgkg
IGlmKG1zT2JqLT5Nb2RlID09IElURU1GRUFUVVJFUVVFUlkgfHwgbXNPYmotPk1vZGUgPT0gSVRF
TUZFQVRVUkVRVUVSWU1BUCkgew0KCSAgICBpZigoc3RhdHVzID0gbXNRdWVyeUJ5QXR0cmlidXRl
cyhtc09iai0+TWFwLCBTZWxlY3RMYXllckluZGV4LCBRdWVyeUl0ZW0sIFF1ZXJ5U3RyaW5nLCBN
U19TSU5HTEUpKSAhPSBNU19TVUNDRVNTKSB3cml0ZUVycm9yKCk7DQoJICB9IGVsc2Ugew0KCSAg
ICBpZigoc3RhdHVzID0gbXNRdWVyeUJ5QXR0cmlidXRlcyhtc09iai0+TWFwLCBTZWxlY3RMYXll
ckluZGV4LCBRdWVyeUl0ZW0sIFF1ZXJ5U3RyaW5nLCBNU19NVUxUSVBMRSkpICE9IE1TX1NVQ0NF
U1MpIHdyaXRlRXJyb3IoKTsNCgkgIH0NCg0KCSAgaWYobXNRdWVyeUJ5RmVhdHVyZXMobXNPYmot
Pk1hcCwgUXVlcnlMYXllckluZGV4LCBTZWxlY3RMYXllckluZGV4KSAhPSBNU19TVUNDRVNTKSB3
cml0ZUVycm9yKCk7DQoNCgkgIGJyZWFrOw0KICAgICAgICBjYXNlIEZFQVRVUkVRVUVSWToNCiAg
ICAgICAgY2FzZSBGRUFUVVJFTlFVRVJZOg0KCWNhc2UgRkVBVFVSRVFVRVJZTUFQOg0KICAgICAg
ICBjYXNlIEZFQVRVUkVOUVVFUllNQVA6DQoJICBpZigoU2VsZWN0TGF5ZXJJbmRleCA9IG1zR2V0
TGF5ZXJJbmRleChtc09iai0+TWFwLCBTZWxlY3RMYXllcikpID09IC0xKSB7IC8qIGZvcmNlIHRo
ZSBzZWxlY3Rpb24gbGF5ZXIgb24gKi8NCgkgICAgbXNTZXRFcnJvcihNU19XRUJFUlIsICJTZWxl
Y3Rpb24gbGF5ZXIgbm90IHNldCBvciByZWZlcmVuY2VzIGFuIGludmFsaWQgbGF5ZXIuIiwgIm1h
cHNlcnYoKSIpOyANCgkgICAgd3JpdGVFcnJvcigpOw0KCSAgfQ0KCSAgbXNPYmotPk1hcC0+bGF5
ZXJzW1NlbGVjdExheWVySW5kZXhdLnN0YXR1cyA9IE1TX09OOw0KCSAgDQoJICBpZihtc09iai0+
TW9kZSA9PSBGRUFUVVJFUVVFUlkgfHwgbXNPYmotPk1vZGUgPT0gRkVBVFVSRVFVRVJZTUFQKSB7
DQoJICAgIHN3aXRjaChRdWVyeUNvb3JkU291cmNlKSB7DQoJICAgIGNhc2UgRlJPTUlNR1BOVDoN
CgkgICAgICBtc09iai0+TWFwLT5leHRlbnQgPSBtc09iai0+SW1nRXh0OyAvKiB1c2UgdGhlIGV4
aXN0aW5nIG1hcCBleHRlbnQgKi8JDQoJICAgICAgc2V0Q29vcmRpbmF0ZSgpOw0KCSAgICAgIGlm
KChzdGF0dXMgPSBtc1F1ZXJ5QnlQb2ludChtc09iai0+TWFwLCBTZWxlY3RMYXllckluZGV4LCBN
U19TSU5HTEUsIG1zT2JqLT5NYXBQbnQsIDApKSAhPSBNU19TVUNDRVNTKSB3cml0ZUVycm9yKCk7
DQoJICAgICAgYnJlYWs7DQoJICAgIGNhc2UgRlJPTVVTRVJQTlQ6IC8qIG9ubHkgYSBidWZmZXIg
bWFrZXMgc2Vuc2UgKi8NCgkgICAgICBpZihtc09iai0+QnVmZmVyID09IC0xKSB7DQoJCW1zU2V0
RXJyb3IoTVNfV0VCRVJSLCAiUG9pbnQgZ2l2ZW4gYnV0IG5vIHNlYXJjaCBidWZmZXIgc3BlY2lm
aWVkLiIsICJtYXBzZXJ2KCkiKTsNCgkJd3JpdGVFcnJvcigpOw0KCSAgICAgIH0NCgkgICAgICBp
Zigoc3RhdHVzID0gbXNRdWVyeUJ5UG9pbnQobXNPYmotPk1hcCwgU2VsZWN0TGF5ZXJJbmRleCwg
TVNfU0lOR0xFLCBtc09iai0+TWFwUG50LCBtc09iai0+QnVmZmVyKSkgIT0gTVNfU1VDQ0VTUykg
d3JpdGVFcnJvcigpOw0KCSAgICAgIGJyZWFrOw0KCSAgICBkZWZhdWx0Og0KCSAgICAgIG1zU2V0
RXJyb3IoTVNfV0VCRVJSLCAiTm8gd2F5IHRvIHRoZSBpbml0aWFsIHNlYXJjaCwgbm90IGVub3Vn
aCBpbmZvcm1hdGlvbi4iLCAibWFwc2VydigpIik7DQoJICAgICAgd3JpdGVFcnJvcigpOw0KCSAg
ICAgIGJyZWFrOw0KCSAgICB9CSAgDQoJICB9IGVsc2UgeyAvKiBGRUFUVVJFTlFVRVJZL0ZFQVRV
UkVOUVVFUllNQVAgKi8NCgkgICAgc3dpdGNoKFF1ZXJ5Q29vcmRTb3VyY2UpIHsNCgkgICAgY2Fz
ZSBGUk9NSU1HUE5UOg0KCSAgICAgIG1zT2JqLT5NYXAtPmV4dGVudCA9IG1zT2JqLT5JbWdFeHQ7
IC8qIHVzZSB0aGUgZXhpc3RpbmcgbWFwIGV4dGVudCAqLwkNCgkgICAgICBzZXRDb29yZGluYXRl
KCk7DQoJICAgICAgaWYoKHN0YXR1cyA9IG1zUXVlcnlCeVBvaW50KG1zT2JqLT5NYXAsIFNlbGVj
dExheWVySW5kZXgsIE1TX01VTFRJUExFLCBtc09iai0+TWFwUG50LCAwKSkgIT0gTVNfU1VDQ0VT
Uykgd3JpdGVFcnJvcigpOw0KCSAgICAgIGJyZWFrOwkgDQoJICAgIGNhc2UgRlJPTUlNR0JPWDoN
CgkgICAgICBicmVhazsNCgkgICAgY2FzZSBGUk9NVVNFUlBOVDogLyogb25seSBhIGJ1ZmZlciBt
YWtlcyBzZW5zZSAqLw0KCSAgICAgIGlmKChzdGF0dXMgPSBtc1F1ZXJ5QnlQb2ludChtc09iai0+
TWFwLCBTZWxlY3RMYXllckluZGV4LCBNU19NVUxUSVBMRSwgbXNPYmotPk1hcFBudCwgbXNPYmot
PkJ1ZmZlcikpICE9IE1TX1NVQ0NFU1MpIHdyaXRlRXJyb3IoKTsNCgkgICAgZGVmYXVsdDoNCgkg
ICAgICBzZXRFeHRlbnQobXNPYmopOw0KCSAgICAgIGlmKChzdGF0dXMgPSBtc1F1ZXJ5QnlSZWN0
KG1zT2JqLT5NYXAsIFNlbGVjdExheWVySW5kZXgsIG1zT2JqLT5NYXAtPmV4dGVudCkpICE9IE1T
X1NVQ0NFU1MpIHdyaXRlRXJyb3IoKTsNCgkgICAgICBicmVhazsNCgkgICAgfQ0KCSAgfSAvKiBl
bmQgc3dpdGNoICovDQoJDQoJICBpZihtc1F1ZXJ5QnlGZWF0dXJlcyhtc09iai0+TWFwLCBRdWVy
eUxheWVySW5kZXgsIFNlbGVjdExheWVySW5kZXgpICE9IE1TX1NVQ0NFU1MpIHdyaXRlRXJyb3Io
KTsNCiAgICAgIA0KCSAgYnJlYWs7DQogICAgICAgIGNhc2UgSVRFTVFVRVJZOg0KCWNhc2UgSVRF
TU5RVUVSWToNCiAgICAgICAgY2FzZSBJVEVNUVVFUllNQVA6DQogICAgICAgIGNhc2UgSVRFTU5R
VUVSWU1BUDoNCg0KCSAgaWYoUXVlcnlDb29yZFNvdXJjZSAhPSBOT05FICYmICFtc09iai0+VXNl
U2hhcGVzKQ0KCSAgICBzZXRFeHRlbnQobXNPYmopOyAvKiBzZXQgdXNlciBhcmVhIG9mIGludGVy
ZXN0ICovDQoNCgkgIGlmKG1zT2JqLT5Nb2RlID09IElURU1RVUVSWSB8fCBtc09iai0+TW9kZSA9
PSBJVEVNUVVFUllNQVApIHsNCgkgICAgaWYoKHN0YXR1cyA9IG1zUXVlcnlCeUF0dHJpYnV0ZXMo
bXNPYmotPk1hcCwgUXVlcnlMYXllckluZGV4LCBRdWVyeUl0ZW0sIFF1ZXJ5U3RyaW5nLCBNU19T
SU5HTEUpKSAhPSBNU19TVUNDRVNTKSB3cml0ZUVycm9yKCk7DQoJICB9IGVsc2Ugew0KCSAgICBp
Zigoc3RhdHVzID0gbXNRdWVyeUJ5QXR0cmlidXRlcyhtc09iai0+TWFwLCBRdWVyeUxheWVySW5k
ZXgsIFF1ZXJ5SXRlbSwgUXVlcnlTdHJpbmcsIE1TX01VTFRJUExFKSkgIT0gTVNfU1VDQ0VTUykg
d3JpdGVFcnJvcigpOw0KICAgICAgICAgIH0NCg0KCSAgYnJlYWs7DQogICAgICAgIGNhc2UgTlFV
RVJZOg0KICAgICAgICBjYXNlIE5RVUVSWU1BUDoNCgkgIHN3aXRjaChRdWVyeUNvb3JkU291cmNl
KSB7DQoJICBjYXNlIEZST01JTUdQTlQ6CSAgDQoJICAgIHNldENvb3JkaW5hdGUoKTsNCgkgIA0K
CSAgICBpZihTZWFyY2hNYXApIHsgLy8gY29tcHV0ZSBuZXcgZXh0ZW50LCBwYW4gZXRjIHRoZW4g
c2VhcmNoIHRoYXQgZXh0ZW50DQoJICAgICAgc2V0RXh0ZW50KG1zT2JqKTsNCgkgICAgICBtc09i
ai0+TWFwLT5jZWxsc2l6ZSA9IG1zQWRqdXN0RXh0ZW50KCYobXNPYmotPk1hcC0+ZXh0ZW50KSwg
bXNPYmotPk1hcC0+d2lkdGgsIG1zT2JqLT5NYXAtPmhlaWdodCk7DQoJICAgICAgaWYoKHN0YXR1
cyA9IG1zQ2FsY3VsYXRlU2NhbGUobXNPYmotPk1hcC0+ZXh0ZW50LCBtc09iai0+TWFwLT51bml0
cywgbXNPYmotPk1hcC0+d2lkdGgsIG1zT2JqLT5NYXAtPmhlaWdodCwgbXNPYmotPk1hcC0+cmVz
b2x1dGlvbiwgJm1zT2JqLT5NYXAtPnNjYWxlKSkgIT0gTVNfU1VDQ0VTUykgd3JpdGVFcnJvcigp
Ow0KCSAgICAgIGlmKChzdGF0dXMgPSBtc1F1ZXJ5QnlSZWN0KG1zT2JqLT5NYXAsIFF1ZXJ5TGF5
ZXJJbmRleCwgbXNPYmotPk1hcC0+ZXh0ZW50KSkgIT0gTVNfU1VDQ0VTUykgd3JpdGVFcnJvcigp
Ow0KCSAgICB9IGVsc2Ugew0KCSAgICAgIG1zT2JqLT5NYXAtPmV4dGVudCA9IG1zT2JqLT5JbWdF
eHQ7IC8vIHVzZSB0aGUgZXhpc3RpbmcgaW1hZ2UgcGFyYW1ldGVycw0KCSAgICAgIG1zT2JqLT5N
YXAtPndpZHRoID0gbXNPYmotPkltZ0NvbHM7DQoJICAgICAgbXNPYmotPk1hcC0+aGVpZ2h0ID0g
bXNPYmotPkltZ1Jvd3M7DQoJICAgICAgaWYoKHN0YXR1cyA9IG1zQ2FsY3VsYXRlU2NhbGUobXNP
YmotPk1hcC0+ZXh0ZW50LCBtc09iai0+TWFwLT51bml0cywgbXNPYmotPk1hcC0+d2lkdGgsIG1z
T2JqLT5NYXAtPmhlaWdodCwgbXNPYmotPk1hcC0+cmVzb2x1dGlvbiwgJm1zT2JqLT5NYXAtPnNj
YWxlKSkgIT0gTVNfU1VDQ0VTUykgd3JpdGVFcnJvcigpOwkgDQoJICAgICAgaWYoKHN0YXR1cyA9
IG1zUXVlcnlCeVBvaW50KG1zT2JqLT5NYXAsIFF1ZXJ5TGF5ZXJJbmRleCwgTVNfTVVMVElQTEUs
IG1zT2JqLT5NYXBQbnQsIDApKSAhPSBNU19TVUNDRVNTKSB3cml0ZUVycm9yKCk7DQoJICAgIH0N
CgkgICAgYnJlYWs7CSAgDQoJICBjYXNlIEZST01JTUdCT1g6CSAgDQoJICAgIGlmKFNlYXJjaE1h
cCkgeyAvLyBjb21wdXRlIG5ldyBleHRlbnQsIHBhbiBldGMgdGhlbiBzZWFyY2ggdGhhdCBleHRl
bnQNCgkgICAgICBzZXRFeHRlbnQobXNPYmopOw0KCSAgICAgIGlmKChzdGF0dXMgPSBtc0NhbGN1
bGF0ZVNjYWxlKG1zT2JqLT5NYXAtPmV4dGVudCwgbXNPYmotPk1hcC0+dW5pdHMsIG1zT2JqLT5N
YXAtPndpZHRoLCBtc09iai0+TWFwLT5oZWlnaHQsIG1zT2JqLT5NYXAtPnJlc29sdXRpb24sICZt
c09iai0+TWFwLT5zY2FsZSkpICE9IE1TX1NVQ0NFU1MpIHdyaXRlRXJyb3IoKTsNCgkgICAgICBt
c09iai0+TWFwLT5jZWxsc2l6ZSA9IG1zQWRqdXN0RXh0ZW50KCYobXNPYmotPk1hcC0+ZXh0ZW50
KSwgbXNPYmotPk1hcC0+d2lkdGgsIG1zT2JqLT5NYXAtPmhlaWdodCk7DQoJICAgICAgaWYoKHN0
YXR1cyA9IG1zUXVlcnlCeVJlY3QobXNPYmotPk1hcCwgUXVlcnlMYXllckluZGV4LCBtc09iai0+
TWFwLT5leHRlbnQpKSAhPSBNU19TVUNDRVNTKSB3cml0ZUVycm9yKCk7DQoJICAgIH0gZWxzZSB7
DQoJICAgICAgZG91YmxlIGNlbGx4LCBjZWxseTsNCgkgICAgDQoJICAgICAgbXNPYmotPk1hcC0+
ZXh0ZW50ID0gbXNPYmotPkltZ0V4dDsgLy8gdXNlIHRoZSBleGlzdGluZyBpbWFnZSBwYXJhbWV0
ZXJzDQoJICAgICAgbXNPYmotPk1hcC0+d2lkdGggPSBtc09iai0+SW1nQ29sczsNCgkgICAgICBt
c09iai0+TWFwLT5oZWlnaHQgPSBtc09iai0+SW1nUm93czsNCgkgICAgICBpZigoc3RhdHVzID0g
bXNDYWxjdWxhdGVTY2FsZShtc09iai0+TWFwLT5leHRlbnQsIG1zT2JqLT5NYXAtPnVuaXRzLCBt
c09iai0+TWFwLT53aWR0aCwgbXNPYmotPk1hcC0+aGVpZ2h0LCBtc09iai0+TWFwLT5yZXNvbHV0
aW9uLCAmbXNPYmotPk1hcC0+c2NhbGUpKSAhPSBNU19TVUNDRVNTKSB3cml0ZUVycm9yKCk7CSAg
DQoJICAgIA0KCSAgICAgIGNlbGx4ID0gTVNfQ0VMTFNJWkUobXNPYmotPkltZ0V4dC5taW54LCBt
c09iai0+SW1nRXh0Lm1heHgsIG1zT2JqLT5JbWdDb2xzKTsgLy8gY2FsY3VsYXRlIHRoZSBuZXcg
c2VhcmNoIGV4dGVudA0KCSAgICAgIGNlbGx5ID0gTVNfQ0VMTFNJWkUobXNPYmotPkltZ0V4dC5t
aW55LCBtc09iai0+SW1nRXh0Lm1heHksIG1zT2JqLT5JbWdSb3dzKTsNCgkgICAgICBtc09iai0+
UmF3RXh0Lm1pbnggPSBNU19JTUFHRTJNQVBfWChtc09iai0+SW1nQm94Lm1pbngsIG1zT2JqLT5J
bWdFeHQubWlueCwgY2VsbHgpOwkgICAgICANCgkgICAgICBtc09iai0+UmF3RXh0Lm1heHggPSBN
U19JTUFHRTJNQVBfWChtc09iai0+SW1nQm94Lm1heHgsIG1zT2JqLT5JbWdFeHQubWlueCwgY2Vs
bHgpOw0KCSAgICAgIG1zT2JqLT5SYXdFeHQubWF4eSA9IE1TX0lNQUdFMk1BUF9ZKG1zT2JqLT5J
bWdCb3gubWlueSwgbXNPYmotPkltZ0V4dC5tYXh5LCBjZWxseSk7IC8vIHkncyBhcmUgZmxpcCBm
bG9wcGVkIGJlY2F1c2UgaW1nL21hcCBjb29yZGluYXRlIHN5c3RlbXMgYXJlDQoJICAgICAgbXNP
YmotPlJhd0V4dC5taW55ID0gTVNfSU1BR0UyTUFQX1kobXNPYmotPkltZ0JveC5tYXh5LCBtc09i
ai0+SW1nRXh0Lm1heHksIGNlbGx5KTsNCg0KCSAgICAgIGlmKChzdGF0dXMgPSBtc1F1ZXJ5QnlS
ZWN0KG1zT2JqLT5NYXAsIFF1ZXJ5TGF5ZXJJbmRleCwgbXNPYmotPlJhd0V4dCkpICE9IE1TX1NV
Q0NFU1MpIHdyaXRlRXJyb3IoKTsNCgkgICAgfQ0KCSAgICBicmVhazsNCgkgIGNhc2UgRlJPTUlN
R1NIQVBFOg0KCSAgICBtc09iai0+TWFwLT5leHRlbnQgPSBtc09iai0+SW1nRXh0OyAvLyB1c2Ug
dGhlIGV4aXN0aW5nIGltYWdlIHBhcmFtZXRlcnMNCgkgICAgbXNPYmotPk1hcC0+d2lkdGggPSBt
c09iai0+SW1nQ29sczsNCgkgICAgbXNPYmotPk1hcC0+aGVpZ2h0ID0gbXNPYmotPkltZ1Jvd3M7
DQoJICAgIG1zT2JqLT5NYXAtPmNlbGxzaXplID0gbXNBZGp1c3RFeHRlbnQoJihtc09iai0+TWFw
LT5leHRlbnQpLCBtc09iai0+TWFwLT53aWR0aCwgbXNPYmotPk1hcC0+aGVpZ2h0KTsNCgkgICAg
aWYoKHN0YXR1cyA9IG1zQ2FsY3VsYXRlU2NhbGUobXNPYmotPk1hcC0+ZXh0ZW50LCBtc09iai0+
TWFwLT51bml0cywgbXNPYmotPk1hcC0+d2lkdGgsIG1zT2JqLT5NYXAtPmhlaWdodCwgbXNPYmot
Pk1hcC0+cmVzb2x1dGlvbiwgJm1zT2JqLT5NYXAtPnNjYWxlKSkgIT0gTVNfU1VDQ0VTUykgd3Jp
dGVFcnJvcigpOw0KCSAgDQoJICAgIC8vIGNvbnZlcnQgZnJvbSBpbWFnZSB0byBtYXAgY29vcmRp
bmF0ZXMgaGVyZSAoc2VlIHNldENvb3JkaW5hdGUpDQoJICAgIGZvcihpPTA7IGk8bXNPYmotPlNl
bGVjdFNoYXBlLm51bWxpbmVzOyBpKyspIHsNCgkgICAgICBmb3Ioaj0wOyBqPG1zT2JqLT5TZWxl
Y3RTaGFwZS5saW5lW2ldLm51bXBvaW50czsgaisrKSB7DQoJICAgICAgICBtc09iai0+U2VsZWN0
U2hhcGUubGluZVtpXS5wb2ludFtqXS54ID0gTVNfSU1BR0UyTUFQX1gobXNPYmotPlNlbGVjdFNo
YXBlLmxpbmVbaV0ucG9pbnRbal0ueCwgbXNPYmotPk1hcC0+ZXh0ZW50Lm1pbngsIG1zT2JqLT5N
YXAtPmNlbGxzaXplKTsNCgkgICAgICAgIG1zT2JqLT5TZWxlY3RTaGFwZS5saW5lW2ldLnBvaW50
W2pdLnkgPSBNU19JTUFHRTJNQVBfWShtc09iai0+U2VsZWN0U2hhcGUubGluZVtpXS5wb2ludFtq
XS55LCBtc09iai0+TWFwLT5leHRlbnQubWF4eSwgbXNPYmotPk1hcC0+Y2VsbHNpemUpOw0KCSAg
ICAgIH0NCgkgICAgfQ0KCSAgDQoJICAgIGlmKChzdGF0dXMgPSBtc1F1ZXJ5QnlTaGFwZShtc09i
ai0+TWFwLCBRdWVyeUxheWVySW5kZXgsICZtc09iai0+U2VsZWN0U2hhcGUpKSAhPSBNU19TVUND
RVNTKSB3cml0ZUVycm9yKCk7DQoJICAgIGJyZWFrOwkgIA0KCSAgY2FzZSBGUk9NVVNFUlBOVDoN
CgkgICAgaWYobXNPYmotPkJ1ZmZlciA9PSAwKSB7DQoJICAgICAgaWYoKHN0YXR1cyA9IG1zUXVl
cnlCeVBvaW50KG1zT2JqLT5NYXAsIFF1ZXJ5TGF5ZXJJbmRleCwgTVNfTVVMVElQTEUsIG1zT2Jq
LT5NYXBQbnQsIG1zT2JqLT5CdWZmZXIpKSAhPSBNU19TVUNDRVNTKSB3cml0ZUVycm9yKCk7DQoJ
ICAgICAgc2V0RXh0ZW50KG1zT2JqKTsNCgkgICAgfSBlbHNlIHsNCgkgICAgICBzZXRFeHRlbnQo
bXNPYmopOw0KCSAgICAgIGlmKChzdGF0dXMgPSBtc1F1ZXJ5QnlSZWN0KG1zT2JqLT5NYXAsIFF1
ZXJ5TGF5ZXJJbmRleCwgbXNPYmotPk1hcC0+ZXh0ZW50KSkgIT0gTVNfU1VDQ0VTUykgd3JpdGVF
cnJvcigpOw0KCSAgICB9DQoJICAgIGJyZWFrOw0KCSAgY2FzZSBGUk9NVVNFUlNIQVBFOg0KCSAg
ICBzZXRFeHRlbnQobXNPYmopOw0KCSAgICBpZigoc3RhdHVzID0gbXNRdWVyeUJ5U2hhcGUobXNP
YmotPk1hcCwgUXVlcnlMYXllckluZGV4LCAmbXNPYmotPlNlbGVjdFNoYXBlKSkgIT0gTVNfU1VD
Q0VTUykgd3JpdGVFcnJvcigpOw0KCSAgICBicmVhazsJICANCgkgIGRlZmF1bHQ6IC8vIGZyb20g
YW4gZXh0ZW50IG9mIHNvbWUgc29ydA0KCSAgICBzZXRFeHRlbnQobXNPYmopOw0KCSAgICBpZigo
c3RhdHVzID0gbXNRdWVyeUJ5UmVjdChtc09iai0+TWFwLCBRdWVyeUxheWVySW5kZXgsIG1zT2Jq
LT5NYXAtPmV4dGVudCkpICE9IE1TX1NVQ0NFU1MpIHdyaXRlRXJyb3IoKTsNCgkgICAgYnJlYWs7
DQoJICB9ICAgICAgDQoJICBicmVhazsNCiAgICAgICAgY2FzZSBRVUVSWToNCiAgICAgICAgY2Fz
ZSBRVUVSWU1BUDoNCgkgIHN3aXRjaChRdWVyeUNvb3JkU291cmNlKSB7DQoJICBjYXNlIEZST01J
TUdQTlQ6DQoJICAgIHNldENvb3JkaW5hdGUoKTsNCgkgICAgbXNPYmotPk1hcC0+ZXh0ZW50ID0g
bXNPYmotPkltZ0V4dDsgLy8gdXNlIHRoZSBleGlzdGluZyBpbWFnZSBwYXJhbWV0ZXJzDQoJICAg
IG1zT2JqLT5NYXAtPndpZHRoID0gbXNPYmotPkltZ0NvbHM7DQoJICAgIG1zT2JqLT5NYXAtPmhl
aWdodCA9IG1zT2JqLT5JbWdSb3dzOw0KCSAgICBpZigoc3RhdHVzID0gbXNDYWxjdWxhdGVTY2Fs
ZShtc09iai0+TWFwLT5leHRlbnQsIG1zT2JqLT5NYXAtPnVuaXRzLCBtc09iai0+TWFwLT53aWR0
aCwgbXNPYmotPk1hcC0+aGVpZ2h0LCBtc09iai0+TWFwLT5yZXNvbHV0aW9uLCAmbXNPYmotPk1h
cC0+c2NhbGUpKSAhPSBNU19TVUNDRVNTKSB3cml0ZUVycm9yKCk7CSAJICANCgkgICAgaWYoKHN0
YXR1cyA9IG1zUXVlcnlCeVBvaW50KG1zT2JqLT5NYXAsIFF1ZXJ5TGF5ZXJJbmRleCwgTVNfU0lO
R0xFLCBtc09iai0+TWFwUG50LCAwKSkgIT0gTVNfU1VDQ0VTUykgd3JpdGVFcnJvcigpOw0KCSAg
ICBicmVhazsNCgkgIA0KCSAgY2FzZSBGUk9NVVNFUlBOVDogLyogb25seSBhIGJ1ZmZlciBtYWtl
cyBzZW5zZSwgRE9FUyBJVD8gKi8JDQoJICAgIHNldEV4dGVudChtc09iaik7CQ0KCSAgICBpZigo
c3RhdHVzID0gbXNRdWVyeUJ5UG9pbnQobXNPYmotPk1hcCwgUXVlcnlMYXllckluZGV4LCBNU19T
SU5HTEUsIG1zT2JqLT5NYXBQbnQsIG1zT2JqLT5CdWZmZXIpKSAhPSBNU19TVUNDRVNTKSB3cml0
ZUVycm9yKCk7DQoJICAgIGJyZWFrOw0KCSAgDQoJICBkZWZhdWx0Og0KCSAgICBtc1NldEVycm9y
KE1TX1dFQkVSUiwgIlF1ZXJ5IG1vZGUgbmVlZHMgYSBwb2ludCwgaW1neHkgYW5kIG1hcHh5IGFy
ZSBub3Qgc2V0LiIsICJtYXBzZXJ2KCkiKTsNCgkgICAgd3JpdGVFcnJvcigpOw0KCSAgICBicmVh
azsNCgkgIH0NCgkgIGJyZWFrOw0KICAgICAgICBjYXNlIElOREVYUVVFUlk6DQogICAgICAgIGNh
c2UgSU5ERVhRVUVSWU1BUDoNCgkgIGlmKChzdGF0dXMgPSBtc1F1ZXJ5QnlJbmRleChtc09iai0+
TWFwLCBRdWVyeUxheWVySW5kZXgsIFRpbGVJbmRleCwgU2hhcGVJbmRleCkpICE9IE1TX1NVQ0NF
U1MpIHdyaXRlRXJyb3IoKTsNCgkgIGJyZWFrOw0KICAgICAgICB9IC8vIGVuZCBtb2RlIHN3aXRj
aA0KICAgICAgfQ0KCSAgDQogICAgICBpZihtc09iai0+TWFwLT5xdWVyeW1hcC53aWR0aCAhPSAt
MSkgbXNPYmotPk1hcC0+d2lkdGggPSBtc09iai0+TWFwLT5xdWVyeW1hcC53aWR0aDsgLy8gbWFr
ZSBzdXJlIHdlIHVzZSB0aGUgcmlnaHQgc2l6ZQ0KICAgICAgaWYobXNPYmotPk1hcC0+cXVlcnlt
YXAuaGVpZ2h0ICE9IC0xKSBtc09iai0+TWFwLT5oZWlnaHQgPSBtc09iai0+TWFwLT5xdWVyeW1h
cC5oZWlnaHQ7DQoNCiAgICAgIGlmKG1zT2JqLT5Vc2VTaGFwZXMpDQoJc2V0RXh0ZW50RnJvbVNo
YXBlcygpOw0KDQogICAgICAvLyBqdXN0IHJldHVybiB0aGUgaW1hZ2UNCiAgICAgIGlmKG1zT2Jq
LT5Nb2RlID09IFFVRVJZTUFQIHx8IG1zT2JqLT5Nb2RlID09IE5RVUVSWU1BUCB8fCBtc09iai0+
TW9kZSA9PSBJVEVNUVVFUllNQVAgfHwgbXNPYmotPk1vZGUgPT0gSVRFTU5RVUVSWU1BUCB8fCBt
c09iai0+TW9kZSA9PSBGRUFUVVJFUVVFUllNQVAgfHwgbXNPYmotPk1vZGUgPT0gRkVBVFVSRU5R
VUVSWU1BUCB8fCBtc09iai0+TW9kZSA9PSBJVEVNRkVBVFVSRVFVRVJZTUFQIHx8IG1zT2JqLT5N
b2RlID09IElURU1GRUFUVVJFTlFVRVJZTUFQIHx8IG1zT2JqLT5Nb2RlID09IElOREVYUVVFUllN
QVApIHsNCg0KCWNoZWNrV2ViU2NhbGUobXNPYmopOw0KDQoJaW1nID0gbXNEcmF3UXVlcnlNYXAo
bXNPYmotPk1hcCk7DQoJaWYoIWltZykgd3JpdGVFcnJvcigpOw0KDQoJcHJpbnRmKCJDb250ZW50
LXR5cGU6ICVzJWMlYyIsTVNfSU1BR0VfTUlNRV9UWVBFKG1zT2JqLT5NYXAtPm91dHB1dGZvcm1h
dCksIDEwLDEwKTsNCglzdGF0dXMgPSBtc1NhdmVJbWFnZShtc09iai0+TWFwLCBpbWcsIE5VTEwp
Ow0KCWlmKHN0YXR1cyAhPSBNU19TVUNDRVNTKSB3cml0ZUVycm9yKCk7DQoJbXNGcmVlSW1hZ2Uo
aW1nKTsNCg0KICAgICAgfSANCiAgICAgICBlbHNlIHsgLy8gcHJvY2VzcyB0aGUgcXVlcnkgdGhy
b3VnaCB0ZW1wbGF0ZXMNCiAgICAgICAgICBpZiAobXNSZXR1cm5UZW1wbGF0ZVF1ZXJ5KG1zT2Jq
LCAidGV4dC9odG1sIikgIT0gTVNfU1VDQ0VTUykgd3JpdGVFcnJvcigpOw0KICAgICAgICAgIA0K
ICAgICAgICAgIGlmKG1zT2JqLT5TYXZlUXVlcnkpIHsNCiAgICAgICAgICAgICBzcHJpbnRmKGJ1
ZmZlciwgIiVzJXMlcyVzIiwgbXNPYmotPk1hcC0+d2ViLmltYWdlcGF0aCwgbXNPYmotPk1hcC0+
bmFtZSwgbXNPYmotPklkLCBNU19RVUVSWV9FWFRFTlNJT04pOw0KICAgICAgICAgICAgIGlmKChz
dGF0dXMgPSBtc1NhdmVRdWVyeShtc09iai0+TWFwLCBidWZmZXIpKSAhPSBNU19TVUNDRVNTKSBy
ZXR1cm4gc3RhdHVzOw0KICAgICAgICAgIH0NCiAgICAgICB9DQoNCiAgICB9IGVsc2UgaWYobXNP
YmotPk1vZGUgPT0gQ09PUkRJTkFURSkgew0KICAgICAgc2V0Q29vcmRpbmF0ZSgpOyAvLyBtb3Vz
ZSBjbGljayA9PiBtYXAgY29vcmQNCiAgICAgIHJldHVybkNvb3JkaW5hdGUobXNPYmotPk1hcFBu
dCk7DQogICAgfSBlbHNlIGlmKG1zT2JqLT5Nb2RlID09IFBST0NFU1NJTkcpIHsNCiNpZmRlZiBV
U0VfRUdJUw0KICAgICAgc2V0RXh0ZW50KG1zT2JqKTsNCiAgICAgIGVyckxvZ01zZ1swXSA9ICdc
MCc7DQogICAgICBzcHJpbnRmKGVyckxvZ01zZywgIk1hcCBDb29yZGluYXRlczogeCAlZiwgeSAl
ZlxuIiwgbXNPYmotPk1hcFBudC54LCBtc09iai0+TWFwUG50LnkpOw0KICAgICAgd3JpdGVFcnJM
b2coZXJyTG9nTXNnKTsNCiAgICAgIA0KICAgICAgc3RhdHVzID0gZWdpc2wobXNPYmotPk1hcCwg
RW50cmllcywgbXNPYmotPk51bVBhcmFtcywgbXNPYmotPkNvb3JkU291cmNlKTsNCiAgICAgIC8v
IHByaW50ZigiTnVtZXJpY2FsIFdpbmRvdyAtICVmICVmXG4iLCBtc09iai0+SW1nUG50LngsIG1z
T2JqLT5JbWdQbnQueSk7DQogICAgICBmZmx1c2goc3Rkb3V0KTsNCiAgICAgIA0KICAgICAgaWYg
KHN0YXR1cyA9PSAxKSB7DQoJLy8gd3JpdGUgTUlNRSBoZWFkZXINCglwcmludGYoIkNvbnRlbnQt
dHlwZTogdGV4dC9odG1sJWMlYyIsIDEwLCAxMCk7DQoJcmV0dXJuU3RhdGlzdGljcygibnVtd2lu
Lmh0bWwiKTsNCiAgICAgIH0gZWxzZSBpZihzdGF0dXMgPT0gMikgew0KCXdyaXRlRXJyTG9nKCJD
YWxsaW5nIHJldHVyblNwbG90KClcbiIpOw0KCWZmbHVzaChmcEVyckxvZyk7DQoJDQoJLy8gd3Jp
dGUgTUlNRSBoZWFkZXINCglwcmludGYoIkNvbnRlbnQtdHlwZTogdGV4dC9odG1sJWMlYyIsIDEw
LCAxMCk7DQoJcmV0dXJuU3Bsb3QoInNwbG90Lmh0bWwiKTsNCiAgICAgIH0gZWxzZSBpZihzdGF0
dXMgPT0gMykgew0KCXdyaXRlRXJyTG9nKCJDYWxsaW5nIHJldHVybkhpc3RvKClcbiIpOw0KCWZm
bHVzaChmcEVyckxvZyk7DQoJDQoJLy8gd3JpdGUgTUlNRSBoZWFkZXINCglwcmludGYoIkNvbnRl
bnQtdHlwZTogdGV4dC9odG1sJWMlYyIsIDEwLCAxMCk7DQoJcmV0dXJuSGlzdG8oImhpc3RvLmh0
bWwiKTsNCiAgICAgIH0gZWxzZSB7DQoJd3JpdGVFcnJMb2coIkVycm9yIHN0YXR1cyBmcm9tIGVn
aXNsKClcbiIpOw0KCWZmbHVzaChmcEVyckxvZyk7DQoJDQoJZXJyTG9nTXNnWzBdID0gJ1wwJzsN
CglzcHJpbnRmKGVyckxvZ01zZywgIlNlbGVjdCBJbWFnZSBMYXllclxuIik7DQoJDQoJbXNTZXRF
cnJvcihNU19JT0VSUiwgIjxicj5lR0lTIEVycm9yOiBDaG9vc2UgU3RhY2sgSW1hZ2U8YnI+Iiwg
ZXJyTG9nTXNnKTsNCgl3cml0ZUVycm9yKCk7DQogICAgICB9DQojZWxzZQ0KICAgICAgbXNTZXRF
cnJvcihNU19NSVNDRVJSLCAiRUdJUyBTdXBwb3J0IGlzIG5vdCBhdmFpbGFibGUuIiwgIm1hcHNl
cnYoKSIpOw0KICAgICAgd3JpdGVFcnJvcigpOw0KI2VuZGlmDQogICAgfQ0KDQogICAgd3JpdGVM
b2coTVNfRkFMU0UpOw0KICAgDQogICAgLyoNCiAgICAqKiBDbGVhbi11cA0KICAgICovDQogICAg
ZnJlZShJdGVtKTsgLy8gdGhlIGZvbGxvd2luZyBhcmUgbm90IHN0b3JlZCBhcyBwYXJ0IG9mIHRo
ZSBtc09iag0KICAgIGZyZWUoVmFsdWUpOyAgICAgIA0KICAgIGZyZWUoUXVlcnlMYXllcik7DQog
ICAgZnJlZShTZWxlY3RMYXllcik7DQogICAgZnJlZShRdWVyeUZpbGUpOyAgICANCiAgIA0KICAg
IG1zRnJlZU1hcFNlcnZPYmoobXNPYmopOw0KDQogICAgZXhpdCgwKTsgLy8gZW5kIE1hcFNlcnZl
cg0KfSANCg==

------_=_NextPart_002_01C2CBCC.2AA56D66--

------_=_NextPart_001_01C2D9C1.AC928D21--



More information about the mapserver-dev mailing list