From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver= Authentication-Results: plum; dmarc=fail (p=none dis=none) header.from=polytechnique.org Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=aNwZzaCl; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=oc6UPlcE; dkim-atps=neutral Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id F2E55B80123 for ; Tue, 10 Sep 2024 14:55:19 +0100 (BST) 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=4XkJBXckXAA9s+3cxsRLTtHoipNyRilpdIqor/Ug2nA=; b=aNwZzaCl+SPWMJHav06tZ5EwleVJZpof40MBPFlN4lAg5saNEnWGqTMA b9B5LX+PP6ZmV7CsiP1pZUj9YFvqi7npSF9yQMUyu0EUBuVs3tejBVpOO kcrjJ8B5BWiJNGLTyL/WmBnRlL/jv6oxRgoivS1cG16gXHS8lXZ9HMokC 4=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (signature did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.10,217,1719871200"; d="scan'208,217";a="182416303" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 10 Sep 2024 15:55:17 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 84BF5E0D18; Tue, 10 Sep 2024 15:55:16 +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 5E943E00B6 for ; Tue, 10 Sep 2024 15:55:10 +0200 (CEST) IronPort-SDR: 66e04fbb_iaEbhwN4oP/jmkupb7Rvki0i0J/R8AdehTSjbKcE/KwITWj 8OfaBBB5LwbaJnyfhTVklZeSE3qHIDDaRpJJskQ== X-IPAS-Result: =?us-ascii?q?A0FUAQBcTuBmmCIeaIFahBlbKBkBY1ozBwhIAyUBOIN1g?= =?us-ascii?q?0+OH4EWkDOKd4J7AxgWIxQBAwENLgEOBAECBAEBAwECAYIMgnQCFoljAh8GA?= =?us-ascii?q?QQ0EwECBAEBAQEDAgMBAQEBAQEIAQEFAQEBAgEBAgQGAQIQAQEBAQEBAQE3B?= =?us-ascii?q?UmFOwU1DYJGLiNxXgcJNgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQECCAQBDAUILBkBPwEIBAYTAQEmBQ0YFA8DDAgBBgMCB?= =?us-ascii?q?A0BNQMUAQkJFAYBgg0URAGCMAMxAwUMBpU7mzx6fzOBAYIMAQEGgQg+AgELA?= =?us-ascii?q?gIDAQ4JJQHZCxZjgWMJgTAYiDEaASpIagKEQwmEMScPgVVEgRU1gXNKB2+BU?= =?us-ascii?q?G8EHgEBAQEYgSQBAQgCQwkagwuCaYYgVYVTbIEKKxoNgnIOHIEJBGEFAQgCB?= =?us-ascii?q?hYKN1dWVw9Xbz4SQgIMMgOBEIE9fCMCSANWEIYtYIEagXOCKopIgUdLMyETA?= =?us-ascii?q?VUTFwsJBWSGC4JKgymCFIQYhSeBZwlgh2iBb4E+gVpHgnFLhVCBBoJUa048A?= =?us-ascii?q?g0CN4IpJW6CXoMPHUADC209NRQbqlUEDScBgVoBgXQJJAIOCzMCJiUVERAHB?= =?us-ascii?q?QEbDgEBBQ4NAg0pOQcIFA4LBA4JSgsLAgYnA4RYjXIoKgKPL44Nk1CBCjQHh?= =?us-ascii?q?BqBXQYMiQKBJIhajRmEBYFWiyuGfpJBIphSIoI0hiCBAIElCQeBZmqIb4wzL?= =?us-ascii?q?CCFNIF+I4ErAQEZAwMJBzMaMEOCMwEBMgkJPRwPhWuIPwMWgQwBCYIaKEF9g?= =?us-ascii?q?SEFgTw5O8YVLwNBNQIBAQQDBykCBwEKAQEDCYViAQGFUgEBBR8CBwWBSwEB?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23: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 tVhD7bSyahFxI1sNGWq9Dg0 IronPort-HdrOrdr: A9a23:+zCVZqr2o1CyELCAxJNQlxMaV5oWeYIsimQD101hICG9E/bo9P xG+c5w6faaslgssR0b9OxoW5PhfZq/z/9ICOAqVN/IYOCMggSVxe9ZgbfK8nnJJGnV9+JW16 tsGpIOauHYPBxdlsi/xAG5Fr8bsb26GU2T9ILj80s= X-Talos-CUID: 9a23:mpde5WBQmCV4/Nn6EzdErlBONZEVTiXU1kmTCmWXOEp5FbLAHA== X-Talos-MUID: =?us-ascii?q?9a23=3A2CMEAg1sZXujdxMjYL0sT5Ne1jUj6qqfLkcfq60?= =?us-ascii?q?9tfLUaRVUJBu7syyWTdpy?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.10,217,1719871200"; d="scan'208,217";a="95941725" X-MGA-submission: =?us-ascii?q?MDGI11wFPXET0QEdAutuz00g5OOhPiHsPUwt6M?= =?us-ascii?q?xsXGW6S/zDexwFDxqS0zPjeWEgORbZxG8w2Oeb8KdM+h+pqbN4Pp5IpG?= =?us-ascii?q?s5E6uoCqfNmPGPgl2r/kmYbYYOOES9UwC/n6HheJdh8pcPpMl31RSGXX?= =?us-ascii?q?uNBSZRhev6V8nGy7wpcp3YKg=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 10 Sep 2024 15:55:07 +0200 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id F0E715648BC; Tue, 10 Sep 2024 15:55:05 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1725976506; bh=ZWIqUlk5stlVBWRRsqTLIASytalFEXpP6+8AdG9CagM=; h=From:To:Subject:Date:Message-ID; b=oc6UPlcEIqkDGQl+J/Wxx8JNxdqmf7etwY/W1q1bG5sVD379+GJxPNYawaVpcPkJp XSoCWVREmQ932Dl/6pQNPNnn04PC2DipRRh/7tO8nytfVPVx8eDhzsUoyDqTaSXdbY FBeVogAfVx4Jdnf5p33jWPuKcMCOtO9NI1aoji9M= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 10 Sep 2024 15:55:05 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Sep 10 15:55:06 2024 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.376515, queueID=3E1085648BD 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: 19178 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 ZWsgb2YgU2VwdGVtYmVyIDAzIHRvDQoxMCwgMjAyNC4NCg0KVGFibGUgb2YgQ29udGVudHMNCuKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQpPeGlk aXppbmcgT0NhbWwg4oCUIGFuIHVwZGF0ZQ0KVG95IEF1dG9ncmFkIEVuZ2luZSBpbiBPQ2FtbCB3 aXRoIEFwcGxlIEFjY2VsZXJhdGUgQmFja2VuZA0KTmV3IHJlbGVhc2Ugb2YgY3Bwbywgd2l0aCBt dWx0aS1saW5lIG1hY3JvcyBhbmQgaGlnaGVyLW9yZGVyIG1hY3Jvcw0KT0NhbWxQcm8ncyBjb250 cmlidXRpb25zIHRvIHRoZSAyMDI0IElDRlAgaW4gTWlsYW4NCkZsYW1iZGEyIEVwLiAzOiBTcGVj dWxhdGl2ZSBJbmxpbmluZywgYnkgT0NhbWxQcm8NCkZydXN0cmF0aW5nIEludGVyYWN0aW9ucyB3 aXRoIHRoZSBPQ2FtbCBFY29zeXN0ZW0gd2hpbGUgZGV2ZWxvcGluZyBhIFN5bnRoZXNpemVyIExp YnJhcnkNCkNtZGxhbmcgLSBZZXQgQW5vdGhlciBDTEkgTGlicmFyeSAod2VsbCwgbm90IHJlYWxs eSkNCnphcnIgdjAuMS4wDQpCcnIgMC4wLjcNCk9jc2lnZW4gU2VydmVyIDYuMC4wDQpkcmVhbS1o dG1sIGFuZCBwdXJlLWh0bWwNCkFkdmFuY2VkIENvZGUgTmF2aWdhdGlvbiBjb21pbmcgdG8gT0Nh bWwtTFNQDQpPdGhlciBPQ2FtbCBOZXdzDQpPbGQgQ1dODQoNCg0KT3hpZGl6aW5nIE9DYW1sIOKA lCBhbiB1cGRhdGUNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxo dHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLW94aWRpemluZy1vY2FtbC1hbi11cGRhdGUv MTUyMzcvMT4NCg0KDQpEaWFuYSBLYWxpbmljaGVua28gYW5ub3VuY2VkDQrilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIANCg0KICBIaSBldmVyeW9uZSEgTGFzdCB5ZWFyLCB3ZSBtYWRlIGEgc2Vy aWVzIG9mIGJsb2dwb3N0cyBkZXNjcmliaW5nIG91cg0KICBwbGFucyB0byBpbnRyb2R1Y2UgUnVz dC1saWtlIHR5cGUgc3lzdGVtIGZlYXR1cmVzIHRvIE9DYW1sIChzZWUNCiAgW2hlcmVdKS4gTm93 LCB3ZSBhcmUgc2hhcmluZyB1cGRhdGVzIG9uIGV2ZXJ5dGhpbmcgd2UndmUgZG9uZSBzaW5jZQ0K ICBsYXN0IHllYXIgZm9yIElDRlAgMjAyNC4gUGxlYXNlIHJlYWQgb3VyIFtibG9ncG9zdF0gYW5k IGNoZWNrIG91dCBvdXINCiAgY29tcGlsZXIgZXh0ZW5zaW9ucyBhdCBvdXIgW0dpdEh1Yl0hDQoN Cg0KW2hlcmVdDQo8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L294aWRpemluZy1vY2FtbC1h bmQtYS1uZXctb3BhbS1zd2l0Y2gvMTI5NDI+DQoNCltibG9ncG9zdF0gPGh0dHBzOi8vYmxvZy5q YW5lc3RyZWV0LmNvbS9pY2ZwLTIwMjQtaW5kZXgvPg0KDQpbR2l0SHViXQ0KPGh0dHBzOi8vZ2l0 aHViLmNvbS9qYW5lc3RyZWV0L29wYW0tcmVwb3NpdG9yeS90cmVlL3dpdGgtZXh0ZW5zaW9ucz4N Cg0KDQpUb3kgQXV0b2dyYWQgRW5naW5lIGluIE9DYW1sIHdpdGggQXBwbGUgQWNjZWxlcmF0ZSBC YWNrZW5kDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90 L3RveS1hdXRvZ3JhZC1lbmdpbmUtaW4tb2NhbWwtd2l0aC1hcHBsZS1hY2NlbGVyYXRlLWJhY2tl bmQvMTUyMzkvMT4NCg0KDQpKb2huIEpld2VsbCBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEkgaGF2 ZSBiZWVuIHZlbnR1cmluZyB0byBsZWFybiBhIG5ldyBsYW5ndWFnZSBhbmQgSSBsYW5kZWQgb24g T0NhbWwNCiAgYWZ0ZXIgaGVhcmluZyBhIGZldyBpbnRlcmVzdGluZyB0YWxrcyBmcm9tIEphbmUg U3RyZWV0LiBJIGp1c3QgbWFkZQ0KICBwdWJsaWMgYSB0b3kgYXV0b2dyYWQgZW5naW5lIGluIE9D YW1sIHdpdGggYW4gQXBwbGUgQWNjZWxlcmF0ZSBiYWNrZW5kDQogIGlmIGFueW9uZSBpcyBpbnRl cmVzdGVkOg0KDQogIDxodHRwczovL2dpdGh1Yi5jb20vamV3ZWxsdGF5bG9yL2NhbWxncmFkPg0K DQogIEkgd291bGQgcmVhbGx5IGFwcHJlY2lhdGUgYW55IGZlZWRiYWNrIGluIHRlcm1zIG9mIHRo ZSBPQ2FtbCBjb2RlIHRoYXQNCiAgSSB3cm90ZSBzbyB0aGF0IEkgY2FuIGltcHJvdmUuIElmIGFu eW9uZSBpcyB3aWxsaW5nIHRvIHF1aWNrbHkgdGFrZSBhDQogIGxvb2sgaXQgd291bGQgbWVhbiBh IGxvdCA6c2xpZ2h0X3NtaWxlOg0KDQoNCk5ldyByZWxlYXNlIG9mIGNwcG8sIHdpdGggbXVsdGkt bGluZSBtYWNyb3MgYW5kIGhpZ2hlci1vcmRlciBtYWNyb3MNCuKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qv YW5uLW5ldy1yZWxlYXNlLW9mLWNwcG8td2l0aC1tdWx0aS1saW5lLW1hY3Jvcy1hbmQtaGlnaGVy LW9yZGVyLW1hY3Jvcy8xNTI0MS8xPg0KDQoNCkZyYW7Dp29pcyBQb3R0aWVyIGFubm91bmNlZA0K 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSXQgaXMgbXkgcGxlYXN1cmUgdG8gYW5ub3VuY2Ug YSBuZXcgcmVsZWFzZSBvZiBjcHBvICh2MS43LjApIHdpdGggdHdvDQogIG5ldyBmZWF0dXJlcy4N Cg0KICDigYMgVGhlIG5ldyBzeW50YXggYCNkZWYgLi4uICNlbmRkZWYnIGFsbG93cyBhIG1hY3Jv IGRlZmluaXRpb24gdG8gc3Bhbg0KICAgIHNldmVyYWwgbGluZXMsIHdpdGhvdXQgYmFja3NsYXNo ZXMuIFRoaXMgc3ludGF4IGFsbG93cyBtYWNybw0KICAgIGRlZmluaXRpb25zIHRvIGJlIG5lc3Rl ZC4NCiAgICDilIzilIDilIDilIDilIANCiAgICDilIIgI2RlZiByZXBlYXRfdW50aWwoYWN0aW9u LGNvbmRpdGlvbikNCiAgICDilIIgICBhY3Rpb247DQogICAg4pSCICAgd2hpbGUgbm90IChjb25k aXRpb24pIGRvDQogICAg4pSCICAgICBhY3Rpb24NCiAgICDilIIgICBkb25lDQogICAg4pSCICNl bmRkZWYNCiAgICDilJTilIDilIDilIDilIANCg0KICDigYMgQSBwYXJhbWV0ZXJpemVkIG1hY3Jv IGNhbiB0YWtlIGEgcGFyYW1ldGVyaXplZCBtYWNybyBhcyBhIHBhcmFtZXRlcjoNCiAgICB0aGlz IGlzIGEgaGlnaGVyLW9yZGVyIG1hY3JvLg0KICAgIOKUjOKUgOKUgOKUgOKUgA0KICAgIOKUgiAj ZGVmaW5lIFRXSUNFKGUpICAgICAgICAgIChlICsgZSkNCiAgICDilIIgI2RlZmluZSBBUFBMWShG IDogWy5dLCBlKSAobGV0IHggPSAoZSkgaW4gRih4KSkNCiAgICDilIIgbGV0IGZvcnR5X3R3byA9 DQogICAg4pSCICAgQVBQTFkoVFdJQ0UsMSsyKzMrNCs1KzYpDQogICAg4pSU4pSA4pSA4pSA4pSA DQoNCiAgRm9yIG1vcmUgZGV0YWlscywgcGxlYXNlIHNlZSB0aGUgW2RvY3VtZW50YXRpb25dLg0K DQoNCltkb2N1bWVudGF0aW9uXQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1jb21tdW5pdHkv Y3Bwby8/dGFiPXJlYWRtZS1vdi1maWxlI211bHRpLWxpbmUtbWFjcm9zLWFuZC1uZXN0ZWQtbWFj cm9zPg0KDQoNCk9DYW1sUHJvJ3MgY29udHJpYnV0aW9ucyB0byB0aGUgMjAyNCBJQ0ZQIGluIE1p bGFuDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0K ICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L29jYW1scHJvcy1jb250cmlidXRpb25zLXRv LXRoZS0yMDI0LWljZnAtaW4tbWlsYW4vMTUyNDQvMT4NCg0KDQpPQ2FtbFBybyBhbm5vdW5jZWQN CuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0K DQogIFRvZGF5LCBhIHF1aWNrIGhlYWQncyB1cCBhYm91dCBvdXIgY29udHJpYnV0aW9ucyB0byB0 aGlzIHllYXIncw0KICBJbnRlcm5hdGlvbmFsIENvbmZlcmVuY2Ugb24gRnVuY3Rpb25hbCBQcm9n cmFtbWluZyB3aGljaCBpcyB1bnJhdmVsaW5nDQogIHJpZ2h0IG5vdyBpbiBNaWxhbiENCg0KICBU aGlzIHllYXIsIG91ciB0ZWFtIHByZXNlbnRzIHR3byB0b3BpY3M6DQogIOKAoiBbIlNuYXBzaG90 dGFibGUgU3RvcmVzIl06IEEgZ2VuZXJpYyBhbmQgZWZmaWNpZW50IGRhdGEgc3RydWN0dXJlIGZv cg0KICAgIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBiYWNrdHJhY2tpbmcgYWxnb3JpdGhtcywgdXNl ZCBwYXJ0aWN1bGFybHkgaW4NCiAgICBhdXRvbWF0aWMgdGhlb3JlbSBwcm92ZXJzIGFuZCB0eXBl IGNoZWNrZXJzLiBUaGlzIGltcGxlbWVudGF0aW9uIGluDQogICAgT0NhbWwgd2lsbCBzb29uIGJl IGF2YWlsYWJsZSBvbiBvcGFtLg0KDQogIOKAoiBbQSBwcmVzZW50YXRpb24gb24gb3BhbV0sIGRl dGFpbGluZyB0aGUgY29udGVudHMgb2YgdGhlIGxhdGVzdCBtYWpvcg0KICAgIHJlbGVhc2UgMi4y LCB3aGljaCB3YXMgcmVsZWFzZWQgaW4gSnVseSwgYXMgd2VsbCBhcyBob3cgdGhlIG9wYW0NCiAg ICB0ZWFtIG9wZXJhdGVzLg0KDQogIEJlIHN1cmUgdG8gY2hlY2tvdXQgW3RoZSBldmVudF0sIHRo ZXJlIGFyZSBwbGVudHkgb2YgZ3JlYXQNCiAgcHJlc2VudGF0aW9ucyBhbmQgdmlkZW8gcmVwbGF5 cyENCg0KICBVbnRpbCBuZXh0IHRpbWUsIHdoaWNoIHdpbGwgYmUgc29vbmVyIHRoYW4gbGF0ZXIg d2l0aCBhbm90aGVyIG9uZSBvZg0KICBvdXIgW0ZsYW1iZGEyIFNuaXBwZXRzXSwNCg0KICBLaW5k IHJlZ2FyZHMsIFRoZSBPQ2FtbFBybyBUZWFtDQoNCg0KWyJTbmFwc2hvdHRhYmxlIFN0b3JlcyJd DQo8aHR0cHM6Ly9pY2ZwMjQuc2lncGxhbi5vcmcvZGV0YWlscy9pY2ZwLTIwMjQtcGFwZXJzLzE0 L1NuYXBzaG90dGFibGUtU3RvcmVzPg0KDQpbQSBwcmVzZW50YXRpb24gb24gb3BhbV0NCjxodHRw czovL2ljZnAyNC5zaWdwbGFuLm9yZy9kZXRhaWxzL29jYW1sLTIwMjQtcGFwZXJzLzEwL09wYW0t Mi0yLWFuZC1iZXlvbmQ+DQoNClt0aGUgZXZlbnRdDQo8aHR0cHM6Ly93ZWIuY3ZlbnQuY29tL2V2 ZW50LzcyOGJlMzg3LTRlODktNDkzMC1hNGU0LTUxZjlkMWQ2MjA5ZS9zdW1tYXJ5Pg0KDQpbRmxh bWJkYTIgU25pcHBldHNdDQo8aHR0cHM6Ly9vY2FtbHByby5jb20vYmxvZy8yMDI0XzAzXzE4X3Ro ZV9mbGFtYmRhMl9zbmlwcGV0c18wLz4NCg0KDQpGbGFtYmRhMiBFcC4gMzogU3BlY3VsYXRpdmUg SW5saW5pbmcsIGJ5IE9DYW1sUHJvDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAN Cg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Jsb2ctZmxhbWJk YTItZXAtMy1zcGVjdWxhdGl2ZS1pbmxpbmluZy1ieS1vY2FtbHByby8xNTI1MC8xPg0KDQoNCk9D YW1sUHJvIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSADQoNCiAgQXMgcHJvbWlzZWQgaW4gb3VyIFtwcmV2aW91cyBwb3N0XSBh Ym91dCBPQ2FtbFBybydzIGNvbnRyaWJ1dGlvbnMgdG8NCiAgdGhpcyB5ZWFyJ3MgSW50ZXJuYXRp b25hbCBDb25mZXJlbmNlIG9mIEZ1bmN0aW9uYWwgUHJvZ3JhbW1pbmcsIHdlDQogIGJhY2sgYWdh aW4gd2l0aCBhIG5ldyBlbnRyeSBpbiBvdXIgW0ZsYW1iZGEyIFNuaXBwZXQgYmxvZyBzZXJpZXNd IQ0KDQogIFtGbGFtYmRhMiBFcC4gMzogU3BlY3VsYXRpdmUgSW5saW5pbmddIGNvdmVycyBpbmxp bmluZyBpbiBnZW5lcmFsIGFzDQogIHdlbGwgYXMgaG93IG91ciBjb21waWxlciBoYW5kbGVzIGl0 LiBXZSBnbyBpbiBkZXRhaWwgYWJvdXQgaG93DQogIGBTcGVjdWxhdGl2ZSBJbmxpbmluZycgYWxs b3dzIG1vcmUgc2lnbmlmaWNhbnQgb3B0aW1pc2F0aW9ucyB0byB0YWtlDQogIHBsYWNlLg0KDQog IFRoaXMgYmxvZyBlbnRyeSBpcyBrZXkgZm9yIGEgc21vb3RoIHJlYWQgb2Ygb3VyIG5leHQgYXJ0 aWNsZSB3aGljaA0KICB3aWxsIGNvdmVyIGBVcHdhcmRzIGFuZCBEb3dud2FyZHMgVHJhdmVyc2Fs cycgaW4gRmxhbWJkYTIuDQoNCiAgSGFwcHkgdG8gc2F5IHRoYXQgaXQncyBhbHJlYWR5IHF1aXRl IGZhciBkb3duIHRoZSByZWxlYXNlIHBpcGVsaW5lIQ0KDQoNCltwcmV2aW91cyBwb3N0XQ0KPGh0 dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9vY2FtbHByb3MtY29udHJpYnV0aW9ucy10by10aGUt MjAyNC1pY2ZwLWluLW1pbGFuLzE1MjQ0Pg0KDQpbRmxhbWJkYTIgU25pcHBldCBibG9nIHNlcmll c10NCjxodHRwczovL29jYW1scHJvLmNvbS9ibG9nLzIwMjRfMDNfMThfdGhlX2ZsYW1iZGEyX3Nu aXBwZXRzXzAvI2xpc3Rpbmc+DQoNCltGbGFtYmRhMiBFcC4gMzogU3BlY3VsYXRpdmUgSW5saW5p bmddDQo8aHR0cHM6Ly9vY2FtbHByby5jb20vYmxvZy8yMDI0XzA4XzA5X3RoZV9mbGFtYmRhMl9z bmlwcGV0c18zLz4NCg0KDQpGcnVzdHJhdGluZyBJbnRlcmFjdGlvbnMgd2l0aCB0aGUgT0NhbWwg RWNvc3lzdGVtIHdoaWxlIGRldmVsb3BpbmcgYSBTeW50aGVzaXplciBMaWJyYXJ5DQrilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9k aXNjdXNzLm9jYW1sLm9yZy90L2Jsb2ctZnJ1c3RyYXRpbmctaW50ZXJhY3Rpb25zLXdpdGgtdGhl LW9jYW1sLWVjb3N5c3RlbS13aGlsZS1kZXZlbG9waW5nLWEtc3ludGhlc2l6ZXItbGlicmFyeS8x NTI1My8xPg0KDQoNClN0ZXZlIFNoZXJyYXR0IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoN CiAgPGh0dHBzOi8vd3d3LmdyaWRidWdzLm9yZy9mcnVzdHJhdGluZy1pbnRlcmFjdGlvbnMtd2l0 aC10aGUtb2NhbWwtZWNvc3lzdGVtLXdoaWxlLWRldmVsb3BpbmctYS1zeW50aGVzaXplci1saWJy YXJ5Lz4NCg0KICBMYXN0IHllYXIgSSBtYWRlIGEgc3ludGhlc2l6ZXIgbGlicmFyeSBpbiBPQ2Ft bCBhbmQgaGFkIHNvbWUgc3RydWdnbGVzDQogIHVzaW5nIER1bmUgYW5kIE9wYW0sIGFuZCBhbHNv IHJhbiBpbnRvIHNldmVyYWwgaXNzdWVzIHdpdGgNCiAgbGlicmFyaWVzLiBJIHdyb3RlIGEgYmxv ZyBwb3N0IGFib3V0IGFsbCB0aGUgcHJvYmxlbXMgSSBlbmNvdW50ZXJlZC4NCg0KDQpDbWRsYW5n IC0gWWV0IEFub3RoZXIgQ0xJIExpYnJhcnkgKHdlbGwsIG5vdCByZWFsbHkpDQrilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6 Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2NtZGxhbmcteWV0LWFub3RoZXItY2xpLWxpYnJhcnktd2Vs bC1ub3QtcmVhbGx5LzE1MjU4LzE+DQoNCg0KTWF0aGlldSBCYXJiaW4gYW5ub3VuY2VkDQrilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIANCg0KICBJIGhvcGUgeW91IGhhZCBhIG5pY2Ugc3VtbWVyISBNaW5lIHRvb2sg YW4gdW5leHBlY3RlZCB0dXJuIHdoZW4sDQogIHJvdWdobHkgYXQgdGhlIHNhbWUgdGltZSwgSSB3 cm90ZSBteSBmaXJzdCBgY21kbGluZXInIHN1YmNvbW1hbmQgYW5kDQogIGhlYXJkIGFib3V0IGBj bGltYXRlJyBmb3IgdGhlIGZpcnN0IHRpbWUuIE15IGV4cGVyaWVuY2Ugd2l0aCBPQ2FtbCBDTEkN CiAgc28gZmFyIGhhZCBiZWVuIGNlbnRlcmVkIGFyb3VuZCBgY29yZS5jb21tYW5kJy4NCg0KICBX aGVuIEkgcmVhZCBjbGltYXRlJ3MgW3Rlcm1pbm9sb2d5XSBzZWN0aW9uIGFuZCBob3cgaXQgZGVm aW5lcw0KICBgVGVybXMnLCBgQXJndW1lbnRzJywgYW5kIGBQYXJhbWV0ZXJzJywgc29tZXRoaW5n IGNsaWNrZWQuIFNlZWluZyBob3cNCiAgYGNsaW1hdGUnJ3MgQVBJIG1hbmFnZWQgdG8gbWFrZSBw b3NpdGlvbmFsIGFuZCBuYW1lZCBhcmd1bWVudHMgZml0IHNvDQogIG5pY2VseSB0b2dldGhlciwg SSB0aG91Z2h0OiAiV293LCBmb3IgdGhlIGZpcnN0IHRpbWUsIGl0IHNlZW1zIEknbGwgYmUNCiAg YWJsZSB0byB3cml0ZSBhIENMSSBzcGVjIG9uIGEgd2hpdGVib2FyZCB3aXRob3V0IHJlZmVycmlu ZyB0byBzb21lDQogIGNvZGUgSSBuZXZlciBzZWVtIHRvIGdldCByaWdodCAoSSBhbSBsb29raW5n IGF0IHlvdSwgYGNvcmUuY29tbWFuZCcncw0KICBhbm9ueW1vdXMgYXJndW1lbnRzKS4iDQoNCiAg SSBnb3QgcXVpdGUgZXhjaXRlZCBhbmQgdGhvdWdodDogIkNhbiBJIHN3aXRjaCB0byBgY2xpbWF0 ZScgdG9kYXk/Ig0KICBCdXQgcmVhbGl0eSBjaGVja2VkOiBpdCdzIG5vdCBvbiBvcGFtIHlldCwg c3RpbGwgdW5kZXIgY29uc3RydWN0aW9uLA0KICBJJ20gbm90IHN1cmUgd2hhdCB0aGUgY29tbXVu aXR5IHdpbGwgZG8sIGV0Yy4NCg0KICBJbXBsZW1lbnRpbmcgbXkgb3duIGVuZ2luZSBmb3IgYW4g QVBJIHJlc2VtYmxpbmcgYGNsaW1hdGUnIGZlbHQgbGlrZSBhDQogIHdhc3RlZCBlZmZvcnQsIGtu b3dpbmcgYWJvdXQgdGhlIHdvcmsgaGFwcGVuaW5nIGluIGBjbGltYXRlJy4gU3RpbGwsDQogIGhh dmluZyBhIGAnYSBQYXJhbS50JywgYCdhIEFyZy50JywgYW5kIGAnYSBDb21tYW5kLnQnIHR5cGUg dGhhdCBJDQogIHdvdWxkIGdldCB0byBrbm93IGFuZCBsb3ZlIGZlbHQgdG9vIGdvb2QgdG8gcGFz cyB1cC4NCg0KICBJIHN0YXJlZCBhdCB0aGUgYGNsaW1hdGUnIHR5cGVzIGZvciBhIHdoaWxlLCBh bmQgZmlsbGVkIHdpdGggaGFwcHkNCiAgdGhvdWdodHMgYWJvdXQgYSBicmlnaHQgQ0xJIGZ1dHVy ZSwgaXQgb2NjdXJyZWQgdG8gbWU6IGNhbiBJIHVzZSBhbg0KICBBUEkgbGlrZSBgY2xpbWF0ZScg YnV0IGNvbXBpbGUgaXQgZG93biB0byBleGlzdGluZyBsaWJyYXJpZXMgc3VjaCBhcw0KICBgY21k bGluZXInIG9yIGBjb3JlLmNvbW1hbmQnPyAoYW5kIGBjbGltYXRlJyB0b28hKS4gSSB3cm90ZSBk b3duIHRoZQ0KICBmb2xsb3dpbmcgdHlwZXM6DQoNCg0KW3Rlcm1pbm9sb2d5XQ0KPGh0dHBzOi8v Z2l0aHViLmNvbS9ncmlkYnVncy9jbGltYXRlP3RhYj1yZWFkbWUtb3YtZmlsZSN0ZXJtaW5vbG9n eT4NCg0KQ2xpbWF0ZQ0K4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAg4pSM4pSA4pSA4pSA4pSA DQogIOKUgiAnYSBQYXJhbS50ICAgICAtPiAnYSBDbGltYXRlLkFyZ19wYXJzZXIuY29udg0KICDi lIIgJ2EgQXN0LkFyZy50ICAgLT4gJ2EgQ2xpbWF0ZS5BcmdfcGFyc2VyLnQNCiAg4pSCICdhIENv bW1hbmQudCAgIC0+ICdhIENsaW1hdGUuQ29tbWFuZC50DQogIOKUlOKUgOKUgOKUgOKUgA0KDQoN CkNtZGxpbmVyDQrilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICDilIzilIDilIDilIDilIAN CiAg4pSCICdhIFBhcmFtLnQgICAgIC0+ICdhIENtZGxpbmVyLkFyZy5jb252DQogIOKUgiAnYSBB cmcudCAgICAgICAtPiAnYSBDbWRsaW5lci5UZXJtLnQNCiAg4pSCICdhIENvbW1hbmQudCAgIC0+ ICdhIENtZGxpbmVyLkNtZC50DQogIOKUlOKUgOKUgOKUgOKUgA0KDQoNCmNvcmUuY29tbWFuZA0K 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAg4pSM4pSA4pSA4pSA4pSA DQogIOKUgiAnYSBQYXJhbS50ICAgICAtPiAnYSBjb3JlLkNvbW1hbmQuQXJnX3R5cGUudA0KICDi lIIgJ2EgQXJnLnQgICAgICAgLT4gJ2EgY29yZS5Db21tYW5kLlBhcmFtLnQNCiAg4pSCIHVuaXQg Q29tbWFuZC50IC0+IGNvcmUuQ29tbWFuZC50DQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIOKApiB3 aGljaCBJIGludGVycHJldGVkIGFzIHN0YXRpbmcgdGhlIGZvbGxvd2luZyB0aGVvcmVtOg0KDQog ICAgICAgIFRoZXJlIGV4aXN0cyBhbiBhYnN0cmFjdGlvbiB0byBlbmNvZGUgT0NhbWwgQ0xJcyB0 aGF0DQogICAgICAgIGxpdmVzIGluIHRoZSBpbnRlcnNlY3Rpb24gb2Ygd2hhdCdzIGV4cHJlc3Np YmxlIGluIG90aGVyDQogICAgICAgIHdlbGwgZXN0YWJsaXNoZWQgbGlicmFyaWVzLg0KDQogICJP bmUgRURTTCB0byBjb21tYW5kIHRoZW0gYWxsLCIgc28gdG8gc3BlYWsuIEkgY291bGRuJ3QgcmVz aXN0IHRoZQ0KICB0ZW1wdGF0aW9uIHRvIGJ1aWxkIGFjdHVhbCB0ZXJtcyBmb3IgdGhlc2UgdHlw ZXMuIFRoYXQgZ2F2ZSBiaXJ0aCB0bw0KICBbY21kbGFuZ10uDQoNCiAgQXMgYSB0ZXN0LCBJIHN3 aXRjaGVkIG9uZSBvZiBteSBwcm9qZWN0cyB0byBgY21kbGFuZycsIHdpdGggYGNtZGxpbmVyJw0K ICBhcyBhIGJhY2tlbmQuIEkgbGlrZWQgdGhlIFtjaGFuZ2VzXSBJIG1hZGUgaW4gdGhlIHByb2Nl c3MuIFRoZSAxLWxpbmUNCiAgW2Jpbi9tYWluLm1sXSBpcyBub3cgdGhlIG9ubHkgcGxhY2UgdGhh dCBzcGVjaWZpZXMgd2hpY2ggYmFja2VuZCBJDQogIHdhbnQgdG8gdXNlOyB0aGUgcmVzdCBvZiB0 aGUgY29kZSBpcyBwcm9ncmFtbWVkIHNvbGVseSBhZ2FpbnN0IHRoZQ0KICBgY21kbGFuZycgQVBJ LiBUaGlzIG1lYW5zIEknbGwgYmUgYWJsZSB0byBlYXNpbHkgZXhwZXJpbWVudCB3aXRoDQogIGNv bXBpbGluZyBkb3duIHRvIGBjbGltYXRlJyBpbiB0aGUgZnV0dXJlLg0KDQogIEkgYW0gbm90IGFn YWluc3QgdGhlIG11bHRpcGxpY2l0eSBvZiBzb2x1dGlvbnMgaW4gZ2VuZXJhbCwgYnV0IEkgdGVu ZA0KICB0byBmZWVsIHVuZWFzeSB3aGVuIGluY29tcGF0aWJsZSBsaWJyYXJpZXMgZW1lcmdlLCBw YXJ0aXRpb25pbmcgdGhlDQogIGVjb3N5c3RlbS4gQXMgYSBjb21tdW5pdHksIHdlIGtub3cgdG9v IG1hbnkgZXhhbXBsZXMgb2YgdGhpcy4gSW4gdGhpcw0KICBpbnN0YW5jZSwgSSB3YW50IHRvIGNh bGwgdGhlIGBjb3JlLmNvbW1hbmQnIHZzIGBjbWRsaW5lcicgc2l0dWF0aW9uIGENCiAg4oCmIGNs aS12YWdlLg0KDQogIEkgZG9uJ3Qgc2VlIG15IHdvcmsgb24gYGNtZGxhbmcnIGFzIGNvbXBldGlu ZyB3aXRoIHRoZXNlIG90aGVyDQogIGxpYnJhcmllcy4gUXVpdGUgdGhlIGNvbnRyYXJ5LCBpdCBt YWtlcyBpdCBlYXNpZXIgZm9yIG1lIHRvIGV4cGVyaW1lbnQNCiAgd2l0aCB0aGVtIHdpdGhvdXQg bXVjaCBjaGFuZ2VzIHdoaWxlIGV4cGxvcmluZyB0aGUgc3ViamVjdCBvZiBDTEkgaW4NCiAgZ2Vu ZXJhbC4gQWxzbywgYXMgYSBsaWJyYXJ5IGF1dGhvciwgaWYgeW91IHdpc2ggdG8gZXhwb3NlIENM SSBoZWxwZXJzDQogIHRvIHlvdXIgdXNlcnMsIGEgbGlicmFyeSBsaWtlIGBjbWRsYW5nJyB3aWxs IGdpdmUgeW91IGEgcGxlYXNhbnQgd2F5DQogIHRvIGRvIHNvLCBhcyB5b3UgY2FuIGV4cHJlc3Mg eW91ciBoZWxwZXJzIHdpdGggaXQsIGtub3dpbmcgeW91ciB1c2Vycw0KICB3aWxsIGhhdmUgdGhl IGNob2ljZSB0byB0cmFuc2xhdGUgdGhlbSB0byB0aGUgYmFja2VuZCBvZiB0aGVpciBjaG9pY2Uu DQoNCiAgQmVmb3JlIHdyaXRpbmcgdGhpcyBwb3N0LCBJIGhhZCBhIHZlcnkgcGxlYXNhbnQgY2hh dCB3aXRoIEBncmlkYnVncy4gSQ0KICB3YW50IHRvIG1ha2UgaXQgY2xlYXIgdGhhdCBJIGRvIG5v dCB0aGluayBgY21kbGFuZycgaXMgY29tcGV0aW5nIHdpdGgNCiAgYGNsaW1hdGUnIGVpdGhlci4g SSB0aGluayBgY2xpbWF0ZScgaXMgYSB2ZXJ5IHByb21pc2luZyBsaWJyYXJ5IGFuZCBJDQogIGJl bGlldmUgaXQgd2lsbCwgaW4gZHVlIHRpbWUsIGRlbGl2ZXIgYXV0by1jb21wbGV0aW9uIHRvIG1h bnkgLSB0aGlzDQogIGhhcyBiZWVuIGEgaGlnaGx5IGFudGljaXBhdGVkIGZlYXR1cmUgd2l0aGlu IHRoZSBjb21tdW5pdHkuIEkgd2lzaCB0bw0KICBkZWRpY2F0ZSB0aGUgaW5pdGlhbCB3b3JrIHRo YXQgSSBkaWQgb24gYGNtZGxhbmcnIHRvIEBncmlkYnVncyBkdWUgdG8NCiAgdGhlIGltcGFjdGZ1 bCBpbmZsdWVuY2UgY2xpbWF0ZSBoYWQgb24gbXkgd29yaywgYW5kIGhvdyBpdCBoZWxwZWQgbWUN CiAgaW1wcm92ZSBteSBnZW5lcmFsIHVuZGVyc3RhbmRpbmcgb2YgZGVjbGFyYXRpdmUgQ0xJIGxp YnJhcmllcy4NCg0KICBUaGVzZSBhcmUgdmVyeSBlYXJseSBkYXlzIGZvciBgY21kbGFuZycuIFRo ZXJlIGFyZSBzdGlsbCBhcmVhcyBJIGFtDQogIGZ1enp5IG9uLCBhbmQgSSBoYXZlbid0IHJlYWxs eSB2YWxpZGF0ZWQgdGhlIHdob2xlIGRlc2lnbiB5ZXQuIEkgaGF2ZQ0KICBwdXQgc29tZSB0aG91 Z2h0cyBpbiB0aGlzIFtGdXR1cmUgUGxhbnNdIHBhZ2UuIE9uZSB0aGluZyB0aGF0IEkgZGlkDQog IG5vdCBpbml0aWFsbHkgaW5jbHVkZSB0aGVyZSB3b3VsZCBiZSB0byBleHBsb3JlIHRoZSBmZWFz aWJpbGl0eSBvZg0KICB3cml0aW5nIGEgbWluaS1jb21waWxlciBmb3IgYGNtZGxhbmcnIHRhcmdl dGluZyBgc3RkbGliLmFyZycgYXMgYQ0KICBydW5uZXIuIEkgYW0gbm90IHN1cmUgaG93IG11Y2gg eW91J2QgZW5kIHVwIHJlc3RyaWN0aW5nIGBjbWRsYW5nJyBmb3INCiAgdGhpcyB0byB3b3JrLiBJ IHRob3VnaHQgdGhhdCdkIGJlIGEgZnVuIHByb2plY3QgdG8gdGFja2xlIGF0IGEgZnV0dXJlDQog IHBvaW50LCBhcyBpdCB3b3VsZCBtYWtlIGEgbmljZSBhZGRpdGlvbiB0byB0aGUgb3ZlcmFsbCBh cmNoaXRlY3R1cmUgb2YNCiAgdGhlIHByb2plY3QuDQoNCiAgSSdkIHdlbGNvbWUgeW91ciBpbnB1 dCB0byBoZWxwIG1lIHNoYXBlIHRoZSBmdXR1cmUgb2YgYGNtZGxhbmcnIGlmIHlvdQ0KICBoYXZl IGFuIGludGVyZXN0IGluIHRoaXMgcHJvamVjdC4NCg0KICBUaGFua3MgZm9yIHJlYWRpbmchDQoN Cg0KW2NtZGxhbmddIDxodHRwczovL2dpdGh1Yi5jb20vbWJhcmJpbi9jbWRsYW5nPg0KDQpbY2hh bmdlc10gPGh0dHBzOi8vZ2l0aHViLmNvbS9tYmFyYmluL2JvcGtpdC9wdWxsLzE0Pg0KDQpbYmlu L21haW4ubWxdIDxodHRwczovL2dpdGh1Yi5jb20vbWJhcmJpbi9ib3BraXQvYmxvYi9tYWluL2Jp bi9tYWluLm1sPg0KDQpbRnV0dXJlIFBsYW5zXQ0KPGh0dHBzOi8vbWJhcmJpbi5naXRodWIuaW8v Y21kbGFuZy9kb2NzL2V4cGxhbmF0aW9uL2Z1dHVyZV9wbGFucy8+DQoNCg0KemFyciB2MC4xLjAN CuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6IDxodHRwczov L2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXphcnItdjAtMS0wLzE1MjU5LzE+DQoNCg0Kem9qNjEz IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSADQoNCiAgSGkgZXZlcnlvbmUsIEknZCBsaWtlIHRvIGFubm91bmNlIHRoZSBmaXJzdCByZWxl YXNlIG9mIGB6YXJyJywgYW4NCiAgT2NhbWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIFtaYXJyIHZl cnNpb24gMyBzdG9yYWdlIGZvcm1hdA0KICBzcGVjaWZpY2F0aW9uXSBmb3IgY2h1bmtlZCAmIGNv bXByZXNzZWQgbXVsdGktZGltZW5zaW9uYWwgYXJyYXlzLA0KICBkZXNpZ25lZCBmb3IgdXNlIGlu IHBhcmFsbGVsIGNvbXB1dGluZy4NCg0KICA8aHR0cHM6Ly96YXJyLXNwZWNzLnJlYWR0aGVkb2Nz LmlvL2VuL2xhdGVzdC9faW1hZ2VzL3Rlcm1pbm9sb2d5LWhpZXJhcmNoeS5leGNhbGlkcmF3LnBu Zz4NCg0KDQpbWmFyciB2ZXJzaW9uIDMgc3RvcmFnZSBmb3JtYXQgc3BlY2lmaWNhdGlvbl0NCjxo dHRwczovL3phcnItc3BlY3MucmVhZHRoZWRvY3MuaW8vZW4vbGF0ZXN0L3YzL2NvcmUvdjMuMC5o dG1sPg0KDQp3aHk/DQrilYzilYzilYzilYwNCg0KICBUaGUgcHJvamVjdCB3YXMgbWFpbmx5IGlu c3BpcmVkIGJ5IHRoZSBsYWNrIG9mIGZ1bmN0aW9uYWwgcHJvZ3JhbW1pbmcNCiAgbGFuZ3VhZ2Ug aW1wbGVtZW50YXRpb25zIG9mIHRoaXMgc3BlY2lmaWNhdGlvbiBhcyBzaG93biBpbiB0aGlzDQog IFtpbXBsZW1lbnRhdGlvbnMgdGFibGVdLiBTaW5jZSBJIGhhdmUgYmVlbiBsZWFybmluZyBPQ2Ft bCB0aGVzZSBwYXN0DQogIGZldyBtb250aHMgSSBmaWd1cmVkIEknZCB0YWtlIG9uIHRoZSBjaGFs bGVuZ2Ugb2YgcHJvZHVjaW5nIHRoZSBmaXJzdA0KICBmdW5jdGlvbmFsIHByb2dyYW1taW5nIGlt cGxlbWVudGF0aW9uIG9mIFphcnIsIGFuZCBpdCB3YXMgYSBncmVhdA0KICBsZWFybmluZyBleHBl cmllbmNlIQ0KDQoNCltpbXBsZW1lbnRhdGlvbnMgdGFibGVdIDxodHRwczovL3phcnIuZGV2L2lt cGxlbWVudGF0aW9ucy8+DQoNCg0KRmVhdHVyZXMNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0K DQogIOKAoiBTdXBwb3J0cyBjcmVhdGluZyBuLWRpbWVuc2lvbmFsIFphcnIgYXJyYXlzIGFuZCBj aHVua2luZyB0aGVtIGFsb25nDQogICAgYW55IGRpbWVuc2lvbi4NCiAg4oCiIENvbXByZXNzIGFy cmF5IGNodW5rcyB1c2luZyBhIHZhcmlldHkgb2Ygc3VwcG9ydGVkIGNvbXByZXNzaW9uDQogICAg Y29kZWNzLg0KICDigKIgU3VwcG9ydHMgaW5kZXhpbmcgb3BlcmF0aW9ucyB0byByZWFkL3dyaXRl IHZpZXdzIG9mIGEgWmFyciBhcnJheS4NCiAg4oCiIFN1cHBvcnRzIHN0b3JpbmcgYXJyYXlzIGlu LW1lbW9yeSBvciB0aGUgbG9jYWwgZmlsZXN5c3RlbS4gSXQgaXMNCiAgICBhbHNvIGV4dGVuc2li bGUsIGFsbG93aW5nIHVzZXJzIHRvIGVhc2lseSBjcmVhdGUgYW5kIHVzZSB0aGVpciBvd24NCiAg ICBjdXN0b20gc3RvcmFnZSBiYWNrZW5kcy4gU2VlIHRoZSBleGFtcGxlIGltcGxlbWVudGluZyBh IFtaaXAgZmlsZQ0KICAgIHN0b3JlXSBmb3IgbW9yZSBkZXRhaWxzLg0KICDigKIgU3VwcG9ydHMg Ym90aCBzeW5jaHJvbm91cyBhbmQgY29uY3VycmVudCBJL08gdmlhIGBMd3QnIGFuZCBgRWlvJy4N CiAg4oCiIExldmVyYWdlcyB0aGUgc3Ryb25nIHR5cGUgc3lzdGVtIG9mIE9jYW1sIHRvIGNyZWF0 ZSBhIHR5cGUtc2FmZSBBUEk7DQogICAgbWFraW5nIGl0IGltcG9zc2libGUgdG8gY3JlYXRlLCBy ZWFkIG9yIHdyaXRlIG1hbGZvcm1lZCBhcnJheXMuDQogIOKAoiBTdXBwb3J0cyBvcmdhbml6aW5n IGFycmF5cyBpbnRvIGhpZXJhcmNoaWVzIHVzaW5nIFtHcm91cHNdLg0KDQoNCltaaXAgZmlsZSBz dG9yZV0NCjxodHRwczovL2dpdGh1Yi5jb20vem9qNjEzL3phcnItbWwvYmxvYi9tYWluL2V4YW1w bGVzL2lubWVtb3J5X3ppcHN0b3JlLm1sPg0KDQpbR3JvdXBzXQ0KPGh0dHBzOi8vemFyci1zcGVj cy5yZWFkdGhlZG9jcy5pby9lbi9sYXRlc3QvdjMvY29yZS92My4wLmh0bWwjZ3JvdXA+DQoNCg0K RXhhbXBsZQ0K4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgQmVsb3cgaXMgYSBkZW1vIG9mIHRo ZSBsaWJyYXJ5J3MgQVBJIGZvciBjcmVhdGluZywgcmVhZGluZyBhbmQgd3JpdGluZw0KICB0byBh IFphcnIgaGllcmFyY2h5Lg0KICDilIzilIDilIDilIDilIANCiAg4pSCIG9wZW4gWmFycg0KICDi lIIgb3BlbiBaYXJyLk1ldGFkYXRhDQogIOKUgiBvcGVuIFphcnIuTm9kZQ0KICDilIIgb3BlbiBa YXJyLkNvZGVjcw0KICDilIIgb3BlbiBaYXJyLkluZGV4aW5nDQogIOKUgiBvcGVuIFphcnJfc3lu Yy5TdG9yYWdlDQogIOKUgiAoKiBvcGVucyBpbmZpeCBvcGVyYXRvcnMgPj49IGFuZCA+PnwgZm9y IG1vbmFkaWMgYmluZCAmIG1hcCAqKQ0KICDilIIgb3BlbiBGaWxlc3l0ZW1TdG9yZS5EZWZlcnJl ZC5JbmZpeA0KICDilIIgDQogIOKUgiBsZXQgc3RvcmUgPSBGaWxlc3lzdGVtU3RvcmUuY3JlYXRl ICJ0ZXN0ZGF0YS56YXJyIiBpbg0KICDilIIgbGV0IGdyb3VwX25vZGUgPSBHcm91cE5vZGUub2Zf cGF0aCAiL3NvbWUvZ3JvdXAiIGluDQogIOKUgiBGaWxlc3lzdGVtU3RvcmUuY3JlYXRlX2dyb3Vw IHN0b3JlIGdyb3VwX25vZGU7DQogIOKUgiBsZXQgYXJyYXlfbm9kZSA9IEFycmF5Tm9kZS4oZ3Jv dXBfbm9kZSAvICJuYW1lIik7Ow0KICDilIIgKCogY3JlYXRlcyBhbiBhcnJheSB3aXRoIGNoYXIg ZGF0YSB0eXBlIGFuZCBmaWxsIHZhbHVlICc/JyAqKQ0KICDilIIgRmlsZXN5c3RlbVN0b3JlLmNy ZWF0ZV9hcnJheQ0KICDilIIgICB+Y29kZWNzOltgVHJhbnNwb3NlIFt8MjsgMDsgMXxdOyBgQnl0 ZXMgQkU7IGBHemlwIEwyXQ0KICDilIIgICB+c2hhcGU6W3wxMDA7IDEwMDsgNTB8XQ0KICDilIIg ICB+Y2h1bmtzOlt8MTA7IDE1OyAyMHxdDQogIOKUgiAgIE5kYXJyYXkuQ2hhciANCiAg4pSCICAg Jz8nDQogIOKUgiAgIGFycmF5X25vZGUNCiAg4pSCICAgc3RvcmU7DQogIOKUgiBsZXQgc2xpY2Ug PSBbfFIgW3wwOyAyMHxdOyBJIDEwOyBSIFt8fF18XSBpbg0KICDilIIgbGV0IHggPSBGaWxlc3lz dGVtU3RvcmUucmVhZF9hcnJheSBzdG9yZSBhcnJheV9ub2RlIHNsaWNlIE5kYXJyYXkuQ2hhciBp bg0KICDilIIgKCogRG8gc29tZSBjb21wdXRhdGlvbiBvbiB0aGUgYXJyYXkgc2xpY2UgKikNCiAg 4pSCIGxldCB4JyA9IFphcnIuTmRhcnJheS5tYXAgKGZ1biBfIC0+IFJhbmRvbS5pbnQgMjU2IHw+ IENoYXIuY2hyKSB4IGluDQogIOKUgiBGaWxlc3lzdGVtU3RvcmUud3JpdGVfYXJyYXkgc3RvcmUg YXJyYXlfbm9kZSBzbGljZSB4JzsNCiAg4pSCIGxldCB5ID0gRmlsZXN5c3RlbVN0b3JlLnJlYWRf YXJyYXkgc3RvcmUgYXJyYXlfbm9kZSBzbGljZSBOZGFycmF5LkNoYXIgaW4NCiAg4pSCIGFzc2Vy dCAoTmRhcnJheS5lcXVhbCB4JyB5KTsNCiAg4pSU4pSA4pSA4pSA4pSADQoNCg0KSW5zdGFsbGF0 aW9uDQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBUaGUgbGlicmFy eSBjb21lcyBpbiBzZXZlcmFsIGZsYXZvcnMgZGVwZW5kaW5nIG9uIHRoZSBzeW5jaHJvbm91cyAv DQogIGFzeW5jaHJvbm91cyBiYWNrZW5kIG9mIGNob2ljZS4gVG8gaW5zdGFsbCB0aGUgc3luY2hy b25vdXMgQVBJLCB1c2UNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiAkIG9wYW0gaW5zdGFsbCB6 YXJyLXN5bmMNCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgVG8gaW5zdGFsbCB6YXJyIHdpdGggYW4g YXN5bmNocm9ub3VzIEFQSSBwb3dlcmVkIGJ5IGBMd3QnIG9yIGBFaW8nLA0KICB1c2UNCiAg4pSM 4pSA4pSA4pSA4pSADQogIOKUgiAkIG9wYW0gaW5zdGFsbCB6YXJyLWx3dA0KICDilIIgJCBvcGFt IGluc3RhbGwgemFyci1laW8NCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgVGhlIGRvY3VtZW50YXRp b24gY2FuIGJlIGZvdW5kIFtoZXJlXSBhbmQgdGhlIHNvdXJjZSBjb2RlIFt0aGVyZV0NCg0KICBJ J20gaGFwcHkgdG8gYW5zd2VyIGFueSBxdWVzdGlvbnMgcmVnYXJkaW5nIHRoZSBsaWJyYXJ5IGFu ZCBtb3JlIHRoYW4NCiAgd2VsY29tZSBzdWdnZXN0aW9ucyBmb3IgaW1wcm92ZW1lbnRzIChlc3Bl Y2lhbGx5IHBlcmZvcm1hbmNlISksIGlzc3VlDQogIHJlcG9ydHMgYXMgd2VsbCBhcyBQUidzLg0K DQoNCltoZXJlXSA8aHR0cHM6Ly96b2o2MTMuZ2l0aHViLmlvL3phcnItbWwvPg0KDQpbdGhlcmVd IDxodHRwczovL2dpdGh1Yi5jb20vem9qNjEzL3phcnItbWw+DQoNCg0KQnJyIDAuMC43DQrilZDi lZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOiA8aHR0cHM6Ly9kaXNjdXNzLm9j YW1sLm9yZy90L2Fubi1icnItMC0wLTcvMTUyNjMvMT4NCg0KDQpEYW5pZWwgQsO8bnpsaSBhbm5v dW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFRoZXJlJ2EgbmV3IHJlbGVhc2Ugb2YgW0Jycl0sIGFu IElTQyBsaWNlbmNlZCB0b29sa2l0IGZvciBwcm9ncmFtbWluZw0KICBicm93c2VycyB3aXRoIHRo ZSBganNfb2Zfb2NhbWwnIGNvbXBpbGVyLg0KDQogIFRoaXMgcmVsZWFzZSBoYXMgc29tZSBjaGFu Z2VzIHRvIHN1cHBvcnQgd29yayBiZWluZyBkb25lIGZvcg0KICBgd2FzbV9vZl9vY2FtbCc7IHRo YW5rcyB0byBAdm91aWxsb24gZm9yIGhpcyBwYXRjaGVzLiBUaGVyZSBhcmUgYWxzbw0KICBvdGhl ciBzbWFsbCBmaXhlcyBhbmQgYWRkaXRpb25zLCBjb25zdWx0IHRoZSBbcmVsZWFzZSBub3Rlc10g Zm9yIHRoZQ0KICBkZXRhaWxzIGFuZCB0aGFua3MgdG8gYWxsIHRoZSBjb250cmlidXRvcnMuDQoN CiAgQSBiaWcgdGhhbmtzIHRvIG15IFtkb25hdG9yc10gZm9yIHN1cHBvcnRpbmcgbXkgd29yay4g SSB3ZWxjb21lIHRoZQ0KICAobm90IHNvW14xXSkgbmV3IGRvbmF0b3IgW1RhcmlkZXNdLg0KDQog IFtIb21lIHBhZ2VdLCBbRG9jcyBhbmQgbWFudWFsc10gb3IgYG9kaWcgZG9jIGJycicNCg0KICBJ bnN0YWxsOiBgb3BhbSBpbnN0YWxsIGJycicgKFtQUl0pDQoNCiAgQmVzdCwNCg0KICBEYW5pZWwN Cg0KICBbXjFdOiBUYXJpZGVzIGhhcyBiZWVuIC9nZW5lcm91c2x5LyBkb25hdGluZyBmb3IgbXkg d29yayBmcm9tIHRoZQ0KICBvbnNldCBidXQgdXNlZCB0byBkbyBpdCB2aWEgdGhlIFtNaXJhZ2Vd IG9yZ2FuaXNhdGlvbi4NCg0KDQpbQnJyXSA8aHR0cHM6Ly9lcnJhdGlxdWUuY2gvc29mdHdhcmUv YnJyPg0KDQpbcmVsZWFzZSBub3Rlc10NCjxodHRwczovL2dpdGh1Yi5jb20vZGJ1ZW56bGkvYnJy L2Jsb2IvZjlmNGRlNWM5Mzg1Y2ViODAxNjRjMDQzOTQzZTNhMmQ2NWU1NzdjMy9DSEFOR0VTLm1k I3YwMDctMjAyNC0wOS0wOS16YWdyZWI+DQoNCltkb25hdG9yc10gPGh0dHBzOi8vZ2l0aHViLmNv bS9zcG9uc29ycy9kYnVlbnpsaT4NCg0KW1RhcmlkZXNdIDxodHRwczovL3RhcmlkZXMuY29tLz4N Cg0KW0hvbWUgcGFnZV0gPGh0dHBzOi8vZXJyYXRpcXVlLmNoL3NvZnR3YXJlL2Jycj4NCg0KW0Rv Y3MgYW5kIG1hbnVhbHNdIDxodHRwczovL2VycmF0aXF1ZS5jaC9zb2Z0d2FyZS9icnIvZG9jLz4N Cg0KW1BSXSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29wYW0tcmVwb3NpdG9yeS9wdWxsLzI2 NTE3Pg0KDQpbTWlyYWdlXSA8aHR0cHM6Ly9naXRodWIuY29tL21pcmFnZT4NCg0KDQpPY3NpZ2Vu IFNlcnZlciA2LjAuMA0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2Ft bC5vcmcvdC9hbm4tb2NzaWdlbi1zZXJ2ZXItNi0wLTAvMTUyNjUvMT4NCg0KDQpWaW5jZW50IEJh bGF0IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgV2UncmUgZGVsaWdodGVkIHRvIGFubm91 bmNlIGEgbWFqb3IgbmV3IHZlcnNpb24gb2YgT2NzaWdlbiBTZXJ2ZXIhDQogIFRoaXMgdmVyc2lv biA2LjAuMCBmb2N1c2VzIG9uIHRoZSB1c2Ugb2YgT2NzaWdlbiBTZXJ2ZXIgYXMgYSBsaWJyYXJ5 LA0KICB3aXRob3V0IGFueSBjb25maWd1cmF0aW9uIGZpbGUsIHdoaWNoIGlzIG5vdyBtdWNoIGVh c2llciBhbmQgYnJpbmdzDQogIHRoZSBleGFjdCBzYW1lIGZlYXR1cmVzIGFzIHRoZSBleGVjdXRh YmxlLg0KDQogICpFeGFtcGxlIG9mIHVzZToqDQoNCiAgVG8gYWRkIGEgV2ViIHNlcnZlciB0byB5 b3VyIE9DYW1sIHByb2dyYW0sIHNlcnZpbmcgc3RhdGljIGZpbGVzIGZyb20NCiAgZGlyZWN0b3J5 IGBzdGF0aWNgOg0KICDilIzilIDilIDilIDilIANCiAg4pSCIGxldCBfID0gT2NzaWdlbl9zZXJ2 ZXIuc3RhcnQgDQogIOKUgiAgICAgICAgICAgWyBPY3NpZ2VuX3NlcnZlci5ob3N0IFtTdGF0aWNt b2QucnVuIH5kaXI6InN0YXRpYyIgKCldXQ0KICDilJTilIDilIDilIDilIANCg0KICBJbnN0YWxs Og0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgb3BhbSBpbnN0YWxsIG9jc2lnZW5zZXJ2ZXIN CiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgRXhhbXBsZSBvZiBEdW5lIGZpbGUgZm9yIHRoaXMgcHJv Z3JhbToNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiAoZXhlY3V0YWJsZQ0KICDilIIgIChwdWJs aWNfbmFtZSBteXByb2plY3QpDQogIOKUgiAgKG5hbWUgbWFpbikNCiAg4pSCICAobGlicmFyaWVz DQogIOKUgiAgIG1haW4NCiAg4pSCICAgb2NzaWdlbnNlcnZlcg0KICDilIIgICBvY3NpZ2Vuc2Vy dmVyLmV4dC5zdGF0aWNtb2QpKQ0KICDilJTilIDilIDilIDilIANCg0KICBDb21waWxlIHdpdGg6 DQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgZHVuZSBidWlsZA0KICDilJTilIDilIDilIDilIAN Cg0KICBPY3NpZ2VuIFNlcnZlciBjYW4gb2YgY291cnNlIHN0aWxsIGJlIHVzZWQgYXMgYW4gZXhl Y3V0YWJsZSB0YWtpbmcgaXRzDQogIGNvbmZpZ3VyYXRpb24gZnJvbSBhIGZpbGUuIFRoaXMgYWxs b3dzIGZvciBub24gT0NhbWwgZGV2ZWxvcGVycyB0byB1c2UNCiAgaXQgYW5kIG1ha2UgdGhlaXIg b3duIGNvbmZpZ3VyYXRpb25zLiBJdCBhbHNvIG1ha2VzIGl0IHBvc3NpYmxlIHRvDQogIGRpc3Ry aWJ1dGUgYSBiaW5hcnkgdmVyc2lvbiBvZiB5b3VyIFdlYiBhcHBsaWNhdGlvbnMuDQoNCiAgT2Nz aWdlbiBTZXJ2ZXIgaXMgYnVpbGQgaW4gbW9kdWxhciBhbmQgZXh0ZW5zaWJsZSB3YXkuIFRoZSBk ZWZhdWx0DQogIG9wYW0gcGFja2FnZXMgY29tZXMgd2l0aCBzZXZlcmFsIGV4dGVuc2lvbnMuIElu IHRoZSBleGFtcGxlIGFib3ZlLCB3ZQ0KICBhcmUgdXNpbmcgU3RhdGljbW9kIGZvciBzZXJ2aW5n IHN0YXRpYyBmaWxlcy4gT3RoZXIgZXh0ZW5zaW9ucyBtYWtlcw0KICBpdCBwb3NzaWJsZSBmb3Ig ZXhhbXBsZSB0byBjb25maWd1cmUgcmVkaXJlY3Rpb25zLCB0byBjb250cm9sIHRoZQ0KICBhY2Nl c3MgdG8gc29tZSBzdWItZGlyZWN0b3J5LCB0byB1c2UgYSByZXZlcnNlIHByb3h5LCB0byByZXdy aXRlIHRoZQ0KICByZXF1ZXN0LCBjb21wcmVzcyB0aGUgb3V0cHV0IGV0Yy4NCg0KICBUaGUgcHJv Z3JhbW1pbmcgaW50ZXJmYWNlIGZvbGxvd3MgZXhhY3RseSB0aGUgc3RydWN0dXJlIG9mIHRoZQ0K ICBjb25maWd1cmF0aW9uIGZpbGU6IGluc3RydWN0aW9ucyBhcmUgdHJpZWQgaW4gb3JkZXIgdW50 aWwgb25lDQogIGdlbmVyYXRlcyBhIHJlc3VsdCwgdGhlbiBzb21lIG90aGVyIGluc3RydWN0aW9u cyBjYW4gYmUgdXNlZCB0byBjaGFuZ2UNCiAgdGhlIHJlc3VsdCAobGlrZSBjb21wcmVzc2luZyBp dCBvciBhZGRpbmcgc29tZSBoZWFkZXJzKS4NCg0KICBIZXJlIGlzIGEgbW9yZSBjb21wbGV4IGV4 YW1wbGUgb2YgY29uZmlndXJhdGlvbjoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBsZXQgXyA9 DQogIOKUgiAgIE9jc2lnZW5fc2VydmVyLnN0YXJ0DQogIOKUgiAgICAgfnBvcnRzOltgQWxsLCA4 MDgwXQ0KICDilIIgICAgIH5jb21tYW5kX3BpcGU6ImxvY2FsL3Zhci9ydW4vbXlzaXRlLWNtZCIN CiAg4pSCICAgICB+bG9nZGlyOiJsb2NhbC92YXIvbG9nL215c2l0ZSINCiAg4pSCICAgICB+ZGF0 YWRpcjoibG9jYWwvdmFyL2RhdGEvbXlzaXRlIg0KICDilIIgICAgIH5kZWZhdWx0X2NoYXJzZXQ6 KFNvbWUgInV0Zi04IikNCiAg4pSCICAgICBbIE9jc2lnZW5fc2VydmVyLmhvc3QNCiAg4pSCICAg ICAgICAgfnJlZ2V4cDoibXlkb21haW4uY29tIg0KICDilIIgICAgICAgICBbIE9jc2lnZW5fc2Vy dmVyLnNpdGUgWyJzdWJzaXRlIl0NCiAg4pSCICAgICAgICAgICAgIFsgQWNjZXNzY29udHJvbC4o DQogIOKUgiAgICAgICAgICAgICAgICAgaWZfDQogIOKUgiAgICAgICAgICAgICAgICAgICAoYW5k Xw0KICDilIIgICAgICAgICAgICAgICAgICAgICAgWyBpcCAiMTIyLjEyMi4xMjIuMTIyIg0KICDi lIIgICAgICAgICAgICAgICAgICAgICAgOyBoZWFkZXIgfm5hbWU6InVzZXItYWdlbnQiIH5yZWdl eHA6Ii4qRm9vQmFyLioiDQogIOKUgiAgICAgICAgICAgICAgICAgICAgICA7IG1ldGhvZF8gYFBP U1QgXSkNCiAg4pSCICAgICAgICAgICAgICAgICAgIFtmb3JiaWRkZW5dIFtdKQ0KICDilIIgICAg ICAgICAgICAgOyBBdXRoYmFzaWMucnVuIH5yZWFsbToibXlyZWFsbSINCiAg4pSCICAgICAgICAg ICAgICAgICB+YXV0aDooZnVuIF91IHAgLT4gTHd0LnJldHVybiAocCA9ICJ0b3RvIikpDQogIOKU giAgICAgICAgICAgICAgICAgKCkNCiAg4pSCICAgICAgICAgICAgIDsgU3RhdGljbW9kLnJ1biB+ ZGlyOiJsb2NhbC92YXIvd3d3L290aGVyZGlyIiAoKSBdDQogIOKUgiAgICAgICAgIDsgT2NzaWdl bl9zZXJ2ZXIuc2l0ZSBbIm90aGVyc3Vic2l0ZSJdDQogIOKUgiAgICAgICAgICAgICBbIFJldnBy b3h5LnJ1bg0KICDilIIgICAgICAgICAgICAgICAgIH5yZWRpcmVjdGlvbjoNCiAg4pSCICAgICAg ICAgICAgICAgICAgIChSZXZwcm94eS5jcmVhdGVfcmVkaXJlY3Rpb24gfmZ1bGxfdXJsOmZhbHNl IH5yZWdleHA6IiguKikiDQogIOKUgiAgICAgICAgICAgICAgICAgICAgICB+a2VlcGhvc3Q6dHJ1 ZSAiaHR0cDovL2xvY2FsaG9zdDo4ODg4L1xcMSIpDQogIOKUgiAgICAgICAgICAgICAgICAgKCkg XQ0KICDilIIgICAgICAgICA7IFJlZGlyZWN0bW9kLnJ1bg0KICDilIIgICAgICAgICAgICAgfnJl ZGlyZWN0aW9uOg0KICDilIIgICAgICAgICAgICAgICAoUmVkaXJlY3Rtb2QuY3JlYXRlX3JlZGly ZWN0aW9uIH5mdWxsX3VybDpmYWxzZSB+cmVnZXhwOiJvbGQoLiopIg0KICDilIIgICAgICAgICAg ICAgICAgICAibmV3XFwxIikNCiAg4pSCICAgICAgICAgICAgICgpDQogIOKUgiAgICAgICAgIDsg U3RhdGljbW9kLnJ1biB+ZGlyOiJsb2NhbC92YXIvd3d3L3N0YXRpY2RpciIgKCkNCiAg4pSCICAg ICAgICAgOyBDb3JzLnJ1biB+bWF4X2FnZTo4NjQwMCB+Y3JlZGVudGlhbHM6dHJ1ZSB+bWV0aG9k czpbYFBPU1Q7IGBHRVQ7IGBIRUFEXQ0KICDilIIgICAgICAgICAgICAgfmV4cG9zZWRfaGVhZGVy czoNCiAg4pSCICAgICAgICAgICAgICAgWyAieC1lbGlvbS1hcHBsaWNhdGlvbiINCiAg4pSCICAg ICAgICAgICAgICAgOyAieC1lbGlvbS1sb2NhdGlvbiINCiAg4pSCICAgICAgICAgICAgICAgOyAi eC1lbGlvbS1zZXQtcHJvY2Vzcy1jb29raWVzIg0KICDilIIgICAgICAgICAgICAgICA7ICJ4LWVs aW9tLXNldC1jb29raWUtc3Vic3RpdHV0ZXMiIF0NCiAg4pSCICAgICAgICAgICAgICgpDQogIOKU giAgICAgICAgIDsgRGVmbGF0ZW1vZC5ydW4NCiAg4pSCICAgICAgICAgICAgIH5tb2RlOg0KICDi lIIgICAgICAgICAgICAgICAoYE9ubHkNCiAg4pSCICAgICAgICAgICAgICAgICBbIGBUeXBlIChT b21lICJ0ZXh0IiwgU29tZSAiaHRtbCIpDQogIOKUgiAgICAgICAgICAgICAgICAgOyBgVHlwZSAo U29tZSAidGV4dCIsIFNvbWUgImphdmFzY3JpcHQiKQ0KICDilIIgICAgICAgICAgICAgICAgIDsg YFR5cGUgKFNvbWUgInRleHQiLCBTb21lICJjc3MiKQ0KICDilIIgICAgICAgICAgICAgICAgIDsg YFR5cGUgKFNvbWUgImFwcGxpY2F0aW9uIiwgU29tZSAiamF2YXNjcmlwdCIpDQogIOKUgiAgICAg ICAgICAgICAgICAgOyBgVHlwZSAoU29tZSAiYXBwbGljYXRpb24iLCBTb21lICJ4LWphdmFzY3Jp cHQiKQ0KICDilIIgICAgICAgICAgICAgICAgIDsgYFR5cGUgKFNvbWUgImFwcGxpY2F0aW9uIiwg U29tZSAieGh0bWwreG1sIikNCiAg4pSCICAgICAgICAgICAgICAgICA7IGBUeXBlIChTb21lICJp bWFnZSIsIFNvbWUgInN2Zyt4bWwiKQ0KICDilIIgICAgICAgICAgICAgICAgIDsgYFR5cGUgKFNv bWUgImFwcGxpY2F0aW9uIiwgU29tZSAieC1lbGlvbSIpIF0pDQogIOKUgiAgICAgICAgICAgICAo KSBdIF0NCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgSW4gdGhpcyBleGFtcGxlLCB0aGUgc2VydmVy IGRlZmluZXMgb25lIHZpcnR1YWwgaG9zdCBmb3IgZG9tYWluDQogIGBteWRvbWFpbi5jb20nLiBJ dCB3aWxsIGZpcnN0IGNoZWNrIHdoZXRoZXIgaXQgaXMgYSByZXF1ZXN0IGZvcg0KICBkaXJlY3Rv cnkgYHN1YnNpdGUvJywgYW5kIGlmIHllcywgd2lsbCByZWplY3QgdGhlIHJlcXVlc3Qgd2l0aCA0 MDMNCiAgRm9yYmlkZGVuIGlmIGl0IGlzIGEgUE9TVCByZXF1ZXN0IGNvbWluZyBmcm9tIHVzZXIt YWdlbnQgYEZvb0JhcicgYXQNCiAgSVAgMTIyLjEyMi4xMjIuMTIyLiBJZiBub3QsIGl0IHdpbGwg YXNrIGZvciBhIHBhc3N3b3JkIGJlZm9yZSBzZXJ2aW5nDQogIGZpbGVzIGZyb20gZGlyZWN0b3J5 IGBsb2NhbC92YXIvd3d3L290aGVyZGlyJy4gIFRoZW4gd2UgZGVmaW5lIGFub3RoZXINCiAgc3Vi c2l0ZSBgb3RoZXJzdWJzaXRlJyBmb3Igd2hpY2ggdGhlIHJlcXVlc3RzIHdpbGwgYmUgdHJhbnNm ZXJlZCB0bw0KICBhbm90aGVyIFdlYiBzZXJ2ZXIgcnVubmluZyBsb2NhbGx5IG9uIHBvcnQgODg4 OCwgdGhlbiByZXdyaXRlIHRoZQ0KICBhbnN3ZXIgbG9jYXRpb24gaGVhZGVyIGFjY29yZGluZ2x5 LiAgVGhlbiwgaWYgdGhlIHBhZ2UgaXMgc3RpbGwgbm90DQogIGdlbmVyYXRlZCwgdGhlIHNlcnZl ciB3aWxsIHNlbmQgYSByZWRpcmVjdGlvbiBpZiBVUkxzIHN0YXJ0cyB3aXRoDQogICJvbGQiLiAg T3RoZXJ3aXNlLCBpdCB3aWxsIHRyeSB0byBzZXJ2ZSBmaWxlcyBmcm9tIGRpcmVjdG9yeQ0KICBg bG9jYWwvdmFyL3d3dy9zdGF0aWNkaXInLiAgSWYgdGhlIHBhZ2UgaGFzIHN0aWxsIG5vdCBiZWVu IGZvdW5kLCBhDQogIGA0MDQgTm90IGZvdW5kJyB3aWxsIGJlIHNlbnQsIG90aGVyd2lzZSwgc29t ZSBDT1JTIGhlYWRlcnMgd2lsbCBiZQ0KICBhZGRlZCwgYW5kIHRoZSByZXN1bHQgd2lsbCBiZSBj b21wcmVzc2VkIGJlZm9yZSBiZWluZyBzZW50Lg0KDQogIENvbXBpbGUgdGhpcyBleGFtcGxlIHdp dGggdGhlIGZvbGxvd2luZyBkdW5lIGZpbGU6DQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgKGV4 ZWN1dGFibGUNCiAg4pSCICAocHVibGljX25hbWUgbXlzZXJ2ZXIpDQogIOKUgiAgKG5hbWUgbWFp bikNCiAg4pSCICAobGlicmFyaWVzDQogIOKUgiAgIG9jc2lnZW5zZXJ2ZXINCiAg4pSCICAgb2Nz aWdlbnNlcnZlci5leHQuc3RhdGljbW9kDQogIOKUgiAgIG9jc2lnZW5zZXJ2ZXIuZXh0LmF1dGhi YXNpYw0KICDilIIgICBvY3NpZ2Vuc2VydmVyLmV4dC5leHRlbmRjb25maWd1cmF0aW9uDQogIOKU giAgIG9jc2lnZW5zZXJ2ZXIuZXh0Lm91dHB1dGZpbHRlcg0KICDilIIgICBvY3NpZ2Vuc2VydmVy LmV4dC5jb3JzDQogIOKUgiAgIG9jc2lnZW5zZXJ2ZXIuZXh0LmFjY2Vzc2NvbnRyb2wNCiAg4pSC ICAgb2NzaWdlbnNlcnZlci5leHQuZGVmbGF0ZW1vZA0KICDilIIgICBvY3NpZ2Vuc2VydmVyLmV4 dC5yZWRpcmVjdG1vZA0KICDilIIgICBvY3NpZ2Vuc2VydmVyLmV4dC5yZXZwcm94eQ0KICDilIIg ICkpDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIEVsaW9tIGFuZCBPY3NpZ2VuIFN0YXJ0IGhhdmUg YWxzbyBiZWVuIHVwZGF0ZWQgZm9yIGJlaW5nIHVzZWQgd2l0aG91dA0KICBjb25maWd1cmF0aW9u IGZpbGUgYW5kIHdpbGwgYmUgcmVsZWFzZWQgdmVyeSBzb29uLg0KDQoNCmRyZWFtLWh0bWwgYW5k IHB1cmUtaHRtbA0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlz Y3Vzcy5vY2FtbC5vcmcvdC9hbm4tZHJlYW0taHRtbC1wdXJlLWh0bWwtMy01LTIvMTQ4MDgvND4N Cg0KDQpZYXdhciBBbWluIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgW0FOTl0gZHJlYW0taHRtbCAmIHB1 cmUtaHRtbCAzLjYuMSwgMy42LjINCg0KICBBIGRvdWJsZSBhbm5vdW5jZW1lbnQ6DQoNCiAgMy42 LjE6IHdoZW4gaW4gWE1MIHJlbmRlcmluZyBtb2RlLCBjb3JyZWN0bHkgcmVuZGVyIGVtcHR5LXZh bHVlDQogIGF0dHJpYnV0ZXMgYXMgaGF2aW5nIGFuIGVtcHR5IHN0cmluZyB2YWx1ZS4gVGhhbmtz IHRvIEBqb25zdGVybGluZyAhDQoNCiAgMy42LjI6IGF1dG9tYXRpY2FsbHkgc3dpdGNoIHRvIFhN TCByZW5kZXJpbmcgbW9kZSB3aGVuIHJlbmRlcmluZyBTVkcNCiAgYW5kIE1hdGhNTCB0YWdzIGlu c2lkZSBIVE1MIHJlbmRlcmluZyBtb2RlLg0KDQoNCkFkdmFuY2VkIENvZGUgTmF2aWdhdGlvbiBj b21pbmcgdG8gT0NhbWwtTFNQDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8 aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1hZHZhbmNlZC1jb2RlLW5hdmlnYXRpb24t Y29taW5nLXRvLW9jYW1sLWxzcC8xNTI2Ni8xPg0KDQoNClBpemllRHVzdCBhbm5vdW5jZWQNCuKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0K DQpKdW1wIHRvIFRhcmdldA0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWMDQoNCiAgQ3VycmVudGx5LCB0aGUgc3RhbmRhcmQgTFNQIHByb3RvY29sIG9ubHkgYWxsb3dz IGZvciBnZW5lcmFsaXplZCBjb2RlDQogIG5hdmlnYXRpb24gKGBnb3RvIGRlZmluaXRpb25gLCBg Z290byBkZWNsYXJhdGlvbmAsIGBnb3RvDQogIGltcGxlbWVudGF0aW9uYCwgYGdvdG8gdHlwZS1k ZWZpbml0aW9uYCksIHdoaWNoIGlzIG5vdCB2ZXJ5IHVzZWZ1bA0KICB3aGVuIGl0IGNvbWVzIHRv IHByZWNpc2UgbW92ZW1lbnRzLg0KDQogIENvbWluZyB0byBPQ2FtbC1sc3Agc29vbiB3aWxsIGJl IHRoZSBhYmlsaXR5IHRvIGp1bXAgZnJvbSBvbmUgcG9pbnQgaW4NCiAgeW91ciBjb2RlIHRvIGFu b3RoZXIgYmFzZWQgb24gW01lcmxpbidzIEp1bXBdIGNvbW1hbmQuDQoNCiAgSW1wbGVtZW50aW5n IHRoaXMgZnVuY3Rpb25hbGl0eSB0b29rIGEgYml0IG9mIHRoaW5raW5nIGFzIHdlIHdhbnRlZCBh DQogICBzb2x1dGlvbiB0aGF0IHdvcmtzIGZvciBhbGwgc3VwcG9ydGVkIGVkaXRvcnMgKFZzY29k ZSwgRW1hY3MgYW5kIFZpbSkNCiAgIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgc3BlY2lmaWMgY2xp ZW50IGltcGxlbWVudGF0aW9ucy4gIFdlIHVzZWQgYQ0KICAgY29tYmluYXRpb24gb2YgY2FsbCBh Y3Rpb25zIHBsdXMgdGhlIExTUCBzaG93RG9jdW1lbnRSZXF1ZXN0IHRvIG1vdmUNCiAgIHRoZSBj dXJzb3IgdG8gdGhlIGludGVyZXN0aW5nIHBvc2l0aW9uLg0KDQogIFRoZSBjYWxsIGFjdGlvbnMg ZGlzcGxheSBhcmUgY29udGV4dHVhbCBhbmQgd2lsbCBkaXNwbGF5IG9ubHkgaWYgaXQncw0KICBy ZWxldmFudCB0byB0aGUgY29kZSB1bmRlciB0aGUgY3Vyc29yLg0KDQogIEhlcmUgaXMgYSBkZW1v IGluIFZTQ29kZS4NCg0KICA8aHR0cHM6Ly9nbG9iYWwuZGlzY291cnNlLWNkbi5jb20vYnVzaW5l c3M3L3VwbG9hZHMvb2NhbWwvb3JpZ2luYWwvMlgvNi82MThiZmQ3N2RiMWE4OTI1NmVlZWFmNjli NmQzODE3ZGJmZGQ4ZGMwLmdpZj4NCg0KDQpbTWVybGluJ3MgSnVtcF0NCjxodHRwczovL2dpdGh1 Yi5jb20vb2NhbWwvbWVybGluL2Jsb2IvbWFpbi9kb2MvZGV2L1BST1RPQ09MLm1kI2p1bXAtLXRh cmdldC1zdHJpbmctLXBvc2l0aW9uLXBvc2l0aW9uPg0KDQoNCk90aGVyIE9DYW1sIE5ld3MNCuKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQpGcm9tIHRo ZSBvY2FtbC5vcmcgYmxvZw0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSGVyZSBhcmUgbGlua3MgZnJvbSBt YW55IE9DYW1sIGJsb2dzIGFnZ3JlZ2F0ZWQgYXQgW3RoZSBvY2FtbC5vcmcNCiAgYmxvZ10uDQoN CiAg4oCiIFtPdXRyZWFjaHkgTWF5IDIwMjQgRGVtb10NCiAg4oCiIFtGcmFtYS1DbGFuZyB2MC4w LjE2IGZvciBGcmFtYS1DIDI5LjAgQ29wcGVyXQ0KICDigKIgW0Vhc3kgRGVidWdnaW5nIGZvciBP Q2FtbCBXaXRoIExMREJdDQogIOKAoiBbR2V0dGluZyBTcGVjaWZpYzogQW5ub3VuY2luZyB0aGUg R29zcGVsIGFuZCBPcnRhYyBQcm9qZWN0c10NCiAg4oCiIFtVcGNvbWluZyBPQ2FtbCBFdmVudHMg KFNlcCAyMDI0IGFuZCBvbndhcmRzKV0NCg0KDQpbdGhlIG9jYW1sLm9yZyBibG9nXSA8aHR0cHM6 Ly9vY2FtbC5vcmcvYmxvZy8+DQoNCltPdXRyZWFjaHkgTWF5IDIwMjQgRGVtb10NCjxodHRwczov L3dhdGNoLm9jYW1sLm9yZy93L3BlVDNNZFdqUzFCWVlNYm93RUoxZ3Y+DQoNCltGcmFtYS1DbGFu ZyB2MC4wLjE2IGZvciBGcmFtYS1DIDI5LjAgQ29wcGVyXQ0KPGh0dHBzOi8vZnJhbWEtYy5jb20v aHRtbC9uZXdzLmh0bWwjMjAyNC0wOS0wNT4NCg0KW0Vhc3kgRGVidWdnaW5nIGZvciBPQ2FtbCBX aXRoIExMREJdDQo8aHR0cHM6Ly90YXJpZGVzLmNvbS9ibG9nLzIwMjQtMDktMDUtZWFzeS1kZWJ1 Z2dpbmctZm9yLW9jYW1sLXdpdGgtbGxkYj4NCg0KW0dldHRpbmcgU3BlY2lmaWM6IEFubm91bmNp bmcgdGhlIEdvc3BlbCBhbmQgT3J0YWMgUHJvamVjdHNdDQo8aHR0cHM6Ly90YXJpZGVzLmNvbS9i bG9nLzIwMjQtMDktMDMtZ2V0dGluZy1zcGVjaWZpYy1hbm5vdW5jaW5nLXRoZS1nb3NwZWwtYW5k LW9ydGFjLXByb2plY3RzPg0KDQpbVXBjb21pbmcgT0NhbWwgRXZlbnRzIChTZXAgMjAyNCBhbmQg b253YXJkcyldDQo8aHR0cHM6Ly9vY2FtbC5vcmcvZXZlbnRzPg0KDQoNCk9sZCBDV04NCuKVkOKV kOKVkOKVkOKVkOKVkOKVkA0KDQogIElmIHlvdSBoYXBwZW4gdG8gbWlzcyBhIENXTiwgeW91IGNh biBbc2VuZCBtZSBhIG1lc3NhZ2VdIGFuZCBJJ2xsIG1haWwNCiAgaXQgdG8geW91LCBvciBnbyB0 YWtlIGEgbG9vayBhdCBbdGhlIGFyY2hpdmVdIG9yIHRoZSBbUlNTIGZlZWQgb2YgdGhlDQogIGFy Y2hpdmVzXS4NCg0KICBJZiB5b3UgYWxzbyB3aXNoIHRvIHJlY2VpdmUgaXQgZXZlcnkgd2VlayBi eSBtYWlsLCB5b3UgbWF5IHN1YnNjcmliZQ0KICB0byB0aGUgW2NhbWwtbGlzdF0uDQoNCiAgW0Fs YW4gU2NobWl0dF0NCg0KDQpbc2VuZCBtZSBhIG1lc3NhZ2VdIDxtYWlsdG86YWxhbi5zY2htaXR0 QHBvbHl0ZWNobmlxdWUub3JnPg0KDQpbdGhlIGFyY2hpdmVdIDxodHRwczovL2FsYW4ucGV0aXRl cG9tbWUubmV0L2N3bi8+DQoNCltSU1MgZmVlZCBvZiB0aGUgYXJjaGl2ZXNdIDxodHRwczovL2Fs YW4ucGV0aXRlcG9tbWUubmV0L2N3bi9jd24ucnNzPg0KDQpbY2FtbC1saXN0XSA8aHR0cHM6Ly9z eW1wYS5pbnJpYS5mci9zeW1wYS9pbmZvL2NhbWwtbGlzdD4NCg0KW0FsYW4gU2NobWl0dF0gPGh0 dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvPg0KDQo= --=-=-= 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 September 03 to 10, 2= 024.

Oxidizing OCaml =E2=80=94 an update

Diana Kalinichenko announced

Hi everyone! Last year, we made a series of blogposts describing our plans = to introduce Rust-like type system features to OCaml (see here= ). Now, we are sharing updates on everything we've done since last year for= ICFP 2024. Please read our blogpost and check out our compiler extensions at our Git= Hub!

Toy Autograd Engine in OCaml with Apple Accelerate Backend

John Jewell announced

I have been venturing to learn a new language and I landed on OCaml after h= earing a few interesting talks from Jane Street. I just made public a toy a= utograd engine in OCaml with an Apple Accelerate backend if anyone is inter= ested:=20

https://github.com/jew= elltaylor/camlgrad

I would really appreciate any feedback in terms of the OCaml code that I wr= ote so that I can improve. If anyone is willing to quickly take a look it w= ould mean a lot :slight_smile:

New release of cppo, with multi-line macros and higher-order m= acros

Fran=C3=A7ois Pottier announced

It is my pleasure to announce a new release of cppo (v1.7.0) with two new f= eatures.

  • The new syntax #def ... #enddef allows a macro definition to= span several lines, without backslashes. This syntax allows macro definiti= ons to be nested.

    #def re=
    peat_until(action,condition)
      action;
      while not (condition) do
        action
      done
    #enddef
    
  • A parameterized macro can take a parameterized macro as a parameter: this i= s a higher-order macro.

    #define=
     TWICE(e)=
              (e + e)
    #define APPLY(F : [.], e) (let x=
     =3D (e) in F(x))
    let forty_two =3D
      APPLY(<=
    span style=3D"color: #242521; background-color: #fcf7ef;">TWICE,1+2+=
    3+4+5+6)
    

