[ruby-core:109516] [Ruby master Feature#18934] Proposal: Introduce method results memoization API in the core
From:
"Dan0042 (Daniel DeLorme)" <noreply@...>
Date:
2022-08-17 15:17:41 UTC
List:
ruby-core #109516
SXNzdWUgIzE4OTM0IGhhcyBiZWVuIHVwZGF0ZWQgYnkgRGFuMDA0MiAoRGFuaWVsIERlTG9ybWUp Lg0KDQoNCmplcmVteWV2YW5zMCAoSmVyZW15IEV2YW5zKSB3cm90ZSBpbiAjbm90ZS0yOg0KPiBU aGlzIHR5cGUgb2Ygb3B0aW1pemF0aW9uIGlzIG5vdCBzYWZlIHVubGVzcyB0aGUgZW50aXJlIGNs YXNzIGhpZXJhcmNoeSBpcyBmcm96ZW4uICBPdGhlcndpc2UsIGFkZGl0aW9uYWwgbWVtb2l6ZWQg bWV0aG9kcyBjb3VsZCBiZSBhZGRlZCB0byBhbnkgYW5jZXN0b3IgYXQgYW55IHRpbWUuDQoNClll cyBpbmRlZWQsIHRoZXJlIGFyZSBjYXZlYXRzIGFuZCBzcGVjaWFsIHNpdHVhdGlvbnMgdG8gaGFu ZGxlIHdoZW4gYSBtZW1vaXplZCBtZXRob2QgaXMgYWRkZWQgYWZ0ZXIgaW5zdGFuY2VzIGhhdmUg YmVlbiBjcmVhdGVkLiBCdXQgaXQncyBub3QgbGlrZSBpdCdzIGltcG9zc2libGUgdG8gaGFuZGxl Lg0KDQo+IEhvdyB3aWxsIHRoZSBtZW1vaXphdGlvbiBhcHByb2FjaCBpbnRlcmFjdCB3aXRoIG9i amVjdCBzaGFwZXMgKCMxODc3Nik/DQoNClllcyEgVXNpbmcgb2JqZWN0IHNoYXBlcywgZ3JlYXQg aWRlYSEgVGhhdCdzIGFjdHVhbGx5IGEgZ29vZCB3YXkgdG8gaGFuZGxlIHRoZSBhYm92ZW1lbnRp b25lZCBpc3N1ZSB3aXRoIGFkZGl0aW9uYWwgbWVtb2l6ZWQgbWV0aG9kcy4NCg0KLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KRmVhdHVyZSAjMTg5MzQ6IFByb3Bvc2Fs OiBJbnRyb2R1Y2UgbWV0aG9kIHJlc3VsdHMgbWVtb2l6YXRpb24gQVBJIGluIHRoZSBjb3JlDQpo dHRwczovL2J1Z3MucnVieS1sYW5nLm9yZy9pc3N1ZXMvMTg5MzQjY2hhbmdlLTk4Njg1DQoNCiog QXV0aG9yOiB6dmVyb2sgKFZpY3RvciBTaGVwZWxldikNCiogU3RhdHVzOiBPcGVuDQoqIFByaW9y aXR5OiBOb3JtYWwNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCioq QWJzdHJhY3Q6KiogSSBwcm9wb3NlIHRvIGludHJvZHVjZSBhIHNpbXBsZSBjb3JlIEFQSSBmb3Ig bWVtb2l6aW5nIGFyZ3VtZW50LWxlc3MgbWV0aG9kIHJldHVybiB2YWx1ZXMuDQoNCmBgYHJ1YnkN CmNsYXNzIFRlc3QNCiAgZGVmIGZvbw0KICAgIHB1dHMgImNhbGwhIg0KICAgIDUNCiAgZW5kDQoN CiAgbWVtb2l6ZWQgOmZvbw0KZW5kDQoNCm8gPSBUZXN0Lm5ldw0Kby5mb28gIyBwcmludHMgImNh bGwhIiwgcmV0dXJucyA1DQpvLmZvbyAjIHJldHVybnMgNSBpbW1lZGlhdGVseQ0KYGBgDQoNClRo ZSBmdWxsIHByb3Bvc2FsIGlzIGJlbG93Lg0KDQojIyBJbnRybw0KDQpGb3IgZnVydGhlciByZWFz b25pbmcsIEknbGwgYmUgdXNpbmcgdGhlIGZvbGxvd2luZyBjbGFzcy4gSXQgaXMgc2ltcGxpZmll ZC9pbnZlbnRlZCBmb3IgZGVtb25zdHJhdGl2ZSBwdXJwb3Nlcywgc28gSSdkIHByZWZlciB0byBk aXNjdXNzIHByb2JsZW1zL3NvbHV0aW9ucyBkZXNjcmliZWQgaW4gZ2VuZXJhbCBhbmQgbm90IGZv Y3VzIG9uICJ5b3UgY291bGQgcmV3cml0ZSB0aGlzIGNsYXNzIHRoYXQgd2F5Ii4NCg0KYGBgcnVi eQ0KY2xhc3MgU2VudGVuY2UNCiAgYXR0cl9yZWFkZXIgOnRleHQNCg0KICBkZWYgaW5pdGlhbGl6 ZSh0ZXh0KSA9IEB0ZXh0ID0gdGV4dA0KDQogIGRlZiB0b2tlbnMoKSA9IFNvbWVUb2tlbml6ZXIu bmV3KHRleHQpLmNhbGwNCg0KICBkZWYgc2l6ZSgpID0gdG9rZW5zLnNpemUNCiAgZGVmIGVtcHR5 PygpID0gdG9rZW5zLmFsbD8oJjp3aGl0ZXNwYWNlPykNCg0KICBkZWYgd29yZHMoKSA9IHRva2Vu cy5zZWxlY3QoJjp3b3JkPykNCiAgZGVmIHNlcnZpY2U/KCkgPSB3b3Jkcy5lbXB0eT8NCmVuZA0K YGBgDQoNCiMjIFRoZSBwcm9ibGVtDQoNClRoZSBjbGFzcyBhYm92ZSBpcyBuaWNlLCBjbGVhbiwg YW5kIGVhc3kgdG8gcmVhZC4gVGhlIHByb2JsZW0gd2l0aCBpdCBpcyBlZmZpY2llbmN5OiBpZiB3 ZSBpbWFnaW5lIHRoYXQgYFNvbWVUb2tlbml6ZXIjY2FsbGAgaXMgbm90IGNoZWFwIChpdCBwcm9i YWJseSBpc24ndCksIHRoZW4gY3JlYXRpbmcgYSBmZXcgc2VudGVuY2VzIGFuZCB0aGVuIHByb2Nl c3NpbmcgdGhlbSB3aXRoIHNvbWUgYWxnb3JpdGhtIHdpbGwgYmXigJR3aXRoIHRoZSBkZW1vbnN0 cmF0ZWQgZGVmaW5pdGlvbiBvZiB0aGUgY2xhc3PigJRtdWNoIGxlc3MgZWZmaWNpZW50IHRoZW4g aXQgY291bGQgYmUuIEV2ZXJ5IHN0YXRlbWVudCBsaWtlLi4uDQpgYGBydWJ5DQptYW55X3NlbnRl bmNlcy5yZWplY3QoJjplbXB0eT8pLnNlbGVjdCB7IF8xLndvcmRzLmluY2x1ZGU/KCdSdWJ5Jykg fS5tYXAgeyBfMS53b3Jkcy5jb3VudCAvIF8xLnRva2Vucy5jb3VudCB9DQpgYGANCi4uLmlzIG11 Y2ggbGVzcyBlZmZpY2llbnQgdGhhbiBpdCAiaW50dWl0aXZlbHkiIHNob3VsZCBiZSBiZWNhdXNl IHRva2VuaXphdGlvbiBoYXBwZW5zIGFnYWluIGFuZCBhZ2Fpbi4NCg0KQ2FjaGluZyBqdXN0IGB0 b2tlbnNgIHdvdWxkIHByb2JhYmx5IG5vdCBiZSBlbm91Z2ggZm9yIGEgY29tcGxleCBhbGdvcml0 aG0gd29ya2luZyB3aXRoIHNvbWUgbm90YWJsZSBhbW91bnRzIG9mIGRhdGE6IGB3aGl0ZXNwYWNl P2AgYW5kIGB3b3JkP2AgbWlnaHQgYWxzbyBiZSBub24tdHJpdmlhbDsgYnV0IGV2ZW4gdHJpdmlh bCBtZXRob2RzIGxpa2UgYHNlbGVjdGAgYW5kIGBlbXB0eT9gIHdoZW4gbmVlZGxlc3NseSByZXBl YXRlZCB0aG91c2FuZHMgb2YgdGltZXMsIHdvdWxkIGJlIHZpc2libGUgaW4gcHJvZmlsaW5nLg0K DQpTbywgY2FuIHdlIHN0b3AgcmVjYWxjdWxhdGluZyB0aGVtIGNvbnN0YW50bHk/DQoNCiMjIEV4 aXN0aW5nIHNvbHV0aW9ucw0KDQojIyMgSnVzdCBwcmUtY2FsY3VsYXRlIGV2ZXJ5dGhpbmcgaW4g YGluaXRpYWxpemVgDQoNCldlIGNvdWxkIGNyZWF0ZSBhIGxvdCBvZiBpbnN0YW5jZSB2YXJpYWJs ZXMgaW4gYGluaXRpYWxpemVgOg0KYGBgcnVieQ0KZGVmIGluaXRpYWxpemUodGV4dCkNCiAgQHRl eHQgPSB0ZXh0DQogIEB0b2tlbnMgPSBTb21lVG9rZW5pemVyLm5ldyhAdGV4dCkuY2FsbA0KICBA c2l6ZSA9IEB0b2tlbnMuc2l6ZQ0KICBAZW1wdHkgPSBAdG9rZW5zLmFsbD8oJjp3aGl0ZXNwYWNl PykNCiAgQHdvcmRzID0gQHRva2Vucy5zZWxlY3QoJjp3b3JkPykNCiAgQHNlcnZpY2UgPSBAd29y ZHMuZW1wdHk/DQplbmQNCmBgYA0KSXQgd2lsbCB3b3JrLCBvZiBjb3Vyc2UsIGJ1dCBpdCBsb3Nl cyBuaWNlIHZpc2liaWxpdHkgb2Ygd2hhdCdzIG9iamVjdHMgbWFpbiBkYXRhIGFuZCB3aGF0IGlz IGRlcml2YXRpdmU7IGFuZCBpdCBpcyBtb3JlIGNvZGUgKG5vdyB3ZSBuZWVkIHRvIGRlZmluZSBh dHRyX3JlYWRlcnMgYW5kIHByZWRpY2F0ZSBtZXRob2RzIGZvciBhbGwgb2YgdGhhdCEpLiBBbmQg YWRkaW5nIGV2ZXJ5IG5ldyBzbWFsbCBzZXJ2aWNlIG1ldGhvZCAobGlrZSBgZGVmIHF1ZXN0aW9u PygpID0gdG9rZW5zLmxhc3QmLnRleHQgPT0gJz8nYCkgd291bGQgcmVxdWlyZSByZXRoaW5raW5n ICJpcyBpdCBlZmZpY2llbnQgZW5vdWdoIHRvIGJlIGEgbWV0aG9kLCBvciBzaG91bGQgSSBhZGQg b25lIG1vcmUgaW5zdGFuY2UgdmFyIj8NCg0KIyMjIGB8fD1gIGlkaW9tDQoNClRoZSBjb21tb24g aWRpb20gZm9yIGNhY2hpbmcgaXMgYHx8PWA6DQpgYGBydWJ5DQpkZWYgd29yZHMoKT0gQHdvcmRz IHx8PSB0b2tlbnMuc2VsZWN0KCY6d29yZD8pDQpgYGANCg0KSXQgaGFzIGl0cyBkcmF3YmFja3Ms IHRob3VnaDoNCjEuIGRvZXNuJ3Qgc3VpdCBtZXRob2RzIHRoYXQgY2FuIHJldHVybiBgZmFsc2Vg IG9yIGBuaWxgIChsaWtlIGBzZXJ2aWNlP2ApDQoyLiBoYXJkZXIgdG8gdXNlIHdpdGggbWV0aG9k cyB0aGF0IG5lZWQgc2V2ZXJhbCBzdGF0ZW1lbnRzIHRvIGNhbGN1bGF0ZSB0aGUgZW5kIHJlc3Vs dA0KMy4gaXQgbWl4ZXMgdGhlIGNvbmNlcm5zIG9mICJob3cgaXQgaXMgY2FsY3VsYXRlZCIgYW5k ICJpdCBpcyBtZW1vaXplZCIgKGxvb2tpbmcgYXQgdGhlIG1ldGhvZCdzIGNvZGUsIHlvdSBkb24n dCBpbW1lZGlhdGVseSBrbm93IGlmIHRoZSB2YXJpYWJsZSBpcyB1c2VkIG9ubHkgZm9yIG1lbW9p emF0aW9uLCBvciBpdCBjb3VsZCd2ZSBiZWVuIHNldCBlbHNld2hlcmUsIGFuZCBoZXJlIHdlIGp1 c3QgcHJvdmlkaW5nIGRlZmF1bHQgdmFsdWUpDQo0LiBpdCBwb2xsdXRlcyB0aGUgb2JqZWN0J3Mg ZGF0YSByZXByZXNlbnRhdGlvbg0KDQoxLTIgaXMgdHlwaWNhbGx5IGFkdmlzZWQgdG8gc29sdmUg d2l0aCBhIGxlc3MgZWxlZ2FudCBidXQgZnV0dXJlcHJvb2Ygc29sdXRpb24gKHdoaWNoIGFsc28g bWFrZXMgaXQgaW1wb3NzaWJsZSB0byBkZWZpbmUgaW4gb25lLWxpbmUgbWV0aG9kcywgZXZlbiBp ZiB0aGUgbWFpbiBjb2RlIGlzIHNob3J0KToNCg0KYGBgcnVieQ0KZGVmIGVtcHR5Pw0KICByZXR1 cm4gQGVtcHR5IGlmIGRlZmluZWQ/KEBlbXB0eSkNCg0KICBAZW1wdHkgPSB0b2tlbnMuYWxsPygm OndoaXRlc3BhY2U/KQ0KZW5kDQpgYGANCg0KQWJvdXQgNDogd2hpbGUgdXNpbmcgdGhpcyBzb2x1 dGlvbiwgd2UnbGwgaGF2ZSBhIGxvdCBvZiBpbnN0YW5jZSB2YXJzICh0aGF0IGFyZSBkZXJpdmF0 aXZlIGFuZCBsb2dpY2FsbHkgbm90IHRoZSBwYXJ0IG9mIG9iamVjdCdzIHN0YXRlKSBub3cgdmlz aWJsZSBpbiBkZWZhdWx0IGAjaW5zcGVjdGAgYW5kIHNlcmlhbGl6YXRpb246DQpgYGBydWJ5DQpz ID0gU2VudGVuY2UubmV3KCdSdWJ5IGlzIGNvb2wnKQ0KcCBzDQojICM8U2VudGVuY2U6MHgwMDAw N2ZlMjFkOGZkMTM4IEB0ZXh0PSJSdWJ5IGlzIGNvb2wiPg0KcHV0cyBzLnRvX3lhbWwNCiMgLS0t ICFydWJ5L29iamVjdDpTZW50ZW5jZQ0KIyB0ZXh0OiBSdWJ5IGlzIGNvb2wNCnAgcy5lbXB0eT8N CiMgZmFsc2UNCnAgcw0KIyAjPFNlbnRlbmNlOjB4MDAwMDdmZTIxZDhmZDEzOCBAdGV4dD0iUnVi eSBpcyBjb29sIiwgQGVtcHR5PWZhbHNlPg0KcHV0cyBzLnRvX3lhbWwNCiMgLS0tICFydWJ5L29i amVjdDpTZW50ZW5jZQ0KIyB0ZXh0OiBSdWJ5IGlzIGNvb2wNCiMgZW1wdHk6IGZhbHNlDQpgYGAN Cg0KIyMjIEV4aXN0aW5nIG1lbW9pemF0aW9uIGxpYnJhcmllcw0KDQpUaGVyZSBhcmUgc2V2ZXJh bCB3ZWxsLWtub3duIG1lbW9pemF0aW9uIGxpYnJhcmllcyBvdXQgdGhlcmUsIHRvIG5hbWUgYSBj b3VwbGU6IG9sZCBhbmQgcmVsaWFibGUgW21lbW9pc3RdKGh0dHBzOi8vZ2l0aHViLmNvbS9tYXR0 aGV3cnVkeS9tZW1vaXN0KSwgbmV3IGFuZCBlZmZpY2llbnQgW21lbW9fd2lzZV0oaHR0cHM6Ly9n aXRodWIuY29tL3Bhbm9yYW1hLWVkL21lbW9fd2lzZSkuDQoNClRoZXkgc29sdmUgcHJvYmxlbXMg MS0zIG9mIGB8fD1gLCBhbmQgYWxzbyBhZGQgc2V2ZXJhbCBjb29sIGZlYXR1cmVzIChsaWtlIGFy Z3VtZW50LWRlcGVuZGVudCBtZW1vaXphdGlvbikgd2l0aCBhIG1hY3JvICh0aGlzIGlzIGBtZW1v X3dpc2VgLCBgbWVtb2lzdGAgYmVoYXZlcyB0aGUgc2FtZSwganVzdCBkaWZmZXJlbnQgbWFjcm8g bmFtZSk6DQoNCmBgYHJ1YnkNCmNsYXNzIFNlbnRlbmNlDQogIHByZXBlbmQgTWVtb1dpc2UNCiAg IyAuLi4NCiAgbWVtb193aXNlIGRlZiBlbXB0eT8oKSA9IHRva2Vucy5hbGw/KDp3aGl0ZXNwYWNl PykNCmVuZA0KYGBgDQoNCk5vdyB3ZSBoYXZlIGEgbmljZSBkZWNsYXJhdGl2ZSBhbmQgZGVjb3Vw bGVkIHN0YXRlbWVudCAiaXQgaXMgbWVtb2l6ZWQiLCB3aGljaCBhbHNvIHN1cHBvcnRzIGJvb2xl YW5zIGFuZCBgbmlsYHMgYW5kIG11bHRpLXN0YXRlbWVudCBtZXRob2RzLg0KDQpUaGUgcHJvYmxl bSBvZiAiZGV0YWlsIGxlYWtpbmciIGlzbid0IHNvbHZlZCwgdGhvdWdoOg0KYGBgcnVieQ0KcCBz LmVtcHR5Pw0KIyBmYWxzZQ0KcCBzDQojICM8U2VudGVuY2U6MHgwMDAwN2YwZjQ3NGViNDE4IEBf bWVtb193aXNlPXs6ZW1wdHk/PT5mYWxzZX0sIEB0ZXh0PSJSdWJ5IGlzIGNvb2wiPg0KcHV0cyBz LnRvX3lhbWwNCiMgLS0tICFydWJ5L29iamVjdDpTZW50ZW5jZQ0KIyBfbWVtb193aXNlOg0KIyAg IDplbXB0eT86IGZhbHNlDQojIHRleHQ6IFJ1YnkgaXMgY29vbA0KYGBgDQoNCkFsc28sIHVzaW5n IHRoaXJkLXBhcnR5IGdlbXMgaW50cm9kdWNlcyBhIGZldyBuZXcgcHJvYmxlbXM6DQoxLiBQZXJm b3JtYW5jZSBwZW5hbHR5LiBIb3dldmVyIHdlbGwgaXQgaXMgb3B0aW1pemVkLCBSdWJ5LWxhbmQg InJlZGVmaW5lIG1ldGhvZCwgdGhlbiBjaGVjayBpdCBpcyB0aGVyZSwgdGhlbiBjYWxjdWxhdGUi IGhhcyBub3QgemVybyBvdmVyaGVhZC4NCjIuIERlcGVuZGVuY3kgcGVuYWx0eS4gSWYgdGhlIG1l bW9pemluZyBnZW0gaXMgbm90IGluIHRoZSBwcm9qZWN0IHlldCwgaXQgaXMgYSBkZWNpc2lvbiB3 aGV0aGVyIHRvIGludHJvZHVjZSBpdCBvciBub3QgYW5kIGZvciBzbWFsbCBuby1kZXBlbmRlbmNp ZXMgZ2VtcyBvciBmb3IgdGhlIHN0cmljdGx5LWNvbnRyb2xsZWQgY29kZWJhc2UsIGl0IG1pZ2h0 IGJlIGEgcHJvYmxlbS4gQWxzbywgZG9pbmcgYHByZXBlbmQgTWVtb1dpc2VgIChvciBgZXh0ZW5k IE1lbW9pc3RgKSBpcyBhbm90aGVyIHBvaW50IHdoZXJlIHRoZSBxdWVzdGlvbiAic2hvdWxkIEkg aW50cm9kdWNlIHRoaXMgZGVwZW5kZW5jeT8iIGFyaXNlcyAoaW4gYSBzbWFsbCBjbGFzcyB3aXRo IGV4YWN0bHkgb25lIG1ldGhvZCB0byBtZW1vaXplLCBmb3IgZXhhbXBsZSEpDQoNCiMjIEZlYXR1 cmUgcHJvcG9zYWwgJiBEZXNpZ24gZGVjaXNpb25zDQoNCkkgcHJvcG9zZSB0byBpbnRyb2R1Y2Ug dGhlIGBNb2R1bGUjbWVtb2l6ZWQoKnN5bWJvbHMpYCBtZXRob2QgaW4gdGhlIGNvcmUsIGltcGxl bWVudGVkIGluIEMuDQoNCjEuIE5hbWU6IGBtZW1vaXplYCBpcyBhIHR5cGljYWwgbmFtZSB0aGF0 IHRoZSBjb21tdW5pdHkgaXMgdXNlZCB0by4gSSB3YW50IHRoZSBuZXcgbWV0aG9kIHRvIGxvb2sg dW5pZm9ybSB3aXRoIG90aGVyIGV4aXN0aW5nICJtYWNyb3MiIHRoYXQgaGF2ZSB3b3JkaW5nIHN1 aXRhYmxlIGZvciB0aGUgcGhyYXNlICJ0aGlzIG1ldGhvZCBpcyB7d29yZH0iOiBgcHJpdmF0ZWAg b3IgYG1vZHVsZV9mdW5jdGlvbmA7IHRoYXQncyB3aHkgSSBwcm9wb3NlIHRoZSBuYW1lIGBtZW1v aXplZGANCjIuIEkgYmVsaWV2ZSB0aGF0IHRoZSBtZW1vaXNhdGlvbiBzaG91bGQgYmUgZnVsbHkg b3BhcXVlOiBub3QgdmlzaWJsZSBvbiBgI2luc3BlY3RgIG9yIHNlcmlhbGl6YXRpb247IG5vIHNl dHRpbmdzIG9yIEFQSSB0byBpbnRlcmFjdCB3aXRoIHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiBtZW1v aXphdGlvbi4NCjMuIE9ubHkgYXJndW1lbnQtbGVzcyBtZXRob2RzIGFyZSBtZW1vaXphYmxlLCBg bWVtb2l6ZSBkZWYgZm9vKGFueSwgYXJncylgIHNob3VsZCByYWlzZSBhbiBleGNlcHRpb24NCjQu IChOb3Qgc3VyZSBhYm91dCB0aGF0IG9uZSkgIk1lbW9pc2VkIiBzdGF0ZSBvZiB0aGUgbWV0aG9k IHNob3VsZCBiZSBpbmhlcml0YWJsZS4gUHJvYmFibHkgd2UgbWlnaHQgbmVlZCBhIHN5bW1ldHJp YyBgdW5tZW1vaXplZCA6Zm9vYCB0byBvdmVyd3JpdGUgdGhhdCBpbiBkZXNjZW5kYW50cy4NCg0K IyMjIE5vbi1mZWF0dXJlcw0KDQpUaGVyZSBhcmUgc2V2ZXJhbCBtb3JlIGZlYXR1cmVzIHR5cGlj YWxseSBzZWVuIGluIG1lbW9pemF0aW9uIGdlbXMgY29uc2lkZXJlZCB1bnN1aXRhYmxlIGZvciBj b3JlIGZ1bmN0aW9uYWxpdHk6DQoNCiogTm8gYXJndW1lbnRzLWRlcGVuZGVudCBtZW1vaXphdGlv bi4gSSBiZWxpZXZlIGl0IGlzIGEgImJ1c2luZXNzIGxvZ2ljIiBjb25jZXJuOiBob3cgZXhhY3Rs eSB0aGUgYXJndW1lbnRzIHNob3VsZCBiZSBzdG9yZWQsIGNhY2hlIGdyb3d0aCBjb250cm9sICh3 aXRoIHRvbyBtYW55IGFyZ3VtZW50LXJlc3VsdCBwYWlycyBtZW1vaXplZCksIGNhY2hlIGNsZWFu dXAsIGV0Yy4gVGhpcmQtcGFydHkgbGlicmFyaWVzIGNhbiBoYW5kbGUgdGhhdC4NCiogTm8gY2Fj aGUgcHJlc2V0dGluZy9yZXNldHRpbmcgQVBJLiBJZiAiaXQgaXMgbWVtb2l6ZWQgaW4gZ2VuZXJh bCwgYnV0IHNvbWV0aW1lcyByZXNldCIsIGl0IGlzIGFnYWluIGEgYnVzaW5lc3MtbGF5ZXIgY29u Y2VybiBhbmQgc2hvdWxkbid0IGJlIHNvbHZlZCBieSBhIGxhbmd1YWdlLWxldmVsIGRlY2xhcmF0 aW9uLiBUaGlyZC1wYXJ0eSBsaWJyYXJpZXMgY2FuIGhhbmRsZSB0aGF0Lg0KKiBObyBleHRyYSBB UEkgdG8gbWVtb2l6ZSBjbGFzcyBtZXRob2RzLCBsaWtlIHdlIGRvbid0IGhhdmUgYSBzcGVjaWZp YyBBUEkgZm9yIG1ha2luZyBjbGFzcyBtZXRob2RzIHByaXZhdGUuDQoNCg0KDQoNCi0tIA0KaHR0 cHM6Ly9idWdzLnJ1YnktbGFuZy5vcmcvDQoKVW5zdWJzY3JpYmU6IDxtYWlsdG86cnVieS1jb3Jl LXJlcXVlc3RAcnVieS1sYW5nLm9yZz9zdWJqZWN0PXVuc3Vic2NyaWJlPgo8aHR0cDovL2xpc3Rz LnJ1YnktbGFuZy5vcmcvY2dpLWJpbi9tYWlsbWFuL29wdGlvbnMvcnVieS1jb3JlPgo=