From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver= Authentication-Results: plum; dmarc=fail (p=none dis=none) header.from=polytechnique.org Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=O62izJf8; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=X/+R5u59; dkim-atps=neutral Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id 591BFB80123 for ; Tue, 19 Nov 2024 06:52:47 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=ZlO7QiOPr+uP+dE29eKxP7m8F2OErHASgDF0tL8VFtM=; b=O62izJf8UQ+caiXDi9rU8zue/6xuTAVQSnpiIuWJoYsn+t5o06sfNfY1 pnel2k4W1FjGOhGOy487raAUVibMLioHZcKONKU5k9rbR6PrxFkd8ldBm Uvbub2CBylFt2LSqCIYXhaPtBqDO4VRlxiqbH/f1qHzw3ZpgpVSOPrrjq Q=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (signature did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.12,165,1728943200"; d="scan'208,217";a="194557806" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 19 Nov 2024 07:52:47 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id 6341DE0D1E; Tue, 19 Nov 2024 07:52:47 +0100 (CET) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id CE5C7E00B7 for ; Tue, 19 Nov 2024 07:52:44 +0100 (CET) IronPort-SDR: 673c35a8_G0xHUB4LHrBTjpPRKmTstGWdS5olUXWQQbh2V41dyegJzve WhyVoyq6/3v6+ghDFf/ku83CDy4BbrmwnmEgY+Q== X-IPAS-Result: =?us-ascii?q?A0EEAwBvNTxngSIeaIFSCIJcAoE/gQMZAWNaMwcISAOEU?= =?us-ascii?q?4NPhS2IcoEWkDeISIIvgVaBJQMYFiMUAQMBDS4BDAYBAgQBAQMBAgGFAAIWi?= =?us-ascii?q?joCHwYBBDAJDgECBAEBAQEDAgMBAQEBAQEQAQEFAQEBAgEBAgQGAQIQAQE9B?= =?us-ascii?q?UmFew1JAQwBgW5RcWUJNwEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQIMATBuAQgKEwEBJhIYFA8DEAQBBgMCBA0BNQMBEwESG?= =?us-ascii?q?gGCZ4IfRQMEAQwGP5Q2mnoaN3qBMoEBggwBAQaBCD4CAQsCBQEOCSbaBoFkC?= =?us-ascii?q?YFIhWqCSBoBKkhqAoRGCYQzJw+BVUSBFYIoSgdvgj8EBwwLAQEBAQEXgR8FA?= =?us-ascii?q?QEIRQmDJYJpgkUtOhI4CYEsgTN2JU1Gg3OCbIENgW+CEIM0ElaBW4IggT8dH?= =?us-ascii?q?TNGgRJciSeBRyIDJjMyAVUTFwsHBWCBFgOBeYFNgTaBUUOCTkqFDIEFOYIRa?= =?us-ascii?q?Us3Ag0CNoIkJFmCT4NYgT+EbIRehCMdQAMLbT01FBufMwEJM2kBRoI6LQIKB?= =?us-ascii?q?B8fAgUQShQHCQUFAQUCDBYBAQQeDSUEBRQUBwUHAxUDAR0XAxgCASwLCwIrA?= =?us-ascii?q?pI/FBIWLAGdTpIQgUGBCjQHhB2BXQYMiQOBJI4th02EBE2BCosrhwCRI4ElI?= =?us-ascii?q?phVIoI0hyEDCoEbCYFtaokAjFIEEiOFHYFRFjqBKx4DCQczGjBDgmcJRhwPj?= =?us-ascii?q?ioZgnpegT6BJoF1O8ESQjUCAQEECikCBwEKAQEDCYVFHQEBZ4M4hTxrA10BA?= =?us-ascii?q?Q?= IronPort-PHdr: A9a23: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 l570A== IronPort-Data: A9a23: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 wSR IronPort-HdrOrdr: A9a23:QvOkW67bKmZ7sw25hAPXwPXXdLJyesId70hD6qkRc203TiX8ra qTdZsguyMc5Ax9ZJhCo7C90cu7IE80nKQdieIs1NyZMzUO1lHFEKhSqaPchxfgFyf9+uM179 YDT4FOTPvqAxxfhcb+iTPId+rILeP3lZyVuQ== X-Talos-CUID: =?us-ascii?q?9a23=3AltdFlGlFCjde6UWknfRQgnULpIPXOVyCxV7qKF+?= =?us-ascii?q?bM2dWRLuYSGGb6IQ+nfM7zg=3D=3D?= X-Talos-MUID: 9a23:H/1M1Avr5ZtAeU5gEc2ntBFHF/ts+P2VBEEDzsoMoZCULTRgNGLI X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.12,165,1728943200"; d="scan'208,217";a="101995294" X-MGA-submission: =?us-ascii?q?MDEmiCcnKuEAnwh231+Xi6/LqeMcTwUgg0GZSu?= =?us-ascii?q?sZOjbW15slQKvUiZfVZ3UErpZA8VoGzrE1fyX1JO43uM1XfWj5ylv4kZ?= =?us-ascii?q?fmjwWUY0u47IeCNt0cYRByMTqc1dr1Lybtn+l2DolcwNxOSQXbHrBWrM?= =?us-ascii?q?E/xrkenu/CdLnZ9aovltL4pg=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Nov 2024 07:52:24 +0100 Received: from TM.local (cust-east-par-46-193-107-66.cust.wifirst.net [46.193.107.66]) (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 E7221564ADC; Tue, 19 Nov 2024 07:52:22 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1731999143; bh=UN4hSkKEVYEOLl3WMkmtW8eNy5llFWZgS7vcxuf9QKw=; h=From:To:Subject:Date:Message-ID; b=X/+R5u59P5DSpp3/lDz9BKtLzbiin8HX//7GCuucZKlRrIMbLZT5Rnp4qlwtWMeKB 4R8ilWicDV8khUbvDXg8HrAH6L815e1+m9NyQY5XRQSS7ZzIxCCDM0lSYnKrcMWPYr J2jdkqUyOiBv+/1oqs7auimw4oijcACqipvsaS2Q= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 19 Nov 2024 07:52:22 +0100 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Nov 19 07:52:23 2024 +0100 (CET)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.498242, queueID=5C686564ADD 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: 19210 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 ZWsgb2YgTm92ZW1iZXIgMTIgdG8gMTksDQoyMDI0Lg0KDQpUYWJsZSBvZiBDb250ZW50cw0K4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCkJvdWxk ZXIgRGFzaCBpbiBPQ2FtbA0KSmFuZSBTdHJlZXQgT0NhbWwgZXh0ZW5zaW9ucyDigJMgbm93IHdp dGggZGV2ZWxvcGVyIHRvb2xpbmchDQpvcGFtIDIuMy4wIGlzIG91dCENCkluc3RhbGxpbmcgRGV2 ZWxvcGVyIFRvb2xzIHdpdGggRHVuZQ0KRHVuZSBEZXZlbG9wZXIgUHJldmlldyBVcGRhdGVzDQpG aXJzdCByZWxlYXNlIG9mIGNtZGxhbmcNCmZpbmRsaWItMS45LjgNClRlc3RvIDAuMS4wIC0gYSBu ZXcgdGVzdGluZyBmcmFtZXdvcmsgZm9yIE9DYW1sDQpPdGhlciBPQ2FtbCBOZXdzDQpPbGQgQ1dO DQoNCg0KQm91bGRlciBEYXNoIGluIE9DYW1sDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0 cHM6Ly9zeW1wYS5pbnJpYS5mci9zeW1wYS9hcmMvY2FtbC1saXN0LzIwMjQtMTEvbXNnMDAwMDcu aHRtbD4NCg0KDQpBbmRyZWFzIFJvc3NiZXJnIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSADQoNCiAgQm91bGRlciBEYXNoKCopIHdhcyBteSBmYXZvdXJpdGUgY29tcHV0ZXIgZ2FtZSBp biB0aGUgOC1iaXQgZXJhLCBmaXJzdA0KICByZWxlYXNlZCBvbiB0aGUgQXRhcmkgNDAwLzgwMCBp biAxOTg0LiBUaG91Z2ggSSBuZXZlciBvd25lZCBhbiA4LWJpdA0KICBtYWNoaW5lIG15c2VsZiwg SSBoYWQgZnJpZW5kcyB0aGF0IEkgYW5ub3llZCBlbm91Z2ggdG8gbGV0IG1lIHBsYXkgaXQNCiAg b24gdGhlaXJzLg0KDQogIEFzIGEgaG9tYWdlIHRvIGl0cyA0MHRoIGFubml2ZXJzYXJ5LCBJIHB1 dCB0b2dldGhlciBhIGZhaXJseSBmYWl0aGZ1bA0KICBjbG9uZSBvZiB0aGUgb3JpZ2luYWwgZ2Ft ZSwgaW1wbGVtZW50ZWQgaW4ganVzdCBhIGZldyAxMDAgbGluZXMgb2YNCiAgYmFyZSBPQ2FtbCwg d2l0aCBub3RoaW5nIGJ1dCB0aGUgaG9tZWx5IEdyYXBoaWNzIGxpYnJhcnkuICBJdCBzaG91bGQN CiAgcnVuIG9uIFdpbmRvd3MsIE1hYywgYW5kIExpbnV4LCB0aG91Z2ggSSB3YXMgdG9vIGxhenkg dG8gdGVzdCB0aGUNCiAgbGF0dGVyLg0KDQogIEZlYXR1cmVzOg0KICDigKIgRmFpdGhmdWwgb3Jp Z2luYWwgcGh5c2ljcywgZ3JhcGhpY3MsIGFuZCBhbmltYXRpb25zDQogIOKAoiBBdXRoZW50aWMg c2Nyb2xsaW5nIG1lY2hhbmljcyBjb21iaW5lZCB3aXRoIGR5bmFtaWMgd2luZG93IHJlc2l6aW5n DQogIOKAoiBBbGwgMjAgbGV2ZWxzLCBpbmNsdWRpbmcgaW50ZXJtaXNzaW9ucywgYW5kIDUgZGlm ZmljdWx0aWVzDQogIOKAoiBQYXVzZS1hbmQtZ28gbW9kZSBmb3IgcmVsYXhlZCBwbGF5aW5nDQoN CiAgSXQgaXMgb3Blbi1zb3VyY2UgaGVyZToNCg0KICA8aHR0cHM6Ly9naXRodWIuY29tL3Jvc3Ni ZXJnL2JvdWxkZXItZGFzaD4NCg0KICBFbmpveSENCg0KICAvQW5kcmVhcw0KDQogICgqKSA8aHR0 cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQm91bGRlcl9EYXNoXyh2aWRlb19nYW1lKT4gIkJv dWxkZXINCiAgICAgIERhc2giIGlzIGEgdHJhZGVtYXJrIG9mIEJCRyBFbnRlcnRhaW5tZW50DQoN Cg0KSmFuZSBTdHJlZXQgT0NhbWwgZXh0ZW5zaW9ucyDigJMgbm93IHdpdGggZGV2ZWxvcGVyIHRv b2xpbmchDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90 L2Fubi1qYW5lLXN0cmVldC1vY2FtbC1leHRlbnNpb25zLW5vdy13aXRoLWRldmVsb3Blci10b29s aW5nLzE1NTk3LzE+DQoNCg0KRGlhbmEgS2FsaW5pY2hlbmtvIGFubm91bmNlZA0K4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSGkgZXZlcnlvbmUhIFdlJ3ZlIGp1c3QgcmVsZWFzZWQg YSBuZXcgdmVyc2lvbiBvZiBvdXIgY29tcGlsZXINCiAgZXh0ZW5zaW9ucywgY29tcGxldGUgd2l0 aCBhbGwgb3VyIHBhY2thZ2VzIGFuZCBzdXBwb3J0IGZvciBkZXZlbG9wZXINCiAgdG9vbGluZywg aW5jbHVkaW5nIG9jYW1sZm9ybWF0LCBtZXJsaW4gYW5kIG9jYW1sLWxzcC1zZXJ2ZXIuIEdldCB0 aGUNCiAgaW5zdGFsbCBpbnN0cnVjdGlvbnMgYXQgb3VyIFtHaXRIdWJdLCBhbmQgZW5qb3kgdGhl IGV4cGVyaWVuY2UgaW4geW91cg0KICBmYXZvcml0ZSBlZGl0b3IgbGlrZSBWU0NvZGUsIEVtYWNz IG9yIFZpbS4NCg0KICBNb3JlIGRvY3VtZW50YXRpb24gY29taW5nIHNvb24gOnNsaWdodF9zbWls ZTouIFN0YXkgdHVuZWQgZm9yIGZ1dHVyZQ0KICByZWxlYXNlcyENCg0KDQpbR2l0SHViXQ0KPGh0 dHBzOi8vZ2l0aHViLmNvbS9qYW5lc3RyZWV0L29wYW0tcmVwb3NpdG9yeS90cmVlL3dpdGgtZXh0 ZW5zaW9ucz4NCg0KDQpvcGFtIDIuMy4wIGlzIG91dCENCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6IDxodHRwczovL2Rp c2N1c3Mub2NhbWwub3JnL3QvYW5uLW9wYW0tMi0zLTAtaXMtb3V0LzE1NjA5LzE+DQoNCg0KS2F0 ZSBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0K DQogIEhpIGV2ZXJ5b25lLA0KDQogIEFzIG1lbnRpb25lZCBpbiBbb3VyIHRhbGsgYXQgdGhlIE9D YW1sIFdvcmtzaG9wIDIwMjRdLCB3ZSBkZWNpZGVkIHRvDQogIHN3aXRjaCB0byBhIHRpbWUtYmFz ZWQgcmVsZWFzZSBjeWNsZSAoZXZlcnkgNiBtb250aHMpLCBzdGFydGluZyB3aXRoDQogIG9wYW0g Mi4zLg0KDQogIEFzIHByb21pc2VkLCB3ZSBhcmUgaGFwcHkgdG8gYW5ub3VuY2UgdGhlIGZpbmFs IHJlbGVhc2Ugb2Ygb3BhbSAyLjMuMC4NCg0KDQpbb3VyIHRhbGsgYXQgdGhlIE9DYW1sIFdvcmtz aG9wIDIwMjRdDQo8aHR0cHM6Ly9pY2ZwMjQuc2lncGxhbi5vcmcvZGV0YWlscy9vY2FtbC0yMDI0 LXBhcGVycy8xMC9PcGFtLTItMi1hbmQtYmV5b25kPg0KDQpXaGF04oCZcyBuZXc/DQrilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICDigKIgV2hlbiBsb2FkaW5nIGEgcmVwb3Np dG9yeSwgKm9wYW0gbm93IGlnbm9yZXMgZmlsZXMgaW4gcGFja2FnZXPigJkNCiAgICBmaWxlcy8g ZGlyZWN0b3JpZXMgd2hpY2ggYXJlbuKAmXQgbGlzdGVkIGluIHRoZSBleHRyYS1maWxlcyBmaWVs ZCogb2YNCiAgICB0aGUgb3BhbSBmaWxlLiA6d2FybmluZzogSWYgeW91IG1haW50YWluIGFuIG9w YW0gcmVwb3NpdG9yeSwgcGxlYXNlDQogICAgcmVhZCBvdXIgW2Jsb2cgcG9zdF0gdG8gbWFrZSBz dXJlIHlvdXIgcmVwb3NpdG9yeSBzdGF5cyBjb21wYXRpYmxlLg0KICDigKIgKlBhY2thZ2VzIHJl cXVpcmluZyBhbiB1bnN1cHBvcnRlZCB2ZXJzaW9uIG9mIG9wYW0gYXJlIG5vdyBtYXJrZWQNCiAg ICAgdW5hdmFpbGFibGUqLCBpbnN0ZWFkIG9mIGNhdXNpbmcgYSByZXBvc2l0b3J5IGVycm9yLiBU aGlzIG1lYW5zIGFuDQogICAgIG9wYW0gcmVwb3NpdG9yeSBjYW4gbm93IGFsbG93IHNtb290aGVy IHVwZ3JhZGUgaW4gdGhlIGZ1dHVyZQ0KICDigKIgKm9wYW0gbGlzdCDigJNsYXRlc3RzLW9ubHkq OiBhIG5ldyBvcHRpb24gdG8gbGlzdCBvbmx5IHRoZSBsYXRlc3QNCiAgICAgdmVyc2lvbnMgb2Yg cGFja2FnZXMNCiAg4oCiICrigJN2ZXJib3NlLW9uKjogYSBuZXcgb3B0aW9uIHRvIGVuYWJsZSB2 ZXJib3NlIG91dHB1dCBmb3Igc3BlY2lmaWVkDQogICAgICBwYWNrYWdlIG5hbWVzLg0KICDigKIg Km9wYW0gc3dpdGNoIGltcG9ydCDigJNkZXBzLW9ubHkqOiBhIG5ldyBvcHRpb24gdG8gaW5zdGFs bCBvbmx5IHRoZQ0KICAgICBkZXBlbmRlbmNpZXMgb2YgdGhlIHJvb3QgcGFja2FnZXMgbGlzdGVk IGluIHRoZSBvcGFtIHN3aXRjaCBleHBvcnQNCiAgICAgZmlsZQ0KICDigKIgKm9wYW0gc3dpdGNo IGxpc3QtYXZhaWxhYmxlKiBubyBsb25nZXIgZGlzcGxheXMgY29tcGlsZXJzIGZsYWdnZWQNCiAg ICAgd2l0aCBgYXZvaWQtdmVyc2lvbn4vfmRlcHJlY2F0ZWQnIHVubGVzcyBgLS1hbGwnIGlzIGdp dmVuLCBtZWFuaW5nDQogICAgIHRoYXQgcHJlLXJlbGVhc2Ugb3IgdW5yZWxlYXNlZCBPQ2FtbCBw YWNrYWdlcyBubyBsb25nZXIgYXBwZWFyIHRvDQogICAgIGJlIHRoZSBsYXRlc3QgdmVyc2lvbg0K ICDigKIgKlRoZSBidWlsdGluLTBpbnN0YWxsIHNvbHZlciB3YXMgaW1wcm92ZWQqIGFuZCBzaG91 bGQgbm93IGJlIGNhcGFibGUNCiAgICAgb2YgYmVpbmcgeW91ciBkZWZhdWx0IHNvbHZlciBpbnN0 ZWFkIG9mIGBidWlsdGluLW1jY3MrZ2xwaycuIElmIHlvdQ0KICAgICB3aXNoIHRvIGdpdmUgaXQg YSB0cnksIHNpbXBseSBjYWxsaW5nIGBvcGFtIG9wdGlvbg0KICAgICBzb2x2ZXI9YnVpbHRpbi0w aW5zdGFsbCcgKGNhbGwgYG9wYW0gb3B0aW9uIHNvbHZlcj0nIHJlc3RvcmVzIHRoZQ0KICAgICBk ZWZhdWx0KQ0KICDigKIgTW9zdCBvZiB0aGUgKnVuaGVscGZ1bCBjb25mbGljdCBtZXNzYWdlcyB3 ZXJlIGZpeGVkKiA6Zmxhc2hsaWdodDoNCiAg4oCiICpGaXggdGhlIGludGVybmFsIGNhY2hlIG9m IGluc3RhbGxlZCBwYWNrYWdlcyosIHdoaWNoIHdhcyBzdG9yaW5nDQogICAgIHRoZSB3cm9uZyB2 ZXJzaW9uIG9mIHRoZSBvcGFtIGZpbGUgYWZ0ZXIgYSBidWlsZCBmYWlsdXJlLiAoWyM2MjEzXSkN Cg0KICBWYXJpb3VzIHBlcmZvcm1hbmNlIGFuZCBvdGhlciBpbXByb3ZlbWVudHMgd2VyZSBtYWRl IGFuZCBidWdzIHdlcmUNCiAgZml4ZWQuDQoNCiAgOm9wZW5fYm9vazogWW91IGNhbiByZWFkIG91 ciBbYmxvZyBwb3N0XSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dA0KICB0aGVzZSBjaGFuZ2Vz IGFuZCBtb3JlLCBhbmQgZm9yIGV2ZW4gbW9yZSBkZXRhaWxzIHlvdSBjYW4gdGFrZSBhIGxvb2sN CiAgYXQgdGhlIFtyZWxlYXNlIG5vdGVdIG9yIHRoZSBbY2hhbmdlbG9nXS4NCg0KDQpbYmxvZyBw b3N0XSA8aHR0cHM6Ly9vcGFtLm9jYW1sLm9yZy9ibG9nL29wYW0tMi0zLTAvPg0KDQpbIzYyMTNd IDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb3BhbS9wdWxsLzYyMTM+DQoNCltyZWxlYXNlIG5v dGVdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb3BhbS9yZWxlYXNlcy90YWcvMi4zLjA+DQoN CltjaGFuZ2Vsb2ddIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb3BhbS9ibG9iLzIuMy4wL0NI QU5HRVM+DQoNCg0KVHJ5IGl0IQ0K4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgVGhlIHVwZ3Jh ZGUgaW5zdHJ1Y3Rpb25zIGFyZSB1bmNoYW5nZWQ6DQoNCiAgRm9yIFVuaXggc3lzdGVtcw0KICDi lIzilIDilIDilIDilIANCiAg4pSCIGJhc2ggLWMgInNoIDwoY3VybCAtZnNTTCBodHRwczovL29w YW0ub2NhbWwub3JnL2luc3RhbGwuc2gpIg0KICDilJTilIDilIDilIDilIANCiAgb3IgZnJvbSBQ b3dlclNoZWxsIGZvciBXaW5kb3dzIHN5c3RlbXMNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBJ bnZva2UtRXhwcmVzc2lvbiAiJiB7ICQoSW52b2tlLVJlc3RNZXRob2QgaHR0cHM6Ly9vcGFtLm9j YW1sLm9yZy9pbnN0YWxsLnBzMSkgfSINCiAg4pSU4pSA4pSA4pSA4pSADQogIFBsZWFzZSByZXBv cnQgYW55IGlzc3VlcyB0byB0aGUgW2J1Zy10cmFja2VyXS4NCg0KDQpbYnVnLXRyYWNrZXJdIDxo dHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb3BhbS9pc3N1ZXM+DQoNCg0KSW5zdGFsbGluZyBEZXZl bG9wZXIgVG9vbHMgd2l0aCBEdW5lDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1s Lm9yZy90L2luc3RhbGxpbmctZGV2ZWxvcGVyLXRvb2xzLXdpdGgtZHVuZS8xNTYxMi8xPg0KDQoN ClN0ZXZlIFNoZXJyYXR0IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgRHVuZSBjYW4g aW5zdGFsbCBhbmQgcnVuIGRldmVsb3BlciB0b29scyBpbiB0aGUgY29udGV4dCBvZiBhDQogIHBy b2plY3QuIFRoaXMgZmVhdHVyZSBpcyBhdmFpbGFibGUgaW4gdGhlIFtEdW5lIERldmVsb3BlciBQ cmV2aWV3XSBhbmQNCiAgaW4gdGhlIHVwY29taW5nIHJlbGVhc2Ugb2YgRHVuZSAzLjE3LiBBcyB3 aXRoIGFsbCBvZiBEdW5lJ3MgcGFja2FnZQ0KICBtYW5hZ2VtZW50IGZlYXR1cmVzLCBjb25zaWRl ciB0aGlzIGZlYXR1cmUgdG8gYmUgdW5zdGFibGUgYXMgaXRzIFVJDQogIGFuZCBzZW1hbnRpY3Mg bWF5IGNoYW5nZSB3aXRob3V0IG5vdGljZS4NCg0KICBUaGUgY3VycmVudGx5IHN1cHBvcnRlZCB0 b29scyBhcmUgYG9jYW1sbHNwJyBhbmQgYG9jYW1sZm9ybWF0Jy4gRHVuZQ0KICBoYXMgYSBuZXcg Y29tbWFuZCBgZHVuZSB0b29scyBleGVjIDxUT09MPiAtLSBbQVJHU10uLi4nIHdoaWNoDQogIGRv d25sb2FkcyBhbmQgaW5zdGFsbHMgdGhlIGdpdmVuIHRvb2wsIGFuZCB0aGVuIHJ1bnMgaXQgd2l0 aCB0aGUgZ2l2ZW4NCiAgYXJndW1lbnRzIChub3RlIHRoZSBgLS0nIHdoaWNoIHNlcGFyYXRlcyBh cmd1bWVudHMgdG8gYGR1bmUnIGZyb20NCiAgYXJndW1lbnRzIHRvIHRoZSB0b29sKS4gVG9vbHMg YXJlIGluc3RhbGxlZCBsb2NhbGx5IHRvIHRoZSBwcm9qZWN0LCBpbg0KICBpdHMgYF9idWlsZCcg ZGlyZWN0b3J5LCB3aGljaCBtYWtlcyBpdCBlYXN5IHRvIHVzZSBkaWZmZXJlbnQgdmVyc2lvbnMN CiAgb2YgYSB0b29sIGluIGRpZmZlcmVudCBwcm9qZWN0cy4gQW4gdW5mb3J0dW5hdGUgY29uc2Vx dWVuY2Ugb2YNCiAgaW5zdGFsbGluZyB0b29scyBpbnRvIGBfYnVpbGQnIGlzIHRoYXQgZm9yIHRo ZSB0aW1lIGJlaW5nIGFsbCB0b29scw0KICBhcmUgdW5pbnN0YWxsZWQgd2hlbmV2ZXIgYGR1bmUg Y2xlYW4nIGlzIHJ1bi4NCg0KICBMZXQncyBzZWUgaXQgaW4gYWN0aW9uOg0KICDilIzilIDilIDi lIDilIANCiAg4pSCICQgZHVuZSB0b29scyBleGVjIG9jYW1sZm9ybWF0IC0tIC0tdmVyc2lvbg0K ICDilIIgU29sdXRpb24gZm9yIGRldi10b29scy5sb2Nrcy9vY2FtbGZvcm1hdDoNCiAg4pSCIC0g b2NhbWxmb3JtYXQuMC4yNi4yK2JpbmFyeS1vY2FtbC01LjIuMC1idWlsdC0yMDI0LTExLTA3LjAt eDg2XzY0LXVua25vd24tbGludXgtbXVzbA0KICDilIIgICAgIEJ1aWxkaW5nIG9jYW1sZm9ybWF0 LjAuMjYuMitiaW5hcnktb2NhbWwtNS4yLjAtYnVpbHQtMjAyNC0xMS0wNy4wLXg4Nl82NC11bmtu b3duLWxpbnV4LW11c2wNCiAg4pSCICAgICAgUnVubmluZyAnb2NhbWxmb3JtYXQgLS12ZXJzaW9u Jw0KICDilIIgMC4yNi4yDQogIOKUlOKUgOKUgOKUgOKUgA0KDQoNCltEdW5lIERldmVsb3BlciBQ cmV2aWV3XSA8aHR0cHM6Ly9wcmV2aWV3LmR1bmUuYnVpbGQvPg0KDQpQcmVjb21waWxlZCBCaW5h cmllcw0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWMDQoNCiAgTm90ZSB0aGF0IGluIHRoZSBleGFtcGxlIGFib3ZlLCBEdW5lJ3MgcGFj a2FnZSBzb2x2ZXIgY2hvc2UgdG8gaW5zdGFsbA0KICB2ZXJzaW9uDQogIGAwLjI2LjIrYmluYXJ5 LW9jYW1sLTUuMi4wLWJ1aWx0LTIwMjQtMTEtMDcuMC14ODZfNjQtdW5rbm93bi1saW51eC1tdXNs Jw0KICBvZiBgb2NhbWxmb3JtYXQnLiBUaGlzIHBhY2thZ2VzIGNvbWVzIGZyb20gYSBuZXcgW3Jl cG9zaXRvcnkgb2YgYmluYXJ5DQogIHBhY2thZ2VzXSBjb250YWluaW5nIHByZS1idWlsdCBleGVj dXRhYmxlcyBmb3IgYSBzZWxlY3QgZmV3IE9wYW0NCiAgcGFja2FnZXMuIER1bmUgd2lsbCBzZWFy Y2ggdGhpcyByZXBvc2l0b3J5IGluIGFkZGl0aW9uIHRvIHRoZSBkZWZhdWx0DQogIHJlcG9zaXRv cmllcyB3aGVuIHNvbHZpbmcgcGFja2FnZXMgZm9yIHRvb2xzIG9ubHkgKGlmIGEgcHJvamVjdCBo YXMNCiAgYG9jYW1sZm9ybWF0JyBpbiBpdHMgZGVwZW5kZW5jaWVzLCB0aGUgYmluYXJ5IHJlcG9z aXRvcnkgd29uJ3QgYmUNCiAgc2VhcmNoZWQgd2hpbGUgc29sdmluZyB0aGUgcHJvamVjdCdzIGRl cGVuZGVuY2llcykuDQoNCiAgVGhlIGdvYWwgb2YgdGhlIGJpbmFyeSByZXBvc2l0b3J5IGlzIHRv IHJlZHVjZSB0aGUgdGltZSBpdCB0YWtlcyB0bw0KICBnZXQgc3RhcnRlZCB3b3JraW5nIG9uIGEg bmV3IHByb2plY3QuIFdpdGhvdXQgaXQsIER1bmUgd291bGQgbmVlZCB0bw0KICBidWlsZCBgb2Nh bWxmb3JtYXQnIGZyb20gc291cmNlIGFsb25nIHdpdGggYWxsIG9mIGl0cyBkZXBlbmRlbmNpZXMs DQogIHdoaWNoIGNhbiB0YWtlIHNldmVyYWwgbWludXRlcy4NCg0KICBGb3Igbm93IG9ubHkgYSBz bWFsbCBudW1iZXIgb2YgcGFja2FnZSB2ZXJzaW9ucyBhcmUgY29udGFpbmVkIGluIHRoZQ0KICBi aW5hcnkgcmVwb3NpdG9yeS4gVG8gZGVtb25zdHJhdGUsIGhlcmUncyB3aGF0IGhhcHBlbnMgaWYg d2UgcnVuIGBkdW5lDQogIHRvb2xzIGV4ZWMgb2NhbWxmb3JtYXQnIGluIGEgcHJvamVjdCB3aXRo IGB2ZXJzaW9uPTAuMjYuMScgaW4gaXRzDQogIGAub2NhbWxmb3JtYXQnIGZpbGU6DQogIOKUjOKU gOKUgOKUgOKUgA0KICDilIIgICQgZHVuZSB0b29scyBleGVjIG9jYW1sZm9ybWF0IC0tIC0tdmVy c2lvbg0KICDilIIgU29sdXRpb24gZm9yIGRldi10b29scy5sb2Nrcy9vY2FtbGZvcm1hdDoNCiAg 4pSCIC0gYXN0cmluZy4wLjguNQ0KICDilIIgLSBiYXNlLnYwLjE3LjENCiAg4pSCIC0gYmFzZS1i eXRlcy5iYXNlDQogIOKUgiAtIGJhc2UtdW5peC5iYXNlDQogIOKUgiAtIGNhbWxwLXN0cmVhbXMu NS4wLjENCiAg4pSCIC0gY21kbGluZXIuMS4zLjANCiAg4pSCIC4uLg0KICDilIIgLSBvY2FtbGZv cm1hdC4wLjI2LjENCiAg4pSCIC4uLg0KICDilIIgICAgIEJ1aWxkaW5nIGJhc2UtdW5peC5iYXNl DQogIOKUgiAgICAgQnVpbGRpbmcgb2NhbWwtYmFzZS1jb21waWxlci41LjEuMQ0KICDilIIgICAg IEJ1aWxkaW5nIG9jYW1sLWNvbmZpZy4zDQogIOKUgiAgICAgQnVpbGRpbmcgb2NhbWwuNS4xLjEN CiAg4pSCICAgICBCdWlsZGluZyBzZXEuYmFzZQ0KICDilIIgICAgIEJ1aWxkaW5nIGNtZGxpbmVy LjEuMy4wDQogIOKUgiAuLi4NCiAg4pSCICAgICBCdWlsZGluZyBvY2FtbGZvcm1hdC4wLjI2LjEN CiAg4pSCICAgICAgUnVubmluZyAnb2NhbWxmb3JtYXQgLS12ZXJzaW9uJw0KICDilIIgMC4yNi4x DQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIER1bmUgcGFyc2VzIGAub2NhbWxmb3JtYXQnIHRvIGRl dGVybWluZSB3aGljaCB2ZXJzaW9uIG9mIGBvY2FtbGZvcm1hdCcNCiAgdG8gaW5zdGFsbCwgYW5k IGAwLjI2LjEnIGlzIG5vdCBpbiB0aGUgYmluYXJ5IHJlcG8gc28gaXQgbmVlZGVkIHRvIGJlDQog IGJ1aWx0IGZyb20gc291cmNlLg0KDQogIElmIHlvdXIgcHJvamVjdCByZXF1aXJlcyBhIHZlcnNp b24gb2YgYSBwYWNrYWdlIG5vdCBhdmFpbGFibGUgaW4gdGhlDQogIGJpbmFyeSByZXBvc2l0b3J5 LCBvciB5b3UncmUgb24gYW4gb3BlcmF0aW5nIHN5c3RlbSBvciBhcmNoaXRlY3R1cmUNCiAgZm9y IHdoaWNoIG5vIGJpbmFyeSB2ZXJzaW9uIG9mIGEgcGFja2FnZSBleGlzdHMsIHRoZSBwYWNrYWdl IHdpbGwgYmUNCiAgYnVpbHQgZnJvbSBzb3VyY2UgaW5zdGVhZC4gQ3VycmVudGx5IHRoZSBiaW5h cnkgcmVwb3NpdG9yeSBjb250YWlucw0KICBiaW5hcmllcyBvZiBgb2NhbWxmb3JtYXQuMC4yNi4y JywgYG9jYW1sLWxzcC1zZXJ2ZXIuMS4xOC4wJyBhbmQNCiAgYG9jYW1sLWxzcC1zZXJ2ZXIuMS4x OS4wJyBmb3IgYHg4Nl82NC11bmtub3duLWxpbnV4LW11c2wnLA0KICBgeDg2XzY0LWFwcGxlLWRh cndpbicgYW5kIGBhYXJjaDY0LWFwcGxlLWRhcndpbicuDQoNCiAgTm90ZSB0aGF0IExpbnV4IGJp bmFyaWVzIGFyZSBzdGF0aWNhbGx5IGxpbmtlZCB3aXRoIG11c2xjIHNvIHRoZXkNCiAgc2hvdWxk IHdvcmsgb24gYWxsIGRpc3Ryb3MgcmVnYXJkbGVzcyBvZiBkeW5hbWljIGxpbmtlci4NCg0KDQpb cmVwb3NpdG9yeSBvZiBiaW5hcnkgcGFja2FnZXNdDQo8aHR0cHM6Ly9naXRodWIuY29tL29jYW1s LWR1bmUvb2NhbWwtYmluYXJ5LXBhY2thZ2VzPg0KDQoNClJ1bm5pbmcgYG9jYW1sbHNwJw0K4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAg VGhlIHByb2dyYW0gYG9jYW1sbHNwJyBmcm9tIHRoZSBwYWNrYWdlIGBvY2FtbC1sc3Atc2VydmVy JyBhbmFseXplcw0KICBPQ2FtbCBjb2RlIGFuZCBzZW5kcyBpbmZvcm1hdGlvbiB0byB0ZXh0IGVk aXRvcnMgdXNpbmcgdGhlIFtMYW5ndWFnZQ0KICBTZXJ2ZXIgUHJvdG9jb2xdLiBUaGUgdG9vbCBp cyBjcnVjaWFsIHRvIE9DYW1sJ3MgZWRpdG9yIGludGVncmF0aW9uDQogIGFuZCBpdCBoYXMgYSBj b3VwbGUgb2YgcXVpcmtzIHRoYXQgYXJlIHdvcnRoIG1lbnRpb25pbmcgaGVyZS4NCg0KICBUTDtE UjogSW5zdGFsbCBEdW5lIHdpdGggdGhlIGluc3RhbGwgc2NyaXB0IG9uIHRoZSBbRGV2ZWxvcGVy IFByZXZpZXcNCiAgcGFnZV0gYW5kIHlvdSdsbCBnZXQgYW4gW2BvY2FtbGxzcCcgc2hlbGwgc2Ny aXB0XSB0aGF0IHdpbGwgaW5zdGFsbA0KICBhbmQgcnVuIHRoZSBjb3JyZWN0IHZlcnNpb24gb2Yg YG9jYW1sbHNwJyBmb3IgeW91ciBwcm9qZWN0Lg0KDQogIEZpcnN0bHkgdGhlIGBvY2FtbGxzcCcg ZXhlY3V0YWJsZSBjYW4gb25seSBhbmFseXplIGNvZGUgdGhhdCBoYXMgYmVlbg0KICBjb21waWxl ZCB3aXRoIHRoZSBzYW1lIHZlcnNpb24gb2YgdGhlIE9DYW1sIGNvbXBpbGVyIGFzIHdhcyB1c2Vk IHRvDQogIGNvbXBpbGUgdGhlIGBvY2FtbGxzcCcgZXhlY3V0YWJsZSBpdHNlbGYuIERpZmZlcmVu dCB2ZXJzaW9ucyBvZiB0aGUNCiAgYG9jYW1sLWxzcC1zZXJ2ZXInIHBhY2thZ2UgYXJlIGluY29t cGF0aWJsZSB3aXRoIHNvbWUgdmVyc2lvbnMgb2YgdGhlDQogIE9DYW1sIGNvbXBpbGVyIChlLmcu IGBvY2FtbC1sc3Atc2VydmVyLjEuMTkuMCcgbXVzdCBiZSBidWlsdCB3aXRoIGF0DQogIGxlYXN0 IGA1LjIuMCcgb2YgdGhlIGNvbXBpbGVyKS4gVGhpcyBtZWFucyB0aGF0IHdoZW4gRHVuZSBpcyBj aG9vc2luZw0KICB3aGljaCB2ZXJzaW9uIG9mIGBvY2FtbC1sc3Atc2VydmVyJyB0byBpbnN0YWxs IGl0IG5lZWRzIHRvIGtub3cgd2hpY2gNCiAgdmVyc2lvbiBvZiB0aGUgY29tcGlsZXIgeW91ciBw cm9qZWN0IGlzIHVzaW5nLiBUaGlzIGlzIG9ubHkga25vd24NCiAgYWZ0ZXIgdGhlIHByb2plY3Qg aGFzIGJlZW4gbG9ja2VkIChieSBydW5uaW5nIGBkdW5lIHBrZyBsb2NrJyksIHNvDQogIER1bmUg d2lsbCByZWZ1c2UgdG8gaW5zdGFsbCBgb2NhbWxsc3AnIGluIGEgcHJvamVjdCB0aGF0IGRvZXNu J3QgaGF2ZQ0KICBhIGxvY2sgZGlyZWN0b3J5IG9yIGZvciBhIHByb2plY3QgdGhhdCBkb2Vzbid0 IGRlcGVuZCBvbiB0aGUgT0NhbWwNCiAgY29tcGlsZXIuDQoNCiAg4pSM4pSA4pSA4pSA4pSADQog IOKUgiAkIGR1bmUgdG9vbHMgZXhlYyBvY2FtbGxzcA0KICDilIIgRXJyb3I6IFVuYWJsZSB0byBs b2FkIHRoZSBsb2NrZGlyIGZvciB0aGUgZGVmYXVsdCBidWlsZCBjb250ZXh0Lg0KICDilIIgSGlu dDogVHJ5IHJ1bm5pbmcgJ2R1bmUgcGtnIGxvY2snDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIFRo ZSBgb2NhbWwtbHNwLXNlcnZlcicgcGFja2FnZXMgaW4gdGhlIFtiaW5hcnkgcmVwb3NpdG9yeV0g Y29udGFpbg0KICBtZXRhZGF0YSB0byBlbnN1cmUgdGhhdCB0aGUgYG9jYW1sbHNwJyBleGVjdXRh YmxlIHRoYXQgZ2V0cyBpbnN0YWxsZWQNCiAgd2FzIGJ1aWx0IHdpdGggdGhlIHNhbWUgdmVyc2lv biBvZiB0aGUgY29tcGlsZXIgYXMgeW91ciBwcm9qZWN0LiBGb3INCiAgZXhhbXBsZSB0aGUgYG9j YW1sLWxzcC1zZXJ2ZXInIHBhY2thZ2UgYnVpbHQgd2l0aCBgb2NhbWwuNS4yLjAnDQogIGNvbnRh aW5zIHRoaXMgbGluZToNCg0KICDilIzilIDilIDilIDilIANCiAg4pSCIGNvbmZsaWN0czogIm9j YW1sIiB7IT0gIjUuMi4wIn0NCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgVGhpcyBwcmV2ZW50cyBp dCBmcm9tIGJlaW5nIGNob3NlbiBpZiB0aGUgcHJvamVjdCBkZXBlbmRzIG9uIGFueQ0KICB2ZXJz aW9uIG9mIHRoZSBjb21waWxlciBvdGhlciB0aGFuIGA1LjIuMCcuDQoNCiAgQW5vdGhlciBxdWly ayBpcyB0aGF0IGBvY2FtbGxzcCcgd2lsbCB0cnkgdG8gaW52b2tlIHRoZSBiaW5hcmllcw0KICBg b2NhbWxmb3JtYXQnIGFuZCBgb2NhbWxmb3JtYXQtcnBjJywgYm90aCBmb3VuZCBpbiB0aGUgYG9j YW1sZm9ybWF0Jw0KICBwYWNrYWdlLiBUaGUgYG9jYW1sLWxzcC1zZXJ2ZXInIHBhY2thZ2UgZG9l c24ndCBkZXBlbmQgb24NCiAgYG9jYW1sZm9ybWF0JyBhcyB0aGUgc3BlY2lmaWMgdmVyc2lvbiBv ZiBgb2NhbWxmb3JtYXQnIG5lZWRlZCBieSBhDQogIHByb2plY3QgaXMgaW1wbGllZCBieSB0aGUg cHJvamVjdCdzIGAub2NhbWxmb3JtYXQnIGZpbGUsIHdoaWNoIHBhY2thZ2UNCiAgbWFuYWdlcnMg ZG9uJ3QgY29uc2lkZXIgd2hlbiBzb2x2aW5nIGRlcGVuZGVuY2llcy4gVGhpcyBtZWFucyB0aGF0 IGluDQogIGdlbmVyYWwgKHdoZXRoZXIgdXNpbmcgRHVuZSBvciBPcGFtIGZvciBwYWNrYWdlIG1h bmFnZW1lbnQpIGl0J3MgdXAgdG8NCiAgdGhlIHVzZXIgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGNv cnJlY3QgdmVyc2lvbiBvZiBgb2NhbWxmb3JtYXQnIGlzDQogIGluc3RhbGxlZCBpbiBvcmRlciB0 byB1c2UgdGhlIGZvcm1hdHRpbmcgZmVhdHVyZXMgb2YgYG9jYW1sbHNwJy4NCg0KICBPdGhlcndp c2UgZXhwZWN0IHRoaXMgZXJyb3IgaW4geW91ciBlZGl0b3I6DQogIOKUjOKUgOKUgOKUgOKUgA0K ICDilIIgVW5hYmxlIHRvIGZpbmQgJ29jYW1sZm9ybWF0LXJwYycgYmluYXJ5LiBUeXBlcyBvbiBo b3ZlciBtYXkgbm90IGJlIHdlbGwtZm9ybWF0dGVkLiBZb3UgbmVlZCB0byBpbnN0YWxsIGVpdGhl ciAnb2NhbWxmb3JtYXQnIG9mIHZlcnNpb24gPiAwLjIxLjAgb3IsIG90aGVyd2lzZSwgJ29jYW1s Zm9ybWF0LXJwYycgcGFja2FnZS4NCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgRXZlbiBpZiBgb2Nh bWxsc3AnIGFuZCBgb2NhbWxmb3JtYXQnIGFyZSBib3RoIGluc3RhbGxlZCBieSBEdW5lLCBpZg0K ICB5b3UgcnVuIGBkdW5lIHRvb2xzIGV4ZWMgb2NhbWxsc3AnIHlvdSB3aWxsIGZpbmQgdGhhdCBg b2NhbWxsc3AnIHN0aWxsDQogIGNhbid0IGZpbmQgdGhlIGBvY2FtbGZvcm1hdCcgb3IgYG9jYW1s Zm9ybWF0LXJwYycgZXhlY3V0YWJsZXMuIFRoaXMgaXMNCiAgYmVjYXVzZSB1bmxpa2UgT3BhbSwg RHVuZSBkb2VzIG5vdCBpbnN0YWxsIHRvb2xzIGludG8geW91ciBgJFBBVEgnLA0KICBhbmQgZm9y IHRoZSBzYWtlIG9mIHNpbXBsaWNpdHksIHRoZSBgZHVuZSB0b29scyBleGVjIDxUT09MPicgY29t bWFuZA0KICBkb2VzIG5vdCBtb2RpZnkgdGhlIGVudmlyb25tZW50IG9mIHRoZSB0b29sIGl0IGxh dW5jaGVzLiBUaGlzIGNhbiBiZQ0KICBmaXhlZCBieSBhZGRpbmcNCiAgYF9idWlsZC9fcHJpdmF0 ZS9kZWZhdWx0Ly5kZXYtdG9vbC9vY2FtbGZvcm1hdC9vY2FtbGZvcm1hdC90YXJnZXQvYmluJw0K ICAodGhlIGRpcmVjdG9yeSBjb250YWluaW5nIGBvY2FtbGZvcm1hdCcgYW5kIGBvY2FtbGZvcm1h dC1ycGMnIHdoZW4NCiAgYG9jYW1sZm9ybWF0JyBpcyBpbnN0YWxsZWQgYnkgZHVuZSkgdG8gdGhl IHN0YXJ0IG9mIHlvdXIgYCRQQVRIJw0KICB2YXJpYWJsZSBiZWZvcmUgcnVubmluZyBgZHVuZSB0 b29scyBleGVjIG9jYW1sbHNwJy4gRm9yIGV4YW1wbGUNCiAgc3RhcnRpbmcgYG9jYW1sbHNwJyB3 aXRoIHRoZSBmb2xsb3dpbmcgc2hlbGwgc2NyaXB0Og0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDi lIIgT0NBTUxGT1JNQVRfVEFSR0VUPSJfYnVpbGQvX3ByaXZhdGUvZGVmYXVsdC8uZGV2LXRvb2wv b2NhbWxmb3JtYXQvb2NhbWxmb3JtYXQvdGFyZ2V0Ig0KICDilIIgDQogIOKUgiBpZiBbICEgLWYg JE9DQU1MRk9STUFUX1RBUkdFVC9jb29raWUgXTsgdGhlbg0KICDilIIgICAgICMgTWFrZSBzdXJl IHRoYXQgdGhlIG9jYW1sZm9ybWF0IGRldiB0b29sIGlzIGluc3RhbGxlZCBhcyBpdCdzIG5lZWRl ZCBieQ0KICDilIIgICAgICMgb2NhbWxsc3AuIFRoZXJlJ3MgY3VycmVudGx5IG5vIGNvbW1hbmQg dGhhdCBqdXN0IGluc3RhbGxzIG9jYW1sZm9ybWF0IHNvDQogIOKUgiAgICAgIyB3ZSBuZWVkIHRv IHJ1biBpdCBhbmQgaWdub3JlIHRoZSByZXN1bHQuDQogIOKUgiAgICAgZHVuZSB0b29scyBleGVj IG9jYW1sZm9ybWF0IC0tIC0taGVscCA+IC9kZXYvbnVsbA0KICDilIIgZmkNCiAg4pSCIA0KICDi lIIgIyBBZGQgb2NhbWxmb3JtYXQgdG8gdGhlIGVudmlyb25tZW50IGluIHdoaWNoIG9jYW1sbHNw IHJ1bnMgc28gb2NhbWxsc3AgY2FuIGludm9rZSBvY2FtbGZvcm1hdC4NCiAg4pSCIGV4cG9ydCBQ QVRIPSIkUFdELyRPQ0FNTEZPUk1BVF9UQVJHRVQvYmluOiRQQVRIIg0KICDilIIgDQogIOKUgiAj IEJ1aWxkIGFuZCBydW4gb2NhbWxsc3AuDQogIOKUgiBkdW5lIHRvb2xzIGV4ZWMgb2NhbWxsc3Ag LS0gIiRAIg0KICDilJTilIDilIDilIDilIANCg0KICBPZiBjb3Vyc2UsIGl0J3MgcmFyZSB0byBt YW51YWxseSBzdGFydCBgb2NhbWxsc3AnIGRpcmVjdGx5IGZyb20geW91cg0KICB0ZXJtaW5hbC4g SXQncyBub3JtYWxseSBsYXVuY2hlZCBieSB0ZXh0IGVkaXRvcnMuIEl0IHdvdWxkIGJlDQogIGlt cHJhY3RpY2FsIHRvIGNvbmZpZ3VyZSB5b3VyIHRleHQgZWRpdG9yIHRvIG1vZGlmeSBgJFBBVEgn IGFuZCBydW4gYQ0KICBjdXN0b20gY29tbWFuZCB0byBzdGFydCBgb2NhbWxsc3AnIHZpYSBEdW5l LCBhbmQgZG9pbmcgc28gd291bGQgbWFrZQ0KICBpdCBpbXBvc3NpYmxlIHRvIGVkaXQgYW55IHBy b2plY3QgdGhhdCBfZG9lc24ndF8gdXNlIER1bmUgZm9yIHBhY2thZ2UNCiAgbWFuYWdlbWVudC4g SW5zdGVhZCwgdGhlIER1bmUgRGV2ZWxvcGVyIFByZXZpZXcgc2hpcHMgd2l0aCBbYSBzaGVsbA0K ICBzY3JpcHRdIHdoaWNoIGluc3RhbGxzIGBvY2FtbGZvcm1hdCcgYW5kIGFkZHMgaXRzIGBiaW4n IGRpcmVjdG9yeSB0bw0KICBgJFBBVEgnIGJlZm9yZSBsYXVuY2hpbmcgYGR1bmUgdG9vbHMgZXhl YyBvY2FtbGxzcCcuIFRoZSBzY3JpcHQgaXMNCiAgc2ltcGx5IG5hbWVkIGBvY2FtbGxzcCcsIGFu ZCB0aGUgRHVuZSBEZXZlbG9wZXIgUHJldmlldyBpbnN0YWxsIHNjcmlwdA0KICBhZGRzIGl0IHRv IGB+Ly5kdW5lL2Jpbicgd2hpY2ggc2hvdWxkIGFscmVhZHkgYmUgaW4geW91ciBgJFBBVEgnIGlm DQogIHlvdSdyZSB1c2luZyB0aGUgRGV2ZWxvcGVyIFByZXZpZXcuIFRoZSBgb2NhbWxsc3AnIHNj cmlwdCBhbHNvDQogIGF0dGVtcHRzIHRvIGZhbGwgYmFjayB0byBhbiBPcGFtLW1hbmFnZWQgaW5z dGFsbGF0aW9uIG9mIGBvY2FtbGxzcCcgaWYNCiAgaXQgZG9lc24ndCBkZXRlY3QgYSBEdW5lIGxv Y2tkaXIgc28gdGhlIHNhbWUgc2NyaXB0IHNob3VsZCB3b3JrIGZvcg0KICBub24tRHVuZSBwcm9q ZWN0cy4gQmVjYXVzZSB0aGUgc2NyaXB0IGlzIG5hbWVkIHRoZSBzYW1lIGFzIHRoZQ0KICBgb2Nh bWxsc3AnIGV4ZWN1dGFibGUsIG1vc3QgZWRpdG9ycyBkb24ndCByZXF1aXJlIHNwZWNpYWwNCiAg Y29uZmlndXJhdGlvbiB0byBydW4gaXQuIFNlZSB0aGUgIkVkaXRvciBDb25maWd1cmF0aW9uIiBz ZWN0aW9uIG9mIHRoZQ0KICBbRHVuZSBEZXZlbG9wZXIgUHJldmlldyBwYWdlXSBmb3IgbW9yZSBp bmZvcm1hdGlvbiBhYm91dCBzZXR0aW5nIHVwDQogIHlvdXIgZWRpdG9yLg0KDQogIFNvbWUgcGFy dHMgb2YgdGhlIGBvY2FtbGxzcCcgc2hlbGwgc2NyaXB0IG1heSBldmVudHVhbGx5IG1ha2UgdGhl aXINCiAgd2F5IGludG8gRHVuZSBpdHNlbGYsIGJ1dCBmb3IgdGhlIHRpbWUgYmVpbmcgdGhlIHNo ZWxsIHNjcmlwdCBpcyB0aGUNCiAgcmVjb21tZW5kZWQgd2F5IHRvIGxhdW5jaCBgb2NhbWxsc3An IGZvciB1c2VycyBvZiB0aGUgRHVuZSBEZXZlbG9wZXINCiAgUHJldmlldy4gVGhlIG5ldCByZXN1 bHQgaXMgdGhhdCBhcyBsb25nIGFzIHlvdXIgcHJvamVjdCBoYXMgYQ0KICBsb2NrZmlsZSwgdGhl IGZpcnN0IHRpbWUgeW91IGVkaXQgc29tZSBPQ2FtbCBjb2RlIGluIHRoZSBwcm9qZWN0IER1bmUN CiAgd2lsbCBkb3dubG9hZCBhbmQgcnVuIHRoZSBhcHByb3ByaWF0ZSB2ZXJzaW9uIG9mIGBvY2Ft bGxzcCcuDQoNCg0KW0xhbmd1YWdlIFNlcnZlciBQcm90b2NvbF0NCjxodHRwczovL21pY3Jvc29m dC5naXRodWIuaW8vbGFuZ3VhZ2Utc2VydmVyLXByb3RvY29sLz4NCg0KW0RldmVsb3BlciBQcmV2 aWV3IHBhZ2VdIDxodHRwczovL3ByZXZpZXcuZHVuZS5idWlsZC8+DQoNCltgb2NhbWxsc3AnIHNo ZWxsIHNjcmlwdF0NCjxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwtZHVuZS9iaW5hcnktZGlzdHJp YnV0aW9uL2Jsb2IvbWFpbi90b29sLXdyYXBwZXJzL29jYW1sbHNwPg0KDQpbYmluYXJ5IHJlcG9z aXRvcnldDQo8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sLWR1bmUvb2NhbWwtYmluYXJ5LXBhY2th Z2VzPg0KDQpbYSBzaGVsbCBzY3JpcHRdDQo8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sLWR1bmUv YmluYXJ5LWRpc3RyaWJ1dGlvbi9ibG9iL21haW4vdG9vbC13cmFwcGVycy9vY2FtbGxzcD4NCg0K W0R1bmUgRGV2ZWxvcGVyIFByZXZpZXcgcGFnZV0gPGh0dHBzOi8vcHJldmlldy5kdW5lLmJ1aWxk Lz4NCg0KDQpEdW5lIERldmVsb3BlciBQcmV2aWV3IFVwZGF0ZXMNCuKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwu b3JnL3QvYW5uLWR1bmUtZGV2ZWxvcGVyLXByZXZpZXctdXBkYXRlcy8xNTE2MC81Mj4NCg0KDQpT dGV2ZSBTaGVycmF0dCBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEEgbmV3IHZlcnNp b24gb2YgdGhlIFt2c2NvZGUtb2NhbWwtcGxhdGZvcm1dIHdhcyBqdXN0IHJlbGVhc2VkIHdoaWNo DQogIGZpeGVzIGEgZmV3IGlzc3VlcyB3aXRoIG9jYW1sbHNwLiBZb3UnbGwgcHJvYmFibHkgaGF2 ZSB0byB1cGRhdGUgeW91cg0KICBpbnN0YWxsIG9mIHRoZSBEdW5lIERldmVsb3BlciBQcmV2aWV3 IChqdXN0IHJlcnVuIHRoZSBjb21tYW5kIG9uIFt0aGlzDQogIHBhZ2VdKS4gWW91J2xsIG5lZWQg dG8gY29uZmlndXJlIGEgY3VzdG9tIHNhbmRib3ggZm9yIHZzY29kZSBieQ0KICBwdXR0aW5nIHRo aXMgaW4geW91ciBgc2V0dGluZ3MuanNvbicgZmlsZSBhcyBvdGhlcndpc2UgdGhlIHBsdWdpbg0K ICBhc3N1bWVzIHlvdSdyZSB1c2luZyBgb3BhbScgdG8gbGF1bmNoIGBvY2FtbGxzcCc6DQogIOKU jOKUgOKUgOKUgOKUgA0KICDilIIgew0KICDilIIgICAib2NhbWwuc2FuZGJveCI6IHsNCiAg4pSC ICAgICAia2luZCI6ICJjdXN0b20iLA0KICDilIIgICAgICJ0ZW1wbGF0ZSI6ICIkcHJvZyAkYXJn cyINCiAg4pSCICAgfQ0KICDilIIgfQ0KICDilJTilIDilIDilIDilIANCg0KDQpbdnNjb2RlLW9j YW1sLXBsYXRmb3JtXQ0KPGh0dHBzOi8vbWFya2V0cGxhY2UudmlzdWFsc3R1ZGlvLmNvbS9pdGVt cz9pdGVtTmFtZT1vY2FtbGxhYnMub2NhbWwtcGxhdGZvcm0+DQoNClt0aGlzIHBhZ2VdIDxodHRw czovL3ByZXZpZXcuZHVuZS5idWlsZC8+DQoNCg0KRmlyc3QgcmVsZWFzZSBvZiBjbWRsYW5nDQri lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9y Zy90L2ZpcnN0LXJlbGVhc2Utb2YtY21kbGFuZy8xNTYxNi8xPg0KDQoNCk1hdGhpZXUgQmFyYmlu IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSGkgZXZlcnlvbmUhDQoNCiAgQSBsaXR0 bGUgd2hpbGUgYWdvLCBJIFtwb3N0ZWRdIGFib3V0IFtjbWRsYW5nXSwgYSBsaWJyYXJ5IGZvciBj cmVhdGluZw0KICBjb21tYW5kLWxpbmUgcGFyc2VycyBpbiBPQ2FtbC4NCg0KICBUb2RheSwgSSBh bSBoYXBweSB0byBnaXZlIHlvdSBhbiB1cGRhdGUgb24gdGhpcyBwcm9qZWN0IHdpdGggdGhlDQog IGFubm91bmNlbWVudCBvZiBhbiBpbml0aWFsIHJlbGVhc2Ugb2YgY21kbGFuZyBwYWNrYWdlcyB0 byB0aGUNCiAgb3BhbS1yZXBvc2l0b3J5Lg0KDQogIFRoZXNlIGFyZSB2ZXJ5IGVhcmx5IGRheXMg Zm9yIHRoaXMgcHJvamVjdC4gSSBoYXZlIHN0YXJ0ZWQgdXNpbmcgdGhlDQogIGBjbWRsYW5nK2Nt ZGxpbmVyJyBjb21iaW5hdGlvbiBpbiBwZXJzb25hbCBwcm9qZWN0cywgYW5kIHBsYW4gdG8NCiAg ZXhwZXJpbWVudCB3aXRoIGBjbGltYXRlJyBpbiB0aGUgbmVhciBmdXR1cmUuIFBsZWFzZSBmZWVs IGZyZWUgdG8NCiAgZW5nYWdlIGluIGlzc3Vlcy9kaXNjdXNzaW9ucywgZXRjLg0KDQogIFRoZSBt b3N0IHJlY2VudCBhZGRpdGlvbiBvbiB0aGUgcHJvamVjdCBpcyB0aGUgZGV2ZWxvcG1lbnQgb2Yg YW4NCiAgZXZhbHVhdGlvbiBlbmdpbmUgYmFzZWQgb24gYHN0ZGxpYi9hcmcnLg0KDQogIEknZCBh bHNvIGxpa2UgdG8gaGlnaGxpZ2h0IHNvbWUgZXhhbXBsZXMgZnJvbSB0aGUgcHJvamVjdCdzDQog IHRlc3RzLiBEZXZlbG9waW5nIHRoZXNlIGNoYXJhY3Rlcml6YXRpb24gdGVzdHMgd2FzIGEgZnVu IHdheSB0byBsZWFybg0KICBtb3JlIGFib3V0IHRoZSBkaWZmZXJlbnQgQ0xJIGxpYnJhcmllcyBh bmQgdGhlaXIgZGlmZmVyZW5jZXM6DQoNCiAg4oCiIFNob3J0LCBsb25nIGFuZCBwcmVmaXggW2Zs YWcgbmFtZXNdLg0KICDigKIgVmFyaW91cyBzeW50YXhlcyBmb3IgW25hbWVkIGFyZ3VtZW50c10g KGAtcFZBTFVFJywgYC1wPVZBTFVFJywgYC1wDQogICAgVkFMVUUnKS4NCiAg4oCiIEhhbmRsaW5n IG9mIFtuZWdhdGl2ZSBpbnRlZ2Vyc10gYXMgbmFtZWQgYXJndW1lbnRzLg0KDQogIElmIHlvdSBo YXZlIGlkZWFzIGZvciBtb3JlIGNhc2VzIHRvIGFkZCAoZW50ZXJ0YWluaW5nIG9yIG90aGVyd2lz ZSksDQogIEknZCBsb3ZlIHRvIGludGVncmF0ZSB0aGVtIGludG8gdGhlIHRlc3Qgc3VpdGUuIFRo YW5rcyENCg0KICBCZWxvdywgeW91J2xsIGZpbmQgZGV0YWlscyBvZiB0aGUgcmVsZWFzZWQgcGFj a2FnZXMuIEhhcHB5IGNvbW1hbmQNCiAgcGFyc2luZyENCg0KICAqY21kbGFuZyogdGhlIHVzZXIg ZmFjaW5nIGxpYnJhcnkgdG8gYnVpbGQgdGhlIGNvbW1hbmRzLiBJdCBoYXMgbm8NCiAgIGRlcGVu ZGVuY2llcw0KDQogICpjbWRsYW5nLXRvLWNtZGxpbmVyKiB0cmFuc2xhdGUgY21kbGFuZyBjb21t YW5kcyB0byBjbWRsaW5lcg0KDQogICpjbWRsYW5nLXRvLWNsaW1hdGUqIHRyYW5zbGF0ZSBjbWRs YW5nIGNvbW1hbmRzIHRvIHRoZSBuZXdseSByZWxlYXNlZA0KICAgY2xpbWF0ZSAoY29tcGF0aWJp bGl0eSBjaGVja2VkIHdpdGggMC4xLjAgJiAwLjIuMCkNCg0KICAqY21kbGFuZy1zdGRsaWItcnVu bmVyKiBhbiBleGVjdXRpb24gZW5naW5lIGltcGxlbWVudGVkIG9uIHRvcCBvZg0KICAgc3RkbGli LmFyZw0KDQogIFRoYW5rIHlvdSB0byBAbXNlcmkgYW5kIHRoZSBvcGFtLXJlcG9zaXRvcnkgbWFp bnRhaW5lcnMgZm9yIHRoZWlyDQogIGhlbHAuDQoNCg0KW3Bvc3RlZF0NCjxodHRwczovL2Rpc2N1 c3Mub2NhbWwub3JnL3QvY21kbGFuZy15ZXQtYW5vdGhlci1jbGktbGlicmFyeS13ZWxsLW5vdC1y ZWFsbHkvMTUyNTg+DQoNCltjbWRsYW5nXSA8aHR0cHM6Ly9naXRodWIuY29tL21iYXJiaW4vY21k bGFuZz4NCg0KW2ZsYWcgbmFtZXNdDQo8aHR0cHM6Ly9naXRodWIuY29tL21iYXJiaW4vY21kbGFu Zy9ibG9iL21haW4vdGVzdC9leHBlY3QvdGVzdF9fZmxhZy5tbD4NCg0KW25hbWVkIGFyZ3VtZW50 c10NCjxodHRwczovL2dpdGh1Yi5jb20vbWJhcmJpbi9jbWRsYW5nL2Jsb2IvbWFpbi90ZXN0L2V4 cGVjdC90ZXN0X19uYW1lZC5tbD4NCg0KW25lZ2F0aXZlIGludGVnZXJzXQ0KPGh0dHBzOi8vZ2l0 aHViLmNvbS9tYmFyYmluL2NtZGxhbmcvYmxvYi9tYWluL3Rlc3QvZXhwZWN0L3Rlc3RfX25lZ2F0 aXZlX2ludF9hcmdzLm1sPg0KDQoNCmZpbmRsaWItMS45LjgNCuKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL3N5bXBhLmlucmlh LmZyL3N5bXBhL2FyYy9jYW1sLWxpc3QvMjAyNC0xMS9tc2cwMDAxNC5odG1sPg0KDQoNCkdlcmQg U3RvbHBtYW5uIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSGkgbGlzdCwNCg0KICBm aW5kbGliLTEuOS44IGlzIG91dCwgZml4aW5nIGEgZmV3IGlzc3VlcyB0aGF0IHNsaXBwZWQgaW50 byAxLjkuNy4NCg0KICBGb3IgbWFudWFsLCBkb3dubG9hZCwgbWFudWFscywgZXRjLiBzZWUgaGVy ZToNCg0KICA8aHR0cDovL3Byb2plY3RzLmNhbWxjaXR5Lm9yZy9wcm9qZWN0cy9maW5kbGliLmh0 bWw+DQoNCiAgQW4gdXBkYXRlZCBPUEFNIHBhY2thZ2Ugd2lsbCBmb2xsb3cgc29vbi4NCg0KDQpU ZXN0byAwLjEuMCAtIGEgbmV3IHRlc3RpbmcgZnJhbWV3b3JrIGZvciBPQ2FtbA0K4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2Ft bC5vcmcvdC9hbm4tdGVzdG8tMC0xLTAtYS1uZXctdGVzdGluZy1mcmFtZXdvcmstZm9yLW9jYW1s LzE1NjI0LzE+DQoNCg0KTWFydGluIEphbWJvbiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQog IE9uIHRoaXMgODZ0aCBhbm5pdmVyc2FyeSBvZiB0aGUgZmlyc3Qgc3ludGhlc2lzIG9mIExTRCBi eSBBbGJlcnQNCiAgSG9mbWFubiwgaXQgaXMgbXkgcGxlYXN1cmUgdG8gYW5ub3VuY2UgW1Rlc3Rv XSwgYSBuZXcgdGVzdGluZyBsaWJyYXJ5DQogIGZvciBPQ2FtbC4NCg0KICBJdCBib3Jyb3dzIGEg bG90IG9mIGlkZWFzIGZyb20gQWxjb3Rlc3QgYW5kIGlzIHNpbWlsYXIgaW4gc3Bpcml0IGJ1dA0K ICBhZGRzIGEgZmV3IGtleSBmZWF0dXJlcyB0aGF0IHNlZW1lZCB0b28gZGlmZmljdWx0IHRvIGlu Y29ycG9yYXRlIGludG8NCiAgQWxjb3Rlc3QuIEZvciBhIGdlbnRsZSBpbnRyb2R1Y3Rpb24sIGNo ZWNrIG91dCBvdXINCiAgW3R1dG9yaWFsXS4gSW1wb3J0YW50IGZlYXR1cmVzIGluY2x1ZGU6DQoN CiAg4oCiIHN1cHBvcnQgZm9yIG1hbnkgb3B0aW9ucyB3aGVuIGNyZWF0aW5nIGEgdGVzdCBvZiB0 eXBlIGBUZXN0by50JzsNCiAg4oCiIGNhcHR1cmluZyBzdGRvdXQgb3Igc3RkZXJyIG91dHB1dCBm b3IgY29tcGFyaXNvbiBhZ2FpbnN0IHRoZQ0KICAgIGV4cGVjdGVkIG91dHB1dCBha2Egc25hcHNo b3RzOw0KICDigKIgcmV2aWV3aW5nIGFuZCBhcHByb3ZpbmcgdGVzdHMgd2l0aG91dCByZS1ydW5u aW5nIHRoZW07DQogIOKAoiBzdXBwb3J0IGZvciBuZXN0ZWQgY2F0ZWdvcmllcyB3aGlsZSBrZWVw aW5nIHRoZSB0ZXN0IHN1aXRlIGFzIGEgZmxhdA0KICAgIGxpc3Q7DQogIOKAoiBwYXJhbGxlbCBl eGVjdXRpb24gdXNpbmcgbXVsdGlwcm9jZXNzaW5nLg0KDQogIFRoaXMgaXMgdGhlIGZpcnN0IG9m ZmljaWFsIHJlbGVhc2Ugb2YgVGVzdG8gYW5kIGl0cyBpbnRlcmZhY2UgaXMNCiAgbGlrZWx5IHRv IGNoYW5nZSBpbiBtaW5vciB3YXlzIHVudGlsIHdlIHJlbGVhc2UgdmVyc2lvbiAxLjAuMC4gV2Un dmUNCiAgYmVlbiB1c2luZyBpdCBpbnRlcm5hbGx5IGF0IFNlbWdyZXAgZm9yIGFib3V0IGEgeWVh ciBhbmQgaXQncyBiZWVuDQogIHdvcmtpbmcgd2VsbCBmb3IgdXMuDQoNCiAgSGFwcHkgdGVzdGlu ZyENCg0KDQpbVGVzdG9dIDxodHRwczovL2dpdGh1Yi5jb20vc2VtZ3JlcC90ZXN0bz4NCg0KW3R1 dG9yaWFsXSA8aHR0cHM6Ly9zZW1ncmVwLmdpdGh1Yi5pby90ZXN0by90dXRvcmlhbC8+DQoNCg0K T3RoZXIgT0NhbWwgTmV3cw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQDQoNCkZyb20gdGhlIG9jYW1sLm9yZyBibG9nDQrilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBI ZXJlIGFyZSBsaW5rcyBmcm9tIG1hbnkgT0NhbWwgYmxvZ3MgYWdncmVnYXRlZCBhdCBbdGhlIG9j YW1sLm9yZw0KICBibG9nXS4NCg0KICDigKIgW1RoZSBOZXcgQ29uZmVyZW5jZSBvbiB0aGUgQmxv Y2s6IFdoYXQgaXMgRlVOIE9DYW1sP10NCg0KDQpbdGhlIG9jYW1sLm9yZyBibG9nXSA8aHR0cHM6 Ly9vY2FtbC5vcmcvYmxvZy8+DQoNCltUaGUgTmV3IENvbmZlcmVuY2Ugb24gdGhlIEJsb2NrOiBX aGF0IGlzIEZVTiBPQ2FtbD9dDQo8aHR0cHM6Ly90YXJpZGVzLmNvbS9ibG9nLzIwMjQtMTEtMTMt dGhlLW5ldy1jb25mZXJlbmNlLW9uLXRoZS1ibG9jay13aGF0LWlzLWZ1bi1vY2FtbD4NCg0KDQpP bGQgQ1dODQrilZDilZDilZDilZDilZDilZDilZANCg0KICBJZiB5b3UgaGFwcGVuIHRvIG1pc3Mg YSBDV04sIHlvdSBjYW4gW3NlbmQgbWUgYSBtZXNzYWdlXSBhbmQgSSdsbCBtYWlsDQogIGl0IHRv IHlvdSwgb3IgZ28gdGFrZSBhIGxvb2sgYXQgW3RoZSBhcmNoaXZlXSBvciB0aGUgW1JTUyBmZWVk IG9mIHRoZQ0KICBhcmNoaXZlc10uDQoNCiAgSWYgeW91IGFsc28gd2lzaCB0byByZWNlaXZlIGl0 IGV2ZXJ5IHdlZWsgYnkgbWFpbCwgeW91IG1heSBzdWJzY3JpYmUNCiAgdG8gdGhlIFtjYW1sLWxp c3RdLg0KDQogIFtBbGFuIFNjaG1pdHRdDQoNCg0KW3NlbmQgbWUgYSBtZXNzYWdlXSA8bWFpbHRv OmFsYW4uc2NobWl0dEBwb2x5dGVjaG5pcXVlLm9yZz4NCg0KW3RoZSBhcmNoaXZlXSA8aHR0cHM6 Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vPg0KDQpbUlNTIGZlZWQgb2YgdGhlIGFyY2hpdmVz XSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vY3duLnJzcz4NCg0KW2NhbWwtbGlz dF0gPGh0dHBzOi8vc3ltcGEuaW5yaWEuZnIvc3ltcGEvaW5mby9jYW1sLWxpc3Q+DQoNCltBbGFu IFNjaG1pdHRdIDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0Lz4NCg0K --=-=-= 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 November 12 to 19, 20= 24.

Boulder Dash in OCaml

Andreas Rossberg announced

Boulder Dash(*) was my favourite computer game in the 8-bit era, first rele= ased on the Atari 400/800 in 1984. Though I never owned an 8-bit machine myself, I had friend= s that I annoyed enough to let me play it on theirs.

As a homage to its 40th anniversary, I put together a fairly faithful clone= of the original game, implemented in just a few 100 lines of bare OCaml, with nothing but the hom= ely Graphics library. It should run on Windows, Mac, and Linux, though I was too lazy to test the= latter.

Features:

  • Faithful original physics, graphics, and animations
  • Authentic scrolling mechanics combined with dynamic window resizing
  • All 20 levels, including intermissions, and 5 difficulties
  • Pause-and-go mode for relaxed playing

It is open-source here:

https://github.com/ros= sberg/boulder-dash

Enjoy!

/Andreas

(*) htt= ps://en.wikipedia.org/wiki/Boulder_Dash_(video_game)=20 "Boulder Dash" is a trademark of BBG Entertainment

Jane Street OCaml extensions =E2=80=93 now with developer tool= ing!

Diana Kalinichenko announced

Hi everyone! We've just released a new version of our compiler extensions, = complete with all our packages and support for developer tooling, including= ocamlformat, merlin and ocaml-lsp-server. Get the install instructions at = our GitHub, and enjoy the experience in your favorite editor like V= SCode, Emacs or Vim.

More documentation coming soon :slight_smile:. Stay tuned for future releas= es!

opam 2.3.0 is out!

Kate announced

Hi everyone,

As mentioned in our talk at the OCaml Workshop 2024, we de= cided to switch to a time-based release cycle (every 6 months), starting wi= th opam 2.3.

As promised, we are happy to announce the final release of opam 2.3.0.

What=E2=80=99s new?

  • When loading a repository, opam now ignores files in packages=E2=80= =99 files/ directories which aren=E2=80=99t listed in the extra-files field= of the opam file. :warning: If you maintain an opam repository, please= read our blog post= to make sure your repository stays compatible.
  • Packages requiring an unsupported version of opam are now marked una= vailable, instead of causing a repository error. This means an opam rep= ository can now allow smoother upgrade in the future
  • opam list –latests-only: a new option to list only the la= test versions of packages
  • –verbose-on: a new option to enable verbose output for sp= ecified package names.
  • opam switch import –deps-only: a new option to install on= ly the dependencies of the root packages listed in the opam switch export f= ile
  • opam switch list-available no longer displays compilers flagged = with avoid-version~/~deprecated unless --all is g= iven, meaning that pre-release or unreleased OCaml packages no longer appea= r to be the latest version
  • The builtin-0install solver was improved and should now be capab= le of being your default solver instead of builtin-mccs+glpk. = If you wish to give it a try, simply calling opam option solver=3Dbui= ltin-0install (call opam option solver=3D restores the = default)
  • Most of the unhelpful conflict messages were fixed :flashlight:<= /li>
  • Fix the internal cache of installed packages, which was storing = the wrong version of the opam file after a build failure. (#6213)

Various performance and other improvements were made and bugs were fixed.

:open_book: You can read our blog post for more information about these changes and more, and = for even more details you can take a look at the release note or the changelog.

Try it!

The upgrade instructions are unchanged:

For Unix systems

bash -c "sh <(curl -fsSL https://opam.ocaml.org/install.sh)"

or from PowerShell for Windows systems

Invoke-Expression "& { $(Invoke-RestMethod https://opam.ocaml.org/insta=
ll.ps1) }"

