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 828095D5 for ; Tue, 26 Jan 2021 13:25:17 +0000 (UTC) X-IronPort-AV: E=Sophos;i="5.79,375,1602540000"; d="scan'208,217";a="489174059" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 26 Jan 2021 14:25:13 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id A825CE0143; Tue, 26 Jan 2021 14:25:13 +0100 (CET) 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 D57C4E0029 for ; Tue, 26 Jan 2021 14:25:09 +0100 (CET) X-IronPort-AV: E=Sophos;i="5.79,375,1602540000"; d="scan'208,217";a="371166371" Received: from clt-128-93-181-24.vpn.inria.fr (HELO set) ([128.93.181.24]) by mail3-relais-sop.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 26 Jan 2021 14:25:08 +0100 From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr, comp@lists.orbitalfox.eu Date: Tue, 26 Jan 2021 14:25:08 +0100 Message-ID: <87wnvz96ff.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 18388 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 ZWsgb2YgSmFudWFyeSAxOSB0byAyNiwNCjIwMjEuDQoNClRhYmxlIG9mIENvbnRlbnRzDQrilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KSG93IHRv IGdldCBwbGVhc2FudCBkb2N1bWVudGF0aW9uIGZvciBhIGxpYnJhcnkgdXNpbmcgRHVuZT8NCkFs dC1FcmdvIDIuNC4wIHJlbGVhc2UNCkZpcnN0IHJlbGVhc2Ugb2YgQXJ0IC0gQWRhcHRpdmUgUmFk aXggVHJlZSBpbiBPQ2FtbA0KcGVyZiBkZW1hbmdsaW5nIG9mIE9DYW1sIHN5bWJvbHMgKGFuZCBh IHNob3J0IGludHJvZHVjdGlvbiB0byBwZXJmKQ0KRGVjaW1hbCAwLjIuMSAtIGFyYml0cmFyeS1w cmVjaXNpb24gZGVjaW1hbCBmbG9hdGluZyBwb2ludA0KQmFzaWMgR2l0TGFiIENJIGNvbmZpZ3Vy YXRpb24NCk9DYW1sIE9mZmljZSBIb3Vycz8NCmpzb24tZGF0YS1lbmNvZGluZyAwLjkNClZTQ29k ZSBPQ2FtbCBQbGF0Zm9ybSB2MS42LjANCnJlbGVhc2UgMC4zLjAgb2YgZHJvbSwgdGhlIE9DYW1s IHByb2plY3QgY3JlYXRvcg0KT2xkIENXTg0KDQoNCkhvdyB0byBnZXQgcGxlYXNhbnQgZG9jdW1l bnRhdGlvbiBmb3IgYSBsaWJyYXJ5IHVzaW5nIER1bmU/DQrilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0K ICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2hvdy10by1nZXQtcGxlYXNhbnQtZG9jdW1l bnRhdGlvbi1mb3ItYS1saWJyYXJ5LXVzaW5nLWR1bmUvNzEyMS8xPg0KDQoNCmdhc2NoZSBhbm5v dW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0K DQogIEknbSB3b3JraW5nIHRvIHB1Ymxpc2ggYSBzbWFsbCBsaWJyYXJ5IHVzaW5nIER1bmUuIFRo ZSBkb2N1bWVudGF0aW9uDQogIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IGBkdW5lIGJ1aWxk IEBkb2MnIGxvb2tzIGZhaXJseSB1bnBsZWFzYW50DQogIHRvIG1lLCBhcyBJIGRvbid0IHNlZSBh biBlYXN5IHdheSB0byBleHBsYWluIHdoYXQgdGhlIGxpYnJhcnkgaXMNCiAgYWJvdXQuIEknbSBj cmVhdGluZyB0aGlzIHRvcGljIGluIGNhc2UgSSBhbSBtaXNzaW5nIHNvbWV0aGluZyBzaW1wbGUs DQogIGFuZCB0byBnZXQgb3RoZXIgcGVvcGxlIHRvIHNoYXJlIHRoZWlyIGxpYnJhcnktZG9jdW1l bnRhdGlvbiBwcmFjdGljZXMNCiAgb3IgZXhhbXBsZXMuDQoNCg0KUHJvYmxlbSBkZXNjcmlwdGlv bg0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWMDQoNCiAgRm9yIHRoZSBzYWtlIG9mIHRoZSBleGFtcGxlIGxldCdzIGltYWdpbmUgdGhhdCB0 aGUgbGlicmFyeSBpcyBjYWxsZWQNCiAgYEZvbycgYW5kIGNvbnRhaW5zIHRocmVlIG1vZHVsZXMg YEEnLCBgQicgYW5kIGBDJy4gSSdtIHVzaW5nIHRoZQ0KICBzdGFuZGFyZCBkdW5lIGFwcHJvYWNo IG9mIHdyYXBwZWQgbW9kdWxlcywgc28gSSBnZXQgdGhyZWUgY29tcGlsYXRpb24NCiAgdW5pdHMg YEZvby5BJywgYEZvby5CJywgYEZvby5DJy4gRWFjaCBtb2R1bGUgaGFzIGEgYC5tbGknIGZpbGUg d2l0aA0KICBkb2N1bWVudGF0aW9uIGNvbW1lbnRzLg0KDQogIFdoZW4gSSBydW4gYGR1bmUgYnVp bGQgQGRvYycsIGR1bmUgZ2VuZXJhdGVzIGFuIGBpbmRleC5odG1sJyBmaWxlIHdpdGgNCiAgYmFz aWNhbGx5IG5vIGNvbnRlbnQsIHBvaW50aW5nIHRvIGEgYGZvby9pbmRleC5odG1sJyBmaWxlIHdp dGgNCiAgYmFzaWNhbGx5IG5vIGNvbnRlbnQsIHBvaW50aW5nIHRvIGEgYGZvby9Gb28vaW5kZXgu aHRtbCcgbG9va2luZyBsaWtlDQogIHRoaXM6DQoNCiAgICAgICAgVXAg4oCTIGZvbyDCuyBGb28N Cg0KICAgICAgICAqTW9kdWxlIGBGb28nKg0KDQogICAgICAgIGBtb2R1bGUgQSA6IHNpZyAuLi4g ZW5kJw0KDQogICAgICAgIGBtb2R1bGUgQiA6IHNpZyAuLi4gZW5kJw0KDQogICAgICAgIGBtb2R1 bGUgQyA6IHNpZyAuLi4gZW5kJw0KDQogIEl0J3MgZWFzeSB0byBza2lwIHRoZSBmaXJzdCB0d28g cGFnZXMsIGFuZCB1c2UgdGhlIHRoaXJkIHBhZ2UgYXMgYQ0KICBsYW5kaW5nIHBhZ2UgZm9yIHRo ZSBkb2N1bWVudGF0aW9uIG9mIG15IGxpYnJhcnkuICBIb3dldmVyLCB0aGlzDQogIGxhbmRpbmcg cGFnZSBpcyBub3QgdmVyeSBwbGVhc2FudDoNCiAgMS4gSXQgc2hvdWxkIGV4cGxhaW4gd2hhdCB0 aGUgbGlicmFyeSBpcyBhYm91dC4NCiAgMi4gSXQgc2hvdWxkIGJyaWVmbHkgZGVzY3JpYmUgd2hh dCBlYWNoIG1vZHVsZSBkb2VzLCBzbyB0aGF0IHVzZXJzDQogICAgIGtub3cgd2hpY2ggbW9kdWxl IHRoZXkgd2FudCB0byBsb29rIGF0IGZpcnN0Lg0KDQogIChQb2ludCAyIGlzIGVzcGVjaWFsbHkg aW1wb3J0YW50IHdpdGggIndyYXBwZWQgbGlicmFyaWVzIiwgd2hlcmUgaXQncw0KICBub3QgbmVj ZXNzYXJpbHkgb2J2aW91cyB3aGljaCBvZiB0aGUgc2V2ZXJhbCBtb2R1bGVzIGlzIHRoZSBtYWlu IGVudHJ5DQogIHBvaW50IHdpdGggdGhlIGltcG9ydGFudCBmdW5jdGlvbnMgdG8gbG9vayBhdCBm aXJzdC4gSW4gY29tcGFyaXNvbiwgaW4NCiAgYSBkZXNpZ24gd2hlcmUgdGhlICJlbnRyeSBwb2lu dCIgaXMgaW4gdGhlIGBGb28nIG1vZHVsZSwgd2l0aCBgRm9vLkEnDQogIGFuZCBgRm9vLkInIGFz IG1vcmUgYWR2YW5jZWQgc3VibW9kdWxlcyAob3IgYEZvb19BJyBhbmQgYEZvb19CJyBpbiB0aGUN CiAgb2xkIGRheXMpIHRoZSB1c2VyIGlzIGd1aWRlZCB0byBsb29rIGF0IGBGb28nIGZpcnN0LikN Cg0KICBNeSBwcm9ibGVtIGlzOiB3aGF0IHNob3VsZCBJIGNoYW5nZSBpbiBteSBEdW5lIHNldHVw IHRvIGJlIGFibGUgdG8gZG8NCiAgdGhpcz8NCg0KICBJIGhhdmUgcmVhZCB0aGUgW2R1bmUgZG9j dW1lbnRhdGlvbiBvbiBkb2N1bWVudGF0aW9uXSwgYnV0IEkgY291bGQgbm90DQogIGZpbmQgYW4g YW5zd2VyIHRvIHRoaXMgcXVlc3Rpb24uDQoNCg0KW2R1bmUgZG9jdW1lbnRhdGlvbiBvbiBkb2N1 bWVudGF0aW9uXQ0KPGh0dHBzOi8vZHVuZS5yZWFkdGhlZG9jcy5pby9lbi9zdGFibGUvZG9jdW1l bnRhdGlvbi5odG1sPg0KDQoNClJvdWdoIGlkZWFzDQrilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYwNCg0KICBSb3VnaGx5IEkgc2VlIHR3byB3YXlzIHRvIGdldCB3aGF0IEkgd2FudCwg dGhhdCBJIGhhdmUgbm90IHRyaWVkIHlldDoNCiAgMS4gSSBjb3VsZCB3cml0ZSBteSBvd24gbGFu ZGluZyBwYWdlIGZvciB0aGUgbGlicmFyeSBhcyBhIHNlcGFyYXRlDQogICAgIGBkb2MubWxkJyBm aWxlLCB1c2UgdGhlIGAoZG9jdW1lbnRhdGlvbiknIHN0YW56YSB0byBnZXQgaXQgaW5jbHVkZWQN CiAgICAgaW4gdGhlIGJ1aWx0IGRvY3VtZW50YXRpb24sIGFuZCB1c2UgdGhpcyBhcyB0aGUgZW50 cnkgcG9pbnQgaW50byBteQ0KICAgICBsaWJyYXJ5Lg0KICAyLiBJbiBjb3VsZCB3cml0ZSBteSBv d24gYGZvby5tbCcgbW9kdWxlIGluc3RlYWQgb2YgdXNpbmcgRHVuZSdzDQogICAgIGRlZmF1bHQg d3JhcHBlZC1tb2R1bGUgc2NhZmZvbGRpbmcsIGluc2VydGluZyBteSBvd24gYG1vZHVsZSBBID0N CiAgICAgRm9vX19BJyBhbGlhc2VzLCB3aXRoIGRvY3VtZW50YXRpb24gY29tbWVudHMgaW4gdGhl IHN0YW5kYXJkDQogICAgIHN0eWxlLiBUaGVuIEkgc3VwcG9zZSB0aGF0IGBmb28vRm9vL2luZGV4 Lmh0bWwnIHdvdWxkIGdldCB0aGlzDQogICAgIGNvbnRlbnQgaW4gdGhlIHdheSBJIGV4cGVjdC4N Cg0KICBUaGV5IGZlZWwgYSBiaXQgY29tcGxleCB0byBtZSwgYW5kICgyKSBpbnZvbHZlcyB0aGUg dGVkaW91cyB3b3JrIG9mDQogIHJlZG9pbmcgdGhlIHdyYXBwaW5nIGxvZ2ljIG15c2VsZi4gSSBn dWVzcyB0aGF0ICgxKSBpcyBub3Qgc28gYmFkLCBhbmQNCiAgSSB3b3VsZCBiZSBpbmNsaW5lZCB0 byBkbyB0aGlzIGlmIGl0IHdhcyBkb2N1bWVudGVkIHNvbWV3aGVyZSBhcyB0aGUNCiAgcmVjb21t ZW5kZWQgYXBwcm9hY2guDQoNCiAgKE1heWJlIHRoZXJlIGlzIHNvbWUgb2RvYyBvcHRpb24gdGhh dCB3b3VsZCBoZWxwIHNvbHZlIHRoaXMgcHJvYmxlbT8pDQoNCg0KRXhhbXBsZXMgZnJvbSBvdGhl ciBwZW9wbGU/DQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBEbyB5b3UgaGF2ZSBhIGxp YnJhcnkgYnVpbHQgdXNpbmcgZHVuZSB3aXRoIG5pY2UgZG9jdW1lbnRhdGlvbj8gSWYgc28sDQog IGNhbiB5b3Ugc2hvdyB0aGUgZG9jdW1lbnRhdGlvbiBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgc291 cmNlcyAoaW4NCiAgcGFydGljdWxhciBkdW5lIHNldHVwKT8NCg0KDQpUaGliYXV0IE1hdHRpbyBy ZXBsaWVkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIANCg0KICBJIHRoaW5rIHRoZSBkb2N1bWVudGF0aW9uIG9mIFtTdHJl YW1pbmddIGlzIGEgZ3JlYXQgZXhhbXBsZSBvZiB0aGUNCiAgb3B0aW9uIDEgeW91IGRlc2NyaWJl Lg0KDQogIFRoZSBjb3JyZXNwb25kaW5nIER1bmUgc2V0dXAgY2FuIGJlIGZvdW5kIFtoZXJlXQ0K DQogIFRoYXQncyBhbHNvIHRoZSBhcHByb2FjaCB3ZSB0b29rIGZvciBbT3BpdW0ncyBkb2N1bWVu dGF0aW9uXSwgYWx0aG91Z2gNCiAgdGhlIGluZGV4IHBhZ2UgaXMgY2VydGFpbmx5IG5vdCBhcyBp bXByZXNzaXZlIGFzIFN0cmVhbWluZydzLg0KDQoNCltTdHJlYW1pbmddIDxodHRwczovL29kaXMt bGFicy5naXRodWIuaW8vc3RyZWFtaW5nL3N0cmVhbWluZy9pbmRleC5odG1sPg0KDQpbaGVyZV0N CjxodHRwczovL2dpdGh1Yi5jb20vb2Rpcy1sYWJzL3N0cmVhbWluZy9ibG9iL21hc3Rlci9zdHJl YW1pbmcvZHVuZT4NCg0KW09waXVtJ3MgZG9jdW1lbnRhdGlvbl0NCjxodHRwczovL3JncmluYmVy Zy5naXRodWIuaW8vb3BpdW0vb3BpdW0vaW5kZXguaHRtbD4NCg0KDQpnYXNjaGUgdGhlbiBzYWlk DQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBU aGFua3MhIEl0IGxvb2tzIGxpa2UgdGhlc2Ugc3lzdGVtcyByZWx5IG9uIGFuIHVuZG9jdW1lbnRl ZCBmZWF0dXJlIG9mDQogIHRoZSBgKGRvY3VtZW50YXRpb24pJyBzdGFuemEgKG9yIG9kb2MpLCB3 aGljaCBpcyB0aGF0IGEgdXNlci1wcm92aWRlZA0KICBgaW5kZXgubWxkJyBmaWxlIHdpbGwgaW1w bGljaXRseSByZXBsYWNlIHRoZSBhdXRvbWF0aWNhbGx5LWdlbmVyYXRlZA0KICBgaW5kZXgubWxk JyBmaWxlLCBnaXZpbmcgYSByZWFzb25hYmx5IG5hdHVyYWwgcmVzdWx0Lg0KDQogIFRoZSBvcGl1 bSBkb2N1bWVudGF0aW9uIGFsc28gW3VzZXNdIHRoZSBgeyFtb2R1bGVzOiBtb2R1bGVuYW1lIC4u Ln0nDQogIG1hcmt1cCBkaXJlY3RpdmUsIHdoaWNoIGlzIGEgd2F5IHRvIGluY2x1ZGUgdGhlIG1v ZHVsZSBpbmRleCB3aXRoaW4NCiAgdGhpcyBtYW51YWxseS13cml0dGVuIGxhbmRpbmcgcGFnZSB3 aXRob3V0IGhhdmluZyB0byBkdXBsaWNhdGUgdGhlDQogIG1hcmt1cC4gU3RyZWFtaW5nwrkgdXNl cyBbaW5saW5lIGh0bWxdIGluc3RlYWQgdG8gZ2V0IGEgbmljZXItbG9va2luZw0KICByZXN1bHQs IGJ1dCBpdCBpcyB0b28gbXVjaCBlZmZvcnQuIE1heWJlIHRoZXJlIGlzIGEgYmV0dGVyIHdheSwg b3IgdGhlDQogIHRvb2xzIGNvdWxkIGJlIGltcHJvdmVkIHRvIG1ha2UgdGhpcyBlYXNpZXIuDQoN CiAgwrk6IEknbSBhc2hhbWVkIHRvIGFkbWl0IHRoYXQgSSB3YXNuJ3QgYXdhcmUgb2YgdGhpcyB2 ZXJ5IG5pY2UgbGlicmFyeQ0KICBbU3RyZWFtaW5nXSwgYW0gSSBjb25zdW1pbmcgdGhlIHdyb25n IHNvdXJjZXMgb2YgaW5mb3JtYXRpb24gb24gdGhlDQogIE9DYW1sIGVjb3N5c3RlbT8NCg0KICBG aW5hbGx5LCB0aGUgT3BpdW0gZG9jdW1lbnRhdGlvbiBtYW5pZmVzdGx5IGhhcyBhIHNob3J0IHN5 bm9wc2lzIGZvcg0KICBlYWNoIG1vZHVsZSBpbiBpdHMgbGlzdGluZywgd2hpY2ggY29ycmVzcG9u ZHMgdG8gbXkgIkl0IHNob3VsZCBicmllZmx5DQogIGRlc2NyaWJlIHdoYXQgZWFjaCBtb2R1bGUg ZG9lcyIgcmVxdWlyZW1lbnQuIEkgYmVsaWV2ZSB0aGF0IHRoaXMgY29tZXMNCiAgZnJvbSB0aGUg Zmlyc3QgbGluZSBvZiB0aGUgZmlyc3QgZG9jdW1lbnRhdGlvbiBjb21tZW50IG9mIHRoZQ0KICBt b2R1bGUuIFRoZXJlIGFyZSBtb2R1bGUtZ2xvYmFsIGRvY3VtZW50YXRpb24gY29tbWVudHMgaW4g dGhlIGxpYnJhcnkNCiAgSSdtIHdvcmtpbmcgb24sIGJ1dCB0aGV5IGRvIG5vdCBpbmNsdWRlIHN1 Y2ggZmlyc3QtbGluZSBoZWFkZXJzLg0KDQogIE9uY2UgSSBoYXZlIHRoZSBpbXByZXNzaW9uIG9m IHVuZGVyc3RhbmRpbmcgd2hhdCBpcyBhIGdvb2Qgd2F5IHRvIGRvDQogIHRoaXMsIEkgbWF5IHRy eSB0byBjb250cmlidXRlIGJldHRlciBkb2N1bWVudGF0aW9uIGluIGBkdW5lJy4NCg0KDQpbdXNl c10NCjxodHRwczovL2dpdGh1Yi5jb20vcmdyaW5iZXJnL29waXVtL2Jsb2IvMmE4OWUzNS9vcGl1 bS9kb2MvaW5kZXgubWxkI0w3Mi1MNzQ+DQoNCltpbmxpbmUgaHRtbF0NCjxodHRwczovL2dpdGh1 Yi5jb20vb2Rpcy1sYWJzL3N0cmVhbWluZy9ibG9iL2VlNWQ4MmEvc3RyZWFtaW5nL2luZGV4Lm1s ZCNMMzItTDY4Pg0KDQpbU3RyZWFtaW5nXSA8aHR0cHM6Ly9vZGlzLWxhYnMuZ2l0aHViLmlvL3N0 cmVhbWluZy9zdHJlYW1pbmcvaW5kZXguaHRtbD4NCg0KDQpHYWJyaWVsIFJhZGFubmUgcmVwbGll ZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSADQoNCiAgICAgICAgSXQgbG9va3MgbGlrZSB0aGVzZSBzeXN0ZW1zIHJl bHkgb24gYW4gdW5kb2N1bWVudGVkDQogICAgICAgIGZlYXR1cmUgb2YgdGhlIGAoZG9jdW1lbnRh dGlvbiknIHN0YW56YSAob3Igb2RvYyksIHdoaWNoDQogICAgICAgIGlzIHRoYXQgYSB1c2VyLXBy b3ZpZGVkIGBpbmRleC5tbGQnIGZpbGUgd2lsbCBpbXBsaWNpdGx5DQogICAgICAgIHJlcGxhY2Ug dGhlIGF1dG9tYXRpY2FsbHktZ2VuZXJhdGVkIGBpbmRleC5tbGQnIGZpbGUsDQogICAgICAgIGdp dmluZyBhIHJlYXNvbmFibHkgbmF0dXJhbCByZXN1bHQuDQoNCiAgSSBjb25maXJtIHRoaXMgZmVh dHVyZSBpcyBoZXJlIHRvIHN0YXksIGlzIHRoZSByaWdodCBvbmUgdG8gY3VzdG9taXplDQogIHlv dXIgaW5kZXggcGFnZSwgYW5kIGluIHRoZSBmdXR1cmUgd2lsbCBiZW5lZml0IGZyb20gZ29vZCBz dXBwb3J0IGZyb20NCiAgb2RvYyBkaXJlY3RseS4NCg0KICAgICAgICBUaGUgb3BpdW0gZG9jdW1l bnRhdGlvbiBhbHNvIFt1c2VzXSB0aGUgYHshbW9kdWxlczoNCiAgICAgICAgbW9kdWxlbmFtZSAu Li59JyBtYXJrdXAgZGlyZWN0aXZlLCB3aGljaCBpcyBhIHdheSB0bw0KICAgICAgICBpbmNsdWRl IHRoZSBtb2R1bGUgaW5kZXggd2l0aGluIHRoaXMgbWFudWFsbHktd3JpdHRlbg0KICAgICAgICBs YW5kaW5nIHBhZ2Ugd2l0aG91dCBoYXZpbmcgdG8gZHVwbGljYXRlIHRoZQ0KICAgICAgICBtYXJr dXAuIFN0cmVhbWluZ8K5IHVzZXMgW2lubGluZSBodG1sXSBpbnN0ZWFkIHRvIGdldCBhDQogICAg ICAgIG5pY2VyLWxvb2tpbmcgcmVzdWx0LCBidXQgaXQgaXMgdG9vIG11Y2ggZWZmb3J0LiBNYXli ZQ0KICAgICAgICB0aGVyZSBpcyBhIGJldHRlciB3YXksIG9yIHRoZSB0b29scyBjb3VsZCBiZSBp bXByb3ZlZCB0bw0KICAgICAgICBtYWtlIHRoaXMgZWFzaWVyLg0KDQogIEkgd291bGQgc3Ryb25n bHkgYWR2aXNlIHRvIHVzZSB0aGUgYG1vZHVsZXMnIG1hcmt1cCBkaXJlY3RpdmUsIGFuZCB0bw0K ICBzdWdnZXN0cyBvdXRwdXQgaW1wcm92ZW1lbnRzIG9uIG9kb2MncyBidWcgaW5zdGVhZCBvZiBo YWNraW5nIEhUTUwNCiAgdG9nZXRoZXIuIFdlIGNvdWxkIGFic29sdXRlbHkgYWRkIHRoZSBzeW5v cHNpcyBvZiB0aGUgbW9kdWxlIGhlcmUsIGZvcg0KICBpbnN0YW5jZS4NCg0KDQpbdXNlc10NCjxo dHRwczovL2dpdGh1Yi5jb20vcmdyaW5iZXJnL29waXVtL2Jsb2IvMmE4OWUzNS9vcGl1bS9kb2Mv aW5kZXgubWxkI0w3Mi1MNzQ+DQoNCltpbmxpbmUgaHRtbF0NCjxodHRwczovL2dpdGh1Yi5jb20v b2Rpcy1sYWJzL3N0cmVhbWluZy9ibG9iL2VlNWQ4MmEvc3RyZWFtaW5nL2luZGV4Lm1sZCNMMzIt TDY4Pg0KDQoNCkRhbmllbCBCw7xuemxpIHRoZW4gc2FpZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgICAg ICAgd2hpY2ggaXMgdGhhdCBhIHVzZXItcHJvdmlkZWQgYGluZGV4Lm1sZCcgZmlsZSB3aWxsDQog ICAgICAgIGltcGxpY2l0bHkgcmVwbGFjZSB0aGUgYXV0b21hdGljYWxseS1nZW5lcmF0ZWQgYGlu ZGV4Lm1sZCcNCiAgICAgICAgZmlsZSwgZ2l2aW5nIGEgcmVhc29uYWJseSBuYXR1cmFsIHJlc3Vs dC4NCg0KICBUaGlzIGlzIGFsc28gdGhlIGNvcnJlY3Qgd2F5IHRvIGN1c3RvbWl6ZSB0aGUgbGFu ZGluZyBwYWdlIG9mIHlvdXINCiAgcGFja2FnZSBmb3IgYG9kaWcnIGdlbmVyYXRlZCBkb2Mgc2V0 cywgc2VlIFtoZXJlXSBmb3IgbW9yZQ0KICBpbmZvcm1hdGlvbi4NCg0KICAgICAgICBJIGNvbmZp cm0gdGhpcyBmZWF0dXJlIGlzIGhlcmUgdG8gc3RheSwgaXMgdGhlIHJpZ2h0IG9uZQ0KICAgICAg ICB0byBjdXN0b21pemUgeW91ciBpbmRleCBwYWdlLCBhbmQgaW4gdGhlIGZ1dHVyZSB3aWxsDQog ICAgICAgIGJlbmVmaXQgZnJvbSBnb29kIHN1cHBvcnQgZnJvbSBvZG9jIGRpcmVjdGx5Lg0KDQog IFRoZXJlJ3MgYW4gb3BlbiBpc3N1ZSBhYm91dCB0aGF0IFtoZXJlXS4NCg0KDQpbaGVyZV0NCjxo dHRwczovL2VycmF0aXF1ZS5jaC9zb2Z0d2FyZS9vZGlnL2RvYy9wYWNrYWdpbmcuaHRtbCNvZG9j X2FwaV9hbmRfbWFudWFsPg0KDQpbaGVyZV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vZG9j L2lzc3Vlcy8yOTc+DQoNCg0KQWx0LUVyZ28gMi40LjAgcmVsZWFzZQ0K4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAg QXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tYWx0LWVyZ28tMi00 LTAtcmVsZWFzZS83MTM0LzE+DQoNCg0KT0NhbWxQcm8gYW5ub3VuY2VkDQrilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBXZSBhcmUgcGxl YXNlZCB0byBhbm5vdW5jZSBhIG5ldyByZWxlYXNlIG9mIEFsdC1FcmdvIQ0KDQogIEFsdC1Fcmdv IDIuNC4wIGlzIG5vdyBhdmFpbGFibGUgZnJvbSBbQWx0LUVyZ2/igJlzIHdlYnNpdGVdLiBBbg0K ICBhc3NvY2lhdGVkIG9wYW0gcGFja2FnZSB3aWxsIGJlIHB1Ymxpc2hlZCBpbiB0aGUgbmV4dCBm ZXcgZGF5cy4NCg0KICBUaGlzIHJlbGVhc2UgY29udGFpbnMgc29tZSBtYWpvciBub3ZlbHRpZXM6 DQoNCiAg4oCiIEFsdC1FcmdvIHN1cHBvcnRzIGluY3JlbWVudGFsIGNvbW1hbmRzIChwdXNoL3Bv cCkgZnJvbSB0aGVbIHNtdC1saWJdDQogICAgc3RhbmRhcmQuDQogIOKAoiBXZSBzd2l0Y2hlZCBj b21tYW5kIGxpbmUgcGFyc2luZyB0byB1c2VbIGNtZGxpbmVyXS4gWW91IHdpbGwgbmVlZCB0bw0K ICAgIHVzZSDigJM8b3B0aW9uIG5hbWU+IGluc3RlYWQgb2YgLTxvcHRpb24gbmFtZT4uIFNvbWUg b3B0aW9ucyBoYXZlIGFsc28NCiAgICBiZWVuIHJlbmFtZWQsIHNlZSB0aGUgbWFucGFnZSBvciB0 aGUgZG9jdW1lbnRhdGlvbi4NCiAg4oCiIFdlIGltcHJvdmVkIHRoZSBvbmxpbmUgZG9jdW1lbnRh dGlvbiBvZiB5b3VyIHNvbHZlciwgYXZhaWxhYmxlWw0KICAgIGhlcmVdLg0KDQogIFRoaXMgcmVs ZWFzZSBhbHNvIGNvbnRhaW5zIHNvbWUgbWlub3Igbm92ZWx0aWVzOg0KDQogIOKAoiAubWx3IGFu ZCAud2h5IGV4dGVuc2lvbiBhcmUgZGVwcmVjaWF0ZWQsIHRoZSB1c2Ugb2YgLmFlIGV4dGVuc2lv biBpcw0KICAgIGFkdmlzZWQuDQogIOKAoiBBZGQg4oCTaW5wdXQgKHJlc3Ag4oCTb3V0cHV0KSBv cHRpb24gdG8gbWFudWFsbHkgc2V0IHRoZSBpbnB1dCAocmVzcA0KICAgIG91dHB1dCkgZmlsZSBm b3JtYXQNCiAg4oCiIEFkZCDigJNwcmV0dHktb3V0cHV0IG9wdGlvbiB0byBhZGQgYmV0dGVyIGRl YnVnIGZvcm1hdHRpbmcgYW5kIHRvIGFkZA0KICAgIGNvbG9ycw0KICDigKIgQWRkIGV4cG9uZW50 aWF0aW9uIG9wZXJhdGlvbiwgKiogaW4gbmF0aXZlIEFsdC1FcmdvIHN5bnRheC4gVGhlDQogICAg b3BlcmF0b3IgaXMgZnVsbHkgaW50ZXJwcmV0ZWQgd2hlbiBhcHBsaWVkIHRvIGNvbnN0YW50cw0K ICDigKIgRml4IOKAk3N0ZXBzLWNvdW50IGFuZCBpbXByb3ZlIHRoZSB3YXkgc3RlcHMgYXJlIGNv dW50ZWQgKEFkYUNvcmUNCiAgICBjb250cmlidXRpb24pDQogIOKAoiBBZGQg4oCTaW5zdGFudGlh dGlvbi1oZXVyaXN0aWMgb3B0aW9uIHRoYXQgY2FuIGVuYWJsZSBsaWdodGVyIG9yDQogICAgaGVh dmllciBpbnN0YW50aWF0aW9uDQogIOKAoiBSZWR1Y2UgdGhlIGluc3RhbnRpYXRpb24gY29udGV4 dCAoY29uc2lkZXJlZCBmb3JhbGxzIC8gZXhpc3RzKSBpbg0KICAgIENEQ0wtVGFibGVhdXggdG8g YmV0dGVyIG1pbWljIHRoZSBUYWJsZWF1eC1saWtlIFNBVCBzb2x2ZXINCiAg4oCiIE11bHRpcGxl IGJ1Z2ZpeGVzDQoNCiAgVGhlIGZ1bGwgbGlzdCBvZiBjaGFuZ2VzIGlzIGF2YWlsYWJsZSBbaGVy ZV0uIEFzIHVzdWFsLCBkbyBub3QNCiAgaGVzaXRhdGUgdG8gcmVwb3J0IGJ1Z3MsIHRvIGFzayBx dWVzdGlvbnMsIG9yIHRvIGdpdmUgeW91ciBmZWVkYmFjayENCg0KDQpbQWx0LUVyZ2/igJlzIHdl YnNpdGVdIDxodHRwczovL2FsdC1lcmdvLm9jYW1scHJvLmNvbS8+DQoNClsgc210LWxpYl0gPGh0 dHBzOi8vc210bGliLmNzLnVpb3dhLmVkdS8+DQoNClsgY21kbGluZXJdIDxodHRwczovL2VycmF0 aXF1ZS5jaC9zb2Z0d2FyZS9jbWRsaW5lcj4NCg0KWyBoZXJlXSA8aHR0cHM6Ly9vY2FtbHByby5n aXRodWIuaW8vYWx0LWVyZ28vPg0KDQpbaGVyZV0gPGh0dHBzOi8vb2NhbWxwcm8uZ2l0aHViLmlv L2FsdC1lcmdvL0Fib3V0L2NoYW5nZXMuaHRtbD4NCg0KDQpGaXJzdCByZWxlYXNlIG9mIEFydCAt IEFkYXB0aXZlIFJhZGl4IFRyZWUgaW4gT0NhbWwNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3Jn L3QvYW5uLWZpcnN0LXJlbGVhc2Utb2YtYXJ0LWFkYXB0aXZlLXJhZGl4LXRyZWUtaW4tb2NhbWwv NzE0Mi8xPg0KDQoNCkNhbGFzY2liZXR0YSBSb21haW4gYW5ub3VuY2VkDQrilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIANCg0KICBJJ20gZ2xhZCB0byBhbm5vdW5jZSB0aGUgZmlyc3QgcmVs ZWFzZSBvZiBbYGFydCddLCBhbiBpbXBsZW1lbnRhdGlvbg0KICBvZiBbdGhlIEFkYXB0aXZlIFJh ZGl4IFRyZWVdIGluIE9DYW1sLiBUaGUgZ29hbCBvZiB0aGlzIGxpYnJhcnkgaXMgdG8NCiAgcHJv dmlkZSBhIGRhdGEtc3RydWN0dXJlIHN1Y2ggYXMgYE1hcC5TJyAoYW5kIGtlZXAgdGhlIG9yZGVy KSB3aXRoDQogIHBlcmZvcm1hbmNlcyBvZiBgSGFzaHRibC50Jy4NCg0KDQpbYGFydCddIDxodHRw czovL2dpdGh1Yi5jb20vZGlub3NhdXJlL2FydD4NCg0KW3RoZSBBZGFwdGl2ZSBSYWRpeCBUcmVl XSA8aHR0cHM6Ly9kYi5pbi50dW0uZGUvfmxlaXMvcGFwZXJzL0FSVC5wZGY+DQoNClBlcmZvcm1h bmNlcw0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgYGFydCcgdXNl cyBbQmVjaGFtZWxdIGFzIGEgdG9vbCBmb3IgbWljcm8tYmVuY2htYXJraW5nIGFuZCBpdCBjb21w YXJlcw0KICBwZXJmb3JtYW5jZXMgYWJvdXQgW2luc2VydGlvbl0gYW5kIFtsb29rdXBdLiBBcyB5 b3UgY2FuIHNlZSwgYWJvdXQNCiAgaW5zZXJ0aW9uLCBgYXJ0JyBpcyBkZWZpbml0ZWx5IG1vcmUg ZmFzdCB0aGFuIGBIYXNodGJsLnQnLg0KDQogIEZvciB0aGUgX2xvb2t1cF8gb3BlcmF0aW9uLCB3 ZSBhcmUgc2xpZ2h0bHkgbW9yZSBmYXN0IHRoYW4gdGhlDQogIGBIYXNodGJsLnQnLiBUaGUgbWFp biBhZHZhbnRhZ2UgY29tcGFyaW5nIHRvIGBIYXNodGJsLnQnIGlzIHRoZQ0KICBhYmlsaXR5IHRv IHVzZSBgbWF4aW11bX4vfm1pbmltdW0nIG9yIHRvIGBpdGVyJyBvdmVyIHRoZSB3aG9sZQ0KICBk YXRhLXN0cnVjdHVyZSB3aXRoIGEgY2VydGFpbiBvcmRlci4NCg0KICBPbiBkZXRhaWxzLCBiZW5j aG1hcmtzIHVzZSBhIG5vcm1hbCBkaXN0cmlidXRpb24gb2YgYHN0cmluZ3MnIGFib3V0DQogIHRo ZWlyIGxlbmd0aHMuIEFzIGEgcHJhY3RpY2FsIGV4YW1wbGUgd2hlcmUgYGFydCcgd2lsbCBiZSBi ZXR0ZXIgdGhhbg0KICBgSGFzaHRibC50JyBpcyB3aGVuIHlvdSB3YW50IHRvIF9pbmRleF8gc2V2 ZXJhbCB3b3JkcyAoc3VjaCBhcyBlbWFpbA0KICBhZGRyZXNzZXMpLg0KDQoNCltCZWNoYW1lbF0g PGh0dHBzOi8vZ2l0aHViLmNvbS9taXJhZ2UvYmVjaGFtZWw+DQoNCltpbnNlcnRpb25dIDxodHRw czovL2Rpbm9zYXVyZS5naXRodWIuaW8vYXJ0L2JlbmNoL2luc2VydC5odG1sPg0KDQpbbG9va3Vw XSA8aHR0cHM6Ly9kaW5vc2F1cmUuZ2l0aHViLmlvL2FydC9iZW5jaC9maW5kLmh0bWw+DQoNCg0K VGVzdHMNCuKVjOKVjOKVjOKVjOKVjA0KDQogIE9mIGNvdXJzZSwgdGhlIGxpYnJhcnkgcHJvdmlk ZSBbYSBmdXp6ZXJdIGFuZCB0ZXN0cyBoYXZlIGEgY292ZXJhZ2UNCiAgb2Y6IDkxLjkzICUNCg0K DQpbYSBmdXp6ZXJdIDxodHRwczovL2dpdGh1Yi5jb20vZGlub3NhdXJlL2FydC9ibG9iL21hc3Rl ci9mdXp6L2Z1enoubWw+DQoNCg0KUmVhZCBPcHRpbWl6ZWQgV3JpdGUgRXhjbHVzaW9uIC0gUk9X RVgNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjA0KDQogIEV2ZW4gaWYgaXQncyBub3QgYSBwYXJ0IG9mIHRoZSBwYWNrYWdlLCB0aGUgZGlz dHJpYnV0aW9uIGNvbWVzIHdpdGgNCiAgX2xvY2stZnJlZV8gaW1wbGVtZW50YXRpb24gb2YgYGFy dCc6IGByb3dleCcuICBUaGlzIGltcGxlbWVudGF0aW9uDQogIGNvbWVzIGZyb20gW2EgcmVzZWFy Y2ggcGFwZXJdIGFib3V0IGRhdGEtc3RydWN0dXJlIGFuZCBhdG9taWMNCiAgb3BlcmF0aW9ucy4N Cg0KICBST1dFWCBwcm92aWRlcyBhIF9wZXJzaXN0ZW50XyBpbXBsZW1lbnRhdGlvbiB3aGljaCBt YW5pcHVsYXRlcyBhIGZpbGUNCiAgdG8gc3RvcmUgdGhlIHdob2xlIGRhdGEtc3RydWN0dXJlLiBU aGUgZ29hbCBpcyB0byBwcm92aWRlIGFuIF9pbmRleGVyXw0KICBmcmVlIHRvIGJlIG1hbmlwdWxh dGVkIGJ5IHNldmVyYWwgcHJvY2Vzc2VzIGluIHBhcmFsbGVsLg0KDQogIEN1cnJlbnRseSwgdGhl IGltcGxlbWVudGF0aW9uIG9mIFJPV0VYIGluIE9DYW1sIGlzIG5vdCB3ZWxsLXRlc3RlZCBhbmQN CiAgaXQgaXMgbm8gZGlzdHJpYnV0ZWQuIEl0IGRvZXMgbm90IHRha2UgdGhlIGFkdmFudGFnZSBv Zg0KICBbb2NhbWwtbXVsdGljb3JlXSAoYnV0IGl0IHNob3VsZCkgYnV0IG91dGNvbWVzIGFyZSBn b29kIGFuZCB0aGUNCiAgZGV2ZWxvcG1lbnQgd2lsbCBiZSBtb3JlIGZvY3VzIG9uIHRoaXMgcGFy dC4NCg0KICBTbyBmZWVsIGZyZWUgdG8gcGxheSB3aXRoIGl0IGEgYml0IDorMTouDQoNCg0KW2Eg cmVzZWFyY2ggcGFwZXJdIDxodHRwczovL2RiLmluLnR1bS5kZS9+bGVpcy9wYXBlcnMvYXJ0c3lu Yy5wZGY+DQoNCltvY2FtbC1tdWx0aWNvcmVdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwtbXVs dGljb3JlL29jYW1sLW11bHRpY29yZT4NCg0KDQpwZXJmIGRlbWFuZ2xpbmcgb2YgT0NhbWwgc3lt Ym9scyAoYW5kIGEgc2hvcnQgaW50cm9kdWN0aW9uIHRvIHBlcmYpDQrilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9y Zy90L2Fubi1wZXJmLWRlbWFuZ2xpbmctb2Ytb2NhbWwtc3ltYm9scy1hLXNob3J0LWludHJvZHVj dGlvbi10by1wZXJmLzcxNDMvMT4NCg0KDQpGYWJpYW4gYW5ub3VuY2VkDQrilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBBcyBhIHByb2plY3Qgc3Bv bnNvcmVkIGJ5IHRoZSBbT0NhbWwgc29mdHdhcmUgZm91bmRhdGlvbl0sIEkndmUgd29ya2VkDQog IG9uIGRlbWFuZ2xpbmcgT0NhbWwgc3ltYm9scyBpbiBbcGVyZl0uIFNvbWUgc2NyZWVuc2hvdHMg YXJlIGJlbG93LiBUaGUNCiAgd29yayBpcyBjdXJyZW50bHkgYmVpbmcgdXBzdHJlYW1lZC4gSW4g dGhlIG1lYW50aW1lLCBpdCBjYW4gYmUgdXNlZCBhcw0KICBmb2xsb3dzOg0KDQogIOKUjOKUgOKU gOKUgOKUgA0KICDilIIgZ2l0IGNsb25lIC0tZGVwdGg9MSBodHRwczovL2dpdGh1Yi5jb20vY29w eS9saW51eC5naXQNCiAg4pSCICMgb3I6DQogIOKUgiAjIHdnZXQgaHR0cHM6Ly9naXRodWIuY29t L2NvcHkvbGludXgvYXJjaGl2ZS9tYXN0ZXIudGFyLmd6ICYmIHRhciB4ZnYgbWFzdGVyLnRhci5n eg0KICDilIIgY2QgbGludXgvdG9vbHMvcGVyZg0KICDilIIgbWFrZQ0KICDilIIgYWxpYXMgcGVy Zj0kUFdEL3BlcmYNCiAg4pSCICMgb3IgY29weSBwZXJmIHRvIHNvbWV3aGVyZSBpbiB5b3VyIFBB VEgNCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgWW91ciBkaXN0cmlidXRpb24ncyB2ZXJzaW9uIG9m IHBlcmYgd2lsbCBhbHNvIHdvcmsgZm9yIHRoZSBleGFtcGxlcw0KICBiZWxvdywgYnV0IHdpbGwg aGF2ZSBsZXNzIHJlYWRhYmxlIHN5bWJvbHMgOi0pDQoNCg0KW09DYW1sIHNvZnR3YXJlIGZvdW5k YXRpb25dIDxodHRwczovL29jYW1sLXNmLm9yZy8+DQoNCltwZXJmXSA8aHR0cHM6Ly9wZXJmLndp a2kua2VybmVsLm9yZy9pbmRleC5waHAvTWFpbl9QYWdlPg0KDQpTaG9ydCBpbnRydWN0aW9uIHRv IHBlcmYNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIFBlcmYgaXMgYSBMaW51eC1vbmx5IHNhbXBsaW5n IHByb2ZpbGVyIChhbmQgbW9yZSksIHdoaWNoIGNhbiBiZSB1c2VkDQogIHRvIGFuYWx5c2UgdGhl IHBlcmZvcm1hbmNlIHByb2ZpbGUgb2YgT0NhbWwgYW5kIG90aGVyDQogIGV4ZWN1dGFibGVzLiBX aGVuIGNvbXBpbGluZyB3aXRoIG9jYW1sb3B0LCBhZGQgYC1nJyB0byBpbmNsdWRlIGRlYnVnDQog IGluZm9ybWF0aW9uIGluIHRoZSBleGVjdXRhYmxlLiBkdW5lIGRvZXMgdGhpcyBhdXRvbWF0aWNh bGx5LCBldmVuIGluDQogIHRoZSByZWxlYXNlIHByb2ZpbGUuIFRvIHN0YXJ0IGEgcHJvZ3JhbSBh bmQgcmVjb3JkIGl0cyBwcm9maWxlOg0KICDilIzilIDilIDilIDilIANCiAg4pSCIHBlcmYgcmVj b3JkIC0tY2FsbC1ncmFwaCBkd2FyZiBwcm9ncmFtLmV4ZQ0KICDilJTilIDilIDilIDilIANCiAg T3IgcmVjb3JkIGEgcnVubmluZyBwcm9ncmFtOg0KICDilIzilIDilIDilIDilIANCiAg4pSCIHBl cmYgcmVjb3JkIC0tY2FsbC1ncmFwaCBkd2FyZiAtcCBgcGlkb2YgcHJvZ3JhbS5leGVgDQogIOKU lOKUgOKUgOKUgOKUgA0KDQogIFRoZW4sIHZpZXcgYSBwcm9maWxlIHVzaW5nOg0KICDilIzilIDi lIDilIDilIANCiAg4pSCIHBlcmYgcmVwb3J0ICMgdG9wLWRvd24NCiAg4pSCIHBlcmYgcmVwb3J0 IC0tbm8tY2hpbGRyZW4gIyBib3R0b20tdXANCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgV2l0aGlu IHRoZSByZXBvcnQgdmlldywgdGhlIGZvbGxvd2luZyBrZXliaW5kaW5ncyBhcmUgdXNlZnVsOg0K DQogIOKAoiBgKyc6IG9wZW4vY2xvc2Ugb25lIGNhbGxjaGFpbiBsZXZlbA0KICDigKIgYGUnOiBv cGVuL2Nsb3NlIGVudGlyZSBjYWxsY2hhaW4NCiAg4oCiIGB0JzogVG9nZ2xlIGJld2VlbiBjdXJy ZW50IHRocmVhZCBhbmQgYWxsIHRocmVhZHMgKGUuZy4sIG9ubHkNCiAgICBgZHVuZScsIGBvY2Ft bG9wdCcsIGV0Yy4pDQoNCiAgT3IgZ2VuZXJhdGUgYSBmbGFtZWdyYXBoOg0KDQogIOKUjOKUgOKU gOKUgOKUgA0KICDilIIgZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS9icmVuZGFuZ3JlZ2cv RmxhbWVHcmFwaA0KICDilIIgY2QgRmxhbWVHcmFwaA0KICDilIIgcGVyZiBzY3JpcHQgLWkgcGF0 aC90by9wZXJmLmRhdGEgfCAuL3N0YWNrY29sbGFwc2UtcGVyZi5wbCB8IC4vZmxhbWVncmFwaC5w bCA+IHBlcmYtZmxhbWVncmFwaC5zdmcNCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgWW91IG1heSBu ZWVkIHRvIHJ1biB0aGUgZm9sbG93aW5nIGNvbW1hbmQgdG8gYWxsb3cgcmVjb3JkaW5nIGJ5DQog IG5vbi1yb290IHVzZXJzIChbbW9yZSBpbmZvc10pOg0KICDilIzilIDilIDilIDilIANCiAg4pSC IGVjaG8gMCB8IHN1ZG8gdGVlIC9wcm9jL3N5cy9rZXJuZWwvcGVyZl9ldmVudF9wYXJhbm9pZA0K ICDilJTilIDilIDilIDilIANCg0KDQpbbW9yZSBpbmZvc10NCjxodHRwczovL3d3dy5rZXJuZWwu b3JnL2RvYy9odG1sL2xhdGVzdC9hZG1pbi1ndWlkZS9wZXJmLXNlY3VyaXR5Lmh0bWwjdW5wcml2 aWxlZ2VkLXVzZXJzPg0KDQoNClNvdXJjZXMNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIOKA oiBbUHJvZmlsaW5nIE9DYW1sIGNvZGVdDQogIOKAoiA8aHR0cHM6Ly9wZXJmLndpa2kua2VybmVs Lm9yZy9pbmRleC5waHAvVHV0b3JpYWwjU2FtcGxpbmdfd2l0aF9wZXJmX3JlY29yZD4NCiAg4oCi IDxodHRwOi8vd3d3LmJyZW5kYW5ncmVnZy5jb20vcGVyZi5odG1sI0ZsYW1lR3JhcGhzPg0KDQog IEJlZm9yZToNCg0KICA8aHR0cHM6Ly9hd3MxLmRpc2NvdXJzZS1jZG4uY29tL3N0YW5kYXJkMTEv dXBsb2Fkcy9vY2FtbC9vcHRpbWl6ZWQvMlgvOS85NTQzMzg2OWU0ZDU1YzZjODIyYTA5NmE5MDE0 ODMzMDRkNDQzMzhkXzJfMTM4MHg2MDIucG5nPg0KDQogIEFmdGVyOg0KDQogIDxodHRwczovL2F3 czEuZGlzY291cnNlLWNkbi5jb20vc3RhbmRhcmQxMS91cGxvYWRzL29jYW1sL29wdGltaXplZC8y WC8zLzNiZjg0N2VhMjM2MDg5NzM2NDQxNzU5MjdlMDlkNGQwMzlhYjcyMGVfMl8xMzgweDYwMi5w bmc+DQoNCiAgQm90dG9tLXVwOg0KDQogIDxodHRwczovL2F3czEuZGlzY291cnNlLWNkbi5jb20v c3RhbmRhcmQxMS91cGxvYWRzL29jYW1sL29wdGltaXplZC8yWC8wLzAxMDQyNjYzY2NmNjZlOGI5 NTU3MjNmYWUzY2QxYzZmZjllMGIwMjlfMl8xMzgweDYwMi5wbmc+DQoNCiAgRmxhbWVncmFwaCAo Y3JvcHBlZCk6DQoNCiAgPGh0dHBzOi8vYXdzMS5kaXNjb3Vyc2UtY2RuLmNvbS9zdGFuZGFyZDEx L3VwbG9hZHMvb2NhbWwvb3B0aW1pemVkLzJYL2MvYzhlM2UwZjViOWUxZDg3OTE5ODg5MjM5NTUy OWViYjNjMzM5Yzc5MV8yXzEzODB4NjAyLnBuZz4NCg0KDQpbUHJvZmlsaW5nIE9DYW1sIGNvZGVd DQo8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sLWJlbmNoL25vdGVzL2Jsb2IvbWFzdGVyL3Byb2Zp bGluZ19ub3Rlcy5tZD4NCg0KDQpEZWNpbWFsIDAuMi4xIC0gYXJiaXRyYXJ5LXByZWNpc2lvbiBk ZWNpbWFsIGZsb2F0aW5nIHBvaW50DQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNj dXNzLm9jYW1sLm9yZy90L2RlY2ltYWwtMC0yLTEtYXJiaXRyYXJ5LXByZWNpc2lvbi1kZWNpbWFs LWZsb2F0aW5nLXBvaW50LzcxNDQvMT4NCg0KDQpZYXdhciBBbWluIGFubm91bmNlZA0K4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoN CiAgSGFwcHkgdG8gYW5ub3VuY2UgdGhhdCBgZGVjaW1hbCcgMC4yLjEgaGFzIGJlZW4gW3B1Ymlz aGVkIG9uIG9wYW1dLg0KDQogIGBkZWNpbWFsJyBpcyBhIHBvcnQgb2YgW1B5dGhvbidzIGBkZWNp bWFsJyBtb2R1bGVdIHRvIE9DYW1sIGFuZA0KICBpbXBsZW1lbnRzIHRoZSBbR2VuZXJhbCBEZWNp bWFsIEFyaXRobWV0aWMgU3BlY2lmaWNhdGlvbl0uIEhvd2V2ZXINCiAgbm90ZSB0aGF0IGl0IGlz IGEgcG9ydCBpbiBwcm9ncmVzc+KAk2Jhc2ljIGFyaXRobWV0aWMgYW5kIHJvdW5kaW5nDQogIGZ1 bmN0aW9ucyBoYXZlIGJlZW4gcG9ydGVkLCBidXQgSSBhbSBzdGlsbCB3b3JraW5nIG9uIHBvd2Vy cyBhbmQNCiAgbG9ncy4gVGhlIHBvcnRlZCBmdW5jdGlvbnMgcGFzcyB0aGUgc2FtZSB1bml0IHRl c3Qgc3VpdGUgdGhhdCB0aGUNCiAgUHl0aG9uIHZlcnNpb24gZG9lcyAod2l0aCBzb21lIG1pbm9y IG1vZGlmaWNhdGlvbnMpLg0KDQogIEFub3RoZXIgY2F2ZWF0OiBjdXJyZW50bHkgdGhlIGxpYnJh cnkgaXMgb25seSBzdXBwb3J0ZWQgb24gNjQtYml0DQogIGFyY2hpdGVjdHVyZXMgZHVlIHRvIChl eHBvbmVudCkgb3ZlcmZsb3cgaXNzdWVzIG9uIDMyLWJpdC4gSWYgYW55b25lDQogIGlzIHdpbGxp bmcgdG8gdGVzdCBhbmQgZml4IG92ZXJmbG93cyBvbiAzMi1iaXQsIEkgYW0gbW9yZSB0aGFuIGhh cHB5DQogIHRvIGFjY2VwdCBQUnMuDQoNCiAgSGVyZSdzIGFuIGV4YW1wbGUgb2YgdXNpbmcgdGhl IG1vZHVsZToNCg0KICDilIzilIDilIDilIDilIANCiAg4pSCICgqIFJvc2V0dGEgQ29kZSBDdXJy ZW5jeSBFeGFtcGxlICopDQogIOKUgiANCiAg4pSCICgqIERlbW8gcHVycG9zZXMsIG5vcm1hbGx5 IHlvdSdkIHByZWZpeCBtb2R1bGUgbmFtZSBvciBsb2NhbCBvcGVuICopDQogIOKUgiBvcGVuIERl Y2ltYWwNCiAg4pSCIA0KICDilIIgbGV0IGhhbWJ1cmdlcl9xdHkgPSBvZl9zdHJpbmcgIjRfMDAw XzAwMF8wMDBfMDAwXzAwMCINCiAg4pSCIGxldCBoYW1idXJnZXJfYW10ID0gb2Zfc3RyaW5nICI1 LjUwIg0KICDilIIgbGV0IG1pbGtzaGFrZV9xdHkgPSBvZl9pbnQgMg0KICDilIIgbGV0IG1pbGtz aGFrZV9hbXQgPSBvZl9zdHJpbmcgIjIuODYiDQogIOKUgiANCiAg4pSCICgqIFNob3J0Y3V0IHRv IGRpdmlkZSA3LjY1IGJ5IDEwMCAqKQ0KICDilIIgbGV0IHRheF9yYXRlID0gb2Zfc3RyaW5nICI3 LjY1ZS0yIg0KICDilIIgDQogIOKUgiBsZXQgc3VidG90YWwgPSBoYW1idXJnZXJfcXR5ICogaGFt YnVyZ2VyX2FtdCArIG1pbGtzaGFrZV9xdHkgKiBtaWxrc2hha2VfYW10DQogIOKUgiBsZXQgdGF4 ID0gcm91bmQgfm46MiAoc3VidG90YWwgKiB0YXhfcmF0ZSkNCiAg4pSCIGxldCB0b3RhbCA9IHN1 YnRvdGFsICsgdGF4DQogIOKUgiANCiAg4pSCIGxldCAoKSA9IEZvcm1hdC5wcmludGYgIlN1YnRv dGFsOiAlYQ0KICDilIIgICAgICBUYXg6ICAlYQ0KICDilIIgICAgVG90YWw6ICVhXG4iIHBwIHN1 YnRvdGFsIHBwIHRheCBwcCB0b3RhbA0KICDilJTilIDilIDilIDilIANCg0KICBZb3UgY2FuIGdl dCB0aGUgcGFja2FnZSB3aXRoOiBgb3BhbSBpbnN0YWxsIGRlY2ltYWwnLiBNaW5pbXVtIE9DYW1s DQogIHZlcnNpb24gNC4wOC4NCg0KDQpbcHViaXNoZWQgb24gb3BhbV0gPGh0dHA6Ly9vcGFtLm9j YW1sLm9yZy9wYWNrYWdlcy9kZWNpbWFsLz4NCg0KW1B5dGhvbidzIGBkZWNpbWFsJyBtb2R1bGVd DQo8aHR0cHM6Ly9kb2NzLnB5dGhvbi5vcmcvMy9saWJyYXJ5L2RlY2ltYWwuaHRtbD4NCg0KW0dl bmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFNwZWNpZmljYXRpb25dDQo8aHR0cDovL3NwZWxlb3Ry b3ZlLmNvbS9kZWNpbWFsL2RlY2FyaXRoLmh0bWw+DQoNCg0KQmFzaWMgR2l0TGFiIENJIGNvbmZp Z3VyYXRpb24NCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQog IDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYmFzaWMtZ2l0bGFiLWNpLWNvbmZpZ3VyYXRp b24vMzMyNy8yNT4NCg0KDQpnYXNjaGUgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBBZnRlciBhIGxvbmcgY2ktZ29sZmluZyBh ZHZlbnR1cmUgKDgzIHRlc3RzKSwgSSBnb3QgYSBgLmdpdGxhYi1jaS55bWwnDQogIGZpbGUgdGhh dCBJIHRoaW5rIGlzIHJldXNhYmxlIGFuZCB1c2VmdWwgZm9yIHNtYWxsIHByb2plY3RzIC8NCiAg bGlicmFyaWVzOg0KICDigKIgcHJvamVjdDogPGh0dHBzOi8vZ2l0bGFiLmNvbS9nYXNjaGUvZ2l0 bGFiLW9jYW1sLWNpLWV4YW1wbGU+DQogIOKAoiBjb25maWd1cmF0aW9uIGZpbGU6DQogICAgPGh0 dHBzOi8vZ2l0bGFiLmNvbS9nYXNjaGUvZ2l0bGFiLW9jYW1sLWNpLWV4YW1wbGUvLS9ibG9iL21h aW4vLmdpdGxhYi1jaS55bWw+DQoNCiAgRmVhdHVyZXM6DQogIOKAoiBJdCBpcyBwcm9qZWN0LWFn bm9zdGljLCBzbyBpdCBzaG91bGQgd29yayB1bmNoYW5nZWQgZm9yIHlvdXIgb3duDQogICAgKHNp bXBsZSkgcHJvamVjdHMuDQogIOKAoiBJdCBjYWNoZXMgdGhlIG9wYW0gZGVwZW5kZW5jaWVzLg0K ICDigKIgSXQgYnVpbGRzIHRoZSBwcm9qZWN0LCBydW5zIHRoZSB0ZXN0cyBhbmQgYnVpbGRzIHRo ZSBkb2N1bWVudGF0aW9uLg0KICDigKIgU2V2ZXJhbCBjb21waWxlciB2ZXJzaW9ucyBjYW4gYmUg dGVzdGVkIGluIHBhcmFsbGVsLg0KICDigKIgSXQgcHJvdmlkZXMgYW4gZWFzeSB3YXkgdG8gdXBs b2FkIHRoZSBkb2N1bWVudGF0aW9uIGFzICJHaXRsYWINCiAgICBwcm9qZWN0IFBhZ2VzIi4NCg0K ICBDSSB0aW1lcyBhcmUgc2F0aXNmeWluZzogb24gdmVyeSBzbWFsbCBsaWJyYXJpZXMgSSBvYnNl cnZlIGEgMTFtbiBqb2INCiAgdGltZSBvbiB0aGUgZmlyc3QgcnVuIChvciB3aGVuIGNsZWFuaW5n IHRoZSBvcGFtIGNhY2hlKSwgYW5kIDJtbiBqb2INCiAgdGltZSBvbiBmb2xsb3dpbmcgcnVucy4N Cg0KICBUaGUgZXhwZWN0ZWQgdXNhZ2UtbW9kZSBvZiB0aGlzIENJIGNvbmZpZ3VyYXRpb24gaXMg dGhhdCB5b3UgY29weSBpdA0KICBpbiB5b3VyIG93biBwcm9qZWN0LiBJZiB5b3UgZmluZCB0aGF0 IHlvdSBuZWVkL3dhbnQgYWRkaXRpb25hbA0KICBmZWF0dXJlcywgaWRlYWxseSB5b3Ugd291bGQg dHJ5IHRvIHdyaXRlIHRoZW0gaW4gYSBwcm9qZWN0LWFnb25pc3RpYw0KICB3YXkgYW5kIGNvbnRy aWJ1dGUgdGhlbSBiYWNrIHRvIHRoZSBleGFtcGxlIHJlcG9zaXRvcnkuDQoNCiAgVGhpcyBjb25m aWd1cmF0aW9uIGRvZXMgbm90IHVzZSBAc21vbmRldCdzIHRyaWNrIG9mIGdlbmVyYXRpbmcgYQ0K ICBkb2NrZXIgaW1hZ2Ugb24gdGhlIGZseS4gSSB0aGluayB0aGlzIHdvdWxkIGJlIGFuIGV4Y2Vs bGVudCBpZGVhIHRvDQogIGdldCBtb3JlIHJlbGlhYmxlIGNhY2hpbmcsIGJ1dCBpdCBpcyB0b28g Y29tcGxleCBmb3IgbWUgYW5kIEkgZG9uJ3QNCiAgc2VlIGhvdyB0byBkbyBpdCBpbiBhIG1haW50 YWluYWJsZSBhbmQgcHJvamVjdC1hZ25vc3RpYyB3YXkuDQoNCg0KQ3VycmVudCBzdGF0dXMNCuKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIEkgd3JvdGUgdGhp cyBDSSBjb25maWd1cmF0aW9uIG92ZXIgdGhlIHdlZWstZW5kLCBhbmQgaGF2ZSBub3QgdXNlZCBp dA0KICBtdWNoLiBJIGV4cGVjdCBpdCB0byBrZWVwIGV2b2x2aW5nIHNvbWV3aGF0IGJlZm9yZSBp dA0KICBzdGFiaWxpemVzLiBGZWVkYmFjayBmcm9tIG90aGVyIHBlb3BsZSB0cnlpbmcgdG8gdXNl IHRoZSBjb25maWd1cmF0aW9uDQogIHdvdWxkIGJlIHdhcm1seSB3ZWxjb21lLg0KDQoNCkFzaWRl IG9uIGBfYnVpbGQnIGNhY2hpbmcNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIEkgYWxzbyBpbXBs ZW1lbnRlZCBjYWNoaW5nIG9mIGR1bmUncyBgX2J1aWxkJyBkYXRhLCBpbnNwaXJlZCBieSB0aGUN CiAgW2RhdGEtZW5jb2RpbmddIGV4YW1wbGUgb2YgQHJhcGhhZWwtcHJvdXN0LiBJIGRvbid0IG5l ZWQgaXQgZm9yIG15DQogIHNtYWxsIHByb2plY3RzIChkdW5lIGJ1aWxkIGlzIDNzLCBjb21wYXJl ZCB0byAxbSBzZXR0aW5nIHVwIHRoZSBEb2NrZXINCiAgaW1hZ2UpLCBidXQgSSB0aG91Z2h0IGl0 IHdvdWxkIG1ha2UgdGhlIENJIGNvbmZpZ3VyYXRpb24gc2NhbGUgYmV0dGVyDQogIHRvIGxhcmdl ciBwcm9qZWN0cy4NCg0KICBXaGVuIEkgdGVzdGVkIHRoaXMgQ0kgY29uZmlndXJhdGlvbiwgSSBk aXNjb3ZlcmVkIHRoYXQgY2FjaGluZyB0aGUNCiAgZHVuZSBgX2J1aWxkJyBkYXRhIGRvZXMgbm90 IHdvcmsgYXMgd2VsbCBhcyBJIGhhZCBleHBlY3RlZC4gKFRyYWNraW5nDQogIGlzc3VlOiBbZHVu ZSM0MTUwXSkuDQoNCiAgSSBjYW4gdGVsbCBiZWNhdXNlIEkgYW0gYXNraW5nIGR1bmUgdG8gdGVs bCBtZSBhYm91dCB3aGF0IGl0IGlzDQogIHJlYnVpbGRpbmcgKGBkdW5lIGJ1aWxkIC0tZGlzcGxh eSBzaG9ydCcpLiBJIHN1c3BlY3QgdGhhdCBwcm9qZWN0cw0KICB0aGF0IGNhY2hlIHRoZSBgX2J1 aWxkJyBkYXRhICp3aXRob3V0KiBsb2dnaW5nIHdoYXQgZHVuZSAocmUpYnVpbGRzDQogIGFyZSBh bHNvIG5vdCBjYWNoaW5nIGFzIG11Y2ggYXMgdGhleSB0aGluayB0aGV5IGFyZS4NCg0KICAoQnV0 IHRoZW4gbWF5YmUgdGhlIHVzZSBvZiBhIGZpeGVkLWNvbXBpbGVyIE9QQU0gaW1hZ2UsIGFzDQog IGRhdGEtZW5jb2RpbmcgaXMgdXNpbmcsIHNvbHZlcyB0aGUgaXNzdWUuKQ0KDQoNCltkYXRhLWVu Y29kaW5nXQ0KPGh0dHBzOi8vZ2l0bGFiLmNvbS9ub21hZGljLWxhYnMvZGF0YS1lbmNvZGluZy8t L2Jsb2IvbWFzdGVyLy5naXRsYWItY2kueW1sPg0KDQpbZHVuZSM0MTUwXSA8aHR0cHM6Ly9naXRo dWIuY29tL29jYW1sL2R1bmUvaXNzdWVzLzQxNTA+DQoNCg0Kb2ZmaWNpYWwgQ0kgdGVtcGxhdGU/ DQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYwNCg0KICBJIGNvbnNpZGVyZWQgc3VibWl0dGluZyB0aGlzIENJIGNvbmZpZ3VyYXRp b24gYXMgYW4gIk9DYW1sIEdpdGxhYiBDSQ0KICB0ZW1wbGF0ZSIgdG8gZ28gd2l0aCB0aGUgb2Zm aWNpYWwgbGlzdCBvZiAiYmxlc3NlZCIgQ0kgdGVtcGxhdGVzIGluDQogIFt0aGUgZG9jdW1lbnRh dGlvbl0uIEJ1dCByZWFkaW5nIHRoZSBbRGV2ZWxvcG1lbnQgZ3VpZGUgZm9yIEdpdGxhYg0KICBD SS9DRCB0ZW1wbGF0ZXNdIGNvbnZpbmNlZCBtZSB0aGF0IG15IENJIGNvbmZpZ3VyYXRpb24gaXMg bm93aGVyZQ0KICByZWFkeSB0byBzZXJ2ZSB0aGlzIHJvbGUuDQoNCiAgR2l0bGFiIGRldmVsb3Bl cnMgYXBwYXJlbnRseSBleHBlY3QgdGhhdCB1c2VycyB3aWxsIGJlIGFibGUgdG8NCiAgImluY2x1 ZGUiIHRob3NlIENJIHRlbXBsYXRlcyBieSBwb2ludGluZyB0byB0aGVpciBVUkwsIGFuZCB0aGVu IHR1bmUNCiAgaXQgZm9yIHRoZWlyIG93biB1c2UtY2FzZSAod2l0aG91dCBtb2RpZnlpbmcgaXQp IGJ5IHBlcmZvcm1pbmcgc29tZQ0KICAodW5yZWFzb25hYmxlPykgaW5oZXJpdGFuY2UgdHJpY2tz IHVzaW5nIHdoYXRldmVyIHRob3NlIGNvbmZpZ3VyYXRpb25zDQogIG9mZmVycyBhcyBhYnN0cmFj dGlvbi9pbmhlcml0YW5jZS9leHRlbnNpb24vb3ZlcnJpZGluZw0KICBtZWNoYW5pc20uIExldCdz IGp1c3Qgc2F5IHRoYXQgdGhpcyBpcyBuZXh0LWxldmVsIENJIGNvbmZpZ3VyYXRpb24NCiAgd3Jp dGluZywgYW5kIHRoYXQgbXkgc2NyaXB0IGlzIG5vdCByZWFkeSBmb3IgdGhpcy4NCg0KDQpbdGhl IGRvY3VtZW50YXRpb25dDQo8aHR0cHM6Ly9kb2NzLmdpdGxhYi5jb20vZWUvY2kvZXhhbXBsZXMv UkVBRE1FLmh0bWwjY2ljZC10ZW1wbGF0ZXM+DQoNCltEZXZlbG9wbWVudCBndWlkZSBmb3IgR2l0 bGFiIENJL0NEIHRlbXBsYXRlc10NCjxodHRwczovL2dpdGxhYi5jb20vZ2l0bGFiLW9yZy9naXRs YWIvLS9ibG9iL21hc3Rlci9kb2MvZGV2ZWxvcG1lbnQvY2ljZC90ZW1wbGF0ZXMubWQ+DQoNCg0K T0NhbWwgT2ZmaWNlIEhvdXJzPw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZTogPGh0dHBzOi8vZGlzY3Vzcy5vY2Ft bC5vcmcvdC9vY2FtbC1vZmZpY2UtaG91cnMvNzEzMi80Pg0KDQoNCkRlZXAgaW4gdGhpcyB0aHJl YWQsIFVuaXhKdW5raWUgc2FpZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSADQoNCiAgSW4gYWRkaXRpb24gdG8gbWFpbGluZyBsaXN0cyBhbmQgZGlz Y3VzcywgdGhlcmUgaXMgYWxzbyBhbiBJUkMgY2hhbm5lbA0KICB3aGVyZSBwZW9wbGUgY2FuIGlu dGVyYWN0IHdpdGggc29tZSBvY2FtbCBleHBlcnRzIGluIGEgbW9yZQ0KICAiaW50ZXJhY3RpdmUi IG1hbm5lciAoPGlyYzovL2lyYy5mcmVlbm9kZS5uZXQvI29jYW1sPikNCg0KDQpqc29uLWRhdGEt ZW5jb2RpbmcgMC45DQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNz Lm9jYW1sLm9yZy90L2Fubi1qc29uLWRhdGEtZW5jb2RpbmctMC05LzcxNTcvMT4NCg0KDQpSYXBo YcOrbCBQcm91c3QgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBPbiBiZWhhbGYgb2Yg W05vbWFkaWMgTGFic10sIEknbSBoYXBweSB0byBhbm5vdW5jZSB0aGUgcmVsZWFzZSBvZg0KICBq c29uLWRhdGEtZW5jb2RpbmcgdmVyc2lvbiAwLjkuDQoNCiAgVGhlIGNvZGUgaXMgaG9zdGVkIG9u IEdpdGxhYjoNCiAgPGh0dHBzOi8vZ2l0bGFiLmNvbS9ub21hZGljLWxhYnMvanNvbi1kYXRhLWVu Y29kaW5nPiBJdCBpcyBkaXN0cmlidXRlZA0KICB1bmRlciBHTlUgTEdQTCB3aXRoIGxpbmtpbmcg ZXhjZXB0aW9uLiAgVGhlIGRvY3VtZW50YXRpb24gaXMgYXZhaWxhYmxlDQogIG9ubGluZTogPGh0 dHBzOi8vbm9tYWRpYy1sYWJzLmdpdGxhYi5pby9qc29uLWRhdGEtZW5jb2RpbmcvPiBUaGUNCiAg cGFja2FnZSBpcyBhdmFpbGFibGUgdW5kZXIgb3BhbTogYG9wYW0gaW5zdGFsbCBqc29uLWRhdGEt ZW5jb2RpbmcnDQoNCiAganNvbi1kYXRhLWVuY29kaW5nIGlzIGEgbGlicmFyeSB0byBkZWZpbmUg ZW5jb2Rlci9kZWNvZGVyIHZhbHVlcyB0bw0KICB0cmFuc2xhdGUgT0NhbWwgdmFsdWVzIHRvIEpT T04gYW5kIGJhY2suIEl0IGFsc28gZ2VuZXJhdGVzIEpTT04NCiAgc2NoZW1hcyBzbyB5b3UgY2Fu IGRvY3VtZW50IHRoZSB2YWx1ZSByZXByZXNlbnRhdGlvbi4gSXQgY2FuIHVzZQ0KICBlaXRoZXIg RXpqc29ubSBvciBZb2pzb24gYXMgYmFja2VuZHMuDQoNCiAgVGhlIHZlcnNpb24gMC45IGhhcyB0 aGUgZm9sbG93aW5nIG5ldyBmZWF0dXJlczoNCiAg4oCiIG1vcmUgdGVzdHMNCiAg4oCiIG1lbW9p c2F0aW9uIG9mIGZpeHBvaW50IGVuY29kaW5nIHRvIGF2b2lkIHJlcGVhdGVkIGNvbXB1dGF0aW9u cw0KICDigKIgc3VwcG9ydCBmb3IgYGZvcm1hdCcgZmllbGQgZm9yIHN0cmluZyBzY2hlbWFzIChz ZWUNCiAgICA8aHR0cHM6Ly9qc29uLXNjaGVtYS5vcmcvdW5kZXJzdGFuZGluZy1qc29uLXNjaGVt YS9yZWZlcmVuY2Uvc3RyaW5nLmh0bWwjZm9ybWF0PikNCiAgICAoY29udHJpYnV0ZWQgYnkgQGxl dmlsbGFpbi5tYXhpbWUpDQogIOKAoiBmaXhlZCBpbnRlZ2VyIGJvdW5kIHByaW50aW5nIGluIHNj aGVtYXMgKGJ1ZyByZXBvcnQgYnkgQHB3Mzc0KQ0KICDigKIgc3VwcG9ydCBmb3IganNvbi1sZXhl bWUgc3RyZWFtaW5nIChzZWUgZGV0YWlscyBiZWxvdykNCiAg4oCiIHN1cHBvcnQgZm9yIGluY2x1 c2lvbi9leGNsdXNpb24gb2YgZGVmYXVsdC12YWx1ZSBmaWVsZHMgZHVyaW5nDQogICAgc2VyaWFs aXNhdGlvbiAoY29udHJpYnV0ZWQgYnkgQGxldmlsbGFpbi5tYXhpbWUpDQogIOKAoiBpbXByb3Zl ZCB1bmlvbi1vZi1vYmplY3Qgc2NoZW1hcyAoY29udHJpYnV0ZWQgYnkgQGxldmlsbGFpbi5tYXhp bWUpDQoNCiAgT25lIG1ham9yIGRpZmZlcmVuY2Ugd2l0aCB0aGUgcHJldmlvdXMgcmVsZWFzZSBp cyB0aGUgaW5jbHVzaW9uIG9mIGENCiAgbGV4ZW1lLXN0cmVhbWluZyBKU09OIGNvbnN0cnVjdG9y LiBTcGVjaWZpY2FsbHksIHRoZSBmdW5jdGlvbg0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIg dmFsIGNvbnN0cnVjdF9zZXEgOiAndCBlbmNvZGluZyAtPiAndCAtPiBqc29ubV9sZXhlbWUgU3Rk bGliLlNlcS50DQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIGdlbmVyYXRlcyBhIHNlcXVlbmNlIG9m IGBKc29ubS5sZXhlbWUnICh0aGUgLiBUaGlzIHNlcXVlbmNlIGlzIGxhenkNCiAgKGluIHRoZSBz ZW5zZSBvZiBgU3RkbGliLlNlcScgbm90IG9mIGBTdGRsaWIuTGF6eScpIGFuZCBpdCBwYXZlcyB0 aGUNCiAgd2F5IHRvIGEgc2ltaWxhciBmZWF0dXJlIGluIGBkYXRhLWVuY29kaW5nJy4gQW4gaW50 ZXJlc3RpbmcgZmVhdHVyZSBvZg0KICBzZXF1ZW5jZXMgaXMgdGhhdCB0aGV5IGNhbiBiZSB1c2Vk IGluIFZhbmlsbGEgT0NhbWwgc2V0dGluZ3MgYXMgd2VsbA0KICBhcyBMd3QvQXN5bmMgc2V0dGlu Z3Mgd2hlcmUgdGhleSBhbGxvdyB1c2VyLWRyaXZlbiB5aWVsZGluZyBpbiBiZXR3ZWVuDQogIGVs ZW1lbnRzLg0KDQoNCltOb21hZGljIExhYnNdIDxodHRwczovL25vbWFkaWMtbGFicy5jb20vPg0K DQoNClZTQ29kZSBPQ2FtbCBQbGF0Zm9ybSB2MS42LjANCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXZz Y29kZS1vY2FtbC1wbGF0Zm9ybS12MS02LTAvNzE2NC8xPg0KDQoNClJ1ZGkgR3JpbmJlcmcgYW5u b3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIANCg0KICBPbiBiZWhhbGYgb2YgdGhlIHZzY29kZS1vY2FtbC1w bGF0Zm9ybSB0ZWFtLCBJJ20gcGxlYXNlZCB0byBhbm5vdW5jZQ0KICAxLjYuMC4gVGhpcyByZWxl YXNlIGNvbnRhaW5zIGEgbmV3IGFjdGl2aXR5IHRhYiBmb3IgbWFuYWdpbmcgb3BhbQ0KICBzd2l0 Y2hlcyBkZXZlbG9wZWQgYnkgQHRtYXR0aW8uIFdlIGhvcGUgeW91IGZpbmQgaXQgdXNlZnVsLg0K DQogIENoYW5nZSBsb2c6DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiAtIEhpZ2hsaWdodCB0 b2tlbiBhbGlhc2VzIGluIE1lbmhpciBhc3NvY2lhdGl2aXR5IGRlY2xhcmF0aW9ucyAoIzQ3MykN CiAg4pSCIA0KICDilIIgLSBBY3RpdmF0ZSB0aGUgZXh0ZW5zaW9uIHdoZW4gd29ya3NwYWNlIGNv bnRhaW5zIE9DYW1sLCBSZWFzb24gc291cmNlcyBvcg0KICDilIIgICBwcm9qZWN0IG1hcmtlciBm aWxlcy4gKCM0ODIpDQogIOKUgiANCiAg4pSCIC0gQWRkIGBvY2FtbC51c2VPY2FtbEVudmAgc2V0 dGluZyB0byBkZXRlcm1pbmUgd2hldGhlciB0byB1c2UgYG9jYW1sLWVudmAgZm9yDQogIOKUgiAg IG9wYW0gY29tbWFuZHMgZnJvbSBPQ2FtbCBmb3IgV2luZG93cyAoIzQ4MSkNCiAg4pSCIA0KICDi lIIgLSBGaXggdGVybWluYWwgY3JlYXRpb24gd2hlbiB1c2luZyBkZWZhdWx0IHNoZWxsIGFuZCBh cmd1bWVudHMgKCM0ODQpDQogIOKUgiANCiAg4pSCIC0gQWRkIGFuIE9DYW1sIGFjdGl2aXR5IHRh Yi4NCiAg4pSCIA0KICDilIIgICBUaGUgYWN0aXZpdHkgdGFiIHByb3ZpZGVzIHRocmVlIHZpZXdz OiB0aGUgYXZhaWxhYmxlIHN3aXRjaGVzLCB0aGUgYnVpbGQNCiAg4pSCICAgY29tbWFuZHMgYW5k IGFuIEhlbHAgYW5kIEZlZWRiYWNrIHNlY3Rpb24gd2l0aCBsaW5rcyB0byBjb21tdW5pdHkgY2hh bm5lbHMuDQogIOKUgiANCiAg4pSCIC0gU3VwcG9ydCBgZWxpb21gIGFuZCBgZWxpb21pYCBmaWxl IGV4dGVuc2lvbnMgKCM0ODcpDQogIOKUgiANCiAg4pSCIC0gRml4IG9jYW1sL29jYW1sLWxzcCMz NTg6IGF1dG9tYXRpYyBpbnNlcnRpb24gb2YgYW4gaW5mZXJyZWQgaW50ZXJmYWNlIHdhcw0KICDi lIIgICBpbnNlcnRpbmcgY29kZSBpbmNvcnJlY3RseSBvbiB0aGUgc2Vjb25kIHN3aXRjaCB0byB0 aGUgbmV3bHkgY3JlYXRlZCAodW5zYXZlZCkNCiAg4pSCICAgYG1saWAgZmlsZS4gSWYgdGhlIG5l dyBgbWxpYCBmaWxlIGlzbid0IGVtcHR5LCB3ZSBkb24ndCBpbnNlcnQgaW5mZXJyZWQNCiAg4pSC ICAgaW50ZXJmYWNlICgjNDk4KQ0KICDilJTilIDilIDilIDilIANCg0KDQpyZWxlYXNlIDAuMy4w IG9mIGRyb20sIHRoZSBPQ2FtbCBwcm9qZWN0IGNyZWF0b3INCuKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qv YW5uLXJlbGVhc2UtMC0zLTAtb2YtZHJvbS10aGUtb2NhbWwtcHJvamVjdC1jcmVhdG9yLzcxNjYv MT4NCg0KDQpGYWJyaWNlIExlIEZlc3NhbnQgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIANCg0KICBXZSBhcmUgcGxlYXNlZCB0byByZWxlYXNlIHZlcnNpb24gMC4zLjAgb2Yg YGRyb20nLCB0aGUgT0NhbWwgcHJvamVjdA0KICBjcmVhdG9yLg0KDQogIGBkcm9tJyBpcyBib3Ju IGZyb20gYSBzaW1wbGUgb2JzZXJ2YXRpb246IGV2ZXJ5IHRpbWUgeW91IGNyZWF0ZSBhIG5ldw0K ICBPQ2FtbCBwcm9qZWN0LCB5b3Ugc3BlbmQgdGltZSBzZWFyY2hpbmcgYW5kIGNvcHktcGFzdGlu ZyBmaWxlcyBmcm9tDQogIG90aGVyIHByb2plY3RzLCBhZGFwdGluZyB0aGVtIHRvIHRoZSBuZXcg b25lLiBgZHJvbScgZG9lcyB0aGF0IGZvcg0KICB5b3U6IGl0IGNvbWVzIHdpdGggYSBzZXQgb2Yg cHJlZGVmaW5lZCBza2VsZXRvbiBwcm9qZWN0cywgdGhhdCB5b3UgY2FuDQogIGVhc2lseSBjb25m aWd1cmUgYW5kIGFkYXB0IHRvIHlvdXIgZ29hbC4NCg0KICBJdCdzIGFzIGVhc3kgYXM6DQogIOKU jOKUgOKUgOKUgOKUgA0KICDilIIgJCBkcm9tIG5ldw0KICDilIIgICAjIGNoZWNrIHRoZSBsaXN0 IG9mIHNrZWxldG9ucw0KICDilIIgJCBkcm9tIG5ldyBQUk9KRUNUX05BTUUgLS1za2VsZXRvbiBT S0VMRVRPTl9OQU1FDQogIOKUgiAkIGNkIFBST0pFQ1RfTkFNRQ0KICDilIIgJCBlbWFjcyBkcm9t LnRvbWwNCiAg4pSCICAgICMgLi4uIGVkaXQgYmFzaWMgZGVzY3JpcHRpb24sIGRlcGVuZGVuY2ll cywgZXRjLiAuLi4NCiAg4pSCICQgZHJvbSBwcm9qZWN0DQogIOKUgiAkIGRyb20gYnVpbGQNCiAg 4pSU4pSA4pSA4pSA4pSADQogIFRoYW5rcyB0byBjb250cmlidXRvcnMgKE1heGltZSBMZXZpbGxh aW4gYW5kIERhdmlkIERlY2xlcmNrKSwgdGhlIGxpc3QNCiAgb2YgcHJvamVjdCBza2VsZXRvbnMg Zm9yIGRyb20gMC4zLjAgaGFzIGdyb3duOg0KICDigKIgT0NhbWwgcHJvamVjdHM6IGxpYnJhcnkg bWVuaGlyIG1pbmlfbGliIG1pbmlfcHJnIHBweF9kZXJpdmVyDQogICAgcHB4X3Jld3JpdGVyIHBy b2dyYW0NCiAg4oCiIEMgQmluZGluZ3M6IGNfYmluZGluZyBjdHlwZXNfZm9yZWlnbiBjdHlwZXNf c3R1YnMNCiAg4oCiIEphdmFzY3JpcHQgcHJvamVjdHM6IGpzX2xpYiBqc19wcmcgdnVlIHdhc21f YmluZGluZw0KDQogIGFuZCB5b3UgY2FuIGVhc2lseSBjb250cmlidXRlIHlvdXIgb3duOiBmb3Ig ZXhhbXBsZSwNCiAgYGdoOlVTRVIvU0tFTEVUT04nIHdpbGwgdHJpZ2dlciB0aGUgZG93bmxvYWQg b2YgdGhlIGBVU0VSL1NLRUxFVE9OJw0KICBwcm9qZWN0IGZyb20gR2l0aHViIGFzIGEgdGVtcGxh dGUgZm9yIHlvdXIgbmV3IHByb2plY3QuDQoNCiAgYGRyb20nIGlzIGF2YWlsYWJsZSBmcm9tIGBv cGFtJzogYG9wYW0gdXBkYXRlICYmIG9wYW0gaW5zdGFsbA0KICBkcm9tLjAuMy4wJw0KDQogIDxo dHRwczovL2dpdGh1Yi5jb20vb2NhbWxwcm8vZHJvbT4NCg0KICBFbmpveSAhDQoNCg0KT2xkIENX Tg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgSWYgeW91IGhhcHBlbiB0byBtaXNzIGEgQ1dO LCB5b3UgY2FuIFtzZW5kIG1lIGEgbWVzc2FnZV0gYW5kIEknbGwgbWFpbA0KICBpdCB0byB5b3Us IG9yIGdvIHRha2UgYSBsb29rIGF0IFt0aGUgYXJjaGl2ZV0gb3IgdGhlIFtSU1MgZmVlZCBvZiB0 aGUNCiAgYXJjaGl2ZXNdLg0KDQogIElmIHlvdSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVy eSB3ZWVrIGJ5IG1haWwsIHlvdSBtYXkgc3Vic2NyaWJlDQogIFtvbmxpbmVdLg0KDQogIFtBbGFu IFNjaG1pdHRdDQoNCg0KW3NlbmQgbWUgYSBtZXNzYWdlXSA8bWFpbHRvOmFsYW4uc2NobWl0dEBw b2x5dGVjaG5pcXVlLm9yZz4NCg0KW3RoZSBhcmNoaXZlXSA8aHR0cDovL2FsYW4ucGV0aXRlcG9t bWUubmV0L2N3bi8+DQoNCltSU1MgZmVlZCBvZiB0aGUgYXJjaGl2ZXNdIDxodHRwOi8vYWxhbi5w ZXRpdGVwb21tZS5uZXQvY3duL2N3bi5yc3M+DQoNCltvbmxpbmVdIDxodHRwOi8vbGlzdHMuaWR5 bGwub3JnL2xpc3RpbmZvL2NhbWwtbmV3cy13ZWVrbHkvPg0KDQpbQWxhbiBTY2htaXR0XSA8aHR0 cDovL2FsYW4ucGV0aXRlcG9tbWUubmV0Lz4NCg0K --=-=-= 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 January 19 to 26, 202= 1.