For more details, please see the documen= tation.

OCamlPro's contributions to the 2024 ICFP in Milan

OCamlPro announced

Today, a quick head's up about our contributions to this year's Internation= al Conference on Functional Programming which is unraveling right now in Milan!

This year, our team presents two topics:

  • "Snapshottable Stores": A generic and efficient data s= tructure for the implementation of backtracking algorithms, used particularly in automatic theorem provers and type checkers. This implementation in OCaml will soon be available on opam.
  • A presentation on opam, detailing the contents of the = latest major release 2.2, which was released in July, as well as how the op= am team operates.

Be sure to checkout the event, there are plenty of great pres= entations and video replays!

Until next time, which will be sooner than later with another one of our Fla= mbda2 Snippets,

Kind regards, The OCamlPro Team

Flambda2 Ep. 3: Speculative Inlining, by OCamlPro

OCamlPro announced

As promised in our previous post about OCamlPro's = contributions to this year's International Conference of Functional Program= ming, we back again with a new entry in our Flambda2 Snippet blog se= ries!

F= lambda2 Ep. 3: Speculative Inlining covers inlining in general as well = as how our compiler handles it. We go in detail about how Speculative= Inlining allows more significant optimisations to take place.=20

This blog entry is key for a smooth read of our next article which will cov= er Upwards and Downwards Traversals in Flambda2.

