From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by c5ff346549e7 (Postfix) with ESMTPS id 9FE365D4 for ; Tue, 19 May 2020 09:53:01 +0000 (UTC) X-IronPort-AV: E=Sophos;i="5.73,409,1583190000"; d="scan'208,217";a="450365077" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 19 May 2020 11:52:59 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 18766E1E7B; Tue, 19 May 2020 11:52:59 +0200 (CEST) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 21A4AE1E74 for ; Tue, 19 May 2020 11:52:56 +0200 (CEST) Authentication-Results: mail2-smtp-roc.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=/atN=7B=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org IronPort-PHdr: =?us-ascii?q?9a23=3Asmx16RCDwvbY9won3bijUyQJP3N1i/DPJgcQr6Af?= =?us-ascii?q?oPdwSP3+pMqwAkXT6L1XgUPTWs2DsrQY0reQ6vi/EjVRqb+681k6OKRWUBEEjc?= =?us-ascii?q?hE1ycBO+WiTXPBEfjxciYhF95DXlI2t1uyMExSBdqsLwaK+i764jEdAAjwOhRo?= =?us-ascii?q?LerpBIHSk9631+ev8JHPfglEnjWwba5yIRmssAndqssbjYR/Jqs11xDEvmZGd+?= =?us-ascii?q?NKyG1yOFmdhQz85sC+/J5i9yRfpfcs/NNeXKv5Yqo1U6VWACwpPG4p6sLrswLD?= =?us-ascii?q?TRaU6XsHTmoWiBtIDBPb4xz8Q5z8rzH1tut52CmdIM32UbU5Uims4qt3VBPljj?= =?us-ascii?q?oMODkk/mHKkcxwlLxUrw69pxJxxI7UZZuaNPt4fqjAed8XSm5MUsNXWiBBAY28?= =?us-ascii?q?aZUPD+saPeZZtIb9o0UBpgawBAmrHuPg1yRIjWLy0aA0z+gtFAfL0wI6H9IKrX?= =?us-ascii?q?/astP7OqkPWuyx0aXE0TDPYvVL0jn/9YfIaAgsr/GSU7xtf8TfykYgGB/eg1qK?= =?us-ascii?q?tYDoJSmY2vgRv2WZ6edrSOKhi3QgqwF0ujWi2sMshZPPhokI117L6SV5wIM0Jd?= =?us-ascii?q?2kVE5wfNmpH4FUty6AMYt6WNgiTH1ouCY/y70GpYK7cTMSyJQgwx7ea+CHfJaU?= =?us-ascii?q?7RLjUuaRIC54hG97d76lgBay60egx/T6W8Kp31lEsjBLncPQtnARyRPT8M6HR+?= =?us-ascii?q?Ny8Eu82DuB2Q7d5+9LLE0wkafVJJ4vzqItm5QdvkrOAzP7lUXogaKLdEgp++ml?= =?us-ascii?q?5erob7jluJORNIB6hwPxPKkvnMG0HOo2Mg8LX2eB+OS80qXu/VXnT7VWj/02jr?= =?us-ascii?q?fWsIjdJcQeo662HRVZ0oA95BajFzum18gXkmMCLFJBYh6HiJLpO17WLPD/Efiw?= =?us-ascii?q?mVGskDNxy/zcOb3hGJrNImDMkLfgYbZ971RTxxEpwd9D4JJUD6kNIP3yWk/ttN?= =?us-ascii?q?zYEwQ2Pxa1w+bgENlyzJ8RWWeVDq+eKqPSvkeE5v4xLOiNY48VoyzxJOQi5/7r?= =?us-ascii?q?lXM5ll4dfbWt3ZQNc3+0BPVmI0KBbXrqhdcBFH0FsRc/TOP2kVGCVSRcaG2pX6?= =?us-ascii?q?4m+j47D4emAZ/CRoCrmryB3T20EodYZmBcElyMHnbod5mEW/cRcy2eONVtkj0D?= =?us-ascii?q?VbS5RI8h1A2utA/ny7V8NObb5ioYtZf72Nhy++LcjxQy9ThuA8WS02CMTnl4nn?= =?us-ascii?q?kWSDAs2KB+r0t9yk2H0adlhPxXCcZc5/ZNUgsgMp7c1eN6B8jpWg3bf9eGVlCm?= =?us-ascii?q?Qs67AT0rUt0xxMUCY0RlG9m6jBDMwjCmDKMSl7yOHJA76KTc0GXrJ8ljyXbKzr?= =?us-ascii?q?Uuj14jQsdXNG2pm65+9wzXB4LTlEWZjamqeKIB1yDO7GeO1XeCsF9cXQJqTKnJ?= =?us-ascii?q?QX8SalHYoNjl/E/PQbCjBawlPwZC08KONKRHZsPzgVlbS/rvIsnSbm2tl2q2GB?= =?us-ascii?q?2G3KmDbJDwdGUYxCjdCFYLkwQU/XueMAg/CTqtr3jGDDxpEVLuY1/s/vdip3O7?= =?us-ascii?q?SE80zhiKb1B/2Lav/R4Vn/OcR+sS3rICpighty15EEuj09/SEdaMuhZtcapGbd?= =?us-ascii?q?4z/FtLz2zUugNlMpylNa9ih1oecwptv0Pp0hV6EphOn9Q3on821Ad+MriX0E9Z?= =?us-ascii?q?eT6A3539J6XaKnH1/BCra6/Wxk/R38qW+qcJ6fQ4skjjsx+zGkol6XVn3MFY3G?= =?us-ascii?q?GY5prQCgoeS4nxXVo39xh/prHafjU96pjP2n1rLKm0tCPN1MwyBOc/zxatcNhe?= =?us-ascii?q?PLmDFA/oHM0WH9KuJ/Aym1i1chIEO/hf+7IuMMOjc/uKwaqrPOd7nDK6lmlH+4?= =?us-ascii?q?B80keU9yVmUOLI3pAFw+uZ3gSdTTv8gk2h4YjLntUOYS4UVCLrzTfiLIpOYOt0?= =?us-ascii?q?cJpdTS/kKNKxjJ0205XyXVZc9UW/HBUH1N6tfVyVdVOrmUVb3EET5HimgjeQzj?= =?us-ascii?q?pukjhvoLDblCfJxvzKcBscJnUNQ3NojEvlJYazn5YXQRuGdQ8swTKh7ECy/KNb?= =?us-ascii?q?oaVjMyGHSENBeW7tJGFnU7esnqKFZ99T5ZgotyROTen6ZkqVHO2u6yAG2j/uSj?= =?us-ascii?q?MNjAswcCun78WoxkAouCemNH926UHhV4Ro3x6GtY7EQvpAwjcNRC95kCTaQF+m?= =?us-ascii?q?MIvwpIjGp9L4qum7ElmZeNhTfC3sl9jSsTvio3VtBQyjkvuznNz+DAV81jX0hY?= =?us-ascii?q?AzBHf46S3ka4yu7JyUdOduf01mHlj5spUoEIZjlIA9n9cVhWhcgY+aryMK?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0BPFwCLq8NehyIeaIFmg3VYQAFdVTIsh?= =?us-ascii?q?CSBXYckhXiBMIFigg0ChTEmAY0ThAKBEANQAg0BAwEMGAEOBQECBAEBgw6BNgI?= =?us-ascii?q?XgXYdBgEFMxMCEAEBBQEBAQIBAgMEARMBAQEKCwkIKYVdDII7DAwDAwGDHwEYA?= =?us-ascii?q?QIGCkAlIwMJCwEGAwIEDQEXARQKFwEJCRQGAYMLAYJ8BAEKlSubeYEyhDoBAwI?= =?us-ascii?q?BCwUPL4NzgUANAhN/F4UrhHMEXIExEw+BTD+BEYISSQdsgkENDgsBAQEBARmBA?= =?us-ascii?q?g0SBgEBBlAJglUXgkkEjjEMDgENJANoiDqIQoIRBo8YEWwHglOBAQSFZEd2hgm?= =?us-ascii?q?ECIM6gnOCXYEOh2KFAotKgT0hkA4UgVyFVwIHcAaBOYVciXYFhDmBPyqBRwEdA?= =?us-ascii?q?QsHMxowQ4I1AQEyCQlWDVaPRjABFoEDAQmCQoE+gSYigVM7hGRgPzMBAQEBMwI?= =?us-ascii?q?GAQcBAQMJdQEBBRMLAYs4gWhcAQE?= X-IPAS-Result: =?us-ascii?q?A0BPFwCLq8NehyIeaIFmg3VYQAFdVTIshCSBXYckhXiBMIF?= =?us-ascii?q?igg0ChTEmAY0ThAKBEANQAg0BAwEMGAEOBQECBAEBgw6BNgIXgXYdBgEFMxMCE?= =?us-ascii?q?AEBBQEBAQIBAgMEARMBAQEKCwkIKYVdDII7DAwDAwGDHwEYAQIGCkAlIwMJCwE?= =?us-ascii?q?GAwIEDQEXARQKFwEJCRQGAYMLAYJ8BAEKlSubeYEyhDoBAwIBCwUPL4NzgUANA?= =?us-ascii?q?hN/F4UrhHMEXIExEw+BTD+BEYISSQdsgkENDgsBAQEBARmBAg0SBgEBBlAJglU?= =?us-ascii?q?XgkkEjjEMDgENJANoiDqIQoIRBo8YEWwHglOBAQSFZEd2hgmECIM6gnOCXYEOh?= =?us-ascii?q?2KFAotKgT0hkA4UgVyFVwIHcAaBOYVciXYFhDmBPyqBRwEdAQsHMxowQ4I1AQE?= =?us-ascii?q?yCQlWDVaPRjABFoEDAQmCQoE+gSYigVM7hGRgPzMBAQEBMwIGAQcBAQMJdQEBB?= =?us-ascii?q?RMLAYs4gWhcAQE?= X-IronPort-AV: E=Sophos;i="5.73,409,1583190000"; d="scan'208,217";a="450365001" X-MGA-submission: =?us-ascii?q?MDEjU6ZvAG0Ge2uvC5BWHU7Ywq6CHn/nh8M+q7?= =?us-ascii?q?USc9b7eOFVV/2ggsAlM8Fz1jCmHWI66useuCXm8ZgHyWnhJUbODhlAte?= =?us-ascii?q?KEEFxhpGfpE6dqV7oaq3GUMNjWmgk/t4sy/c40BZfK/uTBNbTn+lb4rx?= =?us-ascii?q?TX1SBsJLnUuEKeU3I9pAQXWA=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 19 May 2020 11:52:41 +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 025F3564A3F; Tue, 19 May 2020 11:52:37 +0200 (CEST) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr, comp@lists.orbitalfox.eu Date: Tue, 19 May 2020 11:52:37 +0200 Message-ID: <871rngz1y2.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue May 19 11:52:38 2020 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.002572, queueID=91A5D564A40 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 18148 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgTWF5IDEyIHRvIDE5LA0KMjAyMC4NCg0KVGFibGUgb2YgQ29udGVudHMNCuKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQpvY2FtbGZvcm1h dCAwLjE0LjINCk1MIEZhbWlseSBXb3Jrc2hvcCAyMDIwOiBDYWxsIGZvciBwcmVzZW50YXRpb25z DQptZW1wcm9mLWxpbWl0cyBwcmV2aWV3IChhbmQgYSBndWlkZSB0byBoYW5kbGUgYXN5bmNocm9u b3VzIGV4Y2VwdGlvbnMpDQpUZXpvcyA3LjAgaXMgbm93IGF2YWlsYWJsZSBvbiBvcGFtDQpPZmZp Y2lhbCBPQ2FtbCBiaW5kaW5ncyBmb3IgdmVyaWZpZWQgRXZlcmVzdCBjcnlwdG9ncmFwaHkNCm5t ZWEgYW5kIHNhaWwtZ2FkZ2V0cw0KSXMgdGhlcmUgc3BlY2lhbGl6ZWQgbWF0aCBsaWJyYXJ5IGZv ciBzdGF0aXN0aWNzPw0KTmV3IE9DYW1sIGJvb2tzPw0KT3RoZXIgT0NhbWwgTmV3cw0KT2xkIENX Tg0KDQoNCm9jYW1sZm9ybWF0IDAuMTQuMg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZTogW2h0dHBzOi8vZGlzY3Vzcy5v Y2FtbC5vcmcvdC9hbm4tb2NhbWxmb3JtYXQtMC0xNC0yLzU3NTQvMV0NCg0KDQpHdWlsbGF1bWUg UGV0aW90IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgV2UgYXJlIHBsZWFz ZWQgdG8gYW5ub3VuY2UgdGhlIHJlbGVhc2Ugb2YgYG9jYW1sZm9ybWF0JyAwLjE0LjIuICBUaGlz DQogIG1pbm9yIHJlbGVhc2UgaW1wcm92ZXMgdGhlIHJlY2VudCAwLjE0LjAgYW5kIDAuMTQuMSBy ZWxlYXNlcyByZWdhcmRpbmcNCiAgdGhlIGBkb2MtY29tbWVudHMnIG9wdGlvbi4NCg0KDQpIb3cg dG8gbWlncmF0ZSBmcm9tIDAuMTMuMA0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgSGVyZSBh cmUgdGhlIGNoYW5nZXMgb2YgdGhlIGBkb2MtY29tbWVudHMnIG9wdGlvbnMgY29tcGFyZWQgdG8N CiAgb2NhbWxmb3JtYXQgMC4xMy4wOg0KICDigKIgYGFmdGVyJyBoYXMgYmVlbiByZW5hbWVkIHRv IGBhZnRlci13aGVuLXBvc3NpYmxlJyB0byB0YWtlIGludG8NCiAgICBhY2NvdW50IHRoZSB0ZWNo bmljYWwgbGltaXRhdGlvbnMgb2Ygb2NhbWxmb3JtYXQ7DQogIOKAoiBhIG5ldyB2YWx1ZSBgYmVm b3JlLWV4Y2VwdC12YWwnIGhhcyBiZWVuIGFkZGVkLCBwbGFjaW5nIGRvYy1jb21tZW50cw0KICAg IGJlZm9yZSB0aGUgY29ycmVzcG9uZGluZyBjb2RlLCBidXQgcGxhY2luZyBkb2MtY29tbWVudHMg b2YgdmFsIGFuZA0KICAgIGV4dGVybmFsIGRlY2xhcmF0aW9ucyBhZnRlciB0aGUgY29ycmVzcG9u ZGluZyBkZWNsYXJhdGlvbjsNCiAg4oCiIGBiZWZvcmUnIGlzIHVuY2hhbmdlZC4NCg0KICBIZXJl IGlzIHRoZSBmdWxsIGxpc3Qgb2YgY2hhbmdlcyBtYWRlIGJ5IHRoZSAwLjE0LjAgcmVsZWFzZToN CiAgW2h0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tb2NhbWxmb3JtYXQtMC0xNC0wLzU0 MzVdDQoNCg0KSG93IHRvIG1pZ3JhdGUgZnJvbSAwLjE0LjANCuKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jA0KDQogIFRoZSAwLjE0LjAgcmVsZWFzZSBsZWFkIHRvIHNvbWUgcmVncmVzc2lvbiBvZiB0aGUg YGRvYy1jb21tZW50cycNCiAgYmVoYXZpb3IgdGhhdCAoYWx0aG91Z2ggaW50ZW5kZWQgZm9yIHVz KSBsZWFkIHRvIHNvbWUgc3VycHJpc2UgZnJvbSBhDQogIGxvdCBvZiB1c2Vycy4gIFRoZSBiZWhh dmlvciBvZiBgZG9jLWNvbW1lbnRzJyBoYXMgdGh1cyBiZWVuIHJldmVydGVkDQogIHRvIGl0J3Mg MC4xMy4wIHN0YXRlIHdpdGggdGhlIGZvbGxvd2luZyBjaGFuZ2VzOg0KDQogIFRoZSBgZG9jLWNv bW1lbnRzLXZhbCcgb3B0aW9uIGhhcyBiZWVuIHJlbW92ZWQgYW5kIG1lcmdlZCB3aXRoDQogIGBk b2MtY29tbWVudHMnLiBUaGUgcGxhY2VtZW50IG9mIGRvY3VtZW50YXRpb24gY29tbWVudHMgb24g YHZhbCcgYW5kDQogIGBleHRlcm5hbCcgaXRlbXMgaXMgbm93IGNvbnRyb2xsZWQgYnkgYGRvYy1j b21tZW50cycgLg0KDQogIOKAoiBgZG9jLWNvbW1lbnRzPWFmdGVyJyBiZWNvbWVzIGBkb2MtY29t bWVudHM9YWZ0ZXItd2hlbi1wb3NzaWJsZScgdG8NCiAgICB0YWtlIGludG8gYWNjb3VudCB0aGUg dGVjaG5pY2FsIGxpbWl0YXRpb25zIG9mIG9jYW1sZm9ybWF0Ow0KICDigKIgYGRvYy1jb21tZW50 cz1iZWZvcmUnIGlzIHVuY2hhbmdlZDsNCiAg4oCiIGBkb2MtY29tbWVudHMtdmFsJyBpcyBub3cg cmVwbGFjZWQgd2l0aCBgZG9jLWNvbW1lbnRzJw0KDQogIFRvIHJlcHJvZHVjZSB0aGUgZm9ybWVy IGJlaGF2aW9ycw0KICDigKIgYGRvYy1jb21tZW50cz1iZWZvcmUnICsgYGRvYy1jb21tZW50cy12 YWw9YmVmb3JlJyA6IG5vdyB1c2UNCiAgICBgZG9jLWNvbW1lbnRzPWJlZm9yZScgOw0KICDigKIg YGRvYy1jb21tZW50cz1iZWZvcmUnICsgYGRvYy1jb21tZW50cy12YWw9YWZ0ZXInIDogbm93IHVz ZQ0KICAgIGBkb2MtY29tbWVudHM9YmVmb3JlLWV4Y2VwdC12YWwnIDsNCiAg4oCiIGBkb2MtY29t bWVudHM9YWZ0ZXInICsgYGRvYy1jb21tZW50cy12YWw9YmVmb3JlJyA6IHRoaXMgYmVoYXZpb3Ig ZGlkDQogICAgbm90IG1ha2UgbXVjaCBzZW5zZSBhbmQgaXMgbm90IGF2YWlsYWJsZSBhbnltb3Jl Ow0KICDigKIgYGRvYy1jb21tZW50cz1hZnRlcicgKyBgZG9jLWNvbW1lbnRzLXZhbD1hZnRlcicg OiBub3cgdXNlDQogICAgYGRvYy1jb21tZW50cz1hZnRlci13aGVuLXBvc3NpYmxlJy4NCg0KDQpI b3cgdG8gbWlncmF0ZSBmcm9tIDAuMTQuMQ0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgVGhl IDAuMTQuMSByZWxlYXNlIHdhcyBwcmVzZXJ2aW5nIHRoZSBiZWhhdmlvciBvZiAwLjEzLjAgcmVn YXJkaW5nDQogIGBkb2MtY29tbWVudHMnLCBpdCBhZGRlZCBhIGB1bnNldCcgdmFsdWUgdG8gdGhl IGBkb2MtY29tbWVudHMtdmFsJw0KICBvcHRpb24uICBUaGlzIG9wdGlvbiBoYXMgYmVlbiByZW1v dmVkIHdpdGggdGhlIGZvbGxvd2luZyBjaGFuZ2VzOg0KDQogIFRoZSBgZG9jLWNvbW1lbnRzLXZh bCcgb3B0aW9uIGhhcyBiZWVuIHJlbW92ZWQgYW5kIG1lcmdlZCB3aXRoDQogIGBkb2MtY29tbWVu dHMnLiBUaGUgcGxhY2VtZW50IG9mIGRvY3VtZW50YXRpb24gY29tbWVudHMgb24gYHZhbCcgYW5k DQogIGBleHRlcm5hbCcgaXRlbXMgaXMgbm93IGNvbnRyb2xsZWQgYnkgYGRvYy1jb21tZW50cycg Lg0KDQogIOKAoiBgZG9jLWNvbW1lbnRzPWFmdGVyJyBiZWNvbWVzIGBkb2MtY29tbWVudHM9YWZ0 ZXItd2hlbi1wb3NzaWJsZScgdG8NCiAgICB0YWtlIGludG8gYWNjb3VudCB0aGUgdGVjaG5pY2Fs IGxpbWl0YXRpb25zIG9mIG9jYW1sZm9ybWF0Ow0KICDigKIgYGRvYy1jb21tZW50cz1iZWZvcmUn IGlzIHVuY2hhbmdlZDsNCiAg4oCiIGBkb2MtY29tbWVudHMtdmFsJyBpcyBub3cgcmVwbGFjZWQg d2l0aCBgZG9jLWNvbW1lbnRzJw0KDQogIFRvIHJlcHJvZHVjZSB0aGUgZm9ybWVyIGJlaGF2aW9y cw0KICDigKIgYGRvYy1jb21tZW50cz1iZWZvcmUnICsgYGRvYy1jb21tZW50cy12YWw9YmVmb3Jl JyA6IG5vdyB1c2UNCiAgICBgZG9jLWNvbW1lbnRzPWJlZm9yZScgOw0KICDigKIgYGRvYy1jb21t ZW50cz1iZWZvcmUnICsgYGRvYy1jb21tZW50cy12YWw9YWZ0ZXInIDogbm93IHVzZQ0KICAgIGBk b2MtY29tbWVudHM9YmVmb3JlLWV4Y2VwdC12YWwnIDsNCiAg4oCiIGBkb2MtY29tbWVudHM9YWZ0 ZXInICsgYGRvYy1jb21tZW50cy12YWw9YmVmb3JlJyA6IHRoaXMgYmVoYXZpb3IgZGlkDQogICAg bm90IG1ha2UgbXVjaCBzZW5zZSBhbmQgaXMgbm90IGF2YWlsYWJsZSBhbnltb3JlOw0KICDigKIg YGRvYy1jb21tZW50cz1hZnRlcicgKyBgZG9jLWNvbW1lbnRzLXZhbD1hZnRlcicgOiBub3cgdXNl DQogICAgYGRvYy1jb21tZW50cz1hZnRlci13aGVuLXBvc3NpYmxlJy4NCg0KDQpUaGFuayB5b3UN CuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIFdlIHdvdWxkIGxpa2UgdG8gdGhhbmsg b3VyIGVhcmx5IHVzZXJzIHRvIGhlbHAgdXMgb24gdGhlIHJvYWQgb2YgYQ0KICBzdGFibGUgMS4w LjAgcmVsZWFzZSBvZiBvY2FtbGZvcm1hdC4NCg0KDQpNTCBGYW1pbHkgV29ya3Nob3AgMjAyMDog Q2FsbCBmb3IgcHJlc2VudGF0aW9ucw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAg QXJjaGl2ZToNCiAgW2h0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9tbC1mYW1pbHktd29ya3No b3AtMjAyMC1jYWxsLWZvci1wcmVzZW50YXRpb25zLzU0NDEvNF0NCg0KDQpMZW8gV2hpdGUgYW5u b3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIANCg0KICBJQ0ZQLCBhbmQgYnkgZXh0ZW5zaW9uIHRoZSBNTCB3b3Jrc2hvcCwgd2ls bCBiZSBub3cgb2ZmaWNpYWxseSBiZSBoZWxkDQogIG9ubGluZSB3aXRoIGEgc2lnbmlmaWNhbnRs eSByZWR1Y2VkIGZlZS4gRHVlIHRvIHRoZSBjaGFuZ2UgaW4gb2ZmaWNpYWwNCiAgc3RhdHVzIHdl IGRlY2lkZWQgdG8gZXh0ZW5kIHRoZSBzdWJtaXNzaW9uIGRlYWRsaW5lIHRvIHRoZSBlbmQgb2Yg TWF5Lg0KDQoNCkltcG9ydGFudCBEYXRlcyAodXBkYXRlZCkNCuKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0K DQogIOKAoiBGcmlkYXkgMjl0aCBNYXkgKGFueSB0aW1lIHpvbmUpOiBBYnN0cmFjdCBzdWJtaXNz aW9uIGRlYWRsaW5lDQogIOKAoiBGcmlkYXkgMTd0aCBKdWx5OiBBdXRob3Igbm90aWZpY2F0aW9u DQogIOKAoiBUaHVyc2RheSAyN3RoIEF1Z3VzdDogTUwgRmFtaWx5IFdvcmtzaG9wDQoNCg0KbWVt cHJvZi1saW1pdHMgcHJldmlldyAoYW5kIGEgZ3VpZGUgdG8gaGFuZGxlIGFzeW5jaHJvbm91cyBl eGNlcHRpb25zKQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAg QXJjaGl2ZToNCiAgW2h0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tbWVtcHJvZi1saW1p dHMtcHJldmlldy1hbmQtYS1ndWlkZS10by1oYW5kbGUtYXN5bmNocm9ub3VzLWV4Y2VwdGlvbnMv NTc1Ni8xXQ0KDQoNCkd1aWxsYXVtZSBNdW5jaC1NYWNjYWdub25pIGFubm91bmNlZA0K4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgRGVhciBP Q2FtbGVycywgSSBhbSBoYXBweSB0byBwcmUtYW5ub3VuY2UgW21lbXByb2YtbGltaXRzXSwgYW4N CiAgaW1wbGVtZW50YXRpb24gb2YgcGVyLXRocmVhZCBnbG9iYWwgbWVtb3J5IGxpbWl0cywgYW5k IHBlci10aHJlYWQNCiAgYWxsb2NhdGlvbiBsaW1pdHMgw6AgbGEgSGFza2VsbCwgY29tcGF0aWJs ZSB3aXRoIHN5c3RocmVhZHMuDQoNCiAgTWVtcHJvZi1saW1pdHMgaW50ZXJydXB0cyB0aGUgZXhl Y3V0aW9uIGJ5IHJhaXNpbmcgYW4gX2FzeW5jaHJvbm91cw0KICBleGNlcHRpb25fLCBhbiBleGNl cHRpb24gdGhhdCBjYW4gYXJpc2UgYXQgYWxtb3N0IGFueSBsb2NhdGlvbiBpbiB0aGUNCiAgY29k ZS4gSSBhbHNvIGFubm91bmNlIFthIGd1aWRlIG9uIGhvdyB0byByZWNvdmVyIGZyb20gYXN5bmNo cm9ub3VzDQogIGV4Y2VwdGlvbnMgYW5kIG90aGVyIHVuZXhwZWN0ZWQgZXhjZXB0aW9uc10gdGhh dCB5b3UgZmluZCBpbiB0aGUNCiAgZG9jdW1lbnRhdGlvbi4gSXQgc3VtbWFyaXNlcyBrbm93bGVk Z2UgYWNxdWlyZWQgaW4gT0NhbWwgYnkgdGhlIENvcQ0KICBwcm9vZiBhc3Npc3RhbnQgYXMgd2Vs bCBhcyBpbiBvdGhlciBwcm9ncmFtbWluZyBsYW5ndWFnZXMuIFRvIG15DQogIGtub3dsZWRnZSwg dGhpcyBoYXMgbmV2ZXIgYmVlbiB0b2xkIGluIE9DYW1sIHRleHRib29rcywgc28gSSB0aG91Z2h0 DQogIGl0IG1pZ2h0IGJlIG9mIGdlbmVyYWwgaW50ZXJlc3QgdG8geW91LiBUaGlzIHJlc2VhcmNo IGlzIHBhcnQgb2YgYQ0KICB3aWRlciB3b3JrIGFpbWluZyB0byByZWd1bGF0ZSB0aGUgdXNlIG9m IGFzeW5jaHJvbm91cyBleGNlcHRpb25zIGluDQogIE9DYW1sIGluIGNvb3JkaW5hdGlvbiB3aXRo IG11bHRpY29yZSBsYW5ndWFnZSBkZXNpZ25lcnMuDQoNCiAgX0dsb2JhbCBtZW1vcnkgbGltaXRz XyBsZXQgeW91IGJvdW5kIHRoZSBtZW1vcnkgY29uc3VtcHRpb24gaW5zaWRlDQogIHNwZWNpZmlj IHBhcnRzIG9mIHlvdXIgcHJvZ3JhbSwgaW4gdGVybXMgb2YgbWVtb3J5IHVzZWQgYnkgdGhlIHdo b2xlDQogIHByb2dyYW0uIEl0IGlzIGluc3BpcmVkIGJ5IFt0aGlzIG90aGVyIHBvc3RdLCBidXQg aW4gYSBmb3JtIHJlYWRpbHkNCiAgYXZhaWxhYmxlIGZvciB1c2Ugd2l0aCBzeXN0aHJlYWRzLg0K DQogIF9BbGxvY2F0aW9uIGxpbWl0c18gbGV0IHlvdSBib3VuZCB0aGUgZXhlY3V0aW9uIG9mIHBh cnRzIG9mIHRoZQ0KICBwcm9ncmFtIG1lYXN1cmVkIGluIG51bWJlciBvZiBhbGxvY2F0aW9ucywg YW5hbG9nb3VzIHRvIHRoZSBzYW1lDQogIGZlYXR1cmUgaW4gSGFza2VsbCBhZHZvY2F0ZWQgaW4g W2EgbmljZSBwb3N0IGJ5IFNpbW9uDQogIE1hcmxvd10uIEFsbG9jYXRpb24gbGltaXRzIGNvdW50 IGFsbG9jYXRpb25zIGJ1dCBfbm90XyBkZWFsbG9jYXRpb25zLA0KICBhbmQgaXMgdGhlcmVmb3Jl IGEgbWVhc3VyZSBvZiB0aGUgd29yayBkb25lLCB3aGljaCBjYW4gYmUgbW9yZQ0KICBzdWl0YWJs ZSB0aGFuIGV4ZWN1dGlvbiB0aW1lLg0KDQogIE1lbXByb2YtbGltaXRzLCBhcyB0aGUgbmFtZSB0 ZWxscywgdXNlcyB0aGUgdXBjb21pbmcgTWVtcHJvZiBlbmdpbmUNCiAgZnJvbSBPQ2FtbCA0LjEx LCB3aXRoIGEgbG93IHNhbXBsaW5nIHJhdGUgdGhhdCBkb2VzIG5vdCBhZmZlY3QNCiAgcGVyZm9y bWFuY2UuIEEgcmVpbXBsZW1lbnRhdGlvbiBvZiB0aGUgTWVtcHJvZiBpbnRlcmZhY2UgY29tcGF0 aWJsZQ0KICB3aXRoIG1lbXByb2YtbGltaXRzIHJ1bm5pbmcgYXQgdGhlIHNhbWUgdGltZSBpcyBw cm92aWRlZCBmb3IgcHJvZmlsaW5nDQogIG5lZWRzLg0KDQogIE1lbXByb2YtbGltaXRzIGlzIGF2 YWlsYWJsZSBvbiB0aGUgcHVibGljIG9wYW0gcmVwb3NpdG9yeSwgYnV0IGRlcGVuZHMNCiAgb24g T0NhbWwgNC4xMSB3aGljaCBhdCB0aGUgbW9tZW50IGlzIGF2YWlsYWJsZSBmcm9tIHRoZSBiZXRh IG9wYW0NCiAgcmVwb3NpdG9yeSBvbmx5LiBJdCBpcyBfZXhwZXJpbWVudGFsXyBmb3IgcmVhc29u cyBleHBsYWluZWQgaW4gdGhlDQogIG1hbnVhbC4NCg0KDQpbbWVtcHJvZi1saW1pdHNdIGh0dHBz Oi8vZ2l0bGFiLmNvbS9nYWRtbS9tZW1wcm9mLWxpbWl0cw0KDQpbYSBndWlkZSBvbiBob3cgdG8g cmVjb3ZlciBmcm9tIGFzeW5jaHJvbm91cyBleGNlcHRpb25zIGFuZCBvdGhlcg0KdW5leHBlY3Rl ZCBleGNlcHRpb25zXSBodHRwczovL2dpdGxhYi5jb20vZ2FkbW0vbWVtcHJvZi1saW1pdHMjcmVj b3Zlcg0KDQpbdGhpcyBvdGhlciBwb3N0XQ0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L3Rv ZGF5cy10cmljay1tZW1vcnktbGltaXRzLXdpdGgtZ2MtYWxhcm1zLzQ0MzENCg0KW2EgbmljZSBw b3N0IGJ5IFNpbW9uIE1hcmxvd10NCmh0dHBzOi8vc2ltb25tYXIuZ2l0aHViLmlvL3Bvc3RzLzIw MTctMDEtMjQtYXN5bmNocm9ub3VzLWV4Y2VwdGlvbnMuaHRtbA0KDQpGQVENCuKVjOKVjOKVjA0K DQril4og4oCcSXMgaXQgd2lzZSB0byByZWx5IG9uIHRoZSBzdGF0aXN0aWNhbCBuYXR1cmUgb2Yg TWVtcHJvZj8gSWYgSSBzZXQgYW4gYWxsb2NhdGlvbiBsaW1pdCBvZiAxMDAgS0IsIGFuZCBydW4g YSBmdW5jdGlvbiB0aGF0IGFsbG9jYXRlcyBleGFjdGx5IDUwIEtCLCB0aGVuIHRoZSBmdW5jdGlv biBtaWdodCBmYWlsLCBkdWUgdG8gdGhlIHJhbmRvbSBuYXR1cmUgb2YgTWVtcHJvZi7igJ0NCg0K ICBNZW1wcm9mLWxpbWl0cyBpcyBwcm92aWRlZCB3aXRoIGEgW3N0YXRpc3RpY2FsIGFuYWx5c2lz XSBtZWFudCB0byBoZWxwDQogIHlvdSBjaG9zZSBhcHByb3ByaWF0ZSB2YWx1ZXMgZm9yIHRoZSBs aW1pdCBkZXBlbmRpbmcgb24gYSB0YXJnZXQgc2FmZQ0KICBhbGxvY2F0aW9uIHZhbHVlLiAoTmlj ZSBwaWN0dXJlcyBvbWl0dGVkIGJlY2F1c2UgdGhpcyBkaXNjdXNzIGRvZXMgbm90DQogIHN1cHBv cnQgc3ZnLikNCg0KICBMb25nIHN0b3J5IHNob3J0LCBtZW1wcm9mLWxpbWl0cyBzdGFydHMgYmVp bmcgYWNjdXJhdGUtZW5vdWdoIHN0YXJ0aW5nDQogIGFyb3VuZCBhIHNhZmUgYWxsb2NhdGlvbiB2 YWx1ZSBvZiAxMDAgS0Igd2l0aCB0aGUgZGVmYXVsdCBzYW1wbGluZw0KICByYXRlIChtZWFuaW5n IGEgbGltaXQgb2YgMSB0byAzIE1CIGRlcGVuZGluZyBvbiBjaG9zZW4gcHJlY2lzaW9uKSwNCiAg d2l0aCB0aGUgcmF0aW8gYmV0d2VlbiB0aGUgbWF4aW1hbCBzYWZlIGFsbG9jYXRpb24gYW5kIHRo ZSBsaW1pdA0KICBkcm9wcGluZyB2ZXJ5IHF1aWNrbHkgZm9yIGhpZ2hlciB2YWx1ZXMuIENvcnJl Y3RseSwgdGhlIGFuYWx5c2lzIHNob3dzDQogIHRoYXQgbGltaXRzIHVuZGVyIDUwMCBLQiBhcmUg dW5yZWxpYWJsZS4NCg0KICBJIGhhdmUgZm91bmQgdGhhdCB0aGUgc3RhdGlzdGljYWwgbmF0dXJl IG9mIE1lbXByb2YgbWFrZXMgaXQgdmVyeSBlYXN5DQogIHRvIHJlYXNvbiBhYm91dCBpdHMgYXBw bGljYXRpb24gYW5kIG5vdCBoYXZlIHRvIGZhY3RvciBpbiBydW50aW1lDQogIGltcGxlbWVudGF0 aW9uIGRldGFpbHMuIEluIGFkZGl0aW9uLCBNZW1wcm9mIGlzIG5ldmVydGhlbGVzcw0KICBkZXRl cm1pbmlzdGljLCB3aGljaCBpcyAoZXNzZW50aWFsIGFuZCkgdXNlZnVsIGZvciByZXByb2R1Y2lu ZyBydW5zIGluDQogIHRlc3Qgc2NlbmFyaW9zLg0KDQoNCiAgW3N0YXRpc3RpY2FsIGFuYWx5c2lz XQ0KICBodHRwczovL2dpdGxhYi5jb20vZ2FkbW0vbWVtcHJvZi1saW1pdHMjc3RhdGlzdGljYWwN Cg0KDQril4og4oCcQnV0IGNhbiB3ZSByZWFsbHkgcHJvZ3JhbSB3aXRoIG1lbXByb2YtbGltaXRz LCB0aGF0IGlzLCBub3Qgb25seSB3cml0ZSBwcm9ncmFtcyBidXQgYWxzbyByZWFzb24gYWJvdXQg dGhlbSwgZ2l2ZW4gdGhlIHByb2JhYmlsaXN0aWMgbmF0dXJlIG9mIHRoZSBndWFyYW50ZWVzP+KA nQ0KDQogIFllcywgaWYgd2UgbWFrZSB0d28gYWRkaXRpb25hbCBoeXBvdGhlc2VzOg0KDQogIDEu IEFsbG9jYXRpb24gbGltaXRzIChhcyB1c2VkIGluIEhhc2tlbGwpIGFyZSB1c2VkIGJ5IGRldGVy bWluaW5nIHBlYWsNCiAgICAgcmVhc29uYWJsZSBhbGxvY2F0aW9uIHVzYWdlIGVtcGlyaWNhbGx5 IGFuZCBwaWNraW5nIGEgbGltaXQgYXQgYQ0KICAgICBjb21mb3J0YWJsZSBtYXJnaW4gb3ZlciBp dCwgcmF0aGVyIHRoYW4gY29tcHV0aW5nIGEgcHJlY2lzZSBtZW1vcnkNCiAgICAgYm91bmQgdG8g YmUgdXNlZCBhcyBhIGxpbWl0LiBJbiB2ZXJ5IGNvbnRyb2xsZWQgZW52aXJvbm1lbnRzIHdoZXJl DQogICAgIHRoZSBsYXR0ZXIgd291bGQgYmUgcG9zc2libGUsIHRoZXJlIHByb2JhYmx5IHdvdWxk IGJlIGJldHRlcg0KICAgICBzb2x1dGlvbnMsIGFuZCB0aGUgbGFuZ3VhZ2UgdGhpcyBpcyBpbnNw aXJlZCBmcm9tIG1ha2VzIGl0IHZlcnkNCiAgICAgaGFyZCB0byBtYWtlIHByZWRpY3Rpb25zIG9u IG1lbW9yeSB1c2UuDQogIDIuIFRoZSBwcm9ncmFtbWVyIGlzIGZpbmUgd2l0aCBhIHZlcnkgdW5s aWtlbHkgcG9zc2liaWxpdHkgb2YgYSBmYWxzZQ0KICAgICBwb3NpdGl2ZTsgaW5kZWVkIHRoZSBw cm9ncmFtIGlzIGFscmVhZHkgZGVzaWduZWQgdG8gbGV0IHRydWUNCiAgICAgcG9zaXRpdmVzIGZh aWwgd2l0aG91dCBicmluZ2luZyBkb3duIG1pc3Npb24tY3JpdGljYWwgcGFydHMgb2YgdGhlDQog ICAgIHByb2dyYW0uIEZvciBpbnN0YW5jZSB0aGV5IGNhbiBwcmVmZXIgdG8gc2VlIGEgbGVnaXRp bWF0ZSBjbGllbnQNCiAgICAgaGF2aW5nIGEgY29ubmV4aW9uIGNsb3NlZCBvbmNlIGV2ZXJ5IDEw 4oG/IHllYXIgZm9yICpuKiBvZiB0aGVpcg0KICAgICBjaG9vc2luZywgaWYgdGhhdCBpcyB0aGUg cHJpY2UgdG8gcGF5IGZvciBhdm9pZGluZyBiZWluZyBzdWJqZWN0IHRvDQogICAgIERPUyBvbiBt YWxpY2lvdXNseS1jcmFmdGVkIHJlcXVlc3RzLg0KDQogIFVuZGVyIHRoZXNlIGh5cG90aGVzZXMs IHRoZSBzdGF0aXN0aWNhbCBsaW1pdCBpcyBqdXN0IGFzIHJlbGlhYmxlIGFzDQogIHRoZSBwcmVj aXNlIGxpbWl0cyDDoCBsYSBIYXNrZWxsLg0KDQoNCuKXiiDigJxJcyBpdCBwb3NzaWJsZSB0byBh bHNvIGltcGxlbWVudCBfbG9jYWwgbWVtb3J5IGxpbWl0c18sIHRvIGJvdW5kIHRoZSBtZW1vcnkg Y29uc3VtcHRpb24gb2YgYSBwYXJ0aWN1bGFyIGZ1bmN0aW9uP+KAnQ0KDQogIFllcyBidXQgcmVh ZCBvbi4NCg0KICBbWWFuZyAmIE1hemnDqHJlcyAoMjAxNCldIGFkdm9jYXRlcyBpbiBmYXZvdXIg b2YgYW4gX2FsbG9jYXRvci1wYXlzXw0KICBtb2RlbCBvZiBjb3N0IGF0dHJpYnV0aW9uLCBhbmQg bm90ZSBpdHMgc2ltaWxhcml0eSB3aXRoIG1lbW9yeQ0KICBwcm9maWxpbmcuIEluIHRoaXMgbW9k ZWwsIGl0IGlzIHBvc3NpYmxlIGZvciBpbnN0YW5jZSB0byBwcm9jZXNzDQogIHVudHJ1c3RlZCB1 c2VyIGlucHV0IHVuZGVyIHNvbWUgbWVtb3J5IGxpbWl0LCBiZWZvcmUgdGhlIHJlc3VsdCBpcw0K ICBkaXN0cmlidXRlZCB0byB0aGUgcmVzdCBvZiB0aGUgcHJvZ3JhbS4NCg0KICBJbXBsZW1lbnRp bmcgbWVtb3J5IGxpbWl0cyBiYXNlZCBvbiB0aGUgYWxsb2NhdG9yLXBheXMgbW9kZWwsIGJ5DQog IGFkYXB0aW5nIGFsbG9jYXRpb24gbGltaXRzIHRvIHRha2UgaW50byBhY2NvdW50IGRlYWxsb2Nh dGlvbnMsIHdvdWxkDQogIGJlIHZlcnkgZWFzeSB0aGFua3MgdG8gdGhlIGZhY2lsaXRpZXMgcHJv dmlkZWQgYnkgTWVtcHJvZi4gTW9yZW92ZXIsDQogIHRoZSBzdGF0aXN0aWNhbCBhbmFseXNpcyBv ZiBhbGxvY2F0aW9uIGxpbWl0cyBjYW4gYmUgdHJhbnNwb3NlZCwgYW5kDQogIGd1YXJhbnRlZXMg c2ltaWxhcmx5IGFjY3VyYWN5IGF0IGEgbG93IHJ1bnRpbWUgY29zdCBmb3IgbGltaXRzIGdyZWF0 ZXINCiAgdGhhbiAxMDBLQi4NCg0KICBUaGVyZSBpcyBvbmUgc3VycHJpc2luZyBkaWZmaWN1bHR5 LCB0aG91Z2gsIHdoaWNoIGhhcyB0byBkbyB3aXRoIHRoZQ0KICB3YXkgdGhlIEdDIHdvcmtzLiBU aGUgR0MgaGFzIGEgc3BhY2Ugb3ZlcmhlYWQ6IG1lbW9yeSB0aGF0IGlzIHdhc3RlZA0KICBiZWNh dXNlIHVucmVhY2hhYmxlIHZhbHVlcyBhcmUgbm90IGNvbGxlY3RlZCBpbW1lZGlhdGVseS4gVGhp cw0KICBvdmVyaGVhZCBoYXMgdG8gYmUgdGFrZW4gaW50byBhY2NvdW50IHdoZW4gY2hvb3Npbmcg dGhlDQogIGxpbWl0LiBIb3dldmVyLCB0aGlzIG92ZXJoZWFkIGlzIG5vbi1sb2NhbCBhbmQgZGVw ZW5kZW50IG9uIHRoZQ0KICBfdG90YWxfIG1ham9yIGhlYXAgc2l6ZTogb25lIGNhbm5vdCBqdXN0 IHNheSDigJx0YWtlIHRoZSBkb3VibGUgb2YgdGhlDQogIGRlc2lyZWQgbGltaXTigJ0uIEluZGVl ZCwgYWN0aXZlIHRocmVhZHMgd2lsbCBwYXkgZm9yIG1lbW9yeSB0aGF0IGhhcw0KICBiZWVuIGFs bG9jYXRlZCBpbiB0aGUgcGFzdCBhbmQga2VwdCBhbGl2ZS4gTW9yZSBleHBlcmltZW50YXRpb24g aXMNCiAgbmVlZGVkIHRvIHByb3ZpZGUgZ3VpZGFuY2Ugb24gaG93IHRvIHRha2UgdGhlIHNwYWNl IG92ZXJoZWFkIGludG8NCiAgYWNjb3VudC4NCg0KDQogIFtZYW5nICYgTWF6acOocmVzICgyMDE0 KV0NCiAgaHR0cHM6Ly9kbC5hY20ub3JnL2RvaS8xMC4xMTQ1LzI1OTQyOTEuMjU5NDM0MQ0KDQoN CuKXiiDigJxDYW4gdGhpcyBiZSB1c2VkIHRvIGJvdW5kIHRoZSBjb25zdW1wdGlvbiBvZiBsaWdo dHdlaWdodCB0aHJlYWRzIGluIEx3dCBhbmQgQXN5bmM/4oCdDQoNCiAgSXQgaXMgc3RyYWlnaHRm b3J3YXJkIHRvIG1ha2UgbWVtcHJvZi1saW1pdHMgcGFyYW1ldHJpYyBpbiB0aGUgbm90aW9uDQog IG9mIF90aHJlYWQgaWRfIHVzZWQgdG8gdHJhY2sgcGVyLXRocmVhZCBsaW1pdHMuICBIb3dldmVy LCB0byB0aGUgYmVzdA0KICBvZiBteSBrbm93bGVkZ2UsIEx3dCBhbmQgQXN5bmMgYXJlIG5vdCBt ZWFudCB0byBwbGF5IHdlbGwgd2hlbiB0aGUNCiAgY29tcHV0YXRpb24gaXMgaW50ZXJydXB0ZWQg YnkgYXN5bmNocm9ub3VzIGV4Y2VwdGlvbnMuIElmIHlvdSBoYXZlDQogIG1vcmUgaW5mb3JtYXRp b24gYWJvdXQgdGhpcyBsaW1pdGF0aW9uIG9yIGFyZSBpbnRlcmVzdGVkIGluDQogIGV4cGVyaW1l bnRpbmcsIHBsZWFzZSBnZXQgaW4gdG91Y2guDQoNCg0KVGhhbmtzDQrilYzilYzilYzilYzilYzi lYwNCg0KICBUaGFuayB5b3UgdG8gSmFjcXVlcy1IZW5yaSBKb3VyZGFuIGZvciBoaXMgZXhwbGFu YXRpb25zIGFib3V0IE1lbXByb2YNCiAgYW5kIFN0ZXBoZW4gRG9sYW4gZm9yIGhpcyBmZWVkYmFj ay4NCg0KDQpUZXpvcyA3LjAgaXMgbm93IGF2YWlsYWJsZSBvbiBvcGFtDQrilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICBbaHR0cHM6 Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi10ZXpvcy03LTAtaXMtbm93LWF2YWlsYWJsZS1vbi1v cGFtLzU3NjQvMV0NCg0KDQpQaWVycmUgQm91dGlsbGllciBhbm5vdW5jZWQNCuKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgA0KDQogIFRlem9zIGV4ZWN1dGFibGVzIGFuZCBsaWJyYXJpZXMgaGF2ZSBq dXN0IGJlZW4gcmVsZWFzZWQgb24gYG9wYW0nLiBZb3UNCiAgY2FuIHRodXMgYnVpbGQgdGhlbSBm cm9tIHNvdXJjZSB3aXRoIGEgc2ltcGxlIGBvcGFtIGluc3RhbGwgdGV6b3MnIGFuZA0KICBidWls ZCB5b3VyIG93biBwcm9qZWN0cyB1cG9uIHRoZW0uDQoNCg0KV2hhdCBpcyBUZXpvcw0K4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgVGV6b3MgaXMgYSBkaXN0cmli dXRlZCBjb25zZW5zdXMgcGxhdGZvcm0gd2l0aCBtZXRhLWNvbnNlbnN1cw0KICBjYXBhYmlsaXR5 LiBUZXpvcyBub3Qgb25seSBjb21lcyB0byBjb25zZW5zdXMgYWJvdXQgdGhlIHN0YXRlIG9mIGl0 cw0KICBsZWRnZXIsIGxpa2UgQml0Y29pbiBvciBFdGhlcmV1bS4gSXQgYWxzbyBjb21lcyB0byBj b25zZW5zdXMgYWJvdXQgaG93DQogIHRoZSBwcm90b2NvbCBhbmQgdGhlIG5vZGVzIHNob3VsZCBh ZGFwdCBhbmQgdXBncmFkZS4gRm9yIG1vcmUNCiAgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHByb2pl Y3QsIHNlZSBbaHR0cHM6Ly90ZXpvcy5jb21dLg0KDQogIE91ciBpbXBsZW1lbnRhdGlvbiBvZiBU ZXpvcyBpcyB3cml0dGVuIGluIE9DYW1sLiBJdCBpcyBzcGxpdCBpbnRvDQogIHNldmVyYWwgbGli cmFyaWVzIChjb21tYW5kLWxpbmUgaW50ZXJmYWNlIGB0ZXpvcy1jbGljJywgcGVlci10by1wZWVy DQogIGxpYnJhcnkgYHRlem9zLXAycCcsIGNyeXB0b2dyYXBoaWMgcHJpbWl0aXZlcyBgdGV6b3Mt Y3J5cHRvfuKApikgYW5kDQogIGV4ZWN1dGFibGVzIChub2RlIH50ZXpvcy1ub2RlJywgY2xpZW50 IH50ZXpvcy1jbGllbnR+4oCmKS4NCg0KDQpVc2VmdWwgTGlua3MNCuKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIFNvdXJjZSBjb2RlIGZvciB0aGlzIHBhcnRpY3VsYXIg aW1wbGVtZW50YXRpb24gY2FuIGJlIGZvdW5kIGF0DQogIFtodHRwczovL2dpdGxhYi5jb20vdGV6 b3MvdGV6b3MvXS4gRGV2ZWxvcGVyIGRvY3VtZW50YXRpb24gaXMNCiAgYXZhaWxhYmxlIGF0IFto dHRwczovL3Rlem9zLmdpdGxhYi5pby9dLiBJbiBwYXJ0aWN1bGFyLCBkb2N1bWVudGF0aW9uDQog IGZvciB0aGlzIHNwZWNpZmljIHJlbGVhc2UgKHZlcnNpb24gNy4wKSBpcyBhdmFpbGFibGUgYXQN CiAgW2h0dHA6Ly90ZXpvcy5naXRsYWIuaW8vcmVsZWFzZXMvdmVyc2lvbi03Lmh0bWxdLg0KDQoN Ckluc3RhbGxhdGlvbiBJbnN0cnVjdGlvbnMNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIFRlem9z IChpbnRlcm5hbCBjb21waWxlciBpbiBvcmRlciB0byBzZWxmIGFtZW5kIGl0c2VsZikgcmVxdWly ZXMgYQ0KICBzcGVjaWZpYyB2ZXJzaW9uIG9mIHRoZSBjb21waWxlciAoT0NhbWwgNC4wOS4xKToN Cg0KICDilIzilIDilIDilIDilIANCiAg4pSCIG9wYW0gc3dpdGNoIDQuMDkuMQ0KICDilJTilIDi lIDilIDilIANCg0KICBUZXpvcyBhbHNvIHJlcXVpcmVzIHNvbWUgZXh0ZXJuYWwgbGlicmFyaWVz Og0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgb3BhbSBkZXBleHQgdGV6b3MNCiAg4pSU4pSA 4pSA4pSA4pSADQoNCiAgRmluYWxseSwgdG8gaW5zdGFsbCBhbGwgYmluYXJpZXM6DQoNCiAg4pSM 4pSA4pSA4pSA4pSADQogIOKUgiBvcGFtIGluc3RhbGwgdGV6b3MNCiAg4pSU4pSA4pSA4pSA4pSA DQoNCg0KUmVwbHlpbmcgdG8gTmljayBCZXR0ZXJpZGdlLCBSYXBoYcOrbCBQcm91c3Qgc2FpZA0K 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgVGV6b3MgaGFzIGEgc29mdC11cGRh dGluZyBtZWNoYW5pc20gdGhhdCB3b3JrcyAocm91Z2hseSkgYXMgZm9sbG93czoNCg0KICBUaGUg bmV0d29yayBzdGFydHMgd2l0aCBhIGdlbmVzaXMgcHJvdG9jb2wgKOKAnHByb3RvY29s4oCdIGhl cmUgbWVhbnMNCiAg4oCcZWNvbm9taWMgcHJvdG9jb2zigJ06IHRoZSBydWxlcyBhY2NvcmRpbmcg dG8gd2hpY2ggc21hcnQgY29udHJhY3RzIGFyZQ0KICBpbml0aWF0ZWQgYW5kIGFjdGVkIHVwb24s IHRyYW5zYWN0aW9ucyB0YWtlIHBsYWNlLCBldGMuKSBpbiB3aGljaCBhDQogIHNpbmdsZSBwdWJs aWMga2V5IGlzIHNwZWNpZmllZC4NCg0KICBUaGUgZ2VuZXNpcyBwcm90b2NvbCBoYXMgbm8gbm90 aW9uIG9mIGNvaW4sIGN1cnJlbmN5LCBzbWFydC1jb250cmFjdCwNCiAgZXRjLiBJbnN0ZWFkLCB0 aGUgZ2VuZXNpcyBwcm90b2NvbCBrbm93cyBhIHNpbmdsZSBvcGVyYXRpb246IGENCiAgcHJvdG9j b2wgaW5qZWN0aW9uLg0KDQogIFRoZSBwcm90b2NvbCBpbmplY3Rpb24gZm9yIGdlbmVzaXMgcmVx dWlyZXMgdGhlIG9wZXJhdGlvbiB0byBiZSBzaWduZWQNCiAgYnkgdGhlIHByaXZhdGUga2V5IHRo YXQgbWF0Y2hlcyB0aGUgcHVibGljIGtleSBvZiB0aGUgZ2VuZXNpcw0KICBibG9jay4gQW5kIHRo ZSBwcm90b2NvbCBpbmplY3Rpb24gY2hhbmdlcywgaXJyZXZlcnNpYmx5LCB0aGUgZ2VuZXNpcw0K ICBwcm90b2NvbCB0byBhIG5ldyBwcm90b2NvbC4gVGhpcyBuZXcgcHJvdG9jb2wgc3BlY2lmaWVz IHdoYXQNCiAgY29uc3RpdHV0ZXMgYSB2YWxpZCBibG9jayB0byBhZGQgdG8gdGhlIGNoYWluLg0K DQogIEluIHRoZSBUZXpvcyBibG9ja2NoYWluLCB0aGUgcHJvdG9jb2wgaW5qZWN0ZWQgb24gdG9w IG9mIGdlbmVzaXMNCiAgaW5jbHVkZWQgYSBub3Rpb24gb2YgY29pbnMgYW5kIGFuIGluLXByb3Rv Y29sIHZvdGluZyBzeXN0ZW0gdG8gaW5qZWN0DQogIG5ldyBwcm90b2NvbHMgYmFzZWQgb24gY29u c2Vuc3VzIGFtb25nc3QgY29pbi1ob2xkZXJzLiBUaGVyZSBpcyBldmVuIGENCiAgc3lzdGVtIHRv IG9idGFpbiB0aGUgcHJvdG9jb2wgc291cmNlcyBvdmVyIHRoZSBibG9ja2NoYWluIG5ldHdvcmsg c28NCiAgdGhleSBjYW4gYmUgY29tcGlsZWQgYnkgZWFjaCBub2RlIGFuZCBkeW5saW5rZWQgZGly ZWN0bHkgaW46IHlvdSBkb24ndA0KICBuZWVkIHRvIHVwZGF0ZS9yZXN0YXJ0IHlvdXIgbm9kZSB0 byBnZXQgdGhlIHByb3RvY29sIHVwZGF0ZXMuIEhvd2V2ZXIsDQogIHRoaXMgaXMgYXJiaXRyYXJ5 OiB5b3UgY2FuIHN0YXJ0IGEgbmV3IGJsb2NrLWNoYWluIHdpdGggYSBkaWZmZXJlbnQNCiAgcHJv dG9jb2wuDQoNCiAgRm9yIGV4YW1wbGUsIHlvdSBjb3VsZCByZS1pbXBsZW1lbnQgQml0Y29pbiAo cHJvb2Ytb2Ytd29yaywNCiAgY29pbnMrdHJhbnNmZXIsIGV0Yy4pIGFzIGEgcHJvdG9jb2wgdGhh dCB5b3UgaW5qZWN0IG9uIHRvcCBvZg0KICBnZW5lc2lzLiBZb3VyIGJsb2NrIGNoYWluIHdvdWxk IGhhdmUgYSB0ZXpvcyBnZW5lc2lzIGJsb2NrLCB0aGVuIGENCiAgYmxvY2sgdGhhdCBhY3RpdmF0 ZSB5b3VyIG93biB2ZXJzaW9uIG9mIGJpdGNvaW4sIGFuZCB0aGVuIHRoZSBibG9ja3MNCiAgd291 bGQgYmUgc2ltaWxhciB0byB3aGF0IHlvdSB3b3VsZCBmaW5kIG9uIHRoZSBiaXRjb2luIGJsb2Nr LWNoYWluLg0KDQogIE9mIHBhcnRpY3VsYXIgaW50ZXJlc3QgdG8geW91LCB0aGUgcHJvdG9jb2wg eW91IGluamVjdCBjYW4gaGF2ZQ0KICBlbnRpcmVseSBkaWZmZXJlbnQgb24tY2hhaW4gbm90aW9u cyAoZS5nLiwgYSBUQ0cvQ0NHIHdpdGggbm8gY29pbnMgYXQNCiAgYWxsIGJ1dCBhIG5vdGlvbiBv ZiBvd25lcnNoaXAgb3ZlciBjYXJkcykgYW5kIGRpZmZlcmVudCBzb2Z0LXVwZGF0aW5nDQogIG1l Y2hhbmlzbSAoZS5nLiwgdGhlIG5ldyBwcm90b2NvbCBjYW4gYWNjZXB0IGdlbmVzaXMtc3R5bGUg dXBkYXRlcyAoYQ0KICDigJxkaWN0YXRvcnNoaXDigJ0gd2hlcmUgYSBzaW5nbGUgcGVyc29uIGNv bnRyb2xzIHRoZSBwcm90b2NvbCkgb3IgZXZlbiBubw0KICBzb2Z0LXVwZGF0aW5nIG1lY2hhbmlz bSBhdCBhbGwgKGEg4oCcc3RhbGXigJ0gcHJvdG9jb2wgd2hlcmUgeW91IG5lZWQgdG8NCiAgaGFy ZC1mb3JrIGlmIHlvdSB3YW50IHRvIG1ha2Ugc2lnbmlmaWNhbnQgY2hhbmdlcykpLg0KDQogIEZv ciB0aGlzIHVzZSBjYXNlIChvZiBzdGFydGluZyB5b3VyIG93biBjaGFpbiB3aXRoIGEgZGlmZmVy ZW50DQogIHByb3RvY29sKSwgeW91IG1pZ2h0IGJlIGJldHRlciBvZmYgY2xvbmluZyB0aGUgZ2l0 IHJlcG9zaXRvcnksIGRvaW5nDQogIHNvbWUgbWluaW1hbCBjbGVhbiB1cCwgZXRjLiBUaGlzIGlz IGJlY2F1c2UgdGhlIHRlem9zIGJpbmFyaWVzIGluY2x1ZGUNCiAgdGhlIHNvdXJjZXMgZm9yIGFs bCBwcm90b2NvbHMgdGhhdCBoYXZlIGJlZW4gdXNlZCBvbiB0aGUgY2hhaW4gKHNvIHlvdQ0KICBk b24ndCAqbmVlZCogdG8gZ2V0IHRoZW0gb3ZlciB0aGUgbmV0d29yayBldmVuIGlmIHlvdSBjYW4p Lg0KDQogIFlvdSBtaWdodCBiZSBpbnRlcmVzdGVkIGluIHRoZSBmb2xsb3dpbmcgYmxvZyBwb3N0 IGFib3V0IGhvdyB0byB3cml0ZQ0KICB5b3VyIG93biBwcm90b2NvbDoNCiAgW2h0dHBzOi8vYmxv Zy5ub21hZGljLWxhYnMuY29tL2hvdy10by13cml0ZS1hLXRlem9zLXByb3RvY29sLmh0bWxdDQoN Cg0KT2ZmaWNpYWwgT0NhbWwgYmluZGluZ3MgZm9yIHZlcmlmaWVkIEV2ZXJlc3QgY3J5cHRvZ3Jh cGh5DQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZANCg0KICBBcmNoaXZlOg0KICBbaHR0cHM6Ly9zeW1wYS5pbnJpYS5mci9zeW1wYS9hcmMv Y2FtbC1saXN0LzIwMjAtMDUvbXNnMDAwMTcuaHRtbF0NCg0KDQpKb25hdGhhbiBQcm90emVua28g YW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBUaGUgRXZlcmVzdCB0 ZWFtIGlzIHBsZWFzZWQgdG8gYW5ub3VuY2UgdGhlIHJlbGVhc2Ugb2Ygb2ZmaWNpYWwgT0NhbWwN CiAgYmluZGluZ3MgZm9yIGFsbCBvZiBvdXIgdmVyaWZpZWQgY3J5cHRvZ3JhcGhpYyBhbGdvcml0 aG1zLCBub3cNCiAgYXZhaWxhYmxlIHRocm91Z2ggT1BBTSBhcyBwYWNrYWdlcyBoYWNsLXN0YXIg YW5kIGhhY2wtc3Rhci1yYXcuDQoNCiAgV2UgcHJvdmlkZSBiaW5kaW5ncyBmb3IgdGhlIGZvbGxv d2luZzoNCiAg4oCiIEhBQ0wqLCBhIGxpYnJhcnkgb2YgcHVyZSBDIGFsZ29yaXRobXMNCiAg4oCi IFZhbGUsIGEgY29sbGVjdGlvbiBvZiBvcHRpbWl6ZWQgY29yZSBhc3NlbWJseSByb3V0aW5lcyBm b3IgbWF4aW11bQ0KICAgIHBlcmZvcm1hbmNlDQogIOKAoiBFdmVyQ3J5cHQsIGFuIGFnaWxlLCBt dWx0aXBsZXhpbmcgQVBJIHdpdGggQ1BVIGF1dG8tZGV0ZWN0aW9uIHRoYXQNCiAgICBicmluZ3Mg dG9nZXRoZXIgSEFDTCogYW5kIFZhbGUuDQoNCiAgT3VyIGNvZGUgaXMgY29tcGlsZWQgZnJvbSB0 aGUgRiogcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgdG8gQyB2aWEgdGhlDQogIEtSZU1MaW4gY29tcGls ZXIgKCJLJlIgbWVldHMgTUwiKS4gV2Ugb2ZmZXIgdHdvIE9QQU0gcGFja2FnZXM6DQogIOKAoiBo YWNsLXN0YXItcmF3IGNvbnNpc3RzIG9mIGxvdy1sZXZlbCBvY2FtbC1jdHlwZXMgYmluZGluZ3Mg Z2VuZXJhdGVkDQogICAgYnkgS1JlTUxpbg0KICDigKIgaGFjbC1zdGFyIGlzIGEgaGFuZC13cml0 dGVuIE9DYW1sIGlkaW9tYXRpYyBBUEkgdGhhdCB1c2VzIG11Y2ggbW9yZQ0KICAgIHBsZWFzYW50 IHNpZ25hdHVyZXMsIHR5cGVzIGFuZCBhYnN0cmFjdGlvbnMgYW5kIGlzIGFsc28gc2FmZXIsIGFz IGl0DQogICAgY2hlY2tzIGFsbCBzdGF0aWMgcHJlY29uZGl0aW9ucyBhdCBydW4tdGltZQ0KDQog IFdlIHN1cHBvcnQgQUVTezEyOCwyNTZ9LUdDTSwgQ2hhY2hhMjAtUG9seTEzMDUsIEN1cnZlMjU1 MTkgLyBFZDI1NTE5LA0KICBQMjU2LCBNRDUsIFNIQS17MSwyLDN9IChhbGwgdmFyaWFudHMpLCBC bGFrZTIgKHMmYiksIEhNQUMvSEtERiwgYW5kDQogIHRoZSBIUEtFIGFuZCBTZWNyZXRCb3ggaGln aC1sZXZlbCBBUElzLiBTb21lIGFsZ29yaXRobXMgYXJlIG9wdGltaXplZA0KICBmb3IgSW50ZWwg Y2hpcHMsIG5vdGFibHkgQUVTLUdDTSDigJMgc2VlDQogIFtodHRwczovL2hhY2wtc3Rhci5naXRo dWIuaW8vU3VwcG9ydGVkLmh0bWxdIGZvciBmdWxsIGRldGFpbHMuDQoNCiAgR2VuZXJhbCBkb2N1 bWVudGF0aW9uIGFib3V0IHRoZSBwcm9qZWN0IGlzIGF2YWlsYWJsZSBhdA0KICBbaHR0cHM6Ly9o YWNsLXN0YXIuZ2l0aHViLmlvL2luZGV4Lmh0bWxdIOKAkyBzYW1wbGUgY29kZSBmb3IgdGhlIE9D YW1sDQogIEFQSSBpcyBwcm92aWRlZCBhcyBwYXJ0IG9mIHRoZSB0ZXN0IHN1aXRlDQogIFtodHRw czovL2dpdGh1Yi5jb20vcHJvamVjdC1ldmVyZXN0L2hhY2wtc3Rhci90cmVlL21hc3Rlci9iaW5k aW5ncy9vY2FtbC90ZXN0c10NCg0KICBUaGlzIHdvcmsgd2FzIHBlcmZvcm1lZCBieSBWaWN0b3Ig RHVtaXRyZXNjdSBmcm9tIE5vbWFkaWMgTGFicywgb25lIG9mDQogIHRoZSB0ZWFtcyByZXNwb25z aWJsZSBmb3IgdGhlIGNvcmUgZGV2ZWxvcG1lbnQgb2YgdGhlIFRlem9zDQogIGJsb2NrY2hhaW4u DQoNCg0Kbm1lYSBhbmQgc2FpbC1nYWRnZXRzDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOiBbaHR0cHM6 Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1ubWVhLXNhaWwtZ2FkZ2V0cy81NzczLzFdDQoNCg0K RGF2aWRlIEdlc3NhIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgQWhveSBkZXZlbG9wZXJzLCBm ZXcgZGF5cyBhZ28gSSBwdWJsaXNoZWQgYSBuZXcgb2NhbWwgbGlicmFyeSBjYWxsZWQNCiAgKm5t ZWEqLCB3aGljaCBpcyBlc3NlbnRpYWxseSBhIHBhcnNlciBmb3IgTk1FQTAxODMgc2VudGVuY2Vz LCBhIGZvcm1hdA0KICBmb3IgZW5jb2RpbmcgaW5zdHJ1bWVudHMgZGF0YSBpbiBib2F0cy4gVGhl cmUgYXJlIG1hbnkgc2VudGVuY2VzLA0KICByZWdhcmRpbmcgR1BTLCBjb21wYXNzIGRhdGEsIHdp bmQsIGFpciBwcmVzc3VyZSwgd2F0ZXIgdGVtcGVyYXR1cmUsDQogIHdheXBvaW50cyBoYW5kbGlu ZywgYWlzLCBhdXRvcGlsb3QgYW5kIG1vcmU7IGF0IHRoZSBtb21lbnQgdGhlIGxpYnJhcnkNCiAg aXMgYWJsZSB0byBkZWNvZGUgR1BTIHNlbnRlbmNlcyBhbmQgY29tcGFzcyBkYXRhLCBidXQgSSds bCBpbXBsZW1lbnQNCiAgbW9yZSBzZW50ZW5jZXMgaW4gdGhlIHNwYXJlIHRpbWUuIEkgdGVzdGVk IGl0IHdpdGggbXkgYm9hdCBHUFMgYW5kDQogIHdpdGggYSBncHMgdXNiIGRvbmdsZS4NCg0KICBB ZnRlciB0aGF0LCBJIHN0YXJ0ZWQgYSBuZXcgdGlueSBleHBlcmltZW50IGNhbGxlZCAqc2FpbC1n YWRnZXRzKiwNCiAgd2hpY2ggaXMgYSBHdGsgcHJvZ3JhbSB0aGF0IGVsYWJvcmF0ZXMgYW5kIGRp c3BsYXlzIE5NRUEgZGF0YSByZWNlaXZlZA0KICBmcm9tIHZhcmlvdXMgYm9hdCBpbnN0cnVtZW50 cyAod2luZCB2YW5lLCBhdXRvcGlsb3QsIGdwcywgcmFkYXIsIGFpcywNCiAgZXRjKS4gU2FpbC1n YWRnZXRzIGNhbiBiZSBleHRlbmRlZCB3aXRoICJnYWRnZXRzIiBtb2R1bGVzLCBlYWNoIG9uZQ0K ICBwcm92aWRpbmcgbmV3IGZ1bmN0aW9uYWxpdGllcyBhbmQgbmV3IHRhYnMgdG8gdGhlIG1haW4g aW50ZXJmYWNlLg0KDQogIERhdGEgZnJvbSBzZW5zb3JzIGFyZSBoYW5kbGVkIHVzaW5nIC9SZWFj dC8gc2lnbmFscywgc28gaW4gZXZlcnkNCiAgZ2FkZ2V0IHdlIGNhbiBjb21wb3NlIGRhdGEgZnJv bSB2YXJpb3VzIHNlbnNvciB0byBvYnRhaW4gbmV3IHJlYWN0aXZlDQogIHZhbHVlcy4NCg0KICBU aGUgZ2FkZ2V0cyBJJ20gcGxhbm5pbmcgdG8gd3JpdGU6DQogIOKAoiBkYXNoYm9hcmQ6IHNob3dz IGN1cnJlbnQgcG9zaXRpb24sIHNwZWVkLCBoZWFkaW5nLCB0cmlwZGlzdCwgY29tcGFzcw0KICDi gKIgc2F0dmlldzogc2hvd3MgY3VycmVudCBjb25uZWN0ZWQgZ3BzIHNhdGVsbGl0ZXMgKHBhcnRp YWxseSBkb25lKQ0KICDigKIgd2luZDogc2hvd3Mgd2luZCBpbmRpY2F0b3Igd2l0aCB0cnVlIC8g YXBwYXJlbnQgc3BlZWQgYW5kIGRpcmVjdGlvbg0KICDigKIgcmFkYXI6IHNob3dzIEFJUyBhbmQg UmFkYXIgdGFyZ2V0cyBpbiByYW5nZQ0KICDigKIgbW9iOiBhbGxvd3MgdG8gZHJvcCBhIG1hcmtl ciBpbiB0aGUgY3VycmVudCBwb3NpdGlvbiwgYW5kIGRyaXZlIHlvdQ0KICAgIHRvIHRoYXQgcG9p bnQNCiAg4oCiIHN0YXJ0bGluZTogaGVscGVyIGZvciByZWdhdHRhIHN0YXJ0DQogIOKAoiB0cmFj azogc2hvd3MgY3VycmVudCB0cmFjayBpbiBhIHZlY3RvciBtYXANCg0KICBUaGUgaGFyZCB0aGlu ZyBpbiBteSBvcGluaW9uIGlzIHdyaXRpbmcgbmV3IGN1c3RvbSB3aWRnZXQgd2l0aCBjYWlybw0K ICAoY29tcGFzcywgcmFkYXIsIGFuZCB0aGluZ3MgbGlrZSB0aGF0KS4NCg0KICBGaW5hbGx5LCB0 aGUgcHJvamVjdCBpcyBpbnRlbmRlZCB0byBydW4gb3ZlciAqZ3RrLWJyb2Fkd2F5Kiwgc28gZXZl cnkNCiAgaHRtbDUgZW5hYmxlZCBkZXZpY2UgY2FuIGFjY2VzcyB0aGUgYXBwbGljYXRpb24uDQoN CiAgW2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9kYWtrL3NhaWwtZ2FkZ2V0cy9t YXN0ZXIvbWVkaWEvYnJvYWR3YXkuanBnXQ0KDQogIEhvcGUgdGhlcmUgYXJlIHNvbWUgc2FpbG9y IGhlcmUgdGhhdCB3YW50IHRvIGpvaW4gd3JpdGluZyBzb21lIGdhZGdldHMNCiAgOikgUmVwb3Mg YXJlOg0KDQogIOKAoiBbaHR0cHM6Ly9naXRodWIuY29tL2Rha2svbm1lYV0NCiAg4oCiIFtodHRw czovL2dpdGh1Yi5jb20vZGFray9zYWlsLWdhZGdldHNdDQoNCg0KSXMgdGhlcmUgc3BlY2lhbGl6 ZWQgbWF0aCBsaWJyYXJ5IGZvciBzdGF0aXN0aWNzPw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgW2h0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9p cy10aGVyZS1zcGVjaWFsaXplZC1tYXRoLWxpYnJhcnktZm9yLXN0YXRpc3RpY3MvNTc3OC8xXQ0K DQoNCmhzcyBhc2tlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSSBzZWFyY2hl ZCB0byBmaW5kIG1hdGggbGlicmFyeSB3aGljaCBpcyB3cml0dGVuIGluIE9DYW1sLCBidXQgdGhl cmUNCiAgYXJlIG9ubHkgZmV3IHJlcG9zaXRvcmllcy4NCg0KICBJJ2QgbGlrZSB0byB1c2Ugc29t ZSBmdW5jdGlvbiBsaWtlIGNvZWZmaWNpZW50IGNvcnJlbGF0aW9uLA0KICBjb3ZhcmlhbmNlLCBl dGMuDQoNCiAgSSBmb3VuZCBMYWNhbWwgYnV0IGl0IHNlZW1zIG5vdCB0byBzdXBwb3J0IHRoZW0u DQoNCiAgQ291bGQgeW91IGdpdmUgc29tZSBsaW5rIGlmIHlvdSBrbm93Pw0KDQoNCmJuZ3V5ZW52 YW55ZW4gcmVwbGllZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSGksIHlvdSBjYW4gdGFrZSBhIGxvb2sgYXQgT3ds IDogW2h0dHBzOi8vb2NhbWwueHl6L10NCg0KICBUaGVyZSBhcmUgc3RhdCBmdW5jdGlvbnMgYW5k IGFsc28gYSBsb3QgbW9yZQ0KDQoNClVuaXhKdW5raWUgYWxzbyByZXBsaWVkDQrilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIANCg0KICBUaGVyZSBpcyBhbHNvIHRoaXMgb25lOg0KICBbaHR0cHM6Ly9naXRodWIuY29tL3N1 cGVyYm9icnkvcGFyZXRvXQ0KICBHU0wgcG93ZXJlZCBPQ2FtbCBzdGF0aXN0aWNzIGxpYnJhcnkN CiAgW2h0dHA6Ly9zdXBlcmJvYnJ5LmdpdGh1Yi5pby9wYXJldG8vMC4yXQ0KDQogIEFuZCBwcm9i YWJseSBldmVuIHNvbWUgbW9yZToNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBvcGFtIHNlYXJj aCBzdGF0aXN0aWMNCiAg4pSCICMgUGFja2FnZXMgbWF0Y2hpbmc6IG1hdGNoKCpzdGF0aXN0aWMq KQ0KICDilIIgIyBOYW1lICAgICAgICAgICAgIyBJbnN0YWxsZWQgIyBTeW5vcHNpcw0KICDilIIg Wy4uLl0NCiAg4pSCIGdzbCAgICAgICAgICAgICAgIC0tICAgICAgICAgIEdTTCAtIEJpbmRpbmdz IHRvIHRoZSBHTlUgU2NpZW50aWZpYyBMaWJyYXJ5DQogIOKUgiBvbWwgICAgICAgICAgICAgICAt LSAgICAgICAgICBNYXRoIExpYnJhcnkNCiAg4pSCIG93bCAgICAgICAgICAgICAgIC0tICAgICAg ICAgIE9DYW1sIFNjaWVudGlmaWMgYW5kIEVuZ2luZWVyaW5nIENvbXB1dGluZw0KICDilIIgb3ds LXBscGxvdCAgICAgICAgLS0gICAgICAgICAgT0NhbWwgU2NpZW50aWZpYyBhbmQgRW5naW5lZXJp bmcgQ29tcHV0aW5nDQogIOKUgiBwYXJldG8gICAgICAgICAgICAtLSAgICAgICAgICBHU0wgcG93 ZXJlZCBPQ2FtbCBzdGF0aXN0aWNzIGxpYnJhcnkuDQogIOKUgiBzdGF0c2QtY2xpZW50ICAgICAt LSAgICAgICAgICBTdGF0c0QgY2xpZW50IGxpYnJhcnkNCiAg4pSCIFsuLi5dDQogIOKUlOKUgOKU gOKUgOKUgA0KDQoNCk5ldyBPQ2FtbCBib29rcz8NCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6IFtodHRwczovL2Rpc2N1c3Mub2Nh bWwub3JnL3QvbmV3LW9jYW1sLWJvb2tzLzU3ODkvMV0NCg0KDQpBeGVsIFdpbnRlcm1hbm4gYXNr ZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgA0KDQogIEkgd29uZGVyLCB3aHkgdGhlcmUgYXJlIG5vIG5ldyBPQ2FtbCBib29r cyBzaW5jZSAyMDE0IHllYXI/IE1hbnkgYm9va3MNCiAgYXJlIHB1Ymxpc2hlZCBvbiBIYXNrZWxs LCBTY2FsYSwgRiMgdGhlbWVzLCBidXQgbm8gT0NhbWwuIEkgdGhpbmsgd2UNCiAgbmVlZCBuZXcg Ym9va3MgZm9yIGxlYXJuaW5nIGFuZCBmb3IgcmlzaW5nIGludGVyZXN0IGluIG91ciBiZWF1dGlm dWwNCiAgbGFuZ3VhZ2UuDQoNCg0KVGFrdW1hIElzaGlrYXdhIHJlcGxpZWQNCuKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gA0KDQogIOKAoiBUaGVyZSBpcyBhbiBvbmdvaW5nIHdvcmsgZm9yIDJuZCBlZGl0aW9uIG9mIFJl YWwgV29ybGQgT0NhbWw6DQogICAgW2h0dHA6Ly9kZXYucmVhbHdvcmxkb2NhbWwub3JnL10uDQog IOKAoiBPQ2FtbCBTY2llbnRpZmljIENvbXB1dGluZyBpcyBhbHNvIG9uZ29pbmc6DQogICAgW2h0 dHBzOi8vb2NhbWwueHl6L2Jvb2svXS4NCiAg4oCiIEEgSmFwYW5lc2UgYm9vayAi44Kz44Oz44OU 44Ol44O844K/44KS5pON44KLIiwgcHVibGlzaGVkIGluIEZlYi4gMjAyMCBmb3INCiAgICBiZWdp bm5lcnMgb2YgcHJvZ3JhbW1pbmcsIHVzZXMgT0NhbWwgQmxvY2tseToNCiAgICBbaHR0cHM6Ly93 d3cuc2FpZW5zdS5jby5qcC9zZWFyY2gvP2lzYm49OTc4LTQtNzgxOS0xNDcwLTEmeT0yMDIwI2Rl dGFpbF0uDQoNCg0KV2VuZyBTaGl3ZWkgYWxzbyByZXBsaWVkDQrilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0K ICBBIENoaW5lc2UgYm9vayBbT0NhbWzor63oqIDnvJbnqIvln7rnoYDmlZnnqItdIChbYW4gaW50 cm9kdWN0aW9uIHRvIE9DYW1sDQogIGxhbmd1YWdlIHByb2dyYW1taW5nXSkgaXMgcHVibGlzaGVk IGluIDIwMTguDQoNCg0KW09DYW1s6K+t6KiA57yW56iL5Z+656GA5pWZ56iLXSBodHRwczovL2Uu amQuY29tLzMwNDE3NjYyLmh0bWwNCg0KW2FuIGludHJvZHVjdGlvbiB0byBPQ2FtbCBsYW5ndWFn ZSBwcm9ncmFtbWluZ10NCmh0dHBzOi8vY2FtbC5pbnJpYS5mci9hYm91dC9ib29rcy5lbi5odG1s I2lkbTI3Nw0KDQoNCk90aGVyIE9DYW1sIE5ld3MNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQpGcm9tIHRoZSBvY2FtbGNvcmUgcGxhbmV0IGJsb2cN CuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEhlcmUgYXJlIGxpbmtzIGZy b20gbWFueSBPQ2FtbCBibG9ncyBhZ2dyZWdhdGVkIGF0IFtPQ2FtbCBQbGFuZXRdLg0KDQogIOKA oiBbRXZlcnkgcHJvb2YgYXNzaXN0YW50OiBNTVRdDQoNCg0KW09DYW1sIFBsYW5ldF0gaHR0cDov L29jYW1sLm9yZy9jb21tdW5pdHkvcGxhbmV0Lw0KDQpbRXZlcnkgcHJvb2YgYXNzaXN0YW50OiBN TVRdDQpodHRwOi8vbWF0aC5hbmRyZWouY29tLzIwMjAvMDUvMTUvbW10LWEtZm91bmRhdGlvbi1p bmRlcGVuZGVudC1sb2dpY2FsLXN5c3RlbS8NCg0KDQpPbGQgQ1dODQrilZDilZDilZDilZDilZDi lZDilZANCg0KICBJZiB5b3UgaGFwcGVuIHRvIG1pc3MgYSBDV04sIHlvdSBjYW4gW3NlbmQgbWUg YSBtZXNzYWdlXSBhbmQgSSdsbCBtYWlsDQogIGl0IHRvIHlvdSwgb3IgZ28gdGFrZSBhIGxvb2sg YXQgW3RoZSBhcmNoaXZlXSBvciB0aGUgW1JTUyBmZWVkIG9mIHRoZQ0KICBhcmNoaXZlc10uDQoN CiAgSWYgeW91IGFsc28gd2lzaCB0byByZWNlaXZlIGl0IGV2ZXJ5IHdlZWsgYnkgbWFpbCwgeW91 IG1heSBzdWJzY3JpYmUNCiAgW29ubGluZV0uDQoNCiAgW0FsYW4gU2NobWl0dF0NCg0KDQpbc2Vu ZCBtZSBhIG1lc3NhZ2VdIG1haWx0bzphbGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5vcmcNCg0K W3RoZSBhcmNoaXZlXSBodHRwOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duLw0KDQpbUlNTIGZl ZWQgb2YgdGhlIGFyY2hpdmVzXSBodHRwOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duL2N3bi5y c3MNCg0KW29ubGluZV0gaHR0cDovL2xpc3RzLmlkeWxsLm9yZy9saXN0aW5mby9jYW1sLW5ld3Mt d2Vla2x5Lw0KDQpbQWxhbiBTY2htaXR0XSBodHRwOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvDQoN Cg== --=-=-= 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 12 to 19, 2020.