Please report any issues to the bug-tracker.

Installing Developer Tools with Dune

Steve Sherratt announced

Dune can install and run developer tools in the context of a project. This = feature is available in the Dune De= veloper Preview and in the upcoming release of Dune 3.17. As with all o= f Dune's package management features, consider this feature to be unstable = as its UI and semantics may change without notice.

The currently supported tools are ocamllsp and ocamlform= at. Dune has a new command dune tools exec <TOOL> -- [AR= GS]... which downloads and installs the given tool, and then runs it= with the given arguments (note the -- which separates argumen= ts to dune from arguments to the tool). Tools are installed lo= cally to the project, in its _build directory, which makes it = easy to use different versions of a tool in different projects. An unfortun= ate consequence of installing tools into _build is that for th= e time being all tools are uninstalled whenever dune clean is = run.

Let's see it in action:

$ dune tools exec ocamlformat -- --version
Solution for dev-tools.locks/ocamlformat:
- ocamlformat.0.26.2+binary-ocaml-5.2.0-built-2024-11-07.0-x86_64-unknown-l=
inux-musl
    Building ocamlformat.0.26.2+binary-ocaml-5.2.0-built-2024-11-07.0-x86_6=
4-unknown-linux-musl
     Running 'ocamlformat --version'
0.26.2

