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 184E65D5 for ; Tue, 4 Jan 2022 07:56:55 +0000 (UTC) X-IronPort-AV: E=Sophos;i="5.88,260,1635199200"; d="scan'208,217";a="13495663" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 04 Jan 2022 08:56:54 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id 8903BE01A8; Tue, 4 Jan 2022 08:56:53 +0100 (CET) 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 E55D9E0120 for ; Tue, 4 Jan 2022 08:56:45 +0100 (CET) Authentication-Results: mail2-smtp-roc.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=h25N=RU=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org IronPort-PHdr: =?us-ascii?q?A9a23=3Ao/miWxGA6jvxyiThNUSKRJ1GfxRKhN3EVzX9CrI?= =?us-ascii?q?Zgr5DOp6u447ldBSGo6k31RmQBt+Qsqoaw8Pt8InYEVQa5piAtH1QOLdtbDQiz?= =?us-ascii?q?fssogo7HcSeAlf6JvO5JwYzHcBFSUM3tyrjaRsdF8nxfUDdrWOv5jAOBBr/KRB?= =?us-ascii?q?1JuPoEYLOksi7ze+/94PObwlSmTawb61+IBqroQnNt8QdnJdvJLs2xhbVuHVDZ?= =?us-ascii?q?v5YxXlvJVKdnhb84tm/8Zt++ClOuPwv6tBNX7zic6s3UbJXAjImM3so5MLwrhn?= =?us-ascii?q?MURGP5noHXWoIlBdDHhXI4wv7Xpf1tSv6q/Z91SyHNsD4Ubw4RTKv5LpsRxH1l?= =?us-ascii?q?ScHLCY5/3/LhcxsgqxbpxehqAZ+w47SfYqZMPVzc6fYcd4cRWZPXcBRVzJAAoO?= =?us-ascii?q?nbosAFO4BMvhFpIjzoFsOtwaxBRKxD+/rxDJEmnr60Ksn2OojDA7GxhQtEdIQv?= =?us-ascii?q?nrJotv7N6gdXvyuwabS0TnOdelb1Svh5IXKdB0qvPGCXah3ccrU0UQiCwfFgU+?= =?us-ascii?q?WqYf4Ij2ayuQNs22a7+p8SeKklmkqpBt1oje1wMcgkJLJiZ4VylDB9CV53Jo1K?= =?us-ascii?q?MagSE58Zd6lEIdQuD+GOIt2RMMiQnhouDskxbEcvp67ZicKxY0hyhXCZPOJb5K?= =?us-ascii?q?G7Qj/VOaNPzh4nnRldaq+ihqv7ESs1O7xW8q13VtOqidJj9bBu2wC2hHX5MWKV?= =?us-ascii?q?uVx80Sv1ziB2Q7d5f1IL04omafZN5Ms3rA+m4cOvEnBGCL9hUv4jKiTdko+++i?= =?us-ascii?q?o7fzqYq34qZ+ANo90lh/xMrwpmsy6BOQ3LBICX26F9uSgzLHj+lH2T69Pjv0yi?= =?us-ascii?q?KXZt4raJcsDqq62Ag9VzoYj6wukADu8zNsYmnwHIEpDeB2ZkojlIU/BL+3lDfu?= =?us-ascii?q?nmVujjDJry+rBPr37DZXBNmXMn6nlfbZ87k5T1BY8wcpa55JQEr0OOujzW0Dwt?= =?us-ascii?q?NzGFBM5NBa0w+n/BNV80IMeQ2OPDbWDPKPcq1+E/u0vI+iQZI8VpTbyMOIp5//?= =?us-ascii?q?pjXMhmF8SYKmo3Z8TaHyiGfRmOUqZbHzxidkCCWcHphcyQPLuhVGYTDJfe3m/U?= =?us-ascii?q?7gy6z0nEo6rA4jOSpivjbGCxiu3AJJban5cBlyRHnrkbZiIVvgQZC+UP8RviCY?= =?us-ascii?q?LVaK7RI8kzRyutBH1y75gLufM/y0Zuo/v2MJt5+3UkREz9SB0ANqB3GGNSWF0n?= =?us-ascii?q?3oIRyIo06xlpkx90FiD3bB5g/xeC9NT++tEXhokOZPY1eB2Fsz+Vw3bctqHVFq?= =?us-ascii?q?qWNurDD4pQtI02dAOYkJ9G9u4jhDE2iqnG6IbmaCWCpAo6q/c32b9KsZlxXvey?= =?us-ascii?q?KcugUErQtNINW2ihq9/6xbcCJLJk0WflqaqbLkc0zDX+GeE12qOs1lVXxR0Uar?= =?us-ascii?q?fW3ATfFDWosj55kPHTr+uFagnPxBaxs6FN6tKbMHmgktdRPv5PdTTbG2wl323B?= =?us-ascii?q?RaSybOAdJDqdHkF3CXBFEgElBge8mqcOgg7AietumbeDD11FVLzeE7s6ul/qHa?= =?us-ascii?q?jTkAu1Q2Kbkth16C0+hEPn/CcRekTjfo4v3JrrypyVh7p283QI96foUxncbkKJ?= =?us-ascii?q?Zt360hBnyqR4wdiOLSkLrt+nRgffxVzuwXpzRohTs1LmM0u6Xcr1xZaKKSC0Vo?= =?us-ascii?q?HeSnL84r3P+j+LmD0tCuka6vXxk2WhN+S86FJ8/84rlT/oCmxEU4z73hs099Uy?= =?us-ascii?q?maRoJLQA1xBAtrKTk8r+k0i9PnhaS4n6taLhBWE0IGxomaEw9UtFfcowRamfs5?= =?us-ascii?q?CPeWDDgCgSqXy4uC2L+g7h1WibhQFJf1fsqkuMJH/HxNp8KSsIeBrkSngiDhXp?= =?us-ascii?q?odn3RDVnxc=3D?= IronPort-Data: =?us-ascii?q?A9a23=3APrVVQK48bzdO4mm+Fp0lywxRtBzGchMFZxGqfqr?= =?us-ascii?q?LsXjdYENShmZTzGQYW2mFPquLZjSjKYx2YIznp0pVucXWztEyHlAd+CA2RRqmi?= =?us-ascii?q?+KVXIXDdh+Y0wC6d5CYEho/t63yUjRxRSwNZie0SiyFb/6x/RGQ6YnSHuCmULe?= =?us-ascii?q?cZngoLeNZYH5JZSxLy7ZRbrFA2oDR7zOl4bsekuWHULOX82Yc3lE8t8pvnChSU?= =?us-ascii?q?MHa41v0iLCRicdj5zcyn1FNZH4WyDrYw3HQGuG4FcbiLwrPIS3Qw4/Xw/stIov?= =?us-ascii?q?NfrfTd11TBKbVORmSh3FWXam7nxUEoTY9uko5HKNGOAEO02nPxIg3k4klWZ+YE?= =?us-ascii?q?W/FOoX3ot9FBhkCTgcrB5AT4LjDMGSyusyVzlTbfj3r2fo7BUU/O8sD8eZyAH1?= =?us-ascii?q?S3fYfNTYGYwvFgr6mhrWhRYGAg+x6d5W6Yd5O6xmMyhmAUad3HsCcK0nQ3vdT1?= =?us-ascii?q?TI0w8RPBur2fNsccTMpbRLaYhQJNE1/NX6UtPPw0yS5KSkB/QrT/b5ttjCVlVw?= =?us-ascii?q?vjqy2ZYKTJ8jVEOxLuG2dgE7G2UXwJC0AEsjGkW/dtiq47gPUtSbrAcQKE7mp6?= =?us-ascii?q?vNhgFuS33EeThoMWjOGTTCCohbWc7pix4Y8o0LCbJTe9XBHivH4T0T+uHmArwI?= =?us-ascii?q?RUNpWEvQn5UeK0KW8D8OxGD0fVjAYADA5nJZeeNDo/gbhcxDV6fhHurqIT3mQ7?= =?us-ascii?q?fGR8SP0PjIaRYPHTTQcQ1FDu7EPv6lq5i8ijb9f/GqdltrxCC39yDCMrTEjivM?= =?us-ascii?q?Ul8FjO2CT5kjJ2XT0znTWZldd2zg7lV5JIu+0iEBJqmBoBZXmAS58Ebuk?= IronPort-HdrOrdr: =?us-ascii?q?A9a23=3A8z4ZUKrpAmKlYesid/hbYrgaV5oCeYIsimQD?= =?us-ascii?q?101hICG9Kvbo8vxHnJwguiMc+wxhPE3I+OrwQ5VoLkmslqKdjbN9AV7AZnidhI?= =?us-ascii?q?LLFvAB0WKK+VSJcEfDH4Vmu5uIBpIfNDSGNzlHZKjBjDVQWOxQp+VvuJrY49s3?= =?us-ascii?q?2R9WPHhXgo9bnn9ENjo=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0AbAQAf/dNhmCIeaIFXAxaDbV5BAV8GV?= =?us-ascii?q?zoxhAk+iQOFRQElgiWBFoIThh6Gb4wtgREBAk8QAQMBDSoBDgUBAgQBAYUGAhc?= =?us-ascii?q?6AQSCZgIeBgEFMxMBAgQVAQEFAQEBAgEDAwQBEwEBAQEBAQEBCQsQBjQihWgNg?= =?us-ascii?q?iITDAwDA4N0AwEKDgEIBAY6BCcjAxQBBgMCBA0BFwEUChcBEhoBBIJfAYMXBAE?= =?us-ascii?q?KkgecDH8ygQGDTgEDBwkDDy+Dc4ESUg0CFIEAF4YMVEoBgn8Jg30pEIFVRIEVg?= =?us-ascii?q?TxtSgduglgLAQEBAQGBIxEHAQEGUBGCUReCTgSPDi8OLQIJBgEBDR8EDCYRBxM?= =?us-ascii?q?cCAYBASAvBAUtCwEHBSgMCQQHAwITBgEBCB8GCwsCHg+RVAExBo0vgz6HFIJbk?= =?us-ascii?q?iA0B4NFgTUGC4gSgRqMaogbg3CBSqItIZYVIIIkhmqBDAmBe0KTciqFNIFOKoF?= =?us-ascii?q?9MxowgngBATIJYQ+NeAEzFoEEAQGCSmpUgSaBdTuFSQJAMwIBATQCBgEKAQEDC?= =?us-ascii?q?YVjAQEFEwsBhk8EKIIaAQE?= X-IPAS-Result: =?us-ascii?q?A0AbAQAf/dNhmCIeaIFXAxaDbV5BAV8GVzoxhAk+iQOFRQE?= =?us-ascii?q?lgiWBFoIThh6Gb4wtgREBAk8QAQMBDSoBDgUBAgQBAYUGAhc6AQSCZgIeBgEFM?= =?us-ascii?q?xMBAgQVAQEFAQEBAgEDAwQBEwEBAQEBAQEBCQsQBjQihWgNgiITDAwDA4N0AwE?= =?us-ascii?q?KDgEIBAY6BCcjAxQBBgMCBA0BFwEUChcBEhoBBIJfAYMXBAEKkgecDH8ygQGDT?= =?us-ascii?q?gEDBwkDDy+Dc4ESUg0CFIEAF4YMVEoBgn8Jg30pEIFVRIEVgTxtSgduglgLAQE?= =?us-ascii?q?BAQGBIxEHAQEGUBGCUReCTgSPDi8OLQIJBgEBDR8EDCYRBxMcCAYBASAvBAUtC?= =?us-ascii?q?wEHBSgMCQQHAwITBgEBCB8GCwsCHg+RVAExBo0vgz6HFIJbkiA0B4NFgTUGC4g?= =?us-ascii?q?SgRqMaogbg3CBSqItIZYVIIIkhmqBDAmBe0KTciqFNIFOKoF9MxowgngBATIJY?= =?us-ascii?q?Q+NeAEzFoEEAQGCSmpUgSaBdTuFSQJAMwIBATQCBgEKAQEDCYVjAQEFEwsBhk8?= =?us-ascii?q?EKIIaAQE?= X-IronPort-AV: E=Sophos;i="5.88,260,1635199200"; d="scan'208,217";a="13495599" X-MGA-submission: =?us-ascii?q?MDFchPHiG4HF0OWg1ch5TRCDqZ64SmvatXvSk5?= =?us-ascii?q?DZXWgCkE0swPTnc/HftxCVPQdTx3ULOgBRXsGe1b0+GqYzcmHsaAdr3U?= =?us-ascii?q?imp2CZaNsbcLcVcRfAvL+7ktl9KhB824A9TTOPQCTN6wgfoo0nVwjWX8?= =?us-ascii?q?RJ44R8y16lCdurDOy9MjX4LA=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; 04 Jan 2022 08:56:46 +0100 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 F0DA85646C1; Tue, 4 Jan 2022 08:56:42 +0100 (CET) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 04 Jan 2022 08:56:30 +0100 Message-ID: <87bl0sc4sx.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Jan 4 08:56:43 2022 +0100 (CET)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.000003, queueID=6B7855646C3 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: 18639 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 ZWsgb2YgRGVjZW1iZXIgMjgsIDIwMjENCnRvIEphbnVhcnkgMDQsIDIwMjIuDQoNClRhYmxlIG9m IENvbnRlbnRzDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIANCg0KQSBoYWNrIGZvciB0b3BsZXZlbCBicmVha3BvaW50cyB1c2luZyBlZmZlY3QgaGFu ZGxlcnMNCk11bHRpLXNob3QgY29udGludWF0aW9ucyBnb25lIGZvcmV2ZXI/DQpOZXcgcmVsZWFz ZSBvZiBNZW5oaXIgKDIwMjExMjMwKQ0KSW1wcm92ZWQgZG9jdW1lbnRhdGlvbiBmb3IgRml4DQpw cC1iaW5hcnktaW50cyAwLjEuMQ0KT2xkIENXTg0KDQoNCkEgaGFjayBmb3IgdG9wbGV2ZWwgYnJl YWtwb2ludHMgdXNpbmcgZWZmZWN0IGhhbmRsZXJzDQrilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9j YW1sLm9yZy90L2EtaGFjay1mb3ItdG9wbGV2ZWwtYnJlYWtwb2ludHMtdXNpbmctZWZmZWN0LWhh bmRsZXJzLzkwNjUvMT4NCg0KDQp3aWt0b3IgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBJIHN0YXJ0ZWQgcGxheWluZyB3aXRo IGVmZmVjdCBoYW5kbGVycyBhbmQgd29uZGVyZWQgaWYgdGhleSBjb3VsZCBiZQ0KICB1c2VkIHRv IGltcGxlbWVudCB0b3BsZXZlbCBicmVha3BvaW50cy4gSXQncyBhIGJpZyBoYWNrIGFuZCBwcm9i YWJseQ0KICB1bnNvdW5kIGF0IHRoZSBtb21lbnQsIGJ1dCBpdCB3b3JrcyBhbmQgaGVyZSdzIGFu IGV4YW1wbGUgaW50ZXJhY3Rpb246DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBsZXQgYXJy ID0NCiAg4pSCICAgbGV0IGZhY3QgbiA9DQogIOKUgiAgICAgbGV0IGFyciA9IEFycmF5Lm1ha2Ug KG4rMSkgMSBpbg0KICDilIIgICAgIGxldCByZWMgbG9vcCBpID0NCiAg4pSCICAgICAgIGlmIGkg PD0gbiB0aGVuIGJlZ2luDQogIOKUgiAJQnJlYWsuYnJlYWsgWyJpIiwgaTsgImFyciIsIGFycl07 DQogIOKUgiAJYXJyLihpKSA8LSBhcnIuKGktMSkgKiBpOw0KICDilIIgCWxvb3AgKGkrMSkNCiAg 4pSCICAgICAgIGVuZA0KICDilIIgICAgIGluDQogIOKUgiAgICAgKGxvb3AgMTsgYXJyKQ0KICDi lIIgICBpbg0KICDilIIgICAgIGZhY3QgNTs7DQogIOKUgiAjICgqIFdlIGhpdCBhIGJyZWFrcG9p bnQgYW5kIG9idGFpbiB0aGUgY29udGludWF0aW9uIGsgKikNCiAg4pSCICAgayAoKTs7DQogIOKU giAtIDogYm9vbCA9IHRydWUNCiAg4pSCICMgKCogdGhlIGJvb2xzIGFyZSBsZWFraW5nIGZyb20g dGhlIGV4ZWN1dGVfcGhyYXNlIGZ1bmN0aW9uDQogIOKUgiAgICAqIGluc2lkZSB0aGUgdG9wbGV2 ZWwgKikNCiAg4pSCICAgayAoKTs7DQogIOKUgiAtIDogYm9vbCA9IHRydWUNCiAg4pSCICMgaTs7 DQogIOKUgiAtIDogaW50ID0gMw0KICDilIIgIyBhcnI7Ow0KICDilIIgLSA6IGludCBhcnJheSA9 IFt8MTsgMTsgMjsgMTsgMTsgMXxdDQogIOKUgiAjICgqIGxldCdzIGRpc3R1cmIgdGhlIGNvbXB1 dGF0aW9uIG9mIGZhY3RvcmlhbHMgKikNCiAg4pSCICAgYXJyLihpLTEpIDwtIDQyOzsNCiAg4pSC IC0gOiB1bml0ID0gKCkNCiAg4pSCICMgayAoKTs7DQogIOKUgiAtIDogYm9vbCA9IHRydWUNCiAg 4pSCICMgKCogYnR3OiBoZXJlIHRoZSB1c2VyIGlzIGxpa2UgYSBzY2hlZHVsZXIgZm9yIHlpZWxk LWJhc2VkIGFzeW5jICopDQogIOKUgiAgIGsgKCk7Ow0KICDilIIgLSA6IGJvb2wgPSB0cnVlDQog IOKUgiAjIGsgKCk7Ow0KICDilIIgdmFsIGFyciA6IGludCBhcnJheSA9IFt8MTsgMTsgNDI7IDEy NjsgNTA0OyAyNTIwfF0NCiAg4pSCIC0gOiBib29sID0gdHJ1ZQ0KICDilJTilIDilIDilIDilIAN Cg0KICBDdXJyZW50bHkgSSBkb24ndCB0cnkgdG8gY2xlYW4gdXAgYmluZGluZ3Mgb3IgdmFsdWVz LCB3aGljaCBpcyBhDQogIHNvdXJjZSBvZiB1bnNvdW5kbmVzcy4gQWZ0ZXIgdGhlIGxhc3QgYGsg KCknIHdlIGdvdCB0d28gcmVzdWx0czogRmlyc3QNCiAgdGhlIGNvbXB1dGF0aW9uIG9mIGBsZXQg YXJyIC4uLicgZmluaXNoZWQsIGFuZCB0aGVuIHRoZSBjb21wdXRhdGlvbiBvZg0KICBgayAoKScg ZmluaXNoZWQuIEJ1dCBgaycgaXMgYSBwYXJ0IG9mIHRoZSBleGVjdXRpb24gb2YgYGxldCBhcnIg Li4uJywNCiAgc28gdGhlc2UgdHdvIGV4ZWN1dGlvbnMgImludGVyc2VjdCIgd2l0aG91dCBvbmUg YmVpbmcgY29udGFpbmVkIGluIHRoZQ0KICBvdGhlci4gVGhpcyBtYWtlcyB0aGUgcXVlc3Rpb24g b2Ygd2hhdCBzaG91bGQgdGhlIGN1cnJlbnQgdmFyaWFibGUNCiAgYmluZGluZ3MgYmUgY29tcGxp Y2F0ZWQuIFNldHRpbmcgdGhlIGJpbmRpbmdzIGF0IGVuZCBvZiBleGVjdXRpb24gaXMNCiAgZnV0 aWxlLCB3aGVuIGEgY29udGludWF0aW9uIG1heSBpbiBzdWNoIGEgd2F5IGxlYWsgYmluZGluZ3Mg ZnJvbQ0KICBicmVha3BvaW50IHRpbWUuDQoNCiAgUG9zc2libHkgYSBzdGFjayBkaXNjaXBsaW5l IGZvciB0aGUgZXhlY3V0aW9uIG9mIHBocmFzZXMgaXMgcmVxdWlyZWQNCiAgdG8gbWFrZSB0aGUg ZW52aXJvbm1lbnRzIGJlaGF2ZSBwcm9wZXJseTogYXQgdGhlIGVuZCBvZiBleGVjdXRpbmcgYQ0K ICBwaHJhc2Ugd2UgY2FuY2VsICh3aXRoIGFub3RoZXIgZWZmZWN0LCBtYXliZSkgb3RoZXIgZXhl Y3V0aW9ucyB3aGljaA0KICAiZGVwZW5kIiBvbiB0aGUgY3VycmVudCBleGVjdXRpb24gKGV2YWx1 YXRlIHRoZSBgaycgb2J0YWluZWQgZnJvbSBhDQogIGJyZWFrcG9pbnQgaW4gdGhlIGN1cnJlbnQg ZXhlY3V0aW9uKS4gVGhpcyBzaG91bGQgZWxpbWluYXRlIHRoZXNlDQogICJpbnRlcnNlY3Rpb25z IiBhbmQgd2UgY291bGQgdGhyb3cgb3V0IHRoZSBiaW5kaW5ncyBhZGRlZCBieSB0aGUNCiAgY2Fu Y2VsbGVkIGV4ZWN1dGlvbnMuDQoNCiAgSSBoYXZlbid0IHRyaWVkIGFueXRoaW5nIHdpdGggcG9s eW1vcnBoaXNtIHlldCwgYnV0IHR5cGUgdmFyaWFibGVzDQogIHNob3VsZCBwcm9iYWJseSBiZSBj aGFuZ2VkIGludG8gYWJzdHJhY3QgdHlwZXMgaW5zaWRlIHRoZSBiaW5kZXJzLg0KDQogIEhlcmUn cyB0aGUgY29kZToNCiAgPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1tdWx0aWNvcmUvb2NhbWwv Y29tcGFyZS9tdWx0aWNvcmUtcHIuLi53aWt0b3JrdWNodGE6dG9wbGV2ZWwtYnJlYWs+DQoNCg0K d2lrdG9yIGxhdGVyIHNhaWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgA0KDQogIFdlbGwsIHRoaXMgbWlnaHQgaGF2ZSBiZWVuIHVubmVjZXNzYXJ5 LCBhcyBtb3N0IG9mIGl0IGNhbiBiZSBkb25lDQogIHByb3Blcmx5IGluIHVzZXJzcGFjZSAod2l0 aCBtb3JlIHN5bnRhY3RpYyBvdmVyaGVhZCkuDQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBv cGVuIEVmZmVjdEhhbmRsZXJzDQogIOKUgiBvcGVuIERlZXANCiAg4pSCIA0KICDilIIgdHlwZSAo J2EsICdiKSByZXMgPQ0KICDilIIgICB8IEJwIG9mICdhICogKCh1bml0LCAoJ2EsICdiKSByZXMp IGNvbnRpbnVhdGlvbikNCiAg4pSCICAgfCBGaW4gb2YgJ2INCiAg4pSCIA0KICDilIIgbW9kdWxl IHR5cGUgUDEgPSBzaWcgIHZhbCBpIDogaW50ICB2YWwgYXJyIDogaW50IGFycmF5IGVuZA0KICDi lIIgdHlwZSBwYXlsb2FkID0gUDEgb2YgKG1vZHVsZSBQMSkNCiAg4pSCIHR5cGUgXyBlZmYgKz0g QnJlYWsgOiBwYXlsb2FkIC0+IHVuaXQgZWZmDQogIOKUgiANCiAg4pSCIGxldCBhcnIgKCkgPQ0K ICDilIIgICBsZXQgZmFjdCBuID0NCiAg4pSCICAgICBsZXQgYXJyID0gQXJyYXkubWFrZSAobisx KSAxIGluDQogIOKUgiAgICAgbGV0IHJlYyBsb29wIGkgPQ0KICDilIIgICAgICAgaWYgaSA8PSBu IHRoZW4gYmVnaW4NCiAg4pSCIAlwZXJmb3JtIChCcmVhayAoUDEgKG1vZHVsZSBzdHJ1Y3QgbGV0 IGkgPSBpIGxldCBhcnIgPSBhcnIgZW5kKSkpOw0KICDilIIgCWFyci4oaSkgPC0gYXJyLihpLTEp ICogaTsNCiAg4pSCIAlsb29wIChpKzEpDQogIOKUgiAgICAgICBlbmQNCiAg4pSCICAgICBpbg0K ICDilIIgICAgIChsb29wIDE7IGFycikNCiAg4pSCICAgaW4NCiAg4pSCICAgICBmYWN0IDU7Ow0K ICDilIIgDQogIOKUgiBsZXQgd2l0aF9icmVhayB0aCA9DQogIOKUgiAgIHRyeV93aXRoIChmdW4g KCkgLT4gRmluICh0aCAoKSkpICgpDQogIOKUgiAgIHsgZWZmYyA9IGZ1biAodHlwZSBhKSAoZSA6 IGEgZWZmKSAtPg0KICDilIIgICAgICAgbWF0Y2ggZSB3aXRoDQogIOKUgiAgICAgICB8IEJyZWFr IHAgLT4gU29tZSAoZnVuIChrIDogKGEsXykgY29udGludWF0aW9uKSAtPiBCcCAocCwgaykpDQog IOKUgiAgICAgICB8IF8gLT4gTm9uZSB9DQogIOKUgiANCiAg4pSCIGxldCBjb250ID0gZnVuY3Rp b24NCiAg4pSCICAgfCBCcCAoXywgaykgLT4gY29udGludWUgayAoKQ0KICDilIIgICB8IEZpbiBf IC0+IGZhaWx3aXRoICJjb21wdXRhdGlvbiBmaW5pc2hlZCwgY2Fubm90IGNvbnRpbnVlIg0KICDi lIIgDQogIOKUgiBsZXQgZ2V0ID0gZnVuY3Rpb24NCiAg4pSCICAgfCBCcCAociwgXykgLT4gcg0K ICDilIIgICB8IEZpbiBfIC0+IGZhaWx3aXRoICJjb21wdXRhdGlvbiBmaW5pc2hlZCwgbm8gYnJl YWtwb2ludCBwYXlsb2FkIg0KICDilIIgDQogIOKUgiBsZXQgZ2V0MSByID0gbWF0Y2ggZ2V0IHIg d2l0aCBQMSBtIC0+IG0NCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAg4pSM4pSA4pSA4pSA4pSADQog IOKUgiAjIGxldCByID0gd2l0aF9icmVhayBhcnI7Ow0KICDilIIgdmFsIHIgOiAocGF5bG9hZCwg aW50IGFycmF5KSByZXMgPSBCcCAoUDEgPG1vZHVsZT4sIDxhYnN0cj4pDQogIOKUgiAjIG9wZW4g KHZhbCBnZXQxIHIpOzsNCiAg4pSCIHZhbCBpIDogaW50ID0gMQ0KICDilIIgdmFsIGFyciA6IGlu dCBhcnJheSA9IFt8MTsgMTsgMTsgMTsgMTsgMXxdDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIFRo ZSBtYWluIHBhaW4gcG9pbnQgaXMgaGF2aW5nIHRvIGRlZmluZSB0aGUgcGF5bG9hZCB0eXBlcy4g SW4gYmFzaWMNCiAgY2FzZXMgdGhlIHBheWxvYWQgdHlwZSBjb3VsZCBiZSBqdXN0IGEgc2ltcGxl IHBvbHltb3JwaGljIHZhcmlhbnQuIEl0DQogIHdvdWxkIGJlIG5pY2UgaWYgaXQgY291bGQgYmUg Y29tcGxldGVseSBpbmZlcnJlZCwgYnV0IGl0J3MgdW5saWtlbHkgYXMNCiAgYEJyZWFrYCBoYXMg dG8gaGF2ZSBhIHN0YXRpY2FsbHkga25vd24gYXJndW1lbnQuDQoNCiAgV2l0aCBhIGJpdCBvZiBo ZWxwIGZyb20gdG9vbGluZyAocHB4ZXMgZm9yIGNvZGUgZ2VuZXJhdGlvbiBhbmQNCiAgc2hvcnRo YW5kcyBpbiB0aGUgdG9wbGV2ZWwpLCB0aGlzIGNvdWxkIGJlIGJldHRlciB0aGFuIHByaW50Zg0K ICBkZWJ1Z2dpbmcuDQoNCg0KR3VpbGxhdW1lIE11bmNoLU1hY2NhZ25vbmkgdGhlbiBzYWlkDQri lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBU aGlzIGlzIGFuIGludGVyZXN0aW5nIGV4cGVyaW1lbnQuDQogIOKAoiBUaGlzIHJlbWluZHMgbWUg b2YgdGhlIGlkZWEgb2YgaGlnaC1sZXZlbCBzdGFjayBpbnNwZWN0aW9uIGZvcg0KICAgIGRlYnVn Z2luZyBhbmQgc2VjdXJpdHkgKGFydGljdWxhdGVkIGZvciBpbnN0YW5jZSBpbiBDbGVtZW50cycg UGhEDQogICAgdGhlc2lzIF9bUG9ydGFibGUgYW5kIGhpZ2gtbGV2ZWwgYWNjZXNzIHRvIHRoZSBz dGFjayB3aXRoDQogICAgQ29udGludWF0aW9uIE1hcmtzXV87IGhlcmUncyBbYW5vdGhlciBtb3Jl IHJlY2VudCBwYXBlcl0gZnJvbSB0aGUNCiAgICBSYWNrZXQgcGVvcGxlIHRoYXQgbWlnaHQgYmUg cmVsZXZhbnQpLiBPbmUgY2FuIGFzayB3aGV0aGVyIGEgUFBYIGNhbg0KICAgIHByb3ZpZGUgaGln aC1sZXZlbCBzdGFjayBpbnNwZWN0aW9uIG9yIGlmIG9uZSBuZWVkcyBzdXBwb3J0IGZyb20gdGhl DQogICAgY29tcGlsZXIgZm9yIHRoYXQuIEl0J3MgbmljZSB0byBleHBlcmltZW50Lg0KICDigKIg QSBmZXcgeWVhcnMgYWdvIHNvbWVvbmUgYXNrZWQgd2hldGhlciB0aGVyZSBjb3VsZCBiZSBhIHVz ZSB0bw0KICAgIHVudHlwZWQgYWxnZWJyYWljIGVmZmVjdHMgaW4gT0NhbWwgKGluIHRoZSBzZW5z ZSB0aGF0IHRoZXkgZG8gbm90DQogICAgYXBwZWFyIGluIHRoZSBlZmZlY3QgYW5ub3RhdGlvbiBp biBmdW5jdGlvbiB0eXBlcykuIEkgcHJvcG9zZWQNCiAgICBkZWJ1Z2dpbmcgYXMgYW4gZXhhbXBs ZS4gU29tZW9uZSBzdWdnZXN0ZWQgdGhhdCBpdCBpcyBub3QgdG9vIGhhcmQNCiAgICB0byBhZGFw dCB0aGUgaW50ZXJmYWNlIHR5cGVzIG9mIGFsbCBmdW5jdGlvbnMgaW4gdGhlIGNhbGwgY2hhaW4g dG8NCiAgICBhZGQgdGhlIGFwcHJvcHJpYXRlIGVmZmVjdCBhbm5vdGF0aW9uIChhbmQgcmVtb3Zl IGl0IGFmdGVyd2FyZHMpLA0KICAgIGJ1dCBJIHdhcyBub3QgY29udmluY2VkLg0KDQoNCltQb3J0 YWJsZSBhbmQgaGlnaC1sZXZlbCBhY2Nlc3MgdG8gdGhlIHN0YWNrIHdpdGggQ29udGludWF0aW9u IE1hcmtzXQ0KPGh0dHBzOi8vd3d3Mi5jY3MubmV1LmVkdS9yYWNrZXQvcHVicy9kaXNzZXJ0YXRp b24tY2xlbWVudHMucGRmPg0KDQpbYW5vdGhlciBtb3JlIHJlY2VudCBwYXBlcl0NCjxodHRwczov L2RsLmFjbS5vcmcvZG9pLzEwLjExNDUvMzM4NTQxMi4zMzg1OTgxPg0KDQoNCk11bHRpLXNob3Qg Y29udGludWF0aW9ucyBnb25lIGZvcmV2ZXI/DQrilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9k aXNjdXNzLm9jYW1sLm9yZy90L211bHRpLXNob3QtY29udGludWF0aW9ucy1nb25lLWZvcmV2ZXIv OTA3Mi8xPg0KDQoNCmN5YmVycGluayBhc2tlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgV2hhdCBoYXBwZW5zIHdpdGggbXVsdGktc2hvdCBjb250 aW51YXRpb25zIG5vdyB0aGF0DQogIE9iai5jbG9uZV9jb250aW51YXRpb24gd2FzIHJlbW92ZWQ/ DQogIChbaHR0cHM6Ly9naXRodWIuY29tL29jYW1sLW11bHRpY29yZS9vY2FtbC1tdWx0aWNvcmUv cHVsbC82NTFdKQ0KDQogIEFueXRoaW5nIHRoYXQgcmVxdWlyZXMgYSAiZm9yayIgb3BlcmF0aW9u LCBsaWtlIHNheSwgYSBwcm9iYWJpbGlzdGljDQogIHByb2dyYW1taW5nIEVEU0wsIG5lZWRzIHRo aXMuIE5vbmUgb2YgdGhlIG9sZCBleGFtcGxlcyBJJ3ZlIGxvb2tlZCBhdA0KICBsaWtlIFtEZWxp bWNjIG9uIHRvcCBvZiBlZmZlY3RzXSBoYXZlIGJlZW4gdXBkYXRlZCB0byB1c2UgYSBuZXcNCiAg bWV0aG9kLCBhbmQgSSBoYXZlbid0IGJlZW4gYWJsZSB0byBmaW5kIGFueSBoaW50cyBvZiBvbmUu DQoNCiAgQXJlIG11bHRpLXNob3QgY29udGludWF0aW9ucyBqdXN0IG5vdCBwb3NzaWJsZSBub3c/ IEFyZSB0aGVyZSBwbGFucyB0bw0KICBhZGQgc29tZXRoaW5nIGVxdWl2YWxlbnQgYmFjayBpbiBs YXRlcj8NCg0KDQpbaHR0cHM6Ly9naXRodWIuY29tL29jYW1sLW11bHRpY29yZS9vY2FtbC1tdWx0 aWNvcmUvcHVsbC82NTFdDQo8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sLW11bHRpY29yZS9vY2Ft bC1tdWx0aWNvcmUvcHVsbC82NTE+DQoNCltEZWxpbWNjIG9uIHRvcCBvZiBlZmZlY3RzXQ0KPGh0 dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1tdWx0aWNvcmUvZWZmZWN0cy1leGFtcGxlcy9ibG9iL21h c3Rlci9kZWxpbWNjLm1sPg0KDQoNCk5pY29sw6FzIE9qZWRhIELDpHIgcmVwbGllZA0K4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSADQoNCiAgWWVzLCBtdWx0aS1zaG90IGNvbnRpbnVhdGlvbnMgYXJlIGdvbmUg YW5kIGlzIHVubGlrZWx5IHRoYXQgdGhleSB3aWxsDQogIGZpbmQgdGhlaXIgd2F5IGJhY2sgYW55 IHRpbWUgc29vbi4gT25lIChnb29kKSByZWFzb24gaXMgZXhwbGFpbmVkIGluDQogIDxodHRwczov L2RsLmFjbS5vcmcvZG9pLzEwLjExNDUvMzQzNDMxND4gOg0KDQogIDxodHRwczovL2F3czEuZGlz Y291cnNlLWNkbi5jb20vc3RhbmRhcmQxMS91cGxvYWRzL29jYW1sL29yaWdpbmFsLzJYLzgvOGQy NjUyMGVmMGY3OTBmZDNkYzQ0MDc0NThkOTI1YzFhMjhmZGJjYS5wbmc+DQoNCiAgYW5kDQoNCiAg PGh0dHBzOi8vYXdzMS5kaXNjb3Vyc2UtY2RuLmNvbS9zdGFuZGFyZDExL3VwbG9hZHMvb2NhbWwv b3JpZ2luYWwvMlgvYi9iMjhmYTE0Zjk2NzM2NDc0MzI3N2MwMTMyYTgwNGM0MzBkMmQ2NmQxLnBu Zz4NCg0KDQpHdWlsbGF1bWUgTXVuY2gtTWFjY2Fnbm9uaSB0aGVuIHNhaWQNCuKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEkgdGhpbmsgdGhl IHF1ZXN0aW9uIHN0aWxsIHN0YW5kcy4gWW91IGN1dCB0aGUgc2VudGVuY2Ug4oCcX0V4dGVuZGlu Zw0KICBvdXIgc3lzdGVtIHdpdGggbXVsdGktc2hvdCBjb250aW51YXRpb25zIGlzIGZ1dHVyZSB3 b3JrICjCpzgpX+KAnS4gQWxzbw0KICB0aGUgcGFwZXIgaXMgYWJvdXQgYSBwYXJ0aWN1bGFyIG1v ZGVsIGJhc2VkIG9uIHNlcGFyYXRpb24gbG9naWMgcmF0aGVyDQogIHRoYW4gT0NhbWwgaXRzZWxm IChmb3IgaW5zdGFuY2UgdGhlIGF1dGhvcnMgYWxzbyBtZW50aW9uIHRoYXQgdGhlaXINCiAgY29u dGludWF0aW9ucyBhcmUgYWZmaW5lIGluc3RlYWQgb2YgbGluZWFyIHVubGlrZSBpbiBPQ2FtbCBt dWx0aWNvcmUpLg0KDQogIE5ldmVydGhlbGVzcywgdGhlIG11bHRpY29yZSBkZXNpZ25lcnMgd2Vy ZSBhd2FyZSB0aGF0IGR1cGxpY2F0aW5nDQogIGNvbnRpbnVhdGlvbnMgbWFrZXMgaXQgY29tcGxp Y2F0ZWQgdG8gcmVhc29uIGFib3V0IHJlc291cmNlcy4gVGhlDQogIHRvcGljIG9mIG1peGluZyBj b250aW51YXRpb25zIGFuZCBsaW5lYXJpdHkgaGFzIGJlZW4gYmV0dGVyIHN0dWRpZWQNCiAgZnJv bSB0aGUgYW5nbGUgb2YgYWxnZWJyYWljIG1vZGVscyBvZiBjb21wdXRhdGlvbiBhbmQgcHJvb2YN CiAgdGhlb3J5LiBFc3NlbnRpYWxseSwgd2l0aCBhbiBlZmZlY3Qgc3lzdGVtIHlvdSBjb3VsZCBl bnN1cmUgdGhhdA0KICBjZXJ0YWluIGtpbmRzIG9mIGVmZmVjdHMgZG8gbm90IGhhcHBlbiBpbiB0 aGUgZGVsaW1pdGVkIHBhcnQgb2YgdGhlDQogIHByb2dyYW0gKGluY2x1ZGluZyBhbGxvY2F0aW5n IGEgcmVzb3VyY2UpLCB3aGljaCBjb250cm9scyBjb3BpYWJpbGl0eQ0KICBvZiB0aGUgc3RhY2sg ZnJvbSB0aGUgcG9pbnQgb2YgdmlldyBvZiByZWFzb25pbmcgYWJvdXQgdGhlDQogIHByb2dyYW0u IFRoaXMgaXMgaW5zcGlyZWQgYnkgc29tZSBsb2dpY3MgdGhhdCBtaXggY2xhc3NpY2FsIGFuZA0K ICBpbnR1aXRpb25pc3RpYyBvciBsaW5lYXIgbG9naWMuIEZyb20gdGhpcyBhbmdsZSB0aGUgYWJp bGl0eSB0byBjb3B5IGENCiAgY29udGludWF0aW9uIHdvdWxkIGJlIHJlc3RyaWN0ZWQgdG8gYSBz dWItcGFydCBvZiB0aGUgbGFuZ3VhZ2Ugd2hpY2gNCiAgaXMgcHVyZSB0byBzb21lIGRlZ3JlZS4g VGhpcyBzaG91bGQgYWxzbyBiZSBhIHN1aXRhYmxlIHN0YXJ0aW5nIHBvaW50DQogIGlmIG9uZSB3 YW50ZWQgdG8gZGV2ZWxvcCBhIHByb2dyYW0gbG9naWMgdG8gZm9ybWFsaXNlIHRoZSByZWFzb25p bmcNCiAgYWJvdXQgc3VjaCBwcm9ncmFtcy4NCg0KICBIb3dldmVyIGFjY29yZGluZyB0byBbIzY1 MV0gdGhlcmUgd2VyZSBtb3JlIHRlY2huaWNhbCByZWFzb25zIHRvIGRyb3ANCiAgYGNsb25lX2Nv bnRpbnVhdGlvbicsIHN1Y2ggYXMgYnJlYWtpbmcgY29tcGlsZXIgb3B0aW1pemF0aW9ucy4gSSBh bQ0KICBjdXJpb3VzIGFzIHdlbGwgdG8ga25vdyB3aGV0aGVyIHRoZXJlIGFyZSBwbGFucyB0byBy ZWludHJvZHVjZQ0KICBgY2xvbmVfY29udGludWF0aW9uJyBhdCBzb21lIHBvaW50LCBidXQgb2J2 aW91c2x5IHRoaXMgd291bGQgcmVxdWlyZQ0KICBzb21lIGVmZm9ydC4NCg0KDQpbIzY1MV0gPGh0 dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1tdWx0aWNvcmUvb2NhbWwtbXVsdGljb3JlL3B1bGwvNjUx Pg0KDQoNCktDIFNpdmFyYW1ha3Jpc2huYW4gc2FpZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgQG5v amIgYW5kIEBnYWRtbSBoYXZlIGFscmVhZHkgYW5zd2VyZWQgd2h5IHdlJ3ZlIGRyb3BwZWQgc3Vw cG9ydCBmb3INCiAgYGNsb25lX2NvbnRpbnVhdGlvbicgbm93LiBXZSB3aWxsIG5lZWQgdG8gdHJh Y2sgdGhlIGNvcGlhYmlsaXR5IG9mIHRoZQ0KICBjb250aW51YXRpb24gaW4gdGhlIGNvbnRpbnVh dGlvbiB0eXBlIGFuZCBjb21waWxlciBvcHRpbWlzYXRpb25zIGFsc28NCiAgbmVlZCB0byBiZSBt YWRlIGF3YXJlIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBjb3B5aW5nLiBHaXZlbiB0aGUNCiAgcGVy dmFzaXZlIG5hdHVyZSBvZiBpdHMgZWZmZWN0cywgdGhlcmUgYXJlIG5vIGltbWVkaWF0ZSBwbGFu cyB0byBicmluZw0KICB0aGUgZmVhdHVyZSBiYWNrLiBXZSB3aWxsIGhhdmUgdG8gY29tZSBiYWNr IHRvIHRoaXMgYWZ0ZXIgd2UgaGF2ZQ0KICB0eXBlZCBlZmZlY3RzLg0KDQogICAgICAgIEFueXRo aW5nIHRoYXQgcmVxdWlyZXMgYSDigJxmb3Jr4oCdIG9wZXJhdGlvbiwgbGlrZSBzYXksIGENCiAg ICAgICAgcHJvYmFiaWxpc3RpYyBwcm9ncmFtbWluZyBFRFNMDQoNCiAgT25lIGNhbiBnZXQgcHJl dHR5IGZhciB3aXRoIFBQTCB3aXRoIGp1c3Qgb25lLXNob3QgY29udGludWF0aW9ucy4gTXkNCiAg c3R1ZGVudCBhbmQgSSBkaWQgc29tZSBleHBlcmltZW50cyBidWlsZGluZyBhIERTTCBmb3IgYSBQ UEwgdG8gbGVhcm4NCiAgYWJvdXQgdGhlIHNwYWNlOiA8aHR0cHM6Ly9naXRodWIuY29tL0Fybmhh di1EYXRhci9FZmZQUEw+LiBIYXZpbmcNCiAgc3Bva2VuIHRvIFBQTCBleHBlcnRzIHRoZXJlIGFy ZSBpbmRlZWQgc29tZSB1c2VjYXNlcyB3aGVyZSBtdWx0aS1zaG90DQogIGNvbnRpbnVhdGlvbnMg YXJlIHVzZWZ1bCwgYnV0IGZyb20gd2hhdCBJIHVuZGVyc3RhbmQsIHRoZSBvbmUtc2hvdG5lc3MN CiAgaXNuJ3QgYSBibG9ja2VyIGZvciBQUEwuDQoNCiAgSSB3b3VsZCBiZSBpbnRlcmVzdGVkIGlu IGNvbGxlY3RpbmcgdXNlY2FzZXMgd2hlcmUgbXVsdGktc2hvdA0KICBjb250aW51YXRpb25zIGFy ZSBhYnNvbHV0ZWx5IG5lY2Vzc2FyeS4NCg0KDQpnYXNjaGUgdGhlbiBzYWlkDQrilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBJbnRlcmVzdGluZyEN Cg0KICBNeSAocHJvYmFibHkgbmFpdmUpIG1lbnRhbCBtb2RlbCBvZiBIQU5TRUktc3R5bGUgbGli cmFyaWVzLCB1c2luZw0KICBtdWx0aXNob3QgY29udGludWF0aW9ucywgaXMgdGhhdCB0aGV5IGFy ZSBleHRlbnNpb25zL2dlbmVyYWxpemF0aW9uIG9mDQogIGEgbm9uLXByb2JhYmlsaXN0aWMgImxv Z2ljL25vbi1kZXRlcm1pbmlzdGljIG1vbmFkIiB0aGF0IHNlYXJjaGVzIGZvcg0KICB0aGUgc2V0 IG9mIHNvbHV0aW9ucyB0byBhIHByb2JsZW0uIE11bHRpc2hvdCBjb250aW51YXRpb25zIGFyZQ0K ICBuYXR1cmFsbHkgdXNlZCBpbiBub24tZGV0ZXJtaW5pc3RpYyBjb21wdXRhdGlvbnMgYXQgYmFj a3RyYWNraW5nDQogIHBvaW50cywgdG8gZXhwbG9yZSBkaWZmZXJlbnQgc2VhcmNoIGRpcmVjdGlv bnMgYW5kIGNvbGxlY3QgdGhlDQogIHJlc3VsdC4gSXQgaXMgcG9zc2libGUgdG8gYXZvaWQgbXVs dGlzaG90IGNvbnRpbnVhdGlvbnMgYnkgcmVwbGF5aW5nDQogIHRoZSB3aG9sZSBzZWFyY2ggZnJv bSB0aGUgc3RhcnQgZWFjaCB0aW1lIChyZWZlcmVuY2U6IFtDYXB0dXJpbmcgdGhlDQogIGZ1dHVy ZSBieSByZXBsYXlpbmcgdGhlIHBhc3RdKSwgYnV0IHRoaXMgaW52b2x2ZXMgZHVwbGljYXRlZA0K ICBjb21wdXRhdGlvbnMgc28gaXQgaXMgbGVzcyBlZmZpY2llbnQgKHJlZmVyZW5jZTogW0FzeW1w dG90aWMgc3BlZWR1cA0KICB3aXRoIGZpcnN0LWNsYXNzIGNvbnRyb2xdKS4NCg0KICBDYW4geW91 IGdpdmUgc29tZSBpbnR1aXRpb24gb2YgaG93IG90aGVyIGFwcHJvYWNoZXMgdG8gcHJvYmFsaXN0 aWMNCiAgaW5mZXJlbmNlIHdvcmssIHRoYXQgZG8gbm90IHJlcXVpcmUgbXVsdGlzaG90IGNvbnRp bnVhdGlvbnM/IEFyZSB0aGV5DQogIGFsc28gZHVwbGljYXRpbmcgY29tcHV0YXRpb25zLCBvciBh cmUgdGhleSB1c2luZyBhIG1hZ2ljIHRyaWNrIHRvDQogIGF2b2lkIHRoaXMgaXNzdWUgd2l0aCBh IGRpZmZlcmVudCBpbmZlcmVuY2UgYWxnb3JpdGhtPw0KDQogIEkgdHJpZWQgdG8gZmluZCBhbiBh bnN3ZXIgdG8gdGhpcyBxdWVzdGlvbiBieSByZWFkaW5nIHRoZSBbaW50ZXJuc2hpcA0KICByZXBv cnRdLCBidXQgSSBjb3VsZG4ndCBsb2NhdGUgYW4gYW5zd2VyLiAoVGhlIHJlcG9ydCBtZW50aW9u cyBIQU5TRUkNCiAgaW4gdGhlIHJlbGF0ZWQgd29yaywgYnV0IGl0IGRvZXMgbm90IGRpc2N1c3Mg dGhpcyBxdWVzdGlvbi4pIFRoZQ0KICByZXBvcnQgZXhwbGFpbnMgdGhhdCB0aGUgaW5mZXJlbmNl IGFsZ29yaXRobSwgY2FsbGVkIEhNQyAoSGFtaWx0b25pYW4NCiAgTW9udGUgQ2FybG8pLCB1c2Vz IGF1dG9tYXRpYyBkaWZmZXJlbmNpYXRpb247IHNvIGl0IHVzZXMgYSBzb3J0IG9mDQogIHN5bWJv bGljIG1hbmlwdWxhdGlvbiAvIGFuYWx5c2lzIG9mIHRoZSBwcm9iYWJpbGlzdGljIHByb2dyYW0g dG8NCiAgc2FtcGxlLiBCdXQgZG9lcyB0aGlzIGF2b2lkIHJlcGVhdGVkIGNvbXB1dGF0aW9ucz8g IEl0IG1heSBiZSB0aGUgY2FzZQ0KICBpbnN0ZWFkIHRoYXQgdGhlIGRpZmZlcmVudGlhbCBpcyBh cyBsYXJnZSBvciBsYXJnZXIgdGhhbiB0aGUgcHJvZ3JhbQ0KICBpdHNlbGYsIGFuZCB0aGF0IHRo ZSBzZWFyY2ggYWxnb3JpdGhtIHVzaW5nIHRoaXMgZGlmZmVyZW50aWFsIGluDQogIGVmZmVjdCBw ZXJmb3JtIGEgcHJvZ3JhbS1zaXplZCBjb21wdXRhdGlvbiBhdCBlYWNoIHNlYXJjaCBzdGVwLA0K ICBkdXBsaWNhdGluZyBjb21wdXRhdGlvbnMuDQoNCg0KW0NhcHR1cmluZyB0aGUgZnV0dXJlIGJ5 IHJlcGxheWluZyB0aGUgcGFzdF0NCjxodHRwczovL2FyeGl2Lm9yZy9wZGYvMTcxMC4xMDM4NT4N Cg0KW0FzeW1wdG90aWMgc3BlZWR1cCB3aXRoIGZpcnN0LWNsYXNzIGNvbnRyb2xdDQo8aHR0cHM6 Ly9hcnhpdi5vcmcvYWJzLzIwMDcuMDA2MDU+DQoNCltpbnRlcm5zaGlwIHJlcG9ydF0NCjxodHRw czovL2dpdGh1Yi5jb20vQXJuaGF2LURhdGFyL0VmZlBQTC9ibG9iL21haW4vRWZmUFBMX1JlcG9y dC5wZGY+DQoNCg0KU2FkaXEgc2FpZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoN CiAgTm90IGEgUFBMIGJ1dCBJJ3ZlIGJlZW4gaGFja2luZyBvbiBhIGxpdHRsZSBlZmZlY3RzLWJh c2VkIG1vZGVsDQogIGNoZWNrZXIgZm9yIGNvbmN1cnJlbnQgZGF0YSBzdHJ1Y3R1cmVzIHRoYXQg aW1wbGVtZW50cyBkeW5hbWljIHBhcnRpYWwNCiAgb3JkZXIgcmVkdWN0aW9uICg8aHR0cHM6Ly9n aXRodWIuY29tL3NhZGlxai9kc2NoZWNrLz4gLSBhDQogIFdJUCEpLiBNdWx0aS1zaG90IGNvbnRp bnVhdGlvbnMgd291bGQgaGF2ZSBiZWVuIHZlcnkgdXNlZnVsLg0KDQogIEkgZW5kZWQgdXAgaW1w bGVtZW50aW5nIHNvbWV0aGluZyB0aGF0IGludm9sdmVzIG1haW50YWluaW5nIGEgc2NoZWR1bGUN CiAgYW5kIHJlcGVhdGVkbHkgcmVwbGF5aW5nIHRoZSBjb21wdXRhdGlvbi4gSXQgbG9va3MgdmVy eSBzaW1pbGFyIHRvDQogIHdoYXQgW0NhcHR1cmluZyB0aGUgZnV0dXJlLi5dIHByb3Bvc2VzLg0K DQoNCltDYXB0dXJpbmcgdGhlIGZ1dHVyZS4uXSA8aHR0cHM6Ly9hcnhpdi5vcmcvcGRmLzE3MTAu MTAzODU+DQoNCg0KTmV3IHJlbGVhc2Ugb2YgTWVuaGlyICgyMDIxMTIzMCkNCuKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rp c2N1c3Mub2NhbWwub3JnL3QvYW5uLW5ldy1yZWxlYXNlLW9mLW1lbmhpci0yMDIxMTIzMC85MDc3 LzE+DQoNCg0KRnJhbsOnb2lzIFBvdHRpZXIgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIANCg0KICBEZWFyIE9DYW1sICYgTWVuaGlyIHVzZXJzLA0KDQogIEkgYW0gcGxlYXNlZCB0byBh bm5vdW5jZSBhIG5ldyByZWxlYXNlIG9mIE1lbmhpciwgd2l0aCBhIG1ham9yDQogIGltcHJvdmVt ZW50Lg0KDQogIFRoZSBjb2RlIGJhY2stZW5kIGhhcyBiZWVuIHJld3JpdHRlbiBmcm9tIHRoZSBn cm91bmQgdXAgYnkgw4ltaWxlDQogIFRyb3RpZ25vbiBhbmQgYnkgbXlzZWxmLCBhbmQgbm93IHBy b2R1Y2VzIGVmZmljaWVudCBhbmQgd2VsbC10eXBlZA0KICBPQ2FtbCBjb2RlLiBUaGUgaW5mYW1v dXMgT2JqLm1hZ2ljIGlzIG5vdCB1c2VkIGFueSBtb3JlLg0KDQogIEZ1cnRoZXJtb3JlLCB0aGUg bmV3IGNvZGUgYmFjay1lbmQgcHJvZHVjZXMgY29kZSB0aGF0IGlzIG1vcmUNCiAgYWdncmVzc2l2 ZWx5IG9wdGltaXplZCwgbGVhZGluZyB0byBhIHNpZ25pZmljYW50IHJlZHVjdGlvbiBpbiBtZW1v cnkNCiAgYWxsb2NhdGlvbiBhbmQgYSB0eXBpY2FsIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50IG9m IHVwIHRvIDIwJSBjb21wYXJlZA0KICB0byB0aGUgcHJldmlvdXMgY29kZSBiYWNrLWVuZC4NCg0K ICDilIzilIDilIDilIDilIANCiAg4pSCIG9wYW0gdXBkYXRlDQogIOKUgiBvcGFtIGluc3RhbGwg bWVuaGlyLjIwMjExMjMwDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIEhhcHB5IHdlbGwtdHlwZWQg cGFyc2luZyBpbiAyMDIyIQ0KDQoNCjIwMjEvMTIvMzANCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjA0KDQogIOKAoiBUaGUgY29kZSBiYWNrLWVuZCBoYXMgYmVlbiByZXdyaXR0ZW4gZnJv bSB0aGUgZ3JvdW5kIHVwIGJ5IMOJbWlsZQ0KICAgIFRyb3RpZ25vbiBhbmQgRnJhbsOnb2lzIFBv dHRpZXIsIGFuZCBub3cgcHJvZHVjZXMgZWZmaWNpZW50IGFuZA0KICAgICp3ZWxsLXR5cGVkKiBP Q2FtbCBjb2RlLiBUaGUgaW5mYW1vdXMgYE9iai5tYWdpYycgaXMgbm90IHVzZWQgYW55DQogICAg bW9yZS4NCg0KICAgIFRoZSB0YWJsZSBiYWNrLWVuZCBhbmQgdGhlIENvcSBiYWNrLWVuZCBhcmUg dW5hZmZlY3RlZCBieSB0aGlzDQogICAgY2hhbmdlLg0KDQogICAgVGhlIG1haW4gc2lkZSBlZmZl Y3RzIG9mIHRoaXMgY2hhbmdlIGFyZSBhcyBmb2xsb3dzOg0KDQogICAg4oCiIFRoZSBjb2RlIGJh Y2stZW5kIG5vdyBuZWVkcyB0eXBlIGluZm9ybWF0aW9uLiBUaGlzIG1lYW5zIHRoYXQNCiAgICAg IC9laXRoZXIvIE1lbmhpcidzIHR5cGUgaW5mZXJlbmNlIG1lY2hhbmlzbSBtdXN0IGJlIGVuYWJs ZWQgKHRoZQ0KICAgICAgCSBlYXNpZXN0IHdheSBvZiBlbmFibGluZyBpdCBpcyB0byB1c2UgTWVu aGlyIHZpYSBgZHVuZScNCiAgICAgIAkgYW5kIHRvIGNoZWNrIHRoYXQgdGhlIGBkdW5lLXByb2pl Y3QnIGZpbGUgc2F5cyBgKHVzaW5nDQogICAgICAJIG1lbmhpciAyLjApJyBvciBsYXRlcikNCiAg ICAgIC9vci8gdGhlIHR5cGUgb2YgZXZlcnkgbm9udGVybWluYWwgc3ltYm9sIG11c3QgYmUgZXhw bGljaXRseSBnaXZlbg0KICAgICAgICAgICB2aWEgYSBgJXR5cGUnIGRlY2xhcmF0aW9uLg0KDQog ICAg4oCiIFRoZSBjb2RlIGJhY2stZW5kIG5vIGxvbmdlciBhbGxvd3MgdGhlIHR5cGUgb2YgYW55 IHN5bWJvbCB0byBiZSBhbg0KICAgICAgb3BlbiBwb2x5bW9ycGhpYyB2YXJpYW50IHR5cGUsIHN1 Y2ggYXMgYFs+IGBBIF0nLiBBcyBhIHdvcmthcm91bmQsDQogICAgICB3ZSBzdWdnZXN0IHVzaW5n IGEgY2xvc2VkIHBvbHltb3JwaGljIHZhcmlhbnQgaW5zdGVhZC4NCg0KICAgIOKAoiBUaGUgY29k ZSBiYWNrLWVuZCBub3cgYWRoZXJlcyB0byB0aGUgL3NpbXBsaWZpZWQvIGVycm9yLWhhbmRsaW5n DQogICAgICBzdHJhdGVneSwgYXMgb3Bwb3NlZCB0byB0aGUgL2xlZ2FjeS8gc3RyYXRlZ3kuDQoN CiAgICAgIEZvciBncmFtbWFycyB0aGF0IGRvIC9ub3QvIHVzZSB0aGUgYGVycm9yJyB0b2tlbiwg dGhpcyBtYWtlcyBubw0KICAgICAgZGlmZmVyZW5jZS4NCg0KICAgICAgRm9yIGdyYW1tYXJzIHRo YXQgdXNlIHRoZSBgZXJyb3InIHRva2VuIGluIHRoZSBsaW1pdGVkIHdheQ0KICAgICAgcGVybWl0 dGVkIGJ5IHRoZSBzaW1wbGlmaWVkIHN0cmF0ZWd5LCB0aGlzIG1ha2VzIG5vIGRpZmZlcmVuY2UN CiAgICAgIGVpdGhlci4gVGhlIHNpbXBsaWZpZWQgc3RyYXRlZ3kgbWFrZXMgdGhlIGZvbGxvd2lu ZyByZXF1aXJlbWVudDoNCiAgICAgIHRoZSBgZXJyb3InIHRva2VuIHNob3VsZCBhbHdheXMgYXBw ZWFyIGF0IHRoZSBlbmQgb2YgYSBwcm9kdWN0aW9uLA0KICAgICAgd2hvc2Ugc2VtYW50aWMgYWN0 aW9uIHNob3VsZCBhYm9ydCB0aGUgcGFyc2VyIGJ5IHJhaXNpbmcgYW4NCiAgICAgIGV4Y2VwdGlv bi4NCg0KICAgICAgR3JhbW1hcnMgdGhhdCBtYWtlIG1vcmUgY29tcGxleCB1c2Ugb2YgdGhlIGBl cnJvcicgdG9rZW4sIGFuZA0KICAgICAgdGhlcmVmb3JlIG5lZWQgdGhlIGBsZWdhY3knIHN0cmF0 ZWd5LCBjYW5ub3QgYmUgY29tcGlsZWQgYnkgdGhlDQogICAgICBuZXcgY29kZSBiYWNrLWVuZC4g IEFzIGEgd29ya2Fyb3VuZCwgaXQgaXMgcG9zc2libGUgdG8gc3dpdGNoIHRvDQogICAgICB0aGUg dGFibGUgYmFjay1lbmQgKHVzaW5nIGAtLXRhYmxlIC0tc3RyYXRlZ3kgbGVnYWN5Jykgb3IgdG8g dGhlDQogICAgICBhbmNpZW50IGNvZGUgYmFjay1lbmQgKHVzaW5nIGAtLWNvZGUtYW5jaWVudCcp LiAqSW4gdGhlIGxvbmcgcnVuLA0KICAgICAgd2UgcmVjb21tZW5kIGFiYW5kb25pbmcgdGhlIHVz ZSBvZiB0aGUgYGVycm9yJyB0b2tlbiouIFN1cHBvcnQgZm9yDQogICAgICB0aGUgYGVycm9yJyB0 b2tlbiBtYXkgYmUgcmVtb3ZlZCBlbnRpcmVseSBhdCBzb21lIHBvaW50IGluIHRoZQ0KICAgICAg ZnV0dXJlLg0KDQogICAgVGhlIG9yaWdpbmFsIGNvZGUgYmFjay1lbmQsIHdoaWNoIGhhcyBiZWVu IGFyb3VuZCBzaW5jZSB0aGUgZWFybHkNCiAgICBkYXlzIG9mIE1lbmhpciAoMjAwNSksIHRlbXBv cmFyaWx5IHJlbWFpbnMgYXZhaWxhYmxlICh1c2luZw0KICAgIGAtLWNvZGUtYW5jaWVudCcpLiBJ dCB3aWxsIGJlIHJlbW92ZWQgYXQgc29tZSBwb2ludCBpbiB0aGUgZnV0dXJlLg0KDQogICAgVGhl IG5ldyBjb2RlIGJhY2stZW5kIG9mZmVycyBzZXZlcmFsIGxldmVscyBvZiBvcHRpbWl6YXRpb24s IHdoaWNoDQogICAgcmVtYWluIHVuZG9jdW1lbnRlZCBhbmQgYXJlIHN1YmplY3QgdG8gY2hhbmdl IGluIHRoZSBmdXR1cmUuIEF0DQogICAgcHJlc2VudCwgdGhlIG1haW4gbGV2ZWxzIGFyZSByb3Vn aGx5IGFzIGZvbGxvd3M6DQoNCiAgICDigKIgYC1PIDAgLS1yZXByZXNlbnQtZXZlcnl0aGluZycg dXNlcyBhIHVuaWZvcm0gcmVwcmVzZW50YXRpb24gb2YgdGhlDQogICAgICBzdGFjayBhbmQgcHJv ZHVjZXMgc3RyYWlnaHRmb3J3YXJkIGNvZGUuDQogICAg4oCiIGAtTyAwJyB1c2VzIGEgbm9uLXVu aWZvcm0gcmVwcmVzZW50YXRpb24gb2YgdGhlIHN0YWNrOyBzb21lIHN0YWNrDQogICAgICBjZWxs cyBoYXZlIGZld2VyIGZpZWxkczsgc29tZSBzdGFjayBjZWxscyBkaXNhcHBlYXIgYWx0b2dldGhl ci4NCiAgICDigKIgYC1PIDEnIHJlZHVjZXMgbWVtb3J5IHRyYWZmaWMgYnkgbW92aW5nIGBQVVNI JyBvcGVyYXRpb25zIHNvIHRoYXQNCiAgICAgIHRoZXkgbWVldCBgUE9QJyBvcGVyYXRpb25zIGFu ZCBjYW5jZWwgb3V0Lg0KICAgIOKAoiBgLU8gMicgb3B0aW1pemVzIHRoZSByZWR1Y3Rpb24gb2Yg dW5pdCBwcm9kdWN0aW9ucyAodGhhdCBpcywNCiAgICAgIHByb2R1Y3Rpb25zIHdob3NlIHJpZ2h0 LWhhbmQgc2lkZSBoYXMgbGVuZ3RoIDEpIGJ5IHBlcmZvcm1pbmcgYQ0KICAgICAgbGltaXRlZCBh bW91bnQgb2YgY29kZSBzcGVjaWFsaXphdGlvbi4NCg0KICAgIFRoZSBkZWZhdWx0IGxldmVsIG9m IG9wdGltaXphdGlvbiBpcyB0aGUgbWF4aW11bSBsZXZlbCwgYC1PIDInLg0KDQogIOKAoiBUaGUg bmV3IGNvbW1hbmQgbGluZSBzd2l0Y2ggYC0tZXhuLWNhcnJpZXMtc3RhdGUnIGNhdXNlcyB0aGUN CiAgICBleGNlcHRpb24gYEVycm9yJyB0byBjYXJyeSBhbiBpbnRlZ2VyIHBhcmFtZXRlcjogYGV4 Y2VwdGlvbiBFcnJvciBvZg0KICAgIGludCcuIFdoZW4gdGhlIHBhcnNlciBkZXRlY3RzIGEgc3lu dGF4IGVycm9yLCB0aGUgbnVtYmVyIG9mIHRoZQ0KICAgIGN1cnJlbnQgc3RhdGUgaXMgcmVwb3J0 ZWQgaW4gdGhpcyB3YXkuIFRoaXMgYWxsb3dzIHRoZSBjYWxsZXIgdG8NCiAgICBzZWxlY3QgYSBz dWl0YWJsZSBzeW50YXggZXJyb3IgbWVzc2FnZSwgYWxvbmcgdGhlIGxpbmVzIGRlc2NyaWJlZCBp bg0KICAgIFtTZWN0aW9uIDExXSBvZiB0aGUgbWFudWFsLiBUaGlzIGNvbW1hbmQgbGluZSBzd2l0 Y2ggaXMgY3VycmVudGx5DQogICAgc3VwcG9ydGVkIGJ5IHRoZSBjb2RlIGJhY2stZW5kIG9ubHku DQoNCiAg4oCiIFRoZSBgJHN5bnRheGVycm9yJyBrZXl3b3JkIGlzIG5vIGxvbmdlciBzdXBwb3J0 ZWQuDQoNCiAg4oCiIERvY3VtZW50IHRoZSB0cmljayBvZiB3cmFwcGluZyBtb2R1bGUgYWxpYXNl cyBpbiBgb3BlbiBzdHJ1Y3QNCiAgICAuLi4gZW5kJywgbGlrZSB0aGlzOiBgJXsgb3BlbiBzdHJ1 Y3QgbW9kdWxlIGFsaWFzIE0gPQ0KICAgIE15TG9uZ01vZHVsZU5hbWUgZW5kICV9Jy4gIFRoaXMg YWxsb3dzIHlvdSB0byB1c2UgdGhlIHNob3J0IG5hbWUgYE0nDQogICAgaW4geW91ciBncmFtbWFy LCBidXQgZm9yY2VzIE9DYW1sIHRvIGluZmVyIHR5cGVzIHRoYXQgcmVmZXIgdG8gdGhlDQogICAg bG9uZyBuYW1lIGBNeUxvbmdNb2R1bGVOYW1lJy4gIChTdWdnZXN0ZWQgYnkgRnLDqWTDqXJpYyBC b3VyLikNCg0KDQpbU2VjdGlvbiAxMV0NCjxodHRwOi8vY2FtYml1bS5pbnJpYS5mci9+ZnBvdHRp ZXIvbWVuaGlyL21hbnVhbC5odG1sI3NlYzY4Pg0KDQoNCkltcHJvdmVkIGRvY3VtZW50YXRpb24g Zm9yIEZpeA0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToN CiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4taW1wcm92ZWQtZG9jdW1lbnRhdGlv bi1mb3ItZml4LzkwNzkvMT4NCg0KDQpGcmFuw6dvaXMgUG90dGllciBhbm5vdW5jZWQNCuKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgA0KDQogIE15IGxhc3QgY29udHJpYnV0aW9uIGZvciAyMDIxIGlzIGFu IGltcHJvdmVkIGRvY3VtZW50YXRpb24gZm9yIEZpeCwgYQ0KICBsaWJyYXJ5IHRoYXQgaGVscHMg d2l0aCB2YXJpb3VzIGFsZ29yaXRobWljIGNvbnN0cnVjdGlvbnMgdGhhdCBpbnZvbHZlDQogIG1l bW9pemF0aW9uLCByZWN1cnNpb24sIGFuZCBudW1iZXJpbmcuDQoNCiAgVGhlIGRvY3VtZW50YXRp b24gY2FuIGJlIFt2aWV3ZWQgb25saW5lXS4NCg0KICBJdCBjYW4gYWxzbyBiZSB2aWV3ZWQgbG9j YWxseSAob24geW91ciBvd24gbWFjaGluZSkgYXMgZm9sbG93czoNCg0KICDilIzilIDilIDilIDi lIANCiAg4pSCIG9wYW0gdXBkYXRlDQogIOKUgiBvcGFtIGluc3RhbGwgZml4LjIwMjExMjMxDQog IOKUgiBvcGFtIGluc3RhbGwgb2RpZw0KICDilIIgb2RpZyBvZG9jICAgICAgICAgICAgICAgICAj IHRoaXMgbWF5IHRha2Ugc29tZSB0aW1lDQogIOKUgiBvZGlnIGRvYyBmaXggICAgICAgICAgICAg ICMgdGhpcyBvcGVucyB0aGUgZG9jIGluIHlvdXIgYnJvd3Nlcg0KICDilJTilIDilIDilIDilIAN Cg0KICBIYXBweSBmaXgnaW4nIGluIDIwMjIhDQoNCg0KW3ZpZXdlZCBvbmxpbmVdIDxodHRwOi8v Y2FtYml1bS5pbnJpYS5mci9+ZnBvdHRpZXIvZml4L2RvYy9maXgvPg0KDQoNCnBwLWJpbmFyeS1p bnRzIDAuMS4xDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOiA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90 L2Fubi1wcC1iaW5hcnktaW50cy0wLTEtMS85MDgwLzE+DQoNCg0KSWZheiBLYWJpciBhbm5vdW5j ZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgA0KDQogIFRpcmVkIG9mIHByaW50aW5nIG9jdGFscyBhbmQgaGV4YWRlY2ltYWxzIGFu ZCB0aGVuIG1lbnRhbGx5IGNvbnZlcnRpbmcNCiAgdGhlbSB0byBiaXRzLiBFdmVyIHdhbnRlZCB0 byBqdXN0IHNlZSB0aGUgYml0cyBpbiBhbiBpbnQ/IE5vdyB5b3UgY2FuIQ0KDQogIEp1c3QgcnVu IGBvcGFtIGluc3RhbGwgcHAtYmluYXJ5LWludHMnIGFuZCBvZmYgeW91IGdvOg0KICDilIzilIDi lIDilIDilIANCiAg4pSCICMgUHBfYmluYXJ5X2ludHMuSW50LnRvX3N0cmluZyAwYjEwMTAxMDAx OzsNCiAg4pSCIC0gOiBzdHJpbmcgPSAiMTAxMDEwMDEiDQogIOKUlOKUgOKUgOKUgOKUgA0KDQog IFlvdSBjYW4gZmluZCB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIHByb2plY3QgYW5kIG1vcmUg ZXhhbXBsZXMgb2YNCiAgaG93IHRvIHVzZSBpdCBbaGVyZV0uDQoNCiAgVGhlIGxpYnJhcnkgaXMg dmVyeSBjdXN0b21pemFibGUuDQoNCiAg4oCiIFlvdSBjYW4gY2hvb3NlIHRvIHByaW50IHdpdGgg YDBiJyBwcmVmaXhlcyBhbmQgYF8nIHNlcGFyYXRvcnMuDQogIOKAoiBZb3UgY2FuIGNob29zZSB0 byBwcmludCB6ZXJvcyBqdXN0IGxpa2UgdGhlIG5vbi16ZXJvcywgd2l0aCBwcmVmaXhlcw0KICAg IGFuZCBzZXBhcmF0b3JzLg0KICDigKIgSWYgeW91IHVzZSB6ZXJvIHBhZGRpbmcsIHlvdSBjYW4g Y29udHJvbCBob3cgbWFueSBsZWFkaW5nIHplcm9zIHNob3cNCiAgICB1cCB3aXRoIHRoZSBgfm1p bl93aWR0aCcgYXJndW1lbnQuDQogIOKAoiBJdCBjb3JyZWN0bHkgaGFuZGxlcyB0aGUgZWRnZSBj YXNlcyB3aGVuIGFkZGluZyBgXycgc2VwYXJhdG9yczogeW91DQogICAgd29u4oCZdCBnZXQgbGVh ZGluZyB1bmRlcnNjb3Jlcy4NCiAg4oCiIEl0IGluY2x1ZGVzIHByZXR0eSBwcmludGVycyB0aGF0 IHdvcmsgd2l0aCBgRm9ybWF0JyBhbmQgYEZtdCcgLCBub3QNCiAgICBqdXN0IGB0b19zdHJpbmcn IGZ1bmN0aW9ucy4NCiAg4oCiIFN1cHBvcnRzIGBpbnQnLCBgaW50MzInLCBgaW50NjQnLCBhbmQg YG5hdGl2ZWludCcuDQogIOKAoiBEb24ndCBsaWtlIHRoZSBkZWZhdWx0IHByZWZpeGVzIGFuZCBz dWZmaXhlcz8gQ3VzdG9taXplIHRoZSBwcmVmaXhlcw0KICAgIGFuZCBzdWZmaXhlcyB3aXRoIHRo ZSBwcm92aWRlZCBmdW5jdG9yLg0KDQoNCltoZXJlXQ0KPGh0dHBzOi8vaWZhemsuZ2l0aHViLmlv L3BwLWJpbmFyeS1pbnRzL3BwLWJpbmFyeS1pbnRzL2luZGV4Lmh0bWw+DQoNCg0KT2xkIENXTg0K 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgSWYgeW91IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5 b3UgY2FuIFtzZW5kIG1lIGEgbWVzc2FnZV0gYW5kIEknbGwgbWFpbA0KICBpdCB0byB5b3UsIG9y IGdvIHRha2UgYSBsb29rIGF0IFt0aGUgYXJjaGl2ZV0gb3IgdGhlIFtSU1MgZmVlZCBvZiB0aGUN CiAgYXJjaGl2ZXNdLg0KDQogIElmIHlvdSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVyeSB3 ZWVrIGJ5IG1haWwsIHlvdSBtYXkgc3Vic2NyaWJlDQogIFtvbmxpbmVdLg0KDQogIFtBbGFuIFNj aG1pdHRdDQoNCg0KW3NlbmQgbWUgYSBtZXNzYWdlXSA8bWFpbHRvOmFsYW4uc2NobWl0dEBwb2x5 dGVjaG5pcXVlLm9yZz4NCg0KW3RoZSBhcmNoaXZlXSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1l Lm5ldC9jd24vPg0KDQpbUlNTIGZlZWQgb2YgdGhlIGFyY2hpdmVzXSA8aHR0cHM6Ly9hbGFuLnBl dGl0ZXBvbW1lLm5ldC9jd24vY3duLnJzcz4NCg0KW29ubGluZV0gPGh0dHA6Ly9saXN0cy5pZHls bC5vcmcvbGlzdGluZm8vY2FtbC1uZXdzLXdlZWtseS8+DQoNCltBbGFuIFNjaG1pdHRdIDxodHRw czovL2FsYW4ucGV0aXRlcG9tbWUubmV0Lz4NCg0K --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week<= /a> Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of December 28, 2021 to = January 04, 2022.