Happy to say that it's already quite far down the release pipeline!

Frustrating Interactions with the OCaml Ecosystem while develo= ping a Synthesizer Library

Steve Sherratt announced

https://www.gridbugs.or= g/frustrating-interactions-with-the-ocaml-ecosystem-while-developing-a-synt= hesizer-library/

Last year I made a synthesizer library in OCaml and had some struggles usin= g Dune and Opam, and also ran into several issues with libraries. I wrote a= blog post about all the problems I encountered.

Cmdlang - Yet Another CLI Library (well, not really)

Mathieu Barbin announced

I hope you had a nice summer! Mine took an unexpected turn when, roughly at= the same time, I wrote my first cmdliner subcommand and heard= about climate for the first time. My experience with OCaml CL= I so far had been centered around core.command.

When I read climate's terminology section and how it defines Terms, Arguments, and Parameters, someth= ing clicked. Seeing how climate's API managed to make position= al and named arguments fit so nicely together, I thought: "Wow, for the fir= st time, it seems I'll be able to write a CLI spec on a whiteboard without = referring to some code I never seem to get right (I am looking at you, core.command's anonymous arguments)."

I got quite excited and thought: "Can I switch to climate toda= y?" But reality checked: it's not on opam yet, still under construction, I'= m not sure what the community will do, etc.

