From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by c5ff346549e7 (Postfix) with ESMTPS id 886DE5D5 for ; Tue, 14 Jun 2022 09:30: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=6SvP1YYxzZeGefaEeTo3fWQQYptt1Ck7Fs8vlGpaGIg=; b=HqT4uBK0okS8r9k8iXIrIBdoE/WCXrpZzyQAQBDCQl8y2BIi5A4AL5Zn J9nzZSGsNwm+rrBvItLz6JDNxS2Ux5IrjHbQ8GOYGUPmAiZk2DGO04JRN iC3I3NbxKMeYA0M8zoxYgDQ1ua7hjf3VUZ2XphNnv9tSKrKxhWPNLqR+Z o=; 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@sympa.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.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 ip4:192.134.164.0/24 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only X-IronPort-AV: E=Sophos;i="5.91,299,1647298800"; d="scan'208,217";a="40925966" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 14 Jun 2022 11:30:05 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 3A9AEE0152; Tue, 14 Jun 2022 11:30:04 +0200 (CEST) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id DB736E0038 for ; Tue, 14 Jun 2022 11:29:58 +0200 (CEST) IronPort-SDR: OPkvfJGBnbEkfFHK5Nrr/vPjj59mL/MY1JxKooDg1tLAyfnHnpFhHQaYfoMtISymsqNErLt2a1 gBWKxUjf85Im7a7NJLD6rfgTt/UwlcU0AfaUSy9x5dvkvNBsEQom06EFewUGpvTNF/eUbEcnOf xZox6ryGVoiVWZz5tR7CpVQei4CNkKeZ8OQHrdF47ZFmQYfK4iNLX9AH+LW/+Rov+2ETIYzThN fzP6p08mMINLo1k6oJlOZMGhx7WkYPMQqUmk960DrarIKJwLh0x26b0FlwmQ8njmTbVftdplD+ V4GJe8sWNqb0L5zxboKUhyEX X-IPAS-Result: =?us-ascii?q?A0AqAQCKVKhihyIeaIFaEwEBBwEBAQEBAQcBARIBAQQEA?= =?us-ascii?q?QGCD4EhgQMZAWdWLgcIRIROiQCIDYEWiDuGfoFNimQPgQIDTxABAwENLAEFD?= =?us-ascii?q?QECBAEBgg6CdAIWhTECHgYBBTMTAQIEAQEBAQMCAwEBAQEBAQMBAQUBAQECA?= =?us-ascii?q?QECBAQBEwEBAQENCwkFCAoHEA4FPGRkBIFLBIF0CzQNgjUMDAMDg3QDARYCA?= =?us-ascii?q?QgEBmUjAxQBBgMCBA0BFwEeAwETARIUBoJjAYMYAwUKkAiaSxo1en8ygQGDT?= =?us-ascii?q?wEDAgwCAgMPLgGDc4FlJIEZhh9bSgGDDgmCdIEdAicQgVVEgRWCKUoHboIRO?= =?us-ascii?q?gwLAQEBAQGBOwEBBgJOgyCCZQSBM4lziDWEfAc4A0c0EoEhcQEIBgYHCgUyB?= =?us-ascii?q?gIMGBQEAhMSTQYdAhIMCgYWDkISGQwPAxIDEQEHAgsSCBUsCAMCAwgDAgMuA?= =?us-ascii?q?gMXCQcKAx0IChwSEBQCBBMeCwgDGR8sCQIEDgNDCAsKAxEEAxMYCxYIEAQGA?= =?us-ascii?q?wkvDSgLAwUPDQEGAwYCBQUBAyADFAMFJwcDIQcLJg0NBCMdAwMFJgMCAhsHA?= =?us-ascii?q?gIDAgYXBgICGVYKJg0IBAgEGAQdJBAFAgcxBQQvAh4EBQYRCQIWAgYEBQIEB?= =?us-ascii?q?BYCAhIIAggnGwcWNhkBBV0GCwkhFgYpEQUGFgMjTCcFSA8pNTY8LyEbCoEJB?= =?us-ascii?q?iKVDxyEOSMCDgonBwYBDlMuBwwICgQBAVAIIxUBCgQRBA8CGgYDFjQLCwItA?= =?us-ascii?q?5FsFBADAwcEKY1kh2CDCIJhkVV8NAeDUYE+BgyILIEijQKII4N1gVCKcZgqI?= =?us-ascii?q?ZZLIIIrhnwCgRuCA0aDQIEmg06MEQYEHIUbgU4qgWsMBzMaMCIhglEXCUUBA?= =?us-ascii?q?wINAQICAwECAQIJAQECjikWgygogT6BDBqBdTuFTD80AgEBBzACBgEKAQEDC?= =?us-ascii?q?YVjAQEFEwsBhi4tghkBAQ?= IronPort-PHdr: A9a23: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 R4O4EJL/g1Sz+dN IronPort-Data: A9a23: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 28Rm/+//rSsuEZp IronPort-HdrOrdr: A9a23:RO0AlaHBL2xIGpvBpLqE78eALOsnbusQ8zAXPiFKKSC9Hfb2qy nDpp4mPHzP6Qr5OktPpTnoAsDpKk80nqQY3WB+B9qfdTijkFTtBoBv54nvzlTbak7D398Y87 xvN4x3CNiYNykesS8W2njbL+od X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="5.91,299,1647298800"; d="scan'208,217";a="40925915" X-MGA-submission: =?us-ascii?q?MDFABBdjlwaiGkfeV9LbQqMi6GtgCCoKCNNsqt?= =?us-ascii?q?z7fiQ0Gp4XRuqNb6sqojMUxEqUt8llEHtuD1HJ690KNCgtSC1nlq18Pc?= =?us-ascii?q?OxvUJPdbgxi6rsEgAs9CWa1Vo3xy0guq/T3WQpKP4j6TfQHF54xF5SIC?= =?us-ascii?q?Bsoi5xH5cSrD0bBNXUfRsfmA=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; 14 Jun 2022 11:29:58 +0200 Received: from set (set.irisa.fr [131.254.10.170]) (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 383835646C3; Tue, 14 Jun 2022 11:29:57 +0200 (CEST) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 14 Jun 2022 11:29:56 +0200 Message-ID: <87r13rh9t7.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Jun 14 11:29:57 2022 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.372135, queueID=7C0315646C5 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: 18791 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 ZWsgb2YgSnVuZSAwNyB0byAxNCwNCjIwMjIuDQoNClRhYmxlIG9mIENvbnRlbnRzDQrilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KTHd0IGluZm9y bWFsIHVzZXIgc3VydmV5DQpUdXRvcmlhbDogRnVsbC1TdGFjayBXZWIgRGV2IGluIE9DYW1sIHcv IERyZWFtLCBCb25zYWksIGFuZCBHcmFwaFFMDQpka21sLWMtcHJvYmU6IENyb3NzLWNvbXBpbGVy IGZyaWVuZGx5IGRlZmluaXRpb25zIGZvciBDIGNvbXBpbGluZw0KSHRteC9oYyB3ZWIgZGV2ZWxv cG1lbnQgYXBwcm9hY2gNCkVuZ2luZWVyIGFuZCBwb3N0ZG9jIHBvc2l0aW9ucyBpbiBGcmFuY2Ug KHZhcmlvdXMgbGFicykgdG8gd29yayBvbiBhIHByb29mIGFzc2lzdGFudCBmb3IgY3J5cHRvIHBy b3RvY29scw0KWW9qc29uIDIuMC4wDQpvcGVudGVsZW1ldHJ5IDAuMg0Kb21ha2UtMC4xMC41DQpm aW5kbGliLTEuOS41DQpPbGQgQ1dODQoNCg0KTHd0IGluZm9ybWFsIHVzZXIgc3VydmV5DQrilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZANCg0KICBBcmNoaXZlOiA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2x3 dC1pbmZvcm1hbC11c2VyLXN1cnZleS85NjY2LzM+DQoNCg0KQ29udGludWluZyB0aGlzIHRocmVh ZCwgUmFwaGHDq2wgUHJvdXN0IHNhaWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFRoYW5rcyB0byBl dmVyeW9uZSB3aG8gdG9vayB0aGUgdGltZSB0byBhbnN3ZXIgdGhlIHBvbGxzIGFib3ZlLiBJJ3Zl DQogIG5vdyBjbG9zZWQgdGhlbS4NCg0KICBUaGUgZmlyc3QgcHVsbC1yZXF1ZXN0IHRvIGNvbWUg b3V0IG9mIHRoaXMgcG9sbCBpcw0KICBbPGh0dHBzOi8vZ2l0aHViLmNvbS9vY3NpZ2VuL2x3dC9w dWxsLzk0Nz5dKHJlbW92aW5nIHN1cHBvcnQgZm9yDQogIE9DYW1sPD00LjA3KS4gVGhpcyB3YXMg dGhlIGN1dG9mZiBpbiB0aGUgcG9sbC4gSXQgcmVtb3ZlcyBhIGxvdCBvZg0KICBgI2lmJyBwcmVw cm9jZXNzaW5nIHN0YXRlbWVudHMgYW5kIGEgZmV3IHdvcmthcm91bmRzIHRvIHN0YXkNCiAgY29t cGF0aWJsZSB3aXRoIG9sZCBTdGRsaWIgaW50ZXJmYWNlcy4gVGhhbmtzIHRvIEBoYW5uZXMgZm9y DQogIGNvbnRyaWJ1dGluZyBtb3N0IG9mIHRoZSBjb21taXRzIG9uIHRoaXMgcHVsbC1yZXF1ZXN0 LiAgSWYgc3VwcG9ydCBmb3INCiAgT0NhbWw8PTQuMDcgaXMgaW1wb3J0YW50IHRvIHlvdSwgcGxl YXNlIHBhcnRpY2lwYXRlIGluIHRoZQ0KICBwdWxsLXJlcXVlc3QncyBkaXNjdXNzaW9uIG9yIG9u IHRoaXMgdGhyZWFkLg0KDQogIFN0YXkgdHVuZWQgZm9yIG1vcmUuIChCdXQgYWxzbyBiZSBwYXRp ZW50LikNCg0KDQpUdXRvcmlhbDogRnVsbC1TdGFjayBXZWIgRGV2IGluIE9DYW1sIHcvIERyZWFt LCBCb25zYWksIGFuZCBHcmFwaFFMDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0K ICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L3R1dG9yaWFsLWZ1bGwt c3RhY2std2ViLWRldi1pbi1vY2FtbC13LWRyZWFtLWJvbnNhaS1hbmQtZ3JhcGhxbC85OTYzLzIw Pg0KDQoNCkNvbnRpbnVpbmcgdGhpcyB0aHJlYWQsIGplcmJlbiBhc2tlZCBhbmQgRGFuaWVsIELD vG56bGkgcmVwbGllZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgICAgICAgVmVyeSBpbnRlcmVzdGlu ZywgZGlkIHlvdSB3cml0ZSBzb21ld2hlcmUgYWJvdXQgaG93IGl0DQogICAgICAgIGNvbXBhcmVz IHRvIGh0bXg/DQoNCiAgTm90IHJlYWxseS4NCg0KICBBcyBmYXIgYXMgSSBjYW4gcmVtZW1iZXIg SSBsaWtlZCB0aGUgaWRlYXMgYnV0IGZvdW5kIHRoZWlyIGV4ZWN1dGlvbg0KICB0byBiZSBhIGJp dCBsYWNraW5nLCBzb21ldGltZXMgYWQtaG9jIGluIHRoZWlyIGF0dHJpYnV0ZSBEU0wsIGZvY3Vz aW5nDQogIG1vcmUgb24gdGhlIHNob3cgb2ZmIHRvIGNvbnZpbmNlIHNpbmdsZSBwYWdlIGFwcGxp Y2F0aW9uIHByb3BvbmVudHMgb2YNCiAgdGhlIGFwcHJvYWNoIHRoYW4gb24gYSBjbGVhciBjb25j ZXB0dWFsIG1vZGVsICh3aGljaCBgaGMnIHRyaWVzIHRvDQogIGRldGFpbCBpbiB0aGUgbWFudWFs IFtoZXJlXSkuDQoNCiAgVHdvIG90aGVyIHRoaW5ncyB0aGF0IGNvbWUgdG8gbWluZCBhcmU6DQoN CiAgMS4gQUZBSVIgdGhlaXIgZXhhbXBsZXMgcmVsaWVkIGEgbG90IG9uIHVuaXF1ZSBgaWQnIGF0 dHJpYnV0ZXMgZm9yDQogICAgIHRhcmdldGluZyByZXF1ZXN0IHJlc3VsdHMuIFVubGVzcyB5b3Ug ZmluZCBhIHByaW5jaXBsZWQgYW5kDQogICAgIGF1dG9tYXRlZCB3YXkgdG8gZ2VuZXJhdGUgdGhl c2UgdGhhdCdzIG5vdCBjb21wb3NpdGlvbmFsIGFuZA0KICAgICBicml0dGxlLiBJbiBgaGMnIEkg W2V4dGVuZGVkIHRoZSBDU1Mgc2VsZWN0b3Igc3ludGF4XSB0byBhbGxvdyB0bw0KICAgICBhZGRy ZXNzIHlvdXIgYW5jZXN0b3JzIChwZWFjZSBiZSB1cG9uIHRoZW0pLiBUaGF0J3MgbW9yZQ0KICAg ICBjb21wb3NpdGlvbmFsIGJ1dCBub3cgeW91IGJlY29tZSBzZW5zaXRpdmUgdG8gc3RydWN0dXJh bCBjaGFuZ2VzIGluDQogICAgIHlvdXIgbWFya3VwIOKAkyBwaWNrIHlvdXIgcG9pc29uW14xXS4N CiAgMi4gSSdtIG5vIGxvbmdlciBzdXJlIGFib3V0IHRoYXQsIGkuZS4gZG9uJ3QgdGFrZSBteSB3 b3JkIGZvciBpdCwgYnV0DQogICAgIEkgdGhpbmsgdGhlaXIgRFNMIGFsbG93ZWQgdG8gc3ByZWFk IHRoZSBkZWZpbml0aW9uIG9mIGFuDQogICAgIGludGVyYWN0aW9uIGFtb25nIG1hbnkgZWxlbWVu dHMgd2hpY2ggbWFkZSBpdCBtb3JlIGRpZmZpY3VsdCB0bw0KICAgICB1bmRlcnN0YW5kIHdoYXQg aXMgaGFwcGVuaW5nLiBJbiBgaGMnIGFsbCBhdHRyaWJ1dGVzIGRlZmluaW5nIHRoZQ0KICAgICBl ZmZlY3RzIG9mIGFuIGludGVyYWN0aW9uIGFyZSBhbHdheXMgbG9jYXRlZCBvbiBhIHNpbmdsZSBl bGVtZW50LA0KICAgICB0aGUgZWxlbWVudCB0aGF0IHBlcmZvcm1zIHRoZSByZXF1ZXN0Lg0KDQog IEZpbmFsbHkgd2hlbiB0aGluZ3MgZ28gd3JvbmcgSSBwcmVmZXIgdG8gaGF2ZSB0byB1bmRlcnN0 YW5kIFs3MDAgbGluZXMNCiAgb2YgbWxdIHJhdGhlciB0aGFuIFsyODAwIGxpbmVzIG9mIEphdmFT Y3JpcHRdIChub3RlIHRoYXQgdGhleSBsaWtlbHkNCiAgaGF2ZSBiZXR0ZXIgbGVnYWN5IGJyb3dz ZXIgc3VwcG9ydCBhbmQgbW9yZSBmdW5jdGlvbmFsaXR5KS4NCg0KICBJbiBhbnkgY2FzZSB0aGVy ZSdzIGEgbG9uZyBsaXN0IG9mIHRvZG9zIGluIGBoYycgYW5kIGl0IGxpa2VseSBuZWVkcw0KICBv bmUgb3IgdHdvIG1vcmUgZGVzaWduIHJvdW5kcyBiZWZvcmUgZ2V0dGluZyB0byBzb21ldGhpbmcg ZGVjZW50IOKAkyBpZg0KICB0aGF0J3MgZXZlbiByZW1vdGVseSBwb3NzaWJsZSBvbiB0aGUgd2Vi Lg0KDQogICAgICAgIERhbmcgaXQgQGRidWVuemxpIG9uZSBkYXkgeW914oCZbGwgcnVuIG91dCBv ZiBsZXR0ZXJzIGFuZA0KICAgICAgICBuZWVkIHRvIGNvbWUgdXAgd2l0aCBhbiBhY3R1YWwgbmFt ZSBmb3IgeW91ciBsaWJyYXJpZXMuDQoNCiAgTWluZCB5b3UgSSB0cmllZCB0byB1c2UgdGhyZWUg bGV0dGVycyBvbmNlLCBidXQgdGhlIHdob2xlIGV4cGVyaWVuY2UNCiAgdHVybmVkIG91dCB0byBi ZSBbZXh0cmVtZWx5IHVucGxlYXNhbnRdIDrigJMpDQoNCiAgW14xXTogVXNpbmcgdW5pcXVlIGlk cyByZWlmZWQgaW4gYW4gT0NhbWwgRURTTCBjb3VsZCBiZSBhIGJldHRlciBpZGVhLg0KDQoNClto ZXJlXSA8aHR0cHM6Ly9lcnJhdGlxdWUuY2gvc29mdHdhcmUvaGMvZG9jL21hbnVhbC5odG1sI3Jl cXVlc3Q+DQoNCltleHRlbmRlZCB0aGUgQ1NTIHNlbGVjdG9yIHN5bnRheF0NCjxodHRwczovL2Vy cmF0aXF1ZS5jaC9zb2Z0d2FyZS9oYy9kb2MvbWFudWFsLmh0bWwjc2VsZWN0b3I+DQoNCls3MDAg bGluZXMgb2YgbWxdDQo8aHR0cHM6Ly9naXRodWIuY29tL2RidWVuemxpL2hjL2Jsb2IvbWFzdGVy L3NyYy9oY19wYWdlLm1sPg0KDQpbMjgwMCBsaW5lcyBvZiBKYXZhU2NyaXB0XQ0KPGh0dHBzOi8v Z2l0aHViLmNvbS9iaWdza3lzb2Z0d2FyZS9odG14L2Jsb2IvbWFzdGVyL3NyYy9odG14LmpzPg0K DQpbZXh0cmVtZWx5IHVucGxlYXNhbnRdDQo8aHR0cHM6Ly9naXRodWIuY29tL2RidWVuemxpL3Jl bC9jb21taXQvZjk1YjZiYWQwMmE4MDgwZWI2NGY4ZDAxMjNjZDYzZDQwYjUyOGUzMz4NCg0KDQpk a21sLWMtcHJvYmU6IENyb3NzLWNvbXBpbGVyIGZyaWVuZGx5IGRlZmluaXRpb25zIGZvciBDIGNv bXBpbGluZw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBz Oi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tZGttbC1jLXByb2JlLWNyb3NzLWNvbXBpbGVyLWZy aWVuZGx5LWRlZmluaXRpb25zLWZvci1jLWNvbXBpbGluZy85OTUwLzg+DQoNCg0KamJlY2tmb3Jk IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSADQoNCiAgVjMgaXMgYXZhaWxhYmxlLiBJdHMgYENfYWJpJyBtb2R1bGUgaGFz IHNvbWUgYmlnIGVuaGFuY2VtZW50czoNCiAg4oCiIGNsZWFuZXIgQVBJICh0aGFua3MgQG1zZXJp ISkNCiAg4oCiIHJlY29nbml6ZXMgdGhlIEJTRCBmYW1pbHk6IE9wZW5CU0QsIEZyZWVCU0QsIE5l dEJTRCBhbmQgRHJhZ29uRmx5IG9uDQogICAgeDg2XzY0IGhhcmR3YXJlDQogIOKAoiBpbnRlZ3Jh dGlvbiB0ZXN0aW5nIG5vdyBpbmNsdWRlcyBPcGVuQlNELCBGcmVlQlNEIGFuZCBvbmUNCiAgICBj cm9zcy1jb21waWxpbmcgdG9vbGNoYWluIChtYWNPUyB4ODZfNjQgaG9zdCB0aGF0IHRhcmdldHMg YXJtNjQpDQoNCiAgVjMgYWxzbyBoYXMgYSBuZXcgbW9kdWxlIGBDX2NvbmYnIHdoaWNoIG9jY3Vw aWVzIHRoZSBzYW1lIHByb2JsZW0NCiAgc3BhY2UgYXMgYGZpbmRsaWIgLyBvY2FtbGZpbmQnIGFu ZCBgcGtnLWNvbmZpZyc6DQogIOKAoiBVbmxpa2UgYGZpbmRsaWInIHdoaWNoIGlzIGEgc3BlY2lm aWNhdGlvbit0b29sIGZvciAzcmQgcGFydHkgT0NhbWwNCiAgICBsaWJyYXJpZXMsIGBDX2NvbmYn IGlzIGEgc3BlY2lmaWNhdGlvbit0b29sIGZvciBmb3JlaWduIEMgbGlicmFyaWVzDQogIOKAoiBV bmxpa2UgYHBrZy1jb25maWcnIHdoaWNoIGlzIGEgc3BlY2lmaWNhdGlvbit0b29sIGZvciBzeXN0 ZW0gKGhvc3QNCiAgICBBQkkpIEMgbGlicmFyaWVzLCBgQ19jb25mJyBpcyBhIHNwZWNpZmljYXRp b24rdG9vbCBmb3IgdGhlIG11bHRpcGxlDQogICAgQUJJcyB0aGF0IGFyZSBwcmVzZW50IHdoZW4g eW91IGNyb3NzLWNvbXBpbGUgT0NhbWwgb3IgQyBjb2RlDQogIOKAoiBVbmxpa2UgYHBrZy1jb25m aWcnIHdoaWNoIGlzIGRlc2lnbmVkIGZvciBVbml4LCBgQ19jb25mJyBpcyBkZXNpZ25lZA0KICAg IGZvciBXaW5kb3dzIGFuZCBVbml4IHdoZXJlIHBhdGhzIG1heSBoYXZlIHNwYWNlcywgYmFja3Ns YXNoZXMgYW5kDQogICAgY29sb25zDQogIOKAoiBGb3Igbm93IHRoZSBzcGVjaWZpY2F0aW9uIGlz IGJhc2VkIG9uIGVudmlyb25tZW50IHZhcmlhYmxlcy4gSWYgaXQNCiAgICBwcm92ZXMgdXNlZnVs IHRoZSBzcGVjaWZpY2F0aW9uIGNhbiBiZSBleHRlbmRlZC4NCg0KICBFeGFtcGxlcyBhbmQgZG9j IGxpbmtzIGZvciBWMyBhcmUgYXZhaWxhYmxlIGF0DQogIFtodHRwczovL2dpdGh1Yi5jb20vZGlz a3V2L2RrbWwtYy1wcm9iZSNka21sLWMtcHJvYmVdDQoNCg0KW2h0dHBzOi8vZ2l0aHViLmNvbS9k aXNrdXYvZGttbC1jLXByb2JlI2RrbWwtYy1wcm9iZV0NCjxodHRwczovL2dpdGh1Yi5jb20vZGlz a3V2L2RrbWwtYy1wcm9iZSNka21sLWMtcHJvYmU+DQoNCg0KTWFyY2VsbG8gU2VyaSBhc2tlZCBh bmQgamJlY2tmb3JkIHJlcGxpZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogICAgICAgIFRoYW5rcyBhIGxvdCBm b3IgdGhlIHVwZGF0ZSEgQ2FuIHlvdSBzYXkgYSBiaXQgbW9yZSBhYm91dA0KICAgICAgICBob3cg YENfY29uZicgd29ya3M/DQoNCiAgQ19jb25mIGhhcyBhIGRldGFpbGVkIHByb2JsZW0gc3RhdGVt ZW50IGFuZCBzcGVjIGF0DQogIDxodHRwczovL2Rpc2t1di5naXRodWIuaW8vZGttbC1jLXByb2Jl L2RrbWwtYy1wcm9iZS9Ea21sX2NfcHJvYmUvQ19jb25mL2luZGV4Lmh0bWw+DQogICh3aGljaCBp cyBsaW5rZWQgdG8gb24gdGhlIGRrbWwtYy1wcm9iZSBSRUFETUUpLg0KDQogIEkgcHJvYmFibHkg c2hvdWxkbid0IHJlZ3VyZ2l0YXRlIHRoZSBkb2MgaGVyZSwgc28gSSdsbCB0YWtlIGEgZmV3IGtl eQ0KICBwaWVjZXMgZnJvbSB0aGUgZG9jIGFuZCB0aGVuIHBvc3Qgc29tZSB0aGluZ3MgaGVyZSB0 aGF0IEkgZGlkbid0IHB1dA0KICBvbiB0aGF0IGRvYyBwYWdlIOKApg0KDQogIDEuIEhlcmUgaXMg bXkgY29uZmlndXJhdGlvbiBmb3IgbG9jYXRpbmcgdGhlICJnbXAiIGxpYnJhcnkgb24gbXkgQXBw bGUNCiAgICAgU2lsaWNvbiBob3N0IG1hY2hpbmUgdGhhdCBjcm9zcy1jb21waWxlcyB0byB4ODZf NjQ6DQoNCiAgICAg4pSM4pSA4pSA4pSA4pSADQogICAgIOKUgiBDUF9HTVBfQ0NfREVGQVVMVCAg ICAgICAgICAgICAgICAgPSAtSVo6L2J1aWxkL2Rhcndpbl9hcm02NC92Y3BrZ19pbnN0YWxsZWQv YXJtNjQtb3N4L2luY2x1ZGUNCiAgICAg4pSCIENQX0dNUF9DQ19ERUZBVUxUX0RBUldJTl9YODZf NjQgICA9IC1JWjovYnVpbGQvZGFyd2luX3g4Nl82NC92Y3BrZ19pbnN0YWxsZWQveDY0LW9zeC9p bmNsdWRlDQogICAgIOKUgiBDUF9HTVBfTElOS19ERUZBVUxUICAgICAgICAgICAgICAgPSAtTFo6 L2J1aWxkL2Rhcndpbl9hcm02NC92Y3BrZ19pbnN0YWxsZWQvYXJtNjQtb3N4L2xpYjstbGdtcA0K ICAgICDilIIgQ1BfR01QX0xJTktfREVGQVVMVF9EQVJXSU5fWDg2XzY0ID0gLUxaOi9idWlsZC9k YXJ3aW5feDg2XzY0L3ZjcGtnX2luc3RhbGxlZC94NjQtb3N4L2xpYjstbGdtcA0KICAgICDilJTi lIDilIDilIDilIANCg0KICAgICDigKIgVGhlIG90aGVyIGRpcmVjdGlvbiBtYXkgYmUgbW9yZSBp bnRlcmVzdGluZywgc2luY2UgdGhlIGZyZWUNCiAgICAgICBHaXRIdWIgQWN0aW9ucyBvbmx5IHN1 cHBvcnRzIHg4Nl82NC4gVGhlIHNjZW5hcmlvIG9mIHRha2luZyBhDQogICAgICAgbWFjT1MgeDg2 XzY0IEdpdEh1YiBob3N0IGFuZCBjcm9zcy1jb21waWxpbmcgdG8gQXBwbGUgU2lsaWNvbiBpcw0K ICAgICAgIFtpbXBsZW1lbnRlZCBhbmQgcGFydGlhbGx5IHRlc3RlZF0uDQogIDIuIEkgYW0gdXNp bmcgYSBDIHBhY2thZ2UgbWFuYWdlciAodmNwa2cpIHRvIGdpdmUgbWUgY3Jvc3MtY29tcGlsZWQN CiAgICAgbGlicmFyaWVzIGFuZCB0aGUgZmxhZ3MgZm9yIHRoZSB0YXJnZXQgQUJJIChpbiB0aGlz IGNhc2UNCiAgICAgZGFyd2luX3g4Nl82NCBpcyB0aGUgdGFyZ2V0IEFCSSkuIEluIGdlbmVyYWwg aXQgZG9lc24ndCBtYXR0ZXINCiAgICAgd2hlcmUgeW91IGdldCB5b3VyIHRhcmdldCBBQkkgY29t cGF0aWJsZSBsaWJyYXJpZXMgZnJvbS4gRXhhbXBsZToNCiAgICAgV2hlbiBJJ20gY3Jvc3MtY29t cGlsaW5nIHRvIEFuZHJvaWQgb24gYSBXaW5kb3dzIHg4Nl82NCBob3N0LCB0aGUNCiAgICAgQW5k cm9pZCBTdHVkaW8gZW52aXJvbm1lbnQgZ2l2ZXMgbWUgc29tZSBsaWJyYXJpZXMgZm9yIGFuIEFu ZHJvaWQNCiAgICAgRW11bGF0b3IgKGhvc3QgQUJJKSBhbmQgYWxzbyBwcmVidWlsdCBsaWJyYXJp ZXMgZm9yIDQgQW5kcm9pZA0KICAgICBkZXZpY2UgQUJJczoNCg0KICAgICDilIzilIDilIDilIDi lIANCiAgICAg4pSCIERpcmVjdG9yeTogQzpcVXNlcnNceHh4XEFwcERhdGFcTG9jYWxcQW5kcm9p ZFxTZGtcbmRrXDIzLjEuNzc3OTYyMFxwcmVidWlsdA0KICAgICDilIIgDQogICAgIOKUgiBNb2Rl ICAgICAgICAgICAgICAgICBMYXN0V3JpdGVUaW1lICAgICAgICAgTGVuZ3RoIE5hbWUNCiAgICAg 4pSCIC0tLS0gICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0gICAgICAgICAtLS0tLS0gLS0t LQ0KICAgICDilIIgZC0tLS0tICAgICAgICAxMC8yMC8yMDIxICAgODoyNyBQTSAgICAgICAgICAg ICAgICBhbmRyb2lkLWFybQ0KICAgICDilIIgZC0tLS0tICAgICAgICAxMC8yMC8yMDIxICAgODoy NyBQTSAgICAgICAgICAgICAgICBhbmRyb2lkLWFybTY0DQogICAgIOKUgiBkLS0tLS0gICAgICAg IDEwLzIwLzIwMjEgICA4OjI3IFBNICAgICAgICAgICAgICAgIGFuZHJvaWQteDg2DQogICAgIOKU giBkLS0tLS0gICAgICAgIDEwLzIwLzIwMjEgICA4OjI2IFBNICAgICAgICAgICAgICAgIGFuZHJv aWQteDg2XzY0DQogICAgIOKUgiBkLS0tLS0gICAgICAgIDEwLzIwLzIwMjEgICA4OjI3IFBNICAg ICAgICAgICAgICAgIHdpbmRvd3MteDg2XzY0DQogICAgIOKUlOKUgOKUgOKUgOKUgA0KICAzLiBU aGUgYENQX2NsaWJyYXJ5X0NDX0RFRkFVTFRfYWJpJyBjb25maWd1cmF0aW9uIHJlbGllcyBvbiBg YWJpJyAodGhlDQogICAgIG9jYW1sZmluZCB0b29sY2hhaW4gbmFtZSkgYmVpbmcgc3RhbmRhcmRp emVkLiBUaGUgYGdtcCcgbGlicmFyeSwNCiAgICAgZm9yIGV4YW1wbGUsIGlzIHVzZWQgYnkgbWFu eSBPQ2FtbCBwYWNrYWdlczsgSSB3YW50ZWQgb25lDQogICAgIGNvbmZpZ3VyYXRpb24gZm9yIGBn bXAnLCBub3Qgb25lIGNvbmZpZ3VyYXRpb24gZm9yIGVhY2ggYChnbXAsDQogICAgIE9DYW1sIHBh Y2thZ2UpJyBjb21iaW5hdGlvbi4gSW4gZmFjdCwgZ2V0dGluZyBhIGNvbnNpc3RlbnQgYGFiaScN CiAgICAgbmFtaW5nIHdhcyBvbmUgb2YgbXkgbW90aXZhdGlvbnMgZm9yIHJlbGVhc2luZyBgZGtt bC1jLXByb2JlJy4gSQ0KICAgICBkb24ndCB0aGluayB0aGUgcHJpb3IgYXJ0IGdvdCB0aGlzIHJp Z2h0IOKApiB0aGUgdmVyeSBzdGFsZQ0KICAgICBbb3BhbS1jcm9zcy1hbmRyb2lkXSBwcm9qZWN0 IHVzZXMgW2BhYmkgPSAiYW5kcm9pZCInXSB3aGljaCBpcw0KICAgICBpbnN1ZmZpY2llbnQgdG8g ZGlmZmVyZW50aWF0ZSB0aGUgNSsgc2V0cyBvZiBsaWJyYXJpZXMgYXZhaWxhYmxlIGluDQogICAg IEFuZHJvaWQgU3R1ZGlvLg0KICA0LiBUaGUgImdtcCIgKGV0Yy4pIGNvbmZpZ3VyYXRpb24gaXMg ZG9uZSBvbmNlIGluIGEgZmFtaWxpYXIgc3ludGF4DQogICAgIChgLUwsIC1JLCAtbCcpLiBIb3dl dmVyIHRoZSBgQ19jb25mJyBsaWJyYXJ5IHdpbGwgcGFyc2UgYW5kIHByaW50DQogICAgIHRoZSBj b25maWd1cmF0aW9uIGluIHRoZSBhcHByb3ByaWF0ZSBDIGNvbXBpbGVyIHN5bnRheC4gV2hlbiB0 aGUNCiAgICAgTVNWQyBjb21waWxlciBpcyB1c2VkIHlvdSBnZXQgTVNWQyBzdHlsZSBsaW5raW5n Og0KICAgICDilIzilIDilIDilIDilIANCiAgICAg4pSCIFsNCiAgICAg4pSCICAgIi1MSUJQQVRI Olo6L2J1aWxkL2Rhcndpbl94ODZfNjQvdmNwa2dfaW5zdGFsbGVkL3g2NC1vc3gvbGliIjsNCiAg ICAg4pSCICAgImdtcC5saWIiDQogICAgIOKUgiBdDQogICAgIOKUlOKUgOKUgOKUgOKUgA0KICAg ICBNU1ZDIGFuZCBHQ0MgY29udmVudGlvbnMgYXJlIHN1cHBvcnRlZCB0b2RheSBpbiBgQ19jb25m Jy4NCiAgNS4gQSByZWFsIGV4YW1wbGUgb2YgdXNpbmcgYENfY29uZicgaXMgaW4gbXkgY3VzdG9t aXphdGlvbiBvZiBbemFyaXRoDQogICAgIGxpYnJhcnldLiBJdCBjaGVja3MgYENfY29uZicgZmly c3QgdG8gc2VlIHdoZXRoZXIgdGhlIHVzZXIgaGFzIHRoZQ0KICAgICBob3N0L3RhcmdldCBBQkkg Y29uZmlndXJhdGlvbjsgaWYgaXQgZG9lc24ndCBpdCBmYWxscyBiYWNrIHRvDQogICAgIHBrZy1j b25maWcuDQoNCiAgVGhlIHRyZW5kIG9mIHVzaW5nIGBwa2ctY29uZmlnJyBpbiBPQ2FtbCBwYWNr YWdlcyBtYWtlcyBib3RoIG5hdGl2ZQ0KICBXaW5kb3dzIGFuZCBjcm9zcy1jb21waWxhdGlvbiBk aWZmaWN1bHQuIEF0IHRoZSBtb21lbnQgKndlDQogIHVuaW50ZW50aW9uYWxseSBzaG9vdCBvdXJz ZWx2ZXMgaW4gdGhlIGZvb3QqIGJlY2F1c2UgW0R1bmUNCiAgZG9jdW1lbnRhdGlvbiBlbmNvdXJh Z2VzIGBwa2ctY29uZmlnJ10gZm9yIHVuZGVyc3RhbmRhYmxlIHJlYXNvbnMuIEkNCiAgaG9wZSBg ZGttbC1jLXByb2JlJyBjYW4gYnJlYWsgdGhhdCB0cmVuZC4NCg0KDQpbaW1wbGVtZW50ZWQgYW5k IHBhcnRpYWxseSB0ZXN0ZWRdDQo8aHR0cHM6Ly9naXRodWIuY29tL2Rpc2t1di9ka21sLWMtcHJv YmUvYmxvYi8yYzFlOTBiNGVlYTExOTM0OGQ2ZGFlMzdkNjQ5NDkwNDFlZjllYWViLy5naXRodWIv d29ya2Zsb3dzL3Rlc3QueW1sI0wyOTktTDM3OT4NCg0KW29wYW0tY3Jvc3MtYW5kcm9pZF0gPGh0 dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1jcm9zcy9vcGFtLWNyb3NzLWFuZHJvaWQ+DQoNCltgYWJp ID0gImFuZHJvaWQiJ10NCjxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwtY3Jvc3Mvb3BhbS1jcm9z cy1hbmRyb2lkI3BvcnRpbmctcGFja2FnZXM+DQoNClt6YXJpdGggbGlicmFyeV0NCjxodHRwczov L2dpdGh1Yi5jb20vam9uYWhiZWNrZm9yZC9aYXJpdGgvYmxvYi9hMWJmNmQ1NWNkM2M0YjkxZGVl MGFmYjIzMDllZjExMjcxZTk3MjliL2Rpc2NvdmVyLm1sPg0KDQpbRHVuZSBkb2N1bWVudGF0aW9u IGVuY291cmFnZXMgYHBrZy1jb25maWcnXQ0KPGh0dHBzOi8vZHVuZS5yZWFkdGhlZG9jcy5pby9l bi9zdGFibGUvZHVuZS1saWJzLmh0bWwjY29uZmlndXJhdG9yLTE+DQoNCg0KSHRteC9oYyB3ZWIg ZGV2ZWxvcG1lbnQgYXBwcm9hY2gNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvaHRteC1o Yy13ZWItZGV2ZWxvcG1lbnQtYXBwcm9hY2gvOTk5My8xMT4NCg0KDQpWbGFkaW1pciBLZWxlc2hl diBhbm5vdW5jZWQgYXNrZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgA0KDQogIEBjZW1lcmljaywgQHlhd2FyYW1pbiwgQGRidWVuemxpLCBhbmQgb3RoZXJzIHdo byd2ZSB1c2VkIGh0bXgvaGMgd2l0aA0KICBPQ2FtbCBiYWNrLWVuZDogd2hhdCBpcyB5b3VyIGV4 cGVyaWVuY2Ugd2l0aCB0ZW1wbGF0aW5nPyBJdCBzZWVtcyB0aGF0DQogIGh0bXgvaGMgcHV0cyBo aWdoIHJlcXVpcmVtZW50cyBvbiBhIGZsZXhpYmxlIEhUTUwgdGVtcGxhdGluZy9EU0wuIFdoYXQN CiAgZGlkIHlvdSBjaG9vc2UgYW5kIGlzIGl0IHdvcmtpbmcgb3V0IGZvciB5b3U/DQoNCg0KRGFu aWVsIELDvG56bGkgcmVwbGllZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSSdtIHVzaW5nIE9DYW1sIGFuZCBhbiBh YnNvbHV0ZWx5IFt0cml2aWFsIEhUTUwgZ2VuZXJhdGlvbg0KICBsaWJyYXJ5XS4gSWYgeW91IHdh bnQgdG8gc2VlIGEgcmVhbCB3b3JsZCBleGFtcGxlIGhlYWQgdG8gdGhlDQogIGAqX2h0bWwue21s LG1saX0nIGZpbGVzIGluIFt0aGlzIGRpcmVjdG9yeV0gKG1vcmUgb24gdGhlIHN0cnVjdHVyZQ0K ICBmb3VuZCB0aGVyZSBbaGVyZV0pDQoNCiAgV29ya3MgcXVpdGUgd2VsbCBmb3IgbWUgYnV0IEkn ZCBzYXkgdGhlIHByb2JsZW0gaXMgbm90IHJlYWxseQ0KICB0ZW1wbGF0aW5nIGl0J3MgcmF0aGVy IG5vbi1icml0dGxlIFVSTCBtYW5hZ2VtZW50LiBGb3IgdGhhdCBJIHVzZQ0KICBbdGhpcyBtb2R1 bGVdIHdoaWNoIHdoaWxlIEknbSBub3QgZW50aXJlbHkgY29udmluY2VkIGJ5IGl0IHlldCwgYWxs b3dzDQogIG1lIHRvIHR5cGUgdGhlbSBhbmQgYXZvaWQgdGhlIHN0cmluZ2x5IHVuY2hlY2tlZCBk ZXBlbmRlbmRlbmNpZXMgc28NCiAgY2hhcmFjdGVyaXN0aWMgb2YgdGhlIHdlYiBkZXZlbG9wbWVu dCB3b3JsZC4NCg0KDQpbdHJpdmlhbCBIVE1MIGdlbmVyYXRpb24gbGlicmFyeV0NCjxodHRwczov L2VycmF0aXF1ZS5jaC9zb2Z0d2FyZS93ZWJzL2RvYy9XZWJzX2h0bWwvaW5kZXguaHRtbD4NCg0K W3RoaXMgZGlyZWN0b3J5XQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9kYnVlbnpsaS9oeXBlcmJpYi90 cmVlL21hc3Rlci9zcmMvc2VydmljZT4NCg0KW2hlcmVdDQo8aHR0cHM6Ly9naXRodWIuY29tL2Ri dWVuemxpL2h5cGVyYmliL2Jsb2IvbWFzdGVyL0RFVkVMLm1kI2NsaS10b29sLWFuZC1iYWNrZW5k Pg0KDQpbdGhpcyBtb2R1bGVdDQo8aHR0cHM6Ly9lcnJhdGlxdWUuY2gvc29mdHdhcmUvd2Vicy9k b2MvV2Vic19raXQvS3VybC9pbmRleC5odG1sPg0KDQoNCkNoYXMgRW1lcmljayBhbHNvIHJlcGxp ZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFllYWgsIHlvdSdyZSByaWdodCBvbiB0aGF0IHBv aW50Lg0KDQogIEknbSB1c2luZyB0eXhtbCBmb3IgOTklIG9mIG15IEhUTUwgZ2VuZXJhdGlvbiwg c3BlY2lmaWNhbGx5IGl0cyBqc3gNCiAgcHB4LiBJIGFtIGp1ZGljaW91cyBhYm91dCBrZWVwaW5n IHRoZSBtYWluIGxvZ2ljcyBvZiB0aGUgcHJvamVjdCBpbg0KICBPQ2FtbCBwcm9wZXI7IGAucmUn IGZpbGVzIGV4aXN0IGV4Y2x1c2l2ZWx5IHRvIGhvbGQgbWFya3VwLiBUaGUgZW5kDQogIHJlc3Vs dCBpcyBhIF92ZXJ5XyBwbGVhc2FudCBlbnZpcm9ubWVudCBJTU8uIEluIHRoZSBlbmQsIEkgZGVh cmx5IHdpc2gNCiAgdGhlcmUgd2FzIGEgd2F5IHRvIGdldCBhY3R1YWwgSFRNTCBzeW50YXggaW50 byBgLm1sJyBmaWxlcyAoSSBhbSBubw0KICBmYW4gb2YgcmVhc29uIHN5bnRheCBvdXRzaWRlIG9m IGpzeCwgYW5kIEkgc3VzcGVjdCB0aGUgc29ydGEtbGVnYWN5DQogIGpzeCB0b29sY2hhaW4gbGVm dG92ZXIgZnJvbSByZWFzb25tbCB3aWxsIGVuZCB1cCBiZWluZyBhIHRlY2ggcmlzaw0KICBvdmVy IHRpbWUpLCBidXQgYXMgdGhpbmdzIHN0YW5kLCBpdCdzIHRoZSBiZXN0IG9wdGlvbiBJJ3ZlIGZv dW5kLg0KDQoNCllhd2FyIEFtaW4gYWxzbyByZXBsaWVkDQrilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBJJ20g anVzdCB1c2luZyBEcmVhbSdzICdidWlsdC1pbicgdGVtcGxhdGluZywgJ0VtYmVkZGVkIE1MICgu ZW1sKScsIGl0DQogIHdvcmtzIHJlYXNvbmFibHkgd2VsbOKAk2VhY2ggdGVtcGxhdGUgb3IgcGFy dGlhbCBpcyBqdXN0IGEgZnVuY3Rpb24gdGhhdA0KICB5b3UgZGVmaW5lIHRvIHRha2Ugc29tZSBh cmd1bWVudHMgYW5kIHJldHVybiBzb21lIG1hcmt1cC4gSXQgZXZlbg0KICBhdXRvLWVzY2FwZXMg dG8gcHJldmVudCBpbmplY3Rpb24gYXR0YWNrcy4gRS5nLiwNCg0KICDilIzilIDilIDilIDilIAN CiAg4pSCIGxldCBjYXJkIG5hbWUgPQ0KICDilIIgICA8ZGl2IGNsYXNzPSJjYXJkIj48JXMgbmFt ZSAlPjwvZGl2Pg0KICDilJTilIDilIDilIDilIANCg0KICBUaGVyZSBhcmUgYSBjb3VwbGUgb2Yg dHJpY2tzIHRvIGJlIGF3YXJlIG9mIHdpdGggdGhlIEVNTCBzeW50YXggYnV0IGluDQogIGdlbmVy YWwgaXQgd29ya3Mgd2VsbC4NCg0KDQpTaW1vbiBDcnVhbmVzIGFsc28gcmVwbGllZA0K4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSADQoNCiAgRm9yIHRoZSBsaXR0bGUgd2ViZGV2IEkgZG8gKGludGVybmFs IHRvb2xzIG1vc3RseSBmb3IgbXlzZWxmKSwgSSd2ZQ0KICBhbHNvIGJlZW4gdXNpbmcgc2VydmVy IHNpZGUgaHRtbCBnZW5lcmF0aW9uLCB3aXRoIG15IG93biBgd2hlZWxzJw0KICB0b29scyBhbmQg YSBiaXQgb2YgaHRteC4NCg0KICBIZXJlJ3MgYW4gZXhjZXJwdCBmcm9tIGEgcGVyc29uYWwgcHJv amVjdCwgd2l0aCBteSBvd24gaHR0cGQgYW5kIGh0bWwNCiAgY29tYmluYXRvcnM7IGl0IGFkZHMg YSByb290IHRvIGhhbmRsZSBgL3RoeS88c29tZSBzdHJpbmc+JzoNCg0KICDilIzilIDilIDilIDi lIANCiAg4pSCIGxldCBoX3RoeSAoc2VsZjpzdGF0ZSkgOiB1bml0ID0NCiAg4pSCICAgSC5hZGRf cm91dGVfaGFuZGxlciBzZWxmLnNlcnZlcg0KICDilIIgICAgIEguUm91dGUuKGV4YWN0ICJ0aHki IEAvIHN0cmluZ191cmxlbmNvZGVkIEAvIHJldHVybikgQEAgZnVuIHRoeV9uYW1lIHJlcSAtPg0K ICDilIIgICBsZXRAICgpID0gdG9wX3dyYXBfIHJlcSBpbg0KICDilIIgICBsZXQgdGh5ID0gSWR4 LmZpbmRfdGh5IHNlbGYuc3QuaWR4IHRoeV9uYW1lIGluDQogIOKUgiAgIGxldCByZXMgPQ0KICDi lIIgICAgIGxldCBvcGVuIEh0bWwgaW4NCiAg4pSCICAgICBbDQogIOKUgiAgICAgICBkaXZbY2xz ICJjb250YWluZXIiXVsNCiAg4pSCIAloM1tdW3R4dGYgIlRoZW9yeSAlcyIgdGh5X25hbWVdOw0K ICDilIIgCVRoeV9maWxlLnRvX2h0bWwgdGh5Ow0KICDilIIgCWRpdiBbDQogIOKUgiAJICAiaHgt dHJpZ2dlciIsICJsb2FkIjsNCiAg4pSCIAkgICJoeC1nZXQiLCAoc3BmICIvZXZhbC8lcyIgQEAg SC5VdGlsLnBlcmNlbnRfZW5jb2RlIHRoeV9uYW1lKTsNCiAg4pSCIAkgICJoeC1zd2FwIiwgImlu bmVySHRtbCJdIFsNCiAg4pSCIAkgIHNwYW5bY2xzICJodG14LWluZGljYXRvciI7IEEuaWQgImlu ZCJdWw0KICDilIIgCSAgICB0eHQgIltldmFsdWF0aW5n4oCmXSI7DQogIOKUgiAJICBdDQogIOKU giAJXTsNCiAg4pSCICAgICAgIF0NCiAg4pSCICAgICBdDQogIOKUgiAgIGluDQogIOKUgiAgIHJl cGx5X3BhZ2UgfnRpdGxlOihzcGYgInRoZW9yeSAlcyIgdGh5X25hbWUpIHJlcSByZXMNCiAg4pSU 4pSA4pSA4pSA4pSADQoNCg0KRW5naW5lZXIgYW5kIHBvc3Rkb2MgcG9zaXRpb25zIGluIEZyYW5j ZSAodmFyaW91cyBsYWJzKSB0byB3b3JrIG9uIGEgcHJvb2YgYXNzaXN0YW50IGZvciBjcnlwdG8g cHJvdG9jb2xzDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0K ICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2VuZ2luZWVyLWFuZC1wb3N0ZG9jLXBvc2l0 aW9ucy1pbi1mcmFuY2UtdmFyaW91cy1sYWJzLXRvLXdvcmstb24tYS1wcm9vZi1hc3Npc3RhbnQt Zm9yLWNyeXB0by1wcm90b2NvbHMvOTk5OS8xPg0KDQoNCkRhdmlkIEJhZWxkZSBhbm5vdW5jZWQN CuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgA0KDQogIFdlIGFyZSBsb29raW5nIGZvciBlbmdpbmVlcnMgYW5kIHBvc3Rkb2Nz IHRvIHdvcmsgb24gU3F1aXJyZWwsIGEgcHJvb2YNCiAgYXNzaXN0YW50IGRlZGljYXRlZCB0byBw cm92aW5nIGNyeXB0b2dyYXBoaWMgcHJvdG9jb2xzLiBXZSBoYXZlIGENCiAgYnJvYWQgcmFuZ2Ug b2YgcHJvamVjdHMgaW4gbWluZCwgcmFuZ2luZyBmcm9tIHB1cmUgT0NhbWwgZGV2ZWxvcG1lbnQN CiAgdG8gaW52b2x2ZWQgcHJvdG9jb2wgZm9ybWFsaXphdGlvbnMsIHdpdGggc2V2ZXJhbCB0aGVv cmV0aWNhbA0KICBxdWVzdGlvbnMgaW4gYmV0d2Vlbi4gSWYgeW91J2QgbGlrZSB0byB3b3JrIG9u IHNvbWUgb2YgdGhlc2UgYXNwZWN0cw0KICBmb3Igb25lIG9yIG1vcmUgeWVhcnMsIHBsZWFzZSBn ZXQgaW4gdG91Y2ggd2l0aCB1cyENCg0KICBNb3JlIGRldGFpbHMgY2FuIGJlIGZvdW5kIGhlcmU6 DQoNCiAgPGh0dHBzOi8vc3F1aXJyZWwtcHJvdmVyLmdpdGh1Yi5pby9wb3NpdGlvbnMucGRmPg0K DQoNCllvanNvbiAyLjAuMA0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoN CiAgQXJjaGl2ZTogPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4teW9qc29uLTItMC0w LzEwMDAzLzE+DQoNCg0KTWFyZWsgS3ViaWNhIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgVGhp cyBGcmlkYXksIGl0IGlzIG15IHBsZWFzdXJlIHRvIGFubm91bmNlIHRoZSByZWxlYXNlIG9mIFlv anNvbg0KICAyLjAuMC4gWW91IGNhbiBnZXQgaXQgW2luIHlvdXIgbG9jYWwgT1BBTSByZXBvc2l0 b3J5XS4NCg0KICBLZXkgaGlnaGxpZ2h0cyBpbmNsdWRlOg0KDQogIOKAoiBGZXdlciBkZXBlbmRl bmNpZXM6IEdpdmVuIFlvanNvbiBpcyBhIGNvbW1vbiBkZXBlbmRlbmN5IHdlIGN1dCBkb3duDQog ICAgb24gaXRzIGRlcGVuZGVuY2llcyBzbyB5b3UgaGF2ZSB0byBpbnN0YWxsIGxlc3MgYW5kIGhh dmUgbGVzcw0KICAgIHRyYW5zaXRpdmUgZGVwZW5kZW5jaWVzDQogIOKAoiBgU2VxJyBpbnRlcmZh Y2U6IFNpbmNlIE9DYW1sIDQuMTQgZGVwcmVjYXRlcyBgU3RyZWFtJyBhbmQgNS4wDQogICAgcmVt b3ZlcyBpdCwgdGhpcyB3YXMgYSBnb29kIHRpbWUgdG8gY2hhbmdlIHRvIHRoaXMgaW50ZXJmYWNl DQogIOKAoiBgQnVmZmVyJyBpbnRlcmZhY2U6IGNvbWluZyBhbG9uZyB3aXRoICMxLCB3ZSBjaGFu Z2VkIFlvanNvbiB0byB1c2UNCiAgICBgQnVmZmVyJyB3aGVyZXZlciBpdCB3YXMgdXNpbmcgYEJp bmlvdScgdHlwZXMgYmVmb3JlDQoNCiAgVGhhbmtzIHRvIGV2ZXJ5Ym9keSBpbnZvbHZlZCBpbiB0 aGlzIHJlbGVhc2UhDQoNCiAgSWYgWW9qc29uIHNvdW5kcyBsaWtlIGFuIGludGVyZXN0aW5nIHBy b2plY3QgZm9yIHlvdSB0byBjb250cmlidXRlLA0KICBbam9pbiB1c10uDQoNCiAgRnVsbCBjaGFu Z2Vsb2cgZm9sbG93czoNCg0KDQpbaW4geW91ciBsb2NhbCBPUEFNIHJlcG9zaXRvcnldDQo8aHR0 cHM6Ly9vcGFtLm9jYW1sLm9yZy9wYWNrYWdlcy95b2pzb24vPg0KDQpbam9pbiB1c10gPGh0dHBz Oi8vZ2l0aHViLmNvbS9vY2FtbC1jb21tdW5pdHkveW9qc29uPg0KDQoyLjAuMA0K4pWM4pWM4pWM 4pWM4pWMDQoNCiAgKjIwMjItMDYtMDIqDQoNCg0KUmVtb3ZlZA0K4pSE4pSE4pSE4pSE4pSE4pSE 4pSEDQoNCiAg4oCiIFJlbW92ZWQgZGVwZW5kZW5jeSBvbiBlYXN5LWZvcm1hdCBhbmQgcmVtb3Zl ZCBgcHJldHR5X2Zvcm1hdCcgZnJvbQ0KICAgIGBZb2pzb24nLCBgWW9qc29uLkJhc2ljJywgYFlv anNvbi5TYWZlJyBhbmQgYFlvanNvbi5SYXcnLiAoQGMtY3ViZSwNCiAgICAjOTApDQogIOKAoiBS ZW1vdmVkIGRlcGVuZGVuY3kgb24gYGJpbmlvdScsIHNpbXBsaWZ5aW5nIHRoZSBjaGFpbiBvZg0K ICAgIGRlcGVuZGVuY2llcy4gVGhpcyBjaGFuZ2VzIHNvbWUgQVBJczoNCiAgICDigKMgYEJpX291 dGJ1Zi50JyBpbiBzaWduYXR1cmVzIGlzIHJlcGxhY2VkIHdpdGggYEJ1ZmZlci50Jw0KICAgIOKA oyBgdG9fb3V0YnVmJyBiZWNvbWVzIGB0b19idWZmZXInIGFuZCBgc3RyZWFtX3RvX291dGJ1Zicg YmVjb21lcw0KICAgICAgYHN0cmVhbV90b19idWZmZXInDQogICAgKEBMZW9uaWRhcywgIzc0LCBh bmQgQGdhc2NoZSwgIzEzMikNCiAg4oCiIFJlbW92ZWQgYHlvanNvbi1iaW5pb3UnIGxpYnJhcnkN CiAg4oCiIFJlbW92ZWQgZGVwcmVjYXRlZCBganNvbicgdHlwZSBhbGlhc2luZyB0eXBlIGB0JyB3 aGljaCBoYXMgYmVlbg0KICAgIGF2YWlsYWJsZSBzaW5jZSAxLjYuMCAoQExlb25pZGFzLCAjMTAw KS4NCiAg4oCiIFJlbW92ZWQgYGpzb25fbWF4JyB0eXBlIChATGVvbmlkYXMsICMxMDMpDQogIOKA oiBSZW1vdmVkIGNvbnN0cmFpbnQgdGhhdCB0aGUgInJvb3QiIHZhbHVlIGJlaW5nIHJlbmRlcmVk ICh2aWEgZWl0aGVyDQogICAgYHByZXR0eV9wcmludCcgb3IgYHRvX3N0cmluZycpIG11c3QgYmUg YW4gb2JqZWN0IG9yDQogICAgYXJyYXkuIChAY2VtZXJpY2ssICMxMjEpDQogIOKAoiBSZW1vdmVk IGB2YWxpZGF0ZV9qc29uJyBhcyBpdCBvbmx5IG1hZGUgc2Vuc2UgaWYgdGhlIHR5cGUgd2FzIGNh bGxlZA0KICAgIGBqc29uJy4gIChATGVvbmlkYXMsICMxMzcpDQoNCg0KQWRkDQrilITilITilIQN Cg0KICDigKIgQWRkIGFuIG9wYW0gcGFja2FnZSBgeW9qc29uLWJlbmNoJyB0byBkZWFsIHdpdGgg YmVuY2htYXJrcw0KICAgIGRlcGVuZGVuY3kgKEB0bWNnaWxjaHJpc3QsICMxMTcpDQogIOKAoiBB ZGQgYSBiZW5jaG1hcmsgdG8ganVkZ2UgdGhlIHJlc3BlY3RpdmUgcGVyZm9ybWFuY2Ugb2YgcHJv dmlkaW5nIGENCiAgICBidWZmZXIgdnMgbGV0dGluZyBZb2pzb24gY3JlYXRlIGFuIGludGVybmFs ICgjMTM0LCBATGVvbmlkYXMpDQogIOKAoiBBZGQgYW4gb3B0aW9uYWwgYHN1Zicga2V5d29yZCBh cmd1bWVudCB3YXMgYWRkZWQgdG8gZnVuY3Rpb25zIHRoYXQNCiAgICB3cml0ZSBzZXJpYWxpemVk IEpTT04sIHRodXMgYWxsb3dpbmcgTkRKU09OIG91dHB1dC4gTW9zdCBmdW5jdGlvbnMNCiAgICBk ZWZhdWx0IHRvIG5vdCBhZGRpbmcgYW55IHN1ZmZpeCBleGNlcHQgZm9yIGB0b19maWxlJyAoIzEy NCwNCiAgICBAcGFuZ2xlc2QpIGFuZCBmdW5jdGlvbnMgd3JpdGluZyBzZXF1ZW5jZXMgb2YgdmFs dWVzIHdoZXJlIHRoZQ0KICAgIGRlZmF1bHQgaXMgYFxuJyAoIzEzNSwgQExlb25pZGFzKQ0KDQoN CkNoYW5nZQ0K4pSE4pSE4pSE4pSE4pSE4pSEDQoNCiAg4oCiIFRoZSBgc3RyZWFtX2Zyb21fKicg YW5kIGBzdHJlYW1fdG9fKicgZnVuY3Rpb25zIG5vdyB1c2UgYSBgU2VxLnQnDQogICAgaW5zdGVh ZCBvZiBhIGBTdHJlYW0udCcsIGFuZCB0aGV5IGFyZSByZW5hbWVkIGludG8gYHNlcV9mcm9tXyon IGFuZA0KICAgIGBzZXFfdG9fKicgKEBnYXNjaGUsICMxMzEpLg0KDQoNCkZpeA0K4pSE4pSE4pSE DQoNCiAg4oCiIEF2b2lkIGNvcHlpbmcgdW5uZWNlc3NhcmlseSBsYXJnZSBhbW91bnRzIG9mIHN0 cmluZ3Mgd2hlbiBwYXJzaW5nDQogICAgKCM4NSwgIzEwOCwgQExlb25pZGFzKQ0KICDigKIgRml4 IGBzdHJlYW1fdG9fZmlsZScgKCMxMzMsIEB0Y29vcG1hbiBhbmQgQGdhc2NoZSkNCg0KDQpvcGVu dGVsZW1ldHJ5IDAuMg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZTogPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4t b3BlbnRlbGVtZXRyeS0wLTIvMTAwMDUvMT4NCg0KDQpTaW1vbiBDcnVhbmVzIGFubm91bmNlZA0K 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSADQoNCiAgSXQgaXMgbXkgcGxlYXN1cmUgdG8gYW5ub3VuY2UgdGhlIHJlbGVh c2Ugb2YgW29jYW1sLW9wZW50ZWxlbWV0cnldDQogIDAuMi4gVGhpcyBsaWJyYXJ5IHByb3ZpZGVz IGEgY29yZSBpbnN0cnVtZW50YXRpb24gbGlicmFyeSwgYXMgd2VsbCBhcw0KICBleHBvcnRlcnMs IGZvciB0aGUgW29wZW50ZWxlbWV0cnldIHN0YW5kYXJkIGZvciBvYnNlcnZhYmlsaXR5OyBpdA0K ICBlbmNvbXBhc3NlcyBkaXN0cmlidXRlZCB0cmFjaW5nLCBtZXRyaWNzLCBhbmQgKG1vcmUgcmVj ZW50bHkpIGxvZw0KICBleHBvcnQuIEEgbG90IG9mIHRvb2xzIGFyZSBjb21wYXRpYmxlIHdpdGgg b3BlbnRlbGVtZXRyeSB0aGVzZSBkYXlzLA0KICBpbmNsdWRpbmcgR3JhZmFuYSwgRGF0YURvZywg amFlZ2VyLCBldGMuDQoNCiAgVGhpcyBpcyBzdGlsbCB2ZXJ5IGVhcmx5IGRheXMgZm9yIG9jYW1s LW9wZW50ZWxlbWV0cnksIGZlZWRiYWNrIGFuZA0KICBjb250cmlidXRpb25zIGFyZSB3ZWxjb21l Lg0KDQoNCltvY2FtbC1vcGVudGVsZW1ldHJ5XQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9pbWFuZHJh LWFpL29jYW1sLW9wZW50ZWxlbWV0cnk+DQoNCltvcGVudGVsZW1ldHJ5XSA8aHR0cHM6Ly9vcGVu dGVsZW1ldHJ5LmlvLz4NCg0KDQpvbWFrZS0wLjEwLjUNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL3N5bXBhLmlucmlhLmZyL3N5 bXBhL2FyYy9jYW1sLWxpc3QvMjAyMi0wNi9tc2cwMDAxMi5odG1sPg0KDQoNCkdlcmQgU3RvbHBt YW5uIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSSBqdXN0IHJlbGVhc2VkIG9tYWtl LTAuMTAuNSwgdGhlIGJ1aWxkIHV0aWxpdHksIHdoaWNoIGZpeGVzIHRoZQ0KICBicm9rZW4gaW5z dGFsbGF0aW9uIG9mIHZlcnNpb24gMC4xMC40IGZyb20gbGFzdCB3ZWVrLg0KDQogIEZvciBkb2Nz IGFuZCB0aGUgZG93bmxvYWQgbGluayBzZWUNCiAgPGh0dHA6Ly9wcm9qZWN0cy5jYW1sY2l0eS5v cmcvcHJvamVjdHMvb21ha2UuaHRtbD4uIG9wYW0gaXMgdW5kZXJ3YXkuDQoNCg0KZmluZGxpYi0x LjkuNQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2 ZToNCiAgPGh0dHBzOi8vc3ltcGEuaW5yaWEuZnIvc3ltcGEvYXJjL2NhbWwtbGlzdC8yMDIyLTA2 L21zZzAwMDEyLmh0bWw+DQoNCg0KR2VyZCBTdG9scG1hbm4gYW5ub3VuY2VkDQrilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIANCg0KICBmaW5kbGliLTEuOS41IGlzIG91dCwgZml4aW5nIHNvbWUgc2NyaXB0aW5nIGVy cm9ycyBpbiB0aGUgdmVyc2lvbg0KICAxLjkuNCBmcm9tIGxhc3Qgd2Vlay4NCg0KICBGb3IgbWFu dWFsLCBkb3dubG9hZCwgbWFudWFscywgZXRjLiBzZWUgaGVyZToNCg0KICA8aHR0cDovL3Byb2pl Y3RzLmNhbWxjaXR5Lm9yZy9wcm9qZWN0cy9maW5kbGliLmh0bWw+DQoNCiAgQW4gdXBkYXRlZCBP UEFNIHBhY2thZ2Ugd2lsbCBmb2xsb3cgc29vbi4NCg0KDQpPbGQgQ1dODQrilZDilZDilZDilZDi lZDilZDilZANCg0KICBJZiB5b3UgaGFwcGVuIHRvIG1pc3MgYSBDV04sIHlvdSBjYW4gW3NlbmQg bWUgYSBtZXNzYWdlXSBhbmQgSSdsbCBtYWlsDQogIGl0IHRvIHlvdSwgb3IgZ28gdGFrZSBhIGxv b2sgYXQgW3RoZSBhcmNoaXZlXSBvciB0aGUgW1JTUyBmZWVkIG9mIHRoZQ0KICBhcmNoaXZlc10u DQoNCiAgSWYgeW91IGFsc28gd2lzaCB0byByZWNlaXZlIGl0IGV2ZXJ5IHdlZWsgYnkgbWFpbCwg eW91IG1heSBzdWJzY3JpYmUNCiAgW29ubGluZV0uDQoNCiAgW0FsYW4gU2NobWl0dF0NCg0KDQpb c2VuZCBtZSBhIG1lc3NhZ2VdIDxtYWlsdG86YWxhbi5zY2htaXR0QHBvbHl0ZWNobmlxdWUub3Jn Pg0KDQpbdGhlIGFyY2hpdmVdIDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi8+DQoN CltSU1MgZmVlZCBvZiB0aGUgYXJjaGl2ZXNdIDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0 L2N3bi9jd24ucnNzPg0KDQpbb25saW5lXSA8aHR0cDovL2xpc3RzLmlkeWxsLm9yZy9saXN0aW5m by9jYW1sLW5ld3Mtd2Vla2x5Lz4NCg0KW0FsYW4gU2NobWl0dF0gPGh0dHBzOi8vYWxhbi5wZXRp dGVwb21tZS5uZXQvPg0KDQo= --=-=-= 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 June 07 to 14, 2022.