ocamlformat 0.14.2

Guillaume Petiot announced

We are pleased to announce the release of ocamlformat 0.14.2. This minor release improves the recent 0.14.0 and 0.14.1 releases regarding= the doc-comments option.

How to migrate from 0.13.0

Here are the changes of the doc-comments options compared to o= camlformat 0.13.0:

  • after has been renamed to after-when-possible= to take into account the technical limitations of ocamlformat;
  • a new value before-except-val has been added, placing doc-= comments before the corresponding code, but placing doc-comments of val and= external declarations after the corresponding declaration;
  • before is unchanged.

Here is the full list of changes made by the 0.14.0 release: https://discuss.ocaml= .org/t/ann-ocamlformat-0-14-0/5435

How to migrate from 0.14.0

The 0.14.0 release lead to some regression of the doc-comments= behavior that (although intended for us) lead to some surprise from a lot of users. The behavior of doc-comments has thus been reverted to it's 0.= 13.0 state with the following changes:

The doc-comments-val option has been removed and merged with <= code>doc-comments. The placement of documentation comments on val and external items is now control= led by doc-comments .

  • doc-comments=3Dafter becomes doc-comments=3Dafter-wh= en-possible to take into account the technical limitations of ocamlf= ormat;
  • doc-comments=3Dbefore is unchanged;
  • doc-comments-val is now replaced with doc-comments