Precompiled Binaries

Note that in the example above, Dune's package solver chose to install vers= ion 0.26.2+binary-ocaml-5.2.0-built-2024-11-07.0-x86_64-unknown-linux= -musl of ocamlformat. This packages comes from a new repository of= binary packages containing pre-built executables for a select few Opam= packages. Dune will search this repository in addition to the default repo= sitories when solving packages for tools only (if a project has ocaml= format in its dependencies, the binary repository won't be searched = while solving the project's dependencies).

The goal of the binary repository is to reduce the time it takes to get sta= rted working on a new project. Without it, Dune would need to build o= camlformat from source along with all of its dependencies, which can= take several minutes.

For now only a small number of package versions are contained in the binary= repository. To demonstrate, here's what happens if we run dune tools= exec ocamlformat in a project with version=3D0.26.1 in= its .ocamlformat file:

 $ dune tools exec ocamlformat -- --version
Solution for dev-tools.locks/ocamlformat:
- astring.0.8.5
- base.v0.17.1
- base-bytes.base
- base-unix.base
- camlp-streams.5.0.1
- cmdliner.1.3.0
...
- ocamlformat.0.26.1
...
    Building base-unix.base
    Building ocaml-base-compiler.5.1.1
    Building ocaml-config.3
    Building ocaml.5.1.1
    Building seq.base
    Building cmdliner.1.3.0
