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 &lt;</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">&gt; 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>
&lt;<a href=3D"mailto:[email protected]" target=3D"_blank">philipp=
[email protected]</a>&gt; wrote:<br>
&gt;<br>
&gt; 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&#39;m unsure what to do with this one.<br>
<br>
Ksh doesn&#39;t have ${x::=3Dy} so there&#39;s no direct comparison.<br>
<br>
With &quot;ref&quot; undeclared or with `typeset -n ref` (placeholder),<br>
${!ref:=3Dvar} ksh always returns &quot;ref&quot; and ignores the assignmen=
t.<br>
<br>
So we&#39;re in a bit of uncharted territory here.=C2=A0 It&#39;s not clear=
 that<br>
::=3D should alter &quot;ref&quot;.<br></blockquote><div><br></div><div>As =
discussed in=C2=A0<a href=3D"https://zsh.org/workers/55013">workers/55013</=
a>, ksh&#39;s ! doesn&#39;t have much to do with Zsh&#39;s (!). Afaik, ther=
e is no equivalent of=C2=A0<span style=3D"background-color:transparent">Zsh=
&#39;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&#39;s definitely=C2=A0not what we want for th=
e same reason we don&#39;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 &quot;name&quot; is NOT dereferenced=
 and it&#39;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 &quot;typeset -gn ref=3Dword&quot; a=
nd then expand to &quot;${(!)ref}&quot;.</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--