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=IZ9cNkBq; 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 206E54009D for ; Tue, 1 Sep 2026 09:14:45 +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=j55Jbqs4B49Gh+ig7jNcv1db3PXbRQ3hJL9UhUJ7Ib8=; b=IZ9cNkBqj/WEW+QgAECoJilG1218Flm6fzwxa3Qe1VQl/2IddSzAaqGD QDuveRPv76Ln+2Vb6OOgH+5HaiIkHsuCxAxDVvYmLAblB8sHOj7CChxP0 64CdIem+XRgJr4tyINhp8Ba3hmBhif500KgbXhfiZfkxFlQIOm00EOkVf Q=; X-CSE-ConnectionGUID: E/DhppSfSGio1y27GVBl8Q== X-CSE-MsgGUID: zH7FeMILRtGapzBpvKM01g== 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 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.25,255,1779141600"; d="asc'?scan'208,217";a="292512755" Received: from prod-sympa-app.inria.fr ([128.93.162.27]) by mail2-relais-roc.national.inria.fr with ESMTP; 01 Sep 2026 11:14:42 +0200 Received: by prod-sympa-app.inria.fr (Postfix, from userid 990) id 370C481FE8; Tue, 1 Sep 2026 11:14:41 +0200 (CEST) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by prod-sympa-app.inria.fr (Postfix) with ESMTP id 9F9CD80584 for ; Tue, 1 Sep 2026 11:14:33 +0200 (CEST) X-CSE-ConnectionGUID: P6tk97liTDCGfg9n6KcyvQ== X-CSE-MsgGUID: M/tVxB4hQD24ZxttiOOv8Q== IronPort-SDR: 6a969776_Jg2YVr17WwRdgUpeki81XGZ8tQpnB0d+eIh/qstLVLdYBHZ Te6OGwDI+sKooUqWCYQLVidUdgLlUjpRaYpuM2w== X-ThreatScanner-Verdict: Negative X-IPAS-Result: =?us-ascii?q?A0EZNwDKlpZqhSIeaIFahBZbKRsBaAZZAQUZGgcISUYeg?= =?us-ascii?q?3SBY4FshSuGGYJggRaQN4I8hzAGgQqBaYErFgUcAg4HAQMBCAUuARsEAQIEA?= =?us-ascii?q?QEBAgECAYILgTyBNwIWjWICHwYBBDQTAQIEAwIDAQEBAQEBAQEBAQELAQEBB?= =?us-ascii?q?AEBAQIBAQIEAwEBAQECEAEBAQFASYZPDYJFUVMeYAEDAQIBBQEGAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEiAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQIECAETL1wBAgYEBhMBASYMAQUYFA8DEAQBBgMCBA0BNQMBEwEJC?= =?us-ascii?q?RQGghBYAYIgAgJQAwQBDKBWmyN6fzOBAYIMAQEGgQg+AgELAgUBDgkm2hqBH?= =?us-ascii?q?TATCQmBTYFYhBmCUQ8NASpJagIBhFOCDoEUgR0CJw+BVURmLgGCKUoFAm+BU?= =?us-ascii?q?C5jAgEBgSQEDQEGAQEIRAEJgyWCaoINBBWBDGCBGFAGEwEGgScCPYY0gziFK?= =?us-ascii?q?YFmA1ksAVUTFwsHBV6BCAMqLy1uMh2BIz4XNVgbBgWBHYEog0QjGTZ6gQleg?= =?us-ascii?q?SspYRIXgQmCCAKCV4IDAgFJQw4HR1MJKgIJC209NxUZjTMQIQ2BQ0kZH4IFC?= =?us-ascii?q?AYLLQYCBQEYCwUOJAISBg4FAQIFAwkQCCIsAQEBBwgTGQQBCgQRBBEIBAkFC?= =?us-ascii?q?QUYDgIPCAYIAwIJAgYOCgILAoRjjWMUEAEBEwMqA49bjhkIlFs0B4QhgWAGD?= =?us-ascii?q?IkKgSaMIIIUh1OBH4JlTYEKiz2HA4sLg2yDWiKYZiOCNocogSYJYIEPa4Uik?= =?us-ascii?q?AIQJgYEBAsDhUOBfyOBKwEaAwwHMxowIiENCQ+CQglHHA9WjSkrAxaBFAEIg?= =?us-ascii?q?kMQMX2BJoEjGDk7xwhCNQIBAQc0BwIHDwKFTh0BAWcCix0BASYHBYFMAQE?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23: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 IronPort-HdrOrdr: A9a23:EOmyiK2olSK9y1lML47UbgqjBE0kLtp133Aq2lEZdPU0SKelfq GV7ZEmPHrP5Qr5N0tPpTn+Atj8fZqxz/5ICPAqTNCftVDdyRCVxeJZh7cKoQeOJ8SWzIc0uZ uIT5IOa+EYZmIasS+V2njbL/8QhP2h0I2T7N2ut0uFNTsaEZ2JTmxCe3qmO1wzQA4DBZcFBI ORj/A3wwaIaDASaYC9AGQEUPirnayzqLv2JRoAHBQ/9RSJ5AnYjoLHLw== X-Talos-CUID: 9a23:c9VFtGBtznE9xQP6ExE56E1FRcQkTlH243nfcknmKm14VoTAHA== X-Talos-MUID: 9a23:XuFdCwipIckWKsbjgYoqVMMpEYB03bSEVEA0vc9aidmYKS1XHCnNtWHi X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.25,255,1779141600"; d="asc'?scan'208,217";a="155568208" X-URL-ContentFilter: X-IronPort-Outbreak-Status: No, level 0, Unknown - Unknown X-MGA-submission: =?us-ascii?q?MDE8pvYcaNk+eGScCmeKM5GIgY1MLEAxQxC41l?= =?us-ascii?q?AUw7OcNe0KjxRCU3P+QrcW1WBAXLezJrx8xA7gA6zpLsYSI9P/rknq4V?= =?us-ascii?q?31V+rqglLqYMdPJr0RgraT7oJN8FINW3899Qq9up9qoI8clZkjw3Qmw3?= =?us-ascii?q?Pl8D0Dt/lJ/ks+G6Mp3lpLDg=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; 01 Sep 2026 11:14:30 +0200 Received: from TM.local (82-66-240-41.subs.proxad.net [82.66.240.41]) (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 5D51A1A48A; Tue, 1 Sep 2026 11:14:29 +0200 (CEST) From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 01 Sep 2026 11:14:28 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/signed; boundary="===-=-="; micalg=pgp-sha256; protocol="application/pgp-signature" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Sep 1 11:14:29 2026 +0200 (CEST)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.500000, queueID=8AE371A48B 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: 19571 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: multipart/mixed; boundary="=-=-=" --=-=-= Content-Type: multipart/alternative; boundary="==-=-=" --==-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgQXVndXN0IDI1IHRvDQpTZXB0ZW1iZXIgMDEsIDIwMjYuDQoNClRhYmxlIG9mIENvbnRl bnRzDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAN Cg0KVW5oYW5kbGVkOiBhIHN0YXRpYyBjaGVja2VyIGZvciB1bmhhbmRsZWQgZWZmZWN0cyBpbiBP Q2FtbCA1LCBhbmQgYSBuZWdhdGl2ZSByZXN1bHQNClRoZSBzZXJpZXMgb2YgbWlyYWdlLWNyeXB0 byogcmVsZWFzZXMNClJwbWZpbGUgMS4wLjAgYW5kIEJ5dHJlYW0gMC4yDQpveGJvdywgYSBkeW5h bWljIHRpbGluZyB3aW5kb3cgbWFuYWdlciBmb3IgdGhlIFdheWxhbmQgY29tcG9zaXRvciBSaXZl cg0KY2RwIDAuMS4wIC0gdHlwZWQgQ2hyb21lIERldlRvb2xzIFByb3RvY29sIGxpYnJhcmllcyBm b3IgT0NhbWwNCkhhcmRjYW1sIE5ldHdvcmtpbmcgTGlicmFyeSAtIFRveSBQcm9qZWN0DQpGVU4g T0NhbWwgMjAyNyBpbiBCYW5nYWxvcmUsIEphbiAyNS0yNiAtIFRpbWUgdG8gU2VuZCBUYWxrIGFu ZCBXb3Jrc2hvcCBQcm9wb3NhbHMgLSBVbnRpbCBTZXAgMzANCmVhc2UtY2FtbCAtIEVhc2luZyBs aWJyYXJ5IGZvciBPQ2FtbA0Kb3BhbSAyLjYuMH5hbHBoYTENCk9sZCBDV04NCg0KDQpVbmhhbmRs ZWQ6IGEgc3RhdGljIGNoZWNrZXIgZm9yIHVuaGFuZGxlZCBlZmZlY3RzIGluIE9DYW1sIDUsIGFu ZCBhIG5lZ2F0aXZlIHJlc3VsdA0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToN CiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC91bmhhbmRsZWQtYS1zdGF0aWMtY2hlY2tl ci1mb3ItdW5oYW5kbGVkLWVmZmVjdHMtaW4tb2NhbWwtNS1hbmQtYS1uZWdhdGl2ZS1yZXN1bHQv MTg0NzQvMT4NCg0KDQpNYW5pc2ggUGF1bCBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIE9DYW1sIDUn cyBlZmZlY3QgaGFuZGxlcnMgYXJlIHVudHlwZWQ6IHRoZSBjb21waWxlciBkb2VzIG5vdCBjaGVj aw0KICB0aGF0IGEgcGVyZm9ybWVkIGVmZmVjdCBpcyBoYW5kbGVkLCBzbyBhIG1pc3NpbmcgaGFu ZGxlciBjb21waWxlcw0KICBjbGVhbmx5IGFuZCBmYWlscyBhdCBydW4gdGltZSB3aXRoIGBFZmZl Y3QuVW5oYW5kbGVkJy4gV2UgaGF2ZSBiZWVuDQogIGJ1aWxkaW5nIGEgc3RhdGljIGNoZWNrZXIg Zm9yIHRoYXQsIGFuZCB3ZSB3b3VsZCBsaWtlIHNvbWUgY3JpdGljaXNtDQogIG9mIGl0LCBwYXJ0 aWN1bGFybHkgb2YgdGhlIHBhcnRzIHdlIHRoaW5rIGFyZSB3ZWFrZXN0Lg0KDQogICpXaGF0IGl0 IGRvZXMuKiBJdCByZWFkcyB0aGUgY29tcGlsZXIncyBvd24gYC5jbXQnIGZpbGVzLCBpbmZlcnMg YQ0KICBwZXItZnVuY3Rpb24gZWZmZWN0IHNldCwgcHJvcGFnYXRlcyBieSBjYWxsLWdyYXBoIGZp eHBvaW50LCBzdWJ0cmFjdHMNCiAgZWZmZWN0cyBkaXNjaGFyZ2VkIGF0IGhhbmRsZXIgc2l0ZXMs IGFuZCByZXBvcnRzIGV2ZXJ5IGBwZXJmb3JtJyB0aGF0DQogIGNhbiByZWFjaCBhIHByb2dyYW0g ZW50cnkgcG9pbnQgdW5oYW5kbGVkLiBGaW5kaW5ncyBjb21lIHdpdGggYSBibGFtZQ0KICBwYXRo IGZyb20gZW50cnkgdG8gYHBlcmZvcm0nLCBhbmQgd2l0aCBhIGdlbmVyYXRlZCB3aXRuZXNzIHBy b2dyYW06IHdlDQogIHN5bnRoZXNpc2UgaXQsIGNvbXBpbGUgaXQsIHJ1biBpdCwgYW5kIG9ubHkg cmVwb3J0IHRoZSBmaW5kaW5nIGFzDQogIGNvbmZpcm1lZCBpZiB0aGUgZWZmZWN0IGFjdHVhbGx5 IGFycml2ZXMgYXQgYW4gb3V0ZXIgYm91bmRhcnkuDQoNCiAgKkhvdyBpdCBpcyB0ZXN0ZWQuKiBE aWZmZXJlbnRpYWwgdGVzdGluZyBhZ2FpbnN0IHRoZSBydW50aW1lIGFzDQogIG9yYWNsZTogYSBn ZW5lcmF0b3IgZW1pdHMgcHJvZ3JhbXMsIGFuZCB3ZSBjb21wYXJlIHRoZSBjaGVja2VyJ3MNCiAg cHJlZGljdGlvbiBhZ2FpbnN0IHdoYXQgdGhlIGNvbXBpbGVkIHByb2dyYW0gYWN0dWFsbHkgZG9l cyB3aGVuDQogIGV4ZWN1dGVkLiBPdmVyIDEwMDAgZ2VuZXJhdGVkIHByb2dyYW1zLCAwIGZhbHNl IG5lZ2F0aXZlcy4gQnJhbmNoLWZyZWUNCiAgcHJvZ3JhbXM6IDYwMCwgbm8gZmFsc2UgcG9zaXRp dmVzLiAgQnJhbmNoaW5nIHByb2dyYW1zOiA0MDAsIDUuMyUNCiAgZmFsc2UgcG9zaXRpdmVzLCBm cm9tIGpvaW5pbmcgYm90aCBhcm1zIG9mIGEgY29uZGl0aW9uYWwuIFRoZQ0KICB3aXRuZXNzZXMg ZGVsaWJlcmF0ZWx5IGRvIG5vdCBwYXJzZSB0aGUgY3Jhc2ggbWVzc2FnZS4gIEhhbmR5LCBzaW5j ZQ0KICA1LjQgc3RvcHBlZCBwcmludGluZyB0aGUgZWZmZWN0IHBheWxvYWQgZm9yIHR3byBvZiBv dXIgdGVzdCBwcm9ncmFtcw0KICBhbmQgbm90aGluZyBicm9rZS4NCg0KICAqVGhlIG5lZ2F0aXZl IHJlc3VsdCwgd2hpY2ggaXMgdGhlIHJlYXNvbiBmb3IgdGhpcyBwb3N0LiogV2Ugd2FudGVkIHRv DQogIHNob3cgdGhlIGNoZWNrZXIgY2F0Y2hlcyBjcmFzaGVzIHRoYXQgcmVhbGx5IGhhcHBlbmVk LCBzbyB3ZSBidWlsdCBhDQogIGNvcnB1cyBvZiBjb21taXRzIHRoYXQgZml4ZWQgZG9jdW1lbnRl ZCBgRWZmZWN0LlVuaGFuZGxlZCcgcHJvYmxlbXMNCiAgYW5kIGFuYWx5c2VkIGVhY2ggcGFyZW50 IGNvbW1pdC4gSXQgY2F1Z2h0IDAgb2YgNi4gVGhlIGNhdXNlIHR1cm5lZA0KICBvdXQgdG8gYmUg dGhhdCB0aGUgbW9kdWxlcyB0aGUgYnVncyBsaXZlZCBpbiBuZXZlciBjb21waWxlZCBpbiBvdXIN CiAgZW52aXJvbm1lbnQsIHNvIHRoZSBhbmFseXNlciB3YXMgbmV2ZXIgc2hvd24gdGhlIGNvZGUu IFRoZSBiYXRjaA0KICBydW5uZXIgbm93IHJlcG9ydHMgIm91dCBvZiBzY29wZSIgc2VwYXJhdGVs eSBmcm9tICJtaXNzZWQiIGZvciBleGFjdGx5DQogIHRoaXMgcmVhc29uLg0KDQogIFRoZW4gd2Ug cmFuIGl0IGFjcm9zcyBldmVyeSBvcGFtIHBhY2thZ2UgZGVwZW5kaW5nIG9uIGBlaW8nLA0KICBg ZWlvX21haW4nLCBgcGljb3MnLCBgZG9tYWluc2xpYicsIGByaW90JywgYG1vb25wb29sJyBvciBg bWlvdScsDQogIGdpdmluZyA4NSByZXBvc2l0b3JpZXMgYWZ0ZXIgZGVkdXBsaWNhdGluZyBieSBg ZGV2LXJlcG8nLiAzOCBvZiB0aGVtDQogIGJ1aWx0IGZhciBlbm91Z2ggdG8gYW5hbHlzZSwgMyw4 ODEgbW9kdWxlcyBpbiB0b3RhbCwgYW5kIHRoZSB0b29sDQogIHJlcG9ydGVkICozMSBlc2NhcGVz LiBFdmVyeSBzaW5nbGUgb25lIHdhcyBvdXIgb3duIGZhbHNlIHBvc2l0aXZlLioNCiAgRm91ciBj YXVzZXMsIGVhY2ggZm91bmQgYnkgcmVhZGluZyB0aGUgY29kZSB3ZSBoYWQgYWNjdXNlZDoNCg0K ICAxLiBXZSBtb2RlbGxlZCAiY2FsbHMgYW55dGhpbmcgdW5kZXIgYEVpby4nIiBhcyAicmVxdWly ZXMgYW4gRWlvDQogICAgIHJ1bnRpbWUiLiAgV3JvbmcgZm9yIGNvbnN0cnVjdG9ycyBhbmQgdnRh YmxlIGJ1aWxkZXJzOg0KICAgICBgRWlvLkZsb3cuUGkuc291cmNlJywgYEVpby5TdHJlYW0uY3Jl YXRlJywgYEVpby5Db25kaXRpb24uY3JlYXRlJywNCiAgICAgYEVpby5CdWZfcmVhZC5wYXJzZV9z dHJpbmdfZXhuJy4NCiAgMi4gV2UgYXBwbGllZCB0aGF0IGNsaWVudC11c2FnZSBtb2RlbCB0byBl aW8ncyAqb3duKiBzb3VyY2UsIHdoaWNoIGlzDQogICAgIGEgY2F0ZWdvcnkgZXJyb3IuIGVpbyBk b2VzIG5vdCBuZWVkIGFuIEVpbyBydW50aW1lIHRvIGRlZmluZQ0KICAgICBpdHNlbGYuDQogIDMu IFdlIGRpZCBub3Qgc2VlIHRocm91Z2ggYXBwbGljYXRpb24gb3BlcmF0b3JzLiBgbGV0QCBlbnYg PQ0KICAgICAgICBFaW9fbWFpbi5ydW4gaW4gYm9keScgaXMgYCggbGV0QCApIEVpb19tYWluLnJ1 biAoZnVuIGVudiAtPg0KICAgICAgICBib2R5KScsIGFuZCB3aXRoIHRoZSBvcGVyYXRvciBvcGFx dWUgdGhlIGhlYWQgb2YgdGhhdA0KICAgICAgICBhcHBsaWNhdGlvbiBpcyBub3QgYEVpb19tYWlu LnJ1bicsIHNvIHRoZSBzY2hlZHVsZXIgYm91bmRhcnkNCiAgICAgICAgdmFuaXNoZWQgYW5kIGFu IGVudGlyZSBwcm9ncmFtIGxvb2tlZCBsaWtlIGl0IHJhbiB3aXRoIG5vDQogICAgICAgIHJ1bnRp bWUuICBUaGUgZml4IGlzIHRvIHJlYWQgYCVhcHBseScgYW5kIGAlcmV2YXBwbHknIG91dCBvZiB0 aGUNCiAgICAgICAgdmFsdWUgZGVzY3JpcHRpb24sIHdoaWNoIHdvdWxkIGFsc28gY292ZXIgYEBA JywgYHw+JywgYW5kDQogICAgICAgIG9wZXJhdG9ycyBhIHByb2plY3QgZGVmaW5lcyBmb3IgaXRz ZWxmLg0KICA0LiBXZSBvbmx5IHJlY29nbmlzZWQgYW4gYEVmZmVjdC5VbmhhbmRsZWQnIGd1YXJk IHdoZW4gaXQgbmFtZWQgdGhlDQogICAgIGV4Y2VwdGlvbi4gIHBpY29zIHdyaXRlcyBpdCBhcyBh IGNhdGNoLWFsbCBhbmQgc2F5cyB3aHk6DQogICAgIOKUjOKUgOKUgOKUgOKUgA0KICAgICDilIIg fCBleGNlcHRpb24gX2V4biAtPg0KICAgICDilIIgICAgICgqIFRoaXMgc2hvdWxkIG9ubHkgaGFw cGVuIHdoZW4gbm90IHJ1bm5pbmcgdW5kZXIgYSBzY2hlZHVsZXIuDQogICAgIOKUgiAgICAgICAg SG93ZXZlciwgd2UgZG9uJ3QgbWF0Y2ggb24gYSBzcGVjaWZpYyBleGNlcHRpb24sIGJlY2F1c2Ug aXQNCiAgICAg4pSCICAgICAgICBkZXBlbmRzIG9uIHRoZSBPQ2FtbCB2ZXJzaW9uLiAqKQ0KICAg ICDilJTilIDilIDilIDilIANCg0KICAgICBXZSBoYWQgcmVjb3JkZWQgdGhlIHNhbWUgb2JzZXJ2 YXRpb24gaW5kZXBlbmRlbnRseSwgYW5kIHRoZW4NCiAgICAgd2F0Y2hlZCA1LjQgc3RvcCBwcmlu dGluZyB0aGUgZWZmZWN0IHBheWxvYWQsIHdoaWNoIGlzIHRoZSBzYW1lDQogICAgIHByb2JsZW0g ZnJvbSB0aGUgb3RoZXIgc2lkZS4NCg0KICBDYXVzZXMgMSBhbmQgMiBhcmUgZml4ZWQgYW5kIHJl Z3Jlc3Npb24tdGVzdGVkIGluIGJvdGgNCiAgZGlyZWN0aW9ucy4gQ2F1c2VzIDMgYW5kIDQgYXJl IGRpYWdub3NlZCBidXQgbm90IHlldCBmaXhlZDogdGhlDQogIGF0dGVtcHQgYnJva2UgdGhlIHRl c3Qgc3VpdGUgYW5kIHdlIHJldmVydGVkIGl0IHJhdGhlciB0aGFuIHNoaXAgYSByZWQNCiAgb25l LCBzbyB0aGV5IGFyZSB3cml0dGVuIHVwIGluIGBkb2NzL0xJTUlUQVRJT05TLm1kJyB3aXRoIHRo ZSBmb3Jlc3Rlcg0KICBhbmQgcGljb3Mgc291cmNlIHRoYXQgcHJvZHVjZWQgdGhlbS4gIFR3ZW50 eS1maXZlIGVzY2FwZXMgZml4ZWQsIHNpeA0KICByZW1haW5pbmcgYW5kIGV4cGxhaW5lZC4NCg0K ICAqRXZlcnkgZXNjYXBlIHRoaXMgdG9vbCBoYXMgZXZlciByZXBvcnRlZCBvbiB0aGlyZC1wYXJ0 eSBjb2RlIGhhcw0KICB0dXJuZWQgb3V0IHRvIGJlIG91ciBvd24gZmFsc2UgcG9zaXRpdmUuIFdl IGhhdmUgbm90IGZvdW5kIGEgcmVhbCBidWcNCiAgaW4gYW55b25lJ3MgY29kZS4qIFdlIHdvdWxk IHJhdGhlciBzYXkgdGhhdCBwbGFpbmx5IHRoYW4gaW1wbHkNCiAgb3RoZXJ3aXNlLg0KDQogIElm IHRoZXJlIGlzIGEgdHJhbnNmZXJhYmxlIGxlc3NvbiBpdCBpcyBwcm9iYWJseSB0aGF0IG9uZTog YSBjaGVja2VyDQogIHBvaW50ZWQgYXQgcmVhbCBjb2RlIGZvciB0aGUgZmlyc3QgdGltZSBpcyBt b3N0bHkgbWVhc3VyaW5nIGl0c2VsZiwNCiAgYW5kIHRoZSBvbmx5IHdheSB0byB0ZWxsIHRoZSBk aWZmZXJlbmNlIGlzIHRvIHJlYWQgdGhlIHNvdXJjZSB5b3UganVzdA0KICBhY2N1c2VkLg0KDQog ICpXaGF0IHdlIHdvdWxkIGxpa2UgY3JpdGljaXNtIG9mLioNCg0KICDigKIgSXMgdGhlIGxpYnJh cnktY29udHJhY3Qgb3V0cHV0IHVzZWZ1bCB0byB5b3U/IE9uIHBpY29zIGl0IHByb2R1Y2VzOg0K ICAgIOKUjOKUgOKUgOKUgOKUgA0KICAgIOKUgiBtb2R1bGUgUGljb3MNCiAgICDilIIgICBQaWNv cy5UcmlnZ2VyLmF3YWl0ICAgICAgICAgICAgICAgIG1heSBwZXJmb3JtIHtQaWNvcy5UcmlnZ2Vy LkF3YWl0fQ0KICAgIOKUgiAgIFBpY29zLkZpYmVyLmN1cnJlbnQgICAgICAgICAgICAgICAgbWF5 IHBlcmZvcm0ge1BpY29zLkZpYmVyLkN1cnJlbnR9DQogICAg4pSCICAgUGljb3MuRmliZXIuc3Bh d24gICAgICAgICAgICAgICAgICBtYXkgcGVyZm9ybSB7UGljb3MuRmliZXIuU3Bhd259DQogICAg 4pSCICAgUGljb3MuRmliZXIueWllbGQgICAgICAgICAgICAgICAgICBtYXkgcGVyZm9ybSB7UGlj b3MuRmliZXIuWWllbGR9DQogICAg4pSCICAgUGljb3MuRmliZXIuTWF5YmUudG9fZmliZXJfb3Jf Y3VycmVudCBtYXkgcGVyZm9ybSB7UGljb3MuRmliZXIuQ3VycmVudH0NCiAgICDilIIgICBQaWNv cy5GaWJlci5NYXliZS5vcl9jdXJyZW50ICAgICAgIG1heSBwZXJmb3JtIHtQaWNvcy5GaWJlci5D dXJyZW50fQ0KICAgIOKUgiAgIFBpY29zLkZpYmVyLk1heWJlLmN1cnJlbnRfaWYgICAgICAgbWF5 IHBlcmZvcm0ge1BpY29zLkZpYmVyLkN1cnJlbnR9DQogICAg4pSCICAgUGljb3MuRmliZXIuTWF5 YmUuY3VycmVudF9hbmRfY2hlY2tfaWYgbWF5IHBlcmZvcm0ge1BpY29zLkZpYmVyLkN1cnJlbnQs IC4uLnVua25vd259DQogICAg4pSCIA0KICAgIOKUgiBtb2R1bGUgUGljb3Nfc3RkX2V2ZW50X19F dmVudA0KICAgIOKUgiAgIFBpY29zX3N0ZF9ldmVudF9fRXZlbnQuc3luYyAgICAgICAgbWF5IHBl cmZvcm0ge1BpY29zLlRyaWdnZXIuQXdhaXQsIC4uLnVua25vd259DQogICAg4pSCICAgUGljb3Nf c3RkX2V2ZW50X19FdmVudC5zZWxlY3QgICAgICBtYXkgcGVyZm9ybSB7UGljb3MuVHJpZ2dlci5B d2FpdCwgLi4udW5rbm93bn0NCiAgICDilIIgDQogICAg4pSCIG1vZHVsZSBQaWNvc19zdGRfc3Ry dWN0dXJlZF9fUnVuDQogICAg4pSCICAgUGljb3Nfc3RkX3N0cnVjdHVyZWRfX1J1bi5zcGF3biAg ICBtYXkgcGVyZm9ybSB7UGljb3MuRmliZXIuU3Bhd24sIC4uLnVua25vd259DQogICAg4pSU4pSA 4pSA4pSA4pSADQoNCiAgICBgLi4udW5rbm93bicgaW4gYSBzZXQgbWVhbnMgdGhlIGNvbnRyYWN0 IGlzIGluY29tcGxldGUgYXQgdGhhdA0KICAgIGZ1bmN0aW9uIGJlY2F1c2UgaXQgY2FsbHMgc29t ZXRoaW5nIHdlIGhhdmUgbm8gYC5jbXQnIGZvcjsgd2Ugd291bGQNCiAgICByYXRoZXIgc2hvdyB0 aGF0IHRoYW4gcm91bmQgaXQgZG93biB0byBhIGNsZWFuLWxvb2tpbmcgc2V0Lg0KDQogICAgSXMg YSBtYWNoaW5lLWNoZWNrZWQgc3RhdGVtZW50IG9mICJ3aGF0IHRoaXMgbGlicmFyeSBhc2tzIGl0 cw0KICAgIGNhbGxlcnMgdG8gaGFuZGxlIiB3b3J0aCBoYXZpbmcgaW4gYSBSRUFETUUgb3IgaW4g Q0k/DQoNCiAg4oCiIFdoYXQgc2hhcGVzIGRvIHdlIG1pc3M/IFdlIGtub3cgYWJvdXQgZWZmZWN0 cyBwZXJmb3JtZWQgaW5zaWRlDQogICAgYGVmZmMnIGJyYW5jaCBib2RpZXMsIGR5bmFtaWNhbGx5 IGJ1aWx0IGhhbmRsZXIgcmVjb3JkcywgYW5kDQogICAgY2xvc3VyZXMgdGhhdCByZWFjaCBhIGNh bGwgc2l0ZSB0aHJvdWdoIGEgZGF0YSBzdHJ1Y3R1cmUgKG5vIDAtQ0ZBDQogICAgeWV0KS4gV2Ug d291bGQgbGlrZSB0byBoZWFyIGFib3V0IHRoZSBvbmVzIHdlIGRvIG5vdCBrbm93IGFib3V0Lg0K DQogIOKAoiBUaGUgc2NoZWR1bGVyIG1vZGVsLCBtZWFuaW5nIHdoaWNoIGVudHJ5IHBvaW50IGlu c3RhbGxzIGhhbmRsZXJzIGZvcg0KICAgIHdoaWNoIGZhbWlseSBvZiBlZmZlY3RzLCBpcyBkYXRh IHJhdGhlciB0aGFuIGFuYWx5c2lzLCBhbmQgbGl2ZXMgaW4NCiAgICBgbW9kZWxzL3NjaGVkdWxl cnMuY29uZicuIFRoZSBlaW8gZW50cmllcyBhcmUgY2l0ZWQgdG8gc3BlY2lmaWMNCiAgICBsaW5l cy4gVGhlIHJpb3QsIG1vb25wb29sIGFuZCBtaW91IGVudHJpZXMgYXJlICpndWVzc2VzKiBhbmQN CiAgICBsYWJlbGxlZCBhcyBzdWNoLiBDb3JyZWN0aW9ucyB2ZXJ5IHdlbGNvbWUuDQoNCiAg4oCi IEhhcyBhbnlvbmUgYWN0dWFsbHkgaGl0IGFuIGBFZmZlY3QuVW5oYW5kbGVkJyBjcmFzaCBpbiBw cm9kdWN0aW9uPw0KICAgIFdlIGFyZSBzaG9ydCBvZiByZWFsIGV4YW1wbGVzIGFuZCB3b3VsZCB0 YWtlIGFueSBwb2ludGVyLCBpbmNsdWRpbmcNCiAgICAid2UgaGl0IGl0IGFuZCB0aGUgY2F1c2Ug d2FzIHNvbWV0aGluZyB5b3VyIGRlc2lnbiBjYW5ub3Qgc2VlIi4NCg0KICBSZXF1aXJlcyBPQ2Ft bCA1LjMgb3IgbGF0ZXIsIHNpbmNlIGBUZXhwX21hdGNoJyBvbmx5IGdyb3dzIGl0cw0KICBlZmZl Y3QtY2FzZSBsaXN0IGluIDUuMy4gQ0kgcnVucyA1LjMgYW5kIDUuNC4NCg0KICBSZXBvc2l0b3J5 OiA8aHR0cHM6Ly9naXRodWIuY29tL21hbmlzaHBhdWxpc2gvdW5oYW5kbGVkPg0KDQogIEhhcHB5 IHRvIGJlIHRvbGQgdGhlIGFwcHJvYWNoIGlzIHdyb25nLg0KDQoNClRoZSBzZXJpZXMgb2YgbWly YWdlLWNyeXB0byogcmVsZWFzZXMNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2Nh bWwub3JnL3QvdGhlLXNlcmllcy1vZi1taXJhZ2UtY3J5cHRvLXJlbGVhc2VzLzE4NDc2LzE+DQoN Cg0KSGFubmVzIE1laG5lcnQgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBEZWFyIGV2 ZXJ5b25lLA0KDQogIGl0IGlzIG15IGRlbGlnaHQgdG8gcmVsZWFzZSBtaXJhZ2UtY3J5cHRvKiBp biB2ZXJzaW9uIDIuNC4xDQogICg8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29wYW0tcmVwb3Np dG9yeS9wdWxsLzMwNTY4PikuIFRoZXJlIGhhdmUNCiAgYmVlbiBhIHNlcmllcyBvZiByZWxlYXNl cyBzaW5jZSBsYXRlIEp1bHkgd2l0aCAyLjIuMC4gVGhlIHJlYXNvbmluZw0KICBiZWhpbmQgaXMg dGhhdCBzZXZlcmFsIHBlb3BsZSB1c2VkIExMTSB0byBmaW5kIHNvbWUgaXNzdWVzIGluIHRoZQ0K ICBpbXBsZW1lbnRhdGlvbiB0aGF0IHdlIGFyZSBmaXhpbmcgaW4gdGhlIHByb2Nlc3MuIEl0IGlz IGxpa2VseQ0KICB0aGVyZSdsbCBiZSBtb3JlIHJlbGVhc2VzLiBXZSB0cnkgdG8gbGltaXQgdGhl IHJlbGVhc2VzIHdlIGN1dCBkdXJpbmcNCiAgZWFjaCBtb250aC4gTWUgYXMgYSBtYWludGFpbmVy IG9mIHRoYXQgcGFja2FnZSBpcyBhcyB3ZWxsIGF0IHRoZSBlZGdlDQogIG9mIHdoYXQgSSBjYW4g ZG8gKHRpbWUtd2lzZSDigJMgcGxlYXNlIGNvbnNpZGVyIGRvbmF0aW5nIGF0DQogIDxodHRwczov L3JvYnVyLmNvb3AvI2NvbnRhY3Q+IG9yIHZpYSBHaXRIdWIgc3BvaW5zb3JzIOKAkyBpbiB0aGUg Y2FzZQ0KICB5b3UgdXNlIHRoaXMgcGllY2Ugb2Ygc29mdHdhcmUpLiBFdmVuIG1vcmUgYXBwcmVj aWF0ZWQgd291bGQgYmUganVtcA0KICBpbiwgcmVhZCBjb2RlLCByZXZpZXcgcHVsbCByZXF1ZXN0 cyB3aGVuIHRoZXkgY29tZSBpbiwgY29udHJpYnV0ZSBjb2RlDQogIGNsZWFudXBzIChwbGVhc2Ug ZG9uJ3Qgc3VibWl0IHlvdXIgTExNIGdlbmVyYXRlZCBpbXByb3ZlbWVudHMNCiAgZGlyZWN0bHks IGJ1dCBkbyBjYXJlZnVsIHJldmlld3Mgb2YgdGhlbSkuIEVzcGVjaWFsbHkgc2luY2Ugbm93DQog IGV2ZXJ5b25lIGlzIG9uIHRoZSByZWQgdGVhbS4NCg0KICBUaGUgcGVyZm9ybWFuY2Ugb2YgbWly YWdlLWNyeXB0byBoYXMgZGVjcmVhc2VkIGR1ZSB0byBhZGRlZCBjaGVja3MsDQogIGJ1dCBvbmx5 IGluIGEgc21hbGwgbWFyZ2luIGFzIGZhciBhcyBJIGNhbiBvYnNlcnZlIG9uIGhhcmR3YXJlIHRo YXQgSQ0KICB1c2UuIEZlZWwgZnJlZSB0byBjb25kdWN0IHlvdXIgb3duIGJlbmNobWFya3MgKHRo ZXJlIGlzIGJlbmNoL3NwZWVkLm1sDQogIGF2YWlsYWJsZSksIGFuZCBwcm9wb3NlIGltcHJvdmVt ZW50cy4NCg0KICBOb3csIHRoZSBjaGFuZ2VzIHJhbmdlIGJldHdlZW4gZml4ZXMgYW5kIGNsZWFu dXBzIHRvIGhhcyBhIHB1Ymxpc2hlZA0KICBhZHZpc29yeS4gVGhlcmUncyBub3QgYWx3YXlzIGEg Y2xlYXIgYm9yZGVyLiBUaGUgZnVsbCBsaXN0IGNhbiBiZQ0KICBmb3VuZCBpbiB0aGUgQ0hBTkdF UyBmaWxlLCBvciBpbiB0aGUgY29tbWl0IGhpc3RvcnkuIEkgZW5jb3VyYWdlDQogIGV2ZXJ5b25l IHRvIHVwZGF0ZSB0byB0aGUgbGF0ZXN0IHJlbGVhc2UsIGFuZCBub3QgdXNlIGFueSBwcmV2aW91 cw0KICByZWxlYXNlLiBBcyBtZW50aW9uZWQsIHNvbWUgYWR2aXNvcmllcyBhcmUgb3V0LCBhbmQg Zm9yIG90aGVyIGZpeGVzIHdlDQogIHRoaW5rIHRoZXkgbWF5IG5vdCBuZWVkIGFuIGFkdmlzb3J5 IChhbHRob3VnaCBpdCBtYXkgYmUgdGhhdCBvdGhlcg0KICBpbXBsZW1lbnRhdGlvbnMgaXNzdWVz IGFkdmlzb3JpZXMgZm9yIHN1Y2ggZml4ZXMsIHNvIHBsZWFzZSBiZSBjYXJlZnVsDQogIOKAkyB5 b3UgY2FuIGFzIHdlbGwgc3VibWl0IFBScyB0byBvY2FtbC9zZWN1cml0eS1hZHZpc29yaWVzIGlm IHlvdSB0aGluaw0KICBzb21lIHNwZWNpZmljIGZpeGVzIGFyZSBpbXBvcnRhbnQgZW5vdWdoIHRv IGdldCBhbiBhZHZpc29yeSkuDQoNCiAgVGhlIGZpeGVzIGluIG1vcmUgZGV0YWlsIGZvbGxvdy4g VGhhbmtzIHRvIEVyaWMgRWJpbmdlciwgVGhvbWFzDQogIEdhemFnbmFpcmUsIGFuZCBBbmlsIE1h ZGhhdmFwZWRkeSBmb3IgdGhlIHJlcG9ydHMuIEFuZCB0byBUYXJpZGVzIGZvcg0KICBtYWtlIGl0 IHBvc3NpYmxlIHRoYXQgSSBzcGVuZCBzb21lIHRpbWUgb24gcmV2aWV3aW5nLCBtZXJnaW5nLCBh bmQNCiAgcmVsZWFzaW5nIG1pcmFnZS1jcnlwdG8uDQoNCg0KbWlyYWdlLWNyeXB0by1lYw0K4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAg4oCiIHRp bWluZyBhdHRhY2sgb24gTklTVCBsb29rdXAgdGFibGVzDQogICAgPGh0dHBzOi8vb3N2LmRldi92 dWxuZXJhYmlsaXR5L09TRUMtMjAyNi0xNz4NCiAgICA8aHR0cHM6Ly9naXRodWIuY29tL21pcmFn ZS9taXJhZ2UtY3J5cHRvL2NvbW1pdC8xYTYxYWVlZTdmNTkzZWMwNjc2MTJkZjE3MzllYzkwNWVh YjA0NTBmPg0KICDigKIgbm93IHVzZXMgYmxpbmRpbmcgPGh0dHBzOi8vZ2l0aHViLmNvbS9taXJh Z2UvbWlyYWdlLWNyeXB0by9wdWxsLzI4NT4NCiAg4oCiIGRvIG5vdCBhY2NlcHQgcG9pbnQgYXQg aW5maW5pdHkgYXMgRUNEU0Ega2V5DQogICAgPGh0dHBzOi8vb3N2LmRldi92dWxuZXJhYmlsaXR5 L09TRUMtMjAyNi0xMz4NCiAgICA8aHR0cHM6Ly9naXRodWIuY29tL21pcmFnZS9taXJhZ2UtY3J5 cHRvL2NvbW1pdC9jYTg0ZjVlZThlZGU4MGJkMWRkMmFhNGNkN2NjOTAxOTc3NTIxODRlPg0KICDi gKIgcmV0dXJuIGVhcmx5IGZyb20gc2NhbGFyX211bHQgaW4gRUQyNTUxOQ0KICAgIDxodHRwczov L2dpdGh1Yi5jb20vbWlyYWdlL21pcmFnZS1jcnlwdG8vY29tbWl0LzNiNGJhOTE3OTk3MDA1NjE1 MDlkMGM2YTJkZTgxZWQyNDlkN2IyYjE+DQogIOKAoiBYMjU1MTkgY29tcGFyZSBpbiBjb25zdGFu dCB0aW1lDQogICAgPGh0dHBzOi8vZ2l0aHViLmNvbS9taXJhZ2UvbWlyYWdlLWNyeXB0by9jb21t aXQvMWFhNGNmNWU0YzkyZGNiM2VkZmE4M2I5NzFlNTY5ZmEwNWI4ZjQ3ZD4NCiAg4oCiIHByb3Bl cmx5IGVuY29kZSB0aGUgY29tcHJlc3NlZCBwb2ludCAwDQogICAgPGh0dHBzOi8vZ2l0aHViLmNv bS9taXJhZ2UvbWlyYWdlLWNyeXB0by9jb21taXQvOTRjYmE1NGQ4ZGJiNTcwMWMzYmQ3ZTEzMTdi M2YzOTg3YzE4NzFlMj4NCg0KDQptaXJhZ2UtY3J5cHRvDQrilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYwNCg0KICDigKIgZGVjcnlwdCBvbmx5IGFmdGVyIEFFQUQgdGFnIGhh cyBiZWVuIHZlcmlmaWVkDQogICAgPGh0dHBzOi8vb3N2LmRldi92dWxuZXJhYmlsaXR5L09TRUMt MjAyNi0xMj4NCiAgICA8aHR0cHM6Ly9naXRodWIuY29tL21pcmFnZS9taXJhZ2UtY3J5cHRvL2Nv bW1pdC8yNWU3NTcwYWVjOTFlMDkyYjM0NzU2MWMyM2Y4NGI2ZWMzOWU3MTYzPg0KICDigKIgbW9y ZSBib3VuZHMgY2hlY2tzDQogICAgPGh0dHBzOi8vZ2l0aHViLmNvbS9taXJhZ2UvbWlyYWdlLWNy eXB0by9wdWxsLzI4MT4NCiAgICA8aHR0cHM6Ly9naXRodWIuY29tL21pcmFnZS9taXJhZ2UtY3J5 cHRvL3B1bGwvMjkwPg0KICAgIDxodHRwczovL2dpdGh1Yi5jb20vbWlyYWdlL21pcmFnZS1jcnlw dG8vY29tbWl0LzFmMGJmNjcwNDRlNjdjZjZlNDY5MTFmY2Q3N2EwZmY3MDZiNmMzZTc+DQogICAg PGh0dHBzOi8vb3N2LmRldi92dWxuZXJhYmlsaXR5L09TRUMtMjAyNi0xNT4NCiAgICA8aHR0cHM6 Ly9naXRodWIuY29tL21pcmFnZS9taXJhZ2UtY3J5cHRvL2NvbW1pdC83YjU2NTBiNzIzMTRkNjU2 MDJkMGJhY2NiZjgzYWQzMDEzY2IzN2Q0Pg0KICDigKIgYXZvaWQgdW5hbGlnbmVkIGFjY2Vzcw0K ICAgIDxodHRwczovL2dpdGh1Yi5jb20vbWlyYWdlL21pcmFnZS1jcnlwdG8vcHVsbC8yOTI+DQog IOKAoiByZWplY3QgYmFkIENoYUNoYTIwIGtleXMNCiAgICA8aHR0cHM6Ly9naXRodWIuY29tL21p cmFnZS9taXJhZ2UtY3J5cHRvL2NvbW1pdC83ZjUwNWIwZGMyMzI4MDVjMGM3MjVlOTliNWZiZmE0 OWIxYmU3YzdlPg0KICDigKIgYXZvaWQgcGFkZGluZyB3aGVuIGFkYXRhIGlzIGFsaWduZWQNCiAg ICA8aHR0cHM6Ly9naXRodWIuY29tL21pcmFnZS9taXJhZ2UtY3J5cHRvL2NvbW1pdC85OTljYWM5 MGYwZGUxZTRiMzY0NTE4MDdjMGUwZGJlZTZlZGZkZTA2Pg0KICDigKIgYXZvaWQgdG9vIGxvbmcg Q0NNIG1lc3NhZ2VzDQogICAgPGh0dHBzOi8vZ2l0aHViLmNvbS9taXJhZ2UvbWlyYWdlLWNyeXB0 by9wdWxsLzMwND4NCiAg4oCiIEFFQUQgY2lwaGVycyBhdm9pZCBjb3VudGVyIHdyYXBwaW5nDQog ICAgPGh0dHBzOi8vZ2l0aHViLmNvbS9taXJhZ2UvbWlyYWdlLWNyeXB0by9wdWxsLzMwNT4NCiAg ICA8aHR0cHM6Ly9naXRodWIuY29tL21pcmFnZS9taXJhZ2UtY3J5cHRvL3B1bGwvMzA2Pg0KICAg IDxodHRwczovL2dpdGh1Yi5jb20vbWlyYWdlL21pcmFnZS1jcnlwdG8vcHVsbC8zMDQ+DQoNCg0K bWlyYWdlLWNyeXB0by1ybmcNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjA0KDQogIOKAoiB0aGUgZW50cm9weSBoYXJ2ZXN0aW5nIHRlc3QgaXMgbm93 IGV4ZWN1dGVkIGF0IGluaXRpYWxpemF0aW9uIHRpbWUNCiAgICBvZiBtaXJhZ2UtY3J5cHRvLW1r ZXJuZWwgYW5kIG1pcmFnZS1jcnlwdG8tcm5nLW1pcmFnZQ0KICAgIDxodHRwczovL2dpdGh1Yi5j b20vbWlyYWdlL21pcmFnZS1jcnlwdG8vcHVsbC8yODI+DQogIOKAoiBmaXggZW50cm9weSBzb3Vy Y2UgSURzDQogICAgPGh0dHBzOi8vZ2l0aHViLmNvbS9taXJhZ2UvbWlyYWdlLWNyeXB0by9jb21t aXQvODYxNjFkMWY1MWZkNzQ4MDM4ZDkxN2E2OTQ5MGViYTcxNGJiNjBkNT4NCiAg4oCiIHVyYW5k b20gUk5HIG1ha2UgaXQgc28gdGhhdCBhIGZvcmsgZG9lc24ndCByZXBlYXQgbnVtYmVycw0KICAg IDxodHRwczovL2dpdGh1Yi5jb20vbWlyYWdlL21pcmFnZS1jcnlwdG8vcHVsbC8zMDI+DQogIOKA oiBkZXRlY3QgUkRTRUVEIHByb3Blcmx5DQogICAgPGh0dHBzOi8vZ2l0aHViLmNvbS9taXJhZ2Uv bWlyYWdlLWNyeXB0by9jb21taXQvMGY4NThhOWUxNjVjMDA0ZTcxNjc2MTM4NTI4NGFhZGMxMTli NzAwNj4NCg0KDQptaXJhZ2UtY3J5cHRvLXBrDQrilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYwNCg0KICDigKIgRFNBIGF2b2lkIGRpdmlzaW9uIGJ5IDANCiAg ICA8aHR0cHM6Ly9naXRodWIuY29tL21pcmFnZS9taXJhZ2UtY3J5cHRvL3B1bGwvMjg5Pg0KICDi gKIgUlNBIGF2b2lkIEludmFsaWRfYXJndW1lbnQgd2hlbiBtZXNzYWdlIGlzIDINCiAgICA8aHR0 cHM6Ly9vc3YuZGV2L3Z1bG5lcmFiaWxpdHkvT1NFQy0yMDI2LTE0Pg0KICAgIDxodHRwczovL2dp dGh1Yi5jb20vbWlyYWdlL21pcmFnZS1jcnlwdG8vY29tbWl0L2EwZjU5YTBjOTBlYjA2NzUwNWI1 NWEwM2QzYmIxMDRlYWNkNmRkMzM+DQogIOKAoiBmaXggaGFyZGNvZGVkIERIIGdyb3Vwcw0KICAg IDxodHRwczovL2dpdGh1Yi5jb20vbWlyYWdlL21pcmFnZS1jcnlwdG8vcHVsbC8yOTc+DQogIOKA oiBmaXggZGVjb2Rpbmcgb2YgT0FFUCB3aXRob3V0IGEgc2VwYXJhdG9yDQogICAgPGh0dHBzOi8v Z2l0aHViLmNvbS9taXJhZ2UvbWlyYWdlLWNyeXB0by9jb21taXQvZWNhNmZiMzNlNDRiZmEzNzRk NGM2MjVmYTYyOTU2NzBlZmU3MDQwYj4NCg0KDQpScG1maWxlIDEuMC4wIGFuZCBCeXRyZWFtIDAu Mg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBz Oi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tcnBtZmlsZS0xLTAtMC1ieXRyZWFtLTAtMi8xODQ3 Ny8xPg0KDQoNCk1pa2hhaWwgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIANCg0KICBZbyENCg0KICBJIGFtIGhhcHB5IHRvIGFubm91 bmNlIHRoZSBmaXJzdCBtYWpvciByZWxlYXNlIG9mIHRoZSBbUnBtZmlsZV0NCiAgbGlicmFyeSAo Zm9yIHBhcnNpbmcgUlBNIGZpbGVzKSBhbmQgYSBtaW5vciB1cGRhdGUgb2YgdGhlIFtCeXRyZWFt XQ0KICBsaWJyYXJ5IChzdHJlYW1pbmcgYnl0ZXMgYW5kIGNydW5jaGluZyB0aGVtIGxhc3QgbGli cmFyeSkuDQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBsZXQgKCkgPSANCiAg4pSCICAgbGV0 IG1ldGFkYXRhID0gDQogIOKUgiAgICAgSW5fY2hhbm5lbC53aXRoX29wZW5fYmluIA0KICDilIIg ICAgICAgImhlbGxvLnJwbSIgDQogIOKUgiAgICAgICBScG1maWxlLlJlYWRlci5mcm9tX2NoYW5u ZWxfd2l0aG91dF9wYXlsb2FkIA0KICDilIIgICBpbg0KICDilIIgDQogIOKUgiAgIGxldCBuYW1l LCByZWxlYXNlID0gUnBtZmlsZS5WaWV3LihuYW1lIG1ldGFkYXRhLCByZWxlYXNlIG1ldGFkYXRh KSBpbiANCiAg4pSCICAgUHJpbnRmLnByaW50ZiAiJXMuJXNcbiIgbmFtZSByZWxlYXNlDQogIOKU giAgICgqIGhlbGxvLjEuMyAqKQ0KICDilJTilIDilIDilIDilIANCg0KDQpbUnBtZmlsZV0gPGh0 dHBzOi8vZ2l0aHViLmNvbS9keDNtb2QvcnBtZmlsZT4NCg0KW0J5dHJlYW1dIDxodHRwczovL2dp dGh1Yi5jb20vZHgzbW9kL2J5dHJlYW0+DQoNCkNoYW5nZXMNCuKVjOKVjOKVjOKVjOKVjOKVjOKV jA0KDQogIOKAoiBScG1maWxlIHJlYWRlciBoYXMgYmVlbiBtb3ZlZCBmcm9tIEFuZ3N0cm9tIGxp YnJhcnkgdG8gQnl0cmVhbQ0KICAgIGxpYnJhcnkuIFRoZSBiaWdnZXN0IGNoYW5nZSBpbiB0aGlz IHZlcnNpb24gaXMgdGhlIHN0YXJ0IG9mIHVzaW5nDQogICAgdGhlIEJ5dHJlYW0gbGlicmFyeSB0 byByZWFkIFJQTSBmaWxlcyBmcm9tIGlucHV0L291dHB1dCBzdHJlYW1zDQogIOKAoiBBZGRlZCBD UElPIGFyY2hpdmUgcmVhZGVyIChkb2VzIG5vdCBhdXRvbWF0aWNhbGx5IGRlY29tcHJlc3MgUlBN DQogICAgZmlsZSdzIHBheWxvYWQsIHlvdSB3aWxsIG5lZWQgdG8gZG8gdGhhdCB5b3Vyc2VsZikN Cg0KDQpOb3QgZG9uZSB5ZXQNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0K DQogIOKAoiBTaWduYXR1cmVzIHZlcmlmaWNhdGlvbg0KICDigKIgUGF5bG9hZCBkZWNvbXByZXNz aW9uDQogIOKAoiBEaWdlc3RzDQoNCg0Kb3hib3csIGEgZHluYW1pYyB0aWxpbmcgd2luZG93IG1h bmFnZXIgZm9yIHRoZSBXYXlsYW5kIGNvbXBvc2l0b3IgUml2ZXINCuKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1 c3Mub2NhbWwub3JnL3QvYW5uLW94Ym93LWEtZHluYW1pYy10aWxpbmctd2luZG93LW1hbmFnZXIt Zm9yLXRoZS13YXlsYW5kLWNvbXBvc2l0b3Itcml2ZXIvMTg0ODQvMT4NCg0KDQpDb2xlIGFubm91 bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSGVs bG8hDQoNCiAgSSdtIGV4Y2l0ZWQgdG8gc2hhcmUgYSBwcm9qZWN0IEkndmUgYmVlbiB3b3JraW5n IG9uIGZvciB0aGUgcGFzdCBmZXcNCiAgbW9udGhzLCBbb3hib3ddLg0KDQogIEl0J3MgaGVhdmls eSBpbnNwaXJlZCBieSBteSB0aW1lIHVzaW5nIGR3bSwgd2l0aCBzb21lIGlkZWFzIHRha2VuIGZy b20NCiAgb3RoZXIgd2luZG93IG1hbmFnZXJzIGxpa2UgSHlwcmxhbmQgYW5kIE5pcmkuIEZlYXR1 cmVzIGluY2x1ZGU6DQoNCiAg4oCiIFBlci10YWcgY29uZmlndXJhdGlvbiAobGF5b3V0LCBtZmFj dCwgZ2FwcywgZXRjLikNCiAg4oCiIFRpbGluZyBsYXlvdXRzIGluY2x1ZGluZyBldmVuLCBkaW1p bmlzaCwgZHdpbmRsZSwgc3BpcmFsLCBkZWNrLCBhbmQNCiAgICBtb25vY2xlDQogIOKAoiBOaXJp LWlzaCBzY3JvbGxpbmcgaW4gZm91ciBvcmllbnRhdGlvbnMNCiAg4oCiICJhbHQtdGFiIi1saWtl IG92ZXJ2aWV3DQogIOKAoiBQdXJlIGZsb2F0aW5nIGxheW91dDsgb3hib3cgcmVzcGVjdHMgbmF0 aXZlIGRyYWcgYW5kIHJlc2l6ZSByZXF1ZXN0cw0KICAgIG9uIHdpbmRvd3MsIG1ha2luZyBmbG9h dGluZyBtb2RlIGZlZWwgbW9yZSBuYXR1cmFsDQogIOKAoiBQb3B1bGFyIGR3bSBwYXRjaGVzIHN1 Y2ggYXMgc2NyYXRjaHBhZHMsIHN0aWNreSB3aW5kb3dzLCB3aW5kb3cNCiAgICBzd2FsbG93aW5n LCBhbmQgZ2Fwcw0KICDigKIgUmVnZXgtYmFzZWQgd2luZG93IHJ1bGVzIHRvIGNvbmZpZ3VyZSBp bml0aWFsIHRhZ3MsIG91dHB1dCwgc2l6ZSwNCiAgICBwb3NpdGlvbiwgYW5kIG1vcmUNCiAg4oCi IElQQyBjb250cm9sIHZpYSBgb3hjdGwnIHRvIGNvbmZpZ3VyZSBhbGwgb2YgdGhlIGFib3ZlLCBx dWVyeSBzdGF0ZSwNCiAgICBhbmQgc3Vic2NyaWJlIHRvIGV2ZW50cw0KDQogIG94Ym93IGlzIHBh Y2thZ2VkIGluIG9wYW0sIGJ1dCB5b3UgY2FuIGFsc28gaW5zdGFsbCBpdCB3aXRoIE5peC9OaXhP Uy4NCg0KICBZb3UgbWF5IG5vdGljZSB0aGlzIGlzIG15IGZpcnN0IHBvc3Q7IHRoYXQgaXMgYmVj YXVzZSB0aGlzIHByb2plY3QgaXMNCiAgbXkgZmlyc3QgdmVudHVyZSBpbnRvIE9DYW1sISBJIHdy b3RlIG94Ym93IHRvIGJlIHRoZSB3aW5kb3cgbWFuYWdlcg0KICBJJ3ZlIGFsd2F5cyB3YW50ZWQs IGJ1dCBhbHNvIHRvIGxlYXJuIE9DYW1sLiBJJ3ZlIHJlYWxseSBlbmpveWVkIHRoZQ0KICBleHBl cmllbmNlLCBhbmQgSSBwbGFuIHRvIHVzZSBPQ2FtbCBpbiBhIGZldyBvdGhlciBwcm9qZWN0cy4g SSd2ZSBkb25lDQogIG15IGJlc3QgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgT0NhbWwncyBzdHJlbmd0 aHMsIGJ1dCBJJ20gZnVsbHkgb3BlbiB0bw0KICBhbnkgc3VnZ2VzdGlvbnMvUFJzL2V0Yy4gdG8g aW1wcm92ZSB0aGUgaW50ZXJuYWxzIG9yIGFueSBvdGhlciBhc3BlY3QNCiAgb2Ygb3hib3cuDQoN CiAgVGhhbmsgeW91IGZvciBoYXZpbmcgbWUhDQoNCg0KW294Ym93XSA8aHR0cHM6Ly9veGJvdy13 bS5yZWFkdGhlZG9jcy5pbz4NCg0KDQpjZHAgMC4xLjAgLSB0eXBlZCBDaHJvbWUgRGV2VG9vbHMg UHJvdG9jb2wgbGlicmFyaWVzIGZvciBPQ2FtbA0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2 ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tY2RwLTAtMS0wLXR5cGVkLWNo cm9tZS1kZXZ0b29scy1wcm90b2NvbC1saWJyYXJpZXMtZm9yLW9jYW1sLzE4NDg2LzE+DQoNCg0K QXRsYXMwNyBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgA0KDQogIEhpIGV2ZXJ5b25lLA0KDQogIEknbSBoYXBweSB0byBhbm5vdW5j ZSB0aGUgZmlyc3QgcmVsZWFzZSBvZiBbb2NhbWwtY2RwXSAtIHR5cGVkIE9DYW1sDQogIGxpYnJh cmllcyBmb3IgdGhlIFtDaHJvbWUgRGV2VG9vbHMgUHJvdG9jb2xdLg0KDQoNCltvY2FtbC1jZHBd IDxodHRwczovL2dpdGh1Yi5jb20vYWhyZWZzL29jYW1sLWNkcD4NCg0KW0Nocm9tZSBEZXZUb29s cyBQcm90b2NvbF0NCjxodHRwczovL2Nocm9tZWRldnRvb2xzLmdpdGh1Yi5pby9kZXZ0b29scy1w cm90b2NvbC8+DQoNCldoeQ0K4pWM4pWM4pWMDQoNCiAgQ0RQIGxldHMgYSBwcm9ncmFtIGNvbnRy b2wgYSByZWFsIENocm9tZTogb3BlbiBwYWdlcywgcnVuIEphdmFTY3JpcHQsDQogIHRha2Ugc2Ny ZWVuc2hvdHMsIHJlbmRlciBQREZzLCB3YXRjaCBuZXR3b3JrIHRyYWZmaWMuICBPQ2FtbCBoYWQg bm8NCiAgQ0RQIGxpYnJhcnkuIGBvY2FtbC1jZHAnIGZpbGxzIHRoYXQgZ2FwOiBpdCB0dXJucyB0 aGUgb2ZmaWNpYWwNCiAgcHJvdG9jb2wgZGVmaW5pdGlvbnMgaW50byB0eXBlZCBPQ2FtbCBtb2R1 bGVzLCBzbyB0aGUgY29tcGlsZXIgY2hlY2tzDQogIGV2ZXJ5IGNvbW1hbmQsIGV2ZW50LCBhbmQg ZmllbGQuDQoNCg0KV2hhdCB5b3UgZ2V0DQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYwNCg0KICBUaHJlZSBwYWNrYWdlczoNCiAg4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB 4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB 4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB 4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB 4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB 4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB 4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB 4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSBDQog ICBQYWNrYWdlICAgIFdoZXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdoYXQgaXQgaXMg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAN CiAgIGBjZHAnICAgICAgb3BhbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZWQgcHJv dG9jb2wgZG9tYWluczogcmVjb3JkcywgZW51bXMsIGNvbW1hbmRzLCBldmVudHMsIHdpdGggSlNP TiBjb2RlY3MuIFRyYW5zcG9ydC1hZ25vc3RpYy4gDQogICBgY2RwLWdlbicgIG9wYW0gICAgICAg ICAgICAgICAgICAgICAgICAgICAgIFRoZSBnZW5lcmF0b3IgQ0xJOiBwcm90b2NvbCBKU09OIGlu LCBPQ2FtbCBvdXQuIEFueSByZXZpc2lvbiwgeW91ciBvd24gZG9tYWluIHNlbGVjdGlvbi4gICAg ICAgIA0KICAgYGNkcC1sd3QnICBHaXRIdWIgb25seSBmb3Igbm93IChzZWUgYmVsb3cpICBUaGUg Y2xpZW50OiBsYXVuY2hlcyBvciBhdHRhY2hlcyB0byBhIENocm9tZSBhbmQgZHJpdmVzIGl0IG92 ZXIgYGxpYmN1cmwnIFdlYlNvY2tldHMuICAgICAgICAgICANCiAg4pSB4pSB4pSB4pSB4pSB4pSB 4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB 4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB 4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB 4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB 4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB 4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB 4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB 4pSB4pSBDQoNCiAgYGNkcCcgc2hpcHMgMTAgZG9tYWlucyAoQnJvd3NlciwgRE9NLCBEZWJ1Z2dl ciwgRW11bGF0aW9uLCBJTywNCiAgTmV0d29yaywgUGFnZSwgUnVudGltZSwgU2VjdXJpdHksIFRh cmdldCk7IHRoZSBnZW5lcmF0b3IgY292ZXJzIGFsbA0KICA1OC4NCg0KICBIZXJlIGlzIHRoZSBm dWxsIHJvdW5kIHRyaXA6IGxhdW5jaCBhIGhlYWRsZXNzIENocm9tZSwgb3BlbiBhIHBhZ2UsDQog IHJlYWQgaXRzIHRpdGxlIGJhY2s6DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBsZXQlbHd0 IGNocm9tZSA9IENkcF9sd3QuQ2hyb21lLmxhdW5jaCAoKSBpbg0KICDilIIgbGV0JWx3dCB0cmFu c3BvcnQgPSBDZHBfbHd0LkN1cmxfdHJhbnNwb3J0LmNvbm5lY3QgfnVybDpjaHJvbWUud3NfdXJs ICgpIGluDQogIOKUgiBsZXQgY29ubmVjdGlvbiA9IENkcF9sd3QuQ29ubmVjdGlvbi5jcmVhdGUg dHJhbnNwb3J0IGluDQogIOKUgiBsZXQgY2FsbCA/c2Vzc2lvbiBjb21tYW5kID0gQ2RwX2x3dC5D b25uZWN0aW9uLmNhbGwgY29ubmVjdGlvbiA/c2Vzc2lvbiBjb21tYW5kIGluDQogIOKUgiBsZXQl bHd0IGNyZWF0ZWQgPQ0KICDilIIgICBjYWxsIChDZHAuVGFyZ2V0LkNyZWF0ZV90YXJnZXQuY29t bWFuZCAoQ2RwLlRhcmdldC5DcmVhdGVfdGFyZ2V0Lm1ha2VfcGFyYW1zIH51cmw6ImFib3V0OmJs YW5rIiAoKSkpDQogIOKUgiBpbg0KICDilIIgbGV0JWx3dCBhdHRhY2hlZCA9DQogIOKUgiAgIGNh bGwgKENkcC5UYXJnZXQuQXR0YWNoX3RvX3RhcmdldC5jb21tYW5kDQogIOKUgiAgICAgICAgICAg KENkcC5UYXJnZXQuQXR0YWNoX3RvX3RhcmdldC5tYWtlX3BhcmFtcyB+dGFyZ2V0X2lkOmNyZWF0 ZWQudGFyZ2V0X2lkIH5mbGF0dGVuOnRydWUgKCkpKQ0KICDilIIgaW4NCiAg4pSCIGxldCBzZXNz aW9uID0gYXR0YWNoZWQuc2Vzc2lvbl9pZCBpbg0KICDilIIgbGV0JWx3dCAoKSA9IGNhbGwgfnNl c3Npb24gKENkcC5QYWdlLkVuYWJsZS5jb21tYW5kIChDZHAuUGFnZS5FbmFibGUubWFrZV9wYXJh bXMgKCkpKSBpbg0KICDilIIgbGV0IGxvYWRlZCA9IENkcF9sd3QuQ29ubmVjdGlvbi5uZXh0X2V2 ZW50IGNvbm5lY3Rpb24gfnNlc3Npb24gQ2RwLlBhZ2UuTG9hZF9ldmVudF9maXJlZC5ldmVudCBp bg0KICDilIIgbGV0JWx3dCBfbmF2ID0NCiAg4pSCICAgY2FsbCB+c2Vzc2lvbiAoQ2RwLlBhZ2Uu TmF2aWdhdGUuY29tbWFuZA0KICDilIIgICAgICAgICAgICAgICAgICAgIChDZHAuUGFnZS5OYXZp Z2F0ZS5tYWtlX3BhcmFtcyB+dXJsOiJodHRwczovL29jYW1sLm9yZyIgKCkpKQ0KICDilIIgaW4N CiAg4pSCIGxldCVsd3QgX2ZpcmVkID0gbG9hZGVkIGluDQogIOKUgiBsZXQlbHd0IGV2YWx1YXRl ZCA9DQogIOKUgiAgIGNhbGwgfnNlc3Npb24gKENkcC5SdW50aW1lLkV2YWx1YXRlLmNvbW1hbmQg KENkcC5SdW50aW1lLkV2YWx1YXRlLm1ha2VfcGFyYW1zIH5leHByZXNzaW9uOiJkb2N1bWVudC50 aXRsZSIgKCkpKQ0KICDilIIgaW4NCiAg4pSU4pSA4pSA4pSA4pSADQoNCg0KV2h5IGNkcC1sd3Qg aXMgbm90IG9uIG9wYW0geWV0DQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0K ICBgY2RwLWx3dCcgdXNlcyBsaWJjdXJsJ3MgV2ViU29ja2V0IEFQSSB0aHJvdWdoIHRoZSBgY3Vy bCcNCiAgYmluZGluZ3MuIFRoYXQgQVBJIGlzIG9uIG9jdXJsJ3MgbWFzdGVyIGJyYW5jaCwgYnV0 IG5vdCBpbiBhbnkgb2N1cmwNCiAgcmVsZWFzZSB5ZXQuIGBjZHAtbHd0JyBidWlsZHMgZmluZSBm cm9tIGEgY2xvbmUgKGl0cyBvcGFtIGZpbGUgcGlucw0KICBvY3VybCBtYXN0ZXIpLiBBcyBzb29u IGFzIG9jdXJsIG1ha2VzIGEgcmVsZWFzZSwgYGNkcC1sd3QnIGZvbGxvd3MNCiAgb250byBvcGFt Lg0KDQoNCkhhcmRjYW1sIE5ldHdvcmtpbmcgTGlicmFyeSAtIFRveSBQcm9qZWN0DQrilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2hhcmRjYW1s LW5ldHdvcmtpbmctbGlicmFyeS10b3ktcHJvamVjdC8xODQ4OC8xPg0KDQoNCkJvaGRhbiBQdXJ0 ZWxsIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCkdlbmVyYWwgS2Vub2JpDQrilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBHcmVldGluZ3MuDQoNCiAg TXkgbmFtZSBpcyBCbyBQdXJ0ZWxsLCBhbmQgSSdtIGFuIGFzcGlyaW5nIHNlbmlvciBhdCB0aGUg VW5pdmVyc2l0eSBvZg0KICBGbG9yaWRhLg0KDQogIFdhbnRlZCB0byBzaGFyZSBhIGxpdHRsZSBw cm9qZWN0IEkndmUgYmVlbiB3b3JraW5nIG9uIG92ZXIgdGhlIGNvdXJzZQ0KICBvZiB0aGUgbGFz dCB5ZWFyIGJlaW5nIGEgc21hbGwgbmV0d29ya2luZyBzdGFjayBmb3IgdGhlIGBoYXJkY2FtbCcN CiAgZWNvc3lzdGVtIGZvciBoYXJkd2FyZSBkZXZlbG9wbWVudCB3aXRoIE9DYW1sISBUaGUgcHJv amVjdCBpcyBzdGlsbCBpbg0KICBpdCdzIGluZmFuY3kgc3RhZ2VzIHJpZ2h0IG5vdywgYnV0IEkn dmUgdmFsaWRhdGVkIG91dCBhIDEwLzEwME1iDQogIGR1cGxleCBpbnRlcmZhY2Ugd2l0aCB2ZXJ5 IGxvb3NlIElQdjQgYW5kIFVEUCBzdXBwb3J0LCBhbmQgSSdtDQogIGN1cnJlbnRseSB3cmFwcGlu ZyB1cCBhIFBDUyBsYXllciBmb3IgNjQvNjZiIEJBU0UtUiBlbmNvZGluZ3MgZm9yIDEwRw0KICBh cHBsaWNhdGlvbnMuIEEgdGFkIGxpbWl0ZWQgd2l0aCBteSBzZXJ2ZXJzIGdldHRpbmcgbW92ZWQg YWxsIHRoZSB3YXkNCiAgYmFjayB0byBGbG9yaWRhIChmcm9tIENhbGkpIHRob3VnaCwgYW5kIEkg bG9zdCBvbmUgb2YgbXkgcmVncmVzc2lvbg0KICBtYWNoaW5lcyBpbiB0aGUgbW92ZSBzbyBnb2lu ZyB0byBoYXZlIHRvIGdvIGRpdmUgaW50byBkb2NrZXIgc3R1ZmYNCiAgYWdhaW4gLSBibGVoLg0K DQogIDxodHRwczovL2dpdGh1Yi5jb20vTGVFbXBlcm9yL2hhcmRjYW1sX25ldHdvcmtpbmc+DQoN Cg0KSXQncyBBbGwgTWF0aA0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM DQoNCiAgSSBmZWFyIHRoYXQgSSBjYW5ub3QgZ28gYmFjayB0byB3cml0aW5nIFN5c3RlbVZlcmls b2cgdGhlIHNhbWUgd2F5DQogIGFueW1vcmUgZ2l2ZW4gdGhlIHdvbmRlcmZ1bCBsZXZlbHMgb2Yg YWJzdHJhY3Rpb24gdGhhdCBJIHdhcyBhYmxlIHRvDQogIGdldCBhd2F5IHdpdGggaW4gT0NhbWwu IEkgZmlybWx5IGJlbGlldmUgdGhhdCBteSB0aGlua2luZyBvZiBob3cNCiAgInN0YXRlIiBpcyBy ZXByZXNlbnRlZCwgYW5kIHRoZSBmYWN0IHRoYXQgSSBjb3VsZCByZWFjaCBmb3INCiAgbWF0aGVt YXRpY2FsIHRlcm1pbm9sb2d5IHdoZW4gSSB3ZW50IHRvIGRlc2NyaWJlIGFuIE9DYW1sIGNvbnN0 cnVjdA0KICBoZWxwZWQgbWUgaW1tZW5zZWx5IGluIGJlaW5nIGFibGUgdG8gcmVhc29uIGFib3V0 IHNvbWUgb2YgdGhlc2UNCiAgc3lzdGVtcyBhcyBJIHdhcyBjb25zdHJ1Y3RpbmcgdGhlbS4gSGVs cHMgd2l0aCB2ZXJpZmljYXRpb24gdG8gYW4NCiAgZXh0ZW50IHRvby4NCg0KDQpDaGFsbGVuZ2Vz DQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBUaGUgYmlnZ2VzdCBjaGFsbGVu Z2UgSSBmYWNlZCB3YXMgdGhlIHN0cnVjdHVyaW5nIG9mIG15IHZlcmlmaWNhdGlvbg0KICBzdWl0 ZXMgYW5kIHRlc3RpbmcuIFRoZXJlIGFyZSBhIGZldyBmbG9hdGluZyBoYXJkY2FtbCBwcm9qZWN0 cyBhcm91bmQsDQogIGJ1dCB0cnlpbmcgdG8gaW50ZWdyYXRlIGFyb3VuZCB0aGUgZXhwZWN0IHRl c3QgZnJhbWV3b3JrIHdhcyBhIHRhZA0KICBkaWZmaWN1bHQgc2luY2Ugc2FpZCBleGFtcGxlcyBh cmUgcXVpdGUgcG9vciBpbiBkZW1vbnN0cmF0aW5nDQogIHJlLXVzYWJsZSBhcmNoaXRlY3R1cmUg b3IgaW50ZWdyYXRpb24gdGVzdGluZy4gSSBoYWQgdGhvdWdodHMgdGhhdA0KICBgQWxjb3Rlc3Qn IG1pZ2h0IGJlIHVzZWQgZm9yIGxhcmdlciBpbnRlZ3JhdGlvbiBzdWl0ZXMsIGJ1dCBJIGZlZWwN CiAgaXQncyBwaGlsb3NvcGh5IGdvZXMgYWdhaW5zdCB3aGF0IGEgc3RhbmRhcmQgZXhwZWN0IHRl c3QgaXMgZXZlbg0KICBzaG9vdGluZyBhdCBkb2luZy4gVWx0aW1hdGVseSwgZXhwZWN0IHRlc3Rz IHB1c2hlZCBtZSB0byBFbWFjcyAoZnJvbQ0KICBOZW92aW0pLCBhcyBleHBlY3QgdGVzdHMgYW5k IGB0dWFyZWcnIGZpdCBuaWNlbHkgdG9nZXRoZXIgLSBpZiBJIGhhZA0KICB0byBnbyBwYXN0aW5n IHMtZXhwcmVzc2lvbnMgYWdhaW4gZnJvbSB0aGUgdGVybWluYWwgSSBwcm9iYWJseQ0KICB3b3Vs ZCd2ZSBpbXBsb2RlZC4gVGhlIGNoYW5nZSBpcyBkZWZpbml0ZWx5IGludGVyZXN0aW5nLCBidXQg d2VsbA0KICB3b3J0aCBpdCBpbiB0ZXJtcyBvZiBjb25maWd1cmFiaWxpdHkgYW5kIE9DYW1sIHN1 cHBvcnQuDQoNCiAgYFF1aWNrY2hlY2snIHRlc3RzIHdlcmUgcXVpdGUgbmlmdHkgYXMgd2VsbCwg YnV0IEkgd2FzIGZseWluZw0KICBjb21wbGV0ZWx5IGJsaW5kIG9uIHVzaW5nIHRob3NlLCBhcyB0 aGVyZSBhcmUgc2VsZG9tIGV4YW1wbGVzIGZvciBhbnkNCiAgcHJvcGVybHktc2l6ZWQgcHJvamVj dHMgcmVsZWFzZS4gSXQgd2FzIG5pY2UgdG8gc2VlIHRoYXQgYWxvdCBvZiBteQ0KICBvd24gVVZN LWJhc2VkIGlkaW9tcyB0aGF0IEkgYW0gZmFtaWxpYXIgd2l0aCB0cmFuc2xhdGVkIHNvbWV3aGF0 IHdlbGwNCiAgd2l0aCB0aGUgYE9ic2VydmF0aW9uLnQnIGFuZCBgU25hcHNob3QudCcgZm9ybWF0 aW9ucywgYnV0IGl0IHdvdWxkDQogIHN0aWxsIGJlIG5pY2UgdG8gc2VlIHdoYXQgYWN0dWFsIHBy b2R1Y3Rpb24tZ3JhZGUgaGFyZGNhbWwNCiAgdmVyaWZpY2F0aW9uIGxvb2tzIGxpa2UuIFdpc2gg dGhlcmUgd2VyZSBmb3JtYWwgdmVyaWYgZXhhbXBsZXMgYXMgd2VsbA0KICBhcyBJIGhhdmUgYmVl biBmaXJtbHkgZ3Jhc3BlZCBieSB0aGUgZm9ybWFsLXZlcmlmLWJ1ZywgYnV0IG9ubHkgYSBmZXcN CiAgZHJvbmluZ3MgaW4gZGVhZCBicmFuY2hlcyB3ZXJlIGFsbCBJIGNvdWxkIG11c3Rlci4NCg0K DQpJbiBTcGFjZSENCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIFRydWx5IGEgYnVt bWVyIHRoYXQgbm8gZnVuY3Rpb25hbCBsYW5ndWFnZXMgd2lsbCBldmVyIHNlZSBpbmR1c3RyeQ0K ICB1c2UuIFdpdGggdGhhdCBpbiBtaW5kLCBhZnRlciB3cmFwcGluZyB1cCBhIGRvdWJsZS1pbnRl cm5zaGlwIHN0aW50DQogIFNwcmluZyAmIFN1bW1lciBJIGNhbiBmaW5hbGx5IGNsYWltIHRoYXQg c29tZSBub256ZXJvIGFtb3VudCBvZg0KICBIYXJkY2FtbCBpcyBmbHlpbmcgaW4gU3BhY2UhICBJ ZiBhbnlvbmUgaGFzIGFueSBxdWVzdGlvbnMgZmVlbCBmcmVlIHRvDQogIHNob290IG1lIGEgbWVz c2FnZSBoZXJlIG9yIG9uIExpbmtlZEluIQ0KDQogIFBTIDogaWYgYW55b25lIGlzIGZhbWlsaWFy IHdpdGggcHJvcGVyIGhhcmRjYW1sLWJhc2VkIHZlcmlmaWNhdGlvbiwNCiAgY291bGQgSSBiZWcg Zm9yIGEgcXVpY2sgY2hhdCBvbiBob3cgaW50ZWdyYXRpb24gdGVzdHMgd291bGQgZXZlbiB3b3Jr DQogIHdpdGggZXhwZWN0IHN5c3RlbXM/IERvIEkganVzdCBjaHVjayBhIGdpZ2FudGljIDMwMC1s aW5lIHMtZXhwcmVzc2lvbg0KICBpbnRvIHRoZSBleHBlY3RlZCBmaWVsZD8gU3VyZWx5IG5vdC4g RG9lcyBgQWxjb3Rlc3QnIGV2ZW4gZW50ZXIgdGhlDQogIHZvY2FidWxhcnkgZm9yIHN1Y2ggdGhp bmdzIHRoZW4/DQoNCg0KRlVOIE9DYW1sIDIwMjcgaW4gQmFuZ2Fsb3JlLCBKYW4gMjUtMjYgLSBU aW1lIHRvIFNlbmQgVGFsayBhbmQgV29ya3Nob3AgUHJvcG9zYWxzIC0gVW50aWwgU2VwIDMwDQri lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Z1bi1vY2Ft bC0yMDI3LWluLWJhbmdhbG9yZS1qYW4tMjUtMjYtdGltZS10by1zZW5kLXRhbGstYW5kLXdvcmtz aG9wLXByb3Bvc2Fscy11bnRpbC1zZXAtMzAvMTg0OTAvMT4NCg0KDQpTYWJpbmUgU2NobWFsdHog YW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBIaSBldmVyeW9uZSENCg0KICBXZSBh cmUgc3VwZXIgZXhjaXRlZCB0byBhbm5vdW5jZSB0aGF0IFtGUCBMYXVuY2hwYWRdIGlzIGhvc3Rp bmcgKipGVU4NCiAgT0NhbWwgMjAyNyBpbiBCYW5nYWxvcmUqKiEgVGhpcyB3aWxsIGJlIHRoZSB2 ZXJ5IGZpcnN0IGVkaXRpb24gb2YgRlVODQogIE9DYW1sIChhbmQgdGhlIGZpcnN0IG1ham9yIE9D YW1sIGNvbmZlcmVuY2UpIGluIEluZGlhLg0KDQogIEZVTiBPQ2FtbCAyMDI3IGlzIGEgdHdvLWRh eSBvcGVuIHNvdXJjZSBoYWNraW5nIGV2ZW50IGRlZGljYXRlZCB0bw0KICBPQ2FtbCBlbnRodXNp YXN0cyBhbmQgcHJvZmVzc2lvbmFscywgZm9jdXNpbmcgb24gdGhlIHJlYWwtd29ybGQgaW1wYWN0 DQogIG9mIE9DYW1sIGFuZCBicmluZ2luZyBvdXIgZ2xvYmFsIGNvbW11bml0eSB0b2dldGhlci4N Cg0KICAqRXZlbnQgRGV0YWlscyoNCiAg4oCiICpEYXRlczoqIEphbnVhcnkgMjUtMjYsIDIwMjcN CiAg4oCiICpMb2NhdGlvbjoqIE1MUiBDb252ZW50aW9uIENlbnRyZSwgQnJpZ2FkZSBNaWxsZW5u aXVtIENhbXB1cywgSlANCiAgICAgTmFnYXIgN3RoIFBoYXNlLCBCYW5nYWxvcmUNCiAg4oCiICpG b3JtYXQ6KiBEYXkgMSBpcyBkZWRpY2F0ZWQgdG8gdGFsa3MgKGluY2x1ZGluZyBhIGtleW5vdGUs DQogICAgIGxpdmUtc3RyZWFtZWQgb25saW5lKSwgYW5kIERheSAyIGZlYXR1cmVzIGhhbmRzLW9u IHdvcmtzaG9wcyBhbmQNCiAgICAgY29sbGFib3JhdGl2ZSBoYWNraW5nLg0KDQogICpDYWxsIGZv ciBQYXJ0aWNpcGF0aW9uIChDRlApIGlzIE9wZW4hKg0KDQogIFRoZSBjYWxsIGlzIG9wZW4gdGhy b3VnaCAqU2VwdGVtYmVyIDMwKi4gV2Ugd2VsY29tZSBzdWJtaXNzaW9ucyBmcm9tDQogIGFsbCBl eHBlcmllbmNlIGxldmVscyAtIHdoZXRoZXIgeW91IGFyZSBhIGZpcnN0LXRpbWUgc3BlYWtlciwg aW5kdXN0cnkNCiAgcHJhY3RpdGlvbmVyLCBhY2FkZW1pYyByZXNlYXJjaGVyLCBvciBvcGVuIHNv dXJjZSBtYWludGFpbmVyLg0KDQogIFRvcGljcyB3ZSBhcmUgZXNwZWNpYWxseSBleGNpdGVkIGFi b3V0Og0KICDigKIgSG93IHlvdSB1c2UgT0NhbWwgaW4geW91ciBidXNpbmVzcyBvciBwZXJzb25h bCBwcm9qZWN0cw0KICDigKIgT0NhbWwgbGlicmFyaWVzLCBmcmFtZXdvcmtzLCBhbmQgdG9vbHMg aW4gdGhlIGVjb3N5c3RlbQ0KICDigKIgSGFuZHMtb24gZGVtb25zdHJhdGlvbnMgdGhhdCBpbnNw aXJlIHBlb3BsZSB0byBoYWNrIG9uIERheSAyDQogIOKAoiBEZWVwIGRpdmVzIGludG8gYWN0dWFs IGNvZGUgYW5kIHRoZSByZWFzb25pbmcgYmVoaW5kIGRlc2lnbg0KICAgIGRlY2lzaW9ucw0KICDi gKIgRXhwZXJpZW5jZSByZXBvcnRzIGFuZCBsZXNzb25zIGxlYXJuZWQNCg0KICBBbGwgdGFsa3Mg d2lsbCBiZSBsaXZlLXN0cmVhbWVkIGFuZCB1cGxvYWRlZCB0byB3YXRjaC5vY2FtbC5vcmcgYW5k DQogIFtGVU4gT0NhbWwncyBZb3VUdWJlIGNoYW5uZWxdLg0KDQogIOKAoiAqU3VibWl0IHlvdXIg cHJvcG9zYWw6KiA8aHR0cHM6Ly9mdW4tb2NhbWwuY29tLz4gKG9yIGRpcmVjdGx5IHZpYQ0KICAg ICB0aGUgW0NGUCBzdWJtaXNzaW9uIGxpbmtdKQ0KICDigKIgKlN0YXkgdXBkYXRlZDoqIEZvbGxv dyBGVU4gT0NhbWwgb24gaXRzIHZhcmlvdXMgc29jaWFsIGNoYW5uZWxzIGFuZA0KICAgICBqb2lu IHRoZSBGVU4gT0NhbWwgRGlzY29yZCBzZXJ2ZXIgKHNlZSB3ZWJzaXRlKS4NCg0KICBXZSBjYW4n dCB3YWl0IHRvIHNlZSB5b3VyIHByb3Bvc2FscyBhbmQgbG9vayBmb3J3YXJkIHRvIHdlbGNvbWlu ZyB5b3UNCiAgdG8gQmFuZ2Fsb3JlIQ0KDQogICpOb3RlOiogQSBtYWpvciByZWFzb24gd2h5IHdl J3ZlIGNob3NlbiB0byBob3N0IEZVTiBPQ2FtbCBpbiBJbmRpYQ0KICAgdGhpcyB5ZWFyIGlzIHRo YXQgd2Ugd2lsbCAoYSkgaGF2ZSBhbiBlYXN5IHRpbWUgZ2V0dGluZyB0aGUgZXZlbnQNCiAgIGZ1 bGx5IGJvb2tlZCwgd2l0aCBib3RoIHN0dWRlbnRzIGFuZCBwcm9mZXNzaW9uYWxzLCBhbmQgKGIp IHdpbGwgYmUNCiAgIGFibGUgdG8gYWdhaW4gYWZmb3JkIGhpZ2ggcHJvZHVjdGlvbiBxdWFsaXR5 IHJlY29yZGluZ3MuIFdlIGV4cGVjdA0KICAgaGlnaGVyIGRlbWFuZCBhbmQgbW9yZSBwYXJ0aWNp cGFudHMgZm9yIHRoZSBPQ2FtbCBiZWdpbm5lcnMNCiAgIHdvcmtzaG9wLiBBdCB0aGUgc2FtZSB0 aW1lLCB3ZSB1bmRlcnN0YW5kIHRoYXQgdHJhdmVsaW5nIHRvIEluZGlhIGlzDQogICBsZXNzIGlk ZWFsIHRoYW4gdHJhdmVsaW5nIGluIHRoZSBFVS4NCg0KICBBcyBhIHNwZWFrZXIsIGlmIHRoZXJl J3MgYW55IGNvbmNlcm4gYWJvdXQgZnVuZGluZyB0cmF2ZWwsIHBsZWFzZQ0KICBjaGVjayB0aGUg Ym94IGluIHRoZSBDRlAgZm9ybSB0byBhcHBseSBmb3IgZmluYW5jaWFsIGFzc2lzdGFuY2UuIEFs c28sDQogIHNlbmQgeW91ciBwcm9wb3NhbHMgZWFybHksIHNvIHRoYXQgeW91IGNhbiBzdGFydCB2 aXNhIGFwcGxpY2F0aW9uICh3ZQ0KICBwcm92aWRlIHZpc2Egc3VwcG9ydCkgYXMgc29vbiBhcyB5 b3VyIHNlc3Npb24gaXMgYWNjZXB0ZWQuDQoNCg0KW0ZQIExhdW5jaHBhZF0gPGh0dHBzOi8vZnBs YXVuY2hwYWQub3JnLz4NCg0KW0ZVTiBPQ2FtbCdzIFlvdVR1YmUgY2hhbm5lbF0gPGh0dHBzOi8v d3d3LnlvdXR1YmUuY29tL0BGVU5PQ2FtbD4NCg0KW0NGUCBzdWJtaXNzaW9uIGxpbmtdDQo8aHR0 cHM6Ly9jZnAuZnVuLW9jYW1sLmNvbS9mdW4tb2NhbWwtMjAyNy1iZW5nYWx1cnUvY2ZwPg0KDQoN CmVhc2UtY2FtbCAtIEVhc2luZyBsaWJyYXJ5IGZvciBPQ2FtbA0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBz Oi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tZWFzZS1jYW1sLWVhc2luZy1saWJyYXJ5LWZvci1v Y2FtbC8xODQ5NC8xPg0KDQoNCkNocmlzdG9waGVyIFN1bW5pY2h0IGFubm91bmNlZA0K4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSGkgZXZlcnlvbmUsDQoNCiAgSSBhbSBo YXBweSB0byBpbnRyb2R1Y2U6IFtlYXNlLWNhbWxdIChvbiBbb3BhbV0pIC0gYW4gZWFzaW5nIGxp YnJhcnkNCiAgZm9yIE9DYW1sLg0KDQoNCltlYXNlLWNhbWxdIDxodHRwczovL2dpdGh1Yi5jb20v TW9kdWxhci1HYW1lLUNvbXBvbmVudHMvZWFzZS1jYW1sPg0KDQpbb3BhbV0gPGh0dHBzOi8vb3Bh bS5vY2FtbC5vcmcvcGFja2FnZXMvZWFzZS1jYW1sLz4NCg0KV2h5Pw0K4pWM4pWM4pWM4pWMDQoN CiAgSW4gdmlkZW8gZ2FtZXMgeW91IG9mdGVuIHdhbnQgdG8gbWFuYWdlIGFuaW1hdGlvbnMgYW5k DQogIHRyYW5zaXRpb25zLiBVc3VhbGx5IHRoaXMgcmVxdWlyZXMgZGVmb3JtaW5nIGEgZmxvYXRp bmcgcG9pbnQgdmFsdWUNCiAgZnJvbSBvbmUgdmFsdWUgdG8gYW5vdGhlciAob2Z0ZW4gY29udGlu dW91c2x5KSBvdmVyIHRpbWUgc28gdGhhdCBhbg0KICBvYmplY3QgbW92ZXMgZnJvbSBvbmUgcGxh Y2UgdG8gYW5vdGhlci4gU3VjaCBhIGRlZm9ybWF0aW9uIGlzIG9mdGVuDQogIHJlZmVycmVkIHRv IGFzIGFuIGVhc2luZyBvciB0d2Vlbi4gSXQgY2FuIGJlIGhhcmQgdG8ga2VlcCB0cmFjayBvZg0K ICB0d2VlbnMuIEluIEx1YSwgdGhlcmUgYXJlIHZhcmlvdXMgbGlicmFyaWVzIGxpa2UgaHVtcC50 aW1lciBhbmQgRmx1eA0KICB3aGljaCBoZWxwIG1hbmFnZSBhbmQgb3JnYW5pemUgdGhlIHR3ZWVu cyB5b3UgaGF2ZSBtYWRlIHNvIHlvdSBjYW4NCiAgZWFzaWx5IGNyZWF0ZSBkaWZmZXJlbnQga2lu ZHMgYW5kIGhhdmUgYSBzaW5nbGUgc291cmNlIG9mIHVwZGF0aW5nDQogIHRoZW0uIGVhc2UtY2Ft bCBpcyBpbnNwaXJlZCBieSB0aG9zZSBsaWJyYXJpZXMgYW5kIGlzIGludGVuZGVkIHRvIGhlbHAN CiAgd2l0aCBPQ2FtbCBnYW1lIGRldmVsb3BtZW50Lg0KDQogIEFsc28sIEkgbWVudGlvbmVkIGdh bWVzIGFib3ZlOiBXaGV0aGVyIHlvdSB1c2UgU0RMLCBSYXlsaWIsIG9yIHByZXR0eQ0KICBtdWNo IGFueXRoaW5nIGVsc2UsIHlvdSBjYW4gdXNlIHRoaXMgbGlicmFyeS4gSXQganVzdCByZXF1aXJl cyBhbg0KICB1cGRhdGUgbG9vcC4NCg0KDQpFeGFtcGxlDQrilYzilYzilYzilYzilYzilYzilYwN Cg0KICBIZXJlIGlzIGEgc21hbGwgZXhhbXBsZSBvZiBhIGJvdW5jaW5nIGJhbGwgKHVzZXMgcmF5 bGliLW9jYW1sKS4NCg0KICDilIzilIDilIDilIDilIANCiAg4pSCIHR5cGUgY2lyY2xlID0NCiAg 4pSCIHsNCiAg4pSCICAgcjogZmxvYXQ7DQogIOKUgiAgIHg6IGZsb2F0Ow0KICDilIIgICB5OiBm bG9hdCByZWY7DQogIOKUgiB9DQogIOKUgiANCiAg4pSCIGxldCBiYWxsIDogY2lyY2xlID0geyBy ID0gNDAuMDsgeCA9IDQwMC4wOyB5ID0gcmVmIH4tLjQwLjAgfQ0KICDilIIgbGV0IHR5ID0gVHdl ZW4ubWFrZV90d2VlbiBiYWxsLnkgMjI1LjAgfmVmOkVhc2Vycy5ib3VuY2UgMS4wDQogIOKUgiBs ZXQgdG0gPSBUd2Vlbi5uZXdfbWFuYWdlciAoKQ0KICDilIIgDQogIOKUgiBsZXQgc2V0dXAgKCkg PQ0KICDilIIgICBSYXlsaWIuaW5pdF93aW5kb3cgODAwIDQ1MCAic2ltcGxlX3R3ZWVuIjsNCiAg 4pSCICAgUmF5bGliLnNldF90YXJnZXRfZnBzIDYwOw0KICDilIIgICBUd2Vlbi5hZGQgdHkgdG0N CiAg4pSCIA0KICDilIIgbGV0IHJlYyBsb29wICgpID0NCiAg4pSCICAgaWYgUmF5bGliLndpbmRv d19zaG91bGRfY2xvc2UgKCkgdGhlbiBSYXlsaWIuY2xvc2Vfd2luZG93ICgpDQogIOKUgiAgIGVs c2UgKA0KICDilIIgICAgIGxldCBvcGVuIFJheWxpYiBpbg0KICDilIIgICAgIFR3ZWVuLnVwZGF0 ZSB0bSAoZ2V0X2ZyYW1lX3RpbWUgKCkpOw0KICDilIIgICAgIGJlZ2luX2RyYXdpbmcgKCk7DQog IOKUgiAgICAgY2xlYXJfYmFja2dyb3VuZCBDb2xvci5yYXl3aGl0ZTsNCiAg4pSCICAgICBkcmF3 X2NpcmNsZV92IChWZWN0b3IyLmNyZWF0ZSBiYWxsLnggIShiYWxsLnkpKSBiYWxsLnIgQ29sb3Iu bWFyb29uOw0KICDilIIgICAgIGVuZF9kcmF3aW5nICgpOw0KICDilIIgICAgIGxvb3AgKCkNCiAg 4pSCICAgKQ0KICDilIIgDQogIOKUgiBsZXQgKCkgPSBzZXR1cCAoKSB8PiBsb29wDQogIOKUlOKU gOKUgOKUgOKUgA0KDQogIChOb3RlIGFzIGEgbmV3IHVzZXIgSSBjYW5ub3QgcHV0IG1vcmUgdGhh biAyIGxpbmtzLiBJZiB5b3UgbmVlZCBoZWxwDQogIGZpbmRpbmcgaHVtcC50aW1lciwgRmx1eCwg b3IgcmF5bGliLW9jYW1sLCBwbGVhc2UgbGV0IG1lIGtub3chKQ0KDQoNCm9wYW0gMi42LjB+YWxw aGExDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAN Cg0KICBBcmNoaXZlOiA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1vcGFtLTItNi0w LWFscGhhMS8xODM3Mi80Pg0KDQoNCkNvbnRpbnVpbmcgdGhpcyB0aHJlYWQsIEthdGUgYW5ub3Vu Y2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIANCg0KICBIb3Qgb24gdGhlIGhlZWxzIG9mIGJldGExLCB3ZSBhcmUgaGFwcHkgdG8gYW5u b3VuY2UgdGhlIHJlbGVhc2Ugb2YNCiAgb3BhbSAyLjYuMH5iZXRhMi4NCg0KICBUaGlzIHZlcnNp b24gaXMgYSBiZXRhLCB3ZSBpbnZpdGUgdXNlcnMgdG8gdGVzdCBpdCB0byBzcG90IHByZXZpb3Vz bHkNCiAgdW5ub3RpY2VkIGJ1Z3MgYXMgd2UgaGVhZCB0b3dhcmRzIHRoZSBzdGFibGUgcmVsZWFz ZS4NCg0KDQpNYWluIGNoYW5nZXMgY29tcGFyZWQgdG8gMi42LjB+YmV0YTENCuKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIDpob3VyZ2xhc3Nf ZG9uZTogVGhlIG1haW4gY2hhbmdlIGlzIGEgZml4IG9mIGEgcGVyZm9ybWFuY2UgcmVncmVzc2lv bg0KICBjb21wYXJlZCB0byBvcGFtIDIuNSwgd2hlcmUgb3BhbSBwcm9qZWN0IHRyZWVzIHdlcmUg c2Nhbm5lZCBmb3INCiAgbm90aGluZywgd2hlbiBwaW5uaW5nIHRoZW0sIG1ha2luZyBjb21tYW5k cyBzdWNoIGFzIGBvcGFtIGluc3RhbGwNCiAg4oCTZGVwcy1vbmx5IC5gIGV4Y3J1YXRpbmdseSBz bG93IG9uIGxhcmdlIHByb2plY3RzIChbIzcwOThdKQ0KDQoNCiAgOm9wZW5fYm9vazogWW91IGNh biByZWFkIG91ciBbYmxvZyBwb3N0XSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dA0KICB0aGVz ZSBjaGFuZ2VzIGFuZCBtb3JlLCBhbmQgZm9yIGV2ZW4gbW9yZSBkZXRhaWxzIHlvdSBjYW4gdGFr ZSBhIGxvb2sNCiAgYXQgdGhlIFtyZWxlYXNlIG5vdGVdIG9yIHRoZSBbY2hhbmdlbG9nXS4NCg0K DQpbIzcwOThdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb3BhbS9pc3N1ZXMvNzA5OD4NCg0K W2Jsb2cgcG9zdF0gPGh0dHBzOi8vb3BhbS5vY2FtbC5vcmcvYmxvZy9vcGFtLTItNi0wLWJldGEy Lz4NCg0KW3JlbGVhc2Ugbm90ZV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtL3JlbGVh c2VzL3RhZy8yLjYuMC1iZXRhMj4NCg0KW2NoYW5nZWxvZ10gPGh0dHBzOi8vZ2l0aHViLmNvbS9v Y2FtbC9vcGFtL2Jsb2IvMi42LjAtYmV0YTIvQ0hBTkdFUz4NCg0KDQpUcnkgaXQhDQrilYzilYzi lYzilYzilYzilYzilYwNCg0KICBUaGUgdXBncmFkZSBpbnN0cnVjdGlvbnMgYXJlIHVuY2hhbmdl ZDoNCg0KICBGb3IgVW5peCBzeXN0ZW1zDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgYmFzaCAt YyAic2ggPChjdXJsIC1mc1NMIGh0dHBzOi8vb3BhbS5vY2FtbC5vcmcvaW5zdGFsbC5zaCkgLS12 ZXJzaW9uIDIuNi4wfmJldGEyIg0KICDilJTilIDilIDilIDilIANCiAgb3IgZnJvbSBQb3dlclNo ZWxsIGZvciBXaW5kb3dzIHN5c3RlbXMNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBJbnZva2Ut RXhwcmVzc2lvbiAiJiB7ICQoSW52b2tlLVJlc3RNZXRob2QgaHR0cHM6Ly9vcGFtLm9jYW1sLm9y Zy9pbnN0YWxsLnBzMSkgfSAtVmVyc2lvbiAyLjYuMH5iZXRhMiINCiAg4pSU4pSA4pSA4pSA4pSA DQogIFBsZWFzZSByZXBvcnQgYW55IGlzc3VlcyB0byB0aGUgW2J1Zy10cmFja2VyXS4NCg0KICBI YXBweSBoYWNraW5nLCA8PiA8PiBUaGUgb3BhbSB0ZWFtIDw+IDw+IDpjYW1lbDoNCg0KDQpbYnVn LXRyYWNrZXJdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb3BhbS9pc3N1ZXM+DQoNCg0KT2xk IENXTg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgSWYgeW91IGhhcHBlbiB0byBtaXNzIGEg Q1dOLCB5b3UgY2FuIFtzZW5kIG1lIGEgbWVzc2FnZV0gYW5kIEknbGwgbWFpbA0KICBpdCB0byB5 b3UsIG9yIGdvIHRha2UgYSBsb29rIGF0IFt0aGUgYXJjaGl2ZV0gb3IgdGhlIFtSU1MgZmVlZCBv ZiB0aGUNCiAgYXJjaGl2ZXNdLg0KDQogIElmIHlvdSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBl dmVyeSB3ZWVrIGJ5IG1haWwsIHlvdSBtYXkgc3Vic2NyaWJlDQogIHRvIHRoZSBbY2FtbC1saXN0 XS4NCg0KICBbQWxhbiBTY2htaXR0XQ0KDQoNCltzZW5kIG1lIGEgbWVzc2FnZV0gPG1haWx0bzph bGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5vcmc+DQoNClt0aGUgYXJjaGl2ZV0gPGh0dHBzOi8v YWxhbi5wZXRpdGVwb21tZS5uZXQvY3duLz4NCg0KW1JTUyBmZWVkIG9mIHRoZSBhcmNoaXZlc10g PGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duL2N3bi5yc3M+DQoNCltjYW1sLWxpc3Rd IDxodHRwczovL3N5bXBhLmlucmlhLmZyL3N5bXBhL2luZm8vY2FtbC1saXN0Pg0KDQpbQWxhbiBT Y2htaXR0XSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC8+DQoNCg== --==-=-= Content-Type: text/html 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 August 25 to Septembe= r 01, 2026.

Unhandled: a static checker for unhandled effects in OCaml 5, = and a negative result

Manish Paul announced

OCaml 5's effect handlers are untyped: the compiler does not check that a performed effect is handled, so a missing handler compiles cleanly and fails at run time with Effect.Unhandled. We have been building a sta= tic checker for that, and we would like some criticism of it, particularly of the parts we think are weakest.

What it does. It reads the compiler's own .cmt files, i= nfers a per-function effect set, propagates by call-graph fixpoint, subtracts effec= ts discharged at handler sites, and reports every perform that ca= n reach a program entry point unhandled. Findings come with a blame path from entry to perform, and with a generated witness program: we synthesise i= t, compile it, run it, and only report the finding as confirmed if the effect actually arrives at an outer boundary.

How it is tested. Differential testing against the runtime as oracle= : a generator emits programs, and we compare the checker's prediction against w= hat the compiled program actually does when executed. Over 1000 generated programs, 0 false negatives. Branch-free programs: 600, no false positives. Branching programs: 400, 5.3% false positives, from joining both arms of a conditional. The witnesses deliberately do not parse the crash message. Handy, since 5.4 stopped printing the effect payload for two of our test programs and nothing broke.

The negative result, which is the reason for this post. We wanted to= show the checker catches crashes that really happened, so we built a corpus of commits that fixed documented Effect.Unhandled problems and an= alysed each parent commit. It caught 0 of 6. The cause turned out to be that the modules the bugs lived in never compiled in our environment, so the analyser was ne= ver shown the code. The batch runner now reports "out of scope" separately from "missed" for exactly this reason.

Then we ran it across every opam package depending on eio, eio_main, picos, domainslib, riot, moonp= ool or miou, giving 85 repositories after deduplicating by dev-repo. 38 of them built far enough t= o analyse, 3,881 modules in total, and the tool reported 31 escapes. Every single o= ne was our own false positive. Four causes, each found by reading the code= we had accused:

  1. We modelled "calls anything under Eio." as "requires an Ei= o runtime". Wrong for constructors and vtable builders: Eio.Flow.Pi.source, Eio.Stream.create, Eio.Condition.create, Eio.Buf_read.parse_string_exn.
  2. We applied that client-usage model to eio's own source, which is= a category error. eio does not need an Eio runtime to define itself.
  3. We did not see through application operators. let@ env =3D Eio_ma= in.run in body is ( let@ ) Eio_main.run (fun env -> body), = and with the operator opaque the head of that application is not Eio_main.run, so th= e scheduler boundary vanished and an entire program looked like it ran with no runtime. The fix is to read %apply and %revapply out of th= e value description, which would also cover @@, |>, and operators a= project defines for itself.
  4. We only recognised an Effect.Unhandled guard when it named the= exception. picos writes it as a catch-all and says why:

    | exception _exn ->
        (* This should only happen when not=
     running under a scheduler.
           However, we don'=
    t match on a specific exception, because it
           depends on the O=
    Caml version. *)=
    
    

    We had recorded the same observation independently, and then watched 5.4 stop printing the effect payload, which is the same problem from the other side.

Causes 1 and 2 are fixed and regression-tested in both directions. Causes 3 and 4 are diagnosed but not yet fixed: the attempt broke the test suite and= we reverted it rather than ship a red one, so they are written up in docs/LIMITATIONS.md with the forester and picos source that pr= oduced them. Twenty-five escapes fixed, six remaining and explained.

Every escape this tool has ever reported on third-party code has turned = out to be our own false positive. We have not found a real bug in anyone's code. We would rather say that plainly than imply otherwise.

If there is a transferable lesson it is probably that one: a checker pointed at real code for the first time is mostly measuring itself, and the only way to tell the difference is to read the source you just accused.

What we would like criticism of.

  • Is the library-contract output useful to you? On picos it produces:

    module Picos
      Picos.Trigger.await                may perform {Picos.Trigger.Await}
      Picos.Fiber.current                may perform {Picos.Fiber.Current}
      Picos.Fiber.spawn                  may perform {Picos.Fiber.Spawn}
      Picos.Fiber.yield                  may perform {Picos.Fiber.Yield}
      Picos.Fiber.Maybe.to_fiber_or_current may perform {Picos.Fiber.Current}
      Picos.Fiber.Maybe.or_current       may perform {Picos.Fiber.Current}
      Picos.Fiber.Maybe.current_if       may perform {Picos.Fiber.Current}
      Picos.Fiber.Maybe.current_and_check_if may perform {Picos.Fiber.Current, =
    ...unknown}
    
    module Picos_std_event__Event
      Picos_std_event__Event.sync        may perform {Picos.Trigger.Await, ...u=
    nknown}
      Picos_std_event__Event.select      may perform {Picos.Trigger.Await, ...u=
    nknown}
    
    module Picos_std_structured__Run
      Picos_std_structured__Run.spawn    may perform {Picos.Fiber.Spawn, ...unk=
    nown}
    

    ...unknown in a set means the contract is incomplete at that f= unction because it calls something we have no .cmt for; we would rathe= r show that than round it down to a clean-looking set.

    Is a machine-checked statement of "what this library asks its callers to handle" worth having in a README or in CI?

  • What shapes do we miss? We know about effects performed inside ef= fc branch bodies, dynamically built handler records, and closures that reach a call site through a data structure (no 0-CFA yet). We would like to hear about the ones we do not know about.
  • The scheduler model, meaning which entry point installs handlers for wh= ich family of effects, is data rather than analysis, and lives in models/schedulers.conf. The eio entries are cited to specific = lines. The riot, moonpool and miou entries are guesses and labelled as such. Corrections very welcome.
  • Has anyone actually hit an Effect.Unhandled crash in produ= ction? We are short of real examples and would take any pointer, including "we hit it and the cause was something your design cannot see".

Requires OCaml 5.3 or later, since Texp_match only grows its e= ffect-case list in 5.3. CI runs 5.3 and 5.4.

Repository: https://= github.com/manishpaulish/unhandled

Happy to be told the approach is wrong.

The series of mirage-crypto* releases

Hannes Mehnert announced

Dear everyone,

it is my delight to release mirage-crypto* in version 2.4.1 (https://github.com/ocaml/= opam-repository/pull/30568). There have been a series of releases since= late July with 2.2.0. The reasoning behind is that several people used LLM= to find some issues in the implementation that we are fixing in the proces= s. It is likely there'll be more releases. We try to limit the releases we = cut during each month. Me as a maintainer of that package is as well at the= edge of what I can do (time-wise – please consider donating at https://robur.coop/#contact or via G= itHub spoinsors – in the case you use this piece of software). Even m= ore appreciated would be jump in, read code, review pull requests when they= come in, contribute code cleanups (please don't submit your LLM generated = improvements directly, but do careful reviews of them). Especially since no= w everyone is on the red team.

The performance of mirage-crypto has decreased due to added checks, but onl= y in a small margin as far as I can observe on hardware that I use. Feel fr= ee to conduct your own benchmarks (there is bench/speed.ml available), and = propose improvements.

Now, the changes range between fixes and cleanups to has a published adviso= ry. There's not always a clear border. The full list can be found in the CH= ANGES file, or in the commit history. I encourage everyone to update to the= latest release, and not use any previous release. As mentioned, some advis= ories are out, and for other fixes we think they may not need an advisory (= although it may be that other implementations issues advisories for such fi= xes, so please be careful – you can as well submit PRs to ocaml/secur= ity-advisories if you think some specific fixes are important enough to get= an advisory).

The fixes in more detail follow. Thanks to Eric Ebinger, Thomas Gazagnaire,= and Anil Madhavapeddy for the reports. And to Tarides for make it possible= that I spend some time on reviewing, merging, and releasing mirage-crypto.

mirage-crypto-rng

oxbow, a dynamic tiling window manager for the Wayland composi= tor River

Cole announced

Hello!

I'm excited to share a project I've been working on for the past few months= , oxbow.

It's heavily inspired by my time using dwm, with some ideas taken from othe= r window managers like Hyprland and Niri. Features include:

  • Per-tag configuration (layout, mfact, gaps, etc.)
  • Tiling layouts including even, diminish, dwindle, spiral, deck, and mon= ocle
  • Niri-ish scrolling in four orientations
  • "alt-tab"-like overview
  • Pure floating layout; oxbow respects native drag and resize requests on= windows, making floating mode feel more natural
  • Popular dwm patches such as scratchpads, sticky windows, window swallow= ing, and gaps
  • Regex-based window rules to configure initial tags, output, size, posit= ion, and more
  • IPC control via oxctl to configure all of the above, query= state, and subscribe to events

oxbow is packaged in opam, but you can also install it with Nix/NixOS.

You may notice this is my first post; that is because this project is my fi= rst venture into OCaml! I wrote oxbow to be the window manager I've always = wanted, but also to learn OCaml. I've really enjoyed the experience, and I = plan to use OCaml in a few other projects. I've done my best to take advant= age of OCaml's strengths, but I'm fully open to any suggestions/PRs/etc. to= improve the internals or any other aspect of oxbow.

Thank you for having me!

cdp 0.1.0 - typed Chrome DevTools Protocol libraries for OCaml=

Atlas07 announced

Hi everyone,

I'm happy to announce the first release of ocaml-cdp - typed OCaml libraries for the Chrome DevTools Protocol= .

Why

CDP lets a program control a real Chrome: open pages, run JavaScript, take = screenshots, render PDFs, watch network traffic. OCaml had no CDP library. ocaml-cdp fills that gap: it turns t= he official protocol definitions into typed OCaml modules, so the compiler = checks every command, event, and field.

What you get

Three packages:

Package Where What it is
cdp opam Typed protocol domains: records, enums, commands, ev= ents, with JSON codecs. Transport-agnostic.
cdp-gen opam The generator CLI: protocol JSON in, OCaml out. Any = revision, your own domain selection.
cdp-lwt GitHub only for now (see below) The client: launches or attaches to a Chrome and dri= ves it over libcurl WebSockets.

cdp ships 10 domains (Browser, DOM, Debugger, Emulation, IO, N= etwork, Page, Runtime, Security, Target); the generator covers all 58.

Here is the full round trip: launch a headless Chrome, open a page, read it= s title back:

let%lwt chrome =3D Cdp_lwt.Chrome.launch () in
let%lwt transport =3D Cdp_lwt.Curl_tra=
nsport.connect ~u=
rl:chrome.ws_url () in
let connection =3D Cdp_lwt.Connection.create transport in
let call ?session command =3D Cdp_lwt.Connection.call connection =
?session command in
let%lwt created =3D
  call (Cdp.Target.Creat=
e_target.command (Cdp.Target.Create_target.make_params ~url:"about:bla=
nk" ()))
in
let%lwt attached =3D
  call (Cdp.Target.Attac=
h_to_target.command
          (Cdp.Target.At=
tach_to_target.make_params ~target_id:created.target_id ~flatten:true<=
/span> ()))
in
let session =3D attached.session_id in
let%lwt () =3D call ~session (Cdp.Page.Enable.command (Cdp.Page.Enable.make_params ()))=
 in
let loaded =3D Cdp_lwt.Connection.next_event connection ~session Cdp.Page.Load_event_fired.<=
/span>event in
let%lwt _nav =
=3D
  call ~session (Cdp.Pag=
e.Navigate.command
                   (Cdp.=
Page.Navigate.make_params ~url:"https://ocaml.org" ()))
in
let%lwt _fired=
 =3D loaded in
let%lwt evaluated =3D
  call ~session (Cdp.Run=
time.Evaluate.command (Cdp.Runtime.Evaluate.make_params ~expression:"d=
ocument.title" ()))
in

Why cdp-lwt is not on opam yet

cdp-lwt uses libcurl's WebSocket API through the curl bindings. That API is on ocurl's master branch, but not in any ocurl r= elease yet. cdp-lwt builds fine from a clone (its opam file pi= ns ocurl master). As soon as ocurl makes a release, cdp-lwt fo= llows onto opam.

Hardcaml Networking Library - Toy Project

Bohdan Purtell announced

General Kenobi

Greetings.

My name is Bo Purtell, and I'm an aspiring senior at the University of Flor= ida.=20

Wanted to share a little project I've been working on over the course of th= e last year being a small networking stack for the hardcaml ec= osystem for hardware development with OCaml! The project is still in it's i= nfancy stages right now, but I've validated out a 10/100Mb duplex interface= with very loose IPv4 and UDP support, and I'm currently wrapping up a PCS = layer for 64/66b BASE-R encodings for 10G applications. A tad limited with = my servers getting moved all the way back to Florida (from Cali) though, an= d I lost one of my regression machines in the move so going to have to go d= ive into docker stuff again - bleh.=20

https://github= .com/LeEmperor/hardcaml_networking

It's All Math

I fear that I cannot go back to writing SystemVerilog the same way anymore = given the wonderful levels of abstraction that I was able to get away with = in OCaml. I firmly believe that my thinking of how "state" is represented, = and the fact that I could reach for mathematical terminology when I went to= describe an OCaml construct helped me immensely in being able to reason ab= out some of these systems as I was constructing them. Helps with verificati= on to an extent too.=20

Challenges

The biggest challenge I faced was the structuring of my verification suites= and testing. There are a few floating hardcaml projects around, but trying= to integrate around the expect test framework was a tad difficult since sa= id examples are quite poor in demonstrating re-usable architecture or integ= ration testing. I had thoughts that Alcotest might be used for= larger integration suites, but I feel it's philosophy goes against what a = standard expect test is even shooting at doing. Ultimately, expect tests pu= shed me to Emacs (from Neovim), as expect tests and tuareg fit= nicely together - if I had to go pasting s-expressions again from the term= inal I probably would've imploded. The change is definitely interesting, bu= t well worth it in terms of configurability and OCaml support.=20

Quickcheck tests were quite nifty as well, but I was flying co= mpletely blind on using those, as there are seldom examples for any properl= y-sized projects release. It was nice to see that alot of my own UVM-based = idioms that I am familiar with translated somewhat well with the Obse= rvation.t and Snapshot.t formations, but it would still= be nice to see what actual production-grade hardcaml verification looks li= ke. Wish there were formal verif examples as well as I have been firmly gra= sped by the formal-verif-bug, but only a few dronings in dead branches were= all I could muster.=20

In Space!

Truly a bummer that no functional languages will ever see industry use. Wit= h that in mind, after wrapping up a double-internship stint Spring & Su= mmer I can finally claim that some nonzero amount of Hardcaml is flying in = Space!=20 If anyone has any questions feel free to shoot me a message here or on Link= edIn!=20

PS : if anyone is familiar with proper hardcaml-based verification, could I= beg for a quick chat on how integration tests would even work with expect = systems? Do I just chuck a gigantic 300-line s-expression into the expected= field? Surely not. Does Alcotest even enter the vocabulary fo= r such things then?

FUN OCaml 2027 in Bangalore, Jan 25-26 - Time to Send Talk and= Workshop Proposals - Until Sep 30

Sabine Schmaltz announced

Hi everyone!

We are super excited to announce that = FP Launchpad is hosting FUN OCaml 2027 in Bangalore! This= will be the very first edition of FUN OCaml (and the first major OCaml con= ference) in India.

FUN OCaml 2027 is a two-day open source hacking event dedicated to OCaml en= thusiasts and professionals, focusing on the real-world impact of OCaml and= bringing our global community together.

Event Details

  • Dates: January 25-26, 2027
  • Location: MLR Convention Centre, Brigade Millennium Campus, JP N= agar 7th Phase, Bangalore
  • Format: Day 1 is dedicated to talks (including a keynote, live-s= treamed online), and Day 2 features hands-on workshops and collaborative ha= cking.

Call for Participation (CFP) is Open!

The call is open through September 30. We welcome submissions from a= ll experience levels - whether you are a first-time speaker, industry pract= itioner, academic researcher, or open source maintainer.

Topics we are especially excited about:

  • How you use OCaml in your business or personal projects
  • OCaml libraries, frameworks, and tools in the ecosystem
  • Hands-on demonstrations that inspire people to hack on Day 2
  • Deep dives into actual code and the reasoning behind design decisions
  • Experience reports and lessons learned

All talks will be live-streamed and uploaded to watch.ocaml.org and FUN OCaml's YouTube channel.

We can't wait to see your proposals and look forward to welcoming you to Ba= ngalore!

Note: A major reason why we've chosen to host FUN OCaml in India thi= s year is that we will (a) have an easy time getting the event fully booked= , with both students and professionals, and (b) will be able to again affor= d high production quality recordings. We expect higher demand and more part= icipants for the OCaml beginners workshop. At the same time, we understand = that traveling to India is less ideal than traveling in the EU.

As a speaker, if there's any concern about funding travel, please check the= box in the CFP form to apply for financial assistance. Also, send your pro= posals early, so that you can start visa application (we provide visa suppo= rt) as soon as your session is accepted.

ease-caml - Easing library for OCaml

Christopher Sumnicht announced

Hi everyone,

I am happy to introduce: ease-caml (on opam) - an easing library for OCaml.

Why?

In video games you often want to manage animations and transitions. Usually= this requires deforming a floating point value from one value to another (= often continuously) over time so that an object moves from one place to ano= ther. Such a deformation is often referred to as an easing or tween. It can= be hard to keep track of tweens. In Lua, there are various libraries like = hump.timer and Flux which help manage and organize the tweens you have made= so you can easily create different kinds and have a single source of updat= ing them. ease-caml is inspired by those libraries and is intended to help = with OCaml game development.

Also, I mentioned games above: Whether you use SDL, Raylib, or pretty much = anything else, you can use this library. It just requires an update loop.

Example

Here is a small example of a bouncing ball (uses raylib-ocaml).

type c=
ircle =3D
{
  r: float;
  x: float;
  y: float ref;
}

let ball : circle =3D { r =3D 40.0; x =3D 400.0; y =3D ref ~-.40.0 }
let ty =3D Tween.make_tween ball.y 225.0 ~ef:Easers.bounce 1.0
let tm =3D Tween.new_manager ()

let setup () =3D
  Raylib.init_win=
dow 800 450 "simple_tween";
  Raylib.set_targ=
et_fps 60;
  Tween.add ty tm

let rec loop () =3D
  if Raylib.window_should_close (=
) then Raylib.close_window ()
  else (
    let open Raylib in
    Tween.update =
tm (get_frame_time ());
    begin_drawing ();
    clear_background Col=
or.raywhite;
    draw_circle_v (Vecto=
r2.create ball.x !(ball.y)) b=
all.r Color.maroo=
n;
    end_drawing ();
    loop ()
  )

let () =3D setup =
() |> loop

(Note as a new user I cannot put more than 2 links. If you need help findin= g hump.timer, Flux, or raylib-ocaml, please let me know!)

opam 2.6.0~alpha1

Continuing this thread, Kate announced

Hot on the heels of beta1, we are happy to announce the release of opam 2.6= .0~beta2.

This version is a beta, we invite users to test it to spot previously unnot= iced bugs as we head towards the stable release.

Main changes compared to 2.6.0~beta1

:hourglass_done: The main change is a fix of a performance regression compa= red to opam 2.5, where opam project trees were scanned for nothing, when pi= nning them, making commands such as `opam install –deps-only .` excru= atingly slow on large projects (#7098)

: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.

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.

--==-=-=-- --=-=-=-- --===-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQFvBAEBCABZFiEE6lXof/BsSVW56ZmGBA0KO07S5ccFAmqWl3QbFIAAAAAABAAO bWFudTIsMi41KzEuMTIsMCwzHxxhbGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5v cmcACgkQBA0KO07S5ccgUwgAg0Ildfu0xLxPJsVWNB7Qw745QIKrJwYO9d9J48Su j8VWQ18SG82KJ4NY9q4vN7tcFh/Z3eygUqLNjf7lNN9VmrnfrJ5ogfcqiakYhU11 3YafzkBCmsVNJvQuZhIRg2Bpw7VC0WCD7MBpMW+uJq9HqBIdtOn/TBjhEdC/4Gi7 AZqFsGRr6lw581ktJefj1+m9co5J0yMet6PI/VpFNegPqfMK98JOGbJDGued1cfz e3auQKgJGhTCXZNbv8y7kjP/e1jBkngp9LmxM4GdboaTVFOU9mIhSO+CvleZf9qN OvjBsqpGt2Yo2p6Z+3B9QsdQjO8NzSvm/8ssHvGqOlgFiA== =BpQU -----END PGP SIGNATURE----- --===-=-=--