[ruby-core:123090] [Ruby Feature#21550] Ractor.sharable_proc/sharable_lambda to make sharable Proc object
From:
"Eregon (Benoit Daloze) via ruby-core" <ruby-core@...>
Date:
2025-08-27 20:52:28 UTC
List:
ruby-core #123090
SXNzdWUgIzIxNTUwIGhhcyBiZWVuIHVwZGF0ZWQgYnkgRXJlZ29uIChCZW5vaXQgRGFsb3plKS4N Cg0KDQpPcHRpb24gMyBkb2Vzbid0IHNlZW0gZ29vZCBiZWNhdXNlIGl0IHdvdWxkIGJyZWFrIHRo ZSBibG9jayBpZiB0aGUgYmxvY2sgaXMgcnVuIG9uIFJ1YnkgMy40IGFuZCBiZWZvcmUsIGFzIHRo ZSB2YWx1ZSBvZiBgYWAgd291bGQgYmUgYG5pbGAuDQpPbmUgd291bGQgbmVlZCB0byBoYXZlIDIg Y29waWVzIG9mIHRoZSBibG9jayB3aGljaCBpcyBjbGVhcmx5IGluY29udmVuaWVudC4NCg0KSSB0 aGluayBSYWN0b3Igc2hvdWxkIGJlIGFibGUgdG8gdXNlIGNhcHR1cmVkIHZhcmlhYmxlcywgYmVj YXVzZSB0aGlzIGlzIG9uZSBvZiB0aGUgbW9zdCBlbGVnYW50IHdheXMgdG8gcGFzcyBkYXRhL2lu cHV0IGluIFJ1YnkuDQpCdXQgaXQgc2hvdWxkIGJlIHNhZmUsIGFuZCB0aGF0IG1lYW5zIG5vdCBi cmVha2luZyBub3JtYWwgUnVieSBibG9jayBzZW1hbnRpY3MgKGF0IGxlYXN0IGZvciBibG9ja3Mg d2hpY2ggZG9uJ3QgZXhwbGljaXRseSBvcHQtaW4gdG8gdGhlIGVudmlyb25tZW50IGNvcHkgYmVo YXZpb3IpLg0KDQpTbyBJIHRoaW5rIE9wdGlvbiA0IHdvdWxkIHN0aWxsIGJlIHRoZSBiZXN0LCBh bmQgdGhhdCdzIHRoZSBvcHRpb24gcHJvcG9zZWQgaW4gIzIxMDM5Og0KKiBgUmFjdG9yLnNoYXJh YmxlX3Byb2NgIGlzIHRoZSBzYW1lIGZvciBsaXRlcmFsIGFuZCBub24tbGl0ZXJhbCBibG9ja3MN CiogYFJhY3Rvci5zaGFyYWJsZV9wcm9jYCByYWlzZXMgaWYgaXQgY2FwdHVyZXMgYSB2YXJpYWJs ZSB3aGljaCBpcyByZWFzc2lnbmVkIGluc2lkZSBvciBhZnRlciB0aGUgYmxvY2svUHJvYyBnaXZl biB0byBgUmFjdG9yLnNoYXJhYmxlX3Byb2NgLg0KDQpOb3RpY2Ugd2UgYWxyZWFkeSBhZ3JlZSBv biAiYFJhY3Rvci5zaGFyYWJsZV9wcm9jYCByYWlzZXMgaWYgaXQgY2FwdHVyZXMgYSB2YXJpYWJs ZSB3aGljaCBpcyByZWFzc2lnbmVkIGluc2lkZSB0aGUgYmxvY2svUHJvYyBnaXZlbiB0byBgUmFj dG9yLnNoYXJhYmxlX3Byb2NgIi4NClNvIGl0J3MganVzdCBhZGRpbmcgYG9yIGFmdGVyYCwgd2hp Y2ggbWFrZXMgaXQgZnVsbHkgc2FmZSBhbmQgY29tcGF0aWJsZSB3aXRoIHJlZ3VsYXIgYmxvY2sg c2VtYW50aWNzLg0KSSBkb24ndCB0aGluayB0aGF0IGNoZWNrIGlzIHZlcnkgZGlmZmljdWx0IHRv IGltcGxlbWVudCwgaW4gZmFjdCBJIGNhbiBoZWxwIGltcGxlbWVudGluZyBpdC4NClJ1YnkgY29k ZSB0byBtYWtlIGl0IGNsZWFyOg0KDQpgYGBydWJ5DQojIE9LIGJlY2F1c2UgZG9lcyBub3QgY2hh bmdlIHRoZSBzZW1hbnRpY3Mgb2YgYg0KZGVmIGV4YW1wbGUNCiAgYSA9IDENCiAgYSArPSAyDQog IGIgPSBwcm9jIHsgYSB9DQogIFJhY3Rvci5zaGFyYWJsZV9wcm9jKCZiKQ0KZW5kDQoNCiMgT0sg YmVjYXVzZSBkb2VzIG5vdCBjaGFuZ2UgdGhlIHNlbWFudGljcyBvZiB0aGUgYmxvY2sNCmRlZiBl eGFtcGxlDQogIGEgPSAxDQogIGEgKz0gMg0KICBSYWN0b3Iuc2hhcmFibGVfcHJvYyB7IGEgfQ0K ZW5kDQoNCiMgZXJyb3IgKHRoYXQgZXZlcnlvbmUgc2VlbXMgdG8gYWdyZWUgb24pDQpkZWYgZXhh bXBsZQ0KICBhID0gMQ0KICBiID0gcHJvYyB7IGEgPSAyIH0NCiAgUmFjdG9yLnNoYXJhYmxlX3By b2MoJmIpDQplbmQNCg0KIyBlcnJvciAodGhhdCBldmVyeW9uZSBzZWVtcyB0byBhZ3JlZSBvbikN CmRlZiBleGFtcGxlDQogIGEgPSAxDQogIFJhY3Rvci5zaGFyYWJsZV9wcm9jIHsgYSA9IDIgfQ0K ZW5kDQoNCiMgZXJyb3IgKHRoZSBjYXNlIHdlIGRpc2N1c3NpbmcgYWJvdXQpOiB0aGUgY29kZSBj bGVhcmx5IGFzc3VtZXMgaXQgY2FuIHJlYXNzaWducyBgYWAgYnV0IHRoZSBgc2hhcmFibGVfcHJv Y2Agd291bGQgbm90IHJlc3BlY3QgaXQsIGkuZS4gYHNoYXJhYmxlX3Byb2NgIHdvdWxkIGJyZWFr IFJ1YnkgYmxvY2sgc2VtYW50aWNzDQojIEFsc28gbm90ZSB0aGUgUmFjdG9yLnNoYXJhYmxlX3By b2MgY2FsbCBtaWdodCBiZSBmYXIgYXdheSBmcm9tIHRoZSBibG9jaywgc28gb25lIGNhbid0IHRl bGwgd2hlbiBsb29raW5nIGF0IHRoZSBibG9jayB0aGF0IGl0IHdvdWxkIGJlIGJyb2tlbiBieSBg c2hhcmFibGVfcHJvY2AgKGlmIG5vIGVycm9yIGZvciB0aGlzIGNhc2UpDQpkZWYgZXhhbXBsZQ0K ICBhID0gMQ0KICBiID0gcHJvYyB7IGEgfQ0KICBSYWN0b3Iuc2hhcmFibGVfcHJvYygmcHJvYyB7 IGEgfSkNCiAgYSA9IDINCmVuZA0KDQojIEkgdGhpbmsgc2hvdWxkIGJlIGVycm9yIHRvbywgc2Vt YW50aWNzIGFyZSBpbGwtZGVmaW5lZCBpbiBzdWNoIGEgY2FzZSwgdGhlIGNvZGUgY2xlYXJseSBh c3N1bWVzIGl0IGNhbiByZWFzc2lnbnMgYGFgIGJ1dCB0aGUgYHNoYXJhYmxlX3Byb2NgIHdvdWxk IG5vdCByZXNwZWN0IGl0DQpkZWYgZXhhbXBsZQ0KICBhID0gMQ0KICBSYWN0b3Iuc2hhcmFibGVf cHJvYyB7IGEgfQ0KICBhID0gMg0KZW5kDQpgYGANCg0KVGhhdCBjaGVjayBjYW4gYmUgbW9yZSBz dHJpY3QgZm9yIGNvbnZlbmllbmNlIChlLmcuIHJhaXNlIGlmIHRoZSBhc3NpZ25tZW50cyBhcmUg bm90IHRyaXZpYWxseSBhbGwgYmVmb3JlIHRoZSBibG9jay9Qcm9jKSwNCkkgdGhpbmsgdGhhdCdz IGZpbmUgYmVjYXVzZSBpdCdzIGZhaXJseSByYXJlIHRvIHJlYXNzaWduIGEgdmFyaWFibGUgYWZ0 ZXIgYSBibG9jayBjYXB0dXJlcyBpdCwgc28gd29uJ3QgYmUgYSBwcmFjdGljYWwgbGltaXRhdGlv biBhbnl3YXkuDQpCdXQgc3RpbGwsIHN1Y2ggY2FzZXMgc2hvdWxkIHN0aWxsIGJlaGF2ZSBjb3Jy ZWN0bHkgYWNjb3JkaW5nIHRvIGJsb2NrIHNlbWFudGljcywgaGVuY2Ugc2hvdWxkIGJlIGZvcmJp ZGRlbiBmb3IgYFJhY3Rvci5zaGFyYWJsZV9wcm9jYC4NClJlIGBldmFsYCBhbmQgYGJpbmRpbmdg IGl0J3Mgc28gcmFyZSBhbmQgc3VjaCBhIGNvcm5lciBjYXNlIGluIGNvbWJpbmF0aW9uIHdpdGgg cmVhc3NpZ25pbmcgYSB2YXJpYWJsZSBhZnRlciBhIGJsb2NrIGNhcHR1cmVzIGl0IHRoYXQgSSB0 aGluayBpdCBpcyBhY2NlcHRhYmxlIHRvIGV4cG9zZSB0aGF0IGBSYWN0b3Iuc2hhcmFibGVfcHJv Y2AgY29waWVzIHRoZSBlbnZpcm9ubWVudCBmb3IgdGhvc2UgZXh0cmVtZWx5IHJhcmUgY2FzZXMu DQpCVFcsIFByb2MjYmluZGluZyBpcyBhbHJlYWR5IG5vdCBzdXBwb3J0ZWQgZm9yIGEgYHNoYXJh YmxlX3Byb2NgOg0KYGBgDQokIHJ1YnkgLWUgJ25pbC5pbnN0YW5jZV9leGVjIHsgYSA9IDE7IGIg PSBwcm9jIHsgYSB9OyBiMiA9IFJhY3Rvci5tYWtlX3NoYXJlYWJsZShiKTsgcCBiMi5iaW5kaW5n IH0nDQotZToxOmluIGBiaW5kaW5nJzogQ2FuJ3QgY3JlYXRlIEJpbmRpbmcgZnJvbSBpc29sYXRl ZCBQcm9jIChBcmd1bWVudEVycm9yKQ0KYGBgDQpTbyBgYmluZGluZ2AvYGV2YWxgIGlzIGluIGdl bmVyYWwgYWxyZWFkeSBub3QgZnVsbHkgcmVzcGVjdGVkIHdpdGggUmFjdG9yIGFueXdheS4NCg0K U29tZSBlZGdlIGNhc2VzIGZvciBjbGFyaXR5Og0KYGBgcnVieQ0KIyBPSywgd2UgY2Fubm90IGRl dGVjdCBpdCwgZXh0cmVtZSBjb3JuZXIgY2FzZSB1bmxpa2VseSB0byBhcHBlYXIgaW4gYW55IHJl YWwgY29kZS4gVGhlIHNoYXJhYmxlX3Byb2Mgd2lsbCBjYXB0dXJlIDEsIGIgd2lsbCBjYXB0dXJl IDIuDQpkZWYgZXhhbXBsZQ0KICBhID0gMA0KICBiID0gcHJvYyB7IGEgfQ0KICBwID0gUmFjdG9y LnNoYXJhYmxlX3Byb2MoJnByb2MgeyBhIH0pDQogIGV2YWwoImEgPSAyIikgIyBvciBiaW5kaW5n LmxvY2FsX3ZhcmlhYmxlX3NldCg6YSwgMiksIG9yIGIuYmluZGluZy5sb2NhbF92YXJpYWJsZV9z ZXQoOmEsIDIpDQogIFtiLCBwXQ0KZW5kDQoNCiMgZXJyb3IsIGBhYCBpcyByZWFzc2lnbmVkIGFm dGVyIHRoZSBibG9jaw0KZGVmIGV4YW1wbGUNCiAgYSA9IDANCiAgd2hpbGUgY29uZGl0aW9uDQog ICAgYiA9IHByb2MgeyBhIH0NCiAgICBSYWN0b3Iuc2hhcmFibGVfcHJvYygmcHJvYyB7IGEgfSkN CiAgICBhICs9IDENCiAgZW5kDQplbmQNCg0KIyBlcnJvciwgYGFgIG1pZ2h0IGJlIHJlYXNzaWdu ZWQgKGlmIGNvbmRpdGlvbiBpcyB0cnVlIHR3aWNlIG9yIG1vcmUsIGJ1dCB3ZSBoYXZlIHRvIGFu YWx5emUgc3RhdGljYWxseSBzbyBiZSBjb25zZXJ2YXRpdmUpDQpkZWYgZXhhbXBsZQ0KICB3aGls ZSBjb25kaXRpb24NCiAgICBhID0gcmFuZA0KICAgIGIgPSBwcm9jIHsgYSB9DQogICAgUmFjdG9y LnNoYXJhYmxlX3Byb2MoJnByb2MgeyBhIH0pDQogIGVuZA0KZW5kDQpgYGANCg0KQXMgc2FpZCBi ZWZvcmUsIEknbSBPSyB3aXRoIG9wdGlvbiAyLCBidXQgaXQncyBsZXNzIGZsZXhpYmxlIHRoYW4g b3B0aW9uIDQuDQpXZSBjb3VsZCBhbHNvIGhhdmUgYSBtaXggYW5kIGFsbG93IGV2ZXJ5dGhpbmcg Zm9yIGxpdGVyYWwgYmxvY2ssIGFuZCBvcHRpb24gNCBmb3IgUHJvYy4NCkkgcmVtYWluIHN0cm9u Z2x5IGFnYWluc3Qgb3B0aW9uIDEsIEkgdGhpbmsgaXQgaXMgYSBsYW5ndWFnZSBkZXNpZ24gbWlz dGFrZSB3ZSB3b24ndCBiZSBhYmxlIHRvIGZpeCBsYXRlci4NCg0KQW5kIGZvciBgZGVmaW5lX21l dGhvZGAgSSB0aGluayB3ZSBzaG91bGQgaGF2ZSBzb21ldGhpbmcgbW9yZSBjb252ZW5pZW50IHRo YW4gYFJhY3Rvci5zaGFyZWFibGVfcHJvY2AgKHNlZSBwcmV2aW91cyBjb21tZW50KS4NCg0KLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KRmVhdHVyZSAjMjE1NTA6IFJh Y3Rvci5zaGFyYWJsZV9wcm9jL3NoYXJhYmxlX2xhbWJkYSB0byBtYWtlIHNoYXJhYmxlIFByb2Mg b2JqZWN0DQpodHRwczovL2J1Z3MucnVieS1sYW5nLm9yZy9pc3N1ZXMvMjE1NTAjY2hhbmdlLTEx NDQwNA0KDQoqIEF1dGhvcjoga28xIChLb2ljaGkgU2FzYWRhKQ0KKiBTdGF0dXM6IE9wZW4NCiog QXNzaWduZWU6IGtvMSAoS29pY2hpIFNhc2FkYSkNCiogVGFyZ2V0IHZlcnNpb246IDMuNQ0KLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KTGV0J3MgaW50cm9kdWNlIGEg d2F5IHRvIG1ha2UgYSBzaGFyYWJsZSBQcm9jLg0KDQoqIGBSYWN0b3Iuc2hhcmVhYmxlX3Byb2Mo c2VsZjogbmlsLCAmYmxvY2spYCBtYWtlcyBwcm9jLg0KKiBgUmFjdG9yLnNoYXJlYWJsZV9sYW1i ZGEoc2VsZjogbmlsLCAmYmxvY2spYCBtYWtlcyBsYW1iZGEuDQoNClNlZSBhbHNvOiBodHRwczov L2J1Z3MucnVieS1sYW5nLm9yZy9pc3N1ZXMvMjEwMzkNCg0KIyMgQmFja2dyb3VuZA0KDQojIyMg TW90aXZhdGlvbg0KDQpCZWluZyBhYmxlIHRvIGNyZWF0ZSBhIHNoYXJlYWJsZSBQcm9jIGlzIGlt cG9ydGFudCBmb3IgUmFjdG9ycy4gRm9yIGV4YW1wbGUsIHdlIG9mdGVuIHdhbnQgdG8gc2VuZCBh IHRhc2sgdG8gYW5vdGhlciBSYWN0b3I6DQoNCmBgYHJ1YnkNCndvcmtlciA9IFJhY3Rvci5uZXcg ZG8NCiAgd2hpbGUgdGFzayA9IFJhY3Rvci5yZWNlaXZlDQogICAgdGFzay5jYWxsKC4uLikNCiAg ZW5kDQplbmQNCg0KdGFzayA9IChzaGFyYWJsZV9wcm9jKQ0Kd29ya2VyIDw8IHRhc2sNCg0KdGFz ayA9IChzaGFyYWJsZV9wcm9jKQ0Kd29ya2VyIDw8IHRhc2sNCg0KdGFzayA9IChzaGFyYWJsZV9w cm9jKQ0Kd29ya2VyIDw8IHRhc2sNCmBgYA0KDQpUaGVyZSBhcmUgdmFyaW91cyB3YXlzIHRvIHJl cHJlc2VudCBhIHRhc2ssIGJ1dCB1c2luZyBhIFByb2MgaXMgc3RyYWlnaHRmb3J3YXJkLg0KDQpI b3dldmVyLCB0byBtYWtlIGEgUHJvYyBzaGFyZWFibGUgdG9kYXksIHNlbGYgbXVzdCBhbHNvIGJl IHNoYXJlYWJsZSwgd2hpY2ggbGVhZHMgdG8gcGF0dGVybnMgbGlrZToNCg0KYGBgcnVieQ0KICBu aWwuaW5zdGFuY2VfZXZhbHsgUHJvYy5uZXd7IC4uLiB9IH0NCmBgYA0KDQpUaGlzIGlzIG5vaXN5 IGFuZCBjcnlwdGljLiBXZSBwcm9wb3NlIGRlZGljYXRlZCBtZXRob2RzIHRvIGNyZWF0ZSBzaGFy ZWFibGUgUHJvYyBvYmplY3RzIGRpcmVjdGx5Lg0KDQoNCiMjIFNwZWNpZmljYXRpb24NCg0KKiBg UmFjdG9yLnNoYXJlYWJsZV9wcm9jKHNlbGY6IG5pbCwgJmJsb2NrKWAgbWFrZXMgYSBwcm9jLg0K KiBgUmFjdG9yLnNoYXJlYWJsZV9sYW1iZGEoc2VsZjogbmlsLCAmYmxvY2spYCBtYWtlcyBhIGxh bWJkYS4NCg0KQm90aCBtZXRob2RzIGNyZWF0ZSB0aGUgUHJvYy9sYW1iZGEgd2l0aCB0aGUgZ2l2 ZW4gc2VsZiBhbmQgbWFrZSB0aGUgcmVzdWx0aW5nIG9iamVjdCBzaGFyZWFibGUuDQoNCihjaGFu Z2VkKSBBY2Nlc3Npbmcgb3V0ZXIgdmFyaWFibGVzIGFyZSBub3QgYWxsb3dlZC4gQW4gZXJyb3Ig aXMgcmFpc2VkIGF0IHRoZSBjcmVhdGlvbi4NCg0KTW9yZSBhYm91dCBvdXRlci12YXJpYWJsZSBo YW5kbGluZyBhcmUgZGlzY3Vzc2VkIGJlbG93Lg0KDQpJbiBvdGhlciB3b3JkcywgZnJvbSB0aGUg cGVyc3BlY3RpdmUgb2YgYSBzaGFyZWFibGUgUHJvYywgY2FwdHVyZWQgb3V0ZXIgbG9jYWxzIGFy ZSByZWFk4oCRb25seSBjb25zdGFudHMuDQoNClRoaXMgcHJvcG9zYWwgZG9lcyBub3QgY2hhbmdl IHRoZSBzZW1hbnRpY3Mgb2YgUmFjdG9yLm1ha2Vfc2hhcmVhYmxlKCkgaXRzZWxmLg0KDQojIyBE aXNjdXNzaW9uIGFib3V0IG91dGVyIGxvY2FsIHZhcmlhYmxlcw0KDQpbRmVhdHVyZSAjMjEwMzld IGRpc2N1c3NlcyBob3cgY2FwdHVyZWQgdmFyaWFibGVzIHNob3VsZCBiZSBoYW5kbGVkLg0KSSBw cm9wb3NlIHR3byBvcHRpb25zLg0KDQojIyMgMC4gRGlzYWxsb3cgYWNjZXNzaW5nIHRvIHRoZSBv dXRlci12YXJpYWJsZXMNCg0KSXQgaXMgc2ltcGxlIGFuZCBubyBjb25mdXNpb24uDQoNCiMjIyAx LiBObyBwcm9ibGVtIHRvIGNoYW5nZSB0aGUgb3V0ZXItdmFyaWFibGUgc2VtYW50aWNzDQoNCkBF cmVnb24gbm90ZWQgdGhhdCB0aGUgY3VycmVudCBiZWhhdmlvciBvZiBgUmFjdG9yLm1ha2Vfc2hh cmVhYmxlKHByb2Nfb2JqKWAgY2FuIHN1cnByaXNlIHVzZXJzLiBXaGlsZSB0aGF0IGlzIHVuZGVy c3RhbmRhYmxlLCBSdWJ5IGFscmVhZHkgaGFzIHNpbWlsYXIgKnN1cnByaXNlcyouDQoNCkZvciBp bnN0YW5jZToNCg0KYGBgcnVieQ0KUlNwZWMuZGVzY3JpYmUgJ2ZvbycgZG8NCiAgcCBzZWxmICM9 PiBSU3BlYzo6RXhhbXBsZUdyb3Vwczo6Rm9vDQplbmQNCmBgYA0KDQpIZXJlLCBgc2VsZmAgaXMg aW1wbGljaXRseSByZXBsYWNlZCwgbGlrZWx5IHZpYSBgaW5zdGFuY2VfZXhlY2AuDQpUaGlzIGNh biBiZSBzdXJwcmlzaW5nIGlmIG9uZSBkb2VzIG5vdCBrbm93IHNlbGYgY2FuIGNoYW5nZSwgeWV0 IGl0IGlzIGFjY2VwdGVkIGluIFJ1YnkuDQpXZSB2aWV3IHRoZSBjdXJyZW50IHNpdHVhdGlvbiBh cyBhIHNpbWlsYXIga2luZCBvZiBzdXJwcmlzZS4NCg0KDQojIyMgMi4gRW5mb3JjZSBhIHN0cmlj dCBydWxlIGZvciBub27igJFsZXhpY2FsIHVzYWdlDQoNClRoZSBkaWZmaWN1bHR5IGlzIHRoYXQg aXQgaXMgaGFyZCB0byBrbm93IHdoaWNoIGJsb2NrIHdpbGwgYmVjb21lIHNoYXJlYWJsZSB1bmxl c3MgaXQgaXMgbGV4aWNhbGx5IHVzYWdlLg0KDQpgYGBydWJ5DQojICgxKSBPbiB0aGlzIGNvZGUs IGl0IGlzIGNsZWFyIHRoYXQgdGhlIGJsb2NrIHdpbGwgYmUgc2hhcmVhYmxlIGJsb2NrOg0KDQph ID0gNDINClJhY3Rvci5zaGFyYWJsZV9wcm9jew0KICBwIGENCn0NCg0KIyAoMikgT24gdGhpcyBj b2RlLCBpdCBpcyBub3QgY2xlYXIgdGhhdCB0aGUgYmxvY2sgYmVjb21lcyBzaGFyYWJsZSBvciBu b3QNCmdldCBwYXRoIGRvDQogIHAgYQ0KZW5kDQoNCiMgKDMpIE9uIHRoaXMgY29kZSwgaXQgaGFz IG5vIHByb2JsZW0gYmVjYXVzZQ0KZ2V0ICcvaGVsbG8nIGRvDQogICJ3b3JsZCINCmVuZA0KYGBg DQoNClRoZSBpZGVhIGlzIHRvIGFsbG93IGFjY2Vzc2luZyBjYXB0dXJlZCBvdXRlciB2YXJpYWJs ZXMgb25seSBmb3IgbGV4aWNhbGx5IGV4cGxpY2l0IHVzZXMgb2YgYFJhY3Rvci5zaGFyZWFibGVf cHJvY2AgYXMgaW4gKDEpLCBhbmQgdG8gcmFpc2UgYW4gZXJyb3IgZm9yIG5vbuKAkWxleGljYWwg Y2FzZXMgYXMgaW4gKDIpLg0KU28gdGhlIGV4YW1wbGUgKDMpIGlzIGFsbG93ZWQgaWYgdGhlIGJs b2NrIGJlY29tZXMgc2hhcmFibGUgb3Igbm90Lg0KDQpUaGUgc3RyaWN0IHJ1bGUgaXMgc2FtZSBh cyBgUmFjdG9yLm5ld2AgYmxvY2sgcnVsZS4gDQoNCiMjIyAzLiBBZGRpbmcgbmV3IHJ1bGVzDQoN CihxdW90ZWQgZnJvbSBodHRwczovL2J1Z3MucnVieS1sYW5nLm9yZy9pc3N1ZXMvMjE1NTAjbm90 ZS03KQ0KDQpSZXR1cm5pbmcgdG8gdGhlIGlzc3VlOiB3ZSB3YW50IGEgd2F5IHRvIGV4cHJlc3Mg dGhhdCwgd2l0aGluIGEgYmxvY2ssIGFuIG91dGVyIHZhcmlhYmxlIGlzIHNoYWRvd2VkIHdoaWxl IHByZXNlcnZpbmcgaXRzIGN1cnJlbnQgdmFsdWUuDQoNCldlIGFscmVhZHkgaGF2ZSBzeW50YXgg dG8gc2hhZG93IGFuIG91dGVyIHZhcmlhYmxlIHVzaW5nIGB8aTsgYXxgLCB3aGVyZSBgYWAgaXMg c2hhZG93ZWQgaW4gdGhlIGJsb2NrIGFuZCBpbml0aWFsaXplZCB0byBgbmlsYCAoanVzdCBsaWtl IGEgbm9ybWFsIGxvY2FsIHZhcmlhYmxlKS4NCg0KYGBgcnVieQ0KYSA9IDQyDQpwciA9IHByb2N7 fDthfCBwIGF9DQphID0gNDMNCnByLmNhbGwgIz0+IG5pbA0KYGBgDQoNCldoYXQgaWYgd2UgaW5z dGVhZCBpbml0aWFsaXplZCB0aGUgc2hhZG93ZWQgdmFyaWFibGUgdG8gdGhlIG91dGVyIHZhcmlh YmxlJ3MgY3VycmVudCB2YWx1ZT8NCg0KYGBgcnVieQ0KYSA9IDQyDQpwciA9IHByb2N7fDthfCBw IGF9DQphID0gNDMNCnByLmNhbGwgIz0+IDQyDQpgYGANCg0KRm9yIGV4YW1wbGUsIHdlIGNhbiB3 cml0ZSB0aGUgcG9ydCBleGFtcGxlIGxpa2UgdGhhdDoNCg0KYGBgcnVieQ0KDQpwb3J0ID0gUmFj dG9yOjpQb3J0Lm5ldw0KUmFjdG9yLm5ldyBkbyB8O3BvcnR8DQogIHBvcnQgPDwgLi4uDQplbmQN CmBgYA0KDQphbmQgaXQgaXMgYmV0dGVyIChzaG9ydGVyKS4NCg0KTWF5YmUgb25seSBmZXcgcGVv cGxlIGtub3cgdGhpcyBzcGVjIGFuZCBJIGNoZWNrZWQgdGhhdCB0aGVyZSBhcmUgZmV3IGxpbmVz IGluIHJ1YnlnZW1zICg3OCBjYXNlcyBpbiAzTSBmaWxlcykoKjEpLg0KU28gSSB0aGluayB0aGVy ZSBpcyBhIGZldyBjb21wYXRpYmlsaXR5IGltcGFjdC4NCg0KDQoNCg0KDQoNCi0tIA0KaHR0cHM6 Ly9idWdzLnJ1YnktbGFuZy5vcmcvDQpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fCiBydWJ5LWNvcmUgbWFpbGluZyBsaXN0IC0tIHJ1YnktY29yZUBtbC5ydWJ5 LWxhbmcub3JnCiBUbyB1bnN1YnNjcmliZSBzZW5kIGFuIGVtYWlsIHRvIHJ1YnktY29yZS1sZWF2 ZUBtbC5ydWJ5LWxhbmcub3JnCiBydWJ5LWNvcmUgaW5mbyAtLSBodHRwczovL21sLnJ1YnktbGFu Zy5vcmcvbWFpbG1hbjMvbGlzdHMvcnVieS1jb3JlLm1sLnJ1YnktbGFuZy5vcmcvCg==