From mboxrd@z Thu Jan 1 00:00:00 1970 X-Msuck: nntp://news.gmane.io/gmane.comp.tex.context/111504 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: "Jairo A. del Rio" Newsgroups: gmane.comp.tex.context Subject: Re: mathfun Date: Sun, 23 May 2021 10:33:00 -0500 Message-ID: References: <2463f535-9a08-71ae-f356-9c56c6599a91@xs4all.nl> <13f095c1-791d-86c4-35b9-2ee2b069b631@xs4all.nl> <91b591a4-95f8-368f-d02a-bffefa99b505@xs4all.nl> Reply-To: mailing list for ConTeXt users Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="===============0423411548312891277==" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="18158"; mail-complaints-to="usenet@ciao.gmane.io" To: Hans Hagen , mailing list for ConTeXt users Original-X-From: ntg-context-bounces@ntg.nl Sun May 23 17:33:43 2021 Return-path: Envelope-to: gctc-ntg-context-518@m.gmane-mx.org Original-Received: from zapf.boekplan.nl ([5.39.185.232] helo=zapf.ntg.nl) by ciao.gmane.io with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1lkq6p-0004W5-C7 for gctc-ntg-context-518@m.gmane-mx.org; Sun, 23 May 2021 17:33:43 +0200 Original-Received: from localhost (localhost [127.0.0.1]) by zapf.ntg.nl (Postfix) with ESMTP id 5D9AD283BE3; Sun, 23 May 2021 17:33:20 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at zapf.boekplan.nl Original-Received: from zapf.ntg.nl ([127.0.0.1]) by localhost (zapf.ntg.nl [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id G9o-slcdI8WI; Sun, 23 May 2021 17:33:18 +0200 (CEST) Original-Received: from zapf.ntg.nl (localhost [127.0.0.1]) by zapf.ntg.nl (Postfix) with ESMTP id D7F5F283BD5; Sun, 23 May 2021 17:33:17 +0200 (CEST) Original-Received: from localhost (localhost [127.0.0.1]) by zapf.ntg.nl (Postfix) with ESMTP id EA9A4283BD4 for ; Sun, 23 May 2021 17:33:15 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at zapf.boekplan.nl Original-Received: from zapf.ntg.nl ([127.0.0.1]) by localhost (zapf.ntg.nl [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id DjcBcYHD2aYF for ; Sun, 23 May 2021 17:33:14 +0200 (CEST) Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=209.85.128.43; helo=mail-wm1-f43.google.com; envelope-from=jairoadelrio6@gmail.com; receiver= Original-Received: from mail-wm1-f43.google.com (mail-wm1-f43.google.com [209.85.128.43]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by zapf.ntg.nl (Postfix) with ESMTPS id 4E08F283BD2 for ; Sun, 23 May 2021 17:33:13 +0200 (CEST) Original-Received: by mail-wm1-f43.google.com with SMTP id z85-20020a1c7e580000b029017a76f3afbaso7144455wmc.2 for ; Sun, 23 May 2021 08:33:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to; bh=kI0t4xiO+feidfutZxQ6AHpOy593Lgn5+XXfjCK/osY=; b=aDV+EqR2ei5j8U8mmjo0wTphxh9Ud47Eu2lNYb0xSDG7lninqOG8ZGWBggr5W/pttz Uu4rQNb9PA/UUqY6fEfbp/kUuWdR0Q5Ql/itkxdn/Uha5ZHWMac82iBQyjT/go49SZ5W j0gRoy+RTPsmutssXuc6sv/c0BEW0tiNEAV8sTTpJYmhc9Wt9pl45lrLFUiDx4N6Mlvo MLlLh/9nb+PwlkTJQfuGnrzSNn6OstP5Oy9jDJ/47Nx4dIK+Rb0pE4cIbdOmj9gZvlIi kEPCeq2GyY326/88bk4znM1GxWfmNjFm2oe5WXLemQ8BHWHecMyNG//FqGwpj5t6e+bE 1muA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to; bh=kI0t4xiO+feidfutZxQ6AHpOy593Lgn5+XXfjCK/osY=; b=Z8TbO43k3VIXq51C1wN906jL8mzwgVWpcWWOpz+xwiDIAkswe5pyojgY/wtQTTQnsk DY4cCM4krOsSsP0sxshIi59P0QbJ4dvZ/Ns7y13hXY2DAoaZ9ITeaLhqz59YMVeuI3WE yS3tPwaobNvKkICU0mrMRQZCdiFrcfKNhZ6kJDK1zGaJtOU7Jwywnn+km4CpvRLXD/Ul TFI6wjzK0/9Hw/7SGvdBzVlMiXdad9++iC3Ybbae+Uco+dOFo6Lf1IyRl881krpWmYEz aDTur+TRL/1EwWPUz73dZzARUP8dFlRf9AHmoCIMhTpBfNSKLu9qePiA9QbB2X/SDfyb ncDg== X-Gm-Message-State: AOAM533fzO8OX4VgKt0DHYSMp6lGO8TXR2aUqpg3llZtZ1DUkSkYJHHV me+TBW1RpM9LPXkT94X4pKLYO2o3w4PFcGUeRGs= X-Google-Smtp-Source: ABdhPJzqIQ1jzlCWF2AsjYO+WWaFkv3QqLeFPr/Hej3kf/4lWJ+WGhCzSYn8+al65pXT6UosOgUsrMyOW1kjaUx/5ts= X-Received: by 2002:a05:600c:224d:: with SMTP id a13mr14405363wmm.183.1621783993441; Sun, 23 May 2021 08:33:13 -0700 (PDT) In-Reply-To: <91b591a4-95f8-368f-d02a-bffefa99b505@xs4all.nl> X-BeenThere: ntg-context@ntg.nl X-Mailman-Version: 2.1.26 Precedence: list List-Id: mailing list for ConTeXt users List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: ntg-context-bounces@ntg.nl Original-Sender: "ntg-context" Xref: news.gmane.io gmane.comp.tex.context:111504 Archived-At: --===============0423411548312891277== Content-Type: multipart/alternative; boundary="000000000000d4e0eb05c3010289" --000000000000d4e0eb05c3010289 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Thank you a lot for the explanation! It makes more sense now and definitively is something very promising to play with. Wrt the module itself, is it possible to consider language-dependent labels? I noticed "\sin" is "sin" when it should be "sen" once the module is loaded. Jairo El dom, 23 de may. de 2021 a la(s) 09:35, Hans Hagen (j.hagen@xs4all.nl) escribi=C3=B3: > On 5/23/2021 3:45 PM, Jairo A. del Rio wrote: > > El dom, 23 de may. de 2021 a la(s) 04:51, Hans Hagen (j.hagen@xs4all.nl > > ) escribi=C3=B3: > > > > On 5/22/2021 11:34 PM, Jairo A. del Rio wrote: > > > Hi. Is \thewithproperty documented elsewhere? Is this a new > > primitive? > > > It looks interesting. > > In the case of the \sin trick particular case \let\computer\the wou= ld > > also work; i added the \thewithproperty feature just becaus= e > i > > expect that users can come up with variants (like \drawme\sin ...) > > which > > then would adapt behaviour (via \dowithproperty2). > > > > > > Having flags for computing and drawing would be awesome. I think it > > would nicely extend ConTeXt's drawing features... > > > > So, indeed it's a new primitive but (for now) only used with these > lua > > hacks. Actually it's no big deal to reimplement \thewithoutunit > as > > > > > > So, is this Lua-specific? > > it relates to teh way tex sees things ... thihnk of > > \dimen0=3D10pt > > where \dimen expects a number, optional equal and value > > while > > \the\dimen0 > > the '\the' expects all kind of things, with '\dimen' being one of then > in which case its value is serialized > > in order to implement 'new primitives' using lua (like some that need to > be implemented for compatibility reasons due to the backend differences) > we need to be able to distinguish between setting and getting a value > > so in that sense it's indeed lua specific: a specific class of lua > functions knows if it's triggered by serialization > > and that is what we 'kind of' abuse here and also why i did add this > additional 'pseudo prefix' so that we ca ndo more clever things if we > want to > > > \thewithoutunit{\dowithproperty1\the} > > > > and then > > > > \thewithcmunit{\dowithproperty2\the} > > > > to serialize the dimension in cm but normally i need to "wonder for= a > > while if it makes sense". > > > > Btw, adding primitives (related to the token related bits and piece= s > of > > the engine) only makes sense if the gain is in > > > > -- avoiding clumsy code: although that can hurt someones pride and > joy > > over a nice and complex macro doing the same ... don't worry, i thr= ew > > away plenty of code by now > > > > -- significant performance gain: which is seldom the case (there > really > > is not much to gain, at least not in context which is rather > optimized > > already) > > > > -- giving way less noise in tracing: which for me is a good reason > > (tracing changed a bit anyway) > > > > -- not adding much code to the engine or the need to refactor: > although > > for some luametatex extensions some internals had to change > > fundamentally > > > > a good example is the extended macro argument handling: less clumsy > tex > > code, a bit of performance gain and easier full expansion, way less > > tracing, but it violates the last argument because it did lead to > some > > refactoring (i also had to make sure the extra overhead didn't slow > > down > > macro definitions and expansion) > > > I did the following and I have two questions: > > > > 1. What if I want to have more than one property? Say \plusone for > > computation and \plustwo for drawing. > > you can do that but keep in mind that \compute is then an 'official' > context one (bound to 1) and any other number can conflict with other > context numbers in the future, so best start at 1000 or so for private > ones > > > 2. What does 'usage=3D"value"' mean in the implement function (looks ne= w, > > but I'm prolly wrong)? > > indeed, it is already there for a while and it lets the function > definition follow a different route ... basically one that can follow > \the; I suppose that I can also make 'property' a valid usage (alias) > > (btw often features like this are described in articles or wrapups inm > documents in the distribution or even mentioned here but as usual with > tex these things only make sense trigger usage when one really needs it) > > > \permanent\protected\def\drawme{\thewithproperty\plussix} %better than > 666 > > or 31415 to fit in the tex numbering > > > \startluacode > > local interfaces =3D interfaces > > local implement =3D interfaces.implement > > local context =3D context > > local drawme_code =3D 6 > > local drawing =3D [=3D=3D[ > > draw fullcircle scaled 10mm; > > draw fullcircle shifted up scaled 5mm; > > draw fulltriangle shifted (up+1/2right) scaled 5mm; > > ]=3D=3D] > > > > > > local function chicken(value) > > if value =3D=3D "value" or value =3D=3D drawme_code then > > no need to check for "value" unless you also want: > > \the\chicken > > > context.metafun.start() > > context.metafun(drawing); > > context.metafun.stop() > > --elseif then ... > > else > > context("Chicken!") > > end > > end > > > > implement{ > > name =3D "chicken", > > public =3D true, > > usage =3D "value", --What does it do? > > overload =3D true, > > actions =3D chicken > > } > > > > \stopluacode > > > > \starttext\chicken\ and \drawme\chicken\stoptext > indeed an example of usage, and as with the mathfun, it saves a ton of > macros like \drawchicken and so > > so now you next challenge is to pass arguments so here a next phase > > \permanent\protected\def\drawme{\thewithproperty1006 } > > \startluacode > > local interfaces =3D interfaces > local implement =3D interfaces.implement > local context =3D context > > local d =3D { > chickcolor =3D "red", > beakcolor =3D "green", > } > > local drawing =3D utilities.templates.replacer [=3D=3D[ > draw fullcircle scaled 10mm withcolor %chickcolor%; > draw fullcircle shifted up scaled 5mm; > draw fulltriangle shifted (up+1/2right) scaled 5mm withcolor > %beakcolor%; > ]=3D=3D] > > > local function chicken(value) > if value =3D=3D 1006 then > local t =3D tokens.scanners.hash() or { } > table.setmetatableindex(t,d) > context.metafun.start() > context.metafun(drawing(t,v)) > context.metafun.stop() > else > context("Chicken!") > end > end > > implement{ > name =3D "chicken", > public =3D true, > usage =3D "value", --What does it do? > overload =3D true, > actions =3D chicken > } > > \stopluacode > > \starttext > \chicken\ and \drawme\chicken > \chicken\ and \drawme\chicken[chickcolor=3Dblue,beakcolor=3Dcyan] > \stoptext > > (just to remind readers of the real old and probably seldom used > template mechanism) > > Hans > > ----------------------------------------------------------------- > Hans Hagen | PRAGMA ADE > Ridderstraat 27 | 8061 GH Hasselt | The Netherlands > tel: 038 477 53 69 | www.pragma-ade.nl | www.pragma-pod.nl > ----------------------------------------------------------------- > --000000000000d4e0eb05c3010289 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Thank you a lot for the explanation! It makes more se= nse now and definitively is something very promising to play with. Wrt the = module itself, is it possible to consider language-dependent labels? I noti= ced "\sin" is "sin" when it should be "sen" o= nce the module is loaded.