Lwt informal user survey

Continuing this thread, Rapha=C3=ABl Proust said

Thanks to everyone who took the time to answer the polls above. I've now cl= osed them.

The first pull-request to come out of this poll is [https://github.com/ocsigen/lwt/pull/947](r= emoving support for OCaml<=3D4.07). This was the cutoff in the poll. It removes a lot of #if preprocessing statements and a few workarounds to stay compatible with old Stdlib interfaces. Thanks to @hanne= s for contributing most of the commits on this pull-request. If support for OCaml<=3D4.07 is important to you, please participate in = the pull-request's discussion or on this thread.

Stay tuned for more. (But also be patient.)

Tutorial: Full-Stack Web Dev in OCaml w/ Dream, Bonsai, and Gr= aphQL

Continuing this thread, jerben asked and Daniel B=C3= =BCnzli replied

Very interesting, did you write somewhere about how it compares to htmx?

Not really.

As far as I can remember I liked the ideas but found their execution to be = a bit lacking, sometimes ad-hoc in their attribute DSL, focusing more on the show off to convince single page applic= ation proponents of the approach than on a clear conceptual model (which hc tries to detail in the manual here).

Two other things that come to mind are:

  1. AFAIR their examples relied a lot on unique id attributes = for targeting request results. Unless you find a principled and automated w= ay to generate these that's not compositional and brittle. In hc I = extended the CSS selector syntax to allow to address your ancestors (pe= ace be upon them). That's more compositional but now you become sensitive t= o structural changes in your markup =E2=80=93 pick your poison[^1].
  2. I'm no longer sure about that, i.e. don't take my word for it, but I th= ink their DSL allowed to spread the definition of an interaction among many= elements which made it more difficult to understand what is happening. In = hc all attributes defining the effects of an interaction are a= lways located on a single element, the element that performs the request.

Finally when things go wrong I prefer to have to understand 700 lines of ml rather than 2800 lines of JavaScript (note that they likely have better legacy browser support and more functionality).

In any case there's a long list of todos in hc and it likely n= eeds one or two more design rounds before getting to something decent =E2=80=93 if that's even remotely possible on the web.

Dang it @dbuenzli one day you=E2=80=99ll run out of letters and need to com= e up with an actual name for your libraries.

Mind you I tried to use three letters once, but the whole experience turned= out to be extremely unpleasant :=E2=80=93)