Implementing my own engine for an API resembling climate felt = like a wasted effort, knowing about the work happening in climate. Still, having a 'a Param.t, 'a Arg.t, and 'a Command.t type that I would get to know and love felt too goo= d to pass up.

I stared at the climate types for a while, and filled with hap= py thoughts about a bright CLI future, it occurred to me: can I use an API = like climate but compile it down to existing libraries such as= cmdliner or core.command? (and climate too!). I wrote down the following types:

Climate

'a Param.t     -> 'a Climate.Arg_parser.=
conv
'a Ast.Arg.t   -> 'a Climate.Arg_parser.t
'a Command.t   -> 'a Climate.Command.t

Cmdliner

'a Param.t     -> 'a Cmdliner.Arg.conv
'a Arg.t       -> 'a Cmdliner.Term.t
'a Command.t   -> 'a Cmdliner.Cmd.t

core.command

'a Param.t     -> 'a core.Command.Arg_type.t
'a Arg.t       -> 'a core.Command.Param.t
unit Command.t -> core.Command.t

… which I interpreted as stating the following theorem:

There exists an abstraction to encode OCaml CLIs that lives in the intersec= tion of what's expressible in other well established libraries.

"One EDSL to command them all," so to speak. I couldn't resist the temptati= on to build actual terms for these types. That gave birth to cmdlang.

