From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: 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=HUYBbfBx; dkim-atps=neutral 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=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by plum.tunbury.org (Postfix) with ESMTP id 8E531400A6 for ; Tue, 9 Dec 2025 15:05:06 +0000 (UTC) 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=2l3AljDR/3tn7pIHeEMOVE3XXIY0rvwpt+6hUgg3Qbc=; b=HUYBbfBxUEIqk99sAI7vC5JljQ80EvBb/fdYFGq4OIDLe18tpRuxx+Cd k/G25De8GgaJbUj6XGaKaqlpHtQQVsssy1CzmHomcyRwKvp2GsE+5Bkwu fAdfuJ088lGLyiyR+NR2fPADcGAD9dCrm+14AV4ruCbm3/6zyKLcqdAtX Q=; X-CSE-ConnectionGUID: agXpF5rmSvmdxEkh8xczTQ== X-CSE-MsgGUID: jxEHZVLERme0CNBl9qYSqw== Authentication-Results: mail2-relais-roc.national.inria.fr; dkim=none (message not signed) header.i=none; spf=SoftFail smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@prod-sympa-app.inria.fr Received-SPF: SoftFail (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr is inclined to not designate 128.93.162.27 as permitted sender) identity=mailfrom; client-ip=128.93.162.27; 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@prod-sympa-app.inria.fr) identity=helo; client-ip=128.93.162.27; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@prod-sympa-app.inria.fr"; x-conformance=spf_only X-IronPort-AV: E=Sophos;i="6.20,261,1758578400"; d="scan'208,217";a="253584039" Received: from prod-sympa-app.inria.fr ([128.93.162.27]) by mail2-relais-roc.national.inria.fr with ESMTP; 09 Dec 2025 16:05:03 +0100 Received: by prod-sympa-app.inria.fr (Postfix, from userid 990) id 3993880E45; Tue, 9 Dec 2025 16:05:03 +0100 (CET) Received: from mail2-relais-roc.national.inria.fr (dsi-ha-lb1-dmz.inria.fr [128.93.162.100]) by prod-sympa-app.inria.fr (Postfix) with ESMTP id ADD1D80E42 for ; Tue, 9 Dec 2025 16:04:55 +0100 (CET) X-CSE-ConnectionGUID: QTEsMbETSq699PID3ssmbA== X-CSE-MsgGUID: PqCAmKrAQJ2S0kSj67sdzg== IronPort-SDR: 69383a96_O0EPeXe+7cl52dB9G6uQ4lLRWZNjQc3plogk3P9HBRWgtBw zVyEMg0uVYP5Ft7kpeeFUCDJFC6aLyEzOUZ6x3A== X-ThreatScanner-Verdict: Negative X-IPAS-Result: =?us-ascii?q?A0HZAgCmOThpdyIeaIFaHgEBCxIMg01bKBkBbF8zBwhJh?= =?us-ascii?q?FWBY4FsCI4dgRWbM4J6AwQUFiMVAQMBDS4BGwQBAgQBAQMBAgGDSYE3AhaMU?= =?us-ascii?q?gIfBgEENBMBAgQBAQEBAwIDAQEBAQEBAQEBDQEBBQEBAQIBAQIEBgECEAE+A?= =?us-ascii?q?0uGTw2CRRk4cWECAgMDAzcBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQECBAgBAhcKBhlcCQQGEwEBJgQIBhgUDwMUAQYDAgQNA?= =?us-ascii?q?TUDFAESFAUBAoIOWYIgAgJPAwUMBpROm016fzOBAYIMAQEGgQg+AwsCBQEOC?= =?us-ascii?q?SbaDoFkCYEzGIVugkobASpJawKESYQ9Jw+BVUSBFTWBc1FvgVAyPQUGFwEBA?= =?us-ascii?q?QEBF0RgAQECBkUJgyWCaYImehQdgWSEHoJxgTCFWAaBTIdggURLMywBVRMXC?= =?us-ascii?q?wcFW4EIAyo0LW4yHYEjPhdzgRSDSR5oDwaBEYNRiRkPiXsyAwttPTcUG5RqQ?= =?us-ascii?q?hkpJYFlDh8fFycbIw4ZCA4BAQUdLggOFRYKFQMBJgQBCQIcLAsLAh4PA5J/B?= =?us-ascii?q?iZ1nH2Tdm00B4QfgV4GDIhLPYEmlgaEBIFXizyZVCKYZCKCNocngSYJgW9rl?= =?us-ascii?q?WAThUWBfyM8bzEzGjAiIQ0GgiABATIJRhwPjX8iDBaBEgEBB4FCgQFBfYEdg?= =?us-ascii?q?X07u3YCQjUCAQE4AgcBCgEBAwmFYgEBjDqBSwEB?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23:s+FEpak/rlHwQP/A/Zr2jPro5gxfIkRdPkR7XQ2eYbSJt1+Wr1Gzt xJMWDvTa6uOMzH0c9l3YYm/ox9S6pfRzoc2TgRor3tkEFtH+JHPbTi7BhepbnnKdqUvb2o+s p5AMoGYRCwQZiWBzvt4GuG59RGQ7YnRG/yhTreCYn0sLeNdYH9JoQp5nOIkiZJfj9G8Agec0 fv/uMS31GWNglaYCUpKrfjbwP9TlK6q4m5B5ARvPakjUGL2zhH5MrpPfcldEFOjGuG4LsbiL 87fwbew+H/u/htFIruNjrbhf0QWdaXZNA6Ih2A+c/DKbs9q+0Teeo5iXBYtQR8/Zwehx7id+ /0R3XCEcjrFC4WX8Agrv7a0JAklVUFO0OevzXFSKqV/xWWeG5fn660G4E3boeT0Uwu4aI1D3 aVwFdwDUvyMr9uK7ameQMRQvd19fZjTHa9EoWplxxiMWJ7KQbibK0nLzdpIhXEogcRfAfvVZ 8wYcCdiKhPabHWjOH9OUsN4xb/0wCKnNWYEwL6WjfJfD2z79zZKiO38MoPcL4KyEN1SmleEq 2nG+WXgHxxcM8aQnDOB+3TqneTPmCLnRKoYE6C+/fNxxljP1ioUEhJ+uV6T+6Ti1x7lCokFQ 6AS0hI3hoE311aCd/unZEW7m3za4QUQSdUFRoXW7ynWl/aKuFnBboQedRZKYdki8cs3XiACz U6Mh9qvBDp1sbTTR2j1y1uPhTaiYG4NKmsTeSIPTQ0E+sTu5oYpgXojU+qPDoaMsvDuPDvd/ wuT8nlvv5Q/1tUQ0q+SqAWvby2XmnTfcuIizivtNl9JAyt8dNfjf4us+ETW5vZGLZ+EQx+Gp ndsdymiAAImU8HleM+lGr1l8FSVCxCta2a0bblHRMVJythV0yT/Fb28GRknTKuTDir7RdMZS BSO5V0Ku8c70IqCYKRwZ4/5E8Mu3LTtHtTjV+nJY5JDeoN6bGe6wc2aXmbBjwjFyRF0+YlmY MfzWZj3Vx4yV/84pAdass9EgNfHMAhnlDuLHfgWDn2PjdKjWZJiYexUbgfSP7phs/rsTce82 483CvZmAi53CIXWChQ7O6ZKRbzTBSlqXcLFuIZMe/SdIwFrPmgkBrWDifkiYoFp1eAd3OvB4 nj3CAcSxUvdlE/3D1yASkliT7fzArd5j3YwZhI3MXiShnMMXIeI7YUkTaURQ4UJzuJZ8KNLf 6E3QPnYWvVrYRbbygsZdqj4/dBDdgz0pAegPBiFQTkYfrxhTVf35+6+QBnL8XFWAwHqq8A7q LyE/SHYSKolWA5NIpv3avWu7lXpplkburt4cHXpK+lpWnfH0dZVOQ2oqdFvOOAKCxHI5gXC5 jasGR1C+NX8+d4kwufGlYWvjtmPEdInOmF4AmOCz7K9FReCz1qZ2YUaDdq5J2HMZljVppenS /5elcznEfs9m11PjYpwPpBrwY865Prtv7Vq9RtlLlqac2WUDq5cHVfe0fltrqFtwppriTmyU G+L+fhYPuytE+HhG1gzOgEkT7qi0dc5pzrs1sk2cX7KvHJPwLm6UEtpL0atjg5ZJ+BLK48L+ 7oql/MXzA2dsSAUFOi6oBpazEm2FUxYYZ4b7skbJKTJljsUzkpzZM2AKy3uv7CKRdZ+EmgrB T62m6CYl+lQ6XTAelVuDXP94+55gMUfigFr134HHUyCwfDet8803TpQ0DU5dRtUxRN5yNBOO nBnGkl2BKeW9RJquZRzZH+tEAR/GxGpwEz95F8Xnmn/TUPzdGjyAEAiGOSKpmY1znl9e2VFw bSm12rVazbmU8Xv1C8UW0Q+ifjCT8R0xzLSivKcAMWJMJkrUwXL2pb0SzIzlCLmJsctiGnsh +pgpr9wYJKmEx8gmfQwDo3C2IkATByBGnd5fshg26E0BkDZRiC53GmfCkK2e/4VHcfwz22DN 5VMKP5MBjOE7wTfihAABKUJHa14o+5x2voGZYHQBDAnt5mxk2NXlaz+pwnEuX8TYtRxkMwCB JvbWBCcH0ex23ZFuW//g/NVG2i/YNM0ax3Y2sqr+sUNT6A8luZmdEUi3oSJon/OEg1G/g2Vj izHdaT53+xv8qUyvorOQ4FoJRS4FsP3b8uMqDuMitVpacjdFOvzrCYXlwXXBBtXNr4vRNhHr 7SBn9rp1kfjvrxtcWTmt7SeNqtOv+OeYfF2N5/pEXxkgieyYs/gzB8d8WSeK5YSstd85NGid jSoevmLat8ZdNdM9kJ7MxEEPU4mNJ32SaP8qQeWjfeGUEEd2DOaCuKXzybiaGUDexIYP5H7N BTPhM+vwdJlt6VJOg4PAqB3Ip1/IWK7Y5AcSf/KiWC6AFWr03S4gZmzpSp4vHuPQjOBHd3h6 J3IegnmeV7g8OvUxdVeqMppsgdREH95hvIqc1kA/8JtzQq3F3MCMf9XJKBu5ku4ScAu/MqQi PDxgGoe5eHVWCQdNw375MX/UwyfAO0XJ9q/ISYml69RQznjH5uOWdON6Q85i0qauBO6pA1kF T3a0nf3Ix66z4ovQLoDoPuhjo+LA9vEk2kQ9xmVf9PaWn4j7HZj6JClNBJKUT3bHsrNkkTSO GVzQnpLKK1+pYgdDu44E0No9NolUP8DAtnmgepjADoShmlD8NB99Q== IronPort-HdrOrdr: A9a23:7HBPiauvmh78VEY3+MrgeRu17skCkYMji2hC6mlwRA09TyXGra 2TdaUgvyMc1gx7ZJh5o6HnBEDyewKkyXcV2/hnAV7GZmXbUQSTXeVfBOfZogEIeBeOgNK1t5 0QFJSWYeeYZTcVsS+Q2njaLz9U+qjjzEnev5a9854Cd2FXQpAlyz08JheQE0VwSgUDL4E+Do Cg6s1OoCflUWgLb+ygb0N1F9TrlpnurtbLcBQGDxko5E2lljWz8oP3FBCew1M3Ty5P+7E/6m LI+jaJrZlL8svLgCM05VWjo6i+q+GRheerw/b8xPT9Hw+cxzpAor4RGoFq8gpF4N1Ho2xa6O Uk6y1QRPibrUmhN11d6CGdoTXIwXIg7WTvxkSfhmamqcvlRCgiA84Eno5BdADFgnBQzu2U/Z g7r15xjaAnfi/ojWD4/ZzFRhtqnk27rT4rlvMSlWVWVc8bZKVKpYIS8UtJGNNYdRiKnLwPAa 1rFoXR9fxWeVSVYzTQuXRu2sWlWjA2Eg2dSkYPt8SJ23xdnWx/zUEf2MsD901wga4VWt1B/a DJI65onLZBQosfar98Hv4IRY+tBmnEUXv3QROvyJTcZd860l722uHKCe8OlZyXkbQzvecPpK g= X-Talos-CUID: 9a23:6jdwXmBFlCcLDBb6ExBb2VUxEO0ZSWSDnSboAmPjEn1sQpTAHA== X-Talos-MUID: 9a23:3M8s1wa4EdEQheBTjybHrTRBLu5Rwf6VUEM2k8tZoMWWOnkl X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.20,261,1758578400"; d="scan'208,217";a="253583932" X-MGA-submission: =?us-ascii?q?MDF0ZeJsbH+gH3K/AeaOsaMeFUlh6VtAk64eCn?= =?us-ascii?q?BJYn20B1rwYpFj4AoiuATOcTtPKaI865IIRnAtSbQXKFH/Bp6rqPgMUD?= =?us-ascii?q?bC/Gj2Iv6QO1zx+YX/oJCq1j16dkoPWmyZ5Sk26/azsWBlx9UD5eX7lB?= =?us-ascii?q?jf43ZAL2Y97/7lyHwjKWs9Ww=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 09 Dec 2025 16:04:54 +0100 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (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 304F91A336; Tue, 9 Dec 2025 16:04:54 +0100 (CET) From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 09 Dec 2025 16:04:51 +0100 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Dec 9 16:04:54 2025 +0100 (CET)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.492586, queueID=4C99B1A3A9 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: 19409 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 ZWsgb2YgRGVjZW1iZXIgMDIgdG8gMDksDQoyMDI1Lg0KDQpUYWJsZSBvZiBDb250ZW50cw0K4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCmVkaXRv cnMgZGV2LW1lZXRpbmc6IDE1dGggb2YgRGVjZW1iZXIgYWJvdXQgdGhlIGBvY2FtbC5udmltJyBw bHVnaW4NCk1vc2FpYyAtIEEgTW9kZXJuIFRlcm1pbmFsIFVzZXIgSW50ZXJmYWNlIEZyYW1ld29y ayBmb3IgT0NhbWwgKEVhcmx5IFByZXZpZXcpDQpNYWtpbmcgaHRtbF9vZl9qc3ggfjEweCBmYXN0 ZXINClR5cmUgLSB0eXBlLXNhZmUgcmVndWxhciBleHByZXNzaW9ucyAxLjANClBvcnRpbmcgYW4g T3hDYW1sIFByb2plY3QgdG8gRHVuZSBQYWNrYWdlIE1hbmFnZW1lbnQNCk90aGVyIE9DYW1sIE5l d3MNCk9sZCBDV04NCg0KDQplZGl0b3JzIGRldi1tZWV0aW5nOiAxNXRoIG9mIERlY2VtYmVyIGFi b3V0IHRoZSBgb2NhbWwubnZpbScgcGx1Z2luDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1lZGl0 b3JzLWRldi1tZWV0aW5nLTE1dGgtb2YtZGVjZW1iZXItYWJvdXQtdGhlLW9jYW1sLW52aW0tcGx1 Z2luLzE3NTU5LzE+DQoNCg0KQ2hhcmzDqG5lX0dyb3MgYW5ub3VuY2VkDQrilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAN Cg0KICBIaSENCg0KICBXZSBhcmUgb3JnYW5pemluZyB0aGUgbmV4dCBwdWJsaWMgZGV2IG1lZXRp bmcgYWJvdXQgZWRpdG9ycyBmb3IgT0NhbWwhDQoNCiAgSXQgd2lsbCB0YWtlIHBsYWNlIG9uIERl Y2VtYmVyIDE1dGggYXQgNSBwbS4NCg0KICBUaGUgZm9jdXMgd2lsbCBiZSBvbiB0aGUgbmV3IE5l b1ZpbSBwbHVnaW4gZm9yIE9DYW1sLCB3aGljaCBhZGRzIGV4dHJhDQogIGZlYXR1cmVzIHRvIHRo ZSBjbGFzc2ljYWwgYGxzcGNvbmZpZycgZm9yIHN0YW5kYXJkIExTUCBzdXBwb3J0LCB0bw0KICBw cm92aWRlIGFsbCBvZiB0aGUgTWVybGluIGZlYXR1cmVzIGluIE5lb3ZpbS4NCg0KICBXZSB3aWxs IGV4cGxvcmUgd2h5IGhhdmluZyB0aGlzIHR5cGUgb2YgcGx1Z2luIGlzIGJlbmVmaWNpYWwgZm9y DQogIG1haW50YWluaW5nIE9DYW1sIGVkaXRvciB0b29scywgYW5kIHdlIHdpbGwgZGl2ZSBpbnRv IHRoZSBjb2RlYmFzZSB0bw0KICB1bmRlcnN0YW5kIGhvdyBpdCB3b3JrcyBhbmQgc2VlIHdoYXQg aGFwcGVucyBpbiBOZW92aW0uDQoNCiAgRm9yIHRoZSBhZ2VuZGE6DQoNCiAg4oCiIEEgdG91ci1k ZS10YWJsZSB0byBhbGxvdyB0aGUgcGFydGljaXBhbnRzIHdobyB3aXNoIHRvIGRvIHNvIHRvDQog ICAgcHJlc2VudCB0aGVtc2VsdmVzIGFuZCBtZW50aW9uIGlzc3VlcyAvIFBScyB0aGV5IGFyZSBp bnRlcmVzdGVkIGluLg0KDQogIOKAoiBUYWxrIGFuZCBRJkENCg0KICDigKIgRGlzY3VzcyBpc3N1 ZXMgYW5kIHB1bGwgcmVxdWVzdHMgdGhhdCB3ZXJlIHRhZ2dlZCBpbiBhZHZhbmNlIG9yDQogICAg bWVudGlvbmVkIGR1cmluZyB0aGUgdG91ci1kZS10YWJsZS4NCg0KICBGZWVsIGZyZWUgdG8gam9p biENCg0KICBNZWV0aW5nIGxpbms6IDxodHRwczovL21lZXQuZ29vZ2xlLmNvbS9xeHItenhnZS1m dmc+DQoNCg0KTW9zYWljIC0gQSBNb2Rlcm4gVGVybWluYWwgVXNlciBJbnRlcmZhY2UgRnJhbWV3 b3JrIGZvciBPQ2FtbCAoRWFybHkgUHJldmlldykNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRw czovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLW1vc2FpYy1hLW1vZGVybi10ZXJtaW5hbC11c2Vy LWludGVyZmFjZS1mcmFtZXdvcmstZm9yLW9jYW1sLWVhcmx5LXByZXZpZXcvMTc1NzIvMT4NCg0K DQpUaGliYXV0IE1hdHRpbyBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEknbSBleGNp dGVkIHRvIHNoYXJlIGFuIGVhcmx5IHByZXZpZXcgb2YgW01vc2FpY10sIGEgbW9kZXJuIHRlcm1p bmFsDQogIHVzZXIgaW50ZXJmYWNlIGZyYW1ld29yayBmb3IgT0NhbWwuDQoNCg0KW01vc2FpY10g PGh0dHBzOi8vZ2l0aHViLmNvbS90bWF0dGlvL21vc2FpYz4NCg0KV2hhdCBpcyBNb3NhaWM/DQri lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBNb3NhaWMg aXMgYSBoaWdoLWxldmVsIGZyYW1ld29yayBmb3IgYnVpbGRpbmcgdGVybWluYWwgdXNlciBpbnRl cmZhY2VzDQogIGluIE9DYW1sLiBJdCBwcm92aWRlcyBhIFRFQSAoVGhlIEVsbSBBcmNoaXRlY3R1 cmUpIHJ1bnRpbWUgd2l0aCBhDQogIENTUy1jb21wYXRpYmxlIGZsZXhib3ggbGF5b3V0IGVuZ2lu ZSBhbmQgYSByaWNoIHNldCBvZiBjb21wb3NhYmxlDQogIGNvbXBvbmVudHMuIEl0IGhhbmRsZXMg dGV4dCBzaGFwaW5nIChzdHlsaW5nLCB3cmFwcGluZywgc2VsZWN0aW9uKSwNCiAgZm9jdXMgYW5k IGV2ZW50IGJ1YmJsaW5nLCB6LW9yZGVyaW5nLCBhbmQgcmVzcG9uc2l2ZSBsYXlvdXQuDQoNCiAg VW5kZXIgdGhlIGhvb2QsIGl0IGJ1aWxkcyBvbiB0d28gbGlicmFyaWVzIHRoYXQgY2FuIGFsc28g YmUgdXNlZA0KICBpbmRlcGVuZGVudGx5Og0KDQogIOKAoiAqTWF0cml4KjogYSB0ZXJtaW5hbCBy dW50aW1lIGZvY3VzZWQgb24gcGVyZm9ybWFuY2UgYW5kIG1vZGVybg0KICAgICBwcm90b2NvbHMu IEhpZ2hsaWdodHM6IG5lYXItemVyby1hbGxvY2F0aW9uIGRpZmZlZCByZW5kZXJpbmcsDQogICAg IGltbWVkaWF0ZS0gbW9kZSBBUEksIEtpdHR5IGtleWJvYXJkLCBTR1IvVVJYVlQvWDEwIG1vdXNl LCBicmFja2V0ZWQNCiAgICAgcGFzdGUsIGZvY3VzIHRyYWNraW5nLCBpbmxpbmUvYWx0L3NwbGl0 IGRpc3BsYXkgbW9kZXMsIGFuZCBidWlsdC1pbg0KICAgICBkZWJ1ZyBvdmVybGF5L2ZyYW1lIGR1 bXBzLiBJdCBhbHNvIHByb3ZpZGVzIGEgdmlydHVhbCB0ZXJtaW5hbA0KICAgICBlbXVsYXRvciAo VlRFKSBhbmQgcHNldWRvLXRlcm1pbmFsIChQVFkpIG1hbmFnZW1lbnQgc3Vic3lzdGVtcy4NCiAg 4oCiICpUb2ZmZWUqOiBhIENTUy1jb21wYXRpYmxlIGxheW91dCBlbmdpbmUuIEl0J3MgYSBwb3J0 IG9mIFJ1c3TigJlzDQogICAgIFtUYWZmeV0gd2l0aCBGbGV4Ym94LCBDU1MgR3JpZCwgYW5kIEJs b2NrIGxheW91dDsNCiAgICAgZ2FwL3BhZGRpbmcvYm9yZGVycy90aXRsZXM7IGFuZCBsYXlvdXQg Y2FjaGluZyBmb3IgZWZmaWNpZW5jeS4NCg0KDQpbVGFmZnldIDxodHRwczovL2dpdGh1Yi5jb20v RGlveHVzTGFicy90YWZmeT4NCg0KDQpXaHkgTW9zYWljPw0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWMDQoNCiAgVGVybWluYWwgVUlzIGFyZSBzZWVpbmcgYSByZW5haXNzYW5jZS4g VG9vbHMgbGlrZSBDbGF1ZGUgQ29kZSBhbmQNCiAgT3BlbkNvZGUgaGF2ZSBnb3R0ZW4gcGVvcGxl IGV4Y2l0ZWQgYWJvdXQgd2hhdCBjYW4gYmUgYnVpbHQgaW4gdGhlDQogIHRlcm1pbmFsIGFuZCB0 aGUgVFVJIGNvbW11bml0eSBpcyBnYWluaW5nIG1vbWVudHVtIGluIG90aGVyDQogIGVjb3N5c3Rl bXMuDQoNCiAgT0NhbWwgaGFzIGhhZCBMYW1iZGFUZXJtIGFuZCBOb3R0eSBmb3IgdGVybWluYWwg Z3JhcGhpY3MgZm9yIHllYXJzLA0KICBidXQgdGhlcmUncyBiZWVuIGEgZ2FwIHdoZW4gaXQgY29t ZXMgdG8gcGVyZm9ybWFuY2UgYW5kIGhpZ2gtbGV2ZWwNCiAgYWJzdHJhY3Rpb25zIGZvciBidWls ZGluZyBjb21wbGV4IFVJcy4NCg0KICBNb3NhaWMgYWltcyB0byBmaWxsIHRoYXQgZ2FwIGJ5IHBy b3ZpZGluZyBNYXRyaXggYXMgYSBzb2xpZCB0ZXJtaW5hbA0KICBmb3VuZGF0aW9uLCBhbmQgYnVp bGRpbmcgYSBoaWdoLWxldmVsIFRFQSBmcmFtZXdvcmsgd2l0aCBsYXlvdXQgYW5kDQogIGNvbXBv bmVudHMgb24gdG9wLg0KDQogIE9uIGEgcGVyc29uYWwgc2lkZSwgSSdtIGJ1aWxkaW5nIE1vc2Fp YyB0byBwb3dlciB0aGUgdHdvIHByb2plY3RzIEknbQ0KICBjdXJyZW50bHkgd29ya2luZyBvbjoN Cg0KICDigKIgSXQgd2lsbCBiZSB0aGUgYmFzaXMgZm9yIGEgVFVJIGRhc2hib2FyZCBmb3IgbW9u aXRvcmluZyBtb2RlbA0KICAgIHRyYWluaW5nIGluIFtSYXZlbl0uIFdlJ3JlIHN0YXJ0aW5nIGFu IFtPdXRyZWFjaHldIGludGVybnNoaXAgdG8NCiAgICBidWlsZCB0aGlzIG91dCB0aGlzIE1vbmRh eS4NCiAg4oCiIEl0IHBvd2VycyBTcGljZSwgdGhlIHVwY29taW5nIE9DYW1sIGNvZGluZyBhZ2Vu dCBJIGFubm91bmNlZCBhdA0KICAgIFtGdW5PQ2FtbCAyMDI1XS4NCg0KDQpbUmF2ZW5dIDxodHRw czovL2dpdGh1Yi5jb20vcmF2ZW4tbWwvcmF2ZW4+DQoNCltPdXRyZWFjaHldIDxodHRwczovL3d3 dy5vdXRyZWFjaHkub3JnLz4NCg0KW0Z1bk9DYW1sIDIwMjVdIDxodHRwczovL3d3dy55b3V0dWJl LmNvbS93YXRjaD92PUJBdlhxZDBRZVZNPg0KDQoNClRyeSBJdCBOb3cNCuKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjA0KDQogIFRoZSBsaWJyYXJpZXMgYXJlbid0IG9uIG9wYW0geWV0LCBi dXQgeW91IGNhbiB0cnkgdGhlbSB0b2RheToNCg0KICAqT3B0aW9uIDE6IFBpbiBmcm9tIEdpdEh1 YioNCg0KICDilIzilIDilIDilIDilIANCiAg4pSCIG9wYW0gcGluIGFkZCBodHRwczovL2dpdGh1 Yi5jb20vdG1hdHRpby9tb3NhaWMuZ2l0DQogIOKUlOKUgOKUgOKUgOKUgA0KDQogICpPcHRpb24g MjogQnVpbGQgZnJvbSBzb3VyY2UqDQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBnaXQgY2xv bmUgaHR0cHM6Ly9naXRodWIuY29tL3RtYXR0aW8vbW9zYWljDQogIOKUgiBjZCBtb3NhaWMNCiAg 4pSCIG9wYW0gaW5zdGFsbCAuIC0tZGVwcy1vbmx5DQogIOKUgiBkdW5lIGJ1aWxkDQogIOKUlOKU gOKUgOKUgOKUgA0KDQogIFRoZW4gcnVuIHNvbWUgZXhhbXBsZXM6DQoNCiAg4pSM4pSA4pSA4pSA 4pSADQogIOKUgiAjIEludGVyYWN0aXZlIEdhbWUgb2YgTGlmZSAocG9ydGVkIGZyb20gTm90dHkg ZXhhbXBsZXMpDQogIOKUgiBkdW5lIGV4ZWMgLi9tYXRyaXgvZXhhbXBsZXMvMDItbGlmZS9tYWlu LmV4ZQ0KICDilIIgDQogIOKUgiAjIFBhcnRpY2xlcyBzaW11bGF0aW9uIHdpdGggbXVsdGlwbGUg ZGlzcGxheSBtb2Rlcw0KICDilIIgZHVuZSBleGVjIC4vbWF0cml4L2V4YW1wbGVzLzE0LXBhcnRp Y2xlcy9tYWluLmV4ZQ0KICDilIIgDQogIOKUgiAjIEhpZ2gtbGV2ZWwgVEVBIGNvdW50ZXINCiAg 4pSCIGR1bmUgZXhlYyAuL21vc2FpYy9leGFtcGxlcy8wMS1jb3VudGVyL21haW4uZXhlDQogIOKU lOKUgOKUgOKUgOKUgA0KDQogIEhhdmUgYSBsb29rIGF0IHRoZSBleGFtcGxlcyBkaXJlY3Rvcmll cyAoW01hdHJpeF0gYW5kIFtNb3NhaWNdKSBmb3INCiAgbW9yZSBkZW1vcyB0byBleHBsb3JlIQ0K DQogIEFzIGEgYm9udXMsIHdlIGFsc28gaGF2ZSBtb3JlIGNvbXBsZXRlIGRlbW9zIGZvciBib3Ro IHByb2plY3RzOg0KDQogIOKAoiBBIGdyYXBoaWNhbCB0ZXJtaW5hbCBlbXVsYXRvciBidWlsdCB3 aXRoIE1hdHJpeDoNCiAgICA8aHR0cHM6Ly9naXRodWIuY29tL3RtYXR0aW8vbW9zYWljL3RyZWUv bWFpbi9tYXRyaXgvZXhhbXBsZXMveC1lbXVsYXRvcj4NCiAg4oCiIEEgZGFzaGJvYXJkIGFwcCBi dWlsdCB3aXRoIE1vc2FpYzoNCiAgICA8aHR0cHM6Ly9naXRodWIuY29tL3RtYXR0aW8vbW9zYWlj L3RyZWUvbWFpbi9tb3NhaWMvZXhhbXBsZXMveC1kYXNoYm9hcmQ+DQoNCg0KW01hdHJpeF0gPGh0 dHBzOi8vZ2l0aHViLmNvbS90bWF0dGlvL21vc2FpYy90cmVlL21haW4vbWF0cml4L2V4YW1wbGVz Pg0KDQpbTW9zYWljXSA8aHR0cHM6Ly9naXRodWIuY29tL3RtYXR0aW8vbW9zYWljL3RyZWUvbWFp bi9tb3NhaWMvZXhhbXBsZXM+DQoNCg0KUXVpY2sgRXhhbXBsZXMNCuKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQril4ogTW9zYWljOiBUaGUgRWxtIEFyY2hpdGVj dHVyZQ0KDQogIE1vc2FpYyBmb2xsb3dzIFRFQSBmb3IgYnVpbGRpbmcgZGVjbGFyYXRpdmUgVUlz Og0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgb3BlbiBNb3NhaWNfdGVhDQogIOKUgiANCiAg 4pSCIHR5cGUgbXNnID0gSW5jcmVtZW50IHwgRGVjcmVtZW50IHwgUXVpdA0KICDilIIgDQogIOKU giBsZXQgaW5pdCAoKSA9ICgwLCBDbWQubm9uZSkNCiAg4pSCIA0KICDilIIgbGV0IHVwZGF0ZSBt c2cgbW9kZWwgPQ0KICDilIIgICBtYXRjaCBtc2cgd2l0aA0KICDilIIgICB8IEluY3JlbWVudCAt PiAobW9kZWwgKyAxLCBDbWQubm9uZSkNCiAg4pSCICAgfCBEZWNyZW1lbnQgLT4gKG1vZGVsIC0g MSwgQ21kLm5vbmUpDQogIOKUgiAgIHwgUXVpdCAtPiAobW9kZWwsIENtZC5xdWl0KQ0KICDilIIg DQogIOKUgiBsZXQgdmlldyBtb2RlbCA9DQogIOKUgiAgIGJveCB+YWxpZ25faXRlbXM6Q2VudGVy IH5qdXN0aWZ5X2NvbnRlbnQ6Q2VudGVyDQogIOKUgiAgICAgfnNpemU6eyB3aWR0aCA9IHBjdCAx MDA7IGhlaWdodCA9IHBjdCAxMDAgfQ0KICDilIIgICAgIFsNCiAg4pSCICAgICAgIGJveCB+Zmxl eF9kaXJlY3Rpb246Q29sdW1uIH5hbGlnbl9pdGVtczpDZW50ZXIgfmdhcDooZ2FwIDEpDQogIOKU giAgICAgICAgIH5ib3JkZXI6dHJ1ZSB+cGFkZGluZzoocGFkZGluZyAyKSB+dGl0bGU6IkNvdW50 ZXIiDQogIOKUgiAgICAgICAgIFsNCiAg4pSCICAgICAgICAgICB0ZXh0IH5jb250ZW50OihQcmlu dGYuc3ByaW50ZiAiQ291bnQ6ICVkIiBtb2RlbCkgKCk7DQogIOKUgiAgICAgICAgICAgdGV4dCB+ Y29udGVudDoiUHJlc3MgKyBvciAtIHRvIGNoYW5nZSwgcSB0byBxdWl0IiAoKTsNCiAg4pSCICAg ICAgICAgXTsNCiAg4pSCICAgICBdDQogIOKUgiANCiAg4pSCIGxldCBzdWJzY3JpcHRpb25zIF9t b2RlbCA9DQogIOKUgiAgIFN1Yi5vbl9rZXkgKGZ1biBldiAtPg0KICDilIIgICAgICAgbWF0Y2gg KE1vc2FpY191aS5FdmVudC5LZXkuZGF0YSBldikua2V5IHdpdGgNCiAg4pSCICAgICAgIHwgQ2hh ciBjIHdoZW4gVWNoYXIuZXF1YWwgYyAoVWNoYXIub2ZfY2hhciAnKycpIC0+IFNvbWUgSW5jcmVt ZW50DQogIOKUgiAgICAgICB8IENoYXIgYyB3aGVuIFVjaGFyLmVxdWFsIGMgKFVjaGFyLm9mX2No YXIgJy0nKSAtPiBTb21lIERlY3JlbWVudA0KICDilIIgICAgICAgfCBDaGFyIGMgd2hlbiBVY2hh ci5lcXVhbCBjIChVY2hhci5vZl9jaGFyICdxJykgLT4gU29tZSBRdWl0DQogIOKUgiAgICAgICB8 IEVzY2FwZSAtPiBTb21lIFF1aXQNCiAg4pSCICAgICAgIHwgXyAtPiBOb25lKQ0KICDilIIgDQog IOKUgiBsZXQgKCkgPSBydW4geyBpbml0OyB1cGRhdGU7IHZpZXc7IHN1YnNjcmlwdGlvbnMgfQ0K ICDilJTilIDilIDilIDilIANCg0KDQril4ogTWF0cml4OiBMb3ctTGV2ZWwgUG93ZXINCg0KICBG b3IgZGlyZWN0IHRlcm1pbmFsIGNvbnRyb2wsIE1hdHJpeCBwcm92aWRlcyBhbiBpbW1lZGlhdGUt bW9kZSBBUEk6DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBvcGVuIE1hdHJpeA0KICDilIIg DQogIOKUgiBsZXQgKCkgPQ0KICDilIIgICBydW4NCiAg4pSCICAgICB+b25fcmVuZGVyOihmdW4g X2N0eCAtPg0KICDilIIgICAgICAgSW1hZ2UuKA0KICDilIIgICAgICAgICBzdHJpbmcgIkhlbGxv IGZyb20gTWF0cml4ISIgfD4gYmcgQ29sb3IuYmx1ZSB8PiBwYWQgfmw6MiB+dDoxKSkNCiAg4pSC ICAgICB+b25faW5wdXQ6KGZ1biBjdHggLT4gZnVuY3Rpb24NCiAg4pSCICAgICAgIHwgS2V5IHsg a2V5ID0gRXNjYXBlOyBfIH0gLT4gcXVpdCBjdHgNCiAg4pSCICAgICAgIHwgXyAtPiAoKSkNCiAg 4pSCICAgICAoKQ0KICDilJTilIDilIDilIDilIANCg0KDQpDb21pbmcgU29vbjogVFVJIGZvciBN TCBUcmFpbmluZw0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAg V2UncmUgc3RhcnRpbmcgYW4gW091dHJlYWNoeV0gaW50ZXJuc2hpcCB0byBidWlsZCBhIFRVSSBm b3IgbW9uaXRvcmluZw0KICBtb2RlbCB0cmFpbmluZyB3aXRoIFtSYXZlbl0sIHRoZSBzY2llbnRp ZmljIGNvbXB1dGluZyBlY29zeXN0ZW0gZm9yDQogIE9DYW1sLiBJdCB3aWxsIHByb3ZpZGUgYSBb VGVuc29yQm9hcmRdIGV4cGVyaWVuY2UgaW4gdGhlIHRlcm1pbmFsLA0KICBidWlsdCBlbnRpcmVs eSB3aXRoIE1vc2FpYy4NCg0KICBBIGdvb2QgZXhhbXBsZSBvZiB3aGF0IHdlJ3JlIGFpbWluZyB0 byBidWlsZCBpcyBXYW5kYidzIG5ld2x5IHJlbGVhc2VkDQogIFRVSToNCg0KICA8aHR0cHM6Ly91 czEuZGlzY291cnNlLWNkbi5jb20vZmxleDAyMC91cGxvYWRzL29jYW1sL29wdGltaXplZC8yWC8x LzFhMDMwMzQxOGZiYTY0YmI0YTE2OGU0YWUxNDg4NTkyZDNjYjk2YzBfMl8xMzgweDgxNC5qcGVn Pg0KDQoNCltPdXRyZWFjaHldIDxodHRwczovL3d3dy5vdXRyZWFjaHkub3JnLz4NCg0KW1JhdmVu XSA8aHR0cHM6Ly9naXRodWIuY29tL3JhdmVuLW1sL3JhdmVuPg0KDQpbVGVuc29yQm9hcmRdIDxo dHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy90ZW5zb3Jib2FyZD4NCg0KDQpNb3NhaWMgdnMgTm90 dHkNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIE5v dHR5IGlzIHRoZSBjdXJyZW50IGdvLXRvIHRlcm1pbmFsIFVJIGxpYnJhcnkgZm9yIE9DYW1sLCB3 aXRoIGENCiAgd2VsbC1kZXNpZ25lZCBkZWNsYXJhdGl2ZSBpbWFnZSBBUEkuIE1vc2FpYyBzaXRz IGEgbGV2ZWwgYWJvdmU6IGl04oCZcyBhDQogIFRFQSBydW50aW1lIHdpdGggZmxleGJveCBsYXlv dXQsIHJpY2ggY29tcG9uZW50cywgZm9jdXMvZXZlbnQNCiAgYnViYmxpbmcsIGFuZCBkaWZmZWQg cmVuZGVyaW5nIHZpYSBNYXRyaXguIEluIHNjb3BlLCBOb3R0eSBpcyBjbG9zZXINCiAgdG8gTWF0 cml4ICh0aGUgdGVybWluYWwgaW5mcmFzdHJ1Y3R1cmUgdW5kZXIgTW9zYWljKSB0aGFuIHRvIE1v c2FpYw0KICBpdHNlbGYuDQoNCiAgTWF0cml4IGNvdmVycyB0aGUgbG93LWxldmVsIHJlbmRlcmlu ZywgbW9kZXJuIHRlcm1pbmFsIHByb3RvY29scywgYW5kDQogIGltbWVkaWF0ZS1tb2RlIEFQSSB0 aGF0IE5vdHR5IGRvZXNu4oCZdC4gRm9yIGEgZGV0YWlsZWQgTWF0cml4IHZzIE5vdHR5DQogIGNv bXBhcmlzb24sIHNlZSBvdXIgW2NvbXBhcmlzb24gdGFibGVdLg0KDQoNCltjb21wYXJpc29uIHRh YmxlXQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS90bWF0dGlvL21vc2FpYy90cmVlL21haW4vbWF0cml4 I21hdHJpeC12cy1ub3R0eT4NCg0KDQpBY2tub3dsZWRnZW1lbnRzDQrilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBNb3NhaWMgc3RhbmRzIG9uIHRo ZSBzaG91bGRlcnMgb2YgZ3JlYXQgd29yazoNCg0KICDigKIgW0J1YmJsZSBUZWFdIC0gaW5zcGly YXRpb24gZm9yIHRoZSBoaWdoLWxldmVsIFRFQSBydW50aW1lIGFuZCBhcHANCiAgICBzdHJ1Y3R1 cmUuDQogIOKAoiBbTm90dHldIC0gTWF0cml4J3MgZGVjbGFyYXRpdmUgSW1hZ2UgQVBJIGlzIGRp cmVjdGx5IGNvcGllZCBmcm9tDQogICAgTm90dHkncyB0byBwcm92aWRlIGEgZmFtaWxpYXIgaW50 ZXJmYWNlIGZvciBPQ2FtbCB1c2Vycy4NCiAg4oCiIFtPcGVuVFVJXSAtIHRoZSBiaWdnZXN0IGlu Zmx1ZW5jZSBvbiBNb3NhaWMgVUkgaW50ZXJuYWxzIChyZW5kZXINCiAgICB0cmVlLCB0ZXh0IGJ1 ZmZlciwgZXZlbnRzLCBzZWxlY3Rpb24pLiBNb3NhaWMncyBVSSBpbnRlcm5hbHMgaGF2ZQ0KICAg IGJlZW4gcmV3cml0dGVuIHRvIG1pcnJvciBPcGVuVFVJJ3MgZm9sbG93aW5nIGl0cyByZWxlYXNl LCBpZiB5b3UncmUNCiAgICB3b3JraW5nIGluIFR5cGVTY3JpcHQsIEkgY2FuJ3QgcmVjb21tZW5k IGl0IGVub3VnaCwgaXQncyBhIGZhbnRhc3RpYw0KICAgIHBpZWNlIG9mIGVuZ2luZWVyaW5nLg0K ICDigKIgW1JpY2hdIGFuZCBbVGV4dHVhbF0gLSBmb3IgaWRlYXMgb24gcmljaCB0ZXh0LCBkaWFn bm9zdGljcywgYW5kDQogICAgcG9saXNoZWQgdGVybWluYWwgVVguDQoNCg0KW0J1YmJsZSBUZWFd IDxodHRwczovL2dpdGh1Yi5jb20vY2hhcm1icmFjZWxldC9idWJibGV0ZWE+DQoNCltOb3R0eV0g PGh0dHBzOi8vZ2l0aHViLmNvbS9wcXd5L25vdHR5Lz4NCg0KW09wZW5UVUldIDxodHRwczovL2dp dGh1Yi5jb20vc3N0L29wZW50dWkvPg0KDQpbUmljaF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9UZXh0 dWFsaXplL3JpY2gvPg0KDQpbVGV4dHVhbF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9UZXh0dWFsaXpl L3RleHR1YWw+DQoNCg0KRmVlZGJhY2sgV2VsY29tZQ0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgVGhpcyBpcyBhbiBlYXJseSBwcmV2aWV3LiBB UElzIGFyZSBzdGFiaWxpemluZyBidXQgbWF5IGNoYW5nZS4gSSdkDQogIGxvdmUgeW91ciBmZWVk YmFjayBvbjoNCg0KICDigKIgQVBJIGVyZ29ub21pY3MNCiAg4oCiIE1pc3NpbmcgY29tcG9uZW50 cyBvciBmZWF0dXJlcyB5b3UgbmVlZA0KICDigKIgUGVyZm9ybWFuY2Ugb24geW91ciB0ZXJtaW5h bA0KICDigKIgQnVncyAocGxlYXNlIG9wZW4gaXNzdWVzISkNCg0KICBHaXZlIGl0IGEgdHJ5IGFu ZCBsZXQgbWUga25vdyB3aGF0IHlvdSB0aGluayENCg0KDQpNYWtpbmcgaHRtbF9vZl9qc3ggfjEw eCBmYXN0ZXINCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6 DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvbWFraW5nLWh0bWwtb2YtanN4LTEweC1m YXN0ZXIvMTc1NzkvMT4NCg0KDQpEYXZpZCBTYW5jaG8gYW5ub3VuY2VkDQrilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0K ICBIZWxsbyBvY2FtbGVycywNCg0KICBJIHdyb3RlIGEgYmxvZyBwb3N0IGFib3V0IHNvbWUgb3B0 aW1pemF0aW9ucyBJIG1hZGUgaW4gW2h0bWxfb2ZfanN4XQ0KDQogIDxodHRwczovL3NhbmNoby5k ZXYvYmxvZy9tYWtpbmctaHRtbC1vZi1qc3gtMTB4LWZhc3Rlcj4NCg0KICBJIHdhbnRlZCB0byBz aGFyZSBpdCBzaW5jZSB0aG9zZSB0cmlja3MgYXJlIG9ubHkgcG9zc2libGUgYXQgdGhlDQogIHBy ZXByb2Nlc3Mgc3RhZ2UsIGFuZCBhIGxpYnJhcnkgd291bGQgZmFsbCBzaG9ydC4gaHRtbF9vZl9q c3ggaXMgYQ0KICBzbWFsbCBsaWJyYXJ5IHRoYXQgaXMgdXNlZCBpbiBhIGZldyBwbGFjZXMsIGJ1 dCBhbHNvIGEgcGxheWdyb3VuZCBmb3INCiAgc2VydmVyLXJlYXNvbi1yZWFjdCAoYSBiaWdnZXIg cHJvamVjdCkuDQoNCiAgQW55d2F5LCBJJ20gc3RpbGwgZ2V0dGluZyB1c2VkIHRvIHNoYXJlIHNv bWUgb2YgdGhlIGxvbmcgZm9ybXMgb2YNCiAgY29udGVudCwgc28gZmVlbCBmcmVlIHRvIGdpdmUg bWUgc29tZSBmZWVkYmFjay9jb3JyZWN0aW9ucyBvciBhc2sgYW55DQogIHF1ZXN0aW9uLg0KDQoN CltodG1sX29mX2pzeF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9kYXZlc254L2h0bWxfb2ZfanN4Lz4N Cg0KDQpUeXJlIC0gdHlwZS1zYWZlIHJlZ3VsYXIgZXhwcmVzc2lvbnMgMS4wDQrilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0K ICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi10eXJlLXR5cGUt c2FmZS1yZWd1bGFyLWV4cHJlc3Npb25zLTEtMC8xNzU4NC8xPg0KDQoNCkVtaWxlIFRyb3RpZ25v biBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEkgYW0gaGFwcHkgdG8gYW5ub3Vu Y2UgdGhlIHJlbGVhc2Ugb2YgW1R5cmVdIDEuMC4NCg0KICBUaGlzIHJlbGVhc2UgbWFrZXMgYmln IGNoYW5nZXMgdG8gdGhlIHR5cGluZzogdGhlcmUgaXMgYSB3aG9sZSBob3N0IG9mDQogIGZhciBt b3JlIHByYWN0aWNhbCBjb21iaW5hdG9ycyBhbGxvd2luZyB5b3UgdG8gd3JpdGUgY29kZSBsaWtl IGluIGENCiAgcGFyc2VyIGNvbWJpbmF0b3IgbGlicmFyeSA6DQoNCiAg4pSM4pSA4pSA4pSA4pSA DQogIOKUgiBsZXQgdXJsID0NCiAg4pSCICAgbGV0KyBzY2hlbWUgPSBvcHQgKGNvbnN0IEh0dHAg KHN0ciAiaHR0cCIpIDx8PiBjb25zdCBIdHRwcyAoc3RyICJodHRwIikgPCogc3RyICI6Ly8iKSAN CiAg4pSCICAgYW5kKyBob3N0ID0gcmVwX2FueQ0KICDilIIgICBhbmQrIHBvcnQgPSBvcHQgKHN0 ciAiOiIgKj4gcG9zX2ludCkNCiAg4pSCICAgYW5kKyBwYXRoID0gbGlzdCAoc3RyICIvIiAqPiBy ZXBfYW55KQ0KICDilIIgICBpbg0KICDilIIgICAoc2NoZW1lLCBob3N0LCBwb3J0LCBwYXRoKQ0K ICDilJTilIDilIDilIDilIANCiAgKHRoaXMgaXMgbm90IGEgY29ycmVjdCB1cmwgcGFyc2VyIGJ5 IGFueSBtZWFucywgaXRzIGp1c3QgdG8gZ2l2ZSBhbg0KICBpZGVhIG9mIGhvdyB5b3UgY2FuIHVz ZSB0aGlzIGxpYikNCg0KICBUaGlzIGRvZXMgbm90IGFsbG93IHlvdSB0byB1c2UgYGV2YWwnLCBi ZWNhdXNlIG9ubHkgb25lIGRpcmVjdGlvbiBvZg0KICB0aGUgY29udmVyc2lvbiBpcyBnaXZlbiAo dGhlcmUgaXMgbm8gY29kZSB0byBjb252ZXJ0IGZyb20gYSB1cmwNCiAgdHVwbGUpLiBIb3dldmVy IGluIHRoZSBjYXNlcyB3aGVyZSB5b3UgZG9uJ3QgbmVlZCBgZXZhbCcgdGhpcyBpcyBmYXINCiAg ZWFzaWVyIHRvIHdyaXRlLiBUaGUgZGlmZmVyZW5jZSBpcyB0eXBlZCwgeW91IGNhbid0IGdldCBy dW50aW1lIGVycm9yDQogIGJ5IGNhbGxpbmcgZXZhbCBvbiB0aGUgd3JvbmcgcmVnZXguDQoNCiAg VGhlcmUgYXJlIGFsc28gY29udmVuY2llbmNlIGNoYW5nZXMgc3VjaCBhcyBjaGFyc2V0IGFuZCB0 aGUNCiAgYG1hdGNoZWRfc3RyaW5nJyBmdW5jdGlvbiwgdGhhdCByZWR1Y2UgdGhlIG5lZWQgdG8g aW5zZXJ0IGBSZScgYml0cyBpbg0KICB5b3VyIHJlZ2V4cC4NCg0KICBIZXJlIGlzIHRoZSBmdWxs IGNoYW5nZWxvZzoNCg0KICDigKIgSW50cm9kdWNlIGNoYXJzZXRzOiBjb250cmFyeSB0byBgUmUn LCB0aGV5IGhhdmUgYSBkaWZmZXJlbnQgdHlwZQ0KICAgIGZyb20gcmVnZXguDQogIOKAoiBUeXBl IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gcmVnZXhwcyB0aGF0IGNhbiBiZSBldmFsdWF0ZWQgcmV2 ZXJzZWQNCiAgICBhbmQgdGhlIG9uZXMgdGhhdCBjYW5ub3Q6IGAoZXZhbHVhYmxlLCAnYSkgVHly ZS50JyBhbmQNCiAgICBgKG5vbl9ldmFsdWFibGUsICdhKSBUeXJlLnQnLg0KICDigKIgSW50cm9k dWNlIGFsaWFzIGB0eXBlIHBhdHRlcm4nIGZvciBgKG5vbl9ldmFsdWFibGUsICdhKSBUeXJlLnQn Lg0KICDigKIgSW50cm9kdWNlIGB2YWwgbGlmdCA6ICgnYSAtPiBzdHJpbmcpIC0+ICdhIHBhdHRl cm4gLT4gKCdlLCAnYSkgdCcgdG8NCiAgICB0cmFuc2Zvcm0gYSBwYXR0ZXJuIGludG8gYW4gZXhw cmVzc2lvbiBieSBnaXZpbmcgYW4gZXhwbGljaXQNCiAgICBjb252ZXJzaW9uIGZ1bmN0aW9uLiAg QWxzbyBgbGlmdHBwJyB0aGF0IGRvZXMgdGhlIHNhbWUgd2l0aCBiZXR0ZXINCiAgICBwZXJmb3Jt YW5jZSBieSB1c2luZyBgRm9ybWF0Jy4NCiAg4oCiIEludHJvZHVjZSBgdmFsIHVubGlmdCA6IChl dmFsdWFibGUsICdhKSB0IC0+ICdhIHBhdHRlcm4nLg0KICDigKIgSW50cm9kdWNlIGB2YWwgZWl0 aGVyOiAoJ2UsICdhKSBUeXJlLnQgLT4gKCdlLCAnYikgVHlyZS50IC0+ICgnZSwNCiAgICAoJ2Es ICdiKSBFaXRoZXIudCkgVHlyZS50Jy4NCiAg4oCiIENoYW5nZSB0aGUgdHlwZSBvZiBgYWx0JyB0 byBgKF8sICdhKSB0IC0+IChfLCAnYSkgdCAtPiAnYQ0KICAgIHBhdHRlcm4nLiBQcmV2aW91cyB1 c2VycyBvZiBgYWx0JyBzaG91bGQgc3dpdGNoIHRvIGBlaXRoZXInLg0KICDigKIgSW50cm9kdWNl IGB+dmFsIGFsdF9ldmFsOiAoJ2EgLT4gW35MZWZ0IHwgflJpZ2h0XSkgLT4gKCdlLCAnYSkgdCAt Pg0KICAgICgnZSwgJ2EpIHQgLT4gKCdlLCAnYSkgdH4nIFRoaXMgaGFzIGZsYXQgdHlwaW5nIGJ1 dCBpcyBjb21wYXRpYmxlDQogICAgd2l0aCBgZXZhbCcuDQogIOKAoiBPcGVyYXRvcnM6IGA8fD4n IGlzIGBhbHQnLCBgPHx8PicgaXMgYGVpdGhlcicuDQogIOKAoiBJbnRyb2R1Y2UgYHZhbCBtYXAg OiAoJ2EgLT4gJ2IpIC0+IChfLCAnYSkgdCAtPiAnYiBwYXR0ZXJuJyBhbmQgaXRzDQogICAgY29y cmVzcG9uZGluZyBvcGVyYXRvcnM6IGBsZXQrJyBhbmQgYDwkPicuDQogIOKAoiBJbnRyb2R1Y2Ug YChhbmQrKScgd2hpY2ggaXMgYW4gYWxpYXMgb2YgYHNlcScuDQogIOKAoiBJbnRyb2R1Y2UgYHZh bCBhcHA6ICgnZSwgJ2EgLT4gJ2IpIHQgLT4gKCdlLCAnYSkgdCAtPiAnYiBwYXR0ZXJuJw0KICAg IGFuZCBpdHMgY29ycmVzcG9uZGluZyBvcGVyYXRvciBgPCo+Jw0KICDigKIgSW50cm9kdWNlIGB2 YWwgbWF0Y2hlZF9zdHJpbmcgOiAoXywgJ2EpIHQgLT4gKF8sIHN0cmluZykgdCcgdGhhdA0KICAg IGRpc2NhcmRzIHRoZSBjb21wdXRlZCB2YWx1ZSBhbmQganVzdCByZXR1cm4gdGhlIHN0cmluZyB0 aGF0IHdhcw0KICAgIG1hdGNoZWQuDQogIOKAoiBEcm9wIGRlcGVuZGVuY3kgb24gYFJlc3VsdCcg bGlicmFyeS4gU3RkbGliIGlzIG5vdyB1c2VkLg0KICDigKIgSW50cm9kdWNlIGB2YWwgcmVwX2No YXJzZXQ6IENoYXJzZXQudCAtPiAoXywgc3RyaW5nKSB0JywgYW5kDQogICAgc2hvcnRjdXQgYHZh bCByZXBfYW55OiAoXywgc3RyaW5nKSB0Jy4NCg0KDQpbVHlyZV0gPGh0dHBzOi8vZ2l0aHViLmNv bS9EcnVwL3R5cmUvPg0KDQoNClBvcnRpbmcgYW4gT3hDYW1sIFByb2plY3QgdG8gRHVuZSBQYWNr YWdlIE1hbmFnZW1lbnQNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYmxvZy1wb3J0 aW5nLWFuLW94Y2FtbC1wcm9qZWN0LXRvLWR1bmUtcGFja2FnZS1tYW5hZ2VtZW50LzE3NTgyLzE+ DQoNCg0KU3VkaGEgUGFyaW1hbGEgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBJIHJl Y2VudGx5IHdvcmtlZCBvbiBwb3J0aW5nIHRoZSBbT3hDYW1sIHR1dG9yaWFsXSB0byBidWlsZCB3 aXRoIER1bmUNCiAgUGFja2FnZSBNYW5hZ2VtZW50LiBXaGF0IHdhcyBpbml0aWFsbHkgYW50aWNp cGF0ZWQgYXMgYQ0KICBzdHJhaWdodGZvcndhcmQgY2hhbmdlIGVuZGVkIHVwIHVuY292ZXJpbmcg YSBmZXcgaXNzdWVzIGFuZCByZXF1aXJpbmcNCiAgc2V2ZXJhbCBwYXRjaGVzLiBJIHdyb3RlIGFi b3V0IHRoZSBleHBlcmllbmNlIGhlcmU6DQogIDxodHRwczovL3RlbnNvcnMuaW5rL3Bvc3RzL294 Y2FtbC1kdW5lLXBrZz4uIEFueSBxdWVzdGlvbnMgb3IgZmVlZGJhY2sNCiAgd2VsY29tZSENCg0K DQpbT3hDYW1sIHR1dG9yaWFsXSA8aHR0cHM6Ly9naXRodWIuY29tL294Y2FtbC90dXRvcmlhbC1p Y2ZwMjU+DQoNCg0KT3RoZXIgT0NhbWwgTmV3cw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCkZyb20gdGhlIG9jYW1sLm9yZyBibG9nDQrilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIANCg0KICBIZXJlIGFyZSBsaW5rcyBmcm9tIG1hbnkgT0NhbWwgYmxvZ3MgYWdncmVnYXRl ZCBhdCBbdGhlIG9jYW1sLm9yZw0KICBibG9nXS4NCg0KICDigKIgW0lDRlAgMjAyNTogTG9va2lu ZyBCYWNrIGF0IHRoZSBCaWdnZXN0IEZ1bmN0aW9uYWwgUHJvZ3JhbW1pbmcNCiAgICBDb25mZXJl bmNlIG9mIHRoZSBZZWFyXQ0KICDigKIgW0ZvdW5kYXRpb25hbCBBSSBmb3IgRWNvc3lzdGVtIFJl c2lsaWVuY2Ugd29ya3Nob3BdDQogIOKAoiBbVGlsZSBTZXJ2ZXJdDQogIOKAoiBbQSBWaXNpb24g Zm9yIE9DYW1sIGluIHRoZSBBSSBFcmEgLSBUaGliYXV0IE1hdHRpbyAtIEZVTiBPQ2FtbCAyMDI1 XQ0KDQoNClt0aGUgb2NhbWwub3JnIGJsb2ddIDxodHRwczovL29jYW1sLm9yZy9ibG9nLz4NCg0K W0lDRlAgMjAyNTogTG9va2luZyBCYWNrIGF0IHRoZSBCaWdnZXN0IEZ1bmN0aW9uYWwgUHJvZ3Jh bW1pbmcNCkNvbmZlcmVuY2Ugb2YgdGhlIFllYXJdDQo8aHR0cHM6Ly90YXJpZGVzLmNvbS9ibG9n LzIwMjUtMTItMDQtaWNmcC0yMDI1LWxvb2tpbmctYmFjay1hdC10aGUtYmlnZ2VzdC1mdW5jdGlv bmFsLXByb2dyYW1taW5nLWNvbmZlcmVuY2Utb2YtdGhlLXllYXI+DQoNCltGb3VuZGF0aW9uYWwg QUkgZm9yIEVjb3N5c3RlbSBSZXNpbGllbmNlIHdvcmtzaG9wXQ0KPGh0dHBzOi8vYW5pbC5yZWNv aWwub3JnL25vdGVzL2ZvdW5kYXRpb25hbC1lY29zeXN0ZW0td29ya3Nob3A+DQoNCltUaWxlIFNl cnZlcl0gPGh0dHBzOi8vd3d3LnR1bmJ1cnkub3JnLzIwMjUvMTIvMDIvdGVzc2VyYS1zdGFjLz4N Cg0KW0EgVmlzaW9uIGZvciBPQ2FtbCBpbiB0aGUgQUkgRXJhIC0gVGhpYmF1dCBNYXR0aW8gLSBG VU4gT0NhbWwgMjAyNV0NCjxodHRwczovL3dhdGNoLm9jYW1sLm9yZy92aWRlb3Mvd2F0Y2gvYjk1 OWVlYWYtZThjMS00OGU0LTlkMTYtZjgwODRhN2JkZGE5Pg0KDQoNCk9sZCBDV04NCuKVkOKVkOKV kOKVkOKVkOKVkOKVkA0KDQogIElmIHlvdSBoYXBwZW4gdG8gbWlzcyBhIENXTiwgeW91IGNhbiBb c2VuZCBtZSBhIG1lc3NhZ2VdIGFuZCBJJ2xsIG1haWwNCiAgaXQgdG8geW91LCBvciBnbyB0YWtl IGEgbG9vayBhdCBbdGhlIGFyY2hpdmVdIG9yIHRoZSBbUlNTIGZlZWQgb2YgdGhlDQogIGFyY2hp dmVzXS4NCg0KICBJZiB5b3UgYWxzbyB3aXNoIHRvIHJlY2VpdmUgaXQgZXZlcnkgd2VlayBieSBt YWlsLCB5b3UgbWF5IHN1YnNjcmliZQ0KICB0byB0aGUgW2NhbWwtbGlzdF0uDQoNCiAgW0FsYW4g U2NobWl0dF0NCg0KDQpbc2VuZCBtZSBhIG1lc3NhZ2VdIDxtYWlsdG86YWxhbi5zY2htaXR0QHBv bHl0ZWNobmlxdWUub3JnPg0KDQpbdGhlIGFyY2hpdmVdIDxodHRwczovL2FsYW4ucGV0aXRlcG9t bWUubmV0L2N3bi8+DQoNCltSU1MgZmVlZCBvZiB0aGUgYXJjaGl2ZXNdIDxodHRwczovL2FsYW4u cGV0aXRlcG9tbWUubmV0L2N3bi9jd24ucnNzPg0KDQpbY2FtbC1saXN0XSA8aHR0cHM6Ly9zeW1w YS5pbnJpYS5mci9zeW1wYS9pbmZvL2NhbWwtbGlzdD4NCg0KW0FsYW4gU2NobWl0dF0gPGh0dHBz Oi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvPg0KDQo= --=-=-= 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 02 to 09, 20= 25.

