PEP 489: Multi-phase extension module initialization; version 6
Petr Viktorin <[email protected]> Wed, 20 May 2015 13:34:04 +0200
| Newsgroups | gmane.comp.python.import |
|---|---|
| Message-ID | <CA+=+wqAsvYgKy+f2zD5F+i02KRgAQ+2T=yZOeFNRaDp9MBpnaA@mail.gmail.com> |
SGVsbG8sCkJhc2VkIG1haW5seSBvbiBjb21tZW50cyBieSBFcmljIFNub3csIEkndmUgc2VudCBh bm90aGVyIHVwZGF0ZSB0byBQRVAgNDg5LgoKU2VlIHRoZSBkaWZmIGF0IGh0dHBzOi8vaGcucHl0 aG9uLm9yZy9wZXBzL3Jldi9hYWQ3YTM5YTY5NWIKCkhlcmUgaXMgYSBjb3B5IGZvciB5b3VyIGNv bnZlbmllbmNlOgoKUEVQOiA0ODkKVGl0bGU6IE11bHRpLXBoYXNlIGV4dGVuc2lvbiBtb2R1bGUg aW5pdGlhbGl6YXRpb24KVmVyc2lvbjogJFJldmlzaW9uJApMYXN0LU1vZGlmaWVkOiAkRGF0ZSQK QXV0aG9yOiBQZXRyIFZpa3RvcmluIDxlbmN1a291QGdtYWlsLmNvbT4sCiAgICAgICAgU3RlZmFu IEJlaG5lbCA8c3RlZmFuX21sQGJlaG5lbC5kZT4sCiAgICAgICAgTmljayBDb2dobGFuIDxuY29n aGxhbkBnbWFpbC5jb20+CkRpc2N1c3Npb25zLVRvOiBpbXBvcnQtc2lnQHB5dGhvbi5vcmcKU3Rh dHVzOiBEcmFmdApUeXBlOiBTdGFuZGFyZHMgVHJhY2sKQ29udGVudC1UeXBlOiB0ZXh0L3gtcnN0 CkNyZWF0ZWQ6IDExLUF1Zy0yMDEzClB5dGhvbi1WZXJzaW9uOiAzLjUKUG9zdC1IaXN0b3J5OiAy My1BdWctMjAxMywgMjAtRmViLTIwMTUsIDE2LUFwci0yMDE1ClJlc29sdXRpb246CgoKQWJzdHJh Y3QKPT09PT09PT0KClRoaXMgUEVQIHByb3Bvc2VzIGEgcmVkZXNpZ24gb2YgdGhlIHdheSBpbiB3 aGljaCBidWlsdC1pbiBhbmQgZXh0ZW5zaW9uIG1vZHVsZXMKaW50ZXJhY3Qgd2l0aCB0aGUgaW1w b3J0IG1hY2hpbmVyeS4gVGhpcyB3YXMgbGFzdCByZXZpc2VkIGZvciBQeXRob24gMy4wIGluIFBF UAozMTIxLCBidXQgZGlkIG5vdCBzb2x2ZSBhbGwgcHJvYmxlbXMgYXQgdGhlIHRpbWUuIFRoZSBn b2FsIGlzIHRvIHNvbHZlCmltcG9ydC1yZWxhdGVkIHByb2JsZW1zIGJ5IGJyaW5naW5nIGV4dGVu c2lvbiBtb2R1bGVzIGNsb3NlciB0byB0aGUgd2F5IFB5dGhvbgptb2R1bGVzIGJlaGF2ZTsgc3Bl Y2lmaWNhbGx5IHRvIGhvb2sgaW50byB0aGUgTW9kdWxlU3BlYy1iYXNlZCBsb2FkaW5nCm1lY2hh bmlzbSBpbnRyb2R1Y2VkIGluIFBFUCA0NTEuCgpUaGlzIHByb3Bvc2FsIGRyYXdzIGluc3BpcmF0 aW9uIGZyb20gUHlUeXBlX1NwZWMgb2YgUEVQIDM4NCB0byBhbGxvdyBleHRlbnNpb24KYXV0aG9y cyB0byBvbmx5IGRlZmluZSBmZWF0dXJlcyB0aGV5IG5lZWQsIGFuZCB0byBhbGxvdyBmdXR1cmUg YWRkaXRpb25zCnRvIGV4dGVuc2lvbiBtb2R1bGUgZGVjbGFyYXRpb25zLgoKRXh0ZW5zaW9ucyBt b2R1bGVzIGFyZSBjcmVhdGVkIGluIGEgdHdvLXN0ZXAgcHJvY2VzcywgZml0dGluZyBiZXR0ZXIg aW50bwp0aGUgTW9kdWxlU3BlYyBhcmNoaXRlY3R1cmUsIHdpdGggcGFyYWxsZWxzIHRvIF9fbmV3 X18gYW5kIF9faW5pdF9fIG9mIGNsYXNzZXMuCgpFeHRlbnNpb24gbW9kdWxlcyBjYW4gc2FmZWx5 IHN0b3JlIGFyYml0cmFyeSBDLWxldmVsIHBlci1tb2R1bGUgc3RhdGUgaW4KdGhlIG1vZHVsZSB0 aGF0IGlzIGNvdmVyZWQgYnkgbm9ybWFsIGdhcmJhZ2UgY29sbGVjdGlvbiBhbmQgc3VwcG9ydHMK cmVsb2FkaW5nIGFuZCBzdWItaW50ZXJwcmV0ZXJzLgpFeHRlbnNpb24gYXV0aG9ycyBhcmUgZW5j b3VyYWdlZCB0byB0YWtlIHRoZXNlIGlzc3VlcyBpbnRvIGFjY291bnQKd2hlbiB1c2luZyB0aGUg bmV3IEFQSS4KClRoZSBwcm9wb3NhbCBhbHNvIGFsbG93cyBleHRlbnNpb24gbW9kdWxlcyB3aXRo IG5vbi1BU0NJSSBuYW1lcy4KCk5vdCBhbGwgcHJvYmxlbXMgdGFja2xlZCBpbiBQRVAgMzEyMSBh cmUgc29sdmVkIGluIHRoaXMgcHJvcG9zYWwuCkluIHBhcnRpY3VsYXIsIHByb2JsZW1zIHdpdGgg cnVuLXRpbWUgbW9kdWxlIGxvb2t1cCAoUHlTdGF0ZV9GaW5kTW9kdWxlKQphcmUgbGVmdCB0byBh IGZ1dHVyZSBQRVAuCgoKTW90aXZhdGlvbgo9PT09PT09PT09CgpQeXRob24gbW9kdWxlcyBhbmQg ZXh0ZW5zaW9uIG1vZHVsZXMgYXJlIG5vdCBiZWluZyBzZXQgdXAgaW4gdGhlIHNhbWUgd2F5LgpG b3IgUHl0aG9uIG1vZHVsZXMsIHRoZSBtb2R1bGUgb2JqZWN0IGlzIGNyZWF0ZWQgYW5kIHNldCB1 cCBmaXJzdCwgdGhlbiB0aGUKbW9kdWxlIGNvZGUgaXMgYmVpbmcgZXhlY3V0ZWQgKFBFUCAzMDIp LgpBIE1vZHVsZVNwZWMgb2JqZWN0IChQRVAgNDUxKSBpcyB1c2VkIHRvIGhvbGQgaW5mb3JtYXRp b24gYWJvdXQgdGhlIG1vZHVsZSwKYW5kIHBhc3NlZCB0byB0aGUgcmVsZXZhbnQgaG9va3MuCgpG b3IgZXh0ZW5zaW9ucyAoaS5lLiBzaGFyZWQgbGlicmFyaWVzKSBhbmQgYnVpbHQtaW4gbW9kdWxl cywgdGhlIG1vZHVsZQppbml0IGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIHN0cmFpZ2h0IGF3YXkgYW5k IGRvZXMgYm90aCB0aGUgY3JlYXRpb24gYW5kCmluaXRpYWxpemF0aW9uLiBUaGUgaW5pdGlhbGl6 YXRpb24gZnVuY3Rpb24gaXMgbm90IHBhc3NlZCB0aGUgTW9kdWxlU3BlYywKb3IgYW55IGluZm9y bWF0aW9uIGl0IGNvbnRhaW5zLCBzdWNoIGFzIHRoZSBfX2ZpbGVfXyBvciBmdWxseS1xdWFsaWZp ZWQKbmFtZS4gVGhpcyBoaW5kZXJzIHJlbGF0aXZlIGltcG9ydHMgYW5kIHJlc291cmNlIGxvYWRp bmcuCgpJbiBQeTMsIG1vZHVsZXMgYXJlIGFsc28gbm90IGJlaW5nIGFkZGVkIHRvIHN5cy5tb2R1 bGVzLCB3aGljaCBtZWFucyB0aGF0IGEKKHBvdGVudGlhbGx5IHRyYW5zaXRpdmUpIHJlLWltcG9y dCBvZiB0aGUgbW9kdWxlIHdpbGwgcmVhbGx5IHRyeSB0byByZS1pbXBvcnQKaXQgYW5kIHRodXMg cnVuIGludG8gYW4gaW5maW5pdGUgbG9vcCB3aGVuIGl0IGV4ZWN1dGVzIHRoZSBtb2R1bGUgaW5p dCBmdW5jdGlvbgphZ2Fpbi4gV2l0aG91dCBhY2Nlc3MgdG8gdGhlIGZ1bGx5LXF1YWxpZmllZCBt b2R1bGUgbmFtZSwgaXQgaXMgbm90IHRyaXZpYWwgdG8KY29ycmVjdGx5IGFkZCB0aGUgbW9kdWxl IHRvIHN5cy5tb2R1bGVzIGVpdGhlci4KVGhpcyBpcyBzcGVjaWZpY2FsbHkgYSBwcm9ibGVtIGZv ciBDeXRob24gZ2VuZXJhdGVkIG1vZHVsZXMsIGZvciB3aGljaCBpdCdzCm5vdCB1bmNvbW1vbiB0 aGF0IHRoZSBtb2R1bGUgaW5pdCBjb2RlIGhhcyB0aGUgc2FtZSBsZXZlbCBvZiBjb21wbGV4aXR5 IGFzCnRoYXQgb2YgYW55ICdyZWd1bGFyJyBQeXRob24gbW9kdWxlLiBBbHNvLCB0aGUgbGFjayBv ZiBfX2ZpbGVfXyBhbmQgX19uYW1lX18KaW5mb3JtYXRpb24gaGluZGVycyB0aGUgY29tcGlsYXRp b24gb2YgIl9faW5pdF9fLnB5IiBtb2R1bGVzLCBpLmUuIHBhY2thZ2VzLAplc3BlY2lhbGx5IHdo ZW4gcmVsYXRpdmUgaW1wb3J0cyBhcmUgYmVpbmcgdXNlZCBhdCBtb2R1bGUgaW5pdCB0aW1lLgoK RnVydGhlcm1vcmUsIHRoZSBtYWpvcml0eSBvZiBjdXJyZW50bHkgZXhpc3RpbmcgZXh0ZW5zaW9u IG1vZHVsZXMgaGFzCnByb2JsZW1zIHdpdGggc3ViLWludGVycHJldGVyIHN1cHBvcnQgYW5kL29y IGludGVycHJldGVyIHJlbG9hZGluZywgYW5kLCB3aGlsZQppdCBpcyBwb3NzaWJsZSB3aXRoIHRo ZSBjdXJyZW50IGluZnJhc3RydWN0dXJlIHRvIHN1cHBvcnQgdGhlc2UKZmVhdHVyZXMsIGl0IGlz IG5laXRoZXIgZWFzeSBub3IgZWZmaWNpZW50LgpBZGRyZXNzaW5nIHRoZXNlIGlzc3VlcyB3YXMg dGhlIGdvYWwgb2YgUEVQIDMxMjEsIGJ1dCBtYW55IGV4dGVuc2lvbnMsCmluY2x1ZGluZyBzb21l IGluIHRoZSBzdGFuZGFyZCBsaWJyYXJ5LCB0b29rIHRoZSBsZWFzdC1lZmZvcnQgYXBwcm9hY2gK dG8gcG9ydGluZyB0byBQeXRob24gMywgbGVhdmluZyB0aGVzZSBpc3N1ZXMgdW5yZXNvbHZlZC4K VGhpcyBQRVAga2VlcHMgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIHdoaWNoIHNob3VsZCByZWR1 Y2UgcHJlc3N1cmUgYW5kIGdpdmUKZXh0ZW5zaW9uIGF1dGhvcnMgYWRlcXVhdGUgdGltZSB0byBj b25zaWRlciB0aGVzZSBpc3N1ZXMgd2hlbiBwb3J0aW5nLgoKClRoZSBjdXJyZW50IHByb2Nlc3MK PT09PT09PT09PT09PT09PT09PQoKQ3VycmVudGx5LCBleHRlbnNpb24gYW5kIGJ1aWx0LWluIG1v ZHVsZXMgZXhwb3J0IGFuIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uCm5hbWVkICJQeUluaXRfbW9k dWxlbmFtZSIsIG5hbWVkIGFmdGVyIHRoZSBmaWxlIG5hbWUgb2YgdGhlIHNoYXJlZCBsaWJyYXJ5 LgpUaGlzIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIGJ5IHRoZSBpbXBvcnQgbWFjaGluZXJ5IGFuZCBt dXN0IHJldHVybiBhIGZ1bGx5CmluaXRpYWxpemVkIG1vZHVsZSBvYmplY3QuClRoZSBmdW5jdGlv biByZWNlaXZlcyBubyBhcmd1bWVudHMsIHNvIGl0IGhhcyBubyB3YXkgb2Yga25vd2luZyBhYm91 dCBpdHMKaW1wb3J0IGNvbnRleHQuCgpEdXJpbmcgaXRzIGV4ZWN1dGlvbiwgdGhlIG1vZHVsZSBp bml0IGZ1bmN0aW9uIGNyZWF0ZXMgYSBtb2R1bGUgb2JqZWN0CmJhc2VkIG9uIGEgUHlNb2R1bGVE ZWYgb2JqZWN0LiBJdCB0aGVuIGNvbnRpbnVlcyB0byBpbml0aWFsaXplIGl0IGJ5IGFkZGluZwph dHRyaWJ1dGVzIHRvIHRoZSBtb2R1bGUgZGljdCwgY3JlYXRpbmcgdHlwZXMsIGV0Yy4KCkluIHRo ZSBiYWNrLCB0aGUgc2hhcmVkIGxpYnJhcnkgbG9hZGVyIGtlZXBzIGEgbm90ZSBvZiB0aGUgZnVs bHkgcXVhbGlmaWVkCm1vZHVsZSBuYW1lIG9mIHRoZSBsYXN0IG1vZHVsZSB0aGF0IGl0IGxvYWRl ZCwgYW5kIHdoZW4gYSBtb2R1bGUgZ2V0cwpjcmVhdGVkIHRoYXQgaGFzIGEgbWF0Y2hpbmcgbmFt ZSwgdGhpcyBnbG9iYWwgdmFyaWFibGUgaXMgdXNlZCB0byBkZXRlcm1pbmUKdGhlIGZ1bGx5IHF1 YWxpZmllZCBuYW1lIG9mIHRoZSBtb2R1bGUgb2JqZWN0LiBUaGlzIGlzIG5vdCBlbnRpcmVseSBz YWZlIGFzIGl0CnJlbGllcyBvbiB0aGUgbW9kdWxlIGluaXQgZnVuY3Rpb24gY3JlYXRpbmcgaXRz IG93biBtb2R1bGUgb2JqZWN0IGZpcnN0LApidXQgdGhpcyBhc3N1bXB0aW9uIHVzdWFsbHkgaG9s ZHMgaW4gcHJhY3RpY2UuCgoKVGhlIHByb3Bvc2FsCj09PT09PT09PT09PQoKVGhlIGluaXRpYWxp emF0aW9uIGZ1bmN0aW9uIChQeUluaXRfbW9kdWxlbmFtZSkgd2lsbCBiZSBhbGxvd2VkIHRvIHJl dHVybgphIHBvaW50ZXIgdG8gYSBQeU1vZHVsZURlZiBvYmplY3QuIFRoZSBpbXBvcnQgbWFjaGlu ZXJ5IHdpbGwgYmUgaW4gY2hhcmdlCm9mIGNvbnN0cnVjdGluZyB0aGUgbW9kdWxlIG9iamVjdCwg Y2FsbGluZyBob29rcyBwcm92aWRlZCBpbiB0aGUgUHlNb2R1bGVEZWYKaW4gdGhlIHJlbGV2YW50 IHBoYXNlcyBvZiBpbml0aWFsaXphdGlvbiAoYXMgZGVzY3JpYmVkIGJlbG93KS4KClRoaXMgbXVs dGktcGhhc2UgaW5pdGlhbGl6YXRpb24gaXMgYW4gYWRkaXRpb25hbCBwb3NzaWJpbGl0eS4gU2lu Z2xlLXBoYXNlCmluaXRpYWxpemF0aW9uLCB0aGUgY3VycmVudCBwcmFjdGljZSBvZiByZXR1cm5p bmcgYSBmdWxseSBpbml0aWFsaXplZCBtb2R1bGUKb2JqZWN0LCB3aWxsIHN0aWxsIGJlIGFjY2Vw dGVkLCBzbyBleGlzdGluZyBjb2RlIHdpbGwgd29yayB1bmNoYW5nZWQsCmluY2x1ZGluZyBiaW5h cnkgY29tcGF0aWJpbGl0eS4KClRoZSBQeU1vZHVsZURlZiBzdHJ1Y3R1cmUgd2lsbCBiZSBjaGFu Z2VkIHRvIGNvbnRhaW4gYSBsaXN0IG9mIHNsb3RzLApzaW1pbGFybHkgdG8gUEVQIDM4NCdzIFB5 VHlwZV9TcGVjIGZvciB0eXBlcy4KVG8ga2VlcCBiaW5hcnkgY29tcGF0aWJpbGl0eSwgYW5kIGF2 b2lkIG5lZWRpbmcgdG8gaW50cm9kdWNlIGEgbmV3IHN0cnVjdHVyZQood2hpY2ggd291bGQgaW50 cm9kdWNlIGFkZGl0aW9uYWwgc3VwcG9ydGluZyBmdW5jdGlvbnMgYW5kIHBlci1tb2R1bGUgc3Rv cmFnZSksCnRoZSBjdXJyZW50bHkgdW51c2VkIG1fcmVsb2FkIHBvaW50ZXIgb2YgUHlNb2R1bGVE ZWYgd2lsbCBiZSBjaGFuZ2VkIHRvCmhvbGQgdGhlIHNsb3RzLiBUaGUgc3RydWN0dXJlcyBhcmUg ZGVmaW5lZCBhczo6CgogICAgdHlwZWRlZiBzdHJ1Y3QgewogICAgICAgIGludCBzbG90OwogICAg ICAgIHZvaWQgKnZhbHVlOwogICAgfSBQeU1vZHVsZURlZl9TbG90OwoKICAgIHR5cGVkZWYgc3Ry dWN0IFB5TW9kdWxlRGVmIHsKICAgICAgICBQeU1vZHVsZURlZl9CYXNlIG1fYmFzZTsKICAgICAg ICBjb25zdCBjaGFyKiBtX25hbWU7CiAgICAgICAgY29uc3QgY2hhciogbV9kb2M7CiAgICAgICAg UHlfc3NpemVfdCBtX3NpemU7CiAgICAgICAgUHlNZXRob2REZWYgKm1fbWV0aG9kczsKICAgICAg ICBQeU1vZHVsZURlZl9TbG90ICptX3Nsb3RzOyAgLyogY2hhbmdlZCBmcm9tIGBpbnF1aXJ5IG1f cmVsb2FkO2AgKi8KICAgICAgICB0cmF2ZXJzZXByb2MgbV90cmF2ZXJzZTsKICAgICAgICBpbnF1 aXJ5IG1fY2xlYXI7CiAgICAgICAgZnJlZWZ1bmMgbV9mcmVlOwogICAgfSBQeU1vZHVsZURlZjsK ClRoZSAqbV9zbG90cyogbWVtYmVyIG11c3QgYmUgZWl0aGVyIE5VTEwsIG9yIHBvaW50IHRvIGFu IGFycmF5IG9mClB5TW9kdWxlRGVmX1Nsb3Qgc3RydWN0dXJlcywgdGVybWluYXRlZCBieSBhIHNs b3Qgd2l0aCBpZCBzZXQgdG8gMAooaS5lLiBgYHswLCBOVUxMfWBgKS4KClRvIHNwZWNpZnkgYSBz bG90LCBhIHVuaXF1ZSBzbG90IElEIG11c3QgYmUgcHJvdmlkZWQuCk5ldyBQeXRob24gdmVyc2lv bnMgbWF5IGludHJvZHVjZSBuZXcgc2xvdCBJRHMsIGJ1dCBzbG90IElEcyB3aWxsIG5ldmVyIGJl CnJlY3ljbGVkLiBTbG90cyBtYXkgZ2V0IGRlcHJlY2F0ZWQsIGJ1dCB3aWxsIGNvbnRpbnVlIHRv IGJlIHN1cHBvcnRlZAp0aHJvdWdob3V0IFB5dGhvbiAzLnguCgpBIHNsb3QncyB2YWx1ZSBwb2lu dGVyIG1heSBub3QgYmUgTlVMTCwgdW5sZXNzIHNwZWNpZmllZCBvdGhlcndpc2UgaW4gdGhlCnNs b3QncyBkb2N1bWVudGF0aW9uLgoKVGhlIGZvbGxvd2luZyBzbG90cyBhcmUgY3VycmVudGx5IGF2 YWlsYWJsZSwgYW5kIGRlc2NyaWJlZCBsYXRlcjoKCiogUHlfbW9kX2NyZWF0ZQoqIFB5X21vZF9l eGVjCgpVbmtub3duIHNsb3QgSURzIHdpbGwgY2F1c2UgdGhlIGltcG9ydCB0byBmYWlsIHdpdGgg U3lzdGVtRXJyb3IuCgpXaGVuIHVzaW5nIG11bHRpLXBoYXNlIGluaXRpYWxpemF0aW9uLCB0aGUg Km1fbmFtZSogZmllbGQgb2YgUHlNb2R1bGVEZWYgd2lsbApub3QgYmUgdXNlZCBkdXJpbmcgaW1w b3J0aW5nOyB0aGUgbW9kdWxlIG5hbWUgd2lsbCBiZSB0YWtlbiBmcm9tIHRoZSBNb2R1bGVTcGVj LgoKVG8gcHJldmVudCBjcmFzaGVzIHdoZW4gdGhlIG1vZHVsZSBpcyBsb2FkZWQgaW4gb2xkZXIg dmVyc2lvbnMgb2YgUHl0aG9uLAp0aGUgUHlNb2R1bGVEZWYgb2JqZWN0IG11c3QgYmUgaW5pdGlh bGl6ZWQgdXNpbmcgdGhlIG5ld2x5IGFkZGVkClB5TW9kdWxlRGVmX0luaXQgZnVuY3Rpb24uIFRo aXMgc2V0cyB0aGUgb2JqZWN0IHR5cGUgKHdoaWNoIGNhbm5vdCBiZSBkb25lCnN0YXRpY2FsbHkg b24gY2VydGFpbiBjb21waWxlcnMpLCByZWZjb3VudCwgYW5kIGludGVybmFsIGJvb2trZWVwaW5n IGRhdGEKKG1faW5kZXgpLgpGb3IgZXhhbXBsZSwgYW4gZXh0ZW5zaW9uIG1vZHVsZSAiZXhhbXBs ZSIgd291bGQgYmUgZXhwb3J0ZWQgYXM6OgoKICAgIHN0YXRpYyBQeU1vZHVsZURlZiBleGFtcGxl X2RlZiA9IHsuLi59CgogICAgUHlNT0RJTklUX0ZVTkMKICAgIFB5SW5pdF9leGFtcGxlKHZvaWQp CiAgICB7CiAgICAgICAgcmV0dXJuIFB5TW9kdWxlRGVmX0luaXQoJmV4YW1wbGVfZGVmKTsKICAg IH0KClRoZSBQeU1vZHVsZURlZiBvYmplY3QgbXVzdCBiZSBhdmFpbGFibGUgZm9yIHRoZSBsaWZl dGltZSBvZiB0aGUgbW9kdWxlIGNyZWF0ZWQKZnJvbSBpdCDigJMgdXN1YWxseSwgaXQgd2lsbCBi ZSBkZWNsYXJlZCBzdGF0aWNhbGx5LgoKUHNldWRvLWNvZGUgT3ZlcnZpZXcKLS0tLS0tLS0tLS0t LS0tLS0tLS0KCkhlcmUgaXMgYW4gb3ZlcnZpZXcgb2YgaG93IHRoZSBtb2RpZmllZCBpbXBvcnRl cnMgd2lsbCBvcGVyYXRlLgpEZXRhaWxzIHN1Y2ggYXMgbG9nZ2luZyBvciBoYW5kbGluZyBvZiBl cnJvcnMgYW5kIGludmFsaWQgc3RhdGVzCmFyZSBsZWZ0IG91dCwgYW5kIEMgY29kZSBpcyBwcmVz ZW50ZWQgd2l0aCBhIGNvbmNpc2UgUHl0aG9uLWxpa2Ugc3ludGF4LgoKVGhlIGZyYW1ld29yayB0 aGF0IGNhbGxzIHRoZSBpbXBvcnRlcnMgaXMgZXhwbGFpbmVkIGluIFBFUCA0NTEKWyNwZXAtMDQ1 MS1sb2FkaW5nXV8uCgo6OgoKICAgIGltcG9ydGxpYi9fYm9vdHN0cmFwLnB5OgoKICAgICAgICBj bGFzcyBCdWlsdGluSW1wb3J0ZXI6CiAgICAgICAgICAgIGRlZiBjcmVhdGVfbW9kdWxlKHNlbGYs IHNwZWMpOgogICAgICAgICAgICAgICAgbW9kdWxlID0gX2ltcC5jcmVhdGVfYnVpbHRpbihzcGVj KQoKICAgICAgICAgICAgZGVmIGV4ZWNfbW9kdWxlKHNlbGYsIG1vZHVsZSk6CiAgICAgICAgICAg ICAgICBfaW1wLmV4ZWNfZHluYW1pYyhtb2R1bGUpCgogICAgICAgICAgICBkZWYgbG9hZF9tb2R1 bGUoc2VsZiwgbmFtZSk6CiAgICAgICAgICAgICAgICAjIHVzZSBhIGJhY2t3YXJkcyBjb21wYXRp YmlsaXR5IHNoaW0KICAgICAgICAgICAgICAgIF9sb2FkX21vZHVsZV9zaGltKHNlbGYsIG5hbWUp CgogICAgaW1wb3J0bGliL19ib290c3RyYXBfZXh0ZXJuYWwucHk6CgogICAgICAgIGNsYXNzIEV4 dGVuc2lvbkZpbGVMb2FkZXI6CiAgICAgICAgICAgIGRlZiBjcmVhdGVfbW9kdWxlKHNlbGYsIHNw ZWMpOgogICAgICAgICAgICAgICAgbW9kdWxlID0gX2ltcC5jcmVhdGVfZHluYW1pYyhzcGVjKQoK ICAgICAgICAgICAgZGVmIGV4ZWNfbW9kdWxlKHNlbGYsIG1vZHVsZSk6CiAgICAgICAgICAgICAg ICBfaW1wLmV4ZWNfZHluYW1pYyhtb2R1bGUpCgogICAgICAgICAgICBkZWYgbG9hZF9tb2R1bGUo c2VsZiwgbmFtZSk6CiAgICAgICAgICAgICAgICAjIHVzZSBhIGJhY2t3YXJkcyBjb21wYXRpYmls aXR5IHNoaW0KICAgICAgICAgICAgICAgIF9sb2FkX21vZHVsZV9zaGltKHNlbGYsIG5hbWUpCgog ICAgUHl0aG9uL2ltcG9ydC5jICh0aGUgX2ltcCBtb2R1bGUpOgoKICAgICAgICBkZWYgY3JlYXRl X2R5bmFtaWMoc3BlYyk6CiAgICAgICAgICAgIG5hbWUgPSBzcGVjLm5hbWUKICAgICAgICAgICAg cGF0aCA9IHNwZWMub3JpZ2luCgogICAgICAgICAgICAjIEZpbmQgYW4gYWxyZWFkeSBsb2FkZWQg bW9kdWxlIHRoYXQgdXNlZCBzaW5nbGUtcGhhc2UgaW5pdC4KICAgICAgICAgICAgIyBGb3IgbXVs dGktcGhhc2UgaW5pdGlhbGl6YXRpb24sIG1vZCBpcyBOVUxMLCBzbyBhIG5ldyBtb2R1bGUKICAg ICAgICAgICAgIyBpcyBhbHdheXMgY3JlYXRlZC4KICAgICAgICAgICAgbW9kID0gX1B5SW1wb3J0 X0ZpbmRFeHRlbnNpb25PYmplY3QobmFtZSwgbmFtZSkKICAgICAgICAgICAgaWYgbW9kOgogICAg ICAgICAgICAgICAgcmV0dXJuIG1vZAoKICAgICAgICAgICAgcmV0dXJuIF9QeUltcG9ydF9Mb2Fk RHluYW1pY01vZHVsZVdpdGhTcGVjKHNwZWMpCgogICAgICAgIGRlZiBleGVjX2R5bmFtaWMobW9k dWxlKToKICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UobW9kdWxlLCB0eXBlcy5Nb2R1bGVU eXBlKToKICAgICAgICAgICAgICAgICMgbm9uLW1vZHVsZXMgYXJlIHNraXBwZWQgLS0gUHlNb2R1 bGVfR2V0RGVmIGZhaWxzIG9uIHRoZW0KICAgICAgICAgICAgICAgIHJldHVybgoKICAgICAgICAg ICAgZGVmID0gUHlNb2R1bGVfR2V0RGVmKG1vZHVsZSkKICAgICAgICAgICAgc3RhdGUgPSBQeU1v ZHVsZV9HZXRTdGF0ZShtb2R1bGUpCiAgICAgICAgICAgIGlmIHN0YXRlIGlzIE5VTEw6CiAgICAg ICAgICAgICAgICBQeU1vZHVsZV9FeGVjRGVmKG1vZHVsZSwgZGVmKQoKICAgICAgICBkZWYgY3Jl YXRlX2J1aWx0aW4oc3BlYyk6CiAgICAgICAgICAgIG5hbWUgPSBzcGVjLm5hbWUKCiAgICAgICAg ICAgICMgRmluZCBhbiBhbHJlYWR5IGxvYWRlZCBtb2R1bGUgdGhhdCB1c2VkIHNpbmdsZS1waGFz ZSBpbml0LgogICAgICAgICAgICAjIEZvciBtdWx0aS1waGFzZSBpbml0aWFsaXphdGlvbiwgbW9k IGlzIE5VTEwsIHNvIGEgbmV3IG1vZHVsZQogICAgICAgICAgICAjIGlzIGFsd2F5cyBjcmVhdGVk LgogICAgICAgICAgICBtb2QgPSBfUHlJbXBvcnRfRmluZEV4dGVuc2lvbk9iamVjdChuYW1lLCBu YW1lKQogICAgICAgICAgICBpZiBtb2Q6CiAgICAgICAgICAgICAgICByZXR1cm4gbW9kCgogICAg ICAgICAgICBmb3IgaW5pdG5hbWUsIGluaXRmdW5jIGluIFB5SW1wb3J0X0luaXR0YWI6CiAgICAg ICAgICAgICAgICBpZiBuYW1lID09IGluaXRuYW1lOgogICAgICAgICAgICAgICAgICAgIG0gPSBp bml0ZnVuYygpCiAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShtLCBQeU1vZHVsZURl Zik6CiAgICAgICAgICAgICAgICAgICAgICAgIGRlZiA9IG0KICAgICAgICAgICAgICAgICAgICAg ICAgcmV0dXJuIFB5TW9kdWxlX0Zyb21EZWZBbmRTcGVjKGRlZiwgc3BlYykKICAgICAgICAgICAg ICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAjIGZhbGwgYmFjayB0byBzaW5n bGUtcGhhc2UgaW5pdGlhbGl6YXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlID0g bQogICAgICAgICAgICAgICAgICAgICAgICBfUHlJbXBvcnRfRml4dXBFeHRlbnNpb25PYmplY3Qo bW9kdWxlLCBuYW1lLCBuYW1lKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9kdWxl CgogICAgUHl0aG9uL2ltcG9ydGRsLmM6CgogICAgICAgIGRlZiBfUHlJbXBvcnRfTG9hZER5bmFt aWNNb2R1bGVXaXRoU3BlYyhzcGVjKToKICAgICAgICAgICAgcGF0aCA9IHNwZWMub3JpZ2luCiAg ICAgICAgICAgIHBhY2thZ2UsIGRvdCwgbmFtZSA9IHNwZWMubmFtZS5ycGFydGl0aW9uKCcuJykK CiAgICAgICAgICAgICMgc2VlIHRoZSAiTm9uLUFTQ0lJIG1vZHVsZSBuYW1lcyIgc2VjdGlvbiBm b3IgZXhwb3J0X2hvb2tfbmFtZQogICAgICAgICAgICBob29rX25hbWUgPSBleHBvcnRfaG9va19u YW1lKG5hbWUpCgogICAgICAgICAgICAjIGNhbGwgcGxhdGZvcm0tc3BlY2lmaWMgZnVuY3Rpb24g Zm9yIGxvYWRpbmcgZXhwb3J0ZWQgZnVuY3Rpb24KICAgICAgICAgICAgIyBmcm9tIHNoYXJlZCBs aWJyYXJ5CiAgICAgICAgICAgIGV4cG9ydGZ1bmMgPSBfZmluZF9zaGFyZWRfZnVuY3B0cihob29r X25hbWUsIHBhdGgpCgogICAgICAgICAgICBtID0gZXhwb3J0ZnVuYygpCiAgICAgICAgICAgIGlm IGlzaW5zdGFuY2UobSwgUHlNb2R1bGVEZWYpOgogICAgICAgICAgICAgICAgZGVmID0gbQogICAg ICAgICAgICAgICAgcmV0dXJuIFB5TW9kdWxlX0Zyb21EZWZBbmRTcGVjKGRlZiwgc3BlYykKCiAg ICAgICAgICAgIG1vZHVsZSA9IG0KCiAgICAgICAgICAgICMgZmFsbCBiYWNrIHRvIHNpbmdsZS1w aGFzZSBpbml0aWFsaXphdGlvbgogICAgICAgICAgICAuLi4uCgogICAgT2JqZWN0cy9tb2R1bGVv YmplY3QuYzoKCiAgICAgICAgZGVmIFB5TW9kdWxlX0Zyb21EZWZBbmRTcGVjKGRlZiwgc3BlYyk6 CiAgICAgICAgICAgIG5hbWUgPSBzcGVjLm5hbWUKICAgICAgICAgICAgY3JlYXRlID0gTm9uZQog ICAgICAgICAgICBmb3Igc2xvdCwgdmFsdWUgaW4gZGVmLm1fc2xvdHM6CiAgICAgICAgICAgICAg ICBpZiBzbG90ID09IFB5X21vZF9jcmVhdGU6CiAgICAgICAgICAgICAgICAgICAgY3JlYXRlID0g dmFsdWUKICAgICAgICAgICAgaWYgY3JlYXRlOgogICAgICAgICAgICAgICAgbSA9IGNyZWF0ZShz cGVjLCBkZWYpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBtID0gUHlNb2R1bGVf TmV3KG5hbWUpCgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKG0sIHR5cGVzLk1vZHVsZVR5cGUp OgogICAgICAgICAgICAgICAgbS5tZF9zdGF0ZSA9IE5vbmUKICAgICAgICAgICAgICAgIG0ubWRf ZGVmID0gZGVmCgogICAgICAgICAgICBpZiBkZWYubV9tZXRob2RzOgogICAgICAgICAgICAgICAg UHlNb2R1bGVfQWRkRnVuY3Rpb25zKG0sIGRlZi5tX21ldGhvZHMpCiAgICAgICAgICAgIGlmIGRl Zi5tX2RvYzoKICAgICAgICAgICAgICAgIFB5TW9kdWxlX1NldERvY1N0cmluZyhtLCBkZWYubV9k b2MpCgogICAgICAgIGRlZiBQeU1vZHVsZV9FeGVjRGVmKG1vZHVsZSwgZGVmKToKICAgICAgICAg ICAgaWYgaXNpbnN0YW5jZShtb2R1bGUsIHR5cGVzLm1vZHVsZV90eXBlKToKICAgICAgICAgICAg ICAgIGlmIG1vZHVsZS5tZF9zdGF0ZSBpcyBOVUxMOgogICAgICAgICAgICAgICAgICAgICMgYWxs b2NhdGUgYSBibG9jayBvZiB6ZXJvZWQtb3V0IG1lbW9yeQogICAgICAgICAgICAgICAgICAgIG1v ZHVsZS5tZF9zdGF0ZSA9IF9hbGxvYyhtb2R1bGUubWRfc2l6ZSkKCiAgICAgICAgICAgIGlmIGRl Zi5tX3Nsb3RzIGlzIE5VTEw6CiAgICAgICAgICAgICAgICByZXR1cm4KCiAgICAgICAgICAgIGZv ciBzbG90LCB2YWx1ZSBpbiBkZWYubV9zbG90czoKICAgICAgICAgICAgICAgIGlmIHNsb3QgPT0g UHlfbW9kX2V4ZWM6CiAgICAgICAgICAgICAgICAgICAgdmFsdWUobW9kdWxlKQoKCk1vZHVsZSBD cmVhdGlvbiBQaGFzZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkNyZWF0aW9uIG9mIHRoZSBtb2R1 bGUgb2JqZWN0IOKAkyB0aGF0IGlzLCB0aGUgaW1wbGVtZW50YXRpb24gb2YKRXhlY3V0aW9uTG9h ZGVyLmNyZWF0ZV9tb2R1bGUg4oCTIGlzIGdvdmVybmVkIGJ5IHRoZSBQeV9tb2RfY3JlYXRlIHNs b3QuCgpUaGUgUHlfbW9kX2NyZWF0ZSBzbG90Ci4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KClRoZSBQ eV9tb2RfY3JlYXRlIHNsb3QgaXMgdXNlZCB0byBzdXBwb3J0IGN1c3RvbSBtb2R1bGUgc3ViY2xh c3Nlcy4KVGhlIHZhbHVlIHBvaW50ZXIgbXVzdCBwb2ludCB0byBhIGZ1bmN0aW9uIHdpdGggdGhl IGZvbGxvd2luZyBzaWduYXR1cmU6OgoKICAgIFB5T2JqZWN0KiAoKlB5TW9kdWxlQ3JlYXRlRnVu Y3Rpb24pKFB5T2JqZWN0ICpzcGVjLCBQeU1vZHVsZURlZiAqZGVmKQoKVGhlIGZ1bmN0aW9uIHJl Y2VpdmVzIGEgTW9kdWxlU3BlYyBpbnN0YW5jZSwgYXMgZGVmaW5lZCBpbiBQRVAgNDUxLAphbmQg dGhlIFB5TW9kdWxlRGVmIHN0cnVjdHVyZS4KSXQgc2hvdWxkIHJldHVybiBhIG5ldyBtb2R1bGUg b2JqZWN0LCBvciBzZXQgYW4gZXJyb3IKYW5kIHJldHVybiBOVUxMLgoKVGhpcyBmdW5jdGlvbiBp cyBub3QgcmVzcG9uc2libGUgZm9yIHNldHRpbmcgaW1wb3J0LXJlbGF0ZWQgYXR0cmlidXRlcwpz cGVjaWZpZWQgaW4gUEVQIDQ1MSBbI3BlcC0wNDUxLWF0dHJpYnV0ZXNdXyAoc3VjaCBhcyBgYF9f bmFtZV9fYGAgb3IKYGBfX2xvYWRlcl9fYGApIG9uIHRoZSBuZXcgbW9kdWxlLgoKVGhlcmUgaXMg bm8gcmVxdWlyZW1lbnQgZm9yIHRoZSByZXR1cm5lZCBvYmplY3QgdG8gYmUgYW4gaW5zdGFuY2Ug b2YKdHlwZXMuTW9kdWxlVHlwZS4gQW55IHR5cGUgY2FuIGJlIHVzZWQsIGFzIGxvbmcgYXMgaXQg c3VwcG9ydHMgc2V0dGluZyBhbmQKZ2V0dGluZyBhdHRyaWJ1dGVzLCBpbmNsdWRpbmcgYXQgbGVh c3QgdGhlIGltcG9ydC1yZWxhdGVkIGF0dHJpYnV0ZXMuCkhvd2V2ZXIsIG9ubHkgTW9kdWxlVHlw ZSBpbnN0YW5jZXMgc3VwcG9ydCBtb2R1bGUtc3BlY2lmaWMgZnVuY3Rpb25hbGl0eQpzdWNoIGFz IHBlci1tb2R1bGUgc3RhdGUuCgpOb3RlIHRoYXQgd2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxl ZCwgdGhlIG1vZHVsZSdzIGVudHJ5IGluIHN5cy5tb2R1bGVzCmlzIG5vdCBwb3B1bGF0ZWQgeWV0 LiBBdHRlbXB0aW5nIHRvIGltcG9ydCB0aGUgc2FtZSBtb2R1bGUgYWdhaW4KKHBvc3NpYmx5IHRy YW5zaXRpdmVseSksIG1heSBsZWFkIHRvIGFuIGluZmluaXRlIGxvb3AuCkV4dGVuc2lvbiBhdXRo b3JzIGFyZSBhZHZpc2VkIHRvIGtlZXAgUHlfbW9kX2NyZWF0ZSBtaW5pbWFsLCBhbiBpbiBwYXJ0 aWN1bGFyCnRvIG5vdCBjYWxsIHVzZXIgY29kZSBmcm9tIGl0LgoKTXVsdGlwbGUgUHlfbW9kX2Ny ZWF0ZSBzbG90cyBtYXkgbm90IGJlIHNwZWNpZmllZC4gSWYgdGhleSBhcmUsIGltcG9ydAp3aWxs IGZhaWwgd2l0aCBTeXN0ZW1FcnJvci4KCklmIFB5X21vZF9jcmVhdGUgaXMgbm90IHNwZWNpZmll ZCwgdGhlIGltcG9ydCBtYWNoaW5lcnkgd2lsbCBjcmVhdGUgYSBub3JtYWwKbW9kdWxlIG9iamVj dCB1c2luZyBQeU1vZHVsZV9OZXcuIFRoZSBuYW1lIGlzIHRha2VuIGZyb20gKnNwZWMqLgoKClBv c3QtY3JlYXRpb24gc3RlcHMKLi4uLi4uLi4uLi4uLi4uLi4uLgoKSWYgdGhlIFB5X21vZF9jcmVh dGUgZnVuY3Rpb24gcmV0dXJucyBhbiBpbnN0YW5jZSBvZiB0eXBlcy5Nb2R1bGVUeXBlCm9yIGEg c3ViY2xhc3MgKG9yIGlmIGEgUHlfbW9kX2NyZWF0ZSBzbG90IGlzIG5vdCBwcmVzZW50KSwgdGhl IGltcG9ydAptYWNoaW5lcnkgd2lsbCBhc3NvY2lhdGUgdGhlIFB5TW9kdWxlRGVmIHdpdGggdGhl IG1vZHVsZS4KVGhpcyBhbHNvIG1ha2VzIHRoZSBQeU1vZHVsZURlZiBhY2Nlc3NpYmxlIHRvIGV4 ZWN1dGlvbiBwaGFzZSwgdGhlClB5TW9kdWxlX0dldERlZiBmdW5jdGlvbiwgYW5kIGdhcmJhZ2Ug Y29sbGVjdGlvbiByb3V0aW5lcyAodHJhdmVyc2UsCmNsZWFyLCBmcmVlKS4KCklmIHRoZSBQeV9t b2RfY3JlYXRlIGZ1bmN0aW9uIGRvZXMgbm90IHJldHVybiBhIG1vZHVsZSBzdWJjbGFzcywgdGhl biBtX3NpemUKbXVzdCBiZSAwLCBhbmQgbV90cmF2ZXJzZSwgbV9jbGVhciBhbmQgbV9mcmVlIG11 c3QgYWxsIGJlIE5VTEwuCk90aGVyd2lzZSwgU3lzdGVtRXJyb3IgaXMgcmFpc2VkLgoKQWRkaXRp b25hbGx5LCBpbml0aWFsIGF0dHJpYnV0ZXMgc3BlY2lmaWVkIGluIHRoZSBQeU1vZHVsZURlZiBh cmUgc2V0IG9uIHRoZQptb2R1bGUgb2JqZWN0LCByZWdhcmRsZXNzIG9mIGl0cyB0eXBlOgoKKiBU aGUgZG9jc3RyaW5nIGlzIHNldCBmcm9tIG1fZG9jLCBpZiBub24tTlVMTC4KKiBUaGUgbW9kdWxl J3MgZnVuY3Rpb25zIGFyZSBpbml0aWFsaXplZCBmcm9tIG1fbWV0aG9kcywgaWYgYW55LgoKCk1v ZHVsZSBFeGVjdXRpb24gUGhhc2UKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKTW9kdWxlIGV4ZWN1 dGlvbiAtLSB0aGF0IGlzLCB0aGUgaW1wbGVtZW50YXRpb24gb2YKRXhlY3V0aW9uTG9hZGVyLmV4 ZWNfbW9kdWxlIC0tIGlzIGdvdmVybmVkIGJ5ICJleGVjdXRpb24gc2xvdHMiLgpUaGlzIFBFUCBv bmx5IGFkZHMgb25lLCBQeV9tb2RfZXhlYywgYnV0IG90aGVycyBtYXkgYmUgYWRkZWQgaW4gdGhl IGZ1dHVyZS4KClRoZSBleGVjdXRpb24gcGhhc2UgaXMgZG9uZSBvbiB0aGUgUHlNb2R1bGVEZWYg YXNzb2NpYXRlZCB3aXRoIHRoZSBtb2R1bGUKb2JqZWN0LiBGb3Igb2JqZWN0cyB0aGF0IGFyZSBu b3QgYSBzdWJjbGFzcyBvZiBQeU1vZHVsZV9UeXBlIChmb3Igd2hpY2gKUHlNb2R1bGVfR2V0RGVm IHdvdWxkIGZhaWwpLCB0aGUgZXhlY3V0aW9uIHBoYXNlIGlzIHNraXBwZWQuCgpFeGVjdXRpb24g c2xvdHMgbWF5IGJlIHNwZWNpZmllZCBtdWx0aXBsZSB0aW1lcywgYW5kIGFyZSBwcm9jZXNzZWQg aW4gdGhlIG9yZGVyCnRoZXkgYXBwZWFyIGluIHRoZSBzbG90cyBhcnJheS4KV2hlbiB1c2luZyB0 aGUgZGVmYXVsdCBpbXBvcnQgbWFjaGluZXJ5LCB0aGV5IGFyZSBwcm9jZXNzZWQgYWZ0ZXIKaW1w b3J0LXJlbGF0ZWQgYXR0cmlidXRlcyBzcGVjaWZpZWQgaW4gUEVQIDQ1MSBbI3BlcC0wNDUxLWF0 dHJpYnV0ZXNdXwooc3VjaCBhcyBgYF9fbmFtZV9fYGAgb3IgYGBfX2xvYWRlcl9fYGApIGFyZSBz ZXQgYW5kIHRoZSBtb2R1bGUgaXMgYWRkZWQKdG8gc3lzLm1vZHVsZXMuCgoKUHJlLUV4ZWN1dGlv biBzdGVwcwotLS0tLS0tLS0tLS0tLS0tLS0tCgpCZWZvcmUgcHJvY2Vzc2luZyB0aGUgZXhlY3V0 aW9uIHNsb3RzLCBwZXItbW9kdWxlIHN0YXRlIGlzIGFsbG9jYXRlZCBmb3IgdGhlCm1vZHVsZS4g RnJvbSB0aGlzIHBvaW50IG9uLCBwZXItbW9kdWxlIHN0YXRlIGlzIGFjY2Vzc2libGUgdGhyb3Vn aApQeU1vZHVsZV9HZXRTdGF0ZS4KCgpUaGUgUHlfbW9kX2V4ZWMgc2xvdAouLi4uLi4uLi4uLi4u Li4uLi4uLgoKVGhlIGVudHJ5IGluIHRoaXMgc2xvdCBtdXN0IHBvaW50IHRvIGEgZnVuY3Rpb24g d2l0aCB0aGUgZm9sbG93aW5nIHNpZ25hdHVyZTo6CgogICAgaW50ICgqUHlNb2R1bGVFeGVjRnVu Y3Rpb24pKFB5T2JqZWN0KiBtb2R1bGUpCgpJdCB3aWxsIGJlIGNhbGxlZCB0byBpbml0aWFsaXpl IGEgbW9kdWxlLiBVc3VhbGx5LCB0aGlzIGFtb3VudHMgdG8Kc2V0dGluZyB0aGUgbW9kdWxlJ3Mg aW5pdGlhbCBhdHRyaWJ1dGVzLgpUaGUgIm1vZHVsZSIgYXJndW1lbnQgcmVjZWl2ZXMgdGhlIG1v ZHVsZSBvYmplY3QgdG8gaW5pdGlhbGl6ZS4KCklmIFB5TW9kdWxlRXhlYyByZXBsYWNlcyB0aGUg bW9kdWxlJ3MgZW50cnkgaW4gc3lzLm1vZHVsZXMsCnRoZSBuZXcgb2JqZWN0IHdpbGwgYmUgdXNl ZCBhbmQgcmV0dXJuZWQgYnkgaW1wb3J0bGliIG1hY2hpbmVyeS4KKFRoaXMgbWlycm9ycyB0aGUg YmVoYXZpb3Igb2YgUHl0aG9uIG1vZHVsZXMuIE5vdGUgdGhhdCBpbXBsZW1lbnRpbmcKUHlfbW9k X2NyZWF0ZSBpcyB1c3VhbGx5IGEgYmV0dGVyIHNvbHV0aW9uIGZvciB0aGUgdXNlIGNhc2VzIHRo aXMgc2VydmVzLikKClRoZSBmdW5jdGlvbiBtdXN0IHJldHVybiBgYDBgYCBvbiBzdWNjZXNzLCBv ciwgb24gZXJyb3IsIHNldCBhbiBleGNlcHRpb24gYW5kCnJldHVybiBgYC0xYGAuCgoKTGVnYWN5 IEluaXQKLS0tLS0tLS0tLS0KClRoZSBiYWNrd2FyZHMtY29tcGF0aWJsZSBzaW5nbGUtcGhhc2Ug aW5pdGlhbGl6YXRpb24gY29udGludWVzIHRvIGJlIHN1cHBvcnRlZC4KSW4gdGhpcyBzY2hlbWUs IHRoZSBQeUluaXQgZnVuY3Rpb24gcmV0dXJucyBhIGZ1bGx5IGluaXRpYWxpemVkIG1vZHVsZSBy YXRoZXIKdGhhbiBhIFB5TW9kdWxlRGVmIG9iamVjdC4KSW4gdGhpcyBjYXNlLCB0aGUgUHlJbml0 IGhvb2sgaW1wbGVtZW50cyB0aGUgY3JlYXRpb24gcGhhc2UsIGFuZCB0aGUgZXhlY3V0aW9uCnBo YXNlIGlzIGEgbm8tb3AuCgpNb2R1bGVzIHRoYXQgbmVlZCB0byB3b3JrIHVuY2hhbmdlZCBvbiBv bGRlciB2ZXJzaW9ucyBvZiBQeXRob24gc2hvdWxkIHN0aWNrIHRvCnNpbmdsZS1waGFzZSBpbml0 aWFsaXphdGlvbiwgYmVjYXVzZSB0aGUgYmVuZWZpdHMgaXQgYnJpbmdzIGNhbid0IGJlCmJhY2st cG9ydGVkLgpIZXJlIGlzIGFuIGV4YW1wbGUgb2YgYSBtb2R1bGUgdGhhdCBzdXBwb3J0cyBtdWx0 aS1waGFzZSBpbml0aWFsaXphdGlvbiwKYW5kIGZhbGxzIGJhY2sgdG8gc2luZ2xlLXBoYXNlIHdo ZW4gY29tcGlsZWQgZm9yIGFuIG9sZGVyIHZlcnNpb24gb2YgQ1B5dGhvbi4KSXQgaXMgaW5jbHVk ZWQgbWFpbmx5IGFzIGFuIGlsbHVzdHJhdGlvbiBvZiB0aGUgY2hhbmdlcyBuZWVkZWQgdG8gZW5h YmxlCm11bHRpLXBoYXNlIGluaXQ6OgoKICAgICNpbmNsdWRlIDxQeXRob24uaD4KCiAgICBzdGF0 aWMgaW50IHNwYW1fZXhlYyhQeU9iamVjdCAqbW9kdWxlKSB7CiAgICAgICAgUHlNb2R1bGVfQWRk U3RyaW5nQ29uc3RhbnQobW9kdWxlLCAiZm9vZCIsICJzcGFtIik7CiAgICAgICAgcmV0dXJuIDA7 CiAgICB9CgogICAgI2lmZGVmIFB5X21vZF9leGVjCiAgICBzdGF0aWMgUHlNb2R1bGVEZWZfU2xv dCBzcGFtX3Nsb3RzW10gPSB7CiAgICAgICAge1B5X21vZF9leGVjLCBzcGFtX2V4ZWN9LAogICAg ICAgIHswLCBOVUxMfQogICAgfTsKICAgICNlbmRpZgoKICAgIHN0YXRpYyBQeU1vZHVsZURlZiBz cGFtX2RlZiA9IHsKICAgICAgICBQeU1vZHVsZURlZl9IRUFEX0lOSVQsICAgICAgICAgICAgICAg ICAgICAgIC8qIG1fYmFzZSAqLwogICAgICAgICJzcGFtIiwgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgLyogbV9uYW1lICovCiAgICAgICAgUHlEb2NfU1RSKCJVdGlsaXRpZXMg Zm9yIGNvb2tpbmcgc3BhbSIpLCAgICAvKiBtX2RvYyAqLwogICAgICAgIDAsICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbV9zaXplICovCiAgICAgICAgTlVMTCwg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtX21ldGhvZHMgKi8KICAg ICNpZmRlZiBQeV9tb2RfZXhlYwogICAgICAgIHNwYW1fc2xvdHMsICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgLyogbV9zbG90cyAqLwogICAgI2Vsc2UKICAgICAgICBOVUxMLAogICAg I2VuZGlmCiAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAvKiBtX3RyYXZlcnNlICovCiAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAvKiBtX2NsZWFyICovCiAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAvKiBtX2ZyZWUgKi8KICAgIH07CgogICAgUHlNT0RJTklU X0ZVTkMKICAgIFB5SW5pdF9zcGFtKHZvaWQpIHsKICAgICNpZmRlZiBQeV9tb2RfZXhlYwogICAg ICAgIHJldHVybiBQeU1vZHVsZURlZl9Jbml0KCZzcGFtX2RlZik7CiAgICAjZWxzZQogICAgICAg IFB5T2JqZWN0ICptb2R1bGU7CiAgICAgICAgbW9kdWxlID0gUHlNb2R1bGVfQ3JlYXRlKCZzcGFt X2RlZik7CiAgICAgICAgaWYgKG1vZHVsZSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKICAgICAgICBp ZiAoc3BhbV9leGVjKG1vZHVsZSkgIT0gMCkgewogICAgICAgICAgICBQeV9ERUNSRUYobW9kdWxl KTsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgfQogICAgICAgIHJldHVybiBtb2R1 bGU7CiAgICAjZW5kaWYKICAgIH0KCgpCdWlsdC1JbiBtb2R1bGVzCi0tLS0tLS0tLS0tLS0tLS0K CkFueSBleHRlbnNpb24gbW9kdWxlIGNhbiBiZSB1c2VkIGFzIGEgYnVpbHQtaW4gbW9kdWxlIGJ5 IGxpbmtpbmcgaXQgaW50bwp0aGUgZXhlY3V0YWJsZSwgYW5kIGluY2x1ZGluZyBpdCBpbiB0aGUg aW5pdHRhYiAoZWl0aGVyIGF0IHJ1bnRpbWUgd2l0aApQeUltcG9ydF9BcHBlbmRJbml0dGFiLCBv ciBhdCBjb25maWd1cmF0aW9uIHRpbWUsIHVzaW5nIHRvb2xzIGxpa2UgKmZyZWV6ZSopLgoKVG8g a2VlcCB0aGlzIHBvc3NpYmlsaXR5LCBhbGwgY2hhbmdlcyB0byBleHRlbnNpb24gbW9kdWxlIGxv YWRpbmcgaW50cm9kdWNlZAppbiB0aGlzIFBFUCB3aWxsIGFsc28gYXBwbHkgdG8gYnVpbHQtaW4g bW9kdWxlcy4KVGhlIG9ubHkgZXhjZXB0aW9uIGlzIG5vbi1BU0NJSSBtb2R1bGUgbmFtZXMsIGV4 cGxhaW5lZCBiZWxvdy4KCgpTdWJpbnRlcnByZXRlcnMgYW5kIEludGVycHJldGVyIFJlbG9hZGlu ZwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKRXh0ZW5zaW9ucyB1 c2luZyB0aGUgbmV3IGluaXRpYWxpemF0aW9uIHNjaGVtZSBhcmUgZXhwZWN0ZWQgdG8gc3VwcG9y dApzdWJpbnRlcnByZXRlcnMgYW5kIG11bHRpcGxlIFB5X0luaXRpYWxpemUvUHlfRmluYWxpemUg Y3ljbGVzIGNvcnJlY3RseSwKYXZvaWRpbmcgdGhlIGlzc3VlcyBtZW50aW9uZWQgaW4gUHl0aG9u IGRvY3VtZW50YXRpb24gWyNzdWJpbnRlcnByZXRlci1kb2NzXV8uClRoZSBtZWNoYW5pc20gaXMg ZGVzaWduZWQgdG8gbWFrZSB0aGlzIGVhc3ksIGJ1dCBjYXJlIGlzIHN0aWxsIHJlcXVpcmVkCm9u IHRoZSBwYXJ0IG9mIHRoZSBleHRlbnNpb24gYXV0aG9yLgpObyB1c2VyLWRlZmluZWQgZnVuY3Rp b25zLCBtZXRob2RzLCBvciBpbnN0YW5jZXMgbWF5IGxlYWsgdG8gZGlmZmVyZW50CmludGVycHJl dGVycy4KVG8gYWNoaWV2ZSB0aGlzLCBhbGwgbW9kdWxlLWxldmVsIHN0YXRlIHNob3VsZCBiZSBr ZXB0IGluIGVpdGhlciB0aGUgbW9kdWxlCmRpY3QsIG9yIGluIHRoZSBtb2R1bGUgb2JqZWN0J3Mg c3RvcmFnZSByZWFjaGFibGUgYnkgUHlNb2R1bGVfR2V0U3RhdGUuCkEgc2ltcGxlIHJ1bGUgb2Yg dGh1bWIgaXM6IERvIG5vdCBkZWZpbmUgYW55IHN0YXRpYyBkYXRhLCBleGNlcHQgYnVpbHQtaW4g dHlwZXMKd2l0aCBubyBtdXRhYmxlIG9yIHVzZXItc2V0dGFibGUgY2xhc3MgYXR0cmlidXRlcy4K CgpGdW5jdGlvbnMgaW5jb21wYXRpYmxlIHdpdGggbXVsdGktcGhhc2UgaW5pdGlhbGl6YXRpb24K LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpU aGUgUHlNb2R1bGVfQ3JlYXRlIGZ1bmN0aW9uIHdpbGwgZmFpbCB3aGVuIHVzZWQgb24gYSBQeU1v ZHVsZURlZiBzdHJ1Y3R1cmUKd2l0aCBhIG5vbi1OVUxMICptX3Nsb3RzKiBwb2ludGVyLgpUaGUg ZnVuY3Rpb24gZG9lc24ndCBoYXZlIGFjY2VzcyB0byB0aGUgTW9kdWxlU3BlYyBvYmplY3QgbmVj ZXNzYXJ5IGZvcgptdWx0aS1waGFzZSBpbml0aWFsaXphdGlvbi4KClRoZSBQeVN0YXRlX0ZpbmRN b2R1bGUgZnVuY3Rpb24gd2lsbCByZXR1cm4gTlVMTCwgYW5kIFB5U3RhdGVfQWRkTW9kdWxlCmFu ZCBQeVN0YXRlX1JlbW92ZU1vZHVsZSB3aWxsIGFsc28gZmFpbCBvbiBtb2R1bGVzIHdpdGggbm9u LU5VTEwgKm1fc2xvdHMqLgpQeVN0YXRlIHJlZ2lzdHJhdGlvbiBpcyBkaXNhYmxlZCBiZWNhdXNl IG11bHRpcGxlIG1vZHVsZSBvYmplY3RzIG1heSBiZSBjcmVhdGVkCmZyb20gdGhlIHNhbWUgUHlN b2R1bGVEZWYuCgoKTW9kdWxlIHN0YXRlIGFuZCBDLWxldmVsIGNhbGxiYWNrcwotLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpEdWUgdG8gdGhlIHVuYXZhaWxhYmlsaXR5IG9mIFB5 U3RhdGVfRmluZE1vZHVsZSwgYW55IGZ1bmN0aW9uIHRoYXQgbmVlZHMgYWNjZXNzCnRvIG1vZHVs ZS1sZXZlbCBzdGF0ZSAoaW5jbHVkaW5nIGZ1bmN0aW9ucywgY2xhc3NlcyBvciBleGNlcHRpb25z IGRlZmluZWQgYXQKdGhlIG1vZHVsZSBsZXZlbCkgbXVzdCByZWNlaXZlIGEgcmVmZXJlbmNlIHRv IHRoZSBtb2R1bGUgb2JqZWN0IChvciB0aGUKcGFydGljdWxhciBvYmplY3QgaXQgbmVlZHMpLCBl aXRoZXIgZGlyZWN0bHkgb3IgaW5kaXJlY3RseS4KVGhpcyBpcyBjdXJyZW50bHkgZGlmZmljdWx0 IGluIHR3byBzaXR1YXRpb25zOgoKKiBNZXRob2RzIG9mIGNsYXNzZXMsIHdoaWNoIHJlY2VpdmUg YSByZWZlcmVuY2UgdG8gdGhlIGNsYXNzLCBidXQgbm90IHRvCiAgdGhlIGNsYXNzJ3MgbW9kdWxl CiogTGlicmFyaWVzIHdpdGggQy1sZXZlbCBjYWxsYmFja3MsIHVubGVzcyB0aGUgY2FsbGJhY2tz IGNhbiByZWNlaXZlIGN1c3RvbQogIGRhdGEgc2V0IGF0IGNhbGxiYWNrIHJlZ2lzdHJhdGlvbgoK Rml4aW5nIHRoZXNlIGNhc2VzIGlzIG91dHNpZGUgb2YgdGhlIHNjb3BlIG9mIHRoaXMgUEVQLCBi dXQgd2lsbCBiZSBuZWVkZWQgZm9yCnRoZSBuZXcgbWVjaGFuaXNtIHRvIGJlIHVzZWZ1bCB0byBh bGwgbW9kdWxlcy4gUHJvcGVyIGZpeGVzIGhhdmUgYmVlbiBkaXNjdXNzZWQKb24gdGhlIGltcG9y dC1zaWcgbWFpbGluZyBsaXN0IFsjZmluZG1vZHVsZS1kaXNjdXNzaW9uXV8uCgpBcyBhIHJ1bGUg b2YgdGh1bWIsIG1vZHVsZXMgdGhhdCByZWx5IG9uIFB5U3RhdGVfRmluZE1vZHVsZSBhcmUsIGF0 IHRoZSBtb21lbnQsCm5vdCBnb29kIGNhbmRpZGF0ZXMgZm9yIHBvcnRpbmcgdG8gdGhlIG5ldyBt ZWNoYW5pc20uCgoKTmV3IEZ1bmN0aW9ucwotLS0tLS0tLS0tLS0tCgpBIG5ldyBmdW5jdGlvbiBh bmQgbWFjcm8gaW1wbGVtZW50aW5nIHRoZSBtb2R1bGUgY3JlYXRpb24gcGhhc2Ugd2lsbCBiZSBh ZGRlZC4KVGhlc2UgYXJlIHNpbWlsYXIgdG8gUHlNb2R1bGVfQ3JlYXRlIGFuZCBQeU1vZHVsZV9D cmVhdGUyLCBleGNlcHQgdGhleQp0YWtlIGFuIGFkZGl0aW9uYWwgTW9kdWxlU3BlYyBhcmd1bWVu dCwgYW5kIGhhbmRsZSBtb2R1bGUgZGVmaW5pdGlvbnMgd2l0aApub24tTlVMTCBzbG90czo6Cgog ICAgUHlPYmplY3QgKiBQeU1vZHVsZV9Gcm9tRGVmQW5kU3BlYyhQeU1vZHVsZURlZiAqZGVmLCBQ eU9iamVjdCAqc3BlYykKICAgIFB5T2JqZWN0ICogUHlNb2R1bGVfRnJvbURlZkFuZFNwZWMyKFB5 TW9kdWxlRGVmICpkZWYsIFB5T2JqZWN0ICpzcGVjLAogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgaW50IG1vZHVsZV9hcGlfdmVyc2lvbikKCkEgbmV3IGZ1bmN0aW9uIGlt cGxlbWVudGluZyB0aGUgbW9kdWxlIGV4ZWN1dGlvbiBwaGFzZSB3aWxsIGJlIGFkZGVkLgpUaGlz IGFsbG9jYXRlcyBwZXItbW9kdWxlIHN0YXRlIChpZiBub3QgYWxsb2NhdGVkIGFscmVhZHkpLCBh bmQgKmFsd2F5cyoKcHJvY2Vzc2VzIGV4ZWN1dGlvbiBzbG90cy4gVGhlIGltcG9ydCBtYWNoaW5l cnkgY2FsbHMgdGhpcyBtZXRob2Qgd2hlbgphIG1vZHVsZSBpcyBleGVjdXRlZCwgdW5sZXNzIHRo ZSBtb2R1bGUgaXMgYmVpbmcgcmVsb2FkZWQ6OgoKICAgIFB5QVBJX0ZVTkMoaW50KSBQeU1vZHVs ZV9FeGVjRGVmKFB5T2JqZWN0ICptb2R1bGUsIFB5TW9kdWxlRGVmICpkZWYpCgpBbm90aGVyIGZ1 bmN0aW9uIHdpbGwgYmUgaW50cm9kdWNlZCB0byBpbml0aWFsaXplIGEgUHlNb2R1bGVEZWYgb2Jq ZWN0LgpUaGlzIGlkZW1wb3RlbnQgZnVuY3Rpb24gZmlsbHMgaW4gdGhlIHR5cGUsIHJlZmNvdW50 LCBhbmQgbW9kdWxlIGluZGV4LgpJdCByZXR1cm5zIGl0cyBhcmd1bWVudCBjYXN0IHRvIFB5T2Jq ZWN0Kiwgc28gaXQgY2FuIGJlIHJldHVybmVkIGRpcmVjdGx5CmZyb20gYSBQeUluaXQgZnVuY3Rp b246OgoKICAgIFB5T2JqZWN0ICogUHlNb2R1bGVEZWZfSW5pdChQeU1vZHVsZURlZiAqKTsKCkFk ZGl0aW9uYWxseSwgdHdvIGhlbHBlcnMgd2lsbCBiZSBhZGRlZCBmb3Igc2V0dGluZyB0aGUgZG9j c3RyaW5nIGFuZAptZXRob2RzIG9uIGEgbW9kdWxlOjoKCiAgICBpbnQgUHlNb2R1bGVfU2V0RG9j U3RyaW5nKFB5T2JqZWN0ICosIGNvbnN0IGNoYXIgKikKICAgIGludCBQeU1vZHVsZV9BZGRGdW5j dGlvbnMoUHlPYmplY3QgKiwgUHlNZXRob2REZWYgKikKCgpFeHBvcnQgSG9vayBOYW1lCi0tLS0t LS0tLS0tLS0tLS0KCkFzIHBvcnRhYmxlIEMgaWRlbnRpZmllcnMgYXJlIGxpbWl0ZWQgdG8gQVND SUksIG1vZHVsZSBuYW1lcwptdXN0IGJlIGVuY29kZWQgdG8gZm9ybSB0aGUgUHlJbml0IGhvb2sg bmFtZS4KCkZvciBBU0NJSSBtb2R1bGUgbmFtZXMsIHRoZSBpbXBvcnQgaG9vayBpcyBuYW1lZApQ eUluaXRfPG1vZHVsZW5hbWU+LCB3aGVyZSA8bW9kdWxlbmFtZT4gaXMgdGhlIG5hbWUgb2YgdGhl IG1vZHVsZS4KCkZvciBtb2R1bGUgbmFtZXMgY29udGFpbmluZyBub24tQVNDSUkgY2hhcmFjdGVy cywgdGhlIGltcG9ydCBob29rIGlzIG5hbWVkClB5SW5pdFVfPGVuY29kZWRuYW1lPiwgd2hlcmUg dGhlIG5hbWUgaXMgZW5jb2RlZCB1c2luZyBDUHl0aG9uJ3MKInB1bnljb2RlIiBlbmNvZGluZyAo UHVueWNvZGUgWyNyZmMtMzQ5Ml1fIHdpdGggYSBsb3dlcmNhc2Ugc3VmZml4KSwKd2l0aCBoeXBo ZW5zICgiLSIpIHJlcGxhY2VkIGJ5IHVuZGVyc2NvcmVzICgiXyIpLgoKCkluIFB5dGhvbjo6Cgog ICAgZGVmIGV4cG9ydF9ob29rX25hbWUobmFtZSk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBz dWZmaXggPSBiJ18nICsgbmFtZS5lbmNvZGUoJ2FzY2lpJykKICAgICAgICBleGNlcHQgVW5pY29k ZUVuY29kZUVycm9yOgogICAgICAgICAgICBzdWZmaXggPSBiJ1VfJyArIG5hbWUuZW5jb2RlKCdw dW55Y29kZScpLnJlcGxhY2UoYictJywgYidfJykKICAgICAgICByZXR1cm4gYidQeUluaXQnICsg c3VmZml4CgpFeGFtcGxlczoKCj09PT09PT09PT09PT0gID09PT09PT09PT09PT09PT09PT0KTW9k dWxlIG5hbWUgICAgSW5pdCBob29rIG5hbWUKPT09PT09PT09PT09PSAgPT09PT09PT09PT09PT09 PT09PQpzcGFtICAgICAgICAgICBQeUluaXRfc3BhbQpsYW7EjW3DrXQgICAgICAgIFB5SW5pdFVf bGFubXRfMnNhNnQK44K544OR44OgICAgICAgICAgIFB5SW5pdFVfemNrNWIyYgo9PT09PT09PT09 PT09ICA9PT09PT09PT09PT09PT09PT09CgpGb3IgbW9kdWxlcyB3aXRoIG5vbi1BU0NJSSBuYW1l cywgc2luZ2xlLXBoYXNlIGluaXRpYWxpemF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuCgpJbiB0aGUg aW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIFBFUCwgYnVpbHQtaW4gbW9kdWxlcyB3aXRo IG5vbi1BU0NJSQpuYW1lcyB3aWxsIG5vdCBiZSBzdXBwb3J0ZWQuCgoKTW9kdWxlIFJlbG9hZGlu ZwotLS0tLS0tLS0tLS0tLS0tCgpSZWxvYWRpbmcgYW4gZXh0ZW5zaW9uIG1vZHVsZSB1c2luZyBp bXBvcnRsaWIucmVsb2FkKCkgd2lsbCBjb250aW51ZSB0bwpoYXZlIG5vIGVmZmVjdCwgZXhjZXB0 IHJlLXNldHRpbmcgaW1wb3J0LXJlbGF0ZWQgYXR0cmlidXRlcy4KCkR1ZSB0byBsaW1pdGF0aW9u cyBpbiBzaGFyZWQgbGlicmFyeSBsb2FkaW5nIChib3RoIGRsb3BlbiBvbiBQT1NJWCBhbmQKTG9h ZE1vZHVsZUV4IG9uIFdpbmRvd3MpLCBpdCBpcyBub3QgZ2VuZXJhbGx5IHBvc3NpYmxlIHRvIGxv YWQKYSBtb2RpZmllZCBsaWJyYXJ5IGFmdGVyIGl0IGhhcyBjaGFuZ2VkIG9uIGRpc2suCgpVc2Ug Y2FzZXMgZm9yIHJlbG9hZGluZyBvdGhlciB0aGFuIHRyeWluZyBvdXQgYSBuZXcgdmVyc2lvbiBv ZiB0aGUgbW9kdWxlCmFyZSB0b28gcmFyZSB0byByZXF1aXJlIGFsbCBtb2R1bGUgYXV0aG9ycyB0 byBrZWVwIHJlbG9hZGluZyBpbiBtaW5kLgpJZiByZWxvYWQtbGlrZSBmdW5jdGlvbmFsaXR5IGlz IG5lZWRlZCwgYXV0aG9ycyBjYW4gZXhwb3J0IGEgZGVkaWNhdGVkCmZ1bmN0aW9uIGZvciBpdC4K CgpNdWx0aXBsZSBtb2R1bGVzIGluIG9uZSBsaWJyYXJ5Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0KClRvIHN1cHBvcnQgbXVsdGlwbGUgUHl0aG9uIG1vZHVsZXMgaW4gb25lIHNoYXJl ZCBsaWJyYXJ5LCB0aGUgbGlicmFyeSBjYW4KZXhwb3J0IGFkZGl0aW9uYWwgUHlJbml0KiBzeW1i b2xzIGJlc2lkZXMgdGhlIG9uZSB0aGF0IGNvcnJlc3BvbmRzCnRvIHRoZSBsaWJyYXJ5J3MgZmls ZW5hbWUuCgpOb3RlIHRoYXQgdGhpcyBtZWNoYW5pc20gY2FuIGN1cnJlbnRseSBvbmx5IGJlIHVz ZWQgdG8gKmxvYWQqIGV4dHJhIG1vZHVsZXMsCmJ1dCBub3QgdG8gKmZpbmQqIHRoZW0uIChUaGlz IGlzIGEgbGltaXRhdGlvbiBvZiB0aGUgbG9hZGVyIG1lY2hhbmlzbSwKd2hpY2ggdGhpcyBQRVAg ZG9lcyBub3QgdHJ5IHRvIG1vZGlmeS4pClRvIHdvcmsgYXJvdW5kIHRoZSBsYWNrIG9mIGEgc3Vp dGFibGUgZmluZGVyLCBjb2RlIGxpa2UgdGhlIGZvbGxvd2luZwpjYW4gYmUgdXNlZDo6CgogICAg aW1wb3J0IGltcG9ydGxpYi5tYWNoaW5lcnkKICAgIGltcG9ydCBpbXBvcnRsaWIudXRpbAogICAg bG9hZGVyID0gaW1wb3J0bGliLm1hY2hpbmVyeS5FeHRlbnNpb25GaWxlTG9hZGVyKG5hbWUsIHBh dGgpCiAgICBzcGVjID0gaW1wb3J0bGliLnV0aWwuc3BlY19mcm9tX2xvYWRlcihuYW1lLCBsb2Fk ZXIpCiAgICBtb2R1bGUgPSBpbXBvcnRsaWIudXRpbC5tb2R1bGVfZnJvbV9zcGVjKHNwZWMpCiAg ICBsb2FkZXIuZXhlY19tb2R1bGUobW9kdWxlKQogICAgcmV0dXJuIG1vZHVsZQoKT24gcGxhdGZv cm1zIHRoYXQgc3VwcG9ydCBzeW1ib2xpYyBsaW5rcywgdGhlc2UgbWF5IGJlIHVzZWQgdG8gaW5z dGFsbCBvbmUKbGlicmFyeSB1bmRlciBtdWx0aXBsZSBuYW1lcywgZXhwb3NpbmcgYWxsIGV4cG9y dGVkIG1vZHVsZXMgdG8gbm9ybWFsCmltcG9ydCBtYWNoaW5lcnkuCgoKVGVzdGluZyBhbmQgaW5p dGlhbCBpbXBsZW1lbnRhdGlvbnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K CkZvciB0ZXN0aW5nLCBhIG5ldyBidWlsdC1pbiBtb2R1bGUgYGBfdGVzdG11bHRpcGhhc2VgYCB3 aWxsIGJlIGNyZWF0ZWQuClRoZSBsaWJyYXJ5IHdpbGwgZXhwb3J0IHNldmVyYWwgYWRkaXRpb25h bCBtb2R1bGVzIHVzaW5nIHRoZSBtZWNoYW5pc20KZGVzY3JpYmVkIGluICJNdWx0aXBsZSBtb2R1 bGVzIGluIG9uZSBsaWJyYXJ5Ii4KClRoZSBgYF90ZXN0Y2FwaWBgIG1vZHVsZSB3aWxsIGJlIHVu Y2hhbmdlZCwgYW5kIHdpbGwgdXNlIHNpbmdsZS1waGFzZQppbml0aWFsaXphdGlvbiBpbmRlZmlu aXRlbHkgKG9yIHVudGlsIGl0IGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQpLgoKVGhlIGBgYXJyYXlg YCBhbmQgYGB4eCpgYCBtb2R1bGVzIHdpbGwgYmUgY29udmVydGVkIHRvIHVzZSBtdWx0aS1waGFz ZQppbml0aWFsaXphdGlvbiBhcyBwYXJ0IG9mIHRoZSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgoK ClN1bW1hcnkgb2YgQVBJIENoYW5nZXMgYW5kIEFkZGl0aW9ucwotLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0KCk5ldyBmdW5jdGlvbnM6CgoqIFB5TW9kdWxlX0Zyb21EZWZBbmRT cGVjIChtYWNybykKKiBQeU1vZHVsZV9Gcm9tRGVmQW5kU3BlYzIKKiBQeU1vZHVsZV9FeGVjRGVm CiogUHlNb2R1bGVfU2V0RG9jU3RyaW5nCiogUHlNb2R1bGVfQWRkRnVuY3Rpb25zCiogUHlNb2R1 bGVEZWZfSW5pdAoKTmV3IG1hY3JvczoKCiogUHlfbW9kX2NyZWF0ZQoqIFB5X21vZF9leGVjCgpO ZXcgdHlwZXM6CgoqIFB5TW9kdWxlRGVmX1R5cGUgd2lsbCBiZSBleHBvc2VkCgpOZXcgc3RydWN0 dXJlczoKCiogUHlNb2R1bGVEZWZfU2xvdAoKUHlNb2R1bGVEZWYubV9yZWxvYWQgY2hhbmdlcyB0 byBQeU1vZHVsZURlZi5tX3Nsb3RzLgoKVGhlIGludGVybmFsIGBgX2ltcGBgIG1vZHVsZSB3aWxs IGhhdmUgYmFja3dhcmRzIGluY29tcGF0aWJsZSBjaGFuZ2VzOgpgYGNyZWF0ZV9idWlsdGluYGAs IGBgY3JlYXRlX2R5bmFtaWNgYCwgYW5kIGBgZXhlY19keW5hbWljYGAgd2lsbCBiZSBhZGRlZDsK YGBpbml0X2J1aWx0aW5gYCwgYGBsb2FkX2R5bmFtaWNgYCB3aWxsIGJlIHJlbW92ZWQuCgpUaGUg dW5kb2N1bWVudGVkIGZ1bmN0aW9ucyBgYGltcC5sb2FkX2R5bmFtaWNgYCBhbmQgYGBpbXAuaW5p dF9idWlsdGluYGAgd2lsbApiZSByZXBsYWNlZCBieSBiYWNrd2FyZHMtY29tcGF0aWJsZSBzaGlt cy4KCgpQb3NzaWJsZSBGdXR1cmUgRXh0ZW5zaW9ucwo9PT09PT09PT09PT09PT09PT09PT09PT09 PQoKVGhlIHNsb3RzIG1lY2hhbmlzbSwgaW5zcGlyZWQgYnkgUHlUeXBlX1Nsb3QgZnJvbSBQRVAg Mzg0LAphbGxvd3MgbGF0ZXIgZXh0ZW5zaW9ucy4KClNvbWUgZXh0ZW5zaW9uIG1vZHVsZXMgZXhw b3J0cyBtYW55IGNvbnN0YW50czsgZm9yIGV4YW1wbGUgX3NzbCBoYXMKYSBsb25nIGxpc3Qgb2Yg Y2FsbHMgaW4gdGhlIGZvcm06OgoKICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTU0xf RVJST1JfWkVST19SRVRVUk4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUFlfU1NMX0VS Uk9SX1pFUk9fUkVUVVJOKTsKCkNvbnZlcnRpbmcgdGhpcyB0byBhIGRlY2xhcmF0aXZlIGxpc3Qs IHNpbWlsYXIgdG8gUHlNZXRob2REZWYsCndvdWxkIHJlZHVjZSBib2lsZXJwbGF0ZSwgYW5kIHBy b3ZpZGUgZnJlZSBlcnJvci1jaGVja2luZyB3aGljaAppcyBvZnRlbiBtaXNzaW5nLgoKU3RyaW5n IGNvbnN0YW50cyBhbmQgdHlwZXMgY2FuIGJlIGhhbmRsZWQgc2ltaWxhcmx5LgooTm90ZSB0aGF0 IG5vbi1kZWZhdWx0IGJhc2VzIGZvciB0eXBlcyBjYW5ub3QgYmUgcG9ydGFibHkgc3BlY2lmaWVk CnN0YXRpY2FsbHk7IHRoaXMgY2FzZSB3b3VsZCBuZWVkIGEgUHlfbW9kX2V4ZWMgZnVuY3Rpb24g dGhhdCBydW5zCmJlZm9yZSB0aGUgc2xvdHMgYXJlIGFkZGVkLiBUaGUgZnJlZSBlcnJvci1jaGVj a2luZyB3b3VsZCBzdGlsbCBiZQpiZW5lZmljaWFsLCB0aG91Z2guKQoKQW5vdGhlciBwb3NzaWJp bGl0eSBpcyBwcm92aWRpbmcgYSAibWFpbiIgZnVuY3Rpb24gdGhhdCB3b3VsZCBiZSBydW4Kd2hl biB0aGUgbW9kdWxlIGlzIGdpdmVuIHRvIFB5dGhvbidzIC1tIHN3aXRjaC4KRm9yIHRoaXMgdG8g d29yaywgdGhlIHJ1bnB5IG1vZHVsZSB3aWxsIG5lZWQgdG8gYmUgbW9kaWZpZWQgdG8gdGFrZQph ZHZhbnRhZ2Ugb2YgTW9kdWxlU3BlYy1iYXNlZCBsb2FkaW5nIGludHJvZHVjZWQgaW4gUEVQIDQ1 MS4KQWxzbywgaXQgd2lsbCBiZSBuZWNlc3NhcnkgdG8gYWRkIGEgbWVjaGFuaXNtIGZvciBzZXR0 aW5nIHVwIGEgbW9kdWxlCmFjY29yZGluZyB0byBzbG90cyBpdCB3YXNuJ3Qgb3JpZ2luYWxseSBk ZWZpbmVkIHdpdGguCgoKSW1wbGVtZW50YXRpb24KPT09PT09PT09PT09PT0KCldvcmstaW4tcHJv Z3Jlc3MgaW1wbGVtZW50YXRpb24gaXMgYXZhaWxhYmxlIGluIGEgR2l0aHViIHJlcG9zaXRvcnkg WyNnaC1yZXBvXV87CmEgcGF0Y2hzZXQgaXMgYXQgWyNnaC1wYXRjaF1fLgoKClByZXZpb3VzIEFw cHJvYWNoZXMKPT09PT09PT09PT09PT09PT09PQoKU3RlZmFuIEJlaG5lbCdzIGluaXRpYWwgcHJv dG8tUEVQIFsjc3RlZmFuc19wcm90b3BlcF1fCmhhZCBhICJQeUluaXRfbW9kdWxlbmFtZSIgaG9v ayB0aGF0IHdvdWxkIGNyZWF0ZSBhIG1vZHVsZSBjbGFzcywKd2hvc2UgYGBfX2luaXRfX2BgIHdv dWxkIGJlIHRoZW4gY2FsbGVkIHRvIGNyZWF0ZSB0aGUgbW9kdWxlLgpUaGlzIHByb3Bvc2FsIGRp ZCBub3QgY29ycmVzcG9uZCB0byB0aGUgKHRoZW4gbm9uZXhpc3RlbnQpIFBFUCA0NTEsCndoZXJl IG1vZHVsZSBjcmVhdGlvbiBhbmQgaW5pdGlhbGl6YXRpb24gaXMgYnJva2VuIGludG8gZGlzdGlu Y3Qgc3RlcHMuCkl0IGFsc28gZGlkIG5vdCBzdXBwb3J0IGxvYWRpbmcgYW4gZXh0ZW5zaW9uIGlu dG8gcHJlLWV4aXN0aW5nIG1vZHVsZSBvYmplY3RzLgoKTmljayBDb2dobGFuIHByb3Bvc2VkICJD cmVhdGUiIGFuZCAiRXhlYyIgaG9va3MsIGFuZCB3cm90ZSBhIHByb3RvdHlwZQppbXBsZW1lbnRh dGlvbiBbI25pY2tzLXByb3RvdHlwZV1fLgpBdCB0aGlzIHRpbWUgUEVQIDQ1MSB3YXMgc3RpbGwg bm90IGltcGxlbWVudGVkLCBzbyB0aGUgcHJvdG90eXBlCmRvZXMgbm90IHVzZSBNb2R1bGVTcGVj LgoKVGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhpcyBQRVAgdXNlZCBDcmVhdGUgYW5kIEV4ZWMg aG9va3MsIGFuZCBhbGxvd2VkCmxvYWRpbmcgaW50byBhcmJpdHJhcnkgcHJlLWNvbnN0cnVjdGVk IG9iamVjdHMgd2l0aCBFeGVjIGhvb2suClRoZSBwcm9wb3NhbCBtYWRlIGV4dGVuc2lvbiBtb2R1 bGUgaW5pdGlhbGl6YXRpb24gY2xvc2VyIHRvIGhvdyBQeXRob24gbW9kdWxlcwphcmUgaW5pdGlh bGl6ZWQsIGJ1dCBpdCB3YXMgbGF0ZXIgcmVjb2duaXplZCB0aGF0IHRoaXMgaXNuJ3QgYW4gaW1w b3J0YW50IGdvYWwuClRoZSBjdXJyZW50IFBFUCBkZXNjcmliZXMgYSBzaW1wbGVyIHNvbHV0aW9u LgoKQSBmdXJ0aGVyIGl0ZXJhdGlvbiB1c2VkIGEgIlB5TW9kdWxlRXhwb3J0IiBob29rIGFzIGFu IGFsdGVybmF0aXZlIHRvIFB5SW5pdCwKd2hlcmUgUHlJbml0IHdhcyB1c2VkIGZvciBleGlzdGlu ZyBzY2hlbWUsIGFuZCBQeU1vZHVsZUV4cG9ydCBmb3IgbXVsdGktcGhhc2UuCkhvd2V2ZXIsIG5v dCBiZWluZyBhYmxlIHRvIGRldGVybWluZSB0aGUgaG9vayBuYW1lIGJhc2VkIG9uIG1vZHVsZSBu YW1lCmNvbXBsaWNhdGVkIGF1dG9tYXRpYyBnZW5lcmF0aW9uIG9mIFB5SW1wb3J0X0luaXR0YWIg YnkgdG9vbHMgbGlrZSBmcmVlemUuCktlZXBpbmcgb25seSB0aGUgUHlJbml0IGhvb2sgbmFtZSwg ZXZlbiBpZiBpdCdzIG5vdCBlbnRpcmVseSBhcHByb3ByaWF0ZSBmb3IKZXhwb3J0aW5nIGEgZGVm aW5pdGlvbiwgeWllbGRlZCBhIG11Y2ggc2ltcGxlciBzb2x1dGlvbi4KCgpSZWZlcmVuY2VzCj09 PT09PT09PT0KCi4uIFsjcGVwLTA0NTEtYXR0cmlidXRlc10KICAgaHR0cHM6Ly93d3cucHl0aG9u Lm9yZy9kZXYvcGVwcy9wZXAtMDQ1MS8jYXR0cmlidXRlcwoKLi4gWyNzdGVmYW5zX3Byb3RvcGVw XQogICBodHRwczovL21haWwucHl0aG9uLm9yZy9waXBlcm1haWwvcHl0aG9uLWRldi8yMDEzLUF1 Z3VzdC8xMjgwODcuaHRtbAoKLi4gWyNuaWNrcy1wcm90b3R5cGVdCiAgIGh0dHBzOi8vbWFpbC5w eXRob24ub3JnL3BpcGVybWFpbC9weXRob24tZGV2LzIwMTMtQXVndXN0LzEyODEwMS5odG1sCgou LiBbI3JmYy0zNDkyXQogICBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzNDkyCgouLiBb I2doLXJlcG9dCiAgIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmN1a291L2NweXRob24vY29tbWl0cy9w ZXA0ODkKCi4uIFsjZ2gtcGF0Y2hdCiAgIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmN1a291L2NweXRo b24vY29tcGFyZS9tYXN0ZXIuLi5lbmN1a291OnBlcDQ4OS5wYXRjaAoKLi4gWyNmaW5kbW9kdWxl LWRpc2N1c3Npb25dCiAgIGh0dHBzOi8vbWFpbC5weXRob24ub3JnL3BpcGVybWFpbC9pbXBvcnQt c2lnLzIwMTUtQXByaWwvMDAwOTU5Lmh0bWwKCi4uIFsjcGVwLTA0NTEtbG9hZGluZ10KICAgaHR0 cHM6Ly93d3cucHl0aG9uLm9yZy9kZXYvcGVwcy9wZXAtMDQ1MS8jaG93LWxvYWRpbmctd2lsbC13 b3JrXQoKLi4gWyNzdWJpbnRlcnByZXRlci1kb2NzXQogICBodHRwczovL2RvY3MucHl0aG9uLm9y Zy8zL2MtYXBpL2luaXQuaHRtbCNzdWItaW50ZXJwcmV0ZXItc3VwcG9ydAoKCkNvcHlyaWdodAo9 PT09PT09PT0KClRoaXMgZG9jdW1lbnQgaGFzIGJlZW4gcGxhY2VkIGluIHRoZSBwdWJsaWMgZG9t YWluLgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpJbXBv cnQtU0lHIG1haWxpbmcgbGlzdApJbXBvcnQtU0lHQHB5dGhvbi5vcmcKaHR0cHM6Ly9tYWlsLnB5 dGhvbi5vcmcvbWFpbG1hbi9saXN0aW5mby9pbXBvcnQtc2lnCg==