Jairo

El dom, 23 de may. de 2021 = a la(s) 09:35, Hans Hagen (j.hagen@xs4= all.nl) escribi=C3=B3:
On 5/23/2021 3:45 PM, Jairo A. del Rio wrote:
> El dom, 23 de may. de 2021 a la(s) 04:51, Hans Hagen (j.hagen@xs4all.nl
> <mailto:j.ha= gen@xs4all.nl>) escribi=C3=B3:
>
>=C2=A0 =C2=A0 =C2=A0On 5/22/2021 11:34 PM, Jairo A. del Rio wrote:
>=C2=A0 =C2=A0 =C2=A0 > Hi. Is \thewithproperty documented elsewhere?= Is this a new
>=C2=A0 =C2=A0 =C2=A0primitive?
>=C2=A0 =C2=A0 =C2=A0 > It looks interesting.
>=C2=A0 =C2=A0 =C2=A0In the case of the \sin trick particular case \let\= computer\the would
>=C2=A0 =C2=A0 =C2=A0also work; i added the \thewithproperty<number&g= t; feature just because i
>=C2=A0 =C2=A0 =C2=A0expect that users can come up with variants (like \= drawme\sin ...)
>=C2=A0 =C2=A0 =C2=A0which
>=C2=A0 =C2=A0 =C2=A0then would adapt behaviour (via \dowithproperty2).<= br> >
>
> Having flags for computing and drawing would be awesome. I think it > would nicely extend ConTeXt's drawing features...
>
>=C2=A0 =C2=A0 =C2=A0So, indeed it's a new primitive but (for now) o= nly used with these lua
>=C2=A0 =C2=A0 =C2=A0hacks. Actually it's no big deal to reimplement= \thewithoutunit<dim> as
>
>
> So, is this Lua-specific?