To reproduce the former behaviors

  • doc-comments=3Dbefore + doc-comments-val=3Dbefore : now use doc-comments=3Dbefore ;
  • doc-comments=3Dbefore + doc-comments-val=3Dafter : now use doc-comments=3Dbefore-except-val ;
  • doc-comments=3Dafter + doc-comments-val=3Dbefore : this behavior did not make much sense and is not available anymore;
  • doc-comments=3Dafter + doc-comments-val=3Dafter : now use doc-comments=3Dafter-when-possible.

How to migrate from 0.14.1

The 0.14.1 release was preserving the behavior of 0.13.0 regarding do= c-comments, it added a unset value to the doc-comments-val option. This option has been removed with the following changes:

The doc-comments-val option has been removed and merged with <= code>doc-comments. The placement of documentation comments on val and external items is now control= led by doc-comments .

  • doc-comments=3Dafter becomes doc-comments=3Dafter-wh= en-possible to take into account the technical limitations of ocamlf= ormat;
  • doc-comments=3Dbefore is unchanged;
  • doc-comments-val is now replaced with doc-comments

To reproduce the former behaviors

  • doc-comments=3Dbefore + doc-comments-val=3Dbefore : now use doc-comments=3Dbefore ;
  • doc-comments=3Dbefore + doc-comments-val=3Dafter : now use doc-comments=3Dbefore-except-val ;
  • doc-comments=3Dafter + doc-comments-val=3Dbefore : this behavior did not make much sense and is not available anymore;
  • doc-comments=3Dafter + doc-comments-val=3Dafter : now use doc-comments=3Dafter-when-possible.

