This is the mail archive of the
gcc-prs@gcc.gnu.org
mailing list for the GCC project.
optimization/3224: -fomit-frame-pointer generates wrong code (g77)
- To: gcc-gnats at gcc dot gnu dot org
- Subject: optimization/3224: -fomit-frame-pointer generates wrong code (g77)
- From: rguenth at tat dot physik dot uni-tuebingen dot de
- Date: 18 Jun 2001 12:49:19 -0000
- Reply-To: rguenth at tat dot physik dot uni-tuebingen dot de
>Number: 3224
>Category: optimization
>Synopsis: -fomit-frame-pointer generates wrong code (g77)
>Confidential: no
>Severity: serious
>Priority: medium
>Responsible: unassigned
>State: open
>Class: wrong-code
>Submitter-Id: net
>Arrival-Date: Mon Jun 18 05:56:02 PDT 2001
>Closed-Date:
>Last-Modified:
>Originator: Richard Guenther
>Release: gcc version 3.0
>Organization:
>Environment:
Linux 2.4.3, Athlon
>Description:
The varlimit procedure (in the attached file) called with a field (0:NX2,0:NY2) inside a
common will barf compiled with -fomit-frame-pointer (checked with
-O2 and -O3). SIGSEGV at the second field access, the field
pointer is being destroyed (as viewing from gdb):
Program received signal SIGSEGV, Segmentation fault.
varlimit_ (ilimit=0x87aa9a58, feld=0x3fefffff, varmin=0xbfc5d091,
varmax=0x3fefffff, string=0xde425442, string2=0x3fefffff,
__g77_length_string=-292579374, __g77_length_string2=1072693247)
at hhsub.F:188
188 feld(I,J)=max(feld(i,j),varmin)
Current language: auto; currently fortran
(gdb) bt
#0 varlimit_ (ilimit=0x87aa9a58, feld=0x3fefffff, varmin=0xbfc5d091,
varmax=0x3fefffff, string=0xde425442, string2=0x3fefffff,
__g77_length_string=-292579374, __g77_length_string2=1072693247)
at hhsub.F:188
#1 0x3fefffff in ?? ()
(gdb) print feld
$1 = (PTR TO -> ( real*8 (0:133,0:133))) 0x3fefffff
(which is the same result as after single-stepping through the first iteration)
Generated code is:
(gdb) disassemble
Dump of assembler code for function varlimit_:
0x8089c60 <varlimit_>: push %ebp
0x8089c61 <varlimit_+1>: mov %esp,%ebp
0x8089c63 <varlimit_+3>: push %edi
0x8089c64 <varlimit_+4>: mov 0x8(%ebp),%eax
0x8089c67 <varlimit_+7>: push %esi
0x8089c68 <varlimit_+8>: push %ebx
0x8089c69 <varlimit_+9>: sub $0x1c,%esp
0x8089c6c <varlimit_+12>: mov (%eax),%eax
0x8089c6e <varlimit_+14>: test %eax,%eax
0x8089c70 <varlimit_+16>: jle 0x8089d06 <varlimit_+166>
0x8089c76 <varlimit_+22>: mov 0x91d8024,%esi0x8089c7c <varlimit_+28>: movl $0x1,0xffffffec(%ebp)
0x8089c83 <varlimit_+35>: dec %esi
0x8089c84 <varlimit_+36>: js 0x8089cf9 <varlimit_+153>
0x8089c86 <varlimit_+38>: mov 0x91d8020,%eax
0x8089c8b <varlimit_+43>: movl $0x1,0xffffffe4(%ebp)
0x8089c92 <varlimit_+50>: mov %eax,0xffffffe8(%ebp)
0x8089c95 <varlimit_+53>: lea 0x0(%esi,1),%esi
0x8089c99 <varlimit_+57>: lea 0x0(%edi,1),%edi
0x8089ca0 <varlimit_+64>: mov 0xffffffe8(%ebp),%edx
0x8089ca3 <varlimit_+67>: mov $0x1,%eax
0x8089ca8 <varlimit_+72>: dec %edx0x8089ca9 <varlimit_+73>: js 0x8089cea <varlimit_+138>
0x8089cab <varlimit_+75>: mov 0xffffffe4(%ebp),%ecx
0x8089cae <varlimit_+78>: mov $0x1,%ebx
0x8089cb3 <varlimit_+83>: mov 0x14(%ebp),%eax
0x8089cb6 <varlimit_+86>: imul $0x86,%ecx,%ecx
0x8089cbc <varlimit_+92>: fldl (%eax)
0x8089cbe <varlimit_+94>: mov %esi,%esi
0x8089cc0 <varlimit_+96>: mov 0xc(%ebp),%ebp
0x8089cc3 <varlimit_+99>: lea (%ebx,%ecx,1),%eax
0x8089cc6 <varlimit_+102>: shl $0x3,%eax
0x8089cc9 <varlimit_+105>: fldl (%eax,%ebp,1)
0x8089ccc <varlimit_+108>: mov 0x10(%ebp),%edi
0x8089ccf <varlimit_+111>: fcomi %st(1),%st
0x8089cd1 <varlimit_+113>: fldl (%edi)
0x8089cd3 <varlimit_+115>: fxch %st(1)
0x8089cd5 <varlimit_+117>: fcmovnbe %st(2),%st
0x8089cd7 <varlimit_+119>: fcomi %st(1),%st
0x8089cd9 <varlimit_+121>: fxch %st(1)
0x8089cdb <varlimit_+123>: fcmovnb %st(1),%st
0x8089cdd <varlimit_+125>: fstp %st(1)
0x8089cdf <varlimit_+127>: inc %ebx
0x8089ce0 <varlimit_+128>: dec %edx
0x8089ce1 <varlimit_+129>: fstpl (%eax,%ebp,1)0x8089ce4 <varlimit_+132>: jns 0x8089cc0 <varlimit_+96>
0x8089ce6 <varlimit_+134>: fstp %st(0)
0x8089ce8 <varlimit_+136>: mov %ebx,%eax
0x8089cea <varlimit_+138>: incl 0xffffffe4(%ebp)
0x8089ced <varlimit_+141>: dec %esi
0x8089cee <varlimit_+142>: jns 0x8089ca0 <varlimit_+64>
0x8089cf0 <varlimit_+144>: mov 0xffffffe4(%ebp),%ebp
0x8089cf3 <varlimit_+147>: mov %ebp,0xffffffec(%ebp)
0x8089cf6 <varlimit_+150>: mov %eax,0xfffffff0(%ebp)
0x8089cf9 <varlimit_+153>: call 0x8057080 <bounds_>
0x8089cfe <varlimit_+158>: lea 0xfffffff4(%ebp),%esp
0x8089d01 <varlimit_+161>: pop %ebx
0x8089d02 <varlimit_+162>: pop %esi
0x8089d03 <varlimit_+163>: pop %edi
0x8089d04 <varlimit_+164>: pop %ebp
0x8089d05 <varlimit_+165>: ret
>How-To-Repeat:
If the above code snippet is not enough to find the problem, I can send you the whole package.
>Fix:
As a workaround dont use -fomit-frame-pointer.
>Release-Note:
>Audit-Trail:
>Unformatted:
----gnatsweb-attachment----
Content-Type: application/octet-stream; name="hhsub.F"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="hhsub.F"
I2luY2x1ZGUgImhoZ3JpZC5oIgoqKiBGaWxlOiBoaHN1Yi5mICoqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioqCiAgICAgIFNVQlJP
VVRJTkUgU0NIUklUVAoqCioqICBDYWxjdWxhdGVzIHRoZSBNYWduaXR1ZGUgb2YgdGhlIFRpbWUg
U3RlcAoqCgogICAgICBpbXBsaWNpdCByZWFsKjggKGEtaCxvLXopCiAgICAgIGltcGxpY2l0IGlu
dGVnZXIgKGktbikKCioqICBEaW1lbnNpb24gb2YgdGhlIEFycmF5cyAobngxPS4uLiwgbngyPS4u
LiwgLi4pCiNpbmNsdWRlICJoaC5pbmMiCgoqKiAgTWluaW11bS9NYXhpbXVtIFZhbHVlcwogICAg
ICBjb21tb24gL0gyRF9taW5tYXh0LyB0ZW1wbWluLHRlbXBtYXgsaXRlbXB4CiAgICAgIGNvbW1v
biAvSDJEX21pbm1heHIvIHJobWluLHJobWF4LGlyaG8KICAgICAgY29tbW9uIC9IMkRfbWlubWF4
ZS8gZXJtaW4sZXJtYXgsaWVyYWQKICAgICAgY29tbW9uIC9oMmRfY29uc2Vydi8gaWV0b3QsaXNv
dGgsaXNvZGVuCgoKKiogIEZvciB0aW1pbmcgdGhlIHJvdXRpbmUKICAgICAgVElNMD1TRUNORCgp
CgoqKiAgQm91bmRhcnkgQ29uZGl0aW9ucwogICAgICBjYWxsIGJvdW5kcwoKKiogIENoZWNrIGZv
ciBuZWdhdGl2ZSB2YWx1ZXMgb2YgcmhvLCBULCBFciBvciBQZwogICAgICBpZiAoaXJoby5lcS4w
KSB0aGVuCiAgICAgICAgRE8gSj0wLE5ZKzEKICAgICAgICAgIERPIEk9MCxOWCsxCiAgICAgICAg
ICAgIElGIChSSChJLEopLkxFLjAuMCkgR09UTyA1MDAKICAgICAgICAgIGVuZCBkbwogICAgICAg
IGVuZCBkbwogICAgICBlbmQgaWYKICAgICAgaWYgKGllcmFkLmVxLjApIHRoZW4KICAgICAgICBE
TyBKPTAsTlkrMQogICAgICAgICAgRE8gST0wLE5YKzEKICAgICAgICAgICAgSUYgKEVSKEksSiku
TEUuMC4wKSBHT1RPIDUwMAogICAgICAgICAgZW5kIGRvCiAgICAgICAgZW5kIGRvCiAgICAgIGVu
ZCBpZgogICAgICBpZiAoaXRlbXB4LmVxLjAgLm9yLiBpc290aC5lcS4wKSB0aGVuCiAgICAgICAg
RE8gSj0wLE5ZKzEKICAgICAgICAgIERPIEk9MCxOWCsxCiAgICAgICAgICAgIElGIChUKEksSiku
TEUuMC4wKSBHT1RPIDUwMAogICAgICAgICAgZW5kIGRvCiAgICAgICAgZW5kIGRvCiAgICAgIGVu
ZCBpZgoKKiogIGlmIGZkZWx0PTAuID4+IGRlbHQ9ZHRtYXgKICAgICAgSUYgKEZERUxULkVRLjAu
MCkgVEhFTgogICAgICAgIERFTFQ9RFRNQVgKICAgICAgICBHT1RPIDkwMAogICAgICBFTFNFCiAg
ICAgICAgREVMVD1ERUxUKjEwMC4vRkRFTFQKICAgICAgRU5EIElGCgoqKiAgTW9kaWZpY2F0aW9u
OiBPY3RvYmVyIDk2IAoqKiAgU291bmR2ZWxvY2l0eQoqKiAgVHlwZSBpcyBkZXRlcm1pbmVkIGZy
b20gcGFyYW1ldGVyIGlkZWx0CiAgICAgIGlmIChpZGVsdC5uZS5pY3N0eXAgLmFuZC4gbW9kdHlw
Lm5lLjQpIHRoZW4KICAgICAgICBpY3NvbGQ9aWNzdHlwCiAgICAgICAgaWNzdHlwPWlkZWx0CiAg
ICAgICAgY2FsbCBzb3VuZAogICAgICAgIGljc3R5cD1pY3NvbGQKICAgICAgZW5kIGlmCgoqKiAg
RGV0ZXJtaW5lIE1pbmltdW0gVmFsdWUKICAgICAgRE8gMTIwIEo9MSxOWQogICAgICAgIERPIDEx
MCBJPTEsTlgKICAgICAgICAgIERFTFQ9TUlOKERYQShJKzEpLyhBQlMoVihJKzEsSikpK2NzKGks
aikpCiAgICAgJiAgICAgICAgLERZQShKKzEpLyhBQlMoRyhJLEorMSkpK0NTKGksaikqR0VPWEcx
KGkpKSxERUxUKQoqKiAgICAgICYgICAgICAgICxEWUEoSisxKS8oQUJTKEcoSSxKKzEpK29tcm90
KStDUyhpLGopKkdFT1hHMShpKSksREVMVCkKIDExMCAgICBDT05USU5VRQogMTIwICBDT05USU5V
RQoKICAgICAgaWYgKChtb2R0eXAuZXEuNCAub3IuIG1vZHR5cC5lcS4yNCkgLmFuZC4gaWRlbHQu
ZXEuMTApIHRoZW4KKiogIEFkanVzdCBmb3IgbW90aW9uIG9mIGJpbmFyeSBzdGFyCiAgICAgICAg
emMzPTEwLmQwCiAgICAgICAgRE8gMjIwIEo9MSxOWQogICAgICAgICAgemMzPW1pbih6YzMsZHlh
KGopKQogMjIwICAgIENPTlRJTlVFCiAgICAgICAgdGltZnJhYz0yLjBkMCptaW4ocnN0YXJzKDEp
KioyLHJzdGFycygyKSoqMikvc3FydCgxLjBkMC1ycGUqKjIpCiAgICAgICAgZGVsdD1taW4oZGVs
dCx6YzMqdGltZnJhYykKICAgICAgICBkZWx0PTAuOWQwKmRlbHQKICAgICAgZW5kIGlmCgoqKiAg
U2V0IHRoZSBzb3VuZCB2ZWxvY2l0eSBiYWNrIQogICAgICBpZiAoaWRlbHQubmUuaWNzdHlwIC5h
bmQuIG1vZHR5cC5uZS40KSB0aGVuCiAgICAgICAgY2FsbCBzb3VuZAogICAgICBlbmQgaWYKCiAg
ICAgIERFTFQ9ICBNSU4gKERFTFQsRFRNQVgpICogRkRFTFQKICAgICAgR09UTyA5MDAKCgoqKiAg
RXJyb3IgQnJhbmNoIDogVmFsdWUgIG5lZ2F0aXZlICEhCiA1MDAgIENPTlRJTlVFCiAgICAgIFdS
SVRFKDE2LCopICcgVGVtcC4gb3IgRGVuc2l0eSBuZWdhdGl2ZSBpbiBHcmlkcHQuIEksSj0gJyxJ
LEoKICAgICAgV1JJVEUoMTYsKikgJyBnYXMgVC4gICA9ICcsVChJLEopCiAgICAgIFdSSVRFKDE2
LCopICcgRGVuc2l0eSAgPSAnLFJIKEksSikKICAgICAgV1JJVEUoMTYsKikgJyByYWQuIEVuLiA9
ICcsRVIoSSxKKQogICAgICBXUklURSgxNiwqKSAnIGdhcyBQLiAgID0gJyxQRyhJLEopCiAgICAg
IFdSSVRFKDE2LCopCgogICAgICBDQUxMIExJU1QyRCAoMCxOWDIsMCxOWTIsRVIsMSxOWCsxLDEs
CiAgICAgMSAgICAgICAgIDEsMTMsMSwnUkFEIEVORVJHWScpCiAgICAgIENBTEwgTElTVDJEICgw
LE5YMiwwLE5ZMixULDEsTlgrMSwxLAogICAgIDEgICAgICAgICAxLDEzLDEsJ0dBUyBUZW1wZXJh
dHVyZScpCiAgICAgIENBTEwgTElTVDJEICgwLE5YMiwwLE5ZMixSSCwxLE5YKzEsMSwKICAgICAx
ICAgICAgICAgMSwxMywxLCcgREVOU0lUWSAgJykKICAgICAgQ0FMTCBMSVNUMkQgKDAsTlgyLDAs
TlkyLFYsMSxOWCsxLDEsCiAgICAgMSAgICAgICAgIDEsMTMsMSwnUkFEIFZFTE9DSVRZJykKICAg
ICAgQ0FMTCBMSVNUMkQgKDAsTlgyLDAsTlkyLEcsMSxOWCsxLDEsCiAgICAgMSAgICAgICAgIDEs
MTMsMSwnTUVSIEFORyBWRUwnKQogICAgICBDQUxMIERSVUNLICgyKQogICAgICBDQUxMIERSVUNL
ICg1KQogICAgICBDQUxMIERSVUNLICgzKQoKKiAgIEFib3J0IDoKICAgICAgd3JpdGUoMTYsKikg
JyAqKioqKiBTQ0hSSVRUOiBBYm9ydCEnCiAgICAgIHdyaXRlKCosKikgJyAqKioqKiBTQ0hSSVRU
OiBBYm9ydCEnCiAgICAgIGNhbGwgZmluaXMKCiA5MDAgIENPTlRJTlVFCgogICAgICBDUFVTQ0g9
Q1BVU0NIK1NFQ05EKCktVElNMAoKICAgICAgUkVUVVJOCiAgICAgIEVORAogICAgICBTVUJST1VU
SU5FIENPUkRFTgoqCioqICBDb3JyZWN0cyBEZW5zaXRpZXMgYWNjb3JkaW5nIHRvIHRoZSBGbHV4
LAoqKiAgT25seSBmb3IgVkFEIFRlc3QtTW9kZWwgKG1vZHR5cD05MywgYW5kIG1vZHZlcj05NCkK
KgogICAgICBpbXBsaWNpdCByZWFsKjggKGEtaCxvLXopCiAgICAgIGltcGxpY2l0IGludGVnZXIg
KGktbikKCioqICBEaW1lbnNpb24gb2YgdGhlIEFycmF5cyAobngxPS4uLiwgbngyPS4uLiwgLi4p
CiNpbmNsdWRlICJoaC5pbmMiCgogICAgICAgICAgWE1TT0wgID0gMS45OSBFICAzMwogICAgICAg
ICAgR1JBViAgPSA2LjY3IEUgLSA4CiAgICAgICAgICBTUiAgICA9IDUuNjcgRSAtIDUKICAgICAg
ICAgIFJHQVMgID0gOC4zMSBFICAgNwoKICAgICAgICAgIGRyYWQ9KHh4YShueCsxKSt4eGEoMSkp
LzIuCgogICAgICAgICAgRE1ET1Q9RE1GTCAqIDYuMzRFMjUgICAgICAgCiAgICAgICAgICBEVEVG
RiA9ICgzLi84Li9QSS9TUipHUkFWKlhNU1RBUipYTVNPTCpETURPVC8oZHJhZCpSMCkqKjMKICAg
ICAmICAgICAgKigxLjAtREJFVEEqU1FSVChSQk9VTkQvRFJBRCkpICkqKjAuMjUgL3RlbXAwCgog
ICAgICAgICAgQ0FMTCBldGFjYWxjCiAgICAgICAgICBERkxVWD0wLjAKICAgICAgICAgIERPIDEw
IEo9MSxOWQogICAgICAgICAgICBERkxVWD1ERkxVWCtFVEEoMSxqKSpEWUEoaisxKQogIDEwICAg
ICAgQ09OVElOVUUKCiAgICAgICAgICBERkxVWD0gREZMVVggKiA5Li80LiAvIGRyYWQqKjMKICAg
ICAgICAgIFRIRkxVWD0gU1JBRCpEVEVGRioqNAoKICAgICAgICAgIERPIDMwIGk9MSxOWCsxCiAg
ICAgICAgICAgIERPIDIwIGo9MCxOWSsxCiAgICAgICAgICAgICAgUkgoaSxqKT1USEZMVVgvREZM
VVgqUkgoaSxqKQogMjAgICAgICAgICBDT05USU5VRQogMzAgICAgICAgQ09OVElOVUUKCiAgICAg
IFJFVFVSTgogICAgICBFTkQKICAgICAgU1VCUk9VVElORSBWQVJMSU1JVChpbGltaXQsZmVsZCx2
YXJtaW4sdmFybWF4LHN0cmluZyxzdHJpbmcyKQoqCioqICBJbXBvc2VzIGxpbWl0cyBvbiB0aGUg
cGh5c2ljYWwgdmFyaWFibGVzCioKCiAgICAgIGltcGxpY2l0IHJlYWwqOCAoYS1oLG8teikKICAg
ICAgaW1wbGljaXQgaW50ZWdlciAoaS1uKQoKI2luY2x1ZGUgImhoLmluYyIKCiAgICAgIGRpbWVu
c2lvbiBmZWxkICgwOk5YMiwwOk5ZMikKICAgICAgQ0hBUkFDVEVSIFNUUklORyooKiksU1RSSU5H
MiooKikKCiAgICAgIElGIChpbGltaXQuZ2UuMSkgVEhFTgogICAgICAgIERPIDIwIEo9MSxOWQog
ICAgICAgICAgRE8gMTAgST0xLE5YCiAgICAgICAgICAgIGZlbGQoSSxKKT1taW4oZmVsZChpLGop
LHZhcm1heCkKICAgICAgICAgICAgZmVsZChJLEopPW1heChmZWxkKGksaiksdmFybWluKQogMTAg
ICAgICAgQ09OVElOVUUKIDIwICAgICBDT05USU5VRQogICAgICAgIGNhbGwgYm91bmRzCgogICAg
ICBlbHNlIElGIChpbGltaXQubHQuMCkgVEhFTgogICAgICAgIERPIDEyMCBKPTEsTlkKICAgICAg
ICAgIERPIDExMCBJPTEsTlgKICAgICAgICAgICAgaWYgKGZlbGQoaSxqKS5ndC52YXJtYXgpIHRo
ZW4KICAgICAgICAgICAgICBmZWxkKEksSik9dmFybWF4CiAgICAgICAgICAgICAgV1JJVEUoMTYs
KikgJyoqICAnLHN0cmluZywnIGluICgnLEksJywnLEosJyknCiAgICAgJiAgICAgICAgICAgICAg
ICAgICwnIGxvd2VyZWQgISAnLHN0cmluZzIKICAgICAgICAgICAgZW5kIGlmCiAgICAgICAgICAg
IGlmIChmZWxkKGksaikubHQudmFybWluKSB0aGVuCiAgICAgICAgICAgICAgZmVsZChJLEopPXZh
cm1pbgogICAgICAgICAgICAgIFdSSVRFKDE2LCopICcqKiAgJyxzdHJpbmcsJyBpbiAoJyxJLCcs
JyxKLCcpJwogICAgICYgICAgICAgICAgICAgICAgICAsJyBlbmhhbmNlZCAhICcsc3RyaW5nMgog
ICAgICAgICAgICBlbmQgaWYKIDExMCAgICAgIENPTlRJTlVFCiAxMjAgICAgQ09OVElOVUUKCiAg
ICAgICAgY2FsbCBib3VuZHMKICAgICAgRU5EIElGCgogICAgICByZXR1cm4KICAgICAgZW5kCiAg
ICAgIFNVQlJPVVRJTkUgVkVMTElNSVQoaXZlbCx2ZWxkaW0sdnRtYXgsc3RyaW5nLHN0cmluZzIp
CioKKiogIEltcG9zZXMgbGltaXRzIG9uIHRoZSBWZWxvY2l0aWVzCioKCiAgICAgIGltcGxpY2l0
IHJlYWwqOCAoYS1oLG8teikKICAgICAgaW1wbGljaXQgaW50ZWdlciAoaS1uKQoKICAgICAgcGFy
YW1ldGVyICh4ZG1pbj0xLjBkLTMwKQoKKiogIERpbWVuc2lvbiBvZiB0aGUgQXJyYXlzIChueDE9
Li4uLCBueDI9Li4uLCAuLikKI2luY2x1ZGUgImhoLmluYyIKCiAgICAgIENIQVJBQ1RFUiBTVFJJ
TkcqKCopLFNUUklORzIqKCopCgoKICAgICAgaWYgKGl2ZWwuZXEuMSkgdGhlbgogICAgICAgIERP
IDIwIEo9MSxOWQogICAgICAgICAgRE8gMTAgST0xLE5YCiAgICAgICAgICAgIFYoSSxKKT1WKEks
SikvKEFCUyhWKEksSikpK3hkbWluKQogICAgICYgICAgICAgICAgICAgICogbWluKGFicyh2KGks
aikpLDAuNSAqIHZlbGRpbSooYWJzKHYoaSxqKSkrVlRNQVgpKQoKICAgICAgICAgICAgRyhJLEop
PUcoSSxKKS8oQUJTKEcoSSxKKSkreGRtaW4pCiAgICAgJiAgICAgICAqIG1pbihhYnMoZyhpLGop
KSwwLjUqdmVsZGltKihhYnMoZyhpLGopKStWVE1BWCpHRU9YQjEoaSkpKQogMTAgICAgICAgY29u
dGludWUKIDIwICAgICBjb250aW51ZQoKICAgICAgICBjYWxsIGJvdW5kcwoKICAgICAgZWxzZSBp
ZiAoaXZlbC5lcS4yKSB0aGVuCiAgICAgICAgRE8gMjIwIEo9MSxOWQogICAgICAgICAgRE8gMjEw
IEk9MSxOWAogICAgICAgICAgICBpZiAoYWJzKHYoaSxqKSkuZ3QuCiAgICAgJiAgICAgICAgMC41
KnZlbGRpbSooYWJzKHYoaSxqKSkrdnRtYXgpKSB0aGVuCiAgICAgICAgICAgICAgV1JJVEUoMTYs
KikgJyoqICAnLCcgViAgICBpbiAoJyxJLCcsJyxKLCcpJwogICAgICYgICAgICAgICAgICAgICAg
ICAsJyBsb3dlcmVkICEgJyxzdHJpbmcyCiAgICAgICAgICAgIGVuZCBpZgogICAgICAgICAgICBp
ZiAoYWJzKGcoaSxqKSkuZ3QuCiAgICAgJiAgICAgICAgMC41KnZlbGRpbSooYWJzKGcoaSxqKSkr
dnRtYXgqR0VPWEIxKGkpKSkgdGhlbgogICAgICAgICAgICAgIFdSSVRFKDE2LCopICcqKiAgJywn
IEcgICAgaW4gKCcsSSwnLCcsSiwnKScKICAgICAmICAgICAgICAgICAgICAgICAgLCcgbG93ZXJl
ZCAhICcsc3RyaW5nMgogICAgICAgICAgICBlbmQgaWYKCiAgICAgICAgICAgIFYoSSxKKT1WKEks
SikvKEFCUyhWKEksSikpK3hkbWluKQogICAgICYgICAgICAgICAgICAgICogbWluKGFicyh2KGks
aikpLDAuNSAqIHZlbGRpbSooYWJzKHYoaSxqKSkrVlRNQVgpKQoKICAgICAgICAgICAgRyhJLEop
PUcoSSxKKS8oQUJTKEcoSSxKKSkreGRtaW4pCiAgICAgJiAgICAgICAqIG1pbihhYnMoZyhpLGop
KSwwLjUqdmVsZGltKihhYnMoZyhpLGopKStWVE1BWCpHRU9YQjEoaSkpKQogMjEwICAgICAgY29u
dGludWUKIDIyMCAgICBjb250aW51ZQoKICAgICAgICBjYWxsIGJvdW5kcwoKICAgICAgZWxzZSBp
ZiAoaXZlbC5lcS4zKSB0aGVuCgogICAgICAgIERPIDQwIEo9MSxOWQogICAgICAgICAgRE8gMzAg
ST0xLE5YCiAgICAgICAgICAgIFYoSSxKKT1WKEksSikvKEFCUyhWKEksSikpK3hkbWluKQogICAg
ICYgICAgICAgICAgICptaW4oYWJzKHYoaSxqKSksIDIuKiBjcyhpLGopICogdmVsZGltKQoKCkMg
ICAgICAgICAgICAgICAgICBvbWtlcD0wLjAKCkMgICAgICAgICAgICAgICAgICBpZiAobW9kdHlw
LmVxLjQpIHRoZW4KQyAgICAgICAgICAgICAgICAgICAgb21rZXA9MS4vc3FydCh4eGIoaSkqKjMp
CkMgICAgICAgICAgICAgICAgICBlbmQgaWYKQyAgICAgICAgICAgICAgICAgIGdnPWcoaSxqKS0o
b21rZXAtb21yb3QpCkMgICAgICAgICAgICAgICAgICBnZ2E9YWJzKGdnKQpDICAgICAgICAgICAg
ICAgICAgaWYgKGdnYSpHRU9YQihpKS5nZS4yLmUrMTAqY3MoaSxqKQpDICAgICAmICAgICAgICAg
ICAgLmFuZC4gZ2dhLm5lLjAuMCkgdGhlbgpDICAgICAgICAgICAgICAgICAgICBHKEksSik9KG9t
a2VwLW9tcm90KSArIGdnL2dnYQpDICAgICAmICAgICAgICAgICAgICAgICAqIDIuKiBjcyhpLGop
KkdFT1hCMShpKSAqIHZlbGRpbQpDICAgICAgICAgICAgICAgICAgICBpZiAoaXZlbC5lcS4tMikg
dGhlbgpDICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKDE2LCopICcqKioqKiogIFktVmVsLiBp
biAoJyxJLCcsJyxKLCcpJwpDICAgICAmICAgICAgICAgICAgICAgICAgLCcgcmVkdWNlZCEnCkMg
ICAgICAgICAgICAgICAgICAgIGVuZCBpZgpDICAgICAgICAgICAgICAgICAgZW5kIGlmCgoKIDMw
ICAgICAgIENPTlRJTlVFCiA0MCAgICAgQ09OVElOVUUKCiAgICAgICAgY2FsbCBib3VuZHMKCiAg
ICAgIGVsc2UgaWYgKGl2ZWwuZXEuNCkgdGhlbgoqKiAgVmVsb2NpdGllcyBub3QgbGFyZ2VyIHRo
YW4gIHZlbGRpbSB0aW1lcyB0aGUgKGxvY2FsKSBzb3VuZCBzcGVlZAogICAgICAgIERPIDQyMCBK
PTEsTlkKICAgICAgICAgIERPIDQxMCBJPTEsTlgKICAgICAgICAgICAgVihJLEopPVYoSSxKKS8o
QUJTKFYoSSxKKSkreGRtaW4pCiAgICAgJiAgICAgICAgICAgICAgKiBtaW4oYWJzKHYoaSxqKSks
IDAuNSp2ZWxkaW0qKGNzKGksaikrY3MoaSsxLGopKSkKCiAgICAgICAgICAgIEcoSSxKKT1HKEks
SikvKEFCUyhHKEksSikpK3hkbWluKQogICAgICYgICAgICAgKiBtaW4oYWJzKGcoaSxqKSksMC41
KnZlbGRpbSooY3MoaSxqKStjcyhpLGorMSkpKkdFT1hCMShpKSkKIDQxMCAgICAgICBjb250aW51
ZQogNDIwICAgICBjb250aW51ZQoKICAgICAgICBjYWxsIGJvdW5kcwoKICAgICAgZWxzZSBpZiAo
aXZlbC5lcS41IC5vci4gaXZlbC5lcS4xNSkgdGhlbgoqKiAgVmVsb2NpdGllcyBub3QgbGFyZ2Vy
IHRoYW4gIHZlbGRpbSB0aW1lcyB0aGUgc3BlZWQgb2YgbGlnaHQKICAgICAgICBETyA1MjAgSj0x
LE5ZCiAgICAgICAgICBETyA1MTAgST0xLE5YCiAgICAgICAgICAgaWYgKGl2ZWwuZXEuMTUpIHRo
ZW4KICAgICAgICAgICAgaWYgKGFicyh2KGksaikpLmd0LgogICAgICYgICAgICAgIDAuNSp2ZWxk
aW0qKGFicyh2KGksaikpK2ZkKSkgdGhlbgogICAgICAgICAgICAgIFdSSVRFKDE2LCopICcqKiAg
JywnIFYgICAgaW4gKCcsSSwnLCcsSiwnKScKICAgICAmICAgICAgICAgICAgICAgICAgLCcgbG93
ZXJlZCAhICcsc3RyaW5nMgogICAgICAgICAgICBlbmQgaWYKICAgICAgICAgICAgaWYgKGFicyhn
KGksaikpLmd0LgogICAgICYgICAgICAgIDAuNSp2ZWxkaW0qKGFicyhnKGksaikpK2ZkKkdFT1hC
MShpKSkpIHRoZW4KICAgICAgICAgICAgICBXUklURSgxNiwqKSAnKiogICcsJyBHICAgIGluICgn
LEksJywnLEosJyknCiAgICAgJiAgICAgICAgICAgICAgICAgICwnIGxvd2VyZWQgISAnLHN0cmlu
ZzIKICAgICAgICAgICAgZW5kIGlmCiAgICAgICAgICAgZW5kIGlmCiAgICAgICAgICAgIFYoSSxK
KT1WKEksSikvKEFCUyhWKEksSikpK3hkbWluKQogICAgICYgICAgICAgICAgICAgICogbWluKGFi
cyh2KGksaikpLDAuNSAqIHZlbGRpbSooYWJzKHYoaSxqKSkrZmQpKQoKICAgICAgICAgICAgRyhJ
LEopPUcoSSxKKS8oQUJTKEcoSSxKKSkreGRtaW4pCiAgICAgJiAgICAgICAqIG1pbihhYnMoZyhp
LGopKSwwLjUqdmVsZGltKihhYnMoZyhpLGopKStmZCpHRU9YQjEoaSkpKQogNTEwICAgICAgIGNv
bnRpbnVlCiA1MjAgICAgIGNvbnRpbnVlCgogICAgICAgIGNhbGwgYm91bmRzCgogICAgICBlbmQg
aWYKCiAgICAgIHJldHVybgogICAgICBlbmQK