[ruby-core:122673] [Ruby Feature#21262] Proposal: `Ractor::Port`
From:
"ko1 (Koichi Sasada) via ruby-core" <ruby-core@...>
Date:
2025-07-08 05:37:51 UTC
List:
ruby-core #122673
SXNzdWUgIzIxMjYyIGhhcyBiZWVuIHVwZGF0ZWQgYnkga28xIChLb2ljaGkgU2FzYWRhKS4NCg0K U3RhdHVzIGNoYW5nZWQgZnJvbSBBc3NpZ25lZCB0byBDbG9zZWQNCg0KaHR0cHM6Ly9naXRodWIu Y29tL3J1YnkvZGV2LW1lZXRpbmctbG9nL2Jsb2IvbWFzdGVyLzIwMjUvRGV2TWVldGluZy0yMDI1 LTA2LTA1Lm1kI2ZlYXR1cmUtMjEyNjItcHJvcG9zYWwtcmFjdG9ycG9ydA0KDQo+IG1hdHo6IGdv IGFoZWFkLiBJIGFncmVlIHRvIGRlbGV0ZSBSYWN0b3IjdGFrZS4NCg0KDQotLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpGZWF0dXJlICMyMTI2MjogUHJvcG9zYWw6IGBS YWN0b3I6OlBvcnRgDQpodHRwczovL2J1Z3MucnVieS1sYW5nLm9yZy9pc3N1ZXMvMjEyNjIjY2hh bmdlLTExMzk1Mw0KDQoqIEF1dGhvcjoga28xIChLb2ljaGkgU2FzYWRhKQ0KKiBTdGF0dXM6IENs b3NlZA0KKiBBc3NpZ25lZToga28xIChLb2ljaGkgU2FzYWRhKQ0KKiBUYXJnZXQgdmVyc2lvbjog My41DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIFByb3Bvc2Fs OiBgUmFjdG9yOjpQb3J0YA0KDQpJbiBjb25jdXJyZW50IFJ1YnkgYXBwbGljYXRpb25zIHVzaW5n IFJhY3RvcnMsIHNhZmVseSBhbmQgZWZmaWNpZW50bHkgY29tbXVuaWNhdGluZyByZXN1bHRzIGJl dHdlZW4gUmFjdG9ycyBpcyBhIGNvbW1vbiBjaGFsbGVuZ2UuIFdlIHByb3Bvc2UgYFJhY3Rvcjo6 UG9ydGAgYXMgYSBsaWdodHdlaWdodCwgc2FmZSwgYW5kIGVyZ29ub21pYyBhYnN0cmFjdGlvbiB0 byBzaW1wbGlmeSBjb21tdW5pY2F0aW9uIHBhdHRlcm5zLCBlc3BlY2lhbGx5IGluIHJlcXVlc3Qt cmVzcG9uc2UgbW9kZWxzLg0KDQpgYGBydWJ5DQojIHVzYWdlIGV4YW1wbGUNCg0KcG9ydCA9IFJh Y3Rvcjo6UG9ydC5uZXcNCg0KUmFjdG9yLm5ldyBwb3J0IGRvIHxwb3J0fA0KICBwb3J0IDw8IDQy DQogIHBvcnQgPDwgNDMNCmVuZA0KDQojIFN1Y2Nlc3M6IHdhaXQgZm9yIHNlbmRpbmcNCnBvcnQu cmVjZWl2ZSAjPT4gNDINCg0KUmFjdG9yLm5ldyBwb3J0IGRvIHxwb3J0fA0KICBwb3J0LnJlY2Vp dmUgIyBFcnJvcjogb25seSB0aGUgY3JlYXRvciBSYWN0b3IgY2FuIHJlY2VpdmUgZnJvbSB0aGlz IHBvcnQuDQplbmQNCg0KcG9ydC5yZWNlaXZlICM9PiA0Mw0KYGBgDQoNClRoaXMgaXMgYSBzaW1p bGFyIGNvbmNlcHQgdG8gWyJDaGFubmVsIl0oaHR0cHM6Ly9idWdzLnJ1YnktbGFuZy5vcmcvaXNz dWVzLzIxMTIxKSwgYnV0IGl0IGlzIHRpZ2h0bHkgY291cGxlZCB3aXRoIHRoZSBjcmVhdG9yIFJh Y3RvciBhbmQgbm8gb3RoZXIgUmFjdG9ycyBjYW4gcmVjZWl2ZSBhbnl0aGluZyBmcm9tIHRoYXQg cG9ydC4NCg0KSW4gdGhhdCBzZW5zZSwgaXQgaXMgY29uY2VwdHVhbGx5IGNsb3NlciB0byBhIHNv Y2tldCBmaWxlIGRlc2NyaXB0b3IgKGUuZy4sIGEgZGVzdGluYXRpb24gYW5kIHBvcnQgbnVtYmVy IHBhaXIgaW4gVENQL0lQKS4NCg0KV2UgY2FuIGltcGxlbWVudCBgUG9ydGAgd2l0aCBgUmFjdG9y LnJlY2VpdmVfaWZgIGxpa2UgdGhpczoNCg0KYGBgcnVieQ0KY2xhc3MgUmFjdG9yOjpQb3J0DQog IGRlZiBpbml0aWFsaXplDQogICAgQHIgPSBSYWN0b3IuY3VycmVudA0KICAgIEB0YWcgPSBnZW5p ZCgpDQogIGVuZA0KDQogIGRlZiBzZW5kIG9iag0KICAgIEByIDw8IFtAdGFnLCBvYmpdDQogIGVu ZA0KDQogIGRlZiByZWNlaXZlDQogICAgcmFpc2UgdW5sZXNzIEByID09IFJhY3Rvci5jdXJyZW50 DQoNCiAgICBSYWN0b3IucmVjZWl2ZV9pZiBkbyB8KHRhZywgcmVzdWx0KQ0KICAgICAgaWYgdGFn ID09IEB0YWcNCiAgICAgICAgcmV0dXJuIHJlc3VsdA0KICAgICAgZW5kDQogICAgZW5kDQogIGVu ZA0KZW5kDQpgYGANCg0KV2l0aCBgUmFjdG9yOjpQb3J0YCwgd2UgY2FuIGRlcHJlY2F0ZSBgUmFj dG9yLnJlY2VpdmVfaWZgLCBgUmFjdG9yLnlpZWxkYCwgYW5kIGBSYWN0b3IjdGFrZWAuIFBvcnRz IGFjdCBhcyBjbGVhciwgc2VsZi1jb250YWluZWQgZW5kcG9pbnRzIGZvciBtZXNzYWdlIHBhc3Np bmcsIHdoaWNoIG1ha2VzIHRoZXNlIG9sZGVyIHByaW1pdGl2ZXMgcmVkdW5kYW50LiBGdXJ0aGVy bW9yZSwgUG9ydC1iYXNlZCBjb21tdW5pY2F0aW9uIGlzIHNpZ25pZmljYW50bHkgZWFzaWVyIHRv IGltcGxlbWVudCBhbmQgcmVhc29uIGFib3V04oCUZXNwZWNpYWxseSB3aGVuIGNvbnNpZGVyaW5n IHN5bmNocm9uaXphdGlvbiBjaGFsbGVuZ2VzIGFyb3VuZCBgUmFjdG9yLnNlbGVjdGAgYW5kIHJl bmRlenZvdXMgc2VtYW50aWNzLg0KDQojIyBCYWNrZ3JvdW5kOiBMaW1pdGF0aW9ucyBvZiBjdXJy ZW50IGNvbW11bmljYXRpb24gcGF0dGVybnMNCg0KTGV0J3MgZGlzY3VzcyBob3cgdG8gbWFrZSBz ZXJ2ZXItbGlrZSBzZXJ2aWNlIHJhY3RvcnMuDQoNCiMjIyBObyByZXNwb25zZSBzZXJ2ZXINCg0K V2UgY2FuIG1ha2Ugc2VydmVyLWxpa2UgUmFjdG9ycyBsaWtlIHRoaXM6DQoNCmBgYHJ1YnkNCiMg RVgxDQoNCmRlZiBmaWIobikgPSBuID4gMSA6IGZpYihuLTIpICsgZmliKG4tMSkgOiAxDQoNCiMg QSByYWN0b3IgY2FsY3VsYXRlIGZpYihuKQ0KZmliX3NydiA9IFJhY3Rvci5uZXcgZG8NCiAgd2hp bGUgdHJ1ZQ0KICAgIHBhcmFtID0gUmFjdG9yLnJlY2VpdmUNCiAgICByZXN1bHQgPSBmaWIocGFy YW0pDQogIGVuZA0KZW5kDQoNCmZpYl9zcnYgPDwgMTANCmBgYA0KDQpJbiB0aGlzIGNhc2UsIHRo ZSBtYWluIFJhY3RvciByZXF1ZXN0cyBgZmliX3NydmAgdG8gY2FsY3VsYXRlIGBmaWIoMTApYC4N Ckhvd2V2ZXIsIGN1cnJlbnRseSwgdGhlcmUgaXMgbm8gd2F5IHRvIHJldHJpZXZlIHRoZSByZXN1 bHQuDQoNCiMjIyBSZXR1cm4gdmFsdWUgdG8gdGhlIHNlbmRlciByYWN0b3INCg0KVGhlcmUgYXJl IHNldmVyYWwgcG9zc2libGUgYXBwcm9hY2hlcy4NCg0KRmlyc3QsIHdlIGNhbiBzZW5kIHRoZSBz ZW5kZXIgUmFjdG9yIGFsb25nIHdpdGggdGhlIHBhcmFtZXRlciwgYW5kIGFzayB0aGUgc2VydmVy IHRvIHNlbmQgdGhlIHJlc3VsdCBiYWNrIHRvIHRoZSBzZW5kZXIuDQoNCmBgYHJ1YnkNCiMgRVgy DQoNCmZpYl9zcnYgPSBSYWN0b3IubmV3IGRvDQogIHdoaWxlIHRydWUNCiAgICBwYXJhbSwgc2Vu ZGVyID0gUmFjdG9yLnJlY2VpdmUNCiAgICByZXN1bHQgPSBmaWIocGFyYW0pDQogICAgc2VuZGVy IDw8IHJlc3VsdA0KICBlbmQNCmVuZA0KDQpmaWJfc3J2IDw8IFsxMCwgUmFjdG9yLmN1cnJlbnRd DQoNCmRvX3NvbWVfd29yaygpDQoNClJhY3Rvci5yZWNlaXZlICM9PiBmaWIoMTApDQpgYGANCg0K VGhpcyBhcHByb2FjaCB3b3JrcyB3ZWxsIGluIHNpbXBsZSBjYXNlcy4NCg0KSG93ZXZlciwgd2l0 aCBFWDIsIGhhbmRsaW5nIG11bHRpcGxlIGNvbmN1cnJlbnQgcmVzcG9uc2VzIGJlY29tZXMgZGlm ZmljdWx0LiBUaGUgcmVzdWx0cyBhcmUgcHVzaGVkIGludG8gdGhlIHNhbWUgbWFpbGJveCwgYW5k IHNpbmNlIGBSYWN0b3IucmVjZWl2ZWAgcmV0cmlldmVzIG1lc3NhZ2VzIHdpdGhvdXQgZGlzY3Jp bWluYXRpbmcgdGhlIHNvdXJjZSwgaXQncyB1bmNsZWFyIHdoaWNoIHNlcnZlciByZXR1cm5lZCB3 aGljaCByZXN1bHQuDQoNCmBgYHJ1YnkNCiMgRVgzDQoNCmRlZiBmYWN0KG4pID0gbiA+IDEgOiBm YWN0KG4tMSkgKiBuDQoNCmZpYl9zcnYgPSBSYWN0b3IubmV3IGRvDQogIHdoaWxlIHRydWUNCiAg ICBwYXJhbSwgc2VuZGVyID0gUmFjdG9yLnJlY2VpdmUNCiAgICByZXN1bHQgPSBmaWIocGFyYW0p DQogICAgc2VuZGVyIDw8IHJlc3VsdA0KICBlbmQNCmVuZA0KDQpmYWN0X3NydiA9IFJhY3Rvci5u ZXcgZG8NCiAgd2hpbGUgdHJ1ZQ0KICAgIHBhcmFtLCBzZW5kZXIgPSBSYWN0b3IucmVjZWl2ZQ0K ICAgIHJlc3VsdCA9IGZhY3QocGFyYW0pDQogICAgc2VuZGVyIDw8IHJlc3VsdA0KICBlbmQNCmVu ZA0KDQoNCmZpYl9zcnYgPDwgWzEwLCBSYWN0b3IuY3VycmVudF0NCmZpYl9zcnYgPDwgWzIwLCBS YWN0b3IuY3VycmVudF0NCmZhY3Rfc3J2IDw8IFsxMCwgUmFjdG9yLmN1cnJlbnRdDQpmYWN0X3Ny diA8PCBbMjAsIFJhY3Rvci5jdXJyZW50XQ0KDQpkb19zb21lX3dvcmsoKQ0KDQpSYWN0b3IucmVj ZWl2ZQ0KIz0+IGZpYigxMCkgb3IgZmFjdCgxMCksIHdoaWNoPw0KIyAgIElmIHRoZSBzZXJ2ZXJz IHVzZXMgUmFjdG9ycyBtb3JlIChjYWxjdWxhdGUgdGhlbSBpbiBwYXJhbGxlbCksDQojICAgZmli KDIwKSBhbmQgZmFjdCgyMCkgY2FuIGJlIHJldHVybmVkLg0KYGBgDQoNCkJlY2F1c2UgYFJhY3Rv ci5yZWNlaXZlYCByZXRyaWV2ZXMgYWxsIG1lc3NhZ2VzIGluZGlzY3JpbWluYXRlbHksIGRldmVs b3BlcnMgbXVzdCBhZGQgdGhlaXIgb3duIHRhZ2dpbmcgbG9naWMgdG8gZGlzdGluZ3Vpc2ggcmVz dWx0cy4gV2hpbGUgdGFnZ2luZyAoYXMgc2hvd24gaW4gRVg0KSBoZWxwcywgaXQgaW50cm9kdWNl cyBhZGRpdGlvbmFsIGNvbXBsZXhpdHkgYW5kIGJyaXR0bGVuZXNzLg0KDQojIyMgUmVzcG9uc2Vz IHdpdGggcmVxdWVzdCBJRA0KDQpUaGUgZm9sbG93aW5nIGNvZGUgcmV0dXJucyBhIHJlc3VsdCB3 aXRoIHJlcXVlc3QgaWQgKGEgcGFpciBvZiB0aGUgbmFtZSBvZiBzZXJ2ZXIgYW5kIGEgcGFyYW1l dGVyKS4NCg0KYGBgcnVieQ0KIyBFWDQNCg0KZmliX3NydiA9IFJhY3Rvci5uZXcgZG8NCiAgd2hp bGUgdHJ1ZQ0KICAgIHBhcmFtLCBzZW5kZXIgPSBSYWN0b3IucmVjZWl2ZQ0KICAgIHJlc3VsdCA9 IGZpYihwYXJhbSkNCiAgICBzZW5kZXIgPDwgW1s6ZmliLCBwYXJhbV0sIHJlc3VsdF0NCiAgZW5k DQplbmQNCg0KZmFjdF9zcnYgPSBSYWN0b3IubmV3IGRvDQogIHdoaWxlIHRydWUNCiAgICBwYXJh bSwgc2VuZGVyID0gUmFjdG9yLnJlY2VpdmUNCiAgICByZXN1bHQgPSBmYWN0KHBhcmFtKQ0KICAg IHNlbmRlciA8PCBbWzpmYWN0LCBwYXJhbV0sIHJlc3VsdF0NCiAgZW5kDQplbmQNCg0KZmliX3Ny diA8PCBbMTAsIFJhY3Rvci5jdXJyZW50XQ0KZmliX3NydiA8PCBbMjAsIFJhY3Rvci5jdXJyZW50 XQ0KZmFjdF9zcnYgPDwgWzEwLCBSYWN0b3IuY3VycmVudF0NCmZhY3Rfc3J2IDw8IFsyMCwgUmFj dG9yLmN1cnJlbnRdDQoNCmRvX3NvbWVfd29yaygpDQoNClJhY3Rvci5yZWNlaXZlX2lmIGRvIHxp ZCwgcmVzdWx0fA0KICBjYXNlIGlkDQogIGluIFs6ZmliLCBuXQ0KICAgIHAgImZpYigje259KSA9 ICN7cmVzdWx0fSINCiAgaW4gWzpmYWN0LCBuXQ0KICAgIHAgImZhY3QoI3tufSkgPSAje3Jlc3Vs dH0iDQogIGVuZA0KZW5kDQoNCiMgb3IgaWYgeW91IHdhbnQgdG8gdXNlIHNwZWNpZmljIHJlc3Vs dHMsIGxpa2U6DQoNCnAgZmliMjA6ICBSYWN0b3IucmVjZWl2ZV9pZnt8aWQsIHJlc3VsdHwgaWQg PT4gWzpmaWIsIDIwXTsgIHJlc3VsdH0NCnAgZmFjdDEwOiBSYWN0b3IucmVjZWl2ZV9pZnt8aWQs IHJlc3VsdHwgaWQgPT4gWzpmYWN0LCAxMF07IHJlc3VsdH0NCnAgZmFjdDIwOiBSYWN0b3IucmVj ZWl2ZV9pZnt8aWQsIHJlc3VsdHwgaWQgPT4gWzpmYWN0LCAyMF07IHJlc3VsdH0NCnAgZmliMTA6 ICBSYWN0b3IucmVjZWl2ZV9pZnt8aWQsIHJlc3VsdHwgaWQgPT4gWzpmaWIsIDEwXTsgIHJlc3Vs dH0NCmBgYA0KDQpUaGlzIGFwcHJvYWNoIGNsb3NlbHkgcmVzZW1ibGVzIHBhdHRlcm4gbWF0Y2hp bmcgaW4gRXJsYW5nIG9yIEVsaXhpciwgd2hlcmUgcmVzcG9uc2VzIGFyZSB0YWdnZWQgYW5kIG1h dGNoZWQgc3RydWN0dXJhbGx5Lg0KDQpIb3dldmVyLCB0aGlzIHNvbHV0aW9uIHN0aWxsIGhhcyBh biBpc3N1ZTogaWYgYGRvX3NvbWVfd29yaygpYCB1c2VzIGBSYWN0b3IucmVjZWl2ZWAsIGl0IG1h eSBhY2NpZGVudGFsbHkgY29uc3VtZSBhbnkgbWVzc2FnZS4gSW4gb3RoZXIgd29yZHMsIGBSYWN0 b3IucmVjZWl2ZWAgY2FuIG9ubHkgYmUgc2FmZWx5IHVzZWQgd2hlbiB5b3UncmUgY2VydGFpbiB0 aGF0IG5vIG90aGVyIGNvZGUgaXMgdXNpbmcgaXQuDQoNCihBbm90aGVyIHRyaXZpYWwgaXNzdWUg aXMsIGRpZmZlcmVudCBzZXJ2ZXJzIGNhbiByZXR1cm4gc2FtZSBpZGVudGl0eSwgbGlrZSBgWzpm YWN0LCBudW1dYCByZXR1cm5lZCBieSBOZXdzUGFwZXIgc2VydmVyLiBJdCBpcyBjb25mdXNpbmcp Lg0KDQoNCiMjIyBVc2luZyBjaGFubmVscw0KDQpUbyBzb2x2ZSB0aGlzIGlzc3VlLCB3ZSBjYW4g bWFrZSBhIGNoYW5uZWwgd2l0aCBkaWZmZXJlbnQgUmFjdG9ycy4NCg0KQ2hhbm5lbHMgY2FuIGJl IGltcGxlbWVudGVkIHVzaW5nIFJhY3RvcnMsIGFzIGlsbHVzdHJhdGVkIGJlbG93Lg0KDQpgYGBy dWJ5DQojIEVYNQ0KDQojIFNlcnZlcnMgYXJlIGNvbXBsZXRlbHkgc2FtZSB0byBFWDMNCg0KZmli X3NydiA9IFJhY3Rvci5uZXcgZG8NCiAgd2hpbGUgdHJ1ZQ0KICAgIHBhcmFtLCBzZW5kZXIgPSBS YWN0b3IucmVjZWl2ZQ0KICAgIHJlc3VsdCA9IGZpYihwYXJhbSkNCiAgICBzZW5kZXIgPDwgcmVz dWx0DQogIGVuZA0KZW5kDQoNCmZhY3Rfc3J2ID0gUmFjdG9yLm5ldyBkbw0KICB3aGlsZSB0cnVl DQogICAgcGFyYW0sIHNlbmRlciA9IFJhY3Rvci5yZWNlaXZlDQogICAgcmVzdWx0ID0gZmFjdChw YXJhbSkNCiAgICBzZW5kZXIgPDwgcmVzdWx0DQogIGVuZA0KZW5kDQoNCiMgQ3JlYXRlIGEgbmV3 IGNoYW5uZWwgdXNpbmcgYSBSYWN0b3INCmRlZiBuZXdfY2hhbm5lbA0KICBSYWN0b3IubmV3IGRv DQogICAgd2hpbGUgdHJ1ZQ0KICAgICAgUmFjdG9yLnlpZWxkIFJhY3Rvci5yZWNlaXZlDQogICAg ZW5kDQogIGVuZA0KZW5kDQoNCg0KZmliX3NydiA8PCBbMTAsIGZpYjEwX2NoID0gbmV3X2NoYW5u ZWxdDQpmaWJfc3J2IDw8IFsyMCwgZmliMjBfY2ggPSBuZXdfY2hhbm5lbF0NCmZhY3Rfc3J2IDw8 IFsxMCwgZmFjdDEwX2NoID0gbmV3X2NoYW5uZWxdDQpmYWN0X3NydiA8PCBbMjAsIGZhY3QyMF9j aCA9IG5ld19jaGFubmVsXQ0KDQpkb19zb21lX3dvcmsoKQ0KDQpwIGZpYjIwOiBmaWIyMF9jaC50 YWtlICAgIyB3YWl0IGZvciBmaWIoMjApDQpwIGZhY3QxMDogZmFjdDEwX2NoLnRha2UgIyB3YWl0 IGZvciBmYWN0KDEwKQ0KcCBmaWIxMDogZmliMTBfY2gudGFrZSAgICMgd2FpdCBmb3IgZmliKDEw KQ0KcCBmYWN0MjA6IGZhY3QxMF9jaC50YWtlICMgd2FpdCBmb3IgZmFjdCgyMCkNCg0KIyBvciAN CmNocyA9IFtmaWIxMF9jaCwgZmliMjBfY2gsIGZhY3QxMF9jaCwgZmFjdDIwX2NoXQ0KDQp3aGls ZSAhY2hzLmVtcHR5Pw0KICBjaCwgcmVzdWx0ID0gUmFjdG9yLnNlbGVjdCgqY2hzKSAjIHdhaXQg Zm9yIG11bHRpcGxlIGNoYW5uZWxzDQogIHAgY2gsIHJlc3VsdA0KICBjaHMuZGVsZXRlIGNoDQpl bmQNCmBgYA0KDQpDaGFubmVsIGFwcHJvYWNoIHNvbHZlcyB0aGUgaXNzdWUgb2YgRVg0LiBUaGUg YWJvdmUgaW1wbGVtZW50YXRpb24gaW50cm9kdWNlIHNvbWUgb3ZlcmhlYWQgdG8gY3JlYXRlIGNo YW5uZWwgcmFjdG9ycywgYnV0IHdlIGNhbiBpbnRyb2R1Y2Ugc3BlY2lhbCBpbXBsZW1lbnRhdGlv biB0byByZWR1Y2UgdGhpcyBSYWN0b3IgY3JlYXRpb24gb3ZlcmhlYWQuDQoNCkhvd2V2ZXIsIGlu IHRoZSBBY3RvciBtb2RlbCwgdGhlIGNvbW11bmljYXRpb24gcGF0dGVybiBpcyB0byBzZW5kIGEg bWVzc2FnZSB0byBhIHNwZWNpZmljIGFjdG9yLiBJbiBjb250cmFzdCwgY2hhbm5lbHMgYXJlIHVz ZWQgdG8gc2VuZCBtZXNzYWdlcyB0aHJvdWdoIGEgc2hhcmVkIGNvbmR1aXQsIHdpdGhvdXQgY2Fy aW5nIHdoaWNoIHJlY2VpdmVyIChpZiBhbnkpIGhhbmRsZXMgdGhlIG1lc3NhZ2UuIEFsc28sIGNo YW5uZWxzIGNhbiBoYXZlIHNvbWUgb3ZlcmhlYWQsIGFzIGRpc2N1c3NlZCBiZWxvdy4NCg0KIyMj IFN1bW1hcnkgb2YgYmFja2dyb3VuZA0KDQpDdXJyZW50bHksIHdoZW4gaW1wbGVtZW50aW5nIHJl cXVlc3QtcmVzcG9uc2UgcGF0dGVybnMgd2l0aCBSYWN0b3JzLCBkZXZlbG9wZXJzIGZhY2UgY2hh bGxlbmdlcyBpbiB0cmFja2luZyByZXN1bHRzLCBtYW5hZ2luZyBpZGVudGlmaWVycywgYW5kIGF2 b2lkaW5nIG1lc3NhZ2UgY29uZmxpY3RzLiBFeGlzdGluZyBwcmltaXRpdmVzIGxpa2UgYHJlY2Vp dmVfaWZgLCBgdGFrZWAsIG9yIGNoYW5uZWxzIGltcGxlbWVudGVkIHdpdGggUmFjdG9ycyBhcmUg ZWl0aGVyIGVycm9yLXByb25lIG9yIGluZWZmaWNpZW50Lg0KDQojIyBQcm9wb3NhbA0KDQpJbnRy b2R1Y2UgYFJhY3Rvcjo6UG9ydGAgYXMgYW4gYWx0ZXJuYXRpdmUgdG8gY2hhbm5lbHMuIEl0IGlz IGEgbmF0dXJhbCBleHRlbnNpb24gb2YgdGhlIEFjdG9yIG1vZGVsLiBJbiBmYWN0LCBpdCBpcyB0 aGluIHdyYXBwZXIgb2YgY3VycmVudCBzZW5kL3JlY2VpdmUgbW9kZWwgYXMgaWxsdXN0cmF0ZWQg YXQgdGhlIHRvcCBvZiB0aGlzIHByb3Bvc2FsLg0KDQpXaXRoIHRoZSBgUmFjdG9yOjpQb3J0YCwg d2UgY2FuIHJld3JpdGUgYWJvdmUgZXhhbXBsZXMgd2l0aCBpdC4NCg0KYGBgcnVieQ0KIyBFWDYN Cg0KIyBDb21wbGV0ZWx5IHNhbWUgYXMgRVgzJ3Mgc2VydmVycw0KDQpmaWJfc3J2ID0gUmFjdG9y Lm5ldyBkbw0KICB3aGlsZSB0cnVlDQogICAgcGFyYW0sIHNlbmRlciA9IFJhY3Rvci5yZWNlaXZl DQogICAgcmVzdWx0ID0gZmliKHBhcmFtKQ0KICAgIHNlbmRlciA8PCByZXN1bHQNCiAgZW5kDQpl bmQNCg0KZmFjdF9zcnYgPSBSYWN0b3IubmV3IGRvDQogIHdoaWxlIHRydWUNCiAgICBwYXJhbSwg c2VuZGVyID0gUmFjdG9yLnJlY2VpdmUNCiAgICByZXN1bHQgPSBmYWN0KHBhcmFtKQ0KICAgIHNl bmRlciA8PCByZXN1bHQNCiAgZW5kDQplbmQNCg0KZmliX3NydiA8PCBbMTAsIGZpYjEwX3BvcnQg PSBSYWN0b3I6OlBvcnQubmV3XQ0KZmliX3NydiA8PCBbMjAsIGZpYjIwX3BvcnQgPSBSYWN0b3I6 OlBvcnQubmV3XQ0KZmFjdF9zcnYgPDwgWzEwLCBmYWN0MTBfcG9ydCA9IFJhY3Rvcjo6UG9ydC5u ZXddDQpmYWN0X3NydiA8PCBbMjAsIGZhY3QyMF9wb3J0ID0gUmFjdG9yOjpQb3J0Lm5ld10NCg0K ZG9fc29tZV93b3JrKCkNCg0KcCBmaWIxMF9wb3J0LnJlY2VpdmUgIz0+IGZpYigxMCkNCnAgZmli MjBfcG9ydC5yZWNlaXZlICM9PiBmaWIoMjApDQpwIGZhY3QxMF9wb3J0LnJlY2VpdmUgIz0+IGZh Y3QoMTApDQpwIGZhY3QyMF9wb3J0LnJlY2VpdmUgIz0+IGZhY3QoMjApDQoNCiMgb3INCg0KcG9y dHMgPSBbZmliMTBfcG9ydCwgZmliMjBfcG9ydCwgZmFjdDEwX3BvcnQsIGZhY3QyMF9wb3J0XQ0K DQp3aGlsZSAhcG9ydHMuZW1wdHk/DQogIHBvcnQsIHJlc3VsdCA9IFJhY3Rvci5zZWxlY3QoKnBv cnRzKQ0KICBjYXNlIHBvcnQNCiAgd2hlbiBmaWIxMF9wb3J0DQogICAgcCBmaWIxMDogcmVzdWx0 DQogIC4uLg0KICBlbHNlDQogICAgcmFpc2UgIlRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gKEJVRyku Ig0KICBlbmQNCg0KICBwb3J0cy5kZWxldGUocG9ydCkNCmVuZA0KYGBgDQoNCmBSYWN0b3I6OlBv cnRgIHJlc29sdmVzIGtleSBwYWluIHBvaW50cyBpbiBtZXNzYWdlIHBhc3NpbmcgYmV0d2VlbiBS YWN0b3JzOg0KDQoqIEl0IGd1YXJhbnRlZXMgdGhhdCBpbmNvbWluZyBtZXNzYWdlcyBhcmUgb25s eSBkZWxpdmVyZWQgdG8gdGhlIGludGVuZGVkIFJhY3RvciwgcHJldmVudGluZyB0YWcgY29sbGlz aW9ucy4NCiogSXQgZW5hYmxlcyBtZXNzYWdlIHJvdXRpbmcgd2l0aG91dCByZWx5aW5nIG9uIGds b2JhbCByZWNlaXZlIGJsb2NrcyAoYFJhY3Rvci5yZWNlaXZlYCksIHdoaWNoIGFyZSBwcm9uZSB0 byB1bmludGVuZGVkIGNvbnN1bXB0aW9uLg0KKiBJdCByZXBsYWNlcyBtb3JlIGNvbXBsZXggcHJp bWl0aXZlcyBsaWtlIGAucmVjZWl2ZV9pZmAsIGAueWllbGRgLCBhbmQgYCN0YWtlYCB3aXRoIGEg c2ltcGxlciwgY29tcG9zYWJsZSBhYnN0cmFjdGlvbi4NCiogSXQgbWFwcyBjbGVhbmx5IHRvIHRo ZSBBY3RvciBtb2RlbCBzZW1hbnRpY3MgUnVieSBpbnRlbmRzIHRvIHN1cHBvcnQgd2l0aCBSYWN0 b3JzLg0KDQpXaGlsZSB0aGUgcGF0dGVybiBsb29rcyBzaW1pbGFyIHRvIHVzaW5nIGNoYW5uZWxz LCB0aGUgc2VtYW50aWNzIGFuZCBndWFyYW50ZWVzIGFyZSBkaWZmZXJlbnQgaW4gbWVhbmluZ2Z1 bCB3YXlzLg0KDQpUaGUgYWR2YW50YWdlcyBvZiB1c2luZyBQb3J0cyBpbmNsdWRlOg0KDQoqIFNh ZmVyIHRoYW4gY2hhbm5lbHMgaW4gcHJhY3RpY2UNCiAgKiBXaGVuIHVzaW5nIGEgUG9ydCwgaWYg YCNzZW5kYCBzdWNjZWVkcywgaXQgbWVhbnMgdGhlIGRlc3RpbmF0aW9uIFJhY3RvciBpcyBzdGls bCBhbGl2ZSAoaS5lLiwgaXQncyBydW5uaW5nKS4NCiAgKiBJbiBjb250cmFzdCwgd2l0aCBhIGNo YW5uZWwsIHRoZXJlJ3Mgbm8gZ3VhcmFudGVlIHRoYXQgYW55IFJhY3RvciBpcyBzdGlsbCBhdmFp bGFibGUgdG8gcmVjZWl2ZSBmcm9tIGl0Lg0KICAqIE9mIGNvdXJzZSwgZXZlbiB3aXRoIGEgcG9y dCwgdGhlcmUncyBubyBndWFyYW50ZWUgdGhhdCB0aGUgZGVzdGluYXRpb24gUmFjdG9yIHdpbGwg YWN0dWFsbHkgcHJvY2VzcyB0aGUgbWVzc2FnZSDigJQgaXQgbWlnaHQgaWdub3JlIGl0Lg0KICAq IEJ1dCBhdCBsZWFzdCB5b3UgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCB0aGUgUmFjdG9yIGhh dmluZyBhbHJlYWR5IHRlcm1pbmF0ZWQgdW5leHBlY3RlZGx5Lg0KICAqIEluIG90aGVyIHdvcmRz LCB1c2luZyBhIHBvcnQgZWxpbWluYXRlcyBvbmUgbWFqb3IgZmFpbHVyZSBjYXNlLCBtYWtpbmcg dGhlIGNvbW11bmljYXRpb24gbW9kZWwgbW9yZSBwcmVkaWN0YWJsZS4NCiAgKiBUaGlzIGlzIG9u ZSBvZiB0aGUgcmVhc29ucyB3aHkgUnVieSB3ZW50IHdpdGggdGhlICJBY3RvciIgbW9kZWwgKGhl bmNlIHRoZSBuYW1lIFJhY3RvciksIGluc3RlYWQgb2YgdGhlICJDU1AiIG1vZGVsLg0KKiBGYXN0 ZXIgdGhhbiBjaGFubmVscyBpbiBib3RoIGNyZWF0aW9uIGFuZCBtZXNzYWdlIHRyYW5zbWlzc2lv bg0KICAqIFdoZW4gY3JlYXRpbmcgYSBjaGFubmVsLCB3ZSBuZWVkIHRvIHByZXBhcmUgYSBjb250 YWluZXIgZGF0YSBzdHJ1Y3R1cmUuIFdoZW4gY3JlYXRpbmcgYSBwb3J0LCBpdCBpcyBsaWdodHdl aWdodCBkYXRhIChhIHBhaXIgb2YgUmFjdG9yIGFuZCBuZXdseSBjcmVhdGVkIElEKS4NCiAgKiBP biB0aGUgY2hhbm5lbCB0cmFuc21pc3Npb24sIHdlIG5lZWQgY29weWluZyBhIGRhdGEgdG8gY2hh bm5lbCBhbmQgYSBjb3B5aW5nIHRvIHRoZSByZWNlaXZpbmcgcmFjdG9yLiBPbiB0aGUgcG9ydCwg aXQgb25seSBuZWVkcyB0byBjb3B5IGZyb20gdGhlIHNyYyByYWN0b3IgdG8gdGhlIGRzdCByYWN0 b3IuIFRoaXMgaXNzdWUgYmVjb21lcyBtb3JlIHNpZ25pZmljYW50IGR1ZSB0byBSYWN0b3ItbG9j YWwgZ2FyYmFnZSBjb2xsZWN0aW9uIGFuZCBpc29sYXRpb24gb2Ygb2JqZWN0IHNwYWNlcy4NCiog RWFzeSB0byBpbXBsZW1lbnQuIFdlIG9ubHkgbmVlZCB0byBpbXBsZW1lbnQgYFBvcnQjcmVjZWl2 ZWAgdG8gc3luY2hyb25pemUgd2l0aCBvdGhlciByYWN0b3JzLg0KICAqIGAjc2VuZC8ucmVjZWl2 ZWAgaXMgZWFzeSB0byBpbXBsZW1lbnQgYmVjYXVzZSB3ZSBvbmx5IG5lZWQgdG8gbG9jayB0aGUg cmVjZWl2aW5nIHJhY3Rvci4NCiAgKiBgLnlpZWxkLyN0YWtlYCBpcyBub3QgZWFzeSB0byBpbXBs ZW1lbnQgYmVjYXVzZSB3ZSBuZWVkIHRvIGxvY2sgdGFraW5nIGFuZCByZWNlaXZpbmcgcmFjdG9y cyBiZWNhdXNlIGl0IGlzIHJlbmRlenZvdXMgc3R5bGUgc3luY2hyb25pemF0aW9uLg0KICAqIGAu c2VsZWN0YCBpcyBESUZGSUNVTFQgdG8gc3VwcG9ydCBjdXJyZW50IHNwZWMuIE5vdyBDSSBpc24n dCBzdGFibGUgeWV0Lg0KICAqIEEgc2ltcGxlciBzcGVjIHJlZHVjZXMgYnVncywgYW5kIG1heWJl IGxlYWRzIHRvIGZhc3RlciBpbXBsZW1lbnRhdGlvbi4NCg0KRGlzYWR2YW50YWdlczoNCg0KMS4g SXQgaXMgbm90IGEgd2VsbC1rbm93biBjb25jZXB0LCBlc3BlY2lhbGx5IGZvciBHbyBsYW5ndWFn ZSB1c2Vycy4NCjIuIFdlIG5lZWQgYWRkaXRpb25hbCBhYnN0cmFjdGlvbiBsaWtlIHByb2R1Y2Vy KHMpLWNvbnN1bWVyKHMpIGNvbmN1cnJlbnQgYXBwbGljYXRpb25zLg0KDQpGb3IgKDIpLCBJIHdh bnQgdG8gaW50cm9kdWNlIGFuIGV4YW1wbGUgY29kZS4gV2UgY2FuIHdyaXRlIGEgMS1wcm9kdWNl ciwgbXVsdGlwbGUtY29uc3VtZXIgcGF0dGVybiB3aXRoIGEgY2hhbm5lbC4NCg0KYGBgcnVieQ0K IyBjaGFubmVsIHZlcnNpb24gb2YgMSBwcm9kdWNlciAmIGNvbnN1bWVycw0KDQpjaCA9IG5ld19j aGFubmVsDQoNClJOID0gMTAgIyBtYWtlIDEwIGNvbnN1bWVycw0KDQpjb25zdW1lcnMgPSBSTi50 aW1lcy5tYXAgZG8NCiAgUmFjdG9yLm5ldyBjaCBkbw0KICAgIHdoaWxlIHBhcmFtID0gY2gucmVj ZWl2ZQ0KICAgICAgdGFzayhwYXJhbSkNCiAgICBlbmQNCiAgZW5kDQplbmQNCg0KdGFza3MuZWFj aCBkbyB8dGFza3wNCiAgY2ggPDwgdGFzaw0KZW5kDQpgYGANCg0KV2l0aCBQb3J0LCB3ZSBuZWVk IHRvIGludHJvZHVjZSBhIGxvYWQgYmFsYW5jaW5nIG1lY2hhbmlzbToNCg0KYGBgcnVieQ0KIyBQ b3J0IHZlcnNpb24gb2YgMSBwcm9kdWNlciAmIGNvbnN1bWVycw0KDQpjb250cm9sX3BvcnQgPSBS YWN0b3I6OlBvcnQubmV3DQpjb25zdW1lcnMgPSBSTi50aW1lcy5tYXAgZG8NCiAgUmFjdG9yLm5l dyBjb250cm9sX3BvcnQgY29udHJvbF9wb3J0IGRvIHxjb250cm9sX3BvcnR8DQogICAgd2hpbGUg dHJ1ZQ0KICAgICAgY29udHJvbF9wb3J0IDw8IFs6cmVhZHksIFJhY3Rvci5jdXJyZW50XSAjIHJl Z2lzdGVyIC0gcmVhZHkNCiAgICAgIHBhcmFtID0gUmFjdG9yLnJlY2VpdmUgIyBpdCBhc3N1bWVz IHRhc2sgZG9lc24ndCB1c2UgUmFjdG9yLnJlY2VpdmUNCiAgICAgIHRhc2socGFyYW0pDQogICAg ZW5kDQogIGVuZA0KZW5kDQoNCnRhc2tzLmVhY2ggZG8gfHRhc2t8DQogIGNvbnRyb2xfcG9ydC5y ZWNlaXZlID0+IFs6cmVhZHksIGNvbnN1bWVyXQ0KICANCiAgIyBzZW5kIGEgdGFzayB0byBhIHJl YWR5IGNvbnN1bWVyDQogIGNvbnN1bWVyIDw8IHRhc2sNCmVuZA0KYGBgDQoNCk9mIGNvdXJzZSB3 ZSBjYW4gbWFrZSBhIGxpYnJhcnkgZm9yIHRoYXQgKGxpa2UgT1RQIG9uIEVybGFuZykuDQoNCiMj IyBEZWZhdWx0IHBvcnQgb2YgUmFjdG9ycw0KDQpFYWNoIFJhY3RvciBoYXMgYSBkZWZhdWx0IHBv cnQgYW5kIGBSYWN0b3Ijc2VuZGAgaXMgZXF1YWwgdG8gYFJhY3Rvci5jdXJyZW50LmRlZmF1bHRf cG9ydCNzZW5kYC4gT2YgY291cnNlLCBgUmFjdG9yLnJlY2VpdmVgIGlzIGVxdWFsIHRvIGBSYWN0 b3IuY3VycmVudC5kZWZhdWx0X3BvcnQucmVjZWl2ZWAuDQoNCkZvciB0aGUgc2ltcGxlIGNhc2Us IHdlIGNhbiBrZWVwIHRvIHVzZSBgUmFjdG9yI3NlbmRgIGFuZCBgUmFjdG9yLnJlY2VpdmVgDQoN CiMjIyBEZXByZWNhdGlvbiBvZiBSYWN0b3IjdGFrZSBhbmQgUmFjdG9yLnlpZWxkDQoNCldpdGgg dGhlIFBvcnQgY29uY2VwdCwgd2UgY2FuIGZvY3VzIHNvbGVseSBvbiBzZW5kIGFuZCByZWNlaXZl 4oCUdGhhdCBpcywgZGlyZWN0IG1hbmlwdWxhdGlvbiBvZiBhIFJhY3RvcuKAmXMgbWFpbGJveC4g UG9ydHMgcHJvdmlkZSBhIGNsZWFuIGFuZCBmdW5jdGlvbmFsIGFsdGVybmF0aXZlIHRvIGBSYWN0 b3IjdGFrZWAgYW5kIGBSYWN0b3IueWllbGRgLCBtYWtpbmcgdGhlbSB1bm5lY2Vzc2FyeSBpbiBt b3N0IHVzZSBjYXNlcy4NCg0KTW9yZW92ZXIsIFBvcnRzIGFyZSBzaWduaWZpY2FudGx5IGVhc2ll ciB0byBpbXBsZW1lbnQsIGFzIHRoZXkgcmVxdWlyZSBvbmx5IGxvY2tpbmcgdGhlIHJlY2Vpdmlu ZyBSYWN0b3IsIHdoaWxlIHlpZWxkL3Rha2UgaW52b2x2ZSBjb21wbGV4IHJlbmRlenZvdXMtc3R5 bGUgc3luY2hyb25pemF0aW9uLiBCeSByZW1vdmluZyB0aGVzZSBwcmltaXRpdmVzLCB3ZSBjYW4g c2ltcGxpZnkgdGhlIHNwZWNpZmljYXRpb24gYW5kIHJlZHVjZSBpbXBsZW1lbnRhdGlvbiBjb21w bGV4aXR54oCUZXNwZWNpYWxseSBhcm91bmQgZmVhdHVyZXMgbGlrZSBgUmFjdG9yLnNlbGVjdGAs IHdoaWNoIGFyZSBub3RvcmlvdXNseSBoYXJkIHRvIGdldCByaWdodC4NCg0KIyMjIGBSYWN0b3Iu c2VsZWN0YCB3aXRoIHBvcnRzDQoNCldlIHNob3VsZCB3YWl0IGZvciBtdWx0aXBsZSBwb3J0IHNp bXVsdGFuZW91c2x5IHNvIGBSYWN0b3Iuc2VsZWN0KClgIHNob3VsZCBhY2NlcHQgcG9ydHMuIE5v dyBgUmFjdG9yLnNlbGVjdCgpYCBjYW4gYWxzbyByZWNlaXZpbmcgYW5kIHlpZWxkaW5nIHRoZSB2 YWx1ZSwgYnV0IGlmIHdlIHJlbW92ZSB0aGUgYCN0YWtlYCBmdW5jdGlvbmFsaXR5LCBgUmFjdG9y LnNlbGVjdGAgb25seSBuZWVkIHRvIHN1cHBvcnQgcG9ydHMuDQoNCiMjIyBXYWl0IGZvciB0ZXJt aW5hdGlvbg0KDQpgUmFjdG9yI3Rha2VgIGlzIGRlc2lnbmVkIGZyb20gYW4gaWRlYSBvZiBnZXR0 aW5nIHRlcm1pbmF0aW9uIHJlc3VsdCAobGlrZSBgVGhyZWFkI3ZhbHVlYCkuIEZvciB0aGlzIHB1 cnBvc2UsIHdlIGNhbiBpbnRyb2R1Y2UgYFJhY3RvciNqb2luYCBvciBgUmFjdG9yI3ZhbHVlYCBs aWtlIFRocmVhZHMgb3Igd2UgY2FuIGtlZXAgdGhlIG5hbWUgYFJhY3RvciN0YWtlYCBmb3IgdGhp cyBwdXJwb3NlLg0KDQpXZSBjYW4gbWFrZSBgUmFjdG9yI2pvaW5gIGFzIGEgZm9sbG93aW5nIHBz ZXVkby1jb2RlOg0KDQpgYGBydWJ5DQpjbGFzcyBSYWN0b3INCiAgZGVmIGpvaW4gIyB3YWl0IGZv ciB0aGUgdGVybWluYXRpb24NCiAgICBtb25pdG9yIHBvcnQgPSBQb3J0Lm5ldw0KICAgIHBvcnQu cmVjZWl2ZQ0KICBlbnN1cmUNCiAgICBtb25pdG9yIG5pbCAjIHVucmVnaXN0ZXIgLyBpdCBzaG91 bGQgYmUgZGlzY3Vzc2VkDQogIGVuZA0KICANCiAgIyB3aGVuIHRoaXMgcmFjdG9yIHRlcm1pbmF0 ZXMsIHNlbmQgYSBtZXNzYWdlIHRvIHRoZSByZWdpc3RlcmVkIHBvcnQNCiAgZGVmIG1vbml0b3Ig cG9ydA0KICAgIEBtb25pdG9yX3BvcnQgPSBwb3J0DQogIGVuZA0KICANCiAgcHJpdmF0ZSBkZWYg YXRleGl0DQogICAgQG1vbml0b3JfcG9ydCA8PCB0ZXJtaW5hdGlvbl9tZXNzYWdlDQogIGVuZA0K ZW5kDQoNCiMgdGhlcmUgYXJlIHNvbWUgcXVlc3Rpb25zLg0KIyAqIGNhbiB3ZSByZWdpc3RlciBt dWx0aXBsZSBwb3J0cz8NCiMgKiBzaG91bGQgd2Ugc3VwcG9ydCBgI2pvaW5gIGFuZCBgI3ZhbHVl YCBsaWtlIHRocmVhZHM/DQojICAgb3Igc2hvdWxkIHdlIHN1cHBvcnQgb25seSBgI2pvaW5gIHRv IHJldHVybiB0aGUgdmFsdWU/DQojICogb3Iga2VlcCB0aGlzIG5hbWUgYXMgYCN0YWtlYD8NCg0K DQpSYWN0b3IubmV3IGRvDQogIDQyDQplbmQuam9pbiAjPT4gNDIgKG9yIHRydWU/KQ0KYGBgDQoN Ckl0IGlzIHZlcnkgc2ltaWxhciB0byBgbW9uaXRvcmAgaW4gRXJsYW5nIG9yIEVsaXhpci4NCldl IGNhbiBhbHNvIG1ha2UgYSBzdXBlcnZpc29yIGluIEVybGFuZyBsaWtlIHRoYXQ6DQoNCmBgYHJ1 YnkNCnN2X3BvcnQgPSBSYWN0b3I6OlBvcnQubmV3DQoNCnJzID0gTi50aW1lcy5tYXAgZG8NCiAg UmFjdG9yLm5ldyBkbw0KICAgIGRvX3NvbWV0aGluZygpDQogIGVuZC5tb25pdG9yIHN2X3BvcnQN CmVuZA0KDQp3aGlsZSB0ZXJtaW5hdGlvbl9ub3RpY2UgPSBzdl9wb3J0LnJlY2VpdmUNCiAgcCB0 ZXJtaW5hdGlvbl9ub3RpY2UNCmVuZA0KDQojIFdpdGggUmFjdG9yI3Rha2UsIHdlIGNhbiB3cml0 ZSBzaW1pbGFyIGNvZGUgaWYgdGhlcmUgaXMgbm8gUmFjdG9yLnlpZWxkDQoNCnJzID0gTi50aW1l cy5tYXAgZG8NCiAgUmFjdG9yLm5ldyBkbw0KICAgIGRvX3NvbWV0aGluZygpDQogIGVuZA0KZW5k DQoNCndoaWxlIHIsIG1zZyA9IFJhY3Rvci5zZWxlY3QoKnJzKQ0KICBwIFtyLCBtc2ddDQplbmQN CmBgYA0KDQojIyBEaXNjdXNzaW9uDQoNCiMjIyBgc2VuZGAgd2l0aCB0YWcgKHN5bWJvbHMpDQoN CklmIHdlIGZvcmNlIHVzZXJzIHRvIHNlbmQgYSB0YWdnZWQgbWVzc2FnZSBldmVyeSB0aW1lLCB3 ZSBjYW4gYWNoaWV2ZSB0aGUgc2FtZSBlZmZlY3QgYXMgUG9ydCBjb25jZXB0LCBiZWNhdXNlIGEg UG9ydCBjYW4gYmUgdGhvdWdodCBvZiBhcyBhIGNvbWJpbmF0aW9uIG9mIGEgdGFnIGFuZCBhIGRl c3RpbmF0aW9uIFJhY3Rvci4NCg0KYGBgcnVieQ0KciA9IFJhY3Rvci5uZXcgZG8NCiAgbG9vcCBk bw0KICAgIHRhZywgbXNnID0gUmFjdG9yLnJlY2VpdmUgIyByZXR1cm4gMiB2YWx1ZXMNCiAgICBj YXNlIHRhZw0KICAgIHdoZW4gOlRBRw0KICAgICAgcCBbdGFnLCBtc2ddDQogICAgZWxzZQ0KICAg ICAgIyBpZ25vcmUNCiAgICBlbmQNCiAgZW5kDQplbmQNCg0Kci5zZW5kIDpUQUcsIDQyDQpyLnNl bmQgOlRBR0UsIDg0ICMgdGhpcyB0eXBvIGFuZCB0aGUgbWVzc2FnZSBpcyBzaWxlbnRseSBpZ25v cmVkDQpgYGANCg0KSG93ZXZlciBpdCBoYXMgdHdvIGlzc3VlczoNCg0KKiBJZiB3ZSBtYWtlIGEg dHlwbyBpbiB0YWcgbmFtZSwgdGhlIG1lc3NhZ2Ugd2lsbCBiZSBzaWxlbnRseSBpZ25vcmVkLg0K KiBUaGUgdGFnIG5hbWUgbWF5IGNvbmZsaWN0IHdpdGggdW5yZWxhdGVkIGNvZGVzIChsaWJyYXJp ZXMpDQoNCiMjIyBgUmFjdG9yLnlpZWxkYCBhbmQgYFJhY3RvciN0YWtlYCB3aXRoIGNoYW5uZWwg cmFjdG9yDQoNCklmIHdlIHdhbnQgdG8gbGVhdmUgdGhlIGAueWllbGRgIGFuZCBgI3Rha2VgLCB3 ZSBjYW4gZW11bGF0ZSB0aGVtIHdpdGggY2hhbm5lbCByYWN0b3IuDQoNCmBgYHJ1YnkNCmNsYXNz IFJhY3Rvcg0KICBkZWYgaW5pdGlhbGl6ZQ0KICAgIEB5aWVsZF9yYWN0b3IgPSBSYWN0b3IubmV3 IGRvDQogICAgICB0YWtlcnMgPSBbXQ0KICAgICAgd2hpbGUgdGFnLCBtc2cgPSBSYWN0b3IucmVj ZWl2ZQ0KICAgICAgICBjYXNlIHRhZw0KICAgICAgICB3aGVuIDpyZWdpc3Rlcg0KICAgICAgICAg IEB0YWtlcnMgPDwgbXNnDQogICAgICAgIHdoZW4gOnVucmVnaXN0ZXINCiAgICAgICAgICBAdGFr ZXJzLmRlbGV0ZSBtc2cNCiAgICAgICAgd2hlbiA6eWllbGQNCiAgICAgICAgICBAdGFrZXJzLnBv cCA8PCBtc2cNCiAgICAgICAgZW5kDQogICAgICBlbmQNCiAgICBlbmQNCiAgZW5kDQoNCiAgZGVm IHNlbGYueWllbGQgb2JqDQogICAgQHlpZWxkX3JhY3RvciA8PCBbOnlpZWxkLCBvYmpdDQogIGVu ZA0KDQogIGRlZiB0YWtlDQogICAgQHlpZWxkX3JhY3RvciA8PCBbOnJlZ2lzdGVyLCBwb3J0ID0g UmFjdG9yOjpQb3J0Lm5ld10NCiAgICBwb3J0LnJlY2VpdmUNCiAgZW5zdXJlDQogICAgQHlpZWxk X3JhY3RvciA8PCBbOnVucmVnaXN0ZXIsIHBvcnRdDQogIGVuZA0KZW5kDQpgYGANCg0KIyMjIE9w ZW5pbmcgYW5kIGNsb3NpbmcgdGhlIHBvcnQNCg0KVGhpcyBwcm9wb3NhbCBkb2Vzbid0IGNvbnRh aW4gb3BlbmluZyBhbmQgY2xvc2luZyB0aGUgcG9ydCwgYnV0IHdlIGNhbiBkaXNjdXNzIGFib3V0 IGl0LiBUbyBpbnRyb2R1Y2UgdGhpcyBhdHRyaWJ1dGUsIHdlIG5lZWQgdG8gbWFuYWdlIHdoaWNo IHBvcnRzICh0YWdzKSBhcmUgb3BlbmluZy4NCg0KIyMgSW1wbGVtZW50YXRpb24NCg0KTm93IHRo ZSBuYXRpdmUgaW1wbGVtZW50YXRpb24gaXMgbm90IGZpbmlzaGVkLCBidXQgd2UgY2FuIGltcGxl bWVudCBpdCB1c2luZyB0aGUgYFJhY3Rvci5yZWNlaXZlX2lmYCBtZWNoYW5pc20sIHNvIHdlIGVz dGltYXRlIHRoYXQgb25seSBhIGZldyB3ZWVrcyBvZiB3b3JrIGFyZSBuZWVkZWQgdG8gY29tcGxl dGUgaXQuDQoNCiMjIFN1bW1hcnkNCg0KVGhpcyBwcm9wb3NhbCBpbnRyb2R1Y2VzIHRoZSBmb2xs b3dpbmcgZmVhdHVyZXMgYW5kIGRlcHJlY2F0aW9ucy4NCg0KKiBgUmFjdG9yOjpQb3J0YA0KICAq IGBQb3J0I3NlbmQobXNnKWAg4oCTIHNlbmRzIGEgbWVzc2FnZSB0byB0aGUgY3JlYXRvciBvZiB0 aGUgcG9ydC4NCiAgKiBgUG9ydCNyZWNlaXZlYCDigJMgcmVjZWl2ZXMgYSBtZXNzYWdlIGZyb20g dGhlIHBvcnQuDQogICogQSBwb3J0IGlzIGEgbGlnaHR3ZWlnaHQgZGF0YSBzdHJ1Y3R1cmUgKGEg cGFpciBvZiBhIFJhY3RvciBhbmQgYSB0YWcpLg0KKiBgUmFjdG9yI2pvaW5gIG9yIGBSYWN0b3Ij dmFsdWVgIOKAkyB0byB3YWl0IGZvciBSYWN0b3IgdGVybWluYXRpb24gKGxpa2UgYFRocmVhZCNq b2luYCkNCiogYFJhY3RvciNtb25pdG9yYCDigJMgdG8gb2JzZXJ2ZSB3aGVuIGFub3RoZXIgUmFj dG9yIHRlcm1pbmF0ZXMNCiogRGVwcmVjYXRpb25zOg0KICAqIGBSYWN0b3IjdGFrZWANCiAgKiBg UmFjdG9yLnlpZWxkYA0KICAqIGBSYWN0b3IucmVjZWl2ZV9pZmANCg0KVGhhbmsgeW91IGZvciBy ZWFkaW5nIHRoaXMgbG9uZyBwcm9wb3NhbC4gSWYgeW91IGhhdmUgYW55IHVzZSBjYXNlcyB0aGF0 IGNhbm5vdCBiZSBhZGRyZXNzZWQgd2l0aCBgUmFjdG9yOjpQb3J0YCwgSSdkIGxvdmUgdG8gaGVh ciB0aGVtLg0KDQoNClAuUy4gVGhhbmtzIHRvIG1hbWUgZm9yIHJldmlld2luZyB0aGlzIHByb3Bv c2FsIGFuZCBzdWdnZXN0aW5nIHRoYXQgSSB1c2UgQ2hhdEdQVCB0byBpbXByb3ZlIHRoZSB3cml0 aW5nLg0KDQoNCg0KLS0gDQpodHRwczovL2J1Z3MucnVieS1sYW5nLm9yZy8NCl9fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KIHJ1YnktY29yZSBtYWlsaW5nIGxp c3QgLS0gcnVieS1jb3JlQG1sLnJ1YnktbGFuZy5vcmcKIFRvIHVuc3Vic2NyaWJlIHNlbmQgYW4g ZW1haWwgdG8gcnVieS1jb3JlLWxlYXZlQG1sLnJ1YnktbGFuZy5vcmcKIHJ1YnktY29yZSBpbmZv IC0tIGh0dHBzOi8vbWwucnVieS1sYW5nLm9yZy9tYWlsbWFuMy9saXN0cy9ydWJ5LWNvcmUubWwu cnVieS1sYW5nLm9yZy8K