From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 004A87EEE8 for ; Tue, 12 May 2020 09:45:39 +0200 (CEST) Authentication-Results: mail3-smtp-sop.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=tH0r=62=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=tH0r=62=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of SRS0=tH0r=62=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=tH0r=62=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=tH0r=62=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=tH0r=62=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1" IronPort-PHdr: =?us-ascii?q?9a23=3ASTpFXhcT/gwfUmUOxNu2dqiulGMj4u6mDksu8pMi?= =?us-ascii?q?zoh2WeGdxc25ZxyN2/xhgRfzUJnB7Loc0qyK6v2mCDVLuMzY+Fk5M7V0Hycfjs?= =?us-ascii?q?sXmwFySOWkMmbcaMDQUiohAc5ZX0Vk9XzoeWJcGcL5ekGA6ibqtW1aFRrwLxd6?= =?us-ascii?q?KfroEYDOkcu3y/qy+5rOaAlUmTaxe7x/IAi2oAnLssQanIRuJrsvxhfUv3BFZ/?= =?us-ascii?q?lYyWR0KFyJgh3y/N2w/Jlt8yRRv/Iu6ctNWrjkcqo7ULJVEi0oP3g668P3uxbD?= =?us-ascii?q?SxCP5mYHXWUNjhVIGQnF4wrkUZr3ryD3q/By2CiePc3xULA0RTGv5LplRRP0lC?= =?us-ascii?q?sKMSMy/2bKhMxtl6JbuAyuqABjw4DaZ4GVMeBxfqLbfdgHQWZMUcJcWylHD4+8?= =?us-ascii?q?bIUPCfQBPedDr4n8vFQOqQWxDhSiBePo0D9Hm2T21rA+3+kvDQ3K2QotFM8Mvn?= =?us-ascii?q?vJttX4LKccX/6owqfGzjvMYO9Z1Czn54TUaB0su+2AUa5yfMfX1EIhFxnFjlKV?= =?us-ascii?q?qYH9Iz6V0v4Cs26G5OR9Se2vi2snqwBtojiz28whjZPGhoYPxVDC7yl525o6Jd?= =?us-ascii?q?29SE56fd6kDIBdtzmdN4tyQsIiX39ntzo6yr0AuJ67ZTUKx4o9yx7YcfyHfJGF?= =?us-ascii?q?7xT+X+mePTl2nmhqeK6jhxms60igzPXxW8m73VpWrCdIjMXBu24T2hDP6MWKRe?= =?us-ascii?q?Zx8luh1zuT1w3e6P1JLE43mKfaJJAswaA8mJUSvEndAyL6hEX4gq+Ye0gi5+Om?= =?us-ascii?q?5ePnYrD8qZ+dMY95khn+Pboymsy+HeQ3LBAOX2+e+eS5yrLv50v5T6tWjvEula?= =?us-ascii?q?nWrIrVJcEfpqKjBA9VyIkj5w6wDzenzNQYnWQHI0lfdB2biIjpPknCIP/5Dfej?= =?us-ascii?q?h1Sjiixky+raMb3mB5XBNmXDn6vhfbZ890FT0gUzzddF651KF74BPer/Wk73tN?= =?us-ascii?q?zCDx82KRa4w+j9CNll2YMeWH6PAq+EMKzJq1OE/P4gI+6JZIMNpjb9KuMl5+P0?= =?us-ascii?q?gn89gl8dYbSp0oYWaHC/BPhpP0KZYX/0jtcOEGcKogo+TPHxh1GYUD5TYG6+X6?= =?us-ascii?q?Mh6TA7DIKmCZ3PRoe3gLyO2iqwA55YZnheB1yRD3vlc5+IV+oQZC+dOMNsnCAI?= =?us-ascii?q?WaKvRoIuzR2jtgz3x6B5Iufb5CEUr4/v2ddv6+HOmhw+6Tp5BNmH3W6XVWF7hG?= =?us-ascii?q?YISic23K9hpUx9zU+O0a13gvBFD9BT//RJUgM6NJ7A0eN1F9DyWgTAfteQVVap?= =?us-ascii?q?XM+qATYrTtI+29MOYkB9FMu+jh3bwiamHbsYm6aWCJAo/a/QxXb8K9pnx3vI26?= =?us-ascii?q?Qtl1wmTdFONW2iiK5/7Q/TB4vRnkuEi6ikaLgQ0TbR9GmB0WaOpllVXQ9uXajd?= =?us-ascii?q?RXAfYU/WrNTl5kzcU7CuCbInMgpYyc6fNKRGcNrpjU9JRPr7ItveZ3i+m2GqCR?= =?us-ascii?q?aT2ryMbI/qe2QB3CXBE0ULiAcT/WuANQciGCihuHjSDDlhGFPgeU/s9vN+qHyj?= =?us-ascii?q?Qk8u0w6Kd1Fh16ay+hMNmfOTUfYT3rYdtCclqjV0B0q90snNC9uAogphZL9Tbc?= =?us-ascii?q?k84FdBz2LZthZyMoauL6B41RYidFE9u1zonV0jDppGucw1qjUswRYkberS20xH?= =?us-ascii?q?PXvQiZvvPJXTK3Lu51auZ7/S3hfZytnAvu8E4fE87lHipx2BF0w48nwh3cMRm3?= =?us-ascii?q?Cb443iCAsJTYm3VVw99gRzo7/dcm8w+tD6z3ppZICwuzmK4NkpAeo51l70dtNW?= =?us-ascii?q?NuWfHw/3EtEGL9CpLP02llOpaBMdIe0U87Q7aZD1P8Ca0bKmab4z1Amtin5Ktd?= =?us-ascii?q?8sixPex29HUufNmq097bSd1wqDWS37iQ7+4MrwhIZPaCpUGzavjy/+C9wIP/Eg?= =?us-ascii?q?TcMwEW6rZvaP6JBmnZe0CixA81qyG14N2MmoYAefKVvn0l8JjBlFkTmcgSK9ig?= =?us-ascii?q?dMvXQpo66YhnecxvS7MgIAPn9XSWJii1b1PIXyiMoVDhGl?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0D8BgCuU7pehyIeaIFmg3WBFgFdVTIsg?= =?us-ascii?q?2RAgV2HJIV5hR+FMpJJA1APAQMBDBgBBQ4BAgQBAYMOgTYCF4F4HQYBBTMTAhA?= =?us-ascii?q?BAQUBAQECAQIDBAETAQEBCgsJCCmFMQgkDII7DAwDA4MgAQoOCQQGOwQBCRwjA?= =?us-ascii?q?wwIAQYDAgQNARcBFAoXARIUBoMMAYJ8BAEKkzSbeX8zhDoBAwMCCwMBDgkmhBG?= =?us-ascii?q?BQA0CE4EWhSyDHYN7D4FMP4ERgmJsgk4OCwEBAQEBGYEGIQEBCE4ZgkWCYASOI?= =?us-ascii?q?y0kaYgziDyCD5AQB4JNfwSGI3WFf4QFhiaCXIEOh1mRdyGPfIcudYE3hVWOI4E?= =?us-ascii?q?/KoFHHgwHMxowIiGCNQEBATEJXw1WjGGCXwEFMBeDT2pUgSaBdTuFRD8zAgEBA?= =?us-ascii?q?TICBgEHAQEDCXUBAQUTCwGLSYIfAQE?= X-IPAS-Result: =?us-ascii?q?A0D8BgCuU7pehyIeaIFmg3WBFgFdVTIsg2RAgV2HJIV5hR+?= =?us-ascii?q?FMpJJA1APAQMBDBgBBQ4BAgQBAYMOgTYCF4F4HQYBBTMTAhABAQUBAQECAQIDB?= =?us-ascii?q?AETAQEBCgsJCCmFMQgkDII7DAwDA4MgAQoOCQQGOwQBCRwjAwwIAQYDAgQNARc?= =?us-ascii?q?BFAoXARIUBoMMAYJ8BAEKkzSbeX8zhDoBAwMCCwMBDgkmhBGBQA0CE4EWhSyDH?= =?us-ascii?q?YN7D4FMP4ERgmJsgk4OCwEBAQEBGYEGIQEBCE4ZgkWCYASOIy0kaYgziDyCD5A?= =?us-ascii?q?QB4JNfwSGI3WFf4QFhiaCXIEOh1mRdyGPfIcudYE3hVWOI4E/KoFHHgwHMxowI?= =?us-ascii?q?iGCNQEBATEJXw1WjGGCXwEFMBeDT2pUgSaBdTuFRD8zAgEBATICBgEHAQEDCXU?= =?us-ascii?q?BAQUTCwGLSYIfAQE?= X-IronPort-AV: E=Sophos;i="5.73,383,1583190000"; d="scan'208,217";a="348368842" X-MGA-submission: =?us-ascii?q?MDHWoUukpS6tm23xTMiglys3FUaZWfIs8B/1Kk?= =?us-ascii?q?FbWrRJAJVfb9ASU2fAuTpfwO0V45Z7uAKhTQ2yhAzvlSSZhKrVNA03VF?= =?us-ascii?q?B6eDfstrajIYUfoHEitbfIAUefmLlwFMowNWsKIs7NNVLjANSyFV3hEi?= =?us-ascii?q?opQ4qmcMWGtgIe+oNKxdsIpg=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 12 May 2020 09:45:29 +0200 Received: from set (cbg35-2-78-242-14-140.fbx.proxad.net [78.242.14.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 17B3F565712; Tue, 12 May 2020 09:45:27 +0200 (CEST) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr, comp@lists.orbitalfox.eu Date: Tue, 12 May 2020 09:45:26 +0200 Message-ID: <87h7wl38bt.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue May 12 09:45:27 2020 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.072187, queueID=820F45657A7 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdz LCBmb3IgdGhlIHdlZWsgb2YgTWF5IDA1IHRvIDEyLA0KMjAyMC4NCg0KVGFi bGUgb2YgQ29udGVudHMNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQpMb29raW5nIGZvciAibG92ZWx5 LCBpZGlvbWF0aWMiIGV4YW1wbGVzIG9mIE9jYW1sIHVzZWQgZm9yIHNoZWxs LXNjcmlwdGluZyBpbiB0aGUgbWFubmVyIG9mIFBlcmwvUHl0aG9uIChidXQg ZXNwLiBQZXJsKQ0KQXJlIHRoZXJlIGxlYXJuaW5nIG1hdGVyaWFscyBmb3Ig T0NhbWwgZm9yIHRob3NlIHdpdGggbm8gcHJvZ3JhbW1pbmcgZXhwZXJpZW5j ZT8NCkR1bmUgbWVldGluZyBub3Rlcw0KT0NhbWwgNC4xMS4wLCBmaXJzdCBh bHBoYSByZWxlYXNlDQpPQ2FtbCBVc2VycyBhbmQgRGV2ZWxvcGVycyBNZWV0 aW5nIDIwMjANClZTQ29kZSBQbGF0Zm9ybSBQbHVnaW4gMC41LjANCk90aGVy IE9DYW1sIE5ld3MNCk9sZCBDV04NCg0KDQpMb29raW5nIGZvciAibG92ZWx5 LCBpZGlvbWF0aWMiIGV4YW1wbGVzIG9mIE9jYW1sIHVzZWQgZm9yIHNoZWxs LXNjcmlwdGluZyBpbiB0aGUgbWFubmVyIG9mIFBlcmwvUHl0aG9uIChidXQg ZXNwLiBQZXJsKQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgW2h0dHBzOi8vZGlzY3Vzcy5v Y2FtbC5vcmcvdC9sb29raW5nLWZvci1sb3ZlbHktaWRpb21hdGljLWV4YW1w bGVzLW9mLW9jYW1sLXVzZWQtZm9yLXNoZWxsLXNjcmlwdGluZy1pbi10aGUt bWFubmVyLW9mLXBlcmwtcHl0aG9uLWJ1dC1lc3AtcGVybC81NzAzLzEzXQ0K DQoNCkNvbnRpbnVpbmcgdGhpcyB0aHJlYWQsIENoZXQgTXVydGh5IHNhaWQg YW5kIEFhcm9uIEwuIFplbmcgcmVwbGllZA0K4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA DQoNCiAgICAgICAg4oCiIG5lZWRzIHRvIGJlIE9jYW1sIGNvZGUsIG5vdCBh biBpbnRlcnByZXRlci4gSSBtZWFuLCBpZg0KICAgICAgICAgIEnigJltIG5v dCBnb2luZyB0byB3cml0ZSBpdCBpbiBPY2FtbCwgSSBtaWdodCBhcyB3ZWxs DQogICAgICAgICAgd3JpdGUgaW4gUGVybCwgeWVzPw0KDQogIEkgdGhpbmsg c2hleHAgbWlnaHQgZGVzZXJ2ZSBhbm90aGVyIGxvb2suICBJdCdzIG5vdCBh biBpbnRlcnByZXRlciBmb3INCiAgYSBzZXhwLWJhc2VkIHNoZWxsIGxhbmd1 YWdlLCBhcyBpdHMgbmFtZSBtaWdodCB1bmZvcnR1bmF0ZWx5DQogIGRlY2Vp dmluZ2x5IHN1Z2dlc3QuICBJdCdzIHJlYWxseSBhIERTTCBmb3IgY29uc3Ry dWN0aW5nIHNoZWxsDQogIHBpcGVsaW5lcyB1c2luZyBhIGAnYSBQcm9jZXNz LnQnIG1vbmFkLiAgVGhlIHMtZXhwcmVzc2lvbiBwYXJ0IGlzDQogIGFkdmVy dGlzaW5nIHRoYXQgeW91IGNhbiBkZWJ1ZyBhbmQgdHJhY2UgdGhlIGFjdGlv bnMgcGVyZm9ybWVkIHVzaW5nDQogIHMtZXhwcmVzc2lvbnMuDQoNCiAgICAg ICAgVGhlIHNlY29uZC1tb3N0LWltcG9ydGFudCBwYXJ0IG9mIFBlcmwvQmFz aCBzY3JpcHRpbmcgaXMNCiAgICAgICAgc3RyaW5nLWhhbmRsaW5nLiBBbmQg aXTigJlzIGNlcnRhaW5seSB0aGUgcGFydCBvZiBPY2FtbA0KICAgICAgICB0 aGF04oCZcyBtb3N0IHBhaW5mdWwgd2hlbiB3cml0aW5nIHNjcmlwdHMuIExl dOKAmXMgc3RpcHVsYXRlDQogICAgICAgIHRoYXQgdGhlcmUgYXJlIG5pY2Ug bGlicmFyaWVzIHRvIG1ha2UgdGhpcyBlYXN5LiBJ4oCZbSBhbg0KICAgICAg ICBPY2FtbCBiaWdvdCwgSSBoYXZlIHRvIGJlbGlldmUgdGhpcyBhbnl3YXkg KmdyaW4qIC4gVGhpcw0KICAgICAgICBsaWJyYXJ5IGRvZXNu4oCZdCBzZWVt IHRvIHVzZSAnZW0sIG5vciBjaG9vc2UvcHJvbW90ZSBhDQogICAgICAgIHBh cnRpY3VsYXIgc2V0IG9mIHN1Y2ggbGlicmFyaWVzLg0KDQogIEkndmUgZm91 bmQgW0Jhc2VdIHBsdXMgW1JlXSB0byBiZSBzdWZmaWNpZW50IGZvciBtb3N0 IG9mIG15DQogIHN0cmluZy1tYW5pcHVsYXRpb24gbmVlZHMuICBJdCdzIG5l dmVyIGdvaW5nIHRvIGJlIGFzIGNvbmNpc2UgYXMNCiAgUGVybCdzIGJ1aWx0 LWluICJtYWdpYyIgc3VwcG9ydCBmb3IgcmVnZXhwcywgYnV0IHlvdSBnYWlu IGV4cGxpY2l0bmVzcw0KICBhbmQgY2xhcml0eSwgd2hpY2ggaXMgcGFydCBv ZiB0aGUgYmVuZWZpdCBvZiBPQ2FtbCBhbnl3YXkuDQoNCg0KW0Jhc2VdIGh0 dHBzOi8vZ2l0aHViLmNvbS9qYW5lc3RyZWV0L2Jhc2UvDQoNCltSZV0gaHR0 cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLXJlDQoNCg0KQ2hldCBNdXJ0 aHkgc2FpZCBhbmQgRG9ubiBDYXZlIHJlcGxpZWQNCuKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgA0KDQogICAgICAgIEl04oCZcyBub3QgYXMgdHJpdmlhbCBp biBPY2FtbCwgZm9yIG1hbnkgY29tcGxpY2F0ZWQgcmVhc29ucw0KICAgICAg ICB0aGF0IGJvaWwgZG93biB0byDigJxnZWUsIHN0cmluZy1oYW5kbGluZyBp cyBhIFBJVEHigJ0uDQoNCiAgUmVhbGx5PyAgaGFkbid0IG5vdGljZWQuICBI YSBoYS4NCg0KICBJIGNvdWxkIG5ldmVyIHJlYWxseSBnZXQgdXJnZSBmb3Ig UGVybCwgYnV0IEkgdXNlIGl0cyBhbmNlc3RvciBhd2sgYQ0KICBsb3QsIGFu ZCBJJ20gdHJ5aW5nIG91dCBzb21lIGF3ay1saWtlIHNpbXBsZSBzdHJpbmcg ZnVuY3Rpb25zLCBsaWtlDQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBs ZXQgc3RybGVuID0gU3RyaW5nLmxlbmd0aA0KICDilIIgbGV0IHN1YiBzIGkg biA9IGxldCBiID0gc3RybGVuIHMNCiAg4pSCICAgICAgaW4gaWYgaSA8IGIN CiAg4pSCIAkgdGhlbiBsZXQgbiA9IG1pbiBuIChiIC0gaSkNCiAg4pSCIAkg aW4gU3RyaW5nLnN1YiBzIGkgbg0KICDilIIgICAgIGVsc2UgIiINCiAg4pSC ICgqIHN1YnN0cmluZyB0byBlbmQgb2YgbGluZSAqKQ0KICDilIIgbGV0IHN1 YnN0ciBhIGkgPSBpZiBpIDwgc3RybGVuIGENCiAg4pSCICAgICAgdGhlbiBT dHJpbmcuc3ViIGEgaSAoKHN0cmxlbiBhKSAtIGkpDQogIOKUgiAgICAgIGVs c2UgIiINCiAg4pSCIGxldCBtYXRjaHJlIHQgcyA9IHRyeQ0KICDilIIgICAg ICBTdHIuc2VhcmNoX2ZvcndhcmQgdCBzIDANCiAg4pSCICAgICAgd2l0aCB8 IE5vdF9mb3VuZCAtPiAtMQ0KICDilJTilIDilIDilIDilIANCg0KICBldGMu DQoNCiAgU28gIm9wZW4gQXdrIiBnZXRzIG1lIGEgaGFuZGZ1bCBvZiBtb3Jl IGJhc2ljIHZhcmlhdGlvbnMgb24gY29tbW9uDQogIHN0cmluZyBmdW5jdGlv bnMsIHdpdGggbGVzcyBlbGFib3JhdGUgcGFyYW1ldGVycywgbm8gbm9ybWFs DQogIGV4Y2VwdGlvbnMsIGV0Yy4gIEluY2x1ZGluZyBhIGxpbmUgYnkgbGlu ZSBmaWxlIHByb2Nlc3NpbmcgZnVuY3Rpb24uDQogIEkgaGF2ZSBqdXN0IG5l d2x5IHN0YXJ0ZWQgb24gdGhpcyBhbmQgaGF2ZW4ndCB1c2VkIGl0IGV4dGVu c2l2ZWx5LCBidXQNCiAgaXQgc2VlbXMgZmFpcmx5IHByb21pc2luZy4gIE5v IHdhY2t5IHN5bnRheCBvciBoeXBlciBpbnRlbGxpZ2VudA0KICBzdHJpbmcg cHJvY2Vzc2luZywgbm8gcGFja2FnZXMsIGp1c3QgYSBmZXcgZG96ZW4gbGlu ZXMgb2YgY2hlYXRlcg0KICBmdW5jdGlvbnMuDQoNCiAgIkF3ayIgaXMgYSBt aXNub21lciwgaW4gdGhhdCB0aGVyZSdzIGxpdHRsZSBjb3JyZXNwb25kZW5j ZSBiZXR3ZWVuDQogIHRoaXMgYW5kIGF3aywgaXQgd2FzIGp1c3Qgd2hhdCBp bnNwaXJlZCBtZSB0byB0cnkgaXQuDQoNCg0KUmFwaGHDq2wgUHJvdXN0IHNh aWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgA0KDQogIEkgZG9uJ3QgdGhpbmsgaXQncyBsb3Zl bHkgYW5kIEkgaGF2ZSBubyBpZGVhIGlmIGl0IGlzIGlkaW9tYXRpYywgYnV0 IEkNCiAgbWFkZSBhIGZldyBzY3JpcHRzIG9mIG15IG93biBpbiBPQ2FtbCB1 c2luZyB0aGUgc2FtZSBsaWJyYXJ5IHRoYXQNCiAgb3RoZXIgbWVudGlvbmVk OiBgYm9zJw0KDQogIOKAoiBbdHlwZXBhc3NdIHVzZXMgYHhkb3Rvb2wnIHRv IHR5cGUgcGFzc3dvcmRzIGZyb20gdGhlIGBwYXNzd29yZCcNCiAgICBwYXNz d29yZCBtYW5hZ2VyDQogIOKAoiBbY29ubl0gd3JhcHMgYHdwYV9zdXBwbGlj YW50JywgYGRoY3BjZCcsIGBpcCcsIGFuZCBvdGhlciBuZXR3b3JrDQogICAg bWFuYWdlbWVudCBDTEkNCiAg4oCiIFtsYXB0b3Atc3RhdHVzXSBmZXRjaGVz IHN0YXR1cyBpbmZvcm1hdGlvbiBmb3IgbGFwdG9wcyAoZS5nLiwNCiAgICBi YXR0ZXJ5IGxldmVsKSBhbmQgcHJpbnRzIGl0IGluIGEgbmljZWx5IGZvcm1h dHRlZCBmb3JtDQogIOKAoiBbYmFrZWxpdGVdIGluY3JlYXNlcyBvciBkZWNy ZWFzZXMgc2NyZWVuIGJyaWdodG5lc3MNCg0KDQpbdHlwZXBhc3NdIGh0dHBz Oi8vZ2l0bGFiLmNvbS9yYXBoYWVsLXByb3VzdC90eXBlcGFzcw0KDQpbY29u bl0gaHR0cHM6Ly9naXRsYWIuY29tL3JhcGhhZWwtcHJvdXN0L2Nvbm4NCg0K W2xhcHRvcC1zdGF0dXNdIGh0dHBzOi8vZ2l0bGFiLmNvbS9yYXBoYWVsLXBy b3VzdC9sYXB0b3Atc3RhdHVzDQoNCltiYWtlbGl0ZV0gaHR0cHM6Ly9naXRs YWIuY29tL3JhcGhhZWwtcHJvdXN0L2Jha2VsaXRlDQoNCg0KVmFzaWxlIFJv dGFydSBhbHNvIHNhaWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQog IFtodHRwczovL2dpdGh1Yi5jb20vaGFtbWVybGFiL2dlbnNwaW9dDQoNCg0K R2FicmllbCBSYWRhbm5lIGFsc28gc2FpZA0K4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSADQoNCiAgSSBoYXZlIG5vIHBhcnRpY3VsYXIgb3Bpbmlv biBhYm91dCB0aGUgcmVzdCwgYnV0IGF0IGxlYXN0IG9uIHRoZSByZWdleA0K ICBzaWRlLCB0aGlzIG1pZ2h0IGJlIG9mIGludGVyZXN0Og0KICBbaHR0cHM6 Ly9naXRodWIuY29tL3BhdXJrZWRhbC9wcHhfcmVnZXhwXQ0KDQogIElmIHRo YXQncyBzdGlsbCBub3QgZ29vZCBlbm91Z2gsIEkgd291bGQgYmUgdmVyeSBp bnRlcmVzdGVkIGJ5DQogIHN1Z2dlc3Rpb25zIG9uIGhvdyB0byBtYWtlIGl0 IG1vcmUgY29udmVuaWVudC4gOikNCg0KDQpPQ2FtbFVzZXIgcHJvcG9zZWQN CuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgA0KDQogIEknbSBub3Qgc3VyZSBhYm91dCBpZGlvbWF0aWMs IGJ1dCBJIGRvIGhhdmUgYSB1dG9wIGNvbmZpZyB0aGF0IEkgdXNlDQogIHRv IGRvIHNvbWUgb25lLW9mZiBzY3JpcHRpbmcgaW4gT0NhbWwgdGhhdCB1c2Vz IGBzaGV4cCcNCg0KICDilIzilIDilIDilIDilIANCiAg4pSCICN1c2UgInRv cGZpbmQiDQogIOKUgiAjd2FybmluZ3MgIithIg0KICDilIIgI3RocmVhZA0K ICDilIIgI3JlcXVpcmUgInBweF9qYW5lLGNvcmUiDQogIOKUgiAjcmVxdWly ZSAic2hleHAucHJvY2VzcyINCiAg4pSCICNyZXF1aXJlICJsYW1iZGFzb3Vw Ig0KICDilIIgbW9kdWxlIExpc3QnID0gTGlzdA0KICDilIIgb3BlbiBTaGV4 cF9wcm9jZXNzDQogIOKUgiBvcGVuIFNoZXhwX3Byb2Nlc3MuSW5maXgNCiAg 4pSCIG9wZW4gQ29yZQ0KICDilIIgDQogIOKUgiBtb2R1bGUgSHRtbCA9IHN0 cnVjdA0KICDilIIgICAgIGluY2x1ZGUgU291cA0KICDilIIgDQogIOKUgiAg ICAgbGV0IG9mX3N0cmluZyA9IHBhcnNlDQogIOKUgiBlbmQNCiAg4pSCIA0K ICDilIIgbGV0IHJlYWRfbGluZXMgY21kID0NCiAg4pSCICAgICBldmFsIChj YWxsIGNtZCB8LSByZWFkX2FsbCkNCiAg4pSCIDs7DQogIOKUgiANCiAg4pSC IGxldCB3Z2V0IHVybCA9DQogIOKUgiAgICAgcmVhZF9saW5lcyBbIndnZXQi OyAiLU8iOyAiLSI7IHVybF0NCiAg4pSCIDs7DQogIOKUgiANCiAg4pSCIGxl dCBjaHJvbWVfY3VybCB1cmwgPQ0KICDilIIgICAgIHJlYWRfbGluZXMgWyJj dXJsIjsgIi1rIjsgIi1zQSI7ICJDaHJvbWUiOyAiLUwiOyB1cmw7ICItbyI7 ICItIl0NCiAg4pSCIDs7DQogIOKUgiANCiAg4pSCIGxldCBzcGxpdF9saW5l cyA9IFN0cmluZy5zcGxpdCB+b246J1xuJw0KICDilIIgbGV0IGZpbHRlcl9s aW5lcyBzdWJzdHJpbmcgPSBMaXN0LmZpbHRlciB+ZjpTdHJpbmcuKGlzX3N1 YnN0cmluZyB+c3Vic3RyaW5nKQ0KICDilIIgbGV0IHRvX2h0bWwgPSBIdG1s Lm9mX3N0cmluZw0KICDilIIgbGV0IGZpbmRfaHRtbCBwYXQgaHRtbCA9IEh0 bWwuKGh0bWwgJCQgcGF0KQ0KICDilIIgDQogIOKUgiBsZXQgKCUpID0gRm4u Y29tcG9zZQ0KICDilJTilIDilIDilIDilIANCg0KICBUaGVuIGEgc2ltcGxl IHNjcmlwdCBjYWxsZWQgYHNoZXhwJyBpbiBteSBwYXRoOg0KICDilIzilIDi lIDilIDilIANCiAg4pSCIHV0b3AgLWluaXQgfi9iaW4vb2NhbWwtc2hleHAt Y29uZmlnDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIEkgYWRkIGxpdHRsZSBo ZWxwZXIgZnVuY3Rpb25zIGFzIEkgY29tZSB1cG9uIHRoZW0uIEkgZmluZCBp dCdzIG11Y2gNCiAgZWFzaWVyIHRvIHRyYW5zaXRpb24gdG8gYSBmaWxlLCBv ciBmdWxsIHByb2dyYW0gd2hlbiBJIG5lZWQNCiAgaXQuIEV4YW1wbGUgcHJv Z3JhbToNCg0KICDilIzilIDilIDilIDilIANCiAg4pSCIHV0b3AgIyByZWFk X2xpbmVzIFsic2Vuc29ycyJdIHw+IHNwbGl0X2xpbmVzIHw+IGZpbHRlcl9s aW5lcyAiQ29yZSAwIjs7DQogIOKUgiAtIDogc3RyaW5nIGxpc3QgPQ0KICDi lIIgWyJDb3JlIDA6ICAgICAgICArNjMuMMKwQyAgKGhpZ2ggPSArODQuMMKw QywgY3JpdCA9ICsxMDAuMMKwQykiXQ0KICDilJTilIDilIDilIDilIANCg0K DQpBbnRvbiBLb2Noa292IHNhaWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIE5vdCBleGFj dGx5IE9DYW1sLCBidXQgY2FuIGJlIG1hZGUgd2l0aCB0aGUgT0NhbWwgc3lu dGF4IGFzIHdlbGwgLSBzZWUNCiAgW0JBVFNIXS4NCg0KDQpbQkFUU0hdIGh0 dHBzOi8vZ2l0aHViLmNvbS9iYXRzaC1kZXYtdGVhbS9CYXRzaA0KDQoNCkJp a2FsIExlbSBhbHNvIHNhaWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEkganVzdCBm b3VuZCB0aGlzIC0gW2h0dHBzOi8vZ2l0aHViLmNvbS9TaGFtb1gvY2FzaF0u IEBDaGV0X011cnRoeQ0KICBUaGlzIG1heSBiZSB0aGUgY2xvc2VzdCB0byBv Y2FtbCBzaGVsbCBzY3JpcHRpbmcgZXhwZXJpZW5jZSByZSBwZXJsLg0KDQoN CkFyZSB0aGVyZSBsZWFybmluZyBtYXRlcmlhbHMgZm9yIE9DYW1sIGZvciB0 aG9zZSB3aXRoIG5vIHByb2dyYW1taW5nIGV4cGVyaWVuY2U/DQrilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZANCg0KICBBcmNoaXZlOg0KICBbaHR0cHM6Ly9kaXNjdXNzLm9j YW1sLm9yZy90L2FyZS10aGVyZS1sZWFybmluZy1tYXRlcmlhbHMtZm9yLW9j YW1sLWZvci10aG9zZS13aXRoLW5vLXByb2dyYW1taW5nLWV4cGVyaWVuY2Uv NTY4NC85XQ0KDQoNCkNvbnRpbnVpbmcgdGhpcyB0aHJlYWFkLCBMdWNfTUwg c2FpZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgQmVmb3JlIHN0dWR5aW5n IG1vcmUgY29tcGxleCBib29rcywgaXQncyBhIGdvb2QgaWRlYSB0byBmaXJz dCBnZXQgYW4NCiAgb3ZlcnZpZXcuDQoNCiAgW09DYW1sIGZvciB0aGUgU2tl cHRpY2FsIC8gT0NhbWwgaW4gYSBOdXRzaGVsbF0gOiB0aGUgdGl0bGUgaXMg ZnVubnk7DQogIGl0cyBtYWluIGFkdmFudGFnZSBpcyB0aGF0IGl0IGNvdmVy cyBtb3N0IE9DYW1sIGNvbmNlcHRzIGluICoyMSBzaG9ydA0KICBzZWN0aW9u cyogd2hlcmUgeW91IGNhbiBleHBlcmltZW50IGJ5IHlvdXJzZWxmIG9uIHNp bXBsZSBidXQgZXNzZW50aWFsDQogIHRoaW5ncy4NCg0KICBUaGUgYm9va3Mv Y291cnNlcyBhbHJlYWR5IG1lbnRpb25lZCBhcmUgbmljZS4gWW91IGNhbiBh bHNvIGNvbnNpZGVyDQogIHRoaXMgb25lIHRoYXQgb2ZmZXJzIG1hbnkgZXhh bXBsZXMvZXhlcmNpc2VzIGFuZCBhbHNvIGEgZ29vZCBvdmVydmlldzoNCiAg W0RldmVsb3BpbmcgQXBwbGljYXRpb25zIFdpdGggT2JqZWN0aXZlIENhbWxd Lg0KDQogIExFIExBTkdBR0UgQ0FNTCBtZW50aW9uZWQgYnkgQG5vamIgaXMg YW4gZXhjZWxsZW50IGJvb2suIFdyaXR0ZW4gaW4NCiAgQ2FtbCBMaWdodCwg aXQncyBlYXN5IHRvIHR1cm4gaXQgYnkgeW91cnNlbGYgaW50byBPQ2FtbC4g SXQgb2ZmZXJzIGENCiAgZ3JlYXQgY2hhbmNlIHRvIGxlYXJuIGhvdyB0byBk byBhIGxvdCBvZiB0aGluZ3MgaW4gKnB1cmUqIENhbWwgd2l0aA0KICBvbmx5 IHN0ZGxpYiBhbmQgYSBzaW1wbGUgc3ludGF4IGV4dGVuc2lvbiBzeXN0ZW0g KHVzZSBjYW1scDUgKGkuZS4gdGhlDQogICJnZW51aW5lIGNhbWxwNCIpIHRo YXQgaXMgZmluZSBmb3IgdGhhdC4gSXQgd29ya3Mgb3V0IG9mIHRoZSBib3gg dG8NCiAgZGVhbCB3aXRoIHN0cmVhbXMgYW5kIGl0J3MgYSBjaGFuY2UgdG8g dW5kZXJzdGFuZCB3aGF0IGlzIGENCiAgTEwoMSkvcmVjdXJzaXZlIGRlc2Nl bnQgcGFyc2VyKS4NCg0KDQpbT0NhbWwgZm9yIHRoZSBTa2VwdGljYWwgLyBP Q2FtbCBpbiBhIE51dHNoZWxsXQ0KaHR0cHM6Ly93d3cyLmxpYi51Y2hpY2Fn by5lZHUva2VpdGgvb2NhbWwtY2xhc3MvY2xhc3MtMDEuaHRtbA0KDQpbRGV2 ZWxvcGluZyBBcHBsaWNhdGlvbnMgV2l0aCBPYmplY3RpdmUgQ2FtbF0NCmh0 dHBzOi8vY2FtbC5pbnJpYS5mci9wdWIvZG9jcy9vcmVpbGx5LWJvb2svDQoN Cg0KRHVuZSBtZWV0aW5nIG5vdGVzDQrilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZl OiBbaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2R1bmUtbWVldGluZy1u b3Rlcy81NzEwLzFdDQoNCg0KSsOpcsOpbWllIERpbWlubyBhbm5vdW5jZWQN CuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEkganVzdCB3YW50 ZWQgdG8gcHVibGljaXNlIHRoYXQgd2UgYXJlIG5vdyBwdWJsaXNoaW5nIHRo ZSBub3RlcyBmcm9tDQogIG91ciBEdW5lIG1lZXRpbmdzIG9uIHRoZSB3aWtp Og0KDQogIFtodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvZHVuZS93aWtpXQ0K DQogIFRoZXNlIG1lZXRpbmdzIGhhcHBlbiB2aWEgdmlkZW8tY29uZmVyZW5j ZSBldmVyeSB0d28gd2Vla3MuIElmIHlvdSBhcmUNCiAgaW50ZXJlc3RlZCBp biBmb2xsb3dpbmcgdGhlIGRldmVsb3BtZW50IG9mIER1bmUgbW9yZSBjbG9z ZWx5LCB0aGlzIGlzDQogIGdvb2QgcGxhY2UgdG8gbG9vayBhdC4NCg0KDQpP Q2FtbCA0LjExLjAsIGZpcnN0IGFscGhhIHJlbGVhc2UNCuKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0K DQogIEFyY2hpdmU6DQogIFtodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qv b2NhbWwtNC0xMS0wLWZpcnN0LWFscGhhLXJlbGVhc2UvNTcxNi8xXQ0KDQoN Cm9jdGFjaHJvbiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFRoZSBz ZXQgb2YgbmV3IGZlYXR1cmVzIGZvciB0aGUgZnV0dXJlIHZlcnNpb24gNC4x MS4wIG9mIE9DYW1sIGhhcw0KICBiZWVuIGZyb3plbi4gIEluIHRoZSBuZXh0 IGZldyBtb250aHMsIHRoZSBPQ2FtbCBjb21waWxlciB0ZWFtIGlzDQogIGZv Y3VzaW5nIG9uIGJ1ZyBodW50aW5nIGFuZCBmaXhpbmcuDQoNCiAgRm9yIHRo aXMgcmVsZWFzZSBjeWNsZSwgd2UgaGF2ZSBkZWNpZGVkIHRvIHRlc3QgcHVi bGlzaGluZyByZWd1bGFybHkNCiAgYWxwaGEgdmVyc2lvbnMgb2YgT0NhbWwg NC4xMS4wIGluIG9yZGVyIHRvIGhlbHAgZmVsbG93IGhhY2tlcnMgam9pbiB1 cw0KICBlYXJseSBpbiBvdXIgYnVnIGh1bnRpbmcgYW5kIG9wYW0gZWNvc3lz dGVtIGZpeGluZyBmdW4uICBPbmNlIHRoZSBvcGFtDQogIGVjb3N5c3RlbSBp cyBpbiBzaGFwZSwgdGhlc2UgYWxwaGEgcmVsZWFzZXMgd2lsbCBtb3JwaCBp bnRvIHRoZSB1c3VhbA0KICBiZXRhIGFuZCByZWxlYXNlIGNhbmRpZGF0ZSBy ZWxlYXNlcy4NCg0KICBJZiB5b3UgZmluZCBhbnkgYnVncywgcGxlYXNlIHJl cG9ydCB0aGVtIGhlcmU6DQogICBbaHR0cHM6Ly9naXRodWIuY29tL29jYW1s L29jYW1sL2lzc3Vlc10NCg0KICBUaGUgY29tcGlsZXIgY2FuIGJlIGluc3Rh bGxlZCBhcyBhbiBPUEFNIHN3aXRjaCB3aXRoIG9uZSBvZiB0aGUNCiAgZm9s bG93aW5nIGNvbW1hbmRzDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgb3Bh bSBzd2l0Y2ggY3JlYXRlIG9jYW1sLXZhcmlhbnRzLjQuMTEuMCthbHBoYTEg LS1yZXBvc2l0b3JpZXM9ZGVmYXVsdCxiZXRhPWdpdCtodHRwczovL2dpdGh1 Yi5jb20vb2NhbWwvb2NhbWwtYmV0YS1yZXBvc2l0b3J5LmdpdA0KICDilJTi lIDilIDilIDilIANCiAgb3INCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBv cGFtIHN3aXRjaCBjcmVhdGUgb2NhbWwtdmFyaWFudHMuNC4xMS4wK2FscGhh MStWQVJJQU5UIC0tcmVwb3NpdG9yaWVzPWRlZmF1bHQsYmV0YT1naXQraHR0 cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLWJldGEtcmVwb3NpdG9yeS5n aXQNCiAg4pSU4pSA4pSA4pSA4pSADQogIHdoZXJlIHlvdSByZXBsYWNlIFZB UklBTlQgd2l0aCBvbmUgb2YgdGhlc2U6IGFmbCwgZmxhbWJkYSwgZnAsDQog IGZwK2ZsYW1iZGENCg0KICBUaGUgc291cmNlIGNvZGUgZm9yIHRoZSBhbHBo YSBpcyBhbHNvIGF2YWlsYWJsZSBhdCB0aGVzZSBhZGRyZXNzZXM6DQoNCiAg W2h0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9hcmNoaXZlLzQuMTEu MCthbHBoYTEudGFyLmd6XQ0KICBbaHR0cHM6Ly9jYW1sLmlucmlhLmZyL3B1 Yi9kaXN0cmliL29jYW1sLTQuMTEvb2NhbWwtNC4xMS4wK2FscGhhMS50YXIu Z3pdDQoNCiAgSWYgeW91IGFyZSBpbnRlcmVzdGVkIGJ5IHRoZSBvbmdvaW5n IGxpc3Qgb2YgbmV3IGZlYXR1cmVzIGFuZCBmaXhlZA0KICBidWdzLCB0aGUg dXBkYXRlZCBjaGFuZ2UgbG9nIGZvciBPQ2FtbCA0LjExLjAgaXMgYXZhaWxh YmxlIGF0Og0KDQogIFtodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwv YmxvYi80LjExL0NoYW5nZXNdDQoNCg0KT0NhbWwgVXNlcnMgYW5kIERldmVs b3BlcnMgTWVldGluZyAyMDIwDQrilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZANCg0KICBBcmNoaXZlOg0KICBbaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9y Zy90L29jYW1sLXVzZXJzLWFuZC1kZXZlbG9wZXJzLW1lZXRpbmctMjAyMC81 NDU0LzJdDQoNCg0KSXZhbiBHb3RvdmNoaXRzIGFubm91bmNlZA0K4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgRHVlIHRvIHRoZSBtdWx0 aXBsZSByZXF1ZXN0cyBhbmQgc2luY2UgSUNGUCB3aWxsIGJlIG5vdyBvZmZp Y2lhbGx5DQogIGhlbGQgb25saW5lIHdpdGggYSBzaWduaWZpY2FudGx5IHJl ZHVjZWQgZmVlLCB3ZSBkZWNpZGVkIHRvIGV4dGVuZCB0aGUNCiAgc3VibWlz c2lvbiBkZWFkbGluZSB0aWxsIHRoZSBlbmQgb2YgdGhpcyBtb250aC4gV2Ug YXJlIGhvcGluZyB0bw0KICBhdHRyYWN0IGEgbGFyZ2VyIGFuZCBtb3JlIGRp dmVyc2UgYXVkaWVuY2UgdGhpcyB5ZWFyLCBnaXZlbiB0aGF0IHRoZQ0KICBu ZXcgZm9ybWF0IGlzIG1vcmUgYWNjZXNzaWJsZSBib3RoIHRyYXZlbC13aXNl IGFuZCBmaW5hbmNpYWxseS4NCg0KICBQbGVhc2UsIHNoYXJlIHRoZSBuZXdz IHdpZGVseSENCg0KDQpJbXBvcnRhbnQgRGF0ZXMgKHVwZGF0ZWQpDQrilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICDigKIgVGFsayBwcm9w b3NhbCBzdWJtaXNzaW9uIGRlYWRsaW5lOiBNYXkgMjl0aCwgMjAyMCwgQW9F DQogIOKAoiBBdXRob3IgTm90aWZpY2F0aW9uOiBKdWx5IDE3dGgsIDIwMjAN CiAg4oCiIE9DYW1sIFdvcmtzaG9wOiBBdWd1c3QgMjh0aCwgMjAyMA0KDQoN ClZTQ29kZSBQbGF0Zm9ybSBQbHVnaW4gMC41LjANCuKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIFto dHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXZzY29kZS1wbGF0Zm9y bS1wbHVnaW4tMC01LTAvNTc1Mi8xXQ0KDQoNClJ1ZGkgR3JpbmJlcmcgYW5u b3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBUaGlzIHJl bGVhc2UgY29udGFpbnMgYSBjb3VwbGUgb2YgbWFqb3IgaW1wcm92ZW1lbnRz Og0KDQogIOKAoiBTeW50YXggaGlnaGxpZ2h0aW5nIGlzIHZhc3RseSBpbXBy b3ZlZC4gVGhlcmUncyBub3cgaGlnaGxpZ2h0aW5nIGZvcg0KICAgIG1hbnkg bW9yZSBmaWxldHlwZXMsIGFuZCB0aGUgY29yZSBoaWdobGlnaHRpbmcgZm9y IE9DYW1sIGlzIGZhciBtb3JlDQogICAgYWNjdXJhdGUuDQogIOKAoiBUaGVy ZSdzIGludGVncmF0aW9uIHdpdGggcGFja2FnZSBtYW5hZ2VycyBzdWNoIGFz IG9wYW0gYW5kIGVzeS4gT25lDQogICAgbWF5IG5vdyBleHBsaWNpdGx5IHVz ZSB0aGVtIHRvIGV4cGxpY2l0bHkgc2VsZWN0IHRoZSBzYW5kYm94IHRoYXQN CiAgICBjb250YWlucyB0aGUgbHNwIHNlcnZlciBhbmQgcmVsYXRlZCB0b29s cy4NCg0KICBVbmRlciB0aGUgaG9vZCwgdGhlIGVudGlyZSBwbHVnaW4gd2Fz IHJld3JpdHRlbiBmcm9tIHR5cGVzY3JpcHQgdG8NCiAgT0NhbWwgKGJ1Y2ts ZXNjcmlwdCkuIFRoaXMgc2hvdWxkIGhvcGVmdWxseSBtYWtlIGNvbnRyaWJ1 dGlvbiBtb3JlDQogIGFjY2Vzc2libGUgdG8gT0NhbWwgaGFja2Vycy4NCg0K ICBJJ2QgbGlrZSB0byB0aGFuayBAcnVzdHlrZXksIEBtbnhuLCBAcHJvbWV0 aGVhbnNhY3JpZmljZSwgYW5kIEBpbWJza3kNCiAgZm9yIHRoZWlyIGNvbnRy aWJ1dGlvbnMgdG8gdGhpcyByZWxlYXNlLiBUaGVpciBoZWxwIGlzIHRoZSBy ZWFzb24gZm9yDQogIHRoaXMgdmFzdGx5IGltcHJvdmVkIHZlcnNpb24gb2Yg dGhlIHBsdWdpbi4NCg0KICBBcyB1c3VhbCwgdGhlIHBsdWdpbiBpcyBhdmFp bGFibGUgZGlyZWN0bHkgdXNpbmcgdnNjb2RlJ3MgZXh0ZW5zaW9uDQogIG1h cmtldCBwbGFjZS4gSSdsbCBsZWF2ZSBhIGxpbmsgdG8gdGhlIHBsdWdpbiBb aGVyZV0gdG8gYXZvaWQNCiAgY29uZnVzaW9uIHdpdGggdGhlIG1hbnkgb3Ro ZXIgT0NhbWwgcGx1Z2lucyBhdmFpbGFibGUuDQoNCiAgUGxlYXNlIHJlcG9y dCBhbnkgaXNzdWVzIG9uIHRoZSBbYnVnIHRyYWNrZXJdDQoNCg0KW2hlcmVd DQpodHRwczovL21hcmtldHBsYWNlLnZpc3VhbHN0dWRpby5jb20vaXRlbXM/ aXRlbU5hbWU9b2NhbWxsYWJzLm9jYW1sLXBsYXRmb3JtDQoNCltidWcgdHJh Y2tlcl0gaHR0cHM6Ly9naXRodWIuY29tL29jYW1sbGFicy92c2NvZGUtb2Nh bWwtcGxhdGZvcm0vaXNzdWVzDQoNCg0KT3RoZXIgT0NhbWwgTmV3cw0K4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ DQoNCkZyb20gdGhlIG9jYW1sY29yZSBwbGFuZXQgYmxvZw0K4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSGVy ZSBhcmUgbGlua3MgZnJvbSBtYW55IE9DYW1sIGJsb2dzIGFnZ3JlZ2F0ZWQg YXQgW09DYW1sIFBsYW5ldF0uDQoNCiAg4oCiIFtPY3NpZ2VuIFN0YXJ0IDIu MTggcmVsZWFzZWRdDQogIOKAoiBbT2NzaWdlbiBUb29sa2l0IDIuNyB3aXRo IG5ldyB3aWRnZXQgT3RfdG9uZ3VlXQ0KDQoNCltPQ2FtbCBQbGFuZXRdIGh0 dHA6Ly9vY2FtbC5vcmcvY29tbXVuaXR5L3BsYW5ldC8NCg0KW09jc2lnZW4g U3RhcnQgMi4xOCByZWxlYXNlZF0NCmh0dHBzOi8vb2NzaWdlbi5naXRodWIu aW8vYmxvZy8yMDIwLzA1LzA1L29zLw0KDQpbT2NzaWdlbiBUb29sa2l0IDIu NyB3aXRoIG5ldyB3aWRnZXQgT3RfdG9uZ3VlXQ0KaHR0cHM6Ly9vY3NpZ2Vu LmdpdGh1Yi5pby9ibG9nLzIwMjAvMDUvMDQvb3QvDQoNCg0KT2xkIENXTg0K 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgSWYgeW91IGhhcHBlbiB0byBt aXNzIGEgQ1dOLCB5b3UgY2FuIFtzZW5kIG1lIGEgbWVzc2FnZV0gYW5kIEkn bGwgbWFpbA0KICBpdCB0byB5b3UsIG9yIGdvIHRha2UgYSBsb29rIGF0IFt0 aGUgYXJjaGl2ZV0gb3IgdGhlIFtSU1MgZmVlZCBvZiB0aGUNCiAgYXJjaGl2 ZXNdLg0KDQogIElmIHlvdSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVy eSB3ZWVrIGJ5IG1haWwsIHlvdSBtYXkgc3Vic2NyaWJlDQogIFtvbmxpbmVd Lg0KDQogIFtBbGFuIFNjaG1pdHRdDQoNCg0KW3NlbmQgbWUgYSBtZXNzYWdl XSBtYWlsdG86YWxhbi5zY2htaXR0QHBvbHl0ZWNobmlxdWUub3JnDQoNClt0 aGUgYXJjaGl2ZV0gaHR0cDovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi8N Cg0KW1JTUyBmZWVkIG9mIHRoZSBhcmNoaXZlc10gaHR0cDovL2FsYW4ucGV0 aXRlcG9tbWUubmV0L2N3bi9jd24ucnNzDQoNCltvbmxpbmVdIGh0dHA6Ly9s aXN0cy5pZHlsbC5vcmcvbGlzdGluZm8vY2FtbC1uZXdzLXdlZWtseS8NCg0K W0FsYW4gU2NobWl0dF0gaHR0cDovL2FsYW4ucGV0aXRlcG9tbWUubmV0Lw0K DQo= --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of May 05 to 12, 2020.

