[Mapserver-users] change to mappostgis.c for psql 7.4.1

Charlton Purvis cpurvis at asg.sc.edu
Thu Jan 22 17:21:40 EST 2004


This is a multi-part message in MIME format.

------_=_NextPart_001_01C3E136.1B97F4E3
Content-Type: text/plain;
	charset="us-ascii"
Content-Transfer-Encoding: quoted-printable

Don't know if this postgis post made it to mapserver land, but I just
ran into this problem w/ our latest upgrade to pgsl 7.4.1, mapserver
4.0, and postgix 0.8.1.

If you find this in your log:
. . . as foo WHERE gid =3D 40716 -ERROR: cursor "mycursor" already =
exists
. . .

> This is a problem with the mapserver-postgis connector.
>
> There are several issues outstanding involving querying.

So . . .

> I have just added the explicit "CLOSE cursor" instruction in the code
and=20
> now It seems to work. This is the first time that I look at the
mapserver=20
> code so, my modify could be "dangerous" for other aspects that I don't

> know.

Look for the name 'Bonnin Stefano' inside the attached .c for the
modified snips.

Although this post looks similar, too.  Maybe another fix? =20
http://mapserver.gis.umn.edu/data2/wilma/mapserver-users/0401/msg00089.h
tml

Anyway, the attached .c works great.

Charlton



=20
=20
=20
Charlton Purvis
(803) 777-8858 : voice
(803) 777-3935 : fax
cpurvis at sc.edu
=20
Baruch Institute
University of South Carolina
Columbia, SC 29208


------_=_NextPart_001_01C3E136.1B97F4E3
Content-Type: application/octet-stream;
	name="mappostgis.c"
Content-Transfer-Encoding: base64
Content-Description: mappostgis.c
Content-Disposition: attachment;
	filename="mappostgis.c"

