Rocksolid Light

Welcome to RetroBBS

mail  files  register  newsreader  groups  login

Message-ID:  

U X e dUdX, e dX, cosine, secant, tangent, sine, 3.14159...


devel / comp.lang.javascript / Verbose Regular Expressions

SubjectAuthor
* Verbose Regular ExpressionsJon Ribbens
+* Re: Verbose Regular ExpressionsMichael Haufe (TNO)
|`* Re: Verbose Regular ExpressionsJon Ribbens
| `* Re: Verbose Regular ExpressionsMichael Haufe (TNO)
|  `* Re: Verbose Regular ExpressionsJon Ribbens
|   +- Re: Verbose Regular ExpressionsMichael Haufe (TNO)
|   `* Re: Verbose Regular ExpressionsThomas 'PointedEars' Lahn
|    `* Re: Verbose Regular ExpressionsJon Ribbens
|     `- Re: Verbose Regular ExpressionsThomas 'PointedEars' Lahn
+- Re: Verbose Regular ExpressionsMina Arvuti lähedal
+- Re: Verbose Regular ExpressionsThomas 'PointedEars' Lahn
`* Re: Verbose Regular ExpressionsScott Sauyet
 `* Re: Verbose Regular ExpressionsJon Ribbens
  `* Re: Verbose Regular ExpressionsScott Sauyet
   `* Re: Verbose Regular ExpressionsJon Ribbens
    `- Re: Verbose Regular ExpressionsScott Sauyet

1
Verbose Regular Expressions

<slrnsao33e.1q1s.jon+usenet@raven.unequivocal.eu>

  copy mid

https://www.rocksolidbbs.com/devel/article-flat.php?id=16988&group=comp.lang.javascript#16988

  copy link   Newsgroups: comp.lang.javascript
Path: i2pn2.org!i2pn.org!eternal-september.org!reader02.eternal-september.org!.POSTED!not-for-mail
From: jon+usenet@unequivocal.eu (Jon Ribbens)
Newsgroups: comp.lang.javascript
Subject: Verbose Regular Expressions
Date: Mon, 24 May 2021 20:28:30 -0000 (UTC)
Organization: A noiseless patient Spider
Lines: 29
Message-ID: <slrnsao33e.1q1s.jon+usenet@raven.unequivocal.eu>
Injection-Date: Mon, 24 May 2021 20:28:30 -0000 (UTC)
Injection-Info: reader02.eternal-september.org; posting-host="1a9d69ffd163ef46eecf7ba861c0f4c8";
logging-data="21264"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1/fMdvRcyEv918wM9qJFt+xlDw2aS8lJhg="
User-Agent: slrn/1.0.3 (Linux)
Cancel-Lock: sha1:VT0PSPsnQl2b4rgIfMscOFi19x8=
 by: Jon Ribbens - Mon, 24 May 2021 20:28 UTC

I've just published an npm package:
https://www.npmjs.com/package/verbose-regexp

It provides a way to use verbose regular expressions in JavaScript and
TypeScript, similar to re.VERBOSE in Python. It provides that white-space
at the start and end of lines are ignored, as are newlines, and anything
following // to the end of the line.

It allows you to easily write multi-line regular expressions, and to make
your regular expressions more self-documenting using formatting and comments.

Example:

import { rx } from 'verbose-regexp'
// or: const { rx } = require('verbose-regexp')

const dateTime = rx`
(\d{4}-\d{2}-\d{2}) // date
T // time separator
(\d{2}:\d{2}:\d{2}) // time
`
console.log(dateTime.exec(new Date().toISOString()))

You can use regular expression flags by accessing them as a property of rx,
e.g.:

const alpha = rx.i`[a-z]+`

Any comments or thoughts would be appreciated.

Re: Verbose Regular Expressions

<132e52c2-a9f7-49ad-a728-80061d617b49n@googlegroups.com>

  copy mid

https://www.rocksolidbbs.com/devel/article-flat.php?id=16990&group=comp.lang.javascript#16990

  copy link   Newsgroups: comp.lang.javascript
X-Received: by 2002:ac8:7285:: with SMTP id v5mr30454188qto.247.1621909404696;
Mon, 24 May 2021 19:23:24 -0700 (PDT)
X-Received: by 2002:a9d:6d93:: with SMTP id x19mr20266123otp.117.1621909404425;
Mon, 24 May 2021 19:23:24 -0700 (PDT)
Path: i2pn2.org!i2pn.org!weretis.net!feeder8.news.weretis.net!proxad.net!feeder1-2.proxad.net!209.85.160.216.MISMATCH!news-out.google.com!nntp.google.com!postnews.google.com!google-groups.googlegroups.com!not-for-mail
Newsgroups: comp.lang.javascript
Date: Mon, 24 May 2021 19:23:24 -0700 (PDT)
In-Reply-To: <slrnsao33e.1q1s.jon+usenet@raven.unequivocal.eu>
Injection-Info: google-groups.googlegroups.com; posting-host=2600:1700:63e1:1820:7841:cc65:6aa0:465c;
posting-account=hYRygAoAAABkmvJVmPilz9Q1TOjgPQAq
NNTP-Posting-Host: 2600:1700:63e1:1820:7841:cc65:6aa0:465c
References: <slrnsao33e.1q1s.jon+usenet@raven.unequivocal.eu>
User-Agent: G2/1.0
MIME-Version: 1.0
Message-ID: <132e52c2-a9f7-49ad-a728-80061d617b49n@googlegroups.com>
Subject: Re: Verbose Regular Expressions
From: tno@thenewobjective.com (Michael Haufe (TNO))
Injection-Date: Tue, 25 May 2021 02:23:24 +0000
Content-Type: text/plain; charset="UTF-8"
 by: Michael Haufe (TNO) - Tue, 25 May 2021 02:23 UTC

On Monday, May 24, 2021 at 3:28:38 PM UTC-5, Jon Ribbens wrote:
> I've just published an npm package:
> https://www.npmjs.com/package/verbose-regexp
>
> It provides a way to use verbose regular expressions in JavaScript and
> TypeScript, similar to re.VERBOSE in Python. It provides that white-space
> at the start and end of lines are ignored, as are newlines, and anything
> following // to the end of the line.
>
> It allows you to easily write multi-line regular expressions, and to make
> your regular expressions more self-documenting using formatting and comments.
>
> Example:
>
> import { rx } from 'verbose-regexp'
> // or: const { rx } = require('verbose-regexp')
>
> const dateTime = rx`
> (\d{4}-\d{2}-\d{2}) // date
> T // time separator
> (\d{2}:\d{2}:\d{2}) // time
> `
> console.log(dateTime.exec(new Date().toISOString()))
>
> You can use regular expression flags by accessing them as a property of rx,
> e.g.:
>
> const alpha = rx.i`[a-z]+`
>
> Any comments or thoughts would be appreciated.

It's a useful feature definitely. I'm surprised it hasn't been advanced as a proposal yet for ECMAScript.

There has been limited discussion:

<https://esdiscuss.org/topic/regexp-x-flag>

Your #1 competitor is XRegExp which has the 'x' flag:

<https://xregexp.com/>

Were you aware of this library? What is your differentiating contribution?

Re: Verbose Regular Expressions

<slrnsaoq63.1q1s.jon+usenet@raven.unequivocal.eu>

  copy mid

https://www.rocksolidbbs.com/devel/article-flat.php?id=16992&group=comp.lang.javascript#16992

  copy link   Newsgroups: comp.lang.javascript
Path: i2pn2.org!i2pn.org!eternal-september.org!reader02.eternal-september.org!.POSTED!not-for-mail
From: jon+usenet@unequivocal.eu (Jon Ribbens)
Newsgroups: comp.lang.javascript
Subject: Re: Verbose Regular Expressions
Date: Tue, 25 May 2021 03:02:27 -0000 (UTC)
Organization: A noiseless patient Spider
Lines: 36
Message-ID: <slrnsaoq63.1q1s.jon+usenet@raven.unequivocal.eu>
References: <slrnsao33e.1q1s.jon+usenet@raven.unequivocal.eu>
<132e52c2-a9f7-49ad-a728-80061d617b49n@googlegroups.com>
Injection-Date: Tue, 25 May 2021 03:02:27 -0000 (UTC)
Injection-Info: reader02.eternal-september.org; posting-host="959b52148f0d4754cdd363c80d3ff059";
logging-data="14173"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX18kApfHtLizi3sZciqKn2E/NeZsJiwphG8="
User-Agent: slrn/1.0.3 (Linux)
Cancel-Lock: sha1:Du8yKEeoNcn2z07iGc9DMpe3ifo=
 by: Jon Ribbens - Tue, 25 May 2021 03:02 UTC

On 2021-05-25, Michael Haufe (TNO) <tno@thenewobjective.com> wrote:
> On Monday, May 24, 2021 at 3:28:38 PM UTC-5, Jon Ribbens wrote:
>> const alpha = rx.i`[a-z]+`
>>
>> Any comments or thoughts would be appreciated.
>
> It's a useful feature definitely. I'm surprised it hasn't been
> advanced as a proposal yet for ECMAScript.
>
> There has been limited discussion:
>
><https://esdiscuss.org/topic/regexp-x-flag>
>
> Your #1 competitor is XRegExp which has the 'x' flag:
>
><https://xregexp.com/>
>
> Were you aware of this library? What is your differentiating contribution?

I was not. So now I am, my answer would be:

* XRegExp is over a hundred times larger
* the syntax for mine is more compact and readable
* XRegExp requires double-escaping, making it even harder to read
* my package is discoverable using the sort of keywords I would
search for, which XRegExp is not ;-)

(XRegExp has the disadvantage that it is trying to retro-fit features
which are otherwise unavailable pre-ES6, which my library is not.)

Honestly, even if I was aware of XRegExp before I wrote my package,
I would probably have written it anyway - XRegExp is just too enormous
and heavyweight for the simple requirements I had. My library is 9 lines
of code (not including blank lines and TypeScript cruft), XRegExp
is thousands of lines of code, without even counting its dependencies.
And the double-escaping thing is unacceptable.

Re: Verbose Regular Expressions

<b393a8c1-e12d-4872-9afd-f118a278c485n@googlegroups.com>

  copy mid

https://www.rocksolidbbs.com/devel/article-flat.php?id=17009&group=comp.lang.javascript#17009

  copy link   Newsgroups: comp.lang.javascript
X-Received: by 2002:a37:9b51:: with SMTP id d78mr35987829qke.441.1621969103097;
Tue, 25 May 2021 11:58:23 -0700 (PDT)
X-Received: by 2002:aca:bc02:: with SMTP id m2mr14964289oif.154.1621969102862;
Tue, 25 May 2021 11:58:22 -0700 (PDT)
Path: i2pn2.org!i2pn.org!paganini.bofh.team!usenet.pasdenom.info!usenet-fr.net!proxad.net!feeder1-2.proxad.net!209.85.160.216.MISMATCH!news-out.google.com!nntp.google.com!postnews.google.com!google-groups.googlegroups.com!not-for-mail
Newsgroups: comp.lang.javascript
Date: Tue, 25 May 2021 11:58:22 -0700 (PDT)
In-Reply-To: <slrnsaoq63.1q1s.jon+usenet@raven.unequivocal.eu>
Injection-Info: google-groups.googlegroups.com; posting-host=2600:1700:63e1:1820:945f:2bb3:e595:3a29;
posting-account=hYRygAoAAABkmvJVmPilz9Q1TOjgPQAq
NNTP-Posting-Host: 2600:1700:63e1:1820:945f:2bb3:e595:3a29
References: <slrnsao33e.1q1s.jon+usenet@raven.unequivocal.eu>
<132e52c2-a9f7-49ad-a728-80061d617b49n@googlegroups.com> <slrnsaoq63.1q1s.jon+usenet@raven.unequivocal.eu>
User-Agent: G2/1.0
MIME-Version: 1.0
Message-ID: <b393a8c1-e12d-4872-9afd-f118a278c485n@googlegroups.com>
Subject: Re: Verbose Regular Expressions
From: tno@thenewobjective.com (Michael Haufe (TNO))
Injection-Date: Tue, 25 May 2021 18:58:23 +0000
Content-Type: text/plain; charset="UTF-8"
 by: Michael Haufe (TNO) - Tue, 25 May 2021 18:58 UTC

On Monday, May 24, 2021 at 10:02:36 PM UTC-5, Jon Ribbens wrote:
> I was not. So now I am, my answer would be:
>
> * XRegExp is over a hundred times larger
> * the syntax for mine is more compact and readable
> * XRegExp requires double-escaping, making it even harder to read
> * my package is discoverable using the sort of keywords I would
> search for, which XRegExp is not ;-)
>
> (XRegExp has the disadvantage that it is trying to retro-fit features
> which are otherwise unavailable pre-ES6, which my library is not.)
>
> Honestly, even if I was aware of XRegExp before I wrote my package,
> I would probably have written it anyway - XRegExp is just too enormous
> and heavyweight for the simple requirements I had. My library is 9 lines
> of code (not including blank lines and TypeScript cruft), XRegExp
> is thousands of lines of code, without even counting its dependencies.
> And the double-escaping thing is unacceptable.

There is much to be said for keeping it a simple extension, I can't complain.
How do you approach matching whitespace with this format? I assume the character code has to be used.

Is whitespace between the final character on the line and '//' ignored (the comment)?

Since you are supporting comments, it seems like you could support named matches without too much additional effort.
Is that something you considered as a future feature?

Re: Verbose Regular Expressions

<slrnsaqkde.1q1s.jon+usenet@raven.unequivocal.eu>

  copy mid

https://www.rocksolidbbs.com/devel/article-flat.php?id=17012&group=comp.lang.javascript#17012

  copy link   Newsgroups: comp.lang.javascript
Path: i2pn2.org!i2pn.org!eternal-september.org!reader02.eternal-september.org!.POSTED!not-for-mail
From: jon+usenet@unequivocal.eu (Jon Ribbens)
Newsgroups: comp.lang.javascript
Subject: Re: Verbose Regular Expressions
Date: Tue, 25 May 2021 19:36:14 -0000 (UTC)
Organization: A noiseless patient Spider
Lines: 30
Message-ID: <slrnsaqkde.1q1s.jon+usenet@raven.unequivocal.eu>
References: <slrnsao33e.1q1s.jon+usenet@raven.unequivocal.eu>
<132e52c2-a9f7-49ad-a728-80061d617b49n@googlegroups.com>
<slrnsaoq63.1q1s.jon+usenet@raven.unequivocal.eu>
<b393a8c1-e12d-4872-9afd-f118a278c485n@googlegroups.com>
Injection-Date: Tue, 25 May 2021 19:36:14 -0000 (UTC)
Injection-Info: reader02.eternal-september.org; posting-host="959b52148f0d4754cdd363c80d3ff059";
logging-data="19353"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX19wvdsjoaP/mKVMh+cQcvZRh3xqO0LWVJI="
User-Agent: slrn/1.0.3 (Linux)
Cancel-Lock: sha1:lT0ahN1NuKUN7kZc5TyPvprLjh0=
 by: Jon Ribbens - Tue, 25 May 2021 19:36 UTC

On 2021-05-25, Michael Haufe (TNO) <tno@thenewobjective.com> wrote:
> On Monday, May 24, 2021 at 10:02:36 PM UTC-5, Jon Ribbens wrote:
>> Honestly, even if I was aware of XRegExp before I wrote my package,
>> I would probably have written it anyway - XRegExp is just too enormous
>> and heavyweight for the simple requirements I had. My library is 9 lines
>> of code (not including blank lines and TypeScript cruft), XRegExp
>> is thousands of lines of code, without even counting its dependencies.
>> And the double-escaping thing is unacceptable.
>
> There is much to be said for keeping it a simple extension, I can't
> complain. How do you approach matching whitespace with this format? I
> assume the character code has to be used.

If it's at the start of a line you can use a backslash: "\ "
If it's at the start or end of a line you can use a character class: "[ ]"
You could of course use more convoluted options like "\x20" as well.

> Is whitespace between the final character on the line and '//' ignored
> (the comment)?

Yes. First anything from "//" to the end of the line is stripped, and
then any string of whitespace that contains a newline is stripped.
Whitespace within the line is treated as part of the regexp exactly
as normal.

> Since you are supporting comments, it seems like you could support
> named matches without too much additional effort.

I'm not sure what you mean - named capture groups are already a standard
part of JavaScript, so I don't need to add them.

Re: Verbose Regular Expressions

<930a6bc2-118f-45b9-ace5-311af14cf350n@googlegroups.com>

  copy mid

https://www.rocksolidbbs.com/devel/article-flat.php?id=17013&group=comp.lang.javascript#17013

  copy link   Newsgroups: comp.lang.javascript
X-Received: by 2002:a05:620a:b1b:: with SMTP id t27mr36884159qkg.42.1621971623911;
Tue, 25 May 2021 12:40:23 -0700 (PDT)
X-Received: by 2002:a9d:630e:: with SMTP id q14mr24137594otk.69.1621971623599;
Tue, 25 May 2021 12:40:23 -0700 (PDT)
Path: i2pn2.org!i2pn.org!paganini.bofh.team!usenet.pasdenom.info!usenet-fr.net!proxad.net!feeder1-2.proxad.net!209.85.160.216.MISMATCH!news-out.google.com!nntp.google.com!postnews.google.com!google-groups.googlegroups.com!not-for-mail
Newsgroups: comp.lang.javascript
Date: Tue, 25 May 2021 12:40:23 -0700 (PDT)
In-Reply-To: <slrnsaqkde.1q1s.jon+usenet@raven.unequivocal.eu>
Injection-Info: google-groups.googlegroups.com; posting-host=2600:1700:63e1:1820:945f:2bb3:e595:3a29;
posting-account=hYRygAoAAABkmvJVmPilz9Q1TOjgPQAq
NNTP-Posting-Host: 2600:1700:63e1:1820:945f:2bb3:e595:3a29
References: <slrnsao33e.1q1s.jon+usenet@raven.unequivocal.eu>
<132e52c2-a9f7-49ad-a728-80061d617b49n@googlegroups.com> <slrnsaoq63.1q1s.jon+usenet@raven.unequivocal.eu>
<b393a8c1-e12d-4872-9afd-f118a278c485n@googlegroups.com> <slrnsaqkde.1q1s.jon+usenet@raven.unequivocal.eu>
User-Agent: G2/1.0
MIME-Version: 1.0
Message-ID: <930a6bc2-118f-45b9-ace5-311af14cf350n@googlegroups.com>
Subject: Re: Verbose Regular Expressions
From: tno@thenewobjective.com (Michael Haufe (TNO))
Injection-Date: Tue, 25 May 2021 19:40:23 +0000
Content-Type: text/plain; charset="UTF-8"
 by: Michael Haufe (TNO) - Tue, 25 May 2021 19:40 UTC

On Tuesday, May 25, 2021 at 2:36:21 PM UTC-5, Jon Ribbens wrote:

> I'm not sure what you mean - named capture groups are already a standard
> part of JavaScript, so I don't need to add them.

You're right. I overlooked that these were added in ES2018 and support seems solid:

<https://caniuse.com/?search=named%20capture>

Re: Verbose Regular Expressions

<1b1317cf-2d44-40f4-8120-5c8a4e7190adn@googlegroups.com>

  copy mid

https://www.rocksolidbbs.com/devel/article-flat.php?id=17044&group=comp.lang.javascript#17044

  copy link   Newsgroups: comp.lang.javascript
X-Received: by 2002:ac8:4756:: with SMTP id k22mr9987295qtp.193.1622360616922;
Sun, 30 May 2021 00:43:36 -0700 (PDT)
X-Received: by 2002:a9d:6e09:: with SMTP id e9mr12848552otr.126.1622360616621;
Sun, 30 May 2021 00:43:36 -0700 (PDT)
Path: i2pn2.org!i2pn.org!paganini.bofh.team!news.dns-netz.com!news.freedyn.net!newsfeed.xs4all.nl!newsfeed9.news.xs4all.nl!news.uzoreto.com!feeder1.cambriumusenet.nl!feed.tweak.nl!209.85.160.216.MISMATCH!news-out.google.com!nntp.google.com!postnews.google.com!google-groups.googlegroups.com!not-for-mail
Newsgroups: comp.lang.javascript
Date: Sun, 30 May 2021 00:43:36 -0700 (PDT)
In-Reply-To: <slrnsao33e.1q1s.jon+usenet@raven.unequivocal.eu>
Injection-Info: google-groups.googlegroups.com; posting-host=82.131.38.110; posting-account=wXTMUQoAAADJv6bh2a9IGlcpEEjr1O4x
NNTP-Posting-Host: 82.131.38.110
References: <slrnsao33e.1q1s.jon+usenet@raven.unequivocal.eu>
User-Agent: G2/1.0
MIME-Version: 1.0
Message-ID: <1b1317cf-2d44-40f4-8120-5c8a4e7190adn@googlegroups.com>
Subject: Re: Verbose Regular Expressions
From: rob999999999@yahoo.com (Mina Arvuti lähedal)
Injection-Date: Sun, 30 May 2021 07:43:36 +0000
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: base64
 by: Mina Arvuti lähedal - Sun, 30 May 2021 07:43 UTC

{½@[{½]{$§´^§]$$$$$^}`}§½^$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]${½@[{½]{$§´^§]$$$$$^}`}§½^$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$$$$^}`}§½^$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½½@[{½]$½@[{½]{½@[{½]{½@[{½]{$§´^§]$$$$$^}`}§½^$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}^}\}`}§´^§]{½@[{½]{$§]{$§´^§]$$$$$^}`}§½^$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½½@[{½]$½@[{½]{½@[{½]{½@[{½]{$§´^§]$$$$$^}`}§½^$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½{½@[{½]{$§´^§]$$$$$^}`}§½^$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$$$$^}`}§½^$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§{½@[{½]{$§´^§]$$$$$^}`}§½^$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$$$$^}`}§½^$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½½@[{½]$½@[{½]{½@[{½]{½@[{½]{$§´^§]$$$$$^}`}§½^$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}^}\}`}§´^§]{½@[{½]{$§]{$§´^§]$$$$$^}`}§½^$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½½@[{½]$½@[{½]{½@[{½]{½@[{½]{$§´^§]$$$$$^}`}§½^$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}^}\}`}§´^§]{½@[{½]{$§]{$§´^§]$$$$$^}`}§½^$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½½@[{½]$½@[{½]{]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½½@[{½]$½@[{½]{½@[{½]{½@[{½]{$§´^§]$$$$$^}`}§½^$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}^}\}`}§´^§]{½@[{½]{$§]{$§´^§]$$$$$^}`}§½^$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½½@[{½]$½@[{½]{½@[{½]{½@[{½]{$§´^§]$$$$$^}`}§½^$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}^}\}`}§´^§]{½@[{½]{$§]{$§´^§]$$$$$^}`}§½^$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½½@[{½]$½@[{½]{@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}^}\}`}§´^§]{½@[{½]{$§]{$§´^§]$$$$$^}`}§½^$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½½@[{½]$½@[{½]{½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½]{$§´^§]$$$$$^}`}§½^$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$$$$^}`}§½^$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½½@[{½]$½@[{½]{½@[{½]{½@[{½]{$§´^§]$$$$$^}`}§½^$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}^}\}`}§´^§]{½@[{½]{$§]{$§´^§]$$$$$^}`}§½^$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½½@[{½]$½@[{½]{½@[{½]{½@[{½]{$§´^§]$$$$$^}`}§½^$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}^}\}`}§´^§]{½@[{½]{$§]{$§´^§]$$$$$^}`}§½^$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½½@[{½]$½@[{½]{{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$$$$^}`}§½^$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{{½@[{½]{$§´^§]$$$$$^}`}§½^$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}{½@[{½]{$§´^§]$$$$$^}`}§½^$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$$$$^}`}§½^$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½½@[{½]$½@[{½]{½@[{½]{½@[{½]{$§´^§]$$$$$^}`}§½^$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}^}\}`}§´^§]{½@[{½]{$§]{$§´^§]$$$$$^}`}§½^$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½½@[{½]$½@[{½]{½@[{½]{½@[{½]{$§´^§]$$$$$^}`}§½^$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}^}\}`}§´^§]{½@[{½]{$§]{$§´^§]$$$$$^}`}§½^$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½½@[{½]$½@[{½]{`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$$$$^}`}§½^$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½½@[{½]$½@[{½]{½@[{½]{½@[{½]{$§´^§]$$$$$^}`}§½^$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}^}\}`}§´^§]{½@[{½]{$§]{$§´^§]$$$$$^}`}§½^$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½½@[{½]$½@[{½]{½@[{½]{½@[{½]{$§´^§]$$$$$^}`}§½^$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}^}\}`}§´^§]{½@[{½]{$§]{$§´^§]$$$$$^}`}§½^$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½½@[{½]$½@[{½]{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½½@[{½]$½@[{½]{½@[{½]{½@[{½]{$§´^§]$$$$$^}`}§½^$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}^}\}`}§´^§]{½@[{½]{$§]{$§´^§]$$$$$^}`}§½^$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½½@[{½]$½@[{½]{½@[{½]{½@[{½]{$§´^§]$$$$$^}`}§½^$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½$$$^}`}^}\}`}§´^§]{½@[{½]{$§]{$§´^§]$$$$$^}`}§½^$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½$$$^}`}§½^¨´¨´½^}\}`}§´^§]{½@[{½]{$§´^§]$$½@[{½]$½@[{½]{½@[{½½@[{½]$½@[{½]{

Click here to read the complete article

Re: Verbose Regular Expressions

<1803103.tdWV9SEqCh@PointedEars.de>

  copy mid

https://www.rocksolidbbs.com/devel/article-flat.php?id=17068&group=comp.lang.javascript#17068

  copy link   Newsgroups: comp.lang.javascript
Path: i2pn2.org!i2pn.org!aioe.org!news.mb-net.net!open-news-network.org!.POSTED.178.197.192.72!not-for-mail
From: PointedEars@web.de (Thomas 'PointedEars' Lahn)
Newsgroups: comp.lang.javascript
Subject: Re: Verbose Regular Expressions
Date: Tue, 08 Jun 2021 19:31:28 +0200
Organization: PointedEars Software (PES)
Lines: 29
Message-ID: <1803103.tdWV9SEqCh@PointedEars.de>
References: <slrnsao33e.1q1s.jon+usenet@raven.unequivocal.eu>
Reply-To: Thomas 'PointedEars' Lahn <cljs@PointedEars.de>
Mime-Version: 1.0
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: 8Bit
Injection-Info: gwaiyur.mb-net.net; posting-host="178.197.192.72";
logging-data="11942"; mail-complaints-to="abuse@open-news-network.org"
User-Agent: KNode/4.14.10
Cancel-Lock: sha1:dIP9+kDfMyJuDAE2YRWFR0p1/gc=
Face: iVBORw0KGgoAAAANSUhEUgAAADAAAAAwBAMAAAClLOS0AAAAGFBMVEXTxa4RFk5dUWANED8PFEfy7+MGBiW+n3ZNF/QuAAACaElEQVQ4jVXUwVOcMBQG8Dc7Rc4PUntdWV2uxjDpGaGeozOp1woar4jd5t/v9wLstMwsA/ntlxdCAgUc1hjTc9/JCZfGoo3wG3HdmdAWrIJRHe7GM/TmpY5VFefuVcAkkPbLIaN8rmPmjloyZxgyR3GuJ4K0AGtJ2htz8o7yqikm759fldQXaMpbDzjKAG+8v+AugVTOPO5DOjLvGtUYQwh0CPjnVMyGd+8/GfUB5nLKJDD2aLDh5HYyMDJGDwQIo2ZmZcKbowNmAdB/AzyFhrmF2MHRb0QJJfaAnwGB6orZhoykLzJtGwF/xpYxI1dswomiUj3gTuAIqCn/4C7cULwGNBtwMTk3Y4LfKB5YUaOKBKYtpplm7u0vip8tU1NWWyI/7XdcSuIDoMt6rVHMWT0DbjHPGqDqZVSa6zleLcUTcIKLoMv3ueJluALtAo9B302zPPlrtiVScRdCjXvVh3e3JpYa/jjkuC9N+LrBMlz/eAN4eQijX2EdLo6c5tGGHwLyHFtXk89dDGHwCVhG9T0S/j55AhRZgkMCmUQXJ49TnS1wnQDvw0eAh9ICeMmEFbCnPMFzjAvsWoEWEFdYEx+S0MoUZ1gT1wId8+AF3Bl2OoEu906AUHx5VLw/gXYg/x84loOah/2UYNrgiwSwGO7RfUzVBbx/kgpckumGOi6QirtD6gkLTitbnxNol47S2jVc2vsN5kPqaAHT8uUdAJM4v/DanjYOwmUjWznGfwB7sGtAtor5BgofDuzaRj4kSQAqDakTsKORa3Q3xKi3gE1fhl71KRMqrdZ2AWNNg/YOhQyrVBnb+i+nEg4bsDA+egAAAABJRU5ErkJggg==
X-Face: %i>XG-yXR'\"2P/C_aO%~;2o~?g0pPKmbOw^=NT`tprDEf++D.m7"}HW6.#=U:?2GGctkL,f89@H46O$ASoW&?s}.k+&.<b';Md8`dH6iqhT)6C^.Px|[=M@7=Ik[_w<%n1Up"LPQNu2m8|L!/3iby{-]A+#YE}Kl{Cw$\U!kD%K}\2jz"QQP6Uqr],./"?;=4v
X-User-ID: U2FsdGVkX18S/LLa5WflYiEwun6ESaT9RJNhGFQSMhAi7aPglR1iKA==
 by: Thomas 'Pointed - Tue, 8 Jun 2021 17:31 UTC

Jon Ribbens wrote:

> I've just published an npm package:
> https://www.npmjs.com/package/verbose-regexp
>
> It provides a way to use verbose regular expressions in JavaScript and
> TypeScript, similar to re.VERBOSE in Python. It provides that white-space
> at the start and end of lines are ignored, as are newlines, and anything
> following // to the end of the line.
>
> It allows you to easily write multi-line regular expressions, and to make
> your regular expressions more self-documenting using formatting and
> comments.
> […]
> Any comments or thoughts would be appreciated.

I have had support for some PCRE features, including this one, in
JSX:regexp.js:jsx.regexp.RegExp for some time [1], but to support
it by an actual syntax extension via Node.js is a nice idea. (I did
not even know that that was possible.)
[1] <https://github.com/PointedEars/JSX/blob/master/regexp.js>

(Needs fixing now that the new properties of RegExp instances are
read-only. TODO for the summer break.)
--
PointedEars
FAQ: <http://PointedEars.de/faq> | <http://PointedEars.de/es-matrix>
<https://github.com/PointedEars> | <http://PointedEars.de/wsvn/>
Twitter: @PointedEars2 | Please do not cc me./Bitte keine Kopien per E-Mail.

Re: Verbose Regular Expressions

<2083837.irdbgypaU6@PointedEars.de>

  copy mid

https://www.rocksolidbbs.com/devel/article-flat.php?id=17069&group=comp.lang.javascript#17069

  copy link   Newsgroups: comp.lang.javascript
Path: i2pn2.org!i2pn.org!aioe.org!news.mb-net.net!open-news-network.org!.POSTED.178.197.192.72!not-for-mail
From: PointedEars@web.de (Thomas 'PointedEars' Lahn)
Newsgroups: comp.lang.javascript
Subject: Re: Verbose Regular Expressions
Date: Tue, 08 Jun 2021 19:35:09 +0200
Organization: PointedEars Software (PES)
Lines: 18
Message-ID: <2083837.irdbgypaU6@PointedEars.de>
References: <slrnsao33e.1q1s.jon+usenet@raven.unequivocal.eu> <132e52c2-a9f7-49ad-a728-80061d617b49n@googlegroups.com> <slrnsaoq63.1q1s.jon+usenet@raven.unequivocal.eu> <b393a8c1-e12d-4872-9afd-f118a278c485n@googlegroups.com> <slrnsaqkde.1q1s.jon+usenet@raven.unequivocal.eu>
Reply-To: Thomas 'PointedEars' Lahn <cljs@PointedEars.de>
Mime-Version: 1.0
Content-Type: text/plain; charset="ISO-8859-1"
Content-Transfer-Encoding: 7Bit
Injection-Info: gwaiyur.mb-net.net; posting-host="178.197.192.72";
logging-data="11942"; mail-complaints-to="abuse@open-news-network.org"
User-Agent: KNode/4.14.10
Cancel-Lock: sha1:o6KHHZdUxYwahrUUPhhZjqY9guA=
X-User-ID: U2FsdGVkX1/8IO02m92qBAF6YdZHWvz+7I403kTIvQWs0YS58JRdow==
X-Face: %i>XG-yXR'\"2P/C_aO%~;2o~?g0pPKmbOw^=NT`tprDEf++D.m7"}HW6.#=U:?2GGctkL,f89@H46O$ASoW&?s}.k+&.<b';Md8`dH6iqhT)6C^.Px|[=M@7=Ik[_w<%n1Up"LPQNu2m8|L!/3iby{-]A+#YE}Kl{Cw$\U!kD%K}\2jz"QQP6Uqr],./"?;=4v
Face: iVBORw0KGgoAAAANSUhEUgAAADAAAAAwBAMAAAClLOS0AAAAGFBMVEXTxa4RFk5dUWANED8PFEfy7+MGBiW+n3ZNF/QuAAACaElEQVQ4jVXUwVOcMBQG8Dc7Rc4PUntdWV2uxjDpGaGeozOp1woar4jd5t/v9wLstMwsA/ntlxdCAgUc1hjTc9/JCZfGoo3wG3HdmdAWrIJRHe7GM/TmpY5VFefuVcAkkPbLIaN8rmPmjloyZxgyR3GuJ4K0AGtJ2htz8o7yqikm759fldQXaMpbDzjKAG+8v+AugVTOPO5DOjLvGtUYQwh0CPjnVMyGd+8/GfUB5nLKJDD2aLDh5HYyMDJGDwQIo2ZmZcKbowNmAdB/AzyFhrmF2MHRb0QJJfaAnwGB6orZhoykLzJtGwF/xpYxI1dswomiUj3gTuAIqCn/4C7cULwGNBtwMTk3Y4LfKB5YUaOKBKYtpplm7u0vip8tU1NWWyI/7XdcSuIDoMt6rVHMWT0DbjHPGqDqZVSa6zleLcUTcIKLoMv3ueJluALtAo9B302zPPlrtiVScRdCjXvVh3e3JpYa/jjkuC9N+LrBMlz/eAN4eQijX2EdLo6c5tGGHwLyHFtXk89dDGHwCVhG9T0S/j55AhRZgkMCmUQXJ49TnS1wnQDvw0eAh9ICeMmEFbCnPMFzjAvsWoEWEFdYEx+S0MoUZ1gT1wId8+AF3Bl2OoEu906AUHx5VLw/gXYg/x84loOah/2UYNrgiwSwGO7RfUzVBbx/kgpckumGOi6QirtD6gkLTitbnxNol47S2jVc2vsN5kPqaAHT8uUdAJM4v/DanjYOwmUjWznGfwB7sGtAtor5BgofDuzaRj4kSQAqDakTsKORa3Q3xKi3gE1fhl71KRMqrdZ2AWNNg/YOhQyrVBnb+i+nEg4bsDA+egAAAABJRU5ErkJggg==
 by: Thomas 'Pointed - Tue, 8 Jun 2021 17:35 UTC

Jon Ribbens wrote:

> On 2021-05-25, Michael Haufe (TNO) <tno@thenewobjective.com> wrote:
>> Since you are supporting comments, it seems like you could support
>> named matches without too much additional effort.
>
> I'm not sure what you mean - named capture groups are already a standard
> part of JavaScript, so I don't need to add them.

But only because you implicitly limit your runtime environment and target
implementation; i.e. regardless of that it is standardized, what matters
here is that you are targeting *only Google V8* JavaScript thanks to Node.js
as the *only* runtime environment :)

--
PointedEars
FAQ: <http://PointedEars.de/faq> | <http://PointedEars.de/es-matrix>
<https://github.com/PointedEars> | <http://PointedEars.de/wsvn/>
Twitter: @PointedEars2 | Please do not cc me./Bitte keine Kopien per E-Mail.

Re: Verbose Regular Expressions

<slrnsbvbah.56l.jon+usenet@raven.unequivocal.eu>

  copy mid

https://www.rocksolidbbs.com/devel/article-flat.php?id=17071&group=comp.lang.javascript#17071

  copy link   Newsgroups: comp.lang.javascript
Path: i2pn2.org!i2pn.org!eternal-september.org!reader02.eternal-september.org!.POSTED!not-for-mail
From: jon+usenet@unequivocal.eu (Jon Ribbens)
Newsgroups: comp.lang.javascript
Subject: Re: Verbose Regular Expressions
Date: Tue, 8 Jun 2021 17:48:01 -0000 (UTC)
Organization: A noiseless patient Spider
Lines: 20
Message-ID: <slrnsbvbah.56l.jon+usenet@raven.unequivocal.eu>
References: <slrnsao33e.1q1s.jon+usenet@raven.unequivocal.eu>
<132e52c2-a9f7-49ad-a728-80061d617b49n@googlegroups.com>
<slrnsaoq63.1q1s.jon+usenet@raven.unequivocal.eu>
<b393a8c1-e12d-4872-9afd-f118a278c485n@googlegroups.com>
<slrnsaqkde.1q1s.jon+usenet@raven.unequivocal.eu>
<2083837.irdbgypaU6@PointedEars.de>
Injection-Date: Tue, 8 Jun 2021 17:48:01 -0000 (UTC)
Injection-Info: reader02.eternal-september.org; posting-host="6d23fd51535e7d7c08978a9da282b3e7";
logging-data="28650"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1+Zhejl+Xe+19lkH3Xv6majOt94n4oZP1U="
User-Agent: slrn/1.0.3 (Linux)
Cancel-Lock: sha1:GY2efBSLZE80Gk2nPIAmNaMQrXo=
 by: Jon Ribbens - Tue, 8 Jun 2021 17:48 UTC

On 2021-06-08, Thomas 'PointedEars' Lahn <PointedEars@web.de> wrote:
> Jon Ribbens wrote:
>> On 2021-05-25, Michael Haufe (TNO) <tno@thenewobjective.com> wrote:
>>> Since you are supporting comments, it seems like you could support
>>> named matches without too much additional effort.
>>
>> I'm not sure what you mean - named capture groups are already a standard
>> part of JavaScript, so I don't need to add them.
>
> But only because you implicitly limit your runtime environment and target
> implementation; i.e. regardless of that it is standardized, what matters
> here is that you are targeting *only Google V8* JavaScript thanks to
> Node.js as the *only* runtime environment :)

Yes. I only need support for Node.js 16+ and Chrome 91+, so that's fine
by me. And adding named capture groups to JavaScript implementations
that don't already have them would transform the project from a neat
9-line template-string trick into a complete re-implementation of
the JavaScript regular expression engine, which would be a whole
different project...

Re: Verbose Regular Expressions

<9918766.nUPlyArG6x@PointedEars.de>

  copy mid

https://www.rocksolidbbs.com/devel/article-flat.php?id=17072&group=comp.lang.javascript#17072

  copy link   Newsgroups: comp.lang.javascript
Path: i2pn2.org!i2pn.org!weretis.net!feeder8.news.weretis.net!news.mb-net.net!open-news-network.org!.POSTED.178.197.192.72!not-for-mail
From: PointedEars@web.de (Thomas 'PointedEars' Lahn)
Newsgroups: comp.lang.javascript
Subject: Re: Verbose Regular Expressions
Supersedes: <7939283.T7Z3S40VBb@PointedEars.de>
Date: Tue, 08 Jun 2021 20:04:51 +0200
Organization: PointedEars Software (PES)
Lines: 15
Message-ID: <9918766.nUPlyArG6x@PointedEars.de>
References: <slrnsao33e.1q1s.jon+usenet@raven.unequivocal.eu> <132e52c2-a9f7-49ad-a728-80061d617b49n@googlegroups.com> <slrnsaoq63.1q1s.jon+usenet@raven.unequivocal.eu> <b393a8c1-e12d-4872-9afd-f118a278c485n@googlegroups.com> <slrnsaqkde.1q1s.jon+usenet@raven.unequivocal.eu> <2083837.irdbgypaU6@PointedEars.de> <slrnsbvbah.56l.jon+usenet@raven.unequivocal.eu>
Reply-To: Thomas 'PointedEars' Lahn <cljs@PointedEars.de>
Mime-Version: 1.0
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: 8Bit
Injection-Info: gwaiyur.mb-net.net; posting-host="178.197.192.72";
logging-data="14658"; mail-complaints-to="abuse@open-news-network.org"
User-Agent: KNode/4.14.10
Cancel-Key: sha1:V3jkCgfBSwzy5YUhDIi6SlnA34c=
Cancel-Lock: sha1:ii70Jj4Jk2wOIS4LrEh6U0Eo6/M=
Face: iVBORw0KGgoAAAANSUhEUgAAADAAAAAwBAMAAAClLOS0AAAAGFBMVEXTxa4RFk5dUWANED8PFEfy7+MGBiW+n3ZNF/QuAAACaElEQVQ4jVXUwVOcMBQG8Dc7Rc4PUntdWV2uxjDpGaGeozOp1woar4jd5t/v9wLstMwsA/ntlxdCAgUc1hjTc9/JCZfGoo3wG3HdmdAWrIJRHe7GM/TmpY5VFefuVcAkkPbLIaN8rmPmjloyZxgyR3GuJ4K0AGtJ2htz8o7yqikm759fldQXaMpbDzjKAG+8v+AugVTOPO5DOjLvGtUYQwh0CPjnVMyGd+8/GfUB5nLKJDD2aLDh5HYyMDJGDwQIo2ZmZcKbowNmAdB/AzyFhrmF2MHRb0QJJfaAnwGB6orZhoykLzJtGwF/xpYxI1dswomiUj3gTuAIqCn/4C7cULwGNBtwMTk3Y4LfKB5YUaOKBKYtpplm7u0vip8tU1NWWyI/7XdcSuIDoMt6rVHMWT0DbjHPGqDqZVSa6zleLcUTcIKLoMv3ueJluALtAo9B302zPPlrtiVScRdCjXvVh3e3JpYa/jjkuC9N+LrBMlz/eAN4eQijX2EdLo6c5tGGHwLyHFtXk89dDGHwCVhG9T0S/j55AhRZgkMCmUQXJ49TnS1wnQDvw0eAh9ICeMmEFbCnPMFzjAvsWoEWEFdYEx+S0MoUZ1gT1wId8+AF3Bl2OoEu906AUHx5VLw/gXYg/x84loOah/2UYNrgiwSwGO7RfUzVBbx/kgpckumGOi6QirtD6gkLTitbnxNol47S2jVc2vsN5kPqaAHT8uUdAJM4v/DanjYOwmUjWznGfwB7sGtAtor5BgofDuzaRj4kSQAqDakTsKORa3Q3xKi3gE1fhl71KRMqrdZ2AWNNg/YOhQyrVBnb+i+nEg4bsDA+egAAAABJRU5ErkJggg==
X-User-ID: U2FsdGVkX1+/h5ISKyTd0Ku8fvQ71L99RD38t6/hL++OKqPEof4XXA==
X-Face: %i>XG-yXR'\"2P/C_aO%~;2o~?g0pPKmbOw^=NT`tprDEf++D.m7"}HW6.#=U:?2GGctkL,f89@H46O$ASoW&?s}.k+&.<b';Md8`dH6iqhT)6C^.Px|[=M@7=Ik[_w<%n1Up"LPQNu2m8|L!/3iby{-]A+#YE}Kl{Cw$\U!kD%K}\2jz"QQP6Uqr],./"?;=4v
 by: Thomas 'Pointed - Tue, 8 Jun 2021 18:04 UTC

Jon Ribbens wrote:

> […] adding named capture groups to JavaScript implementations
> that don't already have them would transform the project from a neat
> 9-line template-string trick into a complete re-implementation of
> the JavaScript regular expression engine, which would be a whole
> different project...

You might want to reconsider after you have read JSX:regexp.js. It was not
trivial to do it, but it certainly did not require what you suggest here :)

--
PointedEars
FAQ: <http://PointedEars.de/faq> | <http://PointedEars.de/es-matrix>
<https://github.com/PointedEars> | <http://PointedEars.de/wsvn/>
Twitter: @PointedEars2 | Please do not cc me./Bitte keine Kopien per E-Mail.

Re: Verbose Regular Expressions

<defa1dfd-5330-448a-8ac3-19a9ad118736n@googlegroups.com>

  copy mid

https://www.rocksolidbbs.com/devel/article-flat.php?id=17110&group=comp.lang.javascript#17110

  copy link   Newsgroups: comp.lang.javascript
X-Received: by 2002:a05:620a:404:: with SMTP id 4mr8834904qkp.387.1624020419835;
Fri, 18 Jun 2021 05:46:59 -0700 (PDT)
X-Received: by 2002:a54:4e81:: with SMTP id c1mr7311258oiy.119.1624020419587;
Fri, 18 Jun 2021 05:46:59 -0700 (PDT)
Path: i2pn2.org!i2pn.org!weretis.net!feeder8.news.weretis.net!proxad.net!feeder1-2.proxad.net!209.85.160.216.MISMATCH!news-out.google.com!nntp.google.com!postnews.google.com!google-groups.googlegroups.com!not-for-mail
Newsgroups: comp.lang.javascript
Date: Fri, 18 Jun 2021 05:46:59 -0700 (PDT)
In-Reply-To: <slrnsao33e.1q1s.jon+usenet@raven.unequivocal.eu>
Injection-Info: google-groups.googlegroups.com; posting-host=170.202.22.102; posting-account=jEz2WAoAAABPN6KvjkIr_ZIYJY4YFml9
NNTP-Posting-Host: 170.202.22.102
References: <slrnsao33e.1q1s.jon+usenet@raven.unequivocal.eu>
User-Agent: G2/1.0
MIME-Version: 1.0
Message-ID: <defa1dfd-5330-448a-8ac3-19a9ad118736n@googlegroups.com>
Subject: Re: Verbose Regular Expressions
From: scott@sauyet.com (Scott Sauyet)
Injection-Date: Fri, 18 Jun 2021 12:46:59 +0000
Content-Type: text/plain; charset="UTF-8"
 by: Scott Sauyet - Fri, 18 Jun 2021 12:46 UTC

Jon Ribbens wrote:

> I've just published an npm package:
> https://www.npmjs.com/package/verbose-regexp
>
> [ ... ]
>
> It allows you to easily write multi-line regular expressions, and to make
> your regular expressions more self-documenting using formatting and comments.

Very nice! I can think of many times I've wanted something like this.

> [ ... ]
> You can use regular expression flags by accessing them as a property of rx,
> e.g.:
>
> const alpha = rx.i`[a-z]+`

This makes me doubt the use of template tag functions here, especially
as the implementation then builds 128 separate functions to handle this.

I don't see a great advantage to

```
const dateTime = rx.gi`
(\d{4}-\d{2}-\d{2}) // date
T // time separator
(\d{2}:\d{2}:\d{2}) // time
`
```

over

```
const dateTime = rx (`
(\d{4}-\d{2}-\d{2}) // date
T // time separator
(\d{2}:\d{2}:\d{2}) // time
`, 'gi')
```

especially when I have to remember to include the flags in alphabetic
order and when it won't automatically update if and when the underlying
regex engine includes new flags. Is there a compelling advantage to
this?

Still, this is great. I had thought of doing this before but somehow
expected it to be much more difficult. Kudos!

-- Scott

Re: Verbose Regular Expressions

<slrnscpec6.56l.jon+usenet@raven.unequivocal.eu>

  copy mid

https://www.rocksolidbbs.com/devel/article-flat.php?id=17112&group=comp.lang.javascript#17112

  copy link   Newsgroups: comp.lang.javascript
Path: i2pn2.org!i2pn.org!eternal-september.org!reader02.eternal-september.org!.POSTED!not-for-mail
From: jon+usenet@unequivocal.eu (Jon Ribbens)
Newsgroups: comp.lang.javascript
Subject: Re: Verbose Regular Expressions
Date: Fri, 18 Jun 2021 15:19:34 -0000 (UTC)
Organization: A noiseless patient Spider
Lines: 41
Message-ID: <slrnscpec6.56l.jon+usenet@raven.unequivocal.eu>
References: <slrnsao33e.1q1s.jon+usenet@raven.unequivocal.eu>
<defa1dfd-5330-448a-8ac3-19a9ad118736n@googlegroups.com>
Injection-Date: Fri, 18 Jun 2021 15:19:34 -0000 (UTC)
Injection-Info: reader02.eternal-september.org; posting-host="6d2df2b825eecac2fd0953bc6d330fe2";
logging-data="21305"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX18MLJAwn8kPpoh9fHehmC/xHJWrzJJZl2I="
User-Agent: slrn/1.0.3 (Linux)
Cancel-Lock: sha1:XfeT5DROYp0wymYRnQOyDs4B/jg=
 by: Jon Ribbens - Fri, 18 Jun 2021 15:19 UTC

On 2021-06-18, Scott Sauyet <scott@sauyet.com> wrote:
> I don't see a great advantage to
>
> ```
> const dateTime = rx.gi`
> (\d{4}-\d{2}-\d{2}) // date
> T // time separator
> (\d{2}:\d{2}:\d{2}) // time
> `
> ```
>
> over
>
> ```
> const dateTime = rx (`
> (\d{4}-\d{2}-\d{2}) // date
> T // time separator
> (\d{2}:\d{2}:\d{2}) // time
> `, 'gi')
> ```
>
> especially when I have to remember to include the flags in alphabetic
> order and when it won't automatically update if and when the underlying
> regex engine includes new flags. Is there a compelling advantage to
> this?

The latter wouldn't work as the function would receive the string after
escape processing, i.e. given rx(`\d{4}`, 'g') it would receive 'd{4}'.
You'd have to do rx(String.raw`\d{4}`, 'g') which is starting to become
very ugly and verbose.

In Python you could override the attribute accessor for "rx" and make
property fetches dynamic, so that the flag functions wouldn't need to
actually exist, and the flags could be in any order, but as far as I'm
aware JavaScript doesn't have a way of overriding general property
lookups unfortunately.

As an aside, personally I prefer the flags being up front anyway - it's
annoying reading a long regular expression, reaching the end, and
finding that you now need to go back and read it all again, because
there's a modifier flag appended that changes its meaning.

Re: Verbose Regular Expressions

<c4fba99d-2c90-42bc-9fe3-0f4c139e8fa7n@googlegroups.com>

  copy mid

https://www.rocksolidbbs.com/devel/article-flat.php?id=17116&group=comp.lang.javascript#17116

  copy link   Newsgroups: comp.lang.javascript
X-Received: by 2002:ad4:5bc7:: with SMTP id t7mr2575539qvt.41.1624159542697; Sat, 19 Jun 2021 20:25:42 -0700 (PDT)
X-Received: by 2002:a05:6808:128c:: with SMTP id a12mr12566587oiw.136.1624159542430; Sat, 19 Jun 2021 20:25:42 -0700 (PDT)
Path: i2pn2.org!i2pn.org!aioe.org!news.uzoreto.com!tr3.eu1.usenetexpress.com!feeder.usenetexpress.com!tr3.iad1.usenetexpress.com!border1.nntp.dca1.giganews.com!nntp.giganews.com!news-out.google.com!nntp.google.com!postnews.google.com!google-groups.googlegroups.com!not-for-mail
Newsgroups: comp.lang.javascript
Date: Sat, 19 Jun 2021 20:25:42 -0700 (PDT)
In-Reply-To: <slrnscpec6.56l.jon+usenet@raven.unequivocal.eu>
Injection-Info: google-groups.googlegroups.com; posting-host=32.216.234.72; posting-account=soEzFAoAAAA9UnLg4OfAIq1tieDGxldE
NNTP-Posting-Host: 32.216.234.72
References: <slrnsao33e.1q1s.jon+usenet@raven.unequivocal.eu> <defa1dfd-5330-448a-8ac3-19a9ad118736n@googlegroups.com> <slrnscpec6.56l.jon+usenet@raven.unequivocal.eu>
User-Agent: G2/1.0
MIME-Version: 1.0
Message-ID: <c4fba99d-2c90-42bc-9fe3-0f4c139e8fa7n@googlegroups.com>
Subject: Re: Verbose Regular Expressions
From: scott.sauyet@gmail.com (Scott Sauyet)
Injection-Date: Sun, 20 Jun 2021 03:25:42 +0000
Content-Type: text/plain; charset="UTF-8"
Lines: 28
 by: Scott Sauyet - Sun, 20 Jun 2021 03:25 UTC

Jon Ribbens wrote:
> Scott Sauyet wrote:

>> An ill-considered alternative.

> The function would receive the string after
> escape processing, i.e. given rx(`\d{4}`, 'g') it would receive 'd{4}'.
> You'd have to do rx(String.raw`\d{4}`, 'g') which is starting to become
> very ugly and verbose.

Ah yes. Obviously I had not considered the problem thoroughly. This
does feel like an elegant solution... except for those 127 functions!

> As an aside, personally I prefer the flags being up front anyway
> - it's annoying reading a long regular expression, reaching the
> end, and finding that you now need to go back and read it all again,
> because there's a modifier flag appended that changes its meaning.

Agreed, although I don't feel it to be a big deal. I usually scan for
the end of the regex before I even start to analyze it. But they would
definitely be better up front.

If I have some extra time in the next few days, I'll spend part of it
trying to create an alternative to the way flags are handled.

Cheers,

-- Scott

Re: Verbose Regular Expressions

<slrnscu960.56l.jon+usenet@raven.unequivocal.eu>

  copy mid

https://www.rocksolidbbs.com/devel/article-flat.php?id=17117&group=comp.lang.javascript#17117

  copy link   Newsgroups: comp.lang.javascript
Path: i2pn2.org!i2pn.org!eternal-september.org!reader02.eternal-september.org!.POSTED!not-for-mail
From: jon+usenet@unequivocal.eu (Jon Ribbens)
Newsgroups: comp.lang.javascript
Subject: Re: Verbose Regular Expressions
Date: Sun, 20 Jun 2021 11:21:36 -0000 (UTC)
Organization: A noiseless patient Spider
Lines: 53
Message-ID: <slrnscu960.56l.jon+usenet@raven.unequivocal.eu>
References: <slrnsao33e.1q1s.jon+usenet@raven.unequivocal.eu>
<defa1dfd-5330-448a-8ac3-19a9ad118736n@googlegroups.com>
<slrnscpec6.56l.jon+usenet@raven.unequivocal.eu>
<c4fba99d-2c90-42bc-9fe3-0f4c139e8fa7n@googlegroups.com>
Injection-Date: Sun, 20 Jun 2021 11:21:36 -0000 (UTC)
Injection-Info: reader02.eternal-september.org; posting-host="b0f6ef593fe244eb5f6043c5529c6362";
logging-data="9157"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1+xGSihtkDySNdXUqyXX3IHL5jCvIPBurM="
User-Agent: slrn/1.0.3 (Linux)
Cancel-Lock: sha1:XEQBJJaPhbrJKVP+xN7IZyI546o=
 by: Jon Ribbens - Sun, 20 Jun 2021 11:21 UTC

On 2021-06-20, Scott Sauyet <scott.sauyet@gmail.com> wrote:
> Jon Ribbens wrote:
>> Scott Sauyet wrote:
>>> An ill-considered alternative.
>
>> The function would receive the string after
>> escape processing, i.e. given rx(`\d{4}`, 'g') it would receive 'd{4}'.
>> You'd have to do rx(String.raw`\d{4}`, 'g') which is starting to become
>> very ugly and verbose.
>
> Ah yes. Obviously I had not considered the problem thoroughly. This
> does feel like an elegant solution... except for those 127 functions!

I mean I'm with you on that to an extent, but as overheads go,
given the general massive overhead of using JavaScript rather than,
say, C, it's unnoticeable in the end. The syntax itself is very neat,
it is extremely compact and very readable. rx.gi`foo` is the sort of
thing one might choose even if one was the language designer and
unconstrained by the existing parser. And alphabetical-order is the
sort of thing that I would probably do voluntarily even if not forced
to ;-)

Obviously if JavaScript does add further flags to RegExps then there
are downsides including (a) needing to release a new version of the
module and (b) O(2^n) in memory and load time. But it seems unlikely
this would be a weekly occurrence...

>> As an aside, personally I prefer the flags being up front anyway
>> - it's annoying reading a long regular expression, reaching the
>> end, and finding that you now need to go back and read it all again,
>> because there's a modifier flag appended that changes its meaning.
>
> Agreed, although I don't feel it to be a big deal. I usually scan for
> the end of the regex before I even start to analyze it. But they would
> definitely be better up front.
>
> If I have some extra time in the next few days, I'll spend part of it
> trying to create an alternative to the way flags are handled.

The only options I can think of off the top of my head are:

(a) properties (like it is now)
(b) a function (e.g. rx('gi')`foo`)
(c) including the flags in the string parameter

The constraints for (c) would need to be that the way the flags were
included could not be a valid regular expression now, or preferably
in the future either. Python offers a syntax which is, e.g. (?gi),
which seems suitable.

Whatever you suggest I'd want it to be backwards compatible with the
current release, which I think all of the above could be. In principle
it could support all of (a), (b), and (c) at once ;-)