Looking for "lovely, idiomatic" examp= les of Ocaml used for shell-scripting in the manner of Perl/Python (but esp= . Perl)

Continuing this thread, Chet Murthy said and Aaron L.= Zeng replied

  • needs to be Ocaml code, not an interpreter. I mean, if I=E2=80=99m not = going to write it in Ocaml, I might as well write in Perl, yes?

I think shexp might deserve another look. It's not an interpreter for a se= xp-based shell language, as its name might unfortunately deceivingly suggest. It's really a DSL for constructing shel= l pipelines using a 'a Process.t monad. The s-expression part is advertising that you can debug and trace the actio= ns performed using s-expressions.

The second-most-important part of Perl/Bash scripting is string-handling. A= nd it=E2=80=99s certainly the part of Ocaml that=E2=80=99s most painful when writing scripts. Let=E2=80=99s stipulate that there are n= ice libraries to make this easy. I=E2=80=99m an Ocaml bigot, I have to believe this anyway grin . This library doesn=E2=80= =99t seem to use 'em, nor choose/promote a particular set of such libraries.

I've found Base plus Re to be sufficient for most of my string-manipulation needs. It's never going to be as concis= e as Perl's built-in "magic" support for regexps, but you gain explicitness and clarity, which is part of the benefi= t of OCaml anyway.