...
    Building ocamlformat.0.26.1
     Running 'ocamlformat --version'
0.26.1

Dune parses .ocamlformat to determine which version of o= camlformat to install, and 0.26.1 is not in the binary = repo so it needed to be built from source.

If your project requires a version of a package not available in the binary= repository, or you're on an operating system or architecture for which no = binary version of a package exists, the package will be built from source i= nstead. Currently the binary repository contains binaries of ocamlfor= mat.0.26.2, ocaml-lsp-server.1.18.0 and ocaml-lsp= -server.1.19.0 for x86_64-unknown-linux-musl, x86= _64-apple-darwin and aarch64-apple-darwin.

Note that Linux binaries are statically linked with muslc so they should wo= rk on all distros regardless of dynamic linker.

Running ocamllsp

The program ocamllsp from the package ocaml-lsp-server analyzes OCaml code and sends information to text editors using the <= a href=3D"https://microsoft.github.io/language-server-protocol/">Language S= erver Protocol. The tool is crucial to OCaml's editor integration and i= t has a couple of quirks that are worth mentioning here.

TL;DR: Install Dune with the install script on the Developer Preview page and you'll get an ocamllsp shell script that will install and run the = correct version of ocamllsp for your project.

Firstly the ocamllsp executable can only analyze code that has= been compiled with the same version of the OCaml compiler as was used to c= ompile the ocamllsp executable itself. Different versions of t= he ocaml-lsp-server package are incompatible with some version= s of the OCaml compiler (e.g. ocaml-lsp-server.1.19.0 must be = built with at least 5.2.0 of the compiler). This means that wh= en Dune is choosing which version of ocaml-lsp-server to insta= ll it needs to know which version of the compiler your project is using. Th= is is only known after the project has been locked (by running dune p= kg lock), so Dune will refuse to install ocamllsp in a = project that doesn't have a lock directory or for a project that doesn't de= pend on the OCaml compiler.

