FIXED: Form fields not parsed with encoding multipart/form-data encoding
[email protected] Sat, 23 Jun 2012 15:15:17 -0700
| Newsgroups | gmane.comp.gcc.cgicc.bugs |
|---|---|
| Message-ID | <[email protected]> |
This is a message in Mime Format. If you see this, your mail reader does not support this format.
--=_c76f213f5c6f1eb6ca6970650c0736ae
Content-Type: multipart/alternative;
boundary="=_c89f38ecc70dee8f13c793d16d299948"
Content-Transfer-Encoding: 8bit
--=_c89f38ecc70dee8f13c793d16d299948
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
=0A=0A=09Dear mailing list:=0A=0A=09After debugging the source code of G=
NU cgicc version 3.2 to determine=0Awhy form fields were not being parse=
d when an HTML INPUT type=3Dfile was=0Apresent, the problem was finally=
traced down to the following code=0A(fixed code displayed below):=0A=0A=
=09In file Cgicc.cpp ...=0A=0A=09CGICCNS MultipartHeader=0ACGICCNS Cgicc=
::parseHeader(const STDNS string& data)=0A{=0A=C2=A0 =C2=A0 STDNS string=
disposition;=0A=C2=A0 =C2=A0 disposition =3D extractBetween(data, "Cont=
ent-Disposition: ",=0A";");=0A=0A=C2=A0 =C2=A0 STDNS string name;=0A=C2=
=A0 =C2=A0 name =3D extractBetween(data, "name=3D"", """);=0A=0A=C2=A0=
=C2=A0 STDNS string filename;=0A=C2=A0 =C2=A0 STDNS string cType;=0A=C2=
=A0 =C2=A0 if (data.find("filename=3D") !=3D STDNS string::npos) {=0A=C2=
=A0 =C2=A0 =C2=A0 filename =3D extractBetween(data, "filename=3D"", """)=
;=0A=C2=A0 =C2=A0 =C2=A0 cType =3D extractBetween(data, "Content-Type: "=
, "rnrn");=0A=C2=A0 =C2=A0 }=0A=0A=09=C2=A0 // This is hairy: Netscape a=
nd IE don't encode the filenames=0A=C2=A0 // The RFC says they should be=
encoded, so I will assume they are.=0A=C2=A0 =C2=A0 filename =3D unesca=
peString(filename);=0A=0A=C2=A0 =C2=A0 return MultipartHeader(dispositio=
n, name, filename, cType);=0A}=0A=0A=09The fix was the addition of the "=
if (data.find("filename=3D") !=3D ...=0Awraparound code since the check=
in the routine parseMIME() was getting=0Acrud data in the head.getFilen=
ame() comparison.=0A=0A=09Now form fields are being processed properly w=
hen an HTML form uses=0Athe multipart/form-data encoding type.=0A=0A=09A=
s a side note, when the option --enable-debug-logging is supplied to=0Ac=
onfigure the sources contrib/nph-login.cpp and contrib/nph-hello.cpp=0Ad=
o not compile because the DEBUG logic =C2=A0is missing the STDNS=0Aquali=
fier. The fixed code is below (which also removes the=0Anon-existing pat=
h in front of the cgicc.log filename) so now the log=0Afile appears in t=
he current working directory.=0A=0A=09// To use the debug logging featur=
e, the variable gLogFile MUST be=0A// defined, and it _must_ be an ofstr=
eam=0A#if DEBUG=0A STDNS ofstream gLogFile ("cgicc.log", STDNS ios::app)=
;=0A#endif=0A=0A=09The fixed Cgicc.cpp & nph-hello.cpp & nph-login.cpp s=
ource files are=0Aattached.=0A=0A=09Regards, Tom Straub=0A=0A
--=_c89f38ecc70dee8f13c793d16d299948
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<html><body style=3D"font-family: 'Helvetica Neue',Helvetica,Arial,sans-=
serif; font-size: 12px;"><p>Dear mailing list:<br /></p><p>After debuggi=
ng the source code of GNU cgicc version 3.2 to determine why form fields=
were not being parsed when an HTML INPUT type=3Dfile was present, the p=
roblem was finally traced down to the following code (fixed code display=
ed below):</p><p>In file Cgicc.cpp ...</p><p>CGICCNS MultipartHeader<br=
/>CGICCNS Cgicc::parseHeader(const STDNS string& data)<br />{<br />=
=C2=A0 =C2=A0 STDNS string disposition;<br />=C2=A0 =C2=A0 disposition=
=3D extractBetween(data, "Content-Disposition: ", ";");<br /><br />=C2=
=A0 =C2=A0 STDNS string name;<br />=C2=A0 =C2=A0 name =3D extractBetween=
(data, "name=3D\"", "\"");<br /><br />=C2=A0 =C2=A0 STDNS string filenam=
e;<br />=C2=A0 =C2=A0 STDNS string cType;<br />=C2=A0 =C2=A0 if (data.fi=
nd("filename=3D") !=3D STDNS string::npos) {<br />=C2=A0 =C2=A0 =C2=A0=
filename =3D extractBetween(data, "filename=3D\"", "\"");<br />=C2=A0 =
=C2=A0 =C2=A0 cType =3D extractBetween(data, "Content-Type: ", "\r\n\r=
\n");<br />=C2=A0 =C2=A0 }</p><p>=C2=A0 // This is hairy: Netscape and I=
E don't encode the filenames<br />=C2=A0 // The RFC says they should be=
encoded, so I will assume they are.<br />=C2=A0 =C2=A0 filename =3D une=
scapeString(filename);<br /><br />=C2=A0 =C2=A0 return MultipartHeader(d=
isposition, name, filename, cType);<br />}<br /><br /></p><p>The fix was=
the addition of the "if (data.find("filename=3D") !=3D ... wraparound c=
ode since the check in the routine parseMIME() was getting crud data in=
the head.getFilename() comparison.</p><p>Now form fields are being proc=
essed properly when an HTML form uses the multipart/form-data encoding t=
ype.</p><p>As a side note, when the option --enable-debug-logging is sup=
plied to configure the sources contrib/nph-login.cpp and contrib/nph-hel=
lo.cpp do not compile because the DEBUG logic =C2=A0is missing the STDNS=
qualifier. The fixed code is below (which also removes the non-existing=
path in front of the cgicc.log filename) so now the log file appears in=
the current working directory.</p><p>// To use the debug logging featur=
e, the variable gLogFile MUST be<br />// defined, and it _must_ be an of=
stream<br />#if DEBUG<br /> STDNS ofstream gLogFile ("cgicc.log", STDNS=
ios::app);<br />#endif<br /><br /></p><p>The fixed Cgicc.cpp & nph-=
hello.cpp & nph-login.cpp source files are attached.</p><p>Regards,=
Tom Straub</p><p><br /></p></body></html>
--=_c89f38ecc70dee8f13c793d16d299948--
--=_c76f213f5c6f1eb6ca6970650c0736ae
Content-Type: application/octet-stream
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="=?UTF-8?B?Q2dpY2MuY3Bw?="
LyoKICogICRJZDogQ2dpY2MuY3BwLHYgMS4xMCAyMDAxLzA5LzAzIDE2OjE5OjUxIHNib290
aCBFeHAgJAogKgogKiAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAy
MDAwLCAyMDAxIFN0ZXBoZW4gRi4gQm9vdGgKICoKICogIFRoaXMgbGlicmFyeSBpcyBmcmVl
IHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogIG1vZGlmeSBp
dCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICog
IExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247
IGVpdGhlcgogKiAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9w
dGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJp
YnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogIGJ1dCBXSVRI
T1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9m
CiAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBP
U0UuICBTZWUgdGhlIEdOVQogKiAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9y
IG1vcmUgZGV0YWlscy4KICoKICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkg
b2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogIExpY2Vuc2UgYWxvbmcgd2l0
aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICog
IEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24s
IE1BICAwMjExMS0xMzA3ICBVU0EKICovCgojaWZkZWYgX19HTlVHX18KIyAgcHJhZ21hIGlt
cGxlbWVudGF0aW9uCiNlbmRpZgoKI2luY2x1ZGUgPG5ldz4KI2luY2x1ZGUgPGFsZ29yaXRo
bT4KI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiNpbmNsdWRlIDxpdGVyYXRvcj4KCiNpZiAoSEFW
RV9TWVNfVElNRV9IICYmIFRNX0lOX1NZU19USU1FKQojaW5jbHVkZSA8c3lzL3RpbWUuaD4K
I2Vsc2UKI2luY2x1ZGUgPHRpbWUuaD4KI2VuZGlmCgojaW5jbHVkZSAiY2dpY2MvQ2dpVXRp
bHMuaCIKI2luY2x1ZGUgImNnaWNjL0NnaWNjLmgiCgoKQ0dJQ0NfQkVHSU5fTkFNRVNQQUNF
CgovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLy8gQ2xhc3MgRkVfbmFtZUNvbXBhcmUKLy8gPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmNsYXNzIEZF
X25hbWVDb21wYXJlIDogcHVibGljIFNURE5TIHVuYXJ5X2Z1bmN0aW9uPEZvcm1FbnRyeSwg
Ym9vbD4KewpwdWJsaWM6CiAgCiAgaW5saW5lIGV4cGxpY2l0IEZFX25hbWVDb21wYXJlKGNv
bnN0IFNURE5TIHN0cmluZyYgbmFtZSkKICAgIDogZk5hbWUobmFtZSkge30KICAKICBpbmxp
bmUgYm9vbCBvcGVyYXRvcigpIChjb25zdCBGb3JtRW50cnkmIGVudHJ5KSAJY29uc3QKICAg
IHsgcmV0dXJuIHN0cmluZ3NBcmVFcXVhbChmTmFtZSwgZW50cnkuZ2V0TmFtZSgpKTsgfQog
IApwcml2YXRlOgogIFNURE5TIHN0cmluZyBmTmFtZTsKfTsKCi8vID09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBDbGFz
cyBGRV92YWx1ZUNvbXBhcmUKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09CmNsYXNzIEZFX3ZhbHVlQ29tcGFyZSA6IHB1
YmxpYyBTVEROUyB1bmFyeV9mdW5jdGlvbjxGb3JtRW50cnksIGJvb2w+CnsKcHVibGljOgog
IAogIGlubGluZSBleHBsaWNpdCBGRV92YWx1ZUNvbXBhcmUoY29uc3QgU1RETlMgc3RyaW5n
JiB2YWx1ZSkKICAgIDogZlZhbHVlKHZhbHVlKSB7fQogIAogIGlubGluZSBib29sIG9wZXJh
dG9yKCkgKGNvbnN0IEZvcm1FbnRyeSYgZW50cnkpIAljb25zdAogICAgeyByZXR1cm4gc3Ry
aW5nc0FyZUVxdWFsKGZWYWx1ZSwgZW50cnkuZ2V0VmFsdWUoKSk7IH0KICAKcHJpdmF0ZToK
ICBTVEROUyBzdHJpbmcgZlZhbHVlOwp9OwoKCi8vID09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBDbGFzcyBGRl9jb21w
YXJlCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQpjbGFzcyBGRl9jb21wYXJlIDogcHVibGljIFNURE5TIHVuYXJ5X2Z1
bmN0aW9uPEZvcm1GaWxlLCBib29sPgp7CnB1YmxpYzoKICAKICBpbmxpbmUgZXhwbGljaXQg
RkZfY29tcGFyZShjb25zdCBTVEROUyBzdHJpbmcmIG5hbWUpCiAgICA6IGZOYW1lKG5hbWUp
IHt9CiAgCiAgaW5saW5lIGJvb2wgb3BlcmF0b3IoKSAoY29uc3QgRm9ybUZpbGUmIGVudHJ5
KSAJY29uc3QKICAgIHsgcmV0dXJuIHN0cmluZ3NBcmVFcXVhbChmTmFtZSwgZW50cnkuZ2V0
TmFtZSgpKTsgfQogIApwcml2YXRlOgogIFNURE5TIHN0cmluZyBmTmFtZTsKfTsKCi8vID09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQovLyBGdW5jdGlvbiBjb3B5X2lmIChoYW5keSwgbWlzc2luZyBmcm9tIFNUTCkKLy8g
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci8vIFRoaXMgY29kZSB0YWtlbiBkaXJlY3RseSBmcm9tIAovLyAiVGhlIEMrKyBQ
cm9ncmFtbWluZyBMYW5ndWFnZSwgVGhpcmQgRWRpdGlvbiIgYnkgQmphcm5lIFN0cm91c3Ry
dXAKdGVtcGxhdGU8Y2xhc3MgSW4sIGNsYXNzIE91dCwgY2xhc3MgUHJlZD4KT3V0IApjb3B5
X2lmKEluIGZpcnN0LCAKCQlJbiBsYXN0LCAKCQlPdXQgcmVzLCAKCQlQcmVkIHApCnsKICB3
aGlsZShmaXJzdCAhPSBsYXN0KSB7CiAgICBpZihwKCpmaXJzdCkpCiAgICAgICpyZXMrKyA9
ICpmaXJzdDsKICAgICsrZmlyc3Q7CiAgfQogIHJldHVybiByZXM7Cn0KCkNHSUNDX0VORF9O
QU1FU1BBQ0UKCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQovLyBDbGFzcyBNdWx0aXBhcnRIZWFkZXIKLy8gPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
CmNsYXNzIENHSUNDTlMgTXVsdGlwYXJ0SGVhZGVyIAp7CnB1YmxpYzoKICAKICBNdWx0aXBh
cnRIZWFkZXIoY29uc3QgU1RETlMgc3RyaW5nJiBkaXNwb3NpdGlvbiwKCQkgIGNvbnN0IFNU
RE5TIHN0cmluZyYgbmFtZSwKCQkgIGNvbnN0IFNURE5TIHN0cmluZyYgZmlsZW5hbWUsCgkJ
ICBjb25zdCBTVEROUyBzdHJpbmcmIGNUeXBlKTsKCiAgTXVsdGlwYXJ0SGVhZGVyKGNvbnN0
IE11bHRpcGFydEhlYWRlciYgaGVhZCk7CiAgfk11bHRpcGFydEhlYWRlcigpOwoKICBNdWx0
aXBhcnRIZWFkZXImCiAgb3BlcmF0b3I9IChjb25zdCBNdWx0aXBhcnRIZWFkZXImIGhlYWQp
OwogIAogIGlubGluZSBTVEROUyBzdHJpbmcgCiAgZ2V0Q29udGVudERpc3Bvc2l0aW9uKCkg
CQkJCWNvbnN0CiAgICB7IHJldHVybiBmQ29udGVudERpc3Bvc2l0aW9uOyB9CiAgCiAgaW5s
aW5lIFNURE5TIHN0cmluZwogIGdldE5hbWUoKSAJCQkJCQljb25zdAogICAgeyByZXR1cm4g
Zk5hbWU7IH0KCiAgaW5saW5lIFNURE5TIHN0cmluZyAKICBnZXRGaWxlbmFtZSgpIAkJCQkJ
Y29uc3QKICAgIHsgcmV0dXJuIGZGaWxlbmFtZTsgfQoKICBpbmxpbmUgU1RETlMgc3RyaW5n
IAogIGdldENvbnRlbnRUeXBlKCkgCQkJCQljb25zdAogICAgeyByZXR1cm4gZkNvbnRlbnRU
eXBlOyB9Cgpwcml2YXRlOgogIFNURE5TIHN0cmluZyBmQ29udGVudERpc3Bvc2l0aW9uOwog
IFNURE5TIHN0cmluZyBmTmFtZTsKICBTVEROUyBzdHJpbmcgZkZpbGVuYW1lOwogIFNURE5T
IHN0cmluZyBmQ29udGVudFR5cGU7Cn07CgpDR0lDQ05TIE11bHRpcGFydEhlYWRlcjo6TXVs
dGlwYXJ0SGVhZGVyKGNvbnN0IFNURE5TIHN0cmluZyYgZGlzcG9zaXRpb24sCgkJCQkJIGNv
bnN0IFNURE5TIHN0cmluZyYgbmFtZSwKCQkJCQkgY29uc3QgU1RETlMgc3RyaW5nJiBmaWxl
bmFtZSwKCQkJCQkgY29uc3QgU1RETlMgc3RyaW5nJiBjVHlwZSkKICA6IGZDb250ZW50RGlz
cG9zaXRpb24oZGlzcG9zaXRpb24pLAogICAgZk5hbWUobmFtZSksCiAgICBmRmlsZW5hbWUo
ZmlsZW5hbWUpLAogICAgZkNvbnRlbnRUeXBlKGNUeXBlKQp7fQoKQ0dJQ0NOUyBNdWx0aXBh
cnRIZWFkZXI6Ok11bHRpcGFydEhlYWRlcihjb25zdCBNdWx0aXBhcnRIZWFkZXImIGhlYWQp
CnsgCiAgLy8gY2FsbCBvcGVyYXRvcj0KICAqdGhpcyA9IGhlYWQ7Cn0KCkNHSUNDTlMgTXVs
dGlwYXJ0SGVhZGVyOjp+TXVsdGlwYXJ0SGVhZGVyKCkKe30KCkNHSUNDTlMgTXVsdGlwYXJ0
SGVhZGVyJgpDR0lDQ05TIE11bHRpcGFydEhlYWRlcjo6b3BlcmF0b3I9IChjb25zdCBNdWx0
aXBhcnRIZWFkZXImIGhlYWQpCnsKICBmQ29udGVudERpc3Bvc2l0aW9uIAk9IGhlYWQuZkNv
bnRlbnREaXNwb3NpdGlvbjsKICBmTmFtZSAJCT0gaGVhZC5mTmFtZTsKICBmRmlsZW5hbWUg
CQk9IGhlYWQuZkZpbGVuYW1lOwogIGZDb250ZW50VHlwZSAJCT0gaGVhZC5mQ29udGVudFR5
cGU7CgogIHJldHVybiAqdGhpczsKfQoKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vIENsYXNzIENnaWNjCi8vID09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQpDR0lDQ05TIENnaWNjOjpDZ2ljYyhyZWFkZXJfZnVuY3Rpb25fdCBzdHJlYW1fcmVh
ZGVyKQogIDogZkVudmlyb25tZW50KHN0cmVhbV9yZWFkZXIpCnsKI2lmIERFQlVHCiNpZiBI
QVZFX1NUUkZUSU1FCiAgdGltZV90IAlub3c7CiAgdG0gCQkqZGF0ZTsKICBjaGFyIAkJc1s4
MF07CiAgCiAgbm93ID0gdGltZSgwKTsKICBkYXRlID0gbG9jYWx0aW1lKCZub3cpOwogIHN0
cmZ0aW1lKHMsIDgwLCAiJUEsICVCICVkLCAlWSAlSTolTTolUyAlcCIsIGRhdGUpOwogIExP
RygiQ2dpY2MgZGVidWdnaW5nIGxvZyBzdGFydGVkIG9uICIpCiAgTE9HTE4ocykKI2Vsc2UK
ICBMT0dMTigiQ2dpY2MgZGVidWdnaW5nIGxvZyBzdGFydGVkLiIpCiNlbmRpZiAvKiBIQVZF
X1NUUkZUSU1FICovCiNlbmRpZiAvKiBERUJVRyAqLwogIAogIC8vIHRoaXMgY2FuIGJlIHR3
ZWFrZWQgZm9yIHBlcmZvcm1hbmNlCiAgZkZvcm1EYXRhLnJlc2VydmUoNDApOwogIGZGb3Jt
RmlsZXMucmVzZXJ2ZSg1KTsKCiAgaWYoc3RyaW5nc0FyZUVxdWFsKGdldEVudmlyb25tZW50
KCkuZ2V0UmVxdWVzdE1ldGhvZCgpLCAicG9zdCIpKQogICAgcGFyc2VGb3JtSW5wdXQoZ2V0
RW52aXJvbm1lbnQoKS5nZXRQb3N0RGF0YSgpKTsKICBlbHNlCiAgICBwYXJzZUZvcm1JbnB1
dChnZXRFbnZpcm9ubWVudCgpLmdldFF1ZXJ5U3RyaW5nKCkpOwp9CgpDR0lDQ05TIENnaWNj
Ojp+Q2dpY2MoKQp7CiAgTE9HTE4oIkNsZWFuaW5nIHVwLi4uIikKICBMT0dMTigiQ2dpY2Mg
ZGVidWdnaW5nIGxvZyBjbG9zZWQuIikKfQoKY29uc3QgY2hhcioKQ0dJQ0NOUyBDZ2ljYzo6
Z2V0Q29tcGlsZURhdGUoKSAJCQkJY29uc3QKeyByZXR1cm4gX19EQVRFX187IH0KCmNvbnN0
IGNoYXIqCkNHSUNDTlMgQ2dpY2M6OmdldENvbXBpbGVUaW1lKCkgCQkJCWNvbnN0CnsgcmV0
dXJuIF9fVElNRV9fOyB9Cgpjb25zdCBjaGFyKgpDR0lDQ05TIENnaWNjOjpnZXRWZXJzaW9u
KCkgCQkJCQljb25zdAp7IHJldHVybiBWRVJTSU9OOyB9Cgpjb25zdCBjaGFyKgpDR0lDQ05T
IENnaWNjOjpnZXRIb3N0KCkgCQkJCQljb25zdAp7IHJldHVybiBIT1NUOyB9Cgp2b2lkCkNH
SUNDTlMgQ2dpY2M6OnNhdmUoY29uc3QgU1RETlMgc3RyaW5nJiBmaWxlbmFtZSkgCQljb25z
dAp7CiAgTE9HTE4oIkNnaWNjOjpzYXZlIikKICBnZXRFbnZpcm9ubWVudCgpLnNhdmUoZmls
ZW5hbWUpOwp9Cgp2b2lkCkNHSUNDTlMgQ2dpY2M6OnJlc3RvcmUoY29uc3QgU1RETlMgc3Ry
aW5nJiBmaWxlbmFtZSkKewogIExPR0xOKCJDZ2ljYzo6cmVzdG9yZSIpCiAgCiAgKChDZ2lF
bnZpcm9ubWVudCYpZ2V0RW52aXJvbm1lbnQoKSkucmVzdG9yZShmaWxlbmFtZSk7CgogIC8v
IGNsZWFyIHRoZSBjdXJyZW50IGRhdGEgYW5kIHJlLXBhcnNlIHRoZSBlbnZpcm9tZW50CiAg
ZkZvcm1EYXRhLmNsZWFyKCk7CiAgZkZvcm1GaWxlcy5jbGVhcigpOwogIGlmKHN0cmluZ3NB
cmVFcXVhbChnZXRFbnZpcm9ubWVudCgpLmdldFJlcXVlc3RNZXRob2QoKSwgInBvc3QiKSkK
ICAgIHBhcnNlRm9ybUlucHV0KGdldEVudmlyb25tZW50KCkuZ2V0UG9zdERhdGEoKSk7CiAg
ZWxzZQogICAgcGFyc2VGb3JtSW5wdXQoZ2V0RW52aXJvbm1lbnQoKS5nZXRRdWVyeVN0cmlu
ZygpKTsKfQoKYm9vbCAKQ0dJQ0NOUyBDZ2ljYzo6cXVlcnlDaGVja2JveChjb25zdCBTVERO
UyBzdHJpbmcmIGVsZW1lbnROYW1lKSAJY29uc3QKewogIGNvbnN0X2Zvcm1faXRlcmF0b3Ig
aXRlciA9IGdldEVsZW1lbnQoZWxlbWVudE5hbWUpOwogIHJldHVybiAoKGl0ZXIgIT0gZkZv
cm1EYXRhLmVuZCgpKSAmJiAKCSAgc3RyaW5nc0FyZUVxdWFsKCAoKml0ZXIpLmdldFZhbHVl
KCksICJvbiIpKTsKfQoKQ0dJQ0NOUyBmb3JtX2l0ZXJhdG9yIApDR0lDQ05TIENnaWNjOjpn
ZXRFbGVtZW50KGNvbnN0IFNURE5TIHN0cmluZyYgbmFtZSkKewogIHJldHVybiBTVEROUyBm
aW5kX2lmKGZGb3JtRGF0YS5iZWdpbigpLCBmRm9ybURhdGEuZW5kKCksIAoJCSAgICAgICBG
RV9uYW1lQ29tcGFyZShuYW1lKSk7Cn0KCkNHSUNDTlMgY29uc3RfZm9ybV9pdGVyYXRvciAK
Q0dJQ0NOUyBDZ2ljYzo6Z2V0RWxlbWVudChjb25zdCBTVEROUyBzdHJpbmcmIG5hbWUpIAkJ
Y29uc3QKewogIHJldHVybiBTVEROUyBmaW5kX2lmKGZGb3JtRGF0YS5iZWdpbigpLCBmRm9y
bURhdGEuZW5kKCksIAoJCSAgICAgICBGRV9uYW1lQ29tcGFyZShuYW1lKSk7Cn0KCmJvb2wg
CkNHSUNDTlMgQ2dpY2M6OmdldEVsZW1lbnQoY29uc3QgU1RETlMgc3RyaW5nJiBuYW1lLCAK
CQkJICBTVEROUyB2ZWN0b3I8Rm9ybUVudHJ5PiYgcmVzdWx0KSAJY29uc3QKeyAKICByZXR1
cm4gZmluZEVudHJpZXMobmFtZSwgdHJ1ZSwgcmVzdWx0KTsgCn0KCkNHSUNDTlMgZm9ybV9p
dGVyYXRvciAKQ0dJQ0NOUyBDZ2ljYzo6Z2V0RWxlbWVudEJ5VmFsdWUoY29uc3QgU1RETlMg
c3RyaW5nJiB2YWx1ZSkKewogIHJldHVybiBTVEROUyBmaW5kX2lmKGZGb3JtRGF0YS5iZWdp
bigpLCBmRm9ybURhdGEuZW5kKCksIAoJCSAgICAgICBGRV92YWx1ZUNvbXBhcmUodmFsdWUp
KTsKfQoKQ0dJQ0NOUyBjb25zdF9mb3JtX2l0ZXJhdG9yIApDR0lDQ05TIENnaWNjOjpnZXRF
bGVtZW50QnlWYWx1ZShjb25zdCBTVEROUyBzdHJpbmcmIHZhbHVlKSAJY29uc3QKewogIHJl
dHVybiBTVEROUyBmaW5kX2lmKGZGb3JtRGF0YS5iZWdpbigpLCBmRm9ybURhdGEuZW5kKCks
IAoJCSAgICAgICBGRV92YWx1ZUNvbXBhcmUodmFsdWUpKTsKfQoKYm9vbCAKQ0dJQ0NOUyBD
Z2ljYzo6Z2V0RWxlbWVudEJ5VmFsdWUoY29uc3QgU1RETlMgc3RyaW5nJiB2YWx1ZSwgCgkJ
CQkgU1RETlMgdmVjdG9yPEZvcm1FbnRyeT4mIHJlc3VsdCkgCWNvbnN0CnsgCiAgcmV0dXJu
IGZpbmRFbnRyaWVzKHZhbHVlLCBmYWxzZSwgcmVzdWx0KTsgCn0KCkNHSUNDTlMgZmlsZV9p
dGVyYXRvciAKQ0dJQ0NOUyBDZ2ljYzo6Z2V0RmlsZShjb25zdCBTVEROUyBzdHJpbmcmIG5h
bWUpCnsKICByZXR1cm4gU1RETlMgZmluZF9pZihmRm9ybUZpbGVzLmJlZ2luKCksIGZGb3Jt
RmlsZXMuZW5kKCksIAoJCSAgICAgICBGRl9jb21wYXJlKG5hbWUpKTsKfQoKQ0dJQ0NOUyBj
b25zdF9maWxlX2l0ZXJhdG9yIApDR0lDQ05TIENnaWNjOjpnZXRGaWxlKGNvbnN0IFNURE5T
IHN0cmluZyYgbmFtZSkgCQljb25zdAp7CiAgcmV0dXJuIFNURE5TIGZpbmRfaWYoZkZvcm1G
aWxlcy5iZWdpbigpLCBmRm9ybUZpbGVzLmVuZCgpLCAKCQkgICAgICAgRkZfY29tcGFyZShu
YW1lKSk7Cn0KCgovLyBpbXBsZW1lbnRhdGlvbiBtZXRob2QKYm9vbApDR0lDQ05TIENnaWNj
OjpmaW5kRW50cmllcyhjb25zdCBTVEROUyBzdHJpbmcmIHBhcmFtLCAKCQkJICAgYm9vbCBi
eU5hbWUsCgkJCSAgIFNURE5TIHZlY3RvcjxGb3JtRW50cnk+JiByZXN1bHQpIAljb25zdAp7
CiAgLy8gZW1wdHkgdGhlIHRhcmdldCB2ZWN0b3IKICByZXN1bHQuY2xlYXIoKTsKCiAgaWYo
YnlOYW1lKQogICAgY29weV9pZihmRm9ybURhdGEuYmVnaW4oKSwgCgkgICAgZkZvcm1EYXRh
LmVuZCgpLCAKCSAgICBTVEROUyBiYWNrX2luc2VydGVyKHJlc3VsdCksCgkgICAgRkVfbmFt
ZUNvbXBhcmUocGFyYW0pKTsKICBlbHNlCiAgICBjb3B5X2lmKGZGb3JtRGF0YS5iZWdpbigp
LCAKCSAgICBmRm9ybURhdGEuZW5kKCksIAoJICAgIFNURE5TIGJhY2tfaW5zZXJ0ZXIocmVz
dWx0KSwKCSAgICBGRV92YWx1ZUNvbXBhcmUocGFyYW0pKTsKCiAgcmV0dXJuICEgcmVzdWx0
LmVtcHR5KCk7Cn0KCnZvaWQKQ0dJQ0NOUyBDZ2ljYzo6cGFyc2VGb3JtSW5wdXQoY29uc3Qg
U1RETlMgc3RyaW5nJiBkYXRhKQp7CiAgU1RETlMgc3RyaW5nIGVudiAJPSBnZXRFbnZpcm9u
bWVudCgpLmdldENvbnRlbnRUeXBlKCk7CiAgU1RETlMgc3RyaW5nIGNUeXBlIAk9ICJtdWx0
aXBhcnQvZm9ybS1kYXRhIjsKCiAgaWYoc3RyaW5nc0FyZUVxdWFsKGNUeXBlLCBlbnYsIGNU
eXBlLmxlbmd0aCgpKSkgewogICAgTE9HTE4oIk11bHRpcGFydCBkYXRhIGRldGVjdGVkLiIp
CgogICAgLy8gRmluZCBvdXQgd2hhdCB0aGUgc2VwYXJhdG9yIGlzCiAgICBTVEROUyBzdHJp
bmcgCQliVHlwZSAJPSAiYm91bmRhcnk9IjsKICAgIFNURE5TIHN0cmluZzo6c2l6ZV90eXBl
IAlwb3MgCT0gZW52LmZpbmQoYlR5cGUpOwoKICAgIC8vIGdlbmVyYXRlIHRoZSBzZXBhcmF0
b3JzCiAgICBTVEROUyBzdHJpbmcgc2VwID0gZW52LnN1YnN0cihwb3MgKyBiVHlwZS5sZW5n
dGgoKSk7CiAgICBzZXAuYXBwZW5kKCJcclxuIik7CiAgICBzZXAuaW5zZXJ0KDAsICItLSIp
OwoKICAgIFNURE5TIHN0cmluZyBzZXAyID0gZW52LnN1YnN0cihwb3MgKyBiVHlwZS5sZW5n
dGgoKSk7CiAgICBzZXAyLmFwcGVuZCgiLS1cclxuIik7CiAgICBzZXAyLmluc2VydCgwLCAi
LS0iKTsKCiAgICAvLyBGaW5kIHRoZSBkYXRhIGJldHdlZW4gdGhlIHNlcGFyYXRvcnMKICAg
IFNURE5TIHN0cmluZzo6c2l6ZV90eXBlIHN0YXJ0ICA9IGRhdGEuZmluZChzZXApOwogICAg
U1RETlMgc3RyaW5nOjpzaXplX3R5cGUgc2VwTGVuID0gc2VwLmxlbmd0aCgpOwoKICAgIHBv
cyA9IDA7CiAgICBTVEROUyBzdHJpbmc6OnNpemVfdHlwZSBvbGRQb3MgPSBzdGFydCArIHNl
cExlbjsKCiAgICB3aGlsZSh0cnVlKSB7CiAgICAgIHBvcyA9IGRhdGEuZmluZChzZXAsIG9s
ZFBvcyk7CgogICAgICAvLyBJZiBzZXAgd2Fzbid0IGZvdW5kLCB0aGUgcmVzdCBvZiB0aGUg
ZGF0YSBpcyBhbiBpdGVtCiAgICAgIGlmKHBvcyA9PSBTVEROUyBzdHJpbmc6Om5wb3MpCgli
cmVhazsKCiAgICAgIC8vIHBhcnNlIHRoZSBkYXRhCiAgICAgIHBhcnNlTUlNRShkYXRhLnN1
YnN0cihvbGRQb3MsIHBvcyAtIG9sZFBvcykpOwoKICAgICAgLy8gdXBkYXRlIHBvc2l0aW9u
CiAgICAgIG9sZFBvcyA9IHBvcyArIHNlcExlbjsKICAgIH0KCiAgICAvLyBUaGUgZGF0YSBp
cyB0ZXJtaW5hdGVkIGJ5IHNlcDIKICAgIHBvcyA9IGRhdGEuZmluZChzZXAyLCBvbGRQb3Mp
OwogICAgLy8gcGFyc2UgdGhlIGRhdGEsIGlmIGZvdW5kCiAgICBpZihwb3MgIT0gU1RETlMg
c3RyaW5nOjpucG9zKSB7CiAgICAgIHBhcnNlTUlNRShkYXRhLnN1YnN0cihvbGRQb3MsIHBv
cyAtIG9sZFBvcykpOwogICAgfQogIH0KICBlbHNlIGlmKCEgZGF0YS5lbXB0eSgpKSB7CiAg
ICBTVEROUyBzdHJpbmc6OnNpemVfdHlwZSBwb3MgCT0gMDsKICAgIFNURE5TIHN0cmluZzo6
c2l6ZV90eXBlIG9sZFBvcwk9IDA7CgogICAgd2hpbGUodHJ1ZSkgewogICAgICAvLyBmaW5k
IHRoZSAnJicgc2VwYXJhdGluZyBhIG5hbWU9dmFsdWUgcGFpcnMKICAgICAgcG9zID0gZGF0
YS5maW5kX2ZpcnN0X29mKCImIiwgb2xkUG9zKTsKCiAgICAgIC8vIGlmIG5vICcmJyB3YXMg
Zm91bmQsIHRoZSByZXN0IG9mIHRoZSBzdHJpbmcgaXMgYSBwYWlyCiAgICAgIGlmKHBvcyA9
PSBTVEROUyBzdHJpbmc6Om5wb3MpIHsKCXBhcnNlUGFpcihkYXRhLnN1YnN0cihvbGRQb3Mp
KTsKCWJyZWFrOwogICAgICB9CiAgICAgIAogICAgICAvLyBvdGhlcndpc2UsIHBhcnNlIHRo
ZSBuYW1lPXZhbHVlIHBhaXIKICAgICAgcGFyc2VQYWlyKGRhdGEuc3Vic3RyKG9sZFBvcywg
cG9zIC0gb2xkUG9zKSk7CiAgICAgIAogICAgICAvLyB1cGRhdGUgcG9zaXRpb24KICAgICAg
b2xkUG9zID0gcG9zICsgMTsKICAgIH0KICB9Cn0KCkNHSUNDTlMgTXVsdGlwYXJ0SGVhZGVy
CkNHSUNDTlMgQ2dpY2M6OnBhcnNlSGVhZGVyKGNvbnN0IFNURE5TIHN0cmluZyYgZGF0YSkK
ewogIFNURE5TIHN0cmluZyBkaXNwb3NpdGlvbjsKICBkaXNwb3NpdGlvbiA9IGV4dHJhY3RC
ZXR3ZWVuKGRhdGEsICJDb250ZW50LURpc3Bvc2l0aW9uOiAiLCAiOyIpOwogIAogIFNURE5T
IHN0cmluZyBuYW1lOwogIG5hbWUgPSBleHRyYWN0QmV0d2VlbihkYXRhLCAibmFtZT1cIiIs
ICJcIiIpOwogIAogIFNURE5TIHN0cmluZyBmaWxlbmFtZTsKICBTVEROUyBzdHJpbmcgY1R5
cGU7CiAgaWYgKGRhdGEuZmluZCgiZmlsZW5hbWU9IikgIT0gU1RETlMgc3RyaW5nOjpucG9z
KSB7CiAgICBmaWxlbmFtZSA9IGV4dHJhY3RCZXR3ZWVuKGRhdGEsICJmaWxlbmFtZT1cIiIs
ICJcIiIpOwogICAgY1R5cGUgPSBleHRyYWN0QmV0d2VlbihkYXRhLCAiQ29udGVudC1UeXBl
OiAiLCAiXHJcblxyXG4iKTsKICB9CgogIC8vIFRoaXMgaXMgaGFpcnk6IE5ldHNjYXBlIGFu
ZCBJRSBkb24ndCBlbmNvZGUgdGhlIGZpbGVuYW1lcwogIC8vIFRoZSBSRkMgc2F5cyB0aGV5
IHNob3VsZCBiZSBlbmNvZGVkLCBzbyBJIHdpbGwgYXNzdW1lIHRoZXkgYXJlLgogIGZpbGVu
YW1lID0gdW5lc2NhcGVTdHJpbmcoZmlsZW5hbWUpOwoKICByZXR1cm4gTXVsdGlwYXJ0SGVh
ZGVyKGRpc3Bvc2l0aW9uLCBuYW1lLCBmaWxlbmFtZSwgY1R5cGUpOwp9Cgp2b2lkCkNHSUND
TlMgQ2dpY2M6OnBhcnNlUGFpcihjb25zdCBTVEROUyBzdHJpbmcmIGRhdGEpCnsKICAvLyBm
aW5kIHRoZSAnPScgc2VwYXJhdGluZyB0aGUgbmFtZSBhbmQgdmFsdWUKICBTVEROUyBzdHJp
bmc6OnNpemVfdHlwZSBwb3MgPSBkYXRhLmZpbmRfZmlyc3Rfb2YoIj0iLCAwKTsKCiAgLy8g
aWYgbm8gJz0nIHdhcyBmb3VuZCwgcmV0dXJuCiAgaWYocG9zID09IFNURE5TIHN0cmluZzo6
bnBvcykKICAgIHJldHVybjsKICAKICAvLyB1bmVzY2FwZSB0aGUgZGF0YSwgYW5kIGFkZCB0
byB0aGUgZm9ybSBlbnRyeSBsaXN0CiAgU1RETlMgc3RyaW5nIG5hbWUgCT0gdW5lc2NhcGVT
dHJpbmcoZGF0YS5zdWJzdHIoMCwgcG9zKSk7CiAgU1RETlMgc3RyaW5nIHZhbHVlIAk9IHVu
ZXNjYXBlU3RyaW5nKGRhdGEuc3Vic3RyKCsrcG9zLCAKCQkJCQkJICAgICBTVEROUyBzdHJp
bmc6Om5wb3MpKTsKICAKICBmRm9ybURhdGEucHVzaF9iYWNrKEZvcm1FbnRyeShuYW1lLCB2
YWx1ZSkpOwp9Cgp2b2lkCkNHSUNDTlMgQ2dpY2M6OnBhcnNlTUlNRShjb25zdCBTVEROUyBz
dHJpbmcmIGRhdGEpCnsKICAvLyBGaW5kIHRoZSBoZWFkZXIKICBTVEROUyBzdHJpbmcgZW5k
ID0gIlxyXG5cclxuIjsKICBTVEROUyBzdHJpbmc6OnNpemVfdHlwZSBoZWFkTGltaXQgPSBk
YXRhLmZpbmQoZW5kLCAwKTsKICAKICAvLyBEZXRlY3QgZXJyb3IKICBpZihoZWFkTGltaXQg
PT0gU1RETlMgc3RyaW5nOjpucG9zKQogICAgcmV0dXJuOwoKICAvLyBFeHRyYWN0IHRoZSB2
YWx1ZSAtIHRoZXJlIGlzIHN0aWxsIGEgdHJhaWxpbmcgQ1IvTEYgdG8gYmUgc3VidHJhY3Rl
ZCBvZmYKICBTVEROUyBzdHJpbmc6OnNpemVfdHlwZSB2YWx1ZVN0YXJ0ID0gaGVhZExpbWl0
ICsgZW5kLmxlbmd0aCgpOwogIFNURE5TIHN0cmluZyB2YWx1ZSA9IGRhdGEuc3Vic3RyKHZh
bHVlU3RhcnQsIGRhdGEubGVuZ3RoKCkgLSB2YWx1ZVN0YXJ0IC0gMik7CgogIC8vIFBhcnNl
IHRoZSBoZWFkZXIgLSBwYXNzIHRyYWlsaW5nIENSL0xGIHggMiB0byBwYXJzZUhlYWRlcgog
IE11bHRpcGFydEhlYWRlciBoZWFkID0gcGFyc2VIZWFkZXIoZGF0YS5zdWJzdHIoMCwgdmFs
dWVTdGFydCkpOwoKICBpZihoZWFkLmdldEZpbGVuYW1lKCkuZW1wdHkoKSkgewogICAgZkZv
cm1EYXRhLnB1c2hfYmFjayhGb3JtRW50cnkoaGVhZC5nZXROYW1lKCksIHZhbHVlKSk7CiAg
fSBlbHNlIHsKICAgIGZGb3JtRmlsZXMucHVzaF9iYWNrKEZvcm1GaWxlKGhlYWQuZ2V0TmFt
ZSgpLCAKCQkJCSAgaGVhZC5nZXRGaWxlbmFtZSgpLCAKCQkJCSAgaGVhZC5nZXRDb250ZW50
VHlwZSgpLCAKCQkJCSAgdmFsdWUpKTsKICB9Cn0K
--=_c76f213f5c6f1eb6ca6970650c0736ae
Content-Type: application/octet-stream
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="=?UTF-8?B?bnBoLWhlbGxvLmNwcA==?="
LyoKICogJElkOiBucGgtaGVsbG8uY3BwLHYgMS4yIDIwMDIvMDEvMDkgMTc6MTI6MDMgc2Jv
b3RoIEV4cCAkIAogKgogKiAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5
LCAyMDAwLCAyMDAxIFN0ZXBoZW4gRi4gQm9vdGgKICoKICogIFRoaXMgcHJvZ3JhbSBpcyBm
cmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAq
ICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl
IGFzIHB1Ymxpc2hlZCBieQogKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0
aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICogIChhdCB5b3VyIG9wdGlvbikg
YW55IGxhdGVyIHZlcnNpb24uCiAqCiAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQg
aW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogIGJ1dCBXSVRIT1VUIEFO
WSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqICBN
RVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBT
ZWUgdGhlCiAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxz
LgogKgogKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdl
bmVyYWwgUHVibGljIExpY2Vuc2UKICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBu
b3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqICBGb3VuZGF0aW9uLCBJbmMuLCA1
OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNB
CiAqCiAqLwoKI2luY2x1ZGUgPGV4Y2VwdGlvbj4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5j
bHVkZSA8ZnN0cmVhbT4KI2luY2x1ZGUgPGN0aW1lPgoKI2luY2x1ZGUgImNnaWNjL0NnaWNj
LmgiCiNpbmNsdWRlICJjZ2ljYy9IVFRQSGVhZGVycy5oIgojaW5jbHVkZSAiY2dpY2MvSFRN
TENsYXNzZXMuaCIKCiNpZiBIQVZFX1NZU19USU1FX0gKIyAgaW5jbHVkZSA8c3lzL3RpbWUu
aD4KI2VuZGlmCgovLyBUbyB1c2UgdGhlIGRlYnVnIGxvZ2dpbmcgZmVhdHVyZSwgdGhlIHZh
cmlhYmxlIGdMb2dGaWxlIE1VU1QgYmUKLy8gZGVmaW5lZCwgYW5kIGl0IF9tdXN0XyBiZSBh
biBvZnN0cmVhbQojaWYgREVCVUcKICBTVEROUyBvZnN0cmVhbSBnTG9nRmlsZSAoImNnaWNj
LmxvZyIsIFNURE5TIGlvczo6YXBwKTsKI2VuZGlmCgojaWYgQ0dJQ0NfVVNFX05BTUVTUEFD
RVMKICB1c2luZyBuYW1lc3BhY2Ugc3RkOwogIHVzaW5nIG5hbWVzcGFjZSBjZ2ljYzsKI2Vs
c2UKIyAgZGVmaW5lIGRpdiBkaXZfCiMgIGRlZmluZSBzZWxlY3Qgc2VsZWN0XwojZW5kaWYK
CmV4dGVybiBjaGFyICoqZW52aXJvbjsKCmludAptYWluKGludCAvKmFyZ2MqLywgCiAgICAg
Y2hhciAqKiAvKmFyZ3YqLykKewogIHRyeSB7CiAgICBDZ2ljYyBjZ2k7CgogICAgLy8gR2V0
IHRoZSBjdXJyZW50IHRpbWUgaW4gdGhlIGZvcm1hdCBTdW4sIDA2IE5vdiAxOTk0IDA4OjQ5
OjM3IEdNVAogICAgY2hhciBjdXJyZW50X2RhdGUgWzMwXTsKICAgIHRpbWVfdCBub3cgPSB0
aW1lKCZub3cpOwogICAgc3RyZnRpbWUoY3VycmVudF9kYXRlLCAzMCwgIiVhLCAlZCAlYiAl
WSAlSDolTTolUyBHTVQiLCBnbXRpbWUoJm5vdykpOwoKICAgIC8vIEJ1aWxkIG91ciBvd24g
c2VydmVyIHN0cmluZwogICAgU1RETlMgc3RyaW5nIHNlcnZlcl9zdHJpbmcoIkdOVSBjZ2lj
Yy8iKTsKICAgIHNlcnZlcl9zdHJpbmcgKz0gY2dpLmdldFZlcnNpb24oKTsKCiAgICAvLyBU
ZWxsIHRoZSBzZXJ2ZXIgbm90IHRvIHBhcnNlIG91ciBoZWFkZXJzCiAgICBjb3V0IDw8IEhU
VFBSZXNwb25zZUhlYWRlcigiSFRUUC8xLjEiLCAyMDAsICJPSyIpCiAgICAgIC5hZGRIZWFk
ZXIoIkRhdGUiLCBjdXJyZW50X2RhdGUpCiAgICAgIC5hZGRIZWFkZXIoIlNlcnZlciIsIHNl
cnZlcl9zdHJpbmcpCiAgICAgIC5hZGRIZWFkZXIoIkNvbnRlbnQtTGFuZ3VhZ2UiLCAiZW4i
KQogICAgICAuYWRkSGVhZGVyKCJDb250ZW50LVR5cGUiLCAidGV4dC9odG1sIik7CgogICAg
Y291dCA8PCAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+IiA8
PCBlbmRsOwogICAgCiAgICBjb3V0IDw8ICI8IURPQ1RZUEUgaHRtbCBQVUJMSUMgXCItLy9X
M0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTlwiIFwiRFREL3hodG1sMS1zdHJpY3QuZHRk
XCI+IiA8PCBlbmRsOwogICAgY291dCA8PCAiPGh0bWwgeG1sbnM9XCJodHRwOi8vd3d3Lncz
Lm9yZy8xOTk5L3hodG1sXCIgeG1sOmxhbmc9XCJlblwiIGxhbmc9XCJlblwiPiIgPDwgZW5k
bDsKCiAgICBjb3V0IDw8ICI8aGVhZD4iIDw8IGVuZGw7CgogICAgLy8gT3V0cHV0IHRoZSBz
dHlsZSBzaGVldCBwb3J0aW9uIG9mIHRoZSBoZWFkZXIKICAgIGNvdXQgPDwgIjxzdHlsZT48
IS0tICIgPDwgZW5kbDsKICAgIGNvdXQgPDwgIiAgIGJvZHkgeyBjb2xvcjogYmxhY2s7IGJh
Y2tncm91bmQtY29sb3I6IHdoaXRlOyB9IiA8PCBlbmRsOwogICAgY291dCA8PCAiICAgc3Bh
bi5yZWQgeyBjb2xvcjogcmVkOyB9IiA8PCBlbmRsOwogICAgY291dCA8PCAiIC0tPjwvc3R5
bGU+IiA8PCBlbmRsOwoKICAgIGNvdXQgPDwgIjx0aXRsZT5HTlUgY2dpY2MgdiIgPDwgY2dp
LmdldFZlcnNpb24oKSA8PCAiPC90aXRsZT4iIDw8IGVuZGw7CiAgICBjb3V0IDw8ICI8L2hl
YWQ+IiA8PCBlbmRsOwoKICAgIGNvdXQgPDwgIjxib2R5PiIgPDwgZW5kbDsKICAgIGNvdXQg
PDwgIjxoMT5IZWxsbywgd29ybGQgZnJvbSBHTlUgY2dpPHNwYW4gY2xhc3M9XCJyZWRcIj5j
Yzwvc3Bhbj4gdiI7CiAgICBjb3V0IDw8IGNnaS5nZXRWZXJzaW9uKCkgPDwgIjwvaDE+IiA8
PCBlbmRsOwogICAgY291dCA8PCAiPC9ib2R5PjwvaHRtbD4iIDw8IGVuZGw7CiAgfQogIAog
IGNhdGNoKGNvbnN0IGV4Y2VwdGlvbiYgZSkgewogICAgLy8gaGFuZGxlIGVycm9yIGNvbmRp
dGlvbgogIH0KICAKICByZXR1cm4gMDsKfQo=
--=_c76f213f5c6f1eb6ca6970650c0736ae
Content-Type: application/octet-stream
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="=?UTF-8?B?bnBoLWxvZ2luLmNwcA==?="
LyoNCiAqICRJZDogbnBoLWxvZ2luLmNwcCx2IDEuMyAyMDAyLzAxLzA5IDE3OjEyOjAzIHNi
b290aCBFeHAgJA0KICoNCiAqICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5
OTksIDIwMDAsIDIwMDEgU3RlcGhlbiBGLiBCb290aA0KICogIENvcHlyaWdodCAoQykgMjAw
MSBQZXRlciBHb2VkdGtpbmR0DQogKg0KICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3
YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5DQogKiAgaXQgdW5k
ZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJs
aXNoZWQgYnkNCiAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVy
c2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcg0KICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxh
dGVyIHZlcnNpb24uDQogKg0KICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0
aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KICogIGJ1dCBXSVRIT1VUIEFOWSBX
QVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQogKiAgTUVS
Q0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2Vl
IHRoZQ0KICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMu
DQogKg0KICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBH
ZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQogKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlm
IG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCiAqICBGb3VuZGF0aW9uLCBJbmMu
LCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAg
VVNBDQogKiANCiAqLw0KDQovKiANCiAqIEluIHRoaXMgZXhhbXBsZSwgd2Ugd2lsbCBjb250
cm9sIHRoZSBIVFRQTlBIIGhlYWRlciBzbyB0aGF0IHRoZSB1c2VyDQogKiB3aWxsIG5lZWQg
dG8gcHJvdmlkZSBhdXRoZW50aWNhdGlvbiBiZWZvcmUgdGhlIGNnaSBkb2VzIHNvbWV0aGlu
Zy4NCiAqIFNvIGZhciwgdGhpcyBDR0kgaGFzIG9ubHkgYmVlbiB0ZXN0ZWQgb24gSUlTIDUg
c2VydmVycyBhbmQgdXNpbmcNCiAqIGJyb3dzZXJzIElFIDUgKE1hYyBPUyA5LCBNYWNPUyBY
LCBXaW5kb3dzKSwgTmV0c2NhcGUgNC43IChXaW5kb3dzLA0KICogTGludXgsIE1hYyksIE9t
bml3ZWIgNCAoTWFjKSBUaGUgYXNrIGZvciB1c2VyIGF1dGhlbnRpY2F0aW9uLCB0aGUNCiAq
IGNnaSBpc3N1ZXMgYSA0MDMgaHR0cCByZXNwb25zZSBjb2RlLiAgDQogKg0KICogSU1QT1JU
QU5UOiBUbyBiZSBhYmxlIHRvIGNvbnRyb2wgdGhlIHJlc3BvbnNlIHR5cGUgSFRUUCBoZWFk
ZXIsIHRoZQ0KICogbmFtZSBvZiB0aGUgY2dpIGV4ZWN1dGFibGUgbmVlZHMgdG8gc3RhcnQg
d2l0aCAibnBoLSIuIFRoZSBjZ2kgaXMNCiAqIHRoZW4gZnVsbHkgcmVzcG9uc2libGUgZm9y
IHRoZSBjcmVhdGlvbiBvZiBfQUxMXyBodHRwIGhlYWRlcnMuDQogKg0KICogSU1QT1JUQU5U
MjogT25jZSBhIHZhbGlkIHVzZXJuYW1lL3Bhc3N3b3JkIGhhcyBiZWVuIGFjY2VwdGVkLCB0
aGUNCiAqIGJyb3dzZXIgd2lsbCBzZW5kIHRoZSBwYWlyIHdpdGggZWFjaCByZXF1ZXN0IHVu
dGlsIHlvdSBxdWl0IHlvdXINCiAqIGJyb3dzZXIuICANCiAqDQogKiBJTVBPUlRBTlQzOiBP
biBXaW5kb3dzIHNlcnZlcnMsIG1ha2UgY2VydGFpbiB5b3VyIHdlYnNlcnZlciBpcw0KICog
Y29uZmlndXJlZCB0byBhbGxvdyBiYXNpYyBhdXRoZW50aWNhdGlvbi4NCiAqLw0KDQojaW5j
bHVkZSA8ZXhjZXB0aW9uPg0KI2luY2x1ZGUgPGlvc3RyZWFtPg0KI2luY2x1ZGUgPGZzdHJl
YW0+DQoNCiNpbmNsdWRlICJjZ2ljYy9DZ2ljYy5oIg0KI2luY2x1ZGUgImNnaWNjL0hUVFBI
ZWFkZXJzLmgiDQojaW5jbHVkZSAiY2dpY2MvSFRNTENsYXNzZXMuaCINCg0KLy8gVG8gdXNl
IHRoZSBkZWJ1ZyBsb2dnaW5nIGZlYXR1cmUsIHRoZSB2YXJpYWJsZSBnTG9nRmlsZSBNVVNU
IGJlDQovLyBkZWZpbmVkLCBhbmQgaXQgX211c3RfIGJlIGFuIG9mc3RyZWFtDQojaWYgREVC
VUcNClNURE5TIG9mc3RyZWFtIGdMb2dGaWxlKCAiY2dpY2MubG9nIiwgU1RETlMgaW9zOjph
cHAgKTsNCiNlbmRpZg0KDQojaWYgQ0dJQ0NfVVNFX05BTUVTUEFDRVMNCnVzaW5nIG5hbWVz
cGFjZSBzdGQ7DQp1c2luZyBuYW1lc3BhY2UgY2dpY2M7DQojZWxzZQ0KIyAgZGVmaW5lIGRp
diBkaXZfDQojICBkZWZpbmUgc2VsZWN0IHNlbGVjdF8NCiNlbmRpZg0KDQppbnQNCm1haW4o
aW50IC8qYXJnYyovLCANCiAgICAgY2hhciAqKiAvKmFyZ3YqLykNCnsNCiAgdHJ5IHsNCiAg
ICBDZ2ljYyBjZ2k7DQogICAgY29uc3QgQ2dpRW52aXJvbm1lbnQmIGVudiA9IGNnaS5nZXRF
bnZpcm9ubWVudCgpOw0KICAgIHN0cmluZyByZW1vdGV1c2VyID0gZW52LmdldFJlbW90ZVVz
ZXIoKTsNCiAgICBzdHJpbmcgc2VydmVyc3cgPSBlbnYuZ2V0U2VydmVyU29mdHdhcmUoKTsN
CiAgICBzdHJpbmcgY2xpZW50c3cgPSBlbnYuZ2V0VXNlckFnZW50KCk7DQogICAgc3RyaW5n
IGF1dGh0eXBlID0gZW52LmdldEF1dGhUeXBlKCk7DQoNCiAgICBpZihyZW1vdGV1c2VyLmVt
cHR5KCkpIHsNCiAgICAgIGlmIChzZXJ2ZXJzdy5maW5kKCJNaWNyb3NvZnQiKSAhPSBzdHJp
bmc6Om5wb3MgDQoJICAmJiBjbGllbnRzdy5maW5kKCJXaW4iKSAhPSBzdHJpbmc6Om5wb3Mp
IHsNCgkvKg0KCSAgU2VydmVyIGFuZCBjbGllbnQgYXJlIHJ1bm5pbmcgb24gTWljcm9zb2Z0
IE9TLCBzbyB3ZQ0KCSAgcHJvYmFibHkgY2FuIHJlcXVlc3QgTlRMTSBhdXRoZW50aWNhdGlv
bjsgdGhlIGxhc3QgdGVzdCB3YXMNCgkgIG5lZWRlZCB0byBwcmV2ZW50IElFIG9uIE1hYydz
IGZyb20gdXNpbmcgTlRMTSwgYmVjYXVzZSBpdA0KCSAgc2VlbXMgdG8gYmUgYnJva2VuIG9u
IE1hY3MgDQoJKi8NCg0KICAgICBjb3V0IDw8IEhUVFBSZXNwb25zZUhlYWRlcigiSFRUUC8x
LjEiLCA0MDEsICJVbmF1dGhvcml6ZWQiKQ0KCSAgLmFkZEhlYWRlcigiV1dXLUF1dGhlbnRp
Y2F0ZSIsICJOVExNIikNCgkgIC5hZGRIZWFkZXIoIldXVy1BdXRoZW50aWNhdGUiLCAgIkJh
c2ljIHJlYWxtPVwiY2dpY2NcIiIpOw0KICANCiAgICAgICAgLyoNCgkgIFRoZXJlIGlzIGEg
YnVnIGluIGFsbCB2ZXJzaW9uIG9mIE1pY3Jvc29mdCBJbnRlcm5ldCBFeHBsb3Jlcg0KCSAg
YXQgbGVhc3QgdXAgdG8gNS41IGJ5IHdoaWNoIHRoZSBOVExNIGF1dGhlbnRpY2F0aW9uIHNj
aGVtZQ0KCSAgTVVTVCBiZSBkZWNsYXJlZCBmaXJzdCBvciBpdCB3b24ndCBiZSBzZWxlY3Rl
ZC4gVGhpcyBnb2VzDQoJICBhZ2FpbnN0IFJGQyAyNjE2LCB3aGljaCByZWNpdGVzICJBIHVz
ZXIgYWdlbnQgTVVTVCBjaG9vc2UgdG8NCgkgIHVzZSB0aGUgc3Ryb25nZXN0IGF1dGgtIHNj
aGVtZSBpdCB1bmRlcnN0YW5kcyIgYW5kIE5UTE0sIHdoaWxlDQoJICBicm9rZW4gaW4gbWFu
eSB3YXlzLCBpcyBzdGlsbCB3b3JsZHMgc3Ryb25nZXIgdGhhbiBCYXNpYy4NCiAgICAgICAg
Ki8NCiAgICAgIH0NCiAgICAgIGVsc2Ugew0KCS8vIHdlJ3JlIG5vdCBjaGF0dGluZyBmdWxs
eSBNUzogb25seSBzdXBwb3J0IGJhc2ljDQogICAgICAgIGNvdXQgPDwgSFRUUFJlc3BvbnNl
SGVhZGVyKCJIVFRQLzEuMSIsIDQwMSwgIlVuYXV0aG9yaXplZCIpDQoJICAuYWRkSGVhZGVy
KCJXV1ctQXV0aGVudGljYXRlIiwgIkJhc2ljIHJlYWxtPVwiY2dpY2NcIiIpOw0KICAgICAg
fQ0KICAgICAgLy8gZG8gbm90IGFkZCBodG1sIGRhdGE6IGJyb3dzZXJzIHNob3VsZCBub3Qg
ZGlzcGxheSB0aGlzIGFueXdheQ0KICAgICAgLy8gIHRoZXkgc2hvdWxkIHJlcXVlc3QgdXNl
ci9wYXNzd29yZCBmcm9tIHRoZSB1c2VyIGFuZCByZS1lbWl0DQogICAgICAvLyAgdGhlIHNh
bWUgcmVxdWVzdCwgb25seSB3aXRoIHRoZSBhdXRoZW50aWZpY2F0aW9uIGluZm8gYWRkZWQN
CiAgICAgIC8vICB0byB0aGUgcmVxdWVzdCANCiAgICAgIGNvdXQgPDwgSFRNTERvY3R5cGUo
SFRNTERvY3R5cGU6OmVTdHJpY3QpIDw8IGVuZGw7DQogICAgICBjb3V0IDw8IGh0bWwoKS5z
ZXQoImxhbmciLCAiRU4iKS5zZXQoImRpciIsICJMVFIiKSA8PCBlbmRsOw0KICAgIA0KICAg
ICAgY291dCA8PCBoZWFkKCkgPDwgZW5kbDsNCiAgICAgIGNvdXQgPDwgdGl0bGUoIjQwMSBB
dXRob3JpemF0aW9uIFJlcXVpcmVkIikgIDw8IGVuZGw7DQogICAgICBjb3V0IDw8IGhlYWQo
KSA8PCBlbmRsOw0KICAgIA0KICAgICAgY291dCA8PCBib2R5KCkgPDwgZW5kbDsNCiAgICAg
IGNvdXQgPDwgaDEoIjQwMSBBdXRob3JpemF0aW9uIFJlcXVpcmVkIikgPDwgZW5kbDsNCiAg
ICAgIGNvdXQgPDwgcCgpIDw8ICJUaGlzIHNlcnZlciBjb3VsZCBub3QgdmVyaWZ5IHRoYXQg
eW91IGFyZSAiDQoJICAgPDwgImF1dGhvcml6ZWQgdG8gYWNjZXNzIHRoZSBkb2N1bWVudCBy
ZXF1ZXN0ZWQuIEVpdGhlciB5b3UgIg0KCSAgIDw8ICJzdXBwbGllZCB0aGUgd3JvbmcgY3Jl
ZGVudGlhbHMgKGUuZy4sIGJhZCBwYXNzd29yZCksIG9yICINCgkgICA8PCAieW91ciBicm93
c2VyIGRvZXNuJ3QgdW5kZXJzdGFuZCBob3cgdG8gc3VwcGx5IHRoZSAiDQoJICAgPDwgImNy
ZWRlbnRpYWxzIHJlcXVpcmVkLiIgPDwgcCgpOw0KDQogICAgICBjb3V0IDw8IGhyKCkgPDwg
ZW5kbDsNCiAgICAgIGNvdXQgPDwgYWRkcmVzcygpIDw8ICJHTlUgY2dpY2MgXCJzZXJ2ZXJc
IiB2ZXJzaW9uICIgPDwgY2dpLmdldFZlcnNpb24oKQ0KCSAgIDw8IGFkZHJlc3MoKSA8PCBl
bmRsOw0KDQogICAgICByZXR1cm4gMDsNCiAgICB9DQogIA0KICAgIC8vIE91dHB1dCB0aGUg
SFRUUCBoZWFkZXJzIDIwMCBPSyBoZWFkZXIgZm9yIGFuIEhUTUwgZG9jdW1lbnQsIGFuZA0K
ICAgIC8vIHRoZSBIVE1MIDQuMCBEVEQgaW5mbw0KICAgIGNvdXQgPDwgSFRUUFJlc3BvbnNl
SGVhZGVyKGVudi5nZXRTZXJ2ZXJQcm90b2NvbCgpLCAyMDAgLCJPSyIpDQogICAgICAuYWRk
SGVhZGVyKCJDb250ZW50LVR5cGUiLCAidGV4dC9odG1sIik7DQogICAgY291dCA8PCBIVE1M
RG9jdHlwZShIVE1MRG9jdHlwZTo6ZVN0cmljdCkgPDwgZW5kbDsNCiAgICBjb3V0IDw8IGh0
bWwoKS5zZXQoImxhbmciLCAiRU4iKS5zZXQoImRpciIsICJMVFIiKSA8PCBlbmRsOw0KDQog
ICAgLy8gU2V0IHVwIHRoZSBwYWdlJ3MgaGVhZGVyIGFuZCB0aXRsZS4NCiAgICBjb3V0IDw8
IGhlYWQoKSA8PCBlbmRsOw0KICAgIGNvdXQgPDwgdGl0bGUoKSA8PCAiR05VIGNnaWNjIHYi
IDw8IGNnaS5nZXRWZXJzaW9uKCkgPDwgdGl0bGUoKSA8PCBlbmRsOw0KICAgIGNvdXQgPDwg
aGVhZCgpIDw8IGVuZGw7DQogICAgDQogICAgLy8gU3RhcnQgdGhlIEhUTUwgYm9keQ0KICAg
IGNvdXQgPDwgYm9keSgpIDw8IGVuZGw7DQoNCiAgICAvLyBQcmludCBvdXQgYSBtZXNzYWdl
DQogICAgY291dCA8PCAiSGVsbG8gIiA8PCBlbnYuZ2V0UmVtb3RlVXNlcigpIA0KCSA8PCAi
IHlvdXIgbG9naW4gd2FzIGFjY2VwdGVkIiA8PCBicigpIDw8IGVuZGw7DQogICAgY291dCA8
PCAiWW91IHdlcmUgYXV0aGVudGljYXRlZCB1c2luZyBhdXRoZW50aWNhdGlvbiBzY2hlbWUg
OiAiIA0KCSA8PCBlbnYuZ2V0QXV0aFR5cGUoKSA8PCBicigpIDw8IGVuZGw7DQogICAgY291
dCA8PCAiWW91ciBzZXJ2ZXIgc29mdHdhcmUgaXMgOiIgPDwgc2VydmVyc3cgPDwgYnIoKSA8
PCBlbmRsOw0KICAgIGNvdXQgPDwgIllvdXIgYnJvd3NlciBzb2Z0d2FyZSBpcyA6IiA8PCBj
bGllbnRzdyA8PCBicigpIDw8IGVuZGw7DQogICAgLy8gQ2xvc2UgdGhlIGRvY3VtZW50DQog
ICAgY291dCA8PCBib2R5KCkgPDwgaHRtbCgpOw0KDQoNCiAgfQ0KICANCiAgY2F0Y2goY29u
c3QgZXhjZXB0aW9uJiBlKSB7DQogICAgLy8gaGFuZGxlIGVycm9yIGNvbmRpdGlvbg0KICB9
DQogIA0KICByZXR1cm4gMDsNCn0NCg==
--=_c76f213f5c6f1eb6ca6970650c0736ae
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
_______________________________________________
bug-cgicc mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/bug-cgicc
--=_c76f213f5c6f1eb6ca6970650c0736ae--