How to get pleasant documentation for a library using Dune?

gasche announced

I'm working to publish a small library using Dune. The documentation automa= tically generated by dune build @doc looks fairly unpleasant to me, as I don't see an easy way to explain what t= he library is about. I'm creating this topic in case I am missing something simple, and to get other people to sha= re their library-documentation practices or examples.

Problem description

For the sake of the example let's imagine that the library is called = Foo and contains three modules A, B and C. I'm using the standard dune approach of wrapped modules, so= I get three compilation units Foo.A, Foo.B, Foo.C. Each module has a .mli file with documenta= tion comments.

When I run dune build @doc, dune generates an index.html= file with basically no content, pointing to a foo/index.html file with basically no content, pointing to a <= code>foo/Foo/index.html looking like this:

Up =E2=80=93 foo =C2=BB Foo

Module Foo

module A : sig ... end

module B : sig ... end

module C : sig ... end

It's easy to skip the first two pages, and use the third page as a landing = page for the documentation of my library. However, this landing page is not very pleasant:

  1. It should explain what the library is about.
  2. It should briefly describe what each module does, so that users know wh= ich module they want to look at first.

(Point 2 is especially important with "wrapped libraries", where it's not n= ecessarily obvious which of the several modules is the main entry point with the important functions to look at fir= st. In comparison, in a design where the "entry point" is in the Foo module, with Foo.A an= d Foo.B as more advanced submodules (or Foo_A and= Foo_B in the old days) the user is guided to look at Foo first.)

My problem is: what should I change in my Dune setup to be able to do this?

I have read the dune documentation on documentation, but I could not find an answer to this question.

Rough ideas

Roughly I see two ways to get what I want, that I have not tried yet:

  1. I could write my own landing page for the library as a separate d= oc.mld file, use the (documentation) stanza to get it i= ncluded in the built documentation, and use this as the entry point into my= library.
  2. In could write my own foo.ml module instead of using Dune'= s default wrapped-module scaffolding, inserting my own module A =3D F= oo__A aliases, with documentation comments in the standard style. Th= en I suppose that foo/Foo/index.html would get this content in= the way I expect.

They feel a bit complex to me, and (2) involves the tedious work of redoing= the wrapping logic myself. I guess that (1) is not so bad, and I would be inclined to do this if it was documented = somewhere as the recommended approach.

(Maybe there is some odoc option that would help solve this problem?)

Examples from other people?

Do you have a library built using dune with nice documentation? If so, can = you show the documentation and the corresponding sources (in particular dune setup)?

Thibaut Mattio replied

I think the documentation of Streaming is a great example of the option 1 you describe.

The corresponding Dune setup can be found here

That's also the approach we took for Opium's documentation, although the index page is certainly not as impressive as Streaming's.

gasche then said

Thanks! It looks like these systems rely on an undocumented feature of the = (documentation) stanza (or odoc), which is that a user-provided index.mld file will implicitly replace= the automatically-generated index.mld file, giving a reasonably natural result.

The opium documentation also uses the {!modules: modulename ...} markup directive, which is a way to= include the module index within this manually-written landing page without having to duplicate the markup. Strea= ming=C2=B9 uses inline html instead to get a nicer-looking result, but it is too much effort. Maybe there is a better way, or the tool= s could be improved to make this easier.

=C2=B9: I'm ashamed to admit that I wasn't aware of this very nice library Stre= aming, am I consuming the wrong sources of information on the OCaml ecosystem?

Finally, the Opium documentation manifestly has a short synopsis for each m= odule in its listing, which corresponds to my "It should briefly describe what each module does" requirement. I believ= e that this comes from the first line of the first documentation comment of the module. There are module-global docu= mentation comments in the library I'm working on, but they do not include such first-line headers.

Once I have the impression of understanding what is a good way to do this, = I may try to contribute better documentation in dune.

Gabriel Radanne replied

It looks like these systems rely on an undocumented feature of the (d= ocumentation) stanza (or odoc), which is that a user-provided index.mld file will implicitly replace the aut= omatically-generated index.mld file, giving a reasonably natural result.

I confirm this feature is here to stay, is the right one to customize your = index page, and in the future will benefit from good support from odoc directly.

The opium documentation also uses the {!modules: modulename ...} markup directive, which is a way to= include the module index within this manually-written landing page without having to duplicate the markup. Strea= ming=C2=B9 uses inline html instead to get a nicer-looking result, but it is too much effort. Maybe there is a better way, or the tool= s could be improved to make this easier.

I would strongly advise to use the modules markup directive, a= nd to suggests output improvements on odoc's bug instead of hacking HTML together. We could absolutely add the synopsis of t= he module here, for instance.

Daniel B=C3=BCnzli then said

which is that a user-provided index.mld file will implicitly r= eplace the automatically-generated index.mld file, giving a reasonably natural result.

This is also the correct way to customize the landing page of your package = for odig generated doc sets, see here for more information.

I confirm this feature is here to stay, is the right one to customize your = index page, and in the future will benefit from good support from odoc directly.

There's an open issue about that here.

Alt-Ergo 2.4.0 release

OCamlPro announced

We are pleased to announce a new release of Alt-Ergo!

Alt-Ergo 2.4.0 is now available from Alt-Ergo=E2=80=99s website. An associated opam package will be published in the next few days.

This release contains some major novelties:

  • Alt-Ergo supports incremental commands (push/pop) from the smt-lib standard.
  • We switched command line parsing to use cmdliner. You will need to use –<option n= ame> instead of -<option name>. Some options have also been rename= d, see the manpage or the documentation.
  • We improved the online documentation of your solver, available here.

This release also contains some minor novelties:

  • .mlw and .why extension are depreciated, the use of .ae extension is ad= vised.
  • Add –input (resp –output) option to manually set the inpu= t (resp output) file format
  • Add –pretty-output option to add better debug formatting and to = add colors
  • Add exponentiation operation, ** in native Alt-Ergo syntax. The operato= r is fully interpreted when applied to constants
  • Fix –steps-count and improve the way steps are counted (AdaCore = contribution)
  • Add –instantiation-heuristic option that can enable lighter or h= eavier instantiation
  • Reduce the instantiation context (considered foralls / exists) in CDCL-= Tableaux to better mimic the Tableaux-like SAT solver
  • Multiple bugfixes

The full list of changes is available here. As usual, do not hesitate to report bugs, to ask questions, or to give your feedback!

First release of Art - Adaptive Radix Tree in OCaml

Calascibetta Romain announced

I'm glad to announce the first release of art, an implementation of the Adaptive Radix Tree in OCaml. The goal of this library is to provide a = data-structure such as Map.S (and keep the order) with performances of Hashtbl.t.

Performances

art uses Becham= el as a tool for micro-benchmarking and it compares performances about insertion= and lookup= . As you can see, about insertion, art is definitely more fast than Hashtbl.t.

For the lookup operation, we are slightly = more fast than the Hashtbl.t. The main advantage comparing to Hashtbl.t is the ability to use maximum~/~minimum= or to iter over the whole data-structure with a certain order.

On details, benchmarks use a normal distribution of strings ab= out their lengths. As a practical example where art will be better than Hashtbl.t is when you want to index several words (such as email addresses).

Tests

Of course, the library provide a fuzzer and tests have a coverage of: 91.93 %

Read Optimized Write Exclusion - ROWEX

Even if it's not a part of the package, the distribution comes with lock-free implementation of art: rowex. This implementation comes from a research paper about data-structure and atomic operatio= ns.

ROWEX provides a persistent implementation= which manipulates a file to store the whole data-structure. The goal is to provide an indexer free to be manipulat= ed by several processes in parallel.

Currently, the implementation of ROWEX in OCaml is not well-tested and it i= s no distributed. It does not take the advantage of ocaml-multicore (but it should) but outcomes are good and the developm= ent will be more focus on this part.

So feel free to play with it a bit :+1:.

perf demangling of OCaml symbols (and a short introduction to = perf)

Fabian announced

As a project sponsored by the OCaml softw= are foundation, I've worked on demangling OCaml symbols in per= f. Some screenshots are below. The work is currently being upstreamed. In the meantime, it can be used as follows:

git clone --depth=3D1 https://github.com/copy/=
linux.git
# or=
:
# wg=
et https://github.com/copy/linux/archive/master.tar.gz && tar xfv m=
aster.tar.gz
cd linux/tools/perf
make
alias PWD/perf
# or=
 copy perf to somewhere in your PATH

Your distribution's version of perf will also work for the examples below, = but will have less readable symbols :-)

Short intruction to perf

Perf is a Linux-only sampling profiler (and more), which can be used to ana= lyse the performance profile of OCaml and other executables. When compiling with ocamlopt, add -g to inc= lude debug information in the executable. dune does this automatically, even in the release profile. To start a program and rec= ord its profile:

perf record --call-graph dwarf program.exe

Or record a running program:

perf record --call-graph dwarf -p `pidof program.exe`

Then, view a profile using:

perf report # top-down
perf report --no-children # bottom-up

Within the report view, the following keybindings are useful:

  • +: open/close one callchain level
  • e: open/close entire callchain
  • t: Toggle beween current thread and all threads (e.g., onl= y dune, ocamlopt, etc.)

Or generate a flamegraph:

git clone https://github.com/brendangregg/Flam=
eGraph
cd FlameGraph
perf script -i path/to/perf.data | ./stackcollapse-perf.pl | ./flamegraph.p=
l > perf-flamegraph.svg

You may need to run the following command to allow recording by non-root us= ers (more infos):

echo 0 | sudo tee /proc/sys/kernel/perf_event_paranoid

Decimal 0.2.1 - arbitrary-precision decimal floating point

Yawar Amin announced

Happy to announce that decimal 0.2.1 has been pubished on opam.

decimal is a port of Python's decimal module to OCaml and implements the Gen= eral Decimal Arithmetic Specification. However note that it is a port in progress–basic arithmetic and rounding function= s have been ported, but I am still working on powers and logs. The ported functions pass the same unit test suite that th= e Python version does (with some minor modifications).

Another caveat: currently the library is only supported on 64-bit architect= ures due to (exponent) overflow issues on 32-bit. If anyone is willing to test and fix overflows on 32-bit, I am more= than happy to accept PRs.

Here's an example of using the module:

(* Rosetta Code Currency Example *)

(* D=
emo purposes, normally you'd prefix module name or local open *)
open Decimal

let hamburger_qty =3D of_string "4_000_000_000_000_000"
let hamburger_amt =3D of_string "5.50"
let milkshake_qty =3D of_int 2
let milkshake_amt =3D of_string "2.86"

(* S=
hortcut to divide 7.65 by 100 *)
let tax_rate =3D of_string "7.65e-2"

let subtotal =3D hamburger_qty * hamburger_amt + mi=
lkshake_qty * milkshake_amt
let tax =3D round ~=
n:2 (subtotal * tax_rate)
let total =3D subtotal + tax

let () =3D Format.printf "Subtotal: %a
     Tax:  %a
   Total: %a\n" pp subtotal pp tax p=
p total

You can get the package with: opam install decimal. Minimum OC= aml version 4.08.

Basic GitLab CI configuration

gasche announced

After a long ci-golfing adventure (83 tests), I got a .gitlab-ci.yml<= /code> file that I think is reusable and useful for small projects / libraries:

Features:

  • It is project-agnostic, so it should work unchanged for your own (simpl= e) projects.
  • It caches the opam dependencies.
  • It builds the project, runs the tests and builds the documentation.
  • Several compiler versions can be tested in parallel.
  • It provides an easy way to upload the documentation as "Gitlab project = Pages".

CI times are satisfying: on very small libraries I observe a 11mn job time = on the first run (or when cleaning the opam cache), and 2mn job time on following runs.

The expected usage-mode of this CI configuration is that you copy it in you= r own project. If you find that you need/want additional features, ideally you would try to write them in a pro= ject-agonistic way and contribute them back to the example repository.

This configuration does not use @smondet's trick of generating a docker ima= ge on the fly. I think this would be an excellent idea to get more reliable caching, but it is too complex for me a= nd I don't see how to do it in a maintainable and project-agnostic way.

Current status

I wrote this CI configuration over the week-end, and have not used it much.= I expect it to keep evolving somewhat before it stabilizes. Feedback from other people trying to use the configur= ation would be warmly welcome.

Aside on _build caching

I also implemented caching of dune's _build data, inspired by = the data-encoding example of @raphael-proust. I don't need it for my small projects (dune build is 3s, c= ompared to 1m setting up the Docker image), but I thought it would make the CI configuration scale better to la= rger projects.

When I tested this CI configuration, I discovered that caching the dune _build data does not work as well as I had expected. (Tracking issue: dune#4150).

I can tell because I am asking dune to tell me about what it is rebuilding = (dune build --display short). I suspect that projects that cache the _build data without loggin= g what dune (re)builds are also not caching as much as they think they are.

(But then maybe the use of a fixed-compiler OPAM image, as data-encoding is= using, solves the issue.)

official CI template?

I considered submitting this CI configuration as an "OCaml Gitlab CI templa= te" to go with the official list of "blessed" CI templates in the documentation. But reading the Development guide for Gitlab CI/CD templates convinced me that my CI configuration is nowhere ready to serve this role.

Gitlab developers apparently expect that users will be able to "include" th= ose CI templates by pointing to their URL, and then tune it for their own use-case (without modifying it) by performin= g some (unreasonable?) inheritance tricks using whatever those configurations offers as abstraction/inheritance/exten= sion/overriding mechanism. Let's just say that this is next-level CI configuration writing, and that my script is not= ready for this.

OCaml Office Hours?

Deep in this thread, UnixJunkie said

In addition to mailing lists and discuss, there is also an IRC channel wher= e people can interact with some ocaml experts in a more "interactive" manner (//irc.freenode.net/#ocaml)

json-data-encoding 0.9

Rapha=C3=ABl Proust announced

On behalf of Nomadic Labs, I'm ha= ppy to announce the release of json-data-encoding version 0.9.

The code is hosted on Gitlab: https://gitlab.com/nomadic-labs/json-data-encoding It is distributed under GNU LGPL with linking exception. The documentation is available online: https://nomadic-labs.gitlab.io/json-data-encodin= g/ The package is available under opam: opam install json-data-encoding<= /code>

json-data-encoding is a library to define encoder/decoder values to transla= te OCaml values to JSON and back. It also generates JSON schemas so you can document the value representation. It can= use either Ezjsonm or Yojson as backends.

The version 0.9 has the following new features:

  • more tests
  • memoisation of fixpoint encoding to avoid repeated computations
  • support for format field for string schemas (see https://json-schema.org/understanding-json-schema/reference/string= .html#format) (contributed by @levillain.maxime)
  • fixed integer bound printing in schemas (bug report by @pw374)
  • support for json-lexeme streaming (see details below)
  • support for inclusion/exclusion of default-value fields during serialis= ation (contributed by @levillain.maxime)
  • improved union-of-object schemas (contributed by @levillain.maxime)

One major difference with the previous release is the inclusion of a lexeme= -streaming JSON constructor. Specifically, the function

val construct_seq : 't e=
ncoding -> 't -> jsonm_lexeme Stdlib.=
Seq.t

generates a sequence of Jsonm.lexeme (the . This sequence is l= azy (in the sense of Stdlib.Seq not of Stdlib.Lazy) and it paves the way to a similar feature in data-encoding. An interesting feature of sequences is that they can be used in Vanilla OCaml settings as well as Lwt/Async settin= gs where they allow user-driven yielding in between elements.

VSCode OCaml Platform v1.6.0

Rudi Grinberg announced

On behalf of the vscode-ocaml-platform team, I'm pleased to announce 1.6.0.= This release contains a new activity tab for managing opam switches developed by @tmattio. We hope you find it usefu= l.

Change log:

- Highlight token aliases in Menhir associativity=
 declarations (#473)

- Activate the extension when workspace contains OCaml, Reason sources or
  project marker files. (#482)

- Add `ocaml.useOcamlEnv` setting to determine whether to use `ocaml-env` f=
or
  opam commands from OCaml for Windows (#481)

- Fix terminal creation when using default shell and arguments (#484)

- Add an OCaml activity tab.

  The activity tab provides three views: the available switches, the build
  commands and an Help and Feedback section with links to community channel=
s.

- Support `eliom` and `eliomi` file extensions (#487)

- Fix ocaml/ocaml-lsp#358: automatic insertion of an inferred interface was
  inserting code incorrectly on the second switch to the newly created (uns=
aved)
  `mli` file. If the new `mli` file isn't empty, we don't insert inferred
  interface (#498)

release 0.3.0 of drom, the OCaml project creator

Fabrice Le Fessant announced

We are pleased to release version 0.3.0 of drom, the OCaml pro= ject creator.

drom is born from a simple observation: every time you create = a new OCaml project, you spend time searching and copy-pasting files from other projects, adapting them to the new one. drom does that for you: it comes with a set of predefined skeleton projects, that you can easily configure and adapt to= your goal.

It's as easy as:

$ drom new
  # check the list of skeletons
$ drom new PROJECT_NAME --skeleton SKELETON_NAME
$ cd PROJECT_NAME
$ emacs drom.toml
   # ... edit basic description, dependencies, etc. ...
$ drom project
$ drom build

Thanks to contributors (Maxime Levillain and David Declerck), the list of p= roject skeletons for drom 0.3.0 has grown:

  • OCaml projects: library menhir mini_lib mini_prg ppx_deriver ppx_rewrit= er program
  • C Bindings: c_binding ctypes_foreign ctypes_stubs
  • Javascript projects: js_lib js_prg vue wasm_binding

and you can easily contribute your own: for example, gh:USER/SKELETON= will trigger the download of the USER/SKELETON project from Github as a template for your new p= roject.

drom is available from opam: opam update &a= mp;& opam install drom.0.3.0

https://github.com/ocamlpro/dr= om

Enjoy !

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.

--=-=-=--