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 ESMTP id B636C5D4 for ; Tue, 27 Apr 2021 14:26:42 +0000 (UTC) X-IronPort-AV: E=Sophos;i="5.82,254,1613430000"; d="scan'208,217";a="505309745" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 27 Apr 2021 16:26:29 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id A6F98E0389; Tue, 27 Apr 2021 16:26:27 +0200 (CEST) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id E77F7E020F for ; Tue, 27 Apr 2021 16:26:24 +0200 (CEST) IronPort-HdrOrdr: =?us-ascii?q?A9a23=3AQc1H7aNe21o4p8BcT47155DYdL4zR+YMi2QD?= =?us-ascii?q?/UoZc3xoW+afkN2jm+le8BfyhioYVn1Io6H5BICrR3TA+ZlppbQAJLvKZniehE?= =?us-ascii?q?KEJJxvhLGSpwHINDb58odmpMRdWoxfLPG1MlRgl8b952CDYrAd6f2K6rqhi+ub?= =?us-ascii?q?71oFd3AOV4ha4w10ChmWHyRNLWEsb/dXeqa03NZNpDarZB0sH6aGL0QCNtKjm/?= =?us-ascii?q?T2jp78JTYJCxk7gTP+6g+A2frAHx+RwxsEFwpTz7tny3HMlybw+r+u2svLtyP0?= =?us-ascii?q?5ivp45Nfhdf7juJfCsDJsNEcLg/njB2lDb4RIYGqjXQPrOam9Vow1ODQrRtlBd?= =?us-ascii?q?1670nNdny4yCGdoDXI4XIQ62T/0xuji3PlpsD1LQhXN/Z8?= X-IronPort-AV: E=Sophos;i="5.82,254,1613430000"; d="scan'208,217";a="379820373" Received: from clt-128-93-177-151.vpn.inria.fr (HELO set) ([128.93.177.151]) by mail3-relais-sop.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 27 Apr 2021 16:26:21 +0200 From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 27 Apr 2021 16:26:12 +0200 Message-ID: <87h7jrregr.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 18476 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 ZWsgb2YgQXByaWwgMjAgdG8gMjcsDQoyMDIxLg0KDQpUYWJsZSBvZiBDb250ZW50cw0K4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCmRvY3Mub2Nh bWwucHJvIDogYW4gT0NhbWwgRG9jdW1lbnRhdGlvbiBIdWINCkRlY29tcHJlc3MgMS40LjANCmVs bGlwdGljIGN1cnZlcyAtIG1haW50YWluYWJsZSBhbmQgdmVyaWZpZWQgKGZ1bGwgc3RhY2ssIGZy b20gcHJpbWl0aXZlcyB0byBUTFMpDQpGaXJzdCByZWxlYXNlIG9mIERvY3RldXIsIGFuIG9waW5p YXRlZCByZWFkLW9ubHkgZmlsZS1zeXN0ZW0gZm9yIE1pcmFnZU9TDQpPY2FtbC1zb2xpZGl0eSwg YSBuZXcgT0NhbWwgbGlicmFyeSBmb3IgU29saWRpdHkNCk1pZ3JhdGluZyB0byBmbG9hdGFycmF5 IChibG9nIHBvc3QpDQpPbGQgQ1dODQoNCg0KZG9jcy5vY2FtbC5wcm8gOiBhbiBPQ2FtbCBEb2N1 bWVudGF0aW9uIEh1Yg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8v ZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tZG9jcy1vY2FtbC1wcm8tYW4tb2NhbWwtZG9jdW1lbnRh dGlvbi1odWIvNzcxOC8xPg0KDQoNCkZhYnJpY2UgTGUgRmVzc2FudCBhbm5vdW5jZWQNCuKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFdlIGFyZSBwbGVhc2VkIHRvIGFubm91bmNlIHRo YXQgd2UganVzdCBwdWJsaXNoZWQgdGhlIGZpcnN0IHZlcnNpb24gb2YNCiAgdGhlIE9DYW1sIERv Y3VtZW50YXRpb24gSHViIG9uOg0KDQogIDxodHRwczovL2RvY3Mub2NhbWwucHJvPg0KDQogIFRo ZSBPQ2FtbCBEb2N1bWVudGF0aW9uIEh1YiBjYW4gYmUgdXNlZCB0byBicm93c2UgdGhlIHNvdXJj ZXMgYW5kIHRoZQ0KICBkb2N1bWVudGF0aW9ucyBvZiBtb3JlIHRoYW4gMjAwMCBvcGFtIHBhY2th Z2VzLCBmb2xsb3dpbmcgbGlua3MNCiAgYmV0d2VlbiB0aGVtIHdoZW4gdXNlZnVsLiBUaGlzIGlz IGEgd29yay1pbi1wcm9ncmVzcywgYW5kIHdlIGFyZQ0KICB3b3JraW5nIG9uIGltcHJvdmluZyBp dCB3aXRoIG1hbnkgbW9yZSBmZWF0dXJlcywgc3VjaCBhcyBzb3VyY2UNCiAgYW5ub3RhdGlvbnMg d2l0aCB0eXBlcywgZnVsbC10ZXh0IGFuZCB0eXBlLWRyaXZlbiBzZWFyY2hlcywNCiAgaW1wcm92 ZW1lbnRzIGluIHRoZSBnZW5lcmFsIHJlYWRhYmlsaXR5IG9mIGRvY3VtZW50YXRpb24sIGV0Yy4N Cg0KICBUaGUgc2l0ZSBpcyBnZW5lcmF0ZWQgdXNpbmcgYW4gb3Blbi1zb3VyY2UgdG9vbCBjYWxs ZWQgZGlnb2RvYywNCiAgYXZhaWxhYmxlIG9uOg0KDQogIDxodHRwczovL2dpdGh1Yi5jb20vT0Nh bWxQcm8vZGlnb2RvYz4NCg0KICBEaWdvZG9jIGlzIGFibGUgdG8gYnVpbGQgYSBtYXAgb2YgYW4g b3BhbSBzd2l0Y2gsIHdpdGggbGlua3MgYmV0d2Vlbg0KICBmaWxlcywgb3BhbSBwYWNrYWdlcywg b2NhbWwgbGlicmFyaWVzLCBtZXRhIHBhY2thZ2VzIGFuZCBvY2FtbA0KICBtb2R1bGVzLiBJdCBp cyBhbHNvIGFibGUgdG8gZ2VuZXJhdGUgZG9jdW1lbnRhdGlvbiB1c2luZyBvZG9jIHdpdGgNCiAg Y3Jvc3MtaW5kZXhlcyBiZXR3ZWVuIGFsbCB0aGVzZSBraW5kcyBvZiBwYWNrYWdlcy4NCg0KICBX ZSB3ZWxjb21lIGZlZWRiYWNrIGFuZCBjb250cmlidXRpb25zISAgRW5qb3kgIQ0KDQoNClNpbW9u IENydWFuZXMgc2FpZCBhbmQgQW5pbCBNYWRoYXZhcGVkZHkgYWRkZWQNCuKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgA0KDQogIEdyZWF0IHdvcmsgb24gdGhpcyBzaXRlLCBhbmQgSSBsb3ZlIHRoZSBk b21haW4gbmFtZSBhcyB3ZWxsIDstKQ0KDQogICAgICAgIFRoZSBjcm9zcyBsaW5raW5nIGJldHdl ZW4gcGFja2FnZXMgaXMgZmFudGFzdGljLg0KDQogIEFzIGEgYml0IG9mIGJhY2tncm91bmQgb24g d2h5IGRvY3VtZW50YXRpb24gY3Jvc3MtbGlua2luZyBoYXMgdGFrZW4gc28NCiAgbG9uZywgdGhl cmUgaXMgYSBsb25ubmdnZyBoaXN0b3J5IGludGVydHdpbmVkIHdpdGggbWFueSBwZW9wbGUncw0K ICBjb250cmlidXRpb25zIHRvIG9wYW0sIGJ1aWxkIHN5c3RlbXMgKG9jYW1sYnVpbGQgYW5kIGR1 bmUpLA0KICBjb252ZW50aW9ucyAoZmluZGxpYiBhbmQgb2RpZykgYW5kIG9mIGNvdXJzZSBbb2Rv Y10gaXRzZWxmLiAgVGhlIG1ham9yDQogIG1pbGVzdG9uZXMgYWxvbmcgdGhlIHdheSBoYXZlIGJl ZW46DQoNCiAg4oCiIFtvZG9jIDEuMF0sIGZpcnN0IGJlZ2FuIGluIDIwMTQgYXMgYSBxdWljayBw cm9qZWN0IHRvIHB1bGwgdG9nZXRoZXINCiAgICB0eXBpbmcgaW5mb3JtYXRpb24gZnJvbSBjbXRb aV0gZmlsZXMsIGJ1dCB3aGljaCByYW4gaW50byB0aGUgcHJvYmxlbQ0KICAgIHRoYXQgaXQgbmVl ZHMgYSBjb25zaXN0ZW50IHNldCBvZiBjb21waWxlZCBjbXQgZmlsZXMgdG8gYWN0dWFsbHkNCiAg ICB3b3JrLCBhbmQgc28gbmVlZHMgaGVscCBmcm9tIGV4dGVybmFsIHRvb2xzIHRvIHB1bGwgdGhh dCBzZXQgb2YNCiAgICBjb21waWxlZCBsaWJyYXJpZXMgdG9nZXRoZXIuDQogIOKAoiBbb2RpZ10s IHdoaWNoIHB1bGxzIHRvZ2V0aGVyIG11bHRpcGxlIG9wYW0gcGFja2FnZXMgKGFuZCBhDQogICAg ZmlsZXN5c3RlbSBsYXlvdXQgZm9yIG1ldGFkYXRhKSBhbmQgcnVucyBvZG9jIG9uIHRoZW4uIFRo aXMgYWxsb3dlZA0KICAgIGZvciB0aGUgY3JlYXRpb24gb2YgPGh0dHBzOi8vZG9jcy5taXJhZ2Uu aW8+IGEgZmV3IHllYXJzIGFnbyB3aGljaA0KICAgIGNyb3NzLXJlZmVyZW5jZXMgYSBzbWFsbGVy IG51bWJlciBvZiBwYWNrYWdlcw0KICDigKIgb3BhbS1yZXBvIGl0c2VsZiBoYXMgaGFkIGJldHRl ciBhbmQgYmV0dGVyIGJ1bGsgYnVpbGRzIG92ZXIgdGhlDQogICAgeWVhcnMgdG8gZW5zdXJlIHRo YXQgd2UgY2FuIGFjdHVhbGx5IGF1dG9tYXRpY2FsbHkgY29tcGlsZSBhbGwgdGhlDQogICAgYXJ0 ZWZhY3RzIG5lZWRlZCBmb3IgZG9jcyBidWlsZHMsIHRoYW5rcyB0byBlZmZvcnRzIGxpa2UgW2hl YWx0aA0KICAgIGNoZWNrXSBhbmQgW29jdXJyZW50XS4NCiAg4oCiIG9kb2MgMi4wLCB3aGljaCBm ZWF0dXJlZCBhIG11bHRpLXllYXIgW3Jld3JpdGVdIG9mIHRoZSBPQ2FtbCBtb2R1bGUNCiAgICBy ZXNvbHZlciBhbmQgaW50cm9kdWNlZCBhIG5ldyBbb3V0cHV0IElSXS4gIFRoaXMgZm9ydGhjb21p bmcgcmVsZWFzZQ0KICAgIHdhcyBwcmVzZW50ZWQgaW4gdGhpcyBbT0NhbWwgMjAyMCB0YWxrXSBi eSBAam9ubHVkbGFtLg0KDQogIEFuZCBub3cgd2l0aCBhbGwgdGhlc2UgcGllY2VzIGluIHBsYWNl LCB0aGUgT0NhbWwgZG9jdW1lbnRhdGlvbiBzcHJpbmcNCiAgaGFzIGFycml2ZWQhIFRoZSBPQ2Ft bFBybyBvbmUgcG9zdGVkIGhlcmUgYXMgdGhlIGZpcnN0IG9mIHRoZSAibmV3DQogIGJhdGNoIiBv ZiBtYXNzIGRvY3VtZW50YXRpb24gaW5kZXhlcnMsIGFuZCBJJ20gYXdhcmUgb2YgY29uY3VycmVu dA0KICBlZmZvcnRzIGJ5IHRoZSBvZG9jL29jYW1sLm9yZyBtYWludGFpbmVyIHRlYW1zIHRvIHB1 c2ggYSBjZW50cmFsIG9uZQ0KICBvdXQgdG8gb2NhbWwub3JnLCBhcyB3ZWxsIGFzIGJ5IHRoZSBN aXJhZ2VPUyB0ZWFtIHdobyBhcmUgcmVmcmVzaGluZw0KICBkb2NzLm1pcmFnZS5pbyB3aXRoIHRo ZSBsYXRlc3QgYW5kIGdyZWF0ZXN0LiAgSSdtIHN1cmUgd2hlbiB0aGUgZHVzdA0KICBoYXMgc2V0 dGxlZCBvbiBhbGwgdGhlc2UgaW5kZXhlcnMgd2UgY2FuIGxvb2sgZm9yIGNvbW1vbiBwaWVjZXMs IGJ1dA0KICBmb3Igbm93IGl0J3MgbG92ZWx5IHRvIHNlZSBzbyBtdWNoIGlubm92YXRpb24gaGFw cGVuaW5nIGF0IHBhY2UuDQoNCiAgRm9yIHRoZSBjb21tdW5pdHk6IG5vdyBpcyB0aGUgdGltZSB0 byBmaXggeW91ciBkb2NzdHJpbmdzIGluIHlvdXINCiAgbGlicmFyaWVzLCBhcyB0aGVyZSB3aWxs IG1hbnkgY29vbCB0b29scyBwYXJzaW5nIGFuZCBwcm9jZXNzaW5nIHRoZW0sDQogIGFuZCByZW5k ZXJpbmcgdGhlbSBpbnRvIGFsbCBraW5kcyBvZiBvdXRwdXQgZm9ybWF0cyENCg0KICBUbyB0aGUg W29kb2MgY29udHJpYnV0b3JzXSwgdGhhbmsgeW91ISBUaGUgam91cm5leSB0byBnZXQgdG8gdGhp cw0KICBkb2N1bWVudGF0aW9uIHNpdGUgc3RhcnRlZCBoZXJlIHNldmVuIHllYXJzIGFnbzoNCg0K ICDilIzilIDilIDilIDilIANCiAg4pSCIGNvbW1pdCBlZjkxNTcxY2FiMzFkOWVjZTdhZjk2NWVk NTJlYWFmZjU3YTEyZWZjDQogIOKUgiBBdXRob3I6IExlbyBXaGl0ZSA8bHB3MjVAY2wuY2FtLmFj LnVrPg0KICDilIIgRGF0ZTogICBUaHUgT2N0IDE2IDE5OjIwOjE4IDIwMTQgKzAxMDANCiAg4pSC IA0KICDilIIgICAgIEluaXRpYWwgY29tbWl0DQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIEBsZWZl c3NhbiBvbmUgdGhpbmcgSSdtIG5vdCBzdXJlIGFib3V0IGluIHlvdXIgc2l0ZSBpcyB0aGUgImNv cHlyaWdodA0KICBsaWJyYXJ5IGF1dGhvcnMiIGNsYWltLiBUaGF0J3MgbXVya3kgbGVnYWwgZ3Jv dW5kIOKAkyBpdCdzIHdvcnRoDQogIGVzdGFibGlzaGluZyBpZiB0aGUgb2RvYyBIVE1MIGhhcyBn b25lIHRocm91Z2ggYSBjb21waWxhdGlvbiBwcm9jZXNzDQogIGFuZCBzbyBpcyBubyBsb25nZXIg Y29weXJpZ2h0IHRoZSBhdXRob3JzIChqdXN0IGFzIGEgYmluYXJ5IG91dHB1dCBpcw0KICBub3Qg Y29weXJpZ2h0IHRoZSBvcmlnaW5hbCBzb3VyY2UgY29kZSkuIElmIHRoZSBvdXRwdXQgX2lzXyBj b3B5cmlnaHQNCiAgdGhlIGF1dGhvcnMsIHRoZW4gdGhleSBoYXZlIHJlYXNvbmFibGUgZ3JvdW5k cyB0byBjbGFpbSB0aGF0IHlvdQ0KICBzaG91bGQgYWxzbyByZXByb2R1Y2UgdGhlIGNvcHlyaWdo dCBub3RpY2UgYW5kIG90aGVyIGxpY2Vuc2UNCiAgcmVzdHJpY3Rpb25zLiBQZXJzb25hbGx5LCBJ IHByZWZlciB0byBjbGFpbSB0aGF0IHRoZXJlIGlzIG5vIGNvcHlyaWdodA0KICB0byB0aGUgb3Jp Z2luYWwgYXV0aG9ycyBpbiBvZG9jIG91dHB1dCwgYW5kIHNpZGVzdGVwIHRoaXMgaXNzdWUuDQoN Cg0KW29kb2NdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2RvYz4NCg0KW29kb2MgMS4wXSA8 aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29kb2M+DQoNCltvZGlnXSA8aHR0cHM6Ly9naXRodWIu Y29tL2RidWVuemxpL29kaWc+DQoNCltoZWFsdGggY2hlY2tdIDxodHRwczovL2dpdGh1Yi5jb20v b2N1cnJlbnQvb3BhbS1oZWFsdGgtY2hlY2s+DQoNCltvY3VycmVudF0gPGh0dHBzOi8vZ2l0aHVi LmNvbS9vY3VycmVudC9vdmVydmlldz4NCg0KW3Jld3JpdGVdIDxodHRwczovL2dpdGh1Yi5jb20v b2NhbWwvb2RvYy9wdWxsLzQzOT4NCg0KW291dHB1dCBJUl0gPGh0dHBzOi8vZ2l0aHViLmNvbS9v Y2FtbC9vZG9jL3B1bGwvNDIzPg0KDQpbT0NhbWwgMjAyMCB0YWxrXSA8aHR0cHM6Ly93d3cueW91 dHViZS5jb20vd2F0Y2g/dj13VnlaLUt2ZU4tdyZ0PTNzPg0KDQpbb2RvYyBjb250cmlidXRvcnNd IDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2RvYy9ncmFwaHMvY29udHJpYnV0b3JzPg0KDQoN CkZhYnJpY2UgTGUgRmVzc2FudCByZXBsaWVkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBU aGFua3MgQGF2c20gLCBhbGwgdGhlc2UgcHJvamVjdHMgd2VyZSBpbmRlZWQgaW1wb3J0YW50IG1p bGVzdG9uZXMNCiAgdG93YXJkcyB0aGUgY3JlYXRpb24gb2YgdGhpcyBzaXRlLiBIb3dldmVyLCBJ IHdvdWxkbid0IHdhbnQgdGhpcw0KICBoaXN0b3J5IHBlcnNwZWN0aXZlIHRvIGdpdmUgdGhlIHdy b25nIGZlZWxpbmcgdGhhdCBidWlsZGluZyB0aGlzIHNpdGUNCiAgd2FzIGVhc3ksIGl0IGlzIHRo ZSByZXN1bHQgb2YgYSB2ZXJ5IGdvb2QsIGxvbmcgYW5kIGhhcmQgd29yayBieSB0aGUNCiAgdGVh bSBhdCBPQ2FtbFBybyB0byBtYWtlIGl0IHdvcmsgZGVzcGl0ZSBhIHJvYWQgcGF2ZWQgd2l0aCBt YW55DQogIG9ic3RhY2xlcy4gSXQgYWxzbyBiZW5lZml0ZWQgZnJvbSBPQ2FtbFBybydzIGxvbmcg aGlzdG9yeSBvZg0KICBpbm5vdmF0aXZlIHByb2plY3RzIGZvciB0aGUgT0NhbWwgY29tbXVuaXR5 LCB0aGF0IGxlYWQgZm9yIGV4YW1wbGUgaW4NCiAgdGhlIHBhc3QgdG8gT3BhbSwgW1RyeS1PQ2Ft bF0sIE1lbXByb2YvW01lbXRob2wsXSBbT3BhbS1idWlsZGVyXSwNCiAgW0xlYXJuLU9DYW1sXSwg dGhlIFR5cGVyZXggdG9vbHMgKG9jcC1pbmRlbnQsIG9jcC1pbmRleCwgb2NwLWJ1aWxkLA0KICBl dGMuKSBhbmQgbW9yZSByZWNlbnRseSBbb3BhbS1iaW5dIGFuZCBbZHJvbV0uDQoNCiAgQXMgSSBz YWlkLCB0aGlzIGlzIGEgd29yay1pbi1wcm9ncmVzcywgYW5kIHRoZXJlIGFyZSBtYW55IGZlYXR1 cmVzDQogIHRoYXQgd2Ugd2lsbCBiZSBhZGRpbmcgaW4gdGhlIG5leHQgbW9udGhzIHRvIG1ha2Ug dGhpcyB3ZWJzaXRlIG11Y2gNCiAgZWFzaWVyIHRvIG5hdmlnYXRlLCBmb3IgdXNlcnMgdG8gcmFw aWRlbHkgcmVhY2ggdGhlIGluZm9ybWF0aW9uIHRoYXQNCiAgbWF0dGVycyBmb3IgdGhlbS4gV2Ug aG9wZSBpdCB3aWxsIGJlIGluc3BpcmF0aW9uYWwgZm9yIGFsbCB0aGUgb3RoZXINCiAgZGV2ZWxv cGVycyB3aG8gYXJlIHdvcmtpbmcgb24gc2ltaWxhciBwcm9qZWN0cywgYW5kIHdlIGFyZSBsb29r aW5nDQogIGZvcndhcmQgdG8gdXNpbmcgdGhlaXIgcHJvamVjdHMgc29vbiB0b28hDQoNCg0KW1Ry eS1PQ2FtbF0gPGh0dHBzOi8vdHJ5Lm9jYW1scHJvLmNvbS8+DQoNCltNZW10aG9sLF0NCjxodHRw czovL3d3dy5vY2FtbHByby5jb20vMjAyMC8xMi8wMS9tZW10aG9sLWV4cGxvcmluZy1wcm9ncmFt LXByb2ZpbGluZy8+DQoNCltPcGFtLWJ1aWxkZXJdIDxodHRwczovL2hhbC5pbnJpYS5mci9oYWwt MDEzNTIwMDg+DQoNCltMZWFybi1PQ2FtbF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1zZi9s ZWFybi1vY2FtbD4NCg0KW29wYW0tYmluXSA8aHR0cHM6Ly9naXRodWIuY29tL09DYW1sUHJvL29w YW0tYmluPg0KDQpbZHJvbV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9PQ2FtbFByby9kcm9tLz4NCg0K DQpEYW5pZWwgQsO8bnpsaSBzYWlkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIANCg0KICBJJ2QganVzdCBsaWtlIHRvIHN0cmVzcyB0aGF0IGBv ZGlnJyBkb2N1bWVudHMgT0NhbWwgcGFja2FnZSBpbnN0YWxscw0KICByZWdhcmRsZXNzIG9mIHRo ZSBwYWNrYWdlIG1hbmFnZXIgdXNlZCBhcyBsb25nIHRoZSBpbnN0YWxsIHN0cnVjdHVyZQ0KICBm b2xsb3dzIFt0aGVzZSBjb252ZW50aW9uc10gKHdoaWNoIGFyZSBhdXRvbWF0aWNhbGx5IGZvbGxv d2VkIGJ5IFtkdW5lDQogIGluc3RhbGxzXSkgLg0KDQogIEFsc28gZm9yIHBlb3BsZSB1c2luZyBt eSBwYWNrYWdlcywgSSdkIGp1c3QgbGlrZSB0byBtZW50aW9uIHRoZXkgbWF5DQogIG1pc3MgaW1w b3J0YW50IGRvY3VtZW50YXRpb24gYml0cyBvbiBbaHR0cHM6Ly9kb2NzLm9jYW1sLnByb10gdW50 aWwNCiAgW3RoYXQgaXNzdWVdIGlzIHJlc29sdmVkLg0KDQoNClt0aGVzZSBjb252ZW50aW9uc10N CjxodHRwczovL2VycmF0aXF1ZS5jaC9zb2Z0d2FyZS9vZGlnL2RvYy9wYWNrYWdpbmcuaHRtbD4N Cg0KW2R1bmUgaW5zdGFsbHNdDQo8aHR0cHM6Ly9kdW5lLnJlYWR0aGVkb2NzLmlvL2VuL3N0YWJs ZS9vcGFtLmh0bWwjb2RpZy1jb252ZW50aW9ucz4NCg0KW2h0dHBzOi8vZG9jcy5vY2FtbC5wcm9d IDxodHRwczovL2RvY3Mub2NhbWwucHJvLz4NCg0KW3RoYXQgaXNzdWVdIDxodHRwczovL2dpdGh1 Yi5jb20vT0NhbWxQcm8vZGlnb2RvYy9pc3N1ZXMvMzM+DQoNCg0KTXVjaCBsYXRlciBpbiB0aGUg dGhyZWFkLCBLaXJhbiBHb3BpbmF0aGFuIHNhaWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gA0KDQogIEl0J3Mgbm90IHF1aXRlIHRoZSBzYW1lIGFzIGhvb2dsZSwgYnV0IG1lcmxpbiBoYXMg YSBmdW5jdGlvbmFsaXR5IHRvDQogIHNlYXJjaCBmb3IgZnVuY3Rpb25zIGJ5IHR5cGUgc2lnbmF0 dXJlIC0gdGhlIGZlYXR1cmUgZG9lc24ndCBzZWVtIHRvDQogIGdldCBtdWNoIGF0dGVudGlvbiBh cHBhcmVudGx5IC0gcHJvYmFibHkgdGhlIGludGVyZmFjZSBpcyBhIGxpdHRsZQ0KICBsYWNraW5n LCBidXQgd2l0aCBzb21lIGV4dHJhIGVsaXNwIHR1bmluZywgaXQgY2FuIHdvcmsgcXVpdGUgc21v b3RobHk6DQoNCiAgPGh0dHBzOi8vYXdzMS5kaXNjb3Vyc2UtY2RuLmNvbS9zdGFuZGFyZDExL3Vw bG9hZHMvb2NhbWwvb3JpZ2luYWwvMlgvMy8zYzJkMWM2M2ZhYzdjYmQ3ZGQxYmI1YjlhNDA2NTg5 ZTAzMWNiNzk1LmdpZj4NCg0KDQpZYXdhciBBbWluIHRoZW4gYWRkZWQNCuKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFRo ZSBjb21tYW5kIGxpbmUgZm9yIHRoaXM6DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBvY2Ft bG1lcmxpbiBzaW5nbGUgc2VhcmNoLWJ5LXBvbGFyaXR5IC1wb3NpdGlvbiAwIC1xdWVyeSAnLWlu dCArc3RyaW5nJw0KICDilJTilIDilIDilIDilIANCg0KICAoVG8gc2VhcmNoIGZvciB2YWx1ZXMg b2YgdHlwZSBgaW50IC0+IHN0cmluZycuKQ0KDQoNCkRlY29tcHJlc3MgMS40LjANCuKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6IDxo dHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWRlY29tcHJlc3MtMS00LTAvNzcyNC8xPg0K DQoNCkNoYXJsZXMgRWRvdWFyZCBMZWNhdCBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgA0KDQpHcmVldGluZ3MgZXZlcnlvbmUsDQrilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBJIGFtIGhhcHB5 IHRvIGFubm91bmNlIHRoZSBuZXcgcmVsZWFzZSBvZiBbZGVjb21wcmVzcyAxLjQuMF0sDQogIGF2 YWlsYWJsZSBmb3IgaW5zdGFsbGF0aW9uIHZpYSBPUEFNLiBEZWNvbXByZXNzIGlzIGEgbGlicmFy eQ0KICBjb250YWluaW5nIGEgcHVyZSBPQ2FtbCBpbXBsZW1lbnRhdGlvbiBvZiBzZXZlcmFsIGNv bXByZXNzaW9uDQogIGFsZ29yaXRobXM6DQogIOKAoiBSRkMxOTUxDQogIOKAoiBabGliDQogIOKA oiBHemlwDQogIOKAoiBMWk8NCg0KICBJdCdzIGdvYWwgaXMgdG8gcHJvdmlkZSBzZXZlcmFsIGFs Z29yaXRobXMgZm9yIGJvdGggdGhlIGluZmxhdGlvbiBhbmQNCiAgdGhlIGRlZmxhdGlvbiBvZiBv YmplY3RzLCBpbiB0aGUgZm9ybSBvZiBhIHN0cmVhbSBBUEkgYWxsb3dpbmcgdG8gY2FsbA0KICB0 aGUgY2hvc2VuIGFsZ29yaXRobSBvbmUgYml0IGF0IGEgdGltZS4gU3VjaCBiZWhhdmlvciBhbGxv d3MgZm9yIGFuDQogIGVhc3kgdXNlIG9mIGRlY29tcHJlc3MgaW4gc2l0dWF0aW9ucyB3aGVyZSB3 ZSB3b3VsZCBub3QgYmUgYWJsZSB0bw0KICBoYXZlIHRoZSBpbnB1dCBpbiBvbmUgZ28sIG9yIHdo ZXJlIHdlIHdvdWxkIGxpa2UgdG8gb3V0cHV0IHRoZSByZXN1bHQNCiAgaW4gYSBub24gYmxvY2tp bmcgd2F5LiBUaGlzIG5ldyByZWxlYXNlIGNvbWVzIHdpdGggc2V2ZXJhbA0KICBpbXByb3ZlbWVu dHMgdG8gdGhlIGRvY3VtZW50YXRpb24gYW5kIGJ1ZyBmaXhlcywgYnV0IGV2ZW4gbW9yZSwgd2l0 aCBhDQogIHdob2xlIG5ldyBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIHJmYyAxOTUxIGFuZCB6bGli IGFsZ29yaXRobXMuDQoNCg0KW2RlY29tcHJlc3MgMS40LjBdDQo8aHR0cHM6Ly9naXRodWIuY29t L21pcmFnZS9kZWNvbXByZXNzL3JlbGVhc2VzL3RhZy92MS40LjA+DQoNCg0KTm9uLXN0cmVhbSBp bXBsZW1lbnRhdGlvbiBmb3IgcmZjIDE5NTEgYW5kIHpsaWINCuKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjA0KDQogIFVwIHRvIHRoaXMgZGF5LCBkZWNvbXByZXNzIHdhcyB1c2VkIGluIHNldmVy YWwgcHJvamVjdHMgbGlrZQ0KICBvY2FtbC1naXQuIEhvd2V2ZXIsIGFzIHRpbWUgcGFzc2VkIGJ5 LCBpdCBhcHBlYXJlZCB0aGF0IGluIHNvbWUgY2FzZXMsDQogIHRoZSBjdXJyZW50IGltcGxlbWVu dGF0aW9uIG9mIGRlY29tcHJlc3Mgd2FzIG5vdCB0aGUgb3B0aW1hbCBzb2x1dGlvbjoNCiAgQXMg dXNlZnVsIGFzIGEgc3RyZWFtIGltcGxlbWVudGF0aW9uIGlzLCBpdCByZXF1aXJlcyB0byBzYXZl IGEgbG90IG9mDQogIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0ZSBvZiB0aGUgY29tcHJlc3Np b24sIGluIG9yZGVyIHRvIHJlc3VtZSBpdA0KICBvbmNlIHdlIGhhdmUgZW5vdWdoIGlucHV0Lg0K DQogIFRoaXMgaXMgd2h5LCBpbiBzb21lIGNhc2VzIHdoZXJlIHdlIHdvdWxkIGJlIHN1cmUgdGhh dCB3ZSBoYXZlIG91cg0KICB3aG9sZSBpbnB1dCBpbiBvbmUgZ28sIHdlIG1pZ2h0IHdhbnQgdG8g YXZvaWQgYWxsIG9mIHRoZXNlIHNpZGUtY29zdHMsDQogIGFuZCBkaXJlY3RseSBnbyB0byB0aGUg cG9pbnQuDQoNCg0KU3RhdGUgb2YgdGhlIGFydDogbGliZGVmbGF0ZQ0K4pSE4pSE4pSE4pSE4pSE 4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE 4pSE4pSE4pSE4pSEDQoNCiAgVGhpcyBuZXcgcHJvYmxlbWF0aWMgaW4gbWluZCwgd2UgaGF2ZSBz dGFydGVkIHRoaW5raW5nIGFib3V0IHRoZQ0KICBleGlzdGluZyBpbXBsZW1lbnRhdGlvbnMgb2Yg dGhlc2UgYWxnb3JpdGhtcyB3aGljaCB3ZXJlIGFsc28gYnlwYXNzaW5nDQogIHRoZSBzdHJlYW0g YmVoYXZpb3IuIE9uZSBpbXBsZW1lbnRhdGlvbiB0aGF0IHByb3ZlZCB0byBiZSBhIHN1aXRhYmxl DQogIGV4YW1wbGUgZm9yIG91ciBwcm9ibGVtLCB3YXMgdGhlIGxpYnJhcnkgYGxpYmRlZmxhdGUn LCBhbg0KICBpbXBsZW1lbnRhdGlvbiBpbiBDLiBJdCdzIG1haW4gYWR2YW50YWdlcyBiZWluZzog YSBiZXR0ZXIgY29tcHJlc3Npb24NCiAgcmF0aW8gdGhhbiB6bGliIGFuZCB3aXRoIGZhc3RlciBy dW50aW1lLg0KDQogIEl0IHdhcyB1c2VkIGFzIHRoZSBzb2xpZCBiYXNlIGZvciB0aGUgT0NhbWwg aW1wbGVtZW50YXRpb24gcHJvdmlkZWQgYnkNCiAgdGhpcyBuZXcgcmVsZWFzZS4NCg0KDQpPQ2Ft bCB2ZXJzaW9uIG9mIGxpYmRlZmxhdGUsIHBlcmZvcm1hbmNlcyBhbmQgdXNlIGNhc2VzDQrilITi lITilITilITilITilITilITilITilITilITilITilITilITilITilITilITilITilITilITilITi lITilITilITilITilITilITilITilITilITilITilITilITilITilITilITilITilITilITilITi lITilITilITilITilITilITilITilITilITilITilITilITilITilITilITilIQNCg0KICBJbmhl cml0aW5nIHRoZSBsb2dpYyBvZiBsaWJkZWZsYXRlLCB0aGUgbmV3IGltcGxlbWVudGF0aW9uIG5v dyBoYXMgYQ0KICBiZXR0ZXIgY29tcHJlc3Npb24gcmF0aW8sIHdoaWxlIGJlaW5nIHNsaWdodGx5 IGZhc3RlciBhdCBpdC4gT24gdGhlDQogIG90aGVyIHNpZGUsIHRoZSBkZWNvbXByZXNzaW9uIGlz IHdheSBmYXN0ZXIsIHdpdGggYDMzJSBvZiBzcGVlZA0KICBpbmNyZWFzZSBpbiBtb3N0IHRlc3Rl ZCBjYXNlczogT24gdGhlIH5ib29rMicgKGZyb20gdGhlIENhbGdhcnkNCiAgY29ycHVzKSBmaWxl Og0KICDigKIgYGRlY29tcHJlc3MnIChzdHJlYW0pOiAxNSBNYi9zIChkZWZsYXRpb24pLCA3NiBN Yi9zIChpbmZsYXRpb24pLA0KICAgIHJhdGlvOiA0Mi40NiAlDQogIOKAoiBgZGVjb21wcmVzcycg KG5vbi1zdHJlYW0pOiAxNyBNYi9zIChkZWZsYXRpb24pLCAxMDUgTWIvcw0KICAgIChpbmZsYXRp b24pLCByYXRpbzogMzQuNjYgJQ0KDQogIE5vdyB0aGF0IHRoaXMgaXMgaW4gcGxhY2UsIHRoZSB1 c2VycyBvZiBkZWNvbXByZXNzIHdpbGwgYmUgYWJsZSB0bw0KICBjaG9vc2UgYmV0d2VlbiB0aGUg dHdvIHZlcnNpb25zLCBhY2NvcmRpbmcgdG8gdGhlaXIgbmVlZHMuIEluIHRoZSBjYXNlDQogIG9m IG9jYW1sLWdpdCwgdGhlIHZhc3QgbWFqb3JpdHkgb2YgdGhlIGdpdCBvYmplY3RzIGFyZSBzbWFs bCBhbmQgd2lsbA0KICBiZSBjb21wcmVzc2VkIGluIG9uZSBnby4gVGhpcyBpcyB3aHkgd2UgdXBk YXRlZCB3aXRoIHRoZSBuZXcNCiAgaW1wbGVtZW50YXRpb24gd2hlbiBwb3NzaWJsZS4NCg0KDQpX cml0aW5nIG9wdGltaXplZCBjb2RlIGFuZCBwcm9maWxpbmcgaXQNCuKUhOKUhOKUhOKUhOKUhOKU hOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKU hOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhA0KDQogIE9uZSBvZiB0 aGUgYmlnZ2VzdCBjb25jZXJucyBvZiB0aGlzIHJlbGVhc2Ugd2FzIHRvIGJlIGFibGUgdG8gcHJv ZHVjZQ0KICBvcHRpbWl6ZWQgY29kZS4gVGhlIGJhc2UgY29kZSBiZWluZyBjb2RlZCBpbiBDLCBh IGxvdCBvZiBzdWItb3B0aW1hbA0KICBiZWhhdmlvciB3aGVyZSBwb3J0ZWQgaW4gdGhlIE9DYW1s IHZlcnNpb246IGBmb3InIGFuZCBgd2hpbGUnIGxvb3BzLA0KICByZWZlcmVuY2VzIGV2ZXJ5d2hl cmUsIG1peGVzIG9mIGBzdHJ1Y3QnIGFuZCBgdW5pb24uJywgaXQgbmVlZGVkIGEgbG90DQogIG9m IGNsZWFuIHVwLg0KDQogIFRoaXMgaXMgd2h5IG9uY2UgdGhlIG1haW4gaXRlcmF0aW9uIHdhcyBk b25lLCB3ZSBoYXZlIHNwZW50IHNldmVyYWwNCiAgd2Vla3MgcHJvZmlsaW5nIHRoZSBjb2RlIGJh c2UsIHVzaW5nIHRoZSBPQ2FtbCBsaWJyYXJ5IGBsYW5kbWFya3MnLA0KICBgZmxhbWVncmFwaCcg b3Igc2ltcGx5IHRoZSBsaW51eCBiaW5hcnkgYHBlcmYnLiBUaGlzIHdvcmssIHNvbWV0aW1lcw0K ICB0ZWRpb3VzLCBwcm92ZWQgdG8gYmUgaGVscGZ1bCBhbmQgaGVhbHRoeSBmb3IgYm90aCB0aGUg aGFybW9uaXphdGlvbg0KICBvZiB0aGUgY29kZSBhbmQgaXQncyBwZXJmb3JtYW5jZXMuDQoNCg0K RGVjb21wcmVzcyAmIE1pcmFnZU9TDQrilITilITilITilITilITilITilITilITilITilITilITi lITilITilITilITilITilITilITilITilITilIQNCg0KICBDb21wcmVzc2lvbiBhbGdvcml0aG1z IGFyZSBhIHJlYWxseSBpbXBvcnRhbnQgcGllY2UgaW4gbWFueSBwcm9qZWN0cywNCiAgYW5kIG9w ZXJhdGluZyBzeXN0ZW1zIGRvIG5vdCBhdm9pZCB0aGlzLiAgYGRlY29tcHJlc3MnIHdhcyBjb2Rl ZCBmcm9tDQogIHRoZSBzdGFydCB3aXRoIHRoZSBpZGVhIG9mIGJlaW5nIHVzZWQgaW4gdGhlIG11 Y2ggbGFyZ2VyIHByb2plY3QNCiAgTWlyYWdlT1MuDQoNCiAgVGhpcyByZWxlYXNlIGlzIGFub3Ro ZXIgb3Bwb3J0dW5pdHkgdG8gYnJvYWRlbiBNaXJhZ2VPU+KAmXMgcmVhY2gsIGJ5DQogIHByb3Zp ZGluZyBvbmUgbW9yZSBhbGdvcml0aG0gdG8gaXTigJlzIHN0YWNrLCBhbGxvd2luZyB1cyB0byBz cGVjaWFsaXNlDQogIGV2ZW4gbW9yZSB0aGUgdW5pa2VybmVscyB0aGF0IHdvdWxkIGhhdmUgYSBu ZWVkIGZvcg0KICBpbmZsYXRpb24vZGVmbGF0aW9uIGFsZ29yaXRobXMuIFRoaXMgbW9yZSByZXN0 cmljdGl2ZSBpbXBsZW1lbnRhdGlvbiwNCiAgYXMgd2UgbmVlZCB0byBoYXZlIHRoZSB3aG9sZSBp bnB1dCBpbiBvbmUgZ28sIHdpbGwgYWxsb3cgdXMgdG8gdGFrZQ0KICBhZHZhbnRhZ2Ugb2YgdGhl IHNpdHVhdGlvbiBhbmQgZ2l2ZSBtb3JlIGZsZXhpYmlsaXR5IGZvciB0aGUgdXNlci4NCg0KICBU aGUgcG9zaXRpdmUgYXNwZWN0cyBvZiB0aGlzIHJlbGVhc2Ugd2lsbCBtb3N0IGxpa2VseSBzaG93 IHVwIHNvb24NCiAgZW5vdWdoLCBhcyB3ZSBtYWtlIHVzZSBvZiBkZWNvbXByZXNzIHRvIGl0cyBm dWxsIHBvdGVudGlhbA0KDQoNCmVsbGlwdGljIGN1cnZlcyAtIG1haW50YWluYWJsZSBhbmQgdmVy aWZpZWQgKGZ1bGwgc3RhY2ssIGZyb20gcHJpbWl0aXZlcyB0byBUTFMpDQrilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAN Cg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1lbGxpcHRp Yy1jdXJ2ZXMtbWFpbnRhaW5hYmxlLWFuZC12ZXJpZmllZC1mdWxsLXN0YWNrLWZyb20tcHJpbWl0 aXZlcy10by10bHMvNzcyOS8xPg0KDQoNCkhhbm5lcyBNZWhuZXJ0IGFubm91bmNlZA0K4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSADQoNCiAgb3ZlciB0aGUgbGFzdCBtb250aCBJIHdvcmtlZCBvbiB1cGdyYWRpbmcg dGhlIGNyeXB0b2dyYXBoeSBzdGFjayBmb3INCiAgT0NhbWwgYW5kIE1pcmFnZU9TLiBJIGp1c3Qg cHVibGlzaGVkIGEgW2Jsb2cgcG9zdF0uIEVuaGFuY21lbnRzIG9mDQogIFtPQ2FtbC1UTFNdIChb dXNlbml4IHNlY3VyaXR5IHBhcGVyIGZyb20gMjAxNV0pIGFuZCBbWC41MDldIGFyZSBpbg0KICBw bGFjZS4NCg0KICBUaGUgbWFpbiBhY2hpZXZlbWVudCBhZnRlciBUTFMgMS4zIHN1cHBvcnQgKHNp bmNlIE1heSAyMDIwLCAwLjEyLjApIGlzDQogIHRoYXQgZWxsaXB0aWMgY3VydmUgY2VydGlmaWNh dGVzIGFyZSBub3cgc3VwcG9ydGVkLiBFbGxpcHRpYyBjdXJ2ZQ0KICBjcnlwdG9ncmFwaHkgdXNl cyBbZmlhdF0uIFRoZSBYNTA5IGltcGxlbWVudGF0aW9uIG5vdyBzdXBwb3J0cyBQS0NTIDEyDQog ICh1c2VkIGJ5IGJyb3dzZXJzIGFuZCBvdGhlciBzb2Z0d2FyZSAoZS5nLiBPcGVuVlBOKSB0byBi dW5kbGUNCiAgY2VydGlmaWNhdGVzIGFuZCBwcml2YXRlIGtleXMpLg0KDQogIEdldCBtaXJhZ2Ut Y3J5cHRvLWVjLCB4NTA5IDAuMTMuMCBhbmQgdGxzIDAuMTMuMSAoYWxsIGF2YWlsYWJsZSBpbiB0 aGUNCiAgb3BhbS1yZXBvc2l0b3J5KS4gRGlzY3Vzc2lvbiBhbmQgZmVlZGJhY2sgYXBwcmVjaWF0 ZWQuDQoNCg0KW2Jsb2cgcG9zdF0gPGh0dHBzOi8vaGFubmVzLnJvYnVyLmNvb3AvUG9zdHMvRUM+ DQoNCltPQ2FtbC1UTFNdIDxodHRwczovL2dpdGh1Yi5jb20vbWlybGVmdC9vY2FtbC10bHM+DQoN Clt1c2VuaXggc2VjdXJpdHkgcGFwZXIgZnJvbSAyMDE1XSA8aHR0cHM6Ly91c2VuaXgxNS5ucXNi LmlvPg0KDQpbWC41MDldIDxodHRwczovL2dpdGh1Yi5jb20vbWlybGVmdC9vY2FtbC14NTA5Pg0K DQpbZmlhdF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9taXQtcGx2L2ZpYXQtY3J5cHRvPg0KDQoNCkZp cnN0IHJlbGVhc2Ugb2YgRG9jdGV1ciwgYW4gb3BpbmlhdGVkIHJlYWQtb25seSBmaWxlLXN5c3Rl bSBmb3IgTWlyYWdlT1MNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5u LWZpcnN0LXJlbGVhc2Utb2YtZG9jdGV1ci1hbi1vcGluaWF0ZWQtcmVhZC1vbmx5LWZpbGUtc3lz dGVtLWZvci1taXJhZ2Vvcy83NzQzLzE+DQoNCg0KQ2FsYXNjaWJldHRhIFJvbWFpbiBhbm5vdW5j ZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEknbSBnbGFkIHRvIGFubm91 bmNlIHRoZSBmaXJzdCByZWxlYXNlIG9mIFtgZG9jdGV1ciddLCBhIHNpbXBsZSB0b29sDQogIHRv IG1ha2UgYW5kIHVzZSAoaW4gcmVhZC1vbmx5KSBhICJmaWxlLXN5c3RlbSIgZm9yIFtNaXJhZ2VP U10uIEFzIHlvdQ0KICBrbm93LCB3aXRoIE1pcmFnZU9TLCB3ZSBkb24ndCBoYXZlIF9zb2NrZXRz XywgX2tlcm5lbCBzcGFjZV8gb3IgZXZlbg0KICBfZmlsZS1kZXNjcmlwdG9yXy4gSXQncyBub3Qg cG9zc2libGUgdG8gbWFuaXB1bGF0ZSBmaWxlcw0KICBfc3RhbmRhbG9uZWx5XyBhbmQgbWFueSBf cHJpbWl0aXZlc18gY29tbW9ubHkgYXZhaWxhYmxlIHdpdGggdGhlDQogIGB1bml4JyBtb2R1bGUg ZG9uJ3QgZXhpc3RzIGluIG91ciBzcGFjZS4NCg0KICBUaGVyZWZvcmUsIGl0IGlzIGRpZmZpY3Vs dCB0byBpbWFnaW5lIG1ha2luZyBhIHdlYnNpdGUgdGhhdCBkaXNwbGF5cw0KICBsb2NhbCBmaWxl cyBvciBhIGRhdGFiYXNlIHN5c3RlbS4gQnV0IGluIG91ciBzcGlyaXQgb2Ygc2VwYXJhdGlvbiBv Zg0KICBzZXJ2aWNlcywgaXQgYmVjb21lcyBwb3NzaWJsZSBmb3IgeW91ciB1bmlrZXJuZWwgdG8g Y29tbXVuaWNhdGUgb3Zlcg0KICB0aGUgbmV0d29yayB0byBhICJmaWxlIHN5c3RlbSIgb3IgYSBk YXRhYmFzZS4NCg0KICBGb3IgcXVpdGUgc29tZSB0aW1lIHdlIGhhdmUgYmVlbiBleHBlcmltZW50 aW5nIHdpdGggYSBmaWxlIHN5c3RlbQ0KICBleHRlcm5hbCB0byBvdXIgdW5pa2VybmVsIGNhbGxl ZCBHaXQuIFRoaXMgaXMgdGhlIGNhc2Ugb2YgW2BwYXN0ZXVyJ10NCiAgd2hpY2ggc2F2ZXMgdGhl IHBhc3RlcyBpbiBhIEdpdCByZXBvc2l0b3J5LiBJdCBpcyBhbHNvIHRoZSBjYXNlIG9mDQogIFtg dW5pcGknXSBvciBbQ2Fub3B5XSB3aGljaCBkaXNwbGF5IHRoZSBjb250ZW50IG9mIGEgR2l0IHJl cG9zaXRvcnkNCiAgYW5kIGNhbiByZXN5bmNocm9uaXplIHdpdGggaXQgdXNpbmcgYSBob29rLiBP ciB0aGUgY2FzZSBvZiBbb3VyDQogIHByaW1hcnkgRE5TIHNlcnZlcl0gd2hvc2Ugem9uZSBmaWxl IGNvbWVzIGZyb20gYSBHaXQgcmVwb3NpdG9yeSAtIHdlDQogIGNhbiB0aGVuIHRyYWNlIGFsbCB0 aGUgY2hhbmdlcyBvbiB0aGlzIGZpbGUuDQoNCiAgSG93ZXZlciwgd2UgaGF2ZSBzZXZlcmFsIGxp bWl0YXRpb25zOg0KICAxKSBpdCByZXF1aXJlcyB0aGUgR2l0IHJlcG9zaXRvcnkgdG8gbG9hZCBp bnRvIG1lbW9yeSBpbiB5b3VyDQogICAgIHVuaWtlcm5lbA0KICAyKSBpdCByZXF1aXJlcyBhIGNv bW11bmljYXRpb24gKGV4dGVybmFsIHdpdGggR2l0SHViIG9yIGludGVybmFsIGluIGENCiAgICAg cHJpdmF0ZSBuZXR3b3JrKQ0KDQogIFRoZSBwZXJzaXN0ZW50IGFzcGVjdCBpcyB2ZXJ5IGltcG9y dGFudC4gV2Ugc2hvdWxkIGFsd2F5cyBiZSBhYmxlIHRvDQogIGxhdW5jaCBhIHVuaWtlcm5lbCBh bmQgbm90IGxvc2UgdGhlIGRhdGEgaWYgb3VyIHN5c3RlbSBzaHV0cyBkb3duLg0KDQogIFRoZSBt dXRhYmxlIGFzcGVjdCAobW9kaWZ5IGEgZmlsZSkgaXMgdXNlZnVsIGluIHNvbWUgY2FzZXMgYnV0 IG5vdCBpbg0KICBvdGhlcnMuIEFzIGZvciBgdW5pcGknIGZvciBleGFtcGxlIChhIHNpbXBsZSBz dGF0aWMgd2ViIHNpdGUpLCB0aGUNCiAgZGlmZmVyZW5jZSBiZXR3ZWVuIHJlc3luY2hyb25pemlu ZyB3aXRoIGEgaG9vayBvciByZXN0YXJ0aW5nIHRoZQ0KICB1bmlrZXJuZWwgd2l0aCBhIG5ldyB2 ZXJzaW9uIG9mIHlvdXIgZmlsZXN5c3RlbSBpcyBtaW5vci4NCg0KDQpbYGRvY3RldXInXSA8aHR0 cHM6Ly9naXRodWIuY29tL2Rpbm9zYXVyZS9kb2N0ZXVyPg0KDQpbTWlyYWdlT1NdIDxodHRwczov L21pcmFnZS5pby8+DQoNCltgcGFzdGV1ciddIDxodHRwczovL2dpdGh1Yi5jb20vZGlub3NhdXJl L3Bhc3RldXI+DQoNCltgdW5pcGknXSA8aHR0cHM6Ly9naXRodWIuY29tL3JvYnVyaW8vdW5pcGk+ DQoNCltDYW5vcHldIDxodHRwczovL2dpdGh1Yi5jb20vRW5naWwvQ2Fub3B5Pg0KDQpbb3VyIHBy aW1hcnkgRE5TIHNlcnZlcl0gPGh0dHBzOi8vZ2l0aHViLmNvbS9yb2J1cmlvL2Rucy1wcmltYXJ5 LWdpdD4NCg0KRG9jdGV1ciBhcyBhIHNlY29uZCBzb2x1dGlvbg0K4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWMDQoNCiAgVGhpcyBpcyB3aGVyZSBEb2N0b3IgY29tZXMgaW4uIEl0IHNvbHZlcyBi b3RoIG9mIG91ciBwcm9ibGVtcyBieQ0KICBvZmZlcmluZyB0aGUgZ2VuZXJhdGlvbiBvZiBhIGZp bGUgc3lzdGVtIGZyb20gc2NyYXRjaDoNCiAg4oCiIGEgR2l0IHJlcG9zaXRvcnkgKGxvY2FsIG9y IGF2YWlsYWJsZSBvbiBhIHNlcnZpY2UpDQogIOKAoiBhIHNwZWNpZmljIGZvbGRlcg0KDQogIERv Y3RvciBpcyBhYmxlIHRvIGNyZWF0ZSBhIGNvbXBsZXRlIHJlcHJlc2VudGF0aW9uIG9mIGEgZm9s ZGVyIGFuZCB0bw0KICBjb21wcmVzcyBpdCBhdCBzdWNoIGEgcmF0aW8gdGhhdCBhIGdlbmVyYXRp b24gb2YgdGhlIGRvY3VtZW50YXRpb24gb2YNCiAgc2V2ZXJhbCBPUEFNIHBhY2thZ2VzIHdpdGgg YWxsIHRoZWlyIHZlcnNpb25zIG1ha2luZyAxNCBHYiBpcyByZWR1Y2VkDQogIHRvIGFuIGltYWdl IG9mIG9ubHkgMjgwIE1iIQ0KDQogIFN1Y2ggYSBoaWdoIGNvbXByZXNzaW9uIHJhdGlvIGlzIGlu IHBhcnRpY3VsYXIgZHVlIHRvIGEgZG91YmxlIGxldmVsDQogIG9mIGNvbXByZXNzaW9uIGJ5IFtg ZGVjb21wcmVzcyddIGFuZCBbYGR1ZmYnXS4gRm9yIG1vcmUgZGV0YWlscywNCiAgRG9jdGV1ciBq dXN0IGdlbmVyYXRlcyBhIHNsaWdodGx5IG1vZGlmaWVkIFBBQ0sgZmlsZSB3aXRoIFtjYXJ0b25d Lg0KDQogIFRoZW4sIERvY3RldXIgcHJvcG9zZXMgYSBzaW1wbGUgbGlicmFyeSB3aGljaCBtYWtl cyBhdmFpbGFibGUgMiB3YXlzDQogIHRvIG1hbmlwdWxhdGUgdGhpcyBpbWFnZSBmb3IgeW91ciB1 bmlrZXJuZWw6DQogIDEpIGEgd2F5IHRoYXQgaXMgZmFzdCBidXQgd2l0aCBhIGNvbnNlcXVlbnQg Ym9vdCB0aW1lDQogIDIpIGEgc2xvd2VyIHdheSBidXQgd2l0aCBubyBjb3N0IHRvIHRoZSBib290 IHRpbWUNCg0KICBUaGUgZmlyc3Qgd2F5IHdpbGwgc2ltcGx5ICJhbmFseXplIiB0aGUgaW1hZ2Ug dG8gcmUtZXh0cmFjdCB0aGUgbGF5b3V0DQogIG9mIHlvdXIgZmlsZSBzeXN0ZW0uIFRoZW4gaXQg dXNlcyB0aGUgW0FSVCBkYXRhLXN0cnVjdHVyZV0gdG8gc2F2ZQ0KICB0aGlzIGxheW91dC4gU28s IHdoZW5ldmVyIHlvdSB3YW50IGEgc3BlY2lmaWMgZmlsZSBhbmQgYWNjb3JkaW5nIHRvDQogIFtB UlQgYmVuY2htYXJrc10sIHlvdSBoYXZlIGFjY2VzcyB0byB0aGUgY29udGVudCB2ZXJ5IHF1aWNr bHkuDQoNCiAgVGhlIHByb2JsZW0gcmVtYWlucyB0aGUgYW5hbHlzaXMgd2hpY2ggdGFrZXMgcGxh Y2UgYXQgYm9vdCB0aW1lIGFuZA0KICB3aGljaCBjYW4gdGFrZSBhIHZlcnkgbG9uZyB0aW1lIChp dCBkZXBlbmRzIGVzc2VudGlhbGx5IG9uIHRoZSBudW1iZXINCiAgb2YgZmlsZXMgeW91IGhhdmUp LiBUaGVyZSBjYW4gYWxzbyBiZSBhbiBpbXBhY3Qgb24gbWVtb3J5IHVzYWdlIGFzIHRoZQ0KICBB UlQgZGF0YSBzdHJ1Y3R1cmUgaXMgaW4gbWVtb3J5IC0gdGhlIG1vcmUgZmlsZXMgdGhlcmUgYXJl LCB0aGUgYmlnZ2VyDQogIHRoZSBzdHJ1Y3R1cmUgaXMuDQoNCiAgVGhlIHNlY29uZCBtZXRob2Qg aXMgbW9yZSAic2lsbHkiLiBFYWNoIHRpbWUgeW91IHJlcXVlc3QgYSBmaWxlLCB3ZQ0KICB3aWxs IGhhdmUgdG8gcmVidWlsZCB0aGUgZW50aXJlIHBhdGggYW5kIHRoZXJlZm9yZSBkZXNlcmlhbGl6 ZSBzZXZlcmFsDQogIG9iamVjdHMgKGxpa2UgZm9sZGVycykuIFRoZSBhZHZhbnRhZ2UgaXMgdGhh dCB3ZSBkb24ndCBhbmFseXplIHRoZQ0KICBpbWFnZSBhbmQgd2UgZG9uJ3QgdHJ5IHRvIG1haW50 YWluIGEgbGF5b3V0IG9mIHlvdXIgZmlsZSBzeXN0ZW0uDQoNCg0KW2BkZWNvbXByZXNzJ10gPGh0 dHBzOi8vZ2l0aHViLmNvbS9taXJhZ2UvZGVjb21wcmVzcz4NCg0KW2BkdWZmJ10gPGh0dHBzOi8v Z2l0aHViLmNvbS9taXJhZ2UvZHVmZj4NCg0KW2NhcnRvbl0gPGh0dHBzOi8vZ2l0aHViLmNvbS9t aXJhZ2Uvb2NhbWwtZ2l0L3RyZWUvbWFzdGVyL3NyYy9jYXJ0b24+DQoNCltBUlQgZGF0YS1zdHJ1 Y3R1cmVdIDxodHRwczovL2dpdGh1Yi5jb20vZGlub3NhdXJlL2FydD4NCg0KW0FSVCBiZW5jaG1h cmtzXSA8aHR0cHM6Ly9kaW5vc2F1cmUuZ2l0aHViLmlvL2FydC9iZW5jaC9maW5kLmh0bWw+DQoN Cg0KRXhhbXBsZQ0K4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgRG9jdGV1ciBpcyBtZWFudCB0 byBiZSBzaW1wbGUuIFRoZSBnZW5lcmF0aW9uIG9mIHRoZSBpbWFnZSBpcyBkb25lDQogIHZlcnkg c2ltcGx5IGJ5IHRoZSBjb21tYW5kIGBtYWtlJzoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiAk IGRvY3RldXIubWFrZSAtYiByZWZzL2hlYWRzL21haW4gaHR0cHM6Ly9naXRodWIuY29tL2Rpbm9z YXVyZS9kb2N0ZXVyIGRpc2suaW1nDQogIOKUgiAkIGRvY3RldXIubWFrZSAtYiByZWZzL2hlYWRz L21haW4gZ2l0QGdpdGh1Yi5jb206ZGlub3NhdXJlL2RvY3RldXIgZGlzay5pbWcNCiAg4pSCICQg ZG9jdGV1ci5tYWtlIC1iIHJlZnMvaGVhZHMvbWFpbiBnaXQ6Ly9naXRodWIuY29tL2Rpbm9zYXVy ZS9kb2N0ZXVyIGRpc2suaW1nDQogIOKUgiAkIGRvY3RldXIubWFrZSAtYiByZWZzL2hlYWRzL21h aW4gZmlsZTovLyQocHdkKS9kZXYvZG9jdGV1ciBkaXNrLmltZw0KICDilJTilIDilIDilIDilIAN Cg0KICBUaGVuLCBEb2N0ZXVyIHByb3Bvc2VzIDIgc3VwcG9ydHM6IFVuaXggJiBbU29sbzVdLiBG b3IgVW5peCwgeW91IGp1c3QNCiAgaGF2ZSB0byBuYW1lIGV4cGxpY2l0bHkgdGhlIGltYWdlIGZp bGUgdG8gdXNlLiBGb3IgdGhlIGNhc2Ugb2YgU29sbzUNCiAgKGFuZCB0aHVzIG9mIHZpcnR1YWxp emF0aW9uKS4gWW91IGp1c3QgaGF2ZSB0byBmaW5kIGEgbmFtZSBmb3IgYQ0KICAiYmxvY2sgZGV2 aWNlIiBhbmQgdG8gcmV1c2UgdGhpcyBuYW1lIHdpdGggdGhlIFNvbG81ICJ0ZW5kZXIiDQogIHNw ZWNpZnlpbmcgd2hlcmUgdGhlIGltYWdlIGlzLg0KICDilIzilIDilIDilIDilIANCiAg4pSCICQg Y2QgdW5pa2VybmVsDQogIOKUgiAkIG1pcmFnZSBjb25maWd1cmUgLXQgdW5peCAtLWRpc2sgZGlz ay5pbWcNCiAg4pSCICQgbWFrZSBkZXBlbmRzDQogIOKUgiAkIG1pcmFnZSBidWlsZA0KICDilIIg JCAuL3NpbXBsZSAtLWZpbGVuYW1lIFJFQURNRS5tZA0KICDilJTilIDilIDilIDilIANCg0KICDi lIzilIDilIDilIDilIANCiAg4pSCICQgY2QgdW5pa2VybmVsDQogIOKUgiAkIG1pcmFnZSBjb25m aWd1cmUgLXQgaHZ0IC0tZGlzayBkb2N0ZXVyDQogIOKUgiAkIG1ha2UgZGVwZW5kcw0KICDilIIg JCBtaXJhZ2UgYnVpbGQNCiAg4pSCICQgc29sbzUtaHZ0IC0tYmxvY2s6ZG9jdGV1cj1kaXNrLmlt ZyAtLSBzaW1wbGUuaHZ0IC0tZmlsZW5hbWUgUkVBRE1FLm1kDQogIOKUlOKUgOKUgOKUgOKUgA0K DQogIEZpbmFsbHksIERvY3RldXIgcHJvcG9zZXMgYW5vdGhlciB0b29sIHRoYXQgY2hlY2tzIChh bmQgYW5hbHl6ZXMpIGFuDQogIGltYWdlIHRvIGdpdmUgeW91IHRoZSB2ZXJzaW9uIG9mIHRoZSBj b21taXQgdXNlZCAoaWYgdGhlIGltYWdlIGNvbWVzDQogIGZyb20gYSBHaXQgcmVwb3NpdG9yeSkg b3IgdGhlIGhhc2ggb2YgeW91ciBmaWxlIHN5c3RlbSBwcm9kdWNlZCBieSB0aGUNCiAgY2FsY3Vs YXRpb24gb2YgYSBbTWVya2xlIHRyZWVdLg0KICDilIzilIDilIDilIDilIANCiAg4pSCICQgZG9j dGV1ci52ZXJpZnkgZGlzay5pbWcNCiAg4pSCIGNvbW1pdAk6IGFkOGM0MTg2MzVjYTY2ODMxNzdj N2ZmM2I1ODNlMWVhNWFmZWE3OGYNCiAg4pSCIGF1dGhvcgk6ICJDYWxhc2NpYmV0dGEgUm9tYWlu IiA8cm9tYWluLmNhbGFzY2liZXR0YUBnbWFpbC5jb20+DQogIOKUgiByb290CTogYmVhMTBiNjg3 NGY1MWUzZjZmZWIxZjliY2YzOTM5OTMzYjJjNDU0MA0KICDilIIgDQogIOKUgiBNZXJnZSBwdWxs IHJlcXVlc3QgIzExIGZyb20gZGlub3NhdXJlL2ZpeC10cmVlLWV4cGFuZGluZw0KICDilIIgDQog IOKUgiBGaXggaG93IHdlIGV4cGFuZCBvdXIgZmlsZS1zeXN0ZW0NCiAg4pSU4pSA4pSA4pSA4pSA DQoNCg0KW1NvbG81XSA8aHR0cHM6Ly9naXRodWIuY29tL1NvbG81L3NvbG81Pg0KDQpbTWVya2xl IHRyZWVdIDxodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9NZXJrbGVfdHJlZT4NCg0KDQpD b25jbHVzaW9uDQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBNYW55IHRpbWVz IHBlb3BsZSBhc2sgbWUgZm9yIGEgcHVycG9zZSBpbiBNaXJhZ2VPUyBzdWNoIGFzIGEgd2Vic2l0 ZQ0KICBvciBhIHBhcnRpY3VsYXIgc2VydmljZS4gSSB0aGluayB0aGF0IERvY3RldXIgc2hvd3Mg b25lIGVzc2VudGlhbA0KICB0aGluZyBhYm91dCBNaXJhZ2VPUywgaXQgaXMgYSB0b29sIGFuZCBh biBlY29zeXN0ZW0uIEJ1dCBpdCdzIG5vdCBhbg0KICBlbmRwb2ludCB0aGF0IGlzIGNvbmNyZXRp emVkIGluIGEgc3BlY2lmaWMgYXBwbGljYXRpb24uDQoNCiAgRG9jdGV1ciBpcyBub3QgVEhFIHNv bHV0aW9uIHRvIG91ciBwcm9ibGVtcyBhbmQgYW5zd2VycyBhIHNwZWNpZmljIHVzZQ0KICBjYXNl LiBXaGF0IGlzIGltcG9ydGFudCB0byBub3RlIGlzIG5vdCB3aGF0IERvY3RldXIgZG9lcyBidXQg dGhlDQogIHBvc3NpYmlsaXR5IGZvciBvdXIgZWNvc3lzdGVtIGFuZCBvdXIgdG9vbHMgdG8gYWxs b3cgdGhlIGRldmVsb3BtZW50DQogIG9mIERvY3RldXIuIEFzIGl0IGFsbG93cyB0aGUgZGV2ZWxv cG1lbnQgb2YgYSB0cmlsbGlvbiBhcHBsaWNhdGlvbnMhDQoNCiAgQXMgc3VjaCwgSSBzYXkgdG8g dGhvc2UgcGVvcGxlIHRvICJwbGF5IiB3aXRoIE1pcmFnZU9TIGlmIHRoZXkgd2FudCB0bw0KICBs ZWFybiBtb3JlLiBPdXIgZ29hbCBpcyBub3QgdG8gc2hvdyB5b3UgYXBwbGljYXRpb25zIHRoYXQg eW91IGNvdWxkDQogIHRoZW4gZGVwbG95IGVhc2lseSAoZXZlbiBpZiB3ZSBhcmUgd29ya2luZyBv biB0aGlzIGFzcGVjdCB0b28pIGJ1dCB0bw0KICBnaXZlIHlvdSB0aGUgcG9zc2liaWxpdHkgdG8g aW1hZ2luZSB5b3VyIE9TIChpbmRlcGVuZGVudGx5IGZyb20gb3VyDQogIHZpc2lvbikhDQoNCiAg QW5kIGlmIHlvdSB0cnksIHdlJ2xsIGJlIGhhcHB5IHRvIGhlbHAgeW91IQ0KDQoNCk9jYW1sLXNv bGlkaXR5LCBhIG5ldyBPQ2FtbCBsaWJyYXJ5IGZvciBTb2xpZGl0eQ0K4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5v cmcvdC9vY2FtbC1zb2xpZGl0eS1hLW5ldy1vY2FtbC1saWJyYXJ5LWZvci1zb2xpZGl0eS83NzQ2 LzE+DQoNCg0KT0NhbWxQcm8gYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBXZSBhcmUgcGxlYXNlZCB0byBhbm5vdW5j ZSBvdXIgbmV3IE9DYW1sIGxpYnJhcnksIG9jYW1sLXNvbGlkaXR5ICENCiAgW09jYW1sLXNvbGlk aXR5XSBpcyBhIHByb2dyYW0gbWFuaXB1bGF0aW9uIGxpYnJhcnkgdGhhdCBwcm92aWRlcyBhDQog IFNvbGlkaXR5IHBhcnNlciBhbmQgdHlwZWNoZWNrZXIuDQoNCiAgT3VyIGxpYnJhcnkgaXMgbWFk ZSBmb3IgZGV2ZWxvcGVycyBvbiBTb2xpZGl0eSBjb2RlIGFuYWx5c2lzLCBpdA0KICBidWlsZHMg YSB0eXBlY2hlY2tlZCBBU1QgdGhhdCBjYW4gYmUgYW5hbHl6ZWQgd2l0aCBhIHByb3ZpZGVkDQog IHZpc2l0b3IuIFBsZWFzZSBub3RlIHRoYXQgb3VyIHBhcnNlciBhbmQgdHlwZWNoZWNrIGNvbmZv cm1zIG1vc3RseSB0bw0KICBTb2xpZGl0eSAwLjcsIGlubGluZSBhc3NlbWJseSBpcyBub3Qgc3Vw cG9ydGVkLiBUYWtlIGEgbG9vayBhdCBbb3VyDQogIGRvY3VtZW50YXRpb25dLg0KDQogIFlvdSBj YW4gdGVzdCBpdCBhbmQgcmVwb3J0IGJ1Z3MganVzdCBbaGVyZV0hDQoNCg0KW09jYW1sLXNvbGlk aXR5XSA8aHR0cHM6Ly9naXRodWIuY29tL09DYW1sUHJvL29jYW1sLXNvbGlkaXR5Pg0KDQpbb3Vy IGRvY3VtZW50YXRpb25dIDxodHRwczovL29jYW1scHJvLmdpdGh1Yi5pby9vY2FtbC1zb2xpZGl0 eS8+DQoNCltoZXJlXSA8aHR0cHM6Ly9naXRodWIuY29tL09DYW1sUHJvL29jYW1sLXNvbGlkaXR5 L2lzc3Vlcz4NCg0KDQpNaWdyYXRpbmcgdG8gZmxvYXRhcnJheSAoYmxvZyBwb3N0KQ0K4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToN CiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9taWdyYXRpbmctdG8tZmxvYXRhcnJheS1i bG9nLXBvc3QvNzc0OS8xPg0KDQoNCk5pY29sw6FzIE9qZWRhIELDpHIgYW5ub3VuY2VkDQrilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIANCg0KICBBdCBMZXhpRmkgd2UgcmVjZW50bHkgbWlncmF0ZWQg b3VyIGNvZGViYXNlIHRvIHVzZSBgZmxvYXRhcnJheScgaW4NCiAgcGxhY2Ugb2YgYGZsb2F0IGFy cmF5JyBpbiBvcmRlciB0byBkaXNhYmxlIHRoZSAiZmxhdCBmbG9hdCBhcnJheSIgbW9kZQ0KICBp biB0aGUgY29tcGlsZXIuIElmIHlvdSBhcmUgaW50ZXJlc3RlZCBpbiBmaW5kaW5nIG91dCBtb3Jl IGFib3V0IGhvdw0KICB3ZSBkaWQgaXQsIHdlIHdyb3RlIGEgYmxvZyBwb3N0IGFib3V0IGl0DQog IDxodHRwczovL3d3dy5sZXhpZmkuY29tL2Jsb2cvb2NhbWwvZmxvYXRhcnJheS1taWdyYXRpb24v Pi4gRW5qb3khDQoNCg0KT2xkIENXTg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgSWYgeW91 IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5b3UgY2FuIFtzZW5kIG1lIGEgbWVzc2FnZV0gYW5kIEkn bGwgbWFpbA0KICBpdCB0byB5b3UsIG9yIGdvIHRha2UgYSBsb29rIGF0IFt0aGUgYXJjaGl2ZV0g b3IgdGhlIFtSU1MgZmVlZCBvZiB0aGUNCiAgYXJjaGl2ZXNdLg0KDQogIElmIHlvdSBhbHNvIHdp c2ggdG8gcmVjZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5IG1haWwsIHlvdSBtYXkgc3Vic2NyaWJlDQog IFtvbmxpbmVdLg0KDQogIFtBbGFuIFNjaG1pdHRdDQoNCg0KW3NlbmQgbWUgYSBtZXNzYWdlXSA8 bWFpbHRvOmFsYW4uc2NobWl0dEBwb2x5dGVjaG5pcXVlLm9yZz4NCg0KW3RoZSBhcmNoaXZlXSA8 aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vPg0KDQpbUlNTIGZlZWQgb2YgdGhlIGFy Y2hpdmVzXSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vY3duLnJzcz4NCg0KW29u bGluZV0gPGh0dHA6Ly9saXN0cy5pZHlsbC5vcmcvbGlzdGluZm8vY2FtbC1uZXdzLXdlZWtseS8+ DQoNCltBbGFuIFNjaG1pdHRdIDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0Lz4NCg0K --=-=-= 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 April 20 to 27, 2021.