As a test, I switched one of my projects to cmdlang, with cmdliner as a backend. I liked the changes I made in the process. The 1-line bin/main.ml is now the only place that specifies which backend I want to use; the re= st of the code is programmed solely against the cmdlang API. T= his means I'll be able to easily experiment with compiling down to cl= imate in the future.

I am not against the multiplicity of solutions in general, but I tend to fe= el uneasy when incompatible libraries emerge, partitioning the ecosystem. A= s a community, we know too many examples of this. In this instance, I want = to call the core.command vs cmdliner situation a = … cli-vage.

I don't see my work on cmdlang as competing with these other l= ibraries. Quite the contrary, it makes it easier for me to experiment with = them without much changes while exploring the subject of CLI in general. Al= so, as a library author, if you wish to expose CLI helpers to your users, a= library like cmdlang will give you a pleasant way to do so, a= s you can express your helpers with it, knowing your users will have the ch= oice to translate them to the backend of their choice.

Before writing this post, I had a very pleasant chat with @gridbugs. I want= to make it clear that I do not think cmdlang is competing wit= h climate either. I think climate is a very promi= sing library and I believe it will, in due time, deliver auto-completion to= many - this has been a highly anticipated feature within the community. I = wish to dedicate the initial work that I did on cmdlang to @gr= idbugs due to the impactful influence climate had on my work, and how it he= lped me improve my general understanding of declarative CLI libraries.