Thank you

We would like to thank our early users to help us on the road of a stable 1= .0.0 release of ocamlformat.

ML Family Workshop 2020: Call for pre= sentations

Leo White announced

ICFP, and by extension the ML workshop, will be now officially be held onli= ne with a significantly reduced fee. Due to the change in official status we decided to extend the submission deadli= ne to the end of May.

Important Dates (updated)

  • Friday 29th May (any time zone): Abstract submission deadline
  • Friday 17th July: Author notification
  • Thursday 27th August: ML Family Workshop

memprof-limits preview (and a guide t= o handle asynchronous exceptions)

Guillaume Munch-Maccagnoni announced

Dear OCamlers, I am happy to pre-announce memprof-limits, an implementation of per-thread global memory limits, and per-thread allocatio= n limits =C3=A0 la Haskell, compatible with systhreads.

Memprof-limits interrupts the execution by raising an asynchronous exception, an exception that can arise at almost any location in the code. I also announce a guide on how to recover from asynchronous exce= ptions and other unexpected exceptions that you find in the documentation. It summarises knowledge acquired in OCaml by the Coq proof assistant as well a= s in other programming languages. To my knowledge, this has never been told in OCaml textbooks, so I thought it mig= ht be of general interest to you. This research is part of a wider work aiming to regulate the use of asynchronous= exceptions in OCaml in coordination with multicore language designers.

