ZGlmZiAtLWdpdCBhL3NyYy9iYXNlL3RpbWUuY2MgYi9zcmMvYmFzZS90aW1lLmNjCmluZGV4IDZkMjA2NjcuLmZhZDU1MDggMTAwNjQ0Ci0tLSBhL3NyYy9iYXNlL3RpbWUuY2MKKysrIGIvc3JjL2Jhc2UvdGltZS5jYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgImJhc2UvdGhpcmRfcGFydHkvbnNwci9wcnRpbWUuaCIKIAogI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9kb3VibGUuaCIKIAogbmFtZXNwYWNlIGJhc2UgewogCkBAIC0xMzcsNyArMTM4LDcgQEAKIAogLy8gc3RhdGljCiBUaW1lIFRpbWU6OkZyb21Eb3VibGVUKGRvdWJsZSBkdCkgewotICBpZiAoZHQgPT0gMCB8fCBpc25hbihkdCkpCisgIGlmIChkdCA9PSAwIHx8IFNiRG91YmxlSXNOYW4oZHQpKQogICAgIHJldHVybiBUaW1lKCk7ICAvLyBQcmVzZXJ2ZSAwIHNvIHdlIGNhbiB0ZWxsIGl0IGRvZXNuJ3QgZXhpc3QuCiAgIGlmIChkdCA9PSBzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46Om1heCgpKQogICAgIHJldHVybiBNYXgoKTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYWNjZXNzaWJpbGl0eS9zdGFyYm9hcmRfdHRzX2VuZ2luZS5jYyBiL3NyYy9jb2JhbHQvYWNjZXNzaWJpbGl0eS9zdGFyYm9hcmRfdHRzX2VuZ2luZS5jYwppbmRleCBkMjc4OGZjLi42ZmI3YTEwIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2FjY2Vzc2liaWxpdHkvc3RhcmJvYXJkX3R0c19lbmdpbmUuY2MKKysrIGIvc3JjL2NvYmFsdC9hY2Nlc3NpYmlsaXR5L3N0YXJib2FyZF90dHNfZW5naW5lLmNjCkBAIC0yMSwxMiArMjEsMTIgQEAKIG5hbWVzcGFjZSBjb2JhbHQgewogbmFtZXNwYWNlIGFjY2Vzc2liaWxpdHkgewogCi12b2lkIFN0YXJib2FyZFRUU0VuZ2luZTo6U3BlYWtOb3coY29uc3Qgc3RkOjpzdHJpbmcmIHRleHQpIE9WRVJSSURFIHsKK3ZvaWQgU3RhcmJvYXJkVFRTRW5naW5lOjpTcGVha05vdyhjb25zdCBzdGQ6OnN0cmluZyYgdGV4dCkgewogICBTYlNwZWVjaFN5bnRoZXNpc0NhbmNlbCgpOwogICBTcGVhayh0ZXh0KTsKIH0KIAotdm9pZCBTdGFyYm9hcmRUVFNFbmdpbmU6OlNwZWFrKGNvbnN0IHN0ZDo6c3RyaW5nJiB0ZXh0KSBPVkVSUklERSB7Cit2b2lkIFN0YXJib2FyZFRUU0VuZ2luZTo6U3BlYWsoY29uc3Qgc3RkOjpzdHJpbmcmIHRleHQpIHsKICAgU2JTcGVlY2hTeW50aGVzaXNTcGVhayh0ZXh0LmNfc3RyKCkpOwogfQogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jhc2UvdG9rZW5zLmggYi9zcmMvY29iYWx0L2Jhc2UvdG9rZW5zLmgKaW5kZXggYzcwYTk3ZS4uN2NhMTI4ZSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iYXNlL3Rva2Vucy5oCisrKyBiL3NyYy9jb2JhbHQvYmFzZS90b2tlbnMuaApAQCAtMjEsODIgKzIxLDkwIEBACiBuYW1lc3BhY2UgYmFzZSB7CiAKIC8vIGNsYW5nLWZvcm1hdCBvZmYKLSNkZWZpbmUgVE9LRU5TX0ZPUl9FQUNIX1dJVEhfTkFNRV9PTkxZKE1hY3JvT3BXaXRoTmFtZU9ubHkpICAgXAotICAgIE1hY3JvT3BXaXRoTmFtZU9ubHkoYWRkc291cmNlYnVmZmVyKSAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgTWFjcm9PcFdpdGhOYW1lT25seShhZGR0cmFjaykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBNYWNyb09wV2l0aE5hbWVPbmx5KGFib3J0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIE1hY3JvT3BXaXRoTmFtZU9ubHkoYWRkaXRpb25zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgTWFjcm9PcFdpdGhOYW1lT25seShhbGwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBNYWNyb09wV2l0aE5hbWVPbmx5KGFsdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIE1hY3JvT3BXaXRoTmFtZU9ubHkoYW5pbWF0aW9uZW5kKSAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgTWFjcm9PcFdpdGhOYW1lT25seShhc3NlcnRpdmUpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBNYWNyb09wV2l0aE5hbWVPbmx5KGF0dHJpYnV0ZXMpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIE1hY3JvT3BXaXRoTmFtZU9ubHkoYmx1cikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgTWFjcm9PcFdpdGhOYW1lT25seShib3VuZGFyeSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBNYWNyb09wV2l0aE5hbWVPbmx5KGNhbnBsYXkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIE1hY3JvT3BXaXRoTmFtZU9ubHkoY2FucGxheXRocm91Z2gpICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgTWFjcm9PcFdpdGhOYW1lT25seShjaGFuZ2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBNYWNyb09wV2l0aE5hbWVPbmx5KGNoYXJhY3RlckRhdGEpICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIE1hY3JvT3BXaXRoTmFtZU9ubHkoY2hpbGRMaXN0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgTWFjcm9PcFdpdGhOYW1lT25seShjbG9zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBNYWNyb09wV2l0aE5hbWVPbmx5KGR1cmF0aW9uY2hhbmdlKSAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIE1hY3JvT3BXaXRoTmFtZU9ubHkoZW1wdGllZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgTWFjcm9PcFdpdGhOYW1lT25seShlbmQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBNYWNyb09wV2l0aE5hbWVPbmx5KGVuZGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIE1hY3JvT3BXaXRoTmFtZU9ubHkoZXJyb3IpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgTWFjcm9PcFdpdGhOYW1lT25seShmb2N1cykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBNYWNyb09wV2l0aE5hbWVPbmx5KGhhc2hjaGFuZ2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIE1hY3JvT3BXaXRoTmFtZU9ubHkoa2V5YWRkZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgTWFjcm9PcFdpdGhOYW1lT25seShrZXlkb3duKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBNYWNyb09wV2l0aE5hbWVPbmx5KGtleWVycm9yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIE1hY3JvT3BXaXRoTmFtZU9ubHkoa2V5bWVzc2FnZSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgTWFjcm9PcFdpdGhOYW1lT25seShrZXlwcmVzcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBNYWNyb09wV2l0aE5hbWVPbmx5KGtleXVwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIE1hY3JvT3BXaXRoTmFtZU9ubHkobG9hZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgTWFjcm9PcFdpdGhOYW1lT25seShsb2FkZWRkYXRhKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBNYWNyb09wV2l0aE5hbWVPbmx5KGxvYWRlZG1ldGFkYXRhKSAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIE1hY3JvT3BXaXRoTmFtZU9ubHkobG9hZGVuZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgTWFjcm9PcFdpdGhOYW1lT25seShsb2Fkc3RhcnQpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBNYWNyb09wV2l0aE5hbWVPbmx5KG1hcmspICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIE1hY3JvT3BXaXRoTmFtZU9ubHkobWVzc2FnZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgTWFjcm9PcFdpdGhOYW1lT25seShuZWVka2V5KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBNYWNyb09wV2l0aE5hbWVPbmx5KG5vbWF0Y2gpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIE1hY3JvT3BXaXRoTmFtZU9ubHkob2ZmKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgTWFjcm9PcFdpdGhOYW1lT25seShvcGVuKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBNYWNyb09wV2l0aE5hbWVPbmx5KHBhdXNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIE1hY3JvT3BXaXRoTmFtZU9ubHkocGxheSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgTWFjcm9PcFdpdGhOYW1lT25seShwbGF5aW5nKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBNYWNyb09wV2l0aE5hbWVPbmx5KHBvbGl0ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIE1hY3JvT3BXaXRoTmFtZU9ubHkocHJvZ3Jlc3MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgTWFjcm9PcFdpdGhOYW1lT25seShyYXRlY2hhbmdlKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBNYWNyb09wV2l0aE5hbWVPbmx5KHJlYWR5c3RhdGVjaGFuZ2UpICAgICAgICAgICAgICAgICAgICAgXAotICAgIE1hY3JvT3BXaXRoTmFtZU9ubHkocmVtb3ZhbHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgTWFjcm9PcFdpdGhOYW1lT25seShyZW1vdmVzb3VyY2VidWZmZXIpICAgICAgICAgICAgICAgICAgIFwKLSAgICBNYWNyb09wV2l0aE5hbWVPbmx5KHJlbW92ZXRyYWNrKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIE1hY3JvT3BXaXRoTmFtZU9ubHkocmVzdWx0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgTWFjcm9PcFdpdGhOYW1lT25seShyZXN1bWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBNYWNyb09wV2l0aE5hbWVPbmx5KHNlY3VyaXR5cG9saWN5dmlvbGF0aW9uKSAgICAgICAgICAgICAgXAotICAgIE1hY3JvT3BXaXRoTmFtZU9ubHkoc2Vla2VkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgTWFjcm9PcFdpdGhOYW1lT25seShzZWVraW5nKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBNYWNyb09wV2l0aE5hbWVPbmx5KHNvdW5kZW5kKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIE1hY3JvT3BXaXRoTmFtZU9ubHkoc291bmRzdGFydCkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgTWFjcm9PcFdpdGhOYW1lT25seShzb3VyY2VjbG9zZSkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBNYWNyb09wV2l0aE5hbWVPbmx5KHNvdXJjZWVuZGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIE1hY3JvT3BXaXRoTmFtZU9ubHkoc291cmNlb3BlbikgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgTWFjcm9PcFdpdGhOYW1lT25seShzdGFydCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBNYWNyb09wV2l0aE5hbWVPbmx5KHN0b3JhZ2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIE1hY3JvT3BXaXRoTmFtZU9ubHkoc3RhbGxlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgTWFjcm9PcFdpdGhOYW1lT25seShzdXNwZW5kKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBNYWNyb09wV2l0aE5hbWVPbmx5KHRleHQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIE1hY3JvT3BXaXRoTmFtZU9ubHkodGltZW91dCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgTWFjcm9PcFdpdGhOYW1lT25seSh0aW1ldXBkYXRlKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBNYWNyb09wV2l0aE5hbWVPbmx5KHRyYW5zaXRpb25lbmQpICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIE1hY3JvT3BXaXRoTmFtZU9ubHkodW5sb2FkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgTWFjcm9PcFdpdGhOYW1lT25seSh1cGRhdGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBNYWNyb09wV2l0aE5hbWVPbmx5KHVwZGF0ZWVuZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIE1hY3JvT3BXaXRoTmFtZU9ubHkodXBkYXRlc3RhcnQpICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgTWFjcm9PcFdpdGhOYW1lT25seSh2b2ljZXNjaGFuZ2VkKSAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBNYWNyb09wV2l0aE5hbWVPbmx5KHZvbHVtZWNoYW5nZSkgICAgICAgICAgICAgICAgICAgICAgICAgXAorI2lmIGRlZmluZWQoQ09CQUxUX01FRElBX1NPVVJDRV8yMDE2KQorI2RlZmluZSBUT0tFTlNfRk9SX0VBQ0hfV0lUSF9OQU1FX09OTFlfRU1FKE1hY3JvT3BXaXRoTmFtZU9ubHkpICAgICAgXAorICAgIE1hY3JvT3BXaXRoTmFtZU9ubHkoZW5jcnlwdGVkKQorI2Vsc2UgIC8vIGRlZmluZWQoQ09CQUxUX01FRElBX1NPVVJDRV8yMDE2KQorI2RlZmluZSBUT0tFTlNfRk9SX0VBQ0hfV0lUSF9OQU1FX09OTFlfRU1FKE1hY3JvT3BXaXRoTmFtZU9ubHkpICAgICAgXAorICAgIE1hY3JvT3BXaXRoTmFtZU9ubHkoa2V5YWRkZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE1hY3JvT3BXaXRoTmFtZU9ubHkoa2V5ZXJyb3IpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE1hY3JvT3BXaXRoTmFtZU9ubHkoa2V5bWVzc2FnZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE1hY3JvT3BXaXRoTmFtZU9ubHkobmVlZGtleSkKKyNlbmRpZiAgLy8gZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCisKKyNkZWZpbmUgVE9LRU5TX0ZPUl9FQUNIX1dJVEhfTkFNRV9PTkxZKE1hY3JvT3BXaXRoTmFtZU9ubHkpICAgICAgICAgIFwKKyAgICBUT0tFTlNfRk9SX0VBQ0hfV0lUSF9OQU1FX09OTFlfRU1FKE1hY3JvT3BXaXRoTmFtZU9ubHkpICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KGFkZHNvdXJjZWJ1ZmZlcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KGFkZHRyYWNrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KGFib3J0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KGFkZGl0aW9ucykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KGFsbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KGFsdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KGFuaW1hdGlvbmVuZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KGFzc2VydGl2ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KGF0dHJpYnV0ZXMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KGJsdXIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KGJvdW5kYXJ5KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KGNhbnBsYXkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KGNhbnBsYXl0aHJvdWdoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KGNoYW5nZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KGNoYXJhY3RlckRhdGEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KGNoaWxkTGlzdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KGNsb3NlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KGR1cmF0aW9uY2hhbmdlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KGVtcHRpZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KGVuZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KGVuZGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KGVycm9yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KGZvY3VzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KGhhc2hjaGFuZ2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KGtleWRvd24pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KGtleXByZXNzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KGtleXVwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KGxvYWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KGxvYWRlZGRhdGEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KGxvYWRlZG1ldGFkYXRhKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KGxvYWRlbmQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KGxvYWRzdGFydCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KG1hcmspICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KG1lc3NhZ2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KG5vbWF0Y2gpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KG9mZikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KG9wZW4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KHBhdXNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KHBsYXkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KHBsYXlpbmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KHBvbGl0ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KHByb2dyZXNzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KHJhdGVjaGFuZ2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KHJlYWR5c3RhdGVjaGFuZ2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KHJlbW92YWxzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KHJlbW92ZXNvdXJjZWJ1ZmZlcikgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KHJlbW92ZXRyYWNrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KHJlc3VsdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KHJlc3VtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KHNlY3VyaXR5cG9saWN5dmlvbGF0aW9uKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KHNlZWtlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KHNlZWtpbmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KHNvdW5kZW5kKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KHNvdW5kc3RhcnQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KHNvdXJjZWNsb3NlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KHNvdXJjZWVuZGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KHNvdXJjZW9wZW4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KHN0YXJ0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KHN0b3JhZ2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KHN0YWxsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KHN1c3BlbmQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KHRleHQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KHRpbWVvdXQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KHRpbWV1cGRhdGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KHRyYW5zaXRpb25lbmQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KHVubG9hZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KHVwZGF0ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KHVwZGF0ZWVuZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KHVwZGF0ZXN0YXJ0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KHZvaWNlc2NoYW5nZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KHZvbHVtZWNoYW5nZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBNYWNyb09wV2l0aE5hbWVPbmx5KHdhaXRpbmcpCiAKICNkZWZpbmUgVE9LRU5TX0ZPUl9FQUNIX1dJVEhfTkFNRV9BTkRfVkFMVUUoTWFjcm9PcFdpdGhOYW1lQW5kVmFsdWUpICAgIFwKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9udW1lcmljX3R5cGVfYmluZGluZ3NfdGVzdC5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9udW1lcmljX3R5cGVfYmluZGluZ3NfdGVzdC5jYwppbmRleCA1NzQxZWI1Li5mNjYyMGYwIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbnVtZXJpY190eXBlX2JpbmRpbmdzX3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL251bWVyaWNfdHlwZV9iaW5kaW5nc190ZXN0LmNjCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSAiYmFzZS9zdHJpbmdwcmludGYuaCIKICNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9iaW5kaW5nc190ZXN0X2Jhc2UuaCIKICNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9udW1lcmljX3R5cGVzX3Rlc3RfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2RvdWJsZS5oIgogCiAjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCiAKQEAgLTgxLDcgKzgyLDcgQEAKIC8vIHdhcm5pbmcgQzQ4MDA6ICdpbnQnIDogZm9yY2luZyB2YWx1ZSB0byBib29sICd0cnVlJyBvciAnZmFsc2UnCiAjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0ODAwKQogI2VuZGlmCi0gIHJldHVybiBpc25hbihudW1iZXIpOworICByZXR1cm4gU2JEb3VibGVJc05hbihudW1iZXIpOwogI2lmIGRlZmluZWQoX01TQ19WRVIpCiAjcHJhZ21hIHdhcm5pbmcocG9wKQogI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jyb3dzZXIvYXBwbGljYXRpb24uY2MgYi9zcmMvY29iYWx0L2Jyb3dzZXIvYXBwbGljYXRpb24uY2MKaW5kZXggMGJkN2FmZS4uNzY1MjQ1YSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9icm93c2VyL2FwcGxpY2F0aW9uLmNjCisrKyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9hcHBsaWNhdGlvbi5jYwpAQCAtNDcxLDYgKzQ3MSwxNyBAQAogICB9CiAjZW5kaWYgIC8vICFkZWZpbmVkKENPQkFMVF9GT1JDRV9IVFRQUykKIAorICBpZiAoY29tbWFuZF9saW5lLT5IYXNTd2l0Y2goc3dpdGNoZXM6OmtWaWRlb1BsYXliYWNrUmF0ZU11bHRpcGxpZXIpKSB7CisgICAgZG91YmxlIHBsYXliYWNrX3JhdGUgPSAxLjA7CisgICAgYmFzZTo6U3RyaW5nVG9Eb3VibGUoY29tbWFuZF9saW5lLT5HZXRTd2l0Y2hWYWx1ZUFTQ0lJKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2hlczo6a1ZpZGVvUGxheWJhY2tSYXRlTXVsdGlwbGllciksCisgICAgICAgICAgICAgICAgICAgICAgICAgJnBsYXliYWNrX3JhdGUpOworICAgIG9wdGlvbnMud2ViX21vZHVsZV9vcHRpb25zLnZpZGVvX3BsYXliYWNrX3JhdGVfbXVsdGlwbGllciA9CisgICAgICAgIHN0YXRpY19jYXN0PGZsb2F0PihwbGF5YmFja19yYXRlKTsKKyAgICBETE9HKElORk8pIDw8ICJTZXQgdmlkZW8gcGxheWJhY2sgcmF0ZSBtdWx0aXBsaWVyIHRvICIKKyAgICAgICAgICAgICAgIDw8IG9wdGlvbnMud2ViX21vZHVsZV9vcHRpb25zLnZpZGVvX3BsYXliYWNrX3JhdGVfbXVsdGlwbGllcjsKKyAgfQorCiAgIEVuYWJsZVVzaW5nU3R1YkltYWdlRGVjb2RlcklmUmVxdWlyZWQoKTsKIAogICBpZiAoY29tbWFuZF9saW5lLT5IYXNTd2l0Y2goYnJvd3Nlcjo6c3dpdGNoZXM6OmtEaXNhYmxlV2VibVZwOSkpIHsKQEAgLTQ5Nyw2ICs1MDgsMTMgQEAKICAgfQogI2VuZGlmICAvLyBFTkFCTEVfREVCVUdfQ09NTUFORF9MSU5FX1NXSVRDSEVTCiAKKyAgaWYgKGNvbW1hbmRfbGluZS0+SGFzU3dpdGNoKGJyb3dzZXI6OnN3aXRjaGVzOjprRGlzYWJsZU5hdmlnYXRpb25XaGl0ZWxpc3QpKSB7CisgICAgTE9HKEVSUk9SKSA8PCAiXG4iCisgICAgICAgICAgICAgICA8PCAiICAqKiogRGlzYWJsaW5nIHRoZSBkZWZhdWx0IG5hdmlnYXRpb24gd2hpdGVsaXN0ISAqKipcbiIKKyAgICAgICAgICAgICAgIDw8ICIgICoqKiBEbyBub3QgcnVuIGluIHRoaXMgbW9kZSBpbiBwcm9kdWN0aW9uISAgICAgICoqKiI7CisgICAgb3B0aW9ucy53ZWJfbW9kdWxlX29wdGlvbnMubG9jYXRpb25fcG9saWN5ID0gImg1dmNjLWxvY2F0aW9uLXNyYyAqIjsKKyAgfQorCiAgIGFjY291bnRfbWFuYWdlcl8ucmVzZXQobmV3IGFjY291bnQ6OkFjY291bnRNYW5hZ2VyKCkpOwogICBicm93c2VyX21vZHVsZV8ucmVzZXQobmV3IEJyb3dzZXJNb2R1bGUoaW5pdGlhbF91cmwsIHN5c3RlbV93aW5kb3dfLmdldCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjb3VudF9tYW5hZ2VyXy5nZXQoKSwgb3B0aW9ucykpOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9icm93c2VyL2Jyb3dzZXJfYmluZGluZ3NfZ2VuLmd5cCBiL3NyYy9jb2JhbHQvYnJvd3Nlci9icm93c2VyX2JpbmRpbmdzX2dlbi5neXAKaW5kZXggYWEzNWM5YS4uNjg1Mjk2ZiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9icm93c2VyL2Jyb3dzZXJfYmluZGluZ3NfZ2VuLmd5cAorKysgYi9zcmMvY29iYWx0L2Jyb3dzZXIvYnJvd3Nlcl9iaW5kaW5nc19nZW4uZ3lwCkBAIC05Nyw4ICs5Nyw2IEBACiAgICAgICAgICcuLi9kb20vaHRtbF9pbWFnZV9lbGVtZW50LmlkbCcsCiAgICAgICAgICcuLi9kb20vaHRtbF9saW5rX2VsZW1lbnQuaWRsJywKICAgICAgICAgJy4uL2RvbS9odG1sX21lZGlhX2VsZW1lbnQuaWRsJywKLSAgICAgICAgIycuLi9kb20vaHRtbF9tZWRpYV9lbGVtZW50X2VtZS5pZGwnLAotICAgICAgICAjJy4uL2RvbS9odG1sX21lZGlhX2VuY3J5cHRlZF9ldmVudC5pZGwnLAogICAgICAgICAnLi4vZG9tL2h0bWxfbWV0YV9lbGVtZW50LmlkbCcsCiAgICAgICAgICcuLi9kb20vaHRtbF9wYXJhZ3JhcGhfZWxlbWVudC5pZGwnLAogICAgICAgICAnLi4vZG9tL2h0bWxfc2NyaXB0X2VsZW1lbnQuaWRsJywKQEAgLTExMCwxOCArMTA4LDYgQEAKICAgICAgICAgJy4uL2RvbS9rZXlib2FyZF9ldmVudC5pZGwnLAogICAgICAgICAnLi4vZG9tL2xvY2F0aW9uLmlkbCcsCiAgICAgICAgICcuLi9kb20vbWVkaWFfZXJyb3IuaWRsJywKLSAgICAgICAgJy4uL2RvbS9tZWRpYV9rZXlfY29tcGxldGVfZXZlbnQuaWRsJywKLSAgICAgICAgJy4uL2RvbS9tZWRpYV9rZXlfZXJyb3IuaWRsJywKLSAgICAgICAgJy4uL2RvbS9tZWRpYV9rZXlfZXJyb3JfZXZlbnQuaWRsJywKLSAgICAgICAgJy4uL2RvbS9tZWRpYV9rZXlfbWVzc2FnZV9ldmVudC5pZGwnLAotICAgICAgICAjJy4uL2RvbS9tZWRpYV9rZXlfbWVzc2FnZV9ldmVudF9pbml0LmlkbCcsCi0gICAgICAgICcuLi9kb20vbWVkaWFfa2V5X25lZWRlZF9ldmVudC5pZGwnLAotICAgICAgICAjJy4uL2RvbS9tZWRpYV9rZXlfc2Vzc2lvbi5pZGwnLAotICAgICAgICAjJy4uL2RvbS9tZWRpYV9rZXlfc3RhdHVzX21hcC5pZGwnLAotICAgICAgICAjJy4uL2RvbS9tZWRpYV9rZXlfc3lzdGVtX2FjY2Vzcy5pZGwnLAotICAgICAgICAjJy4uL2RvbS9tZWRpYV9rZXlfc3lzdGVtX2NvbmZpZ3VyYXRpb24uaWRsJywKLSAgICAgICAgIycuLi9kb20vbWVkaWFfa2V5X3N5c3RlbV9tZWRpYV9jYXBhYmlsaXR5LmlkbCcsCi0gICAgICAgICMnLi4vZG9tL21lZGlhX2tleXMuaWRsJywKICAgICAgICAgJy4uL2RvbS9tZWRpYV9xdWVyeV9saXN0LmlkbCcsCiAgICAgICAgICcuLi9kb20vbWVkaWFfc291cmNlLmlkbCcsCiAgICAgICAgICcuLi9kb20vbWVtb3J5X2luZm8uaWRsJywKQEAgLTEzMSw3ICsxMTcsNiBAQAogICAgICAgICAnLi4vZG9tL211dGF0aW9uX3JlY29yZC5pZGwnLAogICAgICAgICAnLi4vZG9tL25hbWVkX25vZGVfbWFwLmlkbCcsCiAgICAgICAgICcuLi9kb20vbmF2aWdhdG9yLmlkbCcsCi0gICAgICAgICMnLi4vZG9tL25hdmlnYXRvcl9lbWUuaWRsJywKICAgICAgICAgJy4uL2RvbS9ub2RlLmlkbCcsCiAgICAgICAgICcuLi9kb20vbm9kZV9saXN0LmlkbCcsCiAgICAgICAgICcuLi9kb20vcGVyZm9ybWFuY2UuaWRsJywKQEAgLTIxOSw3ICsyMDQsNiBAQAogICAgICAgICAnLi4veGhyL3htbF9odHRwX3JlcXVlc3RfdXBsb2FkLmlkbCcsCiAgICAgXSwKIAotCiAgICAgIyBJREwgZmlsZXMgdGhhdCB3aWxsIGVuZCB1cCBnZW5lcmF0aW5nIGEgLmggdGhhdCB3aWxsIGJlICNpbmNsdWRlZCBpbgogICAgICMgQ29iYWx0IGRpcmVjdGx5LiBJREwgZmlsZXMgZm9yIGRpY3Rpb25hcmllcyBhbmQgZW51bXMuCiAgICAgJ2dlbmVyYXRlZF9oZWFkZXJfaWRsX2ZpbGVzJzogWwpAQCAtMjI3LDggKzIxMSw2IEBACiAgICAgICAgICcuLi9hdWRpby9hdWRpb19ub2RlX2NoYW5uZWxfaW50ZXJwcmV0YXRpb24uaWRsJywKICAgICAgICAgJy4uL2RvbS9ibG9iX3Byb3BlcnR5X2JhZy5pZGwnLAogICAgICAgICAnLi4vZG9tL2RvbV9wYXJzZXJfc3VwcG9ydGVkX3R5cGUuaWRsJywKLSAgICAgICAgJy4uL2RvbS9tZWRpYV9rZXlfc3RhdHVzLmlkbCcsCi0gICAgICAgICcuLi9kb20vbWVkaWFfa2V5c19yZXF1aXJlbWVudC5pZGwnLAogICAgICAgICAnLi4vZG9tL21lZGlhX3NvdXJjZV9lbmRfb2Zfc3RyZWFtX2Vycm9yLmlkbCcsCiAgICAgICAgICcuLi9kb20vbWVkaWFfc291cmNlX3JlYWR5X3N0YXRlLmlkbCcsCiAgICAgICAgICcuLi9kb20vbXV0YXRpb25fb2JzZXJ2ZXJfaW5pdC5pZGwnLApAQCAtMjM4LDExICsyMjAsMTEgQEAKICAgICAgICAgJy4uL21lZGlhX3Nlc3Npb24vbWVkaWFfbWV0YWRhdGFfaW5pdC5pZGwnLAogICAgICAgICAnLi4vbWVkaWFfc2Vzc2lvbi9tZWRpYV9zZXNzaW9uX2FjdGlvbi5pZGwnLAogICAgICAgICAnLi4vbWVkaWFfc2Vzc2lvbi9tZWRpYV9zZXNzaW9uX3BsYXliYWNrX3N0YXRlLmlkbCcsCi0gICAgICAgICcuLi9zcGVlY2gvc3BlZWNoX3N5bnRoZXNpc19lcnJvcl9jb2RlLmlkbCcsCiAgICAgICAgICcuLi9zcGVlY2gvc3BlZWNoX3JlY29nbml0aW9uX2Vycm9yX2NvZGUuaWRsJywKLSAgICAgICAgJy4uL3dlYnNvY2tldC9jbG9zZV9ldmVudF9pbml0LmlkbCcsCisgICAgICAgICcuLi9zcGVlY2gvc3BlZWNoX3N5bnRoZXNpc19lcnJvcl9jb2RlLmlkbCcsCiAgICAgICAgICcuLi93ZWJfYW5pbWF0aW9ucy9hbmltYXRpb25fZmlsbF9tb2RlLmlkbCcsCiAgICAgICAgICcuLi93ZWJfYW5pbWF0aW9ucy9hbmltYXRpb25fcGxheWJhY2tfZGlyZWN0aW9uLmlkbCcsCisgICAgICAgICcuLi93ZWJzb2NrZXQvY2xvc2VfZXZlbnRfaW5pdC5pZGwnLAogICAgIF0sCiAKICAgICAjIFBhcnRpYWwgaW50ZXJmYWNlcyBhbmQgdGhlIHJpZ2h0LXNpZGUgb2YgImltcGxlbWVudHMiLiBBbHNvIGluY2x1ZGVzCkBAIC0yNTIsMTIgKzIzNCwxMyBAQAogICAgICdkZXBlbmRlbmN5X2lkbF9maWxlcyc6IFsKICAgICAgICAgJy4uL2Nzc29tL2xpbmtfc3R5bGUuaWRsJywKIAorICAgICAgICAnLi4vZG9tL2J1ZmZlcl9zb3VyY2UuaWRsJywKKyAgICAgICAgJy4uL2RvbS9kb2N1bWVudF9fd2ViX2FuaW1hdGlvbnNfYXBpLmlkbCcsCiAgICAgICAgICcuLi9kb20vZG9jdW1lbnRfY3Nzb20uaWRsJywKICAgICAgICAgJy4uL2RvbS9kb2N1bWVudF9odG1sNS5pZGwnLAotICAgICAgICAnLi4vZG9tL2RvY3VtZW50X193ZWJfYW5pbWF0aW9uc19hcGkuaWRsJywKKyAgICAgICAgJy4uL2RvbS9lbGVtZW50X2Nzc19pbmxpbmVfc3R5bGUuaWRsJywKICAgICAgICAgJy4uL2RvbS9lbGVtZW50X2Nzc29tX3ZpZXcuaWRsJywKICAgICAgICAgJy4uL2RvbS9lbGVtZW50X2RvbV9wYXJzaW5nX2FuZF9zZXJpYWxpemF0aW9uLmlkbCcsCi0gICAgICAgICcuLi9kb20vZWxlbWVudF9jc3NfaW5saW5lX3N0eWxlLmlkbCcsCiAgICAgICAgICcuLi9kb20vZ2xvYmFsX2NyeXB0by5pZGwnLAogICAgICAgICAnLi4vZG9tL2dsb2JhbF9ldmVudF9oYW5kbGVycy5pZGwnLAogICAgICAgICAnLi4vZG9tL2h0bWxfZWxlbWVudF9jc3NvbV92aWV3LmlkbCcsCkBAIC0yNzIsMTQgKzI1NSw1MCBAQAogICAgICAgICAnLi4vZG9tL3NwZWVjaF9zeW50aGVzaXNfZ2V0dGVyLmlkbCcsCiAgICAgICAgICcuLi9kb20vdXJsX3V0aWxzLmlkbCcsCiAgICAgICAgICcuLi9kb20vd2luZG93X19hbmltYXRpb25fdGltaW5nLmlkbCcsCisgICAgICAgICcuLi9kb20vd2luZG93X19wZXJmb3JtYW5jZS5pZGwnLAogICAgICAgICAnLi4vZG9tL3dpbmRvd19jc3NvbS5pZGwnLAogICAgICAgICAnLi4vZG9tL3dpbmRvd19jc3NvbV92aWV3LmlkbCcsCi0gICAgICAgICcuLi9kb20vd2luZG93X19wZXJmb3JtYW5jZS5pZGwnLAogICAgICAgICAnLi4vZG9tL3dpbmRvd19ldmVudF9oYW5kbGVycy5pZGwnLAogICAgICAgICAnLi4vZG9tL3dpbmRvd19sb2NhbF9zdG9yYWdlLmlkbCcsCiAgICAgICAgICcuLi9kb20vd2luZG93X3Nlc3Npb25fc3RvcmFnZS5pZGwnLAogICAgICAgICAnLi4vZG9tL3dpbmRvd190aW1lcnMuaWRsJywKICAgICAgICAgJy4uL21lZGlhX3Nlc3Npb24vbmF2aWdhdG9yX21lZGlhX3Nlc3Npb24uaWRsJywKICAgICBdLAorCisgICAgJ2NvbmRpdGlvbnMnOiBbCisgICAgICBbJ2NvYmFsdF9tZWRpYV9zb3VyY2VfMjAxNj09MScsIHsKKyAgICAgICAgJ3NvdXJjZV9pZGxfZmlsZXMnOiBbCisgICAgICAgICAgICAnLi4vZG9tL2VtZS9tZWRpYV9lbmNyeXB0ZWRfZXZlbnQuaWRsJywKKyAgICAgICAgICAgICcuLi9kb20vZW1lL21lZGlhX2tleV9tZXNzYWdlX2V2ZW50LmlkbCcsCisgICAgICAgICAgICAnLi4vZG9tL2VtZS9tZWRpYV9rZXlfc2Vzc2lvbi5pZGwnLAorICAgICAgICAgICAgJy4uL2RvbS9lbWUvbWVkaWFfa2V5X3N5c3RlbV9hY2Nlc3MuaWRsJywKKyAgICAgICAgICAgICcuLi9kb20vZW1lL21lZGlhX2tleXMuaWRsJywKKyAgICAgICAgXSwKKyAgICAgICAgJ2dlbmVyYXRlZF9oZWFkZXJfaWRsX2ZpbGVzJzogWworICAgICAgICAgICAgJy4uL2RvbS9lbWUvbWVkaWFfZW5jcnlwdGVkX2V2ZW50X2luaXQuaWRsJywKKyAgICAgICAgICAgICcuLi9kb20vZW1lL21lZGlhX2tleV9tZXNzYWdlX2V2ZW50X2luaXQuaWRsJywKKyAgICAgICAgICAgICcuLi9kb20vZW1lL21lZGlhX2tleV9tZXNzYWdlX3R5cGUuaWRsJywKKyAgICAgICAgICAgICcuLi9kb20vZW1lL21lZGlhX2tleV9zZXNzaW9uX3R5cGUuaWRsJywKKyAgICAgICAgICAgICcuLi9kb20vZW1lL21lZGlhX2tleV9zeXN0ZW1fY29uZmlndXJhdGlvbi5pZGwnLAorICAgICAgICAgICAgJy4uL2RvbS9lbWUvbWVkaWFfa2V5X3N5c3RlbV9tZWRpYV9jYXBhYmlsaXR5LmlkbCcsCisgICAgICAgICAgICAnLi4vZG9tL2VtZS9tZWRpYV9rZXlzX3JlcXVpcmVtZW50LmlkbCcsCisgICAgICAgIF0sCisgICAgICAgICdkZXBlbmRlbmN5X2lkbF9maWxlcyc6IFsKKyAgICAgICAgICAgICcuLi9kb20vZW1lL2h0bWxfbWVkaWFfZWxlbWVudC5pZGwnLAorICAgICAgICAgICAgJy4uL2RvbS9lbWUvbmF2aWdhdG9yLmlkbCcsCisgICAgICAgIF0sCisgICAgICB9LCB7CisgICAgICAgICdzb3VyY2VfaWRsX2ZpbGVzJzogWworICAgICAgICAgICAgJy4uL2RvbS9tZWRpYV9rZXlfY29tcGxldGVfZXZlbnQuaWRsJywKKyAgICAgICAgICAgICcuLi9kb20vbWVkaWFfa2V5X2Vycm9yLmlkbCcsCisgICAgICAgICAgICAnLi4vZG9tL21lZGlhX2tleV9lcnJvcl9ldmVudC5pZGwnLAorICAgICAgICAgICAgJy4uL2RvbS9tZWRpYV9rZXlfbWVzc2FnZV9ldmVudC5pZGwnLAorICAgICAgICAgICAgJy4uL2RvbS9tZWRpYV9rZXlfbmVlZGVkX2V2ZW50LmlkbCcsCisgICAgICAgIF0sCisgICAgICAgICdkZXBlbmRlbmN5X2lkbF9maWxlcyc6IFsKKyAgICAgICAgICAgICcuLi9kb20vaHRtbF9tZWRpYV9lbGVtZW50X2VtZV8wMWIuaWRsJywKKyAgICAgICAgXSwKKyAgICAgIH1dLAorICAgIF0sCiAgIH0sCiB9CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jyb3dzZXIvY29iYWx0Lmd5cCBiL3NyYy9jb2JhbHQvYnJvd3Nlci9jb2JhbHQuZ3lwCmluZGV4IDY5NTBjZGQuLmQ4NThlYWMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYnJvd3Nlci9jb2JhbHQuZ3lwCisrKyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9jb2JhbHQuZ3lwCkBAIC0yMyw2ICsyMywxNSBAQAogICAgICAgJ2NvbmRpdGlvbnMnOiBbCiAgICAgICAgIFsnY29iYWx0X2VuYWJsZV9saWIgPT0gMScsIHsKICAgICAgICAgICAgICdzb3VyY2VzJzogWydsaWIvbWFpbi5jYycsXSwKKyAgICAgICAgICAgICdhbGxfZGVwZW5kZW50X3NldHRpbmdzJzogeworICAgICAgICAgICAgICAndGFyZ2V0X2NvbmRpdGlvbnMnOiBbCisgICAgICAgICAgICAgICAgWydfdHlwZT09ImV4ZWN1dGFibGUiIGFuZCBfdG9vbHNldD09InRhcmdldCInLCB7CisgICAgICAgICAgICAgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgICAgICAgICAgICAgJ2xpYi9pbXBvcnRlZC9tYWluX3N0dWIuY2MnLAorICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICB9XSwKKyAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgIH0sCiAgICAgICAgIH0sIHsKICAgICAgICAgICAgICdzb3VyY2VzJzogWydtYWluLmNjJyxdLAogICAgICAgICB9XSwKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYnJvd3Nlci9saWIvaW1wb3J0ZWQvbWFpbi5oIGIvc3JjL2NvYmFsdC9icm93c2VyL2xpYi9pbXBvcnRlZC9tYWluLmgKaW5kZXggYzNhYmNiOC4uMWNiZmQzYSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9icm93c2VyL2xpYi9pbXBvcnRlZC9tYWluLmgKKysrIGIvc3JjL2NvYmFsdC9icm93c2VyL2xpYi9pbXBvcnRlZC9tYWluLmgKQEAgLTE4LDI1ICsxOCwxOSBAQAogI2lmbmRlZiBDT0JBTFRfQlJPV1NFUl9MSUJfSU1QT1JURURfTUFJTl9IXwogI2RlZmluZSBDT0JBTFRfQlJPV1NFUl9MSUJfSU1QT1JURURfTUFJTl9IXwogCisjaW5jbHVkZSAic3RhcmJvYXJkL2V2ZW50LmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2V4cG9ydC5oIgorCiAjaWZkZWYgX19jcGx1c3BsdXMKIGV4dGVybiAiQyIgewogI2VuZGlmCiAKLS8vIFN0cnVjdHVyZSByZXByZXNlbnRpbmcgYW4gaW5wdXQgZXZlbnQgYW5kIGl0cyBkYXRhLiBUaGlzIHByb3ZpZGVzIGEgc3Vic2V0Ci0vLyBvZiBTYkV2ZW50IHNvIHRoYXQgY2xpZW50cyBkb24ndCBoYXZlIHRvIGNvcHkgdGhlIFN0YXJib2FyZCBoZWFkZXJzIGludG8KLS8vIHRoZWlyIGNvZGViYXNlLgotdHlwZWRlZiBzdHJ1Y3QgQ2JMaWJLZXlJbnB1dEV2ZW50IHsKLSAgdW5zaWduZWQgY2hhciBrZXljb2RlOwotICBib29sIHByZXNzZWQ7Ci19IENiTGliS2V5SW5wdXRFdmVudDsKLQogLy8gSW52b2tlZCBhZnRlciBDb2JhbHQgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuCi12b2lkIENiTGliT25Db2JhbHRJbml0aWFsaXplZCgpOworU0JfSU1QT1JUX1BMQVRGT1JNIHZvaWQgQ2JMaWJPbkNvYmFsdEluaXRpYWxpemVkKCk7CiAKIC8vIEludm9rZWQgd2hlbiBDb2JhbHQgaXMgcmVjZWl2aW5nIGFuIGV2ZW50IGZyb20gU3RhcmJvYXJkLgotLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBldmVudCBzaG91bGQgcGFzcyB0aHJvdWdoIHRvIENvYmFsdDsgcmV0dXJucyBmYWxzZSBpZgotLy8gdGhlIGV2ZW50IHdhcyBjb25zdW1lZC4KLWJvb2wgQ2JMaWJIYW5kbGVFdmVudChjb25zdCBDYkxpYktleUlucHV0RXZlbnQmIGV2ZW50KTsKKy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgY2xpZW50IGNvbnN1bWVkIHxldmVudHw7IGZhbHNlIG90aGVyd2lzZS4KK1NCX0lNUE9SVF9QTEFURk9STSBib29sIENiTGliSGFuZGxlRXZlbnQoY29uc3QgU2JFdmVudCogZXZlbnQpOwogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0gIC8vIGV4dGVybiAiQyIKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYnJvd3Nlci9saWIvaW1wb3J0ZWQvbWFpbl9zdHViLmNjIGIvc3JjL2NvYmFsdC9icm93c2VyL2xpYi9pbXBvcnRlZC9tYWluX3N0dWIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ1YzY0MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9saWIvaW1wb3J0ZWQvbWFpbl9zdHViLmNjCkBAIC0wLDAgKzEsOSBAQAorI2luY2x1ZGUgImNvYmFsdC9icm93c2VyL2xpYi9pbXBvcnRlZC9tYWluLmgiCisKKy8vIEVtcHR5IGltcGxlbWVudGF0aW9ucyBzbyB0aGF0ICdsaWInIHRhcmdldHMgY2FuIGJlIGNvbXBpbGVkIGludG8gZXhlY3V0YWJsZXMKKy8vIGJ5IHRoZSBidWlsZGVyIHdpdGhvdXQgbWlzc2luZyBzeW1ib2wgZGVmaW5pdGlvbnMuCit2b2lkIENiTGliT25Db2JhbHRJbml0aWFsaXplZCgpIHt9Citib29sIENiTGliSGFuZGxlRXZlbnQoY29uc3QgU2JFdmVudCogZXZlbnQpIHsKKyAgKHZvaWQpIGV2ZW50OworICByZXR1cm4gZmFsc2U7Cit9CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jyb3dzZXIvbGliL21haW4uY2MgYi9zcmMvY29iYWx0L2Jyb3dzZXIvbGliL21haW4uY2MKaW5kZXggNTFjZDFlNC4uNWQwZmI0NCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9icm93c2VyL2xpYi9tYWluLmNjCisrKyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9saWIvbWFpbi5jYwpAQCAtMjMsMjYgKzIzLDYgQEAKIAogbmFtZXNwYWNlIHsKIAotYm9vbCBTYkV2ZW50VG9DYkxpYktleUlucHV0RXZlbnQoCi0gICAgY29uc3QgU2JFdmVudCogc3RhcmJvYXJkX2V2ZW50LAotICAgIENiTGliS2V5SW5wdXRFdmVudCogb3V0X2tleV9pbnB1dF9ldmVudCkgewotICBpZiAoc3RhcmJvYXJkX2V2ZW50ID09IE5VTEwgfHwKLSAgICAgIHN0YXJib2FyZF9ldmVudC0+dHlwZSAhPSBTYkV2ZW50VHlwZTo6a1NiRXZlbnRUeXBlSW5wdXQpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgY29uc3QgU2JJbnB1dERhdGEqIGlucHV0X2RhdGEgPQotICAgICAgc3RhdGljX2Nhc3Q8U2JJbnB1dERhdGEqPihzdGFyYm9hcmRfZXZlbnQtPmRhdGEpOwotICBpZiAoaW5wdXRfZGF0YS0+ZGV2aWNlX3R5cGUgIT0KLSAgICAgIFNiSW5wdXREZXZpY2VUeXBlOjprU2JJbnB1dERldmljZVR5cGVLZXlib2FyZCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBvdXRfa2V5X2lucHV0X2V2ZW50LT5wcmVzc2VkID0KLSAgICAgIGlucHV0X2RhdGEtPnR5cGUgPT0gU2JJbnB1dEV2ZW50VHlwZTo6a1NiSW5wdXRFdmVudFR5cGVQcmVzczsKLSAgb3V0X2tleV9pbnB1dF9ldmVudC0+a2V5Y29kZSA9Ci0gICAgICBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihpbnB1dF9kYXRhLT5jaGFyYWN0ZXIpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQogY29iYWx0Ojpicm93c2VyOjpBcHBsaWNhdGlvbiogZ19hcHBsaWNhdGlvbiA9IE5VTEw7CiAKIHZvaWQgU3RhcnRBcHBsaWNhdGlvbihpbnQgLyphcmdjKi8sIGNoYXIqKiAvKmFyZ3YqLywgY29uc3QgY2hhciogLypsaW5rKi8sCkBAIC02Miw5ICs0Miw3IEBACiB9CiAKIHZvaWQgSGFuZGxlRXZlbnQoY29uc3QgU2JFdmVudCogc3RhcmJvYXJkX2V2ZW50KSB7Ci0gIENiTGliS2V5SW5wdXRFdmVudCBrZXk7Ci0gIGlmICghU2JFdmVudFRvQ2JMaWJLZXlJbnB1dEV2ZW50KHN0YXJib2FyZF9ldmVudCwgJmtleSkgfHwKLSAgICAgIENiTGliSGFuZGxlRXZlbnQoa2V5KSkgeworICBpZiAoIUNiTGliSGFuZGxlRXZlbnQoc3RhcmJvYXJkX2V2ZW50KSkgewogICAgIGNvYmFsdDo6YnJvd3Nlcjo6RXZlbnRIYW5kbGVyOjpIYW5kbGVFdmVudChzdGFyYm9hcmRfZXZlbnQpOwogICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jyb3dzZXIvc3dpdGNoZXMuY2MgYi9zcmMvY29iYWx0L2Jyb3dzZXIvc3dpdGNoZXMuY2MKaW5kZXggNWUyZmZkMC4uM2I0M2IzZCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9icm93c2VyL3N3aXRjaGVzLmNjCisrKyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9zd2l0Y2hlcy5jYwpAQCAtMTEyLDYgKzExMiwxMCBAQAogCiAjZW5kaWYgIC8vIEVOQUJMRV9ERUJVR19DT01NQU5EX0xJTkVfU1dJVENIRVMKIAorLy8gRGlzYWJsZXMgdGhlIGhhcmQtY29kZWQgbmF2aWdhdGlvbiB3aGl0ZWxpc3Qgd2l0aG91dCBkaXNhYmxpbmcgYW55IG90aGVyCisvLyBzZWN1cml0eSBjaGVja3MuIFRoaXMgaXMgZW5hYmxlZCBpbiBHb2xkIGJ1aWxkcy4KK2NvbnN0IGNoYXIga0Rpc2FibGVOYXZpZ2F0aW9uV2hpdGVsaXN0W10gPSAiZGlzYWJsZV9uYXZpZ2F0aW9uX3doaXRlbGlzdCI7CisKIC8vIERldGVybWluZXMgdGhlIGNhcGFjaXR5IG9mIHRoZSBpbWFnZSBjYWNoZSB3aGljaCBtYW5hZ2VzIGltYWdlIHN1cmZhY2VzCiAvLyBkb3dubG9hZGVkIGZyb20gYSB3ZWIgcGFnZS4gIFdoaWxlIGl0IGRlcGVuZHMgb24gdGhlIHBsYXRmb3JtLCBvZnRlbiAoYW5kCiAvLyBpZGVhbGx5KSB0aGVzZSBpbWFnZXMgYXJlIGNhY2hlZCB3aXRoaW4gR1BVIG1lbW9yeS4KQEAgLTE3Myw2ICsxNzcsMTAgQEAKIC8vIFNwZWNpZmllcyB0aGUgbWF4aW11bSBHUFUgdXNhZ2Ugb2YgdGhlIGNvYmFsdC4KIGNvbnN0IGNoYXIga01heENvYmFsdEdwdVVzYWdlW10gPSAibWF4X2NvYmFsdF9ncHVfdXNhZ2UiOwogCisvLyBTcGVjaWZpZXMgdGhlIG11bHRpcGxpZXIgb2YgdmlkZW8gcGxheWJhY2sgcmF0ZS4gIFNldCB0byBhIHZhbHVlIGdyZWF0ZXIgdGhhbgorLy8gMS4wIHRvIHBsYXkgdmlkZW8gZmFzdGVyLiAgU2V0IHRvIGEgdmFsdWUgbGVzcyB0aGFuIDEuMCB0byBwbGF5IHZpZGVvIHNsb3dlci4KK2NvbnN0IGNoYXIga1ZpZGVvUGxheWJhY2tSYXRlTXVsdGlwbGllcltdID0gInZpZGVvX3BsYXliYWNrX3JhdGVfbXVsdGlwbGllciI7CisKIH0gIC8vIG5hbWVzcGFjZSBzd2l0Y2hlcwogfSAgLy8gbmFtZXNwYWNlIGJyb3dzZXIKIH0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYnJvd3Nlci9zd2l0Y2hlcy5oIGIvc3JjL2NvYmFsdC9icm93c2VyL3N3aXRjaGVzLmgKaW5kZXggOTIxNDc4NC4uNDlhNWZjNyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9icm93c2VyL3N3aXRjaGVzLmgKKysrIGIvc3JjL2NvYmFsdC9icm93c2VyL3N3aXRjaGVzLmgKQEAgLTQ3LDYgKzQ3LDcgQEAKIGV4dGVybiBjb25zdCBjaGFyIGtXZWJEcml2ZXJMaXN0ZW5JcFtdOwogI2VuZGlmICAvLyBFTkFCTEVfREVCVUdfQ09NTUFORF9MSU5FX1NXSVRDSEVTCiAKK2V4dGVybiBjb25zdCBjaGFyIGtEaXNhYmxlTmF2aWdhdGlvbldoaXRlbGlzdFtdOwogZXh0ZXJuIGNvbnN0IGNoYXIga0ltYWdlQ2FjaGVTaXplSW5CeXRlc1tdOwogZXh0ZXJuIGNvbnN0IGNoYXIga0luaXRpYWxVUkxbXTsKIGV4dGVybiBjb25zdCBjaGFyIGtSZW1vdGVUeXBlZmFjZUNhY2hlU2l6ZUluQnl0ZXNbXTsKQEAgLTYyLDYgKzYzLDggQEAKIGV4dGVybiBjb25zdCBjaGFyIGtNYXhDb2JhbHRDcHVVc2FnZVtdOwogZXh0ZXJuIGNvbnN0IGNoYXIga01heENvYmFsdEdwdVVzYWdlW107CiAKK2V4dGVybiBjb25zdCBjaGFyIGtWaWRlb1BsYXliYWNrUmF0ZU11bHRpcGxpZXJbXTsKKwogfSAgLy8gbmFtZXNwYWNlIHN3aXRjaGVzCiB9ICAvLyBuYW1lc3BhY2UgYnJvd3NlcgogfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9icm93c2VyL3Rlc3RkYXRhL2VtZS1kZW1vL2VtZS1kZW1vLmh0bWwgYi9zcmMvY29iYWx0L2Jyb3dzZXIvdGVzdGRhdGEvZW1lLWRlbW8vZW1lLWRlbW8uaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWJmNjQwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9icm93c2VyL3Rlc3RkYXRhL2VtZS1kZW1vL2VtZS1kZW1vLmh0bWwKQEAgLTAsMCArMSwzNSBAQAorPCFET0NUWVBFIGh0bWw+Cis8IS0tCisgfCBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIHwKKyB8IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIHwgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIHwgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgfAorIHwgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIHwKKyB8IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyB8IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgfCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyB8IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyB8IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorPGh0bWw+Cis8aGVhZD4KKyAgPHRpdGxlPkVuY3J5cHRlZCBNZWRpYSBFeHRlbnNpb25zICgxNiBNYXJjaCAyMDE3KSBEZW1vPC90aXRsZT4KKyAgPHN0eWxlPgorICAgIGJvZHkgeworICAgICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7CisgICAgfQorICAgIHZpZGVvIHsKKyAgICAgIGhlaWdodDogMjQwcHg7CisgICAgICB3aWR0aDogNDI2cHg7CisgICAgfQorICA8L3N0eWxlPgorPC9oZWFkPgorCis8Ym9keT4KKyAgPHZpZGVvPjwvdmlkZW8+CisgIDxzY3JpcHQgc3JjPSJlbWUtZGVtby5qcyI+PC9zY3JpcHQ+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jyb3dzZXIvdGVzdGRhdGEvZW1lLWRlbW8vZW1lLWRlbW8uanMgYi9zcmMvY29iYWx0L2Jyb3dzZXIvdGVzdGRhdGEvZW1lLWRlbW8vZW1lLWRlbW8uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWExMTFkYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYnJvd3Nlci90ZXN0ZGF0YS9lbWUtZGVtby9lbWUtZGVtby5qcwpAQCAtMCwwICsxLDg5IEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitmdW5jdGlvbiBmZXRjaEFycmF5QnVmZmVyKG1ldGhvZCwgdXJsLCBib2R5LCBjYWxsYmFjaykgeworICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CisgIHhoci5yZXNwb25zZVR5cGUgPSAnYXJyYXlidWZmZXInOworICB4aHIuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIGZ1bmN0aW9uKCkgeworICAgIGNhbGxiYWNrKHhoci5yZXNwb25zZSk7CisgIH0pOworICB4aHIub3BlbihtZXRob2QsIHVybCk7CisgIHhoci5zZW5kKGJvZHkpOworfQorCitmdW5jdGlvbiBleHRyYWN0TGljZW5zZShsaWNlbnNlQXJyYXlCdWZmZXIpIHsKKyAgdmFyIGxpY2Vuc2VBcnJheSA9IG5ldyBVaW50OEFycmF5KGxpY2Vuc2VBcnJheUJ1ZmZlcik7CisgIHZhciBsaWNlbnNlU3RhcnRJbmRleCA9IGxpY2Vuc2VBcnJheS5sZW5ndGggLSAyOworICB3aGlsZSAobGljZW5zZVN0YXJ0SW5kZXggPj0gMCkgeworICAgIGlmIChsaWNlbnNlQXJyYXlbbGljZW5zZVN0YXJ0SW5kZXhdID09IDEzICYmCisgICAgICAgIGxpY2Vuc2VBcnJheVtsaWNlbnNlU3RhcnRJbmRleCArIDFdID09IDEwKSB7CisgICAgICBsaWNlbnNlU3RhcnRJbmRleCArPSAyOworICAgICAgYnJlYWs7CisgICAgfQorICAgIC0tbGljZW5zZVN0YXJ0SW5kZXg7CisgIH0KKworICByZXR1cm4gbGljZW5zZUFycmF5LnN1YmFycmF5KGxpY2Vuc2VTdGFydEluZGV4KTsKK30KKwordmFyIHZpZGVvQ29udGVudFR5cGUgPSAndmlkZW8vbXA0OyBjb2RlY3M9ImF2YzEuNjQwMDI4Iic7Cit2YXIgYXVkaW9Db250ZW50VHlwZSA9ICdhdWRpby9tcDQ7IGNvZGVjcz0ibXA0YS40MC4yIic7CisKK25hdmlnYXRvci5yZXF1ZXN0TWVkaWFLZXlTeXN0ZW1BY2Nlc3MoJ2NvbS53aWRldmluZS5hbHBoYScsIFt7CisgICdpbml0RGF0YVR5cGVzJzogWydjZW5jJ10sCisgICd2aWRlb0NhcGFiaWxpdGllcyc6IFt7J2NvbnRlbnRUeXBlJzogdmlkZW9Db250ZW50VHlwZX1dLAorICAnYXVkaW9DYXBhYmlsaXRpZXMnOiBbeydjb250ZW50VHlwZSc6IGF1ZGlvQ29udGVudFR5cGV9XQorfV0pLnRoZW4oZnVuY3Rpb24obWVkaWFLZXlTeXN0ZW1BY2Nlc3MpIHsKKyAgcmV0dXJuIG1lZGlhS2V5U3lzdGVtQWNjZXNzLmNyZWF0ZU1lZGlhS2V5cygpOworfSkudGhlbihmdW5jdGlvbihtZWRpYUtleXMpIHsKKyAgdmFyIHZpZGVvRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3ZpZGVvJyk7CisKKyAgdmlkZW9FbGVtZW50LnNldE1lZGlhS2V5cyhtZWRpYUtleXMpOworCisgIG1lZGlhS2V5U2Vzc2lvbiA9IG1lZGlhS2V5cy5jcmVhdGVTZXNzaW9uKCk7CisgIG1lZGlhS2V5U2Vzc2lvbi5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgZnVuY3Rpb24obWVzc2FnZUV2ZW50KSB7CisgICAgdmFyIGxpY2Vuc2VTZXJ2ZXJVcmwgPSAnaHR0cHM6Ly9kYXNoLW1zZS10ZXN0LmFwcHNwb3QuY29tL2FwaS9kcm0vd2lkZXZpbmU/ZHJtX3N5c3RlbT13aWRldmluZSZzb3VyY2U9WU9VVFVCRSZpcD0wLjAuMC4wJmlwYml0cz0wJmV4cGlyZT0xOTAwMDAwMDAwMCZrZXk9dGVzdF9rZXkxJnNwYXJhbXM9aXAsaXBiaXRzLGV4cGlyZSxkcm1fc3lzdGVtLHNvdXJjZSx2aWRlb19pZCZ2aWRlb19pZD0wMzY4MTI2MmRjNDEyYzA2JnNpZ25hdHVyZT05QzRCRTk5RTZGNTE3QjUxRkVEMUYwQjNCMzE5NjZEM0M1REFCOUQ2LjZBMUYzMEJCMzVGM0EzOUE0Q0E4MTRCNzMxNDUwRDRDQkQxOThGRkQnOworICAgIGZldGNoQXJyYXlCdWZmZXIoJ1BPU1QnLCBsaWNlbnNlU2VydmVyVXJsLCBtZXNzYWdlRXZlbnQubWVzc2FnZSwKKyAgICAgICAgZnVuY3Rpb24obGljZW5zZUFycmF5QnVmZmVyKSB7CisgICAgICAgICAgbWVkaWFLZXlTZXNzaW9uLnVwZGF0ZShleHRyYWN0TGljZW5zZShsaWNlbnNlQXJyYXlCdWZmZXIpKTsKKyAgICAgICAgfSk7CisgIH0pOworCisgIHZpZGVvRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdlbmNyeXB0ZWQnLCBmdW5jdGlvbihlbmNyeXB0ZWRFdmVudCkgeworICAgIG1lZGlhS2V5U2Vzc2lvbi5nZW5lcmF0ZVJlcXVlc3QoCisgICAgICAgIGVuY3J5cHRlZEV2ZW50LmluaXREYXRhVHlwZSwgZW5jcnlwdGVkRXZlbnQuaW5pdERhdGEpOworICB9KTsKKworICB2YXIgbWVkaWFTb3VyY2UgPSBuZXcgTWVkaWFTb3VyY2UoKTsKKyAgbWVkaWFTb3VyY2UuYWRkRXZlbnRMaXN0ZW5lcignc291cmNlb3BlbicsIGZ1bmN0aW9uKCkgeworICAgIHZhciB2aWRlb1NvdXJjZUJ1ZmZlciA9IG1lZGlhU291cmNlLmFkZFNvdXJjZUJ1ZmZlcih2aWRlb0NvbnRlbnRUeXBlKTsKKyAgICBmZXRjaEFycmF5QnVmZmVyKCdHRVQnLAorICAgICAgICAgICAgICAgICAgICAgJ2h0dHA6Ly95dC1kYXNoLW1zZS10ZXN0LmNvbW1vbmRhdGFzdG9yYWdlLmdvb2dsZWFwaXMuY29tL21lZGlhL29vcHNfY2VuYy0yMDEyMTExNC0xNDIubXA0JywKKyAgICAgICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbih2aWRlb0FycmF5QnVmZmVyKSB7CisgICAgICB2aWRlb1NvdXJjZUJ1ZmZlci5hcHBlbmRCdWZmZXIodmlkZW9BcnJheUJ1ZmZlcik7CisgICAgfSk7CisKKyAgICB2YXIgYXVkaW9Tb3VyY2VCdWZmZXIgPSBtZWRpYVNvdXJjZS5hZGRTb3VyY2VCdWZmZXIoYXVkaW9Db250ZW50VHlwZSk7CisgICAgZmV0Y2hBcnJheUJ1ZmZlcignR0VUJywKKyAgICAgICAgICAgICAgICAgICAgICdodHRwOi8veXQtZGFzaC1tc2UtdGVzdC5jb21tb25kYXRhc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9tZWRpYS9vb3BzX2NlbmMtMjAxMjExMTQtMTQ4Lm1wNCcsCisgICAgICAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oYXVkaW9BcnJheUJ1ZmZlcikgeworICAgICAgYXVkaW9Tb3VyY2VCdWZmZXIuYXBwZW5kQnVmZmVyKGF1ZGlvQXJyYXlCdWZmZXIpOworICAgIH0pOworICB9KTsKKworICB2aWRlb0VsZW1lbnQuc3JjID0gVVJMLmNyZWF0ZU9iamVjdFVSTChtZWRpYVNvdXJjZSk7CisgIHZpZGVvRWxlbWVudC5wbGF5KCk7Cit9KTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYnJvd3Nlci93ZWJfbW9kdWxlLmNjIGIvc3JjL2NvYmFsdC9icm93c2VyL3dlYl9tb2R1bGUuY2MKaW5kZXggMmI2YWFkNi4uMzgwYjA5MSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9icm93c2VyL3dlYl9tb2R1bGUuY2MKKysrIGIvc3JjL2NvYmFsdC9icm93c2VyL3dlYl9tb2R1bGUuY2MKQEAgLTQ5NSw3ICs0OTUsOCBAQAogICAgICAgZGF0YS53aW5kb3dfY2xvc2VfY2FsbGJhY2ssIGRhdGEud2luZG93X21pbmltaXplX2NhbGxiYWNrLAogICAgICAgZGF0YS5zeXN0ZW1fd2luZG93XywgZGF0YS5vcHRpb25zLmNhbWVyYV8zZCwKICAgICAgIG1lZGlhX3Nlc3Npb25fY2xpZW50Xy0+R2V0TWVkaWFTZXNzaW9uKCksCi0gICAgICBkYXRhLm9wdGlvbnMuY3NwX2luc2VjdXJlX2FsbG93ZWRfdG9rZW4sIGRhdGEuZG9tX21heF9lbGVtZW50X2RlcHRoKTsKKyAgICAgIGRhdGEub3B0aW9ucy5jc3BfaW5zZWN1cmVfYWxsb3dlZF90b2tlbiwgZGF0YS5kb21fbWF4X2VsZW1lbnRfZGVwdGgsCisgICAgICBkYXRhLm9wdGlvbnMudmlkZW9fcGxheWJhY2tfcmF0ZV9tdWx0aXBsaWVyKTsKICAgRENIRUNLKHdpbmRvd18pOwogCiAgIHdpbmRvd193ZWFrXyA9IGJhc2U6OkFzV2Vha1B0cih3aW5kb3dfLmdldCgpKTsKQEAgLTc3OSwxMCArNzgwLDEyIEBACiAgIGRlYnVnX292ZXJsYXlfLT5DbGVhcklucHV0KCk7CiAjZW5kaWYKIAotICAvLyBGaW5hbGx5IHB1cmdlIHRoZSByZXNvdXJjZSBwcm92aWRlcidzIGNhY2hlcyBhbmQgbWFyayB0aGF0IHdlIGhhdmUgbm8KLSAgLy8gcmVzb3VyY2UgcHJvdmlkZXIuCi0gIHJlc291cmNlX3Byb3ZpZGVyXy0+UHVyZ2VDYWNoZXMoKTsKICAgcmVzb3VyY2VfcHJvdmlkZXJfID0gTlVMTDsKKworICAvLyBGb3JjZSBnYXJiYWdlIGNvbGxlY3Rpb24gaW4gfGphdmFzY3JpcHRfZW5naW5lX3wuCisgIGlmIChqYXZhc2NyaXB0X2VuZ2luZV8pIHsKKyAgICBqYXZhc2NyaXB0X2VuZ2luZV8tPkNvbGxlY3RHYXJiYWdlKCk7CisgIH0KIH0KIAogdm9pZCBXZWJNb2R1bGU6OkltcGw6OlJlc3VtZShyZW5kZXJfdHJlZTo6UmVzb3VyY2VQcm92aWRlciogcmVzb3VyY2VfcHJvdmlkZXIpIHsKQEAgLTg1MCw3ICs4NTMsOCBAQAogICAgICAgaW1hZ2VfY2FjaGVfY2FwYWNpdHlfbXVsdGlwbGllcl93aGVuX3BsYXlpbmdfdmlkZW8oMS4wZiksCiAgICAgICB0aHJlYWRfcHJpb3JpdHkoYmFzZTo6a1RocmVhZFByaW9yaXR5X05vcm1hbCksCiAgICAgICBsb2FkZXJfdGhyZWFkX3ByaW9yaXR5KGJhc2U6OmtUaHJlYWRQcmlvcml0eV9Mb3cpLAotICAgICAgYW5pbWF0ZWRfaW1hZ2VfZGVjb2RlX3RocmVhZF9wcmlvcml0eShiYXNlOjprVGhyZWFkUHJpb3JpdHlfTG93KSB7fQorICAgICAgYW5pbWF0ZWRfaW1hZ2VfZGVjb2RlX3RocmVhZF9wcmlvcml0eShiYXNlOjprVGhyZWFkUHJpb3JpdHlfTG93KSwKKyAgICAgIHZpZGVvX3BsYXliYWNrX3JhdGVfbXVsdGlwbGllcigxLmYpIHt9CiAKIFdlYk1vZHVsZTo6V2ViTW9kdWxlKAogICAgIGNvbnN0IEdVUkwmIGluaXRpYWxfdXJsLApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9icm93c2VyL3dlYl9tb2R1bGUuaCBiL3NyYy9jb2JhbHQvYnJvd3Nlci93ZWJfbW9kdWxlLmgKaW5kZXggM2UyOWY3Mi4uZDU5MGUzZSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9icm93c2VyL3dlYl9tb2R1bGUuaAorKysgYi9zcmMvY29iYWx0L2Jyb3dzZXIvd2ViX21vZHVsZS5oCkBAIC0xNjksNiArMTY5LDEwIEBACiAgICAgc2NvcGVkX3JlZnB0cjxpbnB1dDo6Q2FtZXJhM0Q+IGNhbWVyYV8zZDsKIAogICAgIHNjcmlwdDo6SmF2YVNjcmlwdEVuZ2luZTo6T3B0aW9ucyBqYXZhc2NyaXB0X29wdGlvbnM7CisKKyAgICAvLyBUaGUgdmlkZW8gcGxheWJhY2sgcmF0ZSB3aWxsIGJlIG11bHRpcGxpZWQgd2l0aCB0aGUgZm9sbG93aW5nIHZhbHVlLiAgSXRzCisgICAgLy8gZGVmYXVsdCB2YWx1ZSBpcyAxLjAuCisgICAgZmxvYXQgdmlkZW9fcGxheWJhY2tfcmF0ZV9tdWx0aXBsaWVyOwogICB9OwogCiAgIHR5cGVkZWYgbGF5b3V0OjpMYXlvdXRNYW5hZ2VyOjpMYXlvdXRSZXN1bHRzIExheW91dFJlc3VsdHM7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2J1aWxkL2J1aWxkLmlkIGIvc3JjL2NvYmFsdC9idWlsZC9idWlsZC5pZAppbmRleCA5ZjYyNjk1Li5jMmViNTJlIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2J1aWxkL2J1aWxkLmlkCisrKyBiL3NyYy9jb2JhbHQvYnVpbGQvYnVpbGQuaWQKQEAgLTEgKzEgQEAKLTUyNzA4ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorNTUzNDEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2J1aWxkL2NvbmZpZy9iYXNlLmd5cGkgYi9zcmMvY29iYWx0L2J1aWxkL2NvbmZpZy9iYXNlLmd5cGkKaW5kZXggZGRmZDI2OS4uMGM5M2VhMiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9idWlsZC9jb25maWcvYmFzZS5neXBpCisrKyBiL3NyYy9jb2JhbHQvYnVpbGQvY29uZmlnL2Jhc2UuZ3lwaQpAQCAtNDMsNiArNDMsMTcgQEAKICAgICAnc2JfZW5hYmxlX2xpYiUnOiAnPChzYl9lbmFibGVfbGliKScsCiAgICAgJ2NvYmFsdF9lbmFibGVfbGliJzogJzwoc2JfZW5hYmxlX2xpYiknLAogCisgICAgIyBUaGlzIHZhcmlhYmxlIGRlZmluZXMgd2hhdCBDb2JhbHQncyBwcmVmZXJyZWQgc3RyYXRlZ3kgc2hvdWxkIGJlIGZvcgorICAgICMgaGFuZGxpbmcgaW50ZXJuYWxseSB0cmlnZ2VyZWQgYXBwbGljYXRpb24gZXhpdCByZXF1ZXN0cyAoZS5nLiB0aGUgdXNlcgorICAgICMgY2hvb3NlcyB0byBiYWNrIG91dCBvZiB0aGUgYXBwbGljYXRpb24pLgorICAgICMgICAnc3RvcCcgICAgLS0gVGhlIGFwcGxpY2F0aW9uIHNob3VsZCBjYWxsIFNiU3lzdGVtUmVxdWVzdFN0b3AoKSBvbiBleGl0LAorICAgICMgICAgICAgICAgICAgICAgcmVzdWx0aW5nIGluIGEgY29tcGxldGUgc2h1dGRvd24gb2YgdGhlIGFwcGxpY2F0aW9uLgorICAgICMgICAnc3VzcGVuZCcgLS0gVGhlIGFwcGxpY2F0aW9uIHNob3VsZCBjYWxsIFNiU3lzdGVtUmVxdWVzdFN1c3BlbmQoKSBvbgorICAgICMgICAgICAgICAgICAgICAgZXhpdCwgcmVzdWx0aW5nIGluIHRoZSBhcHBsaWNhdGlvbiBiZWluZyAibWluaW1pemVkIi4KKyAgICAjICAgJ25vZXhpdCcgIC0tIFRoZSBhcHBsaWNhdGlvbiBzaG91bGQgbmV2ZXIgYWxsb3cgdGhlIHVzZXIgdG8gdHJpZ2dlciBhbgorICAgICMgICAgICAgICAgICAgICAgZXhpdCwgdGhpcyB3aWxsIGJlIG1hbmFnZWQgYnkgdGhlIHN5c3RlbS4KKyAgICAnY29iYWx0X3VzZXJfb25fZXhpdF9zdHJhdGVneSc6ICdzdG9wJywKKwogICAgICMgQ29udGFpbnMgdGhlIGN1cnJlbnQgZm9udCBwYWNrYWdlIHNlbGVjdGlvbi4gIFRoaXMgY2FuIGJlIHVzZWQgdG8gdHJhZGUKICAgICAjIGZvbnQgcXVhbGl0eSwgY292ZXJhZ2UsIGFuZCBsYXRlbmN5IGZvciBkaWZmZXJlbnQgZm9udCBwYWNrYWdlIHNpemVzLgogICAgICMgVGhlIGZvbnQgcGFja2FnZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgb3B0aW9uczoKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9zeXN0ZW1fbWVkaWFfY2FwYWJpbGl0eS5pZGwgYi9zcmMvY29iYWx0L2RvbS9idWZmZXJfc291cmNlLmgKc2ltaWxhcml0eSBpbmRleCA2MCUKY29weSBmcm9tIHNyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9zeXN0ZW1fbWVkaWFfY2FwYWJpbGl0eS5pZGwKY29weSB0byBzcmMvY29iYWx0L2RvbS9idWZmZXJfc291cmNlLmgKaW5kZXggNTFlMWYyZS4uYTc5NjY3NSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vbWVkaWFfa2V5X3N5c3RlbV9tZWRpYV9jYXBhYmlsaXR5LmlkbAorKysgYi9zcmMvY29iYWx0L2RvbS9idWZmZXJfc291cmNlLmgKQEAgLTEyLDkgKzEyLDIxIEBACiAvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTYvQ1ItZW5jcnlwdGVkLW1lZGlhLTIwMTYwNzA1LyNtZWRpYWtleXN5c3RlbW1lZGlhY2FwYWJpbGl0eS1kaWN0aW9uYXJ5CisjaWZuZGVmIENPQkFMVF9ET01fQlVGRkVSX1NPVVJDRV9IXworI2RlZmluZSBDT0JBTFRfRE9NX0JVRkZFUl9TT1VSQ0VfSF8KIAotZGljdGlvbmFyeSBNZWRpYUtleVN5c3RlbU1lZGlhQ2FwYWJpbGl0eSB7Ci0gIERPTVN0cmluZyBjb250ZW50VHlwZSA9ICIiOwotICBET01TdHJpbmcgcm9idXN0bmVzcyA9ICIiOwotfTsKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3VuaW9uX3R5cGUuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgZG9tIHsKKworY2xhc3MgQXJyYXlCdWZmZXI7CitjbGFzcyBBcnJheUJ1ZmZlclZpZXc7CisKK3R5cGVkZWYgc2NyaXB0OjpVbmlvblR5cGUyPHNjb3BlZF9yZWZwdHI8QXJyYXlCdWZmZXJWaWV3PiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlZF9yZWZwdHI8QXJyYXlCdWZmZXI+ID4gQnVmZmVyU291cmNlOworCit9ICAvLyBuYW1lc3BhY2UgZG9tCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKyNlbmRpZiAgLy8gQ09CQUxUX0RPTV9CVUZGRVJfU09VUkNFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jhc2UvbWF0aC5oIGIvc3JjL2NvYmFsdC9kb20vYnVmZmVyX3NvdXJjZS5pZGwKc2ltaWxhcml0eSBpbmRleCA3NyUKcmVuYW1lIGZyb20gc3JjL2NvYmFsdC9iYXNlL21hdGguaApyZW5hbWUgdG8gc3JjL2NvYmFsdC9kb20vYnVmZmVyX3NvdXJjZS5pZGwKaW5kZXggNDcyM2JmYi4uOTFjYjA0YSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iYXNlL21hdGguaAorKysgYi9zcmMvY29iYWx0L2RvbS9idWZmZXJfc291cmNlLmlkbApAQCAtMSw0ICsxLDQgQEAKLS8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogLy8KIC8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTIsOSArMTIsNiBAQAogLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKLSNpZm5kZWYgQ09CQUxUX0JBU0VfTUFUSF9IXwotI2RlZmluZSBDT0JBTFRfQkFTRV9NQVRIX0hfCisvLyBodHRwczovL3d3dy53My5vcmcvVFIvV2ViSURMLTEvI2NvbW1vbi1CdWZmZXJTb3VyY2UKIAotI2luY2x1ZGUgPGNtYXRoPgotCi0jZW5kaWYgIC8vIENPQkFMVF9CQVNFX01BVEhfSF8KK3R5cGVkZWYgKEFycmF5QnVmZmVyVmlldyBvciBBcnJheUJ1ZmZlcikgQnVmZmVyU291cmNlOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vZG9jdW1lbnQuY2MgYi9zcmMvY29iYWx0L2RvbS9kb2N1bWVudC5jYwppbmRleCA3NTRlZTliLi4wOWE2NzFjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9kb2N1bWVudC5jYworKysgYi9zcmMvY29iYWx0L2RvbS9kb2N1bWVudC5jYwpAQCAtNjc2LDggKzY3NiwxMyBAQAogfQogCiB2b2lkIERvY3VtZW50OjpQdXJnZUNhY2hlZFJlc291cmNlcygpIHsKKyAgLy8gU2V0IHRoZSBmb250IGZhY2VzIHRvIGRpcnR5IHByaW9yIHRvIHB1cmdpbmcgdGhlIGZvbnQgY2FjaGUgc28gdGhhdCB0aGV5J2xsCisgIC8vIGJlIHJlc3RvcmVkIHdoZW4gcHJvY2Vzc2luZyByZXN1bWVzLgorICBhcmVfZm9udF9mYWNlc19kaXJ0eV8gPSB0cnVlOworICBmb250X2NhY2hlXy0+UHVyZ2VDYWNoZWRSZXNvdXJjZXMoKTsKKwogICAvLyBTZXQgdGhlIGNvbXB1dGVkIHN0eWxlIHRvIGRpcnR5IHNvIHRoYXQgaXQnbGwgYmUgYWJsZSB0byB1cGRhdGUgYW55Ci0gIC8vIGVsZW1lbnRzIHRoYXQgaGFkIGltYWdlcyBwdXJnZWQgd2hlbiBpdCByZXN1bWVzLgorICAvLyBlbGVtZW50cyB0aGF0IGhhZCBpbWFnZXMgcHVyZ2VkIHdoZW4gcHJvY2Vzc2luZyByZXN1bWVzLgogICBpc19jb21wdXRlZF9zdHlsZV9kaXJ0eV8gPSB0cnVlOwogCiAgIHNjb3BlZF9yZWZwdHI8SFRNTEh0bWxFbGVtZW50PiBjdXJyZW50X2h0bWwgPSBodG1sKCk7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9kb20uZ3lwIGIvc3JjL2NvYmFsdC9kb20vZG9tLmd5cAppbmRleCBhODE1NjE5Li42NzM4NzY0IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9kb20uZ3lwCisrKyBiL3NyYy9jb2JhbHQvZG9tL2RvbS5neXAKQEAgLTM3LDYgKzM3LDcgQEAKICAgICAgICAgJ2Jsb2IuY2MnLAogICAgICAgICAnYmxvYi5oJywKICAgICAgICAgJ2Jsb2JfcHJvcGVydHlfYmFnLmgnLAorICAgICAgICAnYnVmZmVyX3NvdXJjZS5oJywKICAgICAgICAgJ2NhbWVyYV8zZC5jYycsCiAgICAgICAgICdjYW1lcmFfM2QuaCcsCiAgICAgICAgICdjYW1lcmFfM2RfaW1wbC5jYycsCkBAIC0xNjksMTYgKzE3MCw2IEBACiAgICAgICAgICdsb2NhbF9zdG9yYWdlX2RhdGFiYXNlLmgnLAogICAgICAgICAnbG9jYXRpb24uY2MnLAogICAgICAgICAnbG9jYXRpb24uaCcsCi0gICAgICAgICdtZWRpYV9lcnJvci5oJywKLSAgICAgICAgJ21lZGlhX2tleV9jb21wbGV0ZV9ldmVudC5jYycsCi0gICAgICAgICdtZWRpYV9rZXlfY29tcGxldGVfZXZlbnQuaCcsCi0gICAgICAgICdtZWRpYV9rZXlfZXJyb3IuaCcsCi0gICAgICAgICdtZWRpYV9rZXlfZXJyb3JfZXZlbnQuY2MnLAotICAgICAgICAnbWVkaWFfa2V5X2Vycm9yX2V2ZW50LmgnLAotICAgICAgICAnbWVkaWFfa2V5X21lc3NhZ2VfZXZlbnQuY2MnLAotICAgICAgICAnbWVkaWFfa2V5X21lc3NhZ2VfZXZlbnQuaCcsCi0gICAgICAgICdtZWRpYV9rZXlfbmVlZGVkX2V2ZW50LmNjJywKLSAgICAgICAgJ21lZGlhX2tleV9uZWVkZWRfZXZlbnQuaCcsCiAgICAgICAgICdtZWRpYV9xdWVyeV9saXN0LmNjJywKICAgICAgICAgJ21lZGlhX3F1ZXJ5X2xpc3QuaCcsCiAgICAgICAgICdtZW1vcnlfaW5mby5jYycsCkBAIC0yODcsNiArMjc4LDE2IEBACiAgICAgICAnY29uZGl0aW9ucyc6IFsKICAgICAgICAgWydjb2JhbHRfbWVkaWFfc291cmNlXzIwMTY9PTEnLCB7CiAgICAgICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICAgICAnZW1lL21lZGlhX2VuY3J5cHRlZF9ldmVudC5jYycsCisgICAgICAgICAgICAnZW1lL21lZGlhX2VuY3J5cHRlZF9ldmVudC5oJywKKyAgICAgICAgICAgICdlbWUvbWVkaWFfa2V5X21lc3NhZ2VfZXZlbnQuY2MnLAorICAgICAgICAgICAgJ2VtZS9tZWRpYV9rZXlfbWVzc2FnZV9ldmVudC5oJywKKyAgICAgICAgICAgICdlbWUvbWVkaWFfa2V5X3Nlc3Npb24uY2MnLAorICAgICAgICAgICAgJ2VtZS9tZWRpYV9rZXlfc2Vzc2lvbi5oJywKKyAgICAgICAgICAgICdlbWUvbWVkaWFfa2V5X3N5c3RlbV9hY2Nlc3MuY2MnLAorICAgICAgICAgICAgJ2VtZS9tZWRpYV9rZXlfc3lzdGVtX2FjY2Vzcy5oJywKKyAgICAgICAgICAgICdlbWUvbWVkaWFfa2V5cy5jYycsCisgICAgICAgICAgICAnZW1lL21lZGlhX2tleXMuaCcsCiAgICAgICAgICAgICAnbWVkaWFfc291cmNlL21lZGlhX3NvdXJjZS5jYycsCiAgICAgICAgICAgICAnbWVkaWFfc291cmNlL21lZGlhX3NvdXJjZS5oJywKICAgICAgICAgICAgICdtZWRpYV9zb3VyY2Uvc291cmNlX2J1ZmZlci5jYycsCkBAIC0yOTksNiArMzAwLDE2IEBACiAgICAgICAgICAgXSwKICAgICAgICAgfSwgewogICAgICAgICAgICdzb3VyY2VzJzogWworICAgICAgICAgICAgJ21lZGlhX2Vycm9yLmgnLAorICAgICAgICAgICAgJ21lZGlhX2tleV9jb21wbGV0ZV9ldmVudC5jYycsCisgICAgICAgICAgICAnbWVkaWFfa2V5X2NvbXBsZXRlX2V2ZW50LmgnLAorICAgICAgICAgICAgJ21lZGlhX2tleV9lcnJvci5oJywKKyAgICAgICAgICAgICdtZWRpYV9rZXlfZXJyb3JfZXZlbnQuY2MnLAorICAgICAgICAgICAgJ21lZGlhX2tleV9lcnJvcl9ldmVudC5oJywKKyAgICAgICAgICAgICdtZWRpYV9rZXlfbWVzc2FnZV9ldmVudC5jYycsCisgICAgICAgICAgICAnbWVkaWFfa2V5X21lc3NhZ2VfZXZlbnQuaCcsCisgICAgICAgICAgICAnbWVkaWFfa2V5X25lZWRlZF9ldmVudC5jYycsCisgICAgICAgICAgICAnbWVkaWFfa2V5X25lZWRlZF9ldmVudC5oJywKICAgICAgICAgICAgICdtZWRpYV9zb3VyY2UuY2MnLAogICAgICAgICAgICAgJ21lZGlhX3NvdXJjZS5oJywKICAgICAgICAgICAgICdzb3VyY2VfYnVmZmVyLmNjJywKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2VsZW1lbnQuaCBiL3NyYy9jb2JhbHQvZG9tL2VsZW1lbnQuaAppbmRleCAxZTY0MTAwLi4wMTkwMWM5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9lbGVtZW50LmgKKysrIGIvc3JjL2NvYmFsdC9kb20vZWxlbWVudC5oCkBAIC03MSw2ICs3MSw3IEBACiAKICAgLy8gV2ViIEFQSTogRWxlbWVudAogICAvLworICBiYXNlOjpUb2tlbiBsb2NhbF9uYW1lKCkgY29uc3QgeyByZXR1cm4gbG9jYWxfbmFtZV87IH0KIAogICBiYXNlOjpUb2tlbiB0YWdfbmFtZSgpIGNvbnN0OwogCkBAIC0xMjYsOCArMTI3LDYgQEAKICAgLy8gQ3VzdG9tLCBub3QgaW4gYW55IHNwZWMuCiAgIC8vCiAKLSAgYmFzZTo6VG9rZW4gbG9jYWxfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGxvY2FsX25hbWVfOyB9Ci0KICAgLy8gUmV0dXJucyB3aGV0aGVyIHRoZSBlbGVtZW50IGhhcyBubyBjaGlsZHJlbiBhdCBhbGwgZXhjZXB0IGNvbW1lbnRzIG9yCiAgIC8vIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zLgogICAvLyAgIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9zZWxlY3RvcnM0LyNlbXB0eS1wc2V1ZG8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2VsZW1lbnQuaWRsIGIvc3JjL2NvYmFsdC9kb20vZWxlbWVudC5pZGwKaW5kZXggOThhNzdhMi4uZDE2OGRlMSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vZWxlbWVudC5pZGwKKysrIGIvc3JjL2NvYmFsdC9kb20vZWxlbWVudC5pZGwKQEAgLTE1LDYgKzE1LDcgQEAKIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9kb20vI2VsZW1lbnQKIAogaW50ZXJmYWNlIEVsZW1lbnQgOiBOb2RlIHsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyBsb2NhbE5hbWU7CiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcgdGFnTmFtZTsKICAgYXR0cmlidXRlIERPTVN0cmluZyBpZDsKICAgYXR0cmlidXRlIERPTVN0cmluZyBjbGFzc05hbWU7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9lbGVtZW50X3Rlc3QuY2MgYi9zcmMvY29iYWx0L2RvbS9lbGVtZW50X3Rlc3QuY2MKaW5kZXggMWU4NGI3YS4uNWQxZjUyZiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vZWxlbWVudF90ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL2VsZW1lbnRfdGVzdC5jYwpAQCAtMTIzLDcgKzEyMyw3IEBACiAgIEVYUEVDVF9FUShOVUxMLCB0ZXh0LT5Bc0VsZW1lbnQoKSk7CiB9CiAKLVRFU1RfRihFbGVtZW50VGVzdCwgVGFnTmFtZSkgeworVEVTVF9GKEVsZW1lbnRUZXN0LCBUYWdOYW1lQW5kTG9jYWxOYW1lKSB7CiAgIHNjb3BlZF9yZWZwdHI8RWxlbWVudD4gZWxlbWVudF9pbl9odG1sID0KICAgICAgIG5ldyBFbGVtZW50KGRvY3VtZW50XywgYmFzZTo6VG9rZW4oImVMZU1lTnQiKSk7CiAgIEVYUEVDVF9FUSgiRUxFTUVOVCIsIGVsZW1lbnRfaW5faHRtbC0+dGFnX25hbWUoKSk7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9odG1sX21lZGlhX2VsZW1lbnRfZW1lLmlkbCBiL3NyYy9jb2JhbHQvZG9tL2VtZS9odG1sX21lZGlhX2VsZW1lbnQuaWRsCnNpbWlsYXJpdHkgaW5kZXggODAlCnJlbmFtZSBmcm9tIHNyYy9jb2JhbHQvZG9tL2h0bWxfbWVkaWFfZWxlbWVudF9lbWUuaWRsCnJlbmFtZSB0byBzcmMvY29iYWx0L2RvbS9lbWUvaHRtbF9tZWRpYV9lbGVtZW50LmlkbAppbmRleCAzYjNkOTI0Li4xMjBkOTgzIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9odG1sX21lZGlhX2VsZW1lbnRfZW1lLmlkbAorKysgYi9zcmMvY29iYWx0L2RvbS9lbWUvaHRtbF9tZWRpYV9lbGVtZW50LmlkbApAQCAtMTIsMTEgKzEyLDEyIEBACiAvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTYvQ1ItZW5jcnlwdGVkLW1lZGlhLTIwMTYwNzA1LyNodG1sbWVkaWFlbGVtZW50LWV4dGVuc2lvbnMKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9lbmNyeXB0ZWQtbWVkaWEvI2h0bWxtZWRpYWVsZW1lbnQtZXh0ZW5zaW9ucwogCiBwYXJ0aWFsIGludGVyZmFjZSBIVE1MTWVkaWFFbGVtZW50IHsKICAgcmVhZG9ubHkgYXR0cmlidXRlIE1lZGlhS2V5cz8gbWVkaWFLZXlzOwogICBhdHRyaWJ1dGUgRXZlbnRIYW5kbGVyIG9uZW5jcnlwdGVkOwotICBhdHRyaWJ1dGUgRXZlbnRIYW5kbGVyIG9ud2FpdGluZ2ZvcmtleTsKKyAgLy8gVE9ETzogSW1wbGVtZW50IHRoZSBldmVudCBoYW5kbGVyIGZvciB0aGUgd2FpdGluZ2ZvcmtleSBldmVudC4KKyAgLy8gYXR0cmlidXRlIEV2ZW50SGFuZGxlciBvbndhaXRpbmdmb3JrZXk7CiAgIFByb21pc2U8dm9pZD4gc2V0TWVkaWFLZXlzKE1lZGlhS2V5cz8gbWVkaWFLZXlzKTsKIH07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9lbWUvbWVkaWFfZW5jcnlwdGVkX2V2ZW50LmNjIGIvc3JjL2NvYmFsdC9kb20vZW1lL21lZGlhX2VuY3J5cHRlZF9ldmVudC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmZlMDZjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9kb20vZW1lL21lZGlhX2VuY3J5cHRlZF9ldmVudC5jYwpAQCAtMCwwICsxLDM2IEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiY29iYWx0L2RvbS9lbWUvbWVkaWFfZW5jcnlwdGVkX2V2ZW50LmgiCisKKyNpbmNsdWRlICJjb2JhbHQvYmFzZS90b2tlbnMuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgZG9tIHsKK25hbWVzcGFjZSBlbWUgeworCisvLyBTZWUgc3RlcCA1IGluIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9lbmNyeXB0ZWQtbWVkaWEvI2luaXRkYXRhLWVuY291bnRlcmVkLgorTWVkaWFFbmNyeXB0ZWRFdmVudDo6TWVkaWFFbmNyeXB0ZWRFdmVudChjb25zdCBzdGQ6OnN0cmluZyYgdHlwZSkKKyAgICA6IEV2ZW50KGJhc2U6OlRva2VuKHR5cGUpLCBrTm90QnViYmxlcywga05vdENhbmNlbGFibGUpIHt9CisKKy8vIFNlZSBzdGVwIDUgaW4gaHR0cHM6Ly93d3cudzMub3JnL1RSL2VuY3J5cHRlZC1tZWRpYS8jaW5pdGRhdGEtZW5jb3VudGVyZWQuCitNZWRpYUVuY3J5cHRlZEV2ZW50OjpNZWRpYUVuY3J5cHRlZEV2ZW50KAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0eXBlLCBjb25zdCBNZWRpYUVuY3J5cHRlZEV2ZW50SW5pdCYgZXZlbnRfaW5pdF9kaWN0KQorICAgIDogRXZlbnQoYmFzZTo6VG9rZW4odHlwZSksIGtOb3RCdWJibGVzLCBrTm90Q2FuY2VsYWJsZSksCisgICAgICBpbml0X2RhdGFfdHlwZV8oZXZlbnRfaW5pdF9kaWN0LmluaXRfZGF0YV90eXBlKCkpLAorICAgICAgaW5pdF9kYXRhXyhldmVudF9pbml0X2RpY3QuaW5pdF9kYXRhKCkpIHt9CisKK30gIC8vIG5hbWVzcGFjZSBlbWUKK30gIC8vIG5hbWVzcGFjZSBkb20KK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2VtZS9tZWRpYV9lbmNyeXB0ZWRfZXZlbnQuaCBiL3NyYy9jb2JhbHQvZG9tL2VtZS9tZWRpYV9lbmNyeXB0ZWRfZXZlbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODAzNzc3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9kb20vZW1lL21lZGlhX2VuY3J5cHRlZF9ldmVudC5oCkBAIC0wLDAgKzEsNTUgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpZm5kZWYgQ09CQUxUX0RPTV9FTUVfTUVESUFfRU5DUllQVEVEX0VWRU5UX0hfCisjZGVmaW5lIENPQkFMVF9ET01fRU1FX01FRElBX0VOQ1JZUFRFRF9FVkVOVF9IXworCisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKKyNpbmNsdWRlICJjb2JhbHQvZG9tL2FycmF5X2J1ZmZlci5oIgorI2luY2x1ZGUgImNvYmFsdC9kb20vZW1lL21lZGlhX2VuY3J5cHRlZF9ldmVudF9pbml0LmgiCisjaW5jbHVkZSAiY29iYWx0L2RvbS9ldmVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGRvbSB7CituYW1lc3BhY2UgZW1lIHsKKworLy8gVGhlIE1lZGlhRW5jcnlwdGVkRXZlbnQgb2JqZWN0IGlzIHVzZWQgZm9yIHRoZSBlbmNyeXB0ZWQgZXZlbnQuCisvLyAgIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9lbmNyeXB0ZWQtbWVkaWEvI21lZGlhZW5jcnlwdGVkZXZlbnQKK2NsYXNzIE1lZGlhRW5jcnlwdGVkRXZlbnQgOiBwdWJsaWMgRXZlbnQgeworIHB1YmxpYzoKKyAgLy8gV2ViIEFQSTogTWVkaWFFbmNyeXB0ZWRFdmVudAorICAvLworCisgIGV4cGxpY2l0IE1lZGlhRW5jcnlwdGVkRXZlbnQoY29uc3Qgc3RkOjpzdHJpbmcmIHR5cGUpOworICBNZWRpYUVuY3J5cHRlZEV2ZW50KGNvbnN0IHN0ZDo6c3RyaW5nJiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lZGlhRW5jcnlwdGVkRXZlbnRJbml0JiBldmVudF9pbml0X2RpY3QpOworCisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbml0X2RhdGFfdHlwZSgpIGNvbnN0IHsgcmV0dXJuIGluaXRfZGF0YV90eXBlXzsgfQorICBjb25zdCBzY29wZWRfcmVmcHRyPEFycmF5QnVmZmVyPiYgaW5pdF9kYXRhKCkgY29uc3QgeyByZXR1cm4gaW5pdF9kYXRhXzsgfQorCisgIERFRklORV9XUkFQUEFCTEVfVFlQRShNZWRpYUVuY3J5cHRlZEV2ZW50KTsKKworIHByaXZhdGU6CisgIHN0ZDo6c3RyaW5nIGluaXRfZGF0YV90eXBlXzsKKyAgc2NvcGVkX3JlZnB0cjxBcnJheUJ1ZmZlcj4gaW5pdF9kYXRhXzsKK307CisKK30gIC8vIG5hbWVzcGFjZSBlbWUKK30gIC8vIG5hbWVzcGFjZSBkb20KK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKKworI2VuZGlmICAvLyBDT0JBTFRfRE9NX0VNRV9NRURJQV9FTkNSWVBURURfRVZFTlRfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL21lZGlhX2VuY3J5cHRlZF9ldmVudC5pZGwgYi9zcmMvY29iYWx0L2RvbS9lbWUvbWVkaWFfZW5jcnlwdGVkX2V2ZW50LmlkbApzaW1pbGFyaXR5IGluZGV4IDgwJQpyZW5hbWUgZnJvbSBzcmMvY29iYWx0L2RvbS9tZWRpYV9lbmNyeXB0ZWRfZXZlbnQuaWRsCnJlbmFtZSB0byBzcmMvY29iYWx0L2RvbS9lbWUvbWVkaWFfZW5jcnlwdGVkX2V2ZW50LmlkbAppbmRleCBjZDMzYzAxLi44MzUxNjViIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9tZWRpYV9lbmNyeXB0ZWRfZXZlbnQuaWRsCisrKyBiL3NyYy9jb2JhbHQvZG9tL2VtZS9tZWRpYV9lbmNyeXB0ZWRfZXZlbnQuaWRsCkBAIC0xMiwxMiArMTIsNyBAQAogLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKLS8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDE2L0NSLWVuY3J5cHRlZC1tZWRpYS0yMDE2MDcwNS8jbWVkaWFlbmNyeXB0ZWRldmVudAotCi1kaWN0aW9uYXJ5IE1lZGlhRW5jcnlwdGVkRXZlbnRJbml0IDogRXZlbnRJbml0IHsKLSAgRE9NU3RyaW5nIGluaXREYXRhVHlwZSA9ICIiOwotICBBcnJheUJ1ZmZlcj8gaW5pdERhdGEgPSBudWxsOwotfTsKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9lbmNyeXB0ZWQtbWVkaWEvI21lZGlhZW5jcnlwdGVkZXZlbnQKIAogW0NvbnN0cnVjdG9yKERPTVN0cmluZyB0eXBlLCBvcHRpb25hbCBNZWRpYUVuY3J5cHRlZEV2ZW50SW5pdCBldmVudEluaXREaWN0KV0KIGludGVyZmFjZSBNZWRpYUVuY3J5cHRlZEV2ZW50IDogRXZlbnQgewpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vbWVkaWFfa2V5X3N5c3RlbV9tZWRpYV9jYXBhYmlsaXR5LmlkbCBiL3NyYy9jb2JhbHQvZG9tL2VtZS9tZWRpYV9lbmNyeXB0ZWRfZXZlbnRfaW5pdC5pZGwKc2ltaWxhcml0eSBpbmRleCA3NCUKY29weSBmcm9tIHNyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9zeXN0ZW1fbWVkaWFfY2FwYWJpbGl0eS5pZGwKY29weSB0byBzcmMvY29iYWx0L2RvbS9lbWUvbWVkaWFfZW5jcnlwdGVkX2V2ZW50X2luaXQuaWRsCmluZGV4IDUxZTFmMmUuLjI1YWQ4OTggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9zeXN0ZW1fbWVkaWFfY2FwYWJpbGl0eS5pZGwKKysrIGIvc3JjL2NvYmFsdC9kb20vZW1lL21lZGlhX2VuY3J5cHRlZF9ldmVudF9pbml0LmlkbApAQCAtMTIsOSArMTIsOSBAQAogLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKLS8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDE2L0NSLWVuY3J5cHRlZC1tZWRpYS0yMDE2MDcwNS8jbWVkaWFrZXlzeXN0ZW1tZWRpYWNhcGFiaWxpdHktZGljdGlvbmFyeQorLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2VuY3J5cHRlZC1tZWRpYS8jbWVkaWFlbmNyeXB0ZWRldmVudGluaXQKIAotZGljdGlvbmFyeSBNZWRpYUtleVN5c3RlbU1lZGlhQ2FwYWJpbGl0eSB7Ci0gIERPTVN0cmluZyBjb250ZW50VHlwZSA9ICIiOwotICBET01TdHJpbmcgcm9idXN0bmVzcyA9ICIiOworZGljdGlvbmFyeSBNZWRpYUVuY3J5cHRlZEV2ZW50SW5pdCA6IEV2ZW50SW5pdCB7CisgIERPTVN0cmluZyBpbml0RGF0YVR5cGUgPSAiIjsKKyAgQXJyYXlCdWZmZXI/IGluaXREYXRhID0gbnVsbDsKIH07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9lbWUvbWVkaWFfa2V5X21lc3NhZ2VfZXZlbnQuY2MgYi9zcmMvY29iYWx0L2RvbS9lbWUvbWVkaWFfa2V5X21lc3NhZ2VfZXZlbnQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDIyNjU2MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZG9tL2VtZS9tZWRpYV9rZXlfbWVzc2FnZV9ldmVudC5jYwpAQCAtMCwwICsxLDMzIEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiY29iYWx0L2RvbS9lbWUvbWVkaWFfa2V5X21lc3NhZ2VfZXZlbnQuaCIKKworI2luY2x1ZGUgImNvYmFsdC9iYXNlL3Rva2Vucy5oIgorI2luY2x1ZGUgImNvYmFsdC9kb20vZW1lL21lZGlhX2tleV9tZXNzYWdlX3R5cGUuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgZG9tIHsKK25hbWVzcGFjZSBlbWUgeworCisvLyBTZWUgc3RlcCAyIGluIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9lbmNyeXB0ZWQtbWVkaWEvI3F1ZXVlLW1lc3NhZ2UuCitNZWRpYUtleU1lc3NhZ2VFdmVudDo6TWVkaWFLZXlNZXNzYWdlRXZlbnQoCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHR5cGUsIGNvbnN0IE1lZGlhS2V5TWVzc2FnZUV2ZW50SW5pdCYgZXZlbnRfaW5pdF9kaWN0KQorICAgIDogRXZlbnQoYmFzZTo6VG9rZW4odHlwZSksIGtOb3RCdWJibGVzLCBrTm90Q2FuY2VsYWJsZSksCisgICAgICBtZXNzYWdlX3R5cGVfKGV2ZW50X2luaXRfZGljdC5tZXNzYWdlX3R5cGUoKSksCisgICAgICBtZXNzYWdlXyhldmVudF9pbml0X2RpY3QubWVzc2FnZSgpKSB7fQorCit9ICAvLyBuYW1lc3BhY2UgZW1lCit9ICAvLyBuYW1lc3BhY2UgZG9tCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9lbWUvbWVkaWFfa2V5X21lc3NhZ2VfZXZlbnQuaCBiL3NyYy9jb2JhbHQvZG9tL2VtZS9tZWRpYV9rZXlfbWVzc2FnZV9ldmVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMzM3OWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2RvbS9lbWUvbWVkaWFfa2V5X21lc3NhZ2VfZXZlbnQuaApAQCAtMCwwICsxLDU1IEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaWZuZGVmIENPQkFMVF9ET01fRU1FX01FRElBX0tFWV9NRVNTQUdFX0VWRU5UX0hfCisjZGVmaW5lIENPQkFMVF9ET01fRU1FX01FRElBX0tFWV9NRVNTQUdFX0VWRU5UX0hfCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgorI2luY2x1ZGUgImNvYmFsdC9kb20vYXJyYXlfYnVmZmVyLmgiCisjaW5jbHVkZSAiY29iYWx0L2RvbS9lbWUvbWVkaWFfa2V5X21lc3NhZ2VfZXZlbnRfaW5pdC5oIgorI2luY2x1ZGUgImNvYmFsdC9kb20vZW1lL21lZGlhX2tleV9tZXNzYWdlX3R5cGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvZG9tL2V2ZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgZG9tIHsKK25hbWVzcGFjZSBlbWUgeworCisvLyBUaGUgTWVkaWFLZXlNZXNzYWdlRXZlbnQgb2JqZWN0IGlzIHVzZWQgZm9yIHRoZSBtZXNzYWdlIGV2ZW50LgorLy8gICBodHRwczovL3d3dy53My5vcmcvVFIvZW5jcnlwdGVkLW1lZGlhLyNtZWRpYWtleW1lc3NhZ2VldmVudAorY2xhc3MgTWVkaWFLZXlNZXNzYWdlRXZlbnQgOiBwdWJsaWMgRXZlbnQgeworIHB1YmxpYzoKKyAgLy8gV2ViIElETDogTWVkaWFLZXlNZXNzYWdlRXZlbnQKKyAgLy8KKworICBNZWRpYUtleU1lc3NhZ2VFdmVudChjb25zdCBzdGQ6OnN0cmluZyYgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVkaWFLZXlNZXNzYWdlRXZlbnRJbml0JiBldmVudF9pbml0X2RpY3QpOworCisgIE1lZGlhS2V5TWVzc2FnZVR5cGUgbWVzc2FnZV90eXBlKCkgY29uc3QgeyByZXR1cm4gbWVzc2FnZV90eXBlXzsgfQorICBjb25zdCBzY29wZWRfcmVmcHRyPEFycmF5QnVmZmVyPiYgbWVzc2FnZSgpIGNvbnN0IHsgcmV0dXJuIG1lc3NhZ2VfOyB9CisKKyAgREVGSU5FX1dSQVBQQUJMRV9UWVBFKE1lZGlhS2V5TWVzc2FnZUV2ZW50KTsKKworIHByaXZhdGU6CisgIE1lZGlhS2V5TWVzc2FnZVR5cGUgbWVzc2FnZV90eXBlXzsKKyAgc2NvcGVkX3JlZnB0cjxBcnJheUJ1ZmZlcj4gbWVzc2FnZV87Cit9OworCit9ICAvLyBuYW1lc3BhY2UgZW1lCit9ICAvLyBuYW1lc3BhY2UgZG9tCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKyNlbmRpZiAgLy8gQ09CQUxUX0RPTV9FTUVfTUVESUFfS0VZX01FU1NBR0VfRVZFTlRfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9zeXN0ZW1fbWVkaWFfY2FwYWJpbGl0eS5pZGwgYi9zcmMvY29iYWx0L2RvbS9lbWUvbWVkaWFfa2V5X21lc3NhZ2VfZXZlbnQuaWRsCnNpbWlsYXJpdHkgaW5kZXggNjklCmNvcHkgZnJvbSBzcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfc3lzdGVtX21lZGlhX2NhcGFiaWxpdHkuaWRsCmNvcHkgdG8gc3JjL2NvYmFsdC9kb20vZW1lL21lZGlhX2tleV9tZXNzYWdlX2V2ZW50LmlkbAppbmRleCA1MWUxZjJlLi45ZTQ1OWFjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfc3lzdGVtX21lZGlhX2NhcGFiaWxpdHkuaWRsCisrKyBiL3NyYy9jb2JhbHQvZG9tL2VtZS9tZWRpYV9rZXlfbWVzc2FnZV9ldmVudC5pZGwKQEAgLTEyLDkgKzEyLDEwIEBACiAvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTYvQ1ItZW5jcnlwdGVkLW1lZGlhLTIwMTYwNzA1LyNtZWRpYWtleXN5c3RlbW1lZGlhY2FwYWJpbGl0eS1kaWN0aW9uYXJ5CisvLyBodHRwczovL3d3dy53My5vcmcvVFIvZW5jcnlwdGVkLW1lZGlhLyNtZWRpYWtleW1lc3NhZ2VldmVudAogCi1kaWN0aW9uYXJ5IE1lZGlhS2V5U3lzdGVtTWVkaWFDYXBhYmlsaXR5IHsKLSAgRE9NU3RyaW5nIGNvbnRlbnRUeXBlID0gIiI7Ci0gIERPTVN0cmluZyByb2J1c3RuZXNzID0gIiI7CitbQ29uc3RydWN0b3IoRE9NU3RyaW5nIHR5cGUsIE1lZGlhS2V5TWVzc2FnZUV2ZW50SW5pdCBldmVudEluaXREaWN0KV0KK2ludGVyZmFjZSBNZWRpYUtleU1lc3NhZ2VFdmVudCA6IEV2ZW50IHsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIE1lZGlhS2V5TWVzc2FnZVR5cGUgbWVzc2FnZVR5cGU7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBBcnJheUJ1ZmZlciBtZXNzYWdlOwogfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9tZXNzYWdlX2V2ZW50X2luaXQuaWRsIGIvc3JjL2NvYmFsdC9kb20vZW1lL21lZGlhX2tleV9tZXNzYWdlX2V2ZW50X2luaXQuaWRsCnNpbWlsYXJpdHkgaW5kZXggODIlCnJlbmFtZSBmcm9tIHNyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9tZXNzYWdlX2V2ZW50X2luaXQuaWRsCnJlbmFtZSB0byBzcmMvY29iYWx0L2RvbS9lbWUvbWVkaWFfa2V5X21lc3NhZ2VfZXZlbnRfaW5pdC5pZGwKaW5kZXggOTExNWE0NC4uMGY2NjAyYyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vbWVkaWFfa2V5X21lc3NhZ2VfZXZlbnRfaW5pdC5pZGwKKysrIGIvc3JjL2NvYmFsdC9kb20vZW1lL21lZGlhX2tleV9tZXNzYWdlX2V2ZW50X2luaXQuaWRsCkBAIC0xMiw3ICsxMiw5IEBACiAvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAorLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2VuY3J5cHRlZC1tZWRpYS8jbWVkaWFrZXltZXNzYWdlZXZlbnRpbml0CisKIGRpY3Rpb25hcnkgTWVkaWFLZXlNZXNzYWdlRXZlbnRJbml0IDogRXZlbnRJbml0IHsKLSAgTWVkaWFLZXlNZXNzYWdlVHlwZSBtZXNzYWdlVHlwZSA9ICJsaWNlbnNlLXJlcXVlc3QiOwotICBBcnJheUJ1ZmZlciBtZXNzYWdlOworICByZXF1aXJlZCBNZWRpYUtleU1lc3NhZ2VUeXBlIG1lc3NhZ2VUeXBlOworICByZXF1aXJlZCBBcnJheUJ1ZmZlciBtZXNzYWdlOwogfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9zeXN0ZW1fbWVkaWFfY2FwYWJpbGl0eS5pZGwgYi9zcmMvY29iYWx0L2RvbS9lbWUvbWVkaWFfa2V5X21lc3NhZ2VfdHlwZS5pZGwKc2ltaWxhcml0eSBpbmRleCA3MSUKY29weSBmcm9tIHNyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9zeXN0ZW1fbWVkaWFfY2FwYWJpbGl0eS5pZGwKY29weSB0byBzcmMvY29iYWx0L2RvbS9lbWUvbWVkaWFfa2V5X21lc3NhZ2VfdHlwZS5pZGwKaW5kZXggNTFlMWYyZS4uMTEyNTQ2MyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vbWVkaWFfa2V5X3N5c3RlbV9tZWRpYV9jYXBhYmlsaXR5LmlkbAorKysgYi9zcmMvY29iYWx0L2RvbS9lbWUvbWVkaWFfa2V5X21lc3NhZ2VfdHlwZS5pZGwKQEAgLTEyLDkgKzEyLDEyIEBACiAvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTYvQ1ItZW5jcnlwdGVkLW1lZGlhLTIwMTYwNzA1LyNtZWRpYWtleXN5c3RlbW1lZGlhY2FwYWJpbGl0eS1kaWN0aW9uYXJ5CisvLyBodHRwczovL3d3dy53My5vcmcvVFIvZW5jcnlwdGVkLW1lZGlhLyNpZGwtZGVmLW1lZGlha2V5bWVzc2FnZXR5cGUKIAotZGljdGlvbmFyeSBNZWRpYUtleVN5c3RlbU1lZGlhQ2FwYWJpbGl0eSB7Ci0gIERPTVN0cmluZyBjb250ZW50VHlwZSA9ICIiOwotICBET01TdHJpbmcgcm9idXN0bmVzcyA9ICIiOworZW51bSBNZWRpYUtleU1lc3NhZ2VUeXBlIHsKKyAgImxpY2Vuc2UtcmVxdWVzdCIsCisgIC8vIFRPRE86IEltcGxlbWVudCBvdGhlciBtZXNzYWdlIHR5cGVzLgorICAvLyAibGljZW5zZS1yZW5ld2FsIiwKKyAgLy8gImxpY2Vuc2UtcmVsZWFzZSIsCisgIC8vICJpbmRpdmlkdWFsaXphdGlvbi1yZXF1ZXN0IgogfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2VtZS9tZWRpYV9rZXlfc2Vzc2lvbi5jYyBiL3NyYy9jb2JhbHQvZG9tL2VtZS9tZWRpYV9rZXlfc2Vzc2lvbi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjZiZjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9kb20vZW1lL21lZGlhX2tleV9zZXNzaW9uLmNjCkBAIC0wLDAgKzEsMzI1IEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiY29iYWx0L2RvbS9lbWUvbWVkaWFfa2V5X3Nlc3Npb24uaCIKKworI2luY2x1ZGUgImNvYmFsdC9kb20vYXJyYXlfYnVmZmVyLmgiCisjaW5jbHVkZSAiY29iYWx0L2RvbS9hcnJheV9idWZmZXJfdmlldy5oIgorI2luY2x1ZGUgImNvYmFsdC9kb20vZG9tX2V4Y2VwdGlvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9kb20vZW1lL21lZGlhX2tleV9tZXNzYWdlX2V2ZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L2RvbS9lbWUvbWVkaWFfa2V5X21lc3NhZ2VfZXZlbnRfaW5pdC5oIgorI2luY2x1ZGUgImNvYmFsdC9kb20vZW1lL21lZGlhX2tleXMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF92YWx1ZV9mYWN0b3J5LmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGRvbSB7CituYW1lc3BhY2UgZW1lIHsKKworLy8gU2VlIHN0ZXAgMy4xIG9mCisvLyBodHRwczovL3d3dy53My5vcmcvVFIvZW5jcnlwdGVkLW1lZGlhLyNkb20tbWVkaWFrZXlzLWNyZWF0ZXNlc3Npb24uCitNZWRpYUtleVNlc3Npb246Ok1lZGlhS2V5U2Vzc2lvbigKKyAgICBzY29wZWRfcHRyPG1lZGlhOjpEcm1TeXN0ZW06OlNlc3Npb24+IGRybV9zeXN0ZW1fc2Vzc2lvbiwKKyAgICBzY3JpcHQ6OlNjcmlwdFZhbHVlRmFjdG9yeSogc2NyaXB0X3ZhbHVlX2ZhY3RvcnksCisgICAgY29uc3QgQ2xvc2VkQ2FsbGJhY2smIGNsb3NlZF9jYWxsYmFjaykKKyAgICA6IGRybV9zeXN0ZW1fc2Vzc2lvbl8oZHJtX3N5c3RlbV9zZXNzaW9uLlBhc3MoKSksCisgICAgICBzY3JpcHRfdmFsdWVfZmFjdG9yeV8oc2NyaXB0X3ZhbHVlX2ZhY3RvcnkpLAorICAgICAgdW5pbml0aWFsaXplZF8odHJ1ZSksCisgICAgICBjYWxsYWJsZV8oZmFsc2UpLAorICAgICAgY2xvc2VkX2NhbGxiYWNrXyhjbG9zZWRfY2FsbGJhY2spLAorICAgICAgQUxMT1dfVEhJU19JTl9JTklUSUFMSVpFUl9MSVNUKGNsb3NlZF9wcm9taXNlX3JlZmVyZW5jZV8oCisgICAgICAgICAgdGhpcywgc2NyaXB0X3ZhbHVlX2ZhY3RvcnktPkNyZWF0ZUJhc2ljUHJvbWlzZTx2b2lkPigpKSksCisgICAgICBpbml0aWF0ZWRfYnlfZ2VuZXJhdGVfcmVxdWVzdF8oZmFsc2UpIHt9CisKKy8vIFNlc3Npb24gSUQgc2hvdWxkIGJlIGVtcHR5IGZvciB1bmluaXRpYWxpemVkIHNlc3Npb25zIGFjY29yZGluZyB0byBzdGVwIDMuMQorLy8gb2YgaHR0cHM6Ly93d3cudzMub3JnL1RSL2VuY3J5cHRlZC1tZWRpYS8jZG9tLW1lZGlha2V5cy1jcmVhdGVzZXNzaW9uLgorc3RkOjpzdHJpbmcgTWVkaWFLZXlTZXNzaW9uOjpzZXNzaW9uX2lkKCkgY29uc3QgeworICByZXR1cm4gZHJtX3N5c3RlbV9zZXNzaW9uXy0+aWQoKS52YWx1ZV9vcigiIik7Cit9CisKK01lZGlhS2V5U2Vzc2lvbjo6fk1lZGlhS2V5U2Vzc2lvbigpIHt9CisKK2NvbnN0IE1lZGlhS2V5U2Vzc2lvbjo6Vm9pZFByb21pc2VWYWx1ZSogTWVkaWFLZXlTZXNzaW9uOjpjbG9zZWQoKSBjb25zdCB7CisgIHJldHVybiAmY2xvc2VkX3Byb21pc2VfcmVmZXJlbmNlXy5yZWZlcmVuY2VkX3ZhbHVlKCk7Cit9CisKK2NvbnN0IEV2ZW50VGFyZ2V0OjpFdmVudExpc3RlbmVyU2NyaXB0VmFsdWUqIE1lZGlhS2V5U2Vzc2lvbjo6b25tZXNzYWdlKCkKKyAgICBjb25zdCB7CisgIHJldHVybiBHZXRBdHRyaWJ1dGVFdmVudExpc3RlbmVyKGJhc2U6OlRva2Vuczo6bWVzc2FnZSgpKTsKK30KKwordm9pZCBNZWRpYUtleVNlc3Npb246OnNldF9vbm1lc3NhZ2UoCisgICAgY29uc3QgRXZlbnRMaXN0ZW5lclNjcmlwdFZhbHVlJiBldmVudF9saXN0ZW5lcikgeworICBTZXRBdHRyaWJ1dGVFdmVudExpc3RlbmVyKGJhc2U6OlRva2Vuczo6bWVzc2FnZSgpLCBldmVudF9saXN0ZW5lcik7Cit9CisKK25hbWVzcGFjZSB7CisKK3ZvaWQgR2V0QnVmZmVyQW5kU2l6ZShjb25zdCBCdWZmZXJTb3VyY2UmIGJ1ZmZlcl9zb3VyY2UsIGNvbnN0IHVpbnQ4KiogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgIGludCogYnVmZmVyX3NpemUpIHsKKyAgaWYgKGJ1ZmZlcl9zb3VyY2UuSXNUeXBlPHNjb3BlZF9yZWZwdHI8QXJyYXlCdWZmZXJWaWV3PiA+KCkpIHsKKyAgICBzY29wZWRfcmVmcHRyPEFycmF5QnVmZmVyVmlldz4gYXJyYXlfYnVmZmVyX3ZpZXcgPQorICAgICAgICBidWZmZXJfc291cmNlLkFzVHlwZTxzY29wZWRfcmVmcHRyPEFycmF5QnVmZmVyVmlldz4gPigpOworICAgICpidWZmZXIgPSBzdGF0aWNfY2FzdDxjb25zdCB1aW50OCo+KGFycmF5X2J1ZmZlcl92aWV3LT5iYXNlX2FkZHJlc3MoKSk7CisgICAgKmJ1ZmZlcl9zaXplID0gYXJyYXlfYnVmZmVyX3ZpZXctPmJ5dGVfbGVuZ3RoKCk7CisgIH0gZWxzZSBpZiAoYnVmZmVyX3NvdXJjZS5Jc1R5cGU8c2NvcGVkX3JlZnB0cjxBcnJheUJ1ZmZlcj4gPigpKSB7CisgICAgc2NvcGVkX3JlZnB0cjxBcnJheUJ1ZmZlcj4gYXJyYXlfYnVmZmVyID0KKyAgICAgICAgYnVmZmVyX3NvdXJjZS5Bc1R5cGU8c2NvcGVkX3JlZnB0cjxBcnJheUJ1ZmZlcj4gPigpOworICAgICpidWZmZXIgPSBhcnJheV9idWZmZXItPmRhdGEoKTsKKyAgICAqYnVmZmVyX3NpemUgPSBhcnJheV9idWZmZXItPmJ5dGVfbGVuZ3RoKCk7CisgIH0gZWxzZSB7CisgICAgTk9UUkVBQ0hFRCgpOworICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBTZWUKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9lbmNyeXB0ZWQtbWVkaWEvI2RvbS1tZWRpYWtleXNlc3Npb24tZ2VuZXJhdGVyZXF1ZXN0Lgorc2NvcGVkX3B0cjxNZWRpYUtleVNlc3Npb246OlZvaWRQcm9taXNlVmFsdWU+IE1lZGlhS2V5U2Vzc2lvbjo6R2VuZXJhdGVSZXF1ZXN0KAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbml0X2RhdGFfdHlwZSwgY29uc3QgQnVmZmVyU291cmNlJiBpbml0X2RhdGEpIHsKKyAgc2NvcGVkX3B0cjxWb2lkUHJvbWlzZVZhbHVlPiBwcm9taXNlID0KKyAgICAgIHNjcmlwdF92YWx1ZV9mYWN0b3J5Xy0+Q3JlYXRlQmFzaWNQcm9taXNlPHZvaWQ+KCk7CisgIFZvaWRQcm9taXNlVmFsdWU6OlN0cm9uZ1JlZmVyZW5jZSBwcm9taXNlX3JlZmVyZW5jZSgqcHJvbWlzZSk7CisKKyAgLy8gMS4gSWYgdGhpcyBvYmplY3QgaXMgY2xvc2VkLCByZXR1cm4gYSBwcm9taXNlIHJlamVjdGVkIHdpdGgKKyAgLy8gICAgYW4gSW52YWxpZFN0YXRlRXJyb3IuCisgIC8vIDIuIElmIHRoaXMgb2JqZWN0J3MgdW5pbml0aWFsaXplZCB2YWx1ZSBpcyBmYWxzZSwgcmV0dXJuIGEgcHJvbWlzZSByZWplY3RlZAorICAvLyAgICB3aXRoIGFuIEludmFsaWRTdGF0ZUVycm9yLgorICBpZiAoZHJtX3N5c3RlbV9zZXNzaW9uXy0+aXNfY2xvc2VkKCkgfHwgIXVuaW5pdGlhbGl6ZWRfKSB7CisgICAgcHJvbWlzZV9yZWZlcmVuY2UudmFsdWUoKS5SZWplY3QoCisgICAgICAgIG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uOjprSW52YWxpZFN0YXRlRXJyKSk7CisgICAgcmV0dXJuIHByb21pc2UuUGFzcygpOworICB9CisKKyAgLy8gMy4gTGV0IHRoaXMgb2JqZWN0J3MgdW5pbml0aWFsaXplZCB2YWx1ZSBiZSBmYWxzZS4KKyAgdW5pbml0aWFsaXplZF8gPSBmYWxzZTsKKworICBjb25zdCB1aW50OCogaW5pdF9kYXRhX2J1ZmZlcjsKKyAgaW50IGluaXRfZGF0YV9idWZmZXJfc2l6ZTsKKyAgR2V0QnVmZmVyQW5kU2l6ZShpbml0X2RhdGEsICZpbml0X2RhdGFfYnVmZmVyLCAmaW5pdF9kYXRhX2J1ZmZlcl9zaXplKTsKKworICAvLyA0LiBJZiBpbml0RGF0YVR5cGUgaXMgdGhlIGVtcHR5IHN0cmluZywgcmV0dXJuIGEgcHJvbWlzZSByZWplY3RlZCB3aXRoCisgIC8vICAgIGEgbmV3bHkgY3JlYXRlZCBUeXBlRXJyb3IuCisgIC8vIDUuIElmIGluaXREYXRhIGlzIGFuIGVtcHR5IGFycmF5LCByZXR1cm4gYSBwcm9taXNlIHJlamVjdGVkIHdpdGggYSBuZXdseQorICAvLyAgICBjcmVhdGVkIFR5cGVFcnJvci4KKyAgaWYgKGluaXRfZGF0YV90eXBlLmVtcHR5KCkgfHwgaW5pdF9kYXRhX2J1ZmZlcl9zaXplID09IDApIHsKKyAgICBwcm9taXNlX3JlZmVyZW5jZS52YWx1ZSgpLlJlamVjdChzY3JpcHQ6OmtUeXBlRXJyb3IpOworICAgIHJldHVybiBwcm9taXNlLlBhc3MoKTsKKyAgfQorCisgIC8vIDEwLjIuIFRoZSB1c2VyIGFnZW50IG11c3QgdGhvcm91Z2hseSB2YWxpZGF0ZSB0aGUgaW5pdGlhbGl6YXRpb24gZGF0YQorICAvLyAgICAgICBiZWZvcmUgcGFzc2luZyBpdCB0byB0aGUgQ0RNLgorICAvLworICAvLyBTYW5pdGF0aW9uIGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiBTdGFyYm9hcmQgaW1wbGVtZW50ZXJzLgorCisgIC8vIDEwLjkuIFVzZSB0aGUgQ0RNLgorICBpbml0aWF0ZWRfYnlfZ2VuZXJhdGVfcmVxdWVzdF8gPSB0cnVlOworICBkcm1fc3lzdGVtX3Nlc3Npb25fLT5HZW5lcmF0ZVVwZGF0ZVJlcXVlc3QoCisgICAgICBpbml0X2RhdGFfdHlwZSwgaW5pdF9kYXRhX2J1ZmZlciwgaW5pdF9kYXRhX2J1ZmZlcl9zaXplLAorICAgICAgYmFzZTo6QmluZCgmTWVkaWFLZXlTZXNzaW9uOjpPblNlc3Npb25VcGRhdGVSZXF1ZXN0R2VuZXJhdGVkLAorICAgICAgICAgICAgICAgICBiYXNlOjpBc1dlYWtQdHIodGhpcyksCisgICAgICAgICAgICAgICAgIGJhc2U6Ok93bmVkKG5ldyBWb2lkUHJvbWlzZVZhbHVlOjpSZWZlcmVuY2UodGhpcywgKnByb21pc2UpKSksCisgICAgICBiYXNlOjpCaW5kKCZNZWRpYUtleVNlc3Npb246Ok9uU2Vzc2lvblVwZGF0ZVJlcXVlc3REaWROb3RHZW5lcmF0ZSwKKyAgICAgICAgICAgICAgICAgYmFzZTo6QXNXZWFrUHRyKHRoaXMpLAorICAgICAgICAgICAgICAgICBiYXNlOjpPd25lZChuZXcgVm9pZFByb21pc2VWYWx1ZTo6UmVmZXJlbmNlKHRoaXMsICpwcm9taXNlKSkpKTsKKworICAvLyAxMS4gUmV0dXJuIHByb21pc2UuCisgIHJldHVybiBwcm9taXNlLlBhc3MoKTsKK30KKworLy8gU2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9lbmNyeXB0ZWQtbWVkaWEvI2RvbS1tZWRpYWtleXNlc3Npb24tdXBkYXRlLgorc2NvcGVkX3B0cjxNZWRpYUtleVNlc3Npb246OlZvaWRQcm9taXNlVmFsdWU+IE1lZGlhS2V5U2Vzc2lvbjo6VXBkYXRlKAorICAgIGNvbnN0IEJ1ZmZlclNvdXJjZSYgcmVzcG9uc2UpIHsKKyAgc2NvcGVkX3B0cjxWb2lkUHJvbWlzZVZhbHVlPiBwcm9taXNlID0KKyAgICAgIHNjcmlwdF92YWx1ZV9mYWN0b3J5Xy0+Q3JlYXRlQmFzaWNQcm9taXNlPHZvaWQ+KCk7CisgIFZvaWRQcm9taXNlVmFsdWU6OlN0cm9uZ1JlZmVyZW5jZSBwcm9taXNlX3JlZmVyZW5jZSgqcHJvbWlzZSk7CisKKyAgLy8gMS4gSWYgdGhpcyBvYmplY3QgaXMgY2xvc2VkLCByZXR1cm4gYSBwcm9taXNlIHJlamVjdGVkIHdpdGgKKyAgLy8gICAgYW4gSW52YWxpZFN0YXRlRXJyb3IuCisgIC8vIDIuIElmIHRoaXMgb2JqZWN0J3MgY2FsbGFibGUgdmFsdWUgaXMgZmFsc2UsIHJldHVybiBhIHByb21pc2UgcmVqZWN0ZWQKKyAgLy8gICAgd2l0aCBhbiBJbnZhbGlkU3RhdGVFcnJvci4KKyAgaWYgKGRybV9zeXN0ZW1fc2Vzc2lvbl8tPmlzX2Nsb3NlZCgpIHx8ICFjYWxsYWJsZV8pIHsKKyAgICBwcm9taXNlX3JlZmVyZW5jZS52YWx1ZSgpLlJlamVjdCgKKyAgICAgICAgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb246OmtJbnZhbGlkU3RhdGVFcnIpKTsKKyAgICByZXR1cm4gcHJvbWlzZS5QYXNzKCk7CisgIH0KKworICBjb25zdCB1aW50OCogcmVzcG9uc2VfYnVmZmVyOworICBpbnQgcmVzcG9uc2VfYnVmZmVyX3NpemU7CisgIEdldEJ1ZmZlckFuZFNpemUocmVzcG9uc2UsICZyZXNwb25zZV9idWZmZXIsICZyZXNwb25zZV9idWZmZXJfc2l6ZSk7CisKKyAgLy8gMy4gSWYgcmVzcG9uc2UgaXMgYW4gZW1wdHkgYXJyYXksIHJldHVybiBhIHByb21pc2UgcmVqZWN0ZWQgd2l0aCBhIG5ld2x5CisgIC8vICAgIGNyZWF0ZWQgVHlwZUVycm9yLgorICBpZiAocmVzcG9uc2VfYnVmZmVyX3NpemUgPT0gMCkgeworICAgIHByb21pc2VfcmVmZXJlbmNlLnZhbHVlKCkuUmVqZWN0KHNjcmlwdDo6a1R5cGVFcnJvcik7CisgICAgcmV0dXJuIHByb21pc2UuUGFzcygpOworICB9CisKKyAgLy8gNi4xLiBMZXQgc2FuaXRpemVkIHJlc3BvbnNlIGJlIGEgdmFsaWRhdGVkIGFuZC9vciBzYW5pdGl6ZWQgdmVyc2lvbiBvZgorICAvLyAgICAgIHJlc3BvbnNlIGNvcHkuCisgIC8vCisgIC8vIFNhbml0YXRpb24gaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIFN0YXJib2FyZCBpbXBsZW1lbnRlcnMuCisKKyAgLy8gNi43LiBVc2UgdGhlIENETS4KKyAgZHJtX3N5c3RlbV9zZXNzaW9uXy0+VXBkYXRlKAorICAgICAgcmVzcG9uc2VfYnVmZmVyLCByZXNwb25zZV9idWZmZXJfc2l6ZSwKKyAgICAgIGJhc2U6OkJpbmQoJk1lZGlhS2V5U2Vzc2lvbjo6T25TZXNzaW9uVXBkYXRlZCwgYmFzZTo6QXNXZWFrUHRyKHRoaXMpLAorICAgICAgICAgICAgICAgICBiYXNlOjpPd25lZChuZXcgVm9pZFByb21pc2VWYWx1ZTo6UmVmZXJlbmNlKHRoaXMsICpwcm9taXNlKSkpLAorICAgICAgYmFzZTo6QmluZCgmTWVkaWFLZXlTZXNzaW9uOjpPblNlc3Npb25EaWROb3RVcGRhdGUsIGJhc2U6OkFzV2Vha1B0cih0aGlzKSwKKyAgICAgICAgICAgICAgICAgYmFzZTo6T3duZWQobmV3IFZvaWRQcm9taXNlVmFsdWU6OlJlZmVyZW5jZSh0aGlzLCAqcHJvbWlzZSkpKSk7CisKKyAgLy8gNy4gUmV0dXJuIHByb21pc2UuCisgIHJldHVybiBwcm9taXNlLlBhc3MoKTsKK30KKworLy8gU2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9lbmNyeXB0ZWQtbWVkaWEvI2RvbS1tZWRpYWtleXNlc3Npb24tY2xvc2UuCitzY29wZWRfcHRyPE1lZGlhS2V5U2Vzc2lvbjo6Vm9pZFByb21pc2VWYWx1ZT4gTWVkaWFLZXlTZXNzaW9uOjpDbG9zZSgpIHsKKyAgc2NvcGVkX3B0cjxWb2lkUHJvbWlzZVZhbHVlPiBwcm9taXNlID0KKyAgICAgIHNjcmlwdF92YWx1ZV9mYWN0b3J5Xy0+Q3JlYXRlQmFzaWNQcm9taXNlPHZvaWQ+KCk7CisgIFZvaWRQcm9taXNlVmFsdWU6OlN0cm9uZ1JlZmVyZW5jZSBwcm9taXNlX3JlZmVyZW5jZSgqcHJvbWlzZSk7CisKKyAgLy8gMi4gSWYgc2Vzc2lvbiBpcyBjbG9zZWQsIHJldHVybiBhIHJlc29sdmVkIHByb21pc2UuCisgIGlmIChkcm1fc3lzdGVtX3Nlc3Npb25fLT5pc19jbG9zZWQoKSkgeworICAgIHByb21pc2VfcmVmZXJlbmNlLnZhbHVlKCkuUmVzb2x2ZSgpOworICAgIHJldHVybiBwcm9taXNlLlBhc3MoKTsKKyAgfQorCisgIC8vIDMuIElmIHNlc3Npb24ncyBjYWxsYWJsZSB2YWx1ZSBpcyBmYWxzZSwgcmV0dXJuIGEgcHJvbWlzZSByZWplY3RlZCB3aXRoCisgIC8vICAgIGFuIEludmFsaWRTdGF0ZUVycm9yLgorICBpZiAoIWNhbGxhYmxlXykgeworICAgIHByb21pc2VfcmVmZXJlbmNlLnZhbHVlKCkuUmVqZWN0KAorICAgICAgICBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbjo6a0ludmFsaWRTdGF0ZUVycikpOworICAgIHJldHVybiBwcm9taXNlLlBhc3MoKTsKKyAgfQorCisgIC8vIDUuMi4gVXNlIENETSB0byBjbG9zZSB0aGUga2V5IHNlc3Npb24gYXNzb2NpYXRlZCB3aXRoIHNlc3Npb24uCisgIGRybV9zeXN0ZW1fc2Vzc2lvbl8tPkNsb3NlKCk7CisKKyAgLy8gTGV0IHxNZWRpYUtleXN8IGtub3cgdGhhdCB0aGUgc2Vzc2lvbiBzaG91bGQgYmUgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0CisgIC8vIG9mIG9wZW4gc2Vzc2lvbnMuCisgIGNsb3NlZF9jYWxsYmFja18uUnVuKHRoaXMpOworCisgIC8vIDUuMy4xLiBSdW4gdGhlIFNlc3Npb24gQ2xvc2VkIGFsZ29yaXRobSBvbiB0aGUgc2Vzc2lvbi4KKyAgT25DbG9zZWQoKTsKKworICAvLyA1LjMuMi4gUmVzb2x2ZSBwcm9taXNlLgorICBwcm9taXNlX3JlZmVyZW5jZS52YWx1ZSgpLlJlc29sdmUoKTsKKyAgcmV0dXJuIHByb21pc2UuUGFzcygpOworfQorCisvLyBTZWUKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9lbmNyeXB0ZWQtbWVkaWEvI2RvbS1tZWRpYWtleXNlc3Npb24tZ2VuZXJhdGVyZXF1ZXN0Lgordm9pZCBNZWRpYUtleVNlc3Npb246Ok9uU2Vzc2lvblVwZGF0ZVJlcXVlc3RHZW5lcmF0ZWQoCisgICAgVm9pZFByb21pc2VWYWx1ZTo6UmVmZXJlbmNlKiBwcm9taXNlX3JlZmVyZW5jZSwgc2NvcGVkX2FycmF5PHVpbnQ4PiBtZXNzYWdlLAorICAgIGludCBtZXNzYWdlX3NpemUpIHsKKyAgTWVkaWFLZXlNZXNzYWdlRXZlbnRJbml0IG1lZGlhX2tleV9tZXNzYWdlX2V2ZW50X2luaXQ7CisgIC8vIDEwLjkuNC4gSWYgYSBsaWNlbnNlIHJlcXVlc3QgZm9yIHRoZSByZXF1ZXN0ZWQgbGljZW5zZSB0eXBlIGNhbiBiZQorICAvLyAgICAgICAgIGdlbmVyYXRlZCBiYXNlZCBvbiB0aGUgc2FuaXRpemVkIGluaXQgZGF0YToKKyAgLy8gMTAuOS40LjEuIExldCBtZXNzYWdlIGJlIGEgbGljZW5zZSByZXF1ZXN0IGZvciB0aGUgcmVxdWVzdGVkIGxpY2Vuc2UgdHlwZQorICAvLyAgICAgICAgICAgZ2VuZXJhdGVkIGJhc2VkIG9uIHRoZSBzYW5pdGl6ZWQgaW5pdCBkYXRhIGludGVycHJldGVkCisgIC8vICAgICAgICAgICBwZXIgaW5pdERhdGFUeXBlLgorICAvLyBPdGhlcndpc2U6CisgIC8vIDEwLjkuNC4xLiBMZXQgbWVzc2FnZSBiZSB0aGUgcmVxdWVzdCB0aGF0IG5lZWRzIHRvIGJlIHByb2Nlc3NlZCBiZWZvcmUKKyAgLy8gICAgICAgICAgIGEgbGljZW5zZSByZXF1ZXN0IHJlcXVlc3QgZm9yIHRoZSByZXF1ZXN0ZWQgbGljZW5zZSB0eXBlIGNhbiBiZQorICAvLyAgICAgICAgICAgZ2VuZXJhdGVkIGJhc2VkIG9uIHRoZSBzYW5pdGl6ZWQgaW5pdCBkYXRhLgorICBtZWRpYV9rZXlfbWVzc2FnZV9ldmVudF9pbml0LnNldF9tZXNzYWdlKG5ldyBBcnJheUJ1ZmZlcigKKyAgICAgIE5VTEwsIEFycmF5QnVmZmVyOjprRnJvbUhlYXAsIG1lc3NhZ2UuUGFzcygpLCBtZXNzYWdlX3NpemUpKTsKKyAgLy8gMTAuOS40LjIuIExldCBtZXNzYWdlIHR5cGUgcmVmbGVjdCB0aGUgdHlwZSBvZiBtZXNzYWdlLCBlaXRoZXIKKyAgLy8gICAgICAgICAgICJsaWNlbnNlLXJlcXVlc3QiIG9yICJpbmRpdmlkdWFsaXphdGlvbi1yZXF1ZXN0Ii4KKyAgLy8KKyAgLy8gVE9ETzogSW50cm9kdWNlIG1lc3NhZ2UgdHlwZSBwYXJhbWV0ZXIgdG8gfFNiRHJtU2Vzc2lvblVwZGF0ZVJlcXVlc3RGdW5jfAorICAvLyAgICAgICBhbmQgc3RvcCBwcmV0ZW5kaW5nIHRoYXQgYWxsIG1lc3NhZ2VzIGFyZSBsaWNlbnNlIHJlcXVlc3RzLgorICBtZWRpYV9rZXlfbWVzc2FnZV9ldmVudF9pbml0LnNldF9tZXNzYWdlX3R5cGUoCisgICAgICBrTWVkaWFLZXlNZXNzYWdlVHlwZUxpY2Vuc2VSZXF1ZXN0KTsKKworICAvLyAxMC4zLiBMZXQgdGhpcyBvYmplY3QncyBjYWxsYWJsZSB2YWx1ZSBiZSB0cnVlLgorICBjYWxsYWJsZV8gPSB0cnVlOworCisgIC8vIDEwLjQuIFJ1biB0aGUgUXVldWUgYSAibWVzc2FnZSIgRXZlbnQgYWxnb3JpdGhtIG9uIHRoZSBzZXNzaW9uLgorICAvLworICAvLyBUT0RPOiBJbXBsZW1lbnQgRXZlbnQuaXNUcnVzdGVkIGFzIHBlcgorICAvLyAgICAgICBodHRwczovL3d3dy53My5vcmcvVFIvZG9tLyNkb20tZXZlbnQtaXN0cnVzdGVkIGFuZCBzZXQgaXQgdG8gdHJ1ZS4KKyAgRGlzcGF0Y2hFdmVudCgKKyAgICAgIG5ldyBNZWRpYUtleU1lc3NhZ2VFdmVudCgibWVzc2FnZSIsIG1lZGlhX2tleV9tZXNzYWdlX2V2ZW50X2luaXQpKTsKKworICAvLyAxMC41LiBSZXNvbHZlIHByb21pc2UuCisgIC8vCisgIC8vIElmIHRoZSByZXF1ZXN0IHdhcyBnZW5lcmF0ZWQgc3BvbnRhbmVvdXNseSBieSB0aGUgdW5kZXJseWluZyBEUk0gc3lzdGVtLAorICAvLyB3ZSBzaG91bGRuJ3QgcmVzb2x2ZSB0aGUgcHJvbWlzZSByZXR1cm5lZCBieSB8R2VuZXJhdGVSZXF1ZXN0fC4gVGhlIHByb21pc2UKKyAgLy8gd2FzIHJlc29sdmVkIGluIHRoZSBmaXJzdCBpbnZvY2F0aW9uIG9mIHRoaXMgbWV0aG9kIGFuZCBub3cgaXMgc2ltcGx5CisgIC8vIGhhbmdpbmcgYXJvdW5kLgorICBpZiAoaW5pdGlhdGVkX2J5X2dlbmVyYXRlX3JlcXVlc3RfKSB7CisgICAgaW5pdGlhdGVkX2J5X2dlbmVyYXRlX3JlcXVlc3RfID0gZmFsc2U7CisgICAgcHJvbWlzZV9yZWZlcmVuY2UtPnZhbHVlKCkuUmVzb2x2ZSgpOworICB9Cit9CisKKy8vIFNlZQorLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2VuY3J5cHRlZC1tZWRpYS8jZG9tLW1lZGlha2V5c2Vzc2lvbi1nZW5lcmF0ZXJlcXVlc3QuCit2b2lkIE1lZGlhS2V5U2Vzc2lvbjo6T25TZXNzaW9uVXBkYXRlUmVxdWVzdERpZE5vdEdlbmVyYXRlKAorICAgIFZvaWRQcm9taXNlVmFsdWU6OlJlZmVyZW5jZSogcHJvbWlzZV9yZWZlcmVuY2UpIHsKKyAgLy8gMTAuMTAuMS4gSWYgYW55IG9mIHRoZSBwcmVjZWRpbmcgc3RlcHMgZmFpbGVkLCByZWplY3QgcHJvbWlzZSB3aXRoIGEgbmV3CisgIC8vICAgICAgICAgIERPTUV4Y2VwdGlvbiB3aG9zZSBuYW1lIGlzIHRoZSBhcHByb3ByaWF0ZSBlcnJvciBuYW1lLgorICAvLworICAvLyBUT0RPOiBJbnRyb2R1Y2UgU3RhcmJvYXJkIEFQSSB0aGF0IGFsbG93cyBDRE0gdG8gcHJvcGFnYXRlIGVycm9yIGNvZGVzLgorICBwcm9taXNlX3JlZmVyZW5jZS0+dmFsdWUoKS5SZWplY3QobmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb246OmtOb25lKSk7Cit9CisKKy8vIFNlZSBodHRwczovL3d3dy53My5vcmcvVFIvZW5jcnlwdGVkLW1lZGlhLyNkb20tbWVkaWFrZXlzZXNzaW9uLXVwZGF0ZS4KK3ZvaWQgTWVkaWFLZXlTZXNzaW9uOjpPblNlc3Npb25VcGRhdGVkKAorICAgIFZvaWRQcm9taXNlVmFsdWU6OlJlZmVyZW5jZSogcHJvbWlzZV9yZWZlcmVuY2UpIHsKKyAgLy8gOC4xLjEuIElmIHRoZSBzZXQgb2Yga2V5cyBrbm93biB0byB0aGUgQ0RNIGZvciB0aGlzIG9iamVjdCBjaGFuZ2VkIG9yCisgIC8vICAgICAgICB0aGUgc3RhdHVzIG9mIGFueSBrZXkocykgY2hhbmdlZCwgcnVuIHRoZSBVcGRhdGUgS2V5IFN0YXR1c2VzCisgIC8vICAgICAgICBhbGdvcml0aG0gb24gdGhlIHNlc3Npb24uCisgIC8vCisgIC8vIFRPRE86IEltcGxlbWVudCBrZXkgc3RhdHVzZXMuCisKKyAgLy8gOC4xLjIuIElmIHRoZSBleHBpcmF0aW9uIHRpbWUgZm9yIHRoZSBzZXNzaW9uIGNoYW5nZWQsIHJ1biB0aGUgVXBkYXRlCisgIC8vICAgICAgICBFeHBpcmF0aW9uIGFsZ29yaXRobSBvbiB0aGUgc2Vzc2lvbi4KKyAgLy8KKyAgLy8gVE9ETzogSW1wbGVtZW50IGV4cGlyYXRpb24uCisKKyAgLy8gOC4yLiBSZXNvbHZlIHByb21pc2UuCisgIHByb21pc2VfcmVmZXJlbmNlLT52YWx1ZSgpLlJlc29sdmUoKTsKK30KKworLy8gU2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9lbmNyeXB0ZWQtbWVkaWEvI2RvbS1tZWRpYWtleXNlc3Npb24tdXBkYXRlLgordm9pZCBNZWRpYUtleVNlc3Npb246Ok9uU2Vzc2lvbkRpZE5vdFVwZGF0ZSgKKyAgICBWb2lkUHJvbWlzZVZhbHVlOjpSZWZlcmVuY2UqIHByb21pc2VfcmVmZXJlbmNlKSB7CisgIC8vIDguMS4zLiBJZiBhbnkgb2YgdGhlIHByZWNlZGluZyBzdGVwcyBmYWlsZWQsIHJlamVjdCBwcm9taXNlIHdpdGggYSBuZXcKKyAgLy8gICAgICAgIERPTUV4Y2VwdGlvbiB3aG9zZSBuYW1lIGlzIHRoZSBhcHByb3ByaWF0ZSBlcnJvciBuYW1lLgorICAvLworICAvLyBUT0RPOiBJbnRyb2R1Y2UgU3RhcmJvYXJkIEFQSSB0aGF0IGFsbG93cyBDRE0gdG8gcHJvcGFnYXRlIGVycm9yIGNvZGVzLgorICBwcm9taXNlX3JlZmVyZW5jZS0+dmFsdWUoKS5SZWplY3QobmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb246OmtOb25lKSk7Cit9CisKKy8vIFNlZSBodHRwczovL3d3dy53My5vcmcvVFIvZW5jcnlwdGVkLW1lZGlhLyNzZXNzaW9uLWNsb3NlZC4KK3ZvaWQgTWVkaWFLZXlTZXNzaW9uOjpPbkNsb3NlZCgpIHsKKyAgLy8gMi4gUnVuIHRoZSBVcGRhdGUgS2V5IFN0YXR1c2VzIGFsZ29yaXRobSBvbiB0aGUgc2Vzc2lvbiwgcHJvdmlkaW5nIGFuIGVtcHR5CisgIC8vICAgIHNlcXVlbmNlLgorICAvLworICAvLyBUT0RPOiBJbXBsZW1lbnQga2V5IHN0YXR1c2VzLgorCisgIC8vIDMuIFJ1biB0aGUgVXBkYXRlIEV4cGlyYXRpb24gYWxnb3JpdGhtIG9uIHRoZSBzZXNzaW9uLCBwcm92aWRpbmcgTmFOLgorICAvLworICAvLyBUT0RPOiBJbXBsZW1lbnQgZXhwaXJhdGlvbi4KKworICAvLyA0LiBMZXQgcHJvbWlzZSBiZSB0aGUgY2xvc2VkIGF0dHJpYnV0ZSBvZiB0aGUgc2Vzc2lvbi4KKyAgLy8gNS4gUmVzb2x2ZSBwcm9taXNlLgorICBjbG9zZWRfcHJvbWlzZV9yZWZlcmVuY2VfLnZhbHVlKCkuUmVzb2x2ZSgpOworfQorCit9ICAvLyBuYW1lc3BhY2UgZW1lCit9ICAvLyBuYW1lc3BhY2UgZG9tCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9lbWUvbWVkaWFfa2V5X3Nlc3Npb24uaCBiL3NyYy9jb2JhbHQvZG9tL2VtZS9tZWRpYV9rZXlfc2Vzc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MTkzNjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2RvbS9lbWUvbWVkaWFfa2V5X3Nlc3Npb24uaApAQCAtMCwwICsxLDkxIEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaWZuZGVmIENPQkFMVF9ET01fRU1FX01FRElBX0tFWV9TRVNTSU9OX0hfCisjZGVmaW5lIENPQkFMVF9ET01fRU1FX01FRElBX0tFWV9TRVNTSU9OX0hfCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJiYXNlL2NhbGxiYWNrLmgiCisjaW5jbHVkZSAiYmFzZS9tZW1vcnkvd2Vha19wdHIuaCIKKyNpbmNsdWRlICJjb2JhbHQvZG9tL2J1ZmZlcl9zb3VyY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvZG9tL2V2ZW50X3RhcmdldC5oIgorI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL2RybV9zeXN0ZW0uaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Byb21pc2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF92YWx1ZV9mYWN0b3J5LmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGRvbSB7CituYW1lc3BhY2UgZW1lIHsKKworLy8gQSBzZXNzaW9uIHByb3ZpZGVzIGEgY29udGV4dCBmb3IgbWVzc2FnZSBleGNoYW5nZSB3aXRoIHRoZSBDRE0gYXMgYSByZXN1bHQKKy8vIG9mIHdoaWNoIGtleXMgYXJlIG1hZGUgYXZhaWxhYmxlIHRvIHRoZSBDRE0uCisvLyAgIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9lbmNyeXB0ZWQtbWVkaWEvI2tleS1zZXNzaW9uCisvLworLy8gQWxzbyBzZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL2VuY3J5cHRlZC1tZWRpYS8jbWVkaWFrZXlzZXNzaW9uLWludGVyZmFjZS4KK2NsYXNzIE1lZGlhS2V5U2Vzc2lvbiA6IHB1YmxpYyBFdmVudFRhcmdldCB7CisgcHVibGljOgorICB0eXBlZGVmIHNjcmlwdDo6U2NyaXB0VmFsdWU8c2NyaXB0OjpQcm9taXNlPHZvaWQ+ID4gVm9pZFByb21pc2VWYWx1ZTsKKyAgdHlwZWRlZiBiYXNlOjpDYWxsYmFjazx2b2lkKE1lZGlhS2V5U2Vzc2lvbiogc2Vzc2lvbik+IENsb3NlZENhbGxiYWNrOworCisgIC8vIEN1c3RvbSwgbm90IGluIGFueSBzcGVjLgorICBNZWRpYUtleVNlc3Npb24oc2NvcGVkX3B0cjxtZWRpYTo6RHJtU3lzdGVtOjpTZXNzaW9uPiBkcm1fc3lzdGVtX3Nlc3Npb24sCisgICAgICAgICAgICAgICAgICBzY3JpcHQ6OlNjcmlwdFZhbHVlRmFjdG9yeSogc2NyaXB0X3ZhbHVlX2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICBjb25zdCBDbG9zZWRDYWxsYmFjayYgY2xvc2VkX2NhbGxiYWNrKTsKKworICAvLyBXZWIgSURMOiBNZWRpYUtleVNlc3Npb24uCisgIHN0ZDo6c3RyaW5nIHNlc3Npb25faWQoKSBjb25zdDsKKyAgY29uc3QgVm9pZFByb21pc2VWYWx1ZSogY2xvc2VkKCkgY29uc3Q7CisgIGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRWYWx1ZSogb25tZXNzYWdlKCkgY29uc3Q7CisgIHZvaWQgc2V0X29ubWVzc2FnZShjb25zdCBFdmVudExpc3RlbmVyU2NyaXB0VmFsdWUmIGV2ZW50X2xpc3RlbmVyKTsKKyAgc2NvcGVkX3B0cjxWb2lkUHJvbWlzZVZhbHVlPiBHZW5lcmF0ZVJlcXVlc3QoCisgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaW5pdF9kYXRhX3R5cGUsIGNvbnN0IEJ1ZmZlclNvdXJjZSYgaW5pdF9kYXRhKTsKKyAgc2NvcGVkX3B0cjxWb2lkUHJvbWlzZVZhbHVlPiBVcGRhdGUoY29uc3QgQnVmZmVyU291cmNlJiByZXNwb25zZSk7CisgIHNjb3BlZF9wdHI8Vm9pZFByb21pc2VWYWx1ZT4gQ2xvc2UoKTsKKworICBERUZJTkVfV1JBUFBBQkxFX1RZUEUoTWVkaWFLZXlTZXNzaW9uKTsKKworIHByaXZhdGU6CisgIH5NZWRpYUtleVNlc3Npb24oKSBPVkVSUklERTsKKworICB2b2lkIE9uU2Vzc2lvblVwZGF0ZVJlcXVlc3RHZW5lcmF0ZWQoCisgICAgICBWb2lkUHJvbWlzZVZhbHVlOjpSZWZlcmVuY2UqIHByb21pc2VfcmVmZXJlbmNlLAorICAgICAgc2NvcGVkX2FycmF5PHVpbnQ4PiBtZXNzYWdlLCBpbnQgbWVzc2FnZV9zaXplKTsKKyAgdm9pZCBPblNlc3Npb25VcGRhdGVSZXF1ZXN0RGlkTm90R2VuZXJhdGUoCisgICAgICBWb2lkUHJvbWlzZVZhbHVlOjpSZWZlcmVuY2UqIHByb21pc2VfcmVmZXJlbmNlKTsKKyAgdm9pZCBPblNlc3Npb25VcGRhdGVkKFZvaWRQcm9taXNlVmFsdWU6OlJlZmVyZW5jZSogcHJvbWlzZV9yZWZlcmVuY2UpOworICB2b2lkIE9uU2Vzc2lvbkRpZE5vdFVwZGF0ZShWb2lkUHJvbWlzZVZhbHVlOjpSZWZlcmVuY2UqIHByb21pc2VfcmVmZXJlbmNlKTsKKyAgdm9pZCBPbkNsb3NlZCgpOworCisgIHNjb3BlZF9wdHI8bWVkaWE6OkRybVN5c3RlbTo6U2Vzc2lvbj4gZHJtX3N5c3RlbV9zZXNzaW9uXzsKKyAgc2NyaXB0OjpTY3JpcHRWYWx1ZUZhY3RvcnkqIGNvbnN0IHNjcmlwdF92YWx1ZV9mYWN0b3J5XzsKKyAgYm9vbCB1bmluaXRpYWxpemVkXzsKKyAgYm9vbCBjYWxsYWJsZV87CisKKyAgLy8gVE9ETzogUmVtb3ZlIHxjbG9zZWRfY2FsbGJhY2tffCBhbmQgY2hhbmdlIGNhbGwgc2l0ZXMgdG8gdXNlIGNsb3NlZCgpCisgIC8vICAgICAgIHByb21pc2UgaW5zdGVhZCwgb25jZSBDb2JhbHQgc3dpdGNoZXMgdG8gbmF0aXZlIFNwaWRlck1vbmtleQorICAvLyAgICAgICBwcm9taXNlcy4KKyAgY29uc3QgQ2xvc2VkQ2FsbGJhY2sgY2xvc2VkX2NhbGxiYWNrXzsKKyAgY29uc3QgVm9pZFByb21pc2VWYWx1ZTo6UmVmZXJlbmNlIGNsb3NlZF9wcm9taXNlX3JlZmVyZW5jZV87CisKKyAgYm9vbCBpbml0aWF0ZWRfYnlfZ2VuZXJhdGVfcmVxdWVzdF87CisKKyAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKE1lZGlhS2V5U2Vzc2lvbik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgZW1lCit9ICAvLyBuYW1lc3BhY2UgZG9tCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKyNlbmRpZiAgLy8gQ09CQUxUX0RPTV9FTUVfTUVESUFfS0VZX1NFU1NJT05fSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2VtZS9tZWRpYV9rZXlfc2Vzc2lvbi5pZGwgYi9zcmMvY29iYWx0L2RvbS9lbWUvbWVkaWFfa2V5X3Nlc3Npb24uaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NThlMjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2RvbS9lbWUvbWVkaWFfa2V5X3Nlc3Npb24uaWRsCkBAIC0wLDAgKzEsMzUgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9lbmNyeXB0ZWQtbWVkaWEvI21lZGlha2V5c2Vzc2lvbi1pbnRlcmZhY2UKKworaW50ZXJmYWNlIE1lZGlhS2V5U2Vzc2lvbiA6IEV2ZW50VGFyZ2V0IHsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyBzZXNzaW9uSWQ7CisgIC8vIFRPRE86IEltcGxlbWVudCB8ZXhwaXJhdGlvbnwuCisgIC8vIHJlYWRvbmx5IGF0dHJpYnV0ZSB1bnJlc3RyaWN0ZWQgZG91YmxlIGV4cGlyYXRpb247CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBQcm9taXNlPHZvaWQ+IGNsb3NlZDsKKyAgLy8gVE9ETzogSW1wbGVtZW50IHxrZXlTdGF0dXNlc3wuCisgIC8vIHJlYWRvbmx5IGF0dHJpYnV0ZSBNZWRpYUtleVN0YXR1c01hcCBrZXlTdGF0dXNlczsKKyAgLy8gVE9ETzogSW1wbGVtZW50IHxvbmtleXN0YXR1c2VzY2hhbmdlfC4KKyAgLy8gYXR0cmlidXRlIEV2ZW50SGFuZGxlciBvbmtleXN0YXR1c2VzY2hhbmdlOworICBhdHRyaWJ1dGUgRXZlbnRIYW5kbGVyIG9ubWVzc2FnZTsKKyAgUHJvbWlzZTx2b2lkPiBnZW5lcmF0ZVJlcXVlc3QoRE9NU3RyaW5nIGluaXREYXRhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyU291cmNlIGluaXREYXRhKTsKKyAgLy8gVE9ETzogVHJpdmlhbGx5IGltcGxlbWVudCBwZXJzaXN0ZW50IHNlc3Npb25zLgorICAvLyBQcm9taXNlPGJvb2xlYW4+IGxvYWQoRE9NU3RyaW5nIHNlc3Npb25JZCk7CisgIFByb21pc2U8dm9pZD4gdXBkYXRlKEJ1ZmZlclNvdXJjZSByZXNwb25zZSk7CisgIFByb21pc2U8dm9pZD4gY2xvc2UoKTsKKyAgLy8gVE9ETzogSW1wbGVtZW50IHxyZW1vdmV8LgorICAvLyBQcm9taXNlPHZvaWQ+IHJlbW92ZSgpOworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9zeXN0ZW1fbWVkaWFfY2FwYWJpbGl0eS5pZGwgYi9zcmMvY29iYWx0L2RvbS9lbWUvbWVkaWFfa2V5X3Nlc3Npb25fdHlwZS5pZGwKc2ltaWxhcml0eSBpbmRleCA3NCUKY29weSBmcm9tIHNyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9zeXN0ZW1fbWVkaWFfY2FwYWJpbGl0eS5pZGwKY29weSB0byBzcmMvY29iYWx0L2RvbS9lbWUvbWVkaWFfa2V5X3Nlc3Npb25fdHlwZS5pZGwKaW5kZXggNTFlMWYyZS4uZWI4MmMzNSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vbWVkaWFfa2V5X3N5c3RlbV9tZWRpYV9jYXBhYmlsaXR5LmlkbAorKysgYi9zcmMvY29iYWx0L2RvbS9lbWUvbWVkaWFfa2V5X3Nlc3Npb25fdHlwZS5pZGwKQEAgLTEyLDkgKzEyLDEwIEBACiAvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTYvQ1ItZW5jcnlwdGVkLW1lZGlhLTIwMTYwNzA1LyNtZWRpYWtleXN5c3RlbW1lZGlhY2FwYWJpbGl0eS1kaWN0aW9uYXJ5CisvLyBodHRwczovL3d3dy53My5vcmcvVFIvZW5jcnlwdGVkLW1lZGlhLyNpZGwtZGVmLW1lZGlha2V5c2Vzc2lvbnR5cGUKIAotZGljdGlvbmFyeSBNZWRpYUtleVN5c3RlbU1lZGlhQ2FwYWJpbGl0eSB7Ci0gIERPTVN0cmluZyBjb250ZW50VHlwZSA9ICIiOwotICBET01TdHJpbmcgcm9idXN0bmVzcyA9ICIiOworZW51bSBNZWRpYUtleVNlc3Npb25UeXBlIHsKKyAgInRlbXBvcmFyeSIsCisgIC8vIFRPRE86IFRyaXZpYWxseSBpbXBsZW1lbnQgcGVyc2lzdGVudCBzZXNzaW9ucy4KKyAgLy8gInBlcnNpc3RlbnQtbGljZW5zZSIKIH07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9lbWUvbWVkaWFfa2V5X3N5c3RlbV9hY2Nlc3MuY2MgYi9zcmMvY29iYWx0L2RvbS9lbWUvbWVkaWFfa2V5X3N5c3RlbV9hY2Nlc3MuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRjOGYyYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZG9tL2VtZS9tZWRpYV9rZXlfc3lzdGVtX2FjY2Vzcy5jYwpAQCAtMCwwICsxLDUzIEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiY29iYWx0L2RvbS9lbWUvbWVkaWFfa2V5X3N5c3RlbV9hY2Nlc3MuaCIKKworI2luY2x1ZGUgImNvYmFsdC9kb20vZW1lL21lZGlhX2tleXMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF92YWx1ZV9mYWN0b3J5LmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGRvbSB7CituYW1lc3BhY2UgZW1lIHsKKworTWVkaWFLZXlTeXN0ZW1BY2Nlc3M6Ok1lZGlhS2V5U3lzdGVtQWNjZXNzKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlfc3lzdGVtLAorICAgIGNvbnN0IE1lZGlhS2V5U3lzdGVtQ29uZmlndXJhdGlvbiYgY29uZmlndXJhdGlvbiwKKyAgICBzY3JpcHQ6OlNjcmlwdFZhbHVlRmFjdG9yeSogc2NyaXB0X3ZhbHVlX2ZhY3RvcnkpCisgICAgOiBrZXlfc3lzdGVtXyhrZXlfc3lzdGVtKSwKKyAgICAgIGNvbmZpZ3VyYXRpb25fKGNvbmZpZ3VyYXRpb24pLAorICAgICAgc2NyaXB0X3ZhbHVlX2ZhY3RvcnlfKHNjcmlwdF92YWx1ZV9mYWN0b3J5KSB7fQorCisvLyBTZWUKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9lbmNyeXB0ZWQtbWVkaWEvI2RvbS1tZWRpYWtleXN5c3RlbWFjY2Vzcy1jcmVhdGVtZWRpYWtleXMuCitzY29wZWRfcHRyPE1lZGlhS2V5U3lzdGVtQWNjZXNzOjpJbnRlcmZhY2VQcm9taXNlVmFsdWU+CitNZWRpYUtleVN5c3RlbUFjY2Vzczo6Q3JlYXRlTWVkaWFLZXlzKCkgY29uc3QgeworICAvLyAxLiBMZXQgcHJvbWlzZSBiZSBhIG5ldyBwcm9taXNlLgorICBzY29wZWRfcHRyPEludGVyZmFjZVByb21pc2VWYWx1ZT4gcHJvbWlzZSA9CisgICAgICBzY3JpcHRfdmFsdWVfZmFjdG9yeV8KKyAgICAgICAgICAtPkNyZWF0ZUludGVyZmFjZVByb21pc2U8c2NvcGVkX3JlZnB0cjxNZWRpYUtleXM+ID4oKTsKKyAgSW50ZXJmYWNlUHJvbWlzZVZhbHVlOjpTdHJvbmdSZWZlcmVuY2UgcHJvbWlzZV9yZWZlcmVuY2UoKnByb21pc2UpOworCisgIC8vIDIuMTAuIExldCBtZWRpYSBrZXlzIGJlIGEgbmV3IE1lZGlhS2V5cyBvYmplY3QuCisgIHNjb3BlZF9yZWZwdHI8TWVkaWFLZXlzPiBtZWRpYV9rZXlzKAorICAgICAgbmV3IE1lZGlhS2V5cyhrZXlfc3lzdGVtXywgc2NyaXB0X3ZhbHVlX2ZhY3RvcnlfKSk7CisKKyAgLy8gMi4xMS4gUmVzb2x2ZSBwcm9taXNlIHdpdGggbWVkaWEga2V5cy4KKyAgcHJvbWlzZV9yZWZlcmVuY2UudmFsdWUoKS5SZXNvbHZlKG1lZGlhX2tleXMpOworICByZXR1cm4gcHJvbWlzZS5QYXNzKCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBlbWUKK30gIC8vIG5hbWVzcGFjZSBkb20KK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2VtZS9tZWRpYV9rZXlfc3lzdGVtX2FjY2Vzcy5oIGIvc3JjL2NvYmFsdC9kb20vZW1lL21lZGlhX2tleV9zeXN0ZW1fYWNjZXNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJmM2ZiMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZG9tL2VtZS9tZWRpYV9rZXlfc3lzdGVtX2FjY2Vzcy5oCkBAIC0wLDAgKzEsNjQgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpZm5kZWYgQ09CQUxUX0RPTV9FTUVfTUVESUFfS0VZX1NZU1RFTV9BQ0NFU1NfSF8KKyNkZWZpbmUgQ09CQUxUX0RPTV9FTUVfTUVESUFfS0VZX1NZU1RFTV9BQ0NFU1NfSF8KKworI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgImNvYmFsdC9kb20vZW1lL21lZGlhX2tleV9zeXN0ZW1fY29uZmlndXJhdGlvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvcHJvbWlzZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlX2ZhY3RvcnkuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBkb20geworbmFtZXNwYWNlIGVtZSB7CisKKy8vIFByb3ZpZGVzIGFjY2VzcyB0byBhIGtleSBzeXN0ZW0uCisvLyAgIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9lbmNyeXB0ZWQtbWVkaWEvI21lZGlha2V5c3lzdGVtYWNjZXNzLWludGVyZmFjZQorY2xhc3MgTWVkaWFLZXlTeXN0ZW1BY2Nlc3MgOiBwdWJsaWMgc2NyaXB0OjpXcmFwcGFibGUgeworIHB1YmxpYzoKKyAgdHlwZWRlZiBzY3JpcHQ6OlNjcmlwdFZhbHVlPHNjcmlwdDo6UHJvbWlzZTwKKyAgICAgIHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+ID4gPiBJbnRlcmZhY2VQcm9taXNlVmFsdWU7CisKKyAgLy8gQ3VzdG9tLCBub3QgaW4gYW55IHNwZWMuCisgIE1lZGlhS2V5U3lzdGVtQWNjZXNzKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlfc3lzdGVtLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZWRpYUtleVN5c3RlbUNvbmZpZ3VyYXRpb24mIGNvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdDo6U2NyaXB0VmFsdWVGYWN0b3J5KiBzY3JpcHRfdmFsdWVfZmFjdG9yeSk7CisKKyAgLy8gV2ViIEFQSTogTWVkaWFLZXlTeXN0ZW1BY2Nlc3MuCisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlfc3lzdGVtKCkgY29uc3QgeyByZXR1cm4ga2V5X3N5c3RlbV87IH0KKyAgY29uc3QgTWVkaWFLZXlTeXN0ZW1Db25maWd1cmF0aW9uJiBHZXRDb25maWd1cmF0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBjb25maWd1cmF0aW9uXzsKKyAgfQorICBzY29wZWRfcHRyPEludGVyZmFjZVByb21pc2VWYWx1ZT4gQ3JlYXRlTWVkaWFLZXlzKCkgY29uc3Q7CisKKyAgREVGSU5FX1dSQVBQQUJMRV9UWVBFKE1lZGlhS2V5U3lzdGVtQWNjZXNzKTsKKworIHByaXZhdGU6CisgIH5NZWRpYUtleVN5c3RlbUFjY2VzcygpIE9WRVJSSURFIHt9CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcga2V5X3N5c3RlbV87CisgIGNvbnN0IE1lZGlhS2V5U3lzdGVtQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uXzsKKyAgc2NyaXB0OjpTY3JpcHRWYWx1ZUZhY3RvcnkqIHNjcmlwdF92YWx1ZV9mYWN0b3J5XzsKKworICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oTWVkaWFLZXlTeXN0ZW1BY2Nlc3MpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGVtZQorfSAgLy8gbmFtZXNwYWNlIGRvbQorfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorCisjZW5kaWYgIC8vIENPQkFMVF9ET01fRU1FX01FRElBX0tFWV9TWVNURU1fQUNDRVNTX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfc3lzdGVtX2FjY2Vzcy5pZGwgYi9zcmMvY29iYWx0L2RvbS9lbWUvbWVkaWFfa2V5X3N5c3RlbV9hY2Nlc3MuaWRsCnNpbWlsYXJpdHkgaW5kZXggODIlCnJlbmFtZSBmcm9tIHNyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9zeXN0ZW1fYWNjZXNzLmlkbApyZW5hbWUgdG8gc3JjL2NvYmFsdC9kb20vZW1lL21lZGlhX2tleV9zeXN0ZW1fYWNjZXNzLmlkbAppbmRleCAxNWY3MjEwLi5jOGQ5OWQyIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfc3lzdGVtX2FjY2Vzcy5pZGwKKysrIGIvc3JjL2NvYmFsdC9kb20vZW1lL21lZGlhX2tleV9zeXN0ZW1fYWNjZXNzLmlkbApAQCAtMTIsMTMgKzEyLDcgQEAKIC8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAxNi9DUi1lbmNyeXB0ZWQtbWVkaWEtMjAxNjA3MDUvI21lZGlha2V5c3lzdGVtYWNjZXNzLWludGVyZmFjZQotCi1lbnVtIE1lZGlhS2V5c1JlcXVpcmVtZW50IHsKLSAgInJlcXVpcmVkIiwKLSAgIm9wdGlvbmFsIiwKLSAgIm5vdC1hbGxvd2VkIgotfTsKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9lbmNyeXB0ZWQtbWVkaWEvI21lZGlha2V5c3lzdGVtYWNjZXNzLWludGVyZmFjZQogCiBpbnRlcmZhY2UgTWVkaWFLZXlTeXN0ZW1BY2Nlc3MgewogICByZWFkb25seSBhdHRyaWJ1dGUgRE9NU3RyaW5nIGtleVN5c3RlbTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2VtZS9tZWRpYV9rZXlfc3lzdGVtX2NvbmZpZ3VyYXRpb24uaWRsIGIvc3JjL2NvYmFsdC9kb20vZW1lL21lZGlhX2tleV9zeXN0ZW1fY29uZmlndXJhdGlvbi5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM1MzI4NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZG9tL2VtZS9tZWRpYV9rZXlfc3lzdGVtX2NvbmZpZ3VyYXRpb24uaWRsCkBAIC0wLDAgKzEsMjggQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9lbmNyeXB0ZWQtbWVkaWEvI21lZGlha2V5c3lzdGVtY29uZmlndXJhdGlvbi1kaWN0aW9uYXJ5CisKKy8vIFRPRE86IEltcGxlbWVudCBkZWZhdWx0IHZhbHVlcyBmb3Igc2VxdWVuY2UgdHlwZXMuCitkaWN0aW9uYXJ5IE1lZGlhS2V5U3lzdGVtQ29uZmlndXJhdGlvbiB7CisgIERPTVN0cmluZyBsYWJlbCA9ICIiOworICBzZXF1ZW5jZTxET01TdHJpbmc+IGluaXREYXRhVHlwZXMgLyo9IFtdKi87CisgIHNlcXVlbmNlPE1lZGlhS2V5U3lzdGVtTWVkaWFDYXBhYmlsaXR5PiBhdWRpb0NhcGFiaWxpdGllcyAvKj0gW10qLzsKKyAgc2VxdWVuY2U8TWVkaWFLZXlTeXN0ZW1NZWRpYUNhcGFiaWxpdHk+IHZpZGVvQ2FwYWJpbGl0aWVzIC8qPSBbXSovOworICAvLyBUT0RPOiBJbXBsZW1lbnQgZGlzdGluY3RpdmUgaWRlbnRpZmllcnMuCisgIC8vIE1lZGlhS2V5c1JlcXVpcmVtZW50IGRpc3RpbmN0aXZlSWRlbnRpZmllciA9ICJvcHRpb25hbCI7CisgIC8vIFRPRE86IFRyaXZpYWxseSBpbXBsZW1lbnQgcGVyc2lzdGVudCBzZXNzaW9ucy4KKyAgLy8gTWVkaWFLZXlzUmVxdWlyZW1lbnQgcGVyc2lzdGVudFN0YXRlID0gIm9wdGlvbmFsIjsKKyAgLy8gc2VxdWVuY2U8RE9NU3RyaW5nPiBzZXNzaW9uVHlwZXM7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vbWVkaWFfa2V5X3N5c3RlbV9tZWRpYV9jYXBhYmlsaXR5LmlkbCBiL3NyYy9jb2JhbHQvZG9tL2VtZS9tZWRpYV9rZXlfc3lzdGVtX21lZGlhX2NhcGFiaWxpdHkuaWRsCnNpbWlsYXJpdHkgaW5kZXggNzMlCmNvcHkgZnJvbSBzcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfc3lzdGVtX21lZGlhX2NhcGFiaWxpdHkuaWRsCmNvcHkgdG8gc3JjL2NvYmFsdC9kb20vZW1lL21lZGlhX2tleV9zeXN0ZW1fbWVkaWFfY2FwYWJpbGl0eS5pZGwKaW5kZXggNTFlMWYyZS4uZjc4MjEwZiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vbWVkaWFfa2V5X3N5c3RlbV9tZWRpYV9jYXBhYmlsaXR5LmlkbAorKysgYi9zcmMvY29iYWx0L2RvbS9lbWUvbWVkaWFfa2V5X3N5c3RlbV9tZWRpYV9jYXBhYmlsaXR5LmlkbApAQCAtMTIsOSArMTIsMTEgQEAKIC8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAxNi9DUi1lbmNyeXB0ZWQtbWVkaWEtMjAxNjA3MDUvI21lZGlha2V5c3lzdGVtbWVkaWFjYXBhYmlsaXR5LWRpY3Rpb25hcnkKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9lbmNyeXB0ZWQtbWVkaWEvI21lZGlha2V5c3lzdGVtbWVkaWFjYXBhYmlsaXR5LWRpY3Rpb25hcnkKIAogZGljdGlvbmFyeSBNZWRpYUtleVN5c3RlbU1lZGlhQ2FwYWJpbGl0eSB7CiAgIERPTVN0cmluZyBjb250ZW50VHlwZSA9ICIiOwotICBET01TdHJpbmcgcm9idXN0bmVzcyA9ICIiOworICAvLyBUT0RPOiBJbXBsZW1lbnQgcm9idXN0bmVzcyBhcyBwZXIKKyAgLy8gICAgICAgaHR0cHM6Ly93d3cudzMub3JnL1RSL2VuY3J5cHRlZC1tZWRpYS8jZG9tLW1lZGlha2V5c3lzdGVtbWVkaWFjYXBhYmlsaXR5LXJvYnVzdG5lc3MuCisgIC8vIERPTVN0cmluZyByb2J1c3RuZXNzID0gIiI7CiB9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vZW1lL21lZGlhX2tleXMuY2MgYi9zcmMvY29iYWx0L2RvbS9lbWUvbWVkaWFfa2V5cy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjFkNDRkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9kb20vZW1lL21lZGlhX2tleXMuY2MKQEAgLTAsMCArMSw2MCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImNvYmFsdC9kb20vZW1lL21lZGlhX2tleXMuaCIKKworI2luY2x1ZGUgImJhc2UvYmluZC5oIgorI2luY2x1ZGUgImNvYmFsdC9kb20vZG9tX2V4Y2VwdGlvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9kb20vZW1lL21lZGlhX2tleV9zZXNzaW9uLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGRvbSB7CituYW1lc3BhY2UgZW1lIHsKKworTWVkaWFLZXlzOjpNZWRpYUtleXMoY29uc3Qgc3RkOjpzdHJpbmcmIGtleV9zeXN0ZW0sCisgICAgICAgICAgICAgICAgICAgICBzY3JpcHQ6OlNjcmlwdFZhbHVlRmFjdG9yeSogc2NyaXB0X3ZhbHVlX2ZhY3RvcnkpCisgICAgOiBzY3JpcHRfdmFsdWVfZmFjdG9yeV8oc2NyaXB0X3ZhbHVlX2ZhY3RvcnkpLAorICAgICAgZHJtX3N5c3RlbV8obmV3IG1lZGlhOjpEcm1TeXN0ZW0oa2V5X3N5c3RlbS5jX3N0cigpKSkge30KKworLy8gU2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9lbmNyeXB0ZWQtbWVkaWEvI2RvbS1tZWRpYWtleXMtY3JlYXRlc2Vzc2lvbi4KK3Njb3BlZF9yZWZwdHI8TWVkaWFLZXlTZXNzaW9uPiBNZWRpYUtleXM6OkNyZWF0ZVNlc3Npb24oCisgICAgTWVkaWFLZXlTZXNzaW9uVHlwZSBzZXNzaW9uX3R5cGUsIHNjcmlwdDo6RXhjZXB0aW9uU3RhdGUqIGV4Y2VwdGlvbl9zdGF0ZSkgeworICAvLyAxLiBJZiB0aGlzIG9iamVjdCdzIHN1cHBvcnRlZCBzZXNzaW9uIHR5cGVzIHZhbHVlIGRvZXMgbm90IGNvbnRhaW4KKyAgLy8gICAgc2Vzc2lvblR5cGUsIHRocm93IGEgTm90U3VwcG9ydGVkRXJyb3IuCisgIGlmIChzZXNzaW9uX3R5cGUgIT0ga01lZGlhS2V5U2Vzc2lvblR5cGVUZW1wb3JhcnkpIHsKKyAgICBET01FeGNlcHRpb246OlJhaXNlKERPTUV4Y2VwdGlvbjo6a05vdFN1cHBvcnRlZEVyciwgZXhjZXB0aW9uX3N0YXRlKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIC8vIDMuIExldCBzZXNzaW9uIGJlIGEgbmV3IE1lZGlhS2V5U2Vzc2lvbiBvYmplY3QuCisgIHNjb3BlZF9yZWZwdHI8TWVkaWFLZXlTZXNzaW9uPiBzZXNzaW9uKG5ldyBNZWRpYUtleVNlc3Npb24oCisgICAgICBkcm1fc3lzdGVtXy0+Q3JlYXRlU2Vzc2lvbigpLCBzY3JpcHRfdmFsdWVfZmFjdG9yeV8sCisgICAgICBiYXNlOjpCaW5kKCZNZWRpYUtleXM6Ok9uU2Vzc2lvbkNsb3NlZCwgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpKTsKKyAgb3Blbl9zZXNzaW9uc18ucHVzaF9iYWNrKHNlc3Npb24pOworICByZXR1cm4gc2Vzc2lvbjsKK30KKwordm9pZCBNZWRpYUtleXM6Ok9uU2Vzc2lvbkNsb3NlZChNZWRpYUtleVNlc3Npb24qIHNlc3Npb24pIHsKKyAgLy8gRXJhc2UtcmVtb3ZlIGlkaW9tLCBzZWUKKyAgLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRXJhc2UlRTIlODAlOTNyZW1vdmVfaWRpb20uCisgIG9wZW5fc2Vzc2lvbnNfLmVyYXNlKAorICAgICAgc3RkOjpyZW1vdmUob3Blbl9zZXNzaW9uc18uYmVnaW4oKSwgb3Blbl9zZXNzaW9uc18uZW5kKCksIHNlc3Npb24pLAorICAgICAgb3Blbl9zZXNzaW9uc18uZW5kKCkpOworfQorCitNZWRpYUtleXM6On5NZWRpYUtleXMoKSB7fQorCit9ICAvLyBuYW1lc3BhY2UgZW1lCit9ICAvLyBuYW1lc3BhY2UgZG9tCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9lbWUvbWVkaWFfa2V5cy5oIGIvc3JjL2NvYmFsdC9kb20vZW1lL21lZGlhX2tleXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjAxM2RmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9kb20vZW1lL21lZGlhX2tleXMuaApAQCAtMCwwICsxLDc3IEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaWZuZGVmIENPQkFMVF9ET01fRU1FX01FRElBX0tFWVNfSF8KKyNkZWZpbmUgQ09CQUxUX0RPTV9FTUVfTUVESUFfS0VZU19IXworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCisjaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oIgorI2luY2x1ZGUgImNvYmFsdC9kb20vYnVmZmVyX3NvdXJjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9kb20vZW1lL21lZGlhX2tleV9zZXNzaW9uLmgiCisjaW5jbHVkZSAiY29iYWx0L2RvbS9lbWUvbWVkaWFfa2V5X3Nlc3Npb25fdHlwZS5oIgorI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL2RybV9zeXN0ZW0uaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF92YWx1ZV9mYWN0b3J5LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgZG9tIHsKK25hbWVzcGFjZSBlbWUgeworCisvLyBSZXByZXNlbnRzIGEgc2V0IG9mIGtleXMgdGhhdCBhbiBhc3NvY2lhdGVkIEhUTUxNZWRpYUVsZW1lbnQgY2FuIHVzZQorLy8gZm9yIGRlY3J5cHRpb24gb2YgbWVkaWEgZGF0YSBkdXJpbmcgcGxheWJhY2suCisvLyAgIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9lbmNyeXB0ZWQtbWVkaWEvI21lZGlha2V5cy1pbnRlcmZhY2UKK2NsYXNzIE1lZGlhS2V5cyA6IHB1YmxpYyBzY3JpcHQ6OldyYXBwYWJsZSB7CisgcHVibGljOgorICAvLyBDdXN0b20sIG5vdCBpbiBhbnkgc3BlYy4KKworICBNZWRpYUtleXMoY29uc3Qgc3RkOjpzdHJpbmcmIGtleV9zeXN0ZW0sCisgICAgICAgICAgICBzY3JpcHQ6OlNjcmlwdFZhbHVlRmFjdG9yeSogc2NyaXB0X3ZhbHVlX2ZhY3RvcnkpOworCisgIG1lZGlhOjpEcm1TeXN0ZW0qIGRybV9zeXN0ZW0oKSBjb25zdCB7IHJldHVybiBkcm1fc3lzdGVtXy5nZXQoKTsgfQorCisgIC8vIFdlYiBBUEk6IE1lZGlhS2V5cy4KKworICBzY29wZWRfcmVmcHRyPE1lZGlhS2V5U2Vzc2lvbj4gQ3JlYXRlU2Vzc2lvbigKKyAgICAgIE1lZGlhS2V5U2Vzc2lvblR5cGUgc2Vzc2lvbl90eXBlLAorICAgICAgc2NyaXB0OjpFeGNlcHRpb25TdGF0ZSogZXhjZXB0aW9uX3N0YXRlKTsKKworICBERUZJTkVfV1JBUFBBQkxFX1RZUEUoTWVkaWFLZXlzKTsKKworIHByaXZhdGU6CisgIH5NZWRpYUtleXMoKSBPVkVSUklERTsKKworICB2b2lkIE9uU2Vzc2lvbkNsb3NlZChNZWRpYUtleVNlc3Npb24qIHNlc3Npb24pOworCisgIHNjcmlwdDo6U2NyaXB0VmFsdWVGYWN0b3J5KiBzY3JpcHRfdmFsdWVfZmFjdG9yeV87CisgIHNjb3BlZF9wdHI8bWVkaWE6OkRybVN5c3RlbT4gZHJtX3N5c3RlbV87CisKKyAgLy8gQSBNZWRpYUtleVNlc3Npb24gb2JqZWN0IHNoYWxsIG5vdCBiZSBkZXN0cm95ZWQgYW5kIHNoYWxsIGNvbnRpbnVlCisgIC8vIHRvIHJlY2VpdmUgZXZlbnRzIGlmIGl0IGlzIG5vdCBjbG9zZWQgYW5kIHRoZSBNZWRpYUtleXMgb2JqZWN0IHRoYXQgY3JlYXRlZAorICAvLyBpdCByZW1haW5zIGFjY2Vzc2libGUuCisgIC8vICAgaHR0cHM6Ly93d3cudzMub3JnL1RSL2VuY3J5cHRlZC1tZWRpYS8jbWVkaWFrZXlzZXNzaW9uLWludGVyZmFjZQorICAvLworICAvLyBOdW1iZXIgb2Ygc2Vzc2lvbnMgaXMgZXhwZWN0ZWQgdG8gYmUgdmVyeSBzbWFsbCwgdHlwaWNhbGx5IG9uZS4KKyAgc3RkOjp2ZWN0b3I8c2NvcGVkX3JlZnB0cjxNZWRpYUtleVNlc3Npb24+ID4gb3Blbl9zZXNzaW9uc187CisKKyAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKE1lZGlhS2V5cyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgZW1lCit9ICAvLyBuYW1lc3BhY2UgZG9tCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKyNlbmRpZiAgLy8gQ09CQUxUX0RPTV9FTUVfTUVESUFfS0VZU19IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vbWVkaWFfa2V5cy5pZGwgYi9zcmMvY29iYWx0L2RvbS9lbWUvbWVkaWFfa2V5cy5pZGwKc2ltaWxhcml0eSBpbmRleCA2NSUKcmVuYW1lIGZyb20gc3JjL2NvYmFsdC9kb20vbWVkaWFfa2V5cy5pZGwKcmVuYW1lIHRvIHNyYy9jb2JhbHQvZG9tL2VtZS9tZWRpYV9rZXlzLmlkbAppbmRleCA0YzRhYTFiLi5mYzFhMzVmIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlzLmlkbAorKysgYi9zcmMvY29iYWx0L2RvbS9lbWUvbWVkaWFfa2V5cy5pZGwKQEAgLTEyLDE1ICsxMiwxMSBAQAogLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKLS8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDE2L0NSLWVuY3J5cHRlZC1tZWRpYS0yMDE2MDcwNS8jbWVkaWFrZXlzLWludGVyZmFjZQotCi1lbnVtIE1lZGlhS2V5U2Vzc2lvblR5cGUgewotICAidGVtcG9yYXJ5IiwKLSAgInBlcnNpc3RlbnQtdXNhZ2UtcmVjb3JkIiwKLSAgInBlcnNpc3RlbnQtbGljZW5zZSIKLX07CisvLyBodHRwczovL3d3dy53My5vcmcvVFIvZW5jcnlwdGVkLW1lZGlhLyNtZWRpYWtleXMtaW50ZXJmYWNlCiAKIGludGVyZmFjZSBNZWRpYUtleXMgewotICBNZWRpYUtleVNlc3Npb24gY3JlYXRlU2Vzc2lvbihvcHRpb25hbCBNZWRpYUtleVNlc3Npb25UeXBlIHNlc3Npb25UeXBlID0gInRlbXBvcmFyeSIpOwotICBQcm9taXNlPGJvb2xlYW4+IHNldFNlcnZlckNlcnRpZmljYXRlKEJ1ZmZlclNvdXJjZSBzZXJ2ZXJDZXJ0aWZpY2F0ZSk7CisgIFtSYWlzZXNFeGNlcHRpb25dIE1lZGlhS2V5U2Vzc2lvbiBjcmVhdGVTZXNzaW9uKAorICAgICAgb3B0aW9uYWwgTWVkaWFLZXlTZXNzaW9uVHlwZSBzZXNzaW9uVHlwZSA9ICJ0ZW1wb3JhcnkiKTsKKyAgLy8gVE9ETzogVHJpdmlhbGx5IGltcGxlbWVudCBzZXJ2ZXIgY2VydGlmaWNhdGVzLgorICAvLyBQcm9taXNlPGJvb2xlYW4+IHNldFNlcnZlckNlcnRpZmljYXRlKEJ1ZmZlclNvdXJjZSBzZXJ2ZXJDZXJ0aWZpY2F0ZSk7CiB9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vbWVkaWFfa2V5c19yZXF1aXJlbWVudC5pZGwgYi9zcmMvY29iYWx0L2RvbS9lbWUvbWVkaWFfa2V5c19yZXF1aXJlbWVudC5pZGwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9jb2JhbHQvZG9tL21lZGlhX2tleXNfcmVxdWlyZW1lbnQuaWRsCnJlbmFtZSB0byBzcmMvY29iYWx0L2RvbS9lbWUvbWVkaWFfa2V5c19yZXF1aXJlbWVudC5pZGwKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL25hdmlnYXRvcl9lbWUuaWRsIGIvc3JjL2NvYmFsdC9kb20vZW1lL25hdmlnYXRvci5pZGwKc2ltaWxhcml0eSBpbmRleCA2OSUKcmVuYW1lIGZyb20gc3JjL2NvYmFsdC9kb20vbmF2aWdhdG9yX2VtZS5pZGwKcmVuYW1lIHRvIHNyYy9jb2JhbHQvZG9tL2VtZS9uYXZpZ2F0b3IuaWRsCmluZGV4IGYwMjE5YWQuLjFhYmY4NTIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL25hdmlnYXRvcl9lbWUuaWRsCisrKyBiL3NyYy9jb2JhbHQvZG9tL2VtZS9uYXZpZ2F0b3IuaWRsCkBAIC0xMiwxMCArMTIsMTAgQEAKIC8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAxNi9DUi1lbmNyeXB0ZWQtbWVkaWEtMjAxNjA3MDUvI25hdmlnYXRvci1leHRlbnNpb24tcmVxdWVzdG1lZGlha2V5c3lzdGVtYWNjZXNzCisvLyBodHRwczovL3d3dy53My5vcmcvVFIvZW5jcnlwdGVkLW1lZGlhLyNuYXZpZ2F0b3ItZXh0ZW5zaW9uLXJlcXVlc3RtZWRpYWtleXN5c3RlbWFjY2VzcwogCiBwYXJ0aWFsIGludGVyZmFjZSBOYXZpZ2F0b3IgewotICAgIFByb21pc2U8TWVkaWFLZXlTeXN0ZW1BY2Nlc3M+IHJlcXVlc3RNZWRpYUtleVN5c3RlbUFjY2VzcygKLSAgICAgICAgRE9NU3RyaW5nIGtleVN5c3RlbSwKLSAgICAgICAgc2VxdWVuY2U8TWVkaWFLZXlTeXN0ZW1Db25maWd1cmF0aW9uPiBzdXBwb3J0ZWRDb25maWd1cmF0aW9ucyk7CisgIFByb21pc2U8TWVkaWFLZXlTeXN0ZW1BY2Nlc3M+IHJlcXVlc3RNZWRpYUtleVN5c3RlbUFjY2VzcygKKyAgICAgIERPTVN0cmluZyBrZXlTeXN0ZW0sCisgICAgICBzZXF1ZW5jZTxNZWRpYUtleVN5c3RlbUNvbmZpZ3VyYXRpb24+IHN1cHBvcnRlZENvbmZpZ3VyYXRpb25zKTsKIH07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9mb250X2NhY2hlLmNjIGIvc3JjL2NvYmFsdC9kb20vZm9udF9jYWNoZS5jYwppbmRleCAyOGRhMmMwLi40ZmZmNDE0IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9mb250X2NhY2hlLmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL2ZvbnRfY2FjaGUuY2MKQEAgLTkwLDYgKzkwLDE3IEBACiAgIH0KIH0KIAordm9pZCBGb250Q2FjaGU6OlB1cmdlQ2FjaGVkUmVzb3VyY2VzKCkgeworICBEQ0hFQ0sodGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7CisgIGZvbnRfZmFjZV9tYXBfLT5jbGVhcigpOworICBmb250X2xpc3RfbWFwXy5jbGVhcigpOworICBpbmFjdGl2ZV9mb250X3NldF8uY2xlYXIoKTsKKyAgZm9udF9tYXBfLmNsZWFyKCk7CisgIGNoYXJhY3Rlcl9mYWxsYmFja190eXBlZmFjZV9tYXBzXy5jbGVhcigpOworICByZXF1ZXN0ZWRfcmVtb3RlX3R5cGVmYWNlX2NhY2hlXy5jbGVhcigpOworICBsb2NhbF90eXBlZmFjZV9tYXBfLmNsZWFyKCk7Cit9CisKIHZvaWQgRm9udENhY2hlOjpQcm9jZXNzSW5hY3RpdmVGb250TGlzdHNBbmRGb250cygpIHsKICAgRENIRUNLKHRocmVhZF9jaGVja2VyXy5DYWxsZWRPblZhbGlkVGhyZWFkKCkpOwogICBiYXNlOjpUaW1lVGlja3MgY3VycmVudF90aW1lID0gYmFzZTo6VGltZVRpY2tzOjpOb3coKTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2ZvbnRfY2FjaGUuaCBiL3NyYy9jb2JhbHQvZG9tL2ZvbnRfY2FjaGUuaAppbmRleCAzZDA1Njk2Li5lOTBhZGY5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9mb250X2NhY2hlLmgKKysrIGIvc3JjL2NvYmFsdC9kb20vZm9udF9jYWNoZS5oCkBAIC0xODEsNiArMTgxLDkgQEAKICAgLy8gdGhlIG1hcC4KICAgdm9pZCBTZXRGb250RmFjZU1hcChzY29wZWRfcHRyPEZvbnRGYWNlTWFwPiBmb250X2ZhY2VfbWFwKTsKIAorICAvLyBQdXJnZSBhbGwgY2FjaGVzIHdpdGhpbiB0aGUgZm9udCBjYWNoZS4KKyAgdm9pZCBQdXJnZUNhY2hlZFJlc291cmNlcygpOworCiAgIC8vIFByb2Nlc3MgdW51c2VkIGZvbnQgbGlzdHMgYW5kIGZvbnRzLCBwb3RlbnRpYWxseSBwdXJnaW5nIHRoZW0gZnJvbSB0aGUKICAgLy8gY2FjaGUgaWYgdGhleSBtZWV0IHRoZSByZW1vdmFsIHJlcXVpcmVtZW50cy4KICAgdm9pZCBQcm9jZXNzSW5hY3RpdmVGb250TGlzdHNBbmRGb250cygpOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vaHRtbF9lbGVtZW50X2NvbnRleHQuY2MgYi9zcmMvY29iYWx0L2RvbS9odG1sX2VsZW1lbnRfY29udGV4dC5jYwppbmRleCBiN2FlZWQwLi4wNjQ0MDNhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9odG1sX2VsZW1lbnRfY29udGV4dC5jYworKysgYi9zcmMvY29iYWx0L2RvbS9odG1sX2VsZW1lbnRfY29udGV4dC5jYwpAQCAtMzUsNiArMzUsNyBAQAogICAgICAgcmVtb3RlX3R5cGVmYWNlX2NhY2hlXyhOVUxMKSwKICAgICAgIG1lc2hfY2FjaGVfKE5VTEwpLAogICAgICAgZG9tX3N0YXRfdHJhY2tlcl8oTlVMTCksCisgICAgICB2aWRlb19wbGF5YmFja19yYXRlX211bHRpcGxpZXJfKDEuZiksCiAgICAgICBzeW5jX2xvYWRfdGhyZWFkXygiU3luY2hyb25vdXMgTG9hZCIpLAogICAgICAgaHRtbF9lbGVtZW50X2ZhY3RvcnlfKG5ldyBIVE1MRWxlbWVudEZhY3RvcnkoKSkgewogICBzeW5jX2xvYWRfdGhyZWFkXy5TdGFydCgpOwpAQCAtNTQsNyArNTUsNyBAQAogICAgICAgICByZWR1Y2VkX2ltYWdlX2NhY2hlX2NhcGFjaXR5X21hbmFnZXIsCiAgICAgbG9hZGVyOjpmb250OjpSZW1vdGVUeXBlZmFjZUNhY2hlKiByZW1vdGVfdHlwZWZhY2VfY2FjaGUsCiAgICAgbG9hZGVyOjptZXNoOjpNZXNoQ2FjaGUqIG1lc2hfY2FjaGUsIERvbVN0YXRUcmFja2VyKiBkb21fc3RhdF90cmFja2VyLAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBsYW5ndWFnZSkKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgbGFuZ3VhZ2UsIGZsb2F0IHZpZGVvX3BsYXliYWNrX3JhdGVfbXVsdGlwbGllcikKICAgICA6IGZldGNoZXJfZmFjdG9yeV8oZmV0Y2hlcl9mYWN0b3J5KSwKICAgICAgIGNzc19wYXJzZXJfKGNzc19wYXJzZXIpLAogICAgICAgZG9tX3BhcnNlcl8oZG9tX3BhcnNlciksCkBAIC03Miw2ICs3Myw3IEBACiAgICAgICBtZXNoX2NhY2hlXyhtZXNoX2NhY2hlKSwKICAgICAgIGRvbV9zdGF0X3RyYWNrZXJfKGRvbV9zdGF0X3RyYWNrZXIpLAogICAgICAgbGFuZ3VhZ2VfKGxhbmd1YWdlKSwKKyAgICAgIHZpZGVvX3BsYXliYWNrX3JhdGVfbXVsdGlwbGllcl8odmlkZW9fcGxheWJhY2tfcmF0ZV9tdWx0aXBsaWVyKSwKICAgICAgIHN5bmNfbG9hZF90aHJlYWRfKCJTeW5jaHJvbm91cyBMb2FkIiksCiAgICAgICBodG1sX2VsZW1lbnRfZmFjdG9yeV8obmV3IEhUTUxFbGVtZW50RmFjdG9yeSgpKSB7CiAgIHN5bmNfbG9hZF90aHJlYWRfLlN0YXJ0KCk7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9odG1sX2VsZW1lbnRfY29udGV4dC5oIGIvc3JjL2NvYmFsdC9kb20vaHRtbF9lbGVtZW50X2NvbnRleHQuaAppbmRleCBjYWU2YWQ4Li4yZWI5NTJmIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9odG1sX2VsZW1lbnRfY29udGV4dC5oCisrKyBiL3NyYy9jb2JhbHQvZG9tL2h0bWxfZWxlbWVudF9jb250ZXh0LmgKQEAgLTYxLDcgKzYxLDcgQEAKICAgICAgICAgICByZWR1Y2VkX2ltYWdlX2NhY2hlX2NhcGFjaXR5X21hbmFnZXIsCiAgICAgICBsb2FkZXI6OmZvbnQ6OlJlbW90ZVR5cGVmYWNlQ2FjaGUqIHJlbW90ZV90eXBlZmFjZV9jYWNoZSwKICAgICAgIGxvYWRlcjo6bWVzaDo6TWVzaENhY2hlKiBtZXNoX2NhY2hlLCBEb21TdGF0VHJhY2tlciogZG9tX3N0YXRfdHJhY2tlciwKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBsYW5ndWFnZSk7CisgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbGFuZ3VhZ2UsIGZsb2F0IHZpZGVvX3BsYXliYWNrX3JhdGVfbXVsdGlwbGllciA9IDEuMCk7CiAgIH5IVE1MRWxlbWVudENvbnRleHQoKTsKIAogICBsb2FkZXI6OkZldGNoZXJGYWN0b3J5KiBmZXRjaGVyX2ZhY3RvcnkoKSB7IHJldHVybiBmZXRjaGVyX2ZhY3RvcnlfOyB9CkBAIC0xMDcsNiArMTA3LDEwIEBACiAKICAgY29uc3Qgc3RkOjpzdHJpbmcmIGxhbmd1YWdlKCkgY29uc3QgeyByZXR1cm4gbGFuZ3VhZ2VfOyB9CiAKKyAgZmxvYXQgdmlkZW9fcGxheWJhY2tfcmF0ZV9tdWx0aXBsaWVyKCkgY29uc3QgeworICAgIHJldHVybiB2aWRlb19wbGF5YmFja19yYXRlX211bHRpcGxpZXJfOworICB9CisKICAgYmFzZTo6VGhyZWFkKiBzeW5jX2xvYWRfdGhyZWFkKCkgeyByZXR1cm4gJnN5bmNfbG9hZF90aHJlYWRfOyB9CiAKICAgSFRNTEVsZW1lbnRGYWN0b3J5KiBodG1sX2VsZW1lbnRfZmFjdG9yeSgpIHsKQEAgLTEzNiw2ICsxNDAsNyBAQAogICBsb2FkZXI6Om1lc2g6Ok1lc2hDYWNoZSogY29uc3QgbWVzaF9jYWNoZV87CiAgIERvbVN0YXRUcmFja2VyKiBjb25zdCBkb21fc3RhdF90cmFja2VyXzsKICAgY29uc3Qgc3RkOjpzdHJpbmcgbGFuZ3VhZ2VfOworICBjb25zdCBmbG9hdCB2aWRlb19wbGF5YmFja19yYXRlX211bHRpcGxpZXJfOwogCiAgIGJhc2U6OlRocmVhZCBzeW5jX2xvYWRfdGhyZWFkXzsKICAgc2NvcGVkX3B0cjxIVE1MRWxlbWVudEZhY3Rvcnk+IGh0bWxfZWxlbWVudF9mYWN0b3J5XzsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2h0bWxfbWVkaWFfZWxlbWVudC5jYyBiL3NyYy9jb2JhbHQvZG9tL2h0bWxfbWVkaWFfZWxlbWVudC5jYwppbmRleCA1ZTk4ZjU1Li44NjlkNGMyIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9odG1sX21lZGlhX2VsZW1lbnQuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vaHRtbF9tZWRpYV9lbGVtZW50LmNjCkBAIC0zMywxOSArMzMsMjMgQEAKICNpbmNsdWRlICJjb2JhbHQvZG9tL2V2ZW50LmgiCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9odG1sX2VsZW1lbnRfY29udGV4dC5oIgogI2luY2x1ZGUgImNvYmFsdC9kb20vaHRtbF92aWRlb19lbGVtZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L2RvbS9tZWRpYV9rZXlfY29tcGxldGVfZXZlbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvZG9tL21lZGlhX2tleV9lcnJvcl9ldmVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9kb20vbWVkaWFfa2V5X21lc3NhZ2VfZXZlbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvZG9tL21lZGlhX2tleV9uZWVkZWRfZXZlbnQuaCIKICNpbmNsdWRlICJjb2JhbHQvZG9tL21lZGlhX3NvdXJjZS5oIgogI2luY2x1ZGUgImNvYmFsdC9kb20vbWVkaWFfc291cmNlX3JlYWR5X3N0YXRlLmgiCiAjaW5jbHVkZSAiY29iYWx0L2xvYWRlci9mZXRjaGVyX2ZhY3RvcnkuaCIKICNpbmNsdWRlICJjb2JhbHQvbWVkaWEvZmV0Y2hlcl9idWZmZXJlZF9kYXRhX3NvdXJjZS5oIgogI2luY2x1ZGUgImNvYmFsdC9tZWRpYS93ZWJfbWVkaWFfcGxheWVyX2ZhY3RvcnkuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF92YWx1ZV9mYWN0b3J5LmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2RvdWJsZS5oIgogCiAjaWYgZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCisjaW5jbHVkZSAiY29iYWx0L2RvbS9lbWUvbWVkaWFfZW5jcnlwdGVkX2V2ZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L2RvbS9lbWUvbWVkaWFfZW5jcnlwdGVkX2V2ZW50X2luaXQuaCIKICNpbmNsdWRlICJjb2JhbHQvbWVkaWEvYmFzZS9tZWRpYV9sb2cuaCIKICNlbHNlICAvLyBkZWZpbmVkKENPQkFMVF9NRURJQV9TT1VSQ0VfMjAxNikKKyNpbmNsdWRlICJjb2JhbHQvZG9tL21lZGlhX2tleV9jb21wbGV0ZV9ldmVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9kb20vbWVkaWFfa2V5X2Vycm9yX2V2ZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L2RvbS9tZWRpYV9rZXlfbWVzc2FnZV9ldmVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9kb20vbWVkaWFfa2V5X25lZWRlZF9ldmVudC5oIgogI2luY2x1ZGUgIm1lZGlhL2Jhc2UvZmlsdGVyX2NvbGxlY3Rpb24uaCIKICNpbmNsdWRlICJtZWRpYS9iYXNlL21lZGlhX2xvZy5oIgogI2VuZGlmICAvLyBkZWZpbmVkKENPQkFMVF9NRURJQV9TT1VSQ0VfMjAxNikKQEAgLTgwLDIzICs4NCw2IEBACiAKICNlbmRpZiAgLy8gTE9HX01FRElBX0VMRU1FTlRfQUNUSVZJVElFUwogCi12b2lkIFJhaXNlTWVkaWFLZXlFeGNlcHRpb24oV2ViTWVkaWFQbGF5ZXI6Ok1lZGlhS2V5RXhjZXB0aW9uIGV4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlKiBleGNlcHRpb25fc3RhdGUpIHsKLSAgRENIRUNLX05FKGV4Y2VwdGlvbiwgV2ViTWVkaWFQbGF5ZXI6OmtNZWRpYUtleUV4Y2VwdGlvbk5vRXJyb3IpOwotICBzd2l0Y2ggKGV4Y2VwdGlvbikgewotICAgIGNhc2UgV2ViTWVkaWFQbGF5ZXI6OmtNZWRpYUtleUV4Y2VwdGlvbkludmFsaWRQbGF5ZXJTdGF0ZToKLSAgICAgIERPTUV4Y2VwdGlvbjo6UmFpc2UoRE9NRXhjZXB0aW9uOjprSW52YWxpZFN0YXRlRXJyLCBleGNlcHRpb25fc3RhdGUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBXZWJNZWRpYVBsYXllcjo6a01lZGlhS2V5RXhjZXB0aW9uS2V5U3lzdGVtTm90U3VwcG9ydGVkOgotICAgICAgRE9NRXhjZXB0aW9uOjpSYWlzZShET01FeGNlcHRpb246OmtOb3RTdXBwb3J0ZWRFcnIsIGV4Y2VwdGlvbl9zdGF0ZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFdlYk1lZGlhUGxheWVyOjprTWVkaWFLZXlFeGNlcHRpb25Ob0Vycm9yOgotICAgIGRlZmF1bHQ6Ci0gICAgICBOT1RSRUFDSEVEKCk7Ci0gICAgICBicmVhazsKLSAgfQotfQotCiAvLyBUaGlzIHN0cnVjdCBtYW5hZ2VzIHRoZSB1c2VyIGxvZyBpbmZvcm1hdGlvbiBmb3IgSFRNTE1lZGlhRWxlbWVudCBjb3VudC4KIHN0cnVjdCBIVE1MTWVkaWFFbGVtZW50Q291bnRMb2cgewogICBIVE1MTWVkaWFFbGVtZW50Q291bnRMb2coKSA6IGNvdW50KDApIHsKQEAgLTEyMiw3ICsxMDksNyBAQAogICAgIDogSFRNTEVsZW1lbnQoZG9jdW1lbnQsIHRhZ19uYW1lKSwKICAgICAgIGxvYWRfc3RhdGVfKGtXYWl0aW5nRm9yU291cmNlKSwKICAgICAgIEFMTE9XX1RISVNfSU5fSU5JVElBTElaRVJfTElTVChldmVudF9xdWV1ZV8odGhpcykpLAotICAgICAgcGxheWJhY2tfcmF0ZV8oMS4wZiksCisgICAgICBwbGF5YmFja19yYXRlXygxLmYpLAogICAgICAgZGVmYXVsdF9wbGF5YmFja19yYXRlXygxLjBmKSwKICAgICAgIG5ldHdvcmtfc3RhdGVfKGtOZXR3b3JrRW1wdHkpLAogICAgICAgcmVhZHlfc3RhdGVfKFdlYk1lZGlhUGxheWVyOjprUmVhZHlTdGF0ZUhhdmVOb3RoaW5nKSwKQEAgLTIyOCw2ICsyMTUsOTAgQEAKICAgcmV0dXJuIHJlc3VsdDsKIH0KIAorI2lmIGRlZmluZWQoQ09CQUxUX01FRElBX1NPVVJDRV8yMDE2KQorCitjb25zdCBFdmVudFRhcmdldDo6RXZlbnRMaXN0ZW5lclNjcmlwdFZhbHVlKiBIVE1MTWVkaWFFbGVtZW50OjpvbmVuY3J5cHRlZCgpCisgICAgY29uc3QgeworICByZXR1cm4gR2V0QXR0cmlidXRlRXZlbnRMaXN0ZW5lcihiYXNlOjpUb2tlbnM6OmVuY3J5cHRlZCgpKTsKK30KKwordm9pZCBIVE1MTWVkaWFFbGVtZW50OjpzZXRfb25lbmNyeXB0ZWQoCisgICAgY29uc3QgRXZlbnRMaXN0ZW5lclNjcmlwdFZhbHVlJiBldmVudF9saXN0ZW5lcikgeworICBTZXRBdHRyaWJ1dGVFdmVudExpc3RlbmVyKGJhc2U6OlRva2Vuczo6ZW5jcnlwdGVkKCksIGV2ZW50X2xpc3RlbmVyKTsKK30KKworLy8gU2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9lbmNyeXB0ZWQtbWVkaWEvI2RvbS1odG1sbWVkaWFlbGVtZW50LXNldG1lZGlha2V5cy4KK3Njb3BlZF9wdHI8SFRNTE1lZGlhRWxlbWVudDo6Vm9pZFByb21pc2VWYWx1ZT4gSFRNTE1lZGlhRWxlbWVudDo6U2V0TWVkaWFLZXlzKAorICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8ZW1lOjpNZWRpYUtleXM+JiBtZWRpYV9rZXlzKSB7CisgIHNjb3BlZF9wdHI8Vm9pZFByb21pc2VWYWx1ZT4gcHJvbWlzZSA9IG5vZGVfZG9jdW1lbnQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5odG1sX2VsZW1lbnRfY29udGV4dCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPnNjcmlwdF92YWx1ZV9mYWN0b3J5KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+Q3JlYXRlQmFzaWNQcm9taXNlPHZvaWQ+KCk7CisgIFZvaWRQcm9taXNlVmFsdWU6OlN0cm9uZ1JlZmVyZW5jZSBwcm9taXNlX3JlZmVyZW5jZSgqcHJvbWlzZSk7CisKKyAgLy8gMS4gSWYgbWVkaWFLZXlzIGFuZCB0aGUgbWVkaWFLZXlzIGF0dHJpYnV0ZSBhcmUgdGhlIHNhbWUgb2JqZWN0LCByZXR1cm4KKyAgLy8gICAgYSByZXNvbHZlZCBwcm9taXNlLgorICBpZiAobWVkaWFfa2V5c18gPT0gbWVkaWFfa2V5cykgeworICAgIHByb21pc2VfcmVmZXJlbmNlLnZhbHVlKCkuUmVzb2x2ZSgpOworICAgIHJldHVybiBwcm9taXNlLlBhc3MoKTsKKyAgfQorCisgIC8vIDUuMi4gSWYgdGhlIG1lZGlhS2V5cyBhdHRyaWJ1dGUgaXMgbm90IG51bGw6CisgIGlmIChtZWRpYV9rZXlzXykgeworICAgIC8vIDUuMi4zLiBTdG9wIHVzaW5nIHRoZSBDRE0gaW5zdGFuY2UgcmVwcmVzZW50ZWQgYnkgdGhlIG1lZGlhS2V5cyBhdHRyaWJ1dGUKKyAgICAvLyAgICAgICAgdG8gZGVjcnlwdCBtZWRpYSBkYXRhIGFuZCByZW1vdmUgdGhlIGFzc29jaWF0aW9uIHdpdGggdGhlIG1lZGlhCisgICAgLy8gICAgICAgIGVsZW1lbnQuCisgICAgLy8KKyAgICAvLyBTaW5jZSBTdGFyYm9hcmQgZG9lc24ndCBhbGxvdyB0byBkZXRhY2ggU2JEcm1TeXN0ZW0gZnJvbSBTYlBsYXllciwKKyAgICAvLyByZS1jcmVhdGUgdGhlIGVudGlyZSBwbGF5ZXIuCisgICAgaWYgKHBsYXllcl8pIHsKKyAgICAgIENsZWFyTWVkaWFQbGF5ZXIoKTsKKyAgICAgIENyZWF0ZU1lZGlhUGxheWVyKCk7CisgICAgfQorICB9CisKKyAgLy8gNS4zLiBJZiBtZWRpYUtleXMgaXMgbm90IG51bGw6CisgIGlmIChtZWRpYV9rZXlzKSB7CisgICAgLy8gNS4zLjEuIEFzc29jaWF0ZSB0aGUgQ0RNIGluc3RhbmNlIHJlcHJlc2VudGVkIGJ5IG1lZGlhS2V5cyB3aXRoCisgICAgLy8gICAgICAgIHRoZSBtZWRpYSBlbGVtZW50IGZvciBkZWNyeXB0aW5nIG1lZGlhIGRhdGEuCisgICAgaWYgKHBsYXllcl8pIHsKKyAgICAgIHBsYXllcl8tPlNldERybVN5c3RlbShtZWRpYV9rZXlzLT5kcm1fc3lzdGVtKCkpOworICAgIH0KKyAgfQorCisgIC8vIDUuNC4gU2V0IHRoZSBtZWRpYUtleXMgYXR0cmlidXRlIHRvIG1lZGlhS2V5cy4KKyAgbWVkaWFfa2V5c18gPSBtZWRpYV9rZXlzOworCisgIC8vIDUuNi4gUmVzb2x2ZSBwcm9taXNlLgorICBwcm9taXNlX3JlZmVyZW5jZS52YWx1ZSgpLlJlc29sdmUoKTsKKworICAvLyA2LiBSZXR1cm4gcHJvbWlzZS4KKyAgcmV0dXJuIHByb21pc2UuUGFzcygpOworfQorCisjZWxzZSAgLy8gZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCisKK25hbWVzcGFjZSB7CisKK3ZvaWQgUmFpc2VNZWRpYUtleUV4Y2VwdGlvbihXZWJNZWRpYVBsYXllcjo6TWVkaWFLZXlFeGNlcHRpb24gZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdDo6RXhjZXB0aW9uU3RhdGUqIGV4Y2VwdGlvbl9zdGF0ZSkgeworICBEQ0hFQ0tfTkUoZXhjZXB0aW9uLCBXZWJNZWRpYVBsYXllcjo6a01lZGlhS2V5RXhjZXB0aW9uTm9FcnJvcik7CisgIHN3aXRjaCAoZXhjZXB0aW9uKSB7CisgICAgY2FzZSBXZWJNZWRpYVBsYXllcjo6a01lZGlhS2V5RXhjZXB0aW9uSW52YWxpZFBsYXllclN0YXRlOgorICAgICAgRE9NRXhjZXB0aW9uOjpSYWlzZShET01FeGNlcHRpb246OmtJbnZhbGlkU3RhdGVFcnIsIGV4Y2VwdGlvbl9zdGF0ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFdlYk1lZGlhUGxheWVyOjprTWVkaWFLZXlFeGNlcHRpb25LZXlTeXN0ZW1Ob3RTdXBwb3J0ZWQ6CisgICAgICBET01FeGNlcHRpb246OlJhaXNlKERPTUV4Y2VwdGlvbjo6a05vdFN1cHBvcnRlZEVyciwgZXhjZXB0aW9uX3N0YXRlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgV2ViTWVkaWFQbGF5ZXI6OmtNZWRpYUtleUV4Y2VwdGlvbk5vRXJyb3I6CisgICAgZGVmYXVsdDoKKyAgICAgIE5PVFJFQUNIRUQoKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCiB2b2lkIEhUTUxNZWRpYUVsZW1lbnQ6OkdlbmVyYXRlS2V5UmVxdWVzdCgKICAgICBjb25zdCBzdGQ6OnN0cmluZyYga2V5X3N5c3RlbSwKICAgICBjb25zdCBiYXNlOjpvcHRpb25hbDxzY29wZWRfcmVmcHRyPFVpbnQ4QXJyYXk+ID4mIGluaXRfZGF0YSwKQEAgLTMzOSw2ICs0MTAsOCBAQAogICB9CiB9CiAKKyNlbmRpZiAgLy8gZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCisKIHVpbnQxNl90IEhUTUxNZWRpYUVsZW1lbnQ6OnJlYWR5X3N0YXRlKCkgY29uc3QgewogICBNTE9HKCkgPDwgcmVhZHlfc3RhdGVfOwogICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDE2X3Q+KHJlYWR5X3N0YXRlXyk7CkBAIC00MjAsMTMgKzQ5MywxNSBAQAogCiB2b2lkIEhUTUxNZWRpYUVsZW1lbnQ6OnNldF9wbGF5YmFja19yYXRlKGZsb2F0IHJhdGUpIHsKICAgTUxPRygpIDw8IHJhdGU7CisKICAgaWYgKHBsYXliYWNrX3JhdGVfICE9IHJhdGUpIHsKICAgICBwbGF5YmFja19yYXRlXyA9IHJhdGU7CiAgICAgU2NoZWR1bGVPd25FdmVudChiYXNlOjpUb2tlbnM6OnJhdGVjaGFuZ2UoKSk7CiAgIH0KIAogICBpZiAocGxheWVyXyAmJiBQb3RlbnRpYWxseVBsYXlpbmcoKSkgewotICAgIHBsYXllcl8tPlNldFJhdGUocmF0ZSk7CisgICAgcGxheWVyXy0+U2V0UmF0ZShyYXRlICoKKyAgICAgICAgICAgICAgICAgICAgIGh0bWxfZWxlbWVudF9jb250ZXh0KCktPnZpZGVvX3BsYXliYWNrX3JhdGVfbXVsdGlwbGllcigpKTsKICAgfQogfQogCkBAIC02NDcsMTUgKzcyMiwxOCBAQAogICAgIH0KICAgfQogCi0gIHBsYXllcl8ucmVzZXQoKTsKICAgcGxheWVyXyA9CiAgICAgICBodG1sX2VsZW1lbnRfY29udGV4dCgpLT53ZWJfbWVkaWFfcGxheWVyX2ZhY3RvcnkoKS0+Q3JlYXRlV2ViTWVkaWFQbGF5ZXIoCiAgICAgICAgICAgdGhpcyk7Ci0jaWYgIWRlZmluZWQoQ09CQUxUX01FRElBX1NPVVJDRV8yMDE2KQorI2lmIGRlZmluZWQoQ09CQUxUX01FRElBX1NPVVJDRV8yMDE2KQorICBpZiAobWVkaWFfa2V5c18pIHsKKyAgICBwbGF5ZXJfLT5TZXREcm1TeXN0ZW0obWVkaWFfa2V5c18tPmRybV9zeXN0ZW0oKSk7CisgIH0KKyNlbHNlICAgLy8gZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCiAgIGlmIChtZWRpYV9zb3VyY2VfKSB7CiAgICAgbWVkaWFfc291cmNlXy0+U2V0UGxheWVyKHBsYXllcl8uZ2V0KCkpOwogICB9Ci0jZW5kaWYgIC8vICFkZWZpbmVkKENPQkFMVF9NRURJQV9TT1VSQ0VfMjAxNikKKyNlbmRpZiAgLy8gZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCiAgIG5vZGVfZG9jdW1lbnQoKS0+T25ET01NdXRhdGlvbigpOwogICBJbnZhbGlkYXRlTGF5b3V0Qm94ZXNPZk5vZGVBbmRBbmNlc3RvcnMoKTsKIH0KQEAgLTEyOTMsNyArMTM3MSw5IEBACiAgICAgICAvLyBTZXQgcmF0ZSwgbXV0ZWQgYmVmb3JlIGNhbGxpbmcgcGxheSBpbiBjYXNlIHRoZXkgd2VyZSBzZXQgYmVmb3JlIHRoZQogICAgICAgLy8gbWVkaWEgZW5naW5lIHdhcyBzZXR1cC4gVGhlIG1lZGlhIGVuZ2luZSBzaG91bGQganVzdCBzdGFzaCB0aGUgcmF0ZSBhbmQKICAgICAgIC8vIG11dGVkIHZhbHVlcyBzaW5jZSBpdCBpc24ndCBhbHJlYWR5IHBsYXlpbmcuCi0gICAgICBwbGF5ZXJfLT5TZXRSYXRlKHBsYXliYWNrX3JhdGVfKTsKKyAgICAgIHBsYXllcl8tPlNldFJhdGUoCisgICAgICAgICAgcGxheWJhY2tfcmF0ZV8gKgorICAgICAgICAgIGh0bWxfZWxlbWVudF9jb250ZXh0KCktPnZpZGVvX3BsYXliYWNrX3JhdGVfbXVsdGlwbGllcigpKTsKICAgICAgIHBsYXllcl8tPlNldFZvbHVtZShtdXRlZF8gPyAwIDogdm9sdW1lXyk7CiAKICAgICAgIHBsYXllcl8tPlBsYXkoKTsKQEAgLTEzMzIsNyArMTQxMiw3IEBACiAKIGJvb2wgSFRNTE1lZGlhRWxlbWVudDo6RW5kZWRQbGF5YmFjaygpIGNvbnN0IHsKICAgZmxvYXQgZHVyID0gZHVyYXRpb24oKTsKLSAgaWYgKCFwbGF5ZXJfIHx8IGlzbmFuKGR1cikpIHsKKyAgaWYgKCFwbGF5ZXJfIHx8IFNiRG91YmxlSXNOYW4oZHVyKSkgewogICAgIHJldHVybiBmYWxzZTsKICAgfQogCkBAIC0xNDUwLDcgKzE1MzAsOCBAQAogICAvLyBXaGVuIHRoZSBjdXJyZW50IHBsYXliYWNrIHBvc2l0aW9uIHJlYWNoZXMgdGhlIGVuZCBvZiB0aGUgbWVkaWEgcmVzb3VyY2UKICAgLy8gd2hlbiB0aGUgZGlyZWN0aW9uIG9mIHBsYXliYWNrIGlzIGZvcndhcmRzLCB0aGVuIHRoZSB1c2VyIGFnZW50IG11c3QgZm9sbG93CiAgIC8vIHRoZXNlIHN0ZXBzOgotICBpZiAoIWlzbmFuKGR1cikgJiYgKDAuMGYgIT0gZHVyKSAmJiBub3cgPj0gZHVyICYmIHBsYXliYWNrX3JhdGVfID4gMCkgeworICBpZiAoIVNiRG91YmxlSXNOYW4oZHVyKSAmJiAoMC4wZiAhPSBkdXIpICYmIG5vdyA+PSBkdXIgJiYKKyAgICAgIHBsYXliYWNrX3JhdGVfID4gMCkgewogICAgIC8vIElmIHRoZSBtZWRpYSBlbGVtZW50IGhhcyBhIGxvb3AgYXR0cmlidXRlIHNwZWNpZmllZCBhbmQgZG9lcyBub3QgaGF2ZSBhCiAgICAgLy8gY3VycmVudCBtZWRpYSBjb250cm9sbGVyLAogICAgIGlmIChsb29wKCkpIHsKQEAgLTE1NDcsMTMgKzE2MjgsNTAgQEAKIH0KIAogI2lmIGRlZmluZWQoQ09CQUxUX01FRElBX1NPVVJDRV8yMDE2KQotdm9pZCBIVE1MTWVkaWFFbGVtZW50OjpFbmNyeXB0ZWRNZWRpYUluaXREYXRhKAotICAgIG1lZGlhOjpFbWVJbml0RGF0YVR5cGUgLyppbml0X2RhdGFfdHlwZSovLAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIC8qaW5pdF9kYXRhKi8sIHVuc2lnbmVkIGludCAvKmluaXRfZGF0YV9sZW5ndGgqLykgewotICAvLyBUT0RPOiBJbXBsZW1lbnQgYXMgcGVyIEVNRSAyMDE3LgotICBOT1RJTVBMRU1FTlRFRCgpOworCituYW1lc3BhY2UgeworCisvLyBJbml0aWFsaXphdGlvbiBkYXRhIHR5cGVzIGFyZSBkZWZpbmVkIGluCisvLyBodHRwczovL3d3dy53My5vcmcvVFIvZW1lLWluaXRkYXRhLXJlZ2lzdHJ5LyNyZWdpc3RyeS4KK3N0ZDo6c3RyaW5nIFRvSW5pdERhdGFUeXBlU3RyaW5nKG1lZGlhOjpFbWVJbml0RGF0YVR5cGUgaW5pdF9kYXRhX3R5cGUpIHsKKyAgc3dpdGNoIChpbml0X2RhdGFfdHlwZSkgeworICAgIGNhc2UgbWVkaWE6OmtFbWVJbml0RGF0YVR5cGVXZWJNOgorICAgICAgcmV0dXJuICJ3ZWJtIjsKKyAgICBjYXNlIG1lZGlhOjprRW1lSW5pdERhdGFUeXBlQ2VuYzoKKyAgICAgIHJldHVybiAiY2VuYyI7CisgICAgY2FzZSBtZWRpYTo6a0VtZUluaXREYXRhVHlwZUtleUlkczoKKyAgICAgIHJldHVybiAia2V5aWRzIjsKKyAgICBkZWZhdWx0OgorICAgICAgTE9HKFdBUk5JTkcpIDw8ICJVbmtub3duIEVNRSBpbml0aWFsaXphdGlvbiBkYXRhIHR5cGUuIjsKKyAgICAgIHJldHVybiAiIjsKKyAgfQogfQotI2VuZGlmICAvLyBkZWZpbmVkKENPQkFMVF9NRURJQV9TT1VSQ0VfMjAxNikKKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIFNlZSBodHRwczovL3d3dy53My5vcmcvVFIvZW5jcnlwdGVkLW1lZGlhLyNpbml0ZGF0YS1lbmNvdW50ZXJlZC4KK3ZvaWQgSFRNTE1lZGlhRWxlbWVudDo6RW5jcnlwdGVkTWVkaWFJbml0RGF0YUVuY291bnRlcmVkKAorICAgIG1lZGlhOjpFbWVJbml0RGF0YVR5cGUgaW5pdF9kYXRhX3R5cGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGluaXRfZGF0YSwKKyAgICB1bnNpZ25lZCBpbnQgaW5pdF9kYXRhX2xlbmd0aCkgeworICAvLyBUT0RPOiBJbXBsZW1lbnQgIjQuIElmIHRoZSBtZWRpYSBkYXRhIGlzIENPUlMtc2FtZS1vcmlnaW4gYW5kIG5vdCBtaXhlZAorICAvLyAgICAgICBjb250ZW50Ii4KKworICAvLyA1LiBRdWV1ZSBhIHRhc2sgdG8gY3JlYXRlIGFuIGV2ZW50IG5hbWVkIGVuY3J5cHRlZCB0aGF0IGRvZXMgbm90IGJ1YmJsZQorICAvLyAgICBhbmQgaXMgbm90IGNhbmNlbGxhYmxlIHVzaW5nIHRoZSBNZWRpYUVuY3J5cHRlZEV2ZW50IGludGVyZmFjZSBbLi4uXSwKKyAgLy8gICAgYW5kIGRpc3BhdGNoIGl0IGF0IHRoZSBtZWRpYSBlbGVtZW50LgorICAvLworICAvLyBUT0RPOiBJbXBsZW1lbnQgRXZlbnQuaXNUcnVzdGVkIGFzIHBlcgorICAvLyAgICAgICBodHRwczovL3d3dy53My5vcmcvVFIvZG9tLyNkb20tZXZlbnQtaXN0cnVzdGVkIGFuZCBzZXQgaXQgdG8gdHJ1ZS4KKyAgZW1lOjpNZWRpYUVuY3J5cHRlZEV2ZW50SW5pdCBtZWRpYV9lbmNyeXB0ZWRfZXZlbnRfaW5pdDsKKyAgbWVkaWFfZW5jcnlwdGVkX2V2ZW50X2luaXQuc2V0X2luaXRfZGF0YV90eXBlKAorICAgICAgVG9Jbml0RGF0YVR5cGVTdHJpbmcoaW5pdF9kYXRhX3R5cGUpKTsKKyAgbWVkaWFfZW5jcnlwdGVkX2V2ZW50X2luaXQuc2V0X2luaXRfZGF0YSgKKyAgICAgIG5ldyBBcnJheUJ1ZmZlcihOVUxMLCBpbml0X2RhdGEsIGluaXRfZGF0YV9sZW5ndGgpKTsKKyAgZXZlbnRfcXVldWVfLkVucXVldWUoCisgICAgICBuZXcgZW1lOjpNZWRpYUVuY3J5cHRlZEV2ZW50KCJlbmNyeXB0ZWQiLCBtZWRpYV9lbmNyeXB0ZWRfZXZlbnRfaW5pdCkpOworfQorCisjZWxzZSAgLy8gZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCiAKIHZvaWQgSFRNTE1lZGlhRWxlbWVudDo6S2V5QWRkZWQoY29uc3Qgc3RkOjpzdHJpbmcmIGtleV9zeXN0ZW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXNzaW9uX2lkKSB7CkBAIC0xNjE2LDYgKzE3MzQsOCBAQAogICAgICAgbmV3IFVpbnQ4QXJyYXkoTlVMTCwgaW5pdF9kYXRhLCBpbml0X2RhdGFfbGVuZ3RoLCBOVUxMKSkpOwogfQogCisjZW5kaWYgIC8vIGRlZmluZWQoQ09CQUxUX01FRElBX1NPVVJDRV8yMDE2KQorCiB2b2lkIEhUTUxNZWRpYUVsZW1lbnQ6OkNsZWFyTWVkaWFTb3VyY2UoKSB7CiAjaWYgZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCiAgIGlmIChtZWRpYV9zb3VyY2VfKSB7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9odG1sX21lZGlhX2VsZW1lbnQuaCBiL3NyYy9jb2JhbHQvZG9tL2h0bWxfbWVkaWFfZWxlbWVudC5oCmluZGV4IDczYjdhOGUuLjE1NGQ3M2MgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2h0bWxfbWVkaWFfZWxlbWVudC5oCisrKyBiL3NyYy9jb2JhbHQvZG9tL2h0bWxfbWVkaWFfZWxlbWVudC5oCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9leGNlcHRpb25fc3RhdGUuaCIKICNpbmNsdWRlICJnb29nbGV1cmwvc3JjL2d1cmwuaCIKICNpZiBkZWZpbmVkKENPQkFMVF9NRURJQV9TT1VSQ0VfMjAxNikKKyNpbmNsdWRlICJjb2JhbHQvZG9tL2VtZS9tZWRpYV9rZXlzLmgiCiAjaW5jbHVkZSAiY29iYWx0L21lZGlhL3BsYXllci93ZWJfbWVkaWFfcGxheWVyLmgiCiAjZWxzZSAgLy8gZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9tZWRpYV9zb3VyY2UuaCIKQEAgLTQ5LDEyICs1MCwxMCBAQAogI2Vsc2UgICAvLyBkZWZpbmVkKENPQkFMVF9NRURJQV9TT1VSQ0VfMjAxNikKIHR5cGVkZWYgOjptZWRpYTo6V2ViTWVkaWFQbGF5ZXIgV2ViTWVkaWFQbGF5ZXI7CiB0eXBlZGVmIDo6bWVkaWE6OldlYk1lZGlhUGxheWVyQ2xpZW50IFdlYk1lZGlhUGxheWVyQ2xpZW50OwotI2VuZGlmICAvLyBkZWZpbmVkKFdlYk1lZGlhUGxheWVyRGVsZWdhdGUpCisjZW5kaWYgIC8vIGRlZmluZWQoQ09CQUxUX01FRElBX1NPVVJDRV8yMDE2KQogCiAvLyBUaGUgSFRNTE1lZGlhRWxlbWVudCBpcyB0aGUgYmFzZSBvZiBIVE1MQXVkaW9FbGVtZW50IGFuZCBIVE1MVmlkZW9FbGVtZW50LgogLy8gICBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvZW1iZWRkZWQtY29udGVudC0wLmh0bWwjbWVkaWEtZWxlbWVudAotLy8gSXQgYWxzbyBpbXBsZW1lbnRzIG1ldGhvZHMgZGVmaW5lZCBpbiBFbmNyeXB0ZWQgTWVkaWEgRXh0ZW5zaW9ucy4KLS8vICAgaHR0cHM6Ly9kdmNzLnczLm9yZy9oZy9odG1sLW1lZGlhL3Jhdy1maWxlL2VtZS12MC4xYi9lbmNyeXB0ZWQtbWVkaWEvZW5jcnlwdGVkLW1lZGlhLmh0bWwKIGNsYXNzIEhUTUxNZWRpYUVsZW1lbnQgOiBwdWJsaWMgSFRNTEVsZW1lbnQsIHByaXZhdGUgV2ViTWVkaWFQbGF5ZXJDbGllbnQgewogIHB1YmxpYzoKICAgSFRNTE1lZGlhRWxlbWVudChEb2N1bWVudCogZG9jdW1lbnQsIGJhc2U6OlRva2VuIHRhZ19uYW1lKTsKQEAgLTgzLDYgKzgyLDE4IEBACiAgIHN0ZDo6c3RyaW5nIENhblBsYXlUeXBlKGNvbnN0IHN0ZDo6c3RyaW5nJiBtaW1lVHlwZSk7CiAgIHN0ZDo6c3RyaW5nIENhblBsYXlUeXBlKGNvbnN0IHN0ZDo6c3RyaW5nJiBtaW1lVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleV9zeXN0ZW0pOworCisjaWYgZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCisgIGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRWYWx1ZSogb25lbmNyeXB0ZWQoKSBjb25zdDsKKyAgdm9pZCBzZXRfb25lbmNyeXB0ZWQoY29uc3QgRXZlbnRMaXN0ZW5lclNjcmlwdFZhbHVlJiBldmVudF9saXN0ZW5lcik7CisKKyAgY29uc3Qgc2NvcGVkX3JlZnB0cjxlbWU6Ok1lZGlhS2V5cz4mIG1lZGlhX2tleXMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1lZGlhX2tleXNfOworICB9CisgIHR5cGVkZWYgc2NyaXB0OjpTY3JpcHRWYWx1ZTxzY3JpcHQ6OlByb21pc2U8dm9pZD4gPiBWb2lkUHJvbWlzZVZhbHVlOworICBzY29wZWRfcHRyPFZvaWRQcm9taXNlVmFsdWU+IFNldE1lZGlhS2V5cygKKyAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8ZW1lOjpNZWRpYUtleXM+JiBtZWRpYV9rZXlzKTsKKyNlbHNlICAgLy8gZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCiAgIHZvaWQgR2VuZXJhdGVLZXlSZXF1ZXN0KAogICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleV9zeXN0ZW0sCiAgICAgICBjb25zdCBiYXNlOjpvcHRpb25hbDxzY29wZWRfcmVmcHRyPFVpbnQ4QXJyYXk+ID4mIGluaXRfZGF0YSwKQEAgLTk1LDYgKzEwNiw3IEBACiAgIHZvaWQgQ2FuY2VsS2V5UmVxdWVzdChjb25zdCBzdGQ6OnN0cmluZyYga2V5X3N5c3RlbSwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2U6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiYgc2Vzc2lvbl9pZCwKICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdDo6RXhjZXB0aW9uU3RhdGUqIGV4Y2VwdGlvbl9zdGF0ZSk7CisjZW5kaWYgIC8vIGRlZmluZWQoQ09CQUxUX01FRElBX1NPVVJDRV8yMDE2KQogCiAgIC8vIFJlYWR5IHN0YXRlCiAgIGVudW0gUmVhZHlTdGF0ZSB7CkBAIC0yMzIsMTAgKzI0NCwxMCBAQAogICBzdGQ6OnN0cmluZyBTb3VyY2VVUkwoKSBjb25zdCBPVkVSUklERTsKICAgYm9vbCBQcmVmZXJEZWNvZGVUb1RleHR1cmUoKSBjb25zdCBPVkVSUklERTsKICNpZiBkZWZpbmVkKENPQkFMVF9NRURJQV9TT1VSQ0VfMjAxNikKLSAgdm9pZCBFbmNyeXB0ZWRNZWRpYUluaXREYXRhKG1lZGlhOjpFbWVJbml0RGF0YVR5cGUgaW5pdF9kYXRhX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBpbml0X2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaW5pdF9kYXRhX2xlbmd0aCkgT1ZFUlJJREU7Ci0jZW5kaWYgIC8vIGRlZmluZWQoQ09CQUxUX01FRElBX1NPVVJDRV8yMDE2KQorICB2b2lkIEVuY3J5cHRlZE1lZGlhSW5pdERhdGFFbmNvdW50ZXJlZCgKKyAgICAgIG1lZGlhOjpFbWVJbml0RGF0YVR5cGUgaW5pdF9kYXRhX3R5cGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGluaXRfZGF0YSwKKyAgICAgIHVuc2lnbmVkIGludCBpbml0X2RhdGFfbGVuZ3RoKSBPVkVSUklERTsKKyNlbHNlICAgLy8gZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCiAgIHZvaWQgS2V5QWRkZWQoY29uc3Qgc3RkOjpzdHJpbmcmIGtleV9zeXN0ZW0sCiAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNlc3Npb25faWQpIE9WRVJSSURFOwogICB2b2lkIEtleUVycm9yKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlfc3lzdGVtLCBjb25zdCBzdGQ6OnN0cmluZyYgc2Vzc2lvbl9pZCwKQEAgLTI0Niw2ICsyNTgsNyBAQAogICB2b2lkIEtleU5lZWRlZChjb25zdCBzdGQ6OnN0cmluZyYga2V5X3N5c3RlbSwgY29uc3Qgc3RkOjpzdHJpbmcmIHNlc3Npb25faWQsCiAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGluaXRfZGF0YSwKICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGluaXRfZGF0YV9sZW5ndGgpIE9WRVJSSURFOworI2VuZGlmICAvLyAhZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCiAgIHZvaWQgQ2xlYXJNZWRpYVNvdXJjZSgpOwogI2lmICFkZWZpbmVkKENPQkFMVF9NRURJQV9TT1VSQ0VfMjAxNikKICAgdm9pZCBTZXRTb3VyY2VTdGF0ZShNZWRpYVNvdXJjZVJlYWR5U3RhdGUgcmVhZHlfc3RhdGUpOwpAQCAtMzEyLDYgKzMyNSwxMCBAQAogICBiYXNlOjpvcHRpb25hbDxsb2FkZXI6OmltYWdlOjpSZWR1Y2VkQ2FjaGVDYXBhY2l0eU1hbmFnZXI6OlJlcXVlc3Q+CiAgICAgICByZWR1Y2VkX2ltYWdlX2NhY2hlX2NhcGFjaXR5X3JlcXVlc3RfOwogCisjaWYgZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCisgIHNjb3BlZF9yZWZwdHI8ZW1lOjpNZWRpYUtleXM+IG1lZGlhX2tleXNfOworI2VuZGlmICAvLyBkZWZpbmVkKENPQkFMVF9NRURJQV9TT1VSQ0VfMjAxNikKKwogICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oSFRNTE1lZGlhRWxlbWVudCk7CiB9OwogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9odG1sX21lZGlhX2VsZW1lbnQuaWRsIGIvc3JjL2NvYmFsdC9kb20vaHRtbF9tZWRpYV9lbGVtZW50LmlkbAppbmRleCA0MjVhZTY3Li5hNGI3YzA0IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9odG1sX21lZGlhX2VsZW1lbnQuaWRsCisrKyBiL3NyYy9jb2JhbHQvZG9tL2h0bWxfbWVkaWFfZWxlbWVudC5pZGwKQEAgLTU5LDEyICs1OSw0IEBACiAgIGF0dHJpYnV0ZSBib29sZWFuIGNvbnRyb2xzOwogICBbUmFpc2VzRXhjZXB0aW9uXSBhdHRyaWJ1dGUgZG91YmxlIHZvbHVtZTsKICAgYXR0cmlidXRlIGJvb2xlYW4gbXV0ZWQ7Ci0KLSAgLy8gRW5jcnlwdGVkIE1lZGlhIEV4dGVuc2lvbnMgbWV0aG9kcwotICBbUmFpc2VzRXhjZXB0aW9uXSB2b2lkIGdlbmVyYXRlS2V5UmVxdWVzdChET01TdHJpbmcga2V5U3lzdGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVaW50OEFycmF5PyBpbml0RGF0YSk7Ci0gIFtSYWlzZXNFeGNlcHRpb25dIHZvaWQgYWRkS2V5KERPTVN0cmluZyBrZXlTeXN0ZW0sIFVpbnQ4QXJyYXkga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVaW50OEFycmF5PyBpbml0RGF0YSwgRE9NU3RyaW5nPyBzZXNzaW9uSWQpOwotICBbUmFpc2VzRXhjZXB0aW9uXSB2b2lkIGNhbmNlbEtleVJlcXVlc3QoRE9NU3RyaW5nIGtleVN5c3RlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERPTVN0cmluZz8gc2Vzc2lvbklkKTsKIH07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9odG1sX21lZGlhX2VsZW1lbnRfZW1lXzAxYi5pZGwgYi9zcmMvY29iYWx0L2RvbS9odG1sX21lZGlhX2VsZW1lbnRfZW1lXzAxYi5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDExMmE4ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZG9tL2h0bWxfbWVkaWFfZWxlbWVudF9lbWVfMDFiLmlkbApAQCAtMCwwICsxLDI0IEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBodHRwczovL2R2Y3MudzMub3JnL2hnL2h0bWwtbWVkaWEvcmF3LWZpbGUvZW1lLXYwLjFiL2VuY3J5cHRlZC1tZWRpYS9lbmNyeXB0ZWQtbWVkaWEuaHRtbCNleHRlbnNpb25zCisKK3BhcnRpYWwgaW50ZXJmYWNlIEhUTUxNZWRpYUVsZW1lbnQgeworICBbUmFpc2VzRXhjZXB0aW9uXSB2b2lkIGdlbmVyYXRlS2V5UmVxdWVzdChET01TdHJpbmcga2V5U3lzdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVaW50OEFycmF5PyBpbml0RGF0YSk7CisgIFtSYWlzZXNFeGNlcHRpb25dIHZvaWQgYWRkS2V5KERPTVN0cmluZyBrZXlTeXN0ZW0sIFVpbnQ4QXJyYXkga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVaW50OEFycmF5PyBpbml0RGF0YSwgRE9NU3RyaW5nPyBzZXNzaW9uSWQpOworICBbUmFpc2VzRXhjZXB0aW9uXSB2b2lkIGNhbmNlbEtleVJlcXVlc3QoRE9NU3RyaW5nIGtleVN5c3RlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERPTVN0cmluZz8gc2Vzc2lvbklkKTsKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfbWVzc2FnZV9ldmVudC5pZGwgYi9zcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfbWVzc2FnZV9ldmVudC5pZGwKaW5kZXggMmIwNmM1Zi4uYzc3MzhkMyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vbWVkaWFfa2V5X21lc3NhZ2VfZXZlbnQuaWRsCisrKyBiL3NyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9tZXNzYWdlX2V2ZW50LmlkbApAQCAtMTIsMjAgKzEyLDcgQEAKIC8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCi0vKgotZW51bSBNZWRpYUtleU1lc3NhZ2VUeXBlIHsKLSAgImxpY2Vuc2UtcmVxdWVzdCIsCi0gICJsaWNlbnNlLXJlbmV3YWwiLAotICAibGljZW5zZS1yZWxlYXNlIiwKLSAgImluZGl2aWR1YWxpemF0aW9uLXJlcXVlc3QiCi19OwotCi1bQ29uc3RydWN0b3IgKERPTVN0cmluZyB0eXBlLCBvcHRpb25hbCBNZWRpYUtleU1lc3NhZ2VFdmVudEluaXQgZXZlbnRJbml0RGljdCldCi1pbnRlcmZhY2UgTWVkaWFLZXlNZXNzYWdlRXZlbnQgOiBFdmVudCB7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBNZWRpYUtleU1lc3NhZ2VUeXBlIG1lc3NhZ2VUeXBlOwotICByZWFkb25seSBhdHRyaWJ1dGUgQXJyYXlCdWZmZXIgbWVzc2FnZTsKLX07Ci0qLworLy8gaHR0cHM6Ly9kdmNzLnczLm9yZy9oZy9odG1sLW1lZGlhL3Jhdy1maWxlL2VtZS12MC4xYi9lbmNyeXB0ZWQtbWVkaWEvZW5jcnlwdGVkLW1lZGlhLmh0bWwjZG9tLW1lZGlha2V5bWVzc2FnZWV2ZW50CiAKIGludGVyZmFjZSBNZWRpYUtleU1lc3NhZ2VFdmVudCA6IEV2ZW50IHsKICAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyBrZXlTeXN0ZW07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfbmVlZGVkX2V2ZW50LmlkbCBiL3NyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9uZWVkZWRfZXZlbnQuaWRsCmluZGV4IGM2OWYyYzcuLmQ5ZWRhMWUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9uZWVkZWRfZXZlbnQuaWRsCisrKyBiL3NyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9uZWVkZWRfZXZlbnQuaWRsCkBAIC0xMiw2ICsxMiw4IEBACiAvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAorLy8gaHR0cHM6Ly9kdmNzLnczLm9yZy9oZy9odG1sLW1lZGlhL3Jhdy1maWxlL2VtZS12MC4xYi9lbmNyeXB0ZWQtbWVkaWEvZW5jcnlwdGVkLW1lZGlhLmh0bWwjZG9tLW1lZGlha2V5bmVlZGVkZXZlbnQKKwogaW50ZXJmYWNlIE1lZGlhS2V5TmVlZGVkRXZlbnQgOiBFdmVudCB7CiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcga2V5U3lzdGVtOwogICByZWFkb25seSBhdHRyaWJ1dGUgRE9NU3RyaW5nIHNlc3Npb25JZDsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9zZXNzaW9uLmlkbCBiL3NyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9zZXNzaW9uLmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBiNjM0NC4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfc2Vzc2lvbi5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAxNi9DUi1lbmNyeXB0ZWQtbWVkaWEtMjAxNjA3MDUvI21lZGlha2V5c2Vzc2lvbi1pbnRlcmZhY2UKLQotaW50ZXJmYWNlIE1lZGlhS2V5U2Vzc2lvbiA6IEV2ZW50VGFyZ2V0IHsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyBzZXNzaW9uSWQ7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSB1bnJlc3RyaWN0ZWQgZG91YmxlIGV4cGlyYXRpb247Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBQcm9taXNlPHZvaWQ+IGNsb3NlZDsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIE1lZGlhS2V5U3RhdHVzTWFwIGtleVN0YXR1c2VzOwotICBhdHRyaWJ1dGUgRXZlbnRIYW5kbGVyIG9ua2V5c3RhdHVzZXNjaGFuZ2U7Ci0gIGF0dHJpYnV0ZSBFdmVudEhhbmRsZXIgb25tZXNzYWdlOwotICBQcm9taXNlPHZvaWQ+IGdlbmVyYXRlUmVxdWVzdChET01TdHJpbmcgaW5pdERhdGFUeXBlLCBCdWZmZXJTb3VyY2UgaW5pdERhdGEpOwotICBQcm9taXNlPGJvb2xlYW4+IGxvYWQoRE9NU3RyaW5nIHNlc3Npb25JZCk7Ci0gIFByb21pc2U8dm9pZD4gdXBkYXRlKEJ1ZmZlclNvdXJjZSByZXNwb25zZSk7Ci0gIFByb21pc2U8dm9pZD4gY2xvc2UoKTsKLSAgUHJvbWlzZTx2b2lkPiByZW1vdmUoKTsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfc3RhdHVzLmlkbCBiL3NyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9zdGF0dXMuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODMyMTVhLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9zdGF0dXMuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTYvQ1ItZW5jcnlwdGVkLW1lZGlhLTIwMTYwNzA1LyNtZWRpYWtleXN0YXR1c21hcC1pbnRlcmZhY2UKLQotZW51bSBNZWRpYUtleVN0YXR1cyB7Ci0gICAgInVzYWJsZSIsCi0gICAgImV4cGlyZWQiLAotICAgICJyZWxlYXNlZCIsCi0gICAgIm91dHB1dC1yZXN0cmljdGVkIiwKLSAgICAib3V0cHV0LWRvd25zY2FsZWQiLAotICAgICJzdGF0dXMtcGVuZGluZyIsCi0gICAgImludGVybmFsLWVycm9yIgotfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9zdGF0dXNfbWFwLmggYi9zcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfc3RhdHVzX21hcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTRiMGY2Li4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9zdGF0dXNfbWFwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaWZuZGVmIENPQkFMVF9ET01fTUVESUFfS0VZX1NUQVRVU19NQVBfSF8KLSNkZWZpbmUgQ09CQUxUX0RPTV9NRURJQV9LRVlfU1RBVFVTX01BUF9IXwotCi0jaW5jbHVkZSAiYmFzZS9iYXNpY3R5cGVzLmgiCi0jaW5jbHVkZSAiY29iYWx0L2RvbS9hcnJheV9idWZmZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvZG9tL2FycmF5X2J1ZmZlcl92aWV3LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC91bmlvbl90eXBlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC92YWx1ZV9oYW5kbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBkb20gewotCi1jbGFzcyBNZWRpYUtleVN0YXR1c01hcCA6IHB1YmxpYyBzY3JpcHQ6OldyYXBwYWJsZSB7Ci0gcHVibGljOgotICB0eXBlZGVmIHNjcmlwdDo6VW5pb25UeXBlMjxzY29wZWRfcmVmcHRyPEFycmF5QnVmZmVyVmlldz4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlZF9yZWZwdHI8QXJyYXlCdWZmZXI+ID4gQnVmZmVyU291cmNlOwotICB1aW50MzJfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gMDsgfQotICBib29sIEhhcyhCdWZmZXJTb3VyY2Uga2V5SWQpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gIGNvbnN0IHNjcmlwdDo6VmFsdWVIYW5kbGVIb2xkZXIqIEdldChCdWZmZXJTb3VyY2Uga2V5SWQpIGNvbnN0IHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIERFRklORV9XUkFQUEFCTEVfVFlQRShNZWRpYUtleVN0YXR1c01hcCk7Ci0KLSBwcml2YXRlOgotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGRvbQotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAotCi0jZW5kaWYgIC8vIENPQkFMVF9ET01fTUVESUFfS0VZX1NUQVRVU19NQVBfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9zdGF0dXNfbWFwLmlkbCBiL3NyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9zdGF0dXNfbWFwLmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNiYjk2Mi4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfc3RhdHVzX21hcC5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAxNi9DUi1lbmNyeXB0ZWQtbWVkaWEtMjAxNjA3MDUvI21lZGlha2V5c3RhdHVzbWFwLWludGVyZmFjZQotCi1lbnVtIE1lZGlhS2V5U3RhdHVzIHsKLSAgICAidXNhYmxlIiwKLSAgICAiZXhwaXJlZCIsCi0gICAgInJlbGVhc2VkIiwKLSAgICAib3V0cHV0LXJlc3RyaWN0ZWQiLAotICAgICJvdXRwdXQtZG93bnNjYWxlZCIsCi0gICAgInN0YXR1cy1wZW5kaW5nIiwKLSAgICAiaW50ZXJuYWwtZXJyb3IiCi19OwotCi0vL2NhbGxiYWNrIE1lZGlhS2V5U3RhdHVzTWFwRm9yRWFjaENhbGxiYWNrID0KLS8vICAgIHZvaWQoTWVkaWFLZXlTdGF0dXMgc3RhdHVzLCBCdWZmZXJTb3VyY2Ugc291cmNlLCBNZWRpYUtleVN0YXR1c01hcCBtYXApOwotCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvV2ViSURMLTEvI2NvbW1vbi1CdWZmZXJTb3VyY2UKLXR5cGVkZWYgKEFycmF5QnVmZmVyVmlldyBvciBBcnJheUJ1ZmZlcikgQnVmZmVyU291cmNlOwotCi1pbnRlcmZhY2UgTWVkaWFLZXlTdGF0dXNNYXAgewotICByZWFkb25seSBhdHRyaWJ1dGUgdW5zaWduZWQgbG9uZyBzaXplOwotICBib29sZWFuIGhhcyhCdWZmZXJTb3VyY2Uga2V5SWQpOwotICBhbnkgZ2V0KEJ1ZmZlclNvdXJjZSBrZXlJZCk7Ci0KLSAgLy8gaXRlcmFibGU8QnVmZmVyU291cmNlLCBNZWRpYUtleVN0YXR1cz47Ci0gIC8vb2JqZWN0IGVudHJpZXMoKTsKLSAgLy92b2lkIGZvckVhY2goZnVuY3Rpb24gTWVkaWFLZXlTdGF0dXNNYXBGb3JFYWNoQ2FsbGJhY2spOwotICAvL29iamVjdCBrZXlzKCk7Ci0gIC8vb2JqZWN0IHZhbHVlcygpOwotICAvL0l0ZXJhdG9yIEBAaXRlcmF0b3IoKTsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfc3lzdGVtX2NvbmZpZ3VyYXRpb24uaWRsIGIvc3JjL2NvYmFsdC9kb20vbWVkaWFfa2V5X3N5c3RlbV9jb25maWd1cmF0aW9uLmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFjMzAzYi4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfc3lzdGVtX2NvbmZpZ3VyYXRpb24uaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTYvQ1ItZW5jcnlwdGVkLW1lZGlhLTIwMTYwNzA1LyNtZWRpYWtleXN5c3RlbWNvbmZpZ3VyYXRpb24tZGljdGlvbmFyeQotCi1kaWN0aW9uYXJ5IE1lZGlhS2V5U3lzdGVtQ29uZmlndXJhdGlvbiB7Ci0gIERPTVN0cmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9ICIiOwotICBzZXF1ZW5jZTxET01TdHJpbmc+ICAgICAgICAgICAgICAgICAgICAgaW5pdERhdGFUeXBlcyA9IFtdOwotICBzZXF1ZW5jZTxNZWRpYUtleVN5c3RlbU1lZGlhQ2FwYWJpbGl0eT4gYXVkaW9DYXBhYmlsaXRpZXMgPSBbXTsKLSAgc2VxdWVuY2U8TWVkaWFLZXlTeXN0ZW1NZWRpYUNhcGFiaWxpdHk+IHZpZGVvQ2FwYWJpbGl0aWVzID0gW107Ci0gIE1lZGlhS2V5c1JlcXVpcmVtZW50ICAgICAgICAgICAgICAgICAgICBkaXN0aW5jdGl2ZUlkZW50aWZpZXIgPSAib3B0aW9uYWwiOwotICBNZWRpYUtleXNSZXF1aXJlbWVudCAgICAgICAgICAgICAgICAgICAgcGVyc2lzdGVudFN0YXRlID0gIm9wdGlvbmFsIjsKLSAgc2VxdWVuY2U8RE9NU3RyaW5nPiAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25UeXBlczsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9tZWRpYV9zb3VyY2UuY2MgYi9zcmMvY29iYWx0L2RvbS9tZWRpYV9zb3VyY2UuY2MKaW5kZXggMjBjYzcwNS4uZDgzMzBjYiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vbWVkaWFfc291cmNlLmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL21lZGlhX3NvdXJjZS5jYwpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgImNvYmFsdC9kb20vZG9tX3NldHRpbmdzLmgiCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9ldmVudC5oIgogI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9jYW5fcGxheV90eXBlX2hhbmRsZXIuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvZG91YmxlLmgiCiAKIG5hbWVzcGFjZSBjb2JhbHQgewogbmFtZXNwYWNlIGRvbSB7CkBAIC0xMDAsNyArMTAxLDcgQEAKIAogdm9pZCBNZWRpYVNvdXJjZTo6c2V0X2R1cmF0aW9uKGRvdWJsZSBkdXJhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlKiBleGNlcHRpb25fc3RhdGUpIHsKLSAgaWYgKGR1cmF0aW9uIDwgMC4wIHx8IGlzbmFuKGR1cmF0aW9uKSkgeworICBpZiAoZHVyYXRpb24gPCAwLjAgfHwgU2JEb3VibGVJc05hbihkdXJhdGlvbikpIHsKICAgICBET01FeGNlcHRpb246OlJhaXNlKERPTUV4Y2VwdGlvbjo6a0ludmFsaWRBY2Nlc3NFcnIsIGV4Y2VwdGlvbl9zdGF0ZSk7CiAgICAgcmV0dXJuOwogICB9CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9tZWRpYV9zb3VyY2UvbWVkaWFfc291cmNlLmNjIGIvc3JjL2NvYmFsdC9kb20vbWVkaWFfc291cmNlL21lZGlhX3NvdXJjZS5jYwppbmRleCBjODdmZGI1Li5jM2ZhYjkxIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9tZWRpYV9zb3VyY2UvbWVkaWFfc291cmNlLmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL21lZGlhX3NvdXJjZS9tZWRpYV9zb3VyY2UuY2MKQEAgLTU4LDYgKzU4LDcgQEAKICNpbmNsdWRlICJjb2JhbHQvZG9tL2RvbV9zZXR0aW5ncy5oIgogI2luY2x1ZGUgImNvYmFsdC9kb20vZXZlbnQuaCIKICNpbmNsdWRlICJjb2JhbHQvbWVkaWEvYmFzZS9waXBlbGluZV9zdGF0dXMuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvZG91YmxlLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL21lZGlhLmgiCiAKIG5hbWVzcGFjZSBjb2JhbHQgewpAQCAtMTQxLDcgKzE0Miw3IEBACiAKIHZvaWQgTWVkaWFTb3VyY2U6OnNldF9kdXJhdGlvbihkb3VibGUgZHVyYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0OjpFeGNlcHRpb25TdGF0ZSogZXhjZXB0aW9uX3N0YXRlKSB7Ci0gIGlmIChkdXJhdGlvbiA8IDAuMCB8fCBpc25hbihkdXJhdGlvbikpIHsKKyAgaWYgKGR1cmF0aW9uIDwgMC4wIHx8IFNiRG91YmxlSXNOYW4oZHVyYXRpb24pKSB7CiAgICAgRE9NRXhjZXB0aW9uOjpSYWlzZShET01FeGNlcHRpb246OmtJbmRleFNpemVFcnIsIGV4Y2VwdGlvbl9zdGF0ZSk7CiAgICAgcmV0dXJuOwogICB9CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9uYXZpZ2F0b3IuY2MgYi9zcmMvY29iYWx0L2RvbS9uYXZpZ2F0b3IuY2MKaW5kZXggMTg1Mzg1Yy4uYjU2NzI2MiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vbmF2aWdhdG9yLmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL25hdmlnYXRvci5jYwpAQCAtMTQsNyArMTQsMTIgQEAKIAogI2luY2x1ZGUgImNvYmFsdC9kb20vbmF2aWdhdG9yLmgiCiAKKyNpbmNsdWRlICJjb2JhbHQvZG9tL2RvbV9leGNlcHRpb24uaCIKKyNpZiBkZWZpbmVkKENPQkFMVF9NRURJQV9TT1VSQ0VfMjAxNikKKyNpbmNsdWRlICJjb2JhbHQvZG9tL2VtZS9tZWRpYV9rZXlfc3lzdGVtX2FjY2Vzcy5oIgorI2VuZGlmICAvLyBkZWZpbmVkKENPQkFMVF9NRURJQV9TT1VSQ0VfMjAxNikKICNpbmNsdWRlICJjb2JhbHQvbWVkaWFfc2Vzc2lvbi9tZWRpYV9zZXNzaW9uX2NsaWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlX2ZhY3RvcnkuaCIKIAogdXNpbmcgY29iYWx0OjptZWRpYV9zZXNzaW9uOjpNZWRpYVNlc3Npb247CiAKQEAgLTQ3LDEwICs1Miw3NSBAQAogICByZXR1cm4gcGx1Z2luc187CiB9CiAKLWNvbnN0IHNjb3BlZF9yZWZwdHI8Y29iYWx0OjptZWRpYV9zZXNzaW9uOjpNZWRpYVNlc3Npb24+JgotTmF2aWdhdG9yOjptZWRpYV9zZXNzaW9uKCkgY29uc3QgeworY29uc3Qgc2NvcGVkX3JlZnB0cjxtZWRpYV9zZXNzaW9uOjpNZWRpYVNlc3Npb24+JiBOYXZpZ2F0b3I6Om1lZGlhX3Nlc3Npb24oKQorICAgIGNvbnN0IHsKICAgcmV0dXJuIG1lZGlhX3Nlc3Npb25fOwogfQogCisjaWYgZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCisKK25hbWVzcGFjZSB7CisKKy8vIFRPRE86IEltcGxlbWVudCAiMy4xLjEuMSBHZXQgU3VwcG9ydGVkIENvbmZpZ3VyYXRpb24iIHVzaW5nCisvLyAgICAgICBTYk1lZGlhQ2FuUGxheU1pbWVBbmRLZXlTeXN0ZW0oKS4KKy8vICAgICAgIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9lbmNyeXB0ZWQtbWVkaWEvI2dldC1zdXBwb3J0ZWQtY29uZmlndXJhdGlvbgorYm9vbCBNYXliZUdldFN1cHBvcnRlZENvbmZpZ3VyYXRpb24oCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIC8qa2V5X3N5c3RlbSovLAorICAgIGNvbnN0IGVtZTo6TWVkaWFLZXlTeXN0ZW1Db25maWd1cmF0aW9uJiBjYW5kaWRhdGVfY29uZmlndXJhdGlvbiwKKyAgICBlbWU6Ok1lZGlhS2V5U3lzdGVtQ29uZmlndXJhdGlvbiogc3VwcG9ydGVkX2NvbmZpZ3VyYXRpb24pIHsKKyAgKnN1cHBvcnRlZF9jb25maWd1cmF0aW9uID0gY2FuZGlkYXRlX2NvbmZpZ3VyYXRpb247CisgIHJldHVybiB0cnVlOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gU2VlCisvLyBodHRwczovL3d3dy53My5vcmcvVFIvZW5jcnlwdGVkLW1lZGlhLyNkb20tbmF2aWdhdG9yLXJlcXVlc3RtZWRpYWtleXN5c3RlbWFjY2Vzcy4KK3Njb3BlZF9wdHI8TmF2aWdhdG9yOjpJbnRlcmZhY2VQcm9taXNlVmFsdWU+CitOYXZpZ2F0b3I6OlJlcXVlc3RNZWRpYUtleVN5c3RlbUFjY2VzcygKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYga2V5X3N5c3RlbSwKKyAgICBjb25zdCBzY3JpcHQ6OlNlcXVlbmNlPGVtZTo6TWVkaWFLZXlTeXN0ZW1Db25maWd1cmF0aW9uPiYKKyAgICAgICAgc3VwcG9ydGVkX2NvbmZpZ3VyYXRpb25zKSB7CisgIHNjb3BlZF9wdHI8SW50ZXJmYWNlUHJvbWlzZVZhbHVlPiBwcm9taXNlID0KKyAgICAgIHNjcmlwdF92YWx1ZV9mYWN0b3J5XworICAgICAgICAgIC0+Q3JlYXRlSW50ZXJmYWNlUHJvbWlzZTxzY29wZWRfcmVmcHRyPGVtZTo6TWVkaWFLZXlTeXN0ZW1BY2Nlc3M+ID4oKTsKKyAgSW50ZXJmYWNlUHJvbWlzZVZhbHVlOjpTdHJvbmdSZWZlcmVuY2UgcHJvbWlzZV9yZWZlcmVuY2UoKnByb21pc2UpOworCisgIC8vIDEuIElmIHxrZXlTeXN0ZW18IGlzIHRoZSBlbXB0eSBzdHJpbmcsIHJldHVybiBhIHByb21pc2UgcmVqZWN0ZWQKKyAgLy8gICAgd2l0aCBhIG5ld2x5IGNyZWF0ZWQgVHlwZUVycm9yLgorICAvLyAyLiBJZiB8c3VwcG9ydGVkQ29uZmlndXJhdGlvbnN8IGlzIGVtcHR5LCByZXR1cm4gYSBwcm9taXNlIHJlamVjdGVkCisgIC8vICAgIHdpdGggYSBuZXdseSBjcmVhdGVkIFR5cGVFcnJvci4KKyAgaWYgKGtleV9zeXN0ZW0uZW1wdHkoKSB8fCBzdXBwb3J0ZWRfY29uZmlndXJhdGlvbnMuZW1wdHkoKSkgeworICAgIHByb21pc2VfcmVmZXJlbmNlLnZhbHVlKCkuUmVqZWN0KHNjcmlwdDo6a1R5cGVFcnJvcik7CisgICAgcmV0dXJuIHByb21pc2UuUGFzcygpOworICB9CisKKyAgLy8gNi4zLiBGb3IgZWFjaCB2YWx1ZSBpbiB8c3VwcG9ydGVkQ29uZmlndXJhdGlvbnN8OgorICBmb3IgKHNpemVfdCBjb25maWd1cmF0aW9uX2luZGV4ID0gMDsKKyAgICAgICBjb25maWd1cmF0aW9uX2luZGV4IDwgc3VwcG9ydGVkX2NvbmZpZ3VyYXRpb25zLnNpemUoKTsKKyAgICAgICArK2NvbmZpZ3VyYXRpb25faW5kZXgpIHsKKyAgICAvLyA2LjMuMy4gSWYgc3VwcG9ydGVkIGNvbmZpZ3VyYXRpb24gaXMgbm90IE5vdFN1cHBvcnRlZDoKKyAgICBlbWU6Ok1lZGlhS2V5U3lzdGVtQ29uZmlndXJhdGlvbiBzdXBwb3J0ZWRfY29uZmlndXJhdGlvbjsKKyAgICBpZiAoTWF5YmVHZXRTdXBwb3J0ZWRDb25maWd1cmF0aW9uKAorICAgICAgICAgICAga2V5X3N5c3RlbSwgc3VwcG9ydGVkX2NvbmZpZ3VyYXRpb25zLmF0KGNvbmZpZ3VyYXRpb25faW5kZXgpLAorICAgICAgICAgICAgJnN1cHBvcnRlZF9jb25maWd1cmF0aW9uKSkgeworICAgICAgLy8gNi4zLjMuMS4gTGV0IGFjY2VzcyBiZSBhIG5ldyBNZWRpYUtleVN5c3RlbUFjY2VzcyBvYmplY3QuCisgICAgICBzY29wZWRfcmVmcHRyPGVtZTo6TWVkaWFLZXlTeXN0ZW1BY2Nlc3M+IG1lZGlhX2tleV9zeXN0ZW1fYWNjZXNzKAorICAgICAgICAgIG5ldyBlbWU6Ok1lZGlhS2V5U3lzdGVtQWNjZXNzKGtleV9zeXN0ZW0sIHN1cHBvcnRlZF9jb25maWd1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdF92YWx1ZV9mYWN0b3J5XykpOworICAgICAgLy8gNi4zLjMuMi4gUmVzb2x2ZSBwcm9taXNlLgorICAgICAgcHJvbWlzZV9yZWZlcmVuY2UudmFsdWUoKS5SZXNvbHZlKG1lZGlhX2tleV9zeXN0ZW1fYWNjZXNzKTsKKyAgICAgIHJldHVybiBwcm9taXNlLlBhc3MoKTsKKyAgICB9CisgIH0KKworICAvLyA2LjQuIFJlamVjdCBwcm9taXNlIHdpdGggYSBOb3RTdXBwb3J0ZWRFcnJvci4KKyAgcHJvbWlzZV9yZWZlcmVuY2UudmFsdWUoKS5SZWplY3QoCisgICAgICBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbjo6a05vdFN1cHBvcnRlZEVycikpOworICByZXR1cm4gcHJvbWlzZS5QYXNzKCk7Cit9CisKKyNlbmRpZiAgLy8gZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCisKIH0gIC8vIG5hbWVzcGFjZSBkb20KIH0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL25hdmlnYXRvci5oIGIvc3JjL2NvYmFsdC9kb20vbmF2aWdhdG9yLmgKaW5kZXggYTk2MjgwMy4uNzQwZjllYiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vbmF2aWdhdG9yLmgKKysrIGIvc3JjL2NvYmFsdC9kb20vbmF2aWdhdG9yLmgKQEAgLTE4LDkgKzE4LDEzIEBACiAjaW5jbHVkZSA8c3RyaW5nPgogCiAjaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKKyNpZiBkZWZpbmVkKENPQkFMVF9NRURJQV9TT1VSQ0VfMjAxNikKKyNpbmNsdWRlICJjb2JhbHQvZG9tL2VtZS9tZWRpYV9rZXlfc3lzdGVtX2NvbmZpZ3VyYXRpb24uaCIKKyNlbmRpZiAgLy8gZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9taW1lX3R5cGVfYXJyYXkuaCIKICNpbmNsdWRlICJjb2JhbHQvZG9tL3BsdWdpbl9hcnJheS5oIgogI2luY2x1ZGUgImNvYmFsdC9tZWRpYV9zZXNzaW9uL21lZGlhX3Nlc3Npb24uaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Byb21pc2UuaCIKICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF92YWx1ZV9mYWN0b3J5LmgiCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKIApAQCAtNTQsNiArNTgsMTYgQEAKICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxjb2JhbHQ6Om1lZGlhX3Nlc3Npb246Ok1lZGlhU2Vzc2lvbj4mIG1lZGlhX3Nlc3Npb24oKQogICAgICAgY29uc3Q7CiAKKyNpZiBkZWZpbmVkKENPQkFMVF9NRURJQV9TT1VSQ0VfMjAxNikKKyAgLy8gV2ViIEFQSTogZXh0ZW5zaW9uIGRlZmluZWQgaW4gRW5jcnlwdGVkIE1lZGlhIEV4dGVuc2lvbnMgKDE2IE1hcmNoIDIwMTcpLgorICB0eXBlZGVmIHNjcmlwdDo6U2NyaXB0VmFsdWU8c2NyaXB0OjpQcm9taXNlPAorICAgICAgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4gPiA+IEludGVyZmFjZVByb21pc2VWYWx1ZTsKKyAgc2NvcGVkX3B0cjxJbnRlcmZhY2VQcm9taXNlVmFsdWU+IFJlcXVlc3RNZWRpYUtleVN5c3RlbUFjY2VzcygKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlfc3lzdGVtLAorICAgICAgY29uc3Qgc2NyaXB0OjpTZXF1ZW5jZTxlbWU6Ok1lZGlhS2V5U3lzdGVtQ29uZmlndXJhdGlvbj4mCisgICAgICAgICAgc3VwcG9ydGVkX2NvbmZpZ3VyYXRpb25zKTsKKyNlbmRpZiAgLy8gZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCisKICAgREVGSU5FX1dSQVBQQUJMRV9UWVBFKE5hdmlnYXRvcik7CiAKICBwcml2YXRlOgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vd2luZG93LmNjIGIvc3JjL2NvYmFsdC9kb20vd2luZG93LmNjCmluZGV4IGEyNzBjOWQuLjU1NGNlMDYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL3dpbmRvdy5jYworKysgYi9zcmMvY29iYWx0L2RvbS93aW5kb3cuY2MKQEAgLTk3LDcgKzk3LDggQEAKICAgICAgICAgICAgICAgIHN5c3RlbV93aW5kb3c6OlN5c3RlbVdpbmRvdyogc3lzdGVtX3dpbmRvdywKICAgICAgICAgICAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8aW5wdXQ6OkNhbWVyYTNEPiYgY2FtZXJhXzNkLAogICAgICAgICAgICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxNZWRpYVNlc3Npb24+JiBtZWRpYV9zZXNzaW9uLAotICAgICAgICAgICAgICAgaW50IGNzcF9pbnNlY3VyZV9hbGxvd2VkX3Rva2VuLCBpbnQgZG9tX21heF9lbGVtZW50X2RlcHRoKQorICAgICAgICAgICAgICAgaW50IGNzcF9pbnNlY3VyZV9hbGxvd2VkX3Rva2VuLCBpbnQgZG9tX21heF9lbGVtZW50X2RlcHRoLAorICAgICAgICAgICAgICAgZmxvYXQgdmlkZW9fcGxheWJhY2tfcmF0ZV9tdWx0aXBsaWVyKQogICAgIDogd2lkdGhfKHdpZHRoKSwKICAgICAgIGhlaWdodF8oaGVpZ2h0KSwKICAgICAgIGh0bWxfZWxlbWVudF9jb250ZXh0XyhuZXcgSFRNTEVsZW1lbnRDb250ZXh0KApAQCAtMTA1LDcgKzEwNiw4IEBACiAgICAgICAgICAgd2ViX21lZGlhX3BsYXllcl9mYWN0b3J5LCBzY3JpcHRfcnVubmVyLCBzY3JpcHRfdmFsdWVfZmFjdG9yeSwKICAgICAgICAgICBtZWRpYV9zb3VyY2VfcmVnaXN0cnksIHJlc291cmNlX3Byb3ZpZGVyLCBhbmltYXRlZF9pbWFnZV90cmFja2VyLAogICAgICAgICAgIGltYWdlX2NhY2hlLCByZWR1Y2VkX2ltYWdlX2NhY2hlX2NhcGFjaXR5X21hbmFnZXIsCi0gICAgICAgICAgcmVtb3RlX3R5cGVmYWNlX2NhY2hlLCBtZXNoX2NhY2hlLCBkb21fc3RhdF90cmFja2VyLCBsYW5ndWFnZSkpLAorICAgICAgICAgIHJlbW90ZV90eXBlZmFjZV9jYWNoZSwgbWVzaF9jYWNoZSwgZG9tX3N0YXRfdHJhY2tlciwgbGFuZ3VhZ2UsCisgICAgICAgICAgdmlkZW9fcGxheWJhY2tfcmF0ZV9tdWx0aXBsaWVyKSksCiAgICAgICBwZXJmb3JtYW5jZV8obmV3IFBlcmZvcm1hbmNlKG5ldyBiYXNlOjpTeXN0ZW1Nb25vdG9uaWNDbG9jaygpKSksCiAgICAgICBBTExPV19USElTX0lOX0lOSVRJQUxJWkVSX0xJU1QoZG9jdW1lbnRfKG5ldyBEb2N1bWVudCgKICAgICAgICAgICBodG1sX2VsZW1lbnRfY29udGV4dF8uZ2V0KCksCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS93aW5kb3cuaCBiL3NyYy9jb2JhbHQvZG9tL3dpbmRvdy5oCmluZGV4IDdhOTBjMDAuLjBmYzE0NGIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL3dpbmRvdy5oCisrKyBiL3NyYy9jb2JhbHQvZG9tL3dpbmRvdy5oCkBAIC0xMzMsNyArMTMzLDggQEAKICAgICAgIHN5c3RlbV93aW5kb3c6OlN5c3RlbVdpbmRvdyogc3lzdGVtX3dpbmRvdywKICAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8aW5wdXQ6OkNhbWVyYTNEPiYgY2FtZXJhXzNkLAogICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxjb2JhbHQ6Om1lZGlhX3Nlc3Npb246Ok1lZGlhU2Vzc2lvbj4mIG1lZGlhX3Nlc3Npb24sCi0gICAgICBpbnQgY3NwX2luc2VjdXJlX2FsbG93ZWRfdG9rZW4gPSAwLCBpbnQgZG9tX21heF9lbGVtZW50X2RlcHRoID0gMCk7CisgICAgICBpbnQgY3NwX2luc2VjdXJlX2FsbG93ZWRfdG9rZW4gPSAwLCBpbnQgZG9tX21heF9lbGVtZW50X2RlcHRoID0gMCwKKyAgICAgIGZsb2F0IHZpZGVvX3BsYXliYWNrX3JhdGVfbXVsdGlwbGllciA9IDEuZik7CiAKICAgLy8gV2ViIEFQSTogV2luZG93CiAgIC8vCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2g1dmNjL2g1dmNjLmd5cCBiL3NyYy9jb2JhbHQvaDV2Y2MvaDV2Y2MuZ3lwCmluZGV4IDZjNWM3YjYuLjFlNzE1MjkgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvaDV2Y2MvaDV2Y2MuZ3lwCisrKyBiL3NyYy9jb2JhbHQvaDV2Y2MvaDV2Y2MuZ3lwCkBAIC05MCw2ICs5MCw5IEBACiAgICAgICAgICAgfSwKICAgICAgICAgfV0sCiAgICAgICBdLAorICAgICAgJ2RlZmluZXMnOiBbCisgICAgICAgICdDT0JBTFRfVVNFUl9PTl9FWElUX1NUUkFURUdZPSI8KGNvYmFsdF91c2VyX29uX2V4aXRfc3RyYXRlZ3kpIicsCisgICAgICBdLAogICAgIH0sCiAKICAgICB7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX3N5c3RlbS5jYyBiL3NyYy9jb2JhbHQvaDV2Y2MvaDV2Y2Nfc3lzdGVtLmNjCmluZGV4IDYwZTM5NmQuLjJiOTYxMTAgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvaDV2Y2MvaDV2Y2Nfc3lzdGVtLmNjCisrKyBiL3NyYy9jb2JhbHQvaDV2Y2MvaDV2Y2Nfc3lzdGVtLmNjCkBAIC02NCw1ICs2NCwyMSBAQAogLy8gcmV0dXJuIGZhbHNlIHRvIGluZGljYXRlIHRoZSBjbGllbnQgc2hvdWxkIGxhdW5jaCB0aGVpciBvd24gZGlhbG9nLgogYm9vbCBINXZjY1N5c3RlbTo6VHJpZ2dlckhlbHAoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQogCit1aW50MzIgSDV2Y2NTeXN0ZW06OnVzZXJfb25fZXhpdF9zdHJhdGVneSgpIGNvbnN0IHsKKyAgLy8gQ29udmVydCBmcm9tIHRoZSBDb2JhbHQgZ3lwIHNldHRpbmcgdmFyaWFibGUncyBlbnVtIG9wdGlvbnMgdG8gdGhlIEg1VkNDCisgIC8vIGludGVyZmFjZSBlbnVtIG9wdGlvbnMuCisgIHN0ZDo6c3RyaW5nIGV4aXRfc3RyYXRlZ3lfc3RyKENPQkFMVF9VU0VSX09OX0VYSVRfU1RSQVRFR1kpOworICBpZiAoZXhpdF9zdHJhdGVneV9zdHIgPT0gInN0b3AiKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFVzZXJPbkV4aXRTdHJhdGVneT4oa1VzZXJPbkV4aXRTdHJhdGVneUNsb3NlKTsKKyAgfSBlbHNlIGlmIChleGl0X3N0cmF0ZWd5X3N0ciA9PSAic3VzcGVuZCIpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VXNlck9uRXhpdFN0cmF0ZWd5PihrVXNlck9uRXhpdFN0cmF0ZWd5TWluaW1pemUpOworICB9IGVsc2UgaWYgKGV4aXRfc3RyYXRlZ3lfc3RyID09ICJub2V4aXQiKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFVzZXJPbkV4aXRTdHJhdGVneT4oa1VzZXJPbkV4aXRTdHJhdGVneU5vRXhpdCk7CisgIH0gZWxzZSB7CisgICAgTk9UUkVBQ0hFRCgpIDw8ICJVbmtub3duIGd5cC1kZWZpbmVkIGV4aXQgc3RyYXRlZ3kuIjsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VXNlck9uRXhpdFN0cmF0ZWd5PihrVXNlck9uRXhpdFN0cmF0ZWd5Q2xvc2UpOworICB9Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBoNXZjYwogfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY19zeXN0ZW0uaCBiL3NyYy9jb2JhbHQvaDV2Y2MvaDV2Y2Nfc3lzdGVtLmgKaW5kZXggZTE5MjU4MS4uNTkyOGVkOCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY19zeXN0ZW0uaAorKysgYi9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX3N5c3RlbS5oCkBAIC0zNSw2ICszNSwxNCBAQAogCiAgIGJvb2wgVHJpZ2dlckhlbHAoKSBjb25zdDsKIAorICBlbnVtIFVzZXJPbkV4aXRTdHJhdGVneSB7CisgICAga1VzZXJPbkV4aXRTdHJhdGVneUNsb3NlLAorICAgIGtVc2VyT25FeGl0U3RyYXRlZ3lNaW5pbWl6ZSwKKyAgICBrVXNlck9uRXhpdFN0cmF0ZWd5Tm9FeGl0LAorICB9OworCisgIHVpbnQzMiB1c2VyX29uX2V4aXRfc3RyYXRlZ3koKSBjb25zdDsKKwogICBERUZJTkVfV1JBUFBBQkxFX1RZUEUoSDV2Y2NTeXN0ZW0pOwogCiAgcHJpdmF0ZToKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvaDV2Y2MvaDV2Y2Nfc3lzdGVtLmlkbCBiL3NyYy9jb2JhbHQvaDV2Y2MvaDV2Y2Nfc3lzdGVtLmlkbAppbmRleCBhMTYxMmU0Li43ODcxMTZkIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX3N5c3RlbS5pZGwKKysrIGIvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY19zeXN0ZW0uaWRsCkBAIC0xOSw0ICsxOSwyMSBAQAogICByZWFkb25seSBhdHRyaWJ1dGUgRE9NU3RyaW5nIHJlZ2lvbjsKICAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyB2ZXJzaW9uOwogICBib29sZWFuIHRyaWdnZXJIZWxwKCk7CisKKyAgLy8gZW51bSBVc2VyT25FeGl0U3RyYXRlZ3kKKyAgLy8KKyAgLy8gV2hlbiBhIHVzZXIgcmVxdWVzdHMgdG8gbGVhdmUgdGhlIGFwcGxpY2F0aW9uLCB3aW5kb3cuY2xvc2UoKSBzaG91bGQgYmUKKyAgLy8gY2FsbGVkLgorICBjb25zdCB1bnNpZ25lZCBsb25nIFVTRVJfT05fRVhJVF9TVFJBVEVHWV9DTE9TRSA9IDA7CisgIC8vIFdoZW4gYSB1c2VyIHJlcXVlc3RzIHRvIGxlYXZlIHRoZSBhcHBsaWNhdGlvbiwgd2luZG93Lm1pbmltaXplKCkgc2hvdWxkIGJlCisgIC8vIGNhbGxlZC4KKyAgY29uc3QgdW5zaWduZWQgbG9uZyBVU0VSX09OX0VYSVRfU1RSQVRFR1lfTUlOSU1JWkUgPSAxOworICAvLyBUaGUgdXNlciBzaG91bGQgbm90IGJlIGFsbG93ZWQgdG8gaW5pdGlhdGUgYW4gYXBwbGljYXRpb24gZXhpdCByZXF1ZXN0LgorICBjb25zdCB1bnNpZ25lZCBsb25nIFVTRVJfT05fRVhJVF9TVFJBVEVHWV9OT19FWElUID0gMjsKKworICAvLyBUaGlzIHZhcmlhYmxlIGRlZmluZXMgd2hhdCBDb2JhbHQncyBwcmVmZXJyZWQgc3RyYXRlZ3kgc2hvdWxkIGJlIGZvcgorICAvLyBoYW5kbGluZyBpbnRlcm5hbGx5IHRyaWdnZXJlZCBhcHBsaWNhdGlvbiBleGl0IHJlcXVlc3RzIChlLmcuIHRoZSB1c2VyCisgIC8vIGNob29zZXMgdG8gYmFjayBvdXQgb2YgdGhlIGFwcGxpY2F0aW9uKS4gIFNlZSB0aGUgY29tbWVudHMgaW4gdGhlCisgIC8vIGVudW0gYWJvdmUgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcG9zc2libGUgdmFsdWVzLgorICByZWFkb25seSBhdHRyaWJ1dGUgdW5zaWduZWQgbG9uZyB1c2VyT25FeGl0U3RyYXRlZ3k7CiB9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sYXlvdXQvYm94LmggYi9zcmMvY29iYWx0L2xheW91dC9ib3guaAppbmRleCA0MmNmYzcxLi4zNDg0MjI3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xheW91dC9ib3guaAorKysgYi9zcmMvY29iYWx0L2xheW91dC9ib3guaApAQCAtMjEsNyArMjEsNiBAQAogCiAjaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKICNpbmNsdWRlICJiYXNlL29wdGlvbmFsLmgiCi0jaW5jbHVkZSAiY29iYWx0L2Jhc2UvbWF0aC5oIgogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9jc3NfY29tcHV0ZWRfc3R5bGVfZGVjbGFyYXRpb24uaCIKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vY3NzX3N0eWxlX2RlY2xhcmF0aW9uLmgiCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9ub2RlLmgiCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xheW91dC9sYXlvdXRfdW5pdC5oIGIvc3JjL2NvYmFsdC9sYXlvdXQvbGF5b3V0X3VuaXQuaAppbmRleCBkNjVmMDhkLi5jM2IzNTIwIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xheW91dC9sYXlvdXRfdW5pdC5oCisrKyBiL3NyYy9jb2JhbHQvbGF5b3V0L2xheW91dF91bml0LmgKQEAgLTIzLDcgKzIzLDYgQEAKIAogI2luY2x1ZGUgImJhc2UvYmFzaWN0eXBlcy5oIgogI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL21hdGguaCIKIAogbmFtZXNwYWNlIGNvYmFsdCB7CiBuYW1lc3BhY2UgbGF5b3V0IHsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbGF5b3V0L2xpbmVfYm94LmNjIGIvc3JjL2NvYmFsdC9sYXlvdXQvbGluZV9ib3guY2MKaW5kZXggZTRmM2VlYS4uNDUyZjJiMCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sYXlvdXQvbGluZV9ib3guY2MKKysrIGIvc3JjL2NvYmFsdC9sYXlvdXQvbGluZV9ib3guY2MKQEAgLTE3LDcgKzE3LDYgQEAKICNpbmNsdWRlIDxhbGdvcml0aG0+CiAjaW5jbHVkZSA8bGltaXRzPgogCi0jaW5jbHVkZSAiY29iYWx0L2Jhc2UvbWF0aC5oIgogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9rZXl3b3JkX3ZhbHVlLmgiCiAjaW5jbHVkZSAiY29iYWx0L2xheW91dC9ib3guaCIKICNpbmNsdWRlICJjb2JhbHQvbGF5b3V0L3VzZWRfc3R5bGUuaCIKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbGF5b3V0L3RleHRfYm94LmNjIGIvc3JjL2NvYmFsdC9sYXlvdXQvdGV4dF9ib3guY2MKaW5kZXggYTEzYjFjMC4uMGRkN2U0NCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sYXlvdXQvdGV4dF9ib3guY2MKKysrIGIvc3JjL2NvYmFsdC9sYXlvdXQvdGV4dF9ib3guY2MKQEAgLTE3LDcgKzE3LDYgQEAKICNpbmNsdWRlIDxhbGdvcml0aG0+CiAjaW5jbHVkZSA8bGltaXRzPgogCi0jaW5jbHVkZSAiY29iYWx0L2Jhc2UvbWF0aC5oIgogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9rZXl3b3JkX3ZhbHVlLmgiCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL3NoYWRvd192YWx1ZS5oIgogI2luY2x1ZGUgImNvYmFsdC9sYXlvdXQvcmVuZGVyX3RyZWVfYW5pbWF0aW9ucy5oIgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sb2FkZXIvaW1hZ2UvYW5pbWF0ZWRfd2VicF9pbWFnZS5jYyBiL3NyYy9jb2JhbHQvbG9hZGVyL2ltYWdlL2FuaW1hdGVkX3dlYnBfaW1hZ2UuY2MKaW5kZXggYTZhOTM3My4uZDQzNDQ5ZiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sb2FkZXIvaW1hZ2UvYW5pbWF0ZWRfd2VicF9pbWFnZS5jYworKysgYi9zcmMvY29iYWx0L2xvYWRlci9pbWFnZS9hbmltYXRlZF93ZWJwX2ltYWdlLmNjCkBAIC0xNiw3ICsxNiw4IEBACiAKICNpbmNsdWRlICJjb2JhbHQvbG9hZGVyL2ltYWdlL2FuaW1hdGVkX3dlYnBfaW1hZ2UuaCIKIAotI2luY2x1ZGUgImNvYmFsdC9sb2FkZXIvaW1hZ2Uvd2VicF9pbWFnZV9kZWNvZGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvbG9hZGVyL2ltYWdlL2ltYWdlX2RlY29kZXIuaCIKICNpbmNsdWRlICJjb2JhbHQvcmVuZGVyX3RyZWUvYnJ1c2guaCIKICNpbmNsdWRlICJjb2JhbHQvcmVuZGVyX3RyZWUvY29tcG9zaXRpb25fbm9kZS5oIgogI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJfdHJlZS9pbWFnZV9ub2RlLmgiCkBAIC0xNzAsMTEgKzE3MSwyMiBAQAogICB9CiB9CiAKK25hbWVzcGFjZSB7CisKK3ZvaWQgUmVjb3JkSW1hZ2Uoc2NvcGVkX3JlZnB0cjxyZW5kZXJfdHJlZTo6SW1hZ2U+KiBpbWFnZV9wb2ludGVyLAorICAgICAgICAgICAgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPGxvYWRlcjo6aW1hZ2U6OkltYWdlPiYgaW1hZ2UpIHsKKyAgaW1hZ2U6OlN0YXRpY0ltYWdlKiBzdGF0aWNfaW1hZ2UgPQorICAgICAgYmFzZTo6cG9seW1vcnBoaWNfZG93bmNhc3Q8bG9hZGVyOjppbWFnZTo6U3RhdGljSW1hZ2UqPihpbWFnZS5nZXQoKSk7CisgIERDSEVDSyhzdGF0aWNfaW1hZ2UpOworICAqaW1hZ2VfcG9pbnRlciA9IHN0YXRpY19pbWFnZS0+aW1hZ2UoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKIGJvb2wgQW5pbWF0ZWRXZWJQSW1hZ2U6OkRlY29kZU9uZUZyYW1lKGludCBmcmFtZV9pbmRleCkgewogICBUUkFDS19NRU1PUllfU0NPUEUoIlJlbmRlcmluZyIpOwogICBiYXNlOjpBdXRvTG9jayBsb2NrKGxvY2tfKTsKICAgV2ViUEl0ZXJhdG9yIHdlYnBfaXRlcmF0b3I7Ci0gIFdFQlBJbWFnZURlY29kZXIgd2VicF9pbWFnZV9kZWNvZGVyKHJlc291cmNlX3Byb3ZpZGVyXyk7CiAgIHNjb3BlZF9yZWZwdHI8cmVuZGVyX3RyZWU6OkltYWdlPiBuZXh0X2ZyYW1lX2ltYWdlOwogCiAgIC8vIERlY29kZSB0aGUgY3VycmVudCBmcmFtZS4KQEAgLTE4NSwyNCArMTk3LDE4IEBACiAgICAgaWYgKCF3ZWJwX2l0ZXJhdG9yLmNvbXBsZXRlKSB7CiAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIHdlYnBfaW1hZ2VfZGVjb2Rlci5EZWNvZGVDaHVuayh3ZWJwX2l0ZXJhdG9yLmZyYWdtZW50LmJ5dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWJwX2l0ZXJhdG9yLmZyYWdtZW50LnNpemUpOwotICAgIGlmICghd2VicF9pbWFnZV9kZWNvZGVyLkZpbmlzaFdpdGhTdWNjZXNzKCkpIHsKKworICAgIEltYWdlRGVjb2RlciBpbWFnZV9kZWNvZGVyKAorICAgICAgICByZXNvdXJjZV9wcm92aWRlcl8sIGJhc2U6OkJpbmQoJlJlY29yZEltYWdlLCAmbmV4dF9mcmFtZV9pbWFnZSksCisgICAgICAgIEltYWdlRGVjb2Rlcjo6RXJyb3JDYWxsYmFjaygpLCBJbWFnZURlY29kZXI6OmtJbWFnZVR5cGVXZWJQKTsKKyAgICBpbWFnZV9kZWNvZGVyLkRlY29kZUNodW5rKAorICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih3ZWJwX2l0ZXJhdG9yLmZyYWdtZW50LmJ5dGVzKSwKKyAgICAgICAgd2VicF9pdGVyYXRvci5mcmFnbWVudC5zaXplKTsKKyAgICBpbWFnZV9kZWNvZGVyLkZpbmlzaCgpOworICAgIGlmICghbmV4dF9mcmFtZV9pbWFnZSkgewogICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGRlY29kZSBXZWJQIGltYWdlIGZyYW1lLiI7CiAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotCi0gICAgc2NvcGVkX3B0cjxyZW5kZXJfdHJlZTo6SW1hZ2VEYXRhPiBuZXh0X2ZyYW1lX2RhdGEgPSBBbGxvY2F0ZUltYWdlRGF0YSgKLSAgICAgICAgbWF0aDo6U2l6ZSh3ZWJwX2l0ZXJhdG9yLndpZHRoLCB3ZWJwX2l0ZXJhdG9yLmhlaWdodCkpOwotICAgIERDSEVDSyhuZXh0X2ZyYW1lX2RhdGEpOwotICAgIHsKLSAgICAgIFRSQUNFX0VWRU5UMCgiY29iYWx0Ojpsb2FkZXI6OmltYWdlIiwgIlNiTWVtb3J5Q29weSIpOwotICAgICAgU2JNZW1vcnlDb3B5KG5leHRfZnJhbWVfZGF0YS0+R2V0TWVtb3J5KCksCi0gICAgICAgICAgICAgICAgICAgd2VicF9pbWFnZV9kZWNvZGVyLkdldE9yaWdpbmFsTWVtb3J5KCksCi0gICAgICAgICAgICAgICAgICAgd2VicF9pdGVyYXRvci53aWR0aCAqIHdlYnBfaXRlcmF0b3IuaGVpZ2h0ICoKLSAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyX3RyZWU6OkJ5dGVzUGVyUGl4ZWwocGl4ZWxfZm9ybWF0XykpOwotICAgIH0KLSAgICBuZXh0X2ZyYW1lX2ltYWdlID0gcmVzb3VyY2VfcHJvdmlkZXJfLT5DcmVhdGVJbWFnZShuZXh0X2ZyYW1lX2RhdGEuUGFzcygpKTsKICAgfQogCiAgIC8vIEFscGhhIGJsZW5kIHRoZSBjdXJyZW50IGZyYW1lIG9uIHRvcCBvZiB0aGUgYnVmZmVyLgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sb2FkZXIvaW1hZ2UvaW1hZ2VfZGVjb2Rlci5jYyBiL3NyYy9jb2JhbHQvbG9hZGVyL2ltYWdlL2ltYWdlX2RlY29kZXIuY2MKaW5kZXggODMxYTU3NC4uYTQ0ZjM3MyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sb2FkZXIvaW1hZ2UvaW1hZ2VfZGVjb2Rlci5jYworKysgYi9zcmMvY29iYWx0L2xvYWRlci9pbWFnZS9pbWFnZV9kZWNvZGVyLmNjCkBAIC01MSwyNyArNTEsMTggQEAKICAgcmVzdWx0LT5hcHBlbmQobWVzc2FnZSk7CiB9CiAKLS8vIFRoZSB2YXJpb3VzIHR5cGVzIG9mIGltYWdlcyB3ZSBzdXBwb3J0IGRlY29kaW5nLgotZW51bSBJbWFnZVR5cGUgewotICBrSW1hZ2VUeXBlSW52YWxpZCwKLSAga0ltYWdlVHlwZUdJRiwKLSAga0ltYWdlVHlwZUpQRUcsCi0gIGtJbWFnZVR5cGVQTkcsCi0gIGtJbWFnZVR5cGVXZWJQLAotfTsKLQogLy8gRGV0ZXJtaW5lIHRoZSBJbWFnZVR5cGUgb2YgYW4gaW1hZ2UgZnJvbSBpdHMgc2lnbmF0dXJlLgotSW1hZ2VUeXBlIERldGVybWluZUltYWdlVHlwZShjb25zdCB1aW50OCogaGVhZGVyKSB7CitJbWFnZURlY29kZXI6OkltYWdlVHlwZSBEZXRlcm1pbmVJbWFnZVR5cGUoY29uc3QgdWludDgqIGhlYWRlcikgewogICBpZiAoIW1lbWNtcChoZWFkZXIsICJceEZGXHhEOFx4RkYiLCAzKSkgewotICAgIHJldHVybiBrSW1hZ2VUeXBlSlBFRzsKKyAgICByZXR1cm4gSW1hZ2VEZWNvZGVyOjprSW1hZ2VUeXBlSlBFRzsKICAgfSBlbHNlIGlmICghbWVtY21wKGhlYWRlciwgIkdJRjg3YSIsIDYpIHx8ICFtZW1jbXAoaGVhZGVyLCAiR0lGODlhIiwgNikpIHsKLSAgICByZXR1cm4ga0ltYWdlVHlwZUdJRjsKKyAgICByZXR1cm4gSW1hZ2VEZWNvZGVyOjprSW1hZ2VUeXBlR0lGOwogICB9IGVsc2UgaWYgKCFtZW1jbXAoaGVhZGVyLCAiXHg4OVx4NTBceDRFXHg0N1x4MERceDBBXHgxQVx4MEEiLCA4KSkgewotICAgIHJldHVybiBrSW1hZ2VUeXBlUE5HOworICAgIHJldHVybiBJbWFnZURlY29kZXI6OmtJbWFnZVR5cGVQTkc7CiAgIH0gZWxzZSBpZiAoIW1lbWNtcChoZWFkZXIsICJSSUZGIiwgNCkgJiYgIW1lbWNtcChoZWFkZXIgKyA4LCAiV0VCUFZQIiwgNikpIHsKLSAgICByZXR1cm4ga0ltYWdlVHlwZVdlYlA7CisgICAgcmV0dXJuIEltYWdlRGVjb2Rlcjo6a0ltYWdlVHlwZVdlYlA7CiAgIH0gZWxzZSB7Ci0gICAgcmV0dXJuIGtJbWFnZVR5cGVJbnZhbGlkOworICAgIHJldHVybiBJbWFnZURlY29kZXI6OmtJbWFnZVR5cGVJbnZhbGlkOwogICB9CiB9CiAKQEAgLTgzLDkgKzc0LDIyIEBACiAgICAgOiByZXNvdXJjZV9wcm92aWRlcl8ocmVzb3VyY2VfcHJvdmlkZXIpLAogICAgICAgc3VjY2Vzc19jYWxsYmFja18oc3VjY2Vzc19jYWxsYmFjayksCiAgICAgICBlcnJvcl9jYWxsYmFja18oZXJyb3JfY2FsbGJhY2spLAorICAgICAgaW1hZ2VfdHlwZV8oa0ltYWdlVHlwZUludmFsaWQpLAogICAgICAgc3RhdGVfKHJlc291cmNlX3Byb3ZpZGVyXyA/IGtXYWl0aW5nRm9ySGVhZGVyIDoga1N1c3BlbmRlZCksCiAgICAgICBpc19kZWxldGlvbl9wZW5kaW5nXyhmYWxzZSkgewotICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6bG9hZGVyOjppbWFnZSIsICJJbWFnZURlY29kZXI6OkltYWdlRGVjb2RlcigpIik7CisgIHNpZ25hdHVyZV9jYWNoZV8ucG9zaXRpb24gPSAwOworfQorCitJbWFnZURlY29kZXI6OkltYWdlRGVjb2RlcihyZW5kZXJfdHJlZTo6UmVzb3VyY2VQcm92aWRlciogcmVzb3VyY2VfcHJvdmlkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdWNjZXNzQ2FsbGJhY2smIHN1Y2Nlc3NfY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFcnJvckNhbGxiYWNrJiBlcnJvcl9jYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEltYWdlVHlwZSBpbWFnZV90eXBlKQorICAgIDogcmVzb3VyY2VfcHJvdmlkZXJfKHJlc291cmNlX3Byb3ZpZGVyKSwKKyAgICAgIHN1Y2Nlc3NfY2FsbGJhY2tfKHN1Y2Nlc3NfY2FsbGJhY2spLAorICAgICAgZXJyb3JfY2FsbGJhY2tfKGVycm9yX2NhbGxiYWNrKSwKKyAgICAgIGltYWdlX3R5cGVfKGltYWdlX3R5cGUpLAorICAgICAgc3RhdGVfKHJlc291cmNlX3Byb3ZpZGVyXyA/IGtXYWl0aW5nRm9ySGVhZGVyIDoga1N1c3BlbmRlZCksCisgICAgICBpc19kZWxldGlvbl9wZW5kaW5nXyhmYWxzZSkgewogICBzaWduYXR1cmVfY2FjaGVfLnBvc2l0aW9uID0gMDsKIH0KIApAQCAtMjY5LDE3ICsyNzMsMTcgQEAKIG5hbWVzcGFjZSB7CiAjaWYgZGVmaW5lZChTVEFSQk9BUkQpCiAjaWYgU0JfVkVSU0lPTigzKSAmJiBTQl9IQVMoR1JBUEhJQ1MpCi1jb25zdCBjaGFyKiBHZXRNaW1lVHlwZUZyb21JbWFnZVR5cGUoSW1hZ2VUeXBlIGltYWdlX3R5cGUpIHsKK2NvbnN0IGNoYXIqIEdldE1pbWVUeXBlRnJvbUltYWdlVHlwZShJbWFnZURlY29kZXI6OkltYWdlVHlwZSBpbWFnZV90eXBlKSB7CiAgIHN3aXRjaCAoaW1hZ2VfdHlwZSkgewotICAgIGNhc2Uga0ltYWdlVHlwZUpQRUc6CisgICAgY2FzZSBJbWFnZURlY29kZXI6OmtJbWFnZVR5cGVKUEVHOgogICAgICAgcmV0dXJuICJpbWFnZS9qcGVnIjsKLSAgICBjYXNlIGtJbWFnZVR5cGVQTkc6CisgICAgY2FzZSBJbWFnZURlY29kZXI6OmtJbWFnZVR5cGVQTkc6CiAgICAgICByZXR1cm4gImltYWdlL3BuZyI7Ci0gICAgY2FzZSBrSW1hZ2VUeXBlR0lGOgorICAgIGNhc2UgSW1hZ2VEZWNvZGVyOjprSW1hZ2VUeXBlR0lGOgogICAgICAgcmV0dXJuICJpbWFnZS9naWYiOwotICAgIGNhc2Uga0ltYWdlVHlwZVdlYlA6CisgICAgY2FzZSBJbWFnZURlY29kZXI6OmtJbWFnZVR5cGVXZWJQOgogICAgICAgcmV0dXJuICJpbWFnZS93ZWJwIjsKLSAgICBjYXNlIGtJbWFnZVR5cGVJbnZhbGlkOgorICAgIGNhc2UgSW1hZ2VEZWNvZGVyOjprSW1hZ2VUeXBlSW52YWxpZDoKICAgICAgIHJldHVybiBOVUxMOwogICAgIGRlZmF1bHQ6IHsgTk9UUkVBQ0hFRCgpOyB9CiAgIH0KQEAgLTI4OCw3ICsyOTIsNyBAQAogCiAvLyBJZiB8bWltZV90eXBlfCBpcyBlbXB0eSwgfGltYWdlX3R5cGV8IHdpbGwgYmUgdXNlZCB0byBkZWR1Y2UgdGhlIG1pbWUgdHlwZS4KIHNjb3BlZF9wdHI8SW1hZ2VEYXRhRGVjb2Rlcj4gTWF5YmVDcmVhdGVTdGFyYm9hcmREZWNvZGVyKAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtaW1lX3R5cGUsIEltYWdlVHlwZSBpbWFnZV90eXBlLAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtaW1lX3R5cGUsIEltYWdlRGVjb2Rlcjo6SW1hZ2VUeXBlIGltYWdlX3R5cGUsCiAgICAgcmVuZGVyX3RyZWU6OlJlc291cmNlUHJvdmlkZXIqIHJlc291cmNlX3Byb3ZpZGVyKSB7CiAgIC8vIGNsYW5nLWZvcm1hdCBvZmYKICAgY29uc3QgU2JEZWNvZGVUYXJnZXRGb3JtYXQga1ByZWZlcnJlZEZvcm1hdHNbXSA9IHsKQEAgLTMzMSwxMiArMzM1LDEzIEBACiAjZW5kaWYgIC8vIGRlZmluZWQoU1RBUkJPQVJEKQogCiBzY29wZWRfcHRyPEltYWdlRGF0YURlY29kZXI+IENyZWF0ZUltYWdlRGVjb2RlckZyb21JbWFnZVR5cGUoCi0gICAgSW1hZ2VUeXBlIGltYWdlX3R5cGUsIHJlbmRlcl90cmVlOjpSZXNvdXJjZVByb3ZpZGVyKiByZXNvdXJjZV9wcm92aWRlcikgeworICAgIEltYWdlRGVjb2Rlcjo6SW1hZ2VUeXBlIGltYWdlX3R5cGUsCisgICAgcmVuZGVyX3RyZWU6OlJlc291cmNlUHJvdmlkZXIqIHJlc291cmNlX3Byb3ZpZGVyKSB7CiAgIC8vIENhbGwgZGlmZmVyZW50IHR5cGVzIG9mIGRlY29kZXJzIGJ5IG1hdGNoaW5nIHRoZSBpbWFnZSBzaWduYXR1cmUuCiAgIGlmIChzX3VzZV9zdHViX2ltYWdlX2RlY29kZXIpIHsKICAgICByZXR1cm4gbWFrZV9zY29wZWRfcHRyPEltYWdlRGF0YURlY29kZXI+KAogICAgICAgICBuZXcgU3R1YkltYWdlRGVjb2RlcihyZXNvdXJjZV9wcm92aWRlcikpOwotICB9IGVsc2UgaWYgKGltYWdlX3R5cGUgPT0ga0ltYWdlVHlwZUpQRUcpIHsKKyAgfSBlbHNlIGlmIChpbWFnZV90eXBlID09IEltYWdlRGVjb2Rlcjo6a0ltYWdlVHlwZUpQRUcpIHsKICNpZiBkZWZpbmVkKFVTRV9QUzNfSlBFR19JTUFHRV9ERUNPREVSKQogICAgIHJldHVybiBtYWtlX3Njb3BlZF9wdHI8SW1hZ2VEYXRhRGVjb2Rlcj4oCiAgICAgICAgIG5ldyBKUEVHSW1hZ2VEZWNvZGVyUFMzKHJlc291cmNlX3Byb3ZpZGVyKSk7CkBAIC0zNDQsMTMgKzM0OSwxMyBAQAogICAgIHJldHVybiBtYWtlX3Njb3BlZF9wdHI8SW1hZ2VEYXRhRGVjb2Rlcj4oCiAgICAgICAgIG5ldyBKUEVHSW1hZ2VEZWNvZGVyKHJlc291cmNlX3Byb3ZpZGVyKSk7CiAjZW5kaWYgIC8vIGRlZmluZWQoVVNFX1BTM19KUEVHX0lNQUdFX0RFQ09ERVIpCi0gIH0gZWxzZSBpZiAoaW1hZ2VfdHlwZSA9PSBrSW1hZ2VUeXBlUE5HKSB7CisgIH0gZWxzZSBpZiAoaW1hZ2VfdHlwZSA9PSBJbWFnZURlY29kZXI6OmtJbWFnZVR5cGVQTkcpIHsKICAgICByZXR1cm4gbWFrZV9zY29wZWRfcHRyPEltYWdlRGF0YURlY29kZXI+KAogICAgICAgICBuZXcgUE5HSW1hZ2VEZWNvZGVyKHJlc291cmNlX3Byb3ZpZGVyKSk7Ci0gIH0gZWxzZSBpZiAoaW1hZ2VfdHlwZSA9PSBrSW1hZ2VUeXBlV2ViUCkgeworICB9IGVsc2UgaWYgKGltYWdlX3R5cGUgPT0gSW1hZ2VEZWNvZGVyOjprSW1hZ2VUeXBlV2ViUCkgewogICAgIHJldHVybiBtYWtlX3Njb3BlZF9wdHI8SW1hZ2VEYXRhRGVjb2Rlcj4oCiAgICAgICAgIG5ldyBXRUJQSW1hZ2VEZWNvZGVyKHJlc291cmNlX3Byb3ZpZGVyKSk7Ci0gIH0gZWxzZSBpZiAoaW1hZ2VfdHlwZSA9PSBrSW1hZ2VUeXBlR0lGKSB7CisgIH0gZWxzZSBpZiAoaW1hZ2VfdHlwZSA9PSBJbWFnZURlY29kZXI6OmtJbWFnZVR5cGVHSUYpIHsKICAgICByZXR1cm4gbWFrZV9zY29wZWRfcHRyPEltYWdlRGF0YURlY29kZXI+KAogICAgICAgICBuZXcgRHVtbXlHSUZJbWFnZURlY29kZXIocmVzb3VyY2VfcHJvdmlkZXIpKTsKICAgfSBlbHNlIHsKQEAgLTM3NCwxNyArMzc5LDE5IEBACiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKLSAgY29uc3QgSW1hZ2VUeXBlIGltYWdlX3R5cGUgPSBEZXRlcm1pbmVJbWFnZVR5cGUoc2lnbmF0dXJlX2NhY2hlXy5kYXRhKTsKKyAgaWYgKGltYWdlX3R5cGVfID09IGtJbWFnZVR5cGVJbnZhbGlkKSB7CisgICAgaW1hZ2VfdHlwZV8gPSBEZXRlcm1pbmVJbWFnZVR5cGUoc2lnbmF0dXJlX2NhY2hlXy5kYXRhKTsKKyAgfQogCiAjaWYgZGVmaW5lZChTVEFSQk9BUkQpCiAjaWYgU0JfVkVSU0lPTigzKSAmJiBTQl9IQVMoR1JBUEhJQ1MpCiAgIGRlY29kZXJfID0KLSAgICAgIE1heWJlQ3JlYXRlU3RhcmJvYXJkRGVjb2RlcihtaW1lX3R5cGVfLCBpbWFnZV90eXBlLCByZXNvdXJjZV9wcm92aWRlcl8pOworICAgICAgTWF5YmVDcmVhdGVTdGFyYm9hcmREZWNvZGVyKG1pbWVfdHlwZV8sIGltYWdlX3R5cGVfLCByZXNvdXJjZV9wcm92aWRlcl8pOwogI2VuZGlmICAvLyBTQl9WRVJTSU9OKDMpICYmIFNCX0hBUyhHUkFQSElDUykKICNlbmRpZiAgLy8gZGVmaW5lZChTVEFSQk9BUkQpCiAKICAgaWYgKCFkZWNvZGVyXykgewotICAgIGRlY29kZXJfID0gQ3JlYXRlSW1hZ2VEZWNvZGVyRnJvbUltYWdlVHlwZShpbWFnZV90eXBlLCByZXNvdXJjZV9wcm92aWRlcl8pOworICAgIGRlY29kZXJfID0gQ3JlYXRlSW1hZ2VEZWNvZGVyRnJvbUltYWdlVHlwZShpbWFnZV90eXBlXywgcmVzb3VyY2VfcHJvdmlkZXJfKTsKICAgfQogCiAgIGlmICghZGVjb2Rlcl8pIHsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbG9hZGVyL2ltYWdlL2ltYWdlX2RlY29kZXIuaCBiL3NyYy9jb2JhbHQvbG9hZGVyL2ltYWdlL2ltYWdlX2RlY29kZXIuaAppbmRleCAyMTI3YTA3Li44MDA0ZGM5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xvYWRlci9pbWFnZS9pbWFnZV9kZWNvZGVyLmgKKysrIGIvc3JjL2NvYmFsdC9sb2FkZXIvaW1hZ2UvaW1hZ2VfZGVjb2Rlci5oCkBAIC0yOCwxOSArMjgsMzEgQEAKIG5hbWVzcGFjZSBsb2FkZXIgewogbmFtZXNwYWNlIGltYWdlIHsKIAotLy8gVGhpcyBjbGFzcyBoYW5kbGVzIGRlY29kaW5nIGFueSBpbWFnZSB0eXBlLiBXaGVuIHRoZSBpbWFnZSB0eXBlIGlzIGRldGVybWluZWQKLS8vIGJ5IHRoZSBzaWduYXR1cmUgaW4gdGhlIGRhdGEgYmVpbmcgcmVjZWl2ZWQsIGFuIGltYWdlIGRhdGEgZGVjb2RlciBzcGVjaWZpYworLy8gVGhpcyBjbGFzcyBoYW5kbGVzIGRlY29kaW5nIGFueSBpbWFnZS4gSWYgaW1hZ2UgdHlwZSBpcyBub3QgZ2l2ZW4sIGl0IGlzCisvLyBkZXRlcm1pbmVkIGJ5IHRoZSBzaWduYXR1cmUgaW4gdGhlIGRhdGEuIFRoZW4gYW4gaW1hZ2UgZGF0YSBkZWNvZGVyIHNwZWNpZmljCiAvLyB0byB0aGF0IGltYWdlIHR5cGUgaXMgY3JlYXRlZCB0byBwYXJzZSB0aGUgZGF0YS4gV2hlbiB0aGUgZGVjb2RpbmcgaXMKIC8vIGNvbXBsZXRlLCB0aGUgaW1hZ2UgZGVjb2RlciByZXRyaWV2ZXMgdGhlIGRhdGEgYW5kIHVzZXMgaXQgdG8gY3JlYXRlIHRoZQogLy8gaW1hZ2UuCiBjbGFzcyBJbWFnZURlY29kZXIgOiBwdWJsaWMgRGVjb2RlciB7CiAgcHVibGljOgorICAvLyBUaGUgdmFyaW91cyB0eXBlcyBvZiBpbWFnZXMgd2Ugc3VwcG9ydCBkZWNvZGluZy4KKyAgZW51bSBJbWFnZVR5cGUgeworICAgIGtJbWFnZVR5cGVJbnZhbGlkLAorICAgIGtJbWFnZVR5cGVHSUYsCisgICAga0ltYWdlVHlwZUpQRUcsCisgICAga0ltYWdlVHlwZVBORywKKyAgICBrSW1hZ2VUeXBlV2ViUCwKKyAgfTsKKwogICB0eXBlZGVmIGJhc2U6OkNhbGxiYWNrPHZvaWQoY29uc3Qgc2NvcGVkX3JlZnB0cjxJbWFnZT4mKT4gU3VjY2Vzc0NhbGxiYWNrOwogICB0eXBlZGVmIGJhc2U6OkNhbGxiYWNrPHZvaWQoY29uc3Qgc3RkOjpzdHJpbmcmKT4gRXJyb3JDYWxsYmFjazsKIAogICBJbWFnZURlY29kZXIocmVuZGVyX3RyZWU6OlJlc291cmNlUHJvdmlkZXIqIHJlc291cmNlX3Byb3ZpZGVyLAogICAgICAgICAgICAgICAgY29uc3QgU3VjY2Vzc0NhbGxiYWNrJiBzdWNjZXNzX2NhbGxiYWNrLAogICAgICAgICAgICAgICAgY29uc3QgRXJyb3JDYWxsYmFjayYgZXJyb3JfY2FsbGJhY2spOworICBJbWFnZURlY29kZXIocmVuZGVyX3RyZWU6OlJlc291cmNlUHJvdmlkZXIqIHJlc291cmNlX3Byb3ZpZGVyLAorICAgICAgICAgICAgICAgY29uc3QgU3VjY2Vzc0NhbGxiYWNrJiBzdWNjZXNzX2NhbGxiYWNrLAorICAgICAgICAgICAgICAgY29uc3QgRXJyb3JDYWxsYmFjayYgZXJyb3JfY2FsbGJhY2ssIEltYWdlVHlwZSBpbWFnZV90eXBlKTsKIAogICAvLyBGcm9tIERlY29kZXIuCiAgIExvYWRSZXNwb25zZVR5cGUgT25SZXNwb25zZVN0YXJ0ZWQoCkBAIC04NCw2ICs5Niw3IEBACiAgIHJlbmRlcl90cmVlOjpSZXNvdXJjZVByb3ZpZGVyKiByZXNvdXJjZV9wcm92aWRlcl87CiAgIGNvbnN0IFN1Y2Nlc3NDYWxsYmFjayBzdWNjZXNzX2NhbGxiYWNrXzsKICAgY29uc3QgRXJyb3JDYWxsYmFjayBlcnJvcl9jYWxsYmFja187CisgIEltYWdlVHlwZSBpbWFnZV90eXBlXzsKICAgc2NvcGVkX3B0cjxJbWFnZURhdGFEZWNvZGVyPiBkZWNvZGVyXzsKICAgU2lnbmF0dXJlQ2FjaGUgc2lnbmF0dXJlX2NhY2hlXzsKICAgU3RhdGUgc3RhdGVfOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tYXRoL2xpbmVhcl9pbnRlcnBvbGF0b3IuaCBiL3NyYy9jb2JhbHQvbWF0aC9saW5lYXJfaW50ZXJwb2xhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI4ZjcwZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvbWF0aC9saW5lYXJfaW50ZXJwb2xhdG9yLmgKQEAgLTAsMCArMSwxNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ09CQUxUX01BVEhfTElORUFSX0lOVEVSUE9MQVRPUl9IXworI2RlZmluZSBDT0JBTFRfTUFUSF9MSU5FQVJfSU5URVJQT0xBVE9SX0hfCisKKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgorI2luY2x1ZGUgInN0YXJib2FyZC90eXBlcy5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBtYXRoIHsKKworLy8gTGluZWFySW50ZXJwb2xhdG9yIGVmZmVjdGl2ZWx5IGdlbmVyYXRlcyBvdXRwdXRzIGJhc2VkIG9uIGEgdGFibGUuIFRoaXMgY2FuCisvLyBiZSB1c2VkIGZvciBmdW5jdGlvbiBhcHByb3hpbWF0aW9uIChpZS4gc2luZSkgb3IgYXJiaXRyYXJ5IGZ1bmN0aW9ucyB0aGF0CisvLyBuZWVkIHNwZWNpZmljIHZhbHVlcyBhdCBzcGVjaWZpYyBpbnB1dHMsIGFuZCBpbnRlcnBvbGF0ZWQgdmFsdWVzIG90aGVyd2lzZS4KKy8vIEtleVQgYW5kIFZhbHVlVCBjYW4gYmUgYW55IGJ1aWx0aW4gaW50ZWdlciBhbmQgZmxvYXQgcG9pbnQgdHlwZS4KKy8vIEl0J3MgcmVjb21tZW5kZWQgdGhhdCBkb3VibGUgdHlwZXMgYXJlIHVzZWQgdW5sZXNzIHNwZWVkIGlzIHJlcXVpcmVkLCB0aGVuCisvLyB1c2Ugb3RoZXIgdHlwZXMuCisvLworLy8gUGVyZm9ybWFuY2U6CisvLyAgVGhpcyB0YWJsZSBpbmNyZWFzZXMgdGhlIGNvbXB1dGF0aW9uIG9uIHRoZSBvcmRlciBvZiBPKG4pIG9mIHRoZSBudW1iZXIKKy8vICBvZiBpbnRlcnBvbGF0aW9uIHBvaW50cy4gSG93ZXZlciBpbiBwcmFjdGljZSB0aGUgbnVtYmVyIG9mIGludGVycG9sYXRpb24KKy8vICBwb2ludHMgaXMgc21hbGwgZW5vdWdoICg8MjApIHdoZXJlIHRoaXMgbGluZWFyIHNlYXJjaCBpcyBmYXN0ZXIgdGhhbiBiaW5hcnkKKy8vICBsb29rdXAuCisvLworLy8gRGlzY29udGludW91cyB2YWx1ZXM6CisvLyAgVGhpcyB0YWJsZSBzdXBwb3J0cyBkaXNjb250aW51b3VzIHZhbHVlcy4gVG8gZW5hYmxlIHRoaXMgZmVhdHVyZSwgaW5zZXJ0IGEKKy8vICBwYWlyIG9mIGR1cGxpY2F0ZSBrZXlzLCBlYWNoIHdpdGggYSBkaWZmZXJlbnQgdmFsdWUuIFNlZSBleGFtcGxlIGJlbG93LiAKKy8vCisvLyBFeGFtcGxlIChjb250aW51b3VzKToKKy8vICBMaW5lYXJJbnRlcnBvbGF0b3I8ZmxvYXQsIGZsb2F0PiBpbnRlcnA7CisvLyAgaW50ZXJwLkFkZCgwLCAwKTsKKy8vICBpbnRlcnAuQWRkKDEsIDIpOworLy8gIEVYUEVDVF9GTE9BVF9FUSgwLmYsIGludGVycC5NYXAoMC4wZikpOworLy8gIEVYUEVDVF9GTE9BVF9FUSgxLmYsIGludGVycC5NYXAoMC41ZikpOworLy8gIEVYUEVDVF9GTE9BVF9FUSgyLmYsIGludGVycC5NYXAoMS4wZikpOworLy8KKy8vIEV4YW1wbGUgKGRpc2NvbnRpbnVvdXMpOgorLy8gIExpbmVhckludGVycG9sYXRvcjxkb3VibGUsIGZsb2F0PiBpbnRlcnA7CisvLyAgaW50ZXJwLkFkZCgwLCAwKTsKKy8vICBpbnRlcnAuQWRkKDEsIDEpOyAgLy8gRGlzY29udGludWl0eSBhdCBpbnB1dCA9IDEuCisvLyAgaW50ZXJwLkFkZCgxLCAzKTsKKy8vICBpbnRlcnAuQWRkKDIsIDQpOworLy8gIHN0YXRpYyBjb25zdCBkb3VibGUga0Vycm9yVGhyZXNob2xkID0gLjFmOworLy8gIHN0YXRpYyBjb25zdCBkb3VibGUga0Vwc2lsb24gPSBzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmVwc2lsb24oKSo0LjA7CisvLyAgRVhQRUNUX05FQVIoMS4wLCBpbnRlcnAuTWFwKDEuZiAtIGtFcHNpbG9uKSwga0Vycm9yVGhyZXNob2xkKTsKKy8vICBFWFBFQ1RfRkxPQVRfRVEoMywgaW50ZXJwLk1hcCgxLmYpKTsKKy8vICBFWFBFQ1RfTkVBUigzLjAsIGludGVycC5NYXAoMS5mICsga0Vwc2lsb24pLCBrRXJyb3JUaHJlc2hvbGQpOwordGVtcGxhdGUgPHR5cGVuYW1lIEtleVQsIHR5cGVuYW1lIFZhbHVlVD4KK2NsYXNzIExpbmVhckludGVycG9sYXRvciB7CisgcHVibGljOgorICBWYWx1ZVQgTWFwKGNvbnN0IEtleVQmIGtleSkgY29uc3QgeworICAgIHJldHVybiBJbnRlcnAoa2V5KTsKKyAgfQorCisgIC8vIEFkZHMgYSBrZXkgdG8gdGhlIHRhYmxlLiBGb3IgYSBjb250aW51b3VzIHBpZWNld2lzZSBsaW5lLWN1cnZlIGVhY2gga2V5CisgIC8vIGFkZGVkIG11c3QgYmUgZ3JlYXRlciBpbiB2YWx1ZSB0aGFuIHRoZSBsYXN0IGtleSBhZGRlZC4KKyAgLy8gSWYgZHVwbGljYXRlIGtleXMgYXJlIGVudGVyZWQgc2VxdWVudGlhbGx5IHRoZW4gdGhpcyB3aWxsIGludHJvZHVjZQorICAvLyBhIGRpc2NvbnRpbnVpdHkgLSBhIGJpZyBqdW1wIGluIHRoZSByZXR1cm5lZCB2YWx1ZSBmcm9tIE1hcCgpIHdoZW4gdGhlCisgIC8vIGlucHV0IGNyb3NzZXMgdGhlIGRpc2NvbnRpbnVpdHkgcG9pbnQuCisgIHZvaWQgQWRkKGNvbnN0IEtleVQmIGtleSwgY29uc3QgVmFsdWVUJiB2YWwpIHsKKyAgICBpZiAoIXRhYmxlXy5lbXB0eSgpKSB7CisgICAgICBEQ0hFQ0tfTEUodGFibGVfLmJhY2soKS5maXJzdCwga2V5KSA8PCAiS2V5cyBhcmUgbm90IGluIG9yZGVyLiI7CisgICAgfQorICAgIHRhYmxlXy5wdXNoX2JhY2soc3RkOjpwYWlyPEtleVQsIFZhbHVlVD4oa2V5LCB2YWwpKTsKKyAgfQorICB2b2lkIENsZWFyKCkgeworICAgIHRhYmxlXy5jbGVhcigpOworICB9CisKKyBwcml2YXRlOgorICBWYWx1ZVQgSW50ZXJwKGNvbnN0IEtleVQmIGspIGNvbnN0IHsKKyAgICBpZiAodGFibGVfLmVtcHR5KCkpIHsKKyAgICAgIHJldHVybiBWYWx1ZVQoMCk7CisgICAgfQorCisgICAgLy8gQ29udGFpbnMgdGhlIGluZGljZXMgd2hpY2ggcmVmZXJlbmNlIGtleXMgYmVmb3JlIGFuZCBhZnRlciB0aGUga2V5LgorICAgIHN0ZDo6cGFpcjxzaXplX3QsIHNpemVfdD4gaW5kaWNlcyA9IFNlbGVjdEludGVycFBvaW50cyhrKTsKKworICAgIC8vIFNpbmd1bGFyIHZhbHVlLCBubyBpbnRlcnBvbGF0aW9uIG5lZWRlZC4KKyAgICBpZiAoaW5kaWNlcy5maXJzdCA9PSBpbmRpY2VzLnNlY29uZCkgeworICAgICAgcmV0dXJuIHRhYmxlX1tpbmRpY2VzLmZpcnN0XS5zZWNvbmQ7CisgICAgfQorCisgICAgLy8gUGVyZm9ybSB0aGUgaW50ZXJwb2xhdGlvbiB3aXRoIHRoZSBnaXZlbiBrZXkgJiB2YWx1ZSBsaW5lcy4KKyAgICBjb25zdCBzdGQ6OnBhaXI8S2V5VCwgVmFsdWVUPiYgY3VyciA9IHRhYmxlX1tpbmRpY2VzLmZpcnN0XTsKKyAgICBjb25zdCBzdGQ6OnBhaXI8S2V5VCwgVmFsdWVUPiYgbmV4dCA9IHRhYmxlX1tpbmRpY2VzLnNlY29uZF07CisKKyAgICAvLyBEdXBsaWNhdGUga2V5cywgc2VsZWN0IHRoZSBzZWNvbmQgdmFsdWUuIFRoaXMgcHJldmVudHMKKyAgICAvLyBMaW5lYXJJbnRlcnBvbGF0aW9uKCkgZnJvbSBkaXZpZGluZyBieSAwIGZvciBkdXBsaWNhdGUga2V5cy4KKyAgICBpZiAoY3Vyci5maXJzdCA9PSBuZXh0LmZpcnN0KSB7CisgICAgICByZXR1cm4gbmV4dC5zZWNvbmQ7CisgICAgfQorCisgICAgcmV0dXJuIExpbmVhckludGVycG9sYXRpb24oaywgY3Vyci5maXJzdCwgbmV4dC5maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyLnNlY29uZCwgbmV4dC5zZWNvbmQpOworICB9CisKKyAgLy8gTGluZWFybHkgd2FsayB0aHJvdWdoIHRoZSB0YWJsZSBsb29raW5nIGZvciBhIHBhaXIgb2YgaW50ZXJwb2xhdGlvbgorICAvLyBwb2ludHMuIExpbmVhciB3YWxraW5nIG11c3QgYmUgdXNlZCBiZWNhdXNlIHRoaXMgdGFibGUgdXNlcyBkdXBsaWNhdGUKKyAgLy8ga2V5cyBnZW5lcmF0ZSBkaXNjb250aW51b3VzIG91dHB1dHMuCisgIHN0ZDo6cGFpcjxzaXplX3QsIHNpemVfdD4gU2VsZWN0SW50ZXJwUG9pbnRzKGNvbnN0IEtleVQmIGspIGNvbnN0IHsKKyAgICBEQ0hFQ0soIXRhYmxlXy5lbXB0eSgpKTsKKyAgICBpZiAoayA8IHRhYmxlX1swXS5maXJzdCkgeworICAgICAgcmV0dXJuIHN0ZDo6cGFpcjxzaXplX3QsIHNpemVfdD4oMCwgMCk7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0YWJsZV8uc2l6ZSgpIC0gMTsgKytpKSB7CisgICAgICBjb25zdCBzdGQ6OnBhaXI8S2V5VCwgVmFsdWVUPiYgY3VyciA9IHRhYmxlX1tpXTsKKyAgICAgIGNvbnN0IHN0ZDo6cGFpcjxLZXlULCBWYWx1ZVQ+JiBuZXh0ID0gdGFibGVfW2krMV07CisKKyAgICAgIGlmIChjdXJyLmZpcnN0IDw9IGsgJiYgayA8IG5leHQuZmlyc3QpIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6cGFpcjxzaXplX3QsIHNpemVfdD4oaSwgaSsxKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc3RkOjpwYWlyPHNpemVfdCwgc2l6ZV90Pih0YWJsZV8uc2l6ZSgpIC0gMSwgdGFibGVfLnNpemUoKSAtIDEpOworICB9CisKKyAgLy8gTWFwcyBhIHZhbHVlIGluIHRoZSByYW5nZSBbeDEsIHgyXSB0byB0aGUgcmFuZ2UgW3kxLCB5Ml0uCisgIHN0YXRpYyBjb25zdCBWYWx1ZVQgTGluZWFySW50ZXJwb2xhdGlvbihjb25zdCBLZXlUJiB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgS2V5VCYgeDEsIGNvbnN0IEtleVQmIHgyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFsdWVUJiB5MSwgY29uc3QgVmFsdWVUJiB5MikgeworICAgIFZhbHVlVCByZXR1cm5fdmFsID0KKyAgICAgICAgc3RhdGljX2Nhc3Q8VmFsdWVUPigodCAtIHgxKSAqICh5MiAtIHkxKSAvICh4MiAtIHgxKSArIHkxKTsKKyAgICByZXR1cm4gcmV0dXJuX3ZhbDsKKyAgfQorCisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPEtleVQsIFZhbHVlVD4gPiBWZWN0b3JUeXBlOworICBWZWN0b3JUeXBlIHRhYmxlXzsKK307CisKK30gIC8vIG5hbWVzcGFjZSBtYXRoCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKyNlbmRpZiAgLy8gQ09CQUxUX01BVEhfTElORUFSX0lOVEVSUE9MQVRPUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tYXRoL2xpbmVhcl9pbnRlcnBvbGF0b3JfdW5pdHRlc3QuY2MgYi9zcmMvY29iYWx0L21hdGgvbGluZWFyX2ludGVycG9sYXRvcl91bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTliYWY0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9tYXRoL2xpbmVhcl9pbnRlcnBvbGF0b3JfdW5pdHRlc3QuY2MKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJjb2JhbHQvbWF0aC9saW5lYXJfaW50ZXJwb2xhdG9yLmgiCisKKyNpbmNsdWRlIDxsaW1pdHM+CisKKyNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgbWF0aCB7CisKK1RFU1QoTGluZWFySW50ZXJwb2xhdG9yLCBTaW1wbGVJbnRlcnBvbGF0aW9uKSB7CisgIExpbmVhckludGVycG9sYXRvcjxmbG9hdCwgZmxvYXQ+IGludGVycDsKKyAgaW50ZXJwLkFkZCgwLCAwKTsKKyAgaW50ZXJwLkFkZCgxLCAyKTsKKworICAvLyBFeHBlY3QgdGhhdCB2YWx1ZSBvZiAwLjBmIG1hcHMgdG8gMC4wZgorICBFWFBFQ1RfRkxPQVRfRVEoMC5mLCBpbnRlcnAuTWFwKDAuMGYpKTsKKyAgLy8gRXhwZWN0IHRoYXQgdmFsdWUgb2YgMC41ZiBtYXBzIHRvIDEuMGYKKyAgRVhQRUNUX0ZMT0FUX0VRKDEuZiwgaW50ZXJwLk1hcCgwLjVmKSk7CisgIC8vIEV4cGVjdCB0aGF0IHZhbHVlIG9mIDEuNWYgbWFwcyB0byAyLjBmCisgIEVYUEVDVF9GTE9BVF9FUSgyLmYsIGludGVycC5NYXAoMS4wZikpOworfQorCisvLyBUZXN0cyB0aGUgZXhwZWN0YXRpb24gdGhhdCBjbGVhcmluZyB0aGUgaW50ZXJwb2xhdG9yIHdvcmtzLgorVEVTVChMaW5lYXJJbnRlcnBvbGF0b3IsIENsZWFyKSB7CisgIExpbmVhckludGVycG9sYXRvcjxpbnQsIGludD4gaW50ZXJwOworICBpbnRlcnAuQWRkKC0xLCAwKTsKKyAgaW50ZXJwLkFkZCgxLCAyKTsKKworICBpbnRlcnAuQ2xlYXIoKTsKKworICBFWFBFQ1RfRkxPQVRfRVEoMCwgaW50ZXJwLk1hcCgtMSkpOworICBFWFBFQ1RfRkxPQVRfRVEoMCwgaW50ZXJwLk1hcCgxKSk7Cit9CisKKy8vIFRlc3RzIHRoZSBleHBlY3RhdGlvbiB0aGF0IGludGVycG9sYXRpbmcgb24gb25lIHZhbHVlIGluIHRoZSB0YWJsZSB3b3JrcworLy8gYXMgZXhwZWN0ZWQ6IHRvIGFsd2F5cyByZXR1cm4gdGhhdCB2YWx1ZS4KK1RFU1QoTGluZWFySW50ZXJwb2xhdG9yLCBJbnRlcnBvbGF0ZVNpbmd1bGFyVmFsdWUpIHsKKyAgTGluZWFySW50ZXJwb2xhdG9yPHNpemVfdCwgc2l6ZV90PiBpbnRlcnA7CisgIGludGVycC5BZGQoMiwgMTApOworCisgIEVYUEVDVF9FUSgxMCwgaW50ZXJwLk1hcCgyKSk7CisgIEVYUEVDVF9FUSgxMCwgaW50ZXJwLk1hcCgxKSk7CisgIEVYUEVDVF9FUSgxMCwgaW50ZXJwLk1hcCgzKSk7Cit9CisKKy8vIFRlc3RzIHRoZSBleHBlY3RhdGlvbiB0aGF0IHdlIGNhbiBpbnRyb2R1Y2UgYW4gZGlzY29udGludWl0eSBieSBwYXNzaW5nCisvLyBpbiBkdXBsaWNhdGUga2V5cy4KK1RFU1QoTGluZWFySW50ZXJwb2xhdG9yLCBEaXNjb250aW51aXR5KSB7CisgIExpbmVhckludGVycG9sYXRvcjxkb3VibGUsIGZsb2F0PiBpbnRlcnA7CisgIGludGVycC5BZGQoMCwgMCk7CisgIGludGVycC5BZGQoMSwgMSk7ICAvLyBEaXNjb250aW51aXR5IGF0IGlucHV0ID0gMS4KKyAgaW50ZXJwLkFkZCgxLCAzKTsKKyAgaW50ZXJwLkFkZCgyLCA0KTsKKworICBzdGF0aWMgY29uc3QgZG91YmxlIGtFcnJvclRocmVzaG9sZCA9IC4xZjsKKyAgc3RhdGljIGNvbnN0IGRvdWJsZSBrRXBzaWxvbiA9IHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6ZXBzaWxvbigpKjQuMDsKKworICBFWFBFQ1RfTkVBUigxLjAsIGludGVycC5NYXAoMS5mIC0ga0Vwc2lsb24pLCBrRXJyb3JUaHJlc2hvbGQpOworICAvLyBFeHBlY3QgdGhhdCBhdCB0aGUgZGlzY29udGludWl0eSBwb2ludCB2YWx1ZSBvZiAxLCB0aGF0IHRoZSB2YWx1ZSB0aGF0CisgIC8vIHRoZSBpbnRlcnBvbGF0b3IgcHJvZHVjZXMgaXMgMy4KKyAgRVhQRUNUX0ZMT0FUX0VRKDMsIGludGVycC5NYXAoMS5mKSk7CisgIEVYUEVDVF9ORUFSKDMuMCwgaW50ZXJwLk1hcCgxLmYgKyBrRXBzaWxvbiksIGtFcnJvclRocmVzaG9sZCk7Cit9CisKKy8vIFRlc3RzIHRoYXQgZXh0cmFwb2xhdGlvbiBpcyBmb3JiaWRkZW4gd2l0aCB0aGlzIGludGVycG9sYXRvci4KK1RFU1QoTGluZWFySW50ZXJwb2xhdG9yLCBFeHRyYXBvbGF0aW9uRm9yYmlkZGVuKSB7CisgIExpbmVhckludGVycG9sYXRvcjxmbG9hdCwgZmxvYXQ+IGludGVycDsKKyAgaW50ZXJwLkFkZCgwLCAwKTsKKyAgaW50ZXJwLkFkZCgxLCAyKTsKKworICAvLyBFeHBlY3QgdGhhdCB2YWx1ZXMgbGVzcyB0aGFuIHRoZSBtaW5pbWFsIGtleSB2YWx1ZSBpcyBjbGFtcGVkLgorICBFWFBFQ1RfRkxPQVRfRVEoMC4wZiwgaW50ZXJwLk1hcCgtMS4wZikpOworICAvLyBFeHBlY3QgdGhhdCB2YWx1ZXMgZ3JlYXRlciB0aGFuIHRoZSBtYXhpbXVtIGtleSB2YWx1ZSBpcyBjbGFtcGVkLgorICBFWFBFQ1RfRkxPQVRfRVEoMi4wZiwgaW50ZXJwLk1hcCgyLjBmKSk7Cit9CisKKy8vIFNvbWUgbW9yZSByZWFsIHdvcmxkIHZhbHVlcy4KK1RFU1QoTGluZWFySW50ZXJwb2xhdG9yLCBVc2VDb21wbGV4RmxvYXQpIHsKKyAgTGluZWFySW50ZXJwb2xhdG9yPGZsb2F0LCBmbG9hdD4gaW50ZXJwOworICBpbnRlcnAuQWRkKDAsIDApOworICBpbnRlcnAuQWRkKDQxLCAxKTsKKyAgaW50ZXJwLkFkZCgxMDIzLCAxNSk7CisKKyAgRVhQRUNUX0ZMT0FUX0VRKDAuMGYsIGludGVycC5NYXAoMC5mKSk7CisgIEVYUEVDVF9GTE9BVF9FUSgwLjVmLCBpbnRlcnAuTWFwKDQxLmYvMi5mKSk7CisgIEVYUEVDVF9GTE9BVF9FUSgxLjBmLCBpbnRlcnAuTWFwKDQxLmYpKTsKKyAgRVhQRUNUX0ZMT0FUX0VRKDE1LmYsIGludGVycC5NYXAoMTAyMy5mKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgdGhpcyBpbnRlcnBvbGF0b3Igd29ya3Mgd2l0aCBpbnRlZ2VyIGtleXMgYW5kIGZsb2F0IHZhbHVlcy4KK1RFU1QoTGluZWFySW50ZXJwb2xhdG9yLCBVc2VJbnRlZ2VyS2V5V2l0aEZsb2F0VmFsdWUpIHsKKyAgTGluZWFySW50ZXJwb2xhdG9yPGludCwgZmxvYXQ+IGludGVycDsKKyAgaW50ZXJwLkFkZCgwLCAwLmYpOworICBpbnRlcnAuQWRkKDEwLCAxLmYpOworICBpbnRlcnAuQWRkKDEwMCwgMi5mKTsKKworICBFWFBFQ1RfRkxPQVRfRVEoMC4wZiwgaW50ZXJwLk1hcCgwKSk7CisgIEVYUEVDVF9GTE9BVF9FUSgwLjVmLCBpbnRlcnAuTWFwKDUpKTsKKyAgRVhQRUNUX0ZMT0FUX0VRKDEuMGYsIGludGVycC5NYXAoMTApKTsKKyAgRVhQRUNUX0ZMT0FUX0VRKDIuMGYsIGludGVycC5NYXAoMTAwKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgdGhpcyBpbnRlcnBvbGF0b3Igd29ya3Mgd2l0aCBpbnRlZ2VyIGtleXMgYW5kIGludCB2YWx1ZXMuCitURVNUKExpbmVhckludGVycG9sYXRvciwgVXNlSW50ZWdlcktleVdpdGhJbnRlZ2VyVmFsdWUpIHsKKyAgTGluZWFySW50ZXJwb2xhdG9yPGludCwgaW50PiBpbnRlcnA7CisgIGludGVycC5BZGQoMCwgMCk7CisgIGludGVycC5BZGQoMTAsIDEwMCk7CisgIGludGVycC5BZGQoMTAwLCAxMDAwKTsKKworICBFWFBFQ1RfRVEoMCwgaW50ZXJwLk1hcCgwKSk7CisgIEVYUEVDVF9FUSg1MCwgaW50ZXJwLk1hcCg1KSk7CisgIEVYUEVDVF9FUSgxMDAsIGludGVycC5NYXAoMTApKTsKKyAgRVhQRUNUX0VRKDU1MCwgaW50ZXJwLk1hcCg1NSkpOworICBFWFBFQ1RfRVEoMTAwMCwgaW50ZXJwLk1hcCgxMDApKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIG1hdGgKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWF0aC9tYXRoLmd5cCBiL3NyYy9jb2JhbHQvbWF0aC9tYXRoLmd5cAppbmRleCA2OTJkN2VjLi5mNDU3ZmRkIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21hdGgvbWF0aC5neXAKKysrIGIvc3JjL2NvYmFsdC9tYXRoL21hdGguZ3lwCkBAIC0xOCw2ICsxOCw3IEBACiAgICAgICAgICdpbnNldHNfYmFzZS5oJywKICAgICAgICAgJ2luc2V0c19mLmNjJywKICAgICAgICAgJ2luc2V0c19mLmgnLAorICAgICAgICAnbGluZWFyX2ludGVycG9sYXRvci5oJywKICAgICAgICAgJ21hdHJpeDNfZi5jYycsCiAgICAgICAgICdtYXRyaXgzX2YuaCcsCiAgICAgICAgICdtYXRyaXhfaW50ZXJwb2xhdGlvbi5jYycsCkBAIC03NSw2ICs3Niw3IEBACiAgICAgICAgICdib3hfdW5pdHRlc3QuY2MnLAogICAgICAgICAnY3ViaWNfYmV6aWVyX3VuaXR0ZXN0LmNjJywKICAgICAgICAgJ2luc2V0c191bml0dGVzdC5jYycsCisgICAgICAgICdsaW5lYXJfaW50ZXJwb2xhdG9yX3VuaXR0ZXN0LmNjJywKICAgICAgICAgJ21hdHJpeDNfdW5pdHRlc3QuY2MnLAogICAgICAgICAnbWF0cml4X2ludGVycG9sYXRpb25fdW5pdHRlc3QuY2MnLAogICAgICAgICAncG9pbnQzX3VuaXR0ZXN0LmNjJywKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9kcm1fc3lzdGVtLmNjIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2RybV9zeXN0ZW0uY2MKaW5kZXggMzhhMGJlOC4uNjM5MDUxZiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2RybV9zeXN0ZW0uY2MKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2RybV9zeXN0ZW0uY2MKQEAgLTIwLDcyICsyMCwxNzkgQEAKIG5hbWVzcGFjZSBjb2JhbHQgewogbmFtZXNwYWNlIG1lZGlhIHsKIAotRHJtU3lzdGVtOjpEcm1TeXN0ZW0oY29uc3QgY2hhcioga2V5X3N5c3RlbSwgRHJtU3lzdGVtQ2xpZW50KiBjbGllbnQpCi0gICAgOiBjbGllbnRfKGNsaWVudCksCi0gICAgICB3cmFwcGVkX2RybV9zeXN0ZW1fKFNiRHJtQ3JlYXRlU3lzdGVtKGtleV9zeXN0ZW0sIHRoaXMsCitEcm1TeXN0ZW06OlNlc3Npb246OlNlc3Npb24oRHJtU3lzdGVtKiBkcm1fc3lzdGVtKQorICAgIDogZHJtX3N5c3RlbV8oZHJtX3N5c3RlbSksIGNsb3NlZF8oZmFsc2UpIHt9CisKK0RybVN5c3RlbTo6U2Vzc2lvbjo6flNlc3Npb24oKSB7CisgIGlmIChpZF8gJiYgIWNsb3NlZF8pIHsKKyAgICAvLyBBdXRvLWNsb3Npbmcgc2VtYW50aWNzIGlzIGRlcml2ZWQgZnJvbSBFTUUgc3BlYy4KKyAgICAvLworICAgIC8vIElmIGEgTWVkaWFLZXlTZXNzaW9uIG9iamVjdCBpcyBub3QgY2xvc2VkIHdoZW4gaXQgYmVjb21lcyBpbmFjY2Vzc2libGUKKyAgICAvLyB0byB0aGUgcGFnZSwgdGhlIENETSBzaGFsbCBjbG9zZSB0aGUga2V5IHNlc3Npb24gYXNzb2NpYXRlZCB3aXRoCisgICAgLy8gdGhlIG9iamVjdC4KKyAgICAvLyAgIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9lbmNyeXB0ZWQtbWVkaWEvI21lZGlha2V5c2Vzc2lvbi1pbnRlcmZhY2UKKyAgICBDbG9zZSgpOworICB9Cit9CisKK3ZvaWQgRHJtU3lzdGVtOjpTZXNzaW9uOjpHZW5lcmF0ZVVwZGF0ZVJlcXVlc3QoCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHR5cGUsIGNvbnN0IHVpbnQ4KiBpbml0X2RhdGEsIGludCBpbml0X2RhdGFfbGVuZ3RoLAorICAgIGNvbnN0IFNlc3Npb25VcGRhdGVSZXF1ZXN0R2VuZXJhdGVkQ2FsbGJhY2smCisgICAgICAgIHNlc3Npb25fdXBkYXRlX3JlcXVlc3RfZ2VuZXJhdGVkX2NhbGxiYWNrLAorICAgIGNvbnN0IFNlc3Npb25VcGRhdGVSZXF1ZXN0RGlkTm90R2VuZXJhdGVDYWxsYmFjayYKKyAgICAgICAgc2Vzc2lvbl91cGRhdGVfcmVxdWVzdF9kaWRfbm90X2dlbmVyYXRlX2NhbGxiYWNrKSB7CisgIHVwZGF0ZV9yZXF1ZXN0X2dlbmVyYXRlZF9jYWxsYmFja18gPQorICAgICAgc2Vzc2lvbl91cGRhdGVfcmVxdWVzdF9nZW5lcmF0ZWRfY2FsbGJhY2s7CisgIGRybV9zeXN0ZW1fLT5HZW5lcmF0ZVNlc3Npb25VcGRhdGVSZXF1ZXN0KAorICAgICAgdGhpcywgdHlwZSwgaW5pdF9kYXRhLCBpbml0X2RhdGFfbGVuZ3RoLAorICAgICAgc2Vzc2lvbl91cGRhdGVfcmVxdWVzdF9nZW5lcmF0ZWRfY2FsbGJhY2ssCisgICAgICBzZXNzaW9uX3VwZGF0ZV9yZXF1ZXN0X2RpZF9ub3RfZ2VuZXJhdGVfY2FsbGJhY2spOworfQorCit2b2lkIERybVN5c3RlbTo6U2Vzc2lvbjo6VXBkYXRlKAorICAgIGNvbnN0IHVpbnQ4KiBrZXksIGludCBrZXlfbGVuZ3RoLAorICAgIGNvbnN0IFNlc3Npb25VcGRhdGVkQ2FsbGJhY2smIHNlc3Npb25fdXBkYXRlZF9jYWxsYmFjaywKKyAgICBjb25zdCBTZXNzaW9uRGlkTm90VXBkYXRlQ2FsbGJhY2smIHNlc3Npb25fZGlkX25vdF91cGRhdGVfY2FsbGJhY2spIHsKKyAgZHJtX3N5c3RlbV8tPlVwZGF0ZVNlc3Npb24oKmlkXywga2V5LCBrZXlfbGVuZ3RoLCBzZXNzaW9uX3VwZGF0ZWRfY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25fZGlkX25vdF91cGRhdGVfY2FsbGJhY2spOworfQorCit2b2lkIERybVN5c3RlbTo6U2Vzc2lvbjo6Q2xvc2UoKSB7CisgIGRybV9zeXN0ZW1fLT5DbG9zZVNlc3Npb24oKmlkXyk7CisgIGNsb3NlZF8gPSB0cnVlOworfQorCitEcm1TeXN0ZW06OkRybVN5c3RlbShjb25zdCBjaGFyKiBrZXlfc3lzdGVtKQorICAgIDogd3JhcHBlZF9kcm1fc3lzdGVtXyhTYkRybUNyZWF0ZVN5c3RlbShrZXlfc3lzdGVtLCB0aGlzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPblNlc3Npb25VcGRhdGVSZXF1ZXN0R2VuZXJhdGVkRnVuYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT25TZXNzaW9uVXBkYXRlZEZ1bmMpKSwKLSAgICAgIG1lc3NhZ2VfbG9vcF8oTWVzc2FnZUxvb3A6OmN1cnJlbnQoKSkgeworICAgICAgbWVzc2FnZV9sb29wXyhNZXNzYWdlTG9vcDo6Y3VycmVudCgpKSwKKyAgICAgIEFMTE9XX1RISVNfSU5fSU5JVElBTElaRVJfTElTVCh3ZWFrX3B0cl9mYWN0b3J5Xyh0aGlzKSksCisgICAgICB3ZWFrX3RoaXNfKHdlYWtfcHRyX2ZhY3RvcnlfLkdldFdlYWtQdHIoKSksCisgICAgICBuZXh0X3Nlc3Npb25fdXBkYXRlX3JlcXVlc3RfdGlja2V0XygwKSwKKyAgICAgIG5leHRfc2Vzc2lvbl91cGRhdGVfdGlja2V0XygwKSB7CiAgIERDSEVDS19ORShrU2JEcm1TeXN0ZW1JbnZhbGlkLCB3cmFwcGVkX2RybV9zeXN0ZW1fKTsKIH0KIAogRHJtU3lzdGVtOjp+RHJtU3lzdGVtKCkgeyBTYkRybURlc3Ryb3lTeXN0ZW0od3JhcHBlZF9kcm1fc3lzdGVtXyk7IH0KIAotdm9pZCBEcm1TeXN0ZW06OkdlbmVyYXRlU2Vzc2lvblVwZGF0ZVJlcXVlc3QoaW50IHRpY2tldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogaW5pdF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluaXRfZGF0YV9sZW5ndGgpIHsKK3Njb3BlZF9wdHI8RHJtU3lzdGVtOjpTZXNzaW9uPiBEcm1TeXN0ZW06OkNyZWF0ZVNlc3Npb24oKSB7CisgIHJldHVybiBtYWtlX3Njb3BlZF9wdHIobmV3IFNlc3Npb24odGhpcykpOworfQorCit2b2lkIERybVN5c3RlbTo6R2VuZXJhdGVTZXNzaW9uVXBkYXRlUmVxdWVzdCgKKyAgICBTZXNzaW9uKiBzZXNzaW9uLCBjb25zdCBzdGQ6OnN0cmluZyYgdHlwZSwgY29uc3QgdWludDhfdCogaW5pdF9kYXRhLAorICAgIGludCBpbml0X2RhdGFfbGVuZ3RoLCBjb25zdCBTZXNzaW9uVXBkYXRlUmVxdWVzdEdlbmVyYXRlZENhbGxiYWNrJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbl91cGRhdGVfcmVxdWVzdF9nZW5lcmF0ZWRfY2FsbGJhY2ssCisgICAgY29uc3QgU2Vzc2lvblVwZGF0ZVJlcXVlc3REaWROb3RHZW5lcmF0ZUNhbGxiYWNrJgorICAgICAgICBzZXNzaW9uX3VwZGF0ZV9yZXF1ZXN0X2RpZF9ub3RfZ2VuZXJhdGVfY2FsbGJhY2spIHsKKyAgLy8gU3RvcmUgdGhlIGNvbnRleHQgb2YgdGhlIGNhbGwuCisgIFNlc3Npb25VcGRhdGVSZXF1ZXN0IHNlc3Npb25fdXBkYXRlX3JlcXVlc3Q7CisgIHNlc3Npb25fdXBkYXRlX3JlcXVlc3Quc2Vzc2lvbiA9IHNlc3Npb247CisgIHNlc3Npb25fdXBkYXRlX3JlcXVlc3QuZ2VuZXJhdGVkX2NhbGxiYWNrID0KKyAgICAgIHNlc3Npb25fdXBkYXRlX3JlcXVlc3RfZ2VuZXJhdGVkX2NhbGxiYWNrOworICBzZXNzaW9uX3VwZGF0ZV9yZXF1ZXN0LmRpZF9ub3RfZ2VuZXJhdGVfY2FsbGJhY2sgPQorICAgICAgc2Vzc2lvbl91cGRhdGVfcmVxdWVzdF9kaWRfbm90X2dlbmVyYXRlX2NhbGxiYWNrOworICBpbnQgdGlja2V0ID0gbmV4dF9zZXNzaW9uX3VwZGF0ZV9yZXF1ZXN0X3RpY2tldF8rKzsKKyAgdGlja2V0X3RvX3Nlc3Npb25fdXBkYXRlX3JlcXVlc3RfbWFwXy5pbnNlcnQoCisgICAgICBzdGQ6Om1ha2VfcGFpcih0aWNrZXQsIHNlc3Npb25fdXBkYXRlX3JlcXVlc3QpKTsKKwogICBTYkRybUdlbmVyYXRlU2Vzc2lvblVwZGF0ZVJlcXVlc3Qod3JhcHBlZF9kcm1fc3lzdGVtXywgdGlja2V0LCB0eXBlLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0X2RhdGEsIGluaXRfZGF0YV9sZW5ndGgpOwogfQogCi12b2lkIERybVN5c3RlbTo6VXBkYXRlU2Vzc2lvbihpbnQgdGlja2V0LCBjb25zdCBzdGQ6OnN0cmluZyYgc2Vzc2lvbl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGtleSwgaW50IGtleV9sZW5ndGgpIHsKK3ZvaWQgRHJtU3lzdGVtOjpVcGRhdGVTZXNzaW9uKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXNzaW9uX2lkLCBjb25zdCB1aW50OF90KiBrZXksIGludCBrZXlfbGVuZ3RoLAorICAgIGNvbnN0IFNlc3Npb25VcGRhdGVkQ2FsbGJhY2smIHNlc3Npb25fdXBkYXRlZF9jYWxsYmFjaywKKyAgICBjb25zdCBTZXNzaW9uRGlkTm90VXBkYXRlQ2FsbGJhY2smIHNlc3Npb25fZGlkX25vdF91cGRhdGVfY2FsbGJhY2spIHsKKyAgLy8gU3RvcmUgdGhlIGNvbnRleHQgb2YgdGhlIGNhbGwuCisgIFNlc3Npb25VcGRhdGUgc2Vzc2lvbl91cGRhdGU7CisgIHNlc3Npb25fdXBkYXRlLnVwZGF0ZWRfY2FsbGJhY2sgPSBzZXNzaW9uX3VwZGF0ZWRfY2FsbGJhY2s7CisgIHNlc3Npb25fdXBkYXRlLmRpZF9ub3RfdXBkYXRlX2NhbGxiYWNrID0gc2Vzc2lvbl9kaWRfbm90X3VwZGF0ZV9jYWxsYmFjazsKKyAgaW50IHRpY2tldCA9IG5leHRfc2Vzc2lvbl91cGRhdGVfdGlja2V0XysrOworICB0aWNrZXRfdG9fc2Vzc2lvbl91cGRhdGVfbWFwXy5pbnNlcnQoc3RkOjptYWtlX3BhaXIodGlja2V0LCBzZXNzaW9uX3VwZGF0ZSkpOworCiAgIFNiRHJtVXBkYXRlU2Vzc2lvbih3cmFwcGVkX2RybV9zeXN0ZW1fLCB0aWNrZXQsIGtleSwga2V5X2xlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25faWQuY19zdHIoKSwgc2Vzc2lvbl9pZC5zaXplKCkpOwogfQogCiB2b2lkIERybVN5c3RlbTo6Q2xvc2VTZXNzaW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXNzaW9uX2lkKSB7CisgIGlkX3RvX3Nlc3Npb25fbWFwXy5lcmFzZShzZXNzaW9uX2lkKTsKICAgU2JEcm1DbG9zZVNlc3Npb24od3JhcHBlZF9kcm1fc3lzdGVtXywgc2Vzc2lvbl9pZC5jX3N0cigpLCBzZXNzaW9uX2lkLnNpemUoKSk7CiB9CiAKLXZvaWQgRHJtU3lzdGVtOjpPblNlc3Npb25VcGRhdGVSZXF1ZXN0R2VuZXJhdGVkKGludCB0aWNrZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBzZXNzaW9uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25faWRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGNvbnRlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29udGVudF9zaXplKSB7Ci0gIGlmIChzZXNzaW9uX2lkKSB7Ci0gICAgc3RkOjpzdHJpbmcgc2Vzc2lvbl9pZF9jb3B5KAotICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4oc2Vzc2lvbl9pZCksCi0gICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IGNoYXIqPihzZXNzaW9uX2lkKSArIHNlc3Npb25faWRfc2l6ZSk7Cit2b2lkIERybVN5c3RlbTo6T25TZXNzaW9uVXBkYXRlUmVxdWVzdEdlbmVyYXRlZCgKKyAgICBpbnQgdGlja2V0LCBjb25zdCBiYXNlOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4mIHNlc3Npb25faWQsCisgICAgc2NvcGVkX2FycmF5PHVpbnQ4PiBtZXNzYWdlLCBpbnQgbWVzc2FnZV9zaXplKSB7CisgIGlmIChTYkRybVRpY2tldElzVmFsaWQodGlja2V0KSkgeworICAgIC8vIENhbGxlZCBiYWNrIGFzIGEgcmVzdWx0IG9mIHxTYkRybUdlbmVyYXRlU2Vzc2lvblVwZGF0ZVJlcXVlc3R8LgogCi0gICAgc2NvcGVkX2FycmF5PHVpbnQ4PiBjb250ZW50X2NvcHkobmV3IHVpbnQ4W2NvbnRlbnRfc2l6ZV0pOwotICAgIFNiTWVtb3J5Q29weShjb250ZW50X2NvcHkuZ2V0KCksIGNvbnRlbnQsIGNvbnRlbnRfc2l6ZSk7CisgICAgLy8gUmVzdG9yZSB0aGUgY29udGV4dCBvZiB8R2VuZXJhdGVTZXNzaW9uVXBkYXRlUmVxdWVzdHwuCisgICAgVGlja2V0VG9TZXNzaW9uVXBkYXRlUmVxdWVzdE1hcDo6aXRlcmF0b3Igc2Vzc2lvbl91cGRhdGVfcmVxdWVzdF9pdGVyYXRvciA9CisgICAgICAgIHRpY2tldF90b19zZXNzaW9uX3VwZGF0ZV9yZXF1ZXN0X21hcF8uZmluZCh0aWNrZXQpOworICAgIGlmIChzZXNzaW9uX3VwZGF0ZV9yZXF1ZXN0X2l0ZXJhdG9yID09CisgICAgICAgIHRpY2tldF90b19zZXNzaW9uX3VwZGF0ZV9yZXF1ZXN0X21hcF8uZW5kKCkpIHsKKyAgICAgIExPRyhFUlJPUikgPDwgIlVua25vd24gc2Vzc2lvbiB1cGRhdGUgcmVxdWVzdCB0aWNrZXQ6ICIgPDwgdGlja2V0IDw8ICIuIjsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgY29uc3QgU2Vzc2lvblVwZGF0ZVJlcXVlc3QmIHNlc3Npb25fdXBkYXRlX3JlcXVlc3QgPQorICAgICAgICBzZXNzaW9uX3VwZGF0ZV9yZXF1ZXN0X2l0ZXJhdG9yLT5zZWNvbmQ7CiAKLSAgICBtZXNzYWdlX2xvb3BfLT5Qb3N0VGFzaygKLSAgICAgICAgRlJPTV9IRVJFLAotICAgICAgICBiYXNlOjpCaW5kKCZEcm1TeXN0ZW1DbGllbnQ6Ok9uU2Vzc2lvblVwZGF0ZVJlcXVlc3RHZW5lcmF0ZWQsCi0gICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZChjbGllbnRfKSwgdGlja2V0LCBzZXNzaW9uX2lkX2NvcHksCi0gICAgICAgICAgICAgICAgICAgYmFzZTo6UGFzc2VkKCZjb250ZW50X2NvcHkpLCBjb250ZW50X3NpemUpKTsKKyAgICAvLyBJbnRlcnByZXQgdGhlIHJlc3VsdC4KKyAgICBpZiAoc2Vzc2lvbl9pZCkgeworICAgICAgLy8gU3VjY2Vzc2Z1bCByZXF1ZXN0IGdlbmVyYXRpb24uCisKKyAgICAgIC8vIEVuYWJsZSBzZXNzaW9uIGxvb2t1cCBieSBpZCB3aGljaCBpcyB1c2VkIGJ5IHNwb250YW5lb3VzIGNhbGxiYWNrcy4KKyAgICAgIHNlc3Npb25fdXBkYXRlX3JlcXVlc3Quc2Vzc2lvbi0+c2V0X2lkKCpzZXNzaW9uX2lkKTsKKyAgICAgIGlkX3RvX3Nlc3Npb25fbWFwXy5pbnNlcnQoCisgICAgICAgICAgc3RkOjptYWtlX3BhaXIoKnNlc3Npb25faWQsIHNlc3Npb25fdXBkYXRlX3JlcXVlc3Quc2Vzc2lvbikpOworCisgICAgICBzZXNzaW9uX3VwZGF0ZV9yZXF1ZXN0LmdlbmVyYXRlZF9jYWxsYmFjay5SdW4obWVzc2FnZS5QYXNzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV9zaXplKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gRmFpbHVyZSBkdXJpbmcgcmVxdWVzdCBnZW5lcmF0aW9uLgorICAgICAgc2Vzc2lvbl91cGRhdGVfcmVxdWVzdC5kaWRfbm90X2dlbmVyYXRlX2NhbGxiYWNrLlJ1bigpOworICAgIH0KKworICAgIC8vIFN3ZWVwIHRoZSBjb250ZXh0IG9mIHxHZW5lcmF0ZVNlc3Npb25VcGRhdGVSZXF1ZXN0fC4KKyAgICB0aWNrZXRfdG9fc2Vzc2lvbl91cGRhdGVfcmVxdWVzdF9tYXBfLmVyYXNlKAorICAgICAgICBzZXNzaW9uX3VwZGF0ZV9yZXF1ZXN0X2l0ZXJhdG9yKTsKICAgfSBlbHNlIHsKLSAgICBtZXNzYWdlX2xvb3BfLT5Qb3N0VGFzaygKLSAgICAgICAgRlJPTV9IRVJFLAotICAgICAgICBiYXNlOjpCaW5kKCZEcm1TeXN0ZW1DbGllbnQ6Ok9uU2Vzc2lvblVwZGF0ZVJlcXVlc3REaWROb3RHZW5lcmF0ZSwKLSAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKGNsaWVudF8pLCB0aWNrZXQpKTsKKyAgICAvLyBDYWxsZWQgYmFjayBzcG9udGFuZW91c2x5IGJ5IHRoZSB1bmRlcmx5aW5nIERSTSBzeXN0ZW0uCisKKyAgICAvLyBGaW5kIHRoZSBzZXNzaW9uIGJ5IElELgorICAgIElkVG9TZXNzaW9uTWFwOjppdGVyYXRvciBzZXNzaW9uX2l0ZXJhdG9yID0KKyAgICAgICAgaWRfdG9fc2Vzc2lvbl9tYXBfLmZpbmQoKnNlc3Npb25faWQpOworICAgIGlmIChzZXNzaW9uX2l0ZXJhdG9yID09IGlkX3RvX3Nlc3Npb25fbWFwXy5lbmQoKSkgeworICAgICAgTE9HKEVSUk9SKSA8PCAiVW5rbm93biBzZXNzaW9uIGlkOiAiIDw8ICpzZXNzaW9uX2lkIDw8ICIuIjsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgU2Vzc2lvbiogc2Vzc2lvbiA9IHNlc3Npb25faXRlcmF0b3ItPnNlY29uZDsKKworICAgIHNlc3Npb24tPnVwZGF0ZV9yZXF1ZXN0X2dlbmVyYXRlZF9jYWxsYmFjaygpLlJ1bihtZXNzYWdlLlBhc3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV9zaXplKTsKICAgfQogfQogCi12b2lkIERybVN5c3RlbTo6T25TZXNzaW9uVXBkYXRlZChpbnQgdGlja2V0LCBjb25zdCB2b2lkKiAvKnNlc3Npb25faWQqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKnNlc3Npb25faWRfc2l6ZSovLCBib29sIHN1Y2NlZWRlZCkgewotICBpZiAoc3VjY2VlZGVkKSB7Ci0gICAgbWVzc2FnZV9sb29wXy0+UG9zdFRhc2soRlJPTV9IRVJFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OkJpbmQoJkRybVN5c3RlbUNsaWVudDo6T25TZXNzaW9uVXBkYXRlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQoY2xpZW50XyksIHRpY2tldCkpOwotICB9IGVsc2UgewotICAgIG1lc3NhZ2VfbG9vcF8tPlBvc3RUYXNrKEZST01fSEVSRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpCaW5kKCZEcm1TeXN0ZW1DbGllbnQ6Ok9uU2Vzc2lvbkRpZE5vdFVwZGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQoY2xpZW50XyksIHRpY2tldCkpOwordm9pZCBEcm1TeXN0ZW06Ok9uU2Vzc2lvblVwZGF0ZWQoaW50IHRpY2tldCwgYm9vbCBzdWNjZWVkZWQpIHsKKyAgLy8gUmVzdG9yZSB0aGUgY29udGV4dCBvZiB8VXBkYXRlU2Vzc2lvbnwuCisgIFRpY2tldFRvU2Vzc2lvblVwZGF0ZU1hcDo6aXRlcmF0b3Igc2Vzc2lvbl91cGRhdGVfaXRlcmF0b3IgPQorICAgICAgdGlja2V0X3RvX3Nlc3Npb25fdXBkYXRlX21hcF8uZmluZCh0aWNrZXQpOworICBpZiAoc2Vzc2lvbl91cGRhdGVfaXRlcmF0b3IgPT0gdGlja2V0X3RvX3Nlc3Npb25fdXBkYXRlX21hcF8uZW5kKCkpIHsKKyAgICBMT0coRVJST1IpIDw8ICJVbmtub3duIHNlc3Npb24gdXBkYXRlIHRpY2tldDogIiA8PCB0aWNrZXQgPDwgIi4iOworICAgIHJldHVybjsKICAgfQorICBjb25zdCBTZXNzaW9uVXBkYXRlJiBzZXNzaW9uX3VwZGF0ZSA9IHNlc3Npb25fdXBkYXRlX2l0ZXJhdG9yLT5zZWNvbmQ7CisKKyAgLy8gSW50ZXJwcmV0IHRoZSByZXN1bHQuCisgIGlmIChzdWNjZWVkZWQpIHsKKyAgICBzZXNzaW9uX3VwZGF0ZS51cGRhdGVkX2NhbGxiYWNrLlJ1bigpOworICB9IGVsc2UgeworICAgIHNlc3Npb25fdXBkYXRlLmRpZF9ub3RfdXBkYXRlX2NhbGxiYWNrLlJ1bigpOworICB9CisKKyAgLy8gU3dlZXAgdGhlIGNvbnRleHQgb2YgfFVwZGF0ZVNlc3Npb258LgorICB0aWNrZXRfdG9fc2Vzc2lvbl91cGRhdGVfbWFwXy5lcmFzZShzZXNzaW9uX3VwZGF0ZV9pdGVyYXRvcik7CiB9CiAKIC8vIHN0YXRpYwpAQCAtOTcsMjAgKzIwNCwzNSBAQAogICBEcm1TeXN0ZW0qIGRybV9zeXN0ZW0gPSBzdGF0aWNfY2FzdDxEcm1TeXN0ZW0qPihjb250ZXh0KTsKICAgRENIRUNLX0VRKHdyYXBwZWRfZHJtX3N5c3RlbSwgZHJtX3N5c3RlbS0+d3JhcHBlZF9kcm1fc3lzdGVtXyk7CiAKLSAgZHJtX3N5c3RlbS0+T25TZXNzaW9uVXBkYXRlUmVxdWVzdEdlbmVyYXRlZCgKLSAgICAgIHRpY2tldCwgc2Vzc2lvbl9pZCwgc2Vzc2lvbl9pZF9zaXplLCBjb250ZW50LCBjb250ZW50X3NpemUpOworICBiYXNlOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4gc2Vzc2lvbl9pZF9jb3B5OworICBzY29wZWRfYXJyYXk8dWludDg+IGNvbnRlbnRfY29weTsKKyAgaWYgKHNlc3Npb25faWQpIHsKKyAgICBzZXNzaW9uX2lkX2NvcHkgPQorICAgICAgICBzdGQ6OnN0cmluZyhzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4oc2Vzc2lvbl9pZCksCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IGNoYXIqPihzZXNzaW9uX2lkKSArIHNlc3Npb25faWRfc2l6ZSk7CisKKyAgICBjb250ZW50X2NvcHkucmVzZXQobmV3IHVpbnQ4W2NvbnRlbnRfc2l6ZV0pOworICAgIFNiTWVtb3J5Q29weShjb250ZW50X2NvcHkuZ2V0KCksIGNvbnRlbnQsIGNvbnRlbnRfc2l6ZSk7CisgIH0KKworICBkcm1fc3lzdGVtLT5tZXNzYWdlX2xvb3BfLT5Qb3N0VGFzaygKKyAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZCgmRHJtU3lzdGVtOjpPblNlc3Npb25VcGRhdGVSZXF1ZXN0R2VuZXJhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRybV9zeXN0ZW0tPndlYWtfdGhpc18sIHRpY2tldCwgc2Vzc2lvbl9pZF9jb3B5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlBhc3NlZCgmY29udGVudF9jb3B5KSwgY29udGVudF9zaXplKSk7CiB9CiAKIC8vIHN0YXRpYwogdm9pZCBEcm1TeXN0ZW06Ok9uU2Vzc2lvblVwZGF0ZWRGdW5jKFNiRHJtU3lzdGVtIHdyYXBwZWRfZHJtX3N5c3RlbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjb250ZXh0LCBpbnQgdGlja2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIHNlc3Npb25faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25faWRfc2l6ZSwgYm9vbCBzdWNjZWVkZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiAvKnNlc3Npb25faWQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLypzZXNzaW9uX2lkX3NpemUqLywgYm9vbCBzdWNjZWVkZWQpIHsKICAgRENIRUNLKGNvbnRleHQpOwogICBEcm1TeXN0ZW0qIGRybV9zeXN0ZW0gPSBzdGF0aWNfY2FzdDxEcm1TeXN0ZW0qPihjb250ZXh0KTsKICAgRENIRUNLX0VRKHdyYXBwZWRfZHJtX3N5c3RlbSwgZHJtX3N5c3RlbS0+d3JhcHBlZF9kcm1fc3lzdGVtXyk7CiAKLSAgZHJtX3N5c3RlbS0+T25TZXNzaW9uVXBkYXRlZCh0aWNrZXQsIHNlc3Npb25faWQsIHNlc3Npb25faWRfc2l6ZSwgc3VjY2VlZGVkKTsKKyAgZHJtX3N5c3RlbS0+bWVzc2FnZV9sb29wXy0+UG9zdFRhc2soCisgICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoJkRybVN5c3RlbTo6T25TZXNzaW9uVXBkYXRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcm1fc3lzdGVtLT53ZWFrX3RoaXNfLCB0aWNrZXQsIHN1Y2NlZWRlZCkpOwogfQogCiB9ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9kcm1fc3lzdGVtLmggYi9zcmMvY29iYWx0L21lZGlhL2Jhc2UvZHJtX3N5c3RlbS5oCmluZGV4IDAxOGM0MjguLjg1OTYyNDEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9kcm1fc3lzdGVtLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2RybV9zeXN0ZW0uaApAQCAtMTcsOCArMTcsMTEgQEAKIAogI2luY2x1ZGUgPHN0cmluZz4KIAorI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfcHRyLmgiCisjaW5jbHVkZSAiYmFzZS9tZW1vcnkvd2Vha19wdHIuaCIKICNpbmNsdWRlICJiYXNlL21lc3NhZ2VfbG9vcC5oIgotI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL2RybV9zeXN0ZW1fY2xpZW50LmgiCisjaW5jbHVkZSAiYmFzZS9vcHRpb25hbC5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9kcm0uaCIKIAogI2lmIFNCX0FQSV9WRVJTSU9OIDwgNApAQCAtMzAsMzIgKzMzLDEyMiBAQAogCiAvLyBBIEMrKyB3cmFwcGVyIGFyb3VuZCB8U2JEcm1TeXN0ZW18LgogLy8KLS8vIEVuc3VyZXMgdGhhdCBjYWxscyB0byB8RHJtU3lzdGVtQ2xpZW50fCBhcmUgYWx3YXlzIGFzeW5jaHJvbm91cyBhbmQgcGVyZm9ybWVkCisvLyBFbnN1cmVzIHRoYXQgY2FsbGJhY2tzIGFyZSBhbHdheXMgYXN5bmNocm9ub3VzIGFuZCBwZXJmb3JtZWQKIC8vIGZyb20gdGhlIHNhbWUgdGhyZWFkIHdoZXJlIHxEcm1TeXN0ZW18IHdhcyBpbnN0YW50aWF0ZWQuCiBjbGFzcyBEcm1TeXN0ZW0gewogIHB1YmxpYzoKLSAgRHJtU3lzdGVtKGNvbnN0IGNoYXIqIGtleV9zeXN0ZW0sIERybVN5c3RlbUNsaWVudCogY2xpZW50KTsKKyAgdHlwZWRlZiBiYXNlOjpDYWxsYmFjazx2b2lkKHNjb3BlZF9hcnJheTx1aW50OD4gbWVzc2FnZSwgaW50IG1lc3NhZ2Vfc2l6ZSk+CisgICAgICBTZXNzaW9uVXBkYXRlUmVxdWVzdEdlbmVyYXRlZENhbGxiYWNrOworICB0eXBlZGVmIGJhc2U6OkNhbGxiYWNrPHZvaWQoKT4gU2Vzc2lvblVwZGF0ZVJlcXVlc3REaWROb3RHZW5lcmF0ZUNhbGxiYWNrOworICB0eXBlZGVmIGJhc2U6OkNhbGxiYWNrPHZvaWQoKT4gU2Vzc2lvblVwZGF0ZWRDYWxsYmFjazsKKyAgdHlwZWRlZiBiYXNlOjpDYWxsYmFjazx2b2lkKCk+IFNlc3Npb25EaWROb3RVcGRhdGVDYWxsYmFjazsKKworICAvLyBGbHl3ZWlnaHQgdGhhdCBwcm92aWRlcyBSQUlJIHNlbWFudGljcyBmb3Igc2Vzc2lvbnMuCisgIC8vIE1vc3Qgb2YgbG9naWMgaXMgaW1wbGVtZW50ZWQgYnkgfERybVN5c3RlbXwuCisgIGNsYXNzIFNlc3Npb24geworICAgcHVibGljOgorICAgIH5TZXNzaW9uKCk7CisKKyAgICBjb25zdCBiYXNlOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4mIGlkKCkgY29uc3QgeyByZXR1cm4gaWRfOyB9CisKKyAgICAvLyBXcmFwcyB8U2JEcm1HZW5lcmF0ZVNlc3Npb25VcGRhdGVSZXF1ZXN0fC4KKyAgICAvLworICAgIC8vIHxzZXNzaW9uX3VwZGF0ZV9yZXF1ZXN0X2dlbmVyYXRlZF9jYWxsYmFja3wgaXMgY2FsbGVkIHVwb24gYSBzdWNjZXNzZnVsCisgICAgLy8gICAgIHJlcXVlc3QgZ2VuZXJhdGlvbi4gSU1QT1JUQU5UOiBJdCBtYXkgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGFmdGVyCisgICAgLy8gICAgIGEgc2luZ2xlIGNhbGwgdG8gfENyZWF0ZVNlc3Npb25BbmRHZW5lcmF0ZVVwZGF0ZVJlcXVlc3R8LCBmb3IgZXhhbXBsZQorICAgIC8vICAgICB3aGVuIHRoZSB1bmRlcmx5aW5nIERSTSBzeXN0ZW0gbmVlZHMgdG8gdXBkYXRlIGEgbGljZW5zZS4KKyAgICAvLworICAgIC8vIHxzZXNzaW9uX3VwZGF0ZV9yZXF1ZXN0X2RpZF9ub3RfZ2VuZXJhdGVfY2FsbGJhY2t8IGlzIGNhbGxlZCB1cG9uIGEKKyAgICAvLyAgICAgZmFpbHVyZSBkdXJpbmcgcmVxdWVzdCBnZW5lcmF0aW9uLiBVbmxpa2UgaXRzIHN1Y2Nlc3NmdWwgY291bnRlcnBhcnQsCisgICAgLy8gICAgIG5ldmVyIGNhbGxlZCBzcG9udGFuZW91c2x5LgorICAgIHZvaWQgR2VuZXJhdGVVcGRhdGVSZXF1ZXN0KAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdHlwZSwgY29uc3QgdWludDgqIGluaXRfZGF0YSwgaW50IGluaXRfZGF0YV9sZW5ndGgsCisgICAgICAgIGNvbnN0IFNlc3Npb25VcGRhdGVSZXF1ZXN0R2VuZXJhdGVkQ2FsbGJhY2smCisgICAgICAgICAgICBzZXNzaW9uX3VwZGF0ZV9yZXF1ZXN0X2dlbmVyYXRlZF9jYWxsYmFjaywKKyAgICAgICAgY29uc3QgU2Vzc2lvblVwZGF0ZVJlcXVlc3REaWROb3RHZW5lcmF0ZUNhbGxiYWNrJgorICAgICAgICAgICAgc2Vzc2lvbl91cGRhdGVfcmVxdWVzdF9kaWRfbm90X2dlbmVyYXRlX2NhbGxiYWNrKTsKKworICAgIC8vIFdyYXBzIHxTYkRybVVwZGF0ZVNlc3Npb258LgorICAgIC8vCisgICAgLy8gfHNlc3Npb25fdXBkYXRlZF9jYWxsYmFja3wgaXMgY2FsbGVkIHVwb24gYSBzdWNjZXNzZnVsIHNlc3Npb24gdXBkYXRlLgorICAgIC8vIHxzZXNzaW9uX2RpZF9ub3RfdXBkYXRlX2NhbGxiYWNrfCBpcyBjYWxsZWQgdXBvbiBhIGZhaWx1cmUgZHVyaW5nIHNlc3Npb24KKyAgICAvLyAgICAgdXBkYXRlLgorICAgIHZvaWQgVXBkYXRlKAorICAgICAgICBjb25zdCB1aW50OCoga2V5LCBpbnQga2V5X2xlbmd0aCwKKyAgICAgICAgY29uc3QgU2Vzc2lvblVwZGF0ZWRDYWxsYmFjayYgc2Vzc2lvbl91cGRhdGVkX2NhbGxiYWNrLAorICAgICAgICBjb25zdCBTZXNzaW9uRGlkTm90VXBkYXRlQ2FsbGJhY2smIHNlc3Npb25fZGlkX25vdF91cGRhdGVfY2FsbGJhY2spOworCisgICAgLy8gV3JhcHMgfFNiRHJtQ2xvc2VTZXNzaW9ufC4KKyAgICB2b2lkIENsb3NlKCk7CisgICAgYm9vbCBpc19jbG9zZWQoKSBjb25zdCB7IHJldHVybiBjbG9zZWRfOyB9CisKKyAgIHByaXZhdGU6CisgICAgLy8gUHJpdmF0ZSBBUEkgZm9yIHxEcm1TeXN0ZW18LgorICAgIGV4cGxpY2l0IFNlc3Npb24oRHJtU3lzdGVtKiBkcm1fc3lzdGVtKTsKKyAgICB2b2lkIHNldF9pZChjb25zdCBzdGQ6OnN0cmluZyYgaWQpIHsgaWRfID0gaWQ7IH0KKyAgICBjb25zdCBTZXNzaW9uVXBkYXRlUmVxdWVzdEdlbmVyYXRlZENhbGxiYWNrJgorICAgIHVwZGF0ZV9yZXF1ZXN0X2dlbmVyYXRlZF9jYWxsYmFjaygpIGNvbnN0IHsKKyAgICAgIHJldHVybiB1cGRhdGVfcmVxdWVzdF9nZW5lcmF0ZWRfY2FsbGJhY2tfOworICAgIH0KKworICAgIERybVN5c3RlbSogY29uc3QgZHJtX3N5c3RlbV87CisgICAgYm9vbCBjbG9zZWRfOworICAgIGJhc2U6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiBpZF87CisgICAgLy8gU3VwcG9ydHMgc3BvbnRhbmVvdXMgaW52b2NhdGlvbnMgb2YgfFNiRHJtU2Vzc2lvblVwZGF0ZVJlcXVlc3RGdW5jfC4KKyAgICBTZXNzaW9uVXBkYXRlUmVxdWVzdEdlbmVyYXRlZENhbGxiYWNrIHVwZGF0ZV9yZXF1ZXN0X2dlbmVyYXRlZF9jYWxsYmFja187CisKKyAgICBmcmllbmQgY2xhc3MgRHJtU3lzdGVtOworCisgICAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFNlc3Npb24pOworICB9OworCisgIGV4cGxpY2l0IERybVN5c3RlbShjb25zdCBjaGFyKiBrZXlfc3lzdGVtKTsKICAgfkRybVN5c3RlbSgpOwogCiAgIFNiRHJtU3lzdGVtIHdyYXBwZWRfZHJtX3N5c3RlbSgpIHsgcmV0dXJuIHdyYXBwZWRfZHJtX3N5c3RlbV87IH0KIAotICAvLyBXcmFwcyB8U2JEcm1HZW5lcmF0ZVNlc3Npb25VcGRhdGVSZXF1ZXN0fC4KLSAgdm9pZCBHZW5lcmF0ZVNlc3Npb25VcGRhdGVSZXF1ZXN0KGludCB0aWNrZXQsIGNvbnN0IHN0ZDo6c3RyaW5nJiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIGluaXRfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbml0X2RhdGFfbGVuZ3RoKTsKLSAgLy8gV3JhcHMgfFNiRHJtVXBkYXRlU2Vzc2lvbnwuCi0gIHZvaWQgVXBkYXRlU2Vzc2lvbihpbnQgdGlja2V0LCBjb25zdCBzdGQ6OnN0cmluZyYgc2Vzc2lvbl9pZCwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiBrZXksIGludCBrZXlfbGVuZ3RoKTsKLSAgLy8gV3JhcHMgfFNiRHJtQ2xvc2VTZXNzaW9ufC4KLSAgdm9pZCBDbG9zZVNlc3Npb24oY29uc3Qgc3RkOjpzdHJpbmcmIHNlc3Npb25faWQpOworICBzY29wZWRfcHRyPFNlc3Npb24+IENyZWF0ZVNlc3Npb24oKTsKIAogIHByaXZhdGU6Ci0gIHZvaWQgT25TZXNzaW9uVXBkYXRlUmVxdWVzdEdlbmVyYXRlZChpbnQgdGlja2V0LCBjb25zdCB2b2lkKiBzZXNzaW9uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25faWRfc2l6ZSwgY29uc3Qgdm9pZCogY29udGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb250ZW50X3NpemUpOwotICB2b2lkIE9uU2Vzc2lvblVwZGF0ZWQoaW50IHRpY2tldCwgY29uc3Qgdm9pZCogc2Vzc2lvbl9pZCwgaW50IHNlc3Npb25faWRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3VjY2VlZGVkKTsKKyAgLy8gU3RvcmVzIGNvbnRleHQgb2YgfEdlbmVyYXRlU2Vzc2lvblVwZGF0ZVJlcXVlc3R8LgorICBzdHJ1Y3QgU2Vzc2lvblVwZGF0ZVJlcXVlc3QgeworICAgIFNlc3Npb24qIHNlc3Npb247CisgICAgU2Vzc2lvblVwZGF0ZVJlcXVlc3RHZW5lcmF0ZWRDYWxsYmFjayBnZW5lcmF0ZWRfY2FsbGJhY2s7CisgICAgU2Vzc2lvblVwZGF0ZVJlcXVlc3REaWROb3RHZW5lcmF0ZUNhbGxiYWNrIGRpZF9ub3RfZ2VuZXJhdGVfY2FsbGJhY2s7CisgIH07CisgIHR5cGVkZWYgYmFzZTo6aGFzaF9tYXA8aW50LCBTZXNzaW9uVXBkYXRlUmVxdWVzdD4KKyAgICAgIFRpY2tldFRvU2Vzc2lvblVwZGF0ZVJlcXVlc3RNYXA7CiAKKyAgdHlwZWRlZiBiYXNlOjpoYXNoX21hcDxzdGQ6OnN0cmluZywgU2Vzc2lvbio+IElkVG9TZXNzaW9uTWFwOworCisgIC8vIFN0b3JlcyBjb250ZXh0IG9mIHxTZXNzaW9uOjpVcGRhdGV8LgorICBzdHJ1Y3QgU2Vzc2lvblVwZGF0ZSB7CisgICAgU2Vzc2lvblVwZGF0ZWRDYWxsYmFjayB1cGRhdGVkX2NhbGxiYWNrOworICAgIFNlc3Npb25EaWROb3RVcGRhdGVDYWxsYmFjayBkaWRfbm90X3VwZGF0ZV9jYWxsYmFjazsKKyAgfTsKKyAgdHlwZWRlZiBiYXNlOjpoYXNoX21hcDxpbnQsIFNlc3Npb25VcGRhdGU+IFRpY2tldFRvU2Vzc2lvblVwZGF0ZU1hcDsKKworICAvLyBQcml2YXRlIEFQSSBmb3IgfFNlc3Npb258LgorICB2b2lkIEdlbmVyYXRlU2Vzc2lvblVwZGF0ZVJlcXVlc3QoCisgICAgICBTZXNzaW9uKiBzZXNzaW9uLCBjb25zdCBzdGQ6OnN0cmluZyYgdHlwZSwgY29uc3QgdWludDhfdCogaW5pdF9kYXRhLAorICAgICAgaW50IGluaXRfZGF0YV9sZW5ndGgsIGNvbnN0IFNlc3Npb25VcGRhdGVSZXF1ZXN0R2VuZXJhdGVkQ2FsbGJhY2smCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25fdXBkYXRlX3JlcXVlc3RfZ2VuZXJhdGVkX2NhbGxiYWNrLAorICAgICAgY29uc3QgU2Vzc2lvblVwZGF0ZVJlcXVlc3REaWROb3RHZW5lcmF0ZUNhbGxiYWNrJgorICAgICAgICAgIHNlc3Npb25fdXBkYXRlX3JlcXVlc3RfZGlkX25vdF9nZW5lcmF0ZV9jYWxsYmFjayk7CisgIHZvaWQgVXBkYXRlU2Vzc2lvbigKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXNzaW9uX2lkLCBjb25zdCB1aW50OF90KiBrZXksIGludCBrZXlfbGVuZ3RoLAorICAgICAgY29uc3QgU2Vzc2lvblVwZGF0ZWRDYWxsYmFjayYgc2Vzc2lvbl91cGRhdGVkX2NhbGxiYWNrLAorICAgICAgY29uc3QgU2Vzc2lvbkRpZE5vdFVwZGF0ZUNhbGxiYWNrJiBzZXNzaW9uX2RpZF9ub3RfdXBkYXRlX2NhbGxiYWNrKTsKKyAgdm9pZCBDbG9zZVNlc3Npb24oY29uc3Qgc3RkOjpzdHJpbmcmIHNlc3Npb25faWQpOworCisgIC8vIENhbGxlZCBvbiB0aGUgY29uc3RydWN0b3IgdGhyZWFkLCBwYXJhbWV0ZXJzIGFyZSBjb3BpZWQgYW5kIG93bmVkIGJ5IHRoZXNlCisgIC8vIG1ldGhvZHMuCisgIHZvaWQgT25TZXNzaW9uVXBkYXRlUmVxdWVzdEdlbmVyYXRlZCgKKyAgICAgIGludCB0aWNrZXQsIGNvbnN0IGJhc2U6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiYgc2Vzc2lvbl9pZCwKKyAgICAgIHNjb3BlZF9hcnJheTx1aW50OD4gbWVzc2FnZSwgaW50IG1lc3NhZ2Vfc2l6ZSk7CisgIHZvaWQgT25TZXNzaW9uVXBkYXRlZChpbnQgdGlja2V0LCBib29sIHN1Y2NlZWRlZCk7CisKKyAgLy8gQ2FsbGVkIG9uIGFueSB0aHJlYWQsIHBhcmFtZXRlcnMgbmVlZCB0byBiZSBjb3BpZWQgaW1tZWRpYXRlbHkuCiAgIHN0YXRpYyB2b2lkIE9uU2Vzc2lvblVwZGF0ZVJlcXVlc3RHZW5lcmF0ZWRGdW5jKAogICAgICAgU2JEcm1TeXN0ZW0gd3JhcHBlZF9kcm1fc3lzdGVtLCB2b2lkKiBjb250ZXh0LCBpbnQgdGlja2V0LAogICAgICAgY29uc3Qgdm9pZCogc2Vzc2lvbl9pZCwgaW50IHNlc3Npb25faWRfc2l6ZSwgY29uc3Qgdm9pZCogY29udGVudCwKQEAgLTY1LDEwICsxNTgsMjYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogc2Vzc2lvbl9pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25faWRfbGVuZ3RoLCBib29sIHN1Y2NlZWRlZCk7CiAKLSAgRHJtU3lzdGVtQ2xpZW50KiBjb25zdCBjbGllbnRfOwogICBjb25zdCBTYkRybVN5c3RlbSB3cmFwcGVkX2RybV9zeXN0ZW1fOwogICBNZXNzYWdlTG9vcCogY29uc3QgbWVzc2FnZV9sb29wXzsKIAorICAvLyBGYWN0b3J5IHNob3VsZCBvbmx5IGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBpbml0aWFsIHdlYWsgcG9pbnRlci4gQWxsCisgIC8vIHN1YnNlcXVlbnQgd2VhayBwb2ludGVycyBhcmUgY3JlYXRlZCBieSBjb3B5aW5nIHRoZSBpbml0aWFsIG9uZS4gVGhpcyBpcworICAvLyByZXF1aXJlZCB0byBrZWVwIHdlYWsgcG9pbnRlcnMgYm91bmQgdG8gdGhlIGNvbnN0cnVjdG9yIHRocmVhZC4KKyAgYmFzZTo6V2Vha1B0ckZhY3Rvcnk8RHJtU3lzdGVtPiB3ZWFrX3B0cl9mYWN0b3J5XzsKKyAgYmFzZTo6V2Vha1B0cjxEcm1TeXN0ZW0+IHdlYWtfdGhpc187CisKKyAgLy8gU3VwcG9ydHMgY29uY3VycmVudCBjYWxscyB0byB8R2VuZXJhdGVTZXNzaW9uVXBkYXRlUmVxdWVzdHwuCisgIGludCBuZXh0X3Nlc3Npb25fdXBkYXRlX3JlcXVlc3RfdGlja2V0XzsKKyAgVGlja2V0VG9TZXNzaW9uVXBkYXRlUmVxdWVzdE1hcCB0aWNrZXRfdG9fc2Vzc2lvbl91cGRhdGVfcmVxdWVzdF9tYXBfOworCisgIC8vIFN1cHBvcnRzIHNwb250YW5lb3VzIGludm9jYXRpb25zIG9mIHxTYkRybVNlc3Npb25VcGRhdGVSZXF1ZXN0RnVuY3wuCisgIElkVG9TZXNzaW9uTWFwIGlkX3RvX3Nlc3Npb25fbWFwXzsKKworICAvLyBTdXBwb3J0cyBjb25jdXJyZW50IGNhbGxzIHRvIHxTZXNzaW9uOjpVcGRhdGV8LgorICBpbnQgbmV4dF9zZXNzaW9uX3VwZGF0ZV90aWNrZXRfOworICBUaWNrZXRUb1Nlc3Npb25VcGRhdGVNYXAgdGlja2V0X3RvX3Nlc3Npb25fdXBkYXRlX21hcF87CisKICAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKERybVN5c3RlbSk7CiB9OwogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Jhc2UvZHJtX3N5c3RlbV9jbGllbnQuaCBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9kcm1fc3lzdGVtX2NsaWVudC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGZkZGZlLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9kcm1fc3lzdGVtX2NsaWVudC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2lmbmRlZiBDT0JBTFRfTUVESUFfQkFTRV9EUk1fU1lTVEVNX0NMSUVOVF9IXwotI2RlZmluZSBDT0JBTFRfTUVESUFfQkFTRV9EUk1fU1lTVEVNX0NMSUVOVF9IXwotCi0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oIgotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLS8vIEFuIGludGVyZmFjZSB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzIG9mIHxEcm1TeXN0ZW18LgotLy8KLS8vIENhbGxzIHRvIHxEcm1TeXN0ZW1DbGllbnR8IGFyZSBhbHdheXMgcGVyZm9ybWVkIGZyb20gdGhlIHNhbWUgdGhyZWFkCi0vLyB3aGVyZSB8RHJtU3lzdGVtfCB3YXMgaW5zdGFudGlhdGVkLgotY2xhc3MgRHJtU3lzdGVtQ2xpZW50IHsKLSBwdWJsaWM6Ci0gIC8vIFdoZW4gY2FsbGVkIGFzIGEgcmVzdWx0IG9mIHxEcm1TeXN0ZW06OkdlbmVyYXRlU2Vzc2lvblVwZGF0ZVJlcXVlc3R8LCB0aGlzCi0gIC8vIG1ldGhvZCBkZW5vdGVzIGEgc3VjY2Vzc2Z1bCByZXF1ZXN0IGdlbmVyYXRpb24uCi0gIC8vCi0gIC8vIFRoaXMgbWV0aG9kIG1heSBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgYWZ0ZXIgYSBzaW5nbGUgY2FsbCB0bwotICAvLyB8R2VuZXJhdGVTZXNzaW9uVXBkYXRlUmVxdWVzdHwsIGZvciBleGFtcGxlIHdoZW4gdGhlIHVuZGVybHlpbmcgRFJNIHN5c3RlbQotICAvLyBuZWVkcyB0byB1cGRhdGUgYSBsaWNlbnNlLiBJbiB0aGlzIGNhc2UgfHRpY2tldHwgd2lsbCBiZQotICAvLyB8a1NiRHJtVGlja2V0SW52YWxpZHwuCi0gIHZpcnR1YWwgdm9pZCBPblNlc3Npb25VcGRhdGVSZXF1ZXN0R2VuZXJhdGVkKGludCB0aWNrZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXNzaW9uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29wZWRfYXJyYXk8dWludDg+IG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZXNzYWdlX3NpemUpID0gMDsKLSAgLy8gQ2FsbGVkIGFzIGEgcmVzdWx0IG9mIHxHZW5lcmF0ZVNlc3Npb25VcGRhdGVSZXF1ZXN0fCBhbmQgZGVub3RlcyBhIGZhaWx1cmUKLSAgLy8gZHVyaW5nIHJlcXVlc3QgZ2VuZXJhdGlvbi4KLSAgLy8KLSAgLy8gVW5saWtlIGl0cyBzdWNjZXNzZnVsIGNvdW50ZXJwYXJ0LCBuZXZlciBjYWxsZWQgc3BvbnRhbmVvdXNseS4KLSAgdmlydHVhbCB2b2lkIE9uU2Vzc2lvblVwZGF0ZVJlcXVlc3REaWROb3RHZW5lcmF0ZShpbnQgdGlja2V0KSA9IDA7Ci0KLSAgLy8gQ2FsbGVkIGFzIGEgcmVzdWx0IG9mIHxVcGRhdGVTZXNzaW9ufCBhbmQgZGVub3RlcyBhIHN1Y2Nlc3NmdWwgc2Vzc2lvbgotICAvLyB1cGRhdGUuCi0gIHZpcnR1YWwgdm9pZCBPblNlc3Npb25VcGRhdGVkKGludCB0aWNrZXQpID0gMDsKLSAgLy8gQ2FsbGVkIGFzIGEgcmVzdWx0IG9mIHxVcGRhdGVTZXNzaW9ufCBhbmQgZGVub3RlcyBhIGZhaWx1cmUgZHVyaW5nIHNlc3Npb24KLSAgLy8gdXBkYXRlLgotICB2aXJ0dWFsIHZvaWQgT25TZXNzaW9uRGlkTm90VXBkYXRlKGludCB0aWNrZXQpID0gMDsKLQotIHByb3RlY3RlZDoKLSAgdmlydHVhbCB+RHJtU3lzdGVtQ2xpZW50KCkge30KLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAotCi0jZW5kaWYgIC8vIENPQkFMVF9NRURJQV9CQVNFX0RSTV9TWVNURU1fQ0xJRU5UX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL21lZGlhMi5neXAgYi9zcmMvY29iYWx0L21lZGlhL21lZGlhMi5neXAKaW5kZXggMThjMTY4My4uOTgyYjM2NCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9tZWRpYTIuZ3lwCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvbWVkaWEyLmd5cApAQCAtNjUsNyArNjUsNiBAQAogICAgICAgICAnYmFzZS9kZW11eGVyX3N0cmVhbV9wcm92aWRlci5oJywKICAgICAgICAgJ2Jhc2UvZHJtX3N5c3RlbS5jYycsCiAgICAgICAgICdiYXNlL2RybV9zeXN0ZW0uaCcsCi0gICAgICAgICdiYXNlL2RybV9zeXN0ZW1fY2xpZW50LmgnLAogICAgICAgICAnYmFzZS9lbmNyeXB0aW9uX3NjaGVtZS5jYycsCiAgICAgICAgICdiYXNlL2VuY3J5cHRpb25fc2NoZW1lLmgnLAogICAgICAgICAnYmFzZS9oZHJfbWV0YWRhdGEuY2MnLApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9tZWRpYV9tb2R1bGUuY2MgYi9zcmMvY29iYWx0L21lZGlhL21lZGlhX21vZHVsZS5jYwppbmRleCBkOTJhMTA1Li5kNDQ0ZWE4IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL21lZGlhX21vZHVsZS5jYworKysgYi9zcmMvY29iYWx0L21lZGlhL21lZGlhX21vZHVsZS5jYwpAQCAtODYsNiArODYsOCBAQAogdm9pZCBNZWRpYU1vZHVsZTo6U3VzcGVuZFRhc2soKSB7CiAgIERDSEVDSyhtZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwogCisgIHN1c3BlbmRlZF8gPSB0cnVlOworCiAgIGZvciAoUGxheWVyczo6aXRlcmF0b3IgaXRlciA9IHBsYXllcnNfLmJlZ2luKCk7IGl0ZXIgIT0gcGxheWVyc18uZW5kKCk7CiAgICAgICAgKytpdGVyKSB7CiAgICAgRENIRUNLKCFpdGVyLT5zZWNvbmQpOwpAQCAtMTA1LDYgKzEwNyw4IEBACiAgICAgICBpdGVyLT5maXJzdC0+UmVzdW1lKCk7CiAgICAgfQogICB9CisKKyAgc3VzcGVuZGVkXyA9IGZhbHNlOwogfQogCiB2b2lkIE1lZGlhTW9kdWxlOjpSZWdpc3RlclBsYXllclRhc2soV2ViTWVkaWFQbGF5ZXIqIHBsYXllcikgewpAQCAtMTE1LDYgKzExOSwxMCBAQAogCiAgIC8vIFRyYWNrIGRlYnVnIHN0YXRlIGZvciB0aGUgbW9zdCByZWNlbnRseSBhZGRlZCBXZWJNZWRpYVBsYXllciBpbnN0YW5jZS4KICAgUmVnaXN0ZXJEZWJ1Z1N0YXRlKHBsYXllcik7CisKKyAgaWYgKHN1c3BlbmRlZF8pIHsKKyAgICBwbGF5ZXItPlN1c3BlbmQoKTsKKyAgfQogfQogCiB2b2lkIE1lZGlhTW9kdWxlOjpVbnJlZ2lzdGVyUGxheWVyVGFzayhXZWJNZWRpYVBsYXllciogcGxheWVyKSB7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL21lZGlhX21vZHVsZS5oIGIvc3JjL2NvYmFsdC9tZWRpYS9tZWRpYV9tb2R1bGUuaAppbmRleCBmNDVlZjQ0Li5mNGIxMGMyIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL21lZGlhX21vZHVsZS5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvbWVkaWFfbW9kdWxlLmgKQEAgLTExOCw3ICsxMTgsNyBAQAogCiAgcHJvdGVjdGVkOgogICBleHBsaWNpdCBNZWRpYU1vZHVsZShjb25zdCBtYXRoOjpTaXplJiBvdXRwdXRfc2l6ZSkKLSAgICAgIDogdGhyZWFkXygibWVkaWFfbW9kdWxlIiksIG91dHB1dF9zaXplXyhvdXRwdXRfc2l6ZSkgeworICAgICAgOiB0aHJlYWRfKCJtZWRpYV9tb2R1bGUiKSwgb3V0cHV0X3NpemVfKG91dHB1dF9zaXplKSwgc3VzcGVuZGVkXyhmYWxzZSkgewogICAgIHRocmVhZF8uU3RhcnQoKTsKICAgICBtZXNzYWdlX2xvb3BfID0gdGhyZWFkXy5tZXNzYWdlX2xvb3BfcHJveHkoKTsKICAgfQpAQCAtMTQwLDYgKzE0MCw3IEBACiAgIHNjb3BlZF9yZWZwdHI8YmFzZTo6TWVzc2FnZUxvb3BQcm94eT4gbWVzc2FnZV9sb29wXzsKICAgUGxheWVycyBwbGF5ZXJzXzsKICAgbWF0aDo6U2l6ZSBvdXRwdXRfc2l6ZV87CisgIGJvb2wgc3VzcGVuZGVkXzsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9wbGF5ZXIvd2ViX21lZGlhX3BsYXllci5oIGIvc3JjL2NvYmFsdC9tZWRpYS9wbGF5ZXIvd2ViX21lZGlhX3BsYXllci5oCmluZGV4IDZjZDc4MDAuLmY4MWQyYWQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvcGxheWVyL3dlYl9tZWRpYV9wbGF5ZXIuaAorKysgYi9zcmMvY29iYWx0L21lZGlhL3BsYXllci93ZWJfbWVkaWFfcGxheWVyLmgKQEAgLTE2NSwyNyArMTY1LDYgQEAKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KIAotICAvLyBSZXR1cm5zIHdoZXRoZXIga2V5U3lzdGVtIGlzIHN1cHBvcnRlZC4gSWYgdHJ1ZSwgdGhlIHJlc3VsdCB3aWxsIGJlCi0gIC8vIHJlcG9ydGVkIGJ5IGFuIGV2ZW50LgotICB2aXJ0dWFsIE1lZGlhS2V5RXhjZXB0aW9uIEdlbmVyYXRlS2V5UmVxdWVzdCgKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiAvKiBrZXlfc3lzdGVtICovLCBjb25zdCB1bnNpZ25lZCBjaGFyKiAvKiBpbml0X2RhdGEgKi8sCi0gICAgICB1bnNpZ25lZCAvKiBpbml0X2RhdGFfbGVuZ3RoICovKSB7Ci0gICAgcmV0dXJuIGtNZWRpYUtleUV4Y2VwdGlvbktleVN5c3RlbU5vdFN1cHBvcnRlZDsKLSAgfQotICB2aXJ0dWFsIE1lZGlhS2V5RXhjZXB0aW9uIEFkZEtleShjb25zdCBzdGQ6OnN0cmluZyYgLyoga2V5X3N5c3RlbSAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogLyoga2V5ICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAvKiBrZXlfbGVuZ3RoICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiAvKiBpbml0X2RhdGEgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIC8qIGluaXRfZGF0YV9sZW5ndGggKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiAvKiBzZXNzaW9uX2lkICovKSB7Ci0gICAgcmV0dXJuIGtNZWRpYUtleUV4Y2VwdGlvbktleVN5c3RlbU5vdFN1cHBvcnRlZDsKLSAgfQotICB2aXJ0dWFsIE1lZGlhS2V5RXhjZXB0aW9uIENhbmNlbEtleVJlcXVlc3QoCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgLyoga2V5X3N5c3RlbSAqLywKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiAvKiBzZXNzaW9uX2lkICovKSB7Ci0gICAgcmV0dXJuIGtNZWRpYUtleUV4Y2VwdGlvbktleVN5c3RlbU5vdFN1cHBvcnRlZDsKLSAgfQotCiAgIHZpcnR1YWwgU2V0Qm91bmRzQ0IgR2V0U2V0Qm91bmRzQ0IoKSB7IHJldHVybiBTZXRCb3VuZHNDQigpOyB9CiAKICAgLy8gSW5zdHJ1Y3QgV2ViTWVkaWFQbGF5ZXIgdG8gZW50ZXIvZXhpdCBmdWxsc2NyZWVuLgpAQCAtMjEzLDIxICsxOTIsNiBAQAogLy8gICAgICAgYXMgfE5ldHdvcmtTdGF0ZUNoYW5nZWR8LCB8U291cmNlT3BlbmVkfCwgfEVuY3J5cHRlZE1lZGlhSW5pdERhdGF8LgogY2xhc3MgV2ViTWVkaWFQbGF5ZXJDbGllbnQgewogIHB1YmxpYzoKLSAgZW51bSBNZWRpYUtleUVycm9yQ29kZSB7Ci0gICAga01lZGlhS2V5RXJyb3JDb2RlVW5rbm93biA9IDEsCi0gICAga01lZGlhS2V5RXJyb3JDb2RlQ2xpZW50LAotICAgIGtNZWRpYUtleUVycm9yQ29kZVNlcnZpY2UsCi0gICAga01lZGlhS2V5RXJyb3JDb2RlT3V0cHV0LAotICAgIGtNZWRpYUtleUVycm9yQ29kZUhhcmR3YXJlQ2hhbmdlLAotICAgIGtNZWRpYUtleUVycm9yQ29kZURvbWFpbiwKLSAgICBrVW5rbm93bkVycm9yID0ga01lZGlhS2V5RXJyb3JDb2RlVW5rbm93biwKLSAgICBrQ2xpZW50RXJyb3IgPSBrTWVkaWFLZXlFcnJvckNvZGVDbGllbnQsCi0gICAga1NlcnZpY2VFcnJvciA9IGtNZWRpYUtleUVycm9yQ29kZVNlcnZpY2UsCi0gICAga091dHB1dEVycm9yID0ga01lZGlhS2V5RXJyb3JDb2RlT3V0cHV0LAotICAgIGtIYXJkd2FyZUNoYW5nZUVycm9yID0ga01lZGlhS2V5RXJyb3JDb2RlSGFyZHdhcmVDaGFuZ2UsCi0gICAga0RvbWFpbkVycm9yID0ga01lZGlhS2V5RXJyb3JDb2RlRG9tYWluLAotICB9OwotCiAgIHZpcnR1YWwgdm9pZCBOZXR3b3JrU3RhdGVDaGFuZ2VkKCkgPSAwOwogICB2aXJ0dWFsIHZvaWQgUmVhZHlTdGF0ZUNoYW5nZWQoKSA9IDA7CiAgIHZpcnR1YWwgdm9pZCBUaW1lQ2hhbmdlZCgpID0gMDsKQEAgLTI0OCwzNCArMjEyLDkgQEAKICAgLy8gTm90aWZpZXMgdGhlIGNsaWVudCB0aGF0IGEgdmlkZW8gaXMgZW5jcnlwdGVkLiBDbGllbnQgaXMgc3VwcG9zZWQgdG8gY2FsbAogICAvLyB8V2ViTWVkaWFQbGF5ZXI6OlNldERybVN5c3RlbXwgYXMgc29vbiBhcyBwb3NzaWJsZSB0byBhdm9pZCBzdGFsbGluZwogICAvLyBwbGF5YmFjay4KLSAgdmlydHVhbCB2b2lkIEVuY3J5cHRlZE1lZGlhSW5pdERhdGEoRW1lSW5pdERhdGFUeXBlIGluaXRfZGF0YV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBpbml0X2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGluaXRfZGF0YV9sZW5ndGgpID0gMDsKLSAgLy8gVE9ETzogTWFrZSB0aGUgRU1FIHJlbGF0ZWQgZnVuY3Rpb25zIHB1cmUgdmlydHVhbCBhZ2FpbiBvbmNlCi0gIC8vIHdlIGhhdmUgcHJvcGVyIEVNRSBpbXBsZW1lbnRhdGlvbi4gQ3VycmVudGx5IGVtcHR5IGltcGxlbWVudGF0aW9uIGFyZQotICAvLyBwcm92aWRlZCB0byBtYWtlIG1lZGlhIHRlbXBvcmFyaWx5IHdvcmsuCi0gIHZpcnR1YWwgdm9pZCBLZXlBZGRlZChjb25zdCBzdGQ6OnN0cmluZyYgLyoga2V5X3N5c3RlbSAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiAvKiBzZXNzaW9uX2lkICovKSB7Ci0gICAgTk9USU1QTEVNRU5URUQoKTsKLSAgfQotICB2aXJ0dWFsIHZvaWQgS2V5RXJyb3IoY29uc3Qgc3RkOjpzdHJpbmcmIC8qIGtleV9zeXN0ZW0gKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgLyogc2Vzc2lvbl9pZCAqLywgTWVkaWFLZXlFcnJvckNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCAvKiBzeXN0ZW1fY29kZSAqLykgewotICAgIE5PVElNUExFTUVOVEVEKCk7Ci0gIH0KLSAgdmlydHVhbCB2b2lkIEtleU1lc3NhZ2UoY29uc3Qgc3RkOjpzdHJpbmcmIC8qIGtleV9zeXN0ZW0gKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiAvKiBzZXNzaW9uX2lkICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiAvKiBtZXNzYWdlICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAvKiBtZXNzYWdlX2xlbmd0aCAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIC8qIGRlZmF1bHRfdXJsICovKSB7Ci0gICAgTk9USU1QTEVNRU5URUQoKTsKLSAgfQotICB2aXJ0dWFsIHZvaWQgS2V5TmVlZGVkKGNvbnN0IHN0ZDo6c3RyaW5nJiAvKiBrZXlfc3lzdGVtICovLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiAvKiBzZXNzaW9uX2lkICovLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIC8qIGluaXRfZGF0YSAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAvKiBpbml0X2RhdGFfbGVuZ3RoICovKSB7Ci0gICAgTk9USU1QTEVNRU5URUQoKTsKLSAgfQorICB2aXJ0dWFsIHZvaWQgRW5jcnlwdGVkTWVkaWFJbml0RGF0YUVuY291bnRlcmVkKEVtZUluaXREYXRhVHlwZSBpbml0X2RhdGFfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBpbml0X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW5pdF9kYXRhX2xlbmd0aCkgPSAwOwogICAvLyBUT0RPOiBSZXZpc2l0IHRoZSBuZWNlc3NpdHkgb2YgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMuCiAgIHZpcnR1YWwgdm9pZCBDbG9zZUhlbHBlclBsdWdpbigpIHsgTk9UUkVBQ0hFRCgpOyB9CiAgIHZpcnR1YWwgdm9pZCBEaXNhYmxlQWNjZWxlcmF0ZWRDb21wb3NpdGluZygpIHt9CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL3BsYXllci93ZWJfbWVkaWFfcGxheWVyX2ltcGwuY2MgYi9zcmMvY29iYWx0L21lZGlhL3BsYXllci93ZWJfbWVkaWFfcGxheWVyX2ltcGwuY2MKaW5kZXggN2JmZjg1Zi4uYzg0NzdiZCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9wbGF5ZXIvd2ViX21lZGlhX3BsYXllcl9pbXBsLmNjCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvcGxheWVyL3dlYl9tZWRpYV9wbGF5ZXJfaW1wbC5jYwpAQCAtMjEzLDcgKzIxMyw4IEBACiAgIGNodW5rX2RlbXV4ZXJfLnJlc2V0KG5ldyBDaHVua0RlbXV4ZXIoCiAgICAgICBidWZmZXJfYWxsb2NhdG9yXywKICAgICAgIEJJTkRfVE9fUkVOREVSX0xPT1AoJldlYk1lZGlhUGxheWVySW1wbDo6T25EZW11eGVyT3BlbmVkKSwKLSAgICAgIEJJTkRfVE9fUkVOREVSX0xPT1AoJldlYk1lZGlhUGxheWVySW1wbDo6T25FbmNyeXB0ZWRNZWRpYUluaXREYXRhKSwKKyAgICAgIEJJTkRfVE9fUkVOREVSX0xPT1AoCisgICAgICAgICAgJldlYk1lZGlhUGxheWVySW1wbDo6T25FbmNyeXB0ZWRNZWRpYUluaXREYXRhRW5jb3VudGVyZWQpLAogICAgICAgbWVkaWFfbG9nXywgdHJ1ZSkpOwogCiAgIHN1cHBvcnRzX3NhdmVfID0gZmFsc2U7CkBAIC03NTcsMTIgKzc1OCwxMiBAQAogICAqaXNfc2Vla2luZyA9IHN0YXRlXy5zZWVraW5nOwogfQogCi12b2lkIFdlYk1lZGlhUGxheWVySW1wbDo6T25FbmNyeXB0ZWRNZWRpYUluaXREYXRhKAordm9pZCBXZWJNZWRpYVBsYXllckltcGw6Ok9uRW5jcnlwdGVkTWVkaWFJbml0RGF0YUVuY291bnRlcmVkKAogICAgIEVtZUluaXREYXRhVHlwZSBpbml0X2RhdGFfdHlwZSwgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluaXRfZGF0YSkgewogICBEQ0hFQ0tfRVEobWFpbl9sb29wXywgTWVzc2FnZUxvb3A6OmN1cnJlbnQoKSk7CiAKLSAgR2V0Q2xpZW50KCktPkVuY3J5cHRlZE1lZGlhSW5pdERhdGEoaW5pdF9kYXRhX3R5cGUsICZpbml0X2RhdGFbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRfZGF0YS5zaXplKCkpOworICBHZXRDbGllbnQoKS0+RW5jcnlwdGVkTWVkaWFJbml0RGF0YUVuY291bnRlcmVkKGluaXRfZGF0YV90eXBlLCAmaW5pdF9kYXRhWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRfZGF0YS5zaXplKCkpOwogfQogCiBXZWJNZWRpYVBsYXllckNsaWVudCogV2ViTWVkaWFQbGF5ZXJJbXBsOjpHZXRDbGllbnQoKSB7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL3BsYXllci93ZWJfbWVkaWFfcGxheWVyX2ltcGwuaCBiL3NyYy9jb2JhbHQvbWVkaWEvcGxheWVyL3dlYl9tZWRpYV9wbGF5ZXJfaW1wbC5oCmluZGV4IDlkZjNlNjguLjNiYWJlZjUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvcGxheWVyL3dlYl9tZWRpYV9wbGF5ZXJfaW1wbC5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvcGxheWVyL3dlYl9tZWRpYV9wbGF5ZXJfaW1wbC5oCkBAIC0yMDksOCArMjA5LDggQEAKIAogICB2b2lkIEdldE1lZGlhVGltZUFuZFNlZWtpbmdTdGF0ZShiYXNlOjpUaW1lRGVsdGEqIG1lZGlhX3RpbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIGlzX3NlZWtpbmcpIGNvbnN0OwotICB2b2lkIE9uRW5jcnlwdGVkTWVkaWFJbml0RGF0YShFbWVJbml0RGF0YVR5cGUgaW5pdF9kYXRhX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbml0X2RhdGEpOworICB2b2lkIE9uRW5jcnlwdGVkTWVkaWFJbml0RGF0YUVuY291bnRlcmVkKAorICAgICAgRW1lSW5pdERhdGFUeXBlIGluaXRfZGF0YV90eXBlLCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5pdF9kYXRhKTsKIAogICAvLyBHZXR0ZXIgbWV0aG9kIHRvIHxjbGllbnRffC4KICAgV2ViTWVkaWFQbGF5ZXJDbGllbnQqIEdldENsaWVudCgpOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9zYW5kYm94L3dlYl9tZWRpYV9wbGF5ZXJfaGVscGVyLmNjIGIvc3JjL2NvYmFsdC9tZWRpYS9zYW5kYm94L3dlYl9tZWRpYV9wbGF5ZXJfaGVscGVyLmNjCmluZGV4IDJhZGVmMjkuLmFkYjNhZmUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvc2FuZGJveC93ZWJfbWVkaWFfcGxheWVyX2hlbHBlci5jYworKysgYi9zcmMvY29iYWx0L21lZGlhL3NhbmRib3gvd2ViX21lZGlhX3BsYXllcl9oZWxwZXIuY2MKQEAgLTQ3LDkgKzQ3LDkgQEAKICNlbmRpZiAgLy8gZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCiAgIHN0ZDo6c3RyaW5nIFNvdXJjZVVSTCgpIGNvbnN0IE9WRVJSSURFIHsgcmV0dXJuICIiOyB9CiAjaWYgZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCi0gIHZvaWQgRW5jcnlwdGVkTWVkaWFJbml0RGF0YShFbWVJbml0RGF0YVR5cGUgaW5pdF9kYXRhX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBpbml0X2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbml0X2RhdGFfbGVuZ3RoKSBPVkVSUklERSB7fQorICB2b2lkIEVuY3J5cHRlZE1lZGlhSW5pdERhdGFFbmNvdW50ZXJlZChFbWVJbml0RGF0YVR5cGUgaW5pdF9kYXRhX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGluaXRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW5pdF9kYXRhX2xlbmd0aCkgT1ZFUlJJREUge30KICNlbmRpZiAgLy8gZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCiB9OwogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcl90cmVlL21vY2tfcmVzb3VyY2VfcHJvdmlkZXIuaCBiL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvbW9ja19yZXNvdXJjZV9wcm92aWRlci5oCmluZGV4IDBmYmEwOWYuLjFkMTNiNmMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvbW9ja19yZXNvdXJjZV9wcm92aWRlci5oCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvbW9ja19yZXNvdXJjZV9wcm92aWRlci5oCkBAIC0xNjQsOCArMTY0LDYgQEAKICAgICAgIE1lc2g6OkRyYXdNb2RlIGRyYXdfbW9kZSkgewogICAgIHJldHVybiBtYWtlX3Njb3BlZF9yZWZwdHIoQ3JlYXRlTWVzaE1vY2sodmVydGljZXMuZ2V0KCksIGRyYXdfbW9kZSkpOwogICB9Ci0KLSAgdmlydHVhbCB2b2lkIFB1cmdlQ2FjaGVzKCkge30KIH07CiAKIH0gIC8vIG5hbWVzcGFjZSByZW5kZXJfdHJlZQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS9yZXNvdXJjZV9wcm92aWRlci5oIGIvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS9yZXNvdXJjZV9wcm92aWRlci5oCmluZGV4IGJlMWMyOGUuLjRhNjQ4ZDEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvcmVzb3VyY2VfcHJvdmlkZXIuaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcl90cmVlL3Jlc291cmNlX3Byb3ZpZGVyLmgKQEAgLTIxMCwxNyArMjEwLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcl90cmVlOjpGb250UHJvdmlkZXIqIGZvbnRfcHJvdmlkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcl90cmVlOjpGb250VmVjdG9yKiBtYXliZV91c2VkX2ZvbnRzKSA9IDA7CiAKLSAgLy8gQ2NvbnN1bWVzIGEgbGlzdCBvZiB2ZXJ0aWNlcyBhbmQgcmV0dXJucwotICAvLyBhIE1lc2ggaW5zdGFuY2UuCisgIC8vIENvbnN1bWVzIGEgbGlzdCBvZiB2ZXJ0aWNlcyBhbmQgcmV0dXJucyBhIE1lc2ggaW5zdGFuY2UuCiAgIHZpcnR1YWwgc2NvcGVkX3JlZnB0cjxNZXNoPiBDcmVhdGVNZXNoKAogICAgICAgc2NvcGVkX3B0cjxzdGQ6OnZlY3RvcjxNZXNoOjpWZXJ0ZXg+ID4gdmVydGljZXMsCiAgICAgICBNZXNoOjpEcmF3TW9kZSBkcmF3X21vZGUpID0gMDsKIAogICB2aXJ0dWFsIHNjb3BlZF9yZWZwdHI8SW1hZ2U+IERyYXdPZmZzY3JlZW5JbWFnZSgKICAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8cmVuZGVyX3RyZWU6Ok5vZGU+JiByb290KSA9IDA7Ci0KLSAgLy8gUHVyZ2VzIGFueSBjYWNoZXMgYmVpbmcgdXNlZCBieSB0aGUgcmVuZGVyX3RyZWUgY29uc3VtZXIuCi0gIHZpcnR1YWwgdm9pZCBQdXJnZUNhY2hlcygpID0gMDsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSByZW5kZXJfdHJlZQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS9yZXNvdXJjZV9wcm92aWRlcl9zdHViLmggYi9zcmMvY29iYWx0L3JlbmRlcl90cmVlL3Jlc291cmNlX3Byb3ZpZGVyX3N0dWIuaAppbmRleCAwZjcwMTQ3Li41ZDMzY2QwIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcl90cmVlL3Jlc291cmNlX3Byb3ZpZGVyX3N0dWIuaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcl90cmVlL3Jlc291cmNlX3Byb3ZpZGVyX3N0dWIuaApAQCAtMzMxLDggKzMzMSw2IEBACiAgICAgVU5SRUZFUkVOQ0VEX1BBUkFNRVRFUihyb290KTsKICAgICByZXR1cm4gc2NvcGVkX3JlZnB0cjxJbWFnZT4oTlVMTCk7CiAgIH0KLQotICB2b2lkIFB1cmdlQ2FjaGVzKCkgT1ZFUlJJREUge30KIH07CiAKIH0gIC8vIG5hbWVzcGFjZSByZW5kZXJfdHJlZQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2JhY2tlbmQuZ3lwIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2JhY2tlbmQuZ3lwCmluZGV4IGQxZjRhYTIuLmIyZjZlNzEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9iYWNrZW5kLmd5cAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvYmFja2VuZC5neXAKQEAgLTE2LDcgKzE2LDExIEBACiAgICd0YXJnZXRzJzogWwogICAgIHsKICAgICAgICd0YXJnZXRfbmFtZSc6ICdyZW5kZXJlcl9iYWNrZW5kJywKLSAgICAgICd0eXBlJzogJ25vbmUnLAorICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdyZW5kZXJfdGFyZ2V0LmNjJywKKyAgICAgICAgJ3JlbmRlcl90YXJnZXQuaCcsCisgICAgICBdLAogCiAgICAgICAnZGVwZW5kZW5jaWVzJzogWwogICAgICAgICAnPChERVBUSCkvY29iYWx0L2Jhc2UvYmFzZS5neXA6YmFzZScsCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL2dyYXBoaWNzX2NvbnRleHQuY2MgYi9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL2dyYXBoaWNzX2NvbnRleHQuY2MKaW5kZXggN2I4YjliZC4uMTIxMTU4NCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC9ncmFwaGljc19jb250ZXh0LmNjCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvZ3JhcGhpY3NfY29udGV4dC5jYwpAQCAtMjQ1LDcgKzI0NSwyMiBAQAogICAgIC8vIHRoYXQgY2FuIGJlIGJvdW5kIHVzaW5nIGVnbE1ha2VDdXJyZW50LgogICAgIERDSEVDS19FUShzdXJmYWNlLT5HZXRQbGF0Zm9ybUhhbmRsZSgpLCAwKTsKIAotICAgIEVHTF9DQUxMKGVnbE1ha2VDdXJyZW50KGRpc3BsYXlfLCBlZ2xfc3VyZmFjZSwgZWdsX3N1cmZhY2UsIGNvbnRleHRfKSk7CisgICAgZWdsTWFrZUN1cnJlbnQoZGlzcGxheV8sIGVnbF9zdXJmYWNlLCBlZ2xfc3VyZmFjZSwgY29udGV4dF8pOworICAgIEVHTGludCBtYWtlX2N1cnJlbnRfZXJyb3IgPSBlZ2xHZXRFcnJvcigpOworICAgIGlmIChtYWtlX2N1cnJlbnRfZXJyb3IgIT0gRUdMX1NVQ0NFU1MpIHsKKyAgICAgIExPRyhFUlJPUikgPDwgImVnbE1ha2VDdXJyZW50IEVSUk9SOiAiIDw8IG1ha2VfY3VycmVudF9lcnJvcjsKKyAgICAgIGlmIChtYWtlX2N1cnJlbnRfZXJyb3IgPT0gRUdMX0JBRF9BTExPQyB8fAorICAgICAgICAgIG1ha2VfY3VycmVudF9lcnJvciA9PSBFR0xfQkFEX05BVElWRV9XSU5ET1cpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiZWdsTWFrZUN1cnJlbnQgcmFpc2VkIGVpdGhlciBFR0xfQkFEX0FMTE9DIG9yICIKKyAgICAgICAgICAgICAgICAgICAgICAiRUdMX0JBRF9OQVRJVkVfV0lORE9XLCBjb250aW51aW5nIHdpdGggbnVsbCBzdXJmYWNlICIKKyAgICAgICAgICAgICAgICAgICAgICAidW5kZXIgdGhlIGFzc3VtcHRpb24gdGhhdCBvdXIgd2luZG93IHN1cmZhY2UgaGFzIGJlY29tZSAiCisgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgZHVlIHRvIGEgc3VzcGVuZCBvciBzaHV0ZG93biBiZWluZyB0cmlnZ2VyZWQuIjsKKyAgICAgICAgZWdsX3N1cmZhY2UgPSBudWxsX3N1cmZhY2VfLT5HZXRTdXJmYWNlKCk7CisgICAgICAgIEVHTF9DQUxMKGVnbE1ha2VDdXJyZW50KGRpc3BsYXlfLCBlZ2xfc3VyZmFjZSwgZWdsX3N1cmZhY2UsIGNvbnRleHRfKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBOT1RSRUFDSEVEKCkgPDwgIlVuZXhwZWN0ZWQgZXJyb3Igd2hlbiBjYWxsaW5nIGVnbE1ha2VDdXJyZW50KCkuIjsKKyAgICAgIH0KKyAgICB9CiAKICAgICAvLyBNaW5pbWl6ZSBjYWxscyB0byBnbEJpbmRGcmFtZWJ1ZmZlci4gTm9ybWFsbHksIG5vdGhpbmcga2VlcHMgdGhlaXIKICAgICAvLyBmcmFtZWJ1ZmZlciBvYmplY3QgYm91bmQsIHNvIDAgaXMgbm9ybWFsbHkgYm91bmQgYXQgdGhpcyBwb2ludCAtLQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vbWVkaWFfa2V5X3N5c3RlbV9tZWRpYV9jYXBhYmlsaXR5LmlkbCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9yZW5kZXJfdGFyZ2V0LmNjCnNpbWlsYXJpdHkgaW5kZXggNjIlCmNvcHkgZnJvbSBzcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfc3lzdGVtX21lZGlhX2NhcGFiaWxpdHkuaWRsCmNvcHkgdG8gc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL3JlbmRlcl90YXJnZXQuY2MKaW5kZXggNTFlMWYyZS4uMzEyNmI5NyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vbWVkaWFfa2V5X3N5c3RlbV9tZWRpYV9jYXBhYmlsaXR5LmlkbAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvcmVuZGVyX3RhcmdldC5jYwpAQCAtMTIsOSArMTIsMjAgQEAKIC8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAxNi9DUi1lbmNyeXB0ZWQtbWVkaWEtMjAxNjA3MDUvI21lZGlha2V5c3lzdGVtbWVkaWFjYXBhYmlsaXR5LWRpY3Rpb25hcnkKKyNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9yZW5kZXJfdGFyZ2V0LmgiCiAKLWRpY3Rpb25hcnkgTWVkaWFLZXlTeXN0ZW1NZWRpYUNhcGFiaWxpdHkgewotICBET01TdHJpbmcgY29udGVudFR5cGUgPSAiIjsKLSAgRE9NU3RyaW5nIHJvYnVzdG5lc3MgPSAiIjsKLX07CisjaW5jbHVkZSAic3RhcmJvYXJkL2F0b21pYy5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSByZW5kZXJlciB7CituYW1lc3BhY2UgYmFja2VuZCB7CisKK1NiQXRvbWljMzIgUmVuZGVyVGFyZ2V0OjpzZXJpYWxfY291bnRlcl8gPSAxOworCitSZW5kZXJUYXJnZXQ6OlJlbmRlclRhcmdldCgpIHsKKyAgc2VyaWFsX251bWJlcl8gPSBTYkF0b21pY0JhcnJpZXJfSW5jcmVtZW50KCZzZXJpYWxfY291bnRlcl8sIDEpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYmFja2VuZAorfSAgLy8gbmFtZXNwYWNlIHJlbmRlcmVyCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvcmVuZGVyX3RhcmdldC5oIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL3JlbmRlcl90YXJnZXQuaAppbmRleCBlYmFhMzM1Li5mZWY5YmM2IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvcmVuZGVyX3RhcmdldC5oCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9yZW5kZXJfdGFyZ2V0LmgKQEAgLTM0LDYgKzM0LDggQEAKIC8vIGFmdGVyIHJlbmRlcmluZyBpcyBjb21wbGV0ZWQuCiBjbGFzcyBSZW5kZXJUYXJnZXQgOiBwdWJsaWMgYmFzZTo6UmVmQ291bnRlZFRocmVhZFNhZmU8UmVuZGVyVGFyZ2V0PiB7CiAgcHVibGljOgorICBSZW5kZXJUYXJnZXQoKTsKKwogICAvLyBSZXR1cm4gbWV0YWRhdGEgYWJvdXQgdGhlIHJlbmRlciB0YXJnZXQgc3VjaCBhcyBkaW1lbnNpb25zIGFuZCBmb3JtYXQuCiAgIHZpcnR1YWwgY29uc3QgbWF0aDo6U2l6ZSYgR2V0U2l6ZSgpID0gMDsKIApAQCAtNDEsMTAgKzQzLDE2IEBACiAgIC8vIHBhc3NlZCBpbnRvIHBsYXRmb3JtLXNwZWNpZmljIGNvZGUuCiAgIHZpcnR1YWwgaW50cHRyX3QgR2V0UGxhdGZvcm1IYW5kbGUoKSA9IDA7CiAKKyAgLy8gRWFjaCByZW5kZXIgaXMgYXNzaWduZWQgYSB1bmlxdWUgc2VyaWFsIG51bWJlciBvbiBjb25zdHJ1Y3Rpb24uCisgIGludDMyX3QgR2V0U2VyaWFsTnVtYmVyKCkgY29uc3QgeyByZXR1cm4gc2VyaWFsX251bWJlcl87IH0KKwogIHByb3RlY3RlZDoKICAgLy8gQ29uY3JldGUgY2hpbGQgY2xhc3NlcyBzaG91bGQgZGVjbGFyZSB0aGVpciBkZXN0cnVjdG9ycyBhcyBwcml2YXRlLgogICBmcmllbmQgY2xhc3MgYmFzZTo6UmVmQ291bnRlZFRocmVhZFNhZmU8UmVuZGVyVGFyZ2V0PjsKICAgdmlydHVhbCB+UmVuZGVyVGFyZ2V0KCkge30KKworICBzdGF0aWMgU2JBdG9taWMzMiBzZXJpYWxfY291bnRlcl87CisgIGludDMyX3Qgc2VyaWFsX251bWJlcl87CiB9OwogCiB9ICAvLyBuYW1lc3BhY2UgYmFja2VuZApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvY2FjaGVkX3NvZnR3YXJlX3Jhc3Rlcml6ZXIuY2MgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmxpdHRlci9jYWNoZWRfc29mdHdhcmVfcmFzdGVyaXplci5jYwppbmRleCBkN2NmNDFjLi4xYzVlMmQ0IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmxpdHRlci9jYWNoZWRfc29mdHdhcmVfcmFzdGVyaXplci5jYworKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmxpdHRlci9jYWNoZWRfc29mdHdhcmVfcmFzdGVyaXplci5jYwpAQCAtMzQsMTMgKzM0LDEzIEBACiAgIHJldHVybiBjb29yZF9tYXBwaW5nLm91dHB1dF9ib3VuZHMuc2l6ZSgpLkdldEFyZWEoKSAqIDQ7CiB9CiAKLUNhY2hlZFNvZnR3YXJlUmFzdGVyaXplcjo6Q2FjaGVkU29mdHdhcmVSYXN0ZXJpemVyKFNiQmxpdHRlckRldmljZSBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYkJsaXR0ZXJDb250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2FjaGVfY2FwYWNpdHkpCitDYWNoZWRTb2Z0d2FyZVJhc3Rlcml6ZXI6OkNhY2hlZFNvZnR3YXJlUmFzdGVyaXplcigKKyAgICBTYkJsaXR0ZXJEZXZpY2UgZGV2aWNlLCBTYkJsaXR0ZXJDb250ZXh0IGNvbnRleHQsIGludCBjYWNoZV9jYXBhY2l0eSwKKyAgICBib29sIHB1cmdlX3NraWFfZm9udF9jYWNoZXNfb25fZGVzdHJ1Y3Rpb24pCiAgICAgOiBjYWNoZV9jYXBhY2l0eV8oY2FjaGVfY2FwYWNpdHkpLAogICAgICAgZGV2aWNlXyhkZXZpY2UpLAogICAgICAgY29udGV4dF8oY29udGV4dCksCi0gICAgICBzb2Z0d2FyZV9yYXN0ZXJpemVyXygwKSwKKyAgICAgIHNvZnR3YXJlX3Jhc3Rlcml6ZXJfKDAsIHB1cmdlX3NraWFfZm9udF9jYWNoZXNfb25fZGVzdHJ1Y3Rpb24pLAogICAgICAgY2FjaGVfbWVtb3J5X3VzYWdlXygKICAgICAgICAgICAiTWVtb3J5LkNhY2hlZFNvZnR3YXJlUmFzdGVyaXplci5DYWNoZVVzYWdlIiwgMCwKICAgICAgICAgICAiVG90YWwgbWVtb3J5IG9jY3VwaWVkIGJ5IGNhY2hlZCBzb2Z0d2FyZS1yYXN0ZXJpemVkIHN1cmZhY2VzLiIpLApAQCAtNTYsNiArNTYsNyBAQAogICAgIERDSEVDSyhpdGVyLT5zZWNvbmQuY2FjaGVkKTsKICAgICBTYkJsaXR0ZXJEZXN0cm95U3VyZmFjZShpdGVyLT5zZWNvbmQuc3VyZmFjZSk7CiAgIH0KKyAgc3VyZmFjZV9tYXBfLmNsZWFyKCk7CiB9CiAKIHZvaWQgQ2FjaGVkU29mdHdhcmVSYXN0ZXJpemVyOjpPblN0YXJ0TmV3RnJhbWUoKSB7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmxpdHRlci9jYWNoZWRfc29mdHdhcmVfcmFzdGVyaXplci5oIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvY2FjaGVkX3NvZnR3YXJlX3Jhc3Rlcml6ZXIuaAppbmRleCA5OWNlZmJhLi5jZTM3MDY0IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmxpdHRlci9jYWNoZWRfc29mdHdhcmVfcmFzdGVyaXplci5oCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9ibGl0dGVyL2NhY2hlZF9zb2Z0d2FyZV9yYXN0ZXJpemVyLmgKQEAgLTczLDcgKzczLDggQEAKICAgfTsKIAogICBDYWNoZWRTb2Z0d2FyZVJhc3Rlcml6ZXIoU2JCbGl0dGVyRGV2aWNlIGRldmljZSwgU2JCbGl0dGVyQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNhY2hlX2NhcGFjaXR5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjYWNoZV9jYXBhY2l0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcHVyZ2Vfc2tpYV9mb250X2NhY2hlc19vbl9kZXN0cnVjdGlvbik7CiAgIH5DYWNoZWRTb2Z0d2FyZVJhc3Rlcml6ZXIoKTsKIAogICAvLyBTaG91bGQgYmUgY2FsbGVkIG9uY2UgcGVyIGZyYW1lLiAgVGhpcyBtZXRob2Qgd2lsbCByZW1vdmUgZnJvbSB0aGUgY2FjaGUKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9ibGl0dGVyL2hhcmR3YXJlX3Jhc3Rlcml6ZXIuY2MgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmxpdHRlci9oYXJkd2FyZV9yYXN0ZXJpemVyLmNjCmluZGV4IGE2NzA0NGUuLjJlZDU1OTkgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9ibGl0dGVyL2hhcmR3YXJlX3Jhc3Rlcml6ZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvaGFyZHdhcmVfcmFzdGVyaXplci5jYwpAQCAtNDYsNyArNDYsOCBAQAogICAgICAgICAgICAgICAgIGludCBza2lhX2F0bGFzX3dpZHRoLCBpbnQgc2tpYV9hdGxhc19oZWlnaHQsCiAgICAgICAgICAgICAgICAgaW50IHNjcmF0Y2hfc3VyZmFjZV9zaXplX2luX2J5dGVzLAogICAgICAgICAgICAgICAgIGludCBzdXJmYWNlX2NhY2hlX3NpemVfaW5fYnl0ZXMsCi0gICAgICAgICAgICAgICAgaW50IHNvZnR3YXJlX3N1cmZhY2VfY2FjaGVfc2l6ZV9pbl9ieXRlcyk7CisgICAgICAgICAgICAgICAgaW50IHNvZnR3YXJlX3N1cmZhY2VfY2FjaGVfc2l6ZV9pbl9ieXRlcywKKyAgICAgICAgICAgICAgICBib29sIHB1cmdlX3NraWFfZm9udF9jYWNoZXNfb25fZGVzdHJ1Y3Rpb24pOwogICB+SW1wbCgpOwogCiAgIHZvaWQgU3VibWl0KGNvbnN0IHNjb3BlZF9yZWZwdHI8cmVuZGVyX3RyZWU6Ok5vZGU+JiByZW5kZXJfdHJlZSwKQEAgLTk5LDcgKzEwMCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNraWFfYXRsYXNfd2lkdGgsIGludCBza2lhX2F0bGFzX2hlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2NyYXRjaF9zdXJmYWNlX3NpemVfaW5fYnl0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN1cmZhY2VfY2FjaGVfc2l6ZV9pbl9ieXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc29mdHdhcmVfc3VyZmFjZV9jYWNoZV9zaXplX2luX2J5dGVzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzb2Z0d2FyZV9zdXJmYWNlX2NhY2hlX3NpemVfaW5fYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwdXJnZV9za2lhX2ZvbnRfY2FjaGVzX29uX2Rlc3RydWN0aW9uKQogICAgIDogY29udGV4dF8oYmFzZTo6cG9seW1vcnBoaWNfZG93bmNhc3Q8YmFja2VuZDo6R3JhcGhpY3NDb250ZXh0QmxpdHRlcio+KAogICAgICAgICAgIGdyYXBoaWNzX2NvbnRleHQpKSwKICAgICAgIHN1Ym1pdF9jb3VudF8oMCksCkBAIC0xMDksNyArMTExLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyYXRjaF9zdXJmYWNlX3NpemVfaW5fYnl0ZXMpLAogICAgICAgc29mdHdhcmVfc3VyZmFjZV9jYWNoZV8oY29udGV4dF8tPkdldFNiQmxpdHRlckRldmljZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dF8tPkdldFNiQmxpdHRlckNvbnRleHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvZnR3YXJlX3N1cmZhY2VfY2FjaGVfc2l6ZV9pbl9ieXRlcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvZnR3YXJlX3N1cmZhY2VfY2FjaGVfc2l6ZV9pbl9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1cmdlX3NraWFfZm9udF9jYWNoZXNfb25fZGVzdHJ1Y3Rpb24pCiAjaWYgZGVmaW5lZChFTkFCTEVfREVCVUdfQ09OU09MRSkKICAgICAgICwKICAgICAgIHRvZ2dsZV9oaWdobGlnaHRfc29mdHdhcmVfZHJhd3NfKGZhbHNlKSwKQEAgLTI5NCwxNSArMjk3LDE0IEBACiAjZW5kaWYgIC8vICNpZiBkZWZpbmVkKENPQkFMVF9SRU5ERVJfRElSVFlfUkVHSU9OX09OTFkpCiAKIEhhcmR3YXJlUmFzdGVyaXplcjo6SGFyZHdhcmVSYXN0ZXJpemVyKAotICAgIGJhY2tlbmQ6OkdyYXBoaWNzQ29udGV4dCogZ3JhcGhpY3NfY29udGV4dCwKLSAgICBpbnQgc2tpYV9hdGxhc193aWR0aCwgaW50IHNraWFfYXRsYXNfaGVpZ2h0LAotICAgIGludCBzY3JhdGNoX3N1cmZhY2Vfc2l6ZV9pbl9ieXRlcywgaW50IHN1cmZhY2VfY2FjaGVfc2l6ZV9pbl9ieXRlcywKLSAgICBpbnQgc29mdHdhcmVfc3VyZmFjZV9jYWNoZV9zaXplX2luX2J5dGVzKQotICAgIDogaW1wbF8obmV3IEltcGwoZ3JhcGhpY3NfY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgIHNraWFfYXRsYXNfd2lkdGgsIHNraWFfYXRsYXNfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgc2NyYXRjaF9zdXJmYWNlX3NpemVfaW5fYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICBzdXJmYWNlX2NhY2hlX3NpemVfaW5fYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICBzb2Z0d2FyZV9zdXJmYWNlX2NhY2hlX3NpemVfaW5fYnl0ZXMpKSB7fQorICAgIGJhY2tlbmQ6OkdyYXBoaWNzQ29udGV4dCogZ3JhcGhpY3NfY29udGV4dCwgaW50IHNraWFfYXRsYXNfd2lkdGgsCisgICAgaW50IHNraWFfYXRsYXNfaGVpZ2h0LCBpbnQgc2NyYXRjaF9zdXJmYWNlX3NpemVfaW5fYnl0ZXMsCisgICAgaW50IHN1cmZhY2VfY2FjaGVfc2l6ZV9pbl9ieXRlcywgaW50IHNvZnR3YXJlX3N1cmZhY2VfY2FjaGVfc2l6ZV9pbl9ieXRlcywKKyAgICBib29sIHB1cmdlX3NraWFfZm9udF9jYWNoZXNfb25fZGVzdHJ1Y3Rpb24pCisgICAgOiBpbXBsXyhuZXcgSW1wbChncmFwaGljc19jb250ZXh0LCBza2lhX2F0bGFzX3dpZHRoLCBza2lhX2F0bGFzX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgIHNjcmF0Y2hfc3VyZmFjZV9zaXplX2luX2J5dGVzLCBzdXJmYWNlX2NhY2hlX3NpemVfaW5fYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICBzb2Z0d2FyZV9zdXJmYWNlX2NhY2hlX3NpemVfaW5fYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICBwdXJnZV9za2lhX2ZvbnRfY2FjaGVzX29uX2Rlc3RydWN0aW9uKSkge30KIAogSGFyZHdhcmVSYXN0ZXJpemVyOjp+SGFyZHdhcmVSYXN0ZXJpemVyKCkge30KIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvaGFyZHdhcmVfcmFzdGVyaXplci5oIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvaGFyZHdhcmVfcmFzdGVyaXplci5oCmluZGV4IDIwYWZkM2UuLmU4MzAyMjEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9ibGl0dGVyL2hhcmR3YXJlX3Jhc3Rlcml6ZXIuaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmxpdHRlci9oYXJkd2FyZV9yYXN0ZXJpemVyLmgKQEAgLTQwLDcgKzQwLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBza2lhX2F0bGFzX3dpZHRoLCBpbnQgc2tpYV9hdGxhc19oZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2NyYXRjaF9zdXJmYWNlX3NpemVfaW5fYnl0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3VyZmFjZV9jYWNoZV9zaXplX2luX2J5dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNvZnR3YXJlX3N1cmZhY2VfY2FjaGVfc2l6ZV9pbl9ieXRlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc29mdHdhcmVfc3VyZmFjZV9jYWNoZV9zaXplX2luX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwdXJnZV9za2lhX2ZvbnRfY2FjaGVzX29uX2Rlc3RydWN0aW9uKTsKICAgdmlydHVhbCB+SGFyZHdhcmVSYXN0ZXJpemVyKCk7CiAKICAgLy8gQ29uc3VtZSB0aGUgcmVuZGVyIHRyZWUgYW5kIG91dHB1dCB0aGUgcmVzdWx0cyB0byB0aGUgcmVuZGVyIHRhcmdldCBwYXNzZWQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9ibGl0dGVyL3Jlc291cmNlX3Byb3ZpZGVyLmNjIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvcmVzb3VyY2VfcHJvdmlkZXIuY2MKaW5kZXggZjcyZmFmYS4uMjMxNTgzNiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvcmVzb3VyY2VfcHJvdmlkZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvcmVzb3VyY2VfcHJvdmlkZXIuY2MKQEAgLTIxMyw4ICsyMTMsNiBAQAogICAgICAgbmV3IFNpbmdsZVBsYW5lSW1hZ2Uocm9vdCwgc3VibWl0X29mZnNjcmVlbl9jYWxsYmFja18sIGRldmljZV8pKTsKIH0KIAotdm9pZCBSZXNvdXJjZVByb3ZpZGVyOjpQdXJnZUNhY2hlcygpIHsgc2tpYV9yZXNvdXJjZV9wcm92aWRlcl8tPlB1cmdlQ2FjaGVzKCk7IH0KLQogfSAgLy8gbmFtZXNwYWNlIGJsaXR0ZXIKIH0gIC8vIG5hbWVzcGFjZSByYXN0ZXJpemVyCiB9ICAvLyBuYW1lc3BhY2UgcmVuZGVyZXIKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9ibGl0dGVyL3Jlc291cmNlX3Byb3ZpZGVyLmggYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmxpdHRlci9yZXNvdXJjZV9wcm92aWRlci5oCmluZGV4IGJmNjcyODAuLjNmMDFjNjQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9ibGl0dGVyL3Jlc291cmNlX3Byb3ZpZGVyLmgKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvcmVzb3VyY2VfcHJvdmlkZXIuaApAQCAtMTEzLDggKzExMyw2IEBACiAgIHNjb3BlZF9yZWZwdHI8cmVuZGVyX3RyZWU6OkltYWdlPiBEcmF3T2Zmc2NyZWVuSW1hZ2UoCiAgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPHJlbmRlcl90cmVlOjpOb2RlPiYgcm9vdCkgT1ZFUlJJREU7CiAKLSAgdm9pZCBQdXJnZUNhY2hlcygpIE9WRVJSSURFOwotCiAgcHJpdmF0ZToKICAgU2JCbGl0dGVyRGV2aWNlIGRldmljZV87CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9ibGl0dGVyL3NvZnR3YXJlX3Jhc3Rlcml6ZXIuY2MgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmxpdHRlci9zb2Z0d2FyZV9yYXN0ZXJpemVyLmNjCmluZGV4IGY4ZTY4M2MuLjMzZGMyZDEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9ibGl0dGVyL3NvZnR3YXJlX3Jhc3Rlcml6ZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvc29mdHdhcmVfcmFzdGVyaXplci5jYwpAQCAtMjksMTEgKzI5LDEzIEBACiBuYW1lc3BhY2UgcmFzdGVyaXplciB7CiBuYW1lc3BhY2UgYmxpdHRlciB7CiAKLVNvZnR3YXJlUmFzdGVyaXplcjo6U29mdHdhcmVSYXN0ZXJpemVyKGJhY2tlbmQ6OkdyYXBoaWNzQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdXJmYWNlX2NhY2hlX3NpemUpCitTb2Z0d2FyZVJhc3Rlcml6ZXI6OlNvZnR3YXJlUmFzdGVyaXplcigKKyAgICBiYWNrZW5kOjpHcmFwaGljc0NvbnRleHQqIGNvbnRleHQsIGludCBzdXJmYWNlX2NhY2hlX3NpemUsCisgICAgYm9vbCBwdXJnZV9za2lhX2ZvbnRfY2FjaGVzX29uX2Rlc3RydWN0aW9uKQogICAgIDogY29udGV4dF8oYmFzZTo6cG9seW1vcnBoaWNfZG93bmNhc3Q8YmFja2VuZDo6R3JhcGhpY3NDb250ZXh0QmxpdHRlcio+KAogICAgICAgICAgIGNvbnRleHQpKSwKLSAgICAgIHNraWFfcmFzdGVyaXplcl8oc3VyZmFjZV9jYWNoZV9zaXplKSB7fQorICAgICAgc2tpYV9yYXN0ZXJpemVyXyhzdXJmYWNlX2NhY2hlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgIHB1cmdlX3NraWFfZm9udF9jYWNoZXNfb25fZGVzdHJ1Y3Rpb24pIHt9CiAKIHZvaWQgU29mdHdhcmVSYXN0ZXJpemVyOjpTdWJtaXQoCiAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxyZW5kZXJfdHJlZTo6Tm9kZT4mIHJlbmRlcl90cmVlLApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvc29mdHdhcmVfcmFzdGVyaXplci5oIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvc29mdHdhcmVfcmFzdGVyaXplci5oCmluZGV4IGI4Njg0OTMuLjVjNWQ1MzMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9ibGl0dGVyL3NvZnR3YXJlX3Jhc3Rlcml6ZXIuaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmxpdHRlci9zb2Z0d2FyZV9yYXN0ZXJpemVyLmgKQEAgLTM4LDcgKzM4LDggQEAKIGNsYXNzIFNvZnR3YXJlUmFzdGVyaXplciA6IHB1YmxpYyBSYXN0ZXJpemVyIHsKICBwdWJsaWM6CiAgIGV4cGxpY2l0IFNvZnR3YXJlUmFzdGVyaXplcihiYWNrZW5kOjpHcmFwaGljc0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3VyZmFjZV9jYWNoZV9zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdXJmYWNlX2NhY2hlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHB1cmdlX3NraWFfZm9udF9jYWNoZXNfb25fZGVzdHJ1Y3Rpb24pOwogCiAgIHZvaWQgU3VibWl0KGNvbnN0IHNjb3BlZF9yZWZwdHI8cmVuZGVyX3RyZWU6Ok5vZGU+JiByZW5kZXJfdHJlZSwKICAgICAgICAgICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxiYWNrZW5kOjpSZW5kZXJUYXJnZXQ+JiByZW5kZXJfdGFyZ2V0LApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9oYXJkd2FyZV9yYXN0ZXJpemVyLmNjIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9oYXJkd2FyZV9yYXN0ZXJpemVyLmNjCmluZGV4IDJjYzgwMDUuLjEwYzNhOWQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvaGFyZHdhcmVfcmFzdGVyaXplci5jYworKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL2hhcmR3YXJlX3Jhc3Rlcml6ZXIuY2MKQEAgLTQ2LDcgKzQ2LDggQEAKICAgICAgICAgICAgICAgICBpbnQgc2tpYV9hdGxhc193aWR0aCwgaW50IHNraWFfYXRsYXNfaGVpZ2h0LAogICAgICAgICAgICAgICAgIGludCBza2lhX2NhY2hlX3NpemVfaW5fYnl0ZXMsCiAgICAgICAgICAgICAgICAgaW50IHNjcmF0Y2hfc3VyZmFjZV9jYWNoZV9zaXplX2luX2J5dGVzLAotICAgICAgICAgICAgICAgIGludCBzdXJmYWNlX2NhY2hlX3NpemVfaW5fYnl0ZXMpOworICAgICAgICAgICAgICAgIGludCBzdXJmYWNlX2NhY2hlX3NpemVfaW5fYnl0ZXMsCisgICAgICAgICAgICAgICAgYm9vbCBwdXJnZV9za2lhX2ZvbnRfY2FjaGVzX29uX2Rlc3RydWN0aW9uKTsKICAgfkltcGwoKTsKIAogICB2b2lkIFN1Ym1pdChjb25zdCBzY29wZWRfcmVmcHRyPHJlbmRlcl90cmVlOjpOb2RlPiYgcmVuZGVyX3RyZWUsCkBAIC04NSwxMSArODYsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2tpYV9hdGxhc193aWR0aCwgaW50IHNraWFfYXRsYXNfaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBza2lhX2NhY2hlX3NpemVfaW5fYnl0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNjcmF0Y2hfc3VyZmFjZV9jYWNoZV9zaXplX2luX2J5dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdXJmYWNlX2NhY2hlX3NpemVfaW5fYnl0ZXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN1cmZhY2VfY2FjaGVfc2l6ZV9pbl9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHB1cmdlX3NraWFfZm9udF9jYWNoZXNfb25fZGVzdHJ1Y3Rpb24pCiAgICAgOiBmYWxsYmFja19yYXN0ZXJpemVyXyhuZXcgc2tpYTo6SGFyZHdhcmVSYXN0ZXJpemVyKAogICAgICAgICAgIGdyYXBoaWNzX2NvbnRleHQsIHNraWFfYXRsYXNfd2lkdGgsIHNraWFfYXRsYXNfaGVpZ2h0LAogICAgICAgICAgIHNraWFfY2FjaGVfc2l6ZV9pbl9ieXRlcywgc2NyYXRjaF9zdXJmYWNlX2NhY2hlX3NpemVfaW5fYnl0ZXMsCi0gICAgICAgICAgMCAvKiBmYWxsYmFjayByYXN0ZXJpemVyIHNob3VsZCBub3QgdXNlIGEgc3VyZmFjZSBjYWNoZSAqLykpLAorICAgICAgICAgIDAgLyogZmFsbGJhY2sgcmFzdGVyaXplciBzaG91bGQgbm90IHVzZSBhIHN1cmZhY2UgY2FjaGUgKi8sCisgICAgICAgICAgcHVyZ2Vfc2tpYV9mb250X2NhY2hlc19vbl9kZXN0cnVjdGlvbikpLAogICAgICAgZ3JhcGhpY3NfY29udGV4dF8oCiAgICAgICAgICAgYmFzZTo6cG9seW1vcnBoaWNfZG93bmNhc3Q8YmFja2VuZDo6R3JhcGhpY3NDb250ZXh0RUdMKj4oCiAgICAgICAgICAgICAgIGdyYXBoaWNzX2NvbnRleHQpKSB7CkBAIC0yNzEsMTEgKzI3NCwxMyBAQAogSGFyZHdhcmVSYXN0ZXJpemVyOjpIYXJkd2FyZVJhc3Rlcml6ZXIoCiAgICAgYmFja2VuZDo6R3JhcGhpY3NDb250ZXh0KiBncmFwaGljc19jb250ZXh0LCBpbnQgc2tpYV9hdGxhc193aWR0aCwKICAgICBpbnQgc2tpYV9hdGxhc19oZWlnaHQsIGludCBza2lhX2NhY2hlX3NpemVfaW5fYnl0ZXMsCi0gICAgaW50IHNjcmF0Y2hfc3VyZmFjZV9jYWNoZV9zaXplX2luX2J5dGVzLCBpbnQgc3VyZmFjZV9jYWNoZV9zaXplX2luX2J5dGVzKQotICAgIDogaW1wbF8obmV3IEltcGwoZ3JhcGhpY3NfY29udGV4dCwgc2tpYV9hdGxhc193aWR0aCwgc2tpYV9hdGxhc19oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICBza2lhX2NhY2hlX3NpemVfaW5fYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICBzY3JhdGNoX3N1cmZhY2VfY2FjaGVfc2l6ZV9pbl9ieXRlcywKLSAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2VfY2FjaGVfc2l6ZV9pbl9ieXRlcykpIHt9CisgICAgaW50IHNjcmF0Y2hfc3VyZmFjZV9jYWNoZV9zaXplX2luX2J5dGVzLCBpbnQgc3VyZmFjZV9jYWNoZV9zaXplX2luX2J5dGVzLAorICAgIGJvb2wgcHVyZ2Vfc2tpYV9mb250X2NhY2hlc19vbl9kZXN0cnVjdGlvbikKKyAgICA6IGltcGxfKG5ldyBJbXBsKAorICAgICAgICAgIGdyYXBoaWNzX2NvbnRleHQsIHNraWFfYXRsYXNfd2lkdGgsIHNraWFfYXRsYXNfaGVpZ2h0LAorICAgICAgICAgIHNraWFfY2FjaGVfc2l6ZV9pbl9ieXRlcywgc2NyYXRjaF9zdXJmYWNlX2NhY2hlX3NpemVfaW5fYnl0ZXMsCisgICAgICAgICAgc3VyZmFjZV9jYWNoZV9zaXplX2luX2J5dGVzLCBwdXJnZV9za2lhX2ZvbnRfY2FjaGVzX29uX2Rlc3RydWN0aW9uKSkgeworfQogCiB2b2lkIEhhcmR3YXJlUmFzdGVyaXplcjo6U3VibWl0KAogICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8cmVuZGVyX3RyZWU6Ok5vZGU+JiByZW5kZXJfdHJlZSwKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvaGFyZHdhcmVfcmFzdGVyaXplci5oIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9oYXJkd2FyZV9yYXN0ZXJpemVyLmgKaW5kZXggZGM1YzliNC4uZGMwMzAxOSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9oYXJkd2FyZV9yYXN0ZXJpemVyLmgKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9oYXJkd2FyZV9yYXN0ZXJpemVyLmgKQEAgLTQ5LDcgKzQ5LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBza2lhX2F0bGFzX3dpZHRoLCBpbnQgc2tpYV9hdGxhc19oZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2tpYV9jYWNoZV9zaXplX2luX2J5dGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNjcmF0Y2hfc3VyZmFjZV9jYWNoZV9zaXplX2luX2J5dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN1cmZhY2VfY2FjaGVfc2l6ZV9pbl9ieXRlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3VyZmFjZV9jYWNoZV9zaXplX2luX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwdXJnZV9za2lhX2ZvbnRfY2FjaGVzX29uX2Rlc3RydWN0aW9uKTsKIAogICB2b2lkIFN1Ym1pdChjb25zdCBzY29wZWRfcmVmcHRyPHJlbmRlcl90cmVlOjpOb2RlPiYgcmVuZGVyX3RyZWUsCiAgICAgICAgICAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8YmFja2VuZDo6UmVuZGVyVGFyZ2V0PiYgcmVuZGVyX3RhcmdldCwKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvc29mdHdhcmVfcmFzdGVyaXplci5jYyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvc29mdHdhcmVfcmFzdGVyaXplci5jYwppbmRleCAzMTlmNmVkLi5jNTY3ODQ2IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL3NvZnR3YXJlX3Jhc3Rlcml6ZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9zb2Z0d2FyZV9yYXN0ZXJpemVyLmNjCkBAIC0zMCwxMSArMzAsMTMgQEAKIG5hbWVzcGFjZSByYXN0ZXJpemVyIHsKIG5hbWVzcGFjZSBlZ2wgewogCi1Tb2Z0d2FyZVJhc3Rlcml6ZXI6OlNvZnR3YXJlUmFzdGVyaXplcihiYWNrZW5kOjpHcmFwaGljc0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3VyZmFjZV9jYWNoZV9zaXplKQorU29mdHdhcmVSYXN0ZXJpemVyOjpTb2Z0d2FyZVJhc3Rlcml6ZXIoCisgICAgYmFja2VuZDo6R3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBpbnQgc3VyZmFjZV9jYWNoZV9zaXplLAorICAgIGJvb2wgcHVyZ2Vfc2tpYV9mb250X2NhY2hlc19vbl9kZXN0cnVjdGlvbikKICAgICA6IGNvbnRleHRfKAogICAgICAgICAgIGJhc2U6OnBvbHltb3JwaGljX2Rvd25jYXN0PGJhY2tlbmQ6OkdyYXBoaWNzQ29udGV4dEVHTCo+KGNvbnRleHQpKSwKLSAgICAgIHNraWFfcmFzdGVyaXplcl8oc3VyZmFjZV9jYWNoZV9zaXplKSB7fQorICAgICAgc2tpYV9yYXN0ZXJpemVyXyhzdXJmYWNlX2NhY2hlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgIHB1cmdlX3NraWFfZm9udF9jYWNoZXNfb25fZGVzdHJ1Y3Rpb24pIHt9CiAKIHZvaWQgU29mdHdhcmVSYXN0ZXJpemVyOjpTdWJtaXQoCiAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxyZW5kZXJfdHJlZTo6Tm9kZT4mIHJlbmRlcl90cmVlLApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9zb2Z0d2FyZV9yYXN0ZXJpemVyLmggYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL3NvZnR3YXJlX3Jhc3Rlcml6ZXIuaAppbmRleCBjZTkwNmMwLi5hZmIzYzBiIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL3NvZnR3YXJlX3Jhc3Rlcml6ZXIuaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL3NvZnR3YXJlX3Jhc3Rlcml6ZXIuaApAQCAtMzgsNyArMzgsOCBAQAogY2xhc3MgU29mdHdhcmVSYXN0ZXJpemVyIDogcHVibGljIFJhc3Rlcml6ZXIgewogIHB1YmxpYzoKICAgZXhwbGljaXQgU29mdHdhcmVSYXN0ZXJpemVyKGJhY2tlbmQ6OkdyYXBoaWNzQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdXJmYWNlX2NhY2hlX3NpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN1cmZhY2VfY2FjaGVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcHVyZ2Vfc2tpYV9mb250X2NhY2hlc19vbl9kZXN0cnVjdGlvbik7CiAKICAgdm9pZCBTdWJtaXQoY29uc3Qgc2NvcGVkX3JlZnB0cjxyZW5kZXJfdHJlZTo6Tm9kZT4mIHJlbmRlcl90cmVlLAogICAgICAgICAgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPGJhY2tlbmQ6OlJlbmRlclRhcmdldD4mIHJlbmRlcl90YXJnZXQsCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvbGliL2V4dGVybmFsX3Jhc3Rlcml6ZXIuY2MgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvbGliL2V4dGVybmFsX3Jhc3Rlcml6ZXIuY2MKaW5kZXggOGFjODBjOC4uNWNlMDJmNiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2xpYi9leHRlcm5hbF9yYXN0ZXJpemVyLmNjCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9saWIvZXh0ZXJuYWxfcmFzdGVyaXplci5jYwpAQCAtMzUsNyArMzUsOCBAQAogICAgICAgIGludCBza2lhX2F0bGFzX3dpZHRoLCBpbnQgc2tpYV9hdGxhc19oZWlnaHQsCiAgICAgICAgaW50IHNraWFfY2FjaGVfc2l6ZV9pbl9ieXRlcywKICAgICAgICBpbnQgc2NyYXRjaF9zdXJmYWNlX2NhY2hlX3NpemVfaW5fYnl0ZXMsCi0gICAgICAgaW50IHN1cmZhY2VfY2FjaGVfc2l6ZV9pbl9ieXRlcyk7CisgICAgICAgaW50IHN1cmZhY2VfY2FjaGVfc2l6ZV9pbl9ieXRlcywKKyAgICAgICBib29sIHB1cmdlX3NraWFfZm9udF9jYWNoZXNfb25fZGVzdHJ1Y3Rpb24pOwogICB+SW1wbCgpOwogCiAgIHZvaWQgU3VibWl0KGNvbnN0IHNjb3BlZF9yZWZwdHI8cmVuZGVyX3RyZWU6Ok5vZGU+JiByZW5kZXJfdHJlZSwKQEAgLTYyLDE0ICs2MywxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBza2lhX2F0bGFzX3dpZHRoLCBpbnQgc2tpYV9hdGxhc19oZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNraWFfY2FjaGVfc2l6ZV9pbl9ieXRlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2NyYXRjaF9zdXJmYWNlX2NhY2hlX3NpemVfaW5fYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN1cmZhY2VfY2FjaGVfc2l6ZV9pbl9ieXRlcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3VyZmFjZV9jYWNoZV9zaXplX2luX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcHVyZ2Vfc2tpYV9mb250X2NhY2hlc19vbl9kZXN0cnVjdGlvbikKICAgICA6IGdyYXBoaWNzX2NvbnRleHRfKAogICAgICAgICAgIGJhc2U6OnBvbHltb3JwaGljX2Rvd25jYXN0PGJhY2tlbmQ6OkdyYXBoaWNzQ29udGV4dEVHTCo+KAogICAgICAgICAgICAgICBncmFwaGljc19jb250ZXh0KSksCiAgICAgICBoYXJkd2FyZV9yYXN0ZXJpemVyXyhncmFwaGljc19jb250ZXh0LCBza2lhX2F0bGFzX3dpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpYV9hdGxhc19oZWlnaHQsIHNraWFfY2FjaGVfc2l6ZV9pbl9ieXRlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmF0Y2hfc3VyZmFjZV9jYWNoZV9zaXplX2luX2J5dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZV9jYWNoZV9zaXplX2luX2J5dGVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlX2NhY2hlX3NpemVfaW5fYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXJnZV9za2lhX2ZvbnRfY2FjaGVzX29uX2Rlc3RydWN0aW9uKSB7CiAgIG9wdGlvbnNfLmZsYWdzID0gc2tpYTo6SGFyZHdhcmVSYXN0ZXJpemVyOjprU3VibWl0RmxhZ3NfQ2xlYXI7CiAgIGdyYXBoaWNzX2NvbnRleHRfLT5NYWtlQ3VycmVudCgpOwogCkBAIC0xMjAsMTEgKzEyMywxMyBAQAogRXh0ZXJuYWxSYXN0ZXJpemVyOjpFeHRlcm5hbFJhc3Rlcml6ZXIoCiAgICAgYmFja2VuZDo6R3JhcGhpY3NDb250ZXh0KiBncmFwaGljc19jb250ZXh0LCBpbnQgc2tpYV9hdGxhc193aWR0aCwKICAgICBpbnQgc2tpYV9hdGxhc19oZWlnaHQsIGludCBza2lhX2NhY2hlX3NpemVfaW5fYnl0ZXMsCi0gICAgaW50IHNjcmF0Y2hfc3VyZmFjZV9jYWNoZV9zaXplX2luX2J5dGVzLCBpbnQgc3VyZmFjZV9jYWNoZV9zaXplX2luX2J5dGVzKQorICAgIGludCBzY3JhdGNoX3N1cmZhY2VfY2FjaGVfc2l6ZV9pbl9ieXRlcywgaW50IHN1cmZhY2VfY2FjaGVfc2l6ZV9pbl9ieXRlcywKKyAgICBib29sIHB1cmdlX3NraWFfZm9udF9jYWNoZXNfb25fZGVzdHJ1Y3Rpb24pCiAgICAgOiBpbXBsXyhuZXcgSW1wbChncmFwaGljc19jb250ZXh0LCBza2lhX2F0bGFzX3dpZHRoLCBza2lhX2F0bGFzX2hlaWdodCwKICAgICAgICAgICAgICAgICAgICAgIHNraWFfY2FjaGVfc2l6ZV9pbl9ieXRlcywKICAgICAgICAgICAgICAgICAgICAgIHNjcmF0Y2hfc3VyZmFjZV9jYWNoZV9zaXplX2luX2J5dGVzLAotICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZV9jYWNoZV9zaXplX2luX2J5dGVzKSkge30KKyAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2VfY2FjaGVfc2l6ZV9pbl9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgIHB1cmdlX3NraWFfZm9udF9jYWNoZXNfb25fZGVzdHJ1Y3Rpb24pKSB7fQogCiBFeHRlcm5hbFJhc3Rlcml6ZXI6On5FeHRlcm5hbFJhc3Rlcml6ZXIoKSB7fQogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvbGliL2V4dGVybmFsX3Jhc3Rlcml6ZXIuaCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9saWIvZXh0ZXJuYWxfcmFzdGVyaXplci5oCmluZGV4IDQ5ZmZjMzIuLjE2ZjZmNjYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9saWIvZXh0ZXJuYWxfcmFzdGVyaXplci5oCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9saWIvZXh0ZXJuYWxfcmFzdGVyaXplci5oCkBAIC0zNyw3ICszNyw4IEBACiAgICAgICAgICAgICAgICAgICAgICBpbnQgc2tpYV9hdGxhc193aWR0aCwgaW50IHNraWFfYXRsYXNfaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgaW50IHNraWFfY2FjaGVfc2l6ZV9pbl9ieXRlcywKICAgICAgICAgICAgICAgICAgICAgIGludCBzY3JhdGNoX3N1cmZhY2VfY2FjaGVfc2l6ZV9pbl9ieXRlcywKLSAgICAgICAgICAgICAgICAgICAgIGludCBzdXJmYWNlX2NhY2hlX3NpemVfaW5fYnl0ZXMpOworICAgICAgICAgICAgICAgICAgICAgaW50IHN1cmZhY2VfY2FjaGVfc2l6ZV9pbl9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgcHVyZ2Vfc2tpYV9mb250X2NhY2hlc19vbl9kZXN0cnVjdGlvbik7CiAgIHZpcnR1YWwgfkV4dGVybmFsUmFzdGVyaXplcigpOwogCiAgIHZvaWQgU3VibWl0KGNvbnN0IHNjb3BlZF9yZWZwdHI8cmVuZGVyX3RyZWU6Ok5vZGU+JiByZW5kZXJfdHJlZSwKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9saWIvaW1wb3J0ZWQvZ3JhcGhpY3MuaCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9saWIvaW1wb3J0ZWQvZ3JhcGhpY3MuaAppbmRleCAxMjVmODVmLi5jZGUwNTczIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvbGliL2ltcG9ydGVkL2dyYXBoaWNzLmgKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2xpYi9pbXBvcnRlZC9ncmFwaGljcy5oCkBAIC0xOCwyMCArMTgsMjEgQEAKICNpZm5kZWYgQ09CQUxUX1JFTkRFUkVSX1JBU1RFUklaRVJfTElCX0lNUE9SVEVEX0dSQVBISUNTX0hfCiAjZGVmaW5lIENPQkFMVF9SRU5ERVJFUl9SQVNURVJJWkVSX0xJQl9JTVBPUlRFRF9HUkFQSElDU19IXwogCi0vLyBUT0RPOiBVc2Ugc3RhcmJvYXJkL3R5cGVzLmggaW5zdGVhZC4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlICJzdGFyYm9hcmQvZXhwb3J0LmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL3R5cGVzLmgiCisKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiIHsKICNlbmRpZgogCiAvLyBJbnZva2VkIGZyb20gdGhlIHJhc3Rlcml6YXRpb24gdGhyZWFkIGFmdGVyIHRoZSBHTCBjb250ZXh0IGhhcyBiZWVuIGNyZWF0ZWQuCi12b2lkIENiTGliT25HcmFwaGljc0NvbnRleHRDcmVhdGVkKCk7CitTQl9JTVBPUlRfUExBVEZPUk0gdm9pZCBDYkxpYk9uR3JhcGhpY3NDb250ZXh0Q3JlYXRlZCgpOwogCiAvLyBJbnZva2VkIGFzIG9mdGVuIGFzIHRoZSBwbGF0Zm9ybSBjYW4gc3dhcCBidWZmZXJzIGZyb20gdGhlIHJhc3Rlcml6YXRpb24KIC8vIHRocmVhZC4gfHJlbmRlcl90cmVlX3RleHR1cmVfaGFuZGxlfCBjb3JyZXNwb25kcyB0byBhIEdMaW50IHRleHR1cmUgSUQgZm9yCiAvLyB0aGUgY3VycmVudCBSZW5kZXJUcmVlLgotdm9pZCBDYkxpYlJlbmRlckZyYW1lKGludHB0cl90IHJlbmRlcl90cmVlX3RleHR1cmVfaGFuZGxlKTsKK1NCX0lNUE9SVF9QTEFURk9STSB2b2lkIENiTGliUmVuZGVyRnJhbWUoaW50cHRyX3QgcmVuZGVyX3RyZWVfdGV4dHVyZV9oYW5kbGUpOwogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0gIC8vIGV4dGVybiAiQyIKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9saWIvaW1wb3J0ZWQvZ3JhcGhpY3Nfc3R1Yi5jYyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9saWIvaW1wb3J0ZWQvZ3JhcGhpY3Nfc3R1Yi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDllY2UwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2xpYi9pbXBvcnRlZC9ncmFwaGljc19zdHViLmNjCkBAIC0wLDAgKzEsOCBAQAorI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2xpYi9pbXBvcnRlZC9ncmFwaGljcy5oIgorCisvLyBFbXB0eSBpbXBsZW1lbnRhdGlvbnMgc28gdGhhdCAnbGliJyB0YXJnZXRzIGNhbiBiZSBjb21waWxlZCBpbnRvIGV4ZWN1dGFibGVzCisvLyBieSB0aGUgYnVpbGRlciB3aXRob3V0IG1pc3Npbmcgc3ltYm9sIGRlZmluaXRpb25zLgordm9pZCBDYkxpYk9uR3JhcGhpY3NDb250ZXh0Q3JlYXRlZCgpIHt9Cit2b2lkIENiTGliUmVuZGVyRnJhbWUoaW50cHRyX3QgcmVuZGVyX3RyZWVfdGV4dHVyZV9oYW5kbGUpIHsKKyAgKHZvaWQpcmVuZGVyX3RyZWVfdGV4dHVyZV9oYW5kbGU7Cit9CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvbGliL2xpYi5neXAgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvbGliL2xpYi5neXAKaW5kZXggM2ZmNjFhOC4uZGYzOGJiNCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2xpYi9saWIuZ3lwCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9saWIvbGliLmd5cApAQCAtMjUsNiArMjUsMTUgQEAKICAgICAgICAgJ2V4dGVybmFsX3Jhc3Rlcml6ZXIuY2MnLAogICAgICAgICAncmVuZGVyZXJfbW9kdWxlX2RlZmF1bHRfb3B0aW9uc19saWIuY2MnCiAgICAgICBdLAorICAgICAgJ2FsbF9kZXBlbmRlbnRfc2V0dGluZ3MnOiB7CisgICAgICAgICd0YXJnZXRfY29uZGl0aW9ucyc6IFsKKyAgICAgICAgICBbJ190eXBlPT0iZXhlY3V0YWJsZSIgYW5kIF90b29sc2V0PT0idGFyZ2V0IicsIHsKKyAgICAgICAgICAgICdzb3VyY2VzJzogWworICAgICAgICAgICAgICAnaW1wb3J0ZWQvZ3JhcGhpY3Nfc3R1Yi5jYycsCisgICAgICAgICAgICBdLAorICAgICAgICAgIH1dLAorICAgICAgICBdLAorICAgICAgfSwKICAgICAgICAnZGVwZW5kZW5jaWVzJzogWwogICAgICAgICAgJzwoREVQVEgpL2Jhc2UvYmFzZS5neXA6YmFzZScsCiAgICAgICAgICAnPChERVBUSCkvY29iYWx0L3JlbmRlcl90cmVlL3JlbmRlcl90cmVlLmd5cDpyZW5kZXJfdHJlZScsCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvbGliL3JlbmRlcmVyX21vZHVsZV9kZWZhdWx0X29wdGlvbnNfbGliLmNjIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2xpYi9yZW5kZXJlcl9tb2R1bGVfZGVmYXVsdF9vcHRpb25zX2xpYi5jYwppbmRleCA5NTVlYTQ1Li40Y2FhNjE1IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvbGliL3JlbmRlcmVyX21vZHVsZV9kZWZhdWx0X29wdGlvbnNfbGliLmNjCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9saWIvcmVuZGVyZXJfbW9kdWxlX2RlZmF1bHRfb3B0aW9uc19saWIuY2MKQEAgLTI0LDEyICsyNCwxMiBAQAogICAgIGNvbnN0IFJlbmRlcmVyTW9kdWxlOjpPcHRpb25zJiBvcHRpb25zKSB7CiAgIHJldHVybiBzY29wZWRfcHRyPHJhc3Rlcml6ZXI6OlJhc3Rlcml6ZXI+KAogICAgICAgbmV3IHJhc3Rlcml6ZXI6OmxpYjo6RXh0ZXJuYWxSYXN0ZXJpemVyKAotICAgICAgICBncmFwaGljc19jb250ZXh0LAotICAgICAgICBvcHRpb25zLnNraWFfZ2x5cGhfdGV4dHVyZV9hdGxhc19kaW1lbnNpb25zLndpZHRoKCksCi0gICAgICAgIG9wdGlvbnMuc2tpYV9nbHlwaF90ZXh0dXJlX2F0bGFzX2RpbWVuc2lvbnMuaGVpZ2h0KCksCi0gICAgICAgIG9wdGlvbnMuc2tpYV9jYWNoZV9zaXplX2luX2J5dGVzLAotICAgICAgICBvcHRpb25zLnNjcmF0Y2hfc3VyZmFjZV9jYWNoZV9zaXplX2luX2J5dGVzLAotICAgICAgICBvcHRpb25zLnN1cmZhY2VfY2FjaGVfc2l6ZV9pbl9ieXRlcykpOworICAgICAgICAgIGdyYXBoaWNzX2NvbnRleHQsIG9wdGlvbnMuc2tpYV9nbHlwaF90ZXh0dXJlX2F0bGFzX2RpbWVuc2lvbnMud2lkdGgoKSwKKyAgICAgICAgICBvcHRpb25zLnNraWFfZ2x5cGhfdGV4dHVyZV9hdGxhc19kaW1lbnNpb25zLmhlaWdodCgpLAorICAgICAgICAgIG9wdGlvbnMuc2tpYV9jYWNoZV9zaXplX2luX2J5dGVzLAorICAgICAgICAgIG9wdGlvbnMuc2NyYXRjaF9zdXJmYWNlX2NhY2hlX3NpemVfaW5fYnl0ZXMsCisgICAgICAgICAgb3B0aW9ucy5zdXJmYWNlX2NhY2hlX3NpemVfaW5fYnl0ZXMsCisgICAgICAgICAgb3B0aW9ucy5wdXJnZV9za2lhX2ZvbnRfY2FjaGVzX29uX2Rlc3RydWN0aW9uKSk7CiB9CiB9ICAvLyBuYW1lc3BhY2UKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvaGFyZHdhcmVfcmFzdGVyaXplci5jYyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL2hhcmR3YXJlX3Jhc3Rlcml6ZXIuY2MKaW5kZXggZTU2OWRlZi4uYjkwYTA5YSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvaGFyZHdhcmVfcmFzdGVyaXplci5jYworKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9oYXJkd2FyZV9yYXN0ZXJpemVyLmNjCkBAIC01Niw4ICs1Niw4IEBACiAgcHVibGljOgogICBJbXBsKGJhY2tlbmQ6OkdyYXBoaWNzQ29udGV4dCogZ3JhcGhpY3NfY29udGV4dCwgaW50IHNraWFfYXRsYXNfd2lkdGgsCiAgICAgICAgaW50IHNraWFfYXRsYXNfaGVpZ2h0LCBpbnQgc2tpYV9jYWNoZV9zaXplX2luX2J5dGVzLAotICAgICAgIGludCBzY3JhdGNoX3N1cmZhY2VfY2FjaGVfc2l6ZV9pbl9ieXRlcywKLSAgICAgICBpbnQgc3VyZmFjZV9jYWNoZV9zaXplX2luX2J5dGVzKTsKKyAgICAgICBpbnQgc2NyYXRjaF9zdXJmYWNlX2NhY2hlX3NpemVfaW5fYnl0ZXMsIGludCBzdXJmYWNlX2NhY2hlX3NpemVfaW5fYnl0ZXMsCisgICAgICAgYm9vbCBwdXJnZV9za2lhX2ZvbnRfY2FjaGVzX29uX2Rlc3RydWN0aW9uKTsKICAgfkltcGwoKTsKIAogICB2b2lkIEFkdmFuY2VGcmFtZSgpOwpAQCAtODIsOCArODIsNyBAQAogICAvLyBOb3RlOiBXZSBjYW5ub3Qgc3RvcmUgYSBTa0F1dG9UVW5yZWY8U2tTdXJmYWNlPiBpbiB0aGUgbWFwIGJlY2F1c2UgaXQgaXMKICAgLy8gbm90IGNvcHlhYmxlOyBzbyB3ZSBtdXN0IG1hbnVhbGx5IG1hbmFnZSBvdXIgcmVmZXJlbmNlcyB3aGVuIGFkZGluZyAvCiAgIC8vIHJlbW92aW5nIFNrU3VyZmFjZXMgZnJvbSBpdC4KLSAgdHlwZWRlZiBiYXNlOjpsaW5rZWRfaGFzaF9tYXA8Ci0gICAgYmFja2VuZDo6UmVuZGVyVGFyZ2V0KiwgU2tTdXJmYWNlKj4gU2tTdXJmYWNlTWFwOworICB0eXBlZGVmIGJhc2U6OmxpbmtlZF9oYXNoX21hcDxpbnQzMl90LCBTa1N1cmZhY2UqPiBTa1N1cmZhY2VNYXA7CiAgIGNsYXNzIENhY2hlZFNjcmF0Y2hTdXJmYWNlSG9sZGVyCiAgICAgICA6IHB1YmxpYyBSZW5kZXJUcmVlTm9kZVZpc2l0b3I6OlNjcmF0Y2hTdXJmYWNlIHsKICAgIHB1YmxpYzoKQEAgLTM2NCw3ICszNjMsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBza2lhX2F0bGFzX3dpZHRoLCBpbnQgc2tpYV9hdGxhc19oZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNraWFfY2FjaGVfc2l6ZV9pbl9ieXRlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2NyYXRjaF9zdXJmYWNlX2NhY2hlX3NpemVfaW5fYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN1cmZhY2VfY2FjaGVfc2l6ZV9pbl9ieXRlcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3VyZmFjZV9jYWNoZV9zaXplX2luX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcHVyZ2Vfc2tpYV9mb250X2NhY2hlc19vbl9kZXN0cnVjdGlvbikKICAgICA6IGdyYXBoaWNzX2NvbnRleHRfKAogICAgICAgICAgIGJhc2U6OnBvbHltb3JwaGljX2Rvd25jYXN0PGJhY2tlbmQ6OkdyYXBoaWNzQ29udGV4dEVHTCo+KAogICAgICAgICAgICAgICBncmFwaGljc19jb250ZXh0KSkgewpAQCAtNDA0LDcgKzQwNCw4IEBACiAgIHJlc291cmNlX3Byb3ZpZGVyXy5yZXNldChuZXcgSGFyZHdhcmVSZXNvdXJjZVByb3ZpZGVyKAogICAgICAgZ3JhcGhpY3NfY29udGV4dF8sIGdyX2NvbnRleHRfLAogICAgICAgYmFzZTo6QmluZCgmSGFyZHdhcmVSYXN0ZXJpemVyOjpJbXBsOjpTdWJtaXRPZmZzY3JlZW5Ub1JlbmRlclRhcmdldCwKLSAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpKTsKKyAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSksCisgICAgICBwdXJnZV9za2lhX2ZvbnRfY2FjaGVzX29uX2Rlc3RydWN0aW9uKSk7CiAKICAgZ3JhcGhpY3NfY29udGV4dF8tPlJlbGVhc2VDdXJyZW50Q29udGV4dCgpOwogCkBAIC01ODksNyArNTkwLDggQEAKIFNrQ2FudmFzKiBIYXJkd2FyZVJhc3Rlcml6ZXI6OkltcGw6OkdldENhbnZhc0Zyb21SZW5kZXJUYXJnZXQoCiAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxiYWNrZW5kOjpSZW5kZXJUYXJnZXQ+JiByZW5kZXJfdGFyZ2V0KSB7CiAgIFNrU3VyZmFjZSogc2tfb3V0cHV0X3N1cmZhY2U7Ci0gIFNrU3VyZmFjZU1hcDo6aXRlcmF0b3IgaXRlciA9IHNrX291dHB1dF9zdXJmYWNlX21hcF8uZmluZChyZW5kZXJfdGFyZ2V0KTsKKyAgaW50MzJfdCBzdXJmYWNlX21hcF9rZXkgPSByZW5kZXJfdGFyZ2V0LT5HZXRTZXJpYWxOdW1iZXIoKTsKKyAgU2tTdXJmYWNlTWFwOjppdGVyYXRvciBpdGVyID0gc2tfb3V0cHV0X3N1cmZhY2VfbWFwXy5maW5kKHN1cmZhY2VfbWFwX2tleSk7CiAgIGlmIChpdGVyID09IHNrX291dHB1dF9zdXJmYWNlX21hcF8uZW5kKCkpIHsKICAgICAvLyBSZW1vdmUgdGhlIGxlYXN0IHJlY2VudGx5IHVzZWQgU2tTdXJmYWNlIGZyb20gdGhlIG1hcCBpZiB3ZSBleGNlZWQgdGhlCiAgICAgLy8gbWF4IGFsbG93ZWQgc2F2ZWQgc3VyZmFjZXMuCkBAIC02MTMsMTMgKzYxNSwxMyBAQAogICAgIC8vIENyZWF0ZSBhbiBTa1N1cmZhY2UgZnJvbSB0aGUgcmVuZGVyIHRhcmdldCBzbyB0aGF0IHdlIGNhbiBhY3F1aXJlIGEKICAgICAvLyBTa0NhbnZhcyBvYmplY3QgZnJvbSBpdCBpbiBTdWJtaXQoKS4KICAgICBza19vdXRwdXRfc3VyZmFjZSA9IENyZWF0ZVNraWFSZW5kZXJUYXJnZXRTdXJmYWNlKHNraWFfcmVuZGVyX3RhcmdldCk7Ci0gICAgc2tfb3V0cHV0X3N1cmZhY2VfbWFwX1tyZW5kZXJfdGFyZ2V0XSA9IHNrX291dHB1dF9zdXJmYWNlOworICAgIHNrX291dHB1dF9zdXJmYWNlX21hcF9bc3VyZmFjZV9tYXBfa2V5XSA9IHNrX291dHB1dF9zdXJmYWNlOwogICB9IGVsc2UgewotICAgIHNrX291dHB1dF9zdXJmYWNlID0gc2tfb3V0cHV0X3N1cmZhY2VfbWFwX1tyZW5kZXJfdGFyZ2V0XTsKKyAgICBza19vdXRwdXRfc3VyZmFjZSA9IHNrX291dHB1dF9zdXJmYWNlX21hcF9bc3VyZmFjZV9tYXBfa2V5XTsKICAgICAvLyBNYXJrIHRoaXMgUmVuZGVyVGFyZ2V0L1NrQ2FudmFzIHBhaXIgYXMgdGhlIG1vc3QgcmVjZW50bHkgdXNlZCBieQogICAgIC8vIHBvcHBpbmcgaXQgYW5kIHJlLWFkZGluZyBpdC4KICAgICBza19vdXRwdXRfc3VyZmFjZV9tYXBfLmVyYXNlKGl0ZXIpOwotICAgIHNrX291dHB1dF9zdXJmYWNlX21hcF9bcmVuZGVyX3RhcmdldF0gPSBza19vdXRwdXRfc3VyZmFjZTsKKyAgICBza19vdXRwdXRfc3VyZmFjZV9tYXBfW3N1cmZhY2VfbWFwX2tleV0gPSBza19vdXRwdXRfc3VyZmFjZTsKICAgfQogICByZXR1cm4gc2tfb3V0cHV0X3N1cmZhY2UtPmdldENhbnZhcygpOwogfQpAQCAtNjI3LDYgKzYyOSw5IEBACiB2b2lkIEhhcmR3YXJlUmFzdGVyaXplcjo6SW1wbDo6UmFzdGVyaXplUmVuZGVyVHJlZVRvQ2FudmFzKAogICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8cmVuZGVyX3RyZWU6Ok5vZGU+JiByZW5kZXJfdHJlZSwgU2tDYW52YXMqIGNhbnZhcykgewogICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6cmVuZGVyZXIiLCAiUmFzdGVyaXplUmVuZGVyVHJlZVRvQ2FudmFzIik7CisgIC8vIFRPRE86IFRoaXMgdHJhY2UgdXNlcyB0aGUgbmFtZSBpbiB0aGUgY3VycmVudCBiZW5jaG1hcmsgdG8ga2VlcCBpdCB3b3JrIGFzCisgIC8vIGV4cGVjdGVkLiBSZW1vdmUgYWZ0ZXIgc3dpdGNoaW5nIHRvIHdlYmRyaXZlciBiZW5jaG1hcmsuCisgIFRSQUNFX0VWRU5UMCgiY29iYWx0OjpyZW5kZXJlciIsICJWaXNpdFJlbmRlclRyZWUiKTsKICAgUmVuZGVyVHJlZU5vZGVWaXNpdG9yOjpDcmVhdGVTY3JhdGNoU3VyZmFjZUZ1bmN0aW9uCiAgICAgICBjcmVhdGVfc2NyYXRjaF9zdXJmYWNlX2Z1bmN0aW9uID0KICAgICAgICAgICBiYXNlOjpCaW5kKCZIYXJkd2FyZVJhc3Rlcml6ZXI6OkltcGw6OkNyZWF0ZVNjcmF0Y2hTdXJmYWNlLApAQCAtNjUwLDExICs2NTUsMTMgQEAKIEhhcmR3YXJlUmFzdGVyaXplcjo6SGFyZHdhcmVSYXN0ZXJpemVyKAogICAgIGJhY2tlbmQ6OkdyYXBoaWNzQ29udGV4dCogZ3JhcGhpY3NfY29udGV4dCwgaW50IHNraWFfYXRsYXNfd2lkdGgsCiAgICAgaW50IHNraWFfYXRsYXNfaGVpZ2h0LCBpbnQgc2tpYV9jYWNoZV9zaXplX2luX2J5dGVzLAotICAgIGludCBzY3JhdGNoX3N1cmZhY2VfY2FjaGVfc2l6ZV9pbl9ieXRlcywgaW50IHN1cmZhY2VfY2FjaGVfc2l6ZV9pbl9ieXRlcykKLSAgICA6IGltcGxfKG5ldyBJbXBsKGdyYXBoaWNzX2NvbnRleHQsIHNraWFfYXRsYXNfd2lkdGgsIHNraWFfYXRsYXNfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgc2tpYV9jYWNoZV9zaXplX2luX2J5dGVzLAotICAgICAgICAgICAgICAgICAgICAgc2NyYXRjaF9zdXJmYWNlX2NhY2hlX3NpemVfaW5fYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICBzdXJmYWNlX2NhY2hlX3NpemVfaW5fYnl0ZXMpKSB7fQorICAgIGludCBzY3JhdGNoX3N1cmZhY2VfY2FjaGVfc2l6ZV9pbl9ieXRlcywgaW50IHN1cmZhY2VfY2FjaGVfc2l6ZV9pbl9ieXRlcywKKyAgICBib29sIHB1cmdlX3NraWFfZm9udF9jYWNoZXNfb25fZGVzdHJ1Y3Rpb24pCisgICAgOiBpbXBsXyhuZXcgSW1wbCgKKyAgICAgICAgICBncmFwaGljc19jb250ZXh0LCBza2lhX2F0bGFzX3dpZHRoLCBza2lhX2F0bGFzX2hlaWdodCwKKyAgICAgICAgICBza2lhX2NhY2hlX3NpemVfaW5fYnl0ZXMsIHNjcmF0Y2hfc3VyZmFjZV9jYWNoZV9zaXplX2luX2J5dGVzLAorICAgICAgICAgIHN1cmZhY2VfY2FjaGVfc2l6ZV9pbl9ieXRlcywgcHVyZ2Vfc2tpYV9mb250X2NhY2hlc19vbl9kZXN0cnVjdGlvbikpIHsKK30KIAogSGFyZHdhcmVSYXN0ZXJpemVyOjp+SGFyZHdhcmVSYXN0ZXJpemVyKCkge30KIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvaGFyZHdhcmVfcmFzdGVyaXplci5oIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvaGFyZHdhcmVfcmFzdGVyaXplci5oCmluZGV4IDczNDNjYTAuLmFiYTlmZDQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL2hhcmR3YXJlX3Jhc3Rlcml6ZXIuaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9oYXJkd2FyZV9yYXN0ZXJpemVyLmgKQEAgLTU0LDcgKzU0LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBza2lhX2F0bGFzX3dpZHRoLCBpbnQgc2tpYV9hdGxhc19oZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2tpYV9jYWNoZV9zaXplX2luX2J5dGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNjcmF0Y2hfc3VyZmFjZV9jYWNoZV9zaXplX2luX2J5dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN1cmZhY2VfY2FjaGVfc2l6ZV9pbl9ieXRlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3VyZmFjZV9jYWNoZV9zaXplX2luX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwdXJnZV9za2lhX2ZvbnRfY2FjaGVzX29uX2Rlc3RydWN0aW9uKTsKICAgdmlydHVhbCB+SGFyZHdhcmVSYXN0ZXJpemVyKCk7CiAKICAgLy8gQ29uc3VtZSB0aGUgcmVuZGVyIHRyZWUgYW5kIG91dHB1dCB0aGUgcmVzdWx0cyB0byB0aGUgcmVuZGVyIHRhcmdldCBwYXNzZWQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL2hhcmR3YXJlX3Jlc291cmNlX3Byb3ZpZGVyLmNjIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvaGFyZHdhcmVfcmVzb3VyY2VfcHJvdmlkZXIuY2MKaW5kZXggNTA0ZmFhYi4uZThhNGEwOCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvaGFyZHdhcmVfcmVzb3VyY2VfcHJvdmlkZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvaGFyZHdhcmVfcmVzb3VyY2VfcHJvdmlkZXIuY2MKQEAgLTQ3LDEwICs0NywxMyBAQAogCiBIYXJkd2FyZVJlc291cmNlUHJvdmlkZXI6OkhhcmR3YXJlUmVzb3VyY2VQcm92aWRlcigKICAgICBiYWNrZW5kOjpHcmFwaGljc0NvbnRleHRFR0wqIGNvYmFsdF9jb250ZXh0LCBHckNvbnRleHQqIGdyX2NvbnRleHQsCi0gICAgU3VibWl0T2Zmc2NyZWVuQ2FsbGJhY2sgc3VibWl0X29mZnNjcmVlbl9jYWxsYmFjaykKKyAgICBTdWJtaXRPZmZzY3JlZW5DYWxsYmFjayBzdWJtaXRfb2Zmc2NyZWVuX2NhbGxiYWNrLAorICAgIGJvb2wgcHVyZ2Vfc2tpYV9mb250X2NhY2hlc19vbl9kZXN0cnVjdGlvbikKICAgICA6IGNvYmFsdF9jb250ZXh0Xyhjb2JhbHRfY29udGV4dCksCiAgICAgICBncl9jb250ZXh0Xyhncl9jb250ZXh0KSwKICAgICAgIHN1Ym1pdF9vZmZzY3JlZW5fY2FsbGJhY2tfKHN1Ym1pdF9vZmZzY3JlZW5fY2FsbGJhY2spLAorICAgICAgcHVyZ2Vfc2tpYV9mb250X2NhY2hlc19vbl9kZXN0cnVjdGlvbl8oCisgICAgICAgICAgcHVyZ2Vfc2tpYV9mb250X2NhY2hlc19vbl9kZXN0cnVjdGlvbiksCiAgICAgICBzZWxmX21lc3NhZ2VfbG9vcF8oTWVzc2FnZUxvb3A6OmN1cnJlbnQoKSkgewogICAvLyBJbml0aWFsaXplIHRoZSBmb250IG1hbmFnZXIgbm93IHRvIGVuc3VyZSB0aGF0IGl0IGRvZXNuJ3QgZ2V0IGluaXRpYWxpemVkCiAgIC8vIG9uIG11bHRpcGxlIHRocmVhZHMgc2ltdWx0YW5lb3VzbHkgbGF0ZXIuCkBAIC02OCw2ICs3MSwxNyBAQAogICAgICAgICAgICBTQl9IQVMoR1JBUEhJQ1MpCiB9CiAKK0hhcmR3YXJlUmVzb3VyY2VQcm92aWRlcjo6fkhhcmR3YXJlUmVzb3VyY2VQcm92aWRlcigpIHsKKyAgaWYgKHB1cmdlX3NraWFfZm9udF9jYWNoZXNfb25fZGVzdHJ1Y3Rpb25fKSB7CisgICAgdGV4dF9zaGFwZXJfLlB1cmdlQ2FjaGVzKCk7CisKKyAgICBTa0F1dG9UVW5yZWY8U2tGb250TWdyPiBmb250X21hbmFnZXIoU2tGb250TWdyOjpSZWZEZWZhdWx0KCkpOworICAgIFNrRm9udE1ncl9Db2JhbHQqIGNvYmFsdF9mb250X21hbmFnZXIgPQorICAgICAgICBiYXNlOjpwb2x5bW9ycGhpY19kb3duY2FzdDxTa0ZvbnRNZ3JfQ29iYWx0Kj4oZm9udF9tYW5hZ2VyLmdldCgpKTsKKyAgICBjb2JhbHRfZm9udF9tYW5hZ2VyLT5QdXJnZUNhY2hlcygpOworICB9Cit9CisKIHZvaWQgSGFyZHdhcmVSZXNvdXJjZVByb3ZpZGVyOjpGaW5pc2goKSB7CiAgIC8vIFdhaXQgZm9yIGFueSByZXNvdXJjZS1yZWxhdGVkIHRvIGNvbXBsZXRlIChieSB3YWl0aW5nIGZvciBhbGwgdGFza3MgdG8KICAgLy8gY29tcGxldGUpLgpAQCAtMzgwLDEzICszOTQsNiBAQAogICAgICAgc2VsZl9tZXNzYWdlX2xvb3BfKSk7CiB9CiAKLXZvaWQgSGFyZHdhcmVSZXNvdXJjZVByb3ZpZGVyOjpQdXJnZUNhY2hlcygpIHsKLSAgU2tBdXRvVFVucmVmPFNrRm9udE1ncj4gZm9udF9tYW5hZ2VyKFNrRm9udE1ncjo6UmVmRGVmYXVsdCgpKTsKLSAgU2tGb250TWdyX0NvYmFsdCogY29iYWx0X2ZvbnRfbWFuYWdlciA9Ci0gICAgICBiYXNlOjpwb2x5bW9ycGhpY19kb3duY2FzdDxTa0ZvbnRNZ3JfQ29iYWx0Kj4oZm9udF9tYW5hZ2VyLmdldCgpKTsKLSAgY29iYWx0X2ZvbnRfbWFuYWdlci0+UHVyZ2VDYWNoZXMoKTsKLX0KLQogfSAgLy8gbmFtZXNwYWNlIHNraWEKIH0gIC8vIG5hbWVzcGFjZSByYXN0ZXJpemVyCiB9ICAvLyBuYW1lc3BhY2UgcmVuZGVyZXIKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL2hhcmR3YXJlX3Jlc291cmNlX3Byb3ZpZGVyLmggYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9oYXJkd2FyZV9yZXNvdXJjZV9wcm92aWRlci5oCmluZGV4IDVmZTc4MTQuLmQ1NTQwYTggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL2hhcmR3YXJlX3Jlc291cmNlX3Byb3ZpZGVyLmgKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvaGFyZHdhcmVfcmVzb3VyY2VfcHJvdmlkZXIuaApAQCAtMzksNyArMzksOSBAQAogIHB1YmxpYzoKICAgSGFyZHdhcmVSZXNvdXJjZVByb3ZpZGVyKGJhY2tlbmQ6OkdyYXBoaWNzQ29udGV4dEVHTCogY29iYWx0X2NvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHckNvbnRleHQqIGdyX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJtaXRPZmZzY3JlZW5DYWxsYmFjayBzdWJtaXRfb2Zmc2NyZWVuX2NhbGxiYWNrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1Ym1pdE9mZnNjcmVlbkNhbGxiYWNrIHN1Ym1pdF9vZmZzY3JlZW5fY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHB1cmdlX3NraWFfZm9udF9jYWNoZXNfb25fZGVzdHJ1Y3Rpb24pOworICB+SGFyZHdhcmVSZXNvdXJjZVByb3ZpZGVyKCkgT1ZFUlJJREU7CiAKICAgdm9pZCBGaW5pc2goKSBPVkVSUklERTsKIApAQCAtMTM2LDEyICsxMzgsMTEgQEAKICAgc2NvcGVkX3JlZnB0cjxyZW5kZXJfdHJlZTo6SW1hZ2U+IERyYXdPZmZzY3JlZW5JbWFnZSgKICAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8cmVuZGVyX3RyZWU6Ok5vZGU+JiByb290KSBPVkVSUklERTsKIAotICB2b2lkIFB1cmdlQ2FjaGVzKCkgT1ZFUlJJREU7Ci0KICBwcml2YXRlOgogICBiYWNrZW5kOjpHcmFwaGljc0NvbnRleHRFR0wqIGNvYmFsdF9jb250ZXh0XzsKICAgR3JDb250ZXh0KiBncl9jb250ZXh0XzsKICAgU3VibWl0T2Zmc2NyZWVuQ2FsbGJhY2sgc3VibWl0X29mZnNjcmVlbl9jYWxsYmFja187CisgIGNvbnN0IGJvb2wgcHVyZ2Vfc2tpYV9mb250X2NhY2hlc19vbl9kZXN0cnVjdGlvbl87CiAKICAgVGV4dFNoYXBlciB0ZXh0X3NoYXBlcl87CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL2hhcmZidXp6X2ZvbnQuY2MgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9oYXJmYnV6el9mb250LmNjCmluZGV4IDA0MzRmZTIuLjA1Y2RlODMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL2hhcmZidXp6X2ZvbnQuY2MKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvaGFyZmJ1enpfZm9udC5jYwpAQCAtMTk1LDQyICsxOTUsMzIgQEAKICAgU2tTYWZlVW5yZWYoc2tpYV9mYWNlKTsKIH0KIAotLy8gV3JhcHBlciBjbGFzcyBmb3IgYSBIYXJmQnV6eiBmYWNlIGNyZWF0ZWQgZnJvbSBhIGdpdmVuIFNraWEgZmFjZS4KLWNsYXNzIEhhcmZCdXp6RmFjZSB7Ci0gcHVibGljOgotICBIYXJmQnV6ekZhY2UoKSA6IGZhY2VfKE5VTEwpIHt9Ci0KLSAgfkhhcmZCdXp6RmFjZSgpIHsKLSAgICBpZiAoZmFjZV8pIHsKLSAgICAgIGhiX2ZhY2VfZGVzdHJveShmYWNlXyk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBJbml0KFNrVHlwZWZhY2UqIHNraWFfZmFjZSkgewotICAgIGZhY2VfID0gaGJfZmFjZV9jcmVhdGVfZm9yX3RhYmxlcyhHZXRGb250VGFibGUsIHNraWFfZmFjZSwgVW5yZWZTa1R5cGVmYWNlKTsKLSAgICBEQ0hFQ0soZmFjZV8pOwotICB9Ci0KLSAgaGJfZmFjZV90KiBnZXQoKSB7IHJldHVybiBmYWNlXzsgfQotCi0gcHJpdmF0ZToKLSAgaGJfZmFjZV90KiBmYWNlXzsKLX07Ci0KIH0gIC8vIG5hbWVzcGFjZQogCi0vLyBDcmVhdGVzIGEgSGFyZkJ1enogZm9udCBmcm9tIHRoZSBnaXZlbiBTa2lhIGZvbnQuCi1oYl9mb250X3QqIENyZWF0ZUhhcmZCdXp6Rm9udChGb250KiBza2lhX2ZvbnQpIHsKLSAgc3RhdGljIHN0ZDo6bWFwPFNrRm9udElELCBIYXJmQnV6ekZhY2U+IGZhY2VfY2FjaGVzOworSGFyZkJ1enpGb250UHJvdmlkZXI6OkhhcmZCdXp6RmFjZTo6SGFyZkJ1enpGYWNlKCkgOiBmYWNlXyhOVUxMKSB7fQogCitIYXJmQnV6ekZvbnRQcm92aWRlcjo6SGFyZkJ1enpGYWNlOjp+SGFyZkJ1enpGYWNlKCkgeworICBpZiAoZmFjZV8pIHsKKyAgICBoYl9mYWNlX2Rlc3Ryb3koZmFjZV8pOworICB9Cit9CisKK3ZvaWQgSGFyZkJ1enpGb250UHJvdmlkZXI6OkhhcmZCdXp6RmFjZTo6SW5pdChTa1R5cGVmYWNlKiBza2lhX2ZhY2UpIHsKKyAgZmFjZV8gPSBoYl9mYWNlX2NyZWF0ZV9mb3JfdGFibGVzKEdldEZvbnRUYWJsZSwgc2tpYV9mYWNlLCBVbnJlZlNrVHlwZWZhY2UpOworICBEQ0hFQ0soZmFjZV8pOworfQorCitoYl9mYWNlX3QqIEhhcmZCdXp6Rm9udFByb3ZpZGVyOjpIYXJmQnV6ekZhY2U6OmdldCgpIHsgcmV0dXJuIGZhY2VfOyB9CisKK2hiX2ZvbnRfdCogSGFyZkJ1enpGb250UHJvdmlkZXI6OkdldEhhcmZCdXp6Rm9udChGb250KiBza2lhX2ZvbnQpIHsKICAgLy8gUmV0cmlldmUgdGhlIHR5cGVmYWNlIGZyb20gdGhlIGNhY2hlLiBJbiB0aGUgY2FzZSB3aGVyZSBpdCBkb2VzIG5vdCBhbHJlYWR5CiAgIC8vIGV4aXN0LCBpdCB3aWxsIGJlIE5VTEwgYW5kIHdlIG11c3QgY3JlYXRlIGl0LgotICBIYXJmQnV6ekZhY2UmIGZhY2VfY2FjaGUgPSBmYWNlX2NhY2hlc1tza2lhX2ZvbnQtPkdldFR5cGVmYWNlSWQoKV07Ci0gIGlmIChmYWNlX2NhY2hlLmdldCgpID09IE5VTEwpIHsKLSAgICBmYWNlX2NhY2hlLkluaXQoc2tpYV9mb250LT5HZXRTa1R5cGVmYWNlKCkpOworICBIYXJmQnV6ekZhY2UmIGZhY2UgPSBmYWNlX2NhY2hlX1tza2lhX2ZvbnQtPkdldFR5cGVmYWNlSWQoKV07CisgIGlmIChmYWNlLmdldCgpID09IE5VTEwpIHsKKyAgICBmYWNlLkluaXQoc2tpYV9mb250LT5HZXRTa1R5cGVmYWNlKCkpOwogICB9CiAKLSAgaGJfZm9udF90KiBoYXJmYnV6el9mb250ID0gaGJfZm9udF9jcmVhdGUoZmFjZV9jYWNoZS5nZXQoKSk7CisgIGhiX2ZvbnRfdCogaGFyZmJ1enpfZm9udCA9IGhiX2ZvbnRfY3JlYXRlKGZhY2UuZ2V0KCkpOwogICBjb25zdCBpbnQgc2NhbGUgPSBTa1NjYWxhclRvRml4ZWQoc2tpYV9mb250LT5zaXplKCkpOwogICBoYl9mb250X3NldF9zY2FsZShoYXJmYnV6el9mb250LCBzY2FsZSwgc2NhbGUpOwogICBoYl9mb250X3NldF9mdW5jcyhoYXJmYnV6el9mb250LCBnX2ZvbnRfZnVuY3MuR2V0KCkuZ2V0KCksIHNraWFfZm9udCwgTlVMTCk7CkBAIC0yMzgsNiArMjI4LDggQEAKICAgcmV0dXJuIGhhcmZidXp6X2ZvbnQ7CiB9CiAKK3ZvaWQgSGFyZkJ1enpGb250UHJvdmlkZXI6OlB1cmdlQ2FjaGVzKCkgeyBmYWNlX2NhY2hlXy5jbGVhcigpOyB9CisKIH0gIC8vIG5hbWVzcGFjZSBza2lhCiB9ICAvLyBuYW1lc3BhY2UgcmFzdGVyaXplcgogfSAgLy8gbmFtZXNwYWNlIHJlbmRlcmVyCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9oYXJmYnV6el9mb250LmggYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9oYXJmYnV6el9mb250LmgKaW5kZXggMTZiMDdlNC4uNjA3YzMwMiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvaGFyZmJ1enpfZm9udC5oCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL2hhcmZidXp6X2ZvbnQuaApAQCAtMTUsMjAgKzE1LDQwIEBACiAjaWZuZGVmIENPQkFMVF9SRU5ERVJFUl9SQVNURVJJWkVSX1NLSUFfSEFSRkJVWlpfRk9OVF9IXwogI2RlZmluZSBDT0JBTFRfUkVOREVSRVJfUkFTVEVSSVpFUl9TS0lBX0hBUkZCVVpaX0ZPTlRfSF8KIAorI2luY2x1ZGUgPG1hcD4KKwogI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvZm9udC5oIgogCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvaGFyZmJ1enotbmcvc3JjL2hiLmgiCiAKLWNsYXNzIFNrVHlwZWZhY2U7Ci0KIG5hbWVzcGFjZSBjb2JhbHQgewogbmFtZXNwYWNlIHJlbmRlcmVyIHsKIG5hbWVzcGFjZSByYXN0ZXJpemVyIHsKIG5hbWVzcGFjZSBza2lhIHsKIAotY2xhc3MgRm9udDsKK2NsYXNzIEhhcmZCdXp6Rm9udFByb3ZpZGVyIHsKKyBwdWJsaWM6CisgIC8vIFJldHVybnMgdGhlIEhhcmZCdXp6IGZvbnQgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZ2l2ZW4gU2tpYSBmb250LgorICBoYl9mb250X3QqIEdldEhhcmZCdXp6Rm9udChGb250KiBza2lhX2ZvbnQpOworICB2b2lkIFB1cmdlQ2FjaGVzKCk7CiAKLWhiX2ZvbnRfdCogQ3JlYXRlSGFyZkJ1enpGb250KEZvbnQqIHNraWFfZm9udCk7CisgcHJpdmF0ZToKKyAgLy8gV3JhcHBlciBjbGFzcyBmb3IgYSBIYXJmQnV6eiBmYWNlIGNyZWF0ZWQgZnJvbSBhIGdpdmVuIFNraWEgZmFjZS4KKyAgY2xhc3MgSGFyZkJ1enpGYWNlIHsKKyAgIHB1YmxpYzoKKyAgICBIYXJmQnV6ekZhY2UoKTsKKyAgICB+SGFyZkJ1enpGYWNlKCk7CisKKyAgICB2b2lkIEluaXQoU2tUeXBlZmFjZSogc2tpYV9mYWNlKTsKKworICAgIGhiX2ZhY2VfdCogZ2V0KCk7CisKKyAgIHByaXZhdGU6CisgICAgaGJfZmFjZV90KiBmYWNlXzsKKyAgfTsKKworICBzdGQ6Om1hcDxTa0ZvbnRJRCwgSGFyZkJ1enpGYWNlPiBmYWNlX2NhY2hlXzsKK307CiAKIH0gIC8vIG5hbWVzcGFjZSBza2lhCiB9ICAvLyBuYW1lc3BhY2UgcmFzdGVyaXplcgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvc2tpYS9zcmMvcG9ydHMvU2tGb250TWdyX2NvYmFsdC5jYyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3NraWEvc3JjL3BvcnRzL1NrRm9udE1ncl9jb2JhbHQuY2MKaW5kZXggMzZkNGI2Zi4uZDI2ZDMxZSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvc2tpYS9zcmMvcG9ydHMvU2tGb250TWdyX2NvYmFsdC5jYworKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9za2lhL3NyYy9wb3J0cy9Ta0ZvbnRNZ3JfY29iYWx0LmNjCkBAIC02Myw2ICs2MywxMyBAQAogdm9pZCBTa0ZvbnRNZ3JfQ29iYWx0OjpQdXJnZUNhY2hlcygpIHsKICAgU2tHcmFwaGljczo6UHVyZ2VGb250Q2FjaGUoKTsKICAgbG9jYWxfdHlwZWZhY2Vfc3RyZWFtX21hbmFnZXJfLlB1cmdlVW51c2VkTWVtb3J5Q2h1bmtzKCk7CisKKyAgLy8gTG9jayB0aGUgZmFtaWx5IG11dGV4IHByaW9yIHRvIHB1cmdpbmcgZWFjaCBmYW1pbHkncyB1bnJlZmVyZW5jZWQKKyAgLy8gdHlwZWZhY2VzLgorICBTa0F1dG9NdXRleEFjcXVpcmUgc2NvcGVkX211dGV4KGZhbWlseV9tdXRleF8pOworICBmb3IgKGludCBpID0gMDsgaSA8IGZhbWlsaWVzXy5jb3VudCgpOyArK2kpIHsKKyAgICBmYW1pbGllc19baV0tPlB1cmdlVW5yZWZlcmVuY2VkVHlwZWZhY2VzKCk7CisgIH0KIH0KIAogU2tUeXBlZmFjZSogU2tGb250TWdyX0NvYmFsdDo6TWF0Y2hGYWNlTmFtZShjb25zdCBjaGFyIGZhY2VfbmFtZVtdKSB7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9za2lhL3NyYy9wb3J0cy9Ta0ZvbnRTdHlsZVNldF9jb2JhbHQuY2MgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9za2lhL3NyYy9wb3J0cy9Ta0ZvbnRTdHlsZVNldF9jb2JhbHQuY2MKaW5kZXggMmI1NzE4Yi4uNjE5NmNjNiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvc2tpYS9zcmMvcG9ydHMvU2tGb250U3R5bGVTZXRfY29iYWx0LmNjCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3NraWEvc3JjL3BvcnRzL1NrRm9udFN0eWxlU2V0X2NvYmFsdC5jYwpAQCAtNDE1LDggKzQxNSw4IEBACiAKICAgU2tBdXRvVFVucmVmPFNrRmlsZU1lbW9yeUNodW5rU3RyZWFtPiBzdHJlYW0oc3RyZWFtX3Byb3ZpZGVyLT5PcGVuU3RyZWFtKCkpOwogICBpZiAoR2VuZXJhdGVTdHlsZUZhY2VJbmZvKHN0eWxlX2VudHJ5LCBzdHJlYW0pKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiU2Nhbm5lZCBmb250IGZyb20gZmlsZTogIiA8PCBzdHlsZV9lbnRyeS0+ZmFjZV9uYW1lLmNfc3RyKCkKLSAgICAgICAgICAgICAgIDw8ICIoIiA8PCBzdHlsZV9lbnRyeS0+ZmFjZV9zdHlsZSA8PCAiKSI7CisgICAgTE9HKElORk8pIDw8ICJTY2FubmVkIGZvbnQgZnJvbSBmaWxlOiAiIDw8IHN0eWxlX2VudHJ5LT5mYWNlX25hbWUuY19zdHIoKQorICAgICAgICAgICAgICA8PCAiKCIgPDwgc3R5bGVfZW50cnktPmZhY2Vfc3R5bGUgPDwgIikiOwogICAgIHN0eWxlX2VudHJ5LT50eXBlZmFjZS5yZXNldCgKICAgICAgICAgU2tORVdfQVJHUyhTa1R5cGVmYWNlX0NvYmFsdFN0cmVhbVByb3ZpZGVyLAogICAgICAgICAgICAgICAgICAgIChzdHJlYW1fcHJvdmlkZXIsIHN0eWxlX2VudHJ5LT5mYWNlX2luZGV4LApAQCAtNDI3LDMgKzQyNywxNCBAQAogICAgICAgICAgICAgICAgPDwgc3R5bGVfZW50cnktPmZvbnRfZmlsZV9wYXRoLmNfc3RyKCk7CiAgIH0KIH0KKwordm9pZCBTa0ZvbnRTdHlsZVNldF9Db2JhbHQ6OlB1cmdlVW5yZWZlcmVuY2VkVHlwZWZhY2VzKCkgeworICAvLyBXYWxrIGVhY2ggb2YgdGhlIHN0eWxlcyBsb29raW5nIGZvciBhbnkgdGhhdCBoYXZlIGEgbm9uLU5VTEwgdHlwZWZhY2UuCisgIC8vIFRoZXNlIGFyZSBwdXJnZWQgaWYgdGhleSBhcmUgdW5yZWZlcmVuY2VkIG91dHNpZGUgb2YgdGhlIHN0eWxlIHNldC4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHlsZXNfLmNvdW50KCk7ICsraSkgeworICAgIFNrQXV0b1RVbnJlZjxTa1R5cGVmYWNlPiYgdHlwZWZhY2UgPSBzdHlsZXNfW2ldLT50eXBlZmFjZTsKKyAgICBpZiAodHlwZWZhY2UuZ2V0KCkgIT0gTlVMTCAmJiB0eXBlZmFjZS0+Z2V0UmVmQ250KCkgPT0gMSkgeworICAgICAgdHlwZWZhY2UucmVzZXQoTlVMTCk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9za2lhL3NyYy9wb3J0cy9Ta0ZvbnRTdHlsZVNldF9jb2JhbHQuaCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3NraWEvc3JjL3BvcnRzL1NrRm9udFN0eWxlU2V0X2NvYmFsdC5oCmluZGV4IDdkNjY0OGEuLjIxODBkMWEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3NraWEvc3JjL3BvcnRzL1NrRm9udFN0eWxlU2V0X2NvYmFsdC5oCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3NraWEvc3JjL3BvcnRzL1NrRm9udFN0eWxlU2V0X2NvYmFsdC5oCkBAIC0zNiw4ICszNiw3IEBACiAvLyBmb3Igc3BlY2lmaWMgY2hhcmFjdGVycyBkdXJpbmcgZmFsbGJhY2suCiAvLwogLy8gQm90aCB0aGUgY2hhcmFjdGVyIG1hcCBvZiB0aGUgc3R5bGUgc2V0IGFuZCB0aGUgdHlwZWZhY2Ugb2YgZWFjaCBpbmRpdmlkdWFsCi0vLyBlbnRyeSBhcmUgbGF6aWx5IGxvYWRlZCB0aGUgZmlyc3QgdGltZSB0aGF0IHRoZXkgYXJlIG5lZWRlZC4gQWZ0ZXIgdGhpcywgdGhleQotLy8gYXJlIHJldGFpbmVkIGluIG1lbW9yeS4KKy8vIGVudHJ5IGFyZSBsYXppbHkgbG9hZGVkIHRoZSBmaXJzdCB0aW1lIHRoYXQgdGhleSBhcmUgbmVlZGVkLgogY2xhc3MgU2tGb250U3R5bGVTZXRfQ29iYWx0IDogcHVibGljIFNrRm9udFN0eWxlU2V0IHsKICBwdWJsaWM6CiAgIHN0cnVjdCBTa0ZvbnRTdHlsZVNldEVudHJ5X0NvYmFsdCA6IHB1YmxpYyBTa1JlZkNudCB7CkBAIC0xMTgsNiArMTE3LDkgQEAKICAgICAgIFNrRm9udFN0eWxlU2V0RW50cnlfQ29iYWx0KiBzdHlsZSwKICAgICAgIFNrRmlsZU1lbW9yeUNodW5rU3RyZWFtUHJvdmlkZXIqIHN0cmVhbV9wcm92aWRlciA9IE5VTEwpOwogCisgIC8vIFB1cmdlIHR5cGVmYWNlcyB0aGF0IGFyZSBvbmx5IHJlZmVyZW5jZWQgaW50ZXJuYWxseS4KKyAgdm9pZCBQdXJnZVVucmVmZXJlbmNlZFR5cGVmYWNlcygpOworCiAgIC8vIE5PVEU6IFRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGNhbiBzYWZlbHkgYmUgYWNjZXNzZWQgb3V0c2lkZSBvZiB0aGUgbXV0ZXguCiAgIFNrRmlsZU1lbW9yeUNodW5rU3RyZWFtTWFuYWdlciogY29uc3QgbG9jYWxfdHlwZWZhY2Vfc3RyZWFtX21hbmFnZXJfOwogICBTa011dGV4KiBjb25zdCBtYW5hZ2VyX293bmVkX211dGV4XzsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3NvZnR3YXJlX3Jhc3Rlcml6ZXIuY2MgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9zb2Z0d2FyZV9yYXN0ZXJpemVyLmNjCmluZGV4IDBmMTk2OGEuLmJjYzVlMDQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3NvZnR3YXJlX3Jhc3Rlcml6ZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvc29mdHdhcmVfcmFzdGVyaXplci5jYwpAQCAtNjQsNyArNjQsOCBAQAogCiBjbGFzcyBTb2Z0d2FyZVJhc3Rlcml6ZXI6OkltcGwgewogIHB1YmxpYzoKLSAgZXhwbGljaXQgSW1wbChpbnQgc3VyZmFjZV9jYWNoZV9zaXplKTsKKyAgZXhwbGljaXQgSW1wbChpbnQgc3VyZmFjZV9jYWNoZV9zaXplLAorICAgICAgICAgICAgICAgIGJvb2wgcHVyZ2Vfc2tpYV9mb250X2NhY2hlc19vbl9kZXN0cnVjdGlvbik7CiAKICAgLy8gQ29uc3VtZSB0aGUgcmVuZGVyIHRyZWUgYW5kIG91dHB1dCB0aGUgcmVzdWx0cyB0byB0aGUgcmVuZGVyIHRhcmdldCBwYXNzZWQKICAgLy8gaW50byB0aGUgY29uc3RydWN0b3IuCkBAIC04MCw4ICs4MSwxMCBAQAogICBiYXNlOjpvcHRpb25hbDxjb21tb246OlN1cmZhY2VDYWNoZT4gc3VyZmFjZV9jYWNoZV87CiB9OwogCi1Tb2Z0d2FyZVJhc3Rlcml6ZXI6OkltcGw6OkltcGwoaW50IHN1cmZhY2VfY2FjaGVfc2l6ZSkKLSAgICA6IHJlc291cmNlX3Byb3ZpZGVyXyhuZXcgU29mdHdhcmVSZXNvdXJjZVByb3ZpZGVyKCkpIHsKK1NvZnR3YXJlUmFzdGVyaXplcjo6SW1wbDo6SW1wbChpbnQgc3VyZmFjZV9jYWNoZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcHVyZ2Vfc2tpYV9mb250X2NhY2hlc19vbl9kZXN0cnVjdGlvbikKKyAgICA6IHJlc291cmNlX3Byb3ZpZGVyXygKKyAgICAgICAgICBuZXcgU29mdHdhcmVSZXNvdXJjZVByb3ZpZGVyKHB1cmdlX3NraWFfZm9udF9jYWNoZXNfb25fZGVzdHJ1Y3Rpb24pKSB7CiAgIFRSQUNFX0VWRU5UMCgiY29iYWx0OjpyZW5kZXJlciIsICJTb2Z0d2FyZVJhc3Rlcml6ZXI6OlNvZnR3YXJlUmFzdGVyaXplcigpIik7CiAKICAgaWYgKHN1cmZhY2VfY2FjaGVfc2l6ZSA+IDApIHsKQEAgLTEzNSw4ICsxMzgsOSBAQAogICByZXR1cm4gcmVzb3VyY2VfcHJvdmlkZXJfLmdldCgpOwogfQogCi1Tb2Z0d2FyZVJhc3Rlcml6ZXI6OlNvZnR3YXJlUmFzdGVyaXplcihpbnQgc3VyZmFjZV9jYWNoZV9zaXplKQotICAgIDogaW1wbF8obmV3IEltcGwoc3VyZmFjZV9jYWNoZV9zaXplKSkge30KK1NvZnR3YXJlUmFzdGVyaXplcjo6U29mdHdhcmVSYXN0ZXJpemVyKGludCBzdXJmYWNlX2NhY2hlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHB1cmdlX2NhY2hlc19vbl9kZXN0cnVjdGlvbikKKyAgICA6IGltcGxfKG5ldyBJbXBsKHN1cmZhY2VfY2FjaGVfc2l6ZSwgcHVyZ2VfY2FjaGVzX29uX2Rlc3RydWN0aW9uKSkge30KIAogU29mdHdhcmVSYXN0ZXJpemVyOjp+U29mdHdhcmVSYXN0ZXJpemVyKCkge30KIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvc29mdHdhcmVfcmFzdGVyaXplci5oIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvc29mdHdhcmVfcmFzdGVyaXplci5oCmluZGV4IGMwYzJhN2EuLmY5MzVkZTQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3NvZnR3YXJlX3Jhc3Rlcml6ZXIuaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9zb2Z0d2FyZV9yYXN0ZXJpemVyLmgKQEAgLTM1LDcgKzM1LDggQEAKIC8vIGNsYXNzIGNhbiBzZW5kIHRoZSByZXN1bHRzIHRvIGEgZGlzcGxheSBvciByZW5kZXIgdGFyZ2V0LgogY2xhc3MgU29mdHdhcmVSYXN0ZXJpemVyIHsKICBwdWJsaWM6Ci0gIGV4cGxpY2l0IFNvZnR3YXJlUmFzdGVyaXplcihpbnQgc3VyZmFjZV9jYWNoZV9zaXplKTsKKyAgZXhwbGljaXQgU29mdHdhcmVSYXN0ZXJpemVyKGludCBzdXJmYWNlX2NhY2hlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHB1cmdlX3NraWFfZm9udF9jYWNoZXNfb25fZGVzdHJ1Y3Rpb24pOwogICB+U29mdHdhcmVSYXN0ZXJpemVyKCk7CiAKICAgLy8gQ29uc3VtZSB0aGUgcmVuZGVyIHRyZWUgYW5kIG91dHB1dCB0aGUgcmVzdWx0cyB0byB0aGUgcmVuZGVyIHRhcmdldCBwYXNzZWQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3NvZnR3YXJlX3Jlc291cmNlX3Byb3ZpZGVyLmNjIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvc29mdHdhcmVfcmVzb3VyY2VfcHJvdmlkZXIuY2MKaW5kZXggMzJkNzk1ZS4uMzBhNGNkOCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvc29mdHdhcmVfcmVzb3VyY2VfcHJvdmlkZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvc29mdHdhcmVfcmVzb3VyY2VfcHJvdmlkZXIuY2MKQEAgLTM3LDEyICszNywyNiBAQAogbmFtZXNwYWNlIHJhc3Rlcml6ZXIgewogbmFtZXNwYWNlIHNraWEgewogCi1Tb2Z0d2FyZVJlc291cmNlUHJvdmlkZXI6OlNvZnR3YXJlUmVzb3VyY2VQcm92aWRlcigpIHsKK1NvZnR3YXJlUmVzb3VyY2VQcm92aWRlcjo6U29mdHdhcmVSZXNvdXJjZVByb3ZpZGVyKAorICAgIGJvb2wgcHVyZ2Vfc2tpYV9mb250X2NhY2hlc19vbl9kZXN0cnVjdGlvbikKKyAgICA6IHB1cmdlX3NraWFfZm9udF9jYWNoZXNfb25fZGVzdHJ1Y3Rpb25fKAorICAgICAgICAgIHB1cmdlX3NraWFfZm9udF9jYWNoZXNfb25fZGVzdHJ1Y3Rpb24pIHsKICAgLy8gSW5pdGlhbGl6ZSB0aGUgZm9udCBtYW5hZ2VyIG5vdyB0byBlbnN1cmUgdGhhdCBpdCBkb2Vzbid0IGdldCBpbml0aWFsaXplZAogICAvLyBvbiBtdWx0aXBsZSB0aHJlYWRzIHNpbXVsdGFuZW91c2x5IGxhdGVyLgogICBTa1NhZmVVbnJlZihTa0ZvbnRNZ3I6OlJlZkRlZmF1bHQoKSk7CiB9CiAKK1NvZnR3YXJlUmVzb3VyY2VQcm92aWRlcjo6flNvZnR3YXJlUmVzb3VyY2VQcm92aWRlcigpIHsKKyAgaWYgKHB1cmdlX3NraWFfZm9udF9jYWNoZXNfb25fZGVzdHJ1Y3Rpb25fKSB7CisgICAgdGV4dF9zaGFwZXJfLlB1cmdlQ2FjaGVzKCk7CisKKyAgICBTa0F1dG9UVW5yZWY8U2tGb250TWdyPiBmb250X21hbmFnZXIoU2tGb250TWdyOjpSZWZEZWZhdWx0KCkpOworICAgIFNrRm9udE1ncl9Db2JhbHQqIGNvYmFsdF9mb250X21hbmFnZXIgPQorICAgICAgICBiYXNlOjpwb2x5bW9ycGhpY19kb3duY2FzdDxTa0ZvbnRNZ3JfQ29iYWx0Kj4oZm9udF9tYW5hZ2VyLmdldCgpKTsKKyAgICBjb2JhbHRfZm9udF9tYW5hZ2VyLT5QdXJnZUNhY2hlcygpOworICB9Cit9CisKIGJvb2wgU29mdHdhcmVSZXNvdXJjZVByb3ZpZGVyOjpQaXhlbEZvcm1hdFN1cHBvcnRlZCgKICAgICByZW5kZXJfdHJlZTo6UGl4ZWxGb3JtYXQgcGl4ZWxfZm9ybWF0KSB7CiAgIHJldHVybiBSZW5kZXJUcmVlU3VyZmFjZUZvcm1hdFRvU2tpYShwaXhlbF9mb3JtYXQpID09IGtOMzJfU2tDb2xvclR5cGU7CkBAIC0yMzMsMTMgKzI0Nyw2IEBACiAgIHJldHVybiBzY29wZWRfcmVmcHRyPHJlbmRlcl90cmVlOjpJbWFnZT4oTlVMTCk7CiB9CiAKLXZvaWQgU29mdHdhcmVSZXNvdXJjZVByb3ZpZGVyOjpQdXJnZUNhY2hlcygpIHsKLSAgU2tBdXRvVFVucmVmPFNrRm9udE1ncj4gZm9udF9tYW5hZ2VyKFNrRm9udE1ncjo6UmVmRGVmYXVsdCgpKTsKLSAgU2tGb250TWdyX0NvYmFsdCogY29iYWx0X2ZvbnRfbWFuYWdlciA9Ci0gICAgICBiYXNlOjpwb2x5bW9ycGhpY19kb3duY2FzdDxTa0ZvbnRNZ3JfQ29iYWx0Kj4oZm9udF9tYW5hZ2VyLmdldCgpKTsKLSAgY29iYWx0X2ZvbnRfbWFuYWdlci0+UHVyZ2VDYWNoZXMoKTsKLX0KLQogfSAgLy8gbmFtZXNwYWNlIHNraWEKIH0gIC8vIG5hbWVzcGFjZSByYXN0ZXJpemVyCiB9ICAvLyBuYW1lc3BhY2UgcmVuZGVyZXIKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3NvZnR3YXJlX3Jlc291cmNlX3Byb3ZpZGVyLmggYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9zb2Z0d2FyZV9yZXNvdXJjZV9wcm92aWRlci5oCmluZGV4IDFmMGQxZjQuLjY3ZThlMmQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3NvZnR3YXJlX3Jlc291cmNlX3Byb3ZpZGVyLmgKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvc29mdHdhcmVfcmVzb3VyY2VfcHJvdmlkZXIuaApAQCAtMzEsNyArMzEsOCBAQAogLy8gYXJlIHRvIGJlIGNvbnN1bWVkIGJ5IHRoaXMgc2tpYSBzb2Z0d2FyZSByYXN0ZXJpemVyLgogY2xhc3MgU29mdHdhcmVSZXNvdXJjZVByb3ZpZGVyIDogcHVibGljIHJlbmRlcl90cmVlOjpSZXNvdXJjZVByb3ZpZGVyIHsKICBwdWJsaWM6Ci0gIFNvZnR3YXJlUmVzb3VyY2VQcm92aWRlcigpOworICBleHBsaWNpdCBTb2Z0d2FyZVJlc291cmNlUHJvdmlkZXIoYm9vbCBwdXJnZV9za2lhX2ZvbnRfY2FjaGVzX29uX2Rlc3RydWN0aW9uKTsKKyAgflNvZnR3YXJlUmVzb3VyY2VQcm92aWRlcigpIE9WRVJSSURFOwogCiAgIHZvaWQgRmluaXNoKCkgT1ZFUlJJREV7fTsKIApAQCAtMTIxLDkgKzEyMiw5IEBACiAgIHNjb3BlZF9yZWZwdHI8cmVuZGVyX3RyZWU6OkltYWdlPiBEcmF3T2Zmc2NyZWVuSW1hZ2UoCiAgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPHJlbmRlcl90cmVlOjpOb2RlPiYgcm9vdCkgT1ZFUlJJREU7CiAKLSAgdm9pZCBQdXJnZUNhY2hlcygpIE9WRVJSSURFOwotCiAgcHJpdmF0ZToKKyAgY29uc3QgYm9vbCBwdXJnZV9za2lhX2ZvbnRfY2FjaGVzX29uX2Rlc3RydWN0aW9uXzsKKwogICBUZXh0U2hhcGVyIHRleHRfc2hhcGVyXzsKIH07CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3RleHRfc2hhcGVyLmNjIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvdGV4dF9zaGFwZXIuY2MKaW5kZXggNWQ4ZWUwZi4uZTMwN2M4ZSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvdGV4dF9zaGFwZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvdGV4dF9zaGFwZXIuY2MKQEAgLTExOSw2ICsxMTksMTEgQEAKICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBtYXliZV91c2VkX2ZvbnRzKTsKIH0KIAordm9pZCBUZXh0U2hhcGVyOjpQdXJnZUNhY2hlcygpIHsKKyAgYmFzZTo6QXV0b0xvY2sgbG9jayhzaGFwaW5nX211dGV4Xyk7CisgIGhhcmZidXp6X2ZvbnRfcHJvdmlkZXJfLlB1cmdlQ2FjaGVzKCk7Cit9CisKIGZsb2F0IFRleHRTaGFwZXI6OlNoYXBlVGV4dChjb25zdCBjaGFyMTYqIHRleHRfYnVmZmVyLCBzaXplX3QgdGV4dF9sZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGxhbmd1YWdlLCBib29sIGlzX3J0bCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJfdHJlZTo6Rm9udFByb3ZpZGVyKiBmb250X3Byb3ZpZGVyLApAQCAtMjg1LDcgKzI5MCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogdG90YWxfd2lkdGgpIHsKICAgVHJ5QWRkRm9udFRvVXNlZEZvbnRzKHNjcmlwdF9ydW4uZm9udCwgbWF5YmVfdXNlZF9mb250cyk7CiAKLSAgaGJfZm9udF90KiBoYXJmYnV6el9mb250ID0gQ3JlYXRlSGFyZkJ1enpGb250KHNjcmlwdF9ydW4uZm9udCk7CisgIGhiX2ZvbnRfdCogaGFyZmJ1enpfZm9udCA9CisgICAgICBoYXJmYnV6el9mb250X3Byb3ZpZGVyXy5HZXRIYXJmQnV6ekZvbnQoc2NyaXB0X3J1bi5mb250KTsKIAogICAvLyBFbnN1cmUgdGhhdCB0aGUgbG9jYWwgdGV4dCBidWZmZXIgaXMgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgdGhlIG5vcm1hbGl6ZWQKICAgLy8gc3RyaW5nLgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvdGV4dF9zaGFwZXIuaCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3RleHRfc2hhcGVyLmgKaW5kZXggOTgyZTFkMy4uZTExMWNlNiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvdGV4dF9zaGFwZXIuaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS90ZXh0X3NoYXBlci5oCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSAiY29iYWx0L3JlbmRlcl90cmVlL2ZvbnRfcHJvdmlkZXIuaCIKICNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL2ZvbnQuaCIKICNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL2dseXBoX2J1ZmZlci5oIgorI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvaGFyZmJ1enpfZm9udC5oIgogCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvaGFyZmJ1enotbmcvc3JjL2hiLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvaGFyZmJ1enotbmcvc3JjL2hiLWljdS5oIgpAQCAtOTAsNiArOTEsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcl90cmVlOjpGb250UHJvdmlkZXIqIGZvbnRfcHJvdmlkZXIsCiAgICAgICAgICAgICAgICAgICAgICByZW5kZXJfdHJlZTo6Rm9udFZlY3RvciogbWF5YmVfdXNlZF9mb250cyk7CiAKKyAgLy8gUHVyZ2VzIGFueSBjYWNoZXMgYmVpbmcgdXNlZCBieSB0aGUgdGV4dCBzaGFwZXI7IGN1cnJlbnRseSwgdGhpcyBjb25zaXN0cworICAvLyBvZiB0aGUgSGFyZkJ1enpGb250UHJvdmlkZXIncyBjYWNoZS4KKyAgdm9pZCBQdXJnZUNhY2hlcygpOworCiAgcHJpdmF0ZToKICAgLy8gSW50ZXJuYWwgY2xhc3MgdXNlZCBmb3IgdHJhY2tpbmcgdGhlIHZlcnRpY2FsIGJvdW5kcyBvZiBhIHRleHQgYnVmZmVyCiAgIC8vIGR1cmluZyBzaGFwaW5nIHdoZW4gYm91bmRzIGFyZSByZXF1ZXN0ZWQgKGkuZS4gdGhlIHBhc3NlZCBpbiB8bWF5YmVfYm91bmRzfApAQCAtMTU1LDggKzE2MCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcl90cmVlOjpGb250VmVjdG9yKiBtYXliZV91c2VkX2ZvbnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogY3VycmVudF93aWR0aCk7CiAKLSAgLy8gU2hhcGUgYSBzaW1wbGUgdGV4dCBydW4sIHJlbHlpbmcgb24gdGhlIHNraWE6OkZvbnQgb2JqZWN0cyBwcm92aWRlZCBieQotICAvLyB0aGUgRm9udFByb3ZpZGVyIHRvIGRldGVybWluZSB0aGUgc2hhcGluZyBkYXRhLgorICAvLyBTaGFwZSBhIHNpbXBsZSB0ZXh0IHJ1biwgcmVseWluZyBvbiB0aGUgc2tpYTo6Rm9udCBvYmplY3RzIHByb3ZpZGVkIGJ5IHRoZQorICAvLyBGb250UHJvdmlkZXIgdG8gZGV0ZXJtaW5lIHRoZSBzaGFwaW5nIGRhdGEuCiAgIHZvaWQgU2hhcGVTaW1wbGVSdW4oY29uc3QgY2hhcjE2KiB0ZXh0X2J1ZmZlciwgc2l6ZV90IHRleHRfbGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcl90cmVlOjpGb250UHJvdmlkZXIqIGZvbnRfcHJvdmlkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgU2tUZXh0QmxvYkJ1aWxkZXIqIG1heWJlX2J1aWxkZXIsCkBAIC0xODEsNiArMTg2LDkgQEAKICAgLy8gdGhlIHNhbWUgdGltZS4KICAgYmFzZTo6TG9jayBzaGFwaW5nX211dGV4XzsKIAorICAvLyBQcm92aWRlcyBmb250cyBuZWVkZWQgYnkgSGFyZkJ1enogZHVyaW5nIGNvbXBsZXggc2hhcGluZy4KKyAgSGFyZkJ1enpGb250UHJvdmlkZXIgaGFyZmJ1enpfZm9udF9wcm92aWRlcl87CisKICAgLy8gVGhlIGFsbG9jYXRlZCBnbHlwaCBhbmQgcG9zaXRpb25zIGRhdGEuIFRoaXMgaXMgcmV0YWluZWQgaW4gYmV0d2VlbiBzaGFwaW5nCiAgIC8vIGNhbGxzIHRvIHByZXZlbnQgY29uc3RhbnRseSBuZWVkaW5nIHRvIGFsbG9jYXRlIHRoZSBhcnJheXMuIEluIHRoZSBjYXNlCiAgIC8vIHdoZXJlIGEgbGFyZ2VyIGFycmF5IGlzIG5lZWRlZCB0aGFuIHRoZSBjdXJyZW50IHNpemUsIGxhcmdlciBhcnJheXMgYXJlCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3JlbmRlcl90cmVlX3BpeGVsX3Rlc3Rlci5jYyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmVuZGVyX3RyZWVfcGl4ZWxfdGVzdGVyLmNjCmluZGV4IGViOTI2NTYuLmE0MjhhMTcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmVuZGVyX3RyZWVfcGl4ZWxfdGVzdGVyLmNjCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmVuZGVyX3RyZWVfcGl4ZWxfdGVzdGVyLmNjCkBAIC02OSw2ICs2OSwxMSBAQAogCiAgIC8vIENyZWF0ZSB0aGUgcmFzdGVyaXplciB1c2luZyB0aGUgcGxhdGZvcm0gZGVmYXVsdCBSZW5kZXJNb2R1bGUgb3B0aW9ucy4KICAgUmVuZGVyZXJNb2R1bGU6Ok9wdGlvbnMgcmVuZGVyX21vZHVsZV9vcHRpb25zOworCisgIC8vIERvbid0IHB1cmdlIHRoZSBTa2lhIGZvbnQgY2FjaGVzIG9uIGRlc3RydWN0aW9uLiBEb2luZyBzbyB3aWxsIHJlc3VsdCBpbgorICAvLyB0b28gbXVjaCBmb250IHRocmFzaGluZyBkdXJpbmcgdGhlIHRlc3RzLgorICByZW5kZXJfbW9kdWxlX29wdGlvbnMucHVyZ2Vfc2tpYV9mb250X2NhY2hlc19vbl9kZXN0cnVjdGlvbiA9IGZhbHNlOworCiAgIHJhc3Rlcml6ZXJfID0gcmVuZGVyX21vZHVsZV9vcHRpb25zLmNyZWF0ZV9yYXN0ZXJpemVyX2Z1bmN0aW9uLlJ1bigKICAgICAgIGdyYXBoaWNzX2NvbnRleHRfLmdldCgpLCByZW5kZXJfbW9kdWxlX29wdGlvbnMpOwogfQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yZW5kZXJlcl9tb2R1bGUuY2MgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3JlbmRlcmVyX21vZHVsZS5jYwppbmRleCAyOGNiZTkzLi4wODQzOTBlIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3JlbmRlcmVyX21vZHVsZS5jYworKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3JlbmRlcmVyX21vZHVsZS5jYwpAQCAtMjQsNyArMjQsOCBAQAogbmFtZXNwYWNlIHJlbmRlcmVyIHsKIAogUmVuZGVyZXJNb2R1bGU6Ok9wdGlvbnM6Ok9wdGlvbnMoKQotICAgIDogc2tpYV9nbHlwaF90ZXh0dXJlX2F0bGFzX2RpbWVuc2lvbnMoMjA0OCwgMjA0OCkgeworICAgIDogc2tpYV9nbHlwaF90ZXh0dXJlX2F0bGFzX2RpbWVuc2lvbnMoMjA0OCwgMjA0OCksCisgICAgICBwdXJnZV9za2lhX2ZvbnRfY2FjaGVzX29uX2Rlc3RydWN0aW9uKHRydWUpIHsKICAgLy8gQ2FsbCBpbnRvIHBsYXRmb3JtLXNwZWNpZmljIGNvZGUgZm9yIHNldHRpbmcgdXAgcmVuZGVyIG1vZHVsZSBvcHRpb25zLgogICBTZXRQZXJQbGF0Zm9ybURlZmF1bHRPcHRpb25zKCk7CiB9CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3JlbmRlcmVyX21vZHVsZS5oIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yZW5kZXJlcl9tb2R1bGUuaAppbmRleCAwZTkyYzgyLi43MGQwMzY0IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3JlbmRlcmVyX21vZHVsZS5oCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmVuZGVyZXJfbW9kdWxlLmgKQEAgLTc3LDYgKzc3LDEyIEBACiAgICAgLy8gYnVmZmVyIHdpbGwgbm90IGJlIGZyZXF1ZW50bHkgc3dhcHBlZC4KICAgICBib29sIHN1Ym1pdF9ldmVuX2lmX3JlbmRlcl90cmVlX2lzX3VuY2hhbmdlZDsKIAorICAgIC8vIElmIHRoaXMgZmxhZyBpcyBzZXQgdG8gdHJ1ZSwgd2hpY2ggaXMgdGhlIGRlZmF1bHQgdmFsdWUsIHRoZW4gYWxsIG9mCisgICAgLy8gU2tpYSdzIGZvbnQgY2FjaGVzIGFyZSBwdXJnZWQgZHVyaW5nIGRlc3RydWN0aW9uLiBUaGVzZSBjYWNoZXMgaGF2ZQorICAgIC8vIGxpZmVzcGFucyB0aGF0IGFyZSB1bmNvdXBsZWQgZnJvbSB0aGUgcmVzb3VyY2UgcHJvdmlkZXIncywgYW5kIHdpbGwgbm90CisgICAgLy8gYmUgcHVyZ2VkIG9uIGRlc3RydWN0aW9uIHdoZW4gdGhpcyBpcyBzZXQgdG8gZmFsc2UuCisgICAgYm9vbCBwdXJnZV9za2lhX2ZvbnRfY2FjaGVzX29uX2Rlc3RydWN0aW9uOworCiAgICAgLy8gT24gbW9kZXMgd2l0aCBhIDNEIGNhbWVyYSBjb250cm9sbGFibGUgYnkgdXNlciBpbnB1dCwgZmV0Y2ggdGhlIGFmZmluZQogICAgIC8vIHRyYW5zZm9ybXMgbmVlZGVkIHRvIHJlbmRlciB0aGUgc2NlbmUgZnJvbSB0aGUgY2FtZXJhJ3Mgdmlldy4KICAgICBHZXRDYW1lcmFUcmFuc2Zvcm1DYWxsYmFjayBnZXRfY2FtZXJhX3RyYW5zZm9ybTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmVuZGVyZXJfbW9kdWxlX2RlZmF1bHRfb3B0aW9uc19zdGFyYm9hcmQuY2MgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3JlbmRlcmVyX21vZHVsZV9kZWZhdWx0X29wdGlvbnNfc3RhcmJvYXJkLmNjCmluZGV4IGZjM2YzZTAuLjAyNTFmZWUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmVuZGVyZXJfbW9kdWxlX2RlZmF1bHRfb3B0aW9uc19zdGFyYm9hcmQuY2MKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yZW5kZXJlcl9tb2R1bGVfZGVmYXVsdF9vcHRpb25zX3N0YXJib2FyZC5jYwpAQCAtMzgsNyArMzgsOCBAQAogI2lmIENPQkFMVF9GT1JDRV9TT0ZUV0FSRV9SQVNURVJJWkVSCiAgIHJldHVybiBzY29wZWRfcHRyPHJhc3Rlcml6ZXI6OlJhc3Rlcml6ZXI+KAogICAgICAgbmV3IHJhc3Rlcml6ZXI6OmVnbDo6U29mdHdhcmVSYXN0ZXJpemVyKAotICAgICAgICAgIGdyYXBoaWNzX2NvbnRleHQsIG9wdGlvbnMuc3VyZmFjZV9jYWNoZV9zaXplX2luX2J5dGVzKSk7CisgICAgICAgICAgZ3JhcGhpY3NfY29udGV4dCwgb3B0aW9ucy5zdXJmYWNlX2NhY2hlX3NpemVfaW5fYnl0ZXMsCisgICAgICAgICAgb3B0aW9ucy5wdXJnZV9za2lhX2ZvbnRfY2FjaGVzX29uX2Rlc3RydWN0aW9uKSk7CiAjZWxpZiBkZWZpbmVkKENPQkFMVF9GT1JDRV9ESVJFQ1RfR0xFU19SQVNURVJJWkVSKQogICByZXR1cm4gc2NvcGVkX3B0cjxyYXN0ZXJpemVyOjpSYXN0ZXJpemVyPigKICAgICAgIG5ldyByYXN0ZXJpemVyOjplZ2w6OkhhcmR3YXJlUmFzdGVyaXplcigKQEAgLTQ2LDcgKzQ3LDggQEAKICAgICAgICAgICBvcHRpb25zLnNraWFfZ2x5cGhfdGV4dHVyZV9hdGxhc19kaW1lbnNpb25zLmhlaWdodCgpLAogICAgICAgICAgIG9wdGlvbnMuc2tpYV9jYWNoZV9zaXplX2luX2J5dGVzLAogICAgICAgICAgIG9wdGlvbnMuc2NyYXRjaF9zdXJmYWNlX2NhY2hlX3NpemVfaW5fYnl0ZXMsCi0gICAgICAgICAgb3B0aW9ucy5zdXJmYWNlX2NhY2hlX3NpemVfaW5fYnl0ZXMpKTsKKyAgICAgICAgICBvcHRpb25zLnN1cmZhY2VfY2FjaGVfc2l6ZV9pbl9ieXRlcywKKyAgICAgICAgICBvcHRpb25zLnB1cmdlX3NraWFfZm9udF9jYWNoZXNfb25fZGVzdHJ1Y3Rpb24pKTsKICNlbHNlCiAgIHJldHVybiBzY29wZWRfcHRyPHJhc3Rlcml6ZXI6OlJhc3Rlcml6ZXI+KAogICAgICAgbmV3IHJhc3Rlcml6ZXI6OnNraWE6OkhhcmR3YXJlUmFzdGVyaXplcigKQEAgLTU0LDEzICs1NiwxNSBAQAogICAgICAgICAgIG9wdGlvbnMuc2tpYV9nbHlwaF90ZXh0dXJlX2F0bGFzX2RpbWVuc2lvbnMuaGVpZ2h0KCksCiAgICAgICAgICAgb3B0aW9ucy5za2lhX2NhY2hlX3NpemVfaW5fYnl0ZXMsCiAgICAgICAgICAgb3B0aW9ucy5zY3JhdGNoX3N1cmZhY2VfY2FjaGVfc2l6ZV9pbl9ieXRlcywKLSAgICAgICAgICBvcHRpb25zLnN1cmZhY2VfY2FjaGVfc2l6ZV9pbl9ieXRlcykpOworICAgICAgICAgIG9wdGlvbnMuc3VyZmFjZV9jYWNoZV9zaXplX2luX2J5dGVzLAorICAgICAgICAgIG9wdGlvbnMucHVyZ2Vfc2tpYV9mb250X2NhY2hlc19vbl9kZXN0cnVjdGlvbikpOwogI2VuZGlmICAvLyBDT0JBTFRfRk9SQ0VfU09GVFdBUkVfUkFTVEVSSVpFUgogI2VsaWYgU0JfSEFTKEJMSVRURVIpCiAjaWYgQ09CQUxUX0ZPUkNFX1NPRlRXQVJFX1JBU1RFUklaRVIKICAgcmV0dXJuIHNjb3BlZF9wdHI8cmFzdGVyaXplcjo6UmFzdGVyaXplcj4oCiAgICAgICBuZXcgcmFzdGVyaXplcjo6YmxpdHRlcjo6U29mdHdhcmVSYXN0ZXJpemVyKAotICAgICAgICAgIGdyYXBoaWNzX2NvbnRleHQsIG9wdGlvbnMuc3VyZmFjZV9jYWNoZV9zaXplX2luX2J5dGVzKSk7CisgICAgICAgICAgZ3JhcGhpY3NfY29udGV4dCwgb3B0aW9ucy5zdXJmYWNlX2NhY2hlX3NpemVfaW5fYnl0ZXMsCisgICAgICAgICAgb3B0aW9ucy5wdXJnZV9za2lhX2ZvbnRfY2FjaGVzX29uX2Rlc3RydWN0aW9uKSk7CiAjZWxzZQogICByZXR1cm4gc2NvcGVkX3B0cjxyYXN0ZXJpemVyOjpSYXN0ZXJpemVyPigKICAgICAgIG5ldyByYXN0ZXJpemVyOjpibGl0dGVyOjpIYXJkd2FyZVJhc3Rlcml6ZXIoCkBAIC02OCw3ICs3Miw4IEBACiAgICAgICAgICAgb3B0aW9ucy5za2lhX2dseXBoX3RleHR1cmVfYXRsYXNfZGltZW5zaW9ucy5oZWlnaHQoKSwKICAgICAgICAgICBvcHRpb25zLnNjcmF0Y2hfc3VyZmFjZV9jYWNoZV9zaXplX2luX2J5dGVzLAogICAgICAgICAgIG9wdGlvbnMuc3VyZmFjZV9jYWNoZV9zaXplX2luX2J5dGVzLAotICAgICAgICAgIG9wdGlvbnMuc29mdHdhcmVfc3VyZmFjZV9jYWNoZV9zaXplX2luX2J5dGVzKSk7CisgICAgICAgICAgb3B0aW9ucy5zb2Z0d2FyZV9zdXJmYWNlX2NhY2hlX3NpemVfaW5fYnl0ZXMsCisgICAgICAgICAgb3B0aW9ucy5wdXJnZV9za2lhX2ZvbnRfY2FjaGVzX29uX2Rlc3RydWN0aW9uKSk7CiAjZW5kaWYgIC8vIENPQkFMVF9GT1JDRV9TT0ZUV0FSRV9SQVNURVJJWkVSCiAjZWxzZQogI2Vycm9yICJFaXRoZXIgR0xFUzIgb3IgdGhlIFN0YXJib2FyZCBCbGl0dGVyIEFQSSBtdXN0IGJlIGF2YWlsYWJsZS4iCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3JlbmRlcmVyX21vZHVsZV9kZWZhdWx0X29wdGlvbnNfd2luLmNjIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yZW5kZXJlcl9tb2R1bGVfZGVmYXVsdF9vcHRpb25zX3dpbi5jYwppbmRleCA1ODA5ZDJjLi4xNjNmZTJiIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3JlbmRlcmVyX21vZHVsZV9kZWZhdWx0X29wdGlvbnNfd2luLmNjCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmVuZGVyZXJfbW9kdWxlX2RlZmF1bHRfb3B0aW9uc193aW4uY2MKQEAgLTI3LDEzICsyNywxNSBAQAogI2lmIENPQkFMVF9GT1JDRV9TT0ZUV0FSRV9SQVNURVJJWkVSCiAgIHJldHVybiBzY29wZWRfcHRyPHJhc3Rlcml6ZXI6OlJhc3Rlcml6ZXI+KAogICAgICAgbmV3IHJhc3Rlcml6ZXI6OmVnbDo6U29mdHdhcmVSYXN0ZXJpemVyKAotICAgICAgICAgIGdyYXBoaWNzX2NvbnRleHQsIG9wdGlvbnMuc3VyZmFjZV9jYWNoZV9zaXplX2luX2J5dGVzKSk7CisgICAgICAgICAgZ3JhcGhpY3NfY29udGV4dCwgb3B0aW9ucy5zdXJmYWNlX2NhY2hlX3NpemVfaW5fYnl0ZXMsCisgICAgICAgICAgb3B0aW9ucy5wdXJnZV9za2lhX2ZvbnRfY2FjaGVzX29uX2Rlc3RydWN0aW9uKSk7CiAjZWxzZQogICByZXR1cm4gc2NvcGVkX3B0cjxyYXN0ZXJpemVyOjpSYXN0ZXJpemVyPigKICAgICAgIG5ldyByYXN0ZXJpemVyOjpza2lhOjpIYXJkd2FyZVJhc3Rlcml6ZXIoCiAgICAgICAgICAgZ3JhcGhpY3NfY29udGV4dCwgb3B0aW9ucy5za2lhX2NhY2hlX3NpemVfaW5fYnl0ZXMsCiAgICAgICAgICAgb3B0aW9ucy5zY3JhdGNoX3N1cmZhY2VfY2FjaGVfc2l6ZV9pbl9ieXRlcywKLSAgICAgICAgICBvcHRpb25zLnN1cmZhY2VfY2FjaGVfc2l6ZV9pbl9ieXRlcykpOworICAgICAgICAgIG9wdGlvbnMuc3VyZmFjZV9jYWNoZV9zaXplX2luX2J5dGVzLAorICAgICAgICAgIG9wdGlvbnMucHVyZ2Vfc2tpYV9mb250X2NhY2hlc19vbl9kZXN0cnVjdGlvbikpOwogI2VuZGlmICAvLyAjaWYgQ09CQUxUX0ZPUkNFX1NPRlRXQVJFX1JBU1RFUklaRVIKIH0KIH0gIC8vIG5hbWVzcGFjZQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvY29udmVyc2lvbl9oZWxwZXJzLmggYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jb252ZXJzaW9uX2hlbHBlcnMuaAppbmRleCA5NWE3NTJlLi5jOGU0YzkzIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jb252ZXJzaW9uX2hlbHBlcnMuaAorKysgYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jb252ZXJzaW9uX2hlbHBlcnMuaApAQCAtMTU0LDE5ICsxNTQsMTkgQEAKIC8vIGh0dHBzOi8vaGV5Y2FtLmdpdGh1Yi5pby93ZWJpZGwvI2Fic3RyYWN0LW9wZGVmLWNvbnZlcnR0b2ludAogdGVtcGxhdGUgPD4KIGlubGluZSBjb25zdCBkb3VibGUgVXBwZXJCb3VuZDxpbnQ2NF90PigpIHsKLSAgY29uc3QgZG91YmxlIGtJbnQ2NFVwcGVyQm91bmQgPSBzdGF0aWNfY2FzdDxkb3VibGU+KCgxdWxsIDw8IDUzKSAtIDEpOworICBjb25zdCBkb3VibGUga0ludDY0VXBwZXJCb3VuZCA9IHN0YXRpY19jYXN0PGRvdWJsZT4oKDFsbCA8PCA1MykgLSAxKTsKICAgcmV0dXJuIGtJbnQ2NFVwcGVyQm91bmQ7CiB9CiAKIHRlbXBsYXRlIDw+CiBpbmxpbmUgY29uc3QgZG91YmxlIExvd2VyQm91bmQ8aW50NjRfdD4oKSB7Ci0gIGNvbnN0IGRvdWJsZSBrSW50NjRMb3dlckJvdW5kID0gc3RhdGljX2Nhc3Q8ZG91YmxlPigtKDF1bGwgPDwgNTMpICsgMSk7CisgIGNvbnN0IGRvdWJsZSBrSW50NjRMb3dlckJvdW5kID0gc3RhdGljX2Nhc3Q8ZG91YmxlPigtKDFsbCA8PCA1MykgKyAxKTsKICAgcmV0dXJuIGtJbnQ2NExvd2VyQm91bmQ7CiB9CiAKIHRlbXBsYXRlIDw+CiBpbmxpbmUgY29uc3QgZG91YmxlIFVwcGVyQm91bmQ8dWludDY0X3Q+KCkgewotICBjb25zdCBkb3VibGUga1VJbnQ2NFVwcGVyQm91bmQgPSBzdGF0aWNfY2FzdDxkb3VibGU+KCgxdWxsIDw8IDUzKSAtIDEpOworICBjb25zdCBkb3VibGUga1VJbnQ2NFVwcGVyQm91bmQgPSBzdGF0aWNfY2FzdDxkb3VibGU+KCgxbGwgPDwgNTMpIC0gMSk7CiAgIHJldHVybiBrVUludDY0VXBwZXJCb3VuZDsKIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anMtNDUuZ3lwIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anMtNDUuZ3lwCmluZGV4IGQwZjQxNmMuLjY5NTliY2QgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzLTQ1Lmd5cAorKysgYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqcy00NS5neXAKQEAgLTgwLDggKzgwLDcgQEAKIAogICAgIHsKICAgICAgICMgVGhpcyB0YXJnZXQgdGFrZXMgc3BlY2lmaWVkIGZpbGVzIGFuZCBlbWJlZHMgdGhlbSBhcyBoZWFkZXIgZmlsZXMgZm9yCi0gICAgICAjIGluY2x1c2lvbiBpbnRvIHRoZSBiaW5hcnkuIFRoZSBzY3JpcHQgY3VycmVudGx5IHJlcXVpcmVzIGFsbCByZXNvdXJjZXMKLSAgICAgICMgdG8gYmUgZW1iZWRkZWQgdG8gbGl2ZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgICAgICAjIGluY2x1c2lvbiBpbnRvIHRoZSBiaW5hcnkuCiAgICAgICAndGFyZ2V0X25hbWUnOiAnZW1iZWRfbW96anNfcmVzb3VyY2VzX2FzX2hlYWRlcl9maWxlcycsCiAgICAgICAndHlwZSc6ICdub25lJywKICAgICAgICMgQmVjYXVzZSB3ZSBnZW5lcmF0ZSBhIGhlYWRlciwgd2UgbXVzdCBzZXQgdGhlIGhhcmRfZGVwZW5kZW5jeSBmbGFnLgpAQCAtOTIsNiArOTEsOSBAQAogICAgICAgfSwKICAgICAgICdzb3VyY2VzJzogWwogICAgICAgICAnPChERVBUSCkvdGhpcmRfcGFydHkvcHJvbWlzZS1wb2x5ZmlsbC9wcm9taXNlLm1pbi5qcycsCisgICAgICAgICc8KERFUFRIKS9jb2JhbHQvc3RyZWFtcy9lbWJlZGRlZF9zY3JpcHRzL2J5dGVfbGVuZ3RoX3F1ZXVpbmdfc3RyYXRlZ3kuanMnLAorICAgICAgICAnPChERVBUSCkvY29iYWx0L3N0cmVhbXMvZW1iZWRkZWRfc2NyaXB0cy9jb3VudF9xdWV1aW5nX3N0cmF0ZWd5LmpzJywKKyAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9zdHJlYW1zL2VtYmVkZGVkX3NjcmlwdHMvcmVhZGFibGVfc3RyZWFtLmpzJywKICAgICAgIF0sCiAgICAgICAnYWN0aW9ucyc6IFsKICAgICAgICAgewpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmNjIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmNjCmluZGV4IDJmNWFmNDYuLjJiZDdjNDEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5jYworKysgYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuY2MKQEAgLTI2OSw2ICsyNjksMTkgQEAKICAgcmV0dXJuIHN1Y2Nlc3M7CiB9CiAKK3ZvaWQgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6RXZhbHVhdGVFbWJlZGRlZFNjcmlwdCgKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciogZmlsZW5hbWUpIHsKKyAgVFJBQ0tfTUVNT1JZX1NDT1BFKCJKYXZhc2NyaXB0Iik7CisgIHN0ZDo6c3RyaW5nIHNvdXJjZShyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihkYXRhKSwgc2l6ZSk7CisgIHNjb3BlZF9yZWZwdHI8U291cmNlQ29kZT4gc291cmNlX2NvZGUgPQorICAgICAgbmV3IE1vempzU291cmNlQ29kZShzb3VyY2UsIGJhc2U6OlNvdXJjZUxvY2F0aW9uKGZpbGVuYW1lLCAxLCAxKSk7CisgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgYm9vbCBzdWNjZXNzID0gRXZhbHVhdGVTY3JpcHQoc291cmNlX2NvZGUsICZyZXN1bHQpOworICBpZiAoIXN1Y2Nlc3MpIHsKKyAgICBETE9HKEZBVEFMKSA8PCByZXN1bHQ7CisgIH0KK30KKwogc3RkOjp2ZWN0b3I8U3RhY2tGcmFtZT4gTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0U3RhY2tUcmFjZShpbnQgbWF4X2ZyYW1lcykgewogICBEQ0hFQ0sodGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7CiAgIHJldHVybiB1dGlsOjpHZXRTdGFja1RyYWNlKGNvbnRleHRfLCBtYXhfZnJhbWVzKTsKQEAgLTM1MSwxNyArMzY0LDIyIEBACiB9CiAKIHZvaWQgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6RXZhbHVhdGVBdXRvbWF0aWNzKCkgewotICBUUkFDS19NRU1PUllfU0NPUEUoIkphdmFzY3JpcHQiKTsKLSAgc3RkOjpzdHJpbmcgc291cmNlKAotICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oTW96anNFbWJlZGRlZFJlc291cmNlczo6cHJvbWlzZV9taW5fanMpLAotICAgICAgc2l6ZW9mKE1vempzRW1iZWRkZWRSZXNvdXJjZXM6OnByb21pc2VfbWluX2pzKSk7Ci0gIHNjb3BlZF9yZWZwdHI8U291cmNlQ29kZT4gc291cmNlX2NvZGUgPQotICAgICAgbmV3IE1vempzU291cmNlQ29kZShzb3VyY2UsIGJhc2U6OlNvdXJjZUxvY2F0aW9uKCJwcm9taXNlLm1pbi5qcyIsIDEsIDEpKTsKLSAgc3RkOjpzdHJpbmcgcmVzdWx0OwotICBib29sIHN1Y2Nlc3MgPSBFdmFsdWF0ZVNjcmlwdChzb3VyY2VfY29kZSwgJnJlc3VsdCk7Ci0gIGlmICghc3VjY2VzcykgewotICAgIERMT0coRkFUQUwpIDw8IHJlc3VsdDsKLSAgfQorICBFdmFsdWF0ZUVtYmVkZGVkU2NyaXB0KAorICAgICAgTW96anNFbWJlZGRlZFJlc291cmNlczo6cHJvbWlzZV9taW5fanMsCisgICAgICBzaXplb2YoTW96anNFbWJlZGRlZFJlc291cmNlczo6cHJvbWlzZV9taW5fanMpLAorICAgICAgInByb21pc2UubWluLmpzIik7CisgIEV2YWx1YXRlRW1iZWRkZWRTY3JpcHQoCisgICAgICBNb3pqc0VtYmVkZGVkUmVzb3VyY2VzOjpieXRlX2xlbmd0aF9xdWV1aW5nX3N0cmF0ZWd5X2pzLAorICAgICAgc2l6ZW9mKE1vempzRW1iZWRkZWRSZXNvdXJjZXM6OmJ5dGVfbGVuZ3RoX3F1ZXVpbmdfc3RyYXRlZ3lfanMpLAorICAgICAgImJ5dGVfbGVuZ3RoX3F1ZXVpbmdfc3RyYXRlZ3kuanMiKTsKKyAgRXZhbHVhdGVFbWJlZGRlZFNjcmlwdCgKKyAgICAgIE1vempzRW1iZWRkZWRSZXNvdXJjZXM6OmNvdW50X3F1ZXVpbmdfc3RyYXRlZ3lfanMsCisgICAgICBzaXplb2YoTW96anNFbWJlZGRlZFJlc291cmNlczo6Y291bnRfcXVldWluZ19zdHJhdGVneV9qcyksCisgICAgICAiY291bnRfcXVldWluZ19zdHJhdGVneS5qcyIpOworICBFdmFsdWF0ZUVtYmVkZGVkU2NyaXB0KAorICAgICAgTW96anNFbWJlZGRlZFJlc291cmNlczo6cmVhZGFibGVfc3RyZWFtX2pzLAorICAgICAgc2l6ZW9mKE1vempzRW1iZWRkZWRSZXNvdXJjZXM6OnJlYWRhYmxlX3N0cmVhbV9qcyksCisgICAgICAicmVhZGFibGVfc3RyZWFtLmpzIik7CiB9CiAKIEludGVyZmFjZURhdGEqIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEludGVyZmFjZURhdGEoaW50cHRyX3Qga2V5KSB7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oCmluZGV4IGM2Y2ZiMmEuLjBhNWE1NzMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oCisrKyBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oCkBAIC0xNDksNiArMTQ5LDkgQEAKICAgYm9vbCBFdmFsdWF0ZVNjcmlwdEludGVybmFsKGNvbnN0IHNjb3BlZF9yZWZwdHI8U291cmNlQ29kZT4mIHNvdXJjZV9jb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSBvdXRfcmVzdWx0KTsKIAorICB2b2lkIEV2YWx1YXRlRW1iZWRkZWRTY3JpcHQoY29uc3QgdW5zaWduZWQgY2hhciogZGF0YSwgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlbmFtZSk7CisKICAgc3RhdGljIHZvaWQgVHJhY2VGdW5jdGlvbihKU1RyYWNlciogdHJhY2UsIHZvaWQqIGRhdGEpOwogCiAgIC8vIEhlbHBlciBzdHJ1Y3QgdG8gZW5zdXJlIHRoZSBjb250ZXh0IGlzIGRlc3Ryb3llZCBpbiB0aGUgY29ycmVjdCBvcmRlcgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvbmF0aXZlX3Byb21pc2UuaCBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L25hdGl2ZV9wcm9taXNlLmgKaW5kZXggMWRmY2NiNS4uY2M0YmU1ZCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvbmF0aXZlX3Byb21pc2UuaAorKysgYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS9uYXRpdmVfcHJvbWlzZS5oCkBAIC0xNjksNiArMTY5LDE2IEBACiAgIG91dF92YWx1ZS5zZXRPYmplY3RPck51bGwobmF0aXZlX3Byb21pc2UtPnByb21pc2UoKSk7CiB9CiAKKy8vIERlc3Ryb3lzIHxwcm9taXNlX2hvbGRlcnwgYXMgc29vbiBhcyB0aGUgY29udmVyc2lvbiBpcyBkb25lLgorLy8gVGhpcyBpcyB1c2VmdWwgd2hlbiBhIHdyYXBwYWJsZSBpcyBub3QgaW50ZXJlc3RlZCBpbiByZXRhaW5pbmcgYSByZWZlcmVuY2UKKy8vIHRvIGEgcHJvbWlzZSwgdHlwaWNhbGx5IHdoZW4gYSBwcm9taXNlIGlzIHJlc29sdmVkIG9yIHJlamVjdGVkIHN5bmNocm9ub3VzbHkuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2lubGluZSB2b2lkIFRvSlNWYWx1ZShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgc2NvcGVkX3B0cjxTY3JpcHRWYWx1ZTxQcm9taXNlPFQ+ID4gPiBwcm9taXNlX2hvbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIG91dF92YWx1ZSkgeworICBUb0pTVmFsdWUoY29udGV4dCwgcHJvbWlzZV9ob2xkZXIuZ2V0KCksIG91dF92YWx1ZSk7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBtb3pqcwogfSAgLy8gbmFtZXNwYWNlIHNjcmlwdAogfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvY29udmVyc2lvbl9oZWxwZXJzLmggYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy9jb252ZXJzaW9uX2hlbHBlcnMuaAppbmRleCA4OGExM2I4Li4wYWE5MTkyIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy9jb252ZXJzaW9uX2hlbHBlcnMuaAorKysgYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy9jb252ZXJzaW9uX2hlbHBlcnMuaApAQCAtMTUyLDE5ICsxNTIsMTkgQEAKIC8vIGh0dHBzOi8vaGV5Y2FtLmdpdGh1Yi5pby93ZWJpZGwvI2Fic3RyYWN0LW9wZGVmLWNvbnZlcnR0b2ludAogdGVtcGxhdGUgPD4KIGlubGluZSBjb25zdCBkb3VibGUgVXBwZXJCb3VuZDxpbnQ2NF90PigpIHsKLSAgY29uc3QgZG91YmxlIGtJbnQ2NFVwcGVyQm91bmQgPSBzdGF0aWNfY2FzdDxkb3VibGU+KCgxdWxsIDw8IDUzKSAtIDEpOworICBjb25zdCBkb3VibGUga0ludDY0VXBwZXJCb3VuZCA9IHN0YXRpY19jYXN0PGRvdWJsZT4oKDFsbCA8PCA1MykgLSAxKTsKICAgcmV0dXJuIGtJbnQ2NFVwcGVyQm91bmQ7CiB9CiAKIHRlbXBsYXRlIDw+CiBpbmxpbmUgY29uc3QgZG91YmxlIExvd2VyQm91bmQ8aW50NjRfdD4oKSB7Ci0gIGNvbnN0IGRvdWJsZSBrSW50NjRMb3dlckJvdW5kID0gc3RhdGljX2Nhc3Q8ZG91YmxlPigtKDF1bGwgPDwgNTMpICsgMSk7CisgIGNvbnN0IGRvdWJsZSBrSW50NjRMb3dlckJvdW5kID0gc3RhdGljX2Nhc3Q8ZG91YmxlPigtKDFsbCA8PCA1MykgKyAxKTsKICAgcmV0dXJuIGtJbnQ2NExvd2VyQm91bmQ7CiB9CiAKIHRlbXBsYXRlIDw+CiBpbmxpbmUgY29uc3QgZG91YmxlIFVwcGVyQm91bmQ8dWludDY0X3Q+KCkgewotICBjb25zdCBkb3VibGUga1VJbnQ2NFVwcGVyQm91bmQgPSBzdGF0aWNfY2FzdDxkb3VibGU+KCgxdWxsIDw8IDUzKSAtIDEpOworICBjb25zdCBkb3VibGUga1VJbnQ2NFVwcGVyQm91bmQgPSBzdGF0aWNfY2FzdDxkb3VibGU+KCgxbGwgPDwgNTMpIC0gMSk7CiAgIHJldHVybiBrVUludDY0VXBwZXJCb3VuZDsKIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvbmF0aXZlX3Byb21pc2UuaCBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL25hdGl2ZV9wcm9taXNlLmgKaW5kZXggZTI5MTE5Ny4uZjE4NDA3NiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvbmF0aXZlX3Byb21pc2UuaAorKysgYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy9uYXRpdmVfcHJvbWlzZS5oCkBAIC0xNjksNiArMTY5LDE2IEBACiAgIG91dF92YWx1ZS5zZXRPYmplY3RPck51bGwobmF0aXZlX3Byb21pc2UtPnByb21pc2UoKSk7CiB9CiAKKy8vIERlc3Ryb3lzIHxwcm9taXNlX2hvbGRlcnwgYXMgc29vbiBhcyB0aGUgY29udmVyc2lvbiBpcyBkb25lLgorLy8gVGhpcyBpcyB1c2VmdWwgd2hlbiBhIHdyYXBwYWJsZSBpcyBub3QgaW50ZXJlc3RlZCBpbiByZXRhaW5pbmcgYSByZWZlcmVuY2UKKy8vIHRvIGEgcHJvbWlzZSwgdHlwaWNhbGx5IHdoZW4gYSBwcm9taXNlIGlzIHJlc29sdmVkIG9yIHJlamVjdGVkIHN5bmNocm9ub3VzbHkuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2lubGluZSB2b2lkIFRvSlNWYWx1ZShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgc2NvcGVkX3B0cjxTY3JpcHRWYWx1ZTxQcm9taXNlPFQ+ID4gPiBwcm9taXNlX2hvbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIG91dF92YWx1ZSkgeworICBUb0pTVmFsdWUoY29udGV4dCwgcHJvbWlzZV9ob2xkZXIuZ2V0KCksIG91dF92YWx1ZSk7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBtb3pqcwogfSAgLy8gbmFtZXNwYWNlIHNjcmlwdAogfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlLmggYi9zcmMvY29iYWx0L3NjcmlwdC9zY3JpcHRfdmFsdWUuaAppbmRleCAwNTUzYmQxLi43YjllZGFjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NjcmlwdC9zY3JpcHRfdmFsdWUuaAorKysgYi9zcmMvY29iYWx0L3NjcmlwdC9zY3JpcHRfdmFsdWUuaApAQCAtNTQsNiArNTQsMTIgQEAKICAgLy8gY29uc3RydWN0b3IuCiAgIGNsYXNzIFJlZmVyZW5jZSB7CiAgICBwdWJsaWM6CisgICAgUmVmZXJlbmNlKFdyYXBwYWJsZSogd3JhcHBhYmxlLCBzY29wZWRfcHRyPFNjcmlwdFZhbHVlPiBzY3JpcHRfdmFsdWUpCisgICAgICAgIDogb3duZXJfKHdyYXBwYWJsZSksIHJlZmVyZW5jZWRfdmFsdWVfKHNjcmlwdF92YWx1ZS5QYXNzKCkpIHsKKyAgICAgIERDSEVDSyhyZWZlcmVuY2VkX3ZhbHVlXyk7CisgICAgICByZWZlcmVuY2VkX3ZhbHVlXy0+UmVnaXN0ZXJPd25lcihvd25lcl8pOworICAgIH0KKwogICAgIFJlZmVyZW5jZShXcmFwcGFibGUqIHdyYXBwYWJsZSwgY29uc3QgU2NyaXB0VmFsdWUmIHNjcmlwdF92YWx1ZSkKICAgICAgICAgOiBvd25lcl8od3JhcHBhYmxlKSwgcmVmZXJlbmNlZF92YWx1ZV8oc2NyaXB0X3ZhbHVlLk1ha2VDb3B5KCkpIHsKICAgICAgIERDSEVDSyhyZWZlcmVuY2VkX3ZhbHVlXyk7CkBAIC04NSw2ICs5MSwxMiBAQAogICAvLyBkb2Vzbid0IG5lZWQgdG8gYmUgcmV0YWluZWQgcGFzdCB0aGUgc2NvcGUgb2YgdGhlIGZ1bmN0aW9uLgogICBjbGFzcyBTdHJvbmdSZWZlcmVuY2UgewogICAgcHVibGljOgorICAgIGV4cGxpY2l0IFN0cm9uZ1JlZmVyZW5jZShzY29wZWRfcHRyPFNjcmlwdFZhbHVlPiBzY3JpcHRfdmFsdWUpCisgICAgICAgIDogcmVmZXJlbmNlZF92YWx1ZV8oc2NyaXB0X3ZhbHVlLlBhc3MoKSkgeworICAgICAgRENIRUNLKHJlZmVyZW5jZWRfdmFsdWVfKTsKKyAgICAgIHJlZmVyZW5jZWRfdmFsdWVfLT5QcmV2ZW50R2FyYmFnZUNvbGxlY3Rpb24oKTsKKyAgICB9CisKICAgICBleHBsaWNpdCBTdHJvbmdSZWZlcmVuY2UoY29uc3QgU2NyaXB0VmFsdWUmIHNjcmlwdF92YWx1ZSkKICAgICAgICAgOiByZWZlcmVuY2VkX3ZhbHVlXyhzY3JpcHRfdmFsdWUuTWFrZUNvcHkoKSkgewogICAgICAgRENIRUNLKHJlZmVyZW5jZWRfdmFsdWVfKTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc3RyZWFtcy9ieXRlX2xlbmd0aF9xdWV1aW5nX3N0cmF0ZWd5LmpzIGIvc3JjL2NvYmFsdC9zdHJlYW1zL2J5dGVfbGVuZ3RoX3F1ZXVpbmdfc3RyYXRlZ3kuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQxYTBhMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvc3RyZWFtcy9ieXRlX2xlbmd0aF9xdWV1aW5nX3N0cmF0ZWd5LmpzCkBAIC0wLDAgKzEsMzQgQEAKKy8vID09Q2xvc3VyZUNvbXBpbGVyPT0KKy8vIEBvdXRwdXRfZmlsZV9uYW1lIGJ5dGVfbGVuZ3RoX3F1ZXVpbmdfc3RyYXRlZ3kuanMKKy8vIEBjb21waWxhdGlvbl9sZXZlbCBTSU1QTEVfT1BUSU1JWkFUSU9OUworLy8gQGxhbmd1YWdlX291dCBFUzVfU1RSSUNUCisvLyA9PS9DbG9zdXJlQ29tcGlsZXI9PQorCisvLyBDb3B5cmlnaHQgMjAxNSBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyhmdW5jdGlvbihnbG9iYWwpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIGNvbnN0IGRlZmluZVByb3BlcnR5ID0gZ2xvYmFsLk9iamVjdC5kZWZpbmVQcm9wZXJ0eTsKKworICBjbGFzcyBCeXRlTGVuZ3RoUXVldWluZ1N0cmF0ZWd5IHsKKyAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7CisgICAgICBkZWZpbmVQcm9wZXJ0eSh0aGlzLCAnaGlnaFdhdGVyTWFyaycsIHsKKyAgICAgICAgdmFsdWU6IG9wdGlvbnMuaGlnaFdhdGVyTWFyaywKKyAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAorICAgICAgICB3cml0YWJsZTogdHJ1ZQorICAgICAgfSk7CisgICAgfQorICAgIHNpemUoY2h1bmspIHsgcmV0dXJuIGNodW5rLmJ5dGVMZW5ndGg7IH0KKyAgfQorCisgIGRlZmluZVByb3BlcnR5KGdsb2JhbCwgJ0J5dGVMZW5ndGhRdWV1aW5nU3RyYXRlZ3knLCB7CisgICAgdmFsdWU6IEJ5dGVMZW5ndGhRdWV1aW5nU3RyYXRlZ3ksCisgICAgZW51bWVyYWJsZTogZmFsc2UsCisgICAgY29uZmlndXJhYmxlOiB0cnVlLAorICAgIHdyaXRhYmxlOiB0cnVlCisgIH0pOworfSkodGhpcyk7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3N0cmVhbXMvY291bnRfcXVldWluZ19zdHJhdGVneS5qcyBiL3NyYy9jb2JhbHQvc3RyZWFtcy9jb3VudF9xdWV1aW5nX3N0cmF0ZWd5LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmYzU3MTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L3N0cmVhbXMvY291bnRfcXVldWluZ19zdHJhdGVneS5qcwpAQCAtMCwwICsxLDM1IEBACisvLyA9PUNsb3N1cmVDb21waWxlcj09CisvLyBAb3V0cHV0X2ZpbGVfbmFtZSBjb3VudF9xdWV1aW5nX3N0cmF0ZWd5LmpzCisvLyBAY29tcGlsYXRpb25fbGV2ZWwgU0lNUExFX09QVElNSVpBVElPTlMKKy8vIEBsYW5ndWFnZV9vdXQgRVM1X1NUUklDVAorLy8gPT0vQ2xvc3VyZUNvbXBpbGVyPT0KKworLy8gQ29weXJpZ2h0IDIwMTUgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisoZnVuY3Rpb24oZ2xvYmFsKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBjb25zdCBkZWZpbmVQcm9wZXJ0eSA9IGdsb2JhbC5PYmplY3QuZGVmaW5lUHJvcGVydHk7CisKKyAgY2xhc3MgQ291bnRRdWV1aW5nU3RyYXRlZ3kgeworICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHsKKyAgICAgIGRlZmluZVByb3BlcnR5KHRoaXMsICdoaWdoV2F0ZXJNYXJrJywgeworICAgICAgICB2YWx1ZTogb3B0aW9ucy5oaWdoV2F0ZXJNYXJrLAorICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAorICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCisgICAgICAgIHdyaXRhYmxlOiB0cnVlCisgICAgICB9KTsKKyAgICB9CisKKyAgICBzaXplKGNodW5rKSB7IHJldHVybiAxOyB9CisgIH0KKworICBkZWZpbmVQcm9wZXJ0eShnbG9iYWwsICdDb3VudFF1ZXVpbmdTdHJhdGVneScsIHsKKyAgICB2YWx1ZTogQ291bnRRdWV1aW5nU3RyYXRlZ3ksCisgICAgZW51bWVyYWJsZTogZmFsc2UsCisgICAgY29uZmlndXJhYmxlOiB0cnVlLAorICAgIHdyaXRhYmxlOiB0cnVlCisgIH0pOworfSkodGhpcyk7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3N0cmVhbXMvZW1iZWRkZWRfc2NyaXB0cy9ieXRlX2xlbmd0aF9xdWV1aW5nX3N0cmF0ZWd5LmpzIGIvc3JjL2NvYmFsdC9zdHJlYW1zL2VtYmVkZGVkX3NjcmlwdHMvYnl0ZV9sZW5ndGhfcXVldWluZ19zdHJhdGVneS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTUzN2FjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9zdHJlYW1zL2VtYmVkZGVkX3NjcmlwdHMvYnl0ZV9sZW5ndGhfcXVldWluZ19zdHJhdGVneS5qcwpAQCAtMCwwICsxIEBACisndXNlIHN0cmljdCc7KGZ1bmN0aW9uKGIpe3ZhciBjPWIuT2JqZWN0LmRlZmluZVByb3BlcnR5LGQ9ZnVuY3Rpb24oYSl7Yyh0aGlzLCJoaWdoV2F0ZXJNYXJrIix7dmFsdWU6YS5oaWdoV2F0ZXJNYXJrLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSl9O2QucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oYSl7cmV0dXJuIGEuYnl0ZUxlbmd0aH07YyhiLCJCeXRlTGVuZ3RoUXVldWluZ1N0cmF0ZWd5Iix7dmFsdWU6ZCxlbnVtZXJhYmxlOiExLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pfSkodGhpcyk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zdHJlYW1zL2VtYmVkZGVkX3NjcmlwdHMvY291bnRfcXVldWluZ19zdHJhdGVneS5qcyBiL3NyYy9jb2JhbHQvc3RyZWFtcy9lbWJlZGRlZF9zY3JpcHRzL2NvdW50X3F1ZXVpbmdfc3RyYXRlZ3kuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg4YWVkMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvc3RyZWFtcy9lbWJlZGRlZF9zY3JpcHRzL2NvdW50X3F1ZXVpbmdfc3RyYXRlZ3kuanMKQEAgLTAsMCArMSBAQAorJ3VzZSBzdHJpY3QnOyhmdW5jdGlvbihhKXt2YXIgYj1hLk9iamVjdC5kZWZpbmVQcm9wZXJ0eSxjPWZ1bmN0aW9uKGEpe2IodGhpcywiaGlnaFdhdGVyTWFyayIse3ZhbHVlOmEuaGlnaFdhdGVyTWFyayxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pfTtjLnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKGEpe3JldHVybiAxfTtiKGEsIkNvdW50UXVldWluZ1N0cmF0ZWd5Iix7dmFsdWU6YyxlbnVtZXJhYmxlOiExLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pfSkodGhpcyk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zdHJlYW1zL2VtYmVkZGVkX3NjcmlwdHMvcmVhZGFibGVfc3RyZWFtLmpzIGIvc3JjL2NvYmFsdC9zdHJlYW1zL2VtYmVkZGVkX3NjcmlwdHMvcmVhZGFibGVfc3RyZWFtLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMTdjZGQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L3N0cmVhbXMvZW1iZWRkZWRfc2NyaXB0cy9yZWFkYWJsZV9zdHJlYW0uanMKQEAgLTAsMCArMSw0NyBAQAorJ3VzZSBzdHJpY3QnOyhmdW5jdGlvbihnbG9iYWwpe2NvbnN0IHY4X0ludGVybmFsUGFja2VkQXJyYXk9Z2xvYmFsLkFycmF5O2Z1bmN0aW9uIHY4X2NyZWF0ZVByaXZhdGVTeW1ib2woeCl7cmV0dXJuIFN5bWJvbCh4KX1mdW5jdGlvbiB2OF9zaW1wbGVCaW5kKGZuLG9iail7cmV0dXJuIGZuLmJpbmQob2JqKX1jb25zdCBhcnJheVNsaWNlPWdsb2JhbC5BcnJheS5wcm90b3R5cGUuc2xpY2U7ZnVuY3Rpb24gdjhfdW5jdXJyeVRoaXMoZm4pe3JldHVybiBmdW5jdGlvbihvYmope3JldHVybiBmbi5hcHBseShvYmosYXJyYXlTbGljZS5jYWxsKGFyZ3VtZW50cywxKSl9fWNvbnN0IHY4X1Byb21pc2VCYXNlPWdsb2JhbC5Qcm9taXNlO2NvbnN0IF9wcm9taXNlUmVzb2x2ZT12OF9jcmVhdGVQcml2YXRlU3ltYm9sKCJbW1Jlc29sdmVdXSIpO2NvbnN0IF9wcm9taXNlUmVqZWN0PXY4X2NyZWF0ZVByaXZhdGVTeW1ib2woIltbUmVqZWN0XV0iKTtmdW5jdGlvbiB2OF9Qcm9taXNlKCl7dmFyIHRoYXQ9Cit0aGlzO3Y4X1Byb21pc2VCYXNlLmNhbGwodGhpcyxmdW5jdGlvbihyZXNvbHZlLHJlamVjdCl7dGhhdFtfcHJvbWlzZVJlc29sdmVdPXJlc29sdmU7dGhhdFtfcHJvbWlzZVJlamVjdF09cmVqZWN0fSl9djhfUHJvbWlzZS5wcm90b3R5cGU9djhfUHJvbWlzZUJhc2UucHJvdG90eXBlO2Z1bmN0aW9uIHY4X2NyZWF0ZVByb21pc2UoKXtyZXR1cm4gbmV3IHY4X1Byb21pc2V9ZnVuY3Rpb24gdjhfaXNQcm9taXNlKG9iail7cmV0dXJuIG9iaiBpbnN0YW5jZW9mIHY4X1Byb21pc2V9ZnVuY3Rpb24gdjhfcmVzb2x2ZVByb21pc2UocHJvbWlzZSx2YWx1ZSl7cHJvbWlzZVtfcHJvbWlzZVJlc29sdmVdKHZhbHVlKX1mdW5jdGlvbiB2OF9yZWplY3RQcm9taXNlKHByb21pc2UscmVhc29uKXtwcm9taXNlW19wcm9taXNlUmVqZWN0XShyZWFzb24pfWZ1bmN0aW9uIHY4X21hcmtQcm9taXNlQXNIYW5kbGVkKHByb21pc2Upe3RyeXt0aGVuUHJvbWlzZShwcm9taXNlLHVuZGVmaW5lZCwoKT0+e30pfWNhdGNoKGVycm9yKXt9fQorY29uc3QgUVVFVUVfTUFYX0FSUkFZX1NJWkU9MTYzODQ7Y2xhc3MgU2ltcGxlUXVldWV7Y29uc3RydWN0b3IoKXt0aGlzLmZyb250PXtlbGVtZW50czpuZXcgdjhfSW50ZXJuYWxQYWNrZWRBcnJheSxuZXh0OnVuZGVmaW5lZH07dGhpcy5iYWNrPXRoaXMuZnJvbnQ7dGhpcy5jdXJzb3I9MDt0aGlzLnNpemU9MH1nZXQgbGVuZ3RoKCl7cmV0dXJuIHRoaXMuc2l6ZX1wdXNoKGVsZW1lbnQpeysrdGhpcy5zaXplO2lmKHRoaXMuYmFjay5lbGVtZW50cy5sZW5ndGg9PT1RVUVVRV9NQVhfQVJSQVlfU0laRSl7Y29uc3Qgb2xkQmFjaz10aGlzLmJhY2s7dGhpcy5iYWNrPXtlbGVtZW50czpuZXcgdjhfSW50ZXJuYWxQYWNrZWRBcnJheSxuZXh0OnVuZGVmaW5lZH07b2xkQmFjay5uZXh0PXRoaXMuYmFja310aGlzLmJhY2suZWxlbWVudHMucHVzaChlbGVtZW50KX1zaGlmdCgpey0tdGhpcy5zaXplO2lmKHRoaXMuZnJvbnQuZWxlbWVudHMubGVuZ3RoPT09dGhpcy5jdXJzb3Ipe3RoaXMuZnJvbnQ9Cit0aGlzLmZyb250Lm5leHQ7dGhpcy5jdXJzb3I9MH1jb25zdCBlbGVtZW50PXRoaXMuZnJvbnQuZWxlbWVudHNbdGhpcy5jdXJzb3JdO3RoaXMuZnJvbnQuZWxlbWVudHNbdGhpcy5jdXJzb3JdPXVuZGVmaW5lZDsrK3RoaXMuY3Vyc29yO3JldHVybiBlbGVtZW50fWZvckVhY2goY2FsbGJhY2spe2xldCBpPXRoaXMuY3Vyc29yO2xldCBub2RlPXRoaXMuZnJvbnQ7bGV0IGVsZW1lbnRzPW5vZGUuZWxlbWVudHM7d2hpbGUoaSE9PWVsZW1lbnRzLmxlbmd0aHx8bm9kZS5uZXh0IT09dW5kZWZpbmVkKXtpZihpPT09ZWxlbWVudHMubGVuZ3RoKXtub2RlPW5vZGUubmV4dDtlbGVtZW50cz1ub2RlLmVsZW1lbnRzO2k9MH1jYWxsYmFjayhlbGVtZW50c1tpXSk7KytpfX1wZWVrKCl7aWYodGhpcy5mcm9udC5lbGVtZW50cy5sZW5ndGg9PT10aGlzLmN1cnNvcilyZXR1cm4gdGhpcy5mcm9udC5uZXh0LmVsZW1lbnRzWzBdO3JldHVybiB0aGlzLmZyb250LmVsZW1lbnRzW3RoaXMuY3Vyc29yXX19Citjb25zdCBzdHJlYW1FcnJvcnNfaWxsZWdhbEludm9jYXRpb249IklsbGVnYWwgaW52b2NhdGlvbiI7Y29uc3Qgc3RyZWFtRXJyb3JzX2lsbGVnYWxDb25zdHJ1Y3Rvcj0iSWxsZWdhbCBjb25zdHJ1Y3RvciI7Y29uc3Qgc3RyZWFtRXJyb3JzX2ludmFsaWRUeXBlPSJJbnZhbGlkIHR5cGUgaXMgc3BlY2lmaWVkIjtjb25zdCBzdHJlYW1FcnJvcnNfaW52YWxpZFNpemU9IlRoZSByZXR1cm4gdmFsdWUgb2YgYSBxdWV1aW5nIHN0cmF0ZWd5J3Mgc2l6ZSBmdW5jdGlvbiBtdXN0IGJlIGEgZmluaXRlLCBub24tTmFOLCBub24tbmVnYXRpdmUgbnVtYmVyIjtjb25zdCBzdHJlYW1FcnJvcnNfc2l6ZU5vdEFGdW5jdGlvbj0iQSBxdWV1aW5nIHN0cmF0ZWd5J3Mgc2l6ZSBwcm9wZXJ0eSBtdXN0IGJlIGEgZnVuY3Rpb24iO2NvbnN0IHN0cmVhbUVycm9yc19pbnZhbGlkSFdNPSJBIHF1ZXVlaW5nIHN0cmF0ZWd5J3MgaGlnaFdhdGVyTWFyayBwcm9wZXJ0eSBtdXN0IGJlIGEgbm9ubmVnYXRpdmUsIG5vbi1OYU4gbnVtYmVyIjsKK2NvbnN0IF9yZWFkZXI9djhfY3JlYXRlUHJpdmF0ZVN5bWJvbCgiW1tyZWFkZXJdXSIpO2NvbnN0IF9zdG9yZWRFcnJvcj12OF9jcmVhdGVQcml2YXRlU3ltYm9sKCJbW3N0b3JlZEVycm9yXV0iKTtjb25zdCBfY29udHJvbGxlcj12OF9jcmVhdGVQcml2YXRlU3ltYm9sKCJbW2NvbnRyb2xsZXJdXSIpO2NvbnN0IF9jbG9zZWRQcm9taXNlPXY4X2NyZWF0ZVByaXZhdGVTeW1ib2woIltbY2xvc2VkUHJvbWlzZV1dIik7Y29uc3QgX293bmVyUmVhZGFibGVTdHJlYW09djhfY3JlYXRlUHJpdmF0ZVN5bWJvbCgiW1tvd25lclJlYWRhYmxlU3RyZWFtXV0iKTtjb25zdCBfcmVhZFJlcXVlc3RzPXY4X2NyZWF0ZVByaXZhdGVTeW1ib2woIltbcmVhZFJlcXVlc3RzXV0iKTtjb25zdCBjcmVhdGVXaXRoRXh0ZXJuYWxDb250cm9sbGVyU2VudGluZWw9djhfY3JlYXRlUHJpdmF0ZVN5bWJvbCgiZmxhZyBmb3IgVUEtY3JlYXRlZCBSZWFkYWJsZVN0cmVhbSB0byBwYXNzIik7Y29uc3QgX3JlYWRhYmxlU3RyZWFtQml0cz0KK3Y4X2NyZWF0ZVByaXZhdGVTeW1ib2woImJpdCBmaWVsZCBmb3IgW1tzdGF0ZV1dIGFuZCBbW2Rpc3R1cmJlZF1dIik7Y29uc3QgRElTVFVSQkVEPTE7Y29uc3QgU1RBVEVfTUFTSz02O2NvbnN0IFNUQVRFX0JJVFNfT0ZGU0VUPTE7Y29uc3QgU1RBVEVfUkVBREFCTEU9MDtjb25zdCBTVEFURV9DTE9TRUQ9MTtjb25zdCBTVEFURV9FUlJPUkVEPTI7Y29uc3QgX3VuZGVybHlpbmdTb3VyY2U9djhfY3JlYXRlUHJpdmF0ZVN5bWJvbCgiW1t1bmRlcmx5aW5nU291cmNlXV0iKTtjb25zdCBfY29udHJvbGxlZFJlYWRhYmxlU3RyZWFtPXY4X2NyZWF0ZVByaXZhdGVTeW1ib2woIltbY29udHJvbGxlZFJlYWRhYmxlU3RyZWFtXV0iKTtjb25zdCBfcXVldWU9djhfY3JlYXRlUHJpdmF0ZVN5bWJvbCgiW1txdWV1ZV1dIik7Y29uc3QgX3RvdGFsUXVldWVkU2l6ZT12OF9jcmVhdGVQcml2YXRlU3ltYm9sKCJbW3RvdGFsUXVldWVkU2l6ZV1dIik7Y29uc3QgX3N0cmF0ZWd5U2l6ZT12OF9jcmVhdGVQcml2YXRlU3ltYm9sKCJbW3N0cmF0ZWd5U2l6ZV1dIik7Citjb25zdCBfc3RyYXRlZ3lIV009djhfY3JlYXRlUHJpdmF0ZVN5bWJvbCgiW1tzdHJhdGVneUhXTV1dIik7Y29uc3QgX3JlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJCaXRzPXY4X2NyZWF0ZVByaXZhdGVTeW1ib2woImJpdCBmaWVsZCBmb3IgW1tzdGFydGVkXV0sIFtbY2xvc2VSZXF1ZXN0ZWRdXSwgW1twdWxsaW5nXV0sIFtbcHVsbEFnYWluXV0iKTtjb25zdCBTVEFSVEVEPTE7Y29uc3QgQ0xPU0VfUkVRVUVTVEVEPTI7Y29uc3QgUFVMTElORz00O2NvbnN0IFBVTExfQUdBSU49ODtjb25zdCBFWFRFUk5BTExZX0NPTlRST0xMRUQ9MTY7Y29uc3QgdW5kZWZpbmVkPWdsb2JhbC51bmRlZmluZWQ7Y29uc3QgSW5maW5pdHk9Z2xvYmFsLkluZmluaXR5O2NvbnN0IGRlZmluZVByb3BlcnR5PWdsb2JhbC5PYmplY3QuZGVmaW5lUHJvcGVydHk7Y29uc3QgaGFzT3duUHJvcGVydHk9djhfdW5jdXJyeVRoaXMoZ2xvYmFsLk9iamVjdC5oYXNPd25Qcm9wZXJ0eSk7Y29uc3QgY2FsbEZ1bmN0aW9uPQordjhfdW5jdXJyeVRoaXMoZ2xvYmFsLkZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsKTtjb25zdCBhcHBseUZ1bmN0aW9uPXY4X3VuY3VycnlUaGlzKGdsb2JhbC5GdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkpO2NvbnN0IFR5cGVFcnJvcj1nbG9iYWwuVHlwZUVycm9yO2NvbnN0IFJhbmdlRXJyb3I9Z2xvYmFsLlJhbmdlRXJyb3I7Y29uc3QgTnVtYmVyPWdsb2JhbC5OdW1iZXI7Y29uc3QgTnVtYmVyX2lzTmFOPU51bWJlci5pc05hTjtjb25zdCBOdW1iZXJfaXNGaW5pdGU9TnVtYmVyLmlzRmluaXRlO2NvbnN0IFByb21pc2U9Z2xvYmFsLlByb21pc2U7Y29uc3QgdGhlblByb21pc2U9djhfdW5jdXJyeVRoaXMoUHJvbWlzZS5wcm90b3R5cGUudGhlbik7Y29uc3QgUHJvbWlzZV9yZXNvbHZlPXY4X3NpbXBsZUJpbmQoUHJvbWlzZS5yZXNvbHZlLFByb21pc2UpO2NvbnN0IFByb21pc2VfcmVqZWN0PXY4X3NpbXBsZUJpbmQoUHJvbWlzZS5yZWplY3QsUHJvbWlzZSk7Y29uc3QgZXJyQ2FuY2VsTG9ja2VkU3RyZWFtPQorIkNhbm5vdCBjYW5jZWwgYSByZWFkYWJsZSBzdHJlYW0gdGhhdCBpcyBsb2NrZWQgdG8gYSByZWFkZXIiO2NvbnN0IGVyckVucXVldWVDbG9zZVJlcXVlc3RlZFN0cmVhbT0iQ2Fubm90IGVucXVldWUgYSBjaHVuayBpbnRvIGEgcmVhZGFibGUgc3RyZWFtIHRoYXQgaXMgY2xvc2VkIG9yIGhhcyBiZWVuIHJlcXVlc3RlZCB0byBiZSBjbG9zZWQiO2NvbnN0IGVyckNhbmNlbFJlbGVhc2VkUmVhZGVyPSJUaGlzIHJlYWRhYmxlIHN0cmVhbSByZWFkZXIgaGFzIGJlZW4gcmVsZWFzZWQgYW5kIGNhbm5vdCBiZSB1c2VkIHRvIGNhbmNlbCBpdHMgcHJldmlvdXMgb3duZXIgc3RyZWFtIjtjb25zdCBlcnJSZWFkUmVsZWFzZWRSZWFkZXI9IlRoaXMgcmVhZGFibGUgc3RyZWFtIHJlYWRlciBoYXMgYmVlbiByZWxlYXNlZCBhbmQgY2Fubm90IGJlIHVzZWQgdG8gcmVhZCBmcm9tIGl0cyBwcmV2aW91cyBvd25lciBzdHJlYW0iO2NvbnN0IGVyckNsb3NlQ2xvc2VSZXF1ZXN0ZWRTdHJlYW09IkNhbm5vdCBjbG9zZSBhIHJlYWRhYmxlIHN0cmVhbSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gcmVxdWVzdGVkIHRvIGJlIGNsb3NlZCI7Citjb25zdCBlcnJFbnF1ZXVlQ2xvc2VkU3RyZWFtPSJDYW5ub3QgZW5xdWV1ZSBhIGNodW5rIGludG8gYSBjbG9zZWQgcmVhZGFibGUgc3RyZWFtIjtjb25zdCBlcnJFbnF1ZXVlRXJyb3JlZFN0cmVhbT0iQ2Fubm90IGVucXVldWUgYSBjaHVuayBpbnRvIGFuIGVycm9yZWQgcmVhZGFibGUgc3RyZWFtIjtjb25zdCBlcnJDbG9zZUNsb3NlZFN0cmVhbT0iQ2Fubm90IGNsb3NlIGEgY2xvc2VkIHJlYWRhYmxlIHN0cmVhbSI7Y29uc3QgZXJyQ2xvc2VFcnJvcmVkU3RyZWFtPSJDYW5ub3QgY2xvc2UgYW4gZXJyb3JlZCByZWFkYWJsZSBzdHJlYW0iO2NvbnN0IGVyckVycm9yQ2xvc2VkU3RyZWFtPSJDYW5ub3QgZXJyb3IgYSBjbG9zZSByZWFkYWJsZSBzdHJlYW0iO2NvbnN0IGVyckVycm9yRXJyb3JlZFN0cmVhbT0iQ2Fubm90IGVycm9yIGEgcmVhZGFibGUgc3RyZWFtIHRoYXQgaXMgYWxyZWFkeSBlcnJvcmVkIjtjb25zdCBlcnJHZXRSZWFkZXJOb3RCeXRlU3RyZWFtPSJUaGlzIHJlYWRhYmxlIHN0cmVhbSBkb2VzIG5vdCBzdXBwb3J0IEJZT0IgcmVhZGVycyI7Citjb25zdCBlcnJHZXRSZWFkZXJCYWRNb2RlPSdJbnZhbGlkIHJlYWRlciBtb2RlIGdpdmVuOiBleHBlY3RlZCB1bmRlZmluZWQgb3IgImJ5b2IiJztjb25zdCBlcnJSZWFkZXJDb25zdHJ1Y3RvckJhZEFyZ3VtZW50PSJSZWFkYWJsZVN0cmVhbVJlYWRlciBjb25zdHJ1Y3RvciBhcmd1bWVudCBpcyBub3QgYSByZWFkYWJsZSBzdHJlYW0iO2NvbnN0IGVyclJlYWRlckNvbnN0cnVjdG9yU3RyZWFtQWxyZWFkeUxvY2tlZD0iUmVhZGFibGVTdHJlYW1SZWFkZXIgY29uc3RydWN0b3IgY2FuIG9ubHkgYWNjZXB0IHJlYWRhYmxlIHN0cmVhbXMgdGhhdCBhcmUgbm90IHlldCBsb2NrZWQgdG8gYSByZWFkZXIiO2NvbnN0IGVyclJlbGVhc2VSZWFkZXJXaXRoUGVuZGluZ1JlYWQ9IkNhbm5vdCByZWxlYXNlIGEgcmVhZGFibGUgc3RyZWFtIHJlYWRlciB3aGVuIGl0IHN0aWxsIGhhcyBvdXRzdGFuZGluZyByZWFkKCkgY2FsbHMgdGhhdCBoYXZlIG5vdCB5ZXQgc2V0dGxlZCI7Y29uc3QgZXJyUmVsZWFzZWRSZWFkZXJDbG9zZWRQcm9taXNlPQorIlRoaXMgcmVhZGFibGUgc3RyZWFtIHJlYWRlciBoYXMgYmVlbiByZWxlYXNlZCBhbmQgY2Fubm90IGJlIHVzZWQgdG8gbW9uaXRvciB0aGUgc3RyZWFtJ3Mgc3RhdGUiO2NvbnN0IGVyclRtcGxNdXN0QmVGdW5jdGlvbk9yVW5kZWZpbmVkPShuYW1lKT0+YCR7bmFtZX0gbXVzdCBiZSBhIGZ1bmN0aW9uIG9yIHVuZGVmaW5lZGA7Y2xhc3MgUmVhZGFibGVTdHJlYW17Y29uc3RydWN0b3IoKXtjb25zdCB1bmRlcmx5aW5nU291cmNlPWFyZ3VtZW50c1swXT09PXVuZGVmaW5lZD97fTphcmd1bWVudHNbMF07Y29uc3Qgc3RyYXRlZ3k9YXJndW1lbnRzWzFdPT09dW5kZWZpbmVkP3t9OmFyZ3VtZW50c1sxXTtjb25zdCBzaXplPXN0cmF0ZWd5LnNpemU7bGV0IGhpZ2hXYXRlck1hcms9c3RyYXRlZ3kuaGlnaFdhdGVyTWFyaztpZihoaWdoV2F0ZXJNYXJrPT09dW5kZWZpbmVkKWhpZ2hXYXRlck1hcms9MTt0aGlzW19yZWFkYWJsZVN0cmVhbUJpdHNdPTA7UmVhZGFibGVTdHJlYW1TZXRTdGF0ZSh0aGlzLAorU1RBVEVfUkVBREFCTEUpO3RoaXNbX3JlYWRlcl09dW5kZWZpbmVkO3RoaXNbX3N0b3JlZEVycm9yXT11bmRlZmluZWQ7dGhpc1tfY29udHJvbGxlcl09dW5kZWZpbmVkO2NvbnN0IHR5cGU9dW5kZXJseWluZ1NvdXJjZS50eXBlO2NvbnN0IHR5cGVTdHJpbmc9U3RyaW5nKHR5cGUpO2lmKHR5cGVTdHJpbmc9PT0iYnl0ZXMiKXRocm93IG5ldyBSYW5nZUVycm9yKCJieXRlcyB0eXBlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQiKTtlbHNlIGlmKHR5cGUhPT11bmRlZmluZWQpdGhyb3cgbmV3IFJhbmdlRXJyb3Ioc3RyZWFtRXJyb3JzX2ludmFsaWRUeXBlKTt0aGlzW19jb250cm9sbGVyXT1uZXcgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcih0aGlzLHVuZGVybHlpbmdTb3VyY2Usc2l6ZSxoaWdoV2F0ZXJNYXJrLGFyZ3VtZW50c1syXSl9Z2V0IGxvY2tlZCgpe2lmKElzUmVhZGFibGVTdHJlYW0odGhpcyk9PT1mYWxzZSl0aHJvdyBuZXcgVHlwZUVycm9yKHN0cmVhbUVycm9yc19pbGxlZ2FsSW52b2NhdGlvbik7CityZXR1cm4gSXNSZWFkYWJsZVN0cmVhbUxvY2tlZCh0aGlzKX1jYW5jZWwocmVhc29uKXtpZihJc1JlYWRhYmxlU3RyZWFtKHRoaXMpPT09ZmFsc2UpcmV0dXJuIFByb21pc2VfcmVqZWN0KG5ldyBUeXBlRXJyb3Ioc3RyZWFtRXJyb3JzX2lsbGVnYWxJbnZvY2F0aW9uKSk7aWYoSXNSZWFkYWJsZVN0cmVhbUxvY2tlZCh0aGlzKT09PXRydWUpcmV0dXJuIFByb21pc2VfcmVqZWN0KG5ldyBUeXBlRXJyb3IoZXJyQ2FuY2VsTG9ja2VkU3RyZWFtKSk7cmV0dXJuIFJlYWRhYmxlU3RyZWFtQ2FuY2VsKHRoaXMscmVhc29uKX1nZXRSZWFkZXIoe21vZGV9PXt9KXtpZihJc1JlYWRhYmxlU3RyZWFtKHRoaXMpPT09ZmFsc2UpdGhyb3cgbmV3IFR5cGVFcnJvcihzdHJlYW1FcnJvcnNfaWxsZWdhbEludm9jYXRpb24pO2lmKG1vZGU9PT0iYnlvYiIpdGhyb3cgbmV3IFR5cGVFcnJvcihlcnJHZXRSZWFkZXJOb3RCeXRlU3RyZWFtKTtpZihtb2RlPT09dW5kZWZpbmVkKXJldHVybiBBY3F1aXJlUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyKHRoaXMpOwordGhyb3cgbmV3IFJhbmdlRXJyb3IoZXJyR2V0UmVhZGVyQmFkTW9kZSk7fXBpcGVUaHJvdWdoKHt3cml0YWJsZSxyZWFkYWJsZX0sb3B0aW9ucyl7dGhyb3cgbmV3IFR5cGVFcnJvcigicGlwZVRocm91Z2ggbm90IGltcGxlbWVudGVkIik7fXBpcGVUbyhkZXN0LHtwcmV2ZW50Q2xvc2UscHJldmVudEFib3J0LHByZXZlbnRDYW5jZWx9PXt9KXt0aHJvdyBuZXcgVHlwZUVycm9yKCJwaXBlVG8gbm90IGltcGxlbWVudGVkIik7fXRlZSgpe2lmKElzUmVhZGFibGVTdHJlYW0odGhpcyk9PT1mYWxzZSl0aHJvdyBuZXcgVHlwZUVycm9yKHN0cmVhbUVycm9yc19pbGxlZ2FsSW52b2NhdGlvbik7cmV0dXJuIFJlYWRhYmxlU3RyZWFtVGVlKHRoaXMpfX1jbGFzcyBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVye2NvbnN0cnVjdG9yKHN0cmVhbSx1bmRlcmx5aW5nU291cmNlLHNpemUsaGlnaFdhdGVyTWFyayl7aWYoSXNSZWFkYWJsZVN0cmVhbShzdHJlYW0pPT09ZmFsc2UpdGhyb3cgbmV3IFR5cGVFcnJvcihzdHJlYW1FcnJvcnNfaWxsZWdhbENvbnN0cnVjdG9yKTsKK2lmKHN0cmVhbVtfY29udHJvbGxlcl0hPT11bmRlZmluZWQpdGhyb3cgbmV3IFR5cGVFcnJvcihzdHJlYW1FcnJvcnNfaWxsZWdhbENvbnN0cnVjdG9yKTt0aGlzW19jb250cm9sbGVkUmVhZGFibGVTdHJlYW1dPXN0cmVhbTt0aGlzW191bmRlcmx5aW5nU291cmNlXT11bmRlcmx5aW5nU291cmNlO3RoaXNbX3F1ZXVlXT1uZXcgU2ltcGxlUXVldWU7dGhpc1tfdG90YWxRdWV1ZWRTaXplXT0wO3RoaXNbX3JlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJCaXRzXT0wO2lmKGFyZ3VtZW50c1s0XT09PWNyZWF0ZVdpdGhFeHRlcm5hbENvbnRyb2xsZXJTZW50aW5lbCl0aGlzW19yZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQml0c118PUVYVEVSTkFMTFlfQ09OVFJPTExFRDtjb25zdCBub3JtYWxpemVkU3RyYXRlZ3k9VmFsaWRhdGVBbmROb3JtYWxpemVRdWV1aW5nU3RyYXRlZ3koc2l6ZSxoaWdoV2F0ZXJNYXJrKTt0aGlzW19zdHJhdGVneVNpemVdPW5vcm1hbGl6ZWRTdHJhdGVneS5zaXplOwordGhpc1tfc3RyYXRlZ3lIV01dPW5vcm1hbGl6ZWRTdHJhdGVneS5oaWdoV2F0ZXJNYXJrO2NvbnN0IGNvbnRyb2xsZXI9dGhpcztjb25zdCBzdGFydFJlc3VsdD1DYWxsT3JOb29wKHVuZGVybHlpbmdTb3VyY2UsInN0YXJ0Iix0aGlzLCJ1bmRlcmx5aW5nU291cmNlLnN0YXJ0Iik7dGhlblByb21pc2UoUHJvbWlzZV9yZXNvbHZlKHN0YXJ0UmVzdWx0KSwoKT0+e2NvbnRyb2xsZXJbX3JlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJCaXRzXXw9U1RBUlRFRDtSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FsbFB1bGxJZk5lZWRlZChjb250cm9sbGVyKX0sKHIpPT57aWYoUmVhZGFibGVTdHJlYW1HZXRTdGF0ZShzdHJlYW0pPT09U1RBVEVfUkVBREFCTEUpUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9yKGNvbnRyb2xsZXIscil9KX1nZXQgZGVzaXJlZFNpemUoKXtpZihJc1JlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIodGhpcyk9PT1mYWxzZSl0aHJvdyBuZXcgVHlwZUVycm9yKHN0cmVhbUVycm9yc19pbGxlZ2FsSW52b2NhdGlvbik7CityZXR1cm4gUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckdldERlc2lyZWRTaXplKHRoaXMpfWNsb3NlKCl7aWYoSXNSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHRoaXMpPT09ZmFsc2UpdGhyb3cgbmV3IFR5cGVFcnJvcihzdHJlYW1FcnJvcnNfaWxsZWdhbEludm9jYXRpb24pO2NvbnN0IHN0cmVhbT10aGlzW19jb250cm9sbGVkUmVhZGFibGVTdHJlYW1dO2lmKHRoaXNbX3JlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJCaXRzXSZDTE9TRV9SRVFVRVNURUQpdGhyb3cgbmV3IFR5cGVFcnJvcihlcnJDbG9zZUNsb3NlUmVxdWVzdGVkU3RyZWFtKTtjb25zdCBzdGF0ZT1SZWFkYWJsZVN0cmVhbUdldFN0YXRlKHN0cmVhbSk7aWYoc3RhdGU9PT1TVEFURV9FUlJPUkVEKXRocm93IG5ldyBUeXBlRXJyb3IoZXJyQ2xvc2VFcnJvcmVkU3RyZWFtKTtpZihzdGF0ZT09PVNUQVRFX0NMT1NFRCl0aHJvdyBuZXcgVHlwZUVycm9yKGVyckNsb3NlQ2xvc2VkU3RyZWFtKTsKK3JldHVybiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xvc2UodGhpcyl9ZW5xdWV1ZShjaHVuayl7aWYoSXNSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHRoaXMpPT09ZmFsc2UpdGhyb3cgbmV3IFR5cGVFcnJvcihzdHJlYW1FcnJvcnNfaWxsZWdhbEludm9jYXRpb24pO2NvbnN0IHN0cmVhbT10aGlzW19jb250cm9sbGVkUmVhZGFibGVTdHJlYW1dO2lmKHRoaXNbX3JlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJCaXRzXSZDTE9TRV9SRVFVRVNURUQpdGhyb3cgbmV3IFR5cGVFcnJvcihlcnJFbnF1ZXVlQ2xvc2VSZXF1ZXN0ZWRTdHJlYW0pO2NvbnN0IHN0YXRlPVJlYWRhYmxlU3RyZWFtR2V0U3RhdGUoc3RyZWFtKTtpZihzdGF0ZT09PVNUQVRFX0VSUk9SRUQpdGhyb3cgbmV3IFR5cGVFcnJvcihlcnJFbnF1ZXVlRXJyb3JlZFN0cmVhbSk7aWYoc3RhdGU9PT1TVEFURV9DTE9TRUQpdGhyb3cgbmV3IFR5cGVFcnJvcihlcnJFbnF1ZXVlQ2xvc2VkU3RyZWFtKTsKK3JldHVybiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRW5xdWV1ZSh0aGlzLGNodW5rKX1lcnJvcihlKXtpZihJc1JlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIodGhpcyk9PT1mYWxzZSl0aHJvdyBuZXcgVHlwZUVycm9yKHN0cmVhbUVycm9yc19pbGxlZ2FsSW52b2NhdGlvbik7Y29uc3Qgc3RyZWFtPXRoaXNbX2NvbnRyb2xsZWRSZWFkYWJsZVN0cmVhbV07Y29uc3Qgc3RhdGU9UmVhZGFibGVTdHJlYW1HZXRTdGF0ZShzdHJlYW0pO2lmKHN0YXRlPT09U1RBVEVfRVJST1JFRCl0aHJvdyBuZXcgVHlwZUVycm9yKGVyckVycm9yRXJyb3JlZFN0cmVhbSk7aWYoc3RhdGU9PT1TVEFURV9DTE9TRUQpdGhyb3cgbmV3IFR5cGVFcnJvcihlcnJFcnJvckNsb3NlZFN0cmVhbSk7cmV0dXJuIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcih0aGlzLGUpfX1mdW5jdGlvbiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FuY2VsKGNvbnRyb2xsZXIsCityZWFzb24pe2NvbnRyb2xsZXJbX3F1ZXVlXT1uZXcgU2ltcGxlUXVldWU7Y29uc3QgdW5kZXJseWluZ1NvdXJjZT1jb250cm9sbGVyW191bmRlcmx5aW5nU291cmNlXTtyZXR1cm4gUHJvbWlzZUNhbGxPck5vb3AodW5kZXJseWluZ1NvdXJjZSwiY2FuY2VsIixyZWFzb24sInVuZGVybHlpbmdTb3VyY2UuY2FuY2VsIil9ZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlclB1bGwoY29udHJvbGxlcil7Y29uc3Qgc3RyZWFtPWNvbnRyb2xsZXJbX2NvbnRyb2xsZWRSZWFkYWJsZVN0cmVhbV07aWYoY29udHJvbGxlcltfcXVldWVdLmxlbmd0aD4wKXtjb25zdCBjaHVuaz1EZXF1ZXVlVmFsdWUoY29udHJvbGxlcik7aWYoY29udHJvbGxlcltfcmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckJpdHNdJkNMT1NFX1JFUVVFU1RFRCYmY29udHJvbGxlcltfcXVldWVdLmxlbmd0aD09PTApUmVhZGFibGVTdHJlYW1DbG9zZShzdHJlYW0pO2Vsc2UgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNhbGxQdWxsSWZOZWVkZWQoY29udHJvbGxlcik7CityZXR1cm4gUHJvbWlzZV9yZXNvbHZlKENyZWF0ZUl0ZXJSZXN1bHRPYmplY3QoY2h1bmssZmFsc2UpKX1jb25zdCBwZW5kaW5nUHJvbWlzZT1SZWFkYWJsZVN0cmVhbUFkZFJlYWRSZXF1ZXN0KHN0cmVhbSk7UmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNhbGxQdWxsSWZOZWVkZWQoY29udHJvbGxlcik7cmV0dXJuIHBlbmRpbmdQcm9taXNlfWZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtQWRkUmVhZFJlcXVlc3Qoc3RyZWFtKXtjb25zdCBwcm9taXNlPXY4X2NyZWF0ZVByb21pc2UoKTtzdHJlYW1bX3JlYWRlcl1bX3JlYWRSZXF1ZXN0c10ucHVzaChwcm9taXNlKTtyZXR1cm4gcHJvbWlzZX1jbGFzcyBSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXJ7Y29uc3RydWN0b3Ioc3RyZWFtKXtpZihJc1JlYWRhYmxlU3RyZWFtKHN0cmVhbSk9PT1mYWxzZSl0aHJvdyBuZXcgVHlwZUVycm9yKGVyclJlYWRlckNvbnN0cnVjdG9yQmFkQXJndW1lbnQpO2lmKElzUmVhZGFibGVTdHJlYW1Mb2NrZWQoc3RyZWFtKT09PQordHJ1ZSl0aHJvdyBuZXcgVHlwZUVycm9yKGVyclJlYWRlckNvbnN0cnVjdG9yU3RyZWFtQWxyZWFkeUxvY2tlZCk7UmVhZGFibGVTdHJlYW1SZWFkZXJHZW5lcmljSW5pdGlhbGl6ZSh0aGlzLHN0cmVhbSk7dGhpc1tfcmVhZFJlcXVlc3RzXT1uZXcgU2ltcGxlUXVldWV9Z2V0IGNsb3NlZCgpe2lmKElzUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyKHRoaXMpPT09ZmFsc2UpcmV0dXJuIFByb21pc2VfcmVqZWN0KG5ldyBUeXBlRXJyb3Ioc3RyZWFtRXJyb3JzX2lsbGVnYWxJbnZvY2F0aW9uKSk7cmV0dXJuIHRoaXNbX2Nsb3NlZFByb21pc2VdfWNhbmNlbChyZWFzb24pe2lmKElzUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyKHRoaXMpPT09ZmFsc2UpcmV0dXJuIFByb21pc2VfcmVqZWN0KG5ldyBUeXBlRXJyb3Ioc3RyZWFtRXJyb3JzX2lsbGVnYWxJbnZvY2F0aW9uKSk7Y29uc3Qgc3RyZWFtPXRoaXNbX293bmVyUmVhZGFibGVTdHJlYW1dO2lmKHN0cmVhbT09PXVuZGVmaW5lZClyZXR1cm4gUHJvbWlzZV9yZWplY3QobmV3IFR5cGVFcnJvcihlcnJDYW5jZWxSZWxlYXNlZFJlYWRlcikpOworcmV0dXJuIFJlYWRhYmxlU3RyZWFtUmVhZGVyR2VuZXJpY0NhbmNlbCh0aGlzLHJlYXNvbil9cmVhZCgpe2lmKElzUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyKHRoaXMpPT09ZmFsc2UpcmV0dXJuIFByb21pc2VfcmVqZWN0KG5ldyBUeXBlRXJyb3Ioc3RyZWFtRXJyb3JzX2lsbGVnYWxJbnZvY2F0aW9uKSk7aWYodGhpc1tfb3duZXJSZWFkYWJsZVN0cmVhbV09PT11bmRlZmluZWQpcmV0dXJuIFByb21pc2VfcmVqZWN0KG5ldyBUeXBlRXJyb3IoZXJyUmVhZFJlbGVhc2VkUmVhZGVyKSk7cmV0dXJuIFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlclJlYWQodGhpcyl9cmVsZWFzZUxvY2soKXtpZihJc1JlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcih0aGlzKT09PWZhbHNlKXRocm93IG5ldyBUeXBlRXJyb3Ioc3RyZWFtRXJyb3JzX2lsbGVnYWxJbnZvY2F0aW9uKTtjb25zdCBzdHJlYW09dGhpc1tfb3duZXJSZWFkYWJsZVN0cmVhbV07aWYoc3RyZWFtPT09dW5kZWZpbmVkKXJldHVybiB1bmRlZmluZWQ7CitpZih0aGlzW19yZWFkUmVxdWVzdHNdLmxlbmd0aD4wKXRocm93IG5ldyBUeXBlRXJyb3IoZXJyUmVsZWFzZVJlYWRlcldpdGhQZW5kaW5nUmVhZCk7UmVhZGFibGVTdHJlYW1SZWFkZXJHZW5lcmljUmVsZWFzZSh0aGlzKX19ZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1SZWFkZXJHZW5lcmljQ2FuY2VsKHJlYWRlcixyZWFzb24pe3JldHVybiBSZWFkYWJsZVN0cmVhbUNhbmNlbChyZWFkZXJbX293bmVyUmVhZGFibGVTdHJlYW1dLHJlYXNvbil9ZnVuY3Rpb24gQWNxdWlyZVJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcihzdHJlYW0pe3JldHVybiBuZXcgUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyKHN0cmVhbSl9ZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1DYW5jZWwoc3RyZWFtLHJlYXNvbil7c3RyZWFtW19yZWFkYWJsZVN0cmVhbUJpdHNdfD1ESVNUVVJCRUQ7Y29uc3Qgc3RhdGU9UmVhZGFibGVTdHJlYW1HZXRTdGF0ZShzdHJlYW0pO2lmKHN0YXRlPT09U1RBVEVfQ0xPU0VEKXJldHVybiBQcm9taXNlX3Jlc29sdmUodW5kZWZpbmVkKTsKK2lmKHN0YXRlPT09U1RBVEVfRVJST1JFRClyZXR1cm4gUHJvbWlzZV9yZWplY3Qoc3RyZWFtW19zdG9yZWRFcnJvcl0pO1JlYWRhYmxlU3RyZWFtQ2xvc2Uoc3RyZWFtKTtjb25zdCBzb3VyY2VDYW5jZWxQcm9taXNlPVJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDYW5jZWwoc3RyZWFtW19jb250cm9sbGVyXSxyZWFzb24pO3JldHVybiB0aGVuUHJvbWlzZShzb3VyY2VDYW5jZWxQcm9taXNlLCgpPT51bmRlZmluZWQpfWZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbG9zZShjb250cm9sbGVyKXtjb25zdCBzdHJlYW09Y29udHJvbGxlcltfY29udHJvbGxlZFJlYWRhYmxlU3RyZWFtXTtjb250cm9sbGVyW19yZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQml0c118PUNMT1NFX1JFUVVFU1RFRDtpZihjb250cm9sbGVyW19xdWV1ZV0ubGVuZ3RoPT09MClSZWFkYWJsZVN0cmVhbUNsb3NlKHN0cmVhbSl9ZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1GdWxmaWxsUmVhZFJlcXVlc3Qoc3RyZWFtLAorY2h1bmssZG9uZSl7Y29uc3QgcmVhZGVyPXN0cmVhbVtfcmVhZGVyXTtjb25zdCByZWFkUmVxdWVzdD1zdHJlYW1bX3JlYWRlcl1bX3JlYWRSZXF1ZXN0c10uc2hpZnQoKTt2OF9yZXNvbHZlUHJvbWlzZShyZWFkUmVxdWVzdCxDcmVhdGVJdGVyUmVzdWx0T2JqZWN0KGNodW5rLGRvbmUpKX1mdW5jdGlvbiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRW5xdWV1ZShjb250cm9sbGVyLGNodW5rKXtjb25zdCBzdHJlYW09Y29udHJvbGxlcltfY29udHJvbGxlZFJlYWRhYmxlU3RyZWFtXTtpZihJc1JlYWRhYmxlU3RyZWFtTG9ja2VkKHN0cmVhbSk9PT10cnVlJiZSZWFkYWJsZVN0cmVhbUdldE51bVJlYWRSZXF1ZXN0cyhzdHJlYW0pPjApUmVhZGFibGVTdHJlYW1GdWxmaWxsUmVhZFJlcXVlc3Qoc3RyZWFtLGNodW5rLGZhbHNlKTtlbHNle2xldCBjaHVua1NpemU9MTtjb25zdCBzdHJhdGVneVNpemU9Y29udHJvbGxlcltfc3RyYXRlZ3lTaXplXTtpZihzdHJhdGVneVNpemUhPT0KK3VuZGVmaW5lZCl0cnl7Y2h1bmtTaXplPXN0cmF0ZWd5U2l6ZShjaHVuayl9Y2F0Y2goY2h1bmtTaXplRSl7aWYoUmVhZGFibGVTdHJlYW1HZXRTdGF0ZShzdHJlYW0pPT09U1RBVEVfUkVBREFCTEUpUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9yKGNvbnRyb2xsZXIsY2h1bmtTaXplRSk7dGhyb3cgY2h1bmtTaXplRTt9dHJ5e0VucXVldWVWYWx1ZVdpdGhTaXplKGNvbnRyb2xsZXIsY2h1bmssY2h1bmtTaXplKX1jYXRjaChlbnF1ZXVlRSl7aWYoUmVhZGFibGVTdHJlYW1HZXRTdGF0ZShzdHJlYW0pPT09U1RBVEVfUkVBREFCTEUpUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9yKGNvbnRyb2xsZXIsZW5xdWV1ZUUpO3Rocm93IGVucXVldWVFO319UmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNhbGxQdWxsSWZOZWVkZWQoY29udHJvbGxlcil9ZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1HZXRTdGF0ZShzdHJlYW0pe3JldHVybihzdHJlYW1bX3JlYWRhYmxlU3RyZWFtQml0c10mCitTVEFURV9NQVNLKT4+U1RBVEVfQklUU19PRkZTRVR9ZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1TZXRTdGF0ZShzdHJlYW0sc3RhdGUpe3N0cmVhbVtfcmVhZGFibGVTdHJlYW1CaXRzXT1zdHJlYW1bX3JlYWRhYmxlU3RyZWFtQml0c10mflNUQVRFX01BU0t8c3RhdGU8PFNUQVRFX0JJVFNfT0ZGU0VUfWZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcihjb250cm9sbGVyLGUpe2NvbnRyb2xsZXJbX3F1ZXVlXT1uZXcgU2ltcGxlUXVldWU7Y29uc3Qgc3RyZWFtPWNvbnRyb2xsZXJbX2NvbnRyb2xsZWRSZWFkYWJsZVN0cmVhbV07UmVhZGFibGVTdHJlYW1FcnJvcihzdHJlYW0sZSl9ZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1FcnJvcihzdHJlYW0sZSl7c3RyZWFtW19zdG9yZWRFcnJvcl09ZTtSZWFkYWJsZVN0cmVhbVNldFN0YXRlKHN0cmVhbSxTVEFURV9FUlJPUkVEKTtjb25zdCByZWFkZXI9c3RyZWFtW19yZWFkZXJdO2lmKHJlYWRlcj09PXVuZGVmaW5lZClyZXR1cm4gdW5kZWZpbmVkOworaWYoSXNSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIocmVhZGVyKT09PXRydWUpe3JlYWRlcltfcmVhZFJlcXVlc3RzXS5mb3JFYWNoKChyZXF1ZXN0KT0+djhfcmVqZWN0UHJvbWlzZShyZXF1ZXN0LGUpKTtyZWFkZXJbX3JlYWRSZXF1ZXN0c109bmV3IFNpbXBsZVF1ZXVlfXY4X3JlamVjdFByb21pc2UocmVhZGVyW19jbG9zZWRQcm9taXNlXSxlKTt2OF9tYXJrUHJvbWlzZUFzSGFuZGxlZChyZWFkZXJbX2Nsb3NlZFByb21pc2VdKX1mdW5jdGlvbiBSZWFkYWJsZVN0cmVhbUNsb3NlKHN0cmVhbSl7UmVhZGFibGVTdHJlYW1TZXRTdGF0ZShzdHJlYW0sU1RBVEVfQ0xPU0VEKTtjb25zdCByZWFkZXI9c3RyZWFtW19yZWFkZXJdO2lmKHJlYWRlcj09PXVuZGVmaW5lZClyZXR1cm4gdW5kZWZpbmVkO2lmKElzUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyKHJlYWRlcik9PT10cnVlKXtyZWFkZXJbX3JlYWRSZXF1ZXN0c10uZm9yRWFjaCgocmVxdWVzdCk9PnY4X3Jlc29sdmVQcm9taXNlKHJlcXVlc3QsCitDcmVhdGVJdGVyUmVzdWx0T2JqZWN0KHVuZGVmaW5lZCx0cnVlKSkpO3JlYWRlcltfcmVhZFJlcXVlc3RzXT1uZXcgU2ltcGxlUXVldWV9djhfcmVzb2x2ZVByb21pc2UocmVhZGVyW19jbG9zZWRQcm9taXNlXSx1bmRlZmluZWQpfWZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXREZXNpcmVkU2l6ZShjb250cm9sbGVyKXtjb25zdCBzdHJlYW09Y29udHJvbGxlcltfY29udHJvbGxlZFJlYWRhYmxlU3RyZWFtXTtjb25zdCBzdGF0ZT1SZWFkYWJsZVN0cmVhbUdldFN0YXRlKHN0cmVhbSk7aWYoc3RhdGU9PT1TVEFURV9DTE9TRUQpcmV0dXJuIDA7ZWxzZSBpZihzdGF0ZT09PVNUQVRFX0VSUk9SRUQpcmV0dXJuIG51bGw7Y29uc3QgcXVldWVTaXplPUdldFRvdGFsUXVldWVTaXplKGNvbnRyb2xsZXIpO3JldHVybiBjb250cm9sbGVyW19zdHJhdGVneUhXTV0tcXVldWVTaXplfWZ1bmN0aW9uIElzUmVhZGFibGVTdHJlYW0oeCl7cmV0dXJuIGhhc093blByb3BlcnR5KHgsCitfY29udHJvbGxlcil9ZnVuY3Rpb24gSXNSZWFkYWJsZVN0cmVhbURpc3R1cmJlZChzdHJlYW0pe3JldHVybiBzdHJlYW1bX3JlYWRhYmxlU3RyZWFtQml0c10mRElTVFVSQkVEfWZ1bmN0aW9uIElzUmVhZGFibGVTdHJlYW1Mb2NrZWQoc3RyZWFtKXtyZXR1cm4gc3RyZWFtW19yZWFkZXJdIT09dW5kZWZpbmVkfWZ1bmN0aW9uIElzUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcih4KXtyZXR1cm4gaGFzT3duUHJvcGVydHkoeCxfY29udHJvbGxlZFJlYWRhYmxlU3RyZWFtKX1mdW5jdGlvbiBJc1JlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcih4KXtyZXR1cm4gaGFzT3duUHJvcGVydHkoeCxfcmVhZFJlcXVlc3RzKX1mdW5jdGlvbiBJc1JlYWRhYmxlU3RyZWFtUmVhZGFibGUoc3RyZWFtKXtyZXR1cm4gUmVhZGFibGVTdHJlYW1HZXRTdGF0ZShzdHJlYW0pPT09U1RBVEVfUkVBREFCTEV9ZnVuY3Rpb24gSXNSZWFkYWJsZVN0cmVhbUNsb3NlZChzdHJlYW0pe3JldHVybiBSZWFkYWJsZVN0cmVhbUdldFN0YXRlKHN0cmVhbSk9PT0KK1NUQVRFX0NMT1NFRH1mdW5jdGlvbiBJc1JlYWRhYmxlU3RyZWFtRXJyb3JlZChzdHJlYW0pe3JldHVybiBSZWFkYWJsZVN0cmVhbUdldFN0YXRlKHN0cmVhbSk9PT1TVEFURV9FUlJPUkVEfWZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtUmVhZGVyR2VuZXJpY0luaXRpYWxpemUocmVhZGVyLHN0cmVhbSl7Y29uc3QgY29udHJvbGxlcj1zdHJlYW1bX2NvbnRyb2xsZXJdO2lmKGNvbnRyb2xsZXJbX3JlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJCaXRzXSZFWFRFUk5BTExZX0NPTlRST0xMRUQpe2NvbnN0IHVuZGVybHlpbmdTb3VyY2U9Y29udHJvbGxlcltfdW5kZXJseWluZ1NvdXJjZV07Y2FsbEZ1bmN0aW9uKHVuZGVybHlpbmdTb3VyY2Uubm90aWZ5TG9ja0FjcXVpcmVkLHVuZGVybHlpbmdTb3VyY2UpfXJlYWRlcltfb3duZXJSZWFkYWJsZVN0cmVhbV09c3RyZWFtO3N0cmVhbVtfcmVhZGVyXT1yZWFkZXI7c3dpdGNoKFJlYWRhYmxlU3RyZWFtR2V0U3RhdGUoc3RyZWFtKSl7Y2FzZSBTVEFURV9SRUFEQUJMRTpyZWFkZXJbX2Nsb3NlZFByb21pc2VdPQordjhfY3JlYXRlUHJvbWlzZSgpO2JyZWFrO2Nhc2UgU1RBVEVfQ0xPU0VEOnJlYWRlcltfY2xvc2VkUHJvbWlzZV09UHJvbWlzZV9yZXNvbHZlKHVuZGVmaW5lZCk7YnJlYWs7Y2FzZSBTVEFURV9FUlJPUkVEOnJlYWRlcltfY2xvc2VkUHJvbWlzZV09UHJvbWlzZV9yZWplY3Qoc3RyZWFtW19zdG9yZWRFcnJvcl0pO3Y4X21hcmtQcm9taXNlQXNIYW5kbGVkKHJlYWRlcltfY2xvc2VkUHJvbWlzZV0pO2JyZWFrfX1mdW5jdGlvbiBSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNSZWxlYXNlKHJlYWRlcil7Y29uc3QgY29udHJvbGxlcj1yZWFkZXJbX293bmVyUmVhZGFibGVTdHJlYW1dW19jb250cm9sbGVyXTtpZihjb250cm9sbGVyW19yZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQml0c10mRVhURVJOQUxMWV9DT05UUk9MTEVEKXtjb25zdCB1bmRlcmx5aW5nU291cmNlPWNvbnRyb2xsZXJbX3VuZGVybHlpbmdTb3VyY2VdO2NhbGxGdW5jdGlvbih1bmRlcmx5aW5nU291cmNlLm5vdGlmeUxvY2tSZWxlYXNlZCwKK3VuZGVybHlpbmdTb3VyY2UpfWlmKFJlYWRhYmxlU3RyZWFtR2V0U3RhdGUocmVhZGVyW19vd25lclJlYWRhYmxlU3RyZWFtXSk9PT1TVEFURV9SRUFEQUJMRSl2OF9yZWplY3RQcm9taXNlKHJlYWRlcltfY2xvc2VkUHJvbWlzZV0sbmV3IFR5cGVFcnJvcihlcnJSZWxlYXNlZFJlYWRlckNsb3NlZFByb21pc2UpKTtlbHNlIHJlYWRlcltfY2xvc2VkUHJvbWlzZV09UHJvbWlzZV9yZWplY3QobmV3IFR5cGVFcnJvcihlcnJSZWxlYXNlZFJlYWRlckNsb3NlZFByb21pc2UpKTt2OF9tYXJrUHJvbWlzZUFzSGFuZGxlZChyZWFkZXJbX2Nsb3NlZFByb21pc2VdKTtyZWFkZXJbX293bmVyUmVhZGFibGVTdHJlYW1dW19yZWFkZXJdPXVuZGVmaW5lZDtyZWFkZXJbX293bmVyUmVhZGFibGVTdHJlYW1dPXVuZGVmaW5lZH1mdW5jdGlvbiBSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXJSZWFkKHJlYWRlcil7Y29uc3Qgc3RyZWFtPXJlYWRlcltfb3duZXJSZWFkYWJsZVN0cmVhbV07c3RyZWFtW19yZWFkYWJsZVN0cmVhbUJpdHNdfD0KK0RJU1RVUkJFRDtpZihSZWFkYWJsZVN0cmVhbUdldFN0YXRlKHN0cmVhbSk9PT1TVEFURV9DTE9TRUQpcmV0dXJuIFByb21pc2VfcmVzb2x2ZShDcmVhdGVJdGVyUmVzdWx0T2JqZWN0KHVuZGVmaW5lZCx0cnVlKSk7aWYoUmVhZGFibGVTdHJlYW1HZXRTdGF0ZShzdHJlYW0pPT09U1RBVEVfRVJST1JFRClyZXR1cm4gUHJvbWlzZV9yZWplY3Qoc3RyZWFtW19zdG9yZWRFcnJvcl0pO3JldHVybiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyUHVsbChzdHJlYW1bX2NvbnRyb2xsZXJdKX1mdW5jdGlvbiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FsbFB1bGxJZk5lZWRlZChjb250cm9sbGVyKXtjb25zdCBzaG91bGRQdWxsPVJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJTaG91bGRDYWxsUHVsbChjb250cm9sbGVyKTtpZihzaG91bGRQdWxsPT09ZmFsc2UpcmV0dXJuIHVuZGVmaW5lZDtpZihjb250cm9sbGVyW19yZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQml0c10mCitQVUxMSU5HKXtjb250cm9sbGVyW19yZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQml0c118PVBVTExfQUdBSU47cmV0dXJuIHVuZGVmaW5lZH1jb250cm9sbGVyW19yZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQml0c118PVBVTExJTkc7Y29uc3QgdW5kZXJseWluZ1NvdXJjZT1jb250cm9sbGVyW191bmRlcmx5aW5nU291cmNlXTtjb25zdCBwdWxsUHJvbWlzZT1Qcm9taXNlQ2FsbE9yTm9vcCh1bmRlcmx5aW5nU291cmNlLCJwdWxsIixjb250cm9sbGVyLCJ1bmRlcmx5aW5nU291cmNlLnB1bGwiKTt0aGVuUHJvbWlzZShwdWxsUHJvbWlzZSwoKT0+e2NvbnRyb2xsZXJbX3JlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJCaXRzXSY9flBVTExJTkc7aWYoY29udHJvbGxlcltfcmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckJpdHNdJlBVTExfQUdBSU4pe2NvbnRyb2xsZXJbX3JlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJCaXRzXSY9flBVTExfQUdBSU47CitSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FsbFB1bGxJZk5lZWRlZChjb250cm9sbGVyKX19LChlKT0+e2lmKFJlYWRhYmxlU3RyZWFtR2V0U3RhdGUoY29udHJvbGxlcltfY29udHJvbGxlZFJlYWRhYmxlU3RyZWFtXSk9PT1TVEFURV9SRUFEQUJMRSlSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRXJyb3IoY29udHJvbGxlcixlKX0pfWZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJTaG91bGRDYWxsUHVsbChjb250cm9sbGVyKXtjb25zdCBzdHJlYW09Y29udHJvbGxlcltfY29udHJvbGxlZFJlYWRhYmxlU3RyZWFtXTtjb25zdCBzdGF0ZT1SZWFkYWJsZVN0cmVhbUdldFN0YXRlKHN0cmVhbSk7aWYoc3RhdGU9PT1TVEFURV9DTE9TRUR8fHN0YXRlPT09U1RBVEVfRVJST1JFRClyZXR1cm4gZmFsc2U7aWYoY29udHJvbGxlcltfcmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckJpdHNdJkNMT1NFX1JFUVVFU1RFRClyZXR1cm4gZmFsc2U7CitpZighKGNvbnRyb2xsZXJbX3JlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJCaXRzXSZTVEFSVEVEKSlyZXR1cm4gZmFsc2U7aWYoSXNSZWFkYWJsZVN0cmVhbUxvY2tlZChzdHJlYW0pPT09dHJ1ZSYmUmVhZGFibGVTdHJlYW1HZXROdW1SZWFkUmVxdWVzdHMoc3RyZWFtKT4wKXJldHVybiB0cnVlO2NvbnN0IGRlc2lyZWRTaXplPVJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXREZXNpcmVkU2l6ZShjb250cm9sbGVyKTtpZihkZXNpcmVkU2l6ZT4wKXJldHVybiB0cnVlO3JldHVybiBmYWxzZX1mdW5jdGlvbiBSZWFkYWJsZVN0cmVhbUdldE51bVJlYWRSZXF1ZXN0cyhzdHJlYW0pe2NvbnN0IHJlYWRlcj1zdHJlYW1bX3JlYWRlcl07Y29uc3QgcmVhZFJlcXVlc3RzPXJlYWRlcltfcmVhZFJlcXVlc3RzXTtyZXR1cm4gcmVhZFJlcXVlc3RzLmxlbmd0aH1mdW5jdGlvbiBSZWFkYWJsZVN0cmVhbVRlZShzdHJlYW0pe2NvbnN0IHJlYWRlcj1BY3F1aXJlUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyKHN0cmVhbSk7CitsZXQgY2xvc2VkT3JFcnJvcmVkPWZhbHNlO2xldCBjYW5jZWxlZDE9ZmFsc2U7bGV0IGNhbmNlbGVkMj1mYWxzZTtsZXQgcmVhc29uMTtsZXQgcmVhc29uMjtsZXQgcHJvbWlzZT12OF9jcmVhdGVQcm9taXNlKCk7Y29uc3QgYnJhbmNoMVN0cmVhbT1uZXcgUmVhZGFibGVTdHJlYW0oe3B1bGwsY2FuY2VsOmNhbmNlbDF9KTtjb25zdCBicmFuY2gyU3RyZWFtPW5ldyBSZWFkYWJsZVN0cmVhbSh7cHVsbCxjYW5jZWw6Y2FuY2VsMn0pO2NvbnN0IGJyYW5jaDE9YnJhbmNoMVN0cmVhbVtfY29udHJvbGxlcl07Y29uc3QgYnJhbmNoMj1icmFuY2gyU3RyZWFtW19jb250cm9sbGVyXTt0aGVuUHJvbWlzZShyZWFkZXJbX2Nsb3NlZFByb21pc2VdLHVuZGVmaW5lZCxmdW5jdGlvbihyKXtpZihjbG9zZWRPckVycm9yZWQ9PT10cnVlKXJldHVybjtSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRXJyb3IoYnJhbmNoMSxyKTtSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRXJyb3IoYnJhbmNoMiwKK3IpO2Nsb3NlZE9yRXJyb3JlZD10cnVlfSk7cmV0dXJuW2JyYW5jaDFTdHJlYW0sYnJhbmNoMlN0cmVhbV07ZnVuY3Rpb24gcHVsbCgpe3JldHVybiB0aGVuUHJvbWlzZShSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXJSZWFkKHJlYWRlciksZnVuY3Rpb24ocmVzdWx0KXtjb25zdCB2YWx1ZT1yZXN1bHQudmFsdWU7Y29uc3QgZG9uZT1yZXN1bHQuZG9uZTtpZihkb25lPT09dHJ1ZSYmY2xvc2VkT3JFcnJvcmVkPT09ZmFsc2Upe2lmKGNhbmNlbGVkMT09PWZhbHNlKVJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbG9zZShicmFuY2gxKTtpZihjYW5jZWxlZDI9PT1mYWxzZSlSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xvc2UoYnJhbmNoMik7Y2xvc2VkT3JFcnJvcmVkPXRydWV9aWYoY2xvc2VkT3JFcnJvcmVkPT09dHJ1ZSlyZXR1cm47aWYoY2FuY2VsZWQxPT09ZmFsc2UpUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVucXVldWUoYnJhbmNoMSx2YWx1ZSk7CitpZihjYW5jZWxlZDI9PT1mYWxzZSlSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRW5xdWV1ZShicmFuY2gyLHZhbHVlKX0pfWZ1bmN0aW9uIGNhbmNlbDEocmVhc29uKXtjYW5jZWxlZDE9dHJ1ZTtyZWFzb24xPXJlYXNvbjtpZihjYW5jZWxlZDI9PT10cnVlKXtjb25zdCBjb21wb3NpdGVSZWFzb249W3JlYXNvbjEscmVhc29uMl07Y29uc3QgY2FuY2VsUmVzdWx0PVJlYWRhYmxlU3RyZWFtQ2FuY2VsKHN0cmVhbSxjb21wb3NpdGVSZWFzb24pO3Y4X3Jlc29sdmVQcm9taXNlKHByb21pc2UsY2FuY2VsUmVzdWx0KX1yZXR1cm4gcHJvbWlzZX1mdW5jdGlvbiBjYW5jZWwyKHJlYXNvbil7Y2FuY2VsZWQyPXRydWU7cmVhc29uMj1yZWFzb247aWYoY2FuY2VsZWQxPT09dHJ1ZSl7Y29uc3QgY29tcG9zaXRlUmVhc29uPVtyZWFzb24xLHJlYXNvbjJdO2NvbnN0IGNhbmNlbFJlc3VsdD1SZWFkYWJsZVN0cmVhbUNhbmNlbChzdHJlYW0sY29tcG9zaXRlUmVhc29uKTt2OF9yZXNvbHZlUHJvbWlzZShwcm9taXNlLAorY2FuY2VsUmVzdWx0KX1yZXR1cm4gcHJvbWlzZX19ZnVuY3Rpb24gRGVxdWV1ZVZhbHVlKGNvbnRyb2xsZXIpe2NvbnN0IHJlc3VsdD1jb250cm9sbGVyW19xdWV1ZV0uc2hpZnQoKTtjb250cm9sbGVyW190b3RhbFF1ZXVlZFNpemVdLT1yZXN1bHQuc2l6ZTtyZXR1cm4gcmVzdWx0LnZhbHVlfWZ1bmN0aW9uIEVucXVldWVWYWx1ZVdpdGhTaXplKGNvbnRyb2xsZXIsdmFsdWUsc2l6ZSl7c2l6ZT1OdW1iZXIoc2l6ZSk7aWYoTnVtYmVyX2lzTmFOKHNpemUpfHxzaXplPT09K0luZmluaXR5fHxzaXplPDApdGhyb3cgbmV3IFJhbmdlRXJyb3Ioc3RyZWFtRXJyb3JzX2ludmFsaWRTaXplKTtjb250cm9sbGVyW190b3RhbFF1ZXVlZFNpemVdKz1zaXplO2NvbnRyb2xsZXJbX3F1ZXVlXS5wdXNoKHt2YWx1ZSxzaXplfSl9ZnVuY3Rpb24gR2V0VG90YWxRdWV1ZVNpemUoY29udHJvbGxlcil7cmV0dXJuIGNvbnRyb2xsZXJbX3RvdGFsUXVldWVkU2l6ZV19ZnVuY3Rpb24gVmFsaWRhdGVBbmROb3JtYWxpemVRdWV1aW5nU3RyYXRlZ3koc2l6ZSwKK2hpZ2hXYXRlck1hcmspe2lmKHNpemUhPT11bmRlZmluZWQmJnR5cGVvZiBzaXplIT09ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKHN0cmVhbUVycm9yc19zaXplTm90QUZ1bmN0aW9uKTtoaWdoV2F0ZXJNYXJrPU51bWJlcihoaWdoV2F0ZXJNYXJrKTtpZihOdW1iZXJfaXNOYU4oaGlnaFdhdGVyTWFyaykpdGhyb3cgbmV3IFJhbmdlRXJyb3Ioc3RyZWFtRXJyb3JzX2ludmFsaWRIV00pO2lmKGhpZ2hXYXRlck1hcms8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihzdHJlYW1FcnJvcnNfaW52YWxpZEhXTSk7cmV0dXJue3NpemUsaGlnaFdhdGVyTWFya319ZnVuY3Rpb24gQ2FsbE9yTm9vcChPLFAsYXJnLG5hbWVGb3JFcnJvcil7Y29uc3QgbWV0aG9kPU9bUF07aWYobWV0aG9kPT09dW5kZWZpbmVkKXJldHVybiB1bmRlZmluZWQ7aWYodHlwZW9mIG1ldGhvZCE9PSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcihlcnJUbXBsTXVzdEJlRnVuY3Rpb25PclVuZGVmaW5lZChuYW1lRm9yRXJyb3IpKTsKK3JldHVybiBjYWxsRnVuY3Rpb24obWV0aG9kLE8sYXJnKX1mdW5jdGlvbiBQcm9taXNlQ2FsbE9yTm9vcChPLFAsYXJnLG5hbWVGb3JFcnJvcil7bGV0IG1ldGhvZDt0cnl7bWV0aG9kPU9bUF19Y2F0Y2gobWV0aG9kRSl7cmV0dXJuIFByb21pc2VfcmVqZWN0KG1ldGhvZEUpfWlmKG1ldGhvZD09PXVuZGVmaW5lZClyZXR1cm4gUHJvbWlzZV9yZXNvbHZlKHVuZGVmaW5lZCk7aWYodHlwZW9mIG1ldGhvZCE9PSJmdW5jdGlvbiIpcmV0dXJuIFByb21pc2VfcmVqZWN0KG5ldyBUeXBlRXJyb3IoZXJyVG1wbE11c3RCZUZ1bmN0aW9uT3JVbmRlZmluZWQobmFtZUZvckVycm9yKSkpO3RyeXtyZXR1cm4gUHJvbWlzZV9yZXNvbHZlKGNhbGxGdW5jdGlvbihtZXRob2QsTyxhcmcpKX1jYXRjaChlKXtyZXR1cm4gUHJvbWlzZV9yZWplY3QoZSl9fWZ1bmN0aW9uIENyZWF0ZUl0ZXJSZXN1bHRPYmplY3QodmFsdWUsZG9uZSl7cmV0dXJue3ZhbHVlLGRvbmV9fWRlZmluZVByb3BlcnR5KGdsb2JhbCwKKyJSZWFkYWJsZVN0cmVhbSIse3ZhbHVlOlJlYWRhYmxlU3RyZWFtLGVudW1lcmFibGU6ZmFsc2UsY29uZmlndXJhYmxlOnRydWUsd3JpdGFibGU6dHJ1ZX0pfSkodGhpcyk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zdHJlYW1zL3JlYWRhYmxlX3N0cmVhbS5qcyBiL3NyYy9jb2JhbHQvc3RyZWFtcy9yZWFkYWJsZV9zdHJlYW0uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk0M2Y4OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvc3RyZWFtcy9yZWFkYWJsZV9zdHJlYW0uanMKQEAgLTAsMCArMSwxMDgzIEBACisvLyA9PUNsb3N1cmVDb21waWxlcj09CisvLyBAb3V0cHV0X2ZpbGVfbmFtZSByZWFkYWJsZV9zdHJlYW0uanMKKy8vIEBjb21waWxhdGlvbl9sZXZlbCBXSElURVNQQUNFX09OTFkKKy8vIEBsYW5ndWFnZV9vdXQgRVM2X1NUUklDVAorLy8gPT0vQ2xvc3VyZUNvbXBpbGVyPT0KKworLy8gQ29weXJpZ2h0IDIwMTUgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisoZnVuY3Rpb24oZ2xvYmFsKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICAvLyBNaW1pYyBmdW5jdGlvbmFsaXR5IHByb3ZpZGVkIHRvIHY4IGV4dHJhcy4KKyAgY29uc3QgdjhfSW50ZXJuYWxQYWNrZWRBcnJheSA9IGdsb2JhbC5BcnJheTsKKworICBmdW5jdGlvbiB2OF9jcmVhdGVQcml2YXRlU3ltYm9sKHgpIHsKKyAgICByZXR1cm4gU3ltYm9sKHgpOworICB9CisKKyAgZnVuY3Rpb24gdjhfc2ltcGxlQmluZChmbiwgb2JqKSB7CisgICAgcmV0dXJuIGZuLmJpbmQob2JqKTsKKyAgfQorCisgIGNvbnN0IGFycmF5U2xpY2UgPSBnbG9iYWwuQXJyYXkucHJvdG90eXBlLnNsaWNlOworICBmdW5jdGlvbiB2OF91bmN1cnJ5VGhpcyhmbikgeworICAgIHJldHVybiBmdW5jdGlvbihvYmopIHsKKyAgICAgIHJldHVybiBmbi5hcHBseShvYmosIGFycmF5U2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKTsKKyAgICB9CisgIH0KKworICBjb25zdCB2OF9Qcm9taXNlQmFzZSA9IGdsb2JhbC5Qcm9taXNlOworICBjb25zdCBfcHJvbWlzZVJlc29sdmUgPSB2OF9jcmVhdGVQcml2YXRlU3ltYm9sKCdbW1Jlc29sdmVdXScpOworICBjb25zdCBfcHJvbWlzZVJlamVjdCA9IHY4X2NyZWF0ZVByaXZhdGVTeW1ib2woJ1tbUmVqZWN0XV0nKTsKKworICBmdW5jdGlvbiB2OF9Qcm9taXNlKCkgeworICAgIHZhciB0aGF0ID0gdGhpczsKKyAgICB2OF9Qcm9taXNlQmFzZS5jYWxsKHRoaXMsIGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgeworICAgICAgdGhhdFtfcHJvbWlzZVJlc29sdmVdID0gcmVzb2x2ZTsKKyAgICAgIHRoYXRbX3Byb21pc2VSZWplY3RdID0gcmVqZWN0OworICAgIH0pOworICB9CisKKyAgdjhfUHJvbWlzZS5wcm90b3R5cGUgPSB2OF9Qcm9taXNlQmFzZS5wcm90b3R5cGU7CisKKyAgZnVuY3Rpb24gdjhfY3JlYXRlUHJvbWlzZSgpIHsKKyAgICByZXR1cm4gbmV3IHY4X1Byb21pc2UoKTsKKyAgfQorCisgIGZ1bmN0aW9uIHY4X2lzUHJvbWlzZShvYmopIHsKKyAgICByZXR1cm4gb2JqIGluc3RhbmNlb2YgdjhfUHJvbWlzZTsKKyAgfQorCisgIGZ1bmN0aW9uIHY4X3Jlc29sdmVQcm9taXNlKHByb21pc2UsIHZhbHVlKSB7CisgICAgcHJvbWlzZVtfcHJvbWlzZVJlc29sdmVdKHZhbHVlKTsKKyAgfQorCisgIGZ1bmN0aW9uIHY4X3JlamVjdFByb21pc2UocHJvbWlzZSwgcmVhc29uKSB7CisgICAgcHJvbWlzZVtfcHJvbWlzZVJlamVjdF0ocmVhc29uKTsKKyAgfQorCisgIGZ1bmN0aW9uIHY4X21hcmtQcm9taXNlQXNIYW5kbGVkKHByb21pc2UpIHsKKyAgICB0cnkgeworICAgICAgdGhlblByb21pc2UocHJvbWlzZSwgdW5kZWZpbmVkLCAoKSA9PiB7fSk7CisgICAgfSBjYXRjaChlcnJvcikgeworICAgIH0KKyAgfQorCisgIC8qIFNpbXBsZVF1ZXVlLmpzOiBiZWdpbiAqLworICAvLyBTaW1wbGUgcXVldWUgc3RydWN0dXJlLiBBdm9pZHMgc2NhbGFiaWxpdHkgaXNzdWVzIHdpdGggdXNpbmcKKyAgLy8gSW50ZXJuYWxQYWNrZWRBcnJheSBkaXJlY3RseSBieSB1c2luZyBtdWx0aXBsZSBhcnJheXMgaW4gYSBsaW5rZWQgbGlzdCBhbmQKKyAgLy8ga2VlcGluZyB0aGUgYXJyYXkgc2l6ZSBib3VuZGVkLgorICBjb25zdCBRVUVVRV9NQVhfQVJSQVlfU0laRSA9IDE2Mzg0OworICBjbGFzcyBTaW1wbGVRdWV1ZSB7CisgICAgY29uc3RydWN0b3IoKSB7CisgICAgICB0aGlzLmZyb250ID0geworICAgICAgICBlbGVtZW50czogbmV3IHY4X0ludGVybmFsUGFja2VkQXJyYXkoKSwKKyAgICAgICAgbmV4dDogdW5kZWZpbmVkLAorICAgICAgfTsKKyAgICAgIHRoaXMuYmFjayA9IHRoaXMuZnJvbnQ7CisgICAgICAvLyBUaGUgY3Vyc29yIGlzIHVzZWQgdG8gYXZvaWQgY2FsbGluZyBJbnRlcm5hbFBhY2tlZEFycmF5LnNoaWZ0KCkuCisgICAgICB0aGlzLmN1cnNvciA9IDA7CisgICAgICB0aGlzLnNpemUgPSAwOworICAgIH0KKworICAgIGdldCBsZW5ndGgoKSB7CisgICAgICByZXR1cm4gdGhpcy5zaXplOworICAgIH0KKworICAgIHB1c2goZWxlbWVudCkgeworICAgICAgKyt0aGlzLnNpemU7CisgICAgICBpZiAodGhpcy5iYWNrLmVsZW1lbnRzLmxlbmd0aCA9PT0gUVVFVUVfTUFYX0FSUkFZX1NJWkUpIHsKKyAgICAgICAgY29uc3Qgb2xkQmFjayA9IHRoaXMuYmFjazsKKyAgICAgICAgdGhpcy5iYWNrID0geworICAgICAgICAgIGVsZW1lbnRzOiBuZXcgdjhfSW50ZXJuYWxQYWNrZWRBcnJheSgpLAorICAgICAgICAgIG5leHQ6IHVuZGVmaW5lZCwKKyAgICAgICAgfTsKKyAgICAgICAgb2xkQmFjay5uZXh0ID0gdGhpcy5iYWNrOworICAgICAgfQorICAgICAgdGhpcy5iYWNrLmVsZW1lbnRzLnB1c2goZWxlbWVudCk7CisgICAgfQorCisgICAgc2hpZnQoKSB7CisgICAgICAvLyBhc3NlcnQodGhpcy5zaXplID4gMCk7CisgICAgICAtLXRoaXMuc2l6ZTsKKyAgICAgIGlmICh0aGlzLmZyb250LmVsZW1lbnRzLmxlbmd0aCA9PT0gdGhpcy5jdXJzb3IpIHsKKyAgICAgICAgLy8gYXNzZXJ0KHRoaXMuY3Vyc29yID09PSBRVUVVRV9NQVhfQVJSQVlfU0laRSk7CisgICAgICAgIC8vIGFzc2VydCh0aGlzLmZyb250Lm5leHQgIT09IHVuZGVmaW5lZCk7CisgICAgICAgIHRoaXMuZnJvbnQgPSB0aGlzLmZyb250Lm5leHQ7CisgICAgICAgIHRoaXMuY3Vyc29yID0gMDsKKyAgICAgIH0KKyAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmZyb250LmVsZW1lbnRzW3RoaXMuY3Vyc29yXTsKKyAgICAgIC8vIFBlcm1pdCBzaGlmdGVkIGVsZW1lbnQgdG8gYmUgZ2FyYmFnZSBjb2xsZWN0ZWQuCisgICAgICB0aGlzLmZyb250LmVsZW1lbnRzW3RoaXMuY3Vyc29yXSA9IHVuZGVmaW5lZDsKKyAgICAgICsrdGhpcy5jdXJzb3I7CisKKyAgICAgIHJldHVybiBlbGVtZW50OworICAgIH0KKworICAgIGZvckVhY2goY2FsbGJhY2spIHsKKyAgICAgIGxldCBpID0gdGhpcy5jdXJzb3I7CisgICAgICBsZXQgbm9kZSA9IHRoaXMuZnJvbnQ7CisgICAgICBsZXQgZWxlbWVudHMgPSBub2RlLmVsZW1lbnRzOworICAgICAgd2hpbGUgKGkgIT09IGVsZW1lbnRzLmxlbmd0aCB8fCBub2RlLm5leHQgIT09IHVuZGVmaW5lZCkgeworICAgICAgICBpZiAoaSA9PT0gZWxlbWVudHMubGVuZ3RoKSB7CisgICAgICAgICAgLy8gYXNzZXJ0KG5vZGUubmV4dCAhPT0gdW5kZWZpbmVkKTsKKyAgICAgICAgICAvLyBhc3NlcnQoaSA9PT0gUVVFVUVfTUFYX0FSUkFZX1NJWkUpOworICAgICAgICAgIG5vZGUgPSBub2RlLm5leHQ7CisgICAgICAgICAgZWxlbWVudHMgPSBub2RlLmVsZW1lbnRzOworICAgICAgICAgIGkgPSAwOworICAgICAgICB9CisgICAgICAgIGNhbGxiYWNrKGVsZW1lbnRzW2ldKTsKKyAgICAgICAgKytpOworICAgICAgfQorICAgIH0KKworICAgIC8vIFJldHVybiB0aGUgZWxlbWVudCB0aGF0IHdvdWxkIGJlIHJldHVybmVkIGlmIHNoaWZ0KCkgd2FzIGNhbGxlZCBub3csCisgICAgLy8gd2l0aG91dCBtb2RpZnlpbmcgdGhlIHF1ZXVlLgorICAgIHBlZWsoKSB7CisgICAgICAvLyBhc3NlcnQodGhpcy5zaXplID4gMCk7CisgICAgICBpZiAodGhpcy5mcm9udC5lbGVtZW50cy5sZW5ndGggPT09IHRoaXMuY3Vyc29yKSB7CisgICAgICAgIC8vIGFzc2VydCh0aGlzLmN1cnNvciA9PT0gUVVFVUVfTUFYX0FSUkFZX1NJWkUpCisgICAgICAgIC8vIGFzc2VydCh0aGlzLmZyb250Lm5leHQgIT09IHVuZGVmaW5lZCk7CisgICAgICAgIHJldHVybiB0aGlzLmZyb250Lm5leHQuZWxlbWVudHNbMF07CisgICAgICB9CisgICAgICByZXR1cm4gdGhpcy5mcm9udC5lbGVtZW50c1t0aGlzLmN1cnNvcl07CisgICAgfQorICB9CisgIC8qIFNpbXBsZVF1ZXVlLmpzOiBlbmQgKi8KKworICAvKiBDb21tb25TdHJpbmdzLmpzOiBiZWdpbiAqLworICBjb25zdCBzdHJlYW1FcnJvcnNfaWxsZWdhbEludm9jYXRpb24gPSAnSWxsZWdhbCBpbnZvY2F0aW9uJzsKKyAgY29uc3Qgc3RyZWFtRXJyb3JzX2lsbGVnYWxDb25zdHJ1Y3RvciA9ICdJbGxlZ2FsIGNvbnN0cnVjdG9yJzsKKyAgY29uc3Qgc3RyZWFtRXJyb3JzX2ludmFsaWRUeXBlID0gJ0ludmFsaWQgdHlwZSBpcyBzcGVjaWZpZWQnOworICBjb25zdCBzdHJlYW1FcnJvcnNfaW52YWxpZFNpemUgPSAnVGhlIHJldHVybiB2YWx1ZSBvZiBhIHF1ZXVpbmcgc3RyYXRlZ3lcJ3Mgc2l6ZSBmdW5jdGlvbiBtdXN0IGJlIGEgZmluaXRlLCBub24tTmFOLCBub24tbmVnYXRpdmUgbnVtYmVyJzsKKyAgY29uc3Qgc3RyZWFtRXJyb3JzX3NpemVOb3RBRnVuY3Rpb24gPSAnQSBxdWV1aW5nIHN0cmF0ZWd5XCdzIHNpemUgcHJvcGVydHkgbXVzdCBiZSBhIGZ1bmN0aW9uJzsKKyAgY29uc3Qgc3RyZWFtRXJyb3JzX2ludmFsaWRIV00gPSAnQSBxdWV1ZWluZyBzdHJhdGVneVwncyBoaWdoV2F0ZXJNYXJrIHByb3BlcnR5IG11c3QgYmUgYSBub25uZWdhdGl2ZSwgbm9uLU5hTiBudW1iZXInOworICAvKiBDb21tb25TdHJpbmdzLmpzOiBlbmQgKi8KKworICBjb25zdCBfcmVhZGVyID0gdjhfY3JlYXRlUHJpdmF0ZVN5bWJvbCgnW1tyZWFkZXJdXScpOworICBjb25zdCBfc3RvcmVkRXJyb3IgPSB2OF9jcmVhdGVQcml2YXRlU3ltYm9sKCdbW3N0b3JlZEVycm9yXV0nKTsKKyAgY29uc3QgX2NvbnRyb2xsZXIgPSB2OF9jcmVhdGVQcml2YXRlU3ltYm9sKCdbW2NvbnRyb2xsZXJdXScpOworCisgIGNvbnN0IF9jbG9zZWRQcm9taXNlID0gdjhfY3JlYXRlUHJpdmF0ZVN5bWJvbCgnW1tjbG9zZWRQcm9taXNlXV0nKTsKKyAgY29uc3QgX293bmVyUmVhZGFibGVTdHJlYW0gPQorICAgICAgdjhfY3JlYXRlUHJpdmF0ZVN5bWJvbCgnW1tvd25lclJlYWRhYmxlU3RyZWFtXV0nKTsKKworICBjb25zdCBfcmVhZFJlcXVlc3RzID0gdjhfY3JlYXRlUHJpdmF0ZVN5bWJvbCgnW1tyZWFkUmVxdWVzdHNdXScpOworCisgIGNvbnN0IGNyZWF0ZVdpdGhFeHRlcm5hbENvbnRyb2xsZXJTZW50aW5lbCA9CisgICAgICB2OF9jcmVhdGVQcml2YXRlU3ltYm9sKCdmbGFnIGZvciBVQS1jcmVhdGVkIFJlYWRhYmxlU3RyZWFtIHRvIHBhc3MnKTsKKworICBjb25zdCBfcmVhZGFibGVTdHJlYW1CaXRzID0gdjhfY3JlYXRlUHJpdmF0ZVN5bWJvbCgnYml0IGZpZWxkIGZvciBbW3N0YXRlXV0gYW5kIFtbZGlzdHVyYmVkXV0nKTsKKyAgY29uc3QgRElTVFVSQkVEID0gMGIxOworICAvLyBUaGUgMm5kIGFuZCAzcmQgYml0IGFyZSBmb3IgW1tzdGF0ZV1dLgorICBjb25zdCBTVEFURV9NQVNLID0gMGIxMTA7CisgIGNvbnN0IFNUQVRFX0JJVFNfT0ZGU0VUID0gMTsKKyAgY29uc3QgU1RBVEVfUkVBREFCTEUgPSAwOworICBjb25zdCBTVEFURV9DTE9TRUQgPSAxOworICBjb25zdCBTVEFURV9FUlJPUkVEID0gMjsKKworICBjb25zdCBfdW5kZXJseWluZ1NvdXJjZSA9IHY4X2NyZWF0ZVByaXZhdGVTeW1ib2woJ1tbdW5kZXJseWluZ1NvdXJjZV1dJyk7CisgIGNvbnN0IF9jb250cm9sbGVkUmVhZGFibGVTdHJlYW0gPQorICAgICAgdjhfY3JlYXRlUHJpdmF0ZVN5bWJvbCgnW1tjb250cm9sbGVkUmVhZGFibGVTdHJlYW1dXScpOworICBjb25zdCBfcXVldWUgPSB2OF9jcmVhdGVQcml2YXRlU3ltYm9sKCdbW3F1ZXVlXV0nKTsKKyAgY29uc3QgX3RvdGFsUXVldWVkU2l6ZSA9IHY4X2NyZWF0ZVByaXZhdGVTeW1ib2woJ1tbdG90YWxRdWV1ZWRTaXplXV0nKTsKKyAgY29uc3QgX3N0cmF0ZWd5U2l6ZSA9IHY4X2NyZWF0ZVByaXZhdGVTeW1ib2woJ1tbc3RyYXRlZ3lTaXplXV0nKTsKKyAgY29uc3QgX3N0cmF0ZWd5SFdNID0gdjhfY3JlYXRlUHJpdmF0ZVN5bWJvbCgnW1tzdHJhdGVneUhXTV1dJyk7CisKKyAgY29uc3QgX3JlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJCaXRzID0gdjhfY3JlYXRlUHJpdmF0ZVN5bWJvbCgKKyAgICAgICdiaXQgZmllbGQgZm9yIFtbc3RhcnRlZF1dLCBbW2Nsb3NlUmVxdWVzdGVkXV0sIFtbcHVsbGluZ11dLCBbW3B1bGxBZ2Fpbl1dJyk7CisgIGNvbnN0IFNUQVJURUQgPSAwYjE7CisgIGNvbnN0IENMT1NFX1JFUVVFU1RFRCA9IDBiMTA7CisgIGNvbnN0IFBVTExJTkcgPSAwYjEwMDsKKyAgY29uc3QgUFVMTF9BR0FJTiA9IDBiMTAwMDsKKyAgY29uc3QgRVhURVJOQUxMWV9DT05UUk9MTEVEID0gMGIxMDAwMDsKKworICBjb25zdCB1bmRlZmluZWQgPSBnbG9iYWwudW5kZWZpbmVkOworICBjb25zdCBJbmZpbml0eSA9IGdsb2JhbC5JbmZpbml0eTsKKworICBjb25zdCBkZWZpbmVQcm9wZXJ0eSA9IGdsb2JhbC5PYmplY3QuZGVmaW5lUHJvcGVydHk7CisgIGNvbnN0IGhhc093blByb3BlcnR5ID0gdjhfdW5jdXJyeVRoaXMoZ2xvYmFsLk9iamVjdC5oYXNPd25Qcm9wZXJ0eSk7CisgIGNvbnN0IGNhbGxGdW5jdGlvbiA9IHY4X3VuY3VycnlUaGlzKGdsb2JhbC5GdW5jdGlvbi5wcm90b3R5cGUuY2FsbCk7CisgIGNvbnN0IGFwcGx5RnVuY3Rpb24gPSB2OF91bmN1cnJ5VGhpcyhnbG9iYWwuRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5KTsKKworICBjb25zdCBUeXBlRXJyb3IgPSBnbG9iYWwuVHlwZUVycm9yOworICBjb25zdCBSYW5nZUVycm9yID0gZ2xvYmFsLlJhbmdlRXJyb3I7CisKKyAgY29uc3QgTnVtYmVyID0gZ2xvYmFsLk51bWJlcjsKKyAgY29uc3QgTnVtYmVyX2lzTmFOID0gTnVtYmVyLmlzTmFOOworICBjb25zdCBOdW1iZXJfaXNGaW5pdGUgPSBOdW1iZXIuaXNGaW5pdGU7CisKKyAgY29uc3QgUHJvbWlzZSA9IGdsb2JhbC5Qcm9taXNlOworICBjb25zdCB0aGVuUHJvbWlzZSA9IHY4X3VuY3VycnlUaGlzKFByb21pc2UucHJvdG90eXBlLnRoZW4pOworICBjb25zdCBQcm9taXNlX3Jlc29sdmUgPSB2OF9zaW1wbGVCaW5kKFByb21pc2UucmVzb2x2ZSwgUHJvbWlzZSk7CisgIGNvbnN0IFByb21pc2VfcmVqZWN0ID0gdjhfc2ltcGxlQmluZChQcm9taXNlLnJlamVjdCwgUHJvbWlzZSk7CisKKyAgY29uc3QgZXJyQ2FuY2VsTG9ja2VkU3RyZWFtID0KKyAgICAgICdDYW5ub3QgY2FuY2VsIGEgcmVhZGFibGUgc3RyZWFtIHRoYXQgaXMgbG9ja2VkIHRvIGEgcmVhZGVyJzsKKyAgY29uc3QgZXJyRW5xdWV1ZUNsb3NlUmVxdWVzdGVkU3RyZWFtID0KKyAgICAgICdDYW5ub3QgZW5xdWV1ZSBhIGNodW5rIGludG8gYSByZWFkYWJsZSBzdHJlYW0gdGhhdCBpcyBjbG9zZWQgb3IgaGFzIGJlZW4gcmVxdWVzdGVkIHRvIGJlIGNsb3NlZCc7CisgIGNvbnN0IGVyckNhbmNlbFJlbGVhc2VkUmVhZGVyID0KKyAgICAgICdUaGlzIHJlYWRhYmxlIHN0cmVhbSByZWFkZXIgaGFzIGJlZW4gcmVsZWFzZWQgYW5kIGNhbm5vdCBiZSB1c2VkIHRvIGNhbmNlbCBpdHMgcHJldmlvdXMgb3duZXIgc3RyZWFtJzsKKyAgY29uc3QgZXJyUmVhZFJlbGVhc2VkUmVhZGVyID0KKyAgICAgICdUaGlzIHJlYWRhYmxlIHN0cmVhbSByZWFkZXIgaGFzIGJlZW4gcmVsZWFzZWQgYW5kIGNhbm5vdCBiZSB1c2VkIHRvIHJlYWQgZnJvbSBpdHMgcHJldmlvdXMgb3duZXIgc3RyZWFtJzsKKyAgY29uc3QgZXJyQ2xvc2VDbG9zZVJlcXVlc3RlZFN0cmVhbSA9CisgICAgICAnQ2Fubm90IGNsb3NlIGEgcmVhZGFibGUgc3RyZWFtIHRoYXQgaGFzIGFscmVhZHkgYmVlbiByZXF1ZXN0ZWQgdG8gYmUgY2xvc2VkJzsKKyAgY29uc3QgZXJyRW5xdWV1ZUNsb3NlZFN0cmVhbSA9ICdDYW5ub3QgZW5xdWV1ZSBhIGNodW5rIGludG8gYSBjbG9zZWQgcmVhZGFibGUgc3RyZWFtJzsKKyAgY29uc3QgZXJyRW5xdWV1ZUVycm9yZWRTdHJlYW0gPSAnQ2Fubm90IGVucXVldWUgYSBjaHVuayBpbnRvIGFuIGVycm9yZWQgcmVhZGFibGUgc3RyZWFtJzsKKyAgY29uc3QgZXJyQ2xvc2VDbG9zZWRTdHJlYW0gPSAnQ2Fubm90IGNsb3NlIGEgY2xvc2VkIHJlYWRhYmxlIHN0cmVhbSc7CisgIGNvbnN0IGVyckNsb3NlRXJyb3JlZFN0cmVhbSA9ICdDYW5ub3QgY2xvc2UgYW4gZXJyb3JlZCByZWFkYWJsZSBzdHJlYW0nOworICBjb25zdCBlcnJFcnJvckNsb3NlZFN0cmVhbSA9ICdDYW5ub3QgZXJyb3IgYSBjbG9zZSByZWFkYWJsZSBzdHJlYW0nOworICBjb25zdCBlcnJFcnJvckVycm9yZWRTdHJlYW0gPQorICAgICAgJ0Nhbm5vdCBlcnJvciBhIHJlYWRhYmxlIHN0cmVhbSB0aGF0IGlzIGFscmVhZHkgZXJyb3JlZCc7CisgIGNvbnN0IGVyckdldFJlYWRlck5vdEJ5dGVTdHJlYW0gPSAnVGhpcyByZWFkYWJsZSBzdHJlYW0gZG9lcyBub3Qgc3VwcG9ydCBCWU9CIHJlYWRlcnMnOworICBjb25zdCBlcnJHZXRSZWFkZXJCYWRNb2RlID0gJ0ludmFsaWQgcmVhZGVyIG1vZGUgZ2l2ZW46IGV4cGVjdGVkIHVuZGVmaW5lZCBvciAiYnlvYiInOworICBjb25zdCBlcnJSZWFkZXJDb25zdHJ1Y3RvckJhZEFyZ3VtZW50ID0KKyAgICAgICdSZWFkYWJsZVN0cmVhbVJlYWRlciBjb25zdHJ1Y3RvciBhcmd1bWVudCBpcyBub3QgYSByZWFkYWJsZSBzdHJlYW0nOworICBjb25zdCBlcnJSZWFkZXJDb25zdHJ1Y3RvclN0cmVhbUFscmVhZHlMb2NrZWQgPQorICAgICAgJ1JlYWRhYmxlU3RyZWFtUmVhZGVyIGNvbnN0cnVjdG9yIGNhbiBvbmx5IGFjY2VwdCByZWFkYWJsZSBzdHJlYW1zIHRoYXQgYXJlIG5vdCB5ZXQgbG9ja2VkIHRvIGEgcmVhZGVyJzsKKyAgY29uc3QgZXJyUmVsZWFzZVJlYWRlcldpdGhQZW5kaW5nUmVhZCA9CisgICAgICAnQ2Fubm90IHJlbGVhc2UgYSByZWFkYWJsZSBzdHJlYW0gcmVhZGVyIHdoZW4gaXQgc3RpbGwgaGFzIG91dHN0YW5kaW5nIHJlYWQoKSBjYWxscyB0aGF0IGhhdmUgbm90IHlldCBzZXR0bGVkJzsKKyAgY29uc3QgZXJyUmVsZWFzZWRSZWFkZXJDbG9zZWRQcm9taXNlID0KKyAgICAgICdUaGlzIHJlYWRhYmxlIHN0cmVhbSByZWFkZXIgaGFzIGJlZW4gcmVsZWFzZWQgYW5kIGNhbm5vdCBiZSB1c2VkIHRvIG1vbml0b3IgdGhlIHN0cmVhbVwncyBzdGF0ZSc7CisKKyAgY29uc3QgZXJyVG1wbE11c3RCZUZ1bmN0aW9uT3JVbmRlZmluZWQgPSBuYW1lID0+CisgICAgICBgJHtuYW1lfSBtdXN0IGJlIGEgZnVuY3Rpb24gb3IgdW5kZWZpbmVkYDsKKworICBjbGFzcyBSZWFkYWJsZVN0cmVhbSB7CisgICAgY29uc3RydWN0b3IoKSB7CisgICAgICAvLyBUT0RPKGRvbWVuaWMpOiB3aGVuIFY4IGdldHMgZGVmYXVsdCBwYXJhbWV0ZXJzIGFuZCBkZXN0cnVjdHVyaW5nLCBhbGwKKyAgICAgIC8vIHRoaXMgY2FuIGJlIGNsZWFuZWQgdXAuCisgICAgICBjb25zdCB1bmRlcmx5aW5nU291cmNlID0gYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyB7fSA6IGFyZ3VtZW50c1swXTsKKyAgICAgIGNvbnN0IHN0cmF0ZWd5ID0gYXJndW1lbnRzWzFdID09PSB1bmRlZmluZWQgPyB7fSA6IGFyZ3VtZW50c1sxXTsKKyAgICAgIGNvbnN0IHNpemUgPSBzdHJhdGVneS5zaXplOworICAgICAgbGV0IGhpZ2hXYXRlck1hcmsgPSBzdHJhdGVneS5oaWdoV2F0ZXJNYXJrOworICAgICAgaWYgKGhpZ2hXYXRlck1hcmsgPT09IHVuZGVmaW5lZCkgeworICAgICAgICBoaWdoV2F0ZXJNYXJrID0gMTsKKyAgICAgIH0KKworICAgICAgdGhpc1tfcmVhZGFibGVTdHJlYW1CaXRzXSA9IDBiMDsKKyAgICAgIFJlYWRhYmxlU3RyZWFtU2V0U3RhdGUodGhpcywgU1RBVEVfUkVBREFCTEUpOworICAgICAgdGhpc1tfcmVhZGVyXSA9IHVuZGVmaW5lZDsKKyAgICAgIHRoaXNbX3N0b3JlZEVycm9yXSA9IHVuZGVmaW5lZDsKKworICAgICAgLy8gQXZvaWQgYWxsb2NhdGluZyB0aGUgY29udHJvbGxlciBpZiB0aGUgc3RyZWFtIGlzIGdvaW5nIHRvIGJlIGNvbnRyb2xsZWQKKyAgICAgIC8vIGV4dGVybmFsbHkgKGkuZS4gZnJvbSBDKyspIGFueXdheS4gQWxsIGNhbGxzIHRvIHVuZGVybHlpbmdTb3VyY2UKKyAgICAgIC8vIG1ldGhvZHMgd2lsbCBkaXNyZWdhcmQgdGhlaXIgY29udHJvbGxlciBhcmd1bWVudCBpbiBzdWNoIHNpdHVhdGlvbnMKKyAgICAgIC8vIChidXQgc2VlIGJlbG93KS4KKworICAgICAgdGhpc1tfY29udHJvbGxlcl0gPSB1bmRlZmluZWQ7CisKKyAgICAgIGNvbnN0IHR5cGUgPSB1bmRlcmx5aW5nU291cmNlLnR5cGU7CisgICAgICBjb25zdCB0eXBlU3RyaW5nID0gU3RyaW5nKHR5cGUpOworICAgICAgaWYgKHR5cGVTdHJpbmcgPT09ICdieXRlcycpIHsKKyAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2J5dGVzIHR5cGUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCcpOworICAgICAgfSBlbHNlIGlmICh0eXBlICE9PSB1bmRlZmluZWQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3Ioc3RyZWFtRXJyb3JzX2ludmFsaWRUeXBlKTsKKyAgICAgIH0KKworICAgICAgdGhpc1tfY29udHJvbGxlcl0gPQorICAgICAgICAgIG5ldyBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHRoaXMsIHVuZGVybHlpbmdTb3VyY2UsIHNpemUsIGhpZ2hXYXRlck1hcmssIGFyZ3VtZW50c1syXSk7CisgICAgfQorCisgICAgZ2V0IGxvY2tlZCgpIHsKKyAgICAgIGlmIChJc1JlYWRhYmxlU3RyZWFtKHRoaXMpID09PSBmYWxzZSkgeworICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHN0cmVhbUVycm9yc19pbGxlZ2FsSW52b2NhdGlvbik7CisgICAgICB9CisKKyAgICAgIHJldHVybiBJc1JlYWRhYmxlU3RyZWFtTG9ja2VkKHRoaXMpOworICAgIH0KKworICAgIGNhbmNlbChyZWFzb24pIHsKKyAgICAgIGlmIChJc1JlYWRhYmxlU3RyZWFtKHRoaXMpID09PSBmYWxzZSkgeworICAgICAgICByZXR1cm4gUHJvbWlzZV9yZWplY3QobmV3IFR5cGVFcnJvcihzdHJlYW1FcnJvcnNfaWxsZWdhbEludm9jYXRpb24pKTsKKyAgICAgIH0KKworICAgICAgaWYgKElzUmVhZGFibGVTdHJlYW1Mb2NrZWQodGhpcykgPT09IHRydWUpIHsKKyAgICAgICAgcmV0dXJuIFByb21pc2VfcmVqZWN0KG5ldyBUeXBlRXJyb3IoZXJyQ2FuY2VsTG9ja2VkU3RyZWFtKSk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBSZWFkYWJsZVN0cmVhbUNhbmNlbCh0aGlzLCByZWFzb24pOworICAgIH0KKworICAgIGdldFJlYWRlcih7IG1vZGUgfSA9IHt9KSB7CisgICAgICBpZiAoSXNSZWFkYWJsZVN0cmVhbSh0aGlzKSA9PT0gZmFsc2UpIHsKKyAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihzdHJlYW1FcnJvcnNfaWxsZWdhbEludm9jYXRpb24pOworICAgICAgfQorCisgICAgICBpZiAobW9kZSA9PT0gJ2J5b2InKSB7CisgICAgICAgIC8vIFRPRE8ocmljZWEpOiBXaGVuIEJZT0IgcmVhZGVycyBhcmUgc3VwcG9ydGVkOgorICAgICAgICAvLworICAgICAgICAvLyBhLiBJZgorICAgICAgICAvLyAhIElzUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlcih0aGlzLltbX2NvbnRyb2xsZXJdXSkKKyAgICAgICAgLy8gaXMgZmFsc2UsIHRocm93IGEgVHlwZUVycm9yIGV4Y2VwdGlvbi4KKyAgICAgICAgLy8gYi4gUmV0dXJuID8gQWNxdWlyZVJlYWRhYmxlU3RyZWFtQllPQlJlYWRlcih0aGlzKS4KKyAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihlcnJHZXRSZWFkZXJOb3RCeXRlU3RyZWFtKTsKKyAgICAgIH0KKworICAgICAgaWYgKG1vZGUgPT09IHVuZGVmaW5lZCkgeworICAgICAgICByZXR1cm4gQWNxdWlyZVJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcih0aGlzKTsKKyAgICAgIH0KKworICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoZXJyR2V0UmVhZGVyQmFkTW9kZSk7CisgICAgfQorCisgICAgcGlwZVRocm91Z2goe3dyaXRhYmxlLCByZWFkYWJsZX0sIG9wdGlvbnMpIHsKKyAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3BpcGVUaHJvdWdoIG5vdCBpbXBsZW1lbnRlZCcpOworICAgIH0KKworICAgIHBpcGVUbyhkZXN0LCB7cHJldmVudENsb3NlLCBwcmV2ZW50QWJvcnQsIHByZXZlbnRDYW5jZWx9ID0ge30pIHsKKyAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3BpcGVUbyBub3QgaW1wbGVtZW50ZWQnKTsKKyAgICB9CisKKyAgICB0ZWUoKSB7CisgICAgICBpZiAoSXNSZWFkYWJsZVN0cmVhbSh0aGlzKSA9PT0gZmFsc2UpIHsKKyAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihzdHJlYW1FcnJvcnNfaWxsZWdhbEludm9jYXRpb24pOworICAgICAgfQorCisgICAgICByZXR1cm4gUmVhZGFibGVTdHJlYW1UZWUodGhpcyk7CisgICAgfQorICB9CisKKyAgY2xhc3MgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlciB7CisgICAgLy8gQ29iYWx0OiBDb25zdHJ1Y3RvciBoYXMgYSBoaWRkZW4gYXJndW1lbnQgYXQgdGhlIGVuZCB0byBkZXNpZ25hdGUKKyAgICAvLyB3aGV0aGVyIGl0IGlzIGV4dGVybmFsbHkgY29udHJvbGxlZC4gRXhwb3NpbmcgdGhpcyB3b3VsZCBmYWlsIHRoZQorICAgIC8vIHdlYiBwbGF0Zm9ybSB0ZXN0IGNoZWNraW5nIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycyB0aGUgY29uc3RydWN0b3IKKyAgICAvLyBhY2NlcHRzLgorICAgIGNvbnN0cnVjdG9yKHN0cmVhbSwgdW5kZXJseWluZ1NvdXJjZSwgc2l6ZSwgaGlnaFdhdGVyTWFyaykgeworICAgICAgaWYgKElzUmVhZGFibGVTdHJlYW0oc3RyZWFtKSA9PT0gZmFsc2UpIHsKKyAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihzdHJlYW1FcnJvcnNfaWxsZWdhbENvbnN0cnVjdG9yKTsKKyAgICAgIH0KKworICAgICAgaWYgKHN0cmVhbVtfY29udHJvbGxlcl0gIT09IHVuZGVmaW5lZCkgeworICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHN0cmVhbUVycm9yc19pbGxlZ2FsQ29uc3RydWN0b3IpOworICAgICAgfQorCisgICAgICB0aGlzW19jb250cm9sbGVkUmVhZGFibGVTdHJlYW1dID0gc3RyZWFtOworCisgICAgICB0aGlzW191bmRlcmx5aW5nU291cmNlXSA9IHVuZGVybHlpbmdTb3VyY2U7CisKKyAgICAgIHRoaXNbX3F1ZXVlXSA9IG5ldyBTaW1wbGVRdWV1ZSgpOworICAgICAgdGhpc1tfdG90YWxRdWV1ZWRTaXplXSA9IDA7CisKKyAgICAgIHRoaXNbX3JlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJCaXRzXSA9IDBiMDsKKyAgICAgIC8vIENvYmFsdDogSGlkZGVuIGNvbnN0cnVjdG9yIHBhcmFtZXRlciB0byBkZXNpZ25hdGUgd2hldGhlciB0aGUKKyAgICAgIC8vIGlzIGV4dGVybmFsbHkgY29udHJvbGxlZC4KKyAgICAgIGlmIChhcmd1bWVudHNbNF0gPT09IGNyZWF0ZVdpdGhFeHRlcm5hbENvbnRyb2xsZXJTZW50aW5lbCkgeworICAgICAgICB0aGlzW19yZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQml0c10gfD0gRVhURVJOQUxMWV9DT05UUk9MTEVEOworICAgICAgfQorCisgICAgICBjb25zdCBub3JtYWxpemVkU3RyYXRlZ3kgPQorICAgICAgICAgIFZhbGlkYXRlQW5kTm9ybWFsaXplUXVldWluZ1N0cmF0ZWd5KHNpemUsIGhpZ2hXYXRlck1hcmspOworICAgICAgdGhpc1tfc3RyYXRlZ3lTaXplXSA9IG5vcm1hbGl6ZWRTdHJhdGVneS5zaXplOworICAgICAgdGhpc1tfc3RyYXRlZ3lIV01dID0gbm9ybWFsaXplZFN0cmF0ZWd5LmhpZ2hXYXRlck1hcms7CisKKyAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSB0aGlzOworCisgICAgICBjb25zdCBzdGFydFJlc3VsdCA9IENhbGxPck5vb3AoCisgICAgICAgICAgdW5kZXJseWluZ1NvdXJjZSwgJ3N0YXJ0JywgdGhpcywgJ3VuZGVybHlpbmdTb3VyY2Uuc3RhcnQnKTsKKyAgICAgIHRoZW5Qcm9taXNlKFByb21pc2VfcmVzb2x2ZShzdGFydFJlc3VsdCksCisgICAgICAgICAgKCkgPT4geworICAgICAgICAgICAgY29udHJvbGxlcltfcmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckJpdHNdIHw9IFNUQVJURUQ7CisgICAgICAgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FsbFB1bGxJZk5lZWRlZChjb250cm9sbGVyKTsKKyAgICAgICAgICB9LAorICAgICAgICAgIHIgPT4geworICAgICAgICAgICAgaWYgKFJlYWRhYmxlU3RyZWFtR2V0U3RhdGUoc3RyZWFtKSA9PT0gU1RBVEVfUkVBREFCTEUpIHsKKyAgICAgICAgICAgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9yKGNvbnRyb2xsZXIsIHIpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0pOworICAgIH0KKworICAgIGdldCBkZXNpcmVkU2l6ZSgpIHsKKyAgICAgIGlmIChJc1JlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIodGhpcykgPT09IGZhbHNlKSB7CisgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3Ioc3RyZWFtRXJyb3JzX2lsbGVnYWxJbnZvY2F0aW9uKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXREZXNpcmVkU2l6ZSh0aGlzKTsKKyAgICB9CisKKyAgICBjbG9zZSgpIHsKKyAgICAgIGlmIChJc1JlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIodGhpcykgPT09IGZhbHNlKSB7CisgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3Ioc3RyZWFtRXJyb3JzX2lsbGVnYWxJbnZvY2F0aW9uKTsKKyAgICAgIH0KKworICAgICAgY29uc3Qgc3RyZWFtID0gdGhpc1tfY29udHJvbGxlZFJlYWRhYmxlU3RyZWFtXTsKKworICAgICAgaWYgKHRoaXNbX3JlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJCaXRzXSAmIENMT1NFX1JFUVVFU1RFRCkgeworICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGVyckNsb3NlQ2xvc2VSZXF1ZXN0ZWRTdHJlYW0pOworICAgICAgfQorCisgICAgICBjb25zdCBzdGF0ZSA9IFJlYWRhYmxlU3RyZWFtR2V0U3RhdGUoc3RyZWFtKTsKKyAgICAgIGlmIChzdGF0ZSA9PT0gU1RBVEVfRVJST1JFRCkgeworICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGVyckNsb3NlRXJyb3JlZFN0cmVhbSk7CisgICAgICB9CisgICAgICBpZiAoc3RhdGUgPT09IFNUQVRFX0NMT1NFRCkgeworICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGVyckNsb3NlQ2xvc2VkU3RyZWFtKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbG9zZSh0aGlzKTsKKyAgICB9CisKKyAgICBlbnF1ZXVlKGNodW5rKSB7CisgICAgICBpZiAoSXNSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHRoaXMpID09PSBmYWxzZSkgeworICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHN0cmVhbUVycm9yc19pbGxlZ2FsSW52b2NhdGlvbik7CisgICAgICB9CisKKyAgICAgIGNvbnN0IHN0cmVhbSA9IHRoaXNbX2NvbnRyb2xsZWRSZWFkYWJsZVN0cmVhbV07CisKKyAgICAgIGlmICh0aGlzW19yZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQml0c10gJiBDTE9TRV9SRVFVRVNURUQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihlcnJFbnF1ZXVlQ2xvc2VSZXF1ZXN0ZWRTdHJlYW0pOworICAgICAgfQorCisgICAgICBjb25zdCBzdGF0ZSA9IFJlYWRhYmxlU3RyZWFtR2V0U3RhdGUoc3RyZWFtKTsKKyAgICAgIGlmIChzdGF0ZSA9PT0gU1RBVEVfRVJST1JFRCkgeworICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGVyckVucXVldWVFcnJvcmVkU3RyZWFtKTsKKyAgICAgIH0KKyAgICAgIGlmIChzdGF0ZSA9PT0gU1RBVEVfQ0xPU0VEKSB7CisgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoZXJyRW5xdWV1ZUNsb3NlZFN0cmVhbSk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRW5xdWV1ZSh0aGlzLCBjaHVuayk7CisgICAgfQorCisgICAgZXJyb3IoZSkgeworICAgICAgaWYgKElzUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcih0aGlzKSA9PT0gZmFsc2UpIHsKKyAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihzdHJlYW1FcnJvcnNfaWxsZWdhbEludm9jYXRpb24pOworICAgICAgfQorCisgICAgICBjb25zdCBzdHJlYW0gPSB0aGlzW19jb250cm9sbGVkUmVhZGFibGVTdHJlYW1dOworCisgICAgICBjb25zdCBzdGF0ZSA9IFJlYWRhYmxlU3RyZWFtR2V0U3RhdGUoc3RyZWFtKTsKKyAgICAgIGlmIChzdGF0ZSA9PT0gU1RBVEVfRVJST1JFRCkgeworICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGVyckVycm9yRXJyb3JlZFN0cmVhbSk7CisgICAgICB9CisgICAgICBpZiAoc3RhdGUgPT09IFNUQVRFX0NMT1NFRCkgeworICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGVyckVycm9yQ2xvc2VkU3RyZWFtKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcih0aGlzLCBlKTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FuY2VsKGNvbnRyb2xsZXIsIHJlYXNvbikgeworICAgIGNvbnRyb2xsZXJbX3F1ZXVlXSA9IG5ldyBTaW1wbGVRdWV1ZSgpOworCisgICAgY29uc3QgdW5kZXJseWluZ1NvdXJjZSA9IGNvbnRyb2xsZXJbX3VuZGVybHlpbmdTb3VyY2VdOworICAgIHJldHVybiBQcm9taXNlQ2FsbE9yTm9vcCh1bmRlcmx5aW5nU291cmNlLCAnY2FuY2VsJywgcmVhc29uLCAndW5kZXJseWluZ1NvdXJjZS5jYW5jZWwnKTsKKyAgfQorCisgIGZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJQdWxsKGNvbnRyb2xsZXIpIHsKKyAgICBjb25zdCBzdHJlYW0gPSBjb250cm9sbGVyW19jb250cm9sbGVkUmVhZGFibGVTdHJlYW1dOworCisgICAgaWYgKGNvbnRyb2xsZXJbX3F1ZXVlXS5sZW5ndGggPiAwKSB7CisgICAgICBjb25zdCBjaHVuayA9IERlcXVldWVWYWx1ZShjb250cm9sbGVyKTsKKworICAgICAgaWYgKChjb250cm9sbGVyW19yZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQml0c10gJiBDTE9TRV9SRVFVRVNURUQpICYmCisgICAgICAgICAgY29udHJvbGxlcltfcXVldWVdLmxlbmd0aCA9PT0gMCkgeworICAgICAgICBSZWFkYWJsZVN0cmVhbUNsb3NlKHN0cmVhbSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FsbFB1bGxJZk5lZWRlZChjb250cm9sbGVyKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIFByb21pc2VfcmVzb2x2ZShDcmVhdGVJdGVyUmVzdWx0T2JqZWN0KGNodW5rLCBmYWxzZSkpOworICAgIH0KKworICAgIGNvbnN0IHBlbmRpbmdQcm9taXNlID0gUmVhZGFibGVTdHJlYW1BZGRSZWFkUmVxdWVzdChzdHJlYW0pOworICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDYWxsUHVsbElmTmVlZGVkKGNvbnRyb2xsZXIpOworICAgIHJldHVybiBwZW5kaW5nUHJvbWlzZTsKKyAgfQorCisgIGZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtQWRkUmVhZFJlcXVlc3Qoc3RyZWFtKSB7CisgICAgY29uc3QgcHJvbWlzZSA9IHY4X2NyZWF0ZVByb21pc2UoKTsKKyAgICBzdHJlYW1bX3JlYWRlcl1bX3JlYWRSZXF1ZXN0c10ucHVzaChwcm9taXNlKTsKKyAgICByZXR1cm4gcHJvbWlzZTsKKyAgfQorCisgIGNsYXNzIFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlciB7CisgICAgY29uc3RydWN0b3Ioc3RyZWFtKSB7CisgICAgICBpZiAoSXNSZWFkYWJsZVN0cmVhbShzdHJlYW0pID09PSBmYWxzZSkgeworICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGVyclJlYWRlckNvbnN0cnVjdG9yQmFkQXJndW1lbnQpOworICAgICAgfQorICAgICAgaWYgKElzUmVhZGFibGVTdHJlYW1Mb2NrZWQoc3RyZWFtKSA9PT0gdHJ1ZSkgeworICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGVyclJlYWRlckNvbnN0cnVjdG9yU3RyZWFtQWxyZWFkeUxvY2tlZCk7CisgICAgICB9CisKKyAgICAgIFJlYWRhYmxlU3RyZWFtUmVhZGVyR2VuZXJpY0luaXRpYWxpemUodGhpcywgc3RyZWFtKTsKKworICAgICAgdGhpc1tfcmVhZFJlcXVlc3RzXSA9IG5ldyBTaW1wbGVRdWV1ZSgpOworICAgIH0KKworICAgIGdldCBjbG9zZWQoKSB7CisgICAgICBpZiAoSXNSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIodGhpcykgPT09IGZhbHNlKSB7CisgICAgICAgIHJldHVybiBQcm9taXNlX3JlamVjdChuZXcgVHlwZUVycm9yKHN0cmVhbUVycm9yc19pbGxlZ2FsSW52b2NhdGlvbikpOworICAgICAgfQorCisgICAgICByZXR1cm4gdGhpc1tfY2xvc2VkUHJvbWlzZV07CisgICAgfQorCisgICAgY2FuY2VsKHJlYXNvbikgeworICAgICAgaWYgKElzUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyKHRoaXMpID09PSBmYWxzZSkgeworICAgICAgICByZXR1cm4gUHJvbWlzZV9yZWplY3QobmV3IFR5cGVFcnJvcihzdHJlYW1FcnJvcnNfaWxsZWdhbEludm9jYXRpb24pKTsKKyAgICAgIH0KKworICAgICAgY29uc3Qgc3RyZWFtID0gdGhpc1tfb3duZXJSZWFkYWJsZVN0cmVhbV07CisgICAgICBpZiAoc3RyZWFtID09PSB1bmRlZmluZWQpIHsKKyAgICAgICAgcmV0dXJuIFByb21pc2VfcmVqZWN0KG5ldyBUeXBlRXJyb3IoZXJyQ2FuY2VsUmVsZWFzZWRSZWFkZXIpKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIFJlYWRhYmxlU3RyZWFtUmVhZGVyR2VuZXJpY0NhbmNlbCh0aGlzLCByZWFzb24pOworICAgIH0KKworICAgIHJlYWQoKSB7CisgICAgICBpZiAoSXNSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIodGhpcykgPT09IGZhbHNlKSB7CisgICAgICAgIHJldHVybiBQcm9taXNlX3JlamVjdChuZXcgVHlwZUVycm9yKHN0cmVhbUVycm9yc19pbGxlZ2FsSW52b2NhdGlvbikpOworICAgICAgfQorCisgICAgICBpZiAodGhpc1tfb3duZXJSZWFkYWJsZVN0cmVhbV0gPT09IHVuZGVmaW5lZCkgeworICAgICAgICByZXR1cm4gUHJvbWlzZV9yZWplY3QobmV3IFR5cGVFcnJvcihlcnJSZWFkUmVsZWFzZWRSZWFkZXIpKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlclJlYWQodGhpcyk7CisgICAgfQorCisgICAgcmVsZWFzZUxvY2soKSB7CisgICAgICBpZiAoSXNSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIodGhpcykgPT09IGZhbHNlKSB7CisgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3Ioc3RyZWFtRXJyb3JzX2lsbGVnYWxJbnZvY2F0aW9uKTsKKyAgICAgIH0KKworICAgICAgY29uc3Qgc3RyZWFtID0gdGhpc1tfb3duZXJSZWFkYWJsZVN0cmVhbV07CisgICAgICBpZiAoc3RyZWFtID09PSB1bmRlZmluZWQpIHsKKyAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKKyAgICAgIH0KKworICAgICAgaWYgKHRoaXNbX3JlYWRSZXF1ZXN0c10ubGVuZ3RoID4gMCkgeworICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGVyclJlbGVhc2VSZWFkZXJXaXRoUGVuZGluZ1JlYWQpOworICAgICAgfQorCisgICAgICBSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNSZWxlYXNlKHRoaXMpOworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtUmVhZGVyR2VuZXJpY0NhbmNlbChyZWFkZXIsIHJlYXNvbikgeworICAgIHJldHVybiBSZWFkYWJsZVN0cmVhbUNhbmNlbChyZWFkZXJbX293bmVyUmVhZGFibGVTdHJlYW1dLCByZWFzb24pOworICB9CisKKyAgLy8KKyAgLy8gUmVhZGFibGUgc3RyZWFtIGFic3RyYWN0IG9wZXJhdGlvbnMKKyAgLy8KKworICBmdW5jdGlvbiBBY3F1aXJlUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyKHN0cmVhbSkgeworICAgIHJldHVybiBuZXcgUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyKHN0cmVhbSk7CisgIH0KKworICBmdW5jdGlvbiBSZWFkYWJsZVN0cmVhbUNhbmNlbChzdHJlYW0sIHJlYXNvbikgeworICAgIHN0cmVhbVtfcmVhZGFibGVTdHJlYW1CaXRzXSB8PSBESVNUVVJCRUQ7CisKKyAgICBjb25zdCBzdGF0ZSA9IFJlYWRhYmxlU3RyZWFtR2V0U3RhdGUoc3RyZWFtKTsKKyAgICBpZiAoc3RhdGUgPT09IFNUQVRFX0NMT1NFRCkgeworICAgICAgcmV0dXJuIFByb21pc2VfcmVzb2x2ZSh1bmRlZmluZWQpOworICAgIH0KKyAgICBpZiAoc3RhdGUgPT09IFNUQVRFX0VSUk9SRUQpIHsKKyAgICAgIHJldHVybiBQcm9taXNlX3JlamVjdChzdHJlYW1bX3N0b3JlZEVycm9yXSk7CisgICAgfQorCisgICAgUmVhZGFibGVTdHJlYW1DbG9zZShzdHJlYW0pOworCisgICAgY29uc3Qgc291cmNlQ2FuY2VsUHJvbWlzZSA9IFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDYW5jZWwoc3RyZWFtW19jb250cm9sbGVyXSwgcmVhc29uKTsKKyAgICByZXR1cm4gdGhlblByb21pc2Uoc291cmNlQ2FuY2VsUHJvbWlzZSwgKCkgPT4gdW5kZWZpbmVkKTsKKyAgfQorCisgIGZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbG9zZShjb250cm9sbGVyKSB7CisgICAgY29uc3Qgc3RyZWFtID0gY29udHJvbGxlcltfY29udHJvbGxlZFJlYWRhYmxlU3RyZWFtXTsKKworICAgIGNvbnRyb2xsZXJbX3JlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJCaXRzXSB8PSBDTE9TRV9SRVFVRVNURUQ7CisKKyAgICBpZiAoY29udHJvbGxlcltfcXVldWVdLmxlbmd0aCA9PT0gMCkgeworICAgICAgUmVhZGFibGVTdHJlYW1DbG9zZShzdHJlYW0pOworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRnVsZmlsbFJlYWRSZXF1ZXN0KHN0cmVhbSwgY2h1bmssIGRvbmUpIHsKKyAgICBjb25zdCByZWFkZXIgPSBzdHJlYW1bX3JlYWRlcl07CisKKyAgICBjb25zdCByZWFkUmVxdWVzdCA9IHN0cmVhbVtfcmVhZGVyXVtfcmVhZFJlcXVlc3RzXS5zaGlmdCgpOworICAgIHY4X3Jlc29sdmVQcm9taXNlKHJlYWRSZXF1ZXN0LCBDcmVhdGVJdGVyUmVzdWx0T2JqZWN0KGNodW5rLCBkb25lKSk7CisgIH0KKworICBmdW5jdGlvbiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRW5xdWV1ZShjb250cm9sbGVyLCBjaHVuaykgeworICAgIGNvbnN0IHN0cmVhbSA9IGNvbnRyb2xsZXJbX2NvbnRyb2xsZWRSZWFkYWJsZVN0cmVhbV07CisKKyAgICBpZiAoSXNSZWFkYWJsZVN0cmVhbUxvY2tlZChzdHJlYW0pID09PSB0cnVlICYmIFJlYWRhYmxlU3RyZWFtR2V0TnVtUmVhZFJlcXVlc3RzKHN0cmVhbSkgPiAwKSB7CisgICAgICBSZWFkYWJsZVN0cmVhbUZ1bGZpbGxSZWFkUmVxdWVzdChzdHJlYW0sIGNodW5rLCBmYWxzZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGxldCBjaHVua1NpemUgPSAxOworCisgICAgICBjb25zdCBzdHJhdGVneVNpemUgPSBjb250cm9sbGVyW19zdHJhdGVneVNpemVdOworICAgICAgaWYgKHN0cmF0ZWd5U2l6ZSAhPT0gdW5kZWZpbmVkKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgY2h1bmtTaXplID0gc3RyYXRlZ3lTaXplKGNodW5rKTsKKyAgICAgICAgfSBjYXRjaCAoY2h1bmtTaXplRSkgeworICAgICAgICAgIGlmIChSZWFkYWJsZVN0cmVhbUdldFN0YXRlKHN0cmVhbSkgPT09IFNUQVRFX1JFQURBQkxFKSB7CisgICAgICAgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRXJyb3IoY29udHJvbGxlciwgY2h1bmtTaXplRSk7CisgICAgICAgICAgfQorICAgICAgICAgIHRocm93IGNodW5rU2l6ZUU7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdHJ5IHsKKyAgICAgICAgRW5xdWV1ZVZhbHVlV2l0aFNpemUoY29udHJvbGxlciwgY2h1bmssIGNodW5rU2l6ZSk7CisgICAgICB9IGNhdGNoIChlbnF1ZXVlRSkgeworICAgICAgICBpZiAoUmVhZGFibGVTdHJlYW1HZXRTdGF0ZShzdHJlYW0pID09PSBTVEFURV9SRUFEQUJMRSkgeworICAgICAgICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcihjb250cm9sbGVyLCBlbnF1ZXVlRSk7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgZW5xdWV1ZUU7CisgICAgICB9CisgICAgfQorCisgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNhbGxQdWxsSWZOZWVkZWQoY29udHJvbGxlcik7CisgIH0KKworICBmdW5jdGlvbiBSZWFkYWJsZVN0cmVhbUdldFN0YXRlKHN0cmVhbSkgeworICAgIHJldHVybiAoc3RyZWFtW19yZWFkYWJsZVN0cmVhbUJpdHNdICYgU1RBVEVfTUFTSykgPj4gU1RBVEVfQklUU19PRkZTRVQ7CisgIH0KKworICBmdW5jdGlvbiBSZWFkYWJsZVN0cmVhbVNldFN0YXRlKHN0cmVhbSwgc3RhdGUpIHsKKyAgICBzdHJlYW1bX3JlYWRhYmxlU3RyZWFtQml0c10gPSAoc3RyZWFtW19yZWFkYWJsZVN0cmVhbUJpdHNdICYgflNUQVRFX01BU0spIHwKKyAgICAgICAgKHN0YXRlIDw8IFNUQVRFX0JJVFNfT0ZGU0VUKTsKKyAgfQorCisgIGZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcihjb250cm9sbGVyLCBlKSB7CisgICAgY29udHJvbGxlcltfcXVldWVdID0gbmV3IFNpbXBsZVF1ZXVlKCk7CisgICAgY29uc3Qgc3RyZWFtID0gY29udHJvbGxlcltfY29udHJvbGxlZFJlYWRhYmxlU3RyZWFtXTsKKyAgICBSZWFkYWJsZVN0cmVhbUVycm9yKHN0cmVhbSwgZSk7CisgIH0KKworICBmdW5jdGlvbiBSZWFkYWJsZVN0cmVhbUVycm9yKHN0cmVhbSwgZSkgeworICAgIHN0cmVhbVtfc3RvcmVkRXJyb3JdID0gZTsKKyAgICBSZWFkYWJsZVN0cmVhbVNldFN0YXRlKHN0cmVhbSwgU1RBVEVfRVJST1JFRCk7CisKKyAgICBjb25zdCByZWFkZXIgPSBzdHJlYW1bX3JlYWRlcl07CisgICAgaWYgKHJlYWRlciA9PT0gdW5kZWZpbmVkKSB7CisgICAgICByZXR1cm4gdW5kZWZpbmVkOworICAgIH0KKworICAgIGlmIChJc1JlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcihyZWFkZXIpID09PSB0cnVlKSB7CisgICAgICByZWFkZXJbX3JlYWRSZXF1ZXN0c10uZm9yRWFjaChyZXF1ZXN0ID0+IHY4X3JlamVjdFByb21pc2UocmVxdWVzdCwgZSkpOworICAgICAgcmVhZGVyW19yZWFkUmVxdWVzdHNdID0gbmV3IFNpbXBsZVF1ZXVlKCk7CisgICAgfQorCisgICAgdjhfcmVqZWN0UHJvbWlzZShyZWFkZXJbX2Nsb3NlZFByb21pc2VdLCBlKTsKKyAgICB2OF9tYXJrUHJvbWlzZUFzSGFuZGxlZChyZWFkZXJbX2Nsb3NlZFByb21pc2VdKTsKKyAgfQorCisgIGZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtQ2xvc2Uoc3RyZWFtKSB7CisgICAgUmVhZGFibGVTdHJlYW1TZXRTdGF0ZShzdHJlYW0sIFNUQVRFX0NMT1NFRCk7CisKKyAgICBjb25zdCByZWFkZXIgPSBzdHJlYW1bX3JlYWRlcl07CisgICAgaWYgKHJlYWRlciA9PT0gdW5kZWZpbmVkKSB7CisgICAgICByZXR1cm4gdW5kZWZpbmVkOworICAgIH0KKworICAgIGlmIChJc1JlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcihyZWFkZXIpID09PSB0cnVlKSB7CisgICAgICByZWFkZXJbX3JlYWRSZXF1ZXN0c10uZm9yRWFjaChyZXF1ZXN0ID0+CisgICAgICAgICAgdjhfcmVzb2x2ZVByb21pc2UocmVxdWVzdCwgQ3JlYXRlSXRlclJlc3VsdE9iamVjdCh1bmRlZmluZWQsIHRydWUpKSk7CisgICAgICByZWFkZXJbX3JlYWRSZXF1ZXN0c10gPSBuZXcgU2ltcGxlUXVldWUoKTsKKyAgICB9CisKKyAgICB2OF9yZXNvbHZlUHJvbWlzZShyZWFkZXJbX2Nsb3NlZFByb21pc2VdLCB1bmRlZmluZWQpOworICB9CisKKyAgZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckdldERlc2lyZWRTaXplKGNvbnRyb2xsZXIpIHsKKyAgICAvLyBDb2JhbHQ6IFdoZW4gdGhlIHN0YXRlIGlzIGNsb3NlZCBvciBlcnJvcmVkLCByZXR1cm4gcGFydGljdWxhciB2YWx1ZXMuCisgICAgY29uc3Qgc3RyZWFtID0gY29udHJvbGxlcltfY29udHJvbGxlZFJlYWRhYmxlU3RyZWFtXTsKKyAgICBjb25zdCBzdGF0ZSA9IFJlYWRhYmxlU3RyZWFtR2V0U3RhdGUoc3RyZWFtKTsKKyAgICBpZiAoc3RhdGUgPT09IFNUQVRFX0NMT1NFRCkgeworICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIGlmIChzdGF0ZSA9PT0gU1RBVEVfRVJST1JFRCkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgY29uc3QgcXVldWVTaXplID0gR2V0VG90YWxRdWV1ZVNpemUoY29udHJvbGxlcik7CisgICAgcmV0dXJuIGNvbnRyb2xsZXJbX3N0cmF0ZWd5SFdNXSAtIHF1ZXVlU2l6ZTsKKyAgfQorCisgIGZ1bmN0aW9uIElzUmVhZGFibGVTdHJlYW0oeCkgeworICAgIHJldHVybiBoYXNPd25Qcm9wZXJ0eSh4LCBfY29udHJvbGxlcik7CisgIH0KKworICBmdW5jdGlvbiBJc1JlYWRhYmxlU3RyZWFtRGlzdHVyYmVkKHN0cmVhbSkgeworICAgIHJldHVybiBzdHJlYW1bX3JlYWRhYmxlU3RyZWFtQml0c10gJiBESVNUVVJCRUQ7CisgIH0KKworICBmdW5jdGlvbiBJc1JlYWRhYmxlU3RyZWFtTG9ja2VkKHN0cmVhbSkgeworICAgIHJldHVybiBzdHJlYW1bX3JlYWRlcl0gIT09IHVuZGVmaW5lZDsKKyAgfQorCisgIGZ1bmN0aW9uIElzUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcih4KSB7CisgICAgcmV0dXJuIGhhc093blByb3BlcnR5KHgsIF9jb250cm9sbGVkUmVhZGFibGVTdHJlYW0pOworICB9CisKKyAgZnVuY3Rpb24gSXNSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIoeCkgeworICAgIHJldHVybiBoYXNPd25Qcm9wZXJ0eSh4LCBfcmVhZFJlcXVlc3RzKTsKKyAgfQorCisgIGZ1bmN0aW9uIElzUmVhZGFibGVTdHJlYW1SZWFkYWJsZShzdHJlYW0pIHsKKyAgICByZXR1cm4gUmVhZGFibGVTdHJlYW1HZXRTdGF0ZShzdHJlYW0pID09PSBTVEFURV9SRUFEQUJMRTsKKyAgfQorCisgIGZ1bmN0aW9uIElzUmVhZGFibGVTdHJlYW1DbG9zZWQoc3RyZWFtKSB7CisgICAgcmV0dXJuIFJlYWRhYmxlU3RyZWFtR2V0U3RhdGUoc3RyZWFtKSA9PT0gU1RBVEVfQ0xPU0VEOworICB9CisKKyAgZnVuY3Rpb24gSXNSZWFkYWJsZVN0cmVhbUVycm9yZWQoc3RyZWFtKSB7CisgICAgcmV0dXJuIFJlYWRhYmxlU3RyZWFtR2V0U3RhdGUoc3RyZWFtKSA9PT0gU1RBVEVfRVJST1JFRDsKKyAgfQorCisgIGZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtUmVhZGVyR2VuZXJpY0luaXRpYWxpemUocmVhZGVyLCBzdHJlYW0pIHsKKyAgICAvLyBUT0RPKHloaXJhbm8pOiBSZW1vdmUgdGhpcyB3aGVuIHdlIGRvbid0IG5lZWQgaGFzUGVuZGluZ0FjdGl2aXR5IGluCisgICAgLy8gYmxpbms6OlVuZGVybHlpbmdTb3VyY2VCYXNlLgorICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBzdHJlYW1bX2NvbnRyb2xsZXJdOworICAgIGlmIChjb250cm9sbGVyW19yZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQml0c10gJiBFWFRFUk5BTExZX0NPTlRST0xMRUQpIHsKKyAgICAgIC8vIFRoZSBzdHJlYW0gaXMgY3JlYXRlZCB3aXRoIGFuIGV4dGVybmFsIGNvbnRyb2xsZXIgKGkuZS4gbWFkZSBpbgorICAgICAgLy8gQmxpbmspLgorICAgICAgY29uc3QgdW5kZXJseWluZ1NvdXJjZSA9IGNvbnRyb2xsZXJbX3VuZGVybHlpbmdTb3VyY2VdOworICAgICAgY2FsbEZ1bmN0aW9uKHVuZGVybHlpbmdTb3VyY2Uubm90aWZ5TG9ja0FjcXVpcmVkLCB1bmRlcmx5aW5nU291cmNlKTsKKyAgICB9CisKKyAgICByZWFkZXJbX293bmVyUmVhZGFibGVTdHJlYW1dID0gc3RyZWFtOworICAgIHN0cmVhbVtfcmVhZGVyXSA9IHJlYWRlcjsKKworICAgIHN3aXRjaCAoUmVhZGFibGVTdHJlYW1HZXRTdGF0ZShzdHJlYW0pKSB7CisgICAgICBjYXNlIFNUQVRFX1JFQURBQkxFOgorICAgICAgICByZWFkZXJbX2Nsb3NlZFByb21pc2VdID0gdjhfY3JlYXRlUHJvbWlzZSgpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU1RBVEVfQ0xPU0VEOgorICAgICAgICByZWFkZXJbX2Nsb3NlZFByb21pc2VdID0gUHJvbWlzZV9yZXNvbHZlKHVuZGVmaW5lZCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTVEFURV9FUlJPUkVEOgorICAgICAgICByZWFkZXJbX2Nsb3NlZFByb21pc2VdID0gUHJvbWlzZV9yZWplY3Qoc3RyZWFtW19zdG9yZWRFcnJvcl0pOworICAgICAgICB2OF9tYXJrUHJvbWlzZUFzSGFuZGxlZChyZWFkZXJbX2Nsb3NlZFByb21pc2VdKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1SZWFkZXJHZW5lcmljUmVsZWFzZShyZWFkZXIpIHsKKyAgICAvLyBUT0RPKHloaXJhbm8pOiBSZW1vdmUgdGhpcyB3aGVuIHdlIGRvbid0IG5lZWQgaGFzUGVuZGluZ0FjdGl2aXR5IGluCisgICAgLy8gYmxpbms6OlVuZGVybHlpbmdTb3VyY2VCYXNlLgorICAgIGNvbnN0IGNvbnRyb2xsZXIgPSByZWFkZXJbX293bmVyUmVhZGFibGVTdHJlYW1dW19jb250cm9sbGVyXTsKKyAgICBpZiAoY29udHJvbGxlcltfcmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckJpdHNdICYgRVhURVJOQUxMWV9DT05UUk9MTEVEKSB7CisgICAgICAvLyBUaGUgc3RyZWFtIGlzIGNyZWF0ZWQgd2l0aCBhbiBleHRlcm5hbCBjb250cm9sbGVyIChpLmUuIG1hZGUgaW4KKyAgICAgIC8vIEJsaW5rKS4KKyAgICAgIGNvbnN0IHVuZGVybHlpbmdTb3VyY2UgPSBjb250cm9sbGVyW191bmRlcmx5aW5nU291cmNlXTsKKyAgICAgIGNhbGxGdW5jdGlvbih1bmRlcmx5aW5nU291cmNlLm5vdGlmeUxvY2tSZWxlYXNlZCwgdW5kZXJseWluZ1NvdXJjZSk7CisgICAgfQorCisgICAgaWYgKFJlYWRhYmxlU3RyZWFtR2V0U3RhdGUocmVhZGVyW19vd25lclJlYWRhYmxlU3RyZWFtXSkgPT09IFNUQVRFX1JFQURBQkxFKSB7CisgICAgICB2OF9yZWplY3RQcm9taXNlKHJlYWRlcltfY2xvc2VkUHJvbWlzZV0sIG5ldyBUeXBlRXJyb3IoZXJyUmVsZWFzZWRSZWFkZXJDbG9zZWRQcm9taXNlKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlYWRlcltfY2xvc2VkUHJvbWlzZV0gPSBQcm9taXNlX3JlamVjdChuZXcgVHlwZUVycm9yKGVyclJlbGVhc2VkUmVhZGVyQ2xvc2VkUHJvbWlzZSkpOworICAgIH0KKyAgICB2OF9tYXJrUHJvbWlzZUFzSGFuZGxlZChyZWFkZXJbX2Nsb3NlZFByb21pc2VdKTsKKworICAgIHJlYWRlcltfb3duZXJSZWFkYWJsZVN0cmVhbV1bX3JlYWRlcl0gPSB1bmRlZmluZWQ7CisgICAgcmVhZGVyW19vd25lclJlYWRhYmxlU3RyZWFtXSA9IHVuZGVmaW5lZDsKKyAgfQorCisgIGZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlclJlYWQocmVhZGVyKSB7CisgICAgY29uc3Qgc3RyZWFtID0gcmVhZGVyW19vd25lclJlYWRhYmxlU3RyZWFtXTsKKyAgICBzdHJlYW1bX3JlYWRhYmxlU3RyZWFtQml0c10gfD0gRElTVFVSQkVEOworCisgICAgaWYgKFJlYWRhYmxlU3RyZWFtR2V0U3RhdGUoc3RyZWFtKSA9PT0gU1RBVEVfQ0xPU0VEKSB7CisgICAgICByZXR1cm4gUHJvbWlzZV9yZXNvbHZlKENyZWF0ZUl0ZXJSZXN1bHRPYmplY3QodW5kZWZpbmVkLCB0cnVlKSk7CisgICAgfQorCisgICAgaWYgKFJlYWRhYmxlU3RyZWFtR2V0U3RhdGUoc3RyZWFtKSA9PT0gU1RBVEVfRVJST1JFRCkgeworICAgICAgcmV0dXJuIFByb21pc2VfcmVqZWN0KHN0cmVhbVtfc3RvcmVkRXJyb3JdKTsKKyAgICB9CisKKyAgICByZXR1cm4gUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlclB1bGwoc3RyZWFtW19jb250cm9sbGVyXSk7CisgIH0KKworICBmdW5jdGlvbiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FsbFB1bGxJZk5lZWRlZChjb250cm9sbGVyKSB7CisgICAgY29uc3Qgc2hvdWxkUHVsbCA9IFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJTaG91bGRDYWxsUHVsbChjb250cm9sbGVyKTsKKyAgICBpZiAoc2hvdWxkUHVsbCA9PT0gZmFsc2UpIHsKKyAgICAgIHJldHVybiB1bmRlZmluZWQ7CisgICAgfQorCisgICAgaWYgKGNvbnRyb2xsZXJbX3JlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJCaXRzXSAmIFBVTExJTkcpIHsKKyAgICAgIGNvbnRyb2xsZXJbX3JlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJCaXRzXSB8PSBQVUxMX0FHQUlOOworICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKKyAgICB9CisKKyAgICBjb250cm9sbGVyW19yZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQml0c10gfD0gUFVMTElORzsKKworICAgIGNvbnN0IHVuZGVybHlpbmdTb3VyY2UgPSBjb250cm9sbGVyW191bmRlcmx5aW5nU291cmNlXTsKKyAgICBjb25zdCBwdWxsUHJvbWlzZSA9IFByb21pc2VDYWxsT3JOb29wKAorICAgICAgICB1bmRlcmx5aW5nU291cmNlLCAncHVsbCcsIGNvbnRyb2xsZXIsICd1bmRlcmx5aW5nU291cmNlLnB1bGwnKTsKKworICAgIHRoZW5Qcm9taXNlKHB1bGxQcm9taXNlLAorICAgICAgICAoKSA9PiB7CisgICAgICAgICAgY29udHJvbGxlcltfcmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckJpdHNdICY9IH5QVUxMSU5HOworCisgICAgICAgICAgaWYgKGNvbnRyb2xsZXJbX3JlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJCaXRzXSAmIFBVTExfQUdBSU4pIHsKKyAgICAgICAgICAgIGNvbnRyb2xsZXJbX3JlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJCaXRzXSAmPSB+UFVMTF9BR0FJTjsKKyAgICAgICAgICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDYWxsUHVsbElmTmVlZGVkKGNvbnRyb2xsZXIpOworICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgZSA9PiB7CisgICAgICAgICAgaWYgKFJlYWRhYmxlU3RyZWFtR2V0U3RhdGUoY29udHJvbGxlcltfY29udHJvbGxlZFJlYWRhYmxlU3RyZWFtXSkgPT09IFNUQVRFX1JFQURBQkxFKSB7CisgICAgICAgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRXJyb3IoY29udHJvbGxlciwgZSk7CisgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgfQorCisgIGZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJTaG91bGRDYWxsUHVsbChjb250cm9sbGVyKSB7CisgICAgY29uc3Qgc3RyZWFtID0gY29udHJvbGxlcltfY29udHJvbGxlZFJlYWRhYmxlU3RyZWFtXTsKKworICAgIGNvbnN0IHN0YXRlID0gUmVhZGFibGVTdHJlYW1HZXRTdGF0ZShzdHJlYW0pOworICAgIGlmIChzdGF0ZSA9PT0gU1RBVEVfQ0xPU0VEIHx8IHN0YXRlID09PSBTVEFURV9FUlJPUkVEKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKGNvbnRyb2xsZXJbX3JlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJCaXRzXSAmIENMT1NFX1JFUVVFU1RFRCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICghKGNvbnRyb2xsZXJbX3JlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJCaXRzXSAmIFNUQVJURUQpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKElzUmVhZGFibGVTdHJlYW1Mb2NrZWQoc3RyZWFtKSA9PT0gdHJ1ZSAmJiBSZWFkYWJsZVN0cmVhbUdldE51bVJlYWRSZXF1ZXN0cyhzdHJlYW0pID4gMCkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgY29uc3QgZGVzaXJlZFNpemUgPSBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyR2V0RGVzaXJlZFNpemUoY29udHJvbGxlcik7CisgICAgaWYgKGRlc2lyZWRTaXplID4gMCkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1HZXROdW1SZWFkUmVxdWVzdHMoc3RyZWFtKSB7CisgICAgY29uc3QgcmVhZGVyID0gc3RyZWFtW19yZWFkZXJdOworICAgIGNvbnN0IHJlYWRSZXF1ZXN0cyA9IHJlYWRlcltfcmVhZFJlcXVlc3RzXTsKKyAgICByZXR1cm4gcmVhZFJlcXVlc3RzLmxlbmd0aDsKKyAgfQorCisgIC8vIFBvdGVudGlhbCBmdXR1cmUgb3B0aW1pemF0aW9uOiB1c2UgY2xhc3MgaW5zdGFuY2VzIGZvciB0aGUgdW5kZXJseWluZworICAvLyBzb3VyY2VzLCBzbyB0aGF0IHdlIGRvbid0IHJlLWNyZWF0ZQorICAvLyBjbG9zdXJlcyBldmVyeSB0aW1lLgorCisgIC8vIFRPRE8oZG9tZW5pYyk6IHNob3VsZENsb25lIGFyZ3VtZW50IGZyb20gc3BlYyBub3Qgc3VwcG9ydGVkIHlldAorICBmdW5jdGlvbiBSZWFkYWJsZVN0cmVhbVRlZShzdHJlYW0pIHsKKyAgICBjb25zdCByZWFkZXIgPSBBY3F1aXJlUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyKHN0cmVhbSk7CisKKyAgICBsZXQgY2xvc2VkT3JFcnJvcmVkID0gZmFsc2U7CisgICAgbGV0IGNhbmNlbGVkMSA9IGZhbHNlOworICAgIGxldCBjYW5jZWxlZDIgPSBmYWxzZTsKKyAgICBsZXQgcmVhc29uMTsKKyAgICBsZXQgcmVhc29uMjsKKyAgICBsZXQgcHJvbWlzZSA9IHY4X2NyZWF0ZVByb21pc2UoKTsKKworICAgIGNvbnN0IGJyYW5jaDFTdHJlYW0gPSBuZXcgUmVhZGFibGVTdHJlYW0oe3B1bGwsIGNhbmNlbDogY2FuY2VsMX0pOworCisgICAgY29uc3QgYnJhbmNoMlN0cmVhbSA9IG5ldyBSZWFkYWJsZVN0cmVhbSh7cHVsbCwgY2FuY2VsOiBjYW5jZWwyfSk7CisKKyAgICBjb25zdCBicmFuY2gxID0gYnJhbmNoMVN0cmVhbVtfY29udHJvbGxlcl07CisgICAgY29uc3QgYnJhbmNoMiA9IGJyYW5jaDJTdHJlYW1bX2NvbnRyb2xsZXJdOworCisgICAgdGhlblByb21pc2UoCisgICAgICAgIHJlYWRlcltfY2xvc2VkUHJvbWlzZV0sIHVuZGVmaW5lZCwgZnVuY3Rpb24ocikgeworICAgICAgICAgIGlmIChjbG9zZWRPckVycm9yZWQgPT09IHRydWUpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRXJyb3IoYnJhbmNoMSwgcik7CisgICAgICAgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9yKGJyYW5jaDIsIHIpOworICAgICAgICAgIGNsb3NlZE9yRXJyb3JlZCA9IHRydWU7CisgICAgICAgIH0pOworCisgICAgcmV0dXJuIFticmFuY2gxU3RyZWFtLCBicmFuY2gyU3RyZWFtXTsKKworICAgIGZ1bmN0aW9uIHB1bGwoKSB7CisgICAgICByZXR1cm4gdGhlblByb21pc2UoCisgICAgICAgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyUmVhZChyZWFkZXIpLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcmVzdWx0LnZhbHVlOworICAgICAgICAgICAgY29uc3QgZG9uZSA9IHJlc3VsdC5kb25lOworCisgICAgICAgICAgICBpZiAoZG9uZSA9PT0gdHJ1ZSAmJiBjbG9zZWRPckVycm9yZWQgPT09IGZhbHNlKSB7CisgICAgICAgICAgICAgIGlmIChjYW5jZWxlZDEgPT09IGZhbHNlKSB7CisgICAgICAgICAgICAgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsb3NlKGJyYW5jaDEpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGlmIChjYW5jZWxlZDIgPT09IGZhbHNlKSB7CisgICAgICAgICAgICAgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsb3NlKGJyYW5jaDIpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGNsb3NlZE9yRXJyb3JlZCA9IHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjbG9zZWRPckVycm9yZWQgPT09IHRydWUpIHsKKyAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY2FuY2VsZWQxID09PSBmYWxzZSkgeworICAgICAgICAgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRW5xdWV1ZShicmFuY2gxLCB2YWx1ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjYW5jZWxlZDIgPT09IGZhbHNlKSB7CisgICAgICAgICAgICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFbnF1ZXVlKGJyYW5jaDIsIHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9KTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBjYW5jZWwxKHJlYXNvbikgeworICAgICAgY2FuY2VsZWQxID0gdHJ1ZTsKKyAgICAgIHJlYXNvbjEgPSByZWFzb247CisKKyAgICAgIGlmIChjYW5jZWxlZDIgPT09IHRydWUpIHsKKyAgICAgICAgY29uc3QgY29tcG9zaXRlUmVhc29uID0gW3JlYXNvbjEsIHJlYXNvbjJdOworICAgICAgICBjb25zdCBjYW5jZWxSZXN1bHQgPSBSZWFkYWJsZVN0cmVhbUNhbmNlbChzdHJlYW0sIGNvbXBvc2l0ZVJlYXNvbik7CisgICAgICAgIHY4X3Jlc29sdmVQcm9taXNlKHByb21pc2UsIGNhbmNlbFJlc3VsdCk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBwcm9taXNlOworICAgIH0KKworICAgIGZ1bmN0aW9uIGNhbmNlbDIocmVhc29uKSB7CisgICAgICBjYW5jZWxlZDIgPSB0cnVlOworICAgICAgcmVhc29uMiA9IHJlYXNvbjsKKworICAgICAgaWYgKGNhbmNlbGVkMSA9PT0gdHJ1ZSkgeworICAgICAgICBjb25zdCBjb21wb3NpdGVSZWFzb24gPSBbcmVhc29uMSwgcmVhc29uMl07CisgICAgICAgIGNvbnN0IGNhbmNlbFJlc3VsdCA9IFJlYWRhYmxlU3RyZWFtQ2FuY2VsKHN0cmVhbSwgY29tcG9zaXRlUmVhc29uKTsKKyAgICAgICAgdjhfcmVzb2x2ZVByb21pc2UocHJvbWlzZSwgY2FuY2VsUmVzdWx0KTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHByb21pc2U7CisgICAgfQorICB9CisKKyAgLy8KKyAgLy8gUXVldWUtd2l0aC1zaXplcworICAvLworCisgIGZ1bmN0aW9uIERlcXVldWVWYWx1ZShjb250cm9sbGVyKSB7CisgICAgY29uc3QgcmVzdWx0ID0gY29udHJvbGxlcltfcXVldWVdLnNoaWZ0KCk7CisgICAgY29udHJvbGxlcltfdG90YWxRdWV1ZWRTaXplXSAtPSByZXN1bHQuc2l6ZTsKKyAgICByZXR1cm4gcmVzdWx0LnZhbHVlOworICB9CisKKyAgZnVuY3Rpb24gRW5xdWV1ZVZhbHVlV2l0aFNpemUoY29udHJvbGxlciwgdmFsdWUsIHNpemUpIHsKKyAgICBzaXplID0gTnVtYmVyKHNpemUpOworICAgIGlmIChOdW1iZXJfaXNOYU4oc2l6ZSkgfHwgc2l6ZSA9PT0gK0luZmluaXR5IHx8IHNpemUgPCAwKSB7CisgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihzdHJlYW1FcnJvcnNfaW52YWxpZFNpemUpOworICAgIH0KKworICAgIGNvbnRyb2xsZXJbX3RvdGFsUXVldWVkU2l6ZV0gKz0gc2l6ZTsKKyAgICBjb250cm9sbGVyW19xdWV1ZV0ucHVzaCh7dmFsdWUsIHNpemV9KTsKKyAgfQorCisgIGZ1bmN0aW9uIEdldFRvdGFsUXVldWVTaXplKGNvbnRyb2xsZXIpIHsgcmV0dXJuIGNvbnRyb2xsZXJbX3RvdGFsUXVldWVkU2l6ZV07IH0KKworICAvLworICAvLyBPdGhlciBoZWxwZXJzCisgIC8vCisKKyAgZnVuY3Rpb24gVmFsaWRhdGVBbmROb3JtYWxpemVRdWV1aW5nU3RyYXRlZ3koc2l6ZSwgaGlnaFdhdGVyTWFyaykgeworICAgIGlmIChzaXplICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHNpemUgIT09ICdmdW5jdGlvbicpIHsKKyAgICAgIHRocm93IG5ldyBUeXBlRXJyb3Ioc3RyZWFtRXJyb3JzX3NpemVOb3RBRnVuY3Rpb24pOworICAgIH0KKworICAgIGhpZ2hXYXRlck1hcmsgPSBOdW1iZXIoaGlnaFdhdGVyTWFyayk7CisgICAgaWYgKE51bWJlcl9pc05hTihoaWdoV2F0ZXJNYXJrKSkgeworICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3Ioc3RyZWFtRXJyb3JzX2ludmFsaWRIV00pOworICAgIH0KKyAgICBpZiAoaGlnaFdhdGVyTWFyayA8IDApIHsKKyAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKHN0cmVhbUVycm9yc19pbnZhbGlkSFdNKTsKKyAgICB9CisKKyAgICByZXR1cm4ge3NpemUsIGhpZ2hXYXRlck1hcmt9OworICB9CisKKyAgLy8gTW9kaWZpZWQgZnJvbSBJbnZva2VPck5vb3AgaW4gc3BlYworICBmdW5jdGlvbiBDYWxsT3JOb29wKE8sIFAsIGFyZywgbmFtZUZvckVycm9yKSB7CisgICAgY29uc3QgbWV0aG9kID0gT1tQXTsKKyAgICBpZiAobWV0aG9kID09PSB1bmRlZmluZWQpIHsKKyAgICAgIHJldHVybiB1bmRlZmluZWQ7CisgICAgfQorICAgIGlmICh0eXBlb2YgbWV0aG9kICE9PSAnZnVuY3Rpb24nKSB7CisgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGVyclRtcGxNdXN0QmVGdW5jdGlvbk9yVW5kZWZpbmVkKG5hbWVGb3JFcnJvcikpOworICAgIH0KKworICAgIHJldHVybiBjYWxsRnVuY3Rpb24obWV0aG9kLCBPLCBhcmcpOworICB9CisKKworICAvLyBNb2RpZmllZCBmcm9tIFByb21pc2VJbnZva2VPck5vb3AgaW4gc3BlYworICBmdW5jdGlvbiBQcm9taXNlQ2FsbE9yTm9vcChPLCBQLCBhcmcsIG5hbWVGb3JFcnJvcikgeworICAgIGxldCBtZXRob2Q7CisgICAgdHJ5IHsKKyAgICAgIG1ldGhvZCA9IE9bUF07CisgICAgfSBjYXRjaCAobWV0aG9kRSkgeworICAgICAgcmV0dXJuIFByb21pc2VfcmVqZWN0KG1ldGhvZEUpOworICAgIH0KKworICAgIGlmIChtZXRob2QgPT09IHVuZGVmaW5lZCkgeworICAgICAgcmV0dXJuIFByb21pc2VfcmVzb2x2ZSh1bmRlZmluZWQpOworICAgIH0KKworICAgIGlmICh0eXBlb2YgbWV0aG9kICE9PSAnZnVuY3Rpb24nKSB7CisgICAgICByZXR1cm4gUHJvbWlzZV9yZWplY3QobmV3IFR5cGVFcnJvcihlcnJUbXBsTXVzdEJlRnVuY3Rpb25PclVuZGVmaW5lZChuYW1lRm9yRXJyb3IpKSk7CisgICAgfQorCisgICAgdHJ5IHsKKyAgICAgIHJldHVybiBQcm9taXNlX3Jlc29sdmUoY2FsbEZ1bmN0aW9uKG1ldGhvZCwgTywgYXJnKSk7CisgICAgfSBjYXRjaCAoZSkgeworICAgICAgcmV0dXJuIFByb21pc2VfcmVqZWN0KGUpOworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIENyZWF0ZUl0ZXJSZXN1bHRPYmplY3QodmFsdWUsIGRvbmUpIHsgcmV0dXJuIHt2YWx1ZSwgZG9uZX07IH0KKworCisgIC8vCisgIC8vIEFkZGl0aW9ucyB0byB0aGUgZ2xvYmFsCisgIC8vCisKKyAgZGVmaW5lUHJvcGVydHkoZ2xvYmFsLCAnUmVhZGFibGVTdHJlYW0nLCB7CisgICAgdmFsdWU6IFJlYWRhYmxlU3RyZWFtLAorICAgIGVudW1lcmFibGU6IGZhbHNlLAorICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKKyAgICB3cml0YWJsZTogdHJ1ZQorICB9KTsKKworICAvLworICAvLyBFeHBvcnRzIHRvIEJsaW5rCisgIC8vCisKKy8qCisgIGJpbmRpbmcuQWNxdWlyZVJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlciA9IEFjcXVpcmVSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXI7CisgIGJpbmRpbmcuSXNSZWFkYWJsZVN0cmVhbSA9IElzUmVhZGFibGVTdHJlYW07CisgIGJpbmRpbmcuSXNSZWFkYWJsZVN0cmVhbURpc3R1cmJlZCA9IElzUmVhZGFibGVTdHJlYW1EaXN0dXJiZWQ7CisgIGJpbmRpbmcuSXNSZWFkYWJsZVN0cmVhbUxvY2tlZCA9IElzUmVhZGFibGVTdHJlYW1Mb2NrZWQ7CisgIGJpbmRpbmcuSXNSZWFkYWJsZVN0cmVhbVJlYWRhYmxlID0gSXNSZWFkYWJsZVN0cmVhbVJlYWRhYmxlOworICBiaW5kaW5nLklzUmVhZGFibGVTdHJlYW1DbG9zZWQgPSBJc1JlYWRhYmxlU3RyZWFtQ2xvc2VkOworICBiaW5kaW5nLklzUmVhZGFibGVTdHJlYW1FcnJvcmVkID0gSXNSZWFkYWJsZVN0cmVhbUVycm9yZWQ7CisgIGJpbmRpbmcuSXNSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIgPSBJc1JlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcjsKKyAgYmluZGluZy5SZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXJSZWFkID0gUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyUmVhZDsKKyAgYmluZGluZy5SZWFkYWJsZVN0cmVhbVRlZSA9IFJlYWRhYmxlU3RyZWFtVGVlOworCisgIGJpbmRpbmcuUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsb3NlID0gUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsb3NlOworICBiaW5kaW5nLlJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXREZXNpcmVkU2l6ZSA9IFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXREZXNpcmVkU2l6ZTsKKyAgYmluZGluZy5SZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRW5xdWV1ZSA9IFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFbnF1ZXVlOworICBiaW5kaW5nLlJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvciA9IFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcjsKKworICBiaW5kaW5nLmNyZWF0ZVJlYWRhYmxlU3RyZWFtV2l0aEV4dGVybmFsQ29udHJvbGxlciA9CisgICAgICAodW5kZXJseWluZ1NvdXJjZSwgc3RyYXRlZ3kpID0+IHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZWFkYWJsZVN0cmVhbSgKKyAgICAgICAgICAgIHVuZGVybHlpbmdTb3VyY2UsIHN0cmF0ZWd5LCBjcmVhdGVXaXRoRXh0ZXJuYWxDb250cm9sbGVyU2VudGluZWwpOworICAgICAgfTsKKyovCit9KSh0aGlzKTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvdHJhY2VfZXZlbnQvYmVuY2htYXJrX2ludGVybmFsLmggYi9zcmMvY29iYWx0L3RyYWNlX2V2ZW50L2JlbmNobWFya19pbnRlcm5hbC5oCmluZGV4IGM2YTEzY2QuLmYwNjBhMmQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvdHJhY2VfZXZlbnQvYmVuY2htYXJrX2ludGVybmFsLmgKKysrIGIvc3JjL2NvYmFsdC90cmFjZV9ldmVudC9iZW5jaG1hcmtfaW50ZXJuYWwuaApAQCAtNjIsMTggKzYyLDIwIEBACiAgICAgc3dpdGNoIChtZWFzdXJlbWVudF90eXBlXzEpIHtcCiAgICAgICBjYXNlIGNvYmFsdDo6dHJhY2VfZXZlbnQ6OkZMT1dfRFVSQVRJT046IHtcCiAgICAgICAgIHJlc3VsdHMucHVzaF9iYWNrKFwKLSAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzEpICsgIiBmbG93IGR1cmF0aW9uIGluIHNlY29uZHMiLFwKKyAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzEpICtcCisgICAgICAgICAgICAgICAgICAgIiBmbG93IGR1cmF0aW9uIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfMV9zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgICAgY2FzZSBjb2JhbHQ6OnRyYWNlX2V2ZW50OjpJTl9TQ09QRV9EVVJBVElPTjoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMSkgKyAiIGluLXNjb3BlIGR1cmF0aW9uIGluIHNlY29uZHMiLFwKKyAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzEpICtcCisgICAgICAgICAgICAgICAgICAgIiBpbi1zY29wZSBkdXJhdGlvbiBpbiBzZWNvbmRzIiwgXAogICAgICAgICAgICAgICAgICAgIGV2ZW50XzFfc2FtcGxlc18pKTtcCiAgICAgICB9IGJyZWFrO1wKICAgICAgIGNhc2UgY29iYWx0Ojp0cmFjZV9ldmVudDo6VElNRV9CRVRXRUVOX0VWRU5UX1NUQVJUUzoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMSkgKyAiIHRpbWUgYmV0d2VlbiBldmVudCBzdGFydHMgaW4gXAotICAgICAgICAgICAgICAgIHNlY29uZHMiLFwKKyAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzEpICtcCisgICAgICAgICAgICAgICAgICAgIiB0aW1lIGJldHdlZW4gZXZlbnQgc3RhcnRzIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfMV9zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgIH1cCkBAIC0xNTUsMzYgKzE1Nyw0MCBAQAogICAgIHN3aXRjaCAobWVhc3VyZW1lbnRfdHlwZV8xKSB7XAogICAgICAgY2FzZSBjb2JhbHQ6OnRyYWNlX2V2ZW50OjpGTE9XX0RVUkFUSU9OOiB7XAogICAgICAgICByZXN1bHRzLnB1c2hfYmFjayhcCi0gICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV8xKSArICIgZmxvdyBkdXJhdGlvbiBpbiBzZWNvbmRzIixcCisgICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV8xKSArXAorICAgICAgICAgICAgICAgICAgICIgZmxvdyBkdXJhdGlvbiBpbiBzZWNvbmRzIiwgXAogICAgICAgICAgICAgICAgICAgIGV2ZW50XzFfc2FtcGxlc18pKTtcCiAgICAgICB9IGJyZWFrO1wKICAgICAgIGNhc2UgY29iYWx0Ojp0cmFjZV9ldmVudDo6SU5fU0NPUEVfRFVSQVRJT046IHtcCiAgICAgICAgIHJlc3VsdHMucHVzaF9iYWNrKFwKLSAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzEpICsgIiBpbi1zY29wZSBkdXJhdGlvbiBpbiBzZWNvbmRzIixcCisgICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV8xKSArXAorICAgICAgICAgICAgICAgICAgICIgaW4tc2NvcGUgZHVyYXRpb24gaW4gc2Vjb25kcyIsIFwKICAgICAgICAgICAgICAgICAgICBldmVudF8xX3NhbXBsZXNfKSk7XAogICAgICAgfSBicmVhaztcCiAgICAgICBjYXNlIGNvYmFsdDo6dHJhY2VfZXZlbnQ6OlRJTUVfQkVUV0VFTl9FVkVOVF9TVEFSVFM6IHtcCiAgICAgICAgIHJlc3VsdHMucHVzaF9iYWNrKFwKLSAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzEpICsgIiB0aW1lIGJldHdlZW4gZXZlbnQgc3RhcnRzIGluIFwKLSAgICAgICAgICAgICAgICBzZWNvbmRzIixcCisgICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV8xKSArXAorICAgICAgICAgICAgICAgICAgICIgdGltZSBiZXR3ZWVuIGV2ZW50IHN0YXJ0cyBpbiBzZWNvbmRzIiwgXAogICAgICAgICAgICAgICAgICAgIGV2ZW50XzFfc2FtcGxlc18pKTtcCiAgICAgICB9IGJyZWFrO1wKICAgICB9XAogICAgIHN3aXRjaCAobWVhc3VyZW1lbnRfdHlwZV8yKSB7XAogICAgICAgY2FzZSBjb2JhbHQ6OnRyYWNlX2V2ZW50OjpGTE9XX0RVUkFUSU9OOiB7XAogICAgICAgICByZXN1bHRzLnB1c2hfYmFjayhcCi0gICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV8yKSArICIgZmxvdyBkdXJhdGlvbiBpbiBzZWNvbmRzIixcCisgICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV8yKSArXAorICAgICAgICAgICAgICAgICAgICIgZmxvdyBkdXJhdGlvbiBpbiBzZWNvbmRzIiwgXAogICAgICAgICAgICAgICAgICAgIGV2ZW50XzJfc2FtcGxlc18pKTtcCiAgICAgICB9IGJyZWFrO1wKICAgICAgIGNhc2UgY29iYWx0Ojp0cmFjZV9ldmVudDo6SU5fU0NPUEVfRFVSQVRJT046IHtcCiAgICAgICAgIHJlc3VsdHMucHVzaF9iYWNrKFwKLSAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzIpICsgIiBpbi1zY29wZSBkdXJhdGlvbiBpbiBzZWNvbmRzIixcCisgICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV8yKSArXAorICAgICAgICAgICAgICAgICAgICIgaW4tc2NvcGUgZHVyYXRpb24gaW4gc2Vjb25kcyIsIFwKICAgICAgICAgICAgICAgICAgICBldmVudF8yX3NhbXBsZXNfKSk7XAogICAgICAgfSBicmVhaztcCiAgICAgICBjYXNlIGNvYmFsdDo6dHJhY2VfZXZlbnQ6OlRJTUVfQkVUV0VFTl9FVkVOVF9TVEFSVFM6IHtcCiAgICAgICAgIHJlc3VsdHMucHVzaF9iYWNrKFwKLSAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzIpICsgIiB0aW1lIGJldHdlZW4gZXZlbnQgc3RhcnRzIGluIFwKLSAgICAgICAgICAgICAgICBzZWNvbmRzIixcCisgICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV8yKSArXAorICAgICAgICAgICAgICAgICAgICIgdGltZSBiZXR3ZWVuIGV2ZW50IHN0YXJ0cyBpbiBzZWNvbmRzIiwgXAogICAgICAgICAgICAgICAgICAgIGV2ZW50XzJfc2FtcGxlc18pKTtcCiAgICAgICB9IGJyZWFrO1wKICAgICB9XApAQCAtMjkzLDU0ICsyOTksNjAgQEAKICAgICBzd2l0Y2ggKG1lYXN1cmVtZW50X3R5cGVfMSkge1wKICAgICAgIGNhc2UgY29iYWx0Ojp0cmFjZV9ldmVudDo6RkxPV19EVVJBVElPTjoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMSkgKyAiIGZsb3cgZHVyYXRpb24gaW4gc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMSkgK1wKKyAgICAgICAgICAgICAgICAgICAiIGZsb3cgZHVyYXRpb24gaW4gc2Vjb25kcyIsIFwKICAgICAgICAgICAgICAgICAgICBldmVudF8xX3NhbXBsZXNfKSk7XAogICAgICAgfSBicmVhaztcCiAgICAgICBjYXNlIGNvYmFsdDo6dHJhY2VfZXZlbnQ6OklOX1NDT1BFX0RVUkFUSU9OOiB7XAogICAgICAgICByZXN1bHRzLnB1c2hfYmFjayhcCi0gICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV8xKSArICIgaW4tc2NvcGUgZHVyYXRpb24gaW4gc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMSkgK1wKKyAgICAgICAgICAgICAgICAgICAiIGluLXNjb3BlIGR1cmF0aW9uIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfMV9zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgICAgY2FzZSBjb2JhbHQ6OnRyYWNlX2V2ZW50OjpUSU1FX0JFVFdFRU5fRVZFTlRfU1RBUlRTOiB7XAogICAgICAgICByZXN1bHRzLnB1c2hfYmFjayhcCi0gICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV8xKSArICIgdGltZSBiZXR3ZWVuIGV2ZW50IHN0YXJ0cyBpbiBcCi0gICAgICAgICAgICAgICAgc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMSkgK1wKKyAgICAgICAgICAgICAgICAgICAiIHRpbWUgYmV0d2VlbiBldmVudCBzdGFydHMgaW4gc2Vjb25kcyIsIFwKICAgICAgICAgICAgICAgICAgICBldmVudF8xX3NhbXBsZXNfKSk7XAogICAgICAgfSBicmVhaztcCiAgICAgfVwKICAgICBzd2l0Y2ggKG1lYXN1cmVtZW50X3R5cGVfMikge1wKICAgICAgIGNhc2UgY29iYWx0Ojp0cmFjZV9ldmVudDo6RkxPV19EVVJBVElPTjoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMikgKyAiIGZsb3cgZHVyYXRpb24gaW4gc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMikgK1wKKyAgICAgICAgICAgICAgICAgICAiIGZsb3cgZHVyYXRpb24gaW4gc2Vjb25kcyIsIFwKICAgICAgICAgICAgICAgICAgICBldmVudF8yX3NhbXBsZXNfKSk7XAogICAgICAgfSBicmVhaztcCiAgICAgICBjYXNlIGNvYmFsdDo6dHJhY2VfZXZlbnQ6OklOX1NDT1BFX0RVUkFUSU9OOiB7XAogICAgICAgICByZXN1bHRzLnB1c2hfYmFjayhcCi0gICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV8yKSArICIgaW4tc2NvcGUgZHVyYXRpb24gaW4gc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMikgK1wKKyAgICAgICAgICAgICAgICAgICAiIGluLXNjb3BlIGR1cmF0aW9uIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfMl9zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgICAgY2FzZSBjb2JhbHQ6OnRyYWNlX2V2ZW50OjpUSU1FX0JFVFdFRU5fRVZFTlRfU1RBUlRTOiB7XAogICAgICAgICByZXN1bHRzLnB1c2hfYmFjayhcCi0gICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV8yKSArICIgdGltZSBiZXR3ZWVuIGV2ZW50IHN0YXJ0cyBpbiBcCi0gICAgICAgICAgICAgICAgc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMikgK1wKKyAgICAgICAgICAgICAgICAgICAiIHRpbWUgYmV0d2VlbiBldmVudCBzdGFydHMgaW4gc2Vjb25kcyIsIFwKICAgICAgICAgICAgICAgICAgICBldmVudF8yX3NhbXBsZXNfKSk7XAogICAgICAgfSBicmVhaztcCiAgICAgfVwKICAgICBzd2l0Y2ggKG1lYXN1cmVtZW50X3R5cGVfMykge1wKICAgICAgIGNhc2UgY29iYWx0Ojp0cmFjZV9ldmVudDo6RkxPV19EVVJBVElPTjoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMykgKyAiIGZsb3cgZHVyYXRpb24gaW4gc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMykgK1wKKyAgICAgICAgICAgICAgICAgICAiIGZsb3cgZHVyYXRpb24gaW4gc2Vjb25kcyIsIFwKICAgICAgICAgICAgICAgICAgICBldmVudF8zX3NhbXBsZXNfKSk7XAogICAgICAgfSBicmVhaztcCiAgICAgICBjYXNlIGNvYmFsdDo6dHJhY2VfZXZlbnQ6OklOX1NDT1BFX0RVUkFUSU9OOiB7XAogICAgICAgICByZXN1bHRzLnB1c2hfYmFjayhcCi0gICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV8zKSArICIgaW4tc2NvcGUgZHVyYXRpb24gaW4gc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMykgK1wKKyAgICAgICAgICAgICAgICAgICAiIGluLXNjb3BlIGR1cmF0aW9uIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfM19zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgICAgY2FzZSBjb2JhbHQ6OnRyYWNlX2V2ZW50OjpUSU1FX0JFVFdFRU5fRVZFTlRfU1RBUlRTOiB7XAogICAgICAgICByZXN1bHRzLnB1c2hfYmFjayhcCi0gICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV8zKSArICIgdGltZSBiZXR3ZWVuIGV2ZW50IHN0YXJ0cyBpbiBcCi0gICAgICAgICAgICAgICAgc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMykgK1wKKyAgICAgICAgICAgICAgICAgICAiIHRpbWUgYmV0d2VlbiBldmVudCBzdGFydHMgaW4gc2Vjb25kcyIsIFwKICAgICAgICAgICAgICAgICAgICBldmVudF8zX3NhbXBsZXNfKSk7XAogICAgICAgfSBicmVhaztcCiAgICAgfVwKQEAgLTQ3Nyw3MiArNDg5LDgwIEBACiAgICAgc3dpdGNoIChtZWFzdXJlbWVudF90eXBlXzEpIHtcCiAgICAgICBjYXNlIGNvYmFsdDo6dHJhY2VfZXZlbnQ6OkZMT1dfRFVSQVRJT046IHtcCiAgICAgICAgIHJlc3VsdHMucHVzaF9iYWNrKFwKLSAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzEpICsgIiBmbG93IGR1cmF0aW9uIGluIHNlY29uZHMiLFwKKyAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzEpICtcCisgICAgICAgICAgICAgICAgICAgIiBmbG93IGR1cmF0aW9uIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfMV9zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgICAgY2FzZSBjb2JhbHQ6OnRyYWNlX2V2ZW50OjpJTl9TQ09QRV9EVVJBVElPTjoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMSkgKyAiIGluLXNjb3BlIGR1cmF0aW9uIGluIHNlY29uZHMiLFwKKyAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzEpICtcCisgICAgICAgICAgICAgICAgICAgIiBpbi1zY29wZSBkdXJhdGlvbiBpbiBzZWNvbmRzIiwgXAogICAgICAgICAgICAgICAgICAgIGV2ZW50XzFfc2FtcGxlc18pKTtcCiAgICAgICB9IGJyZWFrO1wKICAgICAgIGNhc2UgY29iYWx0Ojp0cmFjZV9ldmVudDo6VElNRV9CRVRXRUVOX0VWRU5UX1NUQVJUUzoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMSkgKyAiIHRpbWUgYmV0d2VlbiBldmVudCBzdGFydHMgaW4gXAotICAgICAgICAgICAgICAgIHNlY29uZHMiLFwKKyAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzEpICtcCisgICAgICAgICAgICAgICAgICAgIiB0aW1lIGJldHdlZW4gZXZlbnQgc3RhcnRzIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfMV9zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgIH1cCiAgICAgc3dpdGNoIChtZWFzdXJlbWVudF90eXBlXzIpIHtcCiAgICAgICBjYXNlIGNvYmFsdDo6dHJhY2VfZXZlbnQ6OkZMT1dfRFVSQVRJT046IHtcCiAgICAgICAgIHJlc3VsdHMucHVzaF9iYWNrKFwKLSAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzIpICsgIiBmbG93IGR1cmF0aW9uIGluIHNlY29uZHMiLFwKKyAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzIpICtcCisgICAgICAgICAgICAgICAgICAgIiBmbG93IGR1cmF0aW9uIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfMl9zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgICAgY2FzZSBjb2JhbHQ6OnRyYWNlX2V2ZW50OjpJTl9TQ09QRV9EVVJBVElPTjoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMikgKyAiIGluLXNjb3BlIGR1cmF0aW9uIGluIHNlY29uZHMiLFwKKyAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzIpICtcCisgICAgICAgICAgICAgICAgICAgIiBpbi1zY29wZSBkdXJhdGlvbiBpbiBzZWNvbmRzIiwgXAogICAgICAgICAgICAgICAgICAgIGV2ZW50XzJfc2FtcGxlc18pKTtcCiAgICAgICB9IGJyZWFrO1wKICAgICAgIGNhc2UgY29iYWx0Ojp0cmFjZV9ldmVudDo6VElNRV9CRVRXRUVOX0VWRU5UX1NUQVJUUzoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMikgKyAiIHRpbWUgYmV0d2VlbiBldmVudCBzdGFydHMgaW4gXAotICAgICAgICAgICAgICAgIHNlY29uZHMiLFwKKyAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzIpICtcCisgICAgICAgICAgICAgICAgICAgIiB0aW1lIGJldHdlZW4gZXZlbnQgc3RhcnRzIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfMl9zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgIH1cCiAgICAgc3dpdGNoIChtZWFzdXJlbWVudF90eXBlXzMpIHtcCiAgICAgICBjYXNlIGNvYmFsdDo6dHJhY2VfZXZlbnQ6OkZMT1dfRFVSQVRJT046IHtcCiAgICAgICAgIHJlc3VsdHMucHVzaF9iYWNrKFwKLSAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzMpICsgIiBmbG93IGR1cmF0aW9uIGluIHNlY29uZHMiLFwKKyAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzMpICtcCisgICAgICAgICAgICAgICAgICAgIiBmbG93IGR1cmF0aW9uIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfM19zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgICAgY2FzZSBjb2JhbHQ6OnRyYWNlX2V2ZW50OjpJTl9TQ09QRV9EVVJBVElPTjoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMykgKyAiIGluLXNjb3BlIGR1cmF0aW9uIGluIHNlY29uZHMiLFwKKyAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzMpICtcCisgICAgICAgICAgICAgICAgICAgIiBpbi1zY29wZSBkdXJhdGlvbiBpbiBzZWNvbmRzIiwgXAogICAgICAgICAgICAgICAgICAgIGV2ZW50XzNfc2FtcGxlc18pKTtcCiAgICAgICB9IGJyZWFrO1wKICAgICAgIGNhc2UgY29iYWx0Ojp0cmFjZV9ldmVudDo6VElNRV9CRVRXRUVOX0VWRU5UX1NUQVJUUzoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMykgKyAiIHRpbWUgYmV0d2VlbiBldmVudCBzdGFydHMgaW4gXAotICAgICAgICAgICAgICAgIHNlY29uZHMiLFwKKyAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzMpICtcCisgICAgICAgICAgICAgICAgICAgIiB0aW1lIGJldHdlZW4gZXZlbnQgc3RhcnRzIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfM19zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgIH1cCiAgICAgc3dpdGNoIChtZWFzdXJlbWVudF90eXBlXzQpIHtcCiAgICAgICBjYXNlIGNvYmFsdDo6dHJhY2VfZXZlbnQ6OkZMT1dfRFVSQVRJT046IHtcCiAgICAgICAgIHJlc3VsdHMucHVzaF9iYWNrKFwKLSAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzQpICsgIiBmbG93IGR1cmF0aW9uIGluIHNlY29uZHMiLFwKKyAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzQpICtcCisgICAgICAgICAgICAgICAgICAgIiBmbG93IGR1cmF0aW9uIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfNF9zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgICAgY2FzZSBjb2JhbHQ6OnRyYWNlX2V2ZW50OjpJTl9TQ09QRV9EVVJBVElPTjoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfNCkgKyAiIGluLXNjb3BlIGR1cmF0aW9uIGluIHNlY29uZHMiLFwKKyAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzQpICtcCisgICAgICAgICAgICAgICAgICAgIiBpbi1zY29wZSBkdXJhdGlvbiBpbiBzZWNvbmRzIiwgXAogICAgICAgICAgICAgICAgICAgIGV2ZW50XzRfc2FtcGxlc18pKTtcCiAgICAgICB9IGJyZWFrO1wKICAgICAgIGNhc2UgY29iYWx0Ojp0cmFjZV9ldmVudDo6VElNRV9CRVRXRUVOX0VWRU5UX1NUQVJUUzoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfNCkgKyAiIHRpbWUgYmV0d2VlbiBldmVudCBzdGFydHMgaW4gXAotICAgICAgICAgICAgICAgIHNlY29uZHMiLFwKKyAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzQpICtcCisgICAgICAgICAgICAgICAgICAgIiB0aW1lIGJldHdlZW4gZXZlbnQgc3RhcnRzIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfNF9zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgIH1cCkBAIC03MDYsOTAgKzcyNiwxMDAgQEAKICAgICBzd2l0Y2ggKG1lYXN1cmVtZW50X3R5cGVfMSkge1wKICAgICAgIGNhc2UgY29iYWx0Ojp0cmFjZV9ldmVudDo6RkxPV19EVVJBVElPTjoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMSkgKyAiIGZsb3cgZHVyYXRpb24gaW4gc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMSkgK1wKKyAgICAgICAgICAgICAgICAgICAiIGZsb3cgZHVyYXRpb24gaW4gc2Vjb25kcyIsIFwKICAgICAgICAgICAgICAgICAgICBldmVudF8xX3NhbXBsZXNfKSk7XAogICAgICAgfSBicmVhaztcCiAgICAgICBjYXNlIGNvYmFsdDo6dHJhY2VfZXZlbnQ6OklOX1NDT1BFX0RVUkFUSU9OOiB7XAogICAgICAgICByZXN1bHRzLnB1c2hfYmFjayhcCi0gICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV8xKSArICIgaW4tc2NvcGUgZHVyYXRpb24gaW4gc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMSkgK1wKKyAgICAgICAgICAgICAgICAgICAiIGluLXNjb3BlIGR1cmF0aW9uIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfMV9zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgICAgY2FzZSBjb2JhbHQ6OnRyYWNlX2V2ZW50OjpUSU1FX0JFVFdFRU5fRVZFTlRfU1RBUlRTOiB7XAogICAgICAgICByZXN1bHRzLnB1c2hfYmFjayhcCi0gICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV8xKSArICIgdGltZSBiZXR3ZWVuIGV2ZW50IHN0YXJ0cyBpbiBcCi0gICAgICAgICAgICAgICAgc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMSkgK1wKKyAgICAgICAgICAgICAgICAgICAiIHRpbWUgYmV0d2VlbiBldmVudCBzdGFydHMgaW4gc2Vjb25kcyIsIFwKICAgICAgICAgICAgICAgICAgICBldmVudF8xX3NhbXBsZXNfKSk7XAogICAgICAgfSBicmVhaztcCiAgICAgfVwKICAgICBzd2l0Y2ggKG1lYXN1cmVtZW50X3R5cGVfMikge1wKICAgICAgIGNhc2UgY29iYWx0Ojp0cmFjZV9ldmVudDo6RkxPV19EVVJBVElPTjoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMikgKyAiIGZsb3cgZHVyYXRpb24gaW4gc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMikgK1wKKyAgICAgICAgICAgICAgICAgICAiIGZsb3cgZHVyYXRpb24gaW4gc2Vjb25kcyIsIFwKICAgICAgICAgICAgICAgICAgICBldmVudF8yX3NhbXBsZXNfKSk7XAogICAgICAgfSBicmVhaztcCiAgICAgICBjYXNlIGNvYmFsdDo6dHJhY2VfZXZlbnQ6OklOX1NDT1BFX0RVUkFUSU9OOiB7XAogICAgICAgICByZXN1bHRzLnB1c2hfYmFjayhcCi0gICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV8yKSArICIgaW4tc2NvcGUgZHVyYXRpb24gaW4gc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMikgK1wKKyAgICAgICAgICAgICAgICAgICAiIGluLXNjb3BlIGR1cmF0aW9uIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfMl9zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgICAgY2FzZSBjb2JhbHQ6OnRyYWNlX2V2ZW50OjpUSU1FX0JFVFdFRU5fRVZFTlRfU1RBUlRTOiB7XAogICAgICAgICByZXN1bHRzLnB1c2hfYmFjayhcCi0gICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV8yKSArICIgdGltZSBiZXR3ZWVuIGV2ZW50IHN0YXJ0cyBpbiBcCi0gICAgICAgICAgICAgICAgc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMikgK1wKKyAgICAgICAgICAgICAgICAgICAiIHRpbWUgYmV0d2VlbiBldmVudCBzdGFydHMgaW4gc2Vjb25kcyIsIFwKICAgICAgICAgICAgICAgICAgICBldmVudF8yX3NhbXBsZXNfKSk7XAogICAgICAgfSBicmVhaztcCiAgICAgfVwKICAgICBzd2l0Y2ggKG1lYXN1cmVtZW50X3R5cGVfMykge1wKICAgICAgIGNhc2UgY29iYWx0Ojp0cmFjZV9ldmVudDo6RkxPV19EVVJBVElPTjoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMykgKyAiIGZsb3cgZHVyYXRpb24gaW4gc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMykgK1wKKyAgICAgICAgICAgICAgICAgICAiIGZsb3cgZHVyYXRpb24gaW4gc2Vjb25kcyIsIFwKICAgICAgICAgICAgICAgICAgICBldmVudF8zX3NhbXBsZXNfKSk7XAogICAgICAgfSBicmVhaztcCiAgICAgICBjYXNlIGNvYmFsdDo6dHJhY2VfZXZlbnQ6OklOX1NDT1BFX0RVUkFUSU9OOiB7XAogICAgICAgICByZXN1bHRzLnB1c2hfYmFjayhcCi0gICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV8zKSArICIgaW4tc2NvcGUgZHVyYXRpb24gaW4gc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMykgK1wKKyAgICAgICAgICAgICAgICAgICAiIGluLXNjb3BlIGR1cmF0aW9uIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfM19zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgICAgY2FzZSBjb2JhbHQ6OnRyYWNlX2V2ZW50OjpUSU1FX0JFVFdFRU5fRVZFTlRfU1RBUlRTOiB7XAogICAgICAgICByZXN1bHRzLnB1c2hfYmFjayhcCi0gICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV8zKSArICIgdGltZSBiZXR3ZWVuIGV2ZW50IHN0YXJ0cyBpbiBcCi0gICAgICAgICAgICAgICAgc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMykgK1wKKyAgICAgICAgICAgICAgICAgICAiIHRpbWUgYmV0d2VlbiBldmVudCBzdGFydHMgaW4gc2Vjb25kcyIsIFwKICAgICAgICAgICAgICAgICAgICBldmVudF8zX3NhbXBsZXNfKSk7XAogICAgICAgfSBicmVhaztcCiAgICAgfVwKICAgICBzd2l0Y2ggKG1lYXN1cmVtZW50X3R5cGVfNCkge1wKICAgICAgIGNhc2UgY29iYWx0Ojp0cmFjZV9ldmVudDo6RkxPV19EVVJBVElPTjoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfNCkgKyAiIGZsb3cgZHVyYXRpb24gaW4gc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfNCkgK1wKKyAgICAgICAgICAgICAgICAgICAiIGZsb3cgZHVyYXRpb24gaW4gc2Vjb25kcyIsIFwKICAgICAgICAgICAgICAgICAgICBldmVudF80X3NhbXBsZXNfKSk7XAogICAgICAgfSBicmVhaztcCiAgICAgICBjYXNlIGNvYmFsdDo6dHJhY2VfZXZlbnQ6OklOX1NDT1BFX0RVUkFUSU9OOiB7XAogICAgICAgICByZXN1bHRzLnB1c2hfYmFjayhcCi0gICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV80KSArICIgaW4tc2NvcGUgZHVyYXRpb24gaW4gc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfNCkgK1wKKyAgICAgICAgICAgICAgICAgICAiIGluLXNjb3BlIGR1cmF0aW9uIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfNF9zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgICAgY2FzZSBjb2JhbHQ6OnRyYWNlX2V2ZW50OjpUSU1FX0JFVFdFRU5fRVZFTlRfU1RBUlRTOiB7XAogICAgICAgICByZXN1bHRzLnB1c2hfYmFjayhcCi0gICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV80KSArICIgdGltZSBiZXR3ZWVuIGV2ZW50IHN0YXJ0cyBpbiBcCi0gICAgICAgICAgICAgICAgc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfNCkgK1wKKyAgICAgICAgICAgICAgICAgICAiIHRpbWUgYmV0d2VlbiBldmVudCBzdGFydHMgaW4gc2Vjb25kcyIsIFwKICAgICAgICAgICAgICAgICAgICBldmVudF80X3NhbXBsZXNfKSk7XAogICAgICAgfSBicmVhaztcCiAgICAgfVwKICAgICBzd2l0Y2ggKG1lYXN1cmVtZW50X3R5cGVfNSkge1wKICAgICAgIGNhc2UgY29iYWx0Ojp0cmFjZV9ldmVudDo6RkxPV19EVVJBVElPTjoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfNSkgKyAiIGZsb3cgZHVyYXRpb24gaW4gc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfNSkgK1wKKyAgICAgICAgICAgICAgICAgICAiIGZsb3cgZHVyYXRpb24gaW4gc2Vjb25kcyIsIFwKICAgICAgICAgICAgICAgICAgICBldmVudF81X3NhbXBsZXNfKSk7XAogICAgICAgfSBicmVhaztcCiAgICAgICBjYXNlIGNvYmFsdDo6dHJhY2VfZXZlbnQ6OklOX1NDT1BFX0RVUkFUSU9OOiB7XAogICAgICAgICByZXN1bHRzLnB1c2hfYmFjayhcCi0gICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV81KSArICIgaW4tc2NvcGUgZHVyYXRpb24gaW4gc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfNSkgK1wKKyAgICAgICAgICAgICAgICAgICAiIGluLXNjb3BlIGR1cmF0aW9uIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfNV9zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgICAgY2FzZSBjb2JhbHQ6OnRyYWNlX2V2ZW50OjpUSU1FX0JFVFdFRU5fRVZFTlRfU1RBUlRTOiB7XAogICAgICAgICByZXN1bHRzLnB1c2hfYmFjayhcCi0gICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV81KSArICIgdGltZSBiZXR3ZWVuIGV2ZW50IHN0YXJ0cyBpbiBcCi0gICAgICAgICAgICAgICAgc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfNSkgK1wKKyAgICAgICAgICAgICAgICAgICAiIHRpbWUgYmV0d2VlbiBldmVudCBzdGFydHMgaW4gc2Vjb25kcyIsIFwKICAgICAgICAgICAgICAgICAgICBldmVudF81X3NhbXBsZXNfKSk7XAogICAgICAgfSBicmVhaztcCiAgICAgfVwKQEAgLTk4MSwxMDggKzEwMTEsMTIwIEBACiAgICAgc3dpdGNoIChtZWFzdXJlbWVudF90eXBlXzEpIHtcCiAgICAgICBjYXNlIGNvYmFsdDo6dHJhY2VfZXZlbnQ6OkZMT1dfRFVSQVRJT046IHtcCiAgICAgICAgIHJlc3VsdHMucHVzaF9iYWNrKFwKLSAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzEpICsgIiBmbG93IGR1cmF0aW9uIGluIHNlY29uZHMiLFwKKyAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzEpICtcCisgICAgICAgICAgICAgICAgICAgIiBmbG93IGR1cmF0aW9uIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfMV9zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgICAgY2FzZSBjb2JhbHQ6OnRyYWNlX2V2ZW50OjpJTl9TQ09QRV9EVVJBVElPTjoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMSkgKyAiIGluLXNjb3BlIGR1cmF0aW9uIGluIHNlY29uZHMiLFwKKyAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzEpICtcCisgICAgICAgICAgICAgICAgICAgIiBpbi1zY29wZSBkdXJhdGlvbiBpbiBzZWNvbmRzIiwgXAogICAgICAgICAgICAgICAgICAgIGV2ZW50XzFfc2FtcGxlc18pKTtcCiAgICAgICB9IGJyZWFrO1wKICAgICAgIGNhc2UgY29iYWx0Ojp0cmFjZV9ldmVudDo6VElNRV9CRVRXRUVOX0VWRU5UX1NUQVJUUzoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMSkgKyAiIHRpbWUgYmV0d2VlbiBldmVudCBzdGFydHMgaW4gXAotICAgICAgICAgICAgICAgIHNlY29uZHMiLFwKKyAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzEpICtcCisgICAgICAgICAgICAgICAgICAgIiB0aW1lIGJldHdlZW4gZXZlbnQgc3RhcnRzIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfMV9zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgIH1cCiAgICAgc3dpdGNoIChtZWFzdXJlbWVudF90eXBlXzIpIHtcCiAgICAgICBjYXNlIGNvYmFsdDo6dHJhY2VfZXZlbnQ6OkZMT1dfRFVSQVRJT046IHtcCiAgICAgICAgIHJlc3VsdHMucHVzaF9iYWNrKFwKLSAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzIpICsgIiBmbG93IGR1cmF0aW9uIGluIHNlY29uZHMiLFwKKyAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzIpICtcCisgICAgICAgICAgICAgICAgICAgIiBmbG93IGR1cmF0aW9uIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfMl9zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgICAgY2FzZSBjb2JhbHQ6OnRyYWNlX2V2ZW50OjpJTl9TQ09QRV9EVVJBVElPTjoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMikgKyAiIGluLXNjb3BlIGR1cmF0aW9uIGluIHNlY29uZHMiLFwKKyAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzIpICtcCisgICAgICAgICAgICAgICAgICAgIiBpbi1zY29wZSBkdXJhdGlvbiBpbiBzZWNvbmRzIiwgXAogICAgICAgICAgICAgICAgICAgIGV2ZW50XzJfc2FtcGxlc18pKTtcCiAgICAgICB9IGJyZWFrO1wKICAgICAgIGNhc2UgY29iYWx0Ojp0cmFjZV9ldmVudDo6VElNRV9CRVRXRUVOX0VWRU5UX1NUQVJUUzoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMikgKyAiIHRpbWUgYmV0d2VlbiBldmVudCBzdGFydHMgaW4gXAotICAgICAgICAgICAgICAgIHNlY29uZHMiLFwKKyAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzIpICtcCisgICAgICAgICAgICAgICAgICAgIiB0aW1lIGJldHdlZW4gZXZlbnQgc3RhcnRzIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfMl9zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgIH1cCiAgICAgc3dpdGNoIChtZWFzdXJlbWVudF90eXBlXzMpIHtcCiAgICAgICBjYXNlIGNvYmFsdDo6dHJhY2VfZXZlbnQ6OkZMT1dfRFVSQVRJT046IHtcCiAgICAgICAgIHJlc3VsdHMucHVzaF9iYWNrKFwKLSAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzMpICsgIiBmbG93IGR1cmF0aW9uIGluIHNlY29uZHMiLFwKKyAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzMpICtcCisgICAgICAgICAgICAgICAgICAgIiBmbG93IGR1cmF0aW9uIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfM19zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgICAgY2FzZSBjb2JhbHQ6OnRyYWNlX2V2ZW50OjpJTl9TQ09QRV9EVVJBVElPTjoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMykgKyAiIGluLXNjb3BlIGR1cmF0aW9uIGluIHNlY29uZHMiLFwKKyAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzMpICtcCisgICAgICAgICAgICAgICAgICAgIiBpbi1zY29wZSBkdXJhdGlvbiBpbiBzZWNvbmRzIiwgXAogICAgICAgICAgICAgICAgICAgIGV2ZW50XzNfc2FtcGxlc18pKTtcCiAgICAgICB9IGJyZWFrO1wKICAgICAgIGNhc2UgY29iYWx0Ojp0cmFjZV9ldmVudDo6VElNRV9CRVRXRUVOX0VWRU5UX1NUQVJUUzoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMykgKyAiIHRpbWUgYmV0d2VlbiBldmVudCBzdGFydHMgaW4gXAotICAgICAgICAgICAgICAgIHNlY29uZHMiLFwKKyAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzMpICtcCisgICAgICAgICAgICAgICAgICAgIiB0aW1lIGJldHdlZW4gZXZlbnQgc3RhcnRzIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfM19zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgIH1cCiAgICAgc3dpdGNoIChtZWFzdXJlbWVudF90eXBlXzQpIHtcCiAgICAgICBjYXNlIGNvYmFsdDo6dHJhY2VfZXZlbnQ6OkZMT1dfRFVSQVRJT046IHtcCiAgICAgICAgIHJlc3VsdHMucHVzaF9iYWNrKFwKLSAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzQpICsgIiBmbG93IGR1cmF0aW9uIGluIHNlY29uZHMiLFwKKyAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzQpICtcCisgICAgICAgICAgICAgICAgICAgIiBmbG93IGR1cmF0aW9uIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfNF9zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgICAgY2FzZSBjb2JhbHQ6OnRyYWNlX2V2ZW50OjpJTl9TQ09QRV9EVVJBVElPTjoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfNCkgKyAiIGluLXNjb3BlIGR1cmF0aW9uIGluIHNlY29uZHMiLFwKKyAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzQpICtcCisgICAgICAgICAgICAgICAgICAgIiBpbi1zY29wZSBkdXJhdGlvbiBpbiBzZWNvbmRzIiwgXAogICAgICAgICAgICAgICAgICAgIGV2ZW50XzRfc2FtcGxlc18pKTtcCiAgICAgICB9IGJyZWFrO1wKICAgICAgIGNhc2UgY29iYWx0Ojp0cmFjZV9ldmVudDo6VElNRV9CRVRXRUVOX0VWRU5UX1NUQVJUUzoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfNCkgKyAiIHRpbWUgYmV0d2VlbiBldmVudCBzdGFydHMgaW4gXAotICAgICAgICAgICAgICAgIHNlY29uZHMiLFwKKyAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzQpICtcCisgICAgICAgICAgICAgICAgICAgIiB0aW1lIGJldHdlZW4gZXZlbnQgc3RhcnRzIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfNF9zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgIH1cCiAgICAgc3dpdGNoIChtZWFzdXJlbWVudF90eXBlXzUpIHtcCiAgICAgICBjYXNlIGNvYmFsdDo6dHJhY2VfZXZlbnQ6OkZMT1dfRFVSQVRJT046IHtcCiAgICAgICAgIHJlc3VsdHMucHVzaF9iYWNrKFwKLSAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzUpICsgIiBmbG93IGR1cmF0aW9uIGluIHNlY29uZHMiLFwKKyAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzUpICtcCisgICAgICAgICAgICAgICAgICAgIiBmbG93IGR1cmF0aW9uIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfNV9zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgICAgY2FzZSBjb2JhbHQ6OnRyYWNlX2V2ZW50OjpJTl9TQ09QRV9EVVJBVElPTjoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfNSkgKyAiIGluLXNjb3BlIGR1cmF0aW9uIGluIHNlY29uZHMiLFwKKyAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzUpICtcCisgICAgICAgICAgICAgICAgICAgIiBpbi1zY29wZSBkdXJhdGlvbiBpbiBzZWNvbmRzIiwgXAogICAgICAgICAgICAgICAgICAgIGV2ZW50XzVfc2FtcGxlc18pKTtcCiAgICAgICB9IGJyZWFrO1wKICAgICAgIGNhc2UgY29iYWx0Ojp0cmFjZV9ldmVudDo6VElNRV9CRVRXRUVOX0VWRU5UX1NUQVJUUzoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfNSkgKyAiIHRpbWUgYmV0d2VlbiBldmVudCBzdGFydHMgaW4gXAotICAgICAgICAgICAgICAgIHNlY29uZHMiLFwKKyAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzUpICtcCisgICAgICAgICAgICAgICAgICAgIiB0aW1lIGJldHdlZW4gZXZlbnQgc3RhcnRzIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfNV9zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgIH1cCiAgICAgc3dpdGNoIChtZWFzdXJlbWVudF90eXBlXzYpIHtcCiAgICAgICBjYXNlIGNvYmFsdDo6dHJhY2VfZXZlbnQ6OkZMT1dfRFVSQVRJT046IHtcCiAgICAgICAgIHJlc3VsdHMucHVzaF9iYWNrKFwKLSAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzYpICsgIiBmbG93IGR1cmF0aW9uIGluIHNlY29uZHMiLFwKKyAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzYpICtcCisgICAgICAgICAgICAgICAgICAgIiBmbG93IGR1cmF0aW9uIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfNl9zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgICAgY2FzZSBjb2JhbHQ6OnRyYWNlX2V2ZW50OjpJTl9TQ09QRV9EVVJBVElPTjoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfNikgKyAiIGluLXNjb3BlIGR1cmF0aW9uIGluIHNlY29uZHMiLFwKKyAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzYpICtcCisgICAgICAgICAgICAgICAgICAgIiBpbi1zY29wZSBkdXJhdGlvbiBpbiBzZWNvbmRzIiwgXAogICAgICAgICAgICAgICAgICAgIGV2ZW50XzZfc2FtcGxlc18pKTtcCiAgICAgICB9IGJyZWFrO1wKICAgICAgIGNhc2UgY29iYWx0Ojp0cmFjZV9ldmVudDo6VElNRV9CRVRXRUVOX0VWRU5UX1NUQVJUUzoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfNikgKyAiIHRpbWUgYmV0d2VlbiBldmVudCBzdGFydHMgaW4gXAotICAgICAgICAgICAgICAgIHNlY29uZHMiLFwKKyAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzYpICtcCisgICAgICAgICAgICAgICAgICAgIiB0aW1lIGJldHdlZW4gZXZlbnQgc3RhcnRzIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfNl9zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgIH1cCkBAIC0xMzAxLDEyNiArMTM0MywxNDAgQEAKICAgICBzd2l0Y2ggKG1lYXN1cmVtZW50X3R5cGVfMSkge1wKICAgICAgIGNhc2UgY29iYWx0Ojp0cmFjZV9ldmVudDo6RkxPV19EVVJBVElPTjoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMSkgKyAiIGZsb3cgZHVyYXRpb24gaW4gc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMSkgK1wKKyAgICAgICAgICAgICAgICAgICAiIGZsb3cgZHVyYXRpb24gaW4gc2Vjb25kcyIsIFwKICAgICAgICAgICAgICAgICAgICBldmVudF8xX3NhbXBsZXNfKSk7XAogICAgICAgfSBicmVhaztcCiAgICAgICBjYXNlIGNvYmFsdDo6dHJhY2VfZXZlbnQ6OklOX1NDT1BFX0RVUkFUSU9OOiB7XAogICAgICAgICByZXN1bHRzLnB1c2hfYmFjayhcCi0gICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV8xKSArICIgaW4tc2NvcGUgZHVyYXRpb24gaW4gc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMSkgK1wKKyAgICAgICAgICAgICAgICAgICAiIGluLXNjb3BlIGR1cmF0aW9uIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfMV9zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgICAgY2FzZSBjb2JhbHQ6OnRyYWNlX2V2ZW50OjpUSU1FX0JFVFdFRU5fRVZFTlRfU1RBUlRTOiB7XAogICAgICAgICByZXN1bHRzLnB1c2hfYmFjayhcCi0gICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV8xKSArICIgdGltZSBiZXR3ZWVuIGV2ZW50IHN0YXJ0cyBpbiBcCi0gICAgICAgICAgICAgICAgc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMSkgK1wKKyAgICAgICAgICAgICAgICAgICAiIHRpbWUgYmV0d2VlbiBldmVudCBzdGFydHMgaW4gc2Vjb25kcyIsIFwKICAgICAgICAgICAgICAgICAgICBldmVudF8xX3NhbXBsZXNfKSk7XAogICAgICAgfSBicmVhaztcCiAgICAgfVwKICAgICBzd2l0Y2ggKG1lYXN1cmVtZW50X3R5cGVfMikge1wKICAgICAgIGNhc2UgY29iYWx0Ojp0cmFjZV9ldmVudDo6RkxPV19EVVJBVElPTjoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMikgKyAiIGZsb3cgZHVyYXRpb24gaW4gc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMikgK1wKKyAgICAgICAgICAgICAgICAgICAiIGZsb3cgZHVyYXRpb24gaW4gc2Vjb25kcyIsIFwKICAgICAgICAgICAgICAgICAgICBldmVudF8yX3NhbXBsZXNfKSk7XAogICAgICAgfSBicmVhaztcCiAgICAgICBjYXNlIGNvYmFsdDo6dHJhY2VfZXZlbnQ6OklOX1NDT1BFX0RVUkFUSU9OOiB7XAogICAgICAgICByZXN1bHRzLnB1c2hfYmFjayhcCi0gICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV8yKSArICIgaW4tc2NvcGUgZHVyYXRpb24gaW4gc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMikgK1wKKyAgICAgICAgICAgICAgICAgICAiIGluLXNjb3BlIGR1cmF0aW9uIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfMl9zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgICAgY2FzZSBjb2JhbHQ6OnRyYWNlX2V2ZW50OjpUSU1FX0JFVFdFRU5fRVZFTlRfU1RBUlRTOiB7XAogICAgICAgICByZXN1bHRzLnB1c2hfYmFjayhcCi0gICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV8yKSArICIgdGltZSBiZXR3ZWVuIGV2ZW50IHN0YXJ0cyBpbiBcCi0gICAgICAgICAgICAgICAgc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMikgK1wKKyAgICAgICAgICAgICAgICAgICAiIHRpbWUgYmV0d2VlbiBldmVudCBzdGFydHMgaW4gc2Vjb25kcyIsIFwKICAgICAgICAgICAgICAgICAgICBldmVudF8yX3NhbXBsZXNfKSk7XAogICAgICAgfSBicmVhaztcCiAgICAgfVwKICAgICBzd2l0Y2ggKG1lYXN1cmVtZW50X3R5cGVfMykge1wKICAgICAgIGNhc2UgY29iYWx0Ojp0cmFjZV9ldmVudDo6RkxPV19EVVJBVElPTjoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMykgKyAiIGZsb3cgZHVyYXRpb24gaW4gc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMykgK1wKKyAgICAgICAgICAgICAgICAgICAiIGZsb3cgZHVyYXRpb24gaW4gc2Vjb25kcyIsIFwKICAgICAgICAgICAgICAgICAgICBldmVudF8zX3NhbXBsZXNfKSk7XAogICAgICAgfSBicmVhaztcCiAgICAgICBjYXNlIGNvYmFsdDo6dHJhY2VfZXZlbnQ6OklOX1NDT1BFX0RVUkFUSU9OOiB7XAogICAgICAgICByZXN1bHRzLnB1c2hfYmFjayhcCi0gICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV8zKSArICIgaW4tc2NvcGUgZHVyYXRpb24gaW4gc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMykgK1wKKyAgICAgICAgICAgICAgICAgICAiIGluLXNjb3BlIGR1cmF0aW9uIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfM19zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgICAgY2FzZSBjb2JhbHQ6OnRyYWNlX2V2ZW50OjpUSU1FX0JFVFdFRU5fRVZFTlRfU1RBUlRTOiB7XAogICAgICAgICByZXN1bHRzLnB1c2hfYmFjayhcCi0gICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV8zKSArICIgdGltZSBiZXR3ZWVuIGV2ZW50IHN0YXJ0cyBpbiBcCi0gICAgICAgICAgICAgICAgc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMykgK1wKKyAgICAgICAgICAgICAgICAgICAiIHRpbWUgYmV0d2VlbiBldmVudCBzdGFydHMgaW4gc2Vjb25kcyIsIFwKICAgICAgICAgICAgICAgICAgICBldmVudF8zX3NhbXBsZXNfKSk7XAogICAgICAgfSBicmVhaztcCiAgICAgfVwKICAgICBzd2l0Y2ggKG1lYXN1cmVtZW50X3R5cGVfNCkge1wKICAgICAgIGNhc2UgY29iYWx0Ojp0cmFjZV9ldmVudDo6RkxPV19EVVJBVElPTjoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfNCkgKyAiIGZsb3cgZHVyYXRpb24gaW4gc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfNCkgK1wKKyAgICAgICAgICAgICAgICAgICAiIGZsb3cgZHVyYXRpb24gaW4gc2Vjb25kcyIsIFwKICAgICAgICAgICAgICAgICAgICBldmVudF80X3NhbXBsZXNfKSk7XAogICAgICAgfSBicmVhaztcCiAgICAgICBjYXNlIGNvYmFsdDo6dHJhY2VfZXZlbnQ6OklOX1NDT1BFX0RVUkFUSU9OOiB7XAogICAgICAgICByZXN1bHRzLnB1c2hfYmFjayhcCi0gICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV80KSArICIgaW4tc2NvcGUgZHVyYXRpb24gaW4gc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfNCkgK1wKKyAgICAgICAgICAgICAgICAgICAiIGluLXNjb3BlIGR1cmF0aW9uIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfNF9zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgICAgY2FzZSBjb2JhbHQ6OnRyYWNlX2V2ZW50OjpUSU1FX0JFVFdFRU5fRVZFTlRfU1RBUlRTOiB7XAogICAgICAgICByZXN1bHRzLnB1c2hfYmFjayhcCi0gICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV80KSArICIgdGltZSBiZXR3ZWVuIGV2ZW50IHN0YXJ0cyBpbiBcCi0gICAgICAgICAgICAgICAgc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfNCkgK1wKKyAgICAgICAgICAgICAgICAgICAiIHRpbWUgYmV0d2VlbiBldmVudCBzdGFydHMgaW4gc2Vjb25kcyIsIFwKICAgICAgICAgICAgICAgICAgICBldmVudF80X3NhbXBsZXNfKSk7XAogICAgICAgfSBicmVhaztcCiAgICAgfVwKICAgICBzd2l0Y2ggKG1lYXN1cmVtZW50X3R5cGVfNSkge1wKICAgICAgIGNhc2UgY29iYWx0Ojp0cmFjZV9ldmVudDo6RkxPV19EVVJBVElPTjoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfNSkgKyAiIGZsb3cgZHVyYXRpb24gaW4gc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfNSkgK1wKKyAgICAgICAgICAgICAgICAgICAiIGZsb3cgZHVyYXRpb24gaW4gc2Vjb25kcyIsIFwKICAgICAgICAgICAgICAgICAgICBldmVudF81X3NhbXBsZXNfKSk7XAogICAgICAgfSBicmVhaztcCiAgICAgICBjYXNlIGNvYmFsdDo6dHJhY2VfZXZlbnQ6OklOX1NDT1BFX0RVUkFUSU9OOiB7XAogICAgICAgICByZXN1bHRzLnB1c2hfYmFjayhcCi0gICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV81KSArICIgaW4tc2NvcGUgZHVyYXRpb24gaW4gc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfNSkgK1wKKyAgICAgICAgICAgICAgICAgICAiIGluLXNjb3BlIGR1cmF0aW9uIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfNV9zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgICAgY2FzZSBjb2JhbHQ6OnRyYWNlX2V2ZW50OjpUSU1FX0JFVFdFRU5fRVZFTlRfU1RBUlRTOiB7XAogICAgICAgICByZXN1bHRzLnB1c2hfYmFjayhcCi0gICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV81KSArICIgdGltZSBiZXR3ZWVuIGV2ZW50IHN0YXJ0cyBpbiBcCi0gICAgICAgICAgICAgICAgc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfNSkgK1wKKyAgICAgICAgICAgICAgICAgICAiIHRpbWUgYmV0d2VlbiBldmVudCBzdGFydHMgaW4gc2Vjb25kcyIsIFwKICAgICAgICAgICAgICAgICAgICBldmVudF81X3NhbXBsZXNfKSk7XAogICAgICAgfSBicmVhaztcCiAgICAgfVwKICAgICBzd2l0Y2ggKG1lYXN1cmVtZW50X3R5cGVfNikge1wKICAgICAgIGNhc2UgY29iYWx0Ojp0cmFjZV9ldmVudDo6RkxPV19EVVJBVElPTjoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfNikgKyAiIGZsb3cgZHVyYXRpb24gaW4gc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfNikgK1wKKyAgICAgICAgICAgICAgICAgICAiIGZsb3cgZHVyYXRpb24gaW4gc2Vjb25kcyIsIFwKICAgICAgICAgICAgICAgICAgICBldmVudF82X3NhbXBsZXNfKSk7XAogICAgICAgfSBicmVhaztcCiAgICAgICBjYXNlIGNvYmFsdDo6dHJhY2VfZXZlbnQ6OklOX1NDT1BFX0RVUkFUSU9OOiB7XAogICAgICAgICByZXN1bHRzLnB1c2hfYmFjayhcCi0gICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV82KSArICIgaW4tc2NvcGUgZHVyYXRpb24gaW4gc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfNikgK1wKKyAgICAgICAgICAgICAgICAgICAiIGluLXNjb3BlIGR1cmF0aW9uIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfNl9zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgICAgY2FzZSBjb2JhbHQ6OnRyYWNlX2V2ZW50OjpUSU1FX0JFVFdFRU5fRVZFTlRfU1RBUlRTOiB7XAogICAgICAgICByZXN1bHRzLnB1c2hfYmFjayhcCi0gICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV82KSArICIgdGltZSBiZXR3ZWVuIGV2ZW50IHN0YXJ0cyBpbiBcCi0gICAgICAgICAgICAgICAgc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfNikgK1wKKyAgICAgICAgICAgICAgICAgICAiIHRpbWUgYmV0d2VlbiBldmVudCBzdGFydHMgaW4gc2Vjb25kcyIsIFwKICAgICAgICAgICAgICAgICAgICBldmVudF82X3NhbXBsZXNfKSk7XAogICAgICAgfSBicmVhaztcCiAgICAgfVwKICAgICBzd2l0Y2ggKG1lYXN1cmVtZW50X3R5cGVfNykge1wKICAgICAgIGNhc2UgY29iYWx0Ojp0cmFjZV9ldmVudDo6RkxPV19EVVJBVElPTjoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfNykgKyAiIGZsb3cgZHVyYXRpb24gaW4gc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfNykgK1wKKyAgICAgICAgICAgICAgICAgICAiIGZsb3cgZHVyYXRpb24gaW4gc2Vjb25kcyIsIFwKICAgICAgICAgICAgICAgICAgICBldmVudF83X3NhbXBsZXNfKSk7XAogICAgICAgfSBicmVhaztcCiAgICAgICBjYXNlIGNvYmFsdDo6dHJhY2VfZXZlbnQ6OklOX1NDT1BFX0RVUkFUSU9OOiB7XAogICAgICAgICByZXN1bHRzLnB1c2hfYmFjayhcCi0gICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV83KSArICIgaW4tc2NvcGUgZHVyYXRpb24gaW4gc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfNykgK1wKKyAgICAgICAgICAgICAgICAgICAiIGluLXNjb3BlIGR1cmF0aW9uIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfN19zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgICAgY2FzZSBjb2JhbHQ6OnRyYWNlX2V2ZW50OjpUSU1FX0JFVFdFRU5fRVZFTlRfU1RBUlRTOiB7XAogICAgICAgICByZXN1bHRzLnB1c2hfYmFjayhcCi0gICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV83KSArICIgdGltZSBiZXR3ZWVuIGV2ZW50IHN0YXJ0cyBpbiBcCi0gICAgICAgICAgICAgICAgc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfNykgK1wKKyAgICAgICAgICAgICAgICAgICAiIHRpbWUgYmV0d2VlbiBldmVudCBzdGFydHMgaW4gc2Vjb25kcyIsIFwKICAgICAgICAgICAgICAgICAgICBldmVudF83X3NhbXBsZXNfKSk7XAogICAgICAgfSBicmVhaztcCiAgICAgfVwKQEAgLTE2NjcsMTQ0ICsxNzIzLDE2MCBAQAogICAgIHN3aXRjaCAobWVhc3VyZW1lbnRfdHlwZV8xKSB7XAogICAgICAgY2FzZSBjb2JhbHQ6OnRyYWNlX2V2ZW50OjpGTE9XX0RVUkFUSU9OOiB7XAogICAgICAgICByZXN1bHRzLnB1c2hfYmFjayhcCi0gICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV8xKSArICIgZmxvdyBkdXJhdGlvbiBpbiBzZWNvbmRzIixcCisgICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV8xKSArXAorICAgICAgICAgICAgICAgICAgICIgZmxvdyBkdXJhdGlvbiBpbiBzZWNvbmRzIiwgXAogICAgICAgICAgICAgICAgICAgIGV2ZW50XzFfc2FtcGxlc18pKTtcCiAgICAgICB9IGJyZWFrO1wKICAgICAgIGNhc2UgY29iYWx0Ojp0cmFjZV9ldmVudDo6SU5fU0NPUEVfRFVSQVRJT046IHtcCiAgICAgICAgIHJlc3VsdHMucHVzaF9iYWNrKFwKLSAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzEpICsgIiBpbi1zY29wZSBkdXJhdGlvbiBpbiBzZWNvbmRzIixcCisgICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV8xKSArXAorICAgICAgICAgICAgICAgICAgICIgaW4tc2NvcGUgZHVyYXRpb24gaW4gc2Vjb25kcyIsIFwKICAgICAgICAgICAgICAgICAgICBldmVudF8xX3NhbXBsZXNfKSk7XAogICAgICAgfSBicmVhaztcCiAgICAgICBjYXNlIGNvYmFsdDo6dHJhY2VfZXZlbnQ6OlRJTUVfQkVUV0VFTl9FVkVOVF9TVEFSVFM6IHtcCiAgICAgICAgIHJlc3VsdHMucHVzaF9iYWNrKFwKLSAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzEpICsgIiB0aW1lIGJldHdlZW4gZXZlbnQgc3RhcnRzIGluIFwKLSAgICAgICAgICAgICAgICBzZWNvbmRzIixcCisgICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV8xKSArXAorICAgICAgICAgICAgICAgICAgICIgdGltZSBiZXR3ZWVuIGV2ZW50IHN0YXJ0cyBpbiBzZWNvbmRzIiwgXAogICAgICAgICAgICAgICAgICAgIGV2ZW50XzFfc2FtcGxlc18pKTtcCiAgICAgICB9IGJyZWFrO1wKICAgICB9XAogICAgIHN3aXRjaCAobWVhc3VyZW1lbnRfdHlwZV8yKSB7XAogICAgICAgY2FzZSBjb2JhbHQ6OnRyYWNlX2V2ZW50OjpGTE9XX0RVUkFUSU9OOiB7XAogICAgICAgICByZXN1bHRzLnB1c2hfYmFjayhcCi0gICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV8yKSArICIgZmxvdyBkdXJhdGlvbiBpbiBzZWNvbmRzIixcCisgICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV8yKSArXAorICAgICAgICAgICAgICAgICAgICIgZmxvdyBkdXJhdGlvbiBpbiBzZWNvbmRzIiwgXAogICAgICAgICAgICAgICAgICAgIGV2ZW50XzJfc2FtcGxlc18pKTtcCiAgICAgICB9IGJyZWFrO1wKICAgICAgIGNhc2UgY29iYWx0Ojp0cmFjZV9ldmVudDo6SU5fU0NPUEVfRFVSQVRJT046IHtcCiAgICAgICAgIHJlc3VsdHMucHVzaF9iYWNrKFwKLSAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzIpICsgIiBpbi1zY29wZSBkdXJhdGlvbiBpbiBzZWNvbmRzIixcCisgICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV8yKSArXAorICAgICAgICAgICAgICAgICAgICIgaW4tc2NvcGUgZHVyYXRpb24gaW4gc2Vjb25kcyIsIFwKICAgICAgICAgICAgICAgICAgICBldmVudF8yX3NhbXBsZXNfKSk7XAogICAgICAgfSBicmVhaztcCiAgICAgICBjYXNlIGNvYmFsdDo6dHJhY2VfZXZlbnQ6OlRJTUVfQkVUV0VFTl9FVkVOVF9TVEFSVFM6IHtcCiAgICAgICAgIHJlc3VsdHMucHVzaF9iYWNrKFwKLSAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzIpICsgIiB0aW1lIGJldHdlZW4gZXZlbnQgc3RhcnRzIGluIFwKLSAgICAgICAgICAgICAgICBzZWNvbmRzIixcCisgICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV8yKSArXAorICAgICAgICAgICAgICAgICAgICIgdGltZSBiZXR3ZWVuIGV2ZW50IHN0YXJ0cyBpbiBzZWNvbmRzIiwgXAogICAgICAgICAgICAgICAgICAgIGV2ZW50XzJfc2FtcGxlc18pKTtcCiAgICAgICB9IGJyZWFrO1wKICAgICB9XAogICAgIHN3aXRjaCAobWVhc3VyZW1lbnRfdHlwZV8zKSB7XAogICAgICAgY2FzZSBjb2JhbHQ6OnRyYWNlX2V2ZW50OjpGTE9XX0RVUkFUSU9OOiB7XAogICAgICAgICByZXN1bHRzLnB1c2hfYmFjayhcCi0gICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV8zKSArICIgZmxvdyBkdXJhdGlvbiBpbiBzZWNvbmRzIixcCisgICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV8zKSArXAorICAgICAgICAgICAgICAgICAgICIgZmxvdyBkdXJhdGlvbiBpbiBzZWNvbmRzIiwgXAogICAgICAgICAgICAgICAgICAgIGV2ZW50XzNfc2FtcGxlc18pKTtcCiAgICAgICB9IGJyZWFrO1wKICAgICAgIGNhc2UgY29iYWx0Ojp0cmFjZV9ldmVudDo6SU5fU0NPUEVfRFVSQVRJT046IHtcCiAgICAgICAgIHJlc3VsdHMucHVzaF9iYWNrKFwKLSAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzMpICsgIiBpbi1zY29wZSBkdXJhdGlvbiBpbiBzZWNvbmRzIixcCisgICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV8zKSArXAorICAgICAgICAgICAgICAgICAgICIgaW4tc2NvcGUgZHVyYXRpb24gaW4gc2Vjb25kcyIsIFwKICAgICAgICAgICAgICAgICAgICBldmVudF8zX3NhbXBsZXNfKSk7XAogICAgICAgfSBicmVhaztcCiAgICAgICBjYXNlIGNvYmFsdDo6dHJhY2VfZXZlbnQ6OlRJTUVfQkVUV0VFTl9FVkVOVF9TVEFSVFM6IHtcCiAgICAgICAgIHJlc3VsdHMucHVzaF9iYWNrKFwKLSAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzMpICsgIiB0aW1lIGJldHdlZW4gZXZlbnQgc3RhcnRzIGluIFwKLSAgICAgICAgICAgICAgICBzZWNvbmRzIixcCisgICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV8zKSArXAorICAgICAgICAgICAgICAgICAgICIgdGltZSBiZXR3ZWVuIGV2ZW50IHN0YXJ0cyBpbiBzZWNvbmRzIiwgXAogICAgICAgICAgICAgICAgICAgIGV2ZW50XzNfc2FtcGxlc18pKTtcCiAgICAgICB9IGJyZWFrO1wKICAgICB9XAogICAgIHN3aXRjaCAobWVhc3VyZW1lbnRfdHlwZV80KSB7XAogICAgICAgY2FzZSBjb2JhbHQ6OnRyYWNlX2V2ZW50OjpGTE9XX0RVUkFUSU9OOiB7XAogICAgICAgICByZXN1bHRzLnB1c2hfYmFjayhcCi0gICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV80KSArICIgZmxvdyBkdXJhdGlvbiBpbiBzZWNvbmRzIixcCisgICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV80KSArXAorICAgICAgICAgICAgICAgICAgICIgZmxvdyBkdXJhdGlvbiBpbiBzZWNvbmRzIiwgXAogICAgICAgICAgICAgICAgICAgIGV2ZW50XzRfc2FtcGxlc18pKTtcCiAgICAgICB9IGJyZWFrO1wKICAgICAgIGNhc2UgY29iYWx0Ojp0cmFjZV9ldmVudDo6SU5fU0NPUEVfRFVSQVRJT046IHtcCiAgICAgICAgIHJlc3VsdHMucHVzaF9iYWNrKFwKLSAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzQpICsgIiBpbi1zY29wZSBkdXJhdGlvbiBpbiBzZWNvbmRzIixcCisgICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV80KSArXAorICAgICAgICAgICAgICAgICAgICIgaW4tc2NvcGUgZHVyYXRpb24gaW4gc2Vjb25kcyIsIFwKICAgICAgICAgICAgICAgICAgICBldmVudF80X3NhbXBsZXNfKSk7XAogICAgICAgfSBicmVhaztcCiAgICAgICBjYXNlIGNvYmFsdDo6dHJhY2VfZXZlbnQ6OlRJTUVfQkVUV0VFTl9FVkVOVF9TVEFSVFM6IHtcCiAgICAgICAgIHJlc3VsdHMucHVzaF9iYWNrKFwKLSAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzQpICsgIiB0aW1lIGJldHdlZW4gZXZlbnQgc3RhcnRzIGluIFwKLSAgICAgICAgICAgICAgICBzZWNvbmRzIixcCisgICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV80KSArXAorICAgICAgICAgICAgICAgICAgICIgdGltZSBiZXR3ZWVuIGV2ZW50IHN0YXJ0cyBpbiBzZWNvbmRzIiwgXAogICAgICAgICAgICAgICAgICAgIGV2ZW50XzRfc2FtcGxlc18pKTtcCiAgICAgICB9IGJyZWFrO1wKICAgICB9XAogICAgIHN3aXRjaCAobWVhc3VyZW1lbnRfdHlwZV81KSB7XAogICAgICAgY2FzZSBjb2JhbHQ6OnRyYWNlX2V2ZW50OjpGTE9XX0RVUkFUSU9OOiB7XAogICAgICAgICByZXN1bHRzLnB1c2hfYmFjayhcCi0gICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV81KSArICIgZmxvdyBkdXJhdGlvbiBpbiBzZWNvbmRzIixcCisgICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV81KSArXAorICAgICAgICAgICAgICAgICAgICIgZmxvdyBkdXJhdGlvbiBpbiBzZWNvbmRzIiwgXAogICAgICAgICAgICAgICAgICAgIGV2ZW50XzVfc2FtcGxlc18pKTtcCiAgICAgICB9IGJyZWFrO1wKICAgICAgIGNhc2UgY29iYWx0Ojp0cmFjZV9ldmVudDo6SU5fU0NPUEVfRFVSQVRJT046IHtcCiAgICAgICAgIHJlc3VsdHMucHVzaF9iYWNrKFwKLSAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzUpICsgIiBpbi1zY29wZSBkdXJhdGlvbiBpbiBzZWNvbmRzIixcCisgICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV81KSArXAorICAgICAgICAgICAgICAgICAgICIgaW4tc2NvcGUgZHVyYXRpb24gaW4gc2Vjb25kcyIsIFwKICAgICAgICAgICAgICAgICAgICBldmVudF81X3NhbXBsZXNfKSk7XAogICAgICAgfSBicmVhaztcCiAgICAgICBjYXNlIGNvYmFsdDo6dHJhY2VfZXZlbnQ6OlRJTUVfQkVUV0VFTl9FVkVOVF9TVEFSVFM6IHtcCiAgICAgICAgIHJlc3VsdHMucHVzaF9iYWNrKFwKLSAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzUpICsgIiB0aW1lIGJldHdlZW4gZXZlbnQgc3RhcnRzIGluIFwKLSAgICAgICAgICAgICAgICBzZWNvbmRzIixcCisgICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV81KSArXAorICAgICAgICAgICAgICAgICAgICIgdGltZSBiZXR3ZWVuIGV2ZW50IHN0YXJ0cyBpbiBzZWNvbmRzIiwgXAogICAgICAgICAgICAgICAgICAgIGV2ZW50XzVfc2FtcGxlc18pKTtcCiAgICAgICB9IGJyZWFrO1wKICAgICB9XAogICAgIHN3aXRjaCAobWVhc3VyZW1lbnRfdHlwZV82KSB7XAogICAgICAgY2FzZSBjb2JhbHQ6OnRyYWNlX2V2ZW50OjpGTE9XX0RVUkFUSU9OOiB7XAogICAgICAgICByZXN1bHRzLnB1c2hfYmFjayhcCi0gICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV82KSArICIgZmxvdyBkdXJhdGlvbiBpbiBzZWNvbmRzIixcCisgICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV82KSArXAorICAgICAgICAgICAgICAgICAgICIgZmxvdyBkdXJhdGlvbiBpbiBzZWNvbmRzIiwgXAogICAgICAgICAgICAgICAgICAgIGV2ZW50XzZfc2FtcGxlc18pKTtcCiAgICAgICB9IGJyZWFrO1wKICAgICAgIGNhc2UgY29iYWx0Ojp0cmFjZV9ldmVudDo6SU5fU0NPUEVfRFVSQVRJT046IHtcCiAgICAgICAgIHJlc3VsdHMucHVzaF9iYWNrKFwKLSAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzYpICsgIiBpbi1zY29wZSBkdXJhdGlvbiBpbiBzZWNvbmRzIixcCisgICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV82KSArXAorICAgICAgICAgICAgICAgICAgICIgaW4tc2NvcGUgZHVyYXRpb24gaW4gc2Vjb25kcyIsIFwKICAgICAgICAgICAgICAgICAgICBldmVudF82X3NhbXBsZXNfKSk7XAogICAgICAgfSBicmVhaztcCiAgICAgICBjYXNlIGNvYmFsdDo6dHJhY2VfZXZlbnQ6OlRJTUVfQkVUV0VFTl9FVkVOVF9TVEFSVFM6IHtcCiAgICAgICAgIHJlc3VsdHMucHVzaF9iYWNrKFwKLSAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzYpICsgIiB0aW1lIGJldHdlZW4gZXZlbnQgc3RhcnRzIGluIFwKLSAgICAgICAgICAgICAgICBzZWNvbmRzIixcCisgICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV82KSArXAorICAgICAgICAgICAgICAgICAgICIgdGltZSBiZXR3ZWVuIGV2ZW50IHN0YXJ0cyBpbiBzZWNvbmRzIiwgXAogICAgICAgICAgICAgICAgICAgIGV2ZW50XzZfc2FtcGxlc18pKTtcCiAgICAgICB9IGJyZWFrO1wKICAgICB9XAogICAgIHN3aXRjaCAobWVhc3VyZW1lbnRfdHlwZV83KSB7XAogICAgICAgY2FzZSBjb2JhbHQ6OnRyYWNlX2V2ZW50OjpGTE9XX0RVUkFUSU9OOiB7XAogICAgICAgICByZXN1bHRzLnB1c2hfYmFjayhcCi0gICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV83KSArICIgZmxvdyBkdXJhdGlvbiBpbiBzZWNvbmRzIixcCisgICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV83KSArXAorICAgICAgICAgICAgICAgICAgICIgZmxvdyBkdXJhdGlvbiBpbiBzZWNvbmRzIiwgXAogICAgICAgICAgICAgICAgICAgIGV2ZW50Xzdfc2FtcGxlc18pKTtcCiAgICAgICB9IGJyZWFrO1wKICAgICAgIGNhc2UgY29iYWx0Ojp0cmFjZV9ldmVudDo6SU5fU0NPUEVfRFVSQVRJT046IHtcCiAgICAgICAgIHJlc3VsdHMucHVzaF9iYWNrKFwKLSAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzcpICsgIiBpbi1zY29wZSBkdXJhdGlvbiBpbiBzZWNvbmRzIixcCisgICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV83KSArXAorICAgICAgICAgICAgICAgICAgICIgaW4tc2NvcGUgZHVyYXRpb24gaW4gc2Vjb25kcyIsIFwKICAgICAgICAgICAgICAgICAgICBldmVudF83X3NhbXBsZXNfKSk7XAogICAgICAgfSBicmVhaztcCiAgICAgICBjYXNlIGNvYmFsdDo6dHJhY2VfZXZlbnQ6OlRJTUVfQkVUV0VFTl9FVkVOVF9TVEFSVFM6IHtcCiAgICAgICAgIHJlc3VsdHMucHVzaF9iYWNrKFwKLSAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzcpICsgIiB0aW1lIGJldHdlZW4gZXZlbnQgc3RhcnRzIGluIFwKLSAgICAgICAgICAgICAgICBzZWNvbmRzIixcCisgICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV83KSArXAorICAgICAgICAgICAgICAgICAgICIgdGltZSBiZXR3ZWVuIGV2ZW50IHN0YXJ0cyBpbiBzZWNvbmRzIiwgXAogICAgICAgICAgICAgICAgICAgIGV2ZW50Xzdfc2FtcGxlc18pKTtcCiAgICAgICB9IGJyZWFrO1wKICAgICB9XAogICAgIHN3aXRjaCAobWVhc3VyZW1lbnRfdHlwZV84KSB7XAogICAgICAgY2FzZSBjb2JhbHQ6OnRyYWNlX2V2ZW50OjpGTE9XX0RVUkFUSU9OOiB7XAogICAgICAgICByZXN1bHRzLnB1c2hfYmFjayhcCi0gICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV84KSArICIgZmxvdyBkdXJhdGlvbiBpbiBzZWNvbmRzIixcCisgICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV84KSArXAorICAgICAgICAgICAgICAgICAgICIgZmxvdyBkdXJhdGlvbiBpbiBzZWNvbmRzIiwgXAogICAgICAgICAgICAgICAgICAgIGV2ZW50Xzhfc2FtcGxlc18pKTtcCiAgICAgICB9IGJyZWFrO1wKICAgICAgIGNhc2UgY29iYWx0Ojp0cmFjZV9ldmVudDo6SU5fU0NPUEVfRFVSQVRJT046IHtcCiAgICAgICAgIHJlc3VsdHMucHVzaF9iYWNrKFwKLSAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzgpICsgIiBpbi1zY29wZSBkdXJhdGlvbiBpbiBzZWNvbmRzIixcCisgICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV84KSArXAorICAgICAgICAgICAgICAgICAgICIgaW4tc2NvcGUgZHVyYXRpb24gaW4gc2Vjb25kcyIsIFwKICAgICAgICAgICAgICAgICAgICBldmVudF84X3NhbXBsZXNfKSk7XAogICAgICAgfSBicmVhaztcCiAgICAgICBjYXNlIGNvYmFsdDo6dHJhY2VfZXZlbnQ6OlRJTUVfQkVUV0VFTl9FVkVOVF9TVEFSVFM6IHtcCiAgICAgICAgIHJlc3VsdHMucHVzaF9iYWNrKFwKLSAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzgpICsgIiB0aW1lIGJldHdlZW4gZXZlbnQgc3RhcnRzIGluIFwKLSAgICAgICAgICAgICAgICBzZWNvbmRzIixcCisgICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV84KSArXAorICAgICAgICAgICAgICAgICAgICIgdGltZSBiZXR3ZWVuIGV2ZW50IHN0YXJ0cyBpbiBzZWNvbmRzIiwgXAogICAgICAgICAgICAgICAgICAgIGV2ZW50Xzhfc2FtcGxlc18pKTtcCiAgICAgICB9IGJyZWFrO1wKICAgICB9XApAQCAtMjA3OCwxNjIgKzIxNTAsMTgwIEBACiAgICAgc3dpdGNoIChtZWFzdXJlbWVudF90eXBlXzEpIHtcCiAgICAgICBjYXNlIGNvYmFsdDo6dHJhY2VfZXZlbnQ6OkZMT1dfRFVSQVRJT046IHtcCiAgICAgICAgIHJlc3VsdHMucHVzaF9iYWNrKFwKLSAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzEpICsgIiBmbG93IGR1cmF0aW9uIGluIHNlY29uZHMiLFwKKyAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzEpICtcCisgICAgICAgICAgICAgICAgICAgIiBmbG93IGR1cmF0aW9uIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfMV9zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgICAgY2FzZSBjb2JhbHQ6OnRyYWNlX2V2ZW50OjpJTl9TQ09QRV9EVVJBVElPTjoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMSkgKyAiIGluLXNjb3BlIGR1cmF0aW9uIGluIHNlY29uZHMiLFwKKyAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzEpICtcCisgICAgICAgICAgICAgICAgICAgIiBpbi1zY29wZSBkdXJhdGlvbiBpbiBzZWNvbmRzIiwgXAogICAgICAgICAgICAgICAgICAgIGV2ZW50XzFfc2FtcGxlc18pKTtcCiAgICAgICB9IGJyZWFrO1wKICAgICAgIGNhc2UgY29iYWx0Ojp0cmFjZV9ldmVudDo6VElNRV9CRVRXRUVOX0VWRU5UX1NUQVJUUzoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMSkgKyAiIHRpbWUgYmV0d2VlbiBldmVudCBzdGFydHMgaW4gXAotICAgICAgICAgICAgICAgIHNlY29uZHMiLFwKKyAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzEpICtcCisgICAgICAgICAgICAgICAgICAgIiB0aW1lIGJldHdlZW4gZXZlbnQgc3RhcnRzIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfMV9zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgIH1cCiAgICAgc3dpdGNoIChtZWFzdXJlbWVudF90eXBlXzIpIHtcCiAgICAgICBjYXNlIGNvYmFsdDo6dHJhY2VfZXZlbnQ6OkZMT1dfRFVSQVRJT046IHtcCiAgICAgICAgIHJlc3VsdHMucHVzaF9iYWNrKFwKLSAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzIpICsgIiBmbG93IGR1cmF0aW9uIGluIHNlY29uZHMiLFwKKyAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzIpICtcCisgICAgICAgICAgICAgICAgICAgIiBmbG93IGR1cmF0aW9uIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfMl9zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgICAgY2FzZSBjb2JhbHQ6OnRyYWNlX2V2ZW50OjpJTl9TQ09QRV9EVVJBVElPTjoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMikgKyAiIGluLXNjb3BlIGR1cmF0aW9uIGluIHNlY29uZHMiLFwKKyAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzIpICtcCisgICAgICAgICAgICAgICAgICAgIiBpbi1zY29wZSBkdXJhdGlvbiBpbiBzZWNvbmRzIiwgXAogICAgICAgICAgICAgICAgICAgIGV2ZW50XzJfc2FtcGxlc18pKTtcCiAgICAgICB9IGJyZWFrO1wKICAgICAgIGNhc2UgY29iYWx0Ojp0cmFjZV9ldmVudDo6VElNRV9CRVRXRUVOX0VWRU5UX1NUQVJUUzoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMikgKyAiIHRpbWUgYmV0d2VlbiBldmVudCBzdGFydHMgaW4gXAotICAgICAgICAgICAgICAgIHNlY29uZHMiLFwKKyAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzIpICtcCisgICAgICAgICAgICAgICAgICAgIiB0aW1lIGJldHdlZW4gZXZlbnQgc3RhcnRzIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfMl9zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgIH1cCiAgICAgc3dpdGNoIChtZWFzdXJlbWVudF90eXBlXzMpIHtcCiAgICAgICBjYXNlIGNvYmFsdDo6dHJhY2VfZXZlbnQ6OkZMT1dfRFVSQVRJT046IHtcCiAgICAgICAgIHJlc3VsdHMucHVzaF9iYWNrKFwKLSAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzMpICsgIiBmbG93IGR1cmF0aW9uIGluIHNlY29uZHMiLFwKKyAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzMpICtcCisgICAgICAgICAgICAgICAgICAgIiBmbG93IGR1cmF0aW9uIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfM19zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgICAgY2FzZSBjb2JhbHQ6OnRyYWNlX2V2ZW50OjpJTl9TQ09QRV9EVVJBVElPTjoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMykgKyAiIGluLXNjb3BlIGR1cmF0aW9uIGluIHNlY29uZHMiLFwKKyAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzMpICtcCisgICAgICAgICAgICAgICAgICAgIiBpbi1zY29wZSBkdXJhdGlvbiBpbiBzZWNvbmRzIiwgXAogICAgICAgICAgICAgICAgICAgIGV2ZW50XzNfc2FtcGxlc18pKTtcCiAgICAgICB9IGJyZWFrO1wKICAgICAgIGNhc2UgY29iYWx0Ojp0cmFjZV9ldmVudDo6VElNRV9CRVRXRUVOX0VWRU5UX1NUQVJUUzoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMykgKyAiIHRpbWUgYmV0d2VlbiBldmVudCBzdGFydHMgaW4gXAotICAgICAgICAgICAgICAgIHNlY29uZHMiLFwKKyAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzMpICtcCisgICAgICAgICAgICAgICAgICAgIiB0aW1lIGJldHdlZW4gZXZlbnQgc3RhcnRzIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfM19zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgIH1cCiAgICAgc3dpdGNoIChtZWFzdXJlbWVudF90eXBlXzQpIHtcCiAgICAgICBjYXNlIGNvYmFsdDo6dHJhY2VfZXZlbnQ6OkZMT1dfRFVSQVRJT046IHtcCiAgICAgICAgIHJlc3VsdHMucHVzaF9iYWNrKFwKLSAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzQpICsgIiBmbG93IGR1cmF0aW9uIGluIHNlY29uZHMiLFwKKyAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzQpICtcCisgICAgICAgICAgICAgICAgICAgIiBmbG93IGR1cmF0aW9uIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfNF9zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgICAgY2FzZSBjb2JhbHQ6OnRyYWNlX2V2ZW50OjpJTl9TQ09QRV9EVVJBVElPTjoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfNCkgKyAiIGluLXNjb3BlIGR1cmF0aW9uIGluIHNlY29uZHMiLFwKKyAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzQpICtcCisgICAgICAgICAgICAgICAgICAgIiBpbi1zY29wZSBkdXJhdGlvbiBpbiBzZWNvbmRzIiwgXAogICAgICAgICAgICAgICAgICAgIGV2ZW50XzRfc2FtcGxlc18pKTtcCiAgICAgICB9IGJyZWFrO1wKICAgICAgIGNhc2UgY29iYWx0Ojp0cmFjZV9ldmVudDo6VElNRV9CRVRXRUVOX0VWRU5UX1NUQVJUUzoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfNCkgKyAiIHRpbWUgYmV0d2VlbiBldmVudCBzdGFydHMgaW4gXAotICAgICAgICAgICAgICAgIHNlY29uZHMiLFwKKyAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzQpICtcCisgICAgICAgICAgICAgICAgICAgIiB0aW1lIGJldHdlZW4gZXZlbnQgc3RhcnRzIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfNF9zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgIH1cCiAgICAgc3dpdGNoIChtZWFzdXJlbWVudF90eXBlXzUpIHtcCiAgICAgICBjYXNlIGNvYmFsdDo6dHJhY2VfZXZlbnQ6OkZMT1dfRFVSQVRJT046IHtcCiAgICAgICAgIHJlc3VsdHMucHVzaF9iYWNrKFwKLSAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzUpICsgIiBmbG93IGR1cmF0aW9uIGluIHNlY29uZHMiLFwKKyAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzUpICtcCisgICAgICAgICAgICAgICAgICAgIiBmbG93IGR1cmF0aW9uIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfNV9zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgICAgY2FzZSBjb2JhbHQ6OnRyYWNlX2V2ZW50OjpJTl9TQ09QRV9EVVJBVElPTjoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfNSkgKyAiIGluLXNjb3BlIGR1cmF0aW9uIGluIHNlY29uZHMiLFwKKyAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzUpICtcCisgICAgICAgICAgICAgICAgICAgIiBpbi1zY29wZSBkdXJhdGlvbiBpbiBzZWNvbmRzIiwgXAogICAgICAgICAgICAgICAgICAgIGV2ZW50XzVfc2FtcGxlc18pKTtcCiAgICAgICB9IGJyZWFrO1wKICAgICAgIGNhc2UgY29iYWx0Ojp0cmFjZV9ldmVudDo6VElNRV9CRVRXRUVOX0VWRU5UX1NUQVJUUzoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfNSkgKyAiIHRpbWUgYmV0d2VlbiBldmVudCBzdGFydHMgaW4gXAotICAgICAgICAgICAgICAgIHNlY29uZHMiLFwKKyAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzUpICtcCisgICAgICAgICAgICAgICAgICAgIiB0aW1lIGJldHdlZW4gZXZlbnQgc3RhcnRzIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfNV9zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgIH1cCiAgICAgc3dpdGNoIChtZWFzdXJlbWVudF90eXBlXzYpIHtcCiAgICAgICBjYXNlIGNvYmFsdDo6dHJhY2VfZXZlbnQ6OkZMT1dfRFVSQVRJT046IHtcCiAgICAgICAgIHJlc3VsdHMucHVzaF9iYWNrKFwKLSAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzYpICsgIiBmbG93IGR1cmF0aW9uIGluIHNlY29uZHMiLFwKKyAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzYpICtcCisgICAgICAgICAgICAgICAgICAgIiBmbG93IGR1cmF0aW9uIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfNl9zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgICAgY2FzZSBjb2JhbHQ6OnRyYWNlX2V2ZW50OjpJTl9TQ09QRV9EVVJBVElPTjoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfNikgKyAiIGluLXNjb3BlIGR1cmF0aW9uIGluIHNlY29uZHMiLFwKKyAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzYpICtcCisgICAgICAgICAgICAgICAgICAgIiBpbi1zY29wZSBkdXJhdGlvbiBpbiBzZWNvbmRzIiwgXAogICAgICAgICAgICAgICAgICAgIGV2ZW50XzZfc2FtcGxlc18pKTtcCiAgICAgICB9IGJyZWFrO1wKICAgICAgIGNhc2UgY29iYWx0Ojp0cmFjZV9ldmVudDo6VElNRV9CRVRXRUVOX0VWRU5UX1NUQVJUUzoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfNikgKyAiIHRpbWUgYmV0d2VlbiBldmVudCBzdGFydHMgaW4gXAotICAgICAgICAgICAgICAgIHNlY29uZHMiLFwKKyAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzYpICtcCisgICAgICAgICAgICAgICAgICAgIiB0aW1lIGJldHdlZW4gZXZlbnQgc3RhcnRzIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfNl9zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgIH1cCiAgICAgc3dpdGNoIChtZWFzdXJlbWVudF90eXBlXzcpIHtcCiAgICAgICBjYXNlIGNvYmFsdDo6dHJhY2VfZXZlbnQ6OkZMT1dfRFVSQVRJT046IHtcCiAgICAgICAgIHJlc3VsdHMucHVzaF9iYWNrKFwKLSAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzcpICsgIiBmbG93IGR1cmF0aW9uIGluIHNlY29uZHMiLFwKKyAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzcpICtcCisgICAgICAgICAgICAgICAgICAgIiBmbG93IGR1cmF0aW9uIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfN19zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgICAgY2FzZSBjb2JhbHQ6OnRyYWNlX2V2ZW50OjpJTl9TQ09QRV9EVVJBVElPTjoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfNykgKyAiIGluLXNjb3BlIGR1cmF0aW9uIGluIHNlY29uZHMiLFwKKyAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzcpICtcCisgICAgICAgICAgICAgICAgICAgIiBpbi1zY29wZSBkdXJhdGlvbiBpbiBzZWNvbmRzIiwgXAogICAgICAgICAgICAgICAgICAgIGV2ZW50Xzdfc2FtcGxlc18pKTtcCiAgICAgICB9IGJyZWFrO1wKICAgICAgIGNhc2UgY29iYWx0Ojp0cmFjZV9ldmVudDo6VElNRV9CRVRXRUVOX0VWRU5UX1NUQVJUUzoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfNykgKyAiIHRpbWUgYmV0d2VlbiBldmVudCBzdGFydHMgaW4gXAotICAgICAgICAgICAgICAgIHNlY29uZHMiLFwKKyAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzcpICtcCisgICAgICAgICAgICAgICAgICAgIiB0aW1lIGJldHdlZW4gZXZlbnQgc3RhcnRzIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfN19zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgIH1cCiAgICAgc3dpdGNoIChtZWFzdXJlbWVudF90eXBlXzgpIHtcCiAgICAgICBjYXNlIGNvYmFsdDo6dHJhY2VfZXZlbnQ6OkZMT1dfRFVSQVRJT046IHtcCiAgICAgICAgIHJlc3VsdHMucHVzaF9iYWNrKFwKLSAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzgpICsgIiBmbG93IGR1cmF0aW9uIGluIHNlY29uZHMiLFwKKyAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzgpICtcCisgICAgICAgICAgICAgICAgICAgIiBmbG93IGR1cmF0aW9uIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfOF9zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgICAgY2FzZSBjb2JhbHQ6OnRyYWNlX2V2ZW50OjpJTl9TQ09QRV9EVVJBVElPTjoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfOCkgKyAiIGluLXNjb3BlIGR1cmF0aW9uIGluIHNlY29uZHMiLFwKKyAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzgpICtcCisgICAgICAgICAgICAgICAgICAgIiBpbi1zY29wZSBkdXJhdGlvbiBpbiBzZWNvbmRzIiwgXAogICAgICAgICAgICAgICAgICAgIGV2ZW50Xzhfc2FtcGxlc18pKTtcCiAgICAgICB9IGJyZWFrO1wKICAgICAgIGNhc2UgY29iYWx0Ojp0cmFjZV9ldmVudDo6VElNRV9CRVRXRUVOX0VWRU5UX1NUQVJUUzoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfOCkgKyAiIHRpbWUgYmV0d2VlbiBldmVudCBzdGFydHMgaW4gXAotICAgICAgICAgICAgICAgIHNlY29uZHMiLFwKKyAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzgpICtcCisgICAgICAgICAgICAgICAgICAgIiB0aW1lIGJldHdlZW4gZXZlbnQgc3RhcnRzIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfOF9zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgIH1cCiAgICAgc3dpdGNoIChtZWFzdXJlbWVudF90eXBlXzkpIHtcCiAgICAgICBjYXNlIGNvYmFsdDo6dHJhY2VfZXZlbnQ6OkZMT1dfRFVSQVRJT046IHtcCiAgICAgICAgIHJlc3VsdHMucHVzaF9iYWNrKFwKLSAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzkpICsgIiBmbG93IGR1cmF0aW9uIGluIHNlY29uZHMiLFwKKyAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzkpICtcCisgICAgICAgICAgICAgICAgICAgIiBmbG93IGR1cmF0aW9uIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfOV9zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgICAgY2FzZSBjb2JhbHQ6OnRyYWNlX2V2ZW50OjpJTl9TQ09QRV9EVVJBVElPTjoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfOSkgKyAiIGluLXNjb3BlIGR1cmF0aW9uIGluIHNlY29uZHMiLFwKKyAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzkpICtcCisgICAgICAgICAgICAgICAgICAgIiBpbi1zY29wZSBkdXJhdGlvbiBpbiBzZWNvbmRzIiwgXAogICAgICAgICAgICAgICAgICAgIGV2ZW50Xzlfc2FtcGxlc18pKTtcCiAgICAgICB9IGJyZWFrO1wKICAgICAgIGNhc2UgY29iYWx0Ojp0cmFjZV9ldmVudDo6VElNRV9CRVRXRUVOX0VWRU5UX1NUQVJUUzoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfOSkgKyAiIHRpbWUgYmV0d2VlbiBldmVudCBzdGFydHMgaW4gXAotICAgICAgICAgICAgICAgIHNlY29uZHMiLFwKKyAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzkpICtcCisgICAgICAgICAgICAgICAgICAgIiB0aW1lIGJldHdlZW4gZXZlbnQgc3RhcnRzIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfOV9zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgIH1cCkBAIC0yNTM1LDE4MSArMjYyNSwyMDAgQEAKICAgICBzd2l0Y2ggKG1lYXN1cmVtZW50X3R5cGVfMSkge1wKICAgICAgIGNhc2UgY29iYWx0Ojp0cmFjZV9ldmVudDo6RkxPV19EVVJBVElPTjoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMSkgKyAiIGZsb3cgZHVyYXRpb24gaW4gc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMSkgK1wKKyAgICAgICAgICAgICAgICAgICAiIGZsb3cgZHVyYXRpb24gaW4gc2Vjb25kcyIsIFwKICAgICAgICAgICAgICAgICAgICBldmVudF8xX3NhbXBsZXNfKSk7XAogICAgICAgfSBicmVhaztcCiAgICAgICBjYXNlIGNvYmFsdDo6dHJhY2VfZXZlbnQ6OklOX1NDT1BFX0RVUkFUSU9OOiB7XAogICAgICAgICByZXN1bHRzLnB1c2hfYmFjayhcCi0gICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV8xKSArICIgaW4tc2NvcGUgZHVyYXRpb24gaW4gc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMSkgK1wKKyAgICAgICAgICAgICAgICAgICAiIGluLXNjb3BlIGR1cmF0aW9uIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfMV9zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgICAgY2FzZSBjb2JhbHQ6OnRyYWNlX2V2ZW50OjpUSU1FX0JFVFdFRU5fRVZFTlRfU1RBUlRTOiB7XAogICAgICAgICByZXN1bHRzLnB1c2hfYmFjayhcCi0gICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV8xKSArICIgdGltZSBiZXR3ZWVuIGV2ZW50IHN0YXJ0cyBpbiBcCi0gICAgICAgICAgICAgICAgc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMSkgK1wKKyAgICAgICAgICAgICAgICAgICAiIHRpbWUgYmV0d2VlbiBldmVudCBzdGFydHMgaW4gc2Vjb25kcyIsIFwKICAgICAgICAgICAgICAgICAgICBldmVudF8xX3NhbXBsZXNfKSk7XAogICAgICAgfSBicmVhaztcCiAgICAgfVwKICAgICBzd2l0Y2ggKG1lYXN1cmVtZW50X3R5cGVfMikge1wKICAgICAgIGNhc2UgY29iYWx0Ojp0cmFjZV9ldmVudDo6RkxPV19EVVJBVElPTjoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMikgKyAiIGZsb3cgZHVyYXRpb24gaW4gc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMikgK1wKKyAgICAgICAgICAgICAgICAgICAiIGZsb3cgZHVyYXRpb24gaW4gc2Vjb25kcyIsIFwKICAgICAgICAgICAgICAgICAgICBldmVudF8yX3NhbXBsZXNfKSk7XAogICAgICAgfSBicmVhaztcCiAgICAgICBjYXNlIGNvYmFsdDo6dHJhY2VfZXZlbnQ6OklOX1NDT1BFX0RVUkFUSU9OOiB7XAogICAgICAgICByZXN1bHRzLnB1c2hfYmFjayhcCi0gICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV8yKSArICIgaW4tc2NvcGUgZHVyYXRpb24gaW4gc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMikgK1wKKyAgICAgICAgICAgICAgICAgICAiIGluLXNjb3BlIGR1cmF0aW9uIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfMl9zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgICAgY2FzZSBjb2JhbHQ6OnRyYWNlX2V2ZW50OjpUSU1FX0JFVFdFRU5fRVZFTlRfU1RBUlRTOiB7XAogICAgICAgICByZXN1bHRzLnB1c2hfYmFjayhcCi0gICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV8yKSArICIgdGltZSBiZXR3ZWVuIGV2ZW50IHN0YXJ0cyBpbiBcCi0gICAgICAgICAgICAgICAgc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMikgK1wKKyAgICAgICAgICAgICAgICAgICAiIHRpbWUgYmV0d2VlbiBldmVudCBzdGFydHMgaW4gc2Vjb25kcyIsIFwKICAgICAgICAgICAgICAgICAgICBldmVudF8yX3NhbXBsZXNfKSk7XAogICAgICAgfSBicmVhaztcCiAgICAgfVwKICAgICBzd2l0Y2ggKG1lYXN1cmVtZW50X3R5cGVfMykge1wKICAgICAgIGNhc2UgY29iYWx0Ojp0cmFjZV9ldmVudDo6RkxPV19EVVJBVElPTjoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMykgKyAiIGZsb3cgZHVyYXRpb24gaW4gc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMykgK1wKKyAgICAgICAgICAgICAgICAgICAiIGZsb3cgZHVyYXRpb24gaW4gc2Vjb25kcyIsIFwKICAgICAgICAgICAgICAgICAgICBldmVudF8zX3NhbXBsZXNfKSk7XAogICAgICAgfSBicmVhaztcCiAgICAgICBjYXNlIGNvYmFsdDo6dHJhY2VfZXZlbnQ6OklOX1NDT1BFX0RVUkFUSU9OOiB7XAogICAgICAgICByZXN1bHRzLnB1c2hfYmFjayhcCi0gICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV8zKSArICIgaW4tc2NvcGUgZHVyYXRpb24gaW4gc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMykgK1wKKyAgICAgICAgICAgICAgICAgICAiIGluLXNjb3BlIGR1cmF0aW9uIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfM19zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgICAgY2FzZSBjb2JhbHQ6OnRyYWNlX2V2ZW50OjpUSU1FX0JFVFdFRU5fRVZFTlRfU1RBUlRTOiB7XAogICAgICAgICByZXN1bHRzLnB1c2hfYmFjayhcCi0gICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV8zKSArICIgdGltZSBiZXR3ZWVuIGV2ZW50IHN0YXJ0cyBpbiBcCi0gICAgICAgICAgICAgICAgc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMykgK1wKKyAgICAgICAgICAgICAgICAgICAiIHRpbWUgYmV0d2VlbiBldmVudCBzdGFydHMgaW4gc2Vjb25kcyIsIFwKICAgICAgICAgICAgICAgICAgICBldmVudF8zX3NhbXBsZXNfKSk7XAogICAgICAgfSBicmVhaztcCiAgICAgfVwKICAgICBzd2l0Y2ggKG1lYXN1cmVtZW50X3R5cGVfNCkge1wKICAgICAgIGNhc2UgY29iYWx0Ojp0cmFjZV9ldmVudDo6RkxPV19EVVJBVElPTjoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfNCkgKyAiIGZsb3cgZHVyYXRpb24gaW4gc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfNCkgK1wKKyAgICAgICAgICAgICAgICAgICAiIGZsb3cgZHVyYXRpb24gaW4gc2Vjb25kcyIsIFwKICAgICAgICAgICAgICAgICAgICBldmVudF80X3NhbXBsZXNfKSk7XAogICAgICAgfSBicmVhaztcCiAgICAgICBjYXNlIGNvYmFsdDo6dHJhY2VfZXZlbnQ6OklOX1NDT1BFX0RVUkFUSU9OOiB7XAogICAgICAgICByZXN1bHRzLnB1c2hfYmFjayhcCi0gICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV80KSArICIgaW4tc2NvcGUgZHVyYXRpb24gaW4gc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfNCkgK1wKKyAgICAgICAgICAgICAgICAgICAiIGluLXNjb3BlIGR1cmF0aW9uIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfNF9zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgICAgY2FzZSBjb2JhbHQ6OnRyYWNlX2V2ZW50OjpUSU1FX0JFVFdFRU5fRVZFTlRfU1RBUlRTOiB7XAogICAgICAgICByZXN1bHRzLnB1c2hfYmFjayhcCi0gICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV80KSArICIgdGltZSBiZXR3ZWVuIGV2ZW50IHN0YXJ0cyBpbiBcCi0gICAgICAgICAgICAgICAgc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfNCkgK1wKKyAgICAgICAgICAgICAgICAgICAiIHRpbWUgYmV0d2VlbiBldmVudCBzdGFydHMgaW4gc2Vjb25kcyIsIFwKICAgICAgICAgICAgICAgICAgICBldmVudF80X3NhbXBsZXNfKSk7XAogICAgICAgfSBicmVhaztcCiAgICAgfVwKICAgICBzd2l0Y2ggKG1lYXN1cmVtZW50X3R5cGVfNSkge1wKICAgICAgIGNhc2UgY29iYWx0Ojp0cmFjZV9ldmVudDo6RkxPV19EVVJBVElPTjoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfNSkgKyAiIGZsb3cgZHVyYXRpb24gaW4gc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfNSkgK1wKKyAgICAgICAgICAgICAgICAgICAiIGZsb3cgZHVyYXRpb24gaW4gc2Vjb25kcyIsIFwKICAgICAgICAgICAgICAgICAgICBldmVudF81X3NhbXBsZXNfKSk7XAogICAgICAgfSBicmVhaztcCiAgICAgICBjYXNlIGNvYmFsdDo6dHJhY2VfZXZlbnQ6OklOX1NDT1BFX0RVUkFUSU9OOiB7XAogICAgICAgICByZXN1bHRzLnB1c2hfYmFjayhcCi0gICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV81KSArICIgaW4tc2NvcGUgZHVyYXRpb24gaW4gc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfNSkgK1wKKyAgICAgICAgICAgICAgICAgICAiIGluLXNjb3BlIGR1cmF0aW9uIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfNV9zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgICAgY2FzZSBjb2JhbHQ6OnRyYWNlX2V2ZW50OjpUSU1FX0JFVFdFRU5fRVZFTlRfU1RBUlRTOiB7XAogICAgICAgICByZXN1bHRzLnB1c2hfYmFjayhcCi0gICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV81KSArICIgdGltZSBiZXR3ZWVuIGV2ZW50IHN0YXJ0cyBpbiBcCi0gICAgICAgICAgICAgICAgc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfNSkgK1wKKyAgICAgICAgICAgICAgICAgICAiIHRpbWUgYmV0d2VlbiBldmVudCBzdGFydHMgaW4gc2Vjb25kcyIsIFwKICAgICAgICAgICAgICAgICAgICBldmVudF81X3NhbXBsZXNfKSk7XAogICAgICAgfSBicmVhaztcCiAgICAgfVwKICAgICBzd2l0Y2ggKG1lYXN1cmVtZW50X3R5cGVfNikge1wKICAgICAgIGNhc2UgY29iYWx0Ojp0cmFjZV9ldmVudDo6RkxPV19EVVJBVElPTjoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfNikgKyAiIGZsb3cgZHVyYXRpb24gaW4gc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfNikgK1wKKyAgICAgICAgICAgICAgICAgICAiIGZsb3cgZHVyYXRpb24gaW4gc2Vjb25kcyIsIFwKICAgICAgICAgICAgICAgICAgICBldmVudF82X3NhbXBsZXNfKSk7XAogICAgICAgfSBicmVhaztcCiAgICAgICBjYXNlIGNvYmFsdDo6dHJhY2VfZXZlbnQ6OklOX1NDT1BFX0RVUkFUSU9OOiB7XAogICAgICAgICByZXN1bHRzLnB1c2hfYmFjayhcCi0gICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV82KSArICIgaW4tc2NvcGUgZHVyYXRpb24gaW4gc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfNikgK1wKKyAgICAgICAgICAgICAgICAgICAiIGluLXNjb3BlIGR1cmF0aW9uIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfNl9zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgICAgY2FzZSBjb2JhbHQ6OnRyYWNlX2V2ZW50OjpUSU1FX0JFVFdFRU5fRVZFTlRfU1RBUlRTOiB7XAogICAgICAgICByZXN1bHRzLnB1c2hfYmFjayhcCi0gICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV82KSArICIgdGltZSBiZXR3ZWVuIGV2ZW50IHN0YXJ0cyBpbiBcCi0gICAgICAgICAgICAgICAgc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfNikgK1wKKyAgICAgICAgICAgICAgICAgICAiIHRpbWUgYmV0d2VlbiBldmVudCBzdGFydHMgaW4gc2Vjb25kcyIsIFwKICAgICAgICAgICAgICAgICAgICBldmVudF82X3NhbXBsZXNfKSk7XAogICAgICAgfSBicmVhaztcCiAgICAgfVwKICAgICBzd2l0Y2ggKG1lYXN1cmVtZW50X3R5cGVfNykge1wKICAgICAgIGNhc2UgY29iYWx0Ojp0cmFjZV9ldmVudDo6RkxPV19EVVJBVElPTjoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfNykgKyAiIGZsb3cgZHVyYXRpb24gaW4gc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfNykgK1wKKyAgICAgICAgICAgICAgICAgICAiIGZsb3cgZHVyYXRpb24gaW4gc2Vjb25kcyIsIFwKICAgICAgICAgICAgICAgICAgICBldmVudF83X3NhbXBsZXNfKSk7XAogICAgICAgfSBicmVhaztcCiAgICAgICBjYXNlIGNvYmFsdDo6dHJhY2VfZXZlbnQ6OklOX1NDT1BFX0RVUkFUSU9OOiB7XAogICAgICAgICByZXN1bHRzLnB1c2hfYmFjayhcCi0gICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV83KSArICIgaW4tc2NvcGUgZHVyYXRpb24gaW4gc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfNykgK1wKKyAgICAgICAgICAgICAgICAgICAiIGluLXNjb3BlIGR1cmF0aW9uIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfN19zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgICAgY2FzZSBjb2JhbHQ6OnRyYWNlX2V2ZW50OjpUSU1FX0JFVFdFRU5fRVZFTlRfU1RBUlRTOiB7XAogICAgICAgICByZXN1bHRzLnB1c2hfYmFjayhcCi0gICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV83KSArICIgdGltZSBiZXR3ZWVuIGV2ZW50IHN0YXJ0cyBpbiBcCi0gICAgICAgICAgICAgICAgc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfNykgK1wKKyAgICAgICAgICAgICAgICAgICAiIHRpbWUgYmV0d2VlbiBldmVudCBzdGFydHMgaW4gc2Vjb25kcyIsIFwKICAgICAgICAgICAgICAgICAgICBldmVudF83X3NhbXBsZXNfKSk7XAogICAgICAgfSBicmVhaztcCiAgICAgfVwKICAgICBzd2l0Y2ggKG1lYXN1cmVtZW50X3R5cGVfOCkge1wKICAgICAgIGNhc2UgY29iYWx0Ojp0cmFjZV9ldmVudDo6RkxPV19EVVJBVElPTjoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfOCkgKyAiIGZsb3cgZHVyYXRpb24gaW4gc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfOCkgK1wKKyAgICAgICAgICAgICAgICAgICAiIGZsb3cgZHVyYXRpb24gaW4gc2Vjb25kcyIsIFwKICAgICAgICAgICAgICAgICAgICBldmVudF84X3NhbXBsZXNfKSk7XAogICAgICAgfSBicmVhaztcCiAgICAgICBjYXNlIGNvYmFsdDo6dHJhY2VfZXZlbnQ6OklOX1NDT1BFX0RVUkFUSU9OOiB7XAogICAgICAgICByZXN1bHRzLnB1c2hfYmFjayhcCi0gICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV84KSArICIgaW4tc2NvcGUgZHVyYXRpb24gaW4gc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfOCkgK1wKKyAgICAgICAgICAgICAgICAgICAiIGluLXNjb3BlIGR1cmF0aW9uIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfOF9zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgICAgY2FzZSBjb2JhbHQ6OnRyYWNlX2V2ZW50OjpUSU1FX0JFVFdFRU5fRVZFTlRfU1RBUlRTOiB7XAogICAgICAgICByZXN1bHRzLnB1c2hfYmFjayhcCi0gICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV84KSArICIgdGltZSBiZXR3ZWVuIGV2ZW50IHN0YXJ0cyBpbiBcCi0gICAgICAgICAgICAgICAgc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfOCkgK1wKKyAgICAgICAgICAgICAgICAgICAiIHRpbWUgYmV0d2VlbiBldmVudCBzdGFydHMgaW4gc2Vjb25kcyIsIFwKICAgICAgICAgICAgICAgICAgICBldmVudF84X3NhbXBsZXNfKSk7XAogICAgICAgfSBicmVhaztcCiAgICAgfVwKICAgICBzd2l0Y2ggKG1lYXN1cmVtZW50X3R5cGVfOSkge1wKICAgICAgIGNhc2UgY29iYWx0Ojp0cmFjZV9ldmVudDo6RkxPV19EVVJBVElPTjoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfOSkgKyAiIGZsb3cgZHVyYXRpb24gaW4gc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfOSkgK1wKKyAgICAgICAgICAgICAgICAgICAiIGZsb3cgZHVyYXRpb24gaW4gc2Vjb25kcyIsIFwKICAgICAgICAgICAgICAgICAgICBldmVudF85X3NhbXBsZXNfKSk7XAogICAgICAgfSBicmVhaztcCiAgICAgICBjYXNlIGNvYmFsdDo6dHJhY2VfZXZlbnQ6OklOX1NDT1BFX0RVUkFUSU9OOiB7XAogICAgICAgICByZXN1bHRzLnB1c2hfYmFjayhcCi0gICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV85KSArICIgaW4tc2NvcGUgZHVyYXRpb24gaW4gc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfOSkgK1wKKyAgICAgICAgICAgICAgICAgICAiIGluLXNjb3BlIGR1cmF0aW9uIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfOV9zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgICAgY2FzZSBjb2JhbHQ6OnRyYWNlX2V2ZW50OjpUSU1FX0JFVFdFRU5fRVZFTlRfU1RBUlRTOiB7XAogICAgICAgICByZXN1bHRzLnB1c2hfYmFjayhcCi0gICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV85KSArICIgdGltZSBiZXR3ZWVuIGV2ZW50IHN0YXJ0cyBpbiBcCi0gICAgICAgICAgICAgICAgc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfOSkgK1wKKyAgICAgICAgICAgICAgICAgICAiIHRpbWUgYmV0d2VlbiBldmVudCBzdGFydHMgaW4gc2Vjb25kcyIsIFwKICAgICAgICAgICAgICAgICAgICBldmVudF85X3NhbXBsZXNfKSk7XAogICAgICAgfSBicmVhaztcCiAgICAgfVwKICAgICBzd2l0Y2ggKG1lYXN1cmVtZW50X3R5cGVfMTApIHtcCiAgICAgICBjYXNlIGNvYmFsdDo6dHJhY2VfZXZlbnQ6OkZMT1dfRFVSQVRJT046IHtcCiAgICAgICAgIHJlc3VsdHMucHVzaF9iYWNrKFwKLSAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzEwKSArICIgZmxvdyBkdXJhdGlvbiBpbiBzZWNvbmRzIixcCisgICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV8xMCkgK1wKKyAgICAgICAgICAgICAgICAgICAiIGZsb3cgZHVyYXRpb24gaW4gc2Vjb25kcyIsIFwKICAgICAgICAgICAgICAgICAgICBldmVudF8xMF9zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgICAgY2FzZSBjb2JhbHQ6OnRyYWNlX2V2ZW50OjpJTl9TQ09QRV9EVVJBVElPTjoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMTApICsgIiBpbi1zY29wZSBkdXJhdGlvbiBpbiBcCi0gICAgICAgICAgICAgICAgc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMTApICtcCisgICAgICAgICAgICAgICAgICAgIiBpbi1zY29wZSBkdXJhdGlvbiBpbiBzZWNvbmRzIiwgXAogICAgICAgICAgICAgICAgICAgIGV2ZW50XzEwX3NhbXBsZXNfKSk7XAogICAgICAgfSBicmVhaztcCiAgICAgICBjYXNlIGNvYmFsdDo6dHJhY2VfZXZlbnQ6OlRJTUVfQkVUV0VFTl9FVkVOVF9TVEFSVFM6IHtcCiAgICAgICAgIHJlc3VsdHMucHVzaF9iYWNrKFwKLSAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXzEwKSArICIgdGltZSBiZXR3ZWVuIGV2ZW50IHN0YXJ0cyBcCi0gICAgICAgICAgICAgICAgaW4gc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfMTApICtcCisgICAgICAgICAgICAgICAgICAgIiB0aW1lIGJldHdlZW4gZXZlbnQgc3RhcnRzIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfMTBfc2FtcGxlc18pKTtcCiAgICAgICB9IGJyZWFrO1wKICAgICB9XApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC90cmFjZV9ldmVudC9iZW5jaG1hcmtfaW50ZXJuYWwuaC5wdW1wIGIvc3JjL2NvYmFsdC90cmFjZV9ldmVudC9iZW5jaG1hcmtfaW50ZXJuYWwuaC5wdW1wCmluZGV4IDgwMTIxZjMuLjlhOWQ5ZmEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvdHJhY2VfZXZlbnQvYmVuY2htYXJrX2ludGVybmFsLmgucHVtcAorKysgYi9zcmMvY29iYWx0L3RyYWNlX2V2ZW50L2JlbmNobWFya19pbnRlcm5hbC5oLnB1bXAKQEAgLTgxLDE3ICs4MSwyMCBAQAogICAgIHN3aXRjaCAobWVhc3VyZW1lbnRfdHlwZV8kKEFSRykpIHtcCiAgICAgICBjYXNlIGNvYmFsdDo6dHJhY2VfZXZlbnQ6OkZMT1dfRFVSQVRJT046IHtcCiAgICAgICAgIHJlc3VsdHMucHVzaF9iYWNrKFwKLSAgICAgICAgICAgIFJlc3VsdChzdGQ6OnN0cmluZyhldmVudF9uYW1lXyQoQVJHKSkgKyAiIGZsb3cgZHVyYXRpb24gaW4gc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfJChBUkcpKSArXAorICAgICAgICAgICAgICAgICAgICIgZmxvdyBkdXJhdGlvbiBpbiBzZWNvbmRzIiwgXAogICAgICAgICAgICAgICAgICAgIGV2ZW50XyQoQVJHKV9zYW1wbGVzXykpO1wKICAgICAgIH0gYnJlYWs7XAogICAgICAgY2FzZSBjb2JhbHQ6OnRyYWNlX2V2ZW50OjpJTl9TQ09QRV9EVVJBVElPTjoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfJChBUkcpKSArICIgaW4tc2NvcGUgZHVyYXRpb24gaW4gc2Vjb25kcyIsXAorICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfJChBUkcpKSArXAorICAgICAgICAgICAgICAgICAgICIgaW4tc2NvcGUgZHVyYXRpb24gaW4gc2Vjb25kcyIsIFwKICAgICAgICAgICAgICAgICAgICBldmVudF8kKEFSRylfc2FtcGxlc18pKTtcCiAgICAgICB9IGJyZWFrO1wKICAgICAgIGNhc2UgY29iYWx0Ojp0cmFjZV9ldmVudDo6VElNRV9CRVRXRUVOX0VWRU5UX1NUQVJUUzoge1wKICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soXAotICAgICAgICAgICAgUmVzdWx0KHN0ZDo6c3RyaW5nKGV2ZW50X25hbWVfJChBUkcpKSArICIgdGltZSBiZXR3ZWVuIGV2ZW50IHN0YXJ0cyBpbiBzZWNvbmRzIixcCisgICAgICAgICAgICBSZXN1bHQoc3RkOjpzdHJpbmcoZXZlbnRfbmFtZV8kKEFSRykpICtcCisgICAgICAgICAgICAgICAgICAgIiB0aW1lIGJldHdlZW4gZXZlbnQgc3RhcnRzIGluIHNlY29uZHMiLCBcCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfJChBUkcpX3NhbXBsZXNfKSk7XAogICAgICAgfSBicmVhaztcCiAgICAgfVwKZGlmZiAtLWdpdCBhL3NyYy9uYi9SRUFETUUubWQgYi9zcmMvbmIvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNmMzMjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbmIvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMTQgQEAKKyMgTmFub2Jhc2UKKworTmFub2Jhc2UgaXMgZXNzZW50aWFsbHkgYSBtaW5pZmllZC9saWdodHdlaWdodCB2ZXJzaW9uIG9mIENocm9taXVtJ3MgYmFzZQorbGlicmFyeSwgdGhvdWdoIGl0IGRvZXMgaW5jbHVkZSB1dGlsaXR5IGNsYXNzZXMgdGhhdCBDaHJvbWl1bSdzIGJhc2UgZG9lcyBub3QuCisKK0l0cyB1c2VmdWxuZXNzIGlzIGZvdW5kIGluIHRoZSBmYWN0IHRoYXQgaXRzIG9ubHkgZGVwZW5kZW5jeSBpcyBzdGFyYm9hcmQsCittYWtpbmcgaXQgdmVyeSBwb3J0YWJsZSBhbmQgZWFzeSB0byBpbmNsdWRlIGluIHByb2plY3RzIHRoYXQgZG9uJ3Qgd2FudAordG8gZGVwZW5kIG9uIENocm9taXVtJ3MgYmFzZSAod2hpY2ggY3VycmVudGx5IHdvdWxkIHJlcXVpcmUgdGhlIENocm9taXVtCityZXBvc2l0b3J5IHRvIGJlIGF2YWlsYWJsZSBhbmQgdGhhdCBtYXkgbm90IGJlIGRlc2lyYWJsZSkuCisKK0FuIGV4YW1wbGUgcHJvamVjdCB0aGF0IGRlcGVuZHMgb24gbmIgaXMgZ2xpbXAsIHdoaWNoIHdhcyB0aGUgcHJvamVjdCB0aGF0Citpbml0aWF0ZWQgdGhlIGNyZWF0aW9uIG9mIG5iLiAgV2Ugd2FudGVkIGdsaW1wIHRvIGJlIHBvcnRhYmxlIGFsb25nc2lkZQorU3RhcmJvYXJkLCBhbmQgc28gaW4gb3JkZXIgdG8gZW5hYmxlIHRoYXQsIHdlIHdhbnRlZCB0byBhdm9pZCBhIGRlcGVuZGVuY3kKK29uIENocm9taXVtJ3MgYmFzZS4KZGlmZiAtLWdpdCBhL3NyYy9uYi9hbmFseXRpY3MvbWVtb3J5X3RyYWNrZXJfaGVscGVycy5jYyBiL3NyYy9uYi9hbmFseXRpY3MvbWVtb3J5X3RyYWNrZXJfaGVscGVycy5jYwppbmRleCA0ZWMxZGU3Li40ZDFmN2FkIDEwMDY0NAotLS0gYS9zcmMvbmIvYW5hbHl0aWNzL21lbW9yeV90cmFja2VyX2hlbHBlcnMuY2MKKysrIGIvc3JjL25iL2FuYWx5dGljcy9tZW1vcnlfdHJhY2tlcl9oZWxwZXJzLmNjCkBAIC0yMDAsNyArMjAwLDggQEAKICAgICAgICBpdCAhPSBwb2ludGVyX21hcF8uZW5kKCk7ICsraXQpIHsKICAgICBjb25zdCBBbGxvY2F0aW9uUmVjb3JkJiByZWMgPSBpdC0+c2Vjb25kOwogICAgIEFsbG9jYXRpb25Hcm91cCogZ3JvdXAgPSByZWMuYWxsb2NhdGlvbl9ncm91cDsKLSAgICBncm91cC0+QWRkQWxsb2NhdGlvbigtcmVjLnNpemUpOworICAgIGNvbnN0IGludDY0X3Qgc2l6ZSA9IHN0YXRpY19jYXN0PGludDY0X3Q+KHJlYy5zaXplKTsKKyAgICBncm91cC0+QWRkQWxsb2NhdGlvbigtc2l6ZSk7CiAgIH0KICAgcmV0dXJuIHBvaW50ZXJfbWFwXy5jbGVhcigpOwogfQpAQCAtMjYwLDkgKzI2MSw4IEBACiAgIHJldHVybiB0cnVlOwogfQogCi1zaXplX3QgQ29uY3VycmVudEFsbG9jYXRpb25NYXA6Omhhc2hfcHRyKGNvbnN0IHZvaWQqIHB0cikgewordWludDMyX3QgQ29uY3VycmVudEFsbG9jYXRpb25NYXA6Omhhc2hfcHRyKGNvbnN0IHZvaWQqIHB0cikgewogICB1aW50cHRyX3QgdmFsID0gcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KHB0cik7Ci0KICAgcmV0dXJuIFJ1bnRpbWVIYXNoMzIocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oJnZhbCksIHNpemVvZih2YWwpKTsKIH0KIApkaWZmIC0tZ2l0IGEvc3JjL25iL2FuYWx5dGljcy9tZW1vcnlfdHJhY2tlcl9oZWxwZXJzLmggYi9zcmMvbmIvYW5hbHl0aWNzL21lbW9yeV90cmFja2VyX2hlbHBlcnMuaAppbmRleCA2NTNhNDdmLi43MGNmMzJiIDEwMDY0NAotLS0gYS9zcmMvbmIvYW5hbHl0aWNzL21lbW9yeV90cmFja2VyX2hlbHBlcnMuaAorKysgYi9zcmMvbmIvYW5hbHl0aWNzL21lbW9yeV90cmFja2VyX2hlbHBlcnMuaApAQCAtMjA1LDcgKzIwNSw3IEBACiAgcHJpdmF0ZToKICAgU0JfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKENvbmN1cnJlbnRBbGxvY2F0aW9uTWFwKTsKICAgLy8gVGFrZXMgYSBwb2ludGVyIGFuZCBnZW5lcmF0ZXMgYSBoYXNoLgotICBzdGF0aWMgc2l6ZV90IGhhc2hfcHRyKGNvbnN0IHZvaWQqIHB0cik7CisgIHN0YXRpYyB1aW50MzJfdCBoYXNoX3B0cihjb25zdCB2b2lkKiBwdHIpOwogCiAgIGludCBUb0luZGV4KGNvbnN0IHZvaWQqIHB0cikgY29uc3Q7CiAgIEF0b21pY0FsbG9jYXRpb25NYXAgcG9pbnRlcl9tYXBfYXJyYXlfW2tOdW1FbGVtZW50c107CmRpZmYgLS1naXQgYS9zcmMvbmIvbWVtb3J5X3Njb3BlX3Rlc3QuY2MgYi9zcmMvbmIvbWVtb3J5X3Njb3BlX3Rlc3QuY2MKaW5kZXggZTczNGMyZi4uZDkxODBmOSAxMDA2NDQKLS0tIGEvc3JjL25iL21lbW9yeV9zY29wZV90ZXN0LmNjCisrKyBiL3NyYy9uYi9tZW1vcnlfc2NvcGVfdGVzdC5jYwpAQCAtMjI3LDE2ICsyMjcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWV9OyAgICAgICAgICAvLyB0cnVlIGFsbG93cyBjYWNoaW5nLg0KIA0KICAgTmJQdXNoTWVtb3J5U2NvcGUoJmluZm8pOw0KLQ0KLSAgQVNTRVJUX0ZBTFNFKHRlc3RfbWVtb3J5X3JlcG9ydGVyKCktPnN0YWNrX3RocmVhZF9sb2NhbCgpLT5lbXB0eSgpKTsNCi0gIE5iTWVtb3J5U2NvcGVJbmZvKiBpbmZvX3B0ciA9DQotICAgICAgdGVzdF9tZW1vcnlfcmVwb3J0ZXIoKS0+c3RhY2tfdGhyZWFkX2xvY2FsKCktPmZyb250KCk7DQotDQotICBFWFBFQ1RfRVEoJmluZm8sIGluZm9fcHRyKTsNCi0gIEVYUEVDVF9TVFJFUShpbmZvLmZpbGVfbmFtZV8sIGZpbGVfbmFtZSk7DQotICBFWFBFQ1RfU1RSRVEoaW5mby5mdW5jdGlvbl9uYW1lXywgZnVuY3Rpb25fbmFtZSk7DQotICBFWFBFQ1RfRVEoaW5mby5saW5lX251bWJlcl8sIGxpbmVfbnVtYmVyKTsNCi0NCisgIEFTU0VSVF9UUlVFKHRlc3RfbWVtb3J5X3JlcG9ydGVyKCktPnN0YWNrX3RocmVhZF9sb2NhbCgpLT5lbXB0eSgpKTsNCiAgIE5iUG9wTWVtb3J5U2NvcGUoKTsNCiAgIEVYUEVDVF9UUlVFKHRlc3RfbWVtb3J5X3JlcG9ydGVyKCktPnN0YWNrX3RocmVhZF9sb2NhbCgpLT5lbXB0eSgpKTsNCiB9DQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9jb25maWd1cmF0aW9uLmggYi9zcmMvc3RhcmJvYXJkL2NvbmZpZ3VyYXRpb24uaAppbmRleCBhNTQ5Mjk1Li43NDJjZGVkIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL2NvbmZpZ3VyYXRpb24uaAorKysgYi9zcmMvc3RhcmJvYXJkL2NvbmZpZ3VyYXRpb24uaApAQCAtNjAsNiArNjAsNyBAQAogCiAvLyBBZGRzIGtTYlN5c3RlbVByb3BlcnR5VXNlckFnZW50QXV4RmllbGQgdG8gdGhlIFNiU3lzdGVtUHJvcGVydHlJZAogLy8gZW51bSB0byBhbGxvdyBwbGF0Zm9ybS1zcGVjaWZpYyAgVXNlci1BZ2VudCBzdWZmaXguCisvLyBOT0xJTlRORVhUTElORSh3aGl0ZXNwYWNlL2xpbmVfbGVuZ3RoKQogI2RlZmluZSBTQl9VU0VSX0FHRU5UX0FVWF9TWVNURU1fUFJPUEVSVFlfQVBJX1ZFUlNJT04gU0JfRVhQRVJJTUVOVEFMX0FQSV9WRVJTSU9OCiAKIC8vIEludHJvZHVjZSAnc3RhcmJvYXJkL3NwZWVjaF9yZWNvZ25pemVyLmgnCkBAIC02Nyw2ICs2OCwxMCBAQAogLy8gc3BlZWNoIHJlY29nbml6ZXIgZmVhdHVyZS4KICNkZWZpbmUgU0JfU1BFRUNIX1JFQ09HTklaRVJfQVBJX1ZFUlNJT04gU0JfRVhQRVJJTUVOVEFMX0FQSV9WRVJTSU9OCiAKKy8vIEludHJvZHVjZSBwb2ludGVyIChtb3VzZSkgaW5wdXQgc3VwcG9ydC4gVGhpcyBleHRlbmRzIHRoZSBTYklucHV0IGludGVyZmFjZQorLy8gd2l0aCBzb21lIGVudW0gdmFsdWVzIGFuZCBkYXRhIG1lbWJlcnMgdG8gYWxsb3cgbW91c2UsIHdoZWVsLCBhbmQgbW9yZQorLy8gZ2VuZXJpYyBwb2ludGVyIGlucHV0LgorI2RlZmluZSBTQl9QT0lOVEVSX0lOUFVUX0FQSV9WRVJTSU9OIFNCX0VYUEVSSU1FTlRBTF9BUElfVkVSU0lPTgogLy8gLS0tIENvbW1vbiBEZXRlY3RlZCBGZWF0dXJlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKICNpZiBkZWZpbmVkKF9fR05VQ19fKQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9pbnB1dC5oIGIvc3JjL3N0YXJib2FyZC9pbnB1dC5oCmluZGV4IDEwYzkxOWEuLmM2ZTBmZDcgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvaW5wdXQuaAorKysgYi9zcmMvc3RhcmJvYXJkL2lucHV0LmgKQEAgLTMzLDkgKzMzLDkgQEAKIC8vIGRldmljZSB0eXBlIHByb2R1Y2VzIGNvcnJlc3BvbmQgdG8gfFNiSW5wdXRFdmVudFR5cGV8IHZhbHVlcy4KIHR5cGVkZWYgZW51bSBTYklucHV0RGV2aWNlVHlwZSB7CiAgIC8vIElucHV0IGZyb20gYSBnZXN0dXJlLWRldGVjdGlvbiBtZWNoYW5pc20uIEV4YW1wbGVzIGluY2x1ZGUgS2luZWN0LAotICAvLyBXaWltb3RlcywgTEcgTWFnaWMgUmVtb3RlcywgZXRjLi4uCisgIC8vIFdpaW1vdGVzLCBldGMuLi4KICAgLy8KLSAgLy8gUHJvZHVjZXMgfE1vdmV8LCB8R3JhYnwsIHxVbmdyYWJ8LCB8UHJlc3N8IGFuZCB8VW5wcmVzc3wgZXZlbnRzLgorICAvLyBQcm9kdWNlcyB8TW92ZXwsIHxQcmVzc3wgYW5kIHxVbnByZXNzfCBldmVudHMuCiAgIGtTYklucHV0RGV2aWNlVHlwZUdlc3R1cmUsCiAKICAgLy8gSW5wdXQgZnJvbSBhIGdhbWVwYWQsIGZvbGxvd2luZyB0aGUgbGF5b3V0IHByb3ZpZGVkIGluIHRoZSBXM0MgV2ViIEdhbWVwYWQKQEAgLTQ5LDEyICs0OSwxNCBAQAogICAvLyBQcm9kdWNlcyB8UHJlc3N8IGFuZCB8VW5wcmVzc3wgZXZlbnRzLgogICBrU2JJbnB1dERldmljZVR5cGVLZXlib2FyZCwKIAorI2lmIFNCX0FQSV9WRVJTSU9OIDw9IDQKICAgLy8gSW5wdXQgZnJvbSBhIG1pY3JvcGhvbmUgdGhhdCB3b3VsZCBwcm92aWRlIGF1ZGlvIGRhdGEgdG8gdGhlIGNhbGxlciwgd2hvCiAgIC8vIG1heSB0aGVuIGZpbmQgc29tZSB3YXkgdG8gZGV0ZWN0IHNwZWVjaCBvciBvdGhlciBzb3VuZHMgd2l0aGluIGl0LiBJdCBtYXkKICAgLy8gaGF2ZSBwcm9jZXNzZWQgb3IgZmlsdGVyZWQgdGhlIGF1ZGlvIGluIHNvbWUgd2F5IGJlZm9yZSBpdCBhcnJpdmVzLgogICAvLwogICAvLyBQcm9kdWNlcyB8QXVkaW98IGV2ZW50cy4KICAga1NiSW5wdXREZXZpY2VUeXBlTWljcm9waG9uZSwKKyNlbmRpZgogCiAgIC8vIElucHV0IGZyb20gYSB0cmFkaXRpb25hbCBtb3VzZS4KICAgLy8KQEAgLTY2LDEyICs2OCwxNCBAQAogICAvLyBQcm9kdWNlcyB8UHJlc3N8IGFuZCB8VW5wcmVzc3wgZXZlbnRzLgogICBrU2JJbnB1dERldmljZVR5cGVSZW1vdGUsCiAKKyNpZiBTQl9BUElfVkVSU0lPTiA8PSA0CiAgIC8vIElucHV0IGZyb20gYSBzcGVlY2ggY29tbWFuZCBhbmFseXplciwgd2hpY2ggaXMgc29tZSBoYXJkd2FyZSBvciBzb2Z0d2FyZQogICAvLyB0aGF0LCBnaXZlbiBhIHNldCBvZiBrbm93biBwaHJhc2VzLCBhY3RpdmF0ZXMgd2hlbiBvbmUgb2YgdGhlIHJlZ2lzdGVyZWQKICAgLy8gcGhyYXNlcyBpcyBoZWFyZC4KICAgLy8KICAgLy8gUHJvZHVjZXMgfENvbW1hbmR8IGV2ZW50cy4KICAga1NiSW5wdXREZXZpY2VUeXBlU3BlZWNoQ29tbWFuZCwKKyNlbmRpZgogCiAgIC8vIElucHV0IGZyb20gYSBzaW5nbGUtIG9yIG11bHRpLXRvdWNoc2NyZWVuLgogICAvLwpAQCAtODYsMTUgKzkwLDE1IEBACiAKIC8vIFRoZSBhY3Rpb24gdGhhdCBhbiBpbnB1dCBldmVudCByZXByZXNlbnRzLgogdHlwZWRlZiBlbnVtIFNiSW5wdXRFdmVudFR5cGUgeworI2lmIFNCX0FQSV9WRVJTSU9OIDw9IDQKICAgLy8gUmVjZWlwdCBvZiBBdWRpby4gU29tZSBhdWRpbyBkYXRhIHdhcyByZWNlaXZlZCBieSB0aGUgaW5wdXQgbWljcm9waG9uZS4KICAga1NiSW5wdXRFdmVudFR5cGVBdWRpbywKLQogICAvLyBSZWNlaXB0IG9mIGEgY29tbWFuZC4gQSBjb21tYW5kIHdhcyByZWNlaXZlZCBmcm9tIHNvbWUgc2VtYW50aWMgc291cmNlLAogICAvLyBsaWtlIGEgc3BlZWNoIHJlY29nbml6ZXIuCiAgIGtTYklucHV0RXZlbnRUeXBlQ29tbWFuZCwKLQogICAvLyBHcmFiIGFjdGl2YXRpb24uIFRoaXMgZXZlbnQgdHlwZSBpcyBkZXByZWNhdGVkLgogICBrU2JJbnB1dEV2ZW50VHlwZUdyYWIsCisjZW5kaWYKIAogICAvLyBEZXZpY2UgTW92ZW1lbnQuIEluIHRoZSBjYXNlIG9mIHxNb3VzZXwsIGFuZCBwZXJoYXBzIHxHZXN0dXJlfCwgdGhlCiAgIC8vIG1vdmVtZW50IHRyYWNrcyBhbiBhYnNvbHV0ZSBjdXJzb3IgcG9zaXRpb24uIEluIHRoZSBjYXNlIG9mIHxUb3VjaFBhZHwsCkBAIC0xMDgsMTIgKzExMiwxOSBAQAogICAvLyBJbmplY3RpbmcgcmVwZWF0IHByZXNzZXMgaXMgdXAgdG8gdGhlIGNsaWVudC4KICAga1NiSW5wdXRFdmVudFR5cGVQcmVzcywKIAorI2lmIFNCX0FQSV9WRVJTSU9OIDw9IDQKICAgLy8gR3JhYiBkZWFjdGl2YXRpb24uIFRoaXMgZXZlbnQgdHlwZSBpcyBkZXByZWNhdGVkLgogICBrU2JJbnB1dEV2ZW50VHlwZVVuZ3JhYiwKKyNlbmRpZgogCiAgIC8vIEtleSBvciBidXR0b24gZGVhY3RpdmF0aW9uLiBUaGUgY291bnRlcnBhcnQgdG8gdGhlIHxQcmVzc3wgZXZlbnQsIHRoaXMKICAgLy8gZXZlbnQgaXMgc2VudCB3aGVuIHRoZSBrZXkgb3IgYnV0dG9uIGJlaW5nIHByZXNzZWQgaXMgcmVsZWFzZWQuCiAgIGtTYklucHV0RXZlbnRUeXBlVW5wcmVzcywKKworI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX1BPSU5URVJfSU5QVVRfQVBJX1ZFUlNJT04KKyAgLy8gV2hlZWwgbW92ZW1lbnQuIFByb3ZpZGVzIHJlbGF0aXZlIG1vdmVtZW50cyBvZiB0aGUgfE1vdXNlfCB3aGVlbC4KKyAga1NiSW5wdXRFdmVudFR5cGVXaGVlbCwKKyNlbmRpZgogfSBTYklucHV0RXZlbnRUeXBlOwogCiAvLyBBIDItZGltZW5zaW9uYWwgdmVjdG9yIHVzZWQgdG8gcmVwcmVzZW50IHBvaW50cyBhbmQgbW90aW9uIHZlY3RvcnMuCkBAIC0xNjgsNiArMTc5LDI5IEBACiAgIC8vIFRoZSByZWxhdGl2ZSBtb3Rpb24gdmVjdG9yIG9mIHRoaXMgaW5wdXQuIFRoZSB2YWx1ZSBpcyB8MHwgaWYgdGhpcyBkYXRhCiAgIC8vIGlzIG5vdCBhcHBsaWNhYmxlLgogICBTYklucHV0VmVjdG9yIGRlbHRhOworCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfUE9JTlRFUl9JTlBVVF9BUElfVkVSU0lPTgorICAvLyBUaGUgbm9ybWFsaXplZCBwcmVzc3VyZSBvZiB0aGUgcG9pbnRlciBpbnB1dCBpbiB0aGUgcmFuZ2Ugb2YKKyAgLy8gWzAsMV0sIHdoZXJlIDAgYW5kIDEgcmVwcmVzZW50IHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHByZXNzdXJlCisgIC8vIHRoZSBoYXJkd2FyZSBpcyBjYXBhYmxlIG9mIGRldGVjdGluZywgcmVzcGVjdGl2ZWx5LiBVc2UgTmFOIGZvcgorICAvLyBkZXZpY2VzIHRoYXQgZG8gbm90IHJlcG9ydCBwcmVzc3VyZS4gVGhpcyB2YWx1ZSBpcyBvbmx5IHVzZWQgZm9yIGlucHV0CisgIC8vIGV2ZW50cyB3aXRoIGRldmljZSB0eXBlIG1vdXNlIG9yIHRvdWNoIHNjcmVlbi4KKyAgZmxvYXQgcHJlc3N1cmU7CisKKyAgLy8gVGhlICh3aWR0aCwgaGVpZ2h0KSBvZiB0aGUgY29udGFjdCBnZW9tZXRyeSBvZiB0aGUgcG9pbnRlci4KKyAgLy8gVGhpcyBkZWZpbmVzIHRoZSBsaW1pdHMgb2YgdGhlIHZhbHVlcyByZXBvcnRlZCBmb3IgdGhlIHBvaW50ZXIKKyAgLy8gY29vcmRpbmF0ZXMgaW4gdGhlICdwb3NpdGlvbicgZmllbGQuIElmIChOYU4sIE5hTikgaXMgc3BlY2lmaWVkLAorICAvLyB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgd2luZG93IHdpbGwgYmUgdXNlZC4gVGhpcyB2YWx1ZSBpcyBvbmx5IHVzZWQKKyAgLy8gZm9yIGlucHV0IGV2ZW50cyB3aXRoIGRldmljZSB0eXBlIG1vdXNlIG9yIHRvdWNoIHNjcmVlbi4KKyAgU2JJbnB1dFZlY3RvciBzaXplOworCisgIC8vIFRoZSAoeCwgeSkgYW5nbGUgaW4gZGVncmVlcywgaW4gdGhlIHJhbmdlIG9mIFstOTAsIDkwXSBvZiB0aGUKKyAgLy8gcG9pbnRlciwgcmVsYXRpdmUgdG8gdGhlIHogYXhpcy4gUG9zaXRpdmUgdmFsdWVzIGFyZSBmb3IgdGlsdAorICAvLyB0byB0aGUgcmlnaHQgKHgpLCBhbmQgdG93YXJkcyB0aGUgdXNlciAoeSkuIFVzZSAoTmFOLCBOYU4pIGZvcgorICAvLyBkZXZpY2VzIHRoYXQgZG8gbm90IHJlcG9ydCB0aWx0LiBUaGlzIHZhbHVlIGlzIG9ubHkgdXNlZCBmb3IgaW5wdXQgZXZlbnRzCisgIC8vIHdpdGggZGV2aWNlIHR5cGUgbW91c2Ugb3IgdG91Y2ggc2NyZWVuLgorICBTYklucHV0VmVjdG9yIHRpbHQ7CisjZW5kaWYKIH0gU2JJbnB1dERhdGE7CiAKICNpZmRlZiBfX2NwbHVzcGx1cwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9rZXkuaCBiL3NyYy9zdGFyYm9hcmQva2V5LmgKaW5kZXggYjUwNjA4Zi4uODE5MWFjZCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9rZXkuaAorKysgYi9zcmMvc3RhcmJvYXJkL2tleS5oCkBAIC0xOSw2ICsxOSw4IEBACiAjaWZuZGVmIFNUQVJCT0FSRF9LRVlfSF8KICNkZWZpbmUgU1RBUkJPQVJEX0tFWV9IXwogCisjaW5jbHVkZSAic3RhcmJvYXJkL2NvbmZpZ3VyYXRpb24uaCIKKwogI2lmZGVmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiIHsKICNlbmRpZgpAQCAtMjc5LDYgKzI4MSwxMyBAQAogICBrU2JLZXlNb2RpZmllcnNDdHJsID0gMSA8PCAxLAogICBrU2JLZXlNb2RpZmllcnNNZXRhID0gMSA8PCAyLAogICBrU2JLZXlNb2RpZmllcnNTaGlmdCA9IDEgPDwgMywKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9QT0lOVEVSX0lOUFVUX0FQSV9WRVJTSU9OCisgIGtTYktleU1vZGlmaWVyc1BvaW50ZXJCdXR0b25MZWZ0ID0gMSA8PCA0LAorICBrU2JLZXlNb2RpZmllcnNQb2ludGVyQnV0dG9uUmlnaHQgPSAxIDw8IDUsCisgIGtTYktleU1vZGlmaWVyc1BvaW50ZXJCdXR0b25NaWRkbGUgPSAxIDw8IDYsCisgIGtTYktleU1vZGlmaWVyc1BvaW50ZXJCdXR0b25CYWNrID0gMSA8PCA3LAorICBrU2JLZXlNb2RpZmllcnNQb2ludGVyQnV0dG9uRm9yd2FyZCA9IDEgPDwgOCwKKyNlbmRpZgogfSBTYktleU1vZGlmaWVyczsKIAogI2lmZGVmIF9fY3BsdXNwbHVzCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9jbGFuZy8zLjYvY29tcGlsZXJfZmxhZ3MuZ3lwaSBiL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL2NsYW5nLzMuNi9jb21waWxlcl9mbGFncy5neXBpCmluZGV4IGVjYTJmOGUuLjVjZGUyZjcgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL2NsYW5nLzMuNi9jb21waWxlcl9mbGFncy5neXBpCisrKyBiL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL2NsYW5nLzMuNi9jb21waWxlcl9mbGFncy5neXBpCkBAIC0xMjMsMTEgKzEyMyw3IEBACiAgICAgICAnLXN0ZD1jOTknLAogICAgIF0sCiAgICAgJ2NmbGFnc19jYyc6IFsKLSAgICAgICMgTGltaXQgdG8gZ251Kys5OC4gVGhpcyBhbGxvd3MgTGludXggdG8gYmUgYSBjYW5hcnkgYnVpbGQgZm9yIGFueQotICAgICAgIyBDKysxMSBmZWF0dXJlcyB0aGF0IGFyZSBub3Qgc3VwcG9ydGVkIG9uIHNvbWUgcGxhdGZvcm1zJyBjb21waWxlcnMuCi0gICAgICAjIFdlIGRvIGFsbG93IG91cnNlbHZlcyBHTlUgZXh0ZW5zaW9ucywgd2hpY2ggYXJlIGFzc3VtZWQgdG8gZXhpc3QKLSAgICAgICMgYnkgQ2hyb21pdW0gY29kZS4KLSAgICAgICctc3RkPWdudSsrOTgnLAorICAgICAgJy1zdGQ9Z251KysxMScsCiAgICAgXSwKICAgICAndGFyZ2V0X2NvbmRpdGlvbnMnOiBbCiAgICAgICBbJ2NvYmFsdF9jb2RlPT0xJywgewpAQCAtMTQ5LDYgKzE0NSw4IEBACiAgICAgICAgICAgJy1Xbm8tdW51c2VkLXBhcmFtZXRlcicsCiAgICAgICAgICAgIyBEbyBub3Qgd2FybiBmb3IgaW1wbGljaXQgdHlwZSBjb252ZXJzaW9ucyB0aGF0IG1heSBjaGFuZ2UgYSB2YWx1ZS4KICAgICAgICAgICAnLVduby1jb252ZXJzaW9uJywKKyAgICAgICAgICAjIERvIG5vdCB3YXJuIGFib3V0IGFuIGltcGxpY2l0IGV4Y2VwdGlvbiBzcGVjIG1pc21hdGNoLgorICAgICAgICAgICctV25vLWltcGxpY2l0LWV4Y2VwdGlvbi1zcGVjLW1pc21hdGNoJywKICAgICAgICAgXSwKICAgICAgIH1dLAogICAgICAgWyd1c2VfYXNhbj09MScsIHsKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbnBsYi9jb25kaXRpb25fdmFyaWFibGVfd2FpdF90aW1lZF90ZXN0LmNjIGIvc3JjL3N0YXJib2FyZC9ucGxiL2NvbmRpdGlvbl92YXJpYWJsZV93YWl0X3RpbWVkX3Rlc3QuY2MKaW5kZXggNzUwN2E5MS4uODY5OGUzNyAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9ucGxiL2NvbmRpdGlvbl92YXJpYWJsZV93YWl0X3RpbWVkX3Rlc3QuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9ucGxiL2NvbmRpdGlvbl92YXJpYWJsZV93YWl0X3RpbWVkX3Rlc3QuY2MKQEAgLTI4LDYgKzI4LDggQEAKICAgICAgICAgICAgICAgICAgICAgIFRha2VUaGVuU2lnbmFsRW50cnlQb2ludCwgY29udGV4dCk7CiAKICAgY29uc3QgU2JUaW1lIGtEZWxheSA9IGtTYlRpbWVNaWxsaXNlY29uZCAqIDEwOworICAvLyBBbGxvdyBtaWxsaXNlY29uZC1sZXZlbCBwcmVjaXNpb24uCisgIGNvbnN0IFNiVGltZSBrUHJlY2lzaW9uID0ga1NiVGltZU1pbGxpc2Vjb25kOwogCiAgIC8vIFdlIGtub3cgdGhlIHRocmVhZCBoYXNuJ3Qgc2lnbmFsZWQgdGhlIGNvbmRpdGlvbiB2YXJpYWJsZSB5ZXQsIGFuZCB3b24ndAogICAvLyB1bmxlc3Mgd2UgdGVsbCBpdCwgc28gaXQgc2hvdWxkIHdhaXQgYXQgbGVhc3QgdGhlIHdob2xlIGRlbGF5IHRpbWUuCkBAIC0zOCw4ICs0MCw4IEBACiAgICAgICAgICZjb250ZXh0LT5jb25kaXRpb24sICZjb250ZXh0LT5tdXRleCwga0RlbGF5KTsKICAgICBFWFBFQ1RfRVEoa1NiQ29uZGl0aW9uVmFyaWFibGVUaW1lZE91dCwgcmVzdWx0KTsKICAgICBTYlRpbWVNb25vdG9uaWMgZWxhcHNlZCA9IFNiVGltZUdldE1vbm90b25pY05vdygpIC0gc3RhcnQ7Ci0gICAgRVhQRUNUX0xFKGtEZWxheSwgZWxhcHNlZCk7Ci0gICAgRVhQRUNUX0dUKGtEZWxheSAqIDIsIGVsYXBzZWQpOworICAgIEVYUEVDVF9MRShrRGVsYXksIGVsYXBzZWQgKyBrUHJlY2lzaW9uKTsKKyAgICBFWFBFQ1RfR1Qoa0RlbGF5ICogMiwgZWxhcHNlZCAtIGtQcmVjaXNpb24pOwogICAgIEVYUEVDVF9UUlVFKFNiTXV0ZXhSZWxlYXNlKCZjb250ZXh0LT5tdXRleCkpOwogICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbnBsYi9jcnlwdG9ncmFwaHlfdHJhbnNmb3JtX2djbV90ZXN0LmNjIGIvc3JjL3N0YXJib2FyZC9ucGxiL2NyeXB0b2dyYXBoeV90cmFuc2Zvcm1fZ2NtX3Rlc3QuY2MKaW5kZXggODE5YjYzZC4uZDI2NzRhNCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9ucGxiL2NyeXB0b2dyYXBoeV90cmFuc2Zvcm1fZ2NtX3Rlc3QuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9ucGxiL2NyeXB0b2dyYXBoeV90cmFuc2Zvcm1fZ2NtX3Rlc3QuY2MKQEAgLTMxMCw3ICszMTAsNyBAQAogICB9CiAKICAgKm91dCA9IGJ1Zi5QYXNzKCk7Ci0gICpvdXRfbGVuID0gbGVuIC8gMjsKKyAgKm91dF9sZW4gPSBzdGF0aWNfY2FzdDxpbnQ+KGxlbiAvIDIpOwogfQogCiBzdGQ6OnN0cmluZyBoZXhkdW1wKGNvbnN0IHZvaWQgKmluLCBpbnQgbGVuKSB7CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL25wbGIvY3J5cHRvZ3JhcGh5X3RyYW5zZm9ybV90ZXN0LmNjIGIvc3JjL3N0YXJib2FyZC9ucGxiL2NyeXB0b2dyYXBoeV90cmFuc2Zvcm1fdGVzdC5jYwppbmRleCBhZTkxNmE3Li5mYzQ0MTI2IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL25wbGIvY3J5cHRvZ3JhcGh5X3RyYW5zZm9ybV90ZXN0LmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvbnBsYi9jcnlwdG9ncmFwaHlfdHJhbnNmb3JtX3Rlc3QuY2MKQEAgLTQ1LDggKzQ1LDggQEAKICAgICByZXR1cm47CiAgIH0KIAotICBjb25zdCBpbnQga0lucHV0U2l6ZSA9IFNiU3RyaW5nR2V0TGVuZ3RoKGtDbGVhclRleHQpOwotICBjb25zdCBpbnQga0J1ZmZlclNpemUgPSBzaXplb2Yoa0NsZWFyVGV4dCk7CisgIGNvbnN0IGludCBrSW5wdXRTaXplID0gc3RhdGljX2Nhc3Q8aW50PihTYlN0cmluZ0dldExlbmd0aChrQ2xlYXJUZXh0KSk7CisgIGNvbnN0IGludCBrQnVmZmVyU2l6ZSA9IHN0YXRpY19jYXN0PGludD4oc2l6ZW9mKGtDbGVhclRleHQpKTsKICAgY2hhciogY2lwaGVyX3RleHQgPSBuZXcgY2hhcltrQnVmZmVyU2l6ZV07CiAgIFNiTWVtb3J5U2V0KGNpcGhlcl90ZXh0LCAwLCBrQnVmZmVyU2l6ZSk7CiAgIGludCBjb3VudCA9IFNiQ3J5cHRvZ3JhcGh5VHJhbnNmb3JtKHRyYW5zZm9ybWVyLCBrQ2xlYXJUZXh0LCBrSW5wdXRTaXplLApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9ucGxiL2RpcmVjdG9yeV9jcmVhdGVfdGVzdC5jYyBiL3NyYy9zdGFyYm9hcmQvbnBsYi9kaXJlY3RvcnlfY3JlYXRlX3Rlc3QuY2MKaW5kZXggMmI4ZmIyMS4uNzM4YmFlOSAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9ucGxiL2RpcmVjdG9yeV9jcmVhdGVfdGVzdC5jYworKysgYi9zcmMvc3RhcmJvYXJkL25wbGIvZGlyZWN0b3J5X2NyZWF0ZV90ZXN0LmNjCkBAIC01NSwxNSArNTUsMzAgQEAKICAgRVhQRUNUX1RSVUUoU2JEaXJlY3RvcnlDYW5PcGVuKHBhdGguY19zdHIoKSkpOwogfQogCi1URVNUKFNiRGlyZWN0b3J5Q3JlYXRlVGVzdCwgU3VubnlEYXlSb290KSB7Ci0gIGNvbnN0IGNoYXIqIGtSb290UGF0aCA9IFNCX0ZJTEVfU0VQX1NUUklORzsKLSAgRVhQRUNUX1RSVUUoU2JEaXJlY3RvcnlDYW5PcGVuKGtSb290UGF0aCkpOwotICBFWFBFQ1RfVFJVRShTYkRpcmVjdG9yeUNyZWF0ZShrUm9vdFBhdGgpKTsKLSAgRVhQRUNUX1RSVUUoU2JEaXJlY3RvcnlDYW5PcGVuKGtSb290UGF0aCkpOworVEVTVChTYkRpcmVjdG9yeUNyZWF0ZVRlc3QsIFN1bm55RGF5VGVtcERpcmVjdG9yeSkgeworICBjb25zdCBpbnQga01heEZpbGVQYXRoID0gU0JfRklMRV9NQVhfUEFUSDsKKyAgY2hhciB0ZW1wX3BhdGhba01heEZpbGVQYXRoXTsKKyAgYm9vbCBzeXN0ZW1fcGF0aF9zdWNjZXNzID0KKyAgICAgIFNiU3lzdGVtR2V0UGF0aChrU2JTeXN0ZW1QYXRoVGVtcERpcmVjdG9yeSwgdGVtcF9wYXRoLCBrTWF4RmlsZVBhdGgpOworICBBU1NFUlRfVFJVRShzeXN0ZW1fcGF0aF9zdWNjZXNzKTsKKyAgRVhQRUNUX1RSVUUoU2JEaXJlY3RvcnlDYW5PcGVuKHRlbXBfcGF0aCkpOworICBFWFBFQ1RfVFJVRShTYkRpcmVjdG9yeUNyZWF0ZSh0ZW1wX3BhdGgpKTsKKyAgRVhQRUNUX1RSVUUoU2JEaXJlY3RvcnlDYW5PcGVuKHRlbXBfcGF0aCkpOworfQogCi0gIEVYUEVDVF9UUlVFKFNiRGlyZWN0b3J5Q2FuT3BlbihrTWFueUZpbGVTZXBhcmF0b3JzKSk7Ci0gIEVYUEVDVF9UUlVFKFNiRGlyZWN0b3J5Q3JlYXRlKGtNYW55RmlsZVNlcGFyYXRvcnMpKTsKLSAgRVhQRUNUX1RSVUUoU2JEaXJlY3RvcnlDYW5PcGVuKGtNYW55RmlsZVNlcGFyYXRvcnMpKTsKK1RFU1QoU2JEaXJlY3RvcnlDcmVhdGVUZXN0LCBTdW5ueURheVRlbXBEaXJlY3RvcnlNYW55U2VwYXJhdG9ycykgeworICBjb25zdCBpbnQga01heEZpbGVQYXRoID0gU0JfRklMRV9NQVhfUEFUSDsKKyAgY2hhciB0ZW1wX3BhdGhba01heEZpbGVQYXRoXTsKKyAgYm9vbCBzeXN0ZW1fcGF0aF9zdWNjZXNzID0KKyAgICAgIFNiU3lzdGVtR2V0UGF0aChrU2JTeXN0ZW1QYXRoVGVtcERpcmVjdG9yeSwgdGVtcF9wYXRoLCBrTWF4RmlsZVBhdGgpOworICBBU1NFUlRfVFJVRShzeXN0ZW1fcGF0aF9zdWNjZXNzKTsKKyAgY29uc3QgaW50IG5ld19zaXplID0KKyAgICAgIFNiU3RyaW5nQ29uY2F0KHRlbXBfcGF0aCwga01hbnlGaWxlU2VwYXJhdG9ycywga01heEZpbGVQYXRoKTsKKyAgQVNTRVJUX0xUKG5ld19zaXplLCBrTWF4RmlsZVBhdGgpOworCisgIEVYUEVDVF9UUlVFKFNiRGlyZWN0b3J5Q2FuT3Blbih0ZW1wX3BhdGgpKTsKKyAgRVhQRUNUX1RSVUUoU2JEaXJlY3RvcnlDcmVhdGUodGVtcF9wYXRoKSk7CisgIEVYUEVDVF9UUlVFKFNiRGlyZWN0b3J5Q2FuT3Blbih0ZW1wX3BhdGgpKTsKIH0KIAogVEVTVChTYkRpcmVjdG9yeUNyZWF0ZVRlc3QsIEZhaWx1cmVOdWxsUGF0aCkgewpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9ucGxiL2RpcmVjdG9yeV9vcGVuX3Rlc3QuY2MgYi9zcmMvc3RhcmJvYXJkL25wbGIvZGlyZWN0b3J5X29wZW5fdGVzdC5jYwppbmRleCA4ZWZmOThmLi5mMzdkZDljIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL25wbGIvZGlyZWN0b3J5X29wZW5fdGVzdC5jYworKysgYi9zcmMvc3RhcmJvYXJkL25wbGIvZGlyZWN0b3J5X29wZW5fdGVzdC5jYwpAQCAtNzIsNyArNzIsNyBAQAogICBFWFBFQ1RfVFJVRShTYkZpbGVFeGlzdHMocGF0aC5jX3N0cigpKSk7CiAKICAgLy8gRnVubnkgd2F5IHRvIG1ha2Ugc3VyZSB0aGUgZGlyZWN0b3J5IHNlZW1zIHZhbGlkIGJ1dCBkb2Vzbid0IGV4aXN0LgotICBpbnQgbGVuID0gcGF0aC5sZW5ndGgoKTsKKyAgaW50IGxlbiA9IHN0YXRpY19jYXN0PGludD4ocGF0aC5sZW5ndGgoKSk7CiAgIGlmIChwYXRoW2xlbiAtIDFdICE9ICd6JykgewogICAgIHBhdGhbbGVuIC0gMV0gPSAneic7CiAgIH0gZWxzZSB7CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL25wbGIvZmlsZV9yZWFkX3Rlc3QuY2MgYi9zcmMvc3RhcmJvYXJkL25wbGIvZmlsZV9yZWFkX3Rlc3QuY2MKaW5kZXggYTRjODI4ZC4uMjNjMTJmNSAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9ucGxiL2ZpbGVfcmVhZF90ZXN0LmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvbnBsYi9maWxlX3JlYWRfdGVzdC5jYwpAQCAtMTQwLDcgKzE0MCw3IEBACiAgIH0KIAogICAvLyBSZWFkIG9mZiB0aGUgZW5kIG9mIHRoZSBmaWxlLgotICBpbnQgcG9zaXRpb24gPSBTYkZpbGVTZWVrKGZpbGUsIGtTYkZpbGVGcm9tRW5kLCAwKTsKKyAgaW50IHBvc2l0aW9uID0gc3RhdGljX2Nhc3Q8aW50PihTYkZpbGVTZWVrKGZpbGUsIGtTYkZpbGVGcm9tRW5kLCAwKSk7CiAgIEVYUEVDVF9FUShrRmlsZVNpemUsIHBvc2l0aW9uKTsKICAgaW50IGJ5dGVzX3JlYWQgPSBUeXBlUGFyYW06OlJlYWQoZmlsZSwgYnVmZmVyLCBrQnVmZmVyTGVuZ3RoKTsKICAgRVhQRUNUX0VRKDAsIGJ5dGVzX3JlYWQpOwpAQCAtMjEwLDcgKzIxMCw4IEBACiAgIH0KIAogICAvLyBSZWFkIGZyb20gdGhlIG1pZGRsZSBvZiB0aGUgZmlsZS4KLSAgaW50IHBvc2l0aW9uID0gU2JGaWxlU2VlayhmaWxlLCBrU2JGaWxlRnJvbUJlZ2luLCBrRmlsZVNpemUgLyA0KTsKKyAgaW50IHBvc2l0aW9uID0KKyAgICAgIHN0YXRpY19jYXN0PGludD4oU2JGaWxlU2VlayhmaWxlLCBrU2JGaWxlRnJvbUJlZ2luLCBrRmlsZVNpemUgLyA0KSk7CiAgIEVYUEVDVF9FUShrRmlsZVNpemUgLyA0LCBwb3NpdGlvbik7CiAgIGludCBieXRlc19yZWFkID0gVHlwZVBhcmFtOjpSZWFkKGZpbGUsIGJ1ZmZlciwga0J1ZmZlckxlbmd0aCk7CiAgIEVYUEVDVF9HRShrQnVmZmVyTGVuZ3RoLCBieXRlc19yZWFkKTsKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbnBsYi9maWxlX3NlZWtfdGVzdC5jYyBiL3NyYy9zdGFyYm9hcmQvbnBsYi9maWxlX3NlZWtfdGVzdC5jYwppbmRleCAwZGViZTAyLi5mOGY0MWFhIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL25wbGIvZmlsZV9zZWVrX3Rlc3QuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9ucGxiL2ZpbGVfc2Vla190ZXN0LmNjCkBAIC0yMywxNiArMjMsMTggQEAKIG5hbWVzcGFjZSB7CiAKIFRFU1QoU2JGaWxlU2Vla1Rlc3QsIEludmFsaWRGaWxlRXJyb3JzKSB7Ci0gIGludCByZXN1bHQgPSBTYkZpbGVTZWVrKGtTYkZpbGVJbnZhbGlkLCBrU2JGaWxlRnJvbUJlZ2luLCA1MCk7CisgIGludCByZXN1bHQgPQorICAgICAgc3RhdGljX2Nhc3Q8aW50PihTYkZpbGVTZWVrKGtTYkZpbGVJbnZhbGlkLCBrU2JGaWxlRnJvbUJlZ2luLCA1MCkpOwogICBFWFBFQ1RfRVEoLTEsIHJlc3VsdCk7CiAKLSAgcmVzdWx0ID0gU2JGaWxlU2VlayhrU2JGaWxlSW52YWxpZCwga1NiRmlsZUZyb21FbmQsIC01MCk7CisgIHJlc3VsdCA9IHN0YXRpY19jYXN0PGludD4oU2JGaWxlU2VlayhrU2JGaWxlSW52YWxpZCwga1NiRmlsZUZyb21FbmQsIC01MCkpOwogICBFWFBFQ1RfRVEoLTEsIHJlc3VsdCk7CiAKLSAgcmVzdWx0ID0gU2JGaWxlU2VlayhrU2JGaWxlSW52YWxpZCwga1NiRmlsZUZyb21DdXJyZW50LCAtNTApOworICByZXN1bHQgPQorICAgICAgc3RhdGljX2Nhc3Q8aW50PihTYkZpbGVTZWVrKGtTYkZpbGVJbnZhbGlkLCBrU2JGaWxlRnJvbUN1cnJlbnQsIC01MCkpOwogICBFWFBFQ1RfRVEoLTEsIHJlc3VsdCk7CiAKLSAgcmVzdWx0ID0gU2JGaWxlU2VlayhrU2JGaWxlSW52YWxpZCwga1NiRmlsZUZyb21DdXJyZW50LCA1MCk7CisgIHJlc3VsdCA9IHN0YXRpY19jYXN0PGludD4oU2JGaWxlU2VlayhrU2JGaWxlSW52YWxpZCwga1NiRmlsZUZyb21DdXJyZW50LCA1MCkpOwogICBFWFBFQ1RfRVEoLTEsIHJlc3VsdCk7CiB9CiAKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbnBsYi9maWxlX3RydW5jYXRlX3Rlc3QuY2MgYi9zcmMvc3RhcmJvYXJkL25wbGIvZmlsZV90cnVuY2F0ZV90ZXN0LmNjCmluZGV4IGM0ZDdhMDYuLmMyMWNhZDUgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvbnBsYi9maWxlX3RydW5jYXRlX3Rlc3QuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9ucGxiL2ZpbGVfdHJ1bmNhdGVfdGVzdC5jYwpAQCAtODIsMTMgKzgyLDEzIEBACiAgICAgRVhQRUNUX0VRKGtTdGFydFNpemUsIGluZm8uc2l6ZSk7CiAgIH0KIAotICBpbnQgcG9zaXRpb24gPSBTYkZpbGVTZWVrKGZpbGUsIGtTYkZpbGVGcm9tQ3VycmVudCwgMCk7CisgIGludCBwb3NpdGlvbiA9IHN0YXRpY19jYXN0PGludD4oU2JGaWxlU2VlayhmaWxlLCBrU2JGaWxlRnJvbUN1cnJlbnQsIDApKTsKICAgRVhQRUNUX0VRKDAsIHBvc2l0aW9uKTsKIAogICBib29sIHJlc3VsdCA9IFNiRmlsZVRydW5jYXRlKGZpbGUsIGtFbmRTaXplKTsKICAgRVhQRUNUX1RSVUUocmVzdWx0KTsKIAotICBwb3NpdGlvbiA9IFNiRmlsZVNlZWsoZmlsZSwga1NiRmlsZUZyb21DdXJyZW50LCAwKTsKKyAgcG9zaXRpb24gPSBzdGF0aWNfY2FzdDxpbnQ+KFNiRmlsZVNlZWsoZmlsZSwga1NiRmlsZUZyb21DdXJyZW50LCAwKSk7CiAgIEVYUEVDVF9FUSgwLCBwb3NpdGlvbik7CiAKICAgewpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9ucGxiL2ZpbGVfd3JpdGVfdGVzdC5jYyBiL3NyYy9zdGFyYm9hcmQvbnBsYi9maWxlX3dyaXRlX3Rlc3QuY2MKaW5kZXggZTUwM2E4Ni4uMWIzZWVmYyAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9ucGxiL2ZpbGVfd3JpdGVfdGVzdC5jYworKysgYi9zcmMvc3RhcmJvYXJkL25wbGIvZmlsZV93cml0ZV90ZXN0LmNjCkBAIC0xMDAsNyArMTAwLDcgQEAKICAgLy8gVGVzdHMgcmVhZGluZyBhbmQgd3JpdGluZyBmcm9tIHNhbWUgb3BlbmVkIGZpbGUuCiAgIGJvb2wgcmVzdWx0ID0gU2JGaWxlRmx1c2goZmlsZSk7CiAgIEFTU0VSVF9UUlVFKHJlc3VsdCk7Ci0gIGludCBwb3NpdGlvbiA9IFNiRmlsZVNlZWsoZmlsZSwga1NiRmlsZUZyb21CZWdpbiwgMCk7CisgIGludCBwb3NpdGlvbiA9IHN0YXRpY19jYXN0PGludD4oU2JGaWxlU2VlayhmaWxlLCBrU2JGaWxlRnJvbUJlZ2luLCAwKSk7CiAgIEFTU0VSVF9FUSgwLCBwb3NpdGlvbik7CiAKICAgLy8gUmVhZCBhbmQgY2hlY2sgdGhlIHdob2xlIGZpbGUuCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL25wbGIvcndsb2NrX3Rlc3QuY2MgYi9zcmMvc3RhcmJvYXJkL25wbGIvcndsb2NrX3Rlc3QuY2MKaW5kZXggYjMxZGYwNS4uNmVmMjRmZCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9ucGxiL3J3bG9ja190ZXN0LmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvbnBsYi9yd2xvY2tfdGVzdC5jYwpAQCAtMTk5LDcgKzE5OSw3IEBACiAgIFRocmVhZFJXTG9ja1N0cmVzc1Rlc3Q6OlNoYXJlZERhdGEgc2hhcmVkX2RhdGE7CiAgIHN0ZDo6dmVjdG9yPEFic3RyYWN0VGVzdFRocmVhZCo+IHRocmVhZHM7CiAKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBOVU1fU1RSRVNTX1RIUkVBRFM7ICsraSkgeworICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9TVFJFU1NfVEhSRUFEUzsgKytpKSB7CiAgICAgaW50MzJfdCBzdGFydF92YWx1ZSA9IGkgKiBrTnVtVmFsdWVzRWFjaFRocmVhZDsKICAgICBpbnQzMl90IGVuZF92YWx1ZSA9IChpICsgMSkgKiBrTnVtVmFsdWVzRWFjaFRocmVhZDsKICAgICBUaHJlYWRSV0xvY2tTdHJlc3NUZXN0KiB0aHJlYWQgPQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9ucGxiL3NlbWFwaG9yZV90ZXN0LmNjIGIvc3JjL3N0YXJib2FyZC9ucGxiL3NlbWFwaG9yZV90ZXN0LmNjCmluZGV4IDA1ZGUzNjQuLmU4MWI3NjIgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvbnBsYi9zZW1hcGhvcmVfdGVzdC5jYworKysgYi9zcmMvc3RhcmJvYXJkL25wbGIvc2VtYXBob3JlX3Rlc3QuY2MKQEAgLTkwLDkgKzkwLDggQEAKICAgdGhyZWFkLkpvaW4oKTsKIAogICBFWFBFQ1RfVFJVRSh0aHJlYWQucmVzdWx0X3NpZ25hbGVkXyk7Ci0gIEVYUEVDVF9ORUFSKHRocmVhZC5yZXN1bHRfd2FpdF90aW1lXywKLSAgICAgICAgICAgICAgd2FpdF90aW1lIC8gMiwKLSAgICAgICAgICAgICAga1NiVGltZU1pbGxpc2Vjb25kICogMTApOyAgLy8gRXJyb3IgdGhyZXNob2xkCisgIEVYUEVDVF9ORUFSKHRocmVhZC5yZXN1bHRfd2FpdF90aW1lXyAqIDEuMCwgd2FpdF90aW1lICogMC41LAorICAgICAgICAgICAgICBrU2JUaW1lTWlsbGlzZWNvbmQgKiAxMC4wKTsgIC8vIEVycm9yIHRocmVzaG9sZAogfQogCiBkb3VibGUgSXNEb3VibGVOZWFyKGRvdWJsZSBmaXJzdCwgZG91YmxlIHNlY29uZCwgZG91YmxlIGRpZmZfdGhyZXNob2xkKSB7CkBAIC0xMjAsNyArMTE5LDggQEAKICAgICB0aHJlYWQuSm9pbigpOwogICAgIEVYUEVDVF9GQUxTRSh0aHJlYWQucmVzdWx0X3NpZ25hbGVkXyk7CiAKLSAgICBpZiAoSXNEb3VibGVOZWFyKHdhaXRfdGltZSwgdGhyZWFkLnJlc3VsdF93YWl0X3RpbWVfLCBrVGltZVRocmVzaG9sZCkpIHsKKyAgICBpZiAoSXNEb3VibGVOZWFyKDEuMCAqIHdhaXRfdGltZSwgMS4wICogdGhyZWFkLnJlc3VsdF93YWl0X3RpbWVfLAorICAgICAgICAgICAgICAgICAgICAga1RpbWVUaHJlc2hvbGQgKiAxLjApKSB7CiAgICAgICByZXR1cm47ICAvLyBUZXN0IHBhc3NlZC4KICAgICB9CiAgIH0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbnBsYi9zdHJpbmdfY29uY2F0X3Rlc3QuY2MgYi9zcmMvc3RhcmJvYXJkL25wbGIvc3RyaW5nX2NvbmNhdF90ZXN0LmNjCmluZGV4IDE1ODM5MGMuLjBlM2FmOWEgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvbnBsYi9zdHJpbmdfY29uY2F0X3Rlc3QuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9ucGxiL3N0cmluZ19jb25jYXRfdGVzdC5jYwpAQCAtMjQsOCArMjQsOCBAQAogCiB2b2lkIFRlc3RDb25jYXQoY29uc3QgY2hhciogaW5pdGlhbCwgY29uc3QgY2hhciogc291cmNlLCBib29sIGlzX3Nob3J0KSB7CiAgIGNvbnN0IGludCBrRGVzdGluYXRpb25PZmZzZXQgPSAxNjsKLSAgaW50IGluaXRpYWxfbGVuZ3RoID0gU2JTdHJpbmdHZXRMZW5ndGgoaW5pdGlhbCk7Ci0gIGludCBzb3VyY2VfbGVuZ3RoID0gU2JTdHJpbmdHZXRMZW5ndGgoc291cmNlKTsKKyAgaW50IGluaXRpYWxfbGVuZ3RoID0gc3RhdGljX2Nhc3Q8aW50PihTYlN0cmluZ0dldExlbmd0aChpbml0aWFsKSk7CisgIGludCBzb3VyY2VfbGVuZ3RoID0gc3RhdGljX2Nhc3Q8aW50PihTYlN0cmluZ0dldExlbmd0aChzb3VyY2UpKTsKICAgaW50IGRlc3RpbmF0aW9uX3NpemUgPQogICAgICAgaW5pdGlhbF9sZW5ndGggKyBzb3VyY2VfbGVuZ3RoICsga0Rlc3RpbmF0aW9uT2Zmc2V0ICogMjsKICAgaW50IGRlc3RpbmF0aW9uX2xpbWl0ID0gaW5pdGlhbF9sZW5ndGggKyBzb3VyY2VfbGVuZ3RoICsgMTsKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbnBsYi9zdHJpbmdfY29uY2F0X3dpZGVfdGVzdC5jYyBiL3NyYy9zdGFyYm9hcmQvbnBsYi9zdHJpbmdfY29uY2F0X3dpZGVfdGVzdC5jYwppbmRleCBmNDM2N2Q3Li45NzEzNDExIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL25wbGIvc3RyaW5nX2NvbmNhdF93aWRlX3Rlc3QuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9ucGxiL3N0cmluZ19jb25jYXRfd2lkZV90ZXN0LmNjCkBAIC0yMiw4ICsyMiw4IEBACiAKIHZvaWQgVGVzdENvbmNhdChjb25zdCB3Y2hhcl90KiBpbml0aWFsLCBjb25zdCB3Y2hhcl90KiBzb3VyY2UsIGJvb2wgaXNfc2hvcnQpIHsKICAgY29uc3QgaW50IGtEZXN0aW5hdGlvbk9mZnNldCA9IDE2OwotICBpbnQgaW5pdGlhbF9sZW5ndGggPSBTYlN0cmluZ0dldExlbmd0aFdpZGUoaW5pdGlhbCk7Ci0gIGludCBzb3VyY2VfbGVuZ3RoID0gU2JTdHJpbmdHZXRMZW5ndGhXaWRlKHNvdXJjZSk7CisgIGludCBpbml0aWFsX2xlbmd0aCA9IHN0YXRpY19jYXN0PGludD4oU2JTdHJpbmdHZXRMZW5ndGhXaWRlKGluaXRpYWwpKTsKKyAgaW50IHNvdXJjZV9sZW5ndGggPSBzdGF0aWNfY2FzdDxpbnQ+KFNiU3RyaW5nR2V0TGVuZ3RoV2lkZShzb3VyY2UpKTsKICAgaW50IGRlc3RpbmF0aW9uX3NpemUgPQogICAgICAgaW5pdGlhbF9sZW5ndGggKyBzb3VyY2VfbGVuZ3RoICsga0Rlc3RpbmF0aW9uT2Zmc2V0ICogMjsKICAgaW50IGRlc3RpbmF0aW9uX2xpbWl0ID0gaW5pdGlhbF9sZW5ndGggKyBzb3VyY2VfbGVuZ3RoICsgMTsKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbnBsYi9zdHJpbmdfY29weV90ZXN0LmNjIGIvc3JjL3N0YXJib2FyZC9ucGxiL3N0cmluZ19jb3B5X3Rlc3QuY2MKaW5kZXggMDBlOGU4My4uMGZlNmQ5ZiAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9ucGxiL3N0cmluZ19jb3B5X3Rlc3QuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9ucGxiL3N0cmluZ19jb3B5X3Rlc3QuY2MKQEAgLTIzLDcgKzIzLDcgQEAKIAogdm9pZCBUZXN0Q29weShjb25zdCBjaGFyKiBzb3VyY2UsIGJvb2wgaXNfc2hvcnQpIHsKICAgY29uc3QgaW50IGtEZXN0aW5hdGlvbk9mZnNldCA9IDE2OwotICBpbnQgc291cmNlX2xlbmd0aCA9IFNiU3RyaW5nR2V0TGVuZ3RoKHNvdXJjZSk7CisgIGludCBzb3VyY2VfbGVuZ3RoID0gc3RhdGljX2Nhc3Q8aW50PihTYlN0cmluZ0dldExlbmd0aChzb3VyY2UpKTsKICAgaW50IGRlc3RpbmF0aW9uX3NpemUgPSBzb3VyY2VfbGVuZ3RoICsga0Rlc3RpbmF0aW9uT2Zmc2V0ICogMjsKICAgaW50IGRlc3RpbmF0aW9uX2xpbWl0ID0gc291cmNlX2xlbmd0aCArIDE7CiAgIGlmIChpc19zaG9ydCkgewpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9ucGxiL3N0cmluZ19jb3B5X3dpZGVfdGVzdC5jYyBiL3NyYy9zdGFyYm9hcmQvbnBsYi9zdHJpbmdfY29weV93aWRlX3Rlc3QuY2MKaW5kZXggMGE5OGQ3NS4uOWE2ODJiNSAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9ucGxiL3N0cmluZ19jb3B5X3dpZGVfdGVzdC5jYworKysgYi9zcmMvc3RhcmJvYXJkL25wbGIvc3RyaW5nX2NvcHlfd2lkZV90ZXN0LmNjCkBAIC0yMSw3ICsyMSw3IEBACiAKIHZvaWQgVGVzdENvcHkoY29uc3Qgd2NoYXJfdCogc291cmNlLCBib29sIGlzX3Nob3J0KSB7CiAgIGNvbnN0IGludCBrRGVzdGluYXRpb25PZmZzZXQgPSAxNjsKLSAgaW50IHNvdXJjZV9sZW5ndGggPSBTYlN0cmluZ0dldExlbmd0aFdpZGUoc291cmNlKTsKKyAgaW50IHNvdXJjZV9sZW5ndGggPSBzdGF0aWNfY2FzdDxpbnQ+KFNiU3RyaW5nR2V0TGVuZ3RoV2lkZShzb3VyY2UpKTsKICAgaW50IGRlc3RpbmF0aW9uX3NpemUgPSBzb3VyY2VfbGVuZ3RoICsga0Rlc3RpbmF0aW9uT2Zmc2V0ICogMjsKICAgaW50IGRlc3RpbmF0aW9uX2xpbWl0ID0gc291cmNlX2xlbmd0aCArIDE7CiAgIGlmIChpc19zaG9ydCkgewpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9ucGxiL3N5c3RlbV9nZXRfcGF0aF90ZXN0LmNjIGIvc3JjL3N0YXJib2FyZC9ucGxiL3N5c3RlbV9nZXRfcGF0aF90ZXN0LmNjCmluZGV4IDJlOWRkZjAuLmVhMzYwMzUgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvbnBsYi9zeXN0ZW1fZ2V0X3BhdGhfdGVzdC5jYworKysgYi9zcmMvc3RhcmJvYXJkL25wbGIvc3lzdGVtX2dldF9wYXRoX3Rlc3QuY2MKQEAgLTM3LDcgKzM3LDcgQEAKICAgfQogICBpZiAocmVzdWx0KSB7CiAgICAgRVhQRUNUX05FKCdceENEJywgcGF0aFswXSkgPDwgTE9DQUxfQ09OVEVYVDsKLSAgICBpbnQgbGVuID0gc3RybGVuKHBhdGgpOworICAgIGludCBsZW4gPSBzdGF0aWNfY2FzdDxpbnQ+KHN0cmxlbihwYXRoKSk7CiAgICAgRVhQRUNUX0dUKGxlbiwgMCkgPDwgTE9DQUxfQ09OVEVYVDsKICAgfSBlbHNlIHsKICAgICBFWFBFQ1RfRVEoJ1x4Q0QnLCBwYXRoWzBdKSA8PCBMT0NBTF9DT05URVhUOwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9ucGxiL3N5c3RlbV9nZXRfcHJvcGVydHlfdGVzdC5jYyBiL3NyYy9zdGFyYm9hcmQvbnBsYi9zeXN0ZW1fZ2V0X3Byb3BlcnR5X3Rlc3QuY2MKaW5kZXggZWY0MDc4Zi4uZTI3YjJjZSAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9ucGxiL3N5c3RlbV9nZXRfcHJvcGVydHlfdGVzdC5jYworKysgYi9zcmMvc3RhcmJvYXJkL25wbGIvc3lzdGVtX2dldF9wcm9wZXJ0eV90ZXN0LmNjCkBAIC01NCw3ICs1NCw3IEBACiAgIH0KICAgaWYgKHJlc3VsdCkgewogICAgIEVYUEVDVF9ORSgnXHhDRCcsIHZhbHVlWzBdKSA8PCBMT0NBTF9DT05URVhUOwotICAgIGludCBsZW4gPSBTYlN0cmluZ0dldExlbmd0aCh2YWx1ZSk7CisgICAgaW50IGxlbiA9IHN0YXRpY19jYXN0PGludD4oU2JTdHJpbmdHZXRMZW5ndGgodmFsdWUpKTsKICAgICBFWFBFQ1RfR1QobGVuLCAwKSA8PCBMT0NBTF9DT05URVhUOwogICB9IGVsc2UgewogICAgIEVYUEVDVF9FUSgnXHhDRCcsIHZhbHVlWzBdKSA8PCBMT0NBTF9DT05URVhUOwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9ucGxiL3RocmVhZF9nZXRfaWRfdGVzdC5jYyBiL3NyYy9zdGFyYm9hcmQvbnBsYi90aHJlYWRfZ2V0X2lkX3Rlc3QuY2MKaW5kZXggNGVjZjQ0OC4uYTJlZjdkOCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9ucGxiL3RocmVhZF9nZXRfaWRfdGVzdC5jYworKysgYi9zcmMvc3RhcmJvYXJkL25wbGIvdGhyZWFkX2dldF9pZF90ZXN0LmNjCkBAIC00Niw3ICs0Niw3IEBACiAgIGZvciAoaW50IGkgPSAwOyBpIDwga1RocmVhZHM7ICsraSkgewogICAgIHZvaWQqIHJlc3VsdCA9IE5VTEw7CiAgICAgRVhQRUNUX1RSVUUoU2JUaHJlYWRKb2luKHRocmVhZHNbaV0sICZyZXN1bHQpKTsKLSAgICBTYlRocmVhZElkIGlkID0gbnBsYjo6RnJvbVZvaWQocmVzdWx0KTsKKyAgICBTYlRocmVhZElkIGlkID0gc3RhdGljX2Nhc3Q8U2JUaHJlYWRJZD4obnBsYjo6RnJvbVZvaWQocmVzdWx0KSk7CiAgICAgRVhQRUNUX05FKGlkLCBTYlRocmVhZEdldElkKCkpOwogICAgIHRocmVhZF9pZHNbaV0gPSBpZDsKICAgfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9ucGxiL3RocmVhZF9zbGVlcF90ZXN0LmNjIGIvc3JjL3N0YXJib2FyZC9ucGxiL3RocmVhZF9zbGVlcF90ZXN0LmNjCmluZGV4IDYyNmYxODUuLjBiZWJkYjkgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvbnBsYi90aHJlYWRfc2xlZXBfdGVzdC5jYworKysgYi9zcmMvc3RhcmJvYXJkL25wbGIvdGhyZWFkX3NsZWVwX3Rlc3QuY2MKQEAgLTIwLDYgKzIwLDkgQEAKIG5hbWVzcGFjZSBucGxiIHsKIG5hbWVzcGFjZSB7CiAKKy8vIEFsbG93IG1pbGxpc2Vjb25kLWxldmVsIHByZWNpc2lvbi4KK2NvbnN0IFNiVGltZSBrUHJlY2lzaW9uID0ga1NiVGltZU1pbGxpc2Vjb25kOworCiBURVNUKFNiVGhyZWFkU2xlZXBUZXN0LCBTdW5ueURheSkgewogICBTYlRocmVhZFNsZWVwKDApOwogICAvLyBXZWxsLCBteSB3b3JrIGhlcmUgaXMgZG9uZS4KQEAgLTMwLDEzICszMywxNSBAQAogLy8gdGhlIHRocmVhZCBjYW4gd2FrZSB1cCwgc29tZXRoaW5nIEkgY29tcGxldGVseSBzeW1wYXRoaXplIHdpdGguCiBURVNUKFNiVGhyZWFkU2xlZXBUZXN0LCBTdW5ueURheUF0TGVhc3REZWxheSkgewogICBjb25zdCBpbnQga1RyaWFscyA9IDEyOworICBjb25zdCBpbnQ2NF90IG9uZSA9IDE7CiAgIGZvciAoaW50IHRyaWFsID0gMDsgdHJpYWwgPCBrVHJpYWxzOyArK3RyaWFsKSB7CiAgICAgLy8gVGhpcyB0ZXN0cyBzZXZlcmFsIGRlbGF5cywgYmV0d2VlbiBhYm91dCAxNSB0byBhYm91dCA0IG1pbGxpc2Vjb25kcy4KLSAgICBjb25zdCBTYlRpbWUga0RlbGF5ID0ga1NiVGltZVNlY29uZCAvICgxIDw8ICgodHJpYWwgJSAzKSArIDYpKTsKKyAgICBjb25zdCBTYlRpbWUga0RlbGF5ID0ga1NiVGltZVNlY29uZCAvIChvbmUgPDwgKCh0cmlhbCAlIDMpICsgNikpOwogICAgIFNiVGltZU1vbm90b25pYyBzdGFydCA9IFNiVGltZUdldE1vbm90b25pY05vdygpOwogICAgIFNiVGhyZWFkU2xlZXAoa0RlbGF5KTsKLSAgICBFWFBFQ1RfTEUoc3RhcnQgKyBrRGVsYXksIFNiVGltZUdldE1vbm90b25pY05vdygpKSA8PCAiVHJpYWwgIiA8PCB0cmlhbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIGtEZWxheT0iIDw8IGtEZWxheTsKKyAgICBTYlRpbWVNb25vdG9uaWMgZW5kID0gU2JUaW1lR2V0TW9ub3RvbmljTm93KCk7CisgICAgRVhQRUNUX0xFKHN0YXJ0ICsga0RlbGF5LCBlbmQgKyBrUHJlY2lzaW9uKSA8PCAiVHJpYWwgIiA8PCB0cmlhbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwga0RlbGF5PSIgPDwga0RlbGF5OwogICB9CiB9CiAKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9maWxlX21vZGVfc3RyaW5nX3RvX2ZsYWdzLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2ZpbGVfbW9kZV9zdHJpbmdfdG9fZmxhZ3MuY2MKaW5kZXggYjM1NzVlMS4uMDRlNzUxMiAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2ZpbGVfbW9kZV9zdHJpbmdfdG9fZmxhZ3MuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2ZpbGVfbW9kZV9zdHJpbmdfdG9fZmxhZ3MuY2MKQEAgLTMzLDcgKzMzLDcgQEAKICAgICByZXR1cm4gMDsKICAgfQogCi0gIGludCBsZW5ndGggPSBTYlN0cmluZ0dldExlbmd0aChtb2RlKTsKKyAgaW50IGxlbmd0aCA9IHN0YXRpY19jYXN0PGludD4oU2JTdHJpbmdHZXRMZW5ndGgobW9kZSkpOwogICBpZiAobGVuZ3RoIDwgMSkgewogICAgIHJldHVybiAwOwogICB9CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbWVkaWEvbWltZV90eXBlLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL21lZGlhL21pbWVfdHlwZS5jYwppbmRleCA0OTg2ZDg3Li41MjRjODVjIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbWVkaWEvbWltZV90eXBlLmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9tZWRpYS9taW1lX3R5cGUuY2MKQEAgLTY3LDggKzY3LDExIEBACiAKICAgZm9yICg7OykgewogICAgIHNpemVfdCBuZXh0ID0gc3RyLmZpbmQoY2gsIHBvcyk7Ci0gICAgcmVzdWx0LnB1c2hfYmFjayhzdHIuc3Vic3RyKHBvcywgbmV4dCAtIHBvcykpOwotICAgIFRyaW0oJnJlc3VsdC5iYWNrKCkpOworICAgIHN0ZDo6c3RyaW5nIHN1Yl9zdHIgPSBzdHIuc3Vic3RyKHBvcywgbmV4dCAtIHBvcyk7CisgICAgVHJpbSgmc3ViX3N0cik7CisgICAgaWYgKCFzdWJfc3RyLmVtcHR5KCkpIHsKKyAgICAgIHJlc3VsdC5wdXNoX2JhY2soc3ViX3N0cik7CisgICAgfQogICAgIGlmIChuZXh0ID09IHN0ci5ucG9zKSB7CiAgICAgICBicmVhazsKICAgICB9CkBAIC04NSw3ICs4OCw5IEBACiBNaW1lVHlwZTo6TWltZVR5cGUoY29uc3Qgc3RkOjpzdHJpbmcmIGNvbnRlbnRfdHlwZSkgOiBpc192YWxpZF8oZmFsc2UpIHsKICAgU3RyaW5ncyBjb21wb25lbnRzID0gU3BsaXRBbmRUcmltKGNvbnRlbnRfdHlwZSwgJzsnKTsKIAotICBTQl9EQ0hFQ0soIWNvbXBvbmVudHMuZW1wdHkoKSk7CisgIGlmIChjb21wb25lbnRzLmVtcHR5KCkpIHsKKyAgICByZXR1cm47CisgIH0KIAogICAvLyAxLiBWZXJpZnkgaWYgdGhlcmUgaXMgYSB2YWxpZCB0eXBlL3N1YnR5cGUgaW4gdGhlIHZlcnkgYmVnaW5uaW5nLgogICBpZiAoQ29udGFpbnNTcGFjZShjb21wb25lbnRzLmZyb250KCkpKSB7CkBAIC0xNzEsNyArMTc2LDEwIEBACiBpbnQgTWltZVR5cGU6OkdldFBhcmFtSW50VmFsdWUoaW50IGluZGV4KSBjb25zdCB7CiAgIFNCX0RDSEVDSyhpc192YWxpZCgpKTsKICAgU0JfRENIRUNLKGluZGV4IDwgR2V0UGFyYW1Db3VudCgpKTsKLSAgU0JfRENIRUNLKEdldFBhcmFtVHlwZShpbmRleCkgPT0ga1BhcmFtVHlwZUludGVnZXIpOworCisgIGlmIChHZXRQYXJhbVR5cGUoaW5kZXgpICE9IGtQYXJhbVR5cGVJbnRlZ2VyKSB7CisgICAgcmV0dXJuIDA7CisgIH0KIAogICBpbnQgaTsKICAgU2JTdHJpbmdTY2FuRihwYXJhbXNfW2luZGV4XS52YWx1ZS5jX3N0cigpLCAiJWQiLCAmaSk7CkBAIC0xODEsOCArMTg5LDExIEBACiBmbG9hdCBNaW1lVHlwZTo6R2V0UGFyYW1GbG9hdFZhbHVlKGludCBpbmRleCkgY29uc3QgewogICBTQl9EQ0hFQ0soaXNfdmFsaWQoKSk7CiAgIFNCX0RDSEVDSyhpbmRleCA8IEdldFBhcmFtQ291bnQoKSk7Ci0gIFNCX0RDSEVDSyhHZXRQYXJhbVR5cGUoaW5kZXgpID09IGtQYXJhbVR5cGVJbnRlZ2VyIHx8Ci0gICAgICAgICAgICBHZXRQYXJhbVR5cGUoaW5kZXgpID09IGtQYXJhbVR5cGVGbG9hdCk7CisKKyAgaWYgKEdldFBhcmFtVHlwZShpbmRleCkgIT0ga1BhcmFtVHlwZUludGVnZXIgJiYKKyAgICAgIEdldFBhcmFtVHlwZShpbmRleCkgIT0ga1BhcmFtVHlwZUZsb2F0KSB7CisgICAgcmV0dXJuIDAuMGY7CisgIH0KIAogICBmbG9hdCBmOwogICBTYlN0cmluZ1NjYW5GKHBhcmFtc19baW5kZXhdLnZhbHVlLmNfc3RyKCksICIlZyIsICZmKTsKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2F1ZGlvX2J1ZmZlcl9xdWV1ZS5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2F1ZGlvX2J1ZmZlcl9xdWV1ZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDUxZWU4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvYXVkaW9fYnVmZmVyX3F1ZXVlLmNjCkBAIC0wLDAgKzEsMTQwIEBACisvLyBDb3B5cmlnaHQgMjAxMyBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpbmNsdWRlICJjb2JhbHQvbWVkaWEvYmFzZS9hdWRpb19idWZmZXJfcXVldWUuaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgorI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL2F1ZGlvX2J1cy5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBtZWRpYSB7CisKK0F1ZGlvQnVmZmVyUXVldWU6OkF1ZGlvQnVmZmVyUXVldWUoKSB7CisgIENsZWFyKCk7Cit9CitBdWRpb0J1ZmZlclF1ZXVlOjp+QXVkaW9CdWZmZXJRdWV1ZSgpIHt9CisKK3ZvaWQgQXVkaW9CdWZmZXJRdWV1ZTo6Q2xlYXIoKSB7CisgIGJ1ZmZlcnNfLmNsZWFyKCk7CisgIGN1cnJlbnRfYnVmZmVyXyA9IGJ1ZmZlcnNfLmJlZ2luKCk7CisgIGN1cnJlbnRfYnVmZmVyX29mZnNldF8gPSAwOworICBmcmFtZXNfID0gMDsKK30KKwordm9pZCBBdWRpb0J1ZmZlclF1ZXVlOjpBcHBlbmQoY29uc3Qgc2NvcGVkX3JlZnB0cjxBdWRpb0J1ZmZlcj4mIGJ1ZmZlcl9pbikgeworICAvLyBBZGQgdGhlIGJ1ZmZlciB0byB0aGUgcXVldWUuIEluc2VydGluZyBpbnRvIGRlcXVlIGludmFsaWRhdGVzIGFsbAorICAvLyBpdGVyYXRvcnMsIHNvIHBvaW50IHRvIHRoZSBmaXJzdCBidWZmZXIuCisgIGJ1ZmZlcnNfLnB1c2hfYmFjayhidWZmZXJfaW4pOworICBjdXJyZW50X2J1ZmZlcl8gPSBidWZmZXJzXy5iZWdpbigpOworCisgIC8vIFVwZGF0ZSB0aGUgfGZyYW1lc198IGNvdW50ZXIgc2luY2Ugd2UgaGF2ZSBhZGRlZCBmcmFtZXMuCisgIGZyYW1lc18gKz0gYnVmZmVyX2luLT5mcmFtZV9jb3VudCgpOworICBDSEVDS19HVChmcmFtZXNfLCAwKTsgIC8vIG1ha2Ugc3VyZSBpdCBkb2Vzbid0IG92ZXJmbG93LgorfQorCitpbnQgQXVkaW9CdWZmZXJRdWV1ZTo6UmVhZEZyYW1lcyhpbnQgZnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfZnJhbWVfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9CdXMqIGRlc3QpIHsKKyAgRENIRUNLX0dFKGRlc3QtPmZyYW1lcygpLCBmcmFtZXMgKyBkZXN0X2ZyYW1lX29mZnNldCk7CisgIHJldHVybiBJbnRlcm5hbFJlYWQoZnJhbWVzLCB0cnVlLCAwLCBkZXN0X2ZyYW1lX29mZnNldCwgZGVzdCk7Cit9CisKK2ludCBBdWRpb0J1ZmZlclF1ZXVlOjpQZWVrRnJhbWVzKGludCBmcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc291cmNlX2ZyYW1lX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2ZyYW1lX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvQnVzKiBkZXN0KSB7CisgIERDSEVDS19HRShkZXN0LT5mcmFtZXMoKSwgZnJhbWVzKTsKKyAgcmV0dXJuIEludGVybmFsUmVhZChmcmFtZXMsIGZhbHNlLCBzb3VyY2VfZnJhbWVfb2Zmc2V0LCBkZXN0X2ZyYW1lX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICBkZXN0KTsKK30KKwordm9pZCBBdWRpb0J1ZmZlclF1ZXVlOjpTZWVrRnJhbWVzKGludCBmcmFtZXMpIHsKKyAgLy8gUGVyZm9ybSBzZWVrIG9ubHkgaWYgd2UgaGF2ZSBlbm91Z2ggYnl0ZXMgaW4gdGhlIHF1ZXVlLgorICBDSEVDS19MRShmcmFtZXMsIGZyYW1lc18pOworICBpbnQgdGFrZW4gPSBJbnRlcm5hbFJlYWQoZnJhbWVzLCB0cnVlLCAwLCAwLCBOVUxMKTsKKyAgRENIRUNLX0VRKHRha2VuLCBmcmFtZXMpOworfQorCitpbnQgQXVkaW9CdWZmZXJRdWV1ZTo6SW50ZXJuYWxSZWFkKGludCBmcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWR2YW5jZV9wb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNvdXJjZV9mcmFtZV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2ZyYW1lX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9CdXMqIGRlc3QpIHsKKyAgLy8gQ291bnRzIGhvdyBtYW55IGZyYW1lcyBhcmUgYWN0dWFsbHkgcmVhZCBmcm9tIHRoZSBidWZmZXIgcXVldWUuCisgIGludCB0YWtlbiA9IDA7CisgIEJ1ZmZlclF1ZXVlOjppdGVyYXRvciBjdXJyZW50X2J1ZmZlciA9IGN1cnJlbnRfYnVmZmVyXzsKKyAgaW50IGN1cnJlbnRfYnVmZmVyX29mZnNldCA9IGN1cnJlbnRfYnVmZmVyX29mZnNldF87CisKKyAgaW50IGZyYW1lc190b19za2lwID0gc291cmNlX2ZyYW1lX29mZnNldDsKKyAgd2hpbGUgKHRha2VuIDwgZnJhbWVzKSB7CisgICAgLy8gfGN1cnJlbnRfYnVmZmVyfCBpcyB2YWxpZCBzaW5jZSB0aGUgZmlyc3QgdGltZSB0aGlzIGJ1ZmZlciBpcyBhcHBlbmRlZAorICAgIC8vIHdpdGggZGF0YS4gTWFrZSBzdXJlIHRoZXJlIGlzIGRhdGEgdG8gYmUgcHJvY2Vzc2VkLgorICAgIGlmIChjdXJyZW50X2J1ZmZlciA9PSBidWZmZXJzXy5lbmQoKSkKKyAgICAgIGJyZWFrOworCisgICAgc2NvcGVkX3JlZnB0cjxBdWRpb0J1ZmZlcj4gYnVmZmVyID0gKmN1cnJlbnRfYnVmZmVyOworCisgICAgaW50IHJlbWFpbmluZ19mcmFtZXNfaW5fYnVmZmVyID0KKyAgICAgICAgYnVmZmVyLT5mcmFtZV9jb3VudCgpIC0gY3VycmVudF9idWZmZXJfb2Zmc2V0OworCisgICAgaWYgKGZyYW1lc190b19za2lwID4gMCkgeworICAgICAgLy8gSWYgdGhlcmUgYXJlIGZyYW1lcyB0byBza2lwLCBkbyBpdCBmaXJzdC4gTWF5IG5lZWQgdG8gc2tpcCBpbnRvCisgICAgICAvLyBzdWJzZXF1ZW50IGJ1ZmZlcnMuCisgICAgICBpbnQgc2tpcHBlZCA9IHN0ZDo6bWluKHJlbWFpbmluZ19mcmFtZXNfaW5fYnVmZmVyLCBmcmFtZXNfdG9fc2tpcCk7CisgICAgICBjdXJyZW50X2J1ZmZlcl9vZmZzZXQgKz0gc2tpcHBlZDsKKyAgICAgIGZyYW1lc190b19za2lwIC09IHNraXBwZWQ7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIEZpbmQgdGhlIHJpZ2h0IGFtb3VudCB0byBjb3B5IGZyb20gdGhlIGN1cnJlbnQgYnVmZmVyLiBXZSBzaGFsbCBjb3B5IG5vCisgICAgICAvLyBtb3JlIHRoYW4gfGZyYW1lc3wgZnJhbWVzIGluIHRvdGFsIGFuZCBlYWNoIHNpbmdsZSBzdGVwIGNvcGllcyBubyBtb3JlCisgICAgICAvLyB0aGFuIHRoZSBjdXJyZW50IGJ1ZmZlciBzaXplLgorICAgICAgaW50IGNvcGllZCA9IHN0ZDo6bWluKGZyYW1lcyAtIHRha2VuLCByZW1haW5pbmdfZnJhbWVzX2luX2J1ZmZlcik7CisKKyAgICAgIC8vIGlmIHxkZXN0fCBpcyBOVUxMLCB0aGVyZSdzIG5vIG5lZWQgdG8gY29weS4KKyAgICAgIGlmIChkZXN0KSB7CisgICAgICAgIGJ1ZmZlci0+UmVhZEZyYW1lcyhjb3BpZWQsIGN1cnJlbnRfYnVmZmVyX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfZnJhbWVfb2Zmc2V0ICsgdGFrZW4sIGRlc3QpOworICAgICAgfQorCisgICAgICAvLyBJbmNyZWFzZSB0b3RhbCBudW1iZXIgb2YgZnJhbWVzIGNvcGllZCwgd2hpY2ggcmVndWxhdGVzIHdoZW4gdG8gZW5kCisgICAgICAvLyB0aGlzIGxvb3AuCisgICAgICB0YWtlbiArPSBjb3BpZWQ7CisKKyAgICAgIC8vIFdlIGhhdmUgcmVhZCB8Y29waWVkfCBmcmFtZXMgZnJvbSB0aGUgY3VycmVudCBidWZmZXIuIEFkdmFuY2UgdGhlCisgICAgICAvLyBvZmZzZXQuCisgICAgICBjdXJyZW50X2J1ZmZlcl9vZmZzZXQgKz0gY29waWVkOworICAgIH0KKworICAgIC8vIEhhcyB0aGUgYnVmZmVyIGhhcyBiZWVuIGNvbnN1bWVkPworICAgIGlmIChjdXJyZW50X2J1ZmZlcl9vZmZzZXQgPT0gYnVmZmVyLT5mcmFtZV9jb3VudCgpKSB7CisgICAgICAvLyBJZiB3ZSBhcmUgYXQgdGhlIGxhc3QgYnVmZmVyLCBubyBtb3JlIGRhdGEgdG8gYmUgY29waWVkLCBzbyBzdG9wLgorICAgICAgQnVmZmVyUXVldWU6Oml0ZXJhdG9yIG5leHQgPSBjdXJyZW50X2J1ZmZlciArIDE7CisgICAgICBpZiAobmV4dCA9PSBidWZmZXJzXy5lbmQoKSkKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIC8vIEFkdmFuY2VzIHRoZSBpdGVyYXRvci4KKyAgICAgIGN1cnJlbnRfYnVmZmVyID0gbmV4dDsKKyAgICAgIGN1cnJlbnRfYnVmZmVyX29mZnNldCA9IDA7CisgICAgfQorICB9CisKKyAgaWYgKGFkdmFuY2VfcG9zaXRpb24pIHsKKyAgICAvLyBVcGRhdGUgdGhlIGFwcHJvcHJpYXRlIHZhbHVlcyBzaW5jZSB8dGFrZW58IGZyYW1lcyBoYXZlIGJlZW4gY29waWVkIG91dC4KKyAgICBmcmFtZXNfIC09IHRha2VuOworICAgIERDSEVDS19HRShmcmFtZXNfLCAwKTsKKyAgICBEQ0hFQ0soY3VycmVudF9idWZmZXJfICE9IGJ1ZmZlcnNfLmVuZCgpIHx8IGZyYW1lc18gPT0gMCk7CisKKyAgICAvLyBSZW1vdmUgYW55IGJ1ZmZlcnMgYmVmb3JlIHRoZSBjdXJyZW50IGJ1ZmZlciBhcyB0aGVyZSBpcyBubyBnb2luZworICAgIC8vIGJhY2t3YXJkcy4KKyAgICBidWZmZXJzXy5lcmFzZShidWZmZXJzXy5iZWdpbigpLCBjdXJyZW50X2J1ZmZlcik7CisgICAgY3VycmVudF9idWZmZXJfID0gYnVmZmVyc18uYmVnaW4oKTsKKyAgICBjdXJyZW50X2J1ZmZlcl9vZmZzZXRfID0gY3VycmVudF9idWZmZXJfb2Zmc2V0OworICB9CisKKyAgcmV0dXJuIHRha2VuOworfQorCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2F1ZGlvX2J1ZmZlcl9xdWV1ZS5oIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvYXVkaW9fYnVmZmVyX3F1ZXVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQxNjJhNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2F1ZGlvX2J1ZmZlcl9xdWV1ZS5oCkBAIC0wLDAgKzEsOTAgQEAKKy8vIENvcHlyaWdodCAyMDEzIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2lmbmRlZiBDT0JBTFRfTUVESUFfQkFTRV9BVURJT19CVUZGRVJfUVVFVUVfSF8KKyNkZWZpbmUgQ09CQUxUX01FRElBX0JBU0VfQVVESU9fQlVGRkVSX1FVRVVFX0hfCisKKyNpbmNsdWRlIDxkZXF1ZT4KKworI2luY2x1ZGUgImJhc2UvYmFzaWN0eXBlcy5oIgorI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL2F1ZGlvX2J1ZmZlci5oIgorI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL21lZGlhX2V4cG9ydC5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBtZWRpYSB7CisKK2NsYXNzIEF1ZGlvQnVzOworCisvLyBBIHF1ZXVlIG9mIEF1ZGlvQnVmZmVycyB0byBzdXBwb3J0IHJlYWRpbmcgb2YgYXJiaXRyYXJ5IGNodW5rcyBvZiBhIG1lZGlhCisvLyBkYXRhIHNvdXJjZS4gQXVkaW8gZGF0YSBjYW4gYmUgY29waWVkIGludG8gYW4gQXVkaW9CdXMgZm9yIG91dHB1dC4gVGhlCisvLyBjdXJyZW50IHBvc2l0aW9uIGNhbiBiZSBmb3J3YXJkZWQgdG8gYW55d2hlcmUgaW4gdGhlIGJ1ZmZlcmVkIGRhdGEuCisvLworLy8gVGhpcyBjbGFzcyBpcyBub3QgaW5oZXJlbnRseSB0aHJlYWQtc2FmZS4gQ29uY3VycmVudCBhY2Nlc3MgbXVzdCBiZQorLy8gZXh0ZXJuYWxseSBzZXJpYWxpemVkLgorY2xhc3MgTUVESUFfRVhQT1JUIEF1ZGlvQnVmZmVyUXVldWUgeworIHB1YmxpYzoKKyAgQXVkaW9CdWZmZXJRdWV1ZSgpOworICB+QXVkaW9CdWZmZXJRdWV1ZSgpOworCisgIC8vIENsZWFycyB0aGUgYnVmZmVyIHF1ZXVlLgorICB2b2lkIENsZWFyKCk7CisKKyAgLy8gQXBwZW5kcyB8YnVmZmVyX2lufCB0byB0aGlzIHF1ZXVlLgorICB2b2lkIEFwcGVuZChjb25zdCBzY29wZWRfcmVmcHRyPEF1ZGlvQnVmZmVyPiYgYnVmZmVyX2luKTsKKworICAvLyBSZWFkcyBhIG1heGltdW0gb2YgfGZyYW1lc3wgZnJhbWVzIGludG8gfGRlc3R8IGZyb20gdGhlIGN1cnJlbnQgcG9zaXRpb24uCisgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBmcmFtZXMgcmVhZC4gVGhlIGN1cnJlbnQgcG9zaXRpb24gd2lsbCBhZHZhbmNlIGJ5IHRoZQorICAvLyBhbW91bnQgb2YgZnJhbWVzIHJlYWQuIHxkZXN0X2ZyYW1lX29mZnNldHwgc3BlY2lmaWVzIGEgc3RhcnRpbmcgb2Zmc2V0IGludG8KKyAgLy8gfGRlc3R8LiBPbiBlYWNoIGNhbGwsIHRoZSBmcmFtZXMgYXJlIGNvbnZlcnRlZCBmcm9tIHRoZWlyIHNvdXJjZSBmb3JtYXQKKyAgLy8gaW50byB0aGUgZGVzdGluYXRpb24gQXVkaW9CdXMuCisgIGludCBSZWFkRnJhbWVzKGludCBmcmFtZXMsIGludCBkZXN0X2ZyYW1lX29mZnNldCwgQXVkaW9CdXMqIGRlc3QpOworCisgIC8vIENvcGllcyB1cCB0byB8ZnJhbWVzfCBmcmFtZXMgZnJvbSBjdXJyZW50IHBvc2l0aW9uIHRvIHxkZXN0fC4gUmV0dXJucworICAvLyBudW1iZXIgb2YgZnJhbWVzIGNvcGllZC4gRG9lc24ndCBhZHZhbmNlIGN1cnJlbnQgcG9zaXRpb24uIFN0YXJ0cyBhdAorICAvLyB8c291cmNlX2ZyYW1lX29mZnNldHwgZnJvbSBjdXJyZW50IHBvc2l0aW9uLiB8ZGVzdF9mcmFtZV9vZmZzZXR8IHNwZWNpZmllcworICAvLyBhIHN0YXJ0aW5nIG9mZnNldCBpbnRvIHxkZXN0fC4gT24gZWFjaCBjYWxsLCB0aGUgZnJhbWVzIGFyZSBjb252ZXJ0ZWQgZnJvbQorICAvLyB0aGVpciBzb3VyY2UgZm9ybWF0IGludG8gdGhlIGRlc3RpbmF0aW9uIEF1ZGlvQnVzLgorICBpbnQgUGVla0ZyYW1lcyhpbnQgZnJhbWVzLAorICAgICAgICAgICAgICAgICBpbnQgc291cmNlX2ZyYW1lX29mZnNldCwKKyAgICAgICAgICAgICAgICAgaW50IGRlc3RfZnJhbWVfb2Zmc2V0LAorICAgICAgICAgICAgICAgICBBdWRpb0J1cyogZGVzdCk7CisKKyAgLy8gTW92ZXMgdGhlIGN1cnJlbnQgcG9zaXRpb24gZm9yd2FyZCBieSB8ZnJhbWVzfCBmcmFtZXMuIElmIHxmcmFtZXN8IGV4Y2VlZHMKKyAgLy8gZnJhbWVzIGF2YWlsYWJsZSwgdGhlIHNlZWsgb3BlcmF0aW9uIHdpbGwgZmFpbC4KKyAgdm9pZCBTZWVrRnJhbWVzKGludCBmcmFtZXMpOworCisgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBmcmFtZXMgYnVmZmVyZWQgYmV5b25kIHRoZSBjdXJyZW50IHBvc2l0aW9uLgorICBpbnQgZnJhbWVzKCkgY29uc3QgeyByZXR1cm4gZnJhbWVzXzsgfQorCisgcHJpdmF0ZToKKyAgLy8gRGVmaW5pdGlvbiBvZiB0aGUgYnVmZmVyIHF1ZXVlLgorICB0eXBlZGVmIHN0ZDo6ZGVxdWU8c2NvcGVkX3JlZnB0cjxBdWRpb0J1ZmZlcj4gPiBCdWZmZXJRdWV1ZTsKKworICAvLyBBbiBpbnRlcm5hbCBtZXRob2Qgc2hhcmVkIGJ5IFJlYWRGcmFtZXMoKSBhbmQgU2Vla0ZyYW1lcygpIHRoYXQgYWN0dWFsbHkKKyAgLy8gZG9lcyByZWFkaW5nLiBJdCByZWFkcyBhIG1heGltdW0gb2YgfGZyYW1lc3wgZnJhbWVzIGludG8gfGRlc3R8LiBSZXR1cm5zCisgIC8vIHRoZSBudW1iZXIgb2YgZnJhbWVzIHJlYWQuIFRoZSBjdXJyZW50IHBvc2l0aW9uIHdpbGwgYmUgbW92ZWQgZm9yd2FyZCBieQorICAvLyB0aGUgbnVtYmVyIG9mIGZyYW1lcyByZWFkIGlmIHxhZHZhbmNlX3Bvc2l0aW9ufCBpcyBzZXQuIElmIHxkZXN0fCBpcyBOVUxMLAorICAvLyBvbmx5IHRoZSBjdXJyZW50IHBvc2l0aW9uIHdpbGwgYWR2YW5jZSBidXQgbm8gZGF0YSB3aWxsIGJlIGNvcGllZC4KKyAgLy8gfHNvdXJjZV9mcmFtZV9vZmZzZXR8IGNhbiBiZSB1c2VkIHRvIHNraXAgZnJhbWVzIGJlZm9yZSByZWFkaW5nLgorICAvLyB8ZGVzdF9mcmFtZV9vZmZzZXR8IHNwZWNpZmllcyBhIHN0YXJ0aW5nIG9mZnNldCBpbnRvIHxkZXN0fC4KKyAgaW50IEludGVybmFsUmVhZChpbnQgZnJhbWVzLAorICAgICAgICAgICAgICAgICAgIGJvb2wgYWR2YW5jZV9wb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICBpbnQgc291cmNlX2ZyYW1lX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9mcmFtZV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgQXVkaW9CdXMqIGRlc3QpOworCisgIEJ1ZmZlclF1ZXVlOjppdGVyYXRvciBjdXJyZW50X2J1ZmZlcl87CisgIEJ1ZmZlclF1ZXVlIGJ1ZmZlcnNfOworICBpbnQgY3VycmVudF9idWZmZXJfb2Zmc2V0XzsKKworICAvLyBOdW1iZXIgb2YgZnJhbWVzIGF2YWlsYWJsZSB0byBiZSByZWFkIGluIHRoZSBidWZmZXIuCisgIGludCBmcmFtZXNfOworCisgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihBdWRpb0J1ZmZlclF1ZXVlKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorCisjZW5kaWYgIC8vIENPQkFMVF9NRURJQV9CQVNFX0FVRElPX0JVRkZFUl9RVUVVRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvYXVkaW9fcmVuZGVyZXJfYWxnb3JpdGhtLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvYXVkaW9fcmVuZGVyZXJfYWxnb3JpdGhtLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNDNkN2IKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9hdWRpb19yZW5kZXJlcl9hbGdvcml0aG0uY2MKQEAgLTAsMCArMSwzOTYgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpbmNsdWRlICJjb2JhbHQvbWVkaWEvZmlsdGVycy9hdWRpb19yZW5kZXJlcl9hbGdvcml0aG0uaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjbWF0aD4KKworI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgorI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL2F1ZGlvX2J1cy5oIgorI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL2xpbWl0cy5oIgorI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9maWx0ZXJzL3dzb2xhX2ludGVybmFscy5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgbWVkaWEgeworCisvLyBXYXZlZm9ybSBTaW1pbGFyaXR5IE92ZXJsYXAtYW5kLWFkZCAoV1NPTEEpLgorLy8KKy8vIE9uZSBXU09MQSBpdGVyYXRpb24KKy8vCisvLyAxKSBFeHRyYWN0IHx0YXJnZXRfYmxvY2tffCBhcyBpbnB1dCBmcmFtZXMgYXQgaW5kaWNlcworLy8gICAgW3x0YXJnZXRfYmxvY2tfaW5kZXhffCwgfHRhcmdldF9ibG9ja19pbmRleF98ICsgfG9sYV93aW5kb3dfc2l6ZV98KS4KKy8vICAgIE5vdGUgdGhhdCB8dGFyZ2V0X2Jsb2NrX3wgaXMgdGhlICJuYXR1cmFsIiBjb250aW51YXRpb24gb2YgdGhlIG91dHB1dC4KKy8vCisvLyAyKSBFeHRyYWN0IHxzZWFyY2hfYmxvY2tffCBhcyBpbnB1dCBmcmFtZXMgYXQgaW5kaWNlcworLy8gICAgW3xzZWFyY2hfYmxvY2tfaW5kZXhffCwKKy8vICAgICB8c2VhcmNoX2Jsb2NrX2luZGV4X3wgKyB8bnVtX2NhbmRpZGF0ZV9ibG9ja3NffCArIHxvbGFfd2luZG93X3NpemVffCkuCisvLworLy8gMykgRmluZCBhIGJsb2NrIHdpdGhpbiB0aGUgfHNlYXJjaF9ibG9ja198IHRoYXQgaXMgbW9zdCBzaW1pbGFyCisvLyAgICB0byB8dGFyZ2V0X2Jsb2NrX3wuIExldCB8b3B0aW1hbF9pbmRleHwgYmUgdGhlIGluZGV4IG9mIHN1Y2ggYmxvY2sgYW5kCisvLyAgICB3cml0ZSBpdCB0byB8b3B0aW1hbF9ibG9ja198LgorLy8KKy8vIDQpIFVwZGF0ZToKKy8vICAgIHxvcHRpbWFsX2Jsb2NrX3wgPSB8dHJhbnNpdGlvbl93aW5kb3dffCAqIHx0YXJnZXRfYmxvY2tffCArCisvLyAgICAoMSAtIHx0cmFuc2l0aW9uX3dpbmRvd198KSAqIHxvcHRpbWFsX2Jsb2NrX3wuCisvLworLy8gNSkgT3ZlcmxhcC1hbmQtYWRkIHxvcHRpbWFsX2Jsb2NrX3wgdG8gdGhlIHx3c29sYV9vdXRwdXRffC4KKy8vCisvLyA2KSBVcGRhdGU6CisvLyAgICB8dGFyZ2V0X2Jsb2NrX3wgPSB8b3B0aW1hbF9pbmRleHwgKyB8b2xhX3dpbmRvd19zaXplX3wgLyAyLgorLy8gICAgfG91dHB1dF9pbmRleF98ID0gfG91dHB1dF9pbmRleF98ICsgfG9sYV93aW5kb3dfc2l6ZV98IC8gMiwKKy8vICAgIHxzZWFyY2hfYmxvY2tfY2VudGVyX29mZnNldF98ID0gfG91dHB1dF9pbmRleF98ICogfHBsYXliYWNrX3JhdGV8LCBhbmQKKy8vICAgIHxzZWFyY2hfYmxvY2tfaW5kZXhffCA9IHxzZWFyY2hfYmxvY2tfY2VudGVyX29mZnNldF98IC0KKy8vICAgICAgICB8c2VhcmNoX2Jsb2NrX2NlbnRlcl9vZmZzZXRffC4KKworLy8gTWF4L21pbiBzdXBwb3J0ZWQgcGxheWJhY2sgcmF0ZXMgZm9yIGZhc3Qvc2xvdyBhdWRpby4gQXVkaW8gb3V0c2lkZSBvZiB0aGVzZQorLy8gcmFuZ2VzIGFyZSBtdXRlZC4KKy8vIEF1ZGlvIGF0IHRoZXNlIHNwZWVkcyB3b3VsZCBzb3VuZCBiZXR0ZXIgdW5kZXIgYSBmcmVxdWVuY3kgZG9tYWluIGFsZ29yaXRobS4KK3N0YXRpYyBjb25zdCBkb3VibGUga01pblBsYXliYWNrUmF0ZSA9IDAuNTsKK3N0YXRpYyBjb25zdCBkb3VibGUga01heFBsYXliYWNrUmF0ZSA9IDQuMDsKKworLy8gT3ZlcmxhcC1hbmQtYWRkIHdpbmRvdyBzaXplIGluIG1pbGxpc2Vjb25kcy4KK3N0YXRpYyBjb25zdCBpbnQga09sYVdpbmRvd1NpemVNcyA9IDIwOworCisvLyBTaXplIG9mIHNlYXJjaCBpbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMuIFRoZSBzZWFyY2ggaW50ZXJ2YWwgaXMKKy8vIFstZGVsdGEgZGVsdGFdIGFyb3VuZCB8b3V0cHV0X2luZGV4X3wgKiB8cGxheWJhY2tfcmF0ZXwuIFNvIHRoZSBzZWFyY2gKKy8vIGludGVydmFsIGlzIDIgKiBkZWx0YS4KK3N0YXRpYyBjb25zdCBpbnQga1dzb2xhU2VhcmNoSW50ZXJ2YWxNcyA9IDMwOworCisvLyBUaGUgbWF4aW11bSBzaXplIGluIHNlY29uZHMgZm9yIHRoZSB8YXVkaW9fYnVmZmVyX3wuIEFyYml0cmFyaWx5IGRldGVybWluZWQuCitzdGF0aWMgY29uc3QgaW50IGtNYXhDYXBhY2l0eUluU2Vjb25kcyA9IDM7CisKKy8vIFRoZSBtaW5pbXVtIHNpemUgaW4gbXMgZm9yIHRoZSB8YXVkaW9fYnVmZmVyX3wuIEFyYml0cmFyaWx5IGRldGVybWluZWQuCitzdGF0aWMgY29uc3QgaW50IGtTdGFydGluZ0NhcGFjaXR5SW5NcyA9IDIwMDsKKworQXVkaW9SZW5kZXJlckFsZ29yaXRobTo6QXVkaW9SZW5kZXJlckFsZ29yaXRobSgpCisgICAgOiBjaGFubmVsc18oMCksCisgICAgICBzYW1wbGVzX3Blcl9zZWNvbmRfKDApLAorICAgICAgbXV0ZWRfcGFydGlhbF9mcmFtZV8oMCksCisgICAgICBjYXBhY2l0eV8oMCksCisgICAgICBvdXRwdXRfdGltZV8oMC4wKSwKKyAgICAgIHNlYXJjaF9ibG9ja19jZW50ZXJfb2Zmc2V0XygwKSwKKyAgICAgIHNlYXJjaF9ibG9ja19pbmRleF8oMCksCisgICAgICBudW1fY2FuZGlkYXRlX2Jsb2Nrc18oMCksCisgICAgICB0YXJnZXRfYmxvY2tfaW5kZXhfKDApLAorICAgICAgb2xhX3dpbmRvd19zaXplXygwKSwKKyAgICAgIG9sYV9ob3Bfc2l6ZV8oMCksCisgICAgICBudW1fY29tcGxldGVfZnJhbWVzXygwKSwKKyAgICAgIGluaXRpYWxfY2FwYWNpdHlfKDApLAorICAgICAgbWF4X2NhcGFjaXR5XygwKSB7fQorCitBdWRpb1JlbmRlcmVyQWxnb3JpdGhtOjp+QXVkaW9SZW5kZXJlckFsZ29yaXRobSgpIHt9CisKK3ZvaWQgQXVkaW9SZW5kZXJlckFsZ29yaXRobTo6SW5pdGlhbGl6ZShjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcykgeworICBDSEVDSyhwYXJhbXMuSXNWYWxpZCgpKTsKKworICBjaGFubmVsc18gPSBwYXJhbXMuY2hhbm5lbHMoKTsKKyAgc2FtcGxlc19wZXJfc2Vjb25kXyA9IHBhcmFtcy5zYW1wbGVfcmF0ZSgpOworICBpbml0aWFsX2NhcGFjaXR5XyA9IGNhcGFjaXR5XyA9CisgICAgICBzdGQ6Om1heChwYXJhbXMuZnJhbWVzX3Blcl9idWZmZXIoKSAqIDIsCisgICAgICAgICAgICAgICBDb252ZXJ0TWlsbGlzZWNvbmRzVG9GcmFtZXMoa1N0YXJ0aW5nQ2FwYWNpdHlJbk1zKSk7CisgIG1heF9jYXBhY2l0eV8gPQorICAgICAgc3RkOjptYXgoaW5pdGlhbF9jYXBhY2l0eV8sIGtNYXhDYXBhY2l0eUluU2Vjb25kcyAqIHNhbXBsZXNfcGVyX3NlY29uZF8pOworICBudW1fY2FuZGlkYXRlX2Jsb2Nrc18gPSBDb252ZXJ0TWlsbGlzZWNvbmRzVG9GcmFtZXMoa1dzb2xhU2VhcmNoSW50ZXJ2YWxNcyk7CisgIG9sYV93aW5kb3dfc2l6ZV8gPSBDb252ZXJ0TWlsbGlzZWNvbmRzVG9GcmFtZXMoa09sYVdpbmRvd1NpemVNcyk7CisKKyAgLy8gTWFrZSBzdXJlIHdpbmRvdyBzaXplIGluIGFuIGV2ZW4gbnVtYmVyLgorICBvbGFfd2luZG93X3NpemVfICs9IG9sYV93aW5kb3dfc2l6ZV8gJiAxOworICBvbGFfaG9wX3NpemVfID0gb2xhX3dpbmRvd19zaXplXyAvIDI7CisKKyAgLy8gfG51bV9jYW5kaWRhdGVfYmxvY2tzX3wgLyAyIGlzIHRoZSBvZmZzZXQgb2YgdGhlIGNlbnRlciBvZiB0aGUgc2VhcmNoCisgIC8vIGJsb2NrIHRvIHRoZSBjZW50ZXIgb2YgdGhlIGZpcnN0IChsZWZ0IG1vc3QpIGNhbmRpZGF0ZSBibG9jay4gVGhlIG9mZnNldAorICAvLyBvZiB0aGUgY2VudGVyIG9mIGEgY2FuZGlkYXRlIGJsb2NrIHRvIGl0cyBsZWZ0IG1vc3QgcG9pbnQgaXMKKyAgLy8gfG9sYV93aW5kb3dfc2l6ZV98IC8gMiAtIDEuIE5vdGUgdGhhdCB8b2xhX3dpbmRvd19zaXplX3wgaXMgZXZlbiBhbmQgaW4KKyAgLy8gb3VyIGNvbnZlbnRpb24gdGhlIGNlbnRlciBiZWxvbmdzIHRvIHRoZSBsZWZ0IGhhbGYsIHNvIHdlIG5lZWQgdG8gc3VidHJhY3QKKyAgLy8gb25lIGZyYW1lIHRvIGdldCB0aGUgY29ycmVjdCBvZmZzZXQuCisgIC8vCisgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWFyY2ggQmxvY2sKKyAgLy8gICAgICAgICAgICAgIDwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPgorICAvLworICAvLyAgIHxvbGFfd2luZG93X3NpemVffCAvIDIgLSAxCisgIC8vICAgICAgICAgICAgICA8LS0tLQorICAvLworICAvLyAgICAgICAgICAgICB8bnVtX2NhbmRpZGF0ZV9ibG9ja3NffCAvIDIKKyAgLy8gICAgICAgICAgICAgICAgICAgPC0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXIKKyAgLy8gICAgICAgICAgICAgIFgtLS0tWC0tLS0tLS0tLS0tLS0tLS1YLS0tLS0tLS0tLS0tLS0tWC0tLS0tWAorICAvLyAgICAgICAgICAgICAgPC0tLS0tLS0tLS0+ICAgICAgICAgICAgICAgICAgICAgPC0tLS0tLS0tLS0+CisgIC8vICAgICAgICAgICAgICAgIENhbmRpZGF0ZSAgICAgIC4uLiAgICAgICAgICAgICAgIENhbmRpZGF0ZQorICAvLyAgICAgICAgICAgICAgICAgICAxLCAgICAgICAgICAuLi4gICAgICAgICB8bnVtX2NhbmRpZGF0ZV9ibG9ja3NffAorICBzZWFyY2hfYmxvY2tfY2VudGVyX29mZnNldF8gPQorICAgICAgbnVtX2NhbmRpZGF0ZV9ibG9ja3NfIC8gMiArIChvbGFfd2luZG93X3NpemVfIC8gMiAtIDEpOworCisgIG9sYV93aW5kb3dfLnJlc2V0KG5ldyBmbG9hdFtvbGFfd2luZG93X3NpemVfXSk7CisgIGludGVybmFsOjpHZXRTeW1tZXRyaWNIYW5uaW5nV2luZG93KG9sYV93aW5kb3dfc2l6ZV8sIG9sYV93aW5kb3dfLmdldCgpKTsKKworICB0cmFuc2l0aW9uX3dpbmRvd18ucmVzZXQobmV3IGZsb2F0W29sYV93aW5kb3dfc2l6ZV8gKiAyXSk7CisgIGludGVybmFsOjpHZXRTeW1tZXRyaWNIYW5uaW5nV2luZG93KDIgKiBvbGFfd2luZG93X3NpemVfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uX3dpbmRvd18uZ2V0KCkpOworCisgIHdzb2xhX291dHB1dF8gPSBBdWRpb0J1czo6Q3JlYXRlKGNoYW5uZWxzXywgb2xhX3dpbmRvd19zaXplXyArIG9sYV9ob3Bfc2l6ZV8pOworICB3c29sYV9vdXRwdXRfLT5aZXJvKCk7ICAvLyBJbml0aWFsaXplIGZvciBvdmVybGFwLWFuZC1hZGQgb2YgdGhlIGZpcnN0IGJsb2NrLgorCisgIC8vIEF1eGlsaWFyeSBjb250YWluZXJzLgorICBvcHRpbWFsX2Jsb2NrXyA9IEF1ZGlvQnVzOjpDcmVhdGUoY2hhbm5lbHNfLCBvbGFfd2luZG93X3NpemVfKTsKKyAgc2VhcmNoX2Jsb2NrXyA9IEF1ZGlvQnVzOjpDcmVhdGUoCisgICAgICBjaGFubmVsc18sIG51bV9jYW5kaWRhdGVfYmxvY2tzXyArIChvbGFfd2luZG93X3NpemVfIC0gMSkpOworICB0YXJnZXRfYmxvY2tfID0gQXVkaW9CdXM6OkNyZWF0ZShjaGFubmVsc18sIG9sYV93aW5kb3dfc2l6ZV8pOworfQorCitpbnQgQXVkaW9SZW5kZXJlckFsZ29yaXRobTo6RmlsbEJ1ZmZlcihBdWRpb0J1cyogZGVzdCwgaW50IGRlc3Rfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlcXVlc3RlZF9mcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGxheWJhY2tfcmF0ZSkgeworICBpZiAocGxheWJhY2tfcmF0ZSA9PSAwKSByZXR1cm4gMDsKKworICBEQ0hFQ0tfR1QocGxheWJhY2tfcmF0ZSwgMCk7CisgIERDSEVDS19FUShjaGFubmVsc18sIGRlc3QtPmNoYW5uZWxzKCkpOworCisgIC8vIE9wdGltaXplIHRoZSBtdXRlZCBjYXNlIHRvIGlzc3VlIGEgc2luZ2xlIGNsZWFyIGluc3RlYWQgb2YgcGVyZm9ybWluZworICAvLyB0aGUgZnVsbCBjcm9zc2ZhZGUgYW5kIGNsZWFyaW5nIGVhY2ggY3Jvc3NmYWRlZCBmcmFtZS4KKyAgaWYgKHBsYXliYWNrX3JhdGUgPCBrTWluUGxheWJhY2tSYXRlIHx8IHBsYXliYWNrX3JhdGUgPiBrTWF4UGxheWJhY2tSYXRlKSB7CisgICAgaW50IGZyYW1lc190b19yZW5kZXIgPQorICAgICAgICBzdGQ6Om1pbihzdGF0aWNfY2FzdDxpbnQ+KGF1ZGlvX2J1ZmZlcl8uZnJhbWVzKCkgLyBwbGF5YmFja19yYXRlKSwKKyAgICAgICAgICAgICAgICAgcmVxdWVzdGVkX2ZyYW1lcyk7CisKKyAgICAvLyBDb21wdXRlIGFjY3VyYXRlIG51bWJlciBvZiBmcmFtZXMgdG8gYWN0dWFsbHkgc2tpcCBpbiB0aGUgc291cmNlIGRhdGEuCisgICAgLy8gSW5jbHVkZXMgdGhlIGxlZnRvdmVyIHBhcnRpYWwgZnJhbWUgZnJvbSBsYXN0IHJlcXVlc3QuIEhvd2V2ZXIsIHdlIGNhbgorICAgIC8vIG9ubHkgc2tpcCBvdmVyIGNvbXBsZXRlIGZyYW1lcywgc28gYSBwYXJ0aWFsIGZyYW1lIG1heSByZW1haW4gZm9yIG5leHQKKyAgICAvLyB0aW1lLgorICAgIG11dGVkX3BhcnRpYWxfZnJhbWVfICs9IGZyYW1lc190b19yZW5kZXIgKiBwbGF5YmFja19yYXRlOworICAgIC8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSBtdXRlZF9wYXJ0aWFsX2ZyYW1lXyByb3VuZHMgdXAgdG8KKyAgICAvLyBhdWRpb19idWZmZXJfLmZyYW1lcygpKzEuCisgICAgaW50IHNlZWtfZnJhbWVzID0gc3RkOjptaW4oc3RhdGljX2Nhc3Q8aW50PihtdXRlZF9wYXJ0aWFsX2ZyYW1lXyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYnVmZmVyXy5mcmFtZXMoKSk7CisgICAgZGVzdC0+WmVyb0ZyYW1lc1BhcnRpYWwoZGVzdF9vZmZzZXQsIGZyYW1lc190b19yZW5kZXIpOworICAgIGF1ZGlvX2J1ZmZlcl8uU2Vla0ZyYW1lcyhzZWVrX2ZyYW1lcyk7CisKKyAgICAvLyBEZXRlcm1pbmUgdGhlIHBhcnRpYWwgZnJhbWUgdGhhdCByZW1haW5zIHRvIGJlIHNraXBwZWQgZm9yIG5leHQgY2FsbC4gSWYKKyAgICAvLyB0aGUgdXNlciBzd2l0Y2hlcyBiYWNrIHRvIHBsYXlpbmcsIGl0IG1heSBiZSBvZmYgdGltZSBieSB0aGlzIHBhcnRpYWwKKyAgICAvLyBmcmFtZSwgd2hpY2ggd291bGQgYmUgdW5kZXRlY3RhYmxlLiBJZiB0aGV5IHN1YnNlcXVlbnRseSBzd2l0Y2ggdG8KKyAgICAvLyBhbm90aGVyIHBsYXliYWNrIHJhdGUgdGhhdCBtdXRlcywgdGhlIGNvZGUgd2lsbCBhdHRlbXB0IHRvIGxpbmUgdXAgdGhlCisgICAgLy8gZnJhbWVzIGFnYWluLgorICAgIG11dGVkX3BhcnRpYWxfZnJhbWVfIC09IHNlZWtfZnJhbWVzOworICAgIHJldHVybiBmcmFtZXNfdG9fcmVuZGVyOworICB9CisKKyAgaW50IHNsb3dlcl9zdGVwID0gY2VpbChvbGFfd2luZG93X3NpemVfICogcGxheWJhY2tfcmF0ZSk7CisgIGludCBmYXN0ZXJfc3RlcCA9IGNlaWwob2xhX3dpbmRvd19zaXplXyAvIHBsYXliYWNrX3JhdGUpOworCisgIC8vIE9wdGltaXplIHRoZSBtb3N0IGNvbW1vbiB8cGxheWJhY2tfcmF0ZXwgfj0gMSBjYXNlIHRvIHVzZSBhIHNpbmdsZSBjb3B5CisgIC8vIGluc3RlYWQgb2YgY29weWluZyBmcmFtZSBieSBmcmFtZS4KKyAgaWYgKG9sYV93aW5kb3dfc2l6ZV8gPD0gZmFzdGVyX3N0ZXAgJiYgc2xvd2VyX3N0ZXAgPj0gb2xhX3dpbmRvd19zaXplXykgeworICAgIGNvbnN0IGludCBmcmFtZXNfdG9fY29weSA9CisgICAgICAgIHN0ZDo6bWluKGF1ZGlvX2J1ZmZlcl8uZnJhbWVzKCksIHJlcXVlc3RlZF9mcmFtZXMpOworICAgIGNvbnN0IGludCBmcmFtZXNfcmVhZCA9CisgICAgICAgIGF1ZGlvX2J1ZmZlcl8uUmVhZEZyYW1lcyhmcmFtZXNfdG9fY29weSwgZGVzdF9vZmZzZXQsIGRlc3QpOworICAgIERDSEVDS19FUShmcmFtZXNfcmVhZCwgZnJhbWVzX3RvX2NvcHkpOworICAgIHJldHVybiBmcmFtZXNfcmVhZDsKKyAgfQorCisgIGludCByZW5kZXJlZF9mcmFtZXMgPSAwOworICBkbyB7CisgICAgcmVuZGVyZWRfZnJhbWVzICs9CisgICAgICAgIFdyaXRlQ29tcGxldGVkRnJhbWVzVG8ocmVxdWVzdGVkX2ZyYW1lcyAtIHJlbmRlcmVkX2ZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X29mZnNldCArIHJlbmRlcmVkX2ZyYW1lcywgZGVzdCk7CisgIH0gd2hpbGUgKHJlbmRlcmVkX2ZyYW1lcyA8IHJlcXVlc3RlZF9mcmFtZXMgJiYKKyAgICAgICAgICAgUnVuT25lV3NvbGFJdGVyYXRpb24ocGxheWJhY2tfcmF0ZSkpOworICByZXR1cm4gcmVuZGVyZWRfZnJhbWVzOworfQorCit2b2lkIEF1ZGlvUmVuZGVyZXJBbGdvcml0aG06OkZsdXNoQnVmZmVycygpIHsKKyAgLy8gQ2xlYXIgdGhlIHF1ZXVlIG9mIGRlY29kZWQgcGFja2V0cyAocmVsZWFzaW5nIHRoZSBidWZmZXJzKS4KKyAgYXVkaW9fYnVmZmVyXy5DbGVhcigpOworICBvdXRwdXRfdGltZV8gPSAwLjA7CisgIHNlYXJjaF9ibG9ja19pbmRleF8gPSAwOworICB0YXJnZXRfYmxvY2tfaW5kZXhfID0gMDsKKyAgd3NvbGFfb3V0cHV0Xy0+WmVybygpOworICBudW1fY29tcGxldGVfZnJhbWVzXyA9IDA7CisKKyAgLy8gUmVzZXQgfGNhcGFjaXR5X3wgc28gZ3Jvd3RoIHRyaWdnZXJlZCBieSB1bmRlcmZsb3dzIGRvZXNuJ3QgcGVuYWxpemUgc2VlaworICAvLyB0aW1lLgorICBjYXBhY2l0eV8gPSBpbml0aWFsX2NhcGFjaXR5XzsKK30KKwordm9pZCBBdWRpb1JlbmRlcmVyQWxnb3JpdGhtOjpFbnF1ZXVlQnVmZmVyKAorICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8QXVkaW9CdWZmZXI+JiBidWZmZXJfaW4pIHsKKyAgRENIRUNLKCFidWZmZXJfaW4tPmVuZF9vZl9zdHJlYW0oKSk7CisgIGF1ZGlvX2J1ZmZlcl8uQXBwZW5kKGJ1ZmZlcl9pbik7Cit9CisKK2Jvb2wgQXVkaW9SZW5kZXJlckFsZ29yaXRobTo6SXNRdWV1ZUZ1bGwoKSB7CisgIHJldHVybiBhdWRpb19idWZmZXJfLmZyYW1lcygpID49IGNhcGFjaXR5XzsKK30KKwordm9pZCBBdWRpb1JlbmRlcmVyQWxnb3JpdGhtOjpJbmNyZWFzZVF1ZXVlQ2FwYWNpdHkoKSB7CisgIERDSEVDS19MRShjYXBhY2l0eV8sIG1heF9jYXBhY2l0eV8pOworICBjYXBhY2l0eV8gPSBzdGQ6Om1pbigyICogY2FwYWNpdHlfLCBtYXhfY2FwYWNpdHlfKTsKK30KKworaW50NjRfdCBBdWRpb1JlbmRlcmVyQWxnb3JpdGhtOjpHZXRNZW1vcnlVc2FnZSgpIGNvbnN0IHsKKyAgcmV0dXJuIGF1ZGlvX2J1ZmZlcl8uZnJhbWVzKCkgKiBjaGFubmVsc18gKiBzaXplb2YoZmxvYXQpOworfQorCitib29sIEF1ZGlvUmVuZGVyZXJBbGdvcml0aG06OkNhblBlcmZvcm1Xc29sYSgpIGNvbnN0IHsKKyAgY29uc3QgaW50IHNlYXJjaF9ibG9ja19zaXplID0gbnVtX2NhbmRpZGF0ZV9ibG9ja3NfICsgKG9sYV93aW5kb3dfc2l6ZV8gLSAxKTsKKyAgY29uc3QgaW50IGZyYW1lcyA9IGF1ZGlvX2J1ZmZlcl8uZnJhbWVzKCk7CisgIHJldHVybiB0YXJnZXRfYmxvY2tfaW5kZXhfICsgb2xhX3dpbmRvd19zaXplXyA8PSBmcmFtZXMgJiYKKyAgICAgICAgIHNlYXJjaF9ibG9ja19pbmRleF8gKyBzZWFyY2hfYmxvY2tfc2l6ZSA8PSBmcmFtZXM7Cit9CisKK2ludCBBdWRpb1JlbmRlcmVyQWxnb3JpdGhtOjpDb252ZXJ0TWlsbGlzZWNvbmRzVG9GcmFtZXMoaW50IG1zKSBjb25zdCB7CisgIHJldHVybiBtcyAqIChzYW1wbGVzX3Blcl9zZWNvbmRfIC8KKyAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGRvdWJsZT4oYmFzZTo6VGltZTo6a01pbGxpc2Vjb25kc1BlclNlY29uZCkpOworfQorCitib29sIEF1ZGlvUmVuZGVyZXJBbGdvcml0aG06OlJ1bk9uZVdzb2xhSXRlcmF0aW9uKGRvdWJsZSBwbGF5YmFja19yYXRlKSB7CisgIGlmICghQ2FuUGVyZm9ybVdzb2xhKCkpIHJldHVybiBmYWxzZTsKKworICBHZXRPcHRpbWFsQmxvY2soKTsKKworICAvLyBPdmVybGFwLWFuZC1hZGQuCisgIGZvciAoaW50IGsgPSAwOyBrIDwgY2hhbm5lbHNfOyArK2spIHsKKyAgICBjb25zdCBmbG9hdCogY29uc3QgY2hfb3B0X2ZyYW1lID0gb3B0aW1hbF9ibG9ja18tPmNoYW5uZWwoayk7CisgICAgZmxvYXQqIGNoX291dHB1dCA9IHdzb2xhX291dHB1dF8tPmNoYW5uZWwoaykgKyBudW1fY29tcGxldGVfZnJhbWVzXzsKKyAgICBmb3IgKGludCBuID0gMDsgbiA8IG9sYV9ob3Bfc2l6ZV87ICsrbikgeworICAgICAgY2hfb3V0cHV0W25dID0gY2hfb3V0cHV0W25dICogb2xhX3dpbmRvd19bb2xhX2hvcF9zaXplXyArIG5dICsKKyAgICAgICAgICAgICAgICAgICAgIGNoX29wdF9mcmFtZVtuXSAqIG9sYV93aW5kb3dfW25dOworICAgIH0KKworICAgIC8vIENvcHkgdGhlIHNlY29uZCBoYWxmIHRvIHRoZSBvdXRwdXQuCisgICAgU2JNZW1vcnlDb3B5KCZjaF9vdXRwdXRbb2xhX2hvcF9zaXplX10sICZjaF9vcHRfZnJhbWVbb2xhX2hvcF9zaXplX10sCisgICAgICAgICAgICAgICAgIHNpemVvZigqY2hfb3B0X2ZyYW1lKSAqIG9sYV9ob3Bfc2l6ZV8pOworICB9CisKKyAgbnVtX2NvbXBsZXRlX2ZyYW1lc18gKz0gb2xhX2hvcF9zaXplXzsKKyAgVXBkYXRlT3V0cHV0VGltZShwbGF5YmFja19yYXRlLCBvbGFfaG9wX3NpemVfKTsKKyAgUmVtb3ZlT2xkSW5wdXRGcmFtZXMocGxheWJhY2tfcmF0ZSk7CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIEF1ZGlvUmVuZGVyZXJBbGdvcml0aG06OlVwZGF0ZU91dHB1dFRpbWUoZG91YmxlIHBsYXliYWNrX3JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHRpbWVfY2hhbmdlKSB7CisgIG91dHB1dF90aW1lXyArPSB0aW1lX2NoYW5nZTsKKyAgLy8gQ2VudGVyIG9mIHRoZSBzZWFyY2ggcmVnaW9uLCBpbiBmcmFtZXMuCisgIGNvbnN0IGludCBzZWFyY2hfYmxvY2tfY2VudGVyX2luZGV4ID0KKyAgICAgIHN0YXRpY19jYXN0PGludD4ob3V0cHV0X3RpbWVfICogcGxheWJhY2tfcmF0ZSArIDAuNSk7CisgIHNlYXJjaF9ibG9ja19pbmRleF8gPSBzZWFyY2hfYmxvY2tfY2VudGVyX2luZGV4IC0gc2VhcmNoX2Jsb2NrX2NlbnRlcl9vZmZzZXRfOworfQorCit2b2lkIEF1ZGlvUmVuZGVyZXJBbGdvcml0aG06OlJlbW92ZU9sZElucHV0RnJhbWVzKGRvdWJsZSBwbGF5YmFja19yYXRlKSB7CisgIGNvbnN0IGludCBlYXJsaWVzdF91c2VkX2luZGV4ID0KKyAgICAgIHN0ZDo6bWluKHRhcmdldF9ibG9ja19pbmRleF8sIHNlYXJjaF9ibG9ja19pbmRleF8pOworICBpZiAoZWFybGllc3RfdXNlZF9pbmRleCA8PSAwKSByZXR1cm47ICAvLyBOb3RoaW5nIHRvIHJlbW92ZS4KKworICAvLyBSZW1vdmUgZnJhbWVzIGZyb20gaW5wdXQgYW5kIGFkanVzdCBpbmRpY2VzIGFjY29yZGluZ2x5LgorICBhdWRpb19idWZmZXJfLlNlZWtGcmFtZXMoZWFybGllc3RfdXNlZF9pbmRleCk7CisgIHRhcmdldF9ibG9ja19pbmRleF8gLT0gZWFybGllc3RfdXNlZF9pbmRleDsKKworICAvLyBBZGp1c3Qgb3V0cHV0IGluZGV4LgorICBkb3VibGUgb3V0cHV0X3RpbWVfY2hhbmdlID0KKyAgICAgIHN0YXRpY19jYXN0PGRvdWJsZT4oZWFybGllc3RfdXNlZF9pbmRleCkgLyBwbGF5YmFja19yYXRlOworICBDSEVDS19HRShvdXRwdXRfdGltZV8sIG91dHB1dF90aW1lX2NoYW5nZSk7CisgIFVwZGF0ZU91dHB1dFRpbWUocGxheWJhY2tfcmF0ZSwgLW91dHB1dF90aW1lX2NoYW5nZSk7Cit9CisKK2ludCBBdWRpb1JlbmRlcmVyQWxnb3JpdGhtOjpXcml0ZUNvbXBsZXRlZEZyYW1lc1RvKGludCByZXF1ZXN0ZWRfZnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9CdXMqIGRlc3QpIHsKKyAgaW50IHJlbmRlcmVkX2ZyYW1lcyA9IHN0ZDo6bWluKG51bV9jb21wbGV0ZV9mcmFtZXNfLCByZXF1ZXN0ZWRfZnJhbWVzKTsKKworICBpZiAocmVuZGVyZWRfZnJhbWVzID09IDApCisgICAgcmV0dXJuIDA7ICAvLyBUaGVyZSBpcyBub3RoaW5nIHRvIHJlYWQgZnJvbSB8d3NvbGFfb3V0cHV0X3wsIHJldHVybi4KKworICB3c29sYV9vdXRwdXRfLT5Db3B5UGFydGlhbEZyYW1lc1RvKDAsIHJlbmRlcmVkX2ZyYW1lcywgZGVzdF9vZmZzZXQsIGRlc3QpOworCisgIC8vIFJlbW92ZSB0aGUgZnJhbWVzIHdoaWNoIGFyZSByZWFkLgorICBpbnQgZnJhbWVzX3RvX21vdmUgPSB3c29sYV9vdXRwdXRfLT5mcmFtZXMoKSAtIHJlbmRlcmVkX2ZyYW1lczsKKyAgZm9yIChpbnQgayA9IDA7IGsgPCBjaGFubmVsc187ICsraykgeworICAgIGZsb2F0KiBjaCA9IHdzb2xhX291dHB1dF8tPmNoYW5uZWwoayk7CisgICAgU2JNZW1vcnlNb3ZlKGNoLCAmY2hbcmVuZGVyZWRfZnJhbWVzXSwgc2l6ZW9mKCpjaCkgKiBmcmFtZXNfdG9fbW92ZSk7CisgIH0KKyAgbnVtX2NvbXBsZXRlX2ZyYW1lc18gLT0gcmVuZGVyZWRfZnJhbWVzOworICByZXR1cm4gcmVuZGVyZWRfZnJhbWVzOworfQorCitib29sIEF1ZGlvUmVuZGVyZXJBbGdvcml0aG06OlRhcmdldElzV2l0aGluU2VhcmNoUmVnaW9uKCkgY29uc3QgeworICBjb25zdCBpbnQgc2VhcmNoX2Jsb2NrX3NpemUgPSBudW1fY2FuZGlkYXRlX2Jsb2Nrc18gKyAob2xhX3dpbmRvd19zaXplXyAtIDEpOworCisgIHJldHVybiB0YXJnZXRfYmxvY2tfaW5kZXhfID49IHNlYXJjaF9ibG9ja19pbmRleF8gJiYKKyAgICAgICAgIHRhcmdldF9ibG9ja19pbmRleF8gKyBvbGFfd2luZG93X3NpemVfIDw9CisgICAgICAgICAgICAgc2VhcmNoX2Jsb2NrX2luZGV4XyArIHNlYXJjaF9ibG9ja19zaXplOworfQorCit2b2lkIEF1ZGlvUmVuZGVyZXJBbGdvcml0aG06OkdldE9wdGltYWxCbG9jaygpIHsKKyAgaW50IG9wdGltYWxfaW5kZXggPSAwOworCisgIC8vIEFuIGludGVydmFsIGFyb3VuZCBsYXN0IG9wdGltYWwgYmxvY2sgd2hpY2ggaXMgZXhjbHVkZWQgZnJvbSB0aGUgc2VhcmNoLgorICAvLyBUaGlzIGlzIHRvIHJlZHVjZSB0aGUgYnV6enkgc291bmQuIFRoZSBudW1iZXIgMTYwIGlzIHJhdGhlciBhcmJpdHJhcnkgYW5kCisgIC8vIGRlcml2ZWQgaGV1cmlzdGljYWxseS4KKyAgY29uc3QgaW50IGtFeGNsdWRlSW50ZXJ2YWxMZW5ndGhGcmFtZXMgPSAxNjA7CisgIGlmIChUYXJnZXRJc1dpdGhpblNlYXJjaFJlZ2lvbigpKSB7CisgICAgb3B0aW1hbF9pbmRleCA9IHRhcmdldF9ibG9ja19pbmRleF87CisgICAgUGVla0F1ZGlvV2l0aFplcm9QcmVwZW5kKG9wdGltYWxfaW5kZXgsIG9wdGltYWxfYmxvY2tfLmdldCgpKTsKKyAgfSBlbHNlIHsKKyAgICBQZWVrQXVkaW9XaXRoWmVyb1ByZXBlbmQodGFyZ2V0X2Jsb2NrX2luZGV4XywgdGFyZ2V0X2Jsb2NrXy5nZXQoKSk7CisgICAgUGVla0F1ZGlvV2l0aFplcm9QcmVwZW5kKHNlYXJjaF9ibG9ja19pbmRleF8sIHNlYXJjaF9ibG9ja18uZ2V0KCkpOworICAgIGludCBsYXN0X29wdGltYWwgPQorICAgICAgICB0YXJnZXRfYmxvY2tfaW5kZXhfIC0gb2xhX2hvcF9zaXplXyAtIHNlYXJjaF9ibG9ja19pbmRleF87CisgICAgaW50ZXJuYWw6OkludGVydmFsIGV4Y2x1ZGVfaXRlcnZhbCA9CisgICAgICAgIHN0ZDo6bWFrZV9wYWlyKGxhc3Rfb3B0aW1hbCAtIGtFeGNsdWRlSW50ZXJ2YWxMZW5ndGhGcmFtZXMgLyAyLAorICAgICAgICAgICAgICAgICAgICAgICBsYXN0X29wdGltYWwgKyBrRXhjbHVkZUludGVydmFsTGVuZ3RoRnJhbWVzIC8gMik7CisKKyAgICAvLyB8b3B0aW1hbF9pbmRleHwgaXMgaW4gZnJhbWVzIGFuZCBpdCBpcyByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZQorICAgIC8vIHxzZWFyY2hfYmxvY2tffC4KKyAgICBvcHRpbWFsX2luZGV4ID0gaW50ZXJuYWw6Ok9wdGltYWxJbmRleCgKKyAgICAgICAgc2VhcmNoX2Jsb2NrXy5nZXQoKSwgdGFyZ2V0X2Jsb2NrXy5nZXQoKSwgZXhjbHVkZV9pdGVydmFsKTsKKworICAgIC8vIFRyYW5zbGF0ZSB8aW5kZXh8IHcuci50LiB0aGUgYmVnaW5uaW5nIG9mIHxhdWRpb19idWZmZXJffCBhbmQgZXh0cmFjdCB0aGUKKyAgICAvLyBvcHRpbWFsIGJsb2NrLgorICAgIG9wdGltYWxfaW5kZXggKz0gc2VhcmNoX2Jsb2NrX2luZGV4XzsKKyAgICBQZWVrQXVkaW9XaXRoWmVyb1ByZXBlbmQob3B0aW1hbF9pbmRleCwgb3B0aW1hbF9ibG9ja18uZ2V0KCkpOworCisgICAgLy8gTWFrZSBhIHRyYW5zaXRpb24gZnJvbSB0YXJnZXQgYmxvY2sgdG8gdGhlIG9wdGltYWwgYmxvY2sgaWYgZGlmZmVyZW50LgorICAgIC8vIFRhcmdldCBibG9jayBoYXMgdGhlIGJlc3QgY29udGludWF0aW9uIHRvIHRoZSBjdXJyZW50IG91dHB1dC4KKyAgICAvLyBPcHRpbWFsIGJsb2NrIGlzIHRoZSBtb3N0IHNpbWlsYXIgYmxvY2sgdG8gdGhlIHRhcmdldCwgaG93ZXZlciwgaXQgbWlnaHQKKyAgICAvLyBpbnRyb2R1Y2Ugc29tZSBkaXNjb250aW51aXR5IHdoZW4gb3Zlci1sYXAtYWRkZWQuIFRoZXJlZm9yZSwgd2UgY29tYmluZQorICAgIC8vIHRoZW0gZm9yIGEgc21vb3RoZXIgdHJhbnNpdGlvbi4gVGhlIGxlbmd0aCBvZiB0cmFuc2l0aW9uIHdpbmRvdyBpcyB0d2ljZQorICAgIC8vIGFzIHRoYXQgb2YgdGhlIG9wdGltYWwtYmxvY2sgd2hpY2ggbWFrZXMgaXQgbGlrZSBhIHdlaWdodGluZyBmdW5jdGlvbgorICAgIC8vIHdoZXJlIHRhcmdldC1ibG9jayBoYXMgaGlnaGVyIHdlaWdodCBjbG9zZSB0byB6ZXJvICh3ZWlnaHQgb2YgMSBhdCBpbmRleAorICAgIC8vIDApIGFuZCBsb3dlciB3ZWlnaHQgY2xvc2UgdGhlIGVuZC4KKyAgICBmb3IgKGludCBrID0gMDsgayA8IGNoYW5uZWxzXzsgKytrKSB7CisgICAgICBmbG9hdCogY2hfb3B0ID0gb3B0aW1hbF9ibG9ja18tPmNoYW5uZWwoayk7CisgICAgICBjb25zdCBmbG9hdCogY29uc3QgY2hfdGFyZ2V0ID0gdGFyZ2V0X2Jsb2NrXy0+Y2hhbm5lbChrKTsKKyAgICAgIGZvciAoaW50IG4gPSAwOyBuIDwgb2xhX3dpbmRvd19zaXplXzsgKytuKSB7CisgICAgICAgIGNoX29wdFtuXSA9IGNoX29wdFtuXSAqIHRyYW5zaXRpb25fd2luZG93X1tuXSArCisgICAgICAgICAgICAgICAgICAgIGNoX3RhcmdldFtuXSAqIHRyYW5zaXRpb25fd2luZG93X1tvbGFfd2luZG93X3NpemVfICsgbl07CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gTmV4dCB0YXJnZXQgaXMgb25lIGhvcCBhaGVhZCBvZiB0aGUgY3VycmVudCBvcHRpbWFsLgorICB0YXJnZXRfYmxvY2tfaW5kZXhfID0gb3B0aW1hbF9pbmRleCArIG9sYV9ob3Bfc2l6ZV87Cit9CisKK3ZvaWQgQXVkaW9SZW5kZXJlckFsZ29yaXRobTo6UGVla0F1ZGlvV2l0aFplcm9QcmVwZW5kKGludCByZWFkX29mZnNldF9mcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0J1cyogZGVzdCkgeworICBDSEVDS19MRShyZWFkX29mZnNldF9mcmFtZXMgKyBkZXN0LT5mcmFtZXMoKSwgYXVkaW9fYnVmZmVyXy5mcmFtZXMoKSk7CisKKyAgaW50IHdyaXRlX29mZnNldCA9IDA7CisgIGludCBudW1fZnJhbWVzX3RvX3JlYWQgPSBkZXN0LT5mcmFtZXMoKTsKKyAgaWYgKHJlYWRfb2Zmc2V0X2ZyYW1lcyA8IDApIHsKKyAgICBpbnQgbnVtX3plcm9fZnJhbWVzX2FwcGVuZGVkID0KKyAgICAgICAgc3RkOjptaW4oLXJlYWRfb2Zmc2V0X2ZyYW1lcywgbnVtX2ZyYW1lc190b19yZWFkKTsKKyAgICByZWFkX29mZnNldF9mcmFtZXMgPSAwOworICAgIG51bV9mcmFtZXNfdG9fcmVhZCAtPSBudW1femVyb19mcmFtZXNfYXBwZW5kZWQ7CisgICAgd3JpdGVfb2Zmc2V0ID0gbnVtX3plcm9fZnJhbWVzX2FwcGVuZGVkOworICAgIGRlc3QtPlplcm9GcmFtZXMobnVtX3plcm9fZnJhbWVzX2FwcGVuZGVkKTsKKyAgfQorICBhdWRpb19idWZmZXJfLlBlZWtGcmFtZXMobnVtX2ZyYW1lc190b19yZWFkLCByZWFkX29mZnNldF9mcmFtZXMsIHdyaXRlX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QpOworfQorCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2F1ZGlvX3JlbmRlcmVyX2FsZ29yaXRobS5oIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvYXVkaW9fcmVuZGVyZXJfYWxnb3JpdGhtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJiZWNjOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2F1ZGlvX3JlbmRlcmVyX2FsZ29yaXRobS5oCkBAIC0wLDAgKzEsMjE4IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBBdWRpb1JlbmRlcmVyQWxnb3JpdGhtIGJ1ZmZlcnMgYW5kIHRyYW5zZm9ybXMgYXVkaW8gZGF0YS4gVGhlIG93bmVyIG9mCisvLyB0aGlzIG9iamVjdCBwcm92aWRlcyBhdWRpbyBkYXRhIHRvIHRoZSBvYmplY3QgdGhyb3VnaCBFbnF1ZXVlQnVmZmVyKCkgYW5kCisvLyByZXF1ZXN0cyBkYXRhIGZyb20gdGhlIGJ1ZmZlciB2aWEgRmlsbEJ1ZmZlcigpLgorLy8KKy8vIFRoaXMgY2xhc3MgaXMgKm5vdCogdGhyZWFkLXNhZmUuIENhbGxzIHRvIGVucXVldWUgYW5kIHJldHJpZXZlIGRhdGEgbXVzdCBiZQorLy8gbG9ja2VkIGlmIGNhbGxlZCBmcm9tIG11bHRpcGxlIHRocmVhZHMuCisvLworLy8gQXVkaW9SZW5kZXJlckFsZ29yaXRobSB1c2VzIHRoZSBXYXZlZm9ybSBTaW1pbGFyaXR5IE92ZXJsYXAgYW5kIEFkZCAoV1NPTEEpCisvLyBhbGdvcml0aG0gdG8gc3RyZXRjaCBvciBjb21wcmVzcyBhdWRpbyBkYXRhIHRvIG1lZXQgcGxheWJhY2sgc3BlZWRzIGxlc3MgdGhhbgorLy8gb3IgZ3JlYXRlciB0aGFuIHRoZSBuYXR1cmFsIHBsYXliYWNrIG9mIHRoZSBhdWRpbyBzdHJlYW0uIFRoZSBhbGdvcml0aG0KKy8vIHByZXNlcnZlcyBsb2NhbCBwcm9wZXJ0aWVzIG9mIHRoZSBhdWRpbywgdGhlcmVmb3JlLCBwaXRjaCBhbmQgaGFybW9uaWNzIGFyZQorLy8gYXJlIHByZXNlcnZlZC4gU2VlIGF1ZGlvX3JlbmRlcmVyX2FsZ29yaXRoLmNjIGZvciBhIG1vcmUgZWxhYm9yYXRlCisvLyBkZXNjcmlwdGlvbiBvZiB0aGUgYWxnb3JpdGhtLgorLy8KKy8vIEF1ZGlvIGF0IHZlcnkgbG93IG9yIHZlcnkgaGlnaCBwbGF5YmFjayByYXRlcyBhcmUgbXV0ZWQgdG8gcHJlc2VydmUgcXVhbGl0eS4KKworI2lmbmRlZiBDT0JBTFRfTUVESUFfRklMVEVSU19BVURJT19SRU5ERVJFUl9BTEdPUklUSE1fSF8KKyNkZWZpbmUgQ09CQUxUX01FRElBX0ZJTFRFUlNfQVVESU9fUkVOREVSRVJfQUxHT1JJVEhNX0hfCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlICJiYXNlL2Jhc2ljdHlwZXMuaCIKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgorI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL2F1ZGlvX2J1ZmZlci5oIgorI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL2F1ZGlvX2J1ZmZlcl9xdWV1ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL2F1ZGlvX3BhcmFtZXRlcnMuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvdHlwZXMuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgbWVkaWEgeworCitjbGFzcyBBdWRpb0J1czsKKworY2xhc3MgTUVESUFfRVhQT1JUIEF1ZGlvUmVuZGVyZXJBbGdvcml0aG0geworIHB1YmxpYzoKKyAgQXVkaW9SZW5kZXJlckFsZ29yaXRobSgpOworICB+QXVkaW9SZW5kZXJlckFsZ29yaXRobSgpOworCisgIC8vIEluaXRpYWxpemVzIHRoaXMgb2JqZWN0IHdpdGggaW5mb3JtYXRpb24gYWJvdXQgdGhlIGF1ZGlvIHN0cmVhbS4KKyAgdm9pZCBJbml0aWFsaXplKGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgcGFyYW1zKTsKKworICAvLyBUcmllcyB0byBmaWxsIHxyZXF1ZXN0ZWRfZnJhbWVzfCBmcmFtZXMgaW50byB8ZGVzdHwgd2l0aCBwb3NzaWJseSBzY2FsZWQKKyAgLy8gZGF0YSBmcm9tIG91ciB8YXVkaW9fYnVmZmVyX3wuIERhdGEgaXMgc2NhbGVkIGJhc2VkIG9uIHxwbGF5YmFja19yYXRlfCwKKyAgLy8gdXNpbmcgYSB2YXJpYXRpb24gb2YgdGhlIE92ZXJsYXAtQWRkIG1ldGhvZCB0byBjb21iaW5lIHNhbXBsZSB3aW5kb3dzLgorICAvLworICAvLyBEYXRhIGZyb20gfGF1ZGlvX2J1ZmZlcl98IGlzIGNvbnN1bWVkIGluIHByb3BvcnRpb24gdG8gdGhlIHBsYXliYWNrIHJhdGUuCisgIC8vCisgIC8vIHxkZXN0X29mZnNldHwgaXMgdGhlIG9mZnNldCBpbiBmcmFtZXMgZm9yIHdyaXRpbmcgaW50byB8ZGVzdHwuCisgIC8vCisgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBmcmFtZXMgY29waWVkIGludG8gfGRlc3R8LgorICBpbnQgRmlsbEJ1ZmZlcihBdWRpb0J1cyogZGVzdCwgaW50IGRlc3Rfb2Zmc2V0LCBpbnQgcmVxdWVzdGVkX2ZyYW1lcywKKyAgICAgICAgICAgICAgICAgZG91YmxlIHBsYXliYWNrX3JhdGUpOworCisgIC8vIENsZWFycyB8YXVkaW9fYnVmZmVyX3wuCisgIHZvaWQgRmx1c2hCdWZmZXJzKCk7CisKKyAgLy8gRW5xdWV1ZXMgYSBidWZmZXIuIEl0IGlzIGNhbGxlZCBmcm9tIHRoZSBvd25lciBvZiB0aGUgYWxnb3JpdGhtIGFmdGVyIGEKKyAgLy8gcmVhZCBjb21wbGV0ZXMuCisgIHZvaWQgRW5xdWV1ZUJ1ZmZlcihjb25zdCBzY29wZWRfcmVmcHRyPEF1ZGlvQnVmZmVyPiYgYnVmZmVyX2luKTsKKworICAvLyBSZXR1cm5zIHRydWUgaWYgfGF1ZGlvX2J1ZmZlcl98IGlzIGF0IG9yIGV4Y2VlZHMgY2FwYWNpdHkuCisgIGJvb2wgSXNRdWV1ZUZ1bGwoKTsKKworICAvLyBSZXR1cm5zIHRoZSBjYXBhY2l0eSBvZiB8YXVkaW9fYnVmZmVyX3wgaW4gZnJhbWVzLgorICBpbnQgUXVldWVDYXBhY2l0eSgpIGNvbnN0IHsgcmV0dXJuIGNhcGFjaXR5XzsgfQorCisgIC8vIEluY3JlYXNlIHRoZSBjYXBhY2l0eSBvZiB8YXVkaW9fYnVmZmVyX3wgaWYgcG9zc2libGUuCisgIHZvaWQgSW5jcmVhc2VRdWV1ZUNhcGFjaXR5KCk7CisKKyAgLy8gUmV0dXJucyBhbiBlc3RpbWF0ZSBvZiB0aGUgYW1vdW50IG9mIG1lbW9yeSAoaW4gYnl0ZXMpIHVzZWQgZm9yIGZyYW1lcy4KKyAgaW50NjRfdCBHZXRNZW1vcnlVc2FnZSgpIGNvbnN0OworCisgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBmcmFtZXMgbGVmdCBpbiB8YXVkaW9fYnVmZmVyX3wsIHdoaWNoIG1heSBiZSBsYXJnZXIKKyAgLy8gdGhhbiBRdWV1ZUNhcGFjaXR5KCkgaW4gdGhlIGV2ZW50IHRoYXQgRW5xdWV1ZUJ1ZmZlcigpIGRlbGl2ZXJlZCBtb3JlIGRhdGEKKyAgLy8gdGhhbiB8YXVkaW9fYnVmZmVyX3wgd2FzIGludGVuZGluZyB0byBob2xkLgorICBpbnQgZnJhbWVzX2J1ZmZlcmVkKCkgeyByZXR1cm4gYXVkaW9fYnVmZmVyXy5mcmFtZXMoKTsgfQorCisgIC8vIFJldHVybnMgdGhlIHNhbXBsZXMgcGVyIHNlY29uZCBmb3IgdGhpcyBhdWRpbyBzdHJlYW0uCisgIGludCBzYW1wbGVzX3Blcl9zZWNvbmQoKSB7IHJldHVybiBzYW1wbGVzX3Blcl9zZWNvbmRfOyB9CisKKyBwcml2YXRlOgorICAvLyBXaXRoaW4gfHNlYXJjaF9ibG9ja198LCBmaW5kIHRoZSBibG9jayBvZiBkYXRhIHRoYXQgaXMgbW9zdCBzaW1pbGFyIHRvCisgIC8vIHx0YXJnZXRfYmxvY2tffCwgYW5kIHdyaXRlIGl0IGluIHxvcHRpbWFsX2Jsb2NrX3wuIFRoaXMgbWV0aG9kIGFzc3VtZXMgdGhhdAorICAvLyB0aGVyZSBpcyBlbm91Z2ggZGF0YSB0byBwZXJmb3JtIGEgc2VhcmNoLCBpLmUuIHxzZWFyY2hfYmxvY2tffCBhbmQKKyAgLy8gfHRhcmdldF9ibG9ja198IGNhbiBiZSBleHRyYWN0ZWQgZnJvbSB0aGUgYXZhaWxhYmxlIGZyYW1lcy4KKyAgdm9pZCBHZXRPcHRpbWFsQmxvY2soKTsKKworICAvLyBSZWFkIGEgbWF4aW11bSBvZiB8cmVxdWVzdGVkX2ZyYW1lc3wgZnJhbWVzIGZyb20gfHdzb2xhX291dHB1dF98LiBSZXR1cm5zCisgIC8vIG51bWJlciBvZiBmcmFtZXMgYWN0dWFsbHkgcmVhZC4KKyAgaW50IFdyaXRlQ29tcGxldGVkRnJhbWVzVG8oaW50IHJlcXVlc3RlZF9mcmFtZXMsIGludCBvdXRwdXRfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0J1cyogZGVzdCk7CisKKyAgLy8gRmlsbCB8ZGVzdHwgd2l0aCBmcmFtZXMgZnJvbSB8YXVkaW9fYnVmZmVyX3wgc3RhcnRpbmcgZnJvbSBmcmFtZQorICAvLyB8cmVhZF9vZmZzZXRfZnJhbWVzfC4gfGRlc3R8IGlzIGV4cGVjdGVkIHRvIGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mCisgIC8vIGNoYW5uZWxzIGFzIHxhdWRpb19idWZmZXJffC4gQSBuZWdhdGl2ZSBvZmZzZXQsIGkuZS4KKyAgLy8gfHJlYWRfb2Zmc2V0X2ZyYW1lc3wgPCAwLCBpcyBhY2NlcHRlZCBhc3N1bWluZyB0aGF0IHxhdWRpb19idWZmZXJ8IGlzIHplcm8KKyAgLy8gZm9yIG5lZ2F0aXZlIGluZGljZXMuIFRoaXMgbWlnaHQgaGFwcGVuIGZvciBmZXcgZmlyc3QgZnJhbWVzLiBUaGlzIG1ldGhvZAorICAvLyBhc3N1bWVzIHRoZXJlIGlzIGVub3VnaCBmcmFtZXMgdG8gZmlsbCB8ZGVzdHwsIGkuZS4gfHJlYWRfb2Zmc2V0X2ZyYW1lc3wgKworICAvLyB8ZGVzdC0+ZnJhbWVzKCl8IGRvZXMgbm90IGV4dGVuZCB0byBmdXR1cmUuCisgIHZvaWQgUGVla0F1ZGlvV2l0aFplcm9QcmVwZW5kKGludCByZWFkX29mZnNldF9mcmFtZXMsIEF1ZGlvQnVzKiBkZXN0KTsKKworICAvLyBSdW4gb25lIGl0ZXJhdGlvbiBvZiBXU09MQSwgaWYgdGhlcmUgYXJlIHN1ZmZpY2llbnQgZnJhbWVzLiBUaGlzIHdpbGwKKyAgLy8gb3ZlcmxhcC1hbmQtYWRkIG9uZSBibG9jayB0byB8d3NvbGFfb3V0cHV0X3wsIGhlbmNlLCB8bnVtX2NvbXBsZXRlX2ZyYW1lc198CisgIC8vIGlzIGluY3JlbWVudGVkIGJ5IHxvbGFfaG9wX3NpemVffC4KKyAgYm9vbCBSdW5PbmVXc29sYUl0ZXJhdGlvbihkb3VibGUgcGxheWJhY2tfcmF0ZSk7CisKKyAgLy8gU2VlayB8YXVkaW9fYnVmZmVyX3wgZm9yd2FyZCB0byByZW1vdmUgZnJhbWVzIGZyb20gaW5wdXQgdGhhdCBhcmUgbm90IHVzZWQKKyAgLy8gYW55IG1vcmUuIFN0YXRlIG9mIHRoZSBXU09MQSB3aWxsIGJlIHVwZGF0ZWQgYWNjb3JkaW5nbHkuCisgIHZvaWQgUmVtb3ZlT2xkSW5wdXRGcmFtZXMoZG91YmxlIHBsYXliYWNrX3JhdGUpOworCisgIC8vIFVwZGF0ZSB8b3V0cHV0X3RpbWVffCBieSB8dGltZV9jaGFuZ2V8LiBJbiB0dXJuIHxzZWFyY2hfYmxvY2tfaW5kZXhffCBpcworICAvLyB1cGRhdGVkLgorICB2b2lkIFVwZGF0ZU91dHB1dFRpbWUoZG91YmxlIHBsYXliYWNrX3JhdGUsIGRvdWJsZSB0aW1lX2NoYW5nZSk7CisKKyAgLy8gSXMgfHRhcmdldF9ibG9ja198IGZ1bGx5IHdpdGhpbiB8c2VhcmNoX2Jsb2NrX3w/IElmIHNvLCB3ZSBkb24ndCBuZWVkIHRvCisgIC8vIHBlcmZvcm0gdGhlIHNlYXJjaC4KKyAgYm9vbCBUYXJnZXRJc1dpdGhpblNlYXJjaFJlZ2lvbigpIGNvbnN0OworCisgIC8vIERvIHdlIGhhdmUgZW5vdWdoIGRhdGEgdG8gcGVyZm9ybSBvbmUgcm91bmQgb2YgV1NPTEE/CisgIGJvb2wgQ2FuUGVyZm9ybVdzb2xhKCkgY29uc3Q7CisKKyAgLy8gQ29udmVydHMgYSB0aW1lIGluIG1pbGxpc2Vjb25kcyB0byBmcmFtZXMgdXNpbmcgfHNhbXBsZXNfcGVyX3NlY29uZF98LgorICBpbnQgQ29udmVydE1pbGxpc2Vjb25kc1RvRnJhbWVzKGludCBtcykgY29uc3Q7CisKKyAgLy8gTnVtYmVyIG9mIGNoYW5uZWxzIGluIGF1ZGlvIHN0cmVhbS4KKyAgaW50IGNoYW5uZWxzXzsKKworICAvLyBTYW1wbGUgcmF0ZSBvZiBhdWRpbyBzdHJlYW0uCisgIGludCBzYW1wbGVzX3Blcl9zZWNvbmRfOworCisgIC8vIEJ1ZmZlcmVkIGF1ZGlvIGRhdGEuCisgIEF1ZGlvQnVmZmVyUXVldWUgYXVkaW9fYnVmZmVyXzsKKworICAvLyBJZiBtdXRlZCwga2VlcCB0cmFjayBvZiBwYXJ0aWFsIGZyYW1lcyB0aGF0IHNob3VsZCBoYXZlIGJlZW4gc2tpcHBlZCBvdmVyLgorICBkb3VibGUgbXV0ZWRfcGFydGlhbF9mcmFtZV87CisKKyAgLy8gSG93IG1hbnkgZnJhbWVzIHRvIGhhdmUgaW4gdGhlIHF1ZXVlIGJlZm9yZSB3ZSByZXBvcnQgdGhlIHF1ZXVlIGlzIGZ1bGwuCisgIGludCBjYXBhY2l0eV87CisKKyAgLy8gQm9vayBrZWVwaW5nIG9mIHRoZSBjdXJyZW50IHRpbWUgb2YgZ2VuZXJhdGVkIGF1ZGlvLCBpbiBmcmFtZXMuIFRoaXMKKyAgLy8gc2hvdWxkIGJlIGFwcHJvcHJpYXRlbHkgdXBkYXRlZCB3aGVuIG91dCBzYW1wbGVzIGFyZSBnZW5lcmF0ZWQsIHJlZ2FyZGxlc3MKKyAgLy8gb2Ygd2hldGhlciB3ZSBwdXNoIHNhbXBsZXMgb3V0IHdoZW4gRmlsbEJ1ZmZlcigpIGlzIGNhbGxlZCBvciB3ZSBzdG9yZQorICAvLyBhdWRpbyBpbiB8d3NvbGFfb3V0cHV0X3wgZm9yIHRoZSBzdWJzZXF1ZW50IGNhbGxzIHRvIEZpbGxCdWZmZXIoKS4KKyAgLy8gRnVydGhlcm1vcmUsIGlmIHNhbXBsZXMgZnJvbSB8YXVkaW9fYnVmZmVyX3wgYXJlIGV2aWN0ZWQgdGhlbiB0aGlzCisgIC8vIG1lbWJlciB2YXJpYWJsZSBzaG91bGQgYmUgdXBkYXRlZCBiYXNlZCBvbiB8cGxheWJhY2tfcmF0ZV98LgorICAvLyBOb3RlIHRoYXQgdGhpcyBtZW1iZXIgc2hvdWxkIGJlIHVwZGF0ZWQgT05MWSBieSBjYWxsaW5nIFVwZGF0ZU91dHB1dFRpbWUoKSwKKyAgLy8gc28gdGhhdCB8c2VhcmNoX2Jsb2NrX2luZGV4X3wgaXMgdXBkYXRlIGFjY29yZGluZ2x5LgorICBkb3VibGUgb3V0cHV0X3RpbWVfOworCisgIC8vIFRoZSBvZmZzZXQgb2YgdGhlIGNlbnRlciBmcmFtZSBvZiB8c2VhcmNoX2Jsb2NrX3wgdy5yLnQuIGl0cyBmaXJzdCBmcmFtZS4KKyAgaW50IHNlYXJjaF9ibG9ja19jZW50ZXJfb2Zmc2V0XzsKKworICAvLyBJbmRleCBvZiB0aGUgYmVnaW5uaW5nIG9mIHRoZSB8c2VhcmNoX2Jsb2NrX3wsIGluIGZyYW1lcy4KKyAgaW50IHNlYXJjaF9ibG9ja19pbmRleF87CisKKyAgLy8gTnVtYmVyIG9mIEJsb2NrcyB0byBzZWFyY2ggdG8gZmluZCB0aGUgbW9zdCBzaW1pbGFyIG9uZSB0byB0aGUgdGFyZ2V0CisgIC8vIGZyYW1lLgorICBpbnQgbnVtX2NhbmRpZGF0ZV9ibG9ja3NfOworCisgIC8vIEluZGV4IG9mIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRhcmdldCBibG9jaywgY291bnRlZCBpbiBmcmFtZXMuCisgIGludCB0YXJnZXRfYmxvY2tfaW5kZXhfOworCisgIC8vIE92ZXJsYXAtYW5kLWFkZCB3aW5kb3cgc2l6ZSBpbiBmcmFtZXMuCisgIGludCBvbGFfd2luZG93X3NpemVfOworCisgIC8vIFRoZSBob3Agc2l6ZSBvZiBvdmVybGFwLWFuZC1hZGQgaW4gZnJhbWVzLiBUaGlzIGltcGxlbWVudGF0aW9uIGFzc3VtZXMgNTAlCisgIC8vIG92ZXJsYXAtYW5kLWFkZC4KKyAgaW50IG9sYV9ob3Bfc2l6ZV87CisKKyAgLy8gTnVtYmVyIG9mIGZyYW1lcyBpbiB8d3NvbGFfb3V0cHV0X3wgdGhhdCBvdmVybGFwLWFuZC1hZGQgaXMgY29tcGxldGVkIGZvcgorICAvLyB0aGVtIGFuZCBjYW4gYmUgY29waWVkIHRvIG91dHB1dCBpZiBGaWxsQnVmZmVyKCkgaXMgY2FsbGVkLiBJdCBhbHNvCisgIC8vIHNwZWNpZmllcyB0aGUgaW5kZXggd2hlcmUgdGhlIG5leHQgV1NPTEEgd2luZG93IGhhcyB0byBvdmVybGFwLWFuZC1hZGQuCisgIGludCBudW1fY29tcGxldGVfZnJhbWVzXzsKKworICAvLyBUaGlzIHN0b3JlcyBhIHBhcnQgb2YgdGhlIG91dHB1dCB0aGF0IGlzIGNyZWF0ZWQgYnV0IGNvdWxkbid0IGJlIHJlbmRlcmVkLgorICAvLyBPdXRwdXQgaXMgZ2VuZXJhdGVkIGZyYW1lLWJ5LWZyYW1lIHdoaWNoIGF0IHNvbWUgcG9pbnQgbWlnaHQgZXhjZWVkIHRoZQorICAvLyBudW1iZXIgb2YgcmVxdWVzdGVkIHNhbXBsZXMuIEZ1cnRoZXJtb3JlLCBkdWUgdG8gb3ZlcmxhcC1hbmQtYWRkLAorICAvLyB0aGUgbGFzdCBoYWxmLXdpbmRvdyBvZiB0aGUgb3V0cHV0IGlzIGluY29tcGxldGUsIHdoaWNoIGlzIHN0b3JlZCBpbiB0aGlzCisgIC8vIGJ1ZmZlci4KKyAgc3RkOjp1bmlxdWVfcHRyPEF1ZGlvQnVzPiB3c29sYV9vdXRwdXRfOworCisgIC8vIE92ZXJsYXAtYW5kLWFkZCB3aW5kb3cuCisgIHN0ZDo6dW5pcXVlX3B0cjxmbG9hdFtdPiBvbGFfd2luZG93XzsKKworICAvLyBUcmFuc2l0aW9uIHdpbmRvdywgdXNlZCB0byB1cGRhdGUgfG9wdGltYWxfYmxvY2tffCBieSBhIHdlaWdodGVkIHN1bSBvZgorICAvLyB8b3B0aW1hbF9ibG9ja198IGFuZCB8dGFyZ2V0X2Jsb2NrX3wuCisgIHN0ZDo6dW5pcXVlX3B0cjxmbG9hdFtdPiB0cmFuc2l0aW9uX3dpbmRvd187CisKKyAgLy8gQXV4aWxpYXJ5IHZhcmlhYmxlcyB0byBhdm9pZCBhbGxvY2F0aW9uIGluIGV2ZXJ5IGl0ZXJhdGlvbi4KKworICAvLyBTdG9yZXMgdGhlIG9wdGltYWwgYmxvY2sgaW4gZXZlcnkgaXRlcmF0aW9uLiBUaGlzIGlzIHRoZSBtb3N0CisgIC8vIHNpbWlsYXIgYmxvY2sgdG8gfHRhcmdldF9ibG9ja198IHdpdGhpbiB8c2VhcmNoX2Jsb2NrX3wgYW5kIGl0IGlzCisgIC8vIG92ZXJsYXAtYW5kLWFkZGVkIHRvIHx3c29sYV9vdXRwdXRffC4KKyAgc3RkOjp1bmlxdWVfcHRyPEF1ZGlvQnVzPiBvcHRpbWFsX2Jsb2NrXzsKKworICAvLyBBIGJsb2NrIG9mIGRhdGEgdGhhdCBzZWFyY2ggaXMgcGVyZm9ybWVkIG92ZXIgdG8gZmluZCB0aGUgfG9wdGltYWxfYmxvY2tffC4KKyAgc3RkOjp1bmlxdWVfcHRyPEF1ZGlvQnVzPiBzZWFyY2hfYmxvY2tfOworCisgIC8vIFN0b3JlcyB0aGUgdGFyZ2V0IGJsb2NrLCBkZW5vdGVkIGFzIHx0YXJnZXR8IGFib3ZlLiB8c2VhcmNoX2Jsb2NrX3wgaXMKKyAgLy8gc2VhcmNoZWQgZm9yIGEgYmxvY2sgKHxvcHRpbWFsX2Jsb2NrX3wpIHRoYXQgaXMgbW9zdCBzaW1pbGFyIHRvCisgIC8vIHx0YXJnZXRfYmxvY2tffC4KKyAgc3RkOjp1bmlxdWVfcHRyPEF1ZGlvQnVzPiB0YXJnZXRfYmxvY2tfOworCisgIC8vIFRoZSBpbml0aWFsIGFuZCBtYXhpbXVtIGNhcGFjaXR5IGNhbGN1bGF0ZWQgYnkgSW5pdGlhbGl6ZSgpLgorICBpbnQgaW5pdGlhbF9jYXBhY2l0eV87CisgIGludCBtYXhfY2FwYWNpdHlfOworCisgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihBdWRpb1JlbmRlcmVyQWxnb3JpdGhtKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorCisjZW5kaWYgIC8vIENPQkFMVF9NRURJQV9GSUxURVJTX0FVRElPX1JFTkRFUkVSX0FMR09SSVRITV9IXwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvYXVkaW9fcmVuZGVyZXJfaW1wbF9pbnRlcm5hbC5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2F1ZGlvX3JlbmRlcmVyX2ltcGxfaW50ZXJuYWwuY2MKaW5kZXggMTNiOWRiNC4uOTZlMzhhNyAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvYXVkaW9fcmVuZGVyZXJfaW1wbF9pbnRlcm5hbC5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9hdWRpb19yZW5kZXJlcl9pbXBsX2ludGVybmFsLmNjCkBAIC0yMjAsNiArMjIwLDEyIEBACiAgICppc19wbGF5aW5nID0gdHJ1ZTsKICAgKmZyYW1lc19pbl9idWZmZXIgPSBmcmFtZXNfaW5fYnVmZmVyXzsKICAgKm9mZnNldF9pbl9mcmFtZXMgPSBvZmZzZXRfaW5fZnJhbWVzXzsKKworICBpZiAoIWVuZF9vZl9zdHJlYW1fZGVjb2RlZF8gJiYgIXJlYWRfZnJvbV9kZWNvZGVyX2Nsb3N1cmVfLmlzX3ZhbGlkKCkpIHsKKyAgICByZWFkX2Zyb21fZGVjb2Rlcl9jbG9zdXJlXyA9CisgICAgICAgIEJpbmQoJkF1ZGlvUmVuZGVyZXJJbXBsOjpSZWFkRnJvbURlY29kZXIsIHRoaXMpOworICAgIGpvYl9xdWV1ZV8tPlNjaGVkdWxlKHJlYWRfZnJvbV9kZWNvZGVyX2Nsb3N1cmVfKTsKKyAgfQogfQogCiB2b2lkIEF1ZGlvUmVuZGVyZXJJbXBsOjpDb25zdW1lRnJhbWVzKGludCBmcmFtZXNfY29uc3VtZWQpIHsKQEAgLTIzMSwxNSArMjM3LDYgQEAKICAgZnJhbWVzX2luX2J1ZmZlcl8gLT0gZnJhbWVzX2NvbnN1bWVkOwogICBmcmFtZXNfY29uc3VtZWRfICs9IGZyYW1lc19jb25zdW1lZDsKICAgZnJhbWVzX2NvbnN1bWVkX3NldF9hdF8gPSBTYlRpbWVHZXRNb25vdG9uaWNOb3coKTsKLQotICBib29sIGRlY29kZWRfYXVkaW9fYXZhaWxhYmxlID0KLSAgICAgIHBlbmRpbmdfZGVjb2RlZF9hdWRpb18gfHwKLSAgICAgIChlbmRfb2Zfc3RyZWFtX3dyaXR0ZW5fICYmICFlbmRfb2Zfc3RyZWFtX2RlY29kZWRfKTsKLSAgaWYgKGRlY29kZWRfYXVkaW9fYXZhaWxhYmxlICYmICFyZWFkX2Zyb21fZGVjb2Rlcl9jbG9zdXJlXy5pc192YWxpZCgpKSB7Ci0gICAgcmVhZF9mcm9tX2RlY29kZXJfY2xvc3VyZV8gPQotICAgICAgICBCaW5kKCZBdWRpb1JlbmRlcmVySW1wbDo6UmVhZEZyb21EZWNvZGVyLCB0aGlzKTsKLSAgICBqb2JfcXVldWVfLT5TY2hlZHVsZShyZWFkX2Zyb21fZGVjb2Rlcl9jbG9zdXJlXyk7Ci0gIH0KIH0KIAogdm9pZCBBdWRpb1JlbmRlcmVySW1wbDo6TG9nRnJhbWVzQ29uc3VtZWQoKSB7CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci93c29sYV9pbnRlcm5hbHMuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci93c29sYV9pbnRlcm5hbHMuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA3ODkzZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3dzb2xhX2ludGVybmFscy5jYwpAQCAtMCwwICsxLDI2MCBAQAorLy8gQ29weXJpZ2h0IDIwMTMgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBNU1ZDKysgcmVxdWlyZXMgdGhpcyB0byBiZSBzZXQgYmVmb3JlIGFueSBvdGhlciBpbmNsdWRlcyB0byBnZXQgTV9QSS4KKyNkZWZpbmUgX1VTRV9NQVRIX0RFRklORVMKKworI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9maWx0ZXJzL3dzb2xhX2ludGVybmFscy5oIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNtYXRoPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKKyNpbmNsdWRlICJjb2JhbHQvbWVkaWEvYmFzZS9hdWRpb19idXMuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIG1lZGlhIHsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworYm9vbCBJbkludGVydmFsKGludCBuLCBJbnRlcnZhbCBxKSB7IHJldHVybiBuID49IHEuZmlyc3QgJiYgbiA8PSBxLnNlY29uZDsgfQorCitmbG9hdCBNdWx0aUNoYW5uZWxTaW1pbGFyaXR5TWVhc3VyZShjb25zdCBmbG9hdCogZG90X3Byb2RfYV9iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGVuZXJneV9hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGVuZXJneV9iLCBpbnQgY2hhbm5lbHMpIHsKKyAgY29uc3QgZmxvYXQga0Vwc2lsb24gPSAxZS0xMmY7CisgIGZsb2F0IHNpbWlsYXJpdHlfbWVhc3VyZSA9IDAuMGY7CisgIGZvciAoaW50IG4gPSAwOyBuIDwgY2hhbm5lbHM7ICsrbikgeworICAgIHNpbWlsYXJpdHlfbWVhc3VyZSArPQorICAgICAgICBkb3RfcHJvZF9hX2Jbbl0gLyBzcXJ0KGVuZXJneV9hW25dICogZW5lcmd5X2Jbbl0gKyBrRXBzaWxvbik7CisgIH0KKyAgcmV0dXJuIHNpbWlsYXJpdHlfbWVhc3VyZTsKK30KKwordm9pZCBNdWx0aUNoYW5uZWxEb3RQcm9kdWN0KGNvbnN0IEF1ZGlvQnVzKiBhLCBpbnQgZnJhbWVfb2Zmc2V0X2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9CdXMqIGIsIGludCBmcmFtZV9vZmZzZXRfYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX2ZyYW1lcywgZmxvYXQqIGRvdF9wcm9kdWN0KSB7CisgIERDSEVDS19FUShhLT5jaGFubmVscygpLCBiLT5jaGFubmVscygpKTsKKyAgRENIRUNLX0dFKGZyYW1lX29mZnNldF9hLCAwKTsKKyAgRENIRUNLX0dFKGZyYW1lX29mZnNldF9iLCAwKTsKKyAgRENIRUNLX0xFKGZyYW1lX29mZnNldF9hICsgbnVtX2ZyYW1lcywgYS0+ZnJhbWVzKCkpOworICBEQ0hFQ0tfTEUoZnJhbWVfb2Zmc2V0X2IgKyBudW1fZnJhbWVzLCBiLT5mcmFtZXMoKSk7CisKKyAgU2JNZW1vcnlTZXQoZG90X3Byb2R1Y3QsIDAsIHNpemVvZigqZG90X3Byb2R1Y3QpICogYS0+Y2hhbm5lbHMoKSk7CisgIGZvciAoaW50IGsgPSAwOyBrIDwgYS0+Y2hhbm5lbHMoKTsgKytrKSB7CisgICAgY29uc3QgZmxvYXQqIGNoX2EgPSBhLT5jaGFubmVsKGspICsgZnJhbWVfb2Zmc2V0X2E7CisgICAgY29uc3QgZmxvYXQqIGNoX2IgPSBiLT5jaGFubmVsKGspICsgZnJhbWVfb2Zmc2V0X2I7CisgICAgZm9yIChpbnQgbiA9IDA7IG4gPCBudW1fZnJhbWVzOyArK24pIHsKKyAgICAgIGRvdF9wcm9kdWN0W2tdICs9ICpjaF9hKysgKiAqY2hfYisrOworICAgIH0KKyAgfQorfQorCit2b2lkIE11bHRpQ2hhbm5lbE1vdmluZ0Jsb2NrRW5lcmdpZXMoY29uc3QgQXVkaW9CdXMqIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZXNfcGVyX2Jsb2NrLCBmbG9hdCogZW5lcmd5KSB7CisgIGludCBudW1fYmxvY2tzID0gaW5wdXQtPmZyYW1lcygpIC0gKGZyYW1lc19wZXJfYmxvY2sgLSAxKTsKKyAgaW50IGNoYW5uZWxzID0gaW5wdXQtPmNoYW5uZWxzKCk7CisKKyAgZm9yIChpbnQgayA9IDA7IGsgPCBpbnB1dC0+Y2hhbm5lbHMoKTsgKytrKSB7CisgICAgY29uc3QgZmxvYXQqIGlucHV0X2NoYW5uZWwgPSBpbnB1dC0+Y2hhbm5lbChrKTsKKworICAgIGVuZXJneVtrXSA9IDA7CisKKyAgICAvLyBGaXJzdCBibG9jayBvZiBjaGFubmVsIHxrfC4KKyAgICBmb3IgKGludCBtID0gMDsgbSA8IGZyYW1lc19wZXJfYmxvY2s7ICsrbSkgeworICAgICAgZW5lcmd5W2tdICs9IGlucHV0X2NoYW5uZWxbbV0gKiBpbnB1dF9jaGFubmVsW21dOworICAgIH0KKworICAgIGNvbnN0IGZsb2F0KiBzbGlkZV9vdXQgPSBpbnB1dF9jaGFubmVsOworICAgIGNvbnN0IGZsb2F0KiBzbGlkZV9pbiA9IGlucHV0X2NoYW5uZWwgKyBmcmFtZXNfcGVyX2Jsb2NrOworICAgIGZvciAoaW50IG4gPSAxOyBuIDwgbnVtX2Jsb2NrczsgKytuLCArK3NsaWRlX2luLCArK3NsaWRlX291dCkgeworICAgICAgZW5lcmd5W2sgKyBuICogY2hhbm5lbHNdID0gZW5lcmd5W2sgKyAobiAtIDEpICogY2hhbm5lbHNdIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzbGlkZV9vdXQgKiAqc2xpZGVfb3V0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzbGlkZV9pbiAqICpzbGlkZV9pbjsKKyAgICB9CisgIH0KK30KKworLy8gRml0IHRoZSBjdXJ2ZSBmKHgpID0gYSAqIHheMiArIGIgKiB4ICsgYyBzdWNoIHRoYXQKKy8vICAgZigtMSkgPSB5WzBdCisvLyAgIGYoMCkgPSB5WzFdCisvLyAgIGYoMSkgPSB5WzJdCisvLyBhbmQgcmV0dXJuIHRoZSBtYXhpbXVtLCBhc3N1bWluZyB0aGF0IHlbMF0gPD0geVsxXSA+PSB5WzJdLgordm9pZCBRdWFkcmF0aWNJbnRlcnBvbGF0aW9uKGNvbnN0IGZsb2F0KiB5X3ZhbHVlcywgZmxvYXQqIGV4dHJlbXVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBleHRyZW11bV92YWx1ZSkgeworICBmbG9hdCBhID0gMC41ZiAqICh5X3ZhbHVlc1syXSArIHlfdmFsdWVzWzBdKSAtIHlfdmFsdWVzWzFdOworICBmbG9hdCBiID0gMC41ZiAqICh5X3ZhbHVlc1syXSAtIHlfdmFsdWVzWzBdKTsKKyAgZmxvYXQgYyA9IHlfdmFsdWVzWzFdOworCisgIGlmIChhID09IDAuZikgeworICAgIC8vIFRoZSBjb29yZGluYXRlcyBhcmUgY29saW5lYXIgKHdpdGhpbiBmbG9hdGluZy1wb2ludCBlcnJvcikuCisgICAgKmV4dHJlbXVtID0gMDsKKyAgICAqZXh0cmVtdW1fdmFsdWUgPSB5X3ZhbHVlc1sxXTsKKyAgfSBlbHNlIHsKKyAgICAqZXh0cmVtdW0gPSAtYiAvICgyLmYgKiBhKTsKKyAgICAqZXh0cmVtdW1fdmFsdWUgPSBhICogKCpleHRyZW11bSkgKiAoKmV4dHJlbXVtKSArIGIgKiAoKmV4dHJlbXVtKSArIGM7CisgIH0KK30KKworaW50IERlY2ltYXRlZFNlYXJjaChpbnQgZGVjaW1hdGlvbiwgSW50ZXJ2YWwgZXhjbHVkZV9pbnRlcnZhbCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9CdXMqIHRhcmdldF9ibG9jaywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9CdXMqIHNlYXJjaF9zZWdtZW50LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogZW5lcmd5X3RhcmdldF9ibG9jaywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGVuZXJneV9jYW5kaWRhdGVfYmxvY2tzKSB7CisgIGludCBjaGFubmVscyA9IHNlYXJjaF9zZWdtZW50LT5jaGFubmVscygpOworICBpbnQgYmxvY2tfc2l6ZSA9IHRhcmdldF9ibG9jay0+ZnJhbWVzKCk7CisgIGludCBudW1fY2FuZGlkYXRlX2Jsb2NrcyA9IHNlYXJjaF9zZWdtZW50LT5mcmFtZXMoKSAtIChibG9ja19zaXplIC0gMSk7CisgIHN0ZDo6dW5pcXVlX3B0cjxmbG9hdFtdPiBkb3RfcHJvZChuZXcgZmxvYXRbY2hhbm5lbHNdKTsKKyAgZmxvYXQgc2ltaWxhcml0eVszXTsgIC8vIFRocmVlIGVsZW1lbnRzIGZvciBjdWJpYyBpbnRlcnBvbGF0aW9uLgorCisgIGludCBuID0gMDsKKyAgTXVsdGlDaGFubmVsRG90UHJvZHVjdCh0YXJnZXRfYmxvY2ssIDAsIHNlYXJjaF9zZWdtZW50LCBuLCBibG9ja19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRvdF9wcm9kLmdldCgpKTsKKyAgc2ltaWxhcml0eVswXSA9IE11bHRpQ2hhbm5lbFNpbWlsYXJpdHlNZWFzdXJlKAorICAgICAgZG90X3Byb2QuZ2V0KCksIGVuZXJneV90YXJnZXRfYmxvY2ssCisgICAgICAmZW5lcmd5X2NhbmRpZGF0ZV9ibG9ja3NbbiAqIGNoYW5uZWxzXSwgY2hhbm5lbHMpOworCisgIC8vIFNldCB0aGUgc3RhcnRpbmcgcG9pbnQgYXMgb3B0aW1hbCBwb2ludC4KKyAgZmxvYXQgYmVzdF9zaW1pbGFyaXR5ID0gc2ltaWxhcml0eVswXTsKKyAgaW50IG9wdGltYWxfaW5kZXggPSAwOworCisgIG4gKz0gZGVjaW1hdGlvbjsKKyAgaWYgKG4gPj0gbnVtX2NhbmRpZGF0ZV9ibG9ja3MpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIE11bHRpQ2hhbm5lbERvdFByb2R1Y3QodGFyZ2V0X2Jsb2NrLCAwLCBzZWFyY2hfc2VnbWVudCwgbiwgYmxvY2tfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkb3RfcHJvZC5nZXQoKSk7CisgIHNpbWlsYXJpdHlbMV0gPSBNdWx0aUNoYW5uZWxTaW1pbGFyaXR5TWVhc3VyZSgKKyAgICAgIGRvdF9wcm9kLmdldCgpLCBlbmVyZ3lfdGFyZ2V0X2Jsb2NrLAorICAgICAgJmVuZXJneV9jYW5kaWRhdGVfYmxvY2tzW24gKiBjaGFubmVsc10sIGNoYW5uZWxzKTsKKworICBuICs9IGRlY2ltYXRpb247CisgIGlmIChuID49IG51bV9jYW5kaWRhdGVfYmxvY2tzKSB7CisgICAgLy8gV2UgY2Fubm90IGRvIGFueSBtb3JlIHNhbXBsaW5nLiBDb21wYXJlIHRoZXNlIHR3byB2YWx1ZXMgYW5kIHJldHVybiB0aGUKKyAgICAvLyBvcHRpbWFsIGluZGV4LgorICAgIHJldHVybiBzaW1pbGFyaXR5WzFdID4gc2ltaWxhcml0eVswXSA/IGRlY2ltYXRpb24gOiAwOworICB9CisKKyAgZm9yICg7IG4gPCBudW1fY2FuZGlkYXRlX2Jsb2NrczsgbiArPSBkZWNpbWF0aW9uKSB7CisgICAgTXVsdGlDaGFubmVsRG90UHJvZHVjdCh0YXJnZXRfYmxvY2ssIDAsIHNlYXJjaF9zZWdtZW50LCBuLCBibG9ja19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG90X3Byb2QuZ2V0KCkpOworCisgICAgc2ltaWxhcml0eVsyXSA9IE11bHRpQ2hhbm5lbFNpbWlsYXJpdHlNZWFzdXJlKAorICAgICAgICBkb3RfcHJvZC5nZXQoKSwgZW5lcmd5X3RhcmdldF9ibG9jaywKKyAgICAgICAgJmVuZXJneV9jYW5kaWRhdGVfYmxvY2tzW24gKiBjaGFubmVsc10sIGNoYW5uZWxzKTsKKworICAgIGlmICgoc2ltaWxhcml0eVsxXSA+IHNpbWlsYXJpdHlbMF0gJiYgc2ltaWxhcml0eVsxXSA+PSBzaW1pbGFyaXR5WzJdKSB8fAorICAgICAgICAoc2ltaWxhcml0eVsxXSA+PSBzaW1pbGFyaXR5WzBdICYmIHNpbWlsYXJpdHlbMV0gPiBzaW1pbGFyaXR5WzJdKSkgeworICAgICAgLy8gQSBsb2NhbCBtYXhpbXVtIGlzIGZvdW5kLiBEbyBhIGN1YmljIGludGVycG9sYXRpb24gZm9yIGEgYmV0dGVyCisgICAgICAvLyBlc3RpbWF0ZSBvZiBjYW5kaWRhdGUgbWF4aW11bS4KKyAgICAgIGZsb2F0IG5vcm1hbGl6ZWRfY2FuZGlkYXRlX2luZGV4OworICAgICAgZmxvYXQgY2FuZGlkYXRlX3NpbWlsYXJpdHk7CisgICAgICBRdWFkcmF0aWNJbnRlcnBvbGF0aW9uKHNpbWlsYXJpdHksICZub3JtYWxpemVkX2NhbmRpZGF0ZV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNhbmRpZGF0ZV9zaW1pbGFyaXR5KTsKKworICAgICAgaW50IGNhbmRpZGF0ZV9pbmRleCA9CisgICAgICAgICAgbiAtIGRlY2ltYXRpb24gKworICAgICAgICAgIHN0YXRpY19jYXN0PGludD4obm9ybWFsaXplZF9jYW5kaWRhdGVfaW5kZXggKiBkZWNpbWF0aW9uICsgMC41Zik7CisgICAgICBpZiAoY2FuZGlkYXRlX3NpbWlsYXJpdHkgPiBiZXN0X3NpbWlsYXJpdHkgJiYKKyAgICAgICAgICAhSW5JbnRlcnZhbChjYW5kaWRhdGVfaW5kZXgsIGV4Y2x1ZGVfaW50ZXJ2YWwpKSB7CisgICAgICAgIG9wdGltYWxfaW5kZXggPSBjYW5kaWRhdGVfaW5kZXg7CisgICAgICAgIGJlc3Rfc2ltaWxhcml0eSA9IGNhbmRpZGF0ZV9zaW1pbGFyaXR5OworICAgICAgfQorICAgIH0gZWxzZSBpZiAobiArIGRlY2ltYXRpb24gPj0gbnVtX2NhbmRpZGF0ZV9ibG9ja3MgJiYKKyAgICAgICAgICAgICAgIHNpbWlsYXJpdHlbMl0gPiBiZXN0X3NpbWlsYXJpdHkgJiYKKyAgICAgICAgICAgICAgICFJbkludGVydmFsKG4sIGV4Y2x1ZGVfaW50ZXJ2YWwpKSB7CisgICAgICAvLyBJZiB0aGlzIGlzIHRoZSBlbmQtcG9pbnQgYW5kIGhhcyBhIGJldHRlciBzaW1pbGFyaXR5LW1lYXN1cmUgdGhhbgorICAgICAgLy8gb3B0aW1hbCwgdGhlbiB3ZSBhY2NlcHQgaXQgYXMgb3B0aW1hbCBwb2ludC4KKyAgICAgIG9wdGltYWxfaW5kZXggPSBuOworICAgICAgYmVzdF9zaW1pbGFyaXR5ID0gc2ltaWxhcml0eVsyXTsKKyAgICB9CisgICAgU2JNZW1vcnlNb3ZlKHNpbWlsYXJpdHksICZzaW1pbGFyaXR5WzFdLCAyICogc2l6ZW9mKCpzaW1pbGFyaXR5KSk7CisgIH0KKyAgcmV0dXJuIG9wdGltYWxfaW5kZXg7Cit9CisKK2ludCBGdWxsU2VhcmNoKGludCBsb3dfbGltaXQsIGludCBoaWdoX2xpbWl0LCBJbnRlcnZhbCBleGNsdWRlX2ludGVydmFsLAorICAgICAgICAgICAgICAgY29uc3QgQXVkaW9CdXMqIHRhcmdldF9ibG9jaywgY29uc3QgQXVkaW9CdXMqIHNlYXJjaF9ibG9jaywKKyAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBlbmVyZ3lfdGFyZ2V0X2Jsb2NrLAorICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGVuZXJneV9jYW5kaWRhdGVfYmxvY2tzKSB7CisgIGludCBjaGFubmVscyA9IHNlYXJjaF9ibG9jay0+Y2hhbm5lbHMoKTsKKyAgaW50IGJsb2NrX3NpemUgPSB0YXJnZXRfYmxvY2stPmZyYW1lcygpOworICBzdGQ6OnVuaXF1ZV9wdHI8ZmxvYXRbXT4gZG90X3Byb2QobmV3IGZsb2F0W2NoYW5uZWxzXSk7CisKKyAgZmxvYXQgYmVzdF9zaW1pbGFyaXR5ID0gc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46Om1pbigpOworICBpbnQgb3B0aW1hbF9pbmRleCA9IDA7CisKKyAgZm9yIChpbnQgbiA9IGxvd19saW1pdDsgbiA8PSBoaWdoX2xpbWl0OyArK24pIHsKKyAgICBpZiAoSW5JbnRlcnZhbChuLCBleGNsdWRlX2ludGVydmFsKSkgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIE11bHRpQ2hhbm5lbERvdFByb2R1Y3QodGFyZ2V0X2Jsb2NrLCAwLCBzZWFyY2hfYmxvY2ssIG4sIGJsb2NrX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3RfcHJvZC5nZXQoKSk7CisKKyAgICBmbG9hdCBzaW1pbGFyaXR5ID0gTXVsdGlDaGFubmVsU2ltaWxhcml0eU1lYXN1cmUoCisgICAgICAgIGRvdF9wcm9kLmdldCgpLCBlbmVyZ3lfdGFyZ2V0X2Jsb2NrLAorICAgICAgICAmZW5lcmd5X2NhbmRpZGF0ZV9ibG9ja3NbbiAqIGNoYW5uZWxzXSwgY2hhbm5lbHMpOworCisgICAgaWYgKHNpbWlsYXJpdHkgPiBiZXN0X3NpbWlsYXJpdHkpIHsKKyAgICAgIGJlc3Rfc2ltaWxhcml0eSA9IHNpbWlsYXJpdHk7CisgICAgICBvcHRpbWFsX2luZGV4ID0gbjsKKyAgICB9CisgIH0KKworICByZXR1cm4gb3B0aW1hbF9pbmRleDsKK30KKworaW50IE9wdGltYWxJbmRleChjb25zdCBBdWRpb0J1cyogc2VhcmNoX2Jsb2NrLCBjb25zdCBBdWRpb0J1cyogdGFyZ2V0X2Jsb2NrLAorICAgICAgICAgICAgICAgICBJbnRlcnZhbCBleGNsdWRlX2ludGVydmFsKSB7CisgIGludCBjaGFubmVscyA9IHNlYXJjaF9ibG9jay0+Y2hhbm5lbHMoKTsKKyAgRENIRUNLX0VRKGNoYW5uZWxzLCB0YXJnZXRfYmxvY2stPmNoYW5uZWxzKCkpOworICBpbnQgdGFyZ2V0X3NpemUgPSB0YXJnZXRfYmxvY2stPmZyYW1lcygpOworICBpbnQgbnVtX2NhbmRpZGF0ZV9ibG9ja3MgPSBzZWFyY2hfYmxvY2stPmZyYW1lcygpIC0gKHRhcmdldF9zaXplIC0gMSk7CisKKyAgLy8gVGhpcyBpcyBhIGNvbXByb21pc2UgYmV0d2VlbiBjb21wbGV4aXR5IHJlZHVjdGlvbiBhbmQgc2VhcmNoIGFjY3VyYWN5LiBJCisgIC8vIGRvbid0IGhhdmUgYSBwcm9vZiB0aGF0IGRvd24gc2FtcGxlIG9mIG9yZGVyIDUgaXMgb3B0aW1hbC4gT25lIGNhbiBjb21wdXRlCisgIC8vIGEgZGVjaW1hdGlvbiBmYWN0b3IgdGhhdCBtaW5pbWl6ZXMgY29tcGxleGl0eSBnaXZlbiB0aGUgc2l6ZSBvZgorICAvLyB8c2VhcmNoX2Jsb2NrfCBhbmQgfHRhcmdldF9ibG9ja3wuIEhvd2V2ZXIsIG15IGV4cGVyaW1lbnRzIHNob3cgdGhlIHJhdGUgb2YKKyAgLy8gbWlzc2luZyB0aGUgb3B0aW1hbCBpbmRleCBpcyBzaWduaWZpY2FudC4gVGhpcyB2YWx1ZSBpcyBjaG9zZW4KKyAgLy8gaGV1cmlzdGljYWxseSBiYXNlZCBvbiBleHBlcmltZW50cy4KKyAgY29uc3QgaW50IGtTZWFyY2hEZWNpbWF0aW9uID0gNTsKKworICBzdGQ6OnVuaXF1ZV9wdHI8ZmxvYXRbXT4gZW5lcmd5X3RhcmdldF9ibG9jayhuZXcgZmxvYXRbY2hhbm5lbHNdKTsKKyAgc3RkOjp1bmlxdWVfcHRyPGZsb2F0W10+IGVuZXJneV9jYW5kaWRhdGVfYmxvY2tzKAorICAgICAgbmV3IGZsb2F0W2NoYW5uZWxzICogbnVtX2NhbmRpZGF0ZV9ibG9ja3NdKTsKKworICAvLyBFbmVyZ3kgb2YgYWxsIGNhbmRpZCBmcmFtZXMuCisgIE11bHRpQ2hhbm5lbE1vdmluZ0Jsb2NrRW5lcmdpZXMoc2VhcmNoX2Jsb2NrLCB0YXJnZXRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmVyZ3lfY2FuZGlkYXRlX2Jsb2Nrcy5nZXQoKSk7CisKKyAgLy8gRW5lcmd5IG9mIHRhcmdldCBmcmFtZS4KKyAgTXVsdGlDaGFubmVsRG90UHJvZHVjdCh0YXJnZXRfYmxvY2ssIDAsIHRhcmdldF9ibG9jaywgMCwgdGFyZ2V0X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgZW5lcmd5X3RhcmdldF9ibG9jay5nZXQoKSk7CisKKyAgaW50IG9wdGltYWxfaW5kZXggPSBEZWNpbWF0ZWRTZWFyY2goCisgICAgICBrU2VhcmNoRGVjaW1hdGlvbiwgZXhjbHVkZV9pbnRlcnZhbCwgdGFyZ2V0X2Jsb2NrLCBzZWFyY2hfYmxvY2ssCisgICAgICBlbmVyZ3lfdGFyZ2V0X2Jsb2NrLmdldCgpLCBlbmVyZ3lfY2FuZGlkYXRlX2Jsb2Nrcy5nZXQoKSk7CisKKyAgaW50IGxpbV9sb3cgPSBzdGQ6Om1heCgwLCBvcHRpbWFsX2luZGV4IC0ga1NlYXJjaERlY2ltYXRpb24pOworICBpbnQgbGltX2hpZ2ggPQorICAgICAgc3RkOjptaW4obnVtX2NhbmRpZGF0ZV9ibG9ja3MgLSAxLCBvcHRpbWFsX2luZGV4ICsga1NlYXJjaERlY2ltYXRpb24pOworICByZXR1cm4gRnVsbFNlYXJjaChsaW1fbG93LCBsaW1faGlnaCwgZXhjbHVkZV9pbnRlcnZhbCwgdGFyZ2V0X2Jsb2NrLAorICAgICAgICAgICAgICAgICAgICBzZWFyY2hfYmxvY2ssIGVuZXJneV90YXJnZXRfYmxvY2suZ2V0KCksCisgICAgICAgICAgICAgICAgICAgIGVuZXJneV9jYW5kaWRhdGVfYmxvY2tzLmdldCgpKTsKK30KKwordm9pZCBHZXRTeW1tZXRyaWNIYW5uaW5nV2luZG93KGludCB3aW5kb3dfbGVuZ3RoLCBmbG9hdCogd2luZG93KSB7CisgIGNvbnN0IGZsb2F0IHNjYWxlID0gMi4wZiAqIE1fUEkgLyB3aW5kb3dfbGVuZ3RoOworICBmb3IgKGludCBuID0gMDsgbiA8IHdpbmRvd19sZW5ndGg7ICsrbikKKyAgICB3aW5kb3dbbl0gPSAwLjVmICogKDEuMGYgLSBjb3NmKG4gKiBzY2FsZSkpOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci93c29sYV9pbnRlcm5hbHMuaCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3dzb2xhX2ludGVybmFscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkOTZiMzkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci93c29sYV9pbnRlcm5hbHMuaApAQCAtMCwwICsxLDgzIEBACisvLyBDb3B5cmlnaHQgMjAxMyBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIEEgc2V0IG9mIHV0aWxpdHkgZnVuY3Rpb25zIHRvIHBlcmZvcm0gV1NPTEEuCisKKyNpZm5kZWYgQ09CQUxUX01FRElBX0ZJTFRFUlNfV1NPTEFfSU5URVJOQUxTX0hfCisjZGVmaW5lIENPQkFMVF9NRURJQV9GSUxURVJTX1dTT0xBX0lOVEVSTkFMU19IXworCisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL21lZGlhX2V4cG9ydC5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBtZWRpYSB7CisKK2NsYXNzIEF1ZGlvQnVzOworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0eXBlZGVmIHN0ZDo6cGFpcjxpbnQsIGludD4gSW50ZXJ2YWw7CisKKy8vIERvdC1wcm9kdWN0IG9mIGNoYW5uZWxzIG9mIHR3byBBdWRpb0J1cy4gRm9yIGVhY2ggQXVkaW9CdXMgYW4gb2Zmc2V0IGlzCisvLyBnaXZlbi4gfGRvdF9wcm9kdWN0W2tdfCBpcyB0aGUgZG90LXByb2R1Y3Qgb2YgY2hhbm5lbCB8a3wuIFRoZSBjYWxsZXIgc2hvdWxkCisvLyBhbGxvY2F0ZSBzdWZmaWNpZW50IHNwYWNlIGZvciB8ZG90X3Byb2R1Y3R8LgorTUVESUFfRVhQT1JUIHZvaWQgTXVsdGlDaGFubmVsRG90UHJvZHVjdChjb25zdCBBdWRpb0J1cyogYSwgaW50IGZyYW1lX29mZnNldF9hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0J1cyogYiwgaW50IGZyYW1lX29mZnNldF9iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX2ZyYW1lcywgZmxvYXQqIGRvdF9wcm9kdWN0KTsKKworLy8gRW5lcmdpZXMgb2Ygc2xpZGluZyB3aW5kb3dzIG9mIGNoYW5uZWxzIGFyZSBpbnRlcmxlYXZlZC4KKy8vIFRoZSBudW1iZXIgd2luZG93cyBpcyB8aW5wdXQtPmZyYW1lcygpfCAtICh8ZnJhbWVzX3Blcl93aW5kb3d8IC0gMSksIGhlbmNlLAorLy8gdGhlIG1ldGhvZCBhc3N1bWVzIHxlbmVyZ3l8IG11c3QgYmUsIGF0IGxlYXN0LCBvZiBzaXplCisvLyAofGlucHV0LT5mcmFtZXMoKXwgLSAofGZyYW1lc19wZXJfd2luZG93fCAtIDEpKSAqIHxpbnB1dC0+Y2hhbm5lbHMoKXwuCitNRURJQV9FWFBPUlQgdm9pZCBNdWx0aUNoYW5uZWxNb3ZpbmdCbG9ja0VuZXJnaWVzKGNvbnN0IEF1ZGlvQnVzKiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lc19wZXJfd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZW5lcmd5KTsKKworLy8gRml0IHRoZSBjdXJ2ZSBmKHgpID0gYSAqIHheMiArIGIgKiB4ICsgYyBzdWNoIHRoYXQKKy8vICAgZigtMSkgPSB5WzBdCisvLyAgIGYoMCkgPSB5WzFdCisvLyAgIGYoMSkgPSB5WzJdCisvLyBhbmQgcmV0dXJuIHRoZSBtYXhpbXVtLCBhc3N1bWluZyB0aGF0IHlbMF0gPD0geVsxXSA+PSB5WzJdLgorTUVESUFfRVhQT1JUIHZvaWQgUXVhZHJhdGljSW50ZXJwb2xhdGlvbihjb25zdCBmbG9hdCogeV92YWx1ZXMsIGZsb2F0KiBleHRyZW11bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGV4dHJlbXVtX3ZhbHVlKTsKKworLy8gU2VhcmNoIGEgc3Vic2V0IG9mIGFsbCBjYW5kaWQgYmxvY2tzLiBUaGUgc2VhcmNoIGlzIHBlcmZvcm1lZCBldmVyeQorLy8gfGRlY2ltYXRpb258IGZyYW1lcy4gVGhpcyByZWR1Y2VzIGNvbXBsZXhpdHkgYnkgYSBmYWN0b3Igb2YgYWJvdXQKKy8vIDEgLyB8ZGVjaW1hdGlvbnwuIEEgY3ViaWMgaW50ZXJwb2xhdGlvbiBpcyB1c2VkIHRvIGhhdmUgYSBiZXR0ZXIgZXN0aW1hdGUgb2YKKy8vIHRoZSBiZXN0IG1hdGNoLgorTUVESUFfRVhQT1JUIGludCBEZWNpbWF0ZWRTZWFyY2goaW50IGRlY2ltYXRpb24sIEludGVydmFsIGV4Y2x1ZGVfaW50ZXJ2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0J1cyogdGFyZ2V0X2Jsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9CdXMqIHNlYXJjaF9zZWdtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGVuZXJneV90YXJnZXRfYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogZW5lcmd5X2NhbmRpZF9ibG9ja3MpOworCisvLyBTZWFyY2ggW3xsb3dfbGltaXR8LCB8aGlnaF9saW1pdHxdIG9mIHxzZWFyY2hfc2VnbWVudHwgdG8gZmluZCBhIGJsb2NrIHRoYXQKKy8vIGlzIG1vc3Qgc2ltaWxhciB0byB8dGFyZ2V0X2Jsb2NrfC4gfGVuZXJneV90YXJnZXRfYmxvY2t8IGlzIHRoZSBlbmVyZ3kgb2YgdGhlCisvLyB8dGFyZ2V0X2Jsb2NrfC4gfGVuZXJneV9jYW5kaWRhdGVfYmxvY2tzfCBpcyB0aGUgZW5lcmd5IG9mIGFsbCBibG9ja3Mgd2l0aGluCisvLyB8c2VhcmNoX2Jsb2NrfC4KK01FRElBX0VYUE9SVCBpbnQgRnVsbFNlYXJjaChpbnQgbG93X2xpbWl0LCBpbnQgaGlnaHRfbGltaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcnZhbCBleGNsdWRlX2ludGVydmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvQnVzKiB0YXJnZXRfYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9CdXMqIHNlYXJjaF9ibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogZW5lcmd5X3RhcmdldF9ibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogZW5lcmd5X2NhbmRpZGF0ZV9ibG9ja3MpOworCisvLyBGaW5kIHRoZSBpbmRleCBvZiB0aGUgYmxvY2ssIHdpdGhpbiB8c2VhcmNoX2Jsb2NrfCwgdGhhdCBpcyBtb3N0IHNpbWlsYXIKKy8vIHRvIHx0YXJnZXRfYmxvY2t8LiBPYnZpb3VzbHksIHRoZSByZXR1cm5lZCBpbmRleCBpcyB3LnIudC4gfHNlYXJjaF9ibG9ja3wuCisvLyB8ZXhjbHVkZV9pbnRlcnZhbHwgaXMgYW4gaW50ZXJ2YWwgdGhhdCBpcyBleGNsdWRlZCBmcm9tIHRoZSBzZWFyY2guCitNRURJQV9FWFBPUlQgaW50IE9wdGltYWxJbmRleChjb25zdCBBdWRpb0J1cyogc2VhcmNoX2Jsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9CdXMqIHRhcmdldF9ibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVydmFsIGV4Y2x1ZGVfaW50ZXJ2YWwpOworCisvLyBSZXR1cm4gYSAicGVyaW9kaWMiIEhhbm4gd2luZG93LiBUaGlzIGlzIHRoZSBmaXJzdCBMIHNhbXBsZXMgb2YgYW4gTCsxCisvLyBIYW5uIHdpbmRvdy4gSXQgaXMgcGVyZmVjdCByZWNvbnN0cnVjdGlvbiBmb3Igb3ZlcmxhcC1hbmQtYWRkLgorTUVESUFfRVhQT1JUIHZvaWQgR2V0U3ltbWV0cmljSGFubmluZ1dpbmRvdyhpbnQgd2luZG93X2xlbmd0aCwgZmxvYXQqIHdpbmRvdyk7CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKKworI2VuZGlmICAvLyBDT0JBTFRfTUVESUFfRklMVEVSU19XU09MQV9JTlRFUk5BTFNfSF8KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9zdHJpbmdfZHVwbGljYXRlLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3N0cmluZ19kdXBsaWNhdGUuY2MKaW5kZXggYjVlNTFkOS4uYjUwNGIxNiAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3N0cmluZ19kdXBsaWNhdGUuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3N0cmluZ19kdXBsaWNhdGUuY2MKQEAgLTE0LDEyICsxNCwxNSBAQAogCiAjaW5jbHVkZSAic3RhcmJvYXJkL3N0cmluZy5oIgogCisjaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKIAogY2hhciogU2JTdHJpbmdEdXBsaWNhdGUoY29uc3QgY2hhciogc291cmNlKSB7CiAgIHNpemVfdCBsZW5ndGggPSBTYlN0cmluZ0dldExlbmd0aChzb3VyY2UpOwogICBjaGFyKiByZXN1bHQgPSBzdGF0aWNfY2FzdDxjaGFyKj4oU2JNZW1vcnlBbGxvY2F0ZShsZW5ndGggKyAxKSk7Ci0gIFNiU3RyaW5nQ29weShyZXN1bHQsIHNvdXJjZSwgbGVuZ3RoICsgMSk7CisgIFNCX0RDSEVDSyhsZW5ndGggPCBrU2JJbnQzMk1heCk7CisgIGludCBpbnRfbGVuZ3RoID0gc3RhdGljX2Nhc3Q8aW50PihsZW5ndGggKyAxKTsKKyAgU2JTdHJpbmdDb3B5KHJlc3VsdCwgc291cmNlLCBpbnRfbGVuZ3RoKTsKIAogICByZXR1cm4gcmVzdWx0OwogfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvYXBwbGljYXRpb25fc3R1Yi5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2FwcGxpY2F0aW9uX3N0dWIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY1NjA4MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2FwcGxpY2F0aW9uX3N0dWIuY2MKQEAgLTAsMCArMSw2MiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvYXBwbGljYXRpb25fc3R1Yi5oIgorCisjaW5jbHVkZSAic3RhcmJvYXJkL2V2ZW50LmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgorCituYW1lc3BhY2Ugc3RhcmJvYXJkIHsKK25hbWVzcGFjZSBzaGFyZWQgeworbmFtZXNwYWNlIHdpbjMyIHsKKworQXBwbGljYXRpb25TdHViOjpBcHBsaWNhdGlvblN0dWIoKSB7CisgIFNCX05PVElNUExFTUVOVEVEKCk7Cit9CisKK0FwcGxpY2F0aW9uU3R1Yjo6fkFwcGxpY2F0aW9uU3R1YigpIHsKKyAgU0JfTk9USU1QTEVNRU5URUQoKTsKK30KKwordm9pZCBBcHBsaWNhdGlvblN0dWI6OkluaXRpYWxpemUoKSB7CisgIFNCX05PVElNUExFTUVOVEVEKCk7Cit9CisKK3ZvaWQgQXBwbGljYXRpb25TdHViOjpUZWFyZG93bigpIHsKKyAgU0JfTk9USU1QTEVNRU5URUQoKTsKK30KKworYm9vbCBBcHBsaWNhdGlvblN0dWI6Ok1heUhhdmVTeXN0ZW1FdmVudHMoKSB7CisgIFNCX05PVElNUExFTUVOVEVEKCk7CisgIHJldHVybiBmYWxzZTsKK30KKworc2hhcmVkOjpzdGFyYm9hcmQ6OkFwcGxpY2F0aW9uOjpFdmVudCogQXBwbGljYXRpb25TdHViOjpQb2xsTmV4dFN5c3RlbUV2ZW50KCkgeworICBTQl9OT1RJTVBMRU1FTlRFRCgpOworICByZXR1cm4gTlVMTDsKK30KKworc2hhcmVkOjpzdGFyYm9hcmQ6OkFwcGxpY2F0aW9uOjpFdmVudCoKK0FwcGxpY2F0aW9uU3R1Yjo6V2FpdEZvclN5c3RlbUV2ZW50V2l0aFRpbWVvdXQoU2JUaW1lIHRpbWUpIHsKKyAgU0JfTk9USU1QTEVNRU5URUQoKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgQXBwbGljYXRpb25TdHViOjpXYWtlU3lzdGVtRXZlbnRXYWl0KCkgeworICBTQl9OT1RJTVBMRU1FTlRFRCgpOworfQorCit9ICAvLyBuYW1lc3BhY2Ugd2luMzIKK30gIC8vIG5hbWVzcGFjZSBzaGFyZWQKK30gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2FwcGxpY2F0aW9uX3N0dWIuaCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2FwcGxpY2F0aW9uX3N0dWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTEyNjc3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvYXBwbGljYXRpb25fc3R1Yi5oCkBAIC0wLDAgKzEsNTQgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpZm5kZWYgU1RBUkJPQVJEX1NIQVJFRF9XSU4zMl9BUFBMSUNBVElPTl9TVFVCX0hfCisjZGVmaW5lIFNUQVJCT0FSRF9TSEFSRURfV0lOMzJfQVBQTElDQVRJT05fU1RVQl9IXworCisjaW5jbHVkZSAic3RhcmJvYXJkL2NvbmZpZ3VyYXRpb24uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL2ludGVybmFsX29ubHkuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9hcHBsaWNhdGlvbi5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3F1ZXVlX2FwcGxpY2F0aW9uLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL3R5cGVzLmgiCisKK25hbWVzcGFjZSBzdGFyYm9hcmQgeworbmFtZXNwYWNlIHNoYXJlZCB7CituYW1lc3BhY2Ugd2luMzIgeworCisvLyBTdHViIGFwcGxpY2F0aW9uIGVuZ2luZSB1c2luZyB0aGUgZ2VuZXJpYyBxdWV1ZSBhbmQgYSBzdHViIGltcGxlbWVudGF0aW9uLgorY2xhc3MgQXBwbGljYXRpb25TdHViIDogcHVibGljIHNoYXJlZDo6c3RhcmJvYXJkOjpRdWV1ZUFwcGxpY2F0aW9uIHsKKyBwdWJsaWM6CisgIEFwcGxpY2F0aW9uU3R1YigpOworICB+QXBwbGljYXRpb25TdHViKCkgU0JfT1ZFUlJJREU7CisKKyAgc3RhdGljIEFwcGxpY2F0aW9uU3R1YiogR2V0KCkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxBcHBsaWNhdGlvblN0dWIqPihzaGFyZWQ6OnN0YXJib2FyZDo6QXBwbGljYXRpb246OkdldCgpKTsKKyAgfQorCisgcHJvdGVjdGVkOgorICAvLyAtLS0gQXBwbGljYXRpb24gb3ZlcnJpZGVzIC0tLQorICB2b2lkIEluaXRpYWxpemUoKSBTQl9PVkVSUklERTsKKyAgdm9pZCBUZWFyZG93bigpIFNCX09WRVJSSURFOworCisgIC8vIC0tLSBRdWV1ZUFwcGxpY2F0aW9uIG92ZXJyaWRlcyAtLS0KKyAgYm9vbCBNYXlIYXZlU3lzdGVtRXZlbnRzKCkgU0JfT1ZFUlJJREU7CisgIEV2ZW50KiBQb2xsTmV4dFN5c3RlbUV2ZW50KCkgU0JfT1ZFUlJJREU7CisgIEV2ZW50KiBXYWl0Rm9yU3lzdGVtRXZlbnRXaXRoVGltZW91dChTYlRpbWUgdGltZSkgU0JfT1ZFUlJJREU7CisgIHZvaWQgV2FrZVN5c3RlbUV2ZW50V2FpdCgpIFNCX09WRVJSSURFOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHdpbjMyCit9ICAvLyBuYW1lc3BhY2Ugc2hhcmVkCit9ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCisKKyNlbmRpZiAgLy8gU1RBUkJPQVJEX1NIQVJFRF9XSU4zMl9BUFBMSUNBVElPTl9TVFVCX0hfCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9ieXRlX3N3YXAuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9ieXRlX3N3YXAuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVmNGZkOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2J5dGVfc3dhcC5jYwpAQCAtMCwwICsxLDQ0IEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBOb3QgYnJlYWtpbmcgdGhlc2UgZnVuY3Rpb25zIHVwIGJlY2F1c2UgaG93ZXZlciBvbmUgaXMgaW1wbGVtZW50ZWQsIHRoZQorLy8gb3RoZXJzIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBzaW1pbGFybHkuCisKKyNpbmNsdWRlICJzdGFyYm9hcmQvYnl0ZV9zd2FwLmgiCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworaW50MTZfdCBTYkJ5dGVTd2FwUzE2KGludDE2X3QgdmFsdWUpIHsKKyAgcmV0dXJuIF9ieXRlc3dhcF91c2hvcnQodmFsdWUpOworfQorCit1aW50MTZfdCBTYkJ5dGVTd2FwVTE2KHVpbnQxNl90IHZhbHVlKSB7CisgIHJldHVybiBfYnl0ZXN3YXBfdXNob3J0KHZhbHVlKTsKK30KKworaW50MzJfdCBTYkJ5dGVTd2FwUzMyKGludDMyX3QgdmFsdWUpIHsKKyAgcmV0dXJuIF9ieXRlc3dhcF91bG9uZyh2YWx1ZSk7Cit9CisKK3VpbnQzMl90IFNiQnl0ZVN3YXBVMzIodWludDMyX3QgdmFsdWUpIHsKKyAgcmV0dXJuIF9ieXRlc3dhcF91bG9uZyh2YWx1ZSk7Cit9CisKK2ludDY0X3QgU2JCeXRlU3dhcFM2NChpbnQ2NF90IHZhbHVlKSB7CisgIHJldHVybiBfYnl0ZXN3YXBfdWludDY0KHZhbHVlKTsKK30KKwordWludDY0X3QgU2JCeXRlU3dhcFU2NCh1aW50NjRfdCB2YWx1ZSkgeworICByZXR1cm4gX2J5dGVzd2FwX3VpbnQ2NCh2YWx1ZSk7Cit9CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfc3lzdGVtX21lZGlhX2NhcGFiaWxpdHkuaWRsIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvY29uZGl0aW9uX3ZhcmlhYmxlX2Jyb2FkY2FzdC5jYwpzaW1pbGFyaXR5IGluZGV4IDY4JQpjb3B5IGZyb20gc3JjL2NvYmFsdC9kb20vbWVkaWFfa2V5X3N5c3RlbV9tZWRpYV9jYXBhYmlsaXR5LmlkbApjb3B5IHRvIHNyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2NvbmRpdGlvbl92YXJpYWJsZV9icm9hZGNhc3QuY2MKaW5kZXggNTFlMWYyZS4uZjJiOWVhNSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vbWVkaWFfa2V5X3N5c3RlbV9tZWRpYV9jYXBhYmlsaXR5LmlkbAorKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9jb25kaXRpb25fdmFyaWFibGVfYnJvYWRjYXN0LmNjCkBAIC0xMiw5ICsxMiwxNCBAQAogLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKLS8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDE2L0NSLWVuY3J5cHRlZC1tZWRpYS0yMDE2MDcwNS8jbWVkaWFrZXlzeXN0ZW1tZWRpYWNhcGFiaWxpdHktZGljdGlvbmFyeQorI2luY2x1ZGUgInN0YXJib2FyZC9jb25kaXRpb25fdmFyaWFibGUuaCIKIAotZGljdGlvbmFyeSBNZWRpYUtleVN5c3RlbU1lZGlhQ2FwYWJpbGl0eSB7Ci0gIERPTVN0cmluZyBjb250ZW50VHlwZSA9ICIiOwotICBET01TdHJpbmcgcm9idXN0bmVzcyA9ICIiOwotfTsKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKK2Jvb2wgU2JDb25kaXRpb25WYXJpYWJsZUJyb2FkY2FzdChTYkNvbmRpdGlvblZhcmlhYmxlKiBjb25kaXRpb24pIHsKKyAgaWYgKCFjb25kaXRpb24pIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgV2FrZUFsbENvbmRpdGlvblZhcmlhYmxlKHJlaW50ZXJwcmV0X2Nhc3Q8UENPTkRJVElPTl9WQVJJQUJMRT4oY29uZGl0aW9uKSk7CisgIHJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vbWVkaWFfa2V5X3N5c3RlbV9tZWRpYV9jYXBhYmlsaXR5LmlkbCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2NvbmRpdGlvbl92YXJpYWJsZV9jcmVhdGUuY2MKc2ltaWxhcml0eSBpbmRleCA2MyUKY29weSBmcm9tIHNyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9zeXN0ZW1fbWVkaWFfY2FwYWJpbGl0eS5pZGwKY29weSB0byBzcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9jb25kaXRpb25fdmFyaWFibGVfY3JlYXRlLmNjCmluZGV4IDUxZTFmMmUuLjlkNzRhNmYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9zeXN0ZW1fbWVkaWFfY2FwYWJpbGl0eS5pZGwKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvY29uZGl0aW9uX3ZhcmlhYmxlX2NyZWF0ZS5jYwpAQCAtMTIsOSArMTIsMTYgQEAKIC8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAxNi9DUi1lbmNyeXB0ZWQtbWVkaWEtMjAxNjA3MDUvI21lZGlha2V5c3lzdGVtbWVkaWFjYXBhYmlsaXR5LWRpY3Rpb25hcnkKKyNpbmNsdWRlICJzdGFyYm9hcmQvY29uZGl0aW9uX3ZhcmlhYmxlLmgiCiAKLWRpY3Rpb25hcnkgTWVkaWFLZXlTeXN0ZW1NZWRpYUNhcGFiaWxpdHkgewotICBET01TdHJpbmcgY29udGVudFR5cGUgPSAiIjsKLSAgRE9NU3RyaW5nIHJvYnVzdG5lc3MgPSAiIjsKLX07CisjaW5jbHVkZSA8d2luZG93cy5oPgorCitib29sIFNiQ29uZGl0aW9uVmFyaWFibGVDcmVhdGUoU2JDb25kaXRpb25WYXJpYWJsZSogb3V0X2NvbmRpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYk11dGV4KiAvKm9wdF9tdXRleCovKSB7CisgIGlmICghb3V0X2NvbmRpdGlvbikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBJbml0aWFsaXplQ29uZGl0aW9uVmFyaWFibGUoCisgICAgICByZWludGVycHJldF9jYXN0PFBDT05ESVRJT05fVkFSSUFCTEU+KG91dF9jb25kaXRpb24pKTsKKyAgcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfc3lzdGVtX21lZGlhX2NhcGFiaWxpdHkuaWRsIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvY29uZGl0aW9uX3ZhcmlhYmxlX2Rlc3Ryb3kuY2MKc2ltaWxhcml0eSBpbmRleCA3NCUKY29weSBmcm9tIHNyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9zeXN0ZW1fbWVkaWFfY2FwYWJpbGl0eS5pZGwKY29weSB0byBzcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9jb25kaXRpb25fdmFyaWFibGVfZGVzdHJveS5jYwppbmRleCA1MWUxZjJlLi40YTI0ZTQ3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfc3lzdGVtX21lZGlhX2NhcGFiaWxpdHkuaWRsCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2NvbmRpdGlvbl92YXJpYWJsZV9kZXN0cm95LmNjCkBAIC0xMiw5ICsxMiwxMyBAQAogLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKLS8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDE2L0NSLWVuY3J5cHRlZC1tZWRpYS0yMDE2MDcwNS8jbWVkaWFrZXlzeXN0ZW1tZWRpYWNhcGFiaWxpdHktZGljdGlvbmFyeQorI2luY2x1ZGUgInN0YXJib2FyZC9jb25kaXRpb25fdmFyaWFibGUuaCIKIAotZGljdGlvbmFyeSBNZWRpYUtleVN5c3RlbU1lZGlhQ2FwYWJpbGl0eSB7Ci0gIERPTVN0cmluZyBjb250ZW50VHlwZSA9ICIiOwotICBET01TdHJpbmcgcm9idXN0bmVzcyA9ICIiOwotfTsKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKK2Jvb2wgU2JDb25kaXRpb25WYXJpYWJsZURlc3Ryb3koU2JDb25kaXRpb25WYXJpYWJsZSogY29uZGl0aW9uKSB7CisgIGlmICghY29uZGl0aW9uKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vbWVkaWFfa2V5X3N5c3RlbV9tZWRpYV9jYXBhYmlsaXR5LmlkbCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2NvbmRpdGlvbl92YXJpYWJsZV9zaWduYWwuY2MKc2ltaWxhcml0eSBpbmRleCA2OSUKY29weSBmcm9tIHNyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9zeXN0ZW1fbWVkaWFfY2FwYWJpbGl0eS5pZGwKY29weSB0byBzcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9jb25kaXRpb25fdmFyaWFibGVfc2lnbmFsLmNjCmluZGV4IDUxZTFmMmUuLjVlOGU2N2IgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9zeXN0ZW1fbWVkaWFfY2FwYWJpbGl0eS5pZGwKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvY29uZGl0aW9uX3ZhcmlhYmxlX3NpZ25hbC5jYwpAQCAtMTIsOSArMTIsMTQgQEAKIC8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAxNi9DUi1lbmNyeXB0ZWQtbWVkaWEtMjAxNjA3MDUvI21lZGlha2V5c3lzdGVtbWVkaWFjYXBhYmlsaXR5LWRpY3Rpb25hcnkKKyNpbmNsdWRlICJzdGFyYm9hcmQvY29uZGl0aW9uX3ZhcmlhYmxlLmgiCiAKLWRpY3Rpb25hcnkgTWVkaWFLZXlTeXN0ZW1NZWRpYUNhcGFiaWxpdHkgewotICBET01TdHJpbmcgY29udGVudFR5cGUgPSAiIjsKLSAgRE9NU3RyaW5nIHJvYnVzdG5lc3MgPSAiIjsKLX07CisjaW5jbHVkZSA8d2luZG93cy5oPgorCitib29sIFNiQ29uZGl0aW9uVmFyaWFibGVTaWduYWwoU2JDb25kaXRpb25WYXJpYWJsZSogY29uZGl0aW9uKSB7CisgIGlmICghY29uZGl0aW9uKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIFdha2VDb25kaXRpb25WYXJpYWJsZShyZWludGVycHJldF9jYXN0PFBDT05ESVRJT05fVkFSSUFCTEU+KGNvbmRpdGlvbikpOworICByZXR1cm4gdHJ1ZTsKK30KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2NvbmRpdGlvbl92YXJpYWJsZV93YWl0LmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvY29uZGl0aW9uX3ZhcmlhYmxlX3dhaXQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIyNGFmYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2NvbmRpdGlvbl92YXJpYWJsZV93YWl0LmNjCkBAIC0wLDAgKzEsMzAgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJzdGFyYm9hcmQvY29uZGl0aW9uX3ZhcmlhYmxlLmgiCisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKK1NiQ29uZGl0aW9uVmFyaWFibGVSZXN1bHQgU2JDb25kaXRpb25WYXJpYWJsZVdhaXQoCisgICAgU2JDb25kaXRpb25WYXJpYWJsZSogY29uZGl0aW9uLAorICAgIFNiTXV0ZXgqIG11dGV4KSB7CisgIGlmICghY29uZGl0aW9uIHx8ICFtdXRleCkgeworICAgIHJldHVybiBrU2JDb25kaXRpb25WYXJpYWJsZUZhaWxlZDsKKyAgfQorICBib29sIHJlc3VsdCA9IFNsZWVwQ29uZGl0aW9uVmFyaWFibGVTUlcoCisgICAgICByZWludGVycHJldF9jYXN0PFBDT05ESVRJT05fVkFSSUFCTEU+KGNvbmRpdGlvbiksCisgICAgICByZWludGVycHJldF9jYXN0PFBTUldMT0NLPihtdXRleCksIElORklOSVRFLCAwKTsKKworICByZXR1cm4gcmVzdWx0ID8ga1NiQ29uZGl0aW9uVmFyaWFibGVTaWduYWxlZCA6IGtTYkNvbmRpdGlvblZhcmlhYmxlRmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvY29uZGl0aW9uX3ZhcmlhYmxlX3dhaXRfdGltZWQuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9jb25kaXRpb25fdmFyaWFibGVfd2FpdF90aW1lZC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTY3Njk1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvY29uZGl0aW9uX3ZhcmlhYmxlX3dhaXRfdGltZWQuY2MKQEAgLTAsMCArMSw1NCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgInN0YXJib2FyZC9jb25kaXRpb25fdmFyaWFibGUuaCIKKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvdGltZV91dGlscy5oIgorCit1c2luZyBzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI6OkNvbnZlcnRTYlRpbWVUb01pbGxpc1JvdW5kVXA7CisKK1NiQ29uZGl0aW9uVmFyaWFibGVSZXN1bHQgU2JDb25kaXRpb25WYXJpYWJsZVdhaXRUaW1lZCgKKyAgICBTYkNvbmRpdGlvblZhcmlhYmxlKiBjb25kaXRpb24sCisgICAgU2JNdXRleCogbXV0ZXgsCisgICAgU2JUaW1lIHRpbWVvdXQpIHsKKyAgaWYgKCFjb25kaXRpb24gfHwgIW11dGV4KSB7CisgICAgcmV0dXJuIGtTYkNvbmRpdGlvblZhcmlhYmxlRmFpbGVkOworICB9CisKKyAgaWYgKHRpbWVvdXQgPCAwKSB7CisgICAgdGltZW91dCA9IDA7CisgIH0KKyAgYm9vbCByZXN1bHQgPSBTbGVlcENvbmRpdGlvblZhcmlhYmxlU1JXKAorICAgICAgcmVpbnRlcnByZXRfY2FzdDxQQ09ORElUSU9OX1ZBUklBQkxFPihjb25kaXRpb24pLAorICAgICAgcmVpbnRlcnByZXRfY2FzdDxQU1JXTE9DSz4obXV0ZXgpLAorICAgICAgQ29udmVydFNiVGltZVRvTWlsbGlzUm91bmRVcCh0aW1lb3V0KSwgMCk7CisKKyAgaWYgKHRpbWVvdXQgPT0gMCkgeworICAgIC8vIFBlciBkb2N1bWVudGF0aW9uLCAiSWYgdGhlIHx0aW1lb3V0X2R1cmF0aW9ufCB2YWx1ZSBpcyBsZXNzIHRoYW4KKyAgICAvLyBvciBlcXVhbCB0byB6ZXJvLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhcyBxdWlja2x5IGFzIHBvc3NpYmxlIHdpdGggYQorICAgIC8vIGtTYkNvbmRpdGlvblZhcmlhYmxlVGltZWRPdXQgcmVzdWx0LiIKKyAgICByZXR1cm4ga1NiQ29uZGl0aW9uVmFyaWFibGVUaW1lZE91dDsKKyAgfQorCisgIGlmIChyZXN1bHQpIHsKKyAgICByZXR1cm4ga1NiQ29uZGl0aW9uVmFyaWFibGVTaWduYWxlZDsKKyAgfQorCisgIGlmIChHZXRMYXN0RXJyb3IoKSA9PSBFUlJPUl9USU1FT1VUKSB7CisgICAgcmV0dXJuIGtTYkNvbmRpdGlvblZhcmlhYmxlVGltZWRPdXQ7CisgIH0KKyAgcmV0dXJuIGtTYkNvbmRpdGlvblZhcmlhYmxlRmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZGlyZWN0b3J5X2Nhbl9vcGVuLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZGlyZWN0b3J5X2Nhbl9vcGVuLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NGE0MTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9kaXJlY3RvcnlfY2FuX29wZW4uY2MKQEAgLTAsMCArMSw0OCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgInN0YXJib2FyZC9kaXJlY3RvcnkuaCIKKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvZGlyZWN0b3J5X2ludGVybmFsLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi93Y2hhcl91dGlscy5oIgorCitib29sIFNiRGlyZWN0b3J5Q2FuT3Blbihjb25zdCBjaGFyKiBwYXRoKSB7CisgIGlmICgocGF0aCA9PSBudWxscHRyKSB8fCAocGF0aFswXSA9PSAnXDAnKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHN0ZDo6d3N0cmluZyBwYXRoX3dzdHJpbmcgPSBzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI6OkNTdHJpbmdUb1dTdHJpbmcocGF0aCk7CisgIHN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjo6VHJpbUV4dHJhRmlsZVNlcGFyYXRvcnMoJnBhdGhfd3N0cmluZyk7CisKKyAgaWYgKCFzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI6OklzQWJzb2x1dGVQYXRoKHBhdGhfd3N0cmluZykpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBXSU4zMl9GSU5EX0RBVEEgZmluZF9kYXRhID0gezB9OworCisgIEhBTkRMRSBzZWFyY2hfaGFuZGxlID0gRmluZEZpcnN0RmlsZUV4VygKKyAgICAgIHBhdGhfd3N0cmluZy5jX3N0cigpLCBGaW5kRXhJbmZvU3RhbmRhcmQsICZmaW5kX2RhdGEsCisgICAgICBGaW5kRXhTZWFyY2hOYW1lTWF0Y2gsIE5VTEwsIEZJTkRfRklSU1RfRVhfQ0FTRV9TRU5TSVRJVkUpOworICBpZiAoIXN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjo6SXNWYWxpZEhhbmRsZShzZWFyY2hfaGFuZGxlKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIEZpbmRDbG9zZShzZWFyY2hfaGFuZGxlKTsKKworICByZXR1cm4gZmluZF9kYXRhLmR3RmlsZUF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlk7Cit9CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfc3lzdGVtX21lZGlhX2NhcGFiaWxpdHkuaWRsIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZGlyZWN0b3J5X2Nsb3NlLmNjCnNpbWlsYXJpdHkgaW5kZXggNjQlCmNvcHkgZnJvbSBzcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfc3lzdGVtX21lZGlhX2NhcGFiaWxpdHkuaWRsCmNvcHkgdG8gc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZGlyZWN0b3J5X2Nsb3NlLmNjCmluZGV4IDUxZTFmMmUuLjZkNzc2NWEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9zeXN0ZW1fbWVkaWFfY2FwYWJpbGl0eS5pZGwKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZGlyZWN0b3J5X2Nsb3NlLmNjCkBAIC0xMiw5ICsxMiwyMCBAQAogLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKLS8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDE2L0NSLWVuY3J5cHRlZC1tZWRpYS0yMDE2MDcwNS8jbWVkaWFrZXlzeXN0ZW1tZWRpYWNhcGFiaWxpdHktZGljdGlvbmFyeQorI2luY2x1ZGUgInN0YXJib2FyZC9kaXJlY3RvcnkuaCIKIAotZGljdGlvbmFyeSBNZWRpYUtleVN5c3RlbU1lZGlhQ2FwYWJpbGl0eSB7Ci0gIERPTVN0cmluZyBjb250ZW50VHlwZSA9ICIiOwotICBET01TdHJpbmcgcm9idXN0bmVzcyA9ICIiOwotfTsKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKKyNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2RpcmVjdG9yeV9pbnRlcm5hbC5oIgorCitib29sIFNiRGlyZWN0b3J5Q2xvc2UoU2JEaXJlY3RvcnkgZGlyZWN0b3J5KSB7CisgIGlmICghU2JEaXJlY3RvcnlJc1ZhbGlkKGRpcmVjdG9yeSkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBib29sIHN1Y2Nlc3MgPSBDbG9zZUhhbmRsZShkaXJlY3RvcnktPmRpcmVjdG9yeV9oYW5kbGUpOworCisgIGRlbGV0ZSBkaXJlY3Rvcnk7CisKKyAgcmV0dXJuIHN1Y2Nlc3M7Cit9CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9kaXJlY3RvcnlfY3JlYXRlLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZGlyZWN0b3J5X2NyZWF0ZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmIxODQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZGlyZWN0b3J5X2NyZWF0ZS5jYwpAQCAtMCwwICsxLDQxIEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAic3RhcmJvYXJkL2RpcmVjdG9yeS5oIgorCisjaW5jbHVkZSA8d2luZG93cy5oPgorCisjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi9kaXJlY3RvcnlfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3djaGFyX3V0aWxzLmgiCisKK2Jvb2wgU2JEaXJlY3RvcnlDcmVhdGUoY29uc3QgY2hhciogcGF0aCkgeworICBpZiAoKHBhdGggPT0gbnVsbHB0cikgfHwgKHBhdGhbMF0gPT0gJ1wwJykpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBzdGQ6OndzdHJpbmcgcGF0aF93c3RyaW5nID0gc3RhcmJvYXJkOjpzaGFyZWQ6OndpbjMyOjpDU3RyaW5nVG9XU3RyaW5nKHBhdGgpOworCisgIHN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjo6VHJpbUV4dHJhRmlsZVNlcGFyYXRvcnMoJnBhdGhfd3N0cmluZyk7CisKKyAgaWYgKCFzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI6OklzQWJzb2x1dGVQYXRoKHBhdGhfd3N0cmluZykpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBCT09MIGRpcmVjdG9yeV9jcmVhdGVkID0gQ3JlYXRlRGlyZWN0b3J5VyhwYXRoX3dzdHJpbmcuY19zdHIoKSwgTlVMTCk7CisKKyAgYm9vbCBkaXJlY3RvcnlfZXhpc3RzID0KKyAgICAgIGRpcmVjdG9yeV9jcmVhdGVkIHx8IChHZXRMYXN0RXJyb3IoKSA9PSBFUlJPUl9BTFJFQURZX0VYSVNUUyk7CisKKyAgcmV0dXJuIGRpcmVjdG9yeV9leGlzdHM7Cit9CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9kaXJlY3RvcnlfZ2V0X25leHQuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9kaXJlY3RvcnlfZ2V0X25leHQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE0YzFiNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2RpcmVjdG9yeV9nZXRfbmV4dC5jYwpAQCAtMCwwICsxLDk0IEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAic3RhcmJvYXJkL2RpcmVjdG9yeS5oIgorCisjaW5jbHVkZSA8d2luZG93cy5oPgorCisjaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9zdHJpbmcuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2RpcmVjdG9yeV9pbnRlcm5hbC5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvd2NoYXJfdXRpbHMuaCIKKworbmFtZXNwYWNlIHsKKy8vIE9uZSBvZiB0aGUgZW50cmllcyBvZiBGSUxFX0lEX0JPVEhfRElSX0lORk8gaXMgYSBmaWxlIHBhdGgsIHNvIG1ha2UgdGhlCisvLyBidWZmZXIgYXQtbGVhc3Qgb25lIHBhdGggYmlnLgorY29uc3Qgc3RkOjpzaXplX3Qga0RpcmVjdG9yeUluZm9CdWZmZXJTaXplID0KKyAgICBTQl9GSUxFX01BWF9QQVRIICsgc2l6ZW9mKEZJTEVfSURfQk9USF9ESVJfSU5GTyk7CisKK3N0ZDo6ZGVxdWU8c3RkOjpzdHJpbmc+IEdldERpcmVjdG9yeUVudHJpZXMoSEFORExFIGRpcmVjdG9yeV9oYW5kbGUpIHsKKyAgLy8gQWNjb3JkaW5nIHRvCisgIC8vIGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvd2luZG93cy9kZXNrdG9wL2FhMzY0MjI2KHY9dnMuODUpLmFzcHgsCisgIC8vIEZJTEVfSURfQk9USF9ESVJfSU5GTyBtdXN0IGJlIGFsaWduZWQgb24gYSBEV09SRExPTkcgYm91bmRhcnkuCisgIGFsaWduYXMoCisgICAgICBzaXplb2YoRFdPUkRMT05HKSkgY2hhciBkaXJlY3RvcnlfaW5mb19idWZmZXJba0RpcmVjdG9yeUluZm9CdWZmZXJTaXplXTsKKworICBzdGQ6OmRlcXVlPHN0ZDo6c3RyaW5nPiBlbnRyaWVzOworICBCT09MIGRpcmVjdG9yeV9pbmZvX3N1Y2Nlc3MgPSBHZXRGaWxlSW5mb3JtYXRpb25CeUhhbmRsZUV4KAorICAgICAgZGlyZWN0b3J5X2hhbmRsZSwgRmlsZUlkQm90aERpcmVjdG9yeUluZm8sIGRpcmVjdG9yeV9pbmZvX2J1ZmZlciwKKyAgICAgIFNCX0FSUkFZX1NJWkUoZGlyZWN0b3J5X2luZm9fYnVmZmVyKSk7CisKKyAgaWYgKCFkaXJlY3RvcnlfaW5mb19zdWNjZXNzKSB7CisgICAgcmV0dXJuIGVudHJpZXM7CisgIH0KKworICBjb25zdCBjaGFyKiBkaXJlY3RvcnlfaW5mb19wb2ludGVyID0gZGlyZWN0b3J5X2luZm9fYnVmZmVyOworICBEV09SRCBuZXh0X2VudHJ5X29mZnNldCA9IDA7CisKKyAgZG8geworICAgIGF1dG8gZGlyZWN0b3J5X2luZm8gPQorICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IEZJTEVfSURfQk9USF9ESVJfSU5GTyo+KGRpcmVjdG9yeV9pbmZvX3BvaW50ZXIpOworCisgICAgLy8gRmlsZU5hbWUgaXMgaW4gVW5pY29kZSwgc28gZGl2aWRlIGJ5IDIgdG8gZ2V0IHRoZSByZWFsIGxlbmd0aC4KKyAgICBEV09SRCBudW1iZXJfY2hhcmFjdGVyc19pbl9maWxlbmFtZSA9IGRpcmVjdG9yeV9pbmZvLT5GaWxlTmFtZUxlbmd0aCAvIDI7CisgICAgc3RkOjpzdHJpbmcgYXNjaWlfcGF0aCA9IHN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjo6d2NoYXJfdFRvVVRGOCgKKyAgICAgICAgZGlyZWN0b3J5X2luZm8tPkZpbGVOYW1lLCBudW1iZXJfY2hhcmFjdGVyc19pbl9maWxlbmFtZSk7CisgICAgU0JfRENIRUNLKGFzY2lpX3BhdGguc2l6ZSgpID09IG51bWJlcl9jaGFyYWN0ZXJzX2luX2ZpbGVuYW1lKTsKKyAgICBib29sIGlzX2RvdHRlZF9kaXJlY3RvcnkgPQorICAgICAgICAhYXNjaWlfcGF0aC5jb21wYXJlKCIuIikgfHwgIWFzY2lpX3BhdGguY29tcGFyZSgiLi4iKTsKKyAgICBpZiAoIWlzX2RvdHRlZF9kaXJlY3RvcnkpIHsKKyAgICAgIGVudHJpZXMuZW1wbGFjZV9iYWNrKHN0ZDo6bW92ZShhc2NpaV9wYXRoKSk7CisgICAgfQorICAgIG5leHRfZW50cnlfb2Zmc2V0ID0gZGlyZWN0b3J5X2luZm8tPk5leHRFbnRyeU9mZnNldDsKKyAgICBkaXJlY3RvcnlfaW5mb19wb2ludGVyICs9IG5leHRfZW50cnlfb2Zmc2V0OworICB9IHdoaWxlIChuZXh0X2VudHJ5X29mZnNldCAhPSAwKTsKKworICByZXR1cm4gZW50cmllczsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK2Jvb2wgU2JEaXJlY3RvcnlHZXROZXh0KFNiRGlyZWN0b3J5IGRpcmVjdG9yeSwgU2JEaXJlY3RvcnlFbnRyeSogb3V0X2VudHJ5KSB7CisgIGlmICghU2JEaXJlY3RvcnlJc1ZhbGlkKGRpcmVjdG9yeSkgfHwgKG91dF9lbnRyeSA9PSBudWxscHRyKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGF1dG8mIG5leHRfZGlyZWN0b3J5X2VudHJpZXMgPSBkaXJlY3RvcnktPm5leHRfZGlyZWN0b3J5X2VudHJpZXM7CisgIGlmIChuZXh0X2RpcmVjdG9yeV9lbnRyaWVzLmVtcHR5KCkpIHsKKyAgICBuZXh0X2RpcmVjdG9yeV9lbnRyaWVzID0gR2V0RGlyZWN0b3J5RW50cmllcyhkaXJlY3RvcnktPmRpcmVjdG9yeV9oYW5kbGUpOworICB9CisKKyAgaWYgKG5leHRfZGlyZWN0b3J5X2VudHJpZXMuZW1wdHkoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGJvb2wgc3VjY2VzcyA9IHRydWU7CisgIGNvbnN0IGludCBlbnRyeV9uYW1lX3NpemUgPSBTQl9BUlJBWV9TSVpFX0lOVChvdXRfZW50cnktPm5hbWUpOworICBpZiAoU2JTdHJpbmdDb3B5KG91dF9lbnRyeS0+bmFtZSwgbmV4dF9kaXJlY3RvcnlfZW50cmllcy5yYmVnaW4oKS0+Y19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICBlbnRyeV9uYW1lX3NpemUpID49IGVudHJ5X25hbWVfc2l6ZSkgeworICAgIHN1Y2Nlc3MgPSBmYWxzZTsKKyAgfQorICBkaXJlY3RvcnktPm5leHRfZGlyZWN0b3J5X2VudHJpZXMucG9wX2JhY2soKTsKKyAgcmV0dXJuIHN1Y2Nlc3M7Cit9CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9kaXJlY3RvcnlfaW50ZXJuYWwuaCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2RpcmVjdG9yeV9pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyN2ZmZjkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9kaXJlY3RvcnlfaW50ZXJuYWwuaApAQCAtMCwwICsxLDk3IEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaWZuZGVmIFNUQVJCT0FSRF9TSEFSRURfV0lOMzJfRElSRUNUT1JZX0lOVEVSTkFMX0hfCisjZGVmaW5lIFNUQVJCT0FSRF9TSEFSRURfV0lOMzJfRElSRUNUT1JZX0lOVEVSTkFMX0hfCisKKyNpbmNsdWRlICJzdGFyYm9hcmQvZGlyZWN0b3J5LmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8ZGVxdWU+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL2ludGVybmFsX29ubHkuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2ZpbGVfaW50ZXJuYWwuaCIKKworI3ByYWdtYSB3YXJuaW5nKHB1c2gpCisKKy8vIFNiRmlsZVByaXZhdGUgaXMgZGVmaW5lZCBhcyBhIHN0cnVjdCwgYnV0IGZvciB3aW5kb3dzIGltcGxlbWVudGF0aW9uCisvLyBlbm91Z2ggZnVuY3Rpb25hbGl0eSBoYXMgYmVlbiBhZGRlZCBzbyB0aGF0IGl0IHdhcnJhbnRzIGJlaW5nIGEgY2xhc3MKKy8vIHBlciBHb29nbGUncyBDKysgc3R5bGUgZ3VpZGUuICBUaGlzIG1pc21hdGNoIGNhdXNlcyB0aGUgTWljcm9zb2Z0J3MgY29tcGlsZXIKKy8vIHRvIGdlbmVyYXRlIGEgd2FybmluZy4KKyNwcmFnbWEgd2FybmluZyhkaXNhYmxlIDogNDA5OSkKKworY2xhc3MgU2JEaXJlY3RvcnlQcml2YXRlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IFNiRGlyZWN0b3J5UHJpdmF0ZShIQU5ETEUgaGFuZGxlKSA6IGRpcmVjdG9yeV9oYW5kbGUoaGFuZGxlKSB7fQorCisgIGJvb2wgSGFzVmFsaWRIYW5kbGUoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjo6SXNWYWxpZEhhbmRsZShkaXJlY3RvcnlfaGFuZGxlKTsKKyAgfQorCisgIEhBTkRMRSBkaXJlY3RvcnlfaGFuZGxlOworICBzdGQ6OmRlcXVlPHN0ZDo6c3RyaW5nPiBuZXh0X2RpcmVjdG9yeV9lbnRyaWVzOworCisgIC8vIFNiRGlyZWN0b3J5UHJpdmF0ZSBpcyBuZWl0aGVyIGNvcHlhYmxlIG5vciBtb3ZhYmxlLgorICBTYkRpcmVjdG9yeVByaXZhdGUoY29uc3QgU2JEaXJlY3RvcnlQcml2YXRlJikgPSBkZWxldGU7CisgIFNiRGlyZWN0b3J5UHJpdmF0ZSYgb3BlcmF0b3I9KGNvbnN0IFNiRGlyZWN0b3J5UHJpdmF0ZSYpID0gZGVsZXRlOworfTsKKyNwcmFnbWEgd2FybmluZyhwb3ApCisKK25hbWVzcGFjZSBzdGFyYm9hcmQgeworbmFtZXNwYWNlIHNoYXJlZCB7CituYW1lc3BhY2Ugd2luMzIgeworCitpbmxpbmUgYm9vbCBIYXNWYWxpZEhhbmRsZShTYkRpcmVjdG9yeSBkaXJlY3RvcnkpIHsKKyAgaWYgKCFTYkRpcmVjdG9yeUlzVmFsaWQoZGlyZWN0b3J5KSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHJldHVybiBkaXJlY3RvcnktPkhhc1ZhbGlkSGFuZGxlKCk7Cit9CisKKy8vIFRoaXMgZnVuY3Rpb24gc3RyaXBzIHRyYWlsaW5nIGZpbGUgc2VwYXJhdG9ycyBmcm9tIGEgZGlyZWN0b3J5IG5hbWUuCisvLyBGb3IgZXhhbXBsZSBpZiB0aGUgZGlyZWN0b3J5IG5hbWUgd2FzICJDOlxcVGVtcFxcXFxcXCIsIGl0IHdvdWxkCisvLyBzdHJpcCB0aGVtLCBzbyB0aGF0IHRoZSBkaXJlY3RvcnkgbmFtZSBpcyBub3cgdG8gYmUgIkM6XFx0ZW1wIi4KK2lubGluZSB2b2lkIFRyaW1FeHRyYUZpbGVTZXBhcmF0b3JzKHN0ZDo6d3N0cmluZyogZGlybmFtZV9wb2ludGVyKSB7CisgIFNCX0RDSEVDSyhkaXJuYW1lX3BvaW50ZXIpOworICBzdGQ6OndzdHJpbmcmIGRpcm5hbWUgPSAqZGlybmFtZV9wb2ludGVyOworICBhdXRvIG5ld19lbmQgPQorICAgICAgc3RkOjpmaW5kX2lmX25vdChkaXJuYW1lLnJiZWdpbigpLCBkaXJuYW1lLnJlbmQoKSwgW10od2NoYXJfdCBjKSB7CisgICAgICAgIHJldHVybiBjID09IFNCX0ZJTEVfU0VQX0NIQVIgfHwgYyA9PSBTQl9GSUxFX0FMVF9TRVBfQ0hBUjsKKyAgICAgIH0pOworICBkaXJuYW1lLmVyYXNlKG5ld19lbmQuYmFzZSgpLCBkaXJuYW1lLmVuZCgpKTsKK30KKworaW5saW5lIGJvb2wgSXNBYnNvbHV0ZVBhdGgoY29uc3Qgc3RkOjp3c3RyaW5nJiBwYXRoKSB7CisgIHdjaGFyX3QgZnVsbF9wYXRoW1NCX0ZJTEVfTUFYX1BBVEhdOworICBEV09SRCBmdWxsX3BhdGhfc2l6ZSA9CisgICAgICBHZXRGdWxsUGF0aE5hbWVXKHBhdGguY19zdHIoKSwgU0JfQVJSQVlfU0laRShmdWxsX3BhdGgpLCBmdWxsX3BhdGgsIE5VTEwpOworICBpZiAoZnVsbF9wYXRoX3NpemUgPT0gMCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGludCBwYXRoX3NpemUgPSBzdGF0aWNfY2FzdDxpbnQ+KHBhdGguc2l6ZSgpKTsKKyAgcmV0dXJuIENvbXBhcmVTdHJpbmdFeChMT0NBTEVfTkFNRV9VU0VSX0RFRkFVTFQsIE5PUk1fSUdOT1JFQ0FTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLmNfc3RyKCksIHBhdGhfc2l6ZSwgZnVsbF9wYXRoLCBmdWxsX3BhdGhfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCAwKSA9PSBDU1RSX0VRVUFMOworfQorCit9ICAvLyBuYW1lc3BhY2Ugd2luMzIKK30gIC8vIG5hbWVzcGFjZSBzaGFyZWQKK30gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKKworI2VuZGlmICAvLyBTVEFSQk9BUkRfU0hBUkVEX1dJTjMyX0RJUkVDVE9SWV9JTlRFUk5BTF9IXwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZGlyZWN0b3J5X29wZW4uY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9kaXJlY3Rvcnlfb3Blbi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGFkZTdlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZGlyZWN0b3J5X29wZW4uY2MKQEAgLTAsMCArMSw1OCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgInN0YXJib2FyZC9kaXJlY3RvcnkuaCIKKworI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvZGlyZWN0b3J5X2ludGVybmFsLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi93Y2hhcl91dGlscy5oIgorCitTYkRpcmVjdG9yeSBTYkRpcmVjdG9yeU9wZW4oY29uc3QgY2hhciogcGF0aCwgU2JGaWxlRXJyb3IqIG91dF9lcnJvcikgeworICBpZiAoKHBhdGggPT0gbnVsbHB0cikgfHwgKHBhdGhbMF0gPT0gJ1wwJykpIHsKKyAgICBpZiAob3V0X2Vycm9yKSB7CisgICAgICAqb3V0X2Vycm9yID0ga1NiRmlsZUVycm9yTm90Rm91bmQ7CisgICAgfQorICAgIHJldHVybiBrU2JEaXJlY3RvcnlJbnZhbGlkOworICB9CisKKyAgc3RkOjp3c3RyaW5nIHBhdGhfd3N0cmluZyA9IHN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjo6Q1N0cmluZ1RvV1N0cmluZyhwYXRoKTsKKworICBpZiAoIXN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjo6SXNBYnNvbHV0ZVBhdGgocGF0aF93c3RyaW5nKSkgeworICAgIGlmIChvdXRfZXJyb3IpIHsKKyAgICAgICpvdXRfZXJyb3IgPSBrU2JGaWxlRXJyb3JOb3RGb3VuZDsKKyAgICB9CisgICAgcmV0dXJuIGtTYkRpcmVjdG9yeUludmFsaWQ7CisgIH0KKworICBIQU5ETEUgZGlyZWN0b3J5X2hhbmRsZSA9IHN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjo6T3BlbkZpbGVPckRpcmVjdG9yeSgKKyAgICAgIHBhdGgsIGtTYkZpbGVPcGVuT25seSB8IGtTYkZpbGVSZWFkLCBudWxscHRyLCBvdXRfZXJyb3IpOworCisgIGlmICghc3RhcmJvYXJkOjpzaGFyZWQ6OndpbjMyOjpJc1ZhbGlkSGFuZGxlKGRpcmVjdG9yeV9oYW5kbGUpKSB7CisgICAgcmV0dXJuIGtTYkRpcmVjdG9yeUludmFsaWQ7CisgIH0KKworICBGSUxFX0JBU0lDX0lORk8gYmFzaWNfaW5mbyA9IHswfTsKKyAgQk9PTCBiYXNpY19pbmZvX3N1Y2Nlc3MgPSBHZXRGaWxlSW5mb3JtYXRpb25CeUhhbmRsZUV4KAorICAgICAgZGlyZWN0b3J5X2hhbmRsZSwgRmlsZUJhc2ljSW5mbywgJmJhc2ljX2luZm8sIHNpemVvZihGSUxFX0JBU0lDX0lORk8pKTsKKworICBpZiAoIWJhc2ljX2luZm9fc3VjY2VzcyB8fAorICAgICAgIShiYXNpY19pbmZvLkZpbGVBdHRyaWJ1dGVzICYgRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZKSkgeworICAgIENsb3NlSGFuZGxlKGRpcmVjdG9yeV9oYW5kbGUpOworICAgIGlmIChvdXRfZXJyb3IpIHsKKyAgICAgICpvdXRfZXJyb3IgPSBrU2JGaWxlRXJyb3JOb3RBRGlyZWN0b3J5OworICAgIH0KKyAgICByZXR1cm4ga1NiRGlyZWN0b3J5SW52YWxpZDsKKyAgfQorCisgIHJldHVybiBuZXcgU2JEaXJlY3RvcnlQcml2YXRlKGRpcmVjdG9yeV9oYW5kbGUpOworfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZmlsZV9jYW5fb3Blbi5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2ZpbGVfY2FuX29wZW4uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRmMTlmNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2ZpbGVfY2FuX29wZW4uY2MKQEAgLTAsMCArMSw1MyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgInN0YXJib2FyZC9maWxlLmgiCisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKKyNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2ZpbGVfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3djaGFyX3V0aWxzLmgiCisKK2Jvb2wgU2JGaWxlQ2FuT3Blbihjb25zdCBjaGFyKiBwYXRoLCBpbnQgZmxhZ3MpIHsKKyAgaWYgKChwYXRoID09IG51bGxwdHIpIHx8IChwYXRoWzBdID09ICdcMCcpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgYm9vbCBjYW5fcmVhZCA9IGZsYWdzICYga1NiRmlsZVJlYWQ7CisgIGJvb2wgY2FuX3dyaXRlID0gZmxhZ3MgJiBrU2JGaWxlV3JpdGU7CisgIGlmICghY2FuX3JlYWQgJiYgIWNhbl93cml0ZSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHN0ZDo6d3N0cmluZyBwYXRoX3dzdHJpbmcgPSBzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI6OkNTdHJpbmdUb1dTdHJpbmcocGF0aCk7CisgIFdJTjMyX0ZJTkRfREFUQSBmaW5kX2RhdGEgPSB7MH07CisKKyAgSEFORExFIHNlYXJjaF9oYW5kbGUgPSBGaW5kRmlyc3RGaWxlRXhXKAorICAgICAgcGF0aF93c3RyaW5nLmNfc3RyKCksIEZpbmRFeEluZm9TdGFuZGFyZCwgJmZpbmRfZGF0YSwKKyAgICAgIEZpbmRFeFNlYXJjaE5hbWVNYXRjaCwgTlVMTCwgRklORF9GSVJTVF9FWF9DQVNFX1NFTlNJVElWRSk7CisgIGlmICghc3RhcmJvYXJkOjpzaGFyZWQ6OndpbjMyOjpJc1ZhbGlkSGFuZGxlKHNlYXJjaF9oYW5kbGUpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgYm9vbCBjYW5fb3BlbiA9IHRydWU7CisKKyAgaWYgKCgoZmluZF9kYXRhLmR3RmlsZUF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9SRUFET05MWSkgJiYgY2FuX3dyaXRlKSB8fAorICAgICAgIXN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjo6UGF0aEVuZHNXaXRoKHBhdGhfd3N0cmluZywgZmluZF9kYXRhLmNGaWxlTmFtZSkpIHsKKyAgICBjYW5fb3BlbiA9IGZhbHNlOworICB9CisKKyAgRmluZENsb3NlKHNlYXJjaF9oYW5kbGUpOworCisgIHJldHVybiBjYW5fb3BlbjsKK30KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9zeXN0ZW1fbWVkaWFfY2FwYWJpbGl0eS5pZGwgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9maWxlX2Nsb3NlLmNjCnNpbWlsYXJpdHkgaW5kZXggNjglCmNvcHkgZnJvbSBzcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfc3lzdGVtX21lZGlhX2NhcGFiaWxpdHkuaWRsCmNvcHkgdG8gc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZmlsZV9jbG9zZS5jYwppbmRleCA1MWUxZjJlLi5jZTYxYzU0IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfc3lzdGVtX21lZGlhX2NhcGFiaWxpdHkuaWRsCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2ZpbGVfY2xvc2UuY2MKQEAgLTEyLDkgKzEyLDIwIEBACiAvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTYvQ1ItZW5jcnlwdGVkLW1lZGlhLTIwMTYwNzA1LyNtZWRpYWtleXN5c3RlbW1lZGlhY2FwYWJpbGl0eS1kaWN0aW9uYXJ5CisjaW5jbHVkZSAic3RhcmJvYXJkL2ZpbGUuaCIKIAotZGljdGlvbmFyeSBNZWRpYUtleVN5c3RlbU1lZGlhQ2FwYWJpbGl0eSB7Ci0gIERPTVN0cmluZyBjb250ZW50VHlwZSA9ICIiOwotICBET01TdHJpbmcgcm9idXN0bmVzcyA9ICIiOwotfTsKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKKyNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2ZpbGVfaW50ZXJuYWwuaCIKKworYm9vbCBTYkZpbGVDbG9zZShTYkZpbGUgZmlsZSkgeworICBpZiAoIVNiRmlsZUlzVmFsaWQoZmlsZSkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBib29sIHN1Y2Nlc3MgPSBDbG9zZUhhbmRsZShmaWxlLT5maWxlX2hhbmRsZSk7CisKKyAgZGVsZXRlIGZpbGU7CisKKyAgcmV0dXJuIHN1Y2Nlc3M7Cit9CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfc3lzdGVtX21lZGlhX2NhcGFiaWxpdHkuaWRsIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZmlsZV9kZWxldGUuY2MKc2ltaWxhcml0eSBpbmRleCA2MSUKY29weSBmcm9tIHNyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9zeXN0ZW1fbWVkaWFfY2FwYWJpbGl0eS5pZGwKY29weSB0byBzcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9maWxlX2RlbGV0ZS5jYwppbmRleCA1MWUxZjJlLi5mZWNiZmQxIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfc3lzdGVtX21lZGlhX2NhcGFiaWxpdHkuaWRsCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2ZpbGVfZGVsZXRlLmNjCkBAIC0xMiw5ICsxMiwxOSBAQAogLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKLS8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDE2L0NSLWVuY3J5cHRlZC1tZWRpYS0yMDE2MDcwNS8jbWVkaWFrZXlzeXN0ZW1tZWRpYWNhcGFiaWxpdHktZGljdGlvbmFyeQorI2luY2x1ZGUgInN0YXJib2FyZC9maWxlLmgiCiAKLWRpY3Rpb25hcnkgTWVkaWFLZXlTeXN0ZW1NZWRpYUNhcGFiaWxpdHkgewotICBET01TdHJpbmcgY29udGVudFR5cGUgPSAiIjsKLSAgRE9NU3RyaW5nIHJvYnVzdG5lc3MgPSAiIjsKLX07CisjaW5jbHVkZSA8d2luZG93cy5oPgorCisjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi9maWxlX2ludGVybmFsLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi93Y2hhcl91dGlscy5oIgorCitib29sIFNiRmlsZURlbGV0ZShjb25zdCBjaGFyKiBwYXRoKSB7CisgIGlmICgocGF0aCA9PSBudWxscHRyKSB8fCAqcGF0aCA9PSAnXDAnKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgc3RkOjp3c3RyaW5nIHBhdGhfd3N0cmluZyA9IHN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjo6Q1N0cmluZ1RvV1N0cmluZyhwYXRoKTsKKworICByZXR1cm4gRGVsZXRlRmlsZVcocGF0aF93c3RyaW5nLmNfc3RyKCkpOworfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZmlsZV9leGlzdHMuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9maWxlX2V4aXN0cy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjBmMTdkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZmlsZV9leGlzdHMuY2MKQEAgLTAsMCArMSw0MSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgInN0YXJib2FyZC9maWxlLmgiCisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKKyNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2ZpbGVfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3djaGFyX3V0aWxzLmgiCisKK2Jvb2wgU2JGaWxlRXhpc3RzKGNvbnN0IGNoYXIqIHBhdGgpIHsKKyAgaWYgKChwYXRoID09IG51bGxwdHIpIHx8IChwYXRoWzBdID09ICdcMCcpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgc3RkOjp3c3RyaW5nIHBhdGhfd3N0cmluZyA9IHN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjo6Q1N0cmluZ1RvV1N0cmluZyhwYXRoKTsKKyAgV0lOMzJfRklORF9EQVRBIGZpbmRfZGF0YSA9IHswfTsKKworICBIQU5ETEUgc2VhcmNoX2hhbmRsZSA9IEZpbmRGaXJzdEZpbGVFeFcoCisgICAgICBwYXRoX3dzdHJpbmcuY19zdHIoKSwgRmluZEV4SW5mb1N0YW5kYXJkLCAmZmluZF9kYXRhLAorICAgICAgRmluZEV4U2VhcmNoTmFtZU1hdGNoLCBOVUxMLCBGSU5EX0ZJUlNUX0VYX0NBU0VfU0VOU0lUSVZFKTsKKworICBpZiAoIXN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjo6SXNWYWxpZEhhbmRsZShzZWFyY2hfaGFuZGxlKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIEZpbmRDbG9zZShzZWFyY2hfaGFuZGxlKTsKKworICByZXR1cm4gc3RhcmJvYXJkOjpzaGFyZWQ6OndpbjMyOjpQYXRoRW5kc1dpdGgocGF0aF93c3RyaW5nLCBmaW5kX2RhdGEuY0ZpbGVOYW1lKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9zeXN0ZW1fbWVkaWFfY2FwYWJpbGl0eS5pZGwgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9maWxlX2ZsdXNoLmNjCnNpbWlsYXJpdHkgaW5kZXggNjclCmNvcHkgZnJvbSBzcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfc3lzdGVtX21lZGlhX2NhcGFiaWxpdHkuaWRsCmNvcHkgdG8gc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZmlsZV9mbHVzaC5jYwppbmRleCA1MWUxZjJlLi4xYzk2NTVjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfc3lzdGVtX21lZGlhX2NhcGFiaWxpdHkuaWRsCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2ZpbGVfZmx1c2guY2MKQEAgLTEyLDkgKzEyLDE3IEBACiAvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTYvQ1ItZW5jcnlwdGVkLW1lZGlhLTIwMTYwNzA1LyNtZWRpYWtleXN5c3RlbW1lZGlhY2FwYWJpbGl0eS1kaWN0aW9uYXJ5CisjaW5jbHVkZSAic3RhcmJvYXJkL2ZpbGUuaCIKIAotZGljdGlvbmFyeSBNZWRpYUtleVN5c3RlbU1lZGlhQ2FwYWJpbGl0eSB7Ci0gIERPTVN0cmluZyBjb250ZW50VHlwZSA9ICIiOwotICBET01TdHJpbmcgcm9idXN0bmVzcyA9ICIiOwotfTsKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKKyNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi9maWxlX2ludGVybmFsLmgiCisKK2Jvb2wgU2JGaWxlRmx1c2goU2JGaWxlIGZpbGUpIHsKKyAgaWYgKCFzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI6Okhhc1ZhbGlkSGFuZGxlKGZpbGUpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcmV0dXJuIEZsdXNoRmlsZUJ1ZmZlcnMoZmlsZS0+ZmlsZV9oYW5kbGUpOworfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZmlsZV9nZXRfaW5mby5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2ZpbGVfZ2V0X2luZm8uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWEyNTc1MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2ZpbGVfZ2V0X2luZm8uY2MKQEAgLTAsMCArMSw1OSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgInN0YXJib2FyZC9maWxlLmgiCisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKKyNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi9maWxlX2ludGVybmFsLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aW1lX3V0aWxzLmgiCisKK2Jvb2wgU2JGaWxlR2V0SW5mbyhTYkZpbGUgZmlsZSwgU2JGaWxlSW5mbyogb3V0X2luZm8pIHsKKyAgaWYgKCFzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI6Okhhc1ZhbGlkSGFuZGxlKGZpbGUpIHx8ICFvdXRfaW5mbykgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIEZJTEVfQkFTSUNfSU5GTyBiYXNpY19pbmZvID0gezB9OworICBCT09MIGJhc2ljX2luZm9fc3VjY2VzcyA9IEdldEZpbGVJbmZvcm1hdGlvbkJ5SGFuZGxlRXgoCisgICAgICBmaWxlLT5maWxlX2hhbmRsZSwgRmlsZUJhc2ljSW5mbywgJmJhc2ljX2luZm8sIHNpemVvZihGSUxFX0JBU0lDX0lORk8pKTsKKyAgaWYgKCFiYXNpY19pbmZvX3N1Y2Nlc3MpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBGSUxFX1NUQU5EQVJEX0lORk8gc3RhbmRhcmRfaW5mbyA9IHswfTsKKyAgQk9PTCBzdGFuZGFyZF9pbmZvX3N1Y2Nlc3MgPQorICAgICAgR2V0RmlsZUluZm9ybWF0aW9uQnlIYW5kbGVFeChmaWxlLT5maWxlX2hhbmRsZSwgRmlsZVN0YW5kYXJkSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YW5kYXJkX2luZm8sIHNpemVvZihGSUxFX1NUQU5EQVJEX0lORk8pKTsKKyAgaWYgKCFzdGFuZGFyZF9pbmZvX3N1Y2Nlc3MpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBvdXRfaW5mby0+c2l6ZSA9IHN0YW5kYXJkX2luZm8uRW5kT2ZGaWxlLlF1YWRQYXJ0OworICBTQl9EQ0hFQ0sob3V0X2luZm8tPnNpemUgPj0gMCk7CisKKyAgdXNpbmcgc3RhcmJvYXJkOjpzaGFyZWQ6OndpbjMyOjpDb252ZXJ0RmlsZVRpbWVUaWNrc1RvU2JUaW1lOworCisgIG91dF9pbmZvLT5jcmVhdGlvbl90aW1lID0KKyAgICAgIENvbnZlcnRGaWxlVGltZVRpY2tzVG9TYlRpbWUoYmFzaWNfaW5mby5DcmVhdGlvblRpbWUpOworICBvdXRfaW5mby0+bGFzdF9hY2Nlc3NlZCA9CisgICAgICBDb252ZXJ0RmlsZVRpbWVUaWNrc1RvU2JUaW1lKGJhc2ljX2luZm8uTGFzdEFjY2Vzc1RpbWUpOworICBvdXRfaW5mby0+bGFzdF9tb2RpZmllZCA9CisgICAgICBDb252ZXJ0RmlsZVRpbWVUaWNrc1RvU2JUaW1lKGJhc2ljX2luZm8uTGFzdFdyaXRlVGltZSk7CisKKyAgb3V0X2luZm8tPmlzX3N5bWJvbGljX2xpbmsgPSBmYWxzZTsKKyAgb3V0X2luZm8tPmlzX2RpcmVjdG9yeSA9IHN0YW5kYXJkX2luZm8uRGlyZWN0b3J5OworCisgIHJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZmlsZV9nZXRfcGF0aF9pbmZvLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZmlsZV9nZXRfcGF0aF9pbmZvLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhYzY5MjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9maWxlX2dldF9wYXRoX2luZm8uY2MKQEAgLTAsMCArMSw1NSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgInN0YXJib2FyZC9maWxlLmgiCisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKKyNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi9maWxlX2ludGVybmFsLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aW1lX3V0aWxzLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi93Y2hhcl91dGlscy5oIgorCitib29sIFNiRmlsZUdldFBhdGhJbmZvKGNvbnN0IGNoYXIqIHBhdGgsIFNiRmlsZUluZm8qIG91dF9pbmZvKSB7CisgIGlmICghcGF0aCB8fCBwYXRoWzBdID09ICdcMCcgfHwgIW91dF9pbmZvKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgc3RkOjp3c3RyaW5nIHBhdGhfd3N0cmluZyA9IHN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjo6Q1N0cmluZ1RvV1N0cmluZyhwYXRoKTsKKworICBXSU4zMl9GSUxFX0FUVFJJQlVURV9EQVRBIGF0dHJpYnV0ZV9kYXRhID0gezB9OworICBpZiAoIUdldEZpbGVBdHRyaWJ1dGVzRXhXKHBhdGhfd3N0cmluZy5jX3N0cigpLCBHZXRGaWxlRXhJbmZvU3RhbmRhcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZV9kYXRhKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIG91dF9pbmZvLT5zaXplID0gc3RhdGljX2Nhc3Q8aW50NjRfdD4oYXR0cmlidXRlX2RhdGEubkZpbGVTaXplSGlnaCkgPDwgMzIgfAorICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZV9kYXRhLm5GaWxlU2l6ZUxvdzsKKyAgU0JfRENIRUNLKG91dF9pbmZvLT5zaXplID49IDApOworCisgIHVzaW5nIHN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjo6Q29udmVydEZpbGVUaW1lVG9TYlRpbWU7CisKKyAgb3V0X2luZm8tPmNyZWF0aW9uX3RpbWUgPQorICAgICAgQ29udmVydEZpbGVUaW1lVG9TYlRpbWUoYXR0cmlidXRlX2RhdGEuZnRDcmVhdGlvblRpbWUpOworICBvdXRfaW5mby0+bGFzdF9hY2Nlc3NlZCA9CisgICAgICBDb252ZXJ0RmlsZVRpbWVUb1NiVGltZShhdHRyaWJ1dGVfZGF0YS5mdExhc3RBY2Nlc3NUaW1lKTsKKyAgb3V0X2luZm8tPmxhc3RfbW9kaWZpZWQgPQorICAgICAgQ29udmVydEZpbGVUaW1lVG9TYlRpbWUoYXR0cmlidXRlX2RhdGEuZnRMYXN0V3JpdGVUaW1lKTsKKworICBvdXRfaW5mby0+aXNfc3ltYm9saWNfbGluayA9IGZhbHNlOworICBvdXRfaW5mby0+aXNfZGlyZWN0b3J5ID0KKyAgICAgIChhdHRyaWJ1dGVfZGF0YS5kd0ZpbGVBdHRyaWJ1dGVzICYgRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZKTsKKworICByZXR1cm4gdHJ1ZTsKK30KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2ZpbGVfaW50ZXJuYWwuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9maWxlX2ludGVybmFsLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyZDc2MjEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9maWxlX2ludGVybmFsLmNjCkBAIC0wLDAgKzEsMTQyIEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi9maWxlX2ludGVybmFsLmgiCisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKKyNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi93Y2hhcl91dGlscy5oIgorCituYW1lc3BhY2Ugc3RhcmJvYXJkIHsKK25hbWVzcGFjZSBzaGFyZWQgeworbmFtZXNwYWNlIHdpbjMyIHsKKworSEFORExFIE9wZW5GaWxlT3JEaXJlY3RvcnkoY29uc3QgY2hhciogcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIG91dF9jcmVhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JGaWxlRXJyb3IqIG91dF9lcnJvcikgeworICBjb25zdCBEV09SRCBzaGFyZV9tb2RlID0gRklMRV9TSEFSRV9SRUFEIHwgRklMRV9TSEFSRV9XUklURTsKKworICBEV09SRCBjcmVhdGlvbl9kaXNwb3NpdGlvbiA9IDA7CisgIGlmIChmbGFncyAmIGtTYkZpbGVDcmVhdGVPbmx5KSB7CisgICAgU0JfRENIRUNLKCFjcmVhdGlvbl9kaXNwb3NpdGlvbik7CisgICAgU0JfRENIRUNLKCEoZmxhZ3MgJiBrU2JGaWxlQ3JlYXRlQWx3YXlzKSk7CisgICAgY3JlYXRpb25fZGlzcG9zaXRpb24gPSBDUkVBVEVfTkVXOworICB9CisKKyAgaWYgKG91dF9jcmVhdGVkKSB7CisgICAgKm91dF9jcmVhdGVkID0gZmFsc2U7CisgIH0KKworICBpZiAoZmxhZ3MgJiBrU2JGaWxlQ3JlYXRlQWx3YXlzKSB7CisgICAgU0JfRENIRUNLKCFjcmVhdGlvbl9kaXNwb3NpdGlvbik7CisgICAgU0JfRENIRUNLKCEoZmxhZ3MgJiBrU2JGaWxlQ3JlYXRlT25seSkpOworICAgIGNyZWF0aW9uX2Rpc3Bvc2l0aW9uID0gQ1JFQVRFX0FMV0FZUzsKKyAgfQorCisgIGlmIChmbGFncyAmIGtTYkZpbGVPcGVuVHJ1bmNhdGVkKSB7CisgICAgU0JfRENIRUNLKCFjcmVhdGlvbl9kaXNwb3NpdGlvbik7CisgICAgU0JfRENIRUNLKGZsYWdzICYga1NiRmlsZVdyaXRlKTsKKyAgICBjcmVhdGlvbl9kaXNwb3NpdGlvbiA9IFRSVU5DQVRFX0VYSVNUSU5HOworICB9CisKKyAgaWYgKGZsYWdzICYga1NiRmlsZU9wZW5Pbmx5KSB7CisgICAgU0JfRENIRUNLKCEoZmxhZ3MgJiBrU2JGaWxlT3BlbkFsd2F5cykpOworICAgIGNyZWF0aW9uX2Rpc3Bvc2l0aW9uID0gT1BFTl9FWElTVElORzsKKyAgfQorCisgIGlmIChmbGFncyAmIGtTYkZpbGVPcGVuQWx3YXlzKSB7CisgICAgU0JfRENIRUNLKCEoZmxhZ3MgJiBrU2JGaWxlT3Blbk9ubHkpKTsKKyAgICBjcmVhdGlvbl9kaXNwb3NpdGlvbiA9IE9QRU5fQUxXQVlTOworICB9CisKKyAgaWYgKCFjcmVhdGlvbl9kaXNwb3NpdGlvbiAmJiAhKGZsYWdzICYga1NiRmlsZU9wZW5Pbmx5KSAmJgorICAgICAgIShmbGFncyAmIGtTYkZpbGVPcGVuQWx3YXlzKSkgeworICAgIFNCX05PVFJFQUNIRUQoKTsKKyAgICBlcnJubyA9IEVOT1RTVVA7CisgICAgaWYgKG91dF9lcnJvcikgeworICAgICAgKm91dF9lcnJvciA9IGtTYkZpbGVFcnJvckZhaWxlZDsKKyAgICB9CisKKyAgICByZXR1cm4ga1NiRmlsZUludmFsaWQ7CisgIH0KKworICBEV09SRCBkZXNpcmVkX2FjY2VzcyA9IDA7CisgIGlmIChmbGFncyAmIGtTYkZpbGVSZWFkKSB7CisgICAgZGVzaXJlZF9hY2Nlc3MgfD0gR0VORVJJQ19SRUFEOworICB9CisKKyAgY29uc3QgYm9vbCBvcGVuX2ZpbGVfaW5fd3JpdGVfbW9kZSA9IGZsYWdzICYga1NiRmlsZVdyaXRlOworICBpZiAob3Blbl9maWxlX2luX3dyaXRlX21vZGUpIHsKKyAgICBkZXNpcmVkX2FjY2VzcyB8PSBHRU5FUklDX1dSSVRFOworICB9CisKKyAgLy8gVE9ETzogU3VwcG9ydCBhc3luY2hyb25vdXMgSU8sIGlmIG5lY2Vzc2FyeS4KKyAgU0JfRENIRUNLKCEoZmxhZ3MgJiBrU2JGaWxlQXN5bmMpKTsKKworICBTQl9EQ0hFQ0soZGVzaXJlZF9hY2Nlc3MgIT0gMCkgPDwgIkludmFsaWQgcGVybWlzc2lvbiBmbGFnLiI7CisKKyAgc3RkOjp3c3RyaW5nIHBhdGhfd3N0cmluZyA9IHN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjo6Q1N0cmluZ1RvV1N0cmluZyhwYXRoKTsKKworICBDUkVBVEVGSUxFMl9FWFRFTkRFRF9QQVJBTUVURVJTIGNyZWF0ZV9leF9wYXJhbXMgPSB7MH07CisgIC8vIEVuYWJsaW5nIHxGSUxFX0ZMQUdfQkFDS1VQX1NFTUFOVElDU3wgYWxsb3dzIHVzIHRvIGZpZ3VyZSBvdXQgaWYgdGhlIHBhdGgKKyAgLy8gaXMgYSBkaXJlY3RvcnkuCisgIGNyZWF0ZV9leF9wYXJhbXMuZHdGaWxlRmxhZ3MgPSBGSUxFX0ZMQUdfQkFDS1VQX1NFTUFOVElDUzsKKyAgY3JlYXRlX2V4X3BhcmFtcy5kd0ZpbGVGbGFncyB8PSBGSUxFX0ZMQUdfUE9TSVhfU0VNQU5USUNTOworICBjcmVhdGVfZXhfcGFyYW1zLmR3RmlsZUF0dHJpYnV0ZXMgPSBGSUxFX0FUVFJJQlVURV9OT1JNQUw7CisgIGNyZWF0ZV9leF9wYXJhbXMuZHdTZWN1cml0eVFvc0ZsYWdzID0gU0VDVVJJVFlfQU5PTllNT1VTOworICBjcmVhdGVfZXhfcGFyYW1zLmR3U2l6ZSA9IHNpemVvZihDUkVBVEVGSUxFMl9FWFRFTkRFRF9QQVJBTUVURVJTKTsKKworICBIQU5ETEUgZmlsZV9oYW5kbGUgPQorICAgICAgQ3JlYXRlRmlsZTIocGF0aF93c3RyaW5nLmNfc3RyKCksIGRlc2lyZWRfYWNjZXNzLCBzaGFyZV9tb2RlLAorICAgICAgICAgICAgICAgICAgY3JlYXRpb25fZGlzcG9zaXRpb24sICZjcmVhdGVfZXhfcGFyYW1zKTsKKworICBpZiAob3V0X2NyZWF0ZWQpIHsKKyAgICBpZiAoZmxhZ3MgJiAoa1NiRmlsZUNyZWF0ZUFsd2F5cyB8IGtTYkZpbGVDcmVhdGVPbmx5KSkgeworICAgICAgKm91dF9jcmVhdGVkID0gc3RhcmJvYXJkOjpzaGFyZWQ6OndpbjMyOjpJc1ZhbGlkSGFuZGxlKGZpbGVfaGFuZGxlKTsKKyAgICB9CisKKyAgICBpZiAoKGNyZWF0aW9uX2Rpc3Bvc2l0aW9uID09IE9QRU5fQUxXQVlTKSAmJiAob3Blbl9maWxlX2luX3dyaXRlX21vZGUpKSB7CisgICAgICAqb3V0X2NyZWF0ZWQgPSAoR2V0TGFzdEVycm9yKCkgIT0gRVJST1JfQUxSRUFEWV9FWElTVFMpOworICAgIH0KKyAgfQorCisgIGlmIChvdXRfZXJyb3IpIHsKKyAgICBpZiAoc3RhcmJvYXJkOjpzaGFyZWQ6OndpbjMyOjpJc1ZhbGlkSGFuZGxlKGZpbGVfaGFuZGxlKSkgeworICAgICAgKm91dF9lcnJvciA9IGtTYkZpbGVPazsKKyAgICB9IGVsc2UgeworICAgICAgY29uc3QgRFdPUkQgbGFzdF9lcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgc3dpdGNoIChsYXN0X2Vycm9yKSB7CisgICAgICAgIGNhc2UgRVJST1JfQUNDRVNTX0RFTklFRDoKKyAgICAgICAgICAqb3V0X2Vycm9yID0ga1NiRmlsZUVycm9yQWNjZXNzRGVuaWVkOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVSUk9SX0ZJTEVfRVhJU1RTOgorICAgICAgICAgICpvdXRfZXJyb3IgPSBrU2JGaWxlRXJyb3JBY2Nlc3NEZW5pZWQ7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRVJST1JfRklMRV9OT1RfRk9VTkQ6CisgICAgICAgICAgKm91dF9lcnJvciA9IGtTYkZpbGVFcnJvck5vdEZvdW5kOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICpvdXRfZXJyb3IgPSBrU2JGaWxlRXJyb3JGYWlsZWQ7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIGZpbGVfaGFuZGxlOworfQorCit9ICAvLyBuYW1lc3BhY2Ugd2luMzIKK30gIC8vIG5hbWVzcGFjZSBzaGFyZWQKK30gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2ZpbGVfaW50ZXJuYWwuaCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2ZpbGVfaW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmE4YTEzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZmlsZV9pbnRlcm5hbC5oCkBAIC0wLDAgKzEsOTQgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpZm5kZWYgU1RBUkJPQVJEX1NIQVJFRF9XSU4zMl9GSUxFX0lOVEVSTkFMX0hfCisjZGVmaW5lIFNUQVJCT0FSRF9TSEFSRURfV0lOMzJfRklMRV9JTlRFUk5BTF9IXworCisjaW5jbHVkZSA8d3R5cGVzLmg+CisKKyNpbmNsdWRlIDxjd2NoYXI+ICAvLyBUaGlzIGZpbGUgaW5jbHVkZWQgZm9yIHN0ZDo6d2NzbGVuLgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgInN0YXJib2FyZC9maWxlLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9pbnRlcm5hbF9vbmx5LmgiCisKK25hbWVzcGFjZSBzdGFyYm9hcmQgeworbmFtZXNwYWNlIHNoYXJlZCB7CituYW1lc3BhY2Ugd2luMzIgeworCitpbmxpbmUgYm9vbCBJc1ZhbGlkSGFuZGxlKEhBTkRMRSBoYW5kbGUpIHsKKyAgcmV0dXJuIGhhbmRsZSAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHdpbjMyCit9ICAvLyBuYW1lc3BhY2Ugc2hhcmVkCit9ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCisKKyNwcmFnbWEgd2FybmluZyhwdXNoKQorCisvLyBTYkZpbGVQcml2YXRlIGlzIGRlZmluZWQgYXMgYSBzdHJ1Y3QsIGJ1dCBmb3Igd2luZG93cyBpbXBsZW1lbnRhdGlvbgorLy8gZW5vdWdoIGZ1bmN0aW9uYWxpdHkgaGFzIGJlZW4gYWRkZWQgc28gdGhhdCBpdCB3YXJyYW50cyBiZWluZyBhIGNsYXNzCisvLyBwZXIgR29vZ2xlJ3MgQysrIHN0eWxlIGd1aWRlLiAgVGhpcyBtaXNtYXRjaCBjYXVzZXMgdGhlIE1pY3Jvc29mdCdzIGNvbXBpbGVyCisvLyB0byBnZW5lcmF0ZSBhIHdhcm5pbmcuCisjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZSA6IDQwOTkpCisKK2NsYXNzIFNiRmlsZVByaXZhdGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgU2JGaWxlUHJpdmF0ZShIQU5ETEUgaGFuZGxlKSA6IGZpbGVfaGFuZGxlKGhhbmRsZSkge30KKworICBib29sIEhhc1ZhbGlkSGFuZGxlKCkgY29uc3QgeworICAgIHJldHVybiBzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI6OklzVmFsaWRIYW5kbGUoZmlsZV9oYW5kbGUpOworICB9CisKKyAgSEFORExFIGZpbGVfaGFuZGxlOworCisgIC8vIFNiRmlsZVByaXZhdGUgaXMgbmVpdGhlciBjb3B5YWJsZSBub3IgbW92YWJsZS4KKyAgU2JGaWxlUHJpdmF0ZShjb25zdCBTYkZpbGVQcml2YXRlJikgPSBkZWxldGU7CisgIFNiRmlsZVByaXZhdGUmIG9wZXJhdG9yPShjb25zdCBTYkZpbGVQcml2YXRlJikgPSBkZWxldGU7Cit9OworI3ByYWdtYSB3YXJuaW5nKHBvcCkKKworbmFtZXNwYWNlIHN0YXJib2FyZCB7CituYW1lc3BhY2Ugc2hhcmVkIHsKK25hbWVzcGFjZSB3aW4zMiB7CisKK2lubGluZSBib29sIEhhc1ZhbGlkSGFuZGxlKFNiRmlsZSBmaWxlKSB7CisgIGlmICghU2JGaWxlSXNWYWxpZChmaWxlKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHJldHVybiBmaWxlLT5IYXNWYWxpZEhhbmRsZSgpOworfQorCitpbmxpbmUgYm9vbCBQYXRoRW5kc1dpdGgoY29uc3Qgc3RkOjp3c3RyaW5nJiBwYXRoLCBjb25zdCB3Y2hhcl90KiBmaWxlbmFtZSkgeworICBzaXplX3QgZmlsZW5hbWVfbGVuZ3RoID0gc3RkOjp3Y3NsZW4oZmlsZW5hbWUpOworICBpZiAoZmlsZW5hbWVfbGVuZ3RoID4gcGF0aC5zaXplKCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBzaXplX3QgcGF0aF9vZmZzZXQgPSBwYXRoLnNpemUoKSAtIGZpbGVuYW1lX2xlbmd0aDsKKworICByZXR1cm4gd2NzY21wKHBhdGguY19zdHIoKSArIHBhdGhfb2Zmc2V0LCBmaWxlbmFtZSkgPT0gMDsKK30KKworSEFORExFIE9wZW5GaWxlT3JEaXJlY3RvcnkoY29uc3QgY2hhciogcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIG91dF9jcmVhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JGaWxlRXJyb3IqIG91dF9lcnJvcik7CisKK30gIC8vIG5hbWVzcGFjZSB3aW4zMgorfSAgLy8gbmFtZXNwYWNlIHNoYXJlZAorfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZAorCisjZW5kaWYgIC8vIFNUQVJCT0FSRF9TSEFSRURfV0lOMzJfRklMRV9JTlRFUk5BTF9IXwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZmlsZV9vcGVuLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZmlsZV9vcGVuLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4NDA3YzUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9maWxlX29wZW4uY2MKQEAgLTAsMCArMSw0MSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgInN0YXJib2FyZC9maWxlLmgiCisKKyNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2ZpbGVfaW50ZXJuYWwuaCIKKworU2JGaWxlIFNiRmlsZU9wZW4oY29uc3QgY2hhciogcGF0aCwKKyAgICAgICAgICAgICAgICAgIGludCBmbGFncywKKyAgICAgICAgICAgICAgICAgIGJvb2wqIG91dF9jcmVhdGVkLAorICAgICAgICAgICAgICAgICAgU2JGaWxlRXJyb3IqIG91dF9lcnJvcikgeworICBpZiAoKHBhdGggPT0gbnVsbHB0cikgfHwgKHBhdGhbMF0gPT0gJ1wwJykpIHsKKyAgICBpZiAob3V0X2NyZWF0ZWQpIHsKKyAgICAgICpvdXRfY3JlYXRlZCA9IGZhbHNlOworICAgIH0KKyAgICBpZiAob3V0X2Vycm9yKSB7CisgICAgICAqb3V0X2Vycm9yID0ga1NiRmlsZUVycm9yTm90QUZpbGU7CisgICAgfQorICAgIHJldHVybiBrU2JGaWxlSW52YWxpZDsKKyAgfQorCisgIEhBTkRMRSBmaWxlX2hhbmRsZSA9CisgICAgICBzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI6Ok9wZW5GaWxlT3JEaXJlY3RvcnkocGF0aCwgZmxhZ3MsIG91dF9jcmVhdGVkLCBvdXRfZXJyb3IpOworCisgIGlmICghc3RhcmJvYXJkOjpzaGFyZWQ6OndpbjMyOjpJc1ZhbGlkSGFuZGxlKGZpbGVfaGFuZGxlKSkgeworICAgIHJldHVybiBrU2JGaWxlSW52YWxpZDsKKyAgfQorCisgIHJldHVybiBuZXcgU2JGaWxlUHJpdmF0ZShmaWxlX2hhbmRsZSk7Cit9CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9maWxlX3JlYWQuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9maWxlX3JlYWQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJlNmRiOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2ZpbGVfcmVhZC5jYwpAQCAtMCwwICsxLDQ3IEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAic3RhcmJvYXJkL2ZpbGUuaCIKKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2ZpbGVfaW50ZXJuYWwuaCIKKworaW50IFNiRmlsZVJlYWQoU2JGaWxlIGZpbGUsIGNoYXIqIGRhdGEsIGludCBzaXplKSB7CisgIFNCX0RDSEVDSygoc2l6ZSA9PSAwKSB8fCAoZGF0YSAhPSBudWxscHRyKSk7CisKKyAgaWYgKCFzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI6Okhhc1ZhbGlkSGFuZGxlKGZpbGUpKSB7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgaWYgKHNpemUgPCAwKSB7CisgICAgU0JfTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiAtMTsKKyAgfSBlbHNlIGlmIChzaXplID09IDApIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIERXT1JEIG51bWJlcl9ieXRlc19yZWFkID0gMDsKKyAgQk9PTCBzdWNjZXNzID0KKyAgICAgIFJlYWRGaWxlKGZpbGUtPmZpbGVfaGFuZGxlLCBkYXRhLCBzaXplLCAmbnVtYmVyX2J5dGVzX3JlYWQsIG51bGxwdHIpOworCisgIC8vIFNpbmNlIHdlIGFyZSBvbmx5IGRvaW5nIHN5bmNob3Jub3VzIElPLCBzdWNjZXNzID09IEZBTFNFIGltcGxpZXMgdGhhdAorICAvLyBzb21ldGhpbmcgaXMgd3JvbmcuCisgIGlmICghc3VjY2VzcykgeworICAgIHJldHVybiAtMTsKKyAgfQorCisgIHJldHVybiBudW1iZXJfYnl0ZXNfcmVhZDsKK30KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2ZpbGVfc2Vlay5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2ZpbGVfc2Vlay5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGY1NmZhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZmlsZV9zZWVrLmNjCkBAIC0wLDAgKzEsMzggQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJzdGFyYm9hcmQvZmlsZS5oIgorCisjaW5jbHVkZSA8d2luZG93cy5oPgorCisjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi9maWxlX2ludGVybmFsLmgiCisKK2ludDY0X3QgU2JGaWxlU2VlayhTYkZpbGUgZmlsZSwgU2JGaWxlV2hlbmNlIHdoZW5jZSwgaW50NjRfdCBvZmZzZXQpIHsKKyAgaWYgKCFzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI6Okhhc1ZhbGlkSGFuZGxlKGZpbGUpKSB7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgTEFSR0VfSU5URUdFUiBuZXdfZmlsZV9wb2ludGVyID0gezB9OworICBMQVJHRV9JTlRFR0VSIG9mZnNldF9hcmd1bWVudCA9IHswfTsKKyAgb2Zmc2V0X2FyZ3VtZW50LlF1YWRQYXJ0ID0gb2Zmc2V0OworICBCT09MIHN1Y2Nlc3MgPQorICAgICAgU2V0RmlsZVBvaW50ZXJFeChmaWxlLT5maWxlX2hhbmRsZSwgb2Zmc2V0X2FyZ3VtZW50LCAmbmV3X2ZpbGVfcG9pbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RFdPUkQ+KHdoZW5jZSkpOworCisgIGlmICghc3VjY2VzcykgeworICAgIHJldHVybiAtMTsKKyAgfQorCisgIHJldHVybiBuZXdfZmlsZV9wb2ludGVyLlF1YWRQYXJ0OworfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZmlsZV90cnVuY2F0ZS5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2ZpbGVfdHJ1bmNhdGUuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQyNjI2YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2ZpbGVfdHJ1bmNhdGUuY2MKQEAgLTAsMCArMSwxMDIgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJzdGFyYm9hcmQvZmlsZS5oIgorCisjaW5jbHVkZSA8d2luZG93cy5oPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvZmlsZV9pbnRlcm5hbC5oIgorCituYW1lc3BhY2Ugeworc3RhdGljIGNvbnN0IGNoYXIgazRLWmVyb1BhZ2VbNCAqIDEwMjRdID0gezB9OworCitib29sIFdyaXRlWmVyb3NUb0ZpbGUoSEFORExFIGZpbGVfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgIExBUkdFX0lOVEVHRVIgYmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgTEFSR0VfSU5URUdFUiBlbmQpIHsKKyAgU0JfRENIRUNLKHN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjo6SXNWYWxpZEhhbmRsZShmaWxlX2hhbmRsZSkpOworICBpbnQ2NF90IGJ5dGVzX2xlZnRfdG9fd3JpdGUgPSBlbmQuUXVhZFBhcnQgLSBiZWdpbi5RdWFkUGFydDsKKyAgaWYgKGJ5dGVzX2xlZnRfdG9fd3JpdGUgPD0gMCkgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8gU2V0IHRoZSBmaWxlIHBvaW50ZXIgdG8gfGJlZ2lufC4KKyAgaWYgKCFTZXRGaWxlUG9pbnRlckV4KGZpbGVfaGFuZGxlLCBiZWdpbiwgTlVMTCwgRklMRV9CRUdJTikpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBXcml0ZSBmcm9tIHplcm9zIGZyb20gfGJlZ2lufCB0byB8ZW5kfC4KKyAgd2hpbGUgKGJ5dGVzX2xlZnRfdG9fd3JpdGUgPiAwKSB7CisgICAgaW50NjRfdCBieXRlc190b193cml0ZSA9CisgICAgICAgIHN0ZDo6bWluPGludDY0X3Q+KFNCX0FSUkFZX1NJWkUoazRLWmVyb1BhZ2UpLCBieXRlc19sZWZ0X3RvX3dyaXRlKTsKKyAgICBTQl9EQ0hFQ0soYnl0ZXNfdG9fd3JpdGUgPD0ga1NiSW50MzJNYXgpOworCisgICAgRFdPUkQgYnl0ZXNfd3JpdHRlbiA9IDA7CisgICAgaWYgKCFXcml0ZUZpbGUoZmlsZV9oYW5kbGUsIGs0S1plcm9QYWdlLCBzdGF0aWNfY2FzdDxpbnQ+KGJ5dGVzX3RvX3dyaXRlKSwKKyAgICAgICAgICAgICAgICAgICAmYnl0ZXNfd3JpdHRlbiwgTlVMTCkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBieXRlc19sZWZ0X3RvX3dyaXRlIC09IGJ5dGVzX3dyaXR0ZW47CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK2Jvb2wgU2JGaWxlVHJ1bmNhdGUoU2JGaWxlIGZpbGUsIGludDY0X3QgbGVuZ3RoKSB7CisgIGlmICghc3RhcmJvYXJkOjpzaGFyZWQ6OndpbjMyOjpIYXNWYWxpZEhhbmRsZShmaWxlKSB8fCBsZW5ndGggPCAwKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgSEFORExFIGZpbGVfaGFuZGxlID0gZmlsZS0+ZmlsZV9oYW5kbGU7CisKKyAgLy8gR2V0IGN1cnJlbnQgcG9zaXRpb24uCisgIExBUkdFX0lOVEVHRVIgY3VycmVudF9wb3NpdGlvbiA9IHswfTsKKyAgQk9PTCBzdWNjZXNzID0KKyAgICAgIFNldEZpbGVQb2ludGVyRXgoZmlsZV9oYW5kbGUsIHswfSwgJmN1cnJlbnRfcG9zaXRpb24sIEZJTEVfQ1VSUkVOVCk7CisKKyAgaWYgKCFzdWNjZXNzKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgYm9vbCByZXR1cm5fdmFsdWUgPSBmYWxzZTsKKyAgZG8geworICAgIExBUkdFX0lOVEVHRVIgb2xkX2VvZiA9IHswfTsKKyAgICBpZiAoIVNldEZpbGVQb2ludGVyRXgoZmlsZV9oYW5kbGUsIHswfSwgJm9sZF9lb2YsIEZJTEVfRU5EKSkgeworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgTEFSR0VfSU5URUdFUiBuZXdfZW9mID0gezB9OworICAgIG5ld19lb2YuUXVhZFBhcnQgPSBsZW5ndGg7CisgICAgaWYgKCFTZXRGaWxlUG9pbnRlckV4KGZpbGVfaGFuZGxlLCBuZXdfZW9mLCBOVUxMLCBGSUxFX0JFR0lOKSkgeworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFTZXRFbmRPZkZpbGUoZmlsZV9oYW5kbGUpKSB7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBXcml0ZVplcm9zVG9GaWxlKGZpbGVfaGFuZGxlLCBvbGRfZW9mLCBuZXdfZW9mKTsKKyAgICByZXR1cm5fdmFsdWUgPSB0cnVlOworICB9IHdoaWxlICgwKTsKKworICAvLyBTZXQgdGhlIGZpbGUgcG9pbnRlciBwb3NpdGlvbiBiYWNrIHdoZXJlIGl0IHdhcy4KKyAgU2V0RmlsZVBvaW50ZXJFeChmaWxlX2hhbmRsZSwgY3VycmVudF9wb3NpdGlvbiwgTlVMTCwgRklMRV9CRUdJTik7CisKKyAgcmV0dXJuIHJldHVybl92YWx1ZTsKK30KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2ZpbGVfd3JpdGUuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9maWxlX3dyaXRlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2M2JmNjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9maWxlX3dyaXRlLmNjCkBAIC0wLDAgKzEsNDIgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJzdGFyYm9hcmQvZmlsZS5oIgorCisjaW5jbHVkZSA8d2luZG93cy5oPgorCisjaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvZmlsZV9pbnRlcm5hbC5oIgorCitpbnQgU2JGaWxlV3JpdGUoU2JGaWxlIGZpbGUsIGNvbnN0IGNoYXIqIGRhdGEsIGludCBzaXplKSB7CisgIC8vIFRPRE86IFN1cHBvcnQgYXN5bmNocm9ub3VzIElPLCBpZiBuZWNlc3NhcnkuCisgIFNCX0RDSEVDSygoc2l6ZSA9PSAwKSB8fCAoZGF0YSAhPSBudWxscHRyKSk7CisgIGlmICghU2JGaWxlSXNWYWxpZChmaWxlKSkgeworICAgIHJldHVybiAtMTsKKyAgfQorICBpZiAoc2l6ZSA8IDApIHsKKyAgICBTQl9OT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIC0xOworICB9IGVsc2UgaWYgKHNpemUgPT0gMCkgeworICAgIHJldHVybiAwOworICB9CisKKyAgRFdPUkQgYnl0ZXNfd3JpdHRlbiA9IDA7CisgIGJvb2wgc3VjY2VzcyA9IFdyaXRlRmlsZShmaWxlLT5maWxlX2hhbmRsZSwgZGF0YSwgc2l6ZSwgJmJ5dGVzX3dyaXR0ZW4sIE5VTEwpOworICBpZiAoIXN1Y2Nlc3MpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICByZXR1cm4gYnl0ZXNfd3JpdHRlbjsKK30KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmFzZS9tYXRoLmggYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9sb2cuY2MKc2ltaWxhcml0eSBpbmRleCA3NiUKY29weSBmcm9tIHNyYy9jb2JhbHQvYmFzZS9tYXRoLmgKY29weSB0byBzcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9sb2cuY2MKaW5kZXggNDcyM2JmYi4uN2UxY2I4NSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iYXNlL21hdGguaAorKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9sb2cuY2MKQEAgLTEsNCArMSw0IEBACi0vLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIC8vCiAvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIC8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTEyLDkgKzEyLDggQEAKIC8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCi0jaWZuZGVmIENPQkFMVF9CQVNFX01BVEhfSF8KLSNkZWZpbmUgQ09CQUxUX0JBU0VfTUFUSF9IXworI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKIAotI2luY2x1ZGUgPGNtYXRoPgotCi0jZW5kaWYgIC8vIENPQkFMVF9CQVNFX01BVEhfSF8KK3ZvaWQgU2JMb2coU2JMb2dQcmlvcml0eSAvKnByaW9yaXR5Ki8sIGNvbnN0IGNoYXIqIG1lc3NhZ2UpIHsKKyAgU2JMb2dSYXcobWVzc2FnZSk7Cit9CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jhc2UvbWF0aC5oIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbG9nX2ZsdXNoLmNjCnNpbWlsYXJpdHkgaW5kZXggNzclCmNvcHkgZnJvbSBzcmMvY29iYWx0L2Jhc2UvbWF0aC5oCmNvcHkgdG8gc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbG9nX2ZsdXNoLmNjCmluZGV4IDQ3MjNiZmIuLmE3NWFmNDMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmFzZS9tYXRoLmgKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbG9nX2ZsdXNoLmNjCkBAIC0xLDQgKzEsNCBAQAotLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAvLwogLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xMiw5ICsxMiwxMCBAQAogLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKLSNpZm5kZWYgQ09CQUxUX0JBU0VfTUFUSF9IXwotI2RlZmluZSBDT0JBTFRfQkFTRV9NQVRIX0hfCisjaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgogCi0jaW5jbHVkZSA8Y21hdGg+CisjaW5jbHVkZSA8c3RkaW8uaD4KIAotI2VuZGlmICAvLyBDT0JBTFRfQkFTRV9NQVRIX0hfCit2b2lkIFNiTG9nRmx1c2goKSB7CisgIGZmbHVzaChzdGRlcnIpOworfQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iYXNlL21hdGguaCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2xvZ19mb3JtYXQuY2MKc2ltaWxhcml0eSBpbmRleCA3NSUKY29weSBmcm9tIHNyYy9jb2JhbHQvYmFzZS9tYXRoLmgKY29weSB0byBzcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9sb2dfZm9ybWF0LmNjCmluZGV4IDQ3MjNiZmIuLmVmNTQzMGIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmFzZS9tYXRoLmgKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbG9nX2Zvcm1hdC5jYwpAQCAtMSw0ICsxLDQgQEAKLS8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogLy8KIC8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTIsOSArMTIsOCBAQAogLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKLSNpZm5kZWYgQ09CQUxUX0JBU0VfTUFUSF9IXwotI2RlZmluZSBDT0JBTFRfQkFTRV9NQVRIX0hfCisjaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgogCi0jaW5jbHVkZSA8Y21hdGg+Ci0KLSNlbmRpZiAgLy8gQ09CQUxUX0JBU0VfTUFUSF9IXwordm9pZCBTYkxvZ0Zvcm1hdChjb25zdCBjaGFyKiBmb3JtYXQsIHZhX2xpc3QgYXJndW1lbnRzKSB7CisgIFNiTG9nUmF3Rm9ybWF0KGZvcm1hdCwgYXJndW1lbnRzKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmFzZS9tYXRoLmggYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9sb2dfaXNfdHR5LmNjCnNpbWlsYXJpdHkgaW5kZXggNzclCmNvcHkgZnJvbSBzcmMvY29iYWx0L2Jhc2UvbWF0aC5oCmNvcHkgdG8gc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbG9nX2lzX3R0eS5jYwppbmRleCA0NzIzYmZiLi40MGRiYzc3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jhc2UvbWF0aC5oCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2xvZ19pc190dHkuY2MKQEAgLTEsNCArMSw0IEBACi0vLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIC8vCiAvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIC8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTEyLDkgKzEyLDggQEAKIC8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCi0jaWZuZGVmIENPQkFMVF9CQVNFX01BVEhfSF8KLSNkZWZpbmUgQ09CQUxUX0JBU0VfTUFUSF9IXworI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKIAotI2luY2x1ZGUgPGNtYXRoPgotCi0jZW5kaWYgIC8vIENPQkFMVF9CQVNFX01BVEhfSF8KK2Jvb2wgU2JMb2dJc1R0eSgpIHsKKyAgcmV0dXJuIGZhbHNlOworfQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vbWVkaWFfa2V5X3N5c3RlbV9tZWRpYV9jYXBhYmlsaXR5LmlkbCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2xvZ19yYXcuY2MKc2ltaWxhcml0eSBpbmRleCA3NCUKY29weSBmcm9tIHNyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9zeXN0ZW1fbWVkaWFfY2FwYWJpbGl0eS5pZGwKY29weSB0byBzcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9sb2dfcmF3LmNjCmluZGV4IDUxZTFmMmUuLmQzM2YwODYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9zeXN0ZW1fbWVkaWFfY2FwYWJpbGl0eS5pZGwKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbG9nX3Jhdy5jYwpAQCAtMTIsOSArMTIsMTIgQEAKIC8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAxNi9DUi1lbmNyeXB0ZWQtbWVkaWEtMjAxNjA3MDUvI21lZGlha2V5c3lzdGVtbWVkaWFjYXBhYmlsaXR5LWRpY3Rpb25hcnkKKyNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCiAKLWRpY3Rpb25hcnkgTWVkaWFLZXlTeXN0ZW1NZWRpYUNhcGFiaWxpdHkgewotICBET01TdHJpbmcgY29udGVudFR5cGUgPSAiIjsKLSAgRE9NU3RyaW5nIHJvYnVzdG5lc3MgPSAiIjsKLX07CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKK3ZvaWQgU2JMb2dSYXcoY29uc3QgY2hhciogbWVzc2FnZSkgeworICBmcHJpbnRmKHN0ZGVyciwgIiVzIiwgbWVzc2FnZSk7CisgIE91dHB1dERlYnVnU3RyaW5nQShtZXNzYWdlKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmFzZS9tYXRoLmggYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9sb2dfcmF3X2R1bXBfc3RhY2suY2MKc2ltaWxhcml0eSBpbmRleCA3NSUKY29weSBmcm9tIHNyYy9jb2JhbHQvYmFzZS9tYXRoLmgKY29weSB0byBzcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9sb2dfcmF3X2R1bXBfc3RhY2suY2MKaW5kZXggNDcyM2JmYi4uMTQyYTA1NiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iYXNlL21hdGguaAorKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9sb2dfcmF3X2R1bXBfc3RhY2suY2MKQEAgLTEsNCArMSw0IEBACi0vLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIC8vCiAvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIC8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTEyLDkgKzEyLDggQEAKIC8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCi0jaWZuZGVmIENPQkFMVF9CQVNFX01BVEhfSF8KLSNkZWZpbmUgQ09CQUxUX0JBU0VfTUFUSF9IXworI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKIAotI2luY2x1ZGUgPGNtYXRoPgotCi0jZW5kaWYgIC8vIENPQkFMVF9CQVNFX01BVEhfSF8KK3ZvaWQgU2JMb2dSYXdEdW1wU3RhY2soaW50IC8qZnJhbWVzX3RvX3NraXAqLykgeworICBTYkxvZ1JhdygiVE9ETyBzdGFjayBkdW1wIG5vdCBpbXBsZW1lbnRlZFxuIik7Cit9CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9sb2dfcmF3X2Zvcm1hdC5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2xvZ19yYXdfZm9ybWF0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNmM1OWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9sb2dfcmF3X2Zvcm1hdC5jYwpAQCAtMCwwICsxLDMxIEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKK3N0YXRpYyBjb25zdCBpbnQga01heExvZ0xpbmVDaGFycyA9IDE2ICogMTAyNDsKKwordm9pZCBTYkxvZ1Jhd0Zvcm1hdChjb25zdCBjaGFyKiBmb3JtYXQsIHZhX2xpc3QgYXJndW1lbnRzKSB7CisgIHZmcHJpbnRmKHN0ZGVyciwgZm9ybWF0LCBhcmd1bWVudHMpOworICBjaGFyIGxvZ19idWZmZXJba01heExvZ0xpbmVDaGFyc107CisgIGludCByZXN1bHQgPSB2c3ByaW50Zl9zKGxvZ19idWZmZXIsIGtNYXhMb2dMaW5lQ2hhcnMsIGZvcm1hdCwgYXJndW1lbnRzKTsKKyAgaWYgKHJlc3VsdCA+PSAwKSB7CisgICAgT3V0cHV0RGVidWdTdHJpbmdBKGxvZ19idWZmZXIpOworICB9IGVsc2UgeworICAgIE91dHB1dERlYnVnU3RyaW5nQSgiW2xvZyBsaW5lIHRvbyBsb25nXSIpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfc3lzdGVtX21lZGlhX2NhcGFiaWxpdHkuaWRsIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbWVtb3J5X2FsbG9jYXRlX2FsaWduZWRfdW5jaGVja2VkLmNjCnNpbWlsYXJpdHkgaW5kZXggNzQlCmNvcHkgZnJvbSBzcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfc3lzdGVtX21lZGlhX2NhcGFiaWxpdHkuaWRsCmNvcHkgdG8gc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbWVtb3J5X2FsbG9jYXRlX2FsaWduZWRfdW5jaGVja2VkLmNjCmluZGV4IDUxZTFmMmUuLjBiMTYxZmIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9zeXN0ZW1fbWVkaWFfY2FwYWJpbGl0eS5pZGwKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbWVtb3J5X2FsbG9jYXRlX2FsaWduZWRfdW5jaGVja2VkLmNjCkBAIC0xMiw5ICsxMiwxMCBAQAogLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKLS8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDE2L0NSLWVuY3J5cHRlZC1tZWRpYS0yMDE2MDcwNS8jbWVkaWFrZXlzeXN0ZW1tZWRpYWNhcGFiaWxpdHktZGljdGlvbmFyeQorI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKIAotZGljdGlvbmFyeSBNZWRpYUtleVN5c3RlbU1lZGlhQ2FwYWJpbGl0eSB7Ci0gIERPTVN0cmluZyBjb250ZW50VHlwZSA9ICIiOwotICBET01TdHJpbmcgcm9idXN0bmVzcyA9ICIiOwotfTsKKyNpbmNsdWRlIDxtYWxsb2MuaD4KKwordm9pZCogU2JNZW1vcnlBbGxvY2F0ZUFsaWduZWRVbmNoZWNrZWQoc2l6ZV90IGFsaWdubWVudCwgc2l6ZV90IHNpemUpIHsKKyAgcmV0dXJuIF9hbGlnbmVkX21hbGxvYyhzaXplLCBhbGlnbm1lbnQpOworfQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vbWVkaWFfa2V5X3N5c3RlbV9tZWRpYV9jYXBhYmlsaXR5LmlkbCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL21lbW9yeV9hbGxvY2F0ZV91bmNoZWNrZWQuY2MKc2ltaWxhcml0eSBpbmRleCA3NCUKY29weSBmcm9tIHNyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9zeXN0ZW1fbWVkaWFfY2FwYWJpbGl0eS5pZGwKY29weSB0byBzcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9tZW1vcnlfYWxsb2NhdGVfdW5jaGVja2VkLmNjCmluZGV4IDUxZTFmMmUuLmMxODVmOTEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9zeXN0ZW1fbWVkaWFfY2FwYWJpbGl0eS5pZGwKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbWVtb3J5X2FsbG9jYXRlX3VuY2hlY2tlZC5jYwpAQCAtMTIsOSArMTIsMTAgQEAKIC8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAxNi9DUi1lbmNyeXB0ZWQtbWVkaWEtMjAxNjA3MDUvI21lZGlha2V5c3lzdGVtbWVkaWFjYXBhYmlsaXR5LWRpY3Rpb25hcnkKKyNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCiAKLWRpY3Rpb25hcnkgTWVkaWFLZXlTeXN0ZW1NZWRpYUNhcGFiaWxpdHkgewotICBET01TdHJpbmcgY29udGVudFR5cGUgPSAiIjsKLSAgRE9NU3RyaW5nIHJvYnVzdG5lc3MgPSAiIjsKLX07CisjaW5jbHVkZSA8d2luZG93cy5oPgorCit2b2lkKiBTYk1lbW9yeUFsbG9jYXRlVW5jaGVja2VkKHNpemVfdCBzaXplKSB7CisgIHJldHVybiBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc2l6ZSk7Cit9CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jhc2UvbWF0aC5oIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbWVtb3J5X2ZyZWUuY2MKc2ltaWxhcml0eSBpbmRleCA3NSUKY29weSBmcm9tIHNyYy9jb2JhbHQvYmFzZS9tYXRoLmgKY29weSB0byBzcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9tZW1vcnlfZnJlZS5jYwppbmRleCA0NzIzYmZiLi40MmI4M2ZjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jhc2UvbWF0aC5oCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL21lbW9yeV9mcmVlLmNjCkBAIC0xLDQgKzEsNCBAQAotLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAvLwogLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xMiw5ICsxMiwxMCBAQAogLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKLSNpZm5kZWYgQ09CQUxUX0JBU0VfTUFUSF9IXwotI2RlZmluZSBDT0JBTFRfQkFTRV9NQVRIX0hfCisjaW5jbHVkZSAic3RhcmJvYXJkL21lbW9yeS5oIgogCi0jaW5jbHVkZSA8Y21hdGg+CisjaW5jbHVkZSA8d2luZG93cy5oPgogCi0jZW5kaWYgIC8vIENPQkFMVF9CQVNFX01BVEhfSF8KK3ZvaWQgU2JNZW1vcnlGcmVlKHZvaWQqIG1lbW9yeSkgeworICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBtZW1vcnkpOworfQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iYXNlL21hdGguaCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL21lbW9yeV9mcmVlX2FsaWduZWQuY2MKc2ltaWxhcml0eSBpbmRleCA3NiUKY29weSBmcm9tIHNyYy9jb2JhbHQvYmFzZS9tYXRoLmgKY29weSB0byBzcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9tZW1vcnlfZnJlZV9hbGlnbmVkLmNjCmluZGV4IDQ3MjNiZmIuLmY0MGQwYzYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmFzZS9tYXRoLmgKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbWVtb3J5X2ZyZWVfYWxpZ25lZC5jYwpAQCAtMSw0ICsxLDQgQEAKLS8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogLy8KIC8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTIsOSArMTIsMTAgQEAKIC8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCi0jaWZuZGVmIENPQkFMVF9CQVNFX01BVEhfSF8KLSNkZWZpbmUgQ09CQUxUX0JBU0VfTUFUSF9IXworI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKIAotI2luY2x1ZGUgPGNtYXRoPgorI2luY2x1ZGUgPG1hbGxvYy5oPgogCi0jZW5kaWYgIC8vIENPQkFMVF9CQVNFX01BVEhfSF8KK3ZvaWQgU2JNZW1vcnlGcmVlQWxpZ25lZCh2b2lkKiBtZW1vcnkpIHsKKyAgX2FsaWduZWRfZnJlZShtZW1vcnkpOworfQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vbWVkaWFfa2V5X3N5c3RlbV9tZWRpYV9jYXBhYmlsaXR5LmlkbCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL21lbW9yeV9nZXRfc3RhY2tfYm91bmRzLmNjCnNpbWlsYXJpdHkgaW5kZXggNjYlCmNvcHkgZnJvbSBzcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfc3lzdGVtX21lZGlhX2NhcGFiaWxpdHkuaWRsCmNvcHkgdG8gc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbWVtb3J5X2dldF9zdGFja19ib3VuZHMuY2MKaW5kZXggNTFlMWYyZS4uNWE5MmI2MSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vbWVkaWFfa2V5X3N5c3RlbV9tZWRpYV9jYXBhYmlsaXR5LmlkbAorKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9tZW1vcnlfZ2V0X3N0YWNrX2JvdW5kcy5jYwpAQCAtMTIsOSArMTIsMTIgQEAKIC8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAxNi9DUi1lbmNyeXB0ZWQtbWVkaWEtMjAxNjA3MDUvI21lZGlha2V5c3lzdGVtbWVkaWFjYXBhYmlsaXR5LWRpY3Rpb25hcnkKKyNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCiAKLWRpY3Rpb25hcnkgTWVkaWFLZXlTeXN0ZW1NZWRpYUNhcGFiaWxpdHkgewotICBET01TdHJpbmcgY29udGVudFR5cGUgPSAiIjsKLSAgRE9NU3RyaW5nIHJvYnVzdG5lc3MgPSAiIjsKLX07CisjaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgorCit2b2lkIFNiTWVtb3J5R2V0U3RhY2tCb3VuZHModm9pZCoqIC8qb3V0X2hpZ2gqLywgdm9pZCoqIC8qb3V0X2xvdyovKSB7CisgIC8vIFRPRE8gdGhlIGNvbW1vbiB3YXkgdG8gZG8gdGhpcyBpcyB3aXRoIE50UXVlcnlJbmZvcm1hdGlvblRocmVhZAorICAvLyBmb3IgVGhyZWFkQmFzaWNJbmZvcm1hdGlvbiBidXQgdGhhdCBtYXkgbm90IGJlIGF2YWlsYWJsZSBvbiBVV1AuCisgIFNCX05PVElNUExFTUVOVEVEKCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9tZW1vcnlfbWFwLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbWVtb3J5X21hcC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWMxOWY1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbWVtb3J5X21hcC5jYwpAQCAtMCwwICsxLDM4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAic3RhcmJvYXJkL21lbW9yeS5oIgorCisjaW5jbHVkZSA8d2luZG93cy5oPgorCisjaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgorCit2b2lkKiBTYk1lbW9yeU1hcChpbnQ2NF90IHNpemVfYnl0ZXMsIGludCBmbGFncywgY29uc3QgY2hhciogbmFtZSkgeworICBpZiAoc2l6ZV9ieXRlcyA9PSAwKSB7CisgICAgcmV0dXJuIFNCX01FTU9SWV9NQVBfRkFJTEVEOworICB9CisgIFVMT05HIHByb3RlY3Q7CisgIC8vIHxmbGFnc3wgaXMgYSBiaXRtYXNrIG9mIFNiTWVtb3J5TWFwRmxhZ3MsIGJ1dCB8cHJvdGVjdHwgaXMgbm90IGEgYml0bWFzay4KKyAgc3dpdGNoIChmbGFncykgeworICAgIGNhc2Uga1NiTWVtb3J5TWFwUHJvdGVjdFJlYWQ6CisgICAgICBwcm90ZWN0ID0gUEFHRV9SRUFET05MWTsKKyAgICAgIGJyZWFrOworICAgIGNhc2Uga1NiTWVtb3J5TWFwUHJvdGVjdFJlYWRXcml0ZToKKyAgICAgIHByb3RlY3QgPSBQQUdFX1JFQURXUklURTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBTQl9OT1RSRUFDSEVEKCk7CisgIH0KKyAgcmV0dXJuIFZpcnR1YWxBbGxvY0Zyb21BcHAoTlVMTCwgc2l6ZV9ieXRlcywgTUVNX0NPTU1JVCwgcHJvdGVjdCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfc3lzdGVtX21lZGlhX2NhcGFiaWxpdHkuaWRsIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbWVtb3J5X3JlYWxsb2NhdGVfdW5jaGVja2VkLmNjCnNpbWlsYXJpdHkgaW5kZXggNzAlCmNvcHkgZnJvbSBzcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfc3lzdGVtX21lZGlhX2NhcGFiaWxpdHkuaWRsCmNvcHkgdG8gc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbWVtb3J5X3JlYWxsb2NhdGVfdW5jaGVja2VkLmNjCmluZGV4IDUxZTFmMmUuLjY4ZWU2ODkgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9zeXN0ZW1fbWVkaWFfY2FwYWJpbGl0eS5pZGwKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbWVtb3J5X3JlYWxsb2NhdGVfdW5jaGVja2VkLmNjCkBAIC0xMiw5ICsxMiwxMyBAQAogLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKLS8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDE2L0NSLWVuY3J5cHRlZC1tZWRpYS0yMDE2MDcwNS8jbWVkaWFrZXlzeXN0ZW1tZWRpYWNhcGFiaWxpdHktZGljdGlvbmFyeQorI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKIAotZGljdGlvbmFyeSBNZWRpYUtleVN5c3RlbU1lZGlhQ2FwYWJpbGl0eSB7Ci0gIERPTVN0cmluZyBjb250ZW50VHlwZSA9ICIiOwotICBET01TdHJpbmcgcm9idXN0bmVzcyA9ICIiOwotfTsKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKK3ZvaWQqIFNiTWVtb3J5UmVhbGxvY2F0ZVVuY2hlY2tlZCh2b2lkKiBtZW1vcnksIHNpemVfdCBzaXplKSB7CisgIGlmIChtZW1vcnkgPT0gTlVMTCkgeworICAgIHJldHVybiBTYk1lbW9yeUFsbG9jYXRlVW5jaGVja2VkKHNpemUpOworICB9CisgIHJldHVybiBIZWFwUmVBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBtZW1vcnksIHNpemUpOworfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbWVtb3J5X3VubWFwLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbWVtb3J5X3VubWFwLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3MGZjOWYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9tZW1vcnlfdW5tYXAuY2MKQEAgLTAsMCArMSwyNCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworYm9vbCBTYk1lbW9yeVVubWFwKHZvaWQqIHZpcnR1YWxfYWRkcmVzcywgaW50NjRfdCBzaXplX2J5dGVzKSB7CisgIC8vIE5vdGUgdGhhdCBTYk1lbW9yeVVubWFwIGRvY3VtZW50YXRpb24gc2F5cyB0aGF0ICJUaGlzIGZ1bmN0aW9uIGNhbgorICAvLyB1bm1hcCBtdWx0aXBsZSBjb250aWd1b3VzIHJlZ2lvbnMgdGhhdCB3ZXJlIG1hcHBlZCB3aXRoIHNlcGFyYXRlIGNhbGxzCisgIC8vIHRvIFNiTWVtb3J5TWFwKCkiLiBCZWNhdXNlIG9mIHRoYXQsIHdlIGNhbm5vdCB1c2UgTUVNX0ZSRUUgaGVyZS4KKyAgcmV0dXJuIFZpcnR1YWxGcmVlKHZpcnR1YWxfYWRkcmVzcywgc2l6ZV9ieXRlcywgTUVNX0RFQ09NTUlUKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9zeXN0ZW1fbWVkaWFfY2FwYWJpbGl0eS5pZGwgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9tdXRleF9hY3F1aXJlLmNjCnNpbWlsYXJpdHkgaW5kZXggNzQlCnJlbmFtZSBmcm9tIHNyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9zeXN0ZW1fbWVkaWFfY2FwYWJpbGl0eS5pZGwKcmVuYW1lIHRvIHNyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL211dGV4X2FjcXVpcmUuY2MKaW5kZXggNTFlMWYyZS4uZGFjYTA1ZCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vbWVkaWFfa2V5X3N5c3RlbV9tZWRpYV9jYXBhYmlsaXR5LmlkbAorKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9tdXRleF9hY3F1aXJlLmNjCkBAIC0xMiw5ICsxMiwxMSBAQAogLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKLS8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDE2L0NSLWVuY3J5cHRlZC1tZWRpYS0yMDE2MDcwNS8jbWVkaWFrZXlzeXN0ZW1tZWRpYWNhcGFiaWxpdHktZGljdGlvbmFyeQorI2luY2x1ZGUgInN0YXJib2FyZC9tdXRleC5oIgogCi1kaWN0aW9uYXJ5IE1lZGlhS2V5U3lzdGVtTWVkaWFDYXBhYmlsaXR5IHsKLSAgRE9NU3RyaW5nIGNvbnRlbnRUeXBlID0gIiI7Ci0gIERPTVN0cmluZyByb2J1c3RuZXNzID0gIiI7Ci19OworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworU2JNdXRleFJlc3VsdCBTYk11dGV4QWNxdWlyZShTYk11dGV4KiBtdXRleCkgeworICBBY3F1aXJlU1JXTG9ja0V4Y2x1c2l2ZShyZWludGVycHJldF9jYXN0PFBTUldMT0NLPihtdXRleCkpOworICByZXR1cm4ga1NiTXV0ZXhBY3F1aXJlZDsKK30KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9zeXN0ZW1fbWVkaWFfY2FwYWJpbGl0eS5pZGwgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9tdXRleF9hY3F1aXJlX3RyeS5jYwpzaW1pbGFyaXR5IGluZGV4IDcxJQpjb3B5IGZyb20gc3JjL2NvYmFsdC9kb20vbWVkaWFfa2V5X3N5c3RlbV9tZWRpYV9jYXBhYmlsaXR5LmlkbApjb3B5IHRvIHNyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL211dGV4X2FjcXVpcmVfdHJ5LmNjCmluZGV4IDUxZTFmMmUuLjBjNGNlZTIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9zeXN0ZW1fbWVkaWFfY2FwYWJpbGl0eS5pZGwKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbXV0ZXhfYWNxdWlyZV90cnkuY2MKQEAgLTEyLDkgKzEyLDExIEBACiAvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTYvQ1ItZW5jcnlwdGVkLW1lZGlhLTIwMTYwNzA1LyNtZWRpYWtleXN5c3RlbW1lZGlhY2FwYWJpbGl0eS1kaWN0aW9uYXJ5CisjaW5jbHVkZSAic3RhcmJvYXJkL211dGV4LmgiCiAKLWRpY3Rpb25hcnkgTWVkaWFLZXlTeXN0ZW1NZWRpYUNhcGFiaWxpdHkgewotICBET01TdHJpbmcgY29udGVudFR5cGUgPSAiIjsKLSAgRE9NU3RyaW5nIHJvYnVzdG5lc3MgPSAiIjsKLX07CisjaW5jbHVkZSA8d2luZG93cy5oPgorCitTYk11dGV4UmVzdWx0IFNiTXV0ZXhBY3F1aXJlVHJ5KFNiTXV0ZXgqIG11dGV4KSB7CisgIGJvb2wgcmVzdWx0ID0gVHJ5QWNxdWlyZVNSV0xvY2tFeGNsdXNpdmUocmVpbnRlcnByZXRfY2FzdDxQU1JXTE9DSz4obXV0ZXgpKTsKKyAgcmV0dXJuIHJlc3VsdCA/IGtTYk11dGV4QWNxdWlyZWQgOiBrU2JNdXRleEJ1c3k7Cit9CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfc3lzdGVtX21lZGlhX2NhcGFiaWxpdHkuaWRsIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbXV0ZXhfY3JlYXRlLmNjCnNpbWlsYXJpdHkgaW5kZXggNzQlCmNvcHkgZnJvbSBzcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfc3lzdGVtX21lZGlhX2NhcGFiaWxpdHkuaWRsCmNvcHkgdG8gc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbXV0ZXhfY3JlYXRlLmNjCmluZGV4IDUxZTFmMmUuLjVlNGMxY2UgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9zeXN0ZW1fbWVkaWFfY2FwYWJpbGl0eS5pZGwKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbXV0ZXhfY3JlYXRlLmNjCkBAIC0xMiw5ICsxMiwxNCBAQAogLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKLS8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDE2L0NSLWVuY3J5cHRlZC1tZWRpYS0yMDE2MDcwNS8jbWVkaWFrZXlzeXN0ZW1tZWRpYWNhcGFiaWxpdHktZGljdGlvbmFyeQorI2luY2x1ZGUgInN0YXJib2FyZC9tdXRleC5oIgogCi1kaWN0aW9uYXJ5IE1lZGlhS2V5U3lzdGVtTWVkaWFDYXBhYmlsaXR5IHsKLSAgRE9NU3RyaW5nIGNvbnRlbnRUeXBlID0gIiI7Ci0gIERPTVN0cmluZyByb2J1c3RuZXNzID0gIiI7Ci19OworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworYm9vbCBTYk11dGV4Q3JlYXRlKFNiTXV0ZXgqIG11dGV4KSB7CisgIGlmICghbXV0ZXgpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgSW5pdGlhbGl6ZVNSV0xvY2socmVpbnRlcnByZXRfY2FzdDxQU1JXTE9DSz4obXV0ZXgpKTsKKyAgcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfc3lzdGVtX21lZGlhX2NhcGFiaWxpdHkuaWRsIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbXV0ZXhfZGVzdHJveS5jYwpzaW1pbGFyaXR5IGluZGV4IDczJQpjb3B5IGZyb20gc3JjL2NvYmFsdC9kb20vbWVkaWFfa2V5X3N5c3RlbV9tZWRpYV9jYXBhYmlsaXR5LmlkbApjb3B5IHRvIHNyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL211dGV4X2Rlc3Ryb3kuY2MKaW5kZXggNTFlMWYyZS4uMTAyODY4NyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vbWVkaWFfa2V5X3N5c3RlbV9tZWRpYV9jYXBhYmlsaXR5LmlkbAorKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9tdXRleF9kZXN0cm95LmNjCkBAIC0xMiw5ICsxMiwxNiBAQAogLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKLS8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDE2L0NSLWVuY3J5cHRlZC1tZWRpYS0yMDE2MDcwNS8jbWVkaWFrZXlzeXN0ZW1tZWRpYWNhcGFiaWxpdHktZGljdGlvbmFyeQorI2luY2x1ZGUgInN0YXJib2FyZC9tdXRleC5oIgogCi1kaWN0aW9uYXJ5IE1lZGlhS2V5U3lzdGVtTWVkaWFDYXBhYmlsaXR5IHsKLSAgRE9NU3RyaW5nIGNvbnRlbnRUeXBlID0gIiI7Ci0gIERPTVN0cmluZyByb2J1c3RuZXNzID0gIiI7Ci19OworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworYm9vbCBTYk11dGV4RGVzdHJveShTYk11dGV4KiBtdXRleCkgeworICBpZiAoIW11dGV4KSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmIChTYk11dGV4QWNxdWlyZVRyeShtdXRleCkgPT0ga1NiTXV0ZXhCdXN5KSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vbWVkaWFfa2V5X3N5c3RlbV9tZWRpYV9jYXBhYmlsaXR5LmlkbCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL211dGV4X3JlbGVhc2UuY2MKc2ltaWxhcml0eSBpbmRleCA3NCUKY29weSBmcm9tIHNyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9zeXN0ZW1fbWVkaWFfY2FwYWJpbGl0eS5pZGwKY29weSB0byBzcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9tdXRleF9yZWxlYXNlLmNjCmluZGV4IDUxZTFmMmUuLmFjNTAwOTAgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9zeXN0ZW1fbWVkaWFfY2FwYWJpbGl0eS5pZGwKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbXV0ZXhfcmVsZWFzZS5jYwpAQCAtMTIsOSArMTIsMTEgQEAKIC8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAxNi9DUi1lbmNyeXB0ZWQtbWVkaWEtMjAxNjA3MDUvI21lZGlha2V5c3lzdGVtbWVkaWFjYXBhYmlsaXR5LWRpY3Rpb25hcnkKKyNpbmNsdWRlICJzdGFyYm9hcmQvbXV0ZXguaCIKIAotZGljdGlvbmFyeSBNZWRpYUtleVN5c3RlbU1lZGlhQ2FwYWJpbGl0eSB7Ci0gIERPTVN0cmluZyBjb250ZW50VHlwZSA9ICIiOwotICBET01TdHJpbmcgcm9idXN0bmVzcyA9ICIiOwotfTsKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKK2Jvb2wgU2JNdXRleFJlbGVhc2UoU2JNdXRleCogbXV0ZXgpIHsKKyAgUmVsZWFzZVNSV0xvY2tFeGNsdXNpdmUocmVpbnRlcnByZXRfY2FzdDxQU1JXTE9DSz4obXV0ZXgpKTsKKyAgcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9vbmNlLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvb25jZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTMxZDNhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvb25jZS5jYwpAQCAtMCwwICsxLDM1IEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAic3RhcmJvYXJkL29uY2UuaCIKKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworbmFtZXNwYWNlIHsKK0JPT0wgQ0FMTEJBQ0sgT25jZVRyYW1wb2xpbmUoUElOSVRfT05DRSBvbmNlX2NvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtZXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCoqIGNvbnRleHQpIHsKKyAgc3RhdGljX2Nhc3Q8U2JPbmNlSW5pdFJvdXRpbmU+KHBhcmFtZXRlcikoKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitib29sIFNiT25jZShTYk9uY2VDb250cm9sKiBvbmNlX2NvbnRyb2wsIFNiT25jZUluaXRSb3V0aW5lIGluaXRfcm91dGluZSkgeworICBpZiAoIW9uY2VfY29udHJvbCB8fCAhaW5pdF9yb3V0aW5lKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiBJbml0T25jZUV4ZWN1dGVPbmNlKHJlaW50ZXJwcmV0X2Nhc3Q8UElOSVRfT05DRT4ob25jZV9jb250cm9sKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT25jZVRyYW1wb2xpbmUsIGluaXRfcm91dGluZSwgTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfc3lzdGVtX21lZGlhX2NhcGFiaWxpdHkuaWRsIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc3RyaW5nX2NvbXBhcmVfbm9fY2FzZS5jYwpzaW1pbGFyaXR5IGluZGV4IDc0JQpjb3B5IGZyb20gc3JjL2NvYmFsdC9kb20vbWVkaWFfa2V5X3N5c3RlbV9tZWRpYV9jYXBhYmlsaXR5LmlkbApjb3B5IHRvIHNyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3N0cmluZ19jb21wYXJlX25vX2Nhc2UuY2MKaW5kZXggNTFlMWYyZS4uMzlhOWYyYiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vbWVkaWFfa2V5X3N5c3RlbV9tZWRpYV9jYXBhYmlsaXR5LmlkbAorKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zdHJpbmdfY29tcGFyZV9ub19jYXNlLmNjCkBAIC0xMiw5ICsxMiwxMSBAQAogLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKLS8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDE2L0NSLWVuY3J5cHRlZC1tZWRpYS0yMDE2MDcwNS8jbWVkaWFrZXlzeXN0ZW1tZWRpYWNhcGFiaWxpdHktZGljdGlvbmFyeQorI2luY2x1ZGUgInN0YXJib2FyZC9zdHJpbmcuaCIKIAotZGljdGlvbmFyeSBNZWRpYUtleVN5c3RlbU1lZGlhQ2FwYWJpbGl0eSB7Ci0gIERPTVN0cmluZyBjb250ZW50VHlwZSA9ICIiOwotICBET01TdHJpbmcgcm9idXN0bmVzcyA9ICIiOwotfTsKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworaW50IFNiU3RyaW5nQ29tcGFyZU5vQ2FzZShjb25zdCBjaGFyKiBzdHJpbmcxLCBjb25zdCBjaGFyKiBzdHJpbmcyKSB7CisgIHJldHVybiBfc3RyaWNtcChzdHJpbmcxLCBzdHJpbmcyKTsKK30KKwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vbWVkaWFfa2V5X3N5c3RlbV9tZWRpYV9jYXBhYmlsaXR5LmlkbCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3N0cmluZ19jb21wYXJlX25vX2Nhc2Vfbi5jYwpzaW1pbGFyaXR5IGluZGV4IDc0JQpjb3B5IGZyb20gc3JjL2NvYmFsdC9kb20vbWVkaWFfa2V5X3N5c3RlbV9tZWRpYV9jYXBhYmlsaXR5LmlkbApjb3B5IHRvIHNyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3N0cmluZ19jb21wYXJlX25vX2Nhc2Vfbi5jYwppbmRleCA1MWUxZjJlLi5jY2E3YjlkIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfc3lzdGVtX21lZGlhX2NhcGFiaWxpdHkuaWRsCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3N0cmluZ19jb21wYXJlX25vX2Nhc2Vfbi5jYwpAQCAtMTIsOSArMTIsMTIgQEAKIC8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAxNi9DUi1lbmNyeXB0ZWQtbWVkaWEtMjAxNjA3MDUvI21lZGlha2V5c3lzdGVtbWVkaWFjYXBhYmlsaXR5LWRpY3Rpb25hcnkKKyNpbmNsdWRlICJzdGFyYm9hcmQvc3RyaW5nLmgiCiAKLWRpY3Rpb25hcnkgTWVkaWFLZXlTeXN0ZW1NZWRpYUNhcGFiaWxpdHkgewotICBET01TdHJpbmcgY29udGVudFR5cGUgPSAiIjsKLSAgRE9NU3RyaW5nIHJvYnVzdG5lc3MgPSAiIjsKLX07CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK2ludCBTYlN0cmluZ0NvbXBhcmVOb0Nhc2VOKGNvbnN0IGNoYXIqIHN0cmluZzEsCisgIGNvbnN0IGNoYXIqIHN0cmluZzIsIHNpemVfdCBjb3VudCkgeworICByZXR1cm4gX3N0cm5pY21wKHN0cmluZzEsIHN0cmluZzIsIGNvdW50KTsKK30KKwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vbWVkaWFfa2V5X3N5c3RlbV9tZWRpYV9jYXBhYmlsaXR5LmlkbCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3N0cmluZ19jb21wYXJlX3dpZGUuY2MKc2ltaWxhcml0eSBpbmRleCA3MyUKY29weSBmcm9tIHNyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9zeXN0ZW1fbWVkaWFfY2FwYWJpbGl0eS5pZGwKY29weSB0byBzcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zdHJpbmdfY29tcGFyZV93aWRlLmNjCmluZGV4IDUxZTFmMmUuLjg3NmQ1YjcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9zeXN0ZW1fbWVkaWFfY2FwYWJpbGl0eS5pZGwKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc3RyaW5nX2NvbXBhcmVfd2lkZS5jYwpAQCAtMTIsOSArMTIsMTIgQEAKIC8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAxNi9DUi1lbmNyeXB0ZWQtbWVkaWEtMjAxNjA3MDUvI21lZGlha2V5c3lzdGVtbWVkaWFjYXBhYmlsaXR5LWRpY3Rpb25hcnkKKyNpbmNsdWRlICJzdGFyYm9hcmQvc3RyaW5nLmgiCiAKLWRpY3Rpb25hcnkgTWVkaWFLZXlTeXN0ZW1NZWRpYUNhcGFiaWxpdHkgewotICBET01TdHJpbmcgY29udGVudFR5cGUgPSAiIjsKLSAgRE9NU3RyaW5nIHJvYnVzdG5lc3MgPSAiIjsKLX07CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK2ludCBTYlN0cmluZ0NvbXBhcmVXaWRlKGNvbnN0IHdjaGFyX3QqIHN0cmluZzEsIGNvbnN0IHdjaGFyX3QqIHN0cmluZzIsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgY291bnQpIHsKKyAgcmV0dXJuIHdjc25jbXAoc3RyaW5nMSwgc3RyaW5nMiwgY291bnQpOworfQorCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfc3lzdGVtX21lZGlhX2NhcGFiaWxpdHkuaWRsIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc3RyaW5nX2Zvcm1hdC5jYwpzaW1pbGFyaXR5IGluZGV4IDY4JQpjb3B5IGZyb20gc3JjL2NvYmFsdC9kb20vbWVkaWFfa2V5X3N5c3RlbV9tZWRpYV9jYXBhYmlsaXR5LmlkbApjb3B5IHRvIHNyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3N0cmluZ19mb3JtYXQuY2MKaW5kZXggNTFlMWYyZS4uMTIzOTcxOCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vbWVkaWFfa2V5X3N5c3RlbV9tZWRpYV9jYXBhYmlsaXR5LmlkbAorKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zdHJpbmdfZm9ybWF0LmNjCkBAIC0xMiw5ICsxMiwxMyBAQAogLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKLS8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDE2L0NSLWVuY3J5cHRlZC1tZWRpYS0yMDE2MDcwNS8jbWVkaWFrZXlzeXN0ZW1tZWRpYWNhcGFiaWxpdHktZGljdGlvbmFyeQorI2luY2x1ZGUgInN0YXJib2FyZC9zdHJpbmcuaCIKIAotZGljdGlvbmFyeSBNZWRpYUtleVN5c3RlbU1lZGlhQ2FwYWJpbGl0eSB7Ci0gIERPTVN0cmluZyBjb250ZW50VHlwZSA9ICIiOwotICBET01TdHJpbmcgcm9idXN0bmVzcyA9ICIiOwotfTsKKyNpbmNsdWRlIDxzdGRpby5oPgorCitpbnQgU2JTdHJpbmdGb3JtYXQoY2hhciogb3V0X2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZm9ybWF0LAorICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgYXJndW1lbnRzKSB7CisgIHJldHVybiB2c25wcmludGYob3V0X2J1ZmZlciwgYnVmZmVyX3NpemUsIGZvcm1hdCwgYXJndW1lbnRzKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9zeXN0ZW1fbWVkaWFfY2FwYWJpbGl0eS5pZGwgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zdHJpbmdfZm9ybWF0X3dpZGUuY2MKc2ltaWxhcml0eSBpbmRleCA2NiUKY29weSBmcm9tIHNyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9zeXN0ZW1fbWVkaWFfY2FwYWJpbGl0eS5pZGwKY29weSB0byBzcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zdHJpbmdfZm9ybWF0X3dpZGUuY2MKaW5kZXggNTFlMWYyZS4uMjkyNThkYyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vbWVkaWFfa2V5X3N5c3RlbV9tZWRpYV9jYXBhYmlsaXR5LmlkbAorKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zdHJpbmdfZm9ybWF0X3dpZGUuY2MKQEAgLTEyLDkgKzEyLDEzIEBACiAvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTYvQ1ItZW5jcnlwdGVkLW1lZGlhLTIwMTYwNzA1LyNtZWRpYWtleXN5c3RlbW1lZGlhY2FwYWJpbGl0eS1kaWN0aW9uYXJ5CisjaW5jbHVkZSAic3RhcmJvYXJkL3N0cmluZy5oIgogCi1kaWN0aW9uYXJ5IE1lZGlhS2V5U3lzdGVtTWVkaWFDYXBhYmlsaXR5IHsKLSAgRE9NU3RyaW5nIGNvbnRlbnRUeXBlID0gIiI7Ci0gIERPTVN0cmluZyByb2J1c3RuZXNzID0gIiI7Ci19OworI2luY2x1ZGUgPHN0ZGlvLmg+CisKK2ludCBTYlN0cmluZ0Zvcm1hdFdpZGUod2NoYXJfdCogb3V0X2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgYXJndW1lbnRzKSB7CisgIHJldHVybiBfdnNud3ByaW50ZihvdXRfYnVmZmVyLCBidWZmZXJfc2l6ZSwgZm9ybWF0LCBhcmd1bWVudHMpOworfQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vbWVkaWFfa2V5X3N5c3RlbV9tZWRpYV9jYXBhYmlsaXR5LmlkbCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3N5c3RlbV9icmVha19pbnRvX2RlYnVnZ2VyLmNjCnNpbWlsYXJpdHkgaW5kZXggNzQlCmNvcHkgZnJvbSBzcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfc3lzdGVtX21lZGlhX2NhcGFiaWxpdHkuaWRsCmNvcHkgdG8gc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc3lzdGVtX2JyZWFrX2ludG9fZGVidWdnZXIuY2MKaW5kZXggNTFlMWYyZS4uMTIxZDA1MiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vbWVkaWFfa2V5X3N5c3RlbV9tZWRpYV9jYXBhYmlsaXR5LmlkbAorKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zeXN0ZW1fYnJlYWtfaW50b19kZWJ1Z2dlci5jYwpAQCAtMTIsOSArMTIsMTIgQEAKIC8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAxNi9DUi1lbmNyeXB0ZWQtbWVkaWEtMjAxNjA3MDUvI21lZGlha2V5c3lzdGVtbWVkaWFjYXBhYmlsaXR5LWRpY3Rpb25hcnkKKyNpbmNsdWRlICJzdGFyYm9hcmQvc3lzdGVtLmgiCiAKLWRpY3Rpb25hcnkgTWVkaWFLZXlTeXN0ZW1NZWRpYUNhcGFiaWxpdHkgewotICBET01TdHJpbmcgY29udGVudFR5cGUgPSAiIjsKLSAgRE9NU3RyaW5nIHJvYnVzdG5lc3MgPSAiIjsKLX07CisjaW5jbHVkZSA8d2luZG93cy5oPgorCit2b2lkIFNiU3lzdGVtQnJlYWtJbnRvRGVidWdnZXIoKSB7CisgIC8vIFRPRE86IG5laXRoZXIgb2YgdGhlc2UgbWF5IGJlIHZhbGlkIG9uIHNvbWUgcGxhdGZvcm1zLgorICBEZWJ1Z0JyZWFrKCk7CisgIEV4aXRQcm9jZXNzKDEpOworfQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vbWVkaWFfa2V5X3N5c3RlbV9tZWRpYV9jYXBhYmlsaXR5LmlkbCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3N5c3RlbV9nZXRfcmFuZG9tX3VpbnQ2NC5jYwpzaW1pbGFyaXR5IGluZGV4IDYxJQpjb3B5IGZyb20gc3JjL2NvYmFsdC9kb20vbWVkaWFfa2V5X3N5c3RlbV9tZWRpYV9jYXBhYmlsaXR5LmlkbApjb3B5IHRvIHNyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3N5c3RlbV9nZXRfcmFuZG9tX3VpbnQ2NC5jYwppbmRleCA1MWUxZjJlLi42MzJjMzlkIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfc3lzdGVtX21lZGlhX2NhcGFiaWxpdHkuaWRsCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3N5c3RlbV9nZXRfcmFuZG9tX3VpbnQ2NC5jYwpAQCAtMTIsOSArMTIsMTkgQEAKIC8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAxNi9DUi1lbmNyeXB0ZWQtbWVkaWEtMjAxNjA3MDUvI21lZGlha2V5c3lzdGVtbWVkaWFjYXBhYmlsaXR5LWRpY3Rpb25hcnkKKyNpbmNsdWRlICJzdGFyYm9hcmQvc3lzdGVtLmgiCiAKLWRpY3Rpb25hcnkgTWVkaWFLZXlTeXN0ZW1NZWRpYUNhcGFiaWxpdHkgewotICBET01TdHJpbmcgY29udGVudFR5cGUgPSAiIjsKLSAgRE9NU3RyaW5nIHJvYnVzdG5lc3MgPSAiIjsKLX07CisjaW5jbHVkZSA8d2luZG93cy5oPgorCisjaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgorI2luY2x1ZGUgInN0YXJib2FyZC90aW1lLmgiCisKK3VpbnQ2NF90IFNiU3lzdGVtR2V0UmFuZG9tVUludDY0KCkgeworICAvLyBUT0RPOiBUaGlzIGlzIERFRklOSVRFTFkgbm90IGNyeXB0b2dyYXBoaWNhbGx5IHNlY3VyZS4KKyAgc3RhdGljIGJvb2wgaW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgaWYgKCFpbml0aWFsaXplZCkgeworICAgIHNyYW5kKEdldFRpY2tDb3VudCgpKTsKKyAgICBpbml0aWFsaXplZCA9IHRydWU7CisgIH0KKyAgcmV0dXJuIChzdGF0aWNfY2FzdDx1aW50NjRfdD4oc3RkOjpyYW5kKCkpIDw8IDMyKSB8IHJhbmQoKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3RocmVhZF9jcmVhdGUuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aHJlYWRfY3JlYXRlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMjBhYWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aHJlYWRfY3JlYXRlLmNjCkBAIC0wLDAgKzEsMTE5IEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAic3RhcmJvYXJkL3RocmVhZC5oIgorCisjaW5jbHVkZSA8cHJvY2Vzcy5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvb25jZS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvdGhyZWFkX3ByaXZhdGUuaCIKKwordXNpbmcgc3RhcmJvYXJkOjpzaGFyZWQ6OndpbjMyOjpHZXRUaHJlYWRTdWJzeXN0ZW1TaW5nbGV0b247Cit1c2luZyBzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI6OlNiVGhyZWFkUHJpdmF0ZTsKK3VzaW5nIHN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjo6VGhyZWFkU3Vic3lzdGVtU2luZ2xldG9uOworCituYW1lc3BhY2UgeworCitjbGFzcyBUaHJlYWRDcmVhdGVJbmZvIHsKKyBwdWJsaWM6CisgIFNiVGhyZWFkUHJpdmF0ZSB0aHJlYWRfcHJpdmF0ZV87CisgIFNiVGhyZWFkRW50cnlQb2ludCBlbnRyeV9wb2ludF87CisgIHZvaWQqIHVzZXJfY29udGV4dF87CisgIHN0ZDo6c3RyaW5nIG5hbWVfOworfTsKKwordm9pZCBDYWxsVGhyZWFkTG9jYWxEZXN0cnVjdG9ycygpIHsKKyAgVGhyZWFkU3Vic3lzdGVtU2luZ2xldG9uKiBzaW5nbGV0b24gPSBHZXRUaHJlYWRTdWJzeXN0ZW1TaW5nbGV0b24oKTsKKworICAvLyBUT0RPIG5vdGUgdGhhdCB0aGUgaW1wbGVtZW50YXRpb24gYmVsb3cgaG9sZHMgYSBnbG9iYWwgbG9jaworICAvLyB3aGlsZSBwcm9jZXNzaW5nIFRMUyBkZXN0cnVjdG9ycyBvbiB0aHJlYWQgZXhpdC4gVGhpcyBjb3VsZAorICAvLyBiZSBhIGJvdHRsZW5lY2sgaW4gc29tZSBzY2VuYXJpb3MuIEEgbG9ja2xlc3MgYXBwcm9hY2ggbWF5IGJlIHByZWZlcnJhYmxlLgorICBTYk11dGV4QWNxdWlyZSgmc2luZ2xldG9uLT5tdXRleF8pOworICBmb3IgKGF1dG8gaXQgPSBzaW5nbGV0b24tPnRocmVhZF9sb2NhbF9rZXlzXy5iZWdpbigpOworICAgICAgIGl0ICE9IHNpbmdsZXRvbi0+dGhyZWFkX2xvY2FsX2tleXNfLmVuZCgpOyArK2l0KSB7CisgICAgaWYgKCFpdC0+c2Vjb25kLT5kZXN0cnVjdG9yKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgdm9pZCogZW50cnkgPSBTYlRocmVhZEdldExvY2FsVmFsdWUoaXQtPnNlY29uZCk7CisgICAgaWYgKCFlbnRyeSkgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIGl0LT5zZWNvbmQtPmRlc3RydWN0b3IoZW50cnkpOworICB9CisgIFNiTXV0ZXhSZWxlYXNlKCZzaW5nbGV0b24tPm11dGV4Xyk7Cit9CisKK3Vuc2lnbmVkIFRocmVhZFRyYW1wb2xpbmUodm9pZCogdGhyZWFkX2NyZWF0ZV9pbmZvX2NvbnRleHQpIHsKKyAgc3RkOjp1bmlxdWVfcHRyPFRocmVhZENyZWF0ZUluZm8+IGluZm8oCisgICAgICBzdGF0aWNfY2FzdDxUaHJlYWRDcmVhdGVJbmZvKj4odGhyZWFkX2NyZWF0ZV9pbmZvX2NvbnRleHQpKTsKKworICBUaHJlYWRTdWJzeXN0ZW1TaW5nbGV0b24qIHNpbmdsZXRvbiA9IEdldFRocmVhZFN1YnN5c3RlbVNpbmdsZXRvbigpOworCisgIFNiVGhyZWFkU2V0TG9jYWxWYWx1ZShzaW5nbGV0b24tPnRocmVhZF9wcml2YXRlX2tleV8sICZpbmZvLT50aHJlYWRfcHJpdmF0ZV8pOworCisgIFNiVGhyZWFkU2V0TmFtZShpbmZvLT5uYW1lXy5jX3N0cigpKTsKKworICB2b2lkKiByZXN1bHQgPSBpbmZvLT5lbnRyeV9wb2ludF8oaW5mby0+dXNlcl9jb250ZXh0Xyk7CisKKyAgQ2FsbFRocmVhZExvY2FsRGVzdHJ1Y3RvcnMoKTsKKworICBTYk11dGV4QWNxdWlyZSgmaW5mby0+dGhyZWFkX3ByaXZhdGVfLm11dGV4Xyk7CisgIGluZm8tPnRocmVhZF9wcml2YXRlXy5yZXN1bHRfID0gcmVzdWx0OworICBpbmZvLT50aHJlYWRfcHJpdmF0ZV8ucmVzdWx0X2lzX3ZhbGlkXyA9IHRydWU7CisgIFNiQ29uZGl0aW9uVmFyaWFibGVTaWduYWwoJmluZm8tPnRocmVhZF9wcml2YXRlXy5jb25kaXRpb25fKTsKKyAgd2hpbGUgKGluZm8tPnRocmVhZF9wcml2YXRlXy53YWl0X2Zvcl9qb2luXykgeworICAgIFNiQ29uZGl0aW9uVmFyaWFibGVXYWl0KCZpbmZvLT50aHJlYWRfcHJpdmF0ZV8uY29uZGl0aW9uXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5mby0+dGhyZWFkX3ByaXZhdGVfLm11dGV4Xyk7CisgIH0KKyAgU2JNdXRleFJlbGVhc2UoJmluZm8tPnRocmVhZF9wcml2YXRlXy5tdXRleF8pOworCisgIHJldHVybiAwOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworU2JUaHJlYWQgU2JUaHJlYWRDcmVhdGUoaW50NjRfdCBzdGFja19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgU2JUaHJlYWRQcmlvcml0eSAvKnByaW9yaXR5Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICBTYlRocmVhZEFmZmluaXR5IC8qYWZmaW5pdHkqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgam9pbmFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgU2JUaHJlYWRFbnRyeVBvaW50IGVudHJ5X3BvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY29udGV4dCkgeworICBpZiAoZW50cnlfcG9pbnQgPT0gTlVMTCkgeworICAgIHJldHVybiBrU2JUaHJlYWRJbnZhbGlkOworICB9CisgIFRocmVhZENyZWF0ZUluZm8qIGluZm8gPSBuZXcgVGhyZWFkQ3JlYXRlSW5mbygpOworCisgIGluZm8tPmVudHJ5X3BvaW50XyA9IGVudHJ5X3BvaW50OworICBpbmZvLT51c2VyX2NvbnRleHRfID0gY29udGV4dDsKKyAgaW5mby0+dGhyZWFkX3ByaXZhdGVfLndhaXRfZm9yX2pvaW5fID0gam9pbmFibGU7CisgIGlmIChuYW1lKSB7CisgICAgaW5mby0+bmFtZV8gPSBuYW1lOworICB9CisKKyAgLy8gQ3JlYXRlIHRoZSB0aHJlYWQgc3VzcGVuZGVkLCBhbmQgdGhlbiByZXN1bWUgb25jZSBUaHJlYWRDcmVhdGVJbmZvOjpoYW5kbGVfCisgIC8vIGhhcyBiZWVuIHNldCwgc28gdGhhdCBpdCdzIGFsd2F5IHZhbGlkIGluIHRoZSBUaHJlYWRDcmVhdGVJbmZvCisgIC8vIGRlc3RydWN0b3IuCisgIHVpbnRwdHJfdCBoYW5kbGUgPQorICAgICAgX2JlZ2ludGhyZWFkZXgoTlVMTCwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PihzdGFja19zaXplKSwKKyAgICAgICAgICAgICAgICAgICAgIFRocmVhZFRyYW1wb2xpbmUsIGluZm8sIENSRUFURV9TVVNQRU5ERUQsIE5VTEwpOworCisgIGluZm8tPnRocmVhZF9wcml2YXRlXy5oYW5kbGVfID0gcmVpbnRlcnByZXRfY2FzdDxIQU5ETEU+KGhhbmRsZSk7CisKKyAgUmVzdW1lVGhyZWFkKGluZm8tPnRocmVhZF9wcml2YXRlXy5oYW5kbGVfKTsKKworICByZXR1cm4gJmluZm8tPnRocmVhZF9wcml2YXRlXzsKK30KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3RocmVhZF9jcmVhdGVfbG9jYWxfa2V5LmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvdGhyZWFkX2NyZWF0ZV9sb2NhbF9rZXkuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y3ODZhYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3RocmVhZF9jcmVhdGVfbG9jYWxfa2V5LmNjCkBAIC0wLDAgKzEsNjIgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJzdGFyYm9hcmQvdGhyZWFkLmgiCisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKKyNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL211dGV4LmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aHJlYWRfcHJpdmF0ZS5oIgorCit1c2luZyBzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI6OkdldFRocmVhZFN1YnN5c3RlbVNpbmdsZXRvbjsKK3VzaW5nIHN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjo6VGhyZWFkU3Vic3lzdGVtU2luZ2xldG9uOworCituYW1lc3BhY2Ugc3RhcmJvYXJkIHsKK25hbWVzcGFjZSBzaGFyZWQgeworbmFtZXNwYWNlIHdpbjMyIHsKKworU2JUaHJlYWRMb2NhbEtleSBTYlRocmVhZENyZWF0ZUxvY2FsS2V5SW50ZXJuYWwoCisgICAgU2JUaHJlYWRMb2NhbERlc3RydWN0b3IgZGVzdHJ1Y3RvciwKKyAgICBUaHJlYWRTdWJzeXN0ZW1TaW5nbGV0b24qIHNpbmdsZXRvbikgeworICBEV09SRCBpbmRleCA9IFRsc0FsbG9jKCk7CisKKyAgaWYgKGluZGV4ID09IFRMU19PVVRfT0ZfSU5ERVhFUykgeworICAgIHJldHVybiBrU2JUaHJlYWRMb2NhbEtleUludmFsaWQ7CisgIH0KKworICBTYlRocmVhZExvY2FsS2V5UHJpdmF0ZSogcmVzdWx0ID0gc3RhdGljX2Nhc3Q8U2JUaHJlYWRMb2NhbEtleVByaXZhdGUqPigKKyAgICAgIFNiTWVtb3J5QWxsb2NhdGVOb1JlcG9ydChzaXplb2YoU2JUaHJlYWRMb2NhbEtleVByaXZhdGUpKSk7CisKKyAgaWYgKHJlc3VsdCA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuIGtTYlRocmVhZExvY2FsS2V5SW52YWxpZDsKKyAgfQorCisgIHJlc3VsdC0+dGxzX2luZGV4ID0gaW5kZXg7CisgIHJlc3VsdC0+ZGVzdHJ1Y3RvciA9IGRlc3RydWN0b3I7CisKKyAgU2JNdXRleEFjcXVpcmUoJnNpbmdsZXRvbi0+bXV0ZXhfKTsKKyAgc2luZ2xldG9uLT50aHJlYWRfbG9jYWxfa2V5c18uaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGluZGV4LCByZXN1bHQpKTsKKyAgU2JNdXRleFJlbGVhc2UoJnNpbmdsZXRvbi0+bXV0ZXhfKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworfSAgLy8gbmFtZXNwYWNlIHdpbjMyCit9ICAvLyBuYW1lc3BhY2Ugc2hhcmVkCit9ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCisKK1NiVGhyZWFkTG9jYWxLZXkgU2JUaHJlYWRDcmVhdGVMb2NhbEtleShTYlRocmVhZExvY2FsRGVzdHJ1Y3RvciBkZXN0cnVjdG9yKSB7CisgIFRocmVhZFN1YnN5c3RlbVNpbmdsZXRvbiogc2luZ2xldG9uID0gR2V0VGhyZWFkU3Vic3lzdGVtU2luZ2xldG9uKCk7CisgIHJldHVybiBTYlRocmVhZENyZWF0ZUxvY2FsS2V5SW50ZXJuYWwoZGVzdHJ1Y3Rvciwgc2luZ2xldG9uKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3RocmVhZF9kZXN0cm95X2xvY2FsX2tleS5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3RocmVhZF9kZXN0cm95X2xvY2FsX2tleS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDFmYzc1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvdGhyZWFkX2Rlc3Ryb3lfbG9jYWxfa2V5LmNjCkBAIC0wLDAgKzEsMzggQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJzdGFyYm9hcmQvdGhyZWFkLmgiCisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKKyNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aHJlYWRfcHJpdmF0ZS5oIgorCit1c2luZyBzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI6OkdldFRocmVhZFN1YnN5c3RlbVNpbmdsZXRvbjsKK3VzaW5nIHN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjo6VGhyZWFkU3Vic3lzdGVtU2luZ2xldG9uOworCit2b2lkIFNiVGhyZWFkRGVzdHJveUxvY2FsS2V5KFNiVGhyZWFkTG9jYWxLZXkga2V5KSB7CisgIGlmICghU2JUaHJlYWRJc1ZhbGlkTG9jYWxLZXkoa2V5KSkgeworICAgIHJldHVybjsKKyAgfQorICBEV09SRCB0bHNfaW5kZXggPSBzdGF0aWNfY2FzdDxTYlRocmVhZExvY2FsS2V5UHJpdmF0ZSo+KGtleSktPnRsc19pbmRleDsKKyAgVGhyZWFkU3Vic3lzdGVtU2luZ2xldG9uKiBzaW5nbGV0b24gPSBHZXRUaHJlYWRTdWJzeXN0ZW1TaW5nbGV0b24oKTsKKworICBTYk11dGV4QWNxdWlyZSgmc2luZ2xldG9uLT5tdXRleF8pOworICBzaW5nbGV0b24tPnRocmVhZF9sb2NhbF9rZXlzXy5lcmFzZSh0bHNfaW5kZXgpOworICBTYk11dGV4UmVsZWFzZSgmc2luZ2xldG9uLT5tdXRleF8pOworCisgIFRsc0ZyZWUodGxzX2luZGV4KTsKKyAgU2JNZW1vcnlEZWFsbG9jYXRlTm9SZXBvcnQoa2V5KTsKK30KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3RocmVhZF9kZXRhY2guY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aHJlYWRfZGV0YWNoLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMmExMmQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aHJlYWRfZGV0YWNoLmNjCkBAIC0wLDAgKzEsMzMgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJzdGFyYm9hcmQvdGhyZWFkLmgiCisKKyNpbmNsdWRlICJzdGFyYm9hcmQvY29uZGl0aW9uX3ZhcmlhYmxlLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL211dGV4LmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aHJlYWRfcHJpdmF0ZS5oIgorCit1c2luZyBzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI6OlNiVGhyZWFkUHJpdmF0ZTsKKwordm9pZCBTYlRocmVhZERldGFjaChTYlRocmVhZCB0aHJlYWQpIHsKKyAgaWYgKHRocmVhZCA9PSBrU2JUaHJlYWRJbnZhbGlkKSB7CisgICAgcmV0dXJuOworICB9CisgIFNiVGhyZWFkUHJpdmF0ZSogdGhyZWFkX3ByaXZhdGUgPSBzdGF0aWNfY2FzdDxTYlRocmVhZFByaXZhdGUqPih0aHJlYWQpOworCisgIFNiTXV0ZXhBY3F1aXJlKCZ0aHJlYWRfcHJpdmF0ZS0+bXV0ZXhfKTsKKyAgdGhyZWFkX3ByaXZhdGUtPndhaXRfZm9yX2pvaW5fID0gZmFsc2U7CisgIFNiQ29uZGl0aW9uVmFyaWFibGVTaWduYWwoJnRocmVhZF9wcml2YXRlLT5jb25kaXRpb25fKTsKKyAgU2JNdXRleFJlbGVhc2UoJnRocmVhZF9wcml2YXRlLT5tdXRleF8pOworfQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vbWVkaWFfa2V5X3N5c3RlbV9tZWRpYV9jYXBhYmlsaXR5LmlkbCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3RocmVhZF9nZXRfY3VycmVudC5jYwpzaW1pbGFyaXR5IGluZGV4IDY5JQpjb3B5IGZyb20gc3JjL2NvYmFsdC9kb20vbWVkaWFfa2V5X3N5c3RlbV9tZWRpYV9jYXBhYmlsaXR5LmlkbApjb3B5IHRvIHNyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3RocmVhZF9nZXRfY3VycmVudC5jYwppbmRleCA1MWUxZjJlLi4xMmJhNTQ0IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfc3lzdGVtX21lZGlhX2NhcGFiaWxpdHkuaWRsCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3RocmVhZF9nZXRfY3VycmVudC5jYwpAQCAtMTIsOSArMTIsMTMgQEAKIC8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAxNi9DUi1lbmNyeXB0ZWQtbWVkaWEtMjAxNjA3MDUvI21lZGlha2V5c3lzdGVtbWVkaWFjYXBhYmlsaXR5LWRpY3Rpb25hcnkKKyNpbmNsdWRlICJzdGFyYm9hcmQvdGhyZWFkLmgiCiAKLWRpY3Rpb25hcnkgTWVkaWFLZXlTeXN0ZW1NZWRpYUNhcGFiaWxpdHkgewotICBET01TdHJpbmcgY29udGVudFR5cGUgPSAiIjsKLSAgRE9NU3RyaW5nIHJvYnVzdG5lc3MgPSAiIjsKLX07CisjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aHJlYWRfcHJpdmF0ZS5oIgorCit1c2luZyBzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI6OkdldEN1cnJlbnRTYlRocmVhZFByaXZhdGU7Cit1c2luZyBzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI6OlNiVGhyZWFkUHJpdmF0ZTsKKworU2JUaHJlYWQgU2JUaHJlYWRHZXRDdXJyZW50KCkgeworICByZXR1cm4gR2V0Q3VycmVudFNiVGhyZWFkUHJpdmF0ZSgpOworfQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iYXNlL21hdGguaCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3RocmVhZF9nZXRfaWQuY2MKc2ltaWxhcml0eSBpbmRleCA3NiUKY29weSBmcm9tIHNyYy9jb2JhbHQvYmFzZS9tYXRoLmgKY29weSB0byBzcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aHJlYWRfZ2V0X2lkLmNjCmluZGV4IDQ3MjNiZmIuLmI2YTcyOTMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmFzZS9tYXRoLmgKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvdGhyZWFkX2dldF9pZC5jYwpAQCAtMSw0ICsxLDQgQEAKLS8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogLy8KIC8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTIsOSArMTIsMTAgQEAKIC8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCi0jaWZuZGVmIENPQkFMVF9CQVNFX01BVEhfSF8KLSNkZWZpbmUgQ09CQUxUX0JBU0VfTUFUSF9IXworI2luY2x1ZGUgInN0YXJib2FyZC90aHJlYWQuaCIKIAotI2luY2x1ZGUgPGNtYXRoPgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KIAotI2VuZGlmICAvLyBDT0JBTFRfQkFTRV9NQVRIX0hfCitTYlRocmVhZElkIFNiVGhyZWFkR2V0SWQoKSB7CisgIHJldHVybiBHZXRDdXJyZW50VGhyZWFkSWQoKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9zeXN0ZW1fbWVkaWFfY2FwYWJpbGl0eS5pZGwgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aHJlYWRfZ2V0X2xvY2FsX3ZhbHVlLmNjCnNpbWlsYXJpdHkgaW5kZXggNjQlCmNvcHkgZnJvbSBzcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfc3lzdGVtX21lZGlhX2NhcGFiaWxpdHkuaWRsCmNvcHkgdG8gc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvdGhyZWFkX2dldF9sb2NhbF92YWx1ZS5jYwppbmRleCA1MWUxZjJlLi42NDYwM2I2IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfc3lzdGVtX21lZGlhX2NhcGFiaWxpdHkuaWRsCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3RocmVhZF9nZXRfbG9jYWxfdmFsdWUuY2MKQEAgLTEyLDkgKzEyLDE2IEBACiAvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTYvQ1ItZW5jcnlwdGVkLW1lZGlhLTIwMTYwNzA1LyNtZWRpYWtleXN5c3RlbW1lZGlhY2FwYWJpbGl0eS1kaWN0aW9uYXJ5CisjaW5jbHVkZSAic3RhcmJvYXJkL3RocmVhZC5oIgogCi1kaWN0aW9uYXJ5IE1lZGlhS2V5U3lzdGVtTWVkaWFDYXBhYmlsaXR5IHsKLSAgRE9NU3RyaW5nIGNvbnRlbnRUeXBlID0gIiI7Ci0gIERPTVN0cmluZyByb2J1c3RuZXNzID0gIiI7Ci19OworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvdGhyZWFkX3ByaXZhdGUuaCIKKwordm9pZCogU2JUaHJlYWRHZXRMb2NhbFZhbHVlKFNiVGhyZWFkTG9jYWxLZXkga2V5KSB7CisgIGlmICghU2JUaHJlYWRJc1ZhbGlkTG9jYWxLZXkoa2V5KSkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIERXT1JEIHRsc19pbmRleCA9IHN0YXRpY19jYXN0PFNiVGhyZWFkTG9jYWxLZXlQcml2YXRlKj4oa2V5KS0+dGxzX2luZGV4OworICByZXR1cm4gVGxzR2V0VmFsdWUodGxzX2luZGV4KTsKK30KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3RocmVhZF9nZXRfbmFtZS5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3RocmVhZF9nZXRfbmFtZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2RkM2Q3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvdGhyZWFkX2dldF9uYW1lLmNjCkBAIC0wLDAgKzEsMjggQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJzdGFyYm9hcmQvdGhyZWFkLmgiCisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKKyNpbmNsdWRlICJzdGFyYm9hcmQvc3RyaW5nLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aHJlYWRfcHJpdmF0ZS5oIgorCit1c2luZyBzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI6OkdldEN1cnJlbnRTYlRocmVhZFByaXZhdGU7Cit1c2luZyBzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI6OlNiVGhyZWFkUHJpdmF0ZTsKKwordm9pZCBTYlRocmVhZEdldE5hbWUoY2hhciogYnVmZmVyLCBpbnQgYnVmZmVyX3NpemUpIHsKKyAgU2JUaHJlYWRQcml2YXRlKiB0aHJlYWRfcHJpdmF0ZSA9IEdldEN1cnJlbnRTYlRocmVhZFByaXZhdGUoKTsKKyAgU2JTdHJpbmdDb3B5KGJ1ZmZlciwgdGhyZWFkX3ByaXZhdGUtPm5hbWVfLmNfc3RyKCksIGJ1ZmZlcl9zaXplKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmFzZS9tYXRoLmggYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aHJlYWRfaXNfZXF1YWwuY2MKc2ltaWxhcml0eSBpbmRleCA3NSUKY29weSBmcm9tIHNyYy9jb2JhbHQvYmFzZS9tYXRoLmgKY29weSB0byBzcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aHJlYWRfaXNfZXF1YWwuY2MKaW5kZXggNDcyM2JmYi4uY2NjMmQ2NCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iYXNlL21hdGguaAorKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aHJlYWRfaXNfZXF1YWwuY2MKQEAgLTEsNCArMSw0IEBACi0vLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIC8vCiAvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIC8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTEyLDkgKzEyLDggQEAKIC8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCi0jaWZuZGVmIENPQkFMVF9CQVNFX01BVEhfSF8KLSNkZWZpbmUgQ09CQUxUX0JBU0VfTUFUSF9IXworI2luY2x1ZGUgInN0YXJib2FyZC90aHJlYWQuaCIKIAotI2luY2x1ZGUgPGNtYXRoPgotCi0jZW5kaWYgIC8vIENPQkFMVF9CQVNFX01BVEhfSF8KK2Jvb2wgU2JUaHJlYWRJc0VxdWFsKFNiVGhyZWFkIHRocmVhZDEsIFNiVGhyZWFkIHRocmVhZDIpIHsKKyAgcmV0dXJuIHRocmVhZDEgPT0gdGhyZWFkMjsKK30KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3RocmVhZF9qb2luLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvdGhyZWFkX2pvaW4uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRlMTU4OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3RocmVhZF9qb2luLmNjCkBAIC0wLDAgKzEsNDcgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJzdGFyYm9hcmQvdGhyZWFkLmgiCisKKyNpbmNsdWRlICJzdGFyYm9hcmQvY29uZGl0aW9uX3ZhcmlhYmxlLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL211dGV4LmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aHJlYWRfcHJpdmF0ZS5oIgorCit1c2luZyBzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI6OlNiVGhyZWFkUHJpdmF0ZTsKKworYm9vbCBTYlRocmVhZEpvaW4oU2JUaHJlYWQgdGhyZWFkLCB2b2lkKiogb3V0X3JldHVybikgeworICBpZiAodGhyZWFkID09IGtTYlRocmVhZEludmFsaWQpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBTYlRocmVhZFByaXZhdGUqIHRocmVhZF9wcml2YXRlID0gc3RhdGljX2Nhc3Q8U2JUaHJlYWRQcml2YXRlKj4odGhyZWFkKTsKKworICBTYk11dGV4QWNxdWlyZSgmdGhyZWFkX3ByaXZhdGUtPm11dGV4Xyk7CisgIGlmICghdGhyZWFkX3ByaXZhdGUtPndhaXRfZm9yX2pvaW5fKSB7CisgICAgLy8gVGhyZWFkIGhhcyBhbHJlYWR5IGJlZW4gZGV0YWNoZWQuCisgICAgU2JNdXRleFJlbGVhc2UoJnRocmVhZF9wcml2YXRlLT5tdXRleF8pOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICB3aGlsZSAoIXRocmVhZF9wcml2YXRlLT5yZXN1bHRfaXNfdmFsaWRfKSB7CisgICAgU2JDb25kaXRpb25WYXJpYWJsZVdhaXQoJnRocmVhZF9wcml2YXRlLT5jb25kaXRpb25fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aHJlYWRfcHJpdmF0ZS0+bXV0ZXhfKTsKKyAgfQorICB0aHJlYWRfcHJpdmF0ZS0+d2FpdF9mb3Jfam9pbl8gPSBmYWxzZTsKKyAgU2JDb25kaXRpb25WYXJpYWJsZVNpZ25hbCgmdGhyZWFkX3ByaXZhdGUtPmNvbmRpdGlvbl8pOworICBpZiAob3V0X3JldHVybiAhPSBOVUxMKSB7CisgICAgKm91dF9yZXR1cm4gPSB0aHJlYWRfcHJpdmF0ZS0+cmVzdWx0XzsKKyAgfQorICBTYk11dGV4UmVsZWFzZSgmdGhyZWFkX3ByaXZhdGUtPm11dGV4Xyk7CisgIHJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvdGhyZWFkX3ByaXZhdGUuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aHJlYWRfcHJpdmF0ZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGVlNmIxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvdGhyZWFkX3ByaXZhdGUuY2MKQEAgLTAsMCArMSw2MSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgInN0YXJib2FyZC90aHJlYWQuaCIKKworI2luY2x1ZGUgPHByb2Nlc3MuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL29uY2UuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3RocmVhZF9wcml2YXRlLmgiCisKK3VzaW5nIHN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjo6R2V0VGhyZWFkU3Vic3lzdGVtU2luZ2xldG9uOwordXNpbmcgc3RhcmJvYXJkOjpzaGFyZWQ6OndpbjMyOjpTYlRocmVhZFByaXZhdGU7Cit1c2luZyBzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI6OlRocmVhZFN1YnN5c3RlbVNpbmdsZXRvbjsKKworbmFtZXNwYWNlIHN0YXJib2FyZCB7CituYW1lc3BhY2Ugc2hhcmVkIHsKK25hbWVzcGFjZSB3aW4zMiB7CisKK1NCX09OQ0VfSU5JVElBTElaRV9GVU5DVElPTihUaHJlYWRTdWJzeXN0ZW1TaW5nbGV0b24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0VGhyZWFkU3Vic3lzdGVtU2luZ2xldG9uKTsKKwordm9pZCBSZWdpc3Rlck1haW5UaHJlYWQoKSB7CisgIHN0ZDo6dW5pcXVlX3B0cjxTYlRocmVhZFByaXZhdGU+IHRocmVhZF9wcml2YXRlKG5ldyBTYlRocmVhZFByaXZhdGUoKSk7CisKKyAgLy8gR2V0Q3VycmVudFRocmVhZCgpIHJldHVybnMgYSBwc2V1ZG8taGFuZGxlIHRoYXQgbXVzdCBiZSBkdXBsaWNhdGVkCisgIC8vIHRvIGJlIHVzZWQgaW4gZ2VuZXJhbCBjYXNlcy4KKyAgSEFORExFIHBzZXVkb19oYW5kbGUgPSBHZXRDdXJyZW50VGhyZWFkKCk7CisgIEhBTkRMRSBoYW5kbGU7CisgIEJPT0wgc3VjY2VzcyA9CisgICAgICBEdXBsaWNhdGVIYW5kbGUoR2V0Q3VycmVudFByb2Nlc3MoKSwgcHNldWRvX2hhbmRsZSwgR2V0Q3VycmVudFByb2Nlc3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAmaGFuZGxlLCAwLCBmYWxzZSwgRFVQTElDQVRFX1NBTUVfQUNDRVNTKTsKKyAgU0JfRENIRUNLKHN1Y2Nlc3MpIDw8ICJEdXBsaWNhdGVIYW5kbGUgZmFpbGVkIjsKKworICB0aHJlYWRfcHJpdmF0ZS0+aGFuZGxlXyA9IGhhbmRsZTsKKyAgdGhyZWFkX3ByaXZhdGUtPndhaXRfZm9yX2pvaW5fID0gZmFsc2U7CisKKyAgU2JUaHJlYWRTZXRMb2NhbFZhbHVlKEdldFRocmVhZFN1YnN5c3RlbVNpbmdsZXRvbigpLT50aHJlYWRfcHJpdmF0ZV9rZXlfLAorICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkX3ByaXZhdGUucmVsZWFzZSgpKTsKK30KKworU2JUaHJlYWRQcml2YXRlKiBHZXRDdXJyZW50U2JUaHJlYWRQcml2YXRlKCkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8U2JUaHJlYWRQcml2YXRlKj4oU2JUaHJlYWRHZXRMb2NhbFZhbHVlKAorICAgICAgR2V0VGhyZWFkU3Vic3lzdGVtU2luZ2xldG9uKCktPnRocmVhZF9wcml2YXRlX2tleV8pKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHdpbjMyCit9ICAvLyBuYW1lc3BhY2Ugc2hhcmVkCit9ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aHJlYWRfcHJpdmF0ZS5oIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvdGhyZWFkX3ByaXZhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmFjYmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvdGhyZWFkX3ByaXZhdGUuaApAQCAtMCwwICsxLDEwOSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2lmbmRlZiBTVEFSQk9BUkRfV0lOMzJfVEhSRUFEX1BSSVZBVEVfSF8KKyNkZWZpbmUgU1RBUkJPQVJEX1dJTjMyX1RIUkVBRF9QUklWQVRFX0hfCisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisKKyNpbmNsdWRlICJzdGFyYm9hcmQvY29uZGl0aW9uX3ZhcmlhYmxlLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL211dGV4LmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL29uY2UuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL2ludGVybmFsX29ubHkuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvdGhyZWFkLmgiCisKK3N0cnVjdCBTYlRocmVhZExvY2FsS2V5UHJpdmF0ZSB7CisgIERXT1JEIHRsc19pbmRleDsKKyAgU2JUaHJlYWRMb2NhbERlc3RydWN0b3IgZGVzdHJ1Y3RvcjsKK307CisKK25hbWVzcGFjZSBzdGFyYm9hcmQgeworbmFtZXNwYWNlIHNoYXJlZCB7CituYW1lc3BhY2Ugd2luMzIgeworCitjbGFzcyBUaHJlYWRTdWJzeXN0ZW1TaW5nbGV0b247CisKKy8vIENyZWF0ZXMgYSBTYlRocmVhZExvY2FsS2V5IGdpdmVuIGEgVGhyZWFkU3Vic3lzdGVtU2luZ2xldG9uLiBVc2VkCisvLyB0byBjcmVhdGUgdGhlIGZpcnN0IFNiVGhyZWFkTG9jYWxLZXkuCitTYlRocmVhZExvY2FsS2V5IFNiVGhyZWFkQ3JlYXRlTG9jYWxLZXlJbnRlcm5hbCgKKyAgICBTYlRocmVhZExvY2FsRGVzdHJ1Y3RvciBkZXN0cnVjdG9yLAorICAgIFRocmVhZFN1YnN5c3RlbVNpbmdsZXRvbiogc2luZ2xldG9uKTsKKworLy8gU2luZ2xldG9uIHN0YXRlIGZvciB0aGUgdGhyZWFkIHN1YnN5c3RlbS4KK2NsYXNzIFRocmVhZFN1YnN5c3RlbVNpbmdsZXRvbiB7CisgcHVibGljOgorICBUaHJlYWRTdWJzeXN0ZW1TaW5nbGV0b24oKQorICAgICAgOiBtdXRleF8oU0JfTVVURVhfSU5JVElBTElaRVIpLAorICAgICAgICB0aHJlYWRfcHJpdmF0ZV9rZXlfKFNiVGhyZWFkQ3JlYXRlTG9jYWxLZXlJbnRlcm5hbChOVUxMLCB0aGlzKSkge30KKyAgLy8gVGhpcyBtdXRleCBwcm90ZWN0cyBhbGwgY2xhc3MgbWVtYmVycworICBTYk11dGV4IG11dGV4XzsKKyAgLy8gQWxsb2NhdGVkIHRocmVhZF9sb2NhbF9rZXlzCisgIHN0ZDo6dW5vcmRlcmVkX21hcDxEV09SRCwgU2JUaHJlYWRMb2NhbEtleVByaXZhdGUqPiB0aHJlYWRfbG9jYWxfa2V5c187CisgIC8vIFRocmVhZC1sb2NhbCBrZXkgZm9yIHRoZSB0aHJlYWQncyBTYlRocmVhZFByaXZhdGUKKyAgU2JUaHJlYWRMb2NhbEtleSB0aHJlYWRfcHJpdmF0ZV9rZXlfOworfTsKKworLy8gT2J0YWlucyB0aGUgVGhyZWFkc1N1YnN5c3RlbVNpbmdsZXRvbigpOworVGhyZWFkU3Vic3lzdGVtU2luZ2xldG9uKiBHZXRUaHJlYWRTdWJzeXN0ZW1TaW5nbGV0b24oKTsKKworLy8gUmVnaXN0ZXJzIHRoZSBtYWluIHRocmVhZC4gc2V0dGluZyBpdCdzIFNiVGhyZWFkUHJpdmF0ZSoKK3ZvaWQgUmVnaXN0ZXJNYWluVGhyZWFkKCk7CisKKy8vIFByaXZhdGUgdGhyZWFkIHN0YXRlLCBzdG9yZWQgaW4gdGhyZWFkIGxvY2FsIHN0b3JhZ2UgYW5kCisvLyBjbGVhbmVkIHVwIHdoZW4gdGhyZWFkIGV4aXRzLgorY2xhc3MgU2JUaHJlYWRQcml2YXRlIHsKKyBwdWJsaWM6CisgIFNiVGhyZWFkUHJpdmF0ZSgpCisgICAgICA6IG11dGV4XyhTQl9NVVRFWF9JTklUSUFMSVpFUiksCisgICAgICAgIGNvbmRpdGlvbl8oU0JfQ09ORElUSU9OX1ZBUklBQkxFX0lOSVRJQUxJWkVSKSwKKyAgICAgICAgaGFuZGxlXyhOVUxMKSwKKyAgICAgICAgcmVzdWx0XyhOVUxMKSwKKyAgICAgICAgd2FpdF9mb3Jfam9pbl8oZmFsc2UpLAorICAgICAgICByZXN1bHRfaXNfdmFsaWRfKGZhbHNlKSB7fQorCisgIH5TYlRocmVhZFByaXZhdGUoKSB7CisgICAgaWYgKGhhbmRsZV8pIHsKKyAgICAgIENsb3NlSGFuZGxlKGhhbmRsZV8pOworICAgIH0KKworICAgIFNiTXV0ZXhEZXN0cm95KCZtdXRleF8pOworICAgIFNiQ29uZGl0aW9uVmFyaWFibGVEZXN0cm95KCZjb25kaXRpb25fKTsKKyAgfQorCisgIC8vIFRoaXMgbXV0ZXggcHJvdGVjdHMgYWxsIGNsYXNzIG1lbWJlcnMKKyAgU2JNdXRleCBtdXRleF87CisgIFNiQ29uZGl0aW9uVmFyaWFibGUgY29uZGl0aW9uXzsKKyAgc3RkOjpzdHJpbmcgbmFtZV87CisgIEhBTkRMRSBoYW5kbGVfOworICAvLyBUaGUgcmVzdWx0IG9mIHRoZSB0aHJlYWQuIFRoZSByZXR1cm4gdmFsdWUgb2YgU2JUaHJlYWRFbnRyeVBvaW50CisgIC8vIHRvIHJldHVybiB0byBTYlRocmVhZEpvaW4uCisgIHZvaWQqIHJlc3VsdF87CisgIC8vIFRydWUgaWYgYSB0aHJlYWQgbXVzdCB3YWl0IHRvIGJlIGpvaW5lZCBiZWZvcmUgY29tcGxldGVseSBleGl0aW5nLgorICAvLyBDaGFuZ2VzIHRvIHRoaXMgbXVzdCBzaWduYWwgfGNvbmRpdGlvbl98LgorICBib29sIHdhaXRfZm9yX2pvaW5fOworICAvLyBUcnVlIGlmIHxyZXN1bHRffCBpcyB2YWxpZCAodGhlIHRocmVhZCBoYXMgY29tcGxldGVkIGFuZCBpcyB3YWl0aW5nCisgIC8vIHRvIGV4aXQpLiBDaGFuZ2VzIHRvIHRoaXMgbXVzdCBzaWduYWwgfGNvbmRpdGlvbl98LgorICBib29sIHJlc3VsdF9pc192YWxpZF87Cit9OworCisvLyBPYnRhaW5zIHRoZSBjdXJyZW50IHRocmVhZCdzIFNiVGhyZWFkUHJpdmF0ZSogZnJvbSB0aHJlYWQtbG9jYWwgc3RvcmFnZS4KK1NiVGhyZWFkUHJpdmF0ZSogR2V0Q3VycmVudFNiVGhyZWFkUHJpdmF0ZSgpOworCit9ICAvLyBuYW1lc3BhY2Ugd2luMzIKK30gIC8vIG5hbWVzcGFjZSBzaGFyZWQKK30gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKKworI2VuZGlmICAvLyBTVEFSQk9BUkRfV0lOMzJfVEhSRUFEX1BSSVZBVEVfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9zeXN0ZW1fbWVkaWFfY2FwYWJpbGl0eS5pZGwgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aHJlYWRfc2V0X2xvY2FsX3ZhbHVlLmNjCnNpbWlsYXJpdHkgaW5kZXggNjMlCmNvcHkgZnJvbSBzcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfc3lzdGVtX21lZGlhX2NhcGFiaWxpdHkuaWRsCmNvcHkgdG8gc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvdGhyZWFkX3NldF9sb2NhbF92YWx1ZS5jYwppbmRleCA1MWUxZjJlLi45NWExODQwIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfc3lzdGVtX21lZGlhX2NhcGFiaWxpdHkuaWRsCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3RocmVhZF9zZXRfbG9jYWxfdmFsdWUuY2MKQEAgLTEyLDkgKzEyLDE2IEBACiAvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTYvQ1ItZW5jcnlwdGVkLW1lZGlhLTIwMTYwNzA1LyNtZWRpYWtleXN5c3RlbW1lZGlhY2FwYWJpbGl0eS1kaWN0aW9uYXJ5CisjaW5jbHVkZSAic3RhcmJvYXJkL3RocmVhZC5oIgogCi1kaWN0aW9uYXJ5IE1lZGlhS2V5U3lzdGVtTWVkaWFDYXBhYmlsaXR5IHsKLSAgRE9NU3RyaW5nIGNvbnRlbnRUeXBlID0gIiI7Ci0gIERPTVN0cmluZyByb2J1c3RuZXNzID0gIiI7Ci19OworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvdGhyZWFkX3ByaXZhdGUuaCIKKworYm9vbCBTYlRocmVhZFNldExvY2FsVmFsdWUoU2JUaHJlYWRMb2NhbEtleSBrZXksIHZvaWQqIHZhbHVlKSB7CisgIGlmICghU2JUaHJlYWRJc1ZhbGlkTG9jYWxLZXkoa2V5KSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBEV09SRCB0bHNfaW5kZXggPSBzdGF0aWNfY2FzdDxTYlRocmVhZExvY2FsS2V5UHJpdmF0ZSo+KGtleSktPnRsc19pbmRleDsKKyAgcmV0dXJuIFRsc1NldFZhbHVlKHRsc19pbmRleCwgdmFsdWUpOworfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvdGhyZWFkX3NldF9uYW1lLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvdGhyZWFkX3NldF9uYW1lLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjYTRhZDIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aHJlYWRfc2V0X25hbWUuY2MKQEAgLTAsMCArMSw2NiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgInN0YXJib2FyZC90aHJlYWQuaCIKKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvdGhyZWFkX3ByaXZhdGUuaCIKKwordXNpbmcgc3RhcmJvYXJkOjpzaGFyZWQ6OndpbjMyOjpHZXRDdXJyZW50U2JUaHJlYWRQcml2YXRlOwordXNpbmcgc3RhcmJvYXJkOjpzaGFyZWQ6OndpbjMyOjpTYlRocmVhZFByaXZhdGU7CisKK25hbWVzcGFjZSB7CisKKy8vIFRoZSBjb2RlIGJlbG93IGlzIGZyb20KKy8vIGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkveGNiMno4aHMuYXNweAorLy8gQSB8ZHdUaHJlYWRJRHwgb2YgLTEgbWVhbnMgImN1cnJlbnQgdGhyZWFkIjsKKy8vCisvLyBVc2FnZTogU2V0VGhyZWFkTmFtZSAoKERXT1JEKS0xLCAiTWFpblRocmVhZCIpOworLy8KK2NvbnN0IERXT1JEIE1TX1ZDX0VYQ0VQVElPTiA9IDB4NDA2RDEzODg7CisjcHJhZ21hIHBhY2socHVzaCwgOCkKK3R5cGVkZWYgc3RydWN0IHRhZ1RIUkVBRE5BTUVfSU5GIHsKKyAgRFdPUkQgZHdUeXBlOyAgICAgIC8vIE11c3QgYmUgMHgxMDAwLgorICBMUENTVFIgc3pOYW1lOyAgICAgLy8gUG9pbnRlciB0byBuYW1lIChpbiB1c2VyIGFkZHIgc3BhY2UpLgorICBEV09SRCBkd1RocmVhZElEOyAgLy8gVGhyZWFkIElEICgtMT1jYWxsZXIgdGhyZWFkKS4KKyAgRFdPUkQgZHdGbGFnczsgICAgIC8vIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLCBtdXN0IGJlIHplcm8uCit9IFRIUkVBRE5BTUVfSU5GTzsKKyNwcmFnbWEgcGFjayhwb3ApCit2b2lkIFNldFRocmVhZE5hbWUoRFdPUkQgZHdUaHJlYWRJRCwgY29uc3QgY2hhciogdGhyZWFkTmFtZSkgeworICBUSFJFQUROQU1FX0lORk8gaW5mbzsKKyAgaW5mby5kd1R5cGUgPSAweDEwMDA7CisgIGluZm8uc3pOYW1lID0gdGhyZWFkTmFtZTsKKyAgaW5mby5kd1RocmVhZElEID0gZHdUaHJlYWRJRDsKKyAgaW5mby5kd0ZsYWdzID0gMDsKKyNwcmFnbWEgd2FybmluZyhwdXNoKQorI3ByYWdtYSB3YXJuaW5nKGRpc2FibGUgOiA2MzIwIDYzMjIpCisgIF9fdHJ5IHsKKyAgICBSYWlzZUV4Y2VwdGlvbihNU19WQ19FWENFUFRJT04sIDAsIHNpemVvZihpbmZvKSAvIHNpemVvZihVTE9OR19QVFIpLAorICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8VUxPTkdfUFRSKj4oJmluZm8pKTsKKyAgfSBfX2V4Y2VwdChFWENFUFRJT05fRVhFQ1VURV9IQU5ETEVSKSB7CisgIH0KKyNwcmFnbWEgd2FybmluZyhwb3ApCit9CisKK30gIC8vIG5hbWVzcGFjZQorCit2b2lkIFNiVGhyZWFkU2V0TmFtZShjb25zdCBjaGFyKiBuYW1lKSB7CisgIFNiVGhyZWFkUHJpdmF0ZSogdGhyZWFkX3ByaXZhdGUgPSBHZXRDdXJyZW50U2JUaHJlYWRQcml2YXRlKCk7CisKKyAgLy8gV2Ugc3RvcmUgdGhlIHRocmVhZCBuYW1lIGluIG91ciBvd24gVExTIGNvbnRleHQgYXMgd2VsbCBhcyB0ZWxsaW5nCisgIC8vIHRoZSBPUyBiZWNhdXNlIGl0J3MgbXVjaCBlYXNpZXIgdG8gcmV0cmlldmUgZnJvbSBvdXIgb3duIFRMUyBjb250ZXh0LgorICB0aHJlYWRfcHJpdmF0ZS0+bmFtZV8gPSBuYW1lOworICBTZXRUaHJlYWROYW1lKC0xLCBuYW1lKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9zeXN0ZW1fbWVkaWFfY2FwYWJpbGl0eS5pZGwgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aHJlYWRfc2xlZXAuY2MKc2ltaWxhcml0eSBpbmRleCA2NyUKY29weSBmcm9tIHNyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9zeXN0ZW1fbWVkaWFfY2FwYWJpbGl0eS5pZGwKY29weSB0byBzcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aHJlYWRfc2xlZXAuY2MKaW5kZXggNTFlMWYyZS4uODVjOTY1ZCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vbWVkaWFfa2V5X3N5c3RlbV9tZWRpYV9jYXBhYmlsaXR5LmlkbAorKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aHJlYWRfc2xlZXAuY2MKQEAgLTEyLDkgKzEyLDE3IEBACiAvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTYvQ1ItZW5jcnlwdGVkLW1lZGlhLTIwMTYwNzA1LyNtZWRpYWtleXN5c3RlbW1lZGlhY2FwYWJpbGl0eS1kaWN0aW9uYXJ5CisjaW5jbHVkZSAic3RhcmJvYXJkL3RocmVhZC5oIgogCi1kaWN0aW9uYXJ5IE1lZGlhS2V5U3lzdGVtTWVkaWFDYXBhYmlsaXR5IHsKLSAgRE9NU3RyaW5nIGNvbnRlbnRUeXBlID0gIiI7Ci0gIERPTVN0cmluZyByb2J1c3RuZXNzID0gIiI7Ci19OworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvdGltZV91dGlscy5oIgorCit1c2luZyBzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI6OkNvbnZlcnRTYlRpbWVUb01pbGxpc1JvdW5kVXA7CisKK3ZvaWQgU2JUaHJlYWRTbGVlcChTYlRpbWUgZHVyYXRpb24pIHsKKyAgaWYgKGR1cmF0aW9uIDwgMCkgeworICAgIHJldHVybjsKKyAgfQorICBTbGVlcChDb252ZXJ0U2JUaW1lVG9NaWxsaXNSb3VuZFVwKGR1cmF0aW9uKSk7Cit9CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aHJlYWRfdHlwZXNfcHVibGljLmggYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aHJlYWRfdHlwZXNfcHVibGljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ0MzA2OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3RocmVhZF90eXBlc19wdWJsaWMuaApAQCAtMCwwICsxLDYzIEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBJbmNsdWRlcyB0aHJlYWRpbmcgcHJpbWl0aXZlIHR5cGVzIGFuZCBpbml0aWFsaXplcnMuCisKKyNpZm5kZWYgU1RBUkJPQVJEX1NIQVJFRF9XSU4zMl9USFJFQURfVFlQRVNfUFVCTElDX0hfCisjZGVmaW5lIFNUQVJCT0FSRF9TSEFSRURfV0lOMzJfVEhSRUFEX1RZUEVTX1BVQkxJQ19IXworCisvLyAtLS0gU2JDb25kaXRpb25WYXJpYWJsZSAtLS0KKworLy8gVHJhbnNwYXJlbnQgQ29uZGl0aW9uIFZhcmlhYmxlIGhhbmRsZS4KKy8vIE5vdGU6IHJlcGxpY2Egb2YgUlRMX0NPTkRJVElPTl9WQVJJQUJMRSBpbiB1bS93aW5udC5oIHRvIGF2b2lkIGluY2x1ZGUuCit0eXBlZGVmIHN0cnVjdCBXaW5kb3dzQ29uZGl0aW9uVmFyaWFibGUgeyB2b2lkKiBwdHI7IH0gU2JDb25kaXRpb25WYXJpYWJsZTsKKworLy8gQ29uZGl0aW9uIFZhcmlhYmxlIHN0YXRpYyBpbml0aWFsaXplci4KKy8vIE5vdGU6IHJlcGxpY2Egb2YgUlRMX0NPTkRJVElPTl9WQVJJQUJJTEVfSU5JVCBpbiB1bS93aW5udC5oIHRvIGF2b2lkIGluY2x1ZGUuCisjZGVmaW5lIFNCX0NPTkRJVElPTl9WQVJJQUJMRV9JTklUSUFMSVpFUiBcCisgIHsgMCB9CisKKy8vIC0tLSBTYk11dGV4IC0tLQorCisvLyBUcmFuc3BhcmVudCBNdXRleCBoYW5kbGUuCisvLyBOb3RlIFNSV0xvY2sncyBhcmUgdXNlZCBmb3IgU2JNdXRleCBiZWNhdXNlOgorLy8gLSBOb3JtYWwgV2luZG93cyBDcmVhdGVNdXRleCgpIG11dGV4ZXMgYXJlIHZlcnkgaGVhdnktd2VpZ2h0CisvLyAtIENyaXRpY2FsIHNlY3Rpb25zIGRvIG5vdCBoYXZlIGEgc3RhdGljIGluaXRpYWxpemVyCisvLyBOb3RlOiByZXBsaWNhIG9mIFJUTF9TUldMT0NLIGluIHVtL3dpbm50LmggdG8gYXZvaWQgaW5jbHVkZS4KK3R5cGVkZWYgc3RydWN0IFdpbmRvd3NTcndMb2NrIHsgdm9pZCogcHRyOyB9IFNiTXV0ZXg7CisKKy8vIE11dGV4IHN0YXRpYyBpbml0aWFsaXplci4KKy8vIE5vdGU6IHJlcGxpY2Egb2YgUlRMX1NSV0xPQ0tfSU5JVCBpbiB1bS93aW5udC5oIHRvIGF2b2lkIGluY2x1ZGUuCisjZGVmaW5lIFNCX01VVEVYX0lOSVRJQUxJWkVSIFwKKyAgeyAwIH0KKworLy8gLS0tIFNiT25jZSAtLS0KKworLy8gVHJhbnNwYXJlbnQgT25jZSBjb250cm9sIGhhbmRsZS4KK3R5cGVkZWYgdW5pb24gV2luZG93c1J1bk9uY2UgeyB2b2lkKiBwdHI7IH0gU2JPbmNlQ29udHJvbDsKKworLy8gT25jZSBzdGF0aWMgaW5pdGlhbGl6ZXIuCisvLyBOb3RlOiByZXBsaWNhIG9mIFJUTF9SVU5fT05DRV9JTklUIGluIHVtL3dpbm50LmggdG8gYXZvaWQgaW5jbHVkZS4KKyNkZWZpbmUgU0JfT05DRV9JTklUSUFMSVpFUiBcCisgIHsgMCB9CisKKy8vIC0tLSBTYlRocmVhZCAtLS0KKworLy8gVHJhbnNwYXJlbnQgcHRocmVhZCBoYW5kbGUuCit0eXBlZGVmIHZvaWQqIFNiVGhyZWFkOworCisvLyBXZWxsLWRlZmluZWQgY29uc3RhbnQgdmFsdWUgdG8gbWVhbiAibm8gdGhyZWFkIGhhbmRsZS4iCisjZGVmaW5lIGtTYlRocmVhZEludmFsaWQgKFNiVGhyZWFkKSBOVUxMCisKKyNlbmRpZiAgLy8gU1RBUkJPQVJEX1NIQVJFRF9XSU4zMl9USFJFQURfVFlQRVNfUFVCTElDX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jhc2UvbWF0aC5oIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvdGhyZWFkX3lpZWxkLmNjCnNpbWlsYXJpdHkgaW5kZXggNzclCmNvcHkgZnJvbSBzcmMvY29iYWx0L2Jhc2UvbWF0aC5oCmNvcHkgdG8gc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvdGhyZWFkX3lpZWxkLmNjCmluZGV4IDQ3MjNiZmIuLjI2ODc4NTIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmFzZS9tYXRoLmgKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvdGhyZWFkX3lpZWxkLmNjCkBAIC0xLDQgKzEsNCBAQAotLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAvLwogLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xMiw5ICsxMiwxMCBAQAogLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKLSNpZm5kZWYgQ09CQUxUX0JBU0VfTUFUSF9IXwotI2RlZmluZSBDT0JBTFRfQkFTRV9NQVRIX0hfCisjaW5jbHVkZSAic3RhcmJvYXJkL3RocmVhZC5oIgogCi0jaW5jbHVkZSA8Y21hdGg+CisjaW5jbHVkZSA8d2luZG93cy5oPgogCi0jZW5kaWYgIC8vIENPQkFMVF9CQVNFX01BVEhfSF8KK3ZvaWQgU2JUaHJlYWRZaWVsZCgpIHsKKyAgU2xlZXAoMCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfc3lzdGVtX21lZGlhX2NhcGFiaWxpdHkuaWRsIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvdGltZV9nZXRfbW9ub3RvbmljX25vdy5jYwpzaW1pbGFyaXR5IGluZGV4IDczJQpjb3B5IGZyb20gc3JjL2NvYmFsdC9kb20vbWVkaWFfa2V5X3N5c3RlbV9tZWRpYV9jYXBhYmlsaXR5LmlkbApjb3B5IHRvIHNyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3RpbWVfZ2V0X21vbm90b25pY19ub3cuY2MKaW5kZXggNTFlMWYyZS4uNTZhMTYyYSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vbWVkaWFfa2V5X3N5c3RlbV9tZWRpYV9jYXBhYmlsaXR5LmlkbAorKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aW1lX2dldF9tb25vdG9uaWNfbm93LmNjCkBAIC0xMiw5ICsxMiwxMyBAQAogLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKLS8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDE2L0NSLWVuY3J5cHRlZC1tZWRpYS0yMDE2MDcwNS8jbWVkaWFrZXlzeXN0ZW1tZWRpYWNhcGFiaWxpdHktZGljdGlvbmFyeQorI2luY2x1ZGUgInN0YXJib2FyZC90aW1lLmgiCiAKLWRpY3Rpb25hcnkgTWVkaWFLZXlTeXN0ZW1NZWRpYUNhcGFiaWxpdHkgewotICBET01TdHJpbmcgY29udGVudFR5cGUgPSAiIjsKLSAgRE9NU3RyaW5nIHJvYnVzdG5lc3MgPSAiIjsKLX07CisjaW5jbHVkZSA8d2luZG93cy5oPgorCitTYlRpbWVNb25vdG9uaWMgU2JUaW1lR2V0TW9ub3RvbmljTm93KCkgeworICBVTE9OR0xPTkcgcmVzdWx0OworICBRdWVyeVVuYmlhc2VkSW50ZXJydXB0VGltZVByZWNpc2UoJnJlc3VsdCk7CisKKyAgcmV0dXJuIHN0YXRpY19jYXN0PFNiVGltZU1vbm90b25pYz4ocmVzdWx0KSAvIDEwOworfQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vbWVkaWFfa2V5X3N5c3RlbV9tZWRpYV9jYXBhYmlsaXR5LmlkbCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3RpbWVfZ2V0X21vbm90b25pY190aHJlYWRfbm93LmNjCnNpbWlsYXJpdHkgaW5kZXggNzMlCmNvcHkgZnJvbSBzcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfc3lzdGVtX21lZGlhX2NhcGFiaWxpdHkuaWRsCmNvcHkgdG8gc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvdGltZV9nZXRfbW9ub3RvbmljX3RocmVhZF9ub3cuY2MKaW5kZXggNTFlMWYyZS4uZmZmNGJkOSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vbWVkaWFfa2V5X3N5c3RlbV9tZWRpYV9jYXBhYmlsaXR5LmlkbAorKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aW1lX2dldF9tb25vdG9uaWNfdGhyZWFkX25vdy5jYwpAQCAtMTIsOSArMTIsMTAgQEAKIC8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAxNi9DUi1lbmNyeXB0ZWQtbWVkaWEtMjAxNjA3MDUvI21lZGlha2V5c3lzdGVtbWVkaWFjYXBhYmlsaXR5LWRpY3Rpb25hcnkKKyNpbmNsdWRlICJzdGFyYm9hcmQvdGltZS5oIgogCi1kaWN0aW9uYXJ5IE1lZGlhS2V5U3lzdGVtTWVkaWFDYXBhYmlsaXR5IHsKLSAgRE9NU3RyaW5nIGNvbnRlbnRUeXBlID0gIiI7Ci0gIERPTVN0cmluZyByb2J1c3RuZXNzID0gIiI7Ci19OworU2JUaW1lTW9ub3RvbmljIFNiVGltZUdldE1vbm90b25pY1RocmVhZE5vdygpIHsKKyAgLy8gTmVpdGhlciBRdWVyeVRocmVhZEN5Y2xlVGltZSBub3IgR2V0VGhyZWFkVGltZXMgYXJlIGxpc3RlZCBhcyBiZWluZworICAvLyBhdmFpbGFibGUgaW4gVVdQLgorICByZXR1cm4gU2JUaW1lR2V0TW9ub3RvbmljTm93KCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfc3lzdGVtX21lZGlhX2NhcGFiaWxpdHkuaWRsIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvdGltZV9nZXRfbm93LmNjCnNpbWlsYXJpdHkgaW5kZXggNjAlCmNvcHkgZnJvbSBzcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfc3lzdGVtX21lZGlhX2NhcGFiaWxpdHkuaWRsCmNvcHkgdG8gc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvdGltZV9nZXRfbm93LmNjCmluZGV4IDUxZTFmMmUuLmVhYTFmYmMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9zeXN0ZW1fbWVkaWFfY2FwYWJpbGl0eS5pZGwKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvdGltZV9nZXRfbm93LmNjCkBAIC0xMiw5ICsxMiwxOSBAQAogLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKLS8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDE2L0NSLWVuY3J5cHRlZC1tZWRpYS0yMDE2MDcwNS8jbWVkaWFrZXlzeXN0ZW1tZWRpYWNhcGFiaWxpdHktZGljdGlvbmFyeQorI2luY2x1ZGUgInN0YXJib2FyZC90aW1lLmgiCiAKLWRpY3Rpb25hcnkgTWVkaWFLZXlTeXN0ZW1NZWRpYUNhcGFiaWxpdHkgewotICBET01TdHJpbmcgY29udGVudFR5cGUgPSAiIjsKLSAgRE9NU3RyaW5nIHJvYnVzdG5lc3MgPSAiIjsKLX07CisjaW5jbHVkZSA8d2luZG93cy5oPgorCitTYlRpbWUgU2JUaW1lR2V0Tm93KCkgeworICBTWVNURU1USU1FIHN5c3RlbV90aW1lOworICBHZXRTeXN0ZW1UaW1lKCZzeXN0ZW1fdGltZSk7CisKKyAgRklMRVRJTUUgZmlsZV90aW1lOworICBTeXN0ZW1UaW1lVG9GaWxlVGltZSgmc3lzdGVtX3RpbWUsICZmaWxlX3RpbWUpOworCisgIFVMQVJHRV9JTlRFR0VSIGxhcmdlX2ludDsKKyAgbGFyZ2VfaW50Lkxvd1BhcnQgPSBmaWxlX3RpbWUuZHdMb3dEYXRlVGltZTsKKyAgbGFyZ2VfaW50LkhpZ2hQYXJ0ID0gZmlsZV90aW1lLmR3SGlnaERhdGVUaW1lOworICByZXR1cm4gc3RhdGljX2Nhc3Q8U2JUaW1lPihsYXJnZV9pbnQuUXVhZFBhcnQpIC8gMTA7Cit9CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aW1lX3V0aWxzLmggYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aW1lX3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FkMTM2OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3RpbWVfdXRpbHMuaApAQCAtMCwwICsxLDY0IEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaWZuZGVmIFNUQVJCT0FSRF9TSEFSRURfV0lOMzJfVElNRV9VVElMU19IXworI2RlZmluZSBTVEFSQk9BUkRfU0hBUkVEX1dJTjMyX1RJTUVfVVRJTFNfSF8KKworI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKKworbmFtZXNwYWNlIHN0YXJib2FyZCB7CituYW1lc3BhY2Ugc2hhcmVkIHsKK25hbWVzcGFjZSB3aW4zMiB7CisKK2lubGluZSBTYlRpbWUgQ29udmVydEZpbGVUaW1lVGlja3NUb1NiVGltZShjb25zdCBMQVJHRV9JTlRFR0VSIHRpY2tzKSB7CisgIC8vIEFjY29yZGluZyB0bworICAvLyBodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L3dpbmRvd3MvZGVza3RvcC9tczcyNDI4NCh2PXZzLjg1KS5hc3B4CisgIC8vIEZJTEVUSU1FIGZvcm1hdCBpcyAiQ29udGFpbnMgYSA2NC1iaXQgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBudW1iZXIgb2YKKyAgLy8gMTAwLW5hbm9zZWNvbmQgaW50ZXJ2YWxzIHNpbmNlIEphbnVhcnkgMSwgMTYwMSAoVVRDKSIKKyAgY29uc3QgdWludDY0X3Qga051bWJlcjEwMG5hbm9zZWNvbmRUaWNrc0luTWljcm9zZWNvbmQgPSAxMDsKKyAgcmV0dXJuIHRpY2tzLlF1YWRQYXJ0IC8ga051bWJlcjEwMG5hbm9zZWNvbmRUaWNrc0luTWljcm9zZWNvbmQ7Cit9CisKK2lubGluZSBTYlRpbWUgQ29udmVydEZpbGVUaW1lVG9TYlRpbWUoY29uc3QgRklMRVRJTUUgZmlsZV90aW1lKSB7CisgIC8vIEFjY29yZGluZyB0bworICAvLyBodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L3dpbmRvd3MvZGVza3RvcC9tczcyNDI4NCh2PXZzLjg1KS5hc3B4CisgIC8vIEZJTEVUSU1FIGZvcm1hdCBpcyAiQ29udGFpbnMgYSA2NC1iaXQgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBudW1iZXIgb2YKKyAgLy8gMTAwLW5hbm9zZWNvbmQgaW50ZXJ2YWxzIHNpbmNlIEphbnVhcnkgMSwgMTYwMSAoVVRDKSIKKyAgTEFSR0VfSU5URUdFUiB0aWNrczsKKyAgdGlja3MuUXVhZFBhcnQgPSAoc3RhdGljX2Nhc3Q8TE9OR0xPTkc+KGZpbGVfdGltZS5kd0hpZ2hEYXRlVGltZSkgPDwgMzIpIHwKKyAgICAgICAgICAgICAgICAgICBmaWxlX3RpbWUuZHdMb3dEYXRlVGltZTsKKyAgcmV0dXJuIENvbnZlcnRGaWxlVGltZVRpY2tzVG9TYlRpbWUodGlja3MpOworfQorCitpbmxpbmUgU2JUaW1lIENvbnZlcnRTeXN0ZW1UaW1lVG9TYlRpbWUoY29uc3QgU1lTVEVNVElNRSBzeXN0ZW1fdGltZSkgeworICBGSUxFVElNRSBmaWxlX3RpbWUgPSB7MH07CisgIFN5c3RlbVRpbWVUb0ZpbGVUaW1lKCZzeXN0ZW1fdGltZSwgJmZpbGVfdGltZSk7CisgIHJldHVybiBDb252ZXJ0RmlsZVRpbWVUb1NiVGltZShmaWxlX3RpbWUpOworfQorCisvLyBNYW55IFdpbjMyIGNhbGxzIHRha2UgbWlsbGlzLCBidXQgU2JUaW1lIGlzIG1pY3Jvc2Vjb25kcy4KKy8vIE1hbnkgbnBsYiB0ZXN0cyBhc3N1bWUgd2FpdHMgYXJlIGF0IGxlYXN0IGFzIGxvbmcgYXMgcmVxdWVzdGVkLCBzbworLy8gcm91bmQgdXAuCitpbmxpbmUgRFdPUkQgQ29udmVydFNiVGltZVRvTWlsbGlzUm91bmRVcChTYlRpbWUgZHVyYXRpb24pIHsKKyAgY29uc3QgaW50NjRfdCBtaWxsaXNlY29uZHNfdG9fc2xlZXAgPQorICAgICAgKGR1cmF0aW9uICsga1NiVGltZU1pbGxpc2Vjb25kIC0gMSkgLyBrU2JUaW1lTWlsbGlzZWNvbmQ7CisgIFNCX0RDSEVDSyhtaWxsaXNlY29uZHNfdG9fc2xlZXAgPD0ga1NiSW50MzJNYXgpOworICByZXR1cm4gc3RhdGljX2Nhc3Q8RFdPUkQ+KG1pbGxpc2Vjb25kc190b19zbGVlcCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB3aW4zMgorfSAgLy8gbmFtZXNwYWNlIHNoYXJlZAorfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZAorCisjZW5kaWYgIC8vIFNUQVJCT0FSRF9TSEFSRURfV0lOMzJfVElNRV9VVElMU19IXwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvdGltZV96b25lX2dldF9jdXJyZW50LmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvdGltZV96b25lX2dldF9jdXJyZW50LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNDAwNTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aW1lX3pvbmVfZ2V0X2N1cnJlbnQuY2MKQEAgLTAsMCArMSwzNiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgInN0YXJib2FyZC90aW1lX3pvbmUuaCIKKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKK1NiVGltZVpvbmUgU2JUaW1lWm9uZUdldEN1cnJlbnQoKSB7CisgIERZTkFNSUNfVElNRV9aT05FX0lORk9STUFUSU9OIHRpbWVfem9uZV9pbmZvOworCisgIERXT1JEIHpvbmVfaWQgPSBHZXREeW5hbWljVGltZVpvbmVJbmZvcm1hdGlvbigmdGltZV96b25lX2luZm8pOworCisgIHN3aXRjaCAoem9uZV9pZCkgeworICBjYXNlIFRJTUVfWk9ORV9JRF9VTktOT1dOOgorICAgIHJldHVybiB0aW1lX3pvbmVfaW5mby5CaWFzOworICBjYXNlIFRJTUVfWk9ORV9JRF9TVEFOREFSRDoKKyAgICByZXR1cm4gdGltZV96b25lX2luZm8uU3RhbmRhcmRCaWFzOworICBjYXNlIFRJTUVfWk9ORV9JRF9EQVlMSUdIVDoKKyAgICByZXR1cm4gdGltZV96b25lX2luZm8uRGF5bGlnaHRCaWFzOworICBkZWZhdWx0OgorICAgIFNCX05PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gMDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvd2NoYXJfdXRpbHMuaCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3djaGFyX3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ4YjAyNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3djaGFyX3V0aWxzLmgKQEAgLTAsMCArMSw0NyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2lmbmRlZiBTVEFSQk9BUkRfV0lOMzJfV0NIQVJfVVRJTFNfSF8KKyNkZWZpbmUgU1RBUkJPQVJEX1dJTjMyX1dDSEFSX1VUSUxTX0hfCisKKyNpbmNsdWRlIDxjb2RlY3Z0PgorI2luY2x1ZGUgPGN3Y2hhcj4KKyNpbmNsdWRlIDxsb2NhbGU+CisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2Ugc3RhcmJvYXJkIHsKK25hbWVzcGFjZSBzaGFyZWQgeworbmFtZXNwYWNlIHdpbjMyIHsKKworaW5saW5lIHN0ZDo6c3RyaW5nIHdjaGFyX3RUb1VURjgoY29uc3Qgd2NoYXJfdCogY29uc3Qgc3RyKSB7CisgIHN0ZDo6d3N0cmluZ19jb252ZXJ0PHN0ZDo6Y29kZWN2dF91dGY4PHdjaGFyX3Q+LCB3Y2hhcl90PiBjb252ZXJ0ZXI7CisgIHJldHVybiBjb252ZXJ0ZXIudG9fYnl0ZXMoc3RyKTsKK30KKworaW5saW5lIHN0ZDo6c3RyaW5nIHdjaGFyX3RUb1VURjgoY29uc3Qgd2NoYXJfdCogY29uc3Qgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaXplX3Qgc2l6ZSkgeworICBzdGQ6OndzdHJpbmdfY29udmVydDxzdGQ6OmNvZGVjdnRfdXRmODx3Y2hhcl90Piwgd2NoYXJfdD4gY29udmVydGVyOworICByZXR1cm4gY29udmVydGVyLnRvX2J5dGVzKHN0ciwgc3RyICsgc2l6ZSk7Cit9CisKK2lubGluZSBzdGQ6OndzdHJpbmcgQ1N0cmluZ1RvV1N0cmluZyhjb25zdCBjaGFyKiBzdHIpIHsKKyAgc3RkOjp3c3RyaW5nX2NvbnZlcnQ8c3RkOjpjb2RlY3Z0X3V0Zjg8d2NoYXJfdD4sIHdjaGFyX3Q+IGNvbnZlcnRlcjsKKyAgcmV0dXJuIGNvbnZlcnRlci5mcm9tX2J5dGVzKHN0cik7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB3aW4zMgorfSAgLy8gbmFtZXNwYWNlIHNoYXJlZAorfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZAorCisjZW5kaWYgIC8vIFNUQVJCT0FSRF9XSU4zMl9XQ0hBUl9VVElMU19IXwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zdHViL2d5cF9jb25maWd1cmF0aW9uLmd5cGkgYi9zcmMvc3RhcmJvYXJkL3N0dWIvZ3lwX2NvbmZpZ3VyYXRpb24uZ3lwaQppbmRleCAzYTYyYWQ3Li4xMGU0YzE2IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3N0dWIvZ3lwX2NvbmZpZ3VyYXRpb24uZ3lwaQorKysgYi9zcmMvc3RhcmJvYXJkL3N0dWIvZ3lwX2NvbmZpZ3VyYXRpb24uZ3lwaQpAQCAtMjQsNyArMjQsOSBAQAogCiAgICAgIyBUaGlzIHNob3VsZCBoYXZlIGEgZGVmYXVsdCB2YWx1ZSBpbiBjb2JhbHQvYmFzZS5neXBpLiBTZWUgdGhlIGNvbW1lbnQKICAgICAjIHRoZXJlIGZvciBhY2NlcHRhYmxlIHZhbHVlcyBmb3IgdGhpcyB2YXJpYWJsZS4KLSAgICAnamF2YXNjcmlwdF9lbmdpbmUnOiAnbW96anMnLAorICAgICdqYXZhc2NyaXB0X2VuZ2luZSc6ICdtb3pqcy00NScsCisKKyAgICAnY29iYWx0X2VuYWJsZV9qaXQnOiAwLAogCiAgICAgJ2NvYmFsdF9tZWRpYV9zb3VyY2VfMjAxNic6IDEsCiAKQEAgLTg3LDYgKzg5LDkgQEAKICAgICAgICAgICAnLVduby11bm5hbWVkLXR5cGUtdGVtcGxhdGUtYXJncycsCiAgICAgICAgICAgIyBUcmlnZ2VyZWQgYnkgdGhlIENPTVBJTEVfQVNTRVJUIG1hY3JvLgogICAgICAgICAgICctV25vLXVudXNlZC1sb2NhbC10eXBlZGVmJywKKyAgICAgICAgICAjIERvIG5vdCB3YXJuIGlmIGEgZnVuY3Rpb24gb3IgdmFyaWFibGUgY2Fubm90IGJlIGltcGxpY2l0bHkKKyAgICAgICAgICAjIGluc3RhbnRpYXRlZC4KKyAgICAgICAgICAnLVduby11bmRlZmluZWQtdmFyLXRlbXBsYXRlJywKICAgICAgICAgXSwKICAgICAgIH1dLAogICAgICAgWydjb2JhbHRfZmFzdGJ1aWxkPT0wJywgewpAQCAtMTE4LDExICsxMjMsNyBAQAogICAgICAgIyctc3RkPWM5OScsCiAgICAgXSwKICAgICAnY2ZsYWdzX2NjJzogWwotICAgICAgIyBMaW1pdCB0byBnbnUrKzk4LiBUaGlzIGFsbG93cyBzdHViIHRvIGJlIGEgY2FuYXJ5IGJ1aWxkIGZvciBhbnkKLSAgICAgICMgQysrMTEgZmVhdHVyZXMgdGhhdCBhcmUgbm90IHN1cHBvcnRlZCBvbiBzb21lIHBsYXRmb3JtcycgY29tcGlsZXJzLgotICAgICAgIyBXZSBkbyBhbGxvdyBvdXJzZWx2ZXMgR05VIGV4dGVuc2lvbnMsIHdoaWNoIGFyZSBhc3N1bWVkIHRvIGV4aXN0Ci0gICAgICAjIGJ5IENocm9taXVtIGNvZGUuCi0gICAgICAjJy1zdGQ9Z251Kys5OCcsCisgICAgICAnLXN0ZD1nbnUrKzExJywKICAgICBdLAogICAgICdkZWZhdWx0X2NvbmZpZ3VyYXRpb24nOiAnc3R1Yl9kZWJ1ZycsCiAgICAgJ2NvbmZpZ3VyYXRpb25zJzogewpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC90b29scy9yYXNwaS9ydW5fdGVzdC5weSBiL3NyYy9zdGFyYm9hcmQvdG9vbHMvcmFzcGkvcnVuX3Rlc3QucHkKaW5kZXggNTExOWMzYS4uYjgzNzMwNyAxMDA3NTUKLS0tIGEvc3JjL3N0YXJib2FyZC90b29scy9yYXNwaS9ydW5fdGVzdC5weQorKysgYi9zcmMvc3RhcmJvYXJkL3Rvb2xzL3Jhc3BpL3J1bl90ZXN0LnB5CkBAIC0yMSw5ICsyMSwxMSBAQAogaW1wb3J0IGZ1bmN0b29scwogaW1wb3J0IGxvZ2dpbmcKIGltcG9ydCBvcworaW1wb3J0IHJlCiBpbXBvcnQgc2lnbmFsCiBpbXBvcnQgc3lzCiBpbXBvcnQgdGV4dHdyYXAKK2ltcG9ydCB0aW1lCiAKIGltcG9ydCBwZXhwZWN0CiAKQEAgLTY4LDYgKzcwLDkgQEAKICAgaWYgbm90IG9zLnBhdGguaXNmaWxlKHRlc3RfcGF0aCk6CiAgICAgcmFpc2UgVmFsdWVFcnJvcigndGVzdF9wYXRoICh7fSkgbXVzdCBiZSBhIGZpbGUuJy5mb3JtYXQodGVzdF9wYXRoKSkKIAorICAjIFRoaXMgaXMgdXNlZCB0byBzdHJpcCBhbnNpIGNvbG9yIGNvZGVzIGZyb20gb3V0cHV0LgorICBzYW5pdGl6ZV9saW5lX3JlID0gcmUuY29tcGlsZShyJ1x4MWJbXm1dKm0nKQorCiAgIHN5cy5zdGRvdXQud3JpdGUoJ1Byb2Nlc3MgbGF1bmNoZWQsIElEPXt9XG4nLmZvcm1hdChvcy5nZXRwaWQoKSkpCiAgIHN5cy5zdGRvdXQuZmx1c2goKQogCkBAIC04MSwxOSArODYsMTkgQEAKICAgb3B0aW9ucyA9ICctYXZ6aCAtLWV4Y2x1ZGUgb2JqKicKICAgc291cmNlID0gdGVzdF9kaXJfcGF0aAogICBkZXN0aW5hdGlvbiA9IHJhc3BpX3VzZXJfaG9zdG5hbWUgKyAnOn4vJwotICBjb21tYW5kID0gJ3JzeW5jICcgKyBvcHRpb25zICsgJyAnICsgc291cmNlICsgJyAnICsgZGVzdGluYXRpb24KLSAgcHJvY2VzcyA9IHBleHBlY3Quc3Bhd24oY29tbWFuZCwgdGltZW91dD0xMjApCisgIHJzeW5jX2NvbW1hbmQgPSAncnN5bmMgJyArIG9wdGlvbnMgKyAnICcgKyBzb3VyY2UgKyAnICcgKyBkZXN0aW5hdGlvbgorICByc3luY19wcm9jZXNzID0gcGV4cGVjdC5zcGF3bihyc3luY19jb21tYW5kLCB0aW1lb3V0PTEyMCkKIAogICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdJTlQsCi0gICAgICAgICAgICAgICAgZnVuY3Rvb2xzLnBhcnRpYWwoX1NpZ0ludE9yU2lnVGVybUhhbmRsZXIsIHByb2Nlc3MpKQorICAgICAgICAgICAgICAgIGZ1bmN0b29scy5wYXJ0aWFsKF9TaWdJbnRPclNpZ1Rlcm1IYW5kbGVyLCByc3luY19wcm9jZXNzKSkKICAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHVEVSTSwKLSAgICAgICAgICAgICAgICBmdW5jdG9vbHMucGFydGlhbChfU2lnSW50T3JTaWdUZXJtSGFuZGxlciwgcHJvY2VzcykpCisgICAgICAgICAgICAgICAgZnVuY3Rvb2xzLnBhcnRpYWwoX1NpZ0ludE9yU2lnVGVybUhhbmRsZXIsIHJzeW5jX3Byb2Nlc3MpKQogCi0gIHByb2Nlc3MuZXhwZWN0KHInXFMrIHBhc3N3b3JkOicpCi0gIHByb2Nlc3Muc2VuZGxpbmUoX1JBU1BJX1BBU1NXT1JEKQorICByc3luY19wcm9jZXNzLmV4cGVjdChyJ1xTKyBwYXNzd29yZDonKQorICByc3luY19wcm9jZXNzLnNlbmRsaW5lKF9SQVNQSV9QQVNTV09SRCkKIAogICB3aGlsZSBUcnVlOgotICAgIGxpbmUgPSBwcm9jZXNzLnJlYWRsaW5lKCkKKyAgICBsaW5lID0gc2FuaXRpemVfbGluZV9yZS5zdWIoJycsIHJzeW5jX3Byb2Nlc3MucmVhZGxpbmUoKSkKICAgICBpZiBsaW5lOgogICAgICAgc3lzLnN0ZG91dC53cml0ZShsaW5lKQogICAgICAgc3lzLnN0ZG91dC5mbHVzaCgpCkBAIC0xMDEsMjEgKzEwNiwyNCBAQAogICAgICAgYnJlYWsKIAogICAjIHNzaCBpbnRvIHRoZSByYXNwaSBhbmQgcnVuIHRoZSB0ZXN0Ci0gIGNvbW1hbmQgPSAnc3NoICcgKyByYXNwaV91c2VyX2hvc3RuYW1lCi0gIHByb2Nlc3MgPSBwZXhwZWN0LnNwYXduKGNvbW1hbmQsIHRpbWVvdXQ9MTIwKQorICBzc2hfY29tbWFuZCA9ICdzc2ggJyArIHJhc3BpX3VzZXJfaG9zdG5hbWUKKyAgc3NoX3Byb2Nlc3MgPSBwZXhwZWN0LnNwYXduKHNzaF9jb21tYW5kLCB0aW1lb3V0PTEyMCkKIAogICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdJTlQsCi0gICAgICAgICAgICAgICAgZnVuY3Rvb2xzLnBhcnRpYWwoX1NpZ0ludE9yU2lnVGVybUhhbmRsZXIsIHByb2Nlc3MpKQorICAgICAgICAgICAgICAgIGZ1bmN0b29scy5wYXJ0aWFsKF9TaWdJbnRPclNpZ1Rlcm1IYW5kbGVyLCBzc2hfcHJvY2VzcykpCiAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR1RFUk0sCi0gICAgICAgICAgICAgICAgZnVuY3Rvb2xzLnBhcnRpYWwoX1NpZ0ludE9yU2lnVGVybUhhbmRsZXIsIHByb2Nlc3MpKQorICAgICAgICAgICAgICAgIGZ1bmN0b29scy5wYXJ0aWFsKF9TaWdJbnRPclNpZ1Rlcm1IYW5kbGVyLCBzc2hfcHJvY2VzcykpCiAKLSAgcHJvY2Vzcy5leHBlY3QocidcUysgcGFzc3dvcmQ6JykKLSAgcHJvY2Vzcy5zZW5kbGluZShfUkFTUElfUEFTU1dPUkQpCi0gIHByb2Nlc3Muc2VuZGxpbmUocmFzcGlfdGVzdF9wYXRoICsgJyAnICsgZmxhZ3MpCisgIHNzaF9wcm9jZXNzLmV4cGVjdChyJ1xTKyBwYXNzd29yZDonKQorICBzc2hfcHJvY2Vzcy5zZW5kbGluZShfUkFTUElfUEFTU1dPUkQpCisKKyAgdGVzdF9jb21tYW5kID0gcmFzcGlfdGVzdF9wYXRoICsgJyAnICsgZmxhZ3MKKyAgdGVzdF9lbmRfdGFnID0gJ0VORF9URVNULXt0aW1lfScuZm9ybWF0KHRpbWU9dGltZS50aW1lKCkpCisgIHNzaF9wcm9jZXNzLnNlbmRsaW5lKHRlc3RfY29tbWFuZCArICc7IGVjaG8gJyArIHRlc3RfZW5kX3RhZykKIAogICB3aGlsZSBUcnVlOgotICAgIGxpbmUgPSBwcm9jZXNzLnJlYWRsaW5lKCkKLSAgICBpZiBsaW5lOgorICAgIGxpbmUgPSBzYW5pdGl6ZV9saW5lX3JlLnN1YignJywgc3NoX3Byb2Nlc3MucmVhZGxpbmUoKSkKKyAgICBpZiBsaW5lIGFuZCBub3QgbGluZS5zdGFydHN3aXRoKHRlc3RfZW5kX3RhZyk6CiAgICAgICBzeXMuc3Rkb3V0LndyaXRlKGxpbmUpCiAgICAgICBzeXMuc3Rkb3V0LmZsdXNoKCkKICAgICBlbHNlOgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qcy5tc2cgYi9zcmMvdGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzLm1zZwppbmRleCA5MDhhMTg4Li4xNDgzNGVjIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzLm1zZworKysgYi9zcmMvdGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzLm1zZwpAQCAtMTQ5LDggKzE0OSwxMyBAQAogTVNHX0RFRihKU01TR19UT09fTUFOWV9GVU5fQVBQTFlfQVJHUywgMCwgSlNFWE5fUkFOR0VFUlIsICJhcmd1bWVudHMgYXJyYXkgcGFzc2VkIHRvIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseSBpcyB0b28gbGFyZ2UiKQogCiAvLyBDU1AKKyNpZiBkZWZpbmVkKENPQkFMVCkKK01TR19ERUYoSlNNU0dfQ1NQX0JMT0NLRURfRVZBTCwgICAgICAgIDAsIEpTRVhOX0VWQUxFUlIsICJjYWxsIHRvIGV2YWwoKSBibG9ja2VkIGJ5IENTUCIpCitNU0dfREVGKEpTTVNHX0NTUF9CTE9DS0VEX0ZVTkNUSU9OLCAgICAwLCBKU0VYTl9FVkFMRVJSLCAiY2FsbCB0byBGdW5jdGlvbigpIGJsb2NrZWQgYnkgQ1NQIikKKyNlbHNlCiBNU0dfREVGKEpTTVNHX0NTUF9CTE9DS0VEX0VWQUwsICAgICAgICAwLCBKU0VYTl9FUlIsICJjYWxsIHRvIGV2YWwoKSBibG9ja2VkIGJ5IENTUCIpCiBNU0dfREVGKEpTTVNHX0NTUF9CTE9DS0VEX0ZVTkNUSU9OLCAgICAwLCBKU0VYTl9FUlIsICJjYWxsIHRvIEZ1bmN0aW9uKCkgYmxvY2tlZCBieSBDU1AiKQorI2VuZGlmCiAKIC8vIFdyYXBwZXJzCiBNU0dfREVGKEpTTVNHX0FDQ0VTU09SX0RFRl9ERU5JRUQsICAgICAxLCBKU0VYTl9FUlIsICJQZXJtaXNzaW9uIGRlbmllZCB0byBkZWZpbmUgYWNjZXNzb3IgcHJvcGVydHkgezB9IikKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL1JFQURNRS5jaHJvbWl1bSBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL1JFQURNRS5jaHJvbWl1bQppbmRleCA2Yzg4ODliLi5kNDk3OTZhIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9SRUFETUUuY2hyb21pdW0KKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvUkVBRE1FLmNocm9taXVtCkBAIC0xLDYgKzEsNiBAQAogTmFtZTogb3BlbnNzbAogVVJMOiBodHRwOi8vb3BlbnNzbC5vcmcvc291cmNlLwotVmVyc2lvbjogMS4wLjFwCitWZXJzaW9uOiAxLjAuMXIKIExpY2Vuc2U6IEJTRGlzaAogTGljZW5zZSBGaWxlOiBvcGVuc3NsL0xJQ0VOU0UKIExpY2Vuc2UgQW5kcm9pZCBDb21wYXRpYmxlOiB5ZXMKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvLnRyYXZpcy1jcmVhdGUtcmVsZWFzZS5zaCBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvLnRyYXZpcy1jcmVhdGUtcmVsZWFzZS5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDA0ZmMxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC8udHJhdmlzLWNyZWF0ZS1yZWxlYXNlLnNoCkBAIC0wLDAgKzEsMTAgQEAKKyMhIC9iaW4vc2gKKworIyAkMSBpcyBleHBlY3RlZCB0byBiZSAkVFJBVklTX09TX05BTUUKKworaWYgWyAiJDEiID09IG9zeCBdOyB0aGVuCisgICAgbWFrZSAtZiBNYWtlZmlsZS5vcmcgXAorCSBESVNUVEFSVkFSUz0iTkFNRT1fc3JjZGlzdCBUQVJfQ09NTUFORD0nXCRcJChUQVIpIFwkXCQoVEFSRkxBR1MpIC1zIFwifF58XCRcJChOQU1FKS98XCIgLVQgXCRcJChUQVJGSUxFKS5saXN0IC1jdmYgLScgVEFSRkxBR1M9Jy1uJyBUQVJGSUxFPV9zcmNkaXN0LnRhciIgU0hFTEw9J3NoIC12eCcgZGlzdAorZWxzZQorICAgIG1ha2UgLWYgTWFrZWZpbGUub3JnIERJU1RUQVJWQVJTPSdUQVJGSUxFPV9zcmNkaXN0LnRhciBOQU1FPV9zcmNkaXN0JyBTSEVMTD0nc2ggLXYnIGRpc3QKK2ZpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsLy50cmF2aXMueW1sIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC8udHJhdmlzLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDA1OTA5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC8udHJhdmlzLnltbApAQCAtMCwwICsxLDYwIEBACitsYW5ndWFnZTogYworCithZGRvbnM6CisgICAgYXB0X3BhY2thZ2VzOgorICAgICAgICAtIGJpbnV0aWxzLW1pbmd3LXc2NAorICAgICAgICAtIGdjYy1taW5ndy13NjQKKworb3M6CisgICAgLSBsaW51eAorICAgIC0gb3N4CisKK2NvbXBpbGVyOgorICAgIC0gY2xhbmcKKyAgICAtIGdjYworICAgIC0gaTY4Ni13NjQtbWluZ3czMi1nY2MKKyAgICAtIHg4Nl82NC13NjQtbWluZ3czMi1nY2MKKworZW52OgorICAgIC0gQ09ORklHX09QVFM9IiIKKyAgICAtIENPTkZJR19PUFRTPSJzaGFyZWQiCisgICAgLSBDT05GSUdfT1BUUz0iLWQgLS1zdHJpY3Qtd2FybmluZ3MiCisKK21hdHJpeDoKKyAgICBleGNsdWRlOgorICAgICAgICAtIG9zOiBvc3gKKyAgICAgICAgICBjb21waWxlcjogaTY4Ni13NjQtbWluZ3czMi1nY2MKKyAgICAgICAgLSBvczogb3N4CisgICAgICAgICAgY29tcGlsZXI6IHg4Nl82NC13NjQtbWluZ3czMi1nY2MKKyAgICAgICAgLSBjb21waWxlcjogaTY4Ni13NjQtbWluZ3czMi1nY2MKKyAgICAgICAgICBlbnY6IENPTkZJR19PUFRTPSItZCAtLXN0cmljdC13YXJuaW5ncyIKKyAgICAgICAgLSBjb21waWxlcjogeDg2XzY0LXc2NC1taW5ndzMyLWdjYworICAgICAgICAgIGVudjogQ09ORklHX09QVFM9Ii1kIC0tc3RyaWN0LXdhcm5pbmdzIgorCitiZWZvcmVfc2NyaXB0OgorICAgIC0gc2ggLnRyYXZpcy1jcmVhdGUtcmVsZWFzZS5zaCAkVFJBVklTX09TX05BTUUKKyAgICAtIHRhciAteHZ6ZiBfc3JjZGlzdC50YXIuZ3oKKyAgICAtIGNkIF9zcmNkaXN0CisgICAgLSBpZiBbICIkQ0MiID09IGk2ODYtdzY0LW1pbmd3MzItZ2NjIF07IHRoZW4KKyAgICAgICAgICBleHBvcnQgQ1JPU1NfQ09NUElMRT0ke0NDJSVnY2N9OyB1bnNldCBDQzsKKyAgICAgICAgICAuL0NvbmZpZ3VyZSBtaW5ndyAkQ09ORklHX09QVFM7CisgICAgICBlbGlmIFsgIiRDQyIgPT0geDg2XzY0LXc2NC1taW5ndzMyLWdjYyBdOyB0aGVuCisgICAgICAgICAgZXhwb3J0IENST1NTX0NPTVBJTEU9JHtDQyUlZ2NjfTsgdW5zZXQgQ0M7CisgICAgICAgICAgLi9Db25maWd1cmUgbWluZ3c2NCAkQ09ORklHX09QVFM7CisgICAgICBlbHNlCisgICAgICAgICAgLi9jb25maWcgJENPTkZJR19PUFRTOworICAgICAgZmkKKyAgICAtIGNkIC4uCisKK3NjcmlwdDoKKyAgICAtIGNkIF9zcmNkaXN0CisgICAgLSBtYWtlCisgICAgLSBpZiBbIC16ICIkQ1JPU1NfQ09NUElMRSIgXTsgdGhlbiBtYWtlIHRlc3Q7IGZpCisgICAgLSBjZCAuLgorCitub3RpZmljYXRpb25zOgorICAgIHJlY2lwaWVudDoKKyAgICAgICAgLSBvcGVuc3NsLWNvbW1pdHNAb3BlbnNzbC5vcmcKKyAgICBlbWFpbDoKKyAgICAgICAgb25fc3VjY2VzczogY2hhbmdlCisgICAgICAgIG9uX2ZhaWx1cmU6IGFsd2F5cwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9BQ0tOT1dMRURHTUVOVFMgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL0FDS05PV0xFREdNRU5UUwppbmRleCA1OWM2ZjAxLi5kMjFkY2NiIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL0FDS05PV0xFREdNRU5UUworKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL0FDS05PV0xFREdNRU5UUwpAQCAtMSwzMCArMSwyIEBACi1UaGUgT3BlblNTTCBwcm9qZWN0IGRlcGVuZHMgb24gdm9sdW50ZWVyIGVmZm9ydHMgYW5kIGZpbmFuY2lhbCBzdXBwb3J0IGZyb20KLXRoZSBlbmQgdXNlciBjb21tdW5pdHkuIFRoYXQgc3VwcG9ydCBjb21lcyBpbiB0aGUgZm9ybSBvZiBkb25hdGlvbnMgYW5kIHBhaWQKLXNwb25zb3JzaGlwcywgc29mdHdhcmUgc3VwcG9ydCBjb250cmFjdHMsIHBhaWQgY29uc3VsdGluZyBzZXJ2aWNlcwotYW5kIGNvbW1pc3Npb25lZCBzb2Z0d2FyZSBkZXZlbG9wbWVudC4KLQotU2luY2UgYWxsIHRoZXNlIGFjdGl2aXRpZXMgc3VwcG9ydCB0aGUgY29udGludWVkIGRldmVsb3BtZW50IGFuZCBpbXByb3ZlbWVudAotb2YgT3BlblNTTCB3ZSBjb25zaWRlciBhbGwgdGhlc2UgY2xpZW50cyBhbmQgY3VzdG9tZXJzIGFzIHNwb25zb3JzIG9mIHRoZQotT3BlblNTTCBwcm9qZWN0LgotCi1XZSB3b3VsZCBsaWtlIHRvIGlkZW50aWZ5IGFuZCB0aGFuayB0aGUgZm9sbG93aW5nIHN1Y2ggc3BvbnNvcnMgZm9yIHRoZWlyIHBhc3QKLW9yIGN1cnJlbnQgc2lnbmlmaWNhbnQgc3VwcG9ydCBvZiB0aGUgT3BlblNTTCBwcm9qZWN0OgotCi1NYWpvciBzdXBwb3J0OgotCi0JUXVhbHlzCQlodHRwOi8vd3d3LnF1YWx5cy5jb20vCi0KLVZlcnkgc2lnbmlmaWNhbnQgc3VwcG9ydDoKLQotCU9wZW5HZWFyOglodHRwOi8vd3d3Lm9wZW5nZWFyLmNvbS8KLQotU2lnbmlmaWNhbnQgc3VwcG9ydDoKLQotCVBTVyBHcm91cDoJaHR0cDovL3d3dy5wc3cubmV0LwotCUFjYW5vIEx0ZC4JaHR0cDovL2FjYW5vLmNvbS8KLQotUGxlYXNlIG5vdGUgdGhhdCB3ZSBhc2sgcGVybWlzc2lvbiB0byBpZGVudGlmeSBzcG9uc29ycyBhbmQgdGhhdCBzb21lIHNwb25zb3JzCi13ZSBjb25zaWRlciBlbGlnaWJsZSBmb3IgaW5jbHVzaW9uIGhlcmUgaGF2ZSByZXF1ZXN0ZWQgdG8gcmVtYWluIGFub255bW91cy4KLQotQWRkaXRpb25hbCBzcG9uc29yc2hpcCBvciBmaW5hbmNpYWwgc3VwcG9ydCBpcyBhbHdheXMgd2VsY29tZTogZm9yIG1vcmUKLWluZm9ybWF0aW9uIHBsZWFzZSBjb250YWN0IHRoZSBPcGVuU1NMIFNvZnR3YXJlIEZvdW5kYXRpb24uCitQbGVhc2UgaHR0cHM6Ly93d3cub3BlbnNzbC5vcmcvY29tbXVuaXR5L3RoYW5rcy5odG1sIGZvciB0aGUgY3VycmVudAorYWNrbm93bGVkZ2VtZW50cy4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvQ0hBTkdFUyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvQ0hBTkdFUwppbmRleCAyZTg4OGY3Li5iODRmZjk0IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL0NIQU5HRVMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9DSEFOR0VTCkBAIC0yLDYgKzIsNjkgQEAKICBPcGVuU1NMIENIQU5HRVMKICBfX19fX19fX19fX19fX18KIAorIENoYW5nZXMgYmV0d2VlbiAxLjAuMXEgYW5kIDEuMC4xciBbMjggSmFuIDIwMTZdCisKKyAgKikgUHJvdGVjdGlvbiBmb3IgREggc21hbGwgc3ViZ3JvdXAgYXR0YWNrcworCisgICAgIEFzIGEgcHJlY2F1dGlvbmFyeSBtZWFzdXJlIHRoZSBTU0xfT1BfU0lOR0xFX0RIX1VTRSBvcHRpb24gaGFzIGJlZW4KKyAgICAgc3dpdGNoZWQgb24gYnkgZGVmYXVsdCBhbmQgY2Fubm90IGJlIGRpc2FibGVkLiBUaGlzIGNvdWxkIGhhdmUgc29tZQorICAgICBwZXJmb3JtYW5jZSBpbXBhY3QuCisgICAgIFtNYXR0IENhc3dlbGxdCisKKyAgKikgU1NMdjIgZG9lc24ndCBibG9jayBkaXNhYmxlZCBjaXBoZXJzCisKKyAgICAgQSBtYWxpY2lvdXMgY2xpZW50IGNhbiBuZWdvdGlhdGUgU1NMdjIgY2lwaGVycyB0aGF0IGhhdmUgYmVlbiBkaXNhYmxlZCBvbgorICAgICB0aGUgc2VydmVyIGFuZCBjb21wbGV0ZSBTU0x2MiBoYW5kc2hha2VzIGV2ZW4gaWYgYWxsIFNTTHYyIGNpcGhlcnMgaGF2ZQorICAgICBiZWVuIGRpc2FibGVkLCBwcm92aWRlZCB0aGF0IHRoZSBTU0x2MiBwcm90b2NvbCB3YXMgbm90IGFsc28gZGlzYWJsZWQgdmlhCisgICAgIFNTTF9PUF9OT19TU0x2Mi4KKworICAgICBUaGlzIGlzc3VlIHdhcyByZXBvcnRlZCB0byBPcGVuU1NMIG9uIDI2dGggRGVjZW1iZXIgMjAxNSBieSBOaW1yb2QgQXZpcmFtCisgICAgIGFuZCBTZWJhc3RpYW4gU2NoaW56ZWwuCisgICAgIChDVkUtMjAxNS0zMTk3KQorICAgICBbVmlrdG9yIER1a2hvdm5pXQorCisgICopIFJlamVjdCBESCBoYW5kc2hha2VzIHdpdGggcGFyYW1ldGVycyBzaG9ydGVyIHRoYW4gMTAyNCBiaXRzLgorICAgICBbS3VydCBSb2Vja3hdCisKKyBDaGFuZ2VzIGJldHdlZW4gMS4wLjFwIGFuZCAxLjAuMXEgWzMgRGVjIDIwMTVdCisKKyAgKikgQ2VydGlmaWNhdGUgdmVyaWZ5IGNyYXNoIHdpdGggbWlzc2luZyBQU1MgcGFyYW1ldGVyCisKKyAgICAgVGhlIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24gcm91dGluZXMgd2lsbCBjcmFzaCB3aXRoIGEgTlVMTCBwb2ludGVyCisgICAgIGRlcmVmZXJlbmNlIGlmIHByZXNlbnRlZCB3aXRoIGFuIEFTTi4xIHNpZ25hdHVyZSB1c2luZyB0aGUgUlNBIFBTUworICAgICBhbGdvcml0aG0gYW5kIGFic2VudCBtYXNrIGdlbmVyYXRpb24gZnVuY3Rpb24gcGFyYW1ldGVyLiBTaW5jZSB0aGVzZQorICAgICByb3V0aW5lcyBhcmUgdXNlZCB0byB2ZXJpZnkgY2VydGlmaWNhdGUgc2lnbmF0dXJlIGFsZ29yaXRobXMgdGhpcyBjYW4gYmUKKyAgICAgdXNlZCB0byBjcmFzaCBhbnkgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uIG9wZXJhdGlvbiBhbmQgZXhwbG9pdGVkIGluIGEKKyAgICAgRG9TIGF0dGFjay4gQW55IGFwcGxpY2F0aW9uIHdoaWNoIHBlcmZvcm1zIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbiBpcworICAgICB2dWxuZXJhYmxlIGluY2x1ZGluZyBPcGVuU1NMIGNsaWVudHMgYW5kIHNlcnZlcnMgd2hpY2ggZW5hYmxlIGNsaWVudAorICAgICBhdXRoZW50aWNhdGlvbi4KKworICAgICBUaGlzIGlzc3VlIHdhcyByZXBvcnRlZCB0byBPcGVuU1NMIGJ5IExvw69jIEpvbmFzIEV0aWVubmUgKFFuZWN0aXZlIEFHKS4KKyAgICAgKENWRS0yMDE1LTMxOTQpCisgICAgIFtTdGVwaGVuIEhlbnNvbl0KKworICAqKSBYNTA5X0FUVFJJQlVURSBtZW1vcnkgbGVhaworCisgICAgIFdoZW4gcHJlc2VudGVkIHdpdGggYSBtYWxmb3JtZWQgWDUwOV9BVFRSSUJVVEUgc3RydWN0dXJlIE9wZW5TU0wgd2lsbCBsZWFrCisgICAgIG1lbW9yeS4gVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBieSB0aGUgUEtDUyM3IGFuZCBDTVMgcm91dGluZXMgc28gYW55CisgICAgIGFwcGxpY2F0aW9uIHdoaWNoIHJlYWRzIFBLQ1MjNyBvciBDTVMgZGF0YSBmcm9tIHVudHJ1c3RlZCBzb3VyY2VzIGlzCisgICAgIGFmZmVjdGVkLiBTU0wvVExTIGlzIG5vdCBhZmZlY3RlZC4KKworICAgICBUaGlzIGlzc3VlIHdhcyByZXBvcnRlZCB0byBPcGVuU1NMIGJ5IEFkYW0gTGFuZ2xleSAoR29vZ2xlL0JvcmluZ1NTTCkgdXNpbmcKKyAgICAgbGliRnV6emVyLgorICAgICAoQ1ZFLTIwMTUtMzE5NSkKKyAgICAgW1N0ZXBoZW4gSGVuc29uXQorCisgICopIFJld3JpdGUgRVZQX0RlY29kZVVwZGF0ZSAoYmFzZTY0IGRlY29kaW5nKSB0byBmaXggc2V2ZXJhbCBidWdzLgorICAgICBUaGlzIGNoYW5nZXMgdGhlIGRlY29kaW5nIGJlaGF2aW91ciBmb3Igc29tZSBpbnZhbGlkIG1lc3NhZ2VzLAorICAgICB0aG91Z2ggdGhlIGNoYW5nZSBpcyBtb3N0bHkgaW4gdGhlIG1vcmUgbGVuaWVudCBkaXJlY3Rpb24sIGFuZAorICAgICBsZWdhY3kgYmVoYXZpb3VyIGlzIHByZXNlcnZlZCBhcyBtdWNoIGFzIHBvc3NpYmxlLgorICAgICBbRW1pbGlhIEvDpHNwZXJdCisKKyAgKikgSW4gRFNBX2dlbmVyYXRlX3BhcmFtZXRlcnNfZXgsIGlmIHRoZSBwcm92aWRlZCBzZWVkIGlzIHRvbyBzaG9ydCwKKyAgICAgcmV0dXJuIGFuIGVycm9yCisgICAgIFtSaWNoIFNhbHogYW5kIElzbW8gUHV1c3RpbmVuIDxpc21vLnB1dXN0aW5lbkBpbnRlbC5jb20+XQorCiAgQ2hhbmdlcyBiZXR3ZWVuIDEuMC4xbyBhbmQgMS4wLjFwIFs5IEp1bCAyMDE1XQogCiAgICopIEFsdGVybmF0ZSBjaGFpbnMgY2VydGlmaWNhdGUgZm9yZ2VyeQpAQCAtMTUsMTAgKzc4LDE5IEBACiAKICAgICAgVGhpcyBpc3N1ZSB3YXMgcmVwb3J0ZWQgdG8gT3BlblNTTCBieSBBZGFtIExhbmdsZXkvRGF2aWQgQmVuamFtaW4KICAgICAgKEdvb2dsZS9Cb3JpbmdTU0wpLgorICAgICAoQ1ZFLTIwMTUtMTc5MykKICAgICAgW01hdHQgQ2Fzd2VsbF0KIAotIENoYW5nZXMgYmV0d2VlbiAxLjAuMW4gYW5kIDEuMC4xbyBbMTIgSnVuIDIwMTVdCisgICopIFJhY2UgY29uZGl0aW9uIGhhbmRsaW5nIFBTSyBpZGVudGlmeSBoaW50CiAKKyAgICAgSWYgUFNLIGlkZW50aXR5IGhpbnRzIGFyZSByZWNlaXZlZCBieSBhIG11bHRpLXRocmVhZGVkIGNsaWVudCB0aGVuCisgICAgIHRoZSB2YWx1ZXMgYXJlIHdyb25nbHkgdXBkYXRlZCBpbiB0aGUgcGFyZW50IFNTTF9DVFggc3RydWN0dXJlLiBUaGlzIGNhbgorICAgICByZXN1bHQgaW4gYSByYWNlIGNvbmRpdGlvbiBwb3RlbnRpYWxseSBsZWFkaW5nIHRvIGEgZG91YmxlIGZyZWUgb2YgdGhlCisgICAgIGlkZW50aWZ5IGhpbnQgZGF0YS4KKyAgICAgKENWRS0yMDE1LTMxOTYpCisgICAgIFtTdGVwaGVuIEhlbnNvbl0KKworIENoYW5nZXMgYmV0d2VlbiAxLjAuMW4gYW5kIDEuMC4xbyBbMTIgSnVuIDIwMTVdCiAgICopIEZpeCBITUFDIEFCSSBpbmNvbXBhdGliaWxpdHkuIFRoZSBwcmV2aW91cyB2ZXJzaW9uIGludHJvZHVjZWQgYW4gQUJJCiAgICAgIGluY29tcGF0aWJpbGl0eSBpbiB0aGUgaGFuZGxpbmcgb2YgSE1BQy4gVGhlIHByZXZpb3VzIEFCSSBoYXMgbm93IGJlZW4KICAgICAgcmVzdG9yZWQuCkBAIC01NSw5ICsxMjcsOSBAQAogICAgICBjYWxsYmFja3MuCiAKICAgICAgVGhpcyBpc3N1ZSB3YXMgcmVwb3J0ZWQgdG8gT3BlblNTTCBieSBSb2JlcnQgU3dpZWNraSAoR29vZ2xlKSwgYW5kCi0gICAgIGluZGVwZW5kZW50bHkgYnkgSGFubm8gQvZjay4KKyAgICAgaW5kZXBlbmRlbnRseSBieSBIYW5ubyBCw7Zjay4KICAgICAgKENWRS0yMDE1LTE3ODkpCi0gICAgIFtFbWlsaWEgS+RzcGVyXQorICAgICBbRW1pbGlhIEvDpHNwZXJdCiAKICAgKikgUEtDUzcgY3Jhc2ggd2l0aCBtaXNzaW5nIEVudmVsb3BlZENvbnRlbnQKIApAQCAtNzEsNyArMTQzLDcgQEAKIAogICAgICBUaGlzIGlzc3VlIHdhcyByZXBvcnRlZCB0byBPcGVuU1NMIGJ5IE1pY2hhbCBaYWxld3NraSAoR29vZ2xlKS4KICAgICAgKENWRS0yMDE1LTE3OTApCi0gICAgIFtFbWlsaWEgS+RzcGVyXQorICAgICBbRW1pbGlhIEvDpHNwZXJdCiAKICAgKikgQ01TIHZlcmlmeSBpbmZpbml0ZSBsb29wIHdpdGggdW5rbm93biBoYXNoIGZ1bmN0aW9uCiAKQEAgLTk0LDYgKzE2Niw5IEBACiAgICopIFJlamVjdCBESCBoYW5kc2hha2VzIHdpdGggcGFyYW1ldGVycyBzaG9ydGVyIHRoYW4gNzY4IGJpdHMuCiAgICAgIFtLdXJ0IFJvZWNreCBhbmQgRW1pbGlhIEthc3Blcl0KIAorICAqKSBkaHBhcmFtOiBnZW5lcmF0ZSAyMDQ4LWJpdCBwYXJhbWV0ZXJzIGJ5IGRlZmF1bHQuCisgICAgIFtLdXJ0IFJvZWNreCBhbmQgRW1pbGlhIEthc3Blcl0KKwogIENoYW5nZXMgYmV0d2VlbiAxLjAuMWwgYW5kIDEuMC4xbSBbMTkgTWFyIDIwMTVdCiAKICAgKikgU2VnbWVudGF0aW9uIGZhdWx0IGluIEFTTjFfVFlQRV9jbXAgZml4CkBAIC0xMzIsNyArMjA3LDcgQEAKIAogICAgICBUaGlzIGlzc3VlIHdhcyByZXBvcnRlZCB0byBPcGVuU1NMIGJ5IE1pY2hhbCBaYWxld3NraSAoR29vZ2xlKS4KICAgICAgKENWRS0yMDE1LTAyODkpCi0gICAgIFtFbWlsaWEgS+RzcGVyXQorICAgICBbRW1pbGlhIEvDpHNwZXJdCiAKICAgKikgRG9TIHZpYSByZWFjaGFibGUgYXNzZXJ0IGluIFNTTHYyIHNlcnZlcnMgZml4CiAKQEAgLTE0MCwxMCArMjE1LDEwIEBACiAgICAgIHNlcnZlcnMgdGhhdCBib3RoIHN1cHBvcnQgU1NMdjIgYW5kIGVuYWJsZSBleHBvcnQgY2lwaGVyIHN1aXRlcyBieSBzZW5kaW5nCiAgICAgIGEgc3BlY2lhbGx5IGNyYWZ0ZWQgU1NMdjIgQ0xJRU5ULU1BU1RFUi1LRVkgbWVzc2FnZS4KIAotICAgICBUaGlzIGlzc3VlIHdhcyBkaXNjb3ZlcmVkIGJ5IFNlYW4gQnVyZm9yZCAoR29vZ2xlKSBhbmQgRW1pbGlhIEvkc3BlcgorICAgICBUaGlzIGlzc3VlIHdhcyBkaXNjb3ZlcmVkIGJ5IFNlYW4gQnVyZm9yZCAoR29vZ2xlKSBhbmQgRW1pbGlhIEvDpHNwZXIKICAgICAgKE9wZW5TU0wgZGV2ZWxvcG1lbnQgdGVhbSkuCiAgICAgIChDVkUtMjAxNS0wMjkzKQotICAgICBbRW1pbGlhIEvkc3Blcl0KKyAgICAgW0VtaWxpYSBLw6RzcGVyXQogCiAgICopIFVzZSBBZnRlciBGcmVlIGZvbGxvd2luZyBkMmlfRUNQcml2YXRla2V5IGVycm9yIGZpeAogCkBAIC0yODgsMTIgKzM2MywxMiBAQAogICAgICAgdmVyc2lvbiBkb2VzIG5vdCBtYXRjaCB0aGUgc2Vzc2lvbidzIHZlcnNpb24uIFJlc3VtaW5nIHdpdGggYSBkaWZmZXJlbnQKICAgICAgIHZlcnNpb24sIHdoaWxlIG5vdCBzdHJpY3RseSBmb3JiaWRkZW4gYnkgdGhlIFJGQywgaXMgb2YgcXVlc3Rpb25hYmxlCiAgICAgICBzYW5pdHkgYW5kIGJyZWFrcyBhbGwga25vd24gY2xpZW50cy4KLSAgICAgIFtEYXZpZCBCZW5qYW1pbiwgRW1pbGlhIEvkc3Blcl0KKyAgICAgIFtEYXZpZCBCZW5qYW1pbiwgRW1pbGlhIEvDpHNwZXJdCiAKICAgICopIFRpZ2h0ZW4gaGFuZGxpbmcgb2YgdGhlIENoYW5nZUNpcGhlclNwZWMgKENDUykgbWVzc2FnZTogcmVqZWN0CiAgICAgICBlYXJseSBDQ1MgbWVzc2FnZXMgZHVyaW5nIHJlbmVnb3RpYXRpb24uIChOb3RlIHRoYXQgYmVjYXVzZQogICAgICAgcmVuZWdvdGlhdGlvbiBpcyBlbmNyeXB0ZWQsIHRoaXMgZWFybHkgQ0NTIHdhcyBub3QgZXhwbG9pdGFibGUuKQotICAgICAgW0VtaWxpYSBL5HNwZXJdCisgICAgICBbRW1pbGlhIEvDpHNwZXJdCiAKICAgICopIFRpZ2h0ZW4gY2xpZW50LXNpZGUgc2Vzc2lvbiB0aWNrZXQgaGFuZGxpbmcgZHVyaW5nIHJlbmVnb3RpYXRpb246CiAgICAgICBlbnN1cmUgdGhhdCB0aGUgY2xpZW50IG9ubHkgYWNjZXB0cyBhIHNlc3Npb24gdGlja2V0IGlmIHRoZSBzZXJ2ZXIgc2VuZHMKQEAgLTMwNCw3ICszNzksNyBAQAogICAgICAgU2ltaWxhcmx5LCBlbnN1cmUgdGhhdCB0aGUgY2xpZW50IHJlcXVpcmVzIGEgc2Vzc2lvbiB0aWNrZXQgaWYgb25lCiAgICAgICB3YXMgYWR2ZXJ0aXNlZCBpbiB0aGUgU2VydmVySGVsbG8uIFByZXZpb3VzbHksIGEgVExTIGNsaWVudCB3b3VsZAogICAgICAgaWdub3JlIGEgbWlzc2luZyBOZXdTZXNzaW9uVGlja2V0IG1lc3NhZ2UuCi0gICAgICBbRW1pbGlhIEvkc3Blcl0KKyAgICAgIFtFbWlsaWEgS8Okc3Blcl0KIAogIENoYW5nZXMgYmV0d2VlbiAxLjAuMWkgYW5kIDEuMC4xaiBbMTUgT2N0IDIwMTRdCiAKQEAgLTM4NCwxMCArNDU5LDEwIEBACiAgICAgIHdpdGggYSBudWxsIHBvaW50ZXIgZGVyZWZlcmVuY2UgKHJlYWQpIGJ5IHNwZWNpZnlpbmcgYW4gYW5vbnltb3VzIChFQylESAogICAgICBjaXBoZXJzdWl0ZSBhbmQgc2VuZGluZyBjYXJlZnVsbHkgY3JhZnRlZCBoYW5kc2hha2UgbWVzc2FnZXMuCiAKLSAgICAgVGhhbmtzIHRvIEZlbGl4IEdy9mJlcnQgKEdvb2dsZSkgZm9yIGRpc2NvdmVyaW5nIGFuZCByZXNlYXJjaGluZyB0aGlzCisgICAgIFRoYW5rcyB0byBGZWxpeCBHcsO2YmVydCAoR29vZ2xlKSBmb3IgZGlzY292ZXJpbmcgYW5kIHJlc2VhcmNoaW5nIHRoaXMKICAgICAgaXNzdWUuCiAgICAgIChDVkUtMjAxNC0zNTEwKQotICAgICBbRW1pbGlhIEvkc3Blcl0KKyAgICAgW0VtaWxpYSBLw6RzcGVyXQogCiAgICopIEJ5IHNlbmRpbmcgY2FyZWZ1bGx5IGNyYWZ0ZWQgRFRMUyBwYWNrZXRzIGFuIGF0dGFja2VyIGNvdWxkIGNhdXNlIG9wZW5zc2wKICAgICAgdG8gbGVhayBtZW1vcnkuIFRoaXMgY2FuIGJlIGV4cGxvaXRlZCB0aHJvdWdoIGEgRGVuaWFsIG9mIFNlcnZpY2UgYXR0YWNrLgpAQCAtNDI0LDcgKzQ5OSw3IEBACiAgICAgIHByb3Blcmx5IG5lZ290aWF0ZWQgd2l0aCB0aGUgY2xpZW50LiBUaGlzIGNhbiBiZSBleHBsb2l0ZWQgdGhyb3VnaCBhCiAgICAgIERlbmlhbCBvZiBTZXJ2aWNlIGF0dGFjay4KIAotICAgICBUaGFua3MgdG8gSm9vbmFzIEt1b3JpbGVodG8gYW5kIFJpa3UgSGlldGFt5GtpIChDb2Rlbm9taWNvbikgZm9yCisgICAgIFRoYW5rcyB0byBKb29uYXMgS3VvcmlsZWh0byBhbmQgUmlrdSBIaWV0YW3DpGtpIChDb2Rlbm9taWNvbikgZm9yCiAgICAgIGRpc2NvdmVyaW5nIGFuZCByZXNlYXJjaGluZyB0aGlzIGlzc3VlLgogICAgICAoQ1ZFLTIwMTQtNTEzOSkKICAgICAgW1N0ZXZlIEhlbnNvbl0KQEAgLTQzNiw3ICs1MTEsNyBAQAogCiAgICAgIFRoYW5rcyB0byBJdmFuIEZyYXRyaWMgKEdvb2dsZSkgZm9yIGRpc2NvdmVyaW5nIHRoaXMgaXNzdWUuCiAgICAgIChDVkUtMjAxNC0zNTA4KQotICAgICBbRW1pbGlhIEvkc3BlciwgYW5kIFN0ZXZlIEhlbnNvbl0KKyAgICAgW0VtaWxpYSBLw6RzcGVyLCBhbmQgU3RldmUgSGVuc29uXQogCiAgICopIEZpeCBlY19HRnBfc2ltcGxlX3BvaW50c19tYWtlX2FmZmluZSAodGh1cywgRUNfUE9JTlRzX211bCBldGMuKQogICAgICBmb3IgY29ybmVyIGNhc2VzLiAoQ2VydGFpbiBpbnB1dCBwb2ludHMgYXQgaW5maW5pdHkgY291bGQgbGVhZCB0bwpAQCAtNDY2LDE1ICs1NDEsMTUgQEAKICAgICAgY2xpZW50IG9yIHNlcnZlci4gVGhpcyBpcyBwb3RlbnRpYWxseSBleHBsb2l0YWJsZSB0byBydW4gYXJiaXRyYXJ5CiAgICAgIGNvZGUgb24gYSB2dWxuZXJhYmxlIGNsaWVudCBvciBzZXJ2ZXIuCiAKLSAgICAgVGhhbmtzIHRvIEr8cmkgQWVkbGEgZm9yIHJlcG9ydGluZyB0aGlzIGlzc3VlLiAoQ1ZFLTIwMTQtMDE5NSkKLSAgICAgW0r8cmkgQWVkbGEsIFN0ZXZlIEhlbnNvbl0KKyAgICAgVGhhbmtzIHRvIErDvHJpIEFlZGxhIGZvciByZXBvcnRpbmcgdGhpcyBpc3N1ZS4gKENWRS0yMDE0LTAxOTUpCisgICAgIFtKw7xyaSBBZWRsYSwgU3RldmUgSGVuc29uXQogCiAgICopIEZpeCBidWcgaW4gVExTIGNvZGUgd2hlcmUgY2xpZW50cyBlbmFibGUgYW5vbnltb3VzIEVDREggY2lwaGVyc3VpdGVzCiAgICAgIGFyZSBzdWJqZWN0IHRvIGEgZGVuaWFsIG9mIHNlcnZpY2UgYXR0YWNrLgogCi0gICAgIFRoYW5rcyB0byBGZWxpeCBHcvZiZXJ0IGFuZCBJdmFuIEZyYXRyaWMgYXQgR29vZ2xlIGZvciBkaXNjb3ZlcmluZworICAgICBUaGFua3MgdG8gRmVsaXggR3LDtmJlcnQgYW5kIEl2YW4gRnJhdHJpYyBhdCBHb29nbGUgZm9yIGRpc2NvdmVyaW5nCiAgICAgIHRoaXMgaXNzdWUuIChDVkUtMjAxNC0zNDcwKQotICAgICBbRmVsaXggR3L2YmVydCwgSXZhbiBGcmF0cmljLCBTdGV2ZSBIZW5zb25dCisgICAgIFtGZWxpeCBHcsO2YmVydCwgSXZhbiBGcmF0cmljLCBTdGV2ZSBIZW5zb25dCiAKICAgKikgSGFybW9uaXplIHZlcnNpb24gYW5kIGl0cyBkb2N1bWVudGF0aW9uLiAtZiBmbGFnIGlzIHVzZWQgdG8gZGlzcGxheQogICAgICBjb21waWxhdGlvbiBmbGFncy4KQEAgLTU1Myw5ICs2MjgsOSBAQAogICAgICBUaGFua3MgZ28gdG8gTmFkaGVtIEFsZmFyZGFuIGFuZCBLZW5ueSBQYXRlcnNvbiBvZiB0aGUgSW5mb3JtYXRpb24KICAgICAgU2VjdXJpdHkgR3JvdXAgYXQgUm95YWwgSG9sbG93YXksIFVuaXZlcnNpdHkgb2YgTG9uZG9uCiAgICAgICh3d3cuaXNnLnJodWwuYWMudWspIGZvciBkaXNjb3ZlcmluZyB0aGlzIGZsYXcgYW5kIEFkYW0gTGFuZ2xleSBhbmQKLSAgICAgRW1pbGlhIEvkc3BlciBmb3IgdGhlIGluaXRpYWwgcGF0Y2guCisgICAgIEVtaWxpYSBLw6RzcGVyIGZvciB0aGUgaW5pdGlhbCBwYXRjaC4KICAgICAgKENWRS0yMDEzLTAxNjkpCi0gICAgIFtFbWlsaWEgS+RzcGVyLCBBZGFtIExhbmdsZXksIEJlbiBMYXVyaWUsIEFuZHkgUG9seWFrb3YsIFN0ZXZlIEhlbnNvbl0KKyAgICAgW0VtaWxpYSBLw6RzcGVyLCBBZGFtIExhbmdsZXksIEJlbiBMYXVyaWUsIEFuZHkgUG9seWFrb3YsIFN0ZXZlIEhlbnNvbl0KIAogICAqKSBGaXggZmxhdyBpbiBBRVNOSSBoYW5kbGluZyBvZiBUTFMgMS4yIGFuZCAxLjEgcmVjb3JkcyBmb3IgQ0JDIG1vZGUKICAgICAgY2lwaGVyc3VpdGVzIHdoaWNoIGNhbiBiZSBleHBsb2l0ZWQgaW4gYSBkZW5pYWwgb2Ygc2VydmljZSBhdHRhY2suCkBAIC03MzAsNyArODA1LDcgQEAKICAgICAgRUNfR1JPVVBfbmV3X2J5X2N1cnZlX25hbWUoKSB3aWxsIGF1dG9tYXRpY2FsbHkgdXNlIHRoZXNlICh3aGlsZQogICAgICBFQ19HUk9VUF9uZXdfY3VydmVfR0ZwKCkgY3VycmVudGx5IHByZWZlcnMgdGhlIG1vcmUgZmxleGlibGUKICAgICAgaW1wbGVtZW50YXRpb25zKS4KLSAgICAgW0VtaWxpYSBL5HNwZXIsIEFkYW0gTGFuZ2xleSwgQm9kbyBNb2VsbGVyIChHb29nbGUpXQorICAgICBbRW1pbGlhIEvDpHNwZXIsIEFkYW0gTGFuZ2xleSwgQm9kbyBNb2VsbGVyIChHb29nbGUpXQogCiAgICopIFVzZSB0eXBlIG9zc2xfc3NpemVfdCBpbnN0YWQgb2Ygc3NpemVfdCB3aGljaCBpc24ndCBhdmFpbGFibGUgb24KICAgICAgYWxsIHBsYXRmb3Jtcy4gTW92ZSBzc2l6ZV90IGRlZmluaXRpb24gZnJvbSBlX29zLmggdG8gdGhlIHB1YmxpYwpAQCAtMTAwNiw3ICsxMDgxLDcgQEAKICAgICAgW0FkYW0gTGFuZ2xleSAoR29vZ2xlKV0KIAogICAqKSBGaXggc3B1cmlvdXMgZmFpbHVyZXMgaW4gZWNkc2F0ZXN0LmMuCi0gICAgIFtFbWlsaWEgS+RzcGVyIChHb29nbGUpXQorICAgICBbRW1pbGlhIEvDpHNwZXIgKEdvb2dsZSldCiAKICAgKikgRml4IHRoZSBCSU9fZl9idWZmZXIoKSBpbXBsZW1lbnRhdGlvbiAod2hpY2ggd2FzIG1peGluZyBkaWZmZXJlbnQKICAgICAgaW50ZXJwcmV0YXRpb25zIG9mIHRoZSAnLi4uX2xlbicgZmllbGRzKS4KQEAgLTEwMjAsNyArMTA5NSw3IEBACiAgICAgIGxvY2sgdG8gY2FsbCBCTl9CTElORElOR19pbnZlcnRfZXgsIGFuZCBhdm9pZHMgb25lIHVzZSBvZgogICAgICBCTl9CTElORElOR191cGRhdGUgZm9yIGVhY2ggQk5fQkxJTkRJTkcgc3RydWN0dXJlIChwcmV2aW91c2x5LAogICAgICB0aGUgbGFzdCB1cGRhdGUgYWx3YXlzIHJlbWFpbmVkIHVudXNlZCkuCi0gICAgIFtFbWlsaWEgS+RzcGVyIChHb29nbGUpXQorICAgICBbRW1pbGlhIEvDpHNwZXIgKEdvb2dsZSldCiAKICAgKikgSW4gc3NsM19jbGVhciwgcHJlc2VydmUgczMtPmluaXRfZXh0cmEgYWxvbmcgd2l0aCBzMy0+cmJ1Zi4KICAgICAgW0JvYiBCdWNraG9seiAoR29vZ2xlKV0KQEAgLTE4MjksNyArMTkwNCw3IEBACiAKICAgKikgQWRkIFJGQyAzMTYxIGNvbXBsaWFudCB0aW1lIHN0YW1wIHJlcXVlc3QgY3JlYXRpb24sIHJlc3BvbnNlIGdlbmVyYXRpb24KICAgICAgYW5kIHJlc3BvbnNlIHZlcmlmaWNhdGlvbiBmdW5jdGlvbmFsaXR5LgotICAgICBbWm9sdOFuIEds83ppayA8emdsb3ppa0BvcGVudHNhLm9yZz4sIFRoZSBPcGVuVFNBIFByb2plY3RdCisgICAgIFtab2x0w6FuIEdsw7N6aWsgPHpnbG96aWtAb3BlbnRzYS5vcmc+LCBUaGUgT3BlblRTQSBQcm9qZWN0XQogCiAgICopIEFkZCBpbml0aWFsIHN1cHBvcnQgZm9yIFRMUyBleHRlbnNpb25zLCBzcGVjaWZpY2FsbHkgZm9yIHRoZSBzZXJ2ZXJfbmFtZQogICAgICBleHRlbnNpb24gc28gZmFyLiAgVGhlIFNTTF9TRVNTSU9OLCBTU0xfQ1RYLCBhbmQgU1NMIGRhdGEgc3RydWN0dXJlcyBub3cKQEAgLTI5OTcsNyArMzA3Miw3IEBACiAKICAgKikgQk5fQ1RYX2dldCgpIHNob3VsZCByZXR1cm4gemVyby12YWx1ZWQgYmlnbnVtcywgcHJvdmlkaW5nIHRoZSBzYW1lCiAgICAgIGluaXRpYWxpc2VkIHZhbHVlIGFzIEJOX25ldygpLgotICAgICBbR2VvZmYgVGhvcnBlLCBzdWdnZXN0ZWQgYnkgVWxmIE32bGxlcl0KKyAgICAgW0dlb2ZmIFRob3JwZSwgc3VnZ2VzdGVkIGJ5IFVsZiBNw7ZsbGVyXQogCiAgICopIFN1cHBvcnQgZm9yIGluaGliaXRBbnlQb2xpY3kgY2VydGlmaWNhdGUgZXh0ZW5zaW9uLgogICAgICBbU3RldmUgSGVuc29uXQpAQCAtMzAxNiw3ICszMDkxLDcgQEAKICAgICAgc29tZSBwb2ludCwgdGhlc2UgdGlnaHRlciBydWxlcyB3aWxsIGJlY29tZSBvcGVuc3NsJ3MgZGVmYXVsdCB0byBpbXByb3ZlCiAgICAgIG1haW50YWluYWJpbGl0eSwgdGhvdWdoIHRoZSBhc3NlcnQoKXMgYW5kIG90aGVyIG92ZXJoZWFkcyB3aWxsIHJlbWFpbiBvbmx5CiAgICAgIGluIGRlYnVnZ2luZyBjb25maWd1cmF0aW9ucy4gU2VlIGJuLmggZm9yIG1vcmUgZGV0YWlscy4KLSAgICAgW0dlb2ZmIFRob3JwZSwgTmlscyBMYXJzY2gsIFVsZiBN9mxsZXJdCisgICAgIFtHZW9mZiBUaG9ycGUsIE5pbHMgTGFyc2NoLCBVbGYgTcO2bGxlcl0KIAogICAqKSBCTl9DVFhfaW5pdCgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQsIGFzIEJOX0NUWCBpcyBhbiBvcGFxdWUgc3RydWN0dXJlCiAgICAgIHRoYXQgY2FuIG9ubHkgYmUgb2J0YWluZWQgdGhyb3VnaCBCTl9DVFhfbmV3KCkgKHdoaWNoIGltcGxpY2l0bHkKQEAgLTMwODMsNyArMzE1OCw3IEBACiAgICAgIFtEb3VnbGFzIFN0ZWJpbGEgKFN1biBNaWNyb3N5c3RlbXMgTGFib3JhdG9yaWVzKV0KIAogICAqKSBBZGQgdGhlIHBvc3NpYmlsaXR5IHRvIGxvYWQgc3ltYm9scyBnbG9iYWxseSB3aXRoIERTTy4KLSAgICAgW0f2dHogQmFiaW4tRWJlbGwgPGJhYmluLWViZWxsQHRydXN0Y2VudGVyLmRlPiB2aWEgUmljaGFyZCBMZXZpdHRlXQorICAgICBbR8O2dHogQmFiaW4tRWJlbGwgPGJhYmluLWViZWxsQHRydXN0Y2VudGVyLmRlPiB2aWEgUmljaGFyZCBMZXZpdHRlXQogCiAgICopIEFkZCB0aGUgZnVuY3Rpb25zIEVSUl9zZXRfbWFyaygpIGFuZCBFUlJfcG9wX3RvX21hcmsoKSBmb3IgYmV0dGVyCiAgICAgIGNvbnRyb2wgb2YgdGhlIGVycm9yIHN0YWNrLgpAQCAtMzc5OCw3ICszODczLDcgQEAKICAgICAgW1N0ZXZlIEhlbnNvbl0KIAogICAqKSBVbmRvIEN5Z3dpbiBjaGFuZ2UuCi0gICAgIFtVbGYgTfZsbGVyXQorICAgICBbVWxmIE3DtmxsZXJdCiAKICAgKikgQWRkZWQgc3VwcG9ydCBmb3IgcHJveHkgY2VydGlmaWNhdGVzIGFjY29yZGluZyB0byBSRkMgMzgyMC4KICAgICAgQmVjYXVzZSB0aGV5IG1heSBiZSBhIHNlY3VyaXR5IHRocmVhZCB0byB1bmF3YXJlIGFwcGxpY2F0aW9ucywKQEAgLTM4MzEsMTEgKzM5MDYsMTEgQEAKICAgICAgW1N0ZXBoZW4gSGVuc29uLCByZXBvcnRlZCBieSBVSyBOSVNDQ10KIAogICAqKSBVc2UgV2luZG93cyByYW5kb21uZXNzIGNvbGxlY3Rpb24gb24gQ3lnd2luLgotICAgICBbVWxmIE32bGxlcl0KKyAgICAgW1VsZiBNw7ZsbGVyXQogCiAgICopIEZpeCBoYW5nIGluIEVHRC9QUk5HRCBxdWVyeSB3aGVuIGNvbW11bmljYXRpb24gc29ja2V0IGlzIGNsb3NlZAogICAgICBwcmVtYXR1cmVseSBieSBFR0QvUFJOR0QuCi0gICAgIFtEYXJyZW4gVHVja2VyIDxkdHVja2VyQHppcC5jb20uYXU+IHZpYSBMdXR6IErkbmlja2UsIHJlc29sdmVzICMxMDE0XQorICAgICBbRGFycmVuIFR1Y2tlciA8ZHR1Y2tlckB6aXAuY29tLmF1PiB2aWEgTHV0eiBKw6RuaWNrZSwgcmVzb2x2ZXMgIzEwMTRdCiAKICAgKikgUHJvbXB0IGZvciBwYXNzIHBocmFzZXMgd2hlbiBhcHByb3ByaWF0ZSBmb3IgUEtDUzEyIGlucHV0IGZvcm1hdC4KICAgICAgW1N0ZXZlIEhlbnNvbl0KQEAgLTQyOTcsNyArNDM3Miw3IEBACiAgICAgIHBvaW50ZXJzIHBhc3NlZCB0byB0aGVtIHdoZW5ldmVyIG5lY2Vzc2FyeS4gT3RoZXJ3aXNlIGl0IGlzIHBvc3NpYmxlCiAgICAgIHRoZSBjYWxsZXIgbWF5IGhhdmUgb3ZlcndyaXR0ZW4gKG9yIGRlYWxsb2NhdGVkKSB0aGUgb3JpZ2luYWwgc3RyaW5nCiAgICAgIGRhdGEgd2hlbiBhIGxhdGVyIEVOR0lORSBvcGVyYXRpb24gdHJpZXMgdG8gdXNlIHRoZSBzdG9yZWQgdmFsdWVzLgotICAgICBbR/Z0eiBCYWJpbi1FYmVsbCA8YmFiaW5lYmVsbEB0cnVzdGNlbnRlci5kZT5dCisgICAgIFtHw7Z0eiBCYWJpbi1FYmVsbCA8YmFiaW5lYmVsbEB0cnVzdGNlbnRlci5kZT5dCiAKICAgKikgSW1wcm92ZSBkaWFnbm9zdGljcyBpbiBmaWxlIHJlYWRpbmcgYW5kIGNvbW1hbmQtbGluZSBkaWdlc3RzLgogICAgICBbQmVuIExhdXJpZSBhaWRlZCBhbmQgYWJldHRlZCBieSBTb2xhciBEZXNpZ25lciA8c29sYXJAb3BlbndhbGwuY29tPl0KQEAgLTY0MDIsNyArNjQ3Nyw3IEBACiAgICAgIFtCb2RvIE1vZWxsZXJdCiAKICAgKikgQk5fc3FyKCkgYnVnIGZpeC4KLSAgICAgW1VsZiBN9mxsZXIsIHJlcG9ydGVkIGJ5IEppbSBFbGxpcyA8amltLmVsbGlzQGNhdml1bS5jb20+XQorICAgICBbVWxmIE3DtmxsZXIsIHJlcG9ydGVkIGJ5IEppbSBFbGxpcyA8amltLmVsbGlzQGNhdml1bS5jb20+XQogCiAgICopIFJhYmluLU1pbGxlciB0ZXN0IGFuYWx5c2VzIGFzc3VtZSB1bmlmb3JtbHkgZGlzdHJpYnV0ZWQgd2l0bmVzc2VzLAogICAgICBzbyB1c2UgQk5fcHNldWRvX3JhbmRfcmFuZ2UoKSBpbnN0ZWFkIG9mIHVzaW5nIEJOX3BzZXVkb19yYW5kKCkKQEAgLTY1NjIsNyArNjYzNyw3IEBACiAgICAgIFtCb2RvIE1vZWxsZXJdCiAKICAgKikgRml4IE9BRVAgY2hlY2suCi0gICAgIFtVbGYgTfZsbGVyLCBCb2RvIE32bGxlcl0KKyAgICAgW1VsZiBNw7ZsbGVyLCBCb2RvIE3DtmxsZXJdCiAKICAgKikgVGhlIGNvdW50ZXJtZWFzdXJlIGFnYWluc3QgQmxlaWNoYmFjaGVyJ3MgYXR0YWNrIG9uIFBLQ1MgIzEgdjEuNQogICAgICBSU0EgZW5jcnlwdGlvbiB3YXMgYWNjaWRlbnRhbGx5IHJlbW92ZWQgaW4gczNfc3J2ci5jIGluIE9wZW5TU0wgMC45LjUKQEAgLTY4MjQsMTAgKzY4OTksMTAgQEAKICAgICAgW0JvZG8gTW9lbGxlcl0KIAogICAqKSBVc2UgYmV0dGVyIHRlc3QgcGF0dGVybnMgaW4gYm50ZXN0LgotICAgICBbVWxmIE32bGxlcl0KKyAgICAgW1VsZiBNw7ZsbGVyXQogCiAgICopIHJhbmRfd2luLmMgZml4IGZvciBCb3JsYW5kIEMuCi0gICAgIFtVbGYgTfZsbGVyXQorICAgICBbVWxmIE3DtmxsZXJdCiAgCiAgICopIEJOX3JzaGlmdCBidWdmaXggZm9yIG4gPT0gMC4KICAgICAgW0JvZG8gTW9lbGxlcl0KQEAgLTY5NzIsMTQgKzcwNDcsMTQgQEAKIAogICAqKSBOZXcgQklPX3NodXRkb3duX3dyIG1hY3JvLCB3aGljaCBpbnZva2VzIHRoZSBCSU9fQ19TSFVURE9XTl9XUgogICAgICBCSU9fY3RybCAoZm9yIEJJTyBwYWlycykuCi0gICAgIFtCb2RvIE32bGxlcl0KKyAgICAgW0JvZG8gTcO2bGxlcl0KIAogICAqKSBBZGQgRFNPIG1ldGhvZCBmb3IgVk1TLgogICAgICBbUmljaGFyZCBMZXZpdHRlXQogCiAgICopIEJ1ZyBmaXg6IE1vbnRnb21lcnkgbXVsdGlwbGljYXRpb24gY291bGQgcHJvZHVjZSByZXN1bHRzIHdpdGggdGhlCiAgICAgIHdyb25nIHNpZ24uCi0gICAgIFtVbGYgTfZsbGVyXQorICAgICBbVWxmIE3DtmxsZXJdCiAKICAgKikgQWRkIFJQTSBzcGVjaWZpY2F0aW9uIG9wZW5zc2wuc3BlYyBhbmQgbW9kaWZ5IGl0IHRvIGJ1aWxkIHRocmVlCiAgICAgIHBhY2thZ2VzLiAgVGhlIGRlZmF1bHQgcGFja2FnZSBjb250YWlucyBhcHBsaWNhdGlvbnMsIGFwcGxpY2F0aW9uCkBAIC02OTk3LDcgKzcwNzIsNyBAQAogCiAgICopIERvbid0IHNldCB0aGUgdHdvIG1vc3Qgc2lnbmlmaWNhbnQgYml0cyB0byBvbmUgd2hlbiBnZW5lcmF0aW5nIGEKICAgICAgcmFuZG9tIG51bWJlciA8IHEgaW4gdGhlIERTQSBsaWJyYXJ5LgotICAgICBbVWxmIE32bGxlcl0KKyAgICAgW1VsZiBNw7ZsbGVyXQogCiAgICopIE5ldyBTU0wgQVBJIG1vZGUgJ1NTTF9NT0RFX0FVVE9fUkVUUlknLiAgVGhpcyBkaXNhYmxlcyB0aGUgZGVmYXVsdAogICAgICBiZWhhdmlvdXIgdGhhdCBTU0xfcmVhZCBtYXkgcmVzdWx0IGluIFNTTF9FUlJPUl9XQU5UX1JFQUQgKGV2ZW4gaWYKQEAgLTcyNjMsNyArNzMzOCw3IEBACiAgICopIFJhbmRvbW5lc3MgcG9sbGluZyBmdW5jdGlvbiBmb3IgV2luOXgsIGFzIGRlc2NyaWJlZCBpbjoKICAgICAgUGV0ZXIgR3V0bWFubiwgU29mdHdhcmUgR2VuZXJhdGlvbiBvZiBQcmFjdGljYWxseSBTdHJvbmcKICAgICAgUmFuZG9tIE51bWJlcnMuCi0gICAgIFtVbGYgTfZsbGVyXQorICAgICBbVWxmIE3DtmxsZXJdCiAKICAgKikgRml4IHNvIFBSTkcgaXMgc2VlZGVkIGluIHJlcSBpZiB1c2luZyBhbiBhbHJlYWR5IGV4aXN0aW5nCiAgICAgIERTQSBrZXkuCkBAIC03NDgzLDcgKzc1NTgsNyBAQAogICAgICBbU3RldmUgSGVuc29uXQogCiAgICopIEVsaW1pbmF0ZSBub24tQU5TSSBkZWNsYXJhdGlvbnMgaW4gY3J5cHRvLmggYW5kIHN0YWNrLmguCi0gICAgIFtVbGYgTfZsbGVyXQorICAgICBbVWxmIE3DtmxsZXJdCiAKICAgKikgRml4IGZvciBTU0wgc2VydmVyIHB1cnBvc2UgY2hlY2tpbmcuIFNlcnZlciBjaGVja2luZyB3YXMKICAgICAgcmVqZWN0aW5nIGNlcnRpZmljYXRlcyB3aGljaCBoYWQgZXh0ZW5kZWQga2V5IHVzYWdlIHByZXNlbnQKQEAgLTc1MTUsNyArNzU5MCw3IEBACiAgICAgIFtCb2RvIE1vZWxsZXJdCiAKICAgKikgQnVnZml4IGZvciBsaW51eC1lbGYgbWFrZWZpbGUub25lLgotICAgICBbVWxmIE32bGxlcl0KKyAgICAgW1VsZiBNw7ZsbGVyXQogCiAgICopIFJTQV9nZXRfZGVmYXVsdF9tZXRob2QoKSB3aWxsIG5vdyBjYXVzZSBhIGRlZmF1bHQKICAgICAgUlNBX01FVEhPRCB0byBiZSBjaG9zZW4gaWYgb25lIGRvZXNuJ3QgZXhpc3QgYWxyZWFkeS4KQEAgLTc2MDQsNyArNzY3OSw3IEBACiAgICAgIFtTdGV2ZSBIZW5zb25dCiAKICAgKikgZGVzX3F1YWRfY2tzdW0oKSBieXRlIG9yZGVyIGJ1ZyBmaXguCi0gICAgIFtVbGYgTfZsbGVyLCB1c2luZyB0aGUgcHJvYmxlbSBkZXNjcmlwdGlvbiBpbiBrcmI0LTAuOS43LCB3aGVyZQorICAgICBbVWxmIE3DtmxsZXIsIHVzaW5nIHRoZSBwcm9ibGVtIGRlc2NyaXB0aW9uIGluIGtyYjQtMC45LjcsIHdoZXJlCiAgICAgICB0aGUgc29sdXRpb24gaXMgYXR0cmlidXRlZCB0byBEZXJyaWNrIEogQnJhc2hlYXIgPHNoYWRvd0BERU1FTlRJQS5PUkc+XQogCiAgICopIEZpeCBzbyBWX0FTTjFfQVBQX0NIT09TRSB3b3JrcyBhZ2FpbjogaG93ZXZlciBpdHMgdXNlIGlzIHN0cm9uZ2x5CkBAIC03NzA1LDcgKzc3ODAsNyBAQAogICAgICBbUm9sZiBIYWJlcnJlY2tlciA8cm9sZkBzdXNlLmRlPl0KIAogICAqKSBBc3NlbWJsZXIgbW9kdWxlIHN1cHBvcnQgZm9yIE1pbmd3MzIuCi0gICAgIFtVbGYgTfZsbGVyXQorICAgICBbVWxmIE3DtmxsZXJdCiAKICAgKikgU2hhcmVkIGxpYnJhcnkgc3VwcG9ydCBmb3IgSFBVWCAoaW4gc2hsaWIvKS4KICAgICAgW0x1dHogSmFlbmlja2UgPEx1dHouSmFlbmlja2VAYWV0LlRVLUNvdHRidXMuREU+IGFuZCBBbm9ueW1vdXNdCkBAIC03NzI0LDcgKzc3OTksNyBAQAogCiAgICopIEJOX211bCBidWdmaXg6IEluIGJuX211bF9wYXJ0X3JlY3Vyc2lvbigpIG9ubHkgdGhlIGE+YVtuXSAmJiBiPmJbbl0KICAgICAgY2FzZSB3YXMgaW1wbGVtZW50ZWQuIFRoaXMgY2F1c2VkIEJOX2Rpdl9yZWNwKCkgdG8gZmFpbCBvY2Nhc2lvbmFsbHkuCi0gICAgIFtVbGYgTfZsbGVyXQorICAgICBbVWxmIE3DtmxsZXJdCiAKICAgKikgQWRkIGFuIG9wdGlvbmFsIHNlY29uZCBhcmd1bWVudCB0byB0aGUgc2V0X2xhYmVsKCkgaW4gdGhlIHBlcmwKICAgICAgYXNzZW1ibHkgbGFuZ3VhZ2UgYnVpbGRlci4gSWYgdGhpcyBhcmd1bWVudCBleGlzdHMgYW5kIGlzIHNldApAQCAtNzc1NCwxNCArNzgyOSwxNCBAQAogICAgICBbU3RldmUgSGVuc29uXQogCiAgICopIEZpeCBwb3RlbnRpYWwgYnVmZmVyIG92ZXJydW4gcHJvYmxlbSBpbiBCSU9fcHJpbnRmKCkuCi0gICAgIFtVbGYgTfZsbGVyLCB1c2luZyBwdWJsaWMgZG9tYWluIGNvZGUgYnkgUGF0cmljayBQb3dlbGw7IHByb2JsZW0KKyAgICAgW1VsZiBNw7ZsbGVyLCB1c2luZyBwdWJsaWMgZG9tYWluIGNvZGUgYnkgUGF0cmljayBQb3dlbGw7IHByb2JsZW0KICAgICAgIHBvaW50ZWQgb3V0IGJ5IERhdmlkIFNhY2VyZG90ZSA8ZGFzMzNAY29ybmVsbC5lZHU+XQogCiAgICopIFN1cHBvcnQgRUdEIDxodHRwOi8vd3d3LmxvdGhhci5jb20vdGVjaC9jcnlwdG8vPi4gIE5ldyBmdW5jdGlvbnMKICAgICAgUkFORF9lZ2QoKSBhbmQgUkFORF9zdGF0dXMoKS4gIEluIHRoZSBjb21tYW5kIGxpbmUgYXBwbGljYXRpb24sCiAgICAgIHRoZSBFR0Qgc29ja2V0IGNhbiBiZSBzcGVjaWZpZWQgbGlrZSBhIHNlZWQgZmlsZSB1c2luZyBSQU5ERklMRQogICAgICBvciAtcmFuZC4KLSAgICAgW1VsZiBN9mxsZXJdCisgICAgIFtVbGYgTcO2bGxlcl0KIAogICAqKSBBbGxvdyB0aGUgc3RyaW5nIENFUlRJRklDQVRFIHRvIGJlIHRvbGVyYXRlZCBpbiBQS0NTIzcgc3RydWN0dXJlcy4KICAgICAgU29tZSBDQXMgKGUuZy4gVmVyaXNpZ24pIGRpc3RyaWJ1dGUgY2VydGlmaWNhdGVzIGluIHRoaXMgZm9ybS4KQEAgLTc3OTQsNyArNzg2OSw3IEBACiAgICAgICAgICNkZWZpbmUgT1BFTlNTTF9BTEdPUklUSE1fREVGSU5FUwogICAgICAgICAjaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3NsY29uZi5oPgogICAgICBkZWZpbmVzIGFsbCBwZXJ0aW5lbnQgTk9fPGFsZ28+IHN5bWJvbHMsIHN1Y2ggYXMgTk9fSURFQSwgTk9fUlNBLCBldGMuCi0gICAgIFtSaWNoYXJkIExldml0dGUsIFVsZiBhbmQgQm9kbyBN9mxsZXJdCisgICAgIFtSaWNoYXJkIExldml0dGUsIFVsZiBhbmQgQm9kbyBNw7ZsbGVyXQogCiAgICopIEJ1Z2ZpeDogVG9sZXJhdGUgZnJhZ21lbnRhdGlvbiBhbmQgaW50ZXJsZWF2aW5nIGluIHRoZSBTU0wgMy9UTFMKICAgICAgcmVjb3JkIGxheWVyLgpAQCAtNzg0NSwxNyArNzkyMCwxNyBAQAogCiAgICopIEJ1ZyBmaXggZm9yIEJOX2Rpdl9yZWNwKCkgZm9yIG51bWVyYXRvcnMgd2l0aCBhbiBldmVuIG51bWJlciBvZgogICAgICBiaXRzLgotICAgICBbVWxmIE32bGxlcl0KKyAgICAgW1VsZiBNw7ZsbGVyXQogCiAgICopIE1vcmUgdGVzdHMgaW4gYm50ZXN0LmMsIGFuZCBjaGFuZ2VkIHRlc3RfYm4gb3V0cHV0LgotICAgICBbVWxmIE32bGxlcl0KKyAgICAgW1VsZiBNw7ZsbGVyXQogCiAgICopIC4vY29uZmlnIHJlY29nbml6ZXMgTWFjT1MgWCBub3cuCiAgICAgIFtBbmR5IFBvbHlha292XQogCiAgICopIEJ1ZyBmaXggZm9yIEJOX2RpdigpIHdoZW4gdGhlIGZpcnN0IHdvcmRzIG9mIG51bSBhbmQgZGl2c29yIGFyZQogICAgICBlcXVhbCAoaXQgZ2F2ZSB3cm9uZyByZXN1bHRzIGlmIChyZW09KG4xLXEqZDApJkJOX01BU0syKSA8IGQwKS4KLSAgICAgW1VsZiBN9mxsZXJdCisgICAgIFtVbGYgTcO2bGxlcl0KIAogICAqKSBBZGQgc3VwcG9ydCBmb3IgdmFyaW91cyBicm9rZW4gUEtDUyM4IGZvcm1hdHMsIGFuZCBjb21tYW5kIGxpbmUKICAgICAgb3B0aW9ucyB0byBwcm9kdWNlIHRoZW0uCkBAIC03ODYzLDExICs3OTM4LDExIEBACiAKICAgKikgTmV3IGZ1bmN0aW9ucyBCTl9DVFhfc3RhcnQoKSwgQk5fQ1RYX2dldCgpIGFuZCBCVF9DVFhfZW5kKCkgdG8KICAgICAgZ2V0IHRlbXBvcmFyeSBCSUdOVU1zIGZyb20gYSBCTl9DVFguCi0gICAgIFtVbGYgTfZsbGVyXQorICAgICBbVWxmIE3DtmxsZXJdCiAKICAgKikgQ29ycmVjdCByZXR1cm4gdmFsdWVzIGluIEJOX21vZF9leHBfbW9udCgpIGFuZCBCTl9tb2RfZXhwMl9tb250KCkKICAgICAgZm9yIHAgPT0gMC4KLSAgICAgW1VsZiBN9mxsZXJdCisgICAgIFtVbGYgTcO2bGxlcl0KIAogICAqKSBDaGFuZ2UgdGhlIFNTTGVheV9hZGRfYWxsXyooKSBmdW5jdGlvbnMgdG8gT3BlblNTTF9hZGRfYWxsXyooKSBhbmQKICAgICAgaW5jbHVkZSBhICNkZWZpbmUgZnJvbSB0aGUgb2xkIG5hbWUgdG8gdGhlIG5ldy4gVGhlIG9yaWdpbmFsIGludGVudApAQCAtNzg5MSw3ICs3OTY2LDcgQEAKIAogICAqKSBTb3VyY2UgY29kZSBjbGVhbnVwczogdXNlIGNvbnN0IHdoZXJlIGFwcHJvcHJpYXRlLCBlbGltaW5hdGUgY2FzdHMsCiAgICAgIHVzZSB2b2lkICogaW5zdGVhZCBvZiBjaGFyICogaW4gbGhhc2guCi0gICAgIFtVbGYgTfZsbGVyXSAKKyAgICAgW1VsZiBNw7ZsbGVyXSAKIAogICAqKSBCdWdmaXg6IHNzbDNfc2VuZF9zZXJ2ZXJfa2V5X2V4Y2hhbmdlIHdhcyBub3QgcmVzdGFydGFibGUKICAgICAgKHRoZSBzdGF0ZSB3YXMgbm90IGNoYW5nZWQgdG8gU1NMM19TVF9TV19LRVlfRVhDSF9CLCBhbmQgYmVjYXVzZSBvZgpAQCAtNzkzNiwxMyArODAxMSwxMyBAQAogICAgICBbU3RldmUgSGVuc29uXQogCiAgICopIE5ldyBmdW5jdGlvbiBCTl9wc2V1ZG9fcmFuZCgpLgotICAgICBbVWxmIE32bGxlcl0KKyAgICAgW1VsZiBNw7ZsbGVyXQogCiAgICopIENsZWFuIHVwIEJOX21vZF9tdWxfbW9udGdvbWVyeSgpOiByZXBsYWNlIHRoZSBicm9rZW4gKGFuZCB1bnJlYWRhYmxlKQogICAgICBiaWdudW0gdmVyc2lvbiBvZiBCTl9mcm9tX21vbnRnb21lcnkoKSB3aXRoIHRoZSB3b3JraW5nIGNvZGUgZnJvbQogICAgICBTU0xlYXkgMC45LjAgKHRoZSB3b3JkIGJhc2VkIHZlcnNpb24gaXMgZmFzdGVyIGFueXdheSksIGFuZCBjbGVhbiB1cAogICAgICB0aGUgY29tbWVudHMuCi0gICAgIFtVbGYgTfZsbGVyXQorICAgICBbVWxmIE3DtmxsZXJdCiAKICAgKikgQXZvaWQgYSByYWNlIGNvbmRpdGlvbiBpbiBzMl9jbG50LmMgKGZ1bmN0aW9uIGdldF9zZXJ2ZXJfaGVsbG8pIHRoYXQKICAgICAgbWFkZSBpdCBpbXBvc3NpYmxlIHRvIHVzZSB0aGUgc2FtZSBTU0xfU0VTU0lPTiBkYXRhIHN0cnVjdHVyZSBpbgpAQCAtNzk1MiwyNSArODAyNywyNSBAQAogICAqKSBUaGUgcmV0dXJuIHZhbHVlIG9mIFJBTkRfbG9hZF9maWxlKCkgbm8gbG9uZ2VyIGNvdW50cyBieXRlcyBvYnRhaW5lZAogICAgICBieSBzdGF0KCkuICBSQU5EX2xvYWRfZmlsZSguLi4sIC0xKSBpcyBuZXcgYW5kIHVzZXMgdGhlIGNvbXBsZXRlIGZpbGUKICAgICAgdG8gc2VlZCB0aGUgUFJORyAocHJldmlvdXNseSBhbiBleHBsaWNpdCBieXRlIGNvdW50IHdhcyByZXF1aXJlZCkuCi0gICAgIFtVbGYgTfZsbGVyLCBCb2RvIE32bGxlcl0KKyAgICAgW1VsZiBNw7ZsbGVyLCBCb2RvIE3DtmxsZXJdCiAKICAgKikgQ2xlYW4gdXAgQ1JZUFRPX0VYX0RBVEEgZnVuY3Rpb25zLCBzb21lIG9mIHRoZXNlIGRpZG4ndCBoYXZlIHByb3RvdHlwZXMKICAgICAgdXNlZCAoY2hhciAqKSBpbnN0ZWFkIG9mICh2b2lkICopIGFuZCBoYWQgY2FzdHMgYWxsIG92ZXIgdGhlIHBsYWNlLgogICAgICBbU3RldmUgSGVuc29uXQogCiAgICopIE1ha2UgQk5fZ2VuZXJhdGVfcHJpbWUoKSByZXR1cm4gTlVMTCBvbiBlcnJvciBpZiByZXQhPU5VTEwuCi0gICAgIFtVbGYgTfZsbGVyXQorICAgICBbVWxmIE3DtmxsZXJdCiAKICAgKikgUmV0YWluIHNvdXJjZSBjb2RlIGNvbXBhdGliaWxpdHkgZm9yIEJOX3ByaW1lX2NoZWNrcyBtYWNybzoKICAgICAgQk5faXNfcHJpbWUoLi4uLCBCTl9wcmltZV9jaGVja3MsIC4uLikgbm93IHVzZXMKICAgICAgQk5fcHJpbWVfY2hlY2tzX2Zvcl9zaXplIHRvIGRldGVybWluZSB0aGUgYXBwcm9wcmlhdGUgbnVtYmVyIG9mCiAgICAgIFJhYmluLU1pbGxlciBpdGVyYXRpb25zLgotICAgICBbVWxmIE32bGxlcl0KKyAgICAgW1VsZiBNw7ZsbGVyXQogCiAgICopIERpZmZpZS1IZWxsbWFuIHVzZXMgInNhZmUiIHByaW1lczogREhfY2hlY2soKSByZXR1cm4gY29kZSByZW5hbWVkIHRvCiAgICAgIERIX0NIRUNLX1BfTk9UX1NBRkVfUFJJTUUuCiAgICAgIChDaGVjayBpZiB0aGlzIGlzIHRydWU/IE9wZW5QR1AgY2FsbHMgdGhlbSAic3Ryb25nIi4pCi0gICAgIFtVbGYgTfZsbGVyXQorICAgICBbVWxmIE3DtmxsZXJdCiAKICAgKikgTWVyZ2UgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgImRoIiBhbmQgImdlbmRoIiBwcm9ncmFtcyBpbnRvIGEgbmV3IHByb2dyYW0KICAgICAgImRocGFyYW0iLiBUaGUgb2xkIHByb2dyYW1zIGFyZSByZXRhaW5lZCBmb3Igbm93IGJ1dCB3aWxsIGhhbmRsZSBESCBrZXlzCkBAIC04MDI2LDcgKzgxMDEsNyBAQAogICAqKSBBZGQgbWlzc2luZyAjaWZuZGVmcyB0aGF0IGNhdXNlZCBtaXNzaW5nIHN5bWJvbHMgd2hlbiBidWlsZGluZyBsaWJzc2wKICAgICAgYXMgYSBzaGFyZWQgbGlicmFyeSB3aXRob3V0IFJTQS4gIFVzZSAjaWZuZGVmIE5PX1NTTDIgaW5zdGVhZCBvZgogICAgICBOT19SU0EgaW4gc3NsL3MyKi5jLiAKLSAgICAgW0tyaXMgS2VubmF3YXkgPGtyaXNAaHViLmZyZWVic2Qub3JnPiwgbW9kaWZpZWQgYnkgVWxmIE32bGxlcl0KKyAgICAgW0tyaXMgS2VubmF3YXkgPGtyaXNAaHViLmZyZWVic2Qub3JnPiwgbW9kaWZpZWQgYnkgVWxmIE3DtmxsZXJdCiAKICAgKikgUHJlY2F1dGlvbnMgYWdhaW5zdCB1c2luZyB0aGUgUFJORyB1bmluaXRpYWxpemVkOiBSQU5EX2J5dGVzKCkgbm93CiAgICAgIGhhcyBhIHJldHVybiB2YWx1ZSB3aGljaCBpbmRpY2F0ZXMgdGhlIHF1YWxpdHkgb2YgdGhlIHJhbmRvbSBkYXRhCkBAIC04MDM1LDcgKzgxMTAsNyBAQAogICAgICBndWFyYW50ZWVkIHRvIGJlIHVuaXF1ZSBidXQgbm90IHVucHJlZGljdGFibGUuIFJBTkRfYWRkIGlzIGxpa2UKICAgICAgUkFORF9zZWVkLCBidXQgdGFrZXMgYW4gZXh0cmEgYXJndW1lbnQgZm9yIGFuIGVudHJvcHkgZXN0aW1hdGUKICAgICAgKFJBTkRfc2VlZCBhbHdheXMgYXNzdW1lcyBmdWxsIGVudHJvcHkpLgotICAgICBbVWxmIE32bGxlcl0KKyAgICAgW1VsZiBNw7ZsbGVyXQogCiAgICopIERvIG1vcmUgaXRlcmF0aW9ucyBvZiBSYWJpbi1NaWxsZXIgcHJvYmFibGUgcHJpbWUgdGVzdCAoc3BlY2lmaWNhbGx5LAogICAgICAzIGZvciAxMDI0LWJpdCBwcmltZXMsIDYgZm9yIDUxMi1iaXQgcHJpbWVzLCAxMiBmb3IgMjU2LWJpdCBwcmltZXMKQEAgLTgwNjUsNyArODE0MCw3IEBACiAgICAgIFtTdGV2ZSBIZW5zb25dCiAKICAgKikgSG9ub3IgdGhlIG5vLXh4eCBDb25maWd1cmUgb3B0aW9ucyB3aGVuIGNyZWF0aW5nIC5ERUYgZmlsZXMuCi0gICAgIFtVbGYgTfZsbGVyXQorICAgICBbVWxmIE3DtmxsZXJdCiAKICAgKikgQWRkIFBLQ1MjMTAgYXR0cmlidXRlcyB0byBmaWVsZCB0YWJsZTogY2hhbGxlbmdlUGFzc3dvcmQsIAogICAgICB1bnN0cnVjdHVyZWROYW1lIGFuZCB1bnN0cnVjdHVyZWRBZGRyZXNzLiBUaGVzZSBhcmUgdGFrZW4gZnJvbQpAQCAtODg5OSw3ICs4OTc0LDcgQEAKIAogICAqKSBNb3JlIERFUyBsaWJyYXJ5IGNsZWFudXBzOiByZW1vdmUgcmVmZXJlbmNlcyB0byBzcmFuZC9yYW5kIGFuZAogICAgICBkZWxldGUgYW4gdW51c2VkIGZpbGUuCi0gICAgIFtVbGYgTfZsbGVyXQorICAgICBbVWxmIE3DtmxsZXJdCiAKICAgKikgQWRkIHN1cHBvcnQgZm9yIHRoZSB0aGUgZnJlZSBOZXR3aWRlIGFzc2VtYmxlciAoTkFTTSkgdW5kZXIgV2luMzIsCiAgICAgIHNpbmNlIG5vdCBtYW55IHBlb3BsZSBoYXZlIE1BU00gKG1sKSBhbmQgaXQgY2FuIGJlIGhhcmQgdG8gb2J0YWluLgpAQCAtODk4OCw3ICs5MDYzLDcgQEAKICAgICAgd29ya2VkLgogCiAgICopIEZpeCBwcm9ibGVtcyB3aXRoIG5vLWhtYWMgZXRjLgotICAgICBbVWxmIE32bGxlciwgcG9pbnRlZCBvdXQgYnkgQnJpYW4gV2VsbGluZ3RvbiA8YndlbGxpbmdAdGlzbGFicy5jb20+XQorICAgICBbVWxmIE3DtmxsZXIsIHBvaW50ZWQgb3V0IGJ5IEJyaWFuIFdlbGxpbmd0b24gPGJ3ZWxsaW5nQHRpc2xhYnMuY29tPl0KIAogICAqKSBOZXcgZnVuY3Rpb25zIFJTQV9nZXRfZGVmYXVsdF9tZXRob2QoKSwgUlNBX3NldF9tZXRob2QoKSBhbmQKICAgICAgUlNBX2dldF9tZXRob2QoKS4gVGhlc2UgYWxsb3dzIHJlcGxhY2VtZW50IG9mIFJTQV9NRVRIT0RzIHdpdGhvdXQgaGF2aW5nCkBAIC05MTA1LDcgKzkxODAsNyBAQAogICAgICBbQmVuIExhdXJpZV0KIAogICAqKSBERVMgbGlicmFyeSBjbGVhbnVwcy4KLSAgICAgW1VsZiBN9mxsZXJdCisgICAgIFtVbGYgTcO2bGxlcl0KIAogICAqKSBBZGQgc3VwcG9ydCBmb3IgUEtDUyM1IHYyLjAgUEJFIGFsZ29yaXRobXMuIFRoaXMgd2lsbCBwZXJtaXQgUEtDUyM4IHRvIGJlCiAgICAgIHVzZWQgd2l0aCBhbnkgY2lwaGVyIHVubGlrZSBQS0NTIzUgdjEuNSB3aGljaCBjYW4gYXQgbW9zdCBoYW5kbGUgNjQgYml0CkBAIC05MTQ4LDcgKzkyMjMsNyBAQAogICAgICBbQ2hyaXN0aWFuIEZvcnN0ZXIgPGZvQGhhd28uc3R3LnVuaS1lcmxhbmdlbi5kZT5dCiAKICAgKikgY29uZmlnIG5vdyBnZW5lcmF0ZXMgbm8teHh4IG9wdGlvbnMgZm9yIG1pc3NpbmcgY2lwaGVycy4KLSAgICAgW1VsZiBN9mxsZXJdCisgICAgIFtVbGYgTcO2bGxlcl0KIAogICAqKSBTdXBwb3J0IHRoZSBFQkNESUMgY2hhcmFjdGVyIHNldCAod29yayBpbiBwcm9ncmVzcykuCiAgICAgIEZpbGUgZWJjZGljLmMgbm90IHlldCBpbmNsdWRlZCBiZWNhdXNlIGl0IGhhcyBhIGRpZmZlcmVudCBsaWNlbnNlLgpAQCAtOTI2MSw3ICs5MzM2LDcgQEAKICAgICAgW0JvZG8gTW9lbGxlcl0KIAogICAqKSBNb3ZlIG9wZW5zc2wuY25mIG91dCBvZiBsaWIvLgotICAgICBbVWxmIE32bGxlcl0KKyAgICAgW1VsZiBNw7ZsbGVyXQogCiAgICopIEZpeCB2YXJpb3VzIHRoaW5ncyB0byBsZXQgT3BlblNTTCBldmVuIHBhc3MgYGBlZ2NjIC1waXBlIC1PMiAtV2FsbAogICAgICAtV3NoYWRvdyAtV3BvaW50ZXItYXJpdGggLVdjYXN0LWFsaWduIC1XbWlzc2luZy1wcm90b3R5cGVzCkBAIC05MzE4LDEwICs5MzkzLDEwIEBACiAgICAgIFtCZW4gTGF1cmllXQogCiAgICopIFN1cHBvcnQgQm9ybGFuZCBDKysgYnVpbGRlci4KLSAgICAgW0phbmV6IEplcmUgPGpqQHZvaWQuc2k+LCBtb2RpZmllZCBieSBVbGYgTfZsbGVyXQorICAgICBbSmFuZXogSmVyZSA8ampAdm9pZC5zaT4sIG1vZGlmaWVkIGJ5IFVsZiBNw7ZsbGVyXQogCiAgICopIFN1cHBvcnQgTWluZ3czMi4KLSAgICAgW1VsZiBN9mxsZXJdCisgICAgIFtVbGYgTcO2bGxlcl0KIAogICAqKSBTSEEtMSBjbGVhbnVwcyBhbmQgcGVyZm9ybWFuY2UgZW5oYW5jZW1lbnRzLgogICAgICBbQW5keSBQb2x5YWtvdiA8YXBwcm9AZnkuY2hhbG1lcnMuc2U+XQpAQCAtOTMzMCw3ICs5NDA1LDcgQEAKICAgICAgW0FuZHkgUG9seWFrb3YgPGFwcHJvQGZ5LmNoYWxtZXJzLnNlPl0KIAogICAqKSBBY2NlcHQgYW55IC14eHggYW5kICt4eHggY29tcGlsZXIgb3B0aW9ucyBpbiBDb25maWd1cmUuCi0gICAgIFtVbGYgTfZsbGVyXQorICAgICBbVWxmIE3DtmxsZXJdCiAKICAgKikgVXBkYXRlIEhQVVggY29uZmlndXJhdGlvbi4KICAgICAgW0Fub255bW91c10KQEAgLTkzNjMsNyArOTQzOCw3IEBACiAgICAgIFtCb2RvIE1vZWxsZXJdCiAKICAgKikgT0FFUCBkZWNvZGluZyBidWcgZml4LgotICAgICBbVWxmIE32bGxlcl0KKyAgICAgW1VsZiBNw7ZsbGVyXQogCiAgICopIFN1cHBvcnQgSU5TVEFMTF9QUkVGSVggZm9yIHBhY2thZ2UgYnVpbGRlcnMsIGFzIHByb3Bvc2VkIGJ5CiAgICAgIERhdmlkIEhhcnJpcy4KQEAgLTkzODYsMjEgKzk0NjEsMjEgQEAKICAgICAgW05pZWxzIFBvcHBlIDxuaWVsc0BuZXRib3gub3JnPl0KIAogICAqKSBOZXcgQ29uZmlndXJlIG9wdGlvbiBuby08Y2lwaGVyPiAocnNhLCBpZGVhLCByYzUsIC4uLikuCi0gICAgIFtVbGYgTfZsbGVyXQorICAgICBbVWxmIE3DtmxsZXJdCiAKICAgKikgQWRkIHRoZSBQS0NTIzEyIEFQSSBkb2N1bWVudGF0aW9uIHRvIG9wZW5zc2wudHh0LiBQcmVsaW1pbmFyeSBzdXBwb3J0IGZvcgogICAgICBleHRlbnNpb24gYWRkaW5nIGluIHg1MDkgdXRpbGl0eS4KICAgICAgW1N0ZXZlIEhlbnNvbl0KIAogICAqKSBSZW1vdmUgTk9QUk9UTyBzZWN0aW9ucyBhbmQgZXJyb3IgY29kZSBjb21tZW50cy4KLSAgICAgW1VsZiBN9mxsZXJdCisgICAgIFtVbGYgTcO2bGxlcl0KIAogICAqKSBQYXJ0aWFsIHJld3JpdGUgb2YgdGhlIERFRiBmaWxlIGdlbmVyYXRvciB0byBub3cgcGFyc2UgdGhlIEFOU0kKICAgICAgcHJvdG90eXBlcy4KICAgICAgW1N0ZXZlIEhlbnNvbl0KIAogICAqKSBOZXcgQ29uZmlndXJlIG9wdGlvbnMgLS1wcmVmaXg9RElSIGFuZCAtLW9wZW5zc2xkaXI9RElSLgotICAgICBbVWxmIE32bGxlcl0KKyAgICAgW1VsZiBNw7ZsbGVyXQogCiAgICopIENvbXBsZXRlIHJld3JpdGUgb2YgdGhlIGVycm9yIGNvZGUgc2NyaXB0KHMpLiBJdCBpcyBhbGwgbm93IGhhbmRsZWQKICAgICAgYnkgb25lIHNjcmlwdCBhdCB0aGUgdG9wIGxldmVsIHdoaWNoIGhhbmRsZXMgZXJyb3IgY29kZSBnYXRoZXJpbmcsCkBAIC05NDI5LDcgKzk1MDQsNyBAQAogICAgICBbU3RldmUgSGVuc29uXQogCiAgICopIE1vdmUgdGhlIGF1dG9nZW5lcmF0ZWQgaGVhZGVyIGZpbGUgcGFydHMgdG8gY3J5cHRvL29wZW5zc2xjb25mLmguCi0gICAgIFtVbGYgTfZsbGVyXQorICAgICBbVWxmIE3DtmxsZXJdCiAKICAgKikgRml4IG5ldyA1Ni1iaXQgREVTIGV4cG9ydCBjaXBoZXJzdWl0ZXM6IHRoZXkgd2VyZSB1c2luZyA3IGJ5dGVzIGluc3RlYWQgb2YKICAgICAgOCBvZiBrZXlpbmcgbWF0ZXJpYWwuIE1lcmxpbiBoYXMgYWxzbyBjb25maXJtZWQgaW50ZXJvcCB3aXRoIHRoaXMgZml4CkBAIC05NDQ3LDEzICs5NTIyLDEzIEBACiAgICAgIFtBbmR5IFBvbHlha292IDxhcHByb0BmeS5jaGFsbWVycy5zZT5dCiAKICAgKikgQ2hhbmdlIGZ1bmN0aW9ucyB0byBBTlNJIEMuCi0gICAgIFtVbGYgTfZsbGVyXQorICAgICBbVWxmIE3DtmxsZXJdCiAKICAgKikgRml4IHR5cG9zIGluIGVycm9yIGNvZGVzLgotICAgICBbTWFydGluIEtyYWVtZXIgPE1hcnRpbi5LcmFlbWVyQE1jaFAuU2llbWVucy5EZT4sIFVsZiBN9mxsZXJdCisgICAgIFtNYXJ0aW4gS3JhZW1lciA8TWFydGluLktyYWVtZXJATWNoUC5TaWVtZW5zLkRlPiwgVWxmIE3DtmxsZXJdCiAKICAgKikgUmVtb3ZlIGRlZnVuY3QgYXNzZW1ibGVyIGZpbGVzIGZyb20gQ29uZmlndXJlLgotICAgICBbVWxmIE32bGxlcl0KKyAgICAgW1VsZiBNw7ZsbGVyXQogCiAgICopIFNQQVJDIHY4IGFzc2VtYmxlciBCSUdOVU0gaW1wbGVtZW50YXRpb24uCiAgICAgIFtBbmR5IFBvbHlha292IDxhcHByb0BmeS5jaGFsbWVycy5zZT5dCkBAIC05NDkwLDcgKzk1NjUsNyBAQAogICAgICBbU3RldmUgSGVuc29uXQogCiAgICopIE5ldyBDb25maWd1cmUgb3B0aW9uICJyc2FyZWYiLgotICAgICBbVWxmIE32bGxlcl0KKyAgICAgW1VsZiBNw7ZsbGVyXQogCiAgICopIERvbid0IGF1dG8tZ2VuZXJhdGUgcGVtLmguCiAgICAgIFtCb2RvIE1vZWxsZXJdCkBAIC05NTM4LDcgKzk2MTMsNyBAQAogCiAgICopIE5ldyBmdW5jdGlvbnMgRFNBX2RvX3NpZ24gYW5kIERTQV9kb192ZXJpZnkgdG8gcHJvdmlkZSBhY2Nlc3MgdG8KICAgICAgdGhlIHJhdyBEU0EgdmFsdWVzIHByaW9yIHRvIEFTTi4xIGVuY29kaW5nLgotICAgICBbVWxmIE32bGxlcl0KKyAgICAgW1VsZiBNw7ZsbGVyXQogCiAgICopIFR3ZWFrcyB0byBDb25maWd1cmUKICAgICAgW05pZWxzIFBvcHBlIDxuaWVsc0BuZXRib3gub3JnPl0KQEAgLTk1NDgsMTEgKzk2MjMsMTEgQEAKICAgICAgW1N0ZXZlIEhlbnNvbl0KIAogICAqKSBOZXcgdmFyaWFibGVzICQoUkFOTElCKSBhbmQgJChQRVJMKSBpbiB0aGUgTWFrZWZpbGVzLgotICAgICBbVWxmIE32bGxlcl0KKyAgICAgW1VsZiBNw7ZsbGVyXQogCiAgICopIE5ldyBjb25maWcgb3B0aW9uIHRvIGF2b2lkIGluc3RydWN0aW9ucyB0aGF0IGFyZSBpbGxlZ2FsIG9uIHRoZSA4MDM4Ni4KICAgICAgVGhlIGRlZmF1bHQgY29kZSBpcyBmYXN0ZXIsIGJ1dCByZXF1aXJlcyBhdCBsZWFzdCBhIDQ4Ni4KLSAgICAgW1VsZiBN9mxsZXJdCisgICAgIFtVbGYgTcO2bGxlcl0KICAgCiAgICopIEdvdCByaWQgb2Ygb2xkIFNTTDJfQ0xJRU5UX1ZFUlNJT04gKGluY29uc2lzdGVudGx5IHVzZWQpIGFuZAogICAgICBTU0wyX1NFUlZFUl9WRVJTSU9OIChub3QgdXNlZCBhdCBhbGwpIG1hY3Jvcywgd2hpY2ggYXJlIG5vdyB0aGUKQEAgLTEwMDkxLDcgKzEwMTY2LDcgQEAKICAgICAgIEhhZ2lubyA8aXRvanVuQGthbWUubmV0Pl0KIAogICAqKSBGaWxlIHdhcyBvcGVuZWQgaW5jb3JyZWN0bHkgaW4gcmFuZGZpbGUuYy4KLSAgICAgW1VsZiBN9mxsZXIgPHVsZkBmaXR1Zy5kZT5dCisgICAgIFtVbGYgTcO2bGxlciA8dWxmQGZpdHVnLmRlPl0KIAogICAqKSBCZWdpbm5pbmcgb2Ygc3VwcG9ydCBmb3IgR2VuZXJhbGl6ZWRUaW1lLiBkMmksIGkyZCwgY2hlY2sgYW5kIHByaW50CiAgICAgIGZ1bmN0aW9ucy4gQWxzbyBBU04xX1RJTUUgc3VpdGUgd2hpY2ggaXMgYSBDSE9JQ0Ugb2YgVVRDVGltZSBvcgpAQCAtMTAxMDEsNyArMTAxNzYsNyBAQAogICAgICBbU3RldmUgSGVuc29uXQogCiAgICopIENvcnJlY3QgTGludXggMSByZWNvZ25pdGlvbiBpbiBjb25maWcuCi0gICAgIFtVbGYgTfZsbGVyIDx1bGZAZml0dWcuZGU+XQorICAgICBbVWxmIE3DtmxsZXIgPHVsZkBmaXR1Zy5kZT5dCiAKICAgKikgUmVtb3ZlIHBvaW50bGVzcyBNRDUgaGFzaCB3aGVuIHVzaW5nIERTQSBrZXlzIGluIGNhLgogICAgICBbQW5vbnltb3VzIDxub2JvZHlAcmVwbGF5LmNvbT5dCkBAIC0xMDI0OCw3ICsxMDMyMyw3IEBACiAKICAgKikgRml4IHRoZSBSU0EgaGVhZGVyIGRlY2xhcmF0aW9ucyB0aGF0IGhpZCBhIGJ1ZyBJIGZpeGVkIGluIDAuOS4wYiBidXQKICAgICAgd2FzIGFscmVhZHkgZml4ZWQgYnkgRXJpYyBmb3IgMC45LjEgaXQgc2VlbXMuCi0gICAgIFtCZW4gTGF1cmllIC0gcG9pbnRlZCBvdXQgYnkgVWxmIE32bGxlciA8dWxmQGZpdHVnLmRlPl0KKyAgICAgW0JlbiBMYXVyaWUgLSBwb2ludGVkIG91dCBieSBVbGYgTcO2bGxlciA8dWxmQGZpdHVnLmRlPl0KIAogICAqKSBBdXRvZGV0ZWN0IEZyZWVCU0QzLgogICAgICBbQmVuIExhdXJpZV0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvQ09OVFJJQlVUSU5HIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9DT05UUklCVVRJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ2M2Q4YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvQ09OVFJJQlVUSU5HCkBAIC0wLDAgKzEsMzggQEAKK0hPVyBUTyBDT05UUklCVVRFIFRPIE9wZW5TU0wKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRGV2ZWxvcG1lbnQgaXMgY29vcmRpbmF0ZWQgb24gdGhlIG9wZW5zc2wtZGV2IG1haWxpbmcgbGlzdCAoc2VlCitodHRwOi8vd3d3Lm9wZW5zc2wub3JnIGZvciBpbmZvcm1hdGlvbiBvbiBzdWJzY3JpYmluZykuIElmIHlvdQord291bGQgbGlrZSB0byBzdWJtaXQgYSBwYXRjaCwgc2VuZCBpdCB0byBydEBvcGVuc3NsLm9yZyB3aXRoCit0aGUgc3RyaW5nICJbUEFUQ0hdIiBpbiB0aGUgc3ViamVjdC4gUGxlYXNlIGJlIHN1cmUgdG8gaW5jbHVkZSBhCit0ZXh0dWFsIGV4cGxhbmF0aW9uIG9mIHdoYXQgeW91ciBwYXRjaCBkb2VzLgorCitZb3UgY2FuIGFsc28gbWFrZSBHaXRIdWIgcHVsbCByZXF1ZXN0cy4gSWYgeW91IGRvIHRoaXMsIHBsZWFzZSBhbHNvIHNlbmQKK21haWwgdG8gcnRAb3BlbnNzbC5vcmcgd2l0aCBhIGJyaWVmIGRlc2NyaXB0aW9uIGFuZCBhIGxpbmsgdG8gdGhlIFBSIHNvCit0aGF0IHdlIGNhbiBtb3JlIGVhc2lseSBrZWVwIHRyYWNrIG9mIGl0LgorCitJZiB5b3UgYXJlIHVuc3VyZSBhcyB0byB3aGV0aGVyIGEgZmVhdHVyZSB3aWxsIGJlIHVzZWZ1bCBmb3IgdGhlIGdlbmVyYWwKK09wZW5TU0wgY29tbXVuaXR5IHBsZWFzZSBkaXNjdXNzIGl0IG9uIHRoZSBvcGVuc3NsLWRldiBtYWlsaW5nIGxpc3QgZmlyc3QuCitTb21lb25lIG1heSBiZSBhbHJlYWR5IHdvcmtpbmcgb24gdGhlIHNhbWUgdGhpbmcgb3IgdGhlcmUgbWF5IGJlIGEgZ29vZAorcmVhc29uIGFzIHRvIHdoeSB0aGF0IGZlYXR1cmUgaXNuJ3QgaW1wbGVtZW50ZWQuCisKK1BhdGNoZXMgc2hvdWxkIGJlIGFzIHVwIHRvIGRhdGUgYXMgcG9zc2libGUsIHByZWZlcmFibHkgcmVsYXRpdmUgdG8gdGhlCitjdXJyZW50IEdpdCBvciB0aGUgbGFzdCBzbmFwc2hvdC4gVGhleSBzaG91bGQgZm9sbG93IG91ciBjb2Rpbmcgc3R5bGUKKyhzZWUgaHR0cHM6Ly93d3cub3BlbnNzbC5vcmcvcG9saWNpZXMvY29kaW5nc3R5bGUuaHRtbCkgYW5kIGNvbXBpbGUgd2l0aG91dAord2FybmluZ3MgdXNpbmcgdGhlIC0tc3RyaWN0LXdhcm5pbmdzIGZsYWcuICBPcGVuU1NMIGNvbXBpbGVzIG9uIG1hbnkgdmFyaWVkCitwbGF0Zm9ybXM6IHRyeSB0byBlbnN1cmUgeW91IG9ubHkgdXNlIHBvcnRhYmxlIGZlYXR1cmVzLgorCitPdXIgcHJlZmVycmVkIGZvcm1hdCBmb3IgcGF0Y2ggZmlsZXMgaXMgImdpdCBmb3JtYXQtcGF0Y2giIG91dHB1dC4gRm9yIGV4YW1wbGUKK3RvIHByb3ZpZGUgYSBwYXRjaCBmaWxlIGNvbnRhaW5pbmcgdGhlIGxhc3QgY29tbWl0IGluIHlvdXIgbG9jYWwgZ2l0IHJlcG9zaXRvcnkKK3VzZSB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6CisKKyMgZ2l0IGZvcm1hdC1wYXRjaCAtLXN0ZG91dCBIRUFEXiA+bXlkaWZmcy5wYXRjaAorCitBbm90aGVyIG1ldGhvZCBvZiBjcmVhdGluZyBhbiBhY2NlcHRhYmxlIHBhdGNoIGZpbGUgd2l0aG91dCB1c2luZyBnaXQgaXMgYXMKK2ZvbGxvd3M6CisKKyMgY2Qgb3BlbnNzbC13b3JrCisjIFt5b3VyIGNoYW5nZXNdCisjIC4vQ29uZmlndXJlIGRpc3Q7IG1ha2UgY2xlYW4KKyMgY2QgLi4KKyMgZGlmZiAtdXIgb3BlbnNzbC1vcmlnIG9wZW5zc2wtd29yayA+IG15ZGlmZnMucGF0Y2gKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvQ29uZmlndXJlIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9Db25maWd1cmUKaW5kZXggNjBlYzM3OC4uMGE1ZmZhYyAxMDA3NTUKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9Db25maWd1cmUKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9Db25maWd1cmUKQEAgLTEwNSw2ICsxMDUsMTEgQEAKIAogbXkgJGdjY19kZXZ0ZWFtX3dhcm4gPSAiLVdhbGwgLXBlZGFudGljIC1EUEVEQU5USUMgLVduby1sb25nLWxvbmcgLVdzaWduLWNvbXBhcmUgLVdtaXNzaW5nLXByb3RvdHlwZXMgLVdzaGFkb3cgLVdmb3JtYXQgLVdlcnJvciAtRENSWVBUT19NREVCVUdfQUxMIC1EQ1JZUFRPX01ERUJVR19BQk9SVCAtRFJFRl9DSEVDSyAtRE9QRU5TU0xfTk9fREVQUkVDQVRFRCI7CiAKKyMgV2FybiB0aGF0ICJtYWtlIGRlcGVuZCIgc2hvdWxkIGJlIHJ1bj8KK215ICR3YXJuX21ha2VfZGVwZW5kID0gMDsKKworbXkgJGNsYW5nX2RldnRlYW1fd2FybiA9ICItV25vLXVudXNlZC1wYXJhbWV0ZXIgLVduby1taXNzaW5nLWZpZWxkLWluaXRpYWxpemVycyAtV25vLWxhbmd1YWdlLWV4dGVuc2lvbi10b2tlbiAtV25vLWV4dGVuZGVkLW9mZnNldG9mIC1RdW51c2VkLWFyZ3VtZW50cyI7CisKIG15ICRzdHJpY3Rfd2FybmluZ3MgPSAwOwogCiBteSAkeDg2X2djY19kZXM9IkRFU19QVFIgREVTX1JJU0MxIERFU19VTlJPTEwiOwpAQCAtMTk3LDYgKzIwMiw3IEBACiAiZGVidWctbGludXgtZ2VuZXJpYzMyIiwiZ2NjOi1EQk5fREVCVUcgLURSRUZfQ0hFQ0sgLURDT05GX0RFQlVHIC1EQ1JZUFRPX01ERUJVRyAtZyAtV2FsbDo6LURfUkVFTlRSQU5UOjotbGRsOkJOX0xMT05HIFJDNF9DSEFSIFJDNF9DSFVOSyBERVNfSU5UIERFU19VTlJPTEwgQkZfUFRSOiR7bm9fYXNtfTpkbGZjbjpsaW51eC1zaGFyZWQ6LWZQSUM6Oi5zby5cJChTSExJQl9NQUpPUikuXCQoU0hMSUJfTUlOT1IpIiwKICJkZWJ1Zy1saW51eC1nZW5lcmljNjQiLCJnY2M6LURCTl9ERUJVRyAtRFJFRl9DSEVDSyAtRENPTkZfREVCVUcgLURDUllQVE9fTURFQlVHIC1nIC1XYWxsOjotRF9SRUVOVFJBTlQ6Oi1sZGw6U0lYVFlfRk9VUl9CSVRfTE9ORyBSQzRfQ0hBUiBSQzRfQ0hVTksgREVTX0lOVCBERVNfVU5ST0xMIEJGX1BUUjoke25vX2FzbX06ZGxmY246bGludXgtc2hhcmVkOi1mUElDOjouc28uXCQoU0hMSUJfTUFKT1IpLlwkKFNITElCX01JTk9SKSIsCiAiZGVidWctbGludXgteDg2XzY0IiwiZ2NjOi1EQk5fREVCVUcgLURSRUZfQ0hFQ0sgLURDT05GX0RFQlVHIC1EQ1JZUFRPX01ERUJVRyAtbTY0IC1ETF9FTkRJQU4gLWcgLVdhbGw6Oi1EX1JFRU5UUkFOVDo6LWxkbDpTSVhUWV9GT1VSX0JJVF9MT05HIFJDNF9DSFVOSyBERVNfSU5UIERFU19VTlJPTEw6JHt4ODZfNjRfYXNtfTplbGY6ZGxmY246bGludXgtc2hhcmVkOi1mUElDOi1tNjQ6LnNvLlwkKFNITElCX01BSk9SKS5cJChTSExJQl9NSU5PUik6Ojo2NCIsCisiZGVidWctbGludXgteDg2XzY0LWNsYW5nIiwiY2xhbmc6IC1EQk5fREVCVUcgLURSRUZfQ0hFQ0sgLURDT05GX0RFQlVHIC1EQ1JZUFRPX01ERUJVRyAtbTY0IC1ETF9FTkRJQU4gLWcgLVdhbGwgLVF1bnVzZWQtYXJndW1lbnRzOjotRF9SRUVOVFJBTlQ6Oi1sZGw6U0lYVFlfRk9VUl9CSVRfTE9ORyBSQzRfQ0hVTksgREVTX0lOVCBERVNfVU5ST0xMOiR7eDg2XzY0X2FzbX06ZWxmOmRsZmNuOmxpbnV4LXNoYXJlZDotZlBJQzotbTY0Oi5zby5cJChTSExJQl9NQUpPUikuXCQoU0hMSUJfTUlOT1IpOjo6NjQiLAogImRpc3QiLAkJImNjOi1POjoodW5rbm93bik6Ojo6OjoiLAogCiAjIEJhc2ljIGNvbmZpZ3MgdGhhdCBzaG91bGQgd29yayBvbiBhbnkgKDMyIGFuZCBsZXNzIGJpdCkgYm94CkBAIC0zNjEsNiArMzY3LDcgQEAKICJsaW51eC1pYTY0LWVjYyIsImVjYzotRExfRU5ESUFOIC1PMiAtV2FsbCAtbm9fY3BwcnQ6Oi1EX1JFRU5UUkFOVDo6LWxkbDpTSVhUWV9GT1VSX0JJVF9MT05HIFJDNF9DSFVOSyBERVNfSU5UOiR7aWE2NF9hc219OmRsZmNuOmxpbnV4LXNoYXJlZDotZlBJQzo6LnNvLlwkKFNITElCX01BSk9SKS5cJChTSExJQl9NSU5PUikiLAogImxpbnV4LWlhNjQtaWNjIiwiaWNjOi1ETF9FTkRJQU4gLU8yIC1XYWxsIC1ub19jcHBydDo6LURfUkVFTlRSQU5UOjotbGRsOlNJWFRZX0ZPVVJfQklUX0xPTkcgUkM0X0NIVU5LIERFU19SSVNDMSBERVNfSU5UOiR7aWE2NF9hc219OmRsZmNuOmxpbnV4LXNoYXJlZDotZlBJQzo6LnNvLlwkKFNITElCX01BSk9SKS5cJChTSExJQl9NSU5PUikiLAogImxpbnV4LXg4Nl82NCIsCSJnY2M6LW02NCAtRExfRU5ESUFOIC1PMyAtV2FsbDo6LURfUkVFTlRSQU5UOjotbGRsOlNJWFRZX0ZPVVJfQklUX0xPTkcgUkM0X0NIVU5LIERFU19JTlQgREVTX1VOUk9MTDoke3g4Nl82NF9hc219OmVsZjpkbGZjbjpsaW51eC1zaGFyZWQ6LWZQSUM6LW02NDouc28uXCQoU0hMSUJfTUFKT1IpLlwkKFNITElCX01JTk9SKTo6OjY0IiwKKyJsaW51eC14ODZfNjQtY2xhbmciLCJjbGFuZzogLW02NCAtRExfRU5ESUFOIC1PMyAtV2FsbCAtUXVudXNlZC1hcmd1bWVudHM6Oi1EX1JFRU5UUkFOVDo6LWxkbDpTSVhUWV9GT1VSX0JJVF9MT05HIFJDNF9DSFVOSyBERVNfSU5UIERFU19VTlJPTEw6JHt4ODZfNjRfYXNtfTplbGY6ZGxmY246bGludXgtc2hhcmVkOi1mUElDOi1tNjQ6LnNvLlwkKFNITElCX01BSk9SKS5cJChTSExJQl9NSU5PUik6Ojo2NCIsCiAibGludXg2NC1zMzkweCIsCSJnY2M6LW02NCAtREJfRU5ESUFOIC1PMyAtV2FsbDo6LURfUkVFTlRSQU5UOjotbGRsOlNJWFRZX0ZPVVJfQklUX0xPTkcgUkM0X0NIQVIgUkM0X0NIVU5LIERFU19JTlQgREVTX1VOUk9MTDoke3MzOTB4X2FzbX06NjQ6ZGxmY246bGludXgtc2hhcmVkOi1mUElDOi1tNjQ6LnNvLlwkKFNITElCX01BSk9SKS5cJChTSExJQl9NSU5PUik6Ojo2NCIsCiAjIyMjIFNvIGNhbGxlZCAiaGlnaGdwcnMiIHRhcmdldCBmb3Igei9BcmNoaXRlY3R1cmUgQ1BVcwogIyAiSGlnaGdwcnMiIGlzIGtlcm5lbCBmZWF0dXJlIGZpcnN0IGltcGxlbWVudGVkIGluIExpbnV4IDIuNi4zMiwgc2VlCkBAIC0xNDQyLDcgKzE0NDksNyBAQAogIyBsaW5rZXIgb25seSB3aGVuIC0tcHJlZml4IGlzIG5vdCAvdXNyLgogaWYgKCR0YXJnZXQgPX4gL15CU0RcLS8pCiAJewotCSRzaGFyZWRfbGRmbGFnLj0iIC1XbCwtcnBhdGgsXCQoTElCUlBBVEgpIiBpZiAoJHByZWZpeCAhfiBtfF4vdXNyWy9dKiR8KTsKKwkkc2hhcmVkX2xkZmxhZy49IiAtV2wsLXJwYXRoLFwkXCQoTElCUlBBVEgpIiBpZiAoJHByZWZpeCAhfiBtfF4vdXNyWy9dKiR8KTsKIAl9CiAKIGlmICgkc3lzX2lkIG5lICIiKQpAQCAtMTU3NCwxMSArMTU4MSwyMCBAQAogCiBpZiAoJHN0cmljdF93YXJuaW5ncykKIAl7CisJbXkgJGVjYyA9ICRjYzsKKwkkZWNjID0gImNsYW5nIiBpZiBgJGNjIC0tdmVyc2lvbiAyPiYxYCA9fiAvY2xhbmcvOwogCW15ICR3b3B0OwotCWRpZSAiRVJST1IgLS1zdHJpY3Qtd2FybmluZ3MgcmVxdWlyZXMgZ2NjIiB1bmxlc3MgKCRjYyA9fiAvZ2NjJC8pOworCWRpZSAiRVJST1IgLS1zdHJpY3Qtd2FybmluZ3MgcmVxdWlyZXMgZ2NjIG9yIGNsYW5nIiB1bmxlc3MgKCRlY2MgPX4gL2djYyQvIG9yICRlY2MgPX4gL2NsYW5nJC8pOwogCWZvcmVhY2ggJHdvcHQgKHNwbGl0IC9ccysvLCAkZ2NjX2RldnRlYW1fd2FybikKIAkJewotCQkkY2ZsYWdzIC49ICIgJHdvcHQiIHVubGVzcyAoJGNmbGFncyA9fiAvJHdvcHQvKQorCQkkY2ZsYWdzIC49ICIgJHdvcHQiIHVubGVzcyAoJGNmbGFncyA9fiAvKF58XHMpJHdvcHQoXHN8JCkvKQorCQl9CisJaWYgKCRlY2MgZXEgImNsYW5nIikKKwkJeworCQlmb3JlYWNoICR3b3B0IChzcGxpdCAvXHMrLywgJGNsYW5nX2RldnRlYW1fd2FybikKKwkJCXsKKwkJCSRjZmxhZ3MgLj0gIiAkd29wdCIgdW5sZXNzICgkY2ZsYWdzID1+IC8oXnxccykkd29wdChcc3wkKS8pCisJCQl9CiAJCX0KIAl9CiAKQEAgLTE5NDAsMTQgKzE5NTYsOCBAQAogCSAgICAmZG9maWxlKCJhcHBzL0NBLnBsIiwnL3Vzci9sb2NhbC9iaW4vcGVybCcsJ14jIS8nLCAnIyElcycpOwogCX0KIAlpZiAoJGRlcGZsYWdzIG5lICRkZWZhdWx0X2RlcGZsYWdzICYmICEkbWFrZV9kZXBlbmQpIHsKLQkJcHJpbnQgPDxFT0Y7Ci0KLVNpbmNlIHlvdSd2ZSBkaXNhYmxlZCBvciBlbmFibGVkIGF0IGxlYXN0IG9uZSBhbGdvcml0aG0sIHlvdSBuZWVkIHRvIGRvCi10aGUgZm9sbG93aW5nIGJlZm9yZSBidWlsZGluZzoKLQotCW1ha2UgZGVwZW5kCi1FT0YKLQl9CisgICAgICAgICAgICAkd2Fybl9tYWtlX2RlcGVuZCsrOworICAgICAgICB9CiB9CiAKICMgY3JlYXRlIHRoZSBtcy92ZXJzaW9uMzIucmMgZmlsZSBpZiBuZWVkZWQKQEAgLTIwMjYsMTIgKzIwMzYsMTggQEAKIAogcHJpbnQgPDxcRU9GIGlmICgkbm9fc2hhcmVkX3dhcm4pOwogCi1Zb3UgZ2F2ZSB0aGUgb3B0aW9uICdzaGFyZWQnLiAgTm9ybWFsbHksIHRoYXQgd291bGQgZ2l2ZSB5b3Ugc2hhcmVkIGxpYnJhcmllcy4KLVVuZm9ydHVuYXRlbHksIHRoZSBPcGVuU1NMIGNvbmZpZ3VyYXRpb24gZG9lc24ndCBpbmNsdWRlIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQKLWZvciB0aGlzIHBsYXRmb3JtIHlldCwgc28gaXQgd2lsbCBwcmV0ZW5kIHlvdSBnYXZlIHRoZSBvcHRpb24gJ25vLXNoYXJlZCcuICBJZgoteW91IGNhbiBpbmZvcm0gdGhlIGRldmVsb3BwZXJzIChvcGVuc3NsLWRldlxAb3BlbnNzbC5vcmcpIGhvdyB0byBzdXBwb3J0IHNoYXJlZAotbGlicmFyaWVzIG9uIHRoaXMgcGxhdGZvcm0sIHRoZXkgd2lsbCBhdCBsZWFzdCBsb29rIGF0IGl0IGFuZCB0cnkgdGhlaXIgYmVzdAotKGJ1dCBwbGVhc2UgZmlyc3QgbWFrZSBzdXJlIHlvdSBoYXZlIHRyaWVkIHdpdGggYSBjdXJyZW50IHZlcnNpb24gb2YgT3BlblNTTCkuCitZb3UgZ2F2ZSB0aGUgb3B0aW9uICdzaGFyZWQnLCB3aGljaCBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcGxhdGZvcm0sIHNvCit3ZSB3aWxsIHByZXRlbmQgeW91IGdhdmUgdGhlIG9wdGlvbiAnbm8tc2hhcmVkJy4gIElmIHlvdSBrbm93IGhvdyB0byBpbXBsZW1lbnQKK3NoYXJlZCBsaWJyYXJpZXMsIHBsZWFzZSBsZXQgdXMga25vdyAoYnV0IHBsZWFzZSBmaXJzdCBtYWtlIHN1cmUgeW91IGhhdmUKK3RyaWVkIHdpdGggYSBjdXJyZW50IHZlcnNpb24gb2YgT3BlblNTTCkuCitFT0YKKworcHJpbnQgPDxFT0YgaWYgKCR3YXJuX21ha2VfZGVwZW5kKTsKKworKioqIEJlY2F1c2Ugb2YgY29uZmlndXJhdGlvbiBjaGFuZ2VzLCB5b3UgTVVTVCBkbyB0aGUgZm9sbG93aW5nIGJlZm9yZQorKioqIGJ1aWxkaW5nOgorCisJbWFrZSBkZXBlbmQKIEVPRgogCiBleGl0KDApOwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9GQVEgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL0ZBUQppbmRleCBmOGVhNjA0Li4yMmM1Y2Y3IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL0ZBUQorKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL0ZBUQpAQCAtMSwxMDM5ICsxLDIgQEAKLU9wZW5TU0wgIC0gIEZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1bTUlTQ10gTWlzY2VsbGFuZW91cyBxdWVzdGlvbnMKLQotKiBXaGljaCBpcyB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIE9wZW5TU0w/Ci0qIFdoZXJlIGlzIHRoZSBkb2N1bWVudGF0aW9uPwotKiBIb3cgY2FuIEkgY29udGFjdCB0aGUgT3BlblNTTCBkZXZlbG9wZXJzPwotKiBXaGVyZSBjYW4gSSBnZXQgYSBjb21waWxlZCB2ZXJzaW9uIG9mIE9wZW5TU0w/Ci0qIFdoeSBhcmVuJ3QgdG9vbHMgbGlrZSAnYXV0b2NvbmYnIGFuZCAnbGlidG9vbCcgdXNlZD8KLSogV2hhdCBpcyBhbiAnZW5naW5lJyB2ZXJzaW9uPwotKiBIb3cgZG8gSSBjaGVjayB0aGUgYXV0aGVudGljaXR5IG9mIHRoZSBPcGVuU1NMIGRpc3RyaWJ1dGlvbj8KLSogSG93IGRvZXMgdGhlIHZlcnNpb25pbmcgc2NoZW1lIHdvcms/Ci0KLVtMRUdBTF0gTGVnYWwgcXVlc3Rpb25zCi0KLSogRG8gSSBuZWVkIHBhdGVudCBsaWNlbnNlcyB0byB1c2UgT3BlblNTTD8KLSogQ2FuIEkgdXNlIE9wZW5TU0wgd2l0aCBHUEwgc29mdHdhcmU/IAotCi1bVVNFUl0gUXVlc3Rpb25zIG9uIHVzaW5nIHRoZSBPcGVuU1NMIGFwcGxpY2F0aW9ucwotCi0qIFdoeSBkbyBJIGdldCBhICJQUk5HIG5vdCBzZWVkZWQiIGVycm9yIG1lc3NhZ2U/Ci0qIFdoeSBkbyBJIGdldCBhbiAidW5hYmxlIHRvIHdyaXRlICdyYW5kb20gc3RhdGUnIiBlcnJvciBtZXNzYWdlPwotKiBIb3cgZG8gSSBjcmVhdGUgY2VydGlmaWNhdGVzIG9yIGNlcnRpZmljYXRlIHJlcXVlc3RzPwotKiBXaHkgY2FuJ3QgSSBjcmVhdGUgY2VydGlmaWNhdGUgcmVxdWVzdHM/Ci0qIFdoeSBkb2VzIDxTU0wgcHJvZ3JhbT4gZmFpbCB3aXRoIGEgY2VydGlmaWNhdGUgdmVyaWZ5IGVycm9yPwotKiBXaHkgY2FuIEkgb25seSB1c2Ugd2VhayBjaXBoZXJzIHdoZW4gSSBjb25uZWN0IHRvIGEgc2VydmVyIHVzaW5nIE9wZW5TU0w/Ci0qIEhvdyBjYW4gSSBjcmVhdGUgRFNBIGNlcnRpZmljYXRlcz8KLSogV2h5IGNhbid0IEkgbWFrZSBhbiBTU0wgY29ubmVjdGlvbiB1c2luZyBhIERTQSBjZXJ0aWZpY2F0ZT8KLSogSG93IGNhbiBJIHJlbW92ZSB0aGUgcGFzc3BocmFzZSBvbiBhIHByaXZhdGUga2V5PwotKiBXaHkgY2FuJ3QgSSB1c2UgT3BlblNTTCBjZXJ0aWZpY2F0ZXMgd2l0aCBTU0wgY2xpZW50IGF1dGhlbnRpY2F0aW9uPwotKiBXaHkgZG9lcyBteSBicm93c2VyIGdpdmUgYSB3YXJuaW5nIGFib3V0IGEgbWlzbWF0Y2hlZCBob3N0bmFtZT8KLSogSG93IGRvIEkgaW5zdGFsbCBhIENBIGNlcnRpZmljYXRlIGludG8gYSBicm93c2VyPwotKiBXaHkgaXMgT3BlblNTTCB4NTA5IEROIG91dHB1dCBub3QgY29uZm9ybWFudCB0byBSRkMyMjUzPwotKiBXaGF0IGlzIGEgIjEyOCBiaXQgY2VydGlmaWNhdGUiPyBDYW4gSSBjcmVhdGUgb25lIHdpdGggT3BlblNTTD8KLSogV2h5IGRvZXMgT3BlblNTTCBzZXQgdGhlIGF1dGhvcml0eSBrZXkgaWRlbnRpZmllciBleHRlbnNpb24gaW5jb3JyZWN0bHk/Ci0qIEhvdyBjYW4gSSBzZXQgdXAgYSBidW5kbGUgb2YgY29tbWVyY2lhbCByb290IENBIGNlcnRpZmljYXRlcz8KLQotW0JVSUxEXSBRdWVzdGlvbnMgYWJvdXQgYnVpbGRpbmcgYW5kIHRlc3RpbmcgT3BlblNTTAotCi0qIFdoeSBkb2VzIHRoZSBsaW5rZXIgY29tcGxhaW4gYWJvdXQgdW5kZWZpbmVkIHN5bWJvbHM/Ci0qIFdoeSBkb2VzIHRoZSBPcGVuU1NMIHRlc3QgZmFpbCB3aXRoICJiYzogY29tbWFuZCBub3QgZm91bmQiPwotKiBXaHkgZG9lcyB0aGUgT3BlblNTTCB0ZXN0IGZhaWwgd2l0aCAiYmM6IDEgbm8gaW1wbGVtZW50ZWQiPwotKiBXaHkgZG9lcyB0aGUgT3BlblNTTCB0ZXN0IGZhaWwgd2l0aCAiYmM6IHN0YWNrIGVtcHR5Ij8KLSogV2h5IGRvZXMgdGhlIE9wZW5TU0wgY29tcGlsYXRpb24gZmFpbCBvbiBBbHBoYSBUcnU2NCBVbml4PwotKiBXaHkgZG9lcyB0aGUgT3BlblNTTCBjb21waWxhdGlvbiBmYWlsIHdpdGggImFyOiBjb21tYW5kIG5vdCBmb3VuZCI/Ci0qIFdoeSBkb2VzIHRoZSBPcGVuU1NMIGNvbXBpbGF0aW9uIGZhaWwgb24gV2luMzIgd2l0aCBWQysrPwotKiBXaGF0IGlzIHNwZWNpYWwgYWJvdXQgT3BlblNTTCBvbiBSZWRoYXQ/Ci0qIFdoeSBkb2VzIHRoZSBPcGVuU1NMIGNvbXBpbGF0aW9uIGZhaWwgb24gTWFjT1MgWD8KLSogV2h5IGRvZXMgdGhlIE9wZW5TU0wgdGVzdCBzdWl0ZSBmYWlsIG9uIE1hY09TIFg/Ci0qIFdoeSBkb2VzIHRoZSBPcGVuU1NMIHRlc3Qgc3VpdGUgZmFpbCBpbiBCTl9zcXIgdGVzdCBbb24gYSA2NC1iaXQgcGxhdGZvcm1dPwotKiBXaHkgZG9lcyBPcGVuQlNELWkzODYgYnVpbGQgZmFpbCBvbiBkZXMtNTg2LnMgd2l0aCAiVW5pbXBsZW1lbnRlZCBzZWdtZW50IHR5cGUiPwotKiBXaHkgZG9lcyB0aGUgT3BlblNTTCB0ZXN0IHN1aXRlIGZhaWwgaW4gc2hhNTEydCBvbiB4ODYgQ1BVPwotKiBXaHkgZG9lcyBjb21waWxlciBmYWlsIHRvIGNvbXBpbGUgc2hhNTEyLmM/Ci0qIFRlc3Qgc3VpdGUgc3RpbGwgZmFpbHMsIHdoYXQgdG8gZG8/Ci0qIEkgdGhpbmsgSSd2ZSBmb3VuZCBhIGJ1Zywgd2hhdCBzaG91bGQgSSBkbz8KLSogSSdtIFNVUkUgSSd2ZSBmb3VuZCBhIGJ1ZywgaG93IGRvIEkgcmVwb3J0IGl0PwotKiBJJ3ZlIGZvdW5kIGEgc2VjdXJpdHkgaXNzdWUsIGhvdyBkbyBJIHJlcG9ydCBpdD8KLQotW1BST0ddIFF1ZXN0aW9ucyBhYm91dCBwcm9ncmFtbWluZyB3aXRoIE9wZW5TU0wKLQotKiBJcyBPcGVuU1NMIHRocmVhZC1zYWZlPwotKiBJJ3ZlIGNvbXBpbGVkIGEgcHJvZ3JhbSB1bmRlciBXaW5kb3dzIGFuZCBpdCBjcmFzaGVzOiB3aHk/Ci0qIEhvdyBkbyBJIHJlYWQgb3Igd3JpdGUgYSBERVIgZW5jb2RlZCBidWZmZXIgdXNpbmcgdGhlIEFTTjEgZnVuY3Rpb25zPwotKiBPcGVuU1NMIHVzZXMgREVSIGJ1dCBJIG5lZWQgQkVSIGZvcm1hdDogZG9lcyBPcGVuU1NMIHN1cHBvcnQgQkVSPwotKiBJJ3ZlIHRyaWVkIHVzaW5nIDxNX3NvbWVfZXZpbF9wa2NzMTJfbWFjcm8+IGFuZCBJIGdldCBlcnJvcnMgd2h5PwotKiBJJ3ZlIGNhbGxlZCA8c29tZSBmdW5jdGlvbj4gYW5kIGl0IGZhaWxzLCB3aHk/Ci0qIEkganVzdCBnZXQgYSBsb2FkIG9mIG51bWJlcnMgZm9yIHRoZSBlcnJvciBvdXRwdXQsIHdoYXQgZG8gdGhleSBtZWFuPwotKiBXaHkgZG8gSSBnZXQgZXJyb3JzIGFib3V0IHVua25vd24gYWxnb3JpdGhtcz8KLSogV2h5IGNhbid0IHRoZSBPcGVuU1NIIGNvbmZpZ3VyZSBzY3JpcHQgZGV0ZWN0IE9wZW5TU0w/Ci0qIENhbiBJIHVzZSBPcGVuU1NMJ3MgU1NMIGxpYnJhcnkgd2l0aCBub24tYmxvY2tpbmcgSS9PPwotKiBXaHkgZG9lc24ndCBteSBzZXJ2ZXIgYXBwbGljYXRpb24gcmVjZWl2ZSBhIGNsaWVudCBjZXJ0aWZpY2F0ZT8KLSogV2h5IGRvZXMgY29tcGlsYXRpb24gZmFpbCBkdWUgdG8gYW4gdW5kZWZpbmVkIHN5bWJvbCBOSURfdW5pcXVlSWRlbnRpZmllcj8KLSogSSB0aGluayBJJ3ZlIGRldGVjdGVkIGEgbWVtb3J5IGxlYWssIGlzIHRoaXMgYSBidWc/Ci0qIFdoeSBkb2VzIFZhbGdyaW5kIGNvbXBsYWluIGFib3V0IHRoZSB1c2Ugb2YgdW5pbml0aWFsaXplZCBkYXRhPwotKiBXaHkgZG9lc24ndCBhIG1lbW9yeSBCSU8gd29yayB3aGVuIGEgZmlsZSBkb2VzPwotKiBXaGVyZSBhcmUgdGhlIGRlY2xhcmF0aW9ucyBhbmQgaW1wbGVtZW50YXRpb25zIG9mIGQyaV9YNTA5KCkgZXRjPwotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVtNSVNDXSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotKiBXaGljaCBpcyB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIE9wZW5TU0w/Ci0KLVRoZSBjdXJyZW50IHZlcnNpb24gaXMgYXZhaWxhYmxlIGZyb20gPFVSTDogaHR0cDovL3d3dy5vcGVuc3NsLm9yZz4uCi1PcGVuU1NMIDEuMC4xZSB3YXMgcmVsZWFzZWQgb24gRmViIDExdGgsIDIwMTMuCi0KLUluIGFkZGl0aW9uIHRvIHRoZSBjdXJyZW50IHN0YWJsZSByZWxlYXNlLCB5b3UgY2FuIGFsc28gYWNjZXNzIGRhaWx5Ci1zbmFwc2hvdHMgb2YgdGhlIE9wZW5TU0wgZGV2ZWxvcG1lbnQgdmVyc2lvbiBhdCA8VVJMOgotZnRwOi8vZnRwLm9wZW5zc2wub3JnL3NuYXBzaG90Lz4sIG9yIGdldCBpdCBieSBhbm9ueW1vdXMgR2l0IGFjY2Vzcy4KLQotCi0qIFdoZXJlIGlzIHRoZSBkb2N1bWVudGF0aW9uPwotCi1PcGVuU1NMIGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIGNyeXB0b2dyYXBoaWMgZnVuY3Rpb25hbGl0eSB0bwotYXBwbGljYXRpb25zIHN1Y2ggYXMgc2VjdXJlIHdlYiBzZXJ2ZXJzLiAgQmUgc3VyZSB0byByZWFkIHRoZQotZG9jdW1lbnRhdGlvbiBvZiB0aGUgYXBwbGljYXRpb24geW91IHdhbnQgdG8gdXNlLiAgVGhlIElOU1RBTEwgZmlsZQotZXhwbGFpbnMgaG93IHRvIGluc3RhbGwgdGhpcyBsaWJyYXJ5LgotCi1PcGVuU1NMIGluY2x1ZGVzIGEgY29tbWFuZCBsaW5lIHV0aWxpdHkgdGhhdCBjYW4gYmUgdXNlZCB0byBwZXJmb3JtIGEKLXZhcmlldHkgb2YgY3J5cHRvZ3JhcGhpYyBmdW5jdGlvbnMuICBJdCBpcyBkZXNjcmliZWQgaW4gdGhlIG9wZW5zc2woMSkKLW1hbnBhZ2UuICBEb2N1bWVudGF0aW9uIGZvciBkZXZlbG9wZXJzIGlzIGN1cnJlbnRseSBiZWluZyB3cml0dGVuLiBNYW55Ci1tYW51YWwgcGFnZXMgYXJlIGF2YWlsYWJsZTsgb3ZlcnZpZXdzIG92ZXIgbGliY3J5cHRvIGFuZAotbGlic3NsIGFyZSBnaXZlbiBpbiB0aGUgY3J5cHRvKDMpIGFuZCBzc2woMykgbWFucGFnZXMuCi0KLVRoZSBPcGVuU1NMIG1hbnBhZ2VzIGFyZSBpbnN0YWxsZWQgaW4gL3Vzci9sb2NhbC9zc2wvbWFuLyAob3IgYQotZGlmZmVyZW50IGRpcmVjdG9yeSBpZiB5b3Ugc3BlY2lmaWVkIG9uZSBhcyBkZXNjcmliZWQgaW4gSU5TVEFMTCkuCi1JbiBhZGRpdGlvbiwgeW91IGNhbiByZWFkIHRoZSBtb3N0IGN1cnJlbnQgdmVyc2lvbnMgYXQKLTxVUkw6IGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvZG9jcy8+LiBOb3RlIHRoYXQgdGhlIG9ubGluZSBkb2N1bWVudHMgcmVmZXIKLXRvIHRoZSB2ZXJ5IGxhdGVzdCBkZXZlbG9wbWVudCB2ZXJzaW9ucyBvZiBPcGVuU1NMIGFuZCBtYXkgaW5jbHVkZSBmZWF0dXJlcwotbm90IHByZXNlbnQgaW4gcmVsZWFzZWQgdmVyc2lvbnMuIElmIGluIGRvdWJ0IHJlZmVyIHRvIHRoZSBkb2N1bWVudGF0aW9uCi10aGF0IGNhbWUgd2l0aCB0aGUgdmVyc2lvbiBvZiBPcGVuU1NMIHlvdSBhcmUgdXNpbmcuIFRoZSBwb2QgZm9ybWF0Ci1kb2N1bWVudGF0aW9uIGlzIGluY2x1ZGVkIGluIGVhY2ggT3BlblNTTCBkaXN0cmlidXRpb24gdW5kZXIgdGhlIGRvY3MKLWRpcmVjdG9yeS4KLQotVGhlcmUgaXMgc29tZSBkb2N1bWVudGF0aW9uIGFib3V0IGNlcnRpZmljYXRlIGV4dGVuc2lvbnMgYW5kIFBLQ1MjMTIKLWluIGRvYy9vcGVuc3NsLnR4dAotCi1UaGUgb3JpZ2luYWwgU1NMZWF5IGRvY3VtZW50YXRpb24gaXMgaW5jbHVkZWQgaW4gT3BlblNTTCBhcwotZG9jL3NzbGVheS50eHQuICBJdCBtYXkgYmUgdXNlZnVsIHdoZW4gbm9uZSBvZiB0aGUgb3RoZXIgcmVzb3VyY2VzCi1oZWxwLCBidXQgcGxlYXNlIG5vdGUgdGhhdCBpdCByZWZsZWN0cyB0aGUgb2Jzb2xldGUgdmVyc2lvbiBTU0xlYXkKLTAuNi42LgotCi0KLSogSG93IGNhbiBJIGNvbnRhY3QgdGhlIE9wZW5TU0wgZGV2ZWxvcGVycz8KLQotVGhlIFJFQURNRSBmaWxlIGRlc2NyaWJlcyBob3cgdG8gc3VibWl0IGJ1ZyByZXBvcnRzIGFuZCBwYXRjaGVzIHRvCi1PcGVuU1NMLiAgSW5mb3JtYXRpb24gb24gdGhlIE9wZW5TU0wgbWFpbGluZyBsaXN0cyBpcyBhdmFpbGFibGUgZnJvbQotPFVSTDogaHR0cDovL3d3dy5vcGVuc3NsLm9yZz4uCi0KLQotKiBXaGVyZSBjYW4gSSBnZXQgYSBjb21waWxlZCB2ZXJzaW9uIG9mIE9wZW5TU0w/Ci0KLVlvdSBjYW4gZmluZGVyIHBvaW50ZXJzIHRvIGJpbmFyeSBkaXN0cmlidXRpb25zIGluCi08VVJMOiBodHRwOi8vd3d3Lm9wZW5zc2wub3JnL3JlbGF0ZWQvYmluYXJpZXMuaHRtbD4gLgotCi1Tb21lIGFwcGxpY2F0aW9ucyB0aGF0IHVzZSBPcGVuU1NMIGFyZSBkaXN0cmlidXRlZCBpbiBiaW5hcnkgZm9ybS4KLVdoZW4gdXNpbmcgc3VjaCBhbiBhcHBsaWNhdGlvbiwgeW91IGRvbid0IG5lZWQgdG8gaW5zdGFsbCBPcGVuU1NMCi15b3Vyc2VsZjsgdGhlIGFwcGxpY2F0aW9uIHdpbGwgaW5jbHVkZSB0aGUgcmVxdWlyZWQgcGFydHMgKGUuZy4gRExMcykuCi0KLUlmIHlvdSB3YW50IHRvIGJ1aWxkIE9wZW5TU0wgb24gYSBXaW5kb3dzIHN5c3RlbSBhbmQgeW91IGRvbid0IGhhdmUKLWEgQyBjb21waWxlciwgcmVhZCB0aGUgIk1pbmd3MzIiIHNlY3Rpb24gb2YgSU5TVEFMTC5XMzIgZm9yIGluZm9ybWF0aW9uCi1vbiBob3cgdG8gb2J0YWluIGFuZCBpbnN0YWxsIHRoZSBmcmVlIEdOVSBDIGNvbXBpbGVyLgotCi1BIG51bWJlciBvZiBMaW51eCBhbmQgKkJTRCBkaXN0cmlidXRpb25zIGluY2x1ZGUgT3BlblNTTC4KLQotCi0qIFdoeSBhcmVuJ3QgdG9vbHMgbGlrZSAnYXV0b2NvbmYnIGFuZCAnbGlidG9vbCcgdXNlZD8KLQotYXV0b2NvbmYgd2lsbCBwcm9iYWJseSBiZSB1c2VkIGluIGZ1dHVyZSBPcGVuU1NMIHZlcnNpb25zLiBJZiBpdCB3YXMKLWxlc3MgVW5peC1jZW50cmljLCBpdCBtaWdodCBoYXZlIGJlZW4gdXNlZCBtdWNoIGVhcmxpZXIuCi0KLSogV2hhdCBpcyBhbiAnZW5naW5lJyB2ZXJzaW9uPwotCi1XaXRoIHZlcnNpb24gMC45LjYgT3BlblNTTCB3YXMgZXh0ZW5kZWQgdG8gaW50ZXJmYWNlIHRvIGV4dGVybmFsIGNyeXB0bwotaGFyZHdhcmUuIFRoaXMgd2FzIHJlYWxpemVkIGluIGEgc3BlY2lhbCByZWxlYXNlICcwLjkuNi1lbmdpbmUnLiBXaXRoCi12ZXJzaW9uIDAuOS43IHRoZSBjaGFuZ2VzIHdlcmUgbWVyZ2VkIGludG8gdGhlIG1haW4gZGV2ZWxvcG1lbnQgbGluZSwKLXNvIHRoYXQgdGhlIHNwZWNpYWwgcmVsZWFzZSBpcyBubyBsb25nZXIgbmVjZXNzYXJ5LgotCi0qIEhvdyBkbyBJIGNoZWNrIHRoZSBhdXRoZW50aWNpdHkgb2YgdGhlIE9wZW5TU0wgZGlzdHJpYnV0aW9uPwotCi1XZSBwcm92aWRlIE1ENSBkaWdlc3RzIGFuZCBBU0Mgc2lnbmF0dXJlcyBvZiBlYWNoIHRhcmJhbGwuCi1Vc2UgTUQ1IHRvIGNoZWNrIHRoYXQgYSB0YXJiYWxsIGZyb20gYSBtaXJyb3Igc2l0ZSBpcyBpZGVudGljYWw6Ci0KLSAgIG1kNXN1bSBUQVJCQUxMIHwgYXdrICd7cHJpbnQgJDE7fScgfCBjbXAgLSBUQVJCQUxMLm1kNQotCi1Zb3UgY2FuIGNoZWNrIGF1dGhlbnRpY2l0eSB1c2luZyBwZ3Agb3IgZ3BnLiBZb3UgbmVlZCB0aGUgT3BlblNTTCB0ZWFtCi1tZW1iZXIgcHVibGljIGtleSB1c2VkIHRvIHNpZ24gaXQgKGRvd25sb2FkIGl0IGZyb20gYSBrZXkgc2VydmVyLCBzZWUgYQotbGlzdCBvZiBrZXlzIGF0IDxVUkw6IGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvYWJvdXQvPikuIFRoZW4KLWp1c3QgZG86Ci0KLSAgIHBncCBUQVJCQUxMLmFzYwotCi0qIEhvdyBkb2VzIHRoZSB2ZXJzaW9uaW5nIHNjaGVtZSB3b3JrPwotCi1BZnRlciB0aGUgcmVsZWFzZSBvZiBPcGVuU1NMIDEuMC4wIHRoZSB2ZXJzaW9uaW5nIHNjaGVtZSBjaGFuZ2VkLiBMZXR0ZXIgCi1yZWxlYXNlcyAoZS5nLiAxLjAuMWEpIGNhbiBvbmx5IGNvbnRhaW4gYnVnIGFuZCBzZWN1cml0eSBmaXhlcyBhbmQgbm8KLW5ldyBmZWF0dXJlcy4gTWlub3IgcmVsZWFzZXMgY2hhbmdlIHRoZSBsYXN0IG51bWJlciAoZS5nLiAxLjAuMikgYW5kIAotY2FuIGNvbnRhaW4gbmV3IGZlYXR1cmVzIHRoYXQgcmV0YWluIGJpbmFyeSBjb21wYXRpYmlsaXR5LiBDaGFuZ2VzIHRvCi10aGUgbWlkZGxlIG51bWJlciBhcmUgY29uc2lkZXJlZCBtYWpvciByZWxlYXNlcyBhbmQgbmVpdGhlciBzb3VyY2Ugbm9yCi1iaW5hcnkgY29tcGF0aWJpbGl0eSBpcyBndWFyYW50ZWVkLgotCi1UaGVyZWZvcmUgdGhlIGFuc3dlciB0byB0aGUgY29tbW9uIHF1ZXN0aW9uICJ3aGVuIHdpbGwgZmVhdHVyZSBYIGJlCi1iYWNrcG9ydGVkIHRvIE9wZW5TU0wgMS4wLjAvMC45Ljg/IiBpcyAibmV2ZXIiIGJ1dCBpdCBjb3VsZCBhcHBlYXIKLWluIHRoZSBuZXh0IG1pbm9yIHJlbGVhc2UuCi0KLVtMRUdBTF0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotKiBEbyBJIG5lZWQgcGF0ZW50IGxpY2Vuc2VzIHRvIHVzZSBPcGVuU1NMPwotCi1UaGUgcGF0ZW50cyBzZWN0aW9uIG9mIHRoZSBSRUFETUUgZmlsZSBsaXN0cyBwYXRlbnRzIHRoYXQgbWF5IGFwcGx5IHRvCi15b3UgaWYgeW91IHdhbnQgdG8gdXNlIE9wZW5TU0wuICBGb3IgaW5mb3JtYXRpb24gb24gaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMsIHBsZWFzZSBjb25zdWx0IGEgbGF3eWVyLiAgVGhlIE9wZW5TU0wgdGVhbSBkb2VzIG5vdAotb2ZmZXIgbGVnYWwgYWR2aWNlLgotCi1Zb3UgY2FuIGNvbmZpZ3VyZSBPcGVuU1NMIHNvIGFzIG5vdCB0byB1c2UgSURFQSwgTURDMiBhbmQgUkM1IGJ5IHVzaW5nCi0gLi9jb25maWcgbm8taWRlYSBuby1tZGMyIG5vLXJjNQotCi0KLSogQ2FuIEkgdXNlIE9wZW5TU0wgd2l0aCBHUEwgc29mdHdhcmU/Ci0KLU9uIG1hbnkgc3lzdGVtcyBpbmNsdWRpbmcgdGhlIG1ham9yIExpbnV4IGFuZCBCU0QgZGlzdHJpYnV0aW9ucywgeWVzICh0aGUKLUdQTCBkb2VzIG5vdCBwbGFjZSByZXN0cmljdGlvbnMgb24gdXNpbmcgbGlicmFyaWVzIHRoYXQgYXJlIHBhcnQgb2YgdGhlCi1ub3JtYWwgb3BlcmF0aW5nIHN5c3RlbSBkaXN0cmlidXRpb24pLgotCi1PbiBvdGhlciBzeXN0ZW1zLCB0aGUgc2l0dWF0aW9uIGlzIGxlc3MgY2xlYXIuIFNvbWUgR1BMIHNvZnR3YXJlIGNvcHlyaWdodAotaG9sZGVycyBjbGFpbSB0aGF0IHlvdSBpbmZyaW5nZSBvbiB0aGVpciByaWdodHMgaWYgeW91IHVzZSBPcGVuU1NMIHdpdGgKLXRoZWlyIHNvZnR3YXJlIG9uIG9wZXJhdGluZyBzeXN0ZW1zIHRoYXQgZG9uJ3Qgbm9ybWFsbHkgaW5jbHVkZSBPcGVuU1NMLgotCi1JZiB5b3UgZGV2ZWxvcCBvcGVuIHNvdXJjZSBzb2Z0d2FyZSB0aGF0IHVzZXMgT3BlblNTTCwgeW91IG1heSBmaW5kIGl0Ci11c2VmdWwgdG8gY2hvb3NlIGFuIG90aGVyIGxpY2Vuc2UgdGhhbiB0aGUgR1BMLCBvciBzdGF0ZSBleHBsaWNpdGx5IHRoYXQKLSJUaGlzIHByb2dyYW0gaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTCB3aXRoIHRoZSBhZGRpdGlvbmFsIGV4ZW1wdGlvbiB0aGF0Ci1jb21waWxpbmcsIGxpbmtpbmcsIGFuZC9vciB1c2luZyBPcGVuU1NMIGlzIGFsbG93ZWQuIiAgSWYgeW91IGFyZSB1c2luZwotR1BMIHNvZnR3YXJlIGRldmVsb3BlZCBieSBvdGhlcnMsIHlvdSBtYXkgd2FudCB0byBhc2sgdGhlIGNvcHlyaWdodCBob2xkZXIKLWZvciBwZXJtaXNzaW9uIHRvIHVzZSB0aGVpciBzb2Z0d2FyZSB3aXRoIE9wZW5TU0wuCi0KLQotW1VTRVJdID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0qIFdoeSBkbyBJIGdldCBhICJQUk5HIG5vdCBzZWVkZWQiIGVycm9yIG1lc3NhZ2U/Ci0KLUNyeXB0b2dyYXBoaWMgc29mdHdhcmUgbmVlZHMgYSBzb3VyY2Ugb2YgdW5wcmVkaWN0YWJsZSBkYXRhIHRvIHdvcmsKLWNvcnJlY3RseS4gIE1hbnkgb3BlbiBzb3VyY2Ugb3BlcmF0aW5nIHN5c3RlbXMgcHJvdmlkZSBhICJyYW5kb21uZXNzCi1kZXZpY2UiICgvZGV2L3VyYW5kb20gb3IgL2Rldi9yYW5kb20pIHRoYXQgc2VydmVzIHRoaXMgcHVycG9zZS4KLUFsbCBPcGVuU1NMIHZlcnNpb25zIHRyeSB0byB1c2UgL2Rldi91cmFuZG9tIGJ5IGRlZmF1bHQ7IHN0YXJ0aW5nIHdpdGgKLXZlcnNpb24gMC45LjcsIE9wZW5TU0wgYWxzbyB0cmllcyAvZGV2L3JhbmRvbSBpZiAvZGV2L3VyYW5kb20gaXMgbm90Ci1hdmFpbGFibGUuCi0KLU9uIG90aGVyIHN5c3RlbXMsIGFwcGxpY2F0aW9ucyBoYXZlIHRvIGNhbGwgdGhlIFJBTkRfYWRkKCkgb3IKLVJBTkRfc2VlZCgpIGZ1bmN0aW9uIHdpdGggYXBwcm9wcmlhdGUgZGF0YSBiZWZvcmUgZ2VuZXJhdGluZyBrZXlzIG9yCi1wZXJmb3JtaW5nIHB1YmxpYyBrZXkgZW5jcnlwdGlvbi4gKFRoZXNlIGZ1bmN0aW9ucyBpbml0aWFsaXplIHRoZQotcHNldWRvLXJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLCBQUk5HLikgIFNvbWUgYnJva2VuIGFwcGxpY2F0aW9ucyBkbwotbm90IGRvIHRoaXMuICBBcyBvZiB2ZXJzaW9uIDAuOS41LCB0aGUgT3BlblNTTCBmdW5jdGlvbnMgdGhhdCBuZWVkCi1yYW5kb21uZXNzIHJlcG9ydCBhbiBlcnJvciBpZiB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgaGFzIG5vdCBiZWVuCi1zZWVkZWQgd2l0aCBhdCBsZWFzdCAxMjggYml0cyBvZiByYW5kb21uZXNzLiAgSWYgdGhpcyBlcnJvciBvY2N1cnMgYW5kCi1pcyBub3QgZGlzY3Vzc2VkIGluIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBhcHBsaWNhdGlvbiB5b3UgYXJlCi11c2luZywgcGxlYXNlIGNvbnRhY3QgdGhlIGF1dGhvciBvZiB0aGF0IGFwcGxpY2F0aW9uOyBpdCBpcyBsaWtlbHkKLXRoYXQgaXQgbmV2ZXIgd29ya2VkIGNvcnJlY3RseS4gIE9wZW5TU0wgMC45LjUgYW5kIGxhdGVyIG1ha2UgdGhlCi1lcnJvciB2aXNpYmxlIGJ5IHJlZnVzaW5nIHRvIHBlcmZvcm0gcG90ZW50aWFsbHkgaW5zZWN1cmUgZW5jcnlwdGlvbi4KLQotSWYgeW91IGFyZSB1c2luZyBTb2xhcmlzIDgsIHlvdSBjYW4gYWRkIC9kZXYvdXJhbmRvbSBhbmQgL2Rldi9yYW5kb20KLWRldmljZXMgYnkgaW5zdGFsbGluZyBwYXRjaCAxMTI0MzggKFNwYXJjKSBvciAxMTI0MzkgKHg4NiksIHdoaWNoIGFyZQotYXZhaWxhYmxlIHZpYSB0aGUgUGF0Y2hmaW5kZXIgYXQgPFVSTDogaHR0cDovL3N1bnNvbHZlLnN1bi5jb20+Ci0oU29sYXJpcyA5IGluY2x1ZGVzIHRoZXNlIGRldmljZXMgYnkgZGVmYXVsdCkuIEZvciAvZGV2L3JhbmRvbSBzdXBwb3J0Ci1mb3IgZWFybGllciBTb2xhcmlzIHZlcnNpb25zLCBzZWUgU3VuJ3Mgc3RhdGVtZW50IGF0Ci08VVJMOiBodHRwOi8vc3Vuc29sdmUuc3VuLmNvbS9wdWItY2dpL3JldHJpZXZlLnBsP2RvYz1mc3JkYi8yNzYwNiZ6b25lXzMyPVNVTldza2k+Ci0odGhlIFNVTldza2kgcGFja2FnZSBpcyBhdmFpbGFibGUgaW4gcGF0Y2ggMTA1NzEwKS4KLQotT24gc3lzdGVtcyB3aXRob3V0IC9kZXYvdXJhbmRvbSBhbmQgL2Rldi9yYW5kb20sIGl0IGlzIGEgZ29vZCBpZGVhIHRvCi11c2UgdGhlIEVudHJvcHkgR2F0aGVyaW5nIERlbW9uIChFR0QpOyBzZWUgdGhlIFJBTkRfZWdkKCkgbWFucGFnZSBmb3IKLWRldGFpbHMuICBTdGFydGluZyB3aXRoIHZlcnNpb24gMC45LjcsIE9wZW5TU0wgd2lsbCBhdXRvbWF0aWNhbGx5IGxvb2sKLWZvciBhbiBFR0Qgc29ja2V0IGF0IC92YXIvcnVuL2VnZC1wb29sLCAvZGV2L2VnZC1wb29sLCAvZXRjL2VnZC1wb29sIGFuZAotL2V0Yy9lbnRyb3B5LgotCi1Nb3N0IGNvbXBvbmVudHMgb2YgdGhlIG9wZW5zc2wgY29tbWFuZCBsaW5lIHV0aWxpdHkgYXV0b21hdGljYWxseSB0cnkKLXRvIHNlZWQgdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGZyb20gYSBmaWxlLiAgVGhlIG5hbWUgb2YgdGhlCi1kZWZhdWx0IHNlZWRpbmcgZmlsZSBpcyBkZXRlcm1pbmVkIGFzIGZvbGxvd3M6IElmIGVudmlyb25tZW50IHZhcmlhYmxlCi1SQU5ERklMRSBpcyBzZXQsIHRoZW4gaXQgbmFtZXMgdGhlIHNlZWRpbmcgZmlsZS4gIE90aGVyd2lzZSBpZgotZW52aXJvbm1lbnQgdmFyaWFibGUgSE9NRSBpcyBzZXQsIHRoZW4gdGhlIHNlZWRpbmcgZmlsZSBpcyAkSE9NRS8ucm5kLgotSWYgbmVpdGhlciBSQU5ERklMRSBub3IgSE9NRSBpcyBzZXQsIHZlcnNpb25zIHVwIHRvIE9wZW5TU0wgMC45LjYgd2lsbAotdXNlIGZpbGUgLnJuZCBpbiB0aGUgY3VycmVudCBkaXJlY3Rvcnkgd2hpbGUgT3BlblNTTCAwLjkuNmEgdXNlcyBubwotZGVmYXVsdCBzZWVkaW5nIGZpbGUgYXQgYWxsLiAgT3BlblNTTCAwLjkuNmIgYW5kIGxhdGVyIHdpbGwgYmVoYXZlCi1zaW1pbGFybHkgdG8gMC45LjZhLCBidXQgd2lsbCB1c2UgYSBkZWZhdWx0IG9mICJDOlwiIGZvciBIT01FIG9uCi1XaW5kb3dzIHN5c3RlbXMgaWYgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGhhcyBub3QgYmVlbiBzZXQuCi0KLUlmIHRoZSBkZWZhdWx0IHNlZWRpbmcgZmlsZSBkb2VzIG5vdCBleGlzdCBvciBpcyB0b28gc2hvcnQsIHRoZSAiUFJORwotbm90IHNlZWRlZCIgZXJyb3IgbWVzc2FnZSBtYXkgb2NjdXIuCi0KLVRoZSBvcGVuc3NsIGNvbW1hbmQgbGluZSB1dGlsaXR5IHdpbGwgd3JpdGUgYmFjayBhIG5ldyBzdGF0ZSB0byB0aGUKLWRlZmF1bHQgc2VlZGluZyBmaWxlIChhbmQgY3JlYXRlIHRoaXMgZmlsZSBpZiBuZWNlc3NhcnkpIHVubGVzcwotdGhlcmUgd2FzIG5vIHN1ZmZpY2llbnQgc2VlZGluZy4KLQotUG9pbnRpbmcgJFJBTkRGSUxFIHRvIGFuIEVudHJvcHkgR2F0aGVyaW5nIERhZW1vbiBzb2NrZXQgZG9lcyBub3Qgd29yay4KLVVzZSB0aGUgIi1yYW5kIiBvcHRpb24gb2YgdGhlIE9wZW5TU0wgY29tbWFuZCBsaW5lIHRvb2xzIGluc3RlYWQuCi1UaGUgJFJBTkRGSUxFIGVudmlyb25tZW50IHZhcmlhYmxlIGFuZCAkSE9NRS8ucm5kIGFyZSBvbmx5IHVzZWQgYnkgdGhlCi1PcGVuU1NMIGNvbW1hbmQgbGluZSB0b29scy4gQXBwbGljYXRpb25zIHVzaW5nIHRoZSBPcGVuU1NMIGxpYnJhcnkKLXByb3ZpZGUgdGhlaXIgb3duIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byBzcGVjaWZ5IHRoZSBlbnRyb3B5IHNvdXJjZSwKLXBsZWFzZSBjaGVjayBvdXQgdGhlIGRvY3VtZW50YXRpb24gY29taW5nIHRoZSB3aXRoIGFwcGxpY2F0aW9uLgotCi0KLSogV2h5IGRvIEkgZ2V0IGFuICJ1bmFibGUgdG8gd3JpdGUgJ3JhbmRvbSBzdGF0ZSciIGVycm9yIG1lc3NhZ2U/Ci0KLQotU29tZXRpbWVzIHRoZSBvcGVuc3NsIGNvbW1hbmQgbGluZSB1dGlsaXR5IGRvZXMgbm90IGFib3J0IHdpdGgKLWEgIlBSTkcgbm90IHNlZWRlZCIgZXJyb3IgbWVzc2FnZSwgYnV0IGNvbXBsYWlucyB0aGF0IGl0IGlzCi0idW5hYmxlIHRvIHdyaXRlICdyYW5kb20gc3RhdGUnIi4gIFRoaXMgbWVzc2FnZSByZWZlcnMgdG8gdGhlCi1kZWZhdWx0IHNlZWRpbmcgZmlsZSAoc2VlIHByZXZpb3VzIGFuc3dlcikuICBBIHBvc3NpYmxlIHJlYXNvbgotaXMgdGhhdCBubyBkZWZhdWx0IGZpbGVuYW1lIGlzIGtub3duIGJlY2F1c2UgbmVpdGhlciBSQU5ERklMRQotbm9yIEhPTUUgaXMgc2V0LiAgKFZlcnNpb25zIHVwIHRvIDAuOS42IHVzZWQgZmlsZSAiLnJuZCIgaW4gdGhlCi1jdXJyZW50IGRpcmVjdG9yeSBpbiB0aGlzIGNhc2UsIGJ1dCB0aGlzIGhhcyBjaGFuZ2VkIHdpdGggMC45LjZhLikKLQotCi0qIEhvdyBkbyBJIGNyZWF0ZSBjZXJ0aWZpY2F0ZXMgb3IgY2VydGlmaWNhdGUgcmVxdWVzdHM/Ci0KLUNoZWNrIG91dCB0aGUgQ0EucGwoMSkgbWFudWFsIHBhZ2UuIFRoaXMgcHJvdmlkZXMgYSBzaW1wbGUgd3JhcHBlciByb3VuZAotdGhlICdyZXEnLCAndmVyaWZ5JywgJ2NhJyBhbmQgJ3BrY3MxMicgdXRpbGl0aWVzLiBGb3IgZmluZXIgY29udHJvbCBjaGVjawotb3V0IHRoZSBtYW51YWwgcGFnZXMgZm9yIHRoZSBpbmRpdmlkdWFsIHV0aWxpdGllcyBhbmQgdGhlIGNlcnRpZmljYXRlCi1leHRlbnNpb25zIGRvY3VtZW50YXRpb24gKGluIGNhKDEpLCByZXEoMSksIHg1MDl2M19jb25maWcoNSkgKQotCi0KLSogV2h5IGNhbid0IEkgY3JlYXRlIGNlcnRpZmljYXRlIHJlcXVlc3RzPwotCi1Zb3UgdHlwaWNhbGx5IGdldCB0aGUgZXJyb3I6Ci0KLQl1bmFibGUgdG8gZmluZCAnZGlzdGluZ3Vpc2hlZF9uYW1lJyBpbiBjb25maWcKLQlwcm9ibGVtcyBtYWtpbmcgQ2VydGlmaWNhdGUgUmVxdWVzdAotCi1UaGlzIGlzIGJlY2F1c2UgaXQgY2FuJ3QgZmluZCB0aGUgY29uZmlndXJhdGlvbiBmaWxlLiBDaGVjayBvdXQgdGhlCi1ESUFHTk9TVElDUyBzZWN0aW9uIG9mIHJlcSgxKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotCi0qIFdoeSBkb2VzIDxTU0wgcHJvZ3JhbT4gZmFpbCB3aXRoIGEgY2VydGlmaWNhdGUgdmVyaWZ5IGVycm9yPwotCi1UaGlzIHByb2JsZW0gaXMgdXN1YWxseSBpbmRpY2F0ZWQgYnkgbG9nIG1lc3NhZ2VzIHNheWluZyBzb21ldGhpbmcgbGlrZQotInVuYWJsZSB0byBnZXQgbG9jYWwgaXNzdWVyIGNlcnRpZmljYXRlIiBvciAic2VsZiBzaWduZWQgY2VydGlmaWNhdGUiLgotV2hlbiBhIGNlcnRpZmljYXRlIGlzIHZlcmlmaWVkIGl0cyByb290IENBIG11c3QgYmUgInRydXN0ZWQiIGJ5IE9wZW5TU0wKLXRoaXMgdHlwaWNhbGx5IG1lYW5zIHRoYXQgdGhlIENBIGNlcnRpZmljYXRlIG11c3QgYmUgcGxhY2VkIGluIGEgZGlyZWN0b3J5Ci1vciBmaWxlIGFuZCB0aGUgcmVsZXZhbnQgcHJvZ3JhbSBjb25maWd1cmVkIHRvIHJlYWQgaXQuIFRoZSBPcGVuU1NMIHByb2dyYW0KLSd2ZXJpZnknIGJlaGF2ZXMgaW4gYSBzaW1pbGFyIHdheSBhbmQgaXNzdWVzIHNpbWlsYXIgZXJyb3IgbWVzc2FnZXM6IGNoZWNrCi10aGUgdmVyaWZ5KDEpIHByb2dyYW0gbWFudWFsIHBhZ2UgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLQotKiBXaHkgY2FuIEkgb25seSB1c2Ugd2VhayBjaXBoZXJzIHdoZW4gSSBjb25uZWN0IHRvIGEgc2VydmVyIHVzaW5nIE9wZW5TU0w/Ci0KLVRoaXMgaXMgYWxtb3N0IGNlcnRhaW5seSBiZWNhdXNlIHlvdSBhcmUgdXNpbmcgYW4gb2xkICJleHBvcnQgZ3JhZGUiIGJyb3dzZXIKLXdoaWNoIG9ubHkgc3VwcG9ydHMgd2VhayBlbmNyeXB0aW9uLiBVcGdyYWRlIHlvdXIgYnJvd3NlciB0byBzdXBwb3J0IDEyOCBiaXQKLWNpcGhlcnMuCi0KLQotKiBIb3cgY2FuIEkgY3JlYXRlIERTQSBjZXJ0aWZpY2F0ZXM/Ci0KLUNoZWNrIHRoZSBDQS5wbCgxKSBtYW51YWwgcGFnZSBmb3IgYSBEU0EgY2VydGlmaWNhdGUgZXhhbXBsZS4KLQotCi0qIFdoeSBjYW4ndCBJIG1ha2UgYW4gU1NMIGNvbm5lY3Rpb24gdG8gYSBzZXJ2ZXIgdXNpbmcgYSBEU0EgY2VydGlmaWNhdGU/Ci0KLVR5cGljYWxseSB5b3UnbGwgc2VlIGEgbWVzc2FnZSBzYXlpbmcgdGhlcmUgYXJlIG5vIHNoYXJlZCBjaXBoZXJzIHdoZW4KLXRoZSBzYW1lIHNldHVwIHdvcmtzIGZpbmUgd2l0aCBhbiBSU0EgY2VydGlmaWNhdGUuIFRoZXJlIGFyZSB0d28gcG9zc2libGUKLWNhdXNlcy4gVGhlIGNsaWVudCBtYXkgbm90IHN1cHBvcnQgY29ubmVjdGlvbnMgdG8gRFNBIHNlcnZlcnMgbW9zdCB3ZWIKLWJyb3dzZXJzIChpbmNsdWRpbmcgTmV0c2NhcGUgYW5kIE1TSUUpIG9ubHkgc3VwcG9ydCBjb25uZWN0aW9ucyB0byBzZXJ2ZXJzCi1zdXBwb3J0aW5nIFJTQSBjaXBoZXIgc3VpdGVzLiBUaGUgb3RoZXIgY2F1c2UgaXMgdGhhdCBhIHNldCBvZiBESCBwYXJhbWV0ZXJzCi1oYXMgbm90IGJlZW4gc3VwcGxpZWQgdG8gdGhlIHNlcnZlci4gREggcGFyYW1ldGVycyBjYW4gYmUgY3JlYXRlZCB3aXRoIHRoZQotZGhwYXJhbSgxKSBjb21tYW5kIGFuZCBsb2FkZWQgdXNpbmcgdGhlIFNTTF9DVFhfc2V0X3RtcF9kaCgpIGZvciBleGFtcGxlOgotY2hlY2sgdGhlIHNvdXJjZSB0byBzX3NlcnZlciBpbiBhcHBzL3Nfc2VydmVyLmMgZm9yIGFuIGV4YW1wbGUuCi0KLQotKiBIb3cgY2FuIEkgcmVtb3ZlIHRoZSBwYXNzcGhyYXNlIG9uIGEgcHJpdmF0ZSBrZXk/Ci0KLUZpcnN0bHkgeW91IHNob3VsZCBiZSByZWFsbHkgKnJlYWxseSogc3VyZSB5b3Ugd2FudCB0byBkbyB0aGlzLiBMZWF2aW5nCi1hIHByaXZhdGUga2V5IHVuZW5jcnlwdGVkIGlzIGEgbWFqb3Igc2VjdXJpdHkgcmlzay4gSWYgeW91IGRlY2lkZSB0aGF0Ci15b3UgZG8gaGF2ZSB0byBkbyB0aGlzIGNoZWNrIHRoZSBFWEFNUExFUyBzZWN0aW9ucyBvZiB0aGUgcnNhKDEpIGFuZAotZHNhKDEpIG1hbnVhbCBwYWdlcy4KLQotCi0qIFdoeSBjYW4ndCBJIHVzZSBPcGVuU1NMIGNlcnRpZmljYXRlcyB3aXRoIFNTTCBjbGllbnQgYXV0aGVudGljYXRpb24/Ci0KLVdoYXQgd2lsbCB0eXBpY2FsbHkgaGFwcGVuIGlzIHRoYXQgd2hlbiBhIHNlcnZlciByZXF1ZXN0cyBhdXRoZW50aWNhdGlvbgotaXQgd2lsbCBlaXRoZXIgbm90IGluY2x1ZGUgeW91ciBjZXJ0aWZpY2F0ZSBvciB0ZWxsIHlvdSB0aGF0IHlvdSBoYXZlCi1ubyBjbGllbnQgY2VydGlmaWNhdGVzIChOZXRzY2FwZSkgb3IgcHJlc2VudCB5b3Ugd2l0aCBhbiBlbXB0eSBsaXN0IGJveAotKE1TSUUpLiBUaGUgcmVhc29uIGZvciB0aGlzIGlzIHRoYXQgd2hlbiBhIHNlcnZlciByZXF1ZXN0cyBhIGNsaWVudAotY2VydGlmaWNhdGUgaXQgaW5jbHVkZXMgYSBsaXN0IG9mIENBcyBuYW1lcyB3aGljaCBpdCB3aWxsIGFjY2VwdC4gQnJvd3NlcnMKLXdpbGwgb25seSBsZXQgeW91IHNlbGVjdCBjZXJ0aWZpY2F0ZXMgZnJvbSB0aGUgbGlzdCBvbiB0aGUgZ3JvdW5kcyB0aGF0Ci10aGVyZSBpcyBsaXR0bGUgcG9pbnQgcHJlc2VudGluZyBhIGNlcnRpZmljYXRlIHdoaWNoIHRoZSBzZXJ2ZXIgd2lsbAotcmVqZWN0LgotCi1UaGUgc29sdXRpb24gaXMgdG8gYWRkIHRoZSByZWxldmFudCBDQSBjZXJ0aWZpY2F0ZSB0byB5b3VyIHNlcnZlcnMgInRydXN0ZWQKLUNBIGxpc3QiLiBIb3cgeW91IGRvIHRoaXMgZGVwZW5kcyBvbiB0aGUgc2VydmVyIHNvZnR3YXJlIGluIHVzZXMuIFlvdSBjYW4KLXByaW50IG91dCB0aGUgc2VydmVycyBsaXN0IG9mIGFjY2VwdGFibGUgQ0FzIHVzaW5nIHRoZSBPcGVuU1NMIHNfY2xpZW50IHRvb2w6Ci0KLW9wZW5zc2wgc19jbGllbnQgLWNvbm5lY3Qgd3d3LnNvbWUuaG9zdDo0NDMgLXByZXhpdAotCi1JZiB5b3VyIHNlcnZlciBvbmx5IHJlcXVlc3RzIGNlcnRpZmljYXRlcyBvbiBjZXJ0YWluIFVSTHMgdGhlbiB5b3UgbWF5IG5lZWQKLXRvIG1hbnVhbGx5IGlzc3VlIGFuIEhUVFAgR0VUIGNvbW1hbmQgdG8gZ2V0IHRoZSBsaXN0IHdoZW4gc19jbGllbnQgY29ubmVjdHM6Ci0KLUdFVCAvc29tZS9wYWdlL25lZWRpbmcvYS9jZXJ0aWZpY2F0ZS5odG1sCi0KLUlmIHlvdXIgQ0EgZG9lcyBub3QgYXBwZWFyIGluIHRoZSBsaXN0IHRoZW4gdGhpcyBjb25maXJtcyB0aGUgcHJvYmxlbS4KLQotCi0qIFdoeSBkb2VzIG15IGJyb3dzZXIgZ2l2ZSBhIHdhcm5pbmcgYWJvdXQgYSBtaXNtYXRjaGVkIGhvc3RuYW1lPwotCi1Ccm93c2VycyBleHBlY3QgdGhlIHNlcnZlcidzIGhvc3RuYW1lIHRvIG1hdGNoIHRoZSB2YWx1ZSBpbiB0aGUgY29tbW9uTmFtZQotKENOKSBmaWVsZCBvZiB0aGUgY2VydGlmaWNhdGUuIElmIGl0IGRvZXMgbm90IHRoZW4geW91IGdldCBhIHdhcm5pbmcuCi0KLQotKiBIb3cgZG8gSSBpbnN0YWxsIGEgQ0EgY2VydGlmaWNhdGUgaW50byBhIGJyb3dzZXI/Ci0KLVRoZSB1c3VhbCB3YXkgaXMgdG8gc2VuZCB0aGUgREVSIGVuY29kZWQgY2VydGlmaWNhdGUgdG8gdGhlIGJyb3dzZXIgYXMKLU1JTUUgdHlwZSBhcHBsaWNhdGlvbi94LXg1MDktY2EtY2VydCwgZm9yIGV4YW1wbGUgYnkgY2xpY2tpbmcgb24gYW4gYXBwcm9wcmlhdGUKLWxpbmsuIE9uIE1TSUUgY2VydGFpbiBleHRlbnNpb25zIHN1Y2ggYXMgLmRlciBvciAuY2FjZXJ0IG1heSBhbHNvIHdvcmssIG9yIHlvdQotY2FuIGltcG9ydCB0aGUgY2VydGlmaWNhdGUgdXNpbmcgdGhlIGNlcnRpZmljYXRlIGltcG9ydCB3aXphcmQuCi0KLVlvdSBjYW4gY29udmVydCBhIGNlcnRpZmljYXRlIHRvIERFUiBmb3JtIHVzaW5nIHRoZSBjb21tYW5kOgotCi1vcGVuc3NsIHg1MDkgLWluIGNhLnBlbSAtb3V0Zm9ybSBERVIgLW91dCBjYS5kZXIKLQotT2NjYXNpb25hbGx5IHNvbWVvbmUgc3VnZ2VzdHMgdXNpbmcgYSBjb21tYW5kIHN1Y2ggYXM6Ci0KLW9wZW5zc2wgcGtjczEyIC1leHBvcnQgLW91dCBjYWNlcnQucDEyIC1pbiBjYWNlcnQucGVtIC1pbmtleSBjYWtleS5wZW0KLQotRE8gTk9UIERPIFRISVMhIFRoaXMgY29tbWFuZCB3aWxsIGdpdmUgYXdheSB5b3VyIENBcyBwcml2YXRlIGtleSBhbmQKLXJlZHVjZXMgaXRzIHNlY3VyaXR5IHRvIHplcm86IGFsbG93aW5nIGFueW9uZSB0byBmb3JnZSBjZXJ0aWZpY2F0ZXMgaW4KLXdoYXRldmVyIG5hbWUgdGhleSBjaG9vc2UuCi0KLSogV2h5IGlzIE9wZW5TU0wgeDUwOSBETiBvdXRwdXQgbm90IGNvbmZvcm1hbnQgdG8gUkZDMjI1Mz8KLQotVGhlIHdheXMgdG8gcHJpbnQgb3V0IHRoZSBvbmVsaW5lIGZvcm1hdCBvZiB0aGUgRE4gKERpc3Rpbmd1aXNoZWQgTmFtZSkgaGF2ZQotYmVlbiBleHRlbmRlZCBpbiB2ZXJzaW9uIDAuOS43IG9mIE9wZW5TU0wuIFVzaW5nIHRoZSBuZXcgWDUwOV9OQU1FX3ByaW50X2V4KCkKLWludGVyZmFjZSwgdGhlICItbmFtZW9wdCIgb3B0aW9uIGNvdWxkIGJlIGludHJvZHVkZWQuIFNlZSB0aGUgbWFudWFsCi1wYWdlIG9mIHRoZSAib3BlbnNzbCB4NTA5IiBjb21tYW5kbGluZSB0b29sIGZvciBkZXRhaWxzLiBUaGUgb2xkIGJlaGF2aW91cgotaGFzIGhvd2V2ZXIgYmVlbiBsZWZ0IGFzIGRlZmF1bHQgZm9yIHRoZSBzYWtlIG9mIGNvbXBhdGliaWxpdHkuCi0KLSogV2hhdCBpcyBhICIxMjggYml0IGNlcnRpZmljYXRlIj8gQ2FuIEkgY3JlYXRlIG9uZSB3aXRoIE9wZW5TU0w/Ci0KLVRoZSB0ZXJtICIxMjggYml0IGNlcnRpZmljYXRlIiBpcyBhIGhpZ2hseSBtaXNsZWFkaW5nIG1hcmtldGluZyB0ZXJtLiBJdCBkb2VzCi0qbm90KiByZWZlciB0byB0aGUgc2l6ZSBvZiB0aGUgcHVibGljIGtleSBpbiB0aGUgY2VydGlmaWNhdGUhIEEgY2VydGlmaWNhdGUKLWNvbnRhaW5pbmcgYSAxMjggYml0IFJTQSBrZXkgd291bGQgaGF2ZSBuZWdsaWdpYmxlIHNlY3VyaXR5LgotCi1UaGVyZSB3ZXJlIHZhcmlvdXMgb3RoZXIgbmFtZXMgc3VjaCBhcyAibWFnaWMgY2VydGlmaWNhdGVzIiwgIlNHQwotY2VydGlmaWNhdGVzIiwgInN0ZXAgdXAgY2VydGlmaWNhdGVzIiBldGMuCi0KLVlvdSBjYW4ndCBnZW5lcmFsbHkgY3JlYXRlIHN1Y2ggYSBjZXJ0aWZpY2F0ZSB1c2luZyBPcGVuU1NMIGJ1dCB0aGVyZSBpcyBubwotbmVlZCB0byBhbnkgbW9yZS4gTm93YWRheXMgd2ViIGJyb3dzZXJzIHVzaW5nIHVucmVzdHJpY3RlZCBzdHJvbmcgZW5jcnlwdGlvbgotYXJlIGdlbmVyYWxseSBhdmFpbGFibGUuCi0KLVdoZW4gdGhlcmUgd2VyZSB0aWdodCByZXN0cmljdGlvbnMgb24gdGhlIGV4cG9ydCBvZiBzdHJvbmcgZW5jcnlwdGlvbgotc29mdHdhcmUgZnJvbSB0aGUgVVMgb25seSB3ZWFrIGVuY3J5cHRpb24gYWxnb3JpdGhtcyBjb3VsZCBiZSBmcmVlbHkgZXhwb3J0ZWQKLShpbml0aWFsbHkgNDAgYml0IGFuZCB0aGVuIDU2IGJpdCkuIEl0IHdhcyB3aWRlbHkgcmVjb2duaXNlZCB0aGF0IHRoaXMgd2FzCi1pbmFkZXF1YXRlLiBBIHJlbGF4YXRpb24gb2YgdGhlIHJ1bGVzIGFsbG93ZWQgdGhlIHVzZSBvZiBzdHJvbmcgZW5jcnlwdGlvbiBidXQKLW9ubHkgdG8gYW4gYXV0aG9yaXNlZCBzZXJ2ZXIuCi0KLVR3byBzbGlnaGx5IGRpZmZlcmVudCB0ZWNobmlxdWVzIHdlcmUgZGV2ZWxvcGVkIHRvIHN1cHBvcnQgdGhpcywgb25lIHVzZWQgYnkKLU5ldHNjYXBlIHdhcyBjYWxsZWQgInN0ZXAgdXAiLCB0aGUgb3RoZXIgdXNlZCBieSBNU0lFIHdhcyBjYWxsZWQgIlNlcnZlciBHYXRlZAotQ3J5cHRvZ3JhcGh5IiAoU0dDKS4gV2hlbiBhIGJyb3dzZXIgaW5pdGlhbGx5IGNvbm5lY3RlZCB0byBhIHNlcnZlciBpdCB3b3VsZAotY2hlY2sgdG8gc2VlIGlmIHRoZSBjZXJ0aWZpY2F0ZSBjb250YWluZWQgY2VydGFpbiBleHRlbnNpb25zIGFuZCB3YXMgaXNzdWVkIGJ5Ci1hbiBhdXRob3Jpc2VkIGF1dGhvcml0eS4gSWYgdGhlc2UgdGVzdCBzdWNjZWVkZWQgaXQgd291bGQgcmVjb25uZWN0IHVzaW5nCi1zdHJvbmcgZW5jcnlwdGlvbi4KLQotT25seSBjZXJ0YWluIChpbml0aWFsbHkgb25lKSBjZXJ0aWZpY2F0ZSBhdXRob3JpdGllcyBjb3VsZCBpc3N1ZSB0aGUKLWNlcnRpZmljYXRlcyBhbmQgdGhleSBnZW5lcmFsbHkgY29zdCBtb3JlIHRoYW4gb3JkaW5hcnkgY2VydGlmaWNhdGVzLgotCi1BbHRob3VnaCBPcGVuU1NMIGNhbiBjcmVhdGUgY2VydGlmaWNhdGVzIGNvbnRhaW5pbmcgdGhlIGFwcHJvcHJpYXRlIGV4dGVuc2lvbnMKLXRoZSBjZXJ0aWZpY2F0ZSB3b3VsZCBub3QgY29tZSBmcm9tIGEgcGVybWl0dGVkIGF1dGhvcml0eSBhbmQgc28gd291bGQgbm90Ci1iZSByZWNvZ25pemVkLgotCi1UaGUgZXhwb3J0IGxhd3Mgd2VyZSBsYXRlciBjaGFuZ2VkIHRvIGFsbG93IGFsbW9zdCB1bnJlc3RyaWN0ZWQgdXNlIG9mIHN0cm9uZwotZW5jcnlwdGlvbiBzbyB0aGVzZSBjZXJ0aWZpY2F0ZXMgYXJlIG5vdyBvYnNvbGV0ZS4KLQotCi0qIFdoeSBkb2VzIE9wZW5TU0wgc2V0IHRoZSBhdXRob3JpdHkga2V5IGlkZW50aWZpZXIgKEFLSUQpIGV4dGVuc2lvbiBpbmNvcnJlY3RseT8KLQotSXQgZG9lc24ndDogdGhpcyBleHRlbnNpb24gaXMgb2Z0ZW4gdGhlIGNhdXNlIG9mIGNvbmZ1c2lvbi4KLQotQ29uc2lkZXIgYSBjZXJ0aWZpY2F0ZSBjaGFpbiBBLT5CLT5DIHNvIHRoYXQgQSBzaWducyBCIGFuZCBCIHNpZ25zIEMuIFN1cHBvc2UKLWNlcnRpZmljYXRlIEMgY29udGFpbnMgQUtJRC4KLQotVGhlIHB1cnBvc2Ugb2YgdGhpcyBleHRlbnNpb24gaXMgdG8gaWRlbnRpZnkgdGhlIGF1dGhvcml0eSBjZXJ0aWZpY2F0ZSBCLiBUaGlzCi1jYW4gYmUgZG9uZSBlaXRoZXIgYnkgaW5jbHVkaW5nIHRoZSBzdWJqZWN0IGtleSBpZGVudGlmaWVyIG9mIEIgb3IgaXRzIGlzc3VlcgotbmFtZSBhbmQgc2VyaWFsIG51bWJlci4KLQotSW4gdGhpcyBsYXR0ZXIgY2FzZSBiZWNhdXNlIGl0IGlzIGlkZW50aWZ5aW5nIGNlcnRpZmNhdGUgQiBpdCBtdXN0IGNvbnRhaW4gdGhlCi1pc3N1ZXIgbmFtZSBhbmQgc2VyaWFsIG51bWJlciBvZiBCLgotCi1JdCBpcyBvZnRlbiB3cm9uZ2x5IGFzc3VtZWQgdGhhdCBpdCBzaG91bGQgY29udGFpbiB0aGUgc3ViamVjdCBuYW1lIG9mIEIuIElmIGl0Ci1kaWQgdGhpcyB3b3VsZCBiZSByZWR1bmRhbnQgaW5mb3JtYXRpb24gYmVjYXVzZSBpdCB3b3VsZCBkdXBsaWNhdGUgdGhlIGlzc3VlcgotbmFtZSBvZiBDLgotCi0KLSogSG93IGNhbiBJIHNldCB1cCBhIGJ1bmRsZSBvZiBjb21tZXJjaWFsIHJvb3QgQ0EgY2VydGlmaWNhdGVzPwotCi1UaGUgT3BlblNTTCBzb2Z0d2FyZSBpcyBzaGlwcGVkIHdpdGhvdXQgYW55IHJvb3QgQ0EgY2VydGlmaWNhdGUgYXMgdGhlCi1PcGVuU1NMIHByb2plY3QgZG9lcyBub3QgaGF2ZSBhbnkgcG9saWN5IG9uIGluY2x1ZGluZyBvciBleGNsdWRpbmcKLWFueSBzcGVjaWZpYyBDQSBhbmQgZG9lcyBub3QgaW50ZW5kIHRvIHNldCB1cCBzdWNoIGEgcG9saWN5LiBEZWNpZGluZwotYWJvdXQgd2hpY2ggQ0FzIHRvIHN1cHBvcnQgaXMgdXAgdG8gYXBwbGljYXRpb24gZGV2ZWxvcGVycyBvcgotYWRtaW5pc3RyYXRvcnMuCi0KLU90aGVyIHByb2plY3RzIGRvIGhhdmUgb3RoZXIgcG9saWNpZXMgc28geW91IGNhbiBmb3IgZXhhbXBsZSBleHRyYWN0IHRoZSBDQQotYnVuZGxlIHVzZWQgYnkgTW96aWxsYSBhbmQvb3IgbW9kc3NsIGFzIGRlc2NyaWJlZCBpbiB0aGlzIGFydGljbGU6Ci0KLSAgPFVSTDogaHR0cDovL3d3dy5tYWlsLWFyY2hpdmUuY29tL21vZHNzbC11c2Vyc0Btb2Rzc2wub3JnL21zZzE2OTgwLmh0bWw+Ci0KLQotW0JVSUxEXSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0qIFdoeSBkb2VzIHRoZSBsaW5rZXIgY29tcGxhaW4gYWJvdXQgdW5kZWZpbmVkIHN5bWJvbHM/Ci0KLU1heWJlIHRoZSBjb21waWxhdGlvbiB3YXMgaW50ZXJydXB0ZWQsIGFuZCBtYWtlIGRvZXNuJ3Qgbm90aWNlIHRoYXQKLXNvbWV0aGluZyBpcyBtaXNzaW5nLiAgUnVuICJtYWtlIGNsZWFuOyBtYWtlIi4KLQotSWYgeW91IHVzZWQgLi9Db25maWd1cmUgaW5zdGVhZCBvZiAuL2NvbmZpZywgbWFrZSBzdXJlIHRoYXQgeW91Ci1zZWxlY3RlZCB0aGUgcmlnaHQgdGFyZ2V0LiAgRmlsZSBmb3JtYXRzIG1heSBkaWZmZXIgc2xpZ2h0bHkgYmV0d2VlbgotT1MgdmVyc2lvbnMgKGZvciBleGFtcGxlIHNwYXJjdjgvc3BhcmN2OSwgb3IgYS5vdXQvZWxmKS4KLQotSW4gY2FzZSB5b3UgZ2V0IGVycm9ycyBhYm91dCB0aGUgZm9sbG93aW5nIHN5bWJvbHMsIHVzZSB0aGUgY29uZmlnCi1vcHRpb24gIm5vLWFzbSIsIGFzIGRlc2NyaWJlZCBpbiBJTlNUQUxMOgotCi0gQkZfY2JjX2VuY3J5cHQsIEJGX2RlY3J5cHQsIEJGX2VuY3J5cHQsIENBU1RfY2JjX2VuY3J5cHQsCi0gQ0FTVF9kZWNyeXB0LCBDQVNUX2VuY3J5cHQsIFJDNCwgUkM1XzMyX2NiY19lbmNyeXB0LCBSQzVfMzJfZGVjcnlwdCwKLSBSQzVfMzJfZW5jcnlwdCwgYm5fYWRkX3dvcmRzLCBibl9kaXZfd29yZHMsIGJuX211bF9hZGRfd29yZHMsCi0gYm5fbXVsX2NvbWJhNCwgYm5fbXVsX2NvbWJhOCwgYm5fbXVsX3dvcmRzLCBibl9zcXJfY29tYmE0LAotIGJuX3Nxcl9jb21iYTgsIGJuX3Nxcl93b3JkcywgYm5fc3ViX3dvcmRzLCBkZXNfZGVjcnlwdDMsCi0gZGVzX2VkZTNfY2JjX2VuY3J5cHQsIGRlc19lbmNyeXB0LCBkZXNfZW5jcnlwdDIsIGRlc19lbmNyeXB0MywKLSBkZXNfbmNiY19lbmNyeXB0LCBtZDVfYmxvY2tfYXNtX2hvc3Rfb3JkZXIsIHNoYTFfYmxvY2tfYXNtX2RhdGFfb3JkZXIKLQotSWYgbm9uZSBvZiB0aGVzZSBoZWxwcywgeW91IG1heSB3YW50IHRvIHRyeSB1c2luZyB0aGUgY3VycmVudCBzbmFwc2hvdC4KLUlmIHRoZSBwcm9ibGVtIHBlcnNpc3RzLCBwbGVhc2Ugc3VibWl0IGEgYnVnIHJlcG9ydC4KLQotCi0qIFdoeSBkb2VzIHRoZSBPcGVuU1NMIHRlc3QgZmFpbCB3aXRoICJiYzogY29tbWFuZCBub3QgZm91bmQiPwotCi1Zb3UgZGlkbid0IGluc3RhbGwgImJjIiwgdGhlIFVuaXggY2FsY3VsYXRvci4gIElmIHlvdSB3YW50IHRvIHJ1biB0aGUKLXRlc3RzLCBnZXQgR05VIGJjIGZyb20gZnRwOi8vZnRwLmdudS5vcmcgb3IgZnJvbSB5b3VyIE9TIGRpc3RyaWJ1dG9yLgotCi0KLSogV2h5IGRvZXMgdGhlIE9wZW5TU0wgdGVzdCBmYWlsIHdpdGggImJjOiAxIG5vIGltcGxlbWVudGVkIj8KLQotT24gc29tZSBTQ08gaW5zdGFsbGF0aW9ucyBvciB2ZXJzaW9ucywgYmMgaGFzIGEgYnVnIHRoYXQgZ2V0cyB0cmlnZ2VyZWQKLXdoZW4geW91IHJ1biB0aGUgdGVzdCBzdWl0ZSAodXNpbmcgIm1ha2UgdGVzdCIpLiAgVGhlIG1lc3NhZ2UgcmV0dXJuZWQgaXMKLSJiYzogMSBub3QgaW1wbGVtZW50ZWQiLgotCi1UaGUgYmVzdCB3YXkgdG8gZGVhbCB3aXRoIHRoaXMgaXMgdG8gZmluZCBhbm90aGVyIGltcGxlbWVudGF0aW9uIG9mIGJjCi1hbmQgY29tcGlsZS9pbnN0YWxsIGl0LiAgR05VIGJjIChzZWUgPFVSTDogaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL3NvZnR3YXJlLmh0bWw+Ci1mb3IgZG93bmxvYWQgaW5zdHJ1Y3Rpb25zKSBjYW4gYmUgc2FmZWx5IHVzZWQsIGZvciBleGFtcGxlLgotCi0KLSogV2h5IGRvZXMgdGhlIE9wZW5TU0wgdGVzdCBmYWlsIHdpdGggImJjOiBzdGFjayBlbXB0eSI/Ci0KLU9uIHNvbWUgREcvdXggdmVyc2lvbnMsIGJjIHNlZW1zIHRvIGhhdmUgYSB0b28gc21hbGwgc3RhY2sgZm9yIGNhbGN1bGF0aW9ucwotdGhhdCB0aGUgT3BlblNTTCBibnRlc3QgdGhyb3dzIGF0IGl0LiAgVGhpcyBnZXRzIHRyaWdnZXJlZCB3aGVuIHlvdSBydW4gdGhlCi10ZXN0IHN1aXRlICh1c2luZyAibWFrZSB0ZXN0IikuICBUaGUgbWVzc2FnZSByZXR1cm5lZCBpcyAiYmM6IHN0YWNrIGVtcHR5Ii4KLQotVGhlIGJlc3Qgd2F5IHRvIGRlYWwgd2l0aCB0aGlzIGlzIHRvIGZpbmQgYW5vdGhlciBpbXBsZW1lbnRhdGlvbiBvZiBiYwotYW5kIGNvbXBpbGUvaW5zdGFsbCBpdC4gIEdOVSBiYyAoc2VlIDxVUkw6IGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9zb2Z0d2FyZS5odG1sPgotZm9yIGRvd25sb2FkIGluc3RydWN0aW9ucykgY2FuIGJlIHNhZmVseSB1c2VkLCBmb3IgZXhhbXBsZS4KLQotCi0qIFdoeSBkb2VzIHRoZSBPcGVuU1NMIGNvbXBpbGF0aW9uIGZhaWwgb24gQWxwaGEgVHJ1NjQgVW5peD8KLQotT24gc29tZSBBbHBoYSBpbnN0YWxsYXRpb25zIHJ1bm5pbmcgVHJ1NjQgVW5peCBhbmQgQ29tcGFxIEMsIHRoZSBjb21waWxhdGlvbgotb2YgY3J5cHRvL3NoYS9zaGFfZGdzdC5jIGZhaWxzIHdpdGggdGhlIG1lc3NhZ2UgJ0ZhdGFsOiAgSW5zdWZmaWNpZW50IHZpcnR1YWwKLW1lbW9yeSB0byBjb250aW51ZSBjb21waWxhdGlvbi4nICBBcyBmYXIgYXMgdGhlIHRlc3RzIGhhdmUgc2hvd24sIHRoaXMgbWF5IGJlCi1hIGNvbXBpbGVyIGJ1Zy4gIFdoYXQgaGFwcGVucyBpcyB0aGF0IGl0IGVhdHMgdXAgYSBsb3Qgb2YgcmVzaWRlbnQgbWVtb3J5Ci10byBidWlsZCBzb21ldGhpbmcsIHByb2JhYmx5IGEgdGFibGUuICBUaGUgcHJvYmxlbSBpcyBjbGVhcmx5IGluIHRoZQotb3B0aW1pemF0aW9uIGNvZGUsIGJlY2F1c2UgaWYgb25lIGVsaW1pbmF0ZXMgb3B0aW1pemF0aW9uIGNvbXBsZXRlbHkgKC1PMCksCi10aGUgY29tcGlsYXRpb24gZ29lcyB0aHJvdWdoIChhbmQgdGhlIGNvbXBpbGVyIGNvbnN1bWVzIGFib3V0IDJNQiBvZiByZXNpZGVudAotbWVtb3J5IGluc3RlYWQgb2YgMjQwTUIgb3Igd2hhdGV2ZXIgb25lJ3MgbGltaXQgaXMgY3VycmVudGx5KS4KLQotVGhlcmUgYXJlIHRocmVlIG9wdGlvbnMgdG8gc29sdmUgdGhpcyBwcm9ibGVtOgotCi0xLiBzZXQgeW91ciBjdXJyZW50IGRhdGEgc2VnbWVudCBzaXplIHNvZnQgbGltaXQgaGlnaGVyLiAgRXhwZXJpZW5jZSBzaG93cwotdGhhdCBhYm91dCAyNDEwMDAga2J5dGVzIHNlZW1zIHRvIGJlIGVub3VnaCBvbiBhbiBBbHBoYVNlcnZlciBEUzEwLiAgWW91IGRvCi10aGlzIHdpdGggdGhlIGNvbW1hbmQgJ3VsaW1pdCAtU2Qgbm5ubm5uJywgd2hlcmUgJ25ubm5ubicgaXMgdGhlIG51bWJlciBvZgota2J5dGVzIHRvIHNldCB0aGUgbGltaXQgdG8uCi0KLTIuIElmIHlvdSBoYXZlIGEgaGFyZCBsaW1pdCB0aGF0IGlzIGxvd2VyIHRoYW4gd2hhdCB5b3UgbmVlZCBhbmQgeW91IGNhbid0Ci1nZXQgaXQgY2hhbmdlZCwgeW91IGNhbiBjb21waWxlIGFsbCBvZiBPcGVuU1NMIHdpdGggLU8wIGFzIG9wdGltaXphdGlvbgotbGV2ZWwuICBUaGlzIGlzIGhvd2V2ZXIgbm90IGEgdmVyeSBuaWNlIHRoaW5nIHRvIGRvIGZvciB0aG9zZSB3aG8gZXhwZWN0IHRvCi1nZXQgdGhlIGJlc3QgcmVzdWx0IGZyb20gT3BlblNTTC4gIEEgYml0IG1vcmUgY29tcGxpY2F0ZWQgc29sdXRpb24gaXMgdGhlCi1mb2xsb3dpbmc6Ci0KLS0tLS0tIHNuaXA6c3RhcnQgLS0tLS0KLSAgbWFrZSBESVJTPWNyeXB0byBTRElSUz1zaGEgImBncmVwICdeQ0ZMQUc9JyBNYWtlZmlsZS5zc2wgfCBcCi0gICAgICAgc2VkIC1lICdzLyAtT1swLTldIC8gLU8wIC8nYCIKLSAgcm0gYGxzIGNyeXB0by8qLm8gY3J5cHRvL3NoYS8qLm8gfCBncmVwIC12ICdzaGFfZGdzdFwubydgCi0gIG1ha2UKLS0tLS0tIHNuaXA6ZW5kIC0tLS0tCi0KLVRoaXMgd2lsbCBvbmx5IGNvbXBpbGUgc2hhX2Rnc3QuYyB3aXRoIC1PMCwgdGhlIHJlc3Qgd2l0aCB0aGUgb3B0aW1pemF0aW9uCi1sZXZlbCBjaG9zZW4gYnkgdGhlIGNvbmZpZ3VyYXRpb24gcHJvY2Vzcy4gIFdoZW4gdGhlIGFib3ZlIGlzIGRvbmUsIGRvIHRoZQotdGVzdCBhbmQgaW5zdGFsbGF0aW9uIGFuZCB5b3UncmUgc2V0LgotCi0zLiBSZWNvbmZpZ3VyZSB0aGUgdG9vbGtpdCB3aXRoIG5vLXNoYTAgb3B0aW9uIHRvIGxlYXZlIG91dCBTSEEwLiBJdCAKLXNob3VsZCBub3QgYmUgdXNlZCBhbmQgaXMgbm90IHVzZWQgaW4gU1NML1RMUyBub3IgYW55IG90aGVyIHJlY29nbml6ZWQKLXByb3RvY29sIGluIGVpdGhlciBjYXNlLgotCi0KLSogV2h5IGRvZXMgdGhlIE9wZW5TU0wgY29tcGlsYXRpb24gZmFpbCB3aXRoICJhcjogY29tbWFuZCBub3QgZm91bmQiPwotCi1HZXR0aW5nIHRoaXMgbWVzc2FnZSBpcyBxdWl0ZSB1c3VhbCBvbiBTb2xhcmlzIDIsIGJlY2F1c2UgU3VuIGhhcyBoaWRkZW4KLWF3YXkgJ2FyJyBhbmQgb3RoZXIgZGV2ZWxvcG1lbnQgY29tbWFuZHMgaW4gZGlyZWN0b3JpZXMgdGhhdCBhcmVuJ3QgaW4KLSRQQVRIIGJ5IGRlZmF1bHQuICBPbmUgb2YgdGhvc2UgZGlyZWN0b3JpZXMgaXMgJy91c3IvY2NzL2JpbicuICBUaGUKLXF1aWNrZXN0IHdheSB0byBmaXggdGhpcyBpcyB0byBkbyB0aGUgZm9sbG93aW5nIChpdCBhc3N1bWVzIHlvdSB1c2Ugc2gKLW9yIGFueSBzaC1jb21wYXRpYmxlIHNoZWxsKToKLQotLS0tLS0gc25pcDpzdGFydCAtLS0tLQotICBQQVRIPSR7UEFUSH06L3Vzci9jY3MvYmluOyBleHBvcnQgUEFUSAotLS0tLS0gc25pcDplbmQgLS0tLS0KLQotYW5kIHRoZW4gcmVkbyB0aGUgY29tcGlsYXRpb24uICBXaGF0IHlvdSBzaG91bGQgcmVhbGx5IGRvIGlzIG1ha2Ugc3VyZQotJy91c3IvY2NzL2JpbicgaXMgcGVybWFuZW50bHkgaW4geW91ciAkUEFUSCwgZm9yIGV4YW1wbGUgdGhyb3VnaCB5b3VyCi0nLnByb2ZpbGUnIChhZ2FpbiwgYXNzdW1pbmcgeW91IHVzZSBhIHNoLWNvbXBhdGlibGUgc2hlbGwpLgotCi0KLSogV2h5IGRvZXMgdGhlIE9wZW5TU0wgY29tcGlsYXRpb24gZmFpbCBvbiBXaW4zMiB3aXRoIFZDKys/Ci0KLVNvbWV0aW1lcywgeW91IG1heSBnZXQgcmVwb3J0cyBmcm9tIFZDKysgY29tbWFuZCBsaW5lIChjbCkgdGhhdCBpdAotY2FuJ3QgZmluZCBzdGFuZGFyZCBpbmNsdWRlIGZpbGVzIGxpa2Ugc3RkaW8uaCBhbmQgb3RoZXIgd2VpcmRuZXNzZXMuCi1PbmUgcG9zc2libGUgY2F1c2UgaXMgdGhhdCB0aGUgZW52aXJvbm1lbnQgaXNuJ3QgY29ycmVjdGx5IHNldCB1cC4KLVRvIHNvbHZlIHRoYXQgcHJvYmxlbSBmb3IgVkMrKyB2ZXJzaW9ucyB1cCB0byA2LCBvbmUgc2hvdWxkIHJ1bgotVkNWQVJTMzIuQkFUIHdoaWNoIGlzIGZvdW5kIGluIHRoZSAnYmluJyBzdWJkaXJlY3Rvcnkgb2YgdGhlIFZDKysKLWluc3RhbGxhdGlvbiBkaXJlY3RvcnkgKHNvbWV3aGVyZSB1bmRlciAnUHJvZ3JhbSBGaWxlcycpLiAgRm9yIFZDKysKLXZlcnNpb24gNyAoYW5kIHVwPyksIHdoaWNoIGlzIGFsc28gY2FsbGVkIFZTLk5FVCwgdGhlIGZpbGUgaXMgY2FsbGVkCi1WU1ZBUlMzMi5CQVQgaW5zdGVhZC4KLVRoaXMgbmVlZHMgdG8gYmUgZG9uZSBwcmlvciB0byBydW5uaW5nIE5NQUtFLCBhbmQgdGhlIGNoYW5nZXMgYXJlIG9ubHkKLXZhbGlkIGZvciB0aGUgY3VycmVudCBET1Mgc2Vzc2lvbi4KLQotCi0qIFdoYXQgaXMgc3BlY2lhbCBhYm91dCBPcGVuU1NMIG9uIFJlZGhhdD8KLQotUmVkIEhhdCBMaW51eCAocmVsZWFzZSA3LjAgYW5kIGxhdGVyKSBpbmNsdWRlIGEgcHJlaW5zdGFsbGVkIGxpbWl0ZWQKLXZlcnNpb24gb2YgT3BlblNTTC4gRm9yIHBhdGVudCByZWFzb25zLCBzdXBwb3J0IGZvciBJREVBLCBSQzUgYW5kIE1EQzIKLWlzIGRpc2FibGVkIGluIHRoaXMgdmVyc2lvbi4gVGhlIHNhbWUgbWF5IGFwcGx5IHRvIG90aGVyIExpbnV4IGRpc3RyaWJ1dGlvbnMuCi1Vc2VycyBtYXkgdGhlcmVmb3JlIHdpc2ggdG8gaW5zdGFsbCBtb3JlIG9yIGFsbCBvZiB0aGUgZmVhdHVyZXMgbGVmdCBvdXQuCi0KLVRvIGRvIHRoaXMgeW91IE1VU1QgZW5zdXJlIHRoYXQgeW91IGRvIG5vdCBvdmVyd3JpdGUgdGhlIG9wZW5zc2wgdGhhdCBpcyBpbgotL3Vzci9iaW4gb24geW91ciBSZWQgSGF0IG1hY2hpbmUuIFNldmVyYWwgcGFja2FnZXMgZGVwZW5kIG9uIHRoaXMgZmlsZSwKLWluY2x1ZGluZyBzZW5kbWFpbCBhbmQgc3NoLiAvdXNyL2xvY2FsL2JpbiBpcyBhIGdvb2QgYWx0ZXJuYXRpdmUgY2hvaWNlLiBUaGUKLWxpYnJhcmllcyB0aGF0IGNvbWUgd2l0aCBSZWQgSGF0IDcuMCBvbndhcmRzIGhhdmUgZGlmZmVyZW50IG5hbWVzIGFuZCBzbyBhcmUKLW5vdCBhZmZlY3RlZC4gKGVnIEZvciBSZWQgSGF0IDcuMiB0aGV5IGFyZSAvbGliL2xpYnNzbC5zby4wLjkuNmIgYW5kCi0vbGliL2xpYmNyeXB0by5zby4wLjkuNmIgd2l0aCBzeW1saW5rcyAvbGliL2xpYnNzbC5zby4yIGFuZAotL2xpYi9saWJjcnlwdG8uc28uMiByZXNwZWN0aXZlbHkpLgotCi1QbGVhc2Ugbm90ZSB0aGF0IHdlIGhhdmUgYmVlbiBhZHZpc2VkIGJ5IFJlZCBIYXQgYXR0ZW1wdGluZyB0byByZWNvbXBpbGUgdGhlCi1vcGVuc3NsIHJwbSB3aXRoIGFsbCB0aGUgY3J5cHRvZ3JhcGh5IGVuYWJsZWQgd2lsbCBub3Qgd29yay4gQWxsIG90aGVyCi1wYWNrYWdlcyBkZXBlbmQgb24gdGhlIG9yaWdpbmFsIFJlZCBIYXQgc3VwcGxpZWQgb3BlbnNzbCBwYWNrYWdlLiBJdCBpcyBhbHNvCi13b3J0aCBub3RpbmcgdGhhdCBkdWUgdG8gdGhlIHdheSBSZWQgSGF0IHN1cHBsaWVzIGl0cyBwYWNrYWdlcywgdXBkYXRlcyB0bwotb3BlbnNzbCBvbiBlYWNoIGRpc3RyaWJ1dGlvbiBuZXZlciBjaGFuZ2UgdGhlIHBhY2thZ2UgdmVyc2lvbiwgb25seSB0aGUKLWJ1aWxkIG51bWJlci4gRm9yIGV4YW1wbGUsIG9uIFJlZCBIYXQgNy4xLCB0aGUgbGF0ZXN0IG9wZW5zc2wgcGFja2FnZSBoYXMKLXZlcnNpb24gbnVtYmVyIDAuOS42IGFuZCBidWlsZCBudW1iZXIgOSBldmVuIHRob3VnaCBpdCBjb250YWlucyBhbGwgdGhlCi1yZWxldmFudCB1cGRhdGVzIGluIHBhY2thZ2VzIHVwIHRvIGFuZCBpbmNsdWRpbmcgMC45LjZiLgotCi1BIHBvc3NpYmxlIHdheSBhcm91bmQgdGhpcyBpcyB0byBwZXJzdWFkZSBSZWQgSGF0IHRvIHByb2R1Y2UgYSBub24tVVMKLXZlcnNpb24gb2YgUmVkIEhhdCBMaW51eC4KLQotRllJOiBQYXRlbnQgbnVtYmVycyBhbmQgZXhwaXJ5IGRhdGVzIG9mIFVTIHBhdGVudHM6Ci1NREMtMjogNCw5MDgsODYxIDEzLzAzLzIwMDcKLUlERUE6ICA1LDIxNCw3MDMgMjUvMDUvMjAxMAotUkM1OiAgIDUsNzI0LDQyOCAwMy8wMy8yMDE1Ci0KLQotKiBXaHkgZG9lcyB0aGUgT3BlblNTTCBjb21waWxhdGlvbiBmYWlsIG9uIE1hY09TIFg/Ci0KLUlmIHRoZSBmYWlsdXJlIGhhcHBlbnMgd2hlbiB0cnlpbmcgdG8gYnVpbGQgdGhlICJvcGVuc3NsIiBiaW5hcnksIHdpdGgKLWEgbGFyZ2UgbnVtYmVyIG9mIHVuZGVmaW5lZCBzeW1ib2xzLCBpdCdzIHZlcnkgcHJvYmFibGUgdGhhdCB5b3UgaGF2ZQotT3BlblNTTCAwLjkuNmIgZGVsaXZlcmVkIHdpdGggdGhlIG9wZXJhdGluZyBzeXN0ZW0gKHlvdSBjYW4gZmluZCBvdXQgYnkKLXJ1bm5pbmcgJy91c3IvYmluL29wZW5zc2wgdmVyc2lvbicpIGFuZCB0aGF0IHlvdSB3ZXJlIHRyeWluZyB0byBidWlsZAotT3BlblNTTCAwLjkuNyBvciBuZXdlci4gIFRoZSBwcm9ibGVtIGlzIHRoYXQgdGhlIGxvYWRlciAoJ2xkJykgaW4KLU1hY09TIFggaGFzIGEgbWlzZmVhdHVyZSB0aGF0J3MgcXVpdGUgZGlmZmljdWx0IHRvIGdvIGFyb3VuZC4KLUxvb2sgaW4gdGhlIGZpbGUgUFJPQkxFTVMgZm9yIGEgbW9yZSBkZXRhaWxlZCBleHBsYW5hdGlvbiBhbmQgZm9yIHBvc3NpYmxlCi1zb2x1dGlvbnMuCi0KLQotKiBXaHkgZG9lcyB0aGUgT3BlblNTTCB0ZXN0IHN1aXRlIGZhaWwgb24gTWFjT1MgWD8KLQotSWYgdGhlIGZhaWx1cmUgaGFwcGVucyB3aGVuIHJ1bm5pbmcgJ21ha2UgdGVzdCcgYW5kIHRoZSBSQzQgdGVzdCBmYWlscywKLWl0J3MgdmVyeSBwcm9iYWJsZSB0aGF0IHlvdSBoYXZlIE9wZW5TU0wgMC45LjZiIGRlbGl2ZXJlZCB3aXRoIHRoZQotb3BlcmF0aW5nIHN5c3RlbSAoeW91IGNhbiBmaW5kIG91dCBieSBydW5uaW5nICcvdXNyL2Jpbi9vcGVuc3NsIHZlcnNpb24nKQotYW5kIHRoYXQgeW91IHdlcmUgdHJ5aW5nIHRvIGJ1aWxkIE9wZW5TU0wgMC45LjZkLiAgVGhlIHByb2JsZW0gaXMgdGhhdAotdGhlIGxvYWRlciAoJ2xkJykgaW4gTWFjT1MgWCBoYXMgYSBtaXNmZWF0dXJlIHRoYXQncyBxdWl0ZSBkaWZmaWN1bHQgdG8KLWdvIGFyb3VuZCBhbmQgaGFzIGxpbmtlZCB0aGUgcHJvZ3JhbXMgIm9wZW5zc2wiIGFuZCB0aGUgdGVzdCBwcm9ncmFtcwotd2l0aCAvdXNyL2xpYi9saWJjcnlwdG8uZHlsaWIgYW5kIC91c3IvbGliL2xpYnNzbC5keWxpYiBpbnN0ZWFkIG9mIHRoZQotbGlicmFyaWVzIHlvdSBqdXN0IGJ1aWx0LgotTG9vayBpbiB0aGUgZmlsZSBQUk9CTEVNUyBmb3IgYSBtb3JlIGRldGFpbGVkIGV4cGxhbmF0aW9uIGFuZCBmb3IgcG9zc2libGUKLXNvbHV0aW9ucy4KLQotKiBXaHkgZG9lcyB0aGUgT3BlblNTTCB0ZXN0IHN1aXRlIGZhaWwgaW4gQk5fc3FyIHRlc3QgW29uIGEgNjQtYml0IHBsYXRmb3JtXT8KLQotRmFpbHVyZSBpbiBCTl9zcXIgdGVzdCBpcyBtb3N0IGxpa2VseSBjYXVzZWQgYnkgYSBmYWlsdXJlIHRvIGNvbmZpZ3VyZSB0aGUKLXRvb2xraXQgZm9yIGN1cnJlbnQgcGxhdGZvcm0gb3IgbGFjayBvZiBzdXBwb3J0IGZvciB0aGUgcGxhdGZvcm0gaW4gcXVlc3Rpb24uCi1SdW4gJy4vY29uZmlnIC10JyBhbmQgJy4vYXBwcy9vcGVuc3NsIHZlcnNpb24gLXAnLiBEbyB0aGVzZSBwbGF0Zm9ybQotaWRlbnRpZmllcnMgbWF0Y2g/IElmIHRoZXkgZG9uJ3QsIHRoZW4geW91IG1vc3QgbGlrZWx5IGZhaWxlZCB0byBydW4KLS4vY29uZmlnIGFuZCB5b3UncmUgaGVyZWJ5IGFkdmlzZWQgdG8gZG8gc28gYmVmb3JlIGZpbGluZyBhIGJ1ZyByZXBvcnQuCi1JZiAuL2NvbmZpZyBpdHNlbGYgZmFpbHMgdG8gcnVuLCB0aGVuIGl0J3MgbW9zdCBsaWtlbHkgcHJvYmxlbSB3aXRoIHlvdXIKLWxvY2FsIGVudmlyb25tZW50IGFuZCB5b3Ugc2hvdWxkIHR1cm4gdG8geW91ciBzeXN0ZW0gYWRtaW5pc3RyYXRvciAob3IKLXNpbWlsYXIpLiBJZiBpZGVudGlmaWVycyBtYXRjaCAoYW5kL29yIG5vIGFsdGVybmF0aXZlIGlkZW50aWZpZXIgaXMKLXN1Z2dlc3RlZCBieSAuL2NvbmZpZyBzY3JpcHQpLCB0aGVuIHRoZSBwbGF0Zm9ybSBpcyB1bnN1cHBvcnRlZC4gVGhlcmUgbWlnaHQKLW9yIG1pZ2h0IG5vdCBiZSBhIHdvcmthcm91bmQuIE1vc3Qgbm90YWJseSBvbiBTUEFSQzY0IHBsYXRmb3JtcyB3aXRoIEdOVQotQyBjb21waWxlciB5b3Ugc2hvdWxkIGJlIGFibGUgdG8gcHJvZHVjZSBhIHdvcmtpbmcgYnVpbGQgYnkgcnVubmluZwotJy4vY29uZmlnIC1tMzInLiBJIHVuZGVyc3RhbmQgdGhhdCAtbTMyIG1pZ2h0IG5vdCBiZSB3aGF0IHlvdSB3YW50L25lZWQsCi1idXQgdGhlIGJ1aWxkIHNob3VsZCBiZSBvcGVyYXRpb25hbC4gRm9yIGZ1cnRoZXIgZGV0YWlscyB0dXJuIHRvCi08b3BlbnNzbC1kZXZAb3BlbnNzbC5vcmc+LgotCi0qIFdoeSBkb2VzIE9wZW5CU0QtaTM4NiBidWlsZCBmYWlsIG9uIGRlcy01ODYucyB3aXRoICJVbmltcGxlbWVudGVkIHNlZ21lbnQgdHlwZSI/Ci0KLUFzIG9mIDAuOS43IGFzc2VtYmxlciByb3V0aW5lcyB3ZXJlIG92ZXJoYXVsZWQgZm9yIHBvc2l0aW9uIGluZGVwZW5kZW5jZQotb2YgdGhlIG1hY2hpbmUgY29kZSwgd2hpY2ggaXMgZXNzZW50aWFsIGZvciBzaGFyZWQgbGlicmFyeSBzdXBwb3J0LiBGb3IKLXNvbWUgcmVhc29uIE9wZW5CU0QgaXMgZXF1aXBwZWQgd2l0aCBhbiBvdXQtb2YtZGF0ZSBHTlUgYXNzZW1ibGVyIHdoaWNoCi1maW5kcyB0aGUgbmV3IGNvZGUgb2ZmZW5zaXZlLiBUbyB3b3JrIGFyb3VuZCB0aGUgcHJvYmxlbSwgY29uZmlndXJlIHdpdGgKLW5vLWFzbSAoYW5kIHNhY3JpZmljZSBhIGdyZWF0IGRlYWwgb2YgcGVyZm9ybWFuY2UpIG9yIHBhdGNoIHlvdXIgYXNzZW1ibGVyCi1hY2NvcmRpbmcgdG8gPFVSTDogaHR0cDovL3d3dy5vcGVuc3NsLm9yZy9+YXBwcm8vZ2FzLTEuOTIuMy5PcGVuQlNELnBhdGNoPi4KLUZvciB5b3VyIGNvbnZlbmllbmNlIGEgcHJlLWNvbXBpbGVkIHJlcGxhY2VtZW50IGJpbmFyeSBpcyBwcm92aWRlZCBhdAotPFVSTDogaHR0cDovL3d3dy5vcGVuc3NsLm9yZy9+YXBwcm8vZ2FzLTEuOTIuMy5zdGF0aWMuYW91dC5iaW4+LgotUmVwb3J0ZWRseSBlbGRlciAqQlNEIGEub3V0IHBsYXRmb3JtcyBhbHNvIHN1ZmZlciBmcm9tIHRoaXMgcHJvYmxlbSBhbmQKLXJlbWVkeSBzaG91bGQgYmUgc2FtZS4gUHJvdmlkZWQgYmluYXJ5IGlzIHN0YXRpY2FsbHkgbGlua2VkIGFuZCBzaG91bGQgYmUKLXdvcmtpbmcgYWNyb3NzIHdpZGVyIHJhbmdlIG9mICpCU0QgYnJhbmNoZXMsIG5vdCBqdXN0IE9wZW5CU0QuCi0KLSogV2h5IGRvZXMgdGhlIE9wZW5TU0wgdGVzdCBzdWl0ZSBmYWlsIGluIHNoYTUxMnQgb24geDg2IENQVT8KLQotSWYgdGhlIHRlc3QgcHJvZ3JhbSBpbiBxdWVzdGlvbiBmYWlscyB3aXRocyBTSUdJTEwsIElsbGVnYWwgSW5zdHJ1Y3Rpb24KLWV4Y2VwdGlvbiwgdGhlbiB5b3UgbW9yZSB0aGFuIGxpa2VseSB0byBydW4gU1NFMi1jYXBhYmxlIENQVSwgc3VjaCBhcwotSW50ZWwgUDQsIHVuZGVyIGNvbnRyb2wgb2Yga2VybmVsIHdoaWNoIGRvZXMgbm90IHN1cHBvcnQgU1NFMgotaW5zdHJ1Y3Rpb24gZXh0ZW50aW9ucy4gU2VlIGFjY29tcGFueWluZyBJTlNUQUxMIGZpbGUgYW5kCi1PUEVOU1NMX2lhMzJjYXAoMykgZG9jdW1lbnRhdGlvbiBwYWdlIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLgotCi0qIFdoeSBkb2VzIGNvbXBpbGVyIGZhaWwgdG8gY29tcGlsZSBzaGE1MTIuYz8KLQotT3BlblNTTCBTSEEtNTEyIGltcGxlbWVudGF0aW9uIGRlcGVuZHMgb24gY29tcGlsZXIgc3VwcG9ydCBmb3IgNjQtYml0Ci1pbnRlZ2VyIHR5cGUuIEZldyBlbGRlciBjb21waWxlcnMgW1VMVFJJWCBjYywgU0NPIGNvbXBpbGVyIHRvIG1lbnRpb24gYQotY291cGxlXSBsYWNrIHN1cHBvcnQgZm9yIHRoaXMgYW5kIHRoZXJlZm9yZSBhcmUgaW5jYXBhYmxlIG9mIGNvbXBpbGluZwotdGhlIG1vZHVsZSBpbiBxdWVzdGlvbi4gVGhlIHJlY29tbWVuZGF0aW9uIGlzIHRvIGRpc2FibGUgU0hBLTUxMiBieQotYWRkaW5nIG5vLXNoYTUxMiB0byAuL2NvbmZpZyBbb3IgLi9Db25maWd1cmVdIGNvbW1hbmQgbGluZS4gQW5vdGhlcgotcG9zc2libGUgYWx0ZXJuYXRpdmUgbWlnaHQgYmUgdG8gc3dpdGNoIHRvIEdDQy4KLQotKiBUZXN0IHN1aXRlIHN0aWxsIGZhaWxzLCB3aGF0IHRvIGRvPwotCi1Bbm90aGVyIGNvbW1vbiByZWFzb24gZm9yIGZhaWx1cmUgdG8gY29tcGxldGUgc29tZSBwYXJ0aWN1bGFyIHRlc3QgaXMKLXNpbXBseSBiYWQgY29kZSBnZW5lcmF0ZWQgYnkgYSBidWdneSBjb21wb25lbnQgaW4gdG9vbGNoYWluIG9yIGRlZmljaWVuY3kKLWluIHJ1bi10aW1lIGVudmlyb25tZW50LiBUaGVyZSBhcmUgZmV3IGNhc2VzIGRvY3VtZW50ZWQgaW4gUFJPQkxFTVMgZmlsZSwKLWNvbnN1bHQgaXQgZm9yIHBvc3NpYmxlIHdvcmthcm91bmQgYmVmb3JlIHlvdSBiZWF0IHRoZSBkcnVtLiBFdmVuIGlmIHlvdQotZG9uJ3QgZmluZCBzb2x1dGlvbiBvciBldmVuIG1lbnRpb24gdGhlcmUsIGRvIHJlc2VydmUgZm9yIHBvc3NpYmlsaXR5IG9mCi1hIGNvbXBpbGVyIGJ1Zy4gQ29tcGlsZXIgYnVncyBtaWdodCBhcHBlYXIgaW4gcmF0aGVyIGJpemFycmUgd2F5cywgdGhleQotbmV2ZXIgbWFrZSBzZW5zZSwgYW5kIHRlbmQgdG8gZW1lcmdlIHdoZW4geW91IGxlYXN0IGV4cGVjdCB0aGVtLiBJbiBvcmRlcgotdG8gaWRlbnRpZnkgb25lLCBkcm9wIG9wdGltaXphdGlvbiBsZXZlbCwgZS5nLiBieSBlZGl0aW5nIENGTEFHIGxpbmUgaW4KLXRvcC1sZXZlbCBNYWtlZmlsZSwgcmVjb21waWxlIGFuZCByZS1ydW4gdGhlIHRlc3QuCi0KLSogSSB0aGluayBJJ3ZlIGZvdW5kIGEgYnVnLCB3aGF0IHNob3VsZCBJIGRvPwotCi1JZiB5b3UgYXJlIGEgbmV3IHVzZXIgdGhlbiBpdCBpcyBxdWl0ZSBsaWtlbHkgeW91IGhhdmVuJ3QgZm91bmQgYSBidWcgYW5kCi1zb21ldGhpbmcgaXMgaGFwcGVuaW5nIHlvdSBhcmVuJ3QgZmFtaWxpYXIgd2l0aC4gQ2hlY2sgdGhpcyBGQVEsIHRoZSBhc3NvY2lhdGVkCi1kb2N1bWVudGF0aW9uIGFuZCB0aGUgbWFpbGluZyBsaXN0cyBmb3Igc2ltaWxhciBxdWVyaWVzLiBJZiB5b3UgYXJlIHN0aWxsCi11bnN1cmUgd2hldGhlciBpdCBpcyBhIGJ1ZyBvciBub3Qgc3VibWl0IGEgcXVlcnkgdG8gdGhlIG9wZW5zc2wtdXNlcnMgbWFpbGluZwotbGlzdC4KLQotCi0qIEknbSBTVVJFIEkndmUgZm91bmQgYSBidWcsIGhvdyBkbyBJIHJlcG9ydCBpdD8KLQotQnVnIHJlcG9ydHMgd2l0aCBubyBzZWN1cml0eSBpbXBsaWNhdGlvbnMgc2hvdWxkIGJlIHNlbnQgdG8gdGhlIHJlcXVlc3QKLXRyYWNrZXIuIFRoaXMgY2FuIGJlIGRvbmUgYnkgbWFpbGluZyB0aGUgcmVwb3J0IHRvIDxydEBvcGVuc3NsLm9yZz4gKG9yIGl0cwotYWxpYXMgPG9wZW5zc2wtYnVnc0BvcGVuc3NsLm9yZz4pLCBwbGVhc2Ugbm90ZSB0aGF0IG1lc3NhZ2VzIHNlbnQgdG8gdGhlCi1yZXF1ZXN0IHRyYWNrZXIgYWxzbyBhcHBlYXIgaW4gdGhlIHB1YmxpYyBvcGVuc3NsLWRldiBtYWlsaW5nIGxpc3QuCi0KLVRoZSByZXBvcnQgc2hvdWxkIGJlIGluIHBsYWluIHRleHQuIEFueSBwYXRjaGVzIHNob3VsZCBiZSBzZW50IGFzCi1wbGFpbiB0ZXh0IGF0dGFjaG1lbnRzIGJlY2F1c2Ugc29tZSBtYWlsZXJzIGNvcnJ1cHQgcGF0Y2hlcyBzZW50IGlubGluZS4KLUlmIHlvdXIgaXNzdWUgYWZmZWN0cyBtdWx0aXBsZSB2ZXJzaW9ucyBvZiBPcGVuU1NMIGNoZWNrIGFueSBwYXRjaGVzIGFwcGx5Ci1jbGVhbmx5IGFuZCwgaWYgcG9zc2libGUgaW5jbHVkZSBwYXRjaGVzIHRvIGVhY2ggYWZmZWN0ZWQgdmVyc2lvbi4KLQotVGhlIHJlcG9ydCBzaG91bGQgYmUgZ2l2ZW4gYSBtZWFuaW5nZnVsIHN1YmplY3QgbGluZSBicmllZmx5IHN1bW1hcmlzaW5nIHRoZQotaXNzdWUuIEp1c3QgImJ1ZyBpbiBPcGVuU1NMIiBvciAiYnVnIGluIE9wZW5TU0wgMC45LjhuIiBpcyBub3QgdmVyeSBoZWxwZnVsLgotCi1CeSBzZW5kaW5nIHJlcG9ydHMgdG8gdGhlIHJlcXVlc3QgdHJhY2tlciB0aGUgYnVnIGNhbiB0aGVuIGJlIGdpdmVuIGEgcHJpb3JpdHkKLWFuZCBhc3NpZ25lZCB0byB0aGUgYXBwcm9wcmlhdGUgbWFpbnRhaW5lci4gVGhlIGhpc3Rvcnkgb2YgZGlzY3Vzc2lvbnMgY2FuIGJlCi1hY2Nlc3NlZCBhbmQgaWYgdGhlIGlzc3VlIGhhcyBiZWVuIGFkZHJlc3NlZCBvciBhIHJlYXNvbiB3aHkgbm90LiBJZiBwYXRjaGVzCi1hcmUgb25seSBzZW50IHRvIG9wZW5zc2wtZGV2IHRoZXkgY2FuIGJlIG1pc2xhaWQgaWYgYSB0ZWFtIG1lbWJlciBoYXMgdG8KLXdhZGUgdGhyb3VnaCBtb250aHMgb2Ygb2xkIG1lc3NhZ2VzIHRvIHJldmlldyB0aGUgZGlzY3Vzc2lvbi4KLQotU2VlIGFsc28gPFVSTDogaHR0cDovL3d3dy5vcGVuc3NsLm9yZy9zdXBwb3J0L3J0Lmh0bWw+Ci0KLQotKiBJJ3ZlIGZvdW5kIGEgc2VjdXJpdHkgaXNzdWUsIGhvdyBkbyBJIHJlcG9ydCBpdD8KLQotSWYgeW91IHRoaW5rIHlvdXIgYnVnIGhhcyBzZWN1cml0eSBpbXBsaWNhdGlvbnMgdGhlbiBwbGVhc2Ugc2VuZCBpdCB0bwotb3BlbnNzbC1zZWN1cml0eUBvcGVuc3NsLm9yZyBpZiB5b3UgZG9uJ3QgZ2V0IGEgcHJvbXB0IHJlcGx5IGF0IGxlYXN0IAotYWNrbm93bGVkZ2luZyByZWNlaXB0IHRoZW4gcmVzZW5kIG9yIG1haWwgaXQgZGlyZWN0bHkgdG8gb25lIG9mIHRoZQotbW9yZSBhY3RpdmUgdGVhbSBtZW1iZXJzIChlLmcuIFN0ZXZlKS4KLQotTm90ZSB0aGF0IGJ1Z3Mgb25seSBwcmVzZW50IGluIHRoZSBvcGVuc3NsIHV0aWxpdHkgYXJlIG5vdCBpbiBnZW5lcmFsCi1jb25zaWRlcmVkIHRvIGJlIHNlY3VyaXR5IGlzc3Vlcy4gCi0KLVtQUk9HXSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotKiBJcyBPcGVuU1NMIHRocmVhZC1zYWZlPwotCi1ZZXMgKHdpdGggbGltaXRhdGlvbnM6IGFuIFNTTCBjb25uZWN0aW9uIG1heSBub3QgY29uY3VycmVudGx5IGJlIHVzZWQKLWJ5IG11bHRpcGxlIHRocmVhZHMpLiAgT24gV2luZG93cyBhbmQgbWFueSBVbml4IHN5c3RlbXMsIE9wZW5TU0wKLWF1dG9tYXRpY2FsbHkgdXNlcyB0aGUgbXVsdGktdGhyZWFkZWQgdmVyc2lvbnMgb2YgdGhlIHN0YW5kYXJkCi1saWJyYXJpZXMuICBJZiB5b3VyIHBsYXRmb3JtIGlzIG5vdCBvbmUgb2YgdGhlc2UsIGNvbnN1bHQgdGhlIElOU1RBTEwKLWZpbGUuCi0KLU11bHRpLXRocmVhZGVkIGFwcGxpY2F0aW9ucyBtdXN0IHByb3ZpZGUgdHdvIGNhbGxiYWNrIGZ1bmN0aW9ucyB0bwotT3BlblNTTCBieSBjYWxsaW5nIENSWVBUT19zZXRfbG9ja2luZ19jYWxsYmFjaygpIGFuZAotQ1JZUFRPX3NldF9pZF9jYWxsYmFjaygpLCBmb3IgYWxsIHZlcnNpb25zIG9mIE9wZW5TU0wgdXAgdG8gYW5kCi1pbmNsdWRpbmcgMC45LjhbYWJjLi4uXS4gQXMgb2YgdmVyc2lvbiAxLjAuMCwgQ1JZUFRPX3NldF9pZF9jYWxsYmFjaygpCi1hbmQgYXNzb2NpYXRlZCBBUElzIGFyZSBkZXByZWNhdGVkIGJ5IENSWVBUT19USFJFQURJRF9zZXRfY2FsbGJhY2soKQotYW5kIGZyaWVuZHMuIFRoaXMgaXMgZGVzY3JpYmVkIGluIHRoZSB0aHJlYWRzKDMpIG1hbnBhZ2UuCi0KLSogSSd2ZSBjb21waWxlZCBhIHByb2dyYW0gdW5kZXIgV2luZG93cyBhbmQgaXQgY3Jhc2hlczogd2h5PwotCi1UaGlzIGlzIHVzdWFsbHkgYmVjYXVzZSB5b3UndmUgbWlzc2VkIHRoZSBjb21tZW50IGluIElOU1RBTEwuVzMyLgotWW91ciBhcHBsaWNhdGlvbiBtdXN0IGxpbmsgYWdhaW5zdCB0aGUgc2FtZSB2ZXJzaW9uIG9mIHRoZSBXaW4zMgotQy1SdW50aW1lIGFnYWluc3Qgd2hpY2ggeW91ciBvcGVuc3NsIGxpYnJhcmllcyB3ZXJlIGxpbmtlZC4gIFRoZQotZGVmYXVsdCB2ZXJzaW9uIGZvciBPcGVuU1NMIGlzIC9NRCAtICJNdWx0aXRocmVhZGVkIERMTCIuCi0KLUlmIHlvdSBhcmUgdXNpbmcgTWljcm9zb2Z0IFZpc3VhbCBDKysncyBJREUgKFZpc3VhbCBTdHVkaW8pLCBpbgotbWFueSBjYXNlcywgeW91ciBuZXcgcHJvamVjdCBtb3N0IGxpa2VseSBkZWZhdWx0ZWQgdG8gIkRlYnVnCi1TaW5nbGV0aHJlYWRlZCIgLSAvTUwuICBUaGlzIGlzIE5PVCBpbnRlcmNoYW5nZWFibGUgd2l0aCAvTUQgYW5kIHlvdXIKLXByb2dyYW0gd2lsbCBjcmFzaCwgdHlwaWNhbGx5IG9uIHRoZSBmaXJzdCBCSU8gcmVsYXRlZCByZWFkIG9yIHdyaXRlCi1vcGVyYXRpb24uCi0KLUZvciBlYWNoIG9mIHRoZSBzaXggcG9zc2libGUgbGluayBzdGFnZSBjb25maWd1cmF0aW9ucyB3aXRoaW4gV2luMzIsCi15b3VyIGFwcGxpY2F0aW9uIG11c3QgbGluayAgYWdhaW5zdCB0aGUgc2FtZSBieSB3aGljaCBPcGVuU1NMIHdhcwotYnVpbHQuICBJZiB5b3UgYXJlIHVzaW5nIE1TIFZpc3VhbCBDKysgKFN0dWRpbykgdGhpcyBjYW4gYmUgY2hhbmdlZAotYnk6Ci0KLSAxLiBTZWxlY3QgU2V0dGluZ3MuLi4gZnJvbSB0aGUgUHJvamVjdCBNZW51LgotIDIuIFNlbGVjdCB0aGUgQy9DKysgVGFiLgotIDMuIFNlbGVjdCAiQ29kZSBHZW5lcmF0aW9uIGZyb20gdGhlICJDYXRlZ29yeSIgZHJvcCBkb3duIGxpc3QgYm94Ci0gNC4gU2VsZWN0IHRoZSBBcHByb3ByaWF0ZSBsaWJyYXJ5IChzZWUgdGFibGUgYmVsb3cpIGZyb20gdGhlICJVc2UKLSAgICBydW4tdGltZSBsaWJyYXJ5IiBkcm9wIGRvd24gbGlzdCBib3guICBQZXJmb3JtIHRoaXMgc3RlcCBmb3IgYm90aAotICAgIHlvdXIgZGVidWcgYW5kIHJlbGVhc2UgdmVyc2lvbnMgb2YgeW91ciBhcHBsaWNhdGlvbiAobG9vayBhdCB0aGUKLSAgICB0b3AgbGVmdCBvZiB0aGUgc2V0dGluZ3MgcGFuZWwgdG8gY2hhbmdlIGJldHdlZW4gdGhlIHR3bykKLQotICAgIFNpbmdsZSBUaHJlYWRlZCAgICAgICAgICAgL01MICAgICAgICAtICBNUyBWQysrIG9mdGVuIGRlZmF1bHRzIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgZm9yIHRoZSByZWxlYXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24gb2YgYSBuZXcgcHJvamVjdC4KLSAgICBEZWJ1ZyBTaW5nbGUgVGhyZWFkZWQgICAgIC9NTGQgICAgICAgLSAgTVMgVkMrKyBvZnRlbiBkZWZhdWx0cyB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGZvciB0aGUgZGVidWcgdmVyc2lvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBhIG5ldyBwcm9qZWN0LgotICAgIE11bHRpdGhyZWFkZWQgICAgICAgICAgICAgL01UCi0gICAgRGVidWcgTXVsdGl0aHJlYWRlZCAgICAgICAvTVRkCi0gICAgTXVsdGl0aHJlYWRlZCBETEwgICAgICAgICAvTUQgICAgICAgIC0gIE9wZW5TU0wgZGVmYXVsdHMgdG8gdGhpcy4KLSAgICBEZWJ1ZyBNdWx0aXRocmVhZGVkIERMTCAgIC9NRGQKLQotTm90ZSB0aGF0IGRlYnVnIGFuZCByZWxlYXNlIGxpYnJhcmllcyBhcmUgTk9UIGludGVyY2hhbmdlYWJsZS4gIElmIHlvdQotYnVpbHQgT3BlblNTTCB3aXRoIC9NRCB5b3VyIGFwcGxpY2F0aW9uIG11c3QgdXNlIC9NRCBhbmQgY2Fubm90IHVzZSAvTURkLgotCi1BcyBwZXIgMC45LjggdGhlIGFib3ZlIGxpbWl0YXRpb24gaXMgZWxpbWluYXRlZCBmb3IgLkRMTHMuIE9wZW5TU0wKLS5ETExzIGNvbXBpbGVkIHdpdGggc29tZSBzcGVjaWZpYyBydW4tdGltZSBvcHRpb24gW3dlIGluc2lzdCBvbiB0aGUKLWRlZmF1bHQgL01EXSBjYW4gYmUgZGVwbG95ZWQgd2l0aCBhcHBsaWNhdGlvbiBjb21waWxlZCB3aXRoIGRpZmZlcmVudAotb3B0aW9uIG9yIGV2ZW4gZGlmZmVyZW50IGNvbXBpbGVyLiBCdXQgdGhlcmUgaXMgYSBjYXRjaCEgSW5zdGVhZCBvZgotcmUtY29tcGlsaW5nIE9wZW5TU0wgdG9vbGtpdCwgYXMgeW91IHdvdWxkIGhhdmUgdG8gd2l0aCBwcmlvciB2ZXJzaW9ucywKLXlvdSBoYXZlIHRvIGNvbXBpbGUgc21hbGwgQyBzbmlwcGV0IHdpdGggY29tcGlsZXIgYW5kL29yIG9wdGlvbnMgb2YKLXlvdXIgY2hvaWNlLiBUaGUgc25pcHBldCBnZXRzIGluc3RhbGxlZCBhcwotPGluc3RhbGwtcm9vdD4vaW5jbHVkZS9vcGVuc3NsL2FwcGxpbmsuYyBhbmQgc2hvdWxkIGJlIGVpdGhlciBhZGRlZCB0bwoteW91ciBhcHBsaWNhdGlvbiBwcm9qZWN0IG9yIHNpbXBseSAjaW5jbHVkZS1kIGluIG9uZSBbYW5kIG9ubHkgb25lXQotb2YgeW91ciBhcHBsaWNhdGlvbiBzb3VyY2UgZmlsZXMuIEZhaWx1cmUgdG8gbGluayB0aGlzIHNoaW0gbW9kdWxlCi1pbnRvIHlvdXIgYXBwbGljYXRpb24gbWFuaWZlc3RzIGl0c2VsZiBhcyBmYXRhbCAibm8gT1BFTlNTTF9BcHBsaW5rIgotcnVuLXRpbWUgZXJyb3IuIEFuIGV4cGxpY2l0IHJlbWluZGVyIGlzIGR1ZSB0aGF0IGluIHRoaXMgc2l0dWF0aW9uCi1bbWl4aW5nIGNvbXBpbGVyIG9wdGlvbnNdIGl0IGlzIGFzIGltcG9ydGFudCB0byBhZGQgQ1JZUFRPX21hbGxvY19pbml0Ci1wcmlvciBmaXJzdCBjYWxsIHRvIE9wZW5TU0wuCi0KLSogSG93IGRvIEkgcmVhZCBvciB3cml0ZSBhIERFUiBlbmNvZGVkIGJ1ZmZlciB1c2luZyB0aGUgQVNOMSBmdW5jdGlvbnM/Ci0KLVlvdSBoYXZlIHR3byBvcHRpb25zLiBZb3UgY2FuIGVpdGhlciB1c2UgYSBtZW1vcnkgQklPIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBpMmRfKl9iaW8oKSBvciBkMmlfKl9iaW8oKSBmdW5jdGlvbnMgb3IgeW91IGNhbiB1c2UgdGhlCi1pMmRfKigpLCBkMmlfKigpIGZ1bmN0aW9ucyBkaXJlY3RseS4gU2luY2UgdGhlc2UgYXJlIG9mdGVuIHRoZQotY2F1c2Ugb2YgZ3JpZWYgaGVyZSBhcmUgc29tZSBjb2RlIGZyYWdtZW50cyB1c2luZyBQS0NTNyBhcyBhbiBleGFtcGxlOgotCi0gdW5zaWduZWQgY2hhciAqYnVmLCAqcDsKLSBpbnQgbGVuOwotCi0gbGVuID0gaTJkX1BLQ1M3KHA3LCBOVUxMKTsKLSBidWYgPSBPUEVOU1NMX21hbGxvYyhsZW4pOyAvKiBvciBNYWxsb2MsIGVycm9yIGNoZWNraW5nIG9taXR0ZWQgKi8KLSBwID0gYnVmOwotIGkyZF9QS0NTNyhwNywgJnApOwotCi1BdCB0aGlzIHBvaW50IGJ1ZiBjb250YWlucyB0aGUgbGVuIGJ5dGVzIG9mIHRoZSBERVIgZW5jb2Rpbmcgb2YKLXA3LgotCi1UaGUgb3Bwb3NpdGUgYXNzdW1lcyB3ZSBhbHJlYWR5IGhhdmUgbGVuIGJ5dGVzIGluIGJ1ZjoKLQotIHVuc2lnbmVkIGNoYXIgKnA7Ci0gcCA9IGJ1ZjsKLSBwNyA9IGQyaV9QS0NTNyhOVUxMLCAmcCwgbGVuKTsKLQotQXQgdGhpcyBwb2ludCBwNyBjb250YWlucyBhIHZhbGlkIFBLQ1M3IHN0cnVjdHVyZSBvZiBOVUxMIGlmIGFuIGVycm9yCi1vY2N1cnJlZC4gSWYgYW4gZXJyb3Igb2NjdXJyZWQgRVJSX3ByaW50X2Vycm9ycyhiaW8pIHNob3VsZCBnaXZlIG1vcmUKLWluZm9ybWF0aW9uLgotCi1UaGUgcmVhc29uIGZvciB0aGUgdGVtcG9yYXJ5IHZhcmlhYmxlICdwJyBpcyB0aGF0IHRoZSBBU04xIGZ1bmN0aW9ucwotaW5jcmVtZW50IHRoZSBwYXNzZWQgcG9pbnRlciBzbyBpdCBpcyByZWFkeSB0byByZWFkIG9yIHdyaXRlIHRoZSBuZXh0Ci1zdHJ1Y3R1cmUuIFRoaXMgaXMgb2Z0ZW4gYSBjYXVzZSBvZiBwcm9ibGVtczogd2l0aG91dCB0aGUgdGVtcG9yYXJ5Ci12YXJpYWJsZSB0aGUgYnVmZmVyIHBvaW50ZXIgaXMgY2hhbmdlZCB0byBwb2ludCBqdXN0IGFmdGVyIHRoZSBkYXRhCi10aGF0IGhhcyBiZWVuIHJlYWQgb3Igd3JpdHRlbi4gVGhpcyBtYXkgd2VsbCBiZSB1bmluaXRpYWxpemVkIGRhdGEKLWFuZCBhdHRlbXB0cyB0byBmcmVlIHRoZSBidWZmZXIgd2lsbCBoYXZlIHVucHJlZGljdGFibGUgcmVzdWx0cwotYmVjYXVzZSBpdCBubyBsb25nZXIgcG9pbnRzIHRvIHRoZSBzYW1lIGFkZHJlc3MuCi0KLQotKiBPcGVuU1NMIHVzZXMgREVSIGJ1dCBJIG5lZWQgQkVSIGZvcm1hdDogZG9lcyBPcGVuU1NMIHN1cHBvcnQgQkVSPwotCi1UaGUgc2hvcnQgYW5zd2VyIGlzIHllcywgYmVjYXVzZSBERVIgaXMgYSBzcGVjaWFsIGNhc2Ugb2YgQkVSIGFuZCBPcGVuU1NMCi1BU04xIGRlY29kZXJzIGNhbiBwcm9jZXNzIEJFUi4KLQotVGhlIGxvbmdlciBhbnN3ZXIgaXMgdGhhdCBBU04xIHN0cnVjdHVyZXMgY2FuIGJlIGVuY29kZWQgaW4gYSBudW1iZXIgb2YKLWRpZmZlcmVudCB3YXlzLiBPbmUgc2V0IG9mIHdheXMgaXMgdGhlIEJhc2ljIEVuY29kaW5nIFJ1bGVzIChCRVIpIHdpdGggdmFyaW91cwotcGVybWlzc2libGUgZW5jb2RpbmdzLiBBIHJlc3RyaWN0aW9uIG9mIEJFUiBpcyB0aGUgRGlzdGluZ3Vpc2hlZCBFbmNvZGluZwotUnVsZXMgKERFUik6IHRoZXNlIHVuaXF1ZWx5IHNwZWNpZnkgaG93IGEgZ2l2ZW4gc3RydWN0dXJlIGlzIGVuY29kZWQuCi0KLVRoZXJlZm9yZSwgYmVjYXVzZSBERVIgaXMgYSBzcGVjaWFsIGNhc2Ugb2YgQkVSLCBERVIgaXMgYW4gYWNjZXB0YWJsZSBlbmNvZGluZwotZm9yIEJFUi4KLQotCi0qIEkndmUgdHJpZWQgdXNpbmcgPE1fc29tZV9ldmlsX3BrY3MxMl9tYWNybz4gYW5kIEkgZ2V0IGVycm9ycyB3aHk/Ci0KLVRoaXMgdXN1YWxseSBoYXBwZW5zIHdoZW4geW91IHRyeSBjb21waWxpbmcgc29tZXRoaW5nIHVzaW5nIHRoZSBQS0NTIzEyCi1tYWNyb3Mgd2l0aCBhIEMrKyBjb21waWxlci4gVGhlcmUgaXMgaGFyZGx5IGV2ZXIgYW55IG5lZWQgdG8gdXNlIHRoZQotUEtDUyMxMiBtYWNyb3MgaW4gYSBwcm9ncmFtLCBpdCBpcyBtdWNoIGVhc2llciB0byBwYXJzZSBhbmQgY3JlYXRlCi1QS0NTIzEyIGZpbGVzIHVzaW5nIHRoZSBQS0NTMTJfcGFyc2UoKSBhbmQgUEtDUzEyX2NyZWF0ZSgpIGZ1bmN0aW9ucwotZG9jdW1lbnRlZCBpbiBkb2Mvb3BlbnNzbC50eHQgYW5kIHdpdGggZXhhbXBsZXMgaW4gZGVtb3MvcGtjczEyLiBUaGUKLSdwa2NzMTInIGFwcGxpY2F0aW9uIGhhcyB0byB1c2UgdGhlIG1hY3JvcyBiZWNhdXNlIGl0IHByaW50cyBvdXQgCi1kZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCi0KLQotKiBJJ3ZlIGNhbGxlZCA8c29tZSBmdW5jdGlvbj4gYW5kIGl0IGZhaWxzLCB3aHk/Ci0KLUJlZm9yZSBzdWJtaXR0aW5nIGEgcmVwb3J0IG9yIGFza2luZyBpbiBvbmUgb2YgdGhlIG1haWxpbmcgbGlzdHMsIHlvdQotc2hvdWxkIHRyeSB0byBkZXRlcm1pbmUgdGhlIGNhdXNlLiBJbiBwYXJ0aWN1bGFyLCB5b3Ugc2hvdWxkIGNhbGwKLUVSUl9wcmludF9lcnJvcnMoKSBvciBFUlJfcHJpbnRfZXJyb3JzX2ZwKCkgYWZ0ZXIgdGhlIGZhaWxlZCBjYWxsCi1hbmQgc2VlIGlmIHRoZSBtZXNzYWdlIGhlbHBzLiBOb3RlIHRoYXQgdGhlIHByb2JsZW0gbWF5IG9jY3VyIGVhcmxpZXIKLXRoYW4geW91IHRoaW5rIC0tIHlvdSBzaG91bGQgY2hlY2sgZm9yIGVycm9ycyBhZnRlciBldmVyeSBjYWxsIHdoZXJlCi1pdCBpcyBwb3NzaWJsZSwgb3RoZXJ3aXNlIHRoZSBhY3R1YWwgcHJvYmxlbSBtYXkgYmUgaGlkZGVuIGJlY2F1c2UKLXNvbWUgT3BlblNTTCBmdW5jdGlvbnMgY2xlYXIgdGhlIGVycm9yIHN0YXRlLgotCi0KLSogSSBqdXN0IGdldCBhIGxvYWQgb2YgbnVtYmVycyBmb3IgdGhlIGVycm9yIG91dHB1dCwgd2hhdCBkbyB0aGV5IG1lYW4/Ci0KLVRoZSBhY3R1YWwgZm9ybWF0IGlzIGRlc2NyaWJlZCBpbiB0aGUgRVJSX3ByaW50X2Vycm9ycygpIG1hbnVhbCBwYWdlLgotWW91IHNob3VsZCBjYWxsIHRoZSBmdW5jdGlvbiBFUlJfbG9hZF9jcnlwdG9fc3RyaW5ncygpIGJlZm9yZSBoYW5kIGFuZAotdGhlIG1lc3NhZ2Ugd2lsbCBiZSBvdXRwdXQgaW4gdGV4dCBmb3JtLiBJZiB5b3UgY2FuJ3QgZG8gdGhpcyAoZm9yIGV4YW1wbGUKLWl0IGlzIGEgcHJlLWNvbXBpbGVkIGJpbmFyeSkgeW91IGNhbiB1c2UgdGhlIGVycnN0ciB1dGlsaXR5IG9uIHRoZSBlcnJvcgotY29kZSBpdHNlbGYgKHRoZSBoZXggZGlnaXRzIGFmdGVyIHRoZSBzZWNvbmQgY29sb24pLgotCi0KLSogV2h5IGRvIEkgZ2V0IGVycm9ycyBhYm91dCB1bmtub3duIGFsZ29yaXRobXM/Ci0KLVRoZSBjYXVzZSBpcyBmb3JnZXR0aW5nIHRvIGxvYWQgT3BlblNTTCdzIHRhYmxlIG9mIGFsZ29yaXRobXMgd2l0aAotT3BlblNTTF9hZGRfYWxsX2FsZ29yaXRobXMoKS4gU2VlIHRoZSBtYW51YWwgcGFnZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gVGhpcwotY2FuIGNhdXNlIHNldmVyYWwgcHJvYmxlbXMgc3VjaCBhcyBiZWluZyB1bmFibGUgdG8gcmVhZCBpbiBhbiBlbmNyeXB0ZWQKLVBFTSBmaWxlLCB1bmFibGUgdG8gZGVjcnlwdCBhIFBLQ1MjMTIgZmlsZSBvciBzaWduYXR1cmUgZmFpbHVyZSB3aGVuCi12ZXJpZnlpbmcgY2VydGlmaWNhdGVzLgotCi0qIFdoeSBjYW4ndCB0aGUgT3BlblNTSCBjb25maWd1cmUgc2NyaXB0IGRldGVjdCBPcGVuU1NMPwotCi1TZXZlcmFsIHJlYXNvbnMgZm9yIHByb2JsZW1zIHdpdGggdGhlIGF1dG9tYXRpYyBkZXRlY3Rpb24gZXhpc3QuCi1PcGVuU1NIIHJlcXVpcmVzIGF0IGxlYXN0IHZlcnNpb24gMC45LjVhIG9mIHRoZSBPcGVuU1NMIGxpYnJhcmllcy4KLVNvbWV0aW1lcyB0aGUgZGlzdHJpYnV0aW9uIGhhcyBpbnN0YWxsZWQgYW4gb2xkZXIgdmVyc2lvbiBpbiB0aGUgc3lzdGVtCi1sb2NhdGlvbnMgdGhhdCBpcyBkZXRlY3RlZCBpbnN0ZWFkIG9mIGEgbmV3IG9uZSBpbnN0YWxsZWQuIFRoZSBPcGVuU1NMCi1saWJyYXJ5IG1pZ2h0IGhhdmUgYmVlbiBjb21waWxlZCBmb3IgYW5vdGhlciBDUFUgb3IgYW5vdGhlciBtb2RlICgzMi82NCBiaXRzKS4KLVBlcm1pc3Npb25zIG1pZ2h0IGJlIHdyb25nLgotCi1UaGUgZ2VuZXJhbCBhbnN3ZXIgaXMgdG8gY2hlY2sgdGhlIGNvbmZpZy5sb2cgZmlsZSBnZW5lcmF0ZWQgd2hlbiBydW5uaW5nCi10aGUgT3BlblNTSCBjb25maWd1cmUgc2NyaXB0LiBJdCBzaG91bGQgY29udGFpbiB0aGUgZGV0YWlsZWQgaW5mb3JtYXRpb24KLW9uIHdoeSB0aGUgT3BlblNTTCBsaWJyYXJ5IHdhcyBub3QgZGV0ZWN0ZWQgb3IgY29uc2lkZXJlZCBpbmNvbXBhdGlibGUuCi0KLQotKiBDYW4gSSB1c2UgT3BlblNTTCdzIFNTTCBsaWJyYXJ5IHdpdGggbm9uLWJsb2NraW5nIEkvTz8KLQotWWVzOyBtYWtlIHN1cmUgdG8gcmVhZCB0aGUgU1NMX2dldF9lcnJvcigzKSBtYW51YWwgcGFnZSEKLQotQSBwaXRmYWxsIHRvIGF2b2lkOiBEb24ndCBhc3N1bWUgdGhhdCBTU0xfcmVhZCgpIHdpbGwganVzdCByZWFkIGZyb20KLXRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCBvciB0aGF0IFNTTF93cml0ZSgpIHdpbGwganVzdCB3cml0ZSB0byBpdCAtLQotaXQgaXMgYWxzbyBwb3NzaWJsZSB0aGF0IFNTTF93cml0ZSgpIGNhbm5vdCBkbyBhbnkgdXNlZnVsIHdvcmsgdW50aWwKLXRoZXJlIGlzIGRhdGEgdG8gcmVhZCwgb3IgdGhhdCBTU0xfcmVhZCgpIGNhbm5vdCBkbyBhbnl0aGluZyB1bnRpbCBpdAotaXMgcG9zc2libGUgdG8gc2VuZCBkYXRhLiAgT25lIHJlYXNvbiBmb3IgdGhpcyBpcyB0aGF0IHRoZSBwZWVyIG1heQotcmVxdWVzdCBhIG5ldyBUTFMvU1NMIGhhbmRzaGFrZSBhdCBhbnkgdGltZSBkdXJpbmcgdGhlIHByb3RvY29sLAotcmVxdWlyaW5nIGEgYmktZGlyZWN0aW9uYWwgbWVzc2FnZSBleGNoYW5nZTsgYm90aCBTU0xfcmVhZCgpIGFuZAotU1NMX3dyaXRlKCkgd2lsbCB0cnkgdG8gY29udGludWUgYW55IHBlbmRpbmcgaGFuZHNoYWtlLgotCi0KLSogV2h5IGRvZXNuJ3QgbXkgc2VydmVyIGFwcGxpY2F0aW9uIHJlY2VpdmUgYSBjbGllbnQgY2VydGlmaWNhdGU/Ci0KLUR1ZSB0byB0aGUgVExTIHByb3RvY29sIGRlZmluaXRpb24sIGEgY2xpZW50IHdpbGwgb25seSBzZW5kIGEgY2VydGlmaWNhdGUsCi1pZiBleHBsaWNpdGx5IGFza2VkIGJ5IHRoZSBzZXJ2ZXIuIFVzZSB0aGUgU1NMX1ZFUklGWV9QRUVSIGZsYWcgb2YgdGhlCi1TU0xfQ1RYX3NldF92ZXJpZnkoKSBmdW5jdGlvbiB0byBlbmFibGUgdGhlIHVzZSBvZiBjbGllbnQgY2VydGlmaWNhdGVzLgotCi0KLSogV2h5IGRvZXMgY29tcGlsYXRpb24gZmFpbCBkdWUgdG8gYW4gdW5kZWZpbmVkIHN5bWJvbCBOSURfdW5pcXVlSWRlbnRpZmllcj8KLQotRm9yIE9wZW5TU0wgMC45LjcgdGhlIE9JRCB0YWJsZSB3YXMgZXh0ZW5kZWQgYW5kIGNvcnJlY3RlZC4gSW4gZWFybGllcgotdmVyc2lvbnMsIHVuaXF1ZUlkZW50aWZpZXIgd2FzIGluY29ycmVjdGx5IHVzZWQgZm9yIFguNTA5IGNlcnRpZmljYXRlcy4KLVRoZSBjb3JyZWN0IG5hbWUgYWNjb3JkaW5nIHRvIFJGQzIyNTYgKExEQVApIGlzIHg1MDBVbmlxdWVJZGVudGlmaWVyLgotQ2hhbmdlIHlvdXIgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lIHdoZW4gY29tcGlsaW5nIGFnYWluc3QgT3BlblNTTCAwLjkuNy4KLQotCi0qIEkgdGhpbmsgSSd2ZSBkZXRlY3RlZCBhIG1lbW9yeSBsZWFrLCBpcyB0aGlzIGEgYnVnPwotCi1JbiBtb3N0IGNhc2VzIHRoZSBjYXVzZSBvZiBhbiBhcHBhcmVudCBtZW1vcnkgbGVhayBpcyBhbiBPcGVuU1NMIGludGVybmFsIHRhYmxlCi10aGF0IGlzIGFsbG9jYXRlZCB3aGVuIGFuIGFwcGxpY2F0aW9uIHN0YXJ0cyB1cC4gU2luY2Ugc3VjaCB0YWJsZXMgZG8gbm90IGdyb3cKLWluIHNpemUgb3ZlciB0aW1lIHRoZXkgYXJlIGhhcm1sZXNzLgotCi1UaGVzZSBpbnRlcm5hbCB0YWJsZXMgY2FuIGJlIGZyZWVkIHVwIHdoZW4gYW4gYXBwbGljYXRpb24gY2xvc2VzIHVzaW5nIHZhcmlvdXMKLWZ1bmN0aW9ucy4gIEN1cnJlbnRseSB0aGVzZSBpbmNsdWRlIGZvbGxvd2luZzoKLQotVGhyZWFkLWxvY2FsIGNsZWFudXAgZnVuY3Rpb25zOgotCi0gIEVSUl9yZW1vdmVfc3RhdGUoKQotCi1BcHBsaWNhdGlvbi1nbG9iYWwgY2xlYW51cCBmdW5jdGlvbnMgdGhhdCBhcmUgYXdhcmUgb2YgdXNhZ2UgKGFuZCB0aGVyZWZvcmUKLXRocmVhZC1zYWZlKToKLQotICBFTkdJTkVfY2xlYW51cCgpIGFuZCBDT05GX21vZHVsZXNfdW5sb2FkKCkKLQotIkJydXRhbCIgKHRocmVhZC11bnNhZmUpIEFwcGxpY2F0aW9uLWdsb2JhbCBjbGVhbnVwIGZ1bmN0aW9uczoKLQotICBFUlJfZnJlZV9zdHJpbmdzKCksIEVWUF9jbGVhbnVwKCkgYW5kIENSWVBUT19jbGVhbnVwX2FsbF9leF9kYXRhKCkuCi0KLQotKiBXaHkgZG9lcyBWYWxncmluZCBjb21wbGFpbiBhYm91dCB0aGUgdXNlIG9mIHVuaW5pdGlhbGl6ZWQgZGF0YT8KLQotV2hlbiBPcGVuU1NMJ3MgUFJORyByb3V0aW5lcyBhcmUgY2FsbGVkIHRvIGdlbmVyYXRlIHJhbmRvbSBudW1iZXJzIHRoZSBzdXBwbGllZAotYnVmZmVyIGNvbnRlbnRzIGFyZSBtaXhlZCBpbnRvIHRoZSBlbnRyb3B5IHBvb2w6IHNvIGl0IHRlY2huaWNhbGx5IGRvZXMgbm90Ci1tYXR0ZXIgd2hldGhlciB0aGUgYnVmZmVyIGlzIGluaXRpYWxpemVkIGF0IHRoaXMgcG9pbnQgb3Igbm90LiAgVmFsZ3JpbmQgKGFuZAotb3RoZXIgdGVzdCB0b29scykgd2lsbCBjb21wbGFpbiBhYm91dCB0aGlzLiBXaGVuIHVzaW5nIFZhbGdyaW5kLCBtYWtlIHN1cmUgdGhlCi1PcGVuU1NMIGxpYnJhcnkgaGFzIGJlZW4gY29tcGlsZWQgd2l0aCB0aGUgUFVSSUZZIG1hY3JvIGRlZmluZWQgKC1EUFVSSUZZKQotdG8gZ2V0IHJpZCBvZiB0aGVzZSB3YXJuaW5ncy4KLQotCi0qIFdoeSBkb2Vzbid0IGEgbWVtb3J5IEJJTyB3b3JrIHdoZW4gYSBmaWxlIGRvZXM/Ci0KLVRoaXMgY2FuIG9jY3VyIGluIHNldmVyYWwgY2FzZXMgZm9yIGV4YW1wbGUgcmVhZGluZyBhbiBTL01JTUUgZW1haWwgbWVzc2FnZS4KLVRoZSByZWFzb24gaXMgdGhhdCBhIG1lbW9yeSBCSU8gY2FuIGRvIG9uZSBvZiB0d28gdGhpbmdzIHdoZW4gYWxsIHRoZSBkYXRhCi1oYXMgYmVlbiByZWFkIGZyb20gaXQuCi0KLVRoZSBkZWZhdWx0IGJlaGF2aW91ciBpcyB0byBpbmRpY2F0ZSB0aGF0IG5vIG1vcmUgZGF0YSBpcyBhdmFpbGFibGUgYW5kIHRoYXQKLXRoZSBjYWxsIHNob3VsZCBiZSByZXRyaWVkLCB0aGlzIGlzIHRvIGFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBmaWxsIHVwIHRoZSBCSU8KLWFnYWluIGlmIG5lY2Vzc2FyeS4KLQotQWx0ZXJuYXRpdmVseSBpdCBjYW4gaW5kaWNhdGUgdGhhdCBubyBtb3JlIGRhdGEgaXMgYXZhaWxhYmxlIGFuZCB0aGF0IEVPRiBoYXMKLWJlZW4gcmVhY2hlZC4KLQotSWYgYSBtZW1vcnkgQklPIGlzIHRvIGJlaGF2ZSBpbiB0aGUgc2FtZSB3YXkgYXMgYSBmaWxlIHRoaXMgc2Vjb25kIGJlaGF2aW91cgotaXMgbmVlZGVkLiBUaGlzIG11c3QgYmUgZG9uZSBieSBjYWxsaW5nOgotCi0gICBCSU9fc2V0X21lbV9lb2ZfcmV0dXJuKGJpbywgMCk7Ci0KLVNlZSB0aGUgbWFudWFsIHBhZ2VzIGZvciBtb3JlIGRldGFpbHMuCi0KLQotKiBXaGVyZSBhcmUgdGhlIGRlY2xhcmF0aW9ucyBhbmQgaW1wbGVtZW50YXRpb25zIG9mIGQyaV9YNTA5KCkgZXRjPwotCi1UaGVzZSBhcmUgZGVmaW5lZCBhbmQgaW1wbGVtZW50ZWQgYnkgbWFjcm9zIG9mIHRoZSBmb3JtOgotCi0KLSBERUNMQVJFX0FTTjFfRlVOQ1RJT05TKFg1MDkpIGFuZCBJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoWDUwOSkKLQotVGhlIGltcGxlbWVudGF0aW9uIHBhc3NlcyBhbiBBU04xICJ0ZW1wbGF0ZSIgZGVmaW5pbmcgdGhlIHN0cnVjdHVyZSBpbnRvIGFuCi1BU04xIGludGVycHJldGVyIHVzaW5nIGdlbmVyYWxpc2VkIGZ1bmN0aW9ucyBzdWNoIGFzIEFTTjFfaXRlbV9kMmkoKS4KLQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitUaGUgRkFRIGlzIG5vdyBtYWludGFpbmVkIG9uIHRoZSB3ZWI6CisgICAgICAgIGh0dHBzOi8vd3d3Lm9wZW5zc2wub3JnL2RvY3MvZmFxLmh0bWwKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvSU5TVEFMTCBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvSU5TVEFMTAppbmRleCAxMzI1MDc5Li42NzliMzBkIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL0lOU1RBTEwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9JTlNUQUxMCkBAIC0xNjQsMTAgKzE2NCwxMCBAQAogICAgICBzdGFuZGFyZCBoZWFkZXJzKS4gIElmIGl0IGlzIGEgcHJvYmxlbSB3aXRoIE9wZW5TU0wgaXRzZWxmLCBwbGVhc2UKICAgICAgcmVwb3J0IHRoZSBwcm9ibGVtIHRvIDxvcGVuc3NsLWJ1Z3NAb3BlbnNzbC5vcmc+IChub3RlIHRoYXQgeW91cgogICAgICBtZXNzYWdlIHdpbGwgYmUgcmVjb3JkZWQgaW4gdGhlIHJlcXVlc3QgdHJhY2tlciBwdWJsaWNseSByZWFkYWJsZQotICAgICB2aWEgaHR0cDovL3d3dy5vcGVuc3NsLm9yZy9zdXBwb3J0L3J0Lmh0bWwgYW5kIHdpbGwgYmUgZm9yd2FyZGVkIHRvIGEKLSAgICAgcHVibGljIG1haWxpbmcgbGlzdCkuIEluY2x1ZGUgdGhlIG91dHB1dCBvZiAibWFrZSByZXBvcnQiIGluIHlvdXIgbWVzc2FnZS4KLSAgICAgUGxlYXNlIGNoZWNrIG91dCB0aGUgcmVxdWVzdCB0cmFja2VyLiBNYXliZSB0aGUgYnVnIHdhcyBhbHJlYWR5Ci0gICAgIHJlcG9ydGVkIG9yIGhhcyBhbHJlYWR5IGJlZW4gZml4ZWQuCisgICAgIGF0IGh0dHBzOi8vd3d3Lm9wZW5zc2wub3JnL2NvbW11bml0eS9pbmRleC5odG1sI2J1Z3MgYW5kIHdpbGwgYmUKKyAgICAgZm9yd2FyZGVkIHRvIGEgcHVibGljIG1haWxpbmcgbGlzdCkuIEluY2x1ZGUgdGhlIG91dHB1dCBvZiAibWFrZQorICAgICByZXBvcnQiIGluIHlvdXIgbWVzc2FnZS4gIFBsZWFzZSBjaGVjayBvdXQgdGhlIHJlcXVlc3QgdHJhY2tlci4gTWF5YmUKKyAgICAgdGhlIGJ1ZyB3YXMgYWxyZWFkeSByZXBvcnRlZCBvciBoYXMgYWxyZWFkeSBiZWVuIGZpeGVkLgogCiAgICAgIFtJZiB5b3UgZW5jb3VudGVyIGFzc2VtYmxlciBlcnJvciBtZXNzYWdlcywgdHJ5IHRoZSAibm8tYXNtIgogICAgICBjb25maWd1cmF0aW9uIG9wdGlvbiBhcyBhbiBpbW1lZGlhdGUgZml4Ll0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvTElDRU5TRSBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvTElDRU5TRQppbmRleCBlNDdkMTAxLi5mYjAzNzEzIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL0xJQ0VOU0UKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9MSUNFTlNFCkBAIC0xMiw3ICsxMiw3IEBACiAgIC0tLS0tLS0tLS0tLS0tLQogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMTEgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxNiBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9NYWtlZmlsZS5vcmcgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL01ha2VmaWxlLm9yZwppbmRleCA1NWEzNzAwLi5iYzFjM2JlIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL01ha2VmaWxlLm9yZworKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL01ha2VmaWxlLm9yZwpAQCAtMTc5LDggKzE3OSw3IEBACiBHRU5FUkFMPSAgICAgICAgTWFrZWZpbGUKIEJBU0VOQU1FPSAgICAgICBvcGVuc3NsCiBOQU1FPSAgICAgICAgICAgJChCQVNFTkFNRSktJChWRVJTSU9OKQotVEFSRklMRT0gICAgICAgICQoTkFNRSkudGFyCi1XVEFSRklMRT0gICAgICAgJChOQU1FKS13aW4udGFyCitUQVJGSUxFPSAgICAgICAgLi4vJChOQU1FKS50YXIKIEVYSEVBREVSPSAgICAgICBlX29zMi5oCiBIRUFERVI9ICAgICAgICAgZV9vcy5oCiAKQEAgLTQ5OSwzNSArNDk4LDM1IEBACiAjIHdvdWxkIG9jY3VyLiBUaGVyZWZvcmUgdGhlIGxpc3Qgb2YgZmlsZXMgaXMgdGVtcG9yYXJpbHkgc3RvcmVkIGludG8gYSBmaWxlCiAjIGFuZCByZWFkIGRpcmVjdGx5LCByZXF1aXJpbmcgR05VLVRhci4gQ2FsbCAibWFrZSBUQVI9Z3RhciBkaXN0IiBpZiB0aGUgbm9ybWFsCiAjIHRhciBkb2VzIG5vdCBzdXBwb3J0IHRoZSAtLWZpbGVzLWZyb20gb3B0aW9uLgotdGFyOgorVEFSX0NPTU1BTkQ9JChUQVIpICQoVEFSRkxBR1MpIC0tZmlsZXMtZnJvbSAkKFRBUkZJTEUpLmxpc3QgXAorCSAgICAgICAgICAgICAgICAgICAgICAgLS1vd25lciAwIC0tZ3JvdXAgMCBcCisJCQkgICAgICAgLS10cmFuc2Zvcm0gJ3N8XnwkKE5BTUUpL3wnIFwKKwkJCSAgICAgICAtY3ZmIC0KKworJChUQVJGSUxFKS5saXN0OgorCWZpbmQgKiBcISAtbmFtZSBTVEFUVVMgXCEgLW5hbWUgVEFCTEUgXCEgLW5hbWUgJyoubycgXCEgLW5hbWUgJyouYScgXAorCSAgICAgICBcISAtbmFtZSAnKi5zbycgXCEgLW5hbWUgJyouc28uKicgIFwhIC1uYW1lICdvcGVuc3NsJyBcCisJICAgICAgIFwoIFwhIC1uYW1lICcqdGVzdCcgLW8gLW5hbWUgYmN0ZXN0IC1vIC1uYW1lIHBvZDJtYW50ZXN0IFwpIFwKKwkgICAgICAgXCEgLW5hbWUgJy4jKicgXCEgLW5hbWUgJyp+JyBcISAtdHlwZSBsIFwKKwkgICAgfCBzb3J0ID4gJChUQVJGSUxFKS5saXN0CisKK3RhcjogJChUQVJGSUxFKS5saXN0CiAJZmluZCAuIC10eXBlIGQgLXByaW50IHwgeGFyZ3MgY2htb2QgNzU1CiAJZmluZCAuIC10eXBlIGYgLXByaW50IHwgeGFyZ3MgY2htb2QgYStyCiAJZmluZCAuIC10eXBlIGYgLXBlcm0gLTAxMDAgLXByaW50IHwgeGFyZ3MgY2htb2QgYSt4Ci0JZmluZCAqIFwhIC1wYXRoIENWUy9cKiBcISAtcGF0aCBcKi9DVlMvXCogXCEgLW5hbWUgQ1ZTIFwhIC1uYW1lIC5jdnNpZ25vcmUgXCEgLW5hbWUgU1RBVFVTIFwhIC1uYW1lIFRBQkxFIHwgc29ydCA+IC4uLyQoVEFSRklMRSkubGlzdDsgXAotCSQoVEFSKSAkKFRBUkZMQUdTKSAtLWZpbGVzLWZyb20gLi4vJChUQVJGSUxFKS5saXN0IC1jdmYgLSB8IFwKLQl0YXJkeSAtLXVzZXJfbnVtYmVyPTAgIC0tdXNlcl9uYW1lPW9wZW5zc2wgXAotCSAgICAgIC0tZ3JvdXBfbnVtYmVyPTAgLS1ncm91cF9uYW1lPW9wZW5zc2wgXAotCSAgICAgIC0tcHJlZml4PW9wZW5zc2wtJChWRVJTSU9OKSAtIHxcCi0JZ3ppcCAtLWJlc3QgPi4uLyQoVEFSRklMRSkuZ3o7IFwKLQlybSAtZiAuLi8kKFRBUkZJTEUpLmxpc3Q7IFwKLQlscyAtbCAuLi8kKFRBUkZJTEUpLmd6CisJJChUQVJfQ09NTUFORCkgfCBnemlwIC0tYmVzdCA+ICQoVEFSRklMRSkuZ3oKKwlybSAtZiAkKFRBUkZJTEUpLmxpc3QKKwlscyAtbCAkKFRBUkZJTEUpLmd6CiAKLXRhci1zbmFwOgotCUAkKFRBUikgJChUQVJGTEFHUykgLWN2ZiAtIFwKLQkJYGZpbmQgKiBcISAtcGF0aCBDVlMvXCogXCEgLXBhdGggXCovQ1ZTL1wqIFwhIC1uYW1lIENWUyBcISAtbmFtZSAuY3ZzaWdub3JlIFwhIC1uYW1lIFNUQVRVUyBcISAtbmFtZSBUQUJMRSBcISAtbmFtZSAnKi5vJyBcISAtbmFtZSAnKi5hJyBcISAtbmFtZSAnKi5zbycgXCEgLW5hbWUgJyouc28uKicgIFwhIC1uYW1lICdvcGVuc3NsJyBcISAtbmFtZSAnKnRlc3QnIFwhIC1uYW1lICcuIyonIFwhIC1uYW1lICcqficgfCBzb3J0YCB8XAotCXRhcmR5IC0tdXNlcl9udW1iZXI9MCAgLS11c2VyX25hbWU9b3BlbnNzbCBcCi0JICAgICAgLS1ncm91cF9udW1iZXI9MCAtLWdyb3VwX25hbWU9b3BlbnNzbCBcCi0JICAgICAgLS1wcmVmaXg9b3BlbnNzbC0kKFZFUlNJT04pIC0gPiAuLi8kKFRBUkZJTEUpO1wKLQlscyAtbCAuLi8kKFRBUkZJTEUpCit0YXItc25hcDogJChUQVJGSUxFKS5saXN0CisJJChUQVJfQ09NTUFORCkgPiAkKFRBUkZJTEUpCisJcm0gLWYgJChUQVJGSUxFKS5saXN0CisJbHMgLWwgJChUQVJGSUxFKQogCiBkaXN0OiAgIAogCSQoUEVSTCkgQ29uZmlndXJlIGRpc3QKLQlAJChNQUtFKSBkaXN0X3BlbV9oCiAJQCQoTUFLRSkgU0RJUlM9JyQoU0RJUlMpJyBjbGVhbgotCUAkKE1BS0UpIFRBUj0nJChUQVIpJyBUQVJGTEFHUz0nJChUQVJGTEFHUyknIHRhcgotCi1kaXN0X3BlbV9oOgotCShjZCBjcnlwdG8vcGVtOyAkKE1BS0UpIC1lICQoQlVJTERFTlYpIHBlbS5oOyAkKE1BS0UpIGNsZWFuKQorCUAkKE1BS0UpIFRBUj0nJChUQVIpJyBUQVJGTEFHUz0nJChUQVJGTEFHUyknICQoRElTVFRBUlZBUlMpIHRhcgogCiBpbnN0YWxsOiBhbGwgaW5zdGFsbF9kb2NzIGluc3RhbGxfc3cKIApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9ORVdTIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9ORVdTCmluZGV4IDVlNzZkM2YuLmM4MTkzZDUgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvTkVXUworKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL05FV1MKQEAgLTUsOSArNSwyMyBAQAogICBUaGlzIGZpbGUgZ2l2ZXMgYSBicmllZiBvdmVydmlldyBvZiB0aGUgbWFqb3IgY2hhbmdlcyBiZXR3ZWVuIGVhY2ggT3BlblNTTAogICByZWxlYXNlLiBGb3IgbW9yZSBkZXRhaWxzIHBsZWFzZSByZWFkIHRoZSBDSEFOR0VTIGZpbGUuCiAKKyAgTWFqb3IgY2hhbmdlcyBiZXR3ZWVuIE9wZW5TU0wgMS4wLjFxIGFuZCBPcGVuU1NMIDEuMC4xciBbMjggSmFuIDIwMTZdCisKKyAgICAgIG8gUHJvdGVjdGlvbiBmb3IgREggc21hbGwgc3ViZ3JvdXAgYXR0YWNrcworICAgICAgbyBTU0x2MiBkb2Vzbid0IGJsb2NrIGRpc2FibGVkIGNpcGhlcnMgKENWRS0yMDE1LTMxOTcpCisKKyAgTWFqb3IgY2hhbmdlcyBiZXR3ZWVuIE9wZW5TU0wgMS4wLjFwIGFuZCBPcGVuU1NMIDEuMC4xcSBbMyBEZWMgMjAxNV0KKworICAgICAgbyBDZXJ0aWZpY2F0ZSB2ZXJpZnkgY3Jhc2ggd2l0aCBtaXNzaW5nIFBTUyBwYXJhbWV0ZXIgKENWRS0yMDE1LTMxOTQpCisgICAgICBvIFg1MDlfQVRUUklCVVRFIG1lbW9yeSBsZWFrIChDVkUtMjAxNS0zMTk1KQorICAgICAgbyBSZXdyaXRlIEVWUF9EZWNvZGVVcGRhdGUgKGJhc2U2NCBkZWNvZGluZykgdG8gZml4IHNldmVyYWwgYnVncworICAgICAgbyBJbiBEU0FfZ2VuZXJhdGVfcGFyYW1ldGVyc19leCwgaWYgdGhlIHByb3ZpZGVkIHNlZWQgaXMgdG9vIHNob3J0LAorICAgICAgICByZXR1cm4gYW4gZXJyb3IKKwogICBNYWpvciBjaGFuZ2VzIGJldHdlZW4gT3BlblNTTCAxLjAuMW8gYW5kIE9wZW5TU0wgMS4wLjFwIFs5IEp1bCAyMDE1XQogCiAgICAgICBvIEFsdGVybmF0ZSBjaGFpbnMgY2VydGlmaWNhdGUgZm9yZ2VyeSAoQ1ZFLTIwMTUtMTc5MykKKyAgICAgIG8gUmFjZSBjb25kaXRpb24gaGFuZGxpbmcgUFNLIGlkZW50aWZ5IGhpbnQgKENWRS0yMDE1LTMxOTYpCiAKICAgTWFqb3IgY2hhbmdlcyBiZXR3ZWVuIE9wZW5TU0wgMS4wLjFuIGFuZCBPcGVuU1NMIDEuMC4xbyBbMTIgSnVuIDIwMTVdCiAKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvUkVBRE1FIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9SRUFETUUKaW5kZXggYmYwM2YzMC4uNWU5MTRmOCAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9SRUFETUUKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9SRUFETUUKQEAgLTEsNyArMSw3IEBACiAKLSBPcGVuU1NMIDEuMC4xcCA5IEp1bCAyMDE1CisgT3BlblNTTCAxLjAuMXIgMjggSmFuIDIwMTYKIAotIENvcHlyaWdodCAoYykgMTk5OC0yMDExIFRoZSBPcGVuU1NMIFByb2plY3QKKyBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxNSBUaGUgT3BlblNTTCBQcm9qZWN0CiAgQ29weXJpZ2h0IChjKSAxOTk1LTE5OTggRXJpYyBBLiBZb3VuZywgVGltIEouIEh1ZHNvbgogIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKQEAgLTEwLDE3ICsxMCwxNyBAQAogCiAgVGhlIE9wZW5TU0wgUHJvamVjdCBpcyBhIGNvbGxhYm9yYXRpdmUgZWZmb3J0IHRvIGRldmVsb3AgYSByb2J1c3QsCiAgY29tbWVyY2lhbC1ncmFkZSwgZnVsbHkgZmVhdHVyZWQsIGFuZCBPcGVuIFNvdXJjZSB0b29sa2l0IGltcGxlbWVudGluZyB0aGUKLSBTZWN1cmUgU29ja2V0cyBMYXllciAoU1NMIHYyL3YzKSBhbmQgVHJhbnNwb3J0IExheWVyIFNlY3VyaXR5IChUTFMgdjEpCi0gcHJvdG9jb2xzIGFzIHdlbGwgYXMgYSBmdWxsLXN0cmVuZ3RoIGdlbmVyYWwgcHVycG9zZSBjcnlwdG9ncmFwaHkgbGlicmFyeS4KLSBUaGUgcHJvamVjdCBpcyBtYW5hZ2VkIGJ5IGEgd29ybGR3aWRlIGNvbW11bml0eSBvZiB2b2x1bnRlZXJzIHRoYXQgdXNlIHRoZQotIEludGVybmV0IHRvIGNvbW11bmljYXRlLCBwbGFuLCBhbmQgZGV2ZWxvcCB0aGUgT3BlblNTTCB0b29sa2l0IGFuZCBpdHMKLSByZWxhdGVkIGRvY3VtZW50YXRpb24uCisgU2VjdXJlIFNvY2tldHMgTGF5ZXIgKFNTTHYzKSBhbmQgVHJhbnNwb3J0IExheWVyIFNlY3VyaXR5IChUTFMpIHByb3RvY29scyBhcworIHdlbGwgYXMgYSBmdWxsLXN0cmVuZ3RoIGdlbmVyYWwgcHVycG9zZSBjcnlwdG9ncmFwaWMgbGlicmFyeS4gVGhlIHByb2plY3QgaXMKKyBtYW5hZ2VkIGJ5IGEgd29ybGR3aWRlIGNvbW11bml0eSBvZiB2b2x1bnRlZXJzIHRoYXQgdXNlIHRoZSBJbnRlcm5ldCB0bworIGNvbW11bmljYXRlLCBwbGFuLCBhbmQgZGV2ZWxvcCB0aGUgT3BlblNTTCB0b29sa2l0IGFuZCBpdHMgcmVsYXRlZAorIGRvY3VtZW50YXRpb24uCiAKLSBPcGVuU1NMIGlzIGJhc2VkIG9uIHRoZSBleGNlbGxlbnQgU1NMZWF5IGxpYnJhcnkgZGV2ZWxvcGVkIGZyb20gRXJpYyBBLiBZb3VuZworIE9wZW5TU0wgaXMgZGVzY2VuZGVkIGZyb20gdGhlIFNTTGVheSBsaWJyYXJ5IGRldmVsb3BlZCBieSBFcmljIEEuIFlvdW5nCiAgYW5kIFRpbSBKLiBIdWRzb24uICBUaGUgT3BlblNTTCB0b29sa2l0IGlzIGxpY2Vuc2VkIHVuZGVyIGEgZHVhbC1saWNlbnNlICh0aGUKLSBPcGVuU1NMIGxpY2Vuc2UgcGx1cyB0aGUgU1NMZWF5IGxpY2Vuc2UpIHNpdHVhdGlvbiwgd2hpY2ggYmFzaWNhbGx5IG1lYW5zCi0gdGhhdCB5b3UgYXJlIGZyZWUgdG8gZ2V0IGFuZCB1c2UgaXQgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsCi0gcHVycG9zZXMgYXMgbG9uZyBhcyB5b3UgZnVsZmlsbCB0aGUgY29uZGl0aW9ucyBvZiBib3RoIGxpY2Vuc2VzLgorIE9wZW5TU0wgbGljZW5zZSBwbHVzIHRoZSBTU0xlYXkgbGljZW5zZSksIHdoaWNoIG1lYW5zIHRoYXQgeW91IGFyZSBmcmVlIHRvCisgZ2V0IGFuZCB1c2UgaXQgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHB1cnBvc2VzIGFzIGxvbmcgYXMgeW91CisgZnVsZmlsbCB0aGUgY29uZGl0aW9ucyBvZiBib3RoIGxpY2Vuc2VzLgogCiAgT1ZFUlZJRVcKICAtLS0tLS0tLQpAQCAtMjgsMTE2ICsyOCwzOSBAQAogIFRoZSBPcGVuU1NMIHRvb2xraXQgaW5jbHVkZXM6CiAKICBsaWJzc2wuYToKLSAgICAgSW1wbGVtZW50YXRpb24gb2YgU1NMdjIsIFNTTHYzLCBUTFN2MSBhbmQgdGhlIHJlcXVpcmVkIGNvZGUgdG8gc3VwcG9ydAotICAgICBib3RoIFNTTHYyLCBTU0x2MyBhbmQgVExTdjEgaW4gdGhlIG9uZSBzZXJ2ZXIgYW5kIGNsaWVudC4KKyAgICAgUHJvdmlkZXMgdGhlIGNsaWVudCBhbmQgc2VydmVyLXNpZGUgaW1wbGVtZW50YXRpb25zIGZvciBTU0x2MyBhbmQgVExTLgogCiAgbGliY3J5cHRvLmE6Ci0gICAgIEdlbmVyYWwgZW5jcnlwdGlvbiBhbmQgWC41MDkgdjEvdjMgc3R1ZmYgbmVlZGVkIGJ5IFNTTC9UTFMgYnV0IG5vdAotICAgICBhY3R1YWxseSBsb2dpY2FsbHkgcGFydCBvZiBpdC4gSXQgaW5jbHVkZXMgcm91dGluZXMgZm9yIHRoZSBmb2xsb3dpbmc6Ci0KLSAgICAgQ2lwaGVycwotICAgICAgICBsaWJkZXMgLSBFQVkncyBsaWJkZXMgREVTIGVuY3J5cHRpb24gcGFja2FnZSB3aGljaCB3YXMgZmxvYXRpbmcKLSAgICAgICAgICAgICAgICAgYXJvdW5kIHRoZSBuZXQgZm9yIGEgZmV3IHllYXJzLCBhbmQgd2FzIHRoZW4gcmVsaWNlbnNlZCBieQotICAgICAgICAgICAgICAgICBoaW0gYXMgcGFydCBvZiBTU0xlYXkuICBJdCBpbmNsdWRlcyAxNSAnbW9kZXMvdmFyaWF0aW9ucycKLSAgICAgICAgICAgICAgICAgb2YgREVTICgxLCAyIGFuZCAzIGtleSB2ZXJzaW9ucyBvZiBlY2IsIGNiYywgY2ZiIGFuZCBvZmI7Ci0gICAgICAgICAgICAgICAgIHBjYmMgYW5kIGEgbW9yZSBnZW5lcmFsIGZvcm0gb2YgY2ZiIGFuZCBvZmIpIGluY2x1ZGluZyBkZXN4Ci0gICAgICAgICAgICAgICAgIGluIGNiYyBtb2RlLCBhIGZhc3QgY3J5cHQoMyksIGFuZCByb3V0aW5lcyB0byByZWFkCi0gICAgICAgICAgICAgICAgIHBhc3N3b3JkcyBmcm9tIHRoZSBrZXlib2FyZC4KLSAgICAgICAgUkM0IGVuY3J5cHRpb24sCi0gICAgICAgIFJDMiBlbmNyeXB0aW9uICAgICAgLSA0IGRpZmZlcmVudCBtb2RlcywgZWNiLCBjYmMsIGNmYiBhbmQgb2ZiLgotICAgICAgICBCbG93ZmlzaCBlbmNyeXB0aW9uIC0gNCBkaWZmZXJlbnQgbW9kZXMsIGVjYiwgY2JjLCBjZmIgYW5kIG9mYi4KLSAgICAgICAgSURFQSBlbmNyeXB0aW9uICAgICAtIDQgZGlmZmVyZW50IG1vZGVzLCBlY2IsIGNiYywgY2ZiIGFuZCBvZmIuCi0KLSAgICAgRGlnZXN0cwotICAgICAgICBNRDUgYW5kIE1EMiBtZXNzYWdlIGRpZ2VzdCBhbGdvcml0aG1zLCBmYXN0IGltcGxlbWVudGF0aW9ucywKLSAgICAgICAgU0hBIChTSEEtMCkgYW5kIFNIQS0xIG1lc3NhZ2UgZGlnZXN0IGFsZ29yaXRobXMsCi0gICAgICAgIE1EQzIgbWVzc2FnZSBkaWdlc3QuIEEgREVTIGJhc2VkIGhhc2ggdGhhdCBpcyBwb3B1bGFyIG9uIHNtYXJ0IGNhcmRzLgotCi0gICAgIFB1YmxpYyBLZXkKLSAgICAgICAgUlNBIGVuY3J5cHRpb24vZGVjcnlwdGlvbi9nZW5lcmF0aW9uLgotICAgICAgICAgICAgVGhlcmUgaXMgbm8gbGltaXQgb24gdGhlIG51bWJlciBvZiBiaXRzLgotICAgICAgICBEU0EgZW5jcnlwdGlvbi9kZWNyeXB0aW9uL2dlbmVyYXRpb24uCi0gICAgICAgICAgICBUaGVyZSBpcyBubyBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIGJpdHMuCi0gICAgICAgIERpZmZpZS1IZWxsbWFuIGtleS1leGNoYW5nZS9rZXkgZ2VuZXJhdGlvbi4KLSAgICAgICAgICAgIFRoZXJlIGlzIG5vIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgYml0cy4KLQotICAgICBYLjUwOXYzIGNlcnRpZmljYXRlcwotICAgICAgICBYNTA5IGVuY29kaW5nL2RlY29kaW5nIGludG8vZnJvbSBiaW5hcnkgQVNOMSBhbmQgYSBQRU0KLSAgICAgICAgICAgICBiYXNlZCBBU0NJSS1iaW5hcnkgZW5jb2Rpbmcgd2hpY2ggc3VwcG9ydHMgZW5jcnlwdGlvbiB3aXRoIGEKLSAgICAgICAgICAgICBwcml2YXRlIGtleS4gIFByb2dyYW0gdG8gZ2VuZXJhdGUgUlNBIGFuZCBEU0EgY2VydGlmaWNhdGUKLSAgICAgICAgICAgICByZXF1ZXN0cyBhbmQgdG8gZ2VuZXJhdGUgUlNBIGFuZCBEU0EgY2VydGlmaWNhdGVzLgotCi0gICAgIFN5c3RlbXMKLSAgICAgICAgVGhlIG5vcm1hbCBkaWdpdGFsIGVudmVsb3BlIHJvdXRpbmVzIGFuZCBiYXNlNjQgZW5jb2RpbmcuICBIaWdoZXIKLSAgICAgICAgbGV2ZWwgYWNjZXNzIHRvIGNpcGhlcnMgYW5kIGRpZ2VzdHMgYnkgbmFtZS4gIE5ldyBjaXBoZXJzIGNhbiBiZQotICAgICAgICBsb2FkZWQgYXQgcnVuIHRpbWUuICBUaGUgQklPIGlvIHN5c3RlbSB3aGljaCBpcyBhIHNpbXBsZSBub24tYmxvY2tpbmcKLSAgICAgICAgSU8gYWJzdHJhY3Rpb24uICBDdXJyZW50IG1ldGhvZHMgc3VwcG9ydGVkIGFyZSBmaWxlIGRlc2NyaXB0b3JzLAotICAgICAgICBzb2NrZXRzLCBzb2NrZXQgYWNjZXB0LCBzb2NrZXQgY29ubmVjdCwgbWVtb3J5IGJ1ZmZlciwgYnVmZmVyaW5nLCBTU0wKLSAgICAgICAgY2xpZW50L3NlcnZlciwgZmlsZSBwb2ludGVyLCBlbmNyeXB0aW9uLCBkaWdlc3QsIG5vbi1ibG9ja2luZyB0ZXN0aW5nCi0gICAgICAgIGFuZCBudWxsLgotCi0gICAgIERhdGEgc3RydWN0dXJlcwotICAgICAgICBBIGR5bmFtaWNhbGx5IGdyb3dpbmcgaGFzaGluZyBzeXN0ZW0KLSAgICAgICAgQSBzaW1wbGUgc3RhY2suCi0gICAgICAgIEEgQ29uZmlndXJhdGlvbiBsb2FkZXIgdGhhdCB1c2VzIGEgZm9ybWF0IHNpbWlsYXIgdG8gTVMgLmluaSBmaWxlcy4KKyAgICAgUHJvdmlkZXMgZ2VuZXJhbCBjcnlwdG9ncmFwaGljIGFuZCBYLjUwOSBzdXBwb3J0IG5lZWRlZCBieSBTU0wvVExTIGJ1dAorICAgICBub3QgbG9naWNhbGx5IHBhcnQgb2YgaXQuCiAKICBvcGVuc3NsOgogICAgICBBIGNvbW1hbmQgbGluZSB0b29sIHRoYXQgY2FuIGJlIHVzZWQgZm9yOgotICAgICAgICBDcmVhdGlvbiBvZiBSU0EsIERIIGFuZCBEU0Ega2V5IHBhcmFtZXRlcnMKKyAgICAgICAgQ3JlYXRpb24gb2Yga2V5IHBhcmFtZXRlcnMKICAgICAgICAgQ3JlYXRpb24gb2YgWC41MDkgY2VydGlmaWNhdGVzLCBDU1JzIGFuZCBDUkxzCi0gICAgICAgIENhbGN1bGF0aW9uIG9mIE1lc3NhZ2UgRGlnZXN0cwotICAgICAgICBFbmNyeXB0aW9uIGFuZCBEZWNyeXB0aW9uIHdpdGggQ2lwaGVycwotICAgICAgICBTU0wvVExTIENsaWVudCBhbmQgU2VydmVyIFRlc3RzCisgICAgICAgIENhbGN1bGF0aW9uIG9mIG1lc3NhZ2UgZGlnZXN0cworICAgICAgICBFbmNyeXB0aW9uIGFuZCBkZWNyeXB0aW9uCisgICAgICAgIFNTTC9UTFMgY2xpZW50IGFuZCBzZXJ2ZXIgdGVzdHMKICAgICAgICAgSGFuZGxpbmcgb2YgUy9NSU1FIHNpZ25lZCBvciBlbmNyeXB0ZWQgbWFpbAotCi0KLSBQQVRFTlRTCi0gLS0tLS0tLQotCi0gVmFyaW91cyBjb21wYW5pZXMgaG9sZCB2YXJpb3VzIHBhdGVudHMgZm9yIHZhcmlvdXMgYWxnb3JpdGhtcyBpbiB2YXJpb3VzCi0gbG9jYXRpb25zIGFyb3VuZCB0aGUgd29ybGQuIF9ZT1VfIGFyZSByZXNwb25zaWJsZSBmb3IgZW5zdXJpbmcgdGhhdCB5b3VyIHVzZQotIG9mIGFueSBhbGdvcml0aG1zIGlzIGxlZ2FsIGJ5IGNoZWNraW5nIGlmIHRoZXJlIGFyZSBhbnkgcGF0ZW50cyBpbiB5b3VyCi0gY291bnRyeS4gIFRoZSBmaWxlIGNvbnRhaW5zIHNvbWUgb2YgdGhlIHBhdGVudHMgdGhhdCB3ZSBrbm93IGFib3V0IG9yIGFyZQotIHJ1bW9yZWQgdG8gZXhpc3QuIFRoaXMgaXMgbm90IGEgZGVmaW5pdGl2ZSBsaXN0LgotCi0gUlNBIFNlY3VyaXR5IGhvbGRzIHNvZnR3YXJlIHBhdGVudHMgb24gdGhlIFJDNSBhbGdvcml0aG0uICBJZiB5b3UKLSBpbnRlbmQgdG8gdXNlIHRoaXMgY2lwaGVyLCB5b3UgbXVzdCBjb250YWN0IFJTQSBTZWN1cml0eSBmb3IKLSBsaWNlbnNpbmcgY29uZGl0aW9ucy4gVGhlaXIgd2ViIHBhZ2UgaXMgaHR0cDovL3d3dy5yc2FzZWN1cml0eS5jb20vLgotCi0gUkM0IGlzIGEgdHJhZGVtYXJrIG9mIFJTQSBTZWN1cml0eSwgc28gdXNlIG9mIHRoaXMgbGFiZWwgc2hvdWxkIHBlcmhhcHMKLSBvbmx5IGJlIHVzZWQgd2l0aCBSU0EgU2VjdXJpdHkncyBwZXJtaXNzaW9uLgotCi0gVGhlIElERUEgYWxnb3JpdGhtIGlzIHBhdGVudGVkIGJ5IEFzY29tIGluIEF1c3RyaWEsIEZyYW5jZSwgR2VybWFueSwgSXRhbHksCi0gSmFwYW4sIHRoZSBOZXRoZXJsYW5kcywgU3BhaW4sIFN3ZWRlbiwgU3dpdHplcmxhbmQsIFVLIGFuZCB0aGUgVVNBLiAgVGhleQotIHNob3VsZCBiZSBjb250YWN0ZWQgaWYgdGhhdCBhbGdvcml0aG0gaXMgdG8gYmUgdXNlZDsgdGhlaXIgd2ViIHBhZ2UgaXMKLSBodHRwOi8vd3d3LmFzY29tLmNoLy4KLQotIE5UVCBhbmQgTWl0c3ViaXNoaSBoYXZlIHBhdGVudHMgYW5kIHBlbmRpbmcgcGF0ZW50cyBvbiB0aGUgQ2FtZWxsaWEKLSBhbGdvcml0aG0sIGJ1dCBhbGxvdyB1c2UgYXQgbm8gY2hhcmdlIHdpdGhvdXQgcmVxdWlyaW5nIGFuIGV4cGxpY2l0Ci0gbGljZW5zaW5nIGFncmVlbWVudDogaHR0cDovL2luZm8uaXNsLm50dC5jby5qcC9jcnlwdC9lbmcvaW5mby9jaGl0ZWtpLmh0bWwKKyAgICAgICAgQW5kIG1vcmUuLi4KIAogIElOU1RBTExBVElPTgogIC0tLS0tLS0tLS0tLQogCi0gVG8gaW5zdGFsbCB0aGlzIHBhY2thZ2UgdW5kZXIgYSBVbml4IGRlcml2YXRpdmUsIHJlYWQgdGhlIElOU1RBTEwgZmlsZS4gIEZvcgotIGEgV2luMzIgcGxhdGZvcm0sIHJlYWQgdGhlIElOU1RBTEwuVzMyIGZpbGUuICBGb3IgT3BlblZNUyBzeXN0ZW1zLCByZWFkCi0gSU5TVEFMTC5WTVMuCi0KLSBSZWFkIHRoZSBkb2N1bWVudGF0aW9uIGluIHRoZSBkb2MvIGRpcmVjdG9yeS4gIEl0IGlzIHF1aXRlIHJvdWdoLCBidXQgaXQKLSBsaXN0cyB0aGUgZnVuY3Rpb25zOyB5b3Ugd2lsbCBwcm9iYWJseSBoYXZlIHRvIGxvb2sgYXQgdGhlIGNvZGUgdG8gd29yayBvdXQKLSBob3cgdG8gdXNlIHRoZW0uIExvb2sgYXQgdGhlIGV4YW1wbGUgcHJvZ3JhbXMuCi0KLSBQUk9CTEVNUwotIC0tLS0tLS0tCi0KLSBGb3Igc29tZSBwbGF0Zm9ybXMsIHRoZXJlIGFyZSBzb21lIGtub3duIHByb2JsZW1zIHRoYXQgbWF5IGFmZmVjdCB0aGUgdXNlcgotIG9yIGFwcGxpY2F0aW9uIGF1dGhvci4gIFdlIHRyeSB0byBjb2xsZWN0IHRob3NlIGluIGRvYy9QUk9CTEVNUywgd2l0aCBjdXJyZW50Ci0gdGhvdWdodHMgb24gaG93IHRoZXkgc2hvdWxkIGJlIHNvbHZlZCBpbiBhIGZ1dHVyZSBvZiBPcGVuU1NMLgorIFNlZSB0aGUgYXBwcm9wcmlhdGUgZmlsZToKKyAgICAgICAgSU5TVEFMTCAgICAgICAgIExpbnV4LCBVbml4LCBldGMuCisgICAgICAgIElOU1RBTEwuREpHUFAgICBET1MgcGxhdGZvcm0gd2l0aCBESkdQUAorICAgICAgICBJTlNUQUxMLk5XICAgICAgTmV0d2FyZQorICAgICAgICBJTlNUQUxMLk9TMiAgICAgT1MvMgorICAgICAgICBJTlNUQUxMLlZNUyAgICAgVk1TCisgICAgICAgIElOU1RBTEwuVzMyICAgICBXaW5kb3dzICgzMmJpdCkKKyAgICAgICAgSU5TVEFMTC5XNjQgICAgIFdpbmRvd3MgKDY0Yml0KQorICAgICAgICBJTlNUQUxMLldDRSAgICAgV2luZG93cyBDRQogCiAgU1VQUE9SVAogIC0tLS0tLS0KIAotIFNlZSB0aGUgT3BlblNTTCB3ZWJzaXRlIHd3dy5vcGVuc3NsLm9yZyBmb3IgZGV0YWlscyBvZiBob3cgdG8gb2J0YWluCisgU2VlIHRoZSBPcGVuU1NMIHdlYnNpdGUgd3d3Lm9wZW5zc2wub3JnIGZvciBkZXRhaWxzIG9uIGhvdyB0byBvYnRhaW4KICBjb21tZXJjaWFsIHRlY2huaWNhbCBzdXBwb3J0LgogCiAgSWYgeW91IGhhdmUgYW55IHByb2JsZW1zIHdpdGggT3BlblNTTCB0aGVuIHBsZWFzZSB0YWtlIHRoZSBmb2xsb3dpbmcgc3RlcHMKQEAgLTE2MSw1OCArODQsMzYgQEAKICAgICAtIFByb2JsZW0gRGVzY3JpcHRpb24gKHN0ZXBzIHRoYXQgd2lsbCByZXByb2R1Y2UgdGhlIHByb2JsZW0sIGlmIGtub3duKQogICAgIC0gU3RhY2sgVHJhY2ViYWNrIChpZiB0aGUgYXBwbGljYXRpb24gZHVtcHMgY29yZSkKIAotIFJlcG9ydCB0aGUgYnVnIHRvIHRoZSBPcGVuU1NMIHByb2plY3QgdmlhIHRoZSBSZXF1ZXN0IFRyYWNrZXIKLSAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy9zdXBwb3J0L3J0Lmh0bWwpIGJ5IG1haWwgdG86CisgRW1haWwgdGhlIHJlcG9ydCB0bzoKIAotICAgIG9wZW5zc2wtYnVnc0BvcGVuc3NsLm9yZworICAgIHJ0QG9wZW5zc2wub3JnCiAKLSBOb3RlIHRoYXQgdGhlIHJlcXVlc3QgdHJhY2tlciBzaG91bGQgTk9UIGJlIHVzZWQgZm9yIGdlbmVyYWwgYXNzaXN0YW5jZQotIG9yIHN1cHBvcnQgcXVlcmllcy4gSnVzdCBiZWNhdXNlIHNvbWV0aGluZyBkb2Vzbid0IHdvcmsgdGhlIHdheSB5b3UgZXhwZWN0Ci0gZG9lcyBub3QgbWVhbiBpdCBpcyBuZWNlc3NhcmlseSBhIGJ1ZyBpbiBPcGVuU1NMLgorIEluIG9yZGVyIHRvIGF2b2lkIHNwYW0sIHRoaXMgaXMgYSBtb2RlcmF0ZWQgbWFpbGluZyBsaXN0LCBhbmQgaXQgbWlnaHQKKyB0YWtlIGEgZGF5IGZvciB0aGUgdGlja2V0IHRvIHNob3cgdXAuICAoV2UgYWxzbyBzY2FuIHBvc3RzIHRvIG1ha2Ugc3VyZQorIHRoYXQgc2VjdXJpdHkgZGlzY2xvc3VyZXMgYXJlbid0IHB1YmxpY2FsbHkgcG9zdGVkIGJ5IG1pc3Rha2UuKSBNYWlsCisgdG8gdGhpcyBhZGRyZXNzIGlzIHJlY29yZGVkIGluIHRoZSBwdWJsaWMgUlQgKHJlcXVlc3QgdHJhY2tlcikgZGF0YWJhc2UKKyAoc2VlIGh0dHBzOi8vd3d3Lm9wZW5zc2wub3JnL2NvbW11bml0eS9pbmRleC5odG1sI2J1Z3MgZm9yIGRldGFpbHMpIGFuZAorIGFsc28gZm9yd2FyZGVkIHRoZSBwdWJsaWMgb3BlbnNzbC1kZXYgbWFpbGluZyBsaXN0LiAgQ29uZmlkZW50aWFsIG1haWwKKyBtYXkgYmUgc2VudCB0byBvcGVuc3NsLXNlY3VyaXR5QG9wZW5zc2wub3JnIChQR1Aga2V5IGF2YWlsYWJsZSBmcm9tIHRoZQorIGtleSBzZXJ2ZXJzKS4KIAotIE5vdGUgdGhhdCBtYWlsIHRvIG9wZW5zc2wtYnVnc0BvcGVuc3NsLm9yZyBpcyByZWNvcmRlZCBpbiB0aGUgcHVibGljbHkKLSByZWFkYWJsZSByZXF1ZXN0IHRyYWNrZXIgZGF0YWJhc2UgYW5kIGlzIGZvcndhcmRlZCB0byBhIHB1YmxpYwotIG1haWxpbmcgbGlzdC4gQ29uZmlkZW50aWFsIG1haWwgbWF5IGJlIHNlbnQgdG8gb3BlbnNzbC1zZWN1cml0eUBvcGVuc3NsLm9yZwotIChQR1Aga2V5IGF2YWlsYWJsZSBmcm9tIHRoZSBrZXkgc2VydmVycykuCisgUGxlYXNlIGRvIE5PVCB1c2UgdGhpcyBmb3IgZ2VuZXJhbCBhc3Npc3RhbmNlIG9yIHN1cHBvcnQgcXVlcmllcy4KKyBKdXN0IGJlY2F1c2Ugc29tZXRoaW5nIGRvZXNuJ3Qgd29yayB0aGUgd2F5IHlvdSBleHBlY3QgZG9lcyBub3QgbWVhbiBpdAorIGlzIG5lY2Vzc2FyaWx5IGEgYnVnIGluIE9wZW5TU0wuCisKKyBZb3UgY2FuIGFsc28gbWFrZSBHaXRIdWIgcHVsbCByZXF1ZXN0cy4gSWYgeW91IGRvIHRoaXMsIHBsZWFzZSBhbHNvIHNlbmQKKyBtYWlsIHRvIHJ0QG9wZW5zc2wub3JnIHdpdGggYSBsaW5rIHRvIHRoZSBQUiBzbyB0aGF0IHdlIGNhbiBtb3JlIGVhc2lseQorIGtlZXAgdHJhY2sgb2YgaXQuCiAKICBIT1cgVE8gQ09OVFJJQlVURSBUTyBPcGVuU1NMCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0gRGV2ZWxvcG1lbnQgaXMgY29vcmRpbmF0ZWQgb24gdGhlIG9wZW5zc2wtZGV2IG1haWxpbmcgbGlzdCAoc2VlCi0gaHR0cDovL3d3dy5vcGVuc3NsLm9yZyBmb3IgaW5mb3JtYXRpb24gb24gc3Vic2NyaWJpbmcpLiBJZiB5b3UKLSB3b3VsZCBsaWtlIHRvIHN1Ym1pdCBhIHBhdGNoLCBzZW5kIGl0IHRvIG9wZW5zc2wtYnVnc0BvcGVuc3NsLm9yZyB3aXRoCi0gdGhlIHN0cmluZyAiW1BBVENIXSIgaW4gdGhlIHN1YmplY3QuIFBsZWFzZSBiZSBzdXJlIHRvIGluY2x1ZGUgYQotIHRleHR1YWwgZXhwbGFuYXRpb24gb2Ygd2hhdCB5b3VyIHBhdGNoIGRvZXMuCisgU2VlIENPTlRSSUJVVElORwogCi0gSWYgeW91IGFyZSB1bnN1cmUgYXMgdG8gd2hldGhlciBhIGZlYXR1cmUgd2lsbCBiZSB1c2VmdWwgZm9yIHRoZSBnZW5lcmFsCi0gT3BlblNTTCBjb21tdW5pdHkgcGxlYXNlIGRpc2N1c3MgaXQgb24gdGhlIG9wZW5zc2wtZGV2IG1haWxpbmcgbGlzdCBmaXJzdC4KLSBTb21lb25lIG1heSBiZSBhbHJlYWR5IHdvcmtpbmcgb24gdGhlIHNhbWUgdGhpbmcgb3IgdGhlcmUgbWF5IGJlIGEgZ29vZAotIHJlYXNvbiBhcyB0byB3aHkgdGhhdCBmZWF0dXJlIGlzbid0IGltcGxlbWVudGVkLgorIExFR0FMSVRJRVMKKyAtLS0tLS0tLS0tCiAKLSBQYXRjaGVzIHNob3VsZCBiZSBhcyB1cCB0byBkYXRlIGFzIHBvc3NpYmxlLCBwcmVmZXJhYmx5IHJlbGF0aXZlIHRvIHRoZQotIGN1cnJlbnQgR2l0IG9yIHRoZSBsYXN0IHNuYXBzaG90LiBUaGV5IHNob3VsZCBmb2xsb3cgdGhlIGNvZGluZyBzdHlsZSBvZgotIE9wZW5TU0wgYW5kIGNvbXBpbGUgd2l0aG91dCB3YXJuaW5ncy4gU29tZSBvZiB0aGUgY29yZSB0ZWFtIGRldmVsb3BlciB0YXJnZXRzCi0gY2FuIGJlIHVzZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMsIChkZWJ1Zy1zdGV2ZTY0LCBkZWJ1Zy1nZW9mZiBldGMpLiBPcGVuU1NMCi0gY29tcGlsZXMgb24gbWFueSB2YXJpZWQgcGxhdGZvcm1zOiB0cnkgdG8gZW5zdXJlIHlvdSBvbmx5IHVzZSBwb3J0YWJsZQotIGZlYXR1cmVzLgotCi0gTm90ZTogRm9yIGxlZ2FsIHJlYXNvbnMsIGNvbnRyaWJ1dGlvbnMgZnJvbSB0aGUgVVMgY2FuIGJlIGFjY2VwdGVkIG9ubHkKLSBpZiBhIFRTVSBub3RpZmljYXRpb24gYW5kIGEgY29weSBvZiB0aGUgcGF0Y2ggYXJlIHNlbnQgdG8gY3J5cHRAYmlzLmRvYy5nb3YKLSAoZm9ybWVybHkgQlhBKSB3aXRoIGEgY29weSB0byB0aGUgRU5DIEVuY3J5cHRpb24gUmVxdWVzdCBDb29yZGluYXRvcjsKLSBwbGVhc2UgdGFrZSBzb21lIHRpbWUgdG8gbG9vayBhdAotICAgIGh0dHA6Ly93d3cuYmlzLmRvYy5nb3YvRW5jcnlwdGlvbi9QdWJBdmFpbEVuY1NvdXJjZUNvZGVOb2ZpZnkuaHRtbCBbc2ljXQotIGFuZAotICAgIGh0dHA6Ly93My5hY2Nlc3MuZ3BvLmdvdi9iaXMvZWFyL3BkZi83NDAucGRmIChFQVIgU2VjdGlvbiA3NDAuMTMoZSkpCi0gZm9yIHRoZSBkZXRhaWxzLiBJZiAieW91ciBlbmNyeXB0aW9uIHNvdXJjZSBjb2RlIGlzIHRvbyBsYXJnZSB0byBzZXJ2ZSBhcwotIGFuIGVtYWlsIGF0dGFjaG1lbnQiLCB0aGV5IGFyZSBnbGFkIHRvIHJlY2VpdmUgaXQgYnkgZmF4IGluc3RlYWQ7IGhvcGUgeW91Ci0gaGF2ZSBhIGNoZWFwIGxvbmctZGlzdGFuY2UgcGxhbi4KLQotIE91ciBwcmVmZXJyZWQgZm9ybWF0IGZvciBjaGFuZ2VzIGlzICJkaWZmIC11IiBvdXRwdXQuIFlvdSBtaWdodAotIGdlbmVyYXRlIGl0IGxpa2UgdGhpczoKLQotICMgY2Qgb3BlbnNzbC13b3JrCi0gIyBbeW91ciBjaGFuZ2VzXQotICMgLi9Db25maWd1cmUgZGlzdDsgbWFrZSBjbGVhbgotICMgY2QgLi4KLSAjIGRpZmYgLXVyIG9wZW5zc2wtb3JpZyBvcGVuc3NsLXdvcmsgPiBteWRpZmZzLnBhdGNoCi0KKyBBIG51bWJlciBvZiBuYXRpb25zLCBpbiBwYXJ0aWN1bGFyIHRoZSBVLlMuLCByZXN0cmljdCB0aGUgdXNlIG9yIGV4cG9ydAorIG9mIGNyeXB0b2dyYXBoeS4gSWYgeW91IGFyZSBwb3RlbnRpYWxseSBzdWJqZWN0IHRvIHN1Y2ggcmVzdHJpY3Rpb25zCisgeW91IHNob3VsZCBzZWVrIGNvbXBldGVudCBwcm9mZXNzaW9uYWwgbGVnYWwgYWR2aWNlIGJlZm9yZSBhdHRlbXB0aW5nIHRvCisgZGV2ZWxvcCBvciBkaXN0cmlidXRlIGNyeXB0b2dyYXBoaWMgY29kZS4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvYXBwcy9NYWtlZmlsZSBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvYXBwcy9NYWtlZmlsZQppbmRleCBjYWZlNTU0Li44YzMyOTdlIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2FwcHMvTWFrZWZpbGUKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9hcHBzL01ha2VmaWxlCkBAIC0xMzUsNyArMTM1LDcgQEAKIGRlcGVuZDogbG9jYWxfZGVwZW5kCiAJQGlmIFsgLXogIiQoVEhJUykiIF07IHRoZW4gJChNQUtFKSAtZiAkKFRPUCkvTWFrZWZpbGUgcmVmbGVjdCBUSElTPSRAOyBmaQogbG9jYWxfZGVwZW5kOgotCUBbIC16ICIkKFRISVMpIiBdIHx8ICQoTUFLRURFUEVORCkgLS0gJChDRkxBRykgJChJTkNMVURFUykgJChERVBGTEFHKSAtLSAkKFBST0dTKSAkKFNSQyk7IFwKKwlAWyAteiAiJChUSElTKSIgXSB8fCAkKE1BS0VERVBFTkQpIC0tICQoQ0ZMQUcpICQoSU5DTFVERVMpICQoREVQRkxBRykgLS0gJChQUk9HUykgJChTUkMpCiAKIGRjbGVhbjoKIAkkKFBFUkwpIC1wZSAnaWYgKC9eIyBETyBOT1QgREVMRVRFIFRISVMgTElORS8pIHtwcmludDsgZXhpdCgwKTt9JyAkKE1BS0VGSUxFKSA+TWFrZWZpbGUubmV3CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2FwcHMvYXBwcy5jIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9hcHBzL2FwcHMuYwppbmRleCA2ODAxMjM4Li44YWI0ODMzIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2FwcHMvYXBwcy5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvYXBwcy9hcHBzLmMKQEAgLTExOSw5ICsxMTksNiBAQAogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaWYgIWRlZmluZWQoT1BFTlNTTF9TWVNOQU1FX1dJTjMyKSAmJiAhZGVmaW5lZChORVRXQVJFX0NMSUIpCi0jIGluY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPGN0eXBlLmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KQEAgLTEyNDcsNyArMTI0NCwxMSBAQAogICAgICAgICB7ImNhX2RlZmF1bHQiLCBYTl9GTEFHX01VTFRJTElORSwgMHhmZmZmZmZmZkx9LAogICAgICAgICB7TlVMTCwgMCwgMH0KICAgICB9OwotICAgIHJldHVybiBzZXRfbXVsdGlfb3B0cyhmbGFncywgYXJnLCBleF90YmwpOworICAgIGlmIChzZXRfbXVsdGlfb3B0cyhmbGFncywgYXJnLCBleF90YmwpID09IDApCisgICAgICAgIHJldHVybiAwOworICAgIGlmICgoKmZsYWdzICYgWE5fRkxBR19TRVBfTUFTSykgPT0gMCkKKyAgICAgICAgKmZsYWdzIHw9IFhOX0ZMQUdfU0VQX0NQTFVTX1NQQzsKKyAgICByZXR1cm4gMTsKIH0KIAogaW50IHNldF9leHRfY29weShpbnQgKmNvcHlfdHlwZSwgY29uc3QgY2hhciAqYXJnKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9hcHBzL2FzbjFwYXJzLmMgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2FwcHMvYXNuMXBhcnMuYwppbmRleCAxMWIwNzg3Li4wYTZiOTkwIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2FwcHMvYXNuMXBhcnMuYworKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2FwcHMvYXNuMXBhcnMuYwpAQCAtMzEzLDkgKzMxMyw5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICB0eXAgPSBBU04xX1RZUEVfZ2V0KGF0KTsKICAgICAgICAgICAgIGlmICgodHlwID09IFZfQVNOMV9PQkpFQ1QpCisgICAgICAgICAgICAgICAgfHwgKHR5cCA9PSBWX0FTTjFfQk9PTEVBTikKICAgICAgICAgICAgICAgICB8fCAodHlwID09IFZfQVNOMV9OVUxMKSkgewotICAgICAgICAgICAgICAgIEJJT19wcmludGYoYmlvX2VyciwgIkNhbid0IHBhcnNlICVzIHR5cGVcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0eXAgPT0gVl9BU04xX05VTEwgPyAiTlVMTCIgOiAiT0JKRUNUIik7CisgICAgICAgICAgICAgICAgQklPX3ByaW50ZihiaW9fZXJyLCAiQ2FuJ3QgcGFyc2UgJXMgdHlwZVxuIiwgQVNOMV90YWcyc3RyKHR5cCkpOwogICAgICAgICAgICAgICAgIEVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CiAgICAgICAgICAgICAgICAgZ290byBlbmQ7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2FwcHMvY2EuYyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvYXBwcy9jYS5jCmluZGV4IDk3YWQwYzEuLjRkNjRlYjIgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvYXBwcy9jYS5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvYXBwcy9jYS5jCkBAIC05OSwyNSArOTksMTkgQEAKICN1bmRlZiBQUk9HCiAjZGVmaW5lIFBST0cgY2FfbWFpbgogCi0jZGVmaW5lIEJBU0VfU0VDVElPTiAgICAiY2EiCi0jZGVmaW5lIENPTkZJR19GSUxFICJvcGVuc3NsLmNuZiIKKyNkZWZpbmUgQkFTRV9TRUNUSU9OICAgICAgICAgICAgImNhIgorI2RlZmluZSBDT05GSUdfRklMRSAgICAgICAgICAgICAib3BlbnNzbC5jbmYiCiAKICNkZWZpbmUgRU5WX0RFRkFVTFRfQ0EgICAgICAgICAgImRlZmF1bHRfY2EiCiAKLSNkZWZpbmUgU1RSSU5HX01BU0sgICAgICJzdHJpbmdfbWFzayIKKyNkZWZpbmUgU1RSSU5HX01BU0sgICAgICAgICAgICAgInN0cmluZ19tYXNrIgogI2RlZmluZSBVVEY4X0lOICAgICAgICAgICAgICAgICAidXRmOCIKIAotI2RlZmluZSBFTlZfRElSICAgICAgICAgICAgICAgICAiZGlyIgotI2RlZmluZSBFTlZfQ0VSVFMgICAgICAgICAgICAgICAiY2VydHMiCi0jZGVmaW5lIEVOVl9DUkxfRElSICAgICAgICAgICAgICJjcmxfZGlyIgotI2RlZmluZSBFTlZfQ0FfREIgICAgICAgICAgICAgICAiQ0FfREIiCiAjZGVmaW5lIEVOVl9ORVdfQ0VSVFNfRElSICAgICAgICJuZXdfY2VydHNfZGlyIgogI2RlZmluZSBFTlZfQ0VSVElGSUNBVEUgICAgICAgICAiY2VydGlmaWNhdGUiCiAjZGVmaW5lIEVOVl9TRVJJQUwgICAgICAgICAgICAgICJzZXJpYWwiCiAjZGVmaW5lIEVOVl9DUkxOVU1CRVIgICAgICAgICAgICJjcmxudW1iZXIiCi0jZGVmaW5lIEVOVl9DUkwgICAgICAgICAgICAgICAgICJjcmwiCiAjZGVmaW5lIEVOVl9QUklWQVRFX0tFWSAgICAgICAgICJwcml2YXRlX2tleSIKLSNkZWZpbmUgRU5WX1JBTkRGSUxFICAgICAgICAgICAgIlJBTkRGSUxFIgogI2RlZmluZSBFTlZfREVGQVVMVF9EQVlTICAgICAgICAiZGVmYXVsdF9kYXlzIgogI2RlZmluZSBFTlZfREVGQVVMVF9TVEFSVERBVEUgICAiZGVmYXVsdF9zdGFydGRhdGUiCiAjZGVmaW5lIEVOVl9ERUZBVUxUX0VORERBVEUgICAgICJkZWZhdWx0X2VuZGRhdGUiCkBAIC0yNTIwLDYgKzI1MTQsOCBAQAogICAgIGNoYXIgKipycm93LCAqYV90bV9zOwogCiAgICAgYV90bSA9IEFTTjFfVVRDVElNRV9uZXcoKTsKKyAgICBpZiAoYV90bSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CiAKICAgICAvKiBnZXQgYWN0dWFsIHRpbWUgYW5kIG1ha2UgYSBzdHJpbmcgKi8KICAgICBhX3RtID0gWDUwOV9nbXRpbWVfYWRqKGFfdG0sIDApOwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9hcHBzL2VjcGFyYW0uYyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvYXBwcy9lY3BhcmFtLmMKaW5kZXggMWYzNDBhOS4uNDAyZmIzMSAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9hcHBzL2VjcGFyYW0uYworKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2FwcHMvZWNwYXJhbS5jCkBAIC00MTMsMTQgKzQxMywxMyBAQAogICAgIH0KIAogICAgIGlmIChjaGVjaykgewotICAgICAgICBpZiAoZ3JvdXAgPT0gTlVMTCkKLSAgICAgICAgICAgIEJJT19wcmludGYoYmlvX2VyciwgIm5vIGVsbGlwdGljIGN1cnZlIHBhcmFtZXRlcnNcbiIpOwogICAgICAgICBCSU9fcHJpbnRmKGJpb19lcnIsICJjaGVja2luZyBlbGxpcHRpYyBjdXJ2ZSBwYXJhbWV0ZXJzOiAiKTsKICAgICAgICAgaWYgKCFFQ19HUk9VUF9jaGVjayhncm91cCwgTlVMTCkpIHsKICAgICAgICAgICAgIEJJT19wcmludGYoYmlvX2VyciwgImZhaWxlZFxuIik7CiAgICAgICAgICAgICBFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIEJJT19wcmludGYoYmlvX2VyciwgIm9rXG4iKTsKKyAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisgICAgICAgIEJJT19wcmludGYoYmlvX2VyciwgIm9rXG4iKTsKIAogICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9hcHBzL2VuZ2luZS5jIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9hcHBzL2VuZ2luZS5jCmluZGV4IDNkNzBjYWMuLmY1NDYzMWIgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvYXBwcy9lbmdpbmUuYworKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2FwcHMvZW5naW5lLmMKQEAgLTEsNCArMSw0IEBACi0vKiBhcHBzL2VuZ2luZS5jIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJlYXkiIC0qLSAqLworLyogYXBwcy9lbmdpbmUuYyAqLwogLyoKICAqIFdyaXR0ZW4gYnkgUmljaGFyZCBMZXZpdHRlIDxyaWNoYXJkQGxldml0dGUub3JnPiBmb3IgdGhlIE9wZW5TU0wgcHJvamVjdAogICogMjAwMC4KQEAgLTk5LDggKzk5LDYgQEAKIAogc3RhdGljIGludCBhcHBlbmRfYnVmKGNoYXIgKipidWYsIGNvbnN0IGNoYXIgKnMsIGludCAqc2l6ZSwgaW50IHN0ZXApCiB7Ci0gICAgaW50IGwgPSBzdHJsZW4ocyk7Ci0KICAgICBpZiAoKmJ1ZiA9PSBOVUxMKSB7CiAgICAgICAgICpzaXplID0gc3RlcDsKICAgICAgICAgKmJ1ZiA9IE9QRU5TU0xfbWFsbG9jKCpzaXplKTsKQEAgLTEwOSw5ICsxMDcsNiBAQAogICAgICAgICAqKmJ1ZiA9ICdcMCc7CiAgICAgfQogCi0gICAgaWYgKCoqYnVmICE9ICdcMCcpCi0gICAgICAgIGwgKz0gMjsgICAgICAgICAgICAgICAgIC8qICIsICIgKi8KLQogICAgIGlmIChzdHJsZW4oKmJ1ZikgKyBzdHJsZW4ocykgPj0gKHVuc2lnbmVkIGludCkqc2l6ZSkgewogICAgICAgICAqc2l6ZSArPSBzdGVwOwogICAgICAgICAqYnVmID0gT1BFTlNTTF9yZWFsbG9jKCpidWYsICpzaXplKTsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvYXBwcy9vY3NwLmMgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2FwcHMvb2NzcC5jCmluZGV4IDU3MmYwNjQuLmJiNDIwYzIgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvYXBwcy9vY3NwLmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9hcHBzL29jc3AuYwpAQCAtMTAwMyw3ICsxMDAzLDcgQEAKICAgICBicyA9IE9DU1BfQkFTSUNSRVNQX25ldygpOwogICAgIHRoaXN1cGQgPSBYNTA5X2dtdGltZV9hZGooTlVMTCwgMCk7CiAgICAgaWYgKG5kYXlzICE9IC0xKQotICAgICAgICBuZXh0dXBkID0gWDUwOV9nbXRpbWVfYWRqKE5VTEwsIG5taW4gKiA2MCArIG5kYXlzICogMzYwMCAqIDI0KTsKKyAgICAgICAgbmV4dHVwZCA9IFg1MDlfdGltZV9hZGpfZXgoTlVMTCwgbmRheXMsIG5taW4gKiA2MCwgTlVMTCk7CiAKICAgICAvKiBFeGFtaW5lIGVhY2ggY2VydGlmaWNhdGUgaWQgaW4gdGhlIHJlcXVlc3QgKi8KICAgICBmb3IgKGkgPSAwOyBpIDwgaWRfY291bnQ7IGkrKykgewpAQCAtMTIyMCw4ICsxMjIwLDggQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgaWYgKEJJT19nZXRfZmQoY2JpbywgJmZkKSA8PSAwKSB7Ci0gICAgICAgIEJJT19wdXRzKGVyciwgIkNhbid0IGdldCBjb25uZWN0aW9uIGZkXG4iKTsKKyAgICBpZiAoQklPX2dldF9mZChjYmlvLCAmZmQpIDwgMCkgeworICAgICAgICBCSU9fcHV0cyhiaW9fZXJyLCAiQ2FuJ3QgZ2V0IGNvbm5lY3Rpb24gZmRcbiIpOwogICAgICAgICBnb3RvIGVycjsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvYXBwcy9wa2NzMTIuYyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvYXBwcy9wa2NzMTIuYwppbmRleCA0ZmY2NDQ5Li5jYmI3NWI3IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2FwcHMvcGtjczEyLmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9hcHBzL3BrY3MxMi5jCkBAIC03OSw3ICs3OSw4IEBACiAjIGRlZmluZSBDTENFUlRTICAgICAgICAgMHg4CiAjIGRlZmluZSBDQUNFUlRTICAgICAgICAgMHgxMAogCi1pbnQgZ2V0X2NlcnRfY2hhaW4oWDUwOSAqY2VydCwgWDUwOV9TVE9SRSAqc3RvcmUsIFNUQUNLX09GKFg1MDkpICoqY2hhaW4pOworc3RhdGljIGludCBnZXRfY2VydF9jaGFpbihYNTA5ICpjZXJ0LCBYNTA5X1NUT1JFICpzdG9yZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU1RBQ0tfT0YoWDUwOSkgKipjaGFpbik7CiBpbnQgZHVtcF9jZXJ0c19rZXlzX3AxMihCSU8gKm91dCwgUEtDUzEyICpwMTIsIGNoYXIgKnBhc3MsIGludCBwYXNzbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9wdGlvbnMsIGNoYXIgKnBlbXBhc3MpOwogaW50IGR1bXBfY2VydHNfcGtleXNfYmFncyhCSU8gKm91dCwgU1RBQ0tfT0YoUEtDUzEyX1NBRkVCQUcpICpiYWdzLApAQCAtMTM0LDEzICsxMzUsNiBAQAogCiAgICAgYXBwc19zdGFydHVwKCk7CiAKLSMgaWZkZWYgT1BFTlNTTF9GSVBTCi0gICAgaWYgKEZJUFNfbW9kZSgpKQotICAgICAgICBjZXJ0X3BiZSA9IE5JRF9wYmVfV2l0aFNIQTFBbmQzX0tleV9UcmlwbGVERVNfQ0JDOwotICAgIGVsc2UKLSMgZW5kaWYKLSAgICAgICAgY2VydF9wYmUgPSBOSURfcGJlX1dpdGhTSEExQW5kNDBCaXRSQzJfQ0JDOwotCiAgICAgZW5jID0gRVZQX2Rlc19lZGUzX2NiYygpOwogICAgIGlmIChiaW9fZXJyID09IE5VTEwpCiAgICAgICAgIGJpb19lcnIgPSBCSU9fbmV3X2ZwKHN0ZGVyciwgQklPX05PQ0xPU0UpOwpAQCAtMTQ4LDYgKzE0MiwxMyBAQAogICAgIGlmICghbG9hZF9jb25maWcoYmlvX2VyciwgTlVMTCkpCiAgICAgICAgIGdvdG8gZW5kOwogCisjIGlmZGVmIE9QRU5TU0xfRklQUworICAgIGlmIChGSVBTX21vZGUoKSkKKyAgICAgICAgY2VydF9wYmUgPSBOSURfcGJlX1dpdGhTSEExQW5kM19LZXlfVHJpcGxlREVTX0NCQzsKKyAgICBlbHNlCisjIGVuZGlmCisgICAgICAgIGNlcnRfcGJlID0gTklEX3BiZV9XaXRoU0hBMUFuZDQwQml0UkMyX0NCQzsKKwogICAgIGFyZ3MgPSBhcmd2ICsgMTsKIAogICAgIHdoaWxlICgqYXJncykgewpAQCAtNTk0LDcgKzU5NSw3IEBACiAgICAgICAgICAgICB2cmV0ID0gZ2V0X2NlcnRfY2hhaW4odWNlcnQsIHN0b3JlLCAmY2hhaW4yKTsKICAgICAgICAgICAgIFg1MDlfU1RPUkVfZnJlZShzdG9yZSk7CiAKLSAgICAgICAgICAgIGlmICghdnJldCkgeworICAgICAgICAgICAgaWYgKHZyZXQgPT0gWDUwOV9WX09LKSB7CiAgICAgICAgICAgICAgICAgLyogRXhjbHVkZSB2ZXJpZmllZCBjZXJ0aWZpY2F0ZSAqLwogICAgICAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCBza19YNTA5X251bShjaGFpbjIpOyBpKyspCiAgICAgICAgICAgICAgICAgICAgIHNrX1g1MDlfcHVzaChjZXJ0cywgc2tfWDUwOV92YWx1ZShjaGFpbjIsIGkpKTsKQEAgLTYwMiw3ICs2MDMsNyBAQAogICAgICAgICAgICAgICAgIFg1MDlfZnJlZShza19YNTA5X3ZhbHVlKGNoYWluMiwgMCkpOwogICAgICAgICAgICAgICAgIHNrX1g1MDlfZnJlZShjaGFpbjIpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAodnJldCA+PSAwKQorICAgICAgICAgICAgICAgIGlmICh2cmV0ICE9IFg1MDlfVl9FUlJfVU5TUEVDSUZJRUQpCiAgICAgICAgICAgICAgICAgICAgIEJJT19wcmludGYoYmlvX2VyciwgIkVycm9yICVzIGdldHRpbmcgY2hhaW4uXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg1MDlfdmVyaWZ5X2NlcnRfZXJyb3Jfc3RyaW5nKHZyZXQpKTsKICAgICAgICAgICAgICAgICBlbHNlCkBAIC05MDYsMzYgKzkwNywyNSBAQAogCiAvKiBHaXZlbiBhIHNpbmdsZSBjZXJ0aWZpY2F0ZSByZXR1cm4gYSB2ZXJpZmllZCBjaGFpbiBvciBOVUxMIGlmIGVycm9yICovCiAKLS8qIEhvcGUgdGhpcyBpcyBPSyAuLi4uICovCi0KLWludCBnZXRfY2VydF9jaGFpbihYNTA5ICpjZXJ0LCBYNTA5X1NUT1JFICpzdG9yZSwgU1RBQ0tfT0YoWDUwOSkgKipjaGFpbikKK3N0YXRpYyBpbnQgZ2V0X2NlcnRfY2hhaW4oWDUwOSAqY2VydCwgWDUwOV9TVE9SRSAqc3RvcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNUQUNLX09GKFg1MDkpICoqY2hhaW4pCiB7CiAgICAgWDUwOV9TVE9SRV9DVFggc3RvcmVfY3R4OwotICAgIFNUQUNLX09GKFg1MDkpICpjaG47CisgICAgU1RBQ0tfT0YoWDUwOSkgKmNobiA9IE5VTEw7CiAgICAgaW50IGkgPSAwOwogCi0gICAgLyoKLSAgICAgKiBGSVhNRTogU2hvdWxkIHJlYWxseSBjaGVjayB0aGUgcmV0dXJuIHN0YXR1cyBvZiBYNTA5X1NUT1JFX0NUWF9pbml0Ci0gICAgICogZm9yIGFuIGVycm9yLCBidXQgaG93IHRoYXQgZml0cyBpbnRvIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhpcyBmdW5jdGlvbgotICAgICAqIGlzIGxlc3Mgb2J2aW91cy4KLSAgICAgKi8KLSAgICBYNTA5X1NUT1JFX0NUWF9pbml0KCZzdG9yZV9jdHgsIHN0b3JlLCBjZXJ0LCBOVUxMKTsKLSAgICBpZiAoWDUwOV92ZXJpZnlfY2VydCgmc3RvcmVfY3R4KSA8PSAwKSB7Ci0gICAgICAgIGkgPSBYNTA5X1NUT1JFX0NUWF9nZXRfZXJyb3IoJnN0b3JlX2N0eCk7Ci0gICAgICAgIGlmIChpID09IDApCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogYXZvaWQgcmV0dXJuaW5nIDAgaWYgWDUwOV92ZXJpZnlfY2VydCgpIGRpZCBub3Qgc2V0IGFuCi0gICAgICAgICAgICAgKiBhcHByb3ByaWF0ZSBlcnJvciB2YWx1ZSBpbiB0aGUgY29udGV4dAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpID0gLTE7Ci0gICAgICAgIGNobiA9IE5VTEw7Ci0gICAgICAgIGdvdG8gZXJyOwotICAgIH0gZWxzZQorICAgIGlmICghWDUwOV9TVE9SRV9DVFhfaW5pdCgmc3RvcmVfY3R4LCBzdG9yZSwgY2VydCwgTlVMTCkpIHsKKyAgICAgICAgKmNoYWluID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIFg1MDlfVl9FUlJfVU5TUEVDSUZJRUQ7CisgICAgfQorCisgICAgaWYgKFg1MDlfdmVyaWZ5X2NlcnQoJnN0b3JlX2N0eCkgPiAwKQogICAgICAgICBjaG4gPSBYNTA5X1NUT1JFX0NUWF9nZXQxX2NoYWluKCZzdG9yZV9jdHgpOwotIGVycjoKKyAgICBlbHNlIGlmICgoaSA9IFg1MDlfU1RPUkVfQ1RYX2dldF9lcnJvcigmc3RvcmVfY3R4KSkgPT0gMCkKKyAgICAgICAgaSA9IFg1MDlfVl9FUlJfVU5TUEVDSUZJRUQ7CisKICAgICBYNTA5X1NUT1JFX0NUWF9jbGVhbnVwKCZzdG9yZV9jdHgpOwogICAgICpjaGFpbiA9IGNobjsKLQogICAgIHJldHVybiBpOwogfQogCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2FwcHMvc19jbGllbnQuYyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvYXBwcy9zX2NsaWVudC5jCmluZGV4IDI4NzM3YjYuLjE2ODMzYWMgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvYXBwcy9zX2NsaWVudC5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvYXBwcy9zX2NsaWVudC5jCkBAIC0xODg0LDYgKzE4ODQsOSBAQAogICAgICAgICBFVlBfUEtFWV9mcmVlKGtleSk7CiAgICAgaWYgKHBhc3MpCiAgICAgICAgIE9QRU5TU0xfZnJlZShwYXNzKTsKKyNpZm5kZWYgT1BFTlNTTF9OT19TUlAKKyAgICBPUEVOU1NMX2ZyZWUoc3JwX2FyZy5zcnBwYXNzaW4pOworI2VuZGlmCiAgICAgaWYgKHZwbSkKICAgICAgICAgWDUwOV9WRVJJRllfUEFSQU1fZnJlZSh2cG0pOwogICAgIGlmIChjYnVmICE9IE5VTEwpIHsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvYXBwcy9zX3NlcnZlci5jIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9hcHBzL3Nfc2VydmVyLmMKaW5kZXggYjU4ZTVlMC4uYThhZWU3NyAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9hcHBzL3Nfc2VydmVyLmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9hcHBzL3Nfc2VydmVyLmMKQEAgLTI2NTQsNiArMjY1NCwyMSBAQAogICAgICAgICAgICAgICAgIGdvdG8gZXJyOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBCSU9fcHJpbnRmKGJpb19zX291dCwgInJlYWQgUiBCTE9DS1xuIik7CisjaWZuZGVmIE9QRU5TU0xfTk9fU1JQCisgICAgICAgICAgICAgICAgaWYgKEJJT19zaG91bGRfaW9fc3BlY2lhbChpbykKKyAgICAgICAgICAgICAgICAgICAgJiYgQklPX2dldF9yZXRyeV9yZWFzb24oaW8pID09IEJJT19SUl9TU0xfWDUwOV9MT09LVVApIHsKKyAgICAgICAgICAgICAgICAgICAgQklPX3ByaW50ZihiaW9fc19vdXQsICJMT09LVVAgcmVuZWdvIGR1cmluZyByZWFkXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgc3JwX2NhbGxiYWNrX3Bhcm0udXNlciA9CisgICAgICAgICAgICAgICAgICAgICAgICBTUlBfVkJBU0VfZ2V0X2J5X3VzZXIoc3JwX2NhbGxiYWNrX3Bhcm0udmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JwX2NhbGxiYWNrX3Bhcm0ubG9naW4pOworICAgICAgICAgICAgICAgICAgICBpZiAoc3JwX2NhbGxiYWNrX3Bhcm0udXNlcikKKyAgICAgICAgICAgICAgICAgICAgICAgIEJJT19wcmludGYoYmlvX3Nfb3V0LCAiTE9PS1VQIGRvbmUgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNycF9jYWxsYmFja19wYXJtLnVzZXItPmluZm8pOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBCSU9fcHJpbnRmKGJpb19zX291dCwgIkxPT0tVUCBub3Qgc3VjY2Vzc2Z1bFxuIik7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZgogI2lmIGRlZmluZWQoT1BFTlNTTF9TWVNfTkVUV0FSRSkKICAgICAgICAgICAgICAgICBkZWxheSgxMDAwKTsKICNlbGlmICFkZWZpbmVkKE9QRU5TU0xfU1lTX01TRE9TKSAmJiAhZGVmaW5lZChfX0RKR1BQX18pCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2FwcHMvc3BlZWQuYyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvYXBwcy9zcGVlZC5jCmluZGV4IDdkOWZkOGEuLmVmNzI3MjMgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvYXBwcy9zcGVlZC5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvYXBwcy9zcGVlZC5jCkBAIC0xLDQgKzEsNCBAQAotLyogYXBwcy9zcGVlZC5jIC0qLSBtb2RlOkM7IGMtZmlsZS1zdHlsZTogImVheSIgLSotICovCisvKiBhcHBzL3NwZWVkLmMgKi8KIC8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2FwcHMveDUwOS5jIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9hcHBzL3g1MDkuYwppbmRleCA5MjkzNTliLi5lNWZlNjEwIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2FwcHMveDUwOS5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvYXBwcy94NTA5LmMKQEAgLTExNzAsMTIgKzExNzAsNyBAQAogICAgIGlmIChYNTA5X2dtdGltZV9hZGooWDUwOV9nZXRfbm90QmVmb3JlKHgpLCAwKSA9PSBOVUxMKQogICAgICAgICBnb3RvIGVycjsKIAotICAgIC8qIExldHMganVzdCBtYWtlIGl0IDEyOjAwYW0gR01ULCBKYW4gMSAxOTcwICovCi0gICAgLyogbWVtY3B5KHgtPmNlcnRfaW5mby0+dmFsaWRpdHktPm5vdEJlZm9yZSwiNzAwMTAxMTIwMDAwWiIsMTMpOyAqLwotICAgIC8qIDI4IGRheXMgdG8gYmUgY2VydGlmaWVkICovCi0KLSAgICBpZiAoWDUwOV9nbXRpbWVfYWRqKFg1MDlfZ2V0X25vdEFmdGVyKHgpLCAobG9uZyk2MCAqIDYwICogMjQgKiBkYXlzKSA9PQotICAgICAgICBOVUxMKQorICAgIGlmIChYNTA5X3RpbWVfYWRqX2V4KFg1MDlfZ2V0X25vdEFmdGVyKHgpLCBkYXlzLCAwLCBOVUxMKSA9PSBOVUxMKQogICAgICAgICBnb3RvIGVycjsKIAogICAgIGlmICghWDUwOV9zZXRfcHVia2V5KHgsIHBrZXkpKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9hcHB2ZXlvci55bWwgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2FwcHZleW9yLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Njk1MzU5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9hcHB2ZXlvci55bWwKQEAgLTAsMCArMSw2MCBAQAorcGxhdGZvcm06CisgICAgLSB4ODYKKyAgICAtIHg2NAorCitlbnZpcm9ubWVudDoKKyAgICBtYXRyaXg6CisgICAgICAgIC0gVlNWRVI6IDkKKyAgICAgICAgLSBWU1ZFUjogMTAKKyAgICAgICAgLSBWU1ZFUjogMTEKKyAgICAgICAgLSBWU1ZFUjogMTIKKyAgICAgICAgLSBWU1ZFUjogMTQKKworY29uZmlndXJhdGlvbjoKKyAgICAtIHBsYWluCisgICAgLSBzaGFyZWQKKworbWF0cml4OgorICAgIGFsbG93X2ZhaWx1cmVzOgorICAgICAgICAtIHBsYXRmb3JtOiB4NjQKKyAgICAgICAgICBWU1ZFUjogOQorICAgICAgICAtIHBsYXRmb3JtOiB4NjQKKyAgICAgICAgICBWU1ZFUjogMTAKKyAgICAgICAgLSBwbGF0Zm9ybTogeDY0CisgICAgICAgICAgVlNWRVI6IDExCisKK2JlZm9yZV9idWlsZDoKKyAgICAtIHBzOiA+LQorICAgICAgICBJZiAoJGVudjpQbGF0Zm9ybSAtTWF0Y2ggIng4NiIpIHsKKyAgICAgICAgICAgICRlbnY6VkNWQVJTX1BMQVRGT1JNPSJ4ODYiCisgICAgICAgICAgICAkZW52OlRBUkdFVD0iVkMtV0lOMzIiCisgICAgICAgICAgICAkZW52OkRPPSJkb19tcyIKKyAgICAgICAgfSBFbHNlIHsKKyAgICAgICAgICAgICRlbnY6VkNWQVJTX1BMQVRGT1JNPSJhbWQ2NCIKKyAgICAgICAgICAgICRlbnY6VEFSR0VUPSJWQy1XSU42NEEiCisgICAgICAgICAgICAkZW52OkRPPSJkb193aW42NGEiCisgICAgICAgIH0KKyAgICAtIHBzOiA+LQorICAgICAgICBJZiAoJGVudjpDb25maWd1cmF0aW9uIC1MaWtlICIqc2hhcmVkKiIpIHsKKyAgICAgICAgICAgICRlbnY6TUFLPSJudGRsbC5tYWsiCisgICAgICAgIH0gRWxzZSB7CisgICAgICAgICAgICAkZW52Ok1BSz0ibnQubWFrIgorICAgICAgICB9CisgICAgLSBwczogJGVudjpWU0NPTU5UT09MUz0oR2V0LUNvbnRlbnQgKCJlbnY6VlMiICsgIiRlbnY6VlNWRVIiICsgIjBDT01OVE9PTFMiKSkKKyAgICAtIGNhbGwgIiVWU0NPTU5UT09MUyVcLi5cLi5cVkNcdmN2YXJzYWxsLmJhdCIgJVZDVkFSU19QTEFURk9STSUKKyAgICAtIHBlcmwgQ29uZmlndXJlICVUQVJHRVQlIG5vLWFzbQorICAgIC0gY2FsbCBtc1wlRE8lCisKK2J1aWxkX3NjcmlwdDoKKyAgICAtIG5tYWtlIC9mIG1zXCVNQUslCisKK3Rlc3Rfc2NyaXB0OgorICAgIC0gbm1ha2UgL2YgbXNcJU1BSyUgdGVzdAorCitub3RpZmljYXRpb25zOgorICAgIC0gcHJvdmlkZXI6IEVtYWlsCisgICAgICB0bzoKKyAgICAgICAgICAtIG9wZW5zc2wtY29tbWl0c0BvcGVuc3NsLm9yZworICAgICAgb25fYnVpbGRfc3VjY2VzczogZmFsc2UKKyAgICAgIG9uX2J1aWxkX2ZhaWx1cmU6IHRydWUKKyAgICAgIG9uX2J1aWxkX3N0YXR1c19jaGFuZ2VkOiB0cnVlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9hZXMvYWVzLmggYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9hZXMvYWVzLmgKaW5kZXggNTZmMTY2Zi4uZDA1MjI4OSAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vYWVzL2Flcy5oCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2Flcy9hZXMuaApAQCAtMSw0ICsxLDQgQEAKLS8qIGNyeXB0by9hZXMvYWVzLmggLSotIG1vZGU6QzsgYy1maWxlLXN0eWxlOiAiZWF5IiAtKi0gKi8KKy8qIGNyeXB0by9hZXMvYWVzLmggKi8KIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMiBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9hZXMvYWVzX2NiYy5jIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vYWVzL2Flc19jYmMuYwppbmRleCBlMzkyMzFmLi44MDVkMGUyIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9hZXMvYWVzX2NiYy5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2Flcy9hZXNfY2JjLmMKQEAgLTEsNCArMSw0IEBACi0vKiBjcnlwdG8vYWVzL2Flc19jYmMuYyAtKi0gbW9kZTpDOyBjLWZpbGUtc3R5bGU6ICJlYXkiIC0qLSAqLworLyogY3J5cHRvL2Flcy9hZXNfY2JjLmMgKi8KIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMiBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9hZXMvYWVzX2NmYi5jIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vYWVzL2Flc19jZmIuYwppbmRleCAxYzc5Y2UyLi4xMjI1MDAwIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9hZXMvYWVzX2NmYi5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2Flcy9hZXNfY2ZiLmMKQEAgLTEsNCArMSw0IEBACi0vKiBjcnlwdG8vYWVzL2Flc19jZmIuYyAtKi0gbW9kZTpDOyBjLWZpbGUtc3R5bGU6ICJlYXkiIC0qLSAqLworLyogY3J5cHRvL2Flcy9hZXNfY2ZiLmMgKi8KIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNiBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9hZXMvYWVzX2NvcmUuYyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2Flcy9hZXNfY29yZS5jCmluZGV4IGYzMjQ5OGYuLjY2MzBkNDUgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2Flcy9hZXNfY29yZS5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2Flcy9hZXNfY29yZS5jCkBAIC0xLDQgKzEsNCBAQAotLyogY3J5cHRvL2Flcy9hZXNfY29yZS5jIC0qLSBtb2RlOkM7IGMtZmlsZS1zdHlsZTogImVheSIgLSotICovCisvKiBjcnlwdG8vYWVzL2Flc19jb3JlLmMgKi8KIC8qKgogICogcmlqbmRhZWwtYWxnLWZzdC5jCiAgKgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vYWVzL2Flc19jdHIuYyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2Flcy9hZXNfY3RyLmMKaW5kZXggM2VlMzgyMi4uOWU3NjBjNCAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vYWVzL2Flc19jdHIuYworKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9hZXMvYWVzX2N0ci5jCkBAIC0xLDQgKzEsNCBAQAotLyogY3J5cHRvL2Flcy9hZXNfY3RyLmMgLSotIG1vZGU6QzsgYy1maWxlLXN0eWxlOiAiZWF5IiAtKi0gKi8KKy8qIGNyeXB0by9hZXMvYWVzX2N0ci5jICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDIgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vYWVzL2Flc19lY2IuYyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2Flcy9hZXNfZWNiLmMKaW5kZXggMzQxZTBiYy4uYWFkNmIwMiAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vYWVzL2Flc19lY2IuYworKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9hZXMvYWVzX2VjYi5jCkBAIC0xLDQgKzEsNCBAQAotLyogY3J5cHRvL2Flcy9hZXNfZWNiLmMgLSotIG1vZGU6QzsgYy1maWxlLXN0eWxlOiAiZWF5IiAtKi0gKi8KKy8qIGNyeXB0by9hZXMvYWVzX2VjYi5jICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDIgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vYWVzL2Flc19pZ2UuYyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2Flcy9hZXNfaWdlLmMKaW5kZXggY2YzMWM5Yi4uOGYyYjc3MCAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vYWVzL2Flc19pZ2UuYworKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9hZXMvYWVzX2lnZS5jCkBAIC0xLDQgKzEsNCBAQAotLyogY3J5cHRvL2Flcy9hZXNfaWdlLmMgLSotIG1vZGU6QzsgYy1maWxlLXN0eWxlOiAiZWF5IiAtKi0gKi8KKy8qIGNyeXB0by9hZXMvYWVzX2lnZS5jICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICogQ29weXJpZ2h0IChjKSAyMDA2IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2Flcy9hZXNfbG9jbC5oIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vYWVzL2Flc19sb2NsLmgKaW5kZXggNGJmMmUzYS4uMzAzOGIxNiAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vYWVzL2Flc19sb2NsLmgKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vYWVzL2Flc19sb2NsLmgKQEAgLTEsNCArMSw0IEBACi0vKiBjcnlwdG8vYWVzL2Flcy5oIC0qLSBtb2RlOkM7IGMtZmlsZS1zdHlsZTogImVheSIgLSotICovCisvKiBjcnlwdG8vYWVzL2Flcy5oICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDIgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vYWVzL2Flc19taXNjLmMgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9hZXMvYWVzX21pc2MuYwppbmRleCBhYjk0OGFkLi5mYWZhZDRkIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9hZXMvYWVzX21pc2MuYworKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9hZXMvYWVzX21pc2MuYwpAQCAtMSw0ICsxLDQgQEAKLS8qIGNyeXB0by9hZXMvYWVzX21pc2MuYyAtKi0gbW9kZTpDOyBjLWZpbGUtc3R5bGU6ICJlYXkiIC0qLSAqLworLyogY3J5cHRvL2Flcy9hZXNfbWlzYy5jICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDIgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vYWVzL2Flc19vZmIuYyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2Flcy9hZXNfb2ZiLmMKaW5kZXggZTYxNTNmOS4uNjRhMDhjYSAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vYWVzL2Flc19vZmIuYworKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9hZXMvYWVzX29mYi5jCkBAIC0xLDQgKzEsNCBAQAotLyogY3J5cHRvL2Flcy9hZXNfb2ZiLmMgLSotIG1vZGU6QzsgYy1maWxlLXN0eWxlOiAiZWF5IiAtKi0gKi8KKy8qIGNyeXB0by9hZXMvYWVzX29mYi5jICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDYgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vYWVzL2Flc194ODZjb3JlLmMgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9hZXMvYWVzX3g4NmNvcmUuYwppbmRleCAxZGVmYmIxLi40MjhiZDU4IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9hZXMvYWVzX3g4NmNvcmUuYworKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9hZXMvYWVzX3g4NmNvcmUuYwpAQCAtMSw0ICsxLDQgQEAKLS8qIGNyeXB0by9hZXMvYWVzX2NvcmUuYyAtKi0gbW9kZTpDOyBjLWZpbGUtc3R5bGU6ICJlYXkiIC0qLSAqLworLyogY3J5cHRvL2Flcy9hZXNfY29yZS5jICovCiAvKioKICAqIHJpam5kYWVsLWFsZy1mc3QuYwogICoKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2Flcy9hc20vYWVzLTU4Ni5wbCBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2Flcy9hc20vYWVzLTU4Ni5wbAppbmRleCA2ODdlZDgxLi41MWI1MDBkIDEwMDc1NQotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9hZXMvYXNtL2Flcy01ODYucGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vYWVzL2FzbS9hZXMtNTg2LnBsCkBAIC00NSw3ICs0NSw3IEBACiAjIHRoZSB1bmRlcnRha2VuIGVmZm9ydCB3YXMgdGhhdCBpdCBhcHBlYXJlZCB0aGF0IGluIHRpZ2h0IElBLTMyCiAjIHJlZ2lzdGVyIHdpbmRvdyBsaXR0bGUtZW5kaWFuIGZsYXZvciBjb3VsZCBhY2hpZXZlIHNsaWdodGx5IGhpZ2hlcgogIyBJbnN0cnVjdGlvbiBMZXZlbCBQYXJhbGxlbGlzbSwgYW5kIGl0IGluZGVlZCByZXN1bHRlZCBpbiB1cCB0byAxNSUKLSMgYmV0dGVyIHBlcmZvcm1hbmNlIG9uIG1vc3QgcmVjZW50ILUtYXJjaHMuLi4KKyMgYmV0dGVyIHBlcmZvcm1hbmNlIG9uIG1vc3QgcmVjZW50IMK1LWFyY2hzLi4uCiAjCiAjIFRoaXJkIHZlcnNpb24gYWRkcyBBRVNfY2JjX2VuY3J5cHQgaW1wbGVtZW50YXRpb24sIHdoaWNoIHJlc3VsdGVkIGluCiAjIHVwIHRvIDQwJSBwZXJmb3JtYW5jZSBpbXJvdmVtZW50IG9mIENCQyBiZW5jaG1hcmsgcmVzdWx0cy4gNDAlIHdhcwpAQCAtMjIzLDcgKzIyMyw3IEBACiAkc3BlZWRfbGltaXQ9NTEyOwkjIGNodW5rcyBzbWFsbGVyIHRoYW4gJHNwZWVkX2xpbWl0IGFyZQogCQkJIyBwcm9jZXNzZWQgd2l0aCBjb21wYWN0IHJvdXRpbmUgaW4gQ0JDIG1vZGUKICRzbWFsbF9mb290cHJpbnQ9MTsJIyAkc21hbGxfZm9vdHByaW50PTEgY29kZSBpcyB+NSUgc2xvd2VyIFtvbgotCQkJIyByZWNlbnQgtS1hcmNoc10sIGJ1dCB+NSB0aW1lcyBzbWFsbGVyIQorCQkJIyByZWNlbnQgwrUtYXJjaHNdLCBidXQgfjUgdGltZXMgc21hbGxlciEKIAkJCSMgSSBmYXZvciBjb21wYWN0IGNvZGUgdG8gbWluaW1pemUgY2FjaGUKIAkJCSMgY29udGVudGlvbiBhbmQgaW4gaG9wZSB0byAiY29sbGVjdCIgNSUgYmFjawogCQkJIyBpbiByZWFsLWxpZmUgYXBwbGljYXRpb25zLi4uCkBAIC01NjIsNyArNTYyLDcgQEAKICMgUGVyZm9ybWFuY2UgaXMgbm90IGFjdHVhbGx5IGV4dHJhb3JkaW5hcnkgaW4gY29tcGFyaXNvbiB0byBwdXJlCiAjIHg4NiBjb2RlLiBJbiBwYXJ0aWN1bGFyIGVuY3J5cHQgcGVyZm9ybWFuY2UgaXMgdmlydHVhbGx5IHRoZSBzYW1lLgogIyBEZWNyeXB0IHBlcmZvcm1hbmNlIG9uIHRoZSBvdGhlciBoYW5kIGlzIDE1LTIwJSBiZXR0ZXIgb24gbmV3ZXIKLSMgtS1hcmNocyBbYnV0IHdlJ3JlIHRoYW5rZnVsIGZvciAqYW55KiBpbXByb3ZlbWVudCBoZXJlXSwgYW5kIH41MCUKKyMgwrUtYXJjaHMgW2J1dCB3ZSdyZSB0aGFua2Z1bCBmb3IgKmFueSogaW1wcm92ZW1lbnQgaGVyZV0sIGFuZCB+NTAlCiAjIGJldHRlciBvbiBQSUlJOi0pIEFuZCBhZGRpdGlvbmFsbHkgb24gdGhlIHByb3Mgc2lkZSB0aGlzIGNvZGUKICMgZWxpbWluYXRlcyByZWR1bmRhbnQgcmVmZXJlbmNlcyB0byBzdGFjayBhbmQgdGh1cyByZWxpZXZlcy8KICMgbWluaW1pemVzIHRoZSBwcmVzc3VyZSBvbiB0aGUgbWVtb3J5IGJ1cy4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2Flcy9hc20vYWVzbmkteDg2LnBsIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vYWVzL2FzbS9hZXNuaS14ODYucGwKaW5kZXggM2RjMzQ1Yi4uOGMxZDBiNSAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vYWVzL2FzbS9hZXNuaS14ODYucGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vYWVzL2FzbS9hZXNuaS14ODYucGwKQEAgLTc0LDcgKzc0LDcgQEAKICRpbm91dDQ9InhtbTYiOwkkaW4wPSJ4bW02IjsKICRpbm91dDU9InhtbTciOwkkaXZlYz0ieG1tNyI7CiAKLSMgQUVTTkkgZXh0ZW5zdGlvbgorIyBBRVNOSSBleHRlbnNpb24KIHN1YiBhZXNrZXlnZW5hc3Npc3QKIHsgbXkoJGRzdCwkc3JjLCRpbW0pPUBfOwogICAgIGlmICgiJGRzdDokc3JjIiA9fiAveG1tKFswLTddKTp4bW0oWzAtN10pLykKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2FzbjEvYXNuMV9wYXIuYyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2FzbjEvYXNuMV9wYXIuYwppbmRleCAyMjAxM2I5Li5jNGNiZjIzIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9hc24xL2FzbjFfcGFyLmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vYXNuMS9hc24xX3Bhci5jCkBAIC02NSw2ICs2NSwxMCBAQAogI2luY2x1ZGUgPG9wZW5zc2wvb2JqZWN0cy5oPgogI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgogCisjaWZuZGVmIEFTTjFfUEFSU0VfTUFYREVQVEgKKyNkZWZpbmUgQVNOMV9QQVJTRV9NQVhERVBUSCAxMjgKKyNlbmRpZgorCiBzdGF0aWMgaW50IGFzbjFfcHJpbnRfaW5mbyhCSU8gKmJwLCBpbnQgdGFnLCBpbnQgeGNsYXNzLCBpbnQgY29uc3RydWN0ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZW50KTsKIHN0YXRpYyBpbnQgYXNuMV9wYXJzZTIoQklPICpicCwgY29uc3QgdW5zaWduZWQgY2hhciAqKnBwLCBsb25nIGxlbmd0aCwKQEAgLTEzMSw2ICsxMzUsMTIgQEAKICNlbHNlCiAgICAgZHVtcF9pbmRlbnQgPSA2OyAgICAgICAgICAgIC8qIEJlY2F1c2Ugd2Uga25vdyBCSU9fZHVtcF9pbmRlbnQoKSAqLwogI2VuZGlmCisKKyAgICBpZiAoZGVwdGggPiBBU04xX1BBUlNFX01BWERFUFRIKSB7CisgICAgICAgICAgICBCSU9fcHV0cyhicCwgIkJBRCBSRUNVUlNJT04gREVQVEhcbiIpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCiAgICAgcCA9ICpwcDsKICAgICB0b3QgPSBwICsgbGVuZ3RoOwogICAgIG9wID0gcCAtIDE7CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9hc24xL2QyaV9wci5jIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vYXNuMS9kMmlfcHIuYwppbmRleCBhNjZlODc2Li5iMjVlOGE5IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9hc24xL2QyaV9wci5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2FzbjEvZDJpX3ByLmMKQEAgLTc1LDYgKzc1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGxlbmd0aCkKIHsKICAgICBFVlBfUEtFWSAqcmV0OworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAgPSAqcHA7CiAKICAgICBpZiAoKGEgPT0gTlVMTCkgfHwgKCphID09IE5VTEwpKSB7CiAgICAgICAgIGlmICgocmV0ID0gRVZQX1BLRVlfbmV3KCkpID09IE5VTEwpIHsKQEAgLTk3LDIxICs5OCwyMyBAQAogICAgIH0KIAogICAgIGlmICghcmV0LT5hbWV0aC0+b2xkX3ByaXZfZGVjb2RlIHx8Ci0gICAgICAgICFyZXQtPmFtZXRoLT5vbGRfcHJpdl9kZWNvZGUocmV0LCBwcCwgbGVuZ3RoKSkgeworICAgICAgICAhcmV0LT5hbWV0aC0+b2xkX3ByaXZfZGVjb2RlKHJldCwgJnAsIGxlbmd0aCkpIHsKICAgICAgICAgaWYgKHJldC0+YW1ldGgtPnByaXZfZGVjb2RlKSB7CiAgICAgICAgICAgICBQS0NTOF9QUklWX0tFWV9JTkZPICpwOCA9IE5VTEw7Ci0gICAgICAgICAgICBwOCA9IGQyaV9QS0NTOF9QUklWX0tFWV9JTkZPKE5VTEwsIHBwLCBsZW5ndGgpOworICAgICAgICAgICAgcDggPSBkMmlfUEtDUzhfUFJJVl9LRVlfSU5GTyhOVUxMLCAmcCwgbGVuZ3RoKTsKICAgICAgICAgICAgIGlmICghcDgpCiAgICAgICAgICAgICAgICAgZ290byBlcnI7CiAgICAgICAgICAgICBFVlBfUEtFWV9mcmVlKHJldCk7CiAgICAgICAgICAgICByZXQgPSBFVlBfUEtDUzgyUEtFWShwOCk7CiAgICAgICAgICAgICBQS0NTOF9QUklWX0tFWV9JTkZPX2ZyZWUocDgpOwotCisgICAgICAgICAgICBpZiAocmV0ID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBlcnI7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBBU04xZXJyKEFTTjFfRl9EMklfUFJJVkFURUtFWSwgRVJSX1JfQVNOMV9MSUIpOwogICAgICAgICAgICAgZ290byBlcnI7CiAgICAgICAgIH0KICAgICB9CisgICAgKnBwID0gcDsKICAgICBpZiAoYSAhPSBOVUxMKQogICAgICAgICAoKmEpID0gcmV0OwogICAgIHJldHVybiAocmV0KTsKQEAgLTEzOSw2ICsxNDIsNyBAQAogICAgICAqIGlucHV0IGlzIHN1cnJvdW5kZWQgYnkgYW4gQVNOMSBTRVFVRU5DRS4KICAgICAgKi8KICAgICBpbmtleSA9IGQyaV9BU04xX1NFUVVFTkNFX0FOWShOVUxMLCAmcCwgbGVuZ3RoKTsKKyAgICBwID0gKnBwOwogICAgIC8qCiAgICAgICogU2luY2Ugd2Ugb25seSBuZWVkIHRvIGRpc2Nlcm4gInRyYWRpdGlvbmFsIGZvcm1hdCIgUlNBIGFuZCBEU0Ega2V5cyB3ZQogICAgICAqIGNhbiBqdXN0IGNvdW50IHRoZSBlbGVtZW50cy4KQEAgLTE0OSw3ICsxNTMsNyBAQAogICAgICAgICBrZXl0eXBlID0gRVZQX1BLRVlfRUM7CiAgICAgZWxzZSBpZiAoc2tfQVNOMV9UWVBFX251bShpbmtleSkgPT0gMykgeyAvKiBUaGlzIHNlZW1zIHRvIGJlIFBLQ1M4LCBub3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRyYWRpdGlvbmFsIGZvcm1hdCAqLwotICAgICAgICBQS0NTOF9QUklWX0tFWV9JTkZPICpwOCA9IGQyaV9QS0NTOF9QUklWX0tFWV9JTkZPKE5VTEwsIHBwLCBsZW5ndGgpOworICAgICAgICBQS0NTOF9QUklWX0tFWV9JTkZPICpwOCA9IGQyaV9QS0NTOF9QUklWX0tFWV9JTkZPKE5VTEwsICZwLCBsZW5ndGgpOwogICAgICAgICBFVlBfUEtFWSAqcmV0OwogCiAgICAgICAgIHNrX0FTTjFfVFlQRV9wb3BfZnJlZShpbmtleSwgQVNOMV9UWVBFX2ZyZWUpOwpAQCAtMTYwLDYgKzE2NCw5IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0ID0gRVZQX1BLQ1M4MlBLRVkocDgpOwogICAgICAgICBQS0NTOF9QUklWX0tFWV9JTkZPX2ZyZWUocDgpOworICAgICAgICBpZiAocmV0ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgKnBwID0gcDsKICAgICAgICAgaWYgKGEpIHsKICAgICAgICAgICAgICphID0gcmV0OwogICAgICAgICB9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9hc24xL3Rhc25fZGVjLmMgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9hc24xL3Rhc25fZGVjLmMKaW5kZXggOGMxZDcxNS4uM2RjZTAyZiAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vYXNuMS90YXNuX2RlYy5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2FzbjEvdGFzbl9kZWMuYwpAQCAtMTgzLDYgKzE4Myw4IEBACiAgICAgaW50IG90YWc7CiAgICAgaW50IHJldCA9IDA7CiAgICAgQVNOMV9WQUxVRSAqKnBjaHB0ciwgKnB0bXB2YWw7CisgICAgaW50IGNvbWJpbmUgPSBhY2xhc3MgJiBBU04xX1RGTEdfQ09NQklORTsKKyAgICBhY2xhc3MgJj0gfkFTTjFfVEZMR19DT01CSU5FOwogICAgIGlmICghcHZhbCkKICAgICAgICAgcmV0dXJuIDA7CiAgICAgaWYgKGF1eCAmJiBhdXgtPmFzbjFfY2IpCkBAIC0zNTMsOSArMzU1LDkgQEAKICAgICAgICAgfQogCiAgICAgICAgIGFzbjFfc2V0X2Nob2ljZV9zZWxlY3RvcihwdmFsLCBpLCBpdCk7Ci0gICAgICAgICppbiA9IHA7CiAgICAgICAgIGlmIChhc24xX2NiICYmICFhc24xX2NiKEFTTjFfT1BfRDJJX1BPU1QsIHB2YWwsIGl0LCBOVUxMKSkKICAgICAgICAgICAgIGdvdG8gYXV4ZXJyOworICAgICAgICAqaW4gPSBwOwogICAgICAgICByZXR1cm4gMTsKIAogICAgIGNhc2UgQVNOMV9JVFlQRV9OREVGX1NFUVVFTkNFOgpAQCAtNDkyLDkgKzQ5NCw5IEBACiAgICAgICAgIC8qIFNhdmUgZW5jb2RpbmcgKi8KICAgICAgICAgaWYgKCFhc24xX2VuY19zYXZlKHB2YWwsICppbiwgcCAtICppbiwgaXQpKQogICAgICAgICAgICAgZ290byBhdXhlcnI7Ci0gICAgICAgICppbiA9IHA7CiAgICAgICAgIGlmIChhc24xX2NiICYmICFhc24xX2NiKEFTTjFfT1BfRDJJX1BPU1QsIHB2YWwsIGl0LCBOVUxMKSkKICAgICAgICAgICAgIGdvdG8gYXV4ZXJyOworICAgICAgICAqaW4gPSBwOwogICAgICAgICByZXR1cm4gMTsKIAogICAgIGRlZmF1bHQ6CkBAIC01MDMsNyArNTA1LDggQEAKICBhdXhlcnI6CiAgICAgQVNOMWVycihBU04xX0ZfQVNOMV9JVEVNX0VYX0QySSwgQVNOMV9SX0FVWF9FUlJPUik7CiAgZXJyOgotICAgIEFTTjFfaXRlbV9leF9mcmVlKHB2YWwsIGl0KTsKKyAgICBpZiAoY29tYmluZSA9PSAwKQorICAgICAgICBBU04xX2l0ZW1fZXhfZnJlZShwdmFsLCBpdCk7CiAgICAgaWYgKGVycnR0KQogICAgICAgICBFUlJfYWRkX2Vycm9yX2RhdGEoNCwgIkZpZWxkPSIsIGVycnR0LT5maWVsZF9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgVHlwZT0iLCBpdC0+c25hbWUpOwpAQCAtNjkyLDcgKzY5NSw3IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgLyogTm90aGluZyBzcGVjaWFsICovCiAgICAgICAgIHJldCA9IEFTTjFfaXRlbV9leF9kMmkodmFsLCAmcCwgbGVuLCBBU04xX0lURU1fcHRyKHR0LT5pdGVtKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwgMCwgb3B0LCBjdHgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLCB0dC0+ZmxhZ3MgJiBBU04xX1RGTEdfQ09NQklORSwgb3B0LCBjdHgpOwogICAgICAgICBpZiAoIXJldCkgewogICAgICAgICAgICAgQVNOMWVycihBU04xX0ZfQVNOMV9URU1QTEFURV9OT0VYUF9EMkksIEVSUl9SX05FU1RFRF9BU04xX0VSUk9SKTsKICAgICAgICAgICAgIGdvdG8gZXJyOwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vYXNuMS94X2JpZ251bS5jIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vYXNuMS94X2JpZ251bS5jCmluZGV4IGQ4ZDk1ZjAuLmZhOTE3OTkgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2FzbjEveF9iaWdudW0uYworKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9hc24xL3hfYmlnbnVtLmMKQEAgLTE0NCw4ICsxNDQsOSBAQAogICAgICAgICAgICAgICAgICAgaW50IHV0eXBlLCBjaGFyICpmcmVlX2NvbnQsIGNvbnN0IEFTTjFfSVRFTSAqaXQpCiB7CiAgICAgQklHTlVNICpibjsKLSAgICBpZiAoISpwdmFsKQotICAgICAgICBibl9uZXcocHZhbCwgaXQpOworCisgICAgaWYgKCpwdmFsID09IE5VTEwgJiYgIWJuX25ldyhwdmFsLCBpdCkpCisgICAgICAgIHJldHVybiAwOwogICAgIGJuID0gKEJJR05VTSAqKSpwdmFsOwogICAgIGlmICghQk5fYmluMmJuKGNvbnQsIGxlbiwgYm4pKSB7CiAgICAgICAgIGJuX2ZyZWUocHZhbCwgaXQpOwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vYXNuMS94X3B1YmtleS5jIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vYXNuMS94X3B1YmtleS5jCmluZGV4IDYxZTJkNDQuLjk2NWUwMmMgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2FzbjEveF9wdWJrZXkuYworKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9hc24xL3hfcHVia2V5LmMKQEAgLTE5MSwxMyArMTkxLDE2IEBACiB7CiAgICAgWDUwOV9QVUJLRVkgKnhwazsKICAgICBFVlBfUEtFWSAqcGt0bXA7Ci0gICAgeHBrID0gZDJpX1g1MDlfUFVCS0VZKE5VTEwsIHBwLCBsZW5ndGgpOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnE7CisgICAgcSA9ICpwcDsKKyAgICB4cGsgPSBkMmlfWDUwOV9QVUJLRVkoTlVMTCwgJnEsIGxlbmd0aCk7CiAgICAgaWYgKCF4cGspCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIHBrdG1wID0gWDUwOV9QVUJLRVlfZ2V0KHhwayk7CiAgICAgWDUwOV9QVUJLRVlfZnJlZSh4cGspOwogICAgIGlmICghcGt0bXApCiAgICAgICAgIHJldHVybiBOVUxMOworICAgICpwcCA9IHE7CiAgICAgaWYgKGEpIHsKICAgICAgICAgRVZQX1BLRVlfZnJlZSgqYSk7CiAgICAgICAgICphID0gcGt0bXA7CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9hc24xL3hfeDUwOS5jIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vYXNuMS94X3g1MDkuYwppbmRleCAzODU4MzMzLi41YmM4OWJkIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9hc24xL3hfeDUwOS5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2FzbjEveF94NTA5LmMKQEAgLTE4MywxNiArMTgzLDE1IEBACiAgICAgaWYgKCFhIHx8ICphID09IE5VTEwpIHsKICAgICAgICAgZnJlZXJldCA9IDE7CiAgICAgfQotICAgIHJldCA9IGQyaV9YNTA5KGEsIHBwLCBsZW5ndGgpOworICAgIHJldCA9IGQyaV9YNTA5KGEsICZxLCBsZW5ndGgpOwogICAgIC8qIElmIGNlcnRpZmljYXRlIHVucmVhZGFibGUgdGhlbiBmb3JnZXQgaXQgKi8KICAgICBpZiAoIXJldCkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgLyogdXBkYXRlIGxlbmd0aCAqLwotICAgIGxlbmd0aCAtPSAqcHAgLSBxOwotICAgIGlmICghbGVuZ3RoKQotICAgICAgICByZXR1cm4gcmV0OwotICAgIGlmICghZDJpX1g1MDlfQ0VSVF9BVVgoJnJldC0+YXV4LCBwcCwgbGVuZ3RoKSkKKyAgICBsZW5ndGggLT0gcSAtICpwcDsKKyAgICBpZiAobGVuZ3RoID4gMCAmJiAhZDJpX1g1MDlfQ0VSVF9BVVgoJnJldC0+YXV4LCAmcSwgbGVuZ3RoKSkKICAgICAgICAgZ290byBlcnI7CisgICAgKnBwID0gcTsKICAgICByZXR1cm4gcmV0OwogIGVycjoKICAgICBpZiAoZnJlZXJldCkgewpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vYmlvL2JfZHVtcC5jIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vYmlvL2JfZHVtcC5jCmluZGV4IGY0M2U2YTUuLjM4NDY2NTQgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2Jpby9iX2R1bXAuYworKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9iaW8vYl9kdW1wLmMKQEAgLTEwNyw3ICsxMDcsNiBAQAogICAgIGlmICgocm93cyAqIGR1bXBfd2lkdGgpIDwgbGVuKQogICAgICAgICByb3dzKys7CiAgICAgZm9yIChpID0gMDsgaSA8IHJvd3M7IGkrKykgewotICAgICAgICBidWZbMF0gPSAnXDAnOyAgICAgICAgICAvKiBzdGFydCB3aXRoIGVtcHR5IHN0cmluZyAqLwogICAgICAgICBCVUZfc3RybGNweShidWYsIHN0ciwgc2l6ZW9mIGJ1Zik7CiAgICAgICAgIEJJT19zbnByaW50Zih0bXAsIHNpemVvZiB0bXAsICIlMDR4IC0gIiwgaSAqIGR1bXBfd2lkdGgpOwogICAgICAgICBCVUZfc3RybGNhdChidWYsIHRtcCwgc2l6ZW9mIGJ1Zik7CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9iaW8vYmlvLmggYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9iaW8vYmlvLmgKaW5kZXggMTk1YjVjYy4uODE0Y2JlOCAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vYmlvL2Jpby5oCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2Jpby9iaW8uaApAQCAtNDgxLDExICs0ODEsMTEgQEAKICMgZGVmaW5lIEJJT19nZXRfY29ubl9ob3N0bmFtZShiKSAgQklPX3B0cl9jdHJsKGIsQklPX0NfR0VUX0NPTk5FQ1QsMCkKICMgZGVmaW5lIEJJT19nZXRfY29ubl9wb3J0KGIpICAgICAgQklPX3B0cl9jdHJsKGIsQklPX0NfR0VUX0NPTk5FQ1QsMSkKICMgZGVmaW5lIEJJT19nZXRfY29ubl9pcChiKSAgICAgICAgICAgICAgIEJJT19wdHJfY3RybChiLEJJT19DX0dFVF9DT05ORUNULDIpCi0jIGRlZmluZSBCSU9fZ2V0X2Nvbm5faW50X3BvcnQoYikgQklPX2ludF9jdHJsKGIsQklPX0NfR0VUX0NPTk5FQ1QsMywwKQorIyBkZWZpbmUgQklPX2dldF9jb25uX2ludF9wb3J0KGIpIEJJT19jdHJsKGIsQklPX0NfR0VUX0NPTk5FQ1QsMywwLE5VTEwpCiAKICMgZGVmaW5lIEJJT19zZXRfbmJpbyhiLG4pICAgICAgIEJJT19jdHJsKGIsQklPX0NfU0VUX05CSU8sKG4pLE5VTEwpCiAKLS8qIEJJT19zX2FjY2VwdF9zb2NrZXQoKSAqLworLyogQklPX3NfYWNjZXB0KCkgKi8KICMgZGVmaW5lIEJJT19zZXRfYWNjZXB0X3BvcnQoYixuYW1lKSBCSU9fY3RybChiLEJJT19DX1NFVF9BQ0NFUFQsMCwoY2hhciAqKW5hbWUpCiAjIGRlZmluZSBCSU9fZ2V0X2FjY2VwdF9wb3J0KGIpICBCSU9fcHRyX2N0cmwoYixCSU9fQ19HRVRfQUNDRVBULDApCiAvKiAjZGVmaW5lIEJJT19zZXRfbmJpbyhiLG4pICAgIEJJT19jdHJsKGIsQklPX0NfU0VUX05CSU8sKG4pLE5VTEwpICovCkBAIC00OTgsNiArNDk4LDcgQEAKICMgZGVmaW5lIEJJT19zZXRfYmluZF9tb2RlKGIsbW9kZSkgQklPX2N0cmwoYixCSU9fQ19TRVRfQklORF9NT0RFLG1vZGUsTlVMTCkKICMgZGVmaW5lIEJJT19nZXRfYmluZF9tb2RlKGIsbW9kZSkgQklPX2N0cmwoYixCSU9fQ19HRVRfQklORF9NT0RFLDAsTlVMTCkKIAorLyogQklPX3NfYWNjZXB0KCkgYW5kIEJJT19zX2Nvbm5lY3QoKSAqLwogIyBkZWZpbmUgQklPX2RvX2Nvbm5lY3QoYikgICAgICAgQklPX2RvX2hhbmRzaGFrZShiKQogIyBkZWZpbmUgQklPX2RvX2FjY2VwdChiKSAgICAgICAgQklPX2RvX2hhbmRzaGFrZShiKQogIyBkZWZpbmUgQklPX2RvX2hhbmRzaGFrZShiKSAgICAgQklPX2N0cmwoYixCSU9fQ19ET19TVEFURV9NQUNISU5FLDAsTlVMTCkKQEAgLTUxNywxMiArNTE4LDE1IEBACiAjIGRlZmluZSBCSU9fZ2V0X3VybChiLHVybCkgICAgICBCSU9fY3RybChiLEJJT19DX0dFVF9QUk9YWV9QQVJBTSwyLChjaGFyICopKHVybCkpCiAjIGRlZmluZSBCSU9fZ2V0X25vX2Nvbm5lY3RfcmV0dXJuKGIpICAgIEJJT19jdHJsKGIsQklPX0NfR0VUX1BST1hZX1BBUkFNLDUsTlVMTCkKIAorLyogQklPX3NfZGF0YWdyYW0oKSwgQklPX3NfZmQoKSwgQklPX3Nfc29ja2V0KCksIEJJT19zX2FjY2VwdCgpIGFuZCBCSU9fc19jb25uZWN0KCkgKi8KICMgZGVmaW5lIEJJT19zZXRfZmQoYixmZCxjKSAgICAgIEJJT19pbnRfY3RybChiLEJJT19DX1NFVF9GRCxjLGZkKQogIyBkZWZpbmUgQklPX2dldF9mZChiLGMpICAgICAgICAgQklPX2N0cmwoYixCSU9fQ19HRVRfRkQsMCwoY2hhciAqKWMpCiAKKy8qIEJJT19zX2ZpbGUoKSAqLwogIyBkZWZpbmUgQklPX3NldF9mcChiLGZwLGMpICAgICAgQklPX2N0cmwoYixCSU9fQ19TRVRfRklMRV9QVFIsYywoY2hhciAqKWZwKQogIyBkZWZpbmUgQklPX2dldF9mcChiLGZwcCkgICAgICAgQklPX2N0cmwoYixCSU9fQ19HRVRfRklMRV9QVFIsMCwoY2hhciAqKWZwcCkKIAorLyogQklPX3NfZmQoKSBhbmQgQklPX3NfZmlsZSgpICovCiAjIGRlZmluZSBCSU9fc2VlayhiLG9mcykgKGludClCSU9fY3RybChiLEJJT19DX0ZJTEVfU0VFSyxvZnMsTlVMTCkKICMgZGVmaW5lIEJJT190ZWxsKGIpICAgICAoaW50KUJJT19jdHJsKGIsQklPX0NfRklMRV9URUxMLDAsTlVMTCkKIApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vYmlvL2Jzc19iaW8uYyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2Jpby9ic3NfYmlvLmMKaW5kZXggYmE4OGFmYi4uYzA0ZDdjYSAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vYmlvL2Jzc19iaW8uYworKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9iaW8vYnNzX2Jpby5jCkBAIC0xLDQgKzEsNCBAQAotLyogY3J5cHRvL2Jpby9ic3NfYmlvLmMgIC0qLSBNb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJlYXkiIC0qLSAqLworLyogY3J5cHRvL2Jpby9ic3NfYmlvLmMgICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDMgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vYmlvL2Jzc19jb25uLmMgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9iaW8vYnNzX2Nvbm4uYwppbmRleCA2YTVlOGRlLi5lZDIxNGNhIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9iaW8vYnNzX2Nvbm4uYworKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9iaW8vYnNzX2Nvbm4uYwpAQCAtNDE5LDcgKzQxOSw3IEBACiB7CiAgICAgQklPICpkYmlvOwogICAgIGludCAqaXA7Ci0gICAgY29uc3QgY2hhciAqKnBwdHI7CisgICAgY29uc3QgY2hhciAqKnBwdHIgPSBOVUxMOwogICAgIGxvbmcgcmV0ID0gMTsKICAgICBCSU9fQ09OTkVDVCAqZGF0YTsKIApAQCAtNDQyLDE5ICs0NDIsMjggQEAKICAgICBjYXNlIEJJT19DX0dFVF9DT05ORUNUOgogICAgICAgICBpZiAocHRyICE9IE5VTEwpIHsKICAgICAgICAgICAgIHBwdHIgPSAoY29uc3QgY2hhciAqKilwdHI7Ci0gICAgICAgICAgICBpZiAobnVtID09IDApIHsKLSAgICAgICAgICAgICAgICAqcHB0ciA9IGRhdGEtPnBhcmFtX2hvc3RuYW1lOworICAgICAgICB9CiAKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtID09IDEpIHsKLSAgICAgICAgICAgICAgICAqcHB0ciA9IGRhdGEtPnBhcmFtX3BvcnQ7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG51bSA9PSAyKSB7Ci0gICAgICAgICAgICAgICAgKnBwdHIgPSAoY2hhciAqKSYoZGF0YS0+aXBbMF0pOwotICAgICAgICAgICAgfSBlbHNlIGlmIChudW0gPT0gMykgewotICAgICAgICAgICAgICAgICooKGludCAqKXB0cikgPSBkYXRhLT5wb3J0OworICAgICAgICBpZiAoYi0+aW5pdCkgeworICAgICAgICAgICAgaWYgKHBwdHIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldCA9IDE7CisgICAgICAgICAgICAgICAgaWYgKG51bSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICpwcHRyID0gZGF0YS0+cGFyYW1faG9zdG5hbWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudW0gPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAqcHB0ciA9IGRhdGEtPnBhcmFtX3BvcnQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudW0gPT0gMikgeworICAgICAgICAgICAgICAgICAgICAqcHB0ciA9IChjaGFyICopJihkYXRhLT5pcFswXSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKCFiLT5pbml0KSB8fCAocHRyID09IE5VTEwpKQorICAgICAgICAgICAgaWYgKG51bSA9PSAzKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gZGF0YS0+cG9ydDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChwcHRyICE9IE5VTEwpCiAgICAgICAgICAgICAgICAgKnBwdHIgPSAibm90IGluaXRpYWxpemVkIjsKLSAgICAgICAgICAgIHJldCA9IDE7CisgICAgICAgICAgICByZXQgPSAwOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQklPX0NfU0VUX0NPTk5FQ1Q6CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9iaW8vYnNzX2RncmFtLmMgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9iaW8vYnNzX2RncmFtLmMKaW5kZXggZTNlM2RkMC4uZDEyYjgzYSAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vYmlvL2Jzc19kZ3JhbS5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2Jpby9ic3NfZGdyYW0uYwpAQCAtNTE1LDEwICs1MTUsOCBAQAogICAgIHN3aXRjaCAoY21kKSB7CiAgICAgY2FzZSBCSU9fQ1RSTF9SRVNFVDoKICAgICAgICAgbnVtID0gMDsKLSAgICBjYXNlIEJJT19DX0ZJTEVfU0VFSzoKICAgICAgICAgcmV0ID0gMDsKICAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCSU9fQ19GSUxFX1RFTEw6CiAgICAgY2FzZSBCSU9fQ1RSTF9JTkZPOgogICAgICAgICByZXQgPSAwOwogICAgICAgICBicmVhazsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2Jpby9ic3NfZmlsZS5jIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vYmlvL2Jzc19maWxlLmMKaW5kZXggNTZhYmNiMS4uYTgxNWQ4ZSAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vYmlvL2Jzc19maWxlLmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vYmlvL2Jzc19maWxlLmMKQEAgLTExOCwzMyArMTE4LDkgQEAKICAgICBOVUxMLAogfTsKIAotQklPICpCSU9fbmV3X2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKm1vZGUpCisjICBpZiAhZGVmaW5lZChPUEVOU1NMX1NZU19TVEFSQk9BUkQpCitzdGF0aWMgRklMRSAqZmlsZV9mb3Blbihjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqbW9kZSkKIHsKLSAgICBCSU8gKnJldCA9IE5VTEw7Ci0jICBpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX1NUQVJCT0FSRCkKLSAgICBTYkZpbGUgc2JfZmlsZSA9IGtTYkZpbGVJbnZhbGlkOwotICAgIFNiRmlsZUVycm9yIGVycm9yID0ga1NiRmlsZU9rOwotICAgIHNiX2ZpbGUgPSBTYkZpbGVPcGVuKGZpbGVuYW1lLCBTYkZpbGVNb2RlU3RyaW5nVG9GbGFncyhtb2RlKSwgTlVMTCwgJmVycm9yKTsKLSAgICBpZiAoIVNiRmlsZUlzVmFsaWQoc2JfZmlsZSkpIHsKLSAgICAgICAgU1lTZXJyKFNZU19GX0ZPUEVOLCBlcnJvcik7Ci0gICAgICAgIEVSUl9hZGRfZXJyb3JfZGF0YSg1LCAiU2JGaWxlT3BlbignIiwgZmlsZW5hbWUsICInLCciLCBtb2RlLCAiJykiKTsKLSAgICAgICAgaWYgKGVycm9yID09IGtTYkZpbGVFcnJvck5vdEZvdW5kKSB7Ci0gICAgICAgICAgICBCSU9lcnIoQklPX0ZfQklPX05FV19GSUxFLCBCSU9fUl9OT19TVUNIX0ZJTEUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQklPZXJyKEJJT19GX0JJT19ORVdfRklMRSwgRVJSX1JfU1lTX0xJQik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gKE5VTEwpOwotICAgIH0KLSAgICByZXQgPSBCSU9fbmV3KEJJT19zX2ZpbGUoKSk7Ci0gICAgaWYgKHJldCA9PSBOVUxMKSB7Ci0gICAgICAgIFNiRmlsZUNsb3NlKHNiX2ZpbGUpOwotICAgICAgICByZXR1cm4gKE5VTEwpOwotICAgIH0KLQotICAgIEJJT19jbGVhcl9mbGFncyhyZXQsIEJJT19GTEFHU19VUExJTkspOwotICAgIEJJT19zZXRfZnAocmV0LCBzYl9maWxlLCBCSU9fQ0xPU0UpOwotIyAgZWxzZSAgLy8gZGVmaW5lZChPUEVOU1NMX1NZU19TVEFSQk9BUkQpCiAgICAgRklMRSAqZmlsZSA9IE5VTEw7CiAKICMgICBpZiBkZWZpbmVkKF9XSU4zMikgJiYgZGVmaW5lZChDUF9VVEY4KQpAQCAtMTkxLDYgKzE2Nyw0MCBAQAogIyAgIGVsc2UKICAgICBmaWxlID0gZm9wZW4oZmlsZW5hbWUsIG1vZGUpOwogIyAgIGVuZGlmCisgICAgcmV0dXJuIChmaWxlKTsKK30KKworI2VuZGlmICAvLyBkZWZpbmVkKE9QRU5TU0xfU1lTX1NUQVJCT0FSRCkKKworQklPICpCSU9fbmV3X2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKm1vZGUpCit7CisgICAgQklPICpyZXQgPSBOVUxMOworIyAgaWYgZGVmaW5lZChPUEVOU1NMX1NZU19TVEFSQk9BUkQpCisgICAgU2JGaWxlIHNiX2ZpbGUgPSBrU2JGaWxlSW52YWxpZDsKKyAgICBTYkZpbGVFcnJvciBlcnJvciA9IGtTYkZpbGVPazsKKyAgICBzYl9maWxlID0gU2JGaWxlT3BlbihmaWxlbmFtZSwgU2JGaWxlTW9kZVN0cmluZ1RvRmxhZ3MobW9kZSksIE5VTEwsICZlcnJvcik7CisgICAgaWYgKCFTYkZpbGVJc1ZhbGlkKHNiX2ZpbGUpKSB7CisgICAgICAgIFNZU2VycihTWVNfRl9GT1BFTiwgZXJyb3IpOworICAgICAgICBFUlJfYWRkX2Vycm9yX2RhdGEoNSwgIlNiRmlsZU9wZW4oJyIsIGZpbGVuYW1lLCAiJywnIiwgbW9kZSwgIicpIik7CisgICAgICAgIGlmIChlcnJvciA9PSBrU2JGaWxlRXJyb3JOb3RGb3VuZCkgeworICAgICAgICAgICAgQklPZXJyKEJJT19GX0JJT19ORVdfRklMRSwgQklPX1JfTk9fU1VDSF9GSUxFKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEJJT2VycihCSU9fRl9CSU9fTkVXX0ZJTEUsIEVSUl9SX1NZU19MSUIpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIChOVUxMKTsKKyAgICB9CisgICAgcmV0ID0gQklPX25ldyhCSU9fc19maWxlKCkpOworICAgIGlmIChyZXQgPT0gTlVMTCkgeworICAgICAgICBTYkZpbGVDbG9zZShzYl9maWxlKTsKKyAgICAgICAgcmV0dXJuIChOVUxMKTsKKyAgICB9CisKKyAgICBCSU9fY2xlYXJfZmxhZ3MocmV0LCBCSU9fRkxBR1NfVVBMSU5LKTsKKyAgICBCSU9fc2V0X2ZwKHJldCwgc2JfZmlsZSwgQklPX0NMT1NFKTsKKyMgIGVsc2UgIC8vIGRlZmluZWQoT1BFTlNTTF9TWVNfU1RBUkJPQVJEKQorICAgIEZJTEUgKmZpbGUgPSBmaWxlX2ZvcGVuKGZpbGVuYW1lLCBtb2RlKTsKKwogICAgIGlmIChmaWxlID09IE5VTEwpIHsKICAgICAgICAgU1lTZXJyKFNZU19GX0ZPUEVOLCBnZXRfbGFzdF9zeXNfZXJyb3IoKSk7CiAgICAgICAgIEVSUl9hZGRfZXJyb3JfZGF0YSg1LCAiZm9wZW4oJyIsIGZpbGVuYW1lLCAiJywnIiwgbW9kZSwgIicpIik7CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9ibi9hc20vYXJtdjQtZ2YybS5wbCBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2JuL2FzbS9hcm12NC1nZjJtLnBsCmluZGV4IGM1MmUwYjcuLjIyYWQxZjggMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2JuL2FzbS9hcm12NC1nZjJtLnBsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2JuL2FzbS9hcm12NC1nZjJtLnBsCkBAIC00MSwxMyArNDEsMTMgQEAKIC5hbGlnbgk1CiBtdWxfMXgxX25lb246CiAJdnNobC51NjQJYCZEbG8oInExIilgLGQxNiwjOAlAIHExLXEzIGFyZSBzbGlkZWQgJGEKLQl2bXVsbC5wOAlgJlEoImQwIilgLGQxNixkMTcJQCBht2JiCisJdm11bGwucDgJYCZRKCJkMCIpYCxkMTYsZDE3CUAgYcK3YmIKIAl2c2hsLnU2NAlgJkRsbygicTIiKWAsZDE2LCMxNgotCXZtdWxsLnA4CXExLGAmRGxvKCJxMSIpYCxkMTcJQCBhPDw4t2JiCisJdm11bGwucDgJcTEsYCZEbG8oInExIilgLGQxNwlAIGE8PDjCt2JiCiAJdnNobC51NjQJYCZEbG8oInEzIilgLGQxNiwjMjQKLQl2bXVsbC5wOAlxMixgJkRsbygicTIiKWAsZDE3CUAgYTw8MTa3YmIKKwl2bXVsbC5wOAlxMixgJkRsbygicTIiKWAsZDE3CUAgYTw8MTbCt2JiCiAJdnNoci51NjQJYCZEbG8oInExIilgLCM4Ci0Jdm11bGwucDgJcTMsYCZEbG8oInEzIilgLGQxNwlAIGE8PDI0t2JiCisJdm11bGwucDgJcTMsYCZEbG8oInEzIilgLGQxNwlAIGE8PDI0wrdiYgogCXZzaGwudTY0CWAmRGhpKCJxMSIpYCwjMjQKIAl2ZW9yCQlkMCxgJkRsbygicTEiKWAKIAl2c2hyLnU2NAlgJkRsbygicTIiKWAsIzE2CkBAIC0xNTgsNyArMTU4LDcgQEAKICMjIyMjIyMjIyMjIyMjIyMKICMgdm9pZAlibl9HRjJtX211bF8yeDIoQk5fVUxPTkcgKnIsCiAjCUJOX1VMT05HIGExLEJOX1VMT05HIGEwLAotIwlCTl9VTE9ORyBiMSxCTl9VTE9ORyBiMCk7CSMgclszLi4wXT1hMWEwt2IxYjAKKyMJQk5fVUxPTkcgYjEsQk5fVUxPTkcgYjApOwkjIHJbMy4uMF09YTFhMMK3YjFiMAogCiAoJEExLCRCMSwkQTAsJEIwLCRBMUIxLCRBMEIwKT1tYXAoImQkXyIsKDE4Li4yMykpOwogCkBAIC0xODQsMjAgKzE4NCwyMCBAQAogCiAJdm1vdglkMTYsJEExCiAJdm1vdglkMTcsJEIxCi0JYmwJbXVsXzF4MV9uZW9uCQlAIGExt2IxCisJYmwJbXVsXzF4MV9uZW9uCQlAIGExwrdiMQogCXZtb3YJJEExQjEsZDAKIAogCXZtb3YJZDE2LCRBMAogCXZtb3YJZDE3LCRCMAotCWJsCW11bF8xeDFfbmVvbgkJQCBhMLdiMAorCWJsCW11bF8xeDFfbmVvbgkJQCBhMMK3YjAKIAl2bW92CSRBMEIwLGQwCiAKIAl2ZW9yCWQxNiwkQTAsJEExCiAJdmVvcglkMTcsJEIwLCRCMQogCXZlb3IJJEEwLCRBMEIwLCRBMUIxCi0JYmwJbXVsXzF4MV9uZW9uCQlAIChhMCthMSm3KGIwK2IxKQorCWJsCW11bF8xeDFfbmVvbgkJQCAoYTArYTEpwrcoYjArYjEpCiAKLQl2ZW9yCWQwLCRBMAkJCUAgKGEwK2ExKbcoYjArYjEpLWEwt2IwLWExt2IxCisJdmVvcglkMCwkQTAJCQlAIChhMCthMSnCtyhiMCtiMSktYTDCt2IwLWExwrdiMQogCXZzaGwudTY0IGQxLGQwLCMzMgogCXZzaHIudTY0IGQwLGQwLCMzMgogCXZlb3IJJEEwQjAsZDEKQEAgLTIyMCw3ICsyMjAsNyBAQAogCW1vdgkkbWFzaywjNzw8MgogCXN1YglzcCxzcCwjMzIJCUAgYWxsb2NhdGUgdGFiWzhdCiAKLQlibAltdWxfMXgxX2lhbHUJCUAgYTG3YjEKKwlibAltdWxfMXgxX2lhbHUJCUAgYTHCt2IxCiAJc3RyCSRsbyxbJHJldCwjOF0KIAlzdHIJJGhpLFskcmV0LCMxMl0KIApAQCAtMjMwLDEzICsyMzAsMTMgQEAKIAkgZW9yCXIyLHIyLCRhCiAJZW9yCSRiLCRiLHIzCiAJIGVvcgkkYSwkYSxyMgotCWJsCW11bF8xeDFfaWFsdQkJQCBhMLdiMAorCWJsCW11bF8xeDFfaWFsdQkJQCBhMMK3YjAKIAlzdHIJJGxvLFskcmV0XQogCXN0cgkkaGksWyRyZXQsIzRdCiAKIAllb3IJJGEsJGEscjIKIAllb3IJJGIsJGIscjMKLQlibAltdWxfMXgxX2lhbHUJCUAgKGExK2EwKbcoYjErYjApCisJYmwJbXVsXzF4MV9pYWx1CQlAIChhMSthMCnCtyhiMStiMCkKIF9fXwogQHI9bWFwKCJyJF8iLCg2Li45KSk7CiAkY29kZS49PDxfX187CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9ibi9hc20vaWE2NC5TIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vYm4vYXNtL2lhNjQuUwppbmRleCA5NTFhYmM1Li5hOWE0MmFiIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9ibi9hc20vaWE2NC5TCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2JuL2FzbS9pYTY0LlMKQEAgLTQyMiw3ICs0MjIsNyBAQAogCiAvLyBUaGlzIGxvb3Agc3BpbnMgaW4gMyoobisxMCkgdGlja3Mgb24gSXRhbml1bSBhbmQgaW4gMioobisxMCkgb24KIC8vIEl0YW5pdW0gMi4gWWVzLCB1bmxpa2UgcHJldmlvdXMgdmVyc2lvbnMgaXQgc2NhbGVzOi0pIFByZXZpb3VzCi0vLyB2ZXJzaW9uIHdhcyBwZWZvcm1pbmcgKmFsbCogYWRkaXRpb25zIGluIElBTFUgYW5kIHdhcyBzdGFydmluZworLy8gdmVyc2lvbiB3YXMgcGVyZm9ybWluZyAqYWxsKiBhZGRpdGlvbnMgaW4gSUFMVSBhbmQgd2FzIHN0YXJ2aW5nCiAvLyBmb3IgdGhvc2UgZXZlbiBvbiBJdGFuaXVtIDIuIEluIHRoaXMgdmVyc2lvbiBvbmUgYWRkaXRpb24gaXMKIC8vIG1vdmVkIHRvIEZQVSBhbmQgaXMgZm9sZGVkIHdpdGggbXVsdGlwbGljYXRpb24uIFRoaXMgaXMgYXQgY29zdAogLy8gb2YgcHJvcG9nYXRpbmcgdGhlIHJlc3VsdCBmcm9tIHByZXZpb3VzIGNhbGwgdG8gdGhpcyBzdWJyb3V0aW5lCkBAIC01NjgsNyArNTY4LDcgQEAKIC8vIEkndmUgZXN0aW1hdGVkIHRoaXMgcm91dGluZSB0byBydW4gaW4gfjEyMCB0aWNrcywgYnV0IGluIHJlYWxpdHkKIC8vIChpLmUuIGFjY29yZGluZyB0byBhci5pdGMpIGl0IHRha2VzIH4xNjAgdGlja3MuIEFyZSB0aG9zZSBleHRyYQogLy8gY3ljbGVzIGNvbnN1bWVkIGZvciBpbnN0cnVjdGlvbnMgZmV0Y2g/IE9yIGRpZCBJIG1pc2ludGVycHJldCBzb21lCi0vLyBjbGF1c2UgaW4gSXRhbml1bSC1LWFyY2hpdGVjdHVyZSBtYW51YWw/IENvbW1lbnRzIGFyZSB3ZWxjb21lZCBhbmQKKy8vIGNsYXVzZSBpbiBJdGFuaXVtIMK1LWFyY2hpdGVjdHVyZSBtYW51YWw/IENvbW1lbnRzIGFyZSB3ZWxjb21lZCBhbmQKIC8vIGhpZ2hseSBhcHByZWNpYXRlZC4KIC8vCiAvLyBPbiBJdGFuaXVtIDIgaXQgdGFrZXMgfjE5MCB0aWNrcy4gVGhpcyBpcyBiZWNhdXNlIG9mIHN0YWxscyBvbgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vYm4vYXNtL3MzOTB4LWdmMm0ucGwgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9ibi9hc20vczM5MHgtZ2YybS5wbAppbmRleCBjZDlmMTNlLi45ZDE4ZDQwIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9ibi9hc20vczM5MHgtZ2YybS5wbAorKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9ibi9hc20vczM5MHgtZ2YybS5wbApAQCAtMTcyLDE5ICsxNzIsMTkgQEAKIGlmICgkU0laRV9UPT04KSB7CiBteSBAcj1tYXAoIiVyJF8iLCg2Li45KSk7CiAkY29kZS49PDxfX187Ci0JYnJhcwkkcmEsX211bF8xeDEJCQkjIGExt2IxCisJYnJhcwkkcmEsX211bF8xeDEJCQkjIGExwrdiMQogCXN0bWcJJGxvLCRoaSwxNigkcnApCiAKIAlsZwkkYSxgJHN0ZGZyYW1lKzEyOCs0KiRTSVpFX1RgKCRzcCkKIAlsZwkkYixgJHN0ZGZyYW1lKzEyOCs2KiRTSVpFX1RgKCRzcCkKLQlicmFzCSRyYSxfbXVsXzF4MQkJCSMgYTC3YjAKKwlicmFzCSRyYSxfbXVsXzF4MQkJCSMgYTDCt2IwCiAJc3RtZwkkbG8sJGhpLDAoJHJwKQogCiAJbGcJJGEsYCRzdGRmcmFtZSsxMjgrMyokU0laRV9UYCgkc3ApCiAJbGcJJGIsYCRzdGRmcmFtZSsxMjgrNSokU0laRV9UYCgkc3ApCiAJeGcJJGEsYCRzdGRmcmFtZSsxMjgrNCokU0laRV9UYCgkc3ApCiAJeGcJJGIsYCRzdGRmcmFtZSsxMjgrNiokU0laRV9UYCgkc3ApCi0JYnJhcwkkcmEsX211bF8xeDEJCQkjIChhMCthMSm3KGIwK2IxKQorCWJyYXMJJHJhLF9tdWxfMXgxCQkJIyAoYTArYTEpwrcoYjArYjEpCiAJbG1nCUByWzBdLEByWzNdLDAoJHJwKQogCiAJeGdyCSRsbywkaGkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2JuL2FzbS94ODYtZ2YybS5wbCBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2JuL2FzbS94ODYtZ2YybS5wbAppbmRleCA4MDhhMWU1Li5iNTc5NTMwIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9ibi9hc20veDg2LWdmMm0ucGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vYm4vYXNtL3g4Ni1nZjJtLnBsCkBAIC0xNCw3ICsxNCw3IEBACiAjIHRoZSB0aW1lIGJlaW5nLi4uIEV4Y2VwdCB0aGF0IGl0IGhhcyB0aHJlZSBjb2RlIHBhdGhzOiBwdXJlIGludGVnZXIKICMgY29kZSBzdWl0YWJsZSBmb3IgYW55IHg4NiBDUFUsIE1NWCBjb2RlIHN1aXRhYmxlIGZvciBQSUlJIGFuZCBsYXRlcgogIyBhbmQgUENMTVVMUURRIHN1aXRhYmxlIGZvciBXZXN0bWVyZSBhbmQgbGF0ZXIuIEltcHJvdmVtZW50IHZhcmllcwotIyBmcm9tIG9uZSBiZW5jaG1hcmsgYW5kILUtYXJjaCB0byBhbm90aGVyLiBCZWxvdyBhcmUgaW50ZXJ2YWwgdmFsdWVzCisjIGZyb20gb25lIGJlbmNobWFyayBhbmQgwrUtYXJjaCB0byBhbm90aGVyLiBCZWxvdyBhcmUgaW50ZXJ2YWwgdmFsdWVzCiAjIGZvciAxNjMtIGFuZCA1NzEtYml0IEVDREggYmVuY2htYXJrcyByZWxhdGl2ZSB0byBjb21waWxlci1nZW5lcmF0ZWQKICMgY29kZToKICMKQEAgLTIyNiwyMiArMjI2LDIyIEBACiAJJnB1c2gJKCJlZGkiKTsKIAkmbW92CSgkYSwmd3BhcmFtKDEpKTsKIAkmbW92CSgkYiwmd3BhcmFtKDMpKTsKLQkmY2FsbAkoIl9tdWxfMXgxX21teCIpOwkjIGExt2IxCisJJmNhbGwJKCJfbXVsXzF4MV9tbXgiKTsJIyBhMcK3YjEKIAkmbW92cQkoIm1tNyIsJFIpOwogCiAJJm1vdgkoJGEsJndwYXJhbSgyKSk7CiAJJm1vdgkoJGIsJndwYXJhbSg0KSk7Ci0JJmNhbGwJKCJfbXVsXzF4MV9tbXgiKTsJIyBhMLdiMAorCSZjYWxsCSgiX211bF8xeDFfbW14Iik7CSMgYTDCt2IwCiAJJm1vdnEJKCJtbTYiLCRSKTsKIAogCSZtb3YJKCRhLCZ3cGFyYW0oMSkpOwogCSZtb3YJKCRiLCZ3cGFyYW0oMykpOwogCSZ4b3IJKCRhLCZ3cGFyYW0oMikpOwogCSZ4b3IJKCRiLCZ3cGFyYW0oNCkpOwotCSZjYWxsCSgiX211bF8xeDFfbW14Iik7CSMgKGEwK2ExKbcoYjArYjEpCisJJmNhbGwJKCJfbXVsXzF4MV9tbXgiKTsJIyAoYTArYTEpwrcoYjArYjEpCiAJJnB4b3IJKCRSLCJtbTciKTsKIAkmbW92CSgkYSwmd3BhcmFtKDApKTsKLQkmcHhvcgkoJFIsIm1tNiIpOwkJIyAoYTArYTEptyhiMCtiMSktYTG3YjEtYTC3YjAKKwkmcHhvcgkoJFIsIm1tNiIpOwkJIyAoYTArYTEpwrcoYjArYjEpLWExwrdiMS1hMMK3YjAKIAogCSZtb3ZxCSgkQSwkUik7CiAJJnBzbGxxCSgkUiwzMik7CkBAIC0yNjYsMTMgKzI2NiwxMyBAQAogCiAJJm1vdgkoJGEsJndwYXJhbSgxKSk7CiAJJm1vdgkoJGIsJndwYXJhbSgzKSk7Ci0JJmNhbGwJKCJfbXVsXzF4MV9pYWx1Iik7CSMgYTG3YjEKKwkmY2FsbAkoIl9tdWxfMXgxX2lhbHUiKTsJIyBhMcK3YjEKIAkmbW92CSgmRFdQKDgsImVzcCIpLCRsbyk7CiAJJm1vdgkoJkRXUCgxMiwiZXNwIiksJGhpKTsKIAogCSZtb3YJKCRhLCZ3cGFyYW0oMikpOwogCSZtb3YJKCRiLCZ3cGFyYW0oNCkpOwotCSZjYWxsCSgiX211bF8xeDFfaWFsdSIpOwkjIGEwt2IwCisJJmNhbGwJKCJfbXVsXzF4MV9pYWx1Iik7CSMgYTDCt2IwCiAJJm1vdgkoJkRXUCgwLCJlc3AiKSwkbG8pOwogCSZtb3YJKCZEV1AoNCwiZXNwIiksJGhpKTsKIApAQCAtMjgwLDcgKzI4MCw3IEBACiAJJm1vdgkoJGIsJndwYXJhbSgzKSk7CiAJJnhvcgkoJGEsJndwYXJhbSgyKSk7CiAJJnhvcgkoJGIsJndwYXJhbSg0KSk7Ci0JJmNhbGwJKCJfbXVsXzF4MV9pYWx1Iik7CSMgKGEwK2ExKbcoYjArYjEpCisJJmNhbGwJKCJfbXVsXzF4MV9pYWx1Iik7CSMgKGEwK2ExKcK3KGIwK2IxKQogCiAJJm1vdgkoImVicCIsJndwYXJhbSgwKSk7CiAJCSBAcj0oImVieCIsImVjeCIsImVkaSIsImVzaSIpOwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vYm4vYXNtL3g4Nl82NC1nY2MuYyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2JuL2FzbS94ODZfNjQtZ2NjLmMKaW5kZXggOWM1MDc0Yi4uMGE1YmIyOCAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vYm4vYXNtL3g4Nl82NC1nY2MuYworKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9ibi9hc20veDg2XzY0LWdjYy5jCkBAIC02Niw3ICs2Niw3IEBACiAjIHVuZGVmIHNxcgogCiAvKi0KLSAqICJtIihhKSwgIittIihyKSAgICAgIGlzIHRoZSB3YXkgdG8gZmF2b3IgRGlyZWN0UGF0aCC1LWNvZGU7CisgKiAibSIoYSksICIrbSIocikgICAgICBpcyB0aGUgd2F5IHRvIGZhdm9yIERpcmVjdFBhdGggwrUtY29kZTsKICAqICJnIigwKSAgICAgICAgICAgICAgIGxldCB0aGUgY29tcGlsZXIgdG8gZGVjaWRlIHdoZXJlIGRvZXMgaXQKICAqICAgICAgICAgICAgICAgICAgICAgIHdhbnQgdG8ga2VlcCB0aGUgdmFsdWUgb2YgemVybzsKICAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vYm4vYXNtL3g4Nl82NC1nZjJtLnBsIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vYm4vYXNtL3g4Nl82NC1nZjJtLnBsCmluZGV4IDIyNmM2NmMuLjQyYmJlYzIgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2JuL2FzbS94ODZfNjQtZ2YybS5wbAorKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9ibi9hc20veDg2XzY0LWdmMm0ucGwKQEAgLTEzLDcgKzEzLDcgQEAKICMgaW4gYm5fZ2YybS5jLiBJdCdzIGtpbmQgb2YgbG93LWhhbmdpbmcgbWVjaGFuaWNhbCBwb3J0IGZyb20gQyBmb3IKICMgdGhlIHRpbWUgYmVpbmcuLi4gRXhjZXB0IHRoYXQgaXQgaGFzIHR3byBjb2RlIHBhdGhzOiBjb2RlIHN1aXRhYmxlCiAjIGZvciBhbnkgeDg2XzY0IENQVSBhbmQgUENMTVVMUURRIG9uZSBzdWl0YWJsZSBmb3IgV2VzdG1lcmUgYW5kCi0jIGxhdGVyLiBJbXByb3ZlbWVudCB2YXJpZXMgZnJvbSBvbmUgYmVuY2htYXJrIGFuZCC1LWFyY2ggdG8gYW5vdGhlci4KKyMgbGF0ZXIuIEltcHJvdmVtZW50IHZhcmllcyBmcm9tIG9uZSBiZW5jaG1hcmsgYW5kIMK1LWFyY2ggdG8gYW5vdGhlci4KICMgVmFuaWxsYSBjb2RlIHBhdGggaXMgYXQgbW9zdCAyMCUgZmFzdGVyIHRoYW4gY29tcGlsZXItZ2VuZXJhdGVkIGNvZGUKICMgW25vdCB2ZXJ5IGltcHJlc3NpdmVdLCB3aGlsZSBQQ0xNVUxRRFEgLSB3aG9sZSA4NSUtMTYwJSBiZXR0ZXIgb24KICMgMTYzLSBhbmQgNTcxLWJpdCBFQ0RIIGJlbmNobWFya3Mgb24gSW50ZWwgQ1BVcy4gS2VlcCBpbiBtaW5kIHRoYXQKQEAgLTE4NCwxMyArMTg0LDEzIEBACiAkY29kZS49PDxfX187CiAJbW92ZHFhCQkleG1tMCwleG1tNAogCW1vdmRxYQkJJXhtbTEsJXhtbTUKLQlwY2xtdWxxZHEJXCQwLCV4bW0xLCV4bW0wCSMgYTG3YjEKKwlwY2xtdWxxZHEJXCQwLCV4bW0xLCV4bW0wCSMgYTHCt2IxCiAJcHhvcgkJJXhtbTIsJXhtbTQKIAlweG9yCQkleG1tMywleG1tNQotCXBjbG11bHFkcQlcJDAsJXhtbTMsJXhtbTIJIyBhMLdiMAotCXBjbG11bHFkcQlcJDAsJXhtbTUsJXhtbTQJIyAoYTArYTEptyhiMCtiMSkKKwlwY2xtdWxxZHEJXCQwLCV4bW0zLCV4bW0yCSMgYTDCt2IwCisJcGNsbXVscWRxCVwkMCwleG1tNSwleG1tNAkjIChhMCthMSnCtyhiMCtiMSkKIAl4b3JwcwkJJXhtbTAsJXhtbTQKLQl4b3JwcwkJJXhtbTIsJXhtbTQJIyAoYTArYTEptyhiMCtiMSktYTC3YjAtYTG3YjEKKwl4b3JwcwkJJXhtbTIsJXhtbTQJIyAoYTArYTEpwrcoYjArYjEpLWEwwrdiMC1hMcK3YjEKIAltb3ZkcWEJCSV4bW00LCV4bW01CiAJcHNsbGRxCQlcJDgsJXhtbTQKIAlwc3JsZHEJCVwkOCwleG1tNQpAQCAtMjI1LDEzICsyMjUsMTMgQEAKIAltb3YJXCQweGYsJG1hc2sKIAltb3YJJGExLCRhCiAJbW92CSRiMSwkYgotCWNhbGwJX211bF8xeDEJCSMgYTG3YjEKKwljYWxsCV9tdWxfMXgxCQkjIGExwrdiMQogCW1vdgkkbG8sMTYoJXJzcCkKIAltb3YJJGhpLDI0KCVyc3ApCiAKIAltb3YJNDgoJXJzcCksJGEKIAltb3YJNjQoJXJzcCksJGIKLQljYWxsCV9tdWxfMXgxCQkjIGEwt2IwCisJY2FsbAlfbXVsXzF4MQkJIyBhMMK3YjAKIAltb3YJJGxvLDAoJXJzcCkKIAltb3YJJGhpLDgoJXJzcCkKIApAQCAtMjM5LDcgKzIzOSw3IEBACiAJbW92CTU2KCVyc3ApLCRiCiAJeG9yCTQ4KCVyc3ApLCRhCiAJeG9yCTY0KCVyc3ApLCRiCi0JY2FsbAlfbXVsXzF4MQkJIyAoYTArYTEptyhiMCtiMSkKKwljYWxsCV9tdWxfMXgxCQkjIChhMCthMSnCtyhiMCtiMSkKIF9fXwogCUByPSgiJXJieCIsIiVyY3giLCIlcmRpIiwiJXJzaSIpOwogJGNvZGUuPTw8X19fOwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vYm4vYm5fZXhwLmMgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9ibi9ibl9leHAuYwppbmRleCA1YmIzZTdhLi42YjVmZTJiIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9ibi9ibl9leHAuYworKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9ibi9ibl9leHAuYwpAQCAtMjc4LDkgKzI3OCwxNCBAQAogICAgIH0KIAogICAgIGJpdHMgPSBCTl9udW1fYml0cyhwKTsKLQogICAgIGlmIChiaXRzID09IDApIHsKLSAgICAgICAgcmV0ID0gQk5fb25lKHIpOworICAgICAgICAvKiB4KiowIG1vZCAxIGlzIHN0aWxsIHplcm8uICovCisgICAgICAgIGlmIChCTl9pc19vbmUobSkpIHsKKyAgICAgICAgICAgIHJldCA9IDE7CisgICAgICAgICAgICBCTl96ZXJvKHIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0ID0gQk5fb25lKHIpOworICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogCkBAIC00MTQsNyArNDE5LDEzIEBACiAgICAgfQogICAgIGJpdHMgPSBCTl9udW1fYml0cyhwKTsKICAgICBpZiAoYml0cyA9PSAwKSB7Ci0gICAgICAgIHJldCA9IEJOX29uZShycik7CisgICAgICAgIC8qIHgqKjAgbW9kIDEgaXMgc3RpbGwgemVyby4gKi8KKyAgICAgICAgaWYgKEJOX2lzX29uZShtKSkgeworICAgICAgICAgICAgcmV0ID0gMTsKKyAgICAgICAgICAgIEJOX3plcm8ocnIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0ID0gQk5fb25lKHJyKTsKKyAgICAgICAgfQogICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KIApAQCAtNTg2LDcgKzU5Nyw3IEBACiAgKiBwcmVjb21wdXRhdGlvbiBtZW1vcnkgbGF5b3V0IHRvIGxpbWl0IGRhdGEtZGVwZW5kZW5jeSB0byBhIG1pbmltdW0gdG8KICAqIHByb3RlY3Qgc2VjcmV0IGV4cG9uZW50cyAoY2YuIHRoZSBoeXBlci10aHJlYWRpbmcgdGltaW5nIGF0dGFja3MgcG9pbnRlZAogICogb3V0IGJ5IENvbGluIFBlcmNpdmFsLAotICogaHR0cDovL3d3dy5kYWVtb25nLWNvbnNpZGVyZWRwZXJ0aHJlYWRpbmctY29uc2lkZXJlZC1oYXJtZnVsLykKKyAqIGh0dHA6Ly93d3cuZGFlbW9ub2xvZ3kubmV0L2h5cGVydGhyZWFkaW5nLWNvbnNpZGVyZWQtaGFybWZ1bC8pCiAgKi8KIGludCBCTl9tb2RfZXhwX21vbnRfY29uc3R0aW1lKEJJR05VTSAqcnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQklHTlVNICptLCBCTl9DVFggKmN0eCwKQEAgLTYwNiwxNSArNjE3LDIyIEBACiAgICAgYm5fY2hlY2tfdG9wKHApOwogICAgIGJuX2NoZWNrX3RvcChtKTsKIAotICAgIHRvcCA9IG0tPnRvcDsKLQotICAgIGlmICghKG0tPmRbMF0gJiAxKSkgeworICAgIGlmICghQk5faXNfb2RkKG0pKSB7CiAgICAgICAgIEJOZXJyKEJOX0ZfQk5fTU9EX0VYUF9NT05UX0NPTlNUVElNRSwgQk5fUl9DQUxMRURfV0lUSF9FVkVOX01PRFVMVVMpOwogICAgICAgICByZXR1cm4gKDApOwogICAgIH0KKworICAgIHRvcCA9IG0tPnRvcDsKKwogICAgIGJpdHMgPSBCTl9udW1fYml0cyhwKTsKICAgICBpZiAoYml0cyA9PSAwKSB7Ci0gICAgICAgIHJldCA9IEJOX29uZShycik7CisgICAgICAgIC8qIHgqKjAgbW9kIDEgaXMgc3RpbGwgemVyby4gKi8KKyAgICAgICAgaWYgKEJOX2lzX29uZShtKSkgeworICAgICAgICAgICAgcmV0ID0gMTsKKyAgICAgICAgICAgIEJOX3plcm8ocnIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0ID0gQk5fb25lKHJyKTsKKyAgICAgICAgfQogICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KIApAQCAtOTE0LDggKzkzMiw5IEBACiAgICAgICAgIGlmIChCTl9pc19vbmUobSkpIHsKICAgICAgICAgICAgIHJldCA9IDE7CiAgICAgICAgICAgICBCTl96ZXJvKHJyKTsKLSAgICAgICAgfSBlbHNlCisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICByZXQgPSBCTl9vbmUocnIpOworICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogICAgIGlmIChhID09IDApIHsKQEAgLTEwMjksOSArMTA0OCwxNCBAQAogICAgIH0KIAogICAgIGJpdHMgPSBCTl9udW1fYml0cyhwKTsKLQotICAgIGlmIChiaXRzID09IDApIHsKLSAgICAgICAgcmV0ID0gQk5fb25lKHIpOworICAgaWYgKGJpdHMgPT0gMCkgeworICAgICAgICAvKiB4KiowIG1vZCAxIGlzIHN0aWxsIHplcm8uICovCisgICAgICAgIGlmIChCTl9pc19vbmUobSkpIHsKKyAgICAgICAgICAgIHJldCA9IDE7CisgICAgICAgICAgICBCTl96ZXJvKHIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0ID0gQk5fb25lKHIpOworICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9ibi9ibl9nY2QuYyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2JuL2JuX2djZC5jCmluZGV4IDk3YzU1YWIuLmNlNTlmZTcgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2JuL2JuX2djZC5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2JuL2JuX2djZC5jCkBAIC01ODMsNiArNTgzLDcgQEAKICAgICAgICAgICogQk5fZGl2X25vX2JyYW5jaCB3aWxsIGJlIGNhbGxlZCBldmVudHVhbGx5LgogICAgICAgICAgKi8KICAgICAgICAgcEIgPSAmbG9jYWxfQjsKKyAgICAgICAgbG9jYWxfQi5mbGFncyA9IDA7CiAgICAgICAgIEJOX3dpdGhfZmxhZ3MocEIsIEIsIEJOX0ZMR19DT05TVFRJTUUpOwogICAgICAgICBpZiAoIUJOX25ubW9kKEIsIHBCLCBBLCBjdHgpKQogICAgICAgICAgICAgZ290byBlcnI7CkBAIC02MTAsNiArNjExLDcgQEAKICAgICAgICAgICogQk5fZGl2X25vX2JyYW5jaCB3aWxsIGJlIGNhbGxlZCBldmVudHVhbGx5LgogICAgICAgICAgKi8KICAgICAgICAgcEEgPSAmbG9jYWxfQTsKKyAgICAgICAgbG9jYWxfQS5mbGFncyA9IDA7CiAgICAgICAgIEJOX3dpdGhfZmxhZ3MocEEsIEEsIEJOX0ZMR19DT05TVFRJTUUpOwogCiAgICAgICAgIC8qIChELCBNKSA6PSAoQS9CLCBBJUIpIC4uLiAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vYm4vYm5fZ2YybS5jIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vYm4vYm5fZ2YybS5jCmluZGV4IGViN2MyMWQuLmYwMDk3NDQgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2JuL2JuX2dmMm0uYworKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9ibi9ibl9nZjJtLmMKQEAgLTU3OSw3ICs1NzksNyBAQAogICAgIGJuX2NoZWNrX3RvcChhKTsKICAgICBCTl9DVFhfc3RhcnQoY3R4KTsKICAgICBpZiAoKHMgPSBCTl9DVFhfZ2V0KGN0eCkpID09IE5VTEwpCi0gICAgICAgIHJldHVybiAwOworICAgICAgICBnb3RvIGVycjsKICAgICBpZiAoIWJuX3dleHBhbmQocywgMiAqIGEtPnRvcCkpCiAgICAgICAgIGdvdG8gZXJyOwogCkBAIC03MDMsMTggKzcwMywyMSBAQAogICAgICAgICBpbnQgdG9wID0gcC0+dG9wOwogICAgICAgICBCTl9VTE9ORyAqdWRwLCAqYmRwLCAqdmRwLCAqY2RwOwogCi0gICAgICAgIGJuX3dleHBhbmQodSwgdG9wKTsKKyAgICAgICAgaWYgKCFibl93ZXhwYW5kKHUsIHRvcCkpCisgICAgICAgICAgICBnb3RvIGVycjsKICAgICAgICAgdWRwID0gdS0+ZDsKICAgICAgICAgZm9yIChpID0gdS0+dG9wOyBpIDwgdG9wOyBpKyspCiAgICAgICAgICAgICB1ZHBbaV0gPSAwOwogICAgICAgICB1LT50b3AgPSB0b3A7Ci0gICAgICAgIGJuX3dleHBhbmQoYiwgdG9wKTsKKyAgICAgICAgaWYgKCFibl93ZXhwYW5kKGIsIHRvcCkpCisgICAgICAgICAgZ290byBlcnI7CiAgICAgICAgIGJkcCA9IGItPmQ7CiAgICAgICAgIGJkcFswXSA9IDE7CiAgICAgICAgIGZvciAoaSA9IDE7IGkgPCB0b3A7IGkrKykKICAgICAgICAgICAgIGJkcFtpXSA9IDA7CiAgICAgICAgIGItPnRvcCA9IHRvcDsKLSAgICAgICAgYm5fd2V4cGFuZChjLCB0b3ApOworICAgICAgICBpZiAoIWJuX3dleHBhbmQoYywgdG9wKSkKKyAgICAgICAgICBnb3RvIGVycjsKICAgICAgICAgY2RwID0gYy0+ZDsKICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRvcDsgaSsrKQogICAgICAgICAgICAgY2RwW2ldID0gMDsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2JuL2JuX21vbnQuYyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2JuL2JuX21vbnQuYwppbmRleCAwYzkyNTMwLi5mNWFkZDJkIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9ibi9ibl9tb250LmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vYm4vYm5fbW9udC5jCkBAIC0zNjQsOSArMzY0LDkgQEAKICAgICBpZiAobW9udCA9PSBOVUxMKQogICAgICAgICByZXR1cm47CiAKLSAgICBCTl9mcmVlKCYobW9udC0+UlIpKTsKLSAgICBCTl9mcmVlKCYobW9udC0+TikpOwotICAgIEJOX2ZyZWUoJihtb250LT5OaSkpOworICAgIEJOX2NsZWFyX2ZyZWUoJihtb250LT5SUikpOworICAgIEJOX2NsZWFyX2ZyZWUoJihtb250LT5OKSk7CisgICAgQk5fY2xlYXJfZnJlZSgmKG1vbnQtPk5pKSk7CiAgICAgaWYgKG1vbnQtPmZsYWdzICYgQk5fRkxHX01BTExPQ0VEKQogICAgICAgICBPUEVOU1NMX2ZyZWUobW9udCk7CiB9CkBAIC0zNzYsNiArMzc2LDkgQEAKICAgICBpbnQgcmV0ID0gMDsKICAgICBCSUdOVU0gKlJpLCAqUjsKIAorICAgIGlmIChCTl9pc196ZXJvKG1vZCkpCisgICAgICAgIHJldHVybiAwOworCiAgICAgQk5fQ1RYX3N0YXJ0KGN0eCk7CiAgICAgaWYgKChSaSA9IEJOX0NUWF9nZXQoY3R4KSkgPT0gTlVMTCkKICAgICAgICAgZ290byBlcnI7CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9ibi9ibl9yZWNwLmMgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9ibi9ibl9yZWNwLmMKaW5kZXggMWY3N2JjNS4uMDI3NTczYyAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vYm4vYm5fcmVjcC5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2JuL2JuX3JlY3AuYwpAQCAtMTU1LDggKzE1NSwxMCBAQAogCiAgICAgaWYgKEJOX3VjbXAobSwgJihyZWNwLT5OKSkgPCAwKSB7CiAgICAgICAgIEJOX3plcm8oZCk7Ci0gICAgICAgIGlmICghQk5fY29weShyLCBtKSkKKyAgICAgICAgaWYgKCFCTl9jb3B5KHIsIG0pKSB7CisgICAgICAgICAgICBCTl9DVFhfZW5kKGN0eCk7CiAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQogICAgICAgICBCTl9DVFhfZW5kKGN0eCk7CiAgICAgICAgIHJldHVybiAoMSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vYm4vYm5feDkzMXAuYyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2JuL2JuX3g5MzFwLmMKaW5kZXggNmQ3NmIxMi4uZWZhNDhiZCAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vYm4vYm5feDkzMXAuYworKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9ibi9ibl94OTMxcC5jCkBAIC0yMTMsMTQgKzIxMywxNCBAQAogICAgICAqIGV4Y2VlZGVkLgogICAgICAqLwogICAgIGlmICghQk5fcmFuZChYcCwgbmJpdHMsIDEsIDApKQotICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgZ290byBlcnI7CiAKICAgICBCTl9DVFhfc3RhcnQoY3R4KTsKICAgICB0ID0gQk5fQ1RYX2dldChjdHgpOwogCiAgICAgZm9yIChpID0gMDsgaSA8IDEwMDA7IGkrKykgewogICAgICAgICBpZiAoIUJOX3JhbmQoWHEsIG5iaXRzLCAxLCAwKSkKLSAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgZ290byBlcnI7CiAgICAgICAgIC8qIENoZWNrIHRoYXQgfFhwIC0gWHF8ID4gMl4obmJpdHMgLSAxMDApICovCiAgICAgICAgIEJOX3N1Yih0LCBYcCwgWHEpOwogICAgICAgICBpZiAoQk5fbnVtX2JpdHModCkgPiAobmJpdHMgLSAxMDApKQpAQCAtMjM0LDYgKzIzNCw5IEBACiAKICAgICByZXR1cm4gMDsKIAorIGVycjoKKyAgICBCTl9DVFhfZW5kKGN0eCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9ibi9ibnRlc3QuYyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2JuL2JudGVzdC5jCmluZGV4IDA2NjYyYzUuLjZkNTUwNDkgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2JuL2JudGVzdC5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2JuL2JudGVzdC5jCkBAIC00NDEsNiArNDQxLDE0IEBACiAgICAgQk5faW5pdCgmZCk7CiAgICAgQk5faW5pdCgmZSk7CiAKKyAgICBCTl9vbmUoJmEpOworICAgIEJOX3plcm8oJmIpOworCisgICAgaWYgKEJOX2RpdigmZCwgJmMsICZhLCAmYiwgY3R4KSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkRpdmlzaW9uIGJ5IHplcm8gc3VjY2VlZGVkIVxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKwogICAgIGZvciAoaSA9IDA7IGkgPCBudW0wICsgbnVtMTsgaSsrKSB7CiAgICAgICAgIGlmIChpIDwgbnVtMSkgewogICAgICAgICAgICAgQk5fYm50ZXN0X3JhbmQoJmEsIDQwMCwgMCwgMCk7CkBAIC01MTYsOSArNTI0LDkgQEAKICAgICAgICAgZG8gewogICAgICAgICAgICAgQk5fYm50ZXN0X3JhbmQoJmEsIDUxMiwgLTEsIDApOwogICAgICAgICAgICAgQk5fYm50ZXN0X3JhbmQoJmIsIEJOX0JJVFMyLCAtMSwgMCk7Ci0gICAgICAgICAgICBzID0gYi5kWzBdOwotICAgICAgICB9IHdoaWxlICghcyk7CisgICAgICAgIH0gd2hpbGUgKEJOX2lzX3plcm8oJmIpKTsKIAorICAgICAgICBzID0gYi5kWzBdOwogICAgICAgICBCTl9jb3B5KCZiLCAmYSk7CiAgICAgICAgIHIgPSBCTl9kaXZfd29yZCgmYiwgcyk7CiAKQEAgLTc4MSw2ICs3ODksMTggQEAKICAgICBpZiAobW9udCA9PSBOVUxMKQogICAgICAgICByZXR1cm4gMDsKIAorICAgIEJOX3plcm8oJm4pOworICAgIGlmIChCTl9NT05UX0NUWF9zZXQobW9udCwgJm4sIGN0eCkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJCTl9NT05UX0NUWF9zZXQgc3VjY2VlZGVkIGZvciB6ZXJvIG1vZHVsdXMhXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgQk5fc2V0X3dvcmQoJm4sIDE2KTsKKyAgICBpZiAoQk5fTU9OVF9DVFhfc2V0KG1vbnQsICZuLCBjdHgpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQk5fTU9OVF9DVFhfc2V0IHN1Y2NlZWRlZCBmb3IgZXZlbiBtb2R1bHVzIVxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKwogICAgIEJOX2JudGVzdF9yYW5kKCZhLCAxMDAsIDAsIDApOwogICAgIEJOX2JudGVzdF9yYW5kKCZiLCAxMDAsIDAsIDApOwogICAgIGZvciAoaSA9IDA7IGkgPCBudW0yOyBpKyspIHsKQEAgLTg4Nyw2ICs5MDcsMTQgQEAKICAgICBkID0gQk5fbmV3KCk7CiAgICAgZSA9IEJOX25ldygpOwogCisgICAgQk5fb25lKGEpOworICAgIEJOX29uZShiKTsKKyAgICBCTl96ZXJvKGMpOworICAgIGlmIChCTl9tb2RfbXVsKGUsIGEsIGIsIGMsIGN0eCkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJCTl9tb2RfbXVsIHdpdGggemVybyBtb2R1bHVzIHN1Y2NlZWRlZCFcbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKICAgICBmb3IgKGogPSAwOyBqIDwgMzsgaisrKSB7CiAgICAgICAgIEJOX2JudGVzdF9yYW5kKGMsIDEwMjQsIDAsIDApOwogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtMDsgaSsrKSB7CkBAIC05NTIsNiArOTgwLDE0IEBACiAgICAgZCA9IEJOX25ldygpOwogICAgIGUgPSBCTl9uZXcoKTsKIAorICAgIEJOX29uZShhKTsKKyAgICBCTl9vbmUoYik7CisgICAgQk5femVybyhjKTsKKyAgICBpZiAoQk5fbW9kX2V4cChkLCBhLCBiLCBjLCBjdHgpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQk5fbW9kX2V4cCB3aXRoIHplcm8gbW9kdWx1cyBzdWNjZWVkZWQhXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCiAgICAgQk5fYm50ZXN0X3JhbmQoYywgMzAsIDAsIDEpOyAvKiBtdXN0IGJlIG9kZCBmb3IgbW9udGdvbWVyeSAqLwogICAgIGZvciAoaSA9IDA7IGkgPCBudW0yOyBpKyspIHsKICAgICAgICAgQk5fYm50ZXN0X3JhbmQoYSwgMjAgKyBpICogNSwgMCwgMCk7CkBAIC05OTksNiArMTAzNSwyMiBAQAogICAgIGQgPSBCTl9uZXcoKTsKICAgICBlID0gQk5fbmV3KCk7CiAKKyAgICBCTl9vbmUoYSk7CisgICAgQk5fb25lKGIpOworICAgIEJOX3plcm8oYyk7CisgICAgaWYgKEJOX21vZF9leHBfbW9udF9jb25zdHRpbWUoZCwgYSwgYiwgYywgY3R4LCBOVUxMKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkJOX21vZF9leHBfbW9udF9jb25zdHRpbWUgd2l0aCB6ZXJvIG1vZHVsdXMgIgorICAgICAgICAgICAgICAgICJzdWNjZWVkZWRcbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBCTl9zZXRfd29yZChjLCAxNik7CisgICAgaWYgKEJOX21vZF9leHBfbW9udF9jb25zdHRpbWUoZCwgYSwgYiwgYywgY3R4LCBOVUxMKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkJOX21vZF9leHBfbW9udF9jb25zdHRpbWUgd2l0aCBldmVuIG1vZHVsdXMgIgorICAgICAgICAgICAgICAgICJzdWNjZWVkZWRcbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKICAgICBCTl9ibnRlc3RfcmFuZChjLCAzMCwgMCwgMSk7IC8qIG11c3QgYmUgb2RkIGZvciBtb250Z29tZXJ5ICovCiAgICAgZm9yIChpID0gMDsgaSA8IG51bTI7IGkrKykgewogICAgICAgICBCTl9ibnRlc3RfcmFuZChhLCAyMCArIGkgKiA1LCAwLCAwKTsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2JuL2V4cHRlc3QuYyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2JuL2V4cHRlc3QuYwppbmRleCA4YjNhNGJhLi5hYzYxMWMyIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9ibi9leHB0ZXN0LmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vYm4vZXhwdGVzdC5jCkBAIC03MywxNCArNzMsMzQgQEAKICAgICAic3RyaW5nIHRvIG1ha2UgdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIHRoaW5rIGl0IGhhcyBlbnRyb3B5IjsKIAogLyoKKyAqIFRlc3QgdGhhdCByID09IDAgaW4gdGVzdF9leHBfbW9kX3plcm8oKS4gUmV0dXJucyBvbmUgb24gc3VjY2VzcywKKyAqIHJldHVybnMgemVybyBhbmQgcHJpbnRzIGRlYnVnIG91dHB1dCBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbnQgYV9pc196ZXJvX21vZF9vbmUoY29uc3QgY2hhciAqbWV0aG9kLCBjb25zdCBCSUdOVU0gKnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJJR05VTSAqYSkgeworICAgIGlmICghQk5faXNfemVybyhyKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzIGZhaWxlZDpcbiIsIG1ldGhvZCk7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiYSAqKiAwIG1vZCAxID0gciAoc2hvdWxkIGJlIDApXG4iKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJhID0gIik7CisgICAgICAgIEJOX3ByaW50X2ZwKHN0ZGVyciwgYSk7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiXG5yID0gIik7CisgICAgICAgIEJOX3ByaW50X2ZwKHN0ZGVyciwgcik7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAxOworfQorCisvKgogICogdGVzdF9leHBfbW9kX3plcm8gdGVzdHMgdGhhdCB4KiowIG1vZCAxID09IDAuIEl0IHJldHVybnMgemVybyBvbiBzdWNjZXNzLgogICovCiBzdGF0aWMgaW50IHRlc3RfZXhwX21vZF96ZXJvKCkKIHsKICAgICBCSUdOVU0gYSwgcCwgbTsKICAgICBCSUdOVU0gcjsKKyAgICBCTl9VTE9ORyBvbmVfd29yZCA9IDE7CiAgICAgQk5fQ1RYICpjdHggPSBCTl9DVFhfbmV3KCk7Ci0gICAgaW50IHJldCA9IDE7CisgICAgaW50IHJldCA9IDEsIGZhaWxlZCA9IDA7CiAKICAgICBCTl9pbml0KCZtKTsKICAgICBCTl9vbmUoJm0pOwpAQCAtOTIsMjEgKzExMiw2NSBAQAogICAgIEJOX3plcm8oJnApOwogCiAgICAgQk5faW5pdCgmcik7Ci0gICAgQk5fbW9kX2V4cCgmciwgJmEsICZwLCAmbSwgY3R4KTsKLSAgICBCTl9DVFhfZnJlZShjdHgpOwogCi0gICAgaWYgKEJOX2lzX3plcm8oJnIpKQotICAgICAgICByZXQgPSAwOwotICAgIGVsc2UgewotICAgICAgICBwcmludGYoIjEqKjAgbW9kIDEgPSAiKTsKLSAgICAgICAgQk5fcHJpbnRfZnAoc3Rkb3V0LCAmcik7Ci0gICAgICAgIHByaW50ZigiLCBzaG91bGQgYmUgMFxuIik7CisgICAgaWYgKCFCTl9yYW5kKCZhLCAxMDI0LCAwLCAwKSkKKyAgICAgICAgZ290byBlcnI7CisKKyAgICBpZiAoIUJOX21vZF9leHAoJnIsICZhLCAmcCwgJm0sIGN0eCkpCisgICAgICAgIGdvdG8gZXJyOworCisgICAgaWYgKCFhX2lzX3plcm9fbW9kX29uZSgiQk5fbW9kX2V4cCIsICZyLCAmYSkpCisgICAgICAgIGZhaWxlZCA9IDE7CisKKyAgICBpZiAoIUJOX21vZF9leHBfcmVjcCgmciwgJmEsICZwLCAmbSwgY3R4KSkKKyAgICAgICAgZ290byBlcnI7CisKKyAgICBpZiAoIWFfaXNfemVyb19tb2Rfb25lKCJCTl9tb2RfZXhwX3JlY3AiLCAmciwgJmEpKQorICAgICAgICBmYWlsZWQgPSAxOworCisgICAgaWYgKCFCTl9tb2RfZXhwX3NpbXBsZSgmciwgJmEsICZwLCAmbSwgY3R4KSkKKyAgICAgICAgZ290byBlcnI7CisKKyAgICBpZiAoIWFfaXNfemVyb19tb2Rfb25lKCJCTl9tb2RfZXhwX3NpbXBsZSIsICZyLCAmYSkpCisgICAgICAgIGZhaWxlZCA9IDE7CisKKyAgICBpZiAoIUJOX21vZF9leHBfbW9udCgmciwgJmEsICZwLCAmbSwgY3R4LCBOVUxMKSkKKyAgICAgICAgZ290byBlcnI7CisKKyAgICBpZiAoIWFfaXNfemVyb19tb2Rfb25lKCJCTl9tb2RfZXhwX21vbnQiLCAmciwgJmEpKQorICAgICAgICBmYWlsZWQgPSAxOworCisgICAgaWYgKCFCTl9tb2RfZXhwX21vbnRfY29uc3R0aW1lKCZyLCAmYSwgJnAsICZtLCBjdHgsIE5VTEwpKSB7CisgICAgICAgIGdvdG8gZXJyOwogICAgIH0KIAorICAgIGlmICghYV9pc196ZXJvX21vZF9vbmUoIkJOX21vZF9leHBfbW9udF9jb25zdHRpbWUiLCAmciwgJmEpKQorICAgICAgICBmYWlsZWQgPSAxOworCisgICAgLyoKKyAgICAgKiBBIGRpZmZlcmVudCBjb2RlcGF0aCBleGlzdHMgZm9yIHNpbmdsZSB3b3JkIG11bHRpcGxpY2F0aW9uCisgICAgICogaW4gbm9uLWNvbnN0YW50LXRpbWUgb25seS4KKyAgICAgKi8KKyAgICBpZiAoIUJOX21vZF9leHBfbW9udF93b3JkKCZyLCBvbmVfd29yZCwgJnAsICZtLCBjdHgsIE5VTEwpKQorICAgICAgICBnb3RvIGVycjsKKworICAgIGlmICghQk5faXNfemVybygmcikpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJCTl9tb2RfZXhwX21vbnRfd29yZCBmYWlsZWQ6XG4iKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIxICoqIDAgbW9kIDEgPSByIChzaG91bGQgYmUgMClcbiIpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInIgPSAiKTsKKyAgICAgICAgQk5fcHJpbnRfZnAoc3RkZXJyLCAmcik7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0ID0gZmFpbGVkOworCisgZXJyOgogICAgIEJOX2ZyZWUoJnIpOwogICAgIEJOX2ZyZWUoJmEpOwogICAgIEJOX2ZyZWUoJnApOwogICAgIEJOX2ZyZWUoJm0pOworICAgIEJOX0NUWF9mcmVlKGN0eCk7CiAKICAgICByZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vYnVmZmVyL2J1Zl9zdHIuYyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2J1ZmZlci9idWZfc3RyLmMKaW5kZXggNDk5NzM2Ny4uZGNkNTIzZCAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vYnVmZmVyL2J1Zl9zdHIuYworKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9idWZmZXIvYnVmX3N0ci5jCkBAIC02MSwxMiArNjEsMTMgQEAKICNpbmNsdWRlIDxzdGRpby5oPgogI2VuZGlmICAvLyAhZGVmaW5lZChPUEVOU1NMX1NZU19TVEFSQk9BUkQpCiAjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxsaW1pdHMuaD4KICNpbmNsdWRlIDxvcGVuc3NsL2J1ZmZlci5oPgogCiBjaGFyICpCVUZfc3RyZHVwKGNvbnN0IGNoYXIgKnN0cikKIHsKICAgICBpZiAoc3RyID09IE5VTEwpCi0gICAgICAgIHJldHVybiAoTlVMTCk7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIHJldHVybiBCVUZfc3RybmR1cChzdHIsIE9QRU5TU0xfcG9ydF9zdHJsZW4oc3RyKSk7CiB9CiAKQEAgLTc1LDE0ICs3NiwyMCBAQAogICAgIGNoYXIgKnJldDsKIAogICAgIGlmIChzdHIgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIChOVUxMKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAoc2l6ID49IElOVF9NQVgpCisgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgcmV0ID0gT1BFTlNTTF9tYWxsb2Moc2l6ICsgMSk7CiAgICAgaWYgKHJldCA9PSBOVUxMKSB7CiAgICAgICAgIEJVRmVycihCVUZfRl9CVUZfU1RSTkRVUCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwotICAgICAgICByZXR1cm4gKE5VTEwpOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgQlVGX3N0cmxjcHkocmV0LCBzdHIsIHNpeiArIDEpOworCisgICAgT1BFTlNTTF9wb3J0X21lbWNweShyZXQsIHN0ciwgc2l6KTsKKyAgICByZXRbc2l6XSA9ICdcMCc7CisKICAgICByZXR1cm4gKHJldCk7CiB9CiAKQEAgLTkwLDEzICs5NywxMyBAQAogewogICAgIHZvaWQgKnJldDsKIAotICAgIGlmIChkYXRhID09IE5VTEwpCi0gICAgICAgIHJldHVybiAoTlVMTCk7CisgICAgaWYgKGRhdGEgPT0gTlVMTCB8fCBzaXogPj0gSU5UX01BWCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICByZXQgPSBPUEVOU1NMX21hbGxvYyhzaXopOwogICAgIGlmIChyZXQgPT0gTlVMTCkgewogICAgICAgICBCVUZlcnIoQlVGX0ZfQlVGX01FTURVUCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwotICAgICAgICByZXR1cm4gKE5VTEwpOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgICAgcmV0dXJuIE9QRU5TU0xfcG9ydF9tZW1jcHkocmV0LCBkYXRhLCBzaXopOwogfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vYnVmZmVyL2J1ZmZlci5oIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vYnVmZmVyL2J1ZmZlci5oCmluZGV4IDA4MThhYWUuLjFhOGZhNWQgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2J1ZmZlci9idWZmZXIuaAorKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9idWZmZXIvYnVmZmVyLmgKQEAgLTg4LDcgKzg4LDEzIEBACiBpbnQgQlVGX01FTV9ncm93KEJVRl9NRU0gKnN0ciwgc2l6ZV90IGxlbik7CiBpbnQgQlVGX01FTV9ncm93X2NsZWFuKEJVRl9NRU0gKnN0ciwgc2l6ZV90IGxlbik7CiBjaGFyICpCVUZfc3RyZHVwKGNvbnN0IGNoYXIgKnN0cik7CisKKy8qCisgKiBMaWtlIHN0cm5kdXAsIGJ1dCBpbiBhZGRpdGlvbiwgZXhwbGljaXRseSBndWFyYW50ZWVzIHRvIG5ldmVyIHJlYWQgcGFzdCB0aGUKKyAqIGZpcnN0IHxzaXp8IGJ5dGVzIG9mIHxzdHJ8LgorICovCiBjaGFyICpCVUZfc3RybmR1cChjb25zdCBjaGFyICpzdHIsIHNpemVfdCBzaXopOworCiB2b2lkICpCVUZfbWVtZHVwKGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXopOwogdm9pZCBCVUZfcmV2ZXJzZSh1bnNpZ25lZCBjaGFyICpvdXQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCBzaXplX3Qgc2l6KTsKIApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vY2FtZWxsaWEvY2FtZWxsaWEuYyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2NhbWVsbGlhL2NhbWVsbGlhLmMKaW5kZXggYjRhNjc2Ni4uNzE5ZmE2MSAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vY2FtZWxsaWEvY2FtZWxsaWEuYworKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9jYW1lbGxpYS9jYW1lbGxpYS5jCkBAIC0xLDQgKzEsNCBAQAotLyogY3J5cHRvL2NhbWVsbGlhL2NhbWVsbGlhLmMgLSotIG1vZGU6QzsgYy1maWxlLXN0eWxlOiAiZWF5IiAtKi0gKi8KKy8qIGNyeXB0by9jYW1lbGxpYS9jYW1lbGxpYS5jICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICogQ29weXJpZ2h0IDIwMDYgTlRUIChOaXBwb24gVGVsZWdyYXBoIGFuZCBUZWxlcGhvbmUgQ29ycG9yYXRpb24pIC4KICAqIEFMTCBSSUdIVFMgUkVTRVJWRUQuCkBAIC02Nyw3ICs2Nyw3IEBACiAKIC8qCiAgKiBBbGdvcml0aG0gU3BlY2lmaWNhdGlvbgotICogaHR0cDovL2luZm8uaXNsLmxsaWEvc3BlY2ljcnlwdC9lbmcvY2FtZWxsaWEvc3BlY2lmaWNhdGlvbnMuaHRtbAorICogaHR0cDovL2luZm8uaXNsLm50dC5jby5qcC9jcnlwdC9lbmcvY2FtZWxsaWEvc3BlY2lmaWNhdGlvbnMuaHRtbAogICovCiAKIC8qCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9jYW1lbGxpYS9jYW1lbGxpYS5oIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vY2FtZWxsaWEvY2FtZWxsaWEuaAppbmRleCA2YjViYmY2Li44NjEyZjhiIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9jYW1lbGxpYS9jYW1lbGxpYS5oCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2NhbWVsbGlhL2NhbWVsbGlhLmgKQEAgLTEsNCArMSw0IEBACi0vKiBjcnlwdG8vY2FtZWxsaWEvY2FtZWxsaWEuaCAtKi0gbW9kZTpDOyBjLWZpbGUtc3R5bGU6ICJlYXkiIC0qLSAqLworLyogY3J5cHRvL2NhbWVsbGlhL2NhbWVsbGlhLmggKi8KIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKiBDb3B5cmlnaHQgKGMpIDIwMDYgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vY2FtZWxsaWEvY21sbF9jYmMuYyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2NhbWVsbGlhL2NtbGxfY2JjLmMKaW5kZXggYTQ5MDdjYS4uNDAxN2UwMCAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vY2FtZWxsaWEvY21sbF9jYmMuYworKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9jYW1lbGxpYS9jbWxsX2NiYy5jCkBAIC0xLDQgKzEsNCBAQAotLyogY3J5cHRvL2NhbWVsbGlhL2NhbWVsbGlhX2NiYy5jIC0qLSBtb2RlOkM7IGMtZmlsZS1zdHlsZTogImVheSIgLSotICovCisvKiBjcnlwdG8vY2FtZWxsaWEvY2FtZWxsaWFfY2JjLmMgKi8KIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKiBDb3B5cmlnaHQgKGMpIDIwMDYgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vY2FtZWxsaWEvY21sbF9jZmIuYyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2NhbWVsbGlhL2NtbGxfY2ZiLmMKaW5kZXggNTliODUyMi4uNzhmMmFlNCAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vY2FtZWxsaWEvY21sbF9jZmIuYworKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9jYW1lbGxpYS9jbWxsX2NmYi5jCkBAIC0xLDQgKzEsNCBAQAotLyogY3J5cHRvL2NhbWVsbGlhL2NhbWVsbGlhX2NmYi5jIC0qLSBtb2RlOkM7IGMtZmlsZS1zdHlsZTogImVheSIgLSotICovCisvKiBjcnlwdG8vY2FtZWxsaWEvY2FtZWxsaWFfY2ZiLmMgKi8KIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKiBDb3B5cmlnaHQgKGMpIDIwMDYgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vY2FtZWxsaWEvY21sbF9jdHIuYyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2NhbWVsbGlhL2NtbGxfY3RyLmMKaW5kZXggYjhmNTIzZC4uOTVlMjY2MiAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vY2FtZWxsaWEvY21sbF9jdHIuYworKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9jYW1lbGxpYS9jbWxsX2N0ci5jCkBAIC0xLDQgKzEsNCBAQAotLyogY3J5cHRvL2NhbWVsbGlhL2NhbWVsbGlhX2N0ci5jIC0qLSBtb2RlOkM7IGMtZmlsZS1zdHlsZTogImVheSIgLSotICovCisvKiBjcnlwdG8vY2FtZWxsaWEvY2FtZWxsaWFfY3RyLmMgKi8KIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKiBDb3B5cmlnaHQgKGMpIDIwMDYgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vY2FtZWxsaWEvY21sbF9lY2IuYyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2NhbWVsbGlhL2NtbGxfZWNiLmMKaW5kZXggMTZmMWFmOC4uYjAzMDc5MSAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vY2FtZWxsaWEvY21sbF9lY2IuYworKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9jYW1lbGxpYS9jbWxsX2VjYi5jCkBAIC0xLDQgKzEsNCBAQAotLyogY3J5cHRvL2NhbWVsbGlhL2NhbWVsbGlhX2VjYi5jIC0qLSBtb2RlOkM7IGMtZmlsZS1zdHlsZTogImVheSIgLSotICovCisvKiBjcnlwdG8vY2FtZWxsaWEvY2FtZWxsaWFfZWNiLmMgKi8KIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKiBDb3B5cmlnaHQgKGMpIDIwMDYgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vY2FtZWxsaWEvY21sbF9sb2NsLmggYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9jYW1lbGxpYS9jbWxsX2xvY2wuaAppbmRleCA0ZTQ3MDdiLi4yYmQ3OWI4IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9jYW1lbGxpYS9jbWxsX2xvY2wuaAorKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9jYW1lbGxpYS9jbWxsX2xvY2wuaApAQCAtMSw0ICsxLDQgQEAKLS8qIGNyeXB0by9jYW1lbGxpYS9jYW1lbGxpYV9sb2NsLmggLSotIG1vZGU6QzsgYy1maWxlLXN0eWxlOiAiZWF5IiAtKi0gKi8KKy8qIGNyeXB0by9jYW1lbGxpYS9jYW1lbGxpYV9sb2NsLmggKi8KIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKiBDb3B5cmlnaHQgMjAwNiBOVFQgKE5pcHBvbiBUZWxlZ3JhcGggYW5kIFRlbGVwaG9uZSBDb3Jwb3JhdGlvbikgLgogICogQUxMIFJJR0hUUyBSRVNFUlZFRC4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2NhbWVsbGlhL2NtbGxfbWlzYy5jIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vY2FtZWxsaWEvY21sbF9taXNjLmMKaW5kZXggY2JkMjUwMi4uNjk0ZDJmYSAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vY2FtZWxsaWEvY21sbF9taXNjLmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vY2FtZWxsaWEvY21sbF9taXNjLmMKQEAgLTEsNCArMSw0IEBACi0vKiBjcnlwdG8vY2FtZWxsaWEvY2FtZWxsaWFfbWlzYy5jIC0qLSBtb2RlOkM7IGMtZmlsZS1zdHlsZTogImVheSIgLSotICovCisvKiBjcnlwdG8vY2FtZWxsaWEvY2FtZWxsaWFfbWlzYy5jICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICogQ29weXJpZ2h0IChjKSAyMDA2IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2NhbWVsbGlhL2NtbGxfb2ZiLmMgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9jYW1lbGxpYS9jbWxsX29mYi5jCmluZGV4IDQ2YzNhZTIuLjg1ZWI4OTIgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2NhbWVsbGlhL2NtbGxfb2ZiLmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vY2FtZWxsaWEvY21sbF9vZmIuYwpAQCAtMSw0ICsxLDQgQEAKLS8qIGNyeXB0by9jYW1lbGxpYS9jYW1lbGxpYV9vZmIuYyAtKi0gbW9kZTpDOyBjLWZpbGUtc3R5bGU6ICJlYXkiIC0qLSAqLworLyogY3J5cHRvL2NhbWVsbGlhL2NhbWVsbGlhX29mYi5jICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICogQ29weXJpZ2h0IChjKSAyMDA2IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2NhbWVsbGlhL2NtbGxfdXRsLmMgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9jYW1lbGxpYS9jbWxsX3V0bC5jCmluZGV4IGQxOWVlMTkuLmQ1ZWI2YjQgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2NhbWVsbGlhL2NtbGxfdXRsLmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vY2FtZWxsaWEvY21sbF91dGwuYwpAQCAtMSw0ICsxLDQgQEAKLS8qIGNyeXB0by9jYW1lbGxpYS9jbWxsX3V0bC5jIC0qLSBtb2RlOkM7IGMtZmlsZS1zdHlsZTogImVheSIgLSotICovCisvKiBjcnlwdG8vY2FtZWxsaWEvY21sbF91dGwuYyAqLwogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqIENvcHlyaWdodCAoYykgMjAxMSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9jbXMvY21zX2VuYy5jIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vY21zL2Ntc19lbmMuYwppbmRleCA4NWFlOTI4Li5iMTRiNGI2IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9jbXMvY21zX2VuYy5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2Ntcy9jbXNfZW5jLmMKQEAgLTE5NSw3ICsxOTUsNyBAQAogICAgIG9rID0gMTsKIAogIGVycjoKLSAgICBpZiAoZWMtPmtleSAmJiAha2VlcF9rZXkpIHsKKyAgICBpZiAoZWMtPmtleSAmJiAoIWtlZXBfa2V5IHx8ICFvaykpIHsKICAgICAgICAgT1BFTlNTTF9jbGVhbnNlKGVjLT5rZXksIGVjLT5rZXlsZW4pOwogICAgICAgICBPUEVOU1NMX2ZyZWUoZWMtPmtleSk7CiAgICAgICAgIGVjLT5rZXkgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vY21zL2Ntc19wd3JpLmMgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9jbXMvY21zX3B3cmkuYwppbmRleCBhODMyMmRjLi5iOTFjMDE2IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9jbXMvY21zX3B3cmkuYworKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9jbXMvY21zX3B3cmkuYwpAQCAtMTIxLDYgKzEyMSw5IEBACiAKICAgICAvKiBTZXR1cCBhbGdvcml0aG0gaWRlbnRpZmllciBmb3IgY2lwaGVyICovCiAgICAgZW5jYWxnID0gWDUwOV9BTEdPUl9uZXcoKTsKKyAgICBpZiAoZW5jYWxnID09IE5VTEwpIHsKKyAgICAgICAgZ290byBtZXJyOworICAgIH0KICAgICBFVlBfQ0lQSEVSX0NUWF9pbml0KCZjdHgpOwogCiAgICAgaWYgKEVWUF9FbmNyeXB0SW5pdF9leCgmY3R4LCBrZWtjaXBoLCBOVUxMLCBOVUxMLCBOVUxMKSA8PSAwKSB7CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9jbXMvY21zX3NtaW1lLmMgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9jbXMvY21zX3NtaW1lLmMKaW5kZXggOGIzNzU2MC4uZjQ1NjkzYSAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vY21zL2Ntc19zbWltZS5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2Ntcy9jbXNfc21pbWUuYwpAQCAtNzE0LDcgKzcxNCw3IEBACiAgICAgQklPICpjbXNiaW87CiAgICAgaW50IHJldCA9IDA7CiAgICAgaWYgKCEoY21zYmlvID0gQ01TX2RhdGFJbml0KGNtcywgZGNvbnQpKSkgewotICAgICAgICBDTVNlcnIoQ01TX0ZfQ01TX0ZJTkFMLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgICAgIENNU2VycihDTVNfRl9DTVNfRklOQUwsIENNU19SX0NNU19MSUIpOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2NvbXAvY196bGliLmMgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9jb21wL2NfemxpYi5jCmluZGV4IDY3MzFhZjguLjljMzI2MTQgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2NvbXAvY196bGliLmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vY29tcC9jX3psaWIuYwpAQCAtNDA0LDggKzQwNCw5IEBACiB2b2lkIENPTVBfemxpYl9jbGVhbnVwKHZvaWQpCiB7CiAjaWZkZWYgWkxJQl9TSEFSRUQKLSAgICBpZiAoemxpYl9kc28pCisgICAgaWYgKHpsaWJfZHNvICE9IE5VTEwpCiAgICAgICAgIERTT19mcmVlKHpsaWJfZHNvKTsKKyAgICB6bGliX2RzbyA9IE5VTEw7CiAjZW5kaWYKIH0KIApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vY29uZi9jb25mX2RlZi5jIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vY29uZi9jb25mX2RlZi5jCmluZGV4IGY3MGIyZDAuLmQxYTgxZmIgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2NvbmYvY29uZl9kZWYuYworKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9jb25mL2NvbmZfZGVmLmMKQEAgLTIyOCwxMiArMjI4LDExIEBACiAgICAgICAgIGdvdG8gZXJyOwogICAgIH0KIAotICAgIHNlY3Rpb24gPSAoY2hhciAqKU9QRU5TU0xfbWFsbG9jKDEwKTsKKyAgICBzZWN0aW9uID0gQlVGX3N0cmR1cCgiZGVmYXVsdCIpOwogICAgIGlmIChzZWN0aW9uID09IE5VTEwpIHsKICAgICAgICAgQ09ORmVycihDT05GX0ZfREVGX0xPQURfQklPLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgICAgIGdvdG8gZXJyOwogICAgIH0KLSAgICBCVUZfc3RybGNweShzZWN0aW9uLCAiZGVmYXVsdCIsIDEwKTsKIAogICAgIGlmIChfQ09ORl9uZXdfZGF0YShjb25mKSA9PSAwKSB7CiAgICAgICAgIENPTkZlcnIoQ09ORl9GX0RFRl9MT0FEX0JJTywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vY29uZi9jb25mX3NhcC5jIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vY29uZi9jb25mX3NhcC5jCmluZGV4IGNlNDllMGUuLjMzZTNmNzIgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2NvbmYvY29uZl9zYXAuYworKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9jb25mL2NvbmZfc2FwLmMKQEAgLTkzLDYgKzkzLDcgQEAKICAgICBDT05GX21vZHVsZXNfbG9hZF9maWxlKE5VTEwsIGNvbmZpZ19uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTkZfTUZMQUdTX0RFRkFVTFRfU0VDVElPTiB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ORl9NRkxBR1NfSUdOT1JFX01JU1NJTkdfRklMRSk7CisgICAgb3BlbnNzbF9jb25maWd1cmVkID0gMTsKIH0KIAogdm9pZCBPUEVOU1NMX25vX2NvbmZpZygpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9jcnlwdGxpYi5jIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vY3J5cHRsaWIuYwppbmRleCAzZDJjMWI0Li42MmM4NTlmIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9jcnlwdGxpYi5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2NyeXB0bGliLmMKQEAgLTk0MSwxMyArOTQxLDI5IEBACiAjIGlmIGRlZmluZWQoX1dJTjMyX1dJTk5UKSAmJiBfV0lOMzJfV0lOTlQ+PTB4MDMzMwogICAgIC8qIHRoaXMgLS0tLS0tLS0tLS0tLXYtLS0gZ3VhcmRzIE5ULXNwZWNpZmljIGNhbGxzICovCiAgICAgaWYgKGNoZWNrX3dpbm50KCkgJiYgT1BFTlNTTF9pc3NlcnZpY2UoKSA+IDApIHsKLSAgICAgICAgSEFORExFIGggPSBSZWdpc3RlckV2ZW50U291cmNlKDAsIF9UKCJPUEVOU1NMIikpOwotICAgICAgICBjb25zdCBUQ0hBUiAqcG1zZyA9IGJ1ZjsKLSAgICAgICAgUmVwb3J0RXZlbnQoaCwgRVZFTlRMT0dfRVJST1JfVFlQRSwgMCwgMCwgMCwgMSwgMCwgJnBtc2csIDApOwotICAgICAgICBEZXJlZ2lzdGVyRXZlbnRTb3VyY2UoaCk7CisgICAgICAgIEhBTkRMRSBoRXZlbnRMb2cgPSBSZWdpc3RlckV2ZW50U291cmNlKE5VTEwsIF9UKCJPcGVuU1NMIikpOworCisgICAgICAgIGlmIChoRXZlbnRMb2cgIT0gTlVMTCkgeworICAgICAgICAgICAgY29uc3QgVENIQVIgKnBtc2cgPSBidWY7CisKKyAgICAgICAgICAgIGlmICghUmVwb3J0RXZlbnQoaEV2ZW50TG9nLCBFVkVOVExPR19FUlJPUl9UWVBFLCAwLCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAwLCAmcG1zZywgTlVMTCkpIHsKKyNpZiBkZWZpbmVkKERFQlVHKQorICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogV2UgYXJlIGluIGEgc2l0dWF0aW9uIHdoZXJlIHdlIHRyaWVkIHRvIHJlcG9ydCBhIGNyaXRpY2FsCisgICAgICAgICAgICAgICAgICogZXJyb3IgYW5kIHRoaXMgZmFpbGVkIGZvciBzb21lIHJlYXNvbi4gQXMgYSBsYXN0IHJlc29ydCwKKyAgICAgICAgICAgICAgICAgKiBpbiBkZWJ1ZyBidWlsZHMsIHNlbmQgb3V0cHV0IHRvIHRoZSBkZWJ1Z2dlciBvciBhbnkgb3RoZXIKKyAgICAgICAgICAgICAgICAgKiB0b29sIGxpa2UgRGVidWdWaWV3IHdoaWNoIGNhbiBtb25pdG9yIHRoZSBvdXRwdXQuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgT3V0cHV0RGVidWdTdHJpbmcocG1zZyk7CisjZW5kaWYKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgKHZvaWQpRGVyZWdpc3RlckV2ZW50U291cmNlKGhFdmVudExvZyk7CisgICAgICAgIH0KICAgICB9IGVsc2UKICMgZW5kaWYKLSAgICAgICAgTWVzc2FnZUJveChOVUxMLCBidWYsIF9UKCJPcGVuU1NMOiBGQVRBTCIpLCBNQl9PSyB8IE1CX0lDT05TVE9QKTsKKyAgICAgICAgTWVzc2FnZUJveChOVUxMLCBidWYsIF9UKCJPcGVuU1NMOiBGQVRBTCIpLCBNQl9PSyB8IE1CX0lDT05FUlJPUik7CiB9CiAjZWxzZQogdm9pZCBPUEVOU1NMX3Nob3dmYXRhbChjb25zdCBjaGFyICpmbXRhLCAuLi4pCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9kZXMvZGVzX29sZC5jIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vZGVzL2Rlc19vbGQuYwppbmRleCA1NGIwOTY4Li5jNWM1YTAwIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9kZXMvZGVzX29sZC5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2Rlcy9kZXNfb2xkLmMKQEAgLTEsNCArMSw0IEBACi0vKiBjcnlwdG8vZGVzL2Rlc19vbGQuYyAtKi0gbW9kZTpDOyBjLWZpbGUtc3R5bGU6ICJlYXkiIC0qLSAqLworLyogY3J5cHRvL2Rlcy9kZXNfb2xkLmMgKi8KIAogLyotCiAgKiBXQVJOSU5HIFdBUk5JTkcgV0FSTklORyBXQVJOSU5HIFdBUk5JTkcgV0FSTklORyBXQVJOSU5HIFdBUk5JTkcKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2Rlcy9kZXNfb2xkLmggYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9kZXMvZGVzX29sZC5oCmluZGV4IGYxZTFlMmMuLmVlNzYwN2EgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2Rlcy9kZXNfb2xkLmgKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vZGVzL2Rlc19vbGQuaApAQCAtMSw0ICsxLDQgQEAKLS8qIGNyeXB0by9kZXMvZGVzX29sZC5oIC0qLSBtb2RlOkM7IGMtZmlsZS1zdHlsZTogImVheSIgLSotICovCisvKiBjcnlwdG8vZGVzL2Rlc19vbGQuaCAqLwogCiAvKi0KICAqIFdBUk5JTkcgV0FSTklORyBXQVJOSU5HIFdBUk5JTkcgV0FSTklORyBXQVJOSU5HIFdBUk5JTkcgV0FSTklORwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vZGVzL2Rlc19vbGQyLmMgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9kZXMvZGVzX29sZDIuYwppbmRleCBmN2QyOGE2Li4yNDdmZjhkIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9kZXMvZGVzX29sZDIuYworKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9kZXMvZGVzX29sZDIuYwpAQCAtMSw0ICsxLDQgQEAKLS8qIGNyeXB0by9kZXMvZGVzX29sZC5jIC0qLSBtb2RlOkM7IGMtZmlsZS1zdHlsZTogImVheSIgLSotICovCisvKiBjcnlwdG8vZGVzL2Rlc19vbGQuYyAqLwogCiAvKgogICogV0FSTklORyBXQVJOSU5HIFdBUk5JTkcgV0FSTklORyBXQVJOSU5HIFdBUk5JTkcgV0FSTklORyBXQVJOSU5HIFRoZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vZHNhL2RzYV9hbWV0aC5jIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vZHNhL2RzYV9hbWV0aC5jCmluZGV4IGM0NDhjNGUuLjExZDU3ZjIgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2RzYS9kc2FfYW1ldGguYworKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9kc2EvZHNhX2FtZXRoLmMKQEAgLTMyMSw2ICszMjEsNyBAQAogICAgIGRwbGVuID0gaTJkX0FTTjFfSU5URUdFUihwcmtleSwgJmRwKTsKIAogICAgIEFTTjFfU1RSSU5HX2NsZWFyX2ZyZWUocHJrZXkpOworICAgIHBya2V5ID0gTlVMTDsKIAogICAgIGlmICghUEtDUzhfcGtleV9zZXQwKHA4LCBPQkpfbmlkMm9iaihOSURfZHNhKSwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICBWX0FTTjFfU0VRVUVOQ0UsIHBhcmFtcywgZHAsIGRwbGVuKSkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2RzYS9kc2FfZ2VuLmMgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9kc2EvZHNhX2dlbi5jCmluZGV4IGZkOTQwMDUuLmJmNjgzZjQgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2RzYS9kc2FfZ2VuLmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vZHNhL2RzYV9nZW4uYwpAQCAtMTE1LDE2ICsxMTUsOCBAQAogICAgIH0KICMgZW5kaWYKICAgICBlbHNlIHsKLSAgICAgICAgY29uc3QgRVZQX01EICpldnBtZDsKLSAgICAgICAgc2l6ZV90IHFiaXRzID0gYml0cyA+PSAyMDQ4ID8gMjU2IDogMTYwOwotCi0gICAgICAgIGlmIChiaXRzID49IDIwNDgpIHsKLSAgICAgICAgICAgIHFiaXRzID0gMjU2OwotICAgICAgICAgICAgZXZwbWQgPSBFVlBfc2hhMjU2KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBxYml0cyA9IDE2MDsKLSAgICAgICAgICAgIGV2cG1kID0gRVZQX3NoYTEoKTsKLSAgICAgICAgfQorICAgICAgICBjb25zdCBFVlBfTUQgKmV2cG1kID0gYml0cyA+PSAyMDQ4ID8gRVZQX3NoYTI1NigpIDogRVZQX3NoYTEoKTsKKyAgICAgICAgc2l6ZV90IHFiaXRzID0gRVZQX01EX3NpemUoZXZwbWQpICogODsKIAogICAgICAgICByZXR1cm4gZHNhX2J1aWx0aW5fcGFyYW1nZW4ocmV0LCBiaXRzLCBxYml0cywgZXZwbWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWVkX2luLCBzZWVkX2xlbiwgTlVMTCwgY291bnRlcl9yZXQsCkBAIC0xNzcsMTMgKzE2OSwxNCBAQAogICAgIGlmIChzZWVkX2luICE9IE5VTEwpCiAgICAgICAgIE9QRU5TU0xfcG9ydF9tZW1jcHkoc2VlZCwgc2VlZF9pbiwgc2VlZF9sZW4pOwogCi0gICAgaWYgKChjdHggPSBCTl9DVFhfbmV3KCkpID09IE5VTEwpCi0gICAgICAgIGdvdG8gZXJyOwotCiAgICAgaWYgKChtb250ID0gQk5fTU9OVF9DVFhfbmV3KCkpID09IE5VTEwpCiAgICAgICAgIGdvdG8gZXJyOwogCisgICAgaWYgKChjdHggPSBCTl9DVFhfbmV3KCkpID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyOworCiAgICAgQk5fQ1RYX3N0YXJ0KGN0eCk7CisKICAgICByMCA9IEJOX0NUWF9nZXQoY3R4KTsKICAgICBnID0gQk5fQ1RYX2dldChjdHgpOwogICAgIFcgPSBCTl9DVFhfZ2V0KGN0eCk7CkBAIC0yMDQsNyArMTk3LDcgQEAKICAgICAgICAgICAgIGlmICghQk5fR0VOQ0JfY2FsbChjYiwgMCwgbSsrKSkKICAgICAgICAgICAgICAgICBnb3RvIGVycjsKIAotICAgICAgICAgICAgaWYgKCFzZWVkX2xlbikgeworICAgICAgICAgICAgaWYgKCFzZWVkX2xlbiB8fCAhc2VlZF9pbikgewogICAgICAgICAgICAgICAgIGlmIChSQU5EX3BzZXVkb19ieXRlcyhzZWVkLCBxc2l6ZSkgPCAwKQogICAgICAgICAgICAgICAgICAgICBnb3RvIGVycjsKICAgICAgICAgICAgICAgICBzZWVkX2lzX3JhbmRvbSA9IDE7CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9kc2EvZHNhX29zc2wuYyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2RzYS9kc2Ffb3NzbC5jCmluZGV4IDRlNGFmMDMuLjcyNWM3MDAgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2RzYS9kc2Ffb3NzbC5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2RzYS9kc2Ffb3NzbC5jCkBAIC0xOTAsOSArMTkwLDYgQEAKICAgICBpZiAoIUJOX21vZF9tdWwocywgcywga2ludiwgZHNhLT5xLCBjdHgpKQogICAgICAgICBnb3RvIGVycjsKIAotICAgIHJldCA9IERTQV9TSUdfbmV3KCk7Ci0gICAgaWYgKHJldCA9PSBOVUxMKQotICAgICAgICBnb3RvIGVycjsKICAgICAvKgogICAgICAqIFJlZG8gaWYgciBvciBzIGlzIHplcm8gYXMgcmVxdWlyZWQgYnkgRklQUyAxODYtMzogdGhpcyBpcyB2ZXJ5CiAgICAgICogdW5saWtlbHkuCkBAIC0yMDQsMTEgKzIwMSwxNCBAQAogICAgICAgICB9CiAgICAgICAgIGdvdG8gcmVkbzsKICAgICB9CisgICAgcmV0ID0gRFNBX1NJR19uZXcoKTsKKyAgICBpZiAocmV0ID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyOwogICAgIHJldC0+ciA9IHI7CiAgICAgcmV0LT5zID0gczsKIAogIGVycjoKLSAgICBpZiAoIXJldCkgeworICAgIGlmIChyZXQgPT0gTlVMTCkgewogICAgICAgICBEU0FlcnIoRFNBX0ZfRFNBX0RPX1NJR04sIHJlYXNvbik7CiAgICAgICAgIEJOX2ZyZWUocik7CiAgICAgICAgIEJOX2ZyZWUocyk7CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9kc28vZHNvLmggYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9kc28vZHNvLmgKaW5kZXggN2M0YTFkYy4uYzkwMTNmNSAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vZHNvL2Rzby5oCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2Rzby9kc28uaApAQCAtMSw0ICsxLDQgQEAKLS8qIGRzby5oIC0qLSBtb2RlOkM7IGMtZmlsZS1zdHlsZTogImVheSIgLSotICovCisvKiBkc28uaCAqLwogLyoKICAqIFdyaXR0ZW4gYnkgR2VvZmYgVGhvcnBlIChnZW9mZkBnZW9mZnRob3JwZS5uZXQpIGZvciB0aGUgT3BlblNTTCBwcm9qZWN0CiAgKiAyMDAwLgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vZHNvL2Rzb19kbC5jIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vZHNvL2Rzb19kbC5jCmluZGV4IDAwODdhYzUuLmNlZWRmNjYgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2Rzby9kc29fZGwuYworKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9kc28vZHNvX2RsLmMKQEAgLTEsNCArMSw0IEBACi0vKiBkc29fZGwuYyAtKi0gbW9kZTpDOyBjLWZpbGUtc3R5bGU6ICJlYXkiIC0qLSAqLworLyogZHNvX2RsLmMgKi8KIC8qCiAgKiBXcml0dGVuIGJ5IFJpY2hhcmQgTGV2aXR0ZSAocmljaGFyZEBsZXZpdHRlLm9yZykgZm9yIHRoZSBPcGVuU1NMIHByb2plY3QKICAqIDIwMDAuCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9kc28vZHNvX2RsZmNuLmMgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9kc28vZHNvX2RsZmNuLmMKaW5kZXggZjYyOWYwMy4uNzhkZjcyMyAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vZHNvL2Rzb19kbGZjbi5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2Rzby9kc29fZGxmY24uYwpAQCAtMSw0ICsxLDQgQEAKLS8qIGRzb19kbGZjbi5jIC0qLSBtb2RlOkM7IGMtZmlsZS1zdHlsZTogImVheSIgLSotICovCisvKiBkc29fZGxmY24uYyAqLwogLyoKICAqIFdyaXR0ZW4gYnkgR2VvZmYgVGhvcnBlIChnZW9mZkBnZW9mZnRob3JwZS5uZXQpIGZvciB0aGUgT3BlblNTTCBwcm9qZWN0CiAgKiAyMDAwLgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vZHNvL2Rzb19saWIuYyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2Rzby9kc29fbGliLmMKaW5kZXggMDliOGVhZi4uMzMxMjQ1MCAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vZHNvL2Rzb19saWIuYworKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9kc28vZHNvX2xpYi5jCkBAIC0xLDQgKzEsNCBAQAotLyogZHNvX2xpYi5jIC0qLSBtb2RlOkM7IGMtZmlsZS1zdHlsZTogImVheSIgLSotICovCisvKiBkc29fbGliLmMgKi8KIC8qCiAgKiBXcml0dGVuIGJ5IEdlb2ZmIFRob3JwZSAoZ2VvZmZAZ2VvZmZ0aG9ycGUubmV0KSBmb3IgdGhlIE9wZW5TU0wgcHJvamVjdAogICogMjAwMC4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2Rzby9kc29fdm1zLmMgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9kc28vZHNvX3Ztcy5jCmluZGV4IGQwNzk0YjguLjFlZmQ4NGIgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2Rzby9kc29fdm1zLmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vZHNvL2Rzb192bXMuYwpAQCAtMSw0ICsxLDQgQEAKLS8qIGRzb192bXMuYyAtKi0gbW9kZTpDOyBjLWZpbGUtc3R5bGU6ICJlYXkiIC0qLSAqLworLyogZHNvX3Ztcy5jICovCiAvKgogICogV3JpdHRlbiBieSBSaWNoYXJkIExldml0dGUgKHJpY2hhcmRAbGV2aXR0ZS5vcmcpIGZvciB0aGUgT3BlblNTTCBwcm9qZWN0CiAgKiAyMDAwLgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vZHNvL2Rzb193aW4zMi5jIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vZHNvL2Rzb193aW4zMi5jCmluZGV4IDU0Yzk0M2QuLmVhZjE4MzEgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2Rzby9kc29fd2luMzIuYworKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9kc28vZHNvX3dpbjMyLmMKQEAgLTEsNCArMSw0IEBACi0vKiBkc29fd2luMzIuYyAtKi0gbW9kZTpDOyBjLWZpbGUtc3R5bGU6ICJlYXkiIC0qLSAqLworLyogZHNvX3dpbjMyLmMgKi8KIC8qCiAgKiBXcml0dGVuIGJ5IEdlb2ZmIFRob3JwZSAoZ2VvZmZAZ2VvZmZ0aG9ycGUubmV0KSBmb3IgdGhlIE9wZW5TU0wgcHJvamVjdAogICogMjAwMC4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2VjL2VjLmggYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9lYy9lYy5oCmluZGV4IGM0ZTdhZWEuLjJhOTM1ZmQgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2VjL2VjLmgKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vZWMvZWMuaApAQCAtMTA2LDcgKzEwNiw3IEBACiAgICAgICAgIC8qKiB0aGUgcG9pbnQgaXMgZW5jb2RlZCBhcyB6fHx4LCB3aGVyZSB0aGUgb2N0ZXQgeiBzcGVjaWZpZXMKICAgICAgICAgICogIHdoaWNoIHNvbHV0aW9uIG9mIHRoZSBxdWFkcmF0aWMgZXF1YXRpb24geSBpcyAgKi8KICAgICBQT0lOVF9DT05WRVJTSU9OX0NPTVBSRVNTRUQgPSAyLAotICAgICAgICAvKiogdGhlIHBvaW50IGlzIGVuY29kZWQgYXMgenx8eHx8eSwgd2hlcmUgeiBpcyB0aGUgb2N0ZXQgMHgwMiAgKi8KKyAgICAgICAgLyoqIHRoZSBwb2ludCBpcyBlbmNvZGVkIGFzIHp8fHh8fHksIHdoZXJlIHogaXMgdGhlIG9jdGV0IDB4MDQgICovCiAgICAgUE9JTlRfQ09OVkVSU0lPTl9VTkNPTVBSRVNTRUQgPSA0LAogICAgICAgICAvKiogdGhlIHBvaW50IGlzIGVuY29kZWQgYXMgenx8eHx8eSwgd2hlcmUgdGhlIG9jdGV0IHogc3BlY2lmaWVzCiAgICAgICAgICAqICB3aGljaCBzb2x1dGlvbiBvZiB0aGUgcXVhZHJhdGljIGVxdWF0aW9uIHkgaXMgICovCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9lYy9lY19hc24xLmMgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9lYy9lY19hc24xLmMKaW5kZXggMGJmMzE0Ni4uOTI5ODg0ZSAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vZWMvZWNfYXNuMS5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2VjL2VjX2FzbjEuYwpAQCAtOTczLDggKzk3Myw5IEBACiB7CiAgICAgRUNfR1JPVVAgKmdyb3VwID0gTlVMTDsKICAgICBFQ1BLUEFSQU1FVEVSUyAqcGFyYW1zID0gTlVMTDsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpwID0gKmluOwogCi0gICAgaWYgKChwYXJhbXMgPSBkMmlfRUNQS1BBUkFNRVRFUlMoTlVMTCwgaW4sIGxlbikpID09IE5VTEwpIHsKKyAgICBpZiAoKHBhcmFtcyA9IGQyaV9FQ1BLUEFSQU1FVEVSUyhOVUxMLCAmcCwgbGVuKSkgPT0gTlVMTCkgewogICAgICAgICBFQ2VycihFQ19GX0QySV9FQ1BLUEFSQU1FVEVSUywgRUNfUl9EMklfRUNQS1BBUkFNRVRFUlNfRkFJTFVSRSk7CiAgICAgICAgIEVDUEtQQVJBTUVURVJTX2ZyZWUocGFyYW1zKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC05OTIsNiArOTkzLDcgQEAKICAgICAgICAgKmEgPSBncm91cDsKIAogICAgIEVDUEtQQVJBTUVURVJTX2ZyZWUocGFyYW1zKTsKKyAgICAqaW4gPSBwOwogICAgIHJldHVybiAoZ3JvdXApOwogfQogCkBAIC0xMDE5LDggKzEwMjEsOSBAQAogICAgIGludCBvayA9IDA7CiAgICAgRUNfS0VZICpyZXQgPSBOVUxMOwogICAgIEVDX1BSSVZBVEVLRVkgKnByaXZfa2V5ID0gTlVMTDsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpwID0gKmluOwogCi0gICAgaWYgKChwcml2X2tleSA9IGQyaV9FQ19QUklWQVRFS0VZKE5VTEwsIGluLCBsZW4pKSA9PSBOVUxMKSB7CisgICAgaWYgKChwcml2X2tleSA9IGQyaV9FQ19QUklWQVRFS0VZKE5VTEwsICZwLCBsZW4pKSA9PSBOVUxMKSB7CiAgICAgICAgIEVDZXJyKEVDX0ZfRDJJX0VDUFJJVkFURUtFWSwgRVJSX1JfRUNfTElCKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtMTA5OSw2ICsxMTAyLDcgQEAKIAogICAgIGlmIChhKQogICAgICAgICAqYSA9IHJldDsKKyAgICAqaW4gPSBwOwogICAgIG9rID0gMTsKICBlcnI6CiAgICAgaWYgKCFvaykgewpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vZWMvZWNfa2V5LmMgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9lYy9lY19rZXkuYwppbmRleCBiMzliN2U5Li5jOTlkYjVhIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9lYy9lY19rZXkuYworKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9lYy9lY19rZXkuYwpAQCAtMzY5LDcgKzM2OSwxMCBAQAogICAgIEJOX0NUWCAqY3R4ID0gTlVMTDsKICAgICBCSUdOVU0gKnR4LCAqdHk7CiAgICAgRUNfUE9JTlQgKnBvaW50ID0gTlVMTDsKLSAgICBpbnQgb2sgPSAwLCB0bXBfbmlkLCBpc19jaGFyX3R3byA9IDA7CisgICAgaW50IG9rID0gMDsKKyNpZm5kZWYgT1BFTlNTTF9OT19FQzJNCisgICAgaW50IHRtcF9uaWQsIGlzX2NoYXJfdHdvID0gMDsKKyNlbmRpZgogCiAgICAgaWYgKCFrZXkgfHwgIWtleS0+Z3JvdXAgfHwgIXggfHwgIXkpIHsKICAgICAgICAgRUNlcnIoRUNfRl9FQ19LRVlfU0VUX1BVQkxJQ19LRVlfQUZGSU5FX0NPT1JESU5BVEVTLApAQCAtMzg1LDE0ICszODgsMTUgQEAKICAgICBpZiAoIXBvaW50KQogICAgICAgICBnb3RvIGVycjsKIAorICAgIHR4ID0gQk5fQ1RYX2dldChjdHgpOworICAgIHR5ID0gQk5fQ1RYX2dldChjdHgpOworCisjaWZuZGVmIE9QRU5TU0xfTk9fRUMyTQogICAgIHRtcF9uaWQgPSBFQ19NRVRIT0RfZ2V0X2ZpZWxkX3R5cGUoRUNfR1JPVVBfbWV0aG9kX29mKGtleS0+Z3JvdXApKTsKIAogICAgIGlmICh0bXBfbmlkID09IE5JRF9YOV82Ml9jaGFyYWN0ZXJpc3RpY190d29fZmllbGQpCiAgICAgICAgIGlzX2NoYXJfdHdvID0gMTsKIAotICAgIHR4ID0gQk5fQ1RYX2dldChjdHgpOwotICAgIHR5ID0gQk5fQ1RYX2dldChjdHgpOwotI2lmbmRlZiBPUEVOU1NMX05PX0VDMk0KICAgICBpZiAoaXNfY2hhcl90d28pIHsKICAgICAgICAgaWYgKCFFQ19QT0lOVF9zZXRfYWZmaW5lX2Nvb3JkaW5hdGVzX0dGMm0oa2V5LT5ncm91cCwgcG9pbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgsIHksIGN0eCkpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9lYy9lY3Rlc3QuYyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2VjL2VjdGVzdC5jCmluZGV4IGZlZGU1MzAuLmVmYWIwYjAgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2VjL2VjdGVzdC5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2VjL2VjdGVzdC5jCkBAIC0xNTkxLDcgKzE1OTEsNyBAQAogICAgIGludCBkZWdyZWU7CiAgICAgLyoKICAgICAgKiBReCwgUXkgYW5kIEQgYXJlIHRha2VuIGZyb20KLSAgICAgKiBodHRwOi8vY3NyY2RvY3V0Lmdvdi9ncm91cHMvU1QvdG9vbGtpdC9kb2N1bWVudHMvRXhhbXBsZXMvRUNEU0FfUHJpbWUucGRmCisgICAgICogaHR0cDovL2NzcmMubmlzdC5nb3YvZ3JvdXBzL1NUL3Rvb2xraXQvZG9jdW1lbnRzL0V4YW1wbGVzL0VDRFNBX1ByaW1lLnBkZgogICAgICAqIE90aGVyd2lzZSwgdmFsdWVzIGFyZSBzdGFuZGFyZCBjdXJ2ZSBwYXJhbWV0ZXJzIGZyb20gRklQUyAxODAtMwogICAgICAqLwogICAgIGNvbnN0IGNoYXIgKnAsICphLCAqYiwgKlF4LCAqUXksICpHeCwgKkd5LCAqb3JkZXIsICpkOwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vZW5naW5lL2VuZ19hbGwuYyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2VuZ2luZS9lbmdfYWxsLmMKaW5kZXggN2VkZjEyZS4uNjZjNDM3NCAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vZW5naW5lL2VuZ19hbGwuYworKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9lbmdpbmUvZW5nX2FsbC5jCkBAIC0xLDQgKzEsNCBAQAotLyogY3J5cHRvL2VuZ2luZS9lbmdfYWxsLmMgLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImVheSIgLSotICovCisvKiBjcnlwdG8vZW5naW5lL2VuZ19hbGwuYyAqLwogLyoKICAqIFdyaXR0ZW4gYnkgUmljaGFyZCBMZXZpdHRlIDxyaWNoYXJkQGxldml0dGUub3JnPiBmb3IgdGhlIE9wZW5TU0wgcHJvamVjdAogICogMjAwMC4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2VuZ2luZS9lbmdfY3J5cHRvZGV2LmMgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9lbmdpbmUvZW5nX2NyeXB0b2Rldi5jCmluZGV4IGJjYjkzNmQuLmE4YTI0ZDAgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2VuZ2luZS9lbmdfY3J5cHRvZGV2LmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vZW5naW5lL2VuZ19jcnlwdG9kZXYuYwpAQCAtMTIzMCwxNSArMTIzMCwxOCBAQAogICAgIGlmIChjcnlwdG9kZXZfYXN5bSgma29wLCBCTl9udW1fYnl0ZXMoZHNhLT5xKSwgciwKICAgICAgICAgICAgICAgICAgICAgICAgQk5fbnVtX2J5dGVzKGRzYS0+cSksIHMpID09IDApIHsKICAgICAgICAgZHNhcmV0ID0gRFNBX1NJR19uZXcoKTsKKyAgICAgICAgaWYgKGRzYXJldCA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBlcnI7CiAgICAgICAgIGRzYXJldC0+ciA9IHI7CiAgICAgICAgIGRzYXJldC0+cyA9IHM7CisgICAgICAgIHIgPSBzID0gTlVMTDsKICAgICB9IGVsc2UgewogICAgICAgICBjb25zdCBEU0FfTUVUSE9EICptZXRoID0gRFNBX09wZW5TU0woKTsKLSAgICAgICAgQk5fZnJlZShyKTsKLSAgICAgICAgQk5fZnJlZShzKTsKICAgICAgICAgZHNhcmV0ID0gKG1ldGgtPmRzYV9kb19zaWduKSAoZGdzdCwgZGxlbiwgZHNhKTsKICAgICB9CiAgZXJyOgorICAgIEJOX2ZyZWUocik7CisgICAgQk5fZnJlZShzKTsKICAgICBrb3AuY3JrX3BhcmFtWzBdLmNycF9wID0gTlVMTDsKICAgICB6YXBwYXJhbXMoJmtvcCk7CiAgICAgcmV0dXJuIChkc2FyZXQpOwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vZW5naW5lL2VuZ19saXN0LmMgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9lbmdpbmUvZW5nX2xpc3QuYwppbmRleCAzMzg0ZTMxLi44M2M5NWQ1IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9lbmdpbmUvZW5nX2xpc3QuYworKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9lbmdpbmUvZW5nX2xpc3QuYwpAQCAtMjYwLDYgKzI2MCw3IEBACiAgICAgfQogICAgIGlmICgoZS0+aWQgPT0gTlVMTCkgfHwgKGUtPm5hbWUgPT0gTlVMTCkpIHsKICAgICAgICAgRU5HSU5FZXJyKEVOR0lORV9GX0VOR0lORV9BREQsIEVOR0lORV9SX0lEX09SX05BTUVfTUlTU0lORyk7CisgICAgICAgIHJldHVybiAwOwogICAgIH0KICAgICBDUllQVE9fd19sb2NrKENSWVBUT19MT0NLX0VOR0lORSk7CiAgICAgaWYgKCFlbmdpbmVfbGlzdF9hZGQoZSkpIHsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2V2cC9lX2NhbWVsbGlhLmMgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9ldnAvZV9jYW1lbGxpYS5jCmluZGV4IDI3YmM0ODkuLmY3YjEzNWQgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2V2cC9lX2NhbWVsbGlhLmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vZXZwL2VfY2FtZWxsaWEuYwpAQCAtMSw0ICsxLDQgQEAKLS8qIGNyeXB0by9ldnAvZV9jYW1lbGxpYS5jIC0qLSBtb2RlOkM7IGMtZmlsZS1zdHlsZTogImVheSIgLSotICovCisvKiBjcnlwdG8vZXZwL2VfY2FtZWxsaWEuYyAqLwogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqIENvcHlyaWdodCAoYykgMjAwNiBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9ldnAvZV9kZXMzLmMgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9ldnAvZV9kZXMzLmMKaW5kZXggZGE1ZDRjOS4uYmNjMGRiNSAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vZXZwL2VfZGVzMy5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2V2cC9lX2RlczMuYwpAQCAtMjQ0LDcgKzI0NCw3IEBACiAgICAgREVTX2NibG9jayAqZGVza2V5ID0gKERFU19jYmxvY2sgKilrZXk7CiAjICBpZmRlZiBFVlBfQ0hFQ0tfREVTX0tFWQogICAgIGlmIChERVNfc2V0X2tleV9jaGVja2VkKCZkZXNrZXlbMF0sICZkYXRhKGN0eCktPmtzMSkKLSAgICAgICAgISAhREVTX3NldF9rZXlfY2hlY2tlZCgmZGVza2V5WzFdLCAmZGF0YShjdHgpLT5rczIpKQorICAgICAgICB8fCBERVNfc2V0X2tleV9jaGVja2VkKCZkZXNrZXlbMV0sICZkYXRhKGN0eCktPmtzMikpCiAgICAgICAgIHJldHVybiAwOwogIyAgZWxzZQogICAgIERFU19zZXRfa2V5X3VuY2hlY2tlZCgmZGVza2V5WzBdLCAmZGF0YShjdHgpLT5rczEpOwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vZXZwL2Vfb2xkLmMgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9ldnAvZV9vbGQuYwppbmRleCBjOTNmNWE1Li5hMjNkMTQzIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9ldnAvZV9vbGQuYworKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9ldnAvZV9vbGQuYwpAQCAtMSw0ICsxLDQgQEAKLS8qIGNyeXB0by9ldnAvZV9vbGQuYyAtKi0gbW9kZTpDOyBjLWZpbGUtc3R5bGU6ICJlYXkiIC0qLSAqLworLyogY3J5cHRvL2V2cC9lX29sZC5jICovCiAvKgogICogV3JpdHRlbiBieSBSaWNoYXJkIExldml0dGUgKHJpY2hhcmRAbGV2aXR0ZS5vcmcpIGZvciB0aGUgT3BlblNTTCBwcm9qZWN0CiAgKiAyMDA0LgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vZXZwL2Vfc2VlZC5jIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vZXZwL2Vfc2VlZC5jCmluZGV4IGM5NDhhOGYuLjcyNDlkMWIgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2V2cC9lX3NlZWQuYworKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9ldnAvZV9zZWVkLmMKQEAgLTEsNCArMSw0IEBACi0vKiBjcnlwdG8vZXZwL2Vfc2VlZC5jIC0qLSBtb2RlOkM7IGMtZmlsZS1zdHlsZTogImVheSIgLSotICovCisvKiBjcnlwdG8vZXZwL2Vfc2VlZC5jICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICogQ29weXJpZ2h0IChjKSAyMDA3IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2V2cC9lbmNvZGUuYyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2V2cC9lbmNvZGUuYwppbmRleCA2ODk0ZmQwLi5kY2Y5MzdmIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9ldnAvZW5jb2RlLmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vZXZwL2VuY29kZS5jCkBAIC02Myw5ICs2Myw5IEBACiAjaW5jbHVkZSAiY3J5cHRsaWIuaCIKICNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgogCitzdGF0aWMgdW5zaWduZWQgY2hhciBjb252X2FzY2lpMmJpbih1bnNpZ25lZCBjaGFyIGEpOwogI2lmbmRlZiBDSEFSU0VUX0VCQ0RJQwogIyBkZWZpbmUgY29udl9iaW4yYXNjaWkoYSkgICAgICAgKGRhdGFfYmluMmFzY2lpWyhhKSYweDNmXSkKLSMgZGVmaW5lIGNvbnZfYXNjaWkyYmluKGEpICAgICAgIChkYXRhX2FzY2lpMmJpblsoYSkmMHg3Zl0pCiAjZWxzZQogLyoKICAqIFdlIGFzc3VtZSB0aGF0IFBFTSBlbmNvZGVkIGZpbGVzIGFyZSBFQkNESUMgZmlsZXMgKGkuZS4sIHByaW50YWJsZSB0ZXh0CkBAIC03NCw3ICs3NCw2IEBACiAgKiBhcyB0aGUgdW5kZXJseWluZyB0ZXh0c3RyaW5nIGRhdGFfYmluMmFzY2lpW10gaXMgYWxyZWFkeSBFQkNESUMpCiAgKi8KICMgZGVmaW5lIGNvbnZfYmluMmFzY2lpKGEpICAgICAgIChkYXRhX2JpbjJhc2NpaVsoYSkmMHgzZl0pCi0jIGRlZmluZSBjb252X2FzY2lpMmJpbihhKSAgICAgICAoZGF0YV9hc2NpaTJiaW5bb3NfdG9hc2NpaVthXSYweDdmXSkKICNlbmRpZgogCiAvKi0KQEAgLTEwNiw2ICsxMDUsNyBAQAogI2RlZmluZSBCNjRfV1MgICAgICAgICAgICAgICAgICAweEUwCiAjZGVmaW5lIEI2NF9FUlJPUiAgICAgICAgICAgICAgIDB4RkYKICNkZWZpbmUgQjY0X05PVF9CQVNFNjQoYSkgICAgICAgKCgoYSl8MHgxMykgPT0gMHhGMykKKyNkZWZpbmUgQjY0X0JBU0U2NChhKSAgICAgICAgICAgIUI2NF9OT1RfQkFTRTY0KGEpCiAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGRhdGFfYXNjaWkyYmluWzEyOF0gPSB7CiAgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKQEAgLTEyNiw2ICsxMjYsMjMgQEAKICAgICAweDMxLCAweDMyLCAweDMzLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAogfTsKIAorI2lmbmRlZiBDSEFSU0VUX0VCQ0RJQworc3RhdGljIHVuc2lnbmVkIGNoYXIgY29udl9hc2NpaTJiaW4odW5zaWduZWQgY2hhciBhKQoreworICAgIGlmIChhICYgMHg4MCkKKyAgICAgICAgcmV0dXJuIEI2NF9FUlJPUjsKKyAgICByZXR1cm4gZGF0YV9hc2NpaTJiaW5bYV07Cit9CisjZWxzZQorc3RhdGljIHVuc2lnbmVkIGNoYXIgY29udl9hc2NpaTJiaW4odW5zaWduZWQgY2hhciBhKQoreworICAgIGEgPSBvc190b2FzY2lpW2FdOworICAgIGlmIChhICYgMHg4MCkKKyAgICAgICAgcmV0dXJuIEI2NF9FUlJPUjsKKyAgICByZXR1cm4gZGF0YV9hc2NpaTJiaW5bYV07Cit9CisjZW5kaWYKKwogdm9pZCBFVlBfRW5jb2RlSW5pdChFVlBfRU5DT0RFX0NUWCAqY3R4KQogewogICAgIGN0eC0+bGVuZ3RoID0gNDg7CkBAIC0xNDIsNyArMTU5LDcgQEAKICAgICAqb3V0bCA9IDA7CiAgICAgaWYgKGlubCA8PSAwKQogICAgICAgICByZXR1cm47Ci0gICAgT1BFTlNTTF9hc3NlcnQoY3R4LT5sZW5ndGggPD0gKGludClzaXplb2YoY3R4LT5lbmNfZGF0YSkpOworICAgIE9QRU5TU0xfcG9ydF9hc3NlcnQoY3R4LT5sZW5ndGggPD0gKGludClzaXplb2YoY3R4LT5lbmNfZGF0YSkpOwogICAgIGlmICgoY3R4LT5udW0gKyBpbmwpIDwgY3R4LT5sZW5ndGgpIHsKICAgICAgICAgT1BFTlNTTF9wb3J0X21lbWNweSgmKGN0eC0+ZW5jX2RhdGFbY3R4LT5udW1dKSwgaW4sIGlubCk7CiAgICAgICAgIGN0eC0+bnVtICs9IGlubDsKQEAgLTIyMSw4ICsyMzgsOSBAQAogCiB2b2lkIEVWUF9EZWNvZGVJbml0KEVWUF9FTkNPREVfQ1RYICpjdHgpCiB7Ci0gICAgY3R4LT5sZW5ndGggPSAzMDsKKyAgICAvKiBPbmx5IGN0eC0+bnVtIGlzIHVzZWQgZHVyaW5nIGRlY29kaW5nLiAqLwogICAgIGN0eC0+bnVtID0gMDsKKyAgICBjdHgtPmxlbmd0aCA9IDA7CiAgICAgY3R4LT5saW5lX251bSA9IDA7CiAgICAgY3R4LT5leHBlY3RfbmwgPSAwOwogfQpAQCAtMjMxLDEzOSArMjQ5LDEyMyBAQAogICogLTEgZm9yIGVycm9yCiAgKiAgMCBmb3IgbGFzdCBsaW5lCiAgKiAgMSBmb3IgZnVsbCBsaW5lCisgKgorICogTm90ZTogZXZlbiB0aG91Z2ggRVZQX0RlY29kZVVwZGF0ZSBhdHRlbXB0cyB0byBkZXRlY3QgYW5kIHJlcG9ydCBlbmQgb2YKKyAqIGNvbnRlbnQsIHRoZSBjb250ZXh0IGRvZXNuJ3QgY3VycmVudGx5IHJlbWVtYmVyIGl0IGFuZCB3aWxsIGFjY2VwdCBtb3JlIGRhdGEKKyAqIGluIHRoZSBuZXh0IGNhbGwuIFRoZXJlZm9yZSwgdGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgY2hlY2tpbmcgYW5kCisgKiByZWplY3RpbmcgYSAwIHJldHVybiB2YWx1ZSBpbiB0aGUgbWlkZGxlIG9mIGNvbnRlbnQuCisgKgorICogTm90ZTogZXZlbiB0aG91Z2ggRVZQX0RlY29kZVVwZGF0ZSBoYXMgaGlzdG9yaWNhbGx5IHRyaWVkIHRvIGRldGVjdCBlbmQgb2YKKyAqIGNvbnRlbnQgYmFzZWQgb24gbGluZSBsZW5ndGgsIHRoaXMgaGFzIG5ldmVyIHdvcmtlZCBwcm9wZXJseS4gVGhlcmVmb3JlLAorICogd2Ugbm93IHJldHVybiAwIHdoZW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZToKKyAqICAgLSBQYWRkaW5nIG9yIEI2NF9FT0Ygd2FzIGRldGVjdGVkIGFuZCB0aGUgbGFzdCBibG9jayBpcyBjb21wbGV0ZS4KKyAqICAgLSBJbnB1dCBoYXMgemVyby1sZW5ndGguCisgKiAtMSBpcyByZXR1cm5lZCBpZjoKKyAqICAgLSBJbnZhbGlkIGNoYXJhY3RlcnMgYXJlIGRldGVjdGVkLgorICogICAtIFRoZXJlIGlzIGV4dHJhIHRyYWlsaW5nIHBhZGRpbmcsIG9yIGRhdGEgYWZ0ZXIgcGFkZGluZy4KKyAqICAgLSBCNjRfRU9GIGlzIGRldGVjdGVkIGFmdGVyIGFuIGluY29tcGxldGUgYmFzZTY0IGJsb2NrLgogICovCiBpbnQgRVZQX0RlY29kZVVwZGF0ZShFVlBfRU5DT0RFX0NUWCAqY3R4LCB1bnNpZ25lZCBjaGFyICpvdXQsIGludCAqb3V0bCwKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCBpbnQgaW5sKQogewotICAgIGludCBzZW9mID0gLTEsIGVvZiA9IDAsIHJ2ID0gLTEsIHJldCA9IDAsIGksIHYsIHRtcCwgbiwgbG4sIGV4cF9ubDsKKyAgICBpbnQgc2VvZiA9IDAsIGVvZiA9IDAsIHJ2ID0gLTEsIHJldCA9IDAsIGksIHYsIHRtcCwgbiwgZGVjb2RlZF9sZW47CiAgICAgdW5zaWduZWQgY2hhciAqZDsKIAogICAgIG4gPSBjdHgtPm51bTsKICAgICBkID0gY3R4LT5lbmNfZGF0YTsKLSAgICBsbiA9IGN0eC0+bGluZV9udW07Ci0gICAgZXhwX25sID0gY3R4LT5leHBlY3Rfbmw7CiAKLSAgICAvKiBsYXN0IGxpbmUgb2YgaW5wdXQuICovCi0gICAgaWYgKChpbmwgPT0gMCkgfHwgKChuID09IDApICYmIChjb252X2FzY2lpMmJpbihpblswXSkgPT0gQjY0X0VPRikpKSB7CisgICAgaWYgKG4gPiAwICYmIGRbbiAtIDFdID09ICc9JykgeworICAgICAgICBlb2YrKzsKKyAgICAgICAgaWYgKG4gPiAxICYmIGRbbiAtIDJdID09ICc9JykKKyAgICAgICAgICAgIGVvZisrOworICAgIH0KKworICAgICAvKiBMZWdhY3kgYmVoYXZpb3VyOiBhbiBlbXB0eSBpbnB1dCBjaHVuayBzaWduYWxzIGVuZCBvZiBpbnB1dC4gKi8KKyAgICBpZiAoaW5sID09IDApIHsKICAgICAgICAgcnYgPSAwOwogICAgICAgICBnb3RvIGVuZDsKICAgICB9CiAKLSAgICAvKiBXZSBwYXJzZSB0aGUgaW5wdXQgZGF0YSAqLwogICAgIGZvciAoaSA9IDA7IGkgPCBpbmw7IGkrKykgewotICAgICAgICAvKiBJZiB0aGUgY3VycmVudCBsaW5lIGlzID4gODAgY2hhcmFjdGVycywgc2NyZWFtIGFsb3QgKi8KLSAgICAgICAgaWYgKGxuID49IDgwKSB7Ci0gICAgICAgICAgICBydiA9IC0xOwotICAgICAgICAgICAgZ290byBlbmQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBHZXQgY2hhciBhbmQgcHV0IGl0IGludG8gdGhlIGJ1ZmZlciAqLwogICAgICAgICB0bXAgPSAqKGluKyspOwogICAgICAgICB2ID0gY29udl9hc2NpaTJiaW4odG1wKTsKLSAgICAgICAgLyogb25seSBzYXZlIHRoZSBnb29kIGRhdGEgOi0pICovCi0gICAgICAgIGlmICghQjY0X05PVF9CQVNFNjQodikpIHsKLSAgICAgICAgICAgIE9QRU5TU0xfYXNzZXJ0KG4gPCAoaW50KXNpemVvZihjdHgtPmVuY19kYXRhKSk7Ci0gICAgICAgICAgICBkW24rK10gPSB0bXA7Ci0gICAgICAgICAgICBsbisrOwotICAgICAgICB9IGVsc2UgaWYgKHYgPT0gQjY0X0VSUk9SKSB7CisgICAgICAgIGlmICh2ID09IEI2NF9FUlJPUikgewogICAgICAgICAgICAgcnYgPSAtMTsKICAgICAgICAgICAgIGdvdG8gZW5kOwogICAgICAgICB9CiAKLSAgICAgICAgLyoKLSAgICAgICAgICogaGF2ZSB3ZSBzZWVuIGEgJz0nIHdoaWNoIGlzICdkZWZpbml0bHknIHRoZSBsYXN0IGlucHV0IGxpbmUuICBzZW9mCi0gICAgICAgICAqIHdpbGwgcG9pbnQgdG8gdGhlIGNoYXJhY3RlciB0aGF0IGhvbGRzIGl0LiBhbmQgZW9mIHdpbGwgaG9sZCBob3cKLSAgICAgICAgICogbWFueSBjaGFyYWN0ZXJzIHRvIGNob3Agb2ZmLgotICAgICAgICAgKi8KICAgICAgICAgaWYgKHRtcCA9PSAnPScpIHsKLSAgICAgICAgICAgIGlmIChzZW9mID09IC0xKQotICAgICAgICAgICAgICAgIHNlb2YgPSBuOwogICAgICAgICAgICAgZW9mKys7CisgICAgICAgIH0gZWxzZSBpZiAoZW9mID4gMCAmJiBCNjRfQkFTRTY0KHYpKSB7CisgICAgICAgICAgICAvKiBNb3JlIGRhdGEgYWZ0ZXIgcGFkZGluZy4gKi8KKyAgICAgICAgICAgIHJ2ID0gLTE7CisgICAgICAgICAgICBnb3RvIGVuZDsKICAgICAgICAgfQogCi0gICAgICAgIGlmICh2ID09IEI2NF9DUikgewotICAgICAgICAgICAgbG4gPSAwOwotICAgICAgICAgICAgaWYgKGV4cF9ubCkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKGVvZiA+IDIpIHsKKyAgICAgICAgICAgIHJ2ID0gLTE7CisgICAgICAgICAgICBnb3RvIGVuZDsKICAgICAgICAgfQogCi0gICAgICAgIC8qIGVvbG4gKi8KLSAgICAgICAgaWYgKHYgPT0gQjY0X0VPTE4pIHsKLSAgICAgICAgICAgIGxuID0gMDsKLSAgICAgICAgICAgIGlmIChleHBfbmwpIHsKLSAgICAgICAgICAgICAgICBleHBfbmwgPSAwOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGV4cF9ubCA9IDA7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogSWYgd2UgYXJlIGF0IHRoZSBlbmQgb2YgaW5wdXQgYW5kIGl0IGxvb2tzIGxpa2UgYSBsaW5lLCBwcm9jZXNzCi0gICAgICAgICAqIGl0LgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKCgoaSArIDEpID09IGlubCkgJiYgKCgobiAmIDMpID09IDApIHx8IGVvZikpIHsKLSAgICAgICAgICAgIHYgPSBCNjRfRU9GOwotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIEluIGNhc2UgdGhpbmdzIHdlcmUgZ2l2ZW4gdXMgaW4gcmVhbGx5IHNtYWxsIHJlY29yZHMgKHNvIHR3bwotICAgICAgICAgICAgICogJz0nIHdlcmUgZ2l2ZW4gaW4gc2VwYXJhdGUgdXBkYXRlcyksIGVvZiBtYXkgY29udGFpbiB0aGUKLSAgICAgICAgICAgICAqIGluY29ycmVjdCBudW1iZXIgb2YgZW5kaW5nIGJ5dGVzIHRvIHNraXAsIHNvIGxldCdzIHJlZG8gdGhlCi0gICAgICAgICAgICAgKiBjb3VudAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBlb2YgPSAwOwotICAgICAgICAgICAgaWYgKGRbbiAtIDFdID09ICc9JykKLSAgICAgICAgICAgICAgICBlb2YrKzsKLSAgICAgICAgICAgIGlmIChkW24gLSAyXSA9PSAnPScpCi0gICAgICAgICAgICAgICAgZW9mKys7Ci0gICAgICAgICAgICAvKiBUaGVyZSB3aWxsIG5ldmVyIGJlIG1vcmUgdGhhbiB0d28gJz0nICovCisgICAgICAgIGlmICh2ID09IEI2NF9FT0YpIHsKKyAgICAgICAgICAgIHNlb2YgPSAxOworICAgICAgICAgICAgZ290byB0YWlsOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKCh2ID09IEI2NF9FT0YgJiYgKG4gJiAzKSA9PSAwKSB8fCAobiA+PSA2NCkpIHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBUaGlzIGlzIG5lZWRlZCB0byB3b3JrIGNvcnJlY3RseSBvbiA2NCBieXRlIGlucHV0IGxpbmVzLiAgV2UKLSAgICAgICAgICAgICAqIHByb2Nlc3MgdGhlIGxpbmUgYW5kIHRoZW4gbmVlZCB0byBhY2NlcHQgdGhlICdcbicKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKCh2ICE9IEI2NF9FT0YpICYmIChuID49IDY0KSkKLSAgICAgICAgICAgICAgICBleHBfbmwgPSAxOwotICAgICAgICAgICAgaWYgKG4gPiAwKSB7Ci0gICAgICAgICAgICAgICAgdiA9IEVWUF9EZWNvZGVCbG9jayhvdXQsIGQsIG4pOwotICAgICAgICAgICAgICAgIG4gPSAwOwotICAgICAgICAgICAgICAgIGlmICh2IDwgMCkgewotICAgICAgICAgICAgICAgICAgICBydiA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gZW5kOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZW9mID4gdikgewotICAgICAgICAgICAgICAgICAgICBydiA9IC0xOwotICAgICAgICAgICAgICAgICAgICBnb3RvIGVuZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0ICs9ICh2IC0gZW9mKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZW9mID0gMTsKLSAgICAgICAgICAgICAgICB2ID0gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIFRoaXMgaXMgdGhlIGNhc2Ugd2hlcmUgd2UgaGF2ZSBoYWQgYSBzaG9ydCBidXQgdmFsaWQgaW5wdXQKLSAgICAgICAgICAgICAqIGxpbmUKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKCh2IDwgY3R4LT5sZW5ndGgpICYmIGVvZikgewotICAgICAgICAgICAgICAgIHJ2ID0gMDsKLSAgICAgICAgICAgICAgICBnb3RvIGVuZDsKLSAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgIGN0eC0+bGVuZ3RoID0gdjsKLQotICAgICAgICAgICAgaWYgKHNlb2YgPj0gMCkgewotICAgICAgICAgICAgICAgIHJ2ID0gMDsKKyAgICAgICAgLyogT25seSBzYXZlIHZhbGlkIGJhc2U2NCBjaGFyYWN0ZXJzLiAqLworICAgICAgICBpZiAoQjY0X0JBU0U2NCh2KSkgeworICAgICAgICAgICAgaWYgKG4gPj0gNjQpIHsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIFdlIGluY3JlbWVudCBuIG9uY2UgcGVyIGxvb3AsIGFuZCBlbXB0eSB0aGUgYnVmZmVyIGFzIHNvb24gYXMKKyAgICAgICAgICAgICAgICAgKiB3ZSByZWFjaCA2NCBjaGFyYWN0ZXJzLCBzbyB0aGlzIGNhbiBvbmx5IGhhcHBlbiBpZiBzb21lb25lJ3MKKyAgICAgICAgICAgICAgICAgKiBtYW51YWxseSBtZXNzZWQgd2l0aCB0aGUgY3R4LiBSZWZ1c2UgdG8gd3JpdGUgYW55IG1vcmUgZGF0YS4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBydiA9IC0xOwogICAgICAgICAgICAgICAgIGdvdG8gZW5kOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgb3V0ICs9IHY7CisgICAgICAgICAgICBPUEVOU1NMX2Fzc2VydChuIDwgKGludClzaXplb2YoY3R4LT5lbmNfZGF0YSkpOworICAgICAgICAgICAgZFtuKytdID0gdG1wOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG4gPT0gNjQpIHsKKyAgICAgICAgICAgIGRlY29kZWRfbGVuID0gRVZQX0RlY29kZUJsb2NrKG91dCwgZCwgbik7CisgICAgICAgICAgICBuID0gMDsKKyAgICAgICAgICAgIGlmIChkZWNvZGVkX2xlbiA8IDAgfHwgZW9mID4gZGVjb2RlZF9sZW4pIHsKKyAgICAgICAgICAgICAgICBydiA9IC0xOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0ICs9IGRlY29kZWRfbGVuIC0gZW9mOworICAgICAgICAgICAgb3V0ICs9IGRlY29kZWRfbGVuIC0gZW9mOwogICAgICAgICB9CiAgICAgfQotICAgIHJ2ID0gMTsKLSBlbmQ6CisKKyAgICAvKgorICAgICAqIExlZ2FjeSBiZWhhdmlvdXI6IGlmIHRoZSBjdXJyZW50IGxpbmUgaXMgYSBmdWxsIGJhc2U2NC1ibG9jayAoaS5lLiwgaGFzCisgICAgICogMCBtb2QgNCBiYXNlNjQgY2hhcmFjdGVycyksIGl0IGlzIHByb2Nlc3NlZCBpbW1lZGlhdGVseS4gV2Uga2VlcCB0aGlzCisgICAgICogYmVoYXZpb3VyIGFzIGFwcGxpY2F0aW9ucyBtYXkgbm90IGJlIGNhbGxpbmcgRVZQX0RlY29kZUZpbmFsIHByb3Blcmx5LgorICAgICAqLwordGFpbDoKKyAgICBpZiAobiA+IDApIHsKKyAgICAgICAgaWYgKChuICYgMykgPT0gMCkgeworICAgICAgICAgICAgZGVjb2RlZF9sZW4gPSBFVlBfRGVjb2RlQmxvY2sob3V0LCBkLCBuKTsKKyAgICAgICAgICAgIG4gPSAwOworICAgICAgICAgICAgaWYgKGRlY29kZWRfbGVuIDwgMCB8fCBlb2YgPiBkZWNvZGVkX2xlbikgeworICAgICAgICAgICAgICAgIHJ2ID0gLTE7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXQgKz0gKGRlY29kZWRfbGVuIC0gZW9mKTsKKyAgICAgICAgfSBlbHNlIGlmIChzZW9mKSB7CisgICAgICAgICAgICAvKiBFT0YgaW4gdGhlIG1pZGRsZSBvZiBhIGJhc2U2NCBibG9jay4gKi8KKyAgICAgICAgICAgIHJ2ID0gLTE7CisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJ2ID0gc2VvZiB8fCAobiA9PSAwICYmIGVvZikgPyAwIDogMTsKK2VuZDoKKyAgICAvKiBMZWdhY3kgYmVoYXZpb3VyLiBUaGlzIHNob3VsZCBwcm9iYWJseSByYXRoZXIgYmUgemVyb2VkIG9uIGVycm9yLiAqLwogICAgICpvdXRsID0gcmV0OwogICAgIGN0eC0+bnVtID0gbjsKLSAgICBjdHgtPmxpbmVfbnVtID0gbG47Ci0gICAgY3R4LT5leHBlY3RfbmwgPSBleHBfbmw7CiAgICAgcmV0dXJuIChydik7CiB9CiAKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2V2cC9ldnBfa2V5LmMgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9ldnAvZXZwX2tleS5jCmluZGV4IGNiYTg4NjcuLjJhYjdhODIgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2V2cC9ldnBfa2V5LmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vZXZwL2V2cF9rZXkuYwpAQCAtMTA5LDYgKzEwOSw4IEBACiAgICAgaWYgKChwcm9tcHQgPT0gTlVMTCkgJiYgKHByb21wdF9zdHJpbmdbMF0gIT0gJ1wwJykpCiAgICAgICAgIHByb21wdCA9IHByb21wdF9zdHJpbmc7CiAgICAgdWkgPSBVSV9uZXcoKTsKKyAgICBpZiAodWkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOwogICAgIFVJX2FkZF9pbnB1dF9zdHJpbmcodWksIHByb21wdCwgMCwgYnVmLCBtaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAobGVuID49IEJVRlNJWikgPyBCVUZTSVogLSAxIDogbGVuKTsKICAgICBpZiAodmVyaWZ5KQpAQCAtMTQzLDcgKzE0NSw3IEBACiAgICAgRVZQX01EX0NUWF9pbml0KCZjKTsKICAgICBmb3IgKDs7KSB7CiAgICAgICAgIGlmICghRVZQX0RpZ2VzdEluaXRfZXgoJmMsIG1kLCBOVUxMKSkKLSAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgZ290byBlcnI7CiAgICAgICAgIGlmIChhZGRtZCsrKQogICAgICAgICAgICAgaWYgKCFFVlBfRGlnZXN0VXBkYXRlKCZjLCAmKG1kX2J1ZlswXSksIG1kcykpCiAgICAgICAgICAgICAgICAgZ290byBlcnI7CkBAIC0xOTQsNiArMTk2LDYgQEAKICAgICBydiA9IHR5cGUtPmtleV9sZW47CiAgZXJyOgogICAgIEVWUF9NRF9DVFhfY2xlYW51cCgmYyk7Ci0gICAgT1BFTlNTTF9jbGVhbnNlKCYobWRfYnVmWzBdKSwgRVZQX01BWF9NRF9TSVpFKTsKKyAgICBPUEVOU1NMX2NsZWFuc2UobWRfYnVmLCBzaXplb2YobWRfYnVmKSk7CiAgICAgcmV0dXJuIHJ2OwogfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vZXZwL2V2cF9saWIuYyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2V2cC9ldnBfbGliLmMKaW5kZXggMTVjMWVmOS4uYjdmMGM1MCAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vZXZwL2V2cF9saWIuYworKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9ldnAvZXZwX2xpYi5jCkBAIC03MCw5ICs3MCwxOSBAQAogCiAgICAgaWYgKGMtPmNpcGhlci0+c2V0X2FzbjFfcGFyYW1ldGVycyAhPSBOVUxMKQogICAgICAgICByZXQgPSBjLT5jaXBoZXItPnNldF9hc24xX3BhcmFtZXRlcnMoYywgdHlwZSk7Ci0gICAgZWxzZSBpZiAoYy0+Y2lwaGVyLT5mbGFncyAmIEVWUF9DSVBIX0ZMQUdfREVGQVVMVF9BU04xKQotICAgICAgICByZXQgPSBFVlBfQ0lQSEVSX3NldF9hc24xX2l2KGMsIHR5cGUpOwotICAgIGVsc2UKKyAgICBlbHNlIGlmIChjLT5jaXBoZXItPmZsYWdzICYgRVZQX0NJUEhfRkxBR19ERUZBVUxUX0FTTjEpIHsKKyAgICAgICAgc3dpdGNoIChFVlBfQ0lQSEVSX0NUWF9tb2RlKGMpKSB7CisKKyAgICAgICAgY2FzZSBFVlBfQ0lQSF9HQ01fTU9ERToKKyAgICAgICAgY2FzZSBFVlBfQ0lQSF9DQ01fTU9ERToKKyAgICAgICAgY2FzZSBFVlBfQ0lQSF9YVFNfTU9ERToKKyAgICAgICAgICAgIHJldCA9IC0xOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldCA9IEVWUF9DSVBIRVJfc2V0X2FzbjFfaXYoYywgdHlwZSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UKICAgICAgICAgcmV0ID0gLTE7CiAgICAgcmV0dXJuIChyZXQpOwogfQpAQCAtODMsOSArOTMsMjAgQEAKIAogICAgIGlmIChjLT5jaXBoZXItPmdldF9hc24xX3BhcmFtZXRlcnMgIT0gTlVMTCkKICAgICAgICAgcmV0ID0gYy0+Y2lwaGVyLT5nZXRfYXNuMV9wYXJhbWV0ZXJzKGMsIHR5cGUpOwotICAgIGVsc2UgaWYgKGMtPmNpcGhlci0+ZmxhZ3MgJiBFVlBfQ0lQSF9GTEFHX0RFRkFVTFRfQVNOMSkKLSAgICAgICAgcmV0ID0gRVZQX0NJUEhFUl9nZXRfYXNuMV9pdihjLCB0eXBlKTsKLSAgICBlbHNlCisgICAgZWxzZSBpZiAoYy0+Y2lwaGVyLT5mbGFncyAmIEVWUF9DSVBIX0ZMQUdfREVGQVVMVF9BU04xKSB7CisgICAgICAgIHN3aXRjaCAoRVZQX0NJUEhFUl9DVFhfbW9kZShjKSkgeworCisgICAgICAgIGNhc2UgRVZQX0NJUEhfR0NNX01PREU6CisgICAgICAgIGNhc2UgRVZQX0NJUEhfQ0NNX01PREU6CisgICAgICAgIGNhc2UgRVZQX0NJUEhfWFRTX01PREU6CisgICAgICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXQgPSBFVlBfQ0lQSEVSX2dldF9hc24xX2l2KGMsIHR5cGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9IGVsc2UKICAgICAgICAgcmV0ID0gLTE7CiAgICAgcmV0dXJuIChyZXQpOwogfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vZXZwL2V2cF9wYmUuYyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2V2cC9ldnBfcGJlLmMKaW5kZXggMDk2MjI0Mi4uZmZjN2UyMiAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vZXZwL2V2cF9wYmUuYworKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9ldnAvZXZwX3BiZS5jCkBAIC0yMzEsMTIgKzIzMSwxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZF9uaWQsIEVWUF9QQkVfS0VZR0VOICprZXlnZW4pCiB7CiAgICAgRVZQX1BCRV9DVEwgKnBiZV90bXA7Ci0gICAgaWYgKCFwYmVfYWxncykKKworICAgIGlmIChwYmVfYWxncyA9PSBOVUxMKSB7CiAgICAgICAgIHBiZV9hbGdzID0gc2tfRVZQX1BCRV9DVExfbmV3KHBiZV9jbXApOwotICAgIGlmICghKHBiZV90bXAgPSAoRVZQX1BCRV9DVEwgKilPUEVOU1NMX21hbGxvYyhzaXplb2YoRVZQX1BCRV9DVEwpKSkpIHsKLSAgICAgICAgRVZQZXJyKEVWUF9GX0VWUF9QQkVfQUxHX0FERF9UWVBFLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7Ci0gICAgICAgIHJldHVybiAwOworICAgICAgICBpZiAocGJlX2FsZ3MgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZXJyOwogICAgIH0KKworICAgIGlmICgocGJlX3RtcCA9IE9QRU5TU0xfcG9ydF9tYWxsb2Moc2l6ZW9mKCpwYmVfdG1wKSkpID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyOworCiAgICAgcGJlX3RtcC0+cGJlX3R5cGUgPSBwYmVfdHlwZTsKICAgICBwYmVfdG1wLT5wYmVfbmlkID0gcGJlX25pZDsKICAgICBwYmVfdG1wLT5jaXBoZXJfbmlkID0gY2lwaGVyX25pZDsKQEAgLTI0NSw2ICsyNDksMTAgQEAKIAogICAgIHNrX0VWUF9QQkVfQ1RMX3B1c2gocGJlX2FsZ3MsIHBiZV90bXApOwogICAgIHJldHVybiAxOworCisgZXJyOgorICAgIEVWUGVycihFVlBfRl9FVlBfUEJFX0FMR19BRERfVFlQRSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIHJldHVybiAwOwogfQogCiBpbnQgRVZQX1BCRV9hbGdfYWRkKGludCBuaWQsIGNvbnN0IEVWUF9DSVBIRVIgKmNpcGhlciwgY29uc3QgRVZQX01EICptZCwKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2V2cC9wX2xpYi5jIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vZXZwL3BfbGliLmMKaW5kZXggOTIyMDUyOC4uOGRhOTAwZSAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vZXZwL3BfbGliLmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vZXZwL3BfbGliLmMKQEAgLTI1Niw3ICsyNTYsNyBAQAogCiBpbnQgRVZQX1BLRVlfYXNzaWduKEVWUF9QS0VZICpwa2V5LCBpbnQgdHlwZSwgdm9pZCAqa2V5KQogewotICAgIGlmICghRVZQX1BLRVlfc2V0X3R5cGUocGtleSwgdHlwZSkpCisgICAgaWYgKHBrZXkgPT0gTlVMTCB8fCAhRVZQX1BLRVlfc2V0X3R5cGUocGtleSwgdHlwZSkpCiAgICAgICAgIHJldHVybiAwOwogICAgIHBrZXktPnBrZXkucHRyID0ga2V5OwogICAgIHJldHVybiAoa2V5ICE9IE5VTEwpOwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vZXZwL3BtZXRoX2duLmMgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9ldnAvcG1ldGhfZ24uYwppbmRleCA1NWIzMTIwLi5iN2VlNDFlIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9ldnAvcG1ldGhfZ24uYworKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9ldnAvcG1ldGhfZ24uYwpAQCAtOTksMTIgKzk5LDE3IEBACiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKLSAgICBpZiAoIXBwa2V5KQorICAgIGlmIChwcGtleSA9PSBOVUxMKQogICAgICAgICByZXR1cm4gLTE7CiAKLSAgICBpZiAoISpwcGtleSkKKyAgICBpZiAoKnBwa2V5ID09IE5VTEwpCiAgICAgICAgICpwcGtleSA9IEVWUF9QS0VZX25ldygpOwogCisgICAgaWYgKCpwcGtleSA9PSBOVUxMKSB7CisgICAgICAgIEVWUGVycihFVlBfRl9FVlBfUEtFWV9QQVJBTUdFTiwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCiAgICAgcmV0ID0gY3R4LT5wbWV0aC0+cGFyYW1nZW4oY3R4LCAqcHBrZXkpOwogICAgIGlmIChyZXQgPD0gMCkgewogICAgICAgICBFVlBfUEtFWV9mcmVlKCpwcGtleSk7CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9obWFjL2htX2FtZXRoLmMgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9obWFjL2htX2FtZXRoLmMKaW5kZXggNDM1OGYwYS4uNmJlZDNhMiAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vaG1hYy9obV9hbWV0aC5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2htYWMvaG1fYW1ldGguYwpAQCAtMTExLDkgKzExMSwxNCBAQAogICAgIEFTTjFfT0NURVRfU1RSSU5HICpvczsKICAgICBvcyA9IEFTTjFfT0NURVRfU1RSSU5HX25ldygpOwogICAgIGlmICghb3MgfHwgIUFTTjFfT0NURVRfU1RSSU5HX3NldChvcywgKnBkZXIsIGRlcmxlbikpCi0gICAgICAgIHJldHVybiAwOwotICAgIEVWUF9QS0VZX2Fzc2lnbihwa2V5LCBFVlBfUEtFWV9ITUFDLCBvcyk7CisgICAgICAgIGdvdG8gZXJyOworICAgIGlmICghRVZQX1BLRVlfYXNzaWduKHBrZXksIEVWUF9QS0VZX0hNQUMsIG9zKSkKKyAgICAgICAgZ290byBlcnI7CiAgICAgcmV0dXJuIDE7CisKKyBlcnI6CisgICAgQVNOMV9PQ1RFVF9TVFJJTkdfZnJlZShvcyk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgb2xkX2htYWNfZW5jb2RlKGNvbnN0IEVWUF9QS0VZICpwa2V5LCB1bnNpZ25lZCBjaGFyICoqcGRlcikKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2pwYWtlL2pwYWtlLmMgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9qcGFrZS9qcGFrZS5jCmluZGV4IGVkMmU4ODguLmFjODUzZDQgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL2pwYWtlL2pwYWtlLmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vanBha2UvanBha2UuYwpAQCAtMjE4LDYgKzIxOCw5IEBACiAgICAgQklHTlVNICp0MyA9IEJOX25ldygpOwogICAgIGludCByZXQgPSAwOwogCisgICAgaWYgKGggPT0gTlVMTCB8fCB0MSA9PSBOVUxMIHx8IHQyID09IE5VTEwgfHwgdDMgPT0gTlVMTCkKKyAgICAgICAgZ290byBlbmQ7CisKICAgICB6a3BfaGFzaChoLCB6a3BnLCBwLCBjdHgtPnAucGVlcl9uYW1lKTsKIAogICAgIC8qIHQxID0gZ15iICovCkBAIC0yMzMsNiArMjM2LDcgQEAKICAgICBlbHNlCiAgICAgICAgIEpQQUtFZXJyKEpQQUtFX0ZfVkVSSUZZX1pLUCwgSlBBS0VfUl9aS1BfVkVSSUZZX0ZBSUxFRCk7CiAKK2VuZDoKICAgICAvKiBjbGVhbnVwICovCiAgICAgQk5fZnJlZSh0Myk7CiAgICAgQk5fZnJlZSh0Mik7CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9tZW1fY2xyLmMgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9tZW1fY2xyLmMKaW5kZXggYWI4MmI0Mi4uM2Q1NjEyZiAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vbWVtX2Nsci5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL21lbV9jbHIuYwpAQCAtMSw0ICsxLDQgQEAKLS8qIGNyeXB0by9tZW1fY2xyLmMgLSotIG1vZGU6QzsgYy1maWxlLXN0eWxlOiAiZWF5IiAtKi0gKi8KKy8qIGNyeXB0by9tZW1fY2xyLmMgKi8KIC8qCiAgKiBXcml0dGVuIGJ5IEdlb2ZmIFRob3JwZSAoZ2VvZmZAZ2VvZmZ0aG9ycGUubmV0KSBmb3IgdGhlIE9wZW5TU0wgcHJvamVjdAogICogMjAwMi4KQEAgLTY5LDYgKzY5LDEwIEBACiB7CiAgICAgdW5zaWduZWQgY2hhciAqcCA9IHB0cjsKICAgICBzaXplX3QgbG9vcCA9IGxlbiwgY3RyID0gY2xlYW5zZV9jdHI7CisKKyAgICBpZiAocHRyID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKwogICAgIHdoaWxlIChsb29wLS0pIHsKICAgICAgICAgKihwKyspID0gKHVuc2lnbmVkIGNoYXIpY3RyOwogICAgICAgICBjdHIgKz0gKDE3ICsgKChzaXplX3QpcCAmIDB4RikpOwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vbW9kZXMvYXNtL2doYXNoLWFybXY0LnBsIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vbW9kZXMvYXNtL2doYXNoLWFybXY0LnBsCmluZGV4IGQ5MTU4NmUuLmU0NmY4ZTMgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL21vZGVzL2FzbS9naGFzaC1hcm12NC5wbAorKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9tb2Rlcy9hc20vZ2hhc2gtYXJtdjQucGwKQEAgLTM3NCw4ICszNzQsOCBAQAogCXZkdXAuOAkJJHhpLGAmRGxvKCIkSU4iKWBbMF0JQCBicm9hZGNhc3QgbG93ZXN0IGJ5dGUKIC5MaW5uZXJfbmVvbjoKIAlzdWJzCQkkY250LCRjbnQsIzEKLQl2bXVsbC5wOAkkUWxvLCRIbG8sJHhpCQlAIEgubG+3WGlbaV0KLQl2bXVsbC5wOAkkUWhpLCRIaGksJHhpCQlAIEguaGm3WGlbaV0KKwl2bXVsbC5wOAkkUWxvLCRIbG8sJHhpCQlAIEgubG/Ct1hpW2ldCisJdm11bGwucDgJJFFoaSwkSGhpLCR4aQkJQCBILmhpwrdYaVtpXQogCXZleHQuOAkJJElOLCR6ZXJvLCMxCQlAIElOPj49OAogCiAJdmVvcgkJJFosJFFwb3N0CQlAIG1vZHVsby1zY2hlZHVsZWQgcGFydApAQCAtMzg4LDcgKzM4OCw3IEBACiAJdnNsaS44CQkkWm8sJFQsIzEJCUAgY29tcG9zZSB0aGUgImNhcnJ5IiBieXRlCiAJdmV4dC44CQkkWiwkemVybywjMQkJQCBaPj49OAogCi0Jdm11bGwucDgJJFIsJFpvLCRtb2QJCUAgImNhcnJ5IrcweGUxCisJdm11bGwucDgJJFIsJFpvLCRtb2QJCUAgImNhcnJ5IsK3MHhlMQogCXZzaHIudTgJCSRabywkVCwjNwkJQCBzYXZlIFoncyBib3R0b20gYml0CiAJdmV4dC44CQkkUXBvc3QsJFFsbywkemVybywjMQlAIFFsbz4+PTgKIAl2ZW9yCQkkWiwkUWhpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9tb2Rlcy9hc20vZ2hhc2gteDg2LnBsIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vbW9kZXMvYXNtL2doYXNoLXg4Ni5wbAppbmRleCA4M2M3MjdlLi4yNDI2Y2QwIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9tb2Rlcy9hc20vZ2hhc2gteDg2LnBsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL21vZGVzL2FzbS9naGFzaC14ODYucGwKQEAgLTM0Niw3ICszNDYsNyBAQAogIyBlZmZlY3RpdmUgYWRkcmVzcyBjYWxjdWxhdGlvbiBhbmQgZmluYWxseSBtZXJnZSBvZiB2YWx1ZSB0byBaLmhpLgogIyBSZWZlcmVuY2UgdG8gcmVtXzRiaXQgaXMgc2NoZWR1bGVkIHNvIGxhdGUgdGhhdCBJIGhhZCB0byA+PjQKICMgcmVtXzRiaXQgZWxlbWVudHMuIFRoaXMgcmVzdWx0ZWQgaW4gMjAtNDUlIHByb2NlbnQgaW1wcm92ZW1lbnQKLSMgb24gY29udGVtcG9yYXJ5ILUtYXJjaHMuCisjIG9uIGNvbnRlbXBvcmFyeSDCtS1hcmNocy4KIHsKICAgICBteSAkY250OwogICAgIG15ICRyZW1fNGJpdCA9ICJlYXgiOwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vb19kaXIuYyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL29fZGlyLmMKaW5kZXggMDFhOThkZi4uYzkwYjk1ZiAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vb19kaXIuYworKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9vX2Rpci5jCkBAIC0xLDQgKzEsNCBAQAotLyogY3J5cHRvL29fZGlyLmMgLSotIG1vZGU6QzsgYy1maWxlLXN0eWxlOiAiZWF5IiAtKi0gKi8KKy8qIGNyeXB0by9vX2Rpci5jICovCiAvKgogICogV3JpdHRlbiBieSBSaWNoYXJkIExldml0dGUgKHJpY2hhcmRAbGV2aXR0ZS5vcmcpIGZvciB0aGUgT3BlblNTTCBwcm9qZWN0CiAgKiAyMDA0LgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vb19kaXIuaCBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL29fZGlyLmgKaW5kZXggNmMxYjg4MS4uODEyNTkxOCAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vb19kaXIuaAorKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9vX2Rpci5oCkBAIC0xLDQgKzEsNCBAQAotLyogY3J5cHRvL29fZGlyLmggLSotIG1vZGU6QzsgYy1maWxlLXN0eWxlOiAiZWF5IiAtKi0gKi8KKy8qIGNyeXB0by9vX2Rpci5oICovCiAvKgogICogQ29waWVkIGZyb20gUmljaGFyZCBMZXZpdHRlJ3MgKHJpY2hhcmRAbGV2aXR0ZS5vcmcpIExQIGxpYnJhcnkuICBBbGwKICAqIHN5bWJvbCBuYW1lcyBoYXZlIGJlZW4gY2hhbmdlZCwgd2l0aCBwZXJtaXNzaW9uIGZyb20gdGhlIGF1dGhvci4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL29fZGlyX3Rlc3QuYyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL29fZGlyX3Rlc3QuYwppbmRleCA3Y2RiYmJjLi42MDQzNmI3IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9vX2Rpcl90ZXN0LmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vb19kaXJfdGVzdC5jCkBAIC0xLDQgKzEsNCBAQAotLyogY3J5cHRvL29fZGlyLmggLSotIG1vZGU6QzsgYy1maWxlLXN0eWxlOiAiZWF5IiAtKi0gKi8KKy8qIGNyeXB0by9vX2Rpci5oICovCiAvKgogICogQ29waWVkIGZyb20gUmljaGFyZCBMZXZpdHRlJ3MgKHJpY2hhcmRAbGV2aXR0ZS5vcmcpIExQIGxpYnJhcnkuICBBbGwKICAqIHN5bWJvbCBuYW1lcyBoYXZlIGJlZW4gY2hhbmdlZCwgd2l0aCBwZXJtaXNzaW9uIGZyb20gdGhlIGF1dGhvci4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL29fc3RyLmMgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9vX3N0ci5jCmluZGV4IDk1ZWNmMDQuLjMyNWI0OGUgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL29fc3RyLmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vb19zdHIuYwpAQCAtMSw0ICsxLDQgQEAKLS8qIGNyeXB0by9vX3N0ci5jIC0qLSBtb2RlOkM7IGMtZmlsZS1zdHlsZTogImVheSIgLSotICovCisvKiBjcnlwdG8vb19zdHIuYyAqLwogLyoKICAqIFdyaXR0ZW4gYnkgUmljaGFyZCBMZXZpdHRlIChyaWNoYXJkQGxldml0dGUub3JnKSBmb3IgdGhlIE9wZW5TU0wgcHJvamVjdAogICogMjAwMy4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL29fc3RyLmggYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9vX3N0ci5oCmluZGV4IDUzMTM1MjguLmZhNTEyZWIgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL29fc3RyLmgKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vb19zdHIuaApAQCAtMSw0ICsxLDQgQEAKLS8qIGNyeXB0by9vX3N0ci5oIC0qLSBtb2RlOkM7IGMtZmlsZS1zdHlsZTogImVheSIgLSotICovCisvKiBjcnlwdG8vb19zdHIuaCAqLwogLyoKICAqIFdyaXR0ZW4gYnkgUmljaGFyZCBMZXZpdHRlIChyaWNoYXJkQGxldml0dGUub3JnKSBmb3IgdGhlIE9wZW5TU0wgcHJvamVjdAogICogMjAwMy4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL29fdGltZS5jIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vb190aW1lLmMKaW5kZXggZWU2Yzc4MC4uZjIxZmU3OSAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vb190aW1lLmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vb190aW1lLmMKQEAgLTEsNCArMSw0IEBACi0vKiBjcnlwdG8vb190aW1lLmMgLSotIG1vZGU6QzsgYy1maWxlLXN0eWxlOiAiZWF5IiAtKi0gKi8KKy8qIGNyeXB0by9vX3RpbWUuYyAqLwogLyoKICAqIFdyaXR0ZW4gYnkgUmljaGFyZCBMZXZpdHRlIChyaWNoYXJkQGxldml0dGUub3JnKSBmb3IgdGhlIE9wZW5TU0wgcHJvamVjdAogICogMjAwMS4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL29fdGltZS5oIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vb190aW1lLmgKaW5kZXggNzAwZjJlZi4uMmFkODhlMSAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vb190aW1lLmgKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vb190aW1lLmgKQEAgLTEsNCArMSw0IEBACi0vKiBjcnlwdG8vb190aW1lLmggLSotIG1vZGU6QzsgYy1maWxlLXN0eWxlOiAiZWF5IiAtKi0gKi8KKy8qIGNyeXB0by9vX3RpbWUuaCAqLwogLyoKICAqIFdyaXR0ZW4gYnkgUmljaGFyZCBMZXZpdHRlIChyaWNoYXJkQGxldml0dGUub3JnKSBmb3IgdGhlIE9wZW5TU0wgcHJvamVjdAogICogMjAwMS4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL29jc3Avb2NzcF9saWIuYyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL29jc3Avb2NzcF9saWIuYwppbmRleCA2ZmZlYjM5Li5lY2ZiYjliIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9vY3NwL29jc3BfbGliLmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vb2NzcC9vY3NwX2xpYi5jCkBAIC0yNDksMTIgKzI0OSw2IEBACiAgICAgaWYgKChwID0gT1BFTlNTTF9wb3J0X3N0cmNocihwLCAnOicpKSkgewogICAgICAgICAqcCA9IDA7CiAgICAgICAgIHBvcnQgPSBwICsgMTsKLSAgICB9IGVsc2UgewotICAgICAgICAvKiBOb3QgZm91bmQ6IHNldCBkZWZhdWx0IHBvcnQgKi8KLSAgICAgICAgaWYgKCpwc3NsKQotICAgICAgICAgICAgcG9ydCA9ICI0NDMiOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBwb3J0ID0gIjgwIjsKICAgICB9CiAKICAgICAqcHBvcnQgPSBCVUZfc3RyZHVwKHBvcnQpOwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vb2NzcC9vY3NwX3Bybi5jIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vb2NzcC9vY3NwX3Bybi5jCmluZGV4IDE4MzQyNTYuLjQ3ZDVmODMgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL29jc3Avb2NzcF9wcm4uYworKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9vY3NwL29jc3BfcHJuLmMKQEAgLTIxMiw4ICsyMTIsNyBAQAogICAgICAgICByZXR1cm4gMTsKICAgICB9CiAKLSAgICBpID0gQVNOMV9TVFJJTkdfbGVuZ3RoKHJiLT5yZXNwb25zZSk7Ci0gICAgaWYgKCEoYnIgPSBPQ1NQX3Jlc3BvbnNlX2dldDFfYmFzaWMobykpKQorICAgIGlmICgoYnIgPSBPQ1NQX3Jlc3BvbnNlX2dldDFfYmFzaWMobykpID09IE5VTEwpCiAgICAgICAgIGdvdG8gZXJyOwogICAgIHJkID0gYnItPnRic1Jlc3BvbnNlRGF0YTsKICAgICBsID0gQVNOMV9JTlRFR0VSX2dldChyZC0+dmVyc2lvbik7CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9vcGVuc3NsY29uZi5oLmluIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vb3BlbnNzbGNvbmYuaC5pbgppbmRleCA4MTQzMDliLi43YTFjODVkIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9vcGVuc3NsY29uZi5oLmluCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL29wZW5zc2xjb25mLmguaW4KQEAgLTEyMCw3ICsxMjAsNyBAQAogICAgb3B0aW1pemF0aW9uIG9wdGlvbnMuICBPbGRlciBTcGFyYydzIHdvcmsgYmV0dGVyIHdpdGggb25seSBVTlJPTEwsIGJ1dAogICAgdGhlcmUncyBubyB3YXkgdG8gdGVsbCBhdCBjb21waWxlIHRpbWUgd2hhdCBpdCBpcyB5b3UncmUgcnVubmluZyBvbiAqLwogIAotI2lmIGRlZmluZWQoIHN1biApCQkvKiBOZXdlciBTcGFyYydzICovCisjaWYgZGVmaW5lZCggX19zdW4gKSB8fCBkZWZpbmVkICggc3VuICkJCS8qIE5ld2VyIFNwYXJjJ3MgKi8KICMgIGRlZmluZSBERVNfUFRSCiAjICBkZWZpbmUgREVTX1JJU0MxCiAjICBkZWZpbmUgREVTX1VOUk9MTApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vb3BlbnNzbHYuaCBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL29wZW5zc2x2LmgKaW5kZXggYmQ2Njk5OS4uM2FmNzFjNCAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vb3BlbnNzbHYuaAorKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9vcGVuc3Nsdi5oCkBAIC0zMCwxMSArMzAsMTEgQEAKICAqIChQcmlvciB0byAwLjkuNWEgYmV0YTEsIGEgZGlmZmVyZW50IHNjaGVtZSB3YXMgdXNlZDogTU1OTkZGUkJCIGZvcgogICogIG1ham9yIG1pbm9yIGZpeCBmaW5hbCBwYXRjaC9iZXRhKQogICovCi0jIGRlZmluZSBPUEVOU1NMX1ZFUlNJT05fTlVNQkVSICAweDEwMDAxMTBmTAorIyBkZWZpbmUgT1BFTlNTTF9WRVJTSU9OX05VTUJFUiAgMHgxMDAwMTEyZkwKICMgaWZkZWYgT1BFTlNTTF9GSVBTCi0jICBkZWZpbmUgT1BFTlNTTF9WRVJTSU9OX1RFWFQgICAgIk9wZW5TU0wgMS4wLjFwLWZpcHMgOSBKdWwgMjAxNSIKKyMgIGRlZmluZSBPUEVOU1NMX1ZFUlNJT05fVEVYVCAgICAiT3BlblNTTCAxLjAuMXItZmlwcyAgMjggSmFuIDIwMTYiCiAjIGVsc2UKLSMgIGRlZmluZSBPUEVOU1NMX1ZFUlNJT05fVEVYVCAgICAiT3BlblNTTCAxLjAuMXAgOSBKdWwgMjAxNSIKKyMgIGRlZmluZSBPUEVOU1NMX1ZFUlNJT05fVEVYVCAgICAiT3BlblNTTCAxLjAuMXIgIDI4IEphbiAyMDE2IgogIyBlbmRpZgogIyBkZWZpbmUgT1BFTlNTTF9WRVJTSU9OX1BURVhUICAgIiBwYXJ0IG9mICIgT1BFTlNTTF9WRVJTSU9OX1RFWFQKIApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vcGVtL3BlbV9pbmZvLmMgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9wZW0vcGVtX2luZm8uYwppbmRleCAzZjdkYTBlLi45NDFlMDVmIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9wZW0vcGVtX2luZm8uYworKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9wZW0vcGVtX2luZm8uYwpAQCAtMTc1LDYgKzE3NSw4IEBACiAgICAgICAgICAgICB4aS0+ZW5jX2xlbiA9IDA7CiAKICAgICAgICAgICAgIHhpLT54X3BrZXkgPSBYNTA5X1BLRVlfbmV3KCk7CisgICAgICAgICAgICBpZiAoeGktPnhfcGtleSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyOwogICAgICAgICAgICAgcHR5cGUgPSBFVlBfUEtFWV9SU0E7CiAgICAgICAgICAgICBwcCA9ICZ4aS0+eF9wa2V5LT5kZWNfcGtleTsKICAgICAgICAgICAgIGlmICgoaW50KU9QRU5TU0xfcG9ydF9zdHJsZW4oaGVhZGVyKSA+IDEwKSAvKiBhc3N1bWUgZW5jcnlwdGVkICovCkBAIC0xOTYsNiArMTk4LDggQEAKICAgICAgICAgICAgIHhpLT5lbmNfbGVuID0gMDsKIAogICAgICAgICAgICAgeGktPnhfcGtleSA9IFg1MDlfUEtFWV9uZXcoKTsKKyAgICAgICAgICAgIGlmICh4aS0+eF9wa2V5ID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBlcnI7CiAgICAgICAgICAgICBwdHlwZSA9IEVWUF9QS0VZX0RTQTsKICAgICAgICAgICAgIHBwID0gJnhpLT54X3BrZXktPmRlY19wa2V5OwogICAgICAgICAgICAgaWYgKChpbnQpT1BFTlNTTF9wb3J0X3N0cmxlbihoZWFkZXIpID4gMTApIC8qIGFzc3VtZSBlbmNyeXB0ZWQgKi8KQEAgLTIxNyw2ICsyMjEsOCBAQAogICAgICAgICAgICAgeGktPmVuY19sZW4gPSAwOwogCiAgICAgICAgICAgICB4aS0+eF9wa2V5ID0gWDUwOV9QS0VZX25ldygpOworICAgICAgICAgICAgaWYgKHhpLT54X3BrZXkgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIGVycjsKICAgICAgICAgICAgIHB0eXBlID0gRVZQX1BLRVlfRUM7CiAgICAgICAgICAgICBwcCA9ICZ4aS0+eF9wa2V5LT5kZWNfcGtleTsKICAgICAgICAgICAgIGlmICgoaW50KU9QRU5TU0xfcG9ydF9zdHJsZW4oaGVhZGVyKSA+IDEwKSAvKiBhc3N1bWUgZW5jcnlwdGVkICovCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9wZW0vcHZrZm10LmMgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9wZW0vcHZrZm10LmMKaW5kZXggZGM0YzdiZi4uMjFmNGY0MiAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vcGVtL3B2a2ZtdC5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL3BlbS9wdmtmbXQuYwpAQCAtNjI0LDEzICs2MjQsMTEgQEAKICAgICAgICAgICAgIFBFTWVycihQRU1fRl9ET19QVktfSEVBREVSLCBQRU1fUl9QVktfVE9PX1NIT1JUKTsKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9Ci0gICAgICAgIGxlbmd0aCAtPSAyMDsKICAgICB9IGVsc2UgewogICAgICAgICBpZiAobGVuZ3RoIDwgMjQpIHsKICAgICAgICAgICAgIFBFTWVycihQRU1fRl9ET19QVktfSEVBREVSLCBQRU1fUl9QVktfVE9PX1NIT1JUKTsKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9Ci0gICAgICAgIGxlbmd0aCAtPSAyNDsKICAgICAgICAgcHZrX21hZ2ljID0gcmVhZF9sZWR3b3JkKCZwKTsKICAgICAgICAgaWYgKHB2a19tYWdpYyAhPSBNU19QVktNQUdJQykgewogICAgICAgICAgICAgUEVNZXJyKFBFTV9GX0RPX1BWS19IRUFERVIsIFBFTV9SX0JBRF9NQUdJQ19OVU1CRVIpOwpAQCAtNjkyLDIzICs2OTAsMjMgQEAKICAgICAgICAgICAgIGlubGVuID0gUEVNX2RlZl9jYWxsYmFjayhwc2J1ZiwgUEVNX0JVRlNJWkUsIDAsIHUpOwogICAgICAgICBpZiAoaW5sZW4gPD0gMCkgewogICAgICAgICAgICAgUEVNZXJyKFBFTV9GX0RPX1BWS19CT0RZLCBQRU1fUl9CQURfUEFTU1dPUkRfUkVBRCk7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIGdvdG8gZXJyOwogICAgICAgICB9CiAgICAgICAgIGVuY3RtcCA9IE9QRU5TU0xfbWFsbG9jKGtleWxlbiArIDgpOwogICAgICAgICBpZiAoIWVuY3RtcCkgewogICAgICAgICAgICAgUEVNZXJyKFBFTV9GX0RPX1BWS19CT0RZLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIGdvdG8gZXJyOwogICAgICAgICB9CiAgICAgICAgIGlmICghZGVyaXZlX3B2a19rZXkoa2V5YnVmLCBwLCBzYWx0bGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopcHNidWYsIGlubGVuKSkKLSAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgZ290byBlcnI7CiAgICAgICAgIHAgKz0gc2FsdGxlbjsKICAgICAgICAgLyogQ29weSBCTE9CSEVBREVSIGFjcm9zcywgZGVjcnlwdCByZXN0ICovCiAgICAgICAgIE9QRU5TU0xfcG9ydF9tZW1jcHkoZW5jdG1wLCBwLCA4KTsKICAgICAgICAgcCArPSA4OwogICAgICAgICBpZiAoa2V5bGVuIDwgOCkgewogICAgICAgICAgICAgUEVNZXJyKFBFTV9GX0RPX1BWS19CT0RZLCBQRU1fUl9QVktfVE9PX1NIT1JUKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgZ290byBlcnI7CiAgICAgICAgIH0KICAgICAgICAgaW5sZW4gPSBrZXlsZW4gLSA4OwogICAgICAgICBxID0gZW5jdG1wICsgODsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL3BrY3MxMi9wMTJfYWRkLmMgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9wa2NzMTIvcDEyX2FkZC5jCmluZGV4IDJkYjhlZTAuLjhlYTBlNDUgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL3BrY3MxMi9wMTJfYWRkLmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vcGtjczEyL3AxMl9hZGQuYwpAQCAtNzgsMTUgKzc4LDE5IEBACiAgICAgYmFnLT50eXBlID0gT0JKX25pZDJvYmoobmlkMSk7CiAgICAgaWYgKCFBU04xX2l0ZW1fcGFjayhvYmosIGl0LCAmYmFnLT52YWx1ZS5vY3RldCkpIHsKICAgICAgICAgUEtDUzEyZXJyKFBLQ1MxMl9GX1BLQ1MxMl9JVEVNX1BBQ0tfU0FGRUJBRywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZ290byBlcnI7CiAgICAgfQogICAgIGlmICghKHNhZmViYWcgPSBQS0NTMTJfU0FGRUJBR19uZXcoKSkpIHsKICAgICAgICAgUEtDUzEyZXJyKFBLQ1MxMl9GX1BLQ1MxMl9JVEVNX1BBQ0tfU0FGRUJBRywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZ290byBlcnI7CiAgICAgfQogICAgIHNhZmViYWctPnZhbHVlLmJhZyA9IGJhZzsKICAgICBzYWZlYmFnLT50eXBlID0gT0JKX25pZDJvYmoobmlkMik7CiAgICAgcmV0dXJuIHNhZmViYWc7CisKKyBlcnI6CisgICAgUEtDUzEyX0JBR1NfZnJlZShiYWcpOworICAgIHJldHVybiBOVUxMOwogfQogCiAvKiBUdXJuIFBLQ1M4IG9iamVjdCBpbnRvIGEga2V5YmFnICovCkBAIC0xMzAsNiArMTM0LDcgQEAKICAgICAgICAgICBQS0NTOF9lbmNyeXB0KHBiZV9uaWQsIHBiZV9jaXBoLCBwYXNzLCBwYXNzbGVuLCBzYWx0LCBzYWx0bGVuLCBpdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgcDgpKSkgewogICAgICAgICBQS0NTMTJlcnIoUEtDUzEyX0ZfUEtDUzEyX01BS0VfU0hLRVlCQUcsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICAgICAgUEtDUzEyX1NBRkVCQUdfZnJlZShiYWcpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKQEAgLTE0NywxNCArMTUyLDE4IEBACiAgICAgcDctPnR5cGUgPSBPQkpfbmlkMm9iaihOSURfcGtjczdfZGF0YSk7CiAgICAgaWYgKCEocDctPmQuZGF0YSA9IE1fQVNOMV9PQ1RFVF9TVFJJTkdfbmV3KCkpKSB7CiAgICAgICAgIFBLQ1MxMmVycihQS0NTMTJfRl9QS0NTMTJfUEFDS19QN0RBVEEsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGdvdG8gZXJyOwogICAgIH0KIAogICAgIGlmICghQVNOMV9pdGVtX3BhY2soc2ssIEFTTjFfSVRFTV9ycHRyKFBLQ1MxMl9TQUZFQkFHUyksICZwNy0+ZC5kYXRhKSkgewogICAgICAgICBQS0NTMTJlcnIoUEtDUzEyX0ZfUEtDUzEyX1BBQ0tfUDdEQVRBLCBQS0NTMTJfUl9DQU5UX1BBQ0tfU1RSVUNUVVJFKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGdvdG8gZXJyOwogICAgIH0KICAgICByZXR1cm4gcDc7CisKKyBlcnI6CisgICAgUEtDUzdfZnJlZShwNyk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIC8qIFVucGFjayBTQUZFQkFHUyBmcm9tIFBLQ1MjNyBkYXRhIENvbnRlbnRJbmZvICovCkBAIC0xODQsNyArMTkzLDcgQEAKICAgICBpZiAoIVBLQ1M3X3NldF90eXBlKHA3LCBOSURfcGtjczdfZW5jcnlwdGVkKSkgewogICAgICAgICBQS0NTMTJlcnIoUEtDUzEyX0ZfUEtDUzEyX1BBQ0tfUDdFTkNEQVRBLAogICAgICAgICAgICAgICAgICAgUEtDUzEyX1JfRVJST1JfU0VUVElOR19FTkNSWVBURURfREFUQV9UWVBFKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGdvdG8gZXJyOwogICAgIH0KIAogICAgIHBiZV9jaXBoID0gRVZQX2dldF9jaXBoZXJieW5pZChwYmVfbmlkKTsKQEAgLTE5Niw3ICsyMDUsNyBAQAogCiAgICAgaWYgKCFwYmUpIHsKICAgICAgICAgUEtDUzEyZXJyKFBLQ1MxMl9GX1BLQ1MxMl9QQUNLX1A3RU5DREFUQSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZ290byBlcnI7CiAgICAgfQogICAgIFg1MDlfQUxHT1JfZnJlZShwNy0+ZC5lbmNyeXB0ZWQtPmVuY19kYXRhLT5hbGdvcml0aG0pOwogICAgIHA3LT5kLmVuY3J5cHRlZC0+ZW5jX2RhdGEtPmFsZ29yaXRobSA9IHBiZTsKQEAgLTIwNSwxMCArMjE0LDE0IEBACiAgICAgICAgICAgUEtDUzEyX2l0ZW1faTJkX2VuY3J5cHQocGJlLCBBU04xX0lURU1fcnB0cihQS0NTMTJfU0FGRUJBR1MpLCBwYXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NsZW4sIGJhZ3MsIDEpKSkgewogICAgICAgICBQS0NTMTJlcnIoUEtDUzEyX0ZfUEtDUzEyX1BBQ0tfUDdFTkNEQVRBLCBQS0NTMTJfUl9FTkNSWVBUX0VSUk9SKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGdvdG8gZXJyOwogICAgIH0KIAogICAgIHJldHVybiBwNzsKKworIGVycjoKKyAgICBQS0NTN19mcmVlKHA3KTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogU1RBQ0tfT0YoUEtDUzEyX1NBRkVCQUcpICpQS0NTMTJfdW5wYWNrX3A3ZW5jZGF0YShQS0NTNyAqcDcsIGNvbnN0IGNoYXIgKnBhc3MsCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9wa2NzMTIvcDEyX2NycHQuYyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL3BrY3MxMi9wMTJfY3JwdC5jCmluZGV4IDk2MDZkNGIuLjlhNjIwMzggMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL3BrY3MxMi9wMTJfY3JwdC5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL3BrY3MxMi9wMTJfY3JwdC5jCkBAIC04MCw2ICs4MCw5IEBACiAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcGJ1ZjsKICAgICB1bnNpZ25lZCBjaGFyIGtleVtFVlBfTUFYX0tFWV9MRU5HVEhdLCBpdltFVlBfTUFYX0lWX0xFTkdUSF07CiAKKyAgICBpZiAoY2lwaGVyID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOworCiAgICAgLyogRXh0cmFjdCB1c2VmdWwgaW5mbyBmcm9tIHBhcmFtZXRlciAqLwogICAgIGlmIChwYXJhbSA9PSBOVUxMIHx8IHBhcmFtLT50eXBlICE9IFZfQVNOMV9TRVFVRU5DRSB8fAogICAgICAgICBwYXJhbS0+dmFsdWUuc2VxdWVuY2UgPT0gTlVMTCkgewpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vcGtjczEyL3AxMl9tdXRsLmMgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9wa2NzMTIvcDEyX211dGwuYwppbmRleCBhNTdlMWY2Li4zODIwNjA0IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9wa2NzMTIvcDEyX211dGwuYworKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9wa2NzMTIvcDEyX211dGwuYwpAQCAtMTc2LDExICsxNzYsMTEgQEAKICAgICB9CiAgICAgaWYgKCFzYWx0bGVuKQogICAgICAgICBzYWx0bGVuID0gUEtDUzEyX1NBTFRfTEVOOwotICAgIHAxMi0+bWFjLT5zYWx0LT5sZW5ndGggPSBzYWx0bGVuOwotICAgIGlmICghKHAxMi0+bWFjLT5zYWx0LT5kYXRhID0gT1BFTlNTTF9tYWxsb2Moc2FsdGxlbikpKSB7CisgICAgaWYgKChwMTItPm1hYy0+c2FsdC0+ZGF0YSA9IE9QRU5TU0xfcG9ydF9tYWxsb2Moc2FsdGxlbikpID09IE5VTEwpIHsKICAgICAgICAgUEtDUzEyZXJyKFBLQ1MxMl9GX1BLQ1MxMl9TRVRVUF9NQUMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQorICAgIHAxMi0+bWFjLT5zYWx0LT5sZW5ndGggPSBzYWx0bGVuOwogICAgIGlmICghc2FsdCkgewogICAgICAgICBpZiAoUkFORF9wc2V1ZG9fYnl0ZXMocDEyLT5tYWMtPnNhbHQtPmRhdGEsIHNhbHRsZW4pIDwgMCkKICAgICAgICAgICAgIHJldHVybiAwOwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vcGtjczcvcGs3X2RvaXQuYyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL3BrY3M3L3BrN19kb2l0LmMKaW5kZXggZjExNTdhNC4uNmE1Y2I5YyAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vcGtjczcvcGs3X2RvaXQuYworKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9wa2NzNy9wazdfZG9pdC5jCkBAIC02NTksNiArNjU5LDggQEAKICAgICAgICAgICAgIGJpbyA9IEJJT19uZXdfbWVtX2J1ZihkYXRhX2JvZHktPmRhdGEsIGRhdGFfYm9keS0+bGVuZ3RoKTsKICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICBiaW8gPSBCSU9fbmV3KEJJT19zX21lbSgpKTsKKyAgICAgICAgICAgIGlmIChiaW8gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIGVycjsKICAgICAgICAgICAgIEJJT19zZXRfbWVtX2VvZl9yZXR1cm4oYmlvLCAwKTsKICAgICAgICAgfQogICAgICAgICBpZiAoYmlvID09IE5VTEwpCkBAIC0xMTU5LDcgKzExNjEsNiBAQAogICAgIHJzayA9IHA3LT5kLnNpZ25lZF9hbmRfZW52ZWxvcGVkLT5yZWNpcGllbnRpbmZvOwogICAgIGlmIChyc2sgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgcmkgPSBza19QS0NTN19SRUNJUF9JTkZPX3ZhbHVlKHJzaywgMCk7CiAgICAgaWYgKHNrX1BLQ1M3X1JFQ0lQX0lORk9fbnVtKHJzaykgPD0gaWR4KQogICAgICAgICByZXR1cm4gKE5VTEwpOwogICAgIHJpID0gc2tfUEtDUzdfUkVDSVBfSU5GT192YWx1ZShyc2ssIGlkeCk7CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9yYW5kL3JhbmRfdm1zLmMgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9yYW5kL3JhbmRfdm1zLmMKaW5kZXggYTcxNzlhNC4uMGUxMGMzNiAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vcmFuZC9yYW5kX3Ztcy5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL3JhbmQvcmFuZF92bXMuYwpAQCAtMSw0ICsxLDQgQEAKLS8qIGNyeXB0by9yYW5kL3JhbmRfdm1zLmMgLSotIG1vZGU6QzsgYy1maWxlLXN0eWxlOiAiZWF5IiAtKi0gKi8KKy8qIGNyeXB0by9yYW5kL3JhbmRfdm1zLmMgKi8KIC8qCiAgKiBXcml0dGVuIGJ5IFJpY2hhcmQgTGV2aXR0ZSA8cmljaGFyZEBsZXZpdHRlLm9yZz4gZm9yIHRoZSBPcGVuU1NMIHByb2plY3QKICAqIDIwMDAuCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9yYzQvYXNtL3JjNC14ODZfNjQucGwgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9yYzQvYXNtL3JjNC14ODZfNjQucGwKaW5kZXggNzU3NTBkYi4uMjA3MjJkMyAxMDA3NTUKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vcmM0L2FzbS9yYzQteDg2XzY0LnBsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL3JjNC9hc20vcmM0LXg4Nl82NC5wbApAQCAtNTYsNyArNTYsNyBAQAogIyBhY2hpZXZlcyByZXNwZWN0ZnVsIDQzMk1CcHMgb24gMi44R0h6IHByb2Nlc3NvciBub3cuIEZvciByZWZlcmVuY2UuCiAjIElmIGV4ZWN1dGVkIG9uIFhlb24sIGN1cnJlbnQgUkM0X0NIQVIgY29kZS1wYXRoIGlzIDIuN3ggZmFzdGVyIHRoYW4KICMgUkM0X0lOVCBjb2RlLXBhdGguIFdoaWxlIGlmIGV4ZWN1dGVkIG9uIE9wdGVyb24sIGl0J3Mgb25seSAyNSUKLSMgc2xvd2VyIHRoYW4gdGhlIFJDNF9JTlQgb25lIFttZWFuaW5nIHRoYXQgaWYgQ1BVILUtYXJjaCBkZXRlY3Rpb24KKyMgc2xvd2VyIHRoYW4gdGhlIFJDNF9JTlQgb25lIFttZWFuaW5nIHRoYXQgaWYgQ1BVIMK1LWFyY2ggZGV0ZWN0aW9uCiAjIGlzIG5vdCBpbXBsZW1lbnRlZCwgdGhlbiB0aGlzIGZpbmFsIFJDNF9DSEFSIGNvZGUtcGF0aCBzaG91bGQgYmUKICMgcHJlZmVycmVkLCBhcyBpdCBwcm92aWRlcyBiZXR0ZXIgKmFsbC1yb3VuZCogcGVyZm9ybWFuY2VdLgogCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9yYzQvcmM0X3V0bC5jIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vcmM0L3JjNF91dGwuYwppbmRleCA3YzZhMTVmLi5jYmQ0YTI0IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9yYzQvcmM0X3V0bC5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL3JjNC9yYzRfdXRsLmMKQEAgLTEsNCArMSw0IEBACi0vKiBjcnlwdG8vcmM0L3JjNF91dGwuYyAtKi0gbW9kZTpDOyBjLWZpbGUtc3R5bGU6ICJlYXkiIC0qLSAqLworLyogY3J5cHRvL3JjNC9yYzRfdXRsLmMgKi8KIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKiBDb3B5cmlnaHQgKGMpIDIwMTEgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vcnNhL3JzYV9hbWV0aC5jIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vcnNhL3JzYV9hbWV0aC5jCmluZGV4IGE1YjFmZDQuLjE3ZjVkODggMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL3JzYS9yc2FfYW1ldGguYworKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9yc2EvcnNhX2FtZXRoLmMKQEAgLTI4Miw3ICsyODIsNyBAQAogICAgIGlmIChwc3MtPm1hc2tHZW5BbGdvcml0aG0pIHsKICAgICAgICAgQVNOMV9UWVBFICpwYXJhbSA9IHBzcy0+bWFza0dlbkFsZ29yaXRobS0+cGFyYW1ldGVyOwogICAgICAgICBpZiAoT0JKX29iajJuaWQocHNzLT5tYXNrR2VuQWxnb3JpdGhtLT5hbGdvcml0aG0pID09IE5JRF9tZ2YxCi0gICAgICAgICAgICAmJiBwYXJhbS0+dHlwZSA9PSBWX0FTTjFfU0VRVUVOQ0UpIHsKKyAgICAgICAgICAgICYmIHBhcmFtICYmIHBhcmFtLT50eXBlID09IFZfQVNOMV9TRVFVRU5DRSkgewogICAgICAgICAgICAgcCA9IHBhcmFtLT52YWx1ZS5zZXF1ZW5jZS0+ZGF0YTsKICAgICAgICAgICAgIHBsZW4gPSBwYXJhbS0+dmFsdWUuc2VxdWVuY2UtPmxlbmd0aDsKICAgICAgICAgICAgICpwbWFza0hhc2ggPSBkMmlfWDUwOV9BTEdPUihOVUxMLCAmcCwgcGxlbik7CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9yc2EvcnNhX2Noay5jIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vcnNhL3JzYV9jaGsuYwppbmRleCBmNDM4Mzg2Li42MDdmYWEwIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9yc2EvcnNhX2Noay5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL3JzYS9yc2FfY2hrLmMKQEAgLTEsNCArMSw0IEBACi0vKiBjcnlwdG8vcnNhL3JzYV9jaGsuYyAgLSotIE1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImVheSIgLSotICovCisvKiBjcnlwdG8vcnNhL3JzYV9jaGsuYyAgKi8KIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vcnNhL3JzYV9nZW4uYyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL3JzYS9yc2FfZ2VuLmMKaW5kZXggMjdmMzQzMi4uZmYwNzg4ZCAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vcnNhL3JzYV9nZW4uYworKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9yc2EvcnNhX2dlbi5jCkBAIC03Miw2ICs3Miw4IEBACiAjaW5jbHVkZSA8b3BlbnNzbC9yc2EuaD4KICNpZmRlZiBPUEVOU1NMX0ZJUFMKICMgaW5jbHVkZSA8b3BlbnNzbC9maXBzLmg+CitleHRlcm4gaW50IEZJUFNfcnNhX3g5MzFfZ2VuZXJhdGVfa2V5X2V4KFJTQSAqcnNhLCBpbnQgYml0cywgQklHTlVNICplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCTl9HRU5DQiAqY2IpOwogI2VuZGlmCiAKIHN0YXRpYyBpbnQgcnNhX2J1aWx0aW5fa2V5Z2VuKFJTQSAqcnNhLCBpbnQgYml0cywgQklHTlVNICplX3ZhbHVlLApAQCAtOTcsNyArOTksNyBAQAogICAgICAgICByZXR1cm4gcnNhLT5tZXRoLT5yc2Ffa2V5Z2VuKHJzYSwgYml0cywgZV92YWx1ZSwgY2IpOwogI2lmZGVmIE9QRU5TU0xfRklQUwogICAgIGlmIChGSVBTX21vZGUoKSkKLSAgICAgICAgcmV0dXJuIEZJUFNfcnNhX2dlbmVyYXRlX2tleV9leChyc2EsIGJpdHMsIGVfdmFsdWUsIGNiKTsKKyAgICAgICAgcmV0dXJuIEZJUFNfcnNhX3g5MzFfZ2VuZXJhdGVfa2V5X2V4KHJzYSwgYml0cywgZV92YWx1ZSwgY2IpOwogI2VuZGlmCiAgICAgcmV0dXJuIHJzYV9idWlsdGluX2tleWdlbihyc2EsIGJpdHMsIGVfdmFsdWUsIGNiKTsKIH0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL3JzYS9yc2Ffc2lnbi5jIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vcnNhL3JzYV9zaWduLmMKaW5kZXggOTM2Mzk3MS4uZTFiNWFmZiAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vcnNhL3JzYV9zaWduLmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vcnNhL3JzYV9zaWduLmMKQEAgLTg3LDcgKzg3LDcgQEAKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogI2VuZGlmCi0gICAgaWYgKChyc2EtPmZsYWdzICYgUlNBX0ZMQUdfU0lHTl9WRVIpICYmIHJzYS0+bWV0aC0+cnNhX3NpZ24pIHsKKyAgICBpZiAocnNhLT5tZXRoLT5yc2Ffc2lnbikgewogICAgICAgICByZXR1cm4gcnNhLT5tZXRoLT5yc2Ffc2lnbih0eXBlLCBtLCBtX2xlbiwgc2lncmV0LCBzaWdsZW4sIHJzYSk7CiAgICAgfQogICAgIC8qIFNwZWNpYWwgY2FzZTogU1NMIHNpZ25hdHVyZSwganVzdCBjaGVjayB0aGUgbGVuZ3RoICovCkBAIC0yMjEsMTQgKzIyMSwxMyBAQAogICAgICAgICAgICAgT1BFTlNTTF9wb3J0X21lbWNweShybSwgcyArIDIsIDE2KTsKICAgICAgICAgICAgICpwcm1fbGVuID0gMTY7CiAgICAgICAgICAgICByZXQgPSAxOwotICAgICAgICB9IGVsc2UgaWYgKE9QRU5TU0xfcG9ydF9tZW1jbXAobSwgcyArIDIsIDE2KSkKKyAgICAgICAgfSBlbHNlIGlmIChPUEVOU1NMX3BvcnRfbWVtY21wKG0sIHMgKyAyLCAxNikpIHsKICAgICAgICAgICAgIFJTQWVycihSU0FfRl9JTlRfUlNBX1ZFUklGWSwgUlNBX1JfQkFEX1NJR05BVFVSRSk7Ci0gICAgICAgIGVsc2UKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHJldCA9IDE7Ci0gICAgfQotCi0gICAgLyogU3BlY2lhbCBjYXNlOiBTU0wgc2lnbmF0dXJlICovCi0gICAgaWYgKGR0eXBlID09IE5JRF9tZDVfc2hhMSkgeworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChkdHlwZSA9PSBOSURfbWQ1X3NoYTEpIHsKKyAgICAgICAgLyogU3BlY2lhbCBjYXNlOiBTU0wgc2lnbmF0dXJlICovCiAgICAgICAgIGlmICgoaSAhPSBTU0xfU0lHX0xFTkdUSCkgfHwgT1BFTlNTTF9wb3J0X21lbWNtcChzLCBtLCBTU0xfU0lHX0xFTkdUSCkpCiAgICAgICAgICAgICBSU0FlcnIoUlNBX0ZfSU5UX1JTQV9WRVJJRlksIFJTQV9SX0JBRF9TSUdOQVRVUkUpOwogICAgICAgICBlbHNlCkBAIC0zMDgsNyArMzA3LDcgQEAKICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNpZ2J1ZiwgdW5zaWduZWQgaW50IHNpZ2xlbiwgUlNBICpyc2EpCiB7CiAKLSAgICBpZiAoKHJzYS0+ZmxhZ3MgJiBSU0FfRkxBR19TSUdOX1ZFUikgJiYgcnNhLT5tZXRoLT5yc2FfdmVyaWZ5KSB7CisgICAgaWYgKHJzYS0+bWV0aC0+cnNhX3ZlcmlmeSkgewogICAgICAgICByZXR1cm4gcnNhLT5tZXRoLT5yc2FfdmVyaWZ5KGR0eXBlLCBtLCBtX2xlbiwgc2lnYnVmLCBzaWdsZW4sIHJzYSk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9yc2EvcnNhX3Rlc3QuYyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL3JzYS9yc2FfdGVzdC5jCmluZGV4IGU5NzEyOTUuLjg1Yzc0NDAgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL3JzYS9yc2FfdGVzdC5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL3JzYS9yc2FfdGVzdC5jCkBAIC0yOTcsMjIgKzI5NywzMCBAQAogICAgICAgICB9IGVsc2UKICAgICAgICAgICAgIHByaW50ZigiT0FFUCBlbmNyeXB0aW9uL2RlY3J5cHRpb24gb2tcbiIpOwogCi0gICAgICAgIC8qIFRyeSBkZWNyeXB0aW5nIGNvcnJ1cHRlZCBjaXBoZXJ0ZXh0cyAqLworICAgICAgICAvKiBUcnkgZGVjcnlwdGluZyBjb3JydXB0ZWQgY2lwaGVydGV4dHMuICovCiAgICAgICAgIGZvciAobiA9IDA7IG4gPCBjbGVuOyArK24pIHsKLSAgICAgICAgICAgIGludCBiOwotICAgICAgICAgICAgdW5zaWduZWQgY2hhciBzYXZlZCA9IGN0ZXh0W25dOwotICAgICAgICAgICAgZm9yIChiID0gMDsgYiA8IDI1NjsgKytiKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGIgPT0gc2F2ZWQpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIGN0ZXh0W25dID0gYjsKLSAgICAgICAgICAgICAgICBudW0gPSBSU0FfcHJpdmF0ZV9kZWNyeXB0KG51bSwgY3RleHQsIHB0ZXh0LCBrZXksCisgICAgICAgICAgICBjdGV4dFtuXSBePSAxOworICAgICAgICAgICAgbnVtID0gUlNBX3ByaXZhdGVfZGVjcnlwdChjbGVuLCBjdGV4dCwgcHRleHQsIGtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJTQV9QS0NTMV9PQUVQX1BBRERJTkcpOwotICAgICAgICAgICAgICAgIGlmIChudW0gPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50ZigiQ29ycnVwdCBkYXRhIGRlY3J5cHRlZCFcbiIpOwotICAgICAgICAgICAgICAgICAgICBlcnIgPSAxOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChudW0gPiAwKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJDb3JydXB0IGRhdGEgZGVjcnlwdGVkIVxuIik7CisgICAgICAgICAgICAgICAgZXJyID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGN0ZXh0W25dIF49IDE7CisgICAgICAgIH0KKworICAgICAgICAvKiBUZXN0IHRydW5jYXRlZCBjaXBoZXJ0ZXh0cywgYXMgd2VsbCBhcyBuZWdhdGl2ZSBsZW5ndGguICovCisgICAgICAgIGZvciAobiA9IC0xOyBuIDwgY2xlbjsgKytuKSB7CisgICAgICAgICAgICBudW0gPSBSU0FfcHJpdmF0ZV9kZWNyeXB0KG4sIGN0ZXh0LCBwdGV4dCwga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSU0FfUEtDUzFfT0FFUF9QQURESU5HKTsKKyAgICAgICAgICAgIGlmIChudW0gPiAwKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJUcnVuY2F0ZWQgZGF0YSBkZWNyeXB0ZWQhXG4iKTsKKyAgICAgICAgICAgICAgICBlcnIgPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9CisKICBuZXh0OgogICAgICAgICBSU0FfZnJlZShrZXkpOwogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL3NlZWQvc2VlZF9jYmMuYyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL3NlZWQvc2VlZF9jYmMuYwppbmRleCAzM2U2ODg3Li5lZTExMTViIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9zZWVkL3NlZWRfY2JjLmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vc2VlZC9zZWVkX2NiYy5jCkBAIC0xLDQgKzEsNCBAQAotLyogY3J5cHRvL3NlZWQvc2VlZF9jYmMuYyAtKi0gbW9kZTpDOyBjLWZpbGUtc3R5bGU6ICJlYXkiIC0qLSAqLworLyogY3J5cHRvL3NlZWQvc2VlZF9jYmMuYyAqLwogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqIENvcHlyaWdodCAoYykgMTk5OC0yMDA3IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL3NlZWQvc2VlZF9jZmIuYyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL3NlZWQvc2VlZF9jZmIuYwppbmRleCAzNDM3ZDdiLi5iNmE1NjQ4IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9zZWVkL3NlZWRfY2ZiLmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vc2VlZC9zZWVkX2NmYi5jCkBAIC0xLDQgKzEsNCBAQAotLyogY3J5cHRvL3NlZWQvc2VlZF9jZmIuYyAtKi0gbW9kZTpDOyBjLWZpbGUtc3R5bGU6ICJlYXkiIC0qLSAqLworLyogY3J5cHRvL3NlZWQvc2VlZF9jZmIuYyAqLwogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqIENvcHlyaWdodCAoYykgMTk5OC0yMDA3IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL3NlZWQvc2VlZF9lY2IuYyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL3NlZWQvc2VlZF9lY2IuYwppbmRleCA5MzdhMzFiLi45MzYzZDU1IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9zZWVkL3NlZWRfZWNiLmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vc2VlZC9zZWVkX2VjYi5jCkBAIC0xLDQgKzEsNCBAQAotLyogY3J5cHRvL3NlZWQvc2VlZF9lY2IuYyAtKi0gbW9kZTpDOyBjLWZpbGUtc3R5bGU6ICJlYXkiIC0qLSAqLworLyogY3J5cHRvL3NlZWQvc2VlZF9lY2IuYyAqLwogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqIENvcHlyaWdodCAoYykgMjAwNyBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9zZWVkL3NlZWRfb2ZiLmMgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9zZWVkL3NlZWRfb2ZiLmMKaW5kZXggNjk3NDMwMi4uNDhiNzEyMiAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vc2VlZC9zZWVkX29mYi5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL3NlZWQvc2VlZF9vZmIuYwpAQCAtMSw0ICsxLDQgQEAKLS8qIGNyeXB0by9zZWVkL3NlZWRfb2ZiLmMgLSotIG1vZGU6QzsgYy1maWxlLXN0eWxlOiAiZWF5IiAtKi0gKi8KKy8qIGNyeXB0by9zZWVkL3NlZWRfb2ZiLmMgKi8KIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNyBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9zaGEvYXNtL3NoYTEtNTg2LnBsIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vc2hhL2FzbS9zaGExLTU4Ni5wbAppbmRleCAxMDg0ZDIyLi4yYjExOWZmIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9zaGEvYXNtL3NoYTEtNTg2LnBsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL3NoYS9hc20vc2hhMS01ODYucGwKQEAgLTY2LDkgKzY2LDkgQEAKICMgc3dpdGNoIHRvIEFWWCBhbG9uZSBpbXByb3ZlcyBwZXJmb3JtYW5jZSBieSBhcyBsaXR0bGUgYXMgNCUgaW4KICMgY29tcGFyaXNvbiB0byBTU1NFMyBjb2RlIHBhdGguIEJ1dCBiZWxvdyByZXN1bHQgZG9lc24ndCBsb29rIGxpa2UKICMgNCUgaW1wcm92ZW1lbnQuLi4gVHJvdWJsZSBpcyB0aGF0IFNhbmR5IEJyaWRnZSBkZWNvZGVzICdyb1tybF0nIGFzCi0jIHBhaXIgb2YgtS1vcHMsIGFuZCBpdCdzIHRoZSBhZGRpdGlvbmFsILUtb3BzLCB0d28gcGVyIHJvdW5kLCB0aGF0CisjIHBhaXIgb2YgwrUtb3BzLCBhbmQgaXQncyB0aGUgYWRkaXRpb25hbCDCtS1vcHMsIHR3byBwZXIgcm91bmQsIHRoYXQKICMgbWFrZSBpdCBydW4gc2xvd2VyIHRoYW4gQ29yZTIgYW5kIFdlc3RtZXJlLiBCdXQgJ3NoW3JsXWQnIGlzIGRlY29kZWQKLSMgYXMgc2luZ2xlILUtb3AgYnkgU2FuZHkgQnJpZGdlIGFuZCBpdCdzIHJlcGxhY2luZyAncm9bcmxdJyB3aXRoCisjIGFzIHNpbmdsZSDCtS1vcCBieSBTYW5keSBCcmlkZ2UgYW5kIGl0J3MgcmVwbGFjaW5nICdyb1tybF0nIHdpdGgKICMgZXF1aXZhbGVudCAnc2hbcmxdZCcgdGhhdCBpcyByZXNwb25zaWJsZSBmb3IgdGhlIGltcHJlc3NpdmUgNS4xCiAjIGN5Y2xlcyBwZXIgcHJvY2Vzc2VkIGJ5dGUuIEJ1dCAnc2hbcmxdZCcgaXMgbm90IHNvbWV0aGluZyB0aGF0IHVzZWQKICMgdG8gYmUgZmFzdCwgbm9yIGRvZXMgaXQgYXBwZWFyIHRvIGJlIGZhc3QgaW4gdXBjb21pbmcgQnVsbGRvemVyCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9zaGEvYXNtL3NoYTI1Ni01ODYucGwgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9zaGEvYXNtL3NoYTI1Ni01ODYucGwKaW5kZXggOTI4ZWM1My4uNTJhN2M3ZiAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vc2hhL2FzbS9zaGEyNTYtNTg2LnBsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL3NoYS9hc20vc2hhMjU2LTU4Ni5wbApAQCAtMjEsNyArMjEsNyBAQAogIyAgICAgcHVycG9zZXMuCiAjCiAjIFBlcmZvcm1hbmNlIGltcHJvdmVtZW50IG92ZXIgY29tcGlsZXIgZ2VuZXJhdGVkIGNvZGUgdmFyaWVzIGZyb20KLSMgMTAlIHRvIDQwJSBbc2VlIGFib3ZlXS4gTm90IHZlcnkgaW1wcmVzc2l2ZSBvbiBzb21lILUtYXJjaHMsIGJ1dAorIyAxMCUgdG8gNDAlIFtzZWUgYWJvdmVdLiBOb3QgdmVyeSBpbXByZXNzaXZlIG9uIHNvbWUgwrUtYXJjaHMsIGJ1dAogIyBpdCdzIDUgdGltZXMgc21hbGxlciBhbmQgb3B0aW1pemllcyBhbW91bnQgb2Ygd3JpdGVzLgogCiAkMCA9fiBtLyguKltcL1xcXSlbXlwvXFxdKyQvOyAkZGlyPSQxOwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vc2hhL2FzbS9zaGE1MTItNTg2LnBsIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vc2hhL2FzbS9zaGE1MTItNTg2LnBsCmluZGV4IDdlYWI2YTUuLjlmOGM1MWViIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9zaGEvYXNtL3NoYTUxMi01ODYucGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vc2hhL2FzbS9zaGE1MTItNTg2LnBsCkBAIC0yMyw3ICsyMyw3IEBACiAjCiAjIElBTFUgY29kZS1wYXRoIGlzIG9wdGltaXplZCBmb3IgZWxkZXIgUGVudGl1bXMuIE9uIHZhbmlsbGEgUGVudGl1bQogIyBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudCBvdmVyIGNvbXBpbGVyIGdlbmVyYXRlZCBjb2RlIHJlYWNoZXMgfjYwJSwKLSMgd2hpbGUgb24gUElJSSAtIH4zNSUuIE9uIG5ld2VyILUtYXJjaHMgaW1wcm92ZW1lbnQgdmFyaWVzIGZyb20gMTUlCisjIHdoaWxlIG9uIFBJSUkgLSB+MzUlLiBPbiBuZXdlciDCtS1hcmNocyBpbXByb3ZlbWVudCB2YXJpZXMgZnJvbSAxNSUKICMgdG8gNTAlLCBidXQgaXQncyBsZXNzIGltcG9ydGFudCBhcyB0aGV5IGFyZSBleHBlY3RlZCB0byBleGVjdXRlIFNTRTIKICMgY29kZS1wYXRoLCB3aGljaCBpcyBjb21tb25seSB+Mi0zeCBmYXN0ZXIgW3RoYW4gY29tcGlsZXIgZ2VuZXJhdGVkCiAjIGNvZGVdLiBTU0UyIGNvZGUtcGF0aCBpcyBhcyBmYXN0IGFzIG9yaWdpbmFsIHNoYTUxMi1zc2UyLnBsLCBldmVuCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9zaGEvYXNtL3NoYTUxMi1wYXJpc2MucGwgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9zaGEvYXNtL3NoYTUxMi1wYXJpc2MucGwKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCBmYzBlMTViLi42Y2FkNzJlCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL3NoYS9hc20vc2hhNTEyLXBhcmlzYy5wbAorKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9zaGEvYXNtL3NoYTUxMi1wYXJpc2MucGwKQEAgLTE5LDcgKzE5LDcgQEAKICMgU0hBNTEyIHBlcmZvcm1hbmNlIGlzID4yLjl4IGJldHRlciB0aGFuIGdjYyAzLjIgZ2VuZXJhdGVkIGNvZGUgb24KICMgUEEtNzEwMExDLCBQQS1SSVNDIDEuMSBwcm9jZXNzb3IuIFRoZW4gaW1wbGVtZW50YXRpb24gZGV0ZWN0cyBpZiB0aGUKICMgY29kZSBpcyBleGVjdXRlZCBvbiBQQS1SSVNDIDIuMCBwcm9jZXNzb3IgYW5kIHN3aXRjaGVzIHRvIDY0LWJpdAotIyBjb2RlIHBhdGggZGVsaXZlcmluZyBhZGVxdWF0ZSBwZWZvcm1hbmNlIGV2ZW4gaW4gImJsZW5kZWQiIDMyLWJpdAorIyBjb2RlIHBhdGggZGVsaXZlcmluZyBhZGVxdWF0ZSBwZXJmb3JtYW5jZSBldmVuIGluICJibGVuZGVkIiAzMi1iaXQKICMgYnVpbGQuIFRob3VnaCA2NC1iaXQgY29kZSBpcyBub3QgYW55IGZhc3RlciB0aGFuIGNvZGUgZ2VuZXJhdGVkIGJ5CiAjIHZlbmRvciBjb21waWxlciBvbiBQQS04NjAwLi4uCiAjCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9zaGEvc2hhMXRlc3QuYyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL3NoYS9zaGExdGVzdC5jCmluZGV4IDAwNTJhOTUuLjU1MWEzNDggMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL3NoYS9zaGExdGVzdC5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL3NoYS9zaGExdGVzdC5jCkBAIC0xNTcsOCArMTU3LDggQEAKICAgICBpZiAoZXJyKQogICAgICAgICBwcmludGYoIkVSUk9SOiAlZFxuIiwgZXJyKTsKICMgZW5kaWYKLSAgICBFWElUKGVycik7CiAgICAgRVZQX01EX0NUWF9jbGVhbnVwKCZjKTsKKyAgICBFWElUKGVycik7CiAgICAgcmV0dXJuICgwKTsKIH0KIApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vc3BhcmNjcHVpZC5TIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vc3BhcmNjcHVpZC5TCmluZGV4IDBjYzI0N2UuLmM2M2Q1ZGEgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL3NwYXJjY3B1aWQuUworKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9zcGFyY2NwdWlkLlMKQEAgLTEyMyw3ICsxMjMsNyBAQAogCQkJZm1vdnMJJWYxLCVmMwogCQkJZm1vdnMJJWYwLCVmMgogCi0JYWRkCSVmcCxCSUFTLCVpMAkhIHJldHVybiBwb2ludGVyIHRvIGNhbGxlcrRzIHRvcCBvZiBzdGFjaworCWFkZAklZnAsQklBUywlaTAJISByZXR1cm4gcG9pbnRlciB0byBjYWxsZXLCtHMgdG9wIG9mIHN0YWNrCiAKIAlyZXQKIAlyZXN0b3JlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9zcnAvc3JwX3ZmeS5jIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vc3JwL3NycF92ZnkuYwppbmRleCA1MGY3NWQ3Li5jNGM1ZWU0IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9zcnAvc3JwX3ZmeS5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL3NycC9zcnBfdmZ5LmMKQEAgLTE5OCw3ICsxOTgsNyBAQAogCiBzdGF0aWMgU1JQX3VzZXJfcHdkICpTUlBfdXNlcl9wd2RfbmV3KCkKIHsKLSAgICBTUlBfdXNlcl9wd2QgKnJldCA9IE9QRU5TU0xfbWFsbG9jKHNpemVvZihTUlBfdXNlcl9wd2QpKTsKKyAgICBTUlBfdXNlcl9wd2QgKnJldCA9IE9QRU5TU0xfcG9ydF9tYWxsb2Moc2l6ZW9mKFNSUF91c2VyX3B3ZCkpOwogICAgIGlmIChyZXQgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgcmV0LT5OID0gTlVMTDsKQEAgLTI0OSw3ICsyNDksNyBAQAogCiBTUlBfVkJBU0UgKlNSUF9WQkFTRV9uZXcoY2hhciAqc2VlZF9rZXkpCiB7Ci0gICAgU1JQX1ZCQVNFICp2YiA9IChTUlBfVkJBU0UgKilPUEVOU1NMX21hbGxvYyhzaXplb2YoU1JQX1ZCQVNFKSk7CisgICAgU1JQX1ZCQVNFICp2YiA9IChTUlBfVkJBU0UgKilPUEVOU1NMX3BvcnRfbWFsbG9jKHNpemVvZihTUlBfVkJBU0UpKTsKIAogICAgIGlmICh2YiA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTI4NSw3ICsyODUsNyBAQAogICAgIGludCBsZW47CiAKICAgICBTUlBfZ05fY2FjaGUgKm5ld2dOID0KLSAgICAgICAgKFNSUF9nTl9jYWNoZSAqKU9QRU5TU0xfbWFsbG9jKHNpemVvZihTUlBfZ05fY2FjaGUpKTsKKyAgICAgICAgKFNSUF9nTl9jYWNoZSAqKU9QRU5TU0xfcG9ydF9tYWxsb2Moc2l6ZW9mKFNSUF9nTl9jYWNoZSkpOwogICAgIGlmIChuZXdnTiA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKIApAQCAtMzkxLDcgKzM5MSw3IEBACiAgICAgICAgICAgICAgKiB3ZSBhZGQgdGhpcyBjb3VwbGUgaW4gdGhlIGludGVybmFsIFN0YWNrCiAgICAgICAgICAgICAgKi8KIAotICAgICAgICAgICAgaWYgKChnTiA9IChTUlBfZ04gKikgT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKFNSUF9nTikpKSA9PSBOVUxMKQorICAgICAgICAgICAgaWYgKChnTiA9IChTUlBfZ04gKikgT1BFTlNTTF9wb3J0X21hbGxvYyhzaXplb2YoU1JQX2dOKSkpID09IE5VTEwpCiAgICAgICAgICAgICAgICAgZ290byBlcnI7CiAKICAgICAgICAgICAgIGlmICghKGdOLT5pZCA9IEJVRl9zdHJkdXAocHBbREJfc3JwaWRdKSkKQEAgLTUyMSwxMiArNTIxLDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKip2ZXJpZmllciwgY29uc3QgY2hhciAqTiwgY29uc3QgY2hhciAqZykKIHsKICAgICBpbnQgbGVuOwotICAgIGNoYXIgKnJlc3VsdCA9IE5VTEw7Ci0gICAgY2hhciAqdmY7CisgICAgY2hhciAqcmVzdWx0ID0gTlVMTCwgKnZmID0gTlVMTDsKICAgICBCSUdOVU0gKk5fYm4gPSBOVUxMLCAqZ19ibiA9IE5VTEwsICpzID0gTlVMTCwgKnYgPSBOVUxMOwogICAgIHVuc2lnbmVkIGNoYXIgdG1wW01BWF9MRU5dOwogICAgIHVuc2lnbmVkIGNoYXIgdG1wMltNQVhfTEVOXTsKICAgICBjaGFyICpkZWZnTmlkID0gTlVMTDsKKyAgICBpbnQgdmZzaXplID0gMDsKIAogICAgIGlmICgodXNlciA9PSBOVUxMKSB8fAogICAgICAgICAocGFzcyA9PSBOVUxMKSB8fCAoc2FsdCA9PSBOVUxMKSB8fCAodmVyaWZpZXIgPT0gTlVMTCkpCkBAIC01NjQsMjIgKzU2NCwyMyBAQAogICAgICAgICBnb3RvIGVycjsKIAogICAgIEJOX2JuMmJpbih2LCB0bXApOwotICAgIGlmICgoKHZmID0gT1BFTlNTTF9tYWxsb2MoQk5fbnVtX2J5dGVzKHYpICogMikpID09IE5VTEwpKQorICAgIHZmc2l6ZSA9IEJOX251bV9ieXRlcyh2KSAqIDI7CisgICAgaWYgKCgodmYgPSBPUEVOU1NMX3BvcnRfbWFsbG9jKHZmc2l6ZSkpID09IE5VTEwpKQogICAgICAgICBnb3RvIGVycjsKICAgICB0X3RvYjY0KHZmLCB0bXAsIEJOX251bV9ieXRlcyh2KSk7CiAKLSAgICAqdmVyaWZpZXIgPSB2ZjsKICAgICBpZiAoKnNhbHQgPT0gTlVMTCkgewogICAgICAgICBjaGFyICp0bXBfc2FsdDsKIAotICAgICAgICBpZiAoKHRtcF9zYWx0ID0gT1BFTlNTTF9tYWxsb2MoU1JQX1JBTkRPTV9TQUxUX0xFTiAqIDIpKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBPUEVOU1NMX2ZyZWUodmYpOworICAgICAgICBpZiAoKHRtcF9zYWx0ID0gT1BFTlNTTF9wb3J0X21hbGxvYyhTUlBfUkFORE9NX1NBTFRfTEVOICogMikpID09IE5VTEwpIHsKICAgICAgICAgICAgIGdvdG8gZXJyOwogICAgICAgICB9CiAgICAgICAgIHRfdG9iNjQodG1wX3NhbHQsIHRtcDIsIFNSUF9SQU5ET01fU0FMVF9MRU4pOwogICAgICAgICAqc2FsdCA9IHRtcF9zYWx0OwogICAgIH0KIAorICAgICp2ZXJpZmllciA9IHZmOworICAgIHZmID0gTlVMTDsKICAgICByZXN1bHQgPSBkZWZnTmlkOwogCiAgZXJyOgpAQCAtNTg3LDExICs1ODgsMjEgQEAKICAgICAgICAgQk5fZnJlZShOX2JuKTsKICAgICAgICAgQk5fZnJlZShnX2JuKTsKICAgICB9CisgICAgT1BFTlNTTF9jbGVhbnNlKHZmLCB2ZnNpemUpOworICAgIE9QRU5TU0xfZnJlZSh2Zik7CisgICAgQk5fY2xlYXJfZnJlZShzKTsKKyAgICBCTl9jbGVhcl9mcmVlKHYpOwogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8qCi0gKiBjcmVhdGUgYSB2ZXJpZmllciAoKnNhbHQsKnZlcmlmaWVyLGcgYW5kIE4gYXJlIEJJR05VTXMpCisgKiBjcmVhdGUgYSB2ZXJpZmllciAoKnNhbHQsKnZlcmlmaWVyLGcgYW5kIE4gYXJlIEJJR05VTXMpLiBJZiAqc2FsdCAhPSBOVUxMCisgKiB0aGVuIHRoZSBwcm92aWRlZCBzYWx0IHdpbGwgYmUgdXNlZC4gT24gc3VjY2Vzc2Z1bCBleGl0ICp2ZXJpZmllciB3aWxsIHBvaW50CisgKiB0byBhIG5ld2x5IGFsbG9jYXRlZCBCSUdOVU0gY29udGFpbmluZyB0aGUgdmVyaWZpZXIgYW5kIChpZiBhIHNhbHQgd2FzIG5vdAorICogcHJvdmlkZWQpICpzYWx0IHdpbGwgYmUgcG9wdWxhdGVkIHdpdGggYSBuZXdseSBhbGxvY2F0ZWQgQklHTlVNIGNvbnRhaW5pbmcgYQorICogcmFuZG9tIHNhbHQuCisgKiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBmcmVlaW5nIHRoZSBhbGxvY2F0ZWQgKnNhbHQgYW5kICp2ZXJpZmllcgorICogQklHTlVNUy4KICAqLwogaW50IFNSUF9jcmVhdGVfdmVyaWZpZXJfQk4oY29uc3QgY2hhciAqdXNlciwgY29uc3QgY2hhciAqcGFzcywgQklHTlVNICoqc2FsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJR05VTSAqKnZlcmlmaWVyLCBCSUdOVU0gKk4sIEJJR05VTSAqZykKQEAgLTYwMCw2ICs2MTEsNyBAQAogICAgIEJJR05VTSAqeCA9IE5VTEw7CiAgICAgQk5fQ1RYICpibl9jdHggPSBCTl9DVFhfbmV3KCk7CiAgICAgdW5zaWduZWQgY2hhciB0bXAyW01BWF9MRU5dOworICAgIEJJR05VTSAqc2FsdHRtcCA9IE5VTEw7CiAKICAgICBpZiAoKHVzZXIgPT0gTlVMTCkgfHwKICAgICAgICAgKHBhc3MgPT0gTlVMTCkgfHwKQEAgLTYxNCwxMCArNjI2LDEyIEBACiAgICAgICAgIGlmIChSQU5EX3BzZXVkb19ieXRlcyh0bXAyLCBTUlBfUkFORE9NX1NBTFRfTEVOKSA8IDApCiAgICAgICAgICAgICBnb3RvIGVycjsKIAotICAgICAgICAqc2FsdCA9IEJOX2JpbjJibih0bXAyLCBTUlBfUkFORE9NX1NBTFRfTEVOLCBOVUxMKTsKKyAgICAgICAgc2FsdHRtcCA9IEJOX2JpbjJibih0bXAyLCBTUlBfUkFORE9NX1NBTFRfTEVOLCBOVUxMKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzYWx0dG1wID0gKnNhbHQ7CiAgICAgfQogCi0gICAgeCA9IFNSUF9DYWxjX3goKnNhbHQsIHVzZXIsIHBhc3MpOworICAgIHggPSBTUlBfQ2FsY194KHNhbHR0bXAsIHVzZXIsIHBhc3MpOwogCiAgICAgKnZlcmlmaWVyID0gQk5fbmV3KCk7CiAgICAgaWYgKCp2ZXJpZmllciA9PSBOVUxMKQpAQCAtNjMxLDkgKzY0NSwxMSBAQAogICAgIHNycF9ibl9wcmludCgqdmVyaWZpZXIpOwogCiAgICAgcmVzdWx0ID0gMTsKKyAgICAqc2FsdCA9IHNhbHR0bXA7CiAKICBlcnI6Ci0KKyAgICBpZiAoKnNhbHQgIT0gc2FsdHRtcCkKKyAgICAgICAgQk5fY2xlYXJfZnJlZShzYWx0dG1wKTsKICAgICBCTl9jbGVhcl9mcmVlKHgpOwogICAgIEJOX0NUWF9mcmVlKGJuX2N0eCk7CiAgICAgcmV0dXJuIHJlc3VsdDsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL3N0b3JlL3N0b3JlLmggYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9zdG9yZS9zdG9yZS5oCmluZGV4IDgzNDMzNDEuLmNlMzcwOWQgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL3N0b3JlL3N0b3JlLmgKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vc3RvcmUvc3RvcmUuaApAQCAtMSw0ICsxLDQgQEAKLS8qIGNyeXB0by9zdG9yZS9zdG9yZS5oIC0qLSBtb2RlOkM7IGMtZmlsZS1zdHlsZTogImVheSIgLSotICovCisvKiBjcnlwdG8vc3RvcmUvc3RvcmUuaCAqLwogLyoKICAqIFdyaXR0ZW4gYnkgUmljaGFyZCBMZXZpdHRlIChyaWNoYXJkQGxldml0dGUub3JnKSBmb3IgdGhlIE9wZW5TU0wgcHJvamVjdAogICogMjAwMy4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL3N0b3JlL3N0cl9saWIuYyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL3N0b3JlL3N0cl9saWIuYwppbmRleCAyMjdiNzk3Li5lM2Q1ZGE5IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9zdG9yZS9zdHJfbGliLmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vc3RvcmUvc3RyX2xpYi5jCkBAIC0xLDQgKzEsNCBAQAotLyogY3J5cHRvL3N0b3JlL3N0cl9saWIuYyAtKi0gbW9kZTpDOyBjLWZpbGUtc3R5bGU6ICJlYXkiIC0qLSAqLworLyogY3J5cHRvL3N0b3JlL3N0cl9saWIuYyAqLwogLyoKICAqIFdyaXR0ZW4gYnkgUmljaGFyZCBMZXZpdHRlIChyaWNoYXJkQGxldml0dGUub3JnKSBmb3IgdGhlIE9wZW5TU0wgcHJvamVjdAogICogMjAwMy4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL3N0b3JlL3N0cl9sb2NsLmggYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9zdG9yZS9zdHJfbG9jbC5oCmluZGV4IGFjNTU3ODQuLmMwYjQwZjAgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL3N0b3JlL3N0cl9sb2NsLmgKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vc3RvcmUvc3RyX2xvY2wuaApAQCAtMSw0ICsxLDQgQEAKLS8qIGNyeXB0by9zdG9yZS9zdHJfbG9jbC5oIC0qLSBtb2RlOkM7IGMtZmlsZS1zdHlsZTogImVheSIgLSotICovCisvKiBjcnlwdG8vc3RvcmUvc3RyX2xvY2wuaCAqLwogLyoKICAqIFdyaXR0ZW4gYnkgUmljaGFyZCBMZXZpdHRlIChyaWNoYXJkQGxldml0dGUub3JnKSBmb3IgdGhlIE9wZW5TU0wgcHJvamVjdAogICogMjAwMy4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL3N0b3JlL3N0cl9tZW0uYyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL3N0b3JlL3N0cl9tZW0uYwppbmRleCA4ZWRkMGViLi42ZWVlNWJiIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9zdG9yZS9zdHJfbWVtLmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vc3RvcmUvc3RyX21lbS5jCkBAIC0xLDQgKzEsNCBAQAotLyogY3J5cHRvL3N0b3JlL3N0cl9tZW0uYyAtKi0gbW9kZTpDOyBjLWZpbGUtc3R5bGU6ICJlYXkiIC0qLSAqLworLyogY3J5cHRvL3N0b3JlL3N0cl9tZW0uYyAqLwogLyoKICAqIFdyaXR0ZW4gYnkgUmljaGFyZCBMZXZpdHRlIChyaWNoYXJkQGxldml0dGUub3JnKSBmb3IgdGhlIE9wZW5TU0wgcHJvamVjdAogICogMjAwMy4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL3N0b3JlL3N0cl9tZXRoLmMgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by9zdG9yZS9zdHJfbWV0aC5jCmluZGV4IGQ4M2E2ZGUuLmM4M2ZiYzUgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL3N0b3JlL3N0cl9tZXRoLmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vc3RvcmUvc3RyX21ldGguYwpAQCAtMSw0ICsxLDQgQEAKLS8qIGNyeXB0by9zdG9yZS9zdHJfbWV0aC5jIC0qLSBtb2RlOkM7IGMtZmlsZS1zdHlsZTogImVheSIgLSotICovCisvKiBjcnlwdG8vc3RvcmUvc3RyX21ldGguYyAqLwogLyoKICAqIFdyaXR0ZW4gYnkgUmljaGFyZCBMZXZpdHRlIChyaWNoYXJkQGxldml0dGUub3JnKSBmb3IgdGhlIE9wZW5TU0wgcHJvamVjdAogICogMjAwMy4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL3RzL3RzX3JzcF92ZXJpZnkuYyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL3RzL3RzX3JzcF92ZXJpZnkuYwppbmRleCAzMmI0ZDk5Li5lMjRiMmQ1IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by90cy90c19yc3BfdmVyaWZ5LmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vdHMvdHNfcnNwX3ZlcmlmeS5jCkBAIC0yNTUsNyArMjU1LDggQEAKIAogICAgIC8qIGNoYWluIGlzIGFuIG91dCBhcmd1bWVudC4gKi8KICAgICAqY2hhaW4gPSBOVUxMOwotICAgIFg1MDlfU1RPUkVfQ1RYX2luaXQoJmNlcnRfY3R4LCBzdG9yZSwgc2lnbmVyLCB1bnRydXN0ZWQpOworICAgIGlmICghWDUwOV9TVE9SRV9DVFhfaW5pdCgmY2VydF9jdHgsIHN0b3JlLCBzaWduZXIsIHVudHJ1c3RlZCkpCisgICAgICAgIHJldHVybiAwOwogICAgIFg1MDlfU1RPUkVfQ1RYX3NldF9wdXJwb3NlKCZjZXJ0X2N0eCwgWDUwOV9QVVJQT1NFX1RJTUVTVEFNUF9TSUdOKTsKICAgICBpID0gWDUwOV92ZXJpZnlfY2VydCgmY2VydF9jdHgpOwogICAgIGlmIChpIDw9IDApIHsKQEAgLTUyMiw3ICs1MjMsNyBAQAogICAgICAgICAgICAgaWYgKEFTTjFfQklUX1NUUklOR19nZXRfYml0KGluZm8tPmZhaWx1cmVfaW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUU19mYWlsdXJlX2luZm9baV0uY29kZSkpIHsKICAgICAgICAgICAgICAgICBpZiAoIWZpcnN0KQotICAgICAgICAgICAgICAgICAgICBzdHJjcHkoZmFpbHVyZV90ZXh0LCAiLCIpOworICAgICAgICAgICAgICAgICAgICBzdHJjYXQoZmFpbHVyZV90ZXh0LCAiLCIpOwogICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSAwOwogICAgICAgICAgICAgICAgIHN0cmNhdChmYWlsdXJlX3RleHQsIFRTX2ZhaWx1cmVfaW5mb1tpXS50ZXh0KTsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL3VpL3VpLmggYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by91aS91aS5oCmluZGV4IGI5MTdlZGEuLjBkYzE2MzMgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL3VpL3VpLmgKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vdWkvdWkuaApAQCAtMSw0ICsxLDQgQEAKLS8qIGNyeXB0by91aS91aS5oIC0qLSBtb2RlOkM7IGMtZmlsZS1zdHlsZTogImVheSIgLSotICovCisvKiBjcnlwdG8vdWkvdWkuaCAqLwogLyoKICAqIFdyaXR0ZW4gYnkgUmljaGFyZCBMZXZpdHRlIChyaWNoYXJkQGxldml0dGUub3JnKSBmb3IgdGhlIE9wZW5TU0wgcHJvamVjdAogICogMjAwMS4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL3VpL3VpX2NvbXBhdC5jIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vdWkvdWlfY29tcGF0LmMKaW5kZXggMGNhNTI4NC4uZTc5ZDU0ZSAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vdWkvdWlfY29tcGF0LmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vdWkvdWlfY29tcGF0LmMKQEAgLTEsNCArMSw0IEBACi0vKiBjcnlwdG8vdWkvdWlfY29tcGF0LmMgLSotIG1vZGU6QzsgYy1maWxlLXN0eWxlOiAiZWF5IiAtKi0gKi8KKy8qIGNyeXB0by91aS91aV9jb21wYXQuYyAqLwogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqIENvcHlyaWdodCAoYykgMjAwMS0yMDAyIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL3VpL3VpX2NvbXBhdC5oIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vdWkvdWlfY29tcGF0LmgKaW5kZXggNDJmYjlmZi4uYmY1NDE1NCAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vdWkvdWlfY29tcGF0LmgKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vdWkvdWlfY29tcGF0LmgKQEAgLTEsNCArMSw0IEBACi0vKiBjcnlwdG8vdWkvdWkuaCAtKi0gbW9kZTpDOyBjLWZpbGUtc3R5bGU6ICJlYXkiIC0qLSAqLworLyogY3J5cHRvL3VpL3VpLmggKi8KIC8qCiAgKiBXcml0dGVuIGJ5IFJpY2hhcmQgTGV2aXR0ZSAocmljaGFyZEBsZXZpdHRlLm9yZykgZm9yIHRoZSBPcGVuU1NMIHByb2plY3QKICAqIDIwMDEuCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by91aS91aV9saWIuYyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL3VpL3VpX2xpYi5jCmluZGV4IDVkZGQ3MzEuLjJmNTgwMzUgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL3VpL3VpX2xpYi5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL3VpL3VpX2xpYi5jCkBAIC0xLDQgKzEsNCBAQAotLyogY3J5cHRvL3VpL3VpX2xpYi5jIC0qLSBtb2RlOkM7IGMtZmlsZS1zdHlsZTogImVheSIgLSotICovCisvKiBjcnlwdG8vdWkvdWlfbGliLmMgKi8KIC8qCiAgKiBXcml0dGVuIGJ5IFJpY2hhcmQgTGV2aXR0ZSAocmljaGFyZEBsZXZpdHRlLm9yZykgZm9yIHRoZSBPcGVuU1NMIHByb2plY3QKICAqIDIwMDEuCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by91aS91aV9sb2NsLmggYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by91aS91aV9sb2NsLmgKaW5kZXggMGQ5MTljZC4uYmViYzEzYSAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vdWkvdWlfbG9jbC5oCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL3VpL3VpX2xvY2wuaApAQCAtMSw0ICsxLDQgQEAKLS8qIGNyeXB0by91aS91aS5oIC0qLSBtb2RlOkM7IGMtZmlsZS1zdHlsZTogImVheSIgLSotICovCisvKiBjcnlwdG8vdWkvdWkuaCAqLwogLyoKICAqIFdyaXR0ZW4gYnkgUmljaGFyZCBMZXZpdHRlIChyaWNoYXJkQGxldml0dGUub3JnKSBmb3IgdGhlIE9wZW5TU0wgcHJvamVjdAogICogMjAwMS4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL3VpL3VpX29wZW5zc2wuYyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL3VpL3VpX29wZW5zc2wuYwppbmRleCA3NzUzYWQ4Li5iNGZiNzAzIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by91aS91aV9vcGVuc3NsLmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vdWkvdWlfb3BlbnNzbC5jCkBAIC0xLDQgKzEsNCBAQAotLyogY3J5cHRvL3VpL3VpX29wZW5zc2wuYyAtKi0gbW9kZTpDOyBjLWZpbGUtc3R5bGU6ICJlYXkiIC0qLSAqLworLyogY3J5cHRvL3VpL3VpX29wZW5zc2wuYyAqLwogLyoKICAqIFdyaXR0ZW4gYnkgUmljaGFyZCBMZXZpdHRlIChyaWNoYXJkQGxldml0dGUub3JnKSBhbmQgb3RoZXJzIGZvciB0aGUKICAqIE9wZW5TU0wgcHJvamVjdCAyMDAxLgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vdWkvdWlfdXRpbC5jIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vdWkvdWlfdXRpbC5jCmluZGV4IGY2NWY4MGQuLjBmMjkwMTEgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL3VpL3VpX3V0aWwuYworKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by91aS91aV91dGlsLmMKQEAgLTEsNCArMSw0IEBACi0vKiBjcnlwdG8vdWkvdWlfdXRpbC5jIC0qLSBtb2RlOkM7IGMtZmlsZS1zdHlsZTogImVheSIgLSotICovCisvKiBjcnlwdG8vdWkvdWlfdXRpbC5jICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDIgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vd2hybHBvb2wvYXNtL3dwLW1teC5wbCBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL3docmxwb29sL2FzbS93cC1tbXgucGwKaW5kZXggY2IyMzgxYy4uOTBjMmVjYSAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8vd2hybHBvb2wvYXNtL3dwLW1teC5wbAorKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by93aHJscG9vbC9hc20vd3AtbW14LnBsCkBAIC0xNiw3ICsxNiw3IEBACiAjIHRhYmxlXS4gSSBzdGljayB0byB2YWx1ZSBvZiAyIGZvciB0d28gcmVhc29uczogMS4gc21hbGxlciB0YWJsZQogIyBtaW5pbWl6ZXMgY2FjaGUgdHJhc2hpbmcgYW5kIHRodXMgbWl0aWdhdGVzIHRoZSBoYXphcmQgb2Ygc2lkZS0KICMgY2hhbm5lbCBsZWFrYWdlIHNpbWlsYXIgdG8gQUVTIGNhY2hlLXRpbWluZyBvbmU7IDIuIHBlcmZvcm1hbmNlCi0jIGdhcCBhbW9uZyBkaWZmZXJlbnQgtS1hcmNocyBpcyBzbWFsbGVyLgorIyBnYXAgYW1vbmcgZGlmZmVyZW50IMK1LWFyY2hzIGlzIHNtYWxsZXIuCiAjCiAjIFBlcmZvcm1hbmNlIHRhYmxlIGxpc3RzIHJvdW5kZWQgYW1vdW50cyBvZiBDUFUgY3ljbGVzIHNwZW50IGJ5CiAjIHdoaXJscG9vbF9ibG9ja19tbXggcm91dGluZSBvbiBzaW5nbGUgNjQgYnl0ZSBpbnB1dCBibG9jaywgaS5lLgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8veDUwOS94NTA5X2NtcC5jIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8veDUwOS94NTA5X2NtcC5jCmluZGV4IDAwNmFkNmMuLmNkYmQzMWEgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL3g1MDkveDUwOV9jbXAuYworKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by94NTA5L3g1MDlfY21wLmMKQEAgLTE4MiwxMSArMTgyLDI0IEBACiAgKi8KIGludCBYNTA5X2NtcChjb25zdCBYNTA5ICphLCBjb25zdCBYNTA5ICpiKQogeworICAgIGludCBydjsKKwogICAgIC8qIGVuc3VyZSBoYXNoIGlzIHZhbGlkICovCiAgICAgWDUwOV9jaGVja19wdXJwb3NlKChYNTA5ICopYSwgLTEsIDApOwogICAgIFg1MDlfY2hlY2tfcHVycG9zZSgoWDUwOSAqKWIsIC0xLCAwKTsKIAotICAgIHJldHVybiBPUEVOU1NMX3BvcnRfbWVtY21wKGEtPnNoYTFfaGFzaCwgYi0+c2hhMV9oYXNoLCBTSEFfRElHRVNUX0xFTkdUSCk7CisgICAgcnYgPSBPUEVOU1NMX3BvcnRfbWVtY21wKGEtPnNoYTFfaGFzaCwgYi0+c2hhMV9oYXNoLCBTSEFfRElHRVNUX0xFTkdUSCk7CisgICAgaWYgKHJ2KQorICAgICAgICByZXR1cm4gcnY7CisgICAgLyogQ2hlY2sgZm9yIG1hdGNoIGFnYWluc3Qgc3RvcmVkIGVuY29kaW5nIHRvbyAqLworICAgIGlmICghYS0+Y2VydF9pbmZvLT5lbmMubW9kaWZpZWQgJiYgIWItPmNlcnRfaW5mby0+ZW5jLm1vZGlmaWVkKSB7CisgICAgICAgIHJ2ID0gKGludCkoYS0+Y2VydF9pbmZvLT5lbmMubGVuIC0gYi0+Y2VydF9pbmZvLT5lbmMubGVuKTsKKyAgICAgICAgaWYgKHJ2KQorICAgICAgICAgICAgcmV0dXJuIHJ2OworICAgICAgICByZXR1cm4gT1BFTlNTTF9wb3J0X21lbWNtcChhLT5jZXJ0X2luZm8tPmVuYy5lbmMsIGItPmNlcnRfaW5mby0+ZW5jLmVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS0+Y2VydF9pbmZvLT5lbmMubGVuKTsKKyAgICB9CisgICAgcmV0dXJuIHJ2OwogfQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL3g1MDkveDUwOV9sdS5jIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8veDUwOS94NTA5X2x1LmMKaW5kZXggY2JiYTc0Mi4uMjhmMDBhNCAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8veDUwOS94NTA5X2x1LmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8veDUwOS94NTA5X2x1LmMKQEAgLTUyNiw4ICs1MjYsNiBAQAogICAgIFg1MDlfT0JKRUNUICpvYmosIHhvYmo7CiAgICAgc2sgPSBza19YNTA5X0NSTF9uZXdfbnVsbCgpOwogICAgIENSWVBUT193X2xvY2soQ1JZUFRPX0xPQ0tfWDUwOV9TVE9SRSk7Ci0gICAgLyogQ2hlY2sgY2FjaGUgZmlyc3QgKi8KLSAgICBpZHggPSB4NTA5X29iamVjdF9pZHhfY250KGN0eC0+Y3R4LT5vYmpzLCBYNTA5X0xVX0NSTCwgbm0sICZjbnQpOwogCiAgICAgLyoKICAgICAgKiBBbHdheXMgZG8gbG9va3VwIHRvIHBvc3NpYmx5IGFkZCBuZXcgQ1JMcyB0byBjYWNoZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8veDUwOS94NTA5X3ZmeS5jIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8veDUwOS94NTA5X3ZmeS5jCmluZGV4IDQ4MzliNWUuLmMyY2QxZWQgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL3g1MDkveDUwOV92ZnkuYworKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by94NTA5L3g1MDlfdmZ5LmMKQEAgLTIwMjksOSArMjAyOSwxMCBAQAogICAgIGN0eC0+Y3VycmVudF9yZWFzb25zID0gMDsKICAgICBjdHgtPnRyZWUgPSBOVUxMOwogICAgIGN0eC0+cGFyZW50ID0gTlVMTDsKKyAgICAvKiBaZXJvIGV4X2RhdGEgdG8gbWFrZSBzdXJlIHdlJ3JlIGNsZWFudXAtc2FmZSAqLworICAgIE9QRU5TU0xfcG9ydF9tZW1zZXQoJmN0eC0+ZXhfZGF0YSwgMCwgc2l6ZW9mKGN0eC0+ZXhfZGF0YSkpOwogCiAgICAgY3R4LT5wYXJhbSA9IFg1MDlfVkVSSUZZX1BBUkFNX25ldygpOwotCiAgICAgaWYgKCFjdHgtPnBhcmFtKSB7CiAgICAgICAgIFg1MDllcnIoWDUwOV9GX1g1MDlfU1RPUkVfQ1RYX0lOSVQsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICAgICAgcmV0dXJuIDA7CkBAIC0yMDQwLDcgKzIwNDEsNiBAQAogICAgIC8qCiAgICAgICogSW5oZXJpdCBjYWxsYmFja3MgYW5kIGZsYWdzIGZyb20gWDUwOV9TVE9SRSBpZiBub3Qgc2V0IHVzZSBkZWZhdWx0cy4KICAgICAgKi8KLQogICAgIGlmIChzdG9yZSkKICAgICAgICAgcmV0ID0gWDUwOV9WRVJJRllfUEFSQU1faW5oZXJpdChjdHgtPnBhcmFtLCBzdG9yZS0+cGFyYW0pOwogICAgIGVsc2UKQEAgLTIwNDgsNiArMjA0OCw3IEBACiAKICAgICBpZiAoc3RvcmUpIHsKICAgICAgICAgY3R4LT52ZXJpZnlfY2IgPSBzdG9yZS0+dmVyaWZ5X2NiOworICAgICAgICAvKiBTZWVtcyB0byBhbHdheXMgYmUgMCBpbiBPcGVuU1NMLCBlbHNlIG11c3QgYmUgaWRlbXBvdGVudCAqLwogICAgICAgICBjdHgtPmNsZWFudXAgPSBzdG9yZS0+Y2xlYW51cDsKICAgICB9IGVsc2UKICAgICAgICAgY3R4LT5jbGVhbnVwID0gMDsKQEAgLTIwNTgsNyArMjA1OSw3IEBACiAKICAgICBpZiAocmV0ID09IDApIHsKICAgICAgICAgWDUwOWVycihYNTA5X0ZfWDUwOV9TVE9SRV9DVFhfSU5JVCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwotICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgZ290byBlcnI7CiAgICAgfQogCiAgICAgaWYgKHN0b3JlICYmIHN0b3JlLT5jaGVja19pc3N1ZWQpCkBAIC0yMTEzLDE5ICsyMTE0LDE4IEBACiAKICAgICBjdHgtPmNoZWNrX3BvbGljeSA9IGNoZWNrX3BvbGljeTsKIAorICAgIGlmIChDUllQVE9fbmV3X2V4X2RhdGEoQ1JZUFRPX0VYX0lOREVYX1g1MDlfU1RPUkVfQ1RYLCBjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3R4LT5leF9kYXRhKSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgWDUwOWVycihYNTA5X0ZfWDUwOV9TVE9SRV9DVFhfSU5JVCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCisgZXJyOgogICAgIC8qCi0gICAgICogVGhpcyBPUEVOU1NMX3BvcnRfbWVtc2V0KCkgY2FuJ3QgbWFrZSBhbnkgc2Vuc2UgYW55d2F5LCBzbyBpdCdzIHJlbW92ZWQuIEFzCi0gICAgICogWDUwOV9TVE9SRV9DVFhfY2xlYW51cCBkb2VzIGEgcHJvcGVyICJmcmVlIiBvbiB0aGUgZXhfZGF0YSwgd2UgcHV0IGEKLSAgICAgKiBjb3JyZXNwb25kaW5nICJuZXciIGhlcmUgYW5kIHJlbW92ZSB0aGlzIGJvZ3VzIGluaXRpYWxpc2F0aW9uLgorICAgICAqIE9uIGVycm9yIGNsZWFuIHVwIGFsbG9jYXRlZCBzdG9yYWdlLCBpZiB0aGUgc3RvcmUgY29udGV4dCB3YXMgbm90CisgICAgICogYWxsb2NhdGVkIHdpdGggWDUwOV9TVE9SRV9DVFhfbmV3KCkgdGhpcyBpcyBvdXIgbGFzdCBjaGFuY2UgdG8gZG8gc28uCiAgICAgICovCi0gICAgLyogT1BFTlNTTF9wb3J0X21lbXNldCgmKGN0eC0+ZXhfZGF0YSksMCxzaXplb2YoQ1JZUFRPX0VYX0RBVEEpKTsgKi8KLSAgICBpZiAoIUNSWVBUT19uZXdfZXhfZGF0YShDUllQVE9fRVhfSU5ERVhfWDUwOV9TVE9SRV9DVFgsIGN0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKGN0eC0+ZXhfZGF0YSkpKSB7Ci0gICAgICAgIE9QRU5TU0xfZnJlZShjdHgpOwotICAgICAgICBYNTA5ZXJyKFg1MDlfRl9YNTA5X1NUT1JFX0NUWF9JTklULCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gMTsKKyAgICBYNTA5X1NUT1JFX0NUWF9jbGVhbnVwKGN0eCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC0yMTQxLDggKzIxNDEsMTcgQEAKIAogdm9pZCBYNTA5X1NUT1JFX0NUWF9jbGVhbnVwKFg1MDlfU1RPUkVfQ1RYICpjdHgpCiB7Ci0gICAgaWYgKGN0eC0+Y2xlYW51cCkKKyAgICAvKgorICAgICAqIFdlIG5lZWQgdG8gYmUgaWRlbXBvdGVudCBiZWNhdXNlLCB1bmZvcnR1bmF0ZWx5LCBmcmVlKCkgYWxzbyBjYWxscworICAgICAqIGNsZWFudXAoKSwgc28gdGhlIG5hdHVyYWwgY2FsbCBzZXF1ZW5jZSBuZXcoKSwgaW5pdCgpLCBjbGVhbnVwKCksIGZyZWUoKQorICAgICAqIGNhbGxzIGNsZWFudXAoKSBmb3IgdGhlIHNhbWUgb2JqZWN0IHR3aWNlISAgVGh1cyB3ZSBtdXN0IHplcm8gdGhlCisgICAgICogcG9pbnRlcnMgYmVsb3cgYWZ0ZXIgdGhleSdyZSBmcmVlZCEKKyAgICAgKi8KKyAgICAvKiBTZWVtcyB0byBhbHdheXMgYmUgMCBpbiBPcGVuU1NMLCBkbyB0aGlzIGF0IG1vc3Qgb25jZS4gKi8KKyAgICBpZiAoY3R4LT5jbGVhbnVwICE9IE5VTEwpIHsKICAgICAgICAgY3R4LT5jbGVhbnVwKGN0eCk7CisgICAgICAgIGN0eC0+Y2xlYW51cCA9IE5VTEw7CisgICAgfQogICAgIGlmIChjdHgtPnBhcmFtICE9IE5VTEwpIHsKICAgICAgICAgaWYgKGN0eC0+cGFyZW50ID09IE5VTEwpCiAgICAgICAgICAgICBYNTA5X1ZFUklGWV9QQVJBTV9mcmVlKGN0eC0+cGFyYW0pOwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8veDUwOS94NTA5X3ZmeS5oIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8veDUwOS94NTA5X3ZmeS5oCmluZGV4IDAyZjJmODkuLjMxYzcwMDcgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL3g1MDkveDUwOV92ZnkuaAorKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by94NTA5L3g1MDlfdmZ5LmgKQEAgLTMxMCw3ICszMTAsNyBAQAogICAgICAgICAgICAgICAgIFg1MDlfTE9PS1VQX2N0cmwoKHgpLFg1MDlfTF9BRERfRElSLChuYW1lKSwobG9uZykodHlwZSksTlVMTCkKIAogIyBkZWZpbmUgICAgICAgICBYNTA5X1ZfT0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0vKiBpbGxlZ2FsIGVycm9yIChmb3IgdW5pbml0aWFsaXplZCB2YWx1ZXMsIHRvIGF2b2lkIFg1MDlfVl9PSyk6IDEgKi8KKyMgZGVmaW5lICAgICAgICAgWDUwOV9WX0VSUl9VTlNQRUNJRklFRCAgICAgICAgICAgICAgICAgICAgICAgICAgMQogCiAjIGRlZmluZSAgICAgICAgIFg1MDlfVl9FUlJfVU5BQkxFX1RPX0dFVF9JU1NVRVJfQ0VSVCAgICAgICAgICAgIDIKICMgZGVmaW5lICAgICAgICAgWDUwOV9WX0VSUl9VTkFCTEVfVE9fR0VUX0NSTCAgICAgICAgICAgICAgICAgICAgMwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8veDUwOXYzL3YzX2Nwb2xzLmMgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by94NTA5djMvdjNfY3BvbHMuYwppbmRleCAyOTQ3MGMyLi43NjRlODU4IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by94NTA5djMvdjNfY3BvbHMuYworKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by94NTA5djMvdjNfY3BvbHMuYwpAQCAtMTg5LDYgKzE4OSwxMCBAQAogICAgICAgICAgICAgICAgIGdvdG8gZXJyOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcG9sID0gUE9MSUNZSU5GT19uZXcoKTsKKyAgICAgICAgICAgIGlmIChwb2wgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFg1MDlWM2VycihYNTA5VjNfRl9SMklfQ0VSVFBPTCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgICAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICAgICAgfQogICAgICAgICAgICAgcG9sLT5wb2xpY3lpZCA9IHBvYmo7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFza19QT0xJQ1lJTkZPX3B1c2gocG9scywgcG9sKSkgewpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8veDUwOXYzL3YzX25jb25zLmMgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by94NTA5djMvdjNfbmNvbnMuYwppbmRleCAyMTE1MTlhLi40OTY3MDg0IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by94NTA5djMvdjNfbmNvbnMuYworKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by94NTA5djMvdjNfbmNvbnMuYwpAQCAtMTM1LDYgKzEzNSw4IEBACiAgICAgICAgIH0KICAgICAgICAgdHZhbC52YWx1ZSA9IHZhbC0+dmFsdWU7CiAgICAgICAgIHN1YiA9IEdFTkVSQUxfU1VCVFJFRV9uZXcoKTsKKyAgICAgICAgaWYgKHN1YiA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBtZW1lcnI7CiAgICAgICAgIGlmICghdjJpX0dFTkVSQUxfTkFNRV9leChzdWItPmJhc2UsIG1ldGhvZCwgY3R4LCAmdHZhbCwgMSkpCiAgICAgICAgICAgICBnb3RvIGVycjsKICAgICAgICAgaWYgKCEqcHRyZWUpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by94NTA5djMvdjNfcGNpLmMgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by94NTA5djMvdjNfcGNpLmMKaW5kZXggZjNiYTVkMi4uZTQ0YmI4NiAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8veDUwOXYzL3YzX3BjaS5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL3g1MDl2My92M19wY2kuYwpAQCAtMSw5ICsxLDkgQEAKLS8qIHYzX3BjaS5jIC0qLSBtb2RlOkM7IGMtZmlsZS1zdHlsZTogImVheSIgLSotICovCisvKiB2M19wY2kuYyAqLwogLyoKICAqIENvbnRyaWJ1dGVkIHRvIHRoZSBPcGVuU1NMIFByb2plY3QgMjAwNCBieSBSaWNoYXJkIExldml0dGUKICAqIChyaWNoYXJkQGxldml0dGUub3JnKQogICovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDQgS3VuZ2xpZ2EgVGVrbmlza2EgSPZnc2tvbGFuCisvKiBDb3B5cmlnaHQgKGMpIDIwMDQgS3VuZ2xpZ2EgVGVrbmlza2EgSMO2Z3Nrb2xhbgogICogKFJveWFsIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LCBTdG9ja2hvbG0sIFN3ZWRlbikuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL3g1MDl2My92M19wY2lhLmMgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2NyeXB0by94NTA5djMvdjNfcGNpYS5jCmluZGV4IDM1MGIzOTguLmU1M2M4MmUgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvY3J5cHRvL3g1MDl2My92M19wY2lhLmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9jcnlwdG8veDUwOXYzL3YzX3BjaWEuYwpAQCAtMSw5ICsxLDkgQEAKLS8qIHYzX3BjaWEuYyAtKi0gbW9kZTpDOyBjLWZpbGUtc3R5bGU6ICJlYXkiIC0qLSAqLworLyogdjNfcGNpYS5jICovCiAvKgogICogQ29udHJpYnV0ZWQgdG8gdGhlIE9wZW5TU0wgUHJvamVjdCAyMDA0IGJ5IFJpY2hhcmQgTGV2aXR0ZQogICogKHJpY2hhcmRAbGV2aXR0ZS5vcmcpCiAgKi8KLS8qIENvcHlyaWdodCAoYykgMjAwNCBLdW5nbGlnYSBUZWtuaXNrYSBI9mdza29sYW4KKy8qIENvcHlyaWdodCAoYykgMjAwNCBLdW5nbGlnYSBUZWtuaXNrYSBIw7Znc2tvbGFuCiAgKiAoUm95YWwgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksIFN0b2NraG9sbSwgU3dlZGVuKS4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9kZW1vcy9lYXN5X3Rscy9SRUFETUUgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2RlbW9zL2Vhc3lfdGxzL1JFQURNRQppbmRleCA4MTZhNTgwLi5lZTg5ZGZiIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2RlbW9zL2Vhc3lfdGxzL1JFQURNRQorKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2RlbW9zL2Vhc3lfdGxzL1JFQURNRQpAQCAtNjIsNCArNjIsNCBAQAogZGF5LCB3aGljaCBtZWFucyB0aGF0IGZ1dHVyZSByZXZpc2lvbnMgd2lsbCBub3QgYmUgZnVsbHkgY29tcGF0aWJsZSB0bwogdGhlIGN1cnJlbnQgdmVyc2lvbi4KIAotQm9kbyBN9mxsZXIgPGJvZG9Ab3BlbnNzbC5vcmc+CitCb2RvIE3DtmxsZXIgPGJvZG9Ab3BlbnNzbC5vcmc+CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2RlbW9zL2Vhc3lfdGxzL2Vhc3ktdGxzLmMgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2RlbW9zL2Vhc3lfdGxzL2Vhc3ktdGxzLmMKaW5kZXggNTY4MmU5MS4uZWJjYWRhZiAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9kZW1vcy9lYXN5X3Rscy9lYXN5LXRscy5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvZGVtb3MvZWFzeV90bHMvZWFzeS10bHMuYwpAQCAtMSw0ICsxLDQgQEAKLS8qIC0qLSBNb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJic2QiIC0qLSAqLworLyogKi8KIC8qLQogICogZWFzeS10bHMuYyAtLSBnZW5lcmljIFRMUyBwcm94eS4KICAqICRJZDogZWFzeS10bHMuYyx2IDEuNCAyMDAyLzAzLzA1IDA5OjA3OjE2IGJvZG8gRXhwICQKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvZGVtb3MvZWFzeV90bHMvZWFzeS10bHMuaCBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvZGVtb3MvZWFzeV90bHMvZWFzeS10bHMuaAppbmRleCAxYzU4N2I4Li5iODhkMjFjIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2RlbW9zL2Vhc3lfdGxzL2Vhc3ktdGxzLmgKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9kZW1vcy9lYXN5X3Rscy9lYXN5LXRscy5oCkBAIC0xLDQgKzEsNCBAQAotLyogLSotIE1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImJzZCIgLSotICovCisvKiAqLwogLyotCiAgKiBlYXN5LXRscy5oIC0tIGdlbmVyaWMgVExTIHByb3h5LgogICogJElkOiBlYXN5LXRscy5oLHYgMS4xIDIwMDEvMDkvMTcgMTk6MDY6NTkgYm9kbyBFeHAgJApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9kZW1vcy9lbmdpbmVzL3plbmNvZC9od196ZW5jb2QuYyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvZGVtb3MvZW5naW5lcy96ZW5jb2QvaHdfemVuY29kLmMKaW5kZXggMGMwZjUyNC4uZGFmMGFlZiAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9kZW1vcy9lbmdpbmVzL3plbmNvZC9od196ZW5jb2QuYworKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2RlbW9zL2VuZ2luZXMvemVuY29kL2h3X3plbmNvZC5jCkBAIC02MTAsNyArNjEwLDcgQEAKICAgICBwdHJfemVuY29kX3JjNF9jaXBoZXIgPSBwdHJfcmM0XzE7CiAKICAgICAvKgotICAgICAqIFdlIHNob3VsZCBwZWZvcm0gYSB0ZXN0IHRvIHNlZSBpZiB0aGVyZSBpcyBhY3R1YWxseSBhbnkgdW5pdCBydW5uaWcgb24KKyAgICAgKiBXZSBzaG91bGQgcGVyZm9ybSBhIHRlc3QgdG8gc2VlIGlmIHRoZXJlIGlzIGFjdHVhbGx5IGFueSB1bml0IHJ1bm5pZyBvbgogICAgICAqIHRoZSBzeXN0ZW0gLi4uIEV2ZW4gaWYgdGhlIGNyeXB0b3plbiBsaWJyYXJ5IGlzIGxvYWRlZCB0aGUgbW9kdWxlIGNvdWwKICAgICAgKiBub3QgYmUgbG9hZGVkIG9uIHRoZSBzeXN0ZW0gLi4uIEZvciBub3cgd2UgbWF5IGp1c3Qgb3BlbiBhbmQgY2xvc2UgdGhlCiAgICAgICogZGV2aWNlICEhCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2RlbW9zL3R1bmFsYS90dW5hbGEuYyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvZGVtb3MvdHVuYWxhL3R1bmFsYS5jCmluZGV4IDExYTdjNWIuLjNjZWVhMDIgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvZGVtb3MvdHVuYWxhL3R1bmFsYS5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvZGVtb3MvdHVuYWxhL3R1bmFsYS5jCkBAIC0xMTU0LDcgKzExNTQsNyBAQAogICAgIC8qCiAgICAgICogVGhpcyBmdW5jdGlvbiBuYW1lIGlzIGF0dHJpYnV0ZWQgdG8gdGhlIHRlcm0gZG9uYXRlZCBieSBEYXZpZCBTY2h3YXJ0egogICAgICAqIG9uIG9wZW5zc2wtZGV2LCBtZXNzYWdlLUlEOgotICAgICAqIDxOQ0JCTElFUE9DYm1hc0VLQkVBS0VFREdMSUFBLmRhdmlkc0B3ZWJtYXN0ZXIuY29tPi4gOi0pCisgICAgICogPE5DQkJMSUVQT0NOSk9BRUtCRUFLRUVER0xJQUEuZGF2aWRzQHdlYm1hc3Rlci5jb20+LiA6LSkKICAgICAgKi8KICAgICBpZiAoIXN0YXRlX21hY2hpbmVfY2h1cm4oJml0ZW0tPnNtKSkKICAgICAgICAgLyoKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvZG9jL2FwcHMvY2lwaGVycy5wb2QgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2RvYy9hcHBzL2NpcGhlcnMucG9kCmluZGV4IDBhYTFiYWQuLjBhZmU4MGQgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvZG9jL2FwcHMvY2lwaGVycy5wb2QKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9kb2MvYXBwcy9jaXBoZXJzLnBvZApAQCAtMjA1LDcgKzIwNSw3IEBACiBjaXBoZXIgc3VpdGVzIHVzaW5nIGVwaGVtZXJhbCBFQ0RIIGtleSBhZ3JlZW1lbnQsIGluY2x1ZGluZyBhbm9ueW1vdXMKIGNpcGhlciBzdWl0ZXMuCiAKLT1pdGVtIEI8RUVDREhFPgorPWl0ZW0gQjxFRUNESD4KIAogY2lwaGVyIHN1aXRlcyB1c2luZyBhdXRoZW50aWNhdGVkIGVwaGVtZXJhbCBFQ0RIIGtleSBhZ3JlZW1lbnQuCiAKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvZG9jL2FwcHMvZGdzdC5wb2QgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2RvYy9hcHBzL2Rnc3QucG9kCmluZGV4IDllMTU3OTguLmIyN2JiOTQgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvZG9jL2FwcHMvZGdzdC5wb2QKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9kb2MvYXBwcy9kZ3N0LnBvZApAQCAtMTMsNyArMTMsNiBAQAogW0I8LWhleD5dCiBbQjwtYmluYXJ5Pl0KIFtCPC1yPl0KLVtCPC1obWFjIGFyZz5dCiBbQjwtbm9uLWZpcHMtYWxsb3c+XQogW0I8LW91dCBmaWxlbmFtZT5dCiBbQjwtc2lnbiBmaWxlbmFtZT5dCkBAIC02NCwxMCArNjMsNiBAQAogCiBvdXRwdXQgdGhlIGRpZ2VzdCBpbiB0aGUgImNvcmV1dGlscyIgZm9ybWF0IHVzZWQgYnkgcHJvZ3JhbXMgbGlrZSBCPHNoYTFzdW0+LgogCi09aXRlbSBCPC1obWFjIGFyZz4KLQotc2V0IHRoZSBITUFDIGtleSB0byAiYXJnIi4KLQogPWl0ZW0gQjwtbm9uLWZpcHMtYWxsb3c+CiAKIEFsbG93IHVzZSBvZiBub24gRklQUyBkaWdlc3Qgd2hlbiBpbiBGSVBTIG1vZGUuICBUaGlzIGhhcyBubyBlZmZlY3Qgd2hlbiBub3QgaW4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvZG9jL2FwcHMvZ2VucnNhLnBvZCBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvZG9jL2FwcHMvZ2VucnNhLnBvZAppbmRleCBjYjAzZDA5Li4zZGM5ODcwIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2RvYy9hcHBzL2dlbnJzYS5wb2QKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9kb2MvYXBwcy9nZW5yc2EucG9kCkBAIC0xMCwxMiArMTAsNiBAQAogW0I8LW91dCBmaWxlbmFtZT5dCiBbQjwtcGFzc291dCBhcmc+XQogW0I8LWFlczEyOD5dCi1bQjwtYWVzMTI4Pl0KLVtCPC1hZXMxOTI+XQotW0I8LWFlczI1Nj5dCi1bQjwtY2FtZWxsaWExMjg+XQotW0I8LWNhbWVsbGlhMTkyPl0KLVtCPC1jYW1lbGxpYTI1Nj5dCiBbQjwtYWVzMTkyPl0KIFtCPC1hZXMyNTY+XQogW0I8LWNhbWVsbGlhMTI4Pl0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvZG9jL2FwcHMvcmVxLnBvZCBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvZG9jL2FwcHMvcmVxLnBvZAppbmRleCAwNzMwZDExLi4zN2VkMzc3IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2RvYy9hcHBzL3JlcS5wb2QKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9kb2MvYXBwcy9yZXEucG9kCkBAIC00OTAsNyArNDkwLDcgQEAKIFRoZSBhY3R1YWwgcGVybWl0dGVkIGZpZWxkIG5hbWVzIGFyZSBhbnkgb2JqZWN0IGlkZW50aWZpZXIgc2hvcnQgb3IKIGxvbmcgbmFtZXMuIFRoZXNlIGFyZSBjb21waWxlZCBpbnRvIE9wZW5TU0wgYW5kIGluY2x1ZGUgdGhlIHVzdWFsCiB2YWx1ZXMgc3VjaCBhcyBjb21tb25OYW1lLCBjb3VudHJ5TmFtZSwgbG9jYWxpdHlOYW1lLCBvcmdhbml6YXRpb25OYW1lLAotb3JnYW5pemF0aW9uVW5pdE5hbWUsIHN0YXRlT3JQcm92aW5jZU5hbWUuIEFkZGl0aW9uYWxseSBlbWFpbEFkZHJlc3MKK29yZ2FuaXphdGlvbmFsVW5pdE5hbWUsIHN0YXRlT3JQcm92aW5jZU5hbWUuIEFkZGl0aW9uYWxseSBlbWFpbEFkZHJlc3MKIGlzIGluY2x1ZGUgYXMgd2VsbCBhcyBuYW1lLCBzdXJuYW1lLCBnaXZlbk5hbWUgaW5pdGlhbHMgYW5kIGRuUXVhbGlmaWVyLgogCiBBZGRpdGlvbmFsIG9iamVjdCBpZGVudGlmaWVycyBjYW4gYmUgZGVmaW5lZCB3aXRoIHRoZSBCPG9pZF9maWxlPiBvcgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9kb2MvYXBwcy9zX3RpbWUucG9kIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9kb2MvYXBwcy9zX3RpbWUucG9kCmluZGV4IDVhMzhhYTIuLjkwODJkODcgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvZG9jL2FwcHMvc190aW1lLnBvZAorKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2RvYy9hcHBzL3NfdGltZS5wb2QKQEAgLTI2LDcgKzI2LDcgQEAKIAogPWhlYWQxIERFU0NSSVBUSU9OCiAKLVRoZSBCPHNfY2xpZW50PiBjb21tYW5kIGltcGxlbWVudHMgYSBnZW5lcmljIFNTTC9UTFMgY2xpZW50IHdoaWNoIGNvbm5lY3RzIHRvIGEKK1RoZSBCPHNfdGltZT4gY29tbWFuZCBpbXBsZW1lbnRzIGEgZ2VuZXJpYyBTU0wvVExTIGNsaWVudCB3aGljaCBjb25uZWN0cyB0byBhCiByZW1vdGUgaG9zdCB1c2luZyBTU0wvVExTLiBJdCBjYW4gcmVxdWVzdCBhIHBhZ2UgZnJvbSB0aGUgc2VydmVyIGFuZCBpbmNsdWRlcwogdGhlIHRpbWUgdG8gdHJhbnNmZXIgdGhlIHBheWxvYWQgZGF0YSBpbiBpdHMgdGltaW5nIG1lYXN1cmVtZW50cy4gSXQgbWVhc3VyZXMKIHRoZSBudW1iZXIgb2YgY29ubmVjdGlvbnMgd2l0aGluIGEgZ2l2ZW4gdGltZWZyYW1lLCB0aGUgYW1vdW50IG9mIGRhdGEKQEAgLTEyNyw3ICsxMjcsNyBAQAogCiA9aGVhZDEgTk9URVMKIAotQjxzX2NsaWVudD4gY2FuIGJlIHVzZWQgdG8gbWVhc3VyZSB0aGUgcGVyZm9ybWFuY2Ugb2YgYW4gU1NMIGNvbm5lY3Rpb24uCitCPHNfdGltZT4gY2FuIGJlIHVzZWQgdG8gbWVhc3VyZSB0aGUgcGVyZm9ybWFuY2Ugb2YgYW4gU1NMIGNvbm5lY3Rpb24uCiBUbyBjb25uZWN0IHRvIGFuIFNTTCBIVFRQIHNlcnZlciBhbmQgZ2V0IHRoZSBkZWZhdWx0IHBhZ2UgdGhlIGNvbW1hbmQKIAogIG9wZW5zc2wgc190aW1lIC1jb25uZWN0IHNlcnZlcm5hbWU6NDQzIC13d3cgLyAtQ0FwYXRoIHlvdXJkaXIgLUNBZmlsZSB5b3VyZmlsZS5wZW0gLWNpcGhlciBjb21tb25jaXBoZXIgWy1zc2wzXQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9kb2MvYXBwcy94NTA5LnBvZCBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvZG9jL2FwcHMveDUwOS5wb2QKaW5kZXggNjEwOTM4OS4uMWJiMDU1MCAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9kb2MvYXBwcy94NTA5LnBvZAorKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2RvYy9hcHBzL3g1MDkucG9kCkBAIC01MjksNyArNTI5LDggQEAKICJzcGFjZSIgYWRkaXRpb25hbGx5IHBsYWNlIGEgc3BhY2UgYWZ0ZXIgdGhlIHNlcGFyYXRvciB0byBtYWtlIGl0CiBtb3JlIHJlYWRhYmxlLiBUaGUgQjxzZXBfbXVsdGlsaW5lPiB1c2VzIGEgbGluZWZlZWQgY2hhcmFjdGVyIGZvcgogdGhlIFJETiBzZXBhcmF0b3IgYW5kIGEgc3BhY2VkIEI8Kz4gZm9yIHRoZSBBVkEgc2VwYXJhdG9yLiBJdCBhbHNvCi1pbmRlbnRzIHRoZSBmaWVsZHMgYnkgZm91ciBjaGFyYWN0ZXJzLgoraW5kZW50cyB0aGUgZmllbGRzIGJ5IGZvdXIgY2hhcmFjdGVycy4gSWYgbm8gZmllbGQgc2VwYXJhdG9yIGlzIHNwZWNpZmllZAordGhlbiBCPHNlcF9jb21tYV9wbHVzX3NwYWNlPiBpcyB1c2VkIGJ5IGRlZmF1bHQuCiAKID1pdGVtIEI8ZG5fcmV2PgogCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2RvYy9jcnlwdG8vQklPX3JlYWQucG9kIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9kb2MvY3J5cHRvL0JJT19yZWFkLnBvZAppbmRleCBiMzQ1MjgxLi4yYzE3N2YwIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2RvYy9jcnlwdG8vQklPX3JlYWQucG9kCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvZG9jL2NyeXB0by9CSU9fcmVhZC5wb2QKQEAgLTksOSArOSw5IEBACiAgI2luY2x1ZGUgPG9wZW5zc2wvYmlvLmg+CiAKICBpbnQJQklPX3JlYWQoQklPICpiLCB2b2lkICpidWYsIGludCBsZW4pOwotIGludAlCSU9fZ2V0cyhCSU8gKmIsY2hhciAqYnVmLCBpbnQgc2l6ZSk7CisgaW50CUJJT19nZXRzKEJJTyAqYiwgY2hhciAqYnVmLCBpbnQgc2l6ZSk7CiAgaW50CUJJT193cml0ZShCSU8gKmIsIGNvbnN0IHZvaWQgKmJ1ZiwgaW50IGxlbik7Ci0gaW50CUJJT19wdXRzKEJJTyAqYixjb25zdCBjaGFyICpidWYpOworIGludAlCSU9fcHV0cyhCSU8gKmIsIGNvbnN0IGNoYXIgKmJ1Zik7CiAKID1oZWFkMSBERVNDUklQVElPTgogCkBAIC0yNiw3ICsyNiw3IEBACiAKIEJJT193cml0ZSgpIGF0dGVtcHRzIHRvIHdyaXRlIEI8bGVuPiBieXRlcyBmcm9tIEI8YnVmPiB0byBCSU8gQjxiPi4KIAotQklPX3B1dHMoKSBhdHRlbXB0cyB0byB3cml0ZSBhIG51bGwgdGVybWluYXRlZCBzdHJpbmcgQjxidWY+IHRvIEJJTyBCPGI+CitCSU9fcHV0cygpIGF0dGVtcHRzIHRvIHdyaXRlIGEgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZyBCPGJ1Zj4gdG8gQklPIEI8Yj4uCiAKID1oZWFkMSBSRVRVUk4gVkFMVUVTCiAKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvZG9jL2NyeXB0by9CSU9fc19jb25uZWN0LnBvZCBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvZG9jL2NyeXB0by9CSU9fc19jb25uZWN0LnBvZAppbmRleCBiY2Y3ZDhkLi5lMjM4YWVlIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2RvYy9jcnlwdG8vQklPX3NfY29ubmVjdC5wb2QKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9kb2MvY3J5cHRvL0JJT19zX2Nvbm5lY3QucG9kCkBAIC0yMSw4ICsyMSw4IEBACiAgbG9uZyBCSU9fc2V0X2Nvbm5faW50X3BvcnQoQklPICpiLCBjaGFyICpwb3J0KTsKICBjaGFyICpCSU9fZ2V0X2Nvbm5faG9zdG5hbWUoQklPICpiKTsKICBjaGFyICpCSU9fZ2V0X2Nvbm5fcG9ydChCSU8gKmIpOwotIGNoYXIgKkJJT19nZXRfY29ubl9pcChCSU8gKmIsIGR1bW15KTsKLSBsb25nIEJJT19nZXRfY29ubl9pbnRfcG9ydChCSU8gKmIsIGludCBwb3J0KTsKKyBjaGFyICpCSU9fZ2V0X2Nvbm5faXAoQklPICpiKTsKKyBsb25nIEJJT19nZXRfY29ubl9pbnRfcG9ydChCSU8gKmIpOwogCiAgbG9uZyBCSU9fc2V0X25iaW8oQklPICpiLCBsb25nIG4pOwogCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2RvYy9jcnlwdG8vQk5fcmFuZC5wb2QgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2RvYy9jcnlwdG8vQk5fcmFuZC5wb2QKaW5kZXggM2IyNzk2Yy4uZmRlNWY3MiAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9kb2MvY3J5cHRvL0JOX3JhbmQucG9kCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvZG9jL2NyeXB0by9CTl9yYW5kLnBvZApAQCAtMTksNyArMTksNyBAQAogPWhlYWQxIERFU0NSSVBUSU9OCiAKIEJOX3JhbmQoKSBnZW5lcmF0ZXMgYSBjcnlwdG9ncmFwaGljYWxseSBzdHJvbmcgcHNldWRvLXJhbmRvbSBudW1iZXIgb2YKLUI8Yml0cz4gYml0cyBpbiBsZW5ndGggYW5kIHN0b3JlcyBpdCBpbiBCPHJuZD4uIElmIEI8dG9wPiBpcyAtMSwgdGhlCitCPGJpdHM+IGluIGxlbmd0aCBhbmQgc3RvcmVzIGl0IGluIEI8cm5kPi4gSWYgQjx0b3A+IGlzIC0xLCB0aGUKIG1vc3Qgc2lnbmlmaWNhbnQgYml0IG9mIHRoZSByYW5kb20gbnVtYmVyIGNhbiBiZSB6ZXJvLiBJZiBCPHRvcD4gaXMgMCwKIGl0IGlzIHNldCB0byAxLCBhbmQgaWYgQjx0b3A+IGlzIDEsIHRoZSB0d28gbW9zdCBzaWduaWZpY2FudCBiaXRzIG9mCiB0aGUgbnVtYmVyIHdpbGwgYmUgc2V0IHRvIDEsIHNvIHRoYXQgdGhlIHByb2R1Y3Qgb2YgdHdvIHN1Y2ggcmFuZG9tCkBAIC0zMyw3ICszMyw3IEBACiBwcm90b2NvbHMsIGJ1dCB1c3VhbGx5IG5vdCBmb3Iga2V5IGdlbmVyYXRpb24gZXRjLgogCiBCTl9yYW5kX3JhbmdlKCkgZ2VuZXJhdGVzIGEgY3J5cHRvZ3JhcGhpY2FsbHkgc3Ryb25nIHBzZXVkby1yYW5kb20KLW51bWJlciBCPHJuZD4gaW4gdGhlIHJhbmdlIDAgPGx0Pj0gQjxybmQ+IEU8bHQ+IEI8cmFuZ2U+LgorbnVtYmVyIEI8cm5kPiBpbiB0aGUgcmFuZ2UgMCBFPGx0Pj0gQjxybmQ+IEU8bHQ+IEI8cmFuZ2U+LgogQk5fcHNldWRvX3JhbmRfcmFuZ2UoKSBkb2VzIHRoZSBzYW1lLCBidXQgaXMgYmFzZWQgb24gQk5fcHNldWRvX3JhbmQoKSwKIGFuZCBoZW5jZSBudW1iZXJzIGdlbmVyYXRlZCBieSBpdCBhcmUgbm90IG5lY2Vzc2FyaWx5IHVucHJlZGljdGFibGUuCiAKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvZG9jL2NyeXB0by9EU0FfZ2VuZXJhdGVfcGFyYW1ldGVycy5wb2QgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2RvYy9jcnlwdG8vRFNBX2dlbmVyYXRlX3BhcmFtZXRlcnMucG9kCmluZGV4IGJlN2M5MjQuLmYyNGM5YzcgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvZG9jL2NyeXB0by9EU0FfZ2VuZXJhdGVfcGFyYW1ldGVycy5wb2QKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9kb2MvY3J5cHRvL0RTQV9nZW5lcmF0ZV9wYXJhbWV0ZXJzLnBvZApAQCAtMjMsNyArMjMsNyBAQAogSWYgQjxzZWVkPiBpcyBCPE5VTEw+IG9yIEI8c2VlZF9sZW4+IEU8bHQ+IDIwLCB0aGUgcHJpbWVzIHdpbGwgYmUKIGdlbmVyYXRlZCBhdCByYW5kb20uIE90aGVyd2lzZSwgdGhlIHNlZWQgaXMgdXNlZCB0byBnZW5lcmF0ZQogdGhlbS4gSWYgdGhlIGdpdmVuIHNlZWQgZG9lcyBub3QgeWllbGQgYSBwcmltZSBxLCBhIG5ldyByYW5kb20KLXNlZWQgaXMgY2hvc2VuIGFuZCBwbGFjZWQgYXQgQjxzZWVkPi4KK3NlZWQgaXMgY2hvc2VuLgogCiBEU0FfZ2VuZXJhdGVfcGFyYW1ldGVycygpIHBsYWNlcyB0aGUgaXRlcmF0aW9uIGNvdW50IGluCiAqQjxjb3VudGVyX3JldD4gYW5kIGEgY291bnRlciB1c2VkIGZvciBmaW5kaW5nIGEgZ2VuZXJhdG9yIGluCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2RvYy9jcnlwdG8vRVZQX0RpZ2VzdFZlcmlmeUluaXQucG9kIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9kb2MvY3J5cHRvL0VWUF9EaWdlc3RWZXJpZnlJbml0LnBvZAppbmRleCBjZmVjY2Q5Li41NGNhZDkyIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2RvYy9jcnlwdG8vRVZQX0RpZ2VzdFZlcmlmeUluaXQucG9kCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvZG9jL2NyeXB0by9FVlBfRGlnZXN0VmVyaWZ5SW5pdC5wb2QKQEAgLTM3LDEwICszNywxMSBAQAogb3IgYSBuZWdhdGl2ZSB2YWx1ZSBmb3IgZmFpbHVyZS4gSW4gcGFydGljdWxhciBhIHJldHVybiB2YWx1ZSBvZiAtMiBpbmRpY2F0ZXMKIHRoZSBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgcHVibGljIGtleSBhbGdvcml0aG0uCiAKLVVubGlrZSBvdGhlciBmdW5jdGlvbnMgdGhlIHJldHVybiB2YWx1ZSAwIGZyb20gRVZQX0RpZ2VzdFZlcmlmeUZpbmFsKCkgb25seQotaW5kaWNhdGVzIHRoYXQgdGhlIHNpZ25hdHVyZSBkaWQgbm90IHZlcmlmeSBzdWNjZXNzZnVsbHkgKHRoYXQgaXMgdGJzIGRpZAotbm90IG1hdGNoIHRoZSBvcmlnaW5hbCBkYXRhIG9yIHRoZSBzaWduYXR1cmUgd2FzIG9mIGludmFsaWQgZm9ybSkgaXQgaXMgbm90IGFuCi1pbmRpY2F0aW9uIG9mIGEgbW9yZSBzZXJpb3VzIGVycm9yLgorRVZQX0RpZ2VzdFZlcmlmeUZpbmFsKCkgcmV0dXJucyAxIGZvciBzdWNjZXNzOyBhbnkgb3RoZXIgdmFsdWUgaW5kaWNhdGVzCitmYWlsdXJlLiAgQSByZXR1cm4gdmFsdWUgb2YgemVybyBpbmRpY2F0ZXMgdGhhdCB0aGUgc2lnbmF0dXJlIGRpZCBub3QgdmVyaWZ5CitzdWNjZXNzZnVsbHkgKHRoYXQgaXMsIHRicyBkaWQgbm90IG1hdGNoIHRoZSBvcmlnaW5hbCBkYXRhIG9yIHRoZSBzaWduYXR1cmUgaGFkCithbiBpbnZhbGlkIGZvcm0pLCB3aGlsZSBvdGhlciB2YWx1ZXMgaW5kaWNhdGUgYSBtb3JlIHNlcmlvdXMgZXJyb3IgKGFuZAorc29tZXRpbWVzIGFsc28gaW5kaWNhdGUgYW4gaW52YWxpZCBzaWduYXR1cmUgZm9ybSkuCiAKIFRoZSBlcnJvciBjb2RlcyBjYW4gYmUgb2J0YWluZWQgZnJvbSBMPEVSUl9nZXRfZXJyb3IoMyl8RVJSX2dldF9lcnJvcigzKT4uCiAKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvZG9jL2NyeXB0by9FVlBfU2lnbkluaXQucG9kIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9kb2MvY3J5cHRvL0VWUF9TaWduSW5pdC5wb2QKaW5kZXggMTRlY2M3Ny4uYzYzZDZiMyAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9kb2MvY3J5cHRvL0VWUF9TaWduSW5pdC5wb2QKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9kb2MvY3J5cHRvL0VWUF9TaWduSW5pdC5wb2QKQEAgLTIsNyArMiw4IEBACiAKID1oZWFkMSBOQU1FCiAKLUVWUF9TaWduSW5pdCwgRVZQX1NpZ25VcGRhdGUsIEVWUF9TaWduRmluYWwgLSBFVlAgc2lnbmluZyBmdW5jdGlvbnMKK0VWUF9TaWduSW5pdCwgRVZQX1NpZ25Jbml0X2V4LCBFVlBfU2lnblVwZGF0ZSwgRVZQX1NpZ25GaW5hbCAtIEVWUCBzaWduaW5nCitmdW5jdGlvbnMKIAogPWhlYWQxIFNZTk9QU0lTCiAKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvZG9jL2NyeXB0by9idWZmZXIucG9kIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9kb2MvY3J5cHRvL2J1ZmZlci5wb2QKaW5kZXggNzgxZjViMS4uOWQ2ZGU1MyAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9kb2MvY3J5cHRvL2J1ZmZlci5wb2QKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9kb2MvY3J5cHRvL2J1ZmZlci5wb2QKQEAgLTIsOCArMiwxMSBAQAogCiA9aGVhZDEgTkFNRQogCi1CVUZfTUVNX25ldywgQlVGX01FTV9mcmVlLCBCVUZfTUVNX2dyb3csIEJVRl9zdHJkdXAgLSBzaW1wbGUKLWNoYXJhY3RlciBhcnJheXMgc3RydWN0dXJlCitCVUZfTUVNX25ldywgQlVGX01FTV9uZXdfZXgsIEJVRl9NRU1fZnJlZSwgQlVGX01FTV9ncm93IC0gc2ltcGxlCitjaGFyYWN0ZXIgYXJyYXkgc3RydWN0dXJlCisKK0JVRl9zdHJkdXAsIEJVRl9zdHJuZHVwLCBCVUZfbWVtZHVwLCBCVUZfc3RybGNweSwgQlVGX3N0cmxjYXQgLQorc3RhbmRhcmQgQyBsaWJyYXJ5IGVxdWl2YWxlbnRzCiAKID1oZWFkMSBTWU5PUFNJUwogCkBAIC0xNSwyNiArMTgsMjEgQEAKIAogIGludAlCVUZfTUVNX2dyb3coQlVGX01FTSAqc3RyLCBpbnQgbGVuKTsKIAotIGNoYXIgKglCVUZfc3RyZHVwKGNvbnN0IGNoYXIgKnN0cik7CisgY2hhciAqQlVGX3N0cmR1cChjb25zdCBjaGFyICpzdHIpOworCisgY2hhciAqQlVGX3N0cm5kdXAoY29uc3QgY2hhciAqc3RyLCBzaXplX3Qgc2l6KTsKKworIHZvaWQgKkJVRl9tZW1kdXAoY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpeik7CisKKyBzaXplX3QgQlVGX3N0cmxjcHkoY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMsIHNpemVfdCBzaXplKTsKKworIHNpemVfdCBCVUZfc3RybGNhdChjaGFyICpkc3QsIGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IHNpemUpOwogCiA9aGVhZDEgREVTQ1JJUFRJT04KIAogVGhlIGJ1ZmZlciBsaWJyYXJ5IGhhbmRsZXMgc2ltcGxlIGNoYXJhY3RlciBhcnJheXMuIEJ1ZmZlcnMgYXJlIHVzZWQgZm9yCiB2YXJpb3VzIHB1cnBvc2VzIGluIHRoZSBsaWJyYXJ5LCBtb3N0IG5vdGFibHkgbWVtb3J5IEJJT3MuCiAKLVRoZSBsaWJyYXJ5IHVzZXMgdGhlIEJVRl9NRU0gc3RydWN0dXJlIGRlZmluZWQgaW4gYnVmZmVyLmg6Ci0KLSB0eXBlZGVmIHN0cnVjdCBidWZfbWVtX3N0Ci0gewotICAgICAgICBpbnQgbGVuZ3RoOyAgICAgLyogY3VycmVudCBudW1iZXIgb2YgYnl0ZXMgKi8KLSAgICAgICAgY2hhciAqZGF0YTsKLSAgICAgICAgaW50IG1heDsgICAgICAgIC8qIHNpemUgb2YgYnVmZmVyICovCi0gfSBCVUZfTUVNOwotCi1CPGxlbmd0aD4gaXMgdGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgYnVmZmVyIGluIGJ5dGVzLCBCPG1heD4gaXMgdGhlIGFtb3VudCBvZgotbWVtb3J5IGFsbG9jYXRlZCB0byB0aGUgYnVmZmVyLiBUaGVyZSBhcmUgdGhyZWUgZnVuY3Rpb25zIHdoaWNoIGhhbmRsZSB0aGVzZQotYW5kIG9uZSAibWlzY2VsbGFuZW91cyIgZnVuY3Rpb24uCi0KIEJVRl9NRU1fbmV3KCkgYWxsb2NhdGVzIGEgbmV3IGJ1ZmZlciBvZiB6ZXJvIHNpemUuCiAKIEJVRl9NRU1fZnJlZSgpIGZyZWVzIHVwIGFuIGFscmVhZHkgZXhpc3RpbmcgYnVmZmVyLiBUaGUgZGF0YSBpcyB6ZXJvZWQKQEAgLTQ0LDE0ICs0MiwxNyBAQAogQjxsZW4+LiBBbnkgZGF0YSBhbHJlYWR5IGluIHRoZSBidWZmZXIgaXMgcHJlc2VydmVkIGlmIGl0IGluY3JlYXNlcyBpbgogc2l6ZS4KIAotQlVGX3N0cmR1cCgpIGNvcGllcyBhIG51bGwgdGVybWluYXRlZCBzdHJpbmcgaW50byBhIGJsb2NrIG9mIGFsbG9jYXRlZAotbWVtb3J5IGFuZCByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgYWxsb2NhdGVkIGJsb2NrLgotVW5saWtlIHRoZSBzdGFuZGFyZCBDIGxpYnJhcnkgc3RyZHVwKCkgdGhpcyBmdW5jdGlvbiB1c2VzIE9QRU5TU0xfbWFsbG9jKCkgYW5kIHNvCi1zaG91bGQgYmUgdXNlZCBpbiBwcmVmZXJlbmNlIHRvIHRoZSBzdGFuZGFyZCBsaWJyYXJ5IHN0cmR1cCgpIGJlY2F1c2UgaXQgY2FuCi1iZSB1c2VkIGZvciBtZW1vcnkgbGVhayBjaGVja2luZyBvciByZXBsYWNpbmcgdGhlIG1hbGxvYygpIGZ1bmN0aW9uLgorQlVGX3N0cmR1cCgpLCBCVUZfc3RybmR1cCgpLCBCVUZfbWVtZHVwKCksIEJVRl9zdHJsY3B5KCkgYW5kCitCVUZfc3RybGNhdCgpIGFyZSBlcXVpdmFsZW50cyBvZiB0aGUgc3RhbmRhcmQgQyBsaWJyYXJ5IGZ1bmN0aW9ucy4gVGhlCitkdXAoKSBmdW5jdGlvbnMgdXNlIE9QRU5TU0xfbWFsbG9jKCkgdW5kZXJuZWF0aCBhbmQgc28gc2hvdWxkIGJlIHVzZWQKK2luIHByZWZlcmVuY2UgdG8gdGhlIHN0YW5kYXJkIGxpYnJhcnkgZm9yIG1lbW9yeSBsZWFrIGNoZWNraW5nIG9yCityZXBsYWNpbmcgdGhlIG1hbGxvYygpIGZ1bmN0aW9uLgogCi1UaGUgbWVtb3J5IGFsbG9jYXRlZCBmcm9tIEJVRl9zdHJkdXAoKSBzaG91bGQgYmUgZnJlZWQgdXAgdXNpbmcgdGhlIE9QRU5TU0xfZnJlZSgpCi1mdW5jdGlvbi4KK01lbW9yeSBhbGxvY2F0ZWQgZnJvbSB0aGVzZSBmdW5jdGlvbnMgc2hvdWxkIGJlIGZyZWVkIHVwIHVzaW5nIHRoZQorT1BFTlNTTF9mcmVlKCkgZnVuY3Rpb24uCisKK0JVRl9zdHJuZHVwIG1ha2VzIHRoZSBleHBsaWNpdCBndWFyYW50ZWUgdGhhdCBpdCB3aWxsIG5ldmVyIHJlYWQgcGFzdAordGhlIGZpcnN0IEI8c2l6PiBieXRlcyBvZiBCPHN0cj4uCiAKID1oZWFkMSBSRVRVUk4gVkFMVUVTCiAKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvZG9jL2NyeXB0by9kMmlfWDUwOV9OQU1FLnBvZCBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvZG9jL2NyeXB0by9kMmlfWDUwOV9OQU1FLnBvZAppbmRleCAzNDNmZmUxLi5iMDI1ZGU3IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2RvYy9jcnlwdG8vZDJpX1g1MDlfTkFNRS5wb2QKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9kb2MvY3J5cHRvL2QyaV9YNTA5X05BTUUucG9kCkBAIC0xNCw3ICsxNCw3IEBACiA9aGVhZDEgREVTQ1JJUFRJT04KIAogVGhlc2UgZnVuY3Rpb25zIGRlY29kZSBhbmQgZW5jb2RlIGFuIEI8WDUwOV9OQU1FPiBzdHJ1Y3R1cmUgd2hpY2ggaXMgdGhlCi10aGUgc2FtZSBhcyB0aGUgQjxOYW1lPiB0eXBlIGRlZmluZWQgaW4gUkZDMjQ1OSAoYW5kIGVsc2V3aGVyZSkgYW5kIHVzZWQKK3NhbWUgYXMgdGhlIEI8TmFtZT4gdHlwZSBkZWZpbmVkIGluIFJGQzI0NTkgKGFuZCBlbHNld2hlcmUpIGFuZCB1c2VkCiBmb3IgZXhhbXBsZSBpbiBjZXJ0aWZpY2F0ZSBzdWJqZWN0IGFuZCBpc3N1ZXIgbmFtZXMuCiAKIE90aGV3aXNlIHRoZSBmdW5jdGlvbnMgYmVoYXZlIGluIGEgc2ltaWxhciB3YXkgdG8gZDJpX1g1MDkoKSBhbmQgaTJkX1g1MDkoKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9kb2MvZGlyLWxvY2Fscy5leGFtcGxlLmVsIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9kb2MvZGlyLWxvY2Fscy5leGFtcGxlLmVsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ZDBiMDEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2RvYy9kaXItbG9jYWxzLmV4YW1wbGUuZWwKQEAgLTAsMCArMSwxNSBAQAorOzs7IFRoaXMgaXMgYW4gZXhhbXBsZSBvZiB3aGF0IGEgLmRpci1sb2NhbHMuZWwgc3VpdGFibGUgZm9yIE9wZW5TU0wKKzs7OyBkZXZlbG9wbWVudCBjb3VsZCBsb29rIGxpa2UuCis7OzsKKzs7OyBBcGFydCBmcm9tIHNldHRpbmcgdGhlIENDIG1vZGUgc3R5bGUgdG8gIk9wZW5TU0wtSUkiLCBpdCBhbHNvCis7OzsgbWFrZXMgc3VyZSB0aGF0IHRhYnMgYXJlIG5ldmVyIHVzZWQgZm9yIGluZGVudGF0aW9uIGluIGFueSBmaWxlLAorOzs7IGFuZCB0aGF0IHRoZSBmaWxsIGNvbHVtbiBpcyA3OC4KKzs7OworOzs7IEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSAoaW5mbyAiKGVtYWNzKSBEaXJlY3RvcnkgVmFyaWFibGVzIikKKworKChuaWwKKyAgKGluZGVudC10YWJzLW1vZGUgLiBuaWwpCisgIChmaWxsLWNvbHVtbiAuIDc4KQorICApCisgKGMtbW9kZQorICAoYy1maWxlLXN0eWxlIC4gIk9wZW5TU0wtSUkiKSkpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2RvYy9vcGVuc3NsLWMtaW5kZW50LmVsIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9kb2Mvb3BlbnNzbC1jLWluZGVudC5lbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDRhOTE1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9kb2Mvb3BlbnNzbC1jLWluZGVudC5lbApAQCAtMCwwICsxLDYyIEBACis7OzsgVGhpcyBFbWFjcyBMaXNwIGZpbGUgZGVmaW5lcyBhIEMgaW5kZW50YXRpb24gc3R5bGUgZm9yIE9wZW5TU0wuCis7OzsKKzs7OyBUaGlzIGRlZmluaXRpb24gaXMgZm9yIHRoZSAiQ0MgbW9kZSIgcGFja2FnZSwgd2hpY2ggaXMgdGhlIGRlZmF1bHQKKzs7OyBtb2RlIGZvciBlZGl0aW5nIEMgc291cmNlIGZpbGVzIGluIEVtYWNzIDIwLCBub3QgZm9yIHRoZSBvbGRlcgorOzs7IGMtbW9kZS5lbCAod2hpY2ggd2FzIHRoZSBkZWZhdWx0IGluIGxlc3MgcmVjZW50IHJlbGVhZXMgb2YgRW1hY3MgMTkpLgorOzs7Cis7OzsgUmVjb21tZW5kZWQgdXNlIGlzIHRvIGFkZCB0aGlzIGxpbmUgaW4geW91ciAuZW1hY3M6Cis7OzsKKzs7OyAgIChsb2FkIChleHBhbmQtZmlsZS1uYW1lICJ+L1BBVEgvVE8vb3BlbnNzbC1jLWluZGVudC5lbCIpKQorOzs7Cis7OzsgVG8gYWN0aXZhdGUgdGhpcyBpbmRlbnRhdGlvbiBzdHlsZSwgdmlzaXQgYSBDIGZpbGUsIHR5cGUKKzs7OyBNLXggYy1zZXQtc3R5bGUgPFJFVD4gKG9yIEMtYyAuIGZvciBzaG9ydCksIGFuZCBlbnRlciAiZWF5Ii4KKzs7OyBUbyB0b2dnbGUgdGhlIGF1dG8tbmV3bGluZSBmZWF0dXJlIG9mIENDIG1vZGUsIHR5cGUgQy1jIEMtYS4KKzs7OworOzs7IElmIHlvdSdyZSBhIE9wZW5TU0wgZGV2ZWxvcGVyLCB5b3UgbWlnaHQgZmluZCBpdCBtb3JlIGNvbWZvcnRhYmxlCis7OzsgdG8gaGF2ZSB0aGlzIHN0eWxlIGJlIHBlcm1hbmVudCBpbiB5b3VyIE9wZW5TU0wgZGV2ZWxvcG1lbnQKKzs7OyBkaXJlY3RvcnkuICBUbyBoYXZlIHRoYXQsIHBsZWFzZSBwZXJmb3JtIHRoaXM6Cis7OzsKKzs7OyAgICBNLXggYWRkLWRpci1sb2NhbC12YXJpYWJsZSA8UkVUPiBjLW1vZGUgPFJFVD4gYy1maWxlLXN0eWxlIDxSRVQ+Cis7OzsgICAgIk9wZW5TU0wtSUkiIDxSRVQ+Cis7OzsKKzs7OyBBIG5ldyBidWZmZXIgd2l0aCAuZGlyLWxvY2Fscy5lbCB3aWxsIGFwcGVhci4gIFNhdmUgaXQgKEMteCBDLXMpLgorOzs7Cis7OzsgQWx0ZXJuYXRpdmVseSwgaGF2ZSBhIGxvb2sgYXQgZGlyLWxvY2Fscy5leGFtcGxlLmVsCisKKzs7OyBGb3Igc3VnZ2VzdGluZyBpbXByb3ZlbWVudHMsIHBsZWFzZSBzZW5kIGUtbWFpbCB0byBsZXZpdHRlQG9wZW5zc2wub3JnLgorCis7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Cis7OyBOb3RlLCBpdCBjb3VsZCBiZSBlYXN5IHRvIGluaGVyaXQgZnJvbSB0aGUgImdudSIgc3R5bGUuLi4gIGhvd2V2ZXIsCis7OyBvbmUgbmV2ZXIga25vd3MgaWYgdGhhdCBzdHlsZSB3aWxsIGNoYW5nZSBzb21ld2hlcmUgaW4gdGhlIGZ1dHVyZSwKKzs7IHNvIEkndmUgY2hvc2VuIHRvIGNvcHkgdGhlICJnbnUiIHN0eWxlIHZhbHVlcyBleHBsaWNpdGVseSBpbnN0ZWFkCis7OyBhbmQgbWFyayB0aGVtIHdpdGggYSBjb21tZW50LiAgICAgICAgICAgICAgICAvLyBSTGV2aXR0ZSAyMDE1LTA4LTMxCis7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7CisKKyhjLWFkZC1zdHlsZSAiT3BlblNTTC1JSSIKKyAgICAgICAgICAgICAnKChjLWJhc2ljLW9mZnNldCAuIDQpCisgICAgICAgICAgICAgICAoaW5kZW50LXRhYnMtbW9kZSAuIG5pbCkKKyAgICAgICAgICAgICAgIChmaWxsLWNvbHVtbiAuIDc4KQorICAgICAgICAgICAgICAgKGNvbW1lbnQtY29sdW1uIC4gMzMpCisgICAgICAgICAgICAgICAoYy1jb21tZW50LW9ubHktbGluZS1vZmZzZXQgMCAuIDApICAgICAgICAgICAgOyBGcm9tICJnbnUiIHN0eWxlCisgICAgICAgICAgICAgICAoYy1oYW5naW5nLWJyYWNlcy1hbGlzdCAgICAgICAgICAgICAgICAgICAgICAgOyBGcm9tICJnbnUiIHN0eWxlCisgICAgICAgICAgICAgICAgKHN1YnN0YXRlbWVudC1vcGVuIGJlZm9yZSBhZnRlcikgICAgICAgICAgICAgOyBGcm9tICJnbnUiIHN0eWxlCisgICAgICAgICAgICAgICAgKGFyZ2xpc3QtY29udC1ub25lbXB0eSkpICAgICAgICAgICAgICAgICAgICAgOyBGcm9tICJnbnUiIHN0eWxlCisgICAgICAgICAgICAgICAoYy1vZmZzZXRzLWFsaXN0CisgICAgICAgICAgICAgICAgKHN0YXRlbWVudC1ibG9jay1pbnRybyAuICspICAgICAgICAgICAgICAgICAgOyBGcm9tICJnbnUiIHN0eWxlCisgICAgICAgICAgICAgICAgKGtuci1hcmdkZWNsLWludHJvIC4gMCkKKyAgICAgICAgICAgICAgICAoa25yLWFyZ2RlY2wgLiAwKQorICAgICAgICAgICAgICAgIChzdWJzdGF0ZW1lbnQtb3BlbiAuICspICAgICAgICAgICAgICAgICAgICAgIDsgRnJvbSAiZ251IiBzdHlsZQorICAgICAgICAgICAgICAgIChzdWJzdGF0ZW1lbnQtbGFiZWwgLiAwKSAgICAgICAgICAgICAgICAgICAgIDsgRnJvbSAiZ251IiBzdHlsZQorICAgICAgICAgICAgICAgIChsYWJlbCAuIDEpCisgICAgICAgICAgICAgICAgKHN0YXRlbWVudC1jYXNlLW9wZW4gLiArKSAgICAgICAgICAgICAgICAgICAgOyBGcm9tICJnbnUiIHN0eWxlCisgICAgICAgICAgICAgICAgKHN0YXRlbWVudC1jb250IC4gKykgICAgICAgICAgICAgICAgICAgICAgICAgOyBGcm9tICJnbnUiIHN0eWxlCisgICAgICAgICAgICAgICAgKGFyZ2xpc3QtaW50cm8gLiBjLWxpbmV1cC1hcmdsaXN0LWludHJvLWFmdGVyLXBhcmVuKSA7IEZyb20gImdudSIgc3R5bGUKKyAgICAgICAgICAgICAgICAoYXJnbGlzdC1jbG9zZSAuIGMtbGluZXVwLWFyZ2xpc3QpICAgICAgICAgICA7IEZyb20gImdudSIgc3R5bGUKKyAgICAgICAgICAgICAgICAoaW5saW5lLW9wZW4gLiAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IEZyb20gImdudSIgc3R5bGUKKyAgICAgICAgICAgICAgICAoYnJhY2UtbGlzdC1vcGVuIC4gKykgICAgICAgICAgICAgICAgICAgICAgICA7IEZyb20gImdudSIgc3R5bGUKKyAgICAgICAgICAgICAgICAodG9wbW9zdC1pbnRyby1jb250IGZpcnN0IGMtbGluZXVwLXRvcG1vc3QtaW50cm8tY29udAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy1saW5ldXAtZ251LURFRlVOLWludHJvLWNvbnQpIDsgRnJvbSAiZ251IiBzdHlsZQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgIChjLXNwZWNpYWwtaW5kZW50LWhvb2sgLiBjLWdudS1pbXBvc2UtbWluaW11bSkgOyBGcm9tICJnbnUiIHN0eWxlCisgICAgICAgICAgICAgICAoYy1ibG9jay1jb21tZW50LXByZWZpeCAuICIqICIpCisgICAgICAgICAgICAgICApKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9kb2Mvc3NsL1NTTF9DVFhfYWRkX2V4dHJhX2NoYWluX2NlcnQucG9kIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9kb2Mvc3NsL1NTTF9DVFhfYWRkX2V4dHJhX2NoYWluX2NlcnQucG9kCmluZGV4IDU5NTVlZTEuLjE4ZmIyZTIgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvZG9jL3NzbC9TU0xfQ1RYX2FkZF9leHRyYV9jaGFpbl9jZXJ0LnBvZAorKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2RvYy9zc2wvU1NMX0NUWF9hZGRfZXh0cmFfY2hhaW5fY2VydC5wb2QKQEAgLTIsMjkgKzIsMzkgQEAKIAogPWhlYWQxIE5BTUUKIAotU1NMX0NUWF9hZGRfZXh0cmFfY2hhaW5fY2VydCAtIGFkZCBjZXJ0aWZpY2F0ZSB0byBjaGFpbgorU1NMX0NUWF9hZGRfZXh0cmFfY2hhaW5fY2VydCwgU1NMX0NUWF9jbGVhcl9leHRyYV9jaGFpbl9jZXJ0cyAtIGFkZCBvciBjbGVhcgorZXh0cmEgY2hhaW4gY2VydGlmaWNhdGVzCiAKID1oZWFkMSBTWU5PUFNJUwogCiAgI2luY2x1ZGUgPG9wZW5zc2wvc3NsLmg+CiAKLSBsb25nIFNTTF9DVFhfYWRkX2V4dHJhX2NoYWluX2NlcnQoU1NMX0NUWCBjdHgsIFg1MDkgKng1MDkpCisgbG9uZyBTU0xfQ1RYX2FkZF9leHRyYV9jaGFpbl9jZXJ0KFNTTF9DVFggKmN0eCwgWDUwOSAqeDUwOSk7CisgbG9uZyBTU0xfQ1RYX2NsZWFyX2V4dHJhX2NoYWluX2NlcnRzKFNTTF9DVFggKmN0eCk7CiAKID1oZWFkMSBERVNDUklQVElPTgogCi1TU0xfQ1RYX2FkZF9leHRyYV9jaGFpbl9jZXJ0KCkgYWRkcyB0aGUgY2VydGlmaWNhdGUgQjx4NTA5PiB0byB0aGUgY2VydGlmaWNhdGUKLWNoYWluIHByZXNlbnRlZCB0b2dldGhlciB3aXRoIHRoZSBjZXJ0aWZpY2F0ZS4gU2V2ZXJhbCBjZXJ0aWZpY2F0ZXMKLWNhbiBiZSBhZGRlZCBvbmUgYWZ0ZXIgdGhlIG90aGVyLgorU1NMX0NUWF9hZGRfZXh0cmFfY2hhaW5fY2VydCgpIGFkZHMgdGhlIGNlcnRpZmljYXRlIEI8eDUwOT4gdG8gdGhlIGV4dHJhIGNoYWluCitjZXJ0aWZpY2F0ZXMgYXNzb2NpYXRlZCB3aXRoIEI8Y3R4Pi4gU2V2ZXJhbCBjZXJ0aWZpY2F0ZXMgY2FuIGJlIGFkZGVkIG9uZQorYWZ0ZXIgYW5vdGhlci4KKworU1NMX0NUWF9jbGVhcl9leHRyYV9jaGFpbl9jZXJ0cygpIGNsZWFycyBhbGwgZXh0cmEgY2hhaW4gY2VydGlmaWNhdGVzCithc3NvY2lhdGVkIHdpdGggQjxjdHg+LgorCitUaGVzZSBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkIGFzIG1hY3Jvcy4KIAogPWhlYWQxIE5PVEVTCiAKLVdoZW4gY29uc3RydWN0aW5nIHRoZSBjZXJ0aWZpY2F0ZSBjaGFpbiwgdGhlIGNoYWluIHdpbGwgYmUgZm9ybWVkIGZyb20KLXRoZXNlIGNlcnRpZmljYXRlcyBleHBsaWNpdGx5IHNwZWNpZmllZC4gSWYgbm8gY2hhaW4gaXMgc3BlY2lmaWVkLAotdGhlIGxpYnJhcnkgd2lsbCB0cnkgdG8gY29tcGxldGUgdGhlIGNoYWluIGZyb20gdGhlIGF2YWlsYWJsZSBDQQotY2VydGlmaWNhdGVzIGluIHRoZSB0cnVzdGVkIENBIHN0b3JhZ2UsIHNlZQorV2hlbiBzZW5kaW5nIGEgY2VydGlmaWNhdGUgY2hhaW4sIGV4dHJhIGNoYWluIGNlcnRpZmljYXRlcyBhcmUgc2VudCBpbiBvcmRlcgorZm9sbG93aW5nIHRoZSBlbmQgZW50aXR5IGNlcnRpZmljYXRlLgorCitJZiBubyBjaGFpbiBpcyBzcGVjaWZpZWQsIHRoZSBsaWJyYXJ5IHdpbGwgdHJ5IHRvIGNvbXBsZXRlIHRoZSBjaGFpbiBmcm9tIHRoZQorYXZhaWxhYmxlIENBIGNlcnRpZmljYXRlcyBpbiB0aGUgdHJ1c3RlZCBDQSBzdG9yYWdlLCBzZWUKIEw8U1NMX0NUWF9sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoMyl8U1NMX0NUWF9sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoMyk+LgogCi1UaGUgQjx4NTA5PiBjZXJ0aWZpY2F0ZSBwcm92aWRlZCB0byBTU0xfQ1RYX2FkZF9leHRyYV9jaGFpbl9jZXJ0KCkgd2lsbCBiZSBmcmVlZCBieSB0aGUgbGlicmFyeSB3aGVuIHRoZSBCPFNTTF9DVFg+IGlzIGRlc3Ryb3llZC4gQW4gYXBwbGljYXRpb24gQjxzaG91bGQgbm90PiBmcmVlIHRoZSBCPHg1MDk+IG9iamVjdC4KK1RoZSBCPHg1MDk+IGNlcnRpZmljYXRlIHByb3ZpZGVkIHRvIFNTTF9DVFhfYWRkX2V4dHJhX2NoYWluX2NlcnQoKSB3aWxsIGJlCitmcmVlZCBieSB0aGUgbGlicmFyeSB3aGVuIHRoZSBCPFNTTF9DVFg+IGlzIGRlc3Ryb3llZC4gQW4gYXBwbGljYXRpb24KK0I8c2hvdWxkIG5vdD4gZnJlZSB0aGUgQjx4NTA5PiBvYmplY3QuCiAKID1oZWFkMSBSRVNUUklDVElPTlMKIApAQCAtMzYsOCArNDYsOSBAQAogCiA9aGVhZDEgUkVUVVJOIFZBTFVFUwogCi1TU0xfQ1RYX2FkZF9leHRyYV9jaGFpbl9jZXJ0KCkgcmV0dXJucyAxIG9uIHN1Y2Nlc3MuIENoZWNrIG91dCB0aGUKLWVycm9yIHN0YWNrIHRvIGZpbmQgb3V0IHRoZSByZWFzb24gZm9yIGZhaWx1cmUgb3RoZXJ3aXNlLgorU1NMX0NUWF9hZGRfZXh0cmFfY2hhaW5fY2VydCgpIGFuZCBTU0xfQ1RYX2NsZWFyX2V4dHJhX2NoYWluX2NlcnRzKCkgcmV0dXJuCisxIG9uIHN1Y2Nlc3MgYW5kIDAgZm9yIGZhaWx1cmUuIENoZWNrIG91dCB0aGUgZXJyb3Igc3RhY2sgdG8gZmluZCBvdXQgdGhlCityZWFzb24gZm9yIGZhaWx1cmUuCiAKID1oZWFkMSBTRUUgQUxTTwogCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2RvYy9zc2wvU1NMX0NUWF9zZXRfdGxzZXh0X3N0YXR1c19jYi5wb2QgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2RvYy9zc2wvU1NMX0NUWF9zZXRfdGxzZXh0X3N0YXR1c19jYi5wb2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgxNDdiYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvZG9jL3NzbC9TU0xfQ1RYX3NldF90bHNleHRfc3RhdHVzX2NiLnBvZApAQCAtMCwwICsxLDczIEBACis9cG9kCisKKz1oZWFkMSBOQU1FCisKK1NTTF9DVFhfc2V0X3Rsc2V4dF9zdGF0dXNfY2IsIFNTTF9DVFhfc2V0X3Rsc2V4dF9zdGF0dXNfYXJnLAorU1NMX3NldF90bHNleHRfc3RhdHVzX3R5cGUsIFNTTF9nZXRfdGxzZXh0X3N0YXR1c19vY3NwX3Jlc3AsCitTU0xfc2V0X3Rsc2V4dF9zdGF0dXNfb2NzcF9yZXNwIC0gT0NTUCBDZXJ0aWZpY2F0ZSBTdGF0dXMgUmVxdWVzdCBmdW5jdGlvbnMKKworPWhlYWQxIFNZTk9QU0lTCisKKyAjaW5jbHVkZSA8b3BlbnNzbC90bHMxLmg+CisKKyBsb25nIFNTTF9DVFhfc2V0X3Rsc2V4dF9zdGF0dXNfY2IoU1NMX0NUWCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKCpjYWxsYmFjaykoU1NMICosIHZvaWQgKikpOworIGxvbmcgU1NMX0NUWF9zZXRfdGxzZXh0X3N0YXR1c19hcmcoU1NMX0NUWCAqY3R4LCB2b2lkICphcmcpOworCisgbG9uZyBTU0xfc2V0X3Rsc2V4dF9zdGF0dXNfdHlwZShTU0wgKnMsIGludCB0eXBlKTsKKworIGxvbmcgU1NMX2dldF90bHNleHRfc3RhdHVzX29jc3BfcmVzcChzc2wsIHVuc2lnbmVkIGNoYXIgKipyZXNwKTsKKyBsb25nIFNTTF9zZXRfdGxzZXh0X3N0YXR1c19vY3NwX3Jlc3Aoc3NsLCB1bnNpZ25lZCBjaGFyICpyZXNwLCBpbnQgbGVuKTsKKworPWhlYWQxIERFU0NSSVBUSU9OCisKK0EgY2xpZW50IGFwcGxpY2F0aW9uIG1heSByZXF1ZXN0IHRoYXQgYSBzZXJ2ZXIgc2VuZCBiYWNrIGFuIE9DU1Agc3RhdHVzIHJlc3BvbnNlCisoYWxzbyBrbm93biBhcyBPQ1NQIHN0YXBsaW5nKS4gVG8gZG8gc28gdGhlIGNsaWVudCBzaG91bGQgY2FsbCB0aGUKK1NTTF9zZXRfdGxzZXh0X3N0YXR1c190eXBlKCkgZnVuY3Rpb24gcHJpb3IgdG8gdGhlIHN0YXJ0IG9mIHRoZSBoYW5kc2hha2UuCitDdXJyZW50bHkgdGhlIG9ubHkgc3VwcG9ydGVkIHR5cGUgaXMgQjxUTFNFWFRfU1RBVFVTVFlQRV9vY3NwPi4gVGhpcyB2YWx1ZQorc2hvdWxkIGJlIHBhc3NlZCBpbiB0aGUgQjx0eXBlPiBhcmd1bWVudC4gVGhlIGNsaWVudCBzaG91bGQgYWRkaXRpb25hbGx5IHByb3ZpZGUKK2EgY2FsbGJhY2sgZnVuY3Rpb24gdG8gZGVjaWRlIHdoYXQgdG8gZG8gd2l0aCB0aGUgcmV0dXJuZWQgT0NTUCByZXNwb25zZSBieQorY2FsbGluZyBTU0xfQ1RYX3NldF90bHNleHRfc3RhdHVzX2NiKCkuIFRoZSBjYWxsYmFjayBmdW5jdGlvbiBzaG91bGQgZGV0ZXJtaW5lCit3aGV0aGVyIHRoZSByZXR1cm5lZCBPQ1NQIHJlc3BvbnNlIGlzIGFjY2VwdGFibGUgb3Igbm90LiBUaGUgY2FsbGJhY2sgd2lsbCBiZQorcGFzc2VkIGFzIGFuIGFyZ3VtZW50IHRoZSB2YWx1ZSBwcmV2aW91c2x5IHNldCB2aWEgYSBjYWxsIHRvCitTU0xfQ1RYX3NldF90bHNleHRfc3RhdHVzX2FyZygpLiBOb3RlIHRoYXQgdGhlIGNhbGxiYWNrIHdpbGwgbm90IGJlIGNhbGxlZCBpbgordGhlIGV2ZW50IG9mIGEgaGFuZHNoYWtlIHdoZXJlIHNlc3Npb24gcmVzdW1wdGlvbiBvY2N1cnMgKGJlY2F1c2UgdGhlcmUgYXJlIG5vCitDZXJ0aWZpY2F0ZXMgZXhjaGFuZ2VkIGluIHN1Y2ggYSBoYW5kc2hha2UpLgorCitUaGUgcmVzcG9uc2UgcmV0dXJuZWQgYnkgdGhlIHNlcnZlciBjYW4gYmUgb2J0YWluZWQgdmlhIGEgY2FsbCB0bworU1NMX2dldF90bHNleHRfc3RhdHVzX29jc3BfcmVzcCgpLiBUaGUgdmFsdWUgQjwqcmVzcD4gd2lsbCBiZSB1cGRhdGVkIHRvIHBvaW50Cit0byB0aGUgT0NTUCByZXNwb25zZSBkYXRhIGFuZCB0aGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgdGhlIGxlbmd0aCBvZiB0aGF0IGRhdGEuCitUeXBpY2FsbHkgYSBjYWxsYmFjayB3b3VsZCBvYnRhaW4gYW4gT0NTUF9SRVNQT05TRSBvYmplY3QgZnJvbSB0aGlzIGRhdGEgdmlhIGEKK2NhbGwgdG8gdGhlIGQyaV9PQ1NQX1JFU1BPTlNFKCkgZnVuY3Rpb24uIElmIHRoZSBzZXJ2ZXIgaGFzIG5vdCBwcm92aWRlZCBhbnkKK3Jlc3BvbnNlIGRhdGEgdGhlbiBCPCpyZXNwPiB3aWxsIGJlIE5VTEwgYW5kIHRoZSByZXR1cm4gdmFsdWUgZnJvbQorU1NMX2dldF90bHNleHRfc3RhdHVzX29jc3BfcmVzcCgpIHdpbGwgYmUgLTEuCisKK0Egc2VydmVyIGFwcGxpY2F0aW9uIG11c3QgYWxzbyBjYWxsIHRoZSBTU0xfQ1RYX3NldF90bHNleHRfc3RhdHVzX2NiKCkgZnVuY3Rpb24KK2lmIGl0IHdhbnRzIHRvIGJlIGFibGUgdG8gcHJvdmlkZSBjbGllbnRzIHdpdGggT0NTUCBDZXJ0aWZpY2F0ZSBTdGF0dXMKK3Jlc3BvbnNlcy4gVHlwaWNhbGx5IHRoZSBzZXJ2ZXIgY2FsbGJhY2sgd291bGQgb2J0YWluIHRoZSBzZXJ2ZXIgY2VydGlmaWNhdGUKK3RoYXQgaXMgYmVpbmcgc2VudCBiYWNrIHRvIHRoZSBjbGllbnQgdmlhIGEgY2FsbCB0byBTU0xfZ2V0X2NlcnRpZmljYXRlKCk7CitvYnRhaW4gdGhlIE9DU1AgcmVzcG9uc2UgdG8gYmUgc2VudCBiYWNrOyBhbmQgdGhlbiBzZXQgdGhhdCByZXNwb25zZSBkYXRhIGJ5CitjYWxsaW5nIFNTTF9zZXRfdGxzZXh0X3N0YXR1c19vY3NwX3Jlc3AoKS4gQSBwb2ludGVyIHRvIHRoZSByZXNwb25zZSBkYXRhIHNob3VsZAorYmUgcHJvdmlkZWQgaW4gdGhlIEI8cmVzcD4gYXJndW1lbnQsIGFuZCB0aGUgbGVuZ3RoIG9mIHRoYXQgZGF0YSBzaG91bGQgYmUgaW4KK3RoZSBCPGxlbj4gYXJndW1lbnQuCisKKz1oZWFkMSBSRVRVUk4gVkFMVUVTCisKK1RoZSBjYWxsYmFjayB3aGVuIHVzZWQgb24gdGhlIGNsaWVudCBzaWRlIHNob3VsZCByZXR1cm4gYSBuZWdhdGl2ZSB2YWx1ZSBvbgorZXJyb3I7IDAgaWYgdGhlIHJlc3BvbnNlIGlzIG5vdCBhY2NlcHRhYmxlIChpbiB3aGljaCBjYXNlIHRoZSBoYW5kc2hha2Ugd2lsbAorZmFpbCkgb3IgYSBwb3NpdGl2ZSB2YWx1ZSBpZiBpdCBpcyBhY2NlcHRhYmxlLgorCitUaGUgY2FsbGJhY2sgd2hlbiB1c2VkIG9uIHRoZSBzZXJ2ZXIgc2lkZSBzaG91bGQgcmV0dXJuIHdpdGggZWl0aGVyCitTU0xfVExTRVhUX0VSUl9PSyAobWVhbmluZyB0aGF0IHRoZSBPQ1NQIHJlc3BvbnNlIHRoYXQgaGFzIGJlZW4gc2V0IHNob3VsZCBiZQorcmV0dXJuZWQpLCBTU0xfVExTRVhUX0VSUl9OT0FDSyAobWVhbmluZyB0aGF0IGFuIE9DU1AgcmVzcG9uc2Ugc2hvdWxkIG5vdCBiZQorcmV0dXJuZWQpIG9yIFNTTF9UTFNFWFRfRVJSX0FMRVJUX0ZBVEFMIChtZWFuaW5nIHRoYXQgYSBmYXRhbCBlcnJvciBoYXMKK29jY3VycmVkKS4KKworU1NMX0NUWF9zZXRfdGxzZXh0X3N0YXR1c19jYigpLCBTU0xfQ1RYX3NldF90bHNleHRfc3RhdHVzX2FyZygpLAorU1NMX3NldF90bHNleHRfc3RhdHVzX3R5cGUoKSBhbmQgU1NMX3NldF90bHNleHRfc3RhdHVzX29jc3BfcmVzcCgpIHJldHVybiAwIG9uCitlcnJvciBvciAxIG9uIHN1Y2Nlc3MuCisKK1NTTF9nZXRfdGxzZXh0X3N0YXR1c19vY3NwX3Jlc3AoKSByZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIE9DU1AgcmVzcG9uc2UgZGF0YQorb3IgLTEgaWYgdGhlcmUgaXMgbm8gT0NTUCByZXNwb25zZSBkYXRhLgorCis9Y3V0CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2RvYy9zc2wvU1NMX0NUWF9zZXRfdG1wX2RoX2NhbGxiYWNrLnBvZCBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvZG9jL3NzbC9TU0xfQ1RYX3NldF90bXBfZGhfY2FsbGJhY2sucG9kCmluZGV4IGI3NTRjMTYuLjIzNGZiYzggMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvZG9jL3NzbC9TU0xfQ1RYX3NldF90bXBfZGhfY2FsbGJhY2sucG9kCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvZG9jL3NzbC9TU0xfQ1RYX3NldF90bXBfZGhfY2FsbGJhY2sucG9kCkBAIC00OCwyNSArNDgsOCBAQAogb25seSB1c2VkIGZvciBzaWduaW5nLgogCiBJbiBvcmRlciB0byBwZXJmb3JtIGEgREgga2V5IGV4Y2hhbmdlIHRoZSBzZXJ2ZXIgbXVzdCB1c2UgYSBESCBncm91cAotKERIIHBhcmFtZXRlcnMpIGFuZCBnZW5lcmF0ZSBhIERIIGtleS4KLVRoZSBzZXJ2ZXIgd2lsbCBhbHdheXMgZ2VuZXJhdGUgYSBuZXcgREgga2V5IGR1cmluZyB0aGUgbmVnb3RpYXRpb24KLWlmIGVpdGhlciB0aGUgREggcGFyYW1ldGVycyBhcmUgc3VwcGxpZWQgdmlhIGNhbGxiYWNrIG9yIHRoZQotU1NMX09QX1NJTkdMRV9ESF9VU0Ugb3B0aW9uIG9mIFNTTF9DVFhfc2V0X29wdGlvbnMoMykgaXMgc2V0IChvciBib3RoKS4KLUl0IHdpbGwgIGltbWVkaWF0ZWx5IGNyZWF0ZSBhIERIIGtleSBpZiBESCBwYXJhbWV0ZXJzIGFyZSBzdXBwbGllZCB2aWEKLVNTTF9DVFhfc2V0X3RtcF9kaCgpIGFuZCBTU0xfT1BfU0lOR0xFX0RIX1VTRSBpcyBub3Qgc2V0LgotSW4gdGhpcyBjYXNlLAotaXQgbWF5IGhhcHBlbiB0aGF0IGEga2V5IGlzIGdlbmVyYXRlZCBvbiBpbml0aWFsaXphdGlvbiB3aXRob3V0IGxhdGVyCi1iZWluZyBuZWVkZWQsIHdoaWxlIG9uIHRoZSBvdGhlciBoYW5kIHRoZSBjb21wdXRlciB0aW1lIGR1cmluZyB0aGUKLW5lZ290aWF0aW9uIGlzIGJlaW5nIHNhdmVkLgotCi1JZiAic3Ryb25nIiBwcmltZXMgd2VyZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBESCBwYXJhbWV0ZXJzLCBpdCBpcyBub3Qgc3RyaWN0bHkKLW5lY2Vzc2FyeSB0byBnZW5lcmF0ZSBhIG5ldyBrZXkgZm9yIGVhY2ggaGFuZHNoYWtlIGJ1dCBpdCBkb2VzIGltcHJvdmUgZm9yd2FyZAotc2VjcmVjeS4gSWYgaXQgaXMgbm90IGFzc3VyZWQgdGhhdCAic3Ryb25nIiBwcmltZXMgd2VyZSB1c2VkLAotU1NMX09QX1NJTkdMRV9ESF9VU0UgbXVzdCBiZSB1c2VkIGluIG9yZGVyIHRvIHByZXZlbnQgc21hbGwgc3ViZ3JvdXAKLWF0dGFja3MuIEFsd2F5cyB1c2luZyBTU0xfT1BfU0lOR0xFX0RIX1VTRSBoYXMgYW4gaW1wYWN0IG9uIHRoZQotY29tcHV0ZXIgdGltZSBuZWVkZWQgZHVyaW5nIG5lZ290aWF0aW9uLCBidXQgaXQgaXMgbm90IHZlcnkgbGFyZ2UsIHNvCi1hcHBsaWNhdGlvbiBhdXRob3JzL3VzZXJzIHNob3VsZCBjb25zaWRlciBhbHdheXMgZW5hYmxpbmcgdGhpcyBvcHRpb24uCi1UaGUgb3B0aW9uIGlzIHJlcXVpcmVkIHRvIGltcGxlbWVudCBwZXJmZWN0IGZvcndhcmQgc2VjcmVjeSAoUEZTKS4KKyhESCBwYXJhbWV0ZXJzKSBhbmQgZ2VuZXJhdGUgYSBESCBrZXkuIFRoZSBzZXJ2ZXIgd2lsbCBhbHdheXMgZ2VuZXJhdGUKK2EgbmV3IERIIGtleSBkdXJpbmcgdGhlIG5lZ290aWF0aW9uLgogCiBBcyBnZW5lcmF0aW5nIERIIHBhcmFtZXRlcnMgaXMgZXh0cmVtZWx5IHRpbWUgY29uc3VtaW5nLCBhbiBhcHBsaWNhdGlvbgogc2hvdWxkIG5vdCBnZW5lcmF0ZSB0aGUgcGFyYW1ldGVycyBvbiB0aGUgZmx5IGJ1dCBzdXBwbHkgdGhlIHBhcmFtZXRlcnMuCkBAIC05MywxMCArNzYsOSBAQAogUHJldmlvdXMgdmVyc2lvbnMgb2YgdGhlIGNhbGxiYWNrIHVzZWQgQjxpc19leHBvcnQ+IGFuZCBCPGtleWxlbmd0aD4KIHBhcmFtZXRlcnMgdG8gY29udHJvbCBwYXJhbWV0ZXIgZ2VuZXJhdGlvbiBmb3IgZXhwb3J0IGFuZCBub24tZXhwb3J0CiBjaXBoZXIgc3VpdGVzLiBNb2Rlcm4gc2VydmVycyB0aGF0IGRvIG5vdCBzdXBwb3J0IGV4cG9ydCBjaXBoZXJzdWl0ZXMKLWFyZSBhZHZpc2VkIHRvIGVpdGhlciB1c2UgU1NMX0NUWF9zZXRfdG1wX2RoKCkgaW4gY29tYmluYXRpb24gd2l0aAotU1NMX09QX1NJTkdMRV9ESF9VU0UsIG9yIGFsdGVybmF0aXZlbHksIHVzZSB0aGUgY2FsbGJhY2sgYnV0IGlnbm9yZQotQjxrZXlsZW5ndGg+IGFuZCBCPGlzX2V4cG9ydD4gYW5kIHNpbXBseSBzdXBwbHkgYXQgbGVhc3QgMjA0OC1iaXQKLXBhcmFtZXRlcnMgaW4gdGhlIGNhbGxiYWNrLgorYXJlIGFkdmlzZWQgdG8gZWl0aGVyIHVzZSBTU0xfQ1RYX3NldF90bXBfZGgoKSBvciBhbHRlcm5hdGl2ZWx5LCB1c2UKK3RoZSBjYWxsYmFjayBidXQgaWdub3JlIEI8a2V5bGVuZ3RoPiBhbmQgQjxpc19leHBvcnQ+IGFuZCBzaW1wbHkKK3N1cHBseSBhdCBsZWFzdCAyMDQ4LWJpdCBwYXJhbWV0ZXJzIGluIHRoZSBjYWxsYmFjay4KIAogPWhlYWQxIEVYQU1QTEVTCiAKQEAgLTEyOCw3ICsxMTAsNiBAQAogIGlmIChTU0xfQ1RYX3NldF90bXBfZGgoY3R4LCBkaF8yMDQ4KSAhPSAxKSB7CiAgICAvKiBFcnJvci4gKi8KICB9Ci0gU1NMX0NUWF9zZXRfb3B0aW9ucyhjdHgsIFNTTF9PUF9TSU5HTEVfREhfVVNFKTsKICAuLi4KIAogPWhlYWQxIFJFVFVSTiBWQUxVRVMKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvZV9vcy5oIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9lX29zLmgKaW5kZXggYzg2YTFlNC4uOGY2NzIzNyAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9lX29zLmgKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9lX29zLmgKQEAgLTMyNiw3ICszMjYsNyBAQAogIyAgICB1bmRlZiBpc3hkaWdpdAogIyAgIGVuZGlmCiAjICAgaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgIWRlZmluZWQoX0RMTCkgJiYgZGVmaW5lZChzdGRpbikKLSMgICAgaWYgX01TQ19WRVI+PTEzMDAKKyMgICAgaWYgX01TQ19WRVI+PTEzMDAgJiYgX01TQ19WRVI8MTYwMAogIyAgICAgdW5kZWYgc3RkaW4KICMgICAgIHVuZGVmIHN0ZG91dAogIyAgICAgdW5kZWYgc3RkZXJyCkBAIC0zMzQsNyArMzM0LDcgQEAKICMgICAgIGRlZmluZSBzdGRpbiAgKCZfX2lvYl9mdW5jKClbMF0pCiAjICAgICBkZWZpbmUgc3Rkb3V0ICgmX19pb2JfZnVuYygpWzFdKQogIyAgICAgZGVmaW5lIHN0ZGVyciAoJl9faW9iX2Z1bmMoKVsyXSkKLSMgICAgZWxpZiBkZWZpbmVkKElfQ0FOX0xJVkVfV0lUSF9MTks0MDQ5KQorIyAgICBlbGlmIF9NU0NfVkVSPDEzMDAgJiYgZGVmaW5lZChJX0NBTl9MSVZFX1dJVEhfTE5LNDA0OSkKICMgICAgIHVuZGVmIHN0ZGluCiAjICAgICB1bmRlZiBzdGRvdXQKICMgICAgIHVuZGVmIHN0ZGVycgpAQCAtNjI1LDcgKzYyNSw3IEBACiAjICAgIGluY2x1ZGUgPHN5cy9zZWxlY3QuaD4KICMgICBlbmRpZgogCi0jICAgaWYgZGVmaW5lZChzdW4pCisjICAgaWYgZGVmaW5lZChfX3N1bikgfHwgZGVmaW5lZChzdW4pCiAjICAgIGluY2x1ZGUgPHN5cy9maWxpby5oPgogIyAgIGVsc2UKICMgICAgaWZuZGVmIFZNUwpAQCAtNjY3LDcgKzY2Nyw3IEBACiAKICMgZW5kaWYKIAotIyBpZiBkZWZpbmVkKHN1bikgJiYgIWRlZmluZWQoX19zdnI0X18pICYmICFkZWZpbmVkKF9fU1ZSNCkKKyMgaWYgKGRlZmluZWQoX19zdW4pIHx8IGRlZmluZWQoc3VuKSkgJiYgIWRlZmluZWQoX19zdnI0X18pICYmICFkZWZpbmVkKF9fU1ZSNCkKICAgLyogaW5jbHVkZSBoZWFkZXJzIGZpcnN0LCBzbyBvdXIgZGVmaW5lcyBkb24ndCBicmVhayBpdCAqLwogIyAgaW5jbHVkZSA8c3RkbGliLmg+CiAjICBpbmNsdWRlIDxzdHJpbmcuaD4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvZW5naW5lcy9lX2NoaWwuYyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvZW5naW5lcy9lX2NoaWwuYwppbmRleCA2OWQ0OWQ3Li41ZGZhYjUxIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL2VuZ2luZXMvZV9jaGlsLmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9lbmdpbmVzL2VfY2hpbC5jCkBAIC0xLDQgKzEsNCBAQAotLyogY3J5cHRvL2VuZ2luZS9lX2NoaWwuYyAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZWF5IiAtKi0gKi8KKy8qIGNyeXB0by9lbmdpbmUvZV9jaGlsLmMgKi8KIC8qCiAgKiBXcml0dGVuIGJ5IFJpY2hhcmQgTGV2aXR0ZSAocmljaGFyZEBsZXZpdHRlLm9yZyksIEdlb2ZmIFRob3JwZQogICogKGdlb2ZmQGdlb2ZmdGhvcnBlLm5ldCkgYW5kIERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IKQEAgLTgzOSw2ICs4MzksMTAgQEAKICAgICBibl9maXhfdG9wKHJ0bXAtPm4pOwogCiAgICAgcmVzID0gRVZQX1BLRVlfbmV3KCk7CisgICAgaWYgKHJlcyA9PSBOVUxMKSB7CisgICAgICAgIEhXQ1JIS2VycihIV0NSSEtfRl9IV0NSSEtfTE9BRF9QUklWS0VZLCBIV0NSSEtfUl9DSElMX0VSUk9SKTsKKyAgICAgICAgZ290byBlcnI7CisgICAgfQogICAgIEVWUF9QS0VZX2Fzc2lnbl9SU0EocmVzLCBydG1wKTsKICMgIGVuZGlmCiAKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvb3BlbnNzbC5zcGVjIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9vcGVuc3NsLnNwZWMKaW5kZXggNjdhNjA3NC4uMzg2ZjlmNiAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9vcGVuc3NsLnNwZWMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9vcGVuc3NsLnNwZWMKQEAgLTcsNyArNyw3IEBACiBTdW1tYXJ5OiBTZWN1cmUgU29ja2V0cyBMYXllciBhbmQgY3J5cHRvZ3JhcGh5IGxpYnJhcmllcyBhbmQgdG9vbHMKIE5hbWU6IG9wZW5zc2wKICNWZXJzaW9uOiAle2xpYm1han0uJXtsaWJtaW59LiV7bGlicmVsfQotVmVyc2lvbjogMS4wLjFwCitWZXJzaW9uOiAxLjAuMXIKIFNvdXJjZTA6IGZ0cDovL2Z0cC5vcGVuc3NsLm9yZy9zb3VyY2UvJXtuYW1lfS0le3ZlcnNpb259LnRhci5negogTGljZW5zZTogT3BlblNTTAogR3JvdXA6IFN5c3RlbSBFbnZpcm9ubWVudC9MaWJyYXJpZXMKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvc3NsL01ha2VmaWxlIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9zc2wvTWFrZWZpbGUKaW5kZXggMjlkOWU0NS4uYWQxNGFiYiAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9zc2wvTWFrZWZpbGUKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9zc2wvTWFrZWZpbGUKQEAgLTE1LDcgKzE1LDcgQEAKIENGTEFHUz0gJChJTkNMVURFUykgJChDRkxBRykKIAogR0VORVJBTD1NYWtlZmlsZSBSRUFETUUgc3NsLWxpYi5jb20gaW5zdGFsbC5jb20KLVRFU1Q9c3NsdGVzdC5jIGhlYXJ0YmVhdF90ZXN0LmMKK1RFU1Q9c3NsdGVzdC5jIGhlYXJ0YmVhdF90ZXN0LmMgY2xpZW50aGVsbG90ZXN0LmMKIEFQUFM9CiAKIExJQj0kKFRPUCkvbGlic3NsLmEKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvc3NsL2Jpb19zc2wuYyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvc3NsL2Jpb19zc2wuYwppbmRleCAwMmRlNTEyLi4yMzFiYTU1IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL3NzbC9iaW9fc3NsLmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9zc2wvYmlvX3NzbC5jCkBAIC00MjIsNiArNDIyLDEwIEBACiAgICAgICAgICAgICBCSU9fc2V0X2ZsYWdzKGIsIEJJT19GTEFHU19JT19TUEVDSUFMIHwgQklPX0ZMQUdTX1NIT1VMRF9SRVRSWSk7CiAgICAgICAgICAgICBiLT5yZXRyeV9yZWFzb24gPSBiLT5uZXh0X2Jpby0+cmV0cnlfcmVhc29uOwogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfWDUwOV9MT09LVVA6CisgICAgICAgICAgICBCSU9fc2V0X3JldHJ5X3NwZWNpYWwoYik7CisgICAgICAgICAgICBiLT5yZXRyeV9yZWFzb24gPSBCSU9fUlJfU1NMX1g1MDlfTE9PS1VQOworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9zc2wvY2xpZW50aGVsbG90ZXN0LmMgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL3NzbC9jbGllbnRoZWxsb3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDBhN2VhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9zc2wvY2xpZW50aGVsbG90ZXN0LmMKQEAgLTAsMCArMSwyMTggQEAKKy8qIFdyaXR0ZW4gYnkgTWF0dCBDYXN3ZWxsIGZvciB0aGUgT3BlblNTTCBQcm9qZWN0ICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMTUgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgorI2luY2x1ZGUgPG9wZW5zc2wvY3J5cHRvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3NzbC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisKKworI2RlZmluZSBDTElFTlRfVkVSU0lPTl9MRU4gICAgICAyCisjZGVmaW5lIFNFU1NJT05fSURfTEVOX0xFTiAgICAgIDEKKyNkZWZpbmUgQ0lQSEVSU19MRU5fTEVOICAgICAgICAgMgorI2RlZmluZSBDT01QUkVTU0lPTl9MRU5fTEVOICAgICAxCisjZGVmaW5lIEVYVEVOU0lPTlNfTEVOX0xFTiAgICAgIDIKKyNkZWZpbmUgRVhURU5TSU9OX1RZUEVfTEVOICAgICAgMgorI2RlZmluZSBFWFRFTlNJT05fU0laRV9MRU4gICAgICAyCisKKworI2RlZmluZSBUT1RBTF9OVU1fVEVTVFMgICAgICAgICAgICAgICAgICAgICAgICAgMgorCisvKgorICogVGVzdCB0aGF0IGV4cGxpY2l0bHkgc2V0dGluZyB0aWNrZXQgZGF0YSByZXN1bHRzIGluIGl0IGFwcGVhcmluZyBpbiB0aGUKKyAqIENsaWVudEhlbGxvIGZvciBUTFMxLjIKKyAqLworI2RlZmluZSBURVNUX1NFVF9TRVNTSU9OX1RJQ0tfREFUQV9UTFNfMV8yICAgICAgMAorCisvKgorICogVGVzdCB0aGF0IGV4cGxpY2l0bHkgc2V0dGluZyB0aWNrZXQgZGF0YSByZXN1bHRzIGluIGl0IGFwcGVhcmluZyBpbiB0aGUKKyAqIENsaWVudEhlbGxvIGZvciBhIG5lZ290aWF0ZWQgU1NML1RMUyB2ZXJzaW9uCisgKi8KKyNkZWZpbmUgVEVTVF9TRVRfU0VTU0lPTl9USUNLX0RBVEFfVkVSX05FRyAgICAgIDEKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICBTU0xfQ1RYICpjdHg7CisgICAgU1NMICpjb247CisgICAgQklPICpyYmlvOworICAgIEJJTyAqd2JpbzsKKyAgICBCSU8gKmVycjsKKyAgICBsb25nIGxlbjsKKyAgICB1bnNpZ25lZCBjaGFyICpkYXRhOworICAgIHVuc2lnbmVkIGNoYXIgKmRhdGFlbmQ7CisgICAgY2hhciAqZHVtbXl0aWNrID0gIkhlbGxvIFdvcmxkISI7CisgICAgdW5zaWduZWQgaW50IHRtcGxlbjsKKyAgICB1bnNpZ25lZCBpbnQgdHlwZTsKKyAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKKyAgICBpbnQgdGVzdHJlc3VsdCA9IDA7CisgICAgaW50IGN1cnJ0ZXN0ID0gMDsKKworICAgIFNTTF9saWJyYXJ5X2luaXQoKTsKKyAgICBTU0xfbG9hZF9lcnJvcl9zdHJpbmdzKCk7CisKKyAgICBlcnIgPSBCSU9fbmV3X2ZwKHN0ZGVyciwgQklPX05PQ0xPU0UgfCBCSU9fRlBfVEVYVCk7CisKKyAgICBDUllQVE9fbWFsbG9jX2RlYnVnX2luaXQoKTsKKyAgICBDUllQVE9fc2V0X21lbV9kZWJ1Z19vcHRpb25zKFZfQ1JZUFRPX01ERUJVR19BTEwpOworICAgIENSWVBUT19tZW1fY3RybChDUllQVE9fTUVNX0NIRUNLX09OKTsKKworICAgIC8qCisgICAgICogRm9yIGVhY2ggdGVzdCBzZXQgdXAgYW4gU1NMX0NUWCBhbmQgU1NMIGFuZCBzZWUgd2hhdCBDbGllbnRIZWxsbyBnZXRzCisgICAgICogcHJvZHVjZWQgd2hlbiB3ZSB0cnkgdG8gY29ubmVjdAorICAgICAqLworICAgIGZvciAoOyBjdXJydGVzdCA8IFRPVEFMX05VTV9URVNUUzsgY3VycnRlc3QrKykgeworICAgICAgICB0ZXN0cmVzdWx0ID0gMDsKKyAgICAgICAgaWYgKGN1cnJ0ZXN0ID09IFRFU1RfU0VUX1NFU1NJT05fVElDS19EQVRBX1RMU18xXzIpIHsKKyAgICAgICAgICAgIGN0eCA9IFNTTF9DVFhfbmV3KFRMU3YxXzJfbWV0aG9kKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY3R4ID0gU1NMX0NUWF9uZXcoU1NMdjIzX21ldGhvZCgpKTsKKyAgICAgICAgfQorICAgICAgICBjb24gPSBTU0xfbmV3KGN0eCk7CisKKyAgICAgICAgcmJpbyA9IEJJT19uZXcoQklPX3NfbWVtKCkpOworICAgICAgICB3YmlvID0gQklPX25ldyhCSU9fc19tZW0oKSk7CisgICAgICAgIFNTTF9zZXRfYmlvKGNvbiwgcmJpbywgd2Jpbyk7CisgICAgICAgIFNTTF9zZXRfY29ubmVjdF9zdGF0ZShjb24pOworCisgICAgICAgIGlmIChjdXJydGVzdCA9PSBURVNUX1NFVF9TRVNTSU9OX1RJQ0tfREFUQV9UTFNfMV8yCisgICAgICAgICAgICAgICAgfHwgY3VycnRlc3QgPT0gVEVTVF9TRVRfU0VTU0lPTl9USUNLX0RBVEFfVkVSX05FRykgeworICAgICAgICAgICAgaWYgKCFTU0xfc2V0X3Nlc3Npb25fdGlja2V0X2V4dChjb24sIGR1bW15dGljaywgc3RybGVuKGR1bW15dGljaykpKQorICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisKKyAgICAgICAgaWYgKFNTTF9jb25uZWN0KGNvbikgPiAwKSB7CisgICAgICAgICAgICAvKiBUaGlzIHNob3VsZG4ndCBzdWNjZWVkIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSBhIHNlcnZlciEgKi8KKyAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisKKyAgICAgICAgbGVuID0gQklPX2dldF9tZW1fZGF0YSh3YmlvLCAoY2hhciAqKikmZGF0YSk7CisgICAgICAgIGRhdGFlbmQgPSBkYXRhICsgbGVuOworCisgICAgICAgIC8qIFNraXAgdGhlIHJlY29yZCBoZWFkZXIgKi8KKyAgICAgICAgZGF0YSArPSBTU0wzX1JUX0hFQURFUl9MRU5HVEg7CisgICAgICAgIC8qIFNraXAgdGhlIGhhbmRzaGFrZSBtZXNzYWdlIGhlYWRlciAqLworICAgICAgICBkYXRhICs9IFNTTDNfSE1fSEVBREVSX0xFTkdUSDsKKyAgICAgICAgLyogU2tpcCBjbGllbnQgdmVyc2lvbiBhbmQgcmFuZG9tICovCisgICAgICAgIGRhdGEgKz0gQ0xJRU5UX1ZFUlNJT05fTEVOICsgU1NMM19SQU5ET01fU0laRTsKKyAgICAgICAgaWYgKGRhdGEgKyBTRVNTSU9OX0lEX0xFTl9MRU4gPiBkYXRhZW5kKQorICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIC8qIFNraXAgc2Vzc2lvbiBpZCAqLworICAgICAgICB0bXBsZW4gPSAqZGF0YTsKKyAgICAgICAgZGF0YSArPSBTRVNTSU9OX0lEX0xFTl9MRU4gKyB0bXBsZW47CisgICAgICAgIGlmIChkYXRhICsgQ0lQSEVSU19MRU5fTEVOID4gZGF0YWVuZCkKKyAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAvKiBTa2lwIGNpcGhlcnMgKi8KKyAgICAgICAgdG1wbGVuID0gKCgqZGF0YSkgPDwgOCkgfCAqKGRhdGEgKyAxKTsKKyAgICAgICAgZGF0YSArPSBDSVBIRVJTX0xFTl9MRU4gKyB0bXBsZW47CisgICAgICAgIGlmIChkYXRhICsgQ09NUFJFU1NJT05fTEVOX0xFTiA+IGRhdGFlbmQpCisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgLyogU2tpcCBjb21wcmVzc2lvbiAqLworICAgICAgICB0bXBsZW4gPSAqZGF0YTsKKyAgICAgICAgZGF0YSArPSBDT01QUkVTU0lPTl9MRU5fTEVOICsgdG1wbGVuOworICAgICAgICBpZiAoZGF0YSArIEVYVEVOU0lPTlNfTEVOX0xFTiA+IGRhdGFlbmQpCisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgLyogRXh0ZW5zaW9ucyBsZW4gKi8KKyAgICAgICAgdG1wbGVuID0gKCgqZGF0YSkgPDwgOCkgfCAqKGRhdGEgKyAxKTsKKyAgICAgICAgZGF0YSArPSBFWFRFTlNJT05TX0xFTl9MRU47CisgICAgICAgIGlmIChkYXRhICsgdG1wbGVuID4gZGF0YWVuZCkKKyAgICAgICAgICAgIGdvdG8gZW5kOworCisgICAgICAgIC8qIExvb3AgdGhyb3VnaCBhbGwgZXh0ZW5zaW9ucyAqLworICAgICAgICB3aGlsZSAodG1wbGVuID4gRVhURU5TSU9OX1RZUEVfTEVOICsgRVhURU5TSU9OX1NJWkVfTEVOKSB7CisgICAgICAgICAgICB0eXBlID0gKCgqZGF0YSkgPDwgOCkgfCAqKGRhdGEgKyAxKTsKKyAgICAgICAgICAgIGRhdGEgKz0gRVhURU5TSU9OX1RZUEVfTEVOOworICAgICAgICAgICAgc2l6ZSA9ICgoKmRhdGEpIDw8IDgpIHwgKihkYXRhICsgMSk7CisgICAgICAgICAgICBkYXRhICs9IEVYVEVOU0lPTl9TSVpFX0xFTjsKKyAgICAgICAgICAgIGlmIChkYXRhICsgc2l6ZSA+IGRhdGFlbmQpCisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisKKyAgICAgICAgICAgIGlmICh0eXBlID09IFRMU0VYVF9UWVBFX3Nlc3Npb25fdGlja2V0KSB7CisgICAgICAgICAgICAgICAgaWYgKGN1cnJ0ZXN0ID09IFRFU1RfU0VUX1NFU1NJT05fVElDS19EQVRBX1RMU18xXzIKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IGN1cnJ0ZXN0ID09IFRFU1RfU0VUX1NFU1NJT05fVElDS19EQVRBX1ZFUl9ORUcpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNpemUgPT0gc3RybGVuKGR1bW15dGljaykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtZW1jbXAoZGF0YSwgZHVtbXl0aWNrLCBzaXplKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaWNrZXQgZGF0YSBpcyBhcyB3ZSBleHBlY3RlZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgdGVzdHJlc3VsdCA9IDE7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlJlY2VpdmVkIHNlc3Npb24gdGlja2V0IGlzIG5vdCBhcyBleHBlY3RlZFxuIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0bXBsZW4gLT0gRVhURU5TSU9OX1RZUEVfTEVOICsgRVhURU5TSU9OX1NJWkVfTEVOICsgc2l6ZTsKKyAgICAgICAgICAgIGRhdGEgKz0gc2l6ZTsKKyAgICAgICAgfQorCisgZW5kOgorICAgICAgICBTU0xfZnJlZShjb24pOworICAgICAgICBTU0xfQ1RYX2ZyZWUoY3R4KTsKKyAgICAgICAgaWYgKCF0ZXN0cmVzdWx0KSB7CisgICAgICAgICAgICBwcmludGYoIkNsaWVudEhlbGxvIHRlc3Q6IEZBSUxFRCAoVGVzdCAlZClcbiIsIGN1cnJ0ZXN0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgRVJSX2ZyZWVfc3RyaW5ncygpOworICAgIEVSUl9yZW1vdmVfdGhyZWFkX3N0YXRlKE5VTEwpOworICAgIEVWUF9jbGVhbnVwKCk7CisgICAgQ1JZUFRPX2NsZWFudXBfYWxsX2V4X2RhdGEoKTsKKyAgICBDUllQVE9fbWVtX2xlYWtzKGVycik7CisKKyAgICByZXR1cm4gdGVzdHJlc3VsdD8wOjE7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL3NzbC9kMV9ib3RoLmMgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL3NzbC9kMV9ib3RoLmMKaW5kZXggOGRkOGVhMy4uYWFhMTg2NyAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9zc2wvZDFfYm90aC5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvc3NsL2QxX2JvdGguYwpAQCAtMjkxLDggKzI5MSw0NCBAQAogICAgICAgICBibG9ja3NpemUgPSAwOwogCiAgICAgZnJhZ19vZmYgPSAwOworICAgIHMtPnJ3c3RhdGUgPSBTU0xfTk9USElORzsKKwogICAgIC8qIHMtPmluaXRfbnVtIHNob3VsZG4ndCBldmVyIGJlIDwgMC4uLmJ1dCBqdXN0IGluIGNhc2UgKi8KICAgICB3aGlsZSAocy0+aW5pdF9udW0gPiAwKSB7CisgICAgICAgIGlmICh0eXBlID09IFNTTDNfUlRfSEFORFNIQUtFICYmIHMtPmluaXRfb2ZmICE9IDApIHsKKyAgICAgICAgICAgIC8qIFdlIG11c3QgYmUgd3JpdGluZyBhIGZyYWdtZW50IG90aGVyIHRoYW4gdGhlIGZpcnN0IG9uZSAqLworCisgICAgICAgICAgICBpZiAoZnJhZ19vZmYgPiAwKSB7CisgICAgICAgICAgICAgICAgLyogVGhpcyBpcyB0aGUgZmlyc3QgYXR0ZW1wdCBhdCB3cml0aW5nIG91dCB0aGlzIGZyYWdtZW50ICovCisKKyAgICAgICAgICAgICAgICBpZiAocy0+aW5pdF9vZmYgPD0gRFRMUzFfSE1fSEVBREVSX0xFTkdUSCkgeworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiBFYWNoIGZyYWdtZW50IHRoYXQgd2FzIGFscmVhZHkgc2VudCBtdXN0IGF0IGxlYXN0IGhhdmUKKyAgICAgICAgICAgICAgICAgICAgICogY29udGFpbmVkIHRoZSBtZXNzYWdlIGhlYWRlciBwbHVzIG9uZSBvdGhlciBieXRlLgorICAgICAgICAgICAgICAgICAgICAgKiBUaGVyZWZvcmUgfGluaXRfb2ZmfCBtdXN0IGhhdmUgcHJvZ3Jlc3NlZCBieSBhdCBsZWFzdAorICAgICAgICAgICAgICAgICAgICAgKiB8RFRMUzFfSE1fSEVBREVSX0xFTkdUSCArIDF8IGJ5dGVzLiBJZiBub3Qgc29tZXRoaW5nIHdlbnQKKyAgICAgICAgICAgICAgICAgICAgICogd3JvbmcuCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBBZGp1c3QgfGluaXRfb2ZmfCBhbmQgfGluaXRfbnVtfCB0byBhbGxvdyByb29tIGZvciBhIG5ldworICAgICAgICAgICAgICAgICAqIG1lc3NhZ2UgaGVhZGVyIGZvciB0aGlzIGZyYWdtZW50LgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIHMtPmluaXRfb2ZmIC09IERUTFMxX0hNX0hFQURFUl9MRU5HVEg7CisgICAgICAgICAgICAgICAgcy0+aW5pdF9udW0gKz0gRFRMUzFfSE1fSEVBREVSX0xFTkdUSDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBXZSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQgYWdhaW4gYWZ0ZXIgYSByZXRyeSBzbyB1c2UgdGhlCisgICAgICAgICAgICAgICAgICogZnJhZ21lbnQgb2Zmc2V0IGZyb20gb3VyIGxhc3QgYXR0ZW1wdC4gV2UgZG8gbm90IG5lZWQKKyAgICAgICAgICAgICAgICAgKiB0byBhZGp1c3QgfGluaXRfb2ZmfCBhbmQgfGluaXRfbnVtfCBhcyBhYm92ZSwgYmVjYXVzZQorICAgICAgICAgICAgICAgICAqIHRoYXQgc2hvdWxkIGFscmVhZHkgaGF2ZSBiZWVuIGRvbmUgYmVmb3JlIHRoZSByZXRyeS4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBmcmFnX29mZiA9IHMtPmQxLT53X21zZ19oZHIuZnJhZ19vZmY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICB1c2VkX2xlbiA9IEJJT193cGVuZGluZyhTU0xfZ2V0X3diaW8ocykpICsgRFRMUzFfUlRfSEVBREVSX0xFTkdUSAogICAgICAgICAgICAgKyBtYWNfc2l6ZSArIGJsb2Nrc2l6ZTsKICAgICAgICAgaWYgKHMtPmQxLT5tdHUgPiB1c2VkX2xlbikKQEAgLTMwNSw4ICszNDEsMTAgQEAKICAgICAgICAgICAgICAqIGdyci4uIHdlIGNvdWxkIGdldCBhbiBlcnJvciBpZiBNVFUgcGlja2VkIHdhcyB3cm9uZwogICAgICAgICAgICAgICovCiAgICAgICAgICAgICByZXQgPSBCSU9fZmx1c2goU1NMX2dldF93YmlvKHMpKTsKLSAgICAgICAgICAgIGlmIChyZXQgPD0gMCkKKyAgICAgICAgICAgIGlmIChyZXQgPD0gMCkgeworICAgICAgICAgICAgICAgIHMtPnJ3c3RhdGUgPSBTU0xfV1JJVElORzsKICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQogICAgICAgICAgICAgdXNlZF9sZW4gPSBEVExTMV9SVF9IRUFERVJfTEVOR1RIICsgbWFjX3NpemUgKyBibG9ja3NpemU7CiAgICAgICAgICAgICBpZiAocy0+ZDEtPm10dSA+IHVzZWRfbGVuICsgRFRMUzFfSE1fSEVBREVSX0xFTkdUSCkgewogICAgICAgICAgICAgICAgIGN1cnJfbXR1ID0gcy0+ZDEtPm10dSAtIHVzZWRfbGVuOwpAQCAtMzMyLDI1ICszNzAsNiBAQAogICAgICAgICAgKiBYRFRMUzogdGhpcyBmdW5jdGlvbiBpcyB0b28gbG9uZy4gIHNwbGl0IG91dCB0aGUgQ0NTIHBhcnQKICAgICAgICAgICovCiAgICAgICAgIGlmICh0eXBlID09IFNTTDNfUlRfSEFORFNIQUtFKSB7Ci0gICAgICAgICAgICBpZiAocy0+aW5pdF9vZmYgIT0gMCkgewotICAgICAgICAgICAgICAgIE9QRU5TU0xfYXNzZXJ0KHMtPmluaXRfb2ZmID4gRFRMUzFfSE1fSEVBREVSX0xFTkdUSCk7Ci0gICAgICAgICAgICAgICAgcy0+aW5pdF9vZmYgLT0gRFRMUzFfSE1fSEVBREVSX0xFTkdUSDsKLSAgICAgICAgICAgICAgICBzLT5pbml0X251bSArPSBEVExTMV9ITV9IRUFERVJfTEVOR1RIOwotCi0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBXZSBqdXN0IGNoZWNrZWQgdGhhdCBzLT5pbml0X251bSA+IDAgc28gdGhpcyBjYXN0IHNob3VsZAotICAgICAgICAgICAgICAgICAqIGJlIHNhZmUKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAoKCh1bnNpZ25lZCBpbnQpcy0+aW5pdF9udW0pID4gY3Vycl9tdHUpCi0gICAgICAgICAgICAgICAgICAgIGxlbiA9IGN1cnJfbXR1OwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgbGVuID0gcy0+aW5pdF9udW07Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIFNob3VsZG4ndCBldmVyIGhhcHBlbiAqLwotICAgICAgICAgICAgaWYgKGxlbiA+IElOVF9NQVgpCi0gICAgICAgICAgICAgICAgbGVuID0gSU5UX01BWDsKLQogICAgICAgICAgICAgaWYgKGxlbiA8IERUTFMxX0hNX0hFQURFUl9MRU5HVEgpIHsKICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAqIGxlbiBpcyBzbyBzbWFsbCB0aGF0IHdlIHJlYWxseSBjYW4ndCBkbyBhbnl0aGluZyBzZW5zaWJsZQpAQCAtNDM4LDcgKzQ1NywxNiBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgcy0+aW5pdF9vZmYgKz0gcmV0OwogICAgICAgICAgICAgcy0+aW5pdF9udW0gLT0gcmV0OwotICAgICAgICAgICAgZnJhZ19vZmYgKz0gKHJldCAtPSBEVExTMV9ITV9IRUFERVJfTEVOR1RIKTsKKyAgICAgICAgICAgIHJldCAtPSBEVExTMV9ITV9IRUFERVJfTEVOR1RIOworICAgICAgICAgICAgZnJhZ19vZmYgKz0gcmV0OworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogV2Ugc2F2ZSB0aGUgZnJhZ21lbnQgb2Zmc2V0IGZvciB0aGUgbmV4dCBmcmFnbWVudCBzbyB3ZSBoYXZlIGl0CisgICAgICAgICAgICAgKiBhdmFpbGFibGUgaW4gY2FzZSBvZiBhbiBJTyByZXRyeS4gV2UgZG9uJ3Qga25vdyB0aGUgbGVuZ3RoIG9mIHRoZQorICAgICAgICAgICAgICogbmV4dCBmcmFnbWVudCB5ZXQgc28ganVzdCBzZXQgdGhhdCB0byAwIGZvciBub3cuIEl0IHdpbGwgYmUKKyAgICAgICAgICAgICAqIHVwZGF0ZWQgYWdhaW4gbGF0ZXIuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGR0bHMxX2ZpeF9tZXNzYWdlX2hlYWRlcihzLCBmcmFnX29mZiwgMCk7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuICgwKTsKQEAgLTE0OTAsOSArMTUxOCwxMiBAQAogewogICAgIGludCByZXQ7CiAjaWZuZGVmIE9QRU5TU0xfTk9fU0NUUAotICAgIGlmIChCSU9fZGdyYW1faXNfc2N0cChTU0xfZ2V0X3diaW8ocykpICYmCisgICAgQklPICp3YmlvOworCisgICAgd2JpbyA9IFNTTF9nZXRfd2JpbyhzKTsKKyAgICBpZiAod2JpbyAhPSBOVUxMICYmIEJJT19kZ3JhbV9pc19zY3RwKHdiaW8pICYmCiAgICAgICAgICEocy0+c2h1dGRvd24gJiBTU0xfU0VOVF9TSFVURE9XTikpIHsKLSAgICAgICAgcmV0ID0gQklPX2RncmFtX3NjdHBfd2FpdF9mb3JfZHJ5KFNTTF9nZXRfd2JpbyhzKSk7CisgICAgICAgIHJldCA9IEJJT19kZ3JhbV9zY3RwX3dhaXRfZm9yX2RyeSh3YmlvKTsKICAgICAgICAgaWYgKHJldCA8IDApCiAgICAgICAgICAgICByZXR1cm4gLTE7CiAKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvc3NsL2QxX2NsbnQuYyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvc3NsL2QxX2NsbnQuYwppbmRleCAzNzdjMWU2Li5lYjM3MWEyIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL3NzbC9kMV9jbG50LmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9zc2wvZDFfY2xudC5jCkBAIC0yOTksMTMgKzI5OSwxMiBAQAogI2VuZGlmCiAKICAgICAgICAgY2FzZSBTU0wzX1NUX0NXX0NMTlRfSEVMTE9fQToKLSAgICAgICAgY2FzZSBTU0wzX1NUX0NXX0NMTlRfSEVMTE9fQjoKLQogICAgICAgICAgICAgcy0+c2h1dGRvd24gPSAwOwogCiAgICAgICAgICAgICAvKiBldmVyeSBEVExTIENsaWVudEhlbGxvIHJlc2V0cyBGaW5pc2hlZCBNQUMgKi8KICAgICAgICAgICAgIHNzbDNfaW5pdF9maW5pc2hlZF9tYWMocyk7CiAKKyAgICAgICAgY2FzZSBTU0wzX1NUX0NXX0NMTlRfSEVMTE9fQjoKICAgICAgICAgICAgIGR0bHMxX3N0YXJ0X3RpbWVyKHMpOwogICAgICAgICAgICAgcmV0ID0gZHRsczFfY2xpZW50X2hlbGxvKHMpOwogICAgICAgICAgICAgaWYgKHJldCA8PSAwKQpAQCAtMzUwLDExICszNDksMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKERUTFMxX1NDVFBfQVVUSF9MQUJFTCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERUTFMxX1NDVFBfQVVUSF9MQUJFTCk7CiAKLSAgICAgICAgICAgICAgICAgICAgU1NMX2V4cG9ydF9rZXlpbmdfbWF0ZXJpYWwocywgc2N0cGF1dGhrZXksCisgICAgICAgICAgICAgICAgICAgIGlmIChTU0xfZXhwb3J0X2tleWluZ19tYXRlcmlhbChzLCBzY3RwYXV0aGtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHNjdHBhdXRoa2V5KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxidWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihsYWJlbGJ1ZmZlciksIE5VTEwsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKSA8PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPnN0YXRlID0gU1NMX1NUX0VSUjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgQklPX2N0cmwoU1NMX2dldF93YmlvKHMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSU9fQ1RSTF9ER1JBTV9TQ1RQX0FERF9BVVRIX0tFWSwKQEAgLTM2Miw2ICszNjUsMTAgQEAKICNlbmRpZgogCiAgICAgICAgICAgICAgICAgICAgIHMtPnN0YXRlID0gU1NMM19TVF9DUl9GSU5JU0hFRF9BOworICAgICAgICAgICAgICAgICAgICBpZiAocy0+dGxzZXh0X3RpY2tldF9leHBlY3RlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVjZWl2ZSByZW5ld2VkIHNlc3Npb24gdGlja2V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICBzLT5zdGF0ZSA9IFNTTDNfU1RfQ1JfU0VTU0lPTl9USUNLRVRfQTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICBzLT5zdGF0ZSA9IERUTFMxX1NUX0NSX0hFTExPX1ZFUklGWV9SRVFVRVNUX0E7CiAgICAgICAgICAgICB9CkBAIC00ODQsOSArNDkxLDEzIEBACiAgICAgICAgICAgICBzbnByaW50ZigoY2hhciAqKWxhYmVsYnVmZmVyLCBzaXplb2YoRFRMUzFfU0NUUF9BVVRIX0xBQkVMKSwKICAgICAgICAgICAgICAgICAgICAgIERUTFMxX1NDVFBfQVVUSF9MQUJFTCk7CiAKLSAgICAgICAgICAgIFNTTF9leHBvcnRfa2V5aW5nX21hdGVyaWFsKHMsIHNjdHBhdXRoa2V5LAorICAgICAgICAgICAgaWYgKFNTTF9leHBvcnRfa2V5aW5nX21hdGVyaWFsKHMsIHNjdHBhdXRoa2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHNjdHBhdXRoa2V5KSwgbGFiZWxidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YobGFiZWxidWZmZXIpLCBOVUxMLCAwLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihsYWJlbGJ1ZmZlciksIE5VTEwsIDAsIDApIDw9IDApIHsKKyAgICAgICAgICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgICAgICAgICBzLT5zdGF0ZSA9IFNTTF9TVF9FUlI7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIEJJT19jdHJsKFNTTF9nZXRfd2JpbyhzKSwgQklPX0NUUkxfREdSQU1fU0NUUF9BRERfQVVUSF9LRVksCiAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc2N0cGF1dGhrZXkpLCBzY3RwYXV0aGtleSk7CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL3NzbC9kMV9zcnZyLmMgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL3NzbC9kMV9zcnZyLmMKaW5kZXggNDFjN2RjNS4uZjAxYjhhNiAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9zc2wvZDFfc3J2ci5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvc3NsL2QxX3NydnIuYwpAQCAtMjY3LDYgKzI2NywxOSBAQAogICAgICAgICAgICAgICAgIHNzbDNfaW5pdF9maW5pc2hlZF9tYWMocyk7CiAgICAgICAgICAgICAgICAgcy0+c3RhdGUgPSBTU0wzX1NUX1NSX0NMTlRfSEVMTE9fQTsKICAgICAgICAgICAgICAgICBzLT5jdHgtPnN0YXRzLnNlc3NfYWNjZXB0Kys7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFzLT5zMy0+c2VuZF9jb25uZWN0aW9uX2JpbmRpbmcgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIShzLT5vcHRpb25zICYKKyAgICAgICAgICAgICAgICAgICAgICAgICBTU0xfT1BfQUxMT1dfVU5TQUZFX0xFR0FDWV9SRU5FR09USUFUSU9OKSkgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogU2VydmVyIGF0dGVtcHRpbmcgdG8gcmVuZWdvdGlhdGUgd2l0aCBjbGllbnQgdGhhdCBkb2Vzbid0CisgICAgICAgICAgICAgICAgICogc3VwcG9ydCBzZWN1cmUgcmVuZWdvdGlhdGlvbi4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBTU0xlcnIoU1NMX0ZfRFRMUzFfQUNDRVBULAorICAgICAgICAgICAgICAgICAgICAgICBTU0xfUl9VTlNBRkVfTEVHQUNZX1JFTkVHT1RJQVRJT05fRElTQUJMRUQpOworICAgICAgICAgICAgICAgIHNzbDNfc2VuZF9hbGVydChzLCBTU0wzX0FMX0ZBVEFMLCBTU0xfQURfSEFORFNIQUtFX0ZBSUxVUkUpOworICAgICAgICAgICAgICAgIHJldCA9IC0xOworICAgICAgICAgICAgICAgIHMtPnN0YXRlID0gU1NMX1NUX0VSUjsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgKiBzLT5zdGF0ZSA9PSBTU0xfU1RfUkVORUdPVElBVEUsIHdlIHdpbGwganVzdCBzZW5kIGEKQEAgLTQwNSw5ICs0MTgsMTMgQEAKICAgICAgICAgICAgICAgICBzbnByaW50ZigoY2hhciAqKWxhYmVsYnVmZmVyLCBzaXplb2YoRFRMUzFfU0NUUF9BVVRIX0xBQkVMKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBEVExTMV9TQ1RQX0FVVEhfTEFCRUwpOwogCi0gICAgICAgICAgICAgICAgU1NMX2V4cG9ydF9rZXlpbmdfbWF0ZXJpYWwocywgc2N0cGF1dGhrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHNjdHBhdXRoa2V5KSwgbGFiZWxidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGxhYmVsYnVmZmVyKSwgTlVMTCwgMCwgMCk7CisgICAgICAgICAgICAgICAgaWYgKFNTTF9leHBvcnRfa2V5aW5nX21hdGVyaWFsKHMsIHNjdHBhdXRoa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHNjdHBhdXRoa2V5KSwgbGFiZWxidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YobGFiZWxidWZmZXIpLCBOVUxMLCAwLCAwKSA8PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IC0xOworICAgICAgICAgICAgICAgICAgICBzLT5zdGF0ZSA9IFNTTF9TVF9FUlI7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIEJJT19jdHJsKFNTTF9nZXRfd2JpbyhzKSwgQklPX0NUUkxfREdSQU1fU0NUUF9BRERfQVVUSF9LRVksCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHNjdHBhdXRoa2V5KSwgc2N0cGF1dGhrZXkpOwpAQCAtNjI4LDkgKzY0NSwxMyBAQAogICAgICAgICAgICAgc25wcmludGYoKGNoYXIgKilsYWJlbGJ1ZmZlciwgc2l6ZW9mKERUTFMxX1NDVFBfQVVUSF9MQUJFTCksCiAgICAgICAgICAgICAgICAgICAgICBEVExTMV9TQ1RQX0FVVEhfTEFCRUwpOwogCi0gICAgICAgICAgICBTU0xfZXhwb3J0X2tleWluZ19tYXRlcmlhbChzLCBzY3RwYXV0aGtleSwKKyAgICAgICAgICAgIGlmIChTU0xfZXhwb3J0X2tleWluZ19tYXRlcmlhbChzLCBzY3RwYXV0aGtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzY3RwYXV0aGtleSksIGxhYmVsYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGxhYmVsYnVmZmVyKSwgTlVMTCwgMCwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YobGFiZWxidWZmZXIpLCBOVUxMLCAwLCAwKSA8PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gLTE7CisgICAgICAgICAgICAgICAgcy0+c3RhdGUgPSBTU0xfU1RfRVJSOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBCSU9fY3RybChTU0xfZ2V0X3diaW8ocyksIEJJT19DVFJMX0RHUkFNX1NDVFBfQUREX0FVVEhfS0VZLAogICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHNjdHBhdXRoa2V5KSwgc2N0cGF1dGhrZXkpOwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9zc2wva3NzbC5jIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9zc2wva3NzbC5jCmluZGV4IGNmNTg1NjcuLmYyODM5YmQgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvc3NsL2tzc2wuYworKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL3NzbC9rc3NsLmMKQEAgLTEsNCArMSw0IEBACi0vKiBzc2wva3NzbC5jIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJlYXkiIC0qLSAqLworLyogc3NsL2tzc2wuYyAqLwogLyoKICAqIFdyaXR0ZW4gYnkgVmVybiBTdGFhdHMgPHN0YWF0c3ZyQGFzYy5ocGMubWlsPiBmb3IgdGhlIE9wZW5TU0wgcHJvamVjdAogICogMjAwMC4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvc3NsL2tzc2wuaCBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvc3NsL2tzc2wuaAppbmRleCA5YTU3NjcyLi5hZThhNTFmIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL3NzbC9rc3NsLmgKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9zc2wva3NzbC5oCkBAIC0xLDQgKzEsNCBAQAotLyogc3NsL2tzc2wuaCAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZWF5IiAtKi0gKi8KKy8qIHNzbC9rc3NsLmggKi8KIC8qCiAgKiBXcml0dGVuIGJ5IFZlcm4gU3RhYXRzIDxzdGFhdHN2ckBhc2MuaHBjLm1pbD4gZm9yIHRoZSBPcGVuU1NMIHByb2plY3QKICAqIDIwMDAuIHByb2plY3QgMjAwMC4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvc3NsL2tzc2xfbGNsLmggYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL3NzbC9rc3NsX2xjbC5oCmluZGV4IDQ2ZGNlZjIuLjhlNmE2ZDYgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvc3NsL2tzc2xfbGNsLmgKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9zc2wva3NzbF9sY2wuaApAQCAtMSw0ICsxLDQgQEAKLS8qIHNzbC9rc3NsLmggLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImVheSIgLSotICovCisvKiBzc2wva3NzbC5oICovCiAvKgogICogV3JpdHRlbiBieSBWZXJuIFN0YWF0cyA8c3RhYXRzdnJAYXNjLmhwYy5taWw+IGZvciB0aGUgT3BlblNTTCBwcm9qZWN0CiAgKiAyMDAwLiBwcm9qZWN0IDIwMDAuCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL3NzbC9zMjNfY2xudC5jIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9zc2wvczIzX2NsbnQuYwppbmRleCA5YjBiMGU4Li43NDVkY2E1IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL3NzbC9zMjNfY2xudC5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvc3NsL3MyM19jbG50LmMKQEAgLTM3NiwxMiArMzc2LDEzIEBACiAKICAgICBidWYgPSAodW5zaWduZWQgY2hhciAqKXMtPmluaXRfYnVmLT5kYXRhOwogICAgIGlmIChzLT5zdGF0ZSA9PSBTU0wyM19TVF9DV19DTE5UX0hFTExPX0EpIHsKLSNpZiAwCi0gICAgICAgIC8qIGRvbid0IHJldXNlIHNlc3Npb24taWQncyAqLworICAgICAgICAvKgorICAgICAgICAgKiBTaW5jZSB3ZSdyZSBzZW5kaW5nIHMyMyBjbGllbnQgaGVsbG8sIHdlJ3JlIG5vdCByZXVzaW5nIGEgc2Vzc2lvbiwgYXMKKyAgICAgICAgICogd2UnZCBiZSB1c2luZyB0aGUgbWV0aG9kIGZyb20gdGhlIHNhdmVkIHNlc3Npb24gaW5zdGVhZAorICAgICAgICAgKi8KICAgICAgICAgaWYgKCFzc2xfZ2V0X25ld19zZXNzaW9uKHMsIDApKSB7Ci0gICAgICAgICAgICByZXR1cm4gKC0xKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQotI2VuZGlmCiAKICAgICAgICAgcCA9IHMtPnMzLT5jbGllbnRfcmFuZG9tOwogICAgICAgICBpZiAoc3NsX2ZpbGxfaGVsbG9fcmFuZG9tKHMsIDAsIHAsIFNTTDNfUkFORE9NX1NJWkUpIDw9IDApCkBAIC00NDIsOSArNDQzLDYgQEAKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBwdXQgaW4gdGhlIHNlc3Npb24taWQgbGVuZ3RoICh6ZXJvIHNpbmNlIHRoZXJlIGlzIG5vIHJldXNlKQogICAgICAgICAgICAgICovCi0jaWYgMAotICAgICAgICAgICAgcy0+c2Vzc2lvbi0+c2Vzc2lvbl9pZF9sZW5ndGggPSAwOwotI2VuZGlmCiAgICAgICAgICAgICBzMm4oMCwgZCk7CiAKICAgICAgICAgICAgIGlmIChzLT5vcHRpb25zICYgU1NMX09QX05FVFNDQVBFX0NIQUxMRU5HRV9CVUcpCkBAIC03MzIsNiArNzMwLDggQEAKICAgICAgICAgICAgIGdvdG8gZXJyOwogICAgICAgICB9CiAKKyAgICAgICAgcy0+c2Vzc2lvbi0+c3NsX3ZlcnNpb24gPSBzLT52ZXJzaW9uOworCiAgICAgICAgIC8qIGVuc3VyZSB0aGF0IFRMU19NQVhfVkVSU0lPTiBpcyB1cC10by1kYXRlICovCiAgICAgICAgIE9QRU5TU0xfYXNzZXJ0KHMtPnZlcnNpb24gPD0gVExTX01BWF9WRVJTSU9OKTsKIApAQCAtNzg3LDEzICs3ODcsNiBAQAogICAgIH0KICAgICBzLT5pbml0X251bSA9IDA7CiAKLSAgICAvKgotICAgICAqIFNpbmNlLCBpZiB3ZSBhcmUgc2VuZGluZyBhIHNzbDIzIGNsaWVudCBoZWxsbywgd2UgYXJlIG5vdCByZXVzaW5nIGEKLSAgICAgKiBzZXNzaW9uLWlkCi0gICAgICovCi0gICAgaWYgKCFzc2xfZ2V0X25ld19zZXNzaW9uKHMsIDApKQotICAgICAgICBnb3RvIGVycjsKLQogICAgIHJldHVybiAoU1NMX2Nvbm5lY3QocykpOwogIGVycjoKICAgICByZXR1cm4gKC0xKTsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvc3NsL3MyX3NydnIuYyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvc3NsL3MyX3NydnIuYwppbmRleCBhMGJlMTBjLi5iODkxZjI2IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL3NzbC9zMl9zcnZyLmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9zc2wvczJfc3J2ci5jCkBAIC00MDUsNyArNDA1LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGNwID0gc3NsMl9nZXRfY2lwaGVyX2J5X2NoYXIocCk7Ci0gICAgICAgIGlmIChjcCA9PSBOVUxMKSB7CisgICAgICAgIGlmIChjcCA9PSBOVUxMIHx8IHNrX1NTTF9DSVBIRVJfZmluZChzLT5zZXNzaW9uLT5jaXBoZXJzLCBjcCkgPCAwKSB7CiAgICAgICAgICAgICBzc2wyX3JldHVybl9lcnJvcihzLCBTU0wyX1BFX05PX0NJUEhFUik7CiAgICAgICAgICAgICBTU0xlcnIoU1NMX0ZfR0VUX0NMSUVOVF9NQVNURVJfS0VZLCBTU0xfUl9OT19DSVBIRVJfTUFUQ0gpOwogICAgICAgICAgICAgcmV0dXJuICgtMSk7CkBAIC02MDEsNiArNjAxLDExIEBACiAgICAgICAgIHMtPnMyLT50bXAuY2lwaGVyX3NwZWNfbGVuZ3RoID0gaTsKICAgICAgICAgbjJzKHAsIGkpOwogICAgICAgICBzLT5zMi0+dG1wLnNlc3Npb25faWRfbGVuZ3RoID0gaTsKKyAgICAgICAgaWYgKChpIDwgMCkgfHwgKGkgPiBTU0xfTUFYX1NTTF9TRVNTSU9OX0lEX0xFTkdUSCkpIHsKKyAgICAgICAgICAgIHNzbDJfcmV0dXJuX2Vycm9yKHMsIFNTTDJfUEVfVU5ERUZJTkVEX0VSUk9SKTsKKyAgICAgICAgICAgIFNTTGVycihTU0xfRl9HRVRfQ0xJRU5UX0hFTExPLCBTU0xfUl9MRU5HVEhfTUlTTUFUQ0gpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CiAgICAgICAgIG4ycyhwLCBpKTsKICAgICAgICAgcy0+czItPmNoYWxsZW5nZV9sZW5ndGggPSBpOwogICAgICAgICBpZiAoKGkgPCBTU0wyX01JTl9DSEFMTEVOR0VfTEVOR1RIKSB8fApAQCAtNjkwLDggKzY5NSwxMiBAQAogICAgICAgICAgICAgcHJpbyA9IGNzOwogICAgICAgICAgICAgYWxsb3cgPSBjbDsKICAgICAgICAgfQorCisgICAgICAgIC8qIEdlbmVyYXRlIGxpc3Qgb2YgU1NMdjIgY2lwaGVycyBzaGFyZWQgYmV0d2VlbiBjbGllbnQgYW5kIHNlcnZlciAqLwogICAgICAgICBmb3IgKHogPSAwOyB6IDwgc2tfU1NMX0NJUEhFUl9udW0ocHJpbyk7IHorKykgewotICAgICAgICAgICAgaWYgKHNrX1NTTF9DSVBIRVJfZmluZChhbGxvdywgc2tfU1NMX0NJUEhFUl92YWx1ZShwcmlvLCB6KSkgPCAwKSB7CisgICAgICAgICAgICBjb25zdCBTU0xfQ0lQSEVSICpjcCA9IHNrX1NTTF9DSVBIRVJfdmFsdWUocHJpbywgeik7CisgICAgICAgICAgICBpZiAoKGNwLT5hbGdvcml0aG1fc3NsICYgU1NMX1NTTFYyKSA9PSAwIHx8CisgICAgICAgICAgICAgICAgc2tfU1NMX0NJUEhFUl9maW5kKGFsbG93LCBjcCkgPCAwKSB7CiAgICAgICAgICAgICAgICAgKHZvaWQpc2tfU1NMX0NJUEhFUl9kZWxldGUocHJpbywgeik7CiAgICAgICAgICAgICAgICAgei0tOwogICAgICAgICAgICAgfQpAQCAtNzAwLDYgKzcwOSwxMyBAQAogICAgICAgICAgICAgc2tfU1NMX0NJUEhFUl9mcmVlKHMtPnNlc3Npb24tPmNpcGhlcnMpOwogICAgICAgICAgICAgcy0+c2Vzc2lvbi0+Y2lwaGVycyA9IHByaW87CiAgICAgICAgIH0KKworICAgICAgICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSBhdCBsZWFzdCBvbmUgY2lwaGVyIGluIGNvbW1vbiAqLworICAgICAgICBpZiAoc2tfU1NMX0NJUEhFUl9udW0ocy0+c2Vzc2lvbi0+Y2lwaGVycykgPT0gMCkgeworICAgICAgICAgICAgc3NsMl9yZXR1cm5fZXJyb3IocywgU1NMMl9QRV9OT19DSVBIRVIpOworICAgICAgICAgICAgU1NMZXJyKFNTTF9GX0dFVF9DTElFTlRfSEVMTE8sIFNTTF9SX05PX0NJUEhFUl9NQVRDSCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KICAgICAgICAgLyoKICAgICAgICAgICogcy0+c2Vzc2lvbi0+Y2lwaGVycyBzaG91bGQgbm93IGhhdmUgYSBsaXN0IG9mIGNpcGhlcnMgdGhhdCBhcmUgb24KICAgICAgICAgICogYm90aCB0aGUgY2xpZW50IGFuZCBzZXJ2ZXIuIFRoaXMgbGlzdCBpcyBvcmRlcmVkIGJ5IHRoZSBvcmRlciB0aGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvc3NsL3MzX2NiYy5jIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9zc2wvczNfY2JjLmMKaW5kZXggMjhjYTUwYi4uZmQwMTRiNSAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9zc2wvczNfY2JjLmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9zc2wvczNfY2JjLmMKQEAgLTQxMSw4ICs0MTEsOSBAQAogICogZnVuY3Rpb25zLCBhYm92ZSwgd2Uga25vdyB0aGF0IGRhdGFfcGx1c19tYWNfc2l6ZSBpcyBsYXJnZSBlbm91Z2ggdG8gY29udGFpbgogICogYSBwYWRkaW5nIGJ5dGUgYW5kIE1BQy4gKElmIHRoZSBwYWRkaW5nIHdhcyBpbnZhbGlkLCBpdCBtaWdodCBjb250YWluIHRoZQogICogcGFkZGluZyB0b28uICkKKyAqIFJldHVybnMgMSBvbiBzdWNjZXNzIG9yIDAgb24gZXJyb3IKICAqLwotdm9pZCBzc2wzX2NiY19kaWdlc3RfcmVjb3JkKGNvbnN0IEVWUF9NRF9DVFggKmN0eCwKK2ludCBzc2wzX2NiY19kaWdlc3RfcmVjb3JkKGNvbnN0IEVWUF9NRF9DVFggKmN0eCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICptZF9vdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICptZF9vdXRfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyIGhlYWRlclsxM10sCkBAIC00NTUsNyArNDU2LDggQEAKIAogICAgIHN3aXRjaCAoRVZQX01EX0NUWF90eXBlKGN0eCkpIHsKICAgICBjYXNlIE5JRF9tZDU6Ci0gICAgICAgIE1ENV9Jbml0KChNRDVfQ1RYICopbWRfc3RhdGUuYyk7CisgICAgICAgIGlmIChNRDVfSW5pdCgoTUQ1X0NUWCAqKW1kX3N0YXRlLmMpIDw9IDApCisgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgbWRfZmluYWxfcmF3ID0gdGxzMV9tZDVfZmluYWxfcmF3OwogICAgICAgICBtZF90cmFuc2Zvcm0gPQogICAgICAgICAgICAgKHZvaWQgKCopKHZvaWQgKmN0eCwgY29uc3QgdW5zaWduZWQgY2hhciAqYmxvY2spKU1ENV9UcmFuc2Zvcm07CkBAIC00NjQsNyArNDY2LDggQEAKICAgICAgICAgbGVuZ3RoX2lzX2JpZ19lbmRpYW4gPSAwOwogICAgICAgICBicmVhazsKICAgICBjYXNlIE5JRF9zaGExOgotICAgICAgICBTSEExX0luaXQoKFNIQV9DVFggKiltZF9zdGF0ZS5jKTsKKyAgICAgICAgaWYgKFNIQTFfSW5pdCgoU0hBX0NUWCAqKW1kX3N0YXRlLmMpIDw9IDApCisgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgbWRfZmluYWxfcmF3ID0gdGxzMV9zaGExX2ZpbmFsX3JhdzsKICAgICAgICAgbWRfdHJhbnNmb3JtID0KICAgICAgICAgICAgICh2b2lkICgqKSh2b2lkICpjdHgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJsb2NrKSlTSEExX1RyYW5zZm9ybTsKQEAgLTQ3MiwxNCArNDc1LDE2IEBACiAgICAgICAgIGJyZWFrOwogI2lmbmRlZiBPUEVOU1NMX05PX1NIQTI1NgogICAgIGNhc2UgTklEX3NoYTIyNDoKLSAgICAgICAgU0hBMjI0X0luaXQoKFNIQTI1Nl9DVFggKiltZF9zdGF0ZS5jKTsKKyAgICAgICAgaWYgKFNIQTIyNF9Jbml0KChTSEEyNTZfQ1RYICopbWRfc3RhdGUuYykgPD0gMCkKKyAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICBtZF9maW5hbF9yYXcgPSB0bHMxX3NoYTI1Nl9maW5hbF9yYXc7CiAgICAgICAgIG1kX3RyYW5zZm9ybSA9CiAgICAgICAgICAgICAodm9pZCAoKikodm9pZCAqY3R4LCBjb25zdCB1bnNpZ25lZCBjaGFyICpibG9jaykpU0hBMjU2X1RyYW5zZm9ybTsKICAgICAgICAgbWRfc2l6ZSA9IDIyNCAvIDg7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgTklEX3NoYTI1NjoKLSAgICAgICAgU0hBMjU2X0luaXQoKFNIQTI1Nl9DVFggKiltZF9zdGF0ZS5jKTsKKyAgICAgICAgaWYgKFNIQTI1Nl9Jbml0KChTSEEyNTZfQ1RYICopbWRfc3RhdGUuYykgPD0gMCkKKyAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICBtZF9maW5hbF9yYXcgPSB0bHMxX3NoYTI1Nl9maW5hbF9yYXc7CiAgICAgICAgIG1kX3RyYW5zZm9ybSA9CiAgICAgICAgICAgICAodm9pZCAoKikodm9pZCAqY3R4LCBjb25zdCB1bnNpZ25lZCBjaGFyICpibG9jaykpU0hBMjU2X1RyYW5zZm9ybTsKQEAgLTQ4OCw3ICs0OTMsOCBAQAogI2VuZGlmCiAjaWZuZGVmIE9QRU5TU0xfTk9fU0hBNTEyCiAgICAgY2FzZSBOSURfc2hhMzg0OgotICAgICAgICBTSEEzODRfSW5pdCgoU0hBNTEyX0NUWCAqKW1kX3N0YXRlLmMpOworICAgICAgICBpZiAoU0hBMzg0X0luaXQoKFNIQTUxMl9DVFggKiltZF9zdGF0ZS5jKSA8PSAwKQorICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIG1kX2ZpbmFsX3JhdyA9IHRsczFfc2hhNTEyX2ZpbmFsX3JhdzsKICAgICAgICAgbWRfdHJhbnNmb3JtID0KICAgICAgICAgICAgICh2b2lkICgqKSh2b2lkICpjdHgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJsb2NrKSlTSEE1MTJfVHJhbnNmb3JtOwpAQCAtNDk3LDcgKzUwMyw4IEBACiAgICAgICAgIG1kX2xlbmd0aF9zaXplID0gMTY7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgTklEX3NoYTUxMjoKLSAgICAgICAgU0hBNTEyX0luaXQoKFNIQTUxMl9DVFggKiltZF9zdGF0ZS5jKTsKKyAgICAgICAgaWYgKFNIQTUxMl9Jbml0KChTSEE1MTJfQ1RYICopbWRfc3RhdGUuYykgPD0gMCkKKyAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICBtZF9maW5hbF9yYXcgPSB0bHMxX3NoYTUxMl9maW5hbF9yYXc7CiAgICAgICAgIG1kX3RyYW5zZm9ybSA9CiAgICAgICAgICAgICAodm9pZCAoKikodm9pZCAqY3R4LCBjb25zdCB1bnNpZ25lZCBjaGFyICpibG9jaykpU0hBNTEyX1RyYW5zZm9ybTsKQEAgLTUxNCw3ICs1MjEsNyBAQAogICAgICAgICBPUEVOU1NMX2Fzc2VydCgwKTsKICAgICAgICAgaWYgKG1kX291dF9zaXplKQogICAgICAgICAgICAgKm1kX291dF9zaXplID0gLTE7Ci0gICAgICAgIHJldHVybjsKKyAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCiAgICAgT1BFTlNTTF9hc3NlcnQobWRfbGVuZ3RoX3NpemUgPD0gTUFYX0hBU0hfQklUX0NPVU5UX0JZVEVTKTsKQEAgLTY1Miw3ICs2NTksNyBAQAogICAgICAgICAgICAgICovCiAgICAgICAgICAgICBpZiAoaGVhZGVyX2xlbmd0aCA8PSBtZF9ibG9ja19zaXplKSB7CiAgICAgICAgICAgICAgICAgLyogU2hvdWxkIG5ldmVyIGhhcHBlbiAqLwotICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG92ZXJoYW5nID0gaGVhZGVyX2xlbmd0aCAtIG1kX2Jsb2NrX3NpemU7CiAgICAgICAgICAgICBtZF90cmFuc2Zvcm0obWRfc3RhdGUuYywgaGVhZGVyKTsKQEAgLTczMywyNiArNzQwLDM0IEBACiAgICAgfQogCiAgICAgRVZQX01EX0NUWF9pbml0KCZtZF9jdHgpOwotICAgIEVWUF9EaWdlc3RJbml0X2V4KCZtZF9jdHgsIGN0eC0+ZGlnZXN0LCBOVUxMIC8qIGVuZ2luZSAqLyApOworICAgIGlmIChFVlBfRGlnZXN0SW5pdF9leCgmbWRfY3R4LCBjdHgtPmRpZ2VzdCwgTlVMTCAvKiBlbmdpbmUgKi8gKSA8PSAwKQorICAgICAgICBnb3RvIGVycjsKICAgICBpZiAoaXNfc3NsdjMpIHsKICAgICAgICAgLyogV2UgcmVwdXJwb3NlIHxobWFjX3BhZHwgdG8gY29udGFpbiB0aGUgU1NMdjMgcGFkMiBibG9jay4gKi8KICAgICAgICAgT1BFTlNTTF9wb3J0X21lbXNldChobWFjX3BhZCwgMHg1Yywgc3NsdjNfcGFkX2xlbmd0aCk7CiAKLSAgICAgICAgRVZQX0RpZ2VzdFVwZGF0ZSgmbWRfY3R4LCBtYWNfc2VjcmV0LCBtYWNfc2VjcmV0X2xlbmd0aCk7Ci0gICAgICAgIEVWUF9EaWdlc3RVcGRhdGUoJm1kX2N0eCwgaG1hY19wYWQsIHNzbHYzX3BhZF9sZW5ndGgpOwotICAgICAgICBFVlBfRGlnZXN0VXBkYXRlKCZtZF9jdHgsIG1hY19vdXQsIG1kX3NpemUpOworICAgICAgICBpZiAoRVZQX0RpZ2VzdFVwZGF0ZSgmbWRfY3R4LCBtYWNfc2VjcmV0LCBtYWNfc2VjcmV0X2xlbmd0aCkgPD0gMAorICAgICAgICAgICAgICAgIHx8IEVWUF9EaWdlc3RVcGRhdGUoJm1kX2N0eCwgaG1hY19wYWQsIHNzbHYzX3BhZF9sZW5ndGgpIDw9IDAKKyAgICAgICAgICAgICAgICB8fCBFVlBfRGlnZXN0VXBkYXRlKCZtZF9jdHgsIG1hY19vdXQsIG1kX3NpemUpIDw9IDApCisgICAgICAgICAgICBnb3RvIGVycjsKICAgICB9IGVsc2UgewogICAgICAgICAvKiBDb21wbGV0ZSB0aGUgSE1BQyBpbiB0aGUgc3RhbmRhcmQgbWFubmVyLiAqLwogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbWRfYmxvY2tfc2l6ZTsgaSsrKQogICAgICAgICAgICAgaG1hY19wYWRbaV0gXj0gMHg2YTsKIAotICAgICAgICBFVlBfRGlnZXN0VXBkYXRlKCZtZF9jdHgsIGhtYWNfcGFkLCBtZF9ibG9ja19zaXplKTsKLSAgICAgICAgRVZQX0RpZ2VzdFVwZGF0ZSgmbWRfY3R4LCBtYWNfb3V0LCBtZF9zaXplKTsKKyAgICAgICAgaWYgKEVWUF9EaWdlc3RVcGRhdGUoJm1kX2N0eCwgaG1hY19wYWQsIG1kX2Jsb2NrX3NpemUpIDw9IDAKKyAgICAgICAgICAgICAgICB8fCBFVlBfRGlnZXN0VXBkYXRlKCZtZF9jdHgsIG1hY19vdXQsIG1kX3NpemUpIDw9IDApCisgICAgICAgICAgICBnb3RvIGVycjsKICAgICB9CiAgICAgRVZQX0RpZ2VzdEZpbmFsKCZtZF9jdHgsIG1kX291dCwgJm1kX291dF9zaXplX3UpOwogICAgIGlmIChtZF9vdXRfc2l6ZSkKICAgICAgICAgKm1kX291dF9zaXplID0gbWRfb3V0X3NpemVfdTsKICAgICBFVlBfTURfQ1RYX2NsZWFudXAoJm1kX2N0eCk7CisKKyAgICByZXR1cm4gMTsKK2VycjoKKyAgICBFVlBfTURfQ1RYX2NsZWFudXAoJm1kX2N0eCk7CisgICAgcmV0dXJuIDA7CiB9CiAKICNpZmRlZiBPUEVOU1NMX0ZJUFMKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvc3NsL3MzX2NsbnQuYyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvc3NsL3MzX2NsbnQuYwppbmRleCA0YjU0MjNjLi4wZTc3MmNiIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL3NzbC9zM19jbG50LmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9zc2wvczNfY2xudC5jCkBAIC0xNjI3LDYgKzE2MjcsMTIgQEAKICAgICAgICAgfQogICAgICAgICBwICs9IGk7CiAKKyAgICAgICAgaWYgKEJOX2lzX3plcm8oZGgtPnApKSB7CisgICAgICAgICAgICBTU0xlcnIoU1NMX0ZfU1NMM19HRVRfS0VZX0VYQ0hBTkdFLCBTU0xfUl9CQURfREhfUF9WQUxVRSk7CisgICAgICAgICAgICBnb3RvIGZfZXJyOworICAgICAgICB9CisKKwogICAgICAgICBpZiAoMiA+IG4gLSBwYXJhbV9sZW4pIHsKICAgICAgICAgICAgIFNTTGVycihTU0xfRl9TU0wzX0dFVF9LRVlfRVhDSEFOR0UsIFNTTF9SX0xFTkdUSF9UT09fU0hPUlQpOwogICAgICAgICAgICAgZ290byBmX2VycjsKQEAgLTE2NDcsNiArMTY1MywxMSBAQAogICAgICAgICB9CiAgICAgICAgIHAgKz0gaTsKIAorICAgICAgICBpZiAoQk5faXNfemVybyhkaC0+ZykpIHsKKyAgICAgICAgICAgIFNTTGVycihTU0xfRl9TU0wzX0dFVF9LRVlfRVhDSEFOR0UsIFNTTF9SX0JBRF9ESF9HX1ZBTFVFKTsKKyAgICAgICAgICAgIGdvdG8gZl9lcnI7CisgICAgICAgIH0KKwogICAgICAgICBpZiAoMiA+IG4gLSBwYXJhbV9sZW4pIHsKICAgICAgICAgICAgIFNTTGVycihTU0xfRl9TU0wzX0dFVF9LRVlfRVhDSEFOR0UsIFNTTF9SX0xFTkdUSF9UT09fU0hPUlQpOwogICAgICAgICAgICAgZ290byBmX2VycjsKQEAgLTE2NjgsNiArMTY3OSwxMSBAQAogICAgICAgICBwICs9IGk7CiAgICAgICAgIG4gLT0gcGFyYW1fbGVuOwogCisgICAgICAgIGlmIChCTl9pc196ZXJvKGRoLT5wdWJfa2V5KSkgeworICAgICAgICAgICAgU1NMZXJyKFNTTF9GX1NTTDNfR0VUX0tFWV9FWENIQU5HRSwgU1NMX1JfQkFEX0RIX1BVQl9LRVlfVkFMVUUpOworICAgICAgICAgICAgZ290byBmX2VycjsKKyAgICAgICAgfQorCiAjIGlmbmRlZiBPUEVOU1NMX05PX1JTQQogICAgICAgICBpZiAoYWxnX2EgJiBTU0xfYVJTQSkKICAgICAgICAgICAgIHBrZXkgPQpAQCAtMTg3MCwxNCArMTg4NiwyMCBAQAogICAgICAgICAgICAgcSA9IG1kX2J1ZjsKICAgICAgICAgICAgIGZvciAobnVtID0gMjsgbnVtID4gMDsgbnVtLS0pIHsKICAgICAgICAgICAgICAgICBFVlBfTURfQ1RYX3NldF9mbGFncygmbWRfY3R4LCBFVlBfTURfQ1RYX0ZMQUdfTk9OX0ZJUFNfQUxMT1cpOwotICAgICAgICAgICAgICAgIEVWUF9EaWdlc3RJbml0X2V4KCZtZF9jdHgsIChudW0gPT0gMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHMtPmN0eC0+bWQ1IDogcy0+Y3R4LT5zaGExLCBOVUxMKTsKLSAgICAgICAgICAgICAgICBFVlBfRGlnZXN0VXBkYXRlKCZtZF9jdHgsICYocy0+czMtPmNsaWVudF9yYW5kb21bMF0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NMM19SQU5ET01fU0laRSk7Ci0gICAgICAgICAgICAgICAgRVZQX0RpZ2VzdFVwZGF0ZSgmbWRfY3R4LCAmKHMtPnMzLT5zZXJ2ZXJfcmFuZG9tWzBdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTTDNfUkFORE9NX1NJWkUpOwotICAgICAgICAgICAgICAgIEVWUF9EaWdlc3RVcGRhdGUoJm1kX2N0eCwgcGFyYW0sIHBhcmFtX2xlbik7Ci0gICAgICAgICAgICAgICAgRVZQX0RpZ2VzdEZpbmFsX2V4KCZtZF9jdHgsIHEsICZzaXplKTsKKyAgICAgICAgICAgICAgICBpZiAoRVZQX0RpZ2VzdEluaXRfZXgoJm1kX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG51bSA9PSAyKSA/IHMtPmN0eC0+bWQ1IDogcy0+Y3R4LT5zaGExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA8PSAwCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBFVlBfRGlnZXN0VXBkYXRlKCZtZF9jdHgsICYocy0+czMtPmNsaWVudF9yYW5kb21bMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU0wzX1JBTkRPTV9TSVpFKSA8PSAwCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBFVlBfRGlnZXN0VXBkYXRlKCZtZF9jdHgsICYocy0+czMtPnNlcnZlcl9yYW5kb21bMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU0wzX1JBTkRPTV9TSVpFKSA8PSAwCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBFVlBfRGlnZXN0VXBkYXRlKCZtZF9jdHgsIHBhcmFtLCBwYXJhbV9sZW4pIDw9IDAKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVWUF9EaWdlc3RGaW5hbF9leCgmbWRfY3R4LCBxLCAmc2l6ZSkgPD0gMCkgeworICAgICAgICAgICAgICAgICAgICBTU0xlcnIoU1NMX0ZfU1NMM19HRVRfS0VZX0VYQ0hBTkdFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSX1JfSU5URVJOQUxfRVJST1IpOworICAgICAgICAgICAgICAgICAgICBhbCA9IFNTTF9BRF9JTlRFUk5BTF9FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgZ290byBmX2VycjsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcSArPSBzaXplOwogICAgICAgICAgICAgICAgIGogKz0gc2l6ZTsKICAgICAgICAgICAgIH0KQEAgLTE4OTYsMTIgKzE5MTgsMTYgQEAKICAgICAgICAgfSBlbHNlCiAjZW5kaWYKICAgICAgICAgewotICAgICAgICAgICAgRVZQX1ZlcmlmeUluaXRfZXgoJm1kX2N0eCwgbWQsIE5VTEwpOwotICAgICAgICAgICAgRVZQX1ZlcmlmeVVwZGF0ZSgmbWRfY3R4LCAmKHMtPnMzLT5jbGllbnRfcmFuZG9tWzBdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NMM19SQU5ET01fU0laRSk7Ci0gICAgICAgICAgICBFVlBfVmVyaWZ5VXBkYXRlKCZtZF9jdHgsICYocy0+czMtPnNlcnZlcl9yYW5kb21bMF0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU0wzX1JBTkRPTV9TSVpFKTsKLSAgICAgICAgICAgIEVWUF9WZXJpZnlVcGRhdGUoJm1kX2N0eCwgcGFyYW0sIHBhcmFtX2xlbik7CisgICAgICAgICAgICBpZiAoRVZQX1ZlcmlmeUluaXRfZXgoJm1kX2N0eCwgbWQsIE5VTEwpIDw9IDAKKyAgICAgICAgICAgICAgICAgICAgfHwgRVZQX1ZlcmlmeVVwZGF0ZSgmbWRfY3R4LCAmKHMtPnMzLT5jbGllbnRfcmFuZG9tWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU0wzX1JBTkRPTV9TSVpFKSA8PSAwCisgICAgICAgICAgICAgICAgICAgIHx8IEVWUF9WZXJpZnlVcGRhdGUoJm1kX2N0eCwgJihzLT5zMy0+c2VydmVyX3JhbmRvbVswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NMM19SQU5ET01fU0laRSkgPD0gMAorICAgICAgICAgICAgICAgICAgICB8fCBFVlBfVmVyaWZ5VXBkYXRlKCZtZF9jdHgsIHBhcmFtLCBwYXJhbV9sZW4pIDw9IDApIHsKKyAgICAgICAgICAgICAgICBhbCA9IFNTTF9BRF9JTlRFUk5BTF9FUlJPUjsKKyAgICAgICAgICAgICAgICBTU0xlcnIoU1NMX0ZfU1NMM19HRVRfS0VZX0VYQ0hBTkdFLCBFUlJfUl9FVlBfTElCKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZfZXJyOworICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKEVWUF9WZXJpZnlGaW5hbCgmbWRfY3R4LCBwLCAoaW50KW4sIHBrZXkpIDw9IDApIHsKICAgICAgICAgICAgICAgICAvKiBiYWQgc2lnbmF0dXJlICovCiAgICAgICAgICAgICAgICAgYWwgPSBTU0xfQURfREVDUllQVF9FUlJPUjsKQEAgLTIxMjEsNiArMjE0Nyw3IEBACiAgICAgbG9uZyBuOwogICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnA7CiAgICAgdW5zaWduZWQgY2hhciAqZDsKKyAgICB1bnNpZ25lZCBsb25nIHRpY2tldF9saWZldGltZV9oaW50OwogCiAgICAgbiA9IHMtPm1ldGhvZC0+c3NsX2dldF9tZXNzYWdlKHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTTDNfU1RfQ1JfU0VTU0lPTl9USUNLRVRfQSwKQEAgLTIxMzksNiArMjE2NiwxOSBAQAogCiAgICAgcCA9IGQgPSAodW5zaWduZWQgY2hhciAqKXMtPmluaXRfbXNnOwogCisgICAgbjJsKHAsIHRpY2tldF9saWZldGltZV9oaW50KTsKKyAgICBuMnMocCwgdGlja2xlbik7CisgICAgLyogdGlja2V0X2xpZmV0aW1lX2hpbnQgKyB0aWNrZXRfbGVuZ3RoICsgdGlja2V0ICovCisgICAgaWYgKHRpY2tsZW4gKyA2ICE9IG4pIHsKKyAgICAgICAgYWwgPSBTU0xfQURfREVDT0RFX0VSUk9SOworICAgICAgICBTU0xlcnIoU1NMX0ZfU1NMM19HRVRfTkVXX1NFU1NJT05fVElDS0VULCBTU0xfUl9MRU5HVEhfTUlTTUFUQ0gpOworICAgICAgICBnb3RvIGZfZXJyOworICAgIH0KKworICAgIC8qIFNlcnZlciBpcyBhbGxvd2VkIHRvIGNoYW5nZSBpdHMgbWluZCBhbmQgc2VuZCBhbiBlbXB0eSB0aWNrZXQuICovCisgICAgaWYgKHRpY2tsZW4gPT0gMCkKKyAgICAgICAgcmV0dXJuIDE7CisKICAgICBpZiAocy0+c2Vzc2lvbi0+c2Vzc2lvbl9pZF9sZW5ndGggPiAwKSB7CiAgICAgICAgIGludCBpID0gcy0+c2Vzc2lvbl9jdHgtPnNlc3Npb25fY2FjaGVfbW9kZTsKICAgICAgICAgU1NMX1NFU1NJT04gKm5ld19zZXNzOwpAQCAtMjE3MCwxNCArMjIxMCw2IEBACiAgICAgICAgIHMtPnNlc3Npb24gPSBuZXdfc2VzczsKICAgICB9CiAKLSAgICBuMmwocCwgcy0+c2Vzc2lvbi0+dGxzZXh0X3RpY2tfbGlmZXRpbWVfaGludCk7Ci0gICAgbjJzKHAsIHRpY2tsZW4pOwotICAgIC8qIHRpY2tldF9saWZldGltZV9oaW50ICsgdGlja2V0X2xlbmd0aCArIHRpY2tldCAqLwotICAgIGlmICh0aWNrbGVuICsgNiAhPSBuKSB7Ci0gICAgICAgIGFsID0gU1NMX0FEX0RFQ09ERV9FUlJPUjsKLSAgICAgICAgU1NMZXJyKFNTTF9GX1NTTDNfR0VUX05FV19TRVNTSU9OX1RJQ0tFVCwgU1NMX1JfTEVOR1RIX01JU01BVENIKTsKLSAgICAgICAgZ290byBmX2VycjsKLSAgICB9CiAgICAgaWYgKHMtPnNlc3Npb24tPnRsc2V4dF90aWNrKSB7CiAgICAgICAgIE9QRU5TU0xfZnJlZShzLT5zZXNzaW9uLT50bHNleHRfdGljayk7CiAgICAgICAgIHMtPnNlc3Npb24tPnRsc2V4dF90aWNrbGVuID0gMDsKQEAgLTIxODgsNiArMjIyMCw3IEBACiAgICAgICAgIGdvdG8gZXJyOwogICAgIH0KICAgICBPUEVOU1NMX3BvcnRfbWVtY3B5KHMtPnNlc3Npb24tPnRsc2V4dF90aWNrLCBwLCB0aWNrbGVuKTsKKyAgICBzLT5zZXNzaW9uLT50bHNleHRfdGlja19saWZldGltZV9oaW50ID0gdGlja2V0X2xpZmV0aW1lX2hpbnQ7CiAgICAgcy0+c2Vzc2lvbi0+dGxzZXh0X3RpY2tsZW4gPSB0aWNrbGVuOwogICAgIC8qCiAgICAgICogVGhlcmUgYXJlIHR3byB3YXlzIHRvIGRldGVjdCBhIHJlc3VtZWQgdGlja2V0IHNlc3Npb24uIE9uZSBpcyB0byBzZXQKQEAgLTIyMjUsMzcgKzIyNTgsNDQgQEAKICAgICBuID0gcy0+bWV0aG9kLT5zc2xfZ2V0X21lc3NhZ2UocywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NMM19TVF9DUl9DRVJUX1NUQVRVU19BLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU0wzX1NUX0NSX0NFUlRfU1RBVFVTX0IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTTDNfTVRfQ0VSVElGSUNBVEVfU1RBVFVTLCAxNjM4NCwgJm9rKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsIDE2Mzg0LCAmb2spOwogCiAgICAgaWYgKCFvaykKICAgICAgICAgcmV0dXJuICgoaW50KW4pOwotICAgIGlmIChuIDwgNCkgewotICAgICAgICAvKiBuZWVkIGF0IGxlYXN0IHN0YXR1cyB0eXBlICsgbGVuZ3RoICovCi0gICAgICAgIGFsID0gU1NMX0FEX0RFQ09ERV9FUlJPUjsKLSAgICAgICAgU1NMZXJyKFNTTF9GX1NTTDNfR0VUX0NFUlRfU1RBVFVTLCBTU0xfUl9MRU5HVEhfTUlTTUFUQ0gpOwotICAgICAgICBnb3RvIGZfZXJyOworCisgICAgaWYgKHMtPnMzLT50bXAubWVzc2FnZV90eXBlICE9IFNTTDNfTVRfQ0VSVElGSUNBVEVfU1RBVFVTKSB7CisgICAgICAgIC8qCisgICAgICAgICAqIFRoZSBDZXJ0aWZpY2F0ZVN0YXR1cyBtZXNzYWdlIGlzIG9wdGlvbmFsIGV2ZW4gaWYKKyAgICAgICAgICogdGxzZXh0X3N0YXR1c19leHBlY3RlZCBpcyBzZXQKKyAgICAgICAgICovCisgICAgICAgIHMtPnMzLT50bXAucmV1c2VfbWVzc2FnZSA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG4gPCA0KSB7CisgICAgICAgICAgICAvKiBuZWVkIGF0IGxlYXN0IHN0YXR1cyB0eXBlICsgbGVuZ3RoICovCisgICAgICAgICAgICBhbCA9IFNTTF9BRF9ERUNPREVfRVJST1I7CisgICAgICAgICAgICBTU0xlcnIoU1NMX0ZfU1NMM19HRVRfQ0VSVF9TVEFUVVMsIFNTTF9SX0xFTkdUSF9NSVNNQVRDSCk7CisgICAgICAgICAgICBnb3RvIGZfZXJyOworICAgICAgICB9CisgICAgICAgIHAgPSAodW5zaWduZWQgY2hhciAqKXMtPmluaXRfbXNnOworICAgICAgICBpZiAoKnArKyAhPSBUTFNFWFRfU1RBVFVTVFlQRV9vY3NwKSB7CisgICAgICAgICAgICBhbCA9IFNTTF9BRF9ERUNPREVfRVJST1I7CisgICAgICAgICAgICBTU0xlcnIoU1NMX0ZfU1NMM19HRVRfQ0VSVF9TVEFUVVMsIFNTTF9SX1VOU1VQUE9SVEVEX1NUQVRVU19UWVBFKTsKKyAgICAgICAgICAgIGdvdG8gZl9lcnI7CisgICAgICAgIH0KKyAgICAgICAgbjJsMyhwLCByZXNwbGVuKTsKKyAgICAgICAgaWYgKHJlc3BsZW4gKyA0ICE9IG4pIHsKKyAgICAgICAgICAgIGFsID0gU1NMX0FEX0RFQ09ERV9FUlJPUjsKKyAgICAgICAgICAgIFNTTGVycihTU0xfRl9TU0wzX0dFVF9DRVJUX1NUQVRVUywgU1NMX1JfTEVOR1RIX01JU01BVENIKTsKKyAgICAgICAgICAgIGdvdG8gZl9lcnI7CisgICAgICAgIH0KKyAgICAgICAgcy0+dGxzZXh0X29jc3BfcmVzcCA9IEJVRl9tZW1kdXAocCwgcmVzcGxlbik7CisgICAgICAgIGlmIChzLT50bHNleHRfb2NzcF9yZXNwID09IE5VTEwpIHsKKyAgICAgICAgICAgIGFsID0gU1NMX0FEX0lOVEVSTkFMX0VSUk9SOworICAgICAgICAgICAgU1NMZXJyKFNTTF9GX1NTTDNfR0VUX0NFUlRfU1RBVFVTLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgICAgICAgICBnb3RvIGZfZXJyOworICAgICAgICB9CisgICAgICAgIHMtPnRsc2V4dF9vY3NwX3Jlc3BsZW4gPSByZXNwbGVuOwogICAgIH0KLSAgICBwID0gKHVuc2lnbmVkIGNoYXIgKilzLT5pbml0X21zZzsKLSAgICBpZiAoKnArKyAhPSBUTFNFWFRfU1RBVFVTVFlQRV9vY3NwKSB7Ci0gICAgICAgIGFsID0gU1NMX0FEX0RFQ09ERV9FUlJPUjsKLSAgICAgICAgU1NMZXJyKFNTTF9GX1NTTDNfR0VUX0NFUlRfU1RBVFVTLCBTU0xfUl9VTlNVUFBPUlRFRF9TVEFUVVNfVFlQRSk7Ci0gICAgICAgIGdvdG8gZl9lcnI7Ci0gICAgfQotICAgIG4ybDMocCwgcmVzcGxlbik7Ci0gICAgaWYgKHJlc3BsZW4gKyA0ICE9IG4pIHsKLSAgICAgICAgYWwgPSBTU0xfQURfREVDT0RFX0VSUk9SOwotICAgICAgICBTU0xlcnIoU1NMX0ZfU1NMM19HRVRfQ0VSVF9TVEFUVVMsIFNTTF9SX0xFTkdUSF9NSVNNQVRDSCk7Ci0gICAgICAgIGdvdG8gZl9lcnI7Ci0gICAgfQotICAgIGlmIChzLT50bHNleHRfb2NzcF9yZXNwKQotICAgICAgICBPUEVOU1NMX2ZyZWUocy0+dGxzZXh0X29jc3BfcmVzcCk7Ci0gICAgcy0+dGxzZXh0X29jc3BfcmVzcCA9IEJVRl9tZW1kdXAocCwgcmVzcGxlbik7Ci0gICAgaWYgKCFzLT50bHNleHRfb2NzcF9yZXNwKSB7Ci0gICAgICAgIGFsID0gU1NMX0FEX0lOVEVSTkFMX0VSUk9SOwotICAgICAgICBTU0xlcnIoU1NMX0ZfU1NMM19HRVRfQ0VSVF9TVEFUVVMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKLSAgICAgICAgZ290byBmX2VycjsKLSAgICB9Ci0gICAgcy0+dGxzZXh0X29jc3BfcmVzcGxlbiA9IHJlc3BsZW47CiAgICAgaWYgKHMtPmN0eC0+dGxzZXh0X3N0YXR1c19jYikgewogICAgICAgICBpbnQgcmV0OwogICAgICAgICByZXQgPSBzLT5jdHgtPnRsc2V4dF9zdGF0dXNfY2Iocywgcy0+Y3R4LT50bHNleHRfc3RhdHVzX2FyZyk7CkBAIC0yMzU3LDYgKzIzOTcsNyBAQAogICAgICAgICAgICAgICAgICAgICB8fCAocGtleS0+cGtleS5yc2EgPT0gTlVMTCkpIHsKICAgICAgICAgICAgICAgICAgICAgU1NMZXJyKFNTTF9GX1NTTDNfU0VORF9DTElFTlRfS0VZX0VYQ0hBTkdFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSX1JfSU5URVJOQUxfRVJST1IpOworICAgICAgICAgICAgICAgICAgICBFVlBfUEtFWV9mcmVlKHBrZXkpOwogICAgICAgICAgICAgICAgICAgICBnb3RvIGVycjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcnNhID0gcGtleS0+cGtleS5yc2E7CkBAIC0yODA0LDYgKzI4NDUsMTEgQEAKIAogICAgICAgICAgICAgcGtleV9jdHggPSBFVlBfUEtFWV9DVFhfbmV3KHB1Yl9rZXkgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg1MDlfZ2V0X3B1YmtleShwZWVyX2NlcnQpLCBOVUxMKTsKKyAgICAgICAgICAgIGlmIChwa2V5X2N0eCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgU1NMZXJyKFNTTF9GX1NTTDNfU0VORF9DTElFTlRfS0VZX0VYQ0hBTkdFLAorICAgICAgICAgICAgICAgICAgICAgICBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogSWYgd2UgaGF2ZSBzZW5kIGEgY2VydGlmaWNhdGUsIGFuZCBjZXJ0aWZpY2F0ZSBrZXkKICAgICAgICAgICAgICAqCkBAIC0yODEzLDEwICsyODU5LDEzIEBACiAKICAgICAgICAgICAgIC8qIE90aGVyd2lzZSwgZ2VuZXJhdGUgZXBoZW1lcmFsIGtleSBwYWlyICovCiAKLSAgICAgICAgICAgIEVWUF9QS0VZX2VuY3J5cHRfaW5pdChwa2V5X2N0eCk7Ci0gICAgICAgICAgICAvKiBHZW5lcmF0ZSBzZXNzaW9uIGtleSAqLwotICAgICAgICAgICAgaWYgKFJBTkRfYnl0ZXMocHJlbWFzdGVyX3NlY3JldCwgMzIpIDw9IDApIHsKKyAgICAgICAgICAgIGlmIChwa2V5X2N0eCA9PSBOVUxMCisgICAgICAgICAgICAgICAgICAgIHx8IEVWUF9QS0VZX2VuY3J5cHRfaW5pdChwa2V5X2N0eCkgPD0gMAorICAgICAgICAgICAgICAgICAgICAvKiBHZW5lcmF0ZSBzZXNzaW9uIGtleSAqLworICAgICAgICAgICAgICAgICAgICB8fCBSQU5EX2J5dGVzKHByZW1hc3Rlcl9zZWNyZXQsIDMyKSA8PSAwKSB7CiAgICAgICAgICAgICAgICAgRVZQX1BLRVlfQ1RYX2ZyZWUocGtleV9jdHgpOworICAgICAgICAgICAgICAgIFNTTGVycihTU0xfRl9TU0wzX1NFTkRfQ0xJRU5UX0tFWV9FWENIQU5HRSwKKyAgICAgICAgICAgICAgICAgICAgICAgRVJSX1JfSU5URVJOQUxfRVJST1IpOwogICAgICAgICAgICAgICAgIGdvdG8gZXJyOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLyoKQEAgLTI4MzcsMTMgKzI4ODYsMTggQEAKICAgICAgICAgICAgICAqIGRhdGEKICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgdWttX2hhc2ggPSBFVlBfTURfQ1RYX2NyZWF0ZSgpOwotICAgICAgICAgICAgRVZQX0RpZ2VzdEluaXQodWttX2hhc2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBFVlBfZ2V0X2RpZ2VzdGJ5bmlkKE5JRF9pZF9Hb3N0UjM0MTFfOTQpKTsKLSAgICAgICAgICAgIEVWUF9EaWdlc3RVcGRhdGUodWttX2hhc2gsIHMtPnMzLT5jbGllbnRfcmFuZG9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU0wzX1JBTkRPTV9TSVpFKTsKLSAgICAgICAgICAgIEVWUF9EaWdlc3RVcGRhdGUodWttX2hhc2gsIHMtPnMzLT5zZXJ2ZXJfcmFuZG9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU0wzX1JBTkRPTV9TSVpFKTsKLSAgICAgICAgICAgIEVWUF9EaWdlc3RGaW5hbF9leCh1a21faGFzaCwgc2hhcmVkX3VrbSwgJm1kX2xlbik7CisgICAgICAgICAgICBpZiAoRVZQX0RpZ2VzdEluaXQodWttX2hhc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZQX2dldF9kaWdlc3RieW5pZChOSURfaWRfR29zdFIzNDExXzk0KSkgPD0gMAorICAgICAgICAgICAgICAgICAgICB8fCBFVlBfRGlnZXN0VXBkYXRlKHVrbV9oYXNoLCBzLT5zMy0+Y2xpZW50X3JhbmRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU0wzX1JBTkRPTV9TSVpFKSA8PSAwCisgICAgICAgICAgICAgICAgICAgIHx8IEVWUF9EaWdlc3RVcGRhdGUodWttX2hhc2gsIHMtPnMzLT5zZXJ2ZXJfcmFuZG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTTDNfUkFORE9NX1NJWkUpIDw9IDAKKyAgICAgICAgICAgICAgICAgICAgfHwgRVZQX0RpZ2VzdEZpbmFsX2V4KHVrbV9oYXNoLCBzaGFyZWRfdWttLCAmbWRfbGVuKSA8PSAwKSB7CisgICAgICAgICAgICAgICAgRVZQX01EX0NUWF9kZXN0cm95KHVrbV9oYXNoKTsKKyAgICAgICAgICAgICAgICBTU0xlcnIoU1NMX0ZfU1NMM19TRU5EX0NMSUVOVF9LRVlfRVhDSEFOR0UsCisgICAgICAgICAgICAgICAgICAgICAgIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIEVWUF9NRF9DVFhfZGVzdHJveSh1a21faGFzaCk7CiAgICAgICAgICAgICBpZiAoRVZQX1BLRVlfQ1RYX2N0cmwKICAgICAgICAgICAgICAgICAocGtleV9jdHgsIC0xLCBFVlBfUEtFWV9PUF9FTkNSWVBULCBFVlBfUEtFWV9DVFJMX1NFVF9JViwgOCwKQEAgLTI4NTksNyArMjkxMyw3IEBACiAgICAgICAgICAgICAqKHArKykgPSBWX0FTTjFfU0VRVUVOQ0UgfCBWX0FTTjFfQ09OU1RSVUNURUQ7CiAgICAgICAgICAgICBtc2dsZW4gPSAyNTU7CiAgICAgICAgICAgICBpZiAoRVZQX1BLRVlfZW5jcnlwdChwa2V5X2N0eCwgdG1wLCAmbXNnbGVuLCBwcmVtYXN0ZXJfc2VjcmV0LCAzMikKLSAgICAgICAgICAgICAgICA8IDApIHsKKyAgICAgICAgICAgICAgICA8PSAwKSB7CiAgICAgICAgICAgICAgICAgU1NMZXJyKFNTTF9GX1NTTDNfU0VORF9DTElFTlRfS0VZX0VYQ0hBTkdFLAogICAgICAgICAgICAgICAgICAgICAgICBTU0xfUl9MSUJSQVJZX0JVRyk7CiAgICAgICAgICAgICAgICAgZ290byBlcnI7CkBAIC0zMDYwLDcgKzMxMTQsMTAgQEAKICAgICAgICAgcGtleSA9IHMtPmNlcnQtPmtleS0+cHJpdmF0ZWtleTsKIC8qIENyZWF0ZSBjb250ZXh0IGZyb20ga2V5IGFuZCB0ZXN0IGlmIHNoYTEgaXMgYWxsb3dlZCBhcyBkaWdlc3QgKi8KICAgICAgICAgcGN0eCA9IEVWUF9QS0VZX0NUWF9uZXcocGtleSwgTlVMTCk7Ci0gICAgICAgIEVWUF9QS0VZX3NpZ25faW5pdChwY3R4KTsKKyAgICAgICAgaWYgKHBjdHggPT0gTlVMTCB8fCBFVlBfUEtFWV9zaWduX2luaXQocGN0eCkgPD0gMCkgeworICAgICAgICAgICAgU1NMZXJyKFNTTF9GX1NTTDNfU0VORF9DTElFTlRfVkVSSUZZLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgfQogICAgICAgICBpZiAoRVZQX1BLRVlfQ1RYX3NldF9zaWduYXR1cmVfbWQocGN0eCwgRVZQX3NoYTEoKSkgPiAwKSB7CiAgICAgICAgICAgICBpZiAoVExTMV9nZXRfdmVyc2lvbihzKSA8IFRMUzFfMl9WRVJTSU9OKQogICAgICAgICAgICAgICAgIHMtPm1ldGhvZC0+c3NsM19lbmMtPmNlcnRfdmVyaWZ5X21hYyhzLApAQCAtMzE5Nyw3ICszMjU0LDYgQEAKICAgICAgICAgICogSWYgd2UgZ2V0IGFuIGVycm9yLCB3ZSBuZWVkIHRvIHNzbC0+cndzdGF0ZT1TU0xfWDUwOV9MT09LVVA7CiAgICAgICAgICAqIHJldHVybigtMSk7IFdlIHRoZW4gZ2V0IHJldGllZCBsYXRlcgogICAgICAgICAgKi8KLSAgICAgICAgaSA9IDA7CiAgICAgICAgIGkgPSBzc2xfZG9fY2xpZW50X2NlcnRfY2IocywgJng1MDksICZwa2V5KTsKICAgICAgICAgaWYgKGkgPCAwKSB7CiAgICAgICAgICAgICBzLT5yd3N0YXRlID0gU1NMX1g1MDlfTE9PS1VQOwpAQCAtMzM2NCw3ICszNDIwLDcgQEAKICAgICAvKiBDaGVjayBESEUgb25seTogc3RhdGljIERIIG5vdCBpbXBsZW1lbnRlZC4gKi8KICAgICBpZiAoYWxnX2sgJiBTU0xfa0VESCkgewogICAgICAgICBpbnQgZGhfc2l6ZSA9IEJOX251bV9iaXRzKGRoLT5wKTsKLSAgICAgICAgaWYgKCghU1NMX0NfSVNfRVhQT1JUKHMtPnMzLT50bXAubmV3X2NpcGhlcikgJiYgZGhfc2l6ZSA8IDc2OCkKKyAgICAgICAgaWYgKCghU1NMX0NfSVNfRVhQT1JUKHMtPnMzLT50bXAubmV3X2NpcGhlcikgJiYgZGhfc2l6ZSA8IDEwMjQpCiAgICAgICAgICAgICB8fCAoU1NMX0NfSVNfRVhQT1JUKHMtPnMzLT50bXAubmV3X2NpcGhlcikgJiYgZGhfc2l6ZSA8IDUxMikpIHsKICAgICAgICAgICAgIFNTTGVycihTU0xfRl9TU0wzX0NIRUNLX0NFUlRfQU5EX0FMR09SSVRITSwgU1NMX1JfREhfS0VZX1RPT19TTUFMTCk7CiAgICAgICAgICAgICBnb3RvIGZfZXJyOwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9zc2wvczNfZW5jLmMgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL3NzbC9zM19lbmMuYwppbmRleCAxYzgwMGUxLi41OTdkYmI5IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL3NzbC9zM19lbmMuYworKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL3NzbC9zM19lbmMuYwpAQCAtMjU2LDcgKzI1NiwxMCBAQAogICAgICAgICAgICAgRVZQX0NJUEhFUl9DVFhfaW5pdChzLT5lbmNfcmVhZF9jdHgpOwogICAgICAgICBkZCA9IHMtPmVuY19yZWFkX2N0eDsKIAotICAgICAgICBzc2xfcmVwbGFjZV9oYXNoKCZzLT5yZWFkX2hhc2gsIG0pOworICAgICAgICBpZiAoc3NsX3JlcGxhY2VfaGFzaCgmcy0+cmVhZF9oYXNoLCBtKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgU1NMZXJyKFNTTF9GX1NTTDNfQ0hBTkdFX0NJUEhFUl9TVEFURSwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworICAgICAgICAgICAgICAgIGdvdG8gZXJyMjsKKyAgICAgICAgfQogI2lmbmRlZiBPUEVOU1NMX05PX0NPTVAKICAgICAgICAgLyogQ09NUFJFU1MgKi8KICAgICAgICAgaWYgKHMtPmV4cGFuZCAhPSBOVUxMKSB7CkBAIC0yOTEsNyArMjk0LDEwIEBACiAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIEVWUF9DSVBIRVJfQ1RYX2luaXQocy0+ZW5jX3dyaXRlX2N0eCk7CiAgICAgICAgIGRkID0gcy0+ZW5jX3dyaXRlX2N0eDsKLSAgICAgICAgc3NsX3JlcGxhY2VfaGFzaCgmcy0+d3JpdGVfaGFzaCwgbSk7CisgICAgICAgIGlmIChzc2xfcmVwbGFjZV9oYXNoKCZzLT53cml0ZV9oYXNoLCBtKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgU1NMZXJyKFNTTF9GX1NTTDNfQ0hBTkdFX0NJUEhFUl9TVEFURSwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworICAgICAgICAgICAgICAgIGdvdG8gZXJyMjsKKyAgICAgICAgfQogI2lmbmRlZiBPUEVOU1NMX05PX0NPTVAKICAgICAgICAgLyogQ09NUFJFU1MgKi8KICAgICAgICAgaWYgKHMtPmNvbXByZXNzICE9IE5VTEwpIHsKQEAgLTY3NywxOSArNjgzLDIxIEBACiAgICAgICAgIHJldHVybiAwOwogCiAgICAgbnBhZCA9ICg0OCAvIG4pICogbjsKLSAgICBpZiAoc2VuZGVyICE9IE5VTEwpCi0gICAgICAgIEVWUF9EaWdlc3RVcGRhdGUoJmN0eCwgc2VuZGVyLCBsZW4pOwotICAgIEVWUF9EaWdlc3RVcGRhdGUoJmN0eCwgcy0+c2Vzc2lvbi0+bWFzdGVyX2tleSwKLSAgICAgICAgICAgICAgICAgICAgIHMtPnNlc3Npb24tPm1hc3Rlcl9rZXlfbGVuZ3RoKTsKLSAgICBFVlBfRGlnZXN0VXBkYXRlKCZjdHgsIHNzbDNfcGFkXzEsIG5wYWQpOwotICAgIEVWUF9EaWdlc3RGaW5hbF9leCgmY3R4LCBtZF9idWYsICZpKTsKKyAgICBpZiAoKHNlbmRlciAhPSBOVUxMICYmIEVWUF9EaWdlc3RVcGRhdGUoJmN0eCwgc2VuZGVyLCBsZW4pIDw9IDApCisgICAgICAgICAgICB8fCBFVlBfRGlnZXN0VXBkYXRlKCZjdHgsIHMtPnNlc3Npb24tPm1hc3Rlcl9rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnNlc3Npb24tPm1hc3Rlcl9rZXlfbGVuZ3RoKSA8PSAwCisgICAgICAgICAgICB8fCBFVlBfRGlnZXN0VXBkYXRlKCZjdHgsIHNzbDNfcGFkXzEsIG5wYWQpIDw9IDAKKyAgICAgICAgICAgIHx8IEVWUF9EaWdlc3RGaW5hbF9leCgmY3R4LCBtZF9idWYsICZpKSA8PSAwCiAKLSAgICBFVlBfRGlnZXN0SW5pdF9leCgmY3R4LCBFVlBfTURfQ1RYX21kKCZjdHgpLCBOVUxMKTsKLSAgICBFVlBfRGlnZXN0VXBkYXRlKCZjdHgsIHMtPnNlc3Npb24tPm1hc3Rlcl9rZXksCi0gICAgICAgICAgICAgICAgICAgICBzLT5zZXNzaW9uLT5tYXN0ZXJfa2V5X2xlbmd0aCk7Ci0gICAgRVZQX0RpZ2VzdFVwZGF0ZSgmY3R4LCBzc2wzX3BhZF8yLCBucGFkKTsKLSAgICBFVlBfRGlnZXN0VXBkYXRlKCZjdHgsIG1kX2J1ZiwgaSk7Ci0gICAgRVZQX0RpZ2VzdEZpbmFsX2V4KCZjdHgsIHAsICZyZXQpOworICAgICAgICAgICAgfHwgRVZQX0RpZ2VzdEluaXRfZXgoJmN0eCwgRVZQX01EX0NUWF9tZCgmY3R4KSwgTlVMTCkgPD0gMAorICAgICAgICAgICAgfHwgRVZQX0RpZ2VzdFVwZGF0ZSgmY3R4LCBzLT5zZXNzaW9uLT5tYXN0ZXJfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zZXNzaW9uLT5tYXN0ZXJfa2V5X2xlbmd0aCkgPD0gMAorICAgICAgICAgICAgfHwgRVZQX0RpZ2VzdFVwZGF0ZSgmY3R4LCBzc2wzX3BhZF8yLCBucGFkKSA8PSAwCisgICAgICAgICAgICB8fCBFVlBfRGlnZXN0VXBkYXRlKCZjdHgsIG1kX2J1ZiwgaSkgPD0gMAorICAgICAgICAgICAgfHwgRVZQX0RpZ2VzdEZpbmFsX2V4KCZjdHgsIHAsICZyZXQpIDw9IDApIHsKKyAgICAgICAgU1NMZXJyKFNTTF9GX1NTTDNfSEFORFNIQUtFX01BQywgRVJSX1JfSU5URVJOQUxfRVJST1IpOworICAgICAgICByZXQgPSAwOworICAgIH0KIAogICAgIEVWUF9NRF9DVFhfY2xlYW51cCgmY3R4KTsKIApAQCAtNzYxLDMzICs3NjksMzYgQEAKICAgICAgICAgaGVhZGVyW2orK10gPSByZWMtPmxlbmd0aCAmIDB4ZmY7CiAKICAgICAgICAgLyogRmluYWwgcGFyYW0gPT0gaXMgU1NMdjMgKi8KLSAgICAgICAgc3NsM19jYmNfZGlnZXN0X3JlY29yZChoYXNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1kLCAmbWRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIsIHJlYy0+aW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjLT5sZW5ndGggKyBtZF9zaXplLCBvcmlnX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNfc2VjLCBtZF9zaXplLCAxKTsKKyAgICAgICAgaWYgKHNzbDNfY2JjX2RpZ2VzdF9yZWNvcmQoaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWQsICZtZF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIsIHJlYy0+aW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYy0+bGVuZ3RoICsgbWRfc2l6ZSwgb3JpZ19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY19zZWMsIG1kX3NpemUsIDEpIDw9IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgfSBlbHNlIHsKICAgICAgICAgdW5zaWduZWQgaW50IG1kX3NpemVfdTsKICAgICAgICAgLyogQ2hvcCB0aGUgZGlnZXN0IG9mZiB0aGUgZW5kIDotKSAqLwogICAgICAgICBFVlBfTURfQ1RYX2luaXQoJm1kX2N0eCk7CiAKLSAgICAgICAgRVZQX01EX0NUWF9jb3B5X2V4KCZtZF9jdHgsIGhhc2gpOwotICAgICAgICBFVlBfRGlnZXN0VXBkYXRlKCZtZF9jdHgsIG1hY19zZWMsIG1kX3NpemUpOwotICAgICAgICBFVlBfRGlnZXN0VXBkYXRlKCZtZF9jdHgsIHNzbDNfcGFkXzEsIG5wYWQpOwotICAgICAgICBFVlBfRGlnZXN0VXBkYXRlKCZtZF9jdHgsIHNlcSwgOCk7CiAgICAgICAgIHJlY19jaGFyID0gcmVjLT50eXBlOwotICAgICAgICBFVlBfRGlnZXN0VXBkYXRlKCZtZF9jdHgsICZyZWNfY2hhciwgMSk7CiAgICAgICAgIHAgPSBtZDsKICAgICAgICAgczJuKHJlYy0+bGVuZ3RoLCBwKTsKLSAgICAgICAgRVZQX0RpZ2VzdFVwZGF0ZSgmbWRfY3R4LCBtZCwgMik7Ci0gICAgICAgIEVWUF9EaWdlc3RVcGRhdGUoJm1kX2N0eCwgcmVjLT5pbnB1dCwgcmVjLT5sZW5ndGgpOwotICAgICAgICBFVlBfRGlnZXN0RmluYWxfZXgoJm1kX2N0eCwgbWQsIE5VTEwpOwotCi0gICAgICAgIEVWUF9NRF9DVFhfY29weV9leCgmbWRfY3R4LCBoYXNoKTsKLSAgICAgICAgRVZQX0RpZ2VzdFVwZGF0ZSgmbWRfY3R4LCBtYWNfc2VjLCBtZF9zaXplKTsKLSAgICAgICAgRVZQX0RpZ2VzdFVwZGF0ZSgmbWRfY3R4LCBzc2wzX3BhZF8yLCBucGFkKTsKLSAgICAgICAgRVZQX0RpZ2VzdFVwZGF0ZSgmbWRfY3R4LCBtZCwgbWRfc2l6ZSk7Ci0gICAgICAgIEVWUF9EaWdlc3RGaW5hbF9leCgmbWRfY3R4LCBtZCwgJm1kX3NpemVfdSk7CisgICAgICAgIGlmIChFVlBfTURfQ1RYX2NvcHlfZXgoJm1kX2N0eCwgaGFzaCkgPD0gMAorICAgICAgICAgICAgICAgIHx8IEVWUF9EaWdlc3RVcGRhdGUoJm1kX2N0eCwgbWFjX3NlYywgbWRfc2l6ZSkgPD0gMAorICAgICAgICAgICAgICAgIHx8IEVWUF9EaWdlc3RVcGRhdGUoJm1kX2N0eCwgc3NsM19wYWRfMSwgbnBhZCkgPD0gMAorICAgICAgICAgICAgICAgIHx8IEVWUF9EaWdlc3RVcGRhdGUoJm1kX2N0eCwgc2VxLCA4KSA8PSAwCisgICAgICAgICAgICAgICAgfHwgRVZQX0RpZ2VzdFVwZGF0ZSgmbWRfY3R4LCAmcmVjX2NoYXIsIDEpIDw9IDAKKyAgICAgICAgICAgICAgICB8fCBFVlBfRGlnZXN0VXBkYXRlKCZtZF9jdHgsIG1kLCAyKSA8PSAwCisgICAgICAgICAgICAgICAgfHwgRVZQX0RpZ2VzdFVwZGF0ZSgmbWRfY3R4LCByZWMtPmlucHV0LCByZWMtPmxlbmd0aCkgPD0gMAorICAgICAgICAgICAgICAgIHx8IEVWUF9EaWdlc3RGaW5hbF9leCgmbWRfY3R4LCBtZCwgTlVMTCkgPD0gMAorICAgICAgICAgICAgICAgIHx8IEVWUF9NRF9DVFhfY29weV9leCgmbWRfY3R4LCBoYXNoKSA8PSAwCisgICAgICAgICAgICAgICAgfHwgRVZQX0RpZ2VzdFVwZGF0ZSgmbWRfY3R4LCBtYWNfc2VjLCBtZF9zaXplKSA8PSAwCisgICAgICAgICAgICAgICAgfHwgRVZQX0RpZ2VzdFVwZGF0ZSgmbWRfY3R4LCBzc2wzX3BhZF8yLCBucGFkKSA8PSAwCisgICAgICAgICAgICAgICAgfHwgRVZQX0RpZ2VzdFVwZGF0ZSgmbWRfY3R4LCBtZCwgbWRfc2l6ZSkgPD0gMAorICAgICAgICAgICAgICAgIHx8IEVWUF9EaWdlc3RGaW5hbF9leCgmbWRfY3R4LCBtZCwgJm1kX3NpemVfdSkgPD0gMCkgeworICAgICAgICAgICAgRVZQX01EX0NUWF9jbGVhbnVwKCZtZF9jdHgpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CiAgICAgICAgIG1kX3NpemUgPSBtZF9zaXplX3U7CiAKICAgICAgICAgRVZQX01EX0NUWF9jbGVhbnVwKCZtZF9jdHgpOwpAQCAtODI5LDE3ICs4NDAsMjQgQEAKIAogICAgIEVWUF9NRF9DVFhfaW5pdCgmY3R4KTsKICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0gICAgICAgIEVWUF9EaWdlc3RJbml0X2V4KCZjdHgsIHMtPmN0eC0+c2hhMSwgTlVMTCk7Ci0gICAgICAgIEVWUF9EaWdlc3RVcGRhdGUoJmN0eCwgc2FsdFtpXSwgT1BFTlNTTF9wb3J0X3N0cmxlbigoY29uc3QgY2hhciAqKXNhbHRbaV0pKTsKLSAgICAgICAgRVZQX0RpZ2VzdFVwZGF0ZSgmY3R4LCBwLCBsZW4pOwotICAgICAgICBFVlBfRGlnZXN0VXBkYXRlKCZjdHgsICYocy0+czMtPmNsaWVudF9yYW5kb21bMF0pLCBTU0wzX1JBTkRPTV9TSVpFKTsKLSAgICAgICAgRVZQX0RpZ2VzdFVwZGF0ZSgmY3R4LCAmKHMtPnMzLT5zZXJ2ZXJfcmFuZG9tWzBdKSwgU1NMM19SQU5ET01fU0laRSk7Ci0gICAgICAgIEVWUF9EaWdlc3RGaW5hbF9leCgmY3R4LCBidWYsICZuKTsKKyAgICAgICAgaWYgKEVWUF9EaWdlc3RJbml0X2V4KCZjdHgsIHMtPmN0eC0+c2hhMSwgTlVMTCkgPD0gMAorICAgICAgICAgICAgICAgIHx8IEVWUF9EaWdlc3RVcGRhdGUoJmN0eCwgc2FsdFtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QRU5TU0xfcG9ydF9zdHJsZW4oKGNvbnN0IGNoYXIgKilzYWx0W2ldKSkgPD0gMAorICAgICAgICAgICAgICAgIHx8IEVWUF9EaWdlc3RVcGRhdGUoJmN0eCwgcCwgbGVuKSA8PSAwCisgICAgICAgICAgICAgICAgfHwgRVZQX0RpZ2VzdFVwZGF0ZSgmY3R4LCAmKHMtPnMzLT5jbGllbnRfcmFuZG9tWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTTDNfUkFORE9NX1NJWkUpIDw9IDAKKyAgICAgICAgICAgICAgICB8fCBFVlBfRGlnZXN0VXBkYXRlKCZjdHgsICYocy0+czMtPnNlcnZlcl9yYW5kb21bMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NMM19SQU5ET01fU0laRSkgPD0gMAorICAgICAgICAgICAgICAgIHx8IEVWUF9EaWdlc3RGaW5hbF9leCgmY3R4LCBidWYsICZuKSA8PSAwCiAKLSAgICAgICAgRVZQX0RpZ2VzdEluaXRfZXgoJmN0eCwgcy0+Y3R4LT5tZDUsIE5VTEwpOwotICAgICAgICBFVlBfRGlnZXN0VXBkYXRlKCZjdHgsIHAsIGxlbik7Ci0gICAgICAgIEVWUF9EaWdlc3RVcGRhdGUoJmN0eCwgYnVmLCBuKTsKLSAgICAgICAgRVZQX0RpZ2VzdEZpbmFsX2V4KCZjdHgsIG91dCwgJm4pOworICAgICAgICAgICAgICAgIHx8IEVWUF9EaWdlc3RJbml0X2V4KCZjdHgsIHMtPmN0eC0+bWQ1LCBOVUxMKSA8PSAwCisgICAgICAgICAgICAgICAgfHwgRVZQX0RpZ2VzdFVwZGF0ZSgmY3R4LCBwLCBsZW4pIDw9IDAKKyAgICAgICAgICAgICAgICB8fCBFVlBfRGlnZXN0VXBkYXRlKCZjdHgsIGJ1ZiwgbikgPD0gMAorICAgICAgICAgICAgICAgIHx8IEVWUF9EaWdlc3RGaW5hbF9leCgmY3R4LCBvdXQsICZuKSA8PSAwKSB7CisgICAgICAgICAgICBTU0xlcnIoU1NMX0ZfU1NMM19HRU5FUkFURV9NQVNURVJfU0VDUkVULCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisgICAgICAgICAgICByZXQgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KICAgICAgICAgb3V0ICs9IG47CiAgICAgICAgIHJldCArPSBuOwogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvc3NsL3MzX2xpYi5jIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9zc2wvczNfbGliLmMKaW5kZXggNzM2NzRmZC4uNjQ3ZDhkYSAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9zc2wvczNfbGliLmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9zc2wvczNfbGliLmMKQEAgLTI5NTgsNyArMjk1OCw3IEBACiAKIHZvaWQgc3NsM19mcmVlKFNTTCAqcykKIHsKLSAgICBpZiAocyA9PSBOVUxMKQorICAgIGlmIChzID09IE5VTEwgfHwgcy0+czMgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuOwogCiAjaWZkZWYgVExTRVhUX1RZUEVfb3BhcXVlX3ByZl9pbnB1dApAQCAtMzE2NywxMyArMzE2Nyw2IEBACiAgICAgICAgICAgICAgICAgU1NMZXJyKFNTTF9GX1NTTDNfQ1RSTCwgRVJSX1JfREhfTElCKTsKICAgICAgICAgICAgICAgICByZXR1cm4gKHJldCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIShzLT5vcHRpb25zICYgU1NMX09QX1NJTkdMRV9ESF9VU0UpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFESF9nZW5lcmF0ZV9rZXkoZGgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIERIX2ZyZWUoZGgpOwotICAgICAgICAgICAgICAgICAgICBTU0xlcnIoU1NMX0ZfU1NMM19DVFJMLCBFUlJfUl9ESF9MSUIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHJldCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHMtPmNlcnQtPmRoX3RtcCAhPSBOVUxMKQogICAgICAgICAgICAgICAgIERIX2ZyZWUocy0+Y2VydC0+ZGhfdG1wKTsKICAgICAgICAgICAgIHMtPmNlcnQtPmRoX3RtcCA9IGRoOwpAQCAtMzIyNCw2ICszMjE3LDggQEAKICNpZm5kZWYgT1BFTlNTTF9OT19UTFNFWFQKICAgICBjYXNlIFNTTF9DVFJMX1NFVF9UTFNFWFRfSE9TVE5BTUU6CiAgICAgICAgIGlmIChsYXJnID09IFRMU0VYVF9OQU1FVFlQRV9ob3N0X25hbWUpIHsKKyAgICAgICAgICAgIHNpemVfdCBsZW47CisKICAgICAgICAgICAgIGlmIChzLT50bHNleHRfaG9zdG5hbWUgIT0gTlVMTCkKICAgICAgICAgICAgICAgICBPUEVOU1NMX2ZyZWUocy0+dGxzZXh0X2hvc3RuYW1lKTsKICAgICAgICAgICAgIHMtPnRsc2V4dF9ob3N0bmFtZSA9IE5VTEw7CkBAIC0zMjMxLDcgKzMyMjYsOCBAQAogICAgICAgICAgICAgcmV0ID0gMTsKICAgICAgICAgICAgIGlmIChwYXJnID09IE5VTEwpCiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBpZiAoT1BFTlNTTF9wb3J0X3N0cmxlbigoY2hhciAqKXBhcmcpID4gVExTRVhUX01BWExFTl9ob3N0X25hbWUpIHsKKyAgICAgICAgICAgIGxlbiA9IE9QRU5TU0xfcG9ydF9zdHJsZW4oKGNoYXIgKilwYXJnKTsKKyAgICAgICAgICAgIGlmIChsZW4gPT0gMCB8fCBsZW4gPiBUTFNFWFRfTUFYTEVOX2hvc3RfbmFtZSkgewogICAgICAgICAgICAgICAgIFNTTGVycihTU0xfRl9TU0wzX0NUUkwsIFNTTF9SX1NTTDNfRVhUX0lOVkFMSURfU0VSVkVSTkFNRSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICB9CkBAIC0zNDgyLDEzICszNDc4LDYgQEAKICAgICAgICAgICAgICAgICBTU0xlcnIoU1NMX0ZfU1NMM19DVFhfQ1RSTCwgRVJSX1JfREhfTElCKTsKICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghKGN0eC0+b3B0aW9ucyAmIFNTTF9PUF9TSU5HTEVfREhfVVNFKSkgewotICAgICAgICAgICAgICAgIGlmICghREhfZ2VuZXJhdGVfa2V5KG5ldykpIHsKLSAgICAgICAgICAgICAgICAgICAgU1NMZXJyKFNTTF9GX1NTTDNfQ1RYX0NUUkwsIEVSUl9SX0RIX0xJQik7Ci0gICAgICAgICAgICAgICAgICAgIERIX2ZyZWUobmV3KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGNlcnQtPmRoX3RtcCAhPSBOVUxMKQogICAgICAgICAgICAgICAgIERIX2ZyZWUoY2VydC0+ZGhfdG1wKTsKICAgICAgICAgICAgIGNlcnQtPmRoX3RtcCA9IG5ldzsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvc3NsL3MzX3NydnIuYyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvc3NsL3MzX3NydnIuYwppbmRleCBkNDUwNmE5Li44Yzc2ODk1IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL3NzbC9zM19zcnZyLmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9zc2wvczNfc3J2ci5jCkBAIC0xLDQgKzEsNCBAQAotLyogc3NsL3MzX3NydnIuYyAtKi0gbW9kZTpDOyBjLWZpbGUtc3R5bGU6ICJlYXkiIC0qLSAqLworLyogc3NsL3MzX3NydnIuYyAqLwogLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKQEAgLTM4Niw3ICszODYsNiBAQAogICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgaWYgKGFsICE9IFRMUzFfQURfVU5LTk9XTl9QU0tfSURFTlRJVFkpCiAgICAgICAgICAgICAgICAgICAgICAgICBTU0xlcnIoU1NMX0ZfU1NMM19BQ0NFUFQsIFNTTF9SX0NMSUVOVEhFTExPX1RMU0VYVCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldCA9IFNTTF9UTFNFWFRfRVJSX0FMRVJUX0ZBVEFMOwogICAgICAgICAgICAgICAgICAgICByZXQgPSAtMTsKICAgICAgICAgICAgICAgICAgICAgcy0+c3RhdGUgPSBTU0xfU1RfRVJSOwogICAgICAgICAgICAgICAgICAgICBnb3RvIGVuZDsKQEAgLTk3MCw3ICs5NjksNyBAQAogCiBpbnQgc3NsM19nZXRfY2xpZW50X2hlbGxvKFNTTCAqcykKIHsKLSAgICBpbnQgaSwgaiwgb2ssIGFsLCByZXQgPSAtMTsKKyAgICBpbnQgaSwgaiwgb2ssIGFsLCByZXQgPSAtMSwgY29va2llX3ZhbGlkID0gMDsKICAgICB1bnNpZ25lZCBpbnQgY29va2llX2xlbjsKICAgICBsb25nIG47CiAgICAgdW5zaWduZWQgbG9uZyBpZDsKQEAgLTEwNjgsNiArMTA2NywxMiBAQAogICAgICAgICBnb3RvIGZfZXJyOwogICAgIH0KIAorICAgIGlmICgoaiA8IDApIHx8IChqID4gU1NMX01BWF9TU0xfU0VTU0lPTl9JRF9MRU5HVEgpKSB7CisgICAgICAgIGFsID0gU1NMX0FEX0RFQ09ERV9FUlJPUjsKKyAgICAgICAgU1NMZXJyKFNTTF9GX1NTTDNfR0VUX0NMSUVOVF9IRUxMTywgU1NMX1JfTEVOR1RIX01JU01BVENIKTsKKyAgICAgICAgZ290byBmX2VycjsKKyAgICB9CisKICAgICBzLT5oaXQgPSAwOwogICAgIC8qCiAgICAgICogVmVyc2lvbnMgYmVmb3JlIDAuOS43IGFsd2F5cyBhbGxvdyBjbGllbnRzIHRvIHJlc3VtZSBzZXNzaW9ucyBpbgpAQCAtMTE1OCw4ICsxMTYzLDcgQEAKICAgICAgICAgICAgICAgICBTU0xlcnIoU1NMX0ZfU1NMM19HRVRfQ0xJRU5UX0hFTExPLCBTU0xfUl9DT09LSUVfTUlTTUFUQ0gpOwogICAgICAgICAgICAgICAgIGdvdG8gZl9lcnI7CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldCA9IDI7CisgICAgICAgICAgICBjb29raWVfdmFsaWQgPSAxOwogICAgICAgICB9CiAKICAgICAgICAgcCArPSBjb29raWVfbGVuOwpAQCAtMTI2Nyw3ICsxMjcxLDcgQEAKICNpZm5kZWYgT1BFTlNTTF9OT19UTFNFWFQKICAgICAvKiBUTFMgZXh0ZW5zaW9ucyAqLwogICAgIGlmIChzLT52ZXJzaW9uID49IFNTTDNfVkVSU0lPTikgewotICAgICAgICBpZiAoIXNzbF9wYXJzZV9jbGllbnRoZWxsb190bHNleHQocywgJnAsIGQsIG4sICZhbCkpIHsKKyAgICAgICAgaWYgKCFzc2xfcGFyc2VfY2xpZW50aGVsbG9fdGxzZXh0KHMsICZwLCBkICsgbiwgJmFsKSkgewogICAgICAgICAgICAgLyogJ2FsJyBzZXQgYnkgc3NsX3BhcnNlX2NsaWVudGhlbGxvX3Rsc2V4dCAqLwogICAgICAgICAgICAgU1NMZXJyKFNTTF9GX1NTTDNfR0VUX0NMSUVOVF9IRUxMTywgU1NMX1JfUEFSU0VfVExTRVhUKTsKICAgICAgICAgICAgIGdvdG8gZl9lcnI7CkBAIC0xNDk1LDggKzE0OTksNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKHJldCA8IDApCi0gICAgICAgIHJldCA9IDE7CisgICAgcmV0ID0gY29va2llX3ZhbGlkID8gMiA6IDE7CiAgICAgaWYgKDApIHsKICBmX2VycjoKICAgICAgICAgc3NsM19zZW5kX2FsZXJ0KHMsIFNTTDNfQUxfRkFUQUwsIGFsKTsKQEAgLTE1MDYsNyArMTUwOSw3IEBACiAKICAgICBpZiAoY2lwaGVycyAhPSBOVUxMKQogICAgICAgICBza19TU0xfQ0lQSEVSX2ZyZWUoY2lwaGVycyk7Ci0gICAgcmV0dXJuIChyZXQpOworICAgIHJldHVybiByZXQ7CiB9CiAKIGludCBzc2wzX3NlbmRfc2VydmVyX2hlbGxvKFNTTCAqcykKQEAgLTE3MjksMjAgKzE3MzIsOSBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBzLT5zMy0+dG1wLmRoID0gZGg7Ci0gICAgICAgICAgICBpZiAoKGRocC0+cHViX2tleSA9PSBOVUxMIHx8Ci0gICAgICAgICAgICAgICAgIGRocC0+cHJpdl9rZXkgPT0gTlVMTCB8fAotICAgICAgICAgICAgICAgICAocy0+b3B0aW9ucyAmIFNTTF9PUF9TSU5HTEVfREhfVVNFKSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoIURIX2dlbmVyYXRlX2tleShkaCkpIHsKLSAgICAgICAgICAgICAgICAgICAgU1NMZXJyKFNTTF9GX1NTTDNfU0VORF9TRVJWRVJfS0VZX0VYQ0hBTkdFLCBFUlJfUl9ESF9MSUIpOwotICAgICAgICAgICAgICAgICAgICBnb3RvIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRoLT5wdWJfa2V5ID0gQk5fZHVwKGRocC0+cHViX2tleSk7Ci0gICAgICAgICAgICAgICAgZGgtPnByaXZfa2V5ID0gQk5fZHVwKGRocC0+cHJpdl9rZXkpOwotICAgICAgICAgICAgICAgIGlmICgoZGgtPnB1Yl9rZXkgPT0gTlVMTCkgfHwgKGRoLT5wcml2X2tleSA9PSBOVUxMKSkgewotICAgICAgICAgICAgICAgICAgICBTU0xlcnIoU1NMX0ZfU1NMM19TRU5EX1NFUlZFUl9LRVlfRVhDSEFOR0UsIEVSUl9SX0RIX0xJQik7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghREhfZ2VuZXJhdGVfa2V5KGRoKSkgeworICAgICAgICAgICAgICAgIFNTTGVycihTU0xfRl9TU0wzX1NFTkRfU0VSVkVSX0tFWV9FWENIQU5HRSwgRVJSX1JfREhfTElCKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJbMF0gPSBkaC0+cDsKICAgICAgICAgICAgIHJbMV0gPSBkaC0+ZzsKQEAgLTE5OTAsMTQgKzE5ODIsMjIgQEAKICAgICAgICAgICAgICAgICBmb3IgKG51bSA9IDI7IG51bSA+IDA7IG51bS0tKSB7CiAgICAgICAgICAgICAgICAgICAgIEVWUF9NRF9DVFhfc2V0X2ZsYWdzKCZtZF9jdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWUF9NRF9DVFhfRkxBR19OT05fRklQU19BTExPVyk7Ci0gICAgICAgICAgICAgICAgICAgIEVWUF9EaWdlc3RJbml0X2V4KCZtZF9jdHgsIChudW0gPT0gMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBzLT5jdHgtPm1kNSA6IHMtPmN0eC0+c2hhMSwgTlVMTCk7Ci0gICAgICAgICAgICAgICAgICAgIEVWUF9EaWdlc3RVcGRhdGUoJm1kX2N0eCwgJihzLT5zMy0+Y2xpZW50X3JhbmRvbVswXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NMM19SQU5ET01fU0laRSk7Ci0gICAgICAgICAgICAgICAgICAgIEVWUF9EaWdlc3RVcGRhdGUoJm1kX2N0eCwgJihzLT5zMy0+c2VydmVyX3JhbmRvbVswXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NMM19SQU5ET01fU0laRSk7Ci0gICAgICAgICAgICAgICAgICAgIEVWUF9EaWdlc3RVcGRhdGUoJm1kX2N0eCwgJihkWzRdKSwgbik7Ci0gICAgICAgICAgICAgICAgICAgIEVWUF9EaWdlc3RGaW5hbF9leCgmbWRfY3R4LCBxLCAodW5zaWduZWQgaW50ICopJmkpOworICAgICAgICAgICAgICAgICAgICBpZiAoRVZQX0RpZ2VzdEluaXRfZXgoJm1kX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChudW0gPT0gMikgPyBzLT5jdHgtPm1kNQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHMtPmN0eC0+c2hhMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpIDw9IDAKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVWUF9EaWdlc3RVcGRhdGUoJm1kX2N0eCwgJihzLT5zMy0+Y2xpZW50X3JhbmRvbVswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTTDNfUkFORE9NX1NJWkUpIDw9IDAKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVWUF9EaWdlc3RVcGRhdGUoJm1kX2N0eCwgJihzLT5zMy0+c2VydmVyX3JhbmRvbVswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTTDNfUkFORE9NX1NJWkUpIDw9IDAKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVWUF9EaWdlc3RVcGRhdGUoJm1kX2N0eCwgJihkWzRdKSwgbikgPD0gMAorICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVZQX0RpZ2VzdEZpbmFsX2V4KCZtZF9jdHgsIHEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludCAqKSZpKSA8PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTU0xlcnIoU1NMX0ZfU1NMM19TRU5EX1NFUlZFUl9LRVlfRVhDSEFOR0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSX0xJQl9FVlApOworICAgICAgICAgICAgICAgICAgICAgICAgYWwgPSBTU0xfQURfSU5URVJOQUxfRVJST1I7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZfZXJyOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHEgKz0gaTsKICAgICAgICAgICAgICAgICAgICAgaiArPSBpOwogICAgICAgICAgICAgICAgIH0KQEAgLTIwMjcsMTYgKzIwMjcsMTcgQEAKICNpZmRlZiBTU0xfREVCVUcKICAgICAgICAgICAgICAgICBPUEVOU1NMX3BvcnRfcHJpbnRmZXJyKCJVc2luZyBoYXNoICVzXG4iLCBFVlBfTURfbmFtZShtZCkpOwogI2VuZGlmCi0gICAgICAgICAgICAgICAgRVZQX1NpZ25Jbml0X2V4KCZtZF9jdHgsIG1kLCBOVUxMKTsKLSAgICAgICAgICAgICAgICBFVlBfU2lnblVwZGF0ZSgmbWRfY3R4LCAmKHMtPnMzLT5jbGllbnRfcmFuZG9tWzBdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU0wzX1JBTkRPTV9TSVpFKTsKLSAgICAgICAgICAgICAgICBFVlBfU2lnblVwZGF0ZSgmbWRfY3R4LCAmKHMtPnMzLT5zZXJ2ZXJfcmFuZG9tWzBdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU0wzX1JBTkRPTV9TSVpFKTsKLSAgICAgICAgICAgICAgICBFVlBfU2lnblVwZGF0ZSgmbWRfY3R4LCAmKGRbNF0pLCBuKTsKLSAgICAgICAgICAgICAgICBpZiAoIUVWUF9TaWduRmluYWwoJm1kX2N0eCwgJihwWzJdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludCAqKSZpLCBwa2V5KSkgeworICAgICAgICAgICAgICAgIGlmIChFVlBfU2lnbkluaXRfZXgoJm1kX2N0eCwgbWQsIE5VTEwpIDw9IDAKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVWUF9TaWduVXBkYXRlKCZtZF9jdHgsICYocy0+czMtPmNsaWVudF9yYW5kb21bMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NMM19SQU5ET01fU0laRSkgPD0gMAorICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVZQX1NpZ25VcGRhdGUoJm1kX2N0eCwgJihzLT5zMy0+c2VydmVyX3JhbmRvbVswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU0wzX1JBTkRPTV9TSVpFKSA8PSAwCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBFVlBfU2lnblVwZGF0ZSgmbWRfY3R4LCAmKGRbNF0pLCBuKSA8PSAwCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBFVlBfU2lnbkZpbmFsKCZtZF9jdHgsICYocFsyXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQgKikmaSwgcGtleSkgPD0gMCkgewogICAgICAgICAgICAgICAgICAgICBTU0xlcnIoU1NMX0ZfU1NMM19TRU5EX1NFUlZFUl9LRVlfRVhDSEFOR0UsIEVSUl9MSUJfRVZQKTsKLSAgICAgICAgICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgICAgICAgICAgICAgIGFsID0gU1NMX0FEX0lOVEVSTkFMX0VSUk9SOworICAgICAgICAgICAgICAgICAgICBnb3RvIGZfZXJyOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBzMm4oaSwgcCk7CiAgICAgICAgICAgICAgICAgbiArPSBpICsgMjsKQEAgLTI4ODIsNyArMjg4MywxNSBAQAogICAgICAgICAgICAgcGsgPSBzLT5jZXJ0LT5wa2V5c1tTU0xfUEtFWV9HT1NUMDFdLnByaXZhdGVrZXk7CiAKICAgICAgICAgcGtleV9jdHggPSBFVlBfUEtFWV9DVFhfbmV3KHBrLCBOVUxMKTsKLSAgICAgICAgRVZQX1BLRVlfZGVjcnlwdF9pbml0KHBrZXlfY3R4KTsKKyAgICAgICAgaWYgKHBrZXlfY3R4ID09IE5VTEwpIHsKKyAgICAgICAgICAgIGFsID0gU1NMX0FEX0lOVEVSTkFMX0VSUk9SOworICAgICAgICAgICAgU1NMZXJyKFNTTF9GX1NTTDNfR0VUX0NMSUVOVF9LRVlfRVhDSEFOR0UsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICAgICAgICAgIGdvdG8gZl9lcnI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEVWUF9QS0VZX2RlY3J5cHRfaW5pdChwa2V5X2N0eCkgPD0gMCkgeworICAgICAgICAgICAgU1NMZXJyKFNTTF9GX1NTTDNfR0VUX0NMSUVOVF9LRVlfRVhDSEFOR0UsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKyAgICAgICAgICAgIGdvdG8gZ2VycjsKKyAgICAgICAgfQogICAgICAgICAvKgogICAgICAgICAgKiBJZiBjbGllbnQgY2VydGlmaWNhdGUgaXMgcHJlc2VudCBhbmQgaXMgb2YgdGhlIHNhbWUgdHlwZSwgbWF5YmUKICAgICAgICAgICogdXNlIGl0IGZvciBrZXkgZXhjaGFuZ2UuICBEb24ndCBtaW5kIGVycm9ycyBmcm9tCkBAIC0zMTI2LDcgKzMxMzUsMTcgQEAKICAgICAgICAgdW5zaWduZWQgY2hhciBzaWduYXR1cmVbNjRdOwogICAgICAgICBpbnQgaWR4OwogICAgICAgICBFVlBfUEtFWV9DVFggKnBjdHggPSBFVlBfUEtFWV9DVFhfbmV3KHBrZXksIE5VTEwpOwotICAgICAgICBFVlBfUEtFWV92ZXJpZnlfaW5pdChwY3R4KTsKKyAgICAgICAgaWYgKHBjdHggPT0gTlVMTCkgeworICAgICAgICAgICAgYWwgPSBTU0xfQURfSU5URVJOQUxfRVJST1I7CisgICAgICAgICAgICBTU0xlcnIoU1NMX0ZfU1NMM19HRVRfQ0VSVF9WRVJJRlksIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICAgICAgICAgIGdvdG8gZl9lcnI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEVWUF9QS0VZX3ZlcmlmeV9pbml0KHBjdHgpIDw9IDApIHsKKyAgICAgICAgICAgIEVWUF9QS0VZX0NUWF9mcmVlKHBjdHgpOworICAgICAgICAgICAgYWwgPSBTU0xfQURfSU5URVJOQUxfRVJST1I7CisgICAgICAgICAgICBTU0xlcnIoU1NMX0ZfU1NMM19HRVRfQ0VSVF9WRVJJRlksIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKyAgICAgICAgICAgIGdvdG8gZl9lcnI7CisgICAgICAgIH0KICAgICAgICAgaWYgKGkgIT0gNjQpIHsKICAgICAgICAgICAgIE9QRU5TU0xfcG9ydF9wcmludGZlcnIoIkdPU1Qgc2lnbmF0dXJlIGxlbmd0aCBpcyAlZCIsIGkpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL3NzbC9zc2wuaCBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvc3NsL3NzbC5oCmluZGV4IGQyYWIwYzAuLjEwNTA0N2UgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvc3NsL3NzbC5oCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvc3NsL3NzbC5oCkBAIC02MDIsNyArNjAyLDcgQEAKICMgZGVmaW5lIFNTTF9PUF9BTExPV19VTlNBRkVfTEVHQUNZX1JFTkVHT1RJQVRJT04gICAgICAgIDB4MDAwNDAwMDBMCiAvKiBJZiBzZXQsIGFsd2F5cyBjcmVhdGUgYSBuZXcga2V5IHdoZW4gdXNpbmcgdG1wX2VjZGggcGFyYW1ldGVycyAqLwogIyBkZWZpbmUgU1NMX09QX1NJTkdMRV9FQ0RIX1VTRSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4MDAwMEwKLS8qIElmIHNldCwgYWx3YXlzIGNyZWF0ZSBhIG5ldyBrZXkgd2hlbiB1c2luZyB0bXBfZGggcGFyYW1ldGVycyAqLworLyogRG9lcyBub3RoaW5nOiByZXRhaW5lZCBmb3IgY29tcGF0aWJpbGl0eSAqLwogIyBkZWZpbmUgU1NMX09QX1NJTkdMRV9ESF9VU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwMDAwMEwKIC8qIERvZXMgbm90aGluZzogcmV0YWluZWQgZm9yIGNvbXBhdGliaWl0eSAqLwogIyBkZWZpbmUgU1NMX09QX0VQSEVNRVJBTF9SU0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwCkBAIC0yMzEzLDYgKzIzMTMsNyBAQAogIyBkZWZpbmUgU1NMX0ZfU1NMM19ET19DSEFOR0VfQ0lQSEVSX1NQRUMgICAgICAgICAgICAgICAgIDI5MgogIyBkZWZpbmUgU1NMX0ZfU1NMM19FTkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzNAogIyBkZWZpbmUgU1NMX0ZfU1NMM19HRU5FUkFURV9LRVlfQkxPQ0sgICAgICAgICAgICAgICAgICAgIDIzOAorIyBkZWZpbmUgU1NMX0ZfU1NMM19HRU5FUkFURV9NQVNURVJfU0VDUkVUICAgICAgICAgICAgICAgIDM4OAogIyBkZWZpbmUgU1NMX0ZfU1NMM19HRVRfQ0VSVElGSUNBVEVfUkVRVUVTVCAgICAgICAgICAgICAgIDEzNQogIyBkZWZpbmUgU1NMX0ZfU1NMM19HRVRfQ0VSVF9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgIDI4OQogIyBkZWZpbmUgU1NMX0ZfU1NMM19HRVRfQ0VSVF9WRVJJRlkgICAgICAgICAgICAgICAgICAgICAgIDEzNgpAQCAtMjQ2NSw4ICsyNDY2LDExIEBACiAjIGRlZmluZSBTU0xfUl9CQURfREFUQV9SRVRVUk5FRF9CWV9DQUxMQkFDSyAgICAgICAgICAgICAgMTA2CiAjIGRlZmluZSBTU0xfUl9CQURfREVDT01QUkVTU0lPTiAgICAgICAgICAgICAgICAgICAgICAgICAgMTA3CiAjIGRlZmluZSBTU0xfUl9CQURfREhfR19MRU5HVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgMTA4CisjIGRlZmluZSBTU0xfUl9CQURfREhfR19WQUxVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzc1CiAjIGRlZmluZSBTU0xfUl9CQURfREhfUFVCX0tFWV9MRU5HVEggICAgICAgICAgICAgICAgICAgICAgMTA5CisjIGRlZmluZSBTU0xfUl9CQURfREhfUFVCX0tFWV9WQUxVRSAgICAgICAgICAgICAgICAgICAgICAgMzkzCiAjIGRlZmluZSBTU0xfUl9CQURfREhfUF9MRU5HVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEwCisjIGRlZmluZSBTU0xfUl9CQURfREhfUF9WQUxVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzk1CiAjIGRlZmluZSBTU0xfUl9CQURfRElHRVNUX0xFTkdUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMTExCiAjIGRlZmluZSBTU0xfUl9CQURfRFNBX1NJR05BVFVSRSAgICAgICAgICAgICAgICAgICAgICAgICAgMTEyCiAjIGRlZmluZSBTU0xfUl9CQURfRUNDX0NFUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzA0CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL3NzbC9zc2wzLmggYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL3NzbC9zc2wzLmgKaW5kZXggZGY2ZjczNC4uYTVlZDYxMCAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9zc2wvc3NsMy5oCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvc3NsL3NzbDMuaApAQCAtMjYzLDYgKzI2Myw4IEBACiAjIGRlZmluZSBTU0wzX1NFU1NJT05fSURfU0laRSAgICAgICAgICAgICAgICAgICAgMzIKICMgZGVmaW5lIFNTTDNfUlRfSEVBREVSX0xFTkdUSCAgICAgICAgICAgICAgICAgICA1CiAKKyMgZGVmaW5lIFNTTDNfSE1fSEVBREVSX0xFTkdUSCAgICAgICAgICAgICAgICAgICA0CisKICMgaWZuZGVmIFNTTDNfQUxJR05fUEFZTE9BRAogIC8qCiAgICogU29tZSB3aWxsIGFyZ3VlIHRoYXQgdGhpcyBpbmNyZWFzZXMgbWVtb3J5IGZvb3RwcmludCwgYnV0IGl0J3Mgbm90CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL3NzbC9zc2xfYXNuMS5jIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9zc2wvc3NsX2FzbjEuYwppbmRleCA0NDY1MmJlLi4xOWRlMWE5IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL3NzbC9zc2xfYXNuMS5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvc3NsL3NzbF9hc24xLmMKQEAgLTEyNCwxMyArMTI0LDE2IEBACiBpbnQgaTJkX1NTTF9TRVNTSU9OKFNTTF9TRVNTSU9OICppbiwgdW5zaWduZWQgY2hhciAqKnBwKQogewogI2RlZmluZSBMU0laRTIgKHNpemVvZihsb25nKSoyKQotICAgIGludCB2MSA9IDAsIHYyID0gMCwgdjMgPSAwLCB2NCA9IDAsIHY1ID0gMCwgdjcgPSAwLCB2OCA9IDA7CisgICAgaW50IHYxID0gMCwgdjIgPSAwLCB2MyA9IDAsIHY0ID0gMCwgdjUgPSAwOwogICAgIHVuc2lnbmVkIGNoYXIgYnVmWzRdLCBpYnVmMVtMU0laRTJdLCBpYnVmMltMU0laRTJdOwogICAgIHVuc2lnbmVkIGNoYXIgaWJ1ZjNbTFNJWkUyXSwgaWJ1ZjRbTFNJWkUyXSwgaWJ1ZjVbTFNJWkUyXTsKICNpZm5kZWYgT1BFTlNTTF9OT19UTFNFWFQKICAgICBpbnQgdjYgPSAwLCB2OSA9IDAsIHYxMCA9IDA7CiAgICAgdW5zaWduZWQgY2hhciBpYnVmNltMU0laRTJdOwogI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fUFNLCisgICAgaW50IHY3ID0gMCwgdjggPSAwOworI2VuZGlmCiAjaWZuZGVmIE9QRU5TU0xfTk9fQ09NUAogICAgIHVuc2lnbmVkIGNoYXIgY2J1ZjsKICAgICBpbnQgdjExID0gMDsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvc3NsL3NzbF9jZXJ0LmMgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL3NzbC9zc2xfY2VydC5jCmluZGV4IDdlOWVkZDMuLjllZTg3MzggMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvc3NsL3NzbF9jZXJ0LmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9zc2wvc3NsX2NlcnQuYwpAQCAtMjA5LDYgKzIwOSw3IEBACiAKICAgICBPUEVOU1NMX3BvcnRfbWVtc2V0KHJldCwgMCwgc2l6ZW9mKENFUlQpKTsKIAorICAgIHJldC0+cmVmZXJlbmNlcyA9IDE7CiAgICAgcmV0LT5rZXkgPSAmcmV0LT5wa2V5c1tjZXJ0LT5rZXkgLSAmY2VydC0+cGtleXNbMF1dOwogICAgIC8qCiAgICAgICogb3IgcmV0LT5rZXkgPSByZXQtPnBrZXlzICsgKGNlcnQtPmtleSAtIGNlcnQtPnBrZXlzKSwgaWYgeW91IGZpbmQgdGhhdApAQCAtMjg1LDcgKzI4Niw2IEBACiAgICAgICogY2hhaW4gaXMgaGVsZCBpbnNpZGUgU1NMX0NUWAogICAgICAqLwogCi0gICAgcmV0LT5yZWZlcmVuY2VzID0gMTsKICAgICAvKgogICAgICAqIFNldCBkaWdlc3RzIHRvIGRlZmF1bHRzLiBOQjogd2UgZG9uJ3QgY29weSBleGlzdGluZyB2YWx1ZXMgYXMgdGhleQogICAgICAqIHdpbGwgYmUgc2V0IGR1cmluZyBoYW5kc2hha2UuCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL3NzbC9zc2xfY2lwaC5jIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9zc2wvc3NsX2NpcGguYwppbmRleCAyM2M1YzUzLi5mZWY1MWM4IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL3NzbC9zc2xfY2lwaC5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvc3NsL3NzbF9jaXBoLmMKQEAgLTM1OSwxMCArMzU5LDExIEBACiAgICAgY29uc3QgRVZQX1BLRVlfQVNOMV9NRVRIT0QgKmFtZXRoOwogICAgIGludCBwa2V5X2lkID0gMDsKICAgICBhbWV0aCA9IEVWUF9QS0VZX2FzbjFfZmluZF9zdHIoTlVMTCwgcGtleV9uYW1lLCAtMSk7Ci0gICAgaWYgKGFtZXRoKSB7Ci0gICAgICAgIEVWUF9QS0VZX2FzbjFfZ2V0MF9pbmZvKCZwa2V5X2lkLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBhbWV0aCk7CisgICAgaWYgKGFtZXRoICYmIEVWUF9QS0VZX2FzbjFfZ2V0MF9pbmZvKCZwa2V5X2lkLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbWV0aCkgPiAwKSB7CisgICAgICAgIHJldHVybiBwa2V5X2lkOwogICAgIH0KLSAgICByZXR1cm4gcGtleV9pZDsKKyAgICByZXR1cm4gMDsKIH0KIAogI2Vsc2UKQEAgLTM3NCw3ICszNzUsOSBAQAogICAgIGludCBwa2V5X2lkID0gMDsKICAgICBhbWV0aCA9IEVWUF9QS0VZX2FzbjFfZmluZF9zdHIoJnRtcGVuZywgcGtleV9uYW1lLCAtMSk7CiAgICAgaWYgKGFtZXRoKSB7Ci0gICAgICAgIEVWUF9QS0VZX2FzbjFfZ2V0MF9pbmZvKCZwa2V5X2lkLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBhbWV0aCk7CisgICAgICAgIGlmIChFVlBfUEtFWV9hc24xX2dldDBfaW5mbygmcGtleV9pZCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtZXRoKSA8PSAwKQorICAgICAgICAgICAgcGtleV9pZCA9IDA7CiAgICAgfQogICAgIGlmICh0bXBlbmcpCiAgICAgICAgIEVOR0lORV9maW5pc2godG1wZW5nKTsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvc3NsL3NzbF9lcnIuYyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvc3NsL3NzbF9lcnIuYwppbmRleCBkZWY1YWVhLi5kNGIxZjM5IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL3NzbC9zc2xfZXJyLmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9zc2wvc3NsX2Vyci5jCkBAIC0xNjUsNiArMTY1LDggQEAKICAgICB7RVJSX0ZVTkMoU1NMX0ZfU1NMM19FTkMpLCAiU1NMM19FTkMifSwKICAgICB7RVJSX0ZVTkMoU1NMX0ZfU1NMM19DSEVDS19GSU5JU0hFRCksICJTU0wzX0NIRUNLX0ZJTklTSEVEIn0sCiAgICAge0VSUl9GVU5DKFNTTF9GX1NTTDNfR0VORVJBVEVfS0VZX0JMT0NLKSwgIlNTTDNfR0VORVJBVEVfS0VZX0JMT0NLIn0sCisgICAge0VSUl9GVU5DKFNTTF9GX1NTTDNfR0VORVJBVEVfTUFTVEVSX1NFQ1JFVCksCisgICAgICJzc2wzX2dlbmVyYXRlX21hc3Rlcl9zZWNyZXQifSwKICAgICB7RVJSX0ZVTkMoU1NMX0ZfU1NMM19HRVRfQ0VSVElGSUNBVEVfUkVRVUVTVCksCiAgICAgICJTU0wzX0dFVF9DRVJUSUZJQ0FURV9SRVFVRVNUIn0sCiAgICAge0VSUl9GVU5DKFNTTF9GX1NTTDNfR0VUX0NFUlRfU1RBVFVTKSwgIlNTTDNfR0VUX0NFUlRfU1RBVFVTIn0sCkBAIC0zNzIsOCArMzc0LDExIEBACiAgICAgICJiYWQgZGF0YSByZXR1cm5lZCBieSBjYWxsYmFjayJ9LAogICAgIHtFUlJfUkVBU09OKFNTTF9SX0JBRF9ERUNPTVBSRVNTSU9OKSwgImJhZCBkZWNvbXByZXNzaW9uIn0sCiAgICAge0VSUl9SRUFTT04oU1NMX1JfQkFEX0RIX0dfTEVOR1RIKSwgImJhZCBkaCBnIGxlbmd0aCJ9LAorICAgIHtFUlJfUkVBU09OKFNTTF9SX0JBRF9ESF9HX1ZBTFVFKSwgImJhZCBkaCBnIHZhbHVlIn0sCiAgICAge0VSUl9SRUFTT04oU1NMX1JfQkFEX0RIX1BVQl9LRVlfTEVOR1RIKSwgImJhZCBkaCBwdWIga2V5IGxlbmd0aCJ9LAorICAgIHtFUlJfUkVBU09OKFNTTF9SX0JBRF9ESF9QVUJfS0VZX1ZBTFVFKSwgImJhZCBkaCBwdWIga2V5IHZhbHVlIn0sCiAgICAge0VSUl9SRUFTT04oU1NMX1JfQkFEX0RIX1BfTEVOR1RIKSwgImJhZCBkaCBwIGxlbmd0aCJ9LAorICAgIHtFUlJfUkVBU09OKFNTTF9SX0JBRF9ESF9QX1ZBTFVFKSwgImJhZCBkaCBwIHZhbHVlIn0sCiAgICAge0VSUl9SRUFTT04oU1NMX1JfQkFEX0RJR0VTVF9MRU5HVEgpLCAiYmFkIGRpZ2VzdCBsZW5ndGgifSwKICAgICB7RVJSX1JFQVNPTihTU0xfUl9CQURfRFNBX1NJR05BVFVSRSksICJiYWQgZHNhIHNpZ25hdHVyZSJ9LAogICAgIHtFUlJfUkVBU09OKFNTTF9SX0JBRF9FQ0NfQ0VSVCksICJiYWQgZWNjIGNlcnQifSwKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvc3NsL3NzbF9saWIuYyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvc3NsL3NzbF9saWIuYwppbmRleCA3OTc2NDNmLi5kYjc1MjlmIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL3NzbC9zc2xfbGliLmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9zc2wvc3NsX2xpYi5jCkBAIC0zMTAsNiArMzEwLDcgQEAKICAgICBzLT5vcHRpb25zID0gY3R4LT5vcHRpb25zOwogICAgIHMtPm1vZGUgPSBjdHgtPm1vZGU7CiAgICAgcy0+bWF4X2NlcnRfbGlzdCA9IGN0eC0+bWF4X2NlcnRfbGlzdDsKKyAgICBzLT5yZWZlcmVuY2VzID0gMTsKIAogICAgIGlmIChjdHgtPmNlcnQgIT0gTlVMTCkgewogICAgICAgICAvKgpAQCAtMzc4LDcgKzM3OSw2IEBACiAgICAgaWYgKCFzLT5tZXRob2QtPnNzbF9uZXcocykpCiAgICAgICAgIGdvdG8gZXJyOwogCi0gICAgcy0+cmVmZXJlbmNlcyA9IDE7CiAgICAgcy0+c2VydmVyID0gKGN0eC0+bWV0aG9kLT5zc2xfYWNjZXB0ID09IHNzbF91bmRlZmluZWRfZnVuY3Rpb24pID8gMCA6IDE7CiAKICAgICBTU0xfY2xlYXIocyk7CkBAIC0zMjg2LDggKzMyODYsMTEgQEAKIHsKICAgICBzc2xfY2xlYXJfaGFzaF9jdHgoaGFzaCk7CiAgICAgKmhhc2ggPSBFVlBfTURfQ1RYX2NyZWF0ZSgpOwotICAgIGlmIChtZCkKLSAgICAgICAgRVZQX0RpZ2VzdEluaXRfZXgoKmhhc2gsIG1kLCBOVUxMKTsKKyAgICBpZiAoKmhhc2ggPT0gTlVMTCB8fCAobWQgJiYgRVZQX0RpZ2VzdEluaXRfZXgoKmhhc2gsIG1kLCBOVUxMKSA8PSAwKSkgeworICAgICAgICBFVlBfTURfQ1RYX2Rlc3Ryb3koKmhhc2gpOworICAgICAgICAqaGFzaCA9IE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KICAgICByZXR1cm4gKmhhc2g7CiB9CiAKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvc3NsL3NzbF9sb2NsLmggYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL3NzbC9zc2xfbG9jbC5oCmluZGV4IDU1YzRmZGQuLjU0OGY1OTEgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvc3NsL3NzbF9sb2NsLmgKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9zc2wvc3NsX2xvY2wuaApAQCAtMTE1Nyw3ICsxMTU3LDcgQEAKIHVuc2lnbmVkIGNoYXIgKnNzbF9hZGRfc2VydmVyaGVsbG9fdGxzZXh0KFNTTCAqcywgdW5zaWduZWQgY2hhciAqYnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqbGltaXQpOwogaW50IHNzbF9wYXJzZV9jbGllbnRoZWxsb190bHNleHQoU1NMICpzLCB1bnNpZ25lZCBjaGFyICoqZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmQsIGludCBuLCBpbnQgKmFsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmxpbWl0LCBpbnQgKmFsKTsKIGludCBzc2xfcGFyc2Vfc2VydmVyaGVsbG9fdGxzZXh0KFNTTCAqcywgdW5zaWduZWQgY2hhciAqKmRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkLCBpbnQgbiwgaW50ICphbCk7CiBpbnQgc3NsX3ByZXBhcmVfY2xpZW50aGVsbG9fdGxzZXh0KFNTTCAqcyk7CkBAIC0xMjIxLDE1ICsxMjIxLDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NMM19SRUNPUkQgKnJlYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBibG9ja19zaXplLCB1bnNpZ25lZCBtYWNfc2l6ZSk7CiBjaGFyIHNzbDNfY2JjX3JlY29yZF9kaWdlc3Rfc3VwcG9ydGVkKGNvbnN0IEVWUF9NRF9DVFggKmN0eCk7Ci12b2lkIHNzbDNfY2JjX2RpZ2VzdF9yZWNvcmQoY29uc3QgRVZQX01EX0NUWCAqY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm1kX291dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKm1kX291dF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgaGVhZGVyWzEzXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkYXRhX3BsdXNfbWFjX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGRhdGFfcGx1c19tYWNfcGx1c19wYWRkaW5nX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqbWFjX3NlY3JldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBtYWNfc2VjcmV0X2xlbmd0aCwgY2hhciBpc19zc2x2Myk7CitpbnQgc3NsM19jYmNfZGlnZXN0X3JlY29yZChjb25zdCBFVlBfTURfQ1RYICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICptZF9vdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKm1kX291dF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciBoZWFkZXJbMTNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkYXRhX3BsdXNfbWFjX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZGF0YV9wbHVzX21hY19wbHVzX3BhZGRpbmdfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm1hY19zZWNyZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBtYWNfc2VjcmV0X2xlbmd0aCwgY2hhciBpc19zc2x2Myk7CiAKIHZvaWQgdGxzX2ZpcHNfZGlnZXN0X2V4dHJhKGNvbnN0IEVWUF9DSVBIRVJfQ1RYICpjaXBoZXJfY3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZQX01EX0NUWCAqbWFjX2N0eCwgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSwKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvc3NsL3NzbF9yc2EuYyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvc3NsL3NzbF9yc2EuYwppbmRleCAwMzE1YWRjLi5hMzNjMmNjIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL3NzbC9zc2xfcnNhLmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9zc2wvc3NsX3JzYS5jCkBAIC0xNjMsNyArMTYzLDEwIEBACiAgICAgfQogCiAgICAgUlNBX3VwX3JlZihyc2EpOwotICAgIEVWUF9QS0VZX2Fzc2lnbl9SU0EocGtleSwgcnNhKTsKKyAgICBpZiAoRVZQX1BLRVlfYXNzaWduX1JTQShwa2V5LCByc2EpIDw9IDApIHsKKyAgICAgICAgUlNBX2ZyZWUocnNhKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCiAgICAgcmV0ID0gc3NsX3NldF9wa2V5KHNzbC0+Y2VydCwgcGtleSk7CiAgICAgRVZQX1BLRVlfZnJlZShwa2V5KTsKQEAgLTE4NCw2ICsxODcsMTUgQEAKICAgICBpZiAoYy0+cGtleXNbaV0ueDUwOSAhPSBOVUxMKSB7CiAgICAgICAgIEVWUF9QS0VZICpwa3RtcDsKICAgICAgICAgcGt0bXAgPSBYNTA5X2dldF9wdWJrZXkoYy0+cGtleXNbaV0ueDUwOSk7CisgICAgICAgIGlmIChwa3RtcCA9PSBOVUxMKSB7CisgICAgICAgICAgICBTU0xlcnIoU1NMX0ZfU1NMX1NFVF9QS0VZLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgICAgICAgICBFVlBfUEtFWV9mcmVlKHBrdG1wKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIC8qCisgICAgICAgICAqIFRoZSByZXR1cm4gY29kZSBmcm9tIEVWUF9QS0VZX2NvcHlfcGFyYW1ldGVycyBpcyBkZWxpYmVyYXRlbHkKKyAgICAgICAgICogaWdub3JlZC4gU29tZSBFVlBfUEtFWSB0eXBlcyBjYW5ub3QgZG8gdGhpcy4KKyAgICAgICAgICovCiAgICAgICAgIEVWUF9QS0VZX2NvcHlfcGFyYW1ldGVycyhwa3RtcCwgcGtleSk7CiAgICAgICAgIEVWUF9QS0VZX2ZyZWUocGt0bXApOwogICAgICAgICBFUlJfY2xlYXJfZXJyb3IoKTsKQEAgLTM4NSw2ICszOTcsMTAgQEAKICAgICB9CiAKICAgICBpZiAoYy0+cGtleXNbaV0ucHJpdmF0ZWtleSAhPSBOVUxMKSB7CisgICAgICAgIC8qCisgICAgICAgICAqIFRoZSByZXR1cm4gY29kZSBmcm9tIEVWUF9QS0VZX2NvcHlfcGFyYW1ldGVycyBpcyBkZWxpYmVyYXRlbHkKKyAgICAgICAgICogaWdub3JlZC4gU29tZSBFVlBfUEtFWSB0eXBlcyBjYW5ub3QgZG8gdGhpcy4KKyAgICAgICAgICovCiAgICAgICAgIEVWUF9QS0VZX2NvcHlfcGFyYW1ldGVycyhwa2V5LCBjLT5wa2V5c1tpXS5wcml2YXRla2V5KTsKICAgICAgICAgRVJSX2NsZWFyX2Vycm9yKCk7CiAKQEAgLTUwNSw3ICs1MjEsMTAgQEAKICAgICB9CiAKICAgICBSU0FfdXBfcmVmKHJzYSk7Ci0gICAgRVZQX1BLRVlfYXNzaWduX1JTQShwa2V5LCByc2EpOworICAgIGlmIChFVlBfUEtFWV9hc3NpZ25fUlNBKHBrZXksIHJzYSkgPD0gMCkgeworICAgICAgICBSU0FfZnJlZShyc2EpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKICAgICByZXQgPSBzc2xfc2V0X3BrZXkoY3R4LT5jZXJ0LCBwa2V5KTsKICAgICBFVlBfUEtFWV9mcmVlKHBrZXkpOwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9zc2wvc3NsX3Nlc3MuYyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvc3NsL3NzbF9zZXNzLmMKaW5kZXggYmUxNzFiNy4uZDhmYjM4OCAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9zc2wvc3NsX3Nlc3MuYworKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL3NzbC9zc2xfc2Vzcy5jCkBAIC0yNTksOCArMjU5LDggQEAKICAgICBkZXN0LT50bHNleHRfZWNwb2ludGZvcm1hdGxpc3QgPSBOVUxMOwogICAgIGRlc3QtPnRsc2V4dF9lbGxpcHRpY2N1cnZlbGlzdCA9IE5VTEw7CiAjIGVuZGlmCi0jZW5kaWYKICAgICBkZXN0LT50bHNleHRfdGljayA9IE5VTEw7CisjZW5kaWYKICNpZm5kZWYgT1BFTlNTTF9OT19TUlAKICAgICBkZXN0LT5zcnBfdXNlcm5hbWUgPSBOVUxMOwogI2VuZGlmCkBAIC0zMjcsNyArMzI3LDYgQEAKICAgICAgICAgICAgIGdvdG8gZXJyOwogICAgIH0KICMgZW5kaWYKLSNlbmRpZgogCiAgICAgaWYgKHRpY2tldCAhPSAwKSB7CiAgICAgICAgIGRlc3QtPnRsc2V4dF90aWNrID0gQlVGX21lbWR1cChzcmMtPnRsc2V4dF90aWNrLCBzcmMtPnRsc2V4dF90aWNrbGVuKTsKQEAgLTMzNyw2ICszMzYsNyBAQAogICAgICAgICBkZXN0LT50bHNleHRfdGlja19saWZldGltZV9oaW50ID0gMDsKICAgICAgICAgZGVzdC0+dGxzZXh0X3RpY2tsZW4gPSAwOwogICAgIH0KKyNlbmRpZgogCiAjaWZuZGVmIE9QRU5TU0xfTk9fU1JQCiAgICAgaWYgKHNyYy0+c3JwX3VzZXJuYW1lKSB7CkBAIC02MDUsOSArNjA1LDYgQEAKICAgICBpbnQgcjsKICNlbmRpZgogCi0gICAgaWYgKGxlbiA8IDAgfHwgbGVuID4gU1NMX01BWF9TU0xfU0VTU0lPTl9JRF9MRU5HVEgpCi0gICAgICAgIGdvdG8gZXJyOwotCiAgICAgaWYgKHNlc3Npb25faWQgKyBsZW4gPiBsaW1pdCkgewogICAgICAgICBmYXRhbCA9IDE7CiAgICAgICAgIGdvdG8gZXJyOwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9zc2wvc3NsdGVzdC5jIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9zc2wvc3NsdGVzdC5jCmluZGV4IDZhMGMyOTMuLjM0OWVlMWUgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvc3NsL3NzbHRlc3QuYworKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL3NzbC9zc2x0ZXN0LmMKQEAgLTE0Miw2ICsxNDIsNyBAQAogCiAvKiBPciBnZXRob3N0bmFtZSB3b24ndCBiZSBkZWNsYXJlZCBwcm9wZXJseSBvbiBMaW51eCBhbmQgR05VIHBsYXRmb3Jtcy4gKi8KICNkZWZpbmUgX0JTRF9TT1VSQ0UgMQorI2RlZmluZSBfREVGQVVMVF9TT1VSQ0UgMQogCiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvc3NsL3QxX2VuYy5jIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9zc2wvdDFfZW5jLmMKaW5kZXggNTlkMTA0ZC4uZmExNzI2YiAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9zc2wvdDFfZW5jLmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9zc2wvdDFfZW5jLmMKQEAgLTM4OCw2ICszODgsOCBAQAogICAgICAgICAgICAgRVZQX0NJUEhFUl9DVFhfaW5pdChzLT5lbmNfcmVhZF9jdHgpOwogICAgICAgICBkZCA9IHMtPmVuY19yZWFkX2N0eDsKICAgICAgICAgbWFjX2N0eCA9IHNzbF9yZXBsYWNlX2hhc2goJnMtPnJlYWRfaGFzaCwgTlVMTCk7CisgICAgICAgIGlmIChtYWNfY3R4ID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVycjsKICNpZm5kZWYgT1BFTlNTTF9OT19DT01QCiAgICAgICAgIGlmIChzLT5leHBhbmQgIT0gTlVMTCkgewogICAgICAgICAgICAgQ09NUF9DVFhfZnJlZShzLT5leHBhbmQpOwpAQCAtNDI2LDExICs0MjgsMTQgQEAKICAgICAgICAgZGQgPSBzLT5lbmNfd3JpdGVfY3R4OwogICAgICAgICBpZiAoU1NMX0lTX0RUTFMocykpIHsKICAgICAgICAgICAgIG1hY19jdHggPSBFVlBfTURfQ1RYX2NyZWF0ZSgpOwotICAgICAgICAgICAgaWYgKCFtYWNfY3R4KQorICAgICAgICAgICAgaWYgKG1hY19jdHggPT0gTlVMTCkKICAgICAgICAgICAgICAgICBnb3RvIGVycjsKICAgICAgICAgICAgIHMtPndyaXRlX2hhc2ggPSBtYWNfY3R4OwotICAgICAgICB9IGVsc2UKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1hY19jdHggPSBzc2xfcmVwbGFjZV9oYXNoKCZzLT53cml0ZV9oYXNoLCBOVUxMKTsKKyAgICAgICAgICAgIGlmIChtYWNfY3R4ID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgIH0KICNpZm5kZWYgT1BFTlNTTF9OT19DT01QCiAgICAgICAgIGlmIChzLT5jb21wcmVzcyAhPSBOVUxMKSB7CiAgICAgICAgICAgICBDT01QX0NUWF9mcmVlKHMtPmNvbXByZXNzKTsKQEAgLTUwMyw3ICs1MDgsMTIgQEAKICAgICBpZiAoIShFVlBfQ0lQSEVSX2ZsYWdzKGMpICYgRVZQX0NJUEhfRkxBR19BRUFEX0NJUEhFUikpIHsKICAgICAgICAgbWFjX2tleSA9IEVWUF9QS0VZX25ld19tYWNfa2V5KG1hY190eXBlLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjX3NlY3JldCwgKm1hY19zZWNyZXRfc2l6ZSk7Ci0gICAgICAgIEVWUF9EaWdlc3RTaWduSW5pdChtYWNfY3R4LCBOVUxMLCBtLCBOVUxMLCBtYWNfa2V5KTsKKyAgICAgICAgaWYgKG1hY19rZXkgPT0gTlVMTAorICAgICAgICAgICAgICAgIHx8IEVWUF9EaWdlc3RTaWduSW5pdChtYWNfY3R4LCBOVUxMLCBtLCBOVUxMLCBtYWNfa2V5KSA8PSAwKSB7CisgICAgICAgICAgICBFVlBfUEtFWV9mcmVlKG1hY19rZXkpOworICAgICAgICAgICAgU1NMZXJyKFNTTF9GX1RMUzFfQ0hBTkdFX0NJUEhFUl9TVEFURSwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworICAgICAgICAgICAgZ290byBlcnIyOworICAgICAgICB9CiAgICAgICAgIEVWUF9QS0VZX2ZyZWUobWFjX2tleSk7CiAgICAgfQogI2lmZGVmIFRMU19ERUJVRwpAQCAtOTE2LDggKzkyNiw5IEBACiAgICAgfQogCiAgICAgRVZQX01EX0NUWF9pbml0KCZjdHgpOwotICAgIEVWUF9NRF9DVFhfY29weV9leCgmY3R4LCBkKTsKLSAgICBFVlBfRGlnZXN0RmluYWxfZXgoJmN0eCwgb3V0LCAmcmV0KTsKKyAgICBpZiAoRVZQX01EX0NUWF9jb3B5X2V4KCZjdHgsIGQpIDw9MAorICAgICAgICAgICAgfHwgRVZQX0RpZ2VzdEZpbmFsX2V4KCZjdHgsIG91dCwgJnJldCkgPD0gMCkKKyAgICAgICAgcmV0ID0gMDsKICAgICBFVlBfTURfQ1RYX2NsZWFudXAoJmN0eCk7CiAgICAgcmV0dXJuICgoaW50KXJldCk7CiB9CkBAIC0xMDQ0LDE3ICsxMDU1LDI0IEBACiAgICAgICAgICAqIGFyZSBoYXNoaW5nIGJlY2F1c2UgdGhhdCBnaXZlcyBhbiBhdHRhY2tlciBhIHRpbWluZy1vcmFjbGUuCiAgICAgICAgICAqLwogICAgICAgICAvKiBGaW5hbCBwYXJhbSA9PSBub3QgU1NMdjMgKi8KLSAgICAgICAgc3NsM19jYmNfZGlnZXN0X3JlY29yZChtYWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1kLCAmbWRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIsIHJlYy0+aW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjLT5sZW5ndGggKyBtZF9zaXplLCBvcmlnX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2wtPnMzLT5yZWFkX21hY19zZWNyZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NsLT5zMy0+cmVhZF9tYWNfc2VjcmV0X3NpemUsIDApOworICAgICAgICBpZiAoc3NsM19jYmNfZGlnZXN0X3JlY29yZChtYWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZCwgJm1kX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlciwgcmVjLT5pbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjLT5sZW5ndGggKyBtZF9zaXplLCBvcmlnX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NsLT5zMy0+cmVhZF9tYWNfc2VjcmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2wtPnMzLT5yZWFkX21hY19zZWNyZXRfc2l6ZSwgMCkgPD0gMCkgeworICAgICAgICAgICAgaWYgKCFzdHJlYW1fbWFjKQorICAgICAgICAgICAgICAgIEVWUF9NRF9DVFhfY2xlYW51cCgmaG1hYyk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBFVlBfRGlnZXN0U2lnblVwZGF0ZShtYWNfY3R4LCBoZWFkZXIsIHNpemVvZihoZWFkZXIpKTsKLSAgICAgICAgRVZQX0RpZ2VzdFNpZ25VcGRhdGUobWFjX2N0eCwgcmVjLT5pbnB1dCwgcmVjLT5sZW5ndGgpOwotICAgICAgICB0ID0gRVZQX0RpZ2VzdFNpZ25GaW5hbChtYWNfY3R4LCBtZCwgJm1kX3NpemUpOwotICAgICAgICBPUEVOU1NMX2Fzc2VydCh0ID4gMCk7CisgICAgICAgIGlmIChFVlBfRGlnZXN0U2lnblVwZGF0ZShtYWNfY3R4LCBoZWFkZXIsIHNpemVvZihoZWFkZXIpKSA8PSAwCisgICAgICAgICAgICAgICAgfHwgRVZQX0RpZ2VzdFNpZ25VcGRhdGUobWFjX2N0eCwgcmVjLT5pbnB1dCwgcmVjLT5sZW5ndGgpIDw9IDAKKyAgICAgICAgICAgICAgICB8fCBFVlBfRGlnZXN0U2lnbkZpbmFsKG1hY19jdHgsIG1kLCAmbWRfc2l6ZSkgPD0gMCkgeworICAgICAgICAgICAgaWYgKCFzdHJlYW1fbWFjKQorICAgICAgICAgICAgICAgIEVWUF9NRF9DVFhfY2xlYW51cCgmaG1hYyk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KICNpZmRlZiBPUEVOU1NMX0ZJUFMKICAgICAgICAgaWYgKCFzZW5kICYmIEZJUFNfbW9kZSgpKQogICAgICAgICAgICAgdGxzX2ZpcHNfZGlnZXN0X2V4dHJhKHNzbC0+ZW5jX3JlYWRfY3R4LApAQCAtMTEyMiw3ICsxMTQwLDcgQEAKICAgICAgICAgc28gPSBzLT5zMy0+c2VydmVyX29wYXF1ZV9wcmZfaW5wdXQ7CiAgICAgICAgIC8qCiAgICAgICAgICAqIG11c3QgYmUgc2FtZSBhcyBjb2wgKHNlZQotICAgICAgICAgKiBkcmFmdC1yZXNjLTAwLnR4dHMtb3BhcXVlLXByZi1pbnB1dC0wMC50eHQsIHNlY3Rpb24gMy4xKQorICAgICAgICAgKiBkcmFmdC1yZXNjb3JsYS10bHMtb3BhcXVlLXByZi1pbnB1dC0wMC50eHQsIHNlY3Rpb24gMy4xKQogICAgICAgICAgKi8KICAgICAgICAgc29sID0gcy0+czMtPmNsaWVudF9vcGFxdWVfcHJmX2lucHV0X2xlbjsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL3NzbC90MV9saWIuYyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvc3NsL3QxX2xpYi5jCmluZGV4IDE1ZjdhYTguLjliZDRlNTcgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvc3NsL3QxX2xpYi5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvc3NsL3QxX2xpYi5jCkBAIC0xNjQsNyArMTY0LDcgQEAKIHsKICNpZm5kZWYgT1BFTlNTTF9OT19UTFNFWFQKICAgICBpZiAocy0+dGxzZXh0X3Nlc3Npb25fdGlja2V0KSB7Ci0gICAgICAgIE9QRU5TU0xfZnJlZShzLT50bHNleHRfc2Vzc2lvbl90aWNrZXQpOworICAgICAgICBPUEVOU1NMX3BvcnRfZnJlZShzLT50bHNleHRfc2Vzc2lvbl90aWNrZXQpOwogICAgIH0KICNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT1BFTlNTTF9OT19UTFNFWFQgKi8KICAgICBzc2wzX2ZyZWUocyk7CkBAIC05MTYsNyArOTE2LDcgQEAKICAqIDEwLjguLjEwLjguMyAod2hpY2ggZG9uJ3Qgd29yaykuCiAgKi8KIHN0YXRpYyB2b2lkIHNzbF9jaGVja19mb3Jfc2FmYXJpKFNTTCAqcywgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmQsIGludCBuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqbGltaXQpCiB7CiAgICAgdW5zaWduZWQgc2hvcnQgdHlwZSwgc2l6ZTsKICAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBrU2FmYXJpRXh0ZW5zaW9uc0Jsb2NrW10gPSB7CkBAIC05NDUsMTEgKzk0NSwxMSBAQAogICAgICAgICAweDAyLCAweDAzLCAgICAgICAgICAgICAvKiBTSEEtMS9FQ0RTQSAqLwogICAgIH07CiAKLSAgICBpZiAoZGF0YSA+PSAoZCArIG4gLSAyKSkKKyAgICBpZiAoZGF0YSA+PSAobGltaXQgLSAyKSkKICAgICAgICAgcmV0dXJuOwogICAgIGRhdGEgKz0gMjsKIAotICAgIGlmIChkYXRhID4gKGQgKyBuIC0gNCkpCisgICAgaWYgKGRhdGEgPiAobGltaXQgLSA0KSkKICAgICAgICAgcmV0dXJuOwogICAgIG4ycyhkYXRhLCB0eXBlKTsKICAgICBuMnMoZGF0YSwgc2l6ZSk7CkBAIC05NTcsNyArOTU3LDcgQEAKICAgICBpZiAodHlwZSAhPSBUTFNFWFRfVFlQRV9zZXJ2ZXJfbmFtZSkKICAgICAgICAgcmV0dXJuOwogCi0gICAgaWYgKGRhdGEgKyBzaXplID4gZCArIG4pCisgICAgaWYgKGRhdGEgKyBzaXplID4gbGltaXQpCiAgICAgICAgIHJldHVybjsKICAgICBkYXRhICs9IHNpemU7CiAKQEAgLTk2NSw3ICs5NjUsNyBAQAogICAgICAgICBjb25zdCBzaXplX3QgbGVuMSA9IHNpemVvZihrU2FmYXJpRXh0ZW5zaW9uc0Jsb2NrKTsKICAgICAgICAgY29uc3Qgc2l6ZV90IGxlbjIgPSBzaXplb2Yoa1NhZmFyaVRMUzEyRXh0ZW5zaW9uc0Jsb2NrKTsKIAotICAgICAgICBpZiAoZGF0YSArIGxlbjEgKyBsZW4yICE9IGQgKyBuKQorICAgICAgICBpZiAoZGF0YSArIGxlbjEgKyBsZW4yICE9IGxpbWl0KQogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICBpZiAoT1BFTlNTTF9wb3J0X21lbWNtcChkYXRhLCBrU2FmYXJpRXh0ZW5zaW9uc0Jsb2NrLCBsZW4xKSAhPSAwKQogICAgICAgICAgICAgcmV0dXJuOwpAQCAtOTc0LDcgKzk3NCw3IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgY29uc3Qgc2l6ZV90IGxlbiA9IHNpemVvZihrU2FmYXJpRXh0ZW5zaW9uc0Jsb2NrKTsKIAotICAgICAgICBpZiAoZGF0YSArIGxlbiAhPSBkICsgbikKKyAgICAgICAgaWYgKGRhdGEgKyBsZW4gIT0gbGltaXQpCiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIGlmIChPUEVOU1NMX3BvcnRfbWVtY21wKGRhdGEsIGtTYWZhcmlFeHRlbnNpb25zQmxvY2ssIGxlbikgIT0gMCkKICAgICAgICAgICAgIHJldHVybjsKQEAgLTk4NCw4ICs5ODQsOCBAQAogfQogIyBlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAvKiAhT1BFTlNTTF9OT19FQyAqLwogCi1pbnQgc3NsX3BhcnNlX2NsaWVudGhlbGxvX3Rsc2V4dChTU0wgKnMsIHVuc2lnbmVkIGNoYXIgKipwLCB1bnNpZ25lZCBjaGFyICpkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG4sIGludCAqYWwpCitpbnQgc3NsX3BhcnNlX2NsaWVudGhlbGxvX3Rsc2V4dChTU0wgKnMsIHVuc2lnbmVkIGNoYXIgKipwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqbGltaXQsIGludCAqYWwpCiB7CiAgICAgdW5zaWduZWQgc2hvcnQgdHlwZTsKICAgICB1bnNpZ25lZCBzaG9ydCBzaXplOwpAQCAtMTAwNywzNCArMTAwNywzNCBAQAogCiAjIGlmbmRlZiBPUEVOU1NMX05PX0VDCiAgICAgaWYgKHMtPm9wdGlvbnMgJiBTU0xfT1BfU0FGQVJJX0VDREhFX0VDRFNBX0JVRykKLSAgICAgICAgc3NsX2NoZWNrX2Zvcl9zYWZhcmkocywgZGF0YSwgZCwgbik7CisgICAgICAgIHNzbF9jaGVja19mb3Jfc2FmYXJpKHMsIGRhdGEsIGxpbWl0KTsKICMgZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgLyogIU9QRU5TU0xfTk9fRUMgKi8KIAogIyBpZm5kZWYgT1BFTlNTTF9OT19TUlAKICAgICBpZiAocy0+c3JwX2N0eC5sb2dpbiAhPSBOVUxMKSB7Ci0gICAgICAgIE9QRU5TU0xfZnJlZShzLT5zcnBfY3R4LmxvZ2luKTsKKyAgICAgICAgT1BFTlNTTF9wb3J0X2ZyZWUocy0+c3JwX2N0eC5sb2dpbik7CiAgICAgICAgIHMtPnNycF9jdHgubG9naW4gPSBOVUxMOwogICAgIH0KICMgZW5kaWYKIAogICAgIHMtPnNydHBfcHJvZmlsZSA9IE5VTEw7CiAKLSAgICBpZiAoZGF0YSA9PSBkICsgbikKKyAgICBpZiAoZGF0YSA9PSBsaW1pdCkKICAgICAgICAgZ290byByaV9jaGVjazsKIAotICAgIGlmIChkYXRhID4gKGQgKyBuIC0gMikpCisgICAgaWYgKGRhdGEgPiAobGltaXQgLSAyKSkKICAgICAgICAgZ290byBlcnI7CiAKICAgICBuMnMoZGF0YSwgbGVuKTsKIAotICAgIGlmIChkYXRhID4gKGQgKyBuIC0gbGVuKSkKKyAgICBpZiAoZGF0YSArIGxlbiAhPSBsaW1pdCkKICAgICAgICAgZ290byBlcnI7CiAKLSAgICB3aGlsZSAoZGF0YSA8PSAoZCArIG4gLSA0KSkgeworICAgIHdoaWxlIChkYXRhIDw9IChsaW1pdCAtIDQpKSB7CiAgICAgICAgIG4ycyhkYXRhLCB0eXBlKTsKICAgICAgICAgbjJzKGRhdGEsIHNpemUpOwogCi0gICAgICAgIGlmIChkYXRhICsgc2l6ZSA+IChkICsgbikpCisgICAgICAgIGlmIChkYXRhICsgc2l6ZSA+IChsaW1pdCkpCiAgICAgICAgICAgICBnb3RvIGVycjsKICMgaWYgMAogICAgICAgICBPUEVOU1NMX3BvcnRfcHJpbnRmZXJyKCJSZWNlaXZlZCBleHRlbnNpb24gdHlwZSAlZCBzaXplICVkXG4iLCB0eXBlLCBzaXplKTsKQEAgLTExMDYsNyArMTEwNiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BFTlNTTF9wb3J0X21lbWNweShzLT5zZXNzaW9uLT50bHNleHRfaG9zdG5hbWUsIHNkYXRhLCBsZW4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnNlc3Npb24tPnRsc2V4dF9ob3N0bmFtZVtsZW5dID0gJ1wwJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoT1BFTlNTTF9wb3J0X3N0cmxlbihzLT5zZXNzaW9uLT50bHNleHRfaG9zdG5hbWUpICE9IGxlbikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEVOU1NMX2ZyZWUocy0+c2Vzc2lvbi0+dGxzZXh0X2hvc3RuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BFTlNTTF9wb3J0X2ZyZWUocy0+c2Vzc2lvbi0+dGxzZXh0X2hvc3RuYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c2Vzc2lvbi0+dGxzZXh0X2hvc3RuYW1lID0gTlVMTDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmFsID0gVExTMV9BRF9VTlJFQ09HTklaRURfTkFNRTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CkBAIC0xMTU2LDEyICsxMTU2LDEyIEBACiAgICAgICAgICAgICAgICAgZ290byBlcnI7CiAgICAgICAgICAgICBpZiAoIXMtPmhpdCkgewogICAgICAgICAgICAgICAgIGlmIChzLT5zZXNzaW9uLT50bHNleHRfZWNwb2ludGZvcm1hdGxpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgT1BFTlNTTF9mcmVlKHMtPnNlc3Npb24tPnRsc2V4dF9lY3BvaW50Zm9ybWF0bGlzdCk7CisgICAgICAgICAgICAgICAgICAgIE9QRU5TU0xfcG9ydF9mcmVlKHMtPnNlc3Npb24tPnRsc2V4dF9lY3BvaW50Zm9ybWF0bGlzdCk7CiAgICAgICAgICAgICAgICAgICAgIHMtPnNlc3Npb24tPnRsc2V4dF9lY3BvaW50Zm9ybWF0bGlzdCA9IE5VTEw7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHMtPnNlc3Npb24tPnRsc2V4dF9lY3BvaW50Zm9ybWF0bGlzdF9sZW5ndGggPSAwOwogICAgICAgICAgICAgICAgIGlmICgocy0+c2Vzc2lvbi0+dGxzZXh0X2VjcG9pbnRmb3JtYXRsaXN0ID0KLSAgICAgICAgICAgICAgICAgICAgIE9QRU5TU0xfbWFsbG9jKGVjcG9pbnRmb3JtYXRsaXN0X2xlbmd0aCkpID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgIE9QRU5TU0xfcG9ydF9tYWxsb2MoZWNwb2ludGZvcm1hdGxpc3RfbGVuZ3RoKSkgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICAqYWwgPSBUTFMxX0FEX0lOVEVSTkFMX0VSUk9SOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICB9CkBAIC0xMjMzLDcgKzEyMzMsNyBAQAogCiAgICAgICAgICAgICBpZiAocy0+czMtPmNsaWVudF9vcGFxdWVfcHJmX2lucHV0ICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAvKiBzaG91bGRuJ3QgcmVhbGx5IGhhcHBlbiAqLwotICAgICAgICAgICAgICAgIE9QRU5TU0xfZnJlZShzLT5zMy0+Y2xpZW50X29wYXF1ZV9wcmZfaW5wdXQpOworICAgICAgICAgICAgICAgIE9QRU5TU0xfcG9ydF9mcmVlKHMtPnMzLT5jbGllbnRfb3BhcXVlX3ByZl9pbnB1dCk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8qIGR1bW15IGJ5dGUganVzdCB0byBnZXQgbm9uLU5VTEwgKi8KQEAgLTEzOTksNyArMTM5OSw3IEBACiAgICAgfQogCiAgICAgLyogU3B1cmlvdXMgZGF0YSBvbiB0aGUgZW5kICovCi0gICAgaWYgKGRhdGEgIT0gZCArIG4pCisgICAgaWYgKGRhdGEgIT0gbGltaXQpCiAgICAgICAgIGdvdG8gZXJyOwogCiAgICAgKnAgPSBkYXRhOwpAQCAtMTUwMiw5ICsxNTAyLDkgQEAKICAgICAgICAgICAgIGlmICghcy0+aGl0KSB7CiAgICAgICAgICAgICAgICAgcy0+c2Vzc2lvbi0+dGxzZXh0X2VjcG9pbnRmb3JtYXRsaXN0X2xlbmd0aCA9IDA7CiAgICAgICAgICAgICAgICAgaWYgKHMtPnNlc3Npb24tPnRsc2V4dF9lY3BvaW50Zm9ybWF0bGlzdCAhPSBOVUxMKQotICAgICAgICAgICAgICAgICAgICBPUEVOU1NMX2ZyZWUocy0+c2Vzc2lvbi0+dGxzZXh0X2VjcG9pbnRmb3JtYXRsaXN0KTsKKyAgICAgICAgICAgICAgICAgICAgT1BFTlNTTF9wb3J0X2ZyZWUocy0+c2Vzc2lvbi0+dGxzZXh0X2VjcG9pbnRmb3JtYXRsaXN0KTsKICAgICAgICAgICAgICAgICBpZiAoKHMtPnNlc3Npb24tPnRsc2V4dF9lY3BvaW50Zm9ybWF0bGlzdCA9Ci0gICAgICAgICAgICAgICAgICAgICBPUEVOU1NMX21hbGxvYyhlY3BvaW50Zm9ybWF0bGlzdF9sZW5ndGgpKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICBPUEVOU1NMX3BvcnRfbWFsbG9jKGVjcG9pbnRmb3JtYXRsaXN0X2xlbmd0aCkpID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgKmFsID0gVExTMV9BRF9JTlRFUk5BTF9FUlJPUjsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgfQpAQCAtMTU1Niw3ICsxNTU2LDcgQEAKIAogICAgICAgICAgICAgaWYgKHMtPnMzLT5zZXJ2ZXJfb3BhcXVlX3ByZl9pbnB1dCAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgLyogc2hvdWxkbid0IHJlYWxseSBoYXBwZW4gKi8KLSAgICAgICAgICAgICAgICBPUEVOU1NMX2ZyZWUocy0+czMtPnNlcnZlcl9vcGFxdWVfcHJmX2lucHV0KTsKKyAgICAgICAgICAgICAgICBPUEVOU1NMX3BvcnRfZnJlZShzLT5zMy0+c2VydmVyX29wYXF1ZV9wcmZfaW5wdXQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHMtPnMzLT5zZXJ2ZXJfb3BhcXVlX3ByZl9pbnB1dF9sZW4gPT0gMCkgewogICAgICAgICAgICAgICAgIC8qIGR1bW15IGJ5dGUganVzdCB0byBnZXQgbm9uLU5VTEwgKi8KQEAgLTE3MjAsNyArMTcyMCw3IEBACiAgICAgdXNpbmdfZWNjID0gdXNpbmdfZWNjICYmIChzLT52ZXJzaW9uID49IFRMUzFfVkVSU0lPTik7CiAgICAgaWYgKHVzaW5nX2VjYykgewogICAgICAgICBpZiAocy0+dGxzZXh0X2VjcG9pbnRmb3JtYXRsaXN0ICE9IE5VTEwpCi0gICAgICAgICAgICBPUEVOU1NMX2ZyZWUocy0+dGxzZXh0X2VjcG9pbnRmb3JtYXRsaXN0KTsKKyAgICAgICAgICAgIE9QRU5TU0xfcG9ydF9mcmVlKHMtPnRsc2V4dF9lY3BvaW50Zm9ybWF0bGlzdCk7CiAgICAgICAgIGlmICgocy0+dGxzZXh0X2VjcG9pbnRmb3JtYXRsaXN0ID0gT1BFTlNTTF9tYWxsb2MoMykpID09IE5VTEwpIHsKICAgICAgICAgICAgIFNTTGVycihTU0xfRl9TU0xfUFJFUEFSRV9DTElFTlRIRUxMT19UTFNFWFQsCiAgICAgICAgICAgICAgICAgICAgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwpAQCAtMTczNSwxMSArMTczNSwxMSBAQAogCiAgICAgICAgIC8qIHdlIHN1cHBvcnQgYWxsIG5hbWVkIGVsbGlwdGljIGN1cnZlcyBpbiBSRkMgNDQ5MiAqLwogICAgICAgICBpZiAocy0+dGxzZXh0X2VsbGlwdGljY3VydmVsaXN0ICE9IE5VTEwpCi0gICAgICAgICAgICBPUEVOU1NMX2ZyZWUocy0+dGxzZXh0X2VsbGlwdGljY3VydmVsaXN0KTsKKyAgICAgICAgICAgIE9QRU5TU0xfcG9ydF9mcmVlKHMtPnRsc2V4dF9lbGxpcHRpY2N1cnZlbGlzdCk7CiAgICAgICAgIHMtPnRsc2V4dF9lbGxpcHRpY2N1cnZlbGlzdF9sZW5ndGggPQogICAgICAgICAgICAgc2l6ZW9mKHByZWZfbGlzdCkgLyBzaXplb2YocHJlZl9saXN0WzBdKSAqIDI7CiAgICAgICAgIGlmICgocy0+dGxzZXh0X2VsbGlwdGljY3VydmVsaXN0ID0KLSAgICAgICAgICAgICBPUEVOU1NMX21hbGxvYyhzLT50bHNleHRfZWxsaXB0aWNjdXJ2ZWxpc3RfbGVuZ3RoKSkgPT0gTlVMTCkgeworICAgICAgICAgICAgIE9QRU5TU0xfcG9ydF9tYWxsb2Mocy0+dGxzZXh0X2VsbGlwdGljY3VydmVsaXN0X2xlbmd0aCkpID09IE5VTEwpIHsKICAgICAgICAgICAgIHMtPnRsc2V4dF9lbGxpcHRpY2N1cnZlbGlzdF9sZW5ndGggPSAwOwogICAgICAgICAgICAgU1NMZXJyKFNTTF9GX1NTTF9QUkVQQVJFX0NMSUVOVEhFTExPX1RMU0VYVCwKICAgICAgICAgICAgICAgICAgICBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CkBAIC0xNzY4LDcgKzE3NjgsNyBAQAogICAgICAgICBpZiAocy0+dGxzZXh0X29wYXF1ZV9wcmZfaW5wdXQgIT0gTlVMTCkgewogICAgICAgICAgICAgaWYgKHMtPnMzLT5jbGllbnRfb3BhcXVlX3ByZl9pbnB1dCAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgLyogc2hvdWxkbid0IHJlYWxseSBoYXBwZW4gKi8KLSAgICAgICAgICAgICAgICBPUEVOU1NMX2ZyZWUocy0+czMtPmNsaWVudF9vcGFxdWVfcHJmX2lucHV0KTsKKyAgICAgICAgICAgICAgICBPUEVOU1NMX3BvcnRfZnJlZShzLT5zMy0+Y2xpZW50X29wYXF1ZV9wcmZfaW5wdXQpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAocy0+dGxzZXh0X29wYXF1ZV9wcmZfaW5wdXRfbGVuID09IDApIHsKQEAgLTE4MTgsNyArMTgxOCw3IEBACiAKICAgICBpZiAodXNpbmdfZWNjKSB7CiAgICAgICAgIGlmIChzLT50bHNleHRfZWNwb2ludGZvcm1hdGxpc3QgIT0gTlVMTCkKLSAgICAgICAgICAgIE9QRU5TU0xfZnJlZShzLT50bHNleHRfZWNwb2ludGZvcm1hdGxpc3QpOworICAgICAgICAgICAgT1BFTlNTTF9wb3J0X2ZyZWUocy0+dGxzZXh0X2VjcG9pbnRmb3JtYXRsaXN0KTsKICAgICAgICAgaWYgKChzLT50bHNleHRfZWNwb2ludGZvcm1hdGxpc3QgPSBPUEVOU1NMX21hbGxvYygzKSkgPT0gTlVMTCkgewogICAgICAgICAgICAgU1NMZXJyKFNTTF9GX1NTTF9QUkVQQVJFX1NFUlZFUkhFTExPX1RMU0VYVCwKICAgICAgICAgICAgICAgICAgICBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CkBAIC0xODg2LDcgKzE4ODYsNyBAQAogCiAgICAgICAgIGlmIChzLT5zMy0+c2VydmVyX29wYXF1ZV9wcmZfaW5wdXQgIT0gTlVMTCkgewogICAgICAgICAgICAgLyogc2hvdWxkbid0IHJlYWxseSBoYXBwZW4gKi8KLSAgICAgICAgICAgIE9QRU5TU0xfZnJlZShzLT5zMy0+c2VydmVyX29wYXF1ZV9wcmZfaW5wdXQpOworICAgICAgICAgICAgT1BFTlNTTF9wb3J0X2ZyZWUocy0+czMtPnNlcnZlcl9vcGFxdWVfcHJmX2lucHV0KTsKICAgICAgICAgfQogICAgICAgICBzLT5zMy0+c2VydmVyX29wYXF1ZV9wcmZfaW5wdXQgPSBOVUxMOwogCkBAIC0yMDg0LDIyICsyMDg0LDIwIEBACiAgICAgfQogIyBlbmRpZgogCisgICAgT1BFTlNTTF9wb3J0X2ZyZWUocy0+dGxzZXh0X29jc3BfcmVzcCk7CisgICAgcy0+dGxzZXh0X29jc3BfcmVzcCA9IE5VTEw7CisgICAgcy0+dGxzZXh0X29jc3BfcmVzcGxlbiA9IC0xOwogICAgIC8qCiAgICAgICogSWYgd2UndmUgcmVxdWVzdGVkIGNlcnRpZmljYXRlIHN0YXR1cyBhbmQgd2Ugd29udCBnZXQgb25lIHRlbGwgdGhlCiAgICAgICogY2FsbGJhY2sKICAgICAgKi8KICAgICBpZiAoKHMtPnRsc2V4dF9zdGF0dXNfdHlwZSAhPSAtMSkgJiYgIShzLT50bHNleHRfc3RhdHVzX2V4cGVjdGVkKQotICAgICAgICAmJiBzLT5jdHggJiYgcy0+Y3R4LT50bHNleHRfc3RhdHVzX2NiKSB7CisgICAgICAgICYmICEocy0+aGl0KSAmJiBzLT5jdHggJiYgcy0+Y3R4LT50bHNleHRfc3RhdHVzX2NiKSB7CiAgICAgICAgIGludCByOwogICAgICAgICAvKgotICAgICAgICAgKiBTZXQgcmVzcCB0byBOVUxMLCByZXNwbGVuIHRvIC0xIHNvIGNhbGxiYWNrIGtub3dzIHRoZXJlIGlzIG5vCi0gICAgICAgICAqIHJlc3BvbnNlLgorICAgICAgICAgKiBDYWxsIGNhbGxiYWNrIHdpdGggcmVzcCA9PSBOVUxMIGFuZCByZXNwbGVuID09IC0xIHNvIGNhbGxiYWNrCisgICAgICAgICAqIGtub3dzIHRoZXJlIGlzIG5vIHJlc3BvbnNlCiAgICAgICAgICAqLwotICAgICAgICBpZiAocy0+dGxzZXh0X29jc3BfcmVzcCkgewotICAgICAgICAgICAgT1BFTlNTTF9mcmVlKHMtPnRsc2V4dF9vY3NwX3Jlc3ApOwotICAgICAgICAgICAgcy0+dGxzZXh0X29jc3BfcmVzcCA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgcy0+dGxzZXh0X29jc3BfcmVzcGxlbiA9IC0xOwogICAgICAgICByID0gcy0+Y3R4LT50bHNleHRfc3RhdHVzX2NiKHMsIHMtPmN0eC0+dGxzZXh0X3N0YXR1c19hcmcpOwogICAgICAgICBpZiAociA9PSAwKSB7CiAgICAgICAgICAgICBhbCA9IFNTTF9BRF9CQURfQ0VSVElGSUNBVEVfU1RBVFVTX1JFU1BPTlNFOwpAQCAtMjI5NCwxMCArMjI5MiwxMyBAQAogICAgICAgICAvKiBDaGVjayBrZXkgbmFtZSBtYXRjaGVzICovCiAgICAgICAgIGlmIChPUEVOU1NMX3BvcnRfbWVtY21wKGV0aWNrLCB0Y3R4LT50bHNleHRfdGlja19rZXlfbmFtZSwgMTYpKQogICAgICAgICAgICAgcmV0dXJuIDI7Ci0gICAgICAgIEhNQUNfSW5pdF9leCgmaGN0eCwgdGN0eC0+dGxzZXh0X3RpY2tfaG1hY19rZXksIDE2LAotICAgICAgICAgICAgICAgICAgICAgdGxzZXh0X3RpY2tfbWQoKSwgTlVMTCk7Ci0gICAgICAgIEVWUF9EZWNyeXB0SW5pdF9leCgmY3R4LCBFVlBfYWVzXzEyOF9jYmMoKSwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjdHgtPnRsc2V4dF90aWNrX2Flc19rZXksIGV0aWNrICsgMTYpOworICAgICAgICBpZiAoSE1BQ19Jbml0X2V4KCZoY3R4LCB0Y3R4LT50bHNleHRfdGlja19obWFjX2tleSwgMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGxzZXh0X3RpY2tfbWQoKSwgTlVMTCkgPD0gMAorICAgICAgICAgICAgICAgIHx8IEVWUF9EZWNyeXB0SW5pdF9leCgmY3R4LCBFVlBfYWVzXzEyOF9jYmMoKSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGN0eC0+dGxzZXh0X3RpY2tfYWVzX2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXRpY2sgKyAxNikgPD0gMCkgeworICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgfQogICAgIH0KICAgICAvKgogICAgICAqIEF0dGVtcHQgdG8gcHJvY2VzcyBzZXNzaW9uIHRpY2tldCwgZmlyc3QgY29uZHVjdCBzYW5pdHkgYW5kIGludGVncml0eQpAQCAtMjMwNSwxMyArMjMwNiwxNCBAQAogICAgICAqLwogICAgIG1sZW4gPSBITUFDX3NpemUoJmhjdHgpOwogICAgIGlmIChtbGVuIDwgMCkgewotICAgICAgICBFVlBfQ0lQSEVSX0NUWF9jbGVhbnVwKCZjdHgpOwotICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGdvdG8gZXJyOwogICAgIH0KICAgICBldGlja2xlbiAtPSBtbGVuOwogICAgIC8qIENoZWNrIEhNQUMgb2YgZW5jcnlwdGVkIHRpY2tldCAqLwotICAgIEhNQUNfVXBkYXRlKCZoY3R4LCBldGljaywgZXRpY2tsZW4pOwotICAgIEhNQUNfRmluYWwoJmhjdHgsIHRpY2tfaG1hYywgTlVMTCk7CisgICAgaWYgKEhNQUNfVXBkYXRlKCZoY3R4LCBldGljaywgZXRpY2tsZW4pIDw9IDAKKyAgICAgICAgICAgIHx8IEhNQUNfRmluYWwoJmhjdHgsIHRpY2tfaG1hYywgTlVMTCkgPD0gMCkgeworICAgICAgICBnb3RvIGVycjsKKyAgICB9CiAgICAgSE1BQ19DVFhfY2xlYW51cCgmaGN0eCk7CiAgICAgaWYgKENSWVBUT19tZW1jbXAodGlja19obWFjLCBldGljayArIGV0aWNrbGVuLCBtbGVuKSkgewogICAgICAgICBFVlBfQ0lQSEVSX0NUWF9jbGVhbnVwKCZjdHgpOwpAQCAtMjMyMiwxNCArMjMyNCwxMyBAQAogICAgIHAgPSBldGljayArIDE2ICsgRVZQX0NJUEhFUl9DVFhfaXZfbGVuZ3RoKCZjdHgpOwogICAgIGV0aWNrbGVuIC09IDE2ICsgRVZQX0NJUEhFUl9DVFhfaXZfbGVuZ3RoKCZjdHgpOwogICAgIHNkZWMgPSBPUEVOU1NMX21hbGxvYyhldGlja2xlbik7Ci0gICAgaWYgKCFzZGVjKSB7CisgICAgaWYgKCFzZGVjIHx8IEVWUF9EZWNyeXB0VXBkYXRlKCZjdHgsIHNkZWMsICZzbGVuLCBwLCBldGlja2xlbikgPD0gMCkgewogICAgICAgICBFVlBfQ0lQSEVSX0NUWF9jbGVhbnVwKCZjdHgpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQotICAgIEVWUF9EZWNyeXB0VXBkYXRlKCZjdHgsIHNkZWMsICZzbGVuLCBwLCBldGlja2xlbik7CiAgICAgaWYgKEVWUF9EZWNyeXB0RmluYWwoJmN0eCwgc2RlYyArIHNsZW4sICZtbGVuKSA8PSAwKSB7CiAgICAgICAgIEVWUF9DSVBIRVJfQ1RYX2NsZWFudXAoJmN0eCk7Ci0gICAgICAgIE9QRU5TU0xfZnJlZShzZGVjKTsKKyAgICAgICAgT1BFTlNTTF9wb3J0X2ZyZWUoc2RlYyk7CiAgICAgICAgIHJldHVybiAyOwogICAgIH0KICAgICBzbGVuICs9IG1sZW47CkBAIC0yMzM3LDcgKzIzMzgsNyBAQAogICAgIHAgPSBzZGVjOwogCiAgICAgc2VzcyA9IGQyaV9TU0xfU0VTU0lPTihOVUxMLCAmcCwgc2xlbik7Ci0gICAgT1BFTlNTTF9mcmVlKHNkZWMpOworICAgIE9QRU5TU0xfcG9ydF9mcmVlKHNkZWMpOwogICAgIGlmIChzZXNzKSB7CiAgICAgICAgIC8qCiAgICAgICAgICAqIFRoZSBzZXNzaW9uIElELCBpZiBub24tZW1wdHksIGlzIHVzZWQgYnkgc29tZSBjbGllbnRzIHRvIGRldGVjdApAQCAtMjM1OSw2ICsyMzYwLDEwIEBACiAgICAgICogRm9yIHNlc3Npb24gcGFyc2UgZmFpbHVyZSwgaW5kaWNhdGUgdGhhdCB3ZSBuZWVkIHRvIHNlbmQgYSBuZXcgdGlja2V0LgogICAgICAqLwogICAgIHJldHVybiAyOworZXJyOgorICAgIEVWUF9DSVBIRVJfQ1RYX2NsZWFudXAoJmN0eCk7CisgICAgSE1BQ19DVFhfY2xlYW51cCgmaGN0eCk7CisgICAgcmV0dXJuIC0xOwogfQogCiAvKiBUYWJsZXMgdG8gdHJhbnNsYXRlIGZyb20gTklEcyB0byBUTFMgdjEuMiBpZHMgKi8KQEAgLTI1ODYsNyArMjU5MSw3IEBACiAgICAgICAgIGJwICs9IHBheWxvYWQ7CiAgICAgICAgIC8qIFJhbmRvbSBwYWRkaW5nICovCiAgICAgICAgIGlmIChSQU5EX3BzZXVkb19ieXRlcyhicCwgcGFkZGluZykgPCAwKSB7Ci0gICAgICAgICAgICBPUEVOU1NMX2ZyZWUoYnVmZmVyKTsKKyAgICAgICAgICAgIE9QRU5TU0xfcG9ydF9mcmVlKGJ1ZmZlcik7CiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KIApAQCAtMjU5OCw3ICsyNjAzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsIDMgKyBwYXlsb2FkICsgcGFkZGluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLCBzLT5tc2dfY2FsbGJhY2tfYXJnKTsKIAotICAgICAgICBPUEVOU1NMX2ZyZWUoYnVmZmVyKTsKKyAgICAgICAgT1BFTlNTTF9wb3J0X2ZyZWUoYnVmZmVyKTsKIAogICAgICAgICBpZiAociA8IDApCiAgICAgICAgICAgICByZXR1cm4gcjsKQEAgLTI2OTMsNyArMjY5OCw3IEBACiAgICAgfQogCiBlcnI6Ci0gICAgT1BFTlNTTF9mcmVlKGJ1Zik7CisgICAgT1BFTlNTTF9wb3J0X2ZyZWUoYnVmKTsKIAogICAgIHJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL3NzbC90bHMxLmggYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL3NzbC90bHMxLmgKaW5kZXggNjlkODE4Ni4uOTE1MDRiMSAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC9zc2wvdGxzMS5oCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvc3NsL3RsczEuaApAQCAtMjM1LDggKzIzNSw3IEBACiAKIC8qCiAgKiBFeHRlbnNpb25UeXBlIHZhbHVlIGZvciBUTFMgcGFkZGluZyBleHRlbnNpb24uCi0gKiBodHRwOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL3Rscy1leHRlbnNpb250eXBlLXZhbHVlcy90bHMtZXh0ZW5zaW9udHlwZS12YWx1ZXMueGh0bWwKLSAqIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL2RyYWZ0LWFnbC10bHMtcGFkZGluZy0wMworICogaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvZHJhZnQtYWdsLXRscy1wYWRkaW5nCiAgKi8KICMgZGVmaW5lIFRMU0VYVF9UWVBFX3BhZGRpbmcgICAgIDIxCiAKQEAgLTI2MSwyMCArMjYwLDE5IEBACiAjICBkZWZpbmUgVExTRVhUX1RZUEVfbmV4dF9wcm90b19uZWcgICAgICAgICAgICAgIDEzMTcyCiAjIGVuZGlmCiAKLS8qIE5hbWVUeXBlIHZhbHVlIGZyb20gUkZDIDM1NDYgKi8KKy8qIE5hbWVUeXBlIHZhbHVlIGZyb20gUkZDMzU0NiAqLwogIyBkZWZpbmUgVExTRVhUX05BTUVUWVBFX2hvc3RfbmFtZSAwCi0vKiBzdGF0dXMgcmVxdWVzdCB2YWx1ZSBmcm9tIFJGQyAzNTQ2ICovCisvKiBzdGF0dXMgcmVxdWVzdCB2YWx1ZSBmcm9tIFJGQzM1NDYgKi8KICMgZGVmaW5lIFRMU0VYVF9TVEFUVVNUWVBFX29jc3AgMQogCi0vKiBFQ1BvaW50Rm9ybWF0IHZhbHVlcyBmcm9tIGRyYWZ0LWlldGYtdGxzLWVjYy0xMiAqLworLyogRUNQb2ludEZvcm1hdCB2YWx1ZXMgZnJvbSBSRkM0NDkyICovCiAjIGRlZmluZSBUTFNFWFRfRUNQT0lOVEZPUk1BVF9maXJzdCAgICAgICAgICAgICAgICAgICAgICAwCiAjIGRlZmluZSBUTFNFWFRfRUNQT0lOVEZPUk1BVF91bmNvbXByZXNzZWQgICAgICAgICAgICAgICAwCiAjIGRlZmluZSBUTFNFWFRfRUNQT0lOVEZPUk1BVF9hbnNpWDk2Ml9jb21wcmVzc2VkX3ByaW1lICAxCiAjIGRlZmluZSBUTFNFWFRfRUNQT0lOVEZPUk1BVF9hbnNpWDk2Ml9jb21wcmVzc2VkX2NoYXIyICAyCiAjIGRlZmluZSBUTFNFWFRfRUNQT0lOVEZPUk1BVF9sYXN0ICAgICAgICAgICAgICAgICAgICAgICAyCiAKLS8qIFNpZ25hdHVyZSBhbmQgaGFzaCBhbGdvcml0aG1zIGZyb20gUkZDIDUyNDYgKi8KLQorLyogU2lnbmF0dXJlIGFuZCBoYXNoIGFsZ29yaXRobXMgZnJvbSBSRkM1MjQ2ICovCiAjIGRlZmluZSBUTFNFWFRfc2lnbmF0dXJlX2Fub255bW91cyAgICAgICAgICAgICAgICAgICAgICAwCiAjIGRlZmluZSBUTFNFWFRfc2lnbmF0dXJlX3JzYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCiAjIGRlZmluZSBUTFNFWFRfc2lnbmF0dXJlX2RzYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAyCkBAIC00MDQsNyArNDAyLDYgQEAKICMgZGVmaW5lIFRMUzFfQ0tfREhFX0RTU19XSVRIX1JDNF8xMjhfU0hBICAgICAgICAgICAgICAgIDB4MDMwMDAwNjYKIAogLyogQUVTIGNpcGhlcnN1aXRlcyBmcm9tIFJGQzMyNjggKi8KLQogIyBkZWZpbmUgVExTMV9DS19SU0FfV0lUSF9BRVNfMTI4X1NIQSAgICAgICAgICAgICAgICAgICAgMHgwMzAwMDAyRgogIyBkZWZpbmUgVExTMV9DS19ESF9EU1NfV0lUSF9BRVNfMTI4X1NIQSAgICAgICAgICAgICAgICAgMHgwMzAwMDAzMAogIyBkZWZpbmUgVExTMV9DS19ESF9SU0FfV0lUSF9BRVNfMTI4X1NIQSAgICAgICAgICAgICAgICAgMHgwMzAwMDAzMQpAQCAtNTcwLDcgKzU2Nyw3IEBACiAjIGRlZmluZSBUTFMxX1RYVF9ESEVfUlNBX1dJVEhfQUVTXzI1Nl9TSEEgICAgICAgICAgICAgICAiREhFLVJTQS1BRVMyNTYtU0hBIgogIyBkZWZpbmUgVExTMV9UWFRfQURIX1dJVEhfQUVTXzI1Nl9TSEEgICAgICAgICAgICAgICAgICAgIkFESC1BRVMyNTYtU0hBIgogCi0vKiBFQ0MgY2lwaGVyc3VpdGVzIGZyb20gZHJhZnQtaWV0Zi10bHMtZWNjLTAxLnR4dCAoTWFyIDE1LCAyMDAxKSAqLworLyogRUNDIGNpcGhlcnN1aXRlcyBmcm9tIFJGQzQ0OTIgKi8KICMgZGVmaW5lIFRMUzFfVFhUX0VDREhfRUNEU0FfV0lUSF9OVUxMX1NIQSAgICAgICAgICAgICAgICJFQ0RILUVDRFNBLU5VTEwtU0hBIgogIyBkZWZpbmUgVExTMV9UWFRfRUNESF9FQ0RTQV9XSVRIX1JDNF8xMjhfU0hBICAgICAgICAgICAgIkVDREgtRUNEU0EtUkM0LVNIQSIKICMgZGVmaW5lIFRMUzFfVFhUX0VDREhfRUNEU0FfV0lUSF9ERVNfMTkyX0NCQzNfU0hBICAgICAgICJFQ0RILUVDRFNBLURFUy1DQkMzLVNIQSIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvdGVzdC9NYWtlZmlsZSBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvdGVzdC9NYWtlZmlsZQppbmRleCBlY2ExNDAwLi4wYWZhZTE0IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL3Rlc3QvTWFrZWZpbGUKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC90ZXN0L01ha2VmaWxlCkBAIC02Nyw2ICs2Nyw3IEBACiBIRUFSVEJFQVRURVNUPSAgaGVhcnRiZWF0X3Rlc3QKIENPTlNUVElNRVRFU1Q9ICBjb25zdGFudF90aW1lX3Rlc3QKIFZFUklGWUVYVFJBVEVTVD0JdmVyaWZ5X2V4dHJhX3Rlc3QKK0NMSUVOVEhFTExPVEVTVD0JY2xpZW50aGVsbG90ZXN0CiAKIFRFU1RTPQkJYWxsdGVzdHMKIApAQCAtNzgsNyArNzksOCBAQAogCSQoUkFORFRFU1QpJChFWEVfRVhUKSAkKERIVEVTVCkkKEVYRV9FWFQpICQoRU5HSU5FVEVTVCkkKEVYRV9FWFQpIFwKIAkkKEJGVEVTVCkkKEVYRV9FWFQpICQoQ0FTVFRFU1QpJChFWEVfRVhUKSAkKFNTTFRFU1QpJChFWEVfRVhUKSAkKEVYUFRFU1QpJChFWEVfRVhUKSAkKERTQVRFU1QpJChFWEVfRVhUKSAkKFJTQVRFU1QpJChFWEVfRVhUKSBcCiAJJChFVlBURVNUKSQoRVhFX0VYVCkgJChFVlBFWFRSQVRFU1QpJChFWEVfRVhUKSAkKElHRVRFU1QpJChFWEVfRVhUKSAkKEpQQUtFVEVTVCkkKEVYRV9FWFQpICQoU1JQVEVTVCkkKEVYRV9FWFQpIFwKLQkkKEFTTjFURVNUKSQoRVhFX0VYVCkgJChIRUFSVEJFQVRURVNUKSQoRVhFX0VYVCkgJChDT05TVFRJTUVURVNUKSQoRVhFX0VYVCkgJChWRVJJRllFWFRSQVRFU1QpJChFWEVfRVhUKQorCSQoQVNOMVRFU1QpJChFWEVfRVhUKSAkKEhFQVJUQkVBVFRFU1QpJChFWEVfRVhUKSAkKENPTlNUVElNRVRFU1QpJChFWEVfRVhUKSAkKFZFUklGWUVYVFJBVEVTVCkkKEVYRV9FWFQpIFwKKwkkKENMSUVOVEhFTExPVEVTVCkkKEVYRV9FWFQpCiAKICMgJChNRVRIVEVTVCkkKEVYRV9FWFQpCiAKQEAgLTkxLDcgKzkzLDggQEAKIAkkKFJBTkRURVNUKS5vICQoREhURVNUKS5vICQoRU5HSU5FVEVTVCkubyAkKENBU1RURVNUKS5vIFwKIAkkKEJGVEVTVCkubyAgJChTU0xURVNUKS5vICAkKERTQVRFU1QpLm8gICQoRVhQVEVTVCkubyAkKFJTQVRFU1QpLm8gXAogCSQoRVZQVEVTVCkubyAkKEVWUEVYVFJBVEVTVCkubyAkKElHRVRFU1QpLm8gJChKUEFLRVRFU1QpLm8gJChBU04xVEVTVCkubyBcCi0JJChIRUFSVEJFQVRURVNUKS5vICQoQ09OU1RUSU1FVEVTVCkubyAkKFZFUklGWUVYVFJBVEVTVCkubworCSQoSEVBUlRCRUFUVEVTVCkubyAkKENPTlNUVElNRVRFU1QpLm8gJChWRVJJRllFWFRSQVRFU1QpLm8gXAorCSQoQ0xJRU5USEVMTE9URVNUKS5vCiAKIFNSQz0JJChCTlRFU1QpLmMgJChFQ1RFU1QpLmMgICQoRUNEU0FURVNUKS5jICQoRUNESFRFU1QpLmMgJChJREVBVEVTVCkuYyBcCiAJJChNRDJURVNUKS5jICAkKE1ENFRFU1QpLmMgJChNRDVURVNUKS5jIFwKQEAgLTEwMSw3ICsxMDQsOCBAQAogCSQoUkFORFRFU1QpLmMgJChESFRFU1QpLmMgJChFTkdJTkVURVNUKS5jICQoQ0FTVFRFU1QpLmMgXAogCSQoQkZURVNUKS5jICAkKFNTTFRFU1QpLmMgJChEU0FURVNUKS5jICAgJChFWFBURVNUKS5jICQoUlNBVEVTVCkuYyBcCiAJJChFVlBURVNUKS5jICQoRVZQRVhUUkFURVNUKS5jICQoSUdFVEVTVCkuYyAkKEpQQUtFVEVTVCkuYyAkKFNSUFRFU1QpLmMgJChBU04xVEVTVCkuYyBcCi0JJChIRUFSVEJFQVRURVNUKS5jICQoQ09OU1RUSU1FVEVTVCkuYyAkKFZFUklGWUVYVFJBVEVTVCkuYworCSQoSEVBUlRCRUFUVEVTVCkuYyAkKENPTlNUVElNRVRFU1QpLmMgJChWRVJJRllFWFRSQVRFU1QpLmMgXAorCSQoQ0xJRU5USEVMTE9URVNUKS5jCiAKIEVYSEVBREVSPSAKIEhFQURFUj0JJChFWEhFQURFUikKQEAgLTE0NCw3ICsxNDgsOCBAQAogCXRlc3RfZW5jIHRlc3RfeDUwOSB0ZXN0X3JzYSB0ZXN0X2NybCB0ZXN0X3NpZCBcCiAJdGVzdF9nZW4gdGVzdF9yZXEgdGVzdF9wa2NzNyB0ZXN0X3ZlcmlmeSB0ZXN0X2RoIHRlc3RfZHNhIFwKIAl0ZXN0X3NzIHRlc3RfY2EgdGVzdF9lbmdpbmUgdGVzdF9ldnAgdGVzdF9ldnBfZXh0cmEgdGVzdF9zc2wgdGVzdF90c2EgdGVzdF9pZ2UgXAotCXRlc3RfanBha2UgdGVzdF9zcnAgdGVzdF9jbXMgdGVzdF9oZWFydGJlYXQgdGVzdF9jb25zdGFudF90aW1lIHRlc3RfdmVyaWZ5X2V4dHJhCisJdGVzdF9qcGFrZSB0ZXN0X3NycCB0ZXN0X2NtcyB0ZXN0X2hlYXJ0YmVhdCB0ZXN0X2NvbnN0YW50X3RpbWUgdGVzdF92ZXJpZnlfZXh0cmEgXAorCXRlc3RfY2xpZW50aGVsbG8KIAogdGVzdF9ldnA6CiAJLi4vdXRpbC9zaGxpYl93cmFwLnNoIC4vJChFVlBURVNUKSBldnB0ZXN0cy50eHQKQEAgLTMzOSw2ICszNDQsMTAgQEAKIAlAZWNobyAkKFNUQVJUKSAkQAogCS4uL3V0aWwvc2hsaWJfd3JhcC5zaCAuLyQoVkVSSUZZRVhUUkFURVNUKQogCit0ZXN0X2NsaWVudGhlbGxvOiAkKENMSUVOVEhFTExPVEVTVCkkKEVYRV9FWFQpCisJQGVjaG8gJChTVEFSVCkgJEAKKwkuLi91dGlsL3NobGliX3dyYXAuc2ggLi8kKENMSUVOVEhFTExPVEVTVCkKKwogbGludDoKIAlsaW50IC1ETElOVCAkKElOQ0xVREVTKSAkKFNSQyk+Zmx1ZmYKIApAQCAtNTEwLDYgKzUxOSw5IEBACiAkKFZFUklGWUVYVFJBVEVTVCkkKEVYRV9FWFQpOiAkKFZFUklGWUVYVFJBVEVTVCkubwogCUB0YXJnZXQ9JChWRVJJRllFWFRSQVRFU1QpICQoQlVJTERfQ01EKQogCiskKENMSUVOVEhFTExPVEVTVCkkKEVYRV9FWFQpOiAkKENMSUVOVEhFTExPVEVTVCkubworCUB0YXJnZXQ9JChDTElFTlRIRUxMT1RFU1QpICQoQlVJTERfQ01EKQorCiAjJChBRVNURVNUKS5vOiAkKEFFU1RFU1QpLmMKICMJJChDQykgLWMgJChDRkxBR1MpIC1ESU5URVJNRURJQVRFX1ZBTFVFX0tBVCAtRFRSQUNFX0tBVF9NQ1QgJChBRVNURVNUKS5jCiAKQEAgLTU1NSw2ICs1NjcsMjYgQEAKIGJudGVzdC5vOiAuLi9pbmNsdWRlL29wZW5zc2wveDUwOS5oIC4uL2luY2x1ZGUvb3BlbnNzbC94NTA5X3ZmeS5oIGJudGVzdC5jCiBjYXN0dGVzdC5vOiAuLi9lX29zLmggLi4vaW5jbHVkZS9vcGVuc3NsL2Nhc3QuaCAuLi9pbmNsdWRlL29wZW5zc2wvZV9vczIuaAogY2FzdHRlc3QubzogLi4vaW5jbHVkZS9vcGVuc3NsL29wZW5zc2xjb25mLmggY2FzdHRlc3QuYworY2xpZW50aGVsbG90ZXN0Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9hc24xLmggLi4vaW5jbHVkZS9vcGVuc3NsL2Jpby5oCitjbGllbnRoZWxsb3Rlc3QubzogLi4vaW5jbHVkZS9vcGVuc3NsL2J1ZmZlci5oIC4uL2luY2x1ZGUvb3BlbnNzbC9jb21wLmgKK2NsaWVudGhlbGxvdGVzdC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvY3J5cHRvLmggLi4vaW5jbHVkZS9vcGVuc3NsL2R0bHMxLmgKK2NsaWVudGhlbGxvdGVzdC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvZV9vczIuaCAuLi9pbmNsdWRlL29wZW5zc2wvZWMuaAorY2xpZW50aGVsbG90ZXN0Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9lY2RoLmggLi4vaW5jbHVkZS9vcGVuc3NsL2VjZHNhLmgKK2NsaWVudGhlbGxvdGVzdC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvZXJyLmggLi4vaW5jbHVkZS9vcGVuc3NsL2V2cC5oCitjbGllbnRoZWxsb3Rlc3QubzogLi4vaW5jbHVkZS9vcGVuc3NsL2htYWMuaCAuLi9pbmNsdWRlL29wZW5zc2wva3NzbC5oCitjbGllbnRoZWxsb3Rlc3QubzogLi4vaW5jbHVkZS9vcGVuc3NsL2xoYXNoLmggLi4vaW5jbHVkZS9vcGVuc3NsL29ial9tYWMuaAorY2xpZW50aGVsbG90ZXN0Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9vYmplY3RzLmgKK2NsaWVudGhlbGxvdGVzdC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvb3BlbnNzbGNvbmYuaAorY2xpZW50aGVsbG90ZXN0Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9vcGVuc3Nsdi5oIC4uL2luY2x1ZGUvb3BlbnNzbC9vc3NsX3R5cC5oCitjbGllbnRoZWxsb3Rlc3QubzogLi4vaW5jbHVkZS9vcGVuc3NsL3BlbS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9wZW0yLmgKK2NsaWVudGhlbGxvdGVzdC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvcGtjczcuaCAuLi9pbmNsdWRlL29wZW5zc2wvcHF1ZXVlLmgKK2NsaWVudGhlbGxvdGVzdC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvc2FmZXN0YWNrLmggLi4vaW5jbHVkZS9vcGVuc3NsL3NoYS5oCitjbGllbnRoZWxsb3Rlc3QubzogLi4vaW5jbHVkZS9vcGVuc3NsL3NydHAuaCAuLi9pbmNsdWRlL29wZW5zc2wvc3NsLmgKK2NsaWVudGhlbGxvdGVzdC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvc3NsMi5oIC4uL2luY2x1ZGUvb3BlbnNzbC9zc2wyMy5oCitjbGllbnRoZWxsb3Rlc3QubzogLi4vaW5jbHVkZS9vcGVuc3NsL3NzbDMuaCAuLi9pbmNsdWRlL29wZW5zc2wvc3RhY2suaAorY2xpZW50aGVsbG90ZXN0Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9zeW1oYWNrcy5oIC4uL2luY2x1ZGUvb3BlbnNzbC90bHMxLmgKK2NsaWVudGhlbGxvdGVzdC5vOiAuLi9pbmNsdWRlL29wZW5zc2wveDUwOS5oIC4uL2luY2x1ZGUvb3BlbnNzbC94NTA5X3ZmeS5oCitjbGllbnRoZWxsb3Rlc3QubzogY2xpZW50aGVsbG90ZXN0LmMKIGNvbnN0YW50X3RpbWVfdGVzdC5vOiAuLi9jcnlwdG8vY29uc3RhbnRfdGltZV9sb2NsLmggLi4vZV9vcy5oCiBjb25zdGFudF90aW1lX3Rlc3QubzogLi4vaW5jbHVkZS9vcGVuc3NsL2Vfb3MyLmgKIGNvbnN0YW50X3RpbWVfdGVzdC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvb3BlbnNzbGNvbmYuaCBjb25zdGFudF90aW1lX3Rlc3QuYwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC90ZXN0L2lnZXRlc3QuYyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvdGVzdC9pZ2V0ZXN0LmMKaW5kZXggMGM3YjM1Ny4uMDhmMzYxYSAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC90ZXN0L2lnZXRlc3QuYworKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL3Rlc3QvaWdldGVzdC5jCkBAIC0xLDQgKzEsNCBAQAotLyogdGVzdC9pZ2V0ZXN0LmMgLSotIG1vZGU6QzsgYy1maWxlLXN0eWxlOiAiZWF5IiAtKi0gKi8KKy8qIHRlc3QvaWdldGVzdC5jICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICogQ29weXJpZ2h0IChjKSAyMDA2IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvdXRpbC9pbmRlbnQucHJvIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC91dGlsL2luZGVudC5wcm8KaW5kZXggZTg3MTQzMS4uNGRjZGE1ZCAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC91dGlsL2luZGVudC5wcm8KKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC91dGlsL2luZGVudC5wcm8KQEAgLTc0OSwzICs3NDksMTkgQEAKIC1UIHNzbF90cmFjZV90YmwKIC1UIF9zdGRjYWxsCiAtVCB0bHMxMl9sb29rdXAKKy1UIE9QVElPTlMKKy1UIE9QVF9QQUlSCistVCB1aW50NjRfdAorLVQgaW50NjRfdAorLVQgdWludDMyX3QKKy1UIGludDMyX3QKKy1UIHVpbnQxNl90CistVCBpbnQxNl90CistVCB1aW50OF90CistVCBpbnQ4X3QKKy1UIFNUUklOVF9QQUlSCistVCBmZWxlbQorLVQgZmVsZW1fYnl0ZWFycmF5CistVCBTSF9MSVNUCistVCBQQUNLRVQKKy1UIFJFQ09SRF9MQVlFUgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC91dGlsL21rMW1mLnBsIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC91dGlsL21rMW1mLnBsCmluZGV4IDFlZWU3YWEuLjViODZhYTcgMTAwNzU1Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvdXRpbC9tazFtZi5wbAorKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL3V0aWwvbWsxbWYucGwKQEAgLTQyNCw3ICs0MjQsNyBAQAogJGRlZnM9IDw8IkVPRiI7CiAjIFRoaXMgbWFrZWZpbGUgaGFzIGJlZW4gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZnJvbSB0aGUgT3BlblNTTCBkaXN0cmlidXRpb24uCiAjIFRoaXMgc2luZ2xlIG1ha2VmaWxlIHdpbGwgYnVpbGQgdGhlIGNvbXBsZXRlIE9wZW5TU0wgZGlzdHJpYnV0aW9uIGFuZAotIyBieSBkZWZhdWx0IGxlYXZlIHRoZSAnaW50ZXJ0ZXN0aW5nJyBvdXRwdXQgZmlsZXMgaW4gLiR7b31vdXQgYW5kIHRoZSBzdHVmZgorIyBieSBkZWZhdWx0IGxlYXZlIHRoZSAnaW50ZXJlc3RpbmcnIG91dHB1dCBmaWxlcyBpbiAuJHtvfW91dCBhbmQgdGhlIHN0dWZmCiAjIHRoYXQgbmVlZHMgZGVsZXRpbmcgaW4gLiR7b310bXAuCiAjIFRoZSBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgcnVubmluZyAnbWFrZSBtYWtlZmlsZS5vbmUnLCB3aGljaAogIyBkb2VzIGEgJ21ha2UgZmlsZXMnLCB3aGljaCB3cml0ZXMgYWxsIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBhbGwKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvdXRpbC9ta3JjLnBsIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC91dGlsL21rcmMucGwKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCAwY2VhZGNmLi44M2VlNmE0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvdXRpbC9ta3JjLnBsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvdXRpbC9ta3JjLnBsCkBAIC01Nyw3ICs1Nyw3IEBACiAgICAgICAgICAgICBWQUxVRSAiUHJvZHVjdFZlcnNpb24iLCAiJHZlcnNpb25cXDAiCiAgICAgICAgICAgICAvLyBPcHRpb25hbDoKICAgICAgICAgICAgIC8vVkFMVUUgIkNvbW1lbnRzIiwgIlxcMCIKLSAgICAgICAgICAgIFZBTFVFICJMZWdhbENvcHlyaWdodCIsICJDb3B5cmlnaHQgqSAxOTk4LTIwMDYgVGhlIE9wZW5TU0wgUHJvamVjdC4gQ29weXJpZ2h0IKkgMTk5NS0xOTk4IEVyaWMgQS4gWW91bmcsIFRpbSBKLiBIdWRzb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXFwwIgorICAgICAgICAgICAgVkFMVUUgIkxlZ2FsQ29weXJpZ2h0IiwgIkNvcHlyaWdodCDCqSAxOTk4LTIwMDYgVGhlIE9wZW5TU0wgUHJvamVjdC4gQ29weXJpZ2h0IMKpIDE5OTUtMTk5OCBFcmljIEEuIFlvdW5nLCBUaW0gSi4gSHVkc29uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxcMCIKICAgICAgICAgICAgIC8vVkFMVUUgIkxlZ2FsVHJhZGVtYXJrcyIsICJcXDAiCiAgICAgICAgICAgICAvL1ZBTFVFICJQcml2YXRlQnVpbGQiLCAiXFwwIgogICAgICAgICAgICAgLy9WQUxVRSAiU3BlY2lhbEJ1aWxkIiwgIlxcMCIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvdXRpbC9ta3N0YWNrLnBsIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC91dGlsL21rc3RhY2sucGwKaW5kZXggZjcwODYxMC4uYTg2ZDkxZiAxMDA3NTUKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC91dGlsL21rc3RhY2sucGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC91dGlsL21rc3RhY2sucGwKQEAgLTk3LDcgKzk3LDcgQEAKIEVPRgogCX0KIAotCWZvcmVhY2ggJHR5cGVfdGhpbmcgKHNvcnQgQHNzdGFja2xzdCkgeworICAgIGZvcmVhY2ggJHR5cGVfdGhpbmcgKHNvcnQgeyAkYS0+WzBdIGNtcCAkYi0+WzBdfSBAc3N0YWNrbHN0KSB7CiAJICAgIG15ICR0MSA9ICR0eXBlX3RoaW5nLT5bMF07CiAJICAgIG15ICR0MiA9ICR0eXBlX3RoaW5nLT5bMV07CiAJICAgICRuZXdfc3RhY2tmaWxlIC49IDw8RU9GOwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC91dGlsL3BsL1ZDLTMyLnBsIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC91dGlsL3BsL1ZDLTMyLnBsCmluZGV4IGI1OTc5OTguLjg4ZjBmN2EgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvdXRpbC9wbC9WQy0zMi5wbAorKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL3V0aWwvcGwvVkMtMzIucGwKQEAgLTM0MiwxNSArMzQyLDIxIEBACiAJbG9jYWwoJHJldCwkXyk7CiAJJGZpbGUgPX4gcy9cLy8kby9nIGlmICRvIG5lICcvJzsKIAkkbj0mYm5hbWUoJHRhcmdldCk7Ci0JJHJldC49IiR0YXJnZXQ6ICRmaWxlcyAkZGVwX2xpYnNcbiI7CisJJHJldC49IiR0YXJnZXQ6ICRmaWxlcyAkZGVwX2xpYnMiOwogCWlmICgkc3RhbmRhbG9uZSA9PSAxKQogCQl7CisJCSRyZXQuPSIgXCQoT0JKX0QpJHtvfWFwcGxpbmsub2JqIiBpZiAkc2hsaWI7CisJCSRyZXQuPSJcbiI7CiAJCSRyZXQuPSIgIFwkKExJTkspIFwkKExGTEFHUykgJGVmaWxlJHRhcmdldCBAPDxcblx0IjsKLQkJJHJldC49ICJcJChFWF9MSUJTKSAiIGlmICgkZmlsZXMgPX4gL09fRklQU0NBTklTVEVSLyAmJiAhJGZpcHNjYW5pc3RlcmJ1aWxkKTsKKwkJaWYgKCRmaWxlcyA9fiAvT19GSVBTQ0FOSVNURVIvICYmICEkZmlwc2NhbmlzdGVyYnVpbGQpIHsKKwkJCSRyZXQuPSAiXCQoRVhfTElCUykgIjsKKwkJCSRyZXQuPSAiXCQoT0JKX0QpJHtvfWFwcGxpbmsub2JqICIgaWYgJHNobGliOworCQl9CiAJCSRyZXQuPSIkZmlsZXMgJGxpYnNcbjw8XG4iOwogCQl9CiAJZWxzaWYgKCRzdGFuZGFsb25lID09IDIpCiAJCXsKKwkJJHJldC49IlxuIjsKIAkJJHJldC49Ilx0U0VUIEZJUFNfTElOSz1cJChMSU5LKVxuIjsKIAkJJHJldC49Ilx0U0VUIEZJUFNfQ0M9XCQoQ0MpXG4iOwogCQkkcmV0Lj0iXHRTRVQgRklQU19DQ19BUkdTPS9Gb1wkKE9CSl9EKSR7b31maXBzX3ByZW1haW4ub2JqIFwkKFNITElCX0NGTEFHUykgLWNcbiI7CkBAIC0zNjMsNiArMzY5LDcgQEAKIAkJfQogCWVsc2UKIAkJeworCQkkcmV0Lj0iXG4iOwogCQkkcmV0Lj0iXHRcJChMSU5LKSBcJChMRkxBR1MpICRlZmlsZSR0YXJnZXQgQDw8XG4iOwogCQkkcmV0Lj0iXHRcJChBUFBfRVhfT0JKKSAkZmlsZXMgJGxpYnNcbjw8XG4iOwogCQl9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL3V0aWwvc2VsZnRlc3QucGwgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL3V0aWwvc2VsZnRlc3QucGwKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA3YjMyZTlmLi41OTg0MmVmCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wvdXRpbC9zZWxmdGVzdC5wbAorKysgYi9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL3V0aWwvc2VsZnRlc3QucGwKQEAgLTE5OSwzICsxOTksNCBAQAogfQogcHJpbnQgIlxuVGVzdCByZXBvcnQgaW4gZmlsZSAkcmVwb3J0XG4iOwogCitkaWUgaWYgJG9rICE9IDI7CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsL3V0aWwvdG91dGY4LnNoIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC91dGlsL3RvdXRmOC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTQyNTRiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC91dGlsL3RvdXRmOC5zaApAQCAtMCwwICsxLDE3IEBACisjISAvYmluL3NoCisjCisjIFZlcnkgc2ltcGxlIHNjcmlwdCB0byBkZXRlY3QgYW5kIGNvbnZlcnQgZmlsZXMgdGhhdCB3ZSB3YW50IHRvIHJlLWVuY29kZSB0byBVVEY4CisKK2dpdCBscy10cmVlIC1yIC0tbmFtZS1vbmx5IEhFQUQgfCBcCisgICAgd2hpbGUgcmVhZCBGOyBkbworCWNoYXJzZXQ9YGZpbGUgLWJpICIkRiIgfCBzZWQgLWUgJ3N8LipjaGFyc2V0PXx8J2AKKwlpZiBbICIkY2hhcnNldCIgIT0gInV0Zi04IiAtYSAiJGNoYXJzZXQiICE9ICJiaW5hcnkiIC1hICIkY2hhcnNldCIgIT0gInVzLWFzY2lpIiBdOyB0aGVuCisJICAgIGljb252IC1mIElTTy04ODU5LTEgLXQgVVRGOCA8ICIkRiIgPiAiJEYudXRmOCIgJiYgXAorCQkoIGNtcCAtcyAiJEYiICIkRi51dGY4IiB8fCBcCisJCQkoIGVjaG8gIiRGIgorCQkJICBtdiAiJEYiICIkRi5pc28tODg1OS0xIgorCQkJICBtdiAiJEYudXRmOCIgIiRGIgorCQkJKQorCQkpCisJZmkKKyAgICBkb25lCmRpZmYgLS1naXQgYS9zcmMvdG9vbHMvY2xhbmcvc2NyaXB0cy91cGRhdGUucHkgYi9zcmMvdG9vbHMvY2xhbmcvc2NyaXB0cy91cGRhdGUucHkKaW5kZXggZGRkOTA5OC4uNzg1YTBkOCAxMDA3NTUKLS0tIGEvc3JjL3Rvb2xzL2NsYW5nL3NjcmlwdHMvdXBkYXRlLnB5CisrKyBiL3NyYy90b29scy9jbGFuZy9zY3JpcHRzL3VwZGF0ZS5weQpAQCAtNDIxLDcgKzQyMSw3IEBACiAKIAogIyBDbG9iYmVyIHRoZSBvdXQvIGZvbGRlciBmb3IgY29uZmlncyB0aGF0IHVzZSBjbGFuZy4KLWRlZiBDbG9iYmVyT3V0Rm9sZGVyRm9yQ2xhbmcoKToKK2RlZiBDbG9iYmVyT3V0Rm9sZGVyRm9yQ2xhbmcodG9vbGNoYWluX3RpbWVzdGFtcCk6CiAgIHNob3VsZF93aXBlX291dF9mb2xkZXIgPSBOb25lCiAKICAgZGlyZWN0b3J5X25hbWVfb2ZfY3VycmVudF9maWxlID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguYWJzcGF0aChfX2ZpbGVfXykpCkBAIC00MzUsMTkgKzQzNSwxMiBAQAogICBvdXRfc3ViZGlycyA9IFtvcy5wYXRoLmpvaW4ob3V0X2RpciwgZCkKICAgICAgICAgICAgICAgICAgZm9yIGQgaW4gb3MubGlzdGRpcihvdXRfZGlyKV0KICAgZm9yIGJ1aWxkX2ZvbGRlciBpbiBmaWx0ZXIob3MucGF0aC5pc2Rpciwgb3V0X3N1YmRpcnMpOgotICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4oYnVpbGRfZm9sZGVyLCAnYnVpbGQubmluamEnKSk6CisgICAgYnVpbGRfZmlsZSA9IG9zLnBhdGguam9pbihidWlsZF9mb2xkZXIsICdidWlsZC5uaW5qYScpCisKKyAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoYnVpbGRfZmlsZSk6CiAgICAgICBjb250aW51ZQogCi0gICAgcGFja2FnZV92ZXJzaW9uX2ZpbGVuYW1lID0gb3MucGF0aC5qb2luKGJ1aWxkX2ZvbGRlciwgJ2NyX2J1aWxkX3JldmlzaW9uJykKLSAgICBwYWNrYWdlX3ZlcnNpb24gPSBOb25lCi0gICAgdHJ5OgotICAgICAgd2l0aCBvcGVuKHBhY2thZ2VfdmVyc2lvbl9maWxlbmFtZSwgJ3InKSBhcyBmOgotICAgICAgICBwYWNrYWdlX3ZlcnNpb24gPSBmLnJlYWQoKQotICAgIGV4Y2VwdCBJT0Vycm9yOgotICAgICAgIyBGaWxlIGRvZXMgbm90IGV4aXN0Ci0gICAgICBwYXNzCi0KLSAgICBpZiBwYWNrYWdlX3ZlcnNpb24gPT0gUEFDS0FHRV9WRVJTSU9OOgorICAgIGlmIG9zLnBhdGguZ2V0bXRpbWUoYnVpbGRfZmlsZSkgPj0gdG9vbGNoYWluX3RpbWVzdGFtcDoKICAgICAgIGNvbnRpbnVlCiAKICAgICBpZiBzaG91bGRfd2lwZV9vdXRfZm9sZGVyIGlzIE5vbmU6CkBAIC00NTgsOCArNDUxLDEwIEBACiAKICAgICBSdW5Db21tYW5kKFsnbmluamEnLCAnLUMnLCBidWlsZF9mb2xkZXIsICctdCcsICdjbGVhbiddKQogCi0gICAgd2l0aCBvcGVuKHBhY2thZ2VfdmVyc2lvbl9maWxlbmFtZSwgJ3cnKSBhcyBmOgotICAgICAgZi53cml0ZShQQUNLQUdFX1ZFUlNJT04pCisgICAgIyBVcGRhdGUgdGhlIGJ1aWxkIGZpbGUncyB0aW1lc3RhbXAgdG8gc2lnbmFsIHRoYXQgdGhpcyBmb2xkZXIgaXMgbm93CisgICAgIyB1cC10by1kYXRlLiBUaGUgZ3lwIHN0ZXAgd2lsbCB3cml0ZSBuZXcgYnVpbGQgZmlsZXMgYW55d2F5LCBidXQgdGhpcyBtYXkKKyAgICAjIGJlIGEgY29uZmlnIHdoaWNoIGlzIE5PVCBiZWluZyBneXAnZC4KKyAgICBvcy51dGltZShidWlsZF9maWxlLCAodG9vbGNoYWluX3RpbWVzdGFtcCwgdG9vbGNoYWluX3RpbWVzdGFtcCkpCiAKIAogZGVmIFVwZGF0ZUNsYW5nKGFyZ3MpOgpAQCAtNDY3LDEyICs0NjIsMTIgQEAKICAgIyBSZXF1aXJlZCBmb3IgTFRPLCB3aGljaCBpcyB1c2VkIHdoZW4gaXNfb2ZmaWNpYWxfYnVpbGQgPSB0cnVlLgogICBuZWVkX2dvbGRfcGx1Z2luID0gc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2xpbnV4JykKIAotICBDbG9iYmVyT3V0Rm9sZGVyRm9yQ2xhbmcoKQotCiAgIGlmIFJlYWRTdGFtcEZpbGUoCiAgICAgICBTVEFNUF9GSUxFKSA9PSBQQUNLQUdFX1ZFUlNJT04gYW5kIG5vdCBhcmdzLmZvcmNlX2xvY2FsX2J1aWxkOgogICAgIGlmIG5vdCBuZWVkX2dvbGRfcGx1Z2luIG9yIG9zLnBhdGguZXhpc3RzKAogICAgICAgICBvcy5wYXRoLmpvaW4oTExWTV9CVUlMRF9ESVIsICJsaWIvTExWTWdvbGQuc28iKSk6CisgICAgICAjIEFsd2F5cyBjaGVjayB0byBjbG9iYmVyIHN0YWxlIGJ1aWxkcy4KKyAgICAgIENsb2JiZXJPdXRGb2xkZXJGb3JDbGFuZyhvcy5wYXRoLmdldG10aW1lKFNUQU1QX0ZJTEUpKQogICAgICAgcmV0dXJuIDAKIAogICBwcmludCAnVXBkYXRpbmcgQ2xhbmcgdG8gJXMuLi4nICUgUEFDS0FHRV9WRVJTSU9OCkBAIC01MDYsNiArNTAxLDcgQEAKICAgICAgICAgICAgIExMVk1fQlVJTERfRElSLCBQQUNLQUdFX1ZFUlNJT04KICAgICAgICAgXSkKICAgICAgIFdyaXRlU3RhbXBGaWxlKFBBQ0tBR0VfVkVSU0lPTiwgU1RBTVBfRklMRSkKKyAgICAgIENsb2JiZXJPdXRGb2xkZXJGb3JDbGFuZyhvcy5wYXRoLmdldG10aW1lKFNUQU1QX0ZJTEUpKQogICAgICAgcmV0dXJuIDAKICAgICBleGNlcHQgdXJsbGliMi5VUkxFcnJvcjoKICAgICAgIHByaW50ICdGYWlsZWQgdG8gZG93bmxvYWQgcHJlYnVpbHQgY2xhbmcgJXMnICUgY2RzX2ZpbGUKQEAgLTkwNiw2ICs5MDIsNyBAQAogICAgIFJ1bkNvbW1hbmQoWyduaW5qYScsICdjaGVjay1hbGwnXSwgbXN2Y19hcmNoPSd4NjQnKQogCiAgIFdyaXRlU3RhbXBGaWxlKFBBQ0tBR0VfVkVSU0lPTiwgU1RBTVBfRklMRSkKKyAgQ2xvYmJlck91dEZvbGRlckZvckNsYW5nKG9zLnBhdGguZ2V0bXRpbWUoU1RBTVBfRklMRSkpCiAgIHByaW50ICdDbGFuZyB1cGRhdGUgd2FzIHN1Y2Nlc3NmdWwuJwogICByZXR1cm4gMAogCmRpZmYgLS1naXQgYS9zcmMvdG9vbHMvZ3lwL3B5bGliL2d5cC9nZW5lcmF0b3IvbmluamEucHkgYi9zcmMvdG9vbHMvZ3lwL3B5bGliL2d5cC9nZW5lcmF0b3IvbmluamEucHkKaW5kZXggZTRlYWE4NC4uNTNhMDA4MSAxMDA3NTUKLS0tIGEvc3JjL3Rvb2xzL2d5cC9weWxpYi9neXAvZ2VuZXJhdG9yL25pbmphLnB5CisrKyBiL3NyYy90b29scy9neXAvcHlsaWIvZ3lwL2dlbmVyYXRvci9uaW5qYS5weQpAQCAtNzYsNiArNzYsMTAgQEAKIGlzX2xpbnV4ID0gcGxhdGZvcm0uc3lzdGVtKCkgPT0gJ0xpbnV4JwogaXNfd2luZG93cyA9IHBsYXRmb3JtLnN5c3RlbSgpID09ICdXaW5kb3dzJwogCittaWNyb3NvZnRfZmxhdm9ycyA9IFsnd2luJywgJ3hiMScsICd4YjEtZnV0dXJlJ10KK3NvbnlfZmxhdm9ycyA9IFsncHMzJywgJ3BzNCddCit3aW5kb3dzX2hvc3RfZmxhdm9ycyA9IG1pY3Jvc29mdF9mbGF2b3JzICsgc29ueV9mbGF2b3JzCisKIGRlZiBTdHJpcFByZWZpeChhcmcsIHByZWZpeCk6CiAgIGlmIGFyZy5zdGFydHN3aXRoKHByZWZpeCk6CiAgICAgcmV0dXJuIGFyZ1tsZW4ocHJlZml4KTpdCkBAIC04OSw5ICs5Myw5IEBACiAgICMgd2hpdGVsaXN0IGNvbW1vbiBPSyBvbmVzIGFuZCBxdW90ZSBhbnl0aGluZyBlbHNlLgogICBpZiByZS5tYXRjaChyJ15bYS16QS1aMC05Xz0uXFwvLV0rJCcsIGFyZyk6CiAgICAgcmV0dXJuIGFyZyAgIyBObyBxdW90aW5nIG5lY2Vzc2FyeS4KLSAgaWYgZmxhdm9yIGluIFsnd2luJywgJ3hiMSddOgorICBpZiBmbGF2b3IgaW4gbWljcm9zb2Z0X2ZsYXZvcnM6CiAgICAgcmV0dXJuIGd5cC5tc3ZzX2VtdWxhdGlvbi5RdW90ZUZvclJzcEZpbGUoYXJnKQotICBlbGlmIGZsYXZvciBpbiBbJ3BzMycsICdwczQnXSA6CisgIGVsaWYgZmxhdm9yIGluIHNvbnlfZmxhdm9ycyA6CiAgICAgIyBFc2NhcGUgZG91YmxlIHF1b3Rlcy4KICAgICByZXR1cm4gJyInICsgYXJnLnJlcGxhY2UoJ1wiJywgJ1xcXCInKSArICciJwogICByZXR1cm4gIiciICsgYXJnLnJlcGxhY2UoIiciLCAiJyIgKyAnIlwnIicgKyAiJyIpICArICInIgpAQCAtMTAwLDcgKzEwNCw3IEBACiBkZWYgRGVmaW5lKGQsIGZsYXZvcik6CiAgICIiIlRha2VzIGEgcHJlcHJvY2Vzc29yIGRlZmluZSBhbmQgcmV0dXJucyBhIC1EIHBhcmFtZXRlciB0aGF0J3MgbmluamEtIGFuZAogICBzaGVsbC1lc2NhcGVkLiIiIgotICBpZiBmbGF2b3IgaW4gWyd3aW4nLCAneGIxJ106CisgIGlmIGZsYXZvciBpbiBtaWNyb3NvZnRfZmxhdm9yczoKICAgICAjIGNsLmV4ZSByZXBsYWNlcyBsaXRlcmFsICMgY2hhcmFjdGVycyB3aXRoID0gaW4gcHJlcHJvY2Vzb3IgZGVmaW5pdGlvbnMgZm9yCiAgICAgIyBzb21lIHJlYXNvbi4gT2N0YWwtZW5jb2RlIHRvIHdvcmsgYXJvdW5kIHRoYXQuCiAgICAgZCA9IGQucmVwbGFjZSgnIycsICdcXCUwM28nICUgb3JkKCcjJykpCkBAIC0xODMsNyArMTg3LDcgQEAKICAgICAjIEZvciBidW5kbGVzLCB0aGUgLlRPQyBzaG91bGQgYmUgcHJvZHVjZWQgZm9yIHRoZSBiaW5hcnksIG5vdCBmb3IKICAgICAjIEZpbmFsT3V0cHV0KCkuIEJ1dCB0aGUgbmFpdmUgYXBwcm9hY2ggd291bGQgcHV0IHRoZSBUT0MgZmlsZSBpbnRvIHRoZQogICAgICMgYnVuZGxlLCBzbyBkb24ndCBkbyB0aGlzIGZvciBidW5kbGVzIGZvciBub3cuCi0gICAgaWYgZmxhdm9yIGluIFsnd2luJywgJ3hiMScsICdwczMnLCAncHM0J10gb3Igc2VsZi5idW5kbGU6CisgICAgaWYgZmxhdm9yIGluIHdpbmRvd3NfaG9zdF9mbGF2b3JzIG9yIHNlbGYuYnVuZGxlOgogICAgICAgcmV0dXJuIEZhbHNlCiAgICAgcmV0dXJuIHNlbGYudHlwZSBpbiAoJ3NoYXJlZF9saWJyYXJ5JywgJ2xvYWRhYmxlX21vZHVsZScpCiAKQEAgLTI1MSw3ICsyNTUsNyBAQAogCiAgICAgc2VsZi5hYnNfYnVpbGRfZGlyID0gYWJzX2J1aWxkX2RpcgogICAgIHNlbGYub2JqX2V4dCA9ICcub2JqJyBpZiBmbGF2b3IgPT0gJ3dpbicgZWxzZSAnLm8nCi0gICAgaWYgZmxhdm9yIGluIFsnd2luJywgJ3BzMycsICd4YjEnLCAncHM0J106CisgICAgaWYgZmxhdm9yIGluIHdpbmRvd3NfaG9zdF9mbGF2b3JzOgogICAgICAgIyBTZWUgZG9jc3RyaW5nIG9mIG1zdnNfZW11bGF0aW9uLkdlbmVyYXRlRW52aXJvbm1lbnRGaWxlcygpLgogICAgICAgc2VsZi53aW5fZW52ID0ge30KICAgICAgIGZvciBhcmNoIGluICgneDg2JywgJ3g2NCcpOgpAQCAtMzIyLDcgKzMyNiw3IEBACiAgICAgaWYgZW52OgogICAgICAgaWYgc2VsZi5mbGF2b3IgPT0gJ21hYyc6CiAgICAgICAgIHBhdGggPSBneXAueGNvZGVfZW11bGF0aW9uLkV4cGFuZEVudlZhcnMocGF0aCwgZW52KQotICAgICAgZWxpZiBzZWxmLmZsYXZvciBpbiBbJ3dpbicsICd4YjEnXToKKyAgICAgIGVsaWYgc2VsZi5mbGF2b3IgaW4gbWljcm9zb2Z0X2ZsYXZvcnM6CiAgICAgICAgIHBhdGggPSBneXAubXN2c19lbXVsYXRpb24uRXhwYW5kTWFjcm9zKHBhdGgsIGVudikKICAgICBpZiBwYXRoLnN0YXJ0c3dpdGgoJyQhJyk6CiAgICAgICBleHBhbmRlZCA9IHNlbGYuRXhwYW5kU3BlY2lhbChwYXRoKQpAQCAtNDExLDcgKzQxNSw3IEBACiAgICAgc2VsZi54Y29kZV9zZXR0aW5ncyA9IHNlbGYubXN2c19zZXR0aW5ncyA9IE5vbmUKICAgICBpZiBzZWxmLmZsYXZvciA9PSAnbWFjJzoKICAgICAgIHNlbGYueGNvZGVfc2V0dGluZ3MgPSBneXAueGNvZGVfZW11bGF0aW9uLlhjb2RlU2V0dGluZ3Moc3BlYykKLSAgICBpZiAoc2VsZi5mbGF2b3IgaW4gWyd3aW4nLCAncHMzJywgJ3hiMScsICdwczQnXQorICAgIGlmIChzZWxmLmZsYXZvciBpbiB3aW5kb3dzX2hvc3RfZmxhdm9ycwogICAgICAgICBhbmQgaXNfd2luZG93cyk6CiAgICAgICBzZWxmLm1zdnNfc2V0dGluZ3MgPSBneXAubXN2c19lbXVsYXRpb24uTXN2c1NldHRpbmdzKHNwZWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRvcl9mbGFncykKQEAgLTQ2MSw3ICs0NjUsNyBAQAogICAgIHNvdXJjZXMgPSBzcGVjLmdldCgnc291cmNlcycsIFtdKSArIGV4dHJhX3NvdXJjZXMKICAgICBpZiBzb3VyY2VzOgogICAgICAgcGNoID0gTm9uZQotICAgICAgaWYgc2VsZi5mbGF2b3IgaW4gWyd3aW4nLCAneGIxJ106CisgICAgICBpZiBzZWxmLmZsYXZvciBpbiBtaWNyb3NvZnRfZmxhdm9yczoKICAgICAgICAgZ3lwLm1zdnNfZW11bGF0aW9uLlZlcmlmeU1pc3NpbmdTb3VyY2VzKAogICAgICAgICAgICAgc291cmNlcywgc2VsZi5hYnNfYnVpbGRfZGlyLCBnZW5lcmF0b3JfZmxhZ3MsIHNlbGYuR3lwUGF0aFRvTmluamEpCiAgICAgICAgIHBjaCA9IGd5cC5tc3ZzX2VtdWxhdGlvbi5QcmVjb21waWxlZEhlYWRlcigKQEAgLTQ3Nyw3ICs0ODEsNyBAQAogICAgICAgbGlua19kZXBzICs9IFtzZWxmLkd5cFBhdGhUb05pbmphKGYpCiAgICAgICAgICAgZm9yIGYgaW4gc291cmNlcyBpZiBmLmVuZHN3aXRoKHNlbGYub2JqX2V4dCldCiAKLSAgICBpZiBzZWxmLmZsYXZvciBpbiBbJ3dpbicsICd4YjEnXSBhbmQgc2VsZi50YXJnZXQudHlwZSA9PSAnc3RhdGljX2xpYnJhcnknOgorICAgIGlmIHNlbGYuZmxhdm9yIGluIG1pY3Jvc29mdF9mbGF2b3JzIGFuZCBzZWxmLnRhcmdldC50eXBlID09ICdzdGF0aWNfbGlicmFyeSc6CiAgICAgICBzZWxmLnRhcmdldC5jb21wb25lbnRfb2JqcyA9IGxpbmtfZGVwcwogCiAgICAgIyBXcml0ZSBvdXQgYSBsaW5rIHN0ZXAsIGlmIG5lZWRlZC4KQEAgLTUyNCw3ICs1MjgsNyBAQAogCiAgIGRlZiBXcml0ZVdpbklkbEZpbGVzKHNlbGYsIHNwZWMsIHByZWJ1aWxkKToKICAgICAiIiJXcml0ZXMgcnVsZXMgdG8gbWF0Y2ggTVNWUydzIGltcGxpY2l0IGlkbCBoYW5kbGluZy4iIiIKLSAgICBhc3NlcnQgc2VsZi5mbGF2b3IgaW4gKCd3aW4nLCAneGIxJykKKyAgICBhc3NlcnQgc2VsZi5mbGF2b3IgaW4gbWljcm9zb2Z0X2ZsYXZvcnMKICAgICBpZiBzZWxmLm1zdnNfc2V0dGluZ3MuSGFzRXhwbGljaXRJZGxSdWxlcyhzcGVjKToKICAgICAgIHJldHVybiBbXQogICAgIG91dHB1dHMgPSBbXQpAQCAtNTczLDcgKzU3Nyw3IEBACiAgICAgICByZXR1cm4gJyVzICVzOiAlcycgJSAodmVyYiwgc2VsZi5uYW1lLCBmYWxsYmFjaykKIAogICBkZWYgSXNDeWd3aW5SdWxlKHNlbGYsIGFjdGlvbik6Ci0gICAgaWYgc2VsZi5mbGF2b3IgaW4gWydwczMnLCAncHM0J106CisgICAgaWYgc2VsZi5mbGF2b3IgaW4gc29ueV9mbGF2b3JzOgogICAgICAgcmV0dXJuIHN0cihhY3Rpb24uZ2V0KCdtc3ZzX2N5Z3dpbl9zaGVsbCcsIDEpKSAhPSAnMCcKICAgICByZXR1cm4gRmFsc2UKIApAQCAtODA2LDcgKzgxMCw3IEBACiAgICAgICAgICAgICAgICAgICAgIHNlbGYueGNvZGVfc2V0dGluZ3MuR2V0Q2ZsYWdzT2JqQyhjb25maWdfbmFtZSkKICAgICAgIGNmbGFnc19vYmpjYyA9IFsnJGNmbGFnc19jYyddICsgXAogICAgICAgICAgICAgICAgICAgICAgc2VsZi54Y29kZV9zZXR0aW5ncy5HZXRDZmxhZ3NPYmpDQyhjb25maWdfbmFtZSkKLSAgICBlbGlmIHNlbGYuZmxhdm9yIGluIFsnd2luJywgJ3hiMSddOgorICAgIGVsaWYgc2VsZi5mbGF2b3IgaW4gbWljcm9zb2Z0X2ZsYXZvcnM6CiAgICAgICBjZmxhZ3MgPSBzZWxmLm1zdnNfc2V0dGluZ3MuR2V0Q2ZsYWdzKGNvbmZpZ19uYW1lKQogICAgICAgY2ZsYWdzX2MgPSBzZWxmLm1zdnNfc2V0dGluZ3MuR2V0Q2ZsYWdzQyhjb25maWdfbmFtZSkKICAgICAgIGNmbGFnc19jYyA9IHNlbGYubXN2c19zZXR0aW5ncy5HZXRDZmxhZ3NDQyhjb25maWdfbmFtZSkKQEAgLTgyOSw3ICs4MzMsNyBAQAogCiAgICAgZGVmaW5lcyA9IGNvbmZpZy5nZXQoJ2RlZmluZXMnLCBbXSkgKyBleHRyYV9kZWZpbmVzCiAgICAgc2VsZi5Xcml0ZVZhcmlhYmxlTGlzdCgnZGVmaW5lcycsIFtEZWZpbmUoZCwgc2VsZi5mbGF2b3IpIGZvciBkIGluIGRlZmluZXNdKQotICAgIGlmIHNlbGYuZmxhdm9yIGluIFsnd2luJywgJ3hiMSddOgorICAgIGlmIHNlbGYuZmxhdm9yIGluIG1pY3Jvc29mdF9mbGF2b3JzOgogICAgICAgc2VsZi5Xcml0ZVZhcmlhYmxlTGlzdCgncmNmbGFncycsCiAgICAgICAgICAgW1F1b3RlU2hlbGxBcmd1bWVudChzZWxmLkV4cGFuZFNwZWNpYWwoZiksIHNlbGYuZmxhdm9yKQogICAgICAgICAgICBmb3IgZiBpbiBzZWxmLm1zdnNfc2V0dGluZ3MuR2V0UmNmbGFncyhjb25maWdfbmFtZSwKQEAgLTgzOCw3ICs4NDIsNyBAQAogICAgIGluY2x1ZGVfZGlycyA9IGNvbmZpZy5nZXQoJ2luY2x1ZGVfZGlycycsIFtdKQogICAgIGluY2x1ZGVfZGlycyArPSBjb25maWcuZ2V0KCdpbmNsdWRlX2RpcnNfJyArIHNlbGYudG9vbHNldCwgW10pCiAKLSAgICBpZiBzZWxmLmZsYXZvciBpbiBbJ3dpbicsICd4YjEnXToKKyAgICBpZiBzZWxmLmZsYXZvciBpbiBtaWNyb3NvZnRfZmxhdm9yczoKICAgICAgIGluY2x1ZGVfZGlycyA9IHNlbGYubXN2c19zZXR0aW5ncy5BZGp1c3RJbmNsdWRlRGlycyhpbmNsdWRlX2RpcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnX25hbWUpCiAgICAgICBzZWxmLldyaXRlVmFyaWFibGVMaXN0KCdpbmNsdWRlcycsCkBAIC04OTcsNyArOTAxLDcgQEAKICAgICAgICAgY29tbWFuZCA9ICdvYmpjJwogICAgICAgZWxpZiBzZWxmLmZsYXZvciA9PSAnbWFjJyBhbmQgZXh0ID09ICdtbSc6CiAgICAgICAgIGNvbW1hbmQgPSAnb2JqY3h4JwotICAgICAgZWxpZiBzZWxmLmZsYXZvciBpbiBbJ3dpbicsICd4YjEnXSBhbmQgZXh0ID09ICdyYyc6CisgICAgICBlbGlmIHNlbGYuZmxhdm9yIGluIG1pY3Jvc29mdF9mbGF2b3JzIGFuZCBleHQgPT0gJ3JjJzoKICAgICAgICAgY29tbWFuZCA9ICdyYycKICAgICAgICAgb2JqX2V4dCA9ICcucmVzJwogICAgICAgZWxzZToKQEAgLTkxMCw3ICs5MTQsNyBAQAogICAgICAgb3V0cHV0ID0gc2VsZi5HeXBQYXRoVG9VbmlxdWVPdXRwdXQoZmlsZW5hbWUgKyBvYmpfZXh0KQogICAgICAgaW1wbGljaXQgPSBwcmVjb21waWxlZF9oZWFkZXIuR2V0T2JqRGVwZW5kZW5jaWVzKFtpbnB1dF0sIFtvdXRwdXRdKQogICAgICAgdmFyaWFibGVzID0gW10KLSAgICAgIGlmIHNlbGYuZmxhdm9yIGluIFsnd2luJywgJ3hiMSddOgorICAgICAgaWYgc2VsZi5mbGF2b3IgaW4gbWljcm9zb2Z0X2ZsYXZvcnM6CiAgICAgICAgIHZhcmlhYmxlcywgb3V0cHV0LCBpbXBsaWNpdCA9IHByZWNvbXBpbGVkX2hlYWRlci5HZXRGbGFnc01vZGlmaWNhdGlvbnMoCiAgICAgICAgICAgICBpbnB1dCwgb3V0cHV0LCBpbXBsaWNpdCwgY29tbWFuZCwgY2ZsYWdzX2MsIGNmbGFnc19jYywKICAgICAgICAgICAgIHNlbGYuRXhwYW5kU3BlY2lhbCkKQEAgLTk2NiwxMCArOTcwLDEwIEBACiAgICAgICAgICAgY29udGludWUKICAgICAgICAgbGlua2FibGUgPSB0YXJnZXQuTGlua2FibGUoKQogICAgICAgICBpZiBsaW5rYWJsZToKLSAgICAgICAgICBpZiAoc2VsZi5mbGF2b3IgaW4gWyd3aW4nLCAneGIxJ10gYW5kIHRhcmdldC5jb21wb25lbnRfb2JqcyBhbmQKKyAgICAgICAgICBpZiAoc2VsZi5mbGF2b3IgaW4gbWljcm9zb2Z0X2ZsYXZvcnMgYW5kIHRhcmdldC5jb21wb25lbnRfb2JqcyBhbmQKICAgICAgICAgICAgICAgc2VsZi5tc3ZzX3NldHRpbmdzLklzVXNlTGlicmFyeURlcGVuZGVuY3lJbnB1dHMoY29uZmlnX25hbWUpKToKICAgICAgICAgICAgIGV4dHJhX2xpbmtfZGVwcy5leHRlbmQodGFyZ2V0LmNvbXBvbmVudF9vYmpzKQotICAgICAgICAgIGVsaWYgKHNlbGYuZmxhdm9yIGluIFsnd2luJywgJ3hiMScsICdwczMnXSBhbmQKKyAgICAgICAgICBlbGlmIChzZWxmLmZsYXZvciBpbiAobWljcm9zb2Z0X2ZsYXZvcnMgKyBbJ3BzMyddKSBhbmQKICAgICAgICAgICAgICAgICB0YXJnZXQuaW1wb3J0X2xpYik6CiAgICAgICAgICAgICBleHRyYV9saW5rX2RlcHMuYXBwZW5kKHRhcmdldC5pbXBvcnRfbGliKQogICAgICAgICAgIGVsaWYgdGFyZ2V0LlVzZXNUb2Moc2VsZi5mbGF2b3IpOgpAQCAtMTAwMCw3ICsxMDA0LDcgQEAKICAgICAgIGxkZmxhZ3MgPSBzZWxmLnhjb2RlX3NldHRpbmdzLkdldExkZmxhZ3MoY29uZmlnX25hbWUsCiAgICAgICAgICAgc2VsZi5FeHBhbmRTcGVjaWFsKGdlbmVyYXRvcl9kZWZhdWx0X3ZhcmlhYmxlc1snUFJPRFVDVF9ESVInXSksCiAgICAgICAgICAgc2VsZi5HeXBQYXRoVG9OaW5qYSkKLSAgICBlbGlmIHNlbGYuZmxhdm9yIGluIFsnd2luJywgJ3hiMSddOgorICAgIGVsaWYgc2VsZi5mbGF2b3IgaW4gbWljcm9zb2Z0X2ZsYXZvcnM6CiAgICAgICBsaWJmbGFncyA9IHNlbGYubXN2c19zZXR0aW5ncy5HZXRMaWJGbGFncyhjb25maWdfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuR3lwUGF0aFRvTmluamEpCiAgICAgICBzZWxmLldyaXRlVmFyaWFibGVMaXN0KApAQCAtMTAzNCw3ICsxMDM4LDcgQEAKIAogICAgIGlmIHNlbGYuZmxhdm9yID09ICdtYWMnOgogICAgICAgbGlicmFyaWVzID0gc2VsZi54Y29kZV9zZXR0aW5ncy5BZGp1c3RMaWJyYXJpZXMobGlicmFyaWVzKQotICAgIGVsaWYgc2VsZi5mbGF2b3IgaW4gWyd3aW4nLCAneGIxJ106CisgICAgZWxpZiBzZWxmLmZsYXZvciBpbiBtaWNyb3NvZnRfZmxhdm9yczoKICAgICAgIGxpYnJhcmllcyA9IHNlbGYubXN2c19zZXR0aW5ncy5BZGp1c3RMaWJyYXJpZXMobGlicmFyaWVzKQogICAgIHNlbGYuV3JpdGVWYXJpYWJsZUxpc3QoJ2xpYnMnLCBsaWJyYXJpZXMpCiAKQEAgLTEwNDQsNyArMTA0OCw3IEBACiAgICAgICBleHRyYV9iaW5kaW5ncy5hcHBlbmQoKCdzb25hbWUnLCBvcy5wYXRoLnNwbGl0KG91dHB1dClbMV0pKQogICAgICAgZXh0cmFfYmluZGluZ3MuYXBwZW5kKCgnbGliJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBneXAuY29tbW9uLkVuY29kZVBPU0lYU2hlbGxBcmd1bWVudChvdXRwdXQpKSkKLSAgICAgIGlmIHNlbGYuZmxhdm9yIGluIFsnd2luJywgJ3hiMSddOgorICAgICAgaWYgc2VsZi5mbGF2b3IgaW4gbWljcm9zb2Z0X2ZsYXZvcnM6CiAgICAgICAgIGV4dHJhX2JpbmRpbmdzLmFwcGVuZCgoJ2RsbCcsIG91dHB1dCkpCiAgICAgICAgIGlmICcvTk9FTlRSWScgbm90IGluIGxkZmxhZ3M6CiAgICAgICAgICAgc2VsZi50YXJnZXQuaW1wb3J0X2xpYiA9IG91dHB1dCArICcubGliJwpAQCAtMTExMCw3ICsxMTE0LDcgQEAKICAgICBlbGlmIHNwZWNbJ3R5cGUnXSA9PSAnc3RhdGljX2xpYnJhcnknOgogICAgICAgc2VsZi50YXJnZXQuYmluYXJ5ID0gc2VsZi5Db21wdXRlT3V0cHV0KHNwZWMpCiAgICAgICB2YXJpYWJsZXMgPSBbXQotICAgICAgaWYgc2VsZi5mbGF2b3IgaW4gKCd3aW4nLCAneGIxJyk6CisgICAgICBpZiBzZWxmLmZsYXZvciBpbiBtaWNyb3NvZnRfZmxhdm9yczoKICAgICAgICAgbGliZmxhZ3MgPSBzZWxmLm1zdnNfc2V0dGluZ3MuR2V0TGliRmxhZ3MoY29uZmlnX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuR3lwUGF0aFRvTmluamEpCiAgICAgICAgIHZhcmlhYmxlcy5hcHBlbmQoKCdsaWJmbGFncycsICcgJy5qb2luKGxpYmZsYWdzKSkpCkBAIC0xMTIxLDcgKzExMjUsNyBAQAogICAgICAgaWYgc2VsZi54Y29kZV9zZXR0aW5nczoKICAgICAgICAgdmFyaWFibGVzLmFwcGVuZCgoJ2xpYnRvb2xfZmxhZ3MnLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnhjb2RlX3NldHRpbmdzLkdldExpYnRvb2xmbGFncyhjb25maWdfbmFtZSkpKQotICAgICAgaWYgKHNlbGYuZmxhdm9yIG5vdCBpbiAoJ21hYycsICd3aW4nLCAneGIxJykgYW5kIG5vdAorICAgICAgaWYgKHNlbGYuZmxhdm9yIG5vdCBpbiAoWydtYWMnXSArIG1pY3Jvc29mdF9mbGF2b3JzKSBhbmQgbm90CiAgICAgICAgICAgc2VsZi5pc19zdGFuZGFsb25lX3N0YXRpY19saWJyYXJ5KToKICAgICAgICAgY29tbWFuZCA9ICdhbGlua190aGluJwogICAgICAgZWxzZToKQEAgLTEzNzMsNyArMTM3Nyw3IEBACiAgICAgcnNwZmlsZSA9IE5vbmUKICAgICByc3BmaWxlX2NvbnRlbnQgPSBOb25lCiAgICAgYXJncyA9IFtzZWxmLkV4cGFuZFNwZWNpYWwoYXJnLCBzZWxmLmJhc2VfdG9fYnVpbGQpIGZvciBhcmcgaW4gYXJnc10KLSAgICBpZiAoc2VsZi5mbGF2b3IgaW4gWyd3aW4nLCAncHMzJywgJ3hiMScsICdwczQnXQorICAgIGlmIChzZWxmLmZsYXZvciBpbiB3aW5kb3dzX2hvc3RfZmxhdm9ycwogICAgICAgICBhbmQgaXNfd2luZG93cyk6CiAgICAgICByc3BmaWxlID0gcnVsZV9uYW1lICsgJy4kdW5pcXVlX25hbWUucnNwJwogICAgICAgIyBUaGUgY3lnd2luIGNhc2UgaGFuZGxlcyB0aGlzIGluc2lkZSB0aGUgYmFzaCBzdWItc2hlbGwuCkBAIC0xNDI0LDcgKzE0MjgsNyBAQAogICAgIGdsb2JhbCBnZW5lcmF0b3JfZXh0cmFfc291cmNlc19mb3JfcnVsZXMKICAgICBnZW5lcmF0b3JfZXh0cmFfc291cmNlc19mb3JfcnVsZXMgPSBnZXRhdHRyKHhjb2RlX2dlbmVyYXRvciwKICAgICAgICAgJ2dlbmVyYXRvcl9leHRyYV9zb3VyY2VzX2Zvcl9ydWxlcycsIFtdKQotICBlbGlmIGZsYXZvciBpbiBbJ3dpbicsICd4YjEnXToKKyAgZWxpZiBmbGF2b3IgaW4gbWljcm9zb2Z0X2ZsYXZvcnM6CiAgICAgZGVmYXVsdF92YXJpYWJsZXMuc2V0ZGVmYXVsdCgnT1MnLCAnd2luJykKICAgICBkZWZhdWx0X3ZhcmlhYmxlc1snRVhFQ1VUQUJMRV9TVUZGSVgnXSA9ICcuZXhlJwogICAgIGRlZmF1bHRfdmFyaWFibGVzWydTVEFUSUNfTElCX1BSRUZJWCddID0gJycKQEAgLTE2MDAsMTQgKzE2MDQsMTQgQEAKICAgIyAtIElmIHRoZXJlIGlzIG5vICdtYWtlX2dsb2JhbF9zZXR0aW5ncycgZm9yIENDLmhvc3QvQ1hYLmhvc3Qgb3IKICAgIyAgICdDQ19ob3N0Jy8nQ1hYX2hvc3QnIGVudmlyb21lbnQgdmFyaWFibGUsIGNjX2hvc3QvY3h4X2hvc3Qgc2hvdWxkIGJlIHNldAogICAjICAgdG8gY2MvY3h4LgotICBpZiAoZmxhdm9yID09ICd3aW4nIG9yIChmbGF2b3IgaW4gWydwczMnLCAncHM0J10gYW5kIGlzX3dpbmRvd3MpKToKKyAgaWYgKGZsYXZvciA9PSAnd2luJyBvciAoZmxhdm9yIGluIHNvbnlfZmxhdm9ycyBhbmQgaXNfd2luZG93cykpOgogICAgIGNjID0gJ2NsLmV4ZScKICAgICBjeHggPSAnY2wuZXhlJwogICAgIGxkID0gJ2xpbmsuZXhlJwogICAgIGd5cC5tc3ZzX2VtdWxhdGlvbi5HZW5lcmF0ZUVudmlyb25tZW50RmlsZXMoCiAgICAgICAgIHRvcGxldmVsX2J1aWxkLCBnZW5lcmF0b3JfZmxhZ3MsIE9wZW5PdXRwdXQpCiAgICAgbGRfaG9zdCA9ICckbGQnCi0gIGVsaWYgZmxhdm9yID09ICd4YjEnOgorICBlbGlmIGZsYXZvciBpbiBbJ3hiMScsICd4YjEtZnV0dXJlJ106CiAgICAgY2MgPSAnY2wuZXhlJwogICAgIGN4eCA9ICdjbC5leGUnCiAgICAgbGQgPSAnbGluay5leGUnCkBAIC0xNjY1LDE0ICsxNjY5LDE0IEBACiAgICAgcHl0aG9uX2V4ZWMgPSBzeXMuZXhlY3V0YWJsZQogCiAgIGFyX2ZsYWdzID0gJycKLSAgaWYgZmxhdm9yIGluIFsnd2luJywgJ3hiMSddOgorICBpZiBmbGF2b3IgaW4gbWljcm9zb2Z0X2ZsYXZvcnM6CiAgICAgbWFzdGVyX25pbmphLnZhcmlhYmxlKCdsZCcsIGxkKQogICAgIG1hc3Rlcl9uaW5qYS52YXJpYWJsZSgnYXInLCBvcy5lbnZpcm9uLmdldCgnQVInLCAnYXInKSkKICAgICBtYXN0ZXJfbmluamEudmFyaWFibGUoJ3JjJywgJ3JjLmV4ZScpCiAgICAgbWFzdGVyX25pbmphLnZhcmlhYmxlKCdhc20nLCAnbWwuZXhlJykKICAgICBtYXN0ZXJfbmluamEudmFyaWFibGUoJ210JywgJ210LmV4ZScpCiAgICAgbWFzdGVyX25pbmphLnZhcmlhYmxlKCd1c2VfZGVwX2RhdGFiYXNlJywgJzEnKQotICBlbGlmIGZsYXZvciBpbiBbJ3BzMycsICdwczQnXToKKyAgZWxpZiBmbGF2b3IgaW4gc29ueV9mbGF2b3JzOgogICAgICMgUmVxdWlyZSBMRCB0byBiZSBzZXQuCiAgICAgbWFzdGVyX25pbmphLnZhcmlhYmxlKCdsZCcsIG9zLmVudmlyb24uZ2V0KCdMRCcpKQogICAgIG1hc3Rlcl9uaW5qYS52YXJpYWJsZSgnYXInLCBvcy5lbnZpcm9uLmdldCgnQVInLCAnYXInKSkKQEAgLTE3MjgsOCArMTczMiw4IEBACiAgIG1hc3Rlcl9uaW5qYS5wb29sKCdsaW5rX3Bvb2wnLCBkZXB0aD1HZXREZWZhdWx0Q29uY3VycmVudExpbmtzKCkpCiAgIG1hc3Rlcl9uaW5qYS5uZXdsaW5lKCkKIAotICBpZiBmbGF2b3Igbm90IGluIFsnd2luJywgJ3hiMSddOgotICAgIGlmIGZsYXZvciBpbiBbJ3BzMycsICdwczQnXSA6CisgIGlmIGZsYXZvciBub3QgaW4gbWljcm9zb2Z0X2ZsYXZvcnM6CisgICAgaWYgZmxhdm9yIGluIHNvbnlfZmxhdm9ycyA6CiAgICAgICAjIHVjYSA6PSBVbm5hbWVkIENvbnNvbGUgQQogICAgICAgZGVwX2Zvcm1hdCA9ICdzbmMnIGlmIChmbGF2b3IgaW4gWydwczMnXSkgZWxzZSAndWNhJwogICAgICAgbWFzdGVyX25pbmphLnJ1bGUoCkBAIC0xODA5LDE0ICsxODEzLDE0IEBACiAgICAgICAgICAgICAgICAnJGFyY2ggJGFzbSAkZGVmaW5lcyAkaW5jbHVkZXMgL2MgL0ZvICRvdXQgJGluJyAlCiAgICAgICAgICAgICAgICBweXRob25fZXhlYykpCiAKLSAgaWYgZmxhdm9yIG5vdCBpbiBbJ21hYycsICd3aW4nLCAneGIxJ106CisgIGlmIGZsYXZvciBub3QgaW4gKFsnbWFjJ10gKyBtaWNyb3NvZnRfZmxhdm9ycyk6CiAgICAgYWxpbmtfY29tbWFuZCA9ICdybSAtZiAkb3V0ICYmICRhciAkYXJGbGFncyAkb3V0IEAkb3V0LnJzcCcKICAgICAjIFRPRE86IFVzZSByY3NUIG9uIExpbnV4IG9ubHkuCiAgICAgYWxpbmtfdGhpbl9jb21tYW5kID0gJ3JtIC1mICRvdXQgJiYgJGFyICRhclRoaW5GbGFncyAkb3V0IEAkb3V0LnJzcCcKIAogICAgIGxkX2NtZCA9ICckbGQnCiAKLSAgICBpZiBmbGF2b3IgaW4gWydwczMnLCAncHM0J10gYW5kIGlzX3dpbmRvd3M6CisgICAgaWYgZmxhdm9yIGluIHNvbnlfZmxhdm9ycyBhbmQgaXNfd2luZG93czoKICAgICAgIGFsaW5rX2NvbW1hbmQgPSAnY21kLmV4ZSAvYyAnICsgYWxpbmtfY29tbWFuZAogICAgICAgYWxpbmtfdGhpbl9jb21tYW5kID0gJ2NtZC5leGUgL2MgJyArIGFsaW5rX3RoaW5fY29tbWFuZAogICAgICAgbGRfY21kID0gJyVzIGd5cC13aW4tdG9vbCBsaW5rLXdyYXBwZXIgJGFyY2ggJGxkJyAlIHB5dGhvbl9leGVjCkBAIC0xODg5LDcgKzE4OTMsNyBAQAogICAgICAgICBjb21tYW5kPShtdGltZV9wcmVzZXJ2aW5nX3NvbGlua19iYXNlICUgewogICAgICAgICAgICAgJ3N1ZmZpeCc6ICctV2wsLS1zdGFydC1ncm91cCAkaW4gJHNvbGlicyAtV2wsLS1lbmQtZ3JvdXAgJGxpYnMnfSkpCiAKLSAgICBpZiBmbGF2b3IgaW4gWydwczMnLCAncHM0J106CisgICAgaWYgZmxhdm9yIGluIHNvbnlfZmxhdm9yczoKICAgICAgICMgUFMzIGFuZCBQUzQgbGlua2VycyBkb24ndCBrbm93IGFib3V0IHJwYXRoLgogICAgICAgcnBhdGggPSAnJwogICAgIGVsc2U6CkBAIC0xOTAzLDcgKzE5MDcsNyBAQAogICAgICAgcnNwZmlsZV9jb250ZW50PSgnJGxkZmxhZ3MgLW8gJG91dCAlcyAtV2wsLS1zdGFydC1ncm91cCAkaW4gJHNvbGlicyAnCiAgICAgICAgICAgICAgICAgICAgICAgICctV2wsLS1lbmQtZ3JvdXAgJGxpYnMnICUgcnBhdGgpLAogICAgICAgcG9vbD0nbGlua19wb29sJykKLSAgZWxpZiBmbGF2b3IgaW4gWyd3aW4nLCAneGIxJ106CisgIGVsaWYgZmxhdm9yIGluIG1pY3Jvc29mdF9mbGF2b3JzOgogICAgIG1hc3Rlcl9uaW5qYS5ydWxlKAogICAgICAgICAnYWxpbmsnLAogICAgICAgICBkZXNjcmlwdGlvbj0nTElCICRvdXQnLApAQCAtMTkxNiw3ICsxOTIwLDcgQEAKICAgICBkbGxjbWQgPSAoJyVzIGd5cC13aW4tdG9vbCBsaW5rLXdyYXBwZXIgJGFyY2ggJwogICAgICAgICAgICAgICAnJGxkIC9ub2xvZ28gJGltcGxpYmZsYWcgL0RMTCAvT1VUOiRkbGwgJwogICAgICAgICAgICAgICAnL1BEQjokZGxsLnBkYiBAJGRsbC5yc3AnICUgcHl0aG9uX2V4ZWMpCi0gICAgaWYgZmxhdm9yICE9ICd4YjEnOgorICAgIGlmIG5vdCBmbGF2b3IgaW4gWyd4YjEnLCAneGIxLWZ1dHVyZSddOgogICAgICAgIyBYQjEgZG9lc24ndCBuZWVkIGEgbWFuaWZlc3QuCiAgICAgICBkbGxjbWQgKz0gKCcgJiYgJXMgZ3lwLXdpbi10b29sIG1hbmlmZXN0LXdyYXBwZXIgJGFyY2ggJwogICAgICAgICAgICAgICAgICAnJG10IC1ub2xvZ28gLW1hbmlmZXN0ICRtYW5pZmVzdHMgLW91dDokZGxsLm1hbmlmZXN0JyAlCkBAIC0xOTM4LDcgKzE5NDIsNyBAQAogICAgICAgICAgICAgICAgICAgICckbXQgLW5vbG9nbyAtbWFuaWZlc3QgJG1hbmlmZXN0cyAtb3V0OiRvdXQubWFuaWZlc3QnICUKICAgICAgICAgICAgICAgICAgICAocHl0aG9uX2V4ZWMsIHB5dGhvbl9leGVjKSkKICAgICBlbHNlOgotICAgICAgYXNzZXJ0IGZsYXZvciA9PSAneGIxJworICAgICAgYXNzZXJ0IGZsYXZvciBpbiBbJ3hiMScsICd4YjEtZnV0dXJlJ10KICAgICAgICMgWEIxIGRvZXNuJ3QgbmVlZCBhIG1hbmlmZXN0LgogICAgICAgbGlua19jb21tYW5kPSgnJXMgZ3lwLXdpbi10b29sIGxpbmstd3JhcHBlciAkYXJjaCAnCiAgICAgICAgICAgICAgICAgICAgJyRsZCAvbm9sb2dvIC9PVVQ6JG91dCAvUERCOiRvdXQucGRiIEAkb3V0LnJzcCcgJQpAQCAtMjAyNyw3ICsyMDMxLDcgQEAKICAgICAgIGRlc2NyaXB0aW9uPSdQQUNLQUdFIEZSQU1FV09SSyAkb3V0LCBQT1NUQlVJTERTJywKICAgICAgIGNvbW1hbmQ9Jy4vZ3lwLW1hYy10b29sIHBhY2thZ2UtZnJhbWV3b3JrICRvdXQgJHZlcnNpb24kcG9zdGJ1aWxkcyAnCiAgICAgICAgICAgICAgICcmJiB0b3VjaCAkb3V0JykKLSAgaWYgZmxhdm9yIGluIFsnd2luJywgJ3hiMSddOgorICBpZiBmbGF2b3IgaW4gbWljcm9zb2Z0X2ZsYXZvcnM6CiAgICAgbWFzdGVyX25pbmphLnJ1bGUoCiAgICAgICAnc3RhbXAnLAogICAgICAgZGVzY3JpcHRpb249J1NUQU1QICRvdXQnLApAQCAtMjI1Niw3ICsyMjYwLDcgQEAKIAogZGVmIEdlbmVyYXRlT3V0cHV0KHRhcmdldF9saXN0LCB0YXJnZXRfZGljdHMsIGRhdGEsIHBhcmFtcyk6CiAgIHVzZXJfY29uZmlnID0gcGFyYW1zLmdldCgnZ2VuZXJhdG9yX2ZsYWdzJywge30pLmdldCgnY29uZmlnJywgTm9uZSkKLSAgaWYgZ3lwLmNvbW1vbi5HZXRGbGF2b3IocGFyYW1zKSBpbiBbJ3dpbicsICd4YjEnXToKKyAgaWYgZ3lwLmNvbW1vbi5HZXRGbGF2b3IocGFyYW1zKSBpbiBtaWNyb3NvZnRfZmxhdm9yczoKICAgICB0YXJnZXRfbGlzdCwgdGFyZ2V0X2RpY3RzID0gTVNWU1V0aWwuU2hhcmRUYXJnZXRzKHRhcmdldF9saXN0LCB0YXJnZXRfZGljdHMpCiAgIGlmIHVzZXJfY29uZmlnOgogICAgIEdlbmVyYXRlT3V0cHV0Rm9yQ29uZmlnKHRhcmdldF9saXN0LCB0YXJnZXRfZGljdHMsIGRhdGEsIHBhcmFtcywKZGlmZiAtLWdpdCBhL3NyYy90b29scy9neXAvcHlsaWIvZ3lwL2dlbmVyYXRvci9xdGNyZWF0b3JfbmluamEucHkgYi9zcmMvdG9vbHMvZ3lwL3B5bGliL2d5cC9nZW5lcmF0b3IvcXRjcmVhdG9yX25pbmphLnB5CmluZGV4IGYwZjk1NWQuLjI0YzA5OTAgMTAwNjQ0Ci0tLSBhL3NyYy90b29scy9neXAvcHlsaWIvZ3lwL2dlbmVyYXRvci9xdGNyZWF0b3JfbmluamEucHkKKysrIGIvc3JjL3Rvb2xzL2d5cC9weWxpYi9neXAvZ2VuZXJhdG9yL3F0Y3JlYXRvcl9uaW5qYS5weQpAQCAtMTQsNiArMTQsNyBAQAogIiIiR3lwIGdlbmVyYXRvciBmb3IgUVQgQ3JlYXRvciBwcm9qZWN0cyB0aGF0IGludm9rZSBuaW5qYS4iIiIKIAogaW1wb3J0IG9zCitpbXBvcnQgcmUKIAogUFJPSkVDVF9ESVJfUkVMQVRJVkVfVE9fT1VUUFVUX0RJUiA9ICdxdGNyZWF0b3JfcHJvamVjdHMnCiAKQEAgLTI4LDYgKzI5LDE0IEBACiAgIHJldHVybiByZXQKIAogCitkZWYgU3BsaXRBc3NpZ25tZW50RGVmaW5lKGxpbmUpOgorICBtYXRjaGVkID0gcmUubWF0Y2gocicoW149XGJdKyk9KC4qKScsIGxpbmUpCisgIGlmIG1hdGNoZWQ6CisgICAgcmV0dXJuIG1hdGNoZWQuZ3JvdXAoMSkgKyAnICcgKyBtYXRjaGVkLmdyb3VwKDIpCisgIGVsc2U6CisgICAgcmV0dXJuIGxpbmUKKworCiBkZWYgR2VuUHJvamVjdChwcm9qZWN0X2RlZiwgcHJval9kaXIpOgogICAiIiJHZW5lcmF0ZXMgUVQgQ3JlYXRvciBwcm9qZWN0ICguY3JlYXRvcikgYW5kIHN1cHBvcnRpbmcgZmlsZXMuCiAKQEAgLTUzLDcgKzYyLDcgQEAKIAogICB3aXRoIG9wZW4oYmFzZWZpbGVuYW1lICsgJy5jb25maWcnLCAndycpIGFzIGY6CiAgICAgZm9yIGRlZmluZSBpbiBjb25maWd1cmF0aW9uWydkZWZpbmVzJ106Ci0gICAgICBmLndyaXRlKCcjZGVmaW5lICVzXG4nICUgZGVmaW5lKQorICAgICAgZi53cml0ZSgnI2RlZmluZSAlc1xuJyAlIFNwbGl0QXNzaWdubWVudERlZmluZShkZWZpbmUpKQogCiAgIHdpdGggb3BlbihiYXNlZmlsZW5hbWUgKyAnLmZpbGVzJywgJ3cnKSBhcyBmOgogICAgIGZvciBzb3VyY2UgaW4gcHJvamVjdF9kZWZbJ3NvdXJjZXMnXToK