From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=Svv6jQ05; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by plum.tunbury.org (Postfix) with ESMTP id 1EBBB4009D for ; Tue, 3 Mar 2026 13:55:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=6cn3bwSqZHlN69gkX6tMqgMeHJR6ZjlBzaWj81fPT+k=; b=Svv6jQ05iMfaCTRJZiTmbWqAkkUz7W2/0OvZNIPpL3zZo/09XdNrGooF akSUtUXsY3bjvPWIgwudhYhO3e8x0o5Cu3My3CjN+WbkOEiPIITUD7uc4 PW24buxXZBJ5CE5b2f+kAwHzs/8R+y3iaVaGQJL7z91DKT4Ujub78dX7B w=; X-CSE-ConnectionGUID: rnRkQbb/T4Kv2RrbgFTRxw== X-CSE-MsgGUID: S7lXBaK9Q5SKPA1CthAlRA== Authentication-Results: mail2-relais-roc.national.inria.fr; dkim=none (message not signed) header.i=none; spf=SoftFail smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@prod-sympa-app.inria.fr Received-SPF: SoftFail (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr is inclined to not designate 128.93.162.27 as permitted sender) identity=mailfrom; client-ip=128.93.162.27; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@prod-sympa-app.inria.fr) identity=helo; client-ip=128.93.162.27; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@prod-sympa-app.inria.fr"; x-conformance=spf_only X-IronPort-AV: E=Sophos;i="6.21,322,1763420400"; d="scan'208,217";a="266028220" Received: from prod-sympa-app.inria.fr ([128.93.162.27]) by mail2-relais-roc.national.inria.fr with ESMTP; 03 Mar 2026 14:54:57 +0100 Received: by prod-sympa-app.inria.fr (Postfix, from userid 990) id CCB738292C; Tue, 3 Mar 2026 14:54:56 +0100 (CET) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by prod-sympa-app.inria.fr (Postfix) with ESMTP id 7CB848292A for ; Tue, 3 Mar 2026 14:54:43 +0100 (CET) X-CSE-ConnectionGUID: pD3FL3xWTwSmun6III3KWw== X-CSE-MsgGUID: ze0SEhFgS5+AmLLAx0Em9w== X-IronPort-AV: E=Sophos;i="6.21,322,1763420400"; d="scan'208,217";a="140290974" Received: from mac-03220211.irisa.fr ([131.254.21.249]) by mail3-relais-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 Mar 2026 14:54:43 +0100 From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 03 Mar 2026 14:54:42 +0100 Message-ID: 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: 19466 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 ZWsgb2YgRmVicnVhcnkgMjQgdG8NCk1hcmNoIDAzLCAyMDI2Lg0KDQpUYWJsZSBvZiBDb250ZW50 cw0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoN Ckx3dC42LjEuMCwgTHd0X3BweC42LjEuMA0KT0NhbWwgUGxhdGZvcm0gTmV3c2xldHRlcjogTm92 ZW1iZXIgMjAyNSB0byBKYW51YXJ5IDIwMjYNCkFubm91bmNpbmcgdGhlIGZpcnN0IHJlbGVhc2Ug b2YgQWxpY2UsIGEgcmFkaWNhbCBPQ2FtbCBidWlsZCBzeXN0ZW0NCm1uZXQsIGEgbmV3IFRDUC9J UCBzdGFjayBmb3IgdW5pa2VybmVscyBpbiBPQ2FtbA0KRXhwZXJpbWVudDogZm9ybWF0LWxpbmUN CkNhbWwgaW4gdGhlIENhcGl0YWwgLSBSZWdpc3RyYXRpb25zIE9wZW4hDQpFeHBlcmltZW50YWwg dG9vbHMgZm9yIG1pZ3JhdGluZyBmcm9tIEx3dCB0byBFaW8NCkZpcnN0IGFscGhhIHJlbGVhc2Ug b2YgT0NhbWwgNS41LjANCk5vdElucmlhQ2FtbF9TdGQuV2VudkAwLjEuMCAtIGNyZWF0ZSBXaW5k b3dzIGVudnMgb24gbWFjT1MgW2RrMF0NClJ1bm5pbmcgUmVhbCBEb2NrZXIgQ29udGFpbmVycyBp biBPQ2FtbCBUZXN0cw0KSSB3cm90ZSBhIERTTCBmb3IgQUkgcGVyc29uYWxpdGllcyBpbiBPQ2Ft bA0KT3V0cmVhY2h5IE1heSAyMDI2DQpPbGQgQ1dODQoNCg0KTHd0LjYuMS4wLCBMd3RfcHB4LjYu MS4wDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9j YW1sLm9yZy90L2Fubi1sd3QtNi0xLTAtbHd0LXBweC02LTEtMC8xNzc3MC8yPg0KDQoNCkNvbnRp bnVpbmcgdGhpcyB0aHJlYWQsIFJhcGhhw6tsIFByb3VzdCBhbm5vdW5jZWQNCuKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEx3dC42LjEuMSBoYXMgYmVlbiByZWxlYXNlZC4gSXQg Y29udGFpbnMgYSBmaXggdG8gc3VwcG9ydCBidWlsZCB3aXRoDQogIE9DYW1sLjUuNS4gVGhhbmtz IHRvIEBraXQtdHkta2F0ZSBmb3IgdGhlIGNvbnRyaWJ1dGlvbi4NCg0KDQpPQ2FtbCBQbGF0Zm9y bSBOZXdzbGV0dGVyOiBOb3ZlbWJlciAyMDI1IHRvIEphbnVhcnkgMjAyNg0K4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToN CiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9vY2FtbC1wbGF0Zm9ybS1uZXdzbGV0dGVy LW5vdmVtYmVyLTIwMjUtdG8tamFudWFyeS0yMDI2LzE3ODQ1LzE+DQoNCg0KU2FiaW5lIFNjaG1h bHR6IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgV2VsY29tZSB0byB0aGUgc2V2 ZW50ZWVudGggZWRpdGlvbiBvZiB0aGUgT0NhbWwgUGxhdGZvcm0gbmV3c2xldHRlciENCg0KICBJ biB0aGlzIE5vdmVtYmVyIDIwMjUgdG8gSmFudWFyeSAyMDI2IGVkaXRpb24sIHdlIGFyZSBleGNp dGVkIHRvIGJyaW5nDQogIHlvdSB0aGUgbGF0ZXN0IG9uIHRoZSBPQ2FtbCBQbGF0Zm9ybSwgY29u dGludWluZyBvdXIgdHJhZGl0aW9uIG9mDQogIGhpZ2hsaWdodGluZyByZWNlbnQgZGV2ZWxvcG1l bnRzIGFzIHNlZW4gaW4gW3ByZXZpb3VzIGVkaXRpb25zXS4gVG8NCiAgdW5kZXJzdGFuZCB0aGUg ZGlyZWN0aW9uIHdlJ3JlIGhlYWRlZCwgZXNwZWNpYWxseSByZWdhcmRpbmcNCiAgZGV2ZWxvcG1l bnQgd29ya2Zsb3dzIGFuZCB1c2VyIGV4cGVyaWVuY2UgaW1wcm92ZW1lbnRzLCBjaGVjayBvdXQg b3VyDQogIFtyb2FkbWFwXS4NCg0KICBZb3UgY2FuIFtzdWJzY3JpYmUgdG8gdGhpcyBuZXdzbGV0 dGVyIG9uIExpbmtlZEluXSENCg0KICAqSGlnaGxpZ2h0czoqDQoNCiAg4oCiICpvcGFtIDIuNS4w IFJlbGVhc2VkKjogTWFqb3IgcmVsZWFzZSBmZWF0dXJpbmcgaW5jcmVtZW50YWwgb3BhbSBmaWxl DQogICAgIGxvYWRpbmcgZm9yIHVwIHRvIDcwJSBmYXN0ZXIgYG9wYW0gdXBkYXRlJywgaW1wcm92 ZWQgc2hlbGwNCiAgICAgaW50ZWdyYXRpb24sIGFuZCBiZXR0ZXIgbWFjT1Mgc2FuZGJveCBzdXBw b3J0DQogIOKAoiAqUmVsb2NhdGFibGUgT0NhbWwgTWVyZ2VkKjogVGhlIGZpbmFsIHBpZWNlIG9m IHRoZSByZWxvY2F0YWJsZSBPQ2FtbA0KICAgICBwdXp6bGUgd2FzIG1lcmdlZCBpbiBEZWNlbWJl ciwgZW5hYmxpbmcgb3BhbSB0byBjbG9uZSBzd2l0Y2hlcw0KICAgICBpbnN0ZWFkIG9mIHJlY29t cGlsaW5nIHRoZW0uIFRoaXMgd2lsbCBiZSBhdmFpbGFibGUgaW4gdGhlIGZpcnN0DQogICAgIGFs cGhhIHJlbGVhc2Ugb2YgT0NhbWwgNS41DQogIOKAoiAqRHVuZSAzLjIxLjAqOiBMYXJnZSByZWxl YXNlIHdpdGggZG96ZW5zIG9mIGZpeGVzLCBpbXByb3ZlbWVudHMsIGFuZA0KICAgICBuZXcgZmVh dHVyZXMgaW5jbHVkaW5nIE94Q2FtbCBjb21waWxlciBzdXBwb3J0IGFuZCBjb3B5LW9uLXdyaXRl DQogICAgIGZpbGUgb3BlcmF0aW9ucw0KICDigKIgKkVuaGFuY2VkIEVkaXRvciBTdXBwb3J0Kjog T0NhbWwtTFNQIDEuMjUuMCBhZGRzIGAubWx4JyBmaWxlIHN1cHBvcnQNCiAgICAgd2l0aCBmb3Jt YXR0aW5nLCBkaWFnbm9zdGljcywgYW5kIGNvZGUgYWN0aW9ucywgcGx1cyBuZXcgY3VzdG9tDQog ICAgIHJlcXVlc3RzDQogIOKAoiAqTWVybGluIDUuNi4xLTUwNCo6IFBlcmZvcm1hbmNlIG9wdGlt aXphdGlvbnMsIHNtYXJ0ZXIgc2lnbmF0dXJlDQogICAgIGhlbHAsIGFuZCBmaXhlZCBjb21wbGV0 aW9uIGZvciBpbmxpbmVkIHJlY29yZCBsYWJlbHMNCiAg4oCiICpvcGFtLXB1Ymxpc2ggMi43LjEq OiBGaXhlcyBmb3IgR2l0SHViIEFQSSB0b2tlbiBwZXJtaXNzaW9ucw0KICDigKIgKmR1bmUtcmVs ZWFzZSAyLjIuMCo6IEZ1bGwgY29tcGF0aWJpbGl0eSB3aXRoIGNtZGxpbmVyIDIuMC4wDQogIOKA oiAqb3BhbS1yZXBvc2l0b3J5IEFyY2hpdmFsKjogSmFudWFyeSAxLCAyMDI2IGFyY2hpdmFsIHJ1 biByZW1vdmVkDQogICAgIDMsMjY0IHBhY2thZ2UgdmVyc2lvbnMgdG8gbWFpbnRhaW4gcmVwb3Np dG9yeSBzdXN0YWluYWJpbGl0eQ0KDQogICpCYWNrc3RhZ2UgT0NhbWw6Kg0KDQogIOKAoiBbT0Nh bWwgSW5mcmFzdHJ1Y3R1cmU6IEhvdyB0aGUgb3BhbS1yZXBvc2l0b3J5IFdvcmtzXSAoTm92IDUs IDIwMjUpDQoNCiAgKlN0YWJsZSBSZWxlYXNlczoqDQoNCiAg4oCiIFtvcGFtLXB1Ymxpc2ggMi43 LjFdIChOb3YgMTgsIDIwMjUpDQogIOKAoiBbb3BhbSAyLjUuMF0gKE5vdiAyNywgMjAyNSkNCiAg 4oCiIFtNZXJsaW4gNS42LjEtNTA0XSAoRGVjIDIwLCAyMDI1KQ0KICDigKIgW09DYW1sLUxTUCAx LjI1LjBdIChEZWMgMjAsIDIwMjUpDQogIOKAoiBbRHVuZSAzLjIxLjBdIChKYW4gMTYsIDIwMjYp DQogIOKAoiBbZHVuZS1yZWxlYXNlIDIuMi4wXSAoSmFuIDI5LCAyMDI2KQ0KDQogICpVbnN0YWJs ZSBSZWxlYXNlczoqDQoNCiAg4oCiIFtvcGFtIDIuNS4wfnJjMV0gKE5vdiAyMCwgMjAyNSkNCiAg 4oCiIFtvcGFtIDIuNS4wfmJldGExXSAoTm92IDEwLCAyMDI1KQ0KDQoNCltwcmV2aW91cyBlZGl0 aW9uc10gPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdGFnL3BsYXRmb3JtLW5ld3NsZXR0ZXI+ DQoNCltyb2FkbWFwXSA8aHR0cHM6Ly9vY2FtbC5vcmcvZG9jcy9wbGF0Zm9ybS1yb2FkbWFwPg0K DQpbc3Vic2NyaWJlIHRvIHRoaXMgbmV3c2xldHRlciBvbiBMaW5rZWRJbl0NCjxodHRwczovL3d3 dy5saW5rZWRpbi5jb20vbmV3c2xldHRlcnMvb2NhbWwtcGxhdGZvcm0tbmV3c2xldHRlci03MzA1 MjcwNjk0NTY3NjYxNTY4Lz4NCg0KW09DYW1sIEluZnJhc3RydWN0dXJlOiBIb3cgdGhlIG9wYW0t cmVwb3NpdG9yeSBXb3Jrc10NCjxodHRwczovL29jYW1sLm9yZy9iYWNrc3RhZ2UvMjAyNS0xMS0w NS1ob3ctdGhlLW9wYW0tcmVwb3NpdG9yeS13b3Jrcz4NCg0KW29wYW0tcHVibGlzaCAyLjcuMV0N CjxodHRwczovL29jYW1sLm9yZy9jaGFuZ2Vsb2cvMjAyNS0xMS0xOC1vcGFtLXB1Ymxpc2gtMi43 LjE+DQoNCltvcGFtIDIuNS4wXSA8aHR0cHM6Ly9vY2FtbC5vcmcvY2hhbmdlbG9nLzIwMjUtMTEt Mjctb3BhbS0yLjUuMD4NCg0KW01lcmxpbiA1LjYuMS01MDRdDQo8aHR0cHM6Ly9vY2FtbC5vcmcv Y2hhbmdlbG9nLzIwMjUtMTItMjAtbWVybGluLXY1LTYtMS01MDQ+DQoNCltPQ2FtbC1MU1AgMS4y NS4wXQ0KPGh0dHBzOi8vb2NhbWwub3JnL2NoYW5nZWxvZy8yMDI1LTEyLTIwLW9jYW1sLWxzcC0x LTI1LTA+DQoNCltEdW5lIDMuMjEuMF0gPGh0dHBzOi8vb2NhbWwub3JnL2NoYW5nZWxvZy8yMDI2 LTAxLTE2LWR1bmUtMy0yMS0wPg0KDQpbZHVuZS1yZWxlYXNlIDIuMi4wXQ0KPGh0dHBzOi8vb2Nh bWwub3JnL2NoYW5nZWxvZy9kdW5lLXJlbGVhc2UvMjAyNi0wMS0yOS1kdW5lLXJlbGVhc2UtMi4y LjA+DQoNCltvcGFtIDIuNS4wfnJjMV0gPGh0dHBzOi8vb2NhbWwub3JnL2NoYW5nZWxvZy8yMDI1 LTExLTIwLW9wYW0tMi01LTAtcmMxPg0KDQpbb3BhbSAyLjUuMH5iZXRhMV0NCjxodHRwczovL29j YW1sLm9yZy9jaGFuZ2Vsb2cvMjAyNS0xMS0xMC1vcGFtLTItNS0wLWJldGExPg0KDQpPQ2FtbCBD b21waWxlcg0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCuKX iiBSZWxvY2F0YWJsZSBPQ2FtbCBNZXJnZWQNCg0KICBJbiBEZWNlbWJlciAyMDI1LCB0aGUgZmlu YWwgcGllY2Ugb2YgdGhlIFtSZWxvY2F0YWJsZSBPQ2FtbF0gcHV6emxlDQogIHdhcyBtZXJnZWQs IGVuYWJsaW5nIG9wYW0gdG8gY2xvbmUgc3dpdGNoZXMgaW5zdGVhZCBvZiByZWNvbXBpbGluZw0K ICB0aGVtLiBUaGlzIGZlYXR1cmUgd2lsbCBiZSBhdmFpbGFibGUgaW4gdGhlIGZpcnN0IGFscGhh IHJlbGVhc2Ugb2YNCiAgT0NhbWwgNS41Lg0KDQogICpXaGF0IFJlbG9jYXRhYmxlIE9DYW1sIEVu YWJsZXM6Kg0KDQogIFRoaXMgZmVhdHVyZSBhbGxvd3MgdGhlIE9DYW1sIGNvbXBpbGVyIGFuZCBp dHMgYXNzb2NpYXRlZCB0b29scyB0byBiZQ0KICBtb3ZlZCB0byBkaWZmZXJlbnQgZmlsZXN5c3Rl bSBsb2NhdGlvbnMgYWZ0ZXIgaW5zdGFsbGF0aW9uIHdpdGhvdXQNCiAgYnJlYWtpbmcgZnVuY3Rp b25hbGl0eS4gS2V5IGJlbmVmaXRzIGluY2x1ZGU6DQoNCiAg4oCiIEJpbmFyeSBkaXN0cmlidXRp b25zIHRoYXQgd29yayByZWdhcmRsZXNzIG9mIGluc3RhbGxhdGlvbiBwYXRoDQogIOKAoiBJbXBy b3ZlZCBmbGV4aWJpbGl0eSBmb3IgcGFja2FnZSBtYW5hZ2VycyBvcmdhbml6aW5nIE9DYW1sDQog ICAgaW5zdGFsbGF0aW9ucw0KICDigKIgQnVuZGxpbmcgb2Ygc3BlY2lmaWMgT0NhbWwgdmVyc2lv bnMgYnkgZGV2ZWxvcGVyIHRvb2xzIHdpdGhvdXQgcGF0aA0KICAgIGNvbmZsaWN0cw0KICDigKIg U2ltcGxpZmllZCBjcm9zcy1wbGF0Zm9ybSBkaXN0cmlidXRpb24NCg0KICBUaGUgaW1wbGVtZW50 YXRpb24gaXMgdGhlIGN1bG1pbmF0aW9uIG9mIHdvcmsgYnkgRGF2aWQgQWxsc29wcCwgd2l0aA0K ICByZXZpZXcgZnJvbSBTYW11ZWwgSHltLCBKb25haCBCZWNrZm9yZCwgYW5kIG90aGVycy4gU2Vl IHRoZQ0KICBbYW5ub3VuY2VtZW50IG9uIERpc2N1c3NdIGFuZCB0aGUgW21lcmdlZCBQUnNdIChb IzE0MjQ0XSwgWyMxNDI0NV0sDQogIFsjMTQyNDZdLCBbIzE0MjQ3XSkgZm9yIHRlY2huaWNhbCBk ZXRhaWxzLg0KDQoNCiAgW1JlbG9jYXRhYmxlIE9DYW1sXQ0KICA8aHR0cHM6Ly93d3cuZHJhMjcu dWsvYmxvZy9wbGF0Zm9ybS8yMDI1LzEyLzE3L2l0cy1tZXJnZWQuaHRtbD4NCg0KICBbYW5ub3Vu Y2VtZW50IG9uIERpc2N1c3NdDQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvcmVsb2Nh dGFibGUtb2NhbWwvMTcyNTM+DQoNCiAgW21lcmdlZCBQUnNdIDxodHRwczovL2dpdGh1Yi5jb20v b2NhbWwvb2NhbWwvcHVsbC8xNDI0Mz4NCg0KICBbIzE0MjQ0XSA8aHR0cHM6Ly9naXRodWIuY29t L29jYW1sL29jYW1sL3B1bGwvMTQyNDQ+DQoNCiAgWyMxNDI0NV0gPGh0dHBzOi8vZ2l0aHViLmNv bS9vY2FtbC9vY2FtbC9wdWxsLzE0MjQ1Pg0KDQogIFsjMTQyNDZdIDxodHRwczovL2dpdGh1Yi5j b20vb2NhbWwvb2NhbWwvcHVsbC8xNDI0Nj4NCg0KICBbIzE0MjQ3XSA8aHR0cHM6Ly9naXRodWIu Y29tL29jYW1sL29jYW1sL3B1bGwvMTQyNDc+DQoNCg0KQnVpbGQgU3lzdGVtDQrilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0K4peKIER1bmUNCg0KICBbRHVuZSAzLjIxLjBd IChKYW51YXJ5IDE2LCAyMDI2KSBpcyBhIGxhcmdlIHJlbGVhc2UgaW5jbHVkaW5nIGRvemVucw0K ICBvZiBmaXhlcywgaW1wcm92ZW1lbnRzLCBhbmQgYWRkaXRpb25zIGZyb20gbWFueSBjb250cmli dXRvcnMuDQoNCiAgKk5vdGFibGUgQWRkaXRpb25zOioNCg0KICDigKIgKEV4cGVyaW1lbnRhbCk6 IGBsaWJyYXJ5X3BhcmFtZXRlcicgc3RhbnphIGZvciB0aGUgT3hDYW1sIGNvbXBpbGVyDQogIOKA oiBDb3B5LW9uLXdyaXRlIChDT1cpIHdoZW4gY29weWluZyBmaWxlcyBvbiBzdXBwb3J0aW5nIGZp bGVzeXN0ZW1zDQogICAgKEJ0cmZzLCBaRlMsIFhGUykgdW5kZXIgTGludXgNCiAg4oCiIFN1cHBv cnQgZm9yIFRhbmdsZWQgQVRwcm90by1iYXNlZCBjb2RlIHJlcG9zaXRvcmllcw0KICDigKIgTmV3 IGAoZGlyIC4uKScgZmllbGQgb24gcGFja2FnZXMgdG8gZmlsdGVyIHN0YW56YXMgd2l0aA0KICAg IGAtLW9ubHktcGFja2FnZXMnDQogIOKAoiBgZHVuZSBwcm9tb3Rpb24gc2hvdycgY29tbWFuZCB0 byBwcmV2aWV3IGNvcnJlY3RlZCBmaWxlcw0KICDigKIgTmV3IGAobGFuZyByb2NxKScgYnVpbGQg bW9kZSBmb3IgUm9jcSA5LjAgYW5kIGxhdGVyDQogIOKAoiBTdXBwb3J0IGZvciBpbnN0YW50aWF0 aW5nIE94Q2FtbCBwYXJhbWV0ZXJpc2VkIGxpYnJhcmllcw0KICDigKIgYGR1bmUgZGVzY3JpYmUg dGVzdHMnIHRvIGxpc3QgdGVzdHMgaW4gdGhlIHdvcmtzcGFjZQ0KICDigKIgSG9yaXpvbnRhbCBz Y3JvbGxpbmcgaW4gVFVJDQogIOKAoiBTdXBwb3J0IGZvciBleHBhbmRpbmcgdmFyaWFibGVzIGlu IGAocHJvbW90ZSAoaW50byAuLikpJw0KDQogICpOb3RhYmxlIEZpeGVzOioNCg0KICDigKIgRml4 ZWQgYGluY2x1ZGVfc3ViZGlycyBxdWFsaWZpZWQnIHBpY2tpbmcgdGhlIGZ1cnRoZXN0IG1vZHVs ZQ0KICAgIGluc3RlYWQgb2YgdGhlIGNsb3Nlc3QNCiAg4oCiIEltcHJvdmVkIGVycm9yIG1lc3Nh Z2VzIGZvciBpbnZhbGlkIHZlcnNpb24gZm9ybWF0cyB3aXRoIG5vbi1BU0NJSQ0KICAgIGNoYXJh Y3RlcnMNCiAg4oCiIEZpeGVkIGNyYXNoIHdoZW4gcnVubmluZyBgZHVuZSBidWlsZCBAY2hlY2sn IG9uIGxpYnJhcmllcyB3aXRoDQogICAgdmlydHVhbCBtb2R1bGVzDQogIOKAoiBBbGxvdyBgJCBk dW5lIGluaXQnIHRvIHdvcmsgb24gYWJzb2x1dGUgcGF0aHMNCiAg4oCiIFN0b3AgaGlkaW5nIHRo ZSBgcm9vdF9tb2R1bGUnIGZyb20gdGhlIGluY2x1ZGUgcGF0aA0KDQogIEZvciB0aGUgY29tcGxl dGUgbGlzdCBvZiBjaGFuZ2VzLCBzZWUgdGhlIFtmdWxsIHJlbGVhc2Ugb24gR2l0SHViXS4NCg0K ICAqRHVuZSBNYWludGFpbmVkIGJ5KjogUnVkaSBHcmluYmVyZyAoQHJncmluYmVyZywgSmFuZSBT dHJlZXQpLCBOaWNvbMOhcw0KICAgT2plZGEgQsOkciAoQG5vamIsIExleGlGaSksIE1hcmVrIEt1 YmljYSAoQExlb25pZGFzLWZyb20tWElWLA0KICAgVGFyaWRlcyksIEFsaSBDYWdsYXlhbiAoQEFs aXp0ZXIsIFRhcmlkZXMpLCBTdGVwaGVuIFNoZXJyYXR0DQogICAoQGdyaWRidWdzLCBUYXJpZGVz KSwgQW50b25pbyBOdW5vIE1vbnRlaXJvIChAYW5tb250ZWlybyksIFN1ZGhhDQogICBQYXJpbWFs YSAoQFN1ZGhhMjQ3LCBUYXJpZGVzKSwgQW1icmUgU3VoYW15IChARWxlY3RyZUFBUywgVGFyaWRl cyksDQogICBQdW5lZXRoIENoYWdhbnRpIChAcHVuY2hhZ2FuLCBUYXJpZGVzKQ0KDQoNCiAgW0R1 bmUgMy4yMS4wXSA8aHR0cHM6Ly9vY2FtbC5vcmcvY2hhbmdlbG9nLzIwMjYtMDEtMTYtZHVuZS0z LTIxLTA+DQoNCiAgW2Z1bGwgcmVsZWFzZSBvbiBHaXRIdWJdDQogIDxodHRwczovL2dpdGh1Yi5j b20vb2NhbWwvZHVuZS9yZWxlYXNlcy90YWcvMy4yMS4wPg0KDQoNClBhY2thZ2UgTWFuYWdlbWVu dA0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM DQoNCuKXiiBvcGFtDQoNCiAgW29wYW0gMi41LjBdIChOb3ZlbWJlciAyNywgMjAyNSkgaXMgYSBt YWpvciByZWxlYXNlIHdpdGggc2lnbmlmaWNhbnQNCiAgcGVyZm9ybWFuY2UgYW5kIHVzYWJpbGl0 eSBpbXByb3ZlbWVudHMuDQoNCiAgKktleSBGZWF0dXJlczoqDQoNCiAg4oCiICpNYXNzaXZlIHNw ZWVkdXAgZm9yIGBvcGFtIHVwZGF0ZScqOiBUaGFua3MgdG8gQGFyb3pvdnlrLCBvcGFtDQogICAg IHVwZGF0ZSBub3cgbG9hZHMgb3BhbSBmaWxlcyBpbmNyZW1lbnRhbGx5LCBvbmx5IHBhcnNpbmcg ZmlsZXMgdGhhdA0KICAgICBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgdXBkYXRlLiBGb3Ig dHlwaWNhbCBzbWFsbCBkaWZmcywgdGhpcw0KICAgICBtZWFucyBvcGVyYXRpb25zIHRoYXQgdG9v ayBzZWNvbmRzIG5vdyBjb21wbGV0ZSBpbiBtaWxsaXNlY29uZHMNCiAg4oCiICpJbXByb3ZlZCBz aGVsbCBpbnRlZ3JhdGlvbio6IEZpeGVkIGlzc3VlcyB3aGVyZSBwYXJ0cyBvZiBhIHByZXZpb3Vz DQogICAgIGVudmlyb25tZW50IHdlcmUga2VwdCBpbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudCwg Y2F1c2luZyB2YXJpb3VzDQogICAgIHByb2JsZW1zDQogIOKAoiAqQ2hhbmdlZCBkZWZhdWx0IHNo ZWxsIGludGVncmF0aW9uIGZpbGUqOiBOb3cgd3JpdGVzIHRvIGAuYmFzaHJjJw0KICAgICBpbnN0 ZWFkIG9mIGAucHJvZmlsZScgd2hlbiBiYXNoIGlzIGRldGVjdGVkLCBwcmV2ZW50aW5nIGluZmlu aXRlDQogICAgIGxvb3AgaXNzdWVzDQogIOKAoiAqQXBwQXJtb3IgcHJvZmlsZSo6IFRoZSBpbnN0 YWxsIHNjcmlwdCBub3cgaW5zdGFsbHMgYW4gYXBwcm9wcmlhdGUNCiAgICAgYXBwYXJtb3IgcHJv ZmlsZSBvbiBzeXN0ZW1zIGNvbmZpZ3VyZWQgd2l0aCBhcHBhcm1vciAoZW5hYmxlZCBieQ0KICAg ICBkZWZhdWx0IG9uIFVidW50dSkNCiAg4oCiICptYWNPUyBzYW5kYm94IGltcHJvdmVtZW50cyo6 IEFsbG93IHdyaXRpbmcgdG8gYC92YXIvZm9sZGVycy8nIGFuZA0KICAgICBgL3Zhci9kYi9tZHMv JyBkaXJlY3RvcmllcyBhcyByZXF1aXJlZCBieSBzb21lIG1hY09TIGNvcmUgdG9vbHMNCg0KICAq QnVpbGQgQ2hhbmdlczoqDQoNCiAg4oCiICpFY29zeXN0ZW0gY21kbGluZXIgMi4wLjAgY29tcGF0 aWJpbGl0eSo6IG9wYW0gbm8gbG9uZ2VyIGRlcGVuZHMgb24NCiAgICAgYGNtZGxpbmVyJywgcmVt b3ZpbmcgYSBrZXkgYmxvY2tlciB0aGF0IHByZXZlbnRlZCBjbWRsaW5lciAxLnggYW5kDQogICAg IDIuMC4wIGZyb20gYmVpbmcgY28taW5zdGFsbGFibGUuIFRoaXMgY2hhbmdlIGVuYWJsZXMgZWNv c3lzdGVtLXdpZGUNCiAgICAgbWlncmF0aW9uIHRvIGNtZGxpbmVyIDIuMC4wDQogIOKAoiBPQ2Ft bCA1LjUgKHRydW5rKSBzdXBwb3J0IHdoZW4gdXNpbmcgZHVuZSdzIGRldiBwcm9maWxlDQogIOKA oiBUaGUgcmVsZWFzZSBhcmNoaXZlIChgb3BhbS1mdWxsLSoudGFyLmd6JykgaXMgbm93IHJlcHJv ZHVjaWJsZQ0KICDigKIgT3BlbkJTRCBiaW5hcnkgaXMgbm93IGEgZnVsbCBzdGF0aWMgYmluYXJ5 DQoNCiAgRm9yIG1vcmUgZGV0YWlscywgc2VlIHRoZSBbb2ZmaWNpYWwgb3BhbSAyLjUuMCBhbm5v dW5jZW1lbnQgYmxvZ10gYW5kDQogIFtmdWxsIHJlbGVhc2Ugbm90ZXMgb24gR2l0SHViXS4NCg0K ICAqb3BhbSBNYWludGFpbmVkIGJ5KjogUmFqYSBCb3VqYmVsIChAcmpib3UsIE9DYW1sUHJvKSwg S2F0ZSBEZXBsYWl4DQogICAoQGtpdC10eS1rYXRlLCBBaHJlZnMpLCBEYXZpZCBBbGxzb3BwIChA ZHJhMjcsIFRhcmlkZXMpDQoNCg0KICBbb3BhbSAyLjUuMF0gPGh0dHBzOi8vb2NhbWwub3JnL2No YW5nZWxvZy8yMDI1LTExLTI3LW9wYW0tMi41LjA+DQoNCiAgW29mZmljaWFsIG9wYW0gMi41LjAg YW5ub3VuY2VtZW50IGJsb2ddDQogIDxodHRwczovL29wYW0ub2NhbWwub3JnL2Jsb2cvb3BhbS0y LTUtMC8+DQoNCiAgW2Z1bGwgcmVsZWFzZSBub3RlcyBvbiBHaXRIdWJdDQogIDxodHRwczovL2dp dGh1Yi5jb20vb2NhbWwvb3BhbS9yZWxlYXNlcy90YWcvMi41LjA+DQoNCg0K4peKIG9wYW0tcHVi bGlzaA0KDQogIFtvcGFtLXB1Ymxpc2ggMi43LjFdIChOb3ZlbWJlciAxOCwgMjAyNSkgZml4ZXMg YnVncyByZWxhdGVkIHRvIHRoZQ0KICBHaXRIdWIgQVBJIHRva2VuIHBlcm1pc3Npb25zIGludHJv ZHVjZWQgaW4gdmVyc2lvbiAyLjcuMC4NCg0KICAqQ2hhbmdlczoqDQoNCiAg4oCiIEFkdmVydGlz ZSB0aGUgbmVlZCwgYW5kIGNoZWNrLCBmb3IgdGhlIGB3b3JrZmxvdycgc2NvcGUgZm9yIEdpdEh1 Yg0KICAgIHBlcnNvbmFsIGFjY2VzcyB0b2tlbnMNCiAg4oCiIEVuZm9yY2UgdGhlIGdpdCByZW1v dGUgdXNlZCB0byBwdXNoIGJyYW5jaGVzIHRvIHVzZXJzJyBmb3JrIHRvIGJlDQogICAgdXNlZCBp bnN0ZWFkIG9mIHRoZSBTU0ggbWV0aG9kDQogIOKAoiBBdm9pZCBwb3RlbnRpYWwgcHJldmlvdXNs eSB1c2VkIHRva2VucyB3aXRoIHdyb25nIHBlcm1pc3Npb25zIHRvIGJlDQogICAgdXNlZCBpbnN0 ZWFkIG9mIHRoZSBuZXcgb25lDQogIOKAoiBBZGQgc3VwcG9ydCBmb3IgdGhlIG9wYW0gMi41IEFQ SQ0KDQogICpNYWludGFpbmVkIGJ5KjogUmFqYSBCb3VqYmVsIChAcmpib3UsIE9DYW1sUHJvKSwg S2F0ZSBEZXBsYWl4DQogICAoQGtpdC10eS1rYXRlLCBBaHJlZnMpDQoNCg0KICBbb3BhbS1wdWJs aXNoIDIuNy4xXQ0KICA8aHR0cHM6Ly9vY2FtbC5vcmcvY2hhbmdlbG9nLzIwMjUtMTEtMTgtb3Bh bS1wdWJsaXNoLTIuNy4xPg0KDQoNCuKXiiBvcGFtLXJlcG9zaXRvcnkgQXJjaGl2YWw6IEphbnVh cnkgMSwgMjAyNg0KDQogIE9uIEphbnVhcnkgMSwgMjAyNiwgdGhlIG9wYW0tcmVwb3NpdG9yeSBj b21wbGV0ZWQgaXRzIHNjaGVkdWxlZA0KICBhcmNoaXZhbCBydW4sIHJlbW92aW5nICozLDI2NCBw YWNrYWdlIHZlcnNpb25zKiAoODgxIHVuaXF1ZSBwYWNrYWdlcykNCiAgbWFya2VkIHdpdGggYHgt bWFpbnRlbmFuY2UtaW50ZW50OiBhcmNoaXZhbCcuIFRoaXMgb25nb2luZyBtYWludGVuYW5jZQ0K ICBwcm9jZXNzIGhlbHBzIGtlZXAgdGhlIHJlcG9zaXRvcnkgbWFuYWdlYWJsZSBieSByZW1vdmlu ZyB1bm1haW50YWluZWQNCiAgb3Igb2Jzb2xldGUgcGFja2FnZSB2ZXJzaW9ucy4NCg0KICAqV2hh dCBUaGlzIE1lYW5zOioNCg0KICDigKIgQXJjaGl2ZWQgcGFja2FnZXMgYXJlIG5vIGxvbmdlciBh dmFpbGFibGUgaW4gdGhlIGRlZmF1bHQgb3BhbQ0KICAgIHJlcG9zaXRvcnkNCiAg4oCiIENJIHN5 c3RlbXMgYW5kIGxvY2sgZmlsZXMgbWF5IG5lZWQgdXBkYXRlcyBpZiB0aGV5IGRlcGVuZCBvbg0K ICAgIGFyY2hpdmVkIHZlcnNpb25zDQogIOKAoiBUaGUgYXJjaGl2YWwgaXMgYmFzZWQgb24gbWV0 YWRhdGEgZXhwbGljaXRseSBzZXQgYnkgcGFja2FnZQ0KICAgIG1haW50YWluZXJzDQoNCiAgKkJh Y2tncm91bmQ6Kg0KDQogIFRoZSBhcmNoaXZhbCBwcm9jZXNzIHdhcyBhbm5vdW5jZWQgYnkgSGFu bmVzIE1laG5lcnQgaW4gRGVjZW1iZXIgMjAyNQ0KICAoc2VlIHRoZSBbRGlzY3VzcyBhbm5vdW5j ZW1lbnRdKSwgZ2l2aW5nIHBhY2thZ2UgbWFpbnRhaW5lcnMgYW5kIHVzZXJzDQogIHRpbWUgdG8g cHJlcGFyZS4gUGFja2FnZXMgY2FuIGJlIHJlc3RvcmVkIGZyb20gYXJjaGl2YWwgYnkgbWFpbnRh aW5lcnMNCiAgdXBvbiByZXF1ZXN0Lg0KDQogIFRoaXMgbWFpbnRlbmFuY2UgcHJhY3RpY2UgZW5z dXJlcyB0aGUgb3BhbSByZXBvc2l0b3J5IHJlbWFpbnMNCiAgc3VzdGFpbmFibGUgYW5kIGZvY3Vz ZWQgb24gYWN0aXZlbHkgbWFpbnRhaW5lZCBwYWNrYWdlcy4NCg0KDQogIFtEaXNjdXNzIGFubm91 bmNlbWVudF0NCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9vcGFtLXJlcG9zaXRvcnkt YXJjaGl2YWwtbmV4dC1ydW4tc2NoZWR1bGVkLTIwMjYtMDEtMDEvMTc1ODc+DQoNCg0K4peKIGR1 bmUtcmVsZWFzZQ0KDQogIFtkdW5lLXJlbGVhc2UgMi4yLjBdIChKYW51YXJ5IDI5LCAyMDI2KSBi cmluZ3MgZnVsbCBjb21wYXRpYmlsaXR5IHdpdGgNCiAgY21kbGluZXIgMi4wLjAsIGNvbnRpbnVp bmcgdGhlIGVjb3N5c3RlbS13aWRlIG1pZ3JhdGlvbiB0aGF0IGJlZ2FuDQogIHdpdGggb3BhbSAy LjUuMCdzIHJlbW92YWwgb2YgdGhlIGNtZGxpbmVyIGRlcGVuZGVuY3kuDQoNCiAgKldoeSBUaGlz IE1hdHRlcnM6Kg0KDQogIGNtZGxpbmVyIDIuMC4wIGludHJvZHVjZWQgc3RyaWN0ZXIgcmVxdWly ZW1lbnRzIHRoYXQgaW1wcm92ZSBDTEkNCiAgcmVsaWFiaWxpdHkgYnV0IHByZXZlbnQgY28taW5z dGFsbGFiaWxpdHkgd2l0aCBjbWRsaW5lciAxLnguIEZvbGxvd2luZw0KICBvcGFtIDIuNS4wJ3Mg bGVhZCBpbiByZW1vdmluZyB0aGlzIGNvbmZsaWN0LCBkdW5lLXJlbGVhc2UgMi4yLjANCiAgdXBk YXRlcyB0byB1c2UgY21kbGluZXIgMi4wLjAgZXhjbHVzaXZlbHkuIFRoaXMgY29vcmRpbmF0ZWQg ZWZmb3J0DQogIGFjcm9zcyB0aGUgcGxhdGZvcm0gdG9vbHMgZW5hYmxlcyB1c2VycyB0byB1cGdy YWRlIHdpdGhvdXQNCiAgZW5jb3VudGVyaW5nIGRlcGVuZGVuY3kgY29uZmxpY3RzLg0KDQogICpJ bXBvcnRhbnQgQ2hhbmdlczoqDQoNCiAg4oCiICpCcmVha2luZyo6IEZvbGxvd2luZyBjbWRsaW5l ciAyLjAncyBzdHJpY3RlciByZXF1aXJlbWVudHMsDQogICAgIHByZWZpeC1tYXRjaGluZyBmb3Ig Y29tbWFuZCBvcHRpb25zIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQNCiAg4oCiIFVzZXJzIG11c3Qg bm93IHByb3ZpZGUgdGhlIGZ1bGwgd29yZGluZyBmb3IgYWxsIGZsYWdzIChmb3IgZXhhbXBsZSwN CiAgICBgLS1za2lwLXRlc3RzJyBpbnN0ZWFkIG9mIGAtLXNraXAtdGVzdCcpDQogIOKAoiBUaGlz IGNoYW5nZSBlbnN1cmVzIGNvbXBhdGliaWxpdHkgd2l0aCBjbWRsaW5lciAyLjAuMCBhbmQgYWxp Z25zDQogICAgd2l0aCBtb2Rlcm4gQ0xJIGJlc3QgcHJhY3RpY2VzDQogIOKAoiBJZiB5b3UgaGF2 ZSBhdXRvbWF0aW9uIHNjcmlwdHMgdXNpbmcgc2hvcnRlbmVkIGZsYWdzLCB1cGRhdGUgdGhlbQ0K ICAgIGJlZm9yZSB1cGdyYWRpbmcNCg0KICBGb3IgdGVjaG5pY2FsIGRldGFpbHMsIHNlZSB0aGUg W2NtZGxpbmVyIDIuMC4wIGRvY3VtZW50YXRpb25dIGFuZCB0aGUNCiAgW2R1bmUtcmVsZWFzZSBQ UiAjNTEyXS4NCg0KICAqTWFpbnRhaW5lZCBieSo6IFRhcmlkZXMNCg0KDQogIFtkdW5lLXJlbGVh c2UgMi4yLjBdDQogIDxodHRwczovL29jYW1sLm9yZy9jaGFuZ2Vsb2cvZHVuZS1yZWxlYXNlLzIw MjYtMDEtMjktZHVuZS1yZWxlYXNlLTIuMi4wPg0KDQogIFtjbWRsaW5lciAyLjAuMCBkb2N1bWVu dGF0aW9uXQ0KICA8aHR0cHM6Ly9lcnJhdGlxdWUuY2gvc29mdHdhcmUvY21kbGluZXIvZG9jL0Nt ZGxpbmVyPg0KDQogIFtkdW5lLXJlbGVhc2UgUFIgIzUxMl0NCiAgPGh0dHBzOi8vZ2l0aHViLmNv bS90YXJpZGVzL2R1bmUtcmVsZWFzZS9wdWxsLzUxMj4NCg0KDQpFZGl0b3IgVG9vbHMNCuKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogICpSb2FkbWFwOiBbRWRpdCAvIChX MTkpIE5hdmlnYXRlIENvZGVdKg0KDQoNCltFZGl0IC8gKFcxOSkgTmF2aWdhdGUgQ29kZV0NCjxo dHRwczovL29jYW1sLm9yZy90b29scy9wbGF0Zm9ybS1yb2FkbWFwI3cxOS1uYXZpZ2F0ZS1jb2Rl Pg0KDQril4ogT0NhbWwtTFNQIFNlcnZlcg0KDQogIFtPQ2FtbC1MU1AgMS4yNS4wXSAoRGVjZW1i ZXIgMjAsIDIwMjUpIGludHJvZHVjZXMgc3VwcG9ydCBmb3IgYC5tbHgnDQogIGZpbGVzIGFuZCBu ZXcgY3VzdG9tIHJlcXVlc3RzLg0KDQogICpGZWF0dXJlczoqDQoNCiAg4oCiICpgLm1seCcgU3Vw cG9ydCo6IEFkZGVkIHN1cHBvcnQgZm9yIGAubWx4JyBmaWxlcywgaW5jbHVkaW5nDQogICAgIGRp YWdub3N0aWNzLCBjb2RlIGFjdGlvbnMsIGhvdmVyLCBhbmQgZm9ybWF0dGluZyB2aWENCiAgICAg YG9jYW1sZm9ybWF0LW1seCcNCiAg4oCiICpOZXcgQ3VzdG9tIFJlcXVlc3RzKjogQWRkZWQgYHR5 cGVFeHByZXNzaW9uJywgYGxvY2F0ZScsIGFuZA0KICAgICBgcGhyYXNlJyByZXF1ZXN0cyB0byB0 aGUgc2VydmVyDQogIOKAoiAqQ29kZS1MZW5zIENvbmZpZ3VyYXRpb24qOiBDb2RlLWxlbnMgZm9y IG5lc3RlZCBgbGV0JyBiaW5kaW5ncyBpcw0KICAgICBub3cgY29uZmlndXJhYmxlDQoNCiAgKkZp eGVzOioNCg0KICDigKIgVGhlIHNlcnZlciBub3cgZmFsbHMgYmFjayB0byBgLm1lcmxpbicgY29u ZmlndXJhdGlvbiBpZiBhDQogICAgYGR1bmUtcHJvamVjdCcgZmlsZSBpcyBtaXNzaW5nLCBwcm92 aWRlZCBbZG90LW1lcmxpbi1yZWFkZXJdIGlzDQogICAgaW5zdGFsbGVkDQogIOKAoiBJbXByb3Zl ZCBwcmVjaXNpb24gb2YgdGltZXN0YW1wcyBmb3IgY29sbGVjdGVkIG1ldHJpY3MNCg0KDQogIFtP Q2FtbC1MU1AgMS4yNS4wXQ0KICA8aHR0cHM6Ly9vY2FtbC5vcmcvY2hhbmdlbG9nLzIwMjUtMTIt MjAtb2NhbWwtbHNwLTEtMjUtMD4NCg0KICBbZG90LW1lcmxpbi1yZWFkZXJdIDxodHRwczovL2dp dGh1Yi5jb20vb2NhbWwvbWVybGluPg0KDQoNCuKXiiBNZXJsaW4NCg0KICBbTWVybGluIDUuNi4x LTUwNF0gKERlY2VtYmVyIDIwLCAyMDI1KSBicmluZ3MgcGVyZm9ybWFuY2UNCiAgb3B0aW1pemF0 aW9ucyBhbmQgaW1wcm92ZWQgc3RhYmlsaXR5Lg0KDQogICpLZXkgSW1wcm92ZW1lbnRzOioNCg0K ICDigKIgKlNtYXJ0ZXIgU2lnbmF0dXJlIEhlbHAqOiBOb3cgdHJpZ2dlcnMgY29ycmVjdGx5IG9u IHVuZmluaXNoZWQgYGxldA0KICAgICAuLi4gaW4nIGJpbmRpbmdzIGFuZCBubyBsb25nZXIgYXBw ZWFycyByZWR1bmRhbnRseSBvbiBmdW5jdGlvbg0KICAgICBuYW1lcw0KICDigKIgKk1vcmUgUmVs aWFibGUgQ29tcGxldGlvbio6IEZpeGVkIGlzc3VlcyB3aXRoIGNvbXBsZXRpb24gZm9yIGlubGlu ZWQNCiAgICAgcmVjb3JkIGxhYmVscw0KICDigKIgKkltcHJvdmVkIFBlcmZvcm1hbmNlKjogT3B0 aW1pemVkIGJ1ZmZlciBpbmRleGluZyBhbmQgcGF0aA0KICAgICBjYWxjdWxhdGlvbnMNCiAg4oCi ICpCdWcgRml4ZXMqOiBSZXNvbHZlZCBhIGJ1ZyB3aGVyZSB0aGUgYGRvY3VtZW50JyBjb21tYW5k DQogICAgIGNvbmNhdGVuYXRlZCBsYWJlbHMgYW5kIHZhcmlhbnRzIGluY29ycmVjdGx5DQoNCiAg Kk9DYW1sIExTUCBTZXJ2ZXIgbWFpbnRhaW5lZCBieSo6IFVseXNzZSBHw6lyYXJkIChAdm9vZG9v cywgVGFyaWRlcyksDQogICBYYXZpZXIgVmFuIGRlIFdvZXN0eW5lIChAeHZ3LCBUYXJpZGVzKSwg UnVkaSBHcmluYmVyZyAoQHJncmluYmVyZywNCiAgIEphbmUgU3RyZWV0KQ0KDQogICpNZXJsaW4g bWFpbnRhaW5lZCBieSo6IFVseXNzZSBHw6lyYXJkIChAdm9vZG9vcywgVGFyaWRlcyksIFhhdmll ciBWYW4NCiAgIGRlIFdvZXN0eW5lIChAeHZ3LCBUYXJpZGVzKSwgTXVsdWggR29kc29uIChAUGl6 aWVEdXN0LCBUYXJpZGVzKQ0KDQoNCiAgW01lcmxpbiA1LjYuMS01MDRdDQogIDxodHRwczovL29j YW1sLm9yZy9jaGFuZ2Vsb2cvMjAyNS0xMi0yMC1tZXJsaW4tdjUtNi0xLTUwND4NCg0KDQril4og T0NhbWwtZWdsb3QNCg0KICBXZSBoYXZlIGRyYXN0aWNhbGx5IG1vZGlmaWVkIHRoZSBgeHJlZicg YmFja2VuZCAoYWxsb3dpbmcgbmF2aWdhdGlvbg0KICBmcm9tIGRlZmluaXRpb24gdG8gZGVmaW5p dGlvbikgdG8gbWFrZSBpdCBtb3JlIHN1aXRhYmxlIGZvciBPQ2FtbC4NCg0KICBJbiBhZGRpdGlv biwgd2UgYWRkZWQgdGhlIGFiaWxpdHkgdG8gYW5ub3RhdGUgdGhlIHR5cGUgb2YgYW4gZW5jbG9z aW5nDQogIGFjdGl2ZV8gKHVzZWQgd2l0aCB0aGUgYG9jYW1sLWVnbG90LXR5cGUtZW5jbG9zaW5n JyBjb21tYW5kKSBvciBzaW1wbHkNCiAgdG8gdHlwZSB0aGUgc2VsZWN0aW9uLg0KDQogIFRoZXNl IHVwZGF0ZXMgaGF2ZSBiZWVuIG1lcmdlZCBpbnRvIGBtYWluJywgbWFraW5nIHRoZW0gYXZhaWxh YmxlIHZpYQ0KICBhIE1FTFBBIHVwZGF0ZS4NCg0KICAqb2NhbWwtZWdsb3QgbWFpbnRhaW5lZCBi eSo6IFhhdmllciBWYW4gZGUgV29lc3R5bmUgKEB4dncsIFRhcmlkZXMpDQoNCg0KUGxhdGZvcm0g SW5mcmFzdHJ1Y3R1cmUNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQril4ogT0NhbWwgSW5mcmFzdHJ1Y3R1cmU6 IEhvdyB0aGUgb3BhbS1yZXBvc2l0b3J5IFdvcmtzDQoNCiAgVGhlIFtOb3ZlbWJlciA1LCAyMDI1 IGFydGljbGUgb24gdGhlIG9wYW0tcmVwb3NpdG9yeV0gcHJvdmlkZXMgYW4NCiAgaW4tZGVwdGgg bG9vayBhdCB0aGlzIGNyaXRpY2FsIHBpZWNlIG9mIE9DYW1sIGluZnJhc3RydWN0dXJlLiBUaGUg b3BhbQ0KICByZXBvc2l0b3J5IHNlcnZlcyBhcyB0aGUgY2VudHJhbCBwYWNrYWdlIHJlZ2lzdHJ5 IGZvciB0aGUgT0NhbWwNCiAgZWNvc3lzdGVtLCBob3N0aW5nIG92ZXIgNCw1MDAgcGFja2FnZXMu IEl0IHJlbGllcyBvbiBkZWRpY2F0ZWQNCiAgdm9sdW50ZWVyIG1haW50YWluZXJzIHdobyByZXZp ZXcgZXZlcnkgc3VibWlzc2lvbi4NCg0KICDigJQNCg0KICBBcyBhbHdheXMsIHdlIGVuY291cmFn ZSBmZWVkYmFjayBhbmQgY29udHJpYnV0aW9ucyBmcm9tIHRoZSBjb21tdW5pdHkNCiAgYXMgd2Ug Y29udGludWUgdG8gaW1wcm92ZSB0aGUgT0NhbWwgUGxhdGZvcm0gZWNvc3lzdGVtLg0KDQoNCiAg W05vdmVtYmVyIDUsIDIwMjUgYXJ0aWNsZSBvbiB0aGUgb3BhbS1yZXBvc2l0b3J5XQ0KICA8aHR0 cHM6Ly9vY2FtbC5vcmcvY2hhbmdlbG9nLzIwMjUtMTEtMDUtaG93LXRoZS1vcGFtLXJlcG9zaXRv cnktd29ya3M+DQoNCg0KQW5ub3VuY2luZyB0aGUgZmlyc3QgcmVsZWFzZSBvZiBBbGljZSwgYSBy YWRpY2FsIE9DYW1sIGJ1aWxkIHN5c3RlbQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ DQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm5vdW5jaW5n LXRoZS1maXJzdC1yZWxlYXNlLW9mLWFsaWNlLWEtcmFkaWNhbC1vY2FtbC1idWlsZC1zeXN0ZW0v MTc0NzIvNDU+DQoNCg0KQ29udGludWluZyB0aGlzIHRocmVhZCwgU3RldmUgU2hlcnJhdHQgYW5u b3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBBbm5vdW5jaW5nIHRo ZSByZWxlYXNlIG9mIFtBbGljZSB2MC41LjBdIHdoaWNoIGludHJvZHVjZXMgcGFyYWxsZWwNCiAg YnVpbGRzLg0KDQoNCltBbGljZSB2MC41LjBdIDxodHRwczovL3d3dy5hbGljZWNhbWwub3JnL2Js b2cvYWxpY2UtdjAtNS0wLz4NCg0KDQptbmV0LCBhIG5ldyBUQ1AvSVAgc3RhY2sgZm9yIHVuaWtl cm5lbHMgaW4gT0NhbWwNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hp dmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLW1uZXQtYS1uZXctdGNwLWlw LXN0YWNrLWZvci11bmlrZXJuZWxzLWluLW9jYW1sLzE3ODUxLzE+DQoNCg0KQ2FsYXNjaWJldHRh IFJvbWFpbiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEkg YW0gcGxlYXNlZCB0byBhbm5vdW5jZSBhIHNlcmllcyBvZiByZWxlYXNlcyBmb3IgZGV2ZWxvcGlu Zw0KICB1bmlrZXJuZWxzIHdpdGggT0NhbWwgNSBhbmQgW01pb3VdLiBBZnRlciBleHRlbnNpdmUg dGVzdGluZywgd2UgYXJlDQogIG5vdyBhYmxlIHRvIG9mZmVyIGEgbmV3IFRDUC9JUHY0IGFuZCBJ UHY2IHN0YWNrIGluIE9DYW1sIHRoYXQgYWltcyB0bw0KICByZXBsYWNlIFttaXJhZ2UtdGNwaXBd IGFuZCBwYXZlIHRoZSB3YXkgZm9yIGRpcmVjdC1zdHlsZSB1bmlrZXJuZWwNCiAgZGV2ZWxvcG1l bnQuIEJlbG93IGlzIGFuIG92ZXJ2aWV3IG9mIHRoZSBsaWJyYXJpZXMgd2UgaGF2ZSBidWlsdCB0 bw0KICBtYWtlIHRoaXMgcG9zc2libGUuDQoNCg0KW01pb3VdIDxodHRwczovL2dpdGh1Yi5jb20v cm9idXItY29vcC9taW91Pg0KDQpbbWlyYWdlLXRjcGlwXSA8aHR0cHM6Ly9naXRodWIuY29tL21p cmFnZS9taXJhZ2UtdGNwaXA+DQoNCm1rZXJuZWwNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQog IGBta2VybmVsJyBpcyBhIHNtYWxsIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB0aGUgZXNzZW50aWFs cyBmb3INCiAgZGV2ZWxvcGluZyBhIHVuaWtlcm5lbCB0YXJnZXRpbmcgW1NvbG81XSBvciBbVW5p a3JhZnRdLiBJdHMgcHVycG9zZSBpcw0KICB0byBleHBvc2UgaHlwZXJjYWxscyAodGhlIHVuaWtl cm5lbCBlcXVpdmFsZW50IG9mIHN5c2NhbGxzKSBzbyB0aGF0DQogIHlvdXIgYXBwbGljYXRpb24g Y2FuIGludGVyYWN0IHdpdGggbmV0d29yayBhbmQgYmxvY2sgZGV2aWNlcy4NCg0KICBXZSByZWNv bW1lbmQgcmVhZGluZyB0aGUgYG1rZXJuZWwnIFtkb2N1bWVudGF0aW9uXSB0byB1bmRlcnN0YW5k IHRoZQ0KICBrZXkgY29uY2VwdHMgYmVoaW5kIHVuaWtlcm5lbHMgKGh5cGVyY2FsbHMsIGRldmlj ZXMsIHRlbmRlcnMsDQogIGV0Yy4pLiBUaGUgW3NsaWRlc10gd2UgcHJlc2VudGVkIGF0IHRoZSBs YXN0IFtNaXJhZ2VPUyByZXRyZWF0XSBhcmUNCiAgYWxzbyBoZWxwZnVsIGZvciB1bmRlcnN0YW5k aW5nIG91ciBuZXcgd29ya2Zsb3cuIENvbXBpbGluZyBhIHVuaWtlcm5lbA0KICBub3cgb25seSBy ZXF1aXJlcyBgZHVuZScgYW5kIHZlbmRvcmVkIGxpYnJhcmllcy4gV2UgaGF2ZSB0aGVyZWZvcmUN CiAgY2hvc2VuIG5vdCB0byByZXNvbHZlIGRlcGVuZGVuY2llcyBhdXRvbWF0aWNhbGx5IChhcyBb b3BhbS1tb25vcmVwb10NCiAgZGlkKSBvciB0byBpbXBvc2UgdGhlbSAoYXMgdGhlIGBtaXJhZ2Un IHRvb2wgZG9lcyksIGdpdmluZyBkZXZlbG9wZXJzDQogIGZ1bGwgZnJlZWRvbSB0byBidWlsZCB0 aGVpciB1bmlrZXJuZWxzIGFzIHRoZXkgc2VlIGZpdC4gSW4gcGFydGljdWxhciwNCiAgdGhpcyBt YWtlcyBpdCBzdHJhaWdodGZvcndhcmQgdG8gdXNlIHBweCByZXdyaXRlcnMsIHdoaWNoIHdhcw0K ICBkaWZmaWN1bHQgb3IgaW1wb3NzaWJsZSB3aXRoIHRoZSBgbWlyYWdlJyB0b29sLg0KDQoNCltT b2xvNV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9zb2xvNS9zb2xvNT4NCg0KW1VuaWtyYWZ0XSA8aHR0 cHM6Ly91bmlrcmFmdC5vcmcvPg0KDQpbZG9jdW1lbnRhdGlvbl0NCjxodHRwczovL3JvYnVyLWNv b3AuZ2l0aHViLmlvL21rZXJuZWwvbG9jYWwvbWtlcm5lbC9Na2VybmVsL2luZGV4Lmh0bWw+DQoN CltzbGlkZXNdDQo8aHR0cHM6Ly9naXRodWIuY29tL3JvYnVyLWNvb3AvbWtlcm5lbC9ibG9iL21h aW4vc2xpZGVzL3JldHJlYXQubWQ+DQoNCltNaXJhZ2VPUyByZXRyZWF0XSA8aHR0cHM6Ly9yZXRy ZWF0Lm1pcmFnZW9zLm9yZy8+DQoNCltvcGFtLW1vbm9yZXBvXSA8aHR0cHM6Ly9naXRodWIuY29t L3RhcmlkZXMvb3BhbS1tb25vcmVwbz4NCg0K4peKIEEgbmV3IHdvcmtmbG93IGFuZCB0YXJnZXRz DQoNCiAgVGhpcyByZWxlYXNlIGlzIGV4cGVyaW1lbnRhbDogWGVuIGlzIG5vdCB5ZXQgc3VwcG9y dGVkLCBhbmQgVW5pa3JhZnQNCiAgc3VwcG9ydCBpcyBwYXJ0aWFsLiBIb3dldmVyLCBib3RoIHBs YXRmb3JtcyBhcmUgb24gb3VyIHJvYWRtYXAsIHNvIGlmDQogIHlvdSBhcmUgaW50ZXJlc3RlZCBp biB0aGVtLCBwbGVhc2UgbGV0IHVzIGtub3chIFdlIGFyZSBhbHNvIGRldmVsb3BpbmcNCiAgdG9v bGluZyB0byBzdHJlYW1saW5lIHRoZSB3b3JrZmxvdywgd2l0aCB0aGUgZ3VpZGluZyBwcmluY2lw bGUgdGhhdA0KICB0aGVzZSB0b29scyBzaG91bGQgbmV2ZXIgZGljdGF0ZSB3aGljaCBkZXBlbmRl bmNpZXMgeW91ciB1bmlrZXJuZWwNCiAgdXNlcyBvciB3aGljaCBidWlsZCBzeXN0ZW0geW91IGNo b29zZS4NCg0KDQptbmV0DQrilYzilYzilYzilYwNCg0KICBgbW5ldCcgaXMgdGhlIGNlbnRlcnBp ZWNlIG9mIHRoaXMgcmVsZWFzZS4gSXQgaXMgZGVzaWduZWQgdG8gcmVwbGFjZQ0KICAoYW5kIGlt cHJvdmUgdXBvbikgW21pcmFnZS10Y3BpcF0gYnkgb2ZmZXJpbmcgYSBkaXJlY3Qtc3R5bGUgQVBJ IGJ1aWx0DQogIG9uIGVmZmVjdHMuIFRoZSBBUEkgZGVsaWJlcmF0ZWx5IG1pcnJvcnMgdGhlIGBV bml4JyBzb2NrZXQgaW50ZXJmYWNlOg0KICBgY29ubmVjdCcsIGBsaXN0ZW4nLCBgYWNjZXB0Jywg YHJlYWQnLCBgd3JpdGUnLCBhbmQgYGNsb3NlJyBhbGwgYmVoYXZlDQogIHRoZSB3YXkgeW91IHdv dWxkIGV4cGVjdC4NCg0KICBIZXJlIGlzIGEgc21hbGwgZXhhbXBsZSBvZiBhbiBlY2hvIHNlcnZl cjoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBsZXQgcnVuIChpcHY0LCBnYXRld2F5LCBpcHY2 KSA9DQogIOKUgiAgIE1rZXJuZWwuKHJ1biBbIHJuZzsgTW5ldC5zdGFjayB+bmFtZToic2Vydmlj ZSIgP2dhdGV3YXkgfmlwdjYgaXB2NCBdKQ0KICDilIIgICBAQCBmdW4gcm5nIChkYWVtb24sIHRj cCwgdWRwKSAtPg0KICDilIIgICBsZXRAICgpID0gZnVuICgpIC0+IE1uZXQua2lsbCBkYWVtb24g aW4NCiAg4pSCICAgbGV0QCAoKSA9IGZ1biAoKSAtPiBNaXJhZ2VfY3J5cHRvX3JuZ19ta2VybmVs LmtpbGwgcm5nIGluDQogIOKUgiAgIGxldCBsaXN0ZW4gPSBNbmV0LlRDUC5saXN0ZW4gdGNwIDkw MDAgaW4NCiAg4pSCICAgbGV0IGZsb3cgPSBNbmV0LlRDUC5hY2NlcHQgdGNwIGxpc3RlbiBpbg0K ICDilIIgICBsZXQgYnVmID0gQnl0ZXMuY3JlYXRlIDQwOTYgaW4NCiAg4pSCICAgbGV0IHJlYyBl Y2hvICgpID0NCiAg4pSCICAgICBsZXQgbGVuID0gTW5ldC5UQ1AucmVhZCBmbG93IGJ1ZiBpbg0K ICDilIIgICAgIGlmIGxlbiA+IDAgdGhlbiBiZWdpbg0KICDilIIgICAgICAgTW5ldC5UQ1Aud3Jp dGUgZmxvdyAoQnl0ZXMuc3ViX3N0cmluZyBidWYgMCBsZW4pOw0KICDilIIgICAgICAgZWNobyAo KQ0KICDilIIgICAgIGVuZA0KICDilIIgICBpbg0KICDilIIgICBsZXRAICgpID0gZnVuICgpIC0+ IE1uZXQuVENQLmNsb3NlIGZsb3cgaW4NCiAg4pSCICAgZWNobyAoKQ0KICDilJTilIDilIDilIDi lIANCg0KICBUTFMgc3VwcG9ydCAodmlhIFtvY2FtbC10bHNdKSBpcyBhbHJlYWR5IGF2YWlsYWJs ZSwgYWxsb3dpbmcgeW91IHRvDQogIGVzdGFibGlzaCBzZWN1cmUgY29ubmVjdGlvbnMgd2l0aCB5 b3VyIHVuaWtlcm5lbC4gRE5TIHJlc29sdXRpb24gKHZpYQ0KICBbb2NhbWwtZG5zXSkgYW5kIHRo ZSBbSGFwcHkgRXllYmFsbHNdIGFsZ29yaXRobSBhcmUgYWxzbyBpbmNsdWRlZCwgc28NCiAgdGhh dCBhIHVuaWtlcm5lbCBjYW4gcmVzb2x2ZSBob3N0bmFtZXMgYW5kIGNvbm5lY3QgdG8gcmVtb3Rl IHNlcnZpY2VzDQogIG92ZXIgYm90aCBJUHY0IGFuZCBJUHY2Lg0KDQogIEEgW3Nob3J0IHR1dG9y aWFsXSB3YWxrcyB5b3UgdGhyb3VnaCBjcmVhdGluZyBhbiBlY2hvIHNlcnZlciBhcyBhDQogIHVu aWtlcm5lbCwgc2ltaWxhciB0byB3aGF0IHdlIFthbHJlYWR5IG9mZmVyXSBmb3IgTWlvdS4gRm9y IHRoZQ0KICBjdXJpb3VzLCBhbiBhcnRpY2xlIGFib3V0IElQdjQgYW5kIE1pb3UgaXMgYXZhaWxh YmxlIFtoZXJlXS4NCg0KICBCZXlvbmQgdGhlIG1vdmUgdG8gZWZmZWN0cyBmb3IgYWxsIHNjaGVk dWxpbmcsIEkgd291bGQgbGlrZSB0byBnaXZlDQogIHNwZWNpYWwgdGhhbmtzIHRvOg0KICDigKIg RWR3aW4gVMO2csO2ayBmb3IgcHJvcG9zaW5nIGZpeGVzIHRvIHByZXZlbnQgZGVuaWFsLW9mLXNl cnZpY2UNCiAgICBhdHRhY2tzLCB3aGljaCBoYXZlIGJlZW4gaW50ZWdyYXRlZCBpbnRvIGBtbmV0 JyAoaW4gcGFydGljdWxhciBmb3INCiAgICBbQVJQXSkuDQogIOKAoiBOaWNvbGFzIE9qZWRhIELD pHIgZm9yIGNvbnRyaWJ1dGluZyBhbiBJUHY2IGltcGxlbWVudGF0aW9uIHRoYXQgd2UNCiAgICBh ZG9wdGVkIGFuZCBpbXByb3ZlZCAoY2FjaGVzLCBwYWNrZXQgZnJhZ21lbnRhdGlvbiBhbmQgcmVh c3NlbWJseSwNCiAgICBldGMuKQ0KICDigKIgUmV5bmlyIGZvciBwYXRpZW50bHkgZGVidWdnaW5n IFBDQVAgdHJhY2VzDQogIOKAoiBIYW5uZXMgZm9yIHNoYXJpbmcgaGlzIGRlZXAga25vd2xlZGdl IG9mIHRoZSBUQ1AgcHJvdG9jb2wgYW5kIGl0cw0KICAgIGludGVyYWN0aW9ucyB3aXRoIElQdjQg YW5kIElQdjYNCg0KICBBcyB3ZWxsIGFzIG90aGVycyB3aG8gcGFydGljaXBhdGVkIGluIHRoZSBk ZXZlbG9wbWVudCBvZiBgbW5ldCcgaW4gb25lDQogIHdheSBvciBhbm90aGVyLg0KDQoNClttaXJh Z2UtdGNwaXBdIDxodHRwczovL2dpdGh1Yi5jb20vbWlyYWdlL21pcmFnZS10Y3BpcD4NCg0KW29j YW1sLXRsc10gPGh0dHBzOi8vZ2l0aHViLmNvbS9taXJsZWZ0L29jYW1sLXRscz4NCg0KW29jYW1s LWRuc10gPGh0dHBzOi8vZ2l0aHViLmNvbS9taXJhZ2Uvb2NhbWwtZG5zPg0KDQpbSGFwcHkgRXll YmFsbHNdIDxodHRwczovL2dpdGh1Yi5jb20vcm9idXItY29vcC9oYXBweS1leWViYWxscz4NCg0K W3Nob3J0IHR1dG9yaWFsXSA8aHR0cHM6Ly9yb2J1ci1jb29wLmdpdGh1Yi5pby9tbmV0Lz4NCg0K W2FscmVhZHkgb2ZmZXJdIDxodHRwczovL3JvYnVyLWNvb3AuZ2l0aHViLmlvL21pb3UvZWNoby5o dG1sPg0KDQpbaGVyZV0gPGh0dHBzOi8vYmxvZy5yb2J1ci5jb29wL2FydGljbGVzL3V0Y3BfYW5k X2VmZmVjdHMuaHRtbD4NCg0KW0FSUF0gPGh0dHBzOi8vb3N2LmRldi92dWxuZXJhYmlsaXR5L09T RUMtMjAyNi0wMj4NCg0K4peKIERldmVsb3BpbmcgYW5kIGRlcGxveWluZyB1bmlrZXJuZWxzDQoN CiAgVGhpcyBsaWJyYXJ5IGFsc28gbWFya3MgYSB0dXJuaW5nIHBvaW50IGluIG91ciBhcHByb2Fj aCB0bw0KICB1bmlrZXJuZWxzLiBXZSBubyBsb25nZXIgdHJlYXQgYSByZWd1bGFyIE9DYW1sIGFw cGxpY2F0aW9uIGFzDQogIHNvbWV0aGluZyB0aGF0IGNhbiBiZSB0cmFuc3BhcmVudGx5IHR1cm5l ZCBpbnRvIGENCiAgdW5pa2VybmVsLiBEZXZlbG9waW5nIGEgdW5pa2VybmVsIG5vdyBtZWFucyBk ZXZlbG9waW5nIGEgdW5pa2VybmVsDQogIGZyb20gdGhlIHN0YXJ0LiBJbiBvdXIgZXhwZXJpZW5j ZSwgdHJ5aW5nIHRvIHJldHJvZml0IGFuIGV4aXN0aW5nDQogIGFwcGxpY2F0aW9uIGludG8gYSB1 bmlrZXJuZWwgd2FzIG5laXRoZXIgcHJhY3RpY2FsIG5vciB3b3J0aHdoaWxlLg0KDQogIE91ciB0 dXRvcmlhbCB0aGVyZWZvcmUgY292ZXJzIGJvdGggdGhlIGRldmVsb3BtZW50IGFuZCBkZXBsb3lt ZW50IG9mDQogIHVuaWtlcm5lbHMuIE9uIHRoZSBkZXBsb3ltZW50IHNpZGUsIHdlIGFsc28gcmVj b21tZW5kIGV4cGxvcmluZw0KICBbQWxiYXRyb3NzXS4NCg0KDQogIFtBbGJhdHJvc3NdIDxodHRw czovL2dpdGh1Yi5jb20vcm9idXItY29vcC9hbGJhdHJvc3M+DQoNCg0KdXRjcA0K4pWM4pWM4pWM 4pWMDQoNCiAgW2B1dGNwJ10gaXMgYSBwdXJlIE9DYW1sIGltcGxlbWVudGF0aW9uIG9mIHRoZSBU Q1AgcHJvdG9jb2wsIHVzZWQNCiAgaW50ZXJuYWxseSBieSBgbW5ldCcgdG8gaGFuZGxlIFRDUCBj b25uZWN0aW9ucy4gVGhlIGltcGxlbWVudGF0aW9uIGlzDQogIGJhc2VkIG9uIGEgc3RhdGUgbWFj aGluZSBhbmQgcGVyZm9ybXMgbm8gSS9PIGl0c2VsZiwgbWFraW5nIGl0IGVhc3kgdG8NCiAgdGVz dCBhbmQgcmVhc29uIGFib3V0Lg0KDQogIGB1dGNwJyBjb3ZlcnMgdGhlIGZ1bGwgVENQIGxpZmVj eWNsZTogdGhlIHRocmVlLXdheSBoYW5kc2hha2UsDQogIHJlbGlhYmxlIGluLW9yZGVyIGRhdGEg ZGVsaXZlcnkgd2l0aCByZXRyYW5zbWlzc2lvbnMsIGZsb3cgY29udHJvbCwNCiAgY29uZ2VzdGlv biBjb250cm9sLCBhbmQgY29ubmVjdGlvbiB0ZWFyZG93bi4gSXQgaGFzIGJlZW4gdGVzdGVkDQog IGV4dGVuc2l2ZWx5IHRocm91Z2ggb3VyIGVuZC10by1lbmQgdW5pa2VybmVsIHRlc3RzIChhIHNp bXBsZSBbZWNob10NCiAgc2VydmVyIGFuZCBjbGllbnQsIGFuZCBhIFtETlMgcmVzb2x2ZXJdKS4N Cg0KDQpbYHV0Y3AnXSA8aHR0cHM6Ly9naXRodWIuY29tL3JvYnVyLWNvb3AvdXRjcD4NCg0KW2Vj aG9dIDxodHRwczovL2dpdGh1Yi5jb20vcm9idXItY29vcC9tbmV0L3RyZWUvbWFpbi91bmlrZXJu ZWxzL2VjaG8+DQoNCltETlMgcmVzb2x2ZXJdDQo8aHR0cHM6Ly9naXRodWIuY29tL3JvYnVyLWNv b3AvbW5ldC90cmVlL21haW4vdW5pa2VybmVscy9yZXNvbHZlcj4NCg0K4peKIFVuaWtlcm5lbHMg YW5kIHByb29mcw0KDQogIGB1dGNwJyBhbHNvIHJlZmxlY3RzIG91ciBhbWJpdGlvbiB0byBpbmNv cnBvcmF0ZSwgYXMgdGltZSBwZXJtaXRzLA0KICBwcm9vZi1iYXNlZCBpbXBsZW1lbnRhdGlvbnMu IE90aGVyIGV4YW1wbGVzIGluY2x1ZGU6DQogIOKAoiBtaW91IHdpdGggaXRzIHByaW9yaXR5IHF1 ZXVlIChzZWUgdGhlIFtWT0NBTF0gcHJvamVjdCkNCiAg4oCiIG1pcmFnZS1jcnlwdG8gd2l0aCBj ZXJ0YWluIGNyeXB0b2dyYXBoaWMgcHJpbWl0aXZlcyAoc2VlIHRoZSBbZmlhdF0NCiAgICBwcm9q ZWN0KQ0KICDigKIgYW5kIG5vdyB1dGNwIChzZWUgW25ldHNlbV0pDQoNCiAgVGhpcyBlZmZvcnQg aXMgc3RpbGwgaW4gaXRzIGVhcmx5IHN0YWdlcywgYnV0IHdlIHdlbGNvbWUgaW1wcm92ZW1lbnRz DQogIGFuZCBjb2xsYWJvcmF0aW9ucyBpbiB0aGlzIGFyZWEuDQoNCg0KICBbVk9DQUxdIDxodHRw czovL2lucmlhLmhhbC5zY2llbmNlL2hhbC0wMTU2MTA5ND4NCg0KICBbZmlhdF0gPGh0dHBzOi8v Z2l0aHViLmNvbS9taXQtcGx2L2ZpYXQtY3J5cHRvPg0KDQogIFtuZXRzZW1dIDxodHRwczovL3d3 dy5jbC5jYW0uYWMudWsvfnBlczIwL05ldHNlbS8+DQoNCg0KbWh0dHANCuKVjOKVjOKVjOKVjOKV jA0KDQogIFRvIHJlYWNoIGEgd2lkZXIgYXVkaWVuY2UsIHdlIGFsc28gcHJvdmlkZSBhbiBIVFRQ IHByb3RvY29sDQogIGltcGxlbWVudGF0aW9uIGZvciB1bmlrZXJuZWxzLCBidWlsZGluZyBvbiB0 aGUgd29yayB3ZSBzdGFydGVkIChhbmQNCiAgY3VycmVudGx5IHVzZSBpbiBwcm9kdWN0aW9uKSB3 aXRoIFtodHRwY2F0c10uDQoNCiAgYG1odHRwJyBpcyBlc3NlbnRpYWxseSBhIHVuaWtlcm5lbC1v cmllbnRlZCBjb3VudGVycGFydCB0byBgaHR0cGNhdHMnLA0KICB1c2luZyBbb2NhbWwtaDFdIGFu ZCBbb2NhbWwtaDJdIGFzIGl0cyBIVFRQLzEuMSBhbmQgSDIgYmFja2VuZHMuDQoNCg0KW2h0dHBj YXRzXSA8aHR0cHM6Ly9naXRodWIuY29tL3JvYnVyLWNvb3AvaHR0cGNhdHM+DQoNCltvY2FtbC1o MV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9yb2J1ci1jb29wL29jYW1sLWgxPg0KDQpbb2NhbWwtaDJd IDxodHRwczovL2dpdGh1Yi5jb20vYW5tb250ZWlyby9vY2FtbC1oMj4NCg0K4peKIEVjb3N5c3Rl bSBhbmQgY29tcG9zYWJpbGl0eQ0KDQogIEFsdGhvdWdoIGBtaHR0cCcgaXMgYSBzbWFsbCBwcm9q ZWN0LCBpdCBpbGx1c3RyYXRlcyBhIGJyb2FkZXINCiAgcHJpbmNpcGxlIGJlaGluZCBvdXIgY29v cGVyYXRpdmUncyBhcHByb2FjaCB0byBsaWJyYXJ5IGRldmVsb3BtZW50LiBBcw0KICB3ZSBoYXZl IFtzdGF0ZWQgYmVmb3JlXSwgZXZlcnl0aGluZyB3ZSBidWlsZCBpcyBkZXNpZ25lZCB0byBiZQ0K ICByZXVzYWJsZSB3aXRoIHNjaGVkdWxlcnMgb3RoZXIgdGhhbiBNaW91IGFuZCBpbiBjb250ZXh0 cyBvdGhlciB0aGFuDQogIHVuaWtlcm5lbHMuIFJlZ2FyZGxlc3Mgb2Ygd2hpY2ggc2NoZWR1bGVy IG9uZSBwcmVmZXJzLCB3ZSBiZWxpZXZlIGluIGENCiAgcHJhZ21hdGljLCBjb29wZXJhdGl2ZSBh cHByb2FjaCB0byBjb250cmlidXRpbmcgdG8gdGhlIGNvbW11bml0eS4NCg0KICBPdXIgcHJpbWFy eSBmb2N1cyByZW1haW5zIHVuaWtlcm5lbCBkZXZlbG9wbWVudCwgYnV0IHllYXJzIG9mDQogIGV4 cGVyaWVuY2UgYnVpbGRpbmcgcHJvdG9jb2wgYW5kIGZvcm1hdCBsaWJyYXJpZXMgaGF2ZSB0YXVn aHQgdXMgdGhhdA0KICBrZWVwaW5nIHRoZW0gc2NoZWR1bGVyLWFnbm9zdGljIGlzIGluIGV2ZXJ5 b25lJ3MgYmVzdCBpbnRlcmVzdCwgZm9yDQogIG1haW50YWluYWJpbGl0eSwgdGVzdGFiaWxpdHks IGFuZCByZWxpYWJpbGl0eSBhbGlrZS4gV2hlcmV2ZXINCiAgcG9zc2libGUsIHlvdSB3aWxsIGZp bmQgYSBnZW5lcmFsLXB1cnBvc2UgbGlicmFyeSBhbG9uZ3NpZGUgaXRzDQogIHVuaWtlcm5lbCBj b3VudGVycGFydDogYGh0dHBjYXRzJyBhbmQgYG1odHRwJyBhcmUgb25lIHN1Y2ggcGFpci4NCg0K DQogIFtzdGF0ZWQgYmVmb3JlXQ0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L29uLWNv bmN1cnJlbmN5LW1vZGVscy8xNTg5OS8xMz91PWRpbm9zYXVyZT4NCg0KDQpWaWZ1DQrilYzilYzi lYzilYwNCg0KICBBcyBbcHJldmlvdXNseSBhbm5vdW5jZWRdLCB3ZSBoYXZlIGRldmVsb3BlZCBh IHdlYiBmcmFtZXdvcmsgZm9yIE9DYW1sDQogIDUgY2FsbGVkIFt2aWZdLCB3aGljaCB3ZSB1c2Ug aW4gcHJvZHVjdGlvbiBmb3Igb3VyIFtidWlsZHMucm9idXIuY29vcF0NCiAgd2Vic2l0ZSAod2Ug cmVjb21tZW5kIHRoZSBbdHV0b3JpYWxdIHByZXNlbnRlZCBhdCBbRlVOIE9DYW1sXSAyMDI1KS4N Cg0KICBgdmlmJyBub3cgaGFzIGEgdW5pa2VybmVsIHZhcmlhbnQ6IGB2aWZ1Jy4gSXQgb2ZmZXJz IG5lYXJseSB0aGUgc2FtZQ0KICBpbnRlcmZhY2UgYXMgYHZpZicgKGV4Y2VwdCBmb3Igc3RhdGlj IGZpbGUgbWFuYWdlbWVudCksIG1ha2luZyBpdA0KICBwb3NzaWJsZSB0byBidWlsZCB3ZWJzaXRl cyBlbnRpcmVseSBpbiBPQ2FtbC4gSGVyZSBpcyBhIHNtYWxsDQogIHVuaWtlcm5lbCB0aGF0IGRp c3BsYXlzICJIZWxsbyBXb3JsZCEiOg0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgbGV0IGhl bGxvX3dvcmxkIHJlcSBfc2VydmVyICgpID0NCiAg4pSCICAgbGV0IG9wZW4gVmlmdS5SZXNwb25z ZS5TeW50YXggaW4NCiAg4pSCICAgbGV0KiAoKSA9IFZpZnUuUmVzcG9uc2Uud2l0aF90ZXh0IHJl cSAiSGVsbG8gV29ybGQhXG4iIGluDQogIOKUgiAgIFZpZnUuUmVzcG9uc2UucmVzcG9uZCBgT0sN CiAg4pSCIA0KICDilIIgbGV0IHJ1biAoaXB2NCwgZ2F0ZXdheSwgaXB2NikgPQ0KICDilIIgICBN a2VybmVsLihydW4gWyBybmc7IE1uZXQuc3RhY2sgfm5hbWU6InNlcnZpY2UiID9nYXRld2F5IH5p cHY2IGlwdjQgXSkNCiAg4pSCICAgQEAgZnVuIHJuZyAoZGFlbW9uLCB0Y3AsIHVkcCkgLT4NCiAg 4pSCICAgbGV0QCAoKSA9IGZ1biAoKSAtPiBNbmV0LmtpbGwgZGFlbW9uIGluDQogIOKUgiAgIGxl dEAgKCkgPSBmdW4gKCkgLT4gTWlyYWdlX2NyeXB0b19ybmdfbWtlcm5lbC5raWxsIHJuZyBpbg0K ICDilIIgICBsZXQgY2ZnID0gVmlmdS5Db25maWcudiA4MCBpbg0KICDilIIgICBsZXQgcm91dGVz ID0gVmlmdS5bIGdldCAocmVsIC8/PyBhbnkpIC0tPiBoZWxsb193b3JsZCBdIGluDQogIOKUgiAg IFZpZnUucnVuIH5jZmcgdGNwIHJvdXRlcyAoKQ0KICDilJTilIDilIDilIDilIANCg0KICAqZGlz Y2xhaW1lcio6IElmIHlvdSB3b3VsZCBsaWtlIHRvIHVzZSBgdmlmdScsIHBsZWFzZSBub3RlIHRo YXQNCiAgIGFsdGhvdWdoIGEgcmVjZW50IHJlbGVhc2UgaGFzIGJlZW4gbWFkZSwgb25lIGZpbmFs IGZpeCBpcyBzdGlsbA0KICAgbmVlZGVkIHRvIGNvbXBpbGUgYSB1bmlrZXJuZWwgd2l0aCB0aGlz IGxpYnJhcnkgKHRvIGF2b2lkIHB1bGxpbmcgaW4NCiAgIHRoZSBgdW5peCcgbW9kdWxlKS4gV2Ug cmVjb21tZW5kIHBpbm5pbmcgYHZpZnUnIGZvciBub3cuDQoNCg0KW3ByZXZpb3VzbHkgYW5ub3Vu Y2VkXQ0KPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4taHR0cGNhdHMtb2NhbWwtaDEt dmlmLWh1cmwtYS13ZWJzdGFjay1mb3Itb2NhbWwtNS8xNzEwND4NCg0KW3ZpZl0gPGh0dHBzOi8v Z2l0aHViLmNvbS9yb2J1ci1jb29wL3ZpZj4NCg0KW2J1aWxkcy5yb2J1ci5jb29wXSA8aHR0cHM6 Ly9idWlsZHMucm9idXIuY29vcD4NCg0KW3R1dG9yaWFsXSA8aHR0cHM6Ly9yb2J1ci1jb29wLmdp dGh1Yi5pby92aWYvPg0KDQpbRlVOIE9DYW1sXSA8aHR0cHM6Ly9mdW4tb2NhbWwuY29tPg0KDQoN ClVuaWtlcm5lbHMNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIEJlaGluZCBh bGwgdGhlc2UgbGlicmFyaWVzLCB0aGVyZSBhcmUgY29uY3JldGUgcHJvamVjdHMgdGhhdCB3ZSB3 b3VsZA0KICBsaWtlIHRvIHNoYXJlIHdpdGggeW91Og0KICDigKIgT3VyIFtgaW1tdXRhYmxlJ10g dW5pa2VybmVsLCBhIHdlYiBzZXJ2ZXIgZm9yIHN0YXRpYyBmaWxlcyAod2hpY2gNCiAgICBjYW4g YmUgZ2VuZXJhdGVkLCBmb3IgZXhhbXBsZSwgd2l0aCBbWU9DYW1sXSkuDQogIOKAoiBBIEROUyBy ZXNvbHZlciB1bmlrZXJuZWw6IFtgcGFnZWphdW5lJ10NCiAg4oCiIEEgc21hbGwgc2VhcmNoIGVu Z2luZSBmb3IgZW1haWxzIGZyb20gYW4gYXJjaGl2ZSBzdWNoIGFzIHRoZQ0KICAgIGNhbWwtbGlz dDogW2BibGFtZSddLiBNb3JlIGRldGFpbHMgYXJlIGF2YWlsYWJsZSBbaGVyZV0uDQoNCg0KW2Bp bW11dGFibGUnXSA8aHR0cHM6Ly9naXRodWIuY29tL2Rpbm9zYXVyZS9pbW11YWJsZT4NCg0KW1lP Q2FtbF0gPGh0dHBzOi8vZ2l0aHViLmNvbS94aHRtbGJvaS95b2NhbWw+DQoNCltgcGFnZWphdW5l J10gPGh0dHBzOi8vZ2l0aHViLmNvbS9kaW5vc2F1cmUvcGFnZWphdW5lPg0KDQpbYGJsYW1lJ10g PGh0dHBzOi8vZ2l0aHViLmNvbS9yb2J1ci1jb29wL2JsYW1lPg0KDQpbaGVyZV0NCjxodHRwczov L2Jsb2cucm9idXIuY29vcC9hcnRpY2xlcy8yMDI1LTA0LTEyLXB0dC1zZWFyY2gtd2ViYXBwLmh0 bWw+DQoNCg0KQ29uY2x1c2lvbg0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAg QWZ0ZXIgc2V2ZXJhbCB5ZWFycyBvZiB3b3JrLCB3ZSBhcmUgbm93IGFibGUgdG8gZGV2ZWxvcCB1 bmlrZXJuZWxzDQogIHdpdGggT0NhbWwgNSBpbiBlYXJuZXN0LiBXZSBob3BlIHRoYXQgb3VyIG5l dyB3b3JrZmxvdyB3aWxsIGJlIG9mDQogIGludGVyZXN0IHRvIHRoZSBjb21tdW5pdHkgYW5kIHRo YXQgdGhlc2UgbGlicmFyaWVzIHdpbGwgYmUgYSB1c2VmdWwNCiAgY29udHJpYnV0aW9uIHRvIHRo ZSBPQ2FtbCBlY29zeXN0ZW0uDQoNCiAgSWYgeW91IHdvdWxkIGxpa2UgdG8gdHJ5IGl0IG91dCwg d2UgcmVjb21tZW5kIHN0YXJ0aW5nIHdpdGggdGhlIFttbmV0DQogIHR1dG9yaWFsXSBhbmQgdGhl IFtta2VybmVsIGRvY3VtZW50YXRpb25dLiBGZWVsIGZyZWUgdG8gb3BlbiBpc3N1ZXMgb3INCiAg cmVhY2ggb3V0IHRvIHVzIGlmIHlvdSBoYXZlIGFueSBxdWVzdGlvbnMhDQoNCg0KW21uZXQgdHV0 b3JpYWxdIDxodHRwczovL3JvYnVyLWNvb3AuZ2l0aHViLmlvL21uZXQvPg0KDQpbbWtlcm5lbCBk b2N1bWVudGF0aW9uXQ0KPGh0dHBzOi8vcm9idXItY29vcC5naXRodWIuaW8vbWtlcm5lbC9sb2Nh bC9ta2VybmVsL01rZXJuZWwvaW5kZXguaHRtbD4NCg0KDQpFeHBlcmltZW50OiBmb3JtYXQtbGlu ZQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5v cmcvdC9hbm4tZXhwZXJpbWVudC1mb3JtYXQtbGluZS8xNzg1NC8xPg0KDQoNCkVtaWxlIFRyb3Rp Z25vbiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEkgbWFkZSB0aGlzIGxpdHRs ZSBleHBlcmltZW50IGEgd2hpbGUgYmFjazoNCiAgPGh0dHBzOi8vZ2l0aHViLmNvbS9haHJlZnMv Zm9ybWF0LWxpbmU+DQoNCiAgVGhlIGlkZWEgaXMgdG8gcHJvdmlkZSBhIGNvbXBsZW1lbnQgdG8g b2NwLWluZGVudCB0byBkZWNpZGUgd2hpY2gNCiAgdG9rZW4gc2hvdWxkIGJlIHNlcGFyYXRlZCBi eSB3aGl0ZXNwYWNlIGFuZCB3aGljaCBzaG91bGQgbm90LiBGb3Igbm93DQogIGl0IGlzIGJhc2Vk IG9ubHkgb24gbGV4aW5nIGluZm9ybWF0aW9uLCB3aGljaCBtYWtlIHRoZSBjb2RlIHNpbXBsZSBi dXQNCiAgYWxzbyBkb2VzIG5vdCBhbHdheXMgcHJvdmlkZSBlbm91Z2ggaW5mb3JtYXRpb24gdG8g aGF2ZSBhIG5pY2UNCiAgZm9ybWF0dGluZy4NCg0KICBBbiBpZGVhIG9mIHRoZSBvdXRwdXQgY2Fu IGJlIHJlYWQgaGVyZToNCiAgPGh0dHBzOi8vZ2l0aHViLmNvbS9haHJlZnMvZm9ybWF0LWxpbmUv YmxvYi9tYXN0ZXIvdGVzdC9ydW4udD4NCg0KICBUaGUgcHJvamVjdCBpdHNlbGYgaXMgZm9ybWF0 dGVkIHdpdGggb2NhbWxmb3JtYXQsIGFuZCBpbiB0aGUgdGhlcmUgaXMNCiAgYSBkaWZmIG9mIHdo YXQgdGhpcyBjaGFuZ2VzIGNvbXBhcmVkIHRvIG9jYW1sZm9ybWF0LCBvbiB0aGUgbWFpbg0KICBz b3VyY2UgZmlsZS4NCg0KICBJIHRoaW5rIHRoaXMgYXBwcm9hY2ggY291bGQgYmUgaW1wcm92ZWQg YnkgaGF2aW5nIGEgaHlicmlkIGFzdC10b2tlbg0KICBzdHJlYW0gZGF0YXN0cnVjdHVyZS4gU29t ZXRoaW5nIHdoZXJlIHlvdSB3b3JrIG9uIGEgc3RyZWFtIG9mIHRva2VuDQogIGJ1dCB5b3UgY2Fu IHF1ZXJ5IHRoZSBBU1QgY29udGV4dCBvZiBhIGdpdmVuIHRva2VuLg0KDQogIFdoYXQgZG8geW91 IHRoaW5rID8NCg0KDQpDYW1sIGluIHRoZSBDYXBpdGFsIC0gUmVnaXN0cmF0aW9ucyBPcGVuIQ0K 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9h bm4tY2FtbC1pbi10aGUtY2FwaXRhbC1yZWdpc3RyYXRpb25zLW9wZW4vMTc3NzYvNj4NCg0KDQpD b250aW51aW5nIHRoaXMgdGhyZWFkLCBTYWNoYSBBeW91biBhbm5vdW5jZWQNCuKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgA0KDQogIEFuZCBoZXJlIGlzIHRoZSBbbGluayB0byB0aGUgcmVjb3JkaW5nXSEN Cg0KICBXZSdkIGxpa2UgdG8gdGhhbmsgb3VyIHNwZWFrZXJzIEplcmVteSBhbmQgTmljayBhZ2Fp biwgYXMgd2VsbCBhcyB0aGUNCiAgfjMwIGF0dGVuZGVlcyB0byB0aGUgbWVldHVwISBJdCB3YXMg Z3JlYXQgaGF2aW5nIHlvdSwgYW5kIHdlIGhvcGUgdG8NCiAgc2VlIHlvdSBhZ2FpbiBuZXh0IHRp bWUgOikNCg0KDQpbbGluayB0byB0aGUgcmVjb3JkaW5nXSA8aHR0cHM6Ly93d3cueW91dHViZS5j b20vd2F0Y2g/dj02Q005SjJDNThkZz4NCg0KDQpFeHBlcmltZW50YWwgdG9vbHMgZm9yIG1pZ3Jh dGluZyBmcm9tIEx3dCB0byBFaW8NCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQog IEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWV4cGVyaW1lbnRh bC10b29scy1mb3ItbWlncmF0aW5nLWZyb20tbHd0LXRvLWVpby8xNzg1NS8xPg0KDQoNCkp1bGVz IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA DQoNCiAgV2UgZGV2ZWxvcGVkIHRvb2xzIHRvIGhlbHAgdXMgbWlncmF0ZSBPY3NpZ2VuIGxpYnJh cmllcyBhbmQNCiAgYXBwbGljYXRpb25zIHRvIGRpcmVjdC1zdHlsZSBjb25jdXJyZW5jeSBhbmQg d2UgYXJlIGhhcHB5IHRvIHNoYXJlDQogIHRoZW0uDQoNCiAgVGhlcmUgYXJlIDQgaW5kZXBlbmRl bnQgdG9vbHMgZm9yIGRpZmZlcmVudCBwdXJwb3NlczoNCg0KICDigKIgUmVwbGFjaW5nIGV2ZXJ5 IHVzZXMgb2YgYGx3dF9wcHgnIHdpdGggYEx3dCcgZnVuY3Rpb24gY2FsbHMNCiAgICAoZS5nLiBy ZXBsYWNpbmcgYGxldCVsd3QgLi4uIGluJyB3aXRoIGBsZXQqIC4uLiBpbicpLiAgVGhpcyBpcw0K ICAgIHB1cmVseSBzeW50YWN0aWMgYW5kIGFsbG93cyB5b3UgdG8gZWFzaWx5IHJlbW92ZSBhIFBQ WC4gSXQgaGFuZGxlcw0KICAgIGluc2VydGluZyBgb3BlbiBMd3QuU3ludGF4JyBhdCB0aGUgdG9w IG9mIHRoZSBmaWxlLg0KDQogIOKAoiBXYXJuaW5nIGFib3V0IG9jY3VycmVuY2VzIG9mIGBsZXQg XyA9IC4uLicgYW5kIGBpZ25vcmUgLi4uJywgd2hpY2gNCiAgICBtYWtlIHRoZSBuZXh0IHRvb2xz IGxlc3MgcmVsaWFibGUuICBUaGVzZSBhcmUgY2FsbGVkIOKAnGltcGxpY2l0IGZvcmvigJ0NCiAg ICBiZWNhdXNlIGNvZGUgcnVuIGNvbmN1cnJlbnRseSBpZiB0aGUgaWdub3JlZCB2YWx1ZSBpcyBh biBMd3QNCiAgICB0aHJlYWQuIFRoaXMgcmVxdWlyZXMgYW4gZXhwbGljaXQgY2FsbCB0byBgRmli ZXIuZm9yaycgd2l0aCBFaW8uDQoNCiAg4oCiIE1pZ3JhdGluZyB1c2VzIG9mIGBMd3RfbG9nJyB0 byBgTG9ncycuICBJdCB3YXMgdXNlZCBvbg0KICAgIFtvY3NpZ2Vuc2VydmVyXSBmb3IgZXhhbXBs ZS4gIEF0IHRoaXMgcG9pbnQgd2UgZ2VuZXJhdGUgY29kZSB3b3JraW5nDQogICAgYXMgYmVmb3Jl IGFuZCBkaWQgbm90IGludHJvZHVjZSBhIGRlcGVuZGVuY3kgb24gRWlvLg0KDQogIOKAoiBNaWdy YXRpbmcgdXNlcyBvZiBgTHd0JyB0byBgRWlvJy4gSXQgcmV3cml0ZXMgY29kZSB3cml0dGVuIGlu DQogICAgbW9uYWRpYyBzdHlsZSBpbnRvIGRpcmVjdC1zdHlsZSwgZm9yIGV4YW1wbGUgdGhpcyBj b2RlOg0KDQogICAg4pSM4pSA4pSA4pSA4pSADQogICAg4pSCIGxldCBfID0NCiAgICDilIIgICBs ZXQqIHggPSBmIDEgaW4NCiAgICDilIIgICBsZXQrIHkgPSBmIDIgaW4NCiAgICDilIIgICBMd3Qu YmluZCAoZiAzKSAoZnVuIHogLT4NCiAgICDilIIgICAgIEx3dC5yZXR1cm4gKHggKyB5ICsgeikp DQogICAg4pSU4pSA4pSA4pSA4pSADQoNCiAgICBpcyByZXdyaXR0ZW4gdG86DQoNCiAgICDilIzi lIDilIDilIDilIANCiAgICDilIIgbGV0IF8gPQ0KICAgIOKUgiAgIGxldCB4ID0gZiAxIGluDQog ICAg4pSCICAgbGV0IHkgPSBmIDIgaW4NCiAgICDilIIgICBsZXQgeiA9IGYgMyBpbg0KICAgIOKU giAgIHggKyB5ICsgeg0KICAgIOKUlOKUgOKUgOKUgOKUgA0KDQogICAgSXQgYWxzbyByZXdyaXRl IGBMd3QnIGZ1bmN0aW9uIGNhbGxzIHRvIHRoZWlyIGVxdWl2YWxlbnQgaW4gYEVpbycNCiAgICBh bmQgaGFuZGxlcyBtYW55IElPIG9wZXJhdGlvbnMuDQoNCiAgICBVbmZvcnR1bmF0ZWx5LCB0aGlz IHRvb2wgZG9lc27igJl0IGdlbmVyYXRlIGZ1bGx5IGVxdWl2YWxlbnQgY29kZSBhbmQNCiAgICBy ZXF1aXJlcyBtYW51YWwgbW9kaWZpY2F0aW9ucy4gQ29tbWVudHMgYXJlIGluc2VydGVkIGluIG1h bnkgcGxhY2VzDQogICAgd2hlcmUgaW50ZXJ2ZW50aW9uIGlzIG5lZWRlZC4NCg0KICAgIEFuIGV4 YW1wbGUgb2YgZ2VuZXJhdGVkIGluY29ycmVjdCBjb2RlIGlzOg0KDQogICAg4pSM4pSA4pSA4pSA 4pSADQogICAg4pSCIGxldCBfID0NCiAgICDilIIgICBsZXQgYSA9IG9wZXJhdGlvbl8xICgpIGlu DQogICAg4pSCICAgbGV0KiBiID0gb3BlcmF0aW9uXzIgKCkgaW4NCiAgICDilIIgICBsZXQqIGEg PSBhIGluDQogICAg4pSCICAgTHd0LnJldHVybiAoYSArIGIpDQogICAg4pSU4pSA4pSA4pSA4pSA DQoNCiAgICB3aGljaCBpcyByZXdyaXR0ZW4gaW50bzoNCg0KICAgIOKUjOKUgOKUgOKUgOKUgA0K ICAgIOKUgiBsZXQgXyA9DQogICAg4pSCICAgbGV0IGEgPSBvcGVyYXRpb25fMSAoKSBpbg0KICAg IOKUgiAgIGxldCBiID0gb3BlcmF0aW9uXzIgKCkgaW4NCiAgICDilIIgICBsZXQgYSA9IGEgaW4N CiAgICDilIIgICBhICsgYg0KICAgIOKUlOKUgOKUgOKUgOKUgA0KDQogICAgVGhpcyBpcyBpbmNv cnJlY3QgYmVjYXVzZSBgb3BlcmF0aW9uXzEnIGFuZCBgb3BlcmF0aW9uXzInIGFyZSBub3cNCiAg ICBzZXF1ZW50aWFsIGJ1dCB3ZXJlIGNvbmN1cnJlbnQgYmVmb3JlLiBUaGlzIGlzIGEgY2FzZSBv ZiBhbiBpbXBsaWNpdA0KICAgIGZvcmsgdGhhdCBjYW5ub3QgZWFzaWx5IGJlIGRldGVjdGVkLiBU aGUgY29ycmVjdCB0cmFuc2Zvcm1hdGlvbg0KICAgIHdvdWxkIGJlOg0KDQogICAg4pSM4pSA4pSA 4pSA4pSADQogICAg4pSCIGxldCBfID0NCiAgICDilIIgICBsZXQgYSwgYiA9IEVpby5GaWJlci5w YWlyIG9wZXJhdGlvbl8xIG9wZXJhdGlvbl8yIGluDQogICAg4pSCICAgYSArIGINCiAgICDilJTi lIDilIDilIDilIANCg0KICAgIFdlIGNvdWxkIGFjaGlldmUgdGhlIG1pZ3JhdGlvbiBvbiBbZWxp b21dIGFuZCBbb2NzaWdlbnNlcnZlcl0NCg0KICBBbGwgdGhlIHRvb2xzIHVzZSBPQ2FtbGZvcm1h dCB1bmRlciB0aGUgaG9vZCB0byBnZW5lcmF0ZSB0aGUNCiAgY29kZS4gVGhpcyBoYXMgdGhlIGlu Y29udmVuaWVudCBvZiBlbmZvcmNpbmcgdGhlIHVzZSBvZiBPQ2FtbGZvcm1hdA0KICBiZWZvcmUg dXNpbmcgdGhlbSBhcyB0aGV5IHdpbGwgcmVmb3JtYXQgdGhlIGVudGlyZSBjb2RlYmFzZS4NCg0K ICBUaGUgbGFzdCB0d28gdG9vbHMgdXNlIE1lcmxpbiB1bmRlciB0aGUgaG9vZCB0byBsb2NhdGUg dXNlcyBvZiBgTHd0Jw0KICBmdW5jdGlvbnMgaW4gdGhlIHNvdXJjZSBmaWxlcy4gVGhpcyB3b3Jr cyBieSByZWFkaW5nIE1lcmxpbuKAmXMNCiAgb2NhbWwtaW5kZXggZmlsZXMgYnVpbHQgYnkgRHVu ZSB0byBleHRyYWN0IHRoZSBsb2NhdGlvbiBpbiB0aGUgc291cmNlDQogIGZpbGVzIHRoYXQgd2Ug bmVlZC4NCg0KICBDdXJyZW50bHksIGl0IG9ubHkgc3VwcG9ydHMgRWlvIGFzIGEgYmFja2VuZCBi dXQgY2FuIGVhc2lseSBiZQ0KICBbYWRhcHRlZF0gdG8gb3RoZXIgZGlyZWN0LXN0eWxlIGNvbmN1 cnJlbmN5IGxpYnJhcmllcy4NCg0KICBUaGlzIHdvcmsgd2FzIG1hZGUgcG9zc2libGUgdGhhbmtz IHRvIHRoZSBzdXBwb3J0IG9mIHRoZSBbTkdJIFplcm8NCiAgQ29yZSBmdW5kXSB0aHJvdWdoIHRo ZSBbTmxuZXQgZm91bmRhdGlvbl0sIGFuZCBpcyBwZXJmb21lZCBieQ0KICBbVGFyaWRlc10uDQoN Cg0KW29jc2lnZW5zZXJ2ZXJdIDxodHRwczovL2dpdGh1Yi5jb20vb2NzaWdlbi9vY3NpZ2Vuc2Vy dmVyL3B1bGwvMjU2Pg0KDQpbZWxpb21dIDxodHRwczovL2dpdGh1Yi5jb20vb2NzaWdlbi9lbGlv bS9wdWxsLzg0Nj4NCg0KW29jc2lnZW5zZXJ2ZXJdIDxodHRwczovL2dpdGh1Yi5jb20vb2NzaWdl bi9vY3NpZ2Vuc2VydmVyL3B1bGwvMjY5Pg0KDQpbYWRhcHRlZF0NCjxodHRwczovL2dpdGh1Yi5j b20vdGFyaWRlcy9jaWFvLWx3dC9ibG9iL21haW4vYmluL2NpYW9fbHd0L3RvX2RpcmVjdF9zdHls ZS9jb25jdXJyZW5jeV9iYWNrZW5kLm1sPg0KDQpbTkdJIFplcm8gQ29yZSBmdW5kXSA8aHR0cHM6 Ly9ubG5ldC5ubC90aGVtYS9OR0laZXJvQ29yZS5odG1sPg0KDQpbTmxuZXQgZm91bmRhdGlvbl0g PGh0dHBzOi8vbmxuZXQubmwvPg0KDQpbVGFyaWRlc10gPGh0dHBzOi8vdGFyaWRlcy5jb20vPg0K DQoNCkZpcnN0IGFscGhhIHJlbGVhc2Ugb2YgT0NhbWwgNS41LjANCuKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rp c2N1c3Mub2NhbWwub3JnL3QvZmlyc3QtYWxwaGEtcmVsZWFzZS1vZi1vY2FtbC01LTUtMC8xNzg1 Ni8xPg0KDQoNCm9jdGFjaHJvbiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEZvdXIgbW9udGhzIGFmdGVyIHRo ZSByZWxlYXNlIG9mIE9DYW1sIDUuNC4wLCB0aGUgc2V0IG9mIG5ldyBmZWF0dXJlcw0KICBmb3Ig dGhlIGZ1dHVyZSB2ZXJzaW9uIDUuNS4wIG9mIE9DYW1sIGhhcyBiZWVuIGZyb3plbi4gV2UgYXJl IHRodXMNCiAgaGFwcHkgdG8gYW5ub3VuY2UgdGhlIGZpcnN0IGFscGhhIHJlbGVhc2UgZm9yIE9D YW1sIDUuNS4wLg0KDQogIFRoaXMgYWxwaGEgdmVyc2lvbiBpcyBoZXJlIHRvIGhlbHAgZmVsbG93 IGhhY2tlcnMgam9pbiB1cyBlYXJseSBpbiBvdXINCiAgYnVnIGh1bnRpbmcgYW5kIG9wYW0gZWNv c3lzdGVtIGZpeGluZyBmdW4gKHNlZSBiZWxvdyBmb3IgdGhlDQogIGluc3RhbGxhdGlvbiBpbnN0 cnVjdGlvbnMpLiBNb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZWxlYXNlIHByb2Nlc3MNCiAg aXMgYXZhaWxhYmxlIGF0DQogIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvYmxvYi90 cnVuay9yZWxlYXNlLWluZm8vaW50cm9kdWN0aW9uLm1kPi4NCg0KICBUaGUgcHJvZ3Jlc3Mgb24g c3RhYmlsaXNpbmcgdGhlIGVjb3N5c3RlbSBpcyB0cmFja2VkIG9uIHRoZSBbb3BhbQ0KICByZWFk aW5lc3MgZm9yIDUuNS4wIG1ldGEtaXNzdWVdIC4NCg0KICBUaGVyZSBpcyBhbHNvIGEgY29tcGFu aW9uIGFscGhhIG9wYW0gcmVwb3NpdG9yeSBhdmFpbGFibGUgZm9yIHRoaXMNCiAgYWxwaGEgcmVs ZWFzZQ0KICDilIzilIDilIDilIDilIANCiAg4pSCICQgb3BhbSByZXBvIGFkZCBhbHBoYSBnaXQr aHR0cHM6Ly9naXRodWIuY29tL2tpdC10eS1rYXRlL29wYW0tYWxwaGEtcmVwb3NpdG9yeS5naXQN CiAg4pSU4pSA4pSA4pSA4pSADQogIHdoaWNoIGNvbnRhaW5zIGluLXByb2dyZXNzIGFscGhhIHJl bGVhc2VzIG9mIG9wYW0gcGFja2FnZXMgdGhhdCBhcmUNCiAgYmVpbmcgdXBkYXRlZCBmb3IgT0Nh bWwgNS41LjAgLg0KDQogIFRoZSBmdWxsIHJlbGVhc2UgaXMgZXhwZWN0ZWQgYmV0d2VlbiBNYXkg YW5kIEp1bmUuIFRoZXJlIGFyZSBtb3JlDQogIGluZm9ybWF0aW9uIGF2YWlsYWJsZSBpbiB0aGUg W3Byb3NwZWN0aXZlIHJlbGVhc2UgY2FsZW5kYXJdLg0KDQogIElmIHlvdSBmaW5kIGFueSBidWdz LCBwbGVhc2UgcmVwb3J0IHRoZW0gb24gdGhlIFtPQ2FtbCdzIGlzc3VlDQogIHRyYWNrZXJdLg0K DQogIElmIHlvdSBhcmUgaW50ZXJlc3RlZCBpbiB0aGUgb25nb2luZyBsaXN0IG9mIG5ldyBmZWF0 dXJlcyBhbmQgYnVnDQogIGZpeGVzLCB0aGUgdXBkYXRlZCBbY2hhbmdlIGxvZyBmb3IgT0NhbWwg NS41LjAgaXMgYXZhaWxhYmxlIG9uDQogIEdpdEh1Yl0uDQoNCiAgSGFwcHkgaGFja2luZywgRmxv cmlhbiBBbmdlbGV0dGkgZm9yIHRoZSBPQ2FtbCB0ZWFtDQoNCg0KW29wYW0gcmVhZGluZXNzIGZv ciA1LjUuMCBtZXRhLWlzc3VlXQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtLXJlcG9z aXRvcnkvaXNzdWVzLzI5NDYzPg0KDQpbcHJvc3BlY3RpdmUgcmVsZWFzZSBjYWxlbmRhcl0NCjxo dHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvYmxvYi90cnVuay9yZWxlYXNlLWluZm8vY2Fs ZW5kYXIubWQ+DQoNCltPQ2FtbCdzIGlzc3VlIHRyYWNrZXJdIDxodHRwczovL2dpdGh1Yi5jb20v b2NhbWwvb2NhbWwvaXNzdWVzPg0KDQpbY2hhbmdlIGxvZyBmb3IgT0NhbWwgNS41LjAgaXMgYXZh aWxhYmxlIG9uIEdpdEh1Yl0NCjxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvYmxvYi81 LjUvQ2hhbmdlcz4NCg0KSW5zdGFsbGF0aW9uIEluc3RydWN0aW9ucw0K4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWMDQoNCiAgVGhlIGJhc2UgY29tcGlsZXIgY2FuIGJlIGluc3RhbGxlZCBhcyBhbiBvcGFtIHN3 aXRjaCB3aXRoIHRoZQ0KICBmb2xsb3dpbmcgY29tbWFuZHMgb24gb3BhbSAyLjEgYW5kIGxhdGVy Og0KDQogIG9wYW0gdXBkYXRlIG9wYW0gc3dpdGNoIGNyZWF0ZSA1LjUuMH5hbHBoYTENCg0KICBU aGUgc291cmNlIGNvZGUgZm9yIHRoZSBhbHBoYSBpcyBhbHNvIGF2YWlsYWJsZSBhdCB0aGVzZSBh ZGRyZXNzZXM6DQoNCiAg4oCiIEdpdEh1YjogPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2Ft bC9hcmNoaXZlLzUuNS4wLWFscGhhMS50YXIuZ3o+DQogIOKAoiBPQ2FtbCBhcmNoaXZlcyBhdCBJ bnJpYToNCiAgICA8aHR0cHM6Ly9jYW1sLmlucmlhLmZyL3B1Yi9kaXN0cmliL29jYW1sLTUuNS9v Y2FtbC01LjUuMH5hbHBoYTEudGFyLmd6Pg0KDQoNCkZpbmUtVHVuZWQgQ29tcGlsZXIgQ29uZmln dXJhdGlvbg0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAg SWYgeW91IHdhbnQgdG8gdHdlYWsgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGNvbXBpbGVyLCB5 b3UgY2FuIHN3aXRjaA0KICB0byB0aGUgb3B0aW9uIHZhcmlhbnQgd2l0aDoNCg0KICDilIzilIDi lIDilIDilIANCiAg4pSCIG9wYW0gdXBkYXRlDQogIOKUgiBvcGFtIHN3aXRjaCBjcmVhdGUgPHN3 aXRjaF9uYW1lPiBvY2FtbC12YXJpYW50cy41LjUuMH5hbHBoYTErb3B0aW9ucyA8b3B0aW9uX2xp c3Q+DQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIHdoZXJlIGBvcHRpb25fbGlzdCcgaXMgYSBzcGFj ZSBzZXBhcmF0ZWQgbGlzdCBvZiBgb2NhbWwtb3B0aW9uLSonDQogIHBhY2thZ2VzLiBGb3IgaW5z dGFuY2UsIGZvciBhIGZsYW1iZGEgYW5kIG5vLWZsYXQtZmxvYXQtYXJyYXkgc3dpdGNoOg0KICDi lIzilIDilIDilIDilIANCiAg4pSCIG9wYW0gc3dpdGNoIGNyZWF0ZSA1LjUuMH5hbHBoYTErZmxh bWJkYStuZmZhIG9jYW1sLXZhcmlhbnRzLjUuNS4wfmFscGhhMStvcHRpb25zIG9jYW1sLW9wdGlv bi1mbGFtYmRhIG9jYW1sLW9wdGlvbi1uby1mbGF0LWZsb2F0LWFycmF5DQogIOKUlOKUgOKUgOKU gOKUgA0KDQogIEFsbCBhdmFpbGFibGUgb3B0aW9ucyBjYW4gYmUgbGlzdGVkIHdpdGggYG9wYW0g c2VhcmNoIG9jYW1sLW9wdGlvbicuDQoNCg0KTm90SW5yaWFDYW1sX1N0ZC5XZW52QDAuMS4wIC0g Y3JlYXRlIFdpbmRvd3MgZW52cyBvbiBtYWNPUyBbZGswXQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ DQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tbm90aW5y aWFjYW1sLXN0ZC13ZW52LTAtMS0wLWNyZWF0ZS13aW5kb3dzLWVudnMtb24tbWFjb3MtZGswLzE3 ODU4LzE+DQoNCg0KamJlY2tmb3JkIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSXQgaXMgbXkgcGxlYXN1cmUg dG8gYW5ub3VuY2UgdGhlIGZvbGxvd2luZyBwYWNrYWdlIGZvciBbdGhlIGRrMCBidWlsZA0KICBz eXN0ZW1dIHRoYXQgY3JlYXRlcyBhIFdpbmRvd3MgZW52aXJvbm1lbnQgKCJ3ZW52IikgdXNpbmcg YSBjdXN0b20NCiAgV2luZSBidWlsZCBmb3IgbWFjT1M6DQoNCiAg4oCiIFtOb3RJbnJpYUNhbWxf U3RkLldlbnZAMC4xLjBdDQoNCiAgSGVyZSBpcyBhIHNhbXBsZSBzZXNzaW9uOg0KDQogIOKUjOKU gOKUgOKUgOKUgA0KICDilIIgIyBTaW1wbGVzdCB3YXkgdG8gaW5zdGFsbCBkazAgdG9kYXkuIFVz ZSB+Z2l0IHB1bGx+IGlmIGV4aXN0cyBhbHJlYWR5LiANCiAg4pSCICQgZ2l0IGNsb25lIC0tYnJh bmNoIFYyXzUgaHR0cHM6Ly9naXRodWIuY29tL2Rpc2t1di9kay5naXQgZGtzcmMNCiAg4pSCIA0K ICDilIIgIyBDbGVhciBvdXQgZGF0YSwgY2FjaGUgYW5kIGludGVybWVkaWF0ZSBmaWxlcyBmcm9t IGFueSBwcmlvcg0KICDilIIgIyBleHBlcmltZW50cyAoZnJvbSB0aGUgIi0tdHJpYWwiIG9wdGlv biBzZWVuIGluIFtBTk5dIHBvc3RzKQ0KICDilIIgJCBybSAtcmYgdC8NCiAg4pSCIA0KICDilIIg IyBXaXRoIHRoZSBkZWZhdWx0IEx1YSBydWxlcyAoIi1JIGRrc3JjL2V0Yy9kay92IiksIHJ1biB0 aGUNCiAg4pSCICMgT0NhbWwgV2luZG93cyBlbnZpcm9ubWVudCBjcmVhdGlvbiBydWxlICgicnVu DQogIOKUgiAjIE5vdElucmlhQ2FtbF9TdGQuV2Vudi5DcmVhdGVAMC4xLjAiKS4gVGVsbCB0aGUg cnVsZSB0byBjcmVhdGUgdGhlDQogIOKUgiAjIHdlbnYgYXQgdGFyZ2V0L215LXdlbnYvICgiZGly PS4uLiIpIGFuZCBtYWtlIGEgbW91bnQNCiAg4pSCICMgKCJtb3VudFtdPS4uLiIpIGluc2lkZSB0 aGUgd2VudiB3aGVyZSB0aGUgVW5peCBkaXJlY3RvcnkgJFBXRCBpcw0KICDilIIgIyBtYXBwZWQg dG8gV2luZG93cyBNOlxwcm9qZWN0LiBEZXBlbmRpbmcgb24gSW50ZXJuZXQsIGV4cGVjdCAzLTQN CiAg4pSCICMgbWludXRlcyBmb3IgYSBzaW5nbGUtdGhyZWFkZWQgZG93bmxvYWQgb2YgYXJ0aWZh Y3RzICg1ODFNQikuDQogIOKUgiAkIGRrc3JjL2RrMCAtLXRyaWFsIC1JIGRrc3JjL2V0Yy9kay92 IFwNCiAg4pSCICAgICBydW4gTm90SW5yaWFDYW1sX1N0ZC5XZW52LkNyZWF0ZUAwLjEuMCBcDQog IOKUgiAgICAgZGlyPSRQV0QvdGFyZ2V0L215LXdlbnYgXA0KICDilIIgICAgICJtb3VudFtdPXR5 cGU9YmluZCxzcmM9JFBXRCxkc3Q9TTovcHJvamVjdCINCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAg 4pSM4pSA4pSA4pSA4pSADQogIOKUgiAjIFRoZW4gZW50ZXIgdGhlIHdlbnYgYnkgcnVubmluZyBD b21tYW5kIFByb21wdCAoImNtZC5leGUiKS4gVHVybg0KICDilIIgIyBvZmYgV2luZSBkZWJ1ZyBt ZXNzYWdlcyAoIldJTkVERUJVRz0tYWxsIikuIFJlbWVtYmVyIHRoYXQNCiAg4pSCICMgQ3RybC1a IGlzIHRoZSBXaW5kb3dzIGVxdWl2YWxlbnQgb2YgQ3RybC1EIChFT0YpIGluIFVuaXguDQogIOKU giAkIFdJTkVERUJVRz0tYWxsIHRhcmdldC9teS13ZW52L2Jpbi9lbnRlciBjbWQuZXhlDQogIOKU giANCiAg4pSCIE1pY3Jvc29mdCBXaW5kb3dzIDEwLjAuMTkwNDUNCiAg4pSCIFo6XD4gb2NhbWxv cHQgLWNvbmZpZw0KICDilIIgWjpcPiBnY2MgLS12ZXJzaW9uDQogIOKUgiBaOlw+IGRpciBNOg0K ICDilIIgMDIvMjcvMjAyNiAxMDoyNCBBTSA8RElSPiBwcm9qZWN0DQogIOKUgiBaOlw+IG9jYW1s DQogIOKUgiBPQ2FtbCB2ZXJzaW9uIDUuNC4xDQogIOKUgiANCiAg4pSCIEVudGVyICNoZWxwOzsg Zm9yIGhlbHAuDQogIOKUgiANCiAg4pSCICMgMSsxIDs7DQogIOKUgiAtIDogaW50ID0gMg0KICDi lIIgDQogIOKUgiAjIF5aDQogIOKUgiANCiAg4pSCIFo6XD4gZWNobyBsZXQgKCkgPSBwcmludF9l bmRsaW5lICJhYmN4eXoiID4gbGV0dGVycy5tbA0KICDilIIgWjpcPiBvY2FtbG9wdCAtbyBsZXR0 ZXJzLmV4ZSBsZXR0ZXJzLm1sDQogIOKUgiBaOlw+IC5cbGV0dGVycy5leGUNCiAg4pSCIGFiY3h5 eg0KICDilIIgWjpcPiBleGl0DQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIERldGFpbHM6DQoNCiAg 4oCiIE1pbkdXIHdpdGggVUNSVCBXaW5kb3dzIEFQSSBhbmQgTExWTSB0b29sY2hhaW4gKGxsdm0t bWluZ3cpIGZvciBXaW5lDQogICAgb24gdGhlIGhvc3QgKG1hY09TKS4gWDExIGhhcyBiZWVuIGRp c2FibGVkLg0KICDigKIgTWluR1cgd2l0aCBNU1ZDUlQgV2luZG93cyBBUEkgYW5kIEdOVSBjb21w aWxlciBhbmQgQnVzeUJveCBiaW5hcmllcw0KICAgICh3NjRkZXZraXQpIGluc2lkZSBXaW5kb3dz IGd1ZXN0Lg0KICDigKIgV2luZSBoYXMgZ29vZCBzdXBwb3J0IGZvciBwcm9ncmFtcyB0aGF0IHVz ZSBXaW5kb3dzIGNvbnZlbnRpb25zDQogICAgKE1TVkMsIFdpbmRvd3MgQVBJIHJhdGhlciB0aGFu IGBzeXNjYWxsJywgZXRjKS4gQnV0IHRoZXJlIGFyZQ0KICAgIGltcG9ydGFudCBwcm9ncmFtcyB0 aGF0IHdvbid0IHdvcmsgY29ycmVjdGx5IHRvZGF5OiBNU1lTMi9DeWd3aW4sDQogICAgUnVzdCB1 dXRpbHMuDQoNCiAgRW5qb3khIOKAk2pvbmFoDQoNCg0KW3RoZSBkazAgYnVpbGQgc3lzdGVtXQ0K PGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tdGhlLWRrMC1idWlsZC1zeXN0ZW0vMTc3 MDk+DQoNCltOb3RJbnJpYUNhbWxfU3RkLldlbnZAMC4xLjBdDQo8aHR0cHM6Ly9naXRodWIuY29t L2Rpc2t1di9kay9ibG9iL2EyOWU5ZGEzZjMwZGY0MWZhM2NmYzg1NWIzMjNmZGNkYTZhMTA2YzIv ZXRjL2RrL3YvTm90SW5yaWFDYW1sX1N0ZC9XZW52LnZhbHVlcy5sdWE+DQoNCg0KUnVubmluZyBS ZWFsIERvY2tlciBDb250YWluZXJzIGluIE9DYW1sIFRlc3RzDQrilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1ydW5u aW5nLXJlYWwtZG9ja2VyLWNvbnRhaW5lcnMtaW4tb2NhbWwtdGVzdHMvMTc4NTkvMT4NCg0KDQpT YWNoaW4gYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIANCg0KICBIaSBldmVyeW9uZSwNCg0KICBJ4oCZdmUgYmVlbiB3b3JraW5nIG9uIGEg cHJvamVjdCBjYWxsZWQgKlt0ZXN0Y29udGFpbmVycy1vY2FtbF0qLCB3aGljaA0KICBicmluZ3Mg VGVzdGNvbnRhaW5lcnMgc3R5bGUgaW50ZWdyYXRpb24gdGVzdGluZyB0byBPQ2FtbC4NCg0KICBU aGUgaWRlYSBpcyBzaW1wbGU6DQoNCiAgICAgICAgSW5zdGVhZCBvZiBtb2NraW5nIGluZnJhc3Ry dWN0dXJlIChQb3N0Z3JlcywgUmVkaXMsIEthZmthLA0KICAgICAgICBldGMuKSwgc3RhcnQgcmVh bCBEb2NrZXIgY29udGFpbmVycyBpbnNpZGUgeW91ciB0ZXN0IHN1aXRlDQogICAgICAgIGFuZCB0 ZWFyIHRoZW0gZG93biBhdXRvbWF0aWNhbGx5Lg0KDQogIOKAlA0KDQoNClt0ZXN0Y29udGFpbmVy cy1vY2FtbF0NCjxodHRwczovL2dpdGh1Yi5jb20vYmVub2Rpd2FsL3Rlc3Rjb250YWluZXJzLW9j YW1sPg0KDQpXaHk/DQrilYzilYzilYzilYwNCg0KICBJbiBtYW55IE9DYW1sIHByb2plY3RzLCBp bnRlZ3JhdGlvbiB0ZXN0cyBlaXRoZXI6DQoNCiAg4oCiIFJlbHkgb24gbW9ja3MNCg0KICDigKIg RGVwZW5kIG9uIGdsb2JhbGx5IHJ1bm5pbmcgc2VydmljZXMNCg0KICDigKIgT3IgYXJlIHNraXBw ZWQgZW50aXJlbHkgaW4gQ0kNCg0KICBNb2NrcyBhcmUgdXNlZnVsLCBidXQgdGhleSBkb27igJl0 IGNhdGNoIGlzc3VlcyBsaWtlOg0KDQogIOKAoiBTY2hlbWEgbWlzbWF0Y2hlcw0KDQogIOKAoiBD b25uZWN0aW9uIHBvb2wgYmVoYXZpb3INCg0KICDigKIgUmVhbCBuZXR3b3JraW5nIGZhaWx1cmVz DQoNCiAg4oCiIFN0YXJ0dXAgdGltaW5nIHByb2JsZW1zDQoNCiAg4oCiIE1pZ3JhdGlvbiBpc3N1 ZXMNCg0KICBTcGlubmluZyB1cCBkaXNwb3NhYmxlIGNvbnRhaW5lcnMgcGVyIHRlc3QgZ2l2ZXMg dXM6DQoNCiAg4oCiIElzb2xhdGVkIHRlc3QgZW52aXJvbm1lbnRzDQoNCiAg4oCiIE5vIHNoYXJl ZCBnbG9iYWwgc3RhdGUNCg0KICDigKIgQ0kgcmVwcm9kdWNpYmlsaXR5DQoNCiAg4oCiIFJlYWwg aW5mcmFzdHJ1Y3R1cmUgYmVoYXZpb3INCg0KDQpDdXJyZW50IFN0YXR1cw0K4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgVGhlIHByb2plY3QgaXMgY3VycmVu dGx5IGluY3ViYXRpbmcgdW5kZXIgdGhlIERvY2tlciBvcmdhbml6YXRpb24uDQoNCiAgSeKAmW0g c3RpbGwgYWN0aXZlbHkgc2hhcGluZyB0aGUgQVBJIGFuZCB3b3VsZCByZWFsbHkgYXBwcmVjaWF0 ZQ0KICBmZWVkYmFjayBmcm9tIHRoZSBPQ2FtbCBjb21tdW5pdHkgb246DQoNCiAg4oCiIEFQSSBl cmdvbm9taWNzDQoNCiAg4oCiIFByZWJ1aWx0IG1vZHVsZXMgKFBvc3RncmVzLCBSZWRpcywgZXRj LikNCg0KICDigKIgVGVzdGluZyBiZXN0IHByYWN0aWNlcyBpbiBPQ2FtbA0KDQogIElmIGFueW9u ZSBoZXJlIGhhcyBleHBlcmllbmNlIHdpdGggaW50ZWdyYXRpb24gdGVzdGluZyBwYXR0ZXJucyBp bg0KICBPQ2FtbCwgSeKAmWQgbG92ZSB0byBoZWFyIHRob3VnaHRzLg0KDQogIFRoYW5rcyENCg0K DQpJIHdyb3RlIGEgRFNMIGZvciBBSSBwZXJzb25hbGl0aWVzIGluIE9DYW1sDQrilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2ktd3Jv dGUtYS1kc2wtZm9yLWFpLXBlcnNvbmFsaXRpZXMtaW4tb2NhbWwvMTc4NjAvMT4NCg0KDQpHcmlm ZmluIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSADQoNCiAgSGkgZ3V5cywNCg0KICA8aHR0cHM6Ly9naXRodWIuY29tL0dyaWZmaW5D YW5Db2RlL0NhbGxvc3VtPg0KDQogIDxodHRwczovL3B5cGkub3JnL3Byb2plY3QvY2FsbG9zdW0t ZHNsLz4NCg0KICBJIHdhbnRlZCBhIG1vcmUgZGV0ZXJtaW5pc3RpYyB3YXkgdG8gY3JlYXRlIHBl cnNvbmFsaXRpZXMgZm9yIG15IEFJDQogIGFnZW50cyB0aGF0IHdhcyBjb25zaXN0ZW50IGluIHBy b2R1Y3Rpb24uIFRoZSBpbnRlcmVzdGluZyBjYXRjaCBiZWluZw0KICB0aGF0IHRoZSBjb21waWxl ciBoYWQgdG8gb3V0cHV0IGEgcHJvbXB0LCBhbmQgaXQgbmVlZGVkIHRvIGJlDQogIGFjY2Vzc2li bGUgZm9yIGFnZW50cyBpbiBQeXRob24uIFRoZSBzb2x1dGlvbiB3YXMgdGhpcyBEU0wsIGEgZm9y bWF0DQogIGZvciB3cml0aW5nIGRldGVybWluaXN0aWMgY2F0ZWdvcmllcyAoc2ltaWxhciB0byBZ QU1MKSB0aGF0IGNvbXBpbGUgdG8NCiAgYSBwcm9tcHQgaW5qZWN0YWJsZSBpbnRvIExhbmdjaGFp biBhZ2VudHMuIE9DYW1sIHdhcyB0aGUgbmF0dXJhbA0KICBjaG9pY2UgZHVlIHRvIGl0cyBwZXJm b3JtYW5jZSBhbmQgcHJvdmVuIGNhcGFiaWxpdGllcyB0byBob3N0DQogIGNvbXBpbGVycyAoUnVz dCBvYnYpLiBMb29raW5nIGZvciBiZXRhIHRlc3RlcnMgYW5kIGFueSBmZWVkYmFjayBpcw0KICB3 ZWxjb21lIQ0KDQoNCk91dHJlYWNoeSBNYXkgMjAyNg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZTogPGh0dHBzOi8vZGlz Y3Vzcy5vY2FtbC5vcmcvdC9vdXRyZWFjaHktbWF5LTIwMjYvMTc4NjMvMT4NCg0KDQpQYXRyaWNr IEZlcnJpcyBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEhlbGxvIGV2ZXJ5b25lLA0K DQogIFRoZSBPQ2FtbCBjb21tdW5pdHkgaGFzIHNpZ25lZCB1cCB0byBPdXRyZWFjaHkgTWF5IDIw MjYgKHNlZSBbcGFzdF0NCiAgW3Bvc3RzXSkhDQoNCiAgICAgICAgKldoYXQgaXMgT3V0cmVhY2h5 PyoNCg0KICAgICAgICBPdXRyZWFjaHkgaXMgYSBwYWlkLCByZW1vdGUgaW50ZXJuc2hpcCBwcm9n cmFtLiBPdXRyZWFjaHkNCiAgICAgICAgcHJvbW90ZXMgZGl2ZXJzaXR5IGluIG9wZW4gc291cmNl IGFuZCBvcGVuIHNjaWVuY2UuIE91cg0KICAgICAgICBpbnRlcm5zaGlwcyBhcmUgZm9yIHBlb3Bs ZSB3aG8gZmFjZSB1bmRlci1yZXByZXNlbnRhdGlvbiwNCiAgICAgICAgYW5kIGRpc2NyaW1pbmF0 aW9uIG9yIHN5c3RlbWljIGJpYXMgaW4gdGhlIHRlY2hub2xvZ3kNCiAgICAgICAgaW5kdXN0cnkg b2YgdGhlaXIgY291bnRyeS4NCg0KICBUaGUgY3VycmVudCByb3VuZCBpcyBzdGlsbCBvbmdvaW5n IHdpdGggaW50ZXJucyBtYWtpbmcgZ3JlYXQgcHJvZ3Jlc3MNCiAgd2l0aCBAdG1hdHRpbyBvbiBb UmF2ZW5dLCB3aXRoIEB4dncgb24gW1lPQ2FtbF0gYW5kIHdpdGggbXlzZWxmIG9uDQogIFtvY2Ft bC10aWZmXS4NCg0KDQpbcGFzdF0gPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9vdXRyZWFj aHktZGVjZW1iZXItMjAyNC1yb3VuZD4NCg0KW3Bvc3RzXSA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1s Lm9yZy90L291dHJlYWNoeS1qdW5lLTIwMjU+DQoNCltSYXZlbl0gPGh0dHBzOi8vcmF2ZW4tbWwu ZGV2Lz4NCg0KW1lPQ2FtbF0gPGh0dHBzOi8veW9jYW1sLmdpdGh1Yi5pby9kb2MveW9jYW1sL2lu ZGV4Lmh0bWw+DQoNCltvY2FtbC10aWZmXSA8aHR0cHM6Ly9naXRodWIuY29tL2dlb2NhbWwvb2Nh bWwtdGlmZi8+DQoNCkltcG9ydGFudCBEYXRlcw0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgRm9yIHRoaXMgbmV4dCByb3VuZCwgdGhlIGltcG9ydGFu dCBkYXRlcyBhcmUgYXMgZm9sbG93cyAodGhlc2UgYXJlDQogIGFsd2F5cyBzdWJqZWN0IHRvIHNv bWUgY2hhbmdlKToNCg0KICDigKIgTWFyIDEgLSBDb21tdW5pdHkgc2lnbiB1cCBkZWFkbGluZSA6 d2hpdGVfY2hlY2tfbWFyazoNCiAg4oCiIE1hciAxNCAtIFtNZW50b3IgU2lnbnVwXQ0KICDigKIg TWFyIDE3IHRvIEFwciAxNSAtIENvbnRyaWJ1dGlvbiBwZXJpb2QNCiAg4oCiIE1heSAxOCB0byBB dWcgMTcgLSBJbnRlcm5zaGlwIHBlcmlvZA0KDQogICpPdXIgbmV4dCBkZWFkbGluZSBpcyBmb3Ig bWVudG9ycyB0byBzaWduIHVwIHRvIHRoZSBPQ2FtbCBjb21tdW5pdHkqDQogICB3aXRoIGEgcHJv amVjdCBpZGVhLiBQbGVhc2UgZG8gY29uc2lkZXIgYmVpbmcgYW4gT3V0cmVhY2h5IG1lbnRvci4g SWYNCiAgIHlvdSBoYXZlIGFueSBxdWVzdGlvbnMgb3IgaWRlYXMgeW91IGNhbiBhbHdheXMgcmVh Y2ggb3V0IHRvIG1lDQogICBkaXJlY3RseS4gSWYgeW91IG5lZWQgYSByZWZyZXNoZXIgb2YgcGFz dCBwcm9qZWN0cywgdGhlcmXigJlzIGENCiAgIGRlZGljYXRlZCBwYWdlIG9uIHRoZSBPQ2FtbCB3 ZWJzaXRlOiBbT0NhbWwgT3V0cmVhY2h5DQogICBJbnRlcm5zaGlwc10uIEZlZWwgZnJlZSB0byBk aXNjdXNzIGlkZWFzIG9uIHRoaXMgdGhyZWFkIHRvbyENCg0KICBUaGUgT0NhbWwgY29tbXVuaXR5 IGlzIGN1cnJlbnRseSBhYmxlIHRvIGZpbmFuY2lhbGx5IHN1cHBvcnQgT3V0cmVhY2h5DQogIGlu dGVybnNoaXBzIHRoYW5rcyB0byB0aGUgZ2VuZXJvdXMgc3VwcG9ydCBvZiBbVGFyaWRlc10gYW5k DQogIFtKYW5lc3RyZWV0XS4gVGhpcyBpbmNsdWRlcyBiZWluZyBhYmxlIHRvIGZ1bmQgbWVudG9y cyBhcyB3ZWxsLg0KDQogIFRoYW5rcyEgOmNhbWVsOg0KDQoNCltNZW50b3IgU2lnbnVwXSA8aHR0 cHM6Ly93d3cub3V0cmVhY2h5Lm9yZy9jb21tdW5pdGllcy9jZnAvb2NhbWwvPg0KDQpbT0NhbWwg T3V0cmVhY2h5IEludGVybnNoaXBzXSA8aHR0cHM6Ly9vY2FtbC5vcmcvb3V0cmVhY2h5Pg0KDQpb VGFyaWRlc10gPGh0dHBzOi8vdGFyaWRlcy5jb20+DQoNCltKYW5lc3RyZWV0XSA8aHR0cHM6Ly93 d3cuamFuZXN0cmVldC5jb20+DQoNCg0KT2xkIENXTg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoN CiAgSWYgeW91IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5b3UgY2FuIFtzZW5kIG1lIGEgbWVzc2Fn ZV0gYW5kIEknbGwgbWFpbA0KICBpdCB0byB5b3UsIG9yIGdvIHRha2UgYSBsb29rIGF0IFt0aGUg YXJjaGl2ZV0gb3IgdGhlIFtSU1MgZmVlZCBvZiB0aGUNCiAgYXJjaGl2ZXNdLg0KDQogIElmIHlv dSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5IG1haWwsIHlvdSBtYXkgc3Vi c2NyaWJlDQogIHRvIHRoZSBbY2FtbC1saXN0XS4NCg0KICBbQWxhbiBTY2htaXR0XQ0KDQoNCltz ZW5kIG1lIGEgbWVzc2FnZV0gPG1haWx0bzphbGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5vcmc+ DQoNClt0aGUgYXJjaGl2ZV0gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duLz4NCg0K W1JTUyBmZWVkIG9mIHRoZSBhcmNoaXZlc10gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQv Y3duL2N3bi5yc3M+DQoNCltjYW1sLWxpc3RdIDxodHRwczovL3N5bXBhLmlucmlhLmZyL3N5bXBh L2luZm8vY2FtbC1saXN0Pg0KDQpbQWxhbiBTY2htaXR0XSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBv bW1lLm5ldC8+DQoNCg== --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week<= /a> Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of February 24 to March = 03, 2026.