Global memory limits let you bound the mem= ory consumption inside specific parts of your program, in terms of memory used by the whole program. It is inspired by this other post, but in a form readily available for use with systhreads.

Allocation limits let you bound the execut= ion of parts of the program measured in number of allocations, analogous to the same feature in Haskell advocated in a nice post by Simon = Marlow. Allocation limits count allocations but not deallocations, and is = therefore a measure of the work done, which can be more suitable than execution time.

Memprof-limits, as the name tells, uses the upcoming Memprof engine from OC= aml 4.11, with a low sampling rate that does not affect performance. A reimplementation of the Memprof interface co= mpatible with memprof-limits running at the same time is provided for profiling needs.

Memprof-limits is available on the public opam repository, but depends on O= Caml 4.11 which at the moment is available from the beta opam repository only. It is experim= ental for reasons explained in the manual.

FAQ

  • =E2=80=9CIs it wise to rely on the statistical= nature of Memprof? If I set an allocation limit of 100 KB, and run a funct= ion that allocates exactly 50 KB, then the function might fail, due to the = random nature of Memprof.=E2=80=9D

    Memprof-limits is provided with a statistical analysis meant to help you chose appropriate values for the limit depending on a target sa= fe allocation value. (Nice pictures omitted because this discuss does not support svg.)

    Long story short, memprof-limits starts being accurate-enough starting arou= nd a safe allocation value of 100 KB with the default sampling rate (meaning a limit of 1 to 3 MB depending on chosen= precision), with the ratio between the maximal safe allocation and the limit dropping very quickly for higher valu= es. Correctly, the analysis shows that limits under 500 KB are unreliable.

    I have found that the statistical nature of Memprof makes it very easy to r= eason about its application and not have to factor in runtime implementation details. In addition, Memprof is nevert= heless deterministic, which is (essential and) useful for reproducing runs in test scenarios.

  • =E2=80=9CBut can we really program with mempro= f-limits, that is, not only write programs but also reason about them, give= n the probabilistic nature of the guarantees?=E2=80=9D

    Yes, if we make two additional hypotheses:

    1. Allocation limits (as used in Haskell) are used by determining peak rea= sonable allocation usage empirically and picking a limit at a comfortable m= argin over it, rather than computing a precise memory bound to be used as a= limit. In very controlled environments where the latter would be possible,= there probably would be better solutions, and the language this is inspire= d from makes it very hard to make predictions on memory use.
    2. The programmer is fine with a very unlikely possibility of a false posi= tive; indeed the program is already designed to let true positives fail wit= hout bringing down mission-critical parts of the program. For instance they= can prefer to see a legitimate client having a connexion closed once every= 10=E2=81=BF year for n of their choosing, if that is the price to p= ay for avoiding being subject to DOS on maliciously-crafted requests.

    Under these hypotheses, the statistical limit is just as reliable as the pr= ecise limits =C3=A0 la Haskell.

  • =E2=80=9CIs it possible to also implement local memory limits, to bound the memory consu= mption of a particular function?=E2=80=9D

    Yes but read on.

    Yang & Mazi= =C3=A8res (2014) advocates in favour of an al= locator-pays model of cost attribution, and note its similarity with memory profiling. I= n this model, it is possible for instance to process untrusted user input under some memory limit, before the result = is distributed to the rest of the program.

    Implementing memory limits based on the allocator-pays model, by adapting a= llocation limits to take into account deallocations, would be very easy thanks to the facilities provided by Memp= rof. Moreover, the statistical analysis of allocation limits can be transposed, and guarantees similarly accuracy at a= low runtime cost for limits greater than 100KB.

    There is one surprising difficulty, though, which has to do with the way th= e GC works. The GC has a space overhead: memory that is wasted because unreachable values are not collected immediat= ely. This overhead has to be taken into account when choosing the limit. However, this overhead is non-local and de= pendent on the total major heap size: one cannot just say =E2=80=9Ctake the double of the desired limit=E2=80=9D.= Indeed, active threads will pay for memory that has been allocated in the past and kept alive. More experimentation is needed to pro= vide guidance on how to take the space overhead into account.

  • =E2=80=9CCan this be used to bound the consump= tion of lightweight threads in Lwt and Async?=E2=80=9D

    It is straightforward to make memprof-limits parametric in the notion of thread id used to track per-thread limits. However, to the best of my knowledge, Lwt and Async are not meant to play w= ell when the computation is interrupted by asynchronous exceptions. If you have more information about this limitation= or are interested in experimenting, please get in touch.