Chet Murthy said and Donn Cave replied

It=E2=80=99s not as trivial in Ocaml, for many complicated reasons that boi= l down to =E2=80=9Cgee, string-handling is a PITA=E2=80=9D.

Really? hadn't noticed. Ha ha.

I could never really get urge for Perl, but I use its ancestor awk a lot, a= nd I'm trying out some awk-like simple string functions, like

let strlen =3D String.length
let sub s i n =3D let b =3D strlen s
     in if i < b
         then let n =3D min n (b - i)
         in String.sub s i n
    else ""
(* s=
ubstring to end of line *)
let substr a=
 i =3D if i < strlen a
     then String.sub a i ((strlen a) - i)
     else ""
let matchre t s =3D try
     Str.search_forward t s 0
     with | Not_found -> -1

etc.

So "open Awk" gets me a handful of more basic variations on common string f= unctions, with less elaborate parameters, no normal exceptions, etc. Including a line by line file processing functi= on. I have just newly started on this and haven't used it extensively, but it seems fairly promising. No wacky synta= x or hyper intelligent string processing, no packages, just a few dozen lines of cheater functions.

"Awk" is a misnomer, in that there's little correspondence between this and= awk, it was just what inspired me to try it.

Rapha=C3=ABl Proust said

I don't think it's lovely and I have no idea if it is idiomatic, but I made= a few scripts of my own in OCaml using the same library that other mentioned: bos

  • typepass use= s xdotool to type passwords from the password pas= sword manager
  • conn wraps wpa_supplicant, dhcpcd, ip, and other net= work management CLI
  • laptop-stat= us fetches status information for laptops (e.g., battery level) and pri= nts it in a nicely formatted form
  • bakelite inc= reases or decreases screen brightness

