From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by c5ff346549e7 (Postfix) with ESMTPS id 16D735D5 for ; Tue, 31 Mar 2020 09:55:00 +0000 (UTC) X-IronPort-AV: E=Sophos;i="5.72,327,1580770800"; d="scan'208,217";a="443135838" Received: from sympa.inria.fr ([193.51.193.213]) by mail2-relais-roc.national.inria.fr with ESMTP; 31 Mar 2020 11:54:58 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 811347F42C; Tue, 31 Mar 2020 11:54:58 +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 EE6647EC77 for ; Tue, 31 Mar 2020 11:54:51 +0200 (CEST) Authentication-Results: mail3-smtp-sop.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=o1kQ=5Q=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org IronPort-PHdr: =?us-ascii?q?9a23=3ATCTjiRWlm65MAiYs9kMvgaLdth/V8LGtZVwlr6E/?= =?us-ascii?q?grcLSJyIuqrYZhKBt8tkgFKBZ4jH8fUM07OQ6P+wHzFYqb+681k8M7V0Hycfjs?= =?us-ascii?q?sXmwFySOWkMmbcaMDQUiohAc5ZX0Vk9XzoeWJcGcL5ekGA6ibqtW1aVjT5Kwtu?= =?us-ascii?q?J+7xF8bNiN67zKjyoMWSME10g2/3Zax0Zl3iqRrXns0Jh81kJ7pnjlODqWROMa?= =?us-ascii?q?wekWh3I3qXng3g/YGx8I9n92JXof13s4ZLWKD+OqA5VqBwDTI8Mmlz6tev/RLE?= =?us-ascii?q?SBOn4noHTn5QlQBCAhTM6B/9TtH8r3jUrO14jQCeNMu+drs0XDW+8+8/QRvhjm?= =?us-ascii?q?EcPD488X3LotR3iLNHrRmhoR1m3oOSZ5uaYqktNpjBdM8XEDISFv1aUDZMV9jk?= =?us-ascii?q?NtddP686Je9d6rLFiR4WtxLnVFu0A+f+1jJDhnn3xLA3leM7HlOfhVFyL5c1qH?= =?us-ascii?q?3R6e7NGuISXOSylvKayCWaKetR3Sbh5YPIdBE4vPzKWqh/I5OImBsfUjjdh1DV?= =?us-ascii?q?krTLejac1+ADqW+etrUyX+WyjWUqsEd0/ijpwd0j2NDE?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0AdBQALEoNehyIeaIFcCh0BAQEJAREFB?= =?us-ascii?q?QGBe4ElUwWBGFUyKoNaQIFehySFf4Eog3eFJAONKYQBgRADUA4BAwEMGAEOBQE?= =?us-ascii?q?CBAEBgw6BNgIXgh0dBgEFMxMCEAEBBQEBAQIBAgMEARMBAQEKCwkIKYVdDII7B?= =?us-ascii?q?QMEGQuDCgMBCg4BCAo7BQceIwMJCwEGAwIEDQEXARQKAxQBEhQGgkFLAYJ8BAE?= =?us-ascii?q?KkVSbeYEyhDUBAwcJAQIPLgFBg0CBPg0CE38XgiWCfYMWg1MmD4FMP4MnSQdsg?= =?us-ascii?q?k4OCwEBAQEBAYEaGgsBAQgyHAmCUxeCRwSNZQsOAQkDJGeIBId6gV2PBXcHgkB?= =?us-ascii?q?7BIVzb4Vag3CDH4JqgkyBAocvhFmMGCGOeoFRhTcGaYEhhTyNWYE/KoFIAQEZA?= =?us-ascii?q?wwIMxowQw0HAwaCGwEBMgkJVg1Ygz6JYy8BARaBBAEJgWReM4ELgSaBPDk7hUM?= =?us-ascii?q?/MwIBAQ6BEAEBBRMLAYtegWcBAQ?= X-IPAS-Result: =?us-ascii?q?A0AdBQALEoNehyIeaIFcCh0BAQEJAREFBQGBe4ElUwWBGFU?= =?us-ascii?q?yKoNaQIFehySFf4Eog3eFJAONKYQBgRADUA4BAwEMGAEOBQECBAEBgw6BNgIXg?= =?us-ascii?q?h0dBgEFMxMCEAEBBQEBAQIBAgMEARMBAQEKCwkIKYVdDII7BQMEGQuDCgMBCg4?= =?us-ascii?q?BCAo7BQceIwMJCwEGAwIEDQEXARQKAxQBEhQGgkFLAYJ8BAEKkVSbeYEyhDUBA?= =?us-ascii?q?wcJAQIPLgFBg0CBPg0CE38XgiWCfYMWg1MmD4FMP4MnSQdsgk4OCwEBAQEBAYE?= =?us-ascii?q?aGgsBAQgyHAmCUxeCRwSNZQsOAQkDJGeIBId6gV2PBXcHgkB7BIVzb4Vag3CDH?= =?us-ascii?q?4JqgkyBAocvhFmMGCGOeoFRhTcGaYEhhTyNWYE/KoFIAQEZAwwIMxowQw0HAwa?= =?us-ascii?q?CGwEBMgkJVg1Ygz6JYy8BARaBBAEJgWReM4ELgSaBPDk7hUM/MwIBAQ6BEAEBB?= =?us-ascii?q?RMLAYtegWcBAQ?= X-IronPort-AV: E=Sophos;i="5.72,327,1580770800"; d="scan'208,217";a="344435787" X-MGA-submission: =?us-ascii?q?MDEqaMqiq+VPMdE41KFxovZrIUdNa6k94It2e9?= =?us-ascii?q?pIOgB0vGym7LUy6lfwo5SqE0LVSer3t6iFB8hTxyfLNT6hu4cHg29efo?= =?us-ascii?q?bT8qKMaTItERJ0UqG9bczJyJ9KY5bHRLZ8yfQrgdmEQyWdD+Zwzwz247?= =?us-ascii?q?xuh06c/rwmSVAFxt3qKH2WDA=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 31 Mar 2020 11:54:49 +0200 Received: from set (cbg35-2-78-242-14-140.fbx.proxad.net [78.242.14.140]) (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 C9BD256129C; Tue, 31 Mar 2020 11:54:45 +0200 (CEST) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr, comp@lists.orbitalfox.eu Date: Tue, 31 Mar 2020 11:54:45 +0200 Message-ID: <87blocyhlm.fsf@polytechnique.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Mar 31 11:54:46 2020 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.000034, queueID=6AACD5612A0 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: 18077 Errors-to: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgTWFyY2ggMjQgdG8gMzEsDQoyMDIwLg0KDQpUYWJsZSBvZiBDb250ZW50cw0K4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCkFuIEluLURl cHRoIExvb2sgYXQgT0NhbWzigJlzIE5ldyDigJxCZXN0LUZpdOKAnSBHYXJiYWdlIENvbGxlY3Rv ciBTdHJhdGVneQ0KRmlyc3QgcmVsZWFzZSBvZiBQcCwgYSBwcmV0dHktcHJpbnRpbmcgbGlicmFy eQ0Kc291cGF1bHQ6IGEgc3RhdGljIHdlYnNpdGUgZ2VuZXJhdG9yIGJhc2VkIG9uIEhUTUwgcmV3 cml0aW5nDQpyb3V0ZXM6IHBhdGggYmFzZWQgcm91dGluZyBmb3Igd2ViIGFwcGxpY2F0aW9ucw0K Q29tcGlsZXIgRW5naW5lZXIgYXQgTWl4dGlvbmFsIENvZGUgaW4gRGFybXN0YWR0IG9yIGFueXdo ZXJlIGVsc2UgaW4gR2VybWFueQ0KdGlueS1odHRwZCAwLjUNClZpc3VhbCBTdHVkaW8gQ29kZSBw bHVnaW4gZm9yIE9DYW1sDQpEaXNtYXM6IGEgdG9vbCBmb3IgYXV0b21hdGljYWxseSBtYWtpbmcg Y3Jvc3MtdmVyc2lvbnMgb2Ygb3BhbSBwYWNrYWdlcw0KTXVsdGljb3JlIE9DYW1sOiBNYXJjaCAy MDIwIHVwZGF0ZQ0KT2xkIENXTg0KDQoNCkFuIEluLURlcHRoIExvb2sgYXQgT0NhbWzigJlzIE5l dyDigJxCZXN0LUZpdOKAnSBHYXJiYWdlIENvbGxlY3RvciBTdHJhdGVneQ0K4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vz cy5vY2FtbC5vcmcvdC9hbi1pbi1kZXB0aC1sb29rLWF0LW9jYW1sLXMtbmV3LWJlc3QtZml0LWdh cmJhZ2UtY29sbGVjdG9yLXN0cmF0ZWd5LzUzNzAvMT4NCg0KDQpPQ2FtbFBybyBhbm5vdW5jZWQN CuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0K DQogIFRoZSBHYXJiYWdlIENvbGxlY3RvciBpcyBwcm9iYWJseSBPQ2FtbOKAmXMgZ3JlYXRlc3Qg dW5zdW5nIGhlcm8uIEl0cw0KICBwcmFnbWF0aWMgYXBwcm9hY2ggYWxsb3dzIHVzIHRvIGFsbG9j YXRlIHdpdGhvdXQgbXVjaCBmZWFyIG9mDQogIGVmZmljaWVuY3kgbG9zcy4gV2UgbG9va2VkIGlu dG8gaXRzIG5ldyAiQmVzdC1maXQiIHN0cmF0ZWd5IGFuZCBoZXJlDQogIGlzIHdoYXQgd2UgbGVh cm5lZCENCiAgW2h0dHA6Ly93d3cub2NhbWxwcm8uY29tLzIwMjAvMDMvMjMvb2NhbWwtbmV3LWJl c3QtZml0LWdhcmJhZ2UtY29sbGVjdG9yL10NCg0KDQpbaHR0cDovL3d3dy5vY2FtbHByby5jb20v MjAyMC8wMy8yMy9vY2FtbC1uZXctYmVzdC1maXQtZ2FyYmFnZS1jb2xsZWN0b3IvXQ0KPGh0dHA6 Ly93d3cub2NhbWxwcm8uY29tLzIwMjAvMDMvMjMvb2NhbWwtbmV3LWJlc3QtZml0LWdhcmJhZ2Ut Y29sbGVjdG9yLz4NCg0KDQpGaXJzdCByZWxlYXNlIG9mIFBwLCBhIHByZXR0eS1wcmludGluZyBs aWJyYXJ5DQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6 Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1maXJzdC1yZWxlYXNlLW9mLXBwLWEtcHJldHR5LXBy aW50aW5nLWxpYnJhcnkvNTM3MS8xPg0KDQoNCkrDqXLDqW1pZSBEaW1pbm8gYW5ub3VuY2VkDQri lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIANCg0KICBJJ20gaGFwcHkgdG8gYW5ub3VuY2UgdGhlIGZpcnN0IHJlbGVh c2Ugb2YgdGhlIFtwcCBsaWJyYXJ5XSEgVGhpcw0KICBsaWJyYXJ5IHByb3ZpZGVzIGEgbGVhbiBh bHRlcm5hdGl2ZSB0byB0aGUgW0Zvcm1hdCBtb2R1bGVdIG9mIHRoZQ0KICBzdGFuZGFyZCBsaWJy YXJ5LiBJdCB1c2VzIHRoZSBzYW1lIGNvbWNlcHRzIG9mIGJveGVzIGFuZCBicmVhayBoaW50cywN CiAgaG93ZXZlciBpdCBkZWZpbmVzIGl0cyBvd24gYWxnZWJyYSB3aGljaCBzb21lIG1pZ2h0IGZp bmQgZWFzaWVyIHRvDQogIHdvcmsgd2l0aCBhbmQgcmVhc29uIGFib3V0LiAgSSBwZXJzb25hbGx5 IGRvIDopIFRoZSBmaW5hbCByZW5kZXJpbmcgaXMNCiAgc3RpbGwgZG9uZSB2aWEgYSBmb3JtYXR0 ZXIgd2hpY2ggbWFrZXMgaXQgZWFzeSB0byBpbnRlZ3JhdGUgYFBwJyBpbg0KICBleGlzdGluZyBw cm9ncmFtcyB1c2luZyBgRm9ybWF0Jy4NCg0KICBXZSBpbnRyb2R1Y2VkIHRoaXMgbW9kdWxlIGlu IFtEdW5lXSB0byBoZWxwIGltcHJvdmUgdGhlIGZvcm1hdHRpbmcgb2YNCiAgbWVzc2FnZXMgcHJp bnRlZCBpbiB0aGUgdGVybWluYWwgYW5kIGl0IGhhcyBiZWVuIGEgc3VjY2Vzcy4gVGhlIG5ldw0K ICBBUEkgaXMgc21hbGxlciwgc2ltcGxlciBhbmQgbWFrZXMgaXQgZWFzeSBmb3IgZGV2ZWxvcGVy cyB0byBkbyB0aGUNCiAgcmlnaHQgdGhpbmcuIE9uY2UgdGhlIGBQcCcgbW9kdWxlIG9mIER1bmUg d2FzIG1hdHVyZSBlbm91Z2gsIHdlDQogIGRlY2lkZWQgdG8gZXh0cmFjdCBpdCBpbnRvIGEgc2Vw YXJhdGUgbGlicmFyeSBzbyB0aGF0IGl0IGNvdWxkIGJlbmVmaXQNCiAgb3RoZXJzLg0KDQogIFRo ZSBsaWJyYXJ5IGl0c2VsZiBpcyBjb21wb3NlZCBvZiBhIHNpbmdsZSBgUHAnIG1vZHVsZSBhbmQg aGFzIG5vDQogIGRlcGVuZGVuY2llcy4gIEl0cyBkb2N1bWVudGF0aW9uIGlzIHNlbGYtY29udGFp bmVkIGFuZCBubyBwcmV2aW91cw0KICBrbm93bGVkZ2UgaXMgcmVxdWlyZWQgdG8gc3RhcnQgdXNp bmcgaXQsIGhvd2V2ZXIgdGhlIHZhcmlvdXMgZ3VpZGVzDQogIGZvciB0aGUgYEZvcm1hdCcgbW9k dWxlIHN1Y2ggYXMgW3RoaXMgb25lXSBzaG91bGQgYmUgYXBwbGljYWJsZSB0bw0KICBgUHAnIGFz IHdlbGwuDQoNCiAgSWYgeW91IGhhdmUgdXNlZCBgRm9ybWF0JyBiZWZvcmUgYW5kIGxpa2UgbWUg Zm91bmQgaXRzIEFQSSBjb21wbGljYXRlZA0KICBhbmQgZGlmZmljdWx0IHRvIHVzZSwgSSBob3Bl IHRoYXQgeW91IHdpbGwgZmluZCBgUHAnIG5pY2VyIHRvIHdvcmsNCiAgd2l0aCENCg0KDQpbcHAg bGlicmFyeV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9kaW1sL3BwPg0KDQpbRm9ybWF0IG1vZHVsZV0N CjxodHRwczovL2NhbWwuaW5yaWEuZnIvcHViL2RvY3MvbWFudWFsLW9jYW1sL2xpYnJlZi9Gb3Jt YXQuaHRtbD4NCg0KW0R1bmVdIDxodHRwczovL2R1bmUuYnVpbGQ+DQoNClt0aGlzIG9uZV0gPGh0 dHA6Ly9jYW1sLmlucmlhLmZyL3Jlc291cmNlcy9kb2MvZ3VpZGVzL2Zvcm1hdC5lbi5odG1sPg0K DQoNCkpvc2ggQmVyZGluZSB0aGVuIHNhaWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEFub3RoZXIgZ3JlYXQg cmVzb3VyY2UgZm9yIHVuZGVyc3RhbmRpbmcgdGhlIGNvcmUgbWVudGFsIG1vZGVsIG9mDQogIEZv cm1hdCBpcyBbRm9ybWF0IFVucmF2ZWxlZF0sIGFsdGhvdWdoIGlmIEkgdW5kZXJzdGFuZCBwcCBj b3JyZWN0bHkNCiAgdGhlIGRpc2N1c3Npb24gYWJvdXQgRm9ybWF0IG5vdCBiZWluZyBkb2N1bWVu dC1iYXNlZCB3b24ndCBhcHBseSB0bw0KICBwcC4NCg0KDQpbRm9ybWF0IFVucmF2ZWxlZF0NCjxo dHRwczovL2hhbC5hcmNoaXZlcy1vdXZlcnRlcy5mci9oYWwtMDE1MDMwODEvZmlsZS9mb3JtYXQt dW5yYXZlbGVkLnBkZj4NCg0KDQpzb3VwYXVsdDogYSBzdGF0aWMgd2Vic2l0ZSBnZW5lcmF0b3Ig YmFzZWQgb24gSFRNTCByZXdyaXRpbmcNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRw czovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXNvdXBhdWx0LWEtc3RhdGljLXdlYnNpdGUtZ2Vu ZXJhdG9yLWJhc2VkLW9uLWh0bWwtcmV3cml0aW5nLzQxMjYvMTM+DQoNCg0KRGFuaWlsIEJhdHVy aW4gYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBbMS4xMC4wXSByZWxlYXNlIGlzIGF2 YWlsYWJsZS4NCg0KICBCdWcgZml4ZXM6DQogIOKAoiBGaWxlcyB3aXRob3V0IGV4dGVuc2lvbnMg YXJlIGhhbmRsZWQgY29ycmVjdGx5Lg0KDQogIE5ldyBmZWF0dXJlczoNCiAg4oCiIFBsdWdpbiBk aXNjb3Zlcnk6IGlmIHlvdSBzYXZlIGEgcGx1Z2luIHRvIGBwbHVnaW5zL215LXBsdWdpbi5sdWEn LA0KICAgIGl0J3MgYXV0b21hdGljYWxseSBsb2FkZWQgYXMgYSB3aWRnZXQgbmFtZWQNCiAgYG15 LXBsdWdpbicuIExpc3Qgb2YgcGx1Z2luIGRpcmVjdG9yaWVzIGlzIGNvbmZpZ3VyYWJsZS4NCiAg 4oCiIE5ldyBwbHVnaW4gQVBJIGZ1bmN0aW9uczogYEhUTUxnZXRfdGFnX25hbWUnLCBgSFRNTC5z ZWxlY3RfYW55X29mJywNCiAgICBgSFRNTC5zZWxlY3RfYWxsX29mJy4NCiAg4oCiIFRoZSBgSFRN TCcgbW9kdWxlIGlzIG5vdyAibW9uYWRpYyI6IGdpdmluZyBhIG5pbCB0byBhIGZ1bmN0aW9uIHRo YXQNCiAgICBleHBlY3RzIGFuIGVsZW1lbnQgZ2l2ZXMgeW91IGEgbmlsIGJhY2ssIHJhdGhlciB0 aGFuIGNhdXNlIGEgcnVudGltZQ0KICAgIGVycm9yLg0KDQoNClsxLjEwLjBdIDxodHRwczovL3Nv dXBhdWx0Lm5lb2NpdGllcy5vcmcvYmxvZy9zb3VwYXVsdC0xLjEwLXJlbGVhc2U+DQoNCg0Kcm91 dGVzOiBwYXRoIGJhc2VkIHJvdXRpbmcgZm9yIHdlYiBhcHBsaWNhdGlvbnMNCuKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwu b3JnL3QvYW5uLXJvdXRlcy1wYXRoLWJhc2VkLXJvdXRpbmctZm9yLXdlYi1hcHBsaWNhdGlvbnMv MzYyNC82Pg0KDQoNCkFudXJhZyBTb25pIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgWzAuNy4yXSBy ZWxlYXNlIGlzIG5vdyBhdmFpbGFibGUgb24gb3BhbS4gVGhlcmUgaGF2ZSBiZWVuIHF1aXRlIGEg ZmV3DQogIGNoYW5nZXMgc2luY2UgdGhlIHByZXZpb3VzIHZlcnNpb25zLg0KDQogIOKAoiBSb3V0 ZXMgZG9lc24ndCBkZWFsIHdpdGggSFRUUCBtZXRob2RzIGFueW1vcmUNCiAg4oCiIFRoZSBpbnRl cm5hbCBpbXBsZW1lbnRhdGlvbiBpcyBub3cgYmFzZWQgYXJvdW5kIGEgdHJpZSBsaWtlIGRhdGEN CiAgICBzdHJ1Y3R1cmUNCiAg4oCiIFJvdXRlcyBoYXZlIHByZXR0eSBwcmludGVycw0KICDigKIg c3ByaW50ZiBzdHlsZSByb3V0ZSBwcmludGluZyBpcyBzdXBwb3J0ZWQgYWdhaW4NCiAg4oCiIE1p bmltdW0gc3VwcG9ydGVkIE9DYW1sIHZlcnNpb24gaXMgbm93IDQuMDUgKGl0IHVzZWQgdG8gYmUg NC4wNikNCiAg4oCiIFRoZXJlIGlzIGEgcmVsZWFzZSBhdmFpbGFibGUgZm9yIGJ1Y2tsZXNjcmlw dCBhcyB3ZWxsIGFuZCBpdCBpcw0KICAgIGF2YWlsYWJsZSB0byBpbnN0YWxsIHZpYSBbbnBtXS4N Cg0KDQpbMC43LjJdIDxodHRwOi8vb3BhbS5vY2FtbC5vcmcvcGFja2FnZXMvcm91dGVzLz4NCg0K W25wbV0gPGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL0BhbnVyYWdzb25pL3JvdXRlcz4N Cg0KDQpDb21waWxlciBFbmdpbmVlciBhdCBNaXh0aW9uYWwgQ29kZSBpbiBEYXJtc3RhZHQgb3Ig YW55d2hlcmUgZWxzZSBpbiBHZXJtYW55DQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNj dXNzLm9jYW1sLm9yZy90L2NvbXBpbGVyLWVuZ2luZWVyLWF0LW1peHRpb25hbC1jb2RlLWluLWRh cm1zdGFkdC1vci1hbnl3aGVyZS1lbHNlLWluLWdlcm1hbnkvNTM3Ny8xPg0KDQoNCkdlcmQgU3Rv bHBtYW5uIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgVHlwZSBvZiBwb3NpdGlvbjoN Cg0KICDigKIgcmVndWxhciBoaXJlIChubyBmcmVlbGFuY2VycykNCiAg4oCiIGZ1bGwgdGltZQ0K ICDigKIgd29yayBmcm9tIGhvbWUgYW55d2hlcmUgaW4gR2VybWFueSwgb3IgaW4gdGhlIG9mZmlj ZSBpbiBEYXJtc3RhZHQNCiAg4oCiIHdvcmsgZm9yIGEgc21hbGwgYW5kIGhpZ2hseSBza2lsbGVk IGludGVybmF0aW9uYWwgdGVhbSwgbG9jYXRlZCBpbg0KICAgIHRoZSBVUyBhbmQgRXVyb3BlDQog IOKAoiB0aGUgdGVhbSBsYW5ndWFnZSBpcyBFbmdsaXNoDQoNCiAgV2UgYXJlIGRldmVsb3Bpbmcg YSBjb21waWxlciBmb3IgYSBuby1jb2RlIHBsYXRmb3JtIHRoYXQgdHJhbnNsYXRlcw0KICBvdXIg RFNMIHRvIGJ5dGVjb2RlIGFuZC9vciBXZWJBc3NlbWJseS4gVGhlIGxhbmd1YWdlIGlzIGxhcmdl bHkgb2YNCiAgZnVuY3Rpb25hbCB0eXBlIGJ1dCBpcyBhbHNvIGFibGUgdG8gbWFuYWdlIHN0YXRl IHdpdGggYSBzcHJlYWRzaGVldA0KICBtb2RlbCwgYWxsb3dpbmcgcmVhY3RpdmUgcHJvZ3JhbW1p bmcgd2l0aG91dCBoYXZpbmcgdG8gcmVzb3J0IHRvDQogIGxpYnJhcmllcy4gVGhlIGxhbmd1YWdl IGlzIHN0YXRpY2FsbHkgdHlwZWQgdXNpbmcgYSBIaW5kbGV5LU1pbG5lcg0KICB0eXBlIGNoZWNr ZXIuIFRoZSBjb21waWxlciBpcyBwcmltYXJpbHkgd3JpdHRlbiBpbiBPQ2FtbC4gT3RoZXINCiAg bGFuZ3VhZ2VzIG9mIG91ciBwbGF0Zm9ybSBhcmUgR28sIEVsbSwgYW5kIEphdmFzY3JpcHQuDQoN CiAgV2UgYXJlIGxvb2tpbmcgZm9yIGEgY29tcGlsZXIgZW5naW5lZXIgd2l0aCBzdHJvbmcgc2tp bGxzIGluIGFsbA0KICByZWxldmFudCBhcmVhczoNCg0KICDigKIgZmx1ZW50IGluIE9DYW1sIG9y IGEgc2ltaWxhciBsYW5ndWFnZSBzdWNoIGFzIEhhc2tlbGwNCiAg4oCiIFVuZGVyc3RhbmRpbmcg b2YgdGhlIHN0cnVjdHVyZSBvZiB0aGUgRFNMLCBpbmNsdWRpbmcgc3ludGF4IGFuZA0KICAgIHNl bWFudGljcw0KICDigKIgVHJhbnNsYXRpb24gb2YgRlAgbGFuZ3VhZ2VzIHRvIGV4ZWN1dGFibGUg Y29kZQ0KICDigKIgQ29kZSBvcHRpbWl6YXRpb24NCiAg4oCiIEdyYXBoIGFsZ29yaXRobXMNCiAg 4oCiIFR5cGUgY2hlY2tpbmcNCg0KICBXZSBhcmUgb3BlbiB0byBib3RoIGp1bmlvcnMgYW5kIHNl bmlvcnMsIGFuZCBwYXltZW50IHdpbGwgYmUNCiAgYWNjb3JkaW5nbHkuIFdlIGFyZSBub3Qgc28g bXVjaCBpbnRlcmVzdGVkIGluIGZvcm1hbCBjZXJ0aWZpY2F0aW9ucw0KICBidXQgcmF0aGVyIGlu IHJlYWwgcHJhY3RpY2UsIGVpdGhlciBmcm9tIHByZXZpb3VzIGpvYnMsIHJlc2VhcmNoDQogIHBy b2plY3RzLCBvciBjb250cmlidXRpb25zIHRvIG9wZW4gc291cmNlIHByb2plY3RzLg0KDQogIFRo ZSBuby1jb2RlIHBsYXRmb3JtIGlzIGJlaW5nIGRldmVsb3BlZCBieSBlbmdpbmVlcnMgaW4gRXVy b3BlIGFuZCB0aGUNCiAgVVMgYXQgdmFyaW91cyBwbGFjZXMsIGFuZCB3ZSB1c3VhbGx5IGRvIG5v dCBtZWV0IHBoeXNpY2FsbHkgYnV0IGluDQogIHZpZGVvIGNvbmZlcmVuY2VzLiBXb3JraW5nIGZy b20gaG9tZSBpcyB2ZXJ5IHVzdWFsLiBXZSBhbHNvIGdldCB5b3UgYQ0KICBkZXNrIGluIHlvdXIg aG9tZSB0b3duIGlmIHlvdSBwcmVmZXIgdGhpcy4gVGhlIGNvbXBpbGVyIGRldmVsb3BtZW50IGlz DQogIGxlYWQgYnkgR2VyZCBTdG9scG1hbm4gZnJvbSBEYXJtc3RhZHQuDQoNCiAgRHVlIHRvIHRo ZSBzdHJvbmcgY29ubmVjdGlvbnMgdG8gdGhlIFVTLCB2aWRlbyBjb25mZXJlbmNlcyB3aWxsIG9m dGVuDQogIGhhdmUgdG8gdGFrZSBwbGFjZSBpbiBldmVuaW5nIGhvdXJzLCB1bnRpbCBhcm91bmQg N3BtIG9yIDhwbS4NCg0KICBBcHBsaWNhdGlvbnM6IHBsZWFzZSBmb2xsb3cgdGhlICJBcHBseSIg bGluayBhdCB0aGUgb2ZmaWNpYWwgd2ViIHBhZ2UNCiAgZGVzY3JpYmluZyB0aGUgcG9zaXRpb246 IDxodHRwczovL3JteC5taXh0aW9uYWwuZGUvc3RhdGljLzU0NjU3Y2RhLz4NCg0KICBHZXJkIFN0 b2xwbWFubg0KICBDRU8gb2YgTWl4dGlvbmFsIENvZGUgR21iSCAoYW5kIE9DYW1sIGhhY2tlciBv ZiB0aGUgZmlyc3QgaG91cikNCiAgQ29udGFjdCBhbmQgY29tcGFueSBkZXRhaWxzOiA8aHR0cHM6 Ly93d3cubWl4dGlvbmFsLmRlL2NvbnRhY3QuaHRtbD4NCg0KDQpTw6liYXN0aWVuIEJlc25pZXIg YXNrZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEknbSBsaXZpbmcgaW4gRnJhbmNlLCBjYW4gSSBhcHBs eSB0byB0aGUgcG9zaXRpb24gKHdlIGFyZSBuZWlnaGJvcnMhKT8NCg0KDQpHZXJkIFN0b2xwbWFu biByZXBsaWVkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIANCg0KICBXZWxsLCBJIGNhbiAoYXQgdGhlIG1vbWVudCkgb25s eSBtYWtlIGNvbnRyYWN0cyB1c2luZyBHZXJtYW4gbGF3IGFuZA0KICBmb3IgdGhlIHNvY2lhbCBz ZWN1cml0eSBzeXN0ZW0gaGVyZS4gU28sIGlmIHlvdSBuZWVkIGEgZG9jdG9yIHlvdSdkDQogIGhh dmUgdG8gdHJhdmVs4oCmIElmIG15IGNvbXBhbnkgd2FzIGEgYml0IGJpZ2dlciB0aGVyZSB3b3Vs ZCBiZSB0aGUNCiAgb3B0aW9uIG9mIG9wZW5pbmcgYSBzZWNvbmQgc2l0ZSBpbiBGcmFuY2UgKGV2 ZW4gYSB2ZXJ5IG1pbmltYWwgb25lKSwNCiAgYnV0IHRoZSBzZXR1cCBjb3N0cyBhcmUgc28gZmFy IHRvbyBoaWdoIChsYXd5ZXJzIGFuZCBhY2NvdW50YW50cyksIGFuZA0KICBpdCBpcyB0b28gZGlz dHJhY3RpbmcgZm9yIG1lIHRvIGtlZXAgdXAgd2l0aCB0aGUgZmluZSBwb2ludHMgb2YgdGhlDQog IHN5c3RlbSBpbiBGcmFuY2UuIFVuZm9ydHVuYXRlbHksIHRoZSBFVSBpcyBub3QgdGhhdCBmYXIg dGhhdCBpdCBpcw0KICBzdXBlciBzaW1wbGUgZm9yIGFuIGVtcGxveWVyIHRvIGhpcmUgYW55d2hl cmUgaW4gRXVyb3BlLiAtIFRoYW5rcyBmb3INCiAgYXNraW5nLg0KDQoNCnRpbnktaHR0cGQgMC41 DQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZl OiA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi10aW55LWh0dHBkLTAtNS81MzgxLzE+ DQoNCg0KU2ltb24gQ3J1YW5lcyBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEkganVzdCBy ZWxlYXNlZCB0aW55LWh0dHBkIDAuNSBhbmQgdGhlIG5ldyB0aW55LWh0dHBkLWNhbWx6aXAsIHdo aWNoDQogIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHVzZSBgZGVmbGF0ZScgdHJhbnNwYXJlbnRseSBm b3IgcXVlcmllcyBhbmQNCiAgcmVzcG9uc2VzLiBUaGUgc2VydmVyIGhhcyBldm9sdmVkIHF1aWV0 bHkgYW5kIGlzIGdldHRpbmcgc29tZXdoYXQgbW9yZQ0KICByb2J1c3Q6IEknbSB1c2luZyBpdCBm b3IgYW4gaW50ZXJuYWwgdG9vbCB3aXRoIGJpZyBodG1sIHBhZ2VzICh1cCB0bw0KICBzZXZlcmFs IE1CKSBhbmQgaXQncyByZWFzb25hYmx5IGZhc3QgYW5kIGRvZXNuJ3Qgc2VlbSB0bw0KICBtZW1s ZWFrLiBUaGVyZSdzIGFsc28gYW4gaW1wcm92ZWQgYGh0dHBfb2ZfZGlyJyB0byBxdWlja2x5IGFu ZCBzaW1wbHkNCiAgc2VydmUgYSBkaXJlY3Rvcnkgb24gYW4gYXJiaXRyYXJ5IHBvcnQuDQoNCiAg UHJldmlvdXMgYW5ub3VuY2VtZW50IFtoZXJlXQ0KDQoNCltoZXJlXSA8aHR0cHM6Ly9kaXNjdXNz Lm9jYW1sLm9yZy90L2Fubi10aW55LWh0dHBkLTAtMS80NzI3Pg0KDQoNClZpc3VhbCBTdHVkaW8g Q29kZSBwbHVnaW4gZm9yIE9DYW1sDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9y Zy90L2Fubi1wcmV2aWV3LXZpc3VhbC1zdHVkaW8tY29kZS1wbHVnaW4tZm9yLW9jYW1sLzUzOTUv MT4NCg0KDQpSdWRpIEdyaW5iZXJnIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSSdtIHBy b3VkIHRvIGFubm91bmNlIGEgcHJldmlldyByZWxlYXNlIG9mIGFuIFtWU0MgZXh0ZW5zaW9uIGZv cg0KICBPQ2FtbF0uIFlvdSBjYW4gZmV0Y2ggYW5kIGluc3RhbGwgdGhpcyBwbHVnaW4gZGlyZWN0 bHkgZnJvbSB0aGUNCiAgZXh0ZW5zaW9uIG1hcmtldHBsYWNlIGlmIHlvdSBzZWFyY2ggZm9yICJP Q2FtbCBMYWJzIi4gVGhlIGV4dGVuc2lvbg0KICBpc24ndCB5ZXQgbWF0dXJlLCBidXQgSSBiZWxp ZXZlIHRoYXQgaXQgb2ZmZXJzIGEgdXNlciBleHBlcmllbmNlDQogIGNvbXBhcmFibGUgdG8gb3Ro ZXIgVlNDIGV4dGVuc2lvbnMgZm9yIE9DYW1sIGFscmVhZHkuIFRoZSBwbHVnaW4NCiAgc2hvdWxk IGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBbb2NhbWwtbHNwXQ0KDQogIFRoZSBleHRlbnNp b24gaXMgZm9yIHRoZSBPQ2FtbCAicGxhdGZvcm0iLCB3aGljaCBtZWFucyB0aGF0IGl0cyBzY29w ZQ0KICBpbmNsdWRlcyBzdXBwb3J0IGZvciB2YXJpb3VzIHRvb2xzIHVzZWQgaW4gT0NhbWwgZGV2 ZWxvcG1lbnQgc3VjaCBhcw0KICBkdW5lLCBvcGFtLg0KDQogIEJ1ZyByZXBvcnRzICYgY29udHJp YnV0aW9ucyBhcmUgd2VsY29tZS4gSGFwcHkgaGFja2luZy4NCg0KDQpbVlNDIGV4dGVuc2lvbiBm b3IgT0NhbWxdDQo8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sbGFicy92c2NvZGUtb2NhbWwtcGxh dGZvcm0+DQoNCltvY2FtbC1sc3BdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwtbHNw Pg0KDQoNCkRpc21hczogYSB0b29sIGZvciBhdXRvbWF0aWNhbGx5IG1ha2luZyBjcm9zcy12ZXJz aW9ucyBvZiBvcGFtIHBhY2thZ2VzDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fu bi1wcm90b3R5cGUtZGlzbWFzLWEtdG9vbC1mb3ItYXV0b21hdGljYWxseS1tYWtpbmctY3Jvc3Mt dmVyc2lvbnMtb2Ytb3BhbS1wYWNrYWdlcy81NDA0LzE+DQoNCg0KRGFuaWlsIEJhdHVyaW4gYW5u b3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIANCg0KICBvcGFtLWNyb3NzLSogYXJlIHNlcmlvdXNseSBs YWdnaW5nIGJlaGluZCB0aGUgb2ZmaWNpYWwgb3BhbSByZXBvc2l0b3J5DQogIGFuZCBmZG9wZW4n cyBvcGFtLXdpbmRvd3MsIG5vdCBsZWFzdCBiZWNhdXNlIGltcG9ydGluZyBwYWNrYWdlcyBieQ0K ICBoYW5kIGlzIGEgbG90IG9mIHdvcmsuICBJIHN1cHBvc2UgYXQgbGVhc3QgYSBzZW1pLWF1dG9t YXRlZCBwcm9jZXNzDQogIGNvdWxkIGhlbHAgdGhvc2UgcmVwb3MgZ3JvdyBhbmQgc3RheSBpbiBz eW5jIHdpdGggdGhlIHVwc3RyZWFtIG11Y2gNCiAgZmFzdGVyLg0KDQogIEkndmUgbWFkZSBhIHBy b3RvdHlwZSBvZiBhIHRvb2wgZm9yICJzdGVhbGluZyIgcGFja2FnZXMgaW50bw0KICBjcm9zcy1y ZXBvcy4gRm9yIG9idmlvdXMgcmVhc29ucyBpdCdzIGNhbGxlZCBEaXNtYXMuICBZb3UgY2FuIGZp bmQgaXQNCiAgaGVyZTogPGh0dHBzOi8vZ2l0aHViLmNvbS9kbWJhdHVyaW4vc2NyaXB0cy9ibG9i L21hc3Rlci9kaXNtYXMubWw+DQoNCiAgTGltaXRhdGlvbnM6DQoNCiAg4oCiIHRoZSBjb2RlIGlz IGEgcmVhbCBtZXNzIGZvciBub3cNCiAg4oCiIG9ubHkgZHVuZSBpcyBzdXBwb3J0ZWQgYnkgYXV0 b21hdGljIGJ1aWxkIGNvbW1hbmQgYWRqdXN0bWVudA0KICDigKIgaXQgY2Fubm90IGhhbmRsZSBj YXNlcyB3aGVuIGJvdGggbmF0aXZlIGFuZCBjcm9zcy12ZXJzaW9uIG9mIGENCiAgICBkZXBlbmRl bmN5IGFyZSBuZWVkZWQNCg0KICBIb3dldmVyOg0KDQogIOKAoiBGb3Igc2ltcGxlIHBhY2thZ2Vz IHRoYXQgdXNlIGR1bmUgZXhjbHVzaXZlbHksIGl0J3MgY29tcGxldGVseQ0KICAgIGF1dG9tYXRl ZC4gSSd2ZSBwb3J0ZWQgYmlnc3RyZWFtYWYgYW5kIGFuZ3N0cm9tIHRvIHRlc3QgaXQsIGFuZA0K ICAgIGNyb3NzLXZlcnNpb25zIGJ1aWx0IGp1c3QgZmluZSBmcm9tIGl0cyBvdXRwdXQsIG5vIGVk aXRpbmcgd2FzDQogICAgbmVlZGVkLg0KICDigKIgSXQgYXV0b21hdGljYWxseSBjb252ZXJ0cyBk ZXBlbmRlbmNpZXMgZnJvbSBmb28gdG8gdG9vLSR0b29sY2hhaW4NCiAgICBhbmQgcmVtb3ZlcyBk ZXBlbmRlbmNpZXMgYW5kIGJ1aWxkIHN0ZXBzIG9ubHkNCiAgbmVlZGVkIGZvciBgd2l0aC10ZXN0 JyBhbmQgYHdpdGgtZG9jJy4NCg0KICDilIzilIDilIDilIDilIANCiAg4pSCICQgLi9kaXNtYXMu bWwgd2luZG93cyBjb250YWluZXJzIH4vZGV2ZWwvb3BhbS1yZXBvc2l0b3J5L3BhY2thZ2VzL2Nv bnRhaW5lcnMvY29udGFpbmVycy4yLjguMS9vcGFtDQogIOKUgiBvcGFtLXZlcnNpb246ICIyLjAi DQogIOKUgiBtYWludGFpbmVyOiAic2ltb24uY3J1YW5lcy4yMDA3QG00eC5vcmciDQogIOKUgiBz eW5vcHNpczoNCiAg4pSCICAgIkEgbW9kdWxhciwgY2xlYW4gYW5kIHBvd2VyZnVsIGV4dGVuc2lv biBvZiB0aGUgT0NhbWwgc3RhbmRhcmQgbGlicmFyeSINCiAg4pSCIGJ1aWxkOiBbDQogIOKUgiAg IFsiZHVuZSIgImJ1aWxkIiAiLXAiICJjb250YWluZXJzIiAiLWoiIGpvYnMgIi14IiAid2luZG93 cyJdDQogIOKUgiBdDQogIOKUgiBkZXBlbmRzOiBbDQogIOKUgiAgICJvY2FtbC13aW5kb3dzIiB7 Pj0gIjQuMDMuMCJ9DQogIOKUgiAgICJkdW5lIiB7Pj0gIjEuMSJ9DQogIOKUgiAgICJkdW5lLWNv bmZpZ3VyYXRvciINCiAg4pSCICAgInNlcS13aW5kb3dzIg0KICDilIIgXQ0KICDilIIgZGVwb3B0 czogWyJiYXNlLXVuaXgiICJiYXNlLXRocmVhZHMiXQ0KICDilIIgdGFnczogWyJzdGRsaWIiICJj b250YWluZXJzIiAiaXRlcmF0b3JzIiAibGlzdCIgImhlYXAiICJxdWV1ZSJdDQogIOKUgiBob21l cGFnZTogImh0dHBzOi8vZ2l0aHViLmNvbS9jLWN1YmUvb2NhbWwtY29udGFpbmVycy8iDQogIOKU giBkb2M6ICJodHRwczovL2MtY3ViZS5naXRodWIuaW8vb2NhbWwtY29udGFpbmVycyINCiAg4pSC IGRldi1yZXBvOiAiZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9jLWN1YmUvb2NhbWwtY29udGFpbmVy cy5naXQiDQogIOKUgiBidWctcmVwb3J0czogImh0dHBzOi8vZ2l0aHViLmNvbS9jLWN1YmUvb2Nh bWwtY29udGFpbmVycy9pc3N1ZXMvIg0KICDilIIgYXV0aG9yczogIlNpbW9uIENydWFuZXMiDQog IOKUgiB1cmwgew0KICDilIIgICBzcmM6ICJodHRwczovL2dpdGh1Yi5jb20vYy1jdWJlL29jYW1s LWNvbnRhaW5lcnMvYXJjaGl2ZS92Mi44LjEudGFyLmd6Ig0KICDilIIgICBjaGVja3N1bTogWw0K ICDilIIgICAgICJtZDU9ZDg0ZTA5YzVkMGFiYzUwMWFhMTdjZDUwMmUzMWEwMzgiDQogIOKUgiAg ICAgInNoYTUxMj04YjgzMmY0YWRhNjAzNWU4MGQ4MWJlMGNmYjdiZGZmYjY5NWVjNjdkNDY1ZWQ2 MDk3YTE0NDAxOWUyYjhhOGY5MDkwOTVlNzgwMTljM2RhMmQ4MTgxY2MzY2Q3MzBjZDQ4Zjc1MTll ODdkMzE2MjQ0MjU2MjEwM2I3ZjM2YWFiYiINCiAg4pSCICAgXQ0KICDilIIgfQ0KICDilIINCiAg 4pSCICQgLi9kaXNtYXMubWwgd2luZG93cyBjb250YWluZXJzIH4vZGV2ZWwvb3BhbS1yZXBvc2l0 b3J5L3BhY2thZ2VzL2NvbnRhaW5lcnMvY29udGFpbmVycy4yLjguMS9vcGFtIHwgZGlmZg0KICDi lIIgfi9kZXZlbC9vcGFtLXJlcG9zaXRvcnkvcGFja2FnZXMvY29udGFpbmVycy9jb250YWluZXJz LjIuOC4xL29wYW0gLQ0KICDilIIgM2MzLDQNCiAg4pSCIDwgc3lub3BzaXM6ICJBIG1vZHVsYXIs IGNsZWFuIGFuZCBwb3dlcmZ1bCBleHRlbnNpb24gb2YgdGhlIE9DYW1sIHN0YW5kYXJkIGxpYnJh cnkiDQogIOKUgiAtLS0NCiAg4pSCID4gc3lub3BzaXM6DQogIOKUgiA+ICAgIkEgbW9kdWxhciwg Y2xlYW4gYW5kIHBvd2VyZnVsIGV4dGVuc2lvbiBvZiB0aGUgT0NhbWwgc3RhbmRhcmQgbGlicmFy eSINCiAg4pSCIDUsN2M2DQogIOKUgiA8ICAgWyJkdW5lIiAiYnVpbGQiICItcCIgbmFtZSAiLWoi IGpvYnNdDQogIOKUgiA8ICAgWyJkdW5lIiAiYnVpbGQiICJAZG9jIiAiLXAiIG5hbWUgXSB7d2l0 aC1kb2N9DQogIOKUgiA8ICAgWyJkdW5lIiAicnVudGVzdCIgIi1wIiBuYW1lICItaiIgam9ic10g e3dpdGgtdGVzdH0NCiAg4pSCIC0tLQ0KICDilIIgPiAgIFsiZHVuZSIgImJ1aWxkIiAiLXAiICJj b250YWluZXJzIiAiLWoiIGpvYnMgIi14IiAid2luZG93cyJdDQogIOKUgiAxMCwxMWM5LDEwDQog IOKUgiA8ICAgIm9jYW1sIiB7ID49ICI0LjAzLjAiIH0NCiAg4pSCIDwgICAiZHVuZSIgeyA+PSAi MS4xIiB9DQogIOKUgiAtLS0NCiAg4pSCID4gICAib2NhbWwtd2luZG93cyIgez49ICI0LjAzLjAi fQ0KICDilIIgPiAgICJkdW5lIiB7Pj0gIjEuMSJ9DQogIOKUgiAxMywyMWMxMg0KICDilIIgPCAg ICJzZXEiDQogIOKUgiA8ICAgInF0ZXN0IiB7IHdpdGgtdGVzdCB9DQogIOKUgiA8ICAgInFjaGVj ayIgeyB3aXRoLXRlc3QgfQ0KICDilIIgPCAgICJvdW5pdCIgeyB3aXRoLXRlc3QgfQ0KICDilIIg PCAgICJpdGVyIiB7IHdpdGgtdGVzdCB9DQogIOKUgiA8ICAgImdlbiIgeyB3aXRoLXRlc3QgfQ0K ICDilIIgPCAgICJ1dXRmIiB7IHdpdGgtdGVzdCB9DQogIOKUgiA8ICAgIm1keCIgeyB3aXRoLXRl c3QgJiA+PSAiMS41LjAiICYgPCAiMi4wLjAiIH0NCiAg4pSCIDwgICAib2RvYyIgeyB3aXRoLWRv YyB9DQogIOKUgiAtLS0NCiAg4pSCID4gICAic2VxLXdpbmRvd3MiDQogIOKUgiAyMywyN2MxNCwx NQ0KICDilIIgPCBkZXBvcHRzOiBbDQogIOKUgiA8ICAgImJhc2UtdW5peCINCiAg4pSCIDwgICAi YmFzZS10aHJlYWRzIg0KICDilIIgPCBdDQogIOKUgiA8IHRhZ3M6IFsgInN0ZGxpYiIgImNvbnRh aW5lcnMiICJpdGVyYXRvcnMiICJsaXN0IiAiaGVhcCIgInF1ZXVlIiBdDQogIOKUgiAtLS0NCiAg 4pSCID4gZGVwb3B0czogWyJiYXNlLXVuaXgiICJiYXNlLXRocmVhZHMiXQ0KICDilIIgPiB0YWdz OiBbInN0ZGxpYiIgImNvbnRhaW5lcnMiICJpdGVyYXRvcnMiICJsaXN0IiAiaGVhcCIgInF1ZXVl Il0NCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgVGhpbmdzIHRvIGRvOg0KDQogIOKAoiBpZGVudGlm eSBhbGwgcGFja2FnZXMgdGhhdCBkb24ndCBuZWVkIGNyb3NzLXZlcnNpb25zLiBJcyBjcHBvIG9u ZSBvZg0KICAgIHRoZW0sIGZvciBleGFtcGxlPw0KICDigKIgYWRkIHN1cHBvcnQgZm9yIGNhc2Vz IHdoZW4gYm90aCBuYXRpdmUgYW5kIGNyb3NzIHZlcnNpb25zIGFyZQ0KICAgIG5lZWRlZC4gSWYg bWVuaGlyIHRoZSBvbmx5IG9uZT8NCiAg4oCiIGFkZCBzdXBwb3J0IGZvciBvdGhlciBidWlsZCBz eXN0ZW1zLiBEbyBhbGwgb2YgdGhlbSB3b3JrIHdlbGwgd2l0aA0KICAgIGBPQ0FNTEZJTkRfVE9P TENIQUlOPXdpbmRvd3NgIGlmIHRoZSBidWlsZCBzZXR1cCBpcyB3cml0dGVuDQogICAgY29ycmVj dGx5Pw0KDQogIElucHV0IGZyb20gQHRvb3RzIGFuZCBAcGlyYm8gaXMgd2VsY29tZS4NCg0KDQpS b21haW4gQmVhdXhpcyB0aGVuIHNhaWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFRoYXQncyBhIGdy ZWF0IGluaXRpYXRpdmUhIEhlcmUgYXJlIGEgY291cGxlIG9mIHRob3VnaHRzOg0KICDigKIgRm9y IGR1bmUtYmFzZWQgcGFja2FnZXMsIHRoaW5ncyBhcmUgaW5kZWVkIHByZXR0eQ0KICAgIHN0cmFp Z2h0LWZvcndhcmQuIEZpbmRpbmcgb3V0IHdoaWNoIGRlcGVuZGVuY2llcyBuZWVkIHRvIGJlIHBv cnRlZA0KICAgIGFzIGNyb3NzLWRlcGVuZGVuY3kgaXMgaW5kZWVkIHRoZSBwYXJ0IHRoYXQncyBo YXJkIHRvIGF1dG9tYXRpemUNCiAg4oCiIEZvciBvdGhlciBidWlsZCBzeXN0ZW1zLCBpdCdzIGxl c3MgY2xlYXIgdG8gbWUgaG93IHRvDQogICAgYXV0b21hdGl6ZS4gTWF5YmUgb3RoZXJzIGhhdmUg c29tZSB0aG91Z2h0cyBhYm91dCBpdC4NCiAg4oCiIFRoZSBDSSBzeXN0ZW0gb24gb3BhbS1jcm9z cy13aW5kb3dzIGlzIHByZXR0eSBnb29kIGF0IGJ1aWxkaW5nIGZyb20NCiAgICBzY3JhdGNoIGFu ZCBmYWlsaW5nIGlmIHNvbWUgZGVwcyBhcmUgbWlzc2luZyBzbyB0cmlhbCBhbmQgZXJyb3INCiAg ICB0aGVyZSBjYW4gYmUgYSBncmVhdCB0b29sLg0KICDigKIgT25jZSBzb2x2ZWQgZm9yIG9uZSBj cm9zcyBzaXR1YXRpb24sIHRoZSBwcm9ibGVtIG9mDQogICAgY3Jvc3MtZGVwZW5kZW5jaWVzIHNo b3VsZCBiZSBleGFjdGx5IHRoZSBzYW1lIGZvciBhbGwgb3RoZXIgY3Jvc3MNCiAgICBlbnZpcm9u bWVudCAoYW5kcm9pZCwgaU9TKQ0KDQogIEkgaGF2ZW4ndCBsb29rZWQgYXQgdGhlIHRvb2wgdmVy eSBjbG9zZWx5IHlldCBidXQgSSdkIHNheSBhIGZpcnN0DQogIGltcHJvdmVtZW50IHdvdWxkIGJl IHRvIGJlIGFibGUgdG8gdHJhY2sgY3Jvc3MtZGVwZW5kZW5jaWVzIHJlc29sdXRpb24NCiAgYW5k IGdlbmVyYXRlIG5ldyB2ZXJzaW9uIG9mIHRoZSBwYWNrYWdlIHVzaW5nIHRoZW0gYW5kL29yIGdl bmVyYXRlDQogIG90aGVyIGNyb3NzLWNvbXBpbGVkIHBhY2thZ2VzIHVzaW5nIHRoZW0uDQoNCg0K QW50b24gS29jaGtvdiBzYWlkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIANCg0KICBGb3IgYXV0b21hdGVkIHB1bGwgcmVxdWVzdHMsIHlvdSBt aWdodCBiZSBpbnRlcmVzdGVkIGluDQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvZGVw ZW5kYWJvdC1hbmQtb2NhbWwvNDI4Mj4NCg0KDQpEYW5paWwgQmF0dXJpbiB0aGVuIGFza2VkDQri lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIANCg0KICBJJ20gbm90IHN1cmUgaWYgSSB1bmRlcnN0YW5kIHRoZSBw cmVtaXNlIG9mIGRlcGVuZGFib3QuIFdoeSB3b3VsZA0KICBhbnlvbmUgaGFyZGNvZGUgc3BlY2lm aWMgZGVwZW5kZW5jeSB2ZXJzaW9ucz8gTWF5YmUgaXQgbWFrZXMgc2Vuc2UgaW4NCiAgY2VydGFp biBlY29zeXN0ZW1zIHRoYXQgc3VmZmVyIGZyb20gbmV2ZXItZW5kaW5nIGVjb2xvZ2ljYWwgZGlz YXN0ZXJz4oCmDQogIDspDQoNCiAgSW4gYW55IGNhc2UsIG1vc3Qgb3BhbSBwYWNrYWdlcyBkb24n dCBoYXZlIGEgY29uc3RyYWludCBvbiB0aGUgdXBwZXINCiAgdmVyc2lvbnMgb2YgdGhlaXIgZGVw ZW5kZW5jaWVzLiBDYW4gZGVwZW5kYWJvdCB1c2UgY3VzdG9tIHRyYWNraW5nDQogIHJ1bGVzIHRv IGNoZWNrIGZvciBwcmVzZW5zZSBvZiBhIG5ld2VyIHZlcnNpb24gaW4gdGhlIHJlcG8/ICBNeQ0K ICB0aG91Z2h0IHdhcyBtdWNoIHNpbXBsZXIgYWN0dWFsbHk6IHRyYWNrIHRoZSBjb21taXRzIGlu DQogIG9wYW0tcmVwb3NpdG9yeSwgcnVuIHJlY2VudGx5IGNoYW5nZWQgZmlsZXMgdGhyb3VnaCBE aXNtYXMgYW5kIHNlbmQNCiAgcHVsbCByZXF1ZXN0cyB0byBvcGFtLWNyb3NzLSoNCg0KDQpZYXdh ciBBbWluIHJlcGxpZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgA0KDQogIEl0J3MgY29tbW9uIHByYWN0aWNlIG5vd2FkYXlzIHRvIHVzZSBz ZW1hbnRpYyB2ZXJzaW9uaW5nIGFuZCBoYXZlDQogIGxvY2tmaWxlcyBmb3IgcmVwcm9kdWNpYmxl IGJ1aWxkcy4gRGVwZW5kYWJvdCB1cGRhdGVzIHNlbWFudGljIHZlcnNpb24NCiAgcmFuZ2VzIGFu ZCBsb2NrZmlsZXMuIFNlZSBlLmcuDQoNCiAg4oCiIDxodHRwczovL2dpdGh1Yi5jb20vdGhvdWdo dGJvdC92ZWx2ZXRlZW4vcHVsbC8zMS9maWxlcz4NCiAg4oCiIDxodHRwczovL2dpdGh1Yi5jb20v bW96aWxsYS9hZHIvcHVsbC83Ny9maWxlcz4NCg0KDQpNdWx0aWNvcmUgT0NhbWw6IE1hcmNoIDIw MjAgdXBkYXRlDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAN Cg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L211bHRpY29yZS1v Y2FtbC1tYXJjaC0yMDIwLXVwZGF0ZS81NDA2LzE+DQoNCg0KQW5pbCBNYWRoYXZhcGVkZHkgYW5u b3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBXZWxjb21lIHRvIHRoZSBNYXJj aCAyMDIwIG5ld3MgdXBkYXRlIGZyb20gdGhlIE11bHRpY29yZSBPQ2FtbCB0ZWFtIQ0KICBUaGlz IHVwZGF0ZSBoYXMgYmVlbiBhc3NlbWJsZWQgd2l0aCBAc2hha3RoaW1hYW4gYW5kIEBrYXljZWVz cmssIGFzDQogIHdpdGggdGhlIFtGZWJydWFyeV0gYW5kIFtKYW51YXJ5XSBvbmVzLg0KDQogIE91 ciB3b3JrIHRoaXMgbW9udGggd2FzIHByaW1hcmlseSBmb2N1c2VkIG9uIHBlcmZvcm1hbmNlIGlt cHJvdmVtZW50cw0KICB0byB0aGUgTXVsdGljb3JlIE9DYW1sIGNvbXBpbGVyIGFuZCBydW50aW1l LCBhcyBwYXJ0IG9mIGENCiAgY29tcHJlaGVuc2l2ZSBldmFsdWF0aW9uIGV4ZXJjaXNlLiBXZSBj b250aW51ZSB0byBhZGQgYWRkaXRpb25hbA0KICBiZW5jaG1hcmtzIHRvIHRoZSBTYW5kbWFyayB0 ZXN0IHN1aXRlLiBUaGUgZXZlbnRsb2cgdHJhY2luZyBzeXN0ZW0gYW5kDQogIHRoZSB1c2Ugb2Yg aGFzaCB0YWJsZXMgZm9yIG1hcnNoYWxpbmcgaW4gdXBzdHJlYW0gT0NhbWwgYXJlIGluDQogIHBy b2dyZXNzLCBhbmQgbW9yZSBQUnMgYXJlIGJlaW5nIHF1ZXVlZCB1cCBmb3IgT0NhbWwgNC4xMS4w LWRldiBhcw0KICB3ZWxsLg0KDQogIFRoZSBiaWdnZXN0IG9ic2VydmFibGUgY2hhbmdlIGZvciB1 c2VycyB0cnlpbmcgdGhlIGJyYW5jaCBpcyB0aGF0IGENCiAgbmV3IEdDICh0aGUgInBhcmFsbGVs IG1pbm9yIGdjIikgaGFzIGJlZW4gbWVyZ2VkIGluIHByZWZlcmVuY2UgdG8gdGhlDQogIHByZXZp b3VzIG9uZSAoInRoZSBjb25jdXJyZW50IG1pbm9yIGdjIikuICBXZSB3aWxsIGhhdmUgdGhlIGRl dGFpbHMgaW4NCiAgbG9uZ2VyIGZvcm0gYXQgYSBsYXRlciBzdGFnZSwgYnV0IHRoZSBlc3NlbnRp YWwgZ2lzdCBpcyB0aGF0ICp0aGUNCiAgcGFyYWxsZWwgbWlub3IgR0Mgbm8gbG9uZ2VyIHJlcXVp cmVzIGEgcmVhZCBiYXJyaWVyIG9yIGNoYW5nZXMgdG8gdGhlDQogIEMgQVBJKi4gIEl0IG1heSBo YXZlIHNsaWdodGx5IHdvcnNlIHNjYWxhYmlsaXR5IHByb3BlcnRpZXMgYXQgYSB2ZXJ5DQogIGhp Z2ggbnVtYmVyIG9mIGNvcmVzLCBidXQgaXMgcm91Z2hseSBlcXVpdmFsZW50IGF0IHVwIHRvIDI0 IGNvcmVzIGluDQogIG91ciBldmFsdWF0aW9ucy4gIEdpdmVuIHRoZSB2YXN0IHVzYWJpbGl0eSBp bXByb3ZlbWVudCBmcm9tIG5vdCBoYXZpbmcNCiAgdG8gcG9ydCBleGlzdGluZyBDIEZGSSB1c2Vz LCB3ZSBoYXZlIGRlY2lkZWQgdG8gbWFrZSB0aGUgcGFyYWxsZWwNCiAgbWlub3IgR0MgdGhlIGRl ZmF1bHQgb25lIGZvciBvdXIgZmlyc3QgdXBzdHJlYW0gcnVudGltZSBwYXRjaGVzLiBUaGUNCiAg Y29uY3VycmVudCBtaW5vciBHQyBmb2xsb3cgYXQgYSBsYXRlciBzdGFnZSB3aGVuIHdlIHJhbXAg dXAgdGVzdGluZyB0bw0KICA2NC1jb3JlKyBtYWNoaW5lcy4gIFRoZSBbbXVsdGljb3JlIG9wYW0g cmVtb3RlXSBoYXMgYmVlbiB1cGRhdGVkIHRvDQogIHJlZmxlY3QgdGhlc2UgY2hhbmdlcywgZm9y IHRob3NlIHdobyB3aXNoIHRvIHRyeSBpdCBvdXQgYXQgaG9tZS4NCg0KICBXZSBhcmUgbm93IGF0 IGEgc3RhZ2Ugd2hlcmUgd2UgYXJlIHBvcnRpbmcgbGFyZ2VyIGFwcGxpY2F0aW9ucyB0bw0KICBt dWx0aWNvcmUuICBUaGFua3MgZ28gdG86DQogIOKAoiBAVW5peEp1bmtpZSB3aG8gaGVscGVkIHVz IGludGVncmF0ZSB0aGUgR3JhbSBNYXRyaXggYmVuY2htYXJrIGluDQogICAgPGh0dHBzOi8vZ2l0 aHViLmNvbS9vY2FtbC1iZW5jaC9zYW5kbWFyay9pc3N1ZXMvOTk+DQogIOKAoiBAamh3IGhhcyBk b25lIGV4dGVuc2l2ZSB3b3JrIHRvd2FyZHMgc3VwcG9ydGluZyBTeXN0aHJlYWRzIGluDQogICAg PGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1tdWx0aWNvcmUvb2NhbWwtbXVsdGljb3JlL3B1bGwv MjQwPi4gU3lzdGhyZWFkcw0KICAgIGlzIGN1cnJlbnRseSBkaXNhYmxlZCBpbiBtdWx0aWNvcmUs IGxlYWRpbmcgdG8gc29tZSBwb3B1bGFyIHBhY2thZ2VzDQogICAgbm90IGNvbXBpbGluZy4NCiAg 4oCiIEBhbnRyb24gaGFzIGJlZW4gYWR2aXNpbmcgdXMgb24gaG93IGJlc3QgdG8gcG9ydCBgTHd0 X3ByZWVtcHRpdmVgDQogICAgYW5kIHRoZSBgTHd0X3VuaXhgIG1vZHVsZXMgdG8gbXVsdGljb3Jl LCBnaXZpbmcgdXMgYSB3aWRlbHkgdXNlZCBJTw0KICAgIHN0YWNrIHRvIHRlc3QgbW9yZSBhcHBs aWNhdGlvbnMgYWdhaW5zdC4NCg0KICBJZiB5b3UgZG8gaGF2ZSBvdGhlciBzdWdnZXN0aW9ucyBm b3IgYXBwbGljYXRpb24gdGhhdCB5b3UgdGhpbmsgbWlnaHQNCiAgcHJvdmlkZSB1c2VmdWwgYmVu Y2htYXJrcywgdGhlbiBwbGVhc2UgZG8gZ2V0IGluIHRvdWNoIHdpdGggbXlzZWxmIG9yDQogIEBr YXljZWVzcmsuDQoNCiAgT250byB0aGUgZGV0YWlscyEgVGhlIHZhcmlvdXMgb25nb2luZyBhbmQg Y29tcGxldGVkIHRhc2tzIGZvcg0KICBNdWx0aWNvcmUgT0NhbWwgYXJlIGxpc3RlZCBmaXJzdCwg d2hpY2ggaXMgZm9sbG93ZWQgYnkgdGhlIGNoYW5nZXMgdG8NCiAgdGhlIFNhbmRtYXJrIGJlbmNo bWFya2luZyBpbmZyYXN0cnVjdHVyZSBhbmQgb25nb2luZyBQUnMgdG8gdXBzdHJlYW0NCiAgT0Nh bWwuDQoNCg0KW0ZlYnJ1YXJ5XQ0KPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9tdWx0aWNv cmUtb2NhbWwtZmViLTIwMjAtdXBkYXRlLzUyMjc+DQoNCltKYW51YXJ5XQ0KPGh0dHBzOi8vZGlz Y3Vzcy5vY2FtbC5vcmcvdC9tdWx0aWNvcmUtb2NhbWwtamFudWFyeS0yMDIwLXVwZGF0ZS81MDkw Pg0KDQpbbXVsdGljb3JlIG9wYW0gcmVtb3RlXQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1t dWx0aWNvcmUvbXVsdGljb3JlLW9wYW0+DQoNCk11bHRpY29yZSBPQ2FtbA0K4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCuKXiiBPbmdvaW5nDQoNCiAg4oCi IFtvY2FtbC1tdWx0aWNvcmUvb2NhbWwtbXVsdGljb3JlIzI0MF0gUHJvcG9zZWQgaW1wbGVtZW50 YXRpb24gb2YNCiAgICB0aHJlYWRzIGluIHRlcm1zIG9mIERvbWFpbiBhbmQgQXRvbWljDQoNCiAg ICBBIG5ldyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgYFRocmVhZHNgIGxpYnJhcnkgZm9yIHVzZSB3 aXRoIHRoZSBuZXcNCiAgICBgRG9tYWluYCBhbmQgYEF0b21pY2AgbW9kdWxlcyBpbiBNdWx0aWNv cmUgT0NhbWwgaGFzIGJlZW4NCiAgICBwcm9wb3NlZC4gVGhpcyBidWlsZHMgRHVuZSAyLjQuMCB3 aGljaCBpbiB0dXJuIG1ha2VzIGl0IHVzZWZ1bCB0bw0KICAgIGJ1aWxkIG90aGVyIHBhY2thZ2Vz LiBUaGlzIFBSIGlzIG9wZW4gZm9yIHJldmlldy4NCg0KICDigKIgW29jYW1sLW11bHRpY29yZS9z YWZlcG9pbnRzLWNtbS1tYWNoXSBCZXR0ZXIgc2FmZSBwb2ludHMgZm9yIE9DYW1sDQoNCiAgICBB IG5ld2VyIGltcGxlbWVudGF0aW9uIHRvIGluc2VydCBzYWZlIHBvaW50cyBhdCB0aGUgQ21tIGxl dmVsIGlzDQogICAgYmVpbmcgd29ya2VkIHVwb24gaW4gdGhpcyBicmFuY2guDQoNCg0KICBbb2Nh bWwtbXVsdGljb3JlL29jYW1sLW11bHRpY29yZSMyNDBdDQogIDxodHRwczovL2dpdGh1Yi5jb20v b2NhbWwtbXVsdGljb3JlL29jYW1sLW11bHRpY29yZS9wdWxsLzI0MD4NCg0KICBbb2NhbWwtbXVs dGljb3JlL3NhZmVwb2ludHMtY21tLW1hY2hdDQogIDxodHRwczovL2dpdGh1Yi5jb20vYW5tb2xz YWhvbzI1L29jYW1sLW11bHRpY29yZS90cmVlL3NhZmVwb2ludHMtY21tLW1hY2g+DQoNCg0K4peK IENvbXBsZXRlZA0KDQogIFRoZSBmb2xsb3dpbmcgUFJzIGhhdmUgYmVlbiBtZXJnZWQgaW50byBN dWx0aWNvcmUgT0NhbWw6DQoNCiAg4oCiIFtvY2FtbC1tdWx0aWNvcmUvb2NhbWwtbXVsdGljb3Jl IzMwM10gQWNjb3VudCBjb3JyZWN0bHkgZm9yDQogICAgaW5jcmVtZW50YWwgbWFyayBidWRnZXQN Cg0KICAgIFRoZSBwYXRjaCBjb3JyZWN0bHkgbWVhc3VyZXMgdGhlIGluY3JlbWVudGFsIG1hcmsg YnVkZ2V0IHZhbHVlLCBhbmQNCiAgICBpbXByb3ZlcyB0aGUgbWF4aW11bSBsYXRlbmN5IGZvciB0 aGUgYG1lbmhpci5vY2FtbHlgIGJlbmNobWFyay4NCg0KICDigKIgW29jYW1sLW11bHRpY29yZS9v Y2FtbC1tdWx0aWNvcmUjMzA3XSBQdXQgdGhlIHBoYXNlIGNoYW5nZSBldmVudCBpbg0KICAgIHRo ZSBhY3R1YWwgcGhhc2UgY2hhbmdlIGNvZGUuIFRoZSBQUiBpbmNsdWRlcyB0aGUNCiAgICBgbWFq b3JfZ2MvcGhhc2VfY2hhbmdlYCBldmVudCBpbiB0aGUgYXBwcm9wcmlhdGUgY29udGV4dC4NCg0K ICDigKIgW29jYW1sLW11bHRpY29yZS9vY2FtbC1tdWx0aWNvcmUjMzA5XSBEb24ndCB0YWtlIGFs bCB0aGUgZnVsbCBwb29scw0KICAgIGluIG9uZSBnby4NCg0KICAgIFRoZSBjb2RlIGNoYW5nZSBz ZWxlY3RzIG9uZSBvZiB0aGUgYGdsb2JhbF9mdWxsX3Bvb2xzYCB0byB0cnkNCiAgICBzd2VlcGlu ZyBpdCBsYXRlciwgaW5zdGVhZCBvZiBhZG9wdGluZyBhbGwgb2YgdGhlIGZ1bGwgb25lcy4NCg0K ICDigKIgW29jYW1sLW11bHRpY29yZS9vY2FtbC1tdWx0aWNvcmUjMzEwXSBTdGF0aXN0aWNzIGZv ciB0aGUgY3VycmVudA0KICAgIGRvbWFpbiBhcmUgbW9yZSByZWNlbnQgdGhhbiBvdGhlciBkb21h aW5zDQoNCiAgICBUaGUgc3RhdGlzdGljcyAoYG1pbm9yX3dvcmRzYCwgYHByb21vdGVkX3dvcmRz YCwgYG1ham9yX3dvcmRzYCwNCiAgICBgbWlub3JfY29sbGVjdGlvbnNgKSBmb3IgdGhlIGN1cnJl bnQgZG9tYWluIGFyZSBtb3JlIHJlY2VudCwgYW5kIGFyZQ0KICAgIHVzZWQgaW4gdGhlIHJpZ2h0 IGNvbnRleHQuDQoNCiAg4oCiIFtvY2FtbC1tdWx0aWNvcmUvb2NhbWwtbXVsdGljb3JlIzMxNV0g V3JpdGVzIGluIGBjYW1sX2JsaXRfZmllbGRzYA0KICAgIHNob3VsZCBhbHdheXMgdXNlIGBjYW1s X21vZGlmeV9maWVsZGAgdG8gcmVjb3JkIGB5b3VuZ190b195b3VuZ2ANCiAgICBwb2ludGVycw0K DQogICAgVGhlIFBSIGVuZm9yY2VzIHRoYXQgYGNhbWxfbW9kaWZ5X2ZpZWxkKClgIGlzIGFsd2F5 cyB1c2VkIHRvIHN0b3JlDQogICAgYHlvdW5nX3RvX3lvdW5nYCBwb2ludGVycy4NCg0KICDigKIg W29jYW1sLW11bHRpY29yZS9vY2FtbC1tdWx0aWNvcmUjMzE2XSBGaXggYnVnIHdpdGggYFdlYWsu YmxpdGAuDQoNCiAgICBUaGUgZXBoZW1lcm9ucyBhcmUgYWxsb2NhdGVkIGFzIG1hcmtlZCwgYnV0 LCB0aGUga2V5cyBvciBkYXRhIGNhbiBiZQ0KICAgIHVubWFya2VkLiBUaGUgYmxpdCBvcGVyYXRp b25zIGNvcHkgd2VhayByZWZlcmVuY2VzIGZyb20gb25lDQogICAgZXBoZW1lcm9uIHRvIGFub3Ro ZXIgd2l0aG91dCBtYXJraW5nIHRoZW0uIFRoZSBwYXRjaCBtYXJrcyB0aGUga2V5cw0KICAgIHRo YXQgYXJlIGJsaXR0ZWQgaW4gb3JkZXIgdG8ga2VlcCB0aGUgdW5yZWFjaGFibGUga2V5cyBhbGl2 ZSBmb3INCiAgICBhbm90aGVyIG1ham9yIGN5Y2xlLg0KDQogIOKAoiBbb2NhbWwtbXVsdGljb3Jl L29jYW1sLW11bHRpY29yZSMzMTddIFJldHVybiBlYXJseSBmb3IgMCBsZW5ndGggYmxpdA0KDQog ICAgVGhlIFBSIGZvcmNlcyBhIGBDQU1McmV0dXJuKClgIGNhbGwgaWYgdGhlIGJsaXQgbGVuZ3Ro IGlzIHplcm8gaW4NCiAgICBgYnl0ZXJ1bi93ZWFrLmNgLg0KDQogIOKAoiBbb2NhbWwtbXVsdGlj b3JlL29jYW1sLW11bHRpY29yZSMzMjBdIE1vdmUgYG51bV9kb21haW5zX3J1bm5pbmdgDQogICAg ZGVjcmVtZW50DQoNCiAgICBUaGUgYGNhbWxfZG9tYWluX2Fsb25lKClgIGludm9jYXRpb24gbmVl ZHMgdG8gYmUgdXNlZCBpbiB0aGUgc2hhcmVkDQogICAgaGVhcCB0ZWFyZG93biwgYW5kIGhlbmNl IHRoZSBgbnVtX2RvbWFpbnNfcnVubmluZ2AgZGVjcmVtZW50IGlzDQogICAgbW92ZWQgYXMgdGhl IGxhc3Qgb3BlcmF0aW9uIGZvciBhdCBsZWFzdCB0aGUgYHNoYXJlZF9oZWFwYCBsb2NrZnJlZQ0K ICAgIGZhc3QgcGF0aHMuDQoNCg0KICBbb2NhbWwtbXVsdGljb3JlL29jYW1sLW11bHRpY29yZSMz MDNdDQogIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwtbXVsdGljb3JlL29jYW1sLW11bHRpY29y ZS9wdWxsLzMwMz4NCg0KICBbb2NhbWwtbXVsdGljb3JlL29jYW1sLW11bHRpY29yZSMzMDddDQog IDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwtbXVsdGljb3JlL29jYW1sLW11bHRpY29yZS9wdWxs LzMwNz4NCg0KICBbb2NhbWwtbXVsdGljb3JlL29jYW1sLW11bHRpY29yZSMzMDldDQogIDxodHRw czovL2dpdGh1Yi5jb20vb2NhbWwtbXVsdGljb3JlL29jYW1sLW11bHRpY29yZS9wdWxsLzMwOT4N Cg0KICBbb2NhbWwtbXVsdGljb3JlL29jYW1sLW11bHRpY29yZSMzMTBdDQogIDxodHRwczovL2dp dGh1Yi5jb20vb2NhbWwtbXVsdGljb3JlL29jYW1sLW11bHRpY29yZS9wdWxsLzMxMD4NCg0KICBb b2NhbWwtbXVsdGljb3JlL29jYW1sLW11bHRpY29yZSMzMTVdDQogIDxodHRwczovL2dpdGh1Yi5j b20vb2NhbWwtbXVsdGljb3JlL29jYW1sLW11bHRpY29yZS9wdWxsLzMxNT4NCg0KICBbb2NhbWwt bXVsdGljb3JlL29jYW1sLW11bHRpY29yZSMzMTZdDQogIDxodHRwczovL2dpdGh1Yi5jb20vb2Nh bWwtbXVsdGljb3JlL29jYW1sLW11bHRpY29yZS9wdWxsLzMxNj4NCg0KICBbb2NhbWwtbXVsdGlj b3JlL29jYW1sLW11bHRpY29yZSMzMTddDQogIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwtbXVs dGljb3JlL29jYW1sLW11bHRpY29yZS9wdWxsLzMxNz4NCg0KICBbb2NhbWwtbXVsdGljb3JlL29j YW1sLW11bHRpY29yZSMzMjBdDQogIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwtbXVsdGljb3Jl L29jYW1sLW11bHRpY29yZS9wdWxsLzMyMD4NCg0KDQpCZW5jaG1hcmtpbmcNCuKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIFRoZSBbU2FuZG1hcmtdIHBlcmZvcm1hbmNl IGJlbmNobWFya2luZyB0ZXN0IHN1aXRlIGhhcyBoYWQgbmV3ZXINCiAgYmVuY2htYXJrcyBhZGRl ZCwgYW5kIHdvcmsgaXMgdW5kZXJ3YXkgdG8gZW5oYW5jZSBpdHMgZnVuY3Rpb25hbGl0eS4NCg0K ICDigKIgW29jYW1sLWJlbmNoL3NhbmRtYXJrIzg4XSBBZGQgUGluZ1BvbmcgTXVsdGljb3JlIGJl bmNobWFyaw0KDQogICAgVGhlIFBpbmdQb25nIGJlbmNobWFyayB0aGF0IHVzZXMgcHJvZHVjZXIg YW5kIGNvbnN1bWVyIHF1ZXVlcyBoYXMNCiAgICBub3cgYmVlbiBpbmNsdWRlZCBpbnRvIFNhbmRt YXJrLg0KDQogIOKAoiBbb2NhbWwtYmVuY2gvc2FuZG1hcmsjOThdIEFkZCB0aGUgcmVhZC93cml0 ZSBJcm1pbiBiZW5jaG1hcmsNCg0KICAgIEEgYmFzaWMgcmVhZC93cml0ZSBmaWxlIHBlcmZvcm1h bmNlIGJlbmNobWFyayBmb3IgSXJtaW4gaGFzIGJlZW4NCiAgICBhZGRlZCB0byBTYW5kbWFyay4g WW91IGNhbiB2YXJ5IHRoZSBmb2xsb3dpbmcgaW5wdXQgcGFyYW1ldGVyczoNCiAgICBudW1iZXIg b2YgYnJhbmNoZXMsIG51bWJlciBvZiBrZXlzLCBwZXJjZW50YWdlIG9mIHJlYWRzIGFuZCB3cml0 ZXMsDQogICAgbnVtYmVyIG9mIGl0ZXJhdGlvbnMsIGFuZCB0aGUgbnVtYmVyIG9mIHdyaXRlIG9w ZXJhdGlvbnMuDQoNCiAg4oCiIFtvY2FtbC1iZW5jaC9zYW5kbWFyayMxMDBdIEFkZCBHcmFtIE1h dHJpeCBiZW5jaG1hcmsNCg0KICAgICBBIHJlcXVlc3QgW29jYW1sLWJlbmNoL3NhbmRtYXJrIzk5 XSB0byBpbmNsdWRlIHRoZSBHcmFtIE1hdHJpeA0KICAgIGluaXRpYWxpemF0aW9uIG51bWVyaWNh bCBiZW5jaG1hcmsgd2FzIGNyZWF0ZWQuIFRoaXMgaXMgdXNlZnVsIGZvcg0KICAgIG1hY2hpbmUg bGVhcm5pbmcgYXBwbGljYXRpb25zIGFuZCBpcyBub3cgYXZhaWxhYmxlIGluIHRoZSBTYW5kbWFy aw0KICAgIHBlcmZvcm1hbmNlIGJlbmNobWFyayBzdWl0ZS4gVGhlIHNwZWVkdXANCiAgICAoc2Vx dWVudGlhbF90aW1lL211bHRpX3RocmVhZGVkX3RpbWUpIHZlcnN1cyBudW1iZXIgb2YgY29yZXMg Zm9yDQogICAgTXVsdGljb3JlIChDb25jdXJyZW50IE1pbm9yIENvbGxlY3RvciksIFBhcm1hcCBh bmQgUGFyYW55IGlzIHF1aXRlDQogICAgc2lnbmlmaWNhbnQgYW5kIGlsbHVzdHJhdGVkIGluIHRo ZSBncmFwaDoNCiAgICA8aHR0cHM6Ly9hd3MxLmRpc2NvdXJzZS1jZG4uY29tL3N0YW5kYXJkMTEv dXBsb2Fkcy9vY2FtbC9vcmlnaW5hbC8yWC8yLzIwZGM4NjlhOGRkYTFjODE1NzE0YTk3ZTZhODRm NmY4MWM5MTRjZjQucG5nPg0KDQogIOKAoiBbb2NhbWwtYmVuY2gvc2FuZG1hcmsjMTAzXSBBZGQg ZGVwZW5kIHRhcmdldCBpbiBNYWtlZmlsZQ0KDQogICAgU2FuZG1hcmsgbm93IGluY2x1ZGVzIGEg YGRlcGVuZGAgdGFyZ2V0IGRlZmluZWQgaW4gdGhlIE1ha2VmaWxlIHRvDQogICAgY2hlY2sgdGhh dCBib3RoIGBsaWJnbXAtZGV2YCBhbmQgYGxpYmR3LWRldmAgcGFja2FnZXMgYXJlIGluc3RhbGxl ZA0KICAgIGFuZCBhdmFpbGFibGUgb24gVWJ1bnR1Lg0KDQogIOKAoiBbb2NhbWwtYmVuY2gvc2Fu ZG1hcmsjOTBdIE1vcmUgcGFyYWxsZWwgYmVuY2htYXJrcw0KDQogICAgQW4gaXNzdWUgaGFzIGJl ZW4gY3JlYXRlZCB0byBhZGQgbW9yZSBwYXJhbGxlbCBiZW5jaG1hcmtzLiBXZSB3aWxsDQogICAg dXNlIHRoaXMgdG8ga2VlcCB0cmFjayBvZiB0aGUgcmVxdWVzdHMuIFBsZWFzZSBmZWVsIGZyZWUg dG8gYWRkIHlvdXINCiAgICB3aXNoIGxpc3Qgb2YgYmVuY2htYXJrcyENCg0KDQpbU2FuZG1hcmtd IDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwtYmVuY2gvc2FuZG1hcms+DQoNCltvY2FtbC1iZW5j aC9zYW5kbWFyayM4OF0NCjxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwtYmVuY2gvc2FuZG1hcmsv cHVsbC84OD4NCg0KW29jYW1sLWJlbmNoL3NhbmRtYXJrIzk4XQ0KPGh0dHBzOi8vZ2l0aHViLmNv bS9vY2FtbC1iZW5jaC9zYW5kbWFyay9wdWxsLzk4Pg0KDQpbb2NhbWwtYmVuY2gvc2FuZG1hcmsj MTAwXQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1iZW5jaC9zYW5kbWFyay9pc3N1ZXMvMTAw Pg0KDQpbb2NhbWwtYmVuY2gvc2FuZG1hcmsjOTldDQo8aHR0cHM6Ly9naXRodWIuY29tL29jYW1s LWJlbmNoL3NhbmRtYXJrL2lzc3Vlcy85OT4NCg0KW29jYW1sLWJlbmNoL3NhbmRtYXJrIzEwM10N CjxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwtYmVuY2gvc2FuZG1hcmsvcHVsbC8xMDM+DQoNCltv Y2FtbC1iZW5jaC9zYW5kbWFyayM5MF0NCjxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwtYmVuY2gv c2FuZG1hcmsvaXNzdWVzLzkwPg0KDQoNCk9DYW1sDQrilYzilYzilYzilYzilYwNCg0K4peKIE9u Z29pbmcNCg0KICDigKIgW29jYW1sL29jYW1sIzkwODJdIEV2ZW50bG9nIHRyYWNpbmcgc3lzdGVt DQoNCiAgICBUaGUgY29uZmlndXJlIHNjcmlwdCBoYXMgbm93IGJlZW4gYmUgdXBkYXRlZCBzbyB0 aGF0IGl0IGNhbiBidWlsZCBvbg0KICAgIFdpbmRvd3MuIEFwYXJ0IGZyb20gdGhpcyBtYWpvciBj aGFuZ2UsIGEgbnVtYmVyIG9mIG1pbm9yIGNvbW1pdHMNCiAgICBoYXZlIGJlZW4gbWFkZSBmb3Ig dGhlIGJ1aWxkIGFuZCBzYW5pdHkgY2hlY2tzLiBUaGlzIFBSIGlzIGN1cnJlbnRseQ0KICAgIHVu ZGVyIHJldmlldy4NCg0KICDigKIgW29jYW1sL29jYW1sIzkzNTNdIFJlaW1wbGVtZW50IG91dHB1 dF92YWx1ZSB1c2luZyBhIGhhc2ggdGFibGUgdG8NCiAgICBkZXRlY3Qgc2hhcmluZy4NCg0KICAg IFRoZSBbb2NhbWwvb2NhbWwjOTI5M10gIlVzZSBhZGRybWFwIGhhc2ggdGFibGUgZm9yIG1hcnNo YWxpbmciIFBSDQogICAgaGFzIGJlZW4gcmUtaW1wbGVtZW50ZWQgdXNpbmcgYSBoYXNoIHRhYmxl IGFuZCBiaXQgdmVjdG9yLCB0aGFua3MgdG8NCiAgICBAeGF2aWVybGVyb3kuIFRoaXMgaXMgYSBw cmUtcmVxdWlzaXRlIGZvciBNdWx0aWNvcmUgT0NhbWwgdGhhdCB1c2VzDQogICAgYSBjb25jdXJy ZW50IGdhcmJhZ2UgY29sbGVjdG9yLg0KDQogIEFzIGFsd2F5cywgd2UgdGhhbmsgdGhlIE9DYW1s IGRldmVsb3BlcnMgYW5kIHVzZXJzIGluIHRoZSBjb21tdW5pdHkNCiAgZm9yIHRoZWlyIGNvZGUg cmV2aWV3cywgc3VwcG9ydCwgYW5kIGNvbnRyaWJ1dGlvbiB0byB0aGUgcHJvamVjdC4gRnJvbQ0K ICBPQ2FtbCBMYWJzLCBzdGF5IHNhZmUgYW5kIGhlYWx0aHkgb3V0IHRoZXJlIQ0KDQoNCiAgW29j YW1sL29jYW1sIzkwODJdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvcHVsbC85MDgy Pg0KDQogIFtvY2FtbC9vY2FtbCM5MzUzXSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1s L3B1bGwvOTM1Mz4NCg0KICBbb2NhbWwvb2NhbWwjOTI5M10gPGh0dHBzOi8vZ2l0aHViLmNvbS9v Y2FtbC9vY2FtbC9wdWxsLzkyOTM+DQoNCg0KT2xkIENXTg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ DQoNCiAgSWYgeW91IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5b3UgY2FuIFtzZW5kIG1lIGEgbWVz c2FnZV0gYW5kIEknbGwgbWFpbA0KICBpdCB0byB5b3UsIG9yIGdvIHRha2UgYSBsb29rIGF0IFt0 aGUgYXJjaGl2ZV0gb3IgdGhlIFtSU1MgZmVlZCBvZiB0aGUNCiAgYXJjaGl2ZXNdLg0KDQogIElm IHlvdSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5IG1haWwsIHlvdSBtYXkg c3Vic2NyaWJlDQogIFtvbmxpbmVdLg0KDQogIFtBbGFuIFNjaG1pdHRdDQoNCg0KW3NlbmQgbWUg YSBtZXNzYWdlXSA8bWFpbHRvOmFsYW4uc2NobWl0dEBwb2x5dGVjaG5pcXVlLm9yZz4NCg0KW3Ro ZSBhcmNoaXZlXSA8aHR0cDovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi8+DQoNCltSU1MgZmVl ZCBvZiB0aGUgYXJjaGl2ZXNdIDxodHRwOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duL2N3bi5y c3M+DQoNCltvbmxpbmVdIDxodHRwOi8vbGlzdHMuaWR5bGwub3JnL2xpc3RpbmZvL2NhbWwtbmV3 cy13ZWVrbHkvPg0KDQpbQWxhbiBTY2htaXR0XSA8aHR0cDovL2FsYW4ucGV0aXRlcG9tbWUubmV0 Lz4NCg0K --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of March 24 to 31, 2020.

An In-Depth Look at OCaml=E2=80=99s New =E2=80=9CBest-Fit=E2= =80=9D Garbage Collector Strategy

OCamlPro announced

The Garbage Collector is probably OCaml=E2=80=99s greatest unsung hero. Its= pragmatic approach allows us to allocate without much fear of efficiency loss. We looked into its new "Best-fit" strategy an= d here is what we learned! http://www.ocamlpro.com/2020/03/23/ocaml-new-best-fit-garbage-col= lector/

First release of Pp, a pretty-printing library

J=C3=A9r=C3=A9mie Dimino announced

I'm happy to announce the first release of the pp library! This library provides a lean alternative to the = Format module of the standard library. It uses the same comcepts of box= es and break hints, however it defines its own algebra which some might find easier to work with and reaso= n about. I personally do :) The final rendering is still done via a formatter which makes it easy to integrate Pp in existing programs using Format.

We introduced this module in Dune to hel= p improve the formatting of messages printed in the terminal and it has been a success. The new API is smaller, simpler and makes it easy for d= evelopers to do the right thing. Once the Pp module of Dune was mature enough, we decided to extract it = into a separate library so that it could benefit others.

The library itself is composed of a single Pp module and has n= o dependencies. Its documentation is self-contained and no previous knowledge is required to start using it, however the variou= s guides for the Format module such as this o= ne should be applicable to Pp as well.

If you have used Format before and like me found its API compl= icated and difficult to use, I hope that you will find Pp nicer to work with!

Josh Berdine then said

Another great resource for understanding the core mental model of Format is= Format Unraveled, although if I understand pp correctly the discussion about Format not being document-based won't apply = to pp.

soupault: a static website generator based on HTML rewriting

Daniil Baturin announced

1.10.= 0 release is available.

Bug fixes:

  • Files without extensions are handled correctly.

New features:

  • Plugin discovery: if you save a plugin to plugins/my-plugin.lua, it's automatically loaded as a widget named

my-plugin. List of plugin directories is configurable.

  • New plugin API functions: HTMLget_tag_name, HTML.sel= ect_any_of, HTML.select_all_of.
  • The HTML module is now "monadic": giving a nil to a functi= on that expects an element gives you a nil back, rather than cause a runtim= e error.

routes: path based routing for web applications

Anurag Soni announced

0.7.2 release is now= available on opam. There have been quite a few changes since the previous versions.

  • Routes doesn't deal with HTTP methods anymore
  • The internal implementation is now based around a trie like data struct= ure
  • Routes have pretty printers
  • sprintf style route printing is supported again
  • Minimum supported OCaml version is now 4.05 (it used to be 4.06)
  • There is a release available for bucklescript as well and it is availab= le to install via npm.

Compiler Engineer at Mixtional Code in Darmstadt or anywhere e= lse in Germany

Gerd Stolpmann announced

Type of position:

  • regular hire (no freelancers)
  • full time
  • work from home anywhere in Germany, or in the office in Darmstadt
  • work for a small and highly skilled international team, located in the = US and Europe
  • the team language is English

We are developing a compiler for a no-code platform that translates our DSL= to bytecode and/or WebAssembly. The language is largely of functional type but is also able to manage state wit= h a spreadsheet model, allowing reactive programming without having to resort to libraries. The language is statical= ly typed using a Hindley-Milner type checker. The compiler is primarily written in OCaml. Other languages of our= platform are Go, Elm, and Javascript.

We are looking for a compiler engineer with strong skills in all relevant a= reas:

  • fluent in OCaml or a similar language such as Haskell
  • Understanding of the structure of the DSL, including syntax and semanti= cs
  • Translation of FP languages to executable code
  • Code optimization
  • Graph algorithms
  • Type checking

We are open to both juniors and seniors, and payment will be accordingly. W= e are not so much interested in formal certifications but rather in real practice, either from previous jobs, rese= arch projects, or contributions to open source projects.

The no-code platform is being developed by engineers in Europe and the US a= t various places, and we usually do not meet physically but in video conferences. Working from home is very usual. = We also get you a desk in your home town if you prefer this. The compiler development is lead by Gerd Stolpmann from= Darmstadt.

Due to the strong connections to the US, video conferences will often have = to take place in evening hours, until around 7pm or 8pm.

Applications: please follow the "Apply" link at the official web page descr= ibing the position: https://rmx.mixtional= .de/static/54657cda/

Gerd Stolpmann
CEO of Mixtional Code GmbH (and OCaml hacker of the first hour)
Contact and company details: https://www.mixtional.de/contact.html

S=C3=A9bastien Besnier asked

I'm living in France, can I apply to the position (we are neighbors!)?

Gerd Stolpmann replied

Well, I can (at the moment) only make contracts using German law and for th= e social security system here. So, if you need a doctor you'd have to travel… If my company was a bit bigger t= here would be the option of opening a second site in France (even a very minimal one), but the setup costs are so far to= o high (lawyers and accountants), and it is too distracting for me to keep up with the fine points of the system in = France. Unfortunately, the EU is not that far that it is super simple for an employer to hire anywhere in Europe. - T= hanks for asking.

tiny-httpd 0.5

Simon Cruanes announced

I just released tiny-httpd 0.5 and the new tiny-httpd-camlzip, which makes = it possible to use deflate transparently for queries and responses. The server has evolved quietly and is getting so= mewhat more robust: I'm using it for an internal tool with big html pages (up to several MB) and it's reasonably fa= st and doesn't seem to memleak. There's also an improved http_of_dir to quickly and simply serve a dir= ectory on an arbitrary port.

Previous announcement here

Visual Studio Code plugin for OCaml

Rudi Grinberg announced

I'm proud to announce a preview release of an VSC extension for OCaml. You can fetch and install this plugin directly from the extension marketplace if you search for "OCaml Labs". The extension isn't y= et mature, but I believe that it offers a user experience comparable to other VSC extensions for OCaml already. The p= lugin should be used in conjunction with ocaml-lsp

The extension is for the OCaml "platform", which means that its scope inclu= des support for various tools used in OCaml development such as dune, opam.

Bug reports & contributions are welcome. Happy hacking.

Dismas: a tool for automatically making cross-versions of opam= packages

Daniil Baturin announced

opam-cross-* are seriously lagging behind the official opam repository and = fdopen's opam-windows, not least because importing packages by hand is a lot of work. I suppose at least a semi-automated process could help those repos grow and= stay in sync with the upstream much faster.

I've made a prototype of a tool for "stealing" packages into cross-repos. F= or obvious reasons it's called Dismas. You can find it here: https://github.com/dmbaturin/scripts/blob/master/dismas.m= l

Limitations:

  • the code is a real mess for now
  • only dune is supported by automatic build command adjustment
  • it cannot handle cases when both native and cross-version of a dependen= cy are needed

However:

  • For simple packages that use dune exclusively, it's completely automate= d. I've ported bigstreamaf and angstrom to test it, and cross-versions buil= t just fine from its output, no editing was needed.
  • It automatically converts dependencies from foo to too-$toolchain and r= emoves dependencies and build steps only

needed for with-test and with-doc.

$ ./dismas.ml windows containers ~/devel/opam-repository/packages/container=
s/containers.2.8.1/opam
opam-version: "2.0"
maintainer: "simon.cruanes.2007@m4x.org"
synopsis:
  "A modular, clean and powerful extension of the OCaml standard library"
build: [
  ["dune" "build" "-p" "containers" "-j" jobs "-x" "windows"]
]
depends: [
  "ocaml-windows" {>=3D "4.03.0"}
  "dune" {>=3D "1.1"}
  "dune-configurator"
  "seq-windows"
]
depopts: ["base-unix" "base-threads"]
tags: ["stdlib" "containers" "iterators" "list" "heap" "queue"]
homepage: "https://github.com/c-cube/ocaml-containers/"
doc: "https://c-cube.github.io/ocaml-containers"
dev-repo: "git+https://github.com/c-cube/ocaml-containers.git"
bug-reports: "https://github.com/c-cube/ocaml-containers/issues/"
authors: "Simon Cruanes"
url {
  src: "https://github.com/c-cube/ocaml-containers/archive/v2.8.1.tar.gz"
  checksum: [
    "md5=3Dd84e09c5d0abc501aa17cd502e31a038"
    "sha512=3D8b832f4ada6035e80d81be0cfb7bdffb695ec67d465ed6097a144019e2b8a=
8f909095e78019c3da2d8181cc3cd730cd48f7519e87d3162442562103b7f36aabb"
  ]
}

$ ./dismas.ml windows containers ~/devel/opam-repository/packages/container=
s/containers.2.8.1/opam | diff
~/devel/opam-repository/packages/containers/containers.2.8.1/opam -
3c3,4
< synopsis: "A modular, clean and powerful extension of the OCaml standa=
rd library"
---
> synopsis:
>   "A modular, clean and powerful extension of the OCaml standard libra=
ry"
5,7c6
<   ["dune" "build" "-p" name "-j" jobs]
<   ["dune" "build" "@doc" "-p" name ] {with-doc}
<   ["dune" "runtest" "-p" name "-j" jobs] {with-test}
---
>   ["dune" "build" "-p" "containers" "-j" jobs "-x" "windows"]
10,11c9,10
<   "ocaml" { >=3D "4.03.0" }
<   "dune" { >=3D "1.1" }
---
>   "ocaml-windows" {>=3D "4.03.0"}
>   "dune" {>=3D "1.1"}
13,21c12
<   "seq"
<   "qtest" { with-test }
<   "qcheck" { with-test }
<   "ounit" { with-test }
<   "iter" { with-test }
<   "gen" { with-test }
<   "uutf" { with-test }
<   "mdx" { with-test & >=3D "1.5.0" & < "2.0.0" }
<   "odoc" { with-doc }
---
>   "seq-windows"
23,27c14,15
< depopts: [
<   "base-unix"
<   "base-threads"
< ]
< tags: [ "stdlib" "containers" "iterators" "list" "heap" "queue" ]
---
> depopts: ["base-unix" "base-threads"]
> tags: ["stdlib" "containers" "iterators" "list" "heap" "queue"]

Things to do:

  • identify all packages that don't need cross-versions. Is cppo one of th= em, for example?
  • add support for cases when both native and cross versions are needed. I= f menhir the only one?
  • add support for other build systems. Do all of them work well with `OCA= MLFIND_TOOLCHAIN=3Dwindows` if the build setup is written correctly?

Input from @toots and @pirbo is welcome.

Romain Beauxis then said

That's a great initiative! Here are a couple of thoughts:

  • For dune-based packages, things are indeed pretty straight-forward. Fin= ding out which dependencies need to be ported as cross-dependency is indeed= the part that's hard to automatize
  • For other build systems, it's less clear to me how to automatize. Maybe= others have some thoughts about it.
  • The CI system on opam-cross-windows is pretty good at building from scr= atch and failing if some deps are missing so trial and error there can be a= great tool.
  • Once solved for one cross situation, the problem of cross-dependencies = should be exactly the same for all other cross environment (android, iOS)

I haven't looked at the tool very closely yet but I'd say a first improveme= nt would be to be able to track cross-dependencies resolution and generate new version of the package using= them and/or generate other cross-compiled packages using them.

Anton Kochkov said

For automated pull requests, you might be interested in https://discuss.ocaml.org/t/= dependabot-and-ocaml/4282

Daniil Baturin then asked

I'm not sure if I understand the premise of dependabot. Why would anyone ha= rdcode specific dependency versions? Maybe it makes sense in certain ecosystems that suffer from never-ending ecologic= al disasters… ;)

In any case, most opam packages don't have a constraint on the upper versio= ns of their dependencies. Can dependabot use custom tracking rules to check for presense of a newer version in the r= epo? My thought was much simpler actually: track the commits in opam-repository,= run recently changed files through Dismas and send pull requests to opam-cross-*

Yawar Amin replied

It's common practice nowadays to use semantic versioning and have lockfiles= for reproducible builds. Dependabot updates semantic version ranges and lockfiles. See e.g.

Multicore OCaml: March 2020 update

Anil Madhavapeddy announced

Welcome to the March 2020 news update from the Multicore OCaml team! This = update has been assembled with @shakthimaan and @kayceesrk, as with the February and January ones.

Our work this month was primarily focused on performance improvements to th= e Multicore OCaml compiler and runtime, as part of a comprehensive evaluation exercise. We continue to add additional = benchmarks to the Sandmark test suite. The eventlog tracing system and the use of hash tables for marshaling in upstre= am OCaml are in progress, and more PRs are being queued up for OCaml 4.11.0-dev as well.

The biggest observable change for users trying the branch is that a new GC = (the "parallel minor gc") has been merged in preference to the previous one ("the concurrent minor gc"). We will hav= e the details in longer form at a later stage, but the essential gist is that the parallel minor GC no longer re= quires a read barrier or changes to the C API. It may have slightly worse scalability properties at a very high = number of cores, but is roughly equivalent at up to 24 cores in our evaluations. Given the vast usability improvement= from not having to port existing C FFI uses, we have decided to make the parallel minor GC the default one for our= first upstream runtime patches. The concurrent minor GC follow at a later stage when we ramp up testing to 64-c= ore+ machines. The multicore opam remote has been updated to reflect these changes, for those who wish to try it out at home.

We are now at a stage where we are porting larger applications to multicore= . Thanks go to:

If you do have other suggestions for application that you think might provi= de useful benchmarks, then please do get in touch with myself or @kayceesrk.

Onto the details! The various ongoing and completed tasks for Multicore OCa= ml are listed first, which is followed by the changes to the Sandmark benchmarking infrastructure and ongoing PRs to = upstream OCaml.

Multicore OCaml

  • Ongoing
    • oca= ml-multicore/ocaml-multicore#240 Proposed implementation of threads in = terms of Domain and Atomic

      A new implementation of the `Threads` library for use with the new `Domain`= and `Atomic` modules in Multicore OCaml has been proposed. This builds Dun= e 2.4.0 which in turn makes it useful to build other packages. This PR is o= pen for review.

    • ocaml-multicore/safepoints-cmm-mach Better safe points for OC= aml

      A newer implementation to insert safe points at the Cmm level is being work= ed upon in this branch.

  • Completed

    The following PRs have been merged into Multicore OCaml:

    • oca= ml-multicore/ocaml-multicore#303 Account correctly for incremental mark= budget

      The patch correctly measures the incremental mark budget value, and improve= s the maximum latency for the `menhir.ocamly` benchmark.

    • ocaml-multicore/ocaml-multicore#307 Put the phase change event in the = actual phase change code. The PR includes the `major_gc/phase_change` event= in the appropriate context.
    • oca= ml-multicore/ocaml-multicore#309 Don't take all the full pools in one g= o.

      The code change selects one of the `global_full_pools` to try sweeping it l= ater, instead of adopting all of the full ones.

    • oca= ml-multicore/ocaml-multicore#310 Statistics for the current domain are = more recent than other domains

      The statistics (`minor_words`, `promoted_words`, `major_words`, `minor_coll= ections`) for the current domain are more recent, and are used in the right= context.

    • oca= ml-multicore/ocaml-multicore#315 Writes in `caml_blit_fields` should al= ways use `caml_modify_field` to record `young_to_young` pointers

      The PR enforces that `caml_modify_field()` is always used to store `young_t= o_young` pointers.

    • oca= ml-multicore/ocaml-multicore#316 Fix bug with `Weak.blit`.

      The ephemerons are allocated as marked, but, the keys or data can be unmark= ed. The blit operations copy weak references from one ephemeron to another = without marking them. The patch marks the keys that are blitted in order to= keep the unreachable keys alive for another major cycle.

    • oca= ml-multicore/ocaml-multicore#317 Return early for 0 length blit

      The PR forces a `CAMLreturn()` call if the blit length is zero in `byterun/= weak.c`.

    • oca= ml-multicore/ocaml-multicore#320 Move `num_domains_running` decrement

      The `caml_domain_alone()` invocation needs to be used in the shared heap te= ardown, and hence the `num_domains_running` decrement is moved as the last = operation for at least the `shared_heap` lockfree fast paths.

Benchmarking

The Sandmark perfor= mance benchmarking test suite has had newer benchmarks added, and work is underway to enhance its functionality.

  • ocaml-bench/san= dmark#88 Add PingPong Multicore benchmark

    The PingPong benchmark that uses producer and consumer queues has now been = included into Sandmark.

  • ocaml-bench/san= dmark#98 Add the read/write Irmin benchmark

    A basic read/write file performance benchmark for Irmin has been added to S= andmark. You can vary the following input parameters: number of branches, n= umber of keys, percentage of reads and writes, number of iterations, and th= e number of write operations.

  • ocaml-bench/= sandmark#100 Add Gram Matrix benchmark

    A request oc= aml-bench/sandmark#99 to include the Gram Matrix initialization numeric= al benchmark was created. This is useful for machine learning applications = and is now available in the Sandmark performance benchmark suite. The speed= up (sequential_time/multi_threaded_time) versus number of cores for Multico= re (Concurrent Minor Collector), Parmap and Parany is quite significant and= illustrated in the graph: 3D"20dc869a8dda1c8=

  • ocaml-bench/sa= ndmark#103 Add depend target in Makefile

    Sandmark now includes a `depend` target defined in the Makefile to check th= at both `libgmp-dev` and `libdw-dev` packages are installed and available o= n Ubuntu.

  • ocaml-bench/s= andmark#90 More parallel benchmarks

    An issue has been created to add more parallel benchmarks. We will use this= to keep track of the requests. Please feel free to add your wish list of b= enchmarks!

OCaml

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 RSS feed of the archives<= /a>.

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

--=-=-=--