From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED!not-for-mail From: Amirouche Boubekki Newsgroups: gmane.lisp.guile.user Subject: Re: Is there any security risk related to the use of the reader? Date: Fri, 02 Mar 2018 04:42:38 +0100 Message-ID: <294c0039f2dfa910162ec911ae128a48@hypermove.net> References: <3798469bc8c299451807dfdc796146d7@hypermove.net> <871sh3ic4k.fsf@netris.org> NNTP-Posting-Host: blaine.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=_85f6365e1636e59311c5c864f22b6bb9" X-Trace: blaine.gmane.org 1519962073 3858 195.159.176.226 (2 Mar 2018 03:41:13 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Fri, 2 Mar 2018 03:41:13 +0000 (UTC) User-Agent: Roundcube Webmail/1.1.2 Cc: Guile User To: Mark H Weaver Original-X-From: guile-user-bounces+guile-user=m.gmane.org@gnu.org Fri Mar 02 04:41:09 2018 Return-path: Envelope-to: guile-user@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by blaine.gmane.org with esmtp (Exim 4.84_2) (envelope-from ) id 1erbZE-0000Nj-Jv for guile-user@m.gmane.org; Fri, 02 Mar 2018 04:41:08 +0100 Original-Received: from localhost ([::1]:60465 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1erbbG-0007Xg-US for guile-user@m.gmane.org; Thu, 01 Mar 2018 22:43:14 -0500 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:39102) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1erbam-0007XG-U7 for guile-user@gnu.org; Thu, 01 Mar 2018 22:42:47 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1erbaj-0005B4-4J for guile-user@gnu.org; Thu, 01 Mar 2018 22:42:44 -0500 Original-Received: from relay5-d.mail.gandi.net ([217.70.183.197]:48962) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1erbai-00058g-II for guile-user@gnu.org; Thu, 01 Mar 2018 22:42:41 -0500 Original-Received: from webmail.gandi.net (unknown [10.200.201.5]) (Authenticated sender: amirouche@hypermove.net) by relay5-d.mail.gandi.net (Postfix) with ESMTPA id 6A6AF41C07D; Fri, 2 Mar 2018 04:42:38 +0100 (CET) In-Reply-To: <871sh3ic4k.fsf@netris.org> X-Sender: amirouche@hypermove.net X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 217.70.183.197 X-BeenThere: guile-user@gnu.org X-Mailman-Version: 2.1.21 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" Xref: news.gmane.org gmane.lisp.guile.user:14472 Archived-At: --=_85f6365e1636e59311c5c864f22b6bb9 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8; format=flowed On 2018-03-02 00:56, Mark H Weaver wrote: > > I would not consider Guile's 'read' to be trustworthy when processing > potentially malicious inputs. > > Mark Thanks for the input. FWIW, I've written a procedure 'read' that is AFAIK safe but can _fail_ on malicious input. It can read: - strings, - booleans, - simple numbers like 123456, - rationals like 1/4 and - simple symbols .ie unlike what is generated by 'gensym' I attached to this mail all the files. It based on the stream library I've been working on and a simple parser combinator library based on it. The main issue I see is that combinatorix doesn't take a port as input. I could probably turn a port into a functional stream but right now I don't need it. Patch welcome :) Also I greatly improved error reporting compared to my last attempt at building a parser combinator. Now the library will tell you the failing parser with the argument that were passed to it and the char line and column that triggered the error. For instance, given the following definitions: (define parse-a (parse-xchar #\a)) (define parse-b (parse-xchar #\b)) (define parse-c (parse-xchar #\c)) (define parse-abc (each parse-a parse-b parse-c)) If you run the parser like that: (pk (parse parse-abc "ab©")) You get the following exception: neon/read.scm:75:4: Throw to key `combinatorix' with args `(#< value: parser: # args: #\c>)'. That is parse-xchar #\c that is failing. Things could be improved but its encouraging I think. For info on parser combinators see https://epsil.github.io/gll/ Happy hacking! --=_85f6365e1636e59311c5c864f22b6bb9 Content-Transfer-Encoding: base64 Content-Type: text/plain; name=read.scm Content-Disposition: attachment; filename=read.scm; size=3366 KGRlZmluZS1tb2R1bGUgKG5lb24gcmVhZCkpCgoodXNlLW1vZHVsZXMgKChpY2UtOSBtYXRjaCkp KQoodXNlLW1vZHVsZXMgKChpY2UtOSByZGVsaW0pKSkKKHVzZS1tb2R1bGVzICgobmVvbiBjb21i aW5hdG9yaXgpKSkKCgooZGVmaW5lIGNoYXItc2V0Omxpc3AtZGVsaW1pdGVycwogIChjaGFyLXNl dC11bmlvbiBjaGFyLXNldDp3aGl0ZXNwYWNlCiAgICAgICAgICAgICAgICAgIChjaGFyLXNldCAj XCggI1wpICNcWyAjXF0gI1x7ICNcfSkpKQoKKGRlZmluZSBjaGFyLXNldDpudW1iZXItZGlnaXRz IChjaGFyLXNldCAjXDAgI1wxICNcMiAjXDMgI1w0ICNcNSAjXDYgI1w3ICNcOCAjXDkpKQoKKGRl ZmluZSBjaGFyLXNldDpsaXNwLXN5bWJvbAogIChjaGFyLXNldC1jb21wbGVtZW50IGNoYXItc2V0 Omxpc3AtZGVsaW1pdGVycykpCgooZGVmaW5lICVzcGFjZSAjKHdzKSkKCihkZWZpbmUgKG5vdC1z cGFjZT8gdikKICAobm90IChlcT8gdiAlc3BhY2UpKSkKCihkZWZpbmUgcGFyc2Utd2hpdGVzcGFj ZSAobGlmdCAoY29uc3QgJXNwYWNlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9u ZS1vci1tb3JlIChwYXJzZS1jaGFyLXNldCBjaGFyLXNldDp3aGl0ZXNwYWNlKSkpKQoKKGRlZmlu ZSAoeGNoYXJzLT5zdHJpbmcgeGNoYXJzKQogIChsaXN0LT5zdHJpbmcgKG1hcCB4Y2hhci1jaGFy IHhjaGFycykpKQoKKGRlZmluZSBwYXJzZS1zdHJpbmcgKGxpZnQgKG1hdGNoLWxhbWJkYSAoKGRx MSB4Y2hhcnMgZHEyKSAoeGNoYXJzLT5zdHJpbmcgeGNoYXJzKSkpCiAgICAgICAgICAgICAgICAg ICAgICAgICAgIChlYWNoIChwYXJzZS14Y2hhciAjXCIpCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICh6ZXJvLW9yLW1vcmUgKGVpdGhlciAobGlmdCAobGFtYmRhICh4KSAoY2FkciB4 KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgKGVhY2ggKHBhcnNlLXhjaGFyICNcXCkgKHBhcnNlLXhjaGFyICNcIikpKQogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG90aGVy d2lzZSAocGFyc2UteGNoYXIgI1wiKSBhbnkpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgKHBhcnNlLXhjaGFyICNcIikpKSkKCihkZWZpbmUgcGFyc2UtYm9vbGVhbiAoZWl0aGVy IChsaWZ0IChjb25zdCAjZikgKGVhY2ggKHBhcnNlLXhjaGFyICNcIykgKHBhcnNlLXhjaGFyICNc ZikpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGlmdCAoY29uc3QgI3QpIChlYWNo IChwYXJzZS14Y2hhciAjXCMpIChwYXJzZS14Y2hhciAjXHQpKSkpKQoKKGRlZmluZSBwYXJzZS1z eW1ib2wgKGxpZnQKICAgICAgICAgICAgICAgICAgICAgIChjb21wb3NlIHN0cmluZy0+c3ltYm9s IHhjaGFycy0+c3RyaW5nKQogICAgICAgICAgICAgICAgICAgICAgKG9uZS1vci1tb3JlIChwYXJz ZS1jaGFyLXNldCBjaGFyLXNldDpsaXNwLXN5bWJvbCkpKSkKCgooZGVmaW5lIHBhcnNlLXJhdGlv bmFsIChsaWZ0IChtYXRjaC1sYW1iZGEgKChhIGIgYykgKHN0cmluZy0+bnVtYmVyCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmluZy1hcHBl bmQgKHhjaGFycy0+c3RyaW5nIGEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8iCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHhjaGFycy0+ c3RyaW5nIGMpKSkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlYWNoIChvbmUtb3It bW9yZSAocGFyc2UtY2hhci1zZXQgY2hhci1zZXQ6bnVtYmVyLWRpZ2l0cykpCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgKHBhcnNlLXhjaGFyICNcLykKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAob25lLW9yLW1vcmUgKHBhcnNlLWNoYXItc2V0IGNoYXItc2V0 Om51bWJlci1kaWdpdHMpKSkpKQoKKGRlZmluZSBwYXJzZS1udW1iZXIgKGxpZnQgKGNvbXBvc2Ug c3RyaW5nLT5udW1iZXIgeGNoYXJzLT5zdHJpbmcpCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgKG9uZS1vci1tb3JlIChwYXJzZS1jaGFyLXNldCBjaGFyLXNldDpudW1iZXItZGln aXRzKSkpKQoKKGRlZmluZSBwYXJzZS1vcGVuLXBhcmVuIChsaWZ0IChjb25zdCAjZikgKHBhcnNl LXhjaGFyICNcKCkpKQooZGVmaW5lIHBhcnNlLWNsb3NlLXBhcmVuIChsaWZ0IChjb25zdCAjZikg KHBhcnNlLXhjaGFyICNcKSkpKQoKKGRlZmluZSBwYXJzZS1leHAgKGxpZnQgY2FkcgogICAgICAg ICAgICAgICAgICAgICAgICAoZWFjaCBwYXJzZS1vcGVuLXBhcmVuCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIChsaWZ0IChsYW1iZGEgKHgpIChmaWx0ZXIgbm90LXNwYWNlPyB4KSkKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHplcm8tb3ItbW9yZSAoZWl0aGVyIHBh cnNlLWV4cAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgcGFyc2UtYm9vbGVhbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2UtcmF0aW9uYWwKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlLW51bWJlcgogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFy c2Utc3RyaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBwYXJzZS1zeW1ib2wKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlLXdoaXRlc3BhY2UpKSkKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgcGFyc2UtY2xvc2UtcGFyZW4pKSkKCihkZWZpbmUgZXhwICcocHJv YyAoc3RyaW5nLWFwcGVuZCAiaMOpbGxvIiAid29ybGQiICJ3aXRoIGEgXCIiKSAxMjMgI3QgI2Yg MS80KSkKCjs7IChwayAoZXF1YWw/IChwYXJzZSBwYXJzZS1leHAgKHBrIChjYWxsLXdpdGgtb3V0 cHV0LXN0cmluZyAobGFtYmRhIChwb3J0KSAod3JpdGUgZXhwIHBvcnQpKSkpKSBleHApKQoKKGRl ZmluZS1wdWJsaWMgKHN0cmluZy0+c2NtIHN0cmluZykKICAocGFyc2UgcGFyc2UtZXhwIHN0cmlu ZykpCgooZGVmaW5lLXB1YmxpYyByZWFkIChjb21wb3NlIHN0cmluZy0+c2NtIHJlYWQtc3RyaW5n KSkK --=_85f6365e1636e59311c5c864f22b6bb9 Content-Transfer-Encoding: base64 Content-Type: text/plain; name=streams.scm Content-Disposition: attachment; filename=streams.scm; size=8596 KGRlZmluZS1tb2R1bGUgKG5lb24gc3RyZWFtcykpCgoodXNlLW1vZHVsZXMgKGljZS05IG1hdGNo KSkKKHVzZS1tb2R1bGVzIChzcmZpIHNyZmktMjYpKQoKOzs7IENvbW1lbnRzOgo7Owo7OyAtIDIw MTgvMDIvMjE6IGltcG9ydGVkIGZyb20gZ3VpbGUtd2lyZWR0aWdlciBncmYzIGxpYnJhcnksIGNo YW5nZWQKOzsgdGhlIG5hbWUgdG8gJ3N0cmVhbXMnCjs7Cjs7IC0gMjAxOC8wMi8yNTogcmVwbGFj ZSB0aGUgdXNlIG9mICd0aHJvdycgYW5kICdjb25zJyB3aXRoICd2YWx1ZXMnCjs7IGJlY2F1c2Ug aXQgaXMgZmFzdGVyCjs7CgooZGVmaW5lLXB1YmxpYyAobGlzdC0+c3RyZWFtIGxzdCkKICAobGV0 IGxvb3AgKChsc3QgbHN0KSkKICAgIChsYW1iZGEgKCkKICAgICAgKGlmIChudWxsPyBsc3QpCiAg ICAgICAgICAodmFsdWVzICNmICNmKQogICAgICAgICAgKHZhbHVlcyAoY2FyIGxzdCkgKGxvb3Ag KGNkciBsc3QpKSkpKSkpCgooZGVmaW5lLXB1YmxpYyAoc3RyZWFtLT5saXN0IHN0cmVhbSkKICAo bGV0IGxvb3AgKChzdHJlYW0gc3RyZWFtKQogICAgICAgICAgICAgKG91dCAnKCkpKQogICAgKGNh bGwtd2l0aC12YWx1ZXMgc3RyZWFtCiAgICAgIChsYW1iZGEgKHZhbHVlIG5leHQpCiAgICAgICAg KGlmIG5leHQKICAgICAgICAgICAgKGxvb3AgbmV4dCAoY29ucyB2YWx1ZSBvdXQpKQogICAgICAg ICAgICAocmV2ZXJzZSEgb3V0KSkpKSkpCgooZGVmaW5lLXB1YmxpYyBzdHJlYW0tbnVsbAogIChs YW1iZGEgKCkKICAgICh2YWx1ZXMgI2YgI2YpKSkKCihkZWZpbmUtcHVibGljIChzdHJlYW0tbnVs bD8gc3RyZWFtKQogIChjYWxsLXdpdGgtdmFsdWVzIHN0cmVhbQogICAgKGxhbWJkYSAodmFsdWUg bmV4dCkKICAgICAgKGVxPyBuZXh0ICNmKSkpKQoKKGRlZmluZS1wdWJsaWMgKHN0cmVhbS1jYXIg c3RyZWFtKQogIChjYWxsLXdpdGgtdmFsdWVzIHN0cmVhbQogICAgKGxhbWJkYSAodmFsdWUgbmV4 dCkKICAgICAgdmFsdWUpKSkKCihkZWZpbmUtcHVibGljIChzdHJlYW0tY2RyIHN0cmVhbSkKICAo Y2FsbC13aXRoLXZhbHVlcyBzdHJlYW0KICAgIChsYW1iZGEgKHZhbHVlIG5leHQpCiAgICAgIG5l eHQpKSkKCihkZWZpbmUtcHVibGljIChzdHJlYW0tbWFwIHByb2Mgc3RyZWFtKQogIChsZXQgbG9v cCAoKHN0cmVhbSBzdHJlYW0pKQogICAgKGxhbWJkYSAoKQogICAgICAoY2FsbC13aXRoLXZhbHVl cyBzdHJlYW0KICAgICAgICAobGFtYmRhICh2YWx1ZSBuZXh0KQogICAgICAgICAgKGlmIG5leHQK ICAgICAgICAgICAgICAodmFsdWVzIChwcm9jIHZhbHVlKSAobG9vcCBuZXh0KSkKICAgICAgICAg ICAgICAodmFsdWVzICNmICNmKSkpKSkpKQoKKGRlZmluZS1wdWJsaWMgKHN0cmVhbS1mb3ItZWFj aCBwcm9jIHN0cmVhbSkKICAobGV0IGxvb3AgKChzdHJlYW0gc3RyZWFtKSkKICAgIChjYWxsLXdp dGgtdmFsdWVzIHN0cmVhbQogICAgICAobGFtYmRhICh2YWx1ZSBuZXh0KQogICAgICAgICh3aGVu IG5leHQKICAgICAgICAgIChwcm9jIHZhbHVlKQogICAgICAgICAgKGxvb3AgbmV4dCkpKSkpKQoK KGRlZmluZS1wdWJsaWMgKHN0cmVhbS1maWx0ZXIgcHJlZGljYXRlPyBzdHJlYW0pCiAgKGxldCBs b29wMSAoKHN0cmVhbSBzdHJlYW0pKQogICAgKGxhbWJkYSAoKQogICAgICAobGV0IGxvb3AyICgo c3RyZWFtIHN0cmVhbSkpCiAgICAgICAgKGNhbGwtd2l0aC12YWx1ZXMgc3RyZWFtCiAgICAgICAg ICAobGFtYmRhICh2YWx1ZSBuZXh0KQogICAgICAgICAgICAoaWYgbmV4dAogICAgICAgICAgICAg ICAgKGlmIChwcmVkaWNhdGU/IHZhbHVlKQogICAgICAgICAgICAgICAgICAgICh2YWx1ZXMgdmFs dWUgKGxvb3AxIG5leHQpKQogICAgICAgICAgICAgICAgICAgIChsb29wMiBuZXh0KSkKICAgICAg ICAgICAgICAgICh2YWx1ZXMgI2YgI2YpKSkpKSkpKQoKKGRlZmluZS1wdWJsaWMgKHN0cmVhbS1h cHBlbmQgLiBzdHJlYW1zKQogIChjb25kCiAgICgobnVsbD8gc3RyZWFtcykgKGxhbWJkYSAoKSAo dmFsdWVzICNmICNmKSkpCiAgIDs7IHdhbm5hIGJlIGZhc3QgcGF0aCBmb3IgdGhlIGNvbW1vbiBj YXNlLCBpZiB0aGVyZSBpcyBzaW5nbGUKICAgOzsgc3RyZWFtLCByZXR1cm4gdGhlIGZpcnN0IHN0 cmVhbQogICAoKG51bGw/IChjZHIgc3RyZWFtcykpIChjYXIgc3RyZWFtcykpCiAgIDs7IG90aGVy d2lzZSwgdW5yb2xsIGVhY2ggc3RyZWFtLi4uCiAgIChlbHNlIChsZXQgbG9vcDEgKChzdHJlYW1z IHN0cmVhbXMpKQogICAgICAgICAgIChpZiAobnVsbD8gc3RyZWFtcykKICAgICAgICAgICAgICAg KGxhbWJkYSAoKSAodmFsdWVzICNmICNmKSkKICAgICAgICAgICAgICAgKGxldCBsb29wMiAoKHN0 cmVhbSAoY2FyIHN0cmVhbXMpKSkKICAgICAgICAgICAgICAgICAoY2FsbC13aXRoLXZhbHVlcyBz dHJlYW0KICAgICAgICAgICAgICAgICAgIChsYW1iZGEgKHZhbHVlIG5leHQpCiAgICAgICAgICAg ICAgICAgICAgIChpZiBuZXh0CiAgICAgICAgICAgICAgICAgICAgICAgICAobGFtYmRhICgpICh2 YWx1ZXMgdmFsdWUgKGxvb3AyIG5leHQpKSkKICAgICAgICAgICAgICAgICAgICAgICAgIChsb29w MSAoY2RyIHN0cmVhbXMpKSkpKSkpKSkpKQoKCjs7IChkZWZpbmUtcHVibGljIChzdHJlYW0tdGFr ZSBjb3VudCBzdHJlYW0pCjs7ICAgKGxldCBsb29wICgoc3RyZWFtIHN0cmVhbSkKOzsgICAgICAg ICAgICAgIChjb3VudCBjb3VudCkpCjs7ICAgICAobGFtYmRhICgpCjs7ICAgICAgIChpZiAoZXE/ IGNvdW50IDApCjs7ICAgICAgICAgICAnKCkKOzsgICAgICAgICAgIChtYXRjaCAoc3RyZWFtKQo7 OyAgICAgICAgICAgICAoJygpICcoKSkKOzsgICAgICAgICAgICAgKChpdGVtIC4gbmV4dCkgKGNv bnMgaXRlbSAobG9vcCBuZXh0ICgxLSBjb3VudCkpKSkpKSkpKQoKOzsgKGRlZmluZS1wdWJsaWMg KHN0cmVhbS1kcm9wIGNvdW50IHN0cmVhbSkKOzsgICAobGV0IGxvb3AgKChzdHJlYW0gc3RyZWFt KQo7OyAgICAgICAgICAgICAgKGNvdW50IGNvdW50KSkKOzsgICAgIChsYW1iZGEgKCkKOzsgICAg ICAgKG1hdGNoIChzdHJlYW0pCjs7ICAgICAgICAgKCcoKSAnKCkpCjs7ICAgICAgICAgKChpdGVt IC4gbmV4dCkgKGlmIChlcT8gY291bnQgMCkKOzsgICAgICAgICAgICAgICAgICAgICAgICAgICAg KGNvbnMgaXRlbSAobG9vcCBuZXh0IDApKQo7OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAo KGxvb3AgbmV4dCAoMS0gY291bnQpKSkpKSkpKSkKCgo7OyAoZGVmaW5lLXB1YmxpYyAoc3RyZWFt LXBhZ2luYXRvciBjb3VudCBzdHJlYW0pCjs7ICAgKHRocm93ICdzdHJlYW0gIm5vdCBpbXBsZW1l bnRlZCBlcnJvciIpKQoKKGRlZmluZS1wdWJsaWMgKHN0cmVhbS1sZW5ndGggc3RyZWFtKQogIChs ZXQgbG9vcCAoKHN0cmVhbSBzdHJlYW0pCiAgICAgICAgICAgICAoY291bnQgMCkpCiAgICAoY2Fs bC13aXRoLXZhbHVlcyBzdHJlYW0KICAgICAgKGxhbWJkYSAodmFsdWUgbmV4dCkKICAgICAgICAo aWYgbmV4dAogICAgICAgICAgICAobG9vcCBuZXh0ICgrIDEgY291bnQpKQogICAgICAgICAgICBj b3VudCkpKSkpCgo7OyAoZGVmaW5lLXB1YmxpYyAoc3RyZWFtLXNjYXR0ZXIgc3RyZWFtKQo7OyAg ICJUYWtlIGEgc3RyZWFtIG9mIGxpc3RzIGFuZCByZXR1cm5zIGEgc3RyZWFtIG1hZGUgb2YgYWxs IHRoZQo7OyAgICBlbGVtZW50cyBvZiBhbGwgdGhlIGxpc3RzLiBwYXJlbnRzIGFyZSBpbmhlcml0 ZWQuIgo7OyAgIChsZXQgbG9vcCAoKHN0cmVhbSBzdHJlYW0pCjs7ICAgICAgICAgICAgICAobHN0 ICcoKSkKOzsgICAgICAgICAgICAgIChwYXJlbnRzICcoKSkpCjs7ICAgICAobGFtYmRhICgpCjs7 ICAgICAgIChpZiAobnVsbD8gbHN0KQo7OyAgICAgICAgICAgKG1hdGNoIChzdHJlYW0pCjs7ICAg ICAgICAgICAgICgnKCkgJygpKQo7OyAgICAgICAgICAgICAoKGl0ZW0gLiBuZXh0KQo7OyAgICAg ICAgICAgICAgKGxldCAoKGxzdCAoY2FyIGl0ZW0pKQo7OyAgICAgICAgICAgICAgICAgICAgKHBh cmVudHMgKGNkciBpdGVtKSkpCjs7ICAgICAgICAgICAgICAgIChpZiAobnVsbD8gbHN0KQo7OyAg ICAgICAgICAgICAgICAgICAgKChsb29wIG5leHQgJygpICcoKSkpCjs7ICAgICAgICAgICAgICAg ICAgICAoY29ucyAoY29ucyAoY2FyIGxzdCkgcGFyZW50cykKOzsgICAgICAgICAgICAgICAgICAg ICAgICAgIChsb29wIG5leHQgKGNkciBsc3QpIHBhcmVudHMpKSkpKSkKOzsgICAgICAgICAgIChj b25zIChjb25zIChjYXIgbHN0KSBwYXJlbnRzKQo7OyAgICAgICAgICAgICAgICAgKGxvb3Agc3Ry ZWFtIChjZHIgbHN0KSBwYXJlbnRzKSkpKSkpCgo7OyAoZGVmaW5lLXB1YmxpYyAoc3RyZWFtLXVu aXF1ZSBzdHJlYW0pCjs7ICAgKGxldCAoKHNlZW4gJygpKSkgIDs7IFRPRE86IHJlcGxhY2Ugd2l0 aCBhIGhhc2ggdGFibGUKOzsgICAgIChsZXQgbG9vcDEgKChzdHJlYW0gc3RyZWFtKSkKOzsgICAg ICAgKGxhbWJkYSAoKQo7OyAgICAgICAgIChsZXQgbG9vcDIgKChzdHJlYW0gc3RyZWFtKSkKOzsg ICAgICAgICAgIChtYXRjaCAoc3RyZWFtKQo7OyAgICAgICAgICAgICAoJygpICcoKSkKOzsgICAg ICAgICAgICAgKChpdGVtIC4gbmV4dCkgKGlmIChsaXN0LWluZGV4IChjdXQgZXF1YWw/IDw+IChj YXIgaXRlbSkpIHNlZW4pCjs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9vcDIg bmV4dCkKOzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiZWdpbiAoc2V0ISBzZWVu IChjb25zIChjYXIgaXRlbSkgc2VlbikpCjs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgKGNvbnMgaXRlbSAobG9vcDEgbmV4dCkpKSkpKSkpKSkpCgooZGVmaW5lLXB1Ymxp YyAoc3RyZWFtLWdyb3VwIHByZWRpY2F0ZT8gcHJvYyBzdHJlYW0pCiAgIlJldHVybiBhIG5ldyBz dHJlYW0gb2Ygc3RyZWFtIHZhbHVlcyBmcm9tIFNUUkVBTS4gU1RSRUFNIG11c3QgYmUgc29ydGVk LgpWYWx1ZXMgZnJvbSBTVFJFQU0gYXJlIGdyb3VwZWQgYWNjb3JkaW5nIHRvIFBST0MuIFRoZSB2 YWx1ZSByZXR1cm5lZCBieQpQUk9DIG11c3QgYmUgY29tcGFyYWJsZSB3aXRoIFBSRURJQ0FURT8u IgogIChkZWZpbmUgKCVzdHJlYW0tbmV4dCBzdHJlYW0ga2V5KQogICAgOzsgVE9ETzogbWF5YmUg bWVtb2l6ZSB0aGF0IHByb2NlZHVyZSwgYmVjYXVzZSBpZiB0aGUgdW5kZXJseWluZwogICAgOzsg c3RyZWFtIGlzIGEgY3Vyc29yIHN0cmVhbSAoc2VlIGN1cnNvci0+c3RyZWFtKSBpdCBsZWFkcyB0 bwogICAgOzsgbXVsdGlwbGUgY3Vyc29yLWtleS1zZXQgKyBjdXJzb3Itc2VhcmNoIHdoaWNoIGNh biBiZSBleHBlbnNpdmUuCgogICAgOzsgWFhYOiBUaGlzIG9ubHkgY2FsbGVkIGluIHRoZSBjYXNl IHdoZXJlIHRoZSBwcmV2aW91cyBzdHJlYW0gd2FzCiAgICA7OyBub3QgZnVsbHkgY29uc3VtZWQg aWUuIG5leHQtZ3JvdXAtY2FsbGJhY2sgaXMgcmVwbGFjZWQgaW4gbW9zdAogICAgOzsgY2FzZXMg YnkgYSBsYW1iZGEgcmV0dXJuaW5nIGEgdmFsdWUgd2l0aG91dCBjb21wdXRhdGlvbiwgc2VlCiAg ICA7OyAlc3RyZWFtLWdyb3VwIHByb2NlZHVyZS4KICAgIChsZXQgbG9vcCAoKHN0cmVhbSBzdHJl YW0pKQogICAgICAoY2FsbC13aXRoLXZhbHVlcyBzdHJlYW0KICAgICAgICAobGFtYmRhICh2YWx1 ZSBuZXh0KQogICAgICAgICAgKGlmIG5leHQKICAgICAgICAgICAgICAoaWYgKHByZWRpY2F0ZT8g KHByb2MgdmFsdWUpIGtleSkKICAgICAgICAgICAgICAgICAgKGxvb3AgbmV4dCkKICAgICAgICAg ICAgICAgICAgKGxhbWJkYSAoKSAodmFsdWVzIHZhbHVlIG5leHQpKSkgOzsgbmV4dC1ncm91cAog ICAgICAgICAgICAgIChsYW1iZGEgKCkgKHZhbHVlcyAjZiAjZikpKSkpKSkgOzsgZW5kIG9mIHN0 cmVhbQoKICAoZGVmaW5lICglc3RyZWFtLWdyb3VwIHN0cmVhbSBrZXkpCiAgICA7OyB3b3JzdCBj YXNlIHNjZW5hcmlvLCBzdHJlYW0gd2FzIG5vdCBjb25zdW1lZCwgYnV0IHRoZSB1c2VyCiAgICA7 OyByZXF1ZXN0IHRoZSBuZXh0IGdyb3VwCgogICAgOzsgVE9ETzogdXNlIG1ha2UtcGFyYW1hdGVy IGluc3RlYWQgb2Ygc2V0IQogICAgKGxldCAoKG5leHQtZ3JvdXAtY2FsbGJhY2sgKGxhbWJkYSAo KSAoJXN0cmVhbS1uZXh0IHN0cmVhbSBrZXkpKSkpCiAgICAgICh2YWx1ZXMgKGxldCBsb29wICgo c3RyZWFtIHN0cmVhbSkpCiAgICAgICAgICAgICAgICAobGFtYmRhICgpCiAgICAgICAgICAgICAg ICAgIChjYWxsLXdpdGgtdmFsdWVzIHN0cmVhbQogICAgICAgICAgICAgICAgICAgIChsYW1iZGEg KHZhbHVlIG5leHQpCiAgICAgICAgICAgICAgICAgICAgICAoaWYgbmV4dAogICAgICAgICAgICAg ICAgICAgICAgICAgIChpZiAocHJlZGljYXRlPyAocHJvYyB2YWx1ZSkga2V5KQogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICA7OyBzYXZlIGFkdmFuY2Ugc3RyZWFtCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIChiZWdpbiAoc2V0ISBuZXh0LWdyb3VwLWNhbGxiYWNrIChsYW1iZGEg KCkgKCVzdHJlYW0tbmV4dCBuZXh0IGtleSkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgKHZhbHVlcyB2YWx1ZSAobG9vcCBuZXh0KSkpCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIChhbmQgKHNldCEgbmV4dC1ncm91cC1jYWxsYmFjayAobGFtYmRhICgpIHN0cmVh bSkpIDs7IG5leHQgZ3JvdXAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmFs dWVzICNmICNmKSkpIDs7IGVuZCBvZiBncm91cCBzdHJlYW0KICAgICAgICAgICAgICAgICAgICAg ICAgICAoYW5kIChzZXQhIG5leHQtZ3JvdXAtY2FsbGJhY2sgKGxhbWJkYSAoKSAobGFtYmRhICgp ICh2YWx1ZXMgI2YgI2YpKSkpIDs7IGVuZCBvZiBzdHJlYW0KICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICh2YWx1ZXMgI2YgI2YpKSkpKSkpIDs7IGVuZCBvZiBncm91cAogICAgICAgICAg ICAgIChsYW1iZGEgKCkgKG5leHQtZ3JvdXAtY2FsbGJhY2spKSkpKQoKCgogIChsZXQgbG9vcCAo KHN0cmVhbSAobGFtYmRhICgpIHN0cmVhbSkpKQogICAgKGxhbWJkYSAoKQogICAgICA7OyB0aGUg d2hvbGUgdGhpbmcgbXVzdCBhcHBlYXIgcHVyZSwgYnV0IGRlcGVuZGluZyBvbiB3aGV0aGVyIGEK ICAgICAgOzsgZ3JvdXAgaXMgY29uc3VtZWQsIHRoZSBuZXh0IHN0cmVhbSBjb2RlIHBhdGggY2hh bmdlcy4gVGhhdCdzCiAgICAgIDs7IHdoeSwgdGhlIGxvb3AncyBTVFJFQU0gaXMgd3JhcHBlZCBp biBsYW1iZGEgYXMgYSB0aHVuaywgdG8KICAgICAgOzsgYWxsb3cgJ25leHQtZ3JvdXAtc3RyZWFt JyBjYWxsYmFjayByZXR1cm5lZCBieSAlc3RyZWFtLWdyb3VwLAogICAgICA7OyB0byByZXR1cm4g dGhlIGNvcnJlY3QvY3VycmVudCBuZXh0LWdyb3VwLWNhbGxiYWNrIGRlcGVuZGluZwogICAgICA7 OyBvbiB3aGV0aGVyIHRoZSBuZXh0IGdyb3VwIHN0cmVhbSB3YXMgY29tcHV0ZWQgb3Igbm90IGFu ZAogICAgICA7OyBjb21wdXRlIGl0IGlmIGl0IHdhc24ndCBjb21wdXRlZC4gVEJIIEkgYW0gbm90 IHN1cmUgdGhpcyBpcwogICAgICA7OyB0aGUgcmlnaHQgbGV2ZWwgb2YgbGFtYmRhIG5lc3Rpbmcu IEl0IHNlZW1zIGxpa2UgdGhlcmUgaXMgdG9vCiAgICAgIDs7IG11Y2ggY2FsbGJhY2suCiAgICAg IChjYWxsLXdpdGgtdmFsdWVzIChzdHJlYW0pCiAgICAgICAgKGxhbWJkYSAodmFsdWUgbmV4dCkK ICAgICAgICAgIChpZiBuZXh0CiAgICAgICAgICAgICAgKGNhbGwtd2l0aC12YWx1ZXMgKGxhbWJk YSAoKSAoJXN0cmVhbS1ncm91cCAoc3RyZWFtKSAocHJvYyB2YWx1ZSkpKQogICAgICAgICAgICAg ICAgKGxhbWJkYSAoZ3JvdXAgbmV4dC1ncm91cC1zdHJlYW0pCiAgICAgICAgICAgICAgICAgICh2 YWx1ZXMgZ3JvdXAgKGxvb3AgbmV4dC1ncm91cC1zdHJlYW0pKSkpCiAgICAgICAgICAgICAgKHZh bHVlcyAjZiAjZikpKSkpKSkKCgo7OyAoZGVmaW5lIChoYXNoLWluY3JlbWVudCBodCBrZXkpCjs7 ICAgKGxldCAoKHZhbHVlIChoYXNoLXJlZiBodCBrZXkpKSkKOzsgICAgIChpZiAobm90IHZhbHVl KQo7OyAgICAgICAgIChoYXNoLXNldCEgaHQga2V5IDEpCjs7ICAgICAgICAgKGhhc2gtc2V0ISBo dCBrZXkgKDErIHZhbHVlKSkpKSkKCjs7IChkZWZpbmUtcHVibGljIChzdHJlYW0tZ3JvdXAtY291 bnQgc3RyZWFtKQo7OyAgIChsZXQgKChncm91cHMgKG1ha2UtaGFzaC10YWJsZSkpKQo7OyAgICAg KGxldCBsb29wICgoc3RyZWFtIHN0cmVhbSkpCjs7ICAgICAgIChtYXRjaCAoc3RyZWFtKQo7OyAg ICAgICAgICgnKCkgKHNvcnQgKGhhc2gtbWFwLT5saXN0IGNvbnMgZ3JvdXBzKSAobGFtYmRhIChh IGIpICg+IChjZHIgYSkgKGNkciBiKSkpKSkKOzsgICAgICAgICAoKGl0ZW0gLiBuZXh0KQo7OyAg ICAgICAgICAoaGFzaC1pbmNyZW1lbnQgZ3JvdXBzIChjYXIgaXRlbSkpCjs7ICAgICAgICAgIChs b29wIG5leHQpKSkpKSkKCihkZWZpbmUtcHVibGljIChzdHJlYW0tc29ydCBzdHJlYW0gbGVzcz8p CiAgKGxpc3QtPnN0cmVhbSAoc29ydCEgKHN0cmVhbS0+bGlzdCBzdHJlYW0pIGxlc3M/KSkpIDs7 IFRPRE86IGltcHJvdmUgcHJlZm9ybWFuY2Ugd2l0aCBhIGJpbmFyeSB0cmVlCg== --=_85f6365e1636e59311c5c864f22b6bb9 Content-Transfer-Encoding: base64 Content-Type: text/plain; name=combinatorix.scm Content-Disposition: attachment; filename=combinatorix.scm; size=8705 Ozs7IGNvbWJpbmF0b3JpeAo7OzsKOzs7IENvcHlyaWdodCDCqSAyMDE4IEFtaXJvdWNoZSBCb3Vi ZWtraSA8YW1pcm91Y2hlQGh5cGVybW92ZS5uZXQ+Cjs7Owo7OzsgVGhpcyBtb2R1bGUgaXMgZnJl ZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCjs7OyBtb2RpZnkgaXQg dW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UK Ozs7IGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIg dmVyc2lvbiAzIG9mCjs7OyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0 ZXIgdmVyc2lvbi4KOzs7Cjs7OyBUaGlzIG1vZHVsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9w ZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKOzs7IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3 aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKOzs7IE1FUkNIQU5UQUJJTElUWSBv ciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCjs7OyBMZXNz ZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgo7OzsKOzs7IFlvdSBz aG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJs aWMKOzs7IExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIG1vZHVsZS4gIElmIG5vdCwgc2VlCjs7OyA8 aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCgo7OzsgQ29tbWVudGFyeToKOzsKOzsgUGFy c2VyIGNvbWJpbmF0b3JzLgo7Owo7OyBUT0RPOgo7Owo7OyAgLSBpbXByb3ZlIGVycm9yIGhhbmRs aW5nCjs7Cjs7IEFsc28gc2VlOgo7Owo7OyAtIGh0dHBzOi8vZXBzaWwuZ2l0aHViLmlvL2dsbC8K OzsgLSBodHRwczovL2RvY3MucmFja2V0LWxhbmcub3JnL3BhcnNhY2svaW5kZXguaHRtbAo7OyAt IGh0dHBzOi8vZG9jcy5yYWNrZXQtbGFuZy5vcmcvbWVnYXBhcnNhY2svCjs7IC0gaHR0cHM6Ly9n aXQuZHRob21wc29uLnVzL2d1aWxlLXBhcnNlci1jb21iaW5hdG9ycy5naXQKOzsgLSBodHRwczov L2dpdGxhYi5jb20vdGFtcGUvc3Rpcy1wYXJzZXIKOzsKOzs7IENvZGU6CihkZWZpbmUtbW9kdWxl IChuZW9uIGNvbWJpbmF0b3JpeCkpCgoodXNlLW1vZHVsZXMgKChzcmZpIHNyZmktOSkpKQoodXNl LW1vZHVsZXMgKChzcmZpIHNyZmktOSBnbnUpKSkKKHVzZS1tb2R1bGVzICgoaWNlLTkgbWF0Y2gp KSkKCih1c2UtbW9kdWxlcyAoKG5lb24gc3RyZWFtcykpKQoKCjs7IHRlc3QgbWFjcm8KKGRlZmlu ZS1zeW50YXgtcnVsZSAodGVzdC1jaGVjayB0ZXN0LW5hbWUgZXhwciBleHBlY3RlZCkKICAod2hl biAoZ2V0ZW52ICJERUJVRyIpCiAgICAoZm9ybWF0ICN0ICIqIH5hOiAiIHRlc3QtbmFtZSkKICAg IChsZXQgKChleHByKiBleHByKQogICAgICAgICAgKGV4cGVjdGVkKiBleHBlY3RlZCkpCiAgICAg IChpZiAoZXF1YWw/IGV4cHIqIGV4cGVjdGVkKikKICAgICAgICAgIChmb3JtYXQgI3QgIlBBU1Mg OilcbiIpCiAgICAgICAgICAoYmVnaW4KICAgICAgICAgICAgKGZvcm1hdCAjdCAiRkFJTEVEIDoo XG4iKQogICAgICAgICAgICAoZm9ybWF0ICN0ICIqKiBleHBlY3RlZDogfnNcbiIgZXhwZWN0ZWQq KQogICAgICAgICAgICAoZm9ybWF0ICN0ICIqKiBmb3VuZDogfnNcbiIgZXhwciopKSkpKSkKCihk ZWZpbmUtcmVjb3JkLXR5cGUgPHJlc3VsdD4KICAobWFrZS1yZXN1bHQgdmFsdWUgc3RyZWFtKQog IHJlc3VsdD8KICAodmFsdWUgcmVzdWx0LXZhbHVlKQogIChzdHJlYW0gcmVzdWx0LXN0cmVhbSkp CgooZGVmaW5lLXJlY29yZC10eXBlIDxlcnJvcj4KICAobWFrZS1lcnJvciB2YWx1ZSBwYXJzZXIg YXJncykKICBlcnJvcj8KICAodmFsdWUgZXJyb3ItdmFsdWUpCiAgKHBhcnNlciBlcnJvci1wYXJz ZXIpCiAgKGFyZ3MgZXJyb3ItYXJncykpCgooZGVmaW5lIGNvbnRpbnVlIG1ha2UtcmVzdWx0KQoo ZGVmaW5lIChmYWlsIHN0cmVhbSBwYXJzZXIgYXJncykKICAobWFrZS1lcnJvciAoc3RyZWFtLWNh ciBzdHJlYW0pIHBhcnNlciBhcmdzKSkKCihkZWZpbmUtcmVjb3JkLXR5cGUgPHhjaGFyPgogICht YWtlLXhjaGFyIGNoYXIgbGluZSBjb2x1bW4gb2Zmc2V0KQogIHhjaGFyPwogIChjaGFyIHhjaGFy LWNoYXIpCiAgKGxpbmUgeGNoYXItbGluZSkKICAoY29sdW1uIHhjaGFyLWNvbHVtbikKICAob2Zm c2V0IHhjaGFyLW9mZnNldCkpCgooZGVmaW5lLXB1YmxpYyAobGlmdCBwcm9jIHBhcnNlcikKICAi QXBwbHkgUFJPQyB0byB0aGUgcmVzdWx0IG9mIFBBUlNFUiIKICAobGFtYmRhIChzdHJlYW0pCiAg ICAobWF0Y2ggKHBhcnNlciBzdHJlYW0pCiAgICAgICgoJCA8cmVzdWx0PiB2YWx1ZSBzdHJlYW0p IChjb250aW51ZSAocHJvYyB2YWx1ZSkgc3RyZWFtKSkKICAgICAgKGVsc2UgZWxzZSkpKSkKCihl eHBvcnQgeGNoYXItY2hhcikKCihkZWZpbmUgKHhjaGFyLWZvcm1hdCB4Y2hhciBwb3J0KQogIChm b3JtYXQgcG9ydCAiPHhjaGFyIH5zIFt+YSx+YV0gQCB+YT4iCiAgICAgICAgICAoeGNoYXItY2hh ciB4Y2hhcikKICAgICAgICAgICh4Y2hhci1saW5lIHhjaGFyKQogICAgICAgICAgKHhjaGFyLWNv bHVtbiB4Y2hhcikKICAgICAgICAgICh4Y2hhci1vZmZzZXQgeGNoYXIpKSkKCihzZXQtcmVjb3Jk LXR5cGUtcHJpbnRlciEgPHhjaGFyPiB4Y2hhci1mb3JtYXQpCgooZGVmaW5lIChzdHJpbmctPnhj aGFyLXN0cmVhbSBzdHJpbmcpCiAgOzsgVE9ETzogb3B0aW1pemUKICAobGV0IGxvb3AgKChjaGFy cyAoc3RyaW5nLT5saXN0IHN0cmluZykpCiAgICAgICAgICAgICAobGluZSAxKQogICAgICAgICAg ICAgKGNvbHVtbiAxKQogICAgICAgICAgICAgKG9mZnNldCAwKQogICAgICAgICAgICAgKG91dCAn KCkpKQogICAgKGlmIChudWxsPyBjaGFycykKICAgICAgICAobGlzdC0+c3RyZWFtIChyZXZlcnNl ISBvdXQpKQogICAgICAgIChpZiAoZXE/IChjYXIgY2hhcnMpICNcbmV3bGluZSkKICAgICAgICAg ICAgKGxvb3AgKGNkciBjaGFycykKICAgICAgICAgICAgICAgICAgKCsgMSBsaW5lKQogICAgICAg ICAgICAgICAgICAxCiAgICAgICAgICAgICAgICAgICgrIDEgb2Zmc2V0KQogICAgICAgICAgICAg ICAgICAoY29ucyAobWFrZS14Y2hhciAjXG5ld2xpbmUgbGluZSBjb2x1bW4gb2Zmc2V0KSBvdXQp KQogICAgICAgICAgICAobG9vcCAoY2RyIGNoYXJzKQogICAgICAgICAgICAgICAgICBsaW5lCiAg ICAgICAgICAgICAgICAgICgrIDEgY29sdW1uKQogICAgICAgICAgICAgICAgICAoKyAxIG9mZnNl dCkKICAgICAgICAgICAgICAgICAgKGNvbnMgKG1ha2UteGNoYXIgKGNhciBjaGFycykgbGluZSBj b2x1bW4gb2Zmc2V0KSBvdXQpKSkpKSkKCihkZWZpbmUtcHVibGljIChwYXJzZSBwYXJzZXIgc3Ry aW5nKQogIChtYXRjaCAocGFyc2VyIChzdHJpbmctPnhjaGFyLXN0cmVhbSBzdHJpbmcpKQogICAg KCgkIDxyZXN1bHQ+IHZhbHVlICg/IHN0cmVhbS1udWxsPyBzdHJlYW0pKSB2YWx1ZSkKICAgIChl bHNlICh0aHJvdyAnY29tYmluYXRvcml4IGVsc2UpKSkpCgooZGVmaW5lLXB1YmxpYyAocGFyc2Ut eGNoYXIgY2hhcikKICAobGFtYmRhIChzdHJlYW0pCiAgICAoY2FsbC13aXRoLXZhbHVlcyBzdHJl YW0KICAgICAgKGxhbWJkYSAodmFsdWUgbmV4dCkKICAgICAgICAoaWYgbmV4dAogICAgICAgICAg ICAoaWYgKGNoYXI9PyAoeGNoYXItY2hhciB2YWx1ZSkgY2hhcikKICAgICAgICAgICAgICAgIChj b250aW51ZSB2YWx1ZSBuZXh0KQogICAgICAgICAgICAgICAgKGZhaWwgc3RyZWFtIHBhcnNlLXhj aGFyIGNoYXIpKQogICAgICAgICAgICAoZmFpbCBzdHJlYW0gcGFyc2UteGNoYXIgY2hhcikpKSkp KQoKKHRlc3QtY2hlY2sgInBhcnNlLXhjaGFyIgogICh4Y2hhci1jaGFyIChwYXJzZSAocGFyc2Ut eGNoYXIgI1xjKSAiYyIpKQogICNcYykKCihkZWZpbmUgKGVpdGhlcjIgb25lIHR3bykKICAobGFt YmRhIChzdHJlYW0pCiAgICAobGV0ICgocmVzdWx0IChvbmUgc3RyZWFtKSkpCiAgICAgIChpZiAo cmVzdWx0PyByZXN1bHQpCiAgICAgICAgICByZXN1bHQKICAgICAgICAgICh0d28gc3RyZWFtKSkp KSkKCih0ZXN0LWNoZWNrICJlaXRoZXIyIGF6IDEiCiAgKHhjaGFyLWNoYXIgKHBhcnNlIChlaXRo ZXIyIChwYXJzZS14Y2hhciAjXGEpIChwYXJzZS14Y2hhciAjXHopKSAiYSIpKQogICNcYSkKCih0 ZXN0LWNoZWNrICJlaXRoZXIyIGF6IDIiCiAgKHhjaGFyLWNoYXIgKHBhcnNlIChlaXRoZXIyIChw YXJzZS14Y2hhciAjXGEpIChwYXJzZS14Y2hhciAjXHopKSAieiIpKQogICNceikKCihkZWZpbmUg KGVhY2gyIG9uZSB0d28pCiAgKGxhbWJkYSAoc3RyZWFtKQogICAgKG1hdGNoIChvbmUgc3RyZWFt KQogICAgICAoKCQgPHJlc3VsdD4gYSBuZXh0MCkKICAgICAgIChtYXRjaCAodHdvIG5leHQwKQog ICAgICAgICAoKCQgPHJlc3VsdD4gYiBuZXh0MSkKICAgICAgICAgIChjb250aW51ZSAoY29ucyBh IGIpIG5leHQxKSkKICAgICAgICAgKGVsc2UgZWxzZSkpKQogICAgICAoZWxzZSBlbHNlKSkpKQoK KHRlc3QtY2hlY2sgImVhY2gyIGF6IgogICgobWF0Y2gtbGFtYmRhICgoYSAuIGIpIChjb25zICh4 Y2hhci1jaGFyIGEpICh4Y2hhci1jaGFyIGIpKSkpCiAgIChwYXJzZSAoZWFjaDIgKHBhcnNlLXhj aGFyICNcYSkgKHBhcnNlLXhjaGFyICNceikpICJheiIpKQogIChjb25zICNcYSAjXHopKQoKKHRl c3QtY2hlY2sgImVhY2gyK2VpdGhlcjIgYWUiCiAgKChtYXRjaC1sYW1iZGEgKChhIC4gYikgKGNv bnMgKHhjaGFyLWNoYXIgYSkgKHhjaGFyLWNoYXIgYikpKSkKICAgKHBhcnNlIChlYWNoMiAoZWl0 aGVyMiAocGFyc2UteGNoYXIgI1xhKSAocGFyc2UteGNoYXIgI1x6KSkKICAgICAgICAgICAgICAg IChwYXJzZS14Y2hhciAjXGUpKQogICAgICAgICAgImFlIikpCiAgKGNvbnMgI1xhICNcZSkpCgoo dGVzdC1jaGVjayAiZWFjaDIrZWl0aGVyMiB6ZSIKICAoKG1hdGNoLWxhbWJkYSAoKGEgLiBiKSAo Y29ucyAoeGNoYXItY2hhciBhKSAoeGNoYXItY2hhciBiKSkpKQogICAocGFyc2UgKGVhY2gyIChl aXRoZXIyIChwYXJzZS14Y2hhciAjXGEpIChwYXJzZS14Y2hhciAjXHopKQogICAgICAgICAgICAg ICAgKHBhcnNlLXhjaGFyICNcZSkpCiAgICAgICAgICAiemUiKSkKICAoY29ucyAjXHogI1xlKSkK CihkZWZpbmUgKCVlaXRoZXIgLiBwYXJzZXJzKQogIChsYW1iZGEgKHN0cmVhbSkKICAgIChsZXQg bG9vcCAoKHBhcnNlcnMgcGFyc2VycykpCiAgICAgIChpZiAobnVsbD8gcGFyc2VycykKICAgICAg ICAgIChmYWlsIHN0cmVhbSAlZWl0aGVyIChtYXAgKGxhbWJkYSAoeCkgKHgpKSBwYXJzZXJzKSkK ICAgICAgICAgIChsZXQgKChjb250aW51ZSAoKChjYXIgcGFyc2VycykpIHN0cmVhbSkpKQogICAg ICAgICAgICAoaWYgKHJlc3VsdD8gY29udGludWUpCiAgICAgICAgICAgICAgICBjb250aW51ZQog ICAgICAgICAgICAgICAgKGxvb3AgKGNkciBwYXJzZXJzKSkpKSkpKSkKCihkZWZpbmUtc3ludGF4 LXJ1bGUgKGVpdGhlciBwYXJzZXIgLi4uKQogICglZWl0aGVyIChsYW1iZGEgKCkgcGFyc2VyKSAu Li4pKQoKKGV4cG9ydCBlaXRoZXIpCgoodGVzdC1jaGVjayAiZWl0aGVyIGFiYyAxIgogICh4Y2hh ci1jaGFyIChwYXJzZSAoZWl0aGVyIChwYXJzZS14Y2hhciAjXGEpIChwYXJzZS14Y2hhciAjXGIp IChwYXJzZS14Y2hhciAjXGMpKQogICAgICAgICAgICAgICAgICAgICAiYSIpKQogICNcYSkKCih0 ZXN0LWNoZWNrICJlaXRoZXIgYWJjIDIiCiAgKHhjaGFyLWNoYXIgKHBhcnNlIChlaXRoZXIgKHBh cnNlLXhjaGFyICNcYSkgKHBhcnNlLXhjaGFyICNcYikgKHBhcnNlLXhjaGFyICNcYykpCiAgICAg ICAgICAgICAgICAgICAgICJiIikpCiAgI1xiKQoKKHRlc3QtY2hlY2sgImVpdGhlciBhYmMgMyIK ICAoeGNoYXItY2hhciAocGFyc2UgKGVpdGhlciAocGFyc2UteGNoYXIgI1xhKSAocGFyc2UteGNo YXIgI1xiKSAocGFyc2UteGNoYXIgI1xjKSkKICAgICAgICAgICAgICAgICAgICAgImMiKSkKICAj XGMpCgooZGVmaW5lICglZWFjaCAuIHBhcnNlcnMpCiAgKGxhbWJkYSAoc3RyZWFtKQogICAgKGxl dCBsb29wICgocGFyc2VycyBwYXJzZXJzKQogICAgICAgICAgICAgICAoc3RyZWFtIHN0cmVhbSkK ICAgICAgICAgICAgICAgKG91dCAnKCkpKQogICAgICAoaWYgKG51bGw/IHBhcnNlcnMpCiAgICAg ICAgICAoY29udGludWUgKHJldmVyc2UhIG91dCkgc3RyZWFtKQogICAgICAgICAgKG1hdGNoICgo KGNhciBwYXJzZXJzKSkgc3RyZWFtKQogICAgICAgICAgICAoKCQgPHJlc3VsdD4gdmFsdWUgc3Ry ZWFtKSAobG9vcCAoY2RyIHBhcnNlcnMpIHN0cmVhbSAoY29ucyB2YWx1ZSBvdXQpKSkKICAgICAg ICAgICAgKGVsc2UgZWxzZSkpKSkpKQoKKGRlZmluZS1zeW50YXgtcnVsZSAoZWFjaCBwYXJzZXIg Li4uKQogICglZWFjaCAobGFtYmRhICgpIHBhcnNlcikgLi4uKSkKCihleHBvcnQgZWFjaCkKCih0 ZXN0LWNoZWNrICJlYWNoIGFiYyIKICAobGlzdC0+c3RyaW5nIChtYXAgeGNoYXItY2hhciAocGFy c2UgKGVhY2ggKHBhcnNlLXhjaGFyICNcYSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgKHBhcnNlLXhjaGFyICNcYikKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgKHBhcnNlLXhjaGFyICNcYykKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhcnNlLXhjaGFyICNcZCkpCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhYmNkIikpKQogICJhYmNkIikKCihkZWZpbmUt cHVibGljICh6ZXJvLW9yLW1vcmUgcGFyc2VyKQogIChsYW1iZGEgKHN0cmVhbSkKICAgIChsZXQg bG9vcCAoKHN0cmVhbSBzdHJlYW0pCiAgICAgICAgICAgICAgIChvdXQgJygpKSkKICAgICAgKG1h dGNoIChwYXJzZXIgc3RyZWFtKQogICAgICAgICgoJCA8cmVzdWx0PiB2YWx1ZSBuZXh0KQogICAg ICAgICAobG9vcCBuZXh0IChjb25zIHZhbHVlIG91dCkpKQogICAgICAgIChlbHNlIChjb250aW51 ZSAocmV2ZXJzZSEgb3V0KSBzdHJlYW0pKSkpKSkKCih0ZXN0LWNoZWNrICJ6ZXJvIG9yIG1vcmUg MSIKICAobGlzdC0+c3RyaW5nIChtYXAgeGNoYXItY2hhciAocGFyc2UgKHplcm8tb3ItbW9yZSAo cGFyc2UteGNoYXIgI1xhKSkgImFhYSIpKSkKICAiYWFhIikKCih0ZXN0LWNoZWNrICJ6ZXJvIG9y IG1vcmUgMiIKICAobGlzdC0+c3RyaW5nIChtYXAgeGNoYXItY2hhciAocGFyc2UgKHplcm8tb3It bW9yZSAocGFyc2UteGNoYXIgI1xhKSkgIiIpKSkKICAiIikKCihkZWZpbmUtcHVibGljIChvbmUt b3ItbW9yZSBwYXJzZXIpCiAgKGxpZnQgKGxhbWJkYSAoeCkgKGFwcGx5IGNvbnMgeCkpIChlYWNo IHBhcnNlciAoemVyby1vci1tb3JlIHBhcnNlcikpKSkKCih0ZXN0LWNoZWNrICJvbmUgb3IgbW9y ZSIKICAobGlzdC0+c3RyaW5nIChtYXAgeGNoYXItY2hhciAocGFyc2UgKG9uZS1vci1tb3JlIChw YXJzZS14Y2hhciAjXGEpKSAiYWFhIikpKQogICJhYWEiKQoKKGRlZmluZS1wdWJsaWMgKG90aGVy d2lzZSBwcmVkaWNhdGUgcGFyc2VyKQogIChsYW1iZGEgKHN0cmVhbSkKICAgIChpZiAoZXJyb3I/ IChwcmVkaWNhdGUgc3RyZWFtKSkKICAgICAgICAocGFyc2VyIHN0cmVhbSkKICAgICAgICAoZmFp bCBzdHJlYW0gcHJlZGljYXRlIHBhcnNlcikpKSkKCih0ZXN0LWNoZWNrICJyZWN1cnNpdmUgbGlm dC4uLiIKICAgIChsZXRyZWMgKChyZWN1cnNpdmUgKGxpZnQgKGxhbWJkYSAoYSkgKGlmIChwYWly PyBhKSBhIChsaXN0IGEpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVpdGhlcgog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxpZnQgKGxhbWJkYSAoYSkgKGFwcGx5IGNv bnMqIGEpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVhY2ggKHBhcnNl LXhjaGFyICNcYSkgKHBhcnNlLXhjaGFyICNcYikgKHBhcnNlLXhjaGFyICNcYykgcmVjdXJzaXZl KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYXJzZS14Y2hhciAjXHgpKSkpKQog ICAgICAobGlzdC0+c3RyaW5nIChtYXAgeGNoYXItY2hhciAocGFyc2UgcmVjdXJzaXZlICJhYmNh YmN4IikpKSkKICAiYWJjYWJjeCIpCgooZGVmaW5lLXB1YmxpYyAocGFyc2UtY2hhci1zZXQgY2hh ci1zZXQpCiAgKGxhbWJkYSAoc3RyZWFtKQogICAgKGNhbGwtd2l0aC12YWx1ZXMgc3RyZWFtCiAg ICAgIChsYW1iZGEgKHZhbHVlIG5leHQpCiAgICAgICAgKGlmIG5leHQKICAgICAgICAgICAgKGlm IChjaGFyLXNldC1jb250YWlucz8gY2hhci1zZXQgKHhjaGFyLWNoYXIgdmFsdWUpKQogICAgICAg ICAgICAgICAgKGNvbnRpbnVlIHZhbHVlIG5leHQpCiAgICAgICAgICAgICAgICAoZmFpbCBzdHJl YW0gcGFyc2UtY2hhci1zZXQgY2hhci1zZXQpKQogICAgICAgICAgICAoZmFpbCBzdHJlYW0gcGFy c2UtY2hhci1zZXQgY2hhci1zZXQpKSkpKSkKCihkZWZpbmUtcHVibGljIGFueQogIChsYW1iZGEg KHN0cmVhbSkKICAgIChjYWxsLXdpdGgtdmFsdWVzIHN0cmVhbQogICAgICAobGFtYmRhICh2YWx1 ZSBuZXh0KQogICAgICAgIChpZiBuZXh0CiAgICAgICAgICAgIChjb250aW51ZSB2YWx1ZSBuZXh0 KQogICAgICAgICAgICAoZmFpbCBzdHJlYW0gYW55ICcoKSkpKSkpKQo= --=_85f6365e1636e59311c5c864f22b6bb9--