From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: "Julian Graham" Newsgroups: gmane.lisp.guile.devel Subject: pass at srfi-89 implementation Date: Fri, 2 May 2008 23:37:02 -0400 Message-ID: <2bc5f8210805022037t73e3e30ay835ad4814e308397@mail.gmail.com> NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_13395_29826336.1209785822377" X-Trace: ger.gmane.org 1209785840 10171 80.91.229.12 (3 May 2008 03:37:20 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Sat, 3 May 2008 03:37:20 +0000 (UTC) To: guile-devel Original-X-From: guile-devel-bounces+guile-devel=m.gmane.org@gnu.org Sat May 03 05:37:55 2008 Return-path: Envelope-to: guile-devel@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by lo.gmane.org with esmtp (Exim 4.50) id 1Js8ZN-0004cm-Ow for guile-devel@m.gmane.org; Sat, 03 May 2008 05:37:54 +0200 Original-Received: from localhost ([127.0.0.1]:40897 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Js8Yg-0006E7-Gc for guile-devel@m.gmane.org; Fri, 02 May 2008 23:37:10 -0400 Original-Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1Js8Yd-0006Ds-Dw for guile-devel@gnu.org; Fri, 02 May 2008 23:37:07 -0400 Original-Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1Js8Yb-0006Dg-7U for guile-devel@gnu.org; Fri, 02 May 2008 23:37:06 -0400 Original-Received: from [199.232.76.173] (port=58714 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Js8Yb-0006Dd-3g for guile-devel@gnu.org; Fri, 02 May 2008 23:37:05 -0400 Original-Received: from fg-out-1718.google.com ([72.14.220.153]) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1Js8Ya-00037I-62 for guile-devel@gnu.org; Fri, 02 May 2008 23:37:04 -0400 Original-Received: by fg-out-1718.google.com with SMTP id 13so2901980fge.30 for ; Fri, 02 May 2008 20:37:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:message-id:date:from:to:subject:mime-version:content-type; bh=w4ys72+DD0rUyK97DmdVBt4jd+Kpz1dEB5xdTKlnKRc=; b=SSujPfLu2hHjXZfHb4bfgZWNsstsYSN8msaj3G/VQ9Brfkrnu5+YtrgLyu5JYAKnQqXXF2iSEUmmY9bKc5gf1fX51eFu4LQVCuFk1jd3/YuwGczb6KkI8YMKRjpLcuez2J/tPSheoXkDLhceAkfTl1a86AQyvZimVZnPuPaemgY= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=message-id:date:from:to:subject:mime-version:content-type; b=alJLLLe97swwONrhouz6JZvgw/8+Q+/HFXicvA6OzUjt9OGMMjnteCA7d/G2P8YNqwcLAexZp1pPejDyl0vcXkDnZ1tH0NjqcpewD1e/Xhf71X3UvjuA8BrD+rJnSVQrG3phQdmEsMCQh+qY6tDD4dmikIxkaFxEcTDTq6hU6j4= Original-Received: by 10.82.153.12 with SMTP id a12mr388833bue.37.1209785822395; Fri, 02 May 2008 20:37:02 -0700 (PDT) Original-Received: by 10.82.100.3 with HTTP; Fri, 2 May 2008 20:37:02 -0700 (PDT) X-detected-kernel: by monty-python.gnu.org: Linux 2.6 (newer, 2) X-BeenThere: guile-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Developers list for Guile, the GNU extensibility library" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: guile-devel-bounces+guile-devel=m.gmane.org@gnu.org Errors-To: guile-devel-bounces+guile-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.lisp.guile.devel:7206 Archived-At: ------=_Part_13395_29826336.1209785822377 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Content-Disposition: inline Hi everyone, So I've taken a stab at implementing SRFI-89, using Guile's existing (ice-9 optargs) module -- my thinking was that the two were similar enough to make it worthwhile to have optargs do most of the heavy lifting. What I've done is add some pre-parsing of the formals list before it's passed to (ice-9 optargs)'s lambda* and some accommodation of incompatible behavior. Specifically: * The (ice-9 optargs) module requires that the #optionals section, if present, come before the #keywords section, whereas SRFI-89 allows its corresponding sections to be in either order. * (ice-9 optargs) requires that non-optional positional formals be specified before any optional positional or keyword formals. * (ice-9 optargs) (and, apparently, Common Lisp) adds all the keyword arguments to the rest argument at call time. * SRFI-89 doesn't allow duplicate keyword arguments in a function call. * SRFI-89 keyword definitions allow the value of a keyword argument to be bound to a variable with a different name than the keyword; (ice-9 optargs) does not. I think that's everything -- except for one last quirk of (ice-9 optargs) that I discovered last night and am having trouble working around. It looks like when you've defined a function that takes traditional/required as well as keyword arguments, you need to pass all of the required arguments before passing any of the keyword ones. For example: (define* (g a #:key (b #f) #:rest r) (list a b r)) (g 1 #:b 2 3) => (1 2 (3)) ...but (g #:b 2 1 3) => (#:b #f (2 1 3)) The docs sort of hint at why this is implemented the way it is, but I think it eliminates a lot of the flexibility that keyword arguments buy you in the first place. What I want to know is whether this seems to you like a shortcoming in (ice-9 optargs) that ought to be fixed, or whether I should just ditch my implementation and go with the vanilla SRFI-89 implementation included with the specification. I've attached the draft I've been working on in case anyone wants to have a look. Regards, Julian ------=_Part_13395_29826336.1209785822377 Content-Type: application/octet-stream; name=srfi-89.scm Content-Transfer-Encoding: base64 X-Attachment-Id: f_ffrn4l300 Content-Disposition: attachment; filename=srfi-89.scm Ozs7IHNyZmktODkuc2NtIC0tLSBPcHRpb25hbCBwb3NpdGlvbmFsIGFuZCBuYW1lZCBwYXJhbWV0 ZXJzCgo7OyBDb3B5cmlnaHQgKEMpIDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMu Cjs7Cjs7IFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0 ZSBpdCBhbmQvb3IKOzsgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3Nl ciBHZW5lcmFsIFB1YmxpYwo7OyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0 d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKOzsgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9y IChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCjs7Cjs7IFRoaXMgbGlicmFyeSBp cyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAo7OyBidXQg V0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBv Zgo7OyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0Uu ICBTZWUgdGhlIEdOVQo7OyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBk ZXRhaWxzLgo7Owo7OyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUg TGVzc2VyIEdlbmVyYWwgUHVibGljCjs7IExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7 IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKOzsgRm91bmRhdGlvbiwgSW5jLiwg NTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVT QQoKKGRlZmluZS1tb2R1bGUgKHNyZmkgc3JmaS04OSkKICAjOnVzZS1tb2R1bGUgKGljZS05IG9w dGFyZ3MpCiAgIzp1c2UtbW9kdWxlIChzcmZpIHNyZmktMSkKICAjOnVzZS1tb2R1bGUgKHNyZmkg c3JmaS04KQogICM6dXNlLW1vZHVsZSAoc3JmaSBzcmZpLTg4KQogICM6cmVwbGFjZSAoZGVmaW5l KiBsYW1iZGEqKSkKCihkZWZpbmUtbWFjcm8gKGRlZmluZSogcGF0dGVybiAuIGJvZHkpCiAgKGlm IChwYWlyPyBwYXR0ZXJuKQogICAgICBgKGRlZmluZSAsKGNhciBwYXR0ZXJuKSAobGFtYmRhKiAs KGNkciBwYXR0ZXJuKSAsQGJvZHkpKQogICAgICBgKGRlZmluZSAscGF0dGVybiAsQGJvZHkpKSkK CihkZWZpbmUtbWFjcm8gKGxhbWJkYSogZm9ybWFscyAuIGJvZHkpCiAgKGRlZmluZSAodHJhbnNm b3JtLWZvcm1hbHMgbHN0IGh0KQogICAgKGRlZmluZSAodHJhbnNmb3JtLXBhaXJzIGxzdCkKICAg ICAgKGRlZmluZSAoZm9ybWF0LWxpc3RzIG5hbWVkIG9wdGlvbmFsKQoJKGFwcGVuZCAnKCkgCgkJ KGlmIChudWxsPyBvcHRpb25hbCkgJygpIChjb25zICM6b3B0aW9uYWwgb3B0aW9uYWwpKQoJCShp ZiAobnVsbD8gbmFtZWQpICcoKSAoY29ucyAjOmtleSBuYW1lZCkpKSkKICAgICAgKGRlZmluZSAo Y2FyLWlzLWtleXdvcmQ/IHgpIChrZXl3b3JkPyAoY2FyIHgpKSkKICAgICAgKGRlZmluZSAobm90 LWNhci1pcy1rZXl3b3JkPyB4KSAobm90IChjYXItaXMta2V5d29yZD8geCkpKQogICAgICAoZGVm aW5lIChzYXZlLWJpbmRpbmcgeCkKCShsZXQgKChjeCAoc3RyaW5nLT5zeW1ib2wgKGtleXdvcmQt PnN0cmluZyAoY2FyIHgpKSkpKQoJICAoaGFzaHEtc2V0ISBodCBjeCAoY2FkciB4KSkgCgkgIChj b25zIGN4IChjZGRyIHgpKSkpCiAgICAgIChkZWZpbmUgKHBhcnNlLWZvcm1hbHMgbHN0IGtleXdv cmRzLWZpcnN0KQoJKHJlY2VpdmUgKGwxIGwyKQoJCSAoKGlmIGtleXdvcmRzLWZpcnN0IHNwYW4g YnJlYWspIGNhci1pcy1rZXl3b3JkPyBsc3QpCgkJIChpZiAob3IgKGZpbmQgY2FyLWlzLWtleXdv cmQ/IChpZiBrZXl3b3Jkcy1maXJzdCBsMiBsMSkpCgkJCSAoZmluZCBub3QtY2FyLWlzLWtleXdv cmQ/IChpZiBrZXl3b3Jkcy1maXJzdCBsMSBsMikpKQoJCSAgICAgKGVycm9yICJPcmRlcmluZyBl cnJvciBpbiBmb3JtYWwgcGFyYW1ldGVycyBsaXN0IikKCQkgICAgIChmb3JtYXQtbGlzdHMgKG1h cCBzYXZlLWJpbmRpbmcgKGlmIGtleXdvcmRzLWZpcnN0IGwxIGwyKSkKCQkJCSAgIChpZiBrZXl3 b3Jkcy1maXJzdCBsMiBsMSkpKSkpCgkKICAgICAgKGlmIChudWxsPyBsc3QpICcoKSAocGFyc2Ut Zm9ybWFscyBsc3QgKGNhci1pcy1rZXl3b3JkPyAoY2FyIGxzdCkpKSkpCiAgCiAgICAocmVjZWl2 ZSAob3RoZXItZm9ybWFscyByZXEtcG9zaXRpb25hbHMpCgkgICAgIChwYXJ0aXRpb24gcGFpcj8g bHN0KQoJICAgICAoYXBwZW5kIHJlcS1wb3NpdGlvbmFscyAodHJhbnNmb3JtLXBhaXJzIG90aGVy LWZvcm1hbHMpKSkpCgogIChkZWZpbmUgKGZvcm1hbHMrcmVzdCBsKQogICAgKGRlZmluZSAoaW5u ZXIgaCB0KQogICAgICAoaWYgKHBhaXI/IHQpIChpbm5lciAoYXBwZW5kIGggKGxpc3QgKGNhciB0 KSkpIChjZHIgdCkpICh2YWx1ZXMgaCB0KSkpCiAgICAoaW5uZXIgJygpIGwpKQoKICAocmVjZWl2 ZSAKICAgKG4tciByKQogICAoZm9ybWFscytyZXN0IGZvcm1hbHMpICAKICAgKGxldCogKChodCAo bWFrZS1oYXNoLXRhYmxlKSkKCSAgKHJlc3QgKGlmIChub3QgKG51bGw/IHIpKSByICdzcmZpLTg5 OnJlc3QtdmFyKSkKCSAgKHRmIChhcHBlbmQgKHRyYW5zZm9ybS1mb3JtYWxzIG4tciBodCkgKGxp c3QgIzpyZXN0IHJlc3QpKSkJICAKCSAgKGt3cyAoaGFzaC1tYXAtPmxpc3QgY29ucyBodCkpKQog ICAgIAogICAgIGAobGV0ICgocmVjZWl2ZSAoQCAoc3JmaSBzcmZpLTgpIHJlY2VpdmUpKQoKCSAg ICAobGV0LWtleXdvcmRzKiAoQCAoaWNlLTkgb3B0YXJncykgbGV0LWtleXdvcmRzKikpCgkgICAg KGxldC1vcHRpb25hbCogKEAgKGljZS05IG9wdGFyZ3MpIGxldC1vcHRpb25hbCopKSkKCSgoQCAo aWNlLTkgb3B0YXJncykgbGFtYmRhKikgLHRmCgoJIChkZWZpbmUgKHNyZmktODk6cmVzdCByKQoJ ICAgKGRlZmluZSBjb3VudCAoQCAoc3JmaSBzcmZpLTEpIGNvdW50KSkKCSAgIChkZWZpbmUgZGVs ZXRlLWR1cGxpY2F0ZXMgKEAgKHNyZmkgc3JmaS0xKSBkZWxldGUtZHVwbGljYXRlcykpCgkgICAo ZGVmaW5lIHNwbGl0LWF0IChAIChzcmZpIHNyZmktMSkgc3BsaXQtYXQpKQoJICAgCgkgICAocmVj ZWl2ZSAoa3MgcnMpCgkJICAgIChzcGxpdC1hdCByICgqIChjb3VudCBrZXl3b3JkPyByKSAyKSkK CQkgICAgKGxldCAoKGt3cyAoZmlsdGVyIGtleXdvcmQ/IGtzKSkpCgkJICAgICAgKGlmIChlcT8g a3dzIChkZWxldGUtZHVwbGljYXRlcyBrd3MpKQoJCQkgIHJzIChlcnJvciAiRHVwbGljYXRlIGtl eXdvcmQgYmluZGluZyIpKSkpKQoJIAoJICwoaWYgKG5vdCAobnVsbD8gcikpCgkgICAgICAgYChy ZWNlaXZlCgkJICwoYXBwZW5kIChtYXAgY2RyIGt3cykgYCgscmVzdCkpCgkJICwoY29ucyAndmFs dWVzIChhcHBlbmQgKG1hcCBjYXIga3dzKSBgKChzcmZpLTg5OnJlc3QgLHJlc3QpKSkpCgkJICxA Ym9keSkKCSAgICAgICBgKHJlY2VpdmUgLChtYXAgY2RyIGt3cykKCQkJICwoY29ucyAndmFsdWVz IChtYXAgY2FyIGt3cykpCgkJCSAoYmVnaW4gKG9yIChudWxsPyAoc3JmaS04OTpyZXN0ICxyZXN0 KSkKCQkJCSAgICAoZXJyb3IgIldyb25nIG51bWJlciBvZiBhcmd1bWVudCIpKQoJCQkJLEBib2R5 KSkpKSkpKSkK ------=_Part_13395_29826336.1209785822377 Content-Type: application/octet-stream; name=srfi-89.test Content-Transfer-Encoding: base64 X-Attachment-Id: f_ffrn5nv61 Content-Disposition: attachment; filename=srfi-89.test Ozs7OyBzcmZpLTg5LnRlc3QgLS0tIFRlc3Qgc3VpdGUgZm9yIFNSRkktODkgICAgICAgICAgICAg IC0qLSBTY2hlbWUgLSotCjs7OzsgSnVsaWFuIEdyYWhhbSA8anVsaWFuLmdyYWhhbUBheWEueWFs ZS5lZHU+Cjs7OzsKOzs7OyAJQ29weXJpZ2h0IChDKSAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRh dGlvbiwgSW5jLgo7Ozs7Cjs7OzsgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBj YW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKOzs7OyBpdCB1bmRlciB0aGUgdGVybXMg b2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQo7Ozs7IHRo ZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3Vy IG9wdGlvbikKOzs7OyBhbnkgbGF0ZXIgdmVyc2lvbi4KOzs7Owo7Ozs7IFRoaXMgcHJvZ3JhbSBp cyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAo7Ozs7IGJ1 dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5 IG9mCjs7OzsgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQ T1NFLiAgU2VlIHRoZQo7Ozs7IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRl dGFpbHMuCjs7OzsKOzs7OyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBH TlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQo7Ozs7IGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsg c2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCjs7OzsgdGhlIEZyZWUgU29m dHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwK Ozs7OyBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCgooZGVmaW5lLW1vZHVsZSAodGVzdC1zcmZp LTg5KQogIDp1c2UtbW9kdWxlICh0ZXN0LXN1aXRlIGxpYikKICA6dXNlLW1vZHVsZSAoc3JmaSBz cmZpLTg5KSkKCgwKOzsgVGhlc2UgYXJlIGFsbCB0YWtlbiBmcm9tIFNSRkktODkuCgooZGVmaW5l KiAoZiBhIChiICNmKSkgKGxpc3QgYSBiKSkKKGRlZmluZSogKGcgYSAoYiBhKSAoa2V5OiBrICgq IGEgYikpKSAobGlzdCBhIGIgaykpCihkZWZpbmUqIChoMSBhIChrZXk6IGsgI2YpIC4gcikgKGxp c3QgYSBrIHIpKQooZGVmaW5lKiAoaDIgKGtleTogayAjZikgYSAuIHIpIChsaXN0IGEgayByKSkK Cih3aXRoLXRlc3QtcHJlZml4ICJzcmZpLTg5IgoKICAocGFzcy1pZiAiZGVmYXVsdC12YWx1ZXMt MSIgKGVxdWFsPyAoZiAxKSAnKDEgI2YpKSkKICAocGFzcy1pZiAiZGVmYXVsdC12YWx1ZXMtMiIg KGVxdWFsPyAoZiAxIDIpICcoMSAyKSkpCiAgKHBhc3MtaWYgImFyZ3VtZW50LWNvdW50LTEiIChu b3QgKGZhbHNlLWlmLWV4Y2VwdGlvbiAoZiAxIDIgMykpKSkKCiAgKHBhc3MtaWYgImRlZmF1bHQt dmFsdWVzLTMiIChlcXVhbD8gKGcgMykgJygzIDMgOSkpKQogIChwYXNzLWlmICJkZWZhdWx0LXZh bHVlcy00IiAoZXF1YWw/IChnIDMgNCkgJygzIDQgMTIpKSkKICAocGFzcy1pZiAibWFsZm9ybWVk LWtleXdvcmQiIChub3QgKGZhbHNlLWlmLWV4Y2VwdGlvbiAoZyAzIDQga2V5OikpKSkKICAocGFz cy1pZiAia2V5d29yZC0xIiAoZXF1YWw/IChnIDMgNCBrZXk6IDUpICcoMyA0IDUpKSkKICAocGFz cy1pZiAidW5kZWZpbmVkLWtleXdvcmQiIChub3QgKGZhbHNlLWlmLWV4Y2VwdGlvbiAoZyAzIDQg em9vOiA1KSkpKQogIChwYXNzLWlmICJkdXBsaWNhdGUta2V5d29yZCIgCiAgICAobm90IChmYWxz ZS1pZi1leGNlcHRpb24gKGcgMyA0IGtleTogNSBrZXk6IDYpKSkpCgogIChwYXNzLWlmICJrZXl3 b3Jkcy1hbmQtcmVzdC0xIiAoZXF1YWw/IChoMSA3KSAnKDcgI2YgKCkpKSkKICAocGFzcy1pZiAi a2V5d29yZHMtYW5kLXJlc3QtMiIgKGVxdWFsPyAoaDEgNyA4IDkgMTApICcoNyAjZiAoOCA5IDEw KSkpKQogIChwYXNzLWlmICJrZXl3b3Jkcy1hbmQtcmVzdC0zIiAoZXF1YWw/IChoMSA3IGtleTog OCA5IDEwKSAnKDcgOCAoOSAxMCkpKSkKICAocGFzcy1pZiAidW5kZWZpbmVkLWtleXdvcmQtMiIg CiAgICAobm90IChmYWxzZS1pZi1leGNlcHRpb24gKGgxIDcga2V5OiA4IHpvbzogOSkpKSkKICAK ICAocGFzcy1pZiAicmVxdWlyZWQtcG9zaXRpb25hbHMtMSIgKGVxdWFsPyAoaDIgNykgJyg3ICNm ICgpKSkpCiAgKHBhc3MtaWYgInJlcXVpcmVkLXBvc2l0aW9uYWxzLTIiIChlcXVhbD8gKGgyIDcg OCA5IDEwKSAnKDcgI2YgKDggOSAxMCkpKSkKICAocGFzcy1pZiAicmVxdWlyZWQtcG9zaXRpb25h bHMtMyIgKGVxdWFsPyAoaDIga2V5OiA4IDkgMTApICcoOSA4ICgxMCkpKSkKICAocGFzcy1pZiAi dW5kZWZpbmVkLWtleXdvcmQtMyIgCiAgICAobm90IChmYWxzZS1pZi1leGNlcHRpb24gKGgyIGtl eTogOCB6b286IDkpICkpKSkKCjs7OyBMb2NhbCBWYXJpYWJsZXM6Cjs7OyBjb2Rpbmc6IGxhdGlu LTEKOzs7IEVuZDoK ------=_Part_13395_29826336.1209785822377--