These are very early days for cmdlang. There are still areas I= am fuzzy on, and I haven't really validated the whole design yet. I have p= ut some thoughts in this Future Plans page. One thing that I did not = initially include there would be to explore the feasibility of writing a mi= ni-compiler for cmdlang targeting stdlib.arg as a= runner. I am not sure how much you'd end up restricting cmdlang for this to work. I thought that'd be a fun project to tackle at a futur= e point, as it would make a nice addition to the overall architecture of th= e project.

I'd welcome your input to help me shape the future of cmdlang = if you have an interest in this project.

Thanks for reading!

zarr v0.1.0

zoj613 announced

Hi everyone, I'd like to announce the first release of zarr, a= n Ocaml implementation of the Zarr version 3 storage format specification for chunked & compressed multi-dimensional arrays, designed for use i= n parallel computing.

3D"terminology-hierarchy.excalidraw.png"

why?

The project was mainly inspired by the lack of functional programming langu= age implementations of this specification as shown in this implementations table. Since I have been = learning OCaml these past few months I figured I'd take on the challenge of= producing the first functional programming implementation of Zarr, and it = was a great learning experience!

Features

  • Supports creating n-dimensional Zarr arrays and chunking them along any= dimension.
  • Compress array chunks using a variety of supported compression codecs.<= /li>
  • Supports indexing operations to read/write views of a Zarr array.
  • Supports storing arrays in-memory or the local filesystem. It is also extensible, allowing users to easily create and use their own custom storag= e backends. See the example implementing a Zip file store fo= r more details.
  • Supports both synchronous and concurrent I/O via Lwt and <= code>Eio.
  • Leverages the strong type system of Ocaml to create a type-safe API; ma= king it impossible to create, read or write malformed arrays.
  • Supports organizing arrays into hierarchies using Groups.