Thanks

Thank you to Jacques-Henri Jourdan for his explanations about Memprof and S= tephen Dolan for his feedback.

Tezos 7.0 is now available on opam

Pierre Boutillier announced

Tezos executables and libraries have just been released on opam. You can thus build them from source with a simple opam install tezos and build your own projects upon them.

What is Tezos

Tezos is a distributed consensus platform with meta-consensus capability. T= ezos not only comes to consensus about the state of its ledger, like Bitcoin or Ethereum. It also comes to consensus a= bout how the protocol and the nodes should adapt and upgrade. For more information about the project, see https://tezos.com.

Our implementation of Tezos is written in OCaml. It is split into several l= ibraries (command-line interface tezos-clic, peer-to-peer library tezos-p2p, crypt= ographic primitives tezos-crypto~=E2=80=A6) and executables (node ~tezos-node, client ~tezos-client~=E2=80=A6).

Useful Links

Source code for this particular implementation can be found at https://gitlab.com/tezos/tezos/. Develo= per documentation is available at https://= tezos.gitlab.io/. In particular, documentation for this specific release (version 7.0) is available at http://tezos.gitlab.io/releases/version-7.html.

Installation Instructions

Tezos (internal compiler in order to self amend itself) requires a specific= version of the compiler (OCaml 4.09.1):