A hack for toplevel breakpoints using effect handlers

wiktor announced

I started playing with effect handlers and wondered if they could be used t= o implement toplevel breakpoints. It's a big hack and probably unsound at the moment, but it works and here's an exa= mple interaction:

let arr =3D
  let fact n =
=3D
    let arr =3D Array=
.make (n+1) 1 in<=
/span>
    let rec loop i =3D
      if i <=3D n then begin
        Break.break ["i", i; "arr", arr];
        arr.(i) <- arr.(i-1) * i;
        loop (i+1)
      end
    in
    (loop 1; arr)
  in
    fact 5;;
# (* We hit a breakpoint and obtain the continuation k *)
  k ();;
- : bool =3D true
# (* the bools are leaking from the execute_phrase function
   * inside the toplevel *)
  k ();;
- : bool =3D true
# i;;
- : int =3D 3
# arr;;
- : int array =3D [|1; 1; 2; 1; 1; 1|]
# (* let's disturb the computation of factorials *)
  arr.(i-1) <- 42;;
- : unit =3D ()
# k ();;
- : bool =3D true
# (* btw: here the user is like a scheduler for yield-based async *)
  k ();;
- : bool =3D true
# k ();;
val arr : int array =3D [|1; 1; 42; 126; 504; 2520|]
- : bool =3D true

