[ruby-core:123084] [Ruby Feature#21550] Ractor.sharable_proc/sharable_lambda to make sharable Proc object
From:
"ko1 (Koichi Sasada) via ruby-core" <ruby-core@...>
Date:
2025-08-27 08:46:04 UTC
List:
ruby-core #123084
SXNzdWUgIzIxNTUwIGhhcyBiZWVuIHVwZGF0ZWQgYnkga28xIChLb2ljaGkgU2FzYWRhKS4NCg0K DQpFcmVnb24gKEJlbm9pdCBEYWxvemUpIHdyb3RlIGluICNub3RlLTY6DQo+IEkgd29uZGVyIGlm IHRoZSBhYmlsaXR5IHRvIGNhcHR1cmUgb3V0ZXIgbG9jYWwgdmFyaWFibGVzIGZvciBzaGFyZWFi bGUgcHJvY3MgaXMgZXZlbiBuZWVkZWQgYXQgYWxsLg0KPiBCZWNhdXNlIHRoYXQgb25seSB3b3Jr cyBpZiB0aGUgdmFsdWUgb2YgdGhlIGNhcHR1cmVkIHZhcmlhYmxlcyBpcyBzaGFyZWFibGUsIHdo aWNoIHNlZW1zIG5vdCBzbyBsaWtlbHkgKG9ubHkgbnVtYmVycy90cnVlL2ZhbHNlL25pbC9mcm96 ZW4tc3RyaW5nLWxpdGVyYWxzL21vZHVsZXMvcmVnZXhwcyBhcmUgZnJvemVuL3NoYXJlYWJsZSB3 aXRob3V0IGFuIGV4cGxpY2l0IGZyZWV6ZS9tYWtlX3NoYXJlYWJsZSBjYWxsKS4NCj4gSSB3b3Vs ZCBsaWtlIHRvIHNlZSBzb21lIGNvbmNyZXRlIGV4YW1wbGVzIG9mIGJsb2NrcyB0byBiZSBtYWRl IHNoYXJlYWJsZSB3aGljaCBjYXB0dXJlIG91dGVyIGxvY2FsIHZhcmlhYmxlcywgYW5kIGhvdyB0 aGV5IGhhbmRsZSB0aGUgY2FzZSBvZiBjYXB0dXJlZCB2YXJpYWJsZSB2YWx1ZXMgbm90IGFscmVh ZHkgYmVpbmcgZGVlcGx5IGZyb3plbiAoY2MgQHRlbmRlcmxvdmVtYWtpbmcgeW91IHNhaWQgdGhl cmUgd2VyZSBzb21lIGluIFJhaWxzIElJUkMpLg0KDQpJIGhhdmUgdHdvIGV4YW1wbGVzLg0KDQpP bmUgaXMgYGRlZmluZV9tZXRob2RgLg0KDQpgYGBydWJ5DQpkZWYgZGVmaW5lX2ZvbyBzdWZmaXgs IGl2YXJfbmFtZSAjIHNob3VsZCBiZSBpbiBTeW1ib2wNCiAgZGVmaW5lX21ldGhvZCAiZm9vXyN7 bWlkfSBkbw0KICAgIGluc3RhbmNlX3ZhcmlhYmxlX2dldCBpdmFyX25hbWUNCiAgZW5kDQplbmQN CmBgYA0KDQpUaGlzIG1ldGhvZCBkZWZpbmUgYSBuZXcgbWV0aG9kIGJ5IHVzaW5nIGEgb3V0ZXIg bG9jYWwgdmFyaWFibGUgYGl2YXJfbmFtZWAuDQoNCkZvciBleGFtcGxlLCB0aGlzIHBhdHRlcm4g aXMgdXNlZDoNCg0KYGBgcnVieQ0KIyBsaWIvZGVsZWdhdGUucmINCmRlZiBEZWxlZ2F0b3IuZGVs ZWdhdGluZ19ibG9jayhtaWQpICMgOm5vZG9jOg0KICBsYW1iZGEgZG8gfCphcmdzLCAmYmxvY2t8 DQogICAgdGFyZ2V0ID0gc2VsZi5fX2dldG9ial9fDQogICAgdGFyZ2V0Ll9fc2VuZF9fKG1pZCwg KmFyZ3MsICZibG9jaykNCiAgZW5kLnJ1YnkyX2tleXdvcmRzDQplbmQNCg0KIyBsaWIvYnVuZGxl ci9lcnJvcnMucmINCiAgICBkZWYgc2VsZi5zdGF0dXNfY29kZShjb2RlKQ0KICAgICAgZGVmaW5l X21ldGhvZCg6c3RhdHVzX2NvZGUpIHsgY29kZSB9DQoNCg0KIyByZXBsX3R5cGVfY29tcGxldG9y L3Rlc3QvcmVwbF90eXBlX2NvbXBsZXRvci90ZXN0X3JlcGxfdHlwZV9jb21wbGV0b3IucmINCiAg ICBkZWYgd2l0aF9mYWlsaW5nX21ldGhvZChrbGFzcywgbWV0aG9kX25hbWUsIG1lc3NhZ2UpDQog ICAgICAuLi4NCiAgICAgICMgbWVzc2FnZSBzaG91bGQgYmUgbWFya2VkIGFzIHNoYXJhYmxlDQog ICAgICBrbGFzcy5kZWZpbmVfbWV0aG9kKG1ldGhvZF9uYW1lKSBkbyB8KiwgKip8DQogICAgICAg IHJhaXNlIEV4Y2VwdGlvbi5uZXcobWVzc2FnZSkNCiAgICAgIGVuZA0KDQojIGRlYnVnL3Rlc3Qv Y29uc29sZS9jb25maWdfZm9ya190ZXN0LnJiDQogICAgWydmb3JrJywgJ1Byb2Nlc3MuZm9yaycs ICdLZXJuZWwuZm9yayddLmVhY2h7fGZvcmtfbWV0aG9kfA0KICAgICAgYyA9IENsYXNzLm5ldyBD b25zb2xlVGVzdENhc2UgZG8NCiAgICAgICAgLi4uDQogICAgICAgICMgZm9ya19tZXRob2Qgc2hv dWxkYmUgbWFya2VkIGFzIHNoYXJhYmxlDQogICAgICAgIGRlZmluZV9tZXRob2QgOmZvcmtfbWV0 aG9kIGRvDQogICAgICAgICAgZm9ya19tZXRob2QNCiAgICAgICAgZW5kDQogICAgICBlbmQNCmBg YA0KDQpUaGUgZmlyc3QgbW90aXZhdGlvbiBpcyBob3cgdG8gaGFuZGxlIGBkZWZpbmVfbWV0aG9k YC4NCg0KDQpBbm90aGVyIGV4YW1wbGUgdG8gbWFrZSBhIHRhc2sgb2JqZWN0IHdoaWNoIHNob3Vs ZCBiZSBydW4gaW4gYW5vdGhlciBSYWN0b3IuDQoNCnJlc3VsdCA9IFJhY3Rvcjo6UG9ydC5uZXcN ClJhY3Rvci5zaGFyYWJsZV9wcm9jIGRvDQogIHJlc3VsdCA8PCB0YXNrKCkNCmVuZA0KDQpwIHJl c3VsdC5yZWNlaXZlDQpgYGANCg0KSSBoYXZlIGFscmVhZHkgd3JpdHRlbiB0aGUgZm9sbG93aW5n IHBhdHRlcm4gbWFueSB0aW1lczoNCg0KYGBgcnVieQ0KcG9ydCA9IFJhY3Rvcjo6UG9ydC5uZXcN ClJhY3Rvci5uZXcgcG9ydCBkbyB8cG9ydHwNCiAgcG9ydCA8PCAuLi4NCmVuZA0KYGBgDQoNCmFu ZCBpdCBpcyBzb21ld2hhdCBjdW1iZXJzb21lIHRvIHdyaXRlLg0KDQotLS0tDQoNCkF0IGxlYXN0 IHdlIGhhdmUgbm8gb2JqZWN0aW9uIHRvIGludHJvZHVjZSBgUmFjdG9yLnNoYXJlYWJsZV9wcm9j KCZibClgIGlmIGBibGAgZG9lc24ndCBoYXZlIHJlZmVyZW5jZXMgdG8gdGhlIG91dGVyIHZhcmlh YmxlLg0KSSdsbCBtZXJnZSBpdC4NCg0KLS0tLQ0KDQpJIGhhdmUgYW5vdGhlciBpZGVhLg0KDQpS ZXR1cm5pbmcgdG8gdGhlIGlzc3VlOiB3ZSB3YW50IGEgd2F5IHRvIGV4cHJlc3MgdGhhdCwgd2l0 aGluIGEgYmxvY2ssIGFuIG91dGVyIHZhcmlhYmxlIGlzIHNoYWRvd2VkIHdoaWxlIHByZXNlcnZp bmcgaXRzIGN1cnJlbnQgdmFsdWUuDQoNCldlIGFscmVhZHkgaGF2ZSBzeW50YXggdG8gc2hhZG93 IGFuIG91dGVyIHZhcmlhYmxlIHVzaW5nIGB8aTsgYXxgLCB3aGVyZSBgYWAgaXMgc2hhZG93ZWQg aW4gdGhlIGJsb2NrIGFuZCBpbml0aWFsaXplZCB0byBgbmlsYCAoanVzdCBsaWtlIGEgbm9ybWFs IGxvY2FsIHZhcmlhYmxlKS4NCg0KYGBgcnVieQ0KYSA9IDQyDQpwciA9IHByb2N7fDthfCBwIGF9 DQphID0gNDMNCnByLmNhbGwgIz0+IG5pbA0KYGBgDQoNCldoYXQgaWYgd2UgaW5zdGVhZCBpbml0 aWFsaXplZCB0aGUgc2hhZG93ZWQgdmFyaWFibGUgdG8gdGhlIG91dGVyIHZhcmlhYmxlJ3MgY3Vy cmVudCB2YWx1ZT8NCg0KYGBgcnVieQ0KYSA9IDQyDQpwciA9IHByb2N7fDthfCBwIGF9DQphID0g NDMNCnByLmNhbGwgIz0+IDQyDQpgYGANCg0KTWF5YmUgb25seSBmZXcgcGVvcGxlIGtub3cgdGhp cyBzcGVjIGFuZCBJIGNoZWNrZWQgdGhhdCB0aGVyZSBhcmUgZmV3IGxpbmVzIGluIHJ1YnlnZW1z ICg3OCBjYXNlcyBpbiAzTSBmaWxlcykoKjEpLg0KU28gSSB0aGluayB0aGVyZSBpcyBhIGZldyBj b21wYXRpYmlsaXR5IGltcGFjdC4NCg0KKjE6DQpgYGANCiMge25hbWU6IGZvb30sIDNdIG1lYW5z IHNoYWRvd2VkIG5hbWUgImZvbyIgaXMgdXNlZCAzIHRpbWVzLg0KDQpbW1s6RklMRVMsIDNfMDY4 XzgxOF0sIFs6RkFJTEVEX1BBUlNFLCAxNF85MjhdXSwNCiBbWzpsdmFyLCA3OF0sDQogIFt7bmFt ZTogOmdsYXJrfSwgNl0sDQogIFtbOkZBSUxFRCwgU3lzdGVtU3RhY2tFcnJvcl0sIDVdLA0KICBb e25hbWU6IDpibH0sIDRdLA0KICBbe25hbWU6IDphfSwgNF0sDQogIFt7bmFtZTogOm9wdGlvbnN9 LCAzXSwNCiAgW3tuYW1lOiA6bmFtZX0sIDNdLA0KICBbe25hbWU6IDpieXRlc30sIDJdLA0KICBb e25hbWU6IDpleHRyYX0sIDJdLA0KICBbe25hbWU6IDpzaGFwZX0sIDJdLA0KICBbe25hbWU6IDpi fSwgMl0sDQogIFt7bmFtZTogOnh9LCAyXSwNCiAgW3tuYW1lOiA6bmV3X3Jvb3R9LCAyXSwNCiAg W3tuYW1lOiA6YmwyfSwgMl0sDQogIFt7bmFtZTogOmlmY19zcGN9LCAyXSwNCiAgW3tuYW1lOiA6 bX0sIDJdLA0KICBbe25hbWU6IDpmb299LCAyXSwNCiAgW3tuYW1lOiA6a2V5fSwgMl0sDQogIFt7 bmFtZTogOm1kfSwgMl0sDQogIFt7bmFtZTogOmR9LCAyXSwNCiAgW3tuYW1lOiA6Y30sIDJdLA0K ICBbe25hbWU6IDpvdXR9LCAyXSwNCiAgW3tuYW1lOiA6YmFyfSwgMl0sDQogIFt7bmFtZTogOnJl cX0sIDFdLA0KICBbe25hbWU6IDpyZXNwfSwgMV0sDQogIFt7bmFtZTogOnNwZWN9LCAxXSwNCiAg W3tuYW1lOiA6d29ybGR9LCAxXSwNCiAgW3tuYW1lOiA6dX0sIDFdLA0KICBbe25hbWU6IDpvbnRv fSwgMV0sDQogIFt7bmFtZTogOnJibmFtZX0sIDFdLA0KICBbe25hbWU6IDpyfSwgMV0sDQogIFt7 bmFtZTogOmh9LCAxXSwNCiAgW3tuYW1lOiA6YnVnOTYwNX0sIDFdLA0KICBbe25hbWU6IDpleHBl Y3RlZH0sIDFdLA0KICBbe25hbWU6IDpyZXN1bHR9LCAxXSwNCiAgW3tuYW1lOiA6c2VydmljZXN9 LCAxXSwNCiAgW3tuYW1lOiA6c3RlcH0sIDFdLA0KICBbe25hbWU6IDpvYmp9LCAxXSwNCiAgW3tu YW1lOiA6YW5jZXN0b3J9LCAxXSwNCiAgW3tuYW1lOiA6Y291bnR9LCAxXSwNCiAgW3tuYW1lOiA6 cGF0aH0sIDFdLA0KICBbe25hbWU6IDpuYXZ9LCAxXSwNCiAgW3tuYW1lOiA6c2FmZV9wb3NpdGlv bl9pbl9pbnB1dH0sIDFdLA0KICBbe25hbWU6IDpzYWZlX2NvdW50fSwgMV0sDQogIFt7bmFtZTog OnZ9LCAxXSwNCiAgW3tuYW1lOiA6a30sIDFdLA0KICBbe25hbWU6IDppbmRlbnR9LCAxXSwNCiAg W3tuYW1lOiA6eX0sIDFdLA0KICBbe25hbWU6IDp6X2RpZmZ9LCAxXV1dDQpgYGANCg0KLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KRmVhdHVyZSAjMjE1NTA6IFJhY3Rv ci5zaGFyYWJsZV9wcm9jL3NoYXJhYmxlX2xhbWJkYSB0byBtYWtlIHNoYXJhYmxlIFByb2Mgb2Jq ZWN0DQpodHRwczovL2J1Z3MucnVieS1sYW5nLm9yZy9pc3N1ZXMvMjE1NTAjY2hhbmdlLTExNDM5 Nw0KDQoqIEF1dGhvcjoga28xIChLb2ljaGkgU2FzYWRhKQ0KKiBTdGF0dXM6IE9wZW4NCiogQXNz aWduZWU6IGtvMSAoS29pY2hpIFNhc2FkYSkNCiogVGFyZ2V0IHZlcnNpb246IDMuNQ0KLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KTGV0J3MgaW50cm9kdWNlIGEgd2F5 IHRvIG1ha2UgYSBzaGFyYWJsZSBQcm9jLg0KDQoqIGBSYWN0b3Iuc2hhcmVhYmxlX3Byb2Moc2Vs ZjogbmlsLCAmYmxvY2spYCBtYWtlcyBwcm9jLg0KKiBgUmFjdG9yLnNoYXJlYWJsZV9sYW1iZGEo c2VsZjogbmlsLCAmYmxvY2spYCBtYWtlcyBsYW1iZGEuDQoNClNlZSBhbHNvOiBodHRwczovL2J1 Z3MucnVieS1sYW5nLm9yZy9pc3N1ZXMvMjEwMzkNCg0KIyMgQmFja2dyb3VuZA0KDQojIyMgTW90 aXZhdGlvbg0KDQpCZWluZyBhYmxlIHRvIGNyZWF0ZSBhIHNoYXJlYWJsZSBQcm9jIGlzIGltcG9y dGFudCBmb3IgUmFjdG9ycy4gRm9yIGV4YW1wbGUsIHdlIG9mdGVuIHdhbnQgdG8gc2VuZCBhIHRh c2sgdG8gYW5vdGhlciBSYWN0b3I6DQoNCmBgYHJ1YnkNCndvcmtlciA9IFJhY3Rvci5uZXcgZG8N CiAgd2hpbGUgdGFzayA9IFJhY3Rvci5yZWNlaXZlDQogICAgdGFzay5jYWxsKC4uLikNCiAgZW5k DQplbmQNCg0KdGFzayA9IChzaGFyYWJsZV9wcm9jKQ0Kd29ya2VyIDw8IHRhc2sNCg0KdGFzayA9 IChzaGFyYWJsZV9wcm9jKQ0Kd29ya2VyIDw8IHRhc2sNCg0KdGFzayA9IChzaGFyYWJsZV9wcm9j KQ0Kd29ya2VyIDw8IHRhc2sNCmBgYA0KDQpUaGVyZSBhcmUgdmFyaW91cyB3YXlzIHRvIHJlcHJl c2VudCBhIHRhc2ssIGJ1dCB1c2luZyBhIFByb2MgaXMgc3RyYWlnaHRmb3J3YXJkLg0KDQpIb3dl dmVyLCB0byBtYWtlIGEgUHJvYyBzaGFyZWFibGUgdG9kYXksIHNlbGYgbXVzdCBhbHNvIGJlIHNo YXJlYWJsZSwgd2hpY2ggbGVhZHMgdG8gcGF0dGVybnMgbGlrZToNCg0KYGBgcnVieQ0KICBuaWwu aW5zdGFuY2VfZXZhbHsgUHJvYy5uZXd7IC4uLiB9IH0NCmBgYA0KDQpUaGlzIGlzIG5vaXN5IGFu ZCBjcnlwdGljLiBXZSBwcm9wb3NlIGRlZGljYXRlZCBtZXRob2RzIHRvIGNyZWF0ZSBzaGFyZWFi bGUgUHJvYyBvYmplY3RzIGRpcmVjdGx5Lg0KDQoNCiMjIFNwZWNpZmljYXRpb24NCg0KKiBgUmFj dG9yLnNoYXJlYWJsZV9wcm9jKHNlbGY6IG5pbCwgJmJsb2NrKWAgbWFrZXMgYSBwcm9jLg0KKiBg UmFjdG9yLnNoYXJlYWJsZV9sYW1iZGEoc2VsZjogbmlsLCAmYmxvY2spYCBtYWtlcyBhIGxhbWJk YS4NCg0KQm90aCBtZXRob2RzIGNyZWF0ZSB0aGUgUHJvYy9sYW1iZGEgd2l0aCB0aGUgZ2l2ZW4g c2VsZiBhbmQgbWFrZSB0aGUgcmVzdWx0aW5nIG9iamVjdCBzaGFyZWFibGUuDQoNCkNhcHR1cmVk IG91dGVyIHZhcmlhYmxlcyBmb2xsb3cgdGhlIGN1cnJlbnQgYFJhY3Rvci5tYWtlX3NoYXJlYWJs ZWAgc2VtYW50aWNzOg0KDQoqIElmIGEgY2FwdHVyZWQgb3V0ZXIgbG9jYWwgdmFyaWFibGUgcmVm ZXJzIHRvIGEgc2hhcmVhYmxlIG9iamVjdCwgYSBzaGFyZWFibGUgUHJvYyBtYXkgcmVhZCBpdC4N CiogSWYgYW55IGNhcHR1cmVkIG91dGVyIHZhcmlhYmxlIHJlZmVycyB0byBhIG5vbuKAkXNoYXJl YWJsZSBvYmplY3QsIGNyZWF0aW5nIHRoZSBzaGFyZWFibGUgUHJvYyByYWlzZXMgYW4gZXJyb3Iu DQoNCg0KYGBgcnVieQ0KYSA9IDQyDQpiID0gInN0ciINClJhY3Rvci5zaGFyYWxiZV9wcm9jew0K ICBwIGEgIz0+IDQyDQp9DQoNClJhY3Rvci5zaGFyYWxiZV9wcm9jeyAjIGVycm9yIHdoZW4gbWFr aW5nIGEgc2hhcmVhbGJlIHByb2MNCiAgcCBiICM9PiA0Mg0KfQ0KYGBgDQoNCiogVGhlIGNhcHR1 cmVkIG91dGVyIGxvY2FsIHZhcmlhYmxlcyBhcmUgY29waWVkIGJ5IHZhbHVlIHdoZW4gdGhlIHNo YXJlYWJsZSBQcm9jIGlzIGNyZWF0ZWQuIFN1YnNlcXVlbnQgbW9kaWZpY2F0aW9ucyBvZiB0aG9z ZSB2YXJpYWJsZXMgaW4gdGhlIGNyZWF0b3Igc2NvcGUgZG8gbm90IGFmZmVjdCB0aGUgUHJvYy4N Cg0KYGBgcnVieQ0KYSA9IDQyDQpzaHByID0gUmFjdG9yLnNoYXJhYmxlX3Byb2N7DQogIHAgYQ0K fQ0KYSA9IDANCnNocHIuY2FsbCAjPT4gNDINCmBgYA0KDQoqIEFzc2lnbmluZyB0byBvdXRlciBs b2NhbCB2YXJpYWJsZXMgZnJvbSB3aXRoaW4gdGhlIHNoYXJlYWJsZSBQcm9jIGlzIG5vdCBhbGxv d2VkIChlcnJvciBhdCBjcmVhdGlvbikuDQoNCmBgYHJ1YnkNCmEgPSA0Mg0KUmFjdG9yLnNoYXJl YWJsZV9wcm9jeyAjIGVycm9yIHdoZW4gbWFraW5nIGEgc2hhcmVhbGJlIHByb2MNCiAgYSA9IDQz DQp9DQoNCmBgYA0KDQpNb3JlIGFib3V0IG91dGVyLXZhcmlhYmxlIGhhbmRsaW5nIGFyZSBkaXNj dXNzZWQgYmVsb3cuDQoNCkluIG90aGVyIHdvcmRzLCBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiBh IHNoYXJlYWJsZSBQcm9jLCBjYXB0dXJlZCBvdXRlciBsb2NhbHMgYXJlIHJlYWTigJFvbmx5IGNv bnN0YW50cy4NCg0KVGhpcyBwcm9wb3NhbCBkb2VzIG5vdCBjaGFuZ2UgdGhlIHNlbWFudGljcyBv ZiBSYWN0b3IubWFrZV9zaGFyZWFibGUoKSBpdHNlbGYuDQoNCiMjIERpc2N1c3Npb24gYWJvdXQg b3V0ZXIgbG9jYWwgdmFyaWFibGVzDQoNCltGZWF0dXJlICMyMTAzOV0gZGlzY3Vzc2VzIGhvdyBj YXB0dXJlZCB2YXJpYWJsZXMgc2hvdWxkIGJlIGhhbmRsZWQuDQpJIHByb3Bvc2UgdHdvIG9wdGlv bnMuDQoNCiMjIyAxLiBObyBwcm9ibGVtIHRvIGNoYW5nZSB0aGUgb3V0ZXItdmFyaWFibGUgc2Vt YW50aWNzDQoNCkBFcmVnb24gbm90ZWQgdGhhdCB0aGUgY3VycmVudCBiZWhhdmlvciBvZiBgUmFj dG9yLm1ha2Vfc2hhcmVhYmxlKHByb2Nfb2JqKWAgY2FuIHN1cnByaXNlIHVzZXJzLiBXaGlsZSB0 aGF0IGlzIHVuZGVyc3RhbmRhYmxlLCBSdWJ5IGFscmVhZHkgaGFzIHNpbWlsYXIgKnN1cnByaXNl cyouDQoNCkZvciBpbnN0YW5jZToNCg0KYGBgcnVieQ0KUlNwZWMuZGVzY3JpYmUgJ2ZvbycgZG8N CiAgcCBzZWxmICM9PiBSU3BlYzo6RXhhbXBsZUdyb3Vwczo6Rm9vDQplbmQNCmBgYA0KDQpIZXJl LCBgc2VsZmAgaXMgaW1wbGljaXRseSByZXBsYWNlZCwgbGlrZWx5IHZpYSBgaW5zdGFuY2VfZXhl Y2AuDQpUaGlzIGNhbiBiZSBzdXJwcmlzaW5nIGlmIG9uZSBkb2VzIG5vdCBrbm93IHNlbGYgY2Fu IGNoYW5nZSwgeWV0IGl0IGlzIGFjY2VwdGVkIGluIFJ1YnkuDQpXZSB2aWV3IHRoZSBjdXJyZW50 IHNpdHVhdGlvbiBhcyBhIHNpbWlsYXIga2luZCBvZiBzdXJwcmlzZS4NCg0KDQojIyMgMi4gRW5m b3JjZSBhIHN0cmljdCBydWxlIGZvciBub27igJFsZXhpY2FsIHVzYWdlDQoNClRoZSBkaWZmaWN1 bHR5IGlzIHRoYXQgaXQgaXMgaGFyZCB0byBrbm93IHdoaWNoIGJsb2NrIHdpbGwgYmVjb21lIHNo YXJlYWJsZSB1bmxlc3MgaXQgaXMgbGV4aWNhbGx5IHVzYWdlLg0KDQpgYGBydWJ5DQojICgxKSBP biB0aGlzIGNvZGUsIGl0IGlzIGNsZWFyIHRoYXQgdGhlIGJsb2NrIHdpbGwgYmUgc2hhcmVhYmxl IGJsb2NrOg0KDQphID0gNDINClJhY3Rvci5zaGFyYWJsZV9wcm9jew0KICBwIGENCn0NCg0KIyAo MikgT24gdGhpcyBjb2RlLCBpdCBpcyBub3QgY2xlYXIgdGhhdCB0aGUgYmxvY2sgYmVjb21lcyBz aGFyYWJsZSBvciBub3QNCmdldCBwYXRoIGRvDQogIHAgYQ0KZW5kDQoNCiMgKDMpIE9uIHRoaXMg Y29kZSwgaXQgaGFzIG5vIHByb2JsZW0gYmVjYXVzZQ0KZ2V0ICcvaGVsbG8nIGRvDQogICJ3b3Js ZCINCmVuZA0KYGBgDQoNClRoZSBpZGVhIGlzIHRvIGFsbG93IGFjY2Vzc2luZyBjYXB0dXJlZCBv dXRlciB2YXJpYWJsZXMgb25seSBmb3IgbGV4aWNhbGx5IGV4cGxpY2l0IHVzZXMgb2YgYFJhY3Rv ci5zaGFyZWFibGVfcHJvY2AgYXMgaW4gKDEpLCBhbmQgdG8gcmFpc2UgYW4gZXJyb3IgZm9yIG5v buKAkWxleGljYWwgY2FzZXMgYXMgaW4gKDIpLg0KU28gdGhlIGV4YW1wbGUgKDMpIGlzIGFsbG93 ZWQgaWYgdGhlIGJsb2NrIGJlY29tZXMgc2hhcmFibGUgb3Igbm90Lg0KDQpUaGUgc3RyaWN0IHJ1 bGUgaXMgc2FtZSBhcyBgUmFjdG9yLm5ld2AgYmxvY2sgcnVsZS4gDQoNCg0KDQoNCi0tIA0KaHR0 cHM6Ly9idWdzLnJ1YnktbGFuZy5vcmcvDQpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fCiBydWJ5LWNvcmUgbWFpbGluZyBsaXN0IC0tIHJ1YnktY29yZUBtbC5y dWJ5LWxhbmcub3JnCiBUbyB1bnN1YnNjcmliZSBzZW5kIGFuIGVtYWlsIHRvIHJ1YnktY29yZS1s ZWF2ZUBtbC5ydWJ5LWxhbmcub3JnCiBydWJ5LWNvcmUgaW5mbyAtLSBodHRwczovL21sLnJ1Ynkt bGFuZy5vcmcvbWFpbG1hbjMvbGlzdHMvcnVieS1jb3JlLm1sLnJ1YnktbGFuZy5vcmcvCg==