REDROOM
PHP 8.0.30
Path:
Logout
Edit File
Size: 34.15 KB
Close
//opt/alt/python37/lib/python3.7/site-packages/alembic/runtime/__pycache__/environment.cpython-37.pyc
Text
Base64
Qg0NCgAAAACMTSFWIYwAAOMAAAAAAAAAAAAAAAAEAAAAQAAAAHM6AAAAZABkAWwAbQFaAQEAZAJkA2wCbQNaAwEAZABkBGwEbQVaBQEARwBkBWQGhABkBmUFagaDA1oHZAdTACkI6QIAAAApAdoKT3BlcmF0aW9uc+kBAAAAKQHaEE1pZ3JhdGlvbkNvbnRleHQpAdoEdXRpbGMAAAAAAAAAAAAAAAAYAAAAQAAAAHPCAAAAZQBaAWQAWgJkAVoDZAJaBGQCWgVkAloGZANkBIQAWgdkBWQGhABaCGQHZAiEAFoJZAlkCoQAWgpkC2QMhABaC2QNZA6EAFoMZA9kEIQAWg1kEWQShABaDmQTZBSEAFoPZBVkFoQAWhBkF2QYhABaEWQwZBpkG4QBWhJkMWQgZCGEAVoTZCJkI4QAWhRkMmQkZCWEAVoVZCZkJ4QAWhZkKGQphABaF2QqZCuEAFoYZCxkLYQAWhlkLmQvhABaGmQCUwApM9oSRW52aXJvbm1lbnRDb250ZXh0YXUJAABBIGNvbmZpZ3VyYXRpb25hbCBmYWNhZGUgbWFkZSBhdmFpbGFibGUgaW4gYW4gYGBlbnYucHlgYCBzY3JpcHQuCgogICAgVGhlIDpjbGFzczpgLkVudmlyb25tZW50Q29udGV4dGAgYWN0cyBhcyBhICpmYWNhZGUqIHRvIHRoZSBtb3JlCiAgICBudXRzLWFuZC1ib2x0cyBvYmplY3RzIG9mIDpjbGFzczpgLk1pZ3JhdGlvbkNvbnRleHRgIGFzIHdlbGwgYXMgY2VydGFpbgogICAgYXNwZWN0cyBvZiA6Y2xhc3M6YC5Db25maWdgLAogICAgd2l0aGluIHRoZSBjb250ZXh0IG9mIHRoZSBgYGVudi5weWBgIHNjcmlwdCB0aGF0IGlzIGludm9rZWQgYnkKICAgIG1vc3QgQWxlbWJpYyBjb21tYW5kcy4KCiAgICA6Y2xhc3M6YC5FbnZpcm9ubWVudENvbnRleHRgIGlzIG5vcm1hbGx5IGluc3RhbnRpYXRlZAogICAgd2hlbiBhIGNvbW1hbmQgaW4gOm1vZDpgYWxlbWJpYy5jb21tYW5kYCBpcyBydW4uICBJdCB0aGVuIG1ha2VzCiAgICBpdHNlbGYgYXZhaWxhYmxlIGluIHRoZSBgYGFsZW1iaWMuY29udGV4dGBgIG1vZHVsZSBmb3IgdGhlIHNjb3BlCiAgICBvZiB0aGUgY29tbWFuZC4gICBGcm9tIHdpdGhpbiBhbiBgYGVudi5weWBgIHNjcmlwdCwgdGhlIGN1cnJlbnQKICAgIDpjbGFzczpgLkVudmlyb25tZW50Q29udGV4dGAgaXMgYXZhaWxhYmxlIGJ5IGltcG9ydGluZyB0aGlzIG1vZHVsZS4KCiAgICA6Y2xhc3M6YC5FbnZpcm9ubWVudENvbnRleHRgIGFsc28gc3VwcG9ydHMgcHJvZ3JhbW1hdGljIHVzYWdlLgogICAgQXQgdGhpcyBsZXZlbCwgaXQgYWN0cyBhcyBhIFB5dGhvbiBjb250ZXh0IG1hbmFnZXIsIHRoYXQgaXMsIGlzCiAgICBpbnRlbmRlZCB0byBiZSB1c2VkIHVzaW5nIHRoZQogICAgYGB3aXRoOmBgIHN0YXRlbWVudC4gIEEgdHlwaWNhbCB1c2Ugb2YgOmNsYXNzOmAuRW52aXJvbm1lbnRDb250ZXh0YDo6CgogICAgICAgIGZyb20gYWxlbWJpYy5jb25maWcgaW1wb3J0IENvbmZpZwogICAgICAgIGZyb20gYWxlbWJpYy5zY3JpcHQgaW1wb3J0IFNjcmlwdERpcmVjdG9yeQoKICAgICAgICBjb25maWcgPSBDb25maWcoKQogICAgICAgIGNvbmZpZy5zZXRfbWFpbl9vcHRpb24oInNjcmlwdF9sb2NhdGlvbiIsICJteWFwcDptaWdyYXRpb25zIikKICAgICAgICBzY3JpcHQgPSBTY3JpcHREaXJlY3RvcnkuZnJvbV9jb25maWcoY29uZmlnKQoKICAgICAgICBkZWYgbXlfZnVuY3Rpb24ocmV2LCBjb250ZXh0KToKICAgICAgICAgICAgJycnZG8gc29tZXRoaW5nIHdpdGggcmV2aXNpb24gInJldiIsIHdoaWNoCiAgICAgICAgICAgIHdpbGwgYmUgdGhlIGN1cnJlbnQgZGF0YWJhc2UgcmV2aXNpb24sCiAgICAgICAgICAgIGFuZCAiY29udGV4dCIsIHdoaWNoIGlzIHRoZSBNaWdyYXRpb25Db250ZXh0CiAgICAgICAgICAgIHRoYXQgdGhlIGVudi5weSB3aWxsIGNyZWF0ZScnJwoKICAgICAgICB3aXRoIEVudmlyb25tZW50Q29udGV4dCgKICAgICAgICAgICAgY29uZmlnLAogICAgICAgICAgICBzY3JpcHQsCiAgICAgICAgICAgIGZuID0gbXlfZnVuY3Rpb24sCiAgICAgICAgICAgIGFzX3NxbCA9IEZhbHNlLAogICAgICAgICAgICBzdGFydGluZ19yZXYgPSAnYmFzZScsCiAgICAgICAgICAgIGRlc3RpbmF0aW9uX3JldiA9ICdoZWFkJywKICAgICAgICAgICAgdGFnID0gInNvbWV0YWciCiAgICAgICAgKToKICAgICAgICAgICAgc2NyaXB0LnJ1bl9lbnYoKQoKICAgIFRoZSBhYm92ZSBzY3JpcHQgd2lsbCBpbnZva2UgdGhlIGBgZW52LnB5YGAgc2NyaXB0CiAgICB3aXRoaW4gdGhlIG1pZ3JhdGlvbiBlbnZpcm9ubWVudC4gIElmIGFuZCB3aGVuIGBgZW52LnB5YGAKICAgIGNhbGxzIDptZXRoOmAuTWlncmF0aW9uQ29udGV4dC5ydW5fbWlncmF0aW9uc2AsIHRoZQogICAgYGBteV9mdW5jdGlvbigpYGAgZnVuY3Rpb24gYWJvdmUgd2lsbCBiZSBjYWxsZWQKICAgIGJ5IHRoZSA6Y2xhc3M6YC5NaWdyYXRpb25Db250ZXh0YCwgZ2l2ZW4gdGhlIGNvbnRleHQKICAgIGl0c2VsZiBhcyB3ZWxsIGFzIHRoZSBjdXJyZW50IHJldmlzaW9uIGluIHRoZSBkYXRhYmFzZS4KCiAgICAuLiBub3RlOjoKCiAgICAgICAgRm9yIG1vc3QgQVBJIHVzYWdlcyBvdGhlciB0aGFuIGZ1bGwgYmxvd24KICAgICAgICBpbnZvY2F0aW9uIG9mIG1pZ3JhdGlvbiBzY3JpcHRzLCB0aGUgOmNsYXNzOmAuTWlncmF0aW9uQ29udGV4dGAKICAgICAgICBhbmQgOmNsYXNzOmAuU2NyaXB0RGlyZWN0b3J5YCBvYmplY3RzIGNhbiBiZSBjcmVhdGVkIGFuZAogICAgICAgIHVzZWQgZGlyZWN0bHkuICBUaGUgOmNsYXNzOmAuRW52aXJvbm1lbnRDb250ZXh0YCBvYmplY3QKICAgICAgICBpcyAqb25seSogbmVlZGVkIHdoZW4geW91IG5lZWQgdG8gYWN0dWFsbHkgaW52b2tlIHRoZQogICAgICAgIGBgZW52LnB5YGAgbW9kdWxlIHByZXNlbnQgaW4gdGhlIG1pZ3JhdGlvbiBlbnZpcm9ubWVudC4KCiAgICBOYwMAAAAAAAAABAAAAAIAAABLAAAAcxYAAAB8AXwAXwB8AnwAXwF8A3wAXwJkAVMAKQJhXgEAAENvbnN0cnVjdCBhIG5ldyA6Y2xhc3M6YC5FbnZpcm9ubWVudENvbnRleHRgLgoKICAgICAgICA6cGFyYW0gY29uZmlnOiBhIDpjbGFzczpgLkNvbmZpZ2AgaW5zdGFuY2UuCiAgICAgICAgOnBhcmFtIHNjcmlwdDogYSA6Y2xhc3M6YC5TY3JpcHREaXJlY3RvcnlgIGluc3RhbmNlLgogICAgICAgIDpwYXJhbSBcKiprdzoga2V5d29yZCBvcHRpb25zIHRoYXQgd2lsbCBiZSB1bHRpbWF0ZWx5CiAgICAgICAgIHBhc3NlZCBhbG9uZyB0byB0aGUgOmNsYXNzOmAuTWlncmF0aW9uQ29udGV4dGAgd2hlbgogICAgICAgICA6bWV0aDpgLkVudmlyb25tZW50Q29udGV4dC5jb25maWd1cmVgIGlzIGNhbGxlZC4KCiAgICAgICAgTikD2gZjb25maWfaBnNjcmlwdNoMY29udGV4dF9vcHRzKQTaBHNlbGZyBwAAAHIIAAAA2gJrd6kAcgwAAAD6TC9vcHQvYWx0L3B5dGhvbjM3L2xpYi9weXRob24zLjcvc2l0ZS1wYWNrYWdlcy9hbGVtYmljL3J1bnRpbWUvZW52aXJvbm1lbnQucHnaCF9faW5pdF9fUwAAAHMGAAAAAAoGAQYBehtFbnZpcm9ubWVudENvbnRleHQuX19pbml0X19jAQAAAAAAAAABAAAAAgAAAEMAAABzDAAAAHwAoAChAAEAfABTACkBeuJFc3RhYmxpc2ggYSBjb250ZXh0IHdoaWNoIHByb3ZpZGVzIGEKICAgICAgICA6Y2xhc3M6YC5FbnZpcm9ubWVudENvbnRleHRgIG9iamVjdCB0bwogICAgICAgIGVudi5weSBzY3JpcHRzLgoKICAgICAgICBUaGUgOmNsYXNzOmAuRW52aXJvbm1lbnRDb250ZXh0YCB3aWxsCiAgICAgICAgYmUgbWFkZSBhdmFpbGFibGUgYXMgYGBmcm9tIGFsZW1iaWMgaW1wb3J0IGNvbnRleHRgYC4KCiAgICAgICAgKQFaDl9pbnN0YWxsX3Byb3h5KQFyCgAAAHIMAAAAcgwAAAByDQAAANoJX19lbnRlcl9fYQAAAHMEAAAAAAkIAXocRW52aXJvbm1lbnRDb250ZXh0Ll9fZW50ZXJfX2MBAAAAAAAAAAMAAAACAAAATwAAAHMMAAAAfACgAKEAAQBkAFMAKQFOKQFaDV9yZW1vdmVfcHJveHkpA3IKAAAA2gNhcmdyCwAAAHIMAAAAcgwAAAByDQAAANoIX19leGl0X19tAAAAcwIAAAAAAXobRW52aXJvbm1lbnRDb250ZXh0Ll9fZXhpdF9fYwEAAAAAAAAAAQAAAAQAAABDAAAAcw4AAAB8AGoAoAFkAWQCoQJTACkDYSUBAABSZXR1cm4gVHJ1ZSBpZiB0aGUgY3VycmVudCBtaWdyYXRpb25zIGVudmlyb25tZW50CiAgICAgICAgaXMgcnVubmluZyBpbiAib2ZmbGluZSBtb2RlIi4KCiAgICAgICAgVGhpcyBpcyBgYFRydWVgYCBvciBgYEZhbHNlYGAgZGVwZW5kaW5nCiAgICAgICAgb24gdGhlIHRoZSBgYC0tc3FsYGAgZmxhZyBwYXNzZWQuCgogICAgICAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmVxdWlyZSB0aGF0IHRoZSA6Y2xhc3M6YC5NaWdyYXRpb25Db250ZXh0YAogICAgICAgIGhhcyBiZWVuIGNvbmZpZ3VyZWQuCgogICAgICAgIFoGYXNfc3FsRikCcgkAAADaA2dldCkBcgoAAAByDAAAAHIMAAAAcg0AAADaD2lzX29mZmxpbmVfbW9kZXAAAABzAgAAAAALeiJFbnZpcm9ubWVudENvbnRleHQuaXNfb2ZmbGluZV9tb2RlYwEAAAAAAAAAAQAAAAIAAABDAAAAcwwAAAB8AKAAoQBqAWoCUwApAWGCAQAAUmV0dXJuIFRydWUgaWYgdGhlIGNvbnRleHQgaXMgY29uZmlndXJlZCB0byBleHBlY3QgYQogICAgICAgIHRyYW5zYWN0aW9uYWwgRERMIGNhcGFibGUgYmFja2VuZC4KCiAgICAgICAgVGhpcyBkZWZhdWx0cyB0byB0aGUgdHlwZSBvZiBkYXRhYmFzZSBpbiB1c2UsIGFuZAogICAgICAgIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHRoZSBgYHRyYW5zYWN0aW9uYWxfZGRsYGAgYXJndW1lbnQKICAgICAgICB0byA6bWV0aDpgLmNvbmZpZ3VyZWAKCiAgICAgICAgVGhpcyBmdW5jdGlvbiByZXF1aXJlcyB0aGF0IGEgOmNsYXNzOmAuTWlncmF0aW9uQ29udGV4dGAKICAgICAgICBoYXMgZmlyc3QgYmVlbiBtYWRlIGF2YWlsYWJsZSB2aWEgOm1ldGg6YC5jb25maWd1cmVgLgoKICAgICAgICApA9oLZ2V0X2NvbnRleHTaBGltcGzaEXRyYW5zYWN0aW9uYWxfZGRsKQFyCgAAAHIMAAAAcgwAAAByDQAAANoUaXNfdHJhbnNhY3Rpb25hbF9kZGx9AAAAcwIAAAAADHonRW52aXJvbm1lbnRDb250ZXh0LmlzX3RyYW5zYWN0aW9uYWxfZGRsYwEAAAAAAAAAAQAAAAIAAABDAAAAcwoAAAB8AKAAoQAMAFMAKQFOKQFyEwAAACkBcgoAAAByDAAAAHIMAAAAcg0AAADaE3JlcXVpcmVzX2Nvbm5lY3Rpb26LAAAAcwIAAAAAAXomRW52aXJvbm1lbnRDb250ZXh0LnJlcXVpcmVzX2Nvbm5lY3Rpb25jAQAAAAAAAAABAAAAAwAAAEMAAABzDAAAAHwAagCgAWQBoQFTACkCYaYBAABSZXR1cm4gdGhlIGhleCBpZGVudGlmaWVyIG9mIHRoZSAnaGVhZCcgc2NyaXB0IHJldmlzaW9uLgoKICAgICAgICBJZiB0aGUgc2NyaXB0IGRpcmVjdG9yeSBoYXMgbXVsdGlwbGUgaGVhZHMsIHRoaXMKICAgICAgICBtZXRob2QgcmFpc2VzIGEgOmNsYXNzOmAuQ29tbWFuZEVycm9yYDsKICAgICAgICA6bWV0aDpgLkVudmlyb25tZW50Q29udGV4dC5nZXRfaGVhZF9yZXZpc2lvbnNgIHNob3VsZCBiZSBwcmVmZXJyZWQuCgogICAgICAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmVxdWlyZSB0aGF0IHRoZSA6Y2xhc3M6YC5NaWdyYXRpb25Db250ZXh0YAogICAgICAgIGhhcyBiZWVuIGNvbmZpZ3VyZWQuCgogICAgICAgIC4uIHNlZWFsc286OiA6bWV0aDpgLkVudmlyb25tZW50Q29udGV4dC5nZXRfaGVhZF9yZXZpc2lvbnNgCgogICAgICAgINoEaGVhZCkCcggAAADaEmFzX3JldmlzaW9uX251bWJlcikBcgoAAAByDAAAAHIMAAAAcg0AAADaEWdldF9oZWFkX3JldmlzaW9ujgAAAHMCAAAAAA16JEVudmlyb25tZW50Q29udGV4dC5nZXRfaGVhZF9yZXZpc2lvbmMBAAAAAAAAAAEAAAADAAAAQwAAAHMMAAAAfABqAKABZAGhAVMAKQJhOgEAAFJldHVybiB0aGUgaGV4IGlkZW50aWZpZXIgb2YgdGhlICdoZWFkcycgc2NyaXB0IHJldmlzaW9uKHMpLgoKICAgICAgICBUaGlzIHJldHVybnMgYSB0dXBsZSBjb250YWluaW5nIHRoZSB2ZXJzaW9uIG51bWJlciBvZiBhbGwKICAgICAgICBoZWFkcyBpbiB0aGUgc2NyaXB0IGRpcmVjdG9yeS4KCiAgICAgICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXF1aXJlIHRoYXQgdGhlIDpjbGFzczpgLk1pZ3JhdGlvbkNvbnRleHRgCiAgICAgICAgaGFzIGJlZW4gY29uZmlndXJlZC4KCiAgICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMC43LjAKCiAgICAgICAgWgVoZWFkcykCcggAAAByGgAAACkBcgoAAAByDAAAAHIMAAAAcg0AAADaEmdldF9oZWFkX3JldmlzaW9uc50AAABzAgAAAAAMeiVFbnZpcm9ubWVudENvbnRleHQuZ2V0X2hlYWRfcmV2aXNpb25zYwEAAAAAAAAAAQAAAAQAAABDAAAAc0YAAAB8AGoAZAFrCXIcfABqAaACfACgA6EAagShAVMAZAJ8AGoFawZyOHwAagGgAnwAagVkAhkAoQFTAHQGoAdkA6EBggFkAVMAKQRhVAEAAFJldHVybiB0aGUgJ3N0YXJ0aW5nIHJldmlzaW9uJyBhcmd1bWVudCwKICAgICAgICBpZiB0aGUgcmV2aXNpb24gd2FzIHBhc3NlZCB1c2luZyBgYHN0YXJ0OmVuZGBgLgoKICAgICAgICBUaGlzIGlzIG9ubHkgbWVhbmluZ2Z1bCBpbiAib2ZmbGluZSIgbW9kZS4KICAgICAgICBSZXR1cm5zIGBgTm9uZWBgIGlmIG5vIHZhbHVlIGlzIGF2YWlsYWJsZQogICAgICAgIG9yIHdhcyBjb25maWd1cmVkLgoKICAgICAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHJlcXVpcmUgdGhhdCB0aGUgOmNsYXNzOmAuTWlncmF0aW9uQ29udGV4dGAKICAgICAgICBoYXMgYmVlbiBjb25maWd1cmVkLgoKICAgICAgICBO2gxzdGFydGluZ19yZXZ6K05vIHN0YXJ0aW5nIHJldmlzaW9uIGFyZ3VtZW50IGlzIGF2YWlsYWJsZS4pCNoSX21pZ3JhdGlvbl9jb250ZXh0cggAAAByGgAAAHIUAAAAWg9fc3RhcnRfZnJvbV9yZXZyCQAAAHIFAAAAWgxDb21tYW5kRXJyb3IpAXIKAAAAcgwAAAByDAAAAHINAAAA2h5nZXRfc3RhcnRpbmdfcmV2aXNpb25fYXJndW1lbnSrAAAAcxAAAAAADAoBBgEMAQoBBgEMBgQBejFFbnZpcm9ubWVudENvbnRleHQuZ2V0X3N0YXJ0aW5nX3JldmlzaW9uX2FyZ3VtZW50YwEAAAAAAAAAAQAAAAQAAABDAAAAcxIAAAB8AGoAoAF8AGoCZAEZAKEBUwApAmGQAQAAR2V0IHRoZSAnZGVzdGluYXRpb24nIHJldmlzaW9uIGFyZ3VtZW50LgoKICAgICAgICBUaGlzIGlzIHR5cGljYWxseSB0aGUgYXJndW1lbnQgcGFzc2VkIHRvIHRoZQogICAgICAgIGBgdXBncmFkZWBgIG9yIGBgZG93bmdyYWRlYGAgY29tbWFuZC4KCiAgICAgICAgSWYgaXQgd2FzIHNwZWNpZmllZCBhcyBgYGhlYWRgYCwgdGhlIGFjdHVhbAogICAgICAgIHZlcnNpb24gbnVtYmVyIGlzIHJldHVybmVkOyBpZiBzcGVjaWZpZWQKICAgICAgICBhcyBgYGJhc2VgYCwgYGBOb25lYGAgaXMgcmV0dXJuZWQuCgogICAgICAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmVxdWlyZSB0aGF0IHRoZSA6Y2xhc3M6YC5NaWdyYXRpb25Db250ZXh0YAogICAgICAgIGhhcyBiZWVuIGNvbmZpZ3VyZWQuCgogICAgICAgIFoPZGVzdGluYXRpb25fcmV2KQNyCAAAAHIaAAAAcgkAAAApAXIKAAAAcgwAAAByDAAAAHINAAAA2hVnZXRfcmV2aXNpb25fYXJndW1lbnTFAAAAcwQAAAAADgYBeihFbnZpcm9ubWVudENvbnRleHQuZ2V0X3JldmlzaW9uX2FyZ3VtZW50YwEAAAAAAAAAAQAAAAQAAABDAAAAcw4AAAB8AGoAoAFkAWQCoQJTACkDYWcCAABSZXR1cm4gdGhlIHZhbHVlIHBhc3NlZCBmb3IgdGhlIGBgLS10YWdgYCBhcmd1bWVudCwgaWYgYW55LgoKICAgICAgICBUaGUgYGAtLXRhZ2BgIGFyZ3VtZW50IGlzIG5vdCB1c2VkIGRpcmVjdGx5IGJ5IEFsZW1iaWMsCiAgICAgICAgYnV0IGlzIGF2YWlsYWJsZSBmb3IgY3VzdG9tIGBgZW52LnB5YGAgY29uZmlndXJhdGlvbnMgdGhhdAogICAgICAgIHdpc2ggdG8gdXNlIGl0OyBwYXJ0aWN1bGFybHkgZm9yIG9mZmxpbmUgZ2VuZXJhdGlvbiBzY3JpcHRzCiAgICAgICAgdGhhdCB3aXNoIHRvIGdlbmVyYXRlIHRhZ2dlZCBmaWxlbmFtZXMuCgogICAgICAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmVxdWlyZSB0aGF0IHRoZSA6Y2xhc3M6YC5NaWdyYXRpb25Db250ZXh0YAogICAgICAgIGhhcyBiZWVuIGNvbmZpZ3VyZWQuCgogICAgICAgIC4uIHNlZWFsc286OgoKICAgICAgICAgICAgOm1ldGg6YC5FbnZpcm9ubWVudENvbnRleHQuZ2V0X3hfYXJndW1lbnRgIC0gYSBuZXdlciBhbmQgbW9yZQogICAgICAgICAgICBvcGVuIGVuZGVkIHN5c3RlbSBvZiBleHRlbmRpbmcgYGBlbnYucHlgYCBzY3JpcHRzIHZpYSB0aGUgY29tbWFuZAogICAgICAgICAgICBsaW5lLgoKICAgICAgICDaA3RhZ04pAnIJAAAAchIAAAApAXIKAAAAcgwAAAByDAAAAHINAAAA2hBnZXRfdGFnX2FyZ3VtZW501gAAAHMCAAAAABJ6I0Vudmlyb25tZW50Q29udGV4dC5nZXRfdGFnX2FyZ3VtZW50RmMCAAAAAAAAAAMAAAADAAAAQwAAAHM6AAAAfABqAGoBZAFrCXIcfABqAGoBagJwGGcAfQJuBGcAfQJ8AXI2dANkAmQDhAB8AkQAgwGDAX0CfAJTACkEYdYFAABSZXR1cm4gdGhlIHZhbHVlKHMpIHBhc3NlZCBmb3IgdGhlIGBgLXhgYCBhcmd1bWVudCwgaWYgYW55LgoKICAgICAgICBUaGUgYGAteGBgIGFyZ3VtZW50IGlzIGFuIG9wZW4gZW5kZWQgZmxhZyB0aGF0IGFsbG93cyBhbnkgdXNlci1kZWZpbmVkCiAgICAgICAgdmFsdWUgb3IgdmFsdWVzIHRvIGJlIHBhc3NlZCBvbiB0aGUgY29tbWFuZCBsaW5lLCB0aGVuIGF2YWlsYWJsZQogICAgICAgIGhlcmUgZm9yIGNvbnN1bXB0aW9uIGJ5IGEgY3VzdG9tIGBgZW52LnB5YGAgc2NyaXB0LgoKICAgICAgICBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgbGlzdCwgcmV0dXJuZWQgZGlyZWN0bHkgZnJvbSB0aGUgYGBhcmdwYXJzZWBgCiAgICAgICAgc3RydWN0dXJlLiAgSWYgYGBhc19kaWN0aW9uYXJ5PVRydWVgYCBpcyBwYXNzZWQsIHRoZSBgYHhgYCBhcmd1bWVudHMKICAgICAgICBhcmUgcGFyc2VkIHVzaW5nIGBga2V5PXZhbHVlYGAgZm9ybWF0IGludG8gYSBkaWN0aW9uYXJ5IHRoYXQgaXMKICAgICAgICB0aGVuIHJldHVybmVkLgoKICAgICAgICBGb3IgZXhhbXBsZSwgdG8gc3VwcG9ydCBwYXNzaW5nIGEgZGF0YWJhc2UgVVJMIG9uIHRoZSBjb21tYW5kIGxpbmUsCiAgICAgICAgdGhlIHN0YW5kYXJkIGBgZW52LnB5YGAgc2NyaXB0IGNhbiBiZSBtb2RpZmllZCBsaWtlIHRoaXM6OgoKICAgICAgICAgICAgY21kX2xpbmVfdXJsID0gY29udGV4dC5nZXRfeF9hcmd1bWVudCgKICAgICAgICAgICAgICAgIGFzX2RpY3Rpb25hcnk9VHJ1ZSkuZ2V0KCdkYm5hbWUnKQogICAgICAgICAgICBpZiBjbWRfbGluZV91cmw6CiAgICAgICAgICAgICAgICBlbmdpbmUgPSBjcmVhdGVfZW5naW5lKGNtZF9saW5lX3VybCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGVuZ2luZSA9IGVuZ2luZV9mcm9tX2NvbmZpZygKICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmdldF9zZWN0aW9uKGNvbmZpZy5jb25maWdfaW5pX3NlY3Rpb24pLAogICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXg9J3NxbGFsY2hlbXkuJywKICAgICAgICAgICAgICAgICAgICAgICAgcG9vbGNsYXNzPXBvb2wuTnVsbFBvb2wpCgogICAgICAgIFRoaXMgdGhlbiB0YWtlcyBlZmZlY3QgYnkgcnVubmluZyB0aGUgYGBhbGVtYmljYGAgc2NyaXB0IGFzOjoKCiAgICAgICAgICAgIGFsZW1iaWMgLXggZGJuYW1lPXBvc3RncmVzcWw6Ly91c2VyOnBhc3NAaG9zdC9kYm5hbWUgdXBncmFkZSBoZWFkCgogICAgICAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmVxdWlyZSB0aGF0IHRoZSA6Y2xhc3M6YC5NaWdyYXRpb25Db250ZXh0YAogICAgICAgIGhhcyBiZWVuIGNvbmZpZ3VyZWQuCgogICAgICAgIC4uIHZlcnNpb25hZGRlZDo6IDAuNi4wCgogICAgICAgIC4uIHNlZWFsc286OgoKICAgICAgICAgICAgOm1ldGg6YC5FbnZpcm9ubWVudENvbnRleHQuZ2V0X3RhZ19hcmd1bWVudGAKCiAgICAgICAgICAgIDphdHRyOmAuQ29uZmlnLmNtZF9vcHRzYAoKICAgICAgICBOYwEAAAAAAAAAAgAAAAUAAABzAAAAcxoAAAB8AF0SfQF8AaAAZABkAaECVgABAHECZAJTACkD+gE9cgMAAABOKQHaBXNwbGl0KQLaAi4wchAAAAByDAAAAHIMAAAAcg0AAAD6CTxnZW5leHByPhkBAABzAgAAAAQAejRFbnZpcm9ubWVudENvbnRleHQuZ2V0X3hfYXJndW1lbnQuPGxvY2Fscz4uPGdlbmV4cHI+KQRyBwAAAFoIY21kX29wdHPaAXjaBGRpY3QpA3IKAAAAWg1hc19kaWN0aW9uYXJ52gV2YWx1ZXIMAAAAcgwAAAByDQAAANoOZ2V0X3hfYXJndW1lbnTqAAAAcw4AAAAAKQwBEAIEAQQBAgEQAnohRW52aXJvbm1lbnRDb250ZXh0LmdldF94X2FyZ3VtZW502gh1cGdyYWRlc9oKZG93bmdyYWRlc/oDb3Au+gNzYS5jGQAAAAAAAAAbAAAABwAAAEsAAABzOgEAAHwAagB9GnwEZAFrCXIWfAR8GmQCPAB8BmQBawlyKHwGfBpkAzwAbhh8AGoBagJkAWsJckB8AGoBagJ8GmQDPAB8B3JMfAd8GmQEPAB8CHJYfAh8GmQFPAB8CXJyZAZ8GmsGcnJ8GmQGGQCgA3wJoQEBAHwFfBpkBzwAfAt8GmQIPAB8DHwaZAk8AHwNfBpkCjwAfA58GmQLPAB8CnwaZAw8AHwUfBpkDTwAfBV8GmQOPAB8F3waZA88AHwWfBpkEDwAfBh8GmQRPAB8E3waZBI8AHwPfBpkEzwAfBJkAWsJcup8EnwaZBQ8AHwQZAFrCXL6fBB8GmQVPAB8EWQBawmQAXIMfBF8GmQWPAB8AGoEfBpkFzwAfBqgA3wZoQEBAHQFagZ8AXwCfAN8AHwaZBiNBXwAXwdkAVMAKRlhVkgAAENvbmZpZ3VyZSBhIDpjbGFzczpgLk1pZ3JhdGlvbkNvbnRleHRgIHdpdGhpbiB0aGlzCiAgICAgICAgOmNsYXNzOmAuRW52aXJvbm1lbnRDb250ZXh0YCB3aGljaCB3aWxsIHByb3ZpZGUgZGF0YWJhc2UKICAgICAgICBjb25uZWN0aXZpdHkgYW5kIG90aGVyIGNvbmZpZ3VyYXRpb24gdG8gYSBzZXJpZXMgb2YKICAgICAgICBtaWdyYXRpb24gc2NyaXB0cy4KCiAgICAgICAgTWFueSBtZXRob2RzIG9uIDpjbGFzczpgLkVudmlyb25tZW50Q29udGV4dGAgcmVxdWlyZSB0aGF0CiAgICAgICAgdGhpcyBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIGluIG9yZGVyIHRvIGZ1bmN0aW9uLCBhcyB0aGV5CiAgICAgICAgdWx0aW1hdGVseSBuZWVkIHRvIGhhdmUgZGF0YWJhc2UgYWNjZXNzIG9yIGF0IGxlYXN0IGFjY2VzcwogICAgICAgIHRvIHRoZSBkaWFsZWN0IGluIHVzZS4gIFRob3NlIHdoaWNoIGRvIGFyZSBkb2N1bWVudGVkIGFzIHN1Y2guCgogICAgICAgIFRoZSBpbXBvcnRhbnQgdGhpbmcgbmVlZGVkIGJ5IDptZXRoOmAuY29uZmlndXJlYCBpcyBhCiAgICAgICAgbWVhbnMgdG8gZGV0ZXJtaW5lIHdoYXQga2luZCBvZiBkYXRhYmFzZSBkaWFsZWN0IGlzIGluIHVzZS4KICAgICAgICBBbiBhY3R1YWwgY29ubmVjdGlvbiB0byB0aGF0IGRhdGFiYXNlIGlzIG5lZWRlZCBvbmx5IGlmCiAgICAgICAgdGhlIDpjbGFzczpgLk1pZ3JhdGlvbkNvbnRleHRgIGlzIHRvIGJlIHVzZWQgaW4KICAgICAgICAib25saW5lIiBtb2RlLgoKICAgICAgICBJZiB0aGUgOm1ldGg6YC5pc19vZmZsaW5lX21vZGVgIGZ1bmN0aW9uIHJldHVybnMgYGBUcnVlYGAsCiAgICAgICAgdGhlbiBubyBjb25uZWN0aW9uIGlzIG5lZWRlZCBoZXJlLiAgT3RoZXJ3aXNlLCB0aGUKICAgICAgICBgYGNvbm5lY3Rpb25gYCBwYXJhbWV0ZXIgc2hvdWxkIGJlIHByZXNlbnQgYXMgYW4KICAgICAgICBpbnN0YW5jZSBvZiA6Y2xhc3M6YHNxbGFsY2hlbXkuZW5naW5lLkNvbm5lY3Rpb25gLgoKICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIHR5cGljYWxseSBjYWxsZWQgZnJvbSB0aGUgYGBlbnYucHlgYAogICAgICAgIHNjcmlwdCB3aXRoaW4gYSBtaWdyYXRpb24gZW52aXJvbm1lbnQuICBJdCBjYW4gYmUgY2FsbGVkCiAgICAgICAgbXVsdGlwbGUgdGltZXMgZm9yIGFuIGludm9jYXRpb24uICBUaGUgbW9zdCByZWNlbnQKICAgICAgICA6Y2xhc3M6YH5zcWxhbGNoZW15LmVuZ2luZS5Db25uZWN0aW9uYAogICAgICAgIGZvciB3aGljaCBpdCB3YXMgY2FsbGVkIGlzIHRoZSBvbmUgdGhhdCB3aWxsIGJlIG9wZXJhdGVkIHVwb24KICAgICAgICBieSB0aGUgbmV4dCBjYWxsIHRvIDptZXRoOmAucnVuX21pZ3JhdGlvbnNgLgoKICAgICAgICBHZW5lcmFsIHBhcmFtZXRlcnM6CgogICAgICAgIDpwYXJhbSBjb25uZWN0aW9uOiBhIDpjbGFzczpgfnNxbGFsY2hlbXkuZW5naW5lLkNvbm5lY3Rpb25gCiAgICAgICAgIHRvIHVzZQogICAgICAgICBmb3IgU1FMIGV4ZWN1dGlvbiBpbiAib25saW5lIiBtb2RlLiAgV2hlbiBwcmVzZW50LCBpcyBhbHNvCiAgICAgICAgIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSB0eXBlIG9mIGRpYWxlY3QgaW4gdXNlLgogICAgICAgIDpwYXJhbSB1cmw6IGEgc3RyaW5nIGRhdGFiYXNlIHVybCwgb3IgYQogICAgICAgICA6Y2xhc3M6YHNxbGFsY2hlbXkuZW5naW5lLnVybC5VUkxgIG9iamVjdC4KICAgICAgICAgVGhlIHR5cGUgb2YgZGlhbGVjdCB0byBiZSB1c2VkIHdpbGwgYmUgZGVyaXZlZCBmcm9tIHRoaXMgaWYKICAgICAgICAgYGBjb25uZWN0aW9uYGAgaXMgbm90IHBhc3NlZC4KICAgICAgICA6cGFyYW0gZGlhbGVjdF9uYW1lOiBzdHJpbmcgbmFtZSBvZiBhIGRpYWxlY3QsIHN1Y2ggYXMKICAgICAgICAgInBvc3RncmVzcWwiLCAibXNzcWwiLCBldGMuCiAgICAgICAgIFRoZSB0eXBlIG9mIGRpYWxlY3QgdG8gYmUgdXNlZCB3aWxsIGJlIGRlcml2ZWQgZnJvbSB0aGlzIGlmCiAgICAgICAgIGBgY29ubmVjdGlvbmBgIGFuZCBgYHVybGBgIGFyZSBub3QgcGFzc2VkLgogICAgICAgIDpwYXJhbSB0cmFuc2FjdGlvbmFsX2RkbDogRm9yY2UgdGhlIHVzYWdlIG9mICJ0cmFuc2FjdGlvbmFsIgogICAgICAgICBEREwgb24gb3Igb2ZmOwogICAgICAgICB0aGlzIG90aGVyd2lzZSBkZWZhdWx0cyB0byB3aGV0aGVyIG9yIG5vdCB0aGUgZGlhbGVjdCBpbgogICAgICAgICB1c2Ugc3VwcG9ydHMgaXQuCiAgICAgICAgOnBhcmFtIHRyYW5zYWN0aW9uX3Blcl9taWdyYXRpb246IGlmIFRydWUsIG5lc3QgZWFjaCBtaWdyYXRpb24gc2NyaXB0CiAgICAgICAgIGluIGEgdHJhbnNhY3Rpb24gcmF0aGVyIHRoYW4gdGhlIGZ1bGwgc2VyaWVzIG9mIG1pZ3JhdGlvbnMgdG8KICAgICAgICAgcnVuLgoKICAgICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMC42LjUKCiAgICAgICAgOnBhcmFtIG91dHB1dF9idWZmZXI6IGEgZmlsZS1saWtlIG9iamVjdCB0aGF0IHdpbGwgYmUgdXNlZAogICAgICAgICBmb3IgdGV4dHVhbCBvdXRwdXQKICAgICAgICAgd2hlbiB0aGUgYGAtLXNxbGBgIG9wdGlvbiBpcyB1c2VkIHRvIGdlbmVyYXRlIFNRTCBzY3JpcHRzLgogICAgICAgICBEZWZhdWx0cyB0bwogICAgICAgICBgYHN5cy5zdGRvdXRgYCBpZiBub3QgcGFzc2VkIGhlcmUgYW5kIGFsc28gbm90IHByZXNlbnQgb24KICAgICAgICAgdGhlIDpjbGFzczpgLkNvbmZpZ2AKICAgICAgICAgb2JqZWN0LiAgVGhlIHZhbHVlIGhlcmUgb3ZlcnJpZGVzIHRoYXQgb2YgdGhlIDpjbGFzczpgLkNvbmZpZ2AKICAgICAgICAgb2JqZWN0LgogICAgICAgIDpwYXJhbSBvdXRwdXRfZW5jb2Rpbmc6IHdoZW4gdXNpbmcgYGAtLXNxbGBgIHRvIGdlbmVyYXRlIFNRTAogICAgICAgICBzY3JpcHRzLCBhcHBseSB0aGlzIGVuY29kaW5nIHRvIHRoZSBzdHJpbmcgb3V0cHV0LgogICAgICAgIDpwYXJhbSBsaXRlcmFsX2JpbmRzOiB3aGVuIHVzaW5nIGBgLS1zcWxgYCB0byBnZW5lcmF0ZSBTUUwKICAgICAgICAgc2NyaXB0cywgcGFzcyB0aHJvdWdoIHRoZSBgYGxpdGVyYWxfYmluZHNgYCBmbGFnIHRvIHRoZSBjb21waWxlcgogICAgICAgICBzbyB0aGF0IGFueSBsaXRlcmFsIHZhbHVlcyB0aGF0IHdvdWxkIG9yZGluYXJpbHkgYmUgYm91bmQKICAgICAgICAgcGFyYW1ldGVycyBhcmUgY29udmVydGVkIHRvIHBsYWluIHN0cmluZ3MuCgogICAgICAgICAuLiB3YXJuaW5nOjogRGlhbGVjdHMgY2FuIHR5cGljYWxseSBvbmx5IGhhbmRsZSBzaW1wbGUgZGF0YXR5cGVzCiAgICAgICAgICAgIGxpa2Ugc3RyaW5ncyBhbmQgbnVtYmVycyBmb3IgYXV0by1saXRlcmFsIGdlbmVyYXRpb24uICBEYXRhdHlwZXMKICAgICAgICAgICAgbGlrZSBkYXRlcywgaW50ZXJ2YWxzLCBhbmQgb3RoZXJzIG1heSBzdGlsbCByZXF1aXJlIG1hbnVhbAogICAgICAgICAgICBmb3JtYXR0aW5nLCB0eXBpY2FsbHkgdXNpbmcgOm1ldGg6YC5PcGVyYXRpb25zLmlubGluZV9saXRlcmFsYC4KCiAgICAgICAgIC4uIG5vdGU6OiB0aGUgYGBsaXRlcmFsX2JpbmRzYGAgZmxhZyBpcyBpZ25vcmVkIG9uIFNRTEFsY2hlbXkKICAgICAgICAgICAgdmVyc2lvbnMgcHJpb3IgdG8gMC44IHdoZXJlIHRoaXMgZmVhdHVyZSBpcyBub3Qgc3VwcG9ydGVkLgoKICAgICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMC43LjYKCiAgICAgICAgIC4uIHNlZWFsc286OgoKICAgICAgICAgICAgOm1ldGg6YC5PcGVyYXRpb25zLmlubGluZV9saXRlcmFsYAoKICAgICAgICA6cGFyYW0gc3RhcnRpbmdfcmV2OiBPdmVycmlkZSB0aGUgInN0YXJ0aW5nIHJldmlzaW9uIiBhcmd1bWVudAogICAgICAgICB3aGVuIHVzaW5nIGBgLS1zcWxgYCBtb2RlLgogICAgICAgIDpwYXJhbSB0YWc6IGEgc3RyaW5nIHRhZyBmb3IgdXNhZ2UgYnkgY3VzdG9tIGBgZW52LnB5YGAgc2NyaXB0cy4KICAgICAgICAgU2V0IHZpYSB0aGUgYGAtLXRhZ2BgIG9wdGlvbiwgY2FuIGJlIG92ZXJyaWRkZW4gaGVyZS4KICAgICAgICA6cGFyYW0gdGVtcGxhdGVfYXJnczogZGljdGlvbmFyeSBvZiB0ZW1wbGF0ZSBhcmd1bWVudHMgd2hpY2gKICAgICAgICAgd2lsbCBiZSBhZGRlZCB0byB0aGUgdGVtcGxhdGUgYXJndW1lbnQgZW52aXJvbm1lbnQgd2hlbgogICAgICAgICBydW5uaW5nIHRoZSAicmV2aXNpb24iIGNvbW1hbmQuICAgTm90ZSB0aGF0IHRoZSBzY3JpcHQgZW52aXJvbm1lbnQKICAgICAgICAgaXMgb25seSBydW4gd2l0aGluIHRoZSAicmV2aXNpb24iIGNvbW1hbmQgaWYgdGhlIC0tYXV0b2dlbmVyYXRlCiAgICAgICAgIG9wdGlvbiBpcyB1c2VkLCBvciBpZiB0aGUgb3B0aW9uICJyZXZpc2lvbl9lbnZpcm9ubWVudD10cnVlIgogICAgICAgICBpcyBwcmVzZW50IGluIHRoZSBhbGVtYmljLmluaSBmaWxlLgoKICAgICAgICA6cGFyYW0gdmVyc2lvbl90YWJsZTogVGhlIG5hbWUgb2YgdGhlIEFsZW1iaWMgdmVyc2lvbiB0YWJsZS4KICAgICAgICAgVGhlIGRlZmF1bHQgaXMgYGAnYWxlbWJpY192ZXJzaW9uJ2BgLgogICAgICAgIDpwYXJhbSB2ZXJzaW9uX3RhYmxlX3NjaGVtYTogT3B0aW9uYWwgc2NoZW1hIHRvIHBsYWNlIHZlcnNpb24KICAgICAgICAgdGFibGUgd2l0aGluLgoKICAgICAgICBQYXJhbWV0ZXJzIHNwZWNpZmljIHRvIHRoZSBhdXRvZ2VuZXJhdGUgZmVhdHVyZSwgd2hlbgogICAgICAgIGBgYWxlbWJpYyByZXZpc2lvbmBgIGlzIHJ1biB3aXRoIHRoZSBgYC0tYXV0b2dlbmVyYXRlYGAgZmVhdHVyZToKCiAgICAgICAgOnBhcmFtIHRhcmdldF9tZXRhZGF0YTogYSA6Y2xhc3M6YHNxbGFsY2hlbXkuc2NoZW1hLk1ldGFEYXRhYAogICAgICAgICBvYmplY3QgdGhhdAogICAgICAgICB3aWxsIGJlIGNvbnN1bHRlZCBkdXJpbmcgYXV0b2dlbmVyYXRpb24uICBUaGUgdGFibGVzIHByZXNlbnQKICAgICAgICAgd2lsbCBiZSBjb21wYXJlZCBhZ2FpbnN0CiAgICAgICAgIHdoYXQgaXMgbG9jYWxseSBhdmFpbGFibGUgb24gdGhlIHRhcmdldAogICAgICAgICA6Y2xhc3M6YH5zcWxhbGNoZW15LmVuZ2luZS5Db25uZWN0aW9uYAogICAgICAgICB0byBwcm9kdWNlIGNhbmRpZGF0ZSB1cGdyYWRlL2Rvd25ncmFkZSBvcGVyYXRpb25zLgoKICAgICAgICA6cGFyYW0gY29tcGFyZV90eXBlOiBJbmRpY2F0ZXMgdHlwZSBjb21wYXJpc29uIGJlaGF2aW9yIGR1cmluZwogICAgICAgICBhbiBhdXRvZ2VuZXJhdGUKICAgICAgICAgb3BlcmF0aW9uLiAgRGVmYXVsdHMgdG8gYGBGYWxzZWBgIHdoaWNoIGRpc2FibGVzIHR5cGUKICAgICAgICAgY29tcGFyaXNvbi4gIFNldCB0bwogICAgICAgICBgYFRydWVgYCB0byB0dXJuIG9uIGRlZmF1bHQgdHlwZSBjb21wYXJpc29uLCB3aGljaCBoYXMgdmFyaWVkCiAgICAgICAgIGFjY3VyYWN5IGRlcGVuZGluZyBvbiBiYWNrZW5kLiAgIFNlZSA6cmVmOmBjb21wYXJlX3R5cGVzYAogICAgICAgICBmb3IgYW4gZXhhbXBsZSBhcyB3ZWxsIGFzIGluZm9ybWF0aW9uIG9uIG90aGVyIHR5cGUKICAgICAgICAgY29tcGFyaXNvbiBvcHRpb25zLgoKICAgICAgICAgLi4gc2VlYWxzbzo6CgogICAgICAgICAgICA6cmVmOmBjb21wYXJlX3R5cGVzYAoKICAgICAgICAgICAgOnBhcmFtcmVmOmAuRW52aXJvbm1lbnRDb250ZXh0LmNvbmZpZ3VyZS5jb21wYXJlX3NlcnZlcl9kZWZhdWx0YAoKICAgICAgICA6cGFyYW0gY29tcGFyZV9zZXJ2ZXJfZGVmYXVsdDogSW5kaWNhdGVzIHNlcnZlciBkZWZhdWx0IGNvbXBhcmlzb24KICAgICAgICAgYmVoYXZpb3IgZHVyaW5nCiAgICAgICAgIGFuIGF1dG9nZW5lcmF0ZSBvcGVyYXRpb24uICBEZWZhdWx0cyB0byBgYEZhbHNlYGAgd2hpY2ggZGlzYWJsZXMKICAgICAgICAgc2VydmVyIGRlZmF1bHQKICAgICAgICAgY29tcGFyaXNvbi4gIFNldCB0byAgYGBUcnVlYGAgdG8gdHVybiBvbiBzZXJ2ZXIgZGVmYXVsdCBjb21wYXJpc29uLAogICAgICAgICB3aGljaCBoYXMKICAgICAgICAgdmFyaWVkIGFjY3VyYWN5IGRlcGVuZGluZyBvbiBiYWNrZW5kLgoKICAgICAgICAgVG8gY3VzdG9taXplIHNlcnZlciBkZWZhdWx0IGNvbXBhcmlzb24gYmVoYXZpb3IsIGEgY2FsbGFibGUgbWF5CiAgICAgICAgIGJlIHNwZWNpZmllZAogICAgICAgICB3aGljaCBjYW4gZmlsdGVyIHNlcnZlciBkZWZhdWx0IGNvbXBhcmlzb25zIGR1cmluZyBhbgogICAgICAgICBhdXRvZ2VuZXJhdGUgb3BlcmF0aW9uLgogICAgICAgICBkZWZhdWx0cyBkdXJpbmcgYW4gYXV0b2dlbmVyYXRlIG9wZXJhdGlvbi4gICBUaGUgZm9ybWF0IG9mIHRoaXMKICAgICAgICAgY2FsbGFibGUgaXM6OgoKICAgICAgICAgICAgZGVmIG15X2NvbXBhcmVfc2VydmVyX2RlZmF1bHQoY29udGV4dCwgaW5zcGVjdGVkX2NvbHVtbiwKICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFfY29sdW1uLCBpbnNwZWN0ZWRfZGVmYXVsdCwgbWV0YWRhdGFfZGVmYXVsdCwKICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyZWRfbWV0YWRhdGFfZGVmYXVsdCk6CiAgICAgICAgICAgICAgICAjIHJldHVybiBUcnVlIGlmIHRoZSBkZWZhdWx0cyBhcmUgZGlmZmVyZW50LAogICAgICAgICAgICAgICAgIyBGYWxzZSBpZiBub3QsIG9yIE5vbmUgdG8gYWxsb3cgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KICAgICAgICAgICAgICAgICMgdG8gY29tcGFyZSB0aGVzZSBkZWZhdWx0cwogICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgICAgIGNvbnRleHQuY29uZmlndXJlKAogICAgICAgICAgICAgICAgIyAuLi4KICAgICAgICAgICAgICAgIGNvbXBhcmVfc2VydmVyX2RlZmF1bHQgPSBteV9jb21wYXJlX3NlcnZlcl9kZWZhdWx0CiAgICAgICAgICAgICkKCiAgICAgICAgIGBgaW5zcGVjdGVkX2NvbHVtbmBgIGlzIGEgZGljdGlvbmFyeSBzdHJ1Y3R1cmUgYXMgcmV0dXJuZWQgYnkKICAgICAgICAgOm1ldGg6YHNxbGFsY2hlbXkuZW5naW5lLnJlZmxlY3Rpb24uSW5zcGVjdG9yLmdldF9jb2x1bW5zYCwgd2hlcmVhcwogICAgICAgICBgYG1ldGFkYXRhX2NvbHVtbmBgIGlzIGEgOmNsYXNzOmBzcWxhbGNoZW15LnNjaGVtYS5Db2x1bW5gIGZyb20KICAgICAgICAgdGhlIGxvY2FsIG1vZGVsIGVudmlyb25tZW50LgoKICAgICAgICAgQSByZXR1cm4gdmFsdWUgb2YgYGBOb25lYGAgaW5kaWNhdGVzIHRvIGFsbG93IGRlZmF1bHQgc2VydmVyIGRlZmF1bHQKICAgICAgICAgY29tcGFyaXNvbgogICAgICAgICB0byBwcm9jZWVkLiAgTm90ZSB0aGF0IHNvbWUgYmFja2VuZHMgc3VjaCBhcyBQb3N0Z3Jlc3FsIGFjdHVhbGx5CiAgICAgICAgIGV4ZWN1dGUKICAgICAgICAgdGhlIHR3byBkZWZhdWx0cyBvbiB0aGUgZGF0YWJhc2Ugc2lkZSB0byBjb21wYXJlIGZvciBlcXVpdmFsZW5jZS4KCiAgICAgICAgIC4uIHNlZWFsc286OgoKICAgICAgICAgICAgOnBhcmFtcmVmOmAuRW52aXJvbm1lbnRDb250ZXh0LmNvbmZpZ3VyZS5jb21wYXJlX3R5cGVgCgogICAgICAgIDpwYXJhbSBpbmNsdWRlX29iamVjdDogQSBjYWxsYWJsZSBmdW5jdGlvbiB3aGljaCBpcyBnaXZlbgogICAgICAgICB0aGUgY2hhbmNlIHRvIHJldHVybiBgYFRydWVgYCBvciBgYEZhbHNlYGAgZm9yIGFueSBvYmplY3QsCiAgICAgICAgIGluZGljYXRpbmcgaWYgdGhlIGdpdmVuIG9iamVjdCBzaG91bGQgYmUgY29uc2lkZXJlZCBpbiB0aGUKICAgICAgICAgYXV0b2dlbmVyYXRlIHN3ZWVwLgoKICAgICAgICAgVGhlIGZ1bmN0aW9uIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBwb3NpdGlvbmFsIGFyZ3VtZW50czoKCiAgICAgICAgICogYGBvYmplY3RgYDogYSA6Y2xhc3M6YH5zcWxhbGNoZW15LnNjaGVtYS5TY2hlbWFJdGVtYCBvYmplY3Qgc3VjaAogICAgICAgICAgIGFzIGEgOmNsYXNzOmB+c3FsYWxjaGVteS5zY2hlbWEuVGFibGVgLAogICAgICAgICAgIDpjbGFzczpgfnNxbGFsY2hlbXkuc2NoZW1hLkNvbHVtbmAsCiAgICAgICAgICAgOmNsYXNzOmB+c3FsYWxjaGVteS5zY2hlbWEuSW5kZXhgCiAgICAgICAgICAgOmNsYXNzOmB+c3FsYWxjaGVteS5zY2hlbWEuVW5pcXVlQ29uc3RyYWludGAsCiAgICAgICAgICAgb3IgOmNsYXNzOmB+c3FsYWxjaGVteS5zY2hlbWEuRm9yZWlnbktleUNvbnN0cmFpbnRgIG9iamVjdAogICAgICAgICAqIGBgbmFtZWBgOiB0aGUgbmFtZSBvZiB0aGUgb2JqZWN0LiBUaGlzIGlzIHR5cGljYWxseSBhdmFpbGFibGUKICAgICAgICAgICB2aWEgYGBvYmplY3QubmFtZWBgLgogICAgICAgICAqIGBgdHlwZWBgOiBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSB0eXBlIG9mIG9iamVjdDsgY3VycmVudGx5CiAgICAgICAgICAgYGAidGFibGUiYGAsIGBgImNvbHVtbiJgYCwgYGAiaW5kZXgiYGAsIGBgInVuaXF1ZV9jb25zdHJhaW50ImBgLAogICAgICAgICAgIG9yIGBgImZvcmVpZ25fa2V5X2NvbnN0cmFpbnQiYGAKCiAgICAgICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMC43LjAgU3VwcG9ydCBmb3IgaW5kZXhlcyBhbmQgdW5pcXVlIGNvbnN0cmFpbnRzCiAgICAgICAgICAgICAgd2l0aGluIHRoZQogICAgICAgICAgICAgIDpwYXJhbXJlZjpgfi5FbnZpcm9ubWVudENvbnRleHQuY29uZmlndXJlLmluY2x1ZGVfb2JqZWN0YCBob29rLgoKICAgICAgICAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAwLjcuMSBTdXBwb3J0IGZvciBmb3JlaWduIGtleXMgd2l0aGluIHRoZQogICAgICAgICAgICAgIDpwYXJhbXJlZjpgfi5FbnZpcm9ubWVudENvbnRleHQuY29uZmlndXJlLmluY2x1ZGVfb2JqZWN0YCBob29rLgoKICAgICAgICAgKiBgYHJlZmxlY3RlZGBgOiBgYFRydWVgYCBpZiB0aGUgZ2l2ZW4gb2JqZWN0IHdhcyBwcm9kdWNlZCBiYXNlZCBvbgogICAgICAgICAgIHRhYmxlIHJlZmxlY3Rpb24sIGBgRmFsc2VgYCBpZiBpdCdzIGZyb20gYSBsb2NhbCA6Y2xhc3M6YC5NZXRhRGF0YWAKICAgICAgICAgICBvYmplY3QuCiAgICAgICAgICogYGBjb21wYXJlX3RvYGA6IHRoZSBvYmplY3QgYmVpbmcgY29tcGFyZWQgYWdhaW5zdCwgaWYgYXZhaWxhYmxlLAogICAgICAgICAgIGVsc2UgYGBOb25lYGAuCgogICAgICAgICBFLmcuOjoKCiAgICAgICAgICAgIGRlZiBpbmNsdWRlX29iamVjdChvYmplY3QsIG5hbWUsIHR5cGVfLCByZWZsZWN0ZWQsIGNvbXBhcmVfdG8pOgogICAgICAgICAgICAgICAgaWYgKHR5cGVfID09ICJjb2x1bW4iIGFuZAogICAgICAgICAgICAgICAgICAgIG5vdCByZWZsZWN0ZWQgYW5kCiAgICAgICAgICAgICAgICAgICAgb2JqZWN0LmluZm8uZ2V0KCJza2lwX2F1dG9nZW5lcmF0ZSIsIEZhbHNlKSk6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgICAgICAgICBjb250ZXh0LmNvbmZpZ3VyZSgKICAgICAgICAgICAgICAgICMgLi4uCiAgICAgICAgICAgICAgICBpbmNsdWRlX29iamVjdCA9IGluY2x1ZGVfb2JqZWN0CiAgICAgICAgICAgICkKCiAgICAgICAgIDpwYXJhbXJlZjpgLkVudmlyb25tZW50Q29udGV4dC5jb25maWd1cmUuaW5jbHVkZV9vYmplY3RgIGNhbiBhbHNvCiAgICAgICAgIGJlIHVzZWQgdG8gZmlsdGVyIG9uIHNwZWNpZmljIHNjaGVtYXMgdG8gaW5jbHVkZSBvciBvbWl0LCB3aGVuCiAgICAgICAgIHRoZSA6cGFyYW1yZWY6YC5FbnZpcm9ubWVudENvbnRleHQuY29uZmlndXJlLmluY2x1ZGVfc2NoZW1hc2AKICAgICAgICAgZmxhZyBpcyBzZXQgdG8gYGBUcnVlYGAuICAgVGhlIDphdHRyOmAuVGFibGUuc2NoZW1hYCBhdHRyaWJ1dGUKICAgICAgICAgb24gZWFjaCA6Y2xhc3M6YC5UYWJsZWAgb2JqZWN0IHJlZmxlY3RlZCB3aWxsIGluZGljYXRlIHRoZSBuYW1lIG9mIHRoZQogICAgICAgICBzY2hlbWEgZnJvbSB3aGljaCB0aGUgOmNsYXNzOmAuVGFibGVgIG9yaWdpbmF0ZXMuCgogICAgICAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAwLjYuMAoKICAgICAgICAgLi4gc2VlYWxzbzo6CgogICAgICAgICAgICA6cGFyYW1yZWY6YC5FbnZpcm9ubWVudENvbnRleHQuY29uZmlndXJlLmluY2x1ZGVfc2NoZW1hc2AKCiAgICAgICAgOnBhcmFtIGluY2x1ZGVfc3ltYm9sOiBBIGNhbGxhYmxlIGZ1bmN0aW9uIHdoaWNoLCBnaXZlbiBhIHRhYmxlIG5hbWUKICAgICAgICAgYW5kIHNjaGVtYSBuYW1lIChtYXkgYmUgYGBOb25lYGApLCByZXR1cm5zIGBgVHJ1ZWBgIG9yIGBgRmFsc2VgYCwKICAgICAgICAgaW5kaWNhdGluZyBpZiB0aGUgZ2l2ZW4gdGFibGUgc2hvdWxkIGJlIGNvbnNpZGVyZWQgaW4gdGhlCiAgICAgICAgIGF1dG9nZW5lcmF0ZSBzd2VlcC4KCiAgICAgICAgIC4uIGRlcHJlY2F0ZWQ6OiAwLjYuMAogICAgICAgICAgICA6cGFyYW1yZWY6YC5FbnZpcm9ubWVudENvbnRleHQuY29uZmlndXJlLmluY2x1ZGVfc3ltYm9sYAogICAgICAgICAgICBpcyBzdXBlcmNlZGVkIGJ5IHRoZSBtb3JlIGdlbmVyaWMKICAgICAgICAgICAgOnBhcmFtcmVmOmAuRW52aXJvbm1lbnRDb250ZXh0LmNvbmZpZ3VyZS5pbmNsdWRlX29iamVjdGAKICAgICAgICAgICAgcGFyYW1ldGVyLgoKICAgICAgICAgRS5nLjo6CgogICAgICAgICAgICBkZWYgaW5jbHVkZV9zeW1ib2wodGFibGVuYW1lLCBzY2hlbWEpOgogICAgICAgICAgICAgICAgcmV0dXJuIHRhYmxlbmFtZSBub3QgaW4gKCJza2lwX3RhYmxlX29uZSIsICJza2lwX3RhYmxlX3R3byIpCgogICAgICAgICAgICBjb250ZXh0LmNvbmZpZ3VyZSgKICAgICAgICAgICAgICAgICMgLi4uCiAgICAgICAgICAgICAgICBpbmNsdWRlX3N5bWJvbCA9IGluY2x1ZGVfc3ltYm9sCiAgICAgICAgICAgICkKCiAgICAgICAgIC4uIHNlZWFsc286OgoKICAgICAgICAgICAgOnBhcmFtcmVmOmAuRW52aXJvbm1lbnRDb250ZXh0LmNvbmZpZ3VyZS5pbmNsdWRlX3NjaGVtYXNgCgogICAgICAgICAgICA6cGFyYW1yZWY6YC5FbnZpcm9ubWVudENvbnRleHQuY29uZmlndXJlLmluY2x1ZGVfb2JqZWN0YAoKICAgICAgICA6cGFyYW0gcmVuZGVyX2FzX2JhdGNoOiBpZiBUcnVlLCBjb21tYW5kcyB3aGljaCBhbHRlciBlbGVtZW50cwogICAgICAgICB3aXRoaW4gYSB0YWJsZSB3aWxsIGJlIHBsYWNlZCB1bmRlciBhIGBgd2l0aCBiYXRjaF9hbHRlcl90YWJsZSgpOmBgCiAgICAgICAgIGRpcmVjdGl2ZSwgc28gdGhhdCBiYXRjaCBtaWdyYXRpb25zIHdpbGwgdGFrZSBwbGFjZS4KCiAgICAgICAgIC4uIHZlcnNpb25hZGRlZDo6IDAuNy4wCgogICAgICAgICAuLiBzZWVhbHNvOjoKCiAgICAgICAgICAgIDpyZWY6YGJhdGNoX21pZ3JhdGlvbnNgCgogICAgICAgIDpwYXJhbSBpbmNsdWRlX3NjaGVtYXM6IElmIFRydWUsIGF1dG9nZW5lcmF0ZSB3aWxsIHNjYW4gYWNyb3NzCiAgICAgICAgIGFsbCBzY2hlbWFzIGxvY2F0ZWQgYnkgdGhlIFNRTEFsY2hlbXkKICAgICAgICAgOm1ldGg6YH5zcWxhbGNoZW15LmVuZ2luZS5yZWZsZWN0aW9uLkluc3BlY3Rvci5nZXRfc2NoZW1hX25hbWVzYAogICAgICAgICBtZXRob2QsIGFuZCBpbmNsdWRlIGFsbCBkaWZmZXJlbmNlcyBpbiB0YWJsZXMgZm91bmQgYWNyb3NzIGFsbAogICAgICAgICB0aG9zZSBzY2hlbWFzLiAgV2hlbiB1c2luZyB0aGlzIG9wdGlvbiwgeW91IG1heSB3YW50IHRvIGFsc28KICAgICAgICAgdXNlIHRoZSA6cGFyYW1yZWY6YC5FbnZpcm9ubWVudENvbnRleHQuY29uZmlndXJlLmluY2x1ZGVfb2JqZWN0YAogICAgICAgICBvcHRpb24gdG8gc3BlY2lmeSBhIGNhbGxhYmxlIHdoaWNoCiAgICAgICAgIGNhbiBmaWx0ZXIgdGhlIHRhYmxlcy9zY2hlbWFzIHRoYXQgZ2V0IGluY2x1ZGVkLgoKICAgICAgICAgLi4gc2VlYWxzbzo6CgogICAgICAgICAgICA6cGFyYW1yZWY6YC5FbnZpcm9ubWVudENvbnRleHQuY29uZmlndXJlLmluY2x1ZGVfb2JqZWN0YAoKICAgICAgICA6cGFyYW0gcmVuZGVyX2l0ZW06IENhbGxhYmxlIHRoYXQgY2FuIGJlIHVzZWQgdG8gb3ZlcnJpZGUgaG93CiAgICAgICAgIGFueSBzY2hlbWEgaXRlbSwgaS5lLiBjb2x1bW4sIGNvbnN0cmFpbnQsIHR5cGUsCiAgICAgICAgIGV0Yy4sIGlzIHJlbmRlcmVkIGZvciBhdXRvZ2VuZXJhdGUuICBUaGUgY2FsbGFibGUgcmVjZWl2ZXMgYQogICAgICAgICBzdHJpbmcgZGVzY3JpYmluZyB0aGUgdHlwZSBvZiBvYmplY3QsIHRoZSBvYmplY3QsIGFuZAogICAgICAgICB0aGUgYXV0b2dlbiBjb250ZXh0LiAgSWYgaXQgcmV0dXJucyBGYWxzZSwgdGhlCiAgICAgICAgIGRlZmF1bHQgcmVuZGVyaW5nIG1ldGhvZCB3aWxsIGJlIHVzZWQuICBJZiBpdCByZXR1cm5zIE5vbmUsCiAgICAgICAgIHRoZSBpdGVtIHdpbGwgbm90IGJlIHJlbmRlcmVkIGluIHRoZSBjb250ZXh0IG9mIGEgVGFibGUKICAgICAgICAgY29uc3RydWN0LCB0aGF0IGlzLCBjYW4gYmUgdXNlZCB0byBza2lwIGNvbHVtbnMgb3IgY29uc3RyYWludHMKICAgICAgICAgd2l0aGluIG9wLmNyZWF0ZV90YWJsZSgpOjoKCiAgICAgICAgICAgIGRlZiBteV9yZW5kZXJfY29sdW1uKHR5cGVfLCBjb2wsIGF1dG9nZW5fY29udGV4dCk6CiAgICAgICAgICAgICAgICBpZiB0eXBlXyA9PSAiY29sdW1uIiBhbmQgaXNpbnN0YW5jZShjb2wsIE15U3BlY2lhbENvbCk6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcHIoY29sKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgICAgIGNvbnRleHQuY29uZmlndXJlKAogICAgICAgICAgICAgICAgIyAuLi4KICAgICAgICAgICAgICAgIHJlbmRlcl9pdGVtID0gbXlfcmVuZGVyX2NvbHVtbgogICAgICAgICAgICApCgogICAgICAgICBBdmFpbGFibGUgdmFsdWVzIGZvciB0aGUgdHlwZSBzdHJpbmcgaW5jbHVkZTogYGAiY29sdW1uImBgLAogICAgICAgICBgYCJwcmltYXJ5X2tleSJgYCwgYGAiZm9yZWlnbl9rZXkiYGAsIGBgInVuaXF1ZSJgYCwgYGAiY2hlY2siYGAsCiAgICAgICAgIGBgInR5cGUiYGAsIGBgInNlcnZlcl9kZWZhdWx0ImBgLgoKICAgICAgICAgLi4gc2VlYWxzbzo6CgogICAgICAgICAgICA6cmVmOmBhdXRvZ2VuX3JlbmRlcl90eXBlc2AKCiAgICAgICAgOnBhcmFtIHVwZ3JhZGVfdG9rZW46IFdoZW4gYXV0b2dlbmVyYXRlIGNvbXBsZXRlcywgdGhlIHRleHQgb2YgdGhlCiAgICAgICAgIGNhbmRpZGF0ZSB1cGdyYWRlIG9wZXJhdGlvbnMgd2lsbCBiZSBwcmVzZW50IGluIHRoaXMgdGVtcGxhdGUKICAgICAgICAgdmFyaWFibGUgd2hlbiBgYHNjcmlwdC5weS5tYWtvYGAgaXMgcmVuZGVyZWQuICBEZWZhdWx0cyB0bwogICAgICAgICBgYHVwZ3JhZGVzYGAuCiAgICAgICAgOnBhcmFtIGRvd25ncmFkZV90b2tlbjogV2hlbiBhdXRvZ2VuZXJhdGUgY29tcGxldGVzLCB0aGUgdGV4dCBvZiB0aGUKICAgICAgICAgY2FuZGlkYXRlIGRvd25ncmFkZSBvcGVyYXRpb25zIHdpbGwgYmUgcHJlc2VudCBpbiB0aGlzCiAgICAgICAgIHRlbXBsYXRlIHZhcmlhYmxlIHdoZW4gYGBzY3JpcHQucHkubWFrb2BgIGlzIHJlbmRlcmVkLiAgRGVmYXVsdHMgdG8KICAgICAgICAgYGBkb3duZ3JhZGVzYGAuCgogICAgICAgIDpwYXJhbSBhbGVtYmljX21vZHVsZV9wcmVmaXg6IFdoZW4gYXV0b2dlbmVyYXRlIHJlZmVycyB0byBBbGVtYmljCiAgICAgICAgIDptb2Q6YGFsZW1iaWMub3BlcmF0aW9uc2AgY29uc3RydWN0cywgdGhpcyBwcmVmaXggd2lsbCBiZSB1c2VkCiAgICAgICAgIChpLmUuIGBgb3AuY3JlYXRlX3RhYmxlYGApICBEZWZhdWx0cyB0byAiYGBvcC5gYCIuCiAgICAgICAgIENhbiBiZSBgYE5vbmVgYCB0byBpbmRpY2F0ZSBubyBwcmVmaXguCgogICAgICAgIDpwYXJhbSBzcWxhbGNoZW15X21vZHVsZV9wcmVmaXg6IFdoZW4gYXV0b2dlbmVyYXRlIHJlZmVycyB0bwogICAgICAgICBTUUxBbGNoZW15CiAgICAgICAgIDpjbGFzczpgfnNxbGFsY2hlbXkuc2NoZW1hLkNvbHVtbmAgb3IgdHlwZSBjbGFzc2VzLCB0aGlzIHByZWZpeAogICAgICAgICB3aWxsIGJlIHVzZWQKICAgICAgICAgKGkuZS4gYGBzYS5Db2x1bW4oInNvbWVuYW1lIiwgc2EuSW50ZWdlcilgYCkgIERlZmF1bHRzIHRvICJgYHNhLmBgIi4KICAgICAgICAgQ2FuIGJlIGBgTm9uZWBgIHRvIGluZGljYXRlIG5vIHByZWZpeC4KICAgICAgICAgTm90ZSB0aGF0IHdoZW4gZGlhbGVjdC1zcGVjaWZpYyB0eXBlcyBhcmUgcmVuZGVyZWQsIGF1dG9nZW5lcmF0ZQogICAgICAgICB3aWxsIHJlbmRlciB0aGVtIHVzaW5nIHRoZSBkaWFsZWN0IG1vZHVsZSBuYW1lLCBpLmUuIGBgbXNzcWwuQklUKClgYCwKICAgICAgICAgYGBwb3N0Z3Jlc3FsLlVVSUQoKWBgLgoKICAgICAgICA6cGFyYW0gdXNlcl9tb2R1bGVfcHJlZml4OiBXaGVuIGF1dG9nZW5lcmF0ZSByZWZlcnMgdG8gYSBTUUxBbGNoZW15CiAgICAgICAgIHR5cGUgKGUuZy4gOmNsYXNzOmAuVHlwZUVuZ2luZWApIHdoZXJlIHRoZSBtb2R1bGUgbmFtZSBpcyBub3QKICAgICAgICAgdW5kZXIgdGhlIGBgc3FsYWxjaGVteWBgIG5hbWVzcGFjZSwgdGhpcyBwcmVmaXggd2lsbCBiZSB1c2VkCiAgICAgICAgIHdpdGhpbiBhdXRvZ2VuZXJhdGUuICBJZiBsZWZ0IGF0IGl0cyBkZWZhdWx0IG9mCiAgICAgICAgIGBgTm9uZWBgLCB0aGUgYGBfX21vZHVsZV9fYGAgYXR0cmlidXRlIG9mIHRoZSB0eXBlIGlzIHVzZWQgdG8KICAgICAgICAgcmVuZGVyIHRoZSBpbXBvcnQgbW9kdWxlLiAgIEl0J3MgYSBnb29kIHByYWN0aWNlIHRvIHNldCB0aGlzCiAgICAgICAgIGFuZCB0byBoYXZlIGFsbCBjdXN0b20gdHlwZXMgYmUgYXZhaWxhYmxlIGZyb20gYSBmaXhlZCBtb2R1bGUgc3BhY2UsCiAgICAgICAgIGluIG9yZGVyIHRvIGZ1dHVyZS1wcm9vZiBtaWdyYXRpb24gZmlsZXMgYWdhaW5zdCByZW9yZ2FuaXphdGlvbnMKICAgICAgICAgaW4gbW9kdWxlcy4KCiAgICAgICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMC43LjAKICAgICAgICAgICAgOnBhcmFtcmVmOmAuRW52aXJvbm1lbnRDb250ZXh0LmNvbmZpZ3VyZS51c2VyX21vZHVsZV9wcmVmaXhgCiAgICAgICAgICAgIG5vIGxvbmdlciBkZWZhdWx0cyB0byB0aGUgdmFsdWUgb2YKICAgICAgICAgICAgOnBhcmFtcmVmOmAuRW52aXJvbm1lbnRDb250ZXh0LmNvbmZpZ3VyZS5zcWxhbGNoZW15X21vZHVsZV9wcmVmaXhgCiAgICAgICAgICAgIHdoZW4gbGVmdCBhdCBgYE5vbmVgYDsgdGhlIGBgX19tb2R1bGVfX2BgIGF0dHJpYnV0ZSBpcyBub3cgdXNlZC4KCiAgICAgICAgIC4uIHZlcnNpb25hZGRlZDo6IDAuNi4zIGFkZGVkCiAgICAgICAgICAgIDpwYXJhbXJlZjpgLkVudmlyb25tZW50Q29udGV4dC5jb25maWd1cmUudXNlcl9tb2R1bGVfcHJlZml4YAoKICAgICAgICAgLi4gc2VlYWxzbzo6CgogICAgICAgICAgICA6cmVmOmBhdXRvZ2VuX21vZHVsZV9wcmVmaXhgCgogICAgICAgIDpwYXJhbSBwcm9jZXNzX3JldmlzaW9uX2RpcmVjdGl2ZXM6IGEgY2FsbGFibGUgZnVuY3Rpb24gdGhhdCB3aWxsCiAgICAgICAgIGJlIHBhc3NlZCBhIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgdGhlIGVuZCByZXN1bHQgb2YgYW4gYXV0b2dlbmVyYXRlCiAgICAgICAgIG9yIHBsYWluICJyZXZpc2lvbiIgb3BlcmF0aW9uLCB3aGljaCBjYW4gYmUgbWFuaXB1bGF0ZWQgdG8gYWZmZWN0CiAgICAgICAgIGhvdyB0aGUgYGBhbGVtYmljIHJldmlzaW9uYGAgY29tbWFuZCB1bHRpbWF0ZWx5IG91dHB1dHMgbmV3CiAgICAgICAgIHJldmlzaW9uIHNjcmlwdHMuICAgVGhlIHN0cnVjdHVyZSBvZiB0aGUgY2FsbGFibGUgaXM6OgoKICAgICAgICAgICAgZGVmIHByb2Nlc3NfcmV2aXNpb25fZGlyZWN0aXZlcyhjb250ZXh0LCByZXZpc2lvbiwgZGlyZWN0aXZlcyk6CiAgICAgICAgICAgICAgICBwYXNzCgogICAgICAgICBUaGUgYGBkaXJlY3RpdmVzYGAgcGFyYW1ldGVyIGlzIGEgUHl0aG9uIGxpc3QgY29udGFpbmluZwogICAgICAgICBhIHNpbmdsZSA6Y2xhc3M6YC5NaWdyYXRpb25TY3JpcHRgIGRpcmVjdGl2ZSwgd2hpY2ggcmVwcmVzZW50cwogICAgICAgICB0aGUgcmV2aXNpb24gZmlsZSB0byBiZSBnZW5lcmF0ZWQuICAgIFRoaXMgbGlzdCBhcyB3ZWxsIGFzIGl0cwogICAgICAgICBjb250ZW50cyBtYXkgYmUgZnJlZWx5IG1vZGlmaWVkIHRvIHByb2R1Y2UgYW55IHNldCBvZiBjb21tYW5kcy4KICAgICAgICAgVGhlIHNlY3Rpb24gOnJlZjpgY3VzdG9taXppbmdfcmV2aXNpb25gIHNob3dzIGFuIGV4YW1wbGUgb2YKICAgICAgICAgZG9pbmcgdGhpcy4gIFRoZSBgYGNvbnRleHRgYCBwYXJhbWV0ZXIgaXMgdGhlCiAgICAgICAgIDpjbGFzczpgLk1pZ3JhdGlvbkNvbnRleHRgIGluIHVzZSwKICAgICAgICAgYW5kIGBgcmV2aXNpb25gYCBpcyBhIHR1cGxlIG9mIHJldmlzaW9uIGlkZW50aWZpZXJzIHJlcHJlc2VudGluZyB0aGUKICAgICAgICAgY3VycmVudCByZXZpc2lvbiBvZiB0aGUgZGF0YWJhc2UuCgogICAgICAgICBUaGUgY2FsbGFibGUgaXMgaW52b2tlZCBhdCBhbGwgdGltZXMgd2hlbiB0aGUgYGAtLWF1dG9nZW5lcmF0ZWBgCiAgICAgICAgIG9wdGlvbiBpcyBwYXNzZWQgdG8gYGBhbGVtYmljIHJldmlzaW9uYGAuICBJZiBgYC0tYXV0b2dlbmVyYXRlYGAKICAgICAgICAgaXMgbm90IHBhc3NlZCwgdGhlIGNhbGxhYmxlIGlzIGludm9rZWQgb25seSBpZiB0aGUKICAgICAgICAgYGByZXZpc2lvbl9lbnZpcm9ubWVudGBgIHZhcmlhYmxlIGlzIHNldCB0byBUcnVlIGluIHRoZSBBbGVtYmljCiAgICAgICAgIGNvbmZpZ3VyYXRpb24sIGluIHdoaWNoIGNhc2UgdGhlIGdpdmVuIGBgZGlyZWN0aXZlc2BgIGNvbGxlY3Rpb24KICAgICAgICAgd2lsbCBjb250YWluIGVtcHR5IDpjbGFzczpgLlVwZ3JhZGVPcHNgIGFuZCA6Y2xhc3M6YC5Eb3duZ3JhZGVPcHNgCiAgICAgICAgIGNvbGxlY3Rpb25zIGZvciBgYC51cGdyYWRlX29wc2BgIGFuZCBgYC5kb3duZ3JhZGVfb3BzYGAuICBUaGUKICAgICAgICAgYGAtLWF1dG9nZW5lcmF0ZWBgIG9wdGlvbiBpdHNlbGYgY2FuIGJlIGluZmVycmVkIGJ5IGluc3BlY3RpbmcKICAgICAgICAgYGBjb250ZXh0LmNvbmZpZy5jbWRfb3B0cy5hdXRvZ2VuZXJhdGVgYC4KCiAgICAgICAgIFRoZSBjYWxsYWJsZSBmdW5jdGlvbiBtYXkgb3B0aW9uYWxseSBiZSBhbiBpbnN0YW5jZSBvZgogICAgICAgICBhIDpjbGFzczpgLlJld3JpdGVyYCBvYmplY3QuICBUaGlzIGlzIGEgaGVscGVyIG9iamVjdCB0aGF0CiAgICAgICAgIGFzc2lzdHMgaW4gdGhlIHByb2R1Y3Rpb24gb2YgYXV0b2dlbmVyYXRlLXN0cmVhbSByZXdyaXRlciBmdW5jdGlvbnMuCgoKICAgICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMC44LjAKCiAgICAgICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMC44LjEgLSBUaGUKICAgICAgICAgICAgOnBhcmFtcmVmOmAuRW52aXJvbm1lbnRDb250ZXh0LmNvbmZpZ3VyZS5wcm9jZXNzX3JldmlzaW9uX2RpcmVjdGl2ZXNgCiAgICAgICAgICAgIGhvb2sgY2FuIGFwcGVuZCBvcCBkaXJlY3RpdmVzIGludG8gOmNsYXNzOmAuVXBncmFkZU9wc2AgYW5kCiAgICAgICAgICAgIDpjbGFzczpgLkRvd25ncmFkZU9wc2Agd2hpY2ggd2lsbCBiZSByZW5kZXJlZCBpbiBQeXRob24gcmVnYXJkbGVzcwogICAgICAgICAgICBvZiB3aGV0aGVyIHRoZSBgYC0tYXV0b2dlbmVyYXRlYGAgb3B0aW9uIGlzIGluIHVzZSBvciBub3Q7CiAgICAgICAgICAgIHRoZSBgYHJldmlzaW9uX2Vudmlyb25tZW50YGAgY29uZmlndXJhdGlvbiB2YXJpYWJsZSBzaG91bGQgYmUKICAgICAgICAgICAgc2V0IHRvICJ0cnVlIiBpbiB0aGUgY29uZmlnIHRvIGVuYWJsZSB0aGlzLgoKCiAgICAgICAgIC4uIHNlZWFsc286OgoKICAgICAgICAgICAgIDpyZWY6YGN1c3RvbWl6aW5nX3JldmlzaW9uYAoKICAgICAgICAgICAgIDpyZWY6YGF1dG9nZW5fcmV3cml0ZXJgCgoKICAgICAgICBQYXJhbWV0ZXJzIHNwZWNpZmljIHRvIGluZGl2aWR1YWwgYmFja2VuZHM6CgogICAgICAgIDpwYXJhbSBtc3NxbF9iYXRjaF9zZXBhcmF0b3I6IFRoZSAiYmF0Y2ggc2VwYXJhdG9yIiB3aGljaCB3aWxsCiAgICAgICAgIGJlIHBsYWNlZCBiZXR3ZWVuIGVhY2ggc3RhdGVtZW50IHdoZW4gZ2VuZXJhdGluZyBvZmZsaW5lIFNRTCBTZXJ2ZXIKICAgICAgICAgbWlncmF0aW9ucy4gIERlZmF1bHRzIHRvIGBgR09gYC4gIE5vdGUgdGhpcyBpcyBpbiBhZGRpdGlvbiB0byB0aGUKICAgICAgICAgY3VzdG9tYXJ5IHNlbWljb2xvbiBgYDtgYCBhdCB0aGUgZW5kIG9mIGVhY2ggc3RhdGVtZW50OyBTUUwgU2VydmVyCiAgICAgICAgIGNvbnNpZGVycyB0aGUgImJhdGNoIHNlcGFyYXRvciIgdG8gZGVub3RlIHRoZSBlbmQgb2YgYW4KICAgICAgICAgaW5kaXZpZHVhbCBzdGF0ZW1lbnQgZXhlY3V0aW9uLCBhbmQgY2Fubm90IGdyb3VwIGNlcnRhaW4KICAgICAgICAgZGVwZW5kZW50IG9wZXJhdGlvbnMgaW4gb25lIHN0ZXAuCiAgICAgICAgOnBhcmFtIG9yYWNsZV9iYXRjaF9zZXBhcmF0b3I6IFRoZSAiYmF0Y2ggc2VwYXJhdG9yIiB3aGljaCB3aWxsCiAgICAgICAgIGJlIHBsYWNlZCBiZXR3ZWVuIGVhY2ggc3RhdGVtZW50IHdoZW4gZ2VuZXJhdGluZyBvZmZsaW5lCiAgICAgICAgIE9yYWNsZSBtaWdyYXRpb25zLiAgRGVmYXVsdHMgdG8gYGAvYGAuICBPcmFjbGUgZG9lc24ndCBhZGQgYQogICAgICAgICBzZW1pY29sb24gYmV0d2VlbiBzdGF0ZW1lbnRzIGxpa2UgbW9zdCBvdGhlciBiYWNrZW5kcy4KCiAgICAgICAgTnIWAAAA2g1vdXRwdXRfYnVmZmVych0AAAByIQAAANoNdGVtcGxhdGVfYXJnc9oZdHJhbnNhY3Rpb25fcGVyX21pZ3JhdGlvbtoPdGFyZ2V0X21ldGFkYXRh2g5pbmNsdWRlX3N5bWJvbNoOaW5jbHVkZV9vYmplY3TaD2luY2x1ZGVfc2NoZW1hc9oPcmVuZGVyX2FzX2JhdGNo2g11cGdyYWRlX3Rva2Vu2g9kb3duZ3JhZGVfdG9rZW7aGHNxbGFsY2hlbXlfbW9kdWxlX3ByZWZpeNoVYWxlbWJpY19tb2R1bGVfcHJlZml42hJ1c2VyX21vZHVsZV9wcmVmaXjaDWxpdGVyYWxfYmluZHPaG3Byb2Nlc3NfcmV2aXNpb25fZGlyZWN0aXZlc9oLcmVuZGVyX2l0ZW3aDGNvbXBhcmVfdHlwZdoWY29tcGFyZV9zZXJ2ZXJfZGVmYXVsdHIIAAAAKQXaCmNvbm5lY3Rpb27aA3VybNoMZGlhbGVjdF9uYW1lWhNlbnZpcm9ubWVudF9jb250ZXh02gRvcHRzKQhyCQAAAHIHAAAAci8AAADaBnVwZGF0ZXIIAAAAcgQAAADaCWNvbmZpZ3VyZXIeAAAAKRtyCgAAAHJBAAAAckIAAAByQwAAAHIWAAAAcjEAAAByLwAAAHIdAAAAciEAAAByMAAAAHI2AAAAcjIAAAByMwAAAHI0AAAAcjUAAAByPQAAAHI/AAAAckAAAAByPgAAAHI8AAAAcjcAAAByOAAAAHI6AAAAcjkAAAByOwAAAHILAAAAckQAAAByDAAAAHIMAAAAcg0AAAByRgAAAB0BAABzVgAAAAB/AH8AfwBBBgEIAQgBCAEKAQwBDAEEAQgBBAEIAQwBDgEIAQgBCAEIAQgBCAEIAQgBCAEIAQgBCAEIAggBCAEIAQgBCgEIAQoCCgIEAQIBAgECAQIBehxFbnZpcm9ubWVudENvbnRleHQuY29uZmlndXJlYwEAAAAAAAAAAgAAAAkAAABLAAAAcywAAAB0AKABfABqAqEBjxYBAHwAoAOhAGoEZgB8AY4BAQBXAGQBUQBSAFgAZAFTACkCYYwDAABSdW4gbWlncmF0aW9ucyBhcyBkZXRlcm1pbmVkIGJ5IHRoZSBjdXJyZW50IGNvbW1hbmQgbGluZQogICAgICAgIGNvbmZpZ3VyYXRpb24KICAgICAgICBhcyB3ZWxsIGFzIHZlcnNpb25pbmcgaW5mb3JtYXRpb24gcHJlc2VudCAob3Igbm90KSBpbiB0aGUgY3VycmVudAogICAgICAgIGRhdGFiYXNlIGNvbm5lY3Rpb24gKGlmIG9uZSBpcyBwcmVzZW50KS4KCiAgICAgICAgVGhlIGZ1bmN0aW9uIGFjY2VwdHMgb3B0aW9uYWwgYGAqKmt3YGAgYXJndW1lbnRzLiAgIElmIHRoZXNlIGFyZQogICAgICAgIHBhc3NlZCwgdGhleSBhcmUgc2VudCBkaXJlY3RseSB0byB0aGUgYGB1cGdyYWRlKClgYCBhbmQKICAgICAgICBgYGRvd25ncmFkZSgpYGAKICAgICAgICBmdW5jdGlvbnMgd2l0aGluIGVhY2ggdGFyZ2V0IHJldmlzaW9uIGZpbGUuICAgQnkgbW9kaWZ5aW5nIHRoZQogICAgICAgIGBgc2NyaXB0LnB5Lm1ha29gYCBmaWxlIHNvIHRoYXQgdGhlIGBgdXBncmFkZSgpYGAgYW5kIGBgZG93bmdyYWRlKClgYAogICAgICAgIGZ1bmN0aW9ucyBhY2NlcHQgYXJndW1lbnRzLCBwYXJhbWV0ZXJzIGNhbiBiZSBwYXNzZWQgaGVyZSBzbyB0aGF0CiAgICAgICAgY29udGV4dHVhbCBpbmZvcm1hdGlvbiwgdXN1YWxseSBpbmZvcm1hdGlvbiB0byBpZGVudGlmeSBhIHBhcnRpY3VsYXIKICAgICAgICBkYXRhYmFzZSBpbiB1c2UsIGNhbiBiZSBwYXNzZWQgZnJvbSBhIGN1c3RvbSBgYGVudi5weWBgIHNjcmlwdAogICAgICAgIHRvIHRoZSBtaWdyYXRpb24gZnVuY3Rpb25z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dGhlcndpc2UgcHJvZHVjZXMgbm8gdHJhbnNhY3Rpb25hbAogICAgICAgICAgc3RhdGUgb3IgZGlyZWN0aXZlcy4KICAgICAgICAqIElmIDptZXRoOmAuaXNfb2ZmbGluZV9tb2RlYCBpcyBgYFRydWVgYCwKICAgICAgICAgIHJldHVybnMgYSBjb250ZXh0IG1hbmFnZXIgdGhhdCB3aWxsCiAgICAgICAgICBpbnZva2UgdGhlIDptZXRoOmAuRGVmYXVsdEltcGwuZW1pdF9iZWdpbmAKICAgICAgICAgIGFuZCA6bWV0aDpgLkRlZmF1bHRJbXBsLmVtaXRfY29tbWl0YAogICAgICAgICAgbWV0aG9kcywgd2hpY2ggd2lsbCBwcm9kdWNlIHRoZSBzdHJpbmcKICAgICAgICAgIGRpcmVjdGl2ZXMgYGBCRUdJTmBgIGFuZCBgYENPTU1JVGBgIG9uCiAgICAgICAgICB0aGUgb3V0cHV0IHN0cmVhbSwgYXMgcmVuZGVyZWQgYnkgdGhlCiAgICAgICAgICB0YXJnZXQgYmFja2VuZCAoZS5nLiBTUUwgU2VydmVyIHdvdWxkCiAgICAgICAgICBlbWl0IGBgQkVHSU4gVFJBTlNBQ1RJT05gYCkuCiAgICAgICAgKiBPdGhlcndpc2UsIGNhbGxzIDptZXRoOmBzcWxhbGNoZW15LmVuZ2luZS5Db25uZWN0aW9uLmJlZ2luYAogICAgICAgICAgb24gdGhlIGN1cnJlbnQgb25saW5lIGNvbm5lY3Rpb24sIHdoaWNoCiAgICAgICAgICByZXR1cm5zIGEgOmNsYXNzOmBzcWxhbGNoZW15LmVuZ2luZS5UcmFuc2FjdGlvbmAKICAgICAgICAgIG9iamVjdC4gIFRoaXMgb2JqZWN0IGRlbWFyY2F0ZXMgYSByZWFsCiAgICAgICAgICB0cmFuc2FjdGlvbiBhbmQgaXMgaXRzZWxmIGEgY29udGV4dCBtYW5hZ2VyLAogICAgICAgICAgd2hpY2ggd2lsbCByb2xsIGJhY2sgaWYgYW4gZXhjZXB0aW9uCiAgICAgICAgICBpcyByYWlzZWQuCgogICAgICAgIE5vdGUgdGhhdCBhIGN1c3RvbSBgYGVudi5weWBgIHNjcmlwdCB3aGljaAogICAgICAgIGhhcyBtb3JlIHNwZWNpZmljIHRyYW5zYWN0aW9uYWwgbmVlZHMgY2FuIG9mIGNvdXJzZQogICAgICAgIG1hbmlwdWxhdGUgdGhlIDpjbGFzczpgfnNxbGFsY2hlbXkuZW5naW5lLkNvbm5lY3Rpb25gCiAgICAgICAgZGlyZWN0bHkgdG8gcHJvZHVjZSB0cmFuc2FjdGlvbmFsIHN0YXRlIGluICJvbmxpbmUiCiAgICAgICAgbW9kZS4KCiAgICAgICAgKQJyFAAAANoRYmVnaW5fdHJhbnNhY3Rpb24pAXIKAAAAcgwAAAByDAAAAHINAAAAck0AAAA5AwAAcwIAAAAALHokRW52aXJvbm1lbnRDb250ZXh0LmJlZ2luX3RyYW5zYWN0aW9uYwEAAAAAAAAAAQAAAAIAAABDAAAAcxgAAAB8AGoAZAFrCHISdAFkAoMBggF8AGoAUwApA3qnUmV0dXJuIHRoZSBjdXJyZW50IDpjbGFzczpgLk1pZ3JhdGlvbkNvbnRleHRgIG9iamVjdC4KCiAgICAgICAgSWYgOm1ldGg6YC5FbnZpcm9ubWVudENvbnRleHQuY29uZmlndXJlYCBoYXMgbm90IGJlZW4KICAgICAgICBjYWxsZWQgeWV0LCByYWlzZXMgYW4gZXhjZXB0aW9uLgoKICAgICAgICBOeiNObyBjb250ZXh0IGhhcyBiZWVuIGNvbmZpZ3VyZWQgeWV0LikCch4AAADaCUV4Y2VwdGlvbikBcgoAAAByDAAAAHIMAAAAcg0AAAByFAAAAGcDAABzBgAAAAAICgEIAXoeRW52aXJvbm1lbnRDb250ZXh0LmdldF9jb250ZXh0YwEAAAAAAAAAAQAAAAIAAABDAAAAcwoAAAB8AKAAoQBqAVMAKQFhMwEAAFJldHVybiB0aGUgY3VycmVudCAnYmluZCcuCgogICAgICAgIEluICJvbmxpbmUiIG1vZGUsIHRoaXMgaXMgdGhlCiAgICAgICAgOmNsYXNzOmBzcWxhbGNoZW15LmVuZ2luZS5Db25uZWN0aW9uYCBjdXJyZW50bHkgYmVpbmcgdXNlZAogICAgICAgIHRvIGVtaXQgU1FMIHRvIHRoZSBkYXRhYmFzZS4KCiAgICAgICAgVGhpcyBmdW5jdGlvbiByZXF1aXJlcyB0aGF0IGEgOmNsYXNzOmAuTWlncmF0aW9uQ29udGV4dGAKICAgICAgICBoYXMgZmlyc3QgYmVlbiBtYWRlIGF2YWlsYWJsZSB2aWEgOm1ldGg6YC5jb25maWd1cmVgLgoKICAgICAgICApAnIUAAAA2gRiaW5kKQFyCgAAAHIMAAAAcgwAAAByDQAAANoIZ2V0X2JpbmRzAwAAcwIAAAAAC3obRW52aXJvbm1lbnRDb250ZXh0LmdldF9iaW5kYwEAAAAAAAAAAQAAAAIAAABDAAAAcwoAAAB8AKAAoQBqAVMAKQFOKQJyFAAAAHIVAAAAKQFyCgAAAHIMAAAAcgwAAAByDQAAANoIZ2V0X2ltcGyAAwAAcwIAAAAAAXobRW52aXJvbm1lbnRDb250ZXh0LmdldF9pbXBsKQFGKRhOTk5ORk5OTk5GTk5ORk5GRk5GcisAAAByLAAAAHItAAAAci4AAABOKQFOKRvaCF9fbmFtZV9f2gpfX21vZHVsZV9f2gxfX3F1YWxuYW1lX1/aB19fZG9jX19yHgAAAHIHAAAAcggAAAByDgAAAHIPAAAAchEAAAByEwAAAHIXAAAAchgAAAByGwAAAHIcAAAAch8AAAByIAAAAHIiAAAAcioAAAByRgAAAHJIAAAAckoAAABySwAAAHJNAAAAchQAAAByUAAAAHJRAAAAcgwAAAByDAAAAHIMAAAAcg0AAAByBgAAAAYAAABzZAAAAAg9BAIEAgQFBAcIDggMCAMIDQgOCAMIDwgOCBoIEQgUCjQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABCn8AfwB/AFYIFwoPCAsILggMCA1yBgAAAE4pCFoKb3BlcmF0aW9uc3ICAAAAWgltaWdyYXRpb25yBAAAANoAcgUAAABaDk1vZHVsZUNsc1Byb3h5cgYAAAByDAAAAHIMAAAAcgwAAAByDQAAANoIPG1vZHVsZT4BAAAAcwYAAAAMAQwBDAM=
Base64 mode: content will be decoded on save.
Save
Close
Exit & Reset
Directory Contents
Dirs: 0 × Files: 6
Delete Selected
Select All
Select None
Sort:
Name
Size
Modified
Enable drag-to-move
Name
Size
Perms
Modified
Actions
environment.cpython-37.opt-1.pyc
34.15 KB
lrw-r--r--
2023-11-14 11:45:20
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
environment.cpython-37.pyc
34.15 KB
lrw-r--r--
2023-11-14 11:45:20
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
migration.cpython-37.opt-1.pyc
23.46 KB
lrw-r--r--
2023-11-14 11:45:20
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
migration.cpython-37.pyc
23.46 KB
lrw-r--r--
2023-11-14 11:45:20
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
__init__.cpython-37.opt-1.pyc
160 B
lrw-r--r--
2023-11-14 11:45:20
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
__init__.cpython-37.pyc
160 B
lrw-r--r--
2023-11-14 11:45:20
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).