LyogJElkOiBtYXBwb3N0Z2lzLmMsdiAxLjI3LjIuMSAyMDAzLzEwLzE0IDE1OjA2OjU5IGRhbiBF
eHAgJCAqLwojaW5jbHVkZSAibWFwLmgiCgojaWZuZGVmIEZMVF9NQVgKI2RlZmluZSBGTFRfTUFY
IDI1MDAwMDAwLjAKI2VuZGlmCgojaWZkZWYgVVNFX1BPU1RHSVMKCiNpZm5kZWYgTElUVExFX0VO
RElBTgojZGVmaW5lIExJVFRMRV9FTkRJQU4gMQojZW5kaWYKI2lmbmRlZiBCSUdfRU5ESUFOCiNk
ZWZpbmUgQklHX0VORElBTiAyCiNlbmRpZgoKI2luY2x1ZGUgImxpYnBxLWZlLmgiCiNpbmNsdWRl
IDxzdHJpbmcuaD4KCgp0eXBlZGVmIHN0cnVjdCBtc19QT1NUR0lTX2xheWVyX2luZm9fdAp7Cglj
aGFyCQkqc3FsOwkJLy9zcWwgcXVlcnkgdG8gc2VuZCB0byBEQgoJUEdjb25uICAgICAqY29ubjsg
CS8vY29ubmVjdGlvbiB0byBkYgoJbG9uZwkgCXJvd19udW07ICAJLy93aGF0IHJvdyBpcyB0aGUg
TkVYVCB0byBiZSByZWFkIChmb3IgcmFuZG9tIGFjY2VzcykKIAlQR3Jlc3VsdCAgICpxdWVyeV9y
ZXN1bHQ7Ly9mb3IgZmV0Y2hpbmcgcm93cyBmcm9tIHRoZSBkYgoJY2hhcgkJKnVyaWRfbmFtZTsg
Ly8gbmFtZSBvZiB1c2VyLXNwZWNpZmllZCB1bmlxdWUgaWRlbnRpZmllciBvciBPSUQKCWNoYXIJ
CSp1c2VyX3NyaWQ7IC8vemVybyBsZW5ndGggPSBjYWxjdWxhdGUsIG5vbi16ZXJvIG1lYW5zIHVz
aW5nIHRoaXMgdmFsdWUhCgp9IG1zUE9TVEdJU0xheWVySW5mbzsKCiNpZiAhZGVmaW5lZChfV0lO
MzIpCmNoYXIgdG9sb3dlcihjaGFyIGMpCnsKCWlmICgoYyA8J0EnKSB8fCAoYz4nWicpKQoJCXJl
dHVybiBjOwoJcmV0dXJuIGMtJ0EnKydhJzsKCn0KI2VuZGlmCgoKCm1zUE9TVEdJU0xheWVySW5m
byAqZ2V0UG9zdEdJU0xheWVySW5mbyhsYXllck9iaiAqbGF5ZXIpCnsKCXJldHVybiBsYXllci0+
bGF5ZXJpbmZvOwkKfQoKdm9pZCBzZXRQb3N0R0lTTGF5ZXJJbmZvKGxheWVyT2JqICpsYXllcixt
c1BPU1RHSVNMYXllckluZm8gKnBvc3RnaXNsYXllcmluZm8gKQp7CgkgbGF5ZXItPmxheWVyaW5m
byA9ICh2b2lkKilwb3N0Z2lzbGF5ZXJpbmZvOwp9CgoKLy9yZW1vdmUgd2hpdGUgc3BhY2UKLy9k
b250IHNlbmQgaW4gZW1wdHkgc3RyaW5ncyBvciBzdHJpbmdzIHdpdGgganVzdCAiICIgaW4gdGhl
bSEKY2hhciogcmVtb3ZlV2hpdGUoY2hhciAqc3RyKQp7CglpbnQgaW5pdGlhbDsKCWNoYXIgKm9y
aWcsKmxvYzsKCglpbml0aWFsID0gc3Ryc3BuKHN0ciwgIiAiKTsKCWlmIChpbml0aWFsICE9IDAp
Cgl7CgkJbWVtbW92ZShzdHIsIHN0cisgaW5pdGlhbCwgc3RybGVuKHN0cikgLSBpbml0aWFsKzEp
OwoJfQoJLy9ub3cgZmluYWwKCWlmIChzdHJsZW4oc3RyKSA9PSAwKQoJCXJldHVybiBzdHI7Cglp
ZiAoc3RyWyBzdHJsZW4oc3RyKS0xXSA9PSAnICcpCgl7CgkJLy9oYXZlIHRvIHJlbW92ZSBmcm9t
IGVuZAoJCW9yaWcgPSBzdHI7CgkJbG9jID0gJnN0clsgc3RybGVuKHN0ciktMV07CgkJd2hpbGUg
KCggKmxvYyA9ICcgJykgJiYgKGxvYyA+b3JpZykgKQoJCXsKCQkJKmxvYyA9IDA7CgkJCWxvYy0t
OwoJCX0KCX0KCXJldHVybiBzdHI7Cn0KCgpjaGFyICpzdHJzdHJJZ25vcmVDYXNlKGNoYXIgKmhh
eXN0YWNrLCBjaGFyICpuZWVkbGUpCnsKCWNoYXIgKmhheV9sb3dlcjsKCWNoYXIgKm5lZWRsZV9s
b3dlcjsKCWludCBsZW5faGF5LGxlbl9uZWVkOwoJaW50IHQ7CgljaGFyICpsb2M7CgoJbGVuX2hh
eSA9IHN0cmxlbihoYXlzdGFjayk7CglsZW5fbmVlZD0gc3RybGVuKG5lZWRsZSk7CgoJaGF5X2xv
d2VyID0gKGNoYXIgKikgbWFsbG9jIChsZW5faGF5ICsxKTsKCW5lZWRsZV9sb3dlcj0oY2hhciop
IG1hbGxvYyAobGVuX25lZWQrMSk7CgoKCWZvcih0PTA7dDxsZW5faGF5O3QrKykKCXsKCQloYXlf
bG93ZXJbdF0gPSB0b2xvd2VyKGhheXN0YWNrW3RdKTsKCX0KCWhheV9sb3dlclt0XSA9IDA7CgoJ
Zm9yKHQ9MDt0PGxlbl9uZWVkO3QrKykKCXsKCQkJbmVlZGxlX2xvd2VyW3RdID0gdG9sb3dlcihu
ZWVkbGVbdF0pOwoJfQoJbmVlZGxlX2xvd2VyW3RdID0wOwoKCWxvYyA9IHN0cnN0cihoYXlfbG93
ZXIsbmVlZGxlX2xvd2VyKTsKCWZyZWUoaGF5X2xvd2VyKTsKCWZyZWUobmVlZGxlX2xvd2VyKTsK
CglpZiAobG9jID09IE5VTEwpCgl7CgkJcmV0dXJuIE5VTEw7Cgl9CglyZXR1cm4gaGF5c3RhY2sg
KyAobG9jLWhheV9sb3dlcik7Cn0KCgp2b2lkIHBvc3RyZXNxbF9OT1RJQ0VfSEFORExFUih2b2lk
ICphcmcsIGNvbnN0IGNoYXIgKm1lc3NhZ2UpCnsKICAgIGxheWVyT2JqICpscDsKICAgIGxwID0g
KGxheWVyT2JqKilhcmc7CgogICAgaWYgKGxwLT5kZWJ1ZykKICAgICAgICBtc0RlYnVnKCIlcyIs
IG1lc3NhZ2UpOwp9CgoKY2hhciAqREFUQUVSUk9STUVTU0FHRShjaGFyICpkU3RyaW5nLCBjaGFy
ICpwcmVhbWJsZSkKewoJY2hhcgkqbTsKCWNoYXIJdG1wWzcwMDBdOwoKCW0gPSAoY2hhciopIG1h
bGxvYygxMDAwMCk7CgoKCglzcHJpbnRmKG0sIiVzIixwcmVhbWJsZSk7CgoJCXNwcmludGYodG1w
LCJFcnJvciB3aXRoIFBPU1RHSVMgZGF0YSB2YXJpYWJsZS4gWW91IHNwZWNpZmllZCAnJXMnLjxi
cj5cbiIsIGRTdHJpbmcpOwoJCXN0cmNhdChtLHRtcCk7CgoJCXNwcmludGYodG1wLCJTdGFuZGFy
ZCB3YXlzIG9mIHNwZWNpZml5aW5nIGFyZSA6IDxicj5cbigxKSAnZ2VvbWV0cnlfY29sdW1uIGZy
b20gZ2VvbWV0cnlfdGFibGUnIDxicj5cbigyKSAnZ2VvbWV0cnlfY29sdW1uIGZyb20gKCZsdDtz
dWIgcXVlcnkmZ3Q7KSBhcyBmb28gdXNpbmcgdW5pcXVlICZsdDtjb2x1bW4gbmFtZSZndDsgdXNp
bmcgU1JJRD0mbHQ7c3JpZCMmZ3Q7JyA8YnI+PGJyPlxuXG4iKTsKCQlzdHJjYXQobSx0bXApOwoK
CQlzcHJpbnRmKHRtcCwiTWFrZSBzdXJlIHlvdSBwdXQgaW4gdGhlICd1c2luZyB1bmlxdWUgICZs
dDtjb2x1bW4gbmFtZSZndDsnIGFuZCAndXNpbmcgU1JJRD0jJyBjbGF1c2VzIGluLlxuXG48YnI+
PGJyPiIpOwoJCXN0cmNhdChtLHRtcCk7CgoJCXNwcmludGYodG1wLCJGb3IgbW9yZSBoZWxwLCBw
bGVhc2Ugc2VlIGh0dHA6Ly9wb3N0Z2lzLnJlZnJhY3Rpb25zLm5ldC9kb2N1bWVudGF0aW9uLnBo
cCBcblxuPGJyPjxicj4iKTsKCQlzdHJjYXQobSx0bXApOwoKCgkJc3ByaW50Zih0bXAsIk1hcHBv
c3RnaXMuYyAtIHZlcnNpb24gb2YgSnVuZSAxMi8yMDAzLlxuIik7CgkJc3RyY2F0KG0sdG1wKTsK
Ci8vcHJpbnRmKCIlcyIsbSk7Ci8vcHJpbnRmKCJzaXplID0gJWlcbiIsc3RybGVuKG0pKTsKCgly
ZXR1cm4gbTsKCgp9CgoKCgppbnQgbXNQT1NUR0lTTGF5ZXJQYXJzZURhdGEoY2hhciAqZGF0YSwg
Y2hhciAqZ2VvbV9jb2x1bW5fbmFtZSwKCQkJCQljaGFyICp0YWJsZV9uYW1lLCBjaGFyICp1cmlk
X25hbWUsY2hhciAqdXNlcl9zcmlkKTsKCgoKc3RhdGljIGludCBnQllURV9PUkRFUiA9IDA7Cgov
L29wZW4gdXAgYSBjb25uZWN0aW9uIHRvIHRoZSBwb3N0Z3Jlc3FsIGRhdGFiYXNlIHVzaW5nIHRo
ZSBjb25uZWN0aW9uIHN0cmluZyBpbiBsYXllci0+Y29ubmVjdGlvbgovLyBpZS4gImhvc3Q9MTky
LjE2OC41MC4zIHVzZXI9cG9zdGdyZXMgcG9ydD01NTU1IGRibmFtZT1tYXBzZXJ2IgppbnQgbXNQ
T1NUR0lTTGF5ZXJPcGVuKGxheWVyT2JqICpsYXllcikKewoJbXNQT1NUR0lTTGF5ZXJJbmZvCSps
YXllcmluZm87CiAgICAgICAgaW50CQkJb3JkZXJfdGVzdCA9IDE7CgovL2ZwcmludGYoc3RkZXJy
LCJtc1BPU1RHSVNMYXllck9wZW4gY2FsbGVkXG4iKTsKCWlmIChnZXRQb3N0R0lTTGF5ZXJJbmZv
KGxheWVyKSkKCQlyZXR1cm4gTVNfU1VDQ0VTUzsJLy9hbHJlYWR5IG9wZW4KCiAgICAgICAgaWYo
IGxheWVyLT5kYXRhID09IE5VTEwgKQogICAgICAgIHsKCgogICAgICAgICAgICBtc1NldEVycm9y
KE1TX1FVRVJZRVJSLAoJCQkJCURBVEFFUlJPUk1FU1NBR0UoIiIsIkVycm9yIHBhcnNpbmcgUE9T
VEdJUyBkYXRhIHZhcmlhYmxlOiBub3RoaW5nIHNwZWNpZmllZCBpbiBEQVRBIHN0YXRlbWVudC48
YnI+PGJyPlxuXG5Nb3JlIEhlbHA6PGJyPjxicj5cblxuIiksCgkJCQkJIm1zUE9TVEdJU0xheWVy
T3BlbigpIik7CgogICAgICAgICAgICByZXR1cm4oTVNfRkFJTFVSRSk7CiAgICAgICAgfQoKCS8v
aGF2ZSB0byBzZXR1cCBhIGNvbm5lY3Rpb24gdG8gdGhlIGRhdGFiYXNlCgoJbGF5ZXJpbmZvID0g
KG1zUE9TVEdJU0xheWVySW5mbyAqKSBtYWxsb2MoIHNpemVvZihtc1BPU1RHSVNMYXllckluZm8p
ICk7CglsYXllcmluZm8tPnNxbCA9IE5VTEw7IC8vY2FsYyBsYXRlcgoJbGF5ZXJpbmZvLT5yb3df
bnVtPTA7CglsYXllcmluZm8tPnF1ZXJ5X3Jlc3VsdD0gTlVMTDsKCWxheWVyaW5mby0+dXJpZF9u
YW1lPSBOVUxMOyAKCWxheWVyaW5mby0+dXNlcl9zcmlkPSBOVUxMOwoKCWxheWVyaW5mby0+Y29u
biA9IFBRY29ubmVjdGRiKCBsYXllci0+Y29ubmVjdGlvbiApOwoKICAgIGlmIChQUXN0YXR1cyhs
YXllcmluZm8tPmNvbm4pID09IENPTk5FQ1RJT05fQkFEKQogICAgewogICAgICAgIG1zU2V0RXJy
b3IoTVNfUVVFUllFUlIsICJjb3VsZG50IG1ha2UgY29ubmVjdGlvbiB0byBEQiB3aXRoIGNvbm5l
Y3Qgc3RyaW5nICclcycuXG48YnI+XG5FcnJvciByZXBvcnRlZCB3YXMgJyVzJy5cbjxicj5cblxu
VGhpcyBlcnJvciBvY2N1cmVkIHdoZW4gdHJ5aW5nIHRvIG1ha2UgYSBjb25uZWN0aW9uIHRvIHRo
ZSBzcGVjaWZpZWQgcG9zdGdyZXNxbCBzZXJ2ZXIuICBcbjxicj5cbk1vc3QgY29tbW9ubHkgdGhp
cyBpcyBjYXVzZWQgYnkgPGJyPlxuKDEpIGluY29ycmVjdCBjb25uZWN0aW9uIHN0cmluZyA8YnI+
XG4oMikgeW91IGRpZG50IHNwZWNpZnkgYSAndXNlcj0uLi4nIGluIHlvdXIgY29ubmVjdGlvbiBz
dHJpbmcgPGJyPlxuKDMpIHRoZSBwb3N0bWFzdGVyIChwb3N0Z3Jlc3FsIHNlcnZlcikgaXNudCBy
dW5uaW5nIDxicj5cbig0KSB5b3UgYXJlIG5vdCBhbGxvd2luZyBUQ1AvSVAgY29ubmVjdGlvbiB0
byB0aGUgcG9zdG1hc3RlciA8YnI+XG4oNSkgeW91ciBwb3N0bWFzdGVyIGlzIG5vdCBydW5uaW5n
IG9uIHRoZSBjb3JyZWN0IHBvcnQgLSBpZiBpdHMgbm90IG9uIDU0MzIgeW91IG11c3Qgc3BlY2lm
eSBhICdwb3J0PS4uLicgPGJyPlxuICg2KSB0aGUgc2VjdXJpdHkgb24geW91ciBzeXN0ZW0gZG9l
cyBub3QgYWxsb3cgdGhlIHdlYnNlcnZlciAodXN1YWxseSB1c2VyICdub2JvZHknKSB0byBtYWtl
IHNvY2tldCBjb25uZWN0aW9ucyB0byB0aGUgcG9zdG1hc3RlciA8YnI+XG4oNykgeW91IGZvcmdv
dCB0byBzcGVjaWZ5IGEgJ2hvc3Q9Li4uJyBpZiB0aGUgcG9zdG1hc3RlciBpcyBvbiBhIGRpZmZl
cmVudCBtYWNoaW5lPGJyPlxuKDgpIHlvdSBtYWRlIGEgdHlwbyA8YnI+XG4gICIsCiAgICAgICAg
ICAgICAgICAgIm1zUE9TVEdJU0xheWVyT3BlbigpIiwgbGF5ZXItPmNvbm5lY3Rpb24sUFFlcnJv
ck1lc3NhZ2UobGF5ZXJpbmZvLT5jb25uKSApOwoKCSAgZnJlZShsYXllcmluZm8pOwoJICByZXR1
cm4oTVNfRkFJTFVSRSk7CiAgICB9CgoJUFFzZXROb3RpY2VQcm9jZXNzb3IobGF5ZXJpbmZvLT5j
b25uLCBwb3N0cmVzcWxfTk9USUNFX0hBTkRMRVIgLCh2b2lkICopIGxheWVyKTsKCgoKCXNldFBv
c3RHSVNMYXllckluZm8obGF5ZXIsICAgbGF5ZXJpbmZvKTsKCiAgICAgICAgaWYoICgoY2hhciAq
KSAmb3JkZXJfdGVzdClbMF0gPT0gMSApCiAgICAgICAgICAgIGdCWVRFX09SREVSID0gTElUVExF
X0VORElBTjsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGdCWVRFX09SREVSID0gQklHX0VORElB
TjsKCglyZXR1cm4gTVNfU1VDQ0VTUzsKfQoKCi8vIEZyZWUgdGhlIGl0ZW1pbmRleGVzIGFycmF5
IGluIGEgbGF5ZXIuCnZvaWQgICAgbXNQT1NUR0lTTGF5ZXJGcmVlSXRlbUluZm8obGF5ZXJPYmog
KmxheWVyKQp7Ci8vZnByaW50ZihzdGRlcnIsIm1zUE9TVEdJU0xheWVyRnJlZUl0ZW1JbmZvIGNh
bGxlZFxuIik7CgogCWlmIChsYXllci0+aXRlbWluZm8pCiAgICAgIAlmcmVlKGxheWVyLT5pdGVt
aW5mbyk7CiAgCWxheWVyLT5pdGVtaW5mbyA9IE5VTEw7Cn0KCgovL2FsbG9jYXRlIHRoZSBpdGVt
aW5mbyBpbmRleCBhcnJheSAtIHNhbWUgb3JkZXIgYXMgdGhlIGl0ZW0gbGlzdAppbnQgbXNQT1NU
R0lTTGF5ZXJJbml0SXRlbUluZm8obGF5ZXJPYmogKmxheWVyKQp7CglpbnQgICBpOwoJaW50ICpp
dGVtaW5kZXhlcyA7CgovL2ZwcmludGYoc3RkZXJyLCJtc1BPU1RHSVNMYXllckluaXRJdGVtSW5m
byBjYWxsZWRcbiIpOwoKCgoJaWYgKGxheWVyLT5udW1pdGVtcyA9PSAwKQogICAgICAJcmV0dXJu
IE1TX1NVQ0NFU1M7CgoJaWYgKGxheWVyLT5pdGVtaW5mbykKICAgICAJIAlmcmVlKGxheWVyLT5p
dGVtaW5mbyk7CgogCWlmKChsYXllci0+aXRlbWluZm8gPSAoaW50ICopbWFsbG9jKHNpemVvZihp
bnQpKmxheWVyLT5udW1pdGVtcykpPT0gTlVMTCkKICAJewogICAJCW1zU2V0RXJyb3IoTVNfTUVN
RVJSLCBOVUxMLCAibXNQT1NUR0lTTGF5ZXJJbml0SXRlbUluZm8oKSIpOwogICAJIAlyZXR1cm4o
TVNfRkFJTFVSRSk7CiAgCX0KCglpdGVtaW5kZXhlcyA9IChpbnQqKWxheWVyLT5pdGVtaW5mbzsK
ICAJZm9yKGk9MDtpPGxheWVyLT5udW1pdGVtcztpKyspCiAJewoJCWl0ZW1pbmRleGVzW2ldID0g
aTsgLy9sYXN0IG9uZSBpcyBhbHdheXMgdGhlIGdlb21ldHJ5IG9uZSAtIHRoZSByZXN0IGFyZSBu
b24tZ2VvbQoJfQoKIAlyZXR1cm4oTVNfU1VDQ0VTUyk7Cn0KCgovL1NpbmNlIHdlIG5vdyBoYXZl
IFBvc3RHSVNUIDAuNSwgYW5kIDAuNiAgY2FsbGluZyBjb252ZW50aW9ucywKLy8gd2UgaGF2ZSB0
byBhdHRlbXB0IHRvIGhhbmRsZSB0aGUgZGF0YWJhc2UgaW4gc2V2ZXJhbCB3YXlzLiAgSWYgd2Ug
ZG8gdGhlIHdyb25nCi8vIHRoaW5nLCB0aGVuIGl0J2xsIHRocm93IGFuIGVycm9yIGFuZCB3ZSBj
YW4gcm9sbGJhY2sgYW5kIHRyeSBhZ2Fpbi4KLy8KLy8gMi4gYXR0ZW1wdCB0byBkbyAwLjYgY2Fs
bGluZyBjb252ZW50aW9uIChzcGF0aWFsIHJlZiBzeXN0ZW0gbmVlZGVkKQovLyAzLiBhdHRlbXB0
IHRvIGRvIDAuNSBjYWxsaW5nIGNvbnZlbnRpb24gKG5vIHNwYXRpYWwgcmVmIHN5c3RlbSkKCi8v
IFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gMC41IGFuZCAwLjYgaXMgdGhhdCB0aGUgYm91bmRpbmcg
Ym94IG11c3QgYmUKLy8gZGVjbGFyZWQgdG8gYmUgaW4gdGhlIHNhbWUgdGhlIHNhbWUgc3BhdGlh
bCByZWZlcmVuY2Ugc3lzdGVtIGFzIHRoZQovLyBnZW9tZXRyeSBjb2x1bW4uICBGb3IgMC42LCB3
ZSBkZXRlcm1pbmUgdGhlIFNSSUQgb2YgdGhlIGNvbHVtbiBhbmQgdGhlbgovLyB0YWcgdGhlIGJv
dW5kaW5nIGJveCBhcyB0aGUgc2FtZSBTUklELgoKaW50IHByZXBfREIoY2hhcgkqZ2VvbV90YWJs
ZSxjaGFyICAqZ2VvbV9jb2x1bW4sbGF5ZXJPYmogKmxheWVyLCBQR3Jlc3VsdCAqKnNxbF9yZXN1
bHRzLHJlY3RPYmogcmVjdCxjaGFyICpxdWVyeV9zdHJpbmcsIGNoYXIgKnVyaWRfbmFtZSwgY2hh
ciAqdXNlcl9zcmlkKQp7CglQR3Jlc3VsdAkqcmVzdWx0OwoJY2hhcgljb2x1bW5zX3dhbnRlZFs1
MDAwXTsKCWNoYXIJdGVtcFs1MDAwXTsKCWNoYXIJdG1wWzUwMDBdOwoJY2hhcgl0bXAyWzUwMDBd
OwoJY2hhcglxdWVyeV9zdHJpbmdfMF82WzYwMDBdOwoJaW50CXQ7CgljaGFyCWJveDNkWzIwMF07
Cgltc1BPU1RHSVNMYXllckluZm8gKmxheWVyaW5mbzsKCWNoYXIgKnBvc19mcm9tLCAqcG9zX2Z0
YWIsICpwb3Nfc3BhY2UsICpwb3NfcGFyZW47CgljaGFyIGZfdGFibGVfbmFtZVs1MDAwXTsKCgls
YXllcmluZm8gPSAgZ2V0UG9zdEdJU0xheWVySW5mbyhsYXllcik7CgoJLyogU2V0IHRoZSB1cmlk
IG5hbWUgKi8KCWxheWVyaW5mby0+dXJpZF9uYW1lID0gdXJpZF9uYW1lOwoKCS8qIEV4dHJhY3Qg
dGhlIHByb3BlciBmX3RhYmxlX25hbWUgZnJvbSB0aGUgZ2VvbV90YWJsZSBzdHJpbmcuCgkgKiBX
ZSBhcmUgZXhwZWN0aW5nIHRoZSBnZW9tX3RhYmxlIHRvIGJlIGVpdGhlciBhIHNpbmdsZSB3b3Jk
CgkgKiBvciBhIHN1Yi1zZWxlY3QgY2xhdXNlIHRoYXQgcG9zc2libHkgaW5jbHVkZXMgYSBqb2lu
IC0tCgkgKgoJICogKHNlbGVjdCBjb2x1bW5bLGNvbHVtblssLi4uXV0gZnJvbSBmdGFiWyBuYXR1
cmFsIGpvaW4gdGFibGUyXSkgYXMgZm9vCgkgKgoJICogV2UgYXJlIGV4cGVjdGluZyB3aGl0ZXNw
YWNlIG9yIGEgJyknIGFmdGVyIHRoZSBmdGFiIG5hbWUuCgkgKgoJICovCgoJcG9zX2Zyb20gPSBz
dHJzdHIoZ2VvbV90YWJsZSwgIiBmcm9tICIpOwoJaWYgKHBvc19mcm9tID09TlVMTCkKCQlwb3Nf
ZnJvbSA9IHN0cnN0cihnZW9tX3RhYmxlLCAiIEZST00gIik7IC8vdHJ5IHVwcGVyY2FzZQoKCWlm
IChwb3NfZnJvbSA9PSBOVUxMKSB7CgkJc3RyY3B5KGZfdGFibGVfbmFtZSwgZ2VvbV90YWJsZSk7
Cgl9CgllbHNlIHsgLy8gZ2VvbV90YWJsZSBpcyBhIHN1Yi1zZWxlY3QgY2xhdXNlCgkJcG9zX2Z0
YWIgPSBwb3NfZnJvbSArIDY7IC8vIFRoaXMgc2hvdWxkIGJlIHRoZSBzdGFydCBvZiB0aGUgZnRh
YiBuYW1lCgkJcG9zX3NwYWNlID0gc3Ryc3RyKHBvc19mdGFiLCAiICIpOyAvLyBGaXJzdCBzcGFj
ZQoJCS8vcG9zX3BhcmVuID0gc3Ryc3RyKHBvc19mdGFiLCAiKSIpOyAvLyBDbG9zaW5nIHBhcmVu
IG9mIGNsYXVzZQoKCgkJI2lmIGRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChfX0NZR1dJTl9f
KQogICAgICAgICAgICAgICAgcG9zX3BhcmVuID0gc3RycmNocihwb3NfZnRhYiwnKScpOwoJCSNl
bHNlCgkJCQlwb3NfcGFyZW4gPSByaW5kZXgocG9zX2Z0YWIsJyknKTsKCQkjZW5kaWYgCgoKCQlp
ZiAoICAocG9zX3NwYWNlID09TlVMTCkgIHx8IChwb3NfcGFyZW4gPT1OVUxMKSApIHsKCgkJCSAg
ICAgICAgICAgIG1zU2V0RXJyb3IoTVNfUVVFUllFUlIsCgkJCQkJCQkJREFUQUVSUk9STUVTU0FH
RShnZW9tX3RhYmxlLCJFcnJvciBwYXJzaW5nIFBPU1RHSVMgZGF0YSB2YXJpYWJsZTogU29tZXRo
aW5nIGlzIHdyb25nIHdpdGggeW91ciBzdWJzZWxlY3Qgc3RhdGVtZW50Ljxicj48YnI+XG5cbk1v
cmUgSGVscDo8YnI+PGJyPlxuXG4iKSwKCQkJCQkicHJlcF9EQigpIik7CgoJCQlyZXR1cm4oTVNf
RkFJTFVSRSk7CgkJfQoJCWlmIChwb3NfcGFyZW4gPCBwb3Nfc3BhY2UpIHsgLy8gY2xvc2luZyBw
YXJlbnRoZXNpcyBwcmVjZWVkcyBhbnkgc3BhY2UKCQkJc3RybmNweShmX3RhYmxlX25hbWUsIHBv
c19mdGFiLCBwb3NfcGFyZW4gLSBwb3NfZnRhYik7CgkJCWZfdGFibGVfbmFtZVtwb3NfcGFyZW4g
LSBwb3NfZnRhYl0gPSAnXDAnOwoJCX0KCQllbHNlIHsKCQkJc3RybmNweShmX3RhYmxlX25hbWUs
IHBvc19mdGFiLCBwb3Nfc3BhY2UgLSBwb3NfZnRhYik7CgkJCWZfdGFibGVfbmFtZVtwb3Nfc3Bh
Y2UgLSBwb3NfZnRhYl0gPSAnXDAnOwoJCX0KCX0KCglpZiAobGF5ZXItPm51bWl0ZW1zID09MCkK
CXsKCQlpZiAoZ0JZVEVfT1JERVIgPT0gTElUVExFX0VORElBTikKCQkJc3ByaW50Zihjb2x1bW5z
X3dhbnRlZCwiYXNiaW5hcnkoZm9yY2VfY29sbGVjdGlvbihmb3JjZV8yZCglcykpLCdORFInKSwl
czo6dGV4dCIsIGdlb21fY29sdW1uLCB1cmlkX25hbWUpOwoJCWVsc2UKCQkJc3ByaW50Zihjb2x1
bW5zX3dhbnRlZCwiYXNiaW5hcnkoZm9yY2VfY29sbGVjdGlvbihmb3JjZV8yZCglcykpLCdYRFIn
KSwlczo6dGV4dCIsIGdlb21fY29sdW1uLCB1cmlkX25hbWUpOwoJfQoJZWxzZQoJewoJCWNvbHVt
bnNfd2FudGVkWzBdID0gMDsgLy9sZW49MAoJCWZvciAodD0wO3Q8bGF5ZXItPm51bWl0ZW1zOyB0
KyspCgkJewoJCQlzcHJpbnRmKHRlbXAsIiVzOjp0ZXh0LCIsbGF5ZXItPml0ZW1zW3RdKTsKCQkJ
c3RyY2F0KGNvbHVtbnNfd2FudGVkLHRlbXApOwoJCX0KCQlpZiAoZ0JZVEVfT1JERVIgPT0gTElU
VExFX0VORElBTikKCQkJc3ByaW50Zih0ZW1wLCJhc2JpbmFyeShmb3JjZV9jb2xsZWN0aW9uKGZv
cmNlXzJkKCVzKSksJ05EUicpLCVzOjp0ZXh0IiwgZ2VvbV9jb2x1bW4sIHVyaWRfbmFtZSk7CgkJ
ZWxzZQoJCQlzcHJpbnRmKHRlbXAsImFzYmluYXJ5KGZvcmNlX2NvbGxlY3Rpb24oZm9yY2VfMmQo
JXMpKSwnWERSJyksJXM6OnRleHQiLCBnZW9tX2NvbHVtbiwgdXJpZF9uYW1lKTsKCgkJc3RyY2F0
KGNvbHVtbnNfd2FudGVkLHRlbXApOwoJfQoKCXNwcmludGYoYm94M2QsIidCT1gzRCglLjE1ZyAl
LjE1ZywlLjE1ZyAlLjE1ZyknOjpCT1gzRCIscmVjdC5taW54LCByZWN0Lm1pbnksIHJlY3QubWF4
eCwgcmVjdC5tYXh5KTsKCgoJLy8gc3Vic3RpdHV0ZSB0b2tlbiAnIUJPWCEnIGluIGdlb21fdGFi
bGUgd2l0aCB0aGUgYm94M2QgLSBkbyBhdCBtb3N0IDEgc3Vic3RpdHV0aW9uCgoJCWlmIChzdHJz
dHIoZ2VvbV90YWJsZSwiIUJPWCEiKSkKCQl7CgkJCQkvLyBuZWVkIHRvIGRvIGEgc3Vic3RpdGlv
bgoJCQkJY2hhcgkqc3RhcnQsICplbmQ7CgkJCQljaGFyCSpyZXN1bHQ7CgoJCQkJcmVzdWx0ID0g
bWFsbG9jKDcwMDApOwoKCQkJCXN0YXJ0ID0gc3Ryc3RyKGdlb21fdGFibGUsIiFCT1ghIik7CgkJ
CQllbmQgPSBzdGFydCs1OwoKCQkJCXN0YXJ0WzBdID0wOwoJCQkJcmVzdWx0WzBdPTA7CgkJCQlz
dHJjYXQocmVzdWx0LGdlb21fdGFibGUpOwoJCQkJc3RyY2F0KHJlc3VsdCxib3gzZCk7CgkJCQlz
dHJjYXQocmVzdWx0LGVuZCk7CgkJCQlnZW9tX3RhYmxlPSByZXN1bHQ7CgkJfQoKCglpZiAobGF5
ZXItPmZpbHRlci5zdHJpbmcgPT0gTlVMTCkKCXsKCQlpZiAoc3RybGVuKHVzZXJfc3JpZCkgPT0g
MCkKCQl7CgkJCXNwcmludGYocXVlcnlfc3RyaW5nXzBfNiwiREVDTEFSRSBteWN1cnNvciBCSU5B
UlkgQ1VSU09SIEZPUiBTRUxFQ1QgJXMgZnJvbSAlcyBXSEVSRSAlcyAmJiBzZXRTUklEKCVzLCBm
aW5kX3NyaWQoJycsJyVzJywnJXMnKSApIiwKCQkJCQkJY29sdW1uc193YW50ZWQsZ2VvbV90YWJs
ZSxnZW9tX2NvbHVtbixib3gzZCxyZW1vdmVXaGl0ZShmX3RhYmxlX25hbWUpLHJlbW92ZVdoaXRl
KGdlb21fY29sdW1uKSk7CgkJfQoJCWVsc2UJLy91c2UgdGhlIHVzZXIgc3BlY2lmaWVkIHZlcnNp
b24KCQl7CgkJCXNwcmludGYocXVlcnlfc3RyaW5nXzBfNiwiREVDTEFSRSBteWN1cnNvciBCSU5B
UlkgQ1VSU09SIEZPUiBTRUxFQ1QgJXMgZnJvbSAlcyBXSEVSRSAlcyAmJiBzZXRTUklEKCVzLCAl
cyApIiwKCQkJCQkJY29sdW1uc193YW50ZWQsZ2VvbV90YWJsZSxnZW9tX2NvbHVtbixib3gzZCx1
c2VyX3NyaWQpOwoJCX0KCX0KCWVsc2UKCXsKCQlpZiAoc3RybGVuKHVzZXJfc3JpZCkgPT0gMCkK
CQl7CgkJCXNwcmludGYocXVlcnlfc3RyaW5nXzBfNiwiREVDTEFSRSBteWN1cnNvciBCSU5BUlkg
Q1VSU09SIEZPUiBTRUxFQ1QgJXMgZnJvbSAlcyBXSEVSRSAoJXMpIGFuZCAoJXMgJiYgc2V0U1JJ
RCggJXMsZmluZF9zcmlkKCcnLCclcycsJyVzJykgKSkiLAoJCQkJCQljb2x1bW5zX3dhbnRlZCxn
ZW9tX3RhYmxlLGxheWVyLT5maWx0ZXIuc3RyaW5nLGdlb21fY29sdW1uLGJveDNkLHJlbW92ZVdo
aXRlKGZfdGFibGVfbmFtZSkscmVtb3ZlV2hpdGUoZ2VvbV9jb2x1bW4pKTsKCQl9CgkJZWxzZQoJ
CXsKCQkJc3ByaW50ZihxdWVyeV9zdHJpbmdfMF82LCJERUNMQVJFIG15Y3Vyc29yIEJJTkFSWSBD
VVJTT1IgRk9SIFNFTEVDVCAlcyBmcm9tICVzIFdIRVJFICglcykgYW5kICglcyAmJiBzZXRTUklE
KCAlcywlcykgKSIsCgkJCQkJCWNvbHVtbnNfd2FudGVkLGdlb21fdGFibGUsbGF5ZXItPmZpbHRl
ci5zdHJpbmcsZ2VvbV9jb2x1bW4sYm94M2QsdXNlcl9zcmlkKTsKCgkJfQoJfQoKCgoJLy9zdGFy
dCB0cmFuc2FjdGlvbiByZXF1aXJlZCBieSBjdXJzb3IKCiAgICByZXN1bHQgPSBQUWV4ZWMobGF5
ZXJpbmZvLT5jb25uLCAiQkVHSU4iKTsKICAgIGlmICghKHJlc3VsdCkgfHwgUFFyZXN1bHRTdGF0
dXMocmVzdWx0KSAhPSBQR1JFU19DT01NQU5EX09LKQogICAgewoJICAgICAgbXNTZXRFcnJvcihN
U19RVUVSWUVSUiwgIkVycm9yIGV4ZWN1dGluZyBQT1NUR0lTICBCRUdJTiAgIHN0YXRlbWVudC4i
LAogICAgICAgICAgICAgICAgICJtc1BPU1RHSVNMYXllcldoaWNoU2hhcGVzKCkiKTsKCiAgICAg
ICAgCVBRY2xlYXIocmVzdWx0KTsKCSAgCWxheWVyaW5mby0+cXVlcnlfcmVzdWx0ID0gTlVMTDsK
CQlyZXR1cm4oTVNfRkFJTFVSRSk7CQkvLyB0b3RhbGx5IHNjcmV3ZWQKICAgIH0KCgogICAgUFFj
bGVhcihyZXN1bHQpOwoKCS8vc2V0IGVuYWJsZV9zZXFzY2FuPW9mZiBub3QgcmVxdWlyZWQgKGFs
cmVhZHkgZG9uZSkKCi8vZnByaW50ZiAoc3RkZXJyLCJxdWVyeV9zdHJpbmdfMF82OiVzXG4iLHF1
ZXJ5X3N0cmluZ18wXzYpOwogICAgcmVzdWx0ID0gUFFleGVjKGxheWVyaW5mby0+Y29ubiwgcXVl
cnlfc3RyaW5nXzBfNiApOwoKICAgIGlmICggKHJlc3VsdCE9TlVMTCkgJiYgKFBRcmVzdWx0U3Rh
dHVzKHJlc3VsdCkgPT0gUEdSRVNfQ09NTUFORF9PSykgKQogICAgewoJICAgCS8vUFFjbGVhcihy
ZXN1bHQpOwoJCSpzcWxfcmVzdWx0cyA9IHJlc3VsdDsKCQlzdHJjcHkocXVlcnlfc3RyaW5nLCBx
dWVyeV9zdHJpbmdfMF82ICk7CiAJCXJldHVybiAoTVNfU1VDQ0VTUyk7CiAgICB9CgoJLy9va2F5
LCB0aGF0IGNvbW1hbmQgZGlkbnQgd29yay4gIEl0cyBwcm9iYWJseSBhIDAuNSBkYXRhYmFzZQoJ
Ly8gV2UgaGF2ZSB0byBldmVyeXRoaW5nIGFnYWluLCBhZnRlciBwZXJmb3JtaW5nIGEgcm9sbGJh
Y2suCgoJIFBRY2xlYXIocmVzdWx0KTsKICAgICAgIHJlc3VsdCA9IFBRZXhlYyhsYXllcmluZm8t
PmNvbm4sICJyb2xsYmFjayIgKTsKCSBQUWNsZWFyKHJlc3VsdCk7CgkgcmVzdWx0ID0gUFFleGVj
KGxheWVyaW5mby0+Y29ubiwgImJlZ2luIiApOwoKICAgIGlmICghKHJlc3VsdCkgfHwgUFFyZXN1
bHRTdGF0dXMocmVzdWx0KSAhPSBQR1JFU19DT01NQU5EX09LKQogICAgewoJICAgICAgbXNTZXRF
cnJvcihNU19RVUVSWUVSUiwgIkNvdWxkbnQgcmVjb3ZlciBmcm9tIGEgYmFkIHF1ZXJ5OiBcbicl
cydcbiIsCiAgICAgICAgICAgICAgICAgInByZXBfREIoKSIscXVlcnlfc3RyaW5nXzBfNik7CiAg
ICAgICAgCVBRY2xlYXIocmVzdWx0KTsKCSAgCWxheWVyaW5mby0+cXVlcnlfcmVzdWx0ID0gTlVM
TDsKCQlyZXR1cm4oTVNfRkFJTFVSRSk7CQkvLyB0b3RhbGx5IHNjcmV3ZWQKICAgIH0KCiAgICBQ
UWNsZWFyKHJlc3VsdCk7CgovL2ZwcmludGYgKHN0ZGVyciwicHJlcF9EQjpxdWVyeV9zdHJpbmdf
MF81OiVzXG4iLHF1ZXJ5X3N0cmluZ18wXzUpOwoKCiAKCQlzcHJpbnRmKHRtcDIsICJFcnJvciBl
eGVjdXRpbmcgUE9TVEdJUyAgREVDTEFSRSAodGhlIGFjdHVhbCBxdWVyeSkgc3RhdGVtZW50OiAn
JXMnIDxicj48YnI+XG5cblBvc3RncmVzcWwgcmVwb3J0cyB0aGUgZXJyb3IgJyVzJzxicj48YnI+
XG5cbk1vcmUgSGVscDo8YnI+PGJyPlxuXG4iLAoJCQkJcXVlcnlfc3RyaW5nXzBfNiwKCQkJCQlQ
UWVycm9yTWVzc2FnZShsYXllcmluZm8tPmNvbm4pCgkJCSAJKTsKCgoJCXNwcmludGYodG1wLCAi
JXMlcyIsCgkJCQkJdG1wMiwKCQkJCQlEQVRBRVJST1JNRVNTQUdFKCImbHQ7Y2hlY2sgeW91ciAu
bWFwIGZpbGUmZ3Q7IiAsIiIpCgkJCSAJKTsKCgoKICAgICAgICBtc1NldEVycm9yKE1TX1FVRVJZ
RVJSLHRtcCwicHJlcF9EQigpIik7CgoKICAgICAgICBQUWNsZWFyKHJlc3VsdCk7CgkgIAlsYXll
cmluZm8tPnF1ZXJ5X3Jlc3VsdCA9IE5VTEw7CgkJcmV0dXJuKE1TX0ZBSUxVUkUpOwkJLy8gdG90
YWxseSBzY3Jld2VkCgoKfQoKCi8vIGJ1aWxkIHRoZSBuZWNjZXNzYXJ5IFNRTAovLyBhbGxvY2F0
ZSBhIGN1cnNvciBmb3IgdGhlIFNRTCBxdWVyeQovLyBnZXQgcmVhZHkgdG8gcmVhZCBmcm9tIHRo
ZSBjdXJzb3IKLy8KLy8gRm9yIHF1ZXJpZXMsIHdlIG5lZWQgdG8gYWxzbyByZXRyZWl2ZSB0aGUg
T0lEIGZvciBlYWNoIG9mIHRoZSByb3dzCi8vIFNvIEdldFNoYXBlKCkgY2FuIHJhbmRvbWx5IGFj
Y2VzcyBhIHJvdy4KCmludCBtc1BPU1RHSVNMYXllcldoaWNoU2hhcGVzKGxheWVyT2JqICpsYXll
ciwgcmVjdE9iaiByZWN0KQp7CgljaGFyCSpxdWVyeV9zdHI7CgljaGFyCSp0YWJsZV9uYW1lOwoJ
Y2hhcgkqZ2VvbV9jb2x1bW5fbmFtZTsKCWNoYXIJKnVyaWRfbmFtZTsKCWNoYXIJKnVzZXJfc3Jp
ZDsKCW1zUE9TVEdJU0xheWVySW5mbwkqbGF5ZXJpbmZvOwoJaW50CXNldF91cF9yZXN1bHQ7CgoJ
dGFibGVfbmFtZSA9IG1hbGxvYyg1MDApOwoJZ2VvbV9jb2x1bW5fbmFtZSA9IG1hbGxvYyg1MDAp
OwoJdXJpZF9uYW1lID0gbWFsbG9jKDUwMCk7Cgl1c2VyX3NyaWQgPSBtYWxsb2MoNTAwKTsKCgoK
Ly9mcHJpbnRmKHN0ZGVyciwibXNQT1NUR0lTTGF5ZXJXaGljaFNoYXBlcyBjYWxsZWRcbiIpOwoK
CWxheWVyaW5mbyA9IGdldFBvc3RHSVNMYXllckluZm8oIGxheWVyKTsKCglpZiAobGF5ZXJpbmZv
ID09IE5VTEwpCgl7CgkJLy9sYXllciBub3Qgb3BlbmVkIHlldAoJCW1zU2V0RXJyb3IoTVNfUVVF
UllFUlIsICJtc1BPU1RHSVNMYXllcldoaWNoU2hhcGVzIGNhbGxlZCBvbiB1bm9wZW5lZCBsYXll
ciAobGF5ZXJpbmZvID0gTlVMTCkiLAogICAgICAgICAgICAgICAgICJtc1BPU1RHSVNMYXllcldo
aWNoU2hhcGVzKCkiKTsKCQlyZXR1cm4oTVNfRkFJTFVSRSk7Cgl9CgogICAgICAgIGlmKCBsYXll
ci0+ZGF0YSA9PSBOVUxMICkKICAgICAgICB7CiAgICAgICAgICAgIG1zU2V0RXJyb3IoTVNfUVVF
UllFUlIsCiAgICAgICAgICAgICAgICAgICAgICAgIk1pc3NpbmcgREFUQSBjbGF1c2UgaW4gUG9z
dEdJUyBMYXllciBkZWZpbml0aW9uLiAgREFUQSBzdGF0ZW1lbnQgbXVzdCBjb250YWluICdnZW9t
ZXRyeV9jb2x1bW4gZnJvbSB0YWJsZV9uYW1lJyBvciAnZ2VvbWV0cnlfY29sdW1uIGZyb20gKHN1
Yi1xdWVyeSkgYXMgZm9vJy4iLAogICAgICAgICAgICAgICAgICAgICAgICJtc1BPU1RHSVNMYXll
cldoaWNoU2hhcGVzKCkiKTsKICAgICAgICAgICAgcmV0dXJuKE1TX0ZBSUxVUkUpOwogICAgICAg
IH0KCglxdWVyeV9zdHIgPSAoY2hhciAqKSBtYWxsb2MoNjAwMCk7IC8vc2hvdWxkIGJlIGJpZyBl
bm91Z2gKCW1lbXNldChxdWVyeV9zdHIsMCw2MDAwKTsJCS8vemVybyBpdCBvdXQKCgltc1BPU1RH
SVNMYXllclBhcnNlRGF0YShsYXllci0+ZGF0YSwgZ2VvbV9jb2x1bW5fbmFtZSwgdGFibGVfbmFt
ZSwgdXJpZF9uYW1lLHVzZXJfc3JpZCk7CgoJc2V0X3VwX3Jlc3VsdD0gcHJlcF9EQih0YWJsZV9u
YW1lLGdlb21fY29sdW1uX25hbWUsIGxheWVyLCAmKGxheWVyaW5mby0+cXVlcnlfcmVzdWx0KSwg
cmVjdCxxdWVyeV9zdHIsIHVyaWRfbmFtZSx1c2VyX3NyaWQpOwoKCWZyZWUodXNlcl9zcmlkKTsK
CWZyZWUoZ2VvbV9jb2x1bW5fbmFtZSk7CglmcmVlKHRhYmxlX25hbWUpOwoKCWlmIChzZXRfdXBf
cmVzdWx0ICE9IE1TX1NVQ0NFU1MpCgkJcmV0dXJuIHNldF91cF9yZXN1bHQ7IC8vcmVsYXkgZXJy
b3IKCWxheWVyaW5mby0+c3FsID0gcXVlcnlfc3RyOwoKCiAgICBsYXllcmluZm8tPnF1ZXJ5X3Jl
c3VsdCA9IFBRZXhlYyhsYXllcmluZm8tPmNvbm4sICJGRVRDSCBBTEwgaW4gbXljdXJzb3IiKTsK
ICAgIGlmICghKGxheWVyaW5mby0+cXVlcnlfcmVzdWx0KSB8fCBQUXJlc3VsdFN0YXR1cyhsYXll
cmluZm8tPnF1ZXJ5X3Jlc3VsdCkgIT0gIFBHUkVTX1RVUExFU19PSykKICAgIHsKCQljaGFyIHRt
cFs0MDAwXTsKCgkJc3ByaW50Zih0bXAsICJFcnJvciBleGVjdXRpbmcgUE9TVEdJUyAgU1FMICAg
c3RhdGVtZW50IChpbiBGRVRDSCBBTEwpOiAlc1xuLSVzXG4iLCBxdWVyeV9zdHIsUFFlcnJvck1l
c3NhZ2UobGF5ZXJpbmZvLT5jb25uKSApOwoKCiAgICAgICAgICBtc1NldEVycm9yKE1TX1FVRVJZ
RVJSLAoJCQkJIAlEQVRBRVJST1JNRVNTQUdFKCIiLHRtcCksCgkJCQkJIm1zUE9TVEdJU0xheWVy
V2hpY2hTaGFwZXMoKSIpOwoKCiAgICAgICAgCVBRY2xlYXIobGF5ZXJpbmZvLT5xdWVyeV9yZXN1
bHQpOwoJICAJbGF5ZXJpbmZvLT5xdWVyeV9yZXN1bHQgPSBOVUxMOwoJCXJldHVybihNU19GQUlM
VVJFKTsKICAgIH0KCglsYXllcmluZm8tPnJvd19udW0gPTA7CgoKICAgIHJldHVybihNU19TVUND
RVNTKTsKfQoKLy8gQ2xvc2UgdGhlIHBvc3RnaXMgcmVjb3JkIHNldCBhbmQgY29ubmVjdGlvbgpp
bnQgbXNQT1NUR0lTTGF5ZXJDbG9zZShsYXllck9iaiAqbGF5ZXIpCnsKCW1zUE9TVEdJU0xheWVy
SW5mbwkqbGF5ZXJpbmZvOwoKLy9mcHJpbnRmKHN0ZGVyciwibXNQT1NUR0lTTGF5ZXJDbG9zZSBj
YWxsZWRcbiIpOwoJbGF5ZXJpbmZvID0gZ2V0UG9zdEdJU0xheWVySW5mbyggbGF5ZXIpOwoKCglp
ZiAobGF5ZXJpbmZvICE9IE5VTEwpCgl7CiAgICAgICAgICAgIFBRY2xlYXIobGF5ZXJpbmZvLT5x
dWVyeV9yZXN1bHQpOwogICAgICAgICAgICBsYXllcmluZm8tPnF1ZXJ5X3Jlc3VsdCA9IE5VTEw7
CgogICAgICAgICAgICBQUWZpbmlzaChsYXllcmluZm8tPmNvbm4pOwogICAgICAgICAgICBsYXll
cmluZm8tPmNvbm4gPSBOVUxMOwoKICAgICAgICAgICAgaWYgKGxheWVyaW5mby0+dXJpZF9uYW1l
ICE9IE5VTEwpCiAgICAgICAgICAgICAgZnJlZShsYXllcmluZm8tPnVyaWRfbmFtZSApOwogICAg
ICAgICAgICBsYXllcmluZm8tPnVyaWRfbmFtZSA9IE5VTEw7CgogICAgICAgICAgICBpZiAobGF5
ZXJpbmZvLT5zcWwgIT0gTlVMTCkKICAgICAgICAgICAgICBmcmVlIChsYXllcmluZm8tPnNxbCk7
CiAgICAgICAgICAgIGxheWVyaW5mby0+c3FsID0gTlVMTDsKCiAgICAgICAgICAgIGZyZWUobGF5
ZXJpbmZvKTsKICAgICAgICAgICAgc2V0UG9zdEdJU0xheWVySW5mbyhsYXllciwgTlVMTCk7Cgl9
CgoJcmV0dXJuKE1TX1NVQ0NFU1MpOwp9CgovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioKLy8gd2tiIGlzIGFzc3VtZWQgdG8gYmUgMmQgKGZv
cmNlXzJkKQovLyBhbmQgd2tiIGlzIGEgR0VPTUVUUllDT0xMRUNUSU9OIChmb3JjZV9jb2xsZWN0
aW9uKQovLyBhbmQgd2tiIGlzIGluIHRoZSBlbmRpYW4gb2YgdGhpcyBjb21wdXRlciAoYXNiaW5h
cnkoLi4uLCdbWE5dRFInKSkKLy8gZWFjaCBvZiB0aGUgc3ViLWdlb20gaW5zaWRlIHRoZSBjb2xs
ZWN0aW9uIGFyZSBwb2ludCxsaW5lc3RyaW5nLCBvciBwb2x5Z29uCi8vCi8vIGFsc28sIGludCBp
cyAzMmJpdHMgbG9uZwovLyAgICAgICBkb3VibGUgaXMgNjRiaXRzIGxvbmcKLy8qKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgoKLy8gY29udmVy
dCB0aGUgd2tiIGludG8gcG9pbnRzCi8vCXBvaW50cyAtPiBwYXNzIHRocm91Z2gKLy8JbGluZXMt
PiAgIGNvbnN0aXR1ZW50IHBvaW50cwovLwlwb2x5cy0+ICAgdHJlYXQgcmluZyBsaWtlIGxpbmUg
YW5kIHB1bGwgb3V0IHRoZSBjb25zaXR1ZW50IHBvaW50cwoKaW50CWZvcmNlX3RvX3BvaW50cyhj
aGFyCSp3a2IsIHNoYXBlT2JqICpzaGFwZSkKewoJLy93ZSdyZSBnb2luZyB0byBtYWtlIGEgJ2xp
bmUnIGZvciBlYWNoIGVudGl0eSAocG9pbnQsIGxpbmUgb3IgcmluZykgaW4gdGhlIGdlb20gY29s
bGVjdGlvbgoKCWludCBvZmZzZXQgPTAscHRfb2Zmc2V0OwoJaW50IG5nZW9tcyA7CglpbnQJdCx1
LHY7CglpbnQJdHlwZSxucmluZ3MsbnBvaW50czsKCWxpbmVPYmoJbGluZT17MCxOVUxMfTsKCglz
aGFwZS0+dHlwZSA9IE1TX1NIQVBFX05VTEw7ICAvL25vdGhpbmcgaW4gaXQKCgltZW1jcHkoICZu
Z2VvbXMsICZ3a2JbNV0sIDQpOwoJb2Zmc2V0ID0gOTsgIC8vd2VyZSB0aGUgZmlyc3QgZ2VvbWV0
cnkgaXMKCWZvciAodD0wOyB0PG5nZW9tczsgdCsrKQoJewoJCW1lbWNweSggJnR5cGUsICZ3a2Jb
b2Zmc2V0KzFdLCA0KTsgIC8vIHR5cGUgb2YgdGhpcyBnZW9tZXRyeQoKCQlpZiAodHlwZSA9PTEp
CS8vUE9JTlQKCQl7CgkJCXNoYXBlLT50eXBlID0gTVNfU0hBUEVfUE9JTlQ7CgkJCWxpbmUubnVt
cG9pbnRzID0gMTsKCQkJbGluZS5wb2ludCA9IChwb2ludE9iaiAqKSBtYWxsb2MgKHNpemVvZihw
b2ludE9iaikpOwoKCQkJCW1lbWNweSggJmxpbmUucG9pbnRbMF0ueCAsICZ3a2Jbb2Zmc2V0KzUg
IF0sIDgpOwoJCQkJbWVtY3B5KCAmbGluZS5wb2ludFswXS55ICwgJndrYltvZmZzZXQrNSs4XSwg
OCk7CgkJCW9mZnNldCArPSA1KzE2OwoJCQltc0FkZExpbmUoc2hhcGUsJmxpbmUpOwoJCQlmcmVl
KGxpbmUucG9pbnQpOwoJCX0KCgkJaWYgKHR5cGUgPT0gMikgLy9saW5lc3RyaW5nCgkJewoJCQlz
aGFwZS0+dHlwZSA9IE1TX1NIQVBFX1BPSU5UOwoJCQltZW1jcHkoJmxpbmUubnVtcG9pbnRzLCAm
d2tiW29mZnNldCs1XSw0KTsgLy9udW0gcG9pbnRzCgkJCWxpbmUucG9pbnQgPSAocG9pbnRPYmog
KikgbWFsbG9jIChzaXplb2YocG9pbnRPYmopKiBsaW5lLm51bXBvaW50cyApOyAvL3BvaW50IHN0
cnVjdAoJCQlmb3IodT0wO3U8bGluZS5udW1wb2ludHMgOyB1KyspCgkJCXsKCQkJCW1lbWNweSgg
JmxpbmUucG9pbnRbdV0ueCAsICZ3a2Jbb2Zmc2V0KzkgKyAoMTYgKiB1KV0sIDgpOwoJCQkJbWVt
Y3B5KCAmbGluZS5wb2ludFt1XS55ICwgJndrYltvZmZzZXQrOSArICgxNiAqIHUpKzhdLCA4KTsK
CQkJfQoJCQlvZmZzZXQgKz0gOSArKDE2KSpsaW5lLm51bXBvaW50czsgIC8vbGVuZ3RoIG9mIG9i
amVjdAoJCQltc0FkZExpbmUoc2hhcGUsJmxpbmUpOwoJCQlmcmVlKGxpbmUucG9pbnQpOwoJCX0K
CQlpZiAodHlwZSA9PSAzKSAvL3BvbHlnb24KCQl7CgkJCXNoYXBlLT50eXBlID0gTVNfU0hBUEVf
UE9JTlQ7CgkJCW1lbWNweSgmbnJpbmdzLCAmd2tiW29mZnNldCs1XSw0KTsgLy9udW0gcmluZ3MK
CQkJLy9hZGQgYSBsaW5lIGZvciBlYWNoIHBvbHlnb24gcmluZwoJCQlwdF9vZmZzZXQgPSAwOwoJ
CQlvZmZzZXQgKz0gOTsgLy9ub3cgcG9pbnRzIGF0IDFzdCBsaW5lYXIgcmluZwoJCQlmb3IgKHU9
MDt1PG5yaW5nczt1KyspCS8vZm9yIGVhY2ggcmluZywgbWFrZSBhIGxpbmUKCQkJewoJCQkJbWVt
Y3B5KCZucG9pbnRzLCAmd2tiW29mZnNldF0sNCk7IC8vbnVtIHBvaW50cwoJCQkJbGluZS5udW1w
b2ludHMgPSBucG9pbnRzOwoJCQkJbGluZS5wb2ludCA9IChwb2ludE9iaiAqKSBtYWxsb2MgKHNp
emVvZihwb2ludE9iaikqIG5wb2ludHMpOyAvL3BvaW50IHN0cnVjdAoJCQkJZm9yKHY9MDt2PG5w
b2ludHM7disrKQoJCQkJewoJCQkJCW1lbWNweSggJmxpbmUucG9pbnRbdl0ueCAsICZ3a2Jbb2Zm
c2V0KzQgKyAoMTYgKiB2KV0sIDgpOwoJCQkJCW1lbWNweSggJmxpbmUucG9pbnRbdl0ueSAsICZ3
a2Jbb2Zmc2V0KzQgKyAoMTYgKiB2KSs4XSwgOCk7CgkJCQl9CgkJCQkvL21ha2Ugb2Zmc2V0IHBv
aW50IHRvIG5leHQgbGluZWFyIHJpbmcKCQkJCW1zQWRkTGluZShzaGFwZSwmbGluZSk7CgkJCQlm
cmVlKGxpbmUucG9pbnQpOwoJCQkJb2Zmc2V0ICs9IDQrICgxNikqbnBvaW50czsKCQkJfQoJCX0K
CX0KCglyZXR1cm4oTVNfU1VDQ0VTUyk7Cn0KCi8vY29udmVydCB0aGUgd2tiIGludG8gbGluZXMK
Ly8gIHBvaW50cy0+IHJlbW92ZQovLyAgbGluZXMgLT4gcGFzcyB0aHJvdWdoCi8vICBwb2x5cyAt
PiB0cmVhdCByaW5ncyBhcyBsaW5lcwoKaW50CWZvcmNlX3RvX2xpbmVzKGNoYXIJKndrYiwgc2hh
cGVPYmogKnNoYXBlKQp7CglpbnQgb2Zmc2V0ID0wLHB0X29mZnNldDsKCWludCBuZ2VvbXMgOwoJ
aW50CXQsdSx2OwoJaW50CXR5cGUsbnJpbmdzLG5wb2ludHM7CglsaW5lT2JqCWxpbmU9ezAsTlVM
TH07CgoKCXNoYXBlLT50eXBlID0gTVNfU0hBUEVfTlVMTDsgIC8vbm90aGluZyBpbiBpdAoKCW1l
bWNweSggJm5nZW9tcywgJndrYls1XSwgNCk7CglvZmZzZXQgPSA5OyAgLy93ZXJlIHRoZSBmaXJz
dCBnZW9tZXRyeSBpcwoJZm9yICh0PTA7IHQ8bmdlb21zOyB0KyspCgl7CgkJbWVtY3B5KCAmdHlw
ZSwgJndrYltvZmZzZXQrMV0sIDQpOyAgLy8gdHlwZSBvZiB0aGlzIGdlb21ldHJ5CgoJCS8vY2Fu
bm90IGRvIGFueXRoaW5nIHdpdGggYSBwb2ludAoKCQlpZiAodHlwZSA9PSAyKSAvL2xpbmVzdHJp
bmcKCQl7CgkJCXNoYXBlLT50eXBlID0gTVNfU0hBUEVfTElORTsKCQkJbWVtY3B5KCZsaW5lLm51
bXBvaW50cywgJndrYltvZmZzZXQrNV0sNCk7IC8vbnVtIHBvaW50cwoJCQlsaW5lLnBvaW50ID0g
KHBvaW50T2JqICopIG1hbGxvYyAoc2l6ZW9mKHBvaW50T2JqKSogbGluZS5udW1wb2ludHMgKTsg
Ly9wb2ludCBzdHJ1Y3QKCQkJZm9yKHU9MDt1PGxpbmUubnVtcG9pbnRzIDsgdSsrKQoJCQl7CgkJ
CQltZW1jcHkoICZsaW5lLnBvaW50W3VdLnggLCAmd2tiW29mZnNldCs5ICsgKDE2ICogdSldLCA4
KTsKCQkJCW1lbWNweSggJmxpbmUucG9pbnRbdV0ueSAsICZ3a2Jbb2Zmc2V0KzkgKyAoMTYgKiB1
KSs4XSwgOCk7CgkJCX0KCQkJb2Zmc2V0ICs9IDkgKygxNikqbGluZS5udW1wb2ludHM7ICAvL2xl
bmd0aCBvZiBvYmplY3QKCQkJbXNBZGRMaW5lKHNoYXBlLCZsaW5lKTsKCQkJZnJlZShsaW5lLnBv
aW50KTsKCQl9CgkJaWYgKHR5cGUgPT0gMykgLy9wb2x5Z29uCgkJewoJCQlzaGFwZS0+dHlwZSA9
IE1TX1NIQVBFX0xJTkU7CgkJCW1lbWNweSgmbnJpbmdzLCAmd2tiW29mZnNldCs1XSw0KTsgLy9u
dW0gcmluZ3MKCQkJLy9hZGQgYSBsaW5lIGZvciBlYWNoIHBvbHlnb24gcmluZwoJCQlwdF9vZmZz
ZXQgPSAwOwoJCQlvZmZzZXQgKz0gOTsgLy9ub3cgcG9pbnRzIGF0IDFzdCBsaW5lYXIgcmluZwoJ
CQlmb3IgKHU9MDt1PG5yaW5nczt1KyspCS8vZm9yIGVhY2ggcmluZywgbWFrZSBhIGxpbmUKCQkJ
ewoJCQkJbWVtY3B5KCZucG9pbnRzLCAmd2tiW29mZnNldF0sNCk7IC8vbnVtIHBvaW50cwoJCQkJ
bGluZS5udW1wb2ludHMgPSBucG9pbnRzOwoJCQkJbGluZS5wb2ludCA9IChwb2ludE9iaiAqKSBt
YWxsb2MgKHNpemVvZihwb2ludE9iaikqIG5wb2ludHMpOyAvL3BvaW50IHN0cnVjdAoJCQkJZm9y
KHY9MDt2PG5wb2ludHM7disrKQoJCQkJewoJCQkJCW1lbWNweSggJmxpbmUucG9pbnRbdl0ueCAs
ICZ3a2Jbb2Zmc2V0KzQgKyAoMTYgKiB2KV0sIDgpOwoJCQkJCW1lbWNweSggJmxpbmUucG9pbnRb
dl0ueSAsICZ3a2Jbb2Zmc2V0KzQgKyAoMTYgKiB2KSs4XSwgOCk7CgkJCQl9CgkJCQkvL21ha2Ug
b2Zmc2V0IHBvaW50IHRvIG5leHQgbGluZWFyIHJpbmcKCQkJCW1zQWRkTGluZShzaGFwZSwmbGlu
ZSk7CgkJCQlmcmVlKGxpbmUucG9pbnQpOwoJCQkJb2Zmc2V0ICs9IDQrICgxNikqbnBvaW50czsK
CQkJfQoJCX0KCX0KCXJldHVybihNU19TVUNDRVNTKTsKfQoKLy8gcG9pbnQgICAtPiByZWplY3QK
Ly8gbGluZSAgICAtPiByZWplY3QKLy8gcG9seWdvbiAtPiBsaW5lcyBvZiBsaW5lYXIgcmluZ3MK
aW50CWZvcmNlX3RvX3BvbHlnb25zKGNoYXIJKndrYiwgc2hhcGVPYmogKnNoYXBlKQp7CgoJaW50
IG9mZnNldCA9MCxwdF9vZmZzZXQ7CglpbnQgbmdlb21zIDsKCWludAl0LHUsdjsKCWludAl0eXBl
LG5yaW5ncyxucG9pbnRzOwoJbGluZU9iaglsaW5lPXswLE5VTEx9OwoKCglzaGFwZS0+dHlwZSA9
IE1TX1NIQVBFX05VTEw7ICAvL25vdGhpbmcgaW4gaXQKCgltZW1jcHkoICZuZ2VvbXMsICZ3a2Jb
NV0sIDQpOwoJb2Zmc2V0ID0gOTsgIC8vd2VyZSB0aGUgZmlyc3QgZ2VvbWV0cnkgaXMKCWZvciAo
dD0wOyB0PG5nZW9tczsgdCsrKQoJewoJCW1lbWNweSggJnR5cGUsICZ3a2Jbb2Zmc2V0KzFdLCA0
KTsgIC8vIHR5cGUgb2YgdGhpcyBnZW9tZXRyeQoKCQlpZiAodHlwZSA9PSAzKSAvL3BvbHlnb24K
CQl7CgkJCXNoYXBlLT50eXBlID0gTVNfU0hBUEVfUE9MWUdPTjsKCQkJbWVtY3B5KCZucmluZ3Ms
ICZ3a2Jbb2Zmc2V0KzVdLDQpOyAvL251bSByaW5ncwoJCQkvL2FkZCBhIGxpbmUgZm9yIGVhY2gg
cG9seWdvbiByaW5nCgkJCXB0X29mZnNldCA9IDA7CgkJCW9mZnNldCArPSA5OyAvL25vdyBwb2lu
dHMgYXQgMXN0IGxpbmVhciByaW5nCgkJCWZvciAodT0wO3U8bnJpbmdzO3UrKykJLy9mb3IgZWFj
aCByaW5nLCBtYWtlIGEgbGluZQoJCQl7CgkJCQltZW1jcHkoJm5wb2ludHMsICZ3a2Jbb2Zmc2V0
XSw0KTsgLy9udW0gcG9pbnRzCgkJCQlsaW5lLm51bXBvaW50cyA9IG5wb2ludHM7CgkJCQlsaW5l
LnBvaW50ID0gKHBvaW50T2JqICopIG1hbGxvYyAoc2l6ZW9mKHBvaW50T2JqKSogbnBvaW50cyk7
IC8vcG9pbnQgc3RydWN0CgkJCQlmb3Iodj0wO3Y8bnBvaW50czt2KyspCgkJCQl7CgkJCQkJbWVt
Y3B5KCAmbGluZS5wb2ludFt2XS54ICwgJndrYltvZmZzZXQrNCArICgxNiAqIHYpXSwgOCk7CgkJ
CQkJbWVtY3B5KCAmbGluZS5wb2ludFt2XS55ICwgJndrYltvZmZzZXQrNCArICgxNiAqIHYpKzhd
LCA4KTsKCQkJCX0KCQkJCS8vbWFrZSBvZmZzZXQgcG9pbnQgdG8gbmV4dCBsaW5lYXIgcmluZwoJ
CQkJbXNBZGRMaW5lKHNoYXBlLCZsaW5lKTsKCQkJCWZyZWUobGluZS5wb2ludCk7CgkJCQlvZmZz
ZXQgKz0gNCsgKDE2KSpucG9pbnRzOwoJCQl9CgkJfQoJfQoJcmV0dXJuKE1TX1NVQ0NFU1MpOwp9
CgovLyBpZiB0aGVyZSBpcyBhbnkgcG9seWdvbiBpbiB3a2IsIHJldHVybiBmb3JjZV9wb2x5Z29u
Ci8vIGlmIHRoZXJlIGlzIGFueSBsaW5lIGluIHdrYiwgcmV0dXJuIGZvcmNlX2xpbmUKLy8gb3Ro
ZXJ3aXNlIHJldHVybiBmb3JjZV9wb2ludAoKaW50CWRvbnRfZm9yY2UoY2hhcgkqd2tiLCBzaGFw
ZU9iaiAqc2hhcGUpCnsKCWludCBvZmZzZXQgPTA7CglpbnQgbmdlb21zIDsKCWludAl0eXBlLHQ7
CglpbnQJCWJlc3RfdHlwZTsKCi8vcHJpbnRmKCJkb250IGZvcmNlIik7CgoJYmVzdF90eXBlID0g
TVNfU0hBUEVfTlVMTDsgIC8vbm90aGluZyBpbiBpdAoKCW1lbWNweSggJm5nZW9tcywgJndrYls1
XSwgNCk7CglvZmZzZXQgPSA5OyAgLy93ZXJlIHRoZSBmaXJzdCBnZW9tZXRyeSBpcwoJZm9yICh0
PTA7IHQ8bmdlb21zOyB0KyspCgl7CgkJbWVtY3B5KCAmdHlwZSwgJndrYltvZmZzZXQrMV0sIDQp
OyAgLy8gdHlwZSBvZiB0aGlzIGdlb21ldHJ5CgoJCWlmICh0eXBlID09IDMpIC8vcG9seWdvbgoJ
CXsKCQkJYmVzdF90eXBlID0gTVNfU0hBUEVfUE9MWUdPTjsKCQl9CgkJaWYgKCAodHlwZSA9PTIp
ICYmICggYmVzdF90eXBlICE9IE1TX1NIQVBFX1BPTFlHT04pICkKCQl7CgkJCWJlc3RfdHlwZSA9
IE1TX1NIQVBFX0xJTkU7CgkJfQoJCWlmICggICAodHlwZT09MSkgJiYgKGJlc3RfdHlwZSA9PSBN
U19TSEFQRV9OVUxMKSApCgkJewoJCQliZXN0X3R5cGUgPSBNU19TSEFQRV9QT0lOVDsKCQl9Cgl9
CgoJaWYgKGJlc3RfdHlwZSA9PSBNU19TSEFQRV9QT0lOVCkKCXsKCQlyZXR1cm4gZm9yY2VfdG9f
cG9pbnRzKHdrYixzaGFwZSk7Cgl9CglpZiAoYmVzdF90eXBlID09IE1TX1NIQVBFX0xJTkUpCgl7
CgkJcmV0dXJuIGZvcmNlX3RvX2xpbmVzKHdrYixzaGFwZSk7Cgl9CglpZiAoYmVzdF90eXBlID09
IE1TX1NIQVBFX1BPTFlHT04pCgl7CgkJcmV0dXJuIGZvcmNlX3RvX3BvbHlnb25zKHdrYixzaGFw
ZSk7Cgl9CgoKCXJldHVybihNU19GQUlMVVJFKTsgLy91bmtub3duIHR5cGUKfQoKLy9maW5kIHRo
ZSBib3VuZHMgb2YgdGhlIHNoYXBlCnZvaWQgZmluZF9ib3VuZHMoc2hhcGVPYmogKnNoYXBlKQp7
CglpbnQgdCx1OwoJaW50IGZpcnN0X29uZSA9IDE7CgoJZm9yICh0PTA7IHQ8IHNoYXBlLT5udW1s
aW5lczsgdCsrKQoJewoJCWZvcih1PTA7dTxzaGFwZS0+bGluZVt0XS5udW1wb2ludHM7IHUrKykK
CQl7CgkJCWlmIChmaXJzdF9vbmUpCgkJCXsKCQkJCXNoYXBlLT5ib3VuZHMubWlueCA9IHNoYXBl
LT5saW5lW3RdLnBvaW50W3VdLng7CgkJCQlzaGFwZS0+Ym91bmRzLm1heHggPSBzaGFwZS0+bGlu
ZVt0XS5wb2ludFt1XS54OwoKCQkJCXNoYXBlLT5ib3VuZHMubWlueSA9IHNoYXBlLT5saW5lW3Rd
LnBvaW50W3VdLnk7CgkJCQlzaGFwZS0+Ym91bmRzLm1heHkgPSBzaGFwZS0+bGluZVt0XS5wb2lu
dFt1XS55OwoJCQkJZmlyc3Rfb25lID0gMDsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCWlmIChzaGFw
ZS0+bGluZVt0XS5wb2ludFt1XS54IDwgc2hhcGUtPmJvdW5kcy5taW54KQoJCQkJCXNoYXBlLT5i
b3VuZHMubWlueCA9IHNoYXBlLT5saW5lW3RdLnBvaW50W3VdLng7CgkJCQlpZiAoc2hhcGUtPmxp
bmVbdF0ucG9pbnRbdV0ueCA+IHNoYXBlLT5ib3VuZHMubWF4eCkKCQkJCQlzaGFwZS0+Ym91bmRz
Lm1heHggPSBzaGFwZS0+bGluZVt0XS5wb2ludFt1XS54OwoKCQkJCWlmIChzaGFwZS0+bGluZVt0
XS5wb2ludFt1XS55IDwgc2hhcGUtPmJvdW5kcy5taW55KQoJCQkJCXNoYXBlLT5ib3VuZHMubWlu
eSA9IHNoYXBlLT5saW5lW3RdLnBvaW50W3VdLnk7CgkJCQlpZiAoc2hhcGUtPmxpbmVbdF0ucG9p
bnRbdV0ueSA+IHNoYXBlLT5ib3VuZHMubWF4eSkKCQkJCQlzaGFwZS0+Ym91bmRzLm1heHkgPSBz
aGFwZS0+bGluZVt0XS5wb2ludFt1XS55OwoKCQkJfQoJCX0KCX0KfQoKCi8vZmluZCB0aGUgbmV4
dCBzaGFwZSB3aXRoIHRoZSBhcHByb3ByaWF0ZSBzaGFwZSB0eXBlIChjb252ZXJ0IGl0IGlmIG5l
Y2Vzc2FyeSkKLy8gYWxzbywgbG9hZCBpbiB0aGUgYXR0cmlidXRlIGRhdGEKLy9NU19ET05FID0+
IG5vIG1vcmUgZGF0YQoKaW50IG1zUE9TVEdJU0xheWVyTmV4dFNoYXBlKGxheWVyT2JqICpsYXll
ciwgc2hhcGVPYmogKnNoYXBlKQp7CglpbnQJcmVzdWx0OwoKCW1zUE9TVEdJU0xheWVySW5mbwkq
bGF5ZXJpbmZvOwoKCWxheWVyaW5mbyA9IGdldFBvc3RHSVNMYXllckluZm8obGF5ZXIpOwoKCi8v
ZnByaW50ZihzdGRlcnIsIm1zUE9TVEdJU0xheWVyTmV4dFNoYXBlIGNhbGxlZFxuIik7CgoJaWYg
KGxheWVyaW5mbyA9PSBOVUxMKQoJewogICAgICAgIAltc1NldEVycm9yKE1TX1FVRVJZRVJSLCAi
TmV4dFNoYXBlIGNhbGxlZCB3aXRoIGxheWVyaW5mbyA9IE5VTEwiLAogICAgICAgICAgICAgICAg
ICJtc1BPU1RHSVNMYXllck5leHRTaGFwZSgpIik7CgkJcmV0dXJuKE1TX0ZBSUxVUkUpOwoJfQoK
CglyZXN1bHQ9IG1zUE9TVEdJU0xheWVyR2V0U2hhcGVSYW5kb20obGF5ZXIsIHNoYXBlLCAmKGxh
eWVyaW5mby0+cm93X251bSkgICApOwoJLy8gZ2V0c2hhcGVyYW5kb20gd2lsbCBpbmNyZW1lbnQg
dGhlIHJvd19udW0KCS8vbGF5ZXJpbmZvLT5yb3dfbnVtICAgKys7CgoJcmV0dXJuIHJlc3VsdDsK
fQoKCgovL1VzZWQgYnkgTmV4dFNoYXBlKCkgdG8gYWNjZXNzIGEgc2hhcGUgaW4gdGhlIHF1ZXJ5
IHNldAovLyBUT0RPOiBvbmx5IGZldGNoIDEwMDAgcm93cyBhdCBhIHRpbWUuICBUaGlzIHNob3Vs
ZCBjaGVjayB0byBzZWUgaWYgdGhlCi8vICAgICAgIHJlcXVlc3RlZCBmZWF0dXJlIGlzIGluIHRo
ZSBzZXQuICBJZiBpdCBpcywgcmV0dXJuIGl0LCBvdGhlcndpc2UKLy8gCSAgIGdyYWIgdGhlIG5l
eHQgMTAwMCByb3dzLgppbnQgbXNQT1NUR0lTTGF5ZXJHZXRTaGFwZVJhbmRvbShsYXllck9iaiAq
bGF5ZXIsIHNoYXBlT2JqICpzaGFwZSwgbG9uZyAqcmVjb3JkKQp7Cgltc1BPU1RHSVNMYXllcklu
Zm8JKmxheWVyaW5mbzsKCWNoYXIJCQkJKndrYjsKCWludAkJCQlyZXN1bHQsdCxzaXplOwoJY2hh
cgkJCQkqdGVtcCwqdGVtcDI7Cglsb25nCQkJCXJlY29yZF9vaWQ7CgoKCWxheWVyaW5mbyA9IGdl
dFBvc3RHSVNMYXllckluZm8oIGxheWVyKTsKCi8vZnByaW50ZihzdGRlcnIsIm1zUE9TVEdJU0xh
eWVyR2V0U2hhcGVSYW5kb20gOiBjYWxsZWQgcm93ICVsaVxuIixyZWNvcmQpOwoKCWlmIChsYXll
cmluZm8gPT0gTlVMTCkKCXsKICAgICAgICAJbXNTZXRFcnJvcihNU19RVUVSWUVSUiwgIkdldFNo
YXBlIGNhbGxlZCB3aXRoIGxheWVyaW5mbyA9IE5VTEwiLAogICAgICAgICAgICAgICAgICJtc1BP
U1RHSVNMYXllckdldFNoYXBlKCkiKTsKCQlyZXR1cm4oTVNfRkFJTFVSRSk7Cgl9CgoJaWYgKGxh
eWVyaW5mby0+Y29ubiA9PSBOVUxMKQoJewogICAgICAgIAltc1NldEVycm9yKE1TX1FVRVJZRVJS
LCAiTmV4dFNoYXBlIGNhbGxlZCBvbiBQT1NUR0lTIGxheWVyIHdpdGggbm8gY29ubmVjdGlvbiB0
byBEQi4iLAogICAgICAgICAgICAgICAgICJtc1BPU1RHSVNMYXllckdldFNoYXBlKCkiKTsKCQly
ZXR1cm4oTVNfRkFJTFVSRSk7Cgl9CgoJaWYgKGxheWVyaW5mby0+cXVlcnlfcmVzdWx0ID09IE5V
TEwpCgl7CiAgICAgICAgCW1zU2V0RXJyb3IoTVNfUVVFUllFUlIsICJHZXRTaGFwZSBjYWxsZWQg
b24gUE9TVEdJUyBsYXllciB3aXRoIGludmFsaWQgREIgcXVlcnkgcmVzdWx0cy4iLAogICAgICAg
ICAgICAgICAgICJtc1BPU1RHSVNMYXllckdldFNoYXBlUmFuZG9tKCkiKTsKCQlyZXR1cm4oTVNf
RkFJTFVSRSk7Cgl9CglzaGFwZS0+dHlwZSA9IE1TX1NIQVBFX05VTEw7CgoJd2hpbGUoc2hhcGUt
PnR5cGUgPT0gTVNfU0hBUEVfTlVMTCkKCXsKCgkJaWYgKCAgKCpyZWNvcmQpIDwgUFFudHVwbGVz
KGxheWVyaW5mby0+cXVlcnlfcmVzdWx0KSApCgkJewoJCQkvL3JldHJlaXZlIGFuIGl0ZW0KCQkJ
d2tiID0gKGNoYXIgKikgUFFnZXR2YWx1ZShsYXllcmluZm8tPnF1ZXJ5X3Jlc3VsdCwgKCpyZWNv
cmQpLCBsYXllci0+bnVtaXRlbXMpOwoJCQlzd2l0Y2gobGF5ZXItPnR5cGUpCgkJCXsKCQkJCWNh
c2UgTVNfTEFZRVJfUE9JTlQ6CgkJCQkJcmVzdWx0ID0gZm9yY2VfdG9fcG9pbnRzKHdrYiwgc2hh
cGUpOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBNU19MQVlFUl9MSU5FOgoJCQkJCXJlc3VsdCA9IGZv
cmNlX3RvX2xpbmVzKHdrYiwgc2hhcGUpOwoJCQkJCWJyZWFrOwoKCQkJCWNhc2UgTVNfTEFZRVJf
UE9MWUdPTjoKCQkJCQlyZXN1bHQgPSAJZm9yY2VfdG9fcG9seWdvbnMod2tiLCBzaGFwZSk7CgkJ
CQkJYnJlYWs7CgkJCQljYXNlIE1TX0xBWUVSX0FOTk9UQVRJT046CgkJCQljYXNlIE1TX0xBWUVS
X1FVRVJZOgoJCQkJCXJlc3VsdCA9IGRvbnRfZm9yY2Uod2tiLHNoYXBlKTsKCQkJCQlicmVhazsK
CiAgICAgICAgICAgICAgICBjYXNlIE1TX0xBWUVSX1JBU1RFUjoKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIG1zRGVidWcoICJJZ25vcmluZyBNU19MQVlFUl9SQVNURVIg
aW4gbWFwcG9zdGdpcy5jXG4iICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgTVNfTEFZRVJfQ0lSQ0xFOgogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNEZWJ1ZyggIklnbm9yaW5nIE1TX0xB
WUVSX1JBU1RFUiBpbiBtYXBwb3N0Z2lzLmNcbiIgKTsKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGJyZWFrOwoKCQkJfQoJCQlpZiAoc2hhcGUtPnR5cGUgIT0gTVNfU0hB
UEVfTlVMTCkKCQkJewoJCQkJLy9oYXZlIHRvIHJldHJlaXZlIHRoZSBhdHRyaWJ1dGVzCgkJCSAg
ICAgICAgc2hhcGUtPnZhbHVlcyA9IChjaGFyICoqKSBtYWxsb2Moc2l6ZW9mKGNoYXIgKikgKiBs
YXllci0+bnVtaXRlbXMpOwoJCQkJZm9yICh0PTA7dDxsYXllci0+bnVtaXRlbXM7dCsrKQoJCQkJ
ewoKCQkJCQkgdGVtcCA9IChjaGFyICopIFBRZ2V0dmFsdWUobGF5ZXJpbmZvLT5xdWVyeV9yZXN1
bHQsICgqcmVjb3JkKSwgdCk7CgkJCQkJIHNpemUgPSBQUWdldGxlbmd0aChsYXllcmluZm8tPnF1
ZXJ5X3Jlc3VsdCwoKnJlY29yZCksIHQgKSA7CgkJCQkJIHRlbXAyID0gKGNoYXIgKikgbWFsbG9j
KHNpemUrMSApOwoJCQkJCSBtZW1jcHkodGVtcDIsIHRlbXAsIHNpemUpOwoJCQkJCSB0ZW1wMltz
aXplXSA9IDA7IC8vbnVsbCB0ZXJtaW5hdGUgaXQKCgkJCQkJIHNoYXBlLT52YWx1ZXNbdF0gPSB0
ZW1wMjsKCQkJCX0KCQkJCXRlbXAgPSAoY2hhciAqKSBQUWdldHZhbHVlKGxheWVyaW5mby0+cXVl
cnlfcmVzdWx0LCAoKnJlY29yZCksIHQrMSk7IC8vIHQgaXMgV0tCLCB0KzEgaXMgT0lECgkJCQly
ZWNvcmRfb2lkID0gc3RydG9sICh0ZW1wLE5VTEwsMTApOwoKCQkJCXNoYXBlLT5pbmRleCA9IHJl
Y29yZF9vaWQ7CgkJCQlzaGFwZS0+bnVtdmFsdWVzID0gbGF5ZXItPm51bWl0ZW1zOwoKCQkJCWZp
bmRfYm91bmRzKHNoYXBlKTsKCQkJCSgqcmVjb3JkKSsrOyAJCS8vbW92ZSB0byBuZXh0IHNoYXBl
CgkJCQlyZXR1cm4gKE1TX1NVQ0NFU1MpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJKCpyZWNvcmQp
Kys7IC8vbW92ZSB0byBuZXh0IHNoYXBlCgkJCX0KCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIChN
U19ET05FKTsKCQl9Cgl9CgoKCW1zRnJlZVNoYXBlKHNoYXBlKTsKCglyZXR1cm4oTVNfRkFJTFVS
RSk7Cn0KCgovLyBFeGVjdXRlIGEgcXVlcnkgb24gdGhlIERCIGJhc2VkIG9uIHJlY29yZCBiZWlu
ZyBhbiBPSUQuCgppbnQgbXNQT1NUR0lTTGF5ZXJHZXRTaGFwZShsYXllck9iaiAqbGF5ZXIsIHNo
YXBlT2JqICpzaGFwZSwgbG9uZyByZWNvcmQpCnsKCgljaGFyCSpxdWVyeV9zdHI7CgljaGFyCXRh
YmxlX25hbWVbNTAwMF07CgljaGFyCWdlb21fY29sdW1uX25hbWVbNTAwMF07CgljaGFyCXVyaWRf
bmFtZVs1MDAwXTsKCWNoYXIJdXNlcl9zcmlkWzUwMDBdOwoJLy9pbnQJbml0ZW1zOwoJY2hhcglj
b2x1bW5zX3dhbnRlZFs1MDAwXTsKCWNoYXIJdGVtcFs1MDAwXTsKCgoJUEdyZXN1bHQgICAqcXVl
cnlfcmVzdWx0OwoJbXNQT1NUR0lTTGF5ZXJJbmZvCSpsYXllcmluZm87CgljaGFyCQkJCSp3a2I7
CglpbnQJCQkJcmVzdWx0LHQsc2l6ZTsKCWNoYXIJCQkJKnRlbXAxLCp0ZW1wMjsKCi8vZnByaW50
ZihzdGRlcnIsIm1zUE9TVEdJU0xheWVyR2V0U2hhcGUgY2FsbGVkIGZvciByZWNvcmQgPSAlaVxu
IixyZWNvcmQpOwoKCWxheWVyaW5mbyA9IGdldFBvc3RHSVNMYXllckluZm8oIGxheWVyKSA7CgoJ
aWYgKGxheWVyaW5mbyA9PSBOVUxMKQoJewoJCS8vbGF5ZXIgbm90IG9wZW5lZCB5ZXQKCQltc1Nl
dEVycm9yKE1TX1FVRVJZRVJSLCAibXNQT1NUR0lTTGF5ZXJHZXRTaGFwZSBjYWxsZWQgb24gdW5v
cGVuZWQgbGF5ZXIgKGxheWVyaW5mbyA9IE5VTEwpIiwKICAgICAgICAgICAgICAgICAibXNQT1NU
R0lTTGF5ZXJHZXRTaGFwZSgpIik7CgkJcmV0dXJuKE1TX0ZBSUxVUkUpOwoJfQoKCXF1ZXJ5X3N0
ciA9IChjaGFyICopIG1hbGxvYyg2MDAwKTsgLy9zaG91bGQgYmUgYmlnIGVub3VnaAoJbWVtc2V0
KHF1ZXJ5X3N0ciwwLDYwMDApOwkJLy96ZXJvIGl0IG91dAoKCW1zUE9TVEdJU0xheWVyUGFyc2VE
YXRhKGxheWVyLT5kYXRhLCBnZW9tX2NvbHVtbl9uYW1lLCB0YWJsZV9uYW1lLCB1cmlkX25hbWUs
dXNlcl9zcmlkKTsKCglpZiAobGF5ZXItPm51bWl0ZW1zID09MCkgLy9kb250IG5lZWQgdGhlIG9p
ZCBzaW5jZSBpdHMgcmVhbGx5IHJlY29yZAoJewoJCWlmIChnQllURV9PUkRFUiA9PSBMSVRUTEVf
RU5ESUFOKQoJCQlzcHJpbnRmKGNvbHVtbnNfd2FudGVkLCJhc2JpbmFyeShmb3JjZV9jb2xsZWN0
aW9uKGZvcmNlXzJkKCVzKSksJ05EUicpIiwgZ2VvbV9jb2x1bW5fbmFtZSk7CgkJZWxzZQoJCQlz
cHJpbnRmKGNvbHVtbnNfd2FudGVkLCJhc2JpbmFyeShmb3JjZV9jb2xsZWN0aW9uKGZvcmNlXzJk
KCVzKSksJ1hEUicpIiwgZ2VvbV9jb2x1bW5fbmFtZSk7Cgl9CgllbHNlCgl7CgkJY29sdW1uc193
YW50ZWRbMF0gPSAwOyAvL2xlbj0wCgkJZm9yICh0PTA7dDxsYXllci0+bnVtaXRlbXM7IHQrKykK
CQl7CgkJCXNwcmludGYodGVtcCwiJXM6OnRleHQsIixsYXllci0+aXRlbXNbdF0pOwoJCQlzdHJj
YXQoY29sdW1uc193YW50ZWQsdGVtcCk7CgkJfQoJCWlmIChnQllURV9PUkRFUiA9PSBMSVRUTEVf
RU5ESUFOKQoJCQlzcHJpbnRmKHRlbXAsImFzYmluYXJ5KGZvcmNlX2NvbGxlY3Rpb24oZm9yY2Vf
MmQoJXMpKSwnTkRSJykiLCBnZW9tX2NvbHVtbl9uYW1lKTsKCQllbHNlCgkJCXNwcmludGYodGVt
cCwiYXNiaW5hcnkoZm9yY2VfY29sbGVjdGlvbihmb3JjZV8yZCglcykpLCdYRFInKSIsIGdlb21f
Y29sdW1uX25hbWUpOwoKCQlzdHJjYXQoY29sdW1uc193YW50ZWQsdGVtcCk7Cgl9CgoKCgkJc3By
aW50ZihxdWVyeV9zdHIsIkRFQ0xBUkUgbXljdXJzb3IgQklOQVJZIENVUlNPUiBGT1IgU0VMRUNU
ICVzIGZyb20gJXMgV0hFUkUgJXMgPSAlbGkiLCBjb2x1bW5zX3dhbnRlZCx0YWJsZV9uYW1lLHVy
aWRfbmFtZSxyZWNvcmQpOwoKCi8vZnByaW50ZihzdGRlcnIsIm1zUE9TVEdJU0xheWVyR2V0U2hh
cGU6ICVzIFxuIixxdWVyeV9zdHIpOwoKICAgIHF1ZXJ5X3Jlc3VsdCA9IFBRZXhlYyhsYXllcmlu
Zm8tPmNvbm4sICJCRUdJTiIpOwogICAgaWYgKCEocXVlcnlfcmVzdWx0KSB8fCBQUXJlc3VsdFN0
YXR1cyhxdWVyeV9yZXN1bHQpICE9IFBHUkVTX0NPTU1BTkRfT0spCiAgICB7CgkgICAgICBtc1Nl
dEVycm9yKE1TX1FVRVJZRVJSLCAiRXJyb3IgZXhlY3V0aW5nIFBPU1RHSVMgIEJFR0lOICAgc3Rh
dGVtZW50LiIsCiAgICAgICAgICAgICAgICAgIm1zUE9TVEdJU0xheWVyR2V0U2hhcGUoKSIpOwoK
ICAgICAgICAJUFFjbGVhcihxdWVyeV9yZXN1bHQpOwoJICAJcXVlcnlfcmVzdWx0ID0gTlVMTDsK
CQlyZXR1cm4oTVNfRkFJTFVSRSk7CiAgICB9CgogICAgcXVlcnlfcmVzdWx0ID0gUFFleGVjKGxh
eWVyaW5mby0+Y29ubiwgInNldCBlbmFibGVfc2Vxc2NhbiA9IG9mZiIpOwogICAgaWYgKCEocXVl
cnlfcmVzdWx0KSB8fCBQUXJlc3VsdFN0YXR1cyhxdWVyeV9yZXN1bHQpICE9IFBHUkVTX0NPTU1B
TkRfT0spCiAgICB7CgkgICAgICBtc1NldEVycm9yKE1TX1FVRVJZRVJSLCAiRXJyb3IgZXhlY3V0
aW5nIFBPU1RHSVMgICdzZXQgZW5hYmxlX3NlcXNjYW4gb2ZmJyAgIHN0YXRlbWVudC4iLAogICAg
ICAgICAgICAgICAgICJtc1BPU1RHSVNMYXllckdldFNoYXBlKCkiKTsKCiAgICAgICAgCVBRY2xl
YXIocXVlcnlfcmVzdWx0KTsKCSAgCXF1ZXJ5X3Jlc3VsdCA9IE5VTEw7CgkJcmV0dXJuKE1TX0ZB
SUxVUkUpOwogICAgfQoKCiAgICBQUWNsZWFyKHF1ZXJ5X3Jlc3VsdCk7CgogICAgcXVlcnlfcmVz
dWx0ID0gUFFleGVjKGxheWVyaW5mby0+Y29ubiwgcXVlcnlfc3RyICk7CgogICAgaWYgKCEocXVl
cnlfcmVzdWx0KSB8fCBQUXJlc3VsdFN0YXR1cyhxdWVyeV9yZXN1bHQpICE9IFBHUkVTX0NPTU1B
TkRfT0spCiAgICB7CgkJY2hhciB0bXBbNDAwMF07CgoJCXNwcmludGYodG1wLCAiRXJyb3IgZXhl
Y3V0aW5nIFBPU1RHSVMgIFNRTCAgIHN0YXRlbWVudCAoaW4gRkVUQ0ggQUxMKTogJXNcbi0lc1xu
PGJyPk1vcmUgSGVscDo8YnI+IiwgcXVlcnlfc3RyLFBRZXJyb3JNZXNzYWdlKGxheWVyaW5mby0+
Y29ubikgKTsKCgogICAgICAgICAgbXNTZXRFcnJvcihNU19RVUVSWUVSUiwKCQkJCSAJREFUQUVS
Uk9STUVTU0FHRSgiIix0bXApLAoJCQkJCSJtc1BPU1RHSVNMYXllckdldFNoYXBlKCkiKTsKCiAg
ICAgICAgCVBRY2xlYXIocXVlcnlfcmVzdWx0KTsKCSAgCXF1ZXJ5X3Jlc3VsdCA9IE5VTEw7CgkJ
cmV0dXJuKE1TX0ZBSUxVUkUpOwoKICAgIH0KICAgIFBRY2xlYXIocXVlcnlfcmVzdWx0KTsKCiAg
ICBxdWVyeV9yZXN1bHQgPSBQUWV4ZWMobGF5ZXJpbmZvLT5jb25uLCAiRkVUQ0ggQUxMIGluIG15
Y3Vyc29yIik7CiAgICBpZiAoIShxdWVyeV9yZXN1bHQpIHx8IFBRcmVzdWx0U3RhdHVzKHF1ZXJ5
X3Jlc3VsdCkgIT0gIFBHUkVTX1RVUExFU19PSykKICAgIHsKCQljaGFyIHRtcFs0MDAwXTsKCgkJ
CXNwcmludGYodG1wLCAiRXJyb3IgZXhlY3V0aW5nIFBPU1RHSVMgIFNRTCAgIHN0YXRlbWVudCAo
aW4gRkVUQ0ggQUxMKTogJXNcbi0lc1xuIiwgcXVlcnlfc3RyLFBRZXJyb3JNZXNzYWdlKGxheWVy
aW5mby0+Y29ubikgKTsKCgogICAgICAgICAgbXNTZXRFcnJvcihNU19RVUVSWUVSUiwKCQkJCSAJ
REFUQUVSUk9STUVTU0FHRSgiIix0bXApLAoJCQkJCSJtc1BPU1RHSVNMYXllckdldFNoYXBlKCki
KTsKICAgICAgICAJUFFjbGVhcihxdWVyeV9yZXN1bHQpOwoJICAJcXVlcnlfcmVzdWx0ID0gTlVM
TDsKCQlyZXR1cm4oTVNfRkFJTFVSRSk7CiAgICB9CgoJCQkvL3F1ZXJ5IGhhcyBiZWVuIGRvbmUs
IHNvIHdlIGNhbiByZXRyZWl2ZSB0aGUgcmVzdWx0cwoKCiAgICAJc2hhcGUtPnR5cGUgPSBNU19T
SEFQRV9OVUxMOwoKCQlpZiAoICAwIDwgUFFudHVwbGVzKHF1ZXJ5X3Jlc3VsdCkgKSAgLy9vbmx5
IG5lZWQgdG8gZ2V0IG9uZSBzaGFwZQoJCXsKCQkJLy9yZXRyZWl2ZSBhbiBpdGVtCgkJCXdrYiA9
IChjaGFyICopIFBRZ2V0dmFsdWUocXVlcnlfcmVzdWx0LCAwLCBsYXllci0+bnVtaXRlbXMpOyAg
Ly8gbGF5ZXItPm51bWl0ZW1zIGlzIHRoZSB3a3QgY29sdW1uCgkJCXN3aXRjaChsYXllci0+dHlw
ZSkKCQkJewoJCQkJY2FzZSBNU19MQVlFUl9QT0lOVDoKCQkJCQlyZXN1bHQgPSBmb3JjZV90b19w
b2ludHMod2tiLCBzaGFwZSk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIE1TX0xBWUVSX0xJTkU6CgkJ
CQkJcmVzdWx0ID0gZm9yY2VfdG9fbGluZXMod2tiLCBzaGFwZSk7CgkJCQkJYnJlYWs7CgkJCQlj
YXNlIE1TX0xBWUVSX1BPTFlHT046CgkJCQkJcmVzdWx0ID0gCWZvcmNlX3RvX3BvbHlnb25zKHdr
Yiwgc2hhcGUpOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBNU19MQVlFUl9BTk5PVEFUSU9OOgoJCQkJ
Y2FzZSBNU19MQVlFUl9RVUVSWToKCQkJCQlyZXN1bHQgPSBkb250X2ZvcmNlKHdrYixzaGFwZSk7
CgkJCQkJYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIE1TX0xBWUVSX1JBU1RFUjoKICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zRGVidWcoICJJZ25vcmluZyBNU19M
QVlFUl9SQVNURVIgaW4gbWFwcG9zdGdpcy5jXG4iICk7CiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgTVNfTEFZRVJfQ0lS
Q0xFOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNEZWJ1ZyggIkln
bm9yaW5nIE1TX0xBWUVSX1JBU1RFUiBpbiBtYXBwb3N0Z2lzLmNcbiIgKTsKCgkJCX0KCQkJaWYg
KHNoYXBlLT50eXBlICE9IE1TX1NIQVBFX05VTEwpCgkJCXsKCQkJCS8vaGF2ZSB0byByZXRyZWl2
ZSB0aGUgYXR0cmlidXRlcwoJCQkJc2hhcGUtPnZhbHVlcyA9IChjaGFyICoqKSBtYWxsb2Moc2l6
ZW9mKGNoYXIgKikgKiBsYXllci0+bnVtaXRlbXMpOwoJCQkJZm9yICh0PTA7dDxsYXllci0+bnVt
aXRlbXM7dCsrKQoJCQkJewovL2ZwcmludGYoc3RkZXJyLCJtc1BPU1RHSVNMYXllckdldFNoYXBl
OiBmaW5kaW5nIGF0dHJpYnV0ZSBpbmZvIGZvciAnJXMnXG4iLGxheWVyLT5pdGVtc1t0XSk7CgoK
CQkJCQkgdGVtcDE9IChjaGFyICopIFBRZ2V0dmFsdWUocXVlcnlfcmVzdWx0LCAwLCB0KTsKCQkJ
CQkgc2l6ZSA9IFBRZ2V0bGVuZ3RoKHF1ZXJ5X3Jlc3VsdCwwLCB0ICkgOwoJCQkJCSB0ZW1wMiA9
IChjaGFyICopIG1hbGxvYyhzaXplKzEgKTsKCQkJCQkgbWVtY3B5KHRlbXAyLCB0ZW1wMSwgc2l6
ZSk7CgkJCQkJIHRlbXAyW3NpemVdID0gMDsgLy9udWxsIHRlcm1pbmF0ZSBpdAoKCQkJCQkgc2hh
cGUtPnZhbHVlc1t0XSA9IHRlbXAyOwovL2ZwcmludGYoc3RkZXJyLCJtc1BPU1RHSVNMYXllckdl
dFNoYXBlOiBzaGFwZS0+dmFsdWVzWyVpXSBoYXMgdmFsdWUgJyVzJ1xuIix0LHNoYXBlLT52YWx1
ZXNbdF0pOwoKCQkJCX0KCQkJCXNoYXBlLT5pbmRleCA9IHJlY29yZDsKCQkJCXNoYXBlLT5udW12
YWx1ZXMgPSBsYXllci0+bnVtaXRlbXM7CgoJCQkJZmluZF9ib3VuZHMoc2hhcGUpOwoKCQkJCS8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoJCQkJLy9BZGRlZCBieSBC
b25uaW4gU3RlZmFubwkJLy8KCQkJCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLwoJCQkJUFFleGVjKGxheWVyaW5mby0+Y29ubiwgIkNMT1NFIG15Y3Vyc29yIik7CgkJ
CQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCgkJCQlyZXR1cm4g
KE1TX1NVQ0NFU1MpOwoJCQl9CgkJfQoJCWVsc2UKCQl7CgkJCS8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLwoJCQkvL0FkZGVkIGJ5IEJvbm5pbiBTdGVmYW5vCQkvLwoJ
CQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCQkJUFFleGVjKGxh
eWVyaW5mby0+Y29ubiwgIkNMT1NFIG15Y3Vyc29yIik7CgkJCS8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKCQkJcmV0dXJuIChNU19ET05FKTsKCQl9CgoKCgltc0Zy
ZWVTaGFwZShzaGFwZSk7CgoJcmV0dXJuKE1TX0ZBSUxVUkUpOwoKCn0KCgoKCi8vcXVlcnkgdGhl
IERCIGZvciBpbmZvIGFib3V0IHRoZSByZXF1ZXN0ZWQgdGFibGUKLy8KLy8gQ0hFQVQ6IGRvbnQg
bG9vayBpbiB0aGUgc3lzdGVtIHRhYmxlcywgZ2V0IHF1ZXJ5IG9wdGltaXphdGlvbiBpbmZvbWF0
aW9uCi8vCi8vIGdldCB0aGUgdGFibGUgbmFtZSwgcmV0dXJuIGEgbGlzdCBvZiB0aGUgcG9zc2li
bGUgY29sdW1ucyAoZXhjZXB0IEdFT01FVFJZIGNvbHVtbikKLy8KLy8gZm91bmQgb3V0IHRoaXMg
aXMgY2FsbGVkIGR1cmluZyBhIHF1ZXJ5CgppbnQgbXNQT1NUR0lTTGF5ZXJHZXRJdGVtcyhsYXll
ck9iaiAqbGF5ZXIpCnsKCW1zUE9TVEdJU0xheWVySW5mbwkqbGF5ZXJpbmZvOwoJY2hhcgkJCQl0
YWJsZV9uYW1lWzUwMDBdOwoJY2hhcgkJCQlnZW9tX2NvbHVtbl9uYW1lWzUwMDBdOwoJY2hhcgl1
cmlkX25hbWVbNTAwMF07CgljaGFyIHVzZXJfc3JpZFs1MDAwXTsKCWNoYXIJCQkJc3FsWzYwMDBd
OwoJLy9pbnQJCQkJbml0ZW1zOwoKCglQR3Jlc3VsdCAgICpxdWVyeV9yZXN1bHQ7CglpbnQJCXQ7
CgljaGFyCSpjb2w7CgljaGFyIGZvdW5kX2dlb20gPSAwOwoKCWludCBpdGVtX251bTsKCgovL2Zw
cmludGYoc3RkZXJyLCAiaW4gbXNQT1NUR0lTTGF5ZXJHZXRJdGVtcyAgKGZpbmQgY29sdW1uIG5h
bWVzKVxuIik7CgoJbGF5ZXJpbmZvID0gZ2V0UG9zdEdJU0xheWVySW5mbyggbGF5ZXIpOwoKCWlm
IChsYXllcmluZm8gPT0gTlVMTCkKCXsKCQkvL2xheWVyIG5vdCBvcGVuZWQgeWV0CgkJbXNTZXRF
cnJvcihNU19RVUVSWUVSUiwgIm1zUE9TVEdJU0xheWVyR2V0SXRlbXMgY2FsbGVkIG9uIHVub3Bl
bmVkIGxheWVyIiwKICAgICAgICAgICAgICAgICAibXNQT1NUR0lTTGF5ZXJHZXRJdGVtcygpIik7
CgkJcmV0dXJuKE1TX0ZBSUxVUkUpOwoJfQoKCWlmIChsYXllcmluZm8tPmNvbm4gPT0gTlVMTCkK
CXsKICAgICAgICAJbXNTZXRFcnJvcihNU19RVUVSWUVSUiwgIm1zUE9TVEdJU0xheWVyR2V0SXRl
bXMgY2FsbGVkIG9uIFBPU1RHSVMgbGF5ZXIgd2l0aCBubyBjb25uZWN0aW9uIHRvIERCLiIsCiAg
ICAgICAgICAgICAgICAgIm1zUE9TVEdJU0xheWVyR2V0SXRlbXMoKSIpOwoJCXJldHVybihNU19G
QUlMVVJFKTsKCX0KCS8vZ2V0IHRoZSB0YWJsZSBuYW1lIGFuZCBnZW9tZXRyeSBjb2x1bW4gbmFt
ZQoKCW1zUE9TVEdJU0xheWVyUGFyc2VEYXRhKGxheWVyLT5kYXRhLCBnZW9tX2NvbHVtbl9uYW1l
LCB0YWJsZV9uYW1lLCB1cmlkX25hbWUsIHVzZXJfc3JpZCk7CgoJLy8gdHdvIGNhc2VzIGhlcmUu
ICBPbmUsIGl0cyBhIHRhYmxlICh1c2Ugc2VsZWN0ICogZnJvbSB0YWJsZSkgb3RoZXJ3aXNlLCBq
dXN0IHVzZSB0aGUgc2VsZWN0IGNsYXVzZQoJc3ByaW50ZihzcWwsIlNFTEVDVCAqIEZST00gJXMg
TElNSVQgMCIsdGFibGVfbmFtZSk7IC8vIGF0dGVtcHQgdGhlIHF1ZXJ5LCBidXQgZG9udCBhY3R1
YWxseSBkbyBtdWNoICh0aGlzIG1pZ2h0IHRha2Ugc29tZSB0aW1lIGlmIHRoZXJlIGlzIGFuIG9y
ZGVyIGJ5ISkKCQoJcXVlcnlfcmVzdWx0ID0gUFFleGVjKGxheWVyaW5mby0+Y29ubiwgc3FsICk7
CiAgICBpZiAoIShxdWVyeV9yZXN1bHQpIHx8IFBRcmVzdWx0U3RhdHVzKHF1ZXJ5X3Jlc3VsdCkg
IT0gUEdSRVNfVFVQTEVTX09LKQogICAgewoJCWNoYXIgdG1wWzQwMDBdOwoKCQkJCXNwcmludGYo
dG1wLCAiRXJyb3IgZXhlY3V0aW5nIFBPU1RHSVMgIFNRTCAgIHN0YXRlbWVudCAoaW4gbXNQT1NU
R0lTTGF5ZXJHZXRJdGVtcyk6ICVzXG4tJXNcbiIsIHNxbCxQUWVycm9yTWVzc2FnZShsYXllcmlu
Zm8tPmNvbm4pICk7CgoKICAgICAgICAgIG1zU2V0RXJyb3IoTVNfUVVFUllFUlIsCgkJCQkgCURB
VEFFUlJPUk1FU1NBR0UoIiIsdG1wKSwKCQkJCQkibXNQT1NUR0lTTGF5ZXJHZXRJdGVtcygpIik7
CgogICAgICAgIFBRY2xlYXIocXVlcnlfcmVzdWx0KTsKCSAgCXF1ZXJ5X3Jlc3VsdCA9IE5VTEw7
CgkJcmV0dXJuKE1TX0ZBSUxVUkUpOwogICAgfQoKCWxheWVyLT5udW1pdGVtcyA9IFBRbmZpZWxk
cyhxdWVyeV9yZXN1bHQpLTE7IC8vZG9udCBpbmNsdWRlIHRoZSBnZW9tZXRyeSBjb2x1bW4KCWxh
eWVyLT5pdGVtcyA9IG1hbGxvYyAoc2l6ZW9mKGNoYXIgKikgKiAobGF5ZXItPm51bWl0ZW1zKzEp
ICk7IC8vICsxIGluY2FzZSB0aGVyZSBpcyBhIHByb2JsZW0gZmluZGluZyBnb2VvbWV0cnkgY29s
dW1uIAoJCQkJCQkJCQkJCQkJCQkJLy8gaXQgd2lsbCByZXR1cm4gYW4gZXJyb3IgaWYgdGhlcmUg
aXMgbm8gZ2VvbWV0cnkgY29sdW1uIGZvdW5kLAoJCQkJCQkJCQkJCQkJCQkJLy8gc28gdGhpcyBp
c250IGEgcHJvYmxlbQoJCgkJZm91bmRfZ2VvbSA9IDA7IC8vaGF2ZW50IGZvdW5kIHRoZSBnZW9t
IGZpZWxkCgkJaXRlbV9udW0gPSAwOwoJZm9yICh0PTA7dDxQUW5maWVsZHMocXVlcnlfcmVzdWx0
KTt0KyspCgl7CgkJY29sID0gUFFmbmFtZShxdWVyeV9yZXN1bHQsdCk7CgkJaWYgKHN0cmNtcChj
b2wsIGdlb21fY29sdW1uX25hbWUpICE9IDApIC8vIHRoaXMgaXNudCB0aGUgZ2VvbWV0cnkgY29s
dW1uCgkJewoJCQlsYXllci0+aXRlbXNbaXRlbV9udW1dID0gKGNoYXIqKW1hbGxvYyhzdHJsZW4o
Y29sKSsxKTsKCQkJc3RyY3B5KGxheWVyLT5pdGVtc1tpdGVtX251bV0sIGNvbCk7CgkJCWl0ZW1f
bnVtKys7CgkJfQoJCWVsc2UKCQl7CgkJCWZvdW5kX2dlb20gPSAxOwoJCX0KCX0KCVBRY2xlYXIo
cXVlcnlfcmVzdWx0KTsKCXF1ZXJ5X3Jlc3VsdCA9IE5VTEw7CglpZiAoIShmb3VuZF9nZW9tKSkK
CXsKCQljaGFyIHRtcFs0MDAwXTsKCgkJc3ByaW50Zih0bXAsICJtc1BPU1RHSVNMYXllckdldEl0
ZW1zOiB0cmllZCB0byBmaW5kIHRoZSBnZW9tZXRyeSBjb2x1bW4gaW4gdGhlIHJlc3VsdHMgZnJv
bSB0aGUgZGF0YWJhc2UsIGJ1dCBjb3VsZG50IGZpbmQgaXQuICBJcyBpdCBtaXNzLWNhcGl0aWFs
aXplZD8gJyVzJyIsIGdlb21fY29sdW1uX25hbWUgKTsKCgogICAgICAgICAgbXNTZXRFcnJvcihN
U19RVUVSWUVSUiwKCQkJCSAJdG1wLAoJCQkJCSJtc1BPU1RHSVNMYXllckdldEl0ZW1zKCkiKTsK
CiAgICAgICAgUFFjbGVhcihxdWVyeV9yZXN1bHQpOwoJICAJcXVlcnlfcmVzdWx0ID0gTlVMTDsK
CQlyZXR1cm4oTVNfRkFJTFVSRSk7Cgl9CgoKCglyZXR1cm4gbXNQT1NUR0lTTGF5ZXJJbml0SXRl
bUluZm8obGF5ZXIpOwp9CgoKLy93ZSByZXR1cm4gYW4gaW5maW5pdGUgZXh0ZW50Ci8vIHdlIGNv
dWxkIGNhbGwgdGhlIFNRTCBBR0dSRUdBVEUgZXh0ZW50KEdFT01FVFJZKSwgYnV0IHRoYXQgd291
bGQgdGFrZSBGT1JFVkVSCi8vIHRvIHJldHVybiAoaXQgaGFzIHRvIHJlYWQgdGhlIGVudGlyZSB0
YWJsZSkuCi8vIFNvLCB3ZSBqdXN0IHRlbGwgaXQgdGhhdCB3ZSdyZSBldmVyeXdoZXJlIGFuZCBs
ZXRzIHRoZSBzcGF0aWFsIGluZGV4aW5nIGZpZ3VyZSB0aGluZ3Mgb3V0IGZvciB1cwovLwovLyBO
ZXZlciBzZWVuIHRoaXMgZnVuY3Rpb24gYWN0dWFsbHkgY2FsbGVkCmludCBtc1BPU1RHSVNMYXll
ckdldEV4dGVudChsYXllck9iaiAqbGF5ZXIsIHJlY3RPYmogKmV4dGVudCkKewovL2ZwcmludGYo
c3RkZXJyLCJtc1BPU1RHSVNMYXllckdldEV4dGVudCBjYWxsZWRcbiIpOwoKCgoKCgoJZXh0ZW50
LT5taW54ID0gZXh0ZW50LT5taW55ID0gIC0xLjAqRkxUX01BWCA7CglleHRlbnQtPm1heHggPSBl
eHRlbnQtPm1heHkgPSAgRkxUX01BWDsKCglyZXR1cm4oTVNfU1VDQ0VTUyk7CgoKCQkvL3RoaXMg
c2hvdWxkIGdldCB0aGUgcmVhbCBleHRlbnRzLGJ1dCBpdCByZXF1aXJlcyBhIHRhYmxlIHJlYWQK
CQkvLyB1bmZvcnVuYXRlbHksIHRoZXJlIGlzIG5vIHdheSB0byBjYWxsIHRoaXMgZnVuY3Rpb24g
ZnJvbSBtYXBzY3JpcHQsIHNvIGl0cwoJCS8vIHByZXR0eSB1c2VsZXNzLiAgVW50ZXN0ZWQgc2lu
Y2UgeW91IGNhbm5vdCBhY3R1YWxseSBjYWxsIGl0LgoKLyoKClBHcmVzdWx0ICAgKnF1ZXJ5X3Jl
c3VsdDsKCWNoYXIJCXNxbFs1MDAwXTsKCgltc1BPU1RHSVNMYXllckluZm8gKmxheWVyaW5mbzsK
CiAgIGNoYXIgICAgdGFibGVfbmFtZVs1MDAwXTsKICAgICAgY2hhciAgICBnZW9tX2NvbHVtbl9u
YW1lWzUwMDBdOwogICAgICBjaGFyICAgIHVyaWRfbmFtZVs1MDAwXTsKICAgIGNoYXIgICAgdXNl
cl9zcmlkWzUwMDBdOwoJaWYgKGxheWVyID09IE5VTEwpCgl7CgkJCQljaGFyIHRtcFs1MDAwXTsK
CgkJCQlzcHJpbnRmKHRtcCwgImxheWVyIGlzIG51bGwgLSBoYXZlIHlvdSBvcGVuZWQgdGhlIGxh
eWVyIHlldD8iKTsKCQkgICAgICAgIAltc1NldEVycm9yKE1TX1FVRVJZRVJSLCB0bXAsCgkJICAg
ICAgICAgICAgICAgICAibXNQT1NUR0lTTGF5ZXJHZXRFeHRlbnQoKSIpOwoKCQlyZXR1cm4oTVNf
RkFJTFVSRSk7Cgl9CgoKCiAgbGF5ZXJpbmZvID0gKG1zUE9TVEdJU0xheWVySW5mbyAqKSBsYXll
ci0+cG9zdGdpc2xheWVyaW5mbzsKCiAgIG1zUE9TVEdJU0xheWVyUGFyc2VEYXRhKGxheWVyLT5k
YXRhLCBnZW9tX2NvbHVtbl9uYW1lLHRhYmxlX25hbWUsIHVyaWRfbmFtZSx1c2VyX3NyaWQpOwoK
ICAgc3ByaW50ZihzcWwsInNlbGVjdCBleHRlbnQoJXMpIGZyb20gJXMiLCBnZW9tX2NvbHVtbl9u
YW1lLHRhYmxlX25hbWUpOwoKCglpZiAobGF5ZXJpbmZvLT5jb25uID09IE5VTEwpCgl7CgkJCQlj
aGFyIHRtcFs1MDAwXTsKCgkJCQlzcHJpbnRmKHRtcCwgImxheWVyIGRvZXNudCBoYXZlIGEgcG9z
dGdpcyBjb25uZWN0aW9uIC0gaGF2ZSB5b3Ugb3BlbmVkIHRoZSBsYXllciB5ZXQ/Iik7CgkJICAg
ICAgICAJbXNTZXRFcnJvcihNU19RVUVSWUVSUiwgdG1wLAoJCSAgICAgICAgICAgICAgICAgIm1z
UE9TVEdJU0xheWVyR2V0RXh0ZW50KCkiKTsKCgkJcmV0dXJuKE1TX0ZBSUxVUkUpOwoJfQoKCgog
IAlxdWVyeV9yZXN1bHQgPSBQUWV4ZWMobGF5ZXJpbmZvLT5jb25uLCBzcWwpOwogICAgaWYgKCEo
cXVlcnlfcmVzdWx0KSB8fCBQUXJlc3VsdFN0YXR1cyhxdWVyeV9yZXN1bHQpICE9ICBQR1JFU19U
VVBMRVNfT0spCiAgICB7CgkJY2hhciB0bXBbNTAwMF07CgoJCXNwcmludGYodG1wLCAiRXJyb3Ig
ZXhlY3V0aW5nIFBPU1RHSVMgIFNRTCAgIHN0YXRlbWVudCAoaW4gbXNQT1NUR0lTTGF5ZXJHZXRF
eHRlbnQpOiAlcyIsIGxheWVyaW5mby0+c3FsKTsKICAgICAgICAJbXNTZXRFcnJvcihNU19RVUVS
WUVSUiwgdG1wLAogICAgICAgICAgICAgICAgICJtc1BPU1RHSVNMYXllckdldEV4dGVudCgpIik7
CgogICAgICAgIAlQUWNsZWFyKHF1ZXJ5X3Jlc3VsdCk7CgkJcmV0dXJuKE1TX0ZBSUxVUkUpOwog
ICAgfQoKCWlmIChQUW50dXBsZXMocXVlcnlfcmVzdWx0KSAhPSAxKQoJewoJCQkJY2hhciB0bXBb
NTAwMF07CgoJCQkJc3ByaW50Zih0bXAsICJFcnJvciBleGVjdXRpbmcgUE9TVEdJUyAgU1FMICAg
c3RhdGVtZW50IChpbiBtc1BPU1RHSVNMYXllckdldEV4dGVudCkgW2RvZXNudCBoYXZlIGV4YWN0
bHkgMSByZXN1bHRdOiAlcyIsIGxheWVyaW5mby0+c3FsKTsKCQkgICAgICAgIAltc1NldEVycm9y
KE1TX1FVRVJZRVJSLCB0bXAsCgkJICAgICAgICAgICAgICAgICAibXNQT1NUR0lTTGF5ZXJHZXRF
eHRlbnQoKSIpOwoKCQkgICAgICAgIAlQUWNsZWFyKHF1ZXJ5X3Jlc3VsdCk7CgkJcmV0dXJuKE1T
X0ZBSUxVUkUpOwoJfQoKCXNzY2FuZihQUWdldHZhbHVlKHF1ZXJ5X3Jlc3VsdCwwLDApLCIlbGYg
JWxmICVsZiAlbGYiLCAmZXh0ZW50LT5taW54LCZleHRlbnQtPm1pbnksJmV4dGVudC0+bWF4eCwm
ZXh0ZW50LT5tYXh5ICk7CgoJUFFjbGVhcihxdWVyeV9yZXN1bHQpOwoJKi8KCn0KCi8qIEZ1bmN0
aW9uIHRvIHBhcnNlIHRoZSBNYXBzZXJ2ZXIgREFUQSBwYXJhbWV0ZXIgZm9yIGdlb21ldHJ5CiAq
IGNvbHVtbiBuYW1lLCB0YWJsZSBuYW1lIGFuZCBuYW1lIG9mIGEgY29sdW1uIHRvIHNlcnZlIGFz
IGEKICogdW5pcXVlIHJlY29yZCBpZAogKi8KCmludCBtc1BPU1RHSVNMYXllclBhcnNlRGF0YShj
aGFyICpkYXRhLCBjaGFyICpnZW9tX2NvbHVtbl9uYW1lLAoJY2hhciAqdGFibGVfbmFtZSwgY2hh
ciAqdXJpZF9uYW1lLGNoYXIgKnVzZXJfc3JpZCkKewoJY2hhciAqcG9zX29wdCwgKnBvc19zY24s
ICp0bXAsICpwb3Nfc3JpZDsKCWludCAJc2xlbmd0aDsKCgoKCgoJLyogZ2l2ZW4gYSBzdHJpbmcg
b2YgdGhlIGZyb20gJ2dlb20gZnJvbSBjdGl2YWx1ZXMnIG9yICdnZW9tIGZyb20gKCkgYXMgZm9v
JwoJICogcmV0dXJuIGdlb21fY29sdW1uX25hbWUgYXMgJ2dlb20nCgkgKiBhbmQgdGFibGUgbmFt
ZSBhcyAnY3RpdmFsdWVzJyBvciAnZ2VvbSBmcm9tICgpIGFzIGZvbycKCSAqLwoKCS8qIEZpcnN0
IGxvb2sgZm9yIHRoZSBvcHRpb25hbCAnIHVzaW5nIHVuaXF1ZSBJRCcgc3RyaW5nICovCglwb3Nf
b3B0ID0gc3Ryc3RySWdub3JlQ2FzZShkYXRhLCAiIHVzaW5nIHVuaXF1ZSAiKTsKCWlmIChwb3Nf
b3B0ID09IE5VTEwpIHsKCQkvKiBObyB1c2VyIHNwZWNpZmllZCB1bmlxdWUgaWQgc28gd2Ugd2ls
bCB1c2UgdGhlIFBvc3RnZXNxbCBPSUQgKi8KCQlzdHJjcHkodXJpZF9uYW1lLCAiT0lEIik7Cgl9
CgllbHNlIHsKCQkvLyBDSEFOR0UgLSBwcm90ZWN0IHRoZSB0cmFpbGluZyBlZGdlIGZvciB0aGlu
ZyBsaWtlICd1c2luZyB1bmlxdWUgZnRhYl9pZCB1c2luZyBzcmlkPTMzJwoJCXRtcCA9IHN0cnN0
cihwb3Nfb3B0ICsgMTQsIiAiKTsKCQlpZiAodG1wID09IE5VTEwpIC8vaXQgbG9va2VzIGxpa2Ug
J3VzaW5nIHVuaXF1ZSBmdGFiX2lkJwoJCXsKCQkJc3RyY3B5KHVyaWRfbmFtZSwgcG9zX29wdCAr
IDE0KTsKCQl9CgkJZWxzZQoJCXsKCQkJLy9sb29rcyBsaWtlICcgdXNpbmcgdW5pcXVlIGZ0YWJf
aWQgJyAoc3BhY2UgYXQgZW5kKQoJCQlzdHJuY3B5KHVyaWRfbmFtZSwgcG9zX29wdCArIDE0LCB0
bXAtKHBvc19vcHQgKyAxNCAgKSApOwoJCQl1cmlkX25hbWVbdG1wLShwb3Nfb3B0ICsgMTQpXSA9
IDA7IC8vIG51bGwgdGVybWluYXRlIGl0CgkJfQoKCX0KCglwb3Nfc3JpZCA9IHN0cnN0cklnbm9y
ZUNhc2UoZGF0YSwiIHVzaW5nIFNSSUQ9Iik7CglpZiAocG9zX3NyaWQgPT0gTlVMTCkKCXsKCQl1
c2VyX3NyaWRbMF0gPSAwOyAvLyA9ICIiCgl9CgllbHNlCgl7CgkJLy9maW5kIHRoZSBzcmlkCgkJ
c2xlbmd0aD1zdHJzcG4ocG9zX3NyaWQrMTIsIi0wMTIzNDU2Nzg5Iik7CgkJaWYgKHNsZW5ndGgg
PT0gMCkKCQl7CgkJCW1zU2V0RXJyb3IoTVNfUVVFUllFUlIsCgkJCQkJREFUQUVSUk9STUVTU0FH
RShkYXRhLCJFcnJvciBwYXJzaW5nIFBPU1RHSVMgZGF0YSB2YXJpYWJsZTogWW91IHNwZWNpZmll
ZCAndXNpbmcgU1JJRD0jJyBidXQgZGlkbnQgaGF2ZSBhbnkgbnVtYmVycyE8YnI+PGJyPlxuXG5N
b3JlIEhlbHA6PGJyPjxicj5cblxuIiksCgkJCQkJIm1zUE9TVEdJU0xheWVyUGFyc2VEYXRhKCki
KTsKCgkJCXJldHVybihNU19GQUlMVVJFKTsKCQl9CgkJZWxzZQoJCXsKCQkJc3RybmNweSh1c2Vy
X3NyaWQscG9zX3NyaWQrMTIsc2xlbmd0aCk7CgkJCXVzZXJfc3JpZFtzbGVuZ3RoXSA9IDA7IC8v
IG51bGwgdGVybWluYXRlIGl0CgkJfQoJfQoKCgkvLyB0aGlzIGlzIGEgbGl0dGxlIGhhY2sgc28g
dGhlIHJlc3Qgb2YgdGhlIGNvZGUgd29ya3MuICBJZiB0aGUgJyB1c2luZyBTUklEPScgY29tZXMg
YmVmb3JlCgkvLyB0aGUgJyB1c2luZyB1bmlxdWUgJywgdGhlbiBtYWtlIHN1cmUgcG9zX29wdCBw
b2ludHMgdG8gd2hlcmUgdGhlICcgdXNpbmcgU1JJRCcgc3RhcnRzIQoKCWlmIChwb3Nfb3B0ID09
IE5VTEwpCgl7CgkJcG9zX29wdCA9IHBvc19zcmlkOwoJfQoJZWxzZQoJewoJCWlmIChwb3Nfc3Jp
ZCAhPSBOVUxMKQoJCXsKCQkJaWYgKHBvc19vcHQ+cG9zX3NyaWQpCgkJCQlwb3Nfb3B0ID0gcG9z
X3NyaWQ7CgkJfQoKCX0KCgkvKiBTY2FuIGZvciB0aGUgdGFibGUgb3Igc3ViLXNlbGVjdCBjbGF1
c2UgKi8KCXBvc19zY24gPSBzdHJzdHIoZGF0YSwgIiBmcm9tICIpOwoJaWYgKHBvc19zY24gPT0g
TlVMTCkgewoJCW1zU2V0RXJyb3IoTVNfUVVFUllFUlIsCgkJCQkJREFUQUVSUk9STUVTU0FHRShk
YXRhLCJFcnJvciBwYXJzaW5nIFBPU1RHSVMgZGF0YSB2YXJpYWJsZS4gIE11c3QgY29udGFpbiAn
Z2VvbWV0cnlfY29sdW1uIGZyb20gdGFibGVfbmFtZScgb3IgJ2dlb20gZnJvbSAoc3Vic2VsZWN0
KSBhcyBmb28nIChjb3VsZG50IGZpbmQgJyBmcm9tICcpLiAgTW9yZSBoZWxwOiA8YnI+PGJyPlxu
XG4iKSwKCQkJCQkibXNQT1NUR0lTTGF5ZXJQYXJzZURhdGEoKSIpOwoKCQkvL21zU2V0RXJyb3Io
TVNfUVVFUllFUlIsICJFcnJvciBwYXJzaW5nIFBPU1RHSVMgZGF0YSB2YXJpYWJsZS4gIE11c3Qg
Y29udGFpbiAnZ2VvbWV0cnlfY29sdW1uIGZyb20gdGFibGVfbmFtZScgb3IgJ2dlb20gZnJvbSAo
c3Vic2VsZWN0KSBhcyBmb28nIChjb3VsZG50IGZpbmQgJyBmcm9tICcpLiIsICJtc1BPU1RHSVNM
YXllclBhcnNlRGF0YSgpIik7CgkJcmV0dXJuKE1TX0ZBSUxVUkUpOwoJfQoKCS8qIENvcHkgdGhl
IGdlb21ldHJ5IGNvbHVtbiBuYW1lICovCgltZW1jcHkoZ2VvbV9jb2x1bW5fbmFtZSwgZGF0YSwg
KHBvc19zY24pLShkYXRhKSk7CglnZW9tX2NvbHVtbl9uYW1lWyhwb3Nfc2NuKS0oZGF0YSldID0g
MDsgLy9udWxsIHRlcm1pbmF0ZSBpdAoKCS8qIENvcHkgb3V0IHRoZSB0YWJsZSBuYW1lIG9yIHN1
Yi1zZWxlY3QgY2xhdXNlICovCglpZiAocG9zX29wdCA9PSBOVUxMKSB7CgkJc3RyY3B5KHRhYmxl
X25hbWUsIHBvc19zY24gKyA2KTsJLy90YWJsZSBuYW1lIG9yIHN1Yi1zZWxlY3QgY2xhdXNlCgl9
CgllbHNlIHsKCQlzdHJuY3B5KHRhYmxlX25hbWUsIHBvc19zY24gKyA2LCAocG9zX29wdCkgLSAo
cG9zX3NjbiArIDYpKTsKCQl0YWJsZV9uYW1lWyhwb3Nfb3B0KSAtIChwb3Nfc2NuICsgNildID0g
MDsgLy9udWxsIHRlcm1pbmF0ZSBpdAoJfQoKCWlmICggKHN0cmxlbih0YWJsZV9uYW1lKSA8IDEg
KSB8fCAgKHN0cmxlbihnZW9tX2NvbHVtbl9uYW1lKSA8IDEgKSApIHsKCQltc1NldEVycm9yKE1T
X1FVRVJZRVJSLAoJCQkJCURBVEFFUlJPUk1FU1NBR0UoZGF0YSwiRXJyb3IgcGFyc2luZyBQT1NU
R0lTIGRhdGEgdmFyaWFibGUuICBNdXN0IGNvbnRhaW4gJ2dlb21ldHJ5X2NvbHVtbiBmcm9tIHRh
YmxlX25hbWUnIG9yICdnZW9tIGZyb20gKHN1YnNlbGVjdCkgYXMgZm9vJyAoY291bGRudCBmaW5k
IGEgZ2VvbWV0cnlfY29sdW1uIG9yIHRhYmxlL3N1YnNlbGVjdCkuICBNb3JlIGhlbHA6IDxicj48
YnI+XG5cbiIpLAoJCQkJCSJtc1BPU1RHSVNMYXllclBhcnNlRGF0YSgpIik7CgkJcmV0dXJuKE1T
X0ZBSUxVUkUpOwoJfQovL3ByaW50ZigibXNQT1NUR0lTTGF5ZXJQYXJzZURhdGE6IHVuaXF1ZSBj
b2x1bW4gPSAlcywgc3JpZD0nJXMnLCBnZW9tX2NvbHVtbl9uYW1lID0gJXMsIHRhYmxlX25hbWU9
JXNcbiIsIHVyaWRfbmFtZSx1c2VyX3NyaWQsZ2VvbV9jb2x1bW5fbmFtZSx0YWJsZV9uYW1lKTsK
CXJldHVybihNU19TVUNDRVNTKTsKfQoKI2Vsc2UKCi8vcHJvdG90eXBlcyBpZiBwb3N0Z2lzIGlz
bnQgc3VwcG9zZWQgdG8gYmUgY29tcGlsZWQKCmludCBtc1BPU1RHSVNMYXllck9wZW4obGF5ZXJP
YmogKmxheWVyKQp7CgkJbXNTZXRFcnJvcihNU19RVUVSWUVSUiwgIm1zUE9TVEdJU0xheWVyT3Bl
biBjYWxsZWQgYnV0IHVuaW1wbGVtZW50ZWQhICAobWFwc2VydmVyIG5vdCBjb21waWxlZCB3aXRo
IHBvc3RnaXMgc3VwcG9ydCkiLAogICAgICAgICAgICAgICAgICJtc1BPU1RHSVNMYXllck9wZW4o
KSIpOwoJCXJldHVybihNU19GQUlMVVJFKTsKfQoKdm9pZCBtc1BPU1RHSVNMYXllckZyZWVJdGVt
SW5mbyhsYXllck9iaiAqbGF5ZXIpCnsKCQltc1NldEVycm9yKE1TX1FVRVJZRVJSLCAibXNQT1NU
R0lTTGF5ZXJGcmVlSXRlbUluZm8gY2FsbGVkIGJ1dCB1bmltcGxlbWVudGVkIShtYXBzZXJ2ZXIg
bm90IGNvbXBpbGVkIHdpdGggcG9zdGdpcyBzdXBwb3J0KSIsCiAgICAgICAgICAgICAgICAgIm1z
UE9TVEdJU0xheWVyRnJlZUl0ZW1JbmZvKCkiKTsKfQppbnQgbXNQT1NUR0lTTGF5ZXJJbml0SXRl
bUluZm8obGF5ZXJPYmogKmxheWVyKQp7CgkJbXNTZXRFcnJvcihNU19RVUVSWUVSUiwgIm1zUE9T
VEdJU0xheWVySW5pdEl0ZW1JbmZvIGNhbGxlZCBidXQgdW5pbXBsZW1lbnRlZCEobWFwc2VydmVy
IG5vdCBjb21waWxlZCB3aXRoIHBvc3RnaXMgc3VwcG9ydCkiLAogICAgICAgICAgICAgICAgICJt
c1BPU1RHSVNMYXllckluaXRJdGVtSW5mbygpIik7CgkJcmV0dXJuKE1TX0ZBSUxVUkUpOwp9Cmlu
dCBtc1BPU1RHSVNMYXllcldoaWNoU2hhcGVzKGxheWVyT2JqICpsYXllciwgcmVjdE9iaiByZWN0
KQp7CgkJbXNTZXRFcnJvcihNU19RVUVSWUVSUiwgIm1zUE9TVEdJU0xheWVyV2hpY2hTaGFwZXMg
Y2FsbGVkIGJ1dCB1bmltcGxlbWVudGVkIShtYXBzZXJ2ZXIgbm90IGNvbXBpbGVkIHdpdGggcG9z
dGdpcyBzdXBwb3J0KSIsCiAgICAgICAgICAgICAgICAgIm1zUE9TVEdJU0xheWVyV2hpY2hTaGFw
ZXMoKSIpOwoJCXJldHVybihNU19GQUlMVVJFKTsKfQoKaW50IG1zUE9TVEdJU0xheWVyQ2xvc2Uo
bGF5ZXJPYmogKmxheWVyKQp7CgkJbXNTZXRFcnJvcihNU19RVUVSWUVSUiwgIm1zUE9TVEdJU0xh
eWVyQ2xvc2UgY2FsbGVkIGJ1dCB1bmltcGxlbWVudGVkIShtYXBzZXJ2ZXIgbm90IGNvbXBpbGVk
IHdpdGggcG9zdGdpcyBzdXBwb3J0KSIsCiAgICAgICAgICAgICAgICAgIm1zUE9TVEdJU0xheWVy
Q2xvc2UoKSIpOwoJCXJldHVybihNU19GQUlMVVJFKTsKfQoKaW50IG1zUE9TVEdJU0xheWVyTmV4
dFNoYXBlKGxheWVyT2JqICpsYXllciwgc2hhcGVPYmogKnNoYXBlKQp7CgkJbXNTZXRFcnJvcihN
U19RVUVSWUVSUiwgIm1zUE9TVEdJU0xheWVyTmV4dFNoYXBlIGNhbGxlZCBidXQgdW5pbXBsZW1l
bnRlZCEobWFwc2VydmVyIG5vdCBjb21waWxlZCB3aXRoIHBvc3RnaXMgc3VwcG9ydCkiLAogICAg
ICAgICAgICAgICAgICJtc1BPU1RHSVNMYXllck5leHRTaGFwZSgpIik7CgkJcmV0dXJuKE1TX0ZB
SUxVUkUpOwp9CgppbnQgbXNQT1NUR0lTTGF5ZXJHZXRTaGFwZShsYXllck9iaiAqbGF5ZXIsIHNo
YXBlT2JqICpzaGFwZSwgbG9uZyByZWNvcmQpCnsKCQltc1NldEVycm9yKE1TX1FVRVJZRVJSLCAi
bXNQT1NUR0lTTGF5ZXJHZXRTaGFwZSBjYWxsZWQgYnV0IHVuaW1wbGVtZW50ZWQhKG1hcHNlcnZl
ciBub3QgY29tcGlsZWQgd2l0aCBwb3N0Z2lzIHN1cHBvcnQpIiwKICAgICAgICAgICAgICAgICAi
bXNQT1NUR0lTTGF5ZXJHZXRTaGFwZSgpIik7CgkJcmV0dXJuKE1TX0ZBSUxVUkUpOwp9CgppbnQg
bXNQT1NUR0lTTGF5ZXJHZXRFeHRlbnQobGF5ZXJPYmogKmxheWVyLCByZWN0T2JqICpleHRlbnQp
CnsKCQltc1NldEVycm9yKE1TX1FVRVJZRVJSLCAibXNQT1NUR0lTTGF5ZXJHZXRFeHRlbnQgY2Fs
bGVkIGJ1dCB1bmltcGxlbWVudGVkIShtYXBzZXJ2ZXIgbm90IGNvbXBpbGVkIHdpdGggcG9zdGdp
cyBzdXBwb3J0KSIsCiAgICAgICAgICAgICAgICAgIm1zUE9TVEdJU0xheWVyR2V0RXh0ZW50KCki
KTsKCQlyZXR1cm4oTVNfRkFJTFVSRSk7Cn0KCmludCBtc1BPU1RHSVNMYXllckdldFNoYXBlUmFu
ZG9tKGxheWVyT2JqICpsYXllciwgc2hhcGVPYmogKnNoYXBlLCBsb25nICpyZWNvcmQpCnsKCQlt
c1NldEVycm9yKE1TX1FVRVJZRVJSLCAibXNQT1NUR0lTTGF5ZXJHZXRTaGFwZVJhbmRvbSBjYWxs
ZWQgYnV0IHVuaW1wbGVtZW50ZWQhKG1hcHNlcnZlciBub3QgY29tcGlsZWQgd2l0aCBwb3N0Z2lz
IHN1cHBvcnQpIiwKICAgICAgICAgICAgICAgICAibXNQT1NUR0lTTGF5ZXJHZXRTaGFwZVJhbmRv
bSgpIik7CgkJcmV0dXJuKE1TX0ZBSUxVUkUpOwp9CgppbnQgbXNQT1NUR0lTTGF5ZXJHZXRJdGVt
cyhsYXllck9iaiAqbGF5ZXIpCnsKCQltc1NldEVycm9yKE1TX1FVRVJZRVJSLCAibXNQT1NUR0lT
TGF5ZXJHZXRJdGVtcyBjYWxsZWQgYnV0IHVuaW1wbGVtZW50ZWQhKG1hcHNlcnZlciBub3QgY29t
cGlsZWQgd2l0aCBwb3N0Z2lzIHN1cHBvcnQpIiwKICAgICAgICAgICAgICAgICAibXNQT1NUR0lT
TGF5ZXJHZXRJdGVtcygpIik7CgkJcmV0dXJuKE1TX0ZBSUxVUkUpOwp9CgoKLy8gZW5kIGFib3Zl
J3MgI2lmZGVmIFVTRV9QT1NUR0lTCiNlbmRpZgo=

------_=_NextPart_001_01C3E136.1B97F4E3--



More information about the mapserver-users mailing list