editors dev-meeting: 15th of December about the ocaml.nv= im plugin

Charl=C3=A8ne_Gros announced

Hi!

We are organizing the next public dev meeting about editors for OCaml!

It will take place on December 15th at 5 pm.

The focus will be on the new NeoVim plugin for OCaml, which adds extra feat= ures to the classical lspconfig for standard LSP support, to p= rovide all of the Merlin features in Neovim.

We will explore why having this type of plugin is beneficial for maintainin= g OCaml editor tools, and we will dive into the codebase to understand how = it works and see what happens in Neovim.

For the agenda:

  • A tour-de-table to allow the participants who wish to do so to present = themselves and mention issues / PRs they are interested in.
  • Talk and Q&A
  • Discuss issues and pull requests that were tagged in advance or mention= ed during the tour-de-table.

Feel free to join!

Meeting link: https://meet= .google.com/qxr-zxge-fvg

Mosaic - A Modern Terminal User Interface Framework for OCaml = (Early Preview)

Thibaut Mattio announced

I'm excited to share an early preview of Mosaic, a modern terminal user interface framework for OCam= l.

What is Mosaic?

Mosaic is a high-level framework for building terminal user interfaces in O= Caml. It provides a TEA (The Elm Architecture) runtime with a CSS-compatibl= e flexbox layout engine and a rich set of composable components. It handles= text shaping (styling, wrapping, selection), focus and event bubbling, z-o= rdering, and responsive layout.

