From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Amirouche Boubekki Newsgroups: gmane.lisp.guile.user Subject: Re: sfx: baby steps of an html templating engine based on skribillo's skribe reader and sxml Date: Fri, 31 Jul 2015 14:03:42 +0200 Message-ID: <1f02e6431d117bd91aa1ccd2fab14139@hypermove.net> References: NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=_48d05b6f730da5c332e03ce7fc6f67fd" X-Trace: ger.gmane.org 1438344268 903 80.91.229.3 (31 Jul 2015 12:04:28 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Fri, 31 Jul 2015 12:04:28 +0000 (UTC) Cc: guile-user-bounces+amirouche=hypermove.net@gnu.org To: guile-user@gnu.org Original-X-From: guile-user-bounces+guile-user=m.gmane.org@gnu.org Fri Jul 31 14:04:15 2015 Return-path: Envelope-to: guile-user@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1ZL92q-0003cc-P0 for guile-user@m.gmane.org; Fri, 31 Jul 2015 14:04:13 +0200 Original-Received: from localhost ([::1]:44234 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZL92p-0007B0-VH for guile-user@m.gmane.org; Fri, 31 Jul 2015 08:04:11 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:36007) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZL92a-00073d-Gu for guile-user@gnu.org; Fri, 31 Jul 2015 08:03:58 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZL92X-0007j0-U3 for guile-user@gnu.org; Fri, 31 Jul 2015 08:03:56 -0400 Original-Received: from relay2-d.mail.gandi.net ([217.70.183.194]:45440) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZL92Q-0007gW-5M; Fri, 31 Jul 2015 08:03:46 -0400 Original-Received: from mfilter17-d.gandi.net (mfilter17-d.gandi.net [217.70.178.145]) by relay2-d.mail.gandi.net (Postfix) with ESMTP id 9433FC5A54; Fri, 31 Jul 2015 14:03:44 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at mfilter17-d.gandi.net Original-Received: from relay2-d.mail.gandi.net ([IPv6:::ffff:217.70.183.194]) by mfilter17-d.gandi.net (mfilter17-d.gandi.net [::ffff:10.0.15.180]) (amavisd-new, port 10024) with ESMTP id aTVmHycMf6Kz; Fri, 31 Jul 2015 14:03:42 +0200 (CEST) X-Originating-IP: 10.58.1.141 Original-Received: from webmail.gandi.net (unknown [10.58.1.141]) (Authenticated sender: amirouche@hypermove.net) by relay2-d.mail.gandi.net (Postfix) with ESMTPA id 76782C5A50; Fri, 31 Jul 2015 14:03:42 +0200 (CEST) In-Reply-To: X-Sender: amirouche@hypermove.net User-Agent: Roundcube Webmail/1.1.2 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 217.70.183.194 X-BeenThere: guile-user@gnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: General Guile related discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guile-user-bounces+guile-user=m.gmane.org@gnu.org Original-Sender: guile-user-bounces+guile-user=m.gmane.org@gnu.org Xref: news.gmane.org gmane.lisp.guile.user:11934 Archived-At: --=_48d05b6f730da5c332e03ce7fc6f67fd Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: quoted-printable I improved the usuability of the module. It should be able to just drop=20 `sfx.scm` in your project to use it. Here an exemple use in scheme code: ;;; ;;; This requires at least a `index.sfx` file and `person.scm` where ;;; a `` record is defined. ;;; ;; (use-modules (person)) ;; (define persons (list (make-person "amirouche" 30) ;; (make-person "julien" 30) ;; (make-person "mez" 27) ;; (make-person "moh" 113))) ;; (define bindings `((value ,(make-parameter 42)) ;; (title '(h1 "H=C3=A9llo (again (and again)) hacker!= ")) ;; (persons ,persons))) ;; (with-output-to-file "index.html" ;; (lambda () (render "index.sfx" bindings))) I attached the updated `sfx.scm` with required files to test it. There still one area where it can be improved regarding template=20 resolution/finding. Right now it simply look for templates according the=20 default `(open)` behavior which looks in cwd (current working directory). Best regards Le 2015-07-30 18:52, Amirouche Boubekki a =C3=A9crit=C2=A0: > Le 2015-07-30 13:55, Amirouche Boubekki a =C3=A9crit=C2=A0: >> H=C3=A9llo, >>=20 >>=20 >> I've been lurking around skribillo and artanis. I don't really like >> the rails-like syntax >> of artanis, even if it has its use-cases and I wanted to hack on >> something "small", so >> I've put together sfx. >>=20 >> The code of skribe reader is included in sfx.scm. So the only >> dependency is guile (2.0.11) and >> guile-reader that you can install using `guix package -i=20 >> guile-reader`. >>=20 >> This bare template language has the following features: >>=20 >> - wanna be simpler sxml syntax >> - templates with custom environment >> - external libraries loading inside the template >>=20 >>=20 >> # Wanna be simpler sxml syntax >>=20 >> Skribe reader (implemented with guile-reader) provide a handy syntax=20 >> to >> both define keywords and quasiquote. In an sxml context those features >> are used to implemented attributes and text nodes. >>=20 >> ## attributes >>=20 >> Attributes in sxml are defined as follow: >>=20 >> (div (@ (id "shell")) "This the main area") >>=20 >> Instead of requiring the nesting of `(attribute-name attribute-value)`= =20 >> sfx use >> the simpler keyword syntax `:keyword`. The above snippet becomes: >>=20 >> (div (@ :id "shell") "This the main area") >>=20 >> I'm not sure it's worth the trouble of diverting from sxml standard. >> That said, it looks >> more like plain xml. >>=20 >> ## text nodes >>=20 >> Text nodes can be defined as >>=20 >> (p [h=C3=A9llo hacker]) >>=20 >> This is looks the same as the default reader. It becomes handy when >> you include an >> inline element inside the text node: >>=20 >> (p [h=C3=A9llo ,(b [hacker]) >>=20 >> `,()` is a special syntax of skribe reader which provides `(unquote)` >> inside [bracket] `quasiquote`. >>=20 >> With the default guile reader, this must be written as: >>=20 >> (p "h=C3=A9llo " (b "hacker")) >>=20 >> This is looks verbose and prone to error. One must not forget the=20 >> space in the >> string before the `(b)` element. >>=20 >>=20 >> # templates with custom environment >>=20 >> Right now this part of the template language is not really >> userfriendly. But you can pass custom >> variables to the template but those must be parameters. In the example >> sfx.scm (which includes >> example use of the procedures) the environment in which the template >> is evaled is defined as follow: >>=20 >> (define value (make-parameter 42)) >> (define amirouche (make-person "amirouche" 30)) >> (define env (let ((value value) >> (amirouche amirouche)) >> (the-environment))) >>=20 >>=20 >> Then `value` can be echo'ed inside the template using the unquote >> syntax `,()`, e.g. >>=20 >> (p [Here is a lucky number for you =C2=AB,(value)=C2=BB]) >>=20 >> As you can see the previous snippet, there is also a `` record >> inside the environment. >> One can (maybe) provide in the environment the required procedures to >> echo the correct >> fields but this is verbose. Instead sfx use `(use-modules)` inside the >> template definition >> file. This is presented in the following and last part. >>=20 >> # external libraries loading inside the template >>=20 >> Currently it's (only) possible to do `(use-modules)` inside the >> template file. The template >> file looks like the following: >>=20 >> ``` >> (use-modules (person)) >>=20 >> `(html >> (body >> (p [My name is ,(person-name amirouche)]))) >> ``` >>=20 >> I could not make procedure definition work inside the template, this >> my be linked to the way >> I eval the template. It's shame because for quick and dirty hacks it >> can be handy like defining >> mini-templates inside the big template. >>=20 >>=20 >>=20 >>=20 >>=20 >> This is my second try at this and having a look at the code of haunt >> [1] was helpful. >>=20 >> Hope this helps! >>=20 >>=20 >> [1] https://git.dthompson.us/haunt.git >=20 > Sorry for the double posting. This mail is not a duplicate. >=20 > I though that the implementation `extend` would be more involving. >=20 > `extend` is the dual of `include`. Given a base template `base.sfx` > you define placeholders > say `,(main)` and `,(sidebar)` and the rest is the "shell" of the > application ie. the part of > GUI that is always the same over the application. >=20 > If `index.sfx` inherit `base.sfx` the context in which `base.sfx` is > rendered is the same as the context > used to render `=C3=ACndex.sfx` plus the variables defined/passed in > `=C3=ACndex.sfx` to `base.sfx`. >=20 > In the following example, `title` and `intro` are evaled and then > added to `(current-module)` environment > with which `base.sfx` is rendered. >=20 > (extend "base.sfx" > (current-module) > `((title `(h1 [H=C3=A9llo again hacker!!])) > (intro "This is a little presentation of sfx template=20 > language"))) >=20 > I don't how to make `(current-module)` disappear but it's also more > explicit. I'm not sure. >=20 > `extend` implement a pattern similar to inheritance in OOP. >=20 > I attach complete code with an example. There is small doc in the > header of the file. --=20 Amirouche ~ amz3 ~ http://www.hyperdev.fr --=_48d05b6f730da5c332e03ce7fc6f67fd Content-Transfer-Encoding: base64 Content-Type: text/plain; name=sfx.scm Content-Disposition: attachment; filename=sfx.scm; size=10199 Ozs7IENvcHlyaWdodCDCqSAyMDE1ICBBbWlyb3VjaGUgQm91YmVra2kgPGFtaXJvdWNoZUBoeXBl cm1vdmUubmV0Pgo7OzsgQ29weXJpZ2h0IMKpIDIwMDUsIDIwMDYgTHVkb3ZpYyBDb3VydMOocyA8 bHVkb3ZpYy5jb3VydGVzQGxhYXMuZnI+Cjs7Owo7OzsgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29m dHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgo7OzsgbW9kaWZ5IGl0IHVuZGVy IHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCjs7OyBh cyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNp b24gMyBvZgo7OzsgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZl cnNpb24uCjs7Owo7OzsgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRo YXQgaXQgd2lsbCBiZSB1c2VmdWwsCjs7OyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhv dXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgo7OzsgTUVSQ0hBTlRBQklMSVRZIG9yIEZJ VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKOzs7IExlc3NlciBH ZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCjs7Owo7OzsgWW91IHNob3Vs ZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwo7 OzsgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeS4gIElmIG5vdCwgc2VlCjs7OyA8aHR0 cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCgo7OyBzZnguc2NtCjs7Cjs7IHN4bWwgYW5kIHNr cmliZSBiYXNlZCBtaW5pIGh0bWwgdGVtcGxhdGUgZW5naW5lCjs7Cjs7IHRha2VzIGFzIGlucHV0 IGEgcXVhc2lxdW90ZWQgcHNldWRvIHN4bWwgZS5nLjoKOzsKOzsgYChodG1sCjs7ICAgKGhlYWQK OzsgICAgKG1ldGEgKEAgOmNoYXJzZXQgInV0Zi04IikpCjs7ICAgICh0aXRsZSBbVGhpcyBpcyBh IHBhZ2UgZ2VuZXJhdGVkIGZyb20gc2NoZW1lXSkKOzsgICAgKG1ldGEgKEAgOm5hbWUgImF1dGhv ciIgOmNvbnRlbnQgIkFtaXJvdWNoZSBCT1VCRUtLSSA8YW1pcm91Y2hlQGh5cGVybW92ZS5uZXQ+ IikpCjs7ICAgIChtZXRhIChAIDpuYW1lICJ2aWV3cG9ydCIgOmNvbnRlbnQgIndpZHRoPWRldmlj ZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xIikpCjs7ICAgIChsaW5rIChAIDpyZWwgInN0eWxlc2hl ZXQiIDpocmVmICJzdGF0aWMvY3NzL2Jvb3RzdHJhcC5taW4uY3NzIikpCjs7ICAgIChsaW5rIChA IDpyZWwgInN0eWxlc2hlZXQiIDpocmVmICJzdGF0aWMvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4u Y3NzIikpCjs7ICAgIChsaW5rIChAIDpyZWwgInN0eWxlc2hlZXQiIDpocmVmICJzdGF0aWMvY3Nz L21haW4uY3NzIikpKSAgCjs7ICAgKGJvZHkgKEAgOmNsYXNzICJpbmRleCIpCjs7ICAgICAgICAg KGRpdiAoQCA6Y2xhc3MgY29udGFpbmVyKQo7OyAgICAgICAgICAgICAgKGRpdiAoQCA6Y2xhc3Mg ImhlYWRlciBjbGVhcmZpeCIpCjs7ICAgICAgICAgICAgICAgICAgIChuYXYKOzsgICAgICAgICAg ICAgICAgICAgICh1bCAoQCA6Y2xhc3MgIm5hdiBuYXYtcGlsbHMgcHVsbC1yaWdodCIpICAgICAg ICAgICAgICAgICAgICAgCjs7ICAgICAgICAgICAgICAgICAgICAgICAgKGxpIChAIDpyb2xlICJw cmVzZW50YXRpb24iIDpjbGFzcyAiYWN0aXZlIikKOzsgICAgICAgICAgICAgICAgICAgICAgICAg ICAgKGEgKEAgOmhyZWYgIiMiKSBbSG9tZV0pKQo7OyAgICAgICAgICAgICAgICAgICAgICAgIChs aSAoQCA6cm9sZSAicHJlc2VudGF0aW9uIiApCjs7ICAgICAgICAgICAgICAgICAgICAgICAgICAg IChhIChAIDpocmVmICIjIikgW0Fib3V0XSkpCjs7ICAgICAgICAgICAgICAgICAgICAgICAgKGxp IChAIDpyb2xlICJwcmVzZW50YXRpb24iICkKOzsgICAgICAgICAgICAgICAgICAgICAgICAgICAg KGEgKEAgOmhyZWYgIiMiKSBbQ29udGFjdF0pKSkpCjs7ICAgICAgICAgICAgICAgICAgIChoMyAo QCA6Y2xhc3MgInRleHQtbXV0ZWQiKSBbaHlwZXJtb3ZlLm5ldF0pKSkpKQo7Owo7OyBJdCdzIHNp bWlsYXIgdG8gc3htbCBleGNlcHQgdGhlIHN5bnRheCB0byBkZWNsYXJlIGF0dHJpYnV0ZXMgaXMg bGVzcyB2ZXJib3NlCjs7ICphbmQqIHlvdSBjYW4gdXNlIHNvbWUgc2NoZW1lIGNvZGUgYnV0IHRo ZXkgYXJlIGxpbWl0YXRpb25zLiBZb3UgY2FuICh1c2UtbW9kdWxlcykKOzsgYW5kIHZhcmlhYmxl IG11c3Qgd3JhcHBlZCB3aXRoIGAobWFrZS1wYXJhbWV0ZXIpYC4gVGhlIHN4bWwgbXVzdCBhcHBl YXIgbGFzdCBpbiB0aGUgZmlsZS4KOzsKOzsgVXNlIG9mIGBtYXBgIGluc2lkZSBhIHRlbXBsYXRl Ogo7Owo7OyAgKGRpdiAoQCA6Y2xhc3MgInJvdyIpCjs7ICAgICh1bCAsKG1hcCAobGFtYmRhIChw ZXJzb24pIGAobGkgLChwZXJzb24tbmFtZSBwZXJzb24pKSkKOzsgICAgICAgICAgICAgIHBlcnNv bnMpKSkKOzsKOzsgVXNlIG9mIGBleHRlbmRgIGluc2lkZSBhIHRlbXBsYXRlOgo7Owo7Owo7OyAg IChleHRlbmQgImJhc2Uuc2Z4Igo7OyAgICAgICAgICAgKGN1cnJlbnQtbW9kdWxlKQo7OyAgICAg ICAgICAgYCgodGl0bGUgYChoMSBbSMOpbGxvIGFnYWluIGhhY2tlciEhXSkpCjs7ICAgICAgICAg ICAgIChpbnRybyAiVGhpcyBpcyBhIGxpdHRsZSBwcmVzZW50YXRpb24gb2Ygc2Z4IHRlbXBsYXRl IGxhbmd1YWdlIikpKQo7Owo7OyBNaW5kIHRoZSBmYWN0ICB0aGF0IHRoZXJlIGlzIG5vIHF1YXNp cXVvdGUgYXQgdGhlIGJlZ2lubmluZwo7OyBvZiB0aGlzIHRlbXBsYXRlLCBzaW5jZSBpdCdzIGEg cHJvY2VkdXJlIGNhbGwgYW5kIG5vdCBza3JpYmUKOzsgc3htbC4KOzsKOzsgVGhlbiB5b3UgY2Fu IHVzZSBpbiBgYmFzZS5zZnhgIHRlbXBsYXRlIGB0aXRsZWAgYW5kIGBpbnRyb2AKOzsgbGlrZSB2 YXJpYWJsZXMgdXNpbmcgdGhlIHVucXVvdGUgc3ludGF4IGUuZy4gYCwodGl0bGUpYC4KOzsKOzsg SGVyZSBpcyBhbiBleGFtcGxlIGBiYXNlLnNmeGA6Cjs7Cjs7ICAgYChodG1sCjs7ICAgICAoaGVh ZAo7OyAgICAgIChtZXRhIChAIDpjaGFyc2V0ICJ1dGYtOCIpKQo7OyAgICAgICh0aXRsZSBbVGhp cyBpcyBhIHBhZ2UgZ2VuZXJhdGVkIGZyb20gc2NoZW1lXSkKOzsgICAgICAobWV0YSAoQCA6bmFt ZSAiYXV0aG9yIiA6Y29udGVudCAiQW1pcm91Y2hlIEJPVUJFS0tJIDxhbWlyb3VjaGVAaHlwZXJt b3ZlLm5ldD4iKSkKOzsgICAgICAobWV0YSAoQCA6bmFtZSAidmlld3BvcnQiIDpjb250ZW50ICJ3 aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MSIpKQo7OyAgICAgIChsaW5rIChAIDpy ZWwgInN0eWxlc2hlZXQiIDpocmVmICJzdGF0aWMvY3NzL2Jvb3RzdHJhcC5taW4uY3NzIikpCjs7 ICAgICAgKGxpbmsgKEAgOnJlbCAic3R5bGVzaGVldCIgOmhyZWYgInN0YXRpYy9jc3MvYm9vdHN0 cmFwLXRoZW1lLm1pbi5jc3MiKSkKOzsgICAgICAobGluayAoQCA6cmVsICJzdHlsZXNoZWV0IiA6 aHJlZiAic3RhdGljL2Nzcy9tYWluLmNzcyIpKSkgIAo7OyAgICAgKGJvZHkgKEAgOmNsYXNzICJp bmRleCIpCjs7ICAgICAgICAgICAoZGl2IChAIDpjbGFzcyBjb250YWluZXIpCjs7ICAgICAgICAg ICAgICAgIChkaXYgKEAgOmNsYXNzICJoZWFkZXIgY2xlYXJmaXgiKQo7OyAgICAgICAgICAgICAg ICAgICAgIChuYXYKOzsgICAgICAgICAgICAgICAgICAgICAgKHVsIChAIDpjbGFzcyAibmF2IG5h di1waWxscyBwdWxsLXJpZ2h0IikgICAgICAgICAgICAgICAgICAgICAKOzsgICAgICAgICAgICAg ICAgICAgICAgICAgIChsaSAoQCA6cm9sZSAicHJlc2VudGF0aW9uIiA6Y2xhc3MgImFjdGl2ZSIp Cjs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGEgKEAgOmhyZWYgIiMiKSBbSG9tZV0p KQo7OyAgICAgICAgICAgICAgICAgICAgICAgICAgKGxpIChAIDpyb2xlICJwcmVzZW50YXRpb24i ICkKOzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYSAoQCA6aHJlZiAibWFpbHRvOmFt aXJvdWNoZUBoeXBlcmRldi5mciIpIFtDb250YWN0XSkpKSkKOzsgICAgICAgICAgICAgICAgICAg ICAoaDMgKEAgOmNsYXNzICJ0ZXh0LW11dGVkIikgW2h5cGVyZGV2LmZyXSkpCjs7ICAgICAgICAg ICAgICAgIChoMSBbLCh0aXRsZSldKQo7OyAgICAgICAgICAgICAgICAsKGludHJvKSkpKQo7OwoK KHVzZS1tb2R1bGVzIChzcmZpIHNyZmktMSkpCih1c2UtbW9kdWxlcyAoKHNyZmkgc3JmaS0yNikg IzpzZWxlY3QgKGN1dCkpKQoKKHVzZS1tb2R1bGVzIChpY2UtOSByNXJzKSkgIDs7IHNjaGVtZS1y ZXBvcnQtZW52aXJvbm1lbnQKKHVzZS1tb2R1bGVzIChpY2UtOSBtYXRjaCkpCih1c2UtbW9kdWxl cyAoaWNlLTkgZm9ybWF0KSkKKHVzZS1tb2R1bGVzIChpY2UtOSBoYXNoLXRhYmxlKSkKKHVzZS1t b2R1bGVzIChpY2UtOSBvcHRhcmdzKSkKKHVzZS1tb2R1bGVzIChpY2UtOSBsb2NhbC1ldmFsKSkK Cih1c2UtbW9kdWxlcyAoc3htbCBzaW1wbGUpKQoKOzsgdGhlIFNjaGVtZSByZWFkZXIgY29tcG9z aXRpb24gZnJhbWV3b3JrIChndWlsZS1yZWFkZXIpCih1c2UtbW9kdWxlcyAoKHN5c3RlbSByZWFk ZXIpICM6cmVuYW1lciAoc3ltYm9sLXByZWZpeC1wcm9jICdyOikpKQoKOzs7Cjs7OyBza3JpYmUg cmVhZGVyIChib3Jyb3dlZCBmcm9tIHNrcmliaWxvKQo7OzsKCihkZWZpbmUgKG1ha2UtY29sb24t ZnJlZS10b2tlbi1yZWFkZXIgdHIpCiAgOzsgU3RvbGVuIGZyb20gYGd1aWxlLXJlYWRlcicgMC4z LgogICJJZiB0b2tlbiByZWFkZXIgQHZhcnt0cn0gaGFuZGxlcyB0aGUgQGNvZGV7On0gKGNvbG9u KSBjaGFyYWN0ZXIsIHJlbW92ZSBpdApmcm9tIGl0cyBzcGVjaWZpY2F0aW9uIGFuZCByZXR1cm4g dGhlIG5ldyB0b2tlbiByZWFkZXIuIgogIChsZXQqICgoc3BlYyAocjp0b2tlbi1yZWFkZXItc3Bl Y2lmaWNhdGlvbiB0cikpCiAgICAgICAgIChwcm9jIChyOnRva2VuLXJlYWRlci1wcm9jZWR1cmUg dHIpKSkKICAgIChyOm1ha2UtdG9rZW4tcmVhZGVyIChmaWx0ZXIgKGxhbWJkYSAoY2hyKQogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChub3QgKGNoYXI9PyBjaHIgI1w6KSkpCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWMpCiAgICAgICAgICAgICAgICAgICAg ICAgICBwcm9jKSkpCgooZGVmaW5lICZzaGFycC1yZWFkZXIKICA7OyBUaGUgcmVhZGVyIGZvciB3 aGF0IGNvbWVzIGFmdGVyIGEgYCMnIGNoYXJhY3Rlci4KICAobGV0KiAoKGRzc3NsLWtleXdvcmQt cmVhZGVyICA7OyBrZXl3b3JkcyDDoCBsYSBgIyFrZXknCiAgICAgICAgICAocjptYWtlLXRva2Vu LXJlYWRlciAjXCEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyOnRva2VuLXJlYWRl ci1wcm9jZWR1cmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocjpzdGFuZGFyZC10 b2tlbi1yZWFkZXIgJ2tleXdvcmQpKSkpKQogICAgICAocjptYWtlLXJlYWRlciAoY29ucyBkc3Nz bC1rZXl3b3JkLXJlYWRlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAobWFwIHI6c3RhbmRh cmQtdG9rZW4tcmVhZGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyhjaGFyYWN0 ZXIgc3JmaS00IHZlY3RvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVy K3JhZGl4IGJvb2xlYW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyZmkzMC1i bG9jay1jb21tZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmZpNjItc2V4 cC1jb21tZW50KSkpCiAgICAgICAgICAgICAgICAgICAgICNmIDs7IHVzZSBkZWZhdWx0IGZhdWx0 IGhhbmRsZXIKICAgICAgICAgICAgICAgICAgICAgJ3JlYWRlci9yZWNvcmQtcG9zaXRpb25zKSkp CgooZGVmaW5lIChtYWtlLXNrcmliZS1yZWFkZXIpCiAgKGxldCAoKGNvbG9uLWtleXdvcmRzIDs7 IGtleXdvcmRzIMOgIGxhIGA6a2V5JyBmYXNoaW9uCiAgICAgICAgIChyOm1ha2UtdG9rZW4tcmVh ZGVyICNcOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocjp0b2tlbi1yZWFkZXItcHJv Y2VkdXJlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocjpzdGFuZGFyZC10b2tlbi1y ZWFkZXIgJ2tleXdvcmQpKSkpCiAgICAgICAgKHN5bWJvbC1taXNjLWNoYXJzLXRyCiAgICAgICAg IDs7IE1ha2Ugc3VyZSBgOicgaXMgaGFuZGxlZCBvbmx5IGJ5IHRoZSBrZXl3b3JkIHRva2VuIHJl YWRlci4KICAgICAgICAgKG1ha2UtY29sb24tZnJlZS10b2tlbi1yZWFkZXIKICAgICAgICAgIChy OnN0YW5kYXJkLXRva2VuLXJlYWRlciAncjZycy1zeW1ib2wtbWlzYy1jaGFycykpKSkKCgogICAg OzsgTm90ZTogd2UgdXNlIHRoZSBgcjZycy1zeW1ib2wtKicgYW5kIGByNnJzLW51bWJlcicgdG9r ZW4gcmVhZGVycyBzaW5jZQogICAgOzsgdGhleSBjb25zaWRlciBzcXVhcmUgYnJhY2tldHMgYXMg ZGVsaW1pdGVycy4KICAgIChyOm1ha2UtcmVhZGVyIChjb25zKiAocjptYWtlLXRva2VuLXJlYWRl ciAjXCMgJnNoYXJwLXJlYWRlcikKICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvbi1rZXl3 b3JkcwogICAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbC1taXNjLWNoYXJzLXRyCiAgICAg ICAgICAgICAgICAgICAgICAgICAgKG1hcCByOnN0YW5kYXJkLXRva2VuLXJlYWRlcgogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgYCh3aGl0ZXNwYWNlCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHNleHAgc3RyaW5nIHI2cnMtbnVtYmVyCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHI2cnMtc3ltYm9sLWxvd2VyLWNhc2UKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgcjZycy1zeW1ib2wtdXBwZXItY2FzZQogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBxdW90ZS1xdWFzaXF1b3RlLXVucXVvdGUKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgc2VtaWNvbG9uLWNvbW1lbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgc2tyaWJlLWV4cCkpKQogICAgICAgICAgICAgICAgICAgI2YgOzsgdXNlIHRoZSBkZWZh dWx0IGZhdWx0IGhhbmRsZXIKICAgICAgICAgICAgICAgICAgICdyZWFkZXIvcmVjb3JkLXBvc2l0 aW9ucwogICAgICAgICAgICAgICAgICAgKSkpCgooZGVmaW5lIHNrcmliZSAobWFrZS1za3JpYmUt cmVhZGVyKSkKCjs7Owo7Ozsgc2Z4IHRlbXBsYXRlIHNwZWNpZmljcwo7OzsKCihkZWZpbmUgKGtl eXdvcmRzLT5hdHRyaWJ1dGVzIGtleXdvcmRzKQogICJDb252ZXJ0IChsaXN0IDpvbmUgXCJrZXlc IiA6dHdvIFwid29yZFwiKSB0byBzeG1sIGF0dHJpYnV0ZXMgKGxpc3QgKCdvbmUgXCJrZXlcIikg KCd0d28gXCJ3b3JkXCIpKSIKICAobWF0Y2gga2V5d29yZHMKICAgICgoa2V5d29yZCB2YWx1ZSBy ZXN0IC4uLikgKGNvbnMgKGxpc3QgKGtleXdvcmQtPnN5bWJvbCBrZXl3b3JkKSB2YWx1ZSkgKGtl eXdvcmRzLT5hdHRyaWJ1dGVzIHJlc3QpKSkKICAgIChfICcoKSkpKQoKKGRlZmluZSAoc2Z4LT5z eG1sIHNmeCkKICAiVHVybiBzZnggdGVtcGxhdGUgaW50byBzeG1sIgogIChtYXRjaCBzZngKICAg ICgoJ3F1YXNpcXVvdGUgdmFsdWUpIChtYXAgc2Z4LT5zeG1sIHZhbHVlKSkKICAgICgoJ3VucXVv dGUgdmFsdWUpIChsaXN0ICd1bnF1b3RlIHZhbHVlKSkKICAgICgodGFnICgnQCBrZXl3b3JkcyAu Li4pKSAobGlzdCB0YWcgKGFwcGVuZCAnKEApIChrZXl3b3Jkcy0+YXR0cmlidXRlcyBrZXl3b3Jk cykpKSkKICAgICgodGFnICgnQCBrZXl3b3JkcyAuLi4pIGNoaWxkcmVuIC4uLikgKGFwcGVuZCAo bGlzdCB0YWcgKGFwcGVuZCAnKEApIChrZXl3b3Jkcy0+YXR0cmlidXRlcyBrZXl3b3JkcykpKSAo bWFwIHNmeC0+c3htbCBjaGlsZHJlbikpKQogICAgCiAgICAoKHRhZyBjaGlsZHJlbiAuLi4pIChh cHBlbmQgKGxpc3QgdGFnKSAobWFwIHNmeC0+c3htbCBjaGlsZHJlbikpKQogICAgCiAgICAoKHZh bHVlIC4uLikgKG1hcCBzZngtPnN4bWwgdmFsdWUpKQogICAgKF8gc2Z4KSkpCgo7OzsKOzs7IHRl bXBsYXRlIHJlbmRlcmluZwo7OzsKCihkZWZpbmUqIChyZWFkLWV2YWwtdGVtcGxhdGUgZW52ICM6 b3B0aW9uYWwgb3V0KQogIChsZXQgKChzZXhwIChza3JpYmUpKSkKICAgIChpZiAoZW9mLW9iamVj dD8gc2V4cCkKICAgICAgICBvdXQKICAgICAgICAocmVhZC1ldmFsLXRlbXBsYXRlIGVudiAoZmx5 ZXZhbCBzZXhwIGVudikpKSkpCgooZGVmaW5lICh0ZW1wbGF0ZS0+eG1sIGVudiBwb3J0KQogIChz eG1sLT54bWwgKGZseWV2YWwgKGxpc3QgJ3F1YXNpcXVvdGUgKHNmeC0+c3htbCAocmVhZC1ldmFs LXRlbXBsYXRlIGVudikpKSBlbnYpKSBwb3J0KQoKKGRlZmluZSAoZmx5ZXZhbCBzZXhwciBlbnYp CiAgKChsb2NhbC1ldmFsIGAobGFtYmRhICgpICxzZXhwcikgZW52KSkpCgo7OzsKOzs7IHRlbXBs YXRlIHByb2NlZHVyZXMKOzs7CgooZGVmaW5lIChleHRlbmQgYmFzZSBlbnYgY29udGV4dCkKICAi RXh0ZW5kIEJBU0UgdGVtcGxhdGUgd2l0aCB2YWx1ZXMgZGVmaW5lZCBpbiBFTlYgYW5kIENPTlRF WFQuCgogICBUaGlzIG11c3QgYmUgdXNlZCBpbnNpZGUgYSB0ZW1wbGF0ZSIKICAobWFwIChsYW1i ZGEgKHBhaXIpCiAgICAgICAgIChtYXRjaCBwYWlyCiAgICAgICAgICAgICAgICAoKG5hbWUgdmFs dWUpCiAgICAgICAgICAgICAgICAgKG1vZHVsZS1hZGQhIGVudgogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBuYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYWtlLXZhcmlh YmxlIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1ha2UtcGFyYW1ldGVyIChmbHll dmFsIHZhbHVlIGVudikpKSkpKSkKICAgICAgIGNvbnRleHQpCiAgKGNhbGwtd2l0aC1vdXRwdXQt c3RyaW5nCiAgIChsYW1iZGEgKHBvcnQpCiAgICAgKHdpdGgtaW5wdXQtZnJvbS1maWxlIGJhc2UK ICAgICAgIChsYW1iZGEgKCkKICAgICAgICAgKHRlbXBsYXRlLT54bWwgZW52IHBvcnQpKSkpKSkK Cjs7Owo7OzsgcmVuZGVyCjs7OwoKKGRlZmluZSAocmVuZGVyIHRlbXBsYXRlIGJpbmRpbmdzKQog IChkZWZpbmUgZW52IChzY2hlbWUtcmVwb3J0LWVudmlyb25tZW50IDUpKQogIChtb2R1bGUtYWRk ISBlbnYgJ2V4dGVuZCAobWFrZS12YXJpYWJsZSBleHRlbmQpKQogIChtb2R1bGUtYWRkISBlbnYg J2N1cnJlbnQtbW9kdWxlIChtYWtlLXZhcmlhYmxlIGN1cnJlbnQtbW9kdWxlKSkKICAobWFwIChs YW1iZGEgKHBhaXIpCiAgICAgICAgIChtYXRjaCBwYWlyICgobmFtZSB2YWx1ZSkgKG1vZHVsZS1h ZGQhIGVudiBuYW1lIChtYWtlLXZhcmlhYmxlIHZhbHVlKSkpKSkKICAgICAgIGJpbmRpbmdzKQog IChjYWxsLXdpdGgtb3V0cHV0LXN0cmluZwogICAobGFtYmRhIChwb3J0KQogICAgICh3aXRoLWlu cHV0LWZyb20tZmlsZSB0ZW1wbGF0ZQogICAgICAgKGxhbWJkYSAoKQogICAgICAgICAoZGlzcGxh eSAiPCFET0NUWVBFIGh0bWw+IikKICAgICAgICAgKHRlbXBsYXRlLT54bWwgZW52IHBvcnQpKSkp KSkKCjs7Owo7OzsgRXhhbXBsZSB1c2UKOzs7Cjs7OyBUaGlzIHJlcXVpcmVzIGF0IGxlYXN0IGEg YGluZGV4LnNmeGAgZmlsZSBhbmQgYHBlcnNvbi5zY21gIHdoZXJlCjs7OyBhIGA8cGVyc29uPmAg cmVjb3JkIGlzIGRlZmluZWQuCjs7OwoKOzsgKHVzZS1tb2R1bGVzIChwZXJzb24pKQoKOzsgKGRl ZmluZSBwZXJzb25zIChsaXN0IChtYWtlLXBlcnNvbiAiYW1pcm91Y2hlIiAzMCkKOzsgICAgICAg ICAgICAgICAgICAgICAgIChtYWtlLXBlcnNvbiAianVsaWVuIiAzMCkKOzsgICAgICAgICAgICAg ICAgICAgICAgIChtYWtlLXBlcnNvbiAibWV6IiAyNykKOzsgICAgICAgICAgICAgICAgICAgICAg IChtYWtlLXBlcnNvbiAibW9oIiAxMTMpKSkKCjs7IChkZWZpbmUgYmluZGluZ3MgYCgodmFsdWUg LChtYWtlLXBhcmFtZXRlciA0MikpCjs7ICAgICAgICAgICAgICAgICAgICAodGl0bGUgJyhoMSAi SMOpbGxvIChhZ2FpbiAoYW5kIGFnYWluKSkgaGFja2VyISIpKQo7OyAgICAgICAgICAgICAgICAg ICAgKHBlcnNvbnMgLHBlcnNvbnMpKSkKCjs7ICh3aXRoLW91dHB1dC10by1maWxlICJpbmRleC5o dG1sIgo7OyAgIChsYW1iZGEgKCkgKHJlbmRlciAiaW5kZXguc2Z4IiBiaW5kaW5ncykpKQo= --=_48d05b6f730da5c332e03ce7fc6f67fd Content-Transfer-Encoding: base64 Content-Type: text/plain; name=base.sfx Content-Disposition: attachment; filename=base.sfx; size=1097 YChodG1sCiAgKGhlYWQKICAgKG1ldGEgKEAgOmNoYXJzZXQgInV0Zi04IikpCiAgICh0aXRsZSBb VGhpcyBpcyBhIHBhZ2UgZ2VuZXJhdGVkIGZyb20gc2NoZW1lXSkKICAgKG1ldGEgKEAgOm5hbWUg ImF1dGhvciIgOmNvbnRlbnQgIkFtaXJvdWNoZSBCT1VCRUtLSSA8YW1pcm91Y2hlQGh5cGVybW92 ZS5uZXQ+IikpCiAgIChtZXRhIChAIDpuYW1lICJ2aWV3cG9ydCIgOmNvbnRlbnQgIndpZHRoPWRl dmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xIikpCiAgIChsaW5rIChAIDpyZWwgInN0eWxlc2hl ZXQiIDpocmVmICJzdGF0aWMvY3NzL2Jvb3RzdHJhcC5taW4uY3NzIikpCiAgIChsaW5rIChAIDpy ZWwgInN0eWxlc2hlZXQiIDpocmVmICJzdGF0aWMvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3Nz IikpCiAgIChsaW5rIChAIDpyZWwgInN0eWxlc2hlZXQiIDpocmVmICJzdGF0aWMvY3NzL21haW4u Y3NzIikpKSAgCiAgKGJvZHkgKEAgOmNsYXNzICJpbmRleCIpCiAgICAgICAgKGRpdiAoQCA6Y2xh c3MgY29udGFpbmVyKQogICAgICAgICAgICAgKGRpdiAoQCA6Y2xhc3MgImhlYWRlciBjbGVhcmZp eCIpCiAgICAgICAgICAgICAgICAgIChuYXYKICAgICAgICAgICAgICAgICAgICh1bCAoQCA6Y2xh c3MgIm5hdiBuYXYtcGlsbHMgcHVsbC1yaWdodCIpICAgICAgICAgICAgICAgICAgICAgCiAgICAg ICAgICAgICAgICAgICAgICAgKGxpIChAIDpyb2xlICJwcmVzZW50YXRpb24iIDpjbGFzcyAiYWN0 aXZlIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgKGEgKEAgOmhyZWYgIiMiKSBbSG9tZV0p KQogICAgICAgICAgICAgICAgICAgICAgIChsaSAoQCA6cm9sZSAicHJlc2VudGF0aW9uIiApCiAg ICAgICAgICAgICAgICAgICAgICAgICAgIChhIChAIDpocmVmICJtYWlsdG86YW1pcm91Y2hlQGh5 cGVyZGV2LmZyIikgW0NvbnRhY3RdKSkpKQogICAgICAgICAgICAgICAgICAoaDMgKEAgOmNsYXNz ICJ0ZXh0LW11dGVkIikgW2h5cGVyZGV2LmZyXSkpCiAgICAgICAgICAgICAoaDQgW1RoZSBtYWdp YyBudW1iZXIgaXMgLCh2YWx1ZSldKQogICAgICAgICAgICAgLChoZWFkZXIpCiAgICAgICAgICAg ICAsKGludHJvKSkpKQo= --=_48d05b6f730da5c332e03ce7fc6f67fd Content-Transfer-Encoding: base64 Content-Type: text/plain; name=index.sfx Content-Disposition: attachment; filename=index.sfx; size=368 KGV4dGVuZCAiYmFzZS5zZngiCiAgICAgICAgKGN1cnJlbnQtbW9kdWxlKQogICAgICAgIGAoKGhl YWRlciAsdGl0bGUpCiAgICAgICAgICAoaW50cm8gYChkaXYgKHAgIlRoaXMgaXMgYSBsaXR0bGUg cHJlc2VudGF0aW9uIG9mIHNmeCB0ZW1wbGF0ZSBsYW5ndWFnZSIpCiAgICAgICAgICAgICAgICAg ICAgICAgKHAgIkhlcmUgaXMgYW4gZXhhbXBsZSBvZiBzeG1sIGNvZGUgZ2VuZXJhdGVkIHdpdGgg c2NoZW1lIGNvZGUiKQogICAgICAgICAgICAgICAgICAgICAgICh1bCAsKG1hcCAobGFtYmRhIChw ZXJzb24pIGAobGkgLChwZXJzb24tbmFtZSBwZXJzb24pKSkKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgcGVyc29ucykpKSkpKQo= --=_48d05b6f730da5c332e03ce7fc6f67fd Content-Transfer-Encoding: base64 Content-Type: text/plain; name=person.scm Content-Disposition: attachment; filename=person.scm; size=205 KGRlZmluZS1tb2R1bGUgKHBlcnNvbikpCgoodXNlLW1vZHVsZXMgKHNyZmkgc3JmaS05KSkKCihk ZWZpbmUtcmVjb3JkLXR5cGUgPHBlcnNvbj4KICAobWFrZS1wZXJzb24gbmFtZSBhZ2UpCiAgcGVy c29uPwogIChuYW1lIHBlcnNvbi1uYW1lKQogIChhZ2UgcGVyc29uLWFnZSkpCgooZXhwb3J0IG1h a2UtcGVyc29uIHBlcnNvbi1uYW1lIHBlcnNvbi1hZ2UpCg== --=_48d05b6f730da5c332e03ce7fc6f67fd--