docs.ocaml.pro : an OCaml Documentation Hub

Fabrice Le Fessant announced

We are pleased to announce that we just published the first version of the OCaml Documentation Hub on:

https://docs.ocaml.pro

The OCaml Documentation Hub can be used to browse the sources and the documentations of more than 2000 opam packages, following links between them when useful. This is a work-in-progress, and we are working on improving it with many more features, such as source annotations with types, full-text and type-driven searches, improvements in the general readability of documentation, etc.

The site is generated using an open-source tool called digodoc, available on:

https://github.com/OCamlPro= /digodoc

Digodoc is able to build a map of an opam switch, with links between files, opam packages, ocaml libraries, meta packages and ocaml modules. It is also able to generate documentation using odoc with cross-indexes between all these kinds of packages.

We welcome feedback and contributions! Enjoy !

Simon Cruanes said and Anil Madhavapeddy added

Great work on this site, and I love the domain name as well ;-)

The cross linking between packages is fantastic.

As a bit of background on why documentation cross-linking has taken so long= , there is a lonnnggg history intertwined with many people's contributions to opam, build systems (ocamlbuild and dun= e), conventions (findlib and odig) and of course odoc itself. The majo= r milestones along the way have been:

  • odoc 1.0, first began in = 2014 as a quick project to pull together typing information from cmt[i] fil= es, but which ran into the problem that it needs a consistent set of compil= ed cmt files to actually work, and so needs help from external tools to pul= l that set of compiled libraries together.
  • odig, which pulls toge= ther multiple opam packages (and a filesystem layout for metadata) and runs= odoc on then. This allowed for the creation of https://docs.mirage.io a few years ago which cross-references a= smaller number of packages
  • opam-repo itself has had better and better bulk builds over the years t= o ensure that we can actually automatically compile all the artefacts neede= d for docs builds, thanks to efforts like health check and ocurrent.
  • odoc 2.0, which featured a multi-year rewrite of the OCaml module resolver and introduced a= new output IR. Thi= s forthcoming release was presented in this OCaml 2020 talk by @jonludlam.