Currently I don't try to clean up bindings or values, which is a source of = unsoundness. After the last k () we got two results: First the computation of let arr ... finished, an= d then the computation of k () finished. But k is a part of the execution of let arr ..., so these two execution= s "intersect" without one being contained in the other. This makes the question of what should the current variable bindings= be complicated. Setting the bindings at end of execution is futile, when a continuation may in such a way leak bind= ings from breakpoint time.

Possibly a stack discipline for the execution of phrases is required to mak= e the environments behave properly: at the end of executing a phrase we cancel (with another effect, maybe) other exec= utions which "depend" on the current execution (evaluate the k obtained from a breakpoint in the cu= rrent execution). This should eliminate these "intersections" and we could throw out the bindings added by the cancelled = executions.

I haven't tried anything with polymorphism yet, but type variables should p= robably be changed into abstract types inside the binders.

Here's the code: https://github.com/ocaml-multicore/ocaml/compa= re/multicore-pr...wiktorkuchta:toplevel-break

wiktor later said

Well, this might have been unnecessary, as most of it can be done properly = in userspace (with more syntactic overhead).

open EffectHandlers
open Deep

type ('a, 'b) res =3D
  | Bp of 'a * ((unit, ('a, 'b) res) continua=
tion)
  | Fin <=
span style=3D"color: #a020f0;">of 'b