Re: Verbose Regular Expressions

<b0e1f889-04fd-4652-826d-6109ba635f3an@googlegroups.com>

  copy mid

https://www.rocksolidbbs.com/devel/article-flat.php?id=17149&group=comp.lang.javascript#17149

  copy link   Newsgroups: comp.lang.javascript
X-Received: by 2002:a37:bc04:: with SMTP id m4mr22729379qkf.100.1624837064136;
Sun, 27 Jun 2021 16:37:44 -0700 (PDT)
X-Received: by 2002:a4a:bd10:: with SMTP id n16mr17014573oop.6.1624837063827;
Sun, 27 Jun 2021 16:37:43 -0700 (PDT)
Path: i2pn2.org!i2pn.org!weretis.net!feeder8.news.weretis.net!proxad.net!feeder1-2.proxad.net!209.85.160.216.MISMATCH!news-out.google.com!nntp.google.com!postnews.google.com!google-groups.googlegroups.com!not-for-mail
Newsgroups: comp.lang.javascript
Date: Sun, 27 Jun 2021 16:37:43 -0700 (PDT)
In-Reply-To: <slrnscu960.56l.jon+usenet@raven.unequivocal.eu>
Injection-Info: google-groups.googlegroups.com; posting-host=32.216.231.93; posting-account=soEzFAoAAAA9UnLg4OfAIq1tieDGxldE
NNTP-Posting-Host: 32.216.231.93
References: <slrnsao33e.1q1s.jon+usenet@raven.unequivocal.eu>
<defa1dfd-5330-448a-8ac3-19a9ad118736n@googlegroups.com> <slrnscpec6.56l.jon+usenet@raven.unequivocal.eu>
<c4fba99d-2c90-42bc-9fe3-0f4c139e8fa7n@googlegroups.com> <slrnscu960.56l.jon+usenet@raven.unequivocal.eu>
User-Agent: G2/1.0
MIME-Version: 1.0
Message-ID: <b0e1f889-04fd-4652-826d-6109ba635f3an@googlegroups.com>
Subject: Re: Verbose Regular Expressions
From: scott.sauyet@gmail.com (Scott Sauyet)
Injection-Date: Sun, 27 Jun 2021 23:37:44 +0000
Content-Type: text/plain; charset="UTF-8"
 by: Scott Sauyet - Sun, 27 Jun 2021 23:37 UTC