And now with all these pieces in place, the OCaml documentation spring has = arrived! The OCamlPro one posted here as the first of the "new batch" of mass documentation indexers, and I'm aware = of concurrent efforts by the odoc/ocaml.org maintainer teams to push a central one out to ocaml.org, as = well as by the MirageOS team who are refreshing docs.mirage.io with the latest and greatest. I'm sure when the = dust has settled on all these indexers we can look for common pieces, but for now it's lovely to see so much innovati= on happening at pace.

For the community: now is the time to fix your docstrings in your libraries= , as there will many cool tools parsing and processing them, and rendering them into all kinds of output formats!

To the odoc c= ontributors, thank you! The journey to get to this documentation site started here seven years ago:

commit ef91571cab31d9ece7af965ed52eaaff57a12efc
Author: Leo White <lpw25@cl.cam.ac.uk>
Date:   Thu Oct 16 19:20:18 2014 +0100

    Initial commit

@lefessan one thing I'm not sure about in your site is the "copyright libra= ry authors" claim. That's murky legal ground – it's worth establishing if the odoc HTML has gone through a= compilation process and so is no longer copyright the authors (just as a binary output is not copyright the origina= l source code). If the output is copyright the authors, then they have reasonable grounds to claim that you = should also reproduce the copyright notice and other license restrictions. Personally, I prefer to claim that there is= no copyright to the original authors in odoc output, and sidestep this issue.

