REDROOM
PHP 8.3.31
Path:
Logout
Edit File
Size: 35.37 KB
Close
//lib/python3.6/site-packages/__pycache__/distro.cpython-36.opt-1.pyc
Text
Base64
Mw0NCvb2V1zzqAAA4wAAAAAAAAAAAAAAAAUAAABAAAAAc34BAABkAFoAZAFkAmwBWgFkAWQCbAJaAmQBZAJsA1oDZAFkAmwEWgRkAWQCbAVaBWQBZAJsBloGZAFkAmwHWgdkAWQCbAhaCGUBaglqCmQDZASDAloLZAVaDGQGZAdpAVoNZAdkCGQIZAmcA1oOZApkCGkBWg9lAmoQZAuDAVoRZQJqEGQMgwFaEmQNZA5kD2UMZBBmBVoTZEBkEmQThAFaFGQUZBWEAFoVZEFkF2QYhAFaFmRCZBlkGoQBWhdkQ2QbZByEAVoYZERkHWQehAFaGWRFZB9kIIQBWhpkRmQhZCKEAVobZCNkJIQAWhxkJWQmhABaHWRHZCdkKIQBWh5kKWQqhABaH2QrZCyEAFogZC1kLoQAWiFkL2QwhABaImQxZDKEAFojZDNkNIQAWiRkNWQ2hABaJWQ3ZDiEAFomRwBkOWQ6hABkOmUngwNaKEcAZDtkPIQAZDxlJ4MDWillKYMAWipkPWQ+hABaK2UsZD9rApABcnplK4MAAQBkAlMAKUhhDAMAAApUaGUgYGBkaXN0cm9gYCBwYWNrYWdlIChgYGRpc3Ryb2BgIHN0YW5kcyBmb3IgTGludXggRGlzdHJpYnV0aW9uKSBwcm92aWRlcwppbmZvcm1hdGlvbiBhYm91dCB0aGUgTGludXggZGlzdHJpYnV0aW9uIGl0IHJ1bnMgb24sIHN1Y2ggYXMgYSByZWxpYWJsZQptYWNoaW5lLXJlYWRhYmxlIGRpc3RybyBJRCwgb3IgdmVyc2lvbiBpbmZvcm1hdGlvbi4KCkl0IGlzIHRoZSByZWNvbW1lbmRlZCByZXBsYWNlbWVudCBmb3IgUHl0aG9uJ3Mgb3JpZ2luYWwKOnB5OmZ1bmM6YHBsYXRmb3JtLmxpbnV4X2Rpc3RyaWJ1dGlvbmAgZnVuY3Rpb24sIGJ1dCBpdCBwcm92aWRlcyBtdWNoIG1vcmUKZnVuY3Rpb25hbGl0eS4gQW4gYWx0ZXJuYXRpdmUgaW1wbGVtZW50YXRpb24gYmVjYW1lIG5lY2Vzc2FyeSBiZWNhdXNlIFB5dGhvbgozLjUgZGVwcmVjYXRlZCB0aGlzIGZ1bmN0aW9uLCBhbmQgUHl0aG9uIDMuOCB3aWxsIHJlbW92ZSBpdCBhbHRvZ2V0aGVyLgpJdHMgcHJlZGVjZXNzb3IgZnVuY3Rpb24gOnB5OmZ1bmM6YHBsYXRmb3JtLmRpc3RgIHdhcyBhbHJlYWR5CmRlcHJlY2F0ZWQgc2luY2UgUHl0aG9uIDIuNiBhbmQgd2lsbCBhbHNvIGJlIHJlbW92ZWQgaW4gUHl0aG9uIDMuOC4KU3RpbGwsIHRoZXJlIGFyZSBtYW55IGNhc2VzIGluIHdoaWNoIGFjY2VzcyB0byBPUyBkaXN0cmlidXRpb24gaW5mb3JtYXRpb24KaXMgbmVlZGVkLiBTZWUgYFB5dGhvbiBpc3N1ZSAxMzIyIDxodHRwczovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTEzMjI+YF8gZm9yCm1vcmUgaW5mb3JtYXRpb24uCukAAAAATloLVU5JWENPTkZESVJ6BC9ldGN6Cm9zLXJlbGVhc2VaAm9sWgZvcmFjbGVaBHJoZWwpA1oUZW50ZXJwcmlzZWVudGVycHJpc2VaG3JlZGhhdGVudGVycHJpc2V3b3Jrc3RhdGlvbloWcmVkaGF0ZW50ZXJwcmlzZXNlcnZlcloGcmVkaGF0ekEoPzpbXildKlwpKC4qKVwoKT8gKig/OlNUTCApPyhbXGQuK1wtYS16XSpcZCkgKig/OmVzYWVsZXIgKik/KC4rKXobKFx3KylbLV9dKHJlbGVhc2V8dmVyc2lvbikkWg5kZWJpYW5fdmVyc2lvbnoLbHNiLXJlbGVhc2V6C29lbS1yZWxlYXNleg5zeXN0ZW0tcmVsZWFzZVRjAQAAAAAAAAABAAAAAgAAAEMAAABzCgAAAHQAagF8AIMBUwApAWEbBAAACiAgICBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgT1MgZGlzdHJpYnV0aW9uIGFzIGEgdHVwbGUKICAgIGBgKGlkX25hbWUsIHZlcnNpb24sIGNvZGVuYW1lKWBgIHdpdGggaXRlbXMgYXMgZm9sbG93czoKCiAgICAqIGBgaWRfbmFtZWBgOiAgSWYgKmZ1bGxfZGlzdHJpYnV0aW9uX25hbWUqIGlzIGZhbHNlLCB0aGUgcmVzdWx0IG9mCiAgICAgIDpmdW5jOmBkaXN0cm8uaWRgLiBPdGhlcndpc2UsIHRoZSByZXN1bHQgb2YgOmZ1bmM6YGRpc3Ryby5uYW1lYC4KCiAgICAqIGBgdmVyc2lvbmBgOiAgVGhlIHJlc3VsdCBvZiA6ZnVuYzpgZGlzdHJvLnZlcnNpb25gLgoKICAgICogYGBjb2RlbmFtZWBgOiAgVGhlIHJlc3VsdCBvZiA6ZnVuYzpgZGlzdHJvLmNvZGVuYW1lYC4KCiAgICBUaGUgaW50ZXJmYWNlIG9mIHRoaXMgZnVuY3Rpb24gaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBvcmlnaW5hbAogICAgOnB5OmZ1bmM6YHBsYXRmb3JtLmxpbnV4X2Rpc3RyaWJ1dGlvbmAgZnVuY3Rpb24sIHN1cHBvcnRpbmcgYSBzdWJzZXQgb2YKICAgIGl0cyBwYXJhbWV0ZXJzLgoKICAgIFRoZSBkYXRhIGl0IHJldHVybnMgbWF5IG5vdCBleGFjdGx5IGJlIHRoZSBzYW1lLCBiZWNhdXNlIGl0IHVzZXMgbW9yZSBkYXRhCiAgICBzb3VyY2VzIHRoYW4gdGhlIG9yaWdpbmFsIGZ1bmN0aW9uLCBhbmQgdGhhdCBtYXkgbGVhZCB0byBkaWZmZXJlbnQgZGF0YSBpZgogICAgdGhlIE9TIGRpc3RyaWJ1dGlvbiBpcyBub3QgY29uc2lzdGVudCBhY3Jvc3MgbXVsdGlwbGUgZGF0YSBzb3VyY2VzIGl0CiAgICBwcm92aWRlcyAodGhlcmUgYXJlIGluZGVlZCBzdWNoIGRpc3RyaWJ1dGlvbnMgLi4uKS4KCiAgICBBbm90aGVyIHJlYXNvbiBmb3IgZGlmZmVyZW5jZXMgaXMgdGhlIGZhY3QgdGhhdCB0aGUgOmZ1bmM6YGRpc3Ryby5pZGAKICAgIG1ldGhvZCBub3JtYWxpemVzIHRoZSBkaXN0cm8gSUQgc3RyaW5nIHRvIGEgcmVsaWFibGUgbWFjaGluZS1yZWFkYWJsZSB2YWx1ZQogICAgZm9yIGEgbnVtYmVyIG9mIHBvcHVsYXIgT1MgZGlzdHJpYnV0aW9ucy4KICAgICkC2gdfZGlzdHJv2hJsaW51eF9kaXN0cmlidXRpb24pAdoWZnVsbF9kaXN0cmlidXRpb25fbmFtZakAcgUAAAD6HC91c3IvbGliL3B5dGhvbjMuNi9kaXN0cm8ucHlyAwAAAGEAAABzAgAAAAAZcgMAAABjAAAAAAAAAAAAAAAAAQAAAEMAAABzCAAAAHQAagGDAFMAKQFhJAsAAAogICAgUmV0dXJuIHRoZSBkaXN0cm8gSUQgb2YgdGhlIGN1cnJlbnQgZGlzdHJpYnV0aW9uLCBhcyBhCiAgICBtYWNoaW5lLXJlYWRhYmxlIHN0cmluZy4KCiAgICBGb3IgYSBudW1iZXIgb2YgT1MgZGlzdHJpYnV0aW9ucywgdGhlIHJldHVybmVkIGRpc3RybyBJRCB2YWx1ZSBpcwogICAgKnJlbGlhYmxlKiwgaW4gdGhlIHNlbnNlIHRoYXQgaXQgaXMgZG9jdW1lbnRlZCBhbmQgdGhhdCBpdCBkb2VzIG5vdCBjaGFuZ2UKICAgIGFjcm9zcyByZWxlYXNlcyBvZiB0aGUgZGlzdHJpYnV0aW9uLgoKICAgIFRoaXMgcGFja2FnZSBtYWludGFpbnMgdGhlIGZvbGxvd2luZyByZWxpYWJsZSBkaXN0cm8gSUQgdmFsdWVzOgoKICAgID09PT09PT09PT09PT09ICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgRGlzdHJvIElEICAgICAgIERpc3RyaWJ1dGlvbgogICAgPT09PT09PT09PT09PT0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAidWJ1bnR1IiAgICAgICAgVWJ1bnR1CiAgICAiZGViaWFuIiAgICAgICAgRGViaWFuCiAgICAicmhlbCIgICAgICAgICAgUmVkSGF0IEVudGVycHJpc2UgTGludXgKICAgICJjZW50b3MiICAgICAgICBDZW50T1MKICAgICJmZWRvcmEiICAgICAgICBGZWRvcmEKICAgICJzbGVzIiAgICAgICAgICBTVVNFIExpbnV4IEVudGVycHJpc2UgU2VydmVyCiAgICAib3BlbnN1c2UiICAgICAgb3BlblNVU0UKICAgICJhbWF6b24iICAgICAgICBBbWF6b24gTGludXgKICAgICJhcmNoIiAgICAgICAgICBBcmNoIExpbnV4CiAgICAiY2xvdWRsaW51eCIgICAgQ2xvdWRMaW51eCBPUwogICAgImV4aGVyYm8iICAgICAgIEV4aGVyYm8gTGludXgKICAgICJnZW50b28iICAgICAgICBHZW5Ub28gTGludXgKICAgICJpYm1fcG93ZXJrdm0iICBJQk0gUG93ZXJLVk0KICAgICJrdm1pYm0iICAgICAgICBLVk0gZm9yIElCTSB6IFN5c3RlbXMKICAgICJsaW51eG1pbnQiICAgICBMaW51eCBNaW50CiAgICAibWFnZWlhIiAgICAgICAgTWFnZWlhCiAgICAibWFuZHJpdmEiICAgICAgTWFuZHJpdmEgTGludXgKICAgICJwYXJhbGxlbHMiICAgICBQYXJhbGxlbHMKICAgICJwaWRvcmEiICAgICAgICBQaWRvcmEKICAgICJyYXNwYmlhbiIgICAgICBSYXNwYmlhbgogICAgIm9yYWNsZSIgICAgICAgIE9yYWNsZSBMaW51eCAoYW5kIE9yYWNsZSBFbnRlcnByaXNlIExpbnV4KQogICAgInNjaWVudGlmaWMiICAgIFNjaWVudGlmaWMgTGludXgKICAgICJzbGFja3dhcmUiICAgICBTbGFja3dhcmUKICAgICJ4ZW5zZXJ2ZXIiICAgICBYZW5TZXJ2ZXIKICAgICJvcGVuYnNkIiAgICAgICBPcGVuQlNECiAgICAibmV0YnNkIiAgICAgICAgTmV0QlNECiAgICAiZnJlZWJzZCIgICAgICAgRnJlZUJTRAogICAgPT09PT09PT09PT09PT0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgSWYgeW91IGhhdmUgYSBuZWVkIHRvIGdldCBkaXN0cm9zIGZvciByZWxpYWJsZSBJRHMgYWRkZWQgaW50byB0aGlzIHNldCwKICAgIG9yIGlmIHlvdSBmaW5kIHRoYXQgdGhlIDpmdW5jOmBkaXN0cm8uaWRgIGZ1bmN0aW9uIHJldHVybnMgYSBkaWZmZXJlbnQKICAgIGRpc3RybyBJRCBmb3Igb25lIG9mIHRoZSBsaXN0ZWQgZGlzdHJvcywgcGxlYXNlIGNyZWF0ZSBhbiBpc3N1ZSBpbiB0aGUKICAgIGBkaXN0cm8gaXNzdWUgdHJhY2tlcmBfLgoKICAgICoqTG9va3VwIGhpZXJhcmNoeSBhbmQgdHJhbnNmb3JtYXRpb25zOioqCgogICAgRmlyc3QsIHRoZSBJRCBpcyBvYnRhaW5lZCBmcm9tIHRoZSBmb2xsb3dpbmcgc291cmNlcywgaW4gdGhlIHNwZWNpZmllZAogICAgb3JkZXIuIFRoZSBmaXJzdCBhdmFpbGFibGUgYW5kIG5vbi1lbXB0eSB2YWx1ZSBpcyB1c2VkOgoKICAgICogdGhlIHZhbHVlIG9mIHRoZSAiSUQiIGF0dHJpYnV0ZSBvZiB0aGUgb3MtcmVsZWFzZSBmaWxlLAoKICAgICogdGhlIHZhbHVlIG9mIHRoZSAiRGlzdHJpYnV0b3IgSUQiIGF0dHJpYnV0ZSByZXR1cm5lZCBieSB0aGUgbHNiX3JlbGVhc2UKICAgICAgY29tbWFuZCwKCiAgICAqIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBmaWxlIG5hbWUgb2YgdGhlIGRpc3RybyByZWxlYXNlIGZpbGUsCgogICAgVGhlIHNvIGRldGVybWluZWQgSUQgdmFsdWUgdGhlbiBwYXNzZXMgdGhlIGZvbGxvd2luZyB0cmFuc2Zvcm1hdGlvbnMsCiAgICBiZWZvcmUgaXQgaXMgcmV0dXJuZWQgYnkgdGhpcyBtZXRob2Q6CgogICAgKiBpdCBpcyB0cmFuc2xhdGVkIHRvIGxvd2VyIGNhc2UsCgogICAgKiBibGFua3MgKHdoaWNoIHNob3VsZCBub3QgYmUgdGhlcmUgYW55d2F5KSBhcmUgdHJhbnNsYXRlZCB0byB1bmRlcnNjb3JlcywKCiAgICAqIGEgbm9ybWFsaXphdGlvbiBvZiB0aGUgSUQgaXMgcGVyZm9ybWVkLCBiYXNlZCB1cG9uCiAgICAgIGBub3JtYWxpemF0aW9uIHRhYmxlc2BfLiBUaGUgcHVycG9zZSBvZiB0aGlzIG5vcm1hbGl6YXRpb24gaXMgdG8gZW5zdXJlCiAgICAgIHRoYXQgdGhlIElEIGlzIGFzIHJlbGlhYmxlIGFzIHBvc3NpYmxlLCBldmVuIGFjcm9zcyBpbmNvbXBhdGlibGUgY2hhbmdlcwogICAgICBpbiB0aGUgT1MgZGlzdHJpYnV0aW9ucy4gQSBjb21tb24gcmVhc29uIGZvciBhbiBpbmNvbXBhdGlibGUgY2hhbmdl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b24tZW1wdHkgKGUuZy4gIjcuMCAoTWFpcG8pIikuCgogICAgU29tZSBkaXN0cmlidXRpb25zIHByb3ZpZGUgdmVyc2lvbiBudW1iZXJzIHdpdGggZGlmZmVyZW50IHByZWNpc2lvbnMgaW4KICAgIHRoZSBkaWZmZXJlbnQgc291cmNlcyBvZiBkaXN0cmlidXRpb24gaW5mb3JtYXRpb24uIEV4YW1pbmluZyB0aGUgZGlmZmVyZW50CiAgICBzb3VyY2VzIGluIGEgZml4ZWQgcHJpb3JpdHkgb3JkZXIgZG9lcyBub3QgYWx3YXlzIHlpZWxkIHRoZSBtb3N0IHByZWNpc2UKICAgIHZlcnNpb24gKGUuZy4gZm9yIERlYmlhbiA4LjIsIG9yIENlbnRPUyA3LjEpLgoKICAgIFRoZSAqYmVzdCogcGFyYW1ldGVyIGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgdGhlIGFwcHJvYWNoIGZvciB0aGUgcmV0dXJuZWQKICAgIHZlcnNpb246CgogICAgSWYgKmJlc3QqIGlzIGZhbHNlLCB0aGUgZmlyc3Qgbm9uLWVtcHR5IHZlcnNpb24gbnVtYmVyIGluIHByaW9yaXR5IG9yZGVyIG9mCiAgICB0aGUgZXhhbWluZWQgc291cmNlcyBpcyByZXR1cm5lZC4KCiAgICBJZiAqYmVzdCogaXMgdHJ1ZSwgdGhlIG1vc3QgcHJlY2lzZSB2ZXJzaW9uIG51bWJlciBvdXQgb2YgYWxsIGV4YW1pbmVkCiAgICBzb3VyY2VzIGlzIHJldHVybmVkLgoKICAgICoqTG9va3VwIGhpZXJhcmNoeToqKgoKICAgIEluIGFsbCBjYXNlcywgdGhlIHZlcnNpb24gbnVtYmVyIGlzIG9idGFpbmVkIGZyb20gdGhlIGZvbGxvd2luZyBzb3VyY2VzLgogICAgSWYgKmJlc3QqIGlzIGZhbHNlLCB0aGlzIG9yZGVyIHJlcHJlc2VudHMgdGhlIHByaW9yaXR5IG9yZGVyOgoKICAgICogdGhlIHZhbHVlIG9mIHRoZSAiVkVSU0lPTl9JRCIgYXR0cmlidXRlIG9mIHRoZSBvcy1yZWxlYXNlIGZpbGUsCiAgICAqIHRoZSB2YWx1ZSBvZiB0aGUgIlJlbGVhc2UiIGF0dHJpYnV0ZSByZXR1cm5lZCBieSB0aGUgbHNiX3JlbGVhc2UKICAgICAgY29tbWFuZCwKICAgICogdGhlIHZlcnNpb24gbnVtYmVyIHBhcnNlZCBmcm9tIHRoZSAiPHZlcnNpb25faWQ+IiBmaWVsZCBvZiB0aGUgZmlyc3QgbGluZQogICAgICBvZiB0aGUgZGlzdHJvIHJlbGVhc2UgZmlsZSwKICAgICogdGhlIHZlcnNpb24gbnVtYmVyIHBhcnNlZCBmcm9tIHRoZSAiUFJFVFRZX05BTUUiIGF0dHJpYnV0ZSBvZiB0aGUKICAgICAgb3MtcmVsZWFzZSBmaWxlLCBpZiBpdCBmb2xsb3dzIHRoZSBmb3JtYXQgb2YgdGhlIGRpc3RybyByZWxlYXNlIGZpbGVzLgogICAgKiB0aGUgdmVyc2lvbiBudW1iZXIgcGFyc2VkIGZyb20gdGhlICJEZXNjcmlwdGlvbiIgYXR0cmlidXRlIHJldHVybmVkIGJ5CiAgICAgIHRoZSBsc2JfcmVsZWFzZSBjb21tYW5kLCBpZiBpdCBmb2xsb3dzIHRoZSBmb3JtYXQgb2YgdGhlIGRpc3RybyByZWxlYXNlCiAgICAgIGZpbGVzLgogICAgKQJyAgAAANoHdmVyc2lvbikCcgkAAADaBGJlc3RyBQAAAHIFAAAAcgYAAAByCgAAAPIAAABzAgAAAAApcgoAAABjAQAAAAAAAAABAAAAAgAAAEMAAABzCgAAAHQAagF8AIMBUwApAWGgAQAACiAgICBSZXR1cm4gdGhlIHZlcnNpb24gb2YgdGhlIGN1cnJlbnQgT1MgZGlzdHJpYnV0aW9uIGFzIGEgdHVwbGUKICAgIGBgKG1ham9yLCBtaW5vciwgYnVpbGRfbnVtYmVyKWBgIHdpdGggaXRlbXMgYXMgZm9sbG93czoKCiAgICAqIGBgbWFqb3JgYDogIFRoZSByZXN1bHQgb2YgOmZ1bmM6YGRpc3Ryby5tYWpvcl92ZXJzaW9uYC4KCiAgICAqIGBgbWlub3JgYDogIFRoZSByZXN1bHQgb2YgOmZ1bmM6YGRpc3Ryby5taW5vcl92ZXJzaW9uYC4KCiAgICAqIGBgYnVpbGRfbnVtYmVyYGA6ICBUaGUgcmVzdWx0IG9mIDpmdW5jOmBkaXN0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IHRoZSBvcy1yZWxlYXNlIGZpbGUuCiAgICBGb3IgZGV0YWlscywgc2VlIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgIklEX0xJS0UiIGF0dHJpYnV0ZSBpbiB0aGUKICAgIGBvcy1yZWxlYXNlIG1hbiBwYWdlCiAgICA8aHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvc3lzdGVtZC9tYW4vb3MtcmVsZWFzZS5odG1sPmBfLgogICAgKQJyAgAAANoEbGlrZXIFAAAAcgUAAAByBQAAAHIGAAAAchAAAABWAQAAcwIAAAAADnIQAAAAYwAAAAAAAAAAAAAAAAEAAABDAAAAcwgAAAB0AGoBgwBTACkBYaYCAAAKICAgIFJldHVybiB0aGUgY29kZW5hbWUgZm9yIHRoZSByZWxlYXNlIG9mIHRoZSBjdXJyZW50IE9TIGRpc3RyaWJ1dGlvbiwKICAgIGFzIGEgc3RyaW5nLgoKICAgIElmIHRoZSBkaXN0cmlidXRpb24gZG9lcyBub3QgaGF2ZSBhIGNvZGVuYW1lLCBhbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQuCgogICAgTm90ZSB0aGF0IHRoZSByZXR1cm5lZCBjb2RlbmFtZSBpcyBub3QgYWx3YXlzIHJlYWxseSBhIGNvZGVuYW1lLiBGb3IKICAgIGV4YW1wbGUsIG9wZW5TVVNFIHJldHVybnMgIng4Nl82NCIuIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgaGFuZGxlIHN1Y2gKICAgIGNhc2VzIGluIGFueSBzcGVjaWFsIHdheSBhbmQganVzdCByZXR1cm5zIHRoZSBzdHJpbmcgaXQgZmluZHMsIGlmIGFueS4KCiAgICAqKkxvb2t1cCBoaWVyYXJjaHk6KioKCiAgICAqIHRoZSBjb2RlbmFtZSB3aXRoaW4gdGhlICJWRVJTSU9OIiBhdHRyaWJ1dGUgb2YgdGhlIG9zLXJlbGVhc2UgZmlsZSwgaWYKICAgICAgcHJvdmlkZWQsCgogICAgKiB0aGUgdmFsdWUgb2YgdGhlICJDb2RlbmFtZSIgYXR0cmlidXRlIHJldHVybmVkIGJ5IHRoZSBsc2JfcmVsZWFzZQogICAgICBjb21tYW5kLAoKICAgICogdGhlIHZhbHVlIG9mIHRoZSAiPGNvZGVuYW1lPiIgZmllbGQgb2YgdGhlIGRpc3RybyByZWxlYXNlIGZpbGUuCiAgICApAnICAAAA2ghjb2RlbmFtZXIFAAAAcgUAAAByBQAAAHIGAAAAchEAAABnAQAAcwIAAAAAFXIRAAAAYwIAAAAAAAAAAgAAAAMAAABDAAAAcwwAAAB0AGoBfAB8AYMCUwApAWHUBAAACiAgICBSZXR1cm4gY2VydGFpbiBtYWNoaW5lLXJlYWRhYmxlIGluZm9ybWF0aW9uIGl0ZW1zIGFib3V0IHRoZSBjdXJyZW50IE9TCiAgICBkaXN0cmlidXRpb24gaW4gYSBkaWN0aW9uYXJ5LCBhcyBzaG93biBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGU6CgogICAgLi4gc291cmNlY29kZTo6IHB5dGhvbgoKICAgICAgICB7CiAgICAgICAgICAgICdpZCc6ICdyaGVsJywKICAgICAgICAgICAgJ3ZlcnNpb24nOiAnNy4wJywKICAgICAgICAgICAgJ3ZlcnNpb25fcGFydHMnOiB7CiAgICAgICAgICAgICAgICAnbWFqb3InOiAnNycsCiAgICAgICAgICAgICAgICAnbWlub3InOiAnMCcsCiAgICAgICAgICAgICAgICAnYnVpbGRfbnVtYmVyJzogJycKICAgICAgICAgICAgfSwKICAgICAgICAgICAgJ2xpa2UnOiAnZmVkb3JhJywKICAgICAgICAgICAgJ2NvZGVuYW1lJzogJ01haXBvJwogICAgICAgIH0KCiAgICBUaGUgZGljdGlvbmFyeSBzdHJ1Y3R1cmUgYW5kIGtleXMgYXJlIGFsd2F5cyB0aGUgc2FtZSwgcmVnYXJkbGVzcyBvZiB3aGljaAogICAgaW5mb3JtYXRpb24gaXRlbXMgYXJlIGF2YWlsYWJsZSBpbiB0aGUgdW5kZXJseWluZyBkYXRhIHNvdXJjZXMuIFRoZSB2YWx1ZXMKICAgIGZvciB0aGUgdmFyaW91cyBrZXlzIGFyZSBhcyBmb2xsb3dzOgoKICAgICogYGBpZGBgOiAgVGhlIHJlc3VsdCBvZiA6ZnVuYzpgZGlzdHJvLmlkYC4KCiAgICAqIGBgdmVyc2lvbmBgOiAgVGhlIHJlc3VsdCBvZiA6ZnVuYzpgZGlzdHJvLnZlcnNpb25gLgoKICAgICogYGB2ZXJzaW9uX3BhcnRzIC0+IG1ham9yYGA6ICBUaGUgcmVzdWx0IG9mIDpmdW5jOmBkaXN0cm8ubWFqb3JfdmVyc2lvbmAuCgogICAgKiBgYHZlcnNpb25fcGFydHMgLT4gbWlub3JgYDogIFRoZSByZXN1bHQgb2YgOmZ1bmM6YGRpc3Ryby5taW5vcl92ZXJzaW9uYC4KCiAgICAqIGBgdmVyc2lvbl9wYXJ0cyAtPiBidWlsZF9udW1iZXJgYDogIFRoZSByZXN1bHQgb2YKICAgICAgOmZ1bmM6YGRpc3Ryby5idWlsZF9udW1iZXJgLgoKICAgICogYGBsaWtlYGA6ICBUaGUgcmVzdWx0IG9mIDpmdW5jOmBkaXN0cm8ubGlrZWAuCgogICAgKiBgYGNvZGVuYW1lYGA6ICBUaGUgcmVzdWx0IG9mIDpmdW5jOmBkaXN0cm8uY29kZW5hbWVgLgoKICAgIEZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSAqcHJldHR5KiBhbmQgKmJlc3QqIHBhcmFtZXRlcnMsIHNlZSB0aGUKICAgIDpmdW5jOmBkaXN0cm8udmVyc2lvbmAgbWV0aG9kLgogICAgKQJyAgAAANoEaW5mbykCcgkAAAByCwAAAHIFAAAAcgUAAAByBgAAAHISAAAAfwEAAHMCAAAAAClyEgAAAGMAAAAAAAAAAAAAAAABAAAAQwAAAHMIAAAAdABqAYMAUwApAXriCiAgICBSZXR1cm4gYSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcga2V5LXZhbHVlIHBhaXJzIGZvciB0aGUgaW5mb3JtYXRpb24gaXRlbXMKICAgIGZyb20gdGhlIG9zLXJlbGVhc2UgZmlsZSBkYXRhIHNvdXJjZSBvZiB0aGUgY3VycmVudCBPUyBkaXN0cmlidXRpb24uCgogICAgU2VlIGBvcy1yZWxlYXNlIGZpbGVgXyBmb3IgZGV0YWlscyBhYm91dCB0aGVzZSBpbmZvcm1hdGlvbiBpdGVtcy4KICAgICkCcgIAAADaD29zX3JlbGVhc2VfaW5mb3IFAAAAcgUAAAByBQAAAHIGAAAAchMAAACrAQAAcwIAAAAAB3ITAAAAYwAAAAAAAAAAAAAAAAEAAABDAAAAcwgAAAB0AGoBgwBTACkBevUKICAgIFJldHVybiBhIGRpY3Rpb25hcnkgY29udGFpbmluZyBrZXktdmFsdWUgcGFpcnMgZm9yIHRoZSBpbmZvcm1hdGlvbiBpdGVtcwogICAgZnJvbSB0aGUgbHNiX3JlbGVhc2UgY29tbWFuZCBkYXRhIHNvdXJjZSBvZiB0aGUgY3VycmVudCBPUyBkaXN0cmlidXRpb24uCgogICAgU2VlIGBsc2JfcmVsZWFzZSBjb21tYW5kIG91dHB1dGBfIGZvciBkZXRhaWxzIGFib3V0IHRoZXNlIGluZm9ybWF0aW9uCiAgICBpdGVtcy4KICAgICkCcgIAAADaEGxzYl9yZWxlYXNlX2luZm9yBQAAAHIFAAAAcgUAAAByBgAAAHIUAAAAtQEAAHMCAAAAAAhyFAAAAGMAAAAAAAAAAAAAAAABAAAAQwAAAHMIAAAAdABqAYMAUwApAXrqCiAgICBSZXR1cm4gYSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcga2V5LXZhbHVlIHBhaXJzIGZvciB0aGUgaW5mb3JtYXRpb24gaXRlbXMKICAgIGZyb20gdGhlIGRpc3RybyByZWxlYXNlIGZpbGUgZGF0YSBzb3VyY2Ugb2YgdGhlIGN1cnJlbnQgT1MgZGlzdHJpYnV0aW9uLgoKICAgIFNlZSBgZGlzdHJvIHJlbGVhc2UgZmlsZWBfIGZvciBkZXRhaWxzIGFib3V0IHRoZXNlIGluZm9ybWF0aW9uIGl0ZW1zLgogICAgKQJyAgAAANoTZGlzdHJvX3JlbGVhc2VfaW5mb3IFAAAAcgUAAAByBQAAAHIGAAAAchUAAADAAQAAcwIAAAAAB3IVAAAAYwAAAAAAAAAAAAAAAAEAAABDAAAAcwgAAAB0AGoBgwBTACkBep8KICAgIFJldHVybiBhIGRpY3Rpb25hcnkgY29udGFpbmluZyBrZXktdmFsdWUgcGFpcnMgZm9yIHRoZSBpbmZvcm1hdGlvbiBpdGVtcwogICAgZnJvbSB0aGUgZGlzdHJvIHJlbGVhc2UgZmlsZSBkYXRhIHNvdXJjZSBvZiB0aGUgY3VycmVudCBPUyBkaXN0cmlidXRpb24uCiAgICApAnICAAAA2gp1bmFtZV9p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AAByJwAAAHIFAAAAcgUAAAByBQAAAHIGAAAAchwAAAAdAgAAcwYAAAAIBAQBCARyHAAAAGMAAAAAAAAAAAAAAAAEAAAAQAAAAHMyAQAAZQBaAWQAWgJkAVoDZEJkBGQFhAFaBGQGZAeEAFoFZENkCGQJhAFaBmQKZAuEAFoHZERkDWQOhAFaCGRFZA9kEIQBWglkRmQRZBKEAVoKZEdkE2QUhAFaC2RIZBVkFoQBWgxkSWQXZBiEAVoNZBlkGoQAWg5kG2QchABaD2RKZB1kHoQBWhBkH2QghABaEWQhZCKEAFoSZCNkJIQAWhNkJWQmhABaFGQnZCiEAFoVZClkKoQAWhZkK2QshABaF2QtZC6EAFoYZRlkL2QwhACDAVoaZRtkMWQyhACDAVocZRlkM2Q0hACDAVodZRtkNWQ2hACDAVoeZRlkN2Q4hACDAVofZRtkOWQ6hACDAVogZRlkO2Q8hACDAVohZD1kPoQAWiJlG2Q/ZECEAIMBWiNkQVMAKUvaEUxpbnV4RGlzdHJpYnV0aW9uYQwDAAAKICAgIFByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IGEgT1MgZGlzdHJpYnV0aW9uLgoKICAgIFRoaXMgcGFja2FnZSBjcmVhdGVzIGEgcHJpdmF0ZSBtb2R1bGUtZ2xvYmFsIGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aAogICAgZGVmYXVsdCBpbml0aWFsaXphdGlvbiBhcmd1bWVudHMsIHRoYXQgaXMgdXNlZCBieSB0aGUKICAgIGBjb25zb2xpZGF0ZWQgYWNjZXNzb3IgZnVuY3Rpb25zYF8gYW5kIGBzaW5nbGUgc291cmNlIGFjY2Vzc29yIGZ1bmN0aW9uc2BfLgogICAgQnkgdXNpbmcgZGVmYXVsdCBpbml0aWFsaXphdGlvbiBhcmd1bWVudHMsIHRoYXQgbW9kdWxlLWdsb2JhbCBpbnN0YW5jZQogICAgcmV0dXJucyBkYXRhIGFib3V0IHRoZSBjdXJyZW50IE9TIGRpc3RyaWJ1dGlvbiAoaS5lLiB0aGUgZGlzdHJvIHRoaXMKICAgIHBhY2thZ2UgcnVucyBvbikuCgogICAgTm9ybWFsbHksIGl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gY3JlYXRlIGFkZGl0aW9uYWwgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MuCiAgICBIb3dldmVyLCBpbiBzaXR1YXRpb25zIHdoZXJlIGNvbnRyb2wgaXMgbmVlZGVkIG92ZXIgdGhlIGV4YWN0IGRhdGEgc291cmNlcwogICAgdGhhdCBhcmUgdXNlZCwgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgY2FuIGJlIGNyZWF0ZWQgd2l0aCBhIHNwZWNpZmljCiAgICBkaXN0cm8gcmVsZWFzZSBmaWxlLCBvciBhIHNwZWNpZmljIG9zLXJlbGVhc2UgZmlsZSwgb3Igd2l0aG91dCBpbnZva2luZyB0aGUKICAgIGxzYl9yZWxlYXNlIGNvbW1hbmQuCiAgICBU2gBjBQAAAAAAAAAFAAAAAwAAAEMAAABzLgAAAHwCcBB0AGoBagJ0A3QEgwJ8AF8FfANwGmQBfABfBnwBfABfB3wEfABfCGQCUwApA2FvCwAACiAgICAgICAgVGhlIGluaXRpYWxpemF0aW9uIG1ldGhvZCBvZiB0aGlzIGNsYXNzIGdhdGhlcnMgaW5mb3JtYXRpb24gZnJvbSB0aGUKICAgICAgICBhdmFpbGFibGUgZGF0YSBzb3VyY2VzLCBhbmQgc3RvcmVzIHRoYXQgaW4gcHJpdmF0ZSBpbnN0YW5jZSBhdHRyaWJ1dGVzLgogICAgICAgIFN1YnNlcXVlbnQgYWNjZXNzIHRvIHRoZSBpbmZvcm1hdGlvbiBpdGVtcyB1c2VzIHRoZXNlIHByaXZhdGUgaW5zdGFuY2UKICAgICAgICBhdHRyaWJ1dGVzLCBzbyB0aGF0IHRoZSBkYXRhIHNvdXJjZXMgYXJlIHJlYWQgb25seSBvbmNlLgoKICAgICAgICBQYXJhbWV0ZXJzOgoKICAgICAgICAqIGBgaW5jbHVkZV9sc2JgYCAoYm9vbCk6IENvbnRyb2xzIHdoZXRoZXIgdGhlCiAgICAgICAgICBgbHNiX3JlbGVhc2UgY29tbWFuZCBvdXRwdXRgXyBpcyBpbmNsdWRlZCBhcyBhIGRhdGEgc291cmNlLgoKICAgICAgICAgIElmIHRoZSBsc2JfcmVsZWFzZSBjb21tYW5kIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhlIHByb2dyYW0gZXhlY3V0aW9uCiAgICAgICAgICBwYXRoLCB0aGUgZGF0YSBzb3VyY2UgZm9yIHRoZSBsc2JfcmVsZWFzZSBjb21tYW5kIHdpbGwgYmUgZW1wdHkuCgogICAgICAgICogYGBvc19yZWxlYXNlX2ZpbGVgYCAoc3RyaW5nKTogVGhlIHBhdGggbmFtZSBvZiB0aGUKICAgICAgICAgIGBvcy1yZWxlYXNlIGZpbGVgXyB0aGF0IGlzIHRvIGJlIHVzZWQgYXMgYSBkYXRhIHNvdXJjZS4KCiAgICAgICAgICBBbiBlbXB0eSBzdHJpbmcgKHRoZSBkZWZhdWx0KSB3aWxsIGNhdXNlIHRoZSBkZWZhdWx0IHBhdGggbmFtZSB0bwogICAgICAgICAgYmUgdXNlZCAoc2VlIGBvcy1yZWxlYXNlIGZpbGVgXyBmb3IgZGV0YWlscykuCgogICAgICAgICAgSWYgdGhlIHNwZWNpZmllZCBvciBkZWZhdWx0ZWQgb3MtcmVsZWFzZSBmaWxlIGRvZXMgbm90IGV4aXN0LCB0aGUKICAgICAgICAgIGRhdGEgc291cmNlIGZvciB0aGUgb3MtcmVsZWFzZSBmaWxlIHdpbGwgYmUgZW1wdHkuCgogICAgICAgICogYGBkaXN0cm9fcmVsZWFzZV9maWxlYGAgKHN0cmluZyk6IFRoZSBwYXRoIG5hbWUgb2YgdGhlCiAgICAgICAgICBgZGlzdHJvIHJlbGVhc2UgZmlsZWBfIHRoYXQgaXMgdG8gYmUgdXNlZCBhcyBhIGRhdGEgc291cmNlLgoKICAgICAgICAgIEFuIGVtcHR5IHN0cmluZyAodGhlIGRlZmF1bHQpIHdpbGwgY2F1c2UgYSBkZWZhdWx0IHNlYXJjaCBhbGdvcml0aG0KICAgICAgICAgIHRvIGJlIHVzZWQgKHNlZSBgZGlzdHJvIHJlbGVhc2UgZmlsZWBfIGZvciBkZXRhaWxzKS4KCiAgICAgICAgICBJZiB0aGUgc3BlY2lmaWVkIGRpc3RybyByZWxlYXNlIGZpbGUgZG9lcyBub3QgZXhpc3QsIG9yIGlmIG5vIGRlZmF1bHQKICAgICAgICAgIGRpc3RybyByZWxlYXNlIGZpbGUgY2FuIGJlIGZvdW5kLCB0aGUgZGF0YSBzb3VyY2UgZm9yIHRoZSBkaXN0cm8KICAgICAgICAgIHJlbGVhc2UgZmlsZSB3aWxsIGJlIGVtcHR5LgoKICAgICAgICAqIGBgaW5jbHVkZV9uYW1lYGAgKGJvb2wpOiBDb250cm9scyB3aGV0aGVyIHVuYW1lIGNvbW1hbmQgb3V0cHV0IGlzCiAgICAgICAgICBpbmNsdWRlZCBhcyBhIGRhdGEgc291cmNlLiBJZiB0aGUgdW5hbWUgY29tbWFuZCBpcyBub3QgYXZhaWxhYmxlIGluCiAgICAgICAgICB0aGUgcHJvZ3JhbSBleGVjdXRpb24gcGF0aCB0aGUgZGF0YSBzb3VyY2UgZm9yIHRoZSB1bmFtZSBjb21tYW5kIHdpbGwKICAgICAgICAgIGJlIGVtcHR5LgoKICAgICAgICBQdWJsaWMgaW5zdGFuY2UgYXR0cmlidXRlczoKCiAgICAgICAgKiBgYG9zX3JlbGVhc2VfZmlsZWBgIChzdHJpbmcpOiBUaGUgcGF0aCBuYW1lIG9mIHRoZQogICAgICAgICAgYG9zLXJlbGVhc2UgZmlsZWBfIHRoYXQgaXMgYWN0dWFsbHkgdXNlZCBhcyBhIGRhdGEgc291cmNlLiBUaGUKICAgICAgICAgIGVtcHR5IHN0cmluZyBpZiBubyBkaXN0cm8gcmVsZWFzZSBmaWxlIGlzIHVzZWQgYXMgYSBkYXRhIHNvdXJjZS4KCiAgICAgICAgKiBgYGRpc3Ryb19yZWxlYXNlX2ZpbGVgYCAoc3RyaW5nKTogVGhlIHBhdGggbmFtZSBvZiB0aGUKICAgICAgICAgIGBkaXN0cm8gcmVsZWFzZSBmaWxlYF8gdGhhdCBpcyBhY3R1YWxseSB1c2VkIGFzIGEgZGF0YSBzb3VyY2UuIFRoZQogICAgICAgICAgZW1wdHkgc3RyaW5nIGlmIG5vIGRpc3RybyByZWxlYXNlIGZpbGUgaXMgdXNlZCBhcyBhIGRhdGEgc291cmNlLgoKICAgICAgICAqIGBgaW5jbHVkZV9sc2JgYCAoYm9vbCk6IFRoZSByZXN1bHQgb2YgdGhlIGBgaW5jbHVkZV9sc2JgYCBwYXJhbWV0ZXIuCiAgICAgICAgICBUaGlzIGNvbnRyb2xzIHdoZXRoZXIgdGhlIGxzYiBpbmZvcm1hdGlvbiB3aWxsIGJlIGxvYWRlZC4KCiAgICAgICAgKiBgYGluY2x1ZGVfdW5hbWVgYCAoYm9vbCk6IFRoZSByZXN1bHQgb2YgdGhlIGBgaW5jbHVkZV91bmFtZWBgCiAgICAgICAgICBwYXJhbWV0ZXIuIFRoaXMgY29udHJvbHMgd2hldGhlciB0aGUgdW5hbWUgaW5mb3JtYXRpb24gd2lsbAogICAgICAgICAgYmUgbG9hZGVkLgoKICAgICAgICBSYWlzZXM6CgogICAgICAgICogOnB5OmV4YzpgSU9FcnJvcmA6IFNvbWUgSS9PIGlzc3VlIHdpdGggYW4gb3MtcmVsZWFzZSBmaWxlIG9yIGRpc3RybwogICAgICAgICAgcmVsZWFzZSBmaWxlLgoKICAgICAgICAqIDpweTpleGM6YHN1YnByb2Nlc3MuQ2FsbGVkUHJvY2Vzc0Vycm9yYDogVGhlIGxzYl9yZWxlYXNlIGNvbW1hbmQgaGFkCiAgICAgICAgICBzb21lIGlzc3VlIChvdGhlciB0aGFuIG5vdCBiZWluZyBhdmFpbGFibGUgaW4gdGhlIHByb2dyYW0gZXhlY3V0aW9uCiAgICAgICAgICBwYXRoKS4KCiAgICAgICAgKiA6cHk6ZXhjOmBVbmljb2RlRXJyb3JgOiBBIGRhdGEgc291cmNlIGhhcyB1bmV4cGVjdGVkIGNoYXJhY3RlcnMgb3IKICAgICAgICAgIHVzZXMgYW4gdW5leHBlY3RlZCBlbmNvZGluZy4KICAgICAgICByLAAAAE4pCdoCb3PaBHBhdGjaBGpvaW7aDF9VTklYQ09ORkRJUtoUX09TX1JFTEVBU0VfQkFTRU5BTUXaD29zX3JlbGVhc2VfZmlsZdoTZGlzdHJvX3JlbGVhc2VfZmlsZdoLaW5jbHVkZV9sc2LaDWluY2x1ZGVfdW5hbWUpBXIgAAAAcjQAAAByMgAAAHIzAAAAcjUAAAByBQAAAHIFAAAAcgYAAAByIgAAAD4CAABzCgAAAABIBAEQAQoBBgF6GkxpbnV4RGlzdHJpYnV0aW9uLl9faW5pdF9fYwEAAAAAAAAAAQAAAAMAAABDAAAAcwwAAABkAWoAfABkAo0BUwApA3ogUmV0dXJuIHJlcHIgb2YgYWxsIGluZm8KICAgICAgICBhZQEAAExpbnV4RGlzdHJpYnV0aW9uKG9zX3JlbGVhc2VfZmlsZT17c2VsZi5vc19yZWxlYXNlX2ZpbGUhcn0sIGRpc3Ryb19yZWxlYXNlX2ZpbGU9e3NlbGYuZGlzdHJvX3JlbGVhc2VfZmlsZSFyfSwgaW5jbHVkZV9sc2I9e3NlbGYuaW5jbHVkZV9sc2Ihcn0sIGluY2x1ZGVfdW5hbWU9e3NlbGYuaW5jbHVkZV91bmFtZSFyfSwgX29zX3JlbGVhc2VfaW5mbz17c2VsZi5fb3NfcmVsZWFzZV9pbmZvIXJ9LCBfbHNiX3JlbGVhc2VfaW5mbz17c2VsZi5fbHNiX3JlbGVhc2VfaW5mbyFyfSwgX2Rpc3Ryb19yZWxlYXNlX2luZm89e3NlbGYuX2Rpc3Ryb19yZWxlYXNlX2luZm8hcn0sIF91bmFtZV9pbmZvPXtzZWxmLl91bmFtZV9pbmZvIXJ9KSkBciAAAAApAdoGZm9ybWF0KQFyIAAAAHIFAAAAcgUAAAByBgAAANoIX19yZXByX1+MAgAAcwQAAAAABAQJehpMaW51eERpc3RyaWJ1dGlvbi5fX3JlcHJfX2MCAAAAAAAAAAIAAAADAAAAQwAAAHMiAAAAfAFyDHwAagCDAG4GfABqAYMAfABqAoMAfABqA4MAZgNTACkBevgKICAgICAgICBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIE9TIGRpc3RyaWJ1dGlvbiB0aGF0IGlzIGNvbXBhdGlibGUKICAgICAgICB3aXRoIFB5dGhvbidzIDpmdW5jOmBwbGF0Zm9ybS5saW51eF9kaXN0cmlidXRpb25gLCBzdXBwb3J0aW5nIGEgc3Vic2V0CiAgICAgICAgb2YgaXRzIHBhcmFtZXRlcnMuCgogICAgICAgIEZvciBkZXRhaWxzLCBzZWUgOmZ1bmM6YGRpc3Ryby5saW51eF9kaXN0cmlidXRpb25gLgogICAgICAgICkEcggAAAByBwAAAHIKAAAAchEAAAApAnIgAAAAcgQAAAByBQAAAHIFAAAAcgYAAAByAwAAAJsCAABzBgAAAAAJEgEGAXokTGludXhEaXN0cmlidXRpb24ubGludXhfZGlzdHJpYnV0aW9uYwEAAAAAAAAAAwAAAAMAAABDAAAAc2wAAABkAWQChAB9AXwA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
Base64 mode: content will be decoded on save.
Save
Close
Exit & Reset
Directory Contents
Dirs: 0 × Files: 16
Delete Selected
Select All
Select None
Sort:
Name
Size
Modified
Enable drag-to-move
Name
Size
Perms
Modified
Actions
decorator.cpython-36.opt-1.pyc
12.05 KB
lrw-r--r--
2019-11-13 17:52:25
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
decorator.cpython-36.pyc
12.14 KB
lrw-r--r--
2019-11-13 17:52:25
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
distro.cpython-36.opt-1.pyc
35.37 KB
lrw-r--r--
2023-12-18 11:16:13
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
distro.cpython-36.pyc
35.44 KB
lrw-r--r--
2023-12-18 11:16:13
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
easy_install.cpython-36.opt-1.pyc
259 B
lrw-r--r--
2025-07-15 09:13:41
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
easy_install.cpython-36.pyc
259 B
lrw-r--r--
2025-07-15 09:13:41
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
hwdata.cpython-36.opt-1.pyc
5.01 KB
lrw-r--r--
2019-11-19 06:36:19
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
hwdata.cpython-36.pyc
5.01 KB
lrw-r--r--
2019-11-19 06:36:19
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
pyparsing.cpython-36.opt-1.pyc
196.32 KB
lrw-r--r--
2019-11-13 10:36:46
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
pyparsing.cpython-36.pyc
196.32 KB
lrw-r--r--
2019-11-13 10:36:46
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
six.cpython-36.opt-1.pyc
24.43 KB
lrw-r--r--
2019-11-13 14:45:19
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
six.cpython-36.pyc
24.43 KB
lrw-r--r--
2019-11-13 14:45:19
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
socks.cpython-36.opt-1.pyc
22.60 KB
lrw-r--r--
2019-11-13 14:55:03
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
socks.cpython-36.pyc
22.60 KB
lrw-r--r--
2019-11-13 14:55:03
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
sockshandler.cpython-36.opt-1.pyc
3.59 KB
lrw-r--r--
2019-11-13 14:55:03
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
sockshandler.cpython-36.pyc
3.59 KB
lrw-r--r--
2019-11-13 14:55:03
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).