OCaml Platform Newsletter: November 2025 to January 2026

Sabine Schmaltz announced

Welcome to the seventeenth edition of the OCaml Platform newsletter!

In this November 2025 to January 2026 edition, we are excited to bring you = the latest on the OCaml Platform, continuing our tradition of highlighting = recent developments as seen in previous editions. To understand the direction we're = headed, especially regarding development workflows and user experience impr= ovements, check out our roadmap.

You can subscribe to this newsletter on LinkedIn!

Highlights:

  • opam 2.5.0 Released: Major release featuring incremental opam fi= le loading for up to 70% faster opam update, improved shell in= tegration, and better macOS sandbox support
  • Relocatable OCaml Merged: The final piece of the relocatable OCa= ml puzzle was merged in December, enabling opam to clone switches instead o= f recompiling them. This will be available in the first alpha release of OC= aml 5.5
  • Dune 3.21.0: Large release with dozens of fixes, improvements, a= nd new features including OxCaml compiler support and copy-on-write file op= erations
  • Enhanced Editor Support: OCaml-LSP 1.25.0 adds .mlx= file support with formatting, diagnostics, and code actions, plus new cust= om requests
  • Merlin 5.6.1-504: Performance optimizations, smarter signature h= elp, and fixed completion for inlined record labels
  • opam-publish 2.7.1: Fixes for GitHub API token permissions
  • dune-release 2.2.0: Full compatibility with cmdliner 2.0.0
  • opam-repository Archival: January 1, 2026 archival run removed 3= ,264 package versions to maintain repository sustainability