opam switch 4.09.1

Tezos also requires some external libraries:

opam depext tezos

Finally, to install all binaries:

opam install tezos

Replying to Nick Betteridge, Rapha=C3=ABl Proust said=

Tezos has a soft-updating mechanism that works (roughly) as follows:

The network starts with a genesis protocol (=E2=80=9Cprotocol=E2=80=9D here= means =E2=80=9Ceconomic protocol=E2=80=9D: the rules according to which smart contracts are initiated and acted upon, transactions take place, etc.= ) in which a single public key is specified.

The genesis protocol has no notion of coin, currency, smart-contract, etc. = Instead, the genesis protocol knows a single operation: a protocol injection.

The protocol injection for genesis requires the operation to be signed by t= he private key that matches the public key of the genesis block. And the protocol injection changes, irreversibly, the= genesis protocol to a new protocol. This new protocol specifies what constitutes a valid block to add to the chain.

In the Tezos blockchain, the protocol injected on top of genesis included a= notion of coins and an in-protocol voting system to inject new protocols based on consensus amongst coin-holders. The= re is even a system to obtain the protocol sources over the blockchain network so they can be compiled by each node an= d dynlinked directly in: you don't need to update/restart your node to get the protocol updates. However, this is arbi= trary: you can start a new block-chain with a different protocol.