Vasile Rotaru also said

Gabriel Radanne also said

I have no particular opinion about the rest, but at least on the regex side= , this might be of interest: https://github.com/paur= kedal/ppx_regexp

If that's still not good enough, I would be very interested by suggestions = on how to make it more convenient. :)

OCamlUser proposed

I'm not sure about idiomatic, but I do have a utop config that I use to do = some one-off scripting in OCaml that uses shexp

#use "topfind"
#warnings "+a"
#thread
#require "ppx_jane,core"
#require "shexp.process"
#require "lambdasoup"
module List' =3D List=

open Shexp_process
open Shexp_process.Infix
open Core

module Html =3D struct
    include Soup

    let of_string =3D parse
end

let read_lines cmd<=
/span> =3D
    eval (call cmd |- read_all)
;;

let wget url=
 =3D
    read_lines ["wget"; "-O"; "-"; url]
;;

let chrome_curl url=
 =3D
    read_lines ["curl"; "-k"; "-sA"; "Chrome"; "-L"; url; "-o"; <=
span style=3D"color: #8b2252;">"-"]
;;

let split_lines =3D String.split ~on:'\n'
let filter_lines su=
bstring =3D List.filter ~f:String=
.(is_substring ~substring)
let to_html =3D Htm=
l.of_string
let find_html pat html =3D Html.(html $$ pat)