$ dune tools exec ocamllsp
Error: Unable to load the lockdir for the default build context.
Hint: Try running 'dune pkg lock'

The ocaml-lsp-server packages in the binary repository contain metada= ta to ensure that the ocamllsp executable that gets installed = was built with the same version of the compiler as your project. For exampl= e the ocaml-lsp-server package built with ocaml.5.2.0 contains this line:

conflicts: "ocaml" {!=3D "5.2.0"}

This prevents it from being chosen if the project depends on any version of= the compiler other than 5.2.0.

Another quirk is that ocamllsp will try to invoke the binaries= ocamlformat and ocamlformat-rpc, both found in t= he ocamlformat package. The ocaml-lsp-server pack= age doesn't depend on ocamlformat as the specific version of <= code>ocamlformat needed by a project is implied by the project's .ocamlformat file, which package managers don't consider when sol= ving dependencies. This means that in general (whether using Dune or Opam f= or package management) it's up to the user to make sure that the correct ve= rsion of ocamlformat is installed in order to use the formatti= ng features of ocamllsp.

Otherwise expect this error in your editor:

Unable to find 'ocamlformat-rpc' binary. Types on hover may not be well-for=
matted. You need to install either 'ocamlformat' of version > 0.21.0 or,=
 otherwise, 'ocamlformat-rpc' package.

Even if ocamllsp and ocamlformat are both install= ed by Dune, if you run dune tools exec ocamllsp you will find = that ocamllsp still can't find the ocamlformat or= ocamlformat-rpc executables. This is because unlike Opam, Dun= e does not install tools into your $PATH, and for the sake of = simplicity, the dune tools exec <TOOL> command does not = modify the environment of the tool it launches. This can be fixed by adding= _build/_private/default/.dev-tool/ocamlformat/ocamlformat/target/bin= (the directory containing ocamlformat and ocamlf= ormat-rpc when ocamlformat is installed by dune) to the= start of your $PATH variable before running dune tools = exec ocamllsp. For example starting ocamllsp with the f= ollowing shell script:

OCAMLFORMAT_TA=
RGET=3D"_build/_private/default/.dev=
-tool/ocamlformat/ocamlformat/target"

if [ ! -f $OCAMLF=
ORMAT_TARGET/cookie ]; then
    # Make sure that the ocamlformat de=
v tool is installed as it's needed by
    # ocamllsp. There's currently no co=
mmand that just installs ocamlformat so
    # we need to run it and ignore the =
result.
    dune tools exec ocamlformat -- --help > /dev/null
fi

# Add ocamlformat to the environment in=
 which ocamllsp runs so ocamllsp can invoke ocamlformat.
export PATH=3D"$PWD/$=
OCAMLFORMAT_TARGET/bin:$PATH"

# Build and run ocamllsp.
dune tools exec ocamllsp -- "$@"

Of course, it's rare to manually start ocamllsp directly from = your terminal. It's normally launched by text editors. It would be impracti= cal to configure your text editor to modify $PATH and run a cu= stom command to start ocamllsp via Dune, and doing so would ma= ke it impossible to edit any project that doesn't= use Dune for package management. Instead, the Dune Developer Previe= w ships with a shell script which installs oc= amlformat and adds its bin directory to $PATH before launching dune tools exec ocamllsp. The script is s= imply named ocamllsp, and the Dune Developer Preview install s= cript adds it to ~/.dune/bin which should already be in your <= code>$PATH if you're using the Developer Preview. The ocamllsp= script also attempts to fall back to an Opam-managed installation o= f ocamllsp if it doesn't detect a Dune lockdir so the same scr= ipt should work for non-Dune projects. Because the script is named the same= as the ocamllsp executable, most editors don't require specia= l configuration to run it. See the "Editor Configuration" section of the Dune Developer Preview page for m= ore information about setting up your editor.

Some parts of the ocamllsp shell script may eventually make th= eir way into Dune itself, but for the time being the shell script is the re= commended way to launch ocamllsp for users of the Dune Develop= er Preview. The net result is that as long as your project has a lockfile, = the first time you edit some OCaml code in the project Dune will download a= nd run the appropriate version of ocamllsp.

Dune Developer Preview Updates

Steve Sherratt announced

A new version of the vscode-ocaml-platform was just rel= eased which fixes a few issues with ocamllsp. You'll probably have to updat= e your install of the Dune Developer Preview (just rerun the command on this page). You'll need to configu= re a custom sandbox for vscode by putting this in your settings.json<= /code> file as otherwise the plugin assumes you're using opam = to launch ocamllsp:

{
  "ocaml.sandbox": {
    "kind": "custom",
    "template": "$prog $args"
  }
}

First release of cmdlang

Mathieu Barbin announced

Hi everyone!

A little while ago, I posted about cmdlang, a library for creating command-l= ine parsers in OCaml.

Today, I am happy to give you an update on this project with the announceme= nt of an initial release of cmdlang packages to the opam-repository.

These are very early days for this project. I have started using the = cmdlang+cmdliner combination in personal projects, and plan to exper= iment with climate in the near future. Please feel free to eng= age in issues/discussions, etc.

The most recent addition on the project is the development of an evaluation= engine based on stdlib/arg.

I'd also like to highlight some examples from the project's tests. Developi= ng these characterization tests was a fun way to learn more about the diffe= rent CLI libraries and their differences:

If you have ideas for more cases to add (entertaining or otherwise), I'd lo= ve to integrate them into the test suite. Thanks!

Below, you'll find details of the released packages. Happy command parsing!

cmdlang the user facing library to build the commands. It has no dep= endencies

cmdlang-to-cmdliner translate cmdlang commands to cmdliner

cmdlang-to-climate translate cmdlang commands to the newly released = climate (compatibility checked with 0.1.0 & 0.2.0)

cmdlang-stdlib-runner an execution engine implemented on top of stdl= ib.arg

Thank you to @mseri and the opam-repository maintainers for their help.

findlib-1.9.8

Gerd Stolpmann announced

Hi list,

findlib-1.9.8 is out, fixing a few issues that slipped into 1.9.7.

For manual, download, manuals, etc. see here:

http://proje= cts.camlcity.org/projects/findlib.html

An updated OPAM package will follow soon.

Testo 0.1.0 - a new testing framework for OCaml

Martin Jambon announced

On this 86th anniversary of the first synthesis of LSD by Albert Hofmann, i= t is my pleasure to announce T= esto, a new testing library for OCaml.

It borrows a lot of ideas from Alcotest and is similar in spirit but adds a= few key features that seemed too difficult to incorporate into Alcotest. F= or a gentle introduction, check out our tutorial. Important features include:

  • support for many options when creating a test of type Testo.t;
  • capturing stdout or stderr output for comparison against the expected o= utput aka snapshots;
  • reviewing and approving tests without re-running them;
  • support for nested categories while keeping the test suite as a flat li= st;
  • parallel execution using multiprocessing.

This is the first official release of Testo and its interface is likely to = change in minor ways until we release version 1.0.0. We've been using it in= ternally at Semgrep for about a year and it's been working well for us.

Happy testing!

Other OCaml News

From the ocaml.org blog

Here are links from many OCaml blogs aggregated at the ocaml.org blog.

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= 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 to the= caml-list.

--=-=-=--