For example, you could re-implement Bitcoin (proof-of-work, coins+transfer,= etc.) as a protocol that you inject on top of genesis. Your block chain would have a tezos genesis block, then a b= lock that activate your own version of bitcoin, and then the blocks would be similar to what you would find on the= bitcoin block-chain.

Of particular interest to you, the protocol you inject can have entirely di= fferent on-chain notions (e.g., a TCG/CCG with no coins at all but a notion of ownership over cards) and different so= ft-updating mechanism (e.g., the new protocol can accept genesis-style updates (a =E2=80=9Cdictatorship=E2=80=9D= where a single person controls the protocol) or even no soft-updating mechanism at all (a =E2=80=9Cstale=E2=80=9D protocol where yo= u need to hard-fork if you want to make significant changes)).

For this use case (of starting your own chain with a different protocol), y= ou might be better off cloning the git repository, doing some minimal clean up, etc. This is because the tezos bin= aries include the sources for all protocols that have been used on the chain (so you don't need to get= them over the network even if you can).

You might be interested in the following blog post about how to write your = own protocol: https://blog.nomadic-labs.com/how-to-write-a-tezos-protocol.html

Official OCaml bindings for verified = Everest cryptography

Jonathan Protzenko announced

The Everest team is pleased to announce the release of official OCaml bindings for all of our verified cryptographic algorithms, now available through OPAM as packages hacl-star and hacl-star-raw.

We provide bindings for the following:

  • HACL*, a library of pure C algorithms
  • Vale, a collection of optimized core assembly routines for maximum perf= ormance
  • EverCrypt, an agile, multiplexing API with CPU auto-detection that brin= gs together HACL* and Vale.

Our code is compiled from the F* programming language to C via the KReMLin compiler ("K&R meets ML"). We offer two OPAM packages:

  • hacl-star-raw consists of low-level ocaml-ctypes bindings generated by = KReMLin
  • hacl-star is a hand-written OCaml idiomatic API that uses much more ple= asant signatures, types and abstractions and is also safer, as it checks al= l static preconditions at run-time

We support AES{128,256}-GCM, Chacha20-Poly1305, Curve25519 / Ed25519, P256, MD5, SHA-{1,2,3} (all variants), Blake2 (s&b), HMAC/HKDF, and the HPKE and SecretBox high-level APIs. Some algorithms are optimized for Intel chips, notably AES-GCM – see https://hacl-star.gi= thub.io/Supported.html for full details.

General documentation about the project is available at https://hacl-star.github= .io/index.html – sample code for the OCaml API is provided as part of the test suite https://github.com/project-everest/hacl-star/tree/master/bin= dings/ocaml/tests

This work was performed by Victor Dumitrescu from Nomadic Labs, one of the teams responsible for the core development of the Tezos blockchain.

nmea and sail-gadgets

Davide Gessa announced

Ahoy developers, few days ago I published a new ocaml library called nmea, which is e= ssentially a parser for NMEA0183 sentences, a format for encoding instruments data in boats. There are many sentences, re= garding GPS, compass data, wind, air pressure, water temperature, waypoints handling, ais, autopilot and more; a= t the moment the library is able to decode GPS sentences and compass data, but I'll implement more sentences in the sp= are time. I tested it with my boat GPS and with a gps usb dongle.

After that, I started a new tiny experiment called sail-gadgets, whi= ch is a Gtk program that elaborates and displays NMEA data received from various boat instruments (wind vane, autop= ilot, gps, radar, ais, etc). Sail-gadgets can be extended with "gadgets" modules, each one providing new functionalit= ies and new tabs to the main interface.

Data from sensors are handled using React signals, so in every gadge= t we can compose data from various sensor to obtain new reactive values.

The gadgets I'm planning to write:

  • dashboard: shows current position, speed, heading, tripdist, compass
  • satview: shows current connected gps satellites (partially done)
  • wind: shows wind indicator with true / apparent speed and direction
  • radar: shows AIS and Radar targets in range
  • mob: allows to drop a marker in the current position, and drive you to = that point
  • startline: helper for regatta start
  • track: shows current track in a vector map

The hard thing in my opinion is writing new custom widget with cairo (compa= ss, radar, and things like that).

Finally, the project is intended to run over gtk-broadway, so every = html5 enabled device can access the application.

3D"broadway.jpg"

Hope there are some sailor here that want to join writing some gadgets :) R= epos are:

Is there specialized math library for= statistics?

hss asked

I searched to find math library which is written in OCaml, but there are on= ly few repositories.

I'd like to use some function like coefficient correlation, covariance, etc.

I found Lacaml but it seems not to support them.

Could you give some link if you know?

bnguyenvanyen replied

Hi, you can take a look at Owl : https://oca= ml.xyz/

There are stat functions and also a lot more

UnixJunkie also replied

There is also this one:
https://github.com/superbo= bry/pareto
GSL powered OCaml statistics library http://superbobry.github.io/pareto/0.2

And probably even some more:

opam search statistic
# Packages matching: match(*statistic*)
# Name            # Installed # Synopsis
[...]
gsl               --          GSL - Bindings to the GNU Scientific Library
oml               --          Math Library
owl               --          OCaml Scientific and Engineering Computing
owl-plplot        --          OCaml Scientific and Engineering Computing
pareto            --          GSL powered OCaml statistics library.
statsd-client     --          StatsD client library
[...]

New OCaml books?

Axel Wintermann asked

I wonder, why there are no new OCaml books since 2014 year? Many books are = published on Haskell, Scala, F# themes, but no OCaml. I think we need new books for learning and for rising intere= st in our beautiful language.

Takuma Ishikawa replied

Other OCaml News

From the ocamlcore planet blog

Here are links from many OCaml blogs aggregated at OCaml Planet.

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.

--=-=-=--