Backstage OCaml:

Stable Releases:

Unstable Releases:

OCaml Compiler

  • Relocatable OCaml Merged

    In December 2025, the final piece of the Relocatable OCaml puzzle was me= rged, enabling opam to clone switches instead of recompiling them. This fea= ture will be available in the first alpha release of OCaml 5.5.

    What Relocatable OCaml Enables:

    This feature allows the OCaml compiler and its associated tools to be moved= to different filesystem locations after installation without breaking func= tionality. Key benefits include:

    • Binary distributions that work regardless of installation path
    • Improved flexibility for package managers organizing OCaml installation= s
    • Bundling of specific OCaml versions by developer tools without path con= flicts
    • Simplified cross-platform distribution

    The implementation is the culmination of work by David Allsopp, with review= from Samuel Hym, Jonah Beckford, and others. See the announcement on Discuss and = the merged PRs (<= a href=3D"https://github.com/ocaml/ocaml/pull/14244">#14244, #14245, #14246, #14247) for technical details.

Build System

Package Management

Editor Tools

  • OCaml-LSP Server

    OCaml-L= SP 1.25.0 (December 20, 2025) introduces support for .mlx = files and new custom requests.

    Features:

    • .mlx Support: Added support for .mlx f= iles, including diagnostics, code actions, hover, and formatting via = ocamlformat-mlx
    • New Custom Requests: Added typeExpression, lo= cate, and phrase requests to the server
    • Code-Lens Configuration: Code-lens for nested let b= indings is now configurable

    Fixes:

    • The server now falls back to .merlin configuration if a dune-project file is missing, provided dot-merlin-reader is installed
    • Improved precision of timestamps for collected metrics
  • Merlin

    Merlin= 5.6.1-504 (December 20, 2025) brings performance optimizations and imp= roved stability.

    Key Improvements:

    • Smarter Signature Help: Now triggers correctly on unfinished let ... in bindings and no longer appears redundantly on function= names
    • More Reliable Completion: Fixed issues with completion for inlin= ed record labels
    • Improved Performance: Optimized buffer indexing and path calcula= tions
    • Bug Fixes: Resolved a bug where the document comman= d concatenated labels and variants incorrectly

    OCaml LSP Server maintained by: Ulysse G=C3=A9rard (@voodoos, Taride= s), Xavier Van de Woestyne (@xvw, Tarides), Rudi Grinberg (@rgrinberg, Jane= Street)

    Merlin maintained by: Ulysse G=C3=A9rard (@voodoos, Tarides), Xavier= Van de Woestyne (@xvw, Tarides), Muluh Godson (@PizieDust, Tarides)

  • OCaml-eglot

    We have drastically modified the xref backend (allowing naviga= tion from definition to definition) to make it more suitable for OCaml.

    In addition, we added the ability to annotate the type of an enclosing acti= ve_ (used with the ocaml-eglot-type-enclosing command) or simp= ly to type the selection.

    These updates have been merged into main, making them availabl= e via a MELPA update.

    ocaml-eglot maintained by: Xavier Van de Woestyne (@xvw, Tarides)

Platform Infrastructure

  • OCaml Infrastructure: How the opam-repository = Works

    The November 5, 2025 article on the opam-repository provides an i= n-depth look at this critical piece of OCaml infrastructure. The opam repos= itory serves as the central package registry for the OCaml ecosystem, hosti= ng over 4,500 packages. It relies on dedicated volunteer maintainers who re= view every submission.

    As always, we encourage feedback and contributions from the community as we= continue to improve the OCaml Platform ecosystem.

Announcing the first release of Alice, a radical OCaml build s= ystem

Continuing this thread, Steve Sherratt announced

Announcing the release of Alice v0.5.0 which introduces parallel builds.

mnet, a new TCP/IP stack for unikernels in OCaml

Calascibetta Romain announced

I am pleased to announce a series of releases for developing unikernels wit= h OCaml 5 and Miou. Afte= r extensive testing, we are now able to offer a new TCP/IPv4 and IPv6 stack= in OCaml that aims to replace mirage-tcpip and pave the way for direct-style unikernel develop= ment. Below is an overview of the libraries we have built to make this poss= ible.

mkernel

mkernel is a small library that provides the essentials for de= veloping a unikernel targeting S= olo5 or Unikraft. Its purpose is = to expose hypercalls (the unikernel equivalent of syscalls) so that your ap= plication can interact with network and block devices.

We recommend reading the mkernel documentation to u= nderstand the key concepts behind unikernels (hypercalls, devices, tenders,= etc.). The slides we presented at the last MirageOS retreat are also helpful for understanding o= ur new workflow. Compiling a unikernel now only requires dune = and vendored libraries. We have therefore chosen not to resolve dependencie= s automatically (as op= am-monorepo did) or to impose them (as the mirage tool doe= s), giving developers full freedom to build their unikernels as they see fi= t. In particular, this makes it straightforward to use ppx rewriters, which= was difficult or impossible with the mirage tool.

  • A new workflow and targets

    This release is experimental: Xen is not yet supported, and Unikraft suppor= t is partial. However, both platforms are on our roadmap, so if you are int= erested in them, please let us know! We are also developing tooling to stre= amline the workflow, with the guiding principle that these tools should nev= er dictate which dependencies your unikernel uses or which build system you= choose.

mnet

mnet is the centerpiece of this release. It is designed to rep= lace (and improve upon) = mirage-tcpip by offering a direct-style API built on effects. The API d= eliberately mirrors the Unix socket interface: connect, listen, accept, read, w= rite, and close all behave the way you would expect.

Here is a small example of an echo server:

let run (ipv4, gateway=
, ipv6) =3D
  Mkernel.(run [ =
rng; Mnet.stack <=
span style=3D"color: #444fcf; font-weight: bold;">~name:"service" ?gateway ~ipv6 ipv4 ])
  @@ fun rng (=
daemon, tcp, udp) ->
  let@ () =3D fun () -> Mnet.kill daemon in
  let@ () =3D fun () -> Mirage_crypto_rng_mkernel.kill rng in
  let listen =3D Mnet.TCP.listen tcp 9000 in
  let flow =3D Mnet.TCP.accept tcp listen in
  let buf =3D Bytes.create 4096 in
  let rec echo () =3D
    let len =3D Mnet.TCP.read flow buf in
    if len > 0=
 then begin
      Mnet.TCP.wr=
ite flow (Bytes.s=
ub_string buf 0 len);
      echo ()
    end
  in
  let@ () =3D fun () -> Mnet.TCP.close flow in
  echo ()

TLS support (via ocaml-tls= ) is already available, allowing you to establish secure connections wi= th your unikernel. DNS resolution (via ocaml-dns) and the Happy Eyeballs algorithm are also included, so that a = unikernel can resolve hostnames and connect to remote services over both IP= v4 and IPv6.

A short tutorial walks y= ou through creating an echo server as a unikernel, similar to what we already offer for Mi= ou. For the curious, an article about IPv4 and Miou is available here.

Beyond the move to effects for all scheduling, I would like to give special= thanks to:

  • Edwin T=C3=B6r=C3=B6k for proposing fixes to prevent denial-of-service = attacks, which have been integrated into mnet (in particular for ARP).
  • Nicolas Ojeda B=C3=A4r for contributing an IPv6 implementation that we = adopted and improved (caches, packet fragmentation and reassembly, etc.)
  • Reynir for patiently debugging PCAP traces
  • Hannes for sharing his deep knowledge of the TCP protocol and its interactions with IPv4 and IPv6

As well as others who participated in the development of mnet = in one way or another.

  • Developing and deploying unikernels

    This library also marks a turning point in our approach to unikernels. We n= o longer treat a regular OCaml application as something that can be transpa= rently turned into a unikernel. Developing a unikernel now means developing= a unikernel from the start. In our experience, trying to retrofit an exist= ing application into a unikernel was neither practical nor worthwhile.

    Our tutorial therefore covers both the development and deployment of uniker= nels. On the deployment side, we also recommend exploring Albatross.

utcp

utcp is a p= ure OCaml implementation of the TCP protocol, used internally by mnet= to handle TCP connections. The implementation is based on a state m= achine and performs no I/O itself, making it easy to test and reason about.

utcp covers the full TCP lifecycle: the three-way handshake, r= eliable in-order data delivery with retransmissions, flow control, congesti= on control, and connection teardown. It has been tested extensively through= our end-to-end unikernel tests (a simple echo server and client, and a <= a href=3D"https://github.com/robur-coop/mnet/tree/main/unikernels/resolver"= >DNS resolver).

  • Unikernels and proofs

    utcp also reflects our ambition to incorporate, as time permit= s, proof-based implementations. Other examples include:

    • miou with its priority queue (see the VOCAL project)
    • mirage-crypto with certain cryptographic primitives (see the fiat project)
    • and now utcp (see n= etsem)

    This effort is still in its early stages, but we welcome improvements and c= ollaborations in this area.

mhttp

To reach a wider audience, we also provide an HTTP protocol implementation = for unikernels, building on the work we started (and currently use in produ= ction) with httpcats.

mhttp is essentially a unikernel-oriented counterpart to httpcats, using = ocaml-h1 and ocaml-h= 2 as its HTTP/1.1 and H2 backends.

  • Ecosystem and composability

    Although mhttp is a small project, it illustrates a broader pr= inciple behind our cooperative's approach to library development. As we hav= e stated before, everything we build is designed to be reus= able with schedulers other than Miou and in contexts other than unikernels.= Regardless of which scheduler one prefers, we believe in a pragmatic, coop= erative approach to contributing to the community.

    Our primary focus remains unikernel development, but years of experience bu= ilding protocol and format libraries have taught us that keeping them sched= uler-agnostic is in everyone's best interest, for maintainability, testabil= ity, and reliability alike. Wherever possible, you will find a general-purp= ose library alongside its unikernel counterpart: httpcats and = mhttp are one such pair.

Vifu

As previously announced, we have developed a w= eb framework for OCaml 5 called vif, which we use in production for our builds.robur.coop website (we recommend the tutorial presented at FUN OCaml 2025).

vif now has a unikernel variant: vifu. It offers = nearly the same interface as vif (except for static file manag= ement), making it possible to build websites entirely in OCaml. Here is a s= mall unikernel that displays "Hello World!":

let hello_world req _s=
erver () =3D
  let open Vifu.Response.Syntax in
  let* () =3D Vifu.Response.with_t=
ext req "Hello World!\n" in
  Vifu.Response.r=
espond `OK

let run (ipv4, gateway, ipv6) =3D
  Mkernel.(run [ =
rng; Mnet.stack <=
span style=3D"color: #444fcf; font-weight: bold;">~name:"service" ?gateway ~ipv6 ipv4 ])
  @@ fun rng (=
daemon, tcp, udp) ->
  let@ () =3D fun () -> Mnet.kill daemon in
  let@ () =3D fun () -> Mirage_crypto_rng_mkernel.kill rng in
  let cfg =3D Vifu.Config.v 80 in
  let routes =3D Vifu.[ get (rel /?? any) --> hello_world ] in
  Vifu.run ~cfg t=
cp routes ()

disclaimer: If you would like to use vifu, please note = that although a recent release has been made, one final fix is still needed= to compile a unikernel with this library (to avoid pulling in the un= ix module). We recommend pinning vifu for now.

Unikernels

Behind all these libraries, there are concrete projects that we would like = to share with you:

Conclusion

After several years of work, we are now able to develop unikernels with OCa= ml 5 in earnest. We hope that our new workflow will be of interest to the c= ommunity and that these libraries will be a useful contribution to the OCam= l ecosystem.

If you would like to try it out, we recommend starting with the mnet tutorial and the mkerne= l documentation. Feel free to open issues or reach out to us if you hav= e any questions!

Experiment: format-line

Emile Trotignon announced

I made this little experiment a while back: https://github.com/ahrefs/format-line

The idea is to provide a complement to ocp-indent to decide which token sho= uld be separated by whitespace and which should not. For now it is based on= ly on lexing information, which make the code simple but also does not alwa= ys provide enough information to have a nice formatting.

An idea of the output can be read here: https://github.com/ahrefs/format-line= /blob/master/test/run.t

The project itself is formatted with ocamlformat, and in the there is a dif= f of what this changes compared to ocamlformat, on the main source file.

I think this approach could be improved by having a hybrid ast-token stream= datastructure. Something where you work on a stream of token but you can q= uery the AST context of a given token.

What do you think ?

Caml in the Capital - Registrations Open!

Continuing this thread, Sacha Ayoun announced

And here is the l= ink to the recording!

We'd like to thank our speakers Jeremy and Nick again, as well as the ~30 a= ttendees to the meetup! It was great having you, and we hope to see you aga= in next time :)

Experimental tools for migrating from Lwt to Eio

Jules announced

We developed tools to help us migrate Ocsigen libraries and applications to= direct-style concurrency and we are happy to share them.

There are 4 independent tools for different purposes:

  • Replacing every uses of lwt_ppx with Lwt func= tion calls (e.g. replacing let%lwt ... in with let* ... = in). This is purely syntactic and allows you to easily remove a PPX. It handles = inserting open Lwt.Syntax at the top of the file.
  • Warning about occurrences of let _ =3D ... and ignor= e ..., which make the next tools less reliable. These are called =E2=80=9Cimplicit fork=E2=80=9D because code run concurren= tly if the ignored value is an Lwt thread. This requires an explicit call t= o Fiber.fork with Eio.
  • Migrating uses of Lwt_log to Logs. It was used on ocsigenserver for example. At this point we generate code working as before and did not introduce a de= pendency on Eio.
  • Migrating uses of Lwt to Eio. It rewrites code wr= itten in monadic style into direct-style, for example this code:

    let _ =3D
      let* x =3D f 1 in
      let+ y =3D f 2 in
      Lwt.bind (f 3) =
    (fun z ->
        Lwt.return (x=
     + y + z))
    

    is rewritten to:

    let _ =3D
      let x =3D f 1 in
      let y =3D f 2 in
      let z =3D f 3 in
      x + y + z
    

    It also rewrite Lwt function calls to their equivalent in Eio and handles many IO operations.

    Unfortunately, this tool doesn=E2=80=99t generate fully equivalent code and= requires manual modifications. Comments are inserted in many places where = intervention is needed.

    An example of generated incorrect code is:

    let _ =3D
      let a =3D operation_1 () in
      let* b =3D operation_2 () in
      let* a =3D a in
      Lwt.return (a +=
     b)
    

    which is rewritten into:

    let _ =3D
      let a =3D operation_1 () in
      let b =3D operation_2 () in
      let a =3D a in
      a + b
    

    This is incorrect because operation_1 and operation_2 are now sequential but were concurrent before. This is a case of an im= plicit fork that cannot easily be detected. The correct transformation woul= d be:

    let _ =3D
      let a, b =3D=
     Eio.Fiber.pair o=
    peration_1 operation_2 i=
    n
      a + b
    

    We could achieve the migration on eliom and ocsigenserver

All the tools use OCamlformat under the hood to generate the code. This has= the inconvenient of enforcing the use of OCamlformat before using them as = they will reformat the entire codebase.

The last two tools use Merlin under the hood to locate uses of Lwt functions in the source files. This works by reading Merlin=E2=80=99s = ocaml-index files built by Dune to extract the location in the source files= that we need.

Currently, it only supports Eio as a backend but can easily be adapted to other direct-style concurrency librar= ies.

This work was made possible thanks to the support of the NGI Zero Core fund through the Nlnet foundation, and is perfomed by Tarides.

First alpha release of OCaml 5.5.0

octachron announced

Four months after the release of OCaml 5.4.0, the set of new features for t= he future version 5.5.0 of OCaml has been frozen. We are thus happy to anno= unce the first alpha release for OCaml 5.5.0.

This alpha version is here to help fellow hackers join us early in our bug = hunting and opam ecosystem fixing fun (see below for the installation instr= uctions). More information about the release process is available at https://github.com/ocaml/ocaml/blob/trunk/release-info/introduction.md.

The progress on stabilising the ecosystem is tracked on the opam readiness for 5.5.0= meta-issue .

There is also a companion alpha opam repository available for this alpha re= lease

$ opam repo add alpha git+https://github.com/kit-ty-kate/opam-alpha-reposit=
ory.git

which contains in-progress alpha releases of opam packages that are being u= pdated for OCaml 5.5.0 .

The full release is expected between May and June. There are more informati= on available in the prospective release calendar.

If you find any bugs, please report them on the OCaml's issue tracker.

If you are interested in the ongoing list of new features and bug fixes, the updated change = log for OCaml 5.5.0 is available on GitHub.

Happy hacking, Florian Angeletti for the OCaml team

Installation Instructions

The base compiler can be installed as an opam switch with the following com= mands on opam 2.1 and later:

opam update opam switch create 5.5.0~alpha1

The source code for the alpha is also available at these addresses:

Fine-Tuned Compiler Configuration

If you want to tweak the configuration of the compiler, you can switch to t= he option variant with:

opam update
opam switch create <switch_name> ocaml-variants.5.5.0~alpha1+options =
<option_list>

where option_list is a space separated list of ocaml-opt= ion-* packages. For instance, for a flambda and no-flat-float-array = switch:

opam switch create 5.5.0~alpha1+flambda+nffa ocaml-variants.5.5.0~alpha1+op=
tions ocaml-option-flambda ocaml-option-no-flat-float-array

All available options can be listed with opam search ocaml-option.

NotInriaCaml_Std.Wenv@0.1.0 - create Windows envs on macOS [dk= 0]

jbeckford announced

It is my pleasure to announce the following package for the dk0 build system that creates a Windows environment ("wenv") using a custom Wine build for= macOS:

Here is a sample session:

# Simplest way to install dk0 today. Use ~git pull~ if exists already.=20
$ git clone --branch V2_5 https://github.com/diskuv/dk.git dksrc

# Clear out data, cache and intermediate files from any prior
# experiments (from the "--trial" option seen in [ANN] posts)
$ rm -rf t/

# With the default Lua rules ("-I dksrc/etc/dk/v"), run the
# OCaml Windows environment creation rule ("run
# NotInriaCaml_Std.Wenv.Create@0.1.0"). Tell the rule to create the
# wenv at target/my-wenv/ ("dir=3D...") and make a mount
# ("mount[]=3D...") inside the wenv where the Unix directory $PWD is
# mapped to Windows M:\project. Depending on Internet, expect 3-4
# minutes for a single-threaded download of artifacts (581MB).
$ dksrc/dk0 --trial -I dksrc/etc/dk/v \
    run NotInriaCaml_Std.Wenv.Create@0.1.0 \
    dir=3D$PWD/target/my-wenv \
    "mount[]=3Dtype=3Dbind,src=3D$PWD,dst=3DM:/project"
# Then enter the wenv by running Command Prompt ("cmd.exe"). Turn
# off Wine debug messages ("WINEDEBUG=3D-all"). Remember that
# Ctrl-Z is the Windows equivalent of Ctrl-D (EOF) in Unix.
$ WINEDEBUG=3D-all target/my-wenv/bin/enter cmd.exe

Microsoft Windows 10.0.19045
Z:\> ocamlopt -config
Z:\> gcc --version
Z:\> dir M:
02/27/2026 10:24 AM <DIR> project
Z:\> ocaml
OCaml version 5.4.1

Enter #help;; for help.

# 1+1 ;;
- : int =3D 2

# ^Z

Z:\> echo let () =3D print_endline "abcxyz" > letters.ml
Z:\> ocamlopt -o letters.exe letters.ml
Z:\> .\letters.exe
abcxyz
Z:\> exit

Details:

  • MinGW with UCRT Windows API and LLVM toolchain (llvm-mingw) for Wine on= the host (macOS). X11 has been disabled.
  • MinGW with MSVCRT Windows API and GNU compiler and BusyBox binaries (w6= 4devkit) inside Windows guest.
  • Wine has good support for programs that use Windows conventions (MSVC, = Windows API rather than syscall, etc). But there are important= programs that won't work correctly today: MSYS2/Cygwin, Rust uutils.

Enjoy! –jonah

Running Real Docker Containers in OCaml Tests

Sachin announced

Hi everyone,

I=E2=80=99ve been working on a project called testcontainers-ocaml, which bri= ngs Testcontainers style integration testing to OCaml.

The idea is simple:

Instead of mocking infrastructure (Postgres, Redis, Kafka, etc.), start rea= l Docker containers inside your test suite and tear them down automatically.

Why?

In many OCaml projects, integration tests either:

  • Rely on mocks
  • Depend on globally running services
  • Or are skipped entirely in CI

Mocks are useful, but they don=E2=80=99t catch issues like:

  • Schema mismatches
  • Connection pool behavior
  • Real networking failures
  • Startup timing problems
  • Migration issues

Spinning up disposable containers per test gives us:

  • Isolated test environments
  • No shared global state
  • CI reproducibility
  • Real infrastructure behavior

Current Status

The project is currently incubating under the Docker organization.

I=E2=80=99m still actively shaping the API and would really appreciate feed= back from the OCaml community on:

  • API ergonomics
  • Prebuilt modules (Postgres, Redis, etc.)
  • Testing best practices in OCaml

If anyone here has experience with integration testing patterns in OCaml, I= =E2=80=99d love to hear thoughts.

Thanks!

I wrote a DSL for AI personalities in OCaml

Griffin announced

Hi guys,

https://github.com/G= riffinCanCode/Callosum

https://pypi.org/project= /callosum-dsl/

I wanted a more deterministic way to create personalities for my AI agents = that was consistent in production. The interesting catch being that the com= piler had to output a prompt, and it needed to be accessible for agents in = Python. The solution was this DSL, a format for writing deterministic categ= ories (similar to YAML) that compile to a prompt injectable into Langchain = agents. OCaml was the natural choice due to its performance and proven capa= bilities to host compilers (Rust obv). Looking for beta testers and any fee= dback is welcome!

Outreachy May 2026

Patrick Ferris announced

Hello everyone,

The OCaml community has signed up to Outreachy May 2026 (see past posts)!

What is Outreachy?

Outreachy is a paid, remote internship program. Outreachy promotes diversit= y in open source and open science. Our internships are for people who face = under-representation, and discrimination or systemic bias in the technology= industry of their country.

The current round is still ongoing with interns making great progress with = @tmattio on Raven, with @xvw on YOCaml and with m= yself on ocaml-tiff.

Important Dates

For this next round, the important dates are as follows (these are always s= ubject to some change):

  • Mar 1 - Community sign up deadline :white_check_mark:
  • Mar 14 - M= entor Signup
  • Mar 17 to Apr 15 - Contribution period
  • May 18 to Aug 17 - Internship period

Our next deadline is for mentors to sign up to the OCaml community w= ith a project idea. Please do consider being an Outreachy mentor. If you ha= ve any questions or ideas you can always reach out to me directly. If you n= eed a refresher of past projects, there=E2=80=99s a dedicated page on the O= Caml website: OCaml Outreachy Inter= nships. Feel free to discuss ideas on this thread too!=20

The OCaml community is currently able to financially support Outreachy inte= rnships thanks to the generous support of T= arides and Janestreet. This = includes being able to fund mentors as well.

Thanks! :camel:

Old CWN

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

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

--=-=-=--