module type P1 =3D sig  val i : int  val arr : int array end
type payload =3D P1 of=
 (module P1)
type _ eff +=3D Break : payload -> unit eff

let arr () =3D
  let fact n =
=3D
    let arr =3D Array=
.make (n+1) 1 in<=
/span>
    let rec loop i =3D
      if i <=3D n then begin
        perform (Break (P=
1 (module =
struct let i =3D i =
let arr =3D arr end)));
        arr.(i) <- arr.(i-1) * i;
        loop (i+1)
      end
    in
    (loop 1; arr)
  in
    fact 5;;

let with_break th =3D
  try_with (fun () -> Fin (th ())) ()
  { effc =3D fun (type a) (e : a eff<=
/span>) ->
      match e with
      | Break p -> Som=
e (fun (k : (a,_) continuation) -> Bp (p, k))
      | _ -> =
None }

let cont =3D functi=
on
  | Bp (_=
, k) -> continue k ()
  | Fin _=
 -> failwith "computation finished, cannot continue"

let get =3D functio=
n
  | Bp (r=
, _) -> r
  | Fin _=
 -> failwith "computation finished, no breakpoint payload"

let get1 r =
=3D match get r with P1 m -> m
# let r =3D with_break a=
rr;;
val r : (payload, int array) res =3D Bp (P1 <module>, <abstr>)
# open (val get1 r);;
val i : int =3D 1
val arr : int array =3D [|1; 1; 1; 1; 1; 1|]