it relates to teh way tex sees things ... thihnk of

=C2=A0 =C2=A0\dimen0=3D10pt

where \dimen expects a number, optional equal and value

while

=C2=A0 =C2=A0\the\dimen0

the '\the' expects all kind of things, with '\dimen' being = one of then
in which case its value is serialized

in order to implement 'new primitives' using lua (like some that ne= ed to
be implemented for compatibility reasons due to the backend differences) we need to be able to distinguish between setting and getting a value

so in that sense it's indeed lua specific: a specific class of lua
functions knows if it's triggered by serialization

and that is what we 'kind of' abuse here and also why i did add thi= s
additional 'pseudo prefix' so that we ca ndo more clever things if = we
want to

>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\thewithoutunit{\dowithproperty1\the}=
>
>=C2=A0 =C2=A0 =C2=A0and then
>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\thewithcmunit{\dowithproperty2\the}<= br> >
>=C2=A0 =C2=A0 =C2=A0to serialize the dimension in cm but normally i nee= d to "wonder for a
>=C2=A0 =C2=A0 =C2=A0while if it makes sense".
>
>=C2=A0 =C2=A0 =C2=A0Btw, adding primitives (related to the token relate= d bits and pieces of
>=C2=A0 =C2=A0 =C2=A0the engine) only makes sense if the gain is in
>
>=C2=A0 =C2=A0 =C2=A0-- avoiding clumsy code: although that can hurt som= eones pride and joy
>=C2=A0 =C2=A0 =C2=A0over a nice and complex macro doing the same ... do= n't worry, i threw
>=C2=A0 =C2=A0 =C2=A0away plenty of code by now
>
>=C2=A0 =C2=A0 =C2=A0-- significant performance gain: which is seldom th= e case (there really
>=C2=A0 =C2=A0 =C2=A0is not much to gain, at least not in context which = is rather optimized
>=C2=A0 =C2=A0 =C2=A0already)
>
>=C2=A0 =C2=A0 =C2=A0-- giving way less noise in tracing: which for me i= s a good reason
>=C2=A0 =C2=A0 =C2=A0(tracing changed a bit anyway)
>
>=C2=A0 =C2=A0 =C2=A0-- not adding much code to the engine or the need t= o refactor: although
>=C2=A0 =C2=A0 =C2=A0for some luametatex extensions some internals had t= o change
>=C2=A0 =C2=A0 =C2=A0fundamentally
>
>=C2=A0 =C2=A0 =C2=A0a good example is the extended macro argument handl= ing: less clumsy tex
>=C2=A0 =C2=A0 =C2=A0code, a bit of performance gain and easier full exp= ansion, way less
>=C2=A0 =C2=A0 =C2=A0tracing, but it violates the last argument because = it did lead to some
>=C2=A0 =C2=A0 =C2=A0refactoring (i also had to make sure the extra over= head didn't slow
>=C2=A0 =C2=A0 =C2=A0down
>=C2=A0 =C2=A0 =C2=A0macro definitions and expansion)