let (%) =3D Fn.compose

Then a simple script called shexp in my path:

utop -init ~/bin/ocaml-shexp-config

I add little helper functions as I come upon them. I find it's much easier = to transition to a file, or full program when I need it. Example program:

utop # read_lines ["sensors"] |> split_lines |> filter_lines "Core 0"=
;;
- : string list =3D
["Core 0:        +63.0=C2=B0C  (high =3D +84.0=C2=B0C, crit =3D +100.0=C2=
=B0C)"]

Anton Kochkov said

Not exactly OCaml, but can be made with the OCaml syntax as well - see BATSH.

Bikal Lem also said

I just found this - https://gith= ub.com/ShamoX/cash. @Chet_Murthy This may be the closest to ocaml shell= scripting experience re perl.

Are there learning materials for OCam= l for those with no programming experience?

Continuing this threaad, Luc_ML said

Before studying more complex books, it's a good idea to first get an overvi= ew.

O= Caml for the Skeptical / OCaml in a Nutshell : the title is funny; its main advantage is that it covers most OCaml concepts in= 21 short sections where you can experiment by yourself on simple but essential things.

The books/courses already mentioned are nice. You can also consider this on= e that offers many examples/exercises and also a good overview: Developing Applications With Objective Caml.

LE LANGAGE CAML mentioned by @nojb is an excellent book. Written in Caml Li= ght, it's easy to turn it by yourself into OCaml. It offers a great chance to learn how to do a lot of things in pu= re Caml with only stdlib and a simple syntax extension system (use camlp5 (i.e. the "genuine camlp4") that is fin= e for that. It works out of the box to deal with streams and it's a chance to understand what is a LL(1)/recursive= descent parser).