Fabrice Le Fessant replied

Thanks @avsm , all these projects were indeed important milestones towards = the creation of this site. However, I wouldn't want this history perspective to give the wrong feeling that build= ing this site was easy, it is the result of a very good, long and hard work by the team a= t OCamlPro to make it work despite a road paved with many obstacles. It also benefited from OCamlPro's long history of innovative projects for the OCaml community, that lead for example in the p= ast to Opam, Try-OCaml, Memprof/Memthol, Opam-builder, Learn-OCaml, the Typerex tools (ocp-indent, ocp-index, ocp-build, etc.) and more recently opam-bin and drom.

As I said, this is a work-in-progress, and there are many features that we = will be adding in the next months to make this website much easier to navigate, for users to rapidely reach the infor= mation that matters for them. We hope it will be inspirational for all the other develo= pers who are working on similar projects, and we are looking forward to using their projects soon too!

Daniel B=C3=BCnzli said

I'd just like to stress that odig documents OCaml package inst= alls regardless of the package manager used as long the install structure follows these conventions (which are automatically followed by dune installs) .

Also for people using my packages, I'd just like to mention they may miss i= mportant documentation bits on https://docs.ocaml.pro until that issue is resolved.

Much later in the thread, Kiran Gopinathan said

It's not quite the same as hoogle, but merlin has a functionality to search= for functions by type signature - the feature doesn't seem to get much attention apparently - probably the interf= ace is a little lacking, but with some extra elisp tuning, it can work quite smoothly:

3D"3c2d1c63fac7=

Yawar Amin then added

The command line for this:

ocamlmerlin single search-by-polarity -position 0 -query '-int +string'

(To search for values of type int -> string.)

Decompress 1.4.0

Charles Edouard Lecat announced

Greetings everyone,

I am happy to announce the new release of decompress 1.4.0, available for installation via OPAM. Decompress is a library containing a pure OCaml implementation of several compression alg= orithms:

  • RFC1951
  • Zlib
  • Gzip
  • LZO

It's goal is to provide several algorithms for both the inflation and the d= eflation of objects, in the form of a stream API allowing to call the chosen algorithm one bit at a time. Such be= havior allows for an easy use of decompress in situations where we would not be able to have the input in on= e go, or where we would like to output the result in a non blocking way. This new release comes with several improveme= nts to the documentation and bug fixes, but even more, with a whole new implementation for the rfc 1951 and zlib al= gorithms.

Non-stream implementation for rfc 1951 and zlib

Up to this day, decompress was used in several projects like ocaml-git. How= ever, as time passed by, it appeared that in some cases, the current implementation of decompress was not the optimal= solution: As useful as a stream implementation is, it requires to save a lot of infor= mation about the state of the compression, in order to resume it once we have enough input.

This is why, in some cases where we would be sure that we have our whole in= put in one go, we might want to avoid all of these side-costs, and directly go to the point.