> I did the following and I have two questions:
>
> 1. What if I want to have more than one property? Say \plusone for > computation and \plustwo for drawing.

you can do that but keep in mind that \compute is then an 'official'= ;
context one (bound to 1) and any other number can conflict with other
context numbers in the future, so best start at 1000 or so for private
ones

> 2. What does 'usage=3D"value"' mean in the implement= function (looks new,
> but I'm prolly wrong)?

indeed, it is already there for a while and it lets the function
definition follow a different route ... basically one that can follow
\the; I suppose that I can also make 'property' a valid usage (alia= s)

(btw often features like this are described in articles or wrapups inm
documents in the distribution or even mentioned here but as usual with
tex these things only make sense trigger usage when one really needs it)
> \permanent\protected\def\drawme{\thewithproperty\plussix} %better than= 666

or 31415 to fit in the tex numbering

> \startluacode
> local interfaces =3D interfaces
> local implement =3D interfaces.implement
> local context =3D context
> local drawme_code =3D 6
> local drawing =3D [=3D=3D[
> draw fullcircle scaled 10mm;
> draw fullcircle shifted up scaled 5mm;
> draw fulltriangle shifted (up+1/2right) scaled 5mm;
> ]=3D=3D]
>
>
> local function chicken(value)
> if value =3D=3D "value" or value =3D=3D drawme_code then

no need to check for "value" unless you also want:

\the\chicken

> context.metafun.start()
> context.metafun(drawing);
> context.metafun.stop()
> --elseif then ...
> else
> context("Chicken!")
> end
> end
>
> implement{
> name =3D "chicken",
> public =3D true,
> usage =3D "value", --What does it do?
> overload =3D true,
> actions =3D chicken
> }
>
> \stopluacode
>
> \starttext\chicken\ and \drawme\chicken\stoptext
indeed an example of usage, and as with the mathfun, it saves a ton of
macros like \drawchicken and so

so now you next challenge is to pass arguments so here a next phase

\permanent\protected\def\drawme{\thewithproperty1006 }

\startluacode

local interfaces =3D interfaces
local implement =3D interfaces.implement
local context =3D context

local d =3D {
=C2=A0 =C2=A0 =C2=A0chickcolor =3D "red",
=C2=A0 =C2=A0 =C2=A0beakcolor=C2=A0 =3D "green",
}

local drawing =3D utilities.templates.replacer [=3D=3D[
=C2=A0 =C2=A0 =C2=A0draw fullcircle scaled 10mm withcolor %chickcolor%;
=C2=A0 =C2=A0 =C2=A0draw fullcircle shifted up scaled 5mm;
=C2=A0 =C2=A0 =C2=A0draw fulltriangle shifted (up+1/2right) scaled 5mm with= color
%beakcolor%;
]=3D=3D]


local function chicken(value)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 if value =3D=3D 1006 then
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0local t =3D tokens.scanners.hash() or { }=
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0table.setmetatableindex(t,d)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0context.metafun.start()
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0context.metafun(drawing(t,v= ))
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 context.metafun.sto= p()
=C2=A0 =C2=A0 =C2=A0 =C2=A0 else
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 context("Chick= en!")
=C2=A0 =C2=A0 =C2=A0 =C2=A0 end
end

implement{
=C2=A0 =C2=A0 =C2=A0 =C2=A0 name=C2=A0 =C2=A0 =C2=A0=3D "chicken"= ,
=C2=A0 =C2=A0 =C2=A0 =C2=A0 public=C2=A0 =C2=A0=3D true,
=C2=A0 =C2=A0 =C2=A0 =C2=A0 usage=C2=A0 =C2=A0 =3D "value", --Wha= t does it do?
=C2=A0 =C2=A0 =C2=A0 =C2=A0 overload =3D true,
=C2=A0 =C2=A0 =C2=A0 =C2=A0 actions=C2=A0 =3D chicken
}

\stopluacode

\starttext
=C2=A0 =C2=A0 =C2=A0\chicken\ and \drawme\chicken
=C2=A0 =C2=A0 =C2=A0\chicken\ and \drawme\chicken[chickcolor=3Dblue,beakcol= or=3Dcyan]
\stoptext

(just to remind readers of the real old and probably seldom used
template mechanism)

Hans

-----------------------------------------------------------------
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0Hans Hagen | PRAGMA ADE
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0Ridderstraat 27 | 80= 61 GH Hasselt | The Netherlands
=C2=A0 =C2=A0 =C2=A0 =C2=A0 tel: 038 477 53 69 | www.pragma-ade.nl | www.= pragma-pod.nl
-----------------------------------------------------------------
--000000000000d4e0eb05c3010289-- --===============0423411548312891277== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Disposition: inline X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX18KSWYgeW91ciBxdWVzdGlvbiBpcyBvZiBpbnRlcmVz dCB0byBvdGhlcnMgYXMgd2VsbCwgcGxlYXNlIGFkZCBhbiBlbnRyeSB0byB0aGUgV2lraSEKCm1h aWxsaXN0IDogbnRnLWNvbnRleHRAbnRnLm5sIC8gaHR0cDovL3d3dy5udGcubmwvbWFpbG1hbi9s aXN0aW5mby9udGctY29udGV4dAp3ZWJwYWdlICA6IGh0dHA6Ly93d3cucHJhZ21hLWFkZS5ubCAv IGh0dHA6Ly9jb250ZXh0LmFhbmhldC5uZXQKYXJjaGl2ZSAgOiBodHRwczovL2JpdGJ1Y2tldC5v cmcvcGhnL2NvbnRleHQtbWlycm9yL2NvbW1pdHMvCndpa2kgICAgIDogaHR0cDovL2NvbnRleHRn YXJkZW4ubmV0Cl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCg== --===============0423411548312891277==--