Dune meeting notes

J=C3=A9r=C3=A9mie Dimino announced

I just wanted to publicise that we are now publishing the notes from our Du= ne meetings on the wiki:

https://github.com/ocaml/dun= e/wiki

These meetings happen via video-conference every two weeks. If you are inte= rested in following the development of Dune more closely, this is good place to look at.

OCaml 4.11.0, first alpha release

octachron announced

The set of new features for the future version 4.11.0 of OCaml has been fro= zen. In the next few months, the OCaml compiler team is focusing on bug hunting = and fixing.

For this release cycle, we have decided to test publishing regularly alpha = versions of OCaml 4.11.0 in order to help fellow hackers join us early in our bug hunting and opam ecosystem fixing f= un. Once the opam ecosystem is in shape, these alpha releases will morph into t= he usual beta and release candidate releases.

If you find any bugs, please report them here: https://github.com/ocaml= /ocaml/issues

The compiler can be installed as an OPAM switch with one of the following c= ommands

opam switch create ocaml-variants.4.11.0+alpha=
1 --repositories=3Ddefault,beta=3Dgi=
t+https://github.com/ocaml/ocaml-beta-repository.git

or

opam switch create ocaml-variants.4.11.0+alpha=
1+VARIANT --repositories=3Ddefault,beta=3Dgit+https://github.com/ocaml/ocaml-beta-repository.git

