------_=_NextPart_001_01C5C985.8409652E Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable =20=20 This was an interesting one. I started out trying to do a fairly word-for-word translation to ruby, and then started on a loose translation after I hit the defmacro stuff.=20 Then I thought, screw that. Why not parse LISP? I think ended up getting a much better understanding of all the bits that the casting SPELS article glossed over.=20 Herein, an extremely inelegant, and potentially severely broken lisp processor. It allows you to write code like the following: require 'lisp' class Monkey =20 include Lisp =20 include Lisp::StandardFunctions =20 def boogers =20 "Monkeys!!" =20 end end x =3D Monkey.new x.lisp "(setf *something* 'value)" x.lisp "(defun saysomething () *something*)" x.saysomething() =3D> "value" x.lisp "(saysomething)" =3D> "value" x.lisp "(boogers)" =3D> "Monkeys!!" #########################################################################= ############ This email has been scanned by MailMarshal, an email content filter. #########################################################################= ############ ------_=_NextPart_001_01C5C985.8409652E Content-Type: application/octet-stream; name="lisp.rb" Content-Transfer-Encoding: base64 Content-Description: lisp.rb Content-Disposition: attachment; filename="lisp.rb" bW9kdWxlIExpc3ANCiAgICBtb2R1bGUgU3RhbmRhcmRGdW5jdGlvbnMNCiAgICAgICAgZGVmIGZp cnN0KGFycikNCiAgICAgICAgICAgIGFyclswXQ0KICAgICAgICBlbmQNCiAgICAgICAgZGVmIHNl Y29uZChhcnIpDQogICAgICAgICAgICBhcnJbMV0NCiAgICAgICAgZW5kDQogICAgICAgIGRlZiB0 aGlyZChhcnIpDQogICAgICAgICAgICBhcnJbMl0NCiAgICAgICAgZW5kDQogICAgICAgIGRlZiBh c3NvYyhrZXksIGFycikNCiAgICAgICAgICAgIGFyci5hc3NvYyhrZXkpDQogICAgICAgIGVuZA0K ICAgICAgICBkZWYgY2RkcihhcnIpDQogICAgICAgICAgICBhcnJbMi4uLTFdDQogICAgICAgIGVu ZA0KICAgICAgICBkZWYgbWFwY2FyKHByb2MsIGFycikNCiAgICAgICAgICAgIGFyci5jb2xsZWN0 IGRvIHx4fA0KICAgICAgICAgICAgICAgIHByb2MuY2FsbCh4KQ0KICAgICAgICAgICAgZW5kDQog ICAgICAgIGVuZA0KICAgICAgICBkZWYgYXBwbHkoZnVuY3Rpb24sIGxpc3QpDQogICAgICAgICAg ICBmdW5jdGlvbi5jYWxsKCpsaXN0KQ0KICAgICAgICBlbmQNCiAgICAgICAgZGVmIGVxKGEsIGIp DQogICAgICAgICAgICBhID09IGINCiAgICAgICAgZW5kDQogICAgICAgIGRlZiBwdXNoKG9iamVj dCwgYXJyKQ0KICAgICAgICAgICAgYXJyLnVuc2hpZnQob2JqZWN0KQ0KICAgICAgICBlbmQNCiAg ICAgICAgZGVmIGxpc3QoKnRoaW5ncykNCiAgICAgICAgICAgIHRoaW5ncw0KICAgICAgICBlbmQN CiAgICAgICAgZGVmIG5vdChleHByZXNzaW9uKQ0KICAgICAgICAgICAgIWV4cHJlc3Npb24NCiAg ICAgICAgZW5kDQogICAgICAgIGRlZiBhbmQoKmFyZ3MpDQogICAgICAgICAgICBhcmdzLmFsbD8g eyB8eHwgeCB9DQogICAgICAgIGVuZA0KICAgICAgICBkZWYgbWVtYmVyKG9iamVjdCwgYXJyKQ0K ICAgICAgICAgICAgYXJyLmluY2x1ZGU/KG9iamVjdCkNCiAgICAgICAgZW5kDQogICAgICAgIGRl ZmluZV9tZXRob2QgInJlbW92ZS1pZi1ub3QiIGRvIHxwcm9jLCBhcnJ8DQogICAgICAgICAgICBh cnIuc2VsZWN0IHt8eHwgcHJvYy5jYWxsKHgpIH0NCiAgICAgICAgZW5kDQogICAgICAgIGRlZiBh cHBlbmQoKmxpc3QpDQogICAgICAgICAgICBvdXQgPSBbXQ0KICAgICAgICAgICAgbGlzdC5lYWNo IHsgfGx8IA0KICAgICAgICAgICAgICAgIG91dC5jb25jYXQobCkNCiAgICAgICAgICAgIH0NCiAg ICAgICAgICAgIG91dA0KICAgICAgICBlbmQNCiAgICBlbmQNCiAgICANCiAgICBjbGFzcyBMaXNw TGlzdCA8IEFycmF5DQogICAgICAgIGF0dHJfcmVhZGVyIDpmbGFncw0KICAgICAgICBkZWYgaW5p dGlhbGl6ZShmbGFncykNCiAgICAgICAgICAgIHJhaXNlICJiYWQiIHVubGVzcyBmbGFncw0KICAg ICAgICAgICAgQGZsYWdzID0gZmxhZ3MNCiAgICAgICAgZW5kDQogICAgICAgIGRlZiB0b19saXNw KCkNCiAgICAgICAgICAgICIje0BmbGFnc30oI3tjb2xsZWN0IHt8eHwgeC50b19saXNwKCl9Lmpv aW4oIiAiKX0pIg0KICAgICAgICBlbmQNCiAgICAgICAgZGVmIF9fY29tcHV0ZV9jb21tYShvdXQs IGxpc3AsIGxvY2FsX3ZhcnMsIGRlcHRoPTEpDQogICAgICAgICAgICBlYWNoIHsgfHh8DQoJCWNp biA9IG5pbA0KCQlkZXB0aC50aW1lcyB7IA0KCQkJbmV3Y2luID0geC5mbGFnc1soY2lufHwtMSkr MS4uLTFdLmluZGV4KCIsIikNCgkJCWlmIG5ld2Npbg0KCQkJCWNpbiA9IG5ld2NpbiArIChjaW58 fC0xKSArIDENCgkJCWVsc2UNCgkJCQljaW4gPSBuaWwNCgkJCQlicmVhaw0KCQkJZW5kDQoJCX0N CgkJaWYoY2luKQ0KICAgICAgICAgICAgICAgICAgICBpZih4LmZsYWdzW2NpbisxXSA9PSAiQCIp DQogICAgICAgICAgICAgICAgICAgICAgICBuZXdmbGFncyA9IHguZmxhZ3NbY2luKzIuLi0xXSAN CiAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgbmV3Zmxh Z3MgPSB4LmZsYWdzW2NpbisxLi4tMV0NCiAgICAgICAgICAgICAgICAgICAgZW5kDQogICAgICAg ICAgICAgICAgICAgIGlmKExpc3BMaXN0ID09PSB4KQ0KICAgICAgICAgICAgICAgICAgICAgICAg eHggPSBMaXNwTGlzdC5uZXcobmV3ZmxhZ3MpDQogICAgICAgICAgICAgICAgICAgICAgICB4LmVh Y2ggeyB8eXwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4eCA8PCB5DQogICAgICAgICAg ICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAg ICAgICAgICAgIHh4ID0gTGlzcFN0cmluZy5uZXcoeCwgbmV3ZmxhZ3MpDQogICAgICAgICAgICAg ICAgICAgIGVuZA0KICAgICAgICAgICAgICAgICAgICB5eSA9IHh4LmNvbXB1dGUobGlzcCwgbG9j YWxfdmFycykNCgkJICAgIHguZmxhZ3NbMC4uLmNpbl0ucmV2ZXJzZS5lYWNoIGRvIHx6fA0KCQkJ ICAgIHl5LmZsYWdzLnVuc2hpZnQgeg0KCQkgICAgZW5kDQogICAgICAgICAgICAgICAgICAgIGlm KHguZmxhZ3NbY2luKzFdID09ICJAIikNCiAgICAgICAgICAgICAgICAgICAgICAgIG91dC5jb25j YXQoeXkpDQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAg IG91dCA8PHl5DQogICAgICAgICAgICAgICAgICAgIGVuZA0KICAgICAgICAgICAgICAgIGVsc2lm IExpc3BTdHJpbmcgPT09IHgNCiAgICAgICAgICAgICAgICAgICAgb3V0IDw8IHgNCiAgICAgICAg ICAgICAgICBlbHNlDQoJCSAgICBuZXdkZXB0aCA9IGRlcHRoIA0KCQkgICAgbmV3ZGVwdGggKz0g MSBpZiB4LmZsYWdzLmZpcnN0ID09ICJgIiANCiAgICAgICAgICAgICAgICAgICAgbmV3X291dCA9 IExpc3BMaXN0Lm5ldyh4LmZsYWdzKQ0KICAgICAgICAgICAgICAgICAgICB4Ll9fY29tcHV0ZV9j b21tYShuZXdfb3V0LCBsaXNwLCBsb2NhbF92YXJzLCBuZXdkZXB0aCkNCiAgICAgICAgICAgICAg ICAgICAgb3V0IDw8IG5ld19vdXQNCiAgICAgICAgICAgICAgICBlbmQNCiAgICAgICAgICAgIH0N CiAgICAgICAgZW5kDQogICAgICAgIGRlZiBjb21wdXRlKGxpc3AsIGxvY2FsX3ZhcnMpDQogICAg ICAgICAgICBpZiBAZmxhZ3MuZmlyc3QgPT0gIiciDQogICAgICAgICAgICAgICAgb3V0ID0gTGlz cExpc3QubmV3KEBmbGFnc1sxLi4tMV0pDQogICAgICAgICAgICAgICAgZWFjaCB7IHx4fCAgICBv dXQgPDwgeCB9DQogICAgICAgICAgICAgICAgb3V0DQogICAgICAgICAgICBlbHNpZiBAZmxhZ3Mu Zmlyc3QgPT0gImAiDQogICAgICAgICAgICAgICAgb3V0ID0gTGlzcExpc3QubmV3KEBmbGFnc1sx Li4tMV0pDQogICAgICAgICAgICAgICAgX19jb21wdXRlX2NvbW1hKG91dCwgbGlzcCwgbG9jYWxf dmFycykNCiAgICAgICAgICAgICAgICBvdXQNCiAgICAgICAgICAgIGVsc2lmIEBmbGFncy5maXJz dC5uaWw/IHx8IEBmbGFncy5maXJzdCA9PSAiLCINCiAgICAgICAgICAgICAgICBpZiBsaXNwLl9f bWFjcm9zICYmIG1hY3JvID0gbGlzcC5fX21hY3Jvc1tzZWxmWzBdXQ0KICAgICAgICAgICAgICAg ICAgICByZXN1bHQgPSBtYWNyby5jYWxsKHNlbGZbMS4uLTFdICwgbG9jYWxfdmFycykNCiAgICAg ICAgICAgICAgICBlbHNpZiBsaXNwLnJlc3BvbmRfdG8/KCIje3NlbGZbMF19XyIpDQogICAgICAg ICAgICAgICAgICAgIHJlc3VsdCA9IGxpc3Auc2VuZCgiI3tzZWxmWzBdfV8iLCAqKHNlbGZbMS4u LTFdICsgW2xvY2FsX3ZhcnNdKSkNCiAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAg ICAgICAgIG5hbWUgPSBzZWxmWzBdDQogICAgICAgICAgICAgICAgICAgIGFyZ3MgPSBzZWxmWzEu Li0xXS5jb2xsZWN0IHsgfHh8DQogICAgICAgICAgICAgICAgICAgICAgICB4LmNvbXB1dGUobGlz cCwgbG9jYWxfdmFycykNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAg ICByZXN1bHQgPSBsaXNwLnNlbmQoc2VsZlswXSwgKmFyZ3MpDQogICAgICAgICAgICAgICAgZW5k ICAgIA0KICAgICAgICAgICAgICAgIHJlc3VsdA0KICAgICAgICAgICAgZWxzZQ0KICAgICAgICAg ICAgICAgIHJhaXNlICJXaGF0IGRvIEkgZG8gd2l0aCAje0BmbGFncy5maXJzdH0/Ig0KICAgICAg ICAgICAgZW5kICAgICAgICANCiAgICAgICAgZW5kDQogICAgICAgICN+IGRlZiBpbnNwZWN0KCkN CiAgICAgICAgICAgICN+ICIje2ZsYWdzLmluc3BlY3R9I3tzdXBlcn0iDQogICAgICAgICN+IGVu ZCAgICAgICAgICAgICAgICANCiAgICBlbmQNCiAgICANCiAgICBGbGFncyA9ICV3eycgYCAsIEB9 DQogICAgDQogICAgY2xhc3MgTGlzcFN0cmluZyA8IFN0cmluZw0KICAgICAgICBhdHRyX3JlYWRl ciA6ZmxhZ3MNCiAgICAgICAgZGVmIGluaXRpYWxpemUoc3RyaW5nLCBmbGFncykNCiAgICAgICAg ICAgIHN1cGVyKHN0cmluZykNCiAgICAgICAgICAgIEBmbGFncyA9IGZsYWdzDQogICAgICAgIGVu ZA0KICAgICAgICBkZWYgY29tcHV0ZShsaXNwLCBsb2NhbF92YXJzKQ0KICAgICAgICAgICAgaWYo QGZsYWdzLmZpcnN0ID09ICInIikNCiAgICAgICAgICAgICAgICBMaXNwU3RyaW5nLm5ldyhzZWxm LCBAZmxhZ3NbMS4uLTFdKQ0KICAgICAgICAgICAgZWxzaWYgQGZsYWdzLmZpcnN0Lm5pbD8gfHwg QGZsYWdzLmZpcnN0ID09ICIsIg0KICAgICAgICAgICAgICAgIGlmKHNlbGZbMC4uMV0gPT0gIiMn IikNCiAgICAgICAgICAgICAgICAgICAgbGlzcC5tZXRob2Qoc2VsZlsyLi4tMV0pDQogICAgICAg ICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICBpZiBsb2NhbF92YXJzLmluY2x1ZGU/ KHNlbGYpDQogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBsb2NhbF92YXJzW3NlbGZdDQog ICAgICAgICAgICAgICAgICAgIGVsc2lmIGxpc3AuX19vYmplY3RzICYmIGxpc3AuX19vYmplY3Rz LmluY2x1ZGU/KHNlbGYpDQogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBsaXNwLl9fb2Jq ZWN0c1tzZWxmXSANCiAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAg ICAgICAgcmFpc2UgIicje3NlbGZ9JyBub3QgZGVmaW5lZCIgdW5sZXNzIHZhbA0KICAgICAgICAg ICAgICAgICAgICBlbmQgdW5sZXNzIHZhbA0KICAgICAgICAgICAgICAgICAgICB2YWwNCiAgICAg ICAgICAgICAgICBlbmQgICAgICAgIA0KICAgICAgICAgICAgZWxzaWYgQGZsYWdzLmZpcnN0DQog ICAgICAgICAgICAgICAgcmFpc2UgIldoYXQgZG8gSSBkbyB3aXRoICN7QGZsYWdzLmZpcnN0fT8i DQogICAgICAgICAgICBlbmQNCiAgICAgICAgZW5kDQogICAgICAgIGRlZiB0b19saXNwKGZsYWdz PUBmbGFncykNCiAgICAgICAgICAgICIje2ZsYWdzfSN7c2VsZn0iDQogICAgICAgIGVuZCAgICAN CiAgICAgICAgI34gZGVmIGluc3BlY3QoKQ0KICAgICAgICAgICAgI34gIiN7ZmxhZ3MuaW5zcGVj dH0je3N1cGVyfSINCiAgICAgICAgI34gZW5kICAgICAgICANCiAgICBlbmQNCiAgICAjDQogICAg IyBIZWxwZXIgbWV0aG9kcw0KICAgICMNCiAgICBkZWYgX19tYWNyb3MNCiAgICAgICAgQF9fbGlz cF9tYWNyb3MgfHw9IEhhc2gubmV3DQogICAgZW5kDQogICAgZGVmIF9fb2JqZWN0cw0KICAgICAg ICB1bmxlc3MgQF9fbGlzcF9vYmplY3RzDQogICAgICAgICAgICBAX19saXNwX29iamVjdHMgPSBI YXNoLm5ldw0KICAgICAgICAgICAgQF9fbGlzcF9vYmplY3RzWyJ0Il0gPSB0cnVlDQogICAgICAg ICAgICBAX19saXNwX29iamVjdHNbIm5pbCJdID0gbmlsDQogICAgICAgIGVuZA0KICAgICAgICBA X19saXNwX29iamVjdHMNCiAgICBlbmQNCiAgICBkZWYgcGFyc2VfbGlzcChzdHJpbmcsIGZsYWdz PVtdKQ0KICAgICAgICBzdHJpbmcuZ3N1YiEoIlxuIiwgIiAiKQ0KICAgICAgICBzdHJpbmcuc3Ry aXAhDQogICAgICAgIGFyZ3MgPSBMaXNwTGlzdC5uZXcoZmxhZ3MpDQogICAgICAgIHdoaWxlIHN0 cmluZyAmJiAhc3RyaW5nLmVtcHR5Pw0KICAgICAgICAgICAgbmV3ZmxhZ3MgPSBbXQ0KICAgICAg ICAgICAgd2hpbGUoRmxhZ3MuaW5jbHVkZT8oc3RyaW5nWzAuLjBdKSkNCiAgICAgICAgICAgICAg ICBuZXdmbGFncyA8PCBzdHJpbmdbMC4uMF0NCiAgICAgICAgICAgICAgICBzdHJpbmcgPSBzdHJp bmdbMS4uLTFdDQogICAgICAgICAgICBlbmQNCiAgICAgICAgICAgICN+IHN0cmluZywgbmV3Zmxh Z3MgPSBMaXNwRmxhZ3MucGFyc2Uoc3RyaW5nLCBmbGFncykNCiAgICAgICAgICAgIGluZGV4ID0g c3RyaW5nLmluZGV4KCcoJykNCiAgICAgICAgICAgIGlmIChpbmRleCAmJiBpbmRleCA9PSAwKQ0K ICAgICAgICAgICAgICAgIGNvdW50ID0gMQ0KICAgICAgICAgICAgICAgIGluZGV4ICs9IDENCiAg ICAgICAgICAgICAgICB3aGlsZSBjb3VudCA+IDANCiAgICAgICAgICAgICAgICAgICAgb3BlbiA9 IHN0cmluZy5pbmRleCgnKCcsIGluZGV4KQ0KICAgICAgICAgICAgICAgICAgICBjbG9zZSA9IHN0 cmluZy5pbmRleCgnKScsIGluZGV4KQ0KICAgICAgICAgICAgICAgICAgICByYWlzZSAiVW5tYXRj aGVkIGJyYWNrZXRzIiB1bmxlc3MoY2xvc2UgfHwgb3BlbikNCiAgICAgICAgICAgICAgICAgICAg aWYoIW9wZW4gfHwgY2xvc2UgPCBvcGVuKQ0KICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgg PSBjbG9zZSsxDQogICAgICAgICAgICAgICAgICAgICAgICBjb3VudCAtPSAxDQogICAgICAgICAg ICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gb3BlbisxDQog ICAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxDQogICAgICAgICAgICAgICAgICAgIGVu ZA0KICAgICAgICAgICAgICAgIGVuZA0KICAgICAgICAgICAgICAgIGN1cnJlbnQsIHN0cmluZyA9 IHN0cmluZ1sxLi4uKGluZGV4LTEpXSwgc3RyaW5nW2luZGV4KzEuLi0xXQ0KICAgICAgICAgICAg ICAgIGFyZ3MgPDwgcGFyc2VfbGlzcChjdXJyZW50LCBuZXdmbGFncykNCiAgICAgICAgICAgIGVs c2UNCiAgICAgICAgICAgICAgICBjdXJyZW50LCBzdHJpbmcgPSBzdHJpbmcuc3BsaXQoL1xzKy8s IDIpDQogICAgICAgICAgICAgICAgYXJncyA8PCBMaXNwU3RyaW5nLm5ldyhjdXJyZW50LCBuZXdm bGFncykNCiAgICAgICAgICAgIGVuZA0KICAgICAgICAgICAgc3RyaW5nLnN0cmlwISBpZiBzdHJp bmcNCiAgICAgICAgZW5kICAgIA0KICAgICAgICBhcmdzDQogICAgZW5kDQogICAgZGVmIF9fY29u dmVydChvYmplY3QpDQogICAgICAgIGNhc2Ugb2JqZWN0DQogICAgICAgICAgICB3aGVuIExpc3BM aXN0LCBMaXNwU3RyaW5nLCBQcm9jIDogb2JqZWN0DQogICAgICAgICAgICB3aGVuIEFycmF5DQog ICAgICAgICAgICAgICAgb3V0ID0gTGlzcExpc3QubmV3KFtdKQ0KICAgICAgICAgICAgICAgIG9i amVjdC5lYWNoIHt8eHwgb3V0IDw8IF9fY29udmVydCh4KX0NCiAgICAgICAgICAgICAgICBvdXQN CiAgICAgICAgICAgIHdoZW4gVHJ1ZUNsYXNzDQogICAgICAgICAgICAgICAgTGlzcFN0cmluZy5u ZXcoInQiLCBbXSkNCiAgICAgICAgICAgIHdoZW4gRmFsc2VDbGFzcywgTmlsQ2xhc3MNCiAgICAg ICAgICAgICAgICBMaXNwU3RyaW5nLm5ldygibmlsIiwgW10pDQogICAgICAgICAgICB3aGVuIFN0 cmluZw0KICAgICAgICAgICAgICAgIExpc3BTdHJpbmcubmV3KG9iamVjdCwgW10pDQogICAgICAg ICAgICBlbHNlDQogICAgICAgICAgICAgICAgcmFpc2UgIldoYXQgZG8gaSBkbyB3aXRoICN7b2Jq ZWN0LmNsYXNzfT8iDQogICAgICAgIGVuZA0KICAgIGVuZA0KICAgIGRlZiBsaXNwKHN0cmluZywg bG9jYWxfdmFycz1IYXNoLm5ldykNCiAgICAgICAgcmVzdWx0ID0gbmlsDQogICAgICAgIHBhcnNl ZCA9IHBhcnNlX2xpc3Aoc3RyaW5nKQ0KICAgICAgICBwYXJzZWQuZWFjaCB7IHx4fA0KICAgICAg ICAgICAgcmVzdWx0ID0geC5jb21wdXRlKHNlbGYsIGxvY2FsX3ZhcnMpDQogICAgICAgIH0NCiAg ICAgICAgX19jb252ZXJ0KHJlc3VsdCkNCiAgICBlbmQNCiAgICAjDQogICAgIyBUaGUgY29yZSBt ZXRob2RzIGZvciBsaXNwIHRvIHdvcmsNCiAgICAjDQogICAgZGVmIGxhbWJkYV8oYXJncywgYmxv Y2ssIGxvY2FsX3ZhcnMsIG5hbWU9bmlsKQ0KICAgICAgICBQcm9jLm5ldyBkbyB8KnByb2Nhcmdz fA0KICAgICAgICAgICAgaWYgYXJncy5sZW5ndGggPT0gcHJvY2FyZ3MubGVuZ3RoDQogICAgICAg ICAgICAgICAgbmV3X2xvY2FsX3ZhcnMgPSBIYXNoLm5ldw0KICAgICAgICAgICAgICAgIG5ld19s b2NhbF92YXJzLnVwZGF0ZShsb2NhbF92YXJzKSBpZiBsb2NhbF92YXJzDQogICAgICAgICAgICAg ICAgYXJncy5sZW5ndGgudGltZXMgZG8gfGl8DQogICAgICAgICAgICAgICAgICAgIG5ld19sb2Nh bF92YXJzW2FyZ3NbaV1dID0gcHJvY2FyZ3NbaV0NCiAgICAgICAgICAgICAgICBlbmQNCiAgICAg ICAgICAgICAgICBibG9jay5jb21wdXRlKHNlbGYsIG5ld19sb2NhbF92YXJzKQ0KICAgICAgICAg ICAgZWxzZQ0KICAgICAgICAgICAgICAgIHJhaXNlIEFyZ3VtZW50RXJyb3IsICJ3cm9uZyBudW1i ZXIgb2YgYXJndW1lbnRzICgje3Byb2NhcmdzLmxlbmd0aH0gZm9yICN7YXJncy5sZW5ndGh9KSBp biAje25hbWUgfHwgYmxvY2t9Ig0KICAgICAgICAgICAgZW5kICAgICAgICANCiAgICAgICAgZW5k ICAgICAgICANCiAgICBlbmQNCiAgICBkZWYgZGVmdW5fKG5hbWUsIGFyZ3MsIGJsb2NrLCBsb2Nh bF92YXJzKQ0KICAgICAgICBAZGVmdW4gfHw9IEhhc2gubmV3DQogICAgICAgIHh4ID0gbGFtYmRh XyhhcmdzLCBibG9jaywgbG9jYWxfdmFycywgbmFtZSkNCiAgICAgICAgc2VsZi5jbGFzcy5tb2R1 bGVfZXZhbCBkbw0KICAgICAgICAgICAgZGVmaW5lX21ldGhvZCBuYW1lIGRvIHwqYXJnc3wgeHgu Y2FsbCgqYXJncykgZW5kDQogICAgICAgIGVuZA0KICAgICAgICBuYW1lDQogICAgZW5kDQogICAg ZGVmIGRlZm1hY3JvXyhuYW1lLCBhcmdzLCBibG9jaywgbG9jYWxfdmFycykNCiAgICAgICAgaWYo YXJnc1stMl0gPT0gIiZyZXN0IikNCiAgICAgICAgICAgIHJlc3RhcmcgPSBhcmdzWy0xXQ0KICAg ICAgICAgICAgYXJncyA9IGFyZ3NbMC4uLTNdDQogICAgICAgIGVuZA0KICAgICAgICBfX21hY3Jv c1tuYW1lXSA9IFByb2MubmV3IGRvIHxwcm9jYXJncywgcHJvY19sb2NhbF92YXJzfA0KICAgICAg ICAgICAgbmV3X2xvY2FsX3ZhcnMgPSBIYXNoLm5ldw0KICAgICAgICAgICAgbmV3X2xvY2FsX3Zh cnMudXBkYXRlKGxvY2FsX3ZhcnMpIGlmIGxvY2FsX3ZhcnMNCiAgICAgICAgICAgIG5ld19sb2Nh bF92YXJzLnVwZGF0ZShwcm9jX2xvY2FsX3ZhcnMpIGlmIHByb2NfbG9jYWxfdmFycw0KICAgICAg ICAgICAgYXJncy5sZW5ndGgudGltZXMgZG8gfGl8DQogICAgICAgICAgICAgICAgbmV3X2xvY2Fs X3ZhcnNbYXJnc1tpXV0gPSBwcm9jYXJnc1tpXQ0KICAgICAgICAgICAgZW5kDQogICAgICAgICAg ICBpZihwcm9jYXJncy5sZW5ndGggPiBhcmdzLmxlbmd0aCkNCiAgICAgICAgICAgICAgICBpZihy ZXN0YXJnKQ0KICAgICAgICAgICAgICAgICAgICBsaXN0ID0gTGlzcExpc3QubmV3KFtdKQ0KICAg ICAgICAgICAgICAgICAgICBwcm9jYXJnc1thcmdzLmxlbmd0aC4uLTFdLmVhY2ggeyB8eHwgbGlz dCA8PCB4IH0NCiAgICAgICAgICAgICAgICAgICAgbmV3X2xvY2FsX3ZhcnNbcmVzdGFyZ10gPSBs aXN0DQogICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICByYWlzZSBBcmd1 bWVudEVycm9yLCAid3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cyAoI3twcm9jYXJncy5sZW5ndGh9 IGZvciAje2FyZ3MubGVuZ3RofSkgaW4gI3tuYW1lIHx8IGJsb2NrfSINCiAgICAgICAgICAgICAg ICBlbmQNCiAgICAgICAgICAgIGVuZA0KICAgICAgICAgICAgcmVzdWx0ID0gYmxvY2suY29tcHV0 ZShzZWxmLCBuZXdfbG9jYWxfdmFycykNCiAgICAgICAgICAgIHJlc3VsdCA9IF9fY29udmVydChy ZXN1bHQpDQogICAgICAgICAgICBsaXNwKHJlc3VsdC50b19saXNwLCBuZXdfbG9jYWxfdmFycykN CiAgICAgICAgZW5kDQogICAgICAgIG5hbWUNCiAgICBlbmQNCiAgICBkZWYgc2V0Zl8oa2V5LCB2 YWx1ZSwgbG9jYWxfdmFycykNCiAgICAgICAgdmFsdWUgPSB2YWx1ZS5jb21wdXRlKHNlbGYsIGxv Y2FsX3ZhcnMpDQogICAgICAgIF9fb2JqZWN0c1trZXldID0gdmFsdWUNCiAgICAgICAga2V5DQog ICAgZW5kDQogICAgYWxpYXMgOmRlZnBhcmFtZXRlcl8gOnNldGZfDQogICAgZGVmIGxldF8oYXNz aWdubWVudCwgYmxvY2ssIGxvY2FsX3ZhcnMpDQogICAgICAgIG5ld19sb2NhbF92YXJzID0gSGFz aC5uZXcNCiAgICAgICAgbmV3X2xvY2FsX3ZhcnMudXBkYXRlKGxvY2FsX3ZhcnMpIGlmIGxvY2Fs X3ZhcnMNCiAgICAgICAgdmFsdWUgPSBhc3NpZ25tZW50WzBdWzFdLmNvbXB1dGUoc2VsZiwgbmV3 X2xvY2FsX3ZhcnMpDQogICAgICAgIG5ld19sb2NhbF92YXJzW2Fzc2lnbm1lbnRbMF1bMF1dID0g dmFsdWUNCiAgICAgICAgYmxvY2suY29tcHV0ZShzZWxmLCBuZXdfbG9jYWxfdmFycykNCiAgICBl bmQNCiAgICBkZWYgY29uZF8oKmFyZ3MpDQogICAgICAgIGxvY2FsX3ZhcnMgPSBhcmdzWy0xXQ0K ICAgICAgICBibG9ja3MgPSBhcmdzWzAuLi0yXQ0KICAgICAgICBibG9ja3MuZWFjaCB7IHxibG9j a3wNCiAgICAgICAgICAgIGlmKGJsb2NrWzBdLmNvbXB1dGUoc2VsZiwgbG9jYWxfdmFycykpDQog ICAgICAgICAgICAgICAgcmVzdWx0ID0gbmlsDQogICAgICAgICAgICAgICAgYmxvY2tbMS4uLTFd LmVhY2ggeyB8eHwNCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0geC5jb21wdXRlKHNlbGYs IGxvY2FsX3ZhcnMpIA0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICByZXR1cm4g cmVzdWx0DQogICAgICAgICAgICBlbmQNCiAgICAgICAgfQ0KICAgICAgICBwICJOb3RoaW5nISIN CiAgICBlbmQNCmVuZA0KDQoNCg0KDQoNCm8gPSBPYmplY3QubmV3DQpvLmV4dGVuZChMaXNwKQ0K by5leHRlbmQoTGlzcDo6U3RhbmRhcmRGdW5jdGlvbnMpDQoNCiN+IHh4ID0gby5wYXJzZV9saXNw KCJgKCcsJyxzdHJpbmcpIikNCiN+IHAgeHhbMF0NCiN+IHAgeHhbMF0uY29tcHV0ZShvLCB7InN0 cmluZyIgPT4gImNoYWluIn0pDQojfiBleGl0DQoNCg0KDQoNCg0KDQoNCmlmICQwID09IF9fRklM RV9fDQogICAgcmVxdWlyZSAndGVzdC91bml0Jw0KICAgIGNsYXNzIFRlc3RMaXNwIDwgVGVzdDo6 VW5pdDo6VGVzdENhc2UNCiAgICAgICAgZGVmIHNldHVwDQogICAgICAgICAgICBAbyA9IE9iamVj dC5uZXcNCiAgICAgICAgICAgIEBvLmV4dGVuZChMaXNwKQ0KICAgICAgICAgICAgQG8uZXh0ZW5k KExpc3A6OlN0YW5kYXJkRnVuY3Rpb25zKQ0KICAgICAgICBlbmQNCiAgICAgICAgZGVmIHRlc3Rf c2ltcGxlX2FycmF5DQogICAgICAgICAgICBhc3NlcnRfZXF1YWwoWyJ4Il0sIEBvLmxpc3AoIico eCkiKSkNCiAgICAgICAgZW5kDQogICAgICAgIGRlZiB0ZXN0X3NpbXBsZV9hcnJheTINCiAgICAg ICAgICAgIGFzc2VydF9lcXVhbChbIngiLCAieSIsInoiXSwgQG8ubGlzcCgiJyh4IHkgeikiKSkN CiAgICAgICAgZW5kDQogICAgICAgIGRlZiB0ZXN0X2NvbW1hbmRfYXJyYXkNCiAgICAgICAgICAg IEBvLmxpc3AoIihzZXRmICpvYmplY3RzKiAnKHdoaXNrZXktYm90dGxlIGJ1Y2tldCBmcm9nIGNo YWluKSkiKQ0KICAgICAgICAgICAgYXNzZXJ0X2VxdWFsKCV3e3doaXNrZXktYm90dGxlIGJ1Y2tl dCBmcm9nIGNoYWlufSwgQG8uX19vYmplY3RzWyIqb2JqZWN0cyoiXSkNCiAgICAgICAgZW5kICAg ICAgICANCiAgICAgICAgZGVmIHRlc3RfcGFyc2VfcmVjb25zdHJ1Y3QNCiAgICAgICAgICAgIGlu cHV0ID0gPDwtRU9GDQooZGVmc3BlbCBnYW1lLWFjdGlvbiAoY29tbWFuZCBzdWJqIG9iaiBwbGFj ZSAmcmVzdCByZXN0KQ0KICBgKGRlZnNwZWwgLGNvbW1hbmQgKHN1YmplY3Qgb2JqZWN0KQ0KICAg ICBgKGNvbmQgKChhbmQgKGVxICpsb2NhdGlvbiogJywnLHBsYWNlKQ0KICAgICAgICAgIChlcSAn LHN1YmplY3QgJywnLHN1YmopDQogICAgICAgICAgKGVxICcsb2JqZWN0ICcsJyxvYmopDQogICAg ICAgICAgKGhhdmUgJywnLHN1YmopKQ0KICAgICAgICAgLEAnLHJlc3QpDQogICAgICAgICh0ICco aSBjYW50ICwnLGNvbW1hbmQgbGlrZSB0aGF0LikpKSkpICAgIA0KICAgICAgICAgICAgRU9GDQog ICAgICAgICAgICBpbnB1dC5nc3ViISgvWyBcbl0rLywgIiAiKQ0KICAgICAgICAgICAgb3V0cHV0 ID0gQG8ucGFyc2VfbGlzcChpbnB1dClbMF0NCiAgICAgICAgICAgIHB1dHMNCiAgICAgICAgICAg ICNvdXRwdXQuZWFjaCB7fHh8IHguZWFjaCB7IHx5fCBwdXRzIHkudG9fbGlzcCB9IGlmIEFycmF5 ID09PSB4fQ0KICAgICAgICAgICAgcHV0cw0KICAgICAgICAgICAgYXNzZXJ0X2VxdWFsKGlucHV0 LCBvdXRwdXQudG9fbGlzcCkNCiAgICAgICAgZW5kDQogICAgICAgIGRlZiB0ZXN0X2RlZnVuDQog ICAgICAgICAgICBAby5saXNwKDw8LUVPRikNCihkZWZ1biBkZXNjcmliZS1sb2NhdGlvbiAobG9j YXRpb24gbWFwKQ0KICAoc2Vjb25kIChhc3NvYyBsb2NhdGlvbiBtYXApKSkgICAgICAgIA0KICAg ICAgICAgICAgRU9GDQogICAgICAgICAgICBAby5saXNwKDw8LUVPRikNCihzZXRmICptYXAqICco KGxpdmluZy1yb29tICh5b3UgYXJlIGluIHRoZSBsaXZpbmctcm9vbSBvZiBhIHdpemFyZCdzIGhv dXNlLiB0aGVyZSBpcyBhIHdpemFyZCBzbm9yaW5nIGxvdWRseSBvbiB0aGUgY291Y2guKQ0KICAg ICAgICAgICAgICAgKHdlc3QgZG9vciBnYXJkZW4pICANCiAgICAgICAgICAgICAgICh1cHN0YWly cyBzdGFpcndheSBhdHRpYykpDQogICAgICAgICAgKGdhcmRlbiAoeW91IGFyZSBpbiBhIGJlYXV0 aWZ1bCBnYXJkZW4uIHRoZXJlIGlzIGEgd2VsbCBpbiBmcm9udCBvZiB5b3UuKQ0KICAgICAgICAg ICAgICAoZWFzdCBkb29yIGxpdmluZy1yb29tKSkNCiAgICAgICAgICAoYXR0aWMgKHlvdSBhcmUg aW4gdGhlIGF0dGljIG9mIHRoZSB3aXphcmRzIGhvdXNlLiB0aGVyZSBpcyBhIGdpYW50IHdlbGRp bmcgdG9yY2ggaW4gdGhlIGNvcm5lci4pDQogICAgICAgICAgICAgKGRvd25zdGFpcnMgc3RhaXJ3 YXkgbGl2aW5nLXJvb20pKSkpDQogICAgICAgICAgICBFT0YNCiAgICAgICAgICAgIHJlc3VsdCA9 IEBvLmxpc3AoPDwtRU9GKQ0KKGRlc2NyaWJlLWxvY2F0aW9uICdsaXZpbmctcm9vbSAqbWFwKikN CiAgICAgICAgICAgIEVPRg0KICAgICAgICAgICAgYXNzZXJ0X2VxdWFsKCV3e3lvdSBhcmUgaW4g dGhlIGxpdmluZy1yb29tIG9mIGEgd2l6YXJkJ3MgaG91c2UuIHRoZXJlIGlzIGEgd2l6YXJkIHNu b3JpbmcgbG91ZGx5IG9uIHRoZSBjb3VjaC59LCByZXN1bHQpDQogICAgICAgIGVuZA0KICAgICAg ICBkZWYgdGVzdF9saXNwX2dhbWUNCiAgICAgICAgICAgIEBvLmxpc3AoPDwtRU9GKQ0KKHNldGYg Km9iamVjdHMqICcod2hpc2tleS1ib3R0bGUgYnVja2V0IGNoYWluIGZyb2cpKQ0KICAgICAgICAg ICAgRU9GDQogICAgICAgICAgICBAby5saXNwKDw8LUVPRikNCihzZXRmICptYXAqICcoKGxpdmlu Zy1yb29tICh5b3UgYXJlIGluIHRoZSBsaXZpbmctcm9vbSBvZiBhIHdpemFyZCdzIGhvdXNlLiB0 aGVyZSBpcyBhIHdpemFyZCBzbm9yaW5nIGxvdWRseSBvbiB0aGUgY291Y2guKQ0KICAgICAgICAg ICAgICAgKHdlc3QgZG9vciBnYXJkZW4pICANCiAgICAgICAgICAgICAgICh1cHN0YWlycyBzdGFp cndheSBhdHRpYykpDQogICAgICAgICAgKGdhcmRlbiAoeW91IGFyZSBpbiBhIGJlYXV0aWZ1bCBn YXJkZW4uIHRoZXJlIGlzIGEgd2VsbCBpbiBmcm9udCBvZiB5b3UuKQ0KICAgICAgICAgICAgICAo ZWFzdCBkb29yIGxpdmluZy1yb29tKSkNCiAgICAgICAgICAoYXR0aWMgKHlvdSBhcmUgaW4gdGhl IGF0dGljIG9mIHRoZSB3aXphcmRzIGhvdXNlLiB0aGVyZSBpcyBhIGdpYW50IHdlbGRpbmcgdG9y Y2ggaW4gdGhlIGNvcm5lci4pDQogICAgICAgICAgICAgKGRvd25zdGFpcnMgc3RhaXJ3YXkgbGl2 aW5nLXJvb20pKSkpDQooc2V0ZiAqb2JqZWN0LWxvY2F0aW9ucyogJygod2hpc2tleS1ib3R0bGUg bGl2aW5nLXJvb20pDQogICAgICAgICAgICAgICAoYnVja2V0IGxpdmluZy1yb29tKQ0KICAgICAg ICAgICAgICAgKGNoYWluIGdhcmRlbikNCiAgICAgICAgICAgICAgIChmcm9nIGdhcmRlbikpKSAg ICAgICAgDQooc2V0ZiAqbG9jYXRpb24qICdsaXZpbmctcm9vbSkgICAgICAgIA0KICAgICAgICAg ICAgRU9GDQogICAgICAgICAgICByZXN1bHQgPSBAby5saXNwKDw8LUVPRikNCihkZWZ1biBkZXNj cmliZS1sb2NhdGlvbiAobG9jYXRpb24gbWFwKQ0KICAoc2Vjb25kIChhc3NvYyBsb2NhdGlvbiBt YXApKSkgICAgICAgIA0KKGRlc2NyaWJlLWxvY2F0aW9uICdsaXZpbmctcm9vbSAqbWFwKikNCiAg ICAgICAgICAgIEVPRg0KICAgICAgICAgICAgYXNzZXJ0X2VxdWFsKCV3e3lvdSBhcmUgaW4gdGhl IGxpdmluZy1yb29tIG9mIGEgd2l6YXJkJ3MgaG91c2UuIHRoZXJlIGlzIGEgd2l6YXJkIHNub3Jp bmcgbG91ZGx5IG9uIHRoZSBjb3VjaC59LCByZXN1bHQpDQogICAgICAgICAgICByZXN1bHQgPSBA by5saXNwKDw8LUVPRikNCihkZWZ1biBkZXNjcmliZS1wYXRoIChwYXRoKQ0KICBgKHRoZXJlIGlz IGEgLChzZWNvbmQgcGF0aCkgZ29pbmcgLChmaXJzdCBwYXRoKSBmcm9tIGhlcmUuKSkNCihkZXNj cmliZS1wYXRoICcod2VzdCBkb29yIGdhcmRlbikpICANCiAgICAgICAgICAgIEVPRg0KICAgICAg ICAgICAgYXNzZXJ0X2VxdWFsKCV3e3RoZXJlIGlzIGEgZG9vciBnb2luZyB3ZXN0IGZyb20gaGVy ZS59LCByZXN1bHQpDQogICAgICAgICAgICByZXN1bHQgPSBAby5saXNwKDw8LUVPRikNCihkZWZ1 biBkZXNjcmliZS1wYXRocyAobG9jYXRpb24gbWFwKQ0KICAoYXBwbHkgIydhcHBlbmQgKG1hcGNh ciAjJ2Rlc2NyaWJlLXBhdGggKGNkZHIgKGFzc29jIGxvY2F0aW9uIG1hcCkpKSkpDQooZGVzY3Jp YmUtcGF0aHMgJ2xpdmluZy1yb29tICptYXAqKSAgDQogICAgICAgICAgICBFT0YNCiAgICAgICAg ICAgIGFzc2VydF9lcXVhbCgld3t0aGVyZSBpcyBhIGRvb3IgZ29pbmcgd2VzdCBmcm9tIGhlcmUu IHRoZXJlIGlzIGEgc3RhaXJ3YXkgZ29pbmcgdXBzdGFpcnMgZnJvbSBoZXJlLn0sIHJlc3VsdCkN CiAgICAgICAgICAgIHJlc3VsdCA9IEBvLmxpc3AoPDwtRU9GKQ0KKGRlZnVuIGlzLWF0IChvYmog bG9jIG9iai1sb2MpDQogIChlcSAoc2Vjb25kIChhc3NvYyBvYmogb2JqLWxvYykpIGxvYykpDQoo aXMtYXQgJ3doaXNrZXktYm90dGxlICdsaXZpbmctcm9vbSAqb2JqZWN0LWxvY2F0aW9ucyopICAN CiAgICAgICAgICAgIEVPRg0KICAgICAgICAgICAgI2Fzc2VydF9lcXVhbCgidCIsIHJlc3VsdCkN CiAgICAgICAgICAgIHJlc3VsdCA9IEBvLmxpc3AoPDwtRU9GKQ0KKGRlZnVuIGRlc2NyaWJlLWZs b29yIChsb2Mgb2JqcyBvYmotbG9jKQ0KICAoYXBwbHkgIydhcHBlbmQgKG1hcGNhciAobGFtYmRh ICh4KQ0KICAgICAgICAgICAgICAgIGAoeW91IHNlZSBhICx4IG9uIHRoZSBmbG9vci4pKQ0KICAg ICAgICAgICAgICAocmVtb3ZlLWlmLW5vdCAobGFtYmRhICh4KQ0KICAgICAgICAgICAgICAgICAg ICAgICAoaXMtYXQgeCBsb2Mgb2JqLWxvYykpDQogICAgICAgICAgICAgICAgICAgICBvYmpzKSkp KQ0KKGRlc2NyaWJlLWZsb29yICdsaXZpbmctcm9vbSAqb2JqZWN0cyogKm9iamVjdC1sb2NhdGlv bnMqKQ0KICAgICAgICAgICAgRU9GDQogICAgICAgICAgICBhc3NlcnRfZXF1YWwoJXd7eW91IHNl ZSBhIHdoaXNrZXktYm90dGxlIG9uIHRoZSBmbG9vci4geW91IHNlZSBhIGJ1Y2tldCBvbiB0aGUg Zmxvb3IufSwgcmVzdWx0KSAgICAgICAgDQogICAgICAgICAgICByZXN1bHQgPSBAby5saXNwKDw8 LUVPRikNCihkZWZ1biBsb29rICgpDQogIChhcHBlbmQgKGRlc2NyaWJlLWxvY2F0aW9uICpsb2Nh dGlvbiogKm1hcCopDQogICAgICAoZGVzY3JpYmUtcGF0aHMgKmxvY2F0aW9uKiAqbWFwKikNCiAg ICAgIChkZXNjcmliZS1mbG9vciAqbG9jYXRpb24qICpvYmplY3RzKiAqb2JqZWN0LWxvY2F0aW9u cyopKSkNCihsb29rKQ0KICAgICAgICAgICAgRU9GDQogICAgICAgICAgICBhc3NlcnRfZXF1YWwo JXd7eW91IGFyZSBpbiB0aGUgbGl2aW5nLXJvb20gb2YgYSB3aXphcmQncyBob3VzZS4gDQogICAg dGhlcmUgaXMgYSB3aXphcmQgc25vcmluZyBsb3VkbHkgb24gdGhlIGNvdWNoLiANCiAgICB0aGVy ZSBpcyBhIGRvb3IgZ29pbmcgd2VzdCBmcm9tIGhlcmUuIA0KICAgIHRoZXJlIGlzIGEgc3RhaXJ3 YXkgZ29pbmcgdXBzdGFpcnMgZnJvbSBoZXJlLiANCiAgICB5b3Ugc2VlIGEgd2hpc2tleS1ib3R0 bGUgb24gdGhlIGZsb29yLiANCiAgICB5b3Ugc2VlIGEgYnVja2V0IG9uIHRoZSBmbG9vci59LCBy ZXN1bHQpICAgICAgICANCiAgICAgICAgICAgIHJlc3VsdCA9IEBvLmxpc3AoPDwtRU9GKQ0KKGRl ZnVuIHdhbGstZGlyZWN0aW9uIChkaXJlY3Rpb24pDQogIChsZXQgKChuZXh0IChhc3NvYyBkaXJl Y3Rpb24gKGNkZHIgKGFzc29jICpsb2NhdGlvbiogKm1hcCopKSkpKQ0KICAgIChjb25kIChuZXh0 IChzZXRmICpsb2NhdGlvbiogKHRoaXJkIG5leHQpKSAobG9vaykpDQogICAgICAodCAnKHlvdSBj YW50IGdvIHRoYXQgd2F5LikpKSkpDQood2Fsay1kaXJlY3Rpb24gJ3dlc3QpDQogICAgICAgICAg ICBFT0YNCiAgICAgICAgICAgIGFzc2VydF9lcXVhbCgld3t5b3UgYXJlIGluIGEgYmVhdXRpZnVs IGdhcmRlbi4gDQogICAgdGhlcmUgaXMgYSB3ZWxsIGluIGZyb250IG9mIHlvdS4gDQogICAgdGhl cmUgaXMgYSBkb29yIGdvaW5nIGVhc3QgZnJvbSBoZXJlLiANCiAgICB5b3Ugc2VlIGEgY2hhaW4g b24gdGhlIGZsb29yLiANCiAgICB5b3Ugc2VlIGEgZnJvZyBvbiB0aGUgZmxvb3IufSwgcmVzdWx0 KQ0KICAgICAgICAgICAgcmVzdWx0ID0gQG8ubGlzcCg8PC1FT0YpDQooZGVmbWFjcm8gZGVmc3Bl bCAoJnJlc3QgcmVzdCkgYChkZWZtYWNybyAsQHJlc3QpKSAgICAgICAgDQooZGVmc3BlbCB3YWxr IChkaXJlY3Rpb24pDQogIGAod2Fsay1kaXJlY3Rpb24gJyxkaXJlY3Rpb24pKSAgICAgICAgDQoo d2FsayBlYXN0KQ0KICAgICAgICAgICAgRU9GDQogICAgICAgICAgICBhc3NlcnRfZXF1YWwoJXd7 eW91IGFyZSBpbiB0aGUgbGl2aW5nLXJvb20gb2YgYSB3aXphcmQncyBob3VzZS4NCiAgICB0aGVy ZSBpcyBhIHdpemFyZCBzbm9yaW5nIGxvdWRseSBvbiB0aGUgY291Y2guDQogICAgdGhlcmUgaXMg YSBkb29yIGdvaW5nIHdlc3QgZnJvbSBoZXJlLg0KICAgIHRoZXJlIGlzIGEgc3RhaXJ3YXkgZ29p bmcgdXBzdGFpcnMgZnJvbSBoZXJlLg0KICAgIHlvdSBzZWUgYSB3aGlza2V5LWJvdHRsZSBvbiB0 aGUgZmxvb3IuDQogICAgeW91IHNlZSBhIGJ1Y2tldCBvbiB0aGUgZmxvb3IufSwgcmVzdWx0KQ0K ICAgICAgICAgICAgcmVzdWx0ID0gQG8ubGlzcCg8PC1FT0YpDQooZGVmdW4gcGlja3VwLW9iamVj dCAob2JqZWN0KQ0KICAoY29uZCAoKGlzLWF0IG9iamVjdCAqbG9jYXRpb24qICpvYmplY3QtbG9j YXRpb25zKikgKHB1c2ggKGxpc3Qgb2JqZWN0ICdib2R5KSAqb2JqZWN0LWxvY2F0aW9ucyopDQog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgKHlvdSBhcmUgbm93IGNhcnJ5aW5nIHRoZSAs b2JqZWN0KSkNCiAgICAodCAnKHlvdSBjYW5ub3QgZ2V0IHRoYXQuKSkpKQ0KKGRlZnNwZWwgcGlj a3VwIChvYmplY3QpDQogIGAocGlja3VwLW9iamVjdCAnLG9iamVjdCkpICAgIA0KKHBpY2t1cCB3 aGlza2V5LWJvdHRsZSkNCiAgICAgICAgICAgIEVPRg0KICAgICAgICAgICAgYXNzZXJ0X2VxdWFs KCV3e3lvdSBhcmUgbm93IGNhcnJ5aW5nIHRoZSB3aGlza2V5LWJvdHRsZX0sIHJlc3VsdCkNCiAg ICAgICAgICAgIHJlc3VsdCA9IEBvLmxpc3AoPDwtRU9GKQ0KICAgIChkZWZ1biBpbnZlbnRvcnkg KCkNCiAgICAgIChyZW1vdmUtaWYtbm90IChsYW1iZGEgKHgpDQogICAgICAgICAgICAgICAoaXMt YXQgeCAnYm9keSAqb2JqZWN0LWxvY2F0aW9ucyopKQ0KICAgICAgICAgICAgICpvYmplY3RzKikp DQogICAgKGRlZnVuIGhhdmUgKG9iamVjdCkNCiAgICAgIChtZW1iZXIgb2JqZWN0IChpbnZlbnRv cnkpKSkNCiAgICAoc2V0ZiAqY2hhaW4td2VsZGVkKiBuaWwpDQogICAgDQogICAgKGRlZnVuIHdl bGQgKHN1YmplY3Qgb2JqZWN0KQ0KICAgICAgKGNvbmQgKChhbmQgKGVxICpsb2NhdGlvbiogJ2F0 dGljKQ0KICAgICAgICAgICAgICAoZXEgc3ViamVjdCAnY2hhaW4pDQogICAgICAgICAgICAgIChl cSBvYmplY3QgJ2J1Y2tldCkNCiAgICAgICAgICAgICAgKGhhdmUgJ2NoYWluKQ0KICAgICAgICAg ICAgICAoaGF2ZSAnYnVja2V0KQ0KICAgICAgICAgICAgICAobm90ICpjaGFpbi13ZWxkZWQqKSkN CiAgICAgICAgIChzZXRmICpjaGFpbi13ZWxkZWQqICd0KQ0KICAgICAgICAgJyh0aGUgY2hhaW4g aXMgbm93IHNlY3VyZWx5IHdlbGRlZCB0byB0aGUgYnVja2V0LikpDQogICAgICAgICh0ICcoeW91 IGNhbm5vdCB3ZWxkIGxpa2UgdGhhdC4pKSkpICANCiAgICAod2VsZCAnY2hhaW4gJ2J1Y2tldCkg ICAgDQogICAgICAgICAgICBFT0YNCiAgICAgICAgICAgIGFzc2VydF9lcXVhbCgld3t5b3UgY2Fu bm90IHdlbGQgbGlrZSB0aGF0Ln0sIHJlc3VsdCkgICAgICAgIA0KICAgICAgICAgICAgcmVzdWx0 ID0gQG8ubGlzcCg8PC1FT0YpDQogICAgKHNldGYgKmJ1Y2tldC1maWxsZWQqIG5pbCkNCiAgICAN CiAgICAoZGVmdW4gZHVuayAoc3ViamVjdCBvYmplY3QpDQogICAgICAoY29uZCAoKGFuZCAoZXEg KmxvY2F0aW9uKiAnZ2FyZGVuKQ0KICAgICAgICAgICAgICAoZXEgc3ViamVjdCAnYnVja2V0KQ0K ICAgICAgICAgICAgICAoZXEgb2JqZWN0ICd3ZWxsKQ0KICAgICAgICAgICAgICAoaGF2ZSAnYnVj a2V0KQ0KICAgICAgICAgICAgICAqY2hhaW4td2VsZGVkKikNCiAgICAgICAgIChzZXRmICpidWNr ZXQtZmlsbGVkKiAndCkgJyh0aGUgYnVja2V0IGlzIG5vdyBmdWxsIG9mIHdhdGVyKSkNCiAgICAg ICAgKHQgJyh5b3UgY2Fubm90IGR1bmsgbGlrZSB0aGF0LikpKSkNCiAgICAoZGVmc3BlbCBnYW1l LWFjdGlvbiAoY29tbWFuZCBzdWJqIG9iaiBwbGFjZSAmcmVzdCByZXN0KQ0KICAgICAgYChkZWZz cGVsICxjb21tYW5kIChzdWJqZWN0IG9iamVjdCkNCiAgICAgICAgIGAoY29uZCAoKGFuZCAoZXEg KmxvY2F0aW9uKiAnLCcscGxhY2UpDQogICAgICAgICAgICAgIChlcSAnLHN1YmplY3QgJywnLHN1 YmopDQogICAgICAgICAgICAgIChlcSAnLG9iamVjdCAnLCcsb2JqKQ0KICAgICAgICAgICAgICAo aGF2ZSAnLCcsc3ViaikpDQogICAgICAgICAgICAgLEAnLHJlc3QpDQogICAgICAgICAgICAodCAn KGkgY2FudCAsJyxjb21tYW5kIGxpa2UgdGhhdC4pKSkpKQ0KICAgIA0KICAgIChnYW1lLWFjdGlv biB3ZWxkIGNoYWluIGJ1Y2tldCBhdHRpYw0KICAgICAgICAgICAgIChjb25kICgoYW5kIChoYXZl ICdidWNrZXQpIChzZXRmICpjaGFpbi13ZWxkZWQqICd0KSkgJyh0aGUgY2hhaW4gaXMgbm93IHNl Y3VyZWx5IHdlbGRlZCB0byB0aGUgYnVja2V0LikpDQogICAgICAgICAgICAgICAodCAnKHlvdSBk byBub3QgaGF2ZSBhIGJ1Y2tldC4pKSkpDQogICAgDQogICAgKGdhbWUtYWN0aW9uIGR1bmsgYnVj a2V0IHdlbGwgZ2FyZGVuDQogICAgICAgICAgICAgKGNvbmQgKCpjaGFpbi13ZWxkZWQqIChzZXRm ICpidWNrZXQtZmlsbGVkKiAndCkgJyh0aGUgYnVja2V0IGlzIG5vdyBmdWxsIG9mIHdhdGVyKSkN CiAgICAgICAgICAgICAgICh0ICcodGhlIHdhdGVyIGxldmVsIGlzIHRvbyBsb3cgdG8gcmVhY2gu KSkpKQ0KICAgIA0KICAgIChnYW1lLWFjdGlvbiBzcGxhc2ggYnVja2V0IHdpemFyZCBsaXZpbmct cm9vbQ0KICAgICAgICAgICAgIChjb25kICgobm90ICpidWNrZXQtZmlsbGVkKikgJyh0aGUgYnVj a2V0IGhhcyBub3RoaW5nIGluIGl0LikpDQogICAgICAgICAgICAgICAoKGhhdmUgJ2Zyb2cpICco dGhlIHdpemFyZCBhd2FrZW5zIGFuZCBzZWVzIHRoYXQgeW91IHN0b2xlIGhpcyBmcm9nLiBoZSBp cyBzbyB1cHNldCBoZSBiYW5pc2hlcyB5b3UgdG8gdGhlIG5ldGhlcndvcmxkcy0geW91IGxvc2Uh IHRoZSBlbmQuKSkNCiAgICAgICAgICAgICAgICh0ICcodGhlIHdpemFyZCBhd2FrZW5zIGZyb20g aGlzIHNsdW1iZXIgYW5kIGdyZWV0cyB5b3Ugd2FybWx5LiBoZSBoYW5kcyB5b3UgdGhlIG1hZ2lj IGxvdy1jYXJiIGRvbnV0LSB5b3Ugd2luISB0aGUgZW5kLikpKSkNCiAgICANCiAgICAod2VsZCBj aGFpbiBidWNrZXQpICAgICAgICAgICANCiAgICAgICAgICAgIEVPRg0KICAgICAgICAgICAgYXNz ZXJ0X2VxdWFsKCV3e2kgY2FudCB3ZWxkIGxpa2UgdGhhdC59LCByZXN1bHQpICAgICAgICANCiAg ICAgICAgZW5kICAgIA0KICAgIGVuZCAgICANCmVuZA== ------_=_NextPart_001_01C5C985.8409652E Content-Type: application/octet-stream; name="quiz_49_lisp.rb" Content-Transfer-Encoding: base64 Content-Description: quiz_49_lisp.rb Content-Disposition: attachment; filename="quiz_49_lisp.rb" cmVxdWlyZSAnbGlzcCcNCg0KbGlzcCA9IE9iamVjdC5uZXcNCmxpc3AuZXh0ZW5kKExpc3ApDQps aXNwLmV4dGVuZChMaXNwOjpTdGFuZGFyZEZ1bmN0aW9ucykNCg0KcmVxdWlyZSAnb3Blbi11cmkn DQpyZXF1aXJlICdmaXhfcHJveHkucmInDQoNCm9wZW4oImh0dHA6Ly93d3cubGlzcGVyYXRpLmNv bS9jb2RlLmh0bWwiKSB7IHxmfA0KCWlucHV0ID0gZi5yZWFkbGluZXMuam9pbi5nc3ViKC88W14+ XSo+LywgIiIpDQoJI3B1dHMgaW5wdXQNCglsaXNwLmxpc3AoaW5wdXQpDQp9DQoNCmNvbW1hbmRz ID0gWw0KCVsiKHBpY2t1cCB3aGlza2V5LWJvdHRsZSkiLCAiKFlPVSBBUkUgTk9XIENBUlJZSU5H IFRIRSBXSElTS0VZLUJPVFRMRSkiXQ0KXQ0Kb3BlbigiaHR0cDovL3d3dy5saXNwZXJhdGkuY29t L2NoZWF0Lmh0bWwiKSB7IHxmfA0KCWYuZWFjaCB7IHxsaW5lfA0KCQlsaW5lLmNob21wIQ0KCQls aW5lLmdzdWIhKCI8YnI+IiwiIikNCgkJaWYgL14+KC4qKS8gPT09IGxpbmUNCgkJCWxpbmUgPSAk MQ0KCQkJbGluZS5nc3ViISgiV2FsayIsICJ3YWxrIikgI2J1ZyBpbiBpbnB1dA0KCQkJY29tbWFu ZHMgPDwgW2xpbmUsICIiXQ0KCQllbHNlDQoJCQlsaW5lLmdzdWIhKCJXSVpBUkRTIiwgIldJWkFS RCdTIikgI2J1ZyBpbiBpbnB1dA0KCQkJbGluZS5nc3ViISgiQVRUSUMgT0YgVEhFIFdJWkFSRCdT IiwgIkFUVElDIE9GIFRIRSBBQkFORE9ORUQiKSAjYnVnIGluIGlucHV0DQoJCQljb21tYW5kc1st MV1bMV0gPDwgbGluZQ0KCQllbmQNCgl9DQp9DQpjb21tYW5kcy5lYWNoIGRvIHxjfA0KCXB1dHMg Y1swXQ0KCXJlc3VsdCA9IGxpc3AubGlzcChjWzBdKQ0KCXJlc3VsdCA9IHJlc3VsdC50b19saXNw LnVwY2FzZQ0KCXVubGVzcyByZXN1bHQgPT0gY1sxXQ0KCQlwdXRzICJXcm9uZyEiDQoJCXAgcmVz dWx0DQoJCXAgY1sxXQ0KCQlicmVhaw0KCWVuZA0KZW5kDQoNCg0KDQo= ------_=_NextPart_001_01C5C985.8409652E--