The main pain point is having to define the payload types. In basic cases t= he payload type could be just a simple polymorphic variant. It would be nice if it could be completely inferred, b= ut it's unlikely as `Break` has to have a statically known argument.

With a bit of help from tooling (ppxes for code generation and shorthands i= n the toplevel), this could be better than printf debugging.

Guillaume Munch-Maccagnoni then said

This is an interesting experiment.

  • This reminds me of the idea of high-level stack inspection for debuggin= g and security (articulated for instance in Clements' PhD thesis Portable and high-level access to the stack with Continuati= on Marks; here's another more recent paper from the Racket people that might= be relevant). One can ask whether a PPX can provide high-level stack inspe= ction or if one needs support from the compiler for that. It's nice to expe= riment.
  • A few years ago someone asked whether there could be a use to untyped a= lgebraic effects in OCaml (in the sense that they do not appear in the effe= ct annotation in function types). I proposed debugging as an example. Someo= ne suggested that it is not too hard to adapt the interface types of all fu= nctions in the call chain to add the appropriate effect annotation (and rem= ove it afterwards), but I was not convinced.

Multi-shot continuations gone forever?

cyberpink asked

What happens with multi-shot continuations now that Obj.clone_continuation = was removed? (ht= tps://github.com/ocaml-multicore/ocaml-multicore/pull/651)

Anything that requires a "fork" operation, like say, a probabilistic progra= mming EDSL, needs this. None of the old examples I've looked at like Delimcc on top of effects have been updated to use a new method, and I haven't been able to find any hints of one.

Are multi-shot continuations just not possible now? Are there plans to add = something equivalent back in later?

Nicol=C3=A1s Ojeda B=C3=A4r replied

Yes, multi-shot continuations are gone and is unlikely that they will find = their way back any time soon. One (good) reason is explained in h= ttps://dl.acm.org/doi/10.1145/3434314 :

3D"8d26520ef0f7=

and

3D"b28fa14f9673=

Guillaume Munch-Maccagnoni then said

I think the question still stands. You cut the sentence =E2=80=9C_Extending= our system with multi-shot continuations is future work (=C2=A78)_=E2=80=9D. Also the paper is about a particular model= based on separation logic rather than OCaml itself (for instance the authors also mention that their continuations are affine = instead of linear unlike in OCaml multicore).

Nevertheless, the multicore designers were aware that duplicating continuat= ions makes it complicated to reason about resources. The topic of mixing continuations and linearity has been better = studied from the angle of algebraic models of computation and proof theory. Essentially, with an effect system you cou= ld ensure that certain kinds of effects do not happen in the delimited part of the program (including allocating a res= ource), which controls copiability of the stack from the point of view of reasoning about the program. This is inspir= ed by some logics that mix classical and intuitionistic or linear logic. From this angle the ability to copy a conti= nuation would be restricted to a sub-part of the language which is pure to some degree. This should also be a suitabl= e starting point if one wanted to develop a program logic to formalise the reasoning about such programs.

However according to #651 there were more technical reasons to drop clone_continuation, such as breaking compiler = optimizations. I am curious as well to know whether there are plans to reintroduce clone_continuation at some poin= t, but obviously this would require some effort.

KC Sivaramakrishnan said

@nojb and @gadmm have already answered why we've dropped support for = clone_continuation now. We will need to track the copiability of the continuation in the continuation type and compiler o= ptimisations also need to be made aware of the possibility of copying. Given the pervasive nature of its effects, ther= e are no immediate plans to bring the feature back. We will have to come back to this after we have typed effects.

Anything that requires a =E2=80=9Cfork=E2=80=9D operation, like say, a prob= abilistic programming EDSL

One can get pretty far with PPL with just one-shot continuations. My studen= t and I did some experiments building a DSL for a PPL to learn about the space: https://github.com/Arnhav-Datar/EffPPL. Having spoken t= o PPL experts there are indeed some usecases where multi-shot continuations are useful, but fro= m what I understand, the one-shotness isn't a blocker for PPL.

I would be interested in collecting usecases where multi-shot continuations= are absolutely necessary.

gasche then said

Interesting!

My (probably naive) mental model of HANSEI-style libraries, using multishot= continuations, is that they are extensions/generalization of a non-probabilistic "logic/non-deterministic m= onad" that searches for the set of solutions to a problem. Multishot continuations are naturally used in non-d= eterministic computations at backtracking points, to explore different search directions and collect the result. It i= s possible to avoid multishot continuations by replaying the whole search from the start each time (refer= ence: Capturing the future by = replaying the past), but this involves duplicated computations so it is less effi= cient (reference: Asymptotic speedup= with first-class control).

Can you give some intuition of how other approaches to probalistic inferenc= e work, that do not require multishot continuations? Are they also duplicating computations, or are they using a = magic trick to avoid this issue with a different inference algorithm?

I tried to find an answer to this question by reading the internship report, but I couldn't locate an answer. (The report mentions HANSEI in the related work, but it does not discuss this qu= estion.) The report explains that the inference algorithm, called HMC (Hamiltonian Monte Carlo), uses automatic d= ifferenciation; so it uses a sort of symbolic manipulation / analysis of the probabilistic program to sample. Bu= t does this avoid repeated computations? It may be the case instead that the differential is as large or larger than= the program itself, and that the search algorithm using this differential in effect perform a program-sized computa= tion at each search step, duplicating computations.

Sadiq said

Not a PPL but I've been hacking on a little effects-based model checker for= concurrent data structures that implements dynamic partial order reduction (https://github.com/sadiqj/dscheck/ - a WIP!). Multi-sho= t continuations would have been very useful.

I ended up implementing something that involves maintaining a schedule and = repeatedly replaying the computation. It looks very similar to what Cap= turing the future.. proposes.

New release of Menhir (20211230)

Fran=C3=A7ois Pottier announced

Dear OCaml & Menhir users,

I am pleased to announce a new release of Menhir, with a major improvement.

The code back-end has been rewritten from the ground up by =C3=89mile Troti= gnon and by myself, and now produces efficient and well-typed OCaml code. The infamous Obj.magic is not used any more.

Furthermore, the new code back-end produces code that is more aggressively optimized, leading to a significant reduction in memory allocation and a typical performance improvement of up to 20% compared to the previous code back-end.

opam update
opam install menhir.20211230

Happy well-typed parsing in 2022!

2021/12/30

  • The code back-end has been rewritten from the ground up by =C3=89mile Troti= gnon and Fran=C3=A7ois Pottier, and now produces efficient and well-typed= OCaml code. The infamous Obj.magic is not used any more.

    The table back-end and the Coq back-end are unaffected by this change.

    The main side effects of this change are as follows:

    • The code back-end now needs type information. This means that
      either Menhir's type inference mechanism must be enabled (the easiest way of enabling it is to use Menhir via dune and to check that the dune-project file says (using menhir 2.0) or later)
      or the type of every nonterminal symbol must be explicitly given via a %type declaration.
    • The code back-end no longer allows the type of any symbol to be an open polymorphic variant type, such as [> `A ]. As a workar= ound, we suggest using a closed polymorphic variant instead.
    • The code back-end now adheres to the simplified error-handling strat= egy, as opposed to the legacy strategy.

      For grammars that do not use the error token, this make= s no difference.

      For grammars that use the error token in the limited way permi= tted by the simplified strategy, this makes no difference either. The simplified strategy makes the following requirement: the error token shou= ld always appear at the end of a production, whose semantic action should abort the parser by raising an exception.

      Grammars that make more complex use of the error token, and th= erefore need the legacy strategy, cannot be compiled by the new code b= ack-end. As a workaround, it is possible to switch to the table back-end (using --table --strategy legacy) or to the ancient code back-end (us= ing --code-ancient). In the long run, we recommend abandoning t= he use of the error token. Support for the error token = may be removed entirely at some point in the future.

    The original code back-end, which has been around since the early days of Menhir (2005), temporarily remains available (using --code-ancient). It will be removed at some point in the future.

    The new code back-end offers several levels of optimization, which remain undocumented and are subject to change in the future. At present, the main levels are roughly as follows:

    • -O 0 --represent-everything uses a uniform representation = of the stack and produces straightforward code.
    • -O 0 uses a non-uniform representation of the stack; some = stack cells have fewer fields; some stack cells disappear altogether.
    • -O 1 reduces memory traffic by moving PUSH op= erations so that they meet POP operations and cancel out.
    • -O 2 optimizes the reduction of unit productions (that is,= productions whose right-hand side has length 1) by performing a limited amount of code specialization.

    The default level of optimization is the maximum level, -O 2.

  • The new command line switch --exn-carries-state causes the= exception Error to carry an integer parameter: exception Error of = int. When the parser detects a syntax error, the number of the current state is reported in this way. This allows the caller to select a suitable syntax error message, along the lines described in Sect= ion 11 of the manual. This command line switch is currently supported by the code back-end only.
  • The $syntaxerror keyword is no longer supported.
  • Document the trick of wrapping module aliases in open struct ... = end, like this: %{ open struct module alias M =3D MyLongModuleName end %}<= /code>. This allows you to use the short name M in your grammar, but f= orces OCaml to infer types that refer to the long name MyLongModuleName. (Suggested by Fr=C3=A9d=C3=A9ric Bour.)

Improved documentation for Fix

Fran=C3=A7ois Pottier announced

My last contribution for 2021 is an improved documentation for Fix, a libra= ry that helps with various algorithmic constructions that involve memoization, recursion, and numbering.

The documentation can be viewed online.

It can also be viewed locally (on your own machine) as follows:

opam update
opam install fix.20211231
opam install odig
odig odoc                 # this may take some time
odig doc fix              # this opens the doc in your browser

Happy fix'in' in 2022!

pp-binary-ints 0.1.1

Ifaz Kabir announced

Tired of printing octals and hexadecimals and then mentally converting them= to bits. Ever wanted to just see the bits in an int? Now you can!

Just run opam install pp-binary-ints and off you go:

# Pp_binary_in=
ts.Int.to_string 0b10101001;;
- : string =3D "10101001"

You can find the documentation for the project and more examples of how to = use it here.

The library is very customizable.

  • You can choose to print with 0b prefixes and _ separators.
  • You can choose to print zeros just like the non-zeros, with prefixes an= d separators.
  • If you use zero padding, you can control how many leading zeros show up= with the ~min_width argument.
  • It correctly handles the edge cases when adding _ separato= rs: you won=E2=80=99t get leading underscores.
  • It includes pretty printers that work with Format and Fmt , not just to_string functions.
  • Supports int, int32, int64, and = nativeint.
  • Don't like the default prefixes and suffixes? Customize the prefixes an= d suffixes with the provided functor.

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 <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

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

--=-=-=--