Attn: Development Editor, Latest OCaml Weekly News
Alan Schmitt <[email protected]> Tue, 24 Feb 2026 14:36:57 +0100
| Newsgroups | gmane.comp.lang.caml.inria |
|---|---|
| Message-ID | <[email protected]> |
--=-=-=
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: base64
SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl
ZWsgb2YgRmVicnVhcnkgMTcgdG8gMjQsDQoyMDI2Lg0KDQpUYWJsZSBvZiBDb250ZW50cw0K4pSA
4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCk9TRUMt
MjAyNi0wMSBpbiB0aGUgT0NhbWwgcnVudGltZTogQnVmZmVyIE92ZXItUmVhZCBpbiBPQ2FtbCBN
YXJzaGFsIERlc2VyaWFsaXphdGlvbg0KT0NhbWwgNS40LjEgYW5kIDQuMTQuMyByZWxlYXNlZA0K
QW5uOiBPY2hhdCDigJQgVHJ5IE9jaGF0IGZvciB0ZXJtaW5hbC1iYXNlZCBMTE0gd29ya2Zsb3dz
DQpTZXJpYWxwb3J0IC0gbmV3IHNlcmlhbCBjb21tdW5pY2F0aW9uIGxpYnJhcnkNClNsaXBzaG93
IQ0KUmVtb3RlIE9DYW1sIERpc3RyaWJ1dGVkIFN5c3RlbXMgRW5naW5lZXIgKExpbnV4IC8gU3Rv
cmFnZSAvIE5ldHdvcmtpbmcpIOKAkyB3aGl0ZXNreS5jbG91ZCDigJMgRU1FQS9Bc2lhDQpHcmFj
ZSAwLjMuMCDwn5KFLCBmYW5jeSBkaWFnbm9zdGljcyBsaWJyYXJ5IGZvciBjb21waWxlcnMNCkpz
X29mX29jYW1sIC8gV2FzbV9vZl9vY2FtbCA2LjMNCmtxdWV1ZS1tbCAwLjUuMA0KRHVuZSAzLjIx
LjANCk90aGVyIE9DYW1sIE5ld3MNCk9sZCBDV04NCg0KDQpPU0VDLTIwMjYtMDEgaW4gdGhlIE9D
YW1sIHJ1bnRpbWU6IEJ1ZmZlciBPdmVyLVJlYWQgaW4gT0NhbWwgTWFyc2hhbCBEZXNlcmlhbGl6
YXRpb24NCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV
kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV
kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV
kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV
kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczov
L2luYm94LmNpLmRldi9jYW1sLWxpc3QvYzMyOTgzMDktYTA2ZC00YWM4LTg3NGMtZmUyMTA0MDc4
ZTYxQG1laG5lcnQub3JnL1QvPg0KDQoNCkhhbm5lcyBNZWhuZXJ0IGFubm91bmNlZA0K4pSA4pSA
4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA
4pSA4pSA4pSADQoNCiAgRGVhciBldmVyeW9uZSwNCg0KICBpdCBpcyBteSBwbGVhc3VyZSB0byBh
bm5vdW5jZSB0aGUgZmlyc3Qgc2VjdXJpdHkgYW5ub3VuY2VtZW50IG9mIHRoaXMNCiAgeWVhciwg
YW5kIHRoZSBmaXJzdCBjb29yZGluYXRlZCBieSB0aGUgbmV3IE9DYW1sIHNlY3VyaXR5IHJlc3Bv
bnNlDQogIHRlYW0gKDxodHRwczovL29jYW1sLm9yZy9zZWN1cml0eT4pLg0KDQogIFBsZWFzZSBz
dWJzY3JpYmUgdG8gdGhlIE9DYW1sIHNlY3VyaXR5IGFubm91bmNlbWVudCBtYWlsaW5nIGxpc3QN
CiAgKDxodHRwczovL3N5bXBhLmlucmlhLmZyL3N5bXBhL2luZm8vb2NzZi1vY2FtbC1zZWN1cml0
eS1hbm5vdW5jZW1lbnRzPikNCiAgdG8gcmVjZWl2ZSBhbGwgc2VjdXJpdHkgYWR2aXNvcmllcy4g
VG8gdGhpcyBtYWlsaW5nIGxpc3QgSSdsbCBvbmx5DQogIGNvcHkgdGhvc2UgYWZmZWN0aW5nIHRo
ZSBjb3JlIG9mIE9DYW1sIGRpc3RyaWJ1dGlvbi4NCg0KICBJdCBzaG91bGQgYW55IG1vbWVudCBu
b3cgYWxzbyBhcHBlYXIgYXQNCiAgPGh0dHBzOi8vb3N2LmRldi9saXN0P3E9T1NFQy0yMDI2LTAx
Pg0KDQogIEh1bWFuIGxpbms6DQogIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvc2VjdXJpdHkt
YWR2aXNvcmllcy90cmVlL21haW4vYWR2aXNvcmllcy8yMDI2L09TRUMtMjAyNi0wMS5tZD4NCg0K
ICDilIzilIDilIDilIDilIANCiAg4pSCIGlkOiBPU0VDLTIwMjYtMDENCiAg4pSCIG1vZGlmaWVk
OiAiMjAyNi0wMi0xN1QxMzozMDowMFoiDQogIOKUgiBwdWJsaXNoZWQ6ICIyMDI2LTAyLTE3VDEz
OjMwOjAwWiINCiAg4pSCIGFsaWFzZXM6IFsgIEdIU0EtajI2ai1tNXhyLWcyM2MgR0hTQS1tMzRy
LWNncTctamhmbSBdDQogIOKUgiBzZXZlcml0eTogIkNWU1M6My4xL0FWOkwvQUM6TC9QUjpOL1VJ
Ok4vUzpVL0M6SC9JOkwvQTpOIg0KICDilIIgc2V2ZXJpdHlfc2NvcmU6ICI2LjgiDQogIOKUgiBh
ZmZlY3RlZDogIm9jYW1sIiB7PCAiNC4xNC4zIiB8ICg+PSAiNSIgJiA8ICI1LjQuMSIpfQ0KICDi
lIIgZXZlbnRzOiBbDQogIOKUgiAgICBbDQogIOKUgiAgICAgIGdpdCAiaHR0cHM6Ly9naXRodWIu
Y29tL29jYW1sL29jYW1sIiBbDQogIOKUgiAgICAgICAgW2ZpeGVkICJiMGEyNjE0Njg0YTUyYWNk
ZWQ3ODRlYzIxM2YxNGRkZmUwODVkMTQ2Il0NCiAg4pSCICAgICAgXQ0KICDilIIgICAgXQ0KICDi
lIIgICAgWw0KICDilIIgICAgICBnaXQgImh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbCIg
Ww0KICDilIIgICAgICAgIFtmaXhlZCAiZTM5MTlmZWY0MzZmODkyNzFiYzMwYmJlODU5Mjg1MWY3
Mjg5ZmI2OCJdDQogIOKUgiAgICAgIF0NCiAg4pSCICAgIF0NCiAg4pSCIF0NCiAg4pSCIHJlZmVy
ZW5jZXM6IFsNCiAg4pSCICAgIFtyZXBvcnQgDQogIOKUgiAiaHR0cHM6Ly9naXRodWIuY29tL29j
YW1sL3NlY3VyaXR5LWFkdmlzb3JpZXMvc2VjdXJpdHkvYWR2aXNvcmllcy9HSFNBLWoyNmotbTV4
ci1nMjNjIl0NCiAg4pSCIF0NCiAg4pSCIGNyZWRpdHM6IFsNCiAg4pSCICAgIFtyZXBvcnRlciAi
SnVzdGluIFRpbXBlcmlvIl0NCiAg4pSCICAgIFtyZW1lZGlhdGlvbl9kZXZlbG9wZXIgIk5pY29s
w6FzIE9qZWRhIELDpHIiXQ0KICDilIIgICAgW3JlbWVkaWF0aW9uX2RldmVsb3BlciAiWGF2aWVy
IExlcm95Il0NCiAg4pSCICAgIFtyZW1lZGlhdGlvbl9kZXZlbG9wZXIgIkdhYnJpZWwgU2NoZXJl
ciJdDQogIOKUgiAgICBbcmVtZWRpYXRpb25fcmV2aWV3ZXIgIlhhdmllciBMZXJveSJdDQogIOKU
giAgICBbcmVtZWRpYXRpb25fcmV2aWV3ZXIgIk9saXZpZXIgTmljb2xlIl0NCiAg4pSCICAgIFty
ZW1lZGlhdGlvbl92ZXJpZmllciAiTWluZHkgUHJlc3RvbiJdDQogIOKUgiAgICBbcmVtZWRpYXRp
b25fdmVyaWZpZXIgIkVkd2luIFTDtnLDtmsiXQ0KICDilIIgICAgW2Nvb3JkaW5hdG9yICJIYW5u
ZXMgTWVobmVydCJdDQogIOKUgiBdDQogIOKUgiBjd2U6IFsgQ1dFLTEyNiBDV0UtNTAyIENXRS03
NTQgXQ0KICDilJTilIDilIDilIDilIANCg0KICAqQnVmZmVyIE92ZXItUmVhZCBpbiBPQ2FtbCBN
YXJzaGFsIERlc2VyaWFsaXphdGlvbioNCg0KDQpTdW1tYXJ5DQrilYzilYzilYzilYzilYzilYzi
lYwNCg0KICBBIGNyaXRpY2FsIGJ1ZmZlciBvdmVyLXJlYWQgdnVsbmVyYWJpbGl0eSBpbiBPQ2Ft
bCdzIE1hcnNoYWwNCiAgZGVzZXJpYWxpemF0aW9uIChydW50aW1lL2ludGVybi5jKSBlbmFibGVz
IHJlbW90ZSBjb2RlIGV4ZWN1dGlvbg0KICB0aHJvdWdoIGEgbXVsdGktcGhhc2UgYXR0YWNrIGNo
YWluLiBUaGUgdnVsbmVyYWJpbGl0eSBzdGVtcyBmcm9tDQogIG1pc3NpbmcgYm91bmRzIHZhbGlk
YXRpb24gaW4gdGhlIHJlYWRibG9jaygpIGZ1bmN0aW9uLCB3aGljaCBwZXJmb3Jtcw0KICB1bmJv
dW5kZWQgbWVtY3B5KCkgb3BlcmF0aW9ucyB1c2luZyBhdHRhY2tlci1jb250cm9sbGVkIGxlbmd0
aHMgZnJvbQ0KICBtYWxpY2lvdXMgTWFyc2hhbCBkYXRhLg0KDQogIFBsZWFzZSBub3RlIHRoYXQg
TWFyc2hhbCBpcyBub3QgdHlwZSBzYWZlLCBhbmQgeW91IGhhdmUgdG8gYmUgY2FyZWZ1bA0KICBp
ZiB5b3UgdXNlIHRoZSBkZXNlcmlhbGl6YXRpb24gb24gdW50cnVzdGVkIGlucHV0IChkdWUgdG8g
dHlwZQ0KICBjb25mdXNpb24sIGFuZCByZW1vdGUgY29kZSBleGVjdXRpb24gYnkgZGVzaWduIC0g
eW91IGNhbiB1c2UgTWFyc2hhbA0KICBmb3IgY29kZSkuDQoNCiAgQWZmZWN0ZWQgZnVuY3Rpb25z
OiBgTWFyc2hhbC5mcm9tX2NoYW5uZWwnLCBgTWFyc2hhbC5mcm9tX2J5dGVzJywNCiAgYE1hcnNo
YWwuZnJvbV9zdHJpbmcnLCBgU3RkbGliLmlucHV0X3ZhbHVlJywgYFBlcnZhc2l2ZXMuaW5wdXRf
dmFsdWUnDQogIHdoZW4gcmVhZGluZyBkYXRhIGZyb20gYW4gdW50cnVzdGVkIHNvdXJjZS4NCg0K
DQpWdWxuZXJhYmlsaXR5IEF0dGFjayBWZWN0b3INCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV
jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0K
DQogIENvcnJ1cHRlZCBvciBtYWxpY2lvdXMgbWFyc2hhbGVkIGRhdGEgdGhhdCBjYXVzZXMgdW5k
ZWZpbmVkIGJlaGF2aW91cg0KICBpbiB0aGUgcnVudGltZSBzeXN0ZW0gd2hlbiB1bm1hcnNoYWxl
ZC4gIGBpbnB1dF92YWx1ZScgc2hvdWxkIGVpdGhlcg0KICBmYWlsIGNsZWFubHkgb3IgcHJvZHVj
ZSBhIHdlbGwtZm9ybWVkIE9DYW1sIG9iamVjdCwgd2l0aG91dCBjb3JydXB0aW5nDQogIHRoZSBy
dW50aW1lIHN5c3RlbS4NCg0KICBDb25zZXF1ZW50bHksIHRoaXMgZXhjbHVkZXM6DQoNCiAg4oCi
IHdlbGwtZm9ybWVkIG1hcnNoYWxlZCBkYXRhIHRoYXQgcHJvZHVjZXMgYW4gT0NhbWwgb2JqZWN0
IHRoYXQgaXMgbm90DQogICAgb2YgdGhlIHR5cGUgZXhwZWN0ZWQgYnkgdGhlIE9DYW1sIGNvZGUg
YW5kIGNhdXNlcyB0aGUgT2NhbWwgY29kZSB0bw0KICAgIGNyYXNoIG9yIG1pc2JlaGF2ZQ0KDQog
IOKAoiBtaXN1c2VzIG9mIHRoZSBPQ2FtbCBydW50aW1lIHN5c3RlbSBieSB0aGUgcHJvZ3JhbSBw
ZXJmb3JtaW5nDQogICAgaW5wdXRfdmFsdWUsIHN1Y2ggYXMgc2V0dGluZyBgRGVidWdnZXIuZnVu
Y3Rpb25fcGxhY2Vob2xkZXInIHRvIHRoZQ0KICAgIHdyb25nIGZ1bmN0aW9uLg0KDQogIFRoZSBm
b3JtZXIgaXNzdWUgbWF5IGJlIGFkZHJlc3NlZCBhdCBzb21lIHBvaW50IGJ5IHZhbGlkYXRpbmcg
dGhlDQogIHVubWFyc2hhbGVkIE9DYW1sIHZhbHVlIGFnYWluc3QgdGhlIGV4cGVjdGVkIHR5cGUs
IHVzaW5nIHRoZSBmdW5jdGlvbnMNCiAgZnJvbSBtb2R1bGUgYE9iaicgYW5kIHNvbWUga2luZCBv
ZiBydW4tdGltZSB0eXBlIGRlc2NyaXB0aW9uLg0KDQogIFRoZSBsYXR0ZXIgaXNzdWUgaXMgYSBi
dWcgaW4gdGhlIHByb2dyYW0gdGhhdCB1bm1hcnNoYWxzIHRoZSBkYXRhLg0KDQoNCkZpeA0K4pWM
4pWM4pWMDQoNCuKXiiBPQ2FtbCBydW50aW1lDQoNCiAgVGhlIE9DYW1sIHJ1bnRpbWUgaGFzIGJl
ZW4gaGFyZGVuZWQgd2l0aCBhZGRpdGlvbmFsIGJvdW5kcyBjaGVja3MuIEFuDQogIGV4Y2VwdGlv
biBpcyByYWlzZWQgb24gYmFkIGlucHV0Lg0KDQoNCuKXiiBUaGlyZCBwYXJ0eSBsaWJyYXJpZXMN
Cg0KICBUaGlyZCBwYXJ0eSBsaWJyYXJpZXMgdGhhdCB3YW50IHRvIGhhcmRlbiB0aGVpciBjdXN0
b20gTWFyc2hhbA0KICBkZXNlcmlhbGl6YXRpb24gY29kZSBjYW4gZm9sbG93IHRoZSBleGFtcGxl
IGZpeCBmb3IgYmlnYXJyYXlzIGZyb20gdGhlDQogIHN0YW5kYXJkIGxpYnJhcnkuICBUaGVyZSBh
cmUgbmV3IG1hY3JvcyBpbiBgY3VzdG9tLmgnIGNhbGxlZA0KICBgV3NpemVfY3VzdG9tX2RhdGEn
IGFuZCBgQnNpemVfY3VzdG9tX2RhdGEnIHRoYXQgcmV0dXJuIHRoZSBzaXplIGluDQogIHdvcmRz
IG9yIGJ5dGVzIG9mIHRoZSBhbGxvY2F0ZWQgY3VzdG9tIGRlc3RpbmF0aW9uIGJsb2NrLiBUaGUN
CiAgZGVzZXJpYWxpemVyIG5lZWRzIHRvIGVuc3VyZSBpdCBvbmx5IHdyaXRlcyBkYXRhIHdpdGhp
biB0aG9zZSBib3VuZHMuDQoNCiAgVGhpcyBvbmx5IG5lZWRzIHRvIGJlIGRvbmUgaWYgdGhlIGxp
YnJhcnkgZGVmaW5lcyBhIGN1c3RvbSB0eXBlIGluIGEgQw0KICBiaW5kaW5nLCBhbmQgYHN0cnVj
dCBjdXN0b21fb3BlcmF0aW9ucycncyBgZGVzZXJpYWxpemUnIGZpZWxkIGlzIG5vdA0KICBzZXQg
dG8gYE5VTEwnIG9yIGBjdXN0b21fZGVzZXJpYWxpemVfZGVmYXVsdCcsIGFuZCBgc3RydWN0DQog
IGN1c3RvbV9vcGVyYXRpb25zJydzIGBmaXhlZF9sZW5ndGgnIGZpZWxkIGlzIHNldCB0byBgTlVM
TCcgb3INCiAgYGN1c3RvbV9maXhlZF9sZW5ndGhfZGVmYXVsdCcNCg0KICBTaW5jZSBgTWFyc2hh
bC5mcm9tKicgYW5kIGBpbnB1dF92YWx1ZScgcmVtYWluIHVuc2FmZSB0byB1c2UsIHRoZSBmaXgN
CiAgZm9yIHRoZSBPQ2FtbCBydW50aW1lIGlzIHJlbGVhc2VkLCBhbmQgd2Ugd291bGRuJ3QgYXR0
ZW1wdCB0bw0KICBjb29yZGluYXRlIHVwZGF0aW5nIGFsbCBkZXNlcmlhbGl6YXRpb24gZnVuY3Rp
b25zIGluIHRoZSBlY29zeXN0ZW0uDQoNCg0KVGltZWxpbmUNCuKVjOKVjOKVjOKVjOKVjOKVjOKV
jOKVjA0KDQogIOKAoiBOb3YgNHRoIDIwMjU6IERpc2NvdmVyeSBEYXRlOiBEaXNjb3ZlcmVkIGZp
cnN0IGluIE94Q2FtbA0KICDigKIgTm92IDV0aCAyMDI1OiBGaXJzdCBEaXNjbG9zdXJlIERhdGUg
KEphbmUgU3RyZWV0IFRlYW0pOiBFbWFpbGVkIHRvcA0KICAgIG1haW50YWluZXJzLCBubyByZXNw
b25zZS4NCiAg4oCiIE5vdiA5dGggMjAyNTogU2Vjb25kIERpc2Nsb3N1cmUgRGF0ZSAoT0NhbWwg
VGVhbSk6IFN1Ym1pdHRlZCB0bw0KICAgIE9DYW1sL29jYW1sIEdpdEh1YiBSZXBvIGFzIGEgU2Vj
dXJpdHkgQWR2aXNvcnkuDQogIOKAoiBOb3YgMTF0aCAyMDI1OiBFbWFpbGVkIE9DYW1sIFNlY3Vy
aXR5IE1haWwgTGlzdDogU3VibWl0dGVkIHRvIE9DYW1sDQogICAgb3ZlciBlbWFpbCwgcmVzcG9u
ZGVkIGFza2luZyBmb3IgZGV0YWlscy4NCiAg4oCiIE5vdiAxMXRoIDIwMjU6IFRoaXJkIERpc2Ns
b3N1cmUgKE9DYW1sIFNlY3VyaXR5IFJlc3BvbnNlIFRlYW0pOg0KICAgIFN1Ym1pdHRlZCB0byBv
Y2FtbC9zZWN1cml0eS1hZHZpc29yaWVzIEdpdEh1YiBSZXBvIGFzIGEgU2VjdXJpdHkNCiAgICBB
ZHZpc29yeS4NCiAg4oCiIERlYyAxNnRoIDIwMjU6IEluaXRpYWwgcGF0Y2ggaXMgZGV2ZWxvcGVk
DQogIOKAoiBEZWMgMTd0aCAyMDI1OiBGdXp6IHRlc3RpbmcgZm91bmQgZnVydGhlciBpc3N1ZXMN
CiAg4oCiIERlYyAyNHRoIDIwMjU6IEZpbmFsIHBhdGNoIGZvciBPQ2FtbCBpcyBkZXZlbG9wZWQN
CiAg4oCiIERlYyAyNXRoIDIwMjU6IEZ1enogdGVzdGluZyBjb3VsZG4ndCBmaW5kIGFueSBmdXJ0
aGVyIGlzc3Vlcw0KICDigKIgSmFuIDJuZCAyMDI2OiBQYXRjaCBnb3QgcmV2aWV3ZWQgYnkgT0Nh
bWwgbWFpbnRhaW5lcnMNCiAg4oCiIEphbiA0dGggMjAyNjogQmVuY2htYXJraW5nIG9mIHRoZSBw
YXRjaCB3aXRoIGdvb2QgcmVzdWx0cw0KICDigKIgSmFuIDZ0aCAyMDI2OiBSZXBvcnRlciBnb3Qg
Y29udGFjdGVkIHRvIGNvbmZpcm0NCiAg4oCiIEphbiAyNXRoIDIwMjY6IEZ1cnRoZXIgcmVsYXRl
ZCBpc3N1ZXMgZGlzY292ZXJlZCBieSBmdXp6aW5nDQogIOKAoiBGZWIgMTd0aCAyMDI2OiBmaXhl
ZCBPQ2FtbCByZWxlYXNlcyBhcmUgcHVibGlzaGVkLCBzZWN1cml0eSBhZHZpc29yeQ0KICAgIGlz
IHB1Ymxpc2hlZA0KDQoNCk9DYW1sIDUuNC4xIGFuZCA0LjE0LjMgcmVsZWFzZWQNCuKVkOKVkOKV
kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV
kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rp
c2N1c3Mub2NhbWwub3JnL3Qvb2NhbWwtNS00LTEtYW5kLTQtMTQtMy1yZWxlYXNlZC8xNzgyMi8x
Pg0KDQoNCm9jdGFjaHJvbiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU
gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFdlIGhhdmUgdGhlIHBsZWFzdXJlIG9m
IGFubm91bmNpbmcgdGhlIGR1YWwgcmVsZWFzZXMgb2YgT0NhbWwgNC4xNC4zDQogIGFuZCBPQ2Ft
bCA1LjQuMSwgZGVkaWNhdGVkIHRvIHRoZSBtZW1vcnkgb2YgTmljb2xhYXMgR292ZXJ0IGRlIEJy
dWlqbg0KICBvbiB0aGUgYW5uaXZlcnNhcnkgb2YgaGlzIGRlYXRoLg0KDQogIFRob3NlIHJlbGVh
c2VzIGFyZSBhIGNvbGxlY3Rpb24gb2Ygc2FmZSBhbmQgdmFsdWFibGUgcnVudGltZSBidWdmaXhl
cy4NCiAgVGhlIE9DYW1sIDUuNC4xIHJlbGVhc2UgYWxzbyBjb250YWlucyBhIGZpeCBmb3IgdGhl
IGAtcGFjaycgbW9kZSBmb3INCiAgbWFjT3MgYW5kIHZhcmlvdXMgVFNBTiBmaXhlcy4NCg0KICBN
b3JlIGltcG9ydGFudGx5LCB0aG9zZSBuZXcgdmVyc2lvbnMgaGFyZGVuIHRoZSBNYXJzaGFsIG1v
ZHVsZSBhZ2FpbnN0DQogIG1hbGljaW91cyBpbnB1dHMgYXMgZGVzY3JpYmVkIGluIHRoZSBzZWN1
cml0eSBhbm5vdW5jZW1lbnQNCiAgW09TRUMtMjAyNi0wMV0uDQoNCiAgV2UgYXJlIGVuY291cmFn
aW5nIHlvdSB0byBzd2l0Y2ggdG8gdGhvc2UgbmV3IHJlbGVhc2VzIHdoZW5ldmVyDQogIHBvc3Np
YmxlLg0KDQogIERvbid0IGhlc2l0YXRlIHRvIHJlcG9ydCBhbnkgYnVncyBvbiB0aGUgW09DYW1s
IGlzc3VlIHRyYWNrZXJdLg0KDQogIFNlZSB0aGUgbGlzdCBvZiBjaGFuZ2VzIGJlbG93IGZvciBt
b3JlIGRldGFpbHMuDQoNCiAgSGFwcHkgaGFja2luZywg4oCTIEZsb3JpYW4gQW5nZWxldHRpIGZv
ciB0aGUgT0NhbWwgdGVhbS4NCg0KDQogICpJbnN0YWxsYXRpb24gSW5zdHJ1Y3Rpb25zKg0KDQog
IFRoZSBiYXNlIGNvbXBpbGVycyB3aWxsIGJlIHNvb24gaW5zdGFsbGFibGUgYXMgYW4gb3BhbSBz
d2l0Y2ggd2l0aCB0aGUNCiAgZm9sbG93aW5nIGNvbW1hbmRzOg0KDQogIOKUjOKUgOKUgOKUgOKU
gA0KICDilIIgb3BhbSB1cGRhdGUNCiAg4pSCIG9wYW0gc3dpdGNoIGNyZWF0ZSA0LjE0LjMNCiAg
4pSCIG9wYW0gc3dpdGNoIGNyZWF0ZSA1LjQuMQ0KICDilJTilIDilIDilIDilIANCg0KDQogIFRo
ZSBzb3VyY2UgY29kZSBmb3IgdGhlIHJlbGVhc2UgY2FuZGlkYXRlIGlzIGFsc28gZGlyZWN0bHkg
YXZhaWxhYmxlDQogIG9uOg0KDQogIOKAoiBHaXRIdWI6DQogICAg4oCiIDxodHRwczovL2dpdGh1
Yi5jb20vb2NhbWwvb2NhbWwvYXJjaGl2ZS80LjE0LjMudGFyLmd6Pg0KICAgIOKAoiA8aHR0cHM6
Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2FyY2hpdmUvNS40LjEudGFyLmd6Pg0KDQogIOKAoiBJ
bnJpYSBhcmNoaXZlOg0KICAgIOKAoiA8aHR0cHM6Ly9jYW1sLmlucmlhLmZyL3B1Yi9kaXN0cmli
L29jYW1sLTQuMTQvb2NhbWwtNC4xNC4zLnRhci5nej4NCiAgICDigKIgPGh0dHBzOi8vY2FtbC5p
bnJpYS5mci9wdWIvZGlzdHJpYi9vY2FtbC01LjQvb2NhbWwtNS40LjEudGFyLmd6Pg0KDQoNCiAg
Kk9DYW1sIDQuMTQuMyAoMTcgRmVicnVhcnkgMjAyNikqDQoNCiAg4oCiIFsjMTIwNzBdLCBbIzEy
MDc1XSwgWyMxMzIwOV06IGF1dG8tZGV0ZWN0IHdoZXRoZXIgYGFyJyBzdXBwb3J0IEBGSUxFDQog
ICAgYXJndW1lbnRzIGF0IGNvbmZpZ3VyZS10aW1lIHRvIGF2b2lkIHVzaW5nIHRoaXMgZmVhdHVy
ZSB3aXRoDQogICAgdG9vbGNoYWlucyB0aGF0IGRvIG5vdCBzdXBwb3J0IGl0IChlZyBGcmVlQlNE
L0Rhcndpbik7IGJhY2twb3J0IGZyb20NCiAgICA1LjMuICAoYmFja3BvcnQgYnkgQm9yaXMgRG9i
cm9zbGF2b3YsIG9yaWdpbmFsIGZpeCBieSBOaWNvbMOhcyBPamVkYQ0KICAgIELDpHIsIHJldmll
dyBieSBYYXZpZXIgTGVyb3ksIERhdmlkIEFsbHNvcHAsIEphdmllciBDaMOhdmFycmksIEFuaWwN
CiAgICBNYWRoYXZhcGVkZHkpDQoNCiAg4oCiIFsjMTIyMDddLCBbIzEyMjIyXTogTWFrZSBjbG9z
dXJlIGNvbXB1dGF0aW9uIGxpbmVhciBpbiB0aGUgbnVtYmVyIG9mDQogICAgcmVjdXJzaXZlIGZ1
bmN0aW9ucyBpbnN0ZWFkIG9mIHF1YWRyYXRpYyAoVmluY2VudCBMYXZpcm9uLCByZXBvcnQgYnkN
CiAgICBGcmFuw6dvaXMgUG90dGllciwgcmV2aWV3IGJ5IE5hdGhhbmHDq2xsZSBDb3VyYW50IGFu
ZCBHYWJyaWVsIFNjaGVyZXIpDQoNCiAg4oCiIFsjMTM0MzBdLCBbIzEzNDM0XTogcHJvdGVjdCBt
ZW1vcnktc2FmZXR5IG9uIExhenkuZm9yY2UgcmFjZXMNCiAgICAoR2FicmllbCBTY2hlcmVyIGFu
ZCBWaW5jZW50IExhdmlyb24sIHJlcG9ydCBieSBFZHdpbiBUw7Zyw7ZrLCByZXZpZXcNCiAgICBi
eSBWaW5jZW50IExhdmlyb24pDQoNCiAg4oCiIFsjMTM0NDhdLCBbIzEzNDQ5XTogZml4IGEgY29k
ZS1nZW5lcmF0aW9uIGJ1ZyBvbiB1bnNhZmUgYXJyYXkNCiAgICBhY2Nlc3NlcyBhdCB0eXBlIGlu
dDMyLCBpbnQ2NCwgbmF0aXZlaW50LCB3aGljaCBoYXMgYmVlbiBpbnRyb2R1Y2VkDQogICAgaW4g
T0NhbWwgNC4wNC4gIChHYWJyaWVsIFNjaGVyZXIsIHJldmlldyBieSBOaWNvbMOhcyBPamVkYSBC
w6RyIGFuZA0KICAgIFZpbmNlbnQgTGF2aXJvbiwgcmVwb3J0IGJ5IFNpbW9uIENydWFuZXMpDQoN
CiAg4oCiIFsjMTM1MTZdOiBGaXggcmVncmVzc2lvbiB3aGVyZSBlcnJvciBjb25kaXRpb25zIGR1
cmluZyBieXRlY29kZQ0KICAgIGluaXRpYWxpc2F0aW9uIGNhdXNlZCBhIHNlZ21lbnRhdGlvbiBm
YXVsdCByYXRoZXIgdGhhbiBiZWluZw0KICAgIHByb3Blcmx5IHJlcG9ydGVkIChyZWdyZXNzaW9u
IG9mIFsjNTExNV0gaW4gWyMxMTc4OF0pIChEYXZpZA0KICAgIEFsbHNvcHAsIHJldmlldyBieSBO
aWNvbMOhcyBPamVkYSBCw6RyKQ0KDQogIOKAoiBbIzEzODQ3XTogT24gV2luZG93cywgbWFpbnRh
aW4gYSBudW1iZXIgb2YgdGhyZWFkcyB3YWl0aW5nIG9uIHRoZQ0KICAgIG1hc3RlciBsb2NrIHRv
IGF2b2lkIHVubmVjZXNzYXJ5IGNvbnRleHQgc3dpdGNoZXMgKERtaXRyeSBCZWx5LA0KICAgIHJl
dmlldyBieSBBbnRvbmluIETDqWNpbW8pDQoNCiAg4oCiIFsjMTQwMDddLCBbIzE0MDE1XTogRml4
IG1lbW9yeSBjb3JydXB0aW9uIHdoZW4gYW4gZXhjZXB0aW9uIGlzDQogICAgcmFpc2VkIGR1cmlu
ZyBkZW1hcnNoYWxpbmcuICAoQmVub8OudCBWYXVnb24sIHJldmlldyBieSBEYXZpZCBBbGxzb3Bw
DQogICAgYW5kIEdhYnJpZWwgU2NoZXJlcikNCg0KICDigKIgW09TRUMtMjAyNi0wMV06IHJvYnVz
dGlmeSBpbnRlcm4uYyAoWGF2aWVyIExlcm95LCByZXZpZXcgYnkgRGFtaWVuDQogICAgRG9saWdl
eiBhbmQgT2xpdmllciBOaWNvbGUpDQoNCiAgKk9DYW1sIDUuNC4xICgxNyBGZWJydWFyeSAyMDI2
KSoNCg0KDQpbT1NFQy0yMDI2LTAxXSA8aHR0cHM6Ly9vc3YuZGV2L3Z1bG5lcmFiaWxpdHkvT1NF
Qy0yMDI2LTAxPg0KDQpbT0NhbWwgaXNzdWUgdHJhY2tlcl0gPGh0dHBzOi8vZ2l0aHViLmNvbS9v
Y2FtbC9vY2FtbC9pc3N1ZXM+DQoNClsjMTIwNzBdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwv
b2NhbWwvaXNzdWVzLzEyMDcwPg0KDQpbIzEyMDc1XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1s
L29jYW1sL2lzc3Vlcy8xMjA3NT4NCg0KWyMxMzIwOV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2Ft
bC9vY2FtbC9pc3N1ZXMvMTMyMDk+DQoNClsjMTIyMDddIDxodHRwczovL2dpdGh1Yi5jb20vb2Nh
bWwvb2NhbWwvaXNzdWVzLzEyMjA3Pg0KDQpbIzEyMjIyXSA8aHR0cHM6Ly9naXRodWIuY29tL29j
YW1sL29jYW1sL2lzc3Vlcy8xMjIyMj4NCg0KWyMxMzQzMF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9v
Y2FtbC9vY2FtbC9pc3N1ZXMvMTM0MzA+DQoNClsjMTM0MzRdIDxodHRwczovL2dpdGh1Yi5jb20v
b2NhbWwvb2NhbWwvaXNzdWVzLzEzNDM0Pg0KDQpbIzEzNDQ4XSA8aHR0cHM6Ly9naXRodWIuY29t
L29jYW1sL29jYW1sL2lzc3Vlcy8xMzQ0OD4NCg0KWyMxMzQ0OV0gPGh0dHBzOi8vZ2l0aHViLmNv
bS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTM0NDk+DQoNClsjMTM1MTZdIDxodHRwczovL2dpdGh1Yi5j
b20vb2NhbWwvb2NhbWwvaXNzdWVzLzEzNTE2Pg0KDQpbIzUxMTVdIDxodHRwczovL2dpdGh1Yi5j
b20vb2NhbWwvb2NhbWwvaXNzdWVzLzUxMTU+DQoNClsjMTE3ODhdIDxodHRwczovL2dpdGh1Yi5j
b20vb2NhbWwvb2NhbWwvaXNzdWVzLzExNzg4Pg0KDQpbIzEzODQ3XSA8aHR0cHM6Ly9naXRodWIu
Y29tL29jYW1sL29jYW1sL2lzc3Vlcy8xMzg0Nz4NCg0KWyMxNDAwN10gPGh0dHBzOi8vZ2l0aHVi
LmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTQwMDc+DQoNClsjMTQwMTVdIDxodHRwczovL2dpdGh1
Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzE0MDE1Pg0KDQpCdWcgZml4ZXM6DQrilYzilYzilYzi
lYzilYzilYzilYzilYzilYzilYwNCg0KICDigKIgWyMxNDAxMF06IEZpeCBtaXNjb21waWxhdGlv
biAvIGxpdmVuZXNzIGVycm9ycyBmb3Igc3RyaW5nIG9wZXJhdGlvbnMNCiAgICAoTWFyayBTaGlu
d2VsbCwgWGF2aWVyIENsZXJjLCByZXZpZXcgYnkgWGF2aWVyIExlcm95IGFuZCBHYWJyaWVsDQog
ICAgU2NoZXJlcikNCg0KICDigKIgWyMxNDA2NV06IEZpeCBmdW5jdGlvbiBzaWduYXR1cmUgbWlz
bWF0Y2ggb2YgYF9fdHNhbl9mdW5jX2V4aXQnIHdpdGgNCiAgICBHQ0MgMTUuICBDaGVjayBpbiB0
aGUgY29uZmlndXJlIHN0ZXAgaWYgdGhlIFRTYW4gcHJvdmlkZWQgaW50ZXJuYWwNCiAgICBidWls
dGlucyBhcmUgdGhlIHNhbWUgYXMgd2hhdCB3ZSBleHBlY3QsIGludHJvZHVjZSBgY2FtbF90c2Fu
XyonDQogICAgd3JhcHBlcnMgZm9yIHRoZSBgX190c2FuXyonIGZ1bmN0aW9ucyB3ZSB1c2UuICAo
SGFyaSBIYXJhIE5hdmVlbiBTLA0KICAgIHJlcG9ydCBieSBIYXJpIEhhcmEgTmF2ZWVuIFMsIHJl
dmlldyBieSBHYWJyaWVsIFNjaGVyZXIsIEFudG9uaW4NCiAgICBEw6ljaW1vLCBPbGl2aWVyIE5p
Y29sZSkNCg0KICDigKIgWyMxNDQxN106IEZpeCBpc3N1ZSB3aXRoIG5lc3RlZCBwYWNrcyBvbiBt
YWNPUy4gIChWaW5jZW50IExhdmlyb24sDQogICAgcmVwb3J0IGJ5IEthdGUgRGVwbGFpeCwgcmV2
aWV3IGJ5IEdhYnJpZWwgU2NoZXJlcikNCg0KICDigKIgWyMxNDIxM106IEZpeCBzaGFkb3ctc3Rh
Y2stcmVsYXRlZCBjcmFzaGVzIHdpdGggVFNhbiAoT2xpdmllcg0KICAgIE5pY29sZSwgcmVwb3J0
IGJ5IE5hdGhhbiBUYXlsb3IsIHJldmlldyBieSBHYWJyaWVsIFNjaGVyZXIgYW5kDQogICAgU3Rl
ZmFuIE11ZW56ZWwpDQoNCiAg4oCiIFsjMTQyNTVdOiBGaXggVFNhbiBidWcgd2l0aCBDIGNhbGxz
IHRoYXQgdGFrZSBtYW55IGFyZ3VtZW50cw0KICAgIChPbGl2aWVyIE5pY29sZSBhbmQgTWlvZCBW
YWxsYXQsIHJlcG9ydCBieSBOYXRoYW4gVGF5bG9yLCByZXZpZXcgYnkNCiAgICBHYWJyaWVsIFNj
aGVyZXIpDQoNCiAg4oCiIFtPU0VDLTIwMjYtMDFdOiByb2J1c3RpZnkgaW50ZXJuLmMgKFhhdmll
ciBMZXJveSBhbmQgTmljb2zDoXMgT2plZGENCiAgICBCw6RyLCByZXZpZXcgYnkgT2xpdmllciBO
aWNvbGUsIE1pbmR5IFByZXN0b24sIEVkd2luIFTDtnLDtmssIGFuZA0KICAgIEdhYnJpZWwgU2No
ZXJlcikNCg0KDQpbIzE0MDEwXSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vl
cy8xNDAxMD4NCg0KWyMxNDA2NV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1
ZXMvMTQwNjU+DQoNClsjMTQ0MTddIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNz
dWVzLzE0NDE3Pg0KDQpbIzE0MjEzXSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lz
c3Vlcy8xNDIxMz4NCg0KWyMxNDI1NV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9p
c3N1ZXMvMTQyNTU+DQoNCltPU0VDLTIwMjYtMDFdIDxodHRwczovL29zdi5kZXYvdnVsbmVyYWJp
bGl0eS9PU0VDLTIwMjYtMDE+DQoNCg0KQW5uOiBPY2hhdCDigJQgVHJ5IE9jaGF0IGZvciB0ZXJt
aW5hbC1iYXNlZCBMTE0gd29ya2Zsb3dzDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi
lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi
lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi
lZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9j
YW1sLm9yZy90L2Fubi1vY2hhdC10cnktb2NoYXQtZm9yLXRlcm1pbmFsLWJhc2VkLWxsbS13b3Jr
Zmxvd3MvMTc4MjkvMT4NCg0KDQpEYWtvdGEgTXVycGh5IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA
4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA
DQoNCiAgSGkgYWxsIOKAlCBJ4oCZZCBsaWtlIHRvIHNoYXJlIGEgcHJvamVjdCBJ4oCZdmUgYmVl
biBidWlsZGluZzogKk9jaGF0Ki4NCg0KICDigKIgUmVwbzogKltodHRwczovL2dpdGh1Yi5jb20v
ZGFrb3RhbXVycGh5dWNmL29jaGF0XSoNCiAg4oCiIERlbW86ICpbaHR0cHM6Ly95b3V0dS5iZS9l
R2dtVWRaZm54TV0qDQoNCg0KW2h0dHBzOi8vZ2l0aHViLmNvbS9kYWtvdGFtdXJwaHl1Y2Yvb2No
YXRdDQo8aHR0cHM6Ly9naXRodWIuY29tL2Rha290YW11cnBoeXVjZi9vY2hhdD4NCg0KW2h0dHBz
Oi8veW91dHUuYmUvZUdnbVVkWmZueE1dIDxodHRwczovL3lvdXR1LmJlL2VHZ21VZFpmbnhNPg0K
DQoqV2hhdCBpdCBpcyoNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQog
IE9jaGF0IGlzIGEgdG9vbGtpdCBmb3IgYnVpbGRpbmcgTExNIHdvcmtmbG93cyBhcyAqcGxhaW4g
ZmlsZXMqLiBUaGUNCiAgY29yZSBmb3JtYXQgaXMgKkNoYXRNYXJrZG93biAoQ2hhdE1EKSo6IE1h
cmtkb3duIHBsdXMgYSBzbWFsbCwgY2xvc2VkDQogIFhNTCB2b2NhYnVsYXJ5Lg0KDQogIEEgc2lu
Z2xlIENoYXRNRCBmaWxlIGlzIGJvdGg6DQoNCiAg4oCiIHRoZSAqcHJvbXB0L3Byb2dyYW0qICht
b2RlbCBjb25maWcsIHRvb2wgYWxsb3dsaXN0LCBpbnN0cnVjdGlvbnMsDQogICAgY29udGV4dCks
IGFuZA0KICDigKIgdGhlICphdWRpdGFibGUgdHJhbnNjcmlwdCogKGFzc2lzdGFudCByZXBsaWVz
ICsgdG9vbCBjYWxscyArIHRvb2wNCiAgICBvdXRwdXRzKQ0KDQogIEJlY2F1c2UgZXZlcnl0aGlu
ZyBpcyBwbGFpbiB0ZXh0LCB3b3JrZmxvd3MgYXJlIHJlcHJvZHVjaWJsZSBhbmQNCiAgZGlmZmFi
bGUgaW4gZ2l0Lg0KDQoNCipQcm9tcHQgcGFja3M6IGJ1aWxkaW5nIGxhcmdlciB3b3JrZmxvd3Mg
ZnJvbSBzbWFsbCBhZ2VudHMqDQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi
lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi
lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi
lYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBPY2hhdCBzdXBwb3J0cyAqYWdlbnQtYXMt
dG9vbCo6IHlvdSBjYW4gbW91bnQgb25lIENoYXRNRCBwcm9tcHQgYXMgYQ0KICBjYWxsYWJsZSB0
b29sIGluc2lkZSBhbm90aGVyLiBUaGlzIGxldHMgeW91IGJ1aWxkICpwcm9tcHQgcGFja3MqDQog
IChwbGFubmVyL2NvZGVyL3Jldmlld2VyL2RvY3MvdGVzdCB0cmlhZ2UvZXRjLikgYW5kIG9yY2hl
c3RyYXRlIHRoZW0NCiAgZnJvbSBhIHRvcC1sZXZlbCBwcm9tcHQsIHdpdGhvdXQgd3JpdGluZyBh
IGN1c3RvbSDigJxhZ2VudCBhcHDigJ0uDQoNCg0KKmNoYXRfdHVpOiBhIE5vdHR5LWJhc2VkIHRl
cm1pbmFsIFVJIChydW50aW1lIHVzZXMgRWlvKSoNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV
jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV
jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV
jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIE9jaGF0IHNoaXBzIGFuIGludGVyYWN0
aXZlIHRlcm1pbmFsIFVJIGNhbGxlZCAqY2hhdF90dWkqLg0KDQogIOKAoiBUaGUgVUkgaXMgYnVp
bHQgd2l0aCAqTm90dHkqDQogIOKAoiBUaGUgdW5kZXJseWluZyBydW50aW1lIHVzZXMgKkVpbyog
KHN0cnVjdHVyZWQgY29uY3VycmVuY3kgKyBJL08pDQoNCiAgQSBDaGF0TUQgZmlsZSBjYW4gYmUg
dHJlYXRlZCBhcyBhIOKAnHRlcm1pbmFsIGFnZW504oCdOiB5b3UgYXV0aG9yIGFuDQogIGFnZW50
IHByb21wdCBhcyBhIC5tZCwgb3BlbiBpdCBpbiBjaGF0X3R1aSwgYW5kIHJ1bi9pdGVyYXRlIG9u
IGl0DQogIHdoaWxlIHRoZSB0cmFuc2NyaXB0IChpbmNsdWRpbmcgdG9vbCB0cmFjZXMpIGlzIHBl
cnNpc3RlZC4NCg0KICBTb21lIGNoYXRfdHVpIGZlYXR1cmVzOg0KDQogIOKAoiBzdHJlYW1pbmcg
b3V0cHV0IChhc3Npc3RhbnQgdGV4dCArIHRvb2wgY2FsbHMgKyB0b29sIG91dHB1dHMpDQogIOKA
oiBwZXJzaXN0ZW50IHNlc3Npb25zIHlvdSBjYW4gcmVzdW1lL2JyYW5jaC9leHBvcnQNCiAg4oCi
IG1hbnVhbCBjb250ZXh0IGNvbXBhY3Rpb24gKDpjb21wYWN0KSBmb3IgbG9uZyBoaXN0b3JpZXMN
CiAg4oCiIHN5bnRheCBoaWdobGlnaHRpbmcgKGluY2x1ZGluZyBPQ2FtbCkNCiAg4oCiIEFJIGNv
bXBsZXRpb25zIGluIHRoZSB0ZXh0IGlucHV0ICh0byBzcGVlZCB1cCBkcmFmdGluZykNCiAg4oCi
IFZpbS1pc2ggZWRpdGluZyBtb2RlcyBhbmQgbWVzc2FnZSBzZWxlY3Rpb24veWFuay9lZGl0L3Jl
c3VibWl0DQogICAgd29ya2Zsb3dzDQoNCg0KKlVzZWZ1bCBidWlsdC1pbiB0b29scyAoZXNwZWNp
YWxseSBmb3IgY29kZSB3b3JrZmxvd3MpKg0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM
4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM
4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM
4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgT2NoYXQgaW5jbHVkZXMgYnVpbHQtaW4gdG9vbHMg
dGhhdCBjb3ZlciBtb3N0IOKAnGFnZW50ICsgcmVwb+KAnSBsb29wczoNCg0KICDigKIgcmVhZF9m
aWxlIC8gcmVhZF9kaXIgZm9yIHNhZmUgcmVwbyBuYXZpZ2F0aW9uDQogIOKAoiBhcHBseV9wYXRj
aCBmb3IgYXRvbWljLCByZXBvLXNhZmUgZWRpdHMNCiAg4oCiIHdlYnBhZ2VfdG9fbWFya2Rvd24g
Zm9yIGhpZ2gtc2lnbmFsIGluZ2VzdGlvbiAoaW5jbC4gR2l0SHViIGJsb2INCiAgICBmYXN0LXBh
dGgpDQogIOKAoiBpbmRleGluZy9yZXRyaWV2YWwgdG9vbHMgZm9yIGdyb3VuZGluZyBvdmVyIGRv
Y3MgYW5kIGNvZGUNCiAg4oCiIG9wdGlvbmFsIHZpc2lvbiBpbnB1dHMgdmlhIGltcG9ydF9pbWFn
ZQ0KDQoNCipNQ1AgdG9vbCBpbXBvcnQgKG9wdGlvbmFsKSoNCuKVjOKVjOKVjOKVjOKVjOKVjOKV
jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV
jOKVjOKVjA0KDQogIE9jaGF0IGNhbiBhbHNvIG1vdW50IGV4dGVybmFsIHRvb2xzIHZpYSBNQ1Ag
KHN0ZGlvIG9yIEhUVFApLiBGb3INCiAgZXhhbXBsZSwgaW1wb3J0aW5nIEJyYXZlIFNlYXJjaCBv
dmVyIHN0ZGlvOg0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgPHRvb2wgbWNwX3NlcnZlcj0i
c3RkaW86bnB4IC15IGJyYXZlLXNlYXJjaC1tY3AiIG5hbWU9ImJyYXZlX3dlYl9zZWFyY2giIC8+
DQogIOKUlOKUgOKUgOKUgOKUgA0KDQoNCipRdWljayBleGFtcGxlOiBhIOKAnGN1c3RvbSB0ZXJt
aW5hbCBvcmNoZXN0cmF0b3IgYWdlbnTigJ0qDQrilYzilYzilYzilYzilYzilYzilYzilYzilYzi
lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi
lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi
lYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBUaGlzIGlzIGEgY29tcGxldGUgYWdlbnQgZGVm
aW5pdGlvbiAoYW5kIGJlY29tZXMgdGhlIHJ1bm5hYmxlIOKAnGFwcOKAnQ0KICB3aGVuIG9wZW5l
ZCBpbiBjaGF0X3R1aSk6DQoNCg0KICDilIzilIDilIDilIDilIANCiAg4pSCIDxjb25maWcgbW9k
ZWw9ImdwdC01LjIiIHJlYXNvbmluZ19lZmZvcnQ9Im1lZGl1bSIgLz4NCiAg4pSCIA0KICDilIIg
PCEtLSBjb3JlIGJ1aWx0LWlucyAtLT4NCiAg4pSCIDx0b29sIG5hbWU9InJlYWRfZGlyIi8+DQog
IOKUgiA8dG9vbCBuYW1lPSJyZWFkX2ZpbGUiLz4NCiAg4pSCIDx0b29sIG5hbWU9ImFwcGx5X3Bh
dGNoIi8+DQogIOKUgiA8dG9vbCBuYW1lPSJ3ZWJwYWdlX3RvX21hcmtkb3duIi8+DQogIOKUgiAN
CiAg4pSCIDwhLS0gb3B0aW9uYWw6IGltcG9ydCBhbiBleHRlcm5hbCB0b29sIHZpYSBNQ1AgLS0+
DQogIOKUgiA8dG9vbCBtY3Bfc2VydmVyPSJzdGRpbzpucHggLXkgYnJhdmUtc2VhcmNoLW1jcCIg
bmFtZT0iYnJhdmVfd2ViX3NlYXJjaCIgLz4NCiAg4pSCIA0KICDilIIgPCEtLSBwcm9tcHQtcGFj
ayB0b29scyAoYWdlbnRzIGFzIHRvb2xzKSAtLT4NCiAg4pSCIDx0b29sIG5hbWU9InBsYW4iICAg
YWdlbnQ9InByb21wdHMvcGFjay9wbGFuLm1kIiBsb2NhbC8+DQogIOKUgiA8dG9vbCBuYW1lPSJj
b2RlIiAgIGFnZW50PSJwcm9tcHRzL3BhY2svY29kZS5tZCIgbG9jYWwvPg0KICDilIIgPHRvb2wg
bmFtZT0icmV2aWV3IiBhZ2VudD0icHJvbXB0cy9wYWNrL3Jldmlldy5tZCIgbG9jYWwvPg0KICDi
lIIgDQogIOKUgiA8ZGV2ZWxvcGVyPg0KICDilIIgWW91IGFyZSB0aGUgb3JjaGVzdHJhdG9yLiBD
YWxsIHBsYW4gZmlyc3QuDQogIOKUgiBLZWVwIGVkaXRzIHNtYWxsLiBCZWZvcmUgYXBwbHlfcGF0
Y2g6IGV4cGxhaW4gdGhlIGRpZmYgYW5kIHdhaXQgZm9yIGNvbmZpcm1hdGlvbi4NCiAg4pSCIDwv
ZGV2ZWxvcGVyPg0KICDilIIgDQogIOKUgiA8dXNlcj4NCiAg4pSCIEFkZCBhIFF1aWNrc3RhcnQg
c2VjdGlvbiB0byBSRUFETUUubWQuDQogIOKUgiA8L3VzZXI+DQogIOKUlOKUgOKUgOKUgOKUgA0K
DQogIFJ1biBpdCBmcm9tIHRoZSByZXBvIHdpdGg6DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKU
giBkdW5lIGV4ZWMgY2hhdF90dWkgLS0gLWZpbGUgcHJvbXB0cy9yZWZhY3Rvci5tZA0KICDilJTi
lIDilIDilIDilIANCg0KDQoqU3RhdHVzIC8gY2F2ZWF0cyoNCuKVjOKVjOKVjOKVjOKVjOKVjOKV
jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIOKAoiBQcm92aWRlciBzdXBw
b3J0IHRvZGF5IGlzICpPcGVuQUktb25seSouDQogIOKAoiBUaGUgcHJvamVjdCBpcyBtb3Zpbmcg
cXVpY2tseS4NCg0KDQoqRmVlZGJhY2sgLyBjb250cmlidXRvcnMqDQrilYzilYzilYzilYzilYzi
lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi
lYwNCg0KICBJ4oCZZCBhcHByZWNpYXRlIGFueSBmZWVkYmFjayBvciBjb250cmlidXRpb25zDQoN
CiAgSWYgeW91IHRyeSBpdCBhbmQgYW55dGhpbmfigJlzIGNvbmZ1c2luZyBvciByb3VnaCwgcGxl
YXNlIG9wZW4gYW4gaXNzdWUuDQoNCg0KU2VyaWFscG9ydCAtIG5ldyBzZXJpYWwgY29tbXVuaWNh
dGlvbiBsaWJyYXJ5DQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi
lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi
lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0
cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1zZXJpYWxwb3J0LW5ldy1zZXJpYWwtY29tbXVu
aWNhdGlvbi1saWJyYXJ5LzE3NTk0LzM+DQoNCg0KQ29udGludWluZyB0aGlzIHRocmVhZCwgTWlr
aGFpbCBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU
gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU
gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFtBZGRlZF0gKGFrYSBpbXBsZW1lbnRlZCkg
V2luMzIgc3VwcG9ydCwgd2hpY2ggaGFzIG5vdCBiZWVuIHRob3JvdWdobHkNCiAgdGVzdGVkLCBi
dXQgbWF5IGJlIHVzZWZ1bCBmb3IgY2VydGFpbiB0YXJnZXQgdXNlIGNhc2VzLg0KDQoNCltBZGRl
ZF0NCjxodHRwczovL2dpdGh1Yi5jb20vZHgzbW9kL3NlcmlhbHBvcnQvY29tbWl0L2QwNTdhMDA0
YzA1MDIzNGI2NGU0ZWRiZWUyYzEzYTA0YmY0YzI3MzQ+DQoNCg0KU2xpcHNob3chDQrilZDilZDi
lZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOiA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1s
Lm9yZy90L2Fubi1zbGlwc2hvdy8xNjMzNy8xOD4NCg0KDQpDb250aW51aW5nIHRoaXMgdGhyZWFk
LCBQYXVsLUVsbGlvdCBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU
gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU
gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEl0IGlz
IHdpdGggZXh0cmF0ZXJyZXN0cmlhbCBleGNpdGVtZW50IHRoYXQgSSBhbm5vdW5jZSB0aGUgbmV4
dA0KICByZWxlYXNlIG9mIFNsaXBzaG93Og0KDQogICpTbGlwc2hvdyAwLjkuMDogTWFuaW0gQmxh
Y2sqDQoNCiAgVGhlIGZlYXR1cmVkIG5ldyBmZWF0dXJlIG9mIHRoaXMgcmVsZWFzZSBpcyB0aGUg
YWJpbGl0eSB0byBlYXNpbHkNCiAgaW50ZWdyYXRlIFtNYW5pbV0gdmlkZW9zIGluIHlvdXIgcHJl
c2VudGF0aW9uLg0KDQogIDxodHRwczovL2dpdGh1Yi5jb20vdXNlci1hdHRhY2htZW50cy9hc3Nl
dHMvZjY3YmI4ZmMtYzI4OC00ZmYzLWI2YmMtZTcyYzEyZTYzNmE3Pg0KDQogIE5vdGUgdGhhdCwg
Y29tcGFyZWQgdG8ganVzdCBwbGF5aW5nIGEgdmlkZW8sIHlvdSBjYW4gc2NoZWR1bGUgcGF1c2Vz
LA0KICBnbyBmYXN0ZXIgdG8gdGhlIG5leHQgcGF1c2UsIGFuZCBnbyBiYWNrIHRvIHRoZSBwcmV2
aW91cyBwYXVzZXMsIGFzDQogIHNob3djYXNlZCBiZWxvdy4NCg0KDQpbTWFuaW1dIDxodHRwczov
L3d3dy5tYW5pbS5jb21tdW5pdHkvPg0KDQpTa2lwcGluZyBzdGVwcyBhbmQgZ29pbmcgYmFja3dh
cmQgZGVtbw0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM
4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM
4pWM4pWM4pWMDQoNCiAgPGh0dHBzOi8vZ2l0aHViLmNvbS91c2VyLWF0dGFjaG1lbnRzL2Fzc2V0
cy9jZjFhZDI2NC1hNWUyLTQyZDItOWY1Ny0wOTU1MWYzYTM1ZTg+DQoNCiAgVGhpcyByZWxlYXNl
IGZlYXR1cmVzIG1hbnkgbW9yZSBjaGFuZ2VzLCBzdWNoIGFzIFRpa1ogYW5kIE1lcm1haWRKUw0K
ICBpbnRlZ3JhdGlvbiEgSGVyZSBpcyB0aGUgZnVsbCBjaGFuZ2Vsb2c6DQoNCg0KQWRkZWQNCuKV
jOKVjOKVjOKVjOKVjA0KDQogIOKAoiBTdXBwb3J0IGZvciBNZXJtYWlkIEpTIChbIzIwNV0pDQog
IOKAoiBTdXBwb3J0IGZvciBzeW50YXggaGlnaGxpZ2h0aW5nIG9mIGFsbCBoaWdobGlnaHRqcy1z
dXBwb3J0ZWQNCiAgICBsYW5ndWFnZXMgYW5kIHRoZW1lcyAoWyMyMDBdLCBbIzIwOF0pDQogIOKA
oiBTdXBwb3J0IGZvciBNYXRoSmF4IGV4dGVuc2lvbnMsIGVzcGVjaWFsbHkgdGhlIGh0bWwgZXh0
ZW5zaW9uIHRvDQogICAgYWxsb3cgYWN0aW9ucyB0byB0YXJnZXQgbWF0aCBlbGVtZW50cyAoWyMy
MDJdKQ0KICDigKIgQWRkIEthVGVYIGFzIGEgcG9zc2libGUgYWx0ZXJuYXRlIHJlbmRlcmVyIChb
IzIwMl0pDQogIOKAoiBBZGRlZCBgY2Fyb3VzZWwtZml4ZWQtc2l6ZScgdG8gaGF2ZSBjYXJvdXNl
bCBub3QgY2hhbmdlIHNpemUNCiAgICAoWyMyMDddKQ0KDQoNClsjMjA1XSA8aHR0cHM6Ly9naXRo
dWIuY29tL3BhbmdsZXNkL3NsaXBzaG93L3B1bGwvMjA1Pg0KDQpbIzIwMF0gPGh0dHBzOi8vZ2l0
aHViLmNvbS9wYW5nbGVzZC9zbGlwc2hvdy9wdWxsLzIwMD4NCg0KWyMyMDhdIDxodHRwczovL2dp
dGh1Yi5jb20vcGFuZ2xlc2Qvc2xpcHNob3cvcHVsbC8yMDg+DQoNClsjMjAyXSA8aHR0cHM6Ly9n
aXRodWIuY29tL3BhbmdsZXNkL3NsaXBzaG93L3B1bGwvMjAyPg0KDQpbIzIwN10gPGh0dHBzOi8v
Z2l0aHViLmNvbS9wYW5nbGVzZC9zbGlwc2hvdy9wdWxsLzIwNz4NCg0KDQpGaXgNCuKVjOKVjOKV
jA0KDQogIOKAoiBGaXggaW1wb3NzaWJpbGl0eSB0byByZW9wZW4gc3BlYWtlciB2aWV3IGFmdGVy
IGNsb3NpbmcgaXQgb24gRmlyZWZveA0KICAgIChbIzE5OF0sIGlzc3VlIFsjMTk0XSkNCiAg4oCi
IEZpeCBpbXBvc3NpYmlsaXR5IHRvIG9wZW4gc3BlYWtlciB2aWV3IGluIHNlcnZlIG1vZGUgKFsj
MTk4XSwgaXNzdWUNCiAgICBbIzE5N10pDQogIOKAoiBGaXggbGlua3Mgb3BlbmluZyBpbnNpZGUg
aWZyYW1lIChbIzE5OF0pDQogIOKAoiBGaXggZW5kaW5nIGV4Y3Vyc2lvbnMgd2l0aCBgaWprbCcg
b25seSB3aGVuIG5lZWRlZCAoWyMyMDddKQ0KICDigKIgRml4ZWQgdmlkZW8gbG9uZy1zdGVwIGhh
bmRsaW5nIChbIzIwN10pDQogIOKAoiBSZW1vdmVkIGNvbmZ1c2luZyBhdXRvLWdlbmVyYXRlZCBJ
RHMgKFsjMjA5XSkNCiAg4oCiIEZpeCBgcGxheS1tZWRpYScgYmVoYXZpb3Igd2hlbiBmYWNpbmcg
ZXJyb3JzIChbIzIxMF0pDQoNCg0KWyMxOThdIDxodHRwczovL2dpdGh1Yi5jb20vcGFuZ2xlc2Qv
c2xpcHNob3cvcHVsbC8xOTg+DQoNClsjMTk0XSA8aHR0cHM6Ly9naXRodWIuY29tL3BhbmdsZXNk
L3NsaXBzaG93L2lzc3Vlcy8xOTQ+DQoNClsjMTk3XSA8aHR0cHM6Ly9naXRodWIuY29tL3Bhbmds
ZXNkL3NsaXBzaG93L2lzc3Vlcy8xOTc+DQoNClsjMjA3XSA8aHR0cHM6Ly9naXRodWIuY29tL3Bh
bmdsZXNkL3NsaXBzaG93L3B1bGwvMjA3Pg0KDQpbIzIwOV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9w
YW5nbGVzZC9zbGlwc2hvdy9wdWxsLzIwOT4NCg0KWyMyMTBdIDxodHRwczovL2dpdGh1Yi5jb20v
cGFuZ2xlc2Qvc2xpcHNob3cvcHVsbC8yMTA+DQoNCg0KRG9jcw0K4pWM4pWM4pWM4pWMDQoNCiAg
4oCiIEFkZCBob3cgdG8gaW5jbHVkZSBUaWtaIGZpZ3VyZXMgaW4geW91ciBTbGlwc2hvdyBwcmVz
ZW50YXRpb24NCiAgICAoWyMyMDZdKQ0KICDigKIgQWRkIGhvdyB0byBpbmNsdWRlIE1hbmltIHZp
ZGVvcyBpbiB5b3VyIFNsaXBzaG93IHByZXNlbnRhdGlvbg0KICAgIChbIzIwN10pDQoNCiAgQ3Jl
ZGl0OiBAdmRzIGZvciB0aGUgbmFtZSBvZiB0aGUgcmVsZWFzZS4NCg0KICBUaGFua3MgYWdhaW4g
dG8gTkxOZXQgZm9yIFtzdXBwb3J0aW5nXSB0aGUgZGV2ZWxvcG1lbnQgb2YgU2xpcHNob3chDQoN
Cg0KWyMyMDZdIDxodHRwczovL2dpdGh1Yi5jb20vcGFuZ2xlc2Qvc2xpcHNob3cvcHVsbC8yMDY+
DQoNClsjMjA3XSA8aHR0cHM6Ly9naXRodWIuY29tL3BhbmdsZXNkL3NsaXBzaG93L3B1bGwvMjA3
Pg0KDQpbc3VwcG9ydGluZ10gPGh0dHBzOi8vbmxuZXQubmwvcHJvamVjdC9TbGlwc2hvdy8+DQoN
Cg0KUmVtb3RlIE9DYW1sIERpc3RyaWJ1dGVkIFN5c3RlbXMgRW5naW5lZXIgKExpbnV4IC8gU3Rv
cmFnZSAvIE5ldHdvcmtpbmcpIOKAkyB3aGl0ZXNreS5jbG91ZCDigJMgRU1FQS9Bc2lhDQrilZDi
lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi
lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi
lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi
lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi
lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi
lZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9y
Zy90L3JlbW90ZS1vY2FtbC1kaXN0cmlidXRlZC1zeXN0ZW1zLWVuZ2luZWVyLWxpbnV4LXN0b3Jh
Z2UtbmV0d29ya2luZy13aGl0ZXNreS1jbG91ZC1lbWVhLWFzaWEvMTc4MzIvMT4NCg0KDQpHZWVy
dCBBdWRlbmFlcnQgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi
lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBXZSBhcmUgbG9v
a2luZyBmb3IgYW4gT0NhbWwgZW5naW5lZXIgdG8gam9pbiAqd2hpdGVza3kuY2xvdWQqIHRvIHdv
cmsNCiAgb24gbG93LWxldmVsIGRpc3RyaWJ1dGVkIGluZnJhc3RydWN0dXJlIGNvbXBvbmVudHMu
DQoNCiAgKkFib3V0IHRoZSB3b3JrKg0KDQogIFlvdSB3aWxsIHdvcmsgb24gY29yZSBidWlsZGlu
ZyBibG9ja3Mgb2YgYSBzb3ZlcmVpZ24gY2xvdWQgcGxhdGZvcm0sDQogIGluY2x1ZGluZyBkaXN0
cmlidXRlZCBzdG9yYWdlIGFuZCBjb29yZGluYXRpb24gc2VydmljZXMuDQoNCiAgRXhhbXBsZXMg
b2YgcmVsYXRlZCBwcm9qZWN0czoNCg0KICDigKIgW2h0dHBzOi8vZ2l0aHViLmNvbS9vcGVudnN0
b3JhZ2UvYWxiYV0NCiAg4oCiIFtodHRwczovL2dpdGh1Yi5jb20vb3BlbnZzdG9yYWdlL2FyYWtv
b25dDQoNCiAgVGhlIHdvcmsgaW52b2x2ZXM6DQoNCiAg4oCiIERpc3RyaWJ1dGVkIHN5c3RlbXMg
ZGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbg0KICDigKIgSGlnaC1wZXJmb3JtYW5jZSBuZXR3b3Jr
aW5nIGFuZCBJL08NCiAg4oCiIExpbnV4IHN5c3RlbXMgcHJvZ3JhbW1pbmcNCiAg4oCiIERlYnVn
Z2luZyBhbmQgb3B0aW1pemluZyBiZWhhdmlvciB1bmRlciByZWFsIHByb2R1Y3Rpb24gbG9hZA0K
ICDigKIgTG9uZy1ydW5uaW5nIHNlcnZpY2VzIHdoZXJlIHJlbGlhYmlsaXR5IGFuZCBjb3JyZWN0
bmVzcyBtYXR0ZXINCg0KICBUaGlzIGlzICppbmZyYXN0cnVjdHVyZSB3b3JrKiwgbm90IHdlYiBk
ZXZlbG9wbWVudC4NCg0KICDigJQNCg0KICAqV2hhdCB3ZSBhcmUgbG9va2luZyBmb3IqDQoNCiAg
4oCiIFN0cm9uZyBPQ2FtbCBleHBlcmllbmNlICpvciogc3Ryb25nIHN5c3RlbXMgcHJvZ3JhbW1p
bmcgYmFja2dyb3VuZA0KICAgIHdpdGggd2lsbGluZ25lc3MgdG8gd29yayBpbiBPQ2FtbA0KICDi
gKIgR29vZCB1bmRlcnN0YW5kaW5nIG9mOg0KICAgIOKAoyBMaW51eCBpbnRlcm5hbHMNCiAgICDi
gKMgTmV0d29ya2luZyAvIFRDUC9JUA0KICAgIOKAoyBDb25jdXJyZW5jeSBhbmQgcGVyZm9ybWFu
Y2UNCiAg4oCiIEludGVyZXN0IGluIGRpc3RyaWJ1dGVkIHN5c3RlbXMsIHN0b3JhZ2UsIG9yIGNv
bnNlbnN1cyBhbGdvcml0aG1zDQoNCiAgV2UgY2FyZSBtb3JlIGFib3V0ICpzeXN0ZW1zIHRoaW5r
aW5nIGFuZCBlbmdpbmVlcmluZyBkZXB0aCogdGhhbiBhYm91dA0KICBzcGVjaWZpYyBmcmFtZXdv
cmtzLg0KDQogIOKAlA0KDQogICpQcmFjdGljYWwgZGV0YWlscyoNCg0KICDigKIgRnVsbC10aW1l
IHBvc2l0aW9uDQogIOKAoiBGdWxseSByZW1vdGUNCiAg4oCiIExvY2F0aW9uOiBFTUVBIG9yIEFz
aWENCiAg4oCiIFNhbGFyeTogYXJvdW5kICrigqwzMDAwL21vbnRoKiAoZGVwZW5kaW5nIG9uIGV4
cGVyaWVuY2UgYW5kIGxvY2F0aW9uKQ0KDQogIFdlIGtub3cgdGhpcyBpcyBub3QgYSBiaWctdGVj
aCBzYWxhcnkuIFdlIGFyZSBhIHNtYWxsDQogIGVuZ2luZWVyaW5nLWRyaXZlbiBjb21wYW55LCBh
bmQgdGhlIHJvbGUgaXMgYWltZWQgYXQgZW5naW5lZXJzIHdobw0KICBlbmpveSB3b3JraW5nIGNs
b3NlIHRvIHRoZSBzeXN0ZW0sIHNvbHZpbmcgcmVhbCBpbmZyYXN0cnVjdHVyZQ0KICBwcm9ibGVt
cywgYW5kIGhhdmluZyBhIGRpcmVjdCBpbXBhY3QuDQoNCiAg4oCUDQoNCiAgKkFib3V0IHdoaXRl
c2t5Kg0KDQogIHdoaXRlc2t5IGJ1aWxkcyBhIGNvbXBsZXRlIGNsb3VkIHBsYXRmb3JtIGJhc2Vk
IG9uIExpbnV4IGFuZCBLVk0sDQogIGZvY3VzZWQgb24gc292ZXJlaWdudHkgYW5kIGNvbnRyb2wu
ICBUaGUgcGxhdGZvcm0gaXMgdXNlZCBieSBNU1BzLA0KICBTYWFTIHByb3ZpZGVycyBhbmQgZW50
ZXJwcmlzZXMgdG8gcnVuIHRoZWlyIG93biBjbG91ZCBpbmZyYXN0cnVjdHVyZS4NCg0KICBZb3Ug
d2lsbCBiZSB3b3JraW5nIG9uIGNvbXBvbmVudHMgdGhhdCBydW4gaW4gcHJvZHVjdGlvbiBlbnZp
cm9ubWVudHMNCiAgYW5kIGZvcm0gcGFydCBvZiBhIGRpc3RyaWJ1dGVkIGNsb3VkIHN0YWNrLg0K
DQogIOKAlA0KDQogIElmIHRoaXMgc291bmRzIGludGVyZXN0aW5nLCBwbGVhc2UgY29udGFjdDoN
Cg0KICAqZ2VlcnQuYXVkZW5hZXJ0QHdoaXRlc2t5LmNsb3VkKg0KDQogIG9yIHNlbmQgYSBETS4N
Cg0KICBXZSBhcmUgaGFwcHkgdG8gYW5zd2VyIHF1ZXN0aW9ucyBvciBkaXNjdXNzIHdoZXRoZXIg
dGhpcyBjb3VsZCBiZSBhDQogIGdvb2QgZml0Lg0KDQoNCltodHRwczovL2dpdGh1Yi5jb20vb3Bl
bnZzdG9yYWdlL2FsYmFdDQo8aHR0cHM6Ly9naXRodWIuY29tL29wZW52c3RvcmFnZS9hbGJhPg0K
DQpbaHR0cHM6Ly9naXRodWIuY29tL29wZW52c3RvcmFnZS9hcmFrb29uXQ0KPGh0dHBzOi8vZ2l0
aHViLmNvbS9vcGVudnN0b3JhZ2UvYXJha29vbj4NCg0KDQpHcmFjZSAwLjMuMCDwn5KFLCBmYW5j
eSBkaWFnbm9zdGljcyBsaWJyYXJ5IGZvciBjb21waWxlcnMNCuKVkOKVkOKVkOKVkOKVkOKVkOKV
kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV
kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV
kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczov
L2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWdyYWNlLTAtMy0wLWZhbmN5LWRpYWdub3N0aWNzLWxp
YnJhcnktZm9yLWNvbXBpbGVycy8xNzgzMy8xPg0KDQoNCiJBbGlzdGFpciBPJ0JyaWVuIiBhbm5v
dW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU
gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEnigJltIGV4Y2l0ZWQgdG8g
YW5ub3VuY2UgdGhlIHJlbGVhc2Ugb2YgW2dyYWNlIDAuMy4wXSwgYW4gT0NhbWwgbGlicmFyeQ0K
ICBmb3IgYnVpbGRpbmcsIHJlcG9ydGluZyBhbmQgcmVuZGVyaW5nIGJlYXV0aWZ1bCBjb21waWxl
ciBkaWFnbm9zdGljcw0KICA6Y2FtZWw6IDpwYWludGJydXNoOi4gTm93IGF2YWlsYWJsZSBvbiBb
b3BhbS1yZXBvc2l0b3J5XS4NCg0KICBUaGlzIHJlbGVhc2UgaW5jbHVkZXM6DQoNCiAg4oCiIDp3
aW5kb3c6ICpXaW5kb3dzIHN1cHBvcnQqOiBHcmFjZSBub3cgd29ya3Mgb24gV2luZG93cywgYQ0K
ICAgIGxvbmctYXdhaXRlZCBmZWF0dXJlIHNpbmNlIGl0cyAwLjEuMCByZWxlYXNlISA6cm9ja2V0
Og0KICDigKIgOmtleWJvYXJkOiAqVFRZIGF1dG8tZGV0ZWN0aW9uKjogYEdyYWNlX2Fuc2lfcmVu
ZGVyZXInIGNhbiBub3cNCiAgICBhdXRvbWF0aWNhbGx5IGNvbmZpZ3VyZSBpdHNlbGYgYmFzZWQg
b24gd2hldGhlciB0aGUgb3V0cHV0IGNoYW5uZWwNCiAgICBpcyBhIFRUWS4gIE5ldyBmdW5jdGlv
bnM6IGBwcl9kaWFnbm9zdGljJywgYGVwcl9kaWFnbm9zdGljJywgYW5kDQogICAgYG91dHB1dF9k
aWFnbm9zdGljJy4NCiAg4oCiIDplbGVwaGFudDogKkxpbmUgZWxpc2lvbio6IGBHcmFjZV9hbnNp
X3JlbmRlcmVyJyBub3cgZWxpZGVzDQogICAgdW5uZWNlc3NhcnkgbGluZXMgaW4gZGlhZ25vc3Rp
Y3MsIHByb2R1Y2luZyBtb3JlIGZvY3VzZWQgb3V0cHV0Lg0KICDigKIgOnplcm86ICpaZXJvLXdp
ZHRoIHJhbmdlcyo6IGBHcmFjZV9hbnNpX3JlbmRlcmVyJyBjYW4gbm93IGhhbmRsZQ0KICAgIHpl
cm8td2lkdGggcmFuZ2VzIHdpdGhpbiBsaW5lcywgYXMgd2VsbCBhcyBhdCBlbmQtb2YtbGluZSAo
RU9MKSBhbmQNCiAgICBlbmQtb2YtZmlsZSAoRU9GKSBwb3NpdGlvbnMuDQoNCiAgTWFueSB0aGFu
a3MgdG8gQGdpbHRobyBmb3IgdGhlaXIgY29udHJpYnV0aW9ucyB0byB0aGlzIHJlbGVhc2UhDQog
IDpmbGV4ZWRfYmljZXBzOg0KDQoNCltncmFjZSAwLjMuMF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9q
b2hueW9iL2dyYWNlL3JlbGVhc2VzL3RhZy8wLjMuMD4NCg0KW29wYW0tcmVwb3NpdG9yeV0gPGh0
dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtLXJlcG9zaXRvcnkvcHVsbC8yOTM3OT4NCg0KQ0hB
TkdFUw0K4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAg4oCiIGZlYXQocmVuZGVyZXIpOiBhZGQg
YnJlYWtzIGluIGxhcmdlIGRpYWdub3N0aWNzIChbIzYzXSkNCiAg4oCiIGZlYXQocmVuZGVyZXIp
OiBjaGVjayBmb3IgdHR5IHdoZW4gcmVuZGVyaW5nIChbIzYwXSkNCiAg4oCiIGZpeChyZW5kZXJl
cik6IG9mZi1ieS1vbmUgaW4gYGxpbmVzX29mX2xhYmVscycgKFsjNjVdKQ0KICDigKIgZml4KHJl
bmRlcmVyKTogY3JlYXRlIDAtc2l6ZWQgc2VnbWVudCBvbiBlbXB0eSBsYWJlbCByYW5nZSAoWyM2
NF0pDQogIOKAoiBmaXgocmVuZGVyZXIpOiByZW5kZXJlciBtdWx0aS1saW5lIGxhYmVscyB3aGVu
IG1lc3NhZ2UgaXMgZW1wdHkNCiAgICAoWyM1M10pDQogIOKAoiBmaXgocmVuZGVyZXIpOiBmaXgg
ZXJyb3JzIHRoYXQgb2NjdXIgd2l0aCBzcGVjaWFsIHplcm8td2lkdGgNCiAgICBzZWdtZW50cyAo
WyM0MV0pDQogIOKAoiBmaXgocmVuZGVyZXIpOiB1c2UgYEZvcm1hdC5wcF9pbmZpbml0eScgaW4g
YE1lc3NhZ2UudG9fc3RyaW5nJyBmb3INCiAgICBPQ2FtbCA+NS4yIChbIzQwXSkNCiAg4oCiIHJl
ZmFjdG9yITogcmVtb3ZlcyBiYXNlL2NvcmUgZGVwZW5kZW5jeSAoWyM1OF0pDQoNCg0KWyM2M10g
PGh0dHBzOi8vZ2l0aHViLmNvbS9qb2hueW9iL2dyYWNlL3B1bGwvNjM+DQoNClsjNjBdIDxodHRw
czovL2dpdGh1Yi5jb20vam9obnlvYi9ncmFjZS9wdWxsLzYwPg0KDQpbIzY1XSA8aHR0cHM6Ly9n
aXRodWIuY29tL2pvaG55b2IvZ3JhY2UvcHVsbC82NT4NCg0KWyM2NF0gPGh0dHBzOi8vZ2l0aHVi
LmNvbS9qb2hueW9iL2dyYWNlL3B1bGwvNjQ+DQoNClsjNTNdIDxodHRwczovL2dpdGh1Yi5jb20v
am9obnlvYi9ncmFjZS9wdWxsLzUzPg0KDQpbIzQxXSA8aHR0cHM6Ly9naXRodWIuY29tL2pvaG55
b2IvZ3JhY2UvcHVsbC80MT4NCg0KWyM0MF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9qb2hueW9iL2dy
YWNlL3B1bGwvNDA+DQoNClsjNThdIDxodHRwczovL2dpdGh1Yi5jb20vam9obnlvYi9ncmFjZS9w
dWxsLzU4Pg0KDQoNCkJSRUFLSU5HIENIQU5HRQ0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM
4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAg4oCiIE1hbnkgYmFzZS9jb3JlIGludGVyZmFjZXMgZnJv
bSBgR3JhY2UnIGhhdmUgYmVlbiByZXBsYWNlZCB3aXRoDQogICAgY3VzdG9tIG9uZXMuDQogIOKA
oiBgU291cmNlLnJlYWRlcicgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIGBTb3VyY2UuUmVhZGVyLnQn
IGluc3RlYWQuDQoNCg0KSnNfb2Zfb2NhbWwgLyBXYXNtX29mX29jYW1sIDYuMw0K4pWQ4pWQ4pWQ
4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ
4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlz
Y3Vzcy5vY2FtbC5vcmcvdC9hbm4tanMtb2Ytb2NhbWwtd2FzbS1vZi1vY2FtbC02LTMvMTc4MzQv
MT4NCg0KDQpKw6lyw7RtZSBWb3VpbGxvbiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKU
gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0K
DQogIEknbSBwbGVhc2VkIHRvIGFubm91bmNlIHRoZSBqb2ludCByZWxlYXNlIG9mIGpzX29mX29j
YW1sIGFuZA0KICB3YXNtX29mX29jYW1sIDYuMy4NCg0KICBKc19vZl9vY2FtbCBpcyBhIGNvbXBp
bGVyIGZyb20gT0NhbWwgYnl0ZWNvZGUgdG8gSmF2YVNjcmlwdC4gSXQgbWFrZXMNCiAgaXQgcG9z
c2libGUgdG8gcnVuIHB1cmUgT0NhbWwgcHJvZ3JhbXMgaW4gSmF2YVNjcmlwdCBlbnZpcm9ubWVu
dCBsaWtlDQogIGJyb3dzZXJzIGFuZCBOb2RlLmpzLg0KDQogIFdhc21fb2Zfb2NhbWwgaXMgYSBj
b21waWxlciBmcm9tIE9DYW1sIGJ5dGVjb2RlIHRvIFdlYkFzc2VtYmx5LiBJdCBpcw0KICBoaWdo
bHkgY29tcGF0aWJsZSB3aXRoIEpzX29mX29jYW1sLCBzbyB5b3UgY2FuIGNvbXBpbGUgeW91ciBw
cm9ncmFtcw0KICB3aXRoIHdhc21fb2Zfb2NhbWwgaW5zdGVhZCBvZiBqc19vZl9vY2FtbCBhbmQg
ZXhwZXJpZW5jZSBvdmVyYWxsDQogIGJldHRlciBwZXJmb3JtYW5jZS4NCg0KICBNb3N0IHNpZ25p
ZmljYW50IGNoYW5nZXMgKHNpbmNlIDYuMSk6DQoNCiAg4oCiICpOdW1iZXIgdW5ib3hpbmcgZm9y
IHdhc21fb2Zfb2NhbWwqOiBhIHR5cGUgYW5hbHlzaXMgcGFzcyBub3cgdHJhY2tzDQogICAgIHdo
aWNoIHZhbHVlcyBhcmUgZmxvYXRzLCBpbnRlZ2Vycywgb3IgbmF0aXZlaW50cywgZW5hYmxpbmcg
dGhlDQogICAgIGNvbXBpbGVyIHRvIHVuYm94IHRoZW0gYW5kIHVzZSBuYXRpdmUgV2FzbSBpbnN0
cnVjdGlvbnMNCiAgICAgZGlyZWN0bHkuIFRoaXMgYWxzbyBlbmFibGVzIHNwZWNpYWxpc2F0aW9u
IG9mIG51bWJlciBjb21wYXJpc29ucw0KICAgICBhbmQgYmlnYXJyYXkgb3BlcmF0aW9ucywgYXZv
aWRpbmcgY29zdGx5IGdlbmVyaWMgcnVudGltZSBjYWxscy4NCiAg4oCiICpDb25zdGFudCBzaW5r
aW5nIGZvciBqc19vZl9vY2FtbCo6IGEgbmV3IG9wdGltaXNhdGlvbiBwYXNzIG1vdmVzDQogICAg
IGNvbnN0YW50cyBjbG9zZXIgdG8gdGhlaXIgdXNlIHNpdGVzLCByZWR1Y2luZyByZWdpc3Rlcg0K
ICAgICBwcmVzc3VyZS4gTWFueSBjb25zdGFudHMgZW5kIHVwIGlubGluZWQsIHJlc3VsdGluZyBp
biBzbWFsbGVyIGNvZGUNCiAgICAgc2l6ZS4NCiAg4oCiICpKUyBwYXJzZXIgaW1wcm92ZW1lbnRz
Kjogc3VwcG9ydCBmb3IgaW1wb3J0L2V4cG9ydCBhdHRyaWJ1dGVzLA0KICAgICBkZWNvcmF0b3Jz
LCBgdXNpbmcnIGRlY2xhcmF0aW9ucyAocmVzb3VyY2UgbWFuYWdlbWVudCksIGFuZCBIVE1MDQog
ICAgIGNvbW1lbnRzLg0KICDigKIgTWFueSBidWcgZml4ZXMgYWNyb3NzIHRoZSBjb21waWxlciwg
cnVudGltZSwgbGlicmFyeSBiaW5kaW5ncywgYW5kDQogICAgUFBYLg0KDQogIFNlZSB0aGUgW0No
YW5nZWxvZ10gZm9yIHRoZSBmdWxsIGxpc3Qgb2YgY2hhbmdlcy4NCg0KDQpbQ2hhbmdlbG9nXQ0K
PGh0dHBzOi8vZ2l0aHViLmNvbS9vY3NpZ2VuL2pzX29mX29jYW1sL2Jsb2IvbWFzdGVyL0NIQU5H
RVMubWQ+DQoNCg0Ka3F1ZXVlLW1sIDAuNS4wDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDi
lZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOiA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9y
Zy90L2Fubi1rcXVldWUtbWwtMC01LTAvMTc4MzUvMT4NCg0KDQpBbnVyYWcgU29uaSBhbm5vdW5j
ZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU
gOKUgOKUgOKUgA0KDQogIEhpLA0KDQogIEknZCBsaWtlIHRvIGFubm91bmNlIGEgbmV3IHJlbGVh
c2UgZm9yIFtrcXVldWUtbWwgdmVyc2lvbiAwLjUuMF0NCg0KICAqS3F1ZXVlLW1sOiogVGhpbiBi
aW5kaW5ncyB0byBrcXVldWUgZXZlbnQgbm90aWZpY2F0aW9uIHN5c3RlbS4NCg0KICBDaGFuZ2Vz
IHNpbmNlIHRoZSBsYXN0IHJlbGVhc2U6DQoNCiAg4oCiIE1vdmVkIGRldmVsb3BtZW50IHRvIFtj
b2RlYmVyZ10NCiAg4oCiIFJlbW92ZSBkZXBlbmRlbmNpZXMgb24gYHBweF9vcHRjb21wJyBhbmQg
YHBweF9leHBlY3QnIChEZXBlbmRlbmNpZXMNCiAgICBhcmUgbGltaXRlZCB0byB0aGUgb2NhbWwg
c3RhbmRhcmQgbGlicmFyeSBhbmQgZHVuZSkNCg0KICBCZXN0LCBBbnVyYWcNCg0KDQpba3F1ZXVl
LW1sIHZlcnNpb24gMC41LjBdDQo8aHR0cHM6Ly9vcGFtLm9jYW1sLm9yZy9wYWNrYWdlcy9rcXVl
dWUva3F1ZXVlLjAuNS4wLz4NCg0KW2NvZGViZXJnXSA8aHR0cHM6Ly9jb2RlYmVyZy5vcmcvYW51
cmFnc29uaS9rcXVldWUtbWwvPg0KDQoNCkR1bmUgMy4yMS4wDQrilZDilZDilZDilZDilZDilZDi
lZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOiA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90
L2Fubi1kdW5lLTMtMjEtMC8xNzcwMC8yPg0KDQoNCkNvbnRpbnVpbmcgdGhpcyB0aHJlYWQsIFNo
b24gYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi
lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi
lIDilIDilIDilIDilIANCg0KICBUaGUgRHVuZSB0ZWFtIGFubm91bmNlcyBbdGhlIHJlbGVhc2Ug
b2YgZHVuZSAzLjIxLjFdLg0KDQogIFRoaXMgaXMgYSBzbWFsbCBwYXRjaCByZWxlYXNlIGNvbnNp
c3Rpbmcgb2YgYSBmZXcgYnVnIGZpeGVzLiBTZWUgW3RoZQ0KICBmdWxsIGNoYW5nZWxvZ10gZm9y
IGFsbCB0aGUgY2hhbmdlcy4NCg0KICBJZiB5b3UgZW5jb3VudGVyIGEgcHJvYmxlbSB3aXRoIHRo
aXMgcmVsZWFzZSwgcGxlYXNlIHJlcG9ydCBpdCBpbiBbb3VyDQogIGlzc3VlIHRyYWNrZXJdLg0K
DQoNClt0aGUgcmVsZWFzZSBvZiBkdW5lIDMuMjEuMV0NCjxodHRwczovL2dpdGh1Yi5jb20vb2Nh
bWwvZHVuZS9yZWxlYXNlcy90YWcvMy4yMS4xPg0KDQpbdGhlIGZ1bGwgY2hhbmdlbG9nXSA8aHR0
cHM6Ly9naXRodWIuY29tL29jYW1sL2R1bmUvcmVsZWFzZXMvdGFnLzMuMjEuMT4NCg0KW291ciBp
c3N1ZSB0cmFja2VyXSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL2R1bmUvaXNzdWVzPg0KDQoN
Ck90aGVyIE9DYW1sIE5ld3MNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV
kOKVkOKVkOKVkA0KDQpGcm9tIHRoZSBvY2FtbC5vcmcgYmxvZw0K4pSA4pSA4pSA4pSA4pSA4pSA
4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAg
SGVyZSBhcmUgbGlua3MgZnJvbSBtYW55IE9DYW1sIGJsb2dzIGFnZ3JlZ2F0ZWQgYXQgW3RoZSBv
Y2FtbC5vcmcNCiAgYmxvZ10uDQoNCiAg4oCiIFtBdCB0aGUgQUkgSW1wYWN0IFN1bW1pdCBpbiBE
ZWxoaTogcGVvcGxlLCBwbGFuZXQsIHByb2dyZXNzXQ0KICDigKIgW09CdWlsZGVyIG9uIFdpbmRv
d3M6IEJyaW5naW5nIE5hdGl2ZSBDb250YWluZXIgQnVpbGRzIHdpdGggdGhlIEhDUw0KICAgIEJh
Y2tlbmRdDQogIOKAoiBbMXN0IFRFU1NFUkEvQ29SRSBoYWNrYXRob24gYXQgdGhlIEluZGlhbiBB
SSBTdW1taXRdDQoNCg0KW3RoZSBvY2FtbC5vcmcgYmxvZ10gPGh0dHBzOi8vb2NhbWwub3JnL2Js
b2cvPg0KDQpbQXQgdGhlIEFJIEltcGFjdCBTdW1taXQgaW4gRGVsaGk6IHBlb3BsZSwgcGxhbmV0
LCBwcm9ncmVzc10NCjxodHRwczovL2FuaWwucmVjb2lsLm9yZy9ub3Rlcy9pbmRpYS1haS1zdW1t
aXQ+DQoNCltPQnVpbGRlciBvbiBXaW5kb3dzOiBCcmluZ2luZyBOYXRpdmUgQ29udGFpbmVyIEJ1
aWxkcyB3aXRoIHRoZSBIQ1MNCkJhY2tlbmRdIDxodHRwczovL3d3dy50dW5idXJ5Lm9yZy8yMDI2
LzAyLzE5L29idWlsZGVyLWhjcy8+DQoNClsxc3QgVEVTU0VSQS9Db1JFIGhhY2thdGhvbiBhdCB0
aGUgSW5kaWFuIEFJIFN1bW1pdF0NCjxodHRwczovL2FuaWwucmVjb2lsLm9yZy9ub3Rlcy9maXJz
dC10ZXNzZXJhLWhhY2thdGhvbj4NCg0KDQpPbGQgQ1dODQrilZDilZDilZDilZDilZDilZDilZAN
Cg0KICBJZiB5b3UgaGFwcGVuIHRvIG1pc3MgYSBDV04sIHlvdSBjYW4gW3NlbmQgbWUgYSBtZXNz
YWdlXSBhbmQgSSdsbCBtYWlsDQogIGl0IHRvIHlvdSwgb3IgZ28gdGFrZSBhIGxvb2sgYXQgW3Ro
ZSBhcmNoaXZlXSBvciB0aGUgW1JTUyBmZWVkIG9mIHRoZQ0KICBhcmNoaXZlc10uDQoNCiAgSWYg
eW91IGFsc28gd2lzaCB0byByZWNlaXZlIGl0IGV2ZXJ5IHdlZWsgYnkgbWFpbCwgeW91IG1heSBz
dWJzY3JpYmUNCiAgdG8gdGhlIFtjYW1sLWxpc3RdLg0KDQogIFtBbGFuIFNjaG1pdHRdDQoNCg0K
W3NlbmQgbWUgYSBtZXNzYWdlXSA8bWFpbHRvOmFsYW4uc2NobWl0dEBwb2x5dGVjaG5pcXVlLm9y
Zz4NCg0KW3RoZSBhcmNoaXZlXSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vPg0K
DQpbUlNTIGZlZWQgb2YgdGhlIGFyY2hpdmVzXSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5l
dC9jd24vY3duLnJzcz4NCg0KW2NhbWwtbGlzdF0gPGh0dHBzOi8vc3ltcGEuaW5yaWEuZnIvc3lt
cGEvaW5mby9jYW1sLWxpc3Q+DQoNCltBbGFuIFNjaG1pdHRdIDxodHRwczovL2FsYW4ucGV0aXRl
cG9tbWUubmV0Lz4NCg0K
--=-=-=
Content-Type: text/html; charset=utf-8
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable
<?xml version=3D"1.0" encoding=3D"utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns=3D"http://www.w3.org/1999/xhtml" lang=3D"en" xml:lang=3D"en">
<head>
<!-- 2026-02-24 Tue 14:36 -->
<meta http-equiv=3D"Content-Type" content=3D"text/html;charset=3Dutf-8" />
<meta name=3D"viewport" content=3D"width=3Ddevice-width, initial-scale=3D1"=
/>
<title>OCaml Weekly News</title>
<meta name=3D"generator" content=3D"Org Mode" />
<style type=3D"text/css">
#content { max-width: 60em; margin: auto; }
.title { text-align: center;
margin-bottom: .2em; }
.subtitle { text-align: center;
font-size: medium;
font-weight: bold;
margin-top:0; }
.todo { font-family: monospace; color: red; }
.done { font-family: monospace; color: green; }
.priority { font-family: monospace; color: orange; }
.tag { background-color: #eee; font-family: monospace;
padding: 2px; font-size: 80%; font-weight: normal; }
.timestamp { color: #bebebe; }
.timestamp-kwd { color: #5f9ea0; }
.org-right { margin-left: auto; margin-right: 0px; text-align: right; }
.org-left { margin-left: 0px; margin-right: auto; text-align: left; }
.org-center { margin-left: auto; margin-right: auto; text-align: center; }
.underline { text-decoration: underline; }
#postamble p, #preamble p { font-size: 90%; margin: .2em; }
p.verse { margin-left: 3%; }
pre {
border: 1px solid #e6e6e6;
border-radius: 3px;
background-color: #f2f2f2;
padding: 8pt;
font-family: monospace;
overflow: auto;
margin: 1.2em;
}
pre.src {
position: relative;
overflow: auto;
}
pre.src:before {
display: none;
position: absolute;
top: -8px;
right: 12px;
padding: 3px;
color: #555;
background-color: #f2f2f299;
}
pre.src:hover:before { display: inline; margin-top: 14px;}
/* Languages per Org manual */
pre.src-asymptote:before { content: 'Asymptote'; }
pre.src-awk:before { content: 'Awk'; }
pre.src-authinfo::before { content: 'Authinfo'; }
pre.src-c:before { content: 'C'; }
pre.src-C:before { content: 'C'; }
/* pre.src-C++ doesn't work in CSS */
pre.src-clojure:before { content: 'Clojure'; }
pre.src-css:before { content: 'CSS'; }
pre.src-D:before { content: 'D'; }
pre.src-ditaa:before { content: 'ditaa'; }
pre.src-dot:before { content: 'Graphviz'; }
pre.src-calc:before { content: 'Emacs Calc'; }
pre.src-emacs-lisp:before { content: 'Emacs Lisp'; }
pre.src-fortran:before { content: 'Fortran'; }
pre.src-gnuplot:before { content: 'gnuplot'; }
pre.src-haskell:before { content: 'Haskell'; }
pre.src-hledger:before { content: 'hledger'; }
pre.src-java:before { content: 'Java'; }
pre.src-js:before { content: 'JavaScript'; }
pre.src-latex:before { content: 'LaTeX'; }
pre.src-ledger:before { content: 'Ledger'; }
pre.src-lisp:before { content: 'Lisp'; }
pre.src-lilypond:before { content: 'Lilypond'; }
pre.src-lua:before { content: 'Lua'; }
pre.src-matlab:before { content: 'MATLAB'; }
pre.src-mscgen:before { content: 'Mscgen'; }
pre.src-ocaml:before { content: 'Objective Caml'; }
pre.src-octave:before { content: 'Octave'; }
pre.src-org:before { content: 'Org mode'; }
pre.src-oz:before { content: 'OZ'; }
pre.src-plantuml:before { content: 'Plantuml'; }
pre.src-processing:before { content: 'Processing.js'; }
pre.src-python:before { content: 'Python'; }
pre.src-R:before { content: 'R'; }
pre.src-ruby:before { content: 'Ruby'; }
pre.src-sass:before { content: 'Sass'; }
pre.src-scheme:before { content: 'Scheme'; }
pre.src-screen:before { content: 'Gnu Screen'; }
pre.src-sed:before { content: 'Sed'; }
pre.src-sh:before { content: 'shell'; }
pre.src-sql:before { content: 'SQL'; }
pre.src-sqlite:before { content: 'SQLite'; }
/* additional languages in org.el's org-babel-load-languages alist */
pre.src-forth:before { content: 'Forth'; }
pre.src-io:before { content: 'IO'; }
pre.src-J:before { content: 'J'; }
pre.src-makefile:before { content: 'Makefile'; }
pre.src-maxima:before { content: 'Maxima'; }
pre.src-perl:before { content: 'Perl'; }
pre.src-picolisp:before { content: 'Pico Lisp'; }
pre.src-scala:before { content: 'Scala'; }
pre.src-shell:before { content: 'Shell Script'; }
pre.src-ebnf2ps:before { content: 'ebfn2ps'; }
/* additional language identifiers per "defun org-babel-execute"
in ob-*.el */
pre.src-cpp:before { content: 'C++'; }
pre.src-abc:before { content: 'ABC'; }
pre.src-coq:before { content: 'Coq'; }
pre.src-groovy:before { content: 'Groovy'; }
/* additional language identifiers from org-babel-shell-names in
ob-shell.el: ob-shell is the only babel language using a lambda to put
the execution function name together. */
pre.src-bash:before { content: 'bash'; }
pre.src-csh:before { content: 'csh'; }
pre.src-ash:before { content: 'ash'; }
pre.src-dash:before { content: 'dash'; }
pre.src-ksh:before { content: 'ksh'; }
pre.src-mksh:before { content: 'mksh'; }
pre.src-posh:before { content: 'posh'; }
/* Additional Emacs modes also supported by the LaTeX listings package */
pre.src-ada:before { content: 'Ada'; }
pre.src-asm:before { content: 'Assembler'; }
pre.src-caml:before { content: 'Caml'; }
pre.src-delphi:before { content: 'Delphi'; }
pre.src-html:before { content: 'HTML'; }
pre.src-idl:before { content: 'IDL'; }
pre.src-mercury:before { content: 'Mercury'; }
pre.src-metapost:before { content: 'MetaPost'; }
pre.src-modula-2:before { content: 'Modula-2'; }
pre.src-pascal:before { content: 'Pascal'; }
pre.src-ps:before { content: 'PostScript'; }
pre.src-prolog:before { content: 'Prolog'; }
pre.src-simula:before { content: 'Simula'; }
pre.src-tcl:before { content: 'tcl'; }
pre.src-tex:before { content: 'TeX'; }
pre.src-plain-tex:before { content: 'Plain TeX'; }
pre.src-verilog:before { content: 'Verilog'; }
pre.src-vhdl:before { content: 'VHDL'; }
pre.src-xml:before { content: 'XML'; }
pre.src-nxml:before { content: 'XML'; }
/* add a generic configuration mode; LaTeX export needs an additional
(add-to-list 'org-latex-listings-langs '(conf " ")) in .emacs */
pre.src-conf:before { content: 'Configuration File'; }
table { border-collapse:collapse; }
caption.t-above { caption-side: top; }
caption.t-bottom { caption-side: bottom; }
td, th { vertical-align:top; }
th.org-right { text-align: center; }
th.org-left { text-align: center; }
th.org-center { text-align: center; }
td.org-right { text-align: right; }
td.org-left { text-align: left; }
td.org-center { text-align: center; }
dt { font-weight: bold; }
.footpara { display: inline; }
.footdef { margin-bottom: 1em; }
.figure { padding: 1em; }
.figure p { text-align: center; }
.equation-container {
display: table;
text-align: center;
width: 100%;
}
.equation {
vertical-align: middle;
}
.equation-label {
display: table-cell;
text-align: right;
vertical-align: middle;
}
.inlinetask {
padding: 10px;
border: 2px solid gray;
margin: 10px;
background: #ffffcc;
}
#org-div-home-and-up
{ text-align: right; font-size: 70%; white-space: nowrap; }
textarea { overflow-x: auto; }
.linenr { font-size: smaller }
.code-highlighted { background-color: #ffff00; }
.org-info-js_info-navigation { border-style: none; }
#org-info-js_console-label
{ font-size: 10px; font-weight: bold; white-space: nowrap; }
.org-info-js_search-highlight
{ background-color: #ffff00; color: #000000; font-weight: bold; }
.org-svg { }
</style>
<style type=3D"text/css">#table-of-contents h2 { display: none } .title { d=
isplay: none } .authorname { text-align: right }</style>
<style type=3D"text/css">.outline-2 {border-top: 1px solid black;}</style>
</head>
<body>
<div id=3D"content" class=3D"content">
<h1 class=3D"title">OCaml Weekly News</h1>
<p>
<a href=3D"https://alan.petitepomme.net/cwn/2026.02.17.html">Previous Week<=
/a> <a href=3D"https://alan.petitepomme.net/cwn/index.html">Up</a> <a href=
=3D"https://alan.petitepomme.net/cwn/2026.03.03.html">Next Week</a>
</p>
<p>
Hello
</p>
<p>
Here is the latest OCaml Weekly News, for the week of February 17 to 24, 20=
26.
</p>
<div id=3D"table-of-contents" role=3D"doc-toc">
<h2>Table of Contents</h2>
<div id=3D"text-table-of-contents" role=3D"doc-toc">
<ul>
<li><a href=3D"#1">OSEC-2026-01 in the OCaml runtime: Buffer Over-Read in O=
Caml Marshal Deserialization</a></li>
<li><a href=3D"#2">OCaml 5.4.1 and 4.14.3 released</a></li>
<li><a href=3D"#3">Ann: Ochat =E2=80=94 Try Ochat for terminal-based LLM wo=
rkflows</a></li>
<li><a href=3D"#4">Serialport - new serial communication library</a></li>
<li><a href=3D"#5">Slipshow!</a></li>
<li><a href=3D"#6">Remote OCaml Distributed Systems Engineer (Linux / Stora=
ge / Networking) =E2=80=93 whitesky.cloud =E2=80=93 EMEA/Asia</a></li>
<li><a href=3D"#7">Grace 0.3.0 =F0=9F=92=85, fancy diagnostics library for =
compilers</a></li>
<li><a href=3D"#8">Js_of_ocaml / Wasm_of_ocaml 6.3</a></li>
<li><a href=3D"#9">kqueue-ml 0.5.0</a></li>
<li><a href=3D"#10">Dune 3.21.0</a></li>
<li><a href=3D"#11">Other OCaml News</a></li>
<li><a href=3D"#org2a646da">Old CWN</a></li>
</ul>
</div>
</div>
<div id=3D"outline-container-1" class=3D"outline-2">
<h2 id=3D"1">OSEC-2026-01 in the OCaml runtime: Buffer Over-Read in OCaml M=
arshal Deserialization</h2>
<div class=3D"outline-text-2" id=3D"text-1">
<p>
Archive: <a href=3D"https://inbox.ci.dev/caml-list/c3298309-a06d-4ac8-874c-=
[email protected]/T/">https://inbox.ci.dev/caml-list/c3298309-a06d-4=
[email protected]/T/</a>
</p>
</div>
<div id=3D"outline-container-org0fe7c1d" class=3D"outline-3">
<h3 id=3D"org0fe7c1d">Hannes Mehnert announced</h3>
<div class=3D"outline-text-3" id=3D"text-org0fe7c1d">
<p>
Dear everyone,
</p>
<p>
it is my pleasure to announce the first security announcement of this=20
year, and the first coordinated by the new OCaml security response team=20
(<a href=3D"https://ocaml.org/security">https://ocaml.org/security</a>).
</p>
<p>
Please subscribe to the OCaml security announcement mailing list=20
(<a href=3D"https://sympa.inria.fr/sympa/info/ocsf-ocaml-security-announcem=
ents">https://sympa.inria.fr/sympa/info/ocsf-ocaml-security-announcements</=
a>) to=20
receive all security advisories. To this mailing list I'll only copy=20
those affecting the core of OCaml distribution.
</p>
<p>
It should any moment now also appear at <a href=3D"https://osv.dev/list?q=
=3DOSEC-2026-01">https://osv.dev/list?q=3DOSEC-2026-01</a>
</p>
<p>
Human link:=20
<a href=3D"https://github.com/ocaml/security-advisories/tree/main/advisorie=
s/2026/OSEC-2026-01.md">https://github.com/ocaml/security-advisories/tree/m=
ain/advisories/2026/OSEC-2026-01.md</a>
</p>
<pre class=3D"example" id=3D"org71b2a0c">
id: OSEC-2026-01
modified: "2026-02-17T13:30:00Z"
published: "2026-02-17T13:30:00Z"
aliases: [ GHSA-j26j-m5xr-g23c GHSA-m34r-cgq7-jhfm ]
severity: "CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:U/C:H/I:L/A:N"
severity_score: "6.8"
affected: "ocaml" {< "4.14.3" | (>=3D "5" & < "5.4.1")}
events: [
[
git "https://github.com/ocaml/ocaml" [
[fixed "b0a2614684a52acded784ec213f14ddfe085d146"]
]
]
[
git "https://github.com/ocaml/ocaml" [
[fixed "e3919fef436f89271bc30bbe8592851f7289fb68"]
]
]
]
references: [
[report=20
"https://github.com/ocaml/security-advisories/security/advisories/GHSA-j26j=
-m5xr-g23c"]
]
credits: [
[reporter "Justin Timperio"]
[remediation_developer "Nicol=C3=A1s Ojeda B=C3=A4r"]
[remediation_developer "Xavier Leroy"]
[remediation_developer "Gabriel Scherer"]
[remediation_reviewer "Xavier Leroy"]
[remediation_reviewer "Olivier Nicole"]
[remediation_verifier "Mindy Preston"]
[remediation_verifier "Edwin T=C3=B6r=C3=B6k"]
[coordinator "Hannes Mehnert"]
]
cwe: [ CWE-126 CWE-502 CWE-754 ]
</pre>
<p>
<b>Buffer Over-Read in OCaml Marshal Deserialization</b>
</p>
</div>
<div id=3D"outline-container-org185da0d" class=3D"outline-4">
<h4 id=3D"org185da0d">Summary</h4>
<div class=3D"outline-text-4" id=3D"text-org185da0d">
<p>
A critical buffer over-read vulnerability in OCaml's Marshal=20
deserialization (runtime/intern.c) enables remote code execution through=20
a multi-phase attack chain. The vulnerability stems from missing bounds=20
validation in the readblock() function, which performs unbounded=20
memcpy() operations using attacker-controlled lengths from malicious=20
Marshal data.
</p>
<p>
Please note that Marshal is not type safe, and you have to be careful if=20
you use the deserialization on untrusted input (due to type confusion,=20
and remote code execution by design - you can use Marshal for code).
</p>
<p>
Affected functions: <code>Marshal.from_channel</code>, <code>Marshal.from_b=
ytes</code>,=20
<code>Marshal.from_string</code>, <code>Stdlib.input_value</code>, <code>Pe=
rvasives.input_value</code>=20
when reading data from an untrusted source.
</p>
</div>
</div>
<div id=3D"outline-container-org64f3ac5" class=3D"outline-4">
<h4 id=3D"org64f3ac5">Vulnerability Attack Vector</h4>
<div class=3D"outline-text-4" id=3D"text-org64f3ac5">
<p>
Corrupted or malicious marshaled data that causes undefined behaviour in=20
the runtime system when unmarshaled.
<code>input_value</code> should either fail cleanly or produce a well-forme=
d OCaml=20
object, without corrupting the runtime system.
</p>
<p>
Consequently, this excludes:
</p>
<ul class=3D"org-ul">
<li>well-formed marshaled data that produces an OCaml object that is not of=
the type expected by the OCaml code and causes the Ocaml code to crash or =
misbehave</li>
<li>misuses of the OCaml runtime system by the program performing input_val=
ue, such as setting <code>Debugger.function_placeholder</code> to the wrong=
function.</li>
</ul>
<p>
The former issue may be addressed at some point by validating the=20
unmarshaled OCaml value against the expected type, using the functions=20
from module <code>Obj</code> and some kind of run-time type description.
</p>
<p>
The latter issue is a bug in the program that unmarshals the data.
</p>
</div>
</div>
<div id=3D"outline-container-org06960e2" class=3D"outline-4">
<h4 id=3D"org06960e2">Fix</h4>
<div class=3D"outline-text-4" id=3D"text-org06960e2">
</div>
<ul class=3D"org-ul">
<li><a id=3D"org7923e27"></a>OCaml runtime<br />
<div class=3D"outline-text-5" id=3D"text-org7923e27">
<p>
The OCaml runtime has been hardened with additional bounds checks. An=20
exception is raised on bad input.
</p>
</div>
</li>
<li><a id=3D"org141312b"></a>Third party libraries<br />
<div class=3D"outline-text-5" id=3D"text-org141312b">
<p>
Third party libraries that want to harden their custom Marshal=20
deserialization code can follow the example fix for bigarrays from the=20
standard library.
There are new macros in <code>custom.h</code> called <code>Wsize_custom_dat=
a</code> and=20
<code>Bsize_custom_data</code> that return the size in words or bytes of th=
e=20
allocated custom destination block. The deserializer needs to ensure it=20
only writes data within those bounds.
</p>
<p>
This only needs to be done if the library defines a custom type in a C=20
binding, and <code>struct custom_operations</code>'s <code>deserialize</cod=
e> field is not set=20
to <code>NULL</code> or <code>custom_deserialize_default</code>, and <code>=
struct=20
custom_operations</code>'s <code>fixed_length</code> field is set to <code>=
NULL</code> or=20
<code>custom_fixed_length_default</code>
</p>
<p>
Since <code>Marshal.from*</code> and <code>input_value</code> remain unsafe=
to use, the fix=20
for the OCaml runtime is released, and we wouldn't attempt to coordinate=20
updating all deserialization functions in the ecosystem.
</p>
</div>
</li>
</ul>
</div>
<div id=3D"outline-container-orgc8c73f5" class=3D"outline-4">
<h4 id=3D"orgc8c73f5">Timeline</h4>
<div class=3D"outline-text-4" id=3D"text-orgc8c73f5">
<ul class=3D"org-ul">
<li>Nov 4th 2025: Discovery Date: Discovered first in OxCaml</li>
<li>Nov 5th 2025: First Disclosure Date (Jane Street Team): Emailed top mai=
ntainers, no response.</li>
<li>Nov 9th 2025: Second Disclosure Date (OCaml Team): Submitted to OCaml/o=
caml GitHub Repo as a Security Advisory.</li>
<li>Nov 11th 2025: Emailed OCaml Security Mail List: Submitted to OCaml ove=
r email, responded asking for details.</li>
<li>Nov 11th 2025: Third Disclosure (OCaml Security Response Team): Submitt=
ed to ocaml/security-advisories GitHub Repo as a Security Advisory.</li>
<li>Dec 16th 2025: Initial patch is developed</li>
<li>Dec 17th 2025: Fuzz testing found further issues</li>
<li>Dec 24th 2025: Final patch for OCaml is developed</li>
<li>Dec 25th 2025: Fuzz testing couldn't find any further issues</li>
<li>Jan 2nd 2026: Patch got reviewed by OCaml maintainers</li>
<li>Jan 4th 2026: Benchmarking of the patch with good results</li>
<li>Jan 6th 2026: Reporter got contacted to confirm</li>
<li>Jan 25th 2026: Further related issues discovered by fuzzing</li>
<li>Feb 17th 2026: fixed OCaml releases are published, security advisory is=
published</li>
</ul>
</div>
</div>
</div>
</div>
<div id=3D"outline-container-2" class=3D"outline-2">
<h2 id=3D"2">OCaml 5.4.1 and 4.14.3 released</h2>
<div class=3D"outline-text-2" id=3D"text-2">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/ocaml-5-4-1-and-4-14-3-rele=
ased/17822/1">https://discuss.ocaml.org/t/ocaml-5-4-1-and-4-14-3-released/1=
7822/1</a>
</p>
</div>
<div id=3D"outline-container-orgb743a6b" class=3D"outline-3">
<h3 id=3D"orgb743a6b">octachron announced</h3>
<div class=3D"outline-text-3" id=3D"text-orgb743a6b">
<p>
We have the pleasure of announcing the dual releases of OCaml 4.14.3 and OC=
aml 5.4.1, dedicated to the memory of Nicolaas Govert de Bruijn on the anni=
versary of his death.
</p>
<p>
Those releases are a collection of safe and valuable runtime bugfixes.
The OCaml 5.4.1 release also contains a fix for the <code>-pack</code> mode=
for macOs and various TSAN fixes.
</p>
<p>
More importantly, those new versions harden the Marshal module against mali=
cious inputs as described in the security announcement <a href=3D"https://o=
sv.dev/vulnerability/OSEC-2026-01">OSEC-2026-01</a>.
</p>
<p>
We are encouraging you to switch to those new releases whenever possible.
</p>
<p>
Don't hesitate to report any bugs on the <a href=3D"https://github.com/ocam=
l/ocaml/issues">OCaml issue tracker</a>.
</p>
<p>
See the list of changes below for more details.
</p>
<p>
Happy hacking,
– Florian Angeletti for the OCaml team.
</p>
<p>
<b>Installation Instructions</b>
</p>
<p>
The base compilers will be soon installable as an opam switch with the foll=
owing commands:
</p>
<pre class=3D"example" id=3D"org080ba1c">
opam update
opam switch create 4.14.3
opam switch create 5.4.1
</pre>
<p>
The source code for the release candidate is also directly available on:
</p>
<ul class=3D"org-ul">
<li>GitHub:=20
<ul class=3D"org-ul">
<li><a href=3D"https://github.com/ocaml/ocaml/archive/4.14.3.tar.gz">https:=
//github.com/ocaml/ocaml/archive/4.14.3.tar.gz</a></li>
<li><a href=3D"https://github.com/ocaml/ocaml/archive/5.4.1.tar.gz">https:/=
/github.com/ocaml/ocaml/archive/5.4.1.tar.gz</a></li>
</ul></li>
<li>Inria archive:=20
<ul class=3D"org-ul">
<li><a href=3D"https://caml.inria.fr/pub/distrib/ocaml-4.14/ocaml-4.14.3.ta=
r.gz">https://caml.inria.fr/pub/distrib/ocaml-4.14/ocaml-4.14.3.tar.gz</a><=
/li>
<li><a href=3D"https://caml.inria.fr/pub/distrib/ocaml-5.4/ocaml-5.4.1.tar.=
gz">https://caml.inria.fr/pub/distrib/ocaml-5.4/ocaml-5.4.1.tar.gz</a></li>
</ul></li>
</ul>
<p>
<b>OCaml 4.14.3 (17 February 2026)</b>
</p>
<ul class=3D"org-ul">
<li><a href=3D"https://github.com/ocaml/ocaml/issues/12070">#12070</a>, <a =
href=3D"https://github.com/ocaml/ocaml/issues/12075">#12075</a>, <a href=3D=
"https://github.com/ocaml/ocaml/issues/13209">#13209</a>: auto-detect wheth=
er <code>ar</code> support @FILE arguments at
configure-time to avoid using this feature with toolchains that do not supp=
ort
it (eg FreeBSD/Darwin); backport from 5.3.
(backport by Boris Dobroslavov, original fix by Nicol=C3=A1s Ojeda B=C3=A4r=
, review by
Xavier Leroy, David Allsopp, Javier Ch=C3=A1varri, Anil Madhavapeddy)</li>
<li><a href=3D"https://github.com/ocaml/ocaml/issues/12207">#12207</a>, <a =
href=3D"https://github.com/ocaml/ocaml/issues/12222">#12222</a>: Make closu=
re computation linear in the number of recursive
functions instead of quadratic
(Vincent Laviron, report by Fran=C3=A7ois Pottier, review by Nathana=C3=ABl=
le Courant
and Gabriel Scherer)</li>
<li><a href=3D"https://github.com/ocaml/ocaml/issues/13430">#13430</a>, <a =
href=3D"https://github.com/ocaml/ocaml/issues/13434">#13434</a>: protect me=
mory-safety on Lazy.force races
(Gabriel Scherer and Vincent Laviron, report by Edwin T=C3=B6r=C3=B6k,
review by Vincent Laviron)</li>
<li><a href=3D"https://github.com/ocaml/ocaml/issues/13448">#13448</a>, <a =
href=3D"https://github.com/ocaml/ocaml/issues/13449">#13449</a>: fix a code=
-generation bug on unsafe array accesses
at type int32, int64, nativeint, which has been introduced in OCaml 4.04.
(Gabriel Scherer, review by Nicol=C3=A1s Ojeda B=C3=A4r and Vincent Laviron,
report by Simon Cruanes)</li>
<li><a href=3D"https://github.com/ocaml/ocaml/issues/13516">#13516</a>: Fix=
regression where error conditions during bytecode initialisation
caused a segmentation fault rather than being properly reported (regression=
of
<a href=3D"https://github.com/ocaml/ocaml/issues/5115">#5115</a> in <a href=
=3D"https://github.com/ocaml/ocaml/issues/11788">#11788</a>)
(David Allsopp, review by Nicol=C3=A1s Ojeda B=C3=A4r)</li>
<li><a href=3D"https://github.com/ocaml/ocaml/issues/13847">#13847</a>: On =
Windows, maintain a number of threads waiting on the master lock to
avoid unnecessary context switches
(Dmitry Bely, review by Antonin D=C3=A9cimo)</li>
<li><a href=3D"https://github.com/ocaml/ocaml/issues/14007">#14007</a>, <a =
href=3D"https://github.com/ocaml/ocaml/issues/14015">#14015</a>: Fix memory=
corruption when an exception is raised during
demarshaling.
(Beno=C3=AEt Vaugon, review by David Allsopp and Gabriel Scherer)</li>
<li><a href=3D"https://osv.dev/vulnerability/OSEC-2026-01">OSEC-2026-01</a>=
: robustify intern.c
(Xavier Leroy, review by Damien Doligez and Olivier Nicole)</li>
</ul>
<p>
<b>OCaml 5.4.1 (17 February 2026)</b>
</p>
</div>
<div id=3D"outline-container-org01e3f81" class=3D"outline-4">
<h4 id=3D"org01e3f81">Bug fixes:</h4>
<div class=3D"outline-text-4" id=3D"text-org01e3f81">
<ul class=3D"org-ul">
<li><a href=3D"https://github.com/ocaml/ocaml/issues/14010">#14010</a>: Fix=
miscompilation / liveness errors for string operations
(Mark Shinwell, Xavier Clerc, review by Xavier Leroy and Gabriel Scherer)</=
li>
<li><a href=3D"https://github.com/ocaml/ocaml/issues/14065">#14065</a>: Fix=
function signature mismatch of <code>__tsan_func_exit</code> with GCC 15.
Check in the configure step if the TSan provided internal builtins are the
same as what we expect, introduce <code>caml_tsan_*</code> wrappers for the=
<code>__tsan_*</code>
functions we use.
(Hari Hara Naveen S, report by Hari Hara Naveen S,
review by Gabriel Scherer, Antonin D=C3=A9cimo, Olivier Nicole)</li>
<li><a href=3D"https://github.com/ocaml/ocaml/issues/14417">#14417</a>: Fix=
issue with nested packs on macOS.
(Vincent Laviron, report by Kate Deplaix, review by Gabriel Scherer)</li>
<li><a href=3D"https://github.com/ocaml/ocaml/issues/14213">#14213</a>: Fix=
shadow-stack-related crashes with TSan
(Olivier Nicole, report by Nathan Taylor, review by Gabriel Scherer and
Stefan Muenzel)</li>
<li><a href=3D"https://github.com/ocaml/ocaml/issues/14255">#14255</a>: Fix=
TSan bug with C calls that take many arguments
(Olivier Nicole and Miod Vallat, report by Nathan Taylor, review by Gabriel
Scherer)</li>
<li><a href=3D"https://osv.dev/vulnerability/OSEC-2026-01">OSEC-2026-01</a>=
: robustify intern.c
(Xavier Leroy and Nicol=C3=A1s Ojeda B=C3=A4r, review by Olivier Nicole, Mi=
ndy Preston,
Edwin T=C3=B6r=C3=B6k, and Gabriel Scherer)</li>
</ul>
</div>
</div>
</div>
</div>
<div id=3D"outline-container-3" class=3D"outline-2">
<h2 id=3D"3">Ann: Ochat =E2=80=94 Try Ochat for terminal-based LLM workflow=
s</h2>
<div class=3D"outline-text-2" id=3D"text-3">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/ann-ochat-try-ochat-for-ter=
minal-based-llm-workflows/17829/1">https://discuss.ocaml.org/t/ann-ochat-tr=
y-ochat-for-terminal-based-llm-workflows/17829/1</a>
</p>
</div>
<div id=3D"outline-container-org7f7dc9d" class=3D"outline-3">
<h3 id=3D"org7f7dc9d">Dakota Murphy announced</h3>
<div class=3D"outline-text-3" id=3D"text-org7f7dc9d">
<p>
Hi all =E2=80=94 I=E2=80=99d like to share a project I=E2=80=99ve been buil=
ding: <b>Ochat</b>.
</p>
<ul class=3D"org-ul">
<li>Repo: <b><a href=3D"https://github.com/dakotamurphyucf/ochat">https://g=
ithub.com/dakotamurphyucf/ochat</a></b></li>
<li>Demo: <b><a href=3D"https://youtu.be/eGgmUdZfnxM">https://youtu.be/eGgm=
UdZfnxM</a></b></li>
</ul>
</div>
<div id=3D"outline-container-org5b5060b" class=3D"outline-4">
<h4 id=3D"org5b5060b"><b>What it is</b></h4>
<div class=3D"outline-text-4" id=3D"text-org5b5060b">
<p>
Ochat is a toolkit for building LLM workflows as <b>plain files</b>. The co=
re format is <b>ChatMarkdown (ChatMD)</b>: Markdown plus a small, closed XM=
L vocabulary.
</p>
<p>
A single ChatMD file is both:
</p>
<ul class=3D"org-ul">
<li>the <b>prompt/program</b> (model config, tool allowlist, instructions, =
context), and</li>
<li>the <b>auditable transcript</b> (assistant replies + tool calls + tool =
outputs)</li>
</ul>
<p>
Because everything is plain text, workflows are reproducible and diffable i=
n git.
</p>
</div>
</div>
<div id=3D"outline-container-orgd900da9" class=3D"outline-4">
<h4 id=3D"orgd900da9"><b>Prompt packs: building larger workflows from small=
agents</b></h4>
<div class=3D"outline-text-4" id=3D"text-orgd900da9">
<p>
Ochat supports <b>agent-as-tool</b>: you can mount one ChatMD prompt as a c=
allable tool inside another. This lets you build <b>prompt packs</b> (plann=
er/coder/reviewer/docs/test triage/etc.) and orchestrate them from a top-le=
vel prompt, without writing a custom =E2=80=9Cagent app=E2=80=9D.
</p>
</div>
</div>
<div id=3D"outline-container-org7dd6fca" class=3D"outline-4">
<h4 id=3D"org7dd6fca"><b>chat_tui: a Notty-based terminal UI (runtime uses =
Eio)</b></h4>
<div class=3D"outline-text-4" id=3D"text-org7dd6fca">
<p>
Ochat ships an interactive terminal UI called <b>chat_tui</b>.
</p>
<ul class=3D"org-ul">
<li>The UI is built with <b>Notty</b></li>
<li>The underlying runtime uses <b>Eio</b> (structured concurrency + I/O)</=
li>
</ul>
<p>
A ChatMD file can be treated as a =E2=80=9Cterminal agent=E2=80=9D: you aut=
hor an agent prompt as a .md, open it in chat_tui, and run/iterate on it wh=
ile the transcript (including tool traces) is persisted.
</p>
<p>
Some chat_tui features:
</p>
<ul class=3D"org-ul">
<li>streaming output (assistant text + tool calls + tool outputs)</li>
<li>persistent sessions you can resume/branch/export</li>
<li>manual context compaction (:compact) for long histories</li>
<li>syntax highlighting (including OCaml)</li>
<li>AI completions in the text input (to speed up drafting)</li>
<li>Vim-ish editing modes and message selection/yank/edit/resubmit workflow=
s</li>
</ul>
</div>
</div>
<div id=3D"outline-container-org7523cf0" class=3D"outline-4">
<h4 id=3D"org7523cf0"><b>Useful built-in tools (especially for code workflo=
ws)</b></h4>
<div class=3D"outline-text-4" id=3D"text-org7523cf0">
<p>
Ochat includes built-in tools that cover most =E2=80=9Cagent + repo=E2=80=
=9D loops:
</p>
<ul class=3D"org-ul">
<li>read_file / read_dir for safe repo navigation</li>
<li>apply_patch for atomic, repo-safe edits</li>
<li>webpage_to_markdown for high-signal ingestion (incl. GitHub blob fast-p=
ath)</li>
<li>indexing/retrieval tools for grounding over docs and code</li>
<li>optional vision inputs via import_image</li>
</ul>
</div>
</div>
<div id=3D"outline-container-org52eecb2" class=3D"outline-4">
<h4 id=3D"org52eecb2"><b>MCP tool import (optional)</b></h4>
<div class=3D"outline-text-4" id=3D"text-org52eecb2">
<p>
Ochat can also mount external tools via MCP (stdio or HTTP). For example, i=
mporting Brave Search over stdio:
</p>
<div class=3D"org-src-container">
<pre class=3D"src src-xml"><code><span style=3D"color: #59786f;"><</span=
><span style=3D"color: #a7601f;">tool</span> <span style=3D"color: #007a9f;=
">mcp_server</span>=3D<span style=3D"color: #ca3400;">"stdio:npx -y brave-s=
earch-mcp"</span> <span style=3D"color: #007a9f;">name</span>=3D<span style=
=3D"color: #ca3400;">"brave_web_search"</span> <span style=3D"color: #59786=
f;">/</span><span style=3D"color: #59786f;">></span>
</code></pre>
</div>
</div>
</div>
<div id=3D"outline-container-org2e778fe" class=3D"outline-4">
<h4 id=3D"org2e778fe"><b>Quick example: a =E2=80=9Ccustom terminal orchestr=
ator agent=E2=80=9D</b></h4>
<div class=3D"outline-text-4" id=3D"text-org2e778fe">
<p>
This is a complete agent definition (and becomes the runnable =E2=80=9Capp=
=E2=80=9D when opened in chat_tui):
</p>
<div class=3D"org-src-container">
<pre class=3D"src src-xml"><code><span style=3D"color: #59786f;"><</span=
><span style=3D"color: #a7601f;">config</span> <span style=3D"color: #007a9=
f;">model</span>=3D<span style=3D"color: #ca3400;">"gpt-5.2"</span> <span s=
tyle=3D"color: #007a9f;">reasoning_effort</span>=3D<span style=3D"color: #c=
a3400;">"medium"</span> <span style=3D"color: #59786f;">/</span><span style=
=3D"color: #59786f;">></span>
<span style=3D"color: #8f6f4a; font-style: italic;"><!-- </span><span st=
yle=3D"color: #8f6f4a; font-style: italic;">core built-ins</span><span styl=
e=3D"color: #8f6f4a; font-style: italic;"> --></span>
<span style=3D"color: #59786f;"><</span><span style=3D"color: #a7601f;">=
tool</span> <span style=3D"color: #007a9f;">name</span>=3D<span style=3D"co=
lor: #ca3400;">"read_dir"</span><span style=3D"color: #59786f;">/</span><sp=
an style=3D"color: #59786f;">></span>
<span style=3D"color: #59786f;"><</span><span style=3D"color: #a7601f;">=
tool</span> <span style=3D"color: #007a9f;">name</span>=3D<span style=3D"co=
lor: #ca3400;">"read_file"</span><span style=3D"color: #59786f;">/</span><s=
pan style=3D"color: #59786f;">></span>
<span style=3D"color: #59786f;"><</span><span style=3D"color: #a7601f;">=
tool</span> <span style=3D"color: #007a9f;">name</span>=3D<span style=3D"co=
lor: #ca3400;">"apply_patch"</span><span style=3D"color: #59786f;">/</span>=
<span style=3D"color: #59786f;">></span>
<span style=3D"color: #59786f;"><</span><span style=3D"color: #a7601f;">=
tool</span> <span style=3D"color: #007a9f;">name</span>=3D<span style=3D"co=
lor: #ca3400;">"webpage_to_markdown"</span><span style=3D"color: #59786f;">=
/</span><span style=3D"color: #59786f;">></span>
<span style=3D"color: #8f6f4a; font-style: italic;"><!-- </span><span st=
yle=3D"color: #8f6f4a; font-style: italic;">optional: import an external to=
ol via MCP</span><span style=3D"color: #8f6f4a; font-style: italic;"> -->=
;</span>
<span style=3D"color: #59786f;"><</span><span style=3D"color: #a7601f;">=
tool</span> <span style=3D"color: #007a9f;">mcp_server</span>=3D<span style=
=3D"color: #ca3400;">"stdio:npx -y brave-search-mcp"</span> <span style=3D"=
color: #007a9f;">name</span>=3D<span style=3D"color: #ca3400;">"brave_web_s=
earch"</span> <span style=3D"color: #59786f;">/</span><span style=3D"color:=
#59786f;">></span>
<span style=3D"color: #8f6f4a; font-style: italic;"><!-- </span><span st=
yle=3D"color: #8f6f4a; font-style: italic;">prompt-pack tools (agents as to=
ols)</span><span style=3D"color: #8f6f4a; font-style: italic;"> --></spa=
n>
<span style=3D"color: #59786f;"><</span><span style=3D"color: #a7601f;">=
tool</span> <span style=3D"color: #007a9f;">name</span>=3D<span style=3D"co=
lor: #ca3400;">"plan"</span> <span style=3D"color: #007a9f;">agent</span>=
=3D<span style=3D"color: #ca3400;">"prompts/pack/plan.md"</span> local<span=
style=3D"color: #59786f;">/</span><span style=3D"color: #59786f;">></sp=
an>
<span style=3D"color: #59786f;"><</span><span style=3D"color: #a7601f;">=
tool</span> <span style=3D"color: #007a9f;">name</span>=3D<span style=3D"co=
lor: #ca3400;">"code"</span> <span style=3D"color: #007a9f;">agent</span>=
=3D<span style=3D"color: #ca3400;">"prompts/pack/code.md"</span> local<span=
style=3D"color: #59786f;">/</span><span style=3D"color: #59786f;">></sp=
an>
<span style=3D"color: #59786f;"><</span><span style=3D"color: #a7601f;">=
tool</span> <span style=3D"color: #007a9f;">name</span>=3D<span style=3D"co=
lor: #ca3400;">"review"</span> <span style=3D"color: #007a9f;">agent</span>=
=3D<span style=3D"color: #ca3400;">"prompts/pack/review.md"</span> local<sp=
an style=3D"color: #59786f;">/</span><span style=3D"color: #59786f;">></=
span>
<span style=3D"color: #59786f;"><</span><span style=3D"color: #a7601f;">=
developer</span><span style=3D"color: #59786f;">></span><span style=3D"c=
olor: #242521; background-color: #fcf7ef;">
You are the orchestrator. Call plan first.
Keep edits small. Before apply_patch: explain the diff and wait for confirm=
ation.
</span><span style=3D"color: #59786f;"><</span><span style=3D"color: #59=
786f;">/</span><span style=3D"color: #a7601f;">developer</span><span style=
=3D"color: #59786f;">></span>
<span style=3D"color: #59786f;"><</span><span style=3D"color: #a7601f;">=
user</span><span style=3D"color: #59786f;">></span><span style=3D"color:=
#242521; background-color: #fcf7ef;">
Add a Quickstart section to README.md.
</span><span style=3D"color: #59786f;"><</span><span style=3D"color: #59=
786f;">/</span><span style=3D"color: #a7601f;">user</span><span style=3D"co=
lor: #59786f;">></span>
</code></pre>
</div>
<p>
Run it from the repo with:
</p>
<pre class=3D"example" id=3D"orgcd586b1">
dune exec chat_tui -- -file prompts/refactor.md
</pre>
</div>
</div>
<div id=3D"outline-container-org61b75b4" class=3D"outline-4">
<h4 id=3D"org61b75b4"><b>Status / caveats</b></h4>
<div class=3D"outline-text-4" id=3D"text-org61b75b4">
<ul class=3D"org-ul">
<li>Provider support today is <b>OpenAI-only</b>.</li>
<li>The project is moving quickly.</li>
</ul>
</div>
</div>
<div id=3D"outline-container-orgdf0296e" class=3D"outline-4">
<h4 id=3D"orgdf0296e"><b>Feedback / contributors</b></h4>
<div class=3D"outline-text-4" id=3D"text-orgdf0296e">
<p>
I=E2=80=99d appreciate any feedback or contributions
</p>
<p>
If you try it and anything=E2=80=99s confusing or rough, please open an iss=
ue.
</p>
</div>
</div>
</div>
</div>
<div id=3D"outline-container-4" class=3D"outline-2">
<h2 id=3D"4">Serialport - new serial communication library</h2>
<div class=3D"outline-text-2" id=3D"text-4">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/ann-serialport-new-serial-c=
ommunication-library/17594/3">https://discuss.ocaml.org/t/ann-serialport-ne=
w-serial-communication-library/17594/3</a>
</p>
</div>
<div id=3D"outline-container-org4509ad7" class=3D"outline-3">
<h3 id=3D"org4509ad7">Continuing this thread, Mikhail announced</h3>
<div class=3D"outline-text-3" id=3D"text-org4509ad7">
<p>
<a href=3D"https://github.com/dx3mod/serialport/commit/d057a004c050234b64e4=
edbee2c13a04bf4c2734">Added</a> (aka implemented) Win32 support, which has =
not been thoroughly tested, but may be useful for certain target use cases.
</p>
</div>
</div>
</div>
<div id=3D"outline-container-5" class=3D"outline-2">
<h2 id=3D"5">Slipshow!</h2>
<div class=3D"outline-text-2" id=3D"text-5">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/ann-slipshow/16337/18">http=
s://discuss.ocaml.org/t/ann-slipshow/16337/18</a>
</p>
</div>
<div id=3D"outline-container-orgf19191e" class=3D"outline-3">
<h3 id=3D"orgf19191e">Continuing this thread, Paul-Elliot announced</h3>
<div class=3D"outline-text-3" id=3D"text-orgf19191e">
<p>
It is with extraterrestrial excitement that I announce the next release of =
Slipshow:
</p>
<p>
<b>Slipshow 0.9.0: Manim Black</b>
</p>
<p>
The featured new feature of this release is the ability to easily integrate=
<a href=3D"https://www.manim.community/">Manim</a> videos in your presenta=
tion.
</p>
<p>
<a href=3D"https://github.com/user-attachments/assets/f67bb8fc-c288-4ff3-b6=
bc-e72c12e636a7">https://github.com/user-attachments/assets/f67bb8fc-c288-4=
ff3-b6bc-e72c12e636a7</a>
</p>
<p>
Note that, compared to just playing a video, you can schedule pauses, go fa=
ster to the next pause, and go back to the previous pauses, as showcased be=
low.
</p>
</div>
<div id=3D"outline-container-org76178f4" class=3D"outline-4">
<h4 id=3D"org76178f4">Skipping steps and going backward demo</h4>
<div class=3D"outline-text-4" id=3D"text-org76178f4">
<p width=3D"80%">
<a href=3D"https://github.com/user-attachments/assets/cf1ad264-a5e2-42d2-9f=
57-09551f3a35e8" width=3D"80%">https://github.com/user-attachments/assets/c=
f1ad264-a5e2-42d2-9f57-09551f3a35e8</a>
</p>
<p>
This release features many more changes, such as TikZ and MermaidJS integra=
tion! Here is the full changelog:
</p>
</div>
</div>
<div id=3D"outline-container-org5f2e86e" class=3D"outline-4">
<h4 id=3D"org5f2e86e">Added</h4>
<div class=3D"outline-text-4" id=3D"text-org5f2e86e">
<ul class=3D"org-ul">
<li>Support for Mermaid JS (<a href=3D"https://github.com/panglesd/slipshow=
/pull/205">#205</a>)</li>
<li>Support for syntax highlighting of all highlightjs-supported languages =
and themes (<a href=3D"https://github.com/panglesd/slipshow/pull/200">#200<=
/a>, <a href=3D"https://github.com/panglesd/slipshow/pull/208">#208</a>)</l=
i>
<li>Support for MathJax extensions, especially the html extension to allow =
actions to target math elements (<a href=3D"https://github.com/panglesd/sli=
pshow/pull/202">#202</a>)</li>
<li>Add KaTeX as a possible alternate renderer (<a href=3D"https://github.c=
om/panglesd/slipshow/pull/202">#202</a>)</li>
<li>Added <code>carousel-fixed-size</code> to have carousel not change size=
(<a href=3D"https://github.com/panglesd/slipshow/pull/207">#207</a>)</li>
</ul>
</div>
</div>
<div id=3D"outline-container-orgd938f11" class=3D"outline-4">
<h4 id=3D"orgd938f11">Fix</h4>
<div class=3D"outline-text-4" id=3D"text-orgd938f11">
<ul class=3D"org-ul">
<li>Fix impossibility to reopen speaker view after closing it on Firefox (<=
a href=3D"https://github.com/panglesd/slipshow/pull/198">#198</a>, issue <a=
href=3D"https://github.com/panglesd/slipshow/issues/194">#194</a>)</li>
<li>Fix impossibility to open speaker view in serve mode (<a href=3D"https:=
//github.com/panglesd/slipshow/pull/198">#198</a>, issue <a href=3D"https:/=
/github.com/panglesd/slipshow/issues/197">#197</a>)</li>
<li>Fix links opening inside iframe (<a href=3D"https://github.com/panglesd=
/slipshow/pull/198">#198</a>)</li>
<li>Fix ending excursions with <code>ijkl</code> only when needed (<a href=
=3D"https://github.com/panglesd/slipshow/pull/207">#207</a>)</li>
<li>Fixed video long-step handling (<a href=3D"https://github.com/panglesd/=
slipshow/pull/207">#207</a>)</li>
<li>Removed confusing auto-generated IDs (<a href=3D"https://github.com/pan=
glesd/slipshow/pull/209">#209</a>)</li>
<li>Fix <code>play-media</code> behavior when facing errors (<a href=3D"htt=
ps://github.com/panglesd/slipshow/pull/210">#210</a>)</li>
</ul>
</div>
</div>
<div id=3D"outline-container-orgfb3f4af" class=3D"outline-4">
<h4 id=3D"orgfb3f4af">Docs</h4>
<div class=3D"outline-text-4" id=3D"text-orgfb3f4af">
<ul class=3D"org-ul">
<li>Add how to include TikZ figures in your Slipshow presentation (<a href=
=3D"https://github.com/panglesd/slipshow/pull/206">#206</a>)</li>
<li>Add how to include Manim videos in your Slipshow presentation (<a href=
=3D"https://github.com/panglesd/slipshow/pull/207">#207</a>)</li>
</ul>
<p>
Credit: @vds for the name of the release.
</p>
<p>
Thanks again to NLNet for <a href=3D"https://nlnet.nl/project/Slipshow/">su=
pporting</a> the development of Slipshow!
</p>
</div>
</div>
</div>
</div>
<div id=3D"outline-container-6" class=3D"outline-2">
<h2 id=3D"6">Remote OCaml Distributed Systems Engineer (Linux / Storage / N=
etworking) =E2=80=93 whitesky.cloud =E2=80=93 EMEA/Asia</h2>
<div class=3D"outline-text-2" id=3D"text-6">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/remote-ocaml-distributed-sy=
stems-engineer-linux-storage-networking-whitesky-cloud-emea-asia/17832/1">h=
ttps://discuss.ocaml.org/t/remote-ocaml-distributed-systems-engineer-linux-=
storage-networking-whitesky-cloud-emea-asia/17832/1</a>
</p>
</div>
<div id=3D"outline-container-orgd4d7c55" class=3D"outline-3">
<h3 id=3D"orgd4d7c55">Geert Audenaert announced</h3>
<div class=3D"outline-text-3" id=3D"text-orgd4d7c55">
<p>
We are looking for an OCaml engineer to join <b>whitesky.cloud</b> to work =
on low-level distributed infrastructure components.
</p>
<p>
<b>About the work</b>
</p>
<p>
You will work on core building blocks of a sovereign cloud platform, includ=
ing distributed storage and coordination services.
</p>
<p>
Examples of related projects:
</p>
<ul class=3D"org-ul">
<li><a href=3D"https://github.com/openvstorage/alba">https://github.com/ope=
nvstorage/alba</a></li>
<li><a href=3D"https://github.com/openvstorage/arakoon">https://github.com/=
openvstorage/arakoon</a></li>
</ul>
<p>
The work involves:
</p>
<ul class=3D"org-ul">
<li>Distributed systems design and implementation</li>
<li>High-performance networking and I/O</li>
<li>Linux systems programming</li>
<li>Debugging and optimizing behavior under real production load</li>
<li>Long-running services where reliability and correctness matter</li>
</ul>
<p>
This is <b>infrastructure work</b>, not web development.
</p>
<p>
—
</p>
<p>
<b>What we are looking for</b>
</p>
<ul class=3D"org-ul">
<li>Strong OCaml experience <b>or</b> strong systems programming background=
with willingness to work in OCaml</li>
<li>Good understanding of:
<ul class=3D"org-ul">
<li>Linux internals</li>
<li>Networking / TCP/IP</li>
<li>Concurrency and performance</li>
</ul></li>
<li>Interest in distributed systems, storage, or consensus algorithms</li>
</ul>
<p>
We care more about <b>systems thinking and engineering depth</b> than about=
specific frameworks.
</p>
<p>
—
</p>
<p>
<b>Practical details</b>
</p>
<ul class=3D"org-ul">
<li>Full-time position</li>
<li>Fully remote</li>
<li>Location: EMEA or Asia</li>
<li>Salary: around <b>=E2=82=AC3000/month</b> (depending on experience and =
location)</li>
</ul>
<p>
We know this is not a big-tech salary. We are a small engineering-driven co=
mpany, and the role is aimed at engineers who enjoy working close to the sy=
stem, solving real infrastructure problems, and having a direct impact.
</p>
<p>
—
</p>
<p>
<b>About whitesky</b>
</p>
<p>
whitesky builds a complete cloud platform based on Linux and KVM, focused o=
n sovereignty and control.
The platform is used by MSPs, SaaS providers and enterprises to run their o=
wn cloud infrastructure.
</p>
<p>
You will be working on components that run in production environments and f=
orm part of a distributed cloud stack.
</p>
<p>
—
</p>
<p>
If this sounds interesting, please contact:
</p>
<p>
<b>[email protected]</b>
</p>
<p>
or send a DM.
</p>
<p>
We are happy to answer questions or discuss whether this could be a good fi=
t.
</p>
</div>
</div>
</div>
<div id=3D"outline-container-7" class=3D"outline-2">
<h2 id=3D"7">Grace 0.3.0 =F0=9F=92=85, fancy diagnostics library for compil=
ers</h2>
<div class=3D"outline-text-2" id=3D"text-7">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/ann-grace-0-3-0-fancy-diagn=
ostics-library-for-compilers/17833/1">https://discuss.ocaml.org/t/ann-grace=
-0-3-0-fancy-diagnostics-library-for-compilers/17833/1</a>
</p>
</div>
<div id=3D"outline-container-org8114b4f" class=3D"outline-3">
<h3 id=3D"org8114b4f">"Alistair O'Brien" announced</h3>
<div class=3D"outline-text-3" id=3D"text-org8114b4f">
<p>
I=E2=80=99m excited to announce the release of <a href=3D"https://github.co=
m/johnyob/grace/releases/tag/0.3.0">grace 0.3.0</a>, an OCaml library for b=
uilding, reporting and rendering beautiful compiler diagnostics :camel: :pa=
intbrush:. Now available on <a href=3D"https://github.com/ocaml/opam-reposi=
tory/pull/29379">opam-repository</a>.
</p>
<p>
This release includes:
</p>
<ul class=3D"org-ul">
<li>:window: <b>Windows support</b>: Grace now works on Windows, a long-awa=
ited feature since its 0.1.0 release! :rocket:</li>
<li>:keyboard: <b>TTY auto-detection</b>: <code>Grace_ansi_renderer</code> =
can now automatically configure itself based on whether the output channel =
is a TTY. New functions: <code>pr_diagnostic</code>, <code>epr_diagnostic<=
/code>, and <code>output_diagnostic</code>.</li>
<li>:elephant: <b>Line elision</b>: <code>Grace_ansi_renderer</code> now el=
ides unnecessary lines in diagnostics, producing more focused output.</li>
<li>:zero: <b>Zero-width ranges</b>: <code>Grace_ansi_renderer</code> can n=
ow handle zero-width ranges within lines, as well as at end-of-line (EOL) a=
nd end-of-file (EOF) positions.</li>
</ul>
<p>
Many thanks to @giltho for their contributions to this release! :flexed_bic=
eps:=20
</p>
</div>
<div id=3D"outline-container-org6e25415" class=3D"outline-4">
<h4 id=3D"org6e25415">CHANGES</h4>
<div class=3D"outline-text-4" id=3D"text-org6e25415">
<ul class=3D"org-ul">
<li>feat(renderer): add breaks in large diagnostics (<a href=3D"https://git=
hub.com/johnyob/grace/pull/63">#63</a>)</li>
<li>feat(renderer): check for tty when rendering (<a href=3D"https://github=
.com/johnyob/grace/pull/60">#60</a>)</li>
<li>fix(renderer): off-by-one in <code>lines_of_labels</code> (<a href=3D"h=
ttps://github.com/johnyob/grace/pull/65">#65</a>)</li>
<li>fix(renderer): create 0-sized segment on empty label range (<a href=3D"=
https://github.com/johnyob/grace/pull/64">#64</a>)</li>
<li>fix(renderer): renderer multi-line labels when message is empty (<a hre=
f=3D"https://github.com/johnyob/grace/pull/53">#53</a>)</li>
<li>fix(renderer): fix errors that occur with special zero-width segments (=
<a href=3D"https://github.com/johnyob/grace/pull/41">#41</a>)</li>
<li>fix(renderer): use <code>Format.pp_infinity</code> in <code>Message.to_=
string</code> for OCaml >5.2 (<a href=3D"https://github.com/johnyob/grac=
e/pull/40">#40</a>)</li>
<li>refactor!: removes base/core dependency (<a href=3D"https://github.com/=
johnyob/grace/pull/58">#58</a>)</li>
</ul>
</div>
</div>
<div id=3D"outline-container-org317784f" class=3D"outline-4">
<h4 id=3D"org317784f">BREAKING CHANGE</h4>
<div class=3D"outline-text-4" id=3D"text-org317784f">
<ul class=3D"org-ul">
<li>Many base/core interfaces from <code>Grace</code> have been replaced wi=
th custom ones.</li>
<li><code>Source.reader</code> has been removed. Use <code>Source.Reader.t<=
/code> instead.</li>
</ul>
</div>
</div>
</div>
</div>
<div id=3D"outline-container-8" class=3D"outline-2">
<h2 id=3D"8">Js_of_ocaml / Wasm_of_ocaml 6.3</h2>
<div class=3D"outline-text-2" id=3D"text-8">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/ann-js-of-ocaml-wasm-of-oca=
ml-6-3/17834/1">https://discuss.ocaml.org/t/ann-js-of-ocaml-wasm-of-ocaml-6=
-3/17834/1</a>
</p>
</div>
<div id=3D"outline-container-org5c7def4" class=3D"outline-3">
<h3 id=3D"org5c7def4">J=C3=A9r=C3=B4me Vouillon announced</h3>
<div class=3D"outline-text-3" id=3D"text-org5c7def4">
<p>
I'm pleased to announce the joint release of js_of_ocaml and wasm_of_ocaml =
6.3.
</p>
<p>
Js_of_ocaml is a compiler from OCaml bytecode to JavaScript. It makes it po=
ssible to run pure OCaml programs in JavaScript environment like browsers a=
nd Node.js.
</p>
<p>
Wasm_of_ocaml is a compiler from OCaml bytecode to WebAssembly. It is highl=
y compatible with Js_of_ocaml, so you can compile your programs with wasm_o=
f_ocaml instead of js_of_ocaml and experience overall better performance.
</p>
<p>
Most significant changes (since 6.1):
</p>
<ul class=3D"org-ul">
<li><b>Number unboxing for wasm_of_ocaml</b>: a type analysis pass now trac=
ks which values are floats, integers, or nativeints, enabling the compiler =
to unbox them and use native Wasm instructions directly. This also enables =
specialisation of number comparisons and bigarray operations, avoiding cost=
ly generic runtime calls.</li>
<li><b>Constant sinking for js_of_ocaml</b>: a new optimisation pass moves =
constants closer to their use sites, reducing register pressure. Many const=
ants end up inlined, resulting in smaller code size.</li>
<li><b>JS parser improvements</b>: support for import/export attributes, de=
corators, <code>using</code> declarations (resource management), and HTML c=
omments.</li>
<li>Many bug fixes across the compiler, runtime, library bindings, and PPX.=
</li>
</ul>
<p>
See the <a href=3D"https://github.com/ocsigen/js_of_ocaml/blob/master/CHANG=
ES.md">Changelog</a> for the full list of changes.
</p>
</div>
</div>
</div>
<div id=3D"outline-container-9" class=3D"outline-2">
<h2 id=3D"9">kqueue-ml 0.5.0</h2>
<div class=3D"outline-text-2" id=3D"text-9">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/ann-kqueue-ml-0-5-0/17835/1=
">https://discuss.ocaml.org/t/ann-kqueue-ml-0-5-0/17835/1</a>
</p>
</div>
<div id=3D"outline-container-org6d58775" class=3D"outline-3">
<h3 id=3D"org6d58775">Anurag Soni announced</h3>
<div class=3D"outline-text-3" id=3D"text-org6d58775">
<p>
Hi,
</p>
<p>
I'd like to announce a new release for <a href=3D"https://opam.ocaml.org/pa=
ckages/kqueue/kqueue.0.5.0/">kqueue-ml version 0.5.0</a>
</p>
<p>
<b>Kqueue-ml:</b> Thin bindings to kqueue event notification system.=20
</p>
<p>
Changes since the last release:
</p>
<ul class=3D"org-ul">
<li>Moved development to <a href=3D"https://codeberg.org/anuragsoni/kqueue-=
ml/">codeberg</a></li>
<li>Remove dependencies on <code>ppx_optcomp</code> and <code>ppx_expect</c=
ode> (Dependencies are limited to the ocaml standard library and dune)</li>
</ul>
<p>
Best,
Anurag
</p>
</div>
</div>
</div>
<div id=3D"outline-container-10" class=3D"outline-2">
<h2 id=3D"10">Dune 3.21.0</h2>
<div class=3D"outline-text-2" id=3D"text-10">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/ann-dune-3-21-0/17700/2">ht=
tps://discuss.ocaml.org/t/ann-dune-3-21-0/17700/2</a>
</p>
</div>
<div id=3D"outline-container-org142cfc8" class=3D"outline-3">
<h3 id=3D"org142cfc8">Continuing this thread, Shon announced</h3>
<div class=3D"outline-text-3" id=3D"text-org142cfc8">
<p>
The Dune team announces <a href=3D"https://github.com/ocaml/dune/releases/t=
ag/3.21.1">the release of dune 3.21.1</a>.
</p>
<p>
This is a small patch release consisting of a few bug fixes. See <a href=3D=
"https://github.com/ocaml/dune/releases/tag/3.21.1">the full changelog</a> =
for all the changes.
</p>
<p>
If you encounter a problem with this release, please report it in <a href=
=3D"https://github.com/ocaml/dune/issues">our issue
tracker</a>.
</p>
</div>
</div>
</div>
<div id=3D"outline-container-11" class=3D"outline-2">
<h2 id=3D"11">Other OCaml News</h2>
<div class=3D"outline-text-2" id=3D"text-11">
</div>
<div id=3D"outline-container-org42567bc" class=3D"outline-3">
<h3 id=3D"org42567bc">From the ocaml.org blog</h3>
<div class=3D"outline-text-3" id=3D"text-org42567bc">
<p>
Here are links from many OCaml blogs aggregated at <a href=3D"https://ocaml=
.org/blog/">the ocaml.org blog</a>.
</p>
<ul class=3D"org-ul">
<li><a href=3D"https://anil.recoil.org/notes/india-ai-summit">At the AI Imp=
act Summit in Delhi: people, planet, progress</a></li>
<li><a href=3D"https://www.tunbury.org/2026/02/19/obuilder-hcs/">OBuilder o=
n Windows: Bringing Native Container Builds with the HCS Backend</a></li>
<li><a href=3D"https://anil.recoil.org/notes/first-tessera-hackathon">1st T=
ESSERA/CoRE hackathon at the Indian AI Summit</a></li>
</ul>
</div>
</div>
</div>
<div id=3D"outline-container-org2a646da" class=3D"outline-2">
<h2 id=3D"org2a646da">Old CWN</h2>
<div class=3D"outline-text-2" id=3D"text-org2a646da">
<p>
If you happen to miss a CWN, you can <a href=3D"mailto:alan.schmitt@polytec=
hnique.org">send me a message</a> and I'll mail it to you, or go take a loo=
k at <a href=3D"https://alan.petitepomme.net/cwn/">the archive</a> or the <=
a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive=
s</a>.
</p>
<p>
If you also wish to receive it every week by mail, you may subscribe to the=
<a href=3D"https://sympa.inria.fr/sympa/info/caml-list">caml-list</a>.
</p>
<div class=3D"authorname" id=3D"org2417376">
<p>
<a href=3D"https://alan.petitepomme.net/">Alan Schmitt</a>
</p>
</div>
</div>
</div>
</div>
</body>
</html>
--=-=-=--