REDROOM
PHP 8.2.30
Path:
Logout
Edit File
Size: 97.25 KB
Close
/opt/hc_python/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/interfaces.cpython-312.pyc
Text
Base64
yw0NCgAAAAD5ke9nhbkBAOMAAAAAAAAAAAAAAAAKAAAAAAAAAfNmBgAAlwBkAFoAZAFkAmwBbQJaAgEAZAFkA2wDbQRaBAEAZAFkBGwFbQZaBgEAZAFkBWwHbQhaCAEAZAFkBmwHbQlaCQEAZAFkB2wHbQpaCgEAZAFkCGwHbQtaCwEAZAFkCWwHbQxaDAEAZAFkCmwHbQ1aDQEAZAFkC2wHbQ5aDgEAZAFkDGwHbQ9aDwEAZAFkDWwHbRBaEAEAZAFkDmwHbRFaEQEAZAFkD2wHbRJaEgEAZAFkEGwHbRNaEwEAZAFkEWwHbRRaFAEAZAFkEmwHbRVaFQEAZAFkE2wHbRZaFgEAZAFkFGwHbRdaFwEAZAFkFWwHbRhaGAEAZAFkFmwHbRlaGQEAZAFkF2wHbRpaGgEAZBhkGWwbbRxaHAEAZBhkGmwdbR5aHgEAZBhkG2wfbSBaIAEAZBhkHGwfbSFaIQEAZBhkHWwibSNaIwEAZBhkHWwibSNaIwEAZBhkHmwibSRaJAEAZBhkHmwibSRaJAEAZBhkH2wcbSVaJQEAZBhkIGwmbSdaJwEAZBhkIWwobSlaKQEAZBhkImwobSpaKgEAZBhkI2wobStaKwEAZBhkJGwobSxaLAEAZRhyimQlZCZsLW0uWi4BAGQlZCdsLW0vWi8BAGQlZChsMG0xWjEBAGQlZClsMm0zWjMBAGQYZCpsHW00WjQBAGQYZCtsHW01WjUBAGQYZCxsNm03WjcBAGQYZC1sOG05WjkBAGQYZC5sIm06WjoBAGQYZC9sIm07WjsBAGQYZDBsIm08WjwBAGQYZDFsIm09Wj0BAGQYZDJsIm0+Wj4BAGQYZDNsIm0/Wj8BAGQYZDRsQG1BWkEBAGQYZDVsQG1CWkIBAGQYZDZsQ21EWkQBAGQYZDdsQ21FWkUBAGQYZDhsQ21GWkYBAGQYZBFsQ20UWkcBAGQYZDlsSG1JWkkBAGQYZDpsSm1LWksBAGQYZDtsSm1MWkwBAGUWZRRlTRkAAABlEmVNZQhmAhkAAABmAhkAAABaTgIAZRlkPGQ9rD6rAgAAAAAAAFpPAgBHAGQ/hABkQGUEqwMAAAAAAABaUAIARwBkQYQAZEJlBKsDAAAAAAAAWlECAEcAZEOEAGREZSurAwAAAAAAAFpSAgBHAGRFhABkRmUrqwMAAAAAAABaUwIARwBkR4QAZEhlK6sDAAAAAAAAWlRlEWVNZQhmAhkAAABaVWUSZU1lCGYCGQAAAFpWZRRlVRkAAABaV2UaZVdlVWYCGQAAAFpYZRplFGUIGQAAAGVVZgIZAAAAWlllGmUUZRRlCBkAAAAZAAAAZVdmAhkAAABaWmUaZVplWWYCGQAAAFpbZRRlFmVNZEZlE2VcGQAAAGUTZVwZAAAAZRNlXBkAAABlE2VcGQAAAGUTZV0ZAAAAZgcZAAAAGQAAAFpeZVlaX2VaWmBlW1phZRJlCGRJZgIZAAAAWmJlEWUTZU0ZAAAAZRNlTRkAAABmAhkAAABaY2UlZU1lCGYCGQAAAFpkZSlkShkAAABaZWUQZRZlTWUIZEtmAxkAAAAZAAAAWmZlKWRMGQAAAFpnAgBHAGRNhABkTmUsZE+sUKsEAAAAAAAAWmhlJWVNZQhmAhkAAABaaWUaZWhlEWVNZQhmAhkAAABmAhkAAABaagIARwBkUYQAZFJlLKsDAAAAAAAAWmsCAEcAZFOEAGRUZSyrAwAAAAAAAFpsAgBHAGRVhABkVmUsqwMAAAAAAABabQIARwBkV4QAZFhlLKsDAAAAAAAAWm4CAEcAZFmEAGRaZW6rAwAAAAAAAFpvAgBHAGRbhABkXGVuqwMAAAAAAABacAIARwBkXYQAZF5lbqsDAAAAAAAAWnECAEcAZF+EAGRgZW6rAwAAAAAAAFpyAgBHAGRhhABkYmUsqwMAAAAAAABacwIARwBkY4QAZGRlLKsDAAAAAAAAWnQCAEcAZGWEAGRmZQSrAwAAAAAAAFp1ZRZlGmVcZU1mAhkAAABkZ2YCGQAAAFp2ZRZlE2VNGQAAAGVNZgIZAAAAWncCAEcAZGiEAGRpZR6rAwAAAAAAAFp4AgBHAGRqhABka6sCAAAAAAAAWnkCAEcAZGyEAGRtqwIAAAAAAABaegIARwBkboQAZG9lHqsDAAAAAAAAWntle1p8AgBHAGRwhABkcasCAAAAAAAAWn0CAEcAZHKEAGRzqwIAAAAAAABafnl0KXV6MURlZmluZSBjb3JlIGludGVyZmFjZXMgdXNlZCBieSB0aGUgZW5naW5lIHN5c3RlbS7pAAAAACkB2gthbm5vdGF0aW9ucykB2gRFbnVtKQHaCk1vZHVsZVR5cGUpAdoDQW55KQHaCUF3YWl0YWJsZSkB2ghDYWxsYWJsZSkB2ghDbGFzc1ZhcikB2gpDb2xsZWN0aW9uKQHaBERpY3QpAdoISXRlcmFibGUpAdoISXRlcmF0b3IpAdoETGlzdCkB2gdNYXBwaW5nKQHaDk11dGFibGVNYXBwaW5nKQHaCE9wdGlvbmFsKQHaCFNlcXVlbmNlKQHaA1NldCkB2gVUdXBsZSkB2gRUeXBlKQHaDVRZUEVfQ0hFQ0tJTkcpAdoHVHlwZVZhcikB2gVVbmlvbukCAAAAKQHaBHV0aWwpAdoLRXZlbnRUYXJnZXQpAdoEUG9vbCkB2hVQb29sUHJveGllZENvbm5lY3Rpb24pAdoIQ29tcGlsZWQpAdoMVHlwZUNvbXBpbGVyKQHaDWltbXV0YWJsZWRpY3QpAdoKYXdhaXRfb25seSkB2gdMaXRlcmFsKQHaC05vdFJlcXVpcmVkKQHaCFByb3RvY29sKQHaCVR5cGVkRGljdOkBAAAAKQHaCkNvbm5lY3Rpb24pAdoGRW5naW5lKQHaDEN1cnNvclJlc3VsdCkB2gNVUkwpAdoPX0xpc3RlbmVyRm5UeXBlKQHaCmRpc3BhdGNoZXIpAdoOU3RhdGVtZW50RXJyb3IpAdoKRXhlY3V0YWJsZSkB2hZfSW5zZXJ0TWFueVZhbHVlc0JhdGNoKQHaC0RETENvbXBpbGVyKQHaEklkZW50aWZpZXJQcmVwYXJlcikB2hxJbnNlcnRtYW55dmFsdWVzU2VudGluZWxPcHRzKQHaB0xpbnRpbmcpAdoLU1FMQ29tcGlsZXIpAdoNQmluZFBhcmFtZXRlcikB2g1DbGF1c2VFbGVtZW50KQHaBkNvbHVtbikB2hBEZWZhdWx0R2VuZXJhdG9yKQHaClNjaGVtYUl0ZW0pAdoHSW50ZWdlcikB2g1fVHlwZU1lbW9EaWN0KQHaClR5cGVFbmdpbmXaAl9UcgYAAAApAdoFYm91bmRjAAAAAAAAAAAAAAAAAQAAAAAAAAHzIAAAAJcAZQBaAWQAWgJkAVoDZAJaBGQDWgVkBFoGZAVaB3kGKQfaCkNhY2hlU3RhdHNyAgAAAHImAAAAchkAAADpAwAAAOkEAAAATikI2ghfX25hbWVfX9oKX19tb2R1bGVfX9oMX19xdWFsbmFtZV9f2glDQUNIRV9ISVTaCkNBQ0hFX01JU1PaEENBQ0hJ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AAkACQAJAGTKZHyEBVokZFNkU2R4nAIJAAkACQAJAAkACQAJAAkACQBky2R9hAZaJQkAZMUJAAkACQAJAAkACQAJAGTMZH6EBVomCQBkxQkACQAJAAkACQAJAAkAZMxkf4QFWicJAGTFCQAJAAkACQAJAAkACQBkzGSAhAVaKAkAZMUJAAkACQAJAAkACQAJAGTMZIGEBVopCQBkxQkACQAJAAkACQAJAAkAZMxkgoQFWioJAGTFCQAJAAkACQAJAAkACQBkzGSDhAVaK2TNZISEBFosCQBkxQkACQAJAAkACQAJAAkACQAJAGTOZIWEBVotCQBkxQkACQAJAAkACQAJAAkACQAJAGTPZIaEBVouZFNkU2R4nAIJAAkACQAJAAkACQAJAAkACQBk0GSHhAZaLwkAZMUJAAkACQAJAAkACQAJAAkACQBk0WSIhAVaMGRTZFNkeJwCCQAJAAkACQAJAAkACQAJAAkAZNJkiYQGWjEJAGTFCQAJAAkACQAJAAkACQAJAAkAZNNkioQFWjJkU2RTZHicAgkACQAJAAkACQAJAAkACQAJAGTUZIuEBlozCQBkxQkACQAJAAkACQAJAAkACQAJAGTVZIyEBVo0ZFNkU2R4nAIJAAkACQAJAAkACQAJAAkACQBk1mSNhAZaNQkAZMUJAAkACQAJAAkACQAJAAkACQBk12SOhAVaNmRTZFNkeJwCCQAJAAkACQAJAAkACQAJAAkAZNhkj4QGWjdk2WSQhARaOGTZZJGEBFo5CQBkxQkACQAJAAkACQAJAAkACQAJAGTaZJKEBVo6CQBkxQkACQAJAAkACQAJAAkACQAJAAkACQBk22SThAVaOwkAZMUJAAkACQAJAAkACQAJAAkACQBk3GSUhAVaPAkACQAJAAkACQAJAAkACQBk3WSVhARaPWTeZJaEBFo+ZN9kl4QEWj9k4GSYhARaQGTgZJmEBFpBZOBkmoQEWkJk4WSbhARaQ2ThZJyEBFpEZOJknYQEWkVk4mSehARaRgkACQAJAAkACQAJAAkACQBk42SfhARaR2TkZKCEBFpIZOVkoYQEWkkJAAkACQAJAAkACQBk5WSihARaSmTlZKOEBFpLZOZkpIQEWkxk5mSlhARaTQkACQBk5wkACQAJAAkACQAJAAkACQAJAGToZKaEBVpOCQAJAGTnCQAJAAkACQAJAAkACQAJAAkAZOhkp4QFWk9k6WSohARaUAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQBk6mSphARaUQkAZMUJAAkACQAJAAkACQAJAAkACQBk62SqhAVaUgkAZMUJAAkACQAJAAkACQAJAAkACQBk7GSrhAVaUwkAZMUJAAkACQAJAAkACQAJAGTtZKyEBVpUCQAJAAkACQAJAAkACQAJAGTuZK2EBFpVZO9kroQEWlZk8GSvhARaV2TxZLCEBFpYZOFksYQEWlkJAAkACQAJAAkACQBk8mSyhARaWgkACQAJAAkAZPNks4QEWlsJAAkACQAJAGT0ZLSEBFpcCQAJAAkACQBk9WS1hARaXQkACQAJAAkACQAJAGT2ZLaEBFpeZRpk92S3hASrAAAAAAAAAFpfZRpk92S4hASrAAAAAAAAAFpgZRpk+GS5hASrAAAAAAAAAFphZRpk+WS6hASrAAAAAAAAAFpiZPpku4QEWmMJAAkACQAJAAkACQBk+2S8hARaZAkACQAJAAkACQAJAGT8ZL2EBFplZP1kvoQEWmZ5Uyn+2gdEaWFsZWN0YWUCAABEZWZpbmUgdGhlIGJlaGF2aW9yIG9mIGEgc3BlY2lmaWMgZGF0YWJhc2UgYW5kIERCLUFQSSBjb21iaW5hdGlvbi4KCiAgICBBbnkgYXNwZWN0IG9mIG1ldGFkYXRhIGRlZmluaXRpb24sIFNRTCBxdWVyeSBnZW5lcmF0aW9uLAogICAgZXhlY3V0aW9uLCByZXN1bHQtc2V0IGhhbmRsaW5nLCBvciBhbnl0aGluZyBlbHNlIHdoaWNoIHZhcmllcwogICAgYmV0d2VlbiBkYXRhYmFzZXMgaXMgZGVmaW5lZCB1bmRlciB0aGUgZ2VuZXJhbCBjYXRlZ29yeSBvZiB0aGUKICAgIERpYWxlY3QuICBUaGUgRGlhbGVjdCBhY3RzIGFzIGEgZmFjdG9yeSBmb3Igb3RoZXIKICAgIGRhdGFiYXNlLXNwZWNpZmljIG9iamVjdCBpbXBsZW1lbnRhdGlvbnMgaW5jbHVkaW5nCiAgICBFeGVjdXRpb25Db250ZXh0LCBDb21waWxlZCwgRGVmYXVsdEdlbmVyYXRvciwgYW5kIFR5cGVFbmdpbmUuCgogICAgLi4gbm90ZTo6IFRoaXJkIHBhcnR5IGRpYWxlY3RzIHNob3VsZCBub3Qgc3ViY2xhc3MgOmNsYXNzOmAuRGlhbGVjdGAKICAgICAgIGRpcmVjdGx5LiAgSW5zdGVhZCwgc3ViY2xhc3MgOmNsYXNzOmAuZGVmYXVsdC5EZWZhdWx0RGlhbGVjdGAgb3IKICAgICAgIGRlc2NlbmRhbnQgY2xhc3MuCgogICAgehNkaXNwYXRjaGVyW0RpYWxlY3Rd2ghkaXNwYXRjaHKYAAAAcscAAADaBmRyaXZlctoTZGlhbGVjdF9kZXNjcmlwdGlvbnoUT3B0aW9uYWxbTW9kdWxlVHlwZV3aBWRiYXBpYwEAAAAAAAAAAAAAAAIAAAADAAAB8xYAAACXAHQBAAAAAAAAAACrAAAAAAAAAIIBKQF6f3NhbWUgYXMgLmRiYXBpLCBidXQgaXMgbmV2ZXIgTm9uZTsgd2lsbCByYWlzZSBhbiBlcnJvciBpZiBubwogICAgICAgIERCQVBJIHdhcyBzZXQgdXAuCgogICAgICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuMAoKICAgICAgICCpAdoTTm90SW1wbGVtZW50ZWRFcnJvcnJYAAAAcwEAAAAgck0AAADaDGxvYWRlZF9kYmFwaXoURGlhbGVjdC5sb2FkZWRfZGJhcGmsAgAA8w0AAACAAPQQAA8i0w4j0AgjckwAAAByYgAAANoKcG9zaXRpb25hbNoKcGFyYW1zdHlsZXIzAAAA2hBjb21waWxlcl9saW50aW5nehFUeXBlW1NRTENvbXBpbGVyXdoSc3RhdGVtZW50X2NvbXBpbGVyehFUeXBlW0RETENvbXBpbGVyXdoMZGRsX2NvbXBpbGVyehxDbGFzc1ZhcltUeXBlW1R5cGVDb21waWxlcl1d2hF0eXBlX2NvbXBpbGVyX2Nsc3IfAAAA2hZ0eXBlX2NvbXBpbGVyX2luc3RhbmNlcgYAAADaDXR5cGVfY29tcGlsZXJ6GFR5cGVbSWRlbnRpZmllclByZXBhcmVyXdoIcHJlcGFyZXJyMQAAANoTaWRlbnRpZmllcl9wcmVwYXJlcnoZT3B0aW9uYWxbVHVwbGVbQW55LCAuLi5dXdoTc2VydmVyX3ZlcnNpb25faW5mb3LKAAAA2hNkZWZhdWx0X3NjaGVtYV9uYW1lehhPcHRpb25hbFtJc29sYXRpb25MZXZlbF3aF2RlZmF1bHRfaXNvbGF0aW9uX2xldmVs2htfb25fY29ubmVjdF9pc29sYXRpb25fbGV2ZWx6FlR5cGVbRXhlY3V0aW9uQ29udGV4dF3aEWV4ZWN1dGlvbl9jdHhfY2xzejRVbmlvbltUeXBlW1R1cGxlW0FueSwgLi4uXV0sIFR5cGVbVHVwbGVbTGlzdFtBbnldXV1d2hdleGVjdXRlX3NlcXVlbmNlX2Zvcm1hdNoOc3VwcG9ydHNfYWx0ZXJybwAAANoVbWF4X2lkZW50aWZpZXJfbGVuZ3Ro2hxzdXBwb3J0c19zZXJ2ZXJfc2lkZV9jdXJzb3Jz2hNzZXJ2ZXJfc2lkZV9jdXJzb3Jz2hZzdXBwb3J0c19zYW5lX3Jvd2NvdW502hxzdXBwb3J0c19zYW5lX211bHRpX3Jvd2NvdW502hVzdXBwb3J0c19lbXB0eV9pbnNlcnTaF3N1cHBvcnRzX2RlZmF1bHRfdmFsdWVz2hpzdXBwb3J0c19kZWZhdWx0X21ldGF2YWx1ZdoHREVGQVVMVNoXZGVmYXVsdF9tZXRhdmFsdWVfdG9rZW7aG3N1cHBvcnRzX211bHRpdmFsdWVzX2luc2VydNocaW5zZXJ0X2V4ZWN1dGVtYW55X3JldHVybmluZ9o0aW5zZXJ0X2V4ZWN1dGVtYW55X3JldHVybmluZ19zb3J0X2J5X3BhcmFtZXRlcl9vcmRlctocdXBkYXRlX2V4ZWN1dGVtYW55X3JldHVybmluZ9ocZGVsZXRlX2V4ZWN1dGVtYW55X3JldHVybmluZ9oUdXNlX2luc2VydG1hbnl2YWx1ZXPaIXVzZV9pbnNlcnRtYW55dmFsdWVzX3dvX3JldHVybmluZ3IyAAAA2iJpbnNlcnRtYW55dmFsdWVzX2ltcGxpY2l0X3NlbnRpbmVscq0AAADaH2luc2VydG1hbnl2YWx1ZXNfbWF4X3BhcmFtZXRlcnPaInByZWV4ZWN1dGVfYXV0b2luY3JlbWVudF9zZXF1ZW5jZXPaEGluc2VydF9yZXR1cm5pbmfaEHVwZGF0ZV9yZXR1cm5pbmfaGnVwZGF0ZV9yZXR1cm5pbmdfbXVsdGlmcm9t2hBkZWxldGVfcmV0dXJuaW5n2hpkZWxldGVfcmV0dXJuaW5nX211bHRpZnJvbdoeZmF2b3JfcmV0dXJuaW5nX292ZXJfbGFzdHJvd2lk2hlzdXBwb3J0c19pZGVudGl0eV9jb2x1bW5z2hJjdGVfZm9sbG93c19pbnNlcnR6PE11dGFibGVNYXBwaW5nW1R5cGVbVHlwZUVuZ2luZVtBbnldXSwgVHlwZVtUeXBlRW5naW5lW0FueV1dXdoIY29sc3BlY3PaEnN1cHBvcnRzX3NlcXVlbmNlc9oSc2VxdWVuY2VzX29wdGlvbmFs2hVkZWZhdWx0X3NlcXVlbmNlX2Jhc2XaFHN1cHBvcnRzX25hdGl2ZV9lbnVt2hdzdXBwb3J0c19uYXRpdmVfYm9vbGVhbtoXc3VwcG9ydHNfbmF0aXZlX2RlY2ltYWzaFHN1cHBvcnRzX25hdGl2ZV91dWlk2hRyZXR1cm5zX25hdGl2ZV9ieXRlc056UE9wdGlvbmFsW0xpc3RbVHVwbGVbVHlwZVtVbmlvbltTY2hlbWFJdGVtLCBDbGF1c2VFbGVtZW50XV0sIE1hcHBpbmdbc3RyLCBBbnldXV1d2hNjb25zdHJ1Y3RfYXJndW1lbnRzcksAAAD6DVNlcXVlbmNlW3N0cl3aEnJlZmxlY3Rpb25fb3B0aW9uc3oRTWFwcGluZ1tzdHIsIHN0cl3aH2RiYXBpX2V4Y2VwdGlvbl90cmFuc2xhdGlvbl9tYXDaEXN1cHBvcnRzX2NvbW1lbnRz2g9pbmxpbmVfY29tbWVudHPaHHN1cHBvcnRzX2NvbnN0cmFpbnRfY29tbWVudHNGVNoYc3VwcG9ydHNfc3RhdGVtZW50X2NhY2hl2hlfc3VwcG9ydHNfc3RhdGVtZW50X2NhY2hl2ghpc19hc3luY9oNaGFzX3Rlcm1pbmF0ZXoRTWFwcGluZ1tzdHIsIEFueV3aE2VuZ2luZV9jb25maWdfdHlwZXNyvAAAANoMbGFiZWxfbGVuZ3RoehJPcHRpb25hbFtTZXRbQW55XV3aF2luY2x1ZGVfc2V0X2lucHV0X3NpemVz2hdleGNsdWRlX3NldF9pbnB1dF9zaXplc9oec3VwcG9ydHNfc2ltcGxlX29yZGVyX2J5X2xhYmVs2g9kaXZfaXNfZmxvb3JkaXbaD3R1cGxlX2luX3ZhbHVlc9oZX2JpbmRfdHlwaW5nX3JlbmRlcl9jYXN0c3ouTXV0YWJsZU1hcHBpbmdbVHlwZUVuZ2luZVtBbnldLCBfVHlwZU1lbW9EaWN0XdoLX3R5cGVfbWVtb3NjAQAAAAAAAAAAAAAAAgAAAAMAAAHzFgAAAJcAdAEAAAAAAAAAAKsAAAAAAAAAggFyVwAAAHL7AAAAclgAAABzAQAAACByTQAAANoSX2J1aWx0aW5fb25jb25uZWN0ehpEaWFsZWN0Ll9idWlsdGluX29uY29ubmVjdK8EAADzCwAAAIAA3A4h0w4j0AgjckwAAABjAgAAAAAAAAAAAAAAAgAAAAMAAAHzFgAAAJcAdAEAAAAAAAAAAKsAAAAAAAAAggEpAWHCAwAAQnVpbGQgREItQVBJIGNvbXBhdGlibGUgY29ubmVjdGlvbiBhcmd1bWVudHMuCgogICAgICAgIEdpdmVuIGEgOmNsYXNzOmAuVVJMYCBvYmplY3QsIHJldHVybnMgYSB0dXBsZQogICAgICAgIGNvbnNpc3Rpbmcgb2YgYSBgYCgqYXJncywgKiprd2FyZ3MpYGAgc3VpdGFibGUgdG8gc2VuZCBkaXJlY3RseQogICAgICAgIHRvIHRoZSBkYmFwaSdzIGNvbm5lY3QgZnVuY3Rpb24uICAgVGhlIGFyZ3VtZW50cyBhcmUgc2VudCB0byB0aGUKICAgICAgICA6bWV0aDpgLkRpYWxlY3QuY29ubmVjdGAgbWV0aG9kIHdoaWNoIHRoZW4gcnVucyB0aGUgREJBUEktbGV2ZWwKICAgICAgICBgYGNvbm5lY3QoKWBgIGZ1bmN0aW9uLgoKICAgICAgICBUaGUgbWV0aG9kIHR5cGljYWxseSBtYWtlcyB1c2Ugb2YgdGhlCiAgICAgICAgOm1ldGg6YC5VUkwudHJhbnNsYXRlX2Nvbm5lY3RfYXJnc2AKICAgICAgICBtZXRob2QgaW4gb3JkZXIgdG8gZ2VuZXJhdGUgYSBkaWN0aW9uYXJ5IG9mIG9wdGlvbnMuCgogICAgICAgIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzOjoKCiAgICAgICAgICAgIGRlZiBjcmVhdGVfY29ubmVjdF9hcmdzKHNlbGYsIHVybCk6CiAgICAgICAgICAgICAgICBvcHRzID0gdXJsLnRyYW5zbGF0ZV9jb25uZWN0X2Fy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d2l0aCBhCiAgICAgICAgY29ubmVjdGlvbi4KCiAgICAgICAgQWxsb3dzIGRpYWxlY3RzIHRvIGNvbmZpZ3VyZSBvcHRpb25zIGJhc2VkIG9uIHNlcnZlciB2ZXJzaW9uIGluZm8gb3IKICAgICAgICBvdGhlciBwcm9wZXJ0aWVzLgoKICAgICAgICBUaGUgY29ubmVjdGlvbiBwYXNzZWQgaGVyZSBpcyBhIFNRTEFsY2hlbXkgQ29ubmVjdGlvbiBvYmplY3QsCiAgICAgICAgd2l0aCBmdWxsIGNhcGFiaWxpdGllcy4KCiAgICAgICAgVGhlIGluaXRpYWxpemUoKSBtZXRob2Qgb2YgdGhlIGJhc2UgZGlhbGVjdCBzaG91bGQgYmUgY2FsbGVkIHZpYQogICAgICAgIHN1cGVyKCkuCgogICAgICAgIC4uIG5vdGU6OiBhcyBvZiBTUUxBbGNoZW15IDEuNCwgdGhpcyBtZXRob2QgaXMgY2FsbGVkICoqYmVmb3JlKioKICAgICAgICAgICBhbnkgOm1ldGg6YF9lbmdpbmUuRGlhbGVjdC5vbl9jb25uZWN0YCBob29rcyBhcmUgY2FsbGVkLgoKICAgICAgICBOcksAAACpAnJZAAAA2gpjb25uZWN0aW9ucwIAAAAgIHJNAAAA2gppbml0aWFsaXplehJEaWFsZWN0LmluaXRpYWxpemXzBAAAcwcAAACAAPAkAAkNckwAAABjAgAAAAAAAAAAAAAAAAAAAAMAAAHzBAAAAJcAeQByVwAAAHJLAAAAKQJyWQAAANoLbWV0aG9kX25hbWVzAgAAACAgck0AAADaEl9vdmVycmlkZXNfZGVmYXVsdHoaRGlhbGVjdC5fb3ZlcnJpZGVzX2RlZmF1bHQJBQAAcwQAAACAAMADckwAAABjBAAAAAAAAAAAAAAAAgAAAAsAAAHzFgAAAJcAdAEAAAAAAAAAAKsAAAAAAAAAggEpAWGbAQAAUmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IGNvbHVtbnMgaW4gYGB0YWJsZV9uYW1lYGAuCgogICAgICAgIEdpdmVuIGEgOmNsYXNzOmBfZW5naW5lLkNvbm5lY3Rpb25gLCBhIHN0cmluZwogICAgICAgIGBgdGFibGVfbmFtZWBgLCBhbmQgYW4gb3B0aW9uYWwgc3RyaW5nIGBgc2NoZW1hYGAsIHJldHVybiBjb2x1bW4KICAgICAgICBpbmZvcm1hdGlvbiBhcyBhIGxpc3Qgb2YgZGljdGlvbmFyaWVzCiAgICAgICAgY29ycmVzcG9uZGluZyB0byB0aGUgOmNsYXNzOmAuUmVmbGVjdGVkQ29sdW1uYCBkaWN0aW9uYXJ5LgoKICAgICAgICBUaGlzIGlzIGFuIGludGVybmFsIGRpYWxlY3QgbWV0aG9kLiBBcHBsaWNhdGlvbnMgc2hvdWxkIHVzZQogICAgICAgIDptZXRoOmAuSW5zcGVjdG9yLmdldF9jb2x1bW5zYC4KCiAgICAgICAgcvsAAACpBXJZAAAAclsBAADaCnRhYmxlX25hbWXaBnNjaGVtYdoCa3dzBQAAACAgICAgck0AAADaC2dldF9jb2x1bW5zehNEaWFsZWN0LmdldF9jb2x1bW5zCwUAAPMNAAAAgAD0JgAPItMOI9AII3JMAAAAKQJyYwEAANoMZmlsdGVyX25hbWVzYwIAAAAAAAAAAgAAAAIAAAALAAAB8xYAAACXAHQBAAAAAAAAAACrAAAAAAAAAIIBKQFhqgIAAFJldHVybiBpbmZvcm1hdGlvbiBhYm91dCBjb2x1bW5zIGluIGFsbCB0YWJsZXMgaW4gdGhlCiAgICAgICAgZ2l2ZW4gYGBzY2hlbWFgYC4KCiAgICAgICAgVGhpcyBpcyBhbiBpbnRlcm5hbCBkaWFsZWN0IG1ldGhvZC4gQXBwbGljYXRpb25zIHNob3VsZCB1c2UKICAgICAgICA6bWV0aDpgLkluc3BlY3Rvci5nZXRfbXVsdGlfY29sdW1uc2AuCgogICAgICAgIC4uIG5vdGU6OiBUaGUgOmNsYXNzOmBfZW5naW5lLkRlZmF1bHREaWFsZWN0YCBwcm92aWRlcyBhIGRlZmF1bHQKICAgICAgICAgIGltcGxlbWVudGF0aW9uIHRoYXQgd2lsbCBjYWxsIHRoZSBzaW5nbGUgdGFibGUgbWV0aG9kIGZvcgogICAgICAgICAgZWFjaCBvYmplY3QgcmV0dXJuZWQgYnkgOm1ldGg6YERpYWxlY3QuZ2V0X3RhYmxlX25hbWVzYCwKICAgICAgICAgIDptZXRoOmBEaWFsZWN0LmdldF92aWV3X25hbWVzYCBvcgogICAgICAgICAgOm1ldGg6YERpYWxlY3QuZ2V0X21hdGVyaWFsaXplZF92aWV3X25hbWVzYCBkZXBlbmRpbmcgb24gdGhlCiAgICAgICAgICBwcm92aWRlZCBgYGtpbmRgYC4gRGlhbGVjdHMgdGhhdCB3YW50IHRvIHN1cHBvcnQgYSBmYXN0ZXIKICAgICAgICAgIGltcGxlbWVudGF0aW9uIHNob3VsZCBpbXBsZW1lbnQgdGhpcyBtZXRob2QuCgogICAgICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuMAoKICAgICAgICBy+wAAAKkFclkAAAByWwEAAHJjAQAAcmcBAAByZAEAAHMFAAAAICAgICByTQAAANoRZ2V0X211bHRpX2NvbHVtbnN6GURpYWxlY3QuZ2V0X211bHRpX2NvbHVtbnMgBQAA8w0AAACAAPQ0AA8i0w4j0AgjckwAAABjBAAAAAAAAAAAAAAAAgAAAAsAAAHzFgAAAJcAdAEAAAAAAAAAAKsAAAAAAAAAggEpAWHCAQAAUmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwcmltYXJ5IGtleSBjb25zdHJhaW50IG9uCiAgICAgICAgdGFibGVfbmFtZWAuCgogICAgICAgIEdpdmVuIGEgOmNsYXNzOmBfZW5naW5lLkNvbm5lY3Rpb25gLCBhIHN0cmluZwogICAgICAgIGBgdGFibGVfbmFtZWBgLCBhbmQgYW4gb3B0aW9uYWwgc3RyaW5nIGBgc2NoZW1hYGAsIHJldHVybiBwcmltYXJ5CiAgICAgICAga2V5IGluZm9ybWF0aW9uIGFzIGEgZGljdGlvbmFyeSBjb3JyZXNwb25kaW5nIHRvIHRoZQogICAgICAgIDpjbGFzczpgLlJlZmxlY3RlZFByaW1hcnlLZXlDb25zdHJhaW50YCBkaWN0aW9uYXJ5LgoKICAgICAgICBUaGlzIGlzIGFuIGludGVybmFsIGRpYWxlY3QgbWV0aG9kLiBBcHBsaWNhdGlvbnMgc2hvdWxkIHVzZQogICAgICAgIDptZXRoOmAuSW5zcGVjdG9yLmdldF9wa19jb25zdHJhaW50YC4KCiAgICAgICAgcvsAAAByYQEAAHMFAAAAICAgICByTQAAANoRZ2V0X3BrX2NvbnN0cmFpbnR6GURpYWxlY3QuZ2V0X3BrX2NvbnN0cmFpbnQ8BQAAcmYBAAByTAAAAGMCAAAAAAAAAAIAAAACAAAACwAAAfMWAAAAlwB0AQAAAAAAAAAAqwAAAAAAAACCASkBYcACAABSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgcHJpbWFyeSBrZXkgY29uc3RyYWludHMgaW4KICAgICAgICBhbGwgdGFibGVzIGluIHRoZSBnaXZlbiBgYHNjaGVtYWBgLgoKICAgICAgICBUaGlzIGlzIGFuIGludGVybmFsIGRpYWxlY3QgbWV0aG9kLiBBcHBsaWNhdGlvbnMgc2hvdWxkIHVzZQogICAgICAgIDptZXRoOmAuSW5zcGVjdG9yLmdldF9tdWx0aV9wa19jb25zdHJhaW50YC4KCiAgICAgICAgLi4gbm90ZTo6IFRoZSA6Y2xhc3M6YF9lbmdpbmUuRGVmYXVsdERpYWxlY3RgIHByb3ZpZGVzIGEgZGVmYXVsdAogICAgICAgICAgaW1wbGVtZW50YXRpb24gdGhhdCB3aWxsIGNhbGwgdGhlIHNpbmdsZSB0YWJsZSBtZXRob2QgZm9yCiAgICAgICAgICBlYWNoIG9iamVjdCByZXR1cm5lZCBieSA6bWV0aDpgRGlhbGVjdC5nZXRfdGFibGVfbmFtZXNgLAogICAgICAgICAgOm1ldGg6YERpYWxlY3QuZ2V0X3ZpZXdfbmFtZXNgIG9yCiAgICAgICAgICA6bWV0aDpgRGlhbGVjdC5nZXRfbWF0ZXJpYWxpemVkX3ZpZXdfbmFtZXNgIGRlcGVuZGluZyBvbiB0aGUKICAgICAgICAgIHByb3ZpZGVkIGBga2luZGBgLiBEaWFsZWN0cyB0aGF0IHdhbnQgdG8gc3VwcG9ydCBhIGZhc3RlcgogICAgICAgICAgaW1wbGVtZW50YXRpb24gc2hvdWxkIGltcGxlbWVudCB0aGlzIG1ldGhvZC4KCiAgICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMi4wCgogICAgICAgIHL7AAAAcmkBAABzBQAAACAgICAgck0AAADaF2dldF9tdWx0aV9wa19jb25zdHJhaW50eh9EaWFsZWN0LmdldF9tdWx0aV9wa19jb25zdHJhaW50UQUAAPMNAAAAgAD0MgAPItMOI9AII3JMAAAAYwQAAAAAAAAAAAAAAAIAAAALAAAB8xYAAACXAHQBAAAAAAAAAACrAAAAAAAAAIIBKQFhtwEAAFJldHVybiBpbmZvcm1hdGlvbiBhYm91dCBmb3JlaWduX2tleXMgaW4gYGB0YWJsZV9uYW1lYGAuCgogICAgICAgIEdpdmVuIGEgOmNsYXNzOmBfZW5naW5lLkNvbm5lY3Rpb25gLCBhIHN0cmluZwogICAgICAgIGBgdGFibGVfbmFtZWBgLCBhbmQgYW4gb3B0aW9uYWwgc3RyaW5nIGBgc2NoZW1hYGAsIHJldHVybiBmb3JlaWduCiAgICAgICAga2V5IGluZm9ybWF0aW9uIGFzIGEgbGlzdCBvZiBkaWN0cyBjb3JyZXNwb25kaW5nIHRvIHRoZQogICAgICAgIDpjbGFzczpgLlJlZmxlY3RlZEZvcmVpZ25LZXlDb25zdHJhaW50YCBkaWN0aW9uYXJ5LgoKICAgICAgICBUaGlzIGlzIGFuIGludGVybmFsIGRpYWxlY3QgbWV0aG9kLiBBcHBsaWNhdGlvbnMgc2hvdWxkIHVzZQogICAgICAgIDptZXRoOmBfZW5naW5lLkluc3BlY3Rvci5nZXRfZm9yZWlnbl9rZXlzYC4KICAgICAgICBy+wAAAHJhAQAAcwUAAAAgICAgIHJNAAAA2hBnZXRfZm9yZWlnbl9rZXlzehhEaWFsZWN0LmdldF9mb3JlaWduX2tleXNsBQAA8w0AAACAAPQkAA8i0w4j0AgjckwAAABjAgAAAAAAAAACAAAAAgAAAAsAAAHzFgAAAJcAdAEAAAAAAAAAAKsAAAAAAAAAggEpAWG7AgAAUmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IGZvcmVpZ25fa2V5cyBpbiBhbGwgdGFibGVzCiAgICAgICAgaW4gdGhlIGdpdmVuIGBgc2NoZW1hYGAuCgogICAgICAgIFRoaXMgaXMgYW4gaW50ZXJuYWwgZGlhbGVjdCBtZXRob2QuIEFwcGxpY2F0aW9ucyBzaG91bGQgdXNlCiAgICAgICAgOm1ldGg6YF9lbmdpbmUuSW5zcGVjdG9yLmdldF9tdWx0aV9mb3JlaWduX2tleXNgLgoKICAgICAgICAuLiBub3RlOjogVGhlIDpjbGFzczpgX2VuZ2luZS5EZWZhdWx0RGlhbGVjdGAgcHJvdmlkZXMgYSBkZWZhdWx0CiAgICAgICAgICBpbXBsZW1lbnRhdGlvbiB0aGF0IHdpbGwgY2FsbCB0aGUgc2luZ2xlIHRhYmxlIG1ldGhvZCBmb3IKICAgICAgICAgIGVhY2ggb2JqZWN0IHJldHVybmVkIGJ5IDptZXRoOmBEaWFsZWN0LmdldF90YWJsZV9uYW1lc2AsCiAgICAgICAgICA6bWV0aDpgRGlhbGVjdC5nZXRfdmlld19uYW1lc2Agb3IKICAgICAgICAgIDptZXRoOmBEaWFsZWN0LmdldF9tYXRlcmlhbGl6ZWRfdmlld19uYW1lc2AgZGVwZW5kaW5nIG9uIHRoZQogICAgICAgICAgcHJvdmlkZWQgYGBraW5kYGAuIERpYWxlY3RzIHRoYXQgd2FudCB0byBzdXBwb3J0IGEgZmFzdGVyCiAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBzaG91bGQgaW1wbGVtZW50IHRoaXMgbWV0aG9kLgoKICAgICAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjAKCiAgICAgICAgcvsAAAByaQEAAHMFAAAAICAgICByTQAAANoWZ2V0X211bHRpX2ZvcmVpZ25fa2V5c3oeRGlhbGVjdC5nZXRfbXVsdGlfZm9yZWlnbl9rZXlzgAUAAHJrAQAAckwAAABjAwAAAAAAAAAAAAAAAgAAAAsAAAHzFgAAAJcAdAEAAAAAAAAAAKsAAAAAAAAAggEpAXquUmV0dXJuIGEgbGlzdCBvZiB0YWJsZSBuYW1lcyBmb3IgYGBzY2hlbWFgYC4KCiAgICAgICAgVGhpcyBpcyBhbiBpbnRlcm5hbCBkaWFsZWN0IG1ldGhvZC4gQXBwbGljYXRpb25zIHNob3VsZCB1c2UKICAgICAgICA6bWV0aDpgX2VuZ2luZS5JbnNwZWN0b3IuZ2V0X3RhYmxlX25hbWVzYC4KCiAgICAgICAgcvsAAACpBHJZAAAAclsBAAByYwEAAHJkAQAAcwQAAAAgICAgck0AAADaD2dldF90YWJsZV9uYW1lc3oXRGlhbGVjdC5nZXRfdGFibGVfbmFtZXOcBQAA8w0AAACAAPQUAA8i0w4j0AgjckwAAABjAwAAAAAAAAAAAAAAAgAAAAsAAAHzFgAAAJcAdAEAAAAAAAAAAKsAAAAAAAAAggEpAXr2UmV0dXJuIGEgbGlzdCBvZiB0ZW1wb3JhcnkgdGFibGUgbmFtZXMgb24gdGhlIGdpdmVuIGNvbm5lY3Rpb24sCiAgICAgICAgaWYgc3VwcG9ydGVkIGJ5IHRoZSB1bmRlcmx5aW5nIGJhY2tlbmQuCgogICAgICAgIFRoaXMgaXMgYW4gaW50ZXJuYWwgZGlhbGVjdCBtZXRob2QuIEFwcGxpY2F0aW9ucyBzaG91bGQgdXNlCiAgICAgICAgOm1ldGg6YF9lbmdpbmUuSW5zcGVjdG9yLmdldF90ZW1wX3RhYmxlX25hbWVzYC4KCiAgICAgICAgcvsAAABydwEAAHMEAAAAICAgIHJNAAAA2hRnZXRfdGVtcF90YWJsZV9uYW1lc3ocRGlhbGVjdC5nZXRfdGVtcF90YWJsZV9uYW1lc6gFAADzDQAAAIAA9BYADyLTDiPQCCNyTAAAAGMDAAAAAAAAAAAAAAACAAAACwAAAfMWAAAAlwB0AQAAAAAAAAAAqwAAAAAAAACCASkBYR0BAABSZXR1cm4gYSBsaXN0IG9mIGFsbCBub24tbWF0ZXJpYWxpemVkIHZpZXcgbmFtZXMgYXZhaWxhYmxlIGluIHRoZQogICAgICAgIGRhdGFiYXNlLgoKICAgICAgICBUaGlzIGlzIGFuIGludGVybmFsIGRpYWxlY3QgbWV0aG9kLiBBcHBsaWNhdGlvbnMgc2hvdWxkIHVzZQogICAgICAgIDptZXRoOmBfZW5naW5lLkluc3BlY3Rvci5nZXRfdmlld19uYW1lc2AuCgogICAgICAgIDpwYXJhbSBzY2hlbWE6IHNjaGVtYSBuYW1lIHRvIHF1ZXJ5LCBpZiBub3QgdGhlIGRlZmF1bHQgc2NoZW1hLgoKICAgICAgICBy+wAAAHJ3AQAAcwQAAAAgICAgck0AAADaDmdldF92aWV3X25hbWVzehZEaWFsZWN0LmdldF92aWV3X25hbWVztQUAAPMNAAAAgAD0GgAPItMOI9AII3JMAAAAYwMAAAAAAAAAAAAAAAIAAAALAAAB8xYAAACXAHQBAAAAAAAAAACrAAAAAAAAAIIBKQFhRgEAAFJldHVybiBhIGxpc3Qgb2YgYWxsIG1hdGVyaWFsaXplZCB2aWV3IG5hbWVzIGF2YWlsYWJsZSBpbiB0aGUKICAgICAgICBkYXRhYmFzZS4KCiAgICAgICAgVGhpcyBpcyBhbiBpbnRlcm5hbCBkaWFsZWN0IG1ldGhvZC4gQXBwbGljYXRpb25zIHNob3VsZCB1c2UKICAgICAgICA6bWV0aDpgX2VuZ2luZS5JbnNwZWN0b3IuZ2V0X21hdGVyaWFsaXplZF92aWV3X25hbWVzYC4KCiAgICAgICAgOnBhcmFtIHNjaGVtYTogc2NoZW1hIG5hbWUgdG8gcXVlcnksIGlmIG5vdCB0aGUgZGVmYXVsdCBzY2hlbWEuCgogICAgICAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjAKCiAgICAgICAgcvsAAABydwEAAHMEAAAAICAgIHJNAAAA2htnZXRfbWF0ZXJpYWxpemVkX3ZpZXdfbmFtZXN6I0RpYWxlY3QuZ2V0X21hdGVyaWFsaXplZF92aWV3X25hbWVzxAUAAPMNAAAAgAD0HgAPItMOI9AII3JMAAAAYwMAAAAAAAAAAAAAAAIAAAALAAAB8xYAAACXAHQBAAAAAAAAAACrAAAAAAAAAIIBKQFhKgEAAFJldHVybiBhIGxpc3Qgb2YgYWxsIHNlcXVlbmNlIG5hbWVzIGF2YWlsYWJsZSBpbiB0aGUgZGF0YWJhc2UuCgogICAgICAgIFRoaXMgaXMgYW4gaW50ZXJuYWwgZGlhbGVjdCBtZXRob2QuIEFwcGxpY2F0aW9ucyBzaG91bGQgdXNlCiAgICAgICAgOm1ldGg6YF9lbmdpbmUuSW5zcGVjdG9yLmdldF9zZXF1ZW5jZV9uYW1lc2AuCgogICAgICAgIDpwYXJhbSBzY2hlbWE6IHNjaGVtYSBuYW1lIHRvIHF1ZXJ5LCBpZiBub3QgdGhlIGRlZmF1bHQgc2NoZW1hLgoKICAgICAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAxLjQKICAgICAgICBy+wAAAHJ3AQAAcwQAAAAgICAgck0AAADaEmdldF9zZXF1ZW5jZV9uYW1lc3oaRGlhbGVjdC5nZXRfc2VxdWVuY2VfbmFtZXPVBQAAcn8BAAByTAAAAGMDAAAAAAAAAAAAAAACAAAACwAAAfMWAAAAlwB0AQAAAAAAAAAAqwAAAAAAAACCASkBevRSZXR1cm4gYSBsaXN0IG9mIHRlbXBvcmFyeSB2aWV3IG5hbWVzIG9uIHRoZSBnaXZlbiBjb25uZWN0aW9uLAogICAgICAgIGlmIHN1cHBvcnRlZCBieSB0aGUgdW5kZXJseWluZyBiYWNrZW5kLgoKICAgICAgICBUaGlzIGlzIGFuIGludGVybmFsIGRpYWxlY3QgbWV0aG9kLiBBcHBsaWNhdGlvbnMgc2hvdWxkIHVzZQogICAgICAgIDptZXRoOmBfZW5naW5lLkluc3BlY3Rvci5nZXRfdGVtcF92aWV3X25hbWVzYC4KCiAgICAgICAgcvsAAABydwEAAHMEAAAAICAgIHJNAAAA2hNnZXRfdGVtcF92aWV3X25hbWVzehtEaWFsZWN0LmdldF90ZW1wX3ZpZXdfbmFtZXPkBQAAcnwBAAByTAAAAGMCAAAAAAAAAAAAAAACAAAACwAAAfMWAAAAlwB0AQAAAAAAAAAAqwAAAAAAAACCASkBer5SZXR1cm4gYSBsaXN0IG9mIGFsbCBzY2hlbWEgbmFtZXMgYXZhaWxhYmxlIGluIHRoZSBkYXRhYmFzZS4KCiAgICAgICAgVGhpcyBpcyBhbiBpbnRlcm5hbCBkaWFsZWN0IG1ldGhvZC4gQXBwbGljYXRpb25zIHNob3VsZCB1c2UKICAgICAgICA6bWV0aDpgX2VuZ2luZS5JbnNwZWN0b3IuZ2V0X3NjaGVtYV9uYW1lc2AuCiAgICAgICAgcvsAAAApA3JZAAAAclsBAAByZAEAAHMDAAAAICAgck0AAADaEGdldF9zY2hlbWFfbmFtZXN6GERpYWxlY3QuZ2V0X3NjaGVtYV9uYW1lc/EFAADzDQAAAIAA9AwADyLTDiPQCCNyTAAAAGMEAAAAAAAAAAAAAAACAAAACwAAAfMWAAAAlwB0AQAAAAAAAAAAqwAAAAAAAACCASkBYUcBAABSZXR1cm4gcGxhaW4gb3IgbWF0ZXJpYWxpemVkIHZpZXcgZGVmaW5pdGlvbi4KCiAgICAgICAgVGhpcyBpcyBhbiBpbnRlcm5hbCBkaWFsZWN0IG1ldGhvZC4gQXBwbGljYXRpb25zIHNob3VsZCB1c2UKICAgICAgICA6bWV0aDpgX2VuZ2luZS5JbnNwZWN0b3IuZ2V0X3ZpZXdfZGVmaW5pdGlvbmAuCgogICAgICAgIEdpdmVuIGEgOmNsYXNzOmBfZW5naW5lLkNvbm5lY3Rpb25gLCBhIHN0cmluZwogICAgICAgIGBgdmlld19uYW1lYGAsIGFuZCBhbiBvcHRpb25hbCBzdHJpbmcgYGBzY2hlbWFgYCwgcmV0dXJuIHRoZSB2aWV3CiAgICAgICAgZGVmaW5pdGlvbi4KICAgICAgICBy+wAAACkFclkAAAByWwEAANoJdmlld19uYW1lcmMBAAByZAEAAHMFAAAAICAgICByTQAAANoTZ2V0X3ZpZXdfZGVmaW5pdGlvbnobRGlhbGVjdC5nZXRfdmlld19kZWZpbml0aW9u+QUAAPMNAAAAgAD0IgAPItMOI9AII3JMAAAAYwQAAAAAAAAAAAAAAAIAAAALAAAB8xYAAACXAHQBAAAAAAAAAACrAAAAAAAAAIIBKQFhlwEAAFJldHVybiBpbmZvcm1hdGlvbiBhYm91dCBpbmRleGVzIGluIGBgdGFibGVfbmFtZWBgLgoKICAgICAgICBHaXZlbiBhIDpjbGFzczpgX2VuZ2luZS5Db25uZWN0aW9uYCwgYSBzdHJpbmcKICAgICAgICBgYHRhYmxlX25hbWVgYCBhbmQgYW4gb3B0aW9uYWwgc3RyaW5nIGBgc2NoZW1hYGAsIHJldHVybiBpbmRleAogICAgICAgIGluZm9ybWF0aW9uIGFzIGEgbGlzdCBvZiBkaWN0aW9uYXJpZXMgY29ycmVzcG9uZGluZyB0byB0aGUKICAgICAgICA6Y2xhc3M6YC5SZWZsZWN0ZWRJbmRleGAgZGljdGlvbmFyeS4KCiAgICAgICAgVGhpcyBpcyBhbiBpbnRlcm5hbCBkaWFsZWN0IG1ldGhvZC4gQXBwbGljYXRpb25zIHNob3VsZCB1c2UKICAgICAgICA6bWV0aDpgLkluc3BlY3Rvci5nZXRfaW5kZXhlc2AuCiAgICAgICAgcvsAAAByYQEAAHMFAAAAICAgICByTQAAANoLZ2V0X2luZGV4ZXN6E0RpYWxlY3QuZ2V0X2luZGV4ZXMMBgAAcnMBAAByTAAAAGMCAAAAAAAAAAIAAAACAAAACwAAAfMWAAAAlwB0AQAAAAAAAAAAqwAAAAAAAACCASkBYa0CAABSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgaW5kZXhlcyBpbiBpbiBhbGwgdGFibGVzCiAgICAgICAgaW4gdGhlIGdpdmVuIGBgc2NoZW1hYGAuCgogICAgICAgIFRoaXMgaXMgYW4gaW50ZXJuYWwgZGlhbGVjdCBtZXRob2QuIEFwcGxpY2F0aW9ucyBzaG91bGQgdXNlCiAgICAgICAgOm1ldGg6YC5JbnNwZWN0b3IuZ2V0X211bHRpX2luZGV4ZXNgLgoKICAgICAgICAuLiBub3RlOjogVGhlIDpjbGFzczpgX2VuZ2luZS5EZWZhdWx0RGlhbGVjdGAgcHJvdmlkZXMgYSBkZWZhdWx0CiAgICAgICAgICBpbXBsZW1lbnRhdGlvbiB0aGF0IHdpbGwgY2FsbCB0aGUgc2luZ2xlIHRhYmxlIG1ldGhvZCBmb3IKICAgICAgICAgIGVhY2ggb2JqZWN0IHJldHVybmVkIGJ5IDptZXRoOmBEaWFsZWN0LmdldF90YWJsZV9uYW1lc2AsCiAgICAgICAgICA6bWV0aDpgRGlhbGVjdC5nZXRfdmlld19uYW1lc2Agb3IKICAgICAgICAgIDptZXRoOmBEaWFsZWN0LmdldF9tYXRlcmlhbGl6ZWRfdmlld19uYW1lc2AgZGVwZW5kaW5nIG9uIHRoZQogICAgICAgICAgcHJvdmlkZWQgYGBraW5kYGAuIERpYWxlY3RzIHRoYXQgd2FudCB0byBzdXBwb3J0IGEgZmFzdGVyCiAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBzaG91bGQgaW1wbGVtZW50IHRoaXMgbWV0aG9kLgoKICAgICAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjAKCiAgICAgICAgcvsAAAByaQEAAHMFAAAAICAgICByTQAAANoRZ2V0X211bHRpX2luZGV4ZXN6GURpYWxlY3QuZ2V0X211bHRpX2luZGV4ZXMgBgAAcmsBAAByTAAAAGMEAAAAAAAAAAAAAAACAAAACwAAAfMWAAAAlwB0AQAAAAAAAAAAqwAAAAAAAACCASkBYZYBAABSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgdW5pcXVlIGNvbnN0cmFpbnRzIGluIGBgdGFibGVfbmFtZWBgLgoKICAgICAgICBHaXZlbiBhIHN0cmluZyBgYHRhYmxlX25hbWVgYCBhbmQgYW4gb3B0aW9uYWwgc3RyaW5nIGBgc2NoZW1hYGAsIHJldHVybgogICAgICAgIHVuaXF1ZSBjb25zdHJhaW50IGluZm9ybWF0aW9uIGFzIGEgbGlzdCBvZiBkaWN0cyBjb3JyZXNwb25kaW5nCiAgICAgICAgdG8gdGhlIDpjbGFzczpgLlJlZmxlY3RlZFVuaXF1ZUNvbnN0cmFpbnRgIGRpY3Rpb25hcnkuCgogICAgICAgIFRoaXMgaXMgYW4gaW50ZXJuYWwgZGlhbGVjdCBtZXRob2QuIEFwcGxpY2F0aW9ucyBzaG91bGQgdXNlCiAgICAgICAgOm1ldGg6YC5JbnNwZWN0b3IuZ2V0X3VuaXF1ZV9jb25zdHJhaW50c2AuCiAgICAgICAgcvsAAAByYQEAAHMFAAAAICAgICByTQAAANoWZ2V0X3VuaXF1ZV9jb25zdHJhaW50c3oeRGlhbGVjdC5nZXRfdW5pcXVlX2NvbnN0cmFpbnRzPAYAAHKNAQAAckwAAABjAgAAAAAAAAACAAAAAgAAAAsAAAHzFgAAAJcAdAEAAAAAAAAAAKsAAAAAAAAAggEpAWHAAgAAUmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHVuaXF1ZSBjb25zdHJhaW50cyBpbiBhbGwgdGFibGVzCiAgICAgICAgaW4gdGhlIGdpdmVuIGBgc2NoZW1hYGAuCgogICAgICAgIFRoaXMgaXMgYW4gaW50ZXJuYWwgZGlhbGVjdCBtZXRob2QuIEFwcGxpY2F0aW9ucyBzaG91bGQgdXNlCiAgICAgICAgOm1ldGg6YC5JbnNwZWN0b3IuZ2V0X211bHRpX3VuaXF1ZV9jb25zdHJhaW50c2AuCgogICAgICAgIC4uIG5vdGU6OiBUaGUgOmNsYXNzOmBfZW5naW5lLkRlZmF1bHREaWFsZWN0YCBwcm92aWRlcyBhIGRlZmF1bHQKICAgICAgICAgIGltcGxlbWVudGF0aW9uIHRoYXQgd2lsbCBjYWxsIHRoZSBzaW5nbGUgdGFibGUgbWV0aG9kIGZvcgogICAgICAgICAgZWFjaCBvYmplY3QgcmV0dXJuZWQgYnkgOm1ldGg6YERpYWxlY3QuZ2V0X3RhYmxlX25hbWVzYCwKICAgICAgICAgIDptZXRoOmBEaWFsZWN0LmdldF92aWV3X25hbWVzYCBvcgogICAgICAgICAgOm1ldGg6YERpYWxlY3QuZ2V0X21hdGVyaWFsaXplZF92aWV3X25hbWVzYCBkZXBlbmRpbmcgb24gdGhlCiAgICAgICAgICBwcm92aWRlZCBgYGtpbmRgYC4gRGlhbGVjdHMgdGhhdCB3YW50IHRvIHN1cHBvcnQgYSBmYXN0ZXIKICAgICAgICAgIGltcGxlbWVudGF0aW9uIHNob3VsZCBpbXBsZW1lbnQgdGhpcyBtZXRob2QuCgogICAgICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuMAoKICAgICAgICBy+wAAAHJpAQAAcwUAAAAgICAgIHJNAAAA2hxnZXRfbXVsdGlfdW5pcXVlX2NvbnN0cmFpbnRzeiREaWFsZWN0LmdldF9tdWx0aV91bmlxdWVfY29uc3RyYWludHNPBgAAcmsBAAByTAAAAGMEAAAAAAAAAAAAAAACAAAACwAAAfMWAAAAlwB0AQAAAAAAAAAAqwAAAAAAAACCASkBYZMBAABSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgY2hlY2sgY29uc3RyYWludHMgaW4gYGB0YWJsZV9uYW1lYGAuCgogICAgICAgIEdpdmVuIGEgc3RyaW5nIGBgdGFibGVfbmFtZWBgIGFuZCBhbiBvcHRpb25hbCBzdHJpbmcgYGBzY2hlbWFgYCwgcmV0dXJuCiAgICAgICAgY2hlY2sgY29uc3RyYWludCBpbmZvcm1hdGlvbiBhcyBhIGxpc3Qgb2YgZGljdHMgY29ycmVzcG9uZGluZwogICAgICAgIHRvIHRoZSA6Y2xhc3M6YC5SZWZsZWN0ZWRDaGVja0NvbnN0cmFpbnRgIGRpY3Rpb25hcnkuCgogICAgICAgIFRoaXMgaXMgYW4gaW50ZXJuYWwgZGlhbGVjdCBtZXRob2QuIEFwcGxpY2F0aW9ucyBzaG91bGQgdXNlCiAgICAgICAgOm1ldGg6YC5JbnNwZWN0b3IuZ2V0X2NoZWNrX2NvbnN0cmFpbnRzYC4KCiAgICAgICAgcvsAAAByYQEAAHMFAAAAICAgICByTQAAANoVZ2V0X2NoZWNrX2NvbnN0cmFpbnRzeh1EaWFsZWN0LmdldF9jaGVja19jb25zdHJhaW50c2sGAABycwEAAHJMAAAAYwIAAAAAAAAAAgAAAAIAAAALAAAB8xYAAACXAHQBAAAAAAAAAACrAAAAAAAAAIIBKQFhvgIAAFJldHVybiBpbmZvcm1hdGlvbiBhYm91dCBjaGVjayBjb25zdHJhaW50cyBpbiBhbGwgdGFibGVzCiAgICAgICAgaW4gdGhlIGdpdmVuIGBgc2NoZW1hYGAuCgogICAgICAgIFRoaXMgaXMgYW4gaW50ZXJuYWwgZGlhbGVjdCBtZXRob2QuIEFwcGxpY2F0aW9ucyBzaG91bGQgdXNlCiAgICAgICAgOm1ldGg6YC5JbnNwZWN0b3IuZ2V0X211bHRpX2NoZWNrX2NvbnN0cmFpbnRzYC4KCiAgICAgICAgLi4gbm90ZTo6IFRoZSA6Y2xhc3M6YF9lbmdpbmUuRGVmYXVsdERpYWxlY3RgIHByb3ZpZGVzIGEgZGVmYXVsdAogICAgICAgICAgaW1wbGVtZW50YXRpb24gdGhhdCB3aWxsIGNhbGwgdGhlIHNpbmdsZSB0YWJsZSBtZXRob2QgZm9yCiAgICAgICAgICBlYWNoIG9iamVjdCByZXR1cm5lZCBieSA6bWV0aDpgRGlhbGVjdC5nZXRfdGFibGVfbmFtZXNgLAogICAgICAgICAgOm1ldGg6YERpYWxlY3QuZ2V0X3ZpZXdfbmFtZXNgIG9yCiAgICAgICAgICA6bWV0aDpgRGlhbGVjdC5nZXRfbWF0ZXJpYWxpemVkX3ZpZXdfbmFtZXNgIGRlcGVuZGluZyBvbiB0aGUKICAgICAgICAgIHByb3ZpZGVkIGBga2luZGBgLiBEaWFsZWN0cyB0aGF0IHdhbnQgdG8gc3VwcG9ydCBhIGZhc3RlcgogICAgICAgICAgaW1wbGVtZW50YXRpb24gc2hvdWxkIGltcGxlbWVudCB0aGlzIG1ldGhvZC4KCiAgICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMi4wCgogICAgICAgIHL7AAAAcmkBAABzBQAAACAgICAgck0AAADaG2dldF9tdWx0aV9jaGVja19jb25zdHJhaW50c3ojRGlhbGVjdC5nZXRfbXVsdGlfY2hlY2tfY29uc3RyYWludHN/BgAAcmsBAAByTAAAAGMEAAAAAAAAAAAAAAACAAAACwAAAfMWAAAAlwB0AQAAAAAAAAAAqwAAAAAAAACCASkBetRSZXR1cm4gYSBkaWN0aW9uYXJ5IG9mIG9wdGlvbnMgc3BlY2lmaWVkIHdoZW4gYGB0YWJsZV9uYW1lYGAKICAgICAgICB3YXMgY3JlYXRlZC4KCiAgICAgICAgVGhpcyBpcyBhbiBpbnRlcm5hbCBkaWFsZWN0IG1ldGhvZC4gQXBwbGljYXRpb25zIHNob3VsZCB1c2UKICAgICAgICA6bWV0aDpgX2VuZ2luZS5JbnNwZWN0b3IuZ2V0X3RhYmxlX29wdGlvbnNgLgogICAgICAgIHL7AAAAcmEBAABzBQAAACAgICAgck0AAADaEWdldF90YWJsZV9vcHRpb25zehlEaWFsZWN0LmdldF90YWJsZV9vcHRpb25zmwYAAHJ/AQAAckwAAABjAgAAAAAAAAACAAAAAgAAAAsAAAHzFgAAAJcAdAEAAAAAAAAAAKsAAAAAAAAAggEpAWHKAgAAUmV0dXJuIGEgZGljdGlvbmFyeSBvZiBvcHRpb25zIHNwZWNpZmllZCB3aGVuIHRoZSB0YWJsZXMgaW4gdGhlCiAgICAgICAgZ2l2ZW4gc2NoZW1hIHdlcmUgY3JlYXRlZC4KCiAgICAgICAgVGhpcyBpcyBhbiBpbnRlcm5hbCBkaWFsZWN0IG1ldGhvZC4gQXBwbGljYXRpb25zIHNob3VsZCB1c2UKICAgICAgICA6bWV0aDpgX2VuZ2luZS5JbnNwZWN0b3IuZ2V0X211bHRpX3RhYmxlX29wdGlvbnNgLgoKICAgICAgICAuLiBub3RlOjogVGhlIDpjbGFzczpgX2VuZ2luZS5EZWZhdWx0RGlhbGVjdGAgcHJvdmlkZXMgYSBkZWZhdWx0CiAgICAgICAgICBpbXBsZW1lbnRhdGlvbiB0aGF0IHdpbGwgY2FsbCB0aGUgc2luZ2xlIHRhYmxlIG1ldGhvZCBmb3IKICAgICAgICAgIGVhY2ggb2JqZWN0IHJldHVybmVkIGJ5IDptZXRoOmBEaWFsZWN0LmdldF90YWJsZV9uYW1lc2AsCiAgICAgICAgICA6bWV0aDpgRGlhbGVjdC5nZXRfdmlld19uYW1lc2Agb3IKICAgICAgICAgIDptZXRoOmBEaWFsZWN0LmdldF9tYXRlcmlhbGl6ZWRfdmlld19uYW1lc2AgZGVwZW5kaW5nIG9uIHRoZQogICAgICAgICAgcHJvdmlkZWQgYGBraW5kYGAuIERpYWxlY3RzIHRoYXQgd2FudCB0byBzdXBwb3J0IGEgZmFzdGVyCiAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBzaG91bGQgaW1wbGVtZW50IHRoaXMgbWV0aG9kLgoKICAgICAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjAKCiAgICAgICAgcvsAAAByaQEAAHMFAAAAICAgICByTQAAANoXZ2V0X211bHRpX3RhYmxlX29wdGlvbnN6H0RpYWxlY3QuZ2V0X211bHRpX3RhYmxlX29wdGlvbnOqBgAAcnABAAByTAAAAGMEAAAAAAAAAAAAAAACAAAACwAAAfMWAAAAlwB0AQAAAAAAAAAAqwAAAAAAAACCASkBYQQCAABSZXR1cm4gdGhlICJjb21tZW50IiBmb3IgdGhlIHRhYmxlIGlkZW50aWZpZWQgYnkgYGB0YWJsZV9uYW1lYGAuCgogICAgICAgIEdpdmVuIGEgc3RyaW5nIGBgdGFibGVfbmFtZWBgIGFuZCBhbiBvcHRpb25hbCBzdHJpbmcgYGBzY2hlbWFgYCwgcmV0dXJuCiAgICAgICAgdGFibGUgY29tbWVudCBpbmZvcm1hdGlvbiBhcyBhIGRpY3Rpb25hcnkgY29ycmVzcG9uZGluZyB0byB0aGUKICAgICAgICA6Y2xhc3M6YC5SZWZsZWN0ZWRUYWJsZUNvbW1lbnRgIGRpY3Rpb25hcnkuCgogICAgICAgIFRoaXMgaXMgYW4gaW50ZXJuYWwgZGlhbGVjdCBtZXRob2QuIEFwcGxpY2F0aW9ucyBzaG91bGQgdXNlCiAgICAgICAgOm1ldGg6YC5JbnNwZWN0b3IuZ2V0X3RhYmxlX2NvbW1lbnRgLgoKICAgICAgICA6cmFpc2U6IGBgTm90SW1wbGVtZW50ZWRFcnJvcmBgIGZvciBkaWFsZWN0cyB0aGF0IGRvbid0IHN1cHBvcnQKICAgICAgICAgY29tbWVudHMuCgogICAgICAgIC4uIHZlcnNpb25hZGRlZDo6IDEuMgoKICAgICAgICBy+wAAAHJhAQAAcwUAAAAgICAgIHJNAAAA2hFnZXRfdGFibGVfY29tbWVudHoZRGlhbGVjdC5nZXRfdGFibGVfY29tbWVudMUGAABzDQAAAIAA9C4ADyLTDiPQCCNyTAAAAGMCAAAAAAAAAAIAAAACAAAACwAAAfMWAAAAlwB0AQAAAAAAAAAAqwAAAAAAAACCASkBYcECAABSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRhYmxlIGNvbW1lbnQgaW4gYWxsIHRhYmxlcwogICAgICAgIGluIHRoZSBnaXZlbiBgYHNjaGVtYWBgLgoKICAgICAgICBUaGlzIGlzIGFuIGludGVybmFsIGRpYWxlY3QgbWV0aG9kLiBBcHBsaWNhdGlvbnMgc2hvdWxkIHVzZQogICAgICAgIDptZXRoOmBfZW5naW5lLkluc3BlY3Rvci5nZXRfbXVsdGlfdGFibGVfY29tbWVudGAuCgogICAgICAgIC4uIG5vdGU6OiBUaGUgOmNsYXNzOmBfZW5naW5lLkRlZmF1bHREaWFsZWN0YCBwcm92aWRlcyBhIGRlZmF1bHQKICAgICAgICAgIGltcGxlbWVudGF0aW9uIHRoYXQgd2lsbCBjYWxsIHRoZSBzaW5nbGUgdGFibGUgbWV0aG9kIGZvcgogICAgICAgICAgZWFjaCBvYmplY3QgcmV0dXJuZWQgYnkgOm1ldGg6YERpYWxlY3QuZ2V0X3RhYmxlX25hbWVzYCwKICAgICAgICAgIDptZXRoOmBEaWFsZWN0LmdldF92aWV3X25hbWVzYCBvcgogICAgICAgICAgOm1ldGg6YERpYWxlY3QuZ2V0X21hdGVyaWFsaXplZF92aWV3X25hbWVzYCBkZXBlbmRpbmcgb24gdGhlCiAgICAgICAgICBwcm92aWRlZCBgYGtpbmRgYC4gRGlhbGVjdHMgdGhhdCB3YW50IHRvIHN1cHBvcnQgYSBmYXN0ZXIKICAgICAgICAgIGltcGxlbWVudGF0aW9uIHNob3VsZCBpbXBsZW1lbnQgdGhpcyBtZXRob2QuCgogICAgICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuMAoKICAgICAgICBy+wAAAHJpAQAAcwUAAAAgICAgIHJNAAAA2hdnZXRfbXVsdGlfdGFibGVfY29tbWVudHofRGlhbGVjdC5nZXRfbXVsdGlfdGFibGVfY29tbWVudN4GAAByawEAAHJMAAAAYwIAAAAAAAAAAAAAAAIAAAADAAAB8xYAAACXAHQBAAAAAAAAAACrAAAAAAAAAIIBKQF6u2NvbnZlcnQgdGhlIGdpdmVuIG5hbWUgdG8gbG93ZXJjYXNlIGlmIGl0IGlzIGRldGVjdGVkIGFzCiAgICAgICAgY2FzZSBpbnNlbnNpdGl2ZS4KCiAgICAgICAgVGhpcyBtZXRob2QgaXMgb25seSB1c2VkIGlmIHRoZSBkaWFsZWN0IGRlZmluZXMKICAgICAgICByZXF1aXJlc19uYW1lX25vcm1hbGl6ZT1UcnVlLgoKICAgICAgICBy+wAAAKkCclkAAAByxwAAAHMCAAAAICByTQAAANoObm9ybWFsaXplX25hbWV6FkRpYWxlY3Qubm9ybWFsaXplX25hbWX6BgAAcv4AAAByTAAAAGMCAAAAAAAAAAAAAAACAAAAAwAAAfMWAAAAlwB0AQAAAAAAAAAAqwAAAAAAAACCASkBethjb252ZXJ0IHRoZSBnaXZlbiBuYW1lIHRvIGEgY2FzZSBpbnNlbnNpdGl2ZSBpZGVudGlmaWVyCiAgICAgICAgZm9yIHRoZSBiYWNrZW5kIGlmIGl0IGlzIGFuIGFsbC1sb3dlcmNhc2UgbmFtZS4KCiAgICAgICAgVGhpcyBtZXRob2QgaXMgb25seSB1c2VkIGlmIHRoZSBkaWFsZWN0IGRlZmluZXMKICAgICAgICByZXF1aXJlc19uYW1lX25vcm1hbGl6ZT1UcnVlLgoKICAgICAgICBy+wAAAHKjAQAAcwIAAAAgIHJNAAAA2hBkZW5vcm1hbGl6ZV9uYW1lehhEaWFsZWN0LmRlbm9ybWFsaXplX25hbWUEBwAAcv4AAAByTAAAAGMEAAAAAAAAAAAAAAACAAAACwAAAfMWAAAAlwB0AQAAAAAAAAAAqwAAAAAAAACCASkBYQEGAABGb3IgaW50ZXJuYWwgZGlhbGVjdCB1c2UsIGNoZWNrIHRoZSBleGlzdGVuY2Ugb2YgYSBwYXJ0aWN1bGFyIHRhYmxlCiAgICAgICAgb3IgdmlldyBpbiB0aGUgZGF0YWJhc2UuCgogICAgICAgIEdpdmVuIGEgOmNsYXNzOmBfZW5naW5lLkNvbm5lY3Rpb25gIG9iamVjdCwgYSBzdHJpbmcgdGFibGVfbmFtZSBhbmQKICAgICAgICBvcHRpb25hbCBzY2hlbWEgbmFtZSwgcmV0dXJuIFRydWUgaWYgdGhlIGdpdmVuIHRhYmxlIGV4aXN0cyBpbiB0aGUKICAgICAgICBkYXRhYmFzZSwgRmFsc2Ugb3RoZXJ3aXNlLgoKICAgICAgICBUaGlzIG1ldGhvZCBzZXJ2ZXMgYXMgdGhlIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24gb2YgdGhlCiAgICAgICAgcHVibGljIGZhY2luZyA6bWV0aDpgLkluc3BlY3Rvci5oYXNfdGFibGVgIG1ldGhvZCwgYW5kIGlzIGFsc28gdXNlZAogICAgICAgIGludGVybmFsbHkgdG8gaW1wbGVtZW50IHRoZSAiY2hlY2tmaXJzdCIgYmVoYXZpb3IgZm9yIG1ldGhvZHMgbGlrZQogICAgICAgIDptZXRoOmBfc2NoZW1hLlRhYmxlLmNyZWF0ZWAgYW5kIDptZXRoOmBfc2NoZW1hLk1ldGFEYXRhLmNyZWF0ZV9hbGxgLgoKICAgICAgICAuLiBub3RlOjogVGhpcyBtZXRob2QgaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IFNRTEFsY2hlbXksIGFuZCBpcwogICAgICAgICAgIHB1Ymxpc2hlZCBzbyB0aGF0IHRoaXJkLXBhcnR5IGRpYWxlY3RzIG1heSBwcm92aWRlIGFuCiAgICAgICAgICAgaW1wbGVtZW50YXRpb24uIEl0IGlzICoqbm90KiogdGhlIHB1YmxpYyBBUEkgZm9yIGNoZWNraW5nIGZvciB0YWJsZQogICAgICAgICAgIHByZXNlbmNlLiBQbGVhc2UgdXNlIHRoZSA6bWV0aDpgLkluc3BlY3Rvci5oYXNfdGFibGVgIG1ldGhvZC4KCiAgICAgICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAyLjA6OiA6bWV0aDpgX2VuZ2luZS5EaWFsZWN0Lmhhc190YWJsZWAgbm93CiAgICAgICAgICAgZm9ybWFsbHkgc3VwcG9ydHMgY2hlY2tpbmcgZm9yIGFkZGl0aW9uYWwgdGFibGUtbGlrZSBvYmplY3RzOgoKICAgICAgICAgICAqIGFueSB0eXBlIG9mIHZpZXdzIChwbGFpbiBvciBtYXRlcmlhbGl6ZWQpCiAgICAgICAgICAgKiB0ZW1wb3JhcnkgdGFibGVzIG9mIGFueSBraW5kCgogICAgICAgICAgIFByZXZpb3VzbHksIHRoZXNlIHR3byBjaGVja3Mgd2VyZSBub3QgZm9ybWFsbHkgc3BlY2lmaWVkIGFuZAogICAgICAgICAgIGRpZmZlcmVudCBkaWFsZWN0cyB3b3VsZCB2YXJ5IGluIHRoZWlyIGJlaGF2aW9yLiAgIFRoZSBkaWFsZWN0CiAgICAgICAgICAgdGVzdGluZyBzdWl0ZSBub3cgaW5jbHVkZXMgdGVzdHMgZm9yIGFsbCBvZiB0aGVzZSBvYmplY3QgdHlwZXMsCiAgICAgICAgICAgYW5kIGRpYWxlY3RzIHRvIHRoZSBkZWdyZWUgdGhhdCB0aGUgYmFja2luZyBkYXRhYmFzZSBzdXBwb3J0cyB2aWV3cwogICAgICAgICAgIG9yIHRlbXBvcmFyeSB0YWJsZXMgc2hvdWxkIHNlZWsgdG8gc3VwcG9ydCBsb2NhdGluZyB0aGVzZSBvYmplY3RzCiAgICAgICAgICAgZm9yIGZ1bGwgY29tcGxpYW5jZS4KCiAgICAgICAgcvsAAAByYQEAAHMFAAAAICAgICByTQAAANoJaGFzX3RhYmxlehFEaWFsZWN0Lmhhc190YWJsZQ4HAABzDgAAAIAA9E4BAA8i0w4j0AgjckwAAABjBQAAAAAAAAAAAAAAAgAAAAsAAAHzFgAAAJcAdAEAAAAAAAAAAKsAAAAAAAAAggEpAWGBAgAAQ2hlY2sgdGhlIGV4aXN0ZW5jZSBvZiBhIHBhcnRpY3VsYXIgaW5kZXggbmFtZSBpbiB0aGUgZGF0YWJhc2UuCgogICAgICAgIEdpdmVuIGEgOmNsYXNzOmBfZW5naW5lLkNvbm5lY3Rpb25gIG9iamVjdCwgYSBzdHJpbmcKICAgICAgICBgYHRhYmxlX25hbWVgYCBhbmQgc3RyaW5nIGluZGV4IG5hbWUsIHJldHVybiBgYFRydWVgYCBpZiBhbiBpbmRleCBvZgogICAgICAgIHRoZSBnaXZlbiBuYW1lIG9uIHRoZSBnaXZlbiB0YWJsZSBleGlzdHMsIGBgRmFsc2VgYCBvdGhlcndpc2UuCgogICAgICAgIFRoZSA6Y2xhc3M6YC5EZWZhdWx0RGlhbGVjdGAgaW1wbGVtZW50cyB0aGlzIGluIHRlcm1zIG9mIHRoZQogICAgICAgIDptZXRoOmAuRGlhbGVjdC5oYXNfdGFibGVgIGFuZCA6bWV0aDpgLkRpYWxlY3QuZ2V0X2luZGV4ZXNgIG1ldGhvZHMsCiAgICAgICAgaG93ZXZlciBkaWFsZWN0cyBjYW4gaW1wbGVtZW50IGEgbW9yZSBwZXJmb3JtYW50IHZlcnNpb24uCgogICAgICAgIFRoaXMgaXMgYW4gaW50ZXJuYWwgZGlhbGVjdCBtZXRob2QuIEFwcGxpY2F0aW9ucyBzaG91bGQgdXNlCiAgICAgICAgOm1ldGg6YF9lbmdpbmUuSW5zcGVjdG9yLmhhc19pbmRleGAuCgogICAgICAgIC4uIHZlcnNpb25hZGRlZDo6IDEuNAoKICAgICAgICBy+wAAACkGclkAAAByWwEAAHJiAQAA2gppbmRleF9uYW1lcmMBAAByZAEAAHMGAAAAICAgICAgck0AAADaCWhhc19pbmRleHoRRGlhbGVjdC5oYXNfaW5kZXg3BwAAcnABAAByTAAAAGMEAAAAAAAAAAAAAAACAAAACwAAAfMWAAAAlwB0AQAAAAAAAAAAqwAAAAAAAACCASkBYXABAABDaGVjayB0aGUgZXhpc3RlbmNlIG9mIGEgcGFydGljdWxhciBzZXF1ZW5jZSBpbiB0aGUgZGF0YWJhc2UuCgogICAgICAgIEdpdmVuIGEgOmNsYXNzOmBfZW5naW5lLkNvbm5lY3Rpb25gIG9iamVjdCBhbmQgYSBzdHJpbmcKICAgICAgICBgc2VxdWVuY2VfbmFtZWAsIHJldHVybiBgYFRydWVgYCBpZiB0aGUgZ2l2ZW4gc2VxdWVuY2UgZXhpc3RzIGluCiAgICAgICAgdGhlIGRhdGFiYXNlLCBgYEZhbHNlYGAgb3RoZXJ3aXNlLgoKICAgICAgICBUaGlzIGlzIGFuIGludGVybmFsIGRpYWxlY3QgbWV0aG9kLiBBcHBsaWNhdGlvbnMgc2hvdWxkIHVzZQogICAgICAgIDptZXRoOmBfZW5naW5lLkluc3BlY3Rvci5oYXNfc2VxdWVuY2VgLgogICAgICAgIHL7AAAAKQVyWQAAAHJbAQAA2g1zZXF1ZW5jZV9uYW1lcmMBAAByZAEAAHMFAAAAICAgICByTQAAANoMaGFzX3NlcXVlbmNlehREaWFsZWN0Lmhhc19zZXF1ZW5jZVIHAAByjQEAAHJMAAAAYwMAAAAAAAAAAAAAAAIAAAALAAAB8xYAAACXAHQBAAAAAAAAAACrAAAAAAAAAIIBKQFhdgIAAENoZWNrIHRoZSBleGlzdGVuY2Ugb2YgYSBwYXJ0aWN1bGFyIHNjaGVtYSBuYW1lIGluIHRoZSBkYXRhYmFzZS4KCiAgICAgICAgR2l2ZW4gYSA6Y2xhc3M6YF9lbmdpbmUuQ29ubmVjdGlvbmAgb2JqZWN0LCBhIHN0cmluZwogICAgICAgIGBgc2NoZW1hX25hbWVgYCwgcmV0dXJuIGBgVHJ1ZWBgIGlmIGEgc2NoZW1hIG9mIHRoZQogICAgICAgIGdpdmVuIGV4aXN0cywgYGBGYWxzZWBgIG90aGVyd2lzZS4KCiAgICAgICAgVGhlIDpjbGFzczpgLkRlZmF1bHREaWFsZWN0YCBpbXBsZW1lbnRzIHRoaXMgYnkgY2hlY2tpbmcKICAgICAgICB0aGUgcHJlc2VuY2Ugb2YgYGBzY2hlbWFfbmFtZWBgIGFtb25nIHRoZSBzY2hlbWFzIHJldHVybmVkIGJ5CiAgICAgICAgOm1ldGg6YC5EaWFsZWN0LmdldF9zY2hlbWFfbmFtZXNgLAogICAgICAgIGhvd2V2ZXIgZGlhbGVjdHMgY2FuIGltcGxlbWVudCBhIG1vcmUgcGVyZm9ybWFudCB2ZXJzaW9uLgoKICAgICAgICBUaGlzIGlzIGFuIGludGVybmFsIGRpYWxlY3QgbWV0aG9kLiBBcHBsaWNhdGlvbnMgc2hvdWxkIHVzZQogICAgICAgIDptZXRoOmBfZW5naW5lLkluc3BlY3Rvci5oYXNfc2NoZW1hYC4KCiAgICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMi4wCgogICAgICAgIHL7AAAAKQRyWQAAAHJbAQAA2gtzY2hlbWFfbmFtZXJkAQAAcwQAAAAgICAgck0AAADaCmhhc19zY2hlbWF6EkRpYWxlY3QuaGFzX3NjaGVtYWUHAABzDQAAAIAA9CoADyLTDiPQCCNyTAAAAGMCAAAAAAAAAAAAAAACAAAAAwAAAfMWAAAAlwB0AQAAAAAAAAAAqwAAAAAAAACCASkBeuhSZXRyaWV2ZSB0aGUgc2VydmVyIHZlcnNpb24gaW5mbyBmcm9tIHRoZSBnaXZlbiBjb25uZWN0aW9uLgoKICAgICAgICBUaGlzIGlzIHVzZWQgYnkgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdG8gcG9wdWxhdGUgdGhlCiAgICAgICAgInNlcnZlcl92ZXJzaW9uX2luZm8iIGF0dHJpYnV0ZSBhbmQgaXMgY2FsbGVkIGV4YWN0bHkKICAgICAgICBvbmNlIHVwb24gZmlyc3QgY29ubmVjdC4KCiAgICAgICAgcvsAAAByWgEAAHMCAAAAICByTQAAANoYX2dldF9zZXJ2ZXJfdmVyc2lvbl9pbmZveiBEaWFsZWN0Ll9nZXRfc2VydmVyX3ZlcnNpb25faW5mb3wHAADzDQAAAIAA9BIADyLTDiPQCCNyTAAAAGMCAAAAAAAAAAAAAAACAAAAAwAAAfMWAAAAlwB0AQAAAAAAAAAAqwAAAAAAAACCASkBYQcBAABSZXR1cm4gdGhlIHN0cmluZyBuYW1lIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgc2NoZW1hIGZyb20KICAgICAgICB0aGUgZ2l2ZW4gY29ubmVjdGlvbi4KCiAgICAgICAgVGhpcyBpcyB1c2VkIGJ5IHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHRvIHBvcHVsYXRlIHRoZQogICAgICAgICJkZWZhdWx0X3NjaGVtYV9uYW1lIiBhdHRyaWJ1dGUgYW5kIGlzIGNhbGxlZCBleGFjdGx5CiAgICAgICAgb25jZSB1cG9uIGZpcnN0IGNvbm5lY3QuCgogICAgICAgIHL7AAAAcloBAABzAgAAACAgck0AAADaGF9nZXRfZGVmYXVsdF9zY2hlbWFfbmFtZXogRGlhbGVjdC5fZ2V0X2RlZmF1bHRfc2NoZW1hX25hbWWHBwAAcnkBAAByTAAAAGMCAAAAAAAAAAAAAAACAAAAAwAAAfMWAAAAlwB0AQAAAAAAAAAAqwAAAAAAAACCASkBYaIBAABQcm92aWRlIGFuIGltcGxlbWVudGF0aW9uIG9mIGBgY29ubmVjdGlvbi5iZWdpbigpYGAsIGdpdmVuIGEKICAgICAgICBEQi1BUEkgY29ubmVjdGlvbi4KCiAgICAgICAgVGhlIERCQVBJIGhhcyBubyBkZWRpY2F0ZWQgImJlZ2luIiBtZXRob2QgYW5kIGl0IGlzIGV4cGVjdGVkCiAgICAgICAgdGhhdCB0cmFuc2FjdGlvbnMgYXJlIGltcGxpY2l0LiAgVGhpcyBob29rIGlzIHByb3ZpZGVkIGZvciB0aG9zZQogICAgICAgIERCQVBJcyB0aGF0IG1pZ2h0IG5lZWQgYWRkaXRpb25hbCBoZWxwIGluIHRoaXMgYXJlYS4KCiAgICAgICAgOnBhcmFtIGRiYXBpX2Nvbm5lY3Rpb246IGEgREJBUEkgY29ubmVjdGlvbiwgdHlwaWNhbGx5CiAgICAgICAgIHByb3hpZWQgd2l0aGluIGEgOmNsYXNzOmAuQ29ubmVjdGlvbkZhaXJ5YC4KCiAgICAgICAgcvsAAACpAnJZAAAA2hBkYmFwaV9jb25uZWN0aW9ucwIAAAAgIHJNAAAA2ghkb19iZWdpbnoQRGlhbGVjdC5kb19iZWdpbpMHAAByfwEAAHJMAAAAYwIAAAAAAAAAAAAAAAIAAAADAAAB8xYAAACXAHQBAAAAAAAAAACrAAAAAAAAAIIBKQF62VByb3ZpZGUgYW4gaW1wbGVtZW50YXRpb24gb2YgYGBjb25uZWN0aW9uLnJvbGxiYWNrKClgYCwgZ2l2ZW4KICAgICAgICBhIERCLUFQSSBjb25uZWN0aW9uLgoKICAgICAgICA6cGFyYW0gZGJhcGlfY29ubmVjdGlvbjogYSBEQkFQSSBjb25uZWN0aW9uLCB0eXBpY2FsbHkKICAgICAgICAgcHJveGllZCB3aXRoaW4gYSA6Y2xhc3M6YC5Db25uZWN0aW9uRmFpcnlgLgoKICAgICAgICBy+wAAAHK4AQAAcwIAAAAgIHJNAAAA2gtkb19yb2xsYmFja3oTRGlhbGVjdC5kb19yb2xsYmFja6IHAABytAEAAHJMAAAAYwIAAAAAAAAAAAAAAAIAAAADAAAB8xYAAACXAHQBAAAAAAAAAACrAAAAAAAAAIIBKQF611Byb3ZpZGUgYW4gaW1wbGVtZW50YXRpb24gb2Yg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ICAgIDphdHRyOmAuQmluZFR5cGluZy5TRVRJTlBVVFNJWkVTYCB2YWx1ZS4KICAgICAgICBQYXJhbWV0ZXIgZGF0YSBpcyBwYXNzZWQgaW4gYSBsaXN0IG9mIHR1cGxlcyAocGFyYW1uYW1lLCBkYnR5cGUsCiAgICAgICAgc3FsdHlwZSksIHdoZXJlIGBgcGFyYW1uYW1lYGAgaXMgdGhlIGtleSBvZiB0aGUgcGFyYW1ldGVyIGluIHRoZQogICAgICAgIHN0YXRlbWVudCwgYGBkYnR5cGVgYCBpcyB0aGUgREJBUEkgZGF0YXR5cGUgYW5kIGBgc3FsdHlwZWBgIGlzIHRoZQogICAgICAgIFNRTEFsY2hlbXkgdHlwZS4gVGhlIG9yZGVyIG9mIHR1cGxlcyBpcyBpbiB0aGUgY29ycmVjdCBwYXJhbWV0ZXIgb3JkZXIuCgogICAgICAgIC4uIHZlcnNpb25hZGRlZDo6IDEuNAoKICAgICAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDIuMCAgLSBzZXRpbnB1dHNpemVzIG1vZGUgaXMgbm93IGVuYWJsZWQgYnkKICAgICAgICAgICBzZXR0aW5nIDphdHRyOmAuRGlhbGVjdC5iaW5kX3R5cGluZ2AgdG8KICAgICAgICAgICA6YXR0cjpgLkJpbmRUeXBpbmcuU0VUSU5QVVRTSVpFU2AuICBEaWFsZWN0cyB3aGljaCBhY2NlcHQKICAgICAgICAgICBhIGBgdXNlX3NldGlucHV0c2l6ZXNgYCBwYXJhbWV0ZXIgc2hvdWxkIHNldCB0aGlzIHZhbHVlCiAgICAgICAgICAgYXBwcm9wcmlhdGVseS4KCgogICAgICAgIHL7AAAAKQRyWQAAAHJfAAAA2g5saXN0X29mX3R1cGxlc9oHY29udGV4dHMEAAAAICAgIHJNAAAA2hJkb19zZXRfaW5wdXRfc2l6ZXN6GkRpYWxlY3QuZG9fc2V0X2lucHV0X3NpemVz3gcAAHJrAQAAckwAAABjAQAAAAAAAAAAAAAAAgAAAAMAAAHzFgAAAJcAdAEAAAAAAAAAAKsAAAAAAAAAggEpAXq9Q3JlYXRlIGEgdHdvLXBoYXNlIHRyYW5zYWN0aW9uIElELgoKICAgICAgICBUaGlzIGlkIHdpbGwg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b25uZWN0KCpjYXJncywgKipjcGFyYW1zKQoKICAgICAgICBUaGUgYGAqY2FyZ3MsICoqY3BhcmFtc2BgIHBhcmFtZXRlcnMgYXJlIGdlbmVyYXRlZCBkaXJlY3RseQogICAgICAgIGZyb20gdGhpcyBkaWFsZWN0J3MgOm1ldGg6YC5EaWFsZWN0LmNyZWF0ZV9jb25uZWN0X2FyZ3NgIG1ldGhvZC4KCiAgICAgICAgVGhpcyBtZXRob2QgbWF5IGJlIHVzZWQgZm9yIGRpYWxlY3RzIHRoYXQgbmVlZCB0byBwZXJmb3JtIHByb2dyYW1tYXRpYwogICAgICAgIHBlci1jb25uZWN0aW9uIHN0ZXBzIHdoZW4gYSBuZXcgY29ubmVjdGlvbiBpcyBwcm9jdXJlZCBmcm9tIHRoZQogICAgICAgIERCQVBJLgoKCiAgICAgICAgOnBhcmFtIFwqY2FyZ3M6IHBvc2l0aW9uYWwgcGFyYW1ldGVycyByZXR1cm5lZCBmcm9tIHRoZQogICAgICAgICA6bWV0aDpgLkRpYWxlY3QuY3JlYXRlX2Nvbm5lY3RfYXJnc2AgbWV0aG9kCgogICAgICAgIDpwYXJhbSBcKlwqY3BhcmFtczoga2V5d29yZCBwYXJhbWV0ZXJzIHJldHVybmVkIGZyb20gdGhlCiAgICAgICAgIDptZXRoOmAuRGlhbGVjdC5jcmVhdGVfY29ubmVjdF9hcmdzYCBtZXRob2QuCgogICAgICAgIDpyZXR1cm46IGEgREJBUEkgY29ubmVjdGlvbiwgdHlwaWNhbGx5IGZyb20gdGhlIDpwZXA6YDI0OWAgbW9kdWxlCiAgICAgICAgIGxldmVsIGBgLmNvbm5lY3QoKWBgIGZ1bmN0aW9uLgoKICAgICAgICAuLiBzZWVhbHNvOjoKCiAgICAgICAgICAgIDptZXRoOmAuRGlhbGVjdC5jcmVhdGVfY29ubmVjdF9hcmdzYAoKICAgICAgICAgICAgOm1ldGg6YC5EaWFsZWN0Lm9uX2Nvbm5lY3RgCgogICAgICAgIHL7AAAAKQNyWQAAANoFY2FyZ3PaB2NwYXJhbXNzAwAAACAgIHJNAAAA2gdjb25uZWN0eg9EaWFsZWN0LmNvbm5lY3SpCAAA8w4AAACAAPRAAQAPItMOI9AII3JMAAAAYwIAAAAAAAAAAAAAAAIAAAADAAAB8yIAAACXAHwAagEAAAAAAAAAAAAAAAAAAAAAAACrAAAAAAAAAFMAKQFhJgkAAHJldHVybiBhIGNhbGxhYmxlIHdoaWNoIHNldHMgdXAgYSBuZXdseSBjcmVhdGVkIERCQVBJIGNvbm5lY3Rpb24uCgogICAgICAgIFRoaXMgbWV0aG9kIGlzIGEgbmV3IGhvb2sgdGhhdCBzdXBlcnNlZGVzIHRoZQogICAgICAgIDptZXRoOmBfZW5naW5lLkRpYWxlY3Qub25fY29ubmVjdGAgbWV0aG9kIHdoZW4gaW1wbGVtZW50ZWQgYnkgYQogICAgICAgIGRpYWxlY3QuICAgV2hlbiBub3QgaW1wbGVtZW50ZWQgYnkgYSBkaWFsZWN0LCBpdCBpbnZva2VzIHRoZQogICAgICAgIDptZXRoOmBfZW5naW5lLkRpYWxlY3Qub25fY29ubmVjdGAgbWV0aG9kIGRpcmVjdGx5IHRvIG1haW50YWluCiAgICAgICAgY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIGRpYWxlY3RzLiAgIFRoZXJlIGlzIG5vIGRlcHJlY2F0aW9uCiAgICAgICAgZm9yIDptZXRoOmBfZW5naW5lLkRpYWxlY3Qub25fY29ubmVjdGAgZXhwZWN0ZWQuCgogICAgICAgIFRoZSBjYWxsYWJsZSBzaG91bGQgYWNjZXB0IGEgc2luZ2xlIGFyZ3VtZW50ICJjb25uIiB3aGljaCBpcyB0aGUKICAgICAgICBEQkFQSSBjb25uZWN0aW9uIGl0c2VsZi4gIFRoZSBpbm5lciBjYWxsYWJsZSBoYXMgbm8KICAgICAgICByZXR1cm4gdmFsdWUuCgogICAgICAgIEUuZy46OgoKICAgICAgICAgICAgY2xhc3MgTXlEaWFsZWN0KGRlZmF1bHQuRGVmYXVsdERpYWxlY3QpOgogICAgICAgICAgICAgICAgIyAuLi4KCiAgICAgICAgICAgICAgICBkZWYgb25fY29ubmVjdF91cmwoc2VsZiwgdXJsKToKICAgICAgICAgICAgICAgICAgICBkZWYgZG9fb25fY29ubmVjdChjb25uZWN0aW9uKToKICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5leGVjdXRlKCJTRVQgU1BFQ0lBTCBGTEFHUyBldGMiKQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZG9fb25fY29ubmVjdAoKICAgICAgICBUaGlzIGlzIHVzZWQgdG8gc2V0IGRpYWxlY3Qtd2lkZSBwZXItY29ubmVjdGlvbiBvcHRpb25zIHN1Y2ggYXMKICAgICAgICBpc29sYXRpb24gbW9kZXMsIFVuaWNvZGUgbW9kZXMsIGV0Yy4KCiAgICAgICAgVGhpcyBtZXRob2QgZGlmZmVycyBmcm9tIDptZXRoOmBfZW5naW5lLkRpYWxlY3Qub25fY29ubmVjdGAgaW4gdGhhdAogICAgICAgIGl0IGlzIHBhc3NlZCB0aGUgOmNsYXNzOmBfZW5naW5lLlVSTGAgb2JqZWN0IHRoYXQncyByZWxldmFudCB0byB0aGUKICAgICAgICBjb25uZWN0IGFyZ3MuICBOb3JtYWxseSB0aGUgb25seSB3YXkgdG8gZ2V0IHRoaXMgaXMgZnJvbSB0aGUKICAgICAgICA6bWV0aDpgX2VuZ2luZS5EaWFsZWN0Lm9uX2Nvbm5lY3RgIGhvb2sgaXMgdG8gbG9vayBvbiB0aGUKICAgICAgICA6Y2xhc3M6YF9lbmdpbmUuRW5naW5lYCBpdHNlbGYsIGhvd2V2ZXIgdGhpcyBVUkwgb2JqZWN0IG1heSBoYXZlIGJlZW4KICAgICAgICByZXBsYWNlZCBieSBwbHVnaW5zLgoKICAgICAgICAuLiBub3RlOjoKCiAgICAgICAgICAgIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mCiAgICAgICAgICAgIDptZXRoOmBfZW5naW5lLkRpYWxlY3Qub25fY29ubmVjdF91cmxgIGlzIHRvIGludm9rZSB0aGUKICAgICAgICAgICAgOm1ldGg6YF9lbmdpbmUuRGlhbGVjdC5vbl9jb25uZWN0YCBtZXRob2QuIFRoZXJlZm9yZSBpZiBhIGRpYWxlY3QKICAgICAgICAgICAgaW1wbGVtZW50cyB0aGlzIG1ldGhvZCwgdGhlIDptZXRoOmBfZW5naW5lLkRpYWxlY3Qub25fY29ubmVjdGAKICAgICAgICAgICAgbWV0aG9kICoqd2lsbCBub3QgYmUgY2FsbGVkKiogdW5sZXNzIHRoZSBvdmVycmlkaW5nIGRpYWxlY3QgY2FsbHMKICAgICAgICAgICAgaXQgZGlyZWN0bHkgZnJvbSBoZXJlLgoKICAgICAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAxLjQuMyBhZGRlZCA6bWV0aDpgX2VuZ2luZS5EaWFsZWN0Lm9uX2Nvbm5lY3RfdXJsYAogICAgICAgICAgIHdoaWNoIG5vcm1hbGx5IGNhbGxzIGludG8gOm1ldGg6YF9lbmdpbmUuRGlhbGVjdC5vbl9jb25uZWN0YC4KCiAgICAgICAgOnBhcmFtIHVybDogYSA6Y2xhc3M6YF9lbmdpbmUuVVJMYCBvYmplY3QgcmVwcmVzZW50aW5nIHRoZQogICAgICAgICA6Y2xhc3M6YF9lbmdpbmUuVVJMYCB0aGF0IHdhcyBwYXNzZWQgdG8gdGhlCiAgICAgICAgIDptZXRoOmBfZW5naW5lLkRpYWxlY3QuY3JlYXRlX2Nvbm5lY3RfYXJnc2AgbWV0aG9kLgoKICAgICAgICA6cmV0dXJuOiBhIGNhbGxhYmxlIHRoYXQgYWNjZXB0cyBhIHNpbmdsZSBEQkFQSSBjb25uZWN0aW9uIGFzIGFuCiAgICAgICAgIGFyZ3VtZW50LCBvciBOb25lLgoKICAgICAgICAuLiBzZWVhbHNvOjoKCiAgICAgICAgICAgIDptZXRoOmBfZW5naW5lLkRpYWxlY3Qub25fY29ubmVjdGAKCiAgICAgICAgKQHaCm9uX2Nvbm5lY3RyTQEAAHMCAAAAICByTQAAANoOb25fY29ubmVjdF91cmx6FkRpYWxlY3Qub25fY29ubmVjdF91cmzLCAAAcxIAAACAAPB2AQAQFI9/iX/TDyDQCCByTAAAAGMBAAAAAAAAAAAAAAAAAAAAAwAAAfMEAAAAlwB5ASkCYYEHAAByZXR1cm4gYSBjYWxsYWJsZSB3aGljaCBzZXRzIHVwIGEgbmV3bHkgY3JlYXRlZCBEQkFQSSBjb25uZWN0aW9uLgoKICAgICAgICBUaGUgY2FsbGFibGUgc2hvdWxkIGFjY2VwdCBhIHNpbmdsZSBhcmd1bWVudCAiY29ubiIgd2hpY2ggaXMgdGhlCiAgICAgICAgREJBUEkgY29ubmVjdGlvbiBpdHNlbGYuICBUaGUgaW5uZXIgY2FsbGFibGUgaGFzIG5vCiAgICAgICAgcmV0dXJuIHZhbHVlLgoKICAgICAgICBFLmcuOjoKCiAgICAgICAgICAgIGNsYXNzIE15RGlhbGVjdChkZWZhdWx0LkRlZmF1bHREaWFsZWN0KToKICAgICAgICAgICAgICAgICMgLi4uCgogICAgICAgICAgICAgICAgZGVmIG9uX2Nvbm5lY3Qoc2VsZik6CiAgICAgICAgICAgICAgICAgICAgZGVmIGRvX29uX2Nvbm5lY3QoY29ubmVjdGlvbik6CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uZXhlY3V0ZSgiU0VUIFNQRUNJQUwgRkxBR1MgZXRjIikKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRvX29uX2Nvbm5lY3QKCiAgICAgICAgVGhpcyBpcyB1c2VkIHRvIHNldCBkaWFsZWN0LXdpZGUgcGVyLWNvbm5lY3Rpb24gb3B0aW9ucyBzdWNoIGFzCiAgICAgICAgaXNvbGF0aW9uIG1vZGVzLCBVbmljb2RlIG1vZGVzLCBldGMuCgogICAgICAgIFRoZSAiZG9fb25fY29ubmVjdCIgY2FsbGFibGUgaXMgaW52b2tlZCBieSB1c2luZyB0aGUKICAgICAgICA6bWV0aDpgX2V2ZW50cy5Qb29sRXZlbnRzLmNvbm5lY3RgIGV2ZW50CiAgICAgICAgaG9vaywgdGhlbiB1bndyYXBwaW5nIHRoZSBEQkFQSSBjb25uZWN0aW9uIGFuZCBwYXNzaW5nIGl0IGludG8gdGhlCiAgICAgICAgY2FsbGFibGUuCgogICAgICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMS40IHRoZSBvbl9jb25uZWN0IGhvb2sgaXMgbm8gbG9uZ2VyIGNhbGxlZCB0d2ljZQogICAgICAgICAgIGZvciB0aGUgZmlyc3QgY29ubmVjdGlvbiBvZiBhIGRpYWxlY3QuICBUaGUgb25fY29ubmVjdCBob29rIGlzIHN0aWxsCiAgICAgICAgICAgY2FsbGVkIGJlZm9yZSB0aGUgOm1ldGg6YF9lbmdpbmUuRGlhbGVjdC5pbml0aWFsaXplYCBtZXRob2QgaG93ZXZlci4KCiAgICAgICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAxLjQuMyB0aGUgb25fY29ubmVjdCBob29rIGlzIGludm9rZWQgZnJvbSBhIG5ldwogICAgICAgICAgIG1ldGhvZCBvbl9jb25uZWN0X3VybCB0aGF0IHBhc3NlcyB0aGUgVVJMIHRoYXQgd2FzIHVzZWQgdG8gY3JlYXRlCiAgICAgICAgICAgdGhlIGNvbm5lY3QgYXJncy4gICBEaWFsZWN0cyBjYW4gaW1wbGVtZW50IG9uX2Nvbm5lY3RfdXJsIGluc3RlYWQKICAgICAgICAgICBvZiBvbl9jb25uZWN0IGlmIHRoZXkgbmVlZCB0aGUgVVJMIG9iamVjdCB0aGF0IHdhcyB1c2VkIGZvciB0aGUKICAgICAgICAgICBjb25uZWN0aW9uIGluIG9yZGVyIHRvIGdldCBhZGRpdGlvbmFsIGNvbnRleHQuCgogICAgICAgIElmIE5vbmUgaXMgcmV0dXJuZWQsIG5vIGV2ZW50IGxpc3RlbmVyIGlzIGdlbmVyYXRlZC4KCiAgICAgICAgOnJldHVybjogYSBjYWxsYWJsZSB0aGF0IGFjY2VwdHMgYSBzaW5nbGUgREJBUEkgY29ubmVjdGlvbiBhcyBhbgogICAgICAgICBhcmd1bWVudCwgb3IgTm9uZS4KCiAgICAgICAgLi4gc2VlYWxzbzo6CgogICAgICAgICAgICA6bWV0aDpgLkRpYWxlY3QuY29ubmVjdGAgLSBhbGxvd3MgdGhlIERCQVBJIGBgY29ubmVjdCgpYGAgc2VxdWVuY2UKICAgICAgICAgICAgaXRzZWxmIHRvIGJlIGNvbnRyb2xsZWQuCgogICAgICAgICAgICA6bWV0aDpgLkRpYWxlY3Qub25fY29ubmVjdF91cmxgIC0gc3VwZXJzZWRlcwogICAgICAgICAgICA6bWV0aDpgLkRpYWxlY3Qub25fY29ubmVjdGAgdG8gYWxzbyByZWNlaXZlIHRoZQogICAgICAgICAgICA6Y2xhc3M6YF9lbmdpbmUuVVJMYCBvYmplY3QgaW4gY29udGV4dC4KCiAgICAgICAgTnJLAAAAclgAAABzAQAAACByTQAAAHL4AQAAehJEaWFsZWN0Lm9uX2Nvbm5lY3QICQAAcwgAAACAAPBmAQAQFHJMAAAAYwIAAAAAAAAAAAAAAAIAAAADAAAB8xYAAACXAHQBAAAAAAAAAACrAAAAAAAAAIIBKQFhMgMAAEdpdmVuIGEgREJBUEkgY29ubmVjdGlvbiwgcmV2ZXJ0IGl0cyBpc29sYXRpb24gdG8gdGhlIGRlZmF1bHQuCgogICAgICAgIE5vdGUgdGhhdCB0aGlzIGlzIGEgZGlhbGVjdC1sZXZlbCBtZXRob2Qgd2hpY2ggaXMgdXNlZCBhcyBwYXJ0CiAgICAgICAgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSA6Y2xhc3M6YF9lbmdpbmUuQ29ubmVjdGlvbmAgYW5kCiAgICAgICAgOmNsYXNzOmBfZW5naW5lLkVuZ2luZWAKICAgICAgICBpc29sYXRpb24gbGV2ZWwgZmFjaWxpdGllczsgdGhlc2UgQVBJcyBzaG91bGQgYmUgcHJlZmVycmVkIGZvcgogICAgICAgIG1vc3QgdHlwaWNhbCB1c2UgY2FzZXMuCgogICAgICAgIC4uIHNlZWFsc286OgoKICAgICAgICAgICAgOm1ldGg6YF9lbmdpbmUuQ29ubmVjdGlvbi5nZXRfaXNvbGF0aW9uX2xldmVsYAogICAgICAgICAgICAtIHZpZXcgY3VycmVudCBsZXZlbAoKICAgICAgICAgICAgOmF0dHI6YF9lbmdpbmUuQ29ubmVjdGlvbi5kZWZhdWx0X2lzb2xhdGlvbl9sZXZlbGAKICAgICAgICAgICAgLSB2aWV3IGRlZmF1bHQgbGV2ZWwKCiAgICAgICAgICAgIDpwYXJhbXJlZjpgLkNvbm5lY3Rpb24uZXhlY3V0aW9uX29wdGlvbnMuaXNvbGF0aW9uX2xldmVsYCAtCiAgICAgICAgICAgIHNldCBwZXIgOmNsYXNzOmBfZW5naW5lLkNvbm5lY3Rpb25gIGlzb2xhdGlvbiBsZXZlbAoKICAgICAgICAgICAgOnBhcmFtcmVmOmBfc2EuY3JlYXRlX2VuZ2luZS5pc29sYXRpb25fbGV2ZWxgIC0KICAgICAgICAgICAgc2V0IHBlciA6Y2xhc3M6YF9lbmdpbmUuRW5naW5lYCBpc29sYXRpb24gbGV2ZWwKCiAgICAgICAgcvsAAAByuAEAAHMCAAAAICByTQAAANoVcmVzZXRfaXNvbGF0aW9uX2xldmVseh1EaWFsZWN0LnJlc2V0X2lzb2xhdGlvbl9sZXZlbD0JAABycAEAAHJMAAAAYwMAAAAAAAAAAAAAAAIAAAADAAAB8xYAAACXAHQBAAAAAAAAAACrAAAAAAAAAIIBKQFhMgQAAEdpdmVuIGEgREJBUEkgY29ubmVjdGlvbiwgc2V0IGl0cyBpc29sYXRpb24gbGV2ZWwuCgogICAgICAgIE5vdGUgdGhhdCB0aGlzIGlzIGEgZGlhbGVjdC1sZXZlbCBtZXRob2Qgd2hpY2ggaXMgdXNlZCBhcyBwYXJ0CiAgICAgICAgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSA6Y2xhc3M6YF9lbmdpbmUuQ29ubmVjdGlvbmAgYW5kCiAgICAgICAgOmNsYXNzOmBfZW5naW5lLkVuZ2luZWAKICAgICAgICBpc29sYXRpb24gbGV2ZWwgZmFjaWxpdGllczsgdGhlc2UgQVBJcyBzaG91bGQgYmUgcHJlZmVycmVkIGZvcgogICAgICAgIG1vc3QgdHlwaWNhbCB1c2UgY2FzZXMuCgogICAgICAgIElmIHRoZSBkaWFsZWN0IGFsc28gaW1wbGVtZW50cyB0aGUKICAgICAgICA6bWV0aDpgLkRpYWxlY3QuZ2V0X2lzb2xhdGlvbl9sZXZlbF92YWx1ZXNgIG1ldGhvZCwgdGhlbiB0aGUgZ2l2ZW4KICAgICAgICBsZXZlbCBpcyBndWFyYW50ZWVkIHRvIGJlIG9uZSBvZiB0aGUgc3RyaW5nIG5hbWVzIHdpdGhpbiB0aGF0IHNlcXVlbmNlLAogICAgICAgIGFuZCB0aGUgbWV0aG9kIHdpbGwgbm90IG5lZWQgdG8gYW50aWNpcGF0ZSBhIGxvb2t1cCBmYWlsdXJlLgoKICAgICAgICAuLiBzZWVhbHNvOjoKCiAgICAgICAgICAgIDptZXRoOmBfZW5naW5lLkNvbm5lY3Rpb24uZ2V0X2lzb2xhdGlvbl9sZXZlbGAKICAgICAgICAgICAgLSB2aWV3IGN1cnJlbnQgbGV2ZWwKCiAgICAgICAgICAgIDphdHRyOmBfZW5naW5lLkNvbm5lY3Rpb24uZGVmYXVsdF9pc29sYXRpb25fbGV2ZWxgCiAgICAgICAgICAgIC0gdmlldyBkZWZhdWx0IGxldmVsCgogICAgICAgICAgICA6cGFyYW1yZWY6YC5Db25uZWN0aW9uLmV4ZWN1dGlvbl9vcHRpb25zLmlzb2xhdGlvbl9sZXZlbGAgLQogICAgICAgICAgICBzZXQgcGVyIDpjbGFzczpgX2VuZ2luZS5Db25uZWN0aW9uYCBpc29sYXRpb24gbGV2ZWwKCiAgICAgICAgICAgIDpwYXJhbXJlZjpgX3NhLmNyZWF0ZV9lbmdpbmUuaXNvbGF0aW9uX2xldmVsYCAtCiAgICAgICAgICAgIHNldCBwZXIgOmNsYXNzOmBfZW5naW5lLkVuZ2luZWAgaXNvbGF0aW9uIGxldmVsCgogICAgICAgIHL7AAAAKQNyWQAAAHK5AQAA2gVsZXZlbHMDAAAAICAgck0AAADaE3NldF9pc29sYXRpb25fbGV2ZWx6G0RpYWxlY3Quc2V0X2lzb2xhdGlvbl9sZXZlbFgJAABy9gEAAHJMAAAAYwIAAAAAAAAAAAAAAAIAAAADAAAB8xYAAACXAHQBAAAAAAAAAACrAAAAAAAAAIIBKQFh6QMAAEdpdmVuIGEgREJBUEkgY29ubmVjdGlvbiwgcmV0dXJuIGl0cyBpc29sYXRpb24gbGV2ZWwuCgogICAgICAgIFdoZW4gd29ya2luZyB3aXRoIGEgOmNsYXNzOmBfZW5naW5lLkNvbm5lY3Rpb25gIG9iamVjdCwKICAgICAgICB0aGUgY29ycmVzcG9uZGluZwogICAgICAgIERCQVBJIGNvbm5lY3Rpb24gbWF5IGJlIHByb2N1cmVkIHVzaW5nIHRoZQogICAgICAgIDphdHRyOmBfZW5naW5lLkNvbm5lY3Rpb24uY29ubmVjdGlvbmAgYWNjZXNzb3IuCgogICAgICAgIE5vdGUgdGhhdCB0aGlzIGlzIGEgZGlhbGVjdC1sZXZlbCBtZXRob2Qgd2hpY2ggaXMgdXNlZCBhcyBwYXJ0CiAgICAgICAgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSA6Y2xhc3M6YF9lbmdpbmUuQ29ubmVjdGlvbmAgYW5kCiAgICAgICAgOmNsYXNzOmBfZW5naW5lLkVuZ2luZWAgaXNvbGF0aW9uIGxldmVsIGZhY2lsaXRpZXM7CiAgICAgICAgdGhlc2UgQVBJcyBzaG91bGQgYmUgcHJlZmVycmVkIGZvciBtb3N0IHR5cGljYWwgdXNlIGNhc2VzLgoKCiAgICAgICAgLi4gc2VlYWxzbzo6CgogICAgICAgICAgICA6bWV0aDpgX2VuZ2luZS5Db25uZWN0aW9uLmdldF9pc29sYXRpb25fbGV2ZWxgCiAgICAgICAgICAgIC0gdmlldyBjdXJyZW50IGxldmVsCgogICAgICAgICAgICA6YXR0cjpgX2VuZ2luZS5Db25uZWN0aW9uLmRlZmF1bHRfaXNvbGF0aW9uX2xldmVsYAogICAgICAgICAgICAtIHZpZXcgZGVmYXVsdCBsZXZlbAoKICAgICAgICAgICAgOnBhcmFtcmVmOmAuQ29ubmVjdGlvbi5leGVjdXRpb25fb3B0aW9ucy5pc29sYXRpb25fbGV2ZWxgIC0KICAgICAgICAgICAgc2V0IHBlciA6Y2xhc3M6YF9lbmdpbmUuQ29ubmVjdGlvbmAgaXNvbGF0aW9uIGxldmVsCgogICAgICAgICAgICA6cGFyYW1yZWY6YF9zYS5jcmVhdGVfZW5naW5lLmlzb2xhdGlvbl9sZXZlbGAgLQogICAgICAgICAgICBzZXQgcGVyIDpjbGFzczpgX2VuZ2luZS5FbmdpbmVgIGlzb2xhdGlvbiBsZXZlbAoKCiAgICAgICAgcvsAAAByuAEAAHMCAAAAICByTQAAANoTZ2V0X2lzb2xhdGlvbl9sZXZlbHobRGlhbGVjdC5nZXRfaXNvbGF0aW9uX2xldmVsegkAAHMOAAAAgAD0QgEADyLTDiPQCCNyTAAAAGMCAAAAAAAAAAAAAAACAAAAAwAAAfMWAAAAlwB0AQAAAAAAAAAAqwAAAAAAAACCASkBYZgCAABHaXZlbiBhIERCQVBJIGNvbm5lY3Rpb24sIHJldHVybiBpdHMgaXNvbGF0aW9uIGxldmVsLCBvcgogICAgICAgIGEgZGVmYXVsdCBpc29sYXRpb24gbGV2ZWwgaWYgb25lIGNhbm5vdCBiZSByZXRyaWV2ZWQuCgogICAgICAgIFRoaXMgbWV0aG9kIG1heSBvbmx5IHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IgYW5kCiAgICAgICAgKiptdXN0IG5vdCByYWlzZSBhbnkgb3RoZXIgZXhjZXB0aW9uKiosIGFzIGl0IGlzIHVzZWQgaW1wbGljaXRseSB1cG9uCiAgICAgICAgZmlyc3QgY29ubmVjdC4KCiAgICAgICAgVGhlIG1ldGhvZCAqKm11c3QgcmV0dXJuIGEgdmFsdWUqKiBmb3IgYSBkaWFsZWN0IHRoYXQgc3VwcG9ydHMKICAgICAgICBpc29sYXRpb24gbGV2ZWwgc2V0dGluZ3MsIGFzIHRoaXMgbGV2ZWwgaXMgd2hhdCB3aWxsIGJlIHJldmVydGVkCiAgICAgICAgdG93YXJkcyB3aGVuIGEgcGVyLWNvbm5lY3Rpb24gaXNvbGF0aW9uIGxldmVsIGNoYW5nZSBpcyBtYWRlLgoKICAgICAgICBUaGUgbWV0aG9kIGRlZmF1bHRzIHRvIHVzaW5nIHRoZSA6bWV0aDpgLkRpYWxlY3QuZ2V0X2lzb2xhdGlvbl9sZXZlbGAKICAgICAgICBtZXRob2QgdW5sZXNzIG92ZXJyaWRkZW4gYnkgYSBkaWFsZWN0LgoKICAgICAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAxLjMuMjIKCiAgICAgICAgcvsAAACpAnJZAAAA2gpkYmFwaV9jb25ucwIAAAAgIHJNAAAA2htnZXRfZGVmYXVsdF9pc29sYXRpb25fbGV2ZWx6I0RpYWxlY3QuZ2V0X2RlZmF1bHRfaXNvbGF0aW9uX2xldmVsnQkAAHMNAAAAgAD0KAAPItMOI9AII3JMAAAAYwIAAAAAAAAAAAAAAAIAAAADAAAB8xYAAACXAHQBAAAAAAAAAACrAAAAAAAAAIIBKQFhHwgAAHJldHVybiBhIHNlcXVlbmNlIG9mIHN0cmluZyBpc29sYXRpb24gbGV2ZWwgbmFtZXMgdGhhdCBhcmUgYWNjZXB0ZWQKICAgICAgICBieSB0aGlzIGRpYWxlY3QuCgogICAgICAgIFRoZSBhdmFpbGFibGUgbmFtZXMgc2hvdWxkIHVzZSB0aGUgZm9sbG93aW5nIGNvbnZlbnRpb25zOgoKICAgICAgICAqIHVzZSBVUFBFUkNBU0UgbmFtZXMuICAgaXNvbGF0aW9uIGxldmVsIG1ldGhvZHMgd2lsbCBhY2NlcHQgbG93ZXJjYXNlCiAgICAgICAgICBuYW1lcyBidXQgdGhlc2UgYXJlIG5vcm1hbGl6ZWQgaW50byBVUFBFUkNBU0UgYmVmb3JlIGJlaW5nIHBhc3NlZAogICAgICAgICAgYWxvbmcgdG8gdGhlIGRpYWxlY3QuCiAgICAgICAgKiBzZXBhcmF0ZSB3b3JkcyBzaG91bGQgYmUgc2VwYXJhdGVkIGJ5IHNwYWNlcywgbm90IHVuZGVyc2NvcmVzLCBlLmcuCiAgICAgICAgICBgYFJFUEVBVEFCTEUgUkVBRGBgLiAgaXNvbGF0aW9uIGxldmVsIG5hbWVzIHdpbGwgaGF2ZSB1bmRlcnNjb3JlcwogICAgICAgICAgY29udmVydGVkIHRvIHNwYWNlcyBiZWZvcmUgYmVpbmcgcGFzc2VkIGFsb25nIHRvIHRoZSBkaWFsZWN0LgogICAgICAgICogVGhlIG5hbWVzIGZvciB0aGUgZm91ciBzdGFuZGFyZCBpc29sYXRpb24gbmFtZXMgdG8gdGhlIGV4dGVudCB0aGF0CiAgICAgICAgICB0aGV5IGFyZSBzdXBwb3J0ZWQgYnkgdGhlIGJhY2tlbmQgc2hvdWxkIGJlIGBgUkVBRCBVTkNPTU1JVFRFRGBgLAogICAgICAgICAgYGBSRUFEIENPTU1JVFRFRGBgLCBgYFJFUEVBVEFCTEUgUkVBRGBgLCBgYFNFUklBTElaQUJMRWBgCiAgICAgICAgKiBpZiB0aGUgZGlhbGVjdCBzdXBwb3J0cyBhbiBhdXRvY29tbWl0IG9wdGlvbiBpdCBzaG91bGQgYmUgcHJvdmlkZWQKICAgICAgICAgIHVzaW5nIHRoZSBpc29sYXRpb24gbGV2ZWwgbmFtZSBgYEFVVE9DT01NSVRgYC4KICAgICAgICAqIE90aGVyIGlzb2xhdGlvbiBtb2RlcyBtYXkgYWxzbyBiZSBwcmVzZW50LCBwcm92aWRlZCB0aGF0IHRoZXkKICAgICAgICAgIGFyZSBuYW1lZCBpbiBVUFBFUkNBU0UgYW5kIHVzZSBzcGFjZXMgbm90IHVuZGVyc2NvcmVzLgoKICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgc28gdGhhdCB0aGUgZGVmYXVsdCBkaWFsZWN0IGNhbiBjaGVjayB0aGF0CiAgICAgICAgYSBnaXZlbiBpc29sYXRpb24gbGV2ZWwgcGFyYW1ldGVyIGlzIHZhbGlkLCBlbHNlIHJhaXNlcyBhbgogICAgICAgIDpjbGFzczpgX2V4Yy5Bcmd1bWVudEVycm9yYC4KCiAgICAgICAgQSBEQkFQSSBjb25uZWN0aW9uIGlzIHBhc3NlZCB0byB0aGUgbWV0aG9kLCBpbiB0aGUgdW5saWtlbHkgZXZlbnQgdGhhdAogICAgICAgIHRoZSBkaWFsZWN0IG5lZWRzIHRvIGludGVycm9nYXRlIHRoZSBjb25uZWN0aW9uIGl0c2VsZiB0byBkZXRlcm1pbmUKICAgICAgICB0aGlzIGxpc3QsIGhvd2V2ZXIgaXQgaXMgZXhwZWN0ZWQgdGhhdCBtb3N0IGJhY2tlbmRzIHdpbGwgcmV0dXJuCiAgICAgICAgYSBoYXJkY29kZWQgbGlzdCBvZiB2YWx1ZXMuICBJZiB0aGUgZGlhbGVjdCBzdXBwb3J0cyAiQVVUT0NPTU1JVCIsCiAgICAgICAgdGhhdCB2YWx1ZSBzaG91bGQgYWxzbyBiZSBwcmVzZW50IGluIHRoZSBzZXF1ZW5jZSByZXR1cm5lZC4KCiAgICAgICAgVGhlIG1ldGhvZCByYWlzZXMgYGBOb3RJbXBsZW1lbnRlZEVycm9yYGAgYnkgZGVmYXVsdC4gIElmIGEgZGlhbGVjdAogICAgICAgIGRvZXMgbm90IGltcGxlbWVudCB0aGlzIG1ldGhvZCwgdGhlbiB0aGUgZGVmYXVsdCBkaWFsZWN0IHdpbGwgbm90CiAgICAgICAgcGVyZm9ybSBhbnkgY2hlY2tpbmcgb24gYSBnaXZlbiBpc29sYXRpb24gbGV2ZWwgdmFsdWUgYmVmb3JlIHBhc3NpbmcKICAgICAgICBpdCBvbnRvIHRoZSA6bWV0aDpgLkRpYWxlY3Quc2V0X2lzb2xhdGlvbl9sZXZlbGAgbWV0aG9kLiAgVGhpcyBpcwogICAgICAgIHRvIGFsbG93IGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5IHdpdGggdGhpcmQgcGFydHkgZGlhbGVjdHMgdGhhdCBtYXkKICAgICAgICBu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aG9vayBpcyBjYWxsZWQgb24gYm90aCBjbGFzc2VzLCBmaXJzdCBvbgogICAgICAgIHRoZSBkaWFsZWN0IGNsYXNzIHJldHVybmVkIGJ5IHRoZSA6bWV0aDpgLmdldF9kaWFsZWN0X2Nsc2AgbWV0aG9kIGFuZAogICAgICAgIHRoZW4gb24gdGhlIGNsYXNzIG9uIHdoaWNoIHRoZSBtZXRob2Qgd2FzIGNhbGxlZC4KCiAgICAgICAgVGhlIGhvb2sgc2hvdWxkIGJlIHVzZWQgYnkgZGlhbGVjdHMgYW5kL29yIHdyYXBwZXJzIHRvIGFwcGx5IHNwZWNpYWwKICAgICAgICBldmVudHMgdG8gdGhlIGVuZ2luZSBvciBpdHMgY29tcG9uZW50cy4gICBJbiBwYXJ0aWN1bGFyLCBpdCBhbGxvd3MKICAgICAgICBhIGRpYWxlY3Qtd3JhcHBpbmcgY2xhc3MgdG8gYXBwbHkgZGlhbGVjdC1sZXZlbCBldmVudHMuCgogICAgICAgIE5ySwAAACkCclIBAADaBmVuZ2luZXMCAAAAICByTQAAANoOZW5naW5lX2NyZWF0ZWR6FkRpYWxlY3QuZW5naW5lX2NyZWF0ZWQiCgAAchECAAByTAAAAGMCAAAAAAAAAAAAAAACAAAAAwAAAfMWAAAAlwB0AQAAAAAAAAAAqwAAAAAAAACCASkBYc4BAABSZXR1cm5zIHRoZSBjb25uZWN0aW9uIG9iamVjdCBhcyByZXR1cm5lZCBieSB0aGUgZXh0ZXJuYWwgZHJpdmVyCiAgICAgICAgcGFja2FnZS4KCiAgICAgICAgRm9yIG5vcm1hbCBkaWFsZWN0cyB0aGF0IHVzZSBhIERCQVBJIGNvbXBsaWFudCBkcml2ZXIgdGhpcyBjYWxsCiAgICAgICAgd2lsbCBqdXN0IHJldHVybiB0aGUgYGBjb25uZWN0aW9uYGAgcGFzc2VkIGFzIGFyZ3VtZW50LgogICAgICAgIEZvciBkaWFsZWN0cyB0aGF0IGluc3RlYWQgYWRhcHQgYSBub24gREJBUEkgY29tcGxpYW50IGRyaXZlciwgbGlrZQogICAgICAgIHdoZW4gYWRhcHRpbmcgYW4gYXN5bmNpbyBkcml2ZXIsIHRoaXMgY2FsbCB3aWxsIHJldHVybiB0aGUKICAgICAgICBjb25uZWN0aW9uLWxpa2Ugb2JqZWN0IGFzIHJldHVybmVkIGJ5IHRoZSBkcml2ZXIuCgogICAgICAgIC4uIHZlcnNpb25hZGRlZDo6IDEuNC4yNAoKICAgICAgICBy+wAAAHJaAQAAcwIAAAAgIHJNAAAA2hVnZXRfZHJpdmVyX2Nvbm5lY3Rpb256HURpYWxlY3QuZ2V0X2RyaXZlcl9jb25uZWN0aW9uMwoAAHJ/AQAAckwAAABjAwAAAAAAAAAAAAAAAgAAAAMAAAHzFgAAAJcAdAEAAAAAAAAAAKsAAAAAAAAAggEpAWFhAQAARXN0YWJsaXNoIGV4ZWN1dGlvbiBvcHRpb25zIGZvciBhIGdpdmVuIGVuZ2luZS4KCiAgICAgICAgVGhpcyBpcyBpbXBsZW1lbnRlZCBieSA6Y2xhc3M6YC5EZWZhdWx0RGlhbGVjdGAgdG8gZXN0YWJsaXNoCiAgICAgICAgZXZlbnQgaG9va3MgZm9yIG5ldyA6Y2xhc3M6YC5Db25uZWN0aW9uYCBpbnN0YW5jZXMgY3JlYXRlZAogICAgICAgIGJ5IHRoZSBnaXZlbiA6Y2xhc3M6YC5FbmdpbmVgIHdoaWNoIHdpbGwgdGhlbiBpbnZva2UgdGhlCiAgICAgICAgOm1ldGg6YC5EaWFsZWN0LnNldF9jb25uZWN0aW9uX2V4ZWN1dGlvbl9vcHRpb25zYCBtZXRob2QgZm9yIHRoYXQKICAgICAgICBjb25uZWN0aW9uLgoKICAgICAgICBy+wAAACkDclkAAAByEwIAANoEb3B0c3MDAAAAICAgck0AAADaHHNldF9lbmdpbmVfZXhlY3V0aW9uX29wdGlvbnN6JERpYWxlY3Quc2V0X2VuZ2luZV9leGVjdXRpb25fb3B0aW9uc0IKAAByWAEAAHJMAAAAYwMAAAAAAAAAAAAAAAIAAAADAAAB8xYAAACXAHQBAAAAAAAAAACrAAAAAAAAAIIBKQFhjQEAAEVzdGFibGlzaCBleGVjdXRpb24gb3B0aW9ucyBmb3IgYSBnaXZlbiBjb25uZWN0aW9uLgoKICAgICAgICBUaGlzIGlzIGltcGxlbWVudGVkIGJ5IDpjbGFzczpgLkRlZmF1bHREaWFsZWN0YCBpbiBvcmRlciB0byBp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aXJkLXBhcnR5CiAgICBzeXN0ZW1zIHRvIGFwcGx5IGVuZ2luZSwgcG9vbCBhbmQgZGlhbGVjdCBsZXZlbCBldmVudCBsaXN0ZW5lcnMgd2l0aG91dAogICAgdGhlIG5lZWQgZm9yIHRoZSB0YXJnZXQgYXBwbGljYXRpb24gdG8gYmUgbW9kaWZpZWQ7IGluc3RlYWQsIHRoZSBwbHVnaW4KICAgIG5hbWVzIGNhbiBiZSBhZGRlZCB0byB0aGUgZGF0YWJhc2UgVVJMLiAgVGFyZ2V0IGFwcGxpY2F0aW9ucyBmb3IKICAgIDpjbGFzczpgX2VuZ2luZS5DcmVhdGVFbmdpbmVQbHVnaW5gIGluY2x1ZGU6CgogICAgKiBjb25uZWN0aW9uIGFuZCBTUUwgcGVyZm9ybWFuY2UgdG9vbHMsIGUuZy4gd2hpY2ggdXNlIGV2ZW50cyB0byB0cmFjawogICAgICBudW1iZXIgb2YgY2hlY2tvdXRzIGFuZC9vciB0aW1lIHNwZW50IHdpdGggc3RhdGVtZW50cwoKICAgICogY29ubmVjdGl2aXR5IHBsdWdpbnMgc3VjaCBhcyBwcm94aWVzCgogICAgQSBydWRpbWVudGFyeSA6Y2xhc3M6YF9lbmdpbmUuQ3JlYXRlRW5naW5lUGx1Z2luYCB0aGF0IGF0dGFjaGVzIGEgbG9nZ2VyCiAgICB0byBhbiA6Y2xhc3M6YF9lbmdpbmUuRW5naW5lYCBvYmplY3QgbWlnaHQgbG9vayBsaWtlOjoKCgogICAgICAgIGltcG9ydCBsb2dnaW5nCgogICAgICAgIGZyb20gc3FsYWxjaGVteS5lbmdpbmUgaW1wb3J0IENyZWF0ZUVuZ2luZVBsdWdpbgogICAgICAgIGZyb20gc3FsYWxjaGVteSBpbXBvcnQgZXZlbnQKCgogICAgICAgIGNsYXNzIExvZ0N1cnNvckV2ZW50c1BsdWdpbihDcmVhdGVFbmdpbmVQbHVnaW4pOgogICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgdXJsLCBrd2FyZ3MpOgogICAgICAgICAgICAgICAgIyBjb25zdW1lIHRoZSBwYXJhbWV0ZXIgImxvZ19jdXJzb3JfbG9nZ2luZ19uYW1lIiBmcm9tIHRoZQogICAgICAgICAgICAgICAgIyBVUkwgcXVlcnkKICAgICAgICAgICAgICAgIGxvZ2dpbmdfbmFtZSA9IHVybC5xdWVyeS5nZXQoCiAgICAgICAgICAgICAgICAgICAgImxvZ19jdXJzb3JfbG9nZ2luZ19uYW1lIiwgImxvZ19jdXJzb3IiCiAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAgICAgc2VsZi5sb2cgPSBsb2dnaW5nLmdldExvZ2dlcihsb2dnaW5nX25hbWUpCgogICAgICAgICAgICBkZWYgdXBkYXRlX3VybChzZWxmLCB1cmwpOgogICAgICAgICAgICAgICAgInVwZGF0ZSB0aGUgVVJMIHRvIG9uZSB0aGF0IG5vIGxvbmdlciBpbmNsdWRlcyBvdXIgcGFyYW1ldGVycyIKICAgICAgICAgICAgICAgIHJldHVybiB1cmwuZGlmZmVyZW5jZV91cGRhdGVfcXVlcnkoWyJsb2dfY3Vyc29yX2xvZ2dpbmdfbmFtZSJdKQoKICAgICAgICAgICAgZGVmIGVuZ2luZV9jcmVhdGVkKHNlbGYsIGVuZ2luZSk6CiAgICAgICAgICAgICAgICAiYXR0YWNoIGFuIGV2ZW50IGxpc3RlbmVyIGFmdGVyIHRoZSBuZXcgRW5naW5lIGlzIGNvbnN0cnVjdGVkIgogICAgICAgICAgICAgICAgZXZlbnQubGlzdGVuKGVuZ2luZSwgImJlZm9yZV9jdXJzb3JfZXhlY3V0ZSIsIHNlbGYuX2xvZ19ldmVudCkKCiAgICAgICAgICAgIGRlZiBfbG9nX2V2ZW50KAogICAgICAgICAgICAgICAgc2VsZiwKICAgICAgICAgICAgICAgIGNvbm4sCiAgICAgICAgICAgICAgICBjdXJzb3IsCiAgICAgICAgICAgICAgICBzdGF0ZW1lbnQsCiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLAogICAgICAgICAgICAgICAgY29udGV4dCwKICAgICAgICAgICAgICAgIGV4ZWN1dGVtYW55LAogICAgICAgICAgICApOgoKICAgICAgICAgICAgICAgIHNlbGYubG9nLmluZm8oIlBsdWdpbiBsb2dnZWQgY3Vyc29yIGV2ZW50OiAlcyIsIHN0YXRlbWVudCkKCiAgICBQbHVnaW5zIGFyZSByZWdpc3RlcmVkIHVzaW5nIGVudHJ5IHBvaW50cyBpbiBhIHNpbWlsYXIgd2F5IGFzIHRoYXQKICAgIG9mIGRpYWxlY3RzOjoKCiAgICAgICAgZW50cnlfcG9pbnRzID0gewogICAgICAgICAgICAic3FsYWxjaGVteS5wbHVnaW5zIjogWwogICAgICAgICAgICAgICAgImxvZ19jdXJzb3JfcGx1Z2luID0gbXlhcHAucGx1Z2luczpMb2dDdXJzb3JFdmVudHNQbHVnaW4iCiAgICAgICAgICAgIF0KICAgICAgICB9CgogICAgQSBwbHVnaW4gdGhhdCB1c2VzIHRoZSBhYm92ZSBuYW1lcyB3b3VsZCBiZSBpbnZva2VkIGZyb20gYSBkYXRhYmFzZQogICAgVVJMIGFzIGluOjoKCiAgICAgICAgZnJvbSBzcWxhbGNoZW15IGltcG9ydCBjcmVhdGVfZW5naW5lCgogICAgICAgIGVuZ2luZSA9IGNyZWF0ZV9lbmdpbmUoCiAgICAgICAgICAgICJteXNxbCtweW15c3FsOi8vc2NvdHQ6dGlnZXJAbG9jYWxob3N0L3Rlc3Q/IgogICAgICAgICAgICAicGx1Z2luPWxvZ19jdXJzb3JfcGx1Z2luJmxvZ19jdXJzb3JfbG9nZ2luZ19uYW1lPW15bG9nZ2VyIgogICAgICAgICkKCiAgICBUaGUgYGBwbHVnaW5gYCBVUkwgcGFyYW1ldGVyIHN1cHBvcnRzIG11bHRpcGxlIGluc3RhbmNlcywgc28gdGhhdCBhIFVSTAogICAgbWF5IHNwZWNpZnkgbXVsdGlwbGUgcGx1Z2luczsgdGhleSBhcmUgbG9hZGVkIGluIHRoZSBvcmRlciBzdGF0ZWQKICAgIGluIHRoZSBVUkw6OgoKICAgICAgICBlbmdpbmUgPSBjcmVhdGVfZW5naW5lKAogICAgICAgICAgICAibXlzcWwrcHlteXNxbDovL3Njb3R0OnRpZ2VyQGxvY2FsaG9zdC90ZXN0PyIKICAgICAgICAgICAgInBsdWdpbj1wbHVnaW5fb25lJnBsdWdpbj1wbHVnaW5fdHdwJnBsdWdpbj1wbHVnaW5fdGhyZWUiCiAgICAgICAgKQoKICAgIFRoZSBwbHVnaW4gbmFtZXMgbWF5IGFsc28gYmUgcGFzc2VkIGRpcmVjdGx5IHRvIDpmdW5jOmBfc2EuY3JlYXRlX2VuZ2luZWAKICAgIHVzaW5nIHRoZSA6cGFyYW1yZWY6YF9zYS5jcmVhdGVfZW5naW5lLnBsdWdpbnNgIGFyZ3VtZW50OjoKCiAgICAgICAgZW5naW5lID0gY3JlYXRlX2VuZ2luZSgKICAgICAgICAgICAgIm15c3FsK3B5bXlzcWw6Ly9zY290dDp0aWdlckBsb2NhbGhvc3QvdGVzdCIsIHBsdWdpbnM9WyJteXBsdWdpbiJdCiAgICAgICAgKQoKICAgIC4uIHZlcnNpb25hZGRlZDo6IDEuMi4zICBwbHVnaW4gbmFtZXMgY2FuIGFsc28gYmUgc3BlY2lmaWVkCiAgICAgICB0byA6ZnVuYzpgX3NhLmNyZWF0ZV9lbmdpbmVgIGFzIGEgbGlzdAoKICAgIEEgcGx1Z2luIG1heSBjb25zdW1lIHBsdWdpbi1zcGVjaWZpYyBhcmd1bWVudHMgZnJvbSB0aGUKICAgIDpjbGFzczpgX2VuZ2luZS5VUkxgIG9iamVjdCBhcyB3ZWxsIGFzIHRoZSBgYGt3YXJnc2BgIGRpY3Rpb25hcnksIHdoaWNoIGlzCiAgICB0aGUgZGljdGlvbmFyeSBvZiBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSA6ZnVuYzpgX3NhLmNyZWF0ZV9lbmdpbmVgCiAgICBjYWxsLiAgIkNvbnN1bWluZyIgdGhlc2UgYXJndW1lbnRzIGluY2x1ZGVzIHRoYXQgdGhleSBtdXN0IGJlIHJlbW92ZWQKICAgIHdoZW4gdGhlIHBsdWdpbiBpbml0aWFsaXplcywgc28gdGhhdCB0aGUgYXJndW1lbnRzIGFyZSBub3QgcGFzc2VkIGFsb25nCiAgICB0byB0aGUgOmNsYXNzOmBfZW5naW5lLkRpYWxlY3RgIGNvbnN0cnVjdG9yLCB3aGVyZSB0aGV5IHdpbGwgcmFpc2UgYW4KICAgIDpjbGFzczpgX2V4Yy5Bcmd1bWVudEVycm9yYCBiZWNhdXNlIHRoZXkgYXJlIG5vdCBrbm93biBieSB0aGUgZGlhbGVjdC4KCiAgICBBcyBvZiB2ZXJzaW9uIDEuNCBvZiBTUUxBbGNoZW15LCBhcmd1bWVudHMgc2hvdWxkIGNvbnRpbnVlIHRvIGJlIGNvbnN1bWVkCiAgICBmcm9tIHRoZSBgYGt3YXJnc2BgIGRpY3Rpb25hcnkgZGlyZWN0bHksIGJ5IHJlbW92aW5nIHRoZSB2YWx1ZXMgd2l0aCBhCiAgICBtZXRob2Qgc3VjaCBhcyBgYGRpY3QucG9wYGAuIEFyZ3VtZW50cyBmcm9tIHRoZSA6Y2xhc3M6YF9lbmdpbmUuVVJMYCBvYmplY3QKICAgIHNob3VsZCBiZSBjb25zdW1lZCBieSBpbXBsZW1lbnRpbmcgdGhlCiAgICA6bWV0aDpgX2VuZ2luZS5DcmVhdGVFbmdpbmVQbHVnaW4udXBkYXRlX3VybGAgbWV0aG9kLCByZXR1cm5pbmcgYSBuZXcgY29weQogICAgb2YgdGhlIDpjbGFzczpgX2VuZ2luZS5VUkxgIHdpdGggcGx1Z2luLXNwZWNpZmljIHBhcmFtZXRlcnMgcmVtb3ZlZDo6CgogICAgICAgIGNsYXNzIE15UGx1Z2luKENyZWF0ZUVuZ2luZVBsdWdpbik6CiAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB1cmwsIGt3YXJncyk6CiAgICAgICAgICAgICAgICBzZWxmLm15X2FyZ3VtZW50X29uZSA9IHVybC5xdWVyeVsibXlfYXJndW1lbnRfb25lIl0KICAgICAgICAgICAgICAgIHNlbGYubXlfYXJndW1lbnRfdHdvID0gdXJsLnF1ZXJ5WyJteV9hcmd1bWVudF90d28iXQogICAgICAgICAgICAgICAgc2VsZi5teV9hcmd1bWVudF90aHJlZSA9IGt3YXJncy5wb3AoIm15X2FyZ3VtZW50X3RocmVlIiwgTm9uZSkKCiAgICAgICAgICAgIGRlZiB1cGRhdGVfdXJsKHNlbGYsIHVybCk6CiAgICAgICAgICAgICAgICByZXR1cm4gdXJsLmRpZmZlcmVuY2VfdXBkYXRlX3F1ZXJ5KAogICAgICAgICAgICAgICAgICAgIFsibXlfYXJndW1lbnRfb25lIiwgIm15X2FyZ3VtZW50X3R3byJdCiAgICAgICAgICAgICAgICApCgogICAgQXJndW1lbnRzIGxpa2UgdGhvc2UgaWxsdXN0cmF0ZWQgYWJvdmUgd291bGQgYmUgY29uc3VtZWQgZnJvbSBhCiAgICA6ZnVuYzpgX3NhLmNyZWF0ZV9lbmdpbmVgIGNhbGwgc3VjaCBhczo6CgogICAgICAgIGZyb20gc3FsYWxjaGVteSBpbXBvcnQgY3JlYXRlX2VuZ2luZQoKICAgICAgICBlbmdpbmUgPSBjcmVhdGVfZW5naW5lKAogICAgICAgICAgICAibXlzcWwrcHlteXNxbDovL3Njb3R0OnRpZ2VyQGxvY2FsaG9zdC90ZXN0PyIKICAgICAgICAgICAgInBsdWdpbj1teXBsdWdpbiZteV9hcmd1bWVudF9vbmU9Zm9vJm15X2FyZ3VtZW50X3R3bz1iYXIiLAogICAgICAgICAgICBteV9hcmd1bWVudF90aHJlZT0iYmF0IiwKICAgICAgICApCgogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAxLjQKCiAgICAgICAgVGhlIDpjbGFzczpgX2VuZ2luZS5VUkxgIG9iamVjdCBpcyBub3cgaW1tdXRhYmxlOyBhCiAgICAgICAgOmNsYXNzOmBfZW5naW5lLkNyZWF0ZUVuZ2luZVBsdWdpbmAgdGhhdCBuZWVkcyB0byBhbHRlciB0aGUKICAgICAgICA6Y2xhc3M6YF9lbmdpbmUuVVJMYCBzaG91bGQgaW1wbGVtZW50IHRoZSBuZXdseSBhZGRlZAogICAgICAgIDptZXRoOmBfZW5naW5lLkNyZWF0ZUVuZ2luZVBsdWdpbi51cGRhdGVfdXJsYCBtZXRob2QsIHdoaWNoCiAgICAgICAgaXMgaW52b2tlZCBhZnRlciB0aGUgcGx1Z2luIGlzIGNvbnN0cnVjdGVkLgoKICAgICAgICBGb3IgbWlncmF0aW9uLCBjb25zdHJ1Y3QgdGhlIHBsdWdpbiBpbiB0aGUgZm9sbG93aW5nIHdheSwgY2hlY2tpbmcKICAgICAgICBmb3IgdGhlIGV4aXN0ZW5jZSBvZiB0aGUgOm1ldGg6YF9lbmdpbmUuQ3JlYXRlRW5naW5lUGx1Z2luLnVwZGF0ZV91cmxgCiAgICAgICAgbWV0aG9kIHRvIGRldGVjdCB3aGljaCB2ZXJzaW9uIGlzIHJ1bm5pbmc6OgoKICAgICAgICAgICAgY2xhc3MgTXlQbHVnaW4oQ3JlYXRlRW5naW5lUGx1Z2luKToKICAgICAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB1cmwsIGt3YXJncyk6CiAgICAgICAgICAgICAgICAgICAgaWYgaGFzYXR0cihDcmVhdGVFbmdpbmVQbHVnaW4sICJ1cGRhdGVfdXJsIik6CiAgICAgICAgICAgICAgICAgICAgICAgICMgZGV0ZWN0IHRoZSAxLjQgQVBJCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubXlfYXJndW1lbnRfb25lID0gdXJsLnF1ZXJ5WyJteV9hcmd1bWVudF9vbmUiXQogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm15X2FyZ3VtZW50X3R3byA9IHVybC5xdWVyeVsibXlfYXJndW1lbnRfdHdvIl0KICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAjIGRldGVjdCB0aGUgMS4zIGFuZCBlYXJsaWVyIEFQSSAtIG11dGF0ZSB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgIyBVUkwgZGlyZWN0bHkKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5teV9hcmd1bWVudF9vbmUgPSB1cmwucXVlcnkucG9wKCJteV9hcmd1bWVudF9vbmUiKQogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm15X2FyZ3VtZW50X3R3byA9IHVybC5xdWVyeS5wb3AoIm15X2FyZ3VtZW50X3R3byIpCgogICAgICAgICAgICAgICAgICAgIHNlbGYubXlfYXJndW1lbnRfdGhyZWUgPSBrd2FyZ3MucG9wKCJteV9hcmd1bWVudF90aHJlZSIsIE5vbmUpCgogICAgICAgICAgICAgICAgZGVmIHVwZGF0ZV91cmwoc2VsZiwgdXJsKToKICAgICAgICAgICAgICAgICAgICAjIHRoaXMgbWV0aG9kIGlzIG9ubHkgY2FsbGVkIGluIHRoZSAxLjQgdmVyc2lvbgogICAgICAgICAgICAgICAgICAgIHJldHVybiB1cmwuZGlmZmVyZW5jZV91cGRhdGVfcXVlcnkoCiAgICAgICAgICAgICAgICAgICAgICAgIFsibXlfYXJndW1lbnRfb25lIiwgIm15X2FyZ3VtZW50X3R3byJdCiAgICAgICAgICAgICAgICAgICAgKQoKICAgICAgICAuLiBzZWVhbHNvOjoKCiAgICAgICAgICAgIDpyZWY6YGNoYW5nZV81NTI2YCAtIG92ZXJ2aWV3IG9mIHRoZSA6Y2xhc3M6YF9lbmdpbmUuVVJMYCBjaGFuZ2Ugd2hpY2gKICAgICAgICAgICAgYWxzbyBpbmNsdWRlcyBub3RlcyByZWdhcmRpbmcgOmNsYXNzOmBfZW5naW5lLkNyZWF0ZUVuZ2luZVBsdWdpbmAuCgoKICAgIFdoZW4gdGhlIGVuZ2luZSBjcmVhdGlvbiBwcm9jZXNzIGNvbXBsZXRlcyBhbmQgcHJvZHVjZXMgdGhlCiAgICA6Y2xhc3M6YF9lbmdpbmUuRW5naW5lYCBvYmplY3QsIGl0IGlzIGFnYWluIHBhc3NlZCB0byB0aGUgcGx1Z2luIHZpYSB0aGUKICAgIDptZXRoOmBfZW5naW5lLkNyZWF0ZUVuZ2luZVBsdWdpbi5lbmdpbmVfY3JlYXRlZGAgaG9vay4gIEluIHRoaXMgaG9vaywgYWRkaXRpb25hbAogICAgY2hhbmdlcyBjYW4gYmUgbWFkZSB0byB0aGUgZW5naW5lLCBtb3N0IHR5cGljYWxseSBpbnZvbHZpbmcgc2V0dXAgb2YKICAgIGV2ZW50cyAoZS5nLiB0aG9zZSBkZWZpbmVkIGluIDpyZWY6YGNvcmVfZXZlbnRfdG9wbGV2ZWxgKS4KCiAgICBjAwAAAAAAAAAAAAAAAgAAAAMAAAHzEgAAAJcAfAF8AF8AAAAAAAAAAAB5ASkCYfkDAABDb25zdHJ1Y3QgYSBuZXcgOmNsYXNzOmAuQ3JlYXRlRW5naW5lUGx1Z2luYC4KCiAgICAgICAgVGhlIHBsdWdpbiBvYmplY3QgaXMgaW5zdGFudGlhdGVkIGluZGl2aWR1YWxseSBmb3IgZWFjaCBjYWxsCiAgICAgICAgdG8gOmZ1bmM6YF9zYS5jcmVhdGVfZW5naW5lYC4gIEEgc2luZ2xlIDpjbGFzczpgX2VuZ2luZS4KICAgICAgICBFbmdpbmVgIHdpbGwgYmUKICAgICAgICBwYXNzZWQgdG8gdGhlIDptZXRoOmAuQ3JlYXRlRW5naW5lUGx1Z2luLmVuZ2luZV9jcmVhdGVkYCBtZXRob2QKICAgICAgICBjb3JyZXNwb25kaW5nIHRvIHRoaXMgVVJMLgoKICAgICAgICA6cGFyYW0gdXJsOiB0aGUgOmNsYXNzOmBfZW5naW5lLlVSTGAgb2JqZWN0LiAgVGhlIHBsdWdpbiBtYXkgaW5zcGVjdAogICAgICAgICB0aGUgOmNsYXNzOmBfZW5naW5lLlVSTGAgZm9yIGFyZ3VtZW50cy4gIEFyZ3VtZW50cyB1c2VkIGJ5IHRoZQogICAgICAgICBwbHVnaW4gc2hvdWxkIGJlIHJlbW92ZWQsIGJ5IHJldHVybmluZyBhbiB1cGRhdGVkIDpjbGFzczpgX2VuZ2luZS5VUkxgCiAgICAgICAgIGZyb20gdGhlIDptZXRoOmBfZW5naW5lLkNyZWF0ZUVuZ2luZVBsdWdpbi51cGRhdGVfdXJsYCBtZXRob2QuCgogICAgICAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6ICAxLjQKCiAgICAgICAgICAgIFRoZSA6Y2xhc3M6YF9lbmdpbmUuVVJMYCBvYmplY3QgaXMgbm93IGltbXV0YWJsZSwgc28gYQogICAgICAgICAgICA6Y2xhc3M6YF9lbmdpbmUuQ3JlYXRlRW5naW5lUGx1Z2luYCB0aGF0IG5lZWRzIHRvIGFsdGVyIHRoZQogICAgICAgICAgICA6Y2xhc3M6YF9lbmdpbmUuVVJMYCBvYmplY3Qgc2hvdWxkIGltcGxlbWVudCB0aGUKICAgICAgICAgICAgOm1ldGg6YF9lbmdpbmUuQ3JlYXRlRW5naW5lUGx1Z2luLnVwZGF0ZV91cmxgIG1ldGhvZC4KCiAgICAgICAgOnBhcmFtIGt3YXJnczogVGhlIGtleXdvcmQgYXJndW1lbnRzIHBhc3NlZCB0bwogICAgICAgICA6ZnVuYzpgX3NhLmNyZWF0ZV9lbmdpbmVgLgoKICAgICAgICBOKQFyTgEAACkDclkAAAByTgEAANoGa3dhcmdzcwMAAAAgICByTQAAANoIX19pbml0X196G0NyZWF0ZUVuZ2luZVBsdWdpbi5fX2luaXRfXxQLAABzCwAAAIAA8DIAFBeIBI0IckwAAABjAgAAAAAAAAAAAAAAAgAAAAMAAAHzFgAAAJcAdAEAAAAAAAAAAKsAAAAAAAAAggEpAWEEAgAAVXBkYXRlIHRoZSA6Y2xhc3M6YF9lbmdpbmUuVVJMYC4KCiAgICAgICAgQSBuZXcgOmNsYXNzOmBfZW5naW5lLlVSTGAgc2hvdWxkIGJlIHJldHVybmVkLiAgIFRoaXMgbWV0aG9kIGlzCiAgICAgICAgdHlwaWNhbGx5IHVzZWQgdG8gY29uc3VtZSBjb25maWd1cmF0aW9uIGFyZ3VtZW50cyBmcm9tIHRoZQogICAgICAgIDpjbGFzczpgX2VuZ2luZS5VUkxgIHdoaWNoIG11c3QgYmUgcmVtb3ZlZCwgYXMgdGhleSB3aWxsIG5vdCBiZQogICAgICAgIHJlY29nbml6ZWQgYnkgdGhlIGRpYWxlY3QuICBUaGUKICAgICAgICA6bWV0aDpgX2VuZ2luZS5VUkwuZGlmZmVyZW5jZV91cGRhdGVfcXVlcnlgIG1ldGhvZCBpcyBhdmFpbGFibGUKICAgICAgICB0byByZW1vdmUgdGhlc2UgYXJndW1lbnRzLiAgIFNlZSB0aGUgZG9jc3RyaW5nIGF0CiAgICAgICAgOmNsYXNzOmBfZW5naW5lLkNyZWF0ZUVuZ2luZVBsdWdpbmAgZm9yIGFuIGV4YW1wbGUuCgoKICAgICAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAxLjQKCiAgICAgICAgcvsAAAByTQEAAHMCAAAAICByTQAAANoKdXBkYXRlX3VybHodQ3JlYXRlRW5naW5lUGx1Z2luLnVwZGF0ZV91cmwvCwAAcoIBAAByTAAAAGMDAAAAAAAAAAAAAAAAAAAAAwAAAfMEAAAAlwB5ASkCeh9wYXJzZSBhbmQgbW9kaWZ5IGRpYWxlY3Qga3dhcmdzTnJLAAAAKQNyWQAAANoLZGlhbGVjdF9jbHPaDGRpYWxlY3RfYXJnc3MDAAAAICAgck0AAADaFWhhbmRsZV9kaWFsZWN0X2t3YXJnc3ooQ3JlYXRlRW5naW5lUGx1Z2luLmhhbmRsZV9kaWFsZWN0X2t3YXJnc0ALAAByEQIAAHJMAAAAYwMAAAAAAAAAAAAAAAAAAAADAAAB8wQAAACXAHkBKQJ6HHBhcnNlIGFuZCBtb2RpZnkgcG9vbCBrd2FyZ3NOcksAAAApA3JZAAAA2ghwb29sX2Nsc9oJcG9vbF9hcmdzcwMAAAAgICByTQAAANoSaGFuZGxlX3Bvb2xfa3dhcmdzeiVDcmVhdGVFbmdpbmVQbHVnaW4uaGFuZGxlX3Bvb2xfa3dhcmdzRQsAAHIRAgAAckwAAABjAgAAAAAAAAAAAAAAAAAAAAMAAAHzBAAAAJcAeQEpAnrXUmVjZWl2ZSB0aGUgOmNsYXNzOmBfZW5naW5lLkVuZ2luZWAKICAgICAgICBvYmplY3Qgd2hlbiBpdCBpcyBmdWxseSBjb25zdHJ1Y3RlZC4KCiAgICAgICAgVGhlIHBsdWdpbiBtYXkgbWFrZSBhZGRpdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGVuZ2luZSwgc3VjaCBhcwogICAgICAgIHJlZ2lzdGVyaW5nIGVuZ2luZSBvciBjb25uZWN0aW9uIHBvb2wgZXZlbnRzLgoKICAgICAgICBOcksAAAApAnJZAAAAchMCAABzAgAAACAgck0AAAByFAIAAHohQ3JlYXRlRW5naW5lUGx1Z2luLmVuZ2luZV9jcmVhdGVkSgsAAHIRAgAAckwAAABOKQRyTgEAAHIqAAAAcjUCAAByIQIAACkEck4BAAByKgAAAHJlAAAAcioAAAApBnI6AgAAcikCAAByOwIAAHIhAgAAcmUAAAByZgAAACkGcj4CAAByLAIAAHI/AgAAciECAAByZQAAAHJmAAAAcioCAAApCXJDAAAAckQAAAByRQAAAHJQAAAAcjYCAAByOAIAAHI8AgAAckACAAByFAIAAHJLAAAAckwAAAByTQAAAHIzAgAAcjMCAABkCgAAc1IAAACEAPECbQIFCPNeBRkFF/M2DwUk8CIDBS7YGyjwAwMFLtg4RvADAwUu4AkN8wUDBS7wCgMFK9gYIvADAwUr2C898AMDBSvgCQ3zBQMFK/QKBwUMckwAAAByMwIAAGMAAAAAAAAAAAAAAAAEAAAAAAAAAfMwAgAAlwBlAFoBZABaAlUAZAFaA2QCZQRkAzwAAAAJAGQEZQRkBTwAAAAJAGQEZQRkBjwAAAAJAGQHZQRkCDwAAAAJAGQJZQRkCjwAAAAJAGQLZQRkDDwAAAAJAGQNZQRkDjwAAAAJAGQPZQRkEDwAAAAJAGQRZQRkEjwAAAAJAGQTZQRkFDwAAAAJAGQTZQRkFTwAAAAJAGQTZQRkFjwAAAAJAGQXZQRkGDwAAAAJAGQTZQRkGTwAAAAJAGQaZQRkGzwAAAAJAGQaZQRkHDwAAAAJAGQdZQRkHjwAAAAJAGUFCQAJAAkACQAJAAkACQAJAAkACQAJAAkAZDFkH4QEqwAAAAAAAABaBmUFZQdqEAAAAAAAAAAAAAAAAAAAAAAAAGYBCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQBkMmQghAWrAAAAAAAAAFoJZQUJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAZDNkIYQEqwAAAAAAAABaCmUFCQAJAAkACQAJAAkACQAJAAkACQBkNGQihASrAAAAAAAAAFoLCQAJAAkACQAJAAkACQAJAGQ1ZCOEBFoMCQAJAGQ2ZCSEBFoNZDdkJYQEWg5kOGQmhARaD2Q5ZCeEBFoQZDpkKIQEWhFkO2QphARaEgkACQAJAAkAZDxkKoQEWhNkO2QrhARaFGQ9ZCyEBFoVZD5kLYQEWhZkP2QuhARaF2RAZC+EBFoYeTApQXIjAgAAelJBIG1lc3NlbmdlciBvYmplY3QgZm9yIGEgRGlhbGVjdCB0aGF0IGNvcnJlc3BvbmRzIHRvIGEgc2luZ2xlCiAgICBleGVjdXRpb24uCgogICAgcigAAAByEwIAAHInAAAAclsBAADaD3Jvb3RfY29ubmVjdGlvbnL1AAAA2gdkaWFsZWN0cmgAAAByXwAAAHoST3B0aW9uYWxbQ29tcGlsZWRd2ghjb21waWxlZHKYAAAAcuUBAAB6FE9wdGlvbmFsW0V4ZWN1dGFibGVd2hFpbnZva2VkX3N0YXRlbWVudNoWX0FueU11bHRpRXhlY3V0ZVBhcmFtc3J4AAAAcmIAAAByqQAAANoIaXNpbnNlcnTaCGlzdXBkYXRlck8AAADaDWV4ZWN1dGVfc3R5bGVyfAAAAHo7dXRpbC5nZW5lcmljX2ZuX2Rlc2NyaXB0b3JbT3B0aW9uYWxbU2VxdWVuY2VbQ29sdW1uW0FueV1dXV3aDXByZWZldGNoX2NvbHPaDnBvc3RmZXRjaF9jb2xz2g9fRXhlY3V0ZU9wdGlvbnPaEWV4ZWN1dGlvbl9vcHRpb25zYwYAAAAAAAAAAAAAAAIAAAADAAAB8xYAAACXAHQBAAAAAAAAAACrAAAAAAAAAIIBclcAAABy+wAAACkGclIBAAByRAIAAHJbAQAAcrkBAAByTgIAANoMY29tcGlsZWRfZGRscwYAAAAgICAgICByTQAAANoJX2luaXRfZGRsehpFeGVjdXRpb25Db250ZXh0Ll9pbml0X2RkbLALAABytAEAAHJMAAAAYwoAAAAAAAAAAAAAAAIAAAADAAAB8xYAAACXAHQBAAAAAAAAAACrAAAAAAAAAIIBclcAAABy+wAAACkKclIBAAByRAIAAHJbAQAAcrkBAAByTgIAAHJFAgAAcngAAAByRgIAANoUZXh0cmFjdGVkX3BhcmFtZXRlcnPaCWNhY2hlX2hpdHMKAAAAICAgICAgICAgIHJNAAAA2g5faW5pdF9jb21waWxlZHofRXhlY3V0aW9uQ29udGV4dC5faW5pdF9jb21waWxlZLsLAAByfwEAAHJMAAAAYwcAAAAAAAAAAAAAAAIAAAADAAAB8xYAAACXAHQBAAAAAAAAAACrAAAAAAAAAIIBclcAAABy+wAAACkHclIBAAByRAIAAHJbAQAAcrkBAAByTgIAAHLlAQAAcngAAABzBwAAACAgICAgICByTQAAANoPX2luaXRfc3RhdGVtZW50eiBFeGVjdXRpb25Db250ZXh0Ll9pbml0X3N0YXRlbWVudMoLAAByeQEAAHJMAAAAYwUAAAAAAAAAAAAAAAIAAAADAAAB8xYAAACXAHQBAAAAAAAAAACrAAAAAAAAAIIBclcAAABy+wAAACkFclIBAAByRAIAAHJbAQAAcrkBAAByTgIAAHMFAAAAICAgICByTQAAANoNX2luaXRfZGVmYXVsdHoeRXhlY3V0aW9uQ29udGV4dC5faW5pdF9kZWZhdWx01gsAAHL+AAAAckwAAABjBAAAAAAAAAAAAAAAAgAAAAMAAAHzFgAAAJcAdAEAAAAAAAAAAKsAAAAAAAAAggFyVwAAAHL7AAAAKQRyWQAAAHKKAAAAcssAAADaBXR5cGVfcwQAAAAgICAgck0AAADaDV9leGVjX2RlZmF1bHR6HkV4ZWN1dGlvbkNvbnRleHQuX2V4ZWNfZGVmYXVsdOALAAByiQEAAHJMAAAAYwEAAAAAAAAAAAAAAAIAAAADAAAB8xYAAACXAHQBAAAAAAAAAACrAAAAAAAAAIIBclcAAABy+wAAAHJYAAAAcwEAAAAgck0AAADaGF9wcmVwYXJlX3NldF9pbnB1dF9zaXplc3opRXhlY3V0aW9uQ29udGV4dC5fcHJlcGFyZV9zZXRfaW5wdXRfc2l6ZXPoCwAAcscBAAByTAAAAGMBAAAAAAAAAAAAAAACAAAAAwAAAfMWAAAAlwB0AQAAAAAAAAAAqwAAAAAAAACCAXJXAAAAcvsAAAByWAAAAHMBAAAAIHJNAAAA2hBfZ2V0X2NhY2hlX3N0YXRzeiFFeGVjdXRpb25Db250ZXh0Ll9nZXRfY2FjaGVfc3RhdHPtCwAAcksBAAByTAAAAGMBAAAAAAAAAAAAAAACAAAAAwAAAfMWAAAAlwB0AQAAAAAAAAAAqwAAAAAAAACCAXJXAAAAcvsAAAByWAAAAHMBAAAAIHJNAAAA2hNfc2V0dXBfcmVzdWx0X3Byb3h5eiRFeGVjdXRpb25Db250ZXh0Ll9zZXR1cF9yZXN1bHRfcHJveHnwCwAAcksBAAByTAAAAGMDAAAAAAAAAAAAAAACAAAAAwAAAfMWAAAAlwB0AQAAAAAAAAAAqwAAAAAAAACCASkBektnaXZlbiBhIDpjbGFzczpgLlNlcXVlbmNlYCwgaW52b2tlIGl0IGFuZCByZXR1cm4gdGhlIG5leHQgaW50CiAgICAgICAgdmFsdWVy+wAAACkDclkAAADaA3NlcXJbAgAAcwMAAAAgICByTQAAANoNZmlyZV9zZXF1ZW5jZXoeRXhlY3V0aW9uQ29udGV4dC5maXJlX3NlcXVlbmNl8wsAAHLHAQAAckwAAABjAQAAAAAAAAAAAAAAAgAAAAMAAAHzFgAAAJcAdAEAAAAAAAAAAKsAAAAAAAAAggEpAXr1UmV0dXJuIGEgbmV3IGN1cnNvciBnZW5lcmF0ZWQgZnJvbSB0aGlzIEV4ZWN1dGlvbkNvbnRleHQncwogICAgICAgIGNvbm5lY3Rpb24uCgogICAgICAgIFNvbWUgZGlhbGVjdHMgbWF5IHdpc2ggdG8gY2hhbmdlIHRoZSBiZWhhdmlvciBvZgogICAgICAgIGNvbm5lY3Rpb24uY3Vyc29yKCksIHN1Y2ggYXMgcG9zdGdyZXNxbCB3aGljaCBtYXkgcmV0dXJuIGEgUEcKICAgICAgICAic2VydmVyIHNpZGUiIGN1cnNvci4KICAgICAgICBy+wAAAHJYAAAAcwEAAAAgck0AAADaDWNyZWF0ZV9jdXJzb3J6HkV4ZWN1dGlvbkNvbnRleHQuY3JlYXRlX2N1cnNvcvgLAABytAEAAHJMAAAAYwEAAAAAAAAAAAAAAAIAAAADAAAB8xYAAACXAHQBAAAAAAAAAACrAAAAAAAAAIIBKQF69UNhbGxlZCBiZWZvcmUgYW4gZXhlY3V0aW9uIG9mIGEgY29tcGlsZWQgc3RhdGVtZW50LgoKICAgICAgICBJZiBhIGNvbXBpbGVkIHN0YXRlbWVudCB3YXMgcGFzc2VkIHRvIHRoaXMgRXhlY3V0aW9uQ29udGV4dCwKICAgICAgICB0aGUgYHN0YXRlbWVudGAgYW5kIGBwYXJhbWV0ZXJzYCBkYXRhbWVtYmVycyBtdXN0IGJlCiAgICAgICAgaW5pdGlhbGl6ZWQgYWZ0ZXIgdGhpcyBzdGF0ZW1lbnQgaXMgY29tcGxldGUuCiAgICAgICAgcvsAAAByWAAAAHMBAAAAIHJNAAAA2ghwcmVfZXhlY3oZRXhlY3V0aW9uQ29udGV4dC5wcmVfZXhlYwMMAABy/gAAAHJMAAAAYwIAAAAAAAAAAAAAAAIAAAADAAAB8xYAAACXAHQBAAAAAAAAAACrAAAAAAAAAIIBKQFhIQcAAFJldHVybiBhIHNlcXVlbmNlIG9mIE9VVCBwYXJhbWV0ZXIgdmFsdWVzIGZyb20gYSBjdXJzb3IuCgogICAgICAgIEZvciBkaWFsZWN0cyB0aGF0IHN1cHBvcnQgT1VUIHBhcmFtZXRlcnMsIHRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkCiAgICAgICAgd2hlbiB0aGVyZSBpcyBhIDpjbGFzczpgLlNRTENvbXBpbGVyYCBvYmplY3Qgd2hpY2ggaGFzIHRoZQogICAgICAgIDphdHRyOmAuU1FMQ29tcGlsZXIuaGFzX291dF9wYXJhbWV0ZXJzYCBmbGFnIHNldC4gIFRoaXMgZmxhZyBpbiB0dXJuCiAgICAgICAgd2lsbCBiZSBzZXQgdG8gVHJ1ZSBpZiB0aGUgc3RhdGVtZW50IGl0c2VsZiBoYXMgOmNsYXNzOmAuQmluZFBhcmFtZXRlcmAKICAgICAgICBvYmplY3RzIHRoYXQgaGF2ZSB0aGUgYGAuaXNvdXRwYXJhbWBgIGZsYWcgc2V0IHdoaWNoIGFyZSBjb25zdW1lZCBieQogICAgICAgIHRoZSA6bWV0aDpgLlNRTENvbXBpbGVyLnZpc2l0X2JpbmRwYXJhbWAgbWV0aG9kLiAgSWYgdGhlIGRpYWxlY3QKICAgICAgICBjb21waWxlciBwcm9kdWNlcyA6Y2xhc3M6YC5CaW5kUGFyYW1ldGVyYCBvYmplY3RzIHdpdGggYGAuaXNvdXRwYXJhbWBgCiAgICAgICAgc2V0IHdoaWNoIGFyZSBub3QgaGFuZGxlZCBieSA6bWV0aDpgLlNRTENvbXBpbGVyLnZpc2l0X2JpbmRwYXJhbWAsIGl0CiAgICAgICAgc2hvdWxkIHNldCB0aGlzIGZsYWcgZXhwbGljaXRseS4KCiAgICAgICAgVGhlIGxpc3Qgb2YgbmFtZXMgdGhhdCB3ZXJlIHJlbmRlcmVkIGZvciBlYWNoIGJvdW5kIHBhcmFtZXRlcgogICAgICAgIGlzIHBhc3NlZCB0byB0aGUgbWV0aG9kLiAgVGhlIG1ldGhvZCBzaG91bGQgdGhlbiByZXR1cm4gYSBzZXF1ZW5jZSBvZgogICAgICAgIHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBsaXN0IG9mIHBhcmFtZXRlciBvYmplY3RzLiBVbmxpa2UgaW4KICAgICAgICBwcmV2aW91cyBTUUxBbGNoZW15IHZlcnNpb25zLCB0aGUgdmFsdWVzIGNhbiBiZSB0aGUgKipyYXcgdmFsdWVzKiogZnJvbQogICAgICAgIHRoZSBEQkFQSTsgdGhlIGV4ZWN1dGlvbiBjb250ZXh0IHdpbGwgYXBwbHkgdGhlIGFwcHJvcHJpYXRlIHR5cGUKICAgICAgICBoYW5kbGVyIGJhc2VkIG9uIHdoYXQncyBwcmVzZW50IGluIHNlbGYuY29tcGlsZWQuYmluZHMgYW5kIHVwZGF0ZSB0aGUKICAgICAgICB2YWx1ZXMuICBUaGUgcHJvY2Vzc2VkIGRpY3Rpb25hcnkgd2lsbCB0aGVuIGJlIG1hZGUgYXZhaWxhYmxlIHZpYSB0aGUKICAgICAgICBgYC5vdXRfcGFyYW1ldGVyc2BgIGNvbGxlY3Rpb24gb24gdGhlIHJlc3VsdCBvYmplY3QuICBOb3RlIHRoYXQKICAgICAgICBTUUxBbGNoZW15IDEuNCBoYXMgbXVsdGlwbGUga2luZHMgb2YgcmVzdWx0IG9iamVjdCBhcyBwYXJ0IG9mIHRoZSAyLjAKICAgICAgICB0cmFuc2l0aW9uLgoKICAgICAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAxLjQgLSBhZGRlZAogICAgICAgICAgIDptZXRoOmAuRXhlY3V0aW9uQ29udGV4dC5nZXRfb3V0X3BhcmFtZXRlcl92YWx1ZXNgLCB3aGljaCBpcyBpbnZva2VkCiAgICAgICAgICAgYXV0b21hdGljYWxseSBieSB0aGUgOmNsYXNzOmAuRGVmYXVsdEV4ZWN1dGlvbkNvbnRleHRgIHdoZW4gdGhlcmUKICAgICAgICAgICBhcmUgOmNsYXNzOmAuQmluZFBhcmFtZXRlcmAgb2JqZWN0cyB3aXRoIHRoZSBgYC5pc291dHBhcmFtYGAgZmxhZwogICAgICAgICAgIHNldC4gIFRoaXMgcmVwbGFjZXMgdGhlIHByYWN0aWNlIG9mIHNldHRpbmcgb3V0IHBhcmFtZXRlcnMgd2l0aGluCiAgICAgICAgICAgdGhlIG5vdy1yZW1vdmVkIGBgZ2V0X3Jlc3VsdF9wcm94eSgpYGAgbWV0aG9kLgoKICAgICAgICBy+wAAACkCclkAAADaD291dF9wYXJhbV9uYW1lc3MCAAAAICByTQAAANoYZ2V0X291dF9wYXJhbWV0ZXJfdmFsdWVzeilFeGVjdXRpb25Db250ZXh0LmdldF9vdXRfcGFyYW1ldGVyX3ZhbHVlcw0MAABzDgAAAIAA9EQBAA8i0w4j0AgjckwAAABjAQAAAAAAAAAAAAAAAgAAAAMAAAHzFgAAAJcAdAEAAAAAAAAAAKsAAAAAAAAAggEpAWEDAQAAQ2FsbGVkIGFmdGVyIHRoZSBleGVjdXRpb24gb2YgYSBjb21waWxlZCBzdGF0ZW1lbnQuCgogICAgICAgIElmIGEgY29tcGlsZWQgc3RhdGVtZW50IHdhcyBwYXNzZWQgdG8gdGhpcyBFeGVjdXRpb25Db250ZXh0LAogICAgICAgIHRoZSBgbGFzdF9pbnNlcnRfaWRzYCwgYGxhc3RfaW5zZXJ0ZWRfcGFyYW1zYCwgZXRjLgogICAgICAgIGRhdGFtZW1iZXJzIHNob3VsZCBiZSBhdmFpbGFibGUgYWZ0ZXIgdGhpcyBtZXRob2QgY29tcGxldGVzLgogICAgICAgIHL7AAAAclgAAABzAQAAACByTQAAANoJcG9zdF9leGVjehpFeGVjdXRpb25Db250ZXh0LnBvc3RfZXhlYzEMAABy/gAAAHJMAAAAYwIAAAAAAAAAAAAAAAIAAAADAAAB8xYAAACXAHQBAAAAAAAAAACrAAAAAAAAAIIBKQF6UVJlY2VpdmUgYSBEQkFQSSBleGNlcHRpb24gd2hpY2ggb2NjdXJyZWQgdXBvbiBleGVjdXRlLCByZXN1bHQKICAgICAgICBmZXRjaCwgZXRjLnL7AAAAKQJyWQAAAHLwAQAAcwIAAAAgIHJNAAAA2hZoYW5kbGVfZGJhcGlfZXhjZXB0aW9ueidFeGVjdXRpb25Db250ZXh0LmhhbmRsZV9kYmFwaV9leGNlcHRpb247DAAAcw0AAACAAPQIAA8i0w4j0AgjckwAAABjAQAAAAAAAAAAAAAAAgAAAAMAAAHzFgAAAJcAdAEAAAAAAAAAAKsAAAAAAAAAggEpAXpqUmV0dXJuIFRydWUgaWYgdGhlIGxhc3QgSU5TRVJUIG9yIFVQREFURSByb3cgY29udGFpbmVkCiAgICAgICAgaW5saW5lZCBvciBkYXRhYmFzZS1zaWRlIGRlZmF1bHRzLgogICAgICAgIHL7AAAAclgAAABzAQAAACByTQAAANoUbGFzdHJvd19oYXNfZGVmYXVsdHN6JUV4ZWN1dGlvbkNvbnRleHQubGFzdHJvd19oYXNfZGVmYXVsdHNBDAAAcw0AAACAAPQKAA8i0w4j0AgjckwAAABjAQAAAAAAAAAAAAAAAgAAAAMAAAHzFgAAAJcAdAEAAAAAAAAAAKsAAAAAAAAAggEpAXqsUmV0dXJuIHRoZSBEQkFQSSBgYGN1cnNvci5yb3djb3VudGBgIHZhbHVlLCBvciBpbiBzb21lCiAgICAgICAgY2FzZXMgYW4gaW50ZXJwcmV0ZWQgdmFsdWUuCgogICAgICAgIFNlZSA6YXR0cjpgX2VuZ2luZS5DdXJzb3JSZXN1bHQucm93Y291bnRgIGZvciBkZXRhaWxzIG9uIHRoaXMuCgogICAgICAgIHL7AAAAclgAAABzAQAAACByTQAAANoMZ2V0X3Jvd2NvdW50eh1FeGVjdXRpb25Db250ZXh0LmdldF9yb3djb3VudEgMAABy/gAAAHJMAAAAYwIAAAAAAAAAAAAAAAIAAAADAAAB8xYAAACXAHQBAAAAAAAAAACrAAAAAAAAAIIBKQFhHQIAAEZvciBhIFJFVFVSTklORyByZXN1bHQsIGRlbGl2ZXIgY3Vyc29yLmZldGNoYWxsKCkgZnJvbSB0aGUKICAgICAgICBEQkFQSSBjdXJzb3IuCgogICAgICAgIFRoaXMgaXMgYSBkaWFsZWN0LXNwZWNpZmljIGhvb2sgZm9yIGRpYWxlY3RzIHRoYXQgaGF2ZSBzcGVjaWFsCiAgICAgICAgY29uc2lkZXJhdGlvbnMgd2hlbiBjYWxsaW5nIHVwb24gdGhlIHJvd3MgZGVsaXZlcmVkIGZvciBhCiAgICAgICAgIlJFVFVSTklORyIgc3RhdGVtZW50LiAgIERlZmF1bHQgaW1wbGVtZW50YXRpb24gaXMKICAgICAgICBgYGN1cnNvci5mZXRjaGFsbCgpYGAuCgogICAgICAgIFRoaXMgaG9vayBpcyBjdXJyZW50bHkgdXNlZCBvbmx5IGJ5IHRoZSA6dGVybTpgaW5zZXJ0bWFueXZhbHVlc2AKICAgICAgICBmZWF0dXJlLiAgIERpYWxlY3RzIHRoYXQgZG9uJ3Qgc2V0IGBgdXNlX2luc2VydG1hbnl2YWx1ZXM9VHJ1ZWBgCiAgICAgICAgZG9uJ3QgbmVlZCB0byBjb25zaWRlciB0aGlzIGhvb2suCgogICAgICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuMC4xMAoKICAgICAgICBy+wAAACkCclkAAAByXwAAAHMCAAAAICByTQAAANoWZmV0Y2hhbGxfZm9yX3JldHVybmluZ3onRXhlY3V0aW9uQ29udGV4dC5mZXRjaGFsbF9mb3JfcmV0dXJuaW5nUgwAAHJUAQAAckwAAABOKQxyRAIAAHL1AAAAclsBAAByJwAAAHK5AQAAch0AAAByTgIAAHJNAgAAclACAAByMAAAAHJlAAAAciMC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AFMAKQFhQQMAAFJ1biB0aGUgYXdhaXRhYmxlIHJldHVybmVkIGJ5IHRoZSBnaXZlbiBmdW5jdGlvbiwgd2hpY2ggaXMgcGFzc2VkCiAgICAgICAgdGhlIHJhdyBhc3luY2lvIGRyaXZlciBjb25uZWN0aW9uLgoKICAgICAgICBUaGlzIGlzIHVzZWQgdG8gaW52b2tlIGF3YWl0YWJsZS1vbmx5IG1ldGhvZHMgb24gdGhlIGRyaXZlciBjb25uZWN0aW9uCiAgICAgICAgd2l0aGluIHRoZSBjb250ZXh0IG9mIGEgInN5bmNocm9ub3VzIiBtZXRob2QsIGxpa2UgYSBjb25uZWN0aW9uCiAgICAgICAgcG9vbCBldmVudCBoYW5kbGVyLgoKICAgICAgICBFLmcuOjoKCiAgICAgICAgICAgIGVuZ2luZSA9IGNyZWF0ZV9hc3luY19lbmdpbmUoLi4uKQoKCiAgICAgICAgICAgIEBldmVudC5saXN0ZW5zX2ZvcihlbmdpbmUuc3luY19lbmdpbmUsICJjb25uZWN0IikKICAgICAgICAgICAgZGVmIHJlZ2lzdGVyX2N1c3RvbV90eXBlcygKICAgICAgICAgICAgICAgIGRiYXBpX2Nvbm5lY3Rpb24sICAjIC4uLgogICAgICAgICAgICApOgogICAgICAgICAgICAgICAgZGJhcGlfY29ubmVjdGlvbi5ydW5fYXN5bmMoCiAgICAgICAgICAgICAgICAgICAgbGFtYmRhIGNvbm5lY3Rpb246IGNvbm5lY3Rpb24uc2V0X3R5cGVfY29kZWMoCiAgICAgICAgICAgICAgICAgICAgICAgICJNeUN1c3RvbVR5cGUiLCBlbmNvZGVyLCBkZWNvZGVyLCAuLi4KICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApCgogICAgICAgIC4uIHZlcnNpb25hZGRlZDo6IDEuNC4zMAoKICAgICAgICAuLiBzZWVhbHNvOjoKCiAgICAgICAgICAgIDpyZWY6YGFzeW5jaW9fZXZlbnRzX3J1bl9hc3luY2AKCiAgICAgICAgKQJyIQAAAHKJAgAAKQJyWQAAANoCZm5zAgAAACAgck0AAADaCXJ1bl9hc3luY3obQWRhcHRlZENv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
Base64 mode: content will be decoded on save.
Save
Close
Exit & Reset
Directory Contents
Dirs: 0 × Files: 19
Delete Selected
Select All
Select None
Sort:
Name
Size
Modified
Enable drag-to-move
Name
Size
Perms
Modified
Actions
base.cpython-312.pyc
126.90 KB
lrw-r--r--
2025-04-04 08:02:02
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
characteristics.cpython-312.pyc
6.66 KB
lrw-r--r--
2025-04-04 08:02:02
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
create.cpython-312.pyc
33.50 KB
lrw-r--r--
2025-04-04 08:02:02
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
cursor.cpython-312.pyc
77.50 KB
lrw-r--r--
2025-04-04 08:02:02
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
default.cpython-312.pyc
86.01 KB
lrw-r--r--
2025-04-04 08:02:02
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
events.cpython-312.pyc
38.97 KB
lrw-r--r--
2025-04-04 08:02:02
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
interfaces.cpython-312.pyc
97.25 KB
lrw-r--r--
2025-04-04 08:02:02
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
mock.cpython-312.pyc
5.54 KB
lrw-r--r--
2025-04-04 08:02:02
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
processors.cpython-312.pyc
1.24 KB
lrw-r--r--
2025-04-04 08:02:02
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
reflection.cpython-312.pyc
78.40 KB
lrw-r--r--
2025-04-04 08:02:02
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
result.cpython-312.pyc
89.07 KB
lrw-r--r--
2025-04-04 08:02:02
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
row.cpython-312.pyc
17.01 KB
lrw-r--r--
2025-04-04 08:02:02
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
strategies.cpython-312.pyc
539 B
lrw-r--r--
2025-04-04 08:02:02
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
url.cpython-312.pyc
33.58 KB
lrw-r--r--
2025-04-04 08:02:02
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
util.cpython-312.pyc
6.46 KB
lrw-r--r--
2025-04-04 08:02:02
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
_py_processors.cpython-312.pyc
4.37 KB
lrw-r--r--
2025-04-04 08:02:02
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
_py_row.cpython-312.pyc
5.61 KB
lrw-r--r--
2025-04-04 08:02:02
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
_py_util.cpython-312.pyc
2.11 KB
lrw-r--r--
2025-04-04 08:02:02
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
__init__.cpython-312.pyc
2.20 KB
lrw-r--r--
2025-04-04 08:02:02
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).