Re: PEP 489: Multi-phase extension module initialization; version 5

Eric Snow <[email protected]> Mon, 18 May 2015 18:07:57 -0600
Newsgroups gmane.comp.python.import
Message-ID <CALFfu7DfrR4LswtgNuAB7TT-y8vN38-yYUvS0QBmQtP26RO-Zg@mail.gmail.com>
VGhhbmtzIGZvciB3b3JraW5nIG9uIHRoaXMsIFBldHIgKGV0IGFsLikuICBTb3JyeSBJJ3ZlIG1p
c3NlZCB0aGUKcHJldmlvdXMgZGlzY3Vzc2lvbi4gIENvbW1lbnRzIGFyZSBpbi1saW5lLgoKLWVy
aWMKCk9uIE1vbiwgTWF5IDE4LCAyMDE1IGF0IDg6MDIgQU0sIFBldHIgVmlrdG9yaW4gPGVuY3Vr
b3VAZ21haWwuY29tPiB3cm90ZToKPiBbc25pcF0KPgo+IEZ1cnRoZXJtb3JlLCB0aGUgbWFqb3Jp
dHkgb2YgY3VycmVudGx5IGV4aXN0aW5nIGV4dGVuc2lvbiBtb2R1bGVzIGhhcwo+IHByb2JsZW1z
IHdpdGggc3ViLWludGVycHJldGVyIHN1cHBvcnQgYW5kL29yIGludGVycHJldGVyIHJlbG9hZGlu
ZywgYW5kLAo+IHdoaWxlCj4gaXQgaXMgcG9zc2libGUgd2l0aCB0aGUgY3VycmVudCBpbmZyYXN0
cnVjdHVyZSB0byBzdXBwb3J0IHRoZXNlCj4gZmVhdHVyZXMsIGl0IGlzIG5laXRoZXIgZWFzeSBu
b3IgZWZmaWNpZW50Lgo+IEFkZHJlc3NpbmcgdGhlc2UgaXNzdWVzIHdhcyB0aGUgZ29hbCBvZiBQ
RVAgMzEyMSwgYnV0IG1hbnkgZXh0ZW5zaW9ucywKPiBpbmNsdWRpbmcgc29tZSBpbiB0aGUgc3Rh
bmRhcmQgbGlicmFyeSwgdG9vayB0aGUgbGVhc3QtZWZmb3J0IGFwcHJvYWNoCj4gdG8gcG9ydGlu
ZyB0byBQeXRob24gMywgbGVhdmluZyB0aGVzZSBpc3N1ZXMgdW5yZXNvbHZlZC4KPiBUaGlzIFBF
UCBrZWVwcyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgd2hpY2ggc2hvdWxkIHJlZHVjZSBwcmVz
c3VyZSBhbmQKPiBnaXZlCj4gZXh0ZW5zaW9uIGF1dGhvcnMgYWRlcXVhdGUgdGltZSB0byBjb25z
aWRlciB0aGVzZSBpc3N1ZXMgd2hlbiBwb3J0aW5nLgoKU28ganVzdCBiZSB0byBzdXJlIEkgdW5k
ZXJzdGFuZCwgbm93IFB5TW9kdWxlRGVmLm1fc2xvdHMgd2lsbAp1bmFtYmlndW91c2x5IGluZGlj
YXRlIHdoZXRoZXIgb3Igbm90IGFuIGV4dGVuc2lvbiBtb2R1bGUgaXMKY29tcGxpYW50LCByaWdo
dD8KCj4gW3NuaXBdCj4KPiBUaGUgcHJvcG9zYWwKPiA9PT09PT09PT09PT0KClRoaXMgc2VjdGlv
biBzaG91bGQgaW5jbHVkZSBhbiBpbmRpY2F0aW9uIG9mIGhvdyB0aGUgbG9hZGVyIChhbmQKcGVy
aGFwcyBmaW5kZXIpIHdpbGwgY2hhbmdlIGZvciBidWlsdGluLCBmcm96ZW4sIGFuZCBleHRlbnNp
b24KbW9kdWxlcy4gIEl0IG1heSBoZWxwIHRvIGRlc2NyaWJlIHRoZSBwcm9wb3NhbCB1cCBmcm9u
dCBieSBob3cgdGhlCmxvYWRlciBpbXBsZW1lbnRhdGlvbiB3b3VsZCBsb29rIGlmIGl0IHdlcmUg
c29tZWhvdyBpbXBsZW1lbnRlZCBpbgpQeXRob24gY29kZS4gIFRoZSBzdWJzZXF1ZW50IHNlY3Rp
b25zIHNvbWV0aW1lcyBpbmRpY2F0ZSB3aGVyZQpkaWZmZXJlbnQgdGhpbmdzIHRha2UgcGxhY2Us
IGJ1dCBhbiBleHBsaWNpdCBvdXRsaW5lIChhcyBQeXRob24gY29kZSkKd291bGQgbWFrZSB0aGUg
ZW50aXJlIGZsb3cgcmVhbGx5IG9idmlvdXMuICBQdXR0aW5nIHRoYXQgdG93YXJkIHRoZQpiZWdp
bm5pbmcgb2YgdGhpcyBzZWN0aW9uIHdvdWxkIGhlbHAgY2xlYXJseSBzZXQgdGhlIHN0YWdlIGZv
ciB0aGUKcmVzdCBvZiB0aGUgcHJvcG9zYWwuCgo+IFtzbmlwXQo+IFVua25vd24gc2xvdCBJRHMg
d2lsbCBjYXVzZSB0aGUgaW1wb3J0IHRvIGZhaWwgd2l0aCBTeXN0ZW1FcnJvci4KCldhcyB0aGVy
ZSBhbnkgY29uc2lkZXJhdGlvbiBtYWRlIGZvciBqdXN0IGlnbm9yaW5nIHVua25vd24gc2xvdCBJ
RHM/Ck15IGd1dCByZWFjdGlvbiBpcyB0aGF0IHlvdSBoYXZlIGl0IHRoZSByaWdodCB3YXksIGJ1
dCBJIGNhbiBzdGlsbAppbWFnaW5lIHVzZSBjYXNlcyBmb3IgY3VzdG9tIHNsb3RzIHRoYXQgUHlN
b2R1bGVEZWZfSW5pdCB3b3VsZG4ndCBrbm93CmFib3V0LgoKPgo+IFdoZW4gdXNpbmcgbXVsdGkt
cGhhc2UgaW5pdGlhbGl6YXRpb24sIHRoZSAqbV9uYW1lKiBmaWVsZCBvZiBQeU1vZHVsZURlZgo+
IHdpbGwKPiBub3QgYmUgdXNlZCBkdXJpbmcgaW1wb3J0aW5nOyB0aGUgbW9kdWxlIG5hbWUgd2ls
bCBiZSB0YWtlbiBmcm9tIHRoZQo+IE1vZHVsZVNwZWMuCgpTbyBtX25hbWUgd2lsbCBiZSBzdHJp
Y3RseSBpZ25vcmVkIGJ5IFB5TW9kdWxlRGVmX0luaXQ/Cgo+Cj4gVG8gcHJldmVudCBjcmFzaGVz
IHdoZW4gdGhlIG1vZHVsZSBpcyBsb2FkZWQgaW4gb2xkZXIgdmVyc2lvbnMgb2YgUHl0aG9uLAo+
IHRoZSBQeU1vZHVsZURlZiBvYmplY3QgbXVzdCBiZSBpbml0aWFsaXplZCB1c2luZyB0aGUgbmV3
bHkgYWRkZWQKPiBQeU1vZHVsZURlZl9Jbml0IGZ1bmN0aW9uLgo+IEZvciBleGFtcGxlLCBhbiBl
eHRlbnNpb24gbW9kdWxlICJleGFtcGxlIiB3b3VsZCBiZSBleHBvcnRlZCBhczo6Cj4KPiAgICAg
c3RhdGljIFB5TW9kdWxlRGVmIGV4YW1wbGVfZGVmID0gey4uLn0KPgo+ICAgICBQeU1PRElOSVRf
RlVOQwo+ICAgICBQeUluaXRfZXhhbXBsZSh2b2lkKQo+ICAgICB7Cj4gICAgICAgICByZXR1cm4g
UHlNb2R1bGVEZWZfSW5pdCgmZXhhbXBsZV9kZWYpOwo+ICAgICB9CgpUaGlzIGV4YW1wbGUgaXMg
aGVscGZ1bC4gOikKCj4KPiBUaGUgUHlNb2R1bGVEZWYgb2JqZWN0IG11c3QgYmUgYXZhaWxhYmxl
IGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIG1vZHVsZQo+IGNyZWF0ZWQKPiBmcm9tIGl0IOKAkyB1
c3VhbGx5LCBpdCB3aWxsIGJlIGRlY2xhcmVkIHN0YXRpY2FsbHkuCgpIb3cgZWFzaWx5IHdpbGwg
dGhpcyBiZSBhIHNvdXJjZSBvZiBteXN0ZXJpb3VzIGVycm9ycy1hdC1hLWRpc3RhbmNlPwoKPiBb
c25pcF0KPiBIb3dldmVyLCBvbmx5IE1vZHVsZVR5cGUgaW5zdGFuY2VzIHN1cHBvcnQgbW9kdWxl
LXNwZWNpZmljIGZ1bmN0aW9uYWxpdHkKPiBzdWNoIGFzIHBlci1tb2R1bGUgc3RhdGUuCgpUaGlz
IGlzIGEgcHJldHR5IGltcG9ydGFudCBwb2ludC4gIFByZXN1bWFibHkgdGhpcyBjb25zdHJhaW50
cyBsYXRlcgpiZWhhdmlvciBhbmQgcHJlY2VkZXMgYWxsIGZ1bmN0aW9uYWxpdHkgcmVsYXRlZCB0
byBwZXItbW9kdWxlIHN0YXRlLgoKPiBbc25pcF0KPiBFeHRlbnNpb24gYXV0aG9ycyBhcmUgYWR2
aXNlZCB0byBrZWVwIFB5X21vZF9jcmVhdGUgbWluaW1hbCwgYW4gaW4KPiBwYXJ0aWN1bGFyCj4g
dG8gbm90IGNhbGwgdXNlciBjb2RlIGZyb20gaXQuCgpUaGlzIGlzIGEgcHJldHR5IGltcG9ydGFu
dCBwb2ludCBhcyB3ZWxsLiAgV2UnbGwgbmVlZCB0byBtYWtlIHN1cmUKdGhpcyBpcyBzdWZmaWNp
ZW50bHkgY2xlYXIgaW4gdGhlIGRvY3VtZW50YXRpb24uICBXb3VsZCBpdCBtYWtlIHNlbnNlCnRv
IHByb3ZpZGUgaGVscGVycyBmb3IgY29tbW9uIGNhc2VzLCB0byBlbmNvdXJhZ2UgZXh0ZW5zaW9u
IGF1dGhvcnMgdG8Ka2VlcCB0aGUgY3JlYXRlIGZ1bmN0aW9uIG1pbmltYWw/Cgo+IFtzbmlwXQo+
Cj4gSWYgUHlNb2R1bGVFeGVjIHJlcGxhY2VzIHRoZSBtb2R1bGUncyBlbnRyeSBpbiBzeXMubW9k
dWxlcywKPiB0aGUgbmV3IG9iamVjdCB3aWxsIGJlIHVzZWQgYW5kIHJldHVybmVkIGJ5IGltcG9y
dGxpYiBtYWNoaW5lcnkuCgpKdXN0IHRvIGJlIHN1cmUsIHNvbWV0aGluZyBsaWtlICJtb2QgPSBz
eXMubW9kdWxlc1ttb2RuYW1lXSIgaXMgZG9uZQpiZWZvcmUgZWFjaCBleGVjdXRpb24gc2xvdC4g
IEluIG90aGVyIHdvcmRzLCB0aGUgcmVzdWx0IG9mIHRoZQpwcmV2aW91cyBleGVjdXRpb24gc2xv
dCBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIG5leHQgb25lLgoKPiAoVGhpcyBtaXJyb3JzIHRoZSBi
ZWhhdmlvciBvZiBQeXRob24gbW9kdWxlcy4gTm90ZSB0aGF0IGltcGxlbWVudGluZwo+IFB5X21v
ZF9jcmVhdGUgaXMgdXN1YWxseSBhIGJldHRlciBzb2x1dGlvbiBmb3IgdGhlIHVzZSBjYXNlcyB0
aGlzIHNlcnZlcy4pCgpDb3VsZCB5b3UgZWxhYm9yYXRlPyAgV2hhdCBhcmUgdGhvc2UgdXNlIGNh
c2VzIGFuZCB3aHkgd291bGQKUHlfbW9kX2NyZWF0ZSBiZSBiZXR0ZXI/Cgo+IFtzbmlwXQo+Cj4g
TW9kdWxlcyB0aGF0IG5lZWQgdG8gd29yayB1bmNoYW5nZWQgb24gb2xkZXIgdmVyc2lvbnMgb2Yg
UHl0aG9uIHNob3VsZCBub3QKPiB1c2UgbXVsdGktcGhhc2UgaW5pdGlhbGl6YXRpb24sIGJlY2F1
c2UgdGhlIGJlbmVmaXRzIGl0IGJyaW5ncyBjYW4ndCBiZQo+IGJhY2stcG9ydGVkLgoKR2l2ZW4g
eW91ciBleGFtcGxlIGJlbG93LCAic2hvdWxkIG5vdCIgc2VlbXMgYSBiaXQgc3Ryb25nIHRvIG1l
LiAgSW4KZmFjdCwgd2hhdCBhcmUgdGhlIG9iamVjdGlvbnMgdG8gZW5jb3VyYWdpbmcgdGhlIGFw
cHJvYWNoIGZyb20gdGhlCmV4YW1wbGU/Cgo+IE5ldmVydGhlbGVzcywgaGVyZSBpcyBhbiBleGFt
cGxlIG9mIGEgbW9kdWxlIHRoYXQgc3VwcG9ydHMgbXVsdGktcGhhc2UKPiBpbml0aWFsaXphdGlv
biwgYW5kIGZhbGxzIGJhY2sgdG8gc2luZ2xlLXBoYXNlIHdoZW4gY29tcGlsZWQgZm9yIGFuIG9s
ZGVyCj4gdmVyc2lvbiBvZiBDUHl0aG9uOjoKPgo+ICAgICAjaW5jbHVkZSA8UHl0aG9uLmg+Cj4K
PiAgICAgc3RhdGljIGludCBzcGFtX2V4ZWMoUHlPYmplY3QgKm1vZHVsZSkgewo+ICAgICAgICAg
UHlNb2R1bGVfQWRkU3RyaW5nQ29uc3RhbnQobW9kdWxlLCAiZm9vZCIsICJzcGFtIik7Cj4gICAg
ICAgICByZXR1cm4gMDsKPiAgICAgfQo+Cj4gICAgICNpZmRlZiBQeV9tb2RfZXhlYwo+ICAgICBz
dGF0aWMgUHlNb2R1bGVEZWZfU2xvdCBzcGFtX3Nsb3RzW10gPSB7Cj4gICAgICAgICB7UHlfbW9k
X2V4ZWMsIHNwYW1fZXhlY30sCj4gICAgICAgICB7MCwgTlVMTH0KPiAgICAgfTsKPiAgICAgI2Vu
ZGlmCj4KPiAgICAgc3RhdGljIFB5TW9kdWxlRGVmIHNwYW1fZGVmID0gewo+ICAgICAgICAgUHlN
b2R1bGVEZWZfSEVBRF9JTklULCAgICAgICAgICAgICAgICAgICAgICAvKiBtX2Jhc2UgKi8KPiAg
ICAgICAgICJzcGFtIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbV9u
YW1lICovCj4gICAgICAgICBQeURvY19TVFIoIlV0aWxpdGllcyBmb3IgY29va2luZyBzcGFtIiks
ICAgIC8qIG1fZG9jICovCj4gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIC8qIG1fc2l6ZSAqLwo+ICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAvKiBtX21ldGhvZHMgKi8KPiAgICAgI2lmZGVmIFB5X21v
ZF9leGVjCj4gICAgICAgICBzcGFtX3Nsb3RzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIC8qIG1fc2xvdHMgKi8KPiAgICAgI2Vsc2UKPiAgICAgICAgIE5VTEwsCj4gICAgICNlbmRp
Zgo+ICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAv
KiBtX3RyYXZlcnNlICovCj4gICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIC8qIG1fY2xlYXIgKi8KPiAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgLyogbV9mcmVlICovCj4gICAgIH07Cj4KPiAgICAgUHlN
T0RJTklUX0ZVTkMKPiAgICAgUHlJbml0X3NwYW0odm9pZCkgewo+ICAgICAjaWZkZWYgUHlfbW9k
X2V4ZWMKPiAgICAgICAgIHJldHVybiBQeU1vZHVsZURlZl9Jbml0KCZzcGFtX2RlZik7Cj4gICAg
ICNlbHNlCj4gICAgICAgICBQeU9iamVjdCAqbW9kdWxlOwo+ICAgICAgICAgbW9kdWxlID0gUHlN
b2R1bGVfQ3JlYXRlKCZzcGFtX2RlZik7Cj4gICAgICAgICBpZiAobW9kdWxlID09IE5VTEwpIHJl
dHVybiBOVUxMOwo+ICAgICAgICAgaWYgKHNwYW1fZXhlYyhtb2R1bGUpICE9IDApIHsKPiAgICAg
ICAgICAgICBQeV9ERUNSRUYobW9kdWxlKTsKPiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKPiAg
ICAgICAgIH0KPiAgICAgICAgIHJldHVybiBtb2R1bGU7Cj4gICAgICNlbmRpZgo+ICAgICB9Cj4K
ClRoaXMgZXhhbXBsZSBpcyByZWFsbHkgaGVscGZ1bCEKCj4gW3NuaXBdCj4KPiBTdWJpbnRlcnBy
ZXRlcnMgYW5kIEludGVycHJldGVyIFJlbG9hZGluZwo+IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tCj4KPiBFeHRlbnNpb25zIHVzaW5nIHRoZSBuZXcgaW5pdGlhbGl6
YXRpb24gc2NoZW1lIGFyZSBleHBlY3RlZCB0byBzdXBwb3J0Cj4gc3ViaW50ZXJwcmV0ZXJzIGFu
ZCBtdWx0aXBsZSBQeV9Jbml0aWFsaXplL1B5X0ZpbmFsaXplIGN5Y2xlcyBjb3JyZWN0bHkuCgpQ
cmVzdW1hYmx5IHRoaXMgc3VwcG9ydCBpcyBleHBsaWNpdGx5IGFuZCBjb21wbGV0ZWx5IGRlZmlu
ZWQgaW4gdGhlCnN1YnNlcXVlbnQgc2VudGVuY2VzLiAgSXMgaXQgcmVhbGx5IGp1c3Qga2VlcGlu
ZyAiaGlkZGVuIiBtb2R1bGUgc3RhdGUKZW5jYXBzdWxhdGVkIG9uIHRoZSBtb2R1bGUgb2JqZWN0
PyAgSWYgbm90IHRoZW4gaXQgbWF5IG1ha2Ugc2Vuc2UgdG8KZW51bWVyYXRlIHRoZSByZXF1aXJl
bWVudHMgYmV0dGVyIGZvciB0aGUgc2FrZSBvZiBleHRlbnNpb24gbW9kdWxlCmF1dGhvcnMuCgo+
IFRoZSBtZWNoYW5pc20gaXMgZGVzaWduZWQgdG8gbWFrZSB0aGlzIGVhc3ksIGJ1dCBjYXJlIGlz
IHN0aWxsIHJlcXVpcmVkCj4gb24gdGhlIHBhcnQgb2YgdGhlIGV4dGVuc2lvbiBhdXRob3IuCj4g
Tm8gdXNlci1kZWZpbmVkIGZ1bmN0aW9ucywgbWV0aG9kcywgb3IgaW5zdGFuY2VzIG1heSBsZWFr
IHRvIGRpZmZlcmVudAo+IGludGVycHJldGVycy4KPiBUbyBhY2hpZXZlIHRoaXMsIGFsbCBtb2R1
bGUtbGV2ZWwgc3RhdGUgc2hvdWxkIGJlIGtlcHQgaW4gZWl0aGVyIHRoZSBtb2R1bGUKPiBkaWN0
LCBvciBpbiB0aGUgbW9kdWxlIG9iamVjdCdzIHN0b3JhZ2UgcmVhY2hhYmxlIGJ5IFB5TW9kdWxl
X0dldFN0YXRlLgoKSXMgdGhpcyBwcm9ncmFtbWF0aWNhbGx5IGVuZm9yY2VhYmxlPyAgSXMgdGhl
cmUgYW55IG1lY2hhbmlzbSBmb3IKZWFzaWx5IGNvcHlpbmcgbW9kdWxlIHN0YXRlPyAgSG93IGFi
b3V0IHNoYXJpbmcgc29tZSBzdGF0ZSBiZXR3ZWVuCnN1YmludGVycHJldGVycz8gIEhvdyBtdWNo
IHJvb20gaXMgdGhlcmUgZm9yIGxldHRpbmcgZXh0ZW5zaW9uIG1vZHVsZQphdXRob3JzIGRlZmlu
ZSBob3cgdGhlaXIgbW9kdWxlIGJlaGF2ZXMgYWNyb3NzIG11bHRpcGxlIGludGVycHJldGVycwpv
ciBhY3Jvc3MgbXVsdGlwbGUgSW5pdGlhbGl6ZS9GaW5hbGl6ZSBjeWNsZXM/Cgo+IEEgc2ltcGxl
IHJ1bGUgb2YgdGh1bWIgaXM6IERvIG5vdCBkZWZpbmUgYW55IHN0YXRpYyBkYXRhLCBleGNlcHQK
PiBidWlsdC1pbiB0eXBlcwo+IHdpdGggbm8gbXV0YWJsZSBvciB1c2VyLXNldHRhYmxlIGNsYXNz
IGF0dHJpYnV0ZXMuCgpUaGlzIGlzIGFub3RoZXIgb25lIG9mIHRob3NlIHBvaW50cyB0aGF0IG5l
ZWRzIHRvIGJlIGNyeXN0YWwgY2xlYXIgaW4gdGhlIGRvY3MuCgo+IEFzIGEgcnVsZSBvZiB0aHVt
YiwgbW9kdWxlcyB0aGF0IHJlbHkgb24gUHlTdGF0ZV9GaW5kTW9kdWxlIGFyZSwgYXQgdGhlCj4g
bW9tZW50LAo+IG5vdCBnb29kIGNhbmRpZGF0ZXMgZm9yIHBvcnRpbmcgdG8gdGhlIG5ldyBtZWNo
YW5pc20uCgpBcmUgdGhlcmUgYW55IHBsYW5zIGZvciBhIGZvbGxvdy11cCBlZmZvcnQgdG8gaGVs
cCB3aXRoIHRoaXMgY2FzZT8KCj4gW3NuaXBdCj4KPiBNb2R1bGUgUmVsb2FkaW5nCj4gLS0tLS0t
LS0tLS0tLS0tLQo+Cj4gUmVsb2FkaW5nIGFuIGV4dGVuc2lvbiBtb2R1bGUgdXNpbmcgaW1wb3J0
bGliLnJlbG9hZCgpIHdpbGwgY29udGludWUgdG8KPiBoYXZlIG5vIGVmZmVjdCwgZXhjZXB0IHJl
LXNldHRpbmcgaW1wb3J0LXJlbGF0ZWQgYXR0cmlidXRlcy4KPgo+IER1ZSB0byBsaW1pdGF0aW9u
cyBpbiBzaGFyZWQgbGlicmFyeSBsb2FkaW5nIChib3RoIGRsb3BlbiBvbiBQT1NJWCBhbmQKPiBM
b2FkTW9kdWxlRXggb24gV2luZG93cyksIGl0IGlzIG5vdCBnZW5lcmFsbHkgcG9zc2libGUgdG8g
bG9hZAo+IGEgbW9kaWZpZWQgbGlicmFyeSBhZnRlciBpdCBoYXMgY2hhbmdlZCBvbiBkaXNrLgo+
Cj4gVXNlIGNhc2VzIGZvciByZWxvYWRpbmcgb3RoZXIgdGhhbiB0cnlpbmcgb3V0IGEgbmV3IHZl
cnNpb24gb2YgdGhlIG1vZHVsZQo+IGFyZSB0b28gcmFyZSB0byByZXF1aXJlIGFsbCBtb2R1bGUg
YXV0aG9ycyB0byBrZWVwIHJlbG9hZGluZyBpbiBtaW5kLgo+IElmIHJlbG9hZC1saWtlIGZ1bmN0
aW9uYWxpdHkgaXMgbmVlZGVkLCBhdXRob3JzIGNhbiBleHBvcnQgYSBkZWRpY2F0ZWQKPiBmdW5j
dGlvbiBmb3IgaXQuCgpLZWVwIGluIG1pbmQgdGhlIHNlbWFudGljcyBvZiByZWxvYWQgZm9yIHB1
cmUgUHl0aG9uIG1vZHVsZXMuICBUaGUKbW9kdWxlIGlzIGV4ZWN1dGVkIGludG8gdGhlIGV4aXN0
aW5nIG5hbWVzcGFjZSwgb3ZlcndyaXRpbmcgdGhlIGxvYWRlZApuYW1lc3BhY2UgYnV0IGxlYXZp
bmcgbm9uLWNvbGxpZGluZyBhdHRyaWJ1dGVzIGFsb25lLiAgV2hpbGUgdGhlCnNlbWFudGljcyBm
b3IgcmVsb2FkaW5nIGFuIGV4dGVuc2lvbi9idWlsdGluL2Zyb3plbiBtb2R1bGUgYXJlCmN1cnJl
bnRseSBiYXNpYyAoaS5lLiBhIG5vLW9wKSwgdGhlcmUgbWF5IHdlbGwgYmUgcm9vbSB0byBzdXBw
b3J0CnJlbG9hZCBiZWhhdmlvciB0aGF0IG1pcnJvcnMgdGhhdCBvZiBwdXJlIFB5dGhvbiBtb2R1
bGVzIHdpdGhvdXQKbmVlZGluZyB0byByZWxvYWQgYW4gU08gZmlsZS4gIEkgd291bGQgZXhwZWN0
IGVpdGhlciB0aGUgYmVoYXZpb3Igb2YKZXhlYyB0byBnZXQgcmVwZWF0ZWQgKHRyaWNreSBkdWUg
dG8gImhpZGRlbiIgbW9kdWxlIHN0YXRlPykgb3IgZm9yCnRoZXJlIHRvIGJlIGEgInJlbG9hZCIg
c2xvdCB0aGF0IHdvdWxkIG1pcnJvciBQeV9tb2RfZXhlYy4KCkF0IHRoZSBzYW1lIHRpbWUsIG9u
ZSBtYXkgYXJndWUgdGhhdCByZWxvYWRpbmcgbW9kdWxlcyBpcyBub3QKc29tZXRoaW5nIHRvIGVu
Y291cmFnZS4gOikKCj4KPgo+IE11bHRpcGxlIG1vZHVsZXMgaW4gb25lIGxpYnJhcnkKPiAtLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4KPiBUbyBzdXBwb3J0IG11bHRpcGxlIFB5dGhv
biBtb2R1bGVzIGluIG9uZSBzaGFyZWQgbGlicmFyeSwgdGhlIGxpYnJhcnkgY2FuCj4gZXhwb3J0
IGFkZGl0aW9uYWwgUHlJbml0KiBzeW1ib2xzIGJlc2lkZXMgdGhlIG9uZSB0aGF0IGNvcnJlc3Bv
bmRzCj4gdG8gdGhlIGxpYnJhcnkncyBmaWxlbmFtZS4KPgo+IE5vdGUgdGhhdCB0aGlzIG1lY2hh
bmlzbSBjYW4gY3VycmVudGx5IG9ubHkgYmUgdXNlZCB0byAqbG9hZCogZXh0cmEgbW9kdWxlcywK
PiBidXQgbm90IHRvICpmaW5kKiB0aGVtLgoKV2hhdCBkbyB5b3UgbWVhbiBieSAiY3VycmVudGx5
Ij8KCkl0IG1heSBhbHNvIGJlIHdvcnRoIHR5aW5nIHRoZSBhYm92ZSBzdGF0ZW1lbnQgd2l0aCB0
aGUgZm9sbG93aW5nCnRleHQsIHNpbmNlIHRoZSBmb2xsb3dpbmcgYXBwZWFycyB0byBiZSBhbiBl
eHBsYW5hdGlvbiBvZiBob3cgdG8KYWRkcmVzcyB0aGUgImZpbmRlciIgY2F2ZWF0LgoKPgo+IEdp
dmVuIHRoZSBmaWxlc3lzdGVtIGxvY2F0aW9uIG9mIGEgc2hhcmVkIGxpYnJhcnkgYW5kIGEgbW9k
dWxlIG5hbWUsCj4gYSBtb2R1bGUgbWF5IGJlIGxvYWRlZCB3aXRoOjoKPgo+ICAgICBpbXBvcnQg
aW1wb3J0bGliLm1hY2hpbmVyeQo+ICAgICBpbXBvcnQgaW1wb3J0bGliLnV0aWwKPiAgICAgbG9h
ZGVyID0gaW1wb3J0bGliLm1hY2hpbmVyeS5FeHRlbnNpb25GaWxlTG9hZGVyKG5hbWUsIHBhdGgp
Cj4gICAgIHNwZWMgPSBpbXBvcnRsaWIudXRpbC5zcGVjX2Zyb21fbG9hZGVyKG5hbWUsIGxvYWRl
cikKPiAgICAgbW9kdWxlID0gaW1wb3J0bGliLnV0aWwubW9kdWxlX2Zyb21fc3BlYyhzcGVjKQo+
ICAgICBsb2FkZXIuZXhlY19tb2R1bGUobW9kdWxlKQo+ICAgICByZXR1cm4gbW9kdWxlCj4KPiBP
biBwbGF0Zm9ybXMgdGhhdCBzdXBwb3J0IHN5bWJvbGljIGxpbmtzLCB0aGVzZSBtYXkgYmUgdXNl
ZCB0byBpbnN0YWxsIG9uZQo+IGxpYnJhcnkgdW5kZXIgbXVsdGlwbGUgbmFtZXMsIGV4cG9zaW5n
IGFsbCBleHBvcnRlZCBtb2R1bGVzIHRvIG5vcm1hbAo+IGltcG9ydCBtYWNoaW5lcnkuCj4KPgo+
IFRlc3RpbmcgYW5kIGluaXRpYWwgaW1wbGVtZW50YXRpb25zCj4gLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0KPgo+IEZvciB0ZXN0aW5nLCBhIG5ldyBidWlsdC1pbiBtb2R1bGUg
YGBfdGVzdG11bHRpcGhhc2VgYCB3aWxsIGJlIGNyZWF0ZWQuCj4gVGhlIGxpYnJhcnkgd2lsbCBl
eHBvcnQgc2V2ZXJhbCBhZGRpdGlvbmFsIG1vZHVsZXMgdXNpbmcgdGhlIG1lY2hhbmlzbQo+IGRl
c2NyaWJlZCBpbiAiTXVsdGlwbGUgbW9kdWxlcyBpbiBvbmUgbGlicmFyeSIuCj4KPiBUaGUgYGBf
dGVzdGNhcGlgYCBtb2R1bGUgd2lsbCBiZSB1bmNoYW5nZWQsIGFuZCB3aWxsIHVzZSBzaW5nbGUt
cGhhc2UKPiBpbml0aWFsaXphdGlvbiBpbmRlZmluaXRlbHkgKG9yIHVudGlsIGl0IGlzIG5vIGxv
bmdlciBzdXBwb3J0ZWQpLgo+Cj4gVGhlIGBgYXJyYXlgYCBhbmQgYGB4eCpgYCBtb2R1bGVzIHdp
bGwgYmUgY29udmVydGVkIHRvIHVzZSBtdWx0aS1waGFzZQo+IGluaXRpYWxpemF0aW9uIGFzIHBh
cnQgb2YgdGhlIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCgpXaGF0IGRvIHlvdSBtZWFuIGJ5ICJp
bml0aWFsIGltcGxlbWVudGF0aW9uIj8gIFdpbGwgaXQgYmUgZG9uZQpkaWZmZXJlbnRseSBpbiBh
IGxhdGVyIGltcGxlbWVudGF0aW9uPwoKPgo+Cj4gU3VtbWFyeSBvZiBBUEkgQ2hhbmdlcyBhbmQg
QWRkaXRpb25zCj4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4KPiBOZXcg
ZnVuY3Rpb25zOgo+Cj4gKiBQeU1vZHVsZV9Gcm9tRGVmQW5kU3BlYyAobWFjcm8pCj4gKiBQeU1v
ZHVsZV9Gcm9tRGVmQW5kU3BlYzIKPiAqIFB5TW9kdWxlX0V4ZWNEZWYKPiAqIFB5TW9kdWxlX1Nl
dERvY1N0cmluZwo+ICogUHlNb2R1bGVfQWRkRnVuY3Rpb25zCj4gKiBQeU1vZHVsZURlZl9Jbml0
Cj4KPiBOZXcgbWFjcm9zOgo+Cj4gKiBQeV9tb2RfY3JlYXRlCj4gKiBQeV9tb2RfZXhlYwo+Cj4g
TmV3IHR5cGVzOgo+Cj4gKiBQeU1vZHVsZURlZl9UeXBlIHdpbGwgYmUgZXhwb3NlZAo+Cj4gTmV3
IHN0cnVjdHVyZXM6Cj4KPiAqIFB5TW9kdWxlRGVmX1Nsb3QKPgo+IFB5TW9kdWxlRGVmLm1fcmVs
b2FkIGNoYW5nZXMgdG8gUHlNb2R1bGVEZWYubV9zbG90cy4KClRoaXMgc2VjdGlvbiBpcyBtaXNz
aW5nIGFueSBleHBsYW5hdGlvbiBvZiB0aGUgaW1wYWN0IG9uClB5dGhvbi9pbXBvcnQuYywgb24g
dGhlIF9pbXAvaW1wIG1vZHVsZSwgYW5kIG9uIHRoZSAzIGZpbmRlcnMvbG9hZGVycwppbiBMaWIv
aW1wb3J0bGliL19ib290c3RyYXBbX2V4dGVybmFsXS5weSAoYnVpbHRpbi9mcm96ZW4vZXh0ZW5z
aW9uKS4KCj4KPgo+IFBvc3NpYmxlIEZ1dHVyZSBFeHRlbnNpb25zCj4gPT09PT09PT09PT09PT09
PT09PT09PT09PT0KPgo+IFRoZSBzbG90cyBtZWNoYW5pc20sIGluc3BpcmVkIGJ5IFB5VHlwZV9T
bG90IGZyb20gUEVQIDM4NCwKPiBhbGxvd3MgbGF0ZXIgZXh0ZW5zaW9ucy4KPgo+IFNvbWUgZXh0
ZW5zaW9uIG1vZHVsZXMgZXhwb3J0cyBtYW55IGNvbnN0YW50czsgZm9yIGV4YW1wbGUgX3NzbCBo
YXMKPiBhIGxvbmcgbGlzdCBvZiBjYWxscyBpbiB0aGUgZm9ybTo6Cj4KPiAgICAgUHlNb2R1bGVf
QWRkSW50Q29uc3RhbnQobSwgIlNTTF9FUlJPUl9aRVJPX1JFVFVSTiIsCj4gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIFBZX1NTTF9FUlJPUl9aRVJPX1JFVFVSTik7Cj4KPiBDb252ZXJ0aW5n
IHRoaXMgdG8gYSBkZWNsYXJhdGl2ZSBsaXN0LCBzaW1pbGFyIHRvIFB5TWV0aG9kRGVmLAo+IHdv
dWxkIHJlZHVjZSBib2lsZXJwbGF0ZSwgYW5kIHByb3ZpZGUgZnJlZSBlcnJvci1jaGVja2luZyB3
aGljaAo+IGlzIG9mdGVuIG1pc3NpbmcuCgpHcmVhdCBpZGVhLCBpbmNsdWRpbmcgYXMgaXQgYXBw
bGllcyB0byBvdGhlciBjb25zdGFudHMgYW5kIHR5cGVzLgoKPgo+IFN0cmluZyBjb25zdGFudHMg
YW5kIHR5cGVzIGNhbiBiZSBoYW5kbGVkIHNpbWlsYXJseS4KPiAoTm90ZSB0aGF0IG5vbi1kZWZh
dWx0IGJhc2VzIGZvciB0eXBlcyBjYW5ub3QgYmUgcG9ydGFibHkgc3BlY2lmaWVkCj4gc3RhdGlj
YWxseTsgdGhpcyBjYXNlIHdvdWxkIG5lZWQgYSBQeV9tb2RfZXhlYyBmdW5jdGlvbiB0aGF0IHJ1
bnMKPiBiZWZvcmUgdGhlIHNsb3RzIGFyZSBhZGRlZC4gVGhlIGZyZWUgZXJyb3ItY2hlY2tpbmcg
d291bGQgc3RpbGwgYmUKPiBiZW5lZmljaWFsLCB0aG91Z2guKQoKVGhpcyBpbXBsaWVzIHRvIG1l
IHRoYXQgbm93IGlzIHRoZSB0aW1lIHRvIGVuc3VyZSB0aGF0IHRoaXMgUEVQCmFwcHJvcHJpYXRl
bHkgYWNjb21tb2RhdGVzIHRoYXQgbmVlZC4gIEl0IHdvdWxkIGJlIHVuZm9ydHVuYXRlIGlmIHdl
CmhhZCB0byBsYXRlciBoYWNrIGluIHNvbWUgZXh0cmEgQVBJIHRvIGFjY29tbW9kYXRlIGEgdXNl
IGNhc2Ugd2UKYWxyZWFkeSBrbm93IGFib3V0LiAgQmV0dGVyIGlmIHdlIG1hZGUgc3VyZSB0aGUg
Y3VycmVudGx5IHByb3Bvc2VkCmNoYW5nZXMgY291bGQgYWNjb21tb2RhdGUgdGhlIG5lZWQsIGV2
ZW4gaWYgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoYXQKcGFydCB3ZXJlIG5vdCBwYXJ0IG9mIHRo
aXMgUEVQLgoKPgo+IEFub3RoZXIgcG9zc2liaWxpdHkgaXMgcHJvdmlkaW5nIGEgIm1haW4iIGZ1
bmN0aW9uIHRoYXQgd291bGQgYmUgcnVuCj4gd2hlbiB0aGUgbW9kdWxlIGlzIGdpdmVuIHRvIFB5
dGhvbidzIC1tIHN3aXRjaC4KPiBGb3IgdGhpcyB0byB3b3JrLCB0aGUgcnVucHkgbW9kdWxlIHdp
bGwgbmVlZCB0byBiZSBtb2RpZmllZCB0byB0YWtlCj4gYWR2YW50YWdlIG9mIE1vZHVsZVNwZWMt
YmFzZWQgbG9hZGluZyBpbnRyb2R1Y2VkIGluIFBFUCA0NTEuCgpJJ2xsIHBvaW50IG91dCB0aGF0
IHRoZSBwdXJlLVB5dGhvbiBlcXVpdmFsZW50IGhhcyBiZWVuIHByb3Bvc2VkIG9uIGEKbnVtYmVy
IG9mIG9jY2FzaW9ucyBhbmQgYmVlbiByZWplY3RlZCBldmVyeSB0aW1lLiAgSG93ZXZlciwgaW4g
dGhlCmNhc2Ugb2YgZXh0ZW5zaW9uIG1vZHVsZXMgaXQgaXMgbW9yZSBqdXN0aWZpYWJsZS4gIElm
IGV4dGVuc2lvbgptb2R1bGVzIGdhaW4gc3VjaCBhIG1lY2hhbmlzbSB0aGVuIGl0IG1heSBiZSBh
IGp1c3RpZmljYXRpb24gZm9yIGRvaW5nCnNvbWV0aGluZyBzaW1pbGFyIGluIFB5dGhvbi4KCj4g
QWxzbywgaXQgd2lsbCBiZSBuZWNlc3NhcnkgdG8gYWRkIGEgbWVjaGFuaXNtIGZvciBzZXR0aW5n
IHVwIGEgbW9kdWxlCj4gYWNjb3JkaW5nIHRvIHNsb3RzIGl0IHdhc24ndCBvcmlnaW5hbGx5IGRl
ZmluZWQgd2l0aC4KCldoYXQgZG9lcyB0aGlzIG1lYW4/Cgo+Cj4KPiBJbXBsZW1lbnRhdGlvbgo+
ID09PT09PT09PT09PT09Cj4KPiBXb3JrLWluLXByb2dyZXNzIGltcGxlbWVudGF0aW9uIGlzIGF2
YWlsYWJsZSBpbiBhIEdpdGh1YiByZXBvc2l0b3J5Cj4gWyNnaC1yZXBvXV87Cj4gYSBwYXRjaHNl
dCBpcyBhdCBbI2doLXBhdGNoXV8uCgpJJ2xsIGhhdmUgdG8gdGFrZSBhIGxvb2suCgo+IFtzbmlw
XQpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpJbXBvcnQt
U0lHIG1haWxpbmcgbGlzdApJbXBvcnQtU0lHQHB5dGhvbi5vcmcKaHR0cHM6Ly9tYWlsLnB5dGhv
bi5vcmcvbWFpbG1hbi9saXN0aW5mby9pbXBvcnQtc2lnCg==