Re: [PATCH] Fix bang flag in ${(!)ref::=var} substitutions
Philippe Altherr <[email protected]> Thu, 23 Jul 2026 17:28:47 +0200
| Newsgroups | gmane.comp.shells.zsh.devel |
|---|---|
| Message-ID | <CAGdYchssfOO0KY-kkcQZYQ=iU_mU3genT2a0ptb=+-z7Kr0EqQ@mail.gmail.com> |
--00000000000037ccfa065748ea3d Content-Type: multipart/alternative; boundary="00000000000037ccf8065748ea3b" --00000000000037ccf8065748ea3b Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Sun, Jul 19, 2026 at 11:06=E2=80=AFPM Bart Schaefer <schaefer@brasslante= rn.com> wrote: > On Fri, Jul 10, 2026 at 5:06=E2=80=AFAM Philippe Altherr > <[email protected]> wrote: > > > > The documentation states that with the substitution flag (!) the > reference itself is examined, not its referent, but this fails in > ${(!)ref::=3Dvar} substitutions: > > I'm unsure what to do with this one. > > Ksh doesn't have ${x::=3Dy} so there's no direct comparison. > > With "ref" undeclared or with `typeset -n ref` (placeholder), > ${!ref:=3Dvar} ksh always returns "ref" and ignores the assignment. > > So we're in a bit of uncharted territory here. It's not clear that > ::=3D should alter "ref". > As discussed in workers/55013 <https://zsh.org/workers/55013>, ksh's ! doesn't have much to do with Zsh's (!). Afaik, there is no equivalent of Zs= h's (!) in ksh. So we are on our own. Is this a precedence issue? I.e., should ${(!)ref::=3Dvar} be > equivalent to ${(!)${ref::=3Dvar}} ? (Which is the current behavior, > right?) > Indeed, that produces the same result but in my opinion that's definitely not what we want for the same reason we don't want ${(!)ref} to be the same as ${(!)${ref}}, which is the same as ${ref}. My reasoning is pretty simple. Zsh supports many different kinds of expansion forms, like ${name}, ${name-word}, ${name+word}, ${name#pattern}. In all of these, if (!) is used, the parameter "name" is NOT dereferenced and it's its own value (the name of the referred variable) that is used. For the same reason, ${name=3Dword}, ${name:=3Dword} and ${name::=3Dword} s= hould all act on that same value. Thus, ${(!)ref::=3Dword} should always have the same effect as the assignment in "typeset -gn ref=3Dword" and then expand t= o "${(!)ref}". Implementation-wise the patch simply makes it such that paramsubst can pass SCANPM_NONAMEREF, or an equivalent of it, not only to fetchvalue but also to assignsparam and assignaparam. Below is an updated patch obtained after rebasing onto HEAD. - Fix bang flag in ${(!)ref::=3Dvar} substitutions <https://github.com/paltherr/zsh/compare/fix-bang-flag-in-substitutions-sta= rt...paltherr:zsh:fix-bang-flag-in-substitutions> Philippe --00000000000037ccf8065748ea3b Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable <div dir=3D"ltr"><div dir=3D"ltr"><span style=3D"background-color:transpare= nt">On Sun, Jul 19, 2026 at 11:06=E2=80=AFPM Bart Schaefer <</span><a hr= ef=3D"mailto:[email protected]" target=3D"_blank" style=3D"backgrou= nd-color:transparent">[email protected]</a><span style=3D"backgroun= d-color:transparent">> wrote:</span></div><div class=3D"gmail_quote"><bl= ockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-lef= t:1px solid rgb(204,204,204);padding-left:1ex">On Fri, Jul 10, 2026 at 5:06= =E2=80=AFAM Philippe Altherr<br> <<a href=3D"mailto:[email protected]" target=3D"_blank">philipp= [email protected]</a>> wrote:<br> ><br> > The documentation states that with the substitution flag (!) the refer= ence itself is examined, not its referent, but this fails in ${(!)ref::=3Dv= ar} substitutions:<br> <br> I'm unsure what to do with this one.<br> <br> Ksh doesn't have ${x::=3Dy} so there's no direct comparison.<br> <br> With "ref" undeclared or with `typeset -n ref` (placeholder),<br> ${!ref:=3Dvar} ksh always returns "ref" and ignores the assignmen= t.<br> <br> So we're in a bit of uncharted territory here.=C2=A0 It's not clear= that<br> ::=3D should alter "ref".<br></blockquote><div><br></div><div>As = discussed in=C2=A0<a href=3D"https://zsh.org/workers/55013">workers/55013</= a>, ksh's ! doesn't have much to do with Zsh's (!). Afaik, ther= e is no equivalent of=C2=A0<span style=3D"background-color:transparent">Zsh= 's (!) in ksh. So we are on our own.</span></div><div><br></div><blockq= uote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1p= x solid rgb(204,204,204);padding-left:1ex"> Is this a precedence issue?=C2=A0 I.e., should ${(!)ref::=3Dvar} be<br> equivalent to ${(!)${ref::=3Dvar}} ?=C2=A0 (Which is the current behavior,<= br> right?)<br></blockquote><div><br></div><div>Indeed, that produces the same = result but in my opinion that's definitely=C2=A0not what we want for th= e same reason we don't want ${(!)ref} to be the same as ${(!)${ref}}, w= hich is the same as ${ref}.</div><div><br></div><div>My reasoning is pretty= simple. Zsh supports many different kinds of expansion forms, like=C2=A0${= name},=C2=A0${name-word},=C2=A0${name+word},=C2=A0${name#pattern}. In all o= f these, if (!) is used, the parameter "name" is NOT dereferenced= and it's its own value (the name of the referred variable) that is use= d. For the same reason,=C2=A0<span style=3D"background-color:transparent">$= {name=3Dword},=C2=A0</span><span style=3D"background-color:transparent">${n= ame:=3Dword} and=C2=A0</span><span style=3D"background-color:transparent">$= {name::=3Dword} should all act on that same value. Thus,=C2=A0</span><span = style=3D"background-color:transparent">${(!)ref::=3Dword} should always hav= e the same effect as the assignment in "typeset -gn ref=3Dword" a= nd then expand to "${(!)ref}".</span></div><div><span style=3D"ba= ckground-color:transparent"><br></span></div><div><span style=3D"background= -color:transparent">Implementation-wise the patch simply makes it such that= =C2=A0</span>paramsubst=C2=A0<span style=3D"background-color:transparent">c= an pass </span><span style=3D"background-color:transparent">SCANPM_NONAMERE= F, or an equivalent of it, not only to=C2=A0</span>fetchvalue but also=C2= =A0<span style=3D"background-color:transparent">to=C2=A0</span>assignsparam= <span style=3D"background-color:transparent">=C2=A0and=C2=A0</span><span st= yle=3D"background-color:transparent">assignaparam</span><span style=3D"back= ground-color:transparent">.</span></div><div><span style=3D"background-colo= r:transparent"><br></span></div><div><span style=3D"background-color:transp= arent">Below is an updated patch obtained after rebasing onto HEAD.</span><= /div><div><span style=3D"background-color:transparent"><br></span></div><di= v>-=C2=A0<a href=3D"https://github.com/paltherr/zsh/compare/fix-bang-flag-i= n-substitutions-start...paltherr:zsh:fix-bang-flag-in-substitutions" target= =3D"_blank">Fix bang flag in ${(!)ref::=3Dvar} substitutions</a><span style= =3D"background-color:transparent"></span></div><div><span style=3D"backgrou= nd-color:transparent"><br></span></div><div><span style=3D"background-color= :transparent">Philippe</span></div><div><span style=3D"background-color:tra= nsparent"><br></span></div></div> </div> --00000000000037ccf8065748ea3b-- --00000000000037ccfa065748ea3d Content-Type: text/plain; charset="US-ASCII"; name="fix-bang-flag-in-substitutions.txt" Content-Disposition: attachment; filename="fix-bang-flag-in-substitutions.txt" Content-Transfer-Encoding: base64 Content-ID: <f_mrumwmcr0> X-Attachment-Id: f_mrumwmcr0 ZGlmZiAtLWdpdCBhL1NyYy9wYXJhbXMuYyBiL1NyYy9wYXJhbXMuYwppbmRleCA3NDA5ZmY1MzAu LjcwMTllYzhlMCAxMDA2NDQKLS0tIGEvU3JjL3BhcmFtcy5jCisrKyBiL1NyYy9wYXJhbXMuYwpA QCAtMzE0Myw2ICszMTQzLDcgQEAgYXNzaWduc3BhcmFtKGNoYXIgKnMsIGNoYXIgKnZhbCwgaW50 IGZsYWdzKQogICAgIHNpemVfdCBsdmFyOwogICAgIG1udW1iZXIgbGhzLCByaHM7CiAgICAgaW50 IHNzdGFydCwgY3JlYXRlZCA9IDA7CisgICAgaW50IHNjYW5mbGFncyA9IGZsYWdzICYgQVNTUE1f Tk9OQU1FUkVGID8gU0NBTlBNX05PTkFNRVJFRiA6IDA7CiAKICAgICBpZiAoIWlzaWRlbnQocykp IHsKIAl6ZXJyKCJub3QgYW4gaWRlbnRpZmllcjogJXMiLCBzKTsKQEAgLTMxNTMsNyArMzE1NCw3 IEBAIGFzc2lnbnNwYXJhbShjaGFyICpzLCBjaGFyICp2YWwsIGludCBmbGFncykKICAgICBxdWV1 ZV9zaWduYWxzKCk7CiAgICAgaWYgKChzcyA9IHN0cmNocihzLCAnWycpKSkgewogCSpzcyA9ICdc MCc7Ci0JaWYgKCEodiA9IGdldHZhbHVlKCZ2YnVmLCAmcywgMSkpKSB7CisJaWYgKCEodiA9IGZl dGNodmFsdWUoJnZidWYsICZzLCAxLCBzY2FuZmxhZ3MpKSkgewogCSAgICBjcmVhdGVwYXJhbSh0 LCBQTV9BUlJBWSk7CiAJICAgIGNyZWF0ZWQgPSAxOwogCX0gZWxzZSB7CkBAIC0zMTc0LDcgKzMx NzUsNyBAQCBhc3NpZ25zcGFyYW0oY2hhciAqcywgY2hhciAqdmFsLCBpbnQgZmxhZ3MpCiAJKnNz ID0gJ1snOwogCXYgPSBOVUxMOwogICAgIH0gZWxzZSB7Ci0JaWYgKCEodiA9IGdldHZhbHVlKCZ2 YnVmLCAmcywgMSkpKSB7CisJaWYgKCEodiA9IGZldGNodmFsdWUoJnZidWYsICZzLCAxLCBzY2Fu ZmxhZ3MpKSkgewogCSAgICBjcmVhdGVwYXJhbSh0LCBQTV9TQ0FMQVIpOwogCSAgICBjcmVhdGVk ID0gMTsKIAl9IGVsc2UgaWYgKCgoKHYtPnBtLT5ub2RlLmZsYWdzICYgUE1fQVJSQVkpICYmCkBA IC0zMTkyLDcgKzMxOTMsNyBAQCBhc3NpZ25zcGFyYW0oY2hhciAqcywgY2hhciAqdmFsLCBpbnQg ZmxhZ3MpCiAJICAgIHYgPSBOVUxMOwogCX0KICAgICB9Ci0gICAgaWYgKCF2ICYmICEodiA9IGdl dHZhbHVlKCZ2YnVmLCAmdCwgMSkpKSB7CisgICAgaWYgKCF2ICYmICEodiA9IGZldGNodmFsdWUo JnZidWYsICZ0LCAxLCBzY2FuZmxhZ3MpKSkgewogCXpzZnJlZSh2YWwpOwogCXVucXVldWVfc2ln bmFscygpOwogCS8qIGVycmZsYWcgfD0gRVJSRkxBR19FUlJPUjsgKi8KQEAgLTMzMDUsNiArMzMw Niw3IEBAIGFzc2lnbmFwYXJhbShjaGFyICpzLCBjaGFyICoqdmFsLCBpbnQgZmxhZ3MpCiAgICAg Y2hhciAqc3M7CiAgICAgaW50IGNyZWF0ZWQgPSAwOwogICAgIGludCBtYXlfd2Fybl9hYm91dF9u ZXN0ZWRfdmFycyA9IDE7CisgICAgaW50IHNjYW5mbGFncyA9IGZsYWdzICYgQVNTUE1fTk9OQU1F UkVGID8gU0NBTlBNX05PTkFNRVJFRiA6IDA7CiAKICAgICBpZiAoIWlzaWRlbnQocykpIHsKIAl6 ZXJyKCJub3QgYW4gaWRlbnRpZmllcjogJXMiLCBzKTsKQEAgLTMzMTUsNyArMzMxNyw3IEBAIGFz c2lnbmFwYXJhbShjaGFyICpzLCBjaGFyICoqdmFsLCBpbnQgZmxhZ3MpCiAgICAgcXVldWVfc2ln bmFscygpOwogICAgIGlmICgoc3MgPSBzdHJjaHIocywgJ1snKSkpIHsKIAkqc3MgPSAnXDAnOwot CWlmICghKHYgPSBnZXR2YWx1ZSgmdmJ1ZiwgJnMsIDEpKSkgeworCWlmICghKHYgPSBmZXRjaHZh bHVlKCZ2YnVmLCAmcywgMSwgc2NhbmZsYWdzKSkpIHsKIAkgICAgY3JlYXRlcGFyYW0odCwgUE1f QVJSQVkpOwogCSAgICBjcmVhdGVkID0gMTsKIAl9IGVsc2UgewpAQCAtMzMzMiw3ICszMzM0LDcg QEAgYXNzaWduYXBhcmFtKGNoYXIgKnMsIGNoYXIgKip2YWwsIGludCBmbGFncykKIAl9CiAJdiA9 IE5VTEw7CiAgICAgfSBlbHNlIHsKLQlpZiAoISh2ID0gZmV0Y2h2YWx1ZSgmdmJ1ZiwgJnMsIDEs IFNDQU5QTV9BU1NJR05JTkcpKSkgeworCWlmICghKHYgPSBmZXRjaHZhbHVlKCZ2YnVmLCAmcywg MSwgc2NhbmZsYWdzIHwgU0NBTlBNX0FTU0lHTklORykpKSB7CiAJICAgIGNyZWF0ZXBhcmFtKHQs IFBNX0FSUkFZKTsKIAkgICAgY3JlYXRlZCA9IDE7CiAJfSBlbHNlIGlmICh2LT5wbS0+bm9kZS5m bGFncyAmIFBNX05BTUVSRUYpIHsKQEAgLTMzNjMsNyArMzM2NSw3IEBAIGFzc2lnbmFwYXJhbShj aGFyICpzLCBjaGFyICoqdmFsLCBpbnQgZmxhZ3MpCiAJfQogICAgIH0KICAgICBpZiAoIXYpCi0J aWYgKCEodiA9IGZldGNodmFsdWUoJnZidWYsICZ0LCAxLCBTQ0FOUE1fQVNTSUdOSU5HKSkpIHsK KwlpZiAoISh2ID0gZmV0Y2h2YWx1ZSgmdmJ1ZiwgJnQsIDEsIHNjYW5mbGFncyB8IFNDQU5QTV9B U1NJR05JTkcpKSkgewogCSAgICB1bnF1ZXVlX3NpZ25hbHMoKTsKIAkgICAgZnJlZWFycmF5KHZh bCk7CiAJICAgIC8qIGVycmZsYWcgfD0gRVJSRkxBR19FUlJPUjsgKi8KZGlmZiAtLWdpdCBhL1Ny Yy9zdWJzdC5jIGIvU3JjL3N1YnN0LmMKaW5kZXggMWI3NWMwMzVhLi4yNTQ0MDhlYTYgMTAwNjQ0 Ci0tLSBhL1NyYy9zdWJzdC5jCisrKyBiL1NyYy9zdWJzdC5jCkBAIC0zMjQ4LDYgKzMyNDgsOCBA QCBwYXJhbXN1YnN0KExpbmtMaXN0IGwsIExpbmtOb2RlIG4sIGNoYXIgKipzdHIsIGludCBxdCwg aW50IHBmX2ZsYWdzLAogCSAgICBpZiAodnVuc2V0KSB7CiAJCWNoYXIgc2F2ID0gKmlkZW5kOwog CQlpbnQgbCwgc3BsaXRfZmxhZ3M7CisJCWludCBhc3NpZ25fZmxhZ3MgPSBBU1NQTV9XQVJOIHwK KwkJICAgIChoa2V5cyAmIFNDQU5QTV9OT05BTUVSRUYgPyBBU1NQTV9OT05BTUVSRUYgOiAwKTsK IAogCQkqaWRlbmQgPSAnXDAnOwogCQl2YWwgPSBkdXBzdHJpbmcocyk7CkBAIC0zMzAzLDcgKzMz MDUsNyBAQCBwYXJhbXN1YnN0KExpbmtMaXN0IGwsIExpbmtOb2RlIG4sIGNoYXIgKipzdHIsIGlu dCBxdCwgaW50IHBmX2ZsYWdzLAogCQkJaWYgKHBtKQogCQkJICAgIGF2YWwgPSBwYXJhbXZhbGFy cihwbS0+Z3N1LmgtPmdldGZuKHBtKSwgaGtleXN8aHZhbHMpOwogCQkgICAgfSBlbHNlIHsKLQkJ CVBhcmFtIHBtID0gc2V0YXBhcmFtKGlkYmVnLCBhKTsKKwkJCVBhcmFtIHBtID0gYXNzaWduYXBh cmFtKGlkYmVnLCBhLCBhc3NpZ25fZmxhZ3MpOwogCQkJaWYgKHBtKSB7CiAJCQkgICAgc3RydWN0 IHZhbHVlIHZidWYgPSB7IDAgfTsKIAkJCSAgICBjaGFyICpwID0gaWRiZWc7CkBAIC0zMzE3LDcg KzMzMTksNyBAQCBwYXJhbXN1YnN0KExpbmtMaXN0IGwsIExpbmtOb2RlIG4sIGNoYXIgKipzdHIs IGludCBxdCwgaW50IHBmX2ZsYWdzLAogCQkgICAgYXJyYXNnID0gMDsKIAkJfSBlbHNlIHsKIAkJ ICAgIHVudG9rZW5pemUodmFsKTsKLQkJICAgIFBhcmFtIHBtID0gc2V0c3BhcmFtKGlkYmVnLCB6 dHJkdXAodmFsKSk7CisJCSAgICBQYXJhbSBwbSA9IGFzc2lnbnNwYXJhbShpZGJlZywgenRyZHVw KHZhbCksIGFzc2lnbl9mbGFncyk7CiAJCSAgICBpZiAocG0pIHsKIAkJCS8qIHRoaXMgY2hlY2sg aXNuJ3QgbmVlZGVkIGZvciBjb3JyZWN0bmVzcywgYnV0IGFycmF5IHZhbHVlcwogCQkJICogYXJl bid0IGFmZmVjdGVkIGJ5IFNVQlNUIGZsYWdzIGFueXdheSAqLwpkaWZmIC0tZ2l0IGEvU3JjL3pz aC5oIGIvU3JjL3pzaC5oCmluZGV4IDFmMWVjYzNlNi4uNzIwYzY2NGNjIDEwMDY0NAotLS0gYS9T cmMvenNoLmgKKysrIGIvU3JjL3pzaC5oCkBAIC0yMTQwLDcgKzIxNDAsOSBAQCBlbnVtIHsKICAg ICAgKiBUaGlzIGlzIG5vcm1hbCBmb3IgYXNzb2NpYXRpdmUgYXJyYXlzIGJ1dCB2YXJpYW50IGJl aGF2aW91ciBmb3IKICAgICAgKiBub3JtYWwgYXJyYXlzLgogICAgICAqLwotICAgIEFTU1BNX0tF WV9WQUxVRSA9IDEgPDwgNAorICAgIEFTU1BNX0tFWV9WQUxVRSA9IDEgPDwgNCwKKyAgICAvKiBO YW1lZCByZWZlcmVuY2VzIGFyZSBub3QgZm9sbG93ZWQgKi8KKyAgICBBU1NQTV9OT05BTUVSRUYg PSAxIDw8IDUKIH07CiAKIC8qIG5vZGUgZm9yIG5hbWVkIGRpcmVjdG9yeSBoYXNoIHRhYmxlIChu YW1lZGRpcnRhYikgKi8KZGlmZiAtLWdpdCBhL1Rlc3QvSzAxbmFtZXJlZi56dHN0IGIvVGVzdC9L MDFuYW1lcmVmLnp0c3QKaW5kZXggNTA4MmQxMDExLi5iNjM0OWViZjYgMTAwNjQ0Ci0tLSBhL1Rl c3QvSzAxbmFtZXJlZi56dHN0CisrKyBiL1Rlc3QvSzAxbmFtZXJlZi56dHN0CkBAIC0yMzQ5LDYg KzIzNDksNTAgQEAgRjpjb252ZXJ0aW5nIGZyb20gYXNzb2NpYXRpb24vYXJyYXkgdG8gc3RyaW5n IHNob3VsZCB3b3JrIGhlcmUgdG9vCiA+QjoxNiNGRgogPkM6MTYjRkYKIAorIHNob3coKSB7IHBy aW50ZiAiJS0xM3M6ICUtM3MgLSAlLTNzIC0gJS0zc1xuIiAiJEAiIH0KKyB0eXBlc2V0IHZhcj1h YWEKKyB0eXBlc2V0IC1uIHJlZlUgcmVmTj0iIiByZWZTPXZhcgorIHNob3cgJyR7cmVmWH0nICAg ICAgICR7KHEhKXJlZlV9ICAgICAgICR7KHEhKXJlZk59ICAgICAgICR7KHEhKXJlZlN9Cisgc2hv dyAnJHsrcmVmWH0nICAgICAgJHsocSEpK3JlZlV9ICAgICAgJHsocSEpK3JlZk59ICAgICAgJHso cSEpK3JlZlN9Cisgc2hvdyAnJHtyZWZYKzF9JyAgICAgJHsocSEpcmVmVSsxfSAgICAgJHsocSEp cmVmTisxfSAgICAgJHsocSEpcmVmUysxfQorIHNob3cgJyR7cmVmWDorMX0nICAgICR7KHEhKXJl ZlU6KzF9ICAgICR7KHEhKXJlZk46KzF9ICAgICR7KHEhKXJlZlM6KzF9CisgZWNobworIHNob3cg JyR7cmVmWC1iYmJ9JyAgICR7KHEhKXJlZlUtYmJifSAgICR7KHEhKXJlZk4tYmJifSAgICR7KHEh KXJlZlMtYmJifQorIHNob3cgJyR7cmVmWD1iYmJ9JyAgICR7KHEhKXJlZlU9YmJifSAgICR7KHEh KXJlZk49YmJifSAgICR7KHEhKXJlZlM9YmJifQorIHNob3cgJyR7cmVmWH0nICAgICAgICR7KHEh KXJlZlV9ICAgICAgICR7KHEhKXJlZk59ICAgICAgICR7KHEhKXJlZlN9Cisgc2hvdyAnJHt2YXJ9 JyAgICAgICAgJHt2YXJ9CisgZWNobworIHR5cGVzZXQgLW4gcmVmVSByZWZOPSIiIHJlZlM9dmFy Cisgc2hvdyAnJHtyZWZYOi1jY2N9JyAgJHsocSEpcmVmVTotY2NjfSAgJHsocSEpcmVmTjotY2Nj fSAgJHsocSEpcmVmUzotY2NjfQorIHNob3cgJyR7cmVmWDo9Y2NjfScgICR7KHEhKXJlZlU6PWNj Y30gICR7KHEhKXJlZk46PWNjY30gICR7KHEhKXJlZlM6PWNjY30KKyBzaG93ICcke3JlZlh9JyAg ICAgICAkeyhxISlyZWZVfSAgICAgICAkeyhxISlyZWZOfSAgICAgICAkeyhxISlyZWZTfQorIHNo b3cgJyR7dmFyfScgICAgICAgICR7dmFyfQorIGVjaG8KKyB0eXBlc2V0IC1uIHJlZlUgcmVmTj0i IiByZWZTPXZhcgorIHNob3cgJyR7cmVmWDo6PWRkZH0nICR7KHEhKXJlZlU6Oj1kZGR9ICR7KHEh KXJlZk46Oj1kZGR9ICR7KHEhKXJlZlM6Oj1kZGR9Cisgc2hvdyAnJHtyZWZYfScgICAgICAgJHso cSEpcmVmVX0gICAgICAgJHsocSEpcmVmTn0gICAgICAgJHsocSEpcmVmU30KKyBzaG93ICcke3Zh cn0nICAgICAgICAke3Zhcn0KKyB1bmZ1bmN0aW9uIHNob3cKKzA6cmVmZXJlbmNlIGl0c2VsZiBp cyBleGFtaW5lZCBpbiBzdWJzdGl0dXRpb25zIHdpdGggdGhlICEgZmxhZworPiR7cmVmWH0gICAg ICA6ICcnICAtICcnICAtIHZhcgorPiR7K3JlZlh9ICAgICA6IDAgICAtIDEgICAtIDEgIAorPiR7 cmVmWCsxfSAgICA6ICcnICAtIDEgICAtIDEgIAorPiR7cmVmWDorMX0gICA6ICcnICAtICcnICAt IDEgIAorPgorPiR7cmVmWC1iYmJ9ICA6IGJiYiAtICcnICAtIHZhcgorPiR7cmVmWD1iYmJ9ICA6 IGJiYiAtICcnICAtIHZhcgorPiR7cmVmWH0gICAgICA6IGJiYiAtICcnICAtIHZhcgorPiR7dmFy fSAgICAgICA6IGFhYSAtICAgICAtICAgIAorPgorPiR7cmVmWDotY2NjfSA6IGNjYyAtIGNjYyAt IHZhcgorPiR7cmVmWDo9Y2NjfSA6IGNjYyAtIGNjYyAtIHZhcgorPiR7cmVmWH0gICAgICA6IGNj YyAtIGNjYyAtIHZhcgorPiR7dmFyfSAgICAgICA6IGFhYSAtICAgICAtICAgIAorPgorPiR7cmVm WDo6PWRkZH06IGRkZCAtIGRkZCAtIGRkZAorPiR7cmVmWH0gICAgICA6IGRkZCAtIGRkZCAtIGRk ZAorPiR7dmFyfSAgICAgICA6IGFhYSAtICAgICAtICAgIAorCiAgdHlwZXNldCAtbiByZWYxCiAg c2V0b3B0IGFsbGV4cG9ydAogIHJlZjE9dmFyCg== --00000000000037ccfa065748ea3d--