From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by mail.toke.dk (Postfix) with ESMTPS id 3E8488E821B for ; Thu, 18 Nov 2021 15:30:28 +0100 (CET) Authentication-Results: mail.toke.dk; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=G+xx91UL DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1637245827; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=G7GilkNon4QNuxidGZijzjjb848u0w+IkHGBFLeyaUw=; b=G+xx91ULBifyCLbwmFTfdyPKdQlnC8gK7Cc4tr741moGGVDaARxg++O8FUxG28GzLzyqef +9HhFK6dQIRQSkvnJcTLolz/57xCi+NTiDwZnXET/UTV58nW+PlQNEkI0T7nskGneZuAlA +FMp6SdrOBJUbxoSNTd4DT7WhafJMc4= Received: from mail-ed1-f72.google.com (mail-ed1-f72.google.com [209.85.208.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-203-mvJSNXVqMhK8Oc-lFrIKXw-1; Thu, 18 Nov 2021 09:30:25 -0500 X-MC-Unique: mvJSNXVqMhK8Oc-lFrIKXw-1 Received: by mail-ed1-f72.google.com with SMTP id l15-20020a056402124f00b003e57269ab87so5446340edw.6 for ; Thu, 18 Nov 2021 06:30:24 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:message-id:date:mime-version:user-agent:cc :subject:content-language:to:references:in-reply-to :content-transfer-encoding; bh=G7GilkNon4QNuxidGZijzjjb848u0w+IkHGBFLeyaUw=; b=4R30wMvJdc3qxaPificDF5lqhXP0eh9iIXxl+vgTjURK41BGliWeBP0v4AaTu1RljK hwJwbZX3zfRnri/YEdTH33G40GK0gZsY5lSzu+mnOYiHxHOSCWiGdLvQfLIN/NwDS7gl Sfzo0Zrwj1U+0+ftUOxV/I+6euECLK7UHJe0/y4mXP1LE8hT7AJLt7Q2U4FINhUqjo6c 5kgwKVsjx2dOofJQEDW8yuwBK1JJJ5E26fDjcxRhuRtAkNcHsiYsYpOxAV72fRk1M+jk ChJ1bGzhyE/1+G3Xosg60AXN3E2Jtii7kggdcEoqYgAU4T2m3fyIfaRL50e27uAATGwF CFBw== X-Gm-Message-State: AOAM532UiG4hOeQAHdMwVmsBsMaEctCSlQpHfbpXVRPtGPEGEDc8Ql6/ nmPMJL4fFOwJd4ofVzDFtCK0cX63EGa9HfsXBNmv8iZcOG8cay6tPCl8HGH5Rts1z6Mw29uPefw YdFUCdl6wJeLKKZd+IfH5 X-Received: by 2002:a17:907:9196:: with SMTP id bp22mr33143842ejb.69.1637245823797; Thu, 18 Nov 2021 06:30:23 -0800 (PST) X-Google-Smtp-Source: ABdhPJxj9pV1ycVFoMTAcK/2y+gsQKmfTo+bpLak7jttTVUYTmkvdhsocTnmRPxie35eafnFOdlm+w== X-Received: by 2002:a17:907:9196:: with SMTP id bp22mr33143777ejb.69.1637245823409; Thu, 18 Nov 2021 06:30:23 -0800 (PST) Received: from [192.168.2.13] (3-14-107-185.static.kviknet.dk. [185.107.14.3]) by smtp.gmail.com with ESMTPSA id n16sm1911edt.67.2021.11.18.06.30.22 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 18 Nov 2021 06:30:22 -0800 (PST) From: Jesper Dangaard Brouer X-Google-Original-From: Jesper Dangaard Brouer Message-ID: Date: Thu, 18 Nov 2021 15:30:21 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.2.0 To: "Karlsson, Magnus" , =?UTF-8?Q?Toke_H=c3=b8iland-J=c3=b8rgensen?= , "Desouza, Ederson" References: <875ysqflg1.fsf@toke.dk> In-Reply-To: Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=jbrouer@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Language: en-US Content-Type: text/plain; charset="utf-8"; format="flowed" Content-Transfer-Encoding: base64 Message-ID-Hash: P3XFPRAIJA6ZE6PY7YCTBCFHKYN6L7BF X-Message-ID-Hash: P3XFPRAIJA6ZE6PY7YCTBCFHKYN6L7BF X-MailFrom: jbrouer@redhat.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: brouer@redhat.com, "xdp-hints@xdp-project.net" , Eelco Chaudron , Andrii Nakryiko , "Fijalkowski, Maciej" , "Burakov, Anatoly" X-Mailman-Version: 3.3.4 Precedence: list Subject: [xdp-hints] Re: XDP-hints via local BTF info List-Id: XDP hardware hints design discussion Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: DQoNCk9uIDE4LzExLzIwMjEgMDkuMDUsIEthcmxzc29uLCBNYWdudXMgd3JvdGU6DQo+IA0KPj4g LS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0NCj4+IEZyb206IFRva2UgSMO4aWxhbmQtSsO4cmdl bnNlbiA8dG9rZUByZWRoYXQuY29tPg0KPj4gU2VudDogV2VkbmVzZGF5LCBOb3ZlbWJlciAxNywg MjAyMSAxMTo0OCBQTQ0KPj4gVG86IEthcmxzc29uLCBNYWdudXMgPG1hZ251cy5rYXJsc3NvbkBp bnRlbC5jb20+OyBKZXNwZXIgRGFuZ2FhcmQNCj4+IEJyb3VlciA8amJyb3VlckByZWRoYXQuY29t PjsgRGVzb3V6YSwgRWRlcnNvbg0KPj4gPGVkZXJzb24uZGVzb3V6YUBpbnRlbC5jb20+DQo+PiBD YzogYnJvdWVyQHJlZGhhdC5jb207IHhkcC1oaW50c0B4ZHAtcHJvamVjdC5uZXQ7IEVlbGNvIENo YXVkcm9uDQo+PiA8ZWNoYXVkcm9AcmVkaGF0LmNvbT47IEFuZHJpaSBOYWtyeWlrbyA8YW5kcmlp QGtlcm5lbC5vcmc+OyBGaWphbGtvd3NraSwNCj4+IE1hY2llaiA8bWFjaWVqLmZpamFsa293c2tp QGludGVsLmNvbT47IEJ1cmFrb3YsIEFuYXRvbHkNCj4+IDxhbmF0b2x5LmJ1cmFrb3ZAaW50ZWwu Y29tPg0KPj4gU3ViamVjdDogUmU6IFt4ZHAtaGludHNdIFJlOiBYRFAtaGludHMgdmlhIGxvY2Fs IEJURiBpbmZvDQo+Pg0KPj4gIkthcmxzc29uLCBNYWdudXMiIDxtYWdudXMua2FybHNzb25AaW50 ZWwuY29tPiB3cml0ZXM6DQo+Pg0KPj4+IFRvZ2V0aGVyIHdpdGggTWFjaWVqIGFuZCBBbmF0b2x5 LCBJIGhhdmUgYmVlbiB0b3lpbmcgd2l0aCBob3cgdG8NCj4+PiBhY2NvbXBsaXNoIHRoaXMsIGJ1 dCBpdCBpcyBlYXJseSBkYXlzIHNvIHdhcm5pbmcgZm9yIHNvbWUgc2VyaW91cw0KPj4+IGhhbmR3 YXZpbmcuIFdpbGwgcHJvZHVjZSBzb21lIGNvZGUgdG8gc2VlIGlmIGl0IGlzIHBvc3NpYmxlIGF0 IGFsbC4NCj4+PiBPbmUgZHJhd2JhY2sgd2l0aCBoYXZpbmcgaXQgY29tcGxldGVseSBmbGV4aWJs ZSBhbmQgbGV0dGluZyB1c2VyLXNwYWNlDQo+Pj4gZGVjaWRlIGlzIHRoZSBjb21wbGV4aXR5IGlt cGxlbWVudGluZyB0aGlzIGluIHRoZSBkcml2ZXIva2VybmVsLiBCdXQNCj4+PiBpcyB0aGlzIG5v dCB3aHkgd2UgaGF2ZSBlQlBGIGZvciBpbiB0aGUgZmlyc3QgcGxhY2U/IE1heWJlIGl0IGNhbiBj b21lDQo+Pj4gdG8gdGhlIHJlc2N1ZSBoZXJlLg0KPj4NCj4+IEkgdGhpbmsgdGhlcmUgYXJlIGEg Y291cGxlIG9mIGRpc3RpbmN0aW9ucyB3ZSBuZWVkIHRvIG1ha2UsIHdoaWNoIHlvdXINCj4+ICJo YW5kd2F2aW5nIiBnbG9zc2VzIG92ZXIgYSBsaXR0bGUgYml0IDopDQo+Pg0KPj4gRmlyc3QsIHdl IGhhdmUgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiB0d28gY2FzZXMgaGVyZTogaG93IHRvIHdvcmsg d2l0aA0KPj4gZXhpc3RpbmcgaGFyZHdhcmUgYW5kIGRyaXZlcnMgYW5kIHRoZWlyIG1ldGFkYXRh IGltcGxlbWVudGF0aW9ucywgYW5kIGhvdw0KPj4gdG8gd29yayB3aXRoIGZ1dHVyZSBkZXZpY2Vz IHRoYXQgd2lsbCAocHJlc3VtYWJseSkgYmUgY29tcGxldGVseSBmbGV4aWJsZQ0KPj4gYW5kL29y IHByb2dyYW1tYWJsZSB0byBwcm92aWRlIGFueSBtZXRhZGF0YSBjb25maWd1cmF0aW9uIGRpcmVj dGx5IGZyb20NCj4+IHRoZSBoYXJkd2FyZS4gVGhlIFhEUCBoaW50cyBzY2hlbWUgb2J2aW91c2x5 IG5lZWRzIHRvIHdvcmsgd2l0aCBib3RoLg0KPiANCj4gVGhhbmtzIFRva2UgZm9yIHByb3ZpZGlu ZyBmZWVkYmFjayBvbiB0aGlzLiBKdXN0IGhhZCB0byBnZXQgdGhpcyBzdHVmZiAib2ZmIG15IGNo ZXN0IiDwn5iJLiBJIHdhcyBzdHVjayBpbiB0aGUgemVyby1jb3B5IHdvcmxkIHdoZXJlIHlvdSBj YW4gbW9kaWZ5IGRyaXZlcnMsIGJ1dCBvZiBjb3Vyc2Ugd2UgbmVlZCB0byBjb25zaWRlciAib2xk ZXIiIGRyaXZlcnMgd2l0aCBYRFAgc3VwcG9ydC4gV2l0aCB0aGF0IGluIG1pbmQsIEkgZG8gYWdy ZWUgd2l0aCBtb3N0IG9mIHlvdXIgY29tbWVudHMuIFRoZXJlIGFyZSBzb21lIHF1ZXN0aW9ucyBh bmQgdGhvdWdodHMgaW50ZXJzcGVyc2VkIGJlbG93IGFuZCBhIHN1Z2dlc3Rpb24gZm9yIGhvdyB0 byBnbyBmb3J3YXJkIGF0IHRoZSBlbmQuDQo+IA0KDQpJIGRvIGFwcHJpY2lhdGUgdGhhdCB5b3Ug d2FudCB0byBkaXNjdXNzIGRyaXZlciBpbXBsZW1lbnRhdGlvbiwgYnV0IHRoaXMgDQplbWFpbCBh bmQgZXhhbXBsZSBwcm9ncmFtWzFdIHdhcyB0YXJnZXR0ZWQgYXQgYSBtdWNoIHNtYWxsZXIgc3Rl cC4NCg0KVGhlIG1haW4gcHVycG9zZSB3YXMgdG8gc2hvdy13aXRoLWNvZGUgdGhhdCBkZWNvZGlu ZyBCVEYgYW5kIHVzaW5nIGl0IA0KZnJvbSB1c2Vyc3BhY2UgaXMgbm90IGRpZmZpY3VsdC4gIEFu ZCBpdGVyYXRlIG9uIHRoZSBBUEkgYSBiaXQuDQoNCiAgWzFdIA0KaHR0cHM6Ly9naXRodWIuY29t L3hkcC1wcm9qZWN0L2JwZi1leGFtcGxlcy90cmVlL21hc3Rlci9BRl9YRFAtaW50ZXJhY3Rpb24N Cg0KQXMgVG9rZSBtZW50aW9uZWQsIEkgYWxzbyBiZWxpZXZlIGl0IGlzIG9ydGhvZ29uYWwuDQpJ IHRoaW5rIHdlIGFsbCBhZ3JlZSB0aGF0IEJURiB3aWxsIGJlIHRoZSB3YXkgdGhlIFhEUC1oaW50 cyB3aWxsIGJlIA0KImRlc2NyaWJlZCIsIGFuZCB3ZSBuZWVkIHRvIHByb3Bvc2UgQVBJcy9jb2Rl IHRoYXQgZG9lcyB0aGlzIGRlY29kaW5nIA0KZS5nLiBpbiB1c2Vyc3BhY2UuIChCdXQgSSBhbHNv IHdhbnQgdGhpbmdzIGxpa2UgY3B1bWFwIGtlcm5lbCBzaWRlIA0KWERQLXByb2cgdG8gdW5kZXJz dGFuZCB0aGlzKS4NCg0KQnV0IEknbSB0YWtpbmcgdGhlIGJhaXQsIGFuZCB3aWxsIGRpc2N1c3Mg d2l0aCB5b3UgYmVsb3cuLi4NCg0KDQo+PiBTZWNvbmRseSwgd2Ugc2hvdWxkIGRpc3Rpbmd1aXNo IGJldHdlZW4gdGhlIGNvbmZpZ3VyYXRpb24gaW50ZXJmYWNlIGFuZCB0aGUNCj4+IG1ldGFkYXRh IGNvbnN1bXB0aW9uIGZyb20gd2l0aGluIHRoZSBkYXRhIHBhdGguIEkgdGhpbmsgdGhvc2Ugc2hv dWxkIGJlDQo+PiBzZXBhcmF0ZSBpbnRlcmZhY2VzOyBpbiBwYXJ0aWN1bGFyLCBJIGRvbid0IHRo aW5rIGxvYWRpbmcgYW4gWERQIHByb2dyYW0gaW4NCj4+IGl0c2VsZiBzaG91bGQgaGF2ZSB0aGUg c2lkZSBlZmZlY3Qgb2YgcmVjb25maWd1cmluZyB0aGUgaGFyZHdhcmUgbWV0YWRhdGENCj4+IGZv cm1hdC4gUmF0aGVyLCB0aGUgcmVjb25maWd1cmF0aW9uIHNob3VsZCBiZSBhIHNlcGFyYXRlLCBl eHBsaWNpdCBzdGVwIHVzaW5nDQo+PiB3aGF0ZXZlciBBUEkgd2UgY2FuIGVuZCB1cCBhZ3JlZWlu ZyBvbiAoZXRodG9vbCBvciBydG5ldGxpbmsgY29tZSB0byBtaW5kDQo+PiBhcyBvYnZpb3VzIGNv bnRlbmRlcnMpLg0KDQpJIGFncmVlIHdpdGggVG9rZSwgdGhhdCB3ZSBzaG91bGQgZGlzdGluZ3Vp c2ggYmV0d2VlbiB0aGUgY29uZmlndXJhdGlvbiANCmludGVyZmFjZSBhbmQgbWV0YWRhdGEgY29u c3VtcHRpb24uDQoNCkRvIG5vdGljZSB0aGF0IHdlIEFMUkVBRFkgaGF2ZSBleGlzdGluZyBjb25m aWcgaW50ZXJmYWNlcyB0aGF0IGVuYWJsZXMgDQphbmQgZGlzYWJsZWQgSFcgaGludHMgcHJvdmlk ZWQgYnkgdGhlIGhhcmR3YXJlLiBIb3cgdG8gaGFuZGxlIHRoaXM/DQoNCkUuZy4gVGhlIEhXIFJY LXRpbWVzdGFtcCBmZWF0dXJlcyBjYW4gYmUgZW5hYmxlZCB3aGVuIGNhbGxpbmcgdGNwZHVtcCwg DQphbmQgd2lsbCBiZSBkaXNhYmxlZCBhZ2FpbiB3aGVuIHRjcGR1bXAgc3RvcCBhZ2Fpbi4NClRo dXMsIHRoaXMgYWN0aW9uIChlbmFibGUgSFctdGltZXN0YW1wKSB3aWxsIGxpa2VseSBjaGFuZ2Ug d2hhdCANClhEUC1oaW50cyBzdHJ1Y3R1cmUgdGhhdCBkcml2ZXIgdXNlcy4NCldoYXQgZG8geW91 IHRoaW5rIHRoZSBhY3Rpb24gc2hvdWxkIGJlPw0KDQpNeSBvcGluaW9uIGlzIHRvIHNpbXBseSB1 c2UgdGhlIGV4aXN0aW5nIGtlcm5lbCBBUEkgdG8gZW5hYmxlIHRoZXNlIA0KSFctdGltZXN0YW1w cy4gIFRvZGF5IHRoZSBTS0IgaXMgdXBkYXRlZCB3aXRoIHRoZSBIVy10aW1lc3RhbXAsIGFuZCBp biANCnRoZSBmdXR1cmUgSSB3b3VsZCBsaWtlIHRoZSBTS0IgdG8gYmUgY3JlYXRlZCBsYXRlciAo aW4gbmV0LWNvcmUpIGFuZCANCmdldCB0aGlzIEhXLXRpbWVzdGFtcCB2aWEgYW4gQlBGLXByb2cg dGhhdCBleHRyYWN0IHRoaXMgZnJvbSB0aGUgDQptZXRhZGF0YSBhcmVhLiAoSGludCB0b2RheSBt ZXRhZGF0YSBhcmVhIGFjdHVhbGx5IHN1cnZpdmVzIHdpdGggdGhlIFNLQiwgDQphbmQgY2FuIGJl IGFjY2Vzc2VkIGJ5IGUuZy4gVEMtQlBGKS4NClRodXMsIEkgZG8gd2FudCB0aGlzIHRvIHdvcmsg d2l0aCBvdXIgZXhpc3RpbmcgbmV0c3RhY2sgY29uZmlnIGludGVyZmFjZXMuDQoNCg0KPj4gSG93 ZXZlciwgdGhlDQo+PiAqZm9ybWF0KiBmb3IgdGhpcyBjb25maWd1cmF0aW9uIGNvdWxkIHZlcnkg d2VsbCBiZSBCVEYtYmFzZWQsIHNvIHVzZXJzcGFjZQ0KPj4gY2FuIGdldCB3aGF0ZXZlciBmb3Jt YXQgaXQgd2FudHMsIGFzc3VtaW5nIHRoZSBoYXJkd2FyZSBzdXBwb3J0cyBpdC4NCj4+DQo+PiBT bywgc2F5IHdlIGhhdmUgdGhpcyBmYW5jeSBwcm9ncmFtbWFibGUgaGFyZHdhcmUsIGFuZCB3ZSB3 cml0ZSBhIHByb2dyYW0NCj4+IHdpdGggYSBzdHJ1Y3QgZGVmaW5pdGlvbiBsaWtlOg0KPj4NCj4+ IHN0cnVjdCBteV9tZXRhX2Zvcm1hdCB7DQo+PiAgICAgICAgIF9fdTY0IHJ4X3RpbWVzdGFtcDsN Cj4+ICAgICAgICAgX191NjQgbWFnaWNfY29sb3VyX29mX3BhY2tldDsNCj4+ICAgICAgICAgX191 MzIgYnRmX2lkOw0KPj4gfTsNCj4+DQo+PiBhbmQgZnJvbSB1c2Vyc3BhY2Ugd2UgY2FuIHRoZW4g ZG86DQo+Pg0KPj4gZGV2X21ldGFkYXRhX2NvbmZpZ3VyZShpZmluZGV4LCBCVEZfT0ZfU1RSVUNU KG15X21ldGFfZm9ybWF0KSk7DQo+Pg0KPj4gd2hpY2ggd2lsbCBwYXNzIHRoZSBCVEYtZm9ybWF0 IHN0cnVjdCB0byB0aGUga2VybmVsIGFuZCBjb25maWd1cmUgdGhlDQo+PiBoYXJkd2FyZSB0byB3 cml0ZSB0aG9zZSBmaWVsZHMuIEFmdGVyIHRoaXMsIHRoZSBYRFAgcHJvZ3JhbSBjYW4ganVzdCBk bzoNCj4+DQo+PiBpbnQgbXlfeGRwX3Byb2coc3RydWN0IHhkcF9idWZmICpjdHgpDQo+PiB7DQo+ PiAgICBzdHJ1Y3QgbXlfbWV0YV9mb3JtYXQgKm1ldGEgPSBjdHgtPmRhdGFfbWV0YTsNCj4+DQo+ PiAgICBkb19zb21ldGhpbmdfd2l0aChtZXRhLT5tYWdpY19jb2xvdXJfb2ZfcGFja2V0KTsNCj4+ ICAgIHJldHVybiBYRFBfWFhYOw0KPj4gfQ0KPj4NCj4+IGFuZCBpdCB3aWxsIGp1c3Qgd29yay4g U2FtZSB0aGluZyBmcm9tIHVzZXJzcGFjZS4NCj4+DQo+PiBPciBpdCBjYW4gZGVmaW5lIGEgQ08t UkUgZW5hYmxlZCBzdHJ1Y3QgbGlrZToNCj4+DQo+PiBzdHJ1Y3QgbXlfbWV0YV9zdWJzZXQgew0K Pj4gICAgICAgICBfX3U2NCBtYWdpY19jb2xvdXJfb2ZfcGFja2V0OyAvKiB3ZSBvbmx5IGNhcmUg YWJvdXQgdGhpcyBhdHRyICovIH0NCj4+IF9fYXR0cmlidXRlX18oKHByZXNlcnZlX2FjY2Vzc19p bmRleCkpOw0KPj4NCj4+IGludCBteV94ZHBfcHJvZyhzdHJ1Y3QgeGRwX2J1ZmYgKmN0eCkNCj4+ IHsNCj4+ICAgIHN0cnVjdCBteV9tZXRhX3N1YnNldCAqbWV0YSA9IGN0eC0+ZGF0YV9tZXRhOw0K Pj4NCj4+ICAgIGRvX3NvbWV0aGluZ193aXRoKG1ldGEtPm1hZ2ljX2NvbG91cl9vZl9wYWNrZXQp Ow0KPj4gICAgcmV0dXJuIFhEUF9YWFg7DQo+PiB9DQo+Pg0KPj4gYW5kIGxpYmJwZiB3aWxsIHJl d3JpdGUgdGhlIGZpZWxkIGFjY2Vzc2VzIHVzaW5nIHRoZSBCVEYgaW5mb3JtYXRpb24sIHJlLQ0K Pj4gZXhwb3J0ZWQgZnJvbSB0aGUga2VybmVsIGZyb20gd2hhdCB1c2Vyc3BhY2UgcGFzc2VkIGlu IHdoZW4gY29uZmlndXJpbmcuDQo+Pg0KDQpJJ3ZlIGFsc28gYmVlbiBkb3duIHRoZSBzYW1lIHJh YmJpdCBob2xlLCB3YW50aW5nIHVzZXJzcGFjZSB0byBkZWZpbmUgDQpCVEYgbGF5b3V0IGFzIHRo ZSBjb25maWcgaW50ZXJmYWNlIHRoYXQgSFcgd2lsbCBnZXQgcmVjb25maWd1cmVkIHZpYS4NCkkg bm8tbG9uZ2VyIGJlbGlldmUgaW4gdGhpcyBtb2RlLiAgT25lIHJlYXNvbiBpcyB0aGUgZXhpc3Rp bmcgY29uZmlnIA0KaW50ZXJmYWNlcyB0aGF0IGVuYWJsZS9kaXNhYmxlIE5JQyBIVyBmZWF0dXJl cy4NCg0KT25lIHdheSB3ZSBjYW4gYWxsb3cgdXNlcnNwYWNlIHRvIGRlZmluZSB0aGUgY29udGVu dHMgb2YgdGhlIFhEUC1oaW50cyANCnN0cnVjdCwgbm90IHRoZSBIVyBjb25maWcsIGlzIHRvIGFk ZCB0aGlzIG5ldyBCUEYgJ2hpbnRzLWhvb2snLg0KVXNlcnNwYWNlIGNhbiBxdWVyeSB0aGUgQlBG LXByb2cgbG9hZGVkIGluIHRoZSAnaGludHMtaG9vaycgYW5kIHNlZSB0aGF0IA0KQlRGIHN0cnVj dHMgaXQgcHJvdmlkZS4NClRoaXMgaXMgc2ltaWxhciB0byB0aGF0IEkgZG8gZm9yIEFGX1hEUCBp biBbMV0sIGFzIHRoZSBYRFAgQlBGLXByb2cgDQpkZWZpbmVzIHRoZSBsYXlvdXQgYW5kIEFGX1hE UCB1c2Vyc3BhY2UgcXVlcmllcyB0aGUgQlRGIGF2YWlsLg0KDQoNCj4+IFdpdGggdGhlIGFib3Zl IGluIG1pbmQsIGEgZmV3IGNvbW1lbnRzIG9uIHNvbWUgb2YgeW91ciBvdGhlciBwb2ludHM6DQo+ Pg0KPj4+IFRoZSBrZXkgZmVhdHVyZSBoZXJlIGlzIHRoYXQgYnBmX3hkcF9nZXRfbWV0YWRhdGEo KSB3aWxsIGFjdHVhbGx5IGdvDQo+Pj4gYW5kIGZldGNoIHRoaXMgZnJvbSB0aGUgSFcsIGJ5IGNh bGxpbmcgYSBzbWFsbCBjYWxsYmFjayBmdW5jdGlvbiBpbg0KPj4+IHRoZSBkcml2ZXIgdGhhdCBy ZWFkcyBmb3IgZXhhbXBsZSByeF90aW1lc3RhbXAgZnJvbSB0aGUgSFcgYW5kIHJldHVybnMNCj4+ PiBpdCB0byB0aGUgWERQIHByb2dyYW0uIFRoaXMgaXMgY2xlYXJseSBub3QgcG9zc2libGUgdG9k YXkgYW5kIHdvdWxkDQo+Pj4gcmVxdWlyZSBuZXcgcGx1bWJpbmcsIGlmIGl0IGlzIGV2ZW4gcG9z c2libGUgdG8gaW1wbGVtZW50IHRoaXMuIEJ1dA0KPj4+IGxldCB1cyBsZWF2ZSBhc2lkZSB0aGUg aW1wbGVtZW50YXRpb24gZm9yIG5vdyBhbmQganVzdCBmb2N1cyBvbiB0aGUNCj4+PiBiZW5lZml0 IHRoaXMgKG9yIHNvbWV0aGluZyBsaWtlIGl0KSBjb3VsZCBwcm92aWRlIGNvbXBhcmVkIHRvIGEN Cj4+PiBrZXJuZWwtY2VudHJpYyBhcHByb2FjaC4NCj4+DQo+PiBUb29rIG1lIGEgd2hpbGUgdG8g dW5kZXJzdGFuZCB3aGF0IHlvdSBtZWFudCB3aXRoIHRoaXMsIGJ1dCBJIHRoaW5rIGl0IGZpbmFs bHkNCj4+IGNsaWNrZWQgd2l0aCB5b3VyIGV4YW1wbGUgYmVsb3csIHNvIEknbGwgbGVhdmUgdGhl IGNvbW1lbnQgdG8gdGhlcmUuLi4NCj4+DQo+Pj4gKiBVc2VyLXNwYWNlIGNhbiBjb21wbGV0ZWx5 IGNvbnRyb2wgd2hlcmUgdG8gcHV0IGRhdGEgYW5kIHdoYXQgaXQgcHV0cw0KPj4+IHRoZXJlLiBU aGluayBvZiBwcm9kdWNpbmcgdGhlIHN0cnVjdHVyZSB5b3Ugd2FudCBpbiB1c2VyIHNwYWNlDQo+ Pj4gZGlyZWN0bHkgd2l0aG91dCBoYXZpbmcgdG8gY29weSB0aGluZ3MgYXJvdW5kLiBZb3UgY291 bGQgZm9yIGV4YW1wbGUNCj4+PiBwcm9kdWNlIGEgRFBESyBtYnVmLCBvciB0aGUgVlBQLCBTdXJp a2F0YSBlcXVpdmFsZW50IGRpcmVjdGx5LiBXb3VsZA0KPj4+IHNhdmUgYSBsb3Qgb2YgY3ljbGVz Lg0KPj4NCj4+IEkgdGhpbmsgdGhhdCB1c2Vyc3BhY2UgYmVpbmcgaW4gY29udHJvbCBvZiB0aGUg bWV0YWRhdGEgZm9ybWF0IGlzIGEgZ3JlYXQgZ29hbA0KPj4gd2Ugc2hvdWxkIGtlZXAgaW4gbWlu ZCwgYW5kIGFzIG1lbnRpb25lZCBhYm92ZSB3ZSBjYW4gZG8gdGhhdCB3aXRoIGEgQlRGLQ0KPj4g YmFzZWQgaW50ZXJmYWNlLg0KPj4NCj4+PiAqIE5vIG5lZWQgZm9yIGEgbWV0YWRhdGEgZW5hYmxl bWVudCBpbnRlcmZhY2UuIGVCUEYgY291bGQgZmluZCB0aGlzDQo+Pj4gb3V0IGJ5IGp1c3QgcGFy c2luZyB0aGUgWERQIHByb2dyYW0gYW5kIGVuYWJsZSB0aGUgdXNlZCBtZXRhZGF0YQ0KPj4+IGZl YXR1cmVzIGluIHRoZSBIVyBieSBjYWxsaW5nIGVuYWJsZS9kaXNhYmxlIG1ldGFkYXRhIGZ1bmN0 aW9ucyBpbiB0aGUNCj4+PiBkcml2ZXIuDQo+Pg0KPj4gQXMgbWVudGlvbmVkIGFib3ZlIEkgdGhp bmsgdGhpcyBpcyBhIG1pcy1mZWF0dXJlOiBjb25maWd1cmF0aW9uIHNob3VsZCBiZQ0KPj4gZXhw bGljaXQgYW5kIG91dCBvZiBiYW5kLCBub3QgdGllZCB0byB0aGUgZGF0YSBwYXRoIGltcGxlbWVu dGF0aW9uLg0KPj4NCg0KSSBhZ3JlZS4gQWxzbyBjb25zaWRlciB0aGUgZXhpc3RpbmcgY29uZmln IGludGVyZmFjZXMgdGhhdCB3ZSBjYW5ub3QgDQppZ25vcmUgYW5kIGhhdmUgdG8gY29sbGFib3Jh dGUgd2l0aC4NCg0KPj4+ICogTm8gcmVhc29uIHRvIGV4cG9zZSBCVEZzIHRvIHVzZXItc3BhY2Uu IE1ha2VzIGl0IGEgbG90IHNpbXBsZXIuDQo+Pj4gQWN0dWFsbHksIG5vIG5lZWQgdG8gdXNlIHRo ZW0gaW4gdGhlIGRyaXZlciBlaXRoZXIuDQo+Pg0KPj4gQlRGIGlzIGp1c3QgYSBoYW5keSBmb3Jt YXQgZm9yIGRlc2NyaWJpbmcgdGhlIGRhdGEgbGF5b3V0LiBUaGVyZSBoYXMgdG8gYmUNCj4+ICpz b21lKiBmb3JtYXQgdG8gY29tbXVuaWNhdGUgdGhpcywgYW5kIGV4cG9zaW5nIHRoZSBCVEYgZm9y bWF0IHRvDQo+PiB1c2Vyc3BhY2UgaXMganVzdCBhIHdheSBmb3IgdGhlIGtlcm5lbCB0byBzYXkg InRoaXMgaXMgaG93IHRoZSBoYXJkd2FyZSBpcw0KPj4gY3VycmVudGx5IGNvbmZpZ3VyZWQiLiBJ IGRvbid0IHVuZGVyc3RhbmQgd2h5IHlvdSB0aGluayBub3QgaGF2aW5nIHRoYXQNCj4+IG1ha2Vz IHRoaW5ncyBzaW1wbGVyPw0KPiANCj4gSSBqdXN0IHRoaW5rIHRoYXQgYSBvbmUtbGluZXIgaW4g YSBwcm9ncmFtIGlzIHNpbXBsZXIgdGhhbiBhbiBlbnRyeSBpbiB0aGUgQlRGIGZvcm1hdC4gQnV0 IHRoaXMgaXMgbW9vdCBhbnl3YXkuIFlvdSBjYW5ub3QgdXNlIGEgcHJvZ3JhbSB0byBjb21tdW5p Y2F0ZSBmcm9tIHRoZSBrZXJuZWwsIHNvIEJURiBpdCBpcy4NCj4gDQoNCkFzIEkgZGVtb25zdHJh dGVkIHdpdGggY29kZSwgaXQgaXMgbm90IHRoYXQgZGlmZmljdWx0IHRvIGRlY29kZSBhbmQgcmVh ZCANCkJURiBmcm9tIHVzZXJzcGFjZS4NCihNYXliZSBpbiB0aGUgZnV0dXJlIEdDQyB3aWxsIGdl dCBiZXR0ZXIgc3VwcG9ydCBhbmQgaGlkZSBwYXJ0IG9mIHRoaXMgDQpmb3IgdXMpDQoNCj4+PiAq IFdlIGRvIG5vdCBoYXZlIHRvIHVzZSB0aGUgbWV0YWRhdGEgYXJlYSB1bmxlc3MgaXQgaXMgYWN0 dWFsbHkNCj4+PiBuZWVkZWQuIEluIHRoZSBjYXNlIG9mIEFGX1hEUCwgd2UgaGF2ZSB0byB3cml0 ZSBpdCB0aGVyZSwgYnV0IGxvY2FsDQo+Pj4gdXNlIGluIFhEUCBkb2VzIG5vdC4gWW91IHdvdWxk IHNhdmUgb25lIGNhY2hlIG1pc3MgcGVyIHBhY2tldCByaWdodA0KPj4+IHRoZXJlLg0KPj4NCj4+ IFJlZ2FyZGxlc3Mgb2YgaG93IHRoZSBmb3JtYXQgaXMgY29uZmlndXJlZCwgd2h5IHdvdWxkIGFu IFhEUCBwcm9ncmFtIHJlYWQNCj4+IGl0IGlmIGl0IGRvZXNuJ3QgbmVlZCBpdD8NCj4gDQo+IFRo ZSBkcml2ZXIgcmVhZHMgc29tZSBtZXRhZGF0YSBlbnRyeSBmcm9tIEhXIGFuZCBwdXRzIGl0IGlu IHRoZSBtZXRhZGF0YSBzZWN0aW9uIGJlZm9yZSB0aGUgcGFja2V0LiBYRFAgaXMgaW52b2tlZCBh bmQgcmVhZHMgdGhpcyBlbnRyeSBmcm9tIHRoZSBtZXRhZGF0YSBhcmVhIGFuZCB1c2VzIGl0IGlu IHNvbWUgd2F5LiBUaGlzIGdlbmVyYXRlcyBhIGNhY2hlIG1pc3MgZm9yIHRoZSB3cml0ZS9yZWFk IHRvIHRoZSBtZXRhZGF0YSBlbnRyeS4gQ29tcGFyZSB0aGlzIHRvIHRoZSBYRFAgcHJvZ3JhbSBj YWxscyBhIGhlbHBlciB0aGF0IHJlYWRzIHRoZSBtZXRhZGF0YSBmcm9tIEhXIGFuZCBwdXRzIGl0 IGRpcmVjdGx5IGludG8gYSBsb2NhbCB2YXJpYWJsZSBpbiB0aGUgWERQIHByb2dyYW0uIE1ldGFk YXRhIGFyZWEgaXMgbm90IHVzZWQsIGFuZCB3ZSBzYXZlIG9uZSBjYWNoZSBtaXNzLg0KPiANCg0K SG1tLi4uIEkgYmVsaWV2ZSB3ZSBjYW4gaGlkZSB0aGlzIGNhY2hlIG1pc3MgdmlhIHByZWZldGNo aW5nLg0KDQpBbmQgdGhlcmUgYXJlIGFjdHVhbGx5IHR3byBzaXR1YXRpb25zIHdlIG5lZWQgdG8g Y29uc2lkZXIuDQoNCiAgMS4gU29mdHdhcmUgcGF0aDogbWV0YWRhdGEgaXMgd3JpdHRlbiB0byBi eSBkcml2ZXIuDQoNCiAgMi4gSGFyZHdhcmUgcGF0aDogbWV0YWRhdGEgaXMgd3JpdHRlbiBieSBu ZXcgTklDIGhhcmR3YXJlLg0KDQpDYXNlIDEsIHBhY2tldCBkYXRhIHN0YXJ0cyBvbiBhIGNhY2hl LWxpbmUsIHRodXMgbWludXMgb2Zmc2V0IHdpbGwgYmUgb24gDQphIHNlcGFyYXRlIGNhY2hlLWxp bmUsIHRoYXQgaXMgbm90IGNvdmVyZWQgYnkgRE1BLW9wZXJhdGlvbi4gIFRodXMgdGhpcyANCmNh Y2hlLWxpbmUgY2FuIGJlIHByZWZldGNoZWQgYW5kIGlzIGxpa2VseSBhbHJlYWR5IGluIGNhY2hl Lg0KDQpDYXNlIDIsIG1ldGFkYXRhIGFyZWEgd2lsbCBiZSBjb3ZlcmVkIGJ5IERNQSBhcmVhLCBh bmQgY2FjaGUtbGluZSB3aWxsIA0Kbm93IGJlIG1vcmUgY29sZC4gIEl0IHdpbGwgYmUgY292ZXJl ZCBieSBERElPIGZlYXR1cmUsIG1lYW5pbmcgaXQgd2lsbCANCmJlIGRlbGl2ZXJlZCBpbiBMMy1j YWNoZS4gIFRodXMsIG5vdCBhIGZ1bGwgY2FjaGUtbWlzcyBhbmQgcHJlZmV0Y2ggZnJvbSANCkwz IGNvdWxkIGJlIGRvYWJsZSwgd2hpbGUgcmVhZGluZyBSWC1kZXNjIGRhdGEuDQoNCg0KPj4+ICog V2UgZ2V0IGF3YXkgZnJvbSBub24tc2NhbGFibGUgZHJpdmVyIGltcGxlbWVudGF0aW9ucyBzdWNo IGFzOg0KPj4+DQo+Pj4gSWYgKG1ldGFkYXRhX2FfZW5hYmxlZCkNCj4+PiAgICAgIG1ldGEtPmEg PSBSZWFkX21ldGFkYXRhX2EoKTsNCj4+PiBJZiAobWV0YWRhdGFfYl9lbmFibGVkKQ0KPj4+ICAg ICAgbWV0YS0+YiA9IFJlYWRfbWV0YWRhdGFfYigpOw0KPj4+IElmIChtZXRhZGF0YV9jX2VuYWJs ZWQpDQo+Pj4gICAgICBtZXRhLT5jID0gUmVhZF9tZXRhZGF0YV9jKCk7DQo+Pj4gICBhbmQgc28g b24gZm9yIG1hbnkgZW50cmllcy4uLi4uDQo+Pg0KPj4gSW1wbGVtZW50YXRpb25zIHN1Y2ggYXMg dGhpcyBleGlzdCwgdGhvdWdoLCBhbmQgd2UgaGF2ZSB0byBzdXBwb3J0IHRoZW07IGFzDQo+PiBt ZW50aW9uZWQgYWJvdmUsIEkgdGhpbmsgaXQncyBhYnNvbHV0ZWx5IGEgd29ydGh5IGdvYWwgdG8g bWFrZSB0aGUgbWV0YWRhdGENCj4+IGZvcm1hdCBjb21wbGV0ZWx5IGZ1bmdpYmxlIGZyb20gdXNl cnNwYWNlLCBidXQgdGhlIFhEUCBoaW50cyBpbnRlcmZhY2UNCj4+IG5lZWRzIHRvIGFsc28gc3Vw cG9ydCBvbGQgZHJpdmVycyB0aGF0IGRvIHRoaW5ncyBpbiB0aGUgdHJhZGl0aW9uYWwgd2F5LCBl dmVuIGlmDQo+PiBpdCdzIGluZWZmaWNpZW50Lg0KPj4+DQo+Pj4gT3IgZXZlbiB3b3JzZToNCj4+ PiAgICAgIG1ldGEtPmEgPSBSZWFkX21ldGFkYXRhX2IoKTsNCj4+PiAgICAgIG1ldGEtPmIgPSBS ZWFkX21ldGFkYXRhX2EoKTsNCj4+PiAgICAgIG1ldGEtPmMgPSBSZWFkX21ldGFkYXRhX2MoKTsN Cj4+PiAgICAgIGFuZCBzbyBvbi4uLi4NCj4+Pg0KPj4+IFRoZSBsYXN0IG9uZSB3b3VsZCBraWxs IHBlcmZvcm1hbmNlIGFueSBkYXkuIEV2ZW4gdGhlIGZpcnN0IG9uZSBpcw0KPj4+IHNodW5uZWQg aW4gRFBESyBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4NCj4+Pg0KPj4+IE5vdGUgdGhhdCBpbiBt eSBwcm9wb3NhbCBhYm92ZSwgcmVhZF9tZXRhZGF0YV9hKCkgaXMgYSBmdW5jdGlvbiB0aGF0DQo+ Pj4gd2lsbCBiZSBjYWxsZWQgZnJvbSB0aGUgWERQIHByb2dyYW0gd2hlbiBuZWVkZWQgYW5kIG9u bHkgdGhlbiwgbm90DQo+Pj4gZnJvbSB0aGUgZHJpdmVyLCBzbyBkcml2ZXIgY29kZSBiZWNvbWVz IHVuY2x1dHRlcmVkIGJ5IHRoZXNlIGxhcmdlIGlmDQo+Pj4gc3RhdGVtZW50cy4NCj4+DQo+PiBB aCwgd2l0aCB0aGlzIGJpdCBJIHVuZGVyc3Rvb2QgeW91ciBwb2ludCBhYm92ZSBhYm91dCAiYSBo ZWxwZXIgcmVhZGluZyB0aGUNCj4+IGRhdGEgZnJvbSB0aGUgaGFyZHdhcmUiLiBMZXQgbWUgc2Vl IGlmIEkgY2FuIHJlcGhyYXNlIHlvdXIgcHJvcG9zYWwsIGFuZCBsZXQNCj4+IG1lIGtub3cgaWYg SSBnb3QgaXQgd3Jvbmc6DQo+Pg0KPj4gVGhlIHByb2JsZW0geW91J3JlIHNwZWFraW5nIG9mIGhl cmUsIGlzIHRoYXQgb2YgdHJhbnNmb3JtaW5nIHRoZSBiaXRzIHRoYXQNCj4+IGNvbWUgaW4gZnJv bSB0aGUgaGFyZHdhcmUgKGluIGFuIFJYLWRlc2MsIHNheSksIGludG8gdGhlIG1ldGFkYXRhIGZv cm1hdA0KPj4gY29uc3VtZWQgYnkgWERQLiBTYXksIGZvciBpbnN0YW5jZSB0aGF0IHRoZSBkcml2 ZXIgaGFzIGEgZnVuY3Rpb24NCj4+IGxpa2U6DQo+Pg0KPj4gdTY0IG15X2RyaXZlcl9yZWFkX3J4 X3RpbWVzdGFtcCh2b2lkICpwa3RfZHNjKTsNCj4+DQo+PiB3aGljaCBkb2VzIHdoYXRldmVyIGJp dCBvZiBkZXZpY2Utc3BlY2lmaWMgbWFnaWMgaXQgbmVlZGVkIHRvIGdldCBhIHdlbGwtDQo+PiBm b3JtZWQgdTY0IHRpbWVzdGFtcCBvdXQgb2YgdGhlIHBhY2tldCBkZXNjcmlwdG9yLCBtYXliZSBp bnZvbHZpbmcNCj4+IGhhbmRsaW5nIEhXLXNwZWNpZmljIHF1aXJrcyBldGMuIEFuZCB5b3Ugd2Fu dCB0byBleHBvc2UgdGhpcyBmdW5jdGlvbg0KPj4gZGlyZWN0bHkgdG8gQlBGIGluc3RlYWQgb2Yg aGF2aW5nIGEgYmlnIGNvbmRpdGlvbmFsIGluIHRoZSBkcml2ZXIgQyBjb2RlLCBzbyB3ZQ0KPj4g Y2FuIHVzZSBCUEYgY29kZSBlbGltaW5hdGlvbiB0byBvbmx5IGdldCB0aGUgYml0cyB3ZSB3YW50 LCByaWdodD8NCj4gDQo+IFlvdSBnb3QgaXQhDQoNCk5vdGljZSB0aGUgaGFuZGxpbmcgSFctc3Bl Y2lmaWMgcXVpcmtzLCB3aGljaCBpcyB3aHkgd2UgY2Fubm90IHNpbXBseSANCmdpdmUgWERQIEJQ Ri1wcm9nIGFjY2VzcyB0byB0aGUgUlgtZGVzYy4NCg0KDQo+PiBUaGlzIGlzIGFjdHVhbGx5IHNv bWV0aGluZyBKZXNwZXIgYW5kIEkgaGF2ZSBiZWVuIGRpc2N1c3NpbmcgYXMgYSBwb3NzaWJsZQ0K Pj4gZnV0dXJlIHNvbHV0aW9uISBIb3dldmVyLCB3aGF0IHdlIGRpc2N1c3NlZCB3YXMgbm90IGV4 cG9zaW5nIHRoaXMgKnRvDQo+PiBYRFAqLCBidXQgcmF0aGVyIHRvIGhhdmUgYSBzZXBhcmF0ZSBC UEYgcHJvZ3JhbSAqd2hpY2ggaXMgcGFydCBvZiB0aGUNCj4+IGRyaXZlciogdGhhdCBkb2VzIHRo aXMuIEFuZCB0aGlzIEJQRiBwcm9ncmFtIGNhbiB0aGVuIGJlIHBhaXJlZCB3aXRoIHRoZSBCVEYN Cj4+IGZvcm1hdCBjb21pbmcgaW4gZnJvbSB1c2Vyc3BhY2UsIHNvIHRoYXQgaXQgd2lsbCBvbmx5 IGxvYWQgdGhlIGZpZWxkcw0KPj4gcmVxdWVzdGVkLiBTbywgZ29pbmcgYmFjayB0byBteSBpbWFn aW5hcnkgY29uZmlndXJhdGlvbiBpbnRlcmZhY2UgYWJvdmUsDQo+PiB3aGVuIHVzZXJzcGFjZSBj YWxsczoNCj4+DQoNClllcywgZXhhY3RseS4NCg0KSWYgd2UgaW50cm9kdWNlIGEgQlBGIGhpbnRz LWhvb2ssIHdlIGNvdWxkIGdpdmUgdGhpcyBuZXcgQlBGIGhvb2sgYWNjZXNzIA0KdG8gdGhlIFJY LWRlc2MgKGFuZCBYRFAtPmN0eCAvIHhkcF9idWZmKSBwbHVzIHNvbWUgZHJpdmVyIHNwZWNpZmlj IA0Kc3RhdHVzIHF1aXJrcy1iaXRzLiAgVGhlIGRyaXZlciBkZXZlbG9wZXJzLCB0aGF0IGtub3cg dGhlIHF1aXJrcywgY291bGQgDQpzaGlwIGEgQlBGLXByb2cgdG9nZXRoZXIgd2l0aCBkcml2ZXIg Y29kZSB0aGF0IGNyZWF0ZXMvd3JpdGVzIHRoZSANCm1ldGFkYXRhIGFyZWEgQU5EIHRoaXMgQlBG LXByb2cgY291bGQgREVGSU5FIHRoZSBzdHJ1Y3QgbmFtZSBhbmQgbGF5b3V0IA0KYXMgQlRGICh3 aGljaCB1c2Vyc3BhY2UgY2FuIHF1ZXJ5IGFuZCBleHRyYWN0KS4NCg0KDQo+PiBkZXZfbWV0YWRh dGFfY29uZmlndXJlKGlmaW5kZXgsIEJURl9PRl9TVFJVQ1QobXlfbWV0YV9mb3JtYXQpKTsNCj4+ DQo+PiB0aGUgZHJpdmVyIHR1cm5zIHRoaXMgb3ZlciB0byB0aGUgQlBGIHN1YnN5c3RlbSB3aXRo IGEgQlBGIHByb2dyYW0gbGlrZToNCj4+DQo+PiBpbnQgbXlfZHJpdmVyX2NvbnZlcnRfbWV0YSh2 b2lkICpjdHgsIHZvaWQgKm1ldGFfZHN0KSB7DQo+PiAgICAgICAgICBzdHJ1Y3QgbXlfbWV0YV9m b3JtYXQgKm1ldGFfZHN0X2ZtdCA9IG1ldGFfZHN0Ow0KPj4NCj4+ICAgICAgICAgIGlmIChicGZf Y29yZV9maWVsZF9leGlzdHMobWV0YV9kc3QtPnJ4X3RpbWVzdGFtcCkpDQo+PiAgICAgICAgICAg ICBtZXRhX2RzdC0+cnhfdGltZXN0YW1wID0gbXlfZHJpdmVyX3JlYWRfcnhfdGltZXN0YW1wKGN0 eCk7DQo+PiAgICAgICAgICBpZiAoYnBmX2NvcmVfZmllbGRfZXhpc3RzKG1ldGFfZHN0LT5tYWdp Y19jb2xvdXJfb2ZfcGFja2V0KSkNCj4+ICAgICAgICAgICAgIG1ldGFfZHN0LT5tYWdpY19jb2xv dXJfb2ZfcGFja2V0ID0NCj4+IG15X2RyaXZlcl9yZWFkX21hZ2ljX2NvbG91cl9vZl9wYWNrZXQo Y3R4KTsNCj4+ICAgICAgICAgIC4uLmV0Yw0KPj4gfQ0KPj4NCj4+DQo+PiBBbmQgdGhlbiB0aGUg ZHJpdmVyIGNvZGUgd2hlcmUgYmVmb3JlIHlvdSBoYWQsIGFzIHlvdSBzYWlkOg0KPj4NCj4+PiBJ ZiAobWV0YWRhdGFfYV9lbmFibGVkKQ0KPj4+ICAgICAgbWV0YS0+YSA9IFJlYWRfbWV0YWRhdGFf YSgpOw0KPj4+IElmIChtZXRhZGF0YV9iX2VuYWJsZWQpDQo+Pj4gICAgICBtZXRhLT5iID0gUmVh ZF9tZXRhZGF0YV9iKCk7DQo+Pg0KPj4gd2lsbCBqdXN0IGJlDQo+Pg0KPj4gQlBGX1BST0dfUlVO KGRydi0+bWV0YV93cml0ZXJfcHJvZywgbWV0YSk7DQo+Pg0KPj4gYW5kIHRoYXQgd2lsbCBydW4g dGhlIEJQRiBwcm9ncmFtIHRoYXQgd2FzIGxvYWRlZCAodmlhIGEgdXNlcm1vZGUgaGVscGVyLA0K Pj4gcHJvYmFibHkpIHdoZW4gdXNlcnNwYWNlIGNvbmZpZ3VyZWQgdGhlIG1ldGFkYXRhIGZvcm1h dCBhbmQgd2UnbGwgZ2V0IHRoZQ0KPj4gY29uZGl0aW9uYWwgY29kZSBnb29kbmVzcyBhbmQgYmV0 dGVyIHBlcmZvcm1hbmNlLg0KPiANCj4gUGVyZmVjdCEgVGhpcyB3YXMgYWN0dWFsbHkgbXkgZmly c3QgdGhvdWdodCB0b28sIHRvIGhhdmUgYSBuZXcgaG9vayBwb2ludCBmb3IgbWV0YWRhdGEgcG9w dWxhdGlvbi4gQnV0IEkgdHVybmVkIHRvIHRoZSBjdXJyZW50IGFwcHJvYWNoIGJlY2F1c2UgSSB0 aG91Z2h0IGl0IHdvdWxkIGJlIHRvbyBoYXJkIHRvIGdldCBhIG5ldyBob29rIHBvaW50IGluLiBU aG91Z2gsIHRoZXJlIGFyZSBwb3RlbnRpYWxseSBhIG51bWJlciBvZiBhZHZhbnRhZ2VzIHdpdGgg aGF2aW5nIGEgbmV3IGhvb2sgcG9pbnQgZm9yIHRoaXMuIE9uZSBmcm9tIGFuIEFGX1hEUCBwb2lu dCBvZiB2aWV3IHdvdWxkIGJlIHRoYXQgd2UgY291bGQgb3B0aW9uYWxseSBwZXJmb3JtIHRoZSBh dHRhY2ggb24gYSBwZXIgbmV0ZGV2L3F1ZXVlIGJhc2lzIGFuZCBnZXQgYSBtdWNoIGVhc2llciBo YW5kbGluZyBvZiBwZXIgQUZfWERQIGFwcGxpY2F0aW9uL3NvY2tldCBtZXRhZGF0YSB1c2FnZS4g QnV0IGdyZWF0IHRoYXQgd2UgYXJlIHRoaW5raW5nIGFib3V0IHJvdWdobHkgdGhlIHNhbWUgdGhp bmdzLiBFbmNvdXJhZ2luZy4NCj4gDQoNCkkgd291bGQgc3VwcG9ydCBhIG5ldyBob29rIHBvaW50 IGZvciBtZXRhZGF0YSBwb3B1bGF0aW9uLg0KDQpCdXQgYmVmb3JlIHdlIGdldCB0aGlzIGZhciwg SSB0aGluayB0aGF0IGRyaXZlcnMgc2hvdWxkIGJlIGV4dGVuZGVkIHdpdGggDQptZXRhZGF0YSBw b3B1bGF0aW9uIHVzaW5nIG5vcm1hbCBDLWNvZGUuICBBbmQgdGhlbiB3ZSBjYW4gYWRkIHRoaXMg bmV3IA0KaG9vaywgdGhhdCBnaXZlcyBmbGV4aWJpbGl0eSBiYWNrIHRvIGVuZC11c2VycyAoYWxs b3dpbmcgQlBGLXByb2dyYW1tZXJzIA0KdG8gcmVwbGFjZSB0aGUgZHJpdmVyIHByb3ZpZGVkIHBy b2dyYW0pLg0KDQoNCj4+IEhvd2V2ZXIsIGhhdmluZyBzdWNoIGEgZmFjaWxpdHkgZm9yIGRyaXZl cnMgdG8gZHluYW1pY2FsbHkgKndyaXRlKiBtZXRhZGF0YQ0KPj4gaXMsIEkgYmVsaWV2ZSwgY29t cGxldGVseSBvcnRob2dvbmFsIHRvIGhvdyB3ZSBpbXBsZW1lbnQgdGhlIGRlc2NyaXB0aW9uDQo+ PiBmb3JtYXQgZm9yIGNvbnN1bWluZyB0aGlzIG1ldGFkYXRhIGZyb20gWERQIGFuZCB1c2Vyc3Bh Y2UuDQo+PiBGb3Igb25lIHRoaW5nLCBub3QgYWxsIGRyaXZlcnMgd2lsbCBwcm9iYWJseSB3YW50 IHRvIHVzZSB0aGUgZHluYW1pYyBtZXRob2QsDQo+PiBzbyB3ZSBzaG91bGQgbm90IHRpZSB1cCB0 aGUgY29uc3VtcHRpb24gb2YgbWV0YWRhdGEgdG8gdGhpcy4gRm9yIGFub3RoZXIsDQo+PiBpdCdz IHdheSB0b28gY29tcGxleCB0byBpbXBsZW1lbnQgZXZlcnl0aGluZyBhdCBvbmNlLCBzbyBkZWZp bmluZyB0aGUNCj4+IGNvbnN1bXB0aW9uIGZvcm1hdCBmaXJzdCwgdGhlbiB3b3JraW5nIG9uIGVm ZmljaWVudGx5IHdyaXRpbmcgaXQgYWZ0ZXJ3YXJkcyAob3INCj4+IGluIHBhcmFsbGVsLCBtYXli ZSkgbWFrZXMgaXQgcG9zc2libGUgdG8gaGF2ZSBpbmNyZW1lbnRhbCBwcm9ncmVzcy4NCj4gDQo+ IEFncmVlZC4NCg0KWWVzLCB3ZSBuZWVkIHBhcnRpdGlvbiB0aGlzIHdvcmsgZWZmb3J0IGludG8g c21hbGxlciBiaXRzLCBzbyB3ZSBjYW4gDQptYWtlIHByb2dyZXNzLiAgSSB0aGluayBwZW9wbGUg aGF2ZSB0YWxrZWQgYWJvdXQgWERQLWhpbnRzIGZvciBtb3JlIHRoYW4gDQozLXllYXJzIG5vdy4u LiB3ZSBuZWVkIHRvIG1ha2Ugc29tZSByZWFsIGNvZGUgcHJvZ3Jlc3MuDQoNCj4gDQo+PiBUaGF0 IGJlaW5nIHNhaWQsIGhhdmluZyBib3RoIHRoaW5ncyBpbiBtaW5kIHdoZW4gZGVmaW5pbmcgdGhp bmdzIGlzIGEgZ29vZA0KPj4gaWRlYS4gQnV0IGFzIEkgaGF2ZSBob3BlZnVsbHkgb3V0bGluZWQg YWJvdmUsIHVzaW5nIEJURiBhcyB0aGUgZGVzY3JpcHRpb24NCj4+IGZvcm1hdCBhbGxvd3MgYm90 aCB3cml0aW5nIGFuZCByZWFkaW5nIG9mIG1ldGFkYXRhIHRvIGJlIGZsZXhpYmxlIGFuZA0KPj4g ZXh0ZW5zaWJsZS4NCj4+DQo+Pj4gKiBXZSBhbHNvIGdldCBhd2F5IGZyb20gdGhlIHByb2JsZW0g dGhhdCB0aGUgQlRGIGlkIGNhbiBjaGFuZ2UgZnJvbQ0KPj4+IHVuZGVybmVhdGggdGhlIEFGX1hE UCBhcHBsaWNhdGlvbi4gVGhpcyBiZWNvbWVzIGVzcGVjaWFsbHkgcHJvYmxlbWF0aWMNCj4+PiB3 aGVuIHdlIHdvdWxkIGxpa2UgdG8gYXBwbHkgdGhpcyB0byB0aGUgVHggcGF0aCBhbmQgZG8gb2Zm bG9hZHMuDQo+Pg0KPj4gRm9yIHRoaXMgcG9pbnQsIEkgdGhpbmsgbWF5YmUgdGhlIGV4aXN0ZW5j ZSBvZiB0aGUgYnRmX2lkIGZpZWxkIGluIHRoZSBtZXRhZGF0YQ0KPj4gc3RydWN0IGhhcyBnaXZl biB5b3UgdGhlIGltcHJlc3Npb24gdGhhdCB0aGUgZm9ybWF0IGNhbiBnbyBhbmQgY2hhbmdlIGF0 IGFueQ0KPj4gdGltZT8gSSBkb24ndCB0aGluayB0aGF0IGhhcyB0byBiZSB0aGUgY2FzZTogaWYg YSB1c2VyIGtub3dzIHRoYXQgdGhleSB3aWxsDQo+PiBhbHdheXMgdXNlIHRoZSBzYW1lIG1ldGFk YXRhIGZvcm1hdCwgYW5kIHRoZXkga25vdyB3aGF0IHRoYXQgZm9ybWF0IGlzLA0KPj4gaXQncyBw ZXJmZWN0bHkgdmFsaWQgdG8ganVzdCBpZ25vcmUgdGhlIGJ0Zl9pZCBmaWVsZCBhbmQganVzdCBj YXN0IHRoZSBtZXRhZGF0YQ0KPj4gZmllbGQgdG8gYSBzdHJ1Y3QuIEhvd2V2ZXIsIHRoZSBmaWVs ZCBoYXMgdG8gYmUgdGhlcmUgc28gdGhhdCBpdCBpcyBwb3NzaWJsZSBmb3INCj4+IHRoZSBjb25z dW1lciB0byBkZXRlY3Qgd2hlbiBpdCBjaGFuZ2VzLCBpbiBvcmRlciB0byBzdXBwb3J0IHBvcnRh YmxlDQo+PiBhcHBsaWNhdGlvbnMuIFRoZXJlIGFyZSB0d28gdXNlIGNhc2VzIGZvciB0aGlzOg0K PiANCj4gSXQgd291bGQgYmUgZ3JlYXQgaWYgd2UgY291bGQga25vdyBpdCBpcyBmaXhlZCwgYnV0 IEkgZG8gbm90IHVuZGVyc3RhbmQgaG93IHRoZSB1c2VyIGNhbiBrbm93IHRoaXMsIGVzcGVjaWFs bHkgc2luY2UgdGhlIGNvbnRyb2wgb2YgdGhpcyBpcyBvdXQtb2YtYmFuZC4gSG93IHdvdWxkIHdl IGRlYWwgd2l0aCB0aGUgZm9sbG93aW5nIHNjZW5hcmlvPw0KPiANCj4gQXBwIDEgY29tZXMgdXAs IG9wZW5zIHVwIGFuIEFGX1hEUCBzb2NrZXQgYW5kIHJlcXVlc3RzIG1ldGFkYXRhXzENCj4gQXBw IDIgY29tZXMgdXAsIG9wZW5zIHVwIGFub3RoZXIgQUZfWERQIHNvY2tldCBvbiB0aGUgc2FtZSBu ZXRkZXYgYW5kIHJlcXVlc3RzIG1ldGFkYXRhXzINCj4gDQo+IFdlIGNhbiBwcm92aWRlIHRoZSBh cHBzIHdpdGggdHdvIGRpZmZlcmVudCBidGZfaWRzLCBidXQgaXMgdGhpcyBzb21ldGhpbmcgdGhh dCBhbiBleGlzdGluZyBkcml2ZXIgY2FuIHN1cHBvcnQgYW5kIGhvdyBkb2VzIHRoaXMgc2NhbGUg YXMgd2UgYWRkIHNvY2tldHMgYW5kIGRpZmZlcmVudCB1c2FnZXMgb2YgbWV0YWRhdGE/IE5vdGUg dGhhdCB3ZSBoYXZlIG5vIGlkZWEgd2hhdCB0aGUgZGVzdGluYXRpb24gaXMgdW50aWwgYWZ0ZXIg d2UgaGF2ZSBleGVjdXRlZCBvdXIgWERQIHByb2dyYW0gYW5kIHBvdGVudGlhbGx5IHVzZWQgdGhl IG1ldGFkYXRhIGFyZWEgdGhlcmUuIEJ1dCBvdXIgcG9wdWxhdGlvbiBvZiB0aGUgbWV0YWRhdGEg ZmllbGQgaXMgYmVmb3JlIHRoZSBYRFAgcHJvZ3JhbS4gS2luZCBvZiBjaGlja2VuIGFuZCBlZ2cu DQo+IA0KPiBUaGUgaWRlYSBvZiBhIHNlcGFyYXRlIG1ldGFkYXRhIHBvcHVsYXRpb24gaG9vayBw b2ludCBvbiB0aGUgbmV0ZGV2L3F1ZXVlX2lkIGxldmVsIGNvdWxkIHBvdGVudGlhbGx5IHNvbHZl IHRoaXMuIFdlbGwsIGFzIGxvbmcgYXMgeW91IGFyZSBub3QgYXR0YWNoaW5nIHNldmVyYWwgc29j a2V0cyB0byB0aGUgc2FtZSBuZXRkZXYgYW5kIHF1ZXVlX2lkLCBidXQgdGhhdCBpcyByYXJlLg0K PiANCj4+IC0gV3JpdGluZyBhbiBhcHBsaWNhdGlvbiB0aGF0IGNhbiBzdXBwb3J0IGRpZmZlcmVu dCBtZXRhZGF0YSBmb3JtYXRzIHNvDQo+PiAgICBpdCBjYW4gcnVuIHdpdGhvdXQgcmUtY29tcGls YXRpb24gb24gZGlmZmVyZW50IGhhcmR3YXJlLiBGb3IgdGhpcywgaXQNCj4+ICAgIGlzIHBvc3Np YmxlIHRvIGxvYWQgdGhlIHByb2dyYW0gd2l0aCBhIHRhcmdldCBkZXZpY2UsIHNvIHRoYXQgdGhl IGxvbmcNCj4+ICAgIHNlcXVlbmNlIG9mIGNoZWNrcyBvZiB0aGUgYnRmX2lkIGNhbiBiZSBlbGlt aW5hdGVkIGJ5IENPLVJFIGF0IGxvYWQNCj4+ICAgIHRpbWUsIGFuZCB0dXJuZWQgaW50byBqdXN0 IGEgc2luZ2xlIHNhbml0eSBjaGVjayBzbyB0aGF0IHRoZSBtZXRhZGF0YQ0KPj4gICAgaXMgbm90 IGxvYWRlZCBpZiB0aGUgY29uZmlndXJhdGlvbiBjaGFuZ2VzLg0KPiANCj4gV291bGQgYmUgZ3Jl YXQgaWYgd2UgaGFkIENPLVJFIGZvciB1c2VyLXNwYWNlLCBidXQgYXMgaXQgaXMgbm90IHRoZXJl IGluIGxsdm0gb3IgZ2NjIGZvciB4ODYsIHdlIHByb2JhYmx5IGhhdmUgdG8gZ28gdGhyb3VnaCBh bGwgdGhlIHRlc3RzIGluIEFGX1hEUC4NCj4gDQo+PiAtIFdyaXRpbmcgYW4gYXBwbGljYXRpb24g dGhhdCBkZWFscyB3aXRoIHBhY2tldHMgZnJvbSBtdWx0aXBsZSBkZXZpY2VzDQo+PiAgICBpbiB0 aGUgc2FtZSBwcm9ncmFtIChzYXksIGEgZGV2bWFwIHByb2dyYW0gdGhhdCBnZXRzIHJlZGlyZWN0 cyBmcm9tDQo+PiAgICBkaWZmZXJlbnQgaGFyZHdhcmUgaW50byB0aGUgc2FtZSBlZ3Jlc3MgZGV2 aWNlKS4NCj4gDQo+IFllcy4gVGhlIHNhbWUgZ29lcyBmb3IgQUZfWERQIGFuZCBhIHNoYXJlZCB1 bWVtIGJldHdlZW4gZGlmZmVyZW50IE5JQ3MuDQo+IA0KPj4gLSBEZWFsaW5nIHdpdGggbWV0YWRh dGEgY29uZmlndXJhdGlvbiB3aGVyZSBhIHN1YnNldCBvZiB0aGUgdHJhZmZpYyBoYXMNCj4+ICAg IGRpZmZlcmVudCBtZXRhZGF0YSAoZS5nLiwgdGltZXN0YW1wcyBtYXkgb25seSBhcHBlYXIgb24g UFRQIHBhY2tldHMsDQo+PiAgICBzYXkpLiBIZXJlIHRoZSBjaGVjayBvZiB0aGUgQlRGIElEIGNh biBiZSB1c2VkIHRvIGRlbXV4IHRoZSBwYWNrZXQNCj4+ICAgIHR5cGUuDQo+IA0KPiBXb3VsZCB0 aGlzIG5vdCBsZWFkIHRvIGEgY29tYmluYXRvcmlhbCBleHBsb3Npb24gb2YgQlRGIElEcyBhcyB3 ZSBhZGQgZmllbGRzIHRoYXQgbWlnaHQgb3IgbWlnaHQgbm90IGhhdmUgYSB2YWxpZCBlbnRyeT8g V291bGQgaXQgbm90IGJlIGJldHRlciB3aXRoIGEgZmxhZ3MgZmllbGQgaW4gdGhlIE1EIHNlY3Rp b24/DQo+IA0KDQpJJ3ZlIGRlYmF0ZWQgdGhpcyB3aXRoIEpvaG4gYmVmb3JlLCBhbmQgSSB0aG91 Z2ggd2UgcmVzb2x2ZWQgdGhlIA0KY29uY2VybnMgaW4gdGhhdCBkaXNjdXNzaW9uLg0KSW4gc3Vt bWFyeToNCg0KMS4gVGhlIGRyaXZlciBpcyAxMDAlIGZyZWUgdG8gY3JlYXRlIGEgZmxhZ3MgZmll bGQgaW4gdGhlIFhEUC1oaW50cyANCnN0cnVjdCwgdGhhdCBkZWZpbmUgd2hhdCBmaWVsZHMgYXJl IHZhbGlkLiAgSWYgeW91IGxpa2UgdG8gYmUgb2xkIA0KZmFzaGlvbiwgYW5kIHdlIGNhbiBldmVu IGRlZmluZSB0aGUgYml0cyBhcyBVQVBJIGZvciBjb21tb24gZmllbGRzIHRoYXQgDQptb3JlIGRy aXZlcnMgcHJvdmlkZS4gVGhpcyBqdXN0IHJlcXVpcmVzIG1vcmUgd29yayBpbiB1c2Vyc3BhY2Uv QlBGLXByb2cgDQp0byBjaGVjayBmbGFncy12YWxpZCBiZWZvcmUgYWNjZXNzaW5nIGEgbWVtYmVy Lg0KDQoyLiBVbnRpbCB3ZSBnZXQgdGhlIFhEUC1oaW50cy1ob29rLCBkcml2ZXJzIHdpbGwgYmUg b2xkIGZhc2hpb24gYW5kIA0KZGVmaW5lIGEgcmF0aGVyIGxpbWl0ZWQgbnVtYmVyIG9mIFhEUC1o aW50cyBzdHJ1Y3RzLiAgVGh1cywgSSB3b3VsZCBub3QgDQp3b3JyeSBhYm91dCBkcml2ZXJzIGNy ZWF0aW5nIHRvbyBtYW55IHN0cnVjdHMgYW5kIEJURi1JRHMuDQoNClRvZGF5IGRyaXZlcnMgYXJl IG5vdCB2ZXJ5IGZsZXhpYmxlLCBhbmQgdGhpcyB3b3JrIGlzIGFib3V0IGNyZWF0aW5nIGEgDQpz dXBlciBmbGV4aWJsZSBpbnRlcmZhY2UuICBJdCBkb2Vzbid0IG1lYW4gdGhhdCBkcml2ZXJzIGFu ZCBoYXJkd2FyZSANCndpbGwgYWxsIG9mIGEgc3VkZGVuIGdldCBzdXBlciBmbGV4aWJsZS4gIERy aXZlciBhbmQgaGFyZHdhcmUgc3RhcnQgDQp1c2luZyB0aGlzIG5ldyBmbGV4aWJsZSBCVEYgaW4g dmVyeSBzaW1wbGUgd2F5cy4NCg0KDQo+IFRoYW5rIHlvdSBzbyBtdWNoIGZvciB5b3VyIGZlZWRi YWNrLiBJdCByZWFsbHkgaGVscGVkISBJbiBzdW1tYXJ5LCBCVEYgaXQgaXMgYXMgYW4gaW50ZXJm YWNlIGFuZCBJIGFncmVlIHRoYXQgd2Ugc2hvdWxkIHN0YXJ0IHNpbXBsZSBhbmQganVzdCBnZXQg dGhpcyB0byB3b3JrIHdpdGggdGhlIGlmLXN0YXRlbWVudCBtZXRob2QuIEJ1dCBpdCBzZWVtcyB0 aGF0IEkgY2FuIGFsc28gY29udGludWUgdG8gcHJvdG90eXBlIHRoZSBtYWluIGlkZWEgb2YgcmVh ZGluZyBtZXRhZGF0YSBmcm9tIFhEUC4gRG8geW91IHRoaW5rIGl0IHdvdWxkIGJlIHBvc3NpYmxl IHRvIGdldCBhIG5ldyBob29rIHBvaW50IGZvciBYRFAgbWV0YWRhdGEgcG9wdWxhdGlvbj8gSWYg c28sIEkgdGhpbmsgd2Ugc2hvdWxkIHB1cnN1ZSB0aGF0LCBlc3BlY2lhbGx5IGlmIHdlIGNvdWxk IHRpZSBpdCB0byBhIG5ldGRldi9xdWV1ZV9pZCBwYWlyLiBUaGF0IHdvdWxkIHNpbXBsaWZ5IGEg bG90IGZvciBBRl9YRFAuDQo+IA0KDQpJJ3ZlIGFsbCBmb3IgcHJvdG90eXBlaW5nIHNvbWV0aGlu ZyBzbyB3ZSBjYW4gbWFrZSBwcm9ncmVzcy4NCg0KLS1KZXNwZXINCg0K