Re: XDP CPU maps & shared umem

Yuval El-Hanany <[email protected]> Tue, 28 May 2024 12:38:44 +0000
Newsgroups org.kernel.vger.xdp-newbies
Message-ID <[email protected]>
U3VyZS4gVGhlIHR3byBwYXRjaGVzICh0aGUgc2Vjb25kIGlzIGp1c3QgZG9jdW1lbnRhdGlvbikg
YXJlIGJlbG93Lg0KDQogICAgICAgIEnigJltIHRyeWluZyB0byBhZGQgdGhlIHJ4IHF1ZXVlIGZy
b20geGRwX2J1ZmYgdG8gdGhlIHhkcF9mcmFtZSBhbmQgZXh0cmFjdCBpdCBiYWNrLiBJcyB0aGUg
c2l6ZSBvciBhbGlnbm1lbnQgb2YgeGRwX2ZyYW1lIGNyaXRpY2FsPyBJcyBpdCBva2F5IHRvIGFk
ZCB0aGUgcnggcXVldWUgYXMgYW4gZXh0cmEgZmllbGQsIG9yIHNob3VsZCBJIHRyeSB0byBhZGQg
aXQgYXMgYSBiaXQgZmllbGQgb24gYW4gZXhpc3RpbmcgZmllbGQgbGlrZSB0aGUgbWVtb3J5IHR5
cGUgdGhhdCB0YWtlcyAzMiBiaXRzIGJ1dCBoYXMgb25seSA0IHZhbHVlcz8NCg0KICAgICAgICBD
aGVlcnMsDQogICAgICAgICAgICAgICAgWXV2YWwuDQoNCkZyb206IE1hZ251cyBLYXJsc3NvbiA8
bWFnbnVzLmthcmxzc29uQGdtYWlsLmNvbT4NClN1YmplY3Q6IFtQQVRDSCBicGYtbmV4dCAxLzJd
IHhzazogc3VwcG9ydCByZWRpcmVjdCB0byBhbnkgc29ja2V0IGJvdW5kIHRvIHRoZSBzYW1lIHVt
ZW0NCkRhdGU6IDUgRmVicnVhcnkgMjAyNCBhdCAxNDozNTo1MCBHTVQrMg0KVG86IG1hZ251cy5r
YXJsc3NvbkBpbnRlbC5jb20sIGJqb3JuQGtlcm5lbC5vcmcsIGFzdEBrZXJuZWwub3JnLCBkYW5p
ZWxAaW9nZWFyYm94Lm5ldCwgbmV0ZGV2QHZnZXIua2VybmVsLm9yZywgbWFjaWVqLmZpamFsa293
c2tpQGludGVsLmNvbSwgeXV2YWxlQHJhZHdhcmUuY29tDQpDYzogYnBmQHZnZXIua2VybmVsLm9y
Zw0KDQpDQVVUSU9OOkV4dGVybmFsIEVtYWlsLCBEbyBub3QgY2xpY2sgb24gbGlua3Mgb3Igb3Bl
biBhdHRhY2htZW50cyB1bmxlc3MgeW91IHJlY29nbml6ZSB0aGUgc2VuZGVyIGFuZCBrbm93IHRo
ZSBjb250ZW50IGlzIHNhZmUuDQoNCkZyb206IE1hZ251cyBLYXJsc3NvbiA8bWFnbnVzLmthcmxz
c29uQGludGVsLmNvbT4NCg0KQWRkIHN1cHBvcnQgZm9yIGRpcmVjdGluZyBhIHBhY2tldCB0byBh
bnkgc29ja2V0IGJvdW5kIHRvIHRoZSBzYW1lDQp1bWVtLiBUaGlzIG1ha2VzIGl0IHBvc3NpYmxl
IHRvIHVzZSB0aGUgWERQIHByb2dyYW0gdG8gc2VsZWN0IHdoYXQNCnNvY2tldCB0aGUgcGFja2V0
IHNob3VsZCBiZSByZWNlaXZlZCBvbi4gVGhlIHVzZXIgY2FuIHBvcHVsYXRlIHRoZQ0KWFNLTUFQ
IHdpdGggdmFyaW91cyBzb2NrZXRzIGFuZCBhcyBsb25nIGFzIHRoZXkgc2hhcmUgdGhlIHNhbWUg
dW1lbSwNCnRoZSBYRFAgcHJvZ3JhbSBjYW4gcGljayBhbnkgb25lIG9mIHRoZW0uDQoNClN1Z2dl
c3RlZC1ieTogWXV2YWwgRWwtSGFuYW55IDx5dXZhbGVAcmFkd2FyZS5jb20+DQpTaWduZWQtb2Zm
LWJ5OiBNYWdudXMgS2FybHNzb24gPG1hZ251cy5rYXJsc3NvbkBpbnRlbC5jb20+DQotLS0NCm5l
dC94ZHAveHNrLmMgfCA1ICsrKystDQoxIGZpbGUgY2hhbmdlZCwgNCBpbnNlcnRpb25zKCspLCAx
IGRlbGV0aW9uKC0pDQoNCmRpZmYgLS1naXQgYS9uZXQveGRwL3hzay5jIGIvbmV0L3hkcC94c2su
Yw0KaW5kZXggMWVhZGZhYzAzY2M0Li5hMzM5ZTlhMWI1NTcgMTAwNjQ0DQotLS0gYS9uZXQveGRw
L3hzay5jDQorKysgYi9uZXQveGRwL3hzay5jDQpAQCAtMzEzLDEwICszMTMsMTMgQEAgc3RhdGlj
IGJvb2wgeHNrX2lzX2JvdW5kKHN0cnVjdCB4ZHBfc29jayAqeHMpDQoNCnN0YXRpYyBpbnQgeHNr
X3Jjdl9jaGVjayhzdHJ1Y3QgeGRwX3NvY2sgKnhzLCBzdHJ1Y3QgeGRwX2J1ZmYgKnhkcCwgdTMy
IGxlbikNCnsNCisgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHhkcC0+cnhxLT5kZXY7
DQorICAgICAgIHUzMiBxaWQgPSB4ZHAtPnJ4cS0+cXVldWVfaW5kZXg7DQorDQogICAgICAgaWYg
KCF4c2tfaXNfYm91bmQoeHMpKQ0KICAgICAgICAgICAgICAgcmV0dXJuIC1FTlhJTzsNCg0KLSAg
ICAgICBpZiAoeHMtPmRldiAhPSB4ZHAtPnJ4cS0+ZGV2IHx8IHhzLT5xdWV1ZV9pZCAhPSB4ZHAt
PnJ4cS0+cXVldWVfaW5kZXgpDQorICAgICAgIGlmICghZGV2LT5fcnhbcWlkXS5wb29sIHx8IHhz
LT51bWVtICE9IGRldi0+X3J4W3FpZF0ucG9vbC0+dW1lbSkNCiAgICAgICAgICAgICAgIHJldHVy
biAtRUlOVkFMOw0KDQogICAgICAgaWYgKGxlbiA+IHhza19wb29sX2dldF9yeF9mcmFtZV9zaXpl
KHhzLT5wb29sKSAmJiAheHMtPnNnKSB7DQotLQ0KMi40Mi4wDQoNCkZyb206IE1hZ251cyBLYXJs
c3NvbiA8bWFnbnVzLmthcmxzc29uQGludGVsLmNvbT4NCg0KRG9jdW1lbnQgdGhlIGFiaWxpdHkg
dG8gcmVkaXJlY3QgdG8gYW55IHNvY2tldCBib3VuZCB0byB0aGUgc2FtZSB1bWVtLg0KDQpTaWdu
ZWQtb2ZmLWJ5OiBNYWdudXMgS2FybHNzb24gPG1hZ251cy5rYXJsc3NvbkBpbnRlbC5jb20+DQot
LS0NCkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9hZl94ZHAucnN0IHwgMzMgKysrKysrKysrKysr
KysrKystLS0tLS0tLS0tLS0NCjEgZmlsZSBjaGFuZ2VkLCAxOSBpbnNlcnRpb25zKCspLCAxNCBk
ZWxldGlvbnMoLSkNCg0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9hZl94
ZHAucnN0IGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2FmX3hkcC5yc3QNCmluZGV4IGRjZWVi
MGQ3NjNhYS4uNzJkYTcwNTdlNGNmIDEwMDY0NA0KLS0tIGEvRG9jdW1lbnRhdGlvbi9uZXR3b3Jr
aW5nL2FmX3hkcC5yc3QNCisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9hZl94ZHAucnN0
DQpAQCAtMzI5LDIzICszMjksMjQgQEAgWERQX1NIQVJFRF9VTUVNIG9wdGlvbiBhbmQgcHJvdmlk
ZSB0aGUgaW5pdGlhbCBzb2NrZXQncyBmZCBpbiB0aGUNCnN4ZHBfc2hhcmVkX3VtZW1fZmQgZmll
bGQgYXMgeW91IHJlZ2lzdGVyZWQgdGhlIFVNRU0gb24gdGhhdA0Kc29ja2V0LiBUaGVzZSB0d28g
c29ja2V0cyB3aWxsIG5vdyBzaGFyZSBvbmUgYW5kIHRoZSBzYW1lIFVNRU0uDQoNCi1UaGVyZSBp
cyBubyBuZWVkIHRvIHN1cHBseSBhbiBYRFAgcHJvZ3JhbSBsaWtlIHRoZSBvbmUgaW4gdGhlIHBy
ZXZpb3VzDQotY2FzZSB3aGVyZSBzb2NrZXRzIHdlcmUgYm91bmQgdG8gdGhlIHNhbWUgcXVldWUg
aWQgYW5kDQotZGV2aWNlLiBJbnN0ZWFkLCB1c2UgdGhlIE5JQydzIHBhY2tldCBzdGVlcmluZyBj
YXBhYmlsaXRpZXMgdG8gc3RlZXINCi10aGUgcGFja2V0cyB0byB0aGUgcmlnaHQgcXVldWUuIElu
IHRoZSBwcmV2aW91cyBleGFtcGxlLCB0aGVyZSBpcyBvbmx5DQotb25lIHF1ZXVlIHNoYXJlZCBh
bW9uZyBzb2NrZXRzLCBzbyB0aGUgTklDIGNhbm5vdCBkbyB0aGlzIHN0ZWVyaW5nLiBJdA0KLWNh
biBvbmx5IHN0ZWVyIGJldHdlZW4gcXVldWVzLg0KLQ0KLUluIGxpYmJwZiwgeW91IG5lZWQgdG8g
dXNlIHRoZSB4c2tfc29ja2V0X19jcmVhdGVfc2hhcmVkKCkgQVBJIGFzIGl0DQotdGFrZXMgYSBy
ZWZlcmVuY2UgdG8gYSBGSUxMIHJpbmcgYW5kIGEgQ09NUExFVElPTiByaW5nIHRoYXQgd2lsbCBi
ZQ0KLWNyZWF0ZWQgZm9yIHlvdSBhbmQgYm91bmQgdG8gdGhlIHNoYXJlZCBVTUVNLiBZb3UgY2Fu
IHVzZSB0aGlzDQotZnVuY3Rpb24gZm9yIGFsbCB0aGUgc29ja2V0cyB5b3UgY3JlYXRlLCBvciB5
b3UgY2FuIHVzZSBpdCBmb3IgdGhlDQotc2Vjb25kIGFuZCBmb2xsb3dpbmcgb25lcyBhbmQgdXNl
IHhza19zb2NrZXRfX2NyZWF0ZSgpIGZvciB0aGUgZmlyc3QNCi1vbmUuIEJvdGggbWV0aG9kcyB5
aWVsZCB0aGUgc2FtZSByZXN1bHQuDQorSW4gdGhpcyBjYXNlLCBpdCBpcyBwb3NzaWJsZSB0byB1
c2UgdGhlIE5JQydzIHBhY2tldCBzdGVlcmluZw0KK2NhcGFiaWxpdGllcyB0byBzdGVlciB0aGUg
cGFja2V0cyB0byB0aGUgcmlnaHQgcXVldWUuIFRoaXMgaXMgbm90DQorcG9zc2libGUgaW4gdGhl
IHByZXZpb3VzIGV4YW1wbGUgYXMgdGhlcmUgaXMgb25seSBvbmUgcXVldWUgc2hhcmVkDQorYW1v
bmcgc29ja2V0cywgc28gdGhlIE5JQyBjYW5ub3QgZG8gdGhpcyBzdGVlcmluZyBhcyBpdCBjYW4g
b25seSBzdGVlcg0KK2JldHdlZW4gcXVldWVzLg0KKw0KK0luIGxpYnhkcCAob3IgbGliYnBmIHBy
aW9yIHRvIHZlcnNpb24gMS4wKSwgeW91IG5lZWQgdG8gdXNlIHRoZQ0KK3hza19zb2NrZXRfX2Ny
ZWF0ZV9zaGFyZWQoKSBBUEkgYXMgaXQgdGFrZXMgYSByZWZlcmVuY2UgdG8gYSBGSUxMIHJpbmcN
CithbmQgYSBDT01QTEVUSU9OIHJpbmcgdGhhdCB3aWxsIGJlIGNyZWF0ZWQgZm9yIHlvdSBhbmQg
Ym91bmQgdG8gdGhlDQorc2hhcmVkIFVNRU0uIFlvdSBjYW4gdXNlIHRoaXMgZnVuY3Rpb24gZm9y
IGFsbCB0aGUgc29ja2V0cyB5b3UgY3JlYXRlLA0KK29yIHlvdSBjYW4gdXNlIGl0IGZvciB0aGUg
c2Vjb25kIGFuZCBmb2xsb3dpbmcgb25lcyBhbmQgdXNlDQoreHNrX3NvY2tldF9fY3JlYXRlKCkg
Zm9yIHRoZSBmaXJzdCBvbmUuIEJvdGggbWV0aG9kcyB5aWVsZCB0aGUgc2FtZQ0KK3Jlc3VsdC4N
Cg0KTm90ZSB0aGF0IGEgVU1FTSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gc29ja2V0cyBvbiB0aGUg
c2FtZSBxdWV1ZSBpZA0KYW5kIGRldmljZSwgYXMgd2VsbCBhcyBiZXR3ZWVuIHF1ZXVlcyBvbiB0
aGUgc2FtZSBkZXZpY2UgYW5kIGJldHdlZW4NCi1kZXZpY2VzIGF0IHRoZSBzYW1lIHRpbWUuDQor
ZGV2aWNlcyBhdCB0aGUgc2FtZSB0aW1lLiBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHJlZGlyZWN0
IHRvIGFueQ0KK3NvY2tldCBhcyBsb25nIGFzIGl0IGlzIGJvdW5kIHRvIHRoZSBzYW1lIHVtZW0g
d2l0aCBYRFBfU0hBUkVEX1VNRU0uDQoNClhEUF9VU0VfTkVFRF9XQUtFVVAgYmluZCBmbGFnDQot
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KQEAgLTgyMiw2ICs4MjMsMTAgQEAgQTogVGhl
IHNob3J0IGFuc3dlciBpcyBubywgdGhhdCBpcyBub3Qgc3VwcG9ydGVkIGF0IHRoZSBtb21lbnQu
IFRoZQ0KICAgc3dpdGNoLCBvciBvdGhlciBkaXN0cmlidXRpb24gbWVjaGFuaXNtLCBpbiB5b3Vy
IE5JQyB0byBkaXJlY3QNCiAgIHRyYWZmaWMgdG8gdGhlIGNvcnJlY3QgcXVldWUgaWQgYW5kIHNv
Y2tldC4NCg0KKyAgIE5vdGUgdGhhdCBpZiB5b3UgYXJlIHVzaW5nIHRoZSBYRFBfU0hBUkVEX1VN
RU0gb3B0aW9uLCBpdCBpcw0KKyAgIHBvc3NpYmxlIHRvIHN3aXRjaCB0cmFmZmljIGJldHdlZW4g
YW55IHNvY2tldCBib3VuZCB0byB0aGUgc2FtZQ0KKyAgIHVtZW0uDQorDQpROiBNeSBwYWNrZXRz
IGFyZSBzb21ldGltZXMgY29ycnVwdGVkLiBXaGF0IGlzIHdyb25nPw0KDQpBOiBDYXJlIGhhcyB0
byBiZSB0YWtlbiBub3QgdG8gZmVlZCB0aGUgc2FtZSBidWZmZXIgaW4gdGhlIFVNRU0gaW50bw0K
LS0NCjIuNDIuMA0KDQo+IE9uIDI4IE1heSAyMDI0LCBhdCAxNToyMSwgTWFnbnVzIEthcmxzc29u
IDxtYWdudXMua2FybHNzb25AZ21haWwuY29tPiB3cm90ZToNCj4NCj4gQ0FVVElPTjpFeHRlcm5h
bCBFbWFpbCwgRG8gbm90IGNsaWNrIG9uIGxpbmtzIG9yIG9wZW4gYXR0YWNobWVudHMgdW5sZXNz
IHlvdSByZWNvZ25pemUgdGhlIHNlbmRlciBhbmQga25vdyB0aGUgY29udGVudCBpcyBzYWZlLg0K
Pg0KPiBPbiBNb24sIDI3IE1heSAyMDI0IGF0IDEwOjExLCBNYWdudXMgS2FybHNzb24gPG1hZ251
cy5rYXJsc3NvbkBnbWFpbC5jb20+IHdyb3RlOg0KPj4NCj4+IE9uIE1vbiwgMjcgTWF5IDIwMjQg
YXQgMDk6MzQsIFl1dmFsIEVsLUhhbmFueSA8eXV2YWxlQHJhZHdhcmUuY29tPiB3cm90ZToNCj4+
Pg0KPj4+IFllYWgsDQo+Pj4gICAgICAgIGFzIGZhciBkb3duIGFzIEkgZHVnIGluIHRoZSBjb2Rl
LCBpdCBzZWVtcyBpdOKAmXMgdGhlIG9ubHkgb25lIHRoYXTigJlzIHVzZWQuIFRoZSBvdGhlciBt
ZW1iZXJzIGFyZSByZWdfc3RhdGUgJiBuYXBpX2lkLiBJ4oCZbSB1bmZhbWlsaWFyIHdpdGggdGhl
aXIgZXhhY3QgcHVycG9zZXMsIGJ1dCBkb2VzbuKAmXQgc291bmQgbGlrZSB0aGV54oCZcmUgbmVj
ZXNzYXJ5IGRvd24gdGhlIGxpbmUuIE9uZSBvdGhlciBjb25jZXJuIGlzIHR4cSBJTU8uIEl0IGlz
IG5vdCBpbml0aWFsaXNlZCB0byBhbnkgdmFsdWUgaW4geGRwX2J1ZmYuIFdoaWxlIGl0IG1heSBu
b3QgYmUgcmVsZXZhbnQgY29uc2lkZXJpbmcgaXTigJlzIGEgcmVjZWl2ZWQgcGFja2V0LCBpdCBz
ZWVtcyB3cm9uZyB0byBrZWVwIGEgZGFuZ2xpbmcgcG9pbnRlciBib3RoIGluIHRlcm1zIG9mIHNl
Y3VyaXR5IChsZWFraW5nIHByZXZpb3VzIHZhbHVlcykgYW5kIHJvYnVzdG5lc3MuIE1heWJlIGp1
c3Qgc2V0IGl0IHRvIE5VTEw/DQo+Pj4NCj4+PiAgICAgICAgSeKAmXZlIGJlZW4gcmFja2luZyBt
eSBicmFpbiBhcyB0byB3aGF0IGlzIHRoZSBhY2NlcHRlZCBtZXRob2QgdG8gcGFzcyB0aGUgcmVj
ZWl2ZSBxdWV1ZS4gUGFzc2luZyBpdCBvbiB0aGUgcGFja2V0IGhlYWRyb29tIHNlZW1lZCBsaWtl
IGEgcmVhc29uYWJsZSBzb2x1dGlvbiwgYnV0IGl0IHdvdWxkIG1lYW4gbWVtb3J5IGFjY2VzcyB0
byB0aGUgcGFja2V0IG1lbW9yeSBvbiBwYWNrZXQgYXJyaXZhbCBvbiB0aGUgc2Vjb25kIENQVSB3
aGljaCBtYXkgYmUgaGFybWZ1bCB0byBwZXJmb3JtYW5jZS4gVGhlIHF1ZXVlIGl0c2VsZiBpcyBq
dXN0IGEgcG9pbnRlciBxdWV1ZSBzbyBjYW7igJl0IHBpZ2d5YmFjayBvbiBpdCB1bmxlc3MgdXNp
bmcgYSBkaWZmZXJlbnQga2luZCBvZiBxdWV1ZS4gV291bGQgYmUgZ3JlYXQgdG8gaGVhciBob3cg
aXQgc2hvdWxkIGJlIGRvbmUuDQo+Pg0KPj4gTGV0IG1lIGdldCBpbnRvIHRoaXMgcGllY2Ugb2Yg
Y29kZSBhbmQgc2NyYXRjaCBteSBoZWFkIGZvciBhIHdoaWxlIGFuZA0KPj4gSSB3aWxsIGdldCBi
YWNrIHRvIHlvdS4gRG8gbm90IGhhdmUgYSBzb2x1dGlvbiBvbiB0b3Agb2YgbXkgaGVhZC4gV2ls
bA0KPj4gbG9vcCBpbiBNYWNpZWogdG9vLg0KPg0KPiBZdXZhbCwNCj4NCj4gQ291bGQgeW91IHBs
ZWFzZSBzZW5kIG1lIHRoZSBwYXRjaCB0aGF0IHlvdSBhcmUgdXNpbmc/IEkgY2Fubm90DQo+IHJl
bWVtYmVyIHdoYXQgSSBzZW50IHlvdSA6LSkuDQo+DQo+PiAvTWFnbnVzDQo+Pg0KPj4+ICAgICAg
ICBUaGFua3MsDQo+Pj4gICAgICAgICAgICAgICAgWXV2YWwuDQo+Pj4NCj4+Pj4gT24gMjcgTWF5
IDIwMjQsIGF0IDg6NDgsIE1hZ251cyBLYXJsc3NvbiA8bWFnbnVzLmthcmxzc29uQGdtYWlsLmNv
bT4gd3JvdGU6DQo+Pj4+DQo+Pj4+IENBVVRJT046RXh0ZXJuYWwgRW1haWwsIERvIG5vdCBjbGlj
ayBvbiBsaW5rcyBvciBvcGVuIGF0dGFjaG1lbnRzIHVubGVzcyB5b3UgcmVjb2duaXplIHRoZSBz
ZW5kZXIgYW5kIGtub3cgdGhlIGNvbnRlbnQgaXMgc2FmZS4NCj4+Pj4NCj4+Pj4gT24gU3VuLCAy
NiBNYXkgMjAyNCBhdCAxNDo0OCwgWXV2YWwgRWwtSGFuYW55IDx5dXZhbGVAcmFkd2FyZS5jb20+
IHdyb3RlOg0KPj4+Pj4NCj4+Pj4+IENvcnJlY3Rpb24sDQo+Pj4+PiAgICAgICB0aGUgcnhxIHBv
aW50ZXIgaXMgaW5pdOKAmWQgZ2xvYmFsbHkgZm9yIGFsbCBmcmFtZXMgYmVmb3JlIHRoZSBmcmFt
ZSBsb29wcywgYnV0IG9ubHkgdGhlIGRldmljZSBhbmQgdGhlIG1lbW9yeSBpbmZvcm1hdGlvbiBh
cmUgc2V0IGZyb20gdGhlIFhEUCBmcmFtZS4gU28gc3RpbGwgYW4gaXNzdWUgd2l0aCB0aGUgcXVl
dWVfaW5kZXgsIGJ1dCB0aGUgdGVzdHMgb24gdGhlIGRldmljZSBhbmQgbWVtb3J5IGluZm8gaW4g
eHNrX3JjdiBzaG91bGQgYmUgZmluZS4NCj4+Pj4+DQo+Pj4+PiAgICAgICBDaGVlcnMsDQo+Pj4+
PiAgICAgICAgICAgICAgIFl1dmFsLg0KPj4+Pg0KPj4+PiBIaSBZdXZhbCwNCj4+Pj4NCj4+Pj4g
Tm93IEkgYW0gYmFjay4gWWVzLCB0aGlzIHNlZW1zIHRvIGJlIGEgYnVnIHNvIHRoYW5rIHlvdSBm
b3Igc3BvdHRpbmcNCj4+Pj4gaXQuIFRoaXMgaXMgbm90aGluZyBJIGhhdmUgZXZlciB0ZXN0ZWQg
c2luY2UgSSB0aG91Z2h0IHlvdSB3b3VsZCBkbyBhbg0KPj4+PiBYU0tNQVAgcmVkaXJlY3QgdG8g
dGhlICJyaWdodCIgY29yZSBmaXJzdC4gQnV0IHRoZXJlIGlzIG5vdGhpbmcNCj4+Pj4gaGluZGVy
aW5nIHRoYXQgc29tZW9uZSB3b3VsZCBkbyBhIENQVU1BUCByZWRpcmVjdCBmaXJzdCB0aGVuIGFu
IFhTS01BUA0KPj4+PiByZWRpcmVjdCwgc28gc2hvdWxkIGJlIHN1cHBvcnRlZC4gU28gaW4geW91
ciBhbmFseXNpcywgaXMgaXQgb25seQ0KPj4+PiBxdWV1ZV9pbmRleCB0aGF0IG5lZWRzIHRvIGJl
IHBvcHVsYXRlZCBhdCBDUFVNQVAgcmVkaXJlY3QgdGltZSBmb3INCj4+Pj4gdGhpcyB0byB3b3Jr
Pw0KPj4+Pg0KPj4+PiBUaGFua3M6IE1hZ251cw0KPj4+Pg0KPj4+Pj4+IE9uIDI2IE1heSAyMDI0
LCBhdCAxMjowMiwgWXV2YWwgRWwtSGFuYW55IDx5dXZhbGVAcmFkd2FyZS5jb20+IHdyb3RlOg0K
Pj4+Pj4+DQo+Pj4+Pj4gSGksDQo+Pj4+Pj4gc28gSeKAmXZlIGR1ZyBhIGJpdCBkZWVwZXIuIEl0
IHNlZW1zIHRoZSByZWNlaXZlIHF1ZXVlIGlzIG5vdCBtYWludGFpbmVkIGFjcm9zcyBDUFVzIGFu
ZCB0aGlzIG1heSBtYWtlIHRoZSB3aG9sZSBwcmFjdGljZSBvZiByZWRpcmVjdGluZyB0byBYU0sg
dW5zYWZlIGlmIEkgcmVhZCB0aGUgY29kZSBjb3JyZWN0bHkuIEl0IGFsc28gc2VlbXMgdGhpcyBw
ZXJzaXN0cyB0byBrZXJuZWwgNi42LjguIEFtIEkgbWlzc2luZyBzb21ldGhpbmc/DQo+Pj4+Pj4N
Cj4+Pj4+PiBUaGUgY29kZSBpbiBjcHVtYXAgcnVucyBYRFAgcHJvZ3JhbXMgQlVUIGRvZXNu4oCZ
dCBmaWxsIHRoZSByeHEgKHNlZSBhbHNvIHRoZSBUT0RPIGNvbW1lbnQgaW4gdGhlIGNvZGUpLiBU
aGUgWERQIGZyYW1lIGlzIGNvbnZlcnRlZCB0byBYRFAgYnVmZmVyIGJ1dCB0aGUgcnhxIGFuZCB0
eHEgYXJlIG5vdCBmaWxsZWQuIEl0IHNlZW1zIHRoZXkgcmVtYWluIGFzIGRhbmdsaW5nIHBvaW50
ZXJzLiBXaGVuIF9feHNrX21hcF9yZWRpcmVjdCBpcyBjYWxsZWQgYW5kIGluIHR1cm4geHNrX3Jj
diB0aGUgcnhxIGlzIGNvbnN1bHRlZCBib3RoIHRvIGNoZWNrIGlmIHRoZSB1bWVtIGlzIHNoYXJl
ZCAoaW4gdGhlIG5ldyBwYXRjaCkgYXMgd2VsbCBhcyBkZWNpZGUgd2hldGhlciB6ZXJvIGNvcHkg
aXMgdXNlZCBvciBub3QuIFNpbmNlIHJ4cSBpcyBub3QgdmFsaWQsIEnigJltIG5vdCBjZXJ0YWlu
IHdoYXQgdGhlIG91dGNvbWUgaXMuIE9uY2UgSSBieXBhc3NlZCB1bWVtIGNoZWNrLCBJIG5vIGxv
bmdlciBjcmFzaCB0aGUga2VybmVsIGJ1dCBJJ20gZGVmaW5pdGVseSBub3Qgc2VlaW5nIHRyYWZm
aWMgcnVubmluZy4NCj4+Pj4+Pg0KPj4+Pj4+IFRoYW5rcywNCj4+Pj4+PiBZdXZhbC4NCj4+Pj4+
Pg0KPj4+Pj4+IEhlcmUgYXJlIHRoZSBleGNlcnB0cyBmcm9tIHRoZSBjb2RlICg1LjE1LjExNyk6
DQo+Pj4+Pj4NCj4+Pj4+PiBjcHVtYXAuYzoyMTIgPGNwdV9tYXBfYnBmX3Byb2dfcnVuX3hkcD4g
PT09PT0gTm90ZSB0aGUgY29tbWVudCBpbiB0aGUgY29kZS4gPT09PT0NCj4+Pj4+PiAgZm9yIChp
ID0gMDsgaSA8IG47IGkrKykgew0KPj4+Pj4+ICAgICAgc3RydWN0IHhkcF9mcmFtZSAqeGRwZiA9
IGZyYW1lc1tpXTsNCj4+Pj4+PiAgICAgIHUzMiBhY3Q7DQo+Pj4+Pj4gICAgICBpbnQgZXJyOw0K
Pj4+Pj4+DQo+Pj4+Pj4gcnhxLmRldiA9IHhkcGYtPmRldl9yeDsNCj4+Pj4+PiAgICAgIHJ4cS5t
ZW0gPSB4ZHBmLT5tZW07DQo+Pj4+Pj4gICAgICAvKiBUT0RPOiByZXBvcnQgcXVldWVfaW5kZXgg
dG8geGRwX3J4cV9pbmZvICovDQo+Pj4+Pj4NCj4+Pj4+PiAgICAgIHhkcF9jb252ZXJ0X2ZyYW1l
X3RvX2J1ZmYoeGRwZiwgJnhkcCk7DQo+Pj4+Pj4NCj4+Pj4+PiAgICAgIGFjdCA9IGJwZl9wcm9n
X3J1bl94ZHAocmNwdS0+cHJvZywgJnhkcCk7DQo+Pj4+Pj4NCj4+Pj4+PiB4ZHAuaDoxNzUgPT09
PT0gcnhxICYgdHhxIGluIHRoZSB4ZHBfYnVmZiBhcmUgbm90IGZpbGxlZCBvciBldmVuIHJlc2V0
LiA9PT09PQ0KPj4+Pj4+IHN0YXRpYyBpbmxpbmUNCj4+Pj4+PiB2b2lkIHhkcF9jb252ZXJ0X2Zy
YW1lX3RvX2J1ZmYoc3RydWN0IHhkcF9mcmFtZSAqZnJhbWUsIHN0cnVjdCB4ZHBfYnVmZiAqeGRw
KQ0KPj4+Pj4+IHsNCj4+Pj4+PiAgeGRwLT5kYXRhX2hhcmRfc3RhcnQgPSBmcmFtZS0+ZGF0YSAt
IGZyYW1lLT5oZWFkcm9vbSAtIHNpemVvZigqZnJhbWUpOw0KPj4+Pj4+ICB4ZHAtPmRhdGEgPSBm
cmFtZS0+ZGF0YTsNCj4+Pj4+PiAgeGRwLT5kYXRhX2VuZCA9IGZyYW1lLT5kYXRhICsgZnJhbWUt
PmxlbjsNCj4+Pj4+PiAgeGRwLT5kYXRhX21ldGEgPSBmcmFtZS0+ZGF0YSAtIGZyYW1lLT5tZXRh
c2l6ZTsNCj4+Pj4+PiAgeGRwLT5mcmFtZV9zeiA9IGZyYW1lLT5mcmFtZV9zejsNCj4+Pj4+PiB9
DQo+Pj4+Pj4NCj4+Pj4+PiB4c2suYzoyNjkgPT09PT0geHNrX3JjdiBjb25zdWx0cyByeHEgaW4g
eGRwX2J1ZmYgd2hpY2ggaXMgbm90IGZpbGxlZCEgPT09PT0NCj4+Pj4+PiBzdGF0aWMgaW50IHhz
a19yY3Yoc3RydWN0IHhkcF9zb2NrICp4cywgc3RydWN0IHhkcF9idWZmICp4ZHApDQo+Pj4+Pj4g
ew0KPj4+Pj4+ICBpbnQgZXJyOw0KPj4+Pj4+ICB1MzIgbGVuOw0KPj4+Pj4+DQo+Pj4+Pj4gIGVy
ciA9IHhza19yY3ZfY2hlY2soeHMsIHhkcCk7DQo+Pj4+Pj4gIGlmIChlcnIpDQo+Pj4+Pj4gICAg
ICByZXR1cm4gZXJyOw0KPj4+Pj4+DQo+Pj4+Pj4gIGlmICh4ZHAtPnJ4cS0+bWVtLnR5cGUgPT0g
TUVNX1RZUEVfWFNLX0JVRkZfUE9PTCkgew0KPj4+Pj4+IGxlbiA9IHhkcC0+ZGF0YV9lbmQgLSB4
ZHAtPmRhdGE7DQo+Pj4+Pj4gICAgICByZXR1cm4gX194c2tfcmN2X3pjKHhzLCB4ZHAsIGxlbik7
DQo+Pj4+Pj4gIH0NCj4+Pj4+Pg0KPj4+Pj4+ICBlcnIgPSBfX3hza19yY3YoeHMsIHhkcCk7DQo+
Pj4+Pj4gIGlmICghZXJyKQ0KPj4+Pj4+IHhkcF9yZXR1cm5fYnVmZih4ZHApOw0KPj4+Pj4+ICBy
ZXR1cm4gZXJyOw0KPj4+Pj4+IH0NCj4+Pj4+Pg0KPj4+Pj4+IGludCBfX3hza19tYXBfcmVkaXJl
Y3Qoc3RydWN0IHhkcF9zb2NrICp4cywgc3RydWN0IHhkcF9idWZmICp4ZHApDQo+Pj4+Pj4gew0K
Pj4+Pj4+ICBzdHJ1Y3QgbGlzdF9oZWFkICpmbHVzaF9saXN0ID0gdGhpc19jcHVfcHRyKCZ4c2tt
YXBfZmx1c2hfbGlzdCk7DQo+Pj4+Pj4gIGludCBlcnI7DQo+Pj4+Pj4NCj4+Pj4+PiAgZXJyID0g
eHNrX3Jjdih4cywgeGRwKTsNCj4+Pj4+PiAgaWYgKGVycikNCj4+Pj4+PiByZXR1cm4gZXJyOw0K
Pj4+Pj4+DQo+Pj4+Pj4gIGlmICgheHMtPmZsdXNoX25vZGUucHJldikNCj4+Pj4+PiAgICAgIGxp
c3RfYWRkKCZ4cy0+Zmx1c2hfbm9kZSwgZmx1c2hfbGlzdCk7DQo+Pj4+Pj4NCj4+Pj4+PiAgcmV0
dXJuIDA7DQo+Pj4+Pj4gfQ0KPj4+Pj4+DQo+Pj4+Pj4+IE9uIDI0IE1heSAyMDI0LCBhdCAxODo0
OSwgWXV2YWwgRWwtSGFuYW55IDxZdXZhbEVAUmFkd2FyZS5jb20+IHdyb3RlOg0KPj4+Pj4+Pg0K
Pj4+Pj4+PiBDQVVUSU9OOkV4dGVybmFsIEVtYWlsLCBEbyBub3QgY2xpY2sgb24gbGlua3Mgb3Ig
b3BlbiBhdHRhY2htZW50cyB1bmxlc3MgeW91IHJlY29nbml6ZSB0aGUgc2VuZGVyIGFuZCBrbm93
IHRoZSBjb250ZW50IGlzIHNhZmUuDQo+Pj4+Pj4+DQo+Pj4+Pj4+IEhpIEFsbCwNCj4+Pj4+Pj4g
ICAgIEkgd291bGQgcmVhbGx5IGFwcHJlY2lhdGUgc29tZSBndWlkYW5jZSBoZXJlLiBBcyB0aGlz
IGlzc3VlIHNwYW5zIGJvdGggbmV0d29yayBYRFAgYW5kIENQVSBtYXAsIGl04oCZcyBhIGJpdCBt
b3JlIGRpZmZpY3VsdCBmb3IgbWUgdG8gZm9sbG93IGluIHRoZSBrZXJuZWwgY29kZS4gSSBhdHRl
bXB0ZWQgdG8gdHJhY2UgdGhlIGlzc3VlIGluIHRoZSBzb3VyY2UsIGJ1dCBpdOKAmXMgYSBiaXQg
Y29tcGxleCB0byBlbnRlciBleGlzdGluZyBjb2RlIGJhc2UuDQo+Pj4+Pj4+DQo+Pj4+Pj4+ICAg
ICBJdCB3aWxsIGJlIGVhc2llciBpZiB5b3UgY2FuIHRlbGwgbWUgdGhlIGZvbGxvd2luZzoNCj4+
Pj4+Pj4gMS4gSXMgdGhlIHJlY2VpdmUgcXVldWUgbWV0YWRhdGEgbWFpbnRhaW5lZCBjb3JyZWN0
bHkgdGhyb3VnaCB0aGUgQ1BVIHN3aXRjaCBpbiBDUFUgbWFwPyBJbiB0aGUgZGVzY3JpcHRpb24g
b2YgQ1BVIG1hcCBpbiBYRFAgKGh0dHBzOi8vZGV2ZWxvcGVycy5yZWRoYXQuY29tL2Jsb2cvMjAy
MS8wNS8xMy9yZWNlaXZlLXNpZGUtc2NhbGluZy1yc3Mtd2l0aC1lYnBmLWFuZC1jcHVtYXApLCBp
dCBpcyBtZW50aW9uZWQgdGhhdCBzb21lIG1ldGFkYXRhIGlzIG5vdCBtYWludGFpbmVkIGFjcm9z
cyB0aGUgQ1BVIHN3aXRjaCwgYnV0IHRoYXQgd291bGQgbWFrZSB0aGUgdW1lbSB0ZXN0IHByb2Js
ZW1hdGljLiBTaG91bGQgSSBhc3N1bWUgdGhlIHJlY2VpdmUgcXVldWUgaXMgbWFpbnRhaW5lZD8N
Cj4+Pj4+Pj4gMi4gRG9lcyBYU0sgdW1lbSB1c2VyIGNvZGUgaGF2ZSBhY2Nlc3MgdG8gdGhlIHJl
Y2VpdmUgcXVldWUgbWV0YWRhdGEgbWVtb3J5PyBJdCBzZWVtcyB0byBiZSBpbiBhIGRpZmZlcmVu
dCBwb2ludGVyLCBidXQgaXQgY291bGQgYmUgdGhhdCBpdCBwb2ludHMgdG8gdGhlIHBhY2tldCBo
ZWFkcm9vbSBpbiB0aGUgdW1lbSBhY2Nlc3NpYmxlIG1lbW9yeS4NCj4+Pj4+Pj4NCj4+Pj4+Pj4g
ICAgIElmIHRoZSByZWNlaXZlIHF1ZXVlIGlzIG5vdCBtYWludGFpbmVkIGFjcm9zcyBDUFUgc3dp
dGNoIHRoZW4gSSB0aGluayB0aGUgc2hhcmVkIHVtZW0gdGVzdCBzaG91bGQgcnVuIGFsb25nIHRo
ZSBsaW5lcyBvZiB1c2luZyBzb21lIGRlZmF1bHQgcmVjZWl2ZSBxdWV1ZSBhZnRlciBzd2l0Y2hp
bmcgQ1BVcy4gT3RoZXJ3aXNlLCBpdCBzaG91bGQgcHJvYmFibHkgZHJvcCBwYWNrZXRzIHdpdGgg
aW52YWxpZCByZWNlaXZlIHF1ZXVlcy4NCj4+Pj4+Pj4NCj4+Pj4+Pj4gICAgIFRoYW5rcywNCj4+
Pj4+Pj4gICAgICAgICAgICAgWXV2YWwuDQo+Pj4+Pj4+DQo+Pj4+Pj4+PiBPbiAyMCBNYXkgMjAy
NCwgYXQgMTg6MjQsIFl1dmFsIEVsLUhhbmFueSA8WXV2YWxFQFJhZHdhcmUuY29tPiB3cm90ZToN
Cj4+Pj4+Pj4+DQo+Pj4+Pj4+PiBIaSwNCj4+Pj4+Pj4+DQo+Pj4+Pj4+PiBTaG9ydCBWZXJzaW9u
DQo+Pj4+Pj4+PiBJ4oCZdmUgZW5jb3VudGVyZWQgYW4gaXNzdWUgcmVkaXJlY3RpbmcgdHJhZmZp
YyB0byBhbm90aGVyIENQVSB3aGlsZSB1c2luZyBzaGFyZWQgVU1FTS4gVGhlIGZyYW1lIGFycml2
ZWQgYXQgdGhlIHJlZGlyZWN0ZWQgQ1BVIHdpdGggaW52YWxpZCByZWNlaXZlIHF1ZXVlLiBUaGlz
IGNhdXNlZCBhIGtlcm5lbCBjcmFzaCBvbiB0aGUgcGF0Y2ggdGhhdCBzdXBwb3J0cyByZWRpcmVj
dGluZyB0byBwYWNrZXRzIHRvIGFueSBxdWV1ZSB3aXRoIHRoZSBzYW1lIHVtZW0gZHVlIHRvIGEg
dGVzdCBiYXNlZCBvbiB0aGUgcmVjZWl2ZSBxdWV1ZS4NCj4+Pj4+Pj4+DQo+Pj4+Pj4+PiBMb25n
IFZlcnNpb24NCj4+Pj4+Pj4+IEnigJl2ZSBjcmVhdGVkIGEgdGVzdCBwcm9ncmFtIHRoYXQgcmVk
aXJlY3RzIHRyYWZmaWMgYmV0d2VlbiB0d28gaW50ZXJmYWNlcyAocmVwbGFjaW5nIHRoZSBNQUMg
YWRkcmVzcykuIFNlZSB0aGUgY29kZSBiZWxvdy4gSXQgc3RhcnRzIHR3byBzZXBhcmF0ZSBwcm9j
ZXNzZXMgb24gdHdvIGRpZmZlcmVudCBjb3Jlcy4gV2hlbiBkaXJlY3RpbmcgdHJhZmZpYyBkaXJl
Y3RseSB0byBhbiBYU0sgc29ja2V0IGFsbCB3b3JrcyB3ZWxsLiBJ4oCZbSBydW5uaW5nIG9uIGtl
cm5lbCA1LjE1LjExNyB3aXRoIE1hZ251cyBwYXRjaCBmb3Igc2hhcmVkIHVtZW0uDQo+Pj4+Pj4+
Pg0KPj4+Pj4+Pj4gVGhlIG5leHQgc3RlcCB3YXMgYW4gWERQIHByb2dyYW0gdGhhdCByZWRpcmVj
dHMgZWFjaCBwYWNrZXQgdG8gdGhlIG90aGVyIENQVSwgYW5kIHRoZSB4ZHAgQ1BVIHByb2dyYW0g
cmVkaXJlY3QgdGhlIHBhY2tldHMgdG8gYW4gWERQIHNvY2tldC4gSW5pdGlhbGx5IHRoaXMgcmVz
dWx0ZWQgaW4gYSBrZXJuZWwgY3Jhc2guIFRoZSByZWFzb24gaXMgdGhhdCB0aGUgcmVjZWl2ZSBx
dWV1ZSBpcyBub3QgcmVjZWl2ZWQgY29ycmVjdGx5IG9uY2UgdGhlIHBhY2tldCBzd2l0Y2hlcyBD
UFUuDQo+Pj4+Pj4+Pg0KPj4+Pj4+Pj4gSeKAmXZlIHBhdGNoZWQgdGhlIGtlcm5lbCBzbyBpdCBk
b2VzIHNhbml0eSBjaGVjayBhbmQgZG9lcyBub3QgY3Jhc2ggYnV0IGRlZmF1bHRzIHRvIHF1ZXVl
IDAganVzdCBmb3IgdGhlIHVtZW0gdGVzdC4NCj4+Pj4+Pj4+DQo+Pj4+Pj4+PiBUaGUga2VybmVs
IG5vIGxvbmdlciBjcmFzaGVzIGJ1dCBJIGRvbuKAmXQgZ2V0IHRoZSB0cmFmZmljIHRvIHRoZSBY
U0sgc29ja2V0cywgYW5kIEkgbG9nIHRoZSByZWNlaXZlIHF1ZXVlcyBhbmQgdGhleSBkbyBub3Qg
c2VlbSByYW5kb206DQo+Pj4+Pj4+PiBPbiBmaXJzdCBpbnRlcmZhY2U6DQo+Pj4+Pj4+PiAweEMx
MzIzRDUwDQo+Pj4+Pj4+PiAweEMxMzQzRDE5DQo+Pj4+Pj4+PiAweEMxMzQzRDUwDQo+Pj4+Pj4+
Pg0KPj4+Pj4+Pj4gT24gc2Vjb25kIGludGVyZmFjZToNCj4+Pj4+Pj4+IDB4QzEzNEJENTANCj4+
Pj4+Pj4+IDB4QzEzNUJENTANCj4+Pj4+Pj4+DQo+Pj4+Pj4+PiBWZXJ5IGZldyBiaXRzIGRpZmZl
cmVuY2VzIGJldHdlZW4gZWFjaCBvZiB0aGUg4oCccmVjZWl2ZSBxdWV1ZXPigJ0uIEkgY291bGRu
4oCZdCByZWFsbHkgZmluZCBzb21ldGhpbmcgaW4gbXkgcHJvZ3JhbSB3aXRoIHRob3NlIG9yIHNp
bWlsYXIgdmFsdWVzLCBvciBpbiB0aGUgcGFja2V0cyBzbyBpdCBtYWtlcyBpdCBsZXNzIGxpa2Vs
eSBpdCBjb21lcyBmcm9tIHNvbWV0aGluZyBJIGRvIGluIHVzZXJzcGFjZS4gU2VlbXMgdG8gc3Vn
Z2VzdCBzb21lIGZsYWdzIGZpZWxkPyBUaGUgdmFsdWVzIGFyZSBub3QgYWx3YXlzIHRoZSBzYW1l
IGFjcm9zcyByZWJvb3RzIGJ1dCBwcmV0dHkgY2xvc2UuDQo+Pj4+Pj4+Pg0KPj4+Pj4+Pj4gQW0g
SSBkb2luZyBzb21ldGhpbmcgd3Jvbmc/IEl0IHNlZW1zIHByZXR0eSBiYXNpYy4gTW9zdCBvZiB0
aGUgY29kZSBpbiB0aGUgWERQIHByb2dyYW0gd2FzIGp1c3QgYWRkZWQgZm9yIGRlYnVnZ2luZy4g
VGhlIG9ubHkgb2RkaXR5IHBlcmhhcHMgaXMgdXNpbmcgdGhlIHNoYXJlZCB1bWVtLg0KPj4+Pj4+
Pj4NCj4+Pj4+Pj4+IFRoYW5rcywNCj4+Pj4+Pj4+IFl1dmFsLg0KPj4+Pj4+Pj4NCj4+Pj4+Pj4+
IEnigJltIGF0dGFjaGluZyB0aGUgcHJvZ3JhbSBhbmQgdmFsdWVzIGZyb20gbXkgImRlYnVnIG1h
cOKAnS4gSW4gdGhlIGRlYnVnIG1hcDoNCj4+Pj4+Pj4+IDAuIFZhbHVlcyAwLzEgLSBXaGljaCB0
eXBlIG9mIHByb2dyYW0gcmFuICh3aXRoL3dpdGhvdXQgQ1BVIHJlZGlyZWN0aW9uKS4NCj4+Pj4+
Pj4+IDEuIFZhbHVlcyAyWFkgLSBwYWNrZXQgcmVkaXJlY3RlZCBmcm9tIGNvcmUgWCB0byBjb3Jl
IFkgKDFzdCBzdGFnZSkuDQo+Pj4+Pj4+PiAyLiBWYWx1ZXMgNFhZIC0gcGFja2V0IG9uIGNvcmUg
WCByZXR1cm5zIGFjdGlvbiBZICgxc3Qgc3RhZ2UpLg0KPj4+Pj4+Pj4gKFRoZXNlIHN1Z2dlc3Qg
dGhhdCAxc3Qgc3RhZ2Ugd29ya2VkIGNvcnJlY3RseSkuDQo+Pj4+Pj4+PiAzLiBWYWx1ZXMgMVhY
WVkgLSBwYWNrZXQgcmVjZWl2ZSBxdWV1ZSBYWCBvbiBjb3JlIFlZIChYWCA9IDEwIGlzIGludmFs
aWQgcmVjZWl2ZSBxdWV1ZSBvdXRzaWRlIDIuLjUpLg0KPj4+Pj4+Pj4gNC4gMlhYWFggLSBwYWNr
ZXQgcmVjZWl2ZSBxdWV1ZSBvbiBhbnkgY29yZSAoWFhYWCAtIDQ5OTkgaW1lYW5zIHF1ZXVlIGdy
ZWF0ZXIgdGhhbiA1MDAwKS4NCj4+Pj4+Pj4+IDUuIFJhbmRvbSBlbnRyeSAtIGEgcmVjZWl2ZSBx
dWV1ZS4NCj4+Pj4+Pj4+DQo+Pj4+Pj4+PiBEZWJ1ZyBtYXAgdmFsdWVzIHdpdGhvdXQgQ1BVIHJl
ZGlyZWN0aW9uOg0KPj4+Pj4+Pj4gKy0tLS0tLSstLS0tLS0rLS0tLS0tLS0tLS0tLS0rDQo+Pj4+
Pj4+PiB8IFBvcnQgfCBLZXkgIHwgICAgIFJlY2VpdmVkIHwNCj4+Pj4+Pj4+ICstLS0tLS0rLS0t
LS0tKy0tLS0tLS0tLS0tLS0tKw0KPj4+Pj4+Pj4gfCAgICAwIHwgMTAzMiB8ICAgICAgICAgIDUw
NCB8DQo+Pj4+Pj4+PiB8ICAgIDAgfCAxMDI0IHwgICAgIDM3MDA1OTkyIHwNCj4+Pj4+Pj4+IHwg
ICAgMCB8IDEwMzQgfCAgICAgMzc1NDQwNTIgfA0KPj4+Pj4+Pj4gfCAgICAwIHwgICAgMCB8ICAg
ICA3NDU0Njg3NSB8DQo+Pj4+Pj4+PiB8ICAgIDEgfCAxMDM0IHwgICAgIDM1NzY1OTYxIHwNCj4+
Pj4+Pj4+IHwgICAgMSB8ICAgIDAgfCAgICAgNzE0OTI3NzMgfA0KPj4+Pj4+Pj4gfCAgICAxIHwg
MTAyNCB8ICAgICAzNTcyOTEwNyB8DQo+Pj4+Pj4+PiB8ICAgIDEgfCAxMDMyIHwgICAgICAgICAg
Mjc3IHwNCj4+Pj4+Pj4+ICstLS0tLS0rLS0tLS0tKy0tLS0tLS0tLS0tLS0tKw0KPj4+Pj4+Pj4N
Cj4+Pj4+Pj4+IERlYnVnIG1hcCB2YWx1ZSB3aXRoIENQVSByZWRpcmVjdGlvbiAobm8gb3RoZXIg
Y2hhbmdlKToNCj4+Pj4+Pj4+ICstLS0tLS0rLS0tLS0tKy0tLS0tLS0tLS0tLS0tKw0KPj4+Pj4+
Pj4gfCBQb3J0IHwgS2V5ICB8ICAgICBSZWNlaXZlZCB8DQo+Pj4+Pj4+PiArLS0tLS0tKy0tLS0t
LSstLS0tLS0tLS0tLS0tLSsNCj4+Pj4+Pj4+IHwgICAgMCB8ICAgIDEgfCAgICAgICAgIDM0MDAg
fA0KPj4+Pj4+Pj4gfCAgICAwIHwgIDIyMyB8ICAgICAgICAgMjk0NyB8DQo+Pj4+Pj4+PiB8ICAg
IDAgfCAgMjMyIHwgICAgICAgICAgNDU0IHwNCj4+Pj4+Pj4+IHwgICAgMCB8ICA0MjQgfCAgICAg
ICAgICA0NTQgfA0KPj4+Pj4+Pj4gfCAgICAwIHwgIDQzNCB8ICAgICAgICAgMjk0NyB8DQo+Pj4+
Pj4+PiB8ICAgIDAgfCAxMTAwMiB8ICAgICAgICAgIDQ1NCB8DQo+Pj4+Pj4+PiB8ICAgIDAgfCAx
MTAwMyB8ICAgICAgICAgMjk0NyB8DQo+Pj4+Pj4+PiB8ICAgIDAgfCAyMDAwMCB8ICAgICAgICAg
IDEwNiB8DQo+Pj4+Pj4+PiB8ICAgIDAgfCAyMDAxNiB8ICAgICAgICAgICAgNyB8DQo+Pj4+Pj4+
PiB8ICAgIDAgfCAyMDAyNCB8ICAgICAgICAgMTA1OCB8DQo+Pj4+Pj4+PiB8ICAgIDAgfCAyMDU4
MiB8ICAgICAgICAgICAgMiB8DQo+Pj4+Pj4+PiB8ICAgIDAgfCAyNDk5OSB8ICAgICAgICAgMjIz
MSB8DQo+Pj4+Pj4+PiB8ICAgIDAgfCAzMjQxMjk1MTg0IHwgICAgICAgICAgMzM5IHwNCj4+Pj4+
Pj4+IHwgICAgMCB8IDMyNDE0MjYyMDEgfCAgICAgICAgICAgIDMgfA0KPj4+Pj4+Pj4gfCAgICAw
IHwgMzI0MTQyNjI1NiB8ICAgICAgICAgMTg5MSB8DQo+Pj4+Pj4+PiB8ICAgIDEgfCAgICAxIHwg
ICAgICAgICAxMDEzIHwNCj4+Pj4+Pj4+IHwgICAgMSB8ICAyMjMgfCAgICAgICAgICA2MTAgfA0K
Pj4+Pj4+Pj4gfCAgICAxIHwgIDIzMiB8ICAgICAgICAgIDQwNCB8DQo+Pj4+Pj4+PiB8ICAgIDEg
fCAgNDI0IHwgICAgICAgICAgNDA0IHwNCj4+Pj4+Pj4+IHwgICAgMSB8ICA0MzQgfCAgICAgICAg
ICA2MTAgfA0KPj4+Pj4+Pj4gfCAgICAxIHwgMTEwMDIgfCAgICAgICAgICA0MDQgfA0KPj4+Pj4+
Pj4gfCAgICAxIHwgMTEwMDMgfCAgICAgICAgICA2MTAgfA0KPj4+Pj4+Pj4gfCAgICAxIHwgMjAw
MDAgfCAgICAgICAgICAgMTcgfA0KPj4+Pj4+Pj4gfCAgICAxIHwgMjAwMjQgfCAgICAgICAgICAz
MDkgfA0KPj4+Pj4+Pj4gfCAgICAxIHwgMjQ5OTkgfCAgICAgICAgICA2ODkgfA0KPj4+Pj4+Pj4g
fCAgICAxIHwgMzI0MTQ1OTAyNCB8ICAgICAgICAgIDMwOSB8DQo+Pj4+Pj4+PiB8ICAgIDEgfCAz
MjQxNTI0NTYwIHwgICAgICAgICAgMzgxIHwNCj4+Pj4+Pj4+ICstLS0tLS0rLS0tLS0tKy0tLS0t
LS0tLS0tLS0tKw0KPj4+Pj4+Pj4NCj4+Pj4+Pj4+IFRoZSBYRFAgY29kZSAoI2lmIDAgaXMgZm9y
IHRoZSBubyBDUFUgcmVkaXJlY3Rpb24pOg0KPj4+Pj4+Pj4gLyogU1BEWC1MaWNlbnNlLUlkZW50
aWZpZXI6IEdQTC0yLjAgKi8NCj4+Pj4+Pj4+DQo+Pj4+Pj4+PiAjaW5jbHVkZSA8bGludXgvaWZf
ZXRoZXIuaD4NCj4+Pj4+Pj4+ICNpbmNsdWRlIDxsaW51eC9icGYuaD4NCj4+Pj4+Pj4+ICNpbmNs
dWRlIDxsaW51eC9pbi5oPg0KPj4+Pj4+Pj4NCj4+Pj4+Pj4+ICNpbmNsdWRlIDxicGYvYnBmX2hl
bHBlcnMuaD4NCj4+Pj4+Pj4+ICNpbmNsdWRlIDxicGYvYnBmX2VuZGlhbi5oPg0KPj4+Pj4+Pj4N
Cj4+Pj4+Pj4+ICNpbmNsdWRlICJ4ZHAvcGFyc2luZ19oZWxwZXJzLmgiDQo+Pj4+Pj4+Pg0KPj4+
Pj4+Pj4gLyogUmVkaXJlY3QgdG8gU1AgcXVldWVzIG1hcC4gKi8NCj4+Pj4+Pj4+IHN0cnVjdA0K
Pj4+Pj4+Pj4gew0KPj4+Pj4+Pj4gX191aW50ICh0eXBlLCBCUEZfTUFQX1RZUEVfWFNLTUFQKTsN
Cj4+Pj4+Pj4+IF9fdHlwZSAoa2V5LCBfX3UzMik7DQo+Pj4+Pj4+PiBfX3R5cGUgKHZhbHVlLCBf
X3UzMik7DQo+Pj4+Pj4+PiBfX3VpbnQgKG1heF9lbnRyaWVzLCAxMjgpOw0KPj4+Pj4+Pj4gfSB4
c2tzX21hcCBTRUMoIi5tYXBzIik7DQo+Pj4+Pj4+Pg0KPj4+Pj4+Pj4gLyogUmVkaXJlY3QgdG8g
Q1BVcyBtYXAuICovDQo+Pj4+Pj4+PiBzdHJ1Y3QNCj4+Pj4+Pj4+IHsNCj4+Pj4+Pj4+IF9fdWlu
dCAodHlwZSwgQlBGX01BUF9UWVBFX0NQVU1BUCk7DQo+Pj4+Pj4+PiBfX3VpbnQgKGtleV9zaXpl
LCBzaXplb2YgKF9fdTMyKSk7DQo+Pj4+Pj4+PiBfX3VpbnQgKHZhbHVlX3NpemUsIHNpemVvZiAo
c3RydWN0IGJwZl9jcHVtYXBfdmFsKSk7DQo+Pj4+Pj4+PiBfX3VpbnQgKG1heF9lbnRyaWVzLCAz
Mik7DQo+Pj4+Pj4+PiB9IGNwdV9tYXAgU0VDKCIubWFwcyIpOw0KPj4+Pj4+Pj4NCj4+Pj4+Pj4+
IC8qIFN0YXRpc3RpY3MgYW5kIGRlYnVnIG1hcHMuICovDQo+Pj4+Pj4+PiBzdHJ1Y3QNCj4+Pj4+
Pj4+IHsNCj4+Pj4+Pj4+IF9fdWludCAodHlwZSwgQlBGX01BUF9UWVBFX1BFUkNQVV9BUlJBWSk7
DQo+Pj4+Pj4+PiBfX3R5cGUgKGtleSwgX191MzIpOw0KPj4+Pj4+Pj4gX190eXBlICh2YWx1ZSwg
X191MzIpOw0KPj4+Pj4+Pj4gX191aW50IChtYXhfZW50cmllcywgNjQpOw0KPj4+Pj4+Pj4gfSB4
ZHBfc3RhdHNfbWFwIFNFQygiLm1hcHMiKTsNCj4+Pj4+Pj4+DQo+Pj4+Pj4+PiBzdHJ1Y3QNCj4+
Pj4+Pj4+IHsNCj4+Pj4+Pj4+IF9fdWludCAodHlwZSwgQlBGX01BUF9UWVBFX0hBU0gpOw0KPj4+
Pj4+Pj4gX190eXBlIChrZXksIF9fdTMyKTsNCj4+Pj4+Pj4+IF9fdHlwZSAodmFsdWUsIF9fdTMy
KTsNCj4+Pj4+Pj4+IF9fdWludCAobWF4X2VudHJpZXMsIDY0KTsNCj4+Pj4+Pj4+IH0geGRwX2Rl
YnVnX3Byb3RvIFNFQygiLm1hcHMiKTsNCj4+Pj4+Pj4+DQo+Pj4+Pj4+PiBzdGF0aWMgX191MzIg
b25ldmFsID0gMTsNCj4+Pj4+Pj4+DQo+Pj4+Pj4+PiBpbnQgbXlfcGFyc2VfZXRoaGRyIChzdHJ1
Y3QgaGRyX2N1cnNvciogbmgsIHZvaWQqIGRhdGFlbmQsIHN0cnVjdCBldGhoZHIqKiBldGgpDQo+
Pj4+Pj4+PiB7DQo+Pj4+Pj4+PiBfX3UxNiBldGh0eXBlOw0KPj4+Pj4+Pj4gKmV0aCA9IG5oLT5w
b3M7DQo+Pj4+Pj4+PiBpZiAoKHZvaWQqKSAmKCpldGgpIFsxXSA+IGRhdGFlbmQpDQo+Pj4+Pj4+
PiB7DQo+Pj4+Pj4+PiAgcmV0dXJuICgtMSk7DQo+Pj4+Pj4+PiB9DQo+Pj4+Pj4+Pg0KPj4+Pj4+
Pj4gZXRodHlwZSA9ICgqZXRoKS0+aF9wcm90bzsNCj4+Pj4+Pj4+IG5oLT5wb3MgPSAmKCpldGgp
IFsxXTsNCj4+Pj4+Pj4+IGlmIChldGh0eXBlID09IGJwZl9udG9ocyAoRVRIX1BfODAyMVEpKQ0K
Pj4+Pj4+Pj4gew0KPj4+Pj4+Pj4gIHN0cnVjdCB2bGFuX2hkciogdmxhbiA9IChzdHJ1Y3Qgdmxh
bl9oZHIqKSAmKCpldGgpIFsxXTsNCj4+Pj4+Pj4+IGlmICgodm9pZCopICZ2bGFuIFsxXSA+IGRh
dGFlbmQpDQo+Pj4+Pj4+PiB7DQo+Pj4+Pj4+PiAgICAgICAgIHJldHVybiAoLTEpOw0KPj4+Pj4+
Pj4gfQ0KPj4+Pj4+Pj4gICAgIGV0aHR5cGUgPSB2bGFuLT5oX3ZsYW5fZW5jYXBzdWxhdGVkX3By
b3RvOw0KPj4+Pj4+Pj4gLyogaW5jX2RlYnVnX21hcCAoMTAwMDArKGJwZl9udG9ocyAodmxhbi0+
aF92bGFuX1RDSSkgJiAweDBGRkYpKTsgKi8NCj4+Pj4+Pj4+IC8qIGluY19kZWJ1Z19tYXAgKHZs
YW4tPmhfdmxhbl9UQ0kpOyAqLw0KPj4+Pj4+Pj4gbmgtPnBvcyA9ICZ2bGFuIFsxXTsNCj4+Pj4+
Pj4+IH0NCj4+Pj4+Pj4+DQo+Pj4+Pj4+PiByZXR1cm4gKGV0aHR5cGUpOw0KPj4+Pj4+Pj4gfQ0K
Pj4+Pj4+Pj4NCj4+Pj4+Pj4+IHN0YXRpYyB2b2lkIGluY19kZWJ1Z19tYXAgKF9fdTMyIGtleSkN
Cj4+Pj4+Pj4+IHsNCj4+Pj4+Pj4+ICNpZmRlZiBXSVRIX1NUQVRTDQo+Pj4+Pj4+PiBicGZfbWFw
X3VwZGF0ZV9lbGVtICgmeGRwX2RlYnVnX3Byb3RvLA0KPj4+Pj4+Pj4gICAgICAgICAgICAgICAg
ICAgICAgJmtleSwgKF9fdTMyKikgJm9uZXZhbCwgQlBGX05PRVhJU1QpOw0KPj4+Pj4+Pj4gX191
MzIqIHJlYyA9IGJwZl9tYXBfbG9va3VwX2VsZW0gKCZ4ZHBfZGVidWdfcHJvdG8sIChfX3UzMiop
ICZrZXkpOw0KPj4+Pj4+Pj4gaWYgKHJlYyAhPSBOVUxMKQ0KPj4+Pj4+Pj4gew0KPj4+Pj4+Pj4g
ICsrKCpyZWMpOw0KPj4+Pj4+Pj4gfQ0KPj4+Pj4+Pj4gI2VuZGlmDQo+Pj4+Pj4+PiB9DQo+Pj4+
Pj4+Pg0KPj4+Pj4+Pj4NCj4+Pj4+Pj4+DQo+Pj4+Pj4+PiBTRUMgKCJ4ZHAiKQ0KPj4+Pj4+Pj4g
aW50IHJkd3JfeHNrX3Byb2cgKHN0cnVjdCB4ZHBfbWQgKmN0eCkNCj4+Pj4+Pj4+IHsNCj4+Pj4+
Pj4+IGVudW0geGRwX2FjdGlvbiBhY3Rpb247DQo+Pj4+Pj4+PiBpbnQgaW5kZXggPSBjdHgtPnJ4
X3F1ZXVlX2luZGV4Ow0KPj4+Pj4+Pj4gdm9pZCogZGF0YWVuZCA9ICh2b2lkICopKGxvbmcpY3R4
LT5kYXRhX2VuZDsNCj4+Pj4+Pj4+IHZvaWQqIGRhdGEgPSAodm9pZCAqKShsb25nKWN0eC0+ZGF0
YTsNCj4+Pj4+Pj4+IGludCBzdGFnZSA9IDA7DQo+Pj4+Pj4+Pg0KPj4+Pj4+Pj4gc3RydWN0IGhk
cl9jdXJzb3Igbmg7DQo+Pj4+Pj4+Pg0KPj4+Pj4+Pj4gX191MzIgKnBrdF9jb3VudDsNCj4+Pj4+
Pj4+IHN0cnVjdCBldGhoZHIqIGV0aDsNCj4+Pj4+Pj4+DQo+Pj4+Pj4+PiAjaWZkZWYgV0lUSF9T
VEFUUw0KPj4+Pj4+Pj4gcGt0X2NvdW50ID0gYnBmX21hcF9sb29rdXBfZWxlbSgmeGRwX3N0YXRz
X21hcCwgJmluZGV4KTsNCj4+Pj4+Pj4+IGlmIChwa3RfY291bnQgIT0gTlVMTCkNCj4+Pj4+Pj4+
IHsNCj4+Pj4+Pj4+ICArKypwa3RfY291bnQ7DQo+Pj4+Pj4+PiB9DQo+Pj4+Pj4+PiAjZW5kaWYN
Cj4+Pj4+Pj4+DQo+Pj4+Pj4+PiAvKiBQYXJzZSBFdGhlcm5ldCAmIFZMQU4gKi8NCj4+Pj4+Pj4+
IG5oLnBvcyA9IGRhdGE7DQo+Pj4+Pj4+PiBpbnQgZXRodHlwZSA9IG15X3BhcnNlX2V0aGhkciAo
Jm5oLCBkYXRhZW5kLCAmZXRoKTsNCj4+Pj4+Pj4+IGlmIChldGh0eXBlICE9IGJwZl9udG9ocyAo
MHgwODAwKSkNCj4+Pj4+Pj4+IHsNCj4+Pj4+Pj4+ICByZXR1cm4gKFhEUF9QQVNTKTsNCj4+Pj4+
Pj4+IH0NCj4+Pj4+Pj4+DQo+Pj4+Pj4+PiAvKiBEaXJlY3QgWFNLIHJlZGlyZWN0LiAqLw0KPj4+
Pj4+Pj4gI2lmIDANCj4+Pj4+Pj4+IGluY19kZWJ1Z19tYXAgKHN0YWdlKTsNCj4+Pj4+Pj4+IGFj
dGlvbiA9ICBicGZfcmVkaXJlY3RfbWFwICgmeHNrc19tYXAsIGluZGV4LCBYRFBfUEFTUyk7DQo+
Pj4+Pj4+PiBpbmNfZGVidWdfbWFwICgxMDAwICsgaW5kZXgqMTAgKyBhY3Rpb24pOw0KPj4+Pj4+
Pj4gI2VuZGlmDQo+Pj4+Pj4+PiAvKiBDUFUgbWFwIHJlZGlyZWN0LiAqLw0KPj4+Pj4+Pj4gX191
MzIgY3B1aWQgPSBicGZfZ2V0X3NtcF9wcm9jZXNzb3JfaWQgKCk7DQo+Pj4+Pj4+PiBfX3UzMiB0
YXJnZXRjcHUgPSBjcHVpZCBeIDB4MDE7DQo+Pj4+Pj4+PiArK3N0YWdlOw0KPj4+Pj4+Pj4gaW5j
X2RlYnVnX21hcCAoc3RhZ2UpOw0KPj4+Pj4+Pj4gaW5jX2RlYnVnX21hcCAoMjAwICsgY3B1aWQg
KiAxMCArIHRhcmdldGNwdSk7DQo+Pj4+Pj4+PiBhY3Rpb24gPSAgYnBmX3JlZGlyZWN0X21hcCAo
JmNwdV9tYXAsIHRhcmdldGNwdSwgWERQX1BBU1MpOw0KPj4+Pj4+Pj4gaW5jX2RlYnVnX21hcCAo
NDAwICsgdGFyZ2V0Y3B1ICogMTAgKyBhY3Rpb24pOw0KPj4+Pj4+Pj4gcmV0dXJuIChhY3Rpb24p
Ow0KPj4+Pj4+Pj4gfQ0KPj4+Pj4+Pj4NCj4+Pj4+Pj4+IFNFQyAoInhkcC9jcHVtYXAiKQ0KPj4+
Pj4+Pj4gaW50IHJkd3JfY3B1X3Byb2coc3RydWN0IHhkcF9tZCAqY3R4KQ0KPj4+Pj4+Pj4gew0K
Pj4+Pj4+Pj4gX191NjQqIGRhdGFlbmQ2NCA9IChfX3U2NCopIChsb25nKSBjdHgtPmRhdGFfZW5k
Ow0KPj4+Pj4+Pj4gX191NjQqIGRhdGE2NCA9IChfX3U2NCopIChsb25nKSBjdHgtPmRhdGE7DQo+
Pj4+Pj4+PiBfX3UzMiByeHF1ZXVlID0gY3R4LT5yeF9xdWV1ZV9pbmRleDsNCj4+Pj4+Pj4+IGlm
IChyeHF1ZXVlIDwgNTAwMCkNCj4+Pj4+Pj4+IHsNCj4+Pj4+Pj4+ICBpbmNfZGVidWdfbWFwICgy
MDAwMCArIHJ4cXVldWUpOw0KPj4+Pj4+Pj4gfQ0KPj4+Pj4+Pj4gZWxzZQ0KPj4+Pj4+Pj4gew0K
Pj4+Pj4+Pj4gIGluY19kZWJ1Z19tYXAgKHJ4cXVldWUpOw0KPj4+Pj4+Pj4gaW5jX2RlYnVnX21h
cCAoMjQ5OTkpOw0KPj4+Pj4+Pj4gfQ0KPj4+Pj4+Pj4NCj4+Pj4+Pj4+IHJ4cXVldWUgPSAocnhx
dWV1ZSA+PSAyICYmIHJ4cXVldWUgPCA2KSA/IHJ4cXVldWUgOiAxMDsNCj4+Pj4+Pj4+IF9fdTMy
IGNwdWlkID0gYnBmX2dldF9zbXBfcHJvY2Vzc29yX2lkICgpOw0KPj4+Pj4+Pj4gY3B1aWQgPSAo
Y3B1aWQgPCAxMikgPyBjcHVpZCA6IDIwOw0KPj4+Pj4+Pj4gaW5jX2RlYnVnX21hcCAoMTAwMDAg
KyAxMDAqcnhxdWV1ZSArIGNwdWlkKTsNCj4+Pj4+Pj4+DQo+Pj4+Pj4+PiByZXR1cm4gYnBmX3Jl
ZGlyZWN0X21hcCAoJnhza3NfbWFwLCBicGZfZ2V0X3NtcF9wcm9jZXNzb3JfaWQgKCksIDApOw0K
Pj4+Pj4+Pj4gfQ0KPj4+Pj4+Pj4NCj4+Pj4+Pj4NCj4+Pj4+Pg0KPj4+Pj4NCj4+Pg0KDQo=