Jon Ribbens wrote:
> Scott Sauyet wrote:
>> Jon Ribbens wrote:

>> Ah yes. Obviously I had not considered the problem thoroughly. This
>> does feel like an elegant solution... except for those 127 functions!

> I mean I'm with you on that to an extent, but as overheads go,
> given the general massive overhead of using JavaScript rather than,
> say, C, it's unnoticeable in the end.

Probably, but untidiness always bothers me whether it's a real problem
or not.

[ ... ] And alphabetical-order is the
> sort of thing that I would probably do voluntarily even if not forced
> to ;-) >

I just find a large difference between what I would do for my own code
and what I would put out for public consumption. It's probably not a
big deal since an out-of-order alternative would fail immediately and
not lurk for months, but it still feels odd to me.

> Obviously if JavaScript does add further flags to RegExps then there
> are downsides including (a) needing to release a new version of the
> module and (b) O(2^n) in memory and load time. But it seems unlikely
> this would be a weekly occurrence...

No, but being future-proof is also pretty useful.

> [ ... ]

>> If I have some extra time in the next few days, I'll spend part of it
>> trying to create an alternative to the way flags are handled.

> The only options I can think of off the top of my head are:
>
> (a) properties (like it is now)
> (b) a function (e.g. rx('gi')`foo`)
> (c) including the flags in the string parameter

I probably would not consider (c). That seems too likely to fall apart
in the future. But (b) sounds like a perfectly reasonable option. I
haven't found any time for this, and am not likely to soon. But I would
see (b) as the best option around. Even the ability to name the
partially applied function seems useful.

> Whatever you suggest I'd want it to be backwards compatible with the
> current release, which I think all of the above could be. In principle
> it could support all of (a), (b), and (c) at once ;-)

I assume the emoticon meant you were disclaiming the idea. If you
actually are suggesting it, then I'd suggest that that way lies madness
and jQuery.

Regardless of all the above, I'm impressed. This is a very nice little
tool.

-- Scott


devel / comp.lang.javascript / Verbose Regular Expressions

1
server_pubkey.txt

rocksolid light 0.9.81
clearnet tor