State of the art: libdeflate

This new problematic in mind, we have started thinking about the existing i= mplementations of these algorithms which were also bypassing the stream behavior. One implementation that proved to = be a suitable example for our problem, was the library libdeflate, an implementation in C. It's main adva= ntages being: a better compression ratio than zlib and with faster runtime.

It was used as the solid base for the OCaml implementation provided by this= new release.

OCaml version of libdeflate, performances and use cas= es

Inheriting the logic of libdeflate, the new implementation now has a better= compression ratio, while being slightly faster at it. On the other side, the decompression is way faster, with 33% of speed increase in most tested cases: On the ~book2 (from the Calgary corpus) file:

  • decompress (stream): 15 Mb/s (deflation), 76 Mb/s (inflati= on), ratio: 42.46 %
  • decompress (non-stream): 17 Mb/s (deflation), 105 Mb/s (in= flation), ratio: 34.66 %

Now that this is in place, the users of decompress will be able to choose b= etween the two versions, according to their needs. In the case of ocaml-git, the vast majority of the git objects= are small and will be compressed in one go. This is why we updated with the new implementation when possible.

Writing optimized code and profiling it

One of the biggest concerns of this release was to be able to produce optim= ized code. The base code being coded in C, a lot of sub-optimal behavior where ported in the OCaml version: for<= /code> and while loops, references everywhere, mixes of struct and union., it needed a lot of cl= ean up.