where you replace VARIANT with one of these: afl, flambda, fp, fp+flambda

The source code for the alpha is also available at these addresses:

htt= ps://github.com/ocaml/ocaml/archive/4.11.0+alpha1.tar.gz
https://caml.inria.fr/pub/distrib/ocaml-4.11/ocaml-4.11.0+alpha1.t= ar.gz

If you are interested by the ongoing list of new features and fixed bugs, t= he updated change log for OCaml 4.11.0 is available at:

https://github= .com/ocaml/ocaml/blob/4.11/Changes

OCaml Users and Developers Meeting 20= 20

Ivan Gotovchits announced

Due to the multiple requests and since ICFP will be now officially held onl= ine with a significantly reduced fee, we decided to extend the submission deadline till the end of this month. We ar= e hoping to attract a larger and more diverse audience this year, given that the new format is more accessible bo= th travel-wise and financially.

Please, share the news widely!

Important Dates (updated)

  • Talk proposal submission deadline: May 29th, 2020, AoE
  • Author Notification: July 17th, 2020
  • OCaml Workshop: August 28th, 2020

VSCode Platform Plugin 0.5.0

Rudi Grinberg announced

This release contains a couple of major improvements:

  • Syntax highlighting is vastly improved. There's now highlighting for ma= ny more filetypes, and the core highlighting for OCaml is far more accurate= .
  • There's integration with package managers such as opam and esy. One may= now explicitly use them to explicitly select the sandbox that contains the= lsp server and related tools.

Under the hood, the entire plugin was rewritten from typescript to OCaml (b= ucklescript). This should hopefully make contribution more accessible to OCaml hackers.

I'd like to thank @rustykey, @mnxn, @prometheansacrifice, and @imbsky for t= heir contributions to this release. Their help is the reason for this vastly improved version of the plugin.

As usual, the plugin is available directly using vscode's extension market = place. I'll leave a link to the plugin here to avoid confusion with the many other OCaml plugins available.

Please report any issues on the bug tracker

Other OCaml News

From the ocamlcore planet blog

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the RSS feed of the archives<= /a>.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=--