Example

Below is a demo of the library's API for creating, reading and writing to a= Zarr hierarchy.

open Zarr
open Zarr.Metadata
open Zarr.Node
open Zarr.Codecs
open Zarr.Indexing
open Zarr_sync.Storage
(* opens infix operators >>=3D =
and >>| for monadic bind & map *)
open FilesytemStore.Deferred.Infix

let store =3D Files=
ystemStore.create "testdata.zarr" in
let group_node =3D =
GroupNode.of_path "/some/group" in
FilesystemStore.create_group store g=
roup_node;
let array_node =3D =
ArrayNode.(group_node / "name");;
(* creates an array with char data ty=
pe and fill value '?' *)
FilesystemStore.create_array
  ~codecs:[`Transpose [|2; 0; 1|]; `Bytes BE; `Gzip L2]
  ~shape:[|100; 100; 50|]
  ~chunks:[|10; 15; 20|]
  Ndarray.Char=20
  '?'
  array_node
  store;
let slice =3D [|R [|0; 20|]; I 10; R [||]|] in
let x =3D Filesyste=
mStore.read_array store array_node slice Ndarray.Char in
(* Do some computation on the array s=
lice *)
let x' =3D Zarr.Nda=
rray.map (fun _ -> Random.int 256 |> =
Char.chr) x in
FilesystemStore.write_array store ar=
ray_node slice x';
let y =3D Filesyste=
mStore.read_array store array_node slice Ndarray.Char in
assert (Ndarray.equal x' y);

Installation

The library comes in several flavors depending on the synchronous / asynchr= onous backend of choice. To install the synchronous API, use

$ opam install zarr-sync

To install zarr with an asynchronous API powered by Lwt or Eio, use

$ opam install zarr-lwt
$ opam install zarr-eio

The documentation can be found here and the source code there

I'm happy to answer any questions regarding the library and more than welco= me suggestions for improvements (especially performance!), issue reports as= well as PR's.

Brr 0.0.7

Daniel B=C3=BCnzli announced

There'a new release of Brr, an ISC licenced toolkit for programming browsers with the js_of_oc= aml compiler.

This release has some changes to support work being done for wasm_of_= ocaml; thanks to @vouillon for his patches. There are also other sma= ll fixes and additions, consult the release notes for the details and thanks to all the contribut= ors.

A big thanks to my donator= s for supporting my work. I welcome the (not so[^1]) new donator Tarides.

Home page, Docs and manuals or odig doc= brr

Install: opam install brr (PR)

Best,

Daniel

[^1]: Tarides has been generously donating for my work from the onse= t but used to do it via the Mirage organisation.

Ocsigen Server 6.0.0

Vincent Balat announced

We're delighted to announce a major new version of Ocsigen Server! This ver= sion 6.0.0 focuses on the use of Ocsigen Server as a library, without any c= onfiguration file, which is now much easier and brings the exact same featu= res as the executable.

Example of use:

To add a Web server to your OCaml program, serving static files from direct= ory `static`:

let _ =3D Ocsigen_server.start=20
          [ Ocsigen_server.host [Staticmod.run ~dir:"static" ()]]

Install:

opam install ocsigenserver

Example of Dune file for this program:

(executable
 (public_name myproject)
 (name main)
 (libraries
  main
  ocsigenserver
  ocsigenserver.ext.staticmod))

Compile with:

dune build

Ocsigen Server can of course still be used as an executable taking its conf= iguration from a file. This allows for non OCaml developers to use it and m= ake their own configurations. It also makes it possible to distribute a bin= ary version of your Web applications.

Ocsigen Server is build in modular and extensible way. The default opam pac= kages comes with several extensions. In the example above, we are using Sta= ticmod for serving static files. Other extensions makes it possible for exa= mple to configure redirections, to control the access to some sub-directory= , to use a reverse proxy, to rewrite the request, compress the output etc.

The programming interface follows exactly the structure of the configuratio= n file: instructions are tried in order until one generates a result, then = some other instructions can be used to change the result (like compressing = it or adding some headers).

Here is a more complex example of configuration:

let _ =3D
  Ocsigen_server.start
    ~ports:[`All, 8080]
    ~command_pipe:"local/var/run/mysite-cmd"
    ~logdir:"local/var/log/mysite"
    ~datadir:"local/var/data/mysite"
    ~default_charset:(Some "utf-8")
    [ Ocsigen_server.host
        ~regexp:"mydomain.com"
        [ Ocsigen_server.site ["subsite"]
            [ Accesscontrol.(
                if_
                  (and_
                     [ ip "122.122.122.122"=

                     ; header ~name:=
"user-agent" ~regexp:".*FooBar.*"
                     ; method_ `POST ])
                  [forbidden] [])
            ; Authbasic.run ~realm:"myre=
alm"
                ~auth:(fun _u p -> Lwt.return (p =3D "toto"))
                ()
            ; Staticmod.run ~dir:"local/=
var/www/otherdir" () ]
        ; Ocsigen_server.site ["othersubsite"]
            [ Revproxy.run
                ~redirection:
                  (Revproxy.create_r=
edirection ~full_url:false ~regexp:"(.*)"
                     ~keephost:true "htt=
p://localhost:8888/\\1")
                () ]
        ; Redirectmod.run
            ~redirection:
              (Redirectmod.create_re=
direction ~full_url:false ~regexp=
:"old(.*)"
                 "new\\1")
            ()
        ; Staticmod.run ~dir:"local/var=
/www/staticdir" ()
        ; Cors.run ~max_age:86400 ~crede=
ntials:true ~methods:[`POST; `GET; `HEAD]
            ~exposed_headers:
              [ "x-eliom-application"
              ; "x-eliom-location"
              ; "x-eliom-set-process-cookie=
s"
              ; "x-eliom-set-cookie-substit=
utes" ]
            ()
        ; Deflatemod.run
            ~mode:
              (`=
Only
                [ =
Some "text", Some "html")
                ; =
Some "text", Some "javascript")
                ; =
Some "text", Some "css")
                ; =
Some "application", Some "javascript")
                ; =
Some "application", Some "x-javascript")
                ; =
Some "application", Some "xhtml+xml")
                ; =
Some "image", Some "svg+xml")
                ; =
Some "application", Some "x-eliom") ])
            () ] ]

In this example, the server defines one virtual host for domain mydom= ain.com. It will first check whether it is a request for directory <= code>subsite/, and if yes, will reject the request with 403 Forbidde= n if it is a POST request coming from user-agent FooBar at IP = 122.122.122.122. If not, it will ask for a password before serving files fr= om directory local/var/www/otherdir. Then we define another subsite othersubsite for which the requ= ests will be transfered to another Web server running locally on port 8888,= then rewrite the answer location header accordingly. Then, if the page is still not generated, the server will send a redirectio= n if URLs starts with "old". Otherwise, it will try to serve files from directory local/var/www/st= aticdir. If the page has still not been found, a 404 Not found will be = sent, otherwise, some CORS headers will be added, and the result will be co= mpressed before being sent.

Compile this example with the following dune file:

(executable
 (public_name myserver)
 (name main)
 (libraries
  ocsigenserver
  ocsigenserver.ext.staticmod
  ocsigenserver.ext.authbasic
  ocsigenserver.ext.extendconfiguration
  ocsigenserver.ext.outputfilter
  ocsigenserver.ext.cors
  ocsigenserver.ext.accesscontrol
  ocsigenserver.ext.deflatemod
  ocsigenserver.ext.redirectmod
  ocsigenserver.ext.revproxy
 ))

Eliom and Ocsigen Start have also been updated for being used without confi= guration file and will be released very soon.

dream-html and pure-html

Yawar Amin announced

[ANN] dream-html & pure-html 3.6.1, 3.6.2

A double announcement:

3.6.1: when in XML rendering mode, correctly render empty-value attributes = as having an empty string value. Thanks to @jonsterling !

3.6.2: automatically switch to XML rendering mode when rendering SVG and Ma= thML tags inside HTML rendering mode.

Advanced Code Navigation coming to OCaml-LSP

PizieDust announced

Jump to Target

Currently, the standard LSP protocol only allows for generalized code navig= ation (`goto definition`, `goto declaration`, `goto implementation`, `goto = type-definition`), which is not very useful when it comes to precise moveme= nts.

Coming to OCaml-lsp soon will be the ability to jump from one point in your= code to another based on Merlin's Ju= mp command.

Implementing this functionality took a bit of thinking as we wanted a solut= ion that works for all supported editors (Vscode, Emacs and Vim) without an= y additional specific client implementations. We used a combination of call actions plus the LSP showDocumentRequest to = move the cursor to the interesting position.

The call actions display are contextual and will display only if it's relev= ant to the code under the cursor.

Here is a demo in VSCode.

3D"618bfd77db1=

Old CWN

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

If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

--=-=-=--