This is why once the main iteration was done, we have spent several weeks p= rofiling the code base, using the OCaml library landmarks, flamegraph or simply the linux= binary perf. This work, sometimes tedious, proved to be helpful and healthy for both the harmonization of the code and it's perform= ances.

Decompress & MirageOS

Compression algorithms are a really important piece in many projects, and o= perating systems do not avoid this. decompress was coded from the start with the idea of being use= d in the much larger project MirageOS.

This release is another opportunity to broaden MirageOS=E2=80=99s reach, by= providing one more algorithm to it=E2=80=99s stack, allowing us to specialise even more the unikernels that would have a need f= or inflation/deflation algorithms. This more restrictive implementation, as we need to have the whole input in one = go, will allow us to take advantage of the situation and give more flexibility for the user.

The positive aspects of this release will most likely show up soon enough, = as we make use of decompress to its full potential

elliptic curves - maintainable and verified (full stack, from = primitives to TLS)

Hannes Mehnert announced

over the last month I worked on upgrading the cryptography stack for OCaml = and MirageOS. I just published a blog post. Enhancments of O= Caml-TLS (usenix security paper from 2015) and X.509 are in place.

The main achievement after TLS 1.3 support (since May 2020, 0.12.0) is that= elliptic curve certificates are now supported. Elliptic curve cryptography uses fiat. The X509 implementation now supports PKCS 12 (used by browsers and other software (e.g. OpenVPN) to= bundle certificates and private keys).