[^1]: Using unique ids reifed in an OCaml EDSL could be a better idea.

dkml-c-probe: Cross-compiler friendly definitions for C compil= ing

jbeckford announced

V3 is available. Its C_abi module has some big enhancements:

  • cleaner API (thanks @mseri!)
  • recognizes the BSD family: OpenBSD, FreeBSD, NetBSD and DragonFly on x8= 6_64 hardware
  • integration testing now includes OpenBSD, FreeBSD and one cross-compili= ng toolchain (macOS x86_64 host that targets arm64)

V3 also has a new module C_conf which occupies the same proble= m space as findlib / ocamlfind and pkg-config:

  • Unlike findlib which is a specification+tool for 3rd party= OCaml libraries, C_conf is a specification+tool for foreign C= libraries
  • Unlike pkg-config which is a specification+tool for system= (host ABI) C libraries, C_conf is a specification+tool for th= e multiple ABIs that are present when you cross-compile OCaml or C code
  • Unlike pkg-config which is designed for Unix, C_conf= is designed for Windows and Unix where paths may have spaces, backs= lashes and colons
  • For now the specification is based on environment variables. If it prov= es useful the specification can be extended.

Examples and doc links for V3 are available at https://git= hub.com/diskuv/dkml-c-probe#dkml-c-probe

Marcello Seri asked and jbeckford replied

Thanks a lot for the update! Can you say a bit more about how C_conf<= /code> works?

C_conf has a detailed problem statement and spec at https://diskuv.github.io/dkml-c-probe/dkml-c-probe/Dkml_= c_probe/C_conf/index.html (which is linked to on the dkml-c-probe README).

I probably shouldn't regurgitate the doc here, so I'll take a few key piece= s from the doc and then post some things here that I didn't put on that doc page …

  1. Here is my configuration for locating the "gmp" library on my Apple Silicon= host machine that cross-compiles to x86_64:

    CP_GMP_CC_DEFAULT                 =3D -IZ:/build/darwin_arm64/vcpkg_install=
    ed/arm64-osx/include
    CP_GMP_CC_DEFAULT_DARWIN_X86_64   =3D -IZ:/build/darwin_x86_64/vcpkg_instal=
    led/x64-osx/include
    CP_GMP_LINK_DEFAULT               =3D -LZ:/build/darwin_arm64/vcpkg_install=
    ed/arm64-osx/lib;-lgmp
    CP_GMP_LINK_DEFAULT_DARWIN_X86_64 =3D -LZ:/build/darwin_x86_64/vcpkg_instal=
    led/x64-osx/lib;-lgmp
    
    • The other direction may be more interesting, since the free GitHub Acti= ons only supports x86_64. The scenario of taking a macOS x86_64 GitHub host= and cross-compiling to Apple Silicon is implemented and partially tested.
  2. I am using a C package manager (vcpkg) to give me cross-compiled libraries = and the flags for the target ABI (in this case darwin_x86_64 is the target = ABI). In general it doesn't matter where you get your target ABI compatible= libraries from. Example: When I'm cross-compiling to Android on a Windows = x86_64 host, the Android Studio environment gives me some libraries for an = Android Emulator (host ABI) and also prebuilt libraries for 4 Android devic= e ABIs:

    Directory: C:\Users\xxx\AppData\Local\Android\Sdk\ndk\23.1.7779620\prebuilt
    
    Mode                 LastWriteTime         Length Name
    ----                 -------------         ------ ----
    d-----        10/20/2021   8:27 PM                android-arm
    d-----        10/20/2021   8:27 PM                android-arm64
    d-----        10/20/2021   8:27 PM                android-x86
    d-----        10/20/2021   8:26 PM                android-x86_64
    d-----        10/20/2021   8:27 PM                windows-x86_64
    
  3. The CP_clibrary_CC_DEFAULT_abi configuration relies on abi (the ocamlfind toolchain name) being standardized. The = gmp library, for example, is used by many OCaml packages; I wanted o= ne configuration for gmp, not one configuration for each (gmp, OCaml package) combination. In fact, getting a consistent abi naming was one of my motivations for releasing dkml-c-p= robe. I don't think the prior art got this right … the very s= tale opam-cro= ss-android project uses abi =3D "android" which is= insufficient to differentiate the 5+ sets of libraries available in Androi= d Studio.
  4. The "gmp" (etc.) configuration is done once in a familiar syntax (-L,= -I, -l). However the C_conf library will parse and pri= nt the configuration in the appropriate C compiler syntax. When the MSVC co= mpiler is used you get MSVC style linking:

    [
      "-LIBPATH:Z:/build/darwin_x86_64/vcpkg_in=
    stalled/x64-osx/lib";
      "gmp.lib"
    ]
    

    MSVC and GCC conventions are supported today in C_conf.

  5. A real example of using C_conf is in my customization of <= a href=3D"https://github.com/jonahbeckford/Zarith/blob/a1bf6d55cd3c4b91dee0= afb2309ef11271e9729b/discover.ml">zarith library. It checks C_con= f first to see whether the user has the host/target ABI configuratio= n; if it doesn't it falls back to pkg-config.

The trend of using pkg-config in OCaml packages makes both nat= ive Windows and cross-compilation difficult. At the moment we unintentio= nally shoot ourselves in the foot because Dune documentation encou= rages pkg-config for understandable reasons. I hope = dkml-c-probe can break that trend.

Htmx/hc web development approach

Vladimir Keleshev announced asked

@cemerick, @yawaramin, @dbuenzli, and others who've used htmx/hc with OCaml= back-end: what is your experience with templating? It seems that htmx/hc puts high requirements on a flexible HTML= templating/DSL. What did you choose and is it working out for you?

Daniel B=C3=BCnzli replied

I'm using OCaml and an absolutely trivial HTML generation library. If you want to see a real world example head to the *_html.{ml,mli} files in this directory (more on the structure found there here)

Works quite well for me but I'd say the problem is not really templating it= 's rather non-brittle URL management. For that I use this module which while I'm not entirely convinced by it yet, allows me to type them and avoid the stringly= unchecked dependendencies so characteristic of the web development world.

Chas Emerick also replied

Yeah, you're right on that point.

I'm using tyxml for 99% of my HTML generation, specifically its jsx ppx. I = am judicious about keeping the main logics of the project in OCaml proper; .re files exist exclusively to= hold markup. The end result is a very ple= asant environment IMO. In the end, I dearly wish there was a way to get actual HT= ML syntax into .ml files (I am no fan of reason syntax outside of jsx, and I suspect the sorta-legacy jsx toolchain = leftover from reasonml will end up being a tech risk over time), but as things stand, it's the best option I've found.

Yawar Amin also replied

I'm just using Dream's 'built-in' templating, 'Embedded ML (.eml)', it work= s reasonably well–each template or partial is just a function that you define to take some arguments and retur= n some markup. It even auto-escapes to prevent injection attacks. E.g.,

let card name =3D
  <div class=3D"card"><%s name %></div>

There are a couple of tricks to be aware of with the EML syntax but in gene= ral it works well.

Simon Cruanes also replied

For the little webdev I do (internal tools mostly for myself), I've also be= en using server side html generation, with my own wheels tools and a bit of htmx.

Here's an excerpt from a personal project, with my own httpd and html combi= nators; it adds a root to handle /thy/<some string>:

let h_thy (self:state) : unit =3D
  H.add_route_handler self.server
    H.Route.(exact "thy" @/ strin=
g_urlencoded @/ return) @@ fun <=
span style=3D"color: #a0522d;">thy_name req ->
  let@ () =3D top=
_wrap_ req in
  let thy =3D Idx.find_thy self.st.idx thy_name in
  let res =3D
    let open Html i=
n
    [
      div[cls "container"][
        h3[][txtf "Theory %s" thy_name];
        Thy_file.to_html thy;
        div [
          "hx-trigger", "load";
          "hx-get", (spf "/eval/%s" @@ H.Util.percent_encode thy_name=
);
          "hx-swap", "innerHtml"] [
          span[cls "htmx-indicator";=
 A.id ][
            txt "[evaluating…]";
          ]
        ];
      ]
    ]
  in
  reply_page ~title:(spf "theory %s" thy_name) req res

Yojson 2.0.0

Marek Kubica announced

This Friday, it is my pleasure to announce the release of Yojson 2.0.0. You= can get it in your loc= al OPAM repository.

Key highlights include:

  • Fewer dependencies: Given Yojson is a common dependency we cut down on = its dependencies so you have to install less and have less transitive depen= dencies
  • Seq interface: Since OCaml 4.14 deprecates Stream and 5.0 removes it, this was a good time to change to this interface
  • Buffer interface: coming along with #1, we changed Yojson = to use Buffer wherever it was using Biniou types = before

Thanks to everybody involved in this release!

If Yojson sounds like an interesting project for you to contribute, join us.

Full changelog follows:

2.0.0

2022-06-02

Removed
  • Removed dependency on easy-format and removed pretty_format from Yojson, Yojson.Basic, Yojson.Safe an= d Yojson.Raw. (@c-cube, #90)
  • Removed dependency on biniou, simplifying the chain of depende= ncies. This changes some APIs:

    • Bi_outbuf.t in signatures is replaced with Buffer.t<= /code>
    • to_outbuf becomes to_buffer and stream_= to_outbuf becomes stream_to_buffer

    (@Leonidas, #74, and @gasche, #132)

  • Removed yojson-biniou library
  • Removed deprecated json type aliasing type t = which has been available since 1.6.0 (@Leonidas, #100).
  • Removed json_max type (@Leonidas, #103)
  • Removed constraint that the "root" value being rendered (via either pretty_print or to_string) must be an object or a= rray. (@cemerick, #121)
  • Removed validate_json as it only made sense if the type wa= s called json. (@Leonidas, #137)
Add
  • Add an opam package yojson-bench to deal with benchmarks d= ependency (@tmcgilchrist, #117)
  • Add a benchmark to judge the respective performance of providing a buff= er vs letting Yojson create an internal (#134, @Leonidas)
  • Add an optional suf keyword argument was added to function= s that write serialized JSON, thus allowing NDJSON output. Most functions default to not adding any suffix except for to_file (#124, @panglesd) and fun= ctions writing sequences of values where the default is \n (#135, @Leonidas)
Change
  • The stream_from_* and stream_to_* functions n= ow use a Seq.t instead of a Stream.t, and they are renamed into seq_from_* an= d seq_to_* (@gasche, #131).
Fix
  • Avoid copying unnecessarily large amounts of strings when parsing (#85,= #108, @Leonidas)
  • Fix stream_to_file (#133, @tcoopman and @gasche)

opentelemetry 0.2

Simon Cruanes announced

It is my pleasure to announce the release of ocaml-opentelemetry 0.2. This library provides a core instrumentation library, as well as expor= ters, for the opentelemetry standard for observ= ability; it encompasses distributed tracing, metrics, and (more recently) log export. A lot of tools are compatible with opentele= metry these days, including Grafana, DataDog, jaeger, etc.

This is still very early days for ocaml-opentelemetry, feedback and contrib= utions are welcome.

omake-0.10.5

Gerd Stolpmann announced

I just released omake-0.10.5, the build utility, which fixes the broken installation of version 0.10.4 from last week.

For docs and the download link see http://project= s.camlcity.org/projects/omake.html. opam is underway.

findlib-1.9.5

Gerd Stolpmann announced

findlib-1.9.5 is out, fixing some scripting errors in the version 1.9.4 from last week.

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

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

An updated OPAM package will follow soon.

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

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

--=-=-=--