Under the hood, it builds on two libraries that can also be used independen= tly:

  • Matrix: a terminal runtime focused on performance and modern pro= tocols. Highlights: near-zero-allocation diffed rendering, immediate- mode = API, Kitty keyboard, SGR/URXVT/X10 mouse, bracketed paste, focus tracking, = inline/alt/split display modes, and built-in debug overlay/frame dumps. It = also provides a virtual terminal emulator (VTE) and pseudo-terminal (PTY) m= anagement subsystems.
  • Toffee: a CSS-compatible layout engine. It's a port of Rust=E2= =80=99s Taffy with Flex= box, CSS Grid, and Block layout; gap/padding/borders/titles; and layout cac= hing for efficiency.

Why Mosaic?

Terminal UIs are seeing a renaissance. Tools like Claude Code and OpenCode = have gotten people excited about what can be built in the terminal and the = TUI community is gaining momentum in other ecosystems.

OCaml has had LambdaTerm and Notty for terminal graphics for years, but the= re's been a gap when it comes to performance and high-level abstractions fo= r building complex UIs.

Mosaic aims to fill that gap by providing Matrix as a solid terminal founda= tion, and building a high-level TEA framework with layout and components on= top.

On a personal side, I'm building Mosaic to power the two projects I'm curre= ntly working on:

  • It will be the basis for a TUI dashboard for monitoring model training = in Raven. We're starting = an Outreachy internship to build= this out this Monday.
  • It powers Spice, the upcoming OCaml coding agent I announced at FunOCaml 2025.

