REDROOM
PHP 8.0.30
Path:
Logout
Edit File
Size: 60.57 KB
Close
/opt/alt/python37/lib64/python3.7/site-packages/numpy/polynomial/__pycache__/chebyshev.cpython-37.pyc
Text
Base64
Qg0NCgAAAADB2EZkTvUAAOMAAAAAAAAAAAAAAAAhAAAAQAAAAHMIAgAAZABaAGQBZAJsAW0CWgJtA1oDbQRaBAEAZAFkA2wFWgVkAWQDbAZaB2QBZANsCG0JWgoBAGQBZARsC20MWgwBAGQFZAZsDW0OWg8BAGQFZAdsEG0RWhEBAGQIZAlkCmQLZAxkDWQOZA9kEGQRZBJkE2QUZBVkFmQXZBhkGWQaZBtkHGQdZB5kH2QgZCFkImQjZCRkJWQmZCdkKGchWhJlD2oTWhRkKWQqhABaFWQrZCyEAFoWZC1kLoQAWhdkL2QwhABaGGQxZDKEAFoZZDNkNIQAWhpkNWQXhABaG2Q2ZBaEAFocZQegHWQ3ZAVnAqEBWh5lB6AdZAFnAaEBWh9lB6AdZAVnAaEBWiBlB6AdZAFkBWcCoQFaIWQ4ZAyEAFoiZDlkGIQAWiNkOmQNhABaJGQ7ZA6EAFolZDxkD4QAWiZkPWQQhABaJ2Q+ZBGEAFooZFVkQGQShAFaKWRWZEFkFIQBWipkBWcAZAFkBWQBZgVkQmQVhAFaK2RXZERkE4QBWixkRWQghABaLWRGZCKEAFouZEdkIYQAWi9kSGQjhABaMGRJZBmEAFoxZEpkJIQAWjJkS2QlhABaM2RYZE1kGoQBWjRkTmQmhABaNWRPZByEAFo2ZFBkJ4QAWjdkUWQohABaOGRSZB2EAFo5ZFNkHoQAWjpHAGRUZB+EAGQfZRGDA1o7ZANTAClZYZMMAAAKT2JqZWN0cyBmb3IgZGVhbGluZyB3aXRoIENoZWJ5c2hldiBzZXJpZXMuCgpUaGlzIG1vZHVsZSBwcm92aWRlcyBhIG51bWJlciBvZiBvYmplY3RzIChtb3N0bHkgZnVuY3Rpb25zKSB1c2VmdWwgZm9yCmRlYWxpbmcgd2l0aCBDaGVieXNoZXYgc2VyaWVzLCBpbmNsdWRpbmcgYSBgQ2hlYnlzaGV2YCBjbGFzcyB0aGF0CmVuY2Fwc3VsYXRlcyB0aGUgdXN1YWwgYXJpdGhtZXRpYyBvcGVyYXRpb25zLiAgKEdlbmVyYWwgaW5mb3JtYXRpb24Kb24gaG93IHRoaXMgbW9kdWxlIHJlcHJlc2VudHMgYW5kIHdvcmtzIHdpdGggc3VjaCBwb2x5bm9taWFscyBpcyBpbiB0aGUKZG9jc3RyaW5nIGZvciBpdHMgInBhcmVudCIgc3ViLXBhY2thZ2UsIGBudW1weS5wb2x5bm9taWFsYCkuCgpDb25zdGFudHMKLS0tLS0tLS0tCi0gYGNoZWJkb21haW5gIC0tIENoZWJ5c2hldiBzZXJpZXMgZGVmYXVsdCBkb21haW4sIFstMSwxXS4KLSBgY2hlYnplcm9gIC0tIChDb2VmZmljaWVudHMgb2YgdGhlKSBDaGVieXNoZXYgc2VyaWVzIHRoYXQgZXZhbHVhdGVzCiAgaWRlbnRpY2FsbHkgdG8gMC4KLSBgY2hlYm9uZWAgLS0gKENvZWZmaWNpZW50cyBvZiB0aGUpIENoZWJ5c2hldiBzZXJpZXMgdGhhdCBldmFsdWF0ZXMKICBpZGVudGljYWxseSB0byAxLgotIGBjaGVieGAgLS0gKENvZWZmaWNpZW50cyBvZiB0aGUpIENoZWJ5c2hldiBzZXJpZXMgZm9yIHRoZSBpZGVudGl0eSBtYXAsCiAgYGBmKHgpID0geGBgLgoKQXJpdGhtZXRpYwotLS0tLS0tLS0tCi0gYGNoZWJhZGRgIC0tIGFkZCB0d28gQ2hlYnlzaGV2IHNlcmllcy4KLSBgY2hlYnN1YmAgLS0gc3VidHJhY3Qgb25lIENoZWJ5c2hldiBzZXJpZXMgZnJvbSBhbm90aGVyLgotIGBjaGVibXVsYCAtLSBtdWx0aXBseSB0d28gQ2hlYnlzaGV2IHNlcmllcy4KLSBgY2hlYmRpdmAgLS0gZGl2aWRlIG9uZSBDaGVieXNoZXYgc2VyaWVzIGJ5IGFub3RoZXIuCi0gYGNoZWJwb3dgIC0tIHJhaXNlIGEgQ2hlYnlzaGV2IHNlcmllcyB0byBhbiBwb3NpdGl2ZSBpbnRlZ2VyIHBvd2VyCi0gYGNoZWJ2YWxgIC0tIGV2YWx1YXRlIGEgQ2hlYnlzaGV2IHNlcmllcyBhdCBnaXZlbiBwb2ludHMuCi0gYGNoZWJ2YWwyZGAgLS0gZXZhbHVhdGUgYSAyRCBDaGVieXNoZXYgc2VyaWVzIGF0IGdpdmVuIHBvaW50cy4KLSBgY2hlYnZhbDNkYCAtLSBldmFsdWF0ZSBhIDNEIENoZWJ5c2hldiBzZXJpZXMgYXQgZ2l2ZW4gcG9pbnRzLgotIGBjaGViZ3JpZDJkYCAtLSBldmFsdWF0ZSBhIDJEIENoZWJ5c2hldiBzZXJpZXMgb24gYSBDYXJ0ZXNpYW4gcHJvZHVjdC4KLSBgY2hlYmdyaWQzZGAgLS0gZXZhbHVhdGUgYSAzRCBDaGVieXNoZXYgc2VyaWVzIG9uIGEgQ2FydGVzaWFuIHByb2R1Y3QuCgpDYWxjdWx1cwotLS0tLS0tLQotIGBjaGViZGVyYCAtLSBkaWZmZXJlbnRpYXRlIGEgQ2hlYnlzaGV2IHNlcmllcy4KLSBgY2hlYmludGAgLS0gaW50ZWdyYXRlIGEgQ2hlYnlzaGV2IHNlcmllcy4KCk1pc2MgRnVuY3Rpb25zCi0tLS0tLS0tLS0tLS0tCi0gYGNoZWJmcm9tcm9vdHNgIC0tIGNyZWF0ZSBhIENoZWJ5c2hldiBzZXJpZXMgd2l0aCBzcGVjaWZpZWQgcm9vdHMuCi0gYGNoZWJyb290c2AgLS0gZmluZCB0aGUgcm9vdHMgb2YgYSBDaGVieXNoZXYgc2VyaWVzLgotIGBjaGVidmFuZGVyYCAtLSBWYW5kZXJtb25kZS1saWtlIG1hdHJpeCBmb3IgQ2hlYnlzaGV2IHBvbHlub21pYWxzLgotIGBjaGVidmFuZGVyMmRgIC0tIFZhbmRlcm1vbmRlLWxpa2UgbWF0cml4IGZvciAyRCBwb3dlciBzZXJpZXMuCi0gYGNoZWJ2YW5kZXIzZGAgLS0gVmFuZGVybW9uZGUtbGlrZSBtYXRyaXggZm9yIDNEIHBvd2VyIHNlcmllcy4KLSBgY2hlYmdhdXNzYCAtLSBHYXVzcy1DaGVieXNoZXYgcXVhZHJhdHVyZSwgcG9pbnRzIGFuZCB3ZWlnaHRzLgotIGBjaGVid2VpZ2h0YCAtLSBDaGVieXNoZXYgd2VpZ2h0IGZ1bmN0aW9uLgotIGBjaGViY29tcGFuaW9uYCAtLSBzeW1tZXRyaXplZCBjb21wYW5pb24gbWF0cml4IGluIENoZWJ5c2hldiBmb3JtLgotIGBjaGViZml0YCAtLSBsZWFzdC1zcXVhcmVzIGZpdCByZXR1cm5pbmcgYSBDaGVieXNoZXYgc2VyaWVzLgotIGBjaGVicHRzMWAgLS0gQ2hlYnlzaGV2IHBvaW50cyBvZiB0aGUgZmlyc3Qga2luZC4KLSBgY2hlYnB0czJgIC0tIENoZWJ5c2hldiBwb2ludHMgb2YgdGhlIHNlY29uZCBraW5kLgotIGBjaGVidHJpbWAgLS0gdHJpbSBsZWFkaW5nIGNvZWZmaWNpZW50cyBmcm9tIGEgQ2hlYnlzaGV2IHNlcmllcy4KLSBgY2hlYmxpbmVgIC0tIENoZWJ5c2hldiBzZXJpZXMgcmVwcmVzZW50aW5nIGdpdmVuIHN0cmFpZ2h0IGxpbmUuCi0gYGNoZWIycG9seWAgLS0gY29udmVydCBhIENoZWJ5c2hldiBzZXJpZXMgdG8gYSBwb2x5bm9taWFsLgotIGBwb2x5MmNoZWJgIC0tIGNvbnZlcnQgYSBwb2x5bm9taWFsIHRvIGEgQ2hlYnlzaGV2IHNlcmllcy4KCkNsYXNzZXMKLS0tLS0tLQotIGBDaGVieXNoZXZgIC0tIEEgQ2hlYnlzaGV2IHNlcmllcyBjbGFzcy4KClNlZSBhbHNvCi0tLS0tLS0tCmBudW1weS5wb2x5bm9taWFsYAoKTm90ZXMKLS0tLS0KVGhlIGltcGxlbWVudGF0aW9ucyBvZiBtdWx0aXBsaWNhdGlvbiwgZGl2aXNpb24sIGludGVncmF0aW9uLCBhbmQKZGlmZmVyZW50aWF0aW9uIHVzZSB0aGUgYWxnZWJyYWljIGlkZW50aXRpZXMgWzFdXzoKCi4uIG1hdGggOjoKICAgIFRfbih4KSA9IFxmcmFje3pebiArIHpeey1ufX17Mn0gXFwKICAgIHpcZnJhY3tkeH17ZHp9ID0gXGZyYWN7eiAtIHpeey0xfX17Mn0uCgp3aGVyZQoKLi4gbWF0aCA6OiB4ID0gXGZyYWN7eiArIHpeey0xfX17Mn0uCgpUaGVzZSBpZGVudGl0aWVzIGFsbG93IGEgQ2hlYnlzaGV2IHNlcmllcyB0byBiZSBleHByZXNzZWQgYXMgYSBmaW5pdGUsCnN5bW1ldHJpYyBMYXVyZW50IHNlcmllcy4gIEluIHRoaXMgbW9kdWxlLCB0aGlzIHNvcnQgb2YgTGF1cmVudCBzZXJpZXMKaXMgcmVmZXJyZWQgdG8gYXMgYSAiei1zZXJpZXMuIgoKUmVmZXJlbmNlcwotLS0tLS0tLS0tCi4uIFsxXSBBLiBULiBCZW5qYW1pbiwgZXQgYWwuLCAiQ29tYmluYXRvcmlhbCBUcmlnb25vbWV0cnkgd2l0aCBDaGVieXNoZXYKICBQb2x5bm9taWFscywiICpKb3VybmFsIG9mIFN0YXRpc3RpY2FsIFBsYW5uaW5nIGFuZCBJbmZlcmVuY2UgMTQqLCAyMDA4CiAgKHByZXByaW50OiBodHRwOi8vd3d3Lm1hdGguaG1jLmVkdS9+YmVuamFtaW4vcGFwZXJzL0NvbWJUcmlnLnBkZiwgcGcuIDQpCgrpAAAAACkD2ghkaXZpc2lvbtoPYWJzb2x1dGVfaW1wb3J02g5wcmludF9mdW5jdGlvbk4pAdoUbm9ybWFsaXplX2F4aXNfaW5kZXjpAQAAACkB2glwb2x5dXRpbHMpAdoLQUJDUG9seUJhc2XaCGNoZWJ6ZXJv2gdjaGVib25l2gVjaGVieNoKY2hlYmRvbWFpbtoIY2hlYmxpbmXaB2NoZWJhZGTaB2NoZWJzdWLaCGNoZWJtdWx42gdjaGVibXVs2gdjaGViZGl22gdjaGVicG932gdjaGVidmFs2gdjaGViZGVy2gdjaGViaW502gljaGViMnBvbHnaCXBvbHkyY2hlYtoNY2hlYmZyb21yb290c9oKY2hlYnZhbmRlctoHY2hlYmZpdNoIY2hlYnRyaW3aCWNoZWJyb290c9oIY2hlYnB0czHaCGNoZWJwdHMy2glDaGVieXNoZXbaCWNoZWJ2YWwyZNoJY2hlYnZhbDNk2gpjaGViZ3JpZDJk2gpjaGViZ3JpZDNk2gxjaGVidmFuZGVyMmTaDGNoZWJ2YW5kZXIzZNoNY2hlYmNvbXBhbmlvbtoJY2hlYmdhdXNz2gpjaGVid2VpZ2h0YwEAAAAAAAAAAwAAAAUAAABDAAAAc0QAAAB8AGoAfQF0AWoCZAF8ARQAZAIYAHwAagNkA40CfQJ8AGQBGwB8AnwBZAIYAGQEhQI8AHwCfAJkBGQEZAWFAxkAFwBTACkGYfMBAABDb3ZlcnQgQ2hlYnlzaGV2IHNlcmllcyB0byB6LXNlcmllcy4KCiAgICBDb3ZlcnQgYSBDaGVieXNoZXYgc2VyaWVzIHRvIHRoZSBlcXVpdmFsZW50IHotc2VyaWVzLiBUaGUgcmVzdWx0IGlzCiAgICBuZXZlciBhbiBlbXB0eSBhcnJheS4gVGhlIGR0eXBlIG9mIHRo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IChyZWxhdGl2ZQogICAgdG8gdGhlICJzdGFuZGFyZCIgYmFzaXMpIG9yZGVyZWQgZnJvbSBsb3dlc3QgZGVncmVlIHRvIGhpZ2hlc3QsIHRvIGFuCiAgICBhcnJheSBvZiB0aGUgY29lZmZpY2llbnRzIG9mIHRoZSBlcXVpdmFsZW50IENoZWJ5c2hldiBzZXJpZXMsIG9yZGVyZWQKICAgIGZyb20gbG93ZXN0IHRvIGhpZ2hlc3QgZGVncmVlLgoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIHBvbCA6IGFycmF5X2xpa2UKICAgICAgICAxLUQgYXJyYXkgY29udGFpbmluZyB0aGUgcG9seW5vbWlhbCBjb2VmZmljaWVudHMKCiAgICBSZXR1cm5zCiAgICAtLS0tLS0tCiAgICBjIDogbmRhcnJheQogICAgICAgIDEtRCBhcnJheSBjb250YWluaW5nIHRoZSBjb2VmZmljaWVudHMgb2YgdGhlIGVxdWl2YWxlbnQgQ2hlYnlzaGV2CiAgICAgICAgc2VyaWVzLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgY2hlYjJwb2x5CgogICAgTm90ZXMKICAgIC0tLS0tCiAgICBUaGUgZWFzeSB3YXkgdG8gZG8gY29udmVyc2lvbnMgYmV0d2VlbiBwb2x5bm9taWFsIGJhc2lzIHNldHMKICAgIGlzIHRvIHVzZSB0aGUgY29udmVydCBtZXRob2Qgb2YgYSBjbGFzcyBpbnN0YW5jZS4KCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiBmcm9tIG51bXB5IGltcG9ydCBwb2x5bm9taWFsIGFzIFAKICAgID4+PiBwID0gUC5Qb2x5bm9taWFsKHJhbmdlKDQpKQogICAgPj4+IHAKICAgIFBvbHlub21pYWwoWyAwLiwgIDEuLCAgMi4sICAzLl0sIFstMS4sICAxLl0pCiAgICA+Pj4gYyA9IHAuY29udmVydChraW5kPVAuQ2hlYnlzaGV2KQogICAgPj4+IGMKICAgIENoZWJ5c2hldihbIDEuICAsICAzLjI1LCAgMS4gICwgIDAuNzVdLCBbLTEuLCAgMS5dKQogICAgPj4+IFAucG9seTJj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biByZXR1cm5zIHRoZSBjb2VmZmljaWVudHMgb2YgdGhlIHBvbHlub21pYWwKCiAgICAuLiBtYXRoOjogcCh4KSA9ICh4IC0gcl8wKSAqICh4IC0gcl8xKSAqIC4uLiAqICh4IC0gcl9uKSwKCiAgICBpbiBDaGVieXNoZXYgZm9ybSwgd2hlcmUgdGhlIGByX25gIGFyZSB0aGUgcm9vdHMgc3BlY2lmaWVkIGluIGByb290c2AuCiAgICBJZiBhIHplcm8gaGFzIG11bHRpcGxpY2l0eSBuLCB0aGVuIGl0IG11c3QgYXBwZWFyIGluIGByb290c2AgbiB0aW1lcy4KICAgIEZvciBpbnN0YW5jZSwgaWYgMiBpcyBhIHJvb3Qgb2YgbXVsdGlwbGljaXR5IHRocmVlIGFuZCAzIGlzIGEgcm9vdCBvZgogICAgbXVsdGlwbGljaXR5IDIsIHRoZW4gYHJvb3RzYCBsb29rcyBzb21ldGhpbmcgbGlrZSBbMiwgMiwgMiwgMywgM10uIFRoZQogICAgcm9vdHMgY2FuIGFwcGVhciBpbiBhbnkgb3JkZXIuCgogICAgSWYgdGhlIHJldHVybmVkIGNvZWZmaWNpZW50cyBhcmUgYGNgLCB0aGVuCgogICAgLi4gbWF0aDo6IHAoeCkgPSBjXzAgKyBjXzEgKiBUXzEoeCkgKyAuLi4gKyAgY19uICogVF9uKHgpCgogICAgVGhlIGNvZWZmaWNpZW50IG9mIHRoZSBsYXN0IHRlcm0gaXMgbm90IGdlbmVyYWxseSAxIGZvciBtb25pYwogICAgcG9seW5vbWlhbHMgaW4gQ2hlYnlzaGV2IGZvcm0uCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgcm9vdHMgOiBhcnJheV9saWtlCiAgICAgICAgU2VxdWVuY2UgY29udGFpbmluZyB0aGUgcm9vdHMuCgogICAgUmV0dXJucwogICAgLS0tLS0tLQogICAgb3V0IDogbmRhcnJheQogICAgICAgIDEtRCBhcnJheSBvZiBjb2VmZmljaWVudHMuICBJZiBhbGwgcm9vdHMgYXJlIHJlYWwgdGhlbiBgb3V0YCBpcyBhCiAgICAgICAgcmVhbCBhcnJheSwgaWYgc29tZSBvZiB0aGUg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ZXYgc2VyaWVzIGBjMWAgKiBgYzJgLiAgVGhlIGFyZ3VtZW50cwogICAgYXJlIHNlcXVlbmNlcyBvZiBjb2VmZmljaWVudHMsIGZyb20gbG93ZXN0IG9yZGVyICJ0ZXJtIiB0byBoaWdoZXN0LAogICAgZS5nLiwgWzEsMiwzXSByZXByZXNlbnRzIHRoZSBzZXJpZXMgYGBUXzAgKyAyKlRfMSArIDMqVF8yYGAuCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgYzEsIGMyIDogYXJyYXlfbGlrZQogICAgICAgIDEtRCBhcnJheXMgb2YgQ2hlYnlzaGV2IHNlcmllcyBjb2VmZmljaWVudHMgb3JkZXJlZCBmcm9tIGxvdyB0bwogICAgICAgIGhpZ2guCgogICAgUmV0dXJucwogICAgLS0tLS0tLQogICAgb3V0IDogbmRhcnJheQogICAgICAgIE9mIENoZWJ5c2hldiBzZXJpZXMgY29lZmZpY2llbnRzIHJlcHJlc2VudGluZyB0aGVpciBwcm9kdWN0LgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgY2hlYmFkZCwgY2hlYnN1YiwgY2hlYmRpdiwgY2hlYnBvdwoKICAgIE5vdGVzCiAgICAtLS0tLQogICAgSW4gZ2VuZXJhbCwgdGhlIChwb2x5bm9taWFsKSBwcm9kdWN0IG9mIHR3byBDLXNlcmllcyByZXN1bHRzIGluIHRlcm1zCiAgICB0aGF0IGFyZSBub3QgaW4gdGhlIENoZWJ5c2hldiBwb2x5bm9taWFsIGJhc2lzIHNldC4gIFRodXMsIHRvIGV4cHJlc3MKICAgIHRoZSBwcm9kdWN0IGFzIGEgQy1zZXJpZXMsIGl0IGlzIHR5cGljYWxseSBuZWNlc3NhcnkgdG8gInJlcHJvamVjdCIKICAgIHRoZSBwcm9kdWN0IG9udG8gc2FpZCBiYXNpcyBzZXQsIHdoaWNoIHR5cGljYWxseSBwcm9kdWNlcwogICAgInVuaW50dWl0aXZlIGxpdmUiIChidXQgY29ycmVjdCkgcmVzdWx0czsgc2VlIEV4YW1wbGVzIHNlY3Rpb24gYmVsb3cuCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICA+Pj4gZnJvbSBudW1weS5wb2x5bm9taWFsIGltcG9ydCBjaGVieXNoZXYgYXMgQwogICAgPj4+IGMxID0gKDEsMiwzKQogICAgPj4+IGMyID0gKDMsMiwxKQogICAgPj4+IEMuY2hlYm11bChjMSxjMikgIyBtdWx0aXBsaWNhdGlvbiByZXF1aXJlcyAicmVwcm9qZWN0aW9uIgogICAgYXJyYXkoWyAgNi41LCAgMTIuICwgIDEyLiAsICAgNC4gLCAgIDEuNV0pCgogICAgKQZyTAAAAHJNAAAAcjUAAAByOwAAAHI3AAAAcmIAAAApBnJYAAAAcmMAAAByOQAAAHI6AAAAcmUAAAByZAAAAHIzAAAAcjMAAAByNAAAAHIRAAAAvgIAAHMMAAAAACkSAQgBCAEKAQgBYwIAAAAAAAAACAAAAAQAAABDAAAAc7oAAAB0AKABfAB8AWcCoQFcAn0AfQF8AWQBGQBkAmsCciR0AoMAggF0A3wAgwF9AnQDfAGDAX0DfAJ8A2sAclB8AGQDZASFAhkAZAIUAHwAZgJTAHwDZARrAnJ0fAB8AWQBGQAbAHwAZANkBIUCGQBkAhQAZgJTAHQEfACDAX0EdAR8AYMBfQV0BXwEfAWDAlwCfQZ9B3QAoAZ0B3wGgwGhAX0GdACgBnQHfAeDAaEBfQd8BnwHZgJTAGQDUwApBWFhBQAACiAgICBEaXZpZGUgb25lIENoZWJ5c2hldiBzZXJpZXMgYnkgYW5vdGhlci4KCiAgICBSZXR1cm5zIHRoZSBxdW90aWVudC13aXRoLXJlbWFpbmRlciBvZiB0d28gQ2hlYnlzaGV2IHNlcmllcwogICAgYGMxYCAvIGBjMmAuICBUaGUgYXJndW1lbnRzIGFyZSBzZXF1ZW5jZXMgb2YgY29lZmZpY2llbnRzIGZyb20gbG93ZXN0CiAgICBvcmRlciAidGVybSIgdG8gaGlnaGVzdCwgZS5nLiwgWzEsMiwzXSByZXByZXNlbnRzIHRoZSBzZXJpZXMKICAgIGBgVF8wICsgMipUXzEgKyAzKlRfMmBgLgoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIGMxLCBjMiA6IGFycmF5X2xpa2UKICAgICAgICAxLUQgYXJyYXlzIG9mIENoZWJ5c2hldiBzZXJpZXMgY29lZmZpY2llbnRzIG9yZGVyZWQgZnJvbSBsb3cgdG8KICAgICAgICBoaWdoLgoKICAgIFJldHVybnMKICAgIC0tLS0tLS0KICAgIFtxdW8sIHJlbV0gOiBuZGFycmF5cwogICAgICAgIE9mIENoZWJ5c2hldiBzZXJpZXMgY29lZmZpY2llbnRzIHJlcHJlc2VudGluZyB0aGUgcXVvdGllbnQgYW5kCiAgICAgICAgcmVtYWluZGVyLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgY2hlYmFkZCwgY2hlYnN1YiwgY2hlYm11bCwgY2hlYnBvdwoKICAgIE5vdGVzCiAgICAtLS0tLQogICAgSW4gZ2VuZXJhbCwgdGhlIChwb2x5bm9taWFsKSBkaXZpc2lvbiBvZiBvbmUgQy1zZXJpZXMgYnkgYW5vdGhlcgogICAgcmVzdWx0cyBpbiBxdW90aWVudCBhbmQgcmVtYWluZGVyIHRlcm1zIHRoYXQgYXJlIG5vdCBpbiB0aGUgQ2hlYnlzaGV2CiAgICBwb2x5bm9taWFsIGJhc2lzIHNldC4gIFRodXMsIHRvIGV4cHJlc3MgdGhlc2UgcmVzdWx0cyBhcyBDLXNlcmllcywgaXQKICAgIGlzIHR5cGljYWxseSBuZWNlc3NhcnkgdG8gInJlcHJvamVjdCIgdGhlIHJlc3VsdHMgb250byBzYWlkIGJhc2lzCiAgICBzZXQsIHdoaWNoIHR5cGljYWxseSBwcm9kdWNlcyAidW5pbnR1aXRpdmUiIChidXQgY29ycmVjdCkgcmVzdWx0czsKICAgIHNlZSBFeGFtcGxlcyBzZWN0aW9uIGJlbG93LgoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgPj4+IGZyb20gbnVtcHkucG9seW5vbWlhbCBpbXBvcnQgY2hlYnlzaGV2IGFzIEMKICAgID4+PiBjMSA9ICgxLDIsMykKICAgID4+PiBjMiA9ICgzLDIsMSkKICAgID4+PiBDLmNoZWJkaXYoYzEsYzIpICMgcXVvdGllbnQgImludHVpdGl2ZSwiIHJlbWFpbmRlciBub3QKICAgIChhcnJheShbIDMuXSksIGFycmF5KFstOC4sIC00Ll0pKQogICAgPj4+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ICAgICAgIGRlZ3JlZSBpbiBlYWNoIGF4aXMgZ2l2ZW4gYnkgdGhlIGNvcnJlc3BvbmRpbmcgaW5kZXguCiAgICBtIDogaW50LCBvcHRpb25hbAogICAgICAgIE51bWJlciBvZiBkZXJpdmF0aXZlcyB0YWtlbiwgbXVzdCBiZSBub24tbmVnYXRpdmUuIChEZWZhdWx0OiAxKQogICAgc2NsIDogc2NhbGFyLCBvcHRpb25hbAogICAgICAgIEVhY2ggZGlmZmVyZW50aWF0aW9uIGlzIG11bHRpcGxpZWQgYnkgYHNjbGAuICBUaGUgZW5kIHJlc3VsdCBpcwogICAgICAgIG11bHRpcGxpY2F0aW9uIGJ5IGBgc2NsKiptYGAuICBUaGlzIGlzIGZvciB1c2UgaW4gYSBsaW5lYXIgY2hhbmdlIG9mCiAgICAgICAgdmFyaWFibGUuIChEZWZhdWx0OiAxKQogICAgYXhpcyA6IGludCwgb3B0aW9uYWwKICAgICAgICBBeGlzIG92ZXIgd2hpY2ggdGhlIGRlcml2YXRpdmUgaXMgdGFrZW4uIChEZWZhdWx0OiAwKS4KCiAgICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMS43LjAKCiAgICBSZXR1cm5zCiAgICAtLS0tLS0tCiAgICBkZXIgOiBuZGFycmF5CiAgICAgICAgQ2hlYnlzaGV2IHNlcmllcyBvZiB0aGUgZGVyaXZhdGl2ZS4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIGNoZWJpbnQKCiAgICBOb3RlcwogICAgLS0tLS0KICAgIEluIGdlbmVyYWwsIHRoZSByZXN1bHQgb2YgZGlmZmVyZW50aWF0aW5nIGEgQy1zZXJpZXMgbmVlZHMgdG8gYmUKICAgICJyZXByb2plY3RlZCIgb250byB0aGUgQy1zZXJpZXMgYmFzaXMgc2V0LiBUaHVzLCB0eXBpY2FsbHksIHRoZQogICAgcmVzdWx0IG9mIHRoaXMgZnVuY3Rpb24gaXMgInVuaW50dWl0aXZlLCIgYWxiZWl0IGNvcnJlY3Q7IHNlZSBFeGFtcGxlcwogICAgc2VjdGlvbiBiZWxvdy4KCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiBmcm9t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ZWNpcHJvY2FsIG9mIHdoYXQgb25lIG1pZ2h0IGV4cGVjdDsgZm9yIG1vcmUgaW5mb3JtYXRpb24sCiAgICBzZWUgdGhlIE5vdGVzIHNlY3Rpb24gYmVsb3cuKSAgVGhlIGFyZ3VtZW50IGBjYCBpcyBhbiBhcnJheSBvZgogICAgY29lZmZpY2llbnRzIGZyb20gbG93IHRvIGhpZ2ggZGVncmVlIGFsb25nIGVhY2ggYXhpcywgZS5nLiwgWzEsMiwzXQogICAgcmVwcmVzZW50cyB0aGUgc2VyaWVzIGBgVF8wICsgMipUXzEgKyAzKlRfMmBgIHdoaWxlIFtbMSwyXSxbMSwyXV0KICAgIHJlcHJlc2VudHMgYGAxKlRfMCh4KSpUXzAoeSkgKyAxKlRfMSh4KSpUXzAoeSkgKyAyKlRfMCh4KSpUXzEoeSkgKwogICAgMipUXzEoeCkqVF8xKHkpYGAgaWYgYXhpcz0wIGlzIGBgeGBgIGFuZCBheGlzPTEgaXMgYGB5YGAuCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgYyA6IGFycmF5X2xpa2UKICAgICAgICBBcnJheSBvZiBDaGVieXNoZXYgc2VyaWVzIGNvZWZmaWNpZW50cy4gSWYgYyBpcyBtdWx0aWRpbWVuc2lvbmFsCiAgICAgICAgdGhlIGRpZmZlcmVudCBheGlzIGNvcnJlc3BvbmQgdG8gZGlmZmVyZW50IHZhcmlhYmxlcyB3aXRoIHRoZQogICAgICAgIGRlZ3JlZSBpbiBlYWNoIGF4aXMgZ2l2ZW4gYnkgdGhlIGNvcnJlc3BvbmRpbmcgaW5kZXguCiAgICBtIDogaW50LCBvcHRpb25hbAogICAgICAgIE9yZGVyIG9mIGludGVncmF0aW9uLCBtdXN0IGJlIHBvc2l0aXZlLiAoRGVmYXVsdDogMSkKICAgIGsgOiB7W10sIGxpc3QsIHNjYWxhcn0sIG9wdGlvbmFsCiAgICAgICAgSW50ZWdyYXRpb24gY29uc3RhbnQocykuICBUaGUgdmFsdWUgb2YgdGhlIGZpcnN0IGludGVncmFsIGF0IHplcm8KICAgICAgICBpcyB0aGUgZmlyc3QgdmFsdWUgaW4gdGhlIGxpc3QsIHRoZSB2YWx1ZSBvZiB0aGUgc2Vjb25kIGludGVncmFsCiAgICAgICAgYXQgemVybyBpcyB0aGUgc2Vjb25kIHZhbHVlLCBldGMuICBJZiBgYGsgPT0gW11gYCAodGhlIGRlZmF1bHQpLAogICAgICAgIGFsbCBjb25zdGFudHMgYXJlIHNldCB0byB6ZXJvLiAgSWYgYGBtID09IDFgYCwgYSBzaW5nbGUgc2NhbGFyIGNhbgogICAgICAgIGJlIGdpdmVuIGluc3RlYWQgb2YgYSBsaXN0LgogICAgbGJuZCA6IHNjYWxhciwgb3B0aW9uYWwKICAgICAgICBUaGUgbG93ZXIgYm91bmQgb2YgdGhlIGludGVncmFsLiAoRGVmYXVsdDogMCkKICAgIHNjbCA6IHNjYWxhciwgb3B0aW9uYWwKICAgICAgICBGb2xsb3dpbmcgZWFjaCBpbnRlZ3JhdGlvbiB0aGUgcmVzdWx0IGlzICptdWx0aXBsaWVkKiBieSBgc2NsYAogICAgICAgIGJlZm9yZSB0aGUgaW50ZWdyYXRpb24gY29uc3RhbnQgaXMgYWRkZWQuIChEZWZhdWx0OiAxKQogICAgYXhpcyA6IGludCwgb3B0aW9uYWwKICAgICAgICBBeGlzIG92ZXIgd2hpY2ggdGhlIGludGVncmFsIGlzIHRha2VuLiAoRGVmYXVsdDogMCkuCgogICAgICAgIC4uIHZlcnNpb25hZGRlZDo6IDEuNy4wCgogICAgUmV0dXJucwogICAgLS0tLS0tLQogICAgUyA6IG5kYXJyYXkKICAgICAgICBDLXNlcmllcyBjb2VmZmljaWVudHMgb2YgdGhlIGludGVncmFsLgoKICAgIFJhaXNlcwogICAgLS0tLS0tCiAgICBWYWx1ZUVycm9yCiAgICAgICAgSWYgYGBtIDwgMWBgLCBgYGxlbihrKSA+IG1gYCwgYGBucC5pc3NjYWxhcihsYm5kKSA9PSBGYWxzZWBgLCBvcgogICAgICAgIGBgbnAuaXNzY2FsYXIoc2NsKSA9PSBGYWxzZWBgLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgY2hlYmRlcgoKICAgIE5vdGVzCiAgICAtLS0tLQogICAgTm90ZSB0aGF0IHRoZSByZXN1bHQgb2YgZWFjaCBpbnRlZ3JhdGlvbiBpcyAqbXVsdGlwbGllZCogYnkgYHNjbGAuCiAgICBXaHkgaXMgdGhpcyBpbXBvcnRhbnQgdG8gbm90ZT8gIFNheSBvbmUgaXMgbWFraW5nIGEgbGluZWFyIGNoYW5nZSBvZgogICAgdmFyaWFibGUgOm1hdGg6YHUgPSBheCArIGJgIGluIGFuIGludGVncmFsIHJlbGF0aXZlIHRvIGB4YC4gIFRoZW4KICAgIDptYXRoOmBkeCA9IGR1L2FgLCBzbyBvbmUgd2lsbCBuZWVkIHRvIHNldCBgc2NsYCBlcXVhbCB0bwogICAgOm1hdGg6YDEvYWAtIHBlcmhhcHMgbm90IHdoYXQgb25lIHdvdWxkIGhhdmUgZmlyc3QgdGhvdWdodC4KCiAgICBBbHNvIG5vdGUgdGhhdCwgaW4gZ2VuZXJhbCwgdGhlIHJlc3VsdCBvZiBpbnRlZ3JhdGluZyBhIEMtc2VyaWVzIG5lZWRzCiAgICB0byBiZSAicmVwcm9qZWN0ZWQiIG9udG8gdGhlIEMtc2VyaWVzIGJhc2lzIHNldC4gIFRodXMsIHR5cGljYWxseSwKICAgIHRoZSByZXN1bHQgb2YgdGhpcyBmdW5jdGlvbiBpcyAidW5pbnR1aXRpdmUsIiBhbGJlaXQgY29ycmVjdDsgc2VlCiAgICBFeGFtcGxlcyBzZWN0aW9uIGJlbG93LgoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgPj4+IGZyb20gbnVtcHkucG9seW5vbWlhbCBpbXBvcnQgY2hlYnlzaGV2IGFzIEMKICAgID4+PiBjID0gKDEsMiwzKQogICAgPj4+IEMuY2hlYmludChjKQogICAgYXJyYXkoWyAwLjUsIC0wLjUsICAwLjUsICAwLjVdKQogICAgPj4+IEMuY2hlYmludChjLDMpCiAgICBhcnJheShbIDAuMDMxMjUgICAsIC0wLjE4NzUgICAgLCAgMC4wNDE2NjY2NywgLTAuMDUyMDgzMzMsICAwLjAxMDQxNjY3LAogICAgICAgICAgICAwLjAwNjI1ICAgXSkKICAgID4+PiBDLmNoZWJpbnQoYywgaz0zKQogICAgYXJyYXkoWyAzLjUsIC0wLjUsICAwLjUsICAwLjVdKQogICAgPj4+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ZXJvcyBpbiB0aGUgY29lZmZpY2llbnRzIHdpbGwgYmUgdXNlZCBpbiB0aGUgZXZhbHVhdGlvbiwgc28KICAgIHRoZXkgc2hvdWxkIGJlIGF2b2lkZWQgaWYgZWZmaWNpZW5jeSBpcyBhIGNvbmNlcm4uCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgeCA6IGFycmF5X2xpa2UsIGNvbXBhdGlibGUgb2JqZWN0CiAgICAgICAgSWYgYHhgIGlzIGEgbGlzdCBvciB0dXBsZSwgaXQgaXMgY29udmVydGVkIHRvIGFuIG5kYXJyYXksIG90aGVyd2lzZQogICAgICAgIGl0IGlzIGxlZnQgdW5jaGFuZ2VkIGFuZCB0cmVhdGVkIGFzIGEgc2NhbGFyLiBJbiBlaXRoZXIgY2FzZSwgYHhgCiAgICAgICAgb3IgaXRzIGVsZW1lbnRzIG11c3Qgc3VwcG9ydCBhZGRpdGlvbiBhbmQgbXVsdGlwbGljYXRpb24gd2l0aAogICAgICAgIHdpdGggdGhlbXNlbHZlcyBhbmQgd2l0aCB0aGUgZWxlbWVudHMgb2YgYGNgLgogICAgYyA6IGFycmF5X2xpa2UKICAgICAgICBBcnJheSBvZiBjb2VmZmljaWVudHMgb3JkZXJlZCBzbyB0aGF0IHRoZSBjb2VmZmljaWVudHMgZm9yIHRlcm1zIG9mCiAgICAgICAgZGVncmVlIG4gYXJlIGNvbnRhaW5lZCBpbiBjW25dLiBJZiBgY2AgaXMgbXVsdGlkaW1lbnNpb25hbCB0aGUKICAgICAgICByZW1haW5pbmcgaW5kaWNlcyBlbnVtZXJhdGUgbXVsdGlwbGUgcG9seW5vbWlhbHMuIEluIHRoZSB0d28KICAgICAgICBkaW1lbnNpb25hbCBjYXNlIHRoZSBjb2VmZmljaWVudHMgbWF5IGJlIHRob3VnaHQgb2YgYXMgc3RvcmVkIGluCiAgICAgICAgdGhlIGNvbHVtbnMgb2YgYGNgLgogICAgdGVuc29yIDogYm9vbGVhbiwgb3B0aW9uYWwKICAgICAgICBJZiBUcnVlLCB0aGUgc2hhcGUgb2YgdGhlIGNvZWZmaWNpZW50IGFycmF5IGlzIGV4dGVuZGVkIHdpdGggb25lcwog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X2xpa2UsIGNvbXBhdGlibGUgb2JqZWN0cwogICAgICAgIFRoZSB0d28gZGltZW5zaW9uYWwgc2VyaWVzIGlzIGV2YWx1YXRlZCBhdCB0aGUgcG9pbnRzIGAoeCwgeSlgLAogICAgICAgIHdoZXJlIGB4YCBhbmQgYHlgIG11c3QgaGF2ZSB0aGUgc2FtZSBzaGFwZS4gSWYgYHhgIG9yIGB5YCBpcyBhIGxpc3QKICAgICAgICBvciB0dXBsZSwgaXQgaXMgZmlyc3QgY29udmVydGVkIHRvIGFuIG5kYXJyYXksIG90aGVyd2lzZSBpdCBpcyBsZWZ0CiAgICAgICAgdW5jaGFuZ2VkIGFuZCBpZiBpdCBpc24ndCBhbiBuZGFycmF5IGl0IGlzIHRyZWF0ZWQgYXMgYSBzY2FsYXIuCiAgICBjIDogYXJyYXlfbGlrZQogICAgICAgIEFycmF5IG9mIGNvZWZmaWNpZW50cyBvcmRlcmVkIHNvIHRoYXQgdGhlIGNvZWZmaWNpZW50IG9mIHRoZSB0ZXJtCiAgICAgICAgb2YgbXVsdGktZGVncmVlIGksaiBpcyBjb250YWluZWQgaW4gYGBjW2ksal1gYC4gSWYgYGNgIGhhcwogICAgICAgIGRpbWVuc2lvbiBncmVhdGVyIHRoYW4gMiB0aGUgcmVtYWluaW5nIGluZGljZXMgZW51bWVyYXRlIG11bHRpcGxlCiAgICAgICAgc2V0cyBvZiBjb2VmZmljaWVudHMuCgogICAgUmV0dXJucwogICAgLS0tLS0tLQogICAgdmFsdWVzIDogbmRhcnJheSwgY29tcGF0aWJsZSBvYmplY3QKICAgICAgICBUaGUgdmFsdWVzIG9mIHRoZSB0d28gZGltZW5zaW9uYWwgQ2hlYnlzaGV2IHNlcmllcyBhdCBwb2ludHMgZm9ybWVkCiAgICAgICAgZnJvbSBwYWlycyBvZiBjb3JyZXNwb25kaW5nIHZhbHVlcyBmcm9tIGB4YCBhbmQgYHlgLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgY2hlYnZhbCwgY2hlYmdyaWQyZCwgY2hlYnZhbDNkLCBjaGViZ3JpZDNkCgogICAgTm90ZXMKICAgIC0tLS0tCgogICAgLi4gdmVyc2lvbmFkZGVkOjogMS43LjAKCiAgICByAQAAACkBcjYAAAB6FXgsIHkgYXJlIGluY29tcGF0aWJsZUYpAXKBAAAAKQRyLgAAAHJGAAAAcmkAAAByFAAAACkDcoAAAADaAXlyMAAAAHIzAAAAcjMAAAByNAAAAHIhAAAAnAQAAHMOAAAAAC4CARoBBgEOAgoBDgFjAwAAAAAAAAADAAAAAwAAAEMAAABzGAAAAHQAfAB8AoMCfQJ0AHwBfAKDAn0CfAJTACkBYekGAAAKICAgIEV2YWx1YXRlIGEgMi1EIENoZWJ5c2hldiBzZXJpZXMgb24gdGhlIENhcnRlc2lhbiBwcm9kdWN0IG9mIHggYW5kIHkuCgogICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSB2YWx1ZXM6CgogICAgLi4gbWF0aDo6IHAoYSxiKSA9IFxzdW1fe2ksan0gY197aSxqfSAqIFRfaShhKSAqIFRfaihiKSwKCiAgICB3aGVyZSB0aGUgcG9pbnRzIGAoYSwgYilgIGNvbnNpc3Qgb2YgYWxsIHBhaXJzIGZvcm1lZCBieSB0YWtpbmcKICAgIGBhYCBmcm9tIGB4YCBhbmQgYGJgIGZyb20gYHlgLiBUaGUgcmVzdWx0aW5nIHBvaW50cyBmb3JtIGEgZ3JpZCB3aXRoCiAgICBgeGAgaW4gdGhlIGZpcnN0IGRpbWVuc2lvbiBhbmQgYHlgIGluIHRoZSBzZWNvbmQuCgogICAgVGhlIHBhcmFtZXRlcnMgYHhgIGFuZCBgeWAgYXJlIGNvbnZlcnRlZCB0byBhcnJheXMgb25seSBpZiB0aGV5IGFyZQogICAgdHVwbGVzIG9yIGEgbGlzdHMsIG90aGVyd2lzZSB0aGV5IGFyZSB0cmVhdGVkIGFzIGEgc2NhbGFycy4gSW4gZWl0aGVyCiAgICBjYXNlLCBlaXRoZXIgYHhgIGFuZCBgeWAgb3IgdGhlaXIgZWxlbWVudHMgbXVzdCBzdXBwb3J0IG11bHRpcGxpY2F0aW9uCiAgICBhbmQgYWRkaXRpb24gYm90aCB3aXRoIHRoZW1zZWx2ZXMgYW5kIHdpdGggdGhlIGVsZW1lbnRzIG9mIGBjYC4KCiAgICBJZiBgY2AgaGFzIGZld2VyIHRoYW4gdHdvIGRpbWVuc2lvbnMsIG9uZXMgYXJlIGltcGxpY2l0bHkgYXBwZW5kZWQgdG8KICAgIGl0cyBzaGFwZSB0byBtYWtlIGl0IDItRC4gVGhlIHNoYXBlIG9mIHRoZSByZXN1bHQgd2lsbCBiZSBjLnNoYXBlWzI6XSArCiAgICB4LnNoYXBlICsgeS5zaGFwZS4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICB4LCB5IDogYXJyYXlfbGlrZSwgY29tcGF0aWJsZSBvYmplY3RzCiAgICAgICAgVGhlIHR3byBkaW1lbnNpb25hbCBzZXJpZXMgaXMgZXZhbHVhdGVkIGF0IHRoZSBwb2ludHMgaW4gdGhlCiAgICAgICAgQ2FydGVzaWFuIHByb2R1Y3Qgb2YgYHhgIGFuZCBgeWAuICBJZiBgeGAgb3IgYHlgIGlzIGEgbGlzdCBvcgogICAgICAgIHR1cGxlLCBpdCBpcyBmaXJzdCBjb252ZXJ0ZWQgdG8gYW4gbmRhcnJheSwgb3RoZXJ3aXNlIGl0IGlzIGxlZnQKICAgICAgICB1bmNoYW5nZWQgYW5kLCBpZiBpdCBpc24ndCBhbiBuZGFycmF5LCBpdCBpcyB0cmVhdGVkIGFzIGEgc2NhbGFyLgogICAgYyA6IGFycmF5X2xpa2UKICAgICAgICBBcnJheSBvZiBjb2VmZmljaWVudHMgb3JkZXJlZCBzbyB0aGF0IHRoZSBjb2VmZmljaWVudCBvZiB0aGUgdGVybSBvZgogICAgICAgIG11bHRpLWRlZ3JlZSBpLGogaXMgY29udGFpbmVkIGluIGBjW2ksal1gLiBJZiBgY2AgaGFzIGRpbWVuc2lvbgogICAgICAgIGdyZWF0ZXIgdGhhbiB0d28gdGhlIHJlbWFpbmluZyBpbmRpY2VzIGVudW1lcmF0ZSBtdWx0aXBsZSBzZXRzIG9mCiAgICAgICAgY29lZmZpY2llbnRzLgoKICAgIFJldHVybnMKICAgIC0tLS0tLS0KICAgIHZhbHVlcyA6IG5kYXJyYXksIGNvbXBhdGlibGUgb2JqZWN0CiAgICAgICAgVGhlIHZhbHVlcyBvZiB0aGUgdHdvIGRpbWVuc2lvbmFsIENoZWJ5c2hldiBzZXJpZXMgYXQgcG9pbnRzIGluIHRoZQogICAgICAgIENhcnRlc2lhbiBwcm9kdWN0IG9mIGB4YCBhbmQgYHlgLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgY2hlYnZhbCwgY2hlYnZhbDJkLCBjaGVidmFsM2QsIGNoZWJncmlkM2QKCiAgICBOb3RlcwogICAgLS0tLS0KCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAxLjcuMAoKICAgICkBchQAAAApA3KAAAAAcoMAAAByMAAAAHIzAAAAcjMAAAByNAAAAHIjAAAA1AQAAHMGAAAAADIKAQoBYwQAAAAAAAAABAAAAAYAAABDAAAAc14AAAB5HnQAagF8AHwBfAJmA2QBZAKNAlwDfQB9AX0CVwBuFAEAAQABAHQCZAODAYIBWQBuAlgAdAN8AHwDgwJ9A3QDfAF8A2QEZAWNA30DdAN8AnwDZARkBY0DfQN8A1MAKQZhowYAAAogICAgRXZhbHVhdGUgYSAzLUQgQ2hlYnlzaGV2IHNlcmllcyBhdCBwb2ludHMgKHgsIHksIHopLgoKICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgdmFsdWVzOgoKICAgIC4uIG1hdGg6OiBwKHgseSx6KSA9IFxzdW1fe2ksaixrfSBjX3tpLGosa30gKiBUX2koeCkgKiBUX2ooeSkgKiBUX2soeikKCiAgICBUaGUgcGFyYW1ldGVycyBgeGAsIGB5YCwgYW5kIGB6YCBhcmUgY29udmVydGVkIHRvIGFycmF5cyBvbmx5IGlmCiAgICB0aGV5IGFyZSB0dXBsZXMgb3IgYSBsaXN0cywgb3RoZXJ3aXNlIHRoZXkgYXJlIHRyZWF0ZWQgYXMgYSBzY2FsYXJzIGFuZAogICAgdGhleSBtdXN0IGhhdmUgdGhlIHNhbWUgc2hhcGUgYWZ0ZXIgY29udmVyc2lvbi4gSW4gZWl0aGVyIGNhc2UsIGVpdGhlcgogICAgYHhgLCBgeWAsIGFuZCBgemAgb3IgdGhlaXIgZWxlbWVudHMgbXVzdCBzdXBwb3J0IG11bHRpcGxpY2F0aW9uIGFuZAogICAgYWRkaXRpb24gYm90aCB3aXRoIHRoZW1zZWx2ZXMgYW5kIHdpdGggdGhlIGVsZW1lbnRzIG9mIGBjYC4KCiAgICBJZiBgY2AgaGFzIGZld2VyIHRoYW4gMyBkaW1lbnNpb25zLCBvbmVzIGFyZSBpbXBsaWNpdGx5IGFwcGVuZGVkIHRvIGl0cwogICAgc2hhcGUgdG8gbWFrZSBpdCAzLUQuIFRoZSBzaGFwZSBvZiB0aGUgcmVzdWx0IHdpbGwgYmUgYy5zaGFwZVszOl0gKwogICAgeC5zaGFwZS4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICB4LCB5LCB6IDogYXJyYXlfbGlrZSwgY29tcGF0aWJsZSBvYmplY3QKICAgICAgICBUaGUgdGhyZWUgZGltZW5zaW9uYWwgc2VyaWVzIGlzIGV2YWx1YXRlZCBhdCB0aGUgcG9pbnRzCiAgICAgICAgYCh4LCB5LCB6KWAsIHdoZXJlIGB4YCwgYHlgLCBhbmQgYHpgIG11c3QgaGF2ZSB0aGUgc2FtZSBzaGFwZS4gIElmCiAgICAgICAgYW55IG9mIGB4YCwgYHlgLCBvciBgemAgaXMgYSBsaXN0IG9yIHR1cGxlLCBpdCBpcyBmaXJzdCBjb252ZXJ0ZWQKICAgICAgICB0byBhbiBuZGFycmF5LCBvdGhlcndpc2UgaXQgaXMgbGVmdCB1bmNoYW5nZWQgYW5kIGlmIGl0IGlzbid0IGFuCiAgICAgICAgbmRhcnJheSBpdCBpcyAgdHJlYXRlZCBhcyBhIHNjYWxhci4KICAgIGMgOiBhcnJheV9saWtlCiAgICAgICAgQXJyYXkgb2YgY29lZmZpY2llbnRzIG9yZGVyZWQgc28gdGhhdCB0aGUgY29lZmZpY2llbnQgb2YgdGhlIHRlcm0gb2YKICAgICAgICBtdWx0aS1kZWdyZWUgaSxqLGsgaXMgY29udGFpbmVkIGluIGBgY1tpLGosa11gYC4gSWYgYGNgIGhhcyBkaW1lbnNpb24KICAgICAgICBncmVhdGVyIHRoYW4gMyB0aGUgcmVtYWluaW5nIGluZGljZXMgZW51bWVyYXRlIG11bHRpcGxlIHNldHMgb2YKICAgICAgICBjb2VmZmljaWVudHMuCgogICAgUmV0dXJucwogICAgLS0tLS0tLQogICAgdmFsdWVzIDogbmRhcnJheSwgY29tcGF0aWJsZSBvYmplY3QKICAgICAgICBUaGUgdmFsdWVzIG9mIHRoZSBtdWx0aWRpbWVuc2lvbmFsIHBvbHlub21pYWwgb24gcG9pbnRzIGZvcm1lZCB3aXRoCiAgICAgICAgdHJpcGxlcyBvZiBjb3JyZXNwb25kaW5nIHZhbHVlcyBmcm9tIGB4YCwgYHlgLCBhbmQgYHpgLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgY2hlYnZhbCwgY2hlYnZhbDJkLCBjaGViZ3JpZDJkLCBjaGViZ3JpZDNkCgogICAgTm90ZXMKICAgIC0tLS0tCgogICAgLi4gdmVyc2lvbmFkZGVkOjogMS43LjAKCiAgICByAQAAACkBcjYAAAB6GHgsIHksIHogYXJlIGluY29tcGF0aWJsZUYpAXKBAAAAKQRyLgAAAHJGAAAAcmkAAAByFAAAACkEcoAAAABygwAAANoBenIwAAAAcjMAAAByMwAAAHI0AAAAciIAAAALBQAAcxAAAAAAMAIBHgEGAQ4CCgEOAQ4BYwQAAAAAAAAABAAAAAMAAABDAAAAcyIAAAB0AHwAfAODAn0DdAB8AXwDgwJ9A3QAfAJ8A4MCfQN8A1MAKQFhUAcAAAogICAgRXZhbHVhdGUgYSAzLUQgQ2hlYnlzaGV2IHNlcmllcyBvbiB0aGUgQ2FydGVzaWFuIHByb2R1Y3Qgb2YgeCwgeSwgYW5kIHouCgogICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSB2YWx1ZXM6CgogICAgLi4gbWF0aDo6IHAoYSxiLGMpID0gXHN1bV97aSxqLGt9IGNfe2ksaixrfSAqIFRfaShhKSAqIFRfaihiKSAqIFRfayhjKQoKICAgIHdoZXJlIHRoZSBwb2ludHMgYChhLCBiLCBjKWAgY29uc2lzdCBvZiBhbGwgdHJpcGxlcyBmb3JtZWQgYnkgdGFraW5nCiAgICBgYWAgZnJvbSBgeGAsIGBiYCBmcm9tIGB5YCwgYW5kIGBjYCBmcm9tIGB6YC4gVGhlIHJlc3VsdGluZyBwb2ludHMgZm9ybQogICAgYSBncmlkIHdpdGggYHhgIGluIHRoZSBmaXJzdCBkaW1lbnNpb24sIGB5YCBpbiB0aGUgc2Vjb25kLCBhbmQgYHpgIGluCiAgICB0aGUgdGhpcmQuCgogICAgVGhlIHBhcmFtZXRlcnMgYHhgLCBgeWAsIGFuZCBgemAgYXJlIGNvbnZlcnRlZCB0byBhcnJheXMgb25seSBpZiB0aGV5CiAgICBhcmUgdHVwbGVzIG9yIGEgbGlzdHMsIG90aGVyd2lzZSB0aGV5IGFyZSB0cmVhdGVkIGFzIGEgc2NhbGFycy4gSW4KICAgIGVpdGhlciBjYXNlLCBlaXRoZXIgYHhgLCBgeWAsIGFuZCBgemAgb3IgdGhlaXIgZWxlbWVudHMgbXVzdCBzdXBwb3J0CiAgICBtdWx0aXBsaWNhdGlvbiBhbmQgYWRkaXRpb24gYm90aCB3aXRoIHRoZW1zZWx2ZXMgYW5kIHdpdGggdGhlIGVsZW1lbnRzCiAgICBvZiBgY2AuCgogICAgSWYgYGNgIGhhcyBmZXdlciB0aGFuIHRocmVlIGRpbWVuc2lvbnMsIG9uZXMgYXJlIGltcGxpY2l0bHkgYXBwZW5kZWQgdG8KICAgIGl0cyBzaGFwZSB0byBtYWtlIGl0IDMtRC4gVGhlIHNoYXBlIG9mIHRoZSByZXN1bHQgd2lsbCBiZSBjLnNoYXBlWzM6XSArCiAgICB4LnNoYXBlICsgeS5zaGFwZSArIHouc2hhcGUuCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgeCwgeSwgeiA6IGFycmF5X2xpa2UsIGNvbXBhdGlibGUgb2JqZWN0cwogICAgICAgIFRoZSB0aHJlZSBkaW1lbnNpb25hbCBzZXJpZXMgaXMgZXZhbHVhdGVkIGF0IHRoZSBwb2ludHMgaW4gdGhlCiAgICAgICAgQ2FydGVzaWFuIHByb2R1Y3Qgb2YgYHhgLCBgeWAsIGFuZCBgemAuICBJZiBgeGAsYHlgLCBvciBgemAgaXMgYQogICAgICAgIGxpc3Qgb3IgdHVwbGUsIGl0IGlzIGZpcnN0IGNvbnZlcnRlZCB0byBhbiBuZGFycmF5LCBvdGhlcndpc2UgaXQgaXMKICAgICAgICBsZWZ0IHVuY2hhbmdlZCBhbmQsIGlmIGl0IGlzbid0IGFuIG5kYXJyYXksIGl0IGlzIHRyZWF0ZWQgYXMgYQogICAgICAgIHNjYWxhci4KICAgIGMgOiBhcnJheV9saWtlCiAgICAgICAgQXJyYXkgb2YgY29lZmZpY2llbnRzIG9yZGVyZWQgc28gdGhhdCB0aGUgY29lZmZpY2llbnRzIGZvciB0ZXJtcyBvZgogICAgICAgIGRlZ3JlZSBpLGogYXJlIGNvbnRhaW5lZCBpbiBgYGNbaSxqXWBgLiBJZiBgY2AgaGFzIGRpbWVuc2lvbgogICAgICAgIGdyZWF0ZXIgdGhhbiB0d28gdGhlIHJlbWFpbmluZyBpbmRpY2VzIGVudW1lcmF0ZSBtdWx0aXBsZSBzZXRzIG9mCiAgICAgICAgY29lZmZpY2llbnRzLgoKICAgIFJldHVybnMKICAgIC0tLS0tLS0KICAgIHZhbHVlcyA6IG5kYXJyYXksIGNvbXBhdGlibGUgb2JqZWN0CiAgICAgICAgVGhlIHZhbHVlcyBvZiB0aGUgdHdvIGRpbWVuc2lvbmFsIHBvbHlub21pYWwgYXQgcG9pbnRzIGluIHRoZSBDYXJ0ZXNpYW4KICAgICAgICBwcm9kdWN0IG9mIGB4YCBhbmQgYHlgLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgY2hlYnZhbCwgY2hlYnZhbDJkLCBjaGViZ3JpZDJkLCBjaGVidmFsM2QKCiAgICBOb3RlcwogICAgLS0tLS0KCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAxLjcuMAoKICAgICkBchQAAAApBHKAAAAAcoMAAAByhAAAAHIwAAAAcjMAAAByMwAAAHI0AAAAciQAAABGBQAAcwgAAAAANQoBCgEKAWMCAAAAAAAAAAgAAAAFAAAAQwAAAHPQAAAAdAB8AYMBfQJ8AnwBawNyGHQBZAGDAYIBfAJkAmsAcih0AWQDgwGCAXQCagN8AGQCZARkBY0DZAYXAH0AfAJkBBcAZgF8AGoEFwB9A3wAagV9BHQCagZ8A3wEZAeNAn0FfABkAhQAZAQXAHwFZAI8AHwCZAJrBHLAZAh8ABQAfQZ8AHwFZAQ8AHg2dAdkCHwCZAQXAIMCRABdJH0HfAV8B2QEGAAZAHwGFAB8BXwHZAgYABkAGAB8BXwHPABxmFcAdAKgCHwFZAJ8BWoJoQNTACkJYR8FAABQc2V1ZG8tVmFuZGVybW9uZGUgbWF0cml4IG9mIGdpdmVuIGRlZ3JlZS4KCiAgICBSZXR1cm5zIHRoZSBwc2V1ZG8tVmFuZGVybW9uZGUgbWF0cml4IG9mIGRlZ3JlZSBgZGVnYCBhbmQgc2FtcGxlIHBvaW50cwogICAgYHhgLiBUaGUgcHNldWRvLVZhbmRlcm1vbmRlIG1hdHJpeCBpcyBkZWZpbmVkIGJ5CgogICAgLi4gbWF0aDo6IFZbLi4uLCBpXSA9IFRfaSh4KSwKCiAgICB3aGVyZSBgMCA8PSBpIDw9IGRlZ2AuIFRoZSBsZWFkaW5nIGluZGljZXMgb2YgYFZgIGluZGV4IHRoZSBlbGVtZW50cyBvZgogICAgYHhgIGFuZCB0aGUgbGFzdCBpbmRleCBpcyB0aGUgZGVncmVlIG9mIHRoZSBDaGVieXNoZXYgcG9seW5vbWlhbC4KCiAgICBJZiBgY2AgaXMgYSAxLUQgYXJyYXkgb2YgY29lZmZpY2llbnRzIG9mIGxlbmd0aCBgbiArIDFgIGFuZCBgVmAgaXMgdGhlCiAgICBtYXRyaXggYGBWID0gY2hlYnZhbmRlcih4LCBuKWBgLCB0aGVuIGBgbnAuZG90KFYsIGMpYGAgYW5kCiAgICBgYGNoZWJ2YWwoeCwgYylgYCBhcmUgdGhlIHNhbWUgdXAgdG8gcm91bmRvZmYuICBUaGlzIGVxdWl2YWxlbmNlIGlzCiAgICB1c2VmdWwgYm90aCBmb3IgbGVhc3Qgc3F1YXJlcyBmaXR0aW5nIGFuZCBmb3IgdGhlIGV2YWx1YXRpb24gb2YgYSBsYXJnZQogICAgbnVtYmVyIG9mIENoZWJ5c2hldiBzZXJpZXMgb2YgdGhlIHNhbWUgZGVncmVlIGFuZCBzYW1wbGUgcG9pbnRzLgoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIHggOiBhcnJheV9saWtlCiAgICAgICAgQXJyYXkgb2YgcG9pbnRzLiBUaGUgZHR5cGUgaXMgY29udmVydGVkIHRvIGZsb2F0NjQgb3IgY29tcGxleDEyOAogICAgICAgIGRlcGVuZGluZyBvbiB3aGV0aGVyIGFueSBvZiB0aGUgZWxlbWVudHMgYXJlIGNvbXBsZXguIElmIGB4YCBpcwogICAgICAgIHNjYWxhciBpdCBpcyBjb252ZXJ0ZWQgdG8gYSAxLUQgYXJyYXkuCiAgICBkZWcgOiBpbnQKICAgICAgICBEZWdyZWUgb2YgdGhlIHJlc3VsdGluZyBtYXRyaXguCgogICAgUmV0dXJucwogICAgLS0tLS0tLQogICAgdmFuZGVyIDogbmRhcnJheQogICAgICAgIFRoZSBwc2V1ZG8gVmFuZGVybW9uZGUgbWF0cml4LiBUaGUgc2hhcGUgb2YgdGhlIHJldHVybmVkIG1hdHJpeCBpcwogICAgICAgIGBgeC5zaGFwZSArIChkZWcgKyAxLClgYCwgd2hlcmUgVGhlIGxhc3QgaW5kZXggaXMgdGhlIGRlZ3JlZSBvZiB0aGUKICAgICAgICBjb3JyZXNwb25kaW5nIENoZWJ5c2hldiBwb2x5bm9taWFsLiAgVGhlIGR0eXBlIHdpbGwgYmUgdGhlIHNhbWUgYXMKICAgICAgICB0aGUgY29udmVydGVkIGB4YC4KCiAgICB6E2RlZyBtdXN0IGJlIGludGVnZXJyAQAAAHoYZGVnIG11c3QgYmUgbm9uLW5lZ2F0aXZlcgYAAAApAnI2AAAAcmwAAABnAAAAAAAAAAApAXIrAAAAcioAAAApCnJoAAAAcmkAAAByLgAAAHJGAAAAcnQAAAByKwAAAHI9AAAAck4AAABycwAAAHJyAAAAKQhygAAAAHJPAAAA2gRpZGVnWgRkaW1zWgRkdHlw2gF2coIAAAByQAAAAHIzAAAAcjMAAAByNAAAAHIaAAAAgQUAAHMgAAAAACMIAQgBCAEIAQgCFAEQAQYBDgIQAQgBCAEIARQBJAFjAwAAAAAAAAAKAAAABgAAAEMAAABzngAAAGQBZAKEAHwCRACDAX0DZANkAoQAdAB8A3wCgwJEAIMBfQR8BGQEZARnAmsDcjZ0AWQFgwGCAXwDXAJ9BX0GdAJqA3wAfAFmAmQGZAeNAmQIFwBcAn0AfQF0BHwAfAWDAn0HdAR8AXwGgwJ9CHwHZAkZAHwIZApkC2QLZAuFAmYDGQAUAH0JfAmgBXwJagZkC2QMhQIZAGQNFwChAVMAKQ5hlQYAAFBzZXVkby1WYW5kZXJtb25kZSBtYXRyaXggb2YgZ2l2ZW4gZGVncmVlcy4KCiAgICBSZXR1cm5zIHRoZSBwc2V1ZG8tVmFuZGVybW9uZGUgbWF0cml4IG9mIGRlZ3JlZXMgYGRlZ2AgYW5kIHNhbXBsZQogICAgcG9pbnRzIGAoeCwgeSlgLiBUaGUgcHNldWRvLVZhbmRlcm1vbmRlIG1hdHJpeCBpcyBkZWZpbmVkIGJ5CgogICAgLi4gbWF0aDo6IFZbLi4uLCAoZGVnWzFdICsgMSkqaSArIGpdID0gVF9pKHgpICogVF9qKHkpLAoKICAgIHdoZXJlIGAwIDw9IGkgPD0gZGVnWzBdYCBhbmQgYDAgPD0gaiA8PSBkZWdbMV1gLiBUaGUgbGVhZGluZyBpbmRpY2VzIG9mCiAgICBgVmAgaW5kZXggdGhlIHBvaW50cyBgKHgsIHkpYCBhbmQgdGhlIGxhc3QgaW5kZXggZW5jb2RlcyB0aGUgZGVncmVlcyBvZgogICAgdGhlIENoZWJ5c2hldiBwb2x5bm9taWFscy4KCiAgICBJZiBgYFYgPSBjaGVidmFuZGVyMmQoeCwgeSwgW3hkZWcsIHlkZWddKWBgLCB0aGVuIHRoZSBjb2x1bW5zIG9mIGBWYAogICAgY29ycmVzcG9uZCB0byB0aGUgZWxlbWVudHMgb2YgYSAyLUQgY29lZmZpY2llbnQgYXJyYXkgYGNgIG9mIHNoYXBlCiAgICAoeGRlZyArIDEsIHlkZWcgKyAxKSBpbiB0aGUgb3JkZXIKCiAgICAuLiBtYXRoOjogY197MDB9LCBjX3swMX0sIGNfezAyfSAuLi4gLCBjX3sxMH0sIGNfezExfSwgY197MTJ9IC4uLgoKICAgIGFuZCBgYG5wLmRvdChWLCBjLmZsYXQpYGAgYW5kIGBgY2hlYnZhbDJkKHgsIHksIGMpYGAgd2lsbCBiZSB0aGUgc2FtZQogICAgdXAgdG8gcm91bmRvZmYuIFRoaXMgZXF1aXZhbGVuY2UgaXMgdXNlZnVsIGJvdGggZm9yIGxlYXN0IHNxdWFyZXMKICAgIGZpdHRpbmcgYW5kIGZvciB0aGUgZXZhbHVhdGlvbiBvZiBhIGxhcmdlIG51bWJlciBvZiAyLUQgQ2hlYnlzaGV2CiAgICBzZXJpZXMgb2YgdGhlIHNhbWUgZGVncmVlcyBhbmQgc2FtcGxlIHBvaW50cy4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICB4LCB5IDogYXJyYXlfbGlrZQogICAgICAgIEFycmF5cyBvZiBwb2ludCBj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LCB6KWAgYW5kIHRoZSBsYXN0IGluZGV4IGVuY29kZXMKICAgIHRoZSBkZWdyZWVzIG9mIHRoZSBDaGVieXNoZXYgcG9seW5vbWlhbHMuCgogICAgSWYgYGBWID0gY2hlYnZhbmRlcjNkKHgsIHksIHosIFt4ZGVnLCB5ZGVnLCB6ZGVnXSlgYCwgdGhlbiB0aGUgY29sdW1ucwogICAgb2YgYFZgIGNvcnJlc3BvbmQgdG8gdGhlIGVsZW1lbnRzIG9mIGEgMy1EIGNvZWZmaWNpZW50IGFycmF5IGBjYCBvZgogICAgc2hhcGUgKHhkZWcgKyAxLCB5ZGVnICsgMSwgemRlZyArIDEpIGluIHRoZSBvcmRlcgoKICAgIC4uIG1hdGg6OiBjX3swMDB9LCBjX3swMDF9LCBjX3swMDJ9LC4uLiAsIGNfezAxMH0sIGNfezAxMX0sIGNfezAxMn0sLi4uCgogICAgYW5kIGBgbnAuZG90KFYsIGMuZmxhdClgYCBhbmQgYGBjaGVidmFsM2QoeCwgeSwgeiwgYylgYCB3aWxsIGJlIHRoZQogICAgc2FtZSB1cCB0byByb3VuZG9mZi4gVGhpcyBlcXVpdmFsZW5jZSBpcyB1c2VmdWwgYm90aCBmb3IgbGVhc3Qgc3F1YXJlcwogICAgZml0dGluZyBhbmQgZm9yIHRoZSBldmFsdWF0aW9uIG9mIGEgbGFyZ2UgbnVtYmVyIG9mIDMtRCBDaGVieXNoZXYKICAgIHNlcmllcyBvZiB0aGUgc2FtZSBkZWdyZWVzIGFuZCBzYW1wbGUgcG9pbnRzLgoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIHgsIHksIHogOiBhcnJheV9saWtlCiAgICAgICAgQXJyYXlzIG9mIHBvaW50IGNvb3JkaW5hdGVzLCBhbGwgb2YgdGhlIHNhbWUgc2hhcGUuIFRoZSBkdHlwZXMgd2lsbAogICAgICAgIGJlIGNvbnZlcnRlZCB0byBlaXRoZXIgZmxvYXQ2NCBvciBjb21wbGV4MTI4IGRlcGVuZGluZyBvbiB3aGV0aGVyCiAgICAgICAgYW55IG9mIHRoZSBlbGVtZW50cyBhcmUgY29tcGxleC4gU2NhbGFycyBhcmUgY29udmVydGVkIHRvIDEt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diBzZXJpZXMgb2YgZGVncmVlIGBkZWdgIHRoYXQgaXMgdGhlCiAgICBsZWFzdCBzcXVhcmVzIGZpdCB0byB0aGUgZGF0YSB2YWx1ZXMgYHlgIGdpdmVuIGF0IHBvaW50cyBgeGAuIElmIGB5YCBpcwogICAgMS1EIHRoZSByZXR1cm5lZCBjb2VmZmljaWVudHMgd2lsbCBhbHNvIGJlIDEtRC4gSWYgYHlgIGlzIDItRCBtdWx0aXBsZQogICAgZml0cyBhcmUgZG9uZSwgb25lIGZvciBlYWNoIGNvbHVtbiBvZiBgeWAsIGFuZCB0aGUgcmVzdWx0aW5nCiAgICBjb2VmZmljaWVudHMgYXJlIHN0b3JlZCBpbiB0aGUgY29ycmVzcG9uZGluZyBjb2x1bW5zIG9mIGEgMi1EIHJldHVybi4KICAgIFRoZSBmaXR0ZWQgcG9seW5vbWlhbChzKSBhcmUgaW4gdGhlIGZvcm0KCiAgICAuLiBtYXRoOjogIHAoeCkgPSBjXzAgKyBjXzEgKiBUXzEoeCkgKyAuLi4gKyBjX24gKiBUX24oeCksCgogICAgd2hlcmUgYG5gIGlzIGBkZWdgLgoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIHggOiBhcnJheV9saWtlLCBzaGFwZSAoTSwpCiAgICAgICAgeC1jb29yZGluYXRlcyBvZiB0aGUgTSBzYW1wbGUgcG9pbnRzIGBgKHhbaV0sIHlbaV0pYGAuCiAgICB5IDogYXJyYXlfbGlrZSwgc2hhcGUgKE0sKSBvciAoTSwgSykKICAgICAgICB5LWNvb3JkaW5hdGVzIG9mIHRoZSBzYW1wbGUgcG9pbnRzLiBTZXZlcmFsIGRhdGEgc2V0cyBvZiBzYW1wbGUKICAgICAgICBwb2ludHMgc2hhcmluZyB0aGUgc2FtZSB4LWNvb3JkaW5hdGVzIGNhbiBiZSBmaXR0ZWQgYXQgb25jZSBieQogICAgICAgIHBhc3NpbmcgaW4gYSAyRC1hcnJheSB0aGF0IGNvbnRhaW5zIG9uZSBkYXRhc2V0IHBlciBjb2x1bW4uCiAgICBkZWcgOiBpbnQgb3IgMS1EIGFycmF5X2xpa2UKICAgICAgICBEZWdyZWUocykgb2YgdGhlIGZpdHRpbmcgcG9seW5vbWlhbHMuIElmIGBkZWdgIGlzIGEgc2luZ2xlIGludGVnZXIKICAgICAgICBhbGwgdGVybXMgdXAgdG8gYW5kIGluY2x1ZGluZyB0aGUgYGRlZ2AndGggdGVybSBhcmUgaW5jbHVkZWQgaW4gdGhlCiAgICAgICAgZml0LiBGb3IgTnVtUHkgdmVyc2lvbnMgPj0gMS4xMS4wIGEgbGlzdCBvZiBpbnRlZ2VycyBzcGVjaWZ5aW5nIHRoZQogICAgICAgIGRlZ3JlZXMgb2YgdGhlIHRlcm1zIHRvIGluY2x1ZGUgbWF5IGJlIHVzZWQgaW5zdGVhZC4KICAgIHJjb25kIDogZmxvYXQsIG9wdGlvbmFsCiAgICAgICAgUmVsYXRpdmUgY29uZGl0aW9uIG51bWJlciBvZiB0aGUgZml0LiBTaW5ndWxhciB2YWx1ZXMgc21hbGxlciB0aGFuCiAgICAgICAgdGhpcyByZWxhdGl2ZSB0byB0aGUgbGFyZ2VzdCBzaW5ndWxhciB2YWx1ZSB3aWxsIGJlIGlnbm9yZWQuIFRoZQogICAgICAgIGRlZmF1bHQgdmFsdWUgaXMgbGVuKHgpKmVwcywgd2hlcmUgZXBzIGlzIHRoZSByZWxhdGl2ZSBwcmVjaXNpb24gb2YKICAgICAgICB0aGUgZmxvYXQgdHlwZSwgYWJvdXQgMmUtMTYgaW4gbW9zdCBjYXNlcy4KICAgIGZ1bGwgOiBib29sLCBvcHRpb25hbAogICAgICAgIFN3aXRjaCBkZXRlcm1pbmluZyBuYXR1cmUgb2YgcmV0dXJuIHZhbHVlLiBXaGVuIGl0IGlzIEZhbHNlICh0aGUKICAgICAgICBkZWZhdWx0KSBqdXN0IHRoZSBjb2VmZmljaWVudHMgYXJlIHJldHVybmVkLCB3aGVuIFRydWUgZGlhZ25vc3RpYwogICAgICAgIGluZm9ybWF0aW9uIGZyb20gdGhlIHNpbmd1bGFyIHZhbHVlIGRlY29tcG9zaXRpb24gaXMgYWxzbyByZXR1cm5lZC4KICAgIHcgOiBhcnJheV9saWtlLCBzaGFwZSAoYE1gLCksIG9wdGlvbmFsCiAgICAgICAgV2VpZ2h0cy4gSWYgbm90IE5vbmUsIHRoZSBjb250cmlidXRpb24gb2YgZWFjaCBwb2ludAogICAgICAgIGBgKHhbaV0seVtpXSlgYCB0byB0aGUgZml0IGlzIHdlaWdodGVkIGJ5IGB3W2ldYC4gSWRlYWxseSB0aGUKICAgICAgICB3ZWlnaHRzIGFyZSBjaG9zZW4gc28gdGhhdCB0aGUgZXJyb3JzIG9mIHRoZSBwcm9kdWN0cyBgYHdbaV0qeVtpXWBgCiAgICAgICAgYWxsIGhhdmUgdGhlIHNhbWUgdmFyaWFuY2UuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBOb25lLgoKICAgICAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAxLjUuMAoKICAgIFJldHVybnMKICAgIC0tLS0tLS0KICAgIGNvZWYgOiBuZGFycmF5LCBzaGFwZSAoTSwpIG9yIChNLCBLKQogICAgICAgIENoZWJ5c2hldiBjb2VmZmljaWVudHMgb3JkZXJlZCBmcm9tIGxvdyB0byBoaWdoLiBJZiBgeWAgd2FzIDItRCwKICAgICAgICB0aGUgY29lZmZpY2llbnRzIGZvciB0aGUgZGF0YSBpbiBjb2x1bW4gayAgb2YgYHlgIGFyZSBpbiBjb2x1bW4KICAgICAgICBga2AuCgogICAgW3Jlc2lkdWFscywgcmFuaywgc2luZ3VsYXJfdmFsdWVzLCByY29uZF0gOiBsaXN0CiAgICAgICAgVGhlc2UgdmFsdWVzIGFyZSBvbmx5IHJldHVybmVkIGlmIGBmdWxsYCA9IFRydWUKCiAgICAgICAgcmVzaWQgLS0gc3VtIG9mIHNxdWFyZWQgcmVzaWR1YWxzIG9mIHRoZSBsZWFzdCBzcXVhcmVzIGZpdAogICAgICAgIHJhbmsgLS0gdGhlIG51bWVyaWNhbCByYW5rIG9mIHRoZSBzY2FsZWQgVmFuZGVybW9uZGUgbWF0cml4CiAgICAgICAgc3YgLS0gc2luZ3VsYXIgdmFsdWVzIG9mIHRoZSBzY2FsZWQgVmFuZGVybW9uZGUgbWF0cml4CiAgICAgICAgcmNvbmQgLS0gdmFsdWUgb2YgYHJjb25kYC4KCiAgICAgICAgRm9yIG1vcmUgZGV0YWlscywgc2VlIGBsaW5hbGcubHN0c3FgLgoKICAgIFdhcm5zCiAgICAtLS0tLQogICAgUmFua1dhcm5pbmcKICAgICAgICBUaGUgcmFuayBvZiB0aGUgY29lZmZpY2llbnQgbWF0cml4IGluIHRoZSBsZWFzdC1zcXVhcmVzIGZpdCBpcwogICAgICAgIGRlZmljaWVudC4gVGhlIHdhcm5pbmcgaXMgb25seSByYWlzZWQgaWYgYGZ1bGxgID0gRmFsc2UuICBUaGUKICAgICAgICB3YXJuaW5ncyBjYW4gYmUgdHVybmVkIG9mZiBieQoKICAgICAgICA+Pj4gaW1wb3J0IHdhcm5pbmdzCiAgICAgICAgPj4+IHdhcm5pbmdzLnNpbXBsZWZpbHRlcignaWdub3JlJywgUmFua1dhcm5pbmcpCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBwb2x5Zml0LCBsZWdmaXQsIGxhZ2ZpdCwgaGVybWZpdCwgaGVybWVmaXQKICAgIGNoZWJ2YWwgOiBFdmFsdWF0ZXMgYSBDaGVieXNoZXYgc2VyaWVzLgogICAgY2hlYnZhbmRlciA6IFZhbmRlcm1vbmRlIG1hdHJpeCBvZiBDaGVieXNoZXYgc2VyaWVzLgogICAgY2hlYndlaWdodCA6IENoZWJ5c2hldiB3ZWlnaHQgZnVuY3Rpb24uCiAgICBsaW5hbGcubHN0c3EgOiBDb21wdXRlcyBhIGxlYXN0LXNxdWFyZXMgZml0IGZyb20gdGhlIG1hdHJpeC4KICAgIHNjaXB5LmludGVycG9sYXRlLlVuaXZhcmlhdGVTcGxpbmUgOiBDb21wdXRlcyBzcGxpbmUgZml0cy4KCiAgICBOb3RlcwogICAgLS0tLS0KICAgIFRoZSBzb2x1dGlvbiBpcyB0aGUgY29lZmZpY2llbnRzIG9mIHRoZSBDaGVieXNoZXYgc2VyaWVzIGBwYCB0aGF0CiAgICBtaW5pbWl6ZXMgdGhlIHN1bSBvZiB0aGUgd2VpZ2h0ZWQgc3F1YXJlZCBlcnJvcnMKCiAgICAuLiBtYXRoOjogRSA9IFxzdW1faiB3X2peMiAqIHx5X2ogLSBwKHhfail8XjIsCgogICAgd2hlcmUgOm1hdGg6YHdfamAgYXJlIHRoZSB3ZWlnaHRzLiBUaGlzIHByb2JsZW0gaXMgc29sdmVkIGJ5IHNldHRpbmcgdXAKICAgIGFzIHRoZSAodHlwaWNhbGx5KSBvdmVyZGV0ZXJtaW5lZCBtYXRyaXggZXF1YXRpb24KCiAgICAuLiBtYXRoOjogVih4KSAqIGMgPSB3ICogeSwKCiAgICB3aGVyZSBgVmAgaXMgdGhlIHdlaWdodGVkIHBzZXVkbyBWYW5kZXJtb25kZSBtYXRyaXggb2YgYHhgLCBgY2AgYXJlIHRoZQogICAgY29lZmZpY2llbnRzIHRvIGJlIHNvbHZlZCBmb3IsIGB3YCBhcmUgdGhlIHdlaWdodHMsIGFuZCBgeWAgYXJlIHRoZQogICAgb2JzZXJ2ZWQgdmFsdWVzLiAgVGhpcyBlcXVhdGlvbiBpcyB0aGVuIHNvbHZlZCB1c2luZyB0aGUgc2luZ3VsYXIgdmFsdWUKICAgIGRlY29tcG9zaXRpb24gb2YgYFZgLgoKICAgIElmIHNvbWUgb2YgdGhlIHNpbmd1bGFyIHZhbHVlcyBvZiBgVmAgYXJlIHNvIHNtYWxsIHRoYXQgdGhleSBhcmUKICAgIG5lZ2xlY3RlZCwgdGhlbiBhIGBSYW5rV2FybmluZ2Agd2lsbCBiZSBpc3N1ZWQuIFRoaXMgbWVhbnMgdGhhdCB0aGUKICAgIGNvZWZmaWNpZW50IHZhbHVlcyBtYXkgYmUgcG9vcmx5IGRldGVybWluZWQuIFVzaW5nIGEgbG93ZXIgb3JkZXIgZml0CiAgICB3aWxsIHVzdWFsbHkgZ2V0IHJpZCBvZiB0aGUgd2FybmluZy4gIFRoZSBgcmNvbmRgIHBhcmFtZXRlciBjYW4gYWxzbyBiZQogICAgc2V0IHRvIGEgdmFsdWUgc21hbGxlciB0aGFuIGl0cyBkZWZhdWx0LCBidXQgdGhlIHJlc3VsdGluZyBmaXQgbWF5IGJlCiAgICBzcHVyaW91cyBhbmQgaGF2ZSBsYXJnZSBjb250cmlidXRpb25zIGZyb20gcm91bmRvZmYgZXJyb3IuCgogICAgRml0cyB1c2luZyBDaGVieXNoZXYgc2VyaWVzIGFyZSB1c3VhbGx5IGJldHRlciBjb25kaXRpb25lZCB0aGFuIGZpdHMKICAgIHVzaW5nIHBvd2VyIHNlcmllcywgYnV0IG11Y2ggY2FuIGRlcGVuZCBvbiB0aGUgZGlzdHJpYnV0aW9uIG9m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dCA6IG5kYXJyYXkKICAgICAgICBBcnJheSBvZiB0aGUgcm9vdHMgb2YgdGhlIHNlcmllcy4gSWYgYWxsIHRoZSByb290cyBhcmUgcmVhbCwKICAgICAgICB0aGVuIGBvdXRgIGlzIGFsc28gcmVhbCwgb3RoZXJ3aXNlIGl0IGlzIGNvbXBsZXguCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBwb2x5cm9vdHMsIGxlZ3Jvb3RzLCBsYWdyb290cywgaGVybXJvb3RzLCBoZXJtZXJvb3RzCgogICAgTm90ZXMKICAgIC0tLS0tCiAgICBUaGUgcm9vdCBlc3RpbWF0ZXMgYXJlIG9idGFpbmVkIGFzIHRoZSBlaWdlbnZhbHVlcyBvZiB0aGUgY29tcGFuaW9uCiAgICBtYXRyaXgsIFJvb3RzIGZhciBmcm9tIHRoZSBvcmlnaW4gb2YgdGhlIGNvbXBsZXggcGxhbmUgbWF5IGhhdmUgbGFyZ2UKICAgIGVycm9ycyBkdWUgdG8gdGhlIG51bWVyaWNhbCBpbnN0YWJpbGl0eSBvZiB0aGUgc2VyaWVzIGZvciBzdWNoCiAgICB2YWx1ZXMuIFJvb3RzIHdpdGggbXVsdGlwbGljaXR5IGdyZWF0ZXIgdGhhbiAxIHdpbGwgYWxzbyBzaG93IGxhcmdlcgogICAgZXJyb3JzIGFzIHRoZSB2YWx1ZSBvZiB0aGUgc2VyaWVzIG5lYXIgc3VjaCBwb2ludHMgaXMgcmVsYXRpdmVseQogICAgaW5zZW5zaXRpdmUgdG8gZXJyb3JzIGluIHRoZSByb290cy4gSXNvbGF0ZWQgcm9vdHMgbmVhciB0aGUgb3JpZ2luIGNhbgogICAgYmUgaW1wcm92ZWQgYnkgYSBmZXcgaXRlcmF0aW9ucyBvZiBOZXd0b24ncyBtZXRob2QuCgogICAgVGhlIENoZWJ5c2hldiBzZXJpZXMgYmFzaXMgcG9seW5vbWlhbHMgYXJlbid0IHBvd2VycyBvZiBgeGAgc28gdGhlCiAgICByZXN1bHRzIG9mIHRoaXMgZnVuY3Rpb24gbWF5IHNlZW0gdW5pbnR1aXRpdmUuCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICA+Pj4gaW1wb3J0IG51bXB5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
Base64 mode: content will be decoded on save.
Save
Close
Exit & Reset
Directory Contents
Dirs: 0 × Files: 10
Delete Selected
Select All
Select None
Sort:
Name
Size
Modified
Enable drag-to-move
Name
Size
Perms
Modified
Actions
chebyshev.cpython-37.pyc
60.57 KB
lrw-r--r--
2023-04-24 19:38:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
hermite.cpython-37.pyc
55.33 KB
lrw-r--r--
2023-04-24 19:38:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
hermite_e.cpython-37.pyc
55.36 KB
lrw-r--r--
2023-04-24 19:38:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
laguerre.cpython-37.pyc
53.73 KB
lrw-r--r--
2023-04-24 19:38:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
legendre.cpython-37.pyc
54.61 KB
lrw-r--r--
2023-04-24 19:38:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
polynomial.cpython-37.pyc
50.42 KB
lrw-r--r--
2023-04-24 19:38:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
polyutils.cpython-37.pyc
11.91 KB
lrw-r--r--
2023-04-24 19:38:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
setup.cpython-37.pyc
603 B
lrw-r--r--
2023-04-24 19:38:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
_polybase.cpython-37.pyc
30.24 KB
lrw-r--r--
2023-04-24 19:38:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
__init__.cpython-37.pyc
1.37 KB
lrw-r--r--
2023-04-24 19:38:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
Zip Selected
If ZipArchive is unavailable, a
.tar
will be created (no compression).