Get mirage-crypto-ec, x509 0.13.0 and tls 0.13.1 (all available in the opam= -repository). Discussion and feedback appreciated.

First release of Docteur, an opiniated read-only file-system f= or MirageOS

Calascibetta Romain announced

I'm glad to announce the first release of docteur, a simple tool to make and use (in= read-only) a "file-system" for MirageOS. As you know,= with MirageOS, we don't have sockets, kernel space or even file-descriptor. It's not possible to mani= pulate files standalonely and many primitives commonly available with the unix module don't exists in our space.

Therefore, it is difficult to imagine making a website that displays local = files or a database system. But in our spirit of separation of services, it becomes possible for your unikernel to= communicate over the network to a "file system" or a database.

For quite some time we have been experimenting with a file system external = to our unikernel called Git. This is the case of pasteur which saves the pastes in a Git repository. It is also the case of <= a href=3D"https://github.com/roburio/unipi">unipi or Canopy which display the co= ntent of a Git repository and can resynchronize with it using a hook. Or the case of our primary = DNS server whose zone file comes from a Git repository - we can then tr= ace all the changes on this file.

However, we have several limitations:

  1. it requires the Git repository to load into memory in your unikernel
  2. it requires a communication (external with GitHub or internal in a priv= ate network)

The persistent aspect is very important. We should always be able to launch= a unikernel and not lose the data if our system shuts down.

The mutable aspect (modify a file) is useful in some cases but not in other= s. As for unipi for example (a simple static web site), the difference between resynchronizing with a hook or res= tarting the unikernel with a new version of your filesystem is minor.

Docteur as a second solution

This is where Doctor comes in. It solves both of our problems by offering t= he generation of a file system from scratch:

  • a Git repository (local or available on a service)
  • a specific folder

Doctor is able to create a complete representation of a folder and to compr= ess it at such a ratio that a generation of the documentation of several OPAM packages with all their versions makin= g 14 Gb is reduced to an image of only 280 Mb!

Such a high compression ratio is in particular due to a double level of com= pression by decompre= ss and duff. For more = details, Docteur just generates a slightly modified PACK file with carton.

Then, Docteur proposes a simple library which makes available 2 ways to man= ipulate this image for your unikernel:

  1. a way that is fast but with a consequent boot time
  2. a slower way but with no cost to the boot time

The first way will simply "analyze" the image to re-extract the layout of y= our file system. Then it uses the ART data-structure to save this layout. So, whenever you want a specific fi= le and according to ART benchmarks, you have access to the content very quickly.

The problem remains the analysis which takes place at boot time and which c= an take a very long time (it depends essentially on the number of files you have). There can also be an impact o= n memory usage as the ART data structure is in memory - the more files there are, the bigger the structure is.

The second method is more "silly". Each time you request a file, we will ha= ve to rebuild the entire path and therefore deserialize several objects (like folders). The advantage is that= we don't analyze the image and we don't try to maintain a layout of your file system.

Example

Docteur is meant to be simple. The generation of the image is done very sim= ply by the command make:

$ docteur.make -b refs/heads/main https://gith=
ub.com/dinosaure/docteur disk.img
$ docteur.make -b refs/heads/main git@github.com:dinosaure/docteur disk.img
$ docteur.make -b refs/heads/main git://github.com/dinosaure/docteur disk.i=
mg
$ docteur.make -b refs/heads/main file://$(=
pwd)/dev/docteur disk.img

Then, Docteur proposes 2 supports: Unix & Solo5. For Unix, you just have to name explicitly the ima= ge file to use. For the case of Solo5 (and thus of virtualization). You just have t= o find a name for a "block device" and to reuse this name with the Solo5 "tender" specifying where the image is.

$ cd unikernel
$ mirage configure -t unix --disk disk.img
$ make depends
$ mirage build
$ ./simple --filename README.md
$ cd unikernel
$ mirage configure -t hvt --disk docteur
$ make depends
$ mirage build
$ solo5-hvt --block:docteur=3Ddisk.i=
mg -- simple.hvt --filename README.md

Finally, Docteur proposes another tool that checks (and analyzes) an image = to give you the version of the commit used (if the image comes from a Git repository) or the hash of your file system = produced by the calculation of a Merkle tree.

$ docteur.verify disk.img
commit  : ad8c418635ca6683177c7ff3b583e1ea5afea78f
author  : "Calascibetta Romain" <romain.calascibetta@gmai=
l.com>
root    : bea10b6874f51e3f6feb1f9bcf3939933b2c4540

Merge pull request #11 from dinosaure/fix-tree-expanding

Fix how we expand our file-system

Conclusion

Many times people ask me for a purpose in MirageOS such as a website or a p= articular service. I think that Docteur shows one essential thing about MirageOS, it is a tool and an ecosystem. Bu= t it's not an endpoint that is concretized in a specific application.

Docteur is not THE solution to our problems and answers a specific use case= . What is important to note is not what Docteur does but the possibility for our ecosystem and our tools to allow t= he development of Docteur. As it allows the development of a trillion applications!

As such, I say to those people to "play" with MirageOS if they want to lear= n more. Our goal is not to show you applications that you could then deploy easily (even if we are working on t= his aspect too) but to give you the possibility to imagine your OS (independently from our vision)!

And if you try, we'll be happy to help you!

Ocaml-solidity, a new OCaml library for Solidity

OCamlPro announced

We are pleased to announce our new OCaml library, ocaml-solidity ! Ocaml-solidity i= s a program manipulation library that provides a Solidity parser and typechecker.

Our library is made for developers on Solidity code analysis, it builds a t= ypechecked AST that can be analyzed with a provided visitor. Please note that our parser and typecheck conforms mostly= to Solidity 0.7, inline assembly is not supported. Take a look at our documentation.

You can test it and report bugs just here!

Migrating to floatarray (blog post)

Nicol=C3=A1s Ojeda B=C3=A4r announced

At LexiFi we recently migrated our codebase to use floatarray = in place of float array in order to disable the "flat float array" mode in the compiler. If you are interested in finding o= ut more about how we did it, we wrote a blog post about it https://www.lexifi.com/blog/ocaml/floatarray-migration/. En= joy!

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.

--=-=-=--