Try It Now

The libraries aren't on opam yet, but you can try them today:

Option 1: Pin from GitHub

opam pin add https://github.com/tmattio/mosaic.git

Option 2: Build from source

git clone https://github.com/tmattio/mosaic
cd mosaic
opam install . --deps-only
dune build

Then run some examples:

# Interactive Game of Life (ported from Notty examples)
dune exec ./matrix/examples/02-life/main.exe

# Particles simulation with multiple display modes
dune exec ./matrix/examples/14-particles/main.exe

# High-level TEA counter
dune exec ./mosaic/examples/01-counter/main.exe

Have a look at the examples directories (Matrix and Mosaic) for more demo= s to explore!

As a bonus, we also have more complete demos for both projects:

Quick Examples

  • Mosaic: The Elm Architecture

    Mosaic follows TEA for building declarative UIs:

    open M=
    osaic_tea
    
    type msg =3D Increment | Decrement | Quit
    
    let init () =3D (0, Cmd.none)
    
    let update msg model =3D
      match msg with
      | Increment -> (model + 1, Cmd.none)
      | Decrement -> (model - 1, Cmd.none)
      | Quit -> (model, Cmd.quit)
    
    let view model =3D
      box ~align_items:Center ~justify_content:Center
        ~size:{ width=
     =3D pct 100; height =3D pct 100 }
        [
          box ~flex_directio=
    n:Column ~align_items:Center ~g=
    ap:(gap 1)
            ~border:<=
    span style=3D"color: #00824f;">true ~padding:(padding 2) ~title:"Count=
    er"
            [
              text ~content<=
    /span>:(Printf.sp=
    rintf "Count: %d" model) ();
              text ~content<=
    /span>:"Press + or - to change, q to quit"<=
    /span> ();
            ];
        ]
    
    let subscriptions _=
    model =3D
      Sub.on_key (fun ev ->
          match (Mosaic_ui.Event.Key.d=
    ata ev).key with
          | Char c when Uchar.equal c (Uchar.of_char '+') -> Some Increment
          | Char c when Uchar.equal c (Uchar.of_char '-') -> Some Decrement
          | Char c when Uchar.equal c (Uchar.of_char 'q') -> Some Quit
          | Escape -> Some Quit
          | _ -> None)
    
    let () =3D run { =
    init; update; view; subscriptions }
    
  • Matrix: Low-Level Power

    For direct terminal control, Matrix provides an immediate-mode API:

    open M=
    atrix
    
    let () =3D
      run
        ~on_render:(<=
    span style=3D"color: #006f00; font-weight: bold;">fun _ctx ->
          Image.(
            string "Hello from Matrix!" =
    |> bg Color.blue |=
    > pad ~l:2 ~t:1))
        ~on_input:(fun ctx -> function
          | Key { key =3D Escape; _ } -> quit ctx
          | _ -> ())
        ()
    

Coming Soon: TUI for ML Training

We're starting an Outreachy inte= rnship to build a TUI for monitoring model training with Raven, the scientific computing ecosystem f= or OCaml. It will provide a TensorBoard experience in the terminal, built entirely with Mosaic.

A good example of what we're aiming to build is Wandb's newly released TUI:

3D"1a0=

Mosaic vs Notty

Notty is the current go-to terminal UI library for OCaml, with a well-desig= ned declarative image API. Mosaic sits a level above: it=E2=80=99s a TEA ru= ntime with flexbox layout, rich components, focus/event bubbling, and diffe= d rendering via Matrix. In scope, Notty is closer to Matrix (the terminal i= nfrastructure under Mosaic) than to Mosaic itself.

Matrix covers the low-level rendering, modern terminal protocols, and immed= iate-mode API that Notty doesn=E2=80=99t. For a detailed Matrix vs Notty co= mparison, see our comparison table.

Acknowledgements

Mosaic stands on the shoulders of great work:

  • Bubble Tea -= inspiration for the high-level TEA runtime and app structure.
  • Notty - Matrix's declara= tive Image API is directly copied from Notty's to provide a familiar interf= ace for OCaml users.
  • OpenTUI - the biggest i= nfluence on Mosaic UI internals (render tree, text buffer, events, selectio= n). Mosaic's UI internals have been rewritten to mirror OpenTUI's following= its release, if you're working in TypeScript, I can't recommend it enough,= it's a fantastic piece of engineering.
  • Rich and Textual - for ideas on rich tex= t, diagnostics, and polished terminal UX.

Feedback Welcome

This is an early preview. APIs are stabilizing but may change. I'd love you= r feedback on:

  • API ergonomics
  • Missing components or features you need
  • Performance on your terminal
  • Bugs (please open issues!)

Give it a try and let me know what you think!

Making html_of_jsx ~10x faster

David Sancho announced

Hello ocamlers,

I wrote a blog post about some optimizations I made in html_of_jsx=20=20

https://s= ancho.dev/blog/making-html-of-jsx-10x-faster

I wanted to share it since those tricks are only possible at the preprocess= stage, and a library would fall short. html_of_jsx is a small library that= is used in a few places, but also a playground for server-reason-react (a = bigger project).

Anyway, I'm still getting used to share some of the long forms of content, = so feel free to give me some feedback/corrections or ask any question.

Tyre - type-safe regular expressions 1.0

Emile Trotignon announced

I am happy to announce the release of Tyre 1.0.

This release makes big changes to the typing: there is a whole host of far = more practical combinators allowing you to write code like in a parser comb= inator library :

let url =3D
  let+ scheme =3D opt (const Http (str "http") <=
;|> const Https (str "http") &=
lt;* str "://")=20
  and+ host =3D rep_any
  and+ port =3D opt (str ":" *> pos_int)
  and+ path =3D list (str "/" *> rep_any)
  in
  (scheme, host, port, path)

(this is not a correct url parser by any means, its just to give an idea of= how you can use this lib)

This does not allow you to use eval, because only one directio= n of the conversion is given (there is no code to convert from a url tuple)= . However in the cases where you don't need eval this is far e= asier to write. The difference is typed, you can't get runtime error by cal= ling eval on the wrong regex.

There are also convencience changes such as charset and the matched_s= tring function, that reduce the need to insert Re bits = in your regexp.

Here is the full changelog:

  • Introduce charsets: contrary to Re, they have a different = type from regex.
  • Type the difference between regexps that can be evaluated reversed and = the ones that cannot: (evaluable, 'a) Tyre.t and (non_evalua= ble, 'a) Tyre.t.
  • Introduce alias type pattern for (non_evaluable, 'a)= Tyre.t.
  • Introduce val lift : ('a -> string) -> 'a pattern -> ('e= , 'a) t to transform a pattern into an expression by giving an explicit conversion function. Also liftpp that does the same with better performance by usin= g Format.
  • Introduce val unlift : (evaluable, 'a) t -> 'a pattern.=
  • Introduce val either: ('e, 'a) Tyre.t -> ('e, 'b) Tyre.t ->= ('e, ('a, 'b) Either.t) Tyre.t.
  • Change the type of alt to (_, 'a) t -> (_, 'a) t = -> 'a pattern. Previous users of alt should switch to either.
  • Introduce ~val alt_eval: ('a -> [~Left | ~Right]) -> ('e, '= a) t -> ('e, 'a) t -> ('e, 'a) t~ This has flat typing but is compatible with eval.
  • Operators: <|> is alt, <||>= is either.
  • Introduce val map : ('a -> 'b) -> (_, 'a) t -> 'b patter= n and its corresponding operators: let+ and <$>.
  • Introduce (and+) which is an alias of seq.
  • Introduce val app: ('e, 'a -> 'b) t -> ('e, 'a) t -> 'b = pattern and its corresponding operator <*>
  • Introduce val matched_string : (_, 'a) t -> (_, string) t that discards the computed value and just return the string that was matched.
  • Drop dependency on Result library. Stdlib is now used.
  • Introduce val rep_charset: Charset.t -> (_, string) t, = and shortcut val rep_any: (_, string) t.

Porting an OxCaml Project to Dune Package Management

Sudha Parimala announced

I recently worked on porting the OxCaml tutorial to build with Dune Package Management. What= was initially anticipated as a straightforward change ended up uncovering = a few issues and requiring several patches. I wrote about the experience he= re: https://tensors.i= nk/posts/oxcaml-dune-pkg. Any questions or feedback welcome!

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.

--=-=-=--