ZGlmZiAtLWdpdCBhL0FOTk9VTkNFIGIvQU5OT1VOQ0UKaW5kZXggMWUwNTQ5Zi4uZTE5OWJhZSAxMDA2NDQKLS0tIGEvQU5OT1VOQ0UKKysrIGIvQU5OT1VOQ0UKQEAgLTEsMTQgKzEsMTMgQEAKLVRoaXMgaXMgcmVsZWFzZSA5ODA1MDMgb2YgV2luZSwgdGhlIE1TIFdpbmRvd3MgZW11bGF0b3IuICBUaGlzIGlzIHN0aWxsIGEKK1RoaXMgaXMgcmVsZWFzZSA5ODA1MTcgb2YgV2luZSwgdGhlIE1TIFdpbmRvd3MgZW11bGF0b3IuICBUaGlzIGlzIHN0aWxsIGEKIGRldmVsb3BlcidzIG9ubHkgcmVsZWFzZS4gIFRoZXJlIGFyZSBtYW55IGJ1Z3MgYW5kIG1hbnkgdW5pbXBsZW1lbnRlZCBBUEkKIGZlYXR1cmVzLiAgTW9zdCBhcHBsaWNhdGlvbnMgc3RpbGwgZG8gbm90IHdvcmsgY29ycmVjdGx5LgogCiBQYXRjaGVzIHNob3VsZCBiZSBzdWJtaXR0ZWQgdG8gImp1bGxpYXJkQGxyYy5lcGZsLmNoIi4gIFBsZWFzZSBkb24ndAogZm9yZ2V0IHRvIGluY2x1ZGUgYSBDaGFuZ2VMb2cgZW50cnkuCiAKLVdIQVQnUyBORVcgd2l0aCBXaW5lLTk4MDUwMzogKHNlZSBDaGFuZ2VMb2cgZm9yIGRldGFpbHMpCi0JLSBNb2R1bGUgbG9hZGluZyByZXN0cnVjdHVyYXRpb24uCi0JLSBTb21lIHJvdGF0ZWQgdGV4dCBzdXBwb3J0LgotCS0gRG9jdW1lbnRhdGlvbiBmb3IgbWFueSBtb3JlIGZ1bmN0aW9ucy4KK1dIQVQnUyBORVcgd2l0aCBXaW5lLTk4MDUxNzogKHNlZSBDaGFuZ2VMb2cgZm9yIGRldGFpbHMpCisJLSBMb3RzIG9mIGNvbW1vbiBjb250cm9scyBpbXByb3ZlbWVudHMuCisJLSBCZXR0ZXIgdGh1bmtpbmcgc3VwcG9ydC4KIAktIExvdHMgb2YgYnVnIGZpeGVzLgogCiBTZWUgdGhlIFJFQURNRSBmaWxlIGluIHRoZSBkaXN0cmlidXRpb24gZm9yIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMuCkBAIC0xNywxMCArMTYsMTAgQEAKIHRoZSByZWxlYXNlIGlzIGF2YWlsYWJsZSBhdCB0aGUgZnRwIHNpdGVzLiAgVGhlIHNvdXJjZXMgd2lsbCBiZSBhdmFpbGFibGUKIGZyb20gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6CiAKLSAgZnRwOi8vc3Vuc2l0ZS51bmMuZWR1L3B1Yi9MaW51eC9BTFBIQS93aW5lL2RldmVsb3BtZW50L1dpbmUtOTgwNTAzLnRhci5negotICBmdHA6Ly90c3gtMTEubWl0LmVkdS9wdWIvbGludXgvQUxQSEEvV2luZS9kZXZlbG9wbWVudC9XaW5lLTk4MDUwMy50YXIuZ3oKLSAgZnRwOi8vZnRwLmluZm9tYWdpYy5jb20vcHViL21pcnJvcnMvbGludXgvc3Vuc2l0ZS9BTFBIQS93aW5lL2RldmVsb3BtZW50L1dpbmUtOTgwNTAzLnRhci5negotICBmdHA6Ly9mdHAucHJvZ3NvYy51dHMuZWR1LmF1L3B1Yi9XaW5lL2RldmVsb3BtZW50L1dpbmUtOTgwNTAzLnRhci5negorICBmdHA6Ly9zdW5zaXRlLnVuYy5lZHUvcHViL0xpbnV4L0FMUEhBL3dpbmUvZGV2ZWxvcG1lbnQvV2luZS05ODA1MTcudGFyLmd6CisgIGZ0cDovL3RzeC0xMS5taXQuZWR1L3B1Yi9saW51eC9BTFBIQS9XaW5lL2RldmVsb3BtZW50L1dpbmUtOTgwNTE3LnRhci5negorICBmdHA6Ly9mdHAuaW5mb21hZ2ljLmNvbS9wdWIvbWlycm9ycy9saW51eC9zdW5zaXRlL0FMUEhBL3dpbmUvZGV2ZWxvcG1lbnQvV2luZS05ODA1MTcudGFyLmd6CisgIGZ0cDovL2Z0cC5wcm9nc29jLnV0cy5lZHUuYXUvcHViL1dpbmUvZGV2ZWxvcG1lbnQvV2luZS05ODA1MTcudGFyLmd6CiAKIEl0IHNob3VsZCBhbHNvIGJlIGF2YWlsYWJsZSBmcm9tIGFueSBzaXRlIHRoYXQgbWlycm9ycyB0c3gtMTEgb3Igc3Vuc2l0ZS4KIApkaWZmIC0tZ2l0IGEvQ2hhbmdlTG9nIGIvQ2hhbmdlTG9nCmluZGV4IDdmM2Y3MjIuLmI1ODg4YzMgMTAwNjQ0Ci0tLSBhL0NoYW5nZUxvZworKysgYi9DaGFuZ2VMb2cKQEAgLTEsNCArMSwyNTMgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1N1biBNYXkgMTcgMTY6MjM6NTYgMTk5OCAgVXdlIEJvbm5lcyA8Ym9uQGVsZWt0cm9uLmlrcC5waHlzaWsudHUtZGFybXN0YWR0LmRlPgorCisJKiBbZmlsZS9wcm9maWxlLmNdCisJRml4IHRoZSByZXR1cm4gdmFsdWUgb2YgUFJPRklMRV9HZXRTZWN0aW9uCisKKwkqIFttaXNjL2NydGRsbC5jXQorCURvIF9nZXRkcml2ZSwgZml4IF9jaGRyaXZlLgorCisJKiBbbWlzYy9jb21tZGxnLmNdCisJRmlyc3QgY3V0IGF0IENob29zZUNvbG9yW1dBXS4KKworCSogW21pc2MvbmV0d29yay5jXQorCURvIHNvbWV0aGluZyBzZW5zaWJsZSBmb3IgV05ldEdldERpcmVjdG9yeVR5cGUxNi4KKworU3VuIE1heSAxNyAxMDoyMTozNSAxOTk4ICBBbmRyZWFzIE1vaHIgPDEwMC4zMDkzNkBnZXJtYW55Lm5ldD4KKworCSogW2NvbnRyb2xzL21lbnUuY10KKwlGaXhlZCBkaXNhYmxlZCBzdWIgbWVudXMgd2l0aCBNRl9CWVBPU0lUSU9OIHRoYXQgd2VyZSBub3QgZGlzYWJsZWQuCisKKwkqIFttaXNjL2NydGRsbC5jXSBbcmVsYXkzMi9jcnRkbGwuc3BlY10gW2luY2x1ZGUvd2luZXJyb3IuaF0KKwlJbXBsZW1lbnRlZCBmc2NhbmYsIGZzZXRwb3MsIF9hY2Nlc3MsIF9mcHJlc2V0ICh0aGFua3MgdG8gVXdlIEJvbm5lcyksCisJYW5kIF9sdG9hLiAKKworCSogW2xvYWRlci90YXNrLmNdCisJTWFrZVByb2NJbnN0YW5jZTogbXVzdCB1c2UgQ1VSUkVOVF9EUyBpZiBoSW5zdCA9PSBOVUxMLgorCisJKiBbbWlzYy9zaGVsbC5jXQorCVNIRUxMX0dldFJlc291cmNlVGFibGUsIEludGVybmFsRXh0cmFjdEljb246IGZpeGVkIGJyb2tlbiAuSUNPIGhhbmRsaW5nCisKKwkqIFt3aW5kb3dzL3dpbnBvcy5jXQorCURlZmVyV2luZG93UG9zOiByZW1vdmVkICJzYW1lIHBhcmVudCIgcmVxdWlyZW1lbnQuCisJV2hpY2ggZG9jIHN0YXRlcyB0aGF0IHRoaXMgaXMgcmVxdWlyZWQgPworCitTYXQgTWF5IDE2IDIwOjA4OjExIDE5OTggIEFsZXhhbmRyZSBKdWxsaWFyZCAgPGp1bGxpYXJkQGxyYy5lcGZsLmNoPgorCisJKiBbbG9hZGVyL21vZHVsZS5jXSBbbG9hZGVyL25lL21vZHVsZS5jXQorCU1vcmUgTkUgbW9kdWxlIGNsZWFudXBzLgorCisJKiBbbG9hZGVyL3Rhc2suY10KKwlGaXhlZCBTd2l0Y2hTdGFja0JhY2soKS4KKworRnJpIE1heSAxNSAxMDowNDoyNyAxOTk4ICBNYXJjdXMgTWVpc3NuZXIgPG1hcmN1c0BqZXQuZnJhbmtlbi5kZT4KKworCSogW2NvbmZpZ3VyZS5pbl1baW5sY3VkZS9hY2NvbmZpZy5oXQorCUZpeGVkIGJyb2tlbiBPU1MgY2hlY2ssIGFkZGVkIGNoZWNrIGZvciB3b3JraW5nIHNpZ2FsdHN0YWNrLAorCWZpeGVkIGJyb2tlbiBzdGF0ZnMgY2hlY2tzIG9uIHNvbWUgbGludXggc3lzdGVtcy4KKworCSogW2ZpbGVzL2RpcmVjdG9yeS5jXVtsb2FkZXIvcGVfaW1hZ2UuY11bcmVsYXkzMi9idWlsdGluLmNdCisJICBbbG9hZGVyL21vZHVsZS5jXQorCUFkZGVkIGhhbmRsaW5nIG9mIHdpbjMyIG1vZHVsZSBwYXRobmFtZXMuCisKKwkqIFtyZWxheTMyL3duYXNwaTMyLnNwZWNdCisJTmV3IGZpbGUuCisKKwkqIFttaXNjL2x6ZXhwYW5kLmNdCisJTFpDb3B5IGF1dG8tZGVjb21wcmVzc2VzIExaIGNvbXByZXNzZWQgZmlsZXMsIGV2ZW4gaWYgdGhleSBhcmUgbm90CisJc3BlY2lhbGx5IGZsYWdnZWQuIEZpeGVzIHNvbWUgSW5zdGFsbFNoaWVsZCBwcm9ibGVtcy4KKworCSogW21pc2MvcmVnaXN0cnkuY10KKwlTb21lIGZpeGVzIGZvciBSZWdRdWVyeUluZm9LZXkgKHJlZmVyZW5jZSBwcm9ncmFtIG1vbmtleS5leGUKKwlmcm9tIFdpbjMyIFNESyB3b3JrcyBub3cgYmV0dGVyKS4gUHJvYmFibHkgc3RpbGwgaGFzIGZhdWx0cy4KKworRnJpIE1heSAxNSAwODo1ODo1OCAxOTk4ICBNYXJ0aW4gQm9laG1lIDxib2VobWVAaW5mb3JtYXRpay5tdS1sdWViZWNrLmRlPgorCisJKiBbZ3JhcGhpY3MvbWFwcGluZy5jXSBbaW5jbHVkZS9kYy5oXSBbaW5jbHVkZS9nZGkuaF0gW29iamVjdHMvZGMuY10KKwlSZXdvcmtlZCB0aGUgd2F5IHdvcmxkIHRyYW5zZm9ybWF0aW9ucyBhbmQgbWFwcGluZyBtb2RlcyBhcmUgaGFuZGxlZAorCXNvIHRoYXQgYm90aCBvZiB0aGVzZSB0cmFuc2Zvcm1hdGlvbnMgY2FuIGJlIGNvbXB1dGVkIGluIGEgc2luZ2xlCisJc3RlcC4KKworCSogW2dyYXBoaWNzL3BhaW50aW5nLmNdIFtncmFwaGljcy9wYXRoLmNdIFtpbmNsdWRlL3BhdGguaF0KKwlNb3JlIEdESSBwYXRoIHN1cHBvcnQuCisKKwkqIFtncmFwaGljcy94MTFkcnYvZ3JhcGhpY3MuY10KKwlGaXhlZCB0aGUgcmV0dXJuIHZhbHVlIG9mIEdSQVBIX0RyYXdBcmMgZm9yIHRoZSB6ZXJvIGhlaWdodCAvCisJemVybyB3aWR0aCBjYXNlIHRvIHJlZmxlY3QgV2luZG93cycgYmVoYXZpb3VyLgorCisJKiBbaW5jbHVkZS93aW5kb3dzLmhdIFtyZWxheTMyL2dkaTMyLnNwZWNdIFtvYmplY3RzL2RjLmNdCisJSW1wbGVtZW50ZWQgTW9kaWZ5V29ybGRUcmFuc2Zvcm0gYW5kIENvbWJpbmVUcmFuc2Zvcm0uCisKK1R1ZSBNYXkgMTQgMTg6MDM6NDYgMTk5OCAgRXJpYyBLb2hsIDxla29obEBhYm8ucmhlaW4temVpdHVuZy5kZT4KKworCSogW2NvbnRyb2xzL2NvbW1jdHJsLmNdW3JlbGF5MzIvY29tY3RsMzIuc3BlY10KKwkgIFtjb250cm9scy8qLmNdW2luY2x1ZGUvKi5oXQorCUltcGxlbWVudGVkIEluaXRDb21tb25Db250cm9sc0V4IChkbGwgdmVyc2lvbiA0LjcyIGNvbXBhdGlibGUpLgorCUluaXRDb21tb25Db250cm9scyBjYWxscyBJbWFnZUNvbW1vbkNvbnRyb2xzRXguCisJUmVnaXN0ZXJpbmcgY29kZSBvZiB0aGUgY29tbW9uIGNvbnRyb2xzIGhhZCB0byBiZSBjaGFuZ2VkCisJKHNlZSBYWFhYX1JlZ2lzdGVyIGZ1bmN0aW9ucykuCisKKwkqIFtjb250cm9scy9zdGF0dXMuY11baW5jbHVkZS9jb21tY3RybC5oXVtpbmNsdWRlL3N0YXR1cy5oXQorCUltcGxlbWVudGVkIG1vc3QgbmV3IGZlYXR1cmVzIGFuZCBmaXhlZCB0aGUgbG9vayBhbmQgZmVlbC4KKworCSogW2NvbnRvbHMvY29tbWN0cmwuY11baW5jbHVkZS9jb21tY3RybC5oXVtyZWxheTMyL2NvbWN0bDMyLnNwZWNdCisJSW1wbGVtZW50ZWQgTWVudUhlbHAgKGluY29tcGxldGUpLgorCisJKiBbY29udHJvbHMvc3RhdHVzLmNdW2NvbnRyb2xzL3Byb2dyZXNzLmNdCisJQ2hhbmdlZCBhbGxvY2F0aW9uIHN0cmF0ZWd5IGZvciBjb250cm9sIHNwZWNpZmljIG1lbW9yeS4KKworCSogW2NvbnRyb2xzL2hlYWRlci5jXVtpbmNsdWRlL2hlYWRlci5oXVtpbmNsdWRlL2NvbW1jdHJsLmhdCisJRmlyc3QgaW1wbGVtZW50YXRpb24gb2YgaGVhZGVyIGNvbnRyb2wuCisKKwkqIFt3aW5kb3dzL2RlZnduZC5jXVt3aW5kb3dzL3N5c2NvbG9ycy5jXQorCUZpeGVkIGRlZmF1bHQgY29udHJvbCBjb2xvcnMgZm9yIFdpbjk1IGxvb2suCisKKwkqIFt3aW5kb3dzL25vbmNsaWVudC5jXQorCUZpeGVkIG9mZiBieSBvbmUgZXJyb3IgZm9yIFdpbjk1IGxvb2suIFRvcCBib3JkZXIgb2YgY2hpbGQgd2luZG93cworCXNob3VsZCBiZSB2aXNpYmxlLgorCisJKiBbbWlzYy9pbWFnZWxpc3QuaF0KKwlJbXByb3ZlZCBkb2N1bWVudGF0aW9uIGFuZCBmaXhlZCBzb21lIGJ1Z3MuCisKK1RodSBNYXkgMTQgMTU6NDI6MjEgMTk5OCAgUm9iZXJ0IFdpbGhlbG0gIDxyb2JlcnRAcGh5c2lvbC5tZWQudHUtbXVlbmNoZW4uZGU+CisKKwkqIFtyZWxheTMyL2NydGRsbC5zcGVjXQorCUFkZGVkIGh5cG90LGowLGoxLGpuIGFuZCBjZWlsLgorCitXZWQgTWF5IDEzIDE5OjEwOjEwIDE5OTggIFBhc2NhbCBDdW9xIDxwY3VvcUBlbnMtbHlvbi5mcj4KKworCSogW2NvbnRyb2xzL2xpc3Rib3guY10KKwlJdGVtIGhlaWdodCBpcyBub3cgZXhhY3RseSBmb250IGhlaWdodC4KKwlXaW5lIGxpc3Rib3hlcyBub3cgYmVoYXZlIGxpa2UgV2luZG93cycgd2hlbiB0aGV5IGFyZSAKKwljcmVhdGVkIHdpdGhvdXQgV1NfVlNDUk9MTCBidXQgdGhlIHByb2dyYW0gc3Vic2VxdWVudGx5IAorCWNhbGxzIFNob3dTY3JvbGxCYXIgb3IgU2V0U2Nyb2xsSW5mby4KKworV2VkIE1heSAxMyAxODozMzowMSAxOTk4ICBVbHJpY2ggV2VpZ2FuZCA8d2VpZ2FuZEBpbmZvcm1hdGlrLnVuaS1lcmxhbmdlbi5kZT4KKworCSogW3JlbGF5MzIvcmVsYXkzODYuY10KKwlSZXN0b3JlIEVTIGFsc28gaW4gdGhlIG5vbi1kZWJ1ZyBjYXNlLgorCisJKiBbd2luZG93cy9ldmVudC5jXQorCUJ1Z2ZpeDogQmxvY2tpbmcgVFNYTmV4dEV2ZW50IGNvdWxkIGRlYWRsb2NrIFdpbmUuCisKKwkqIFt3aW4zMi9wcm9jZXNzLmNdIFt3aW5kb3dzL21lc3NhZ2UuY10KKwlTaWxseSBzdHVicyBmb3IgTXNnV2FpdEZvck11bHRpcGxlT2JqZWN0cyAvIFBvc3RUaHJlYWRNZXNzYWdlCisJdGhhdCBtYWtlIHNvbWUgcHJvZ3JhbXMgcnVuIGJldHRlci4KKworCSogW3dpbmRvd3Mvd2lucHJvYy5jXQorCVdJTlBST0NfTWFwTXNnMzJBdG8xNi8xNlRvMzJBOiBhZGRlZCBXTV9OT1RJRlkuICAKKworICAgICAgICAqIFt3aW4zMi9rZXJuZWwzMi5jXQorCUFkZGVkIDE2LT4zMiB0aHVua2luZyBhbmQgaW1wcm92ZWQgMzItPjE2IHRodW5raW5nIGZ1bmN0aW9ucy4KKworCSogW3Rvb2xzL2J1aWxkLmNdCisJQWRkZWQgbmV3IHZhcmlhbnQgb2YgQ2FsbEZyb20xNiBzdHViIGZvciB1c2Ugd2l0aCBXaW45NSB0aHVua3MuCisKKwkqIFtpZjE2MzIva2VybmVsLnNwZWNdIFtpZjE2MzIvYnVpbHRpbi5jXSBbd2luMzIva2VybmVsMzIuY10KKwlBZGRlZCBhIGZldyB1bmRvY3VtZW50ZWQgS0VSTkVMIGZ1bmN0aW9ucy4KKworCSogW2xvYWRlci9uZS9tb2R1bGUuY10gW2xvYWRlci9uZS9zZWdtZW50LmNdCisJQ2FsbCBEbGxFbnRyeVBvaW50IGZvciAxNi1iaXQgRExMcyB3aXRoIHN1YnN5c3RlbSA+PSA0LjAuCisKKwkqIFt3aW4zMi9rZXJuZWwzMi5zcGVjXSBbd2luMzIvd293MzIuc3BlY10gW3dpbjMyL29yZGluYWxzLmNdCisJVXNlIG5hbWVzIGZyb20gdGhlIE9jdCA5NCBiZXRhIHJlbGVhc2UgZm9yIHVuZG9jLiBmdW5jdGlvbnMuCisKK1dlZCBNYXkgMTMgMTQ6MTg6MjYgMTk5OCAgTWF0dGhldyBCZWNrZXIgPG1iZWNrZXJAZ2xhc3NjaXR5Lm5ldD4KKworCSogW21pc2MvcmVnaXN0cnkuY10KKwlDb2RlIGNsZWFudXAuCisKKwkqIFttaXNjL2NwdS5jXQorCUNvbW1lbnRlZCBvdXQgdGhlIHJlZ2lzdHJ5IHB1dHMgdGVtcG9yYXJpbHkuCisKKwkqIFtwcm9ncmFtcy9yZWd0ZXN0LypdCisJTmV3IHJlZ2lzdHJ5IHRlc3RpbmcgcHJvZ3JhbS4KKworVHVlIE1heSAxMiAyMjo1NDowMyAxOTk4ICBNaWNoYWVsIE1lc3MgPG1pY2hhZWxAa2F3bzIucnd0aC1hYWNoZW4uZGU+CisKKwkqIFttdWx0aW1lZGlhL2F1ZGlvLmNdCisJaW9jdGwncyBkbyBub3QgY29tbXV0ZSBpbiAvZGV2L2RzcCBpbml0aWFsaXphdGlvbi4KKworVHVlIE1heSAxMiAyMDoxMTo0MiAxOTk4ICBLYXJsIEdhcnJpc29uIDxrYXJsb3NAZXpuZXQubmV0PgorCisJKiBbd2luMzIvY29uc29sZS5jXQorCUltcGxlbWVudGVkIFNldENvbnNvbGVUZXh0QXR0cmlidXRlLCBGaWxsQ29uc29sZU91dHB1dENoYXJhY3Rlci4KKwlJbXByb3ZlZCBjdXJzb3IgcG9zaXRpb25pbmcuCisJVGhpcyBhbGxvd3MgZm9yIHRleHQgY29sb3JzIGluIGFuIHh0ZXJtLCByeHZ0LCBvciBjb25zb2xlLgorCitUdWUgTWF5IDEyIDE3OjU3OjUyIDE5OTggIFBldHRlciBSZWluaG9sZHRzZW4gPHBlcmVAdGQub3JnLnVpdC5ubz4KKworCSogW01ha2VmaWxlLmluXQorCUNyZWF0ZSBwcmVmaXgve2JpbnxsaWJ9IGRpcmVjdG9yaWVzIGlmIG1pc3NpbmcgZHVyaW5nIGluc3RhbGwuCisKK1N1biBNYXkgMTAgMTk6Mzc6NTEgMTk5OCAgSmFuIFdpbGxhbW93aXVzIDxqYW5AamFuaGguc2huZXQub3JnPgorCisJKiBbbXVsdGltZWRpYS9tbWlvLmNdCisJSGF2ZSBtbWlvU2V0QnVmZmVyIHJldHVybiBzdWNjZXNzICgwKSwgc28gQ29yZWwgRHJhdyA0CisJa2VlcHMgd29ya2luZy4gKElPIGlzIHN0aWxsIHVuYnVmZmVyZWQpCisKK1dlZCBNYXkgIDYgMTY6NTc6NTUgMTk5OCAgSmFtZXMgSnVyYW4gPGpyajEyMEBwc3UuZWR1PgorCisgICAgICAgICogW01ha2VmaWxlLmluXSBbTWFrZS5ydWxlcy5pbl0KKwlDaGFuZ2VkICJtYWtlIGNsZWFuIiB0byByZW1vdmUgYHRleHRlZGl0YCBiYWNrdXAgZmlsZXMgKColKQorCisJKiBbY29udHJvbHMvbWVudS5jXVtncmFwaGljcy94MTFkcnYveGZvbnQuY11baW5jbHVkZS9saWJyZXMuaF0KKwkgIFtsb2FkZXIvbWFpbi5jXVtsb2FkZXIvbmUvbW9kdWxlLmNdW3NjaGVkdWxlci9zeW5jaHJvLmNdCisJICBbd2luMzIvdGltZS5jXVt3aW5kb3dzL3dpbnBvcy5jXVtpbmNsdWRlL3dpbmRvd3MuaF0KKwlGaXhlZCBtaXNjZWxsYW5lb3VzIGNvbXBpbGF0aW9uIHdhcm5pbmdzLgorCisJKiBbbWlzYy9tYWluLmNdW21pc2NlbXUvbWFpbi5jXVtpbmNsdWRlL21haW4uaF0KKwlNb3ZlZCBwcm90b3R5cGVzIHRvIG5ldyBpbmNsdWRlIGZpbGUgbWFpbi5oLCB2YXJpb3VzIGNsZWFudXBzLgorCitUdWUgTWF5ICA1IDIxOjA1OjA2IDE5OTggIE1vcnRlbiBXZWxpbmRlciAgPHRlcnJhQGRpa3UuZGs+CisKKwkqIFttaXNjL3dpbnNvY2suY10KKwlEb24ndCByZWZlciB0byBfX0ZyZWVCU0RfXyB3aGVuIEhBVkVfU1RSRVJST1IgaXMgbWVhbnQuCisKKwkqIFttaXNjL2RlYnVnc3RyLmNdCisJRm9yIGRlYnVnX2R1bXBzdHJTZW5kLCBzZW5kIHN0cmluZ3MgdG8gc3RkZXJyLgorCitUdWUgTWF5ICA1IDIxOjQ3OjQwIDE5OTggIEh1dyBEIE0gRGF2aWVzIDxoLmRhdmllczFAcGh5c2ljcy5veGZvcmQuYWMudWs+CisKKwkqIFtvYmplY3RzL3JlZ2lvbi5jXQorCUZpeCBmb3IgUkVHSU9OX1JlZ2lvbk9wKCkgaWYgbmV3UmVnIGlzIG9uZSBvZiB0aGUgc291cmNlIHJlZ2lvbnMuCisKK1R1ZSBNYXkgIDUgMTg6Mjc6MzIgMTk5OCAgSmltIFBldGVyc29uIDxqc3BldGVyQHJvYW5va2UuaW5maS5uZXQ+CisKKwkqIFttaXNjL21haW4uY10KKwlBZGQgJy1oLy1oZWxwJyBvcHRpb24gYW5kIHByaW50IFdJTkVfUkVMRUFTRV9JTkZPIHdpdGggdXNhZ2UgbWVzc2FnZS4KKworCSogW21pc2Mvc3B5LmNdCisJUmVhbGlnbiB0cmFjZSBtZXNzYWdlcy4KKworVHVlIE1heSAgNSAxNTo0Njo0NyAxOTk4ICBEb25uaWUgVi4gU2F2YWdlIDxkc2F2YWdlQGNpc2NvLmNvbT4KKworCSogW2dyYXBoaWNzL2RkcmF3LmNdCisJRml4ZWQgY29tcGlsZSB3YXJuaW5ncworCisJKiBbbWlzYy93aW5zb2NrLmNdCisJV2FybmluZ3Mgc2hvdWxkIG5vdCBiZSBlcnJvcnMuCisKK1R1ZSBNYXkgIDUgMTM6NDA6NDIgMTk5OCAgSmltIFBldGVyc29uIDxqc3BldGVyQHJvYW5va2UuaW5maS5uZXQ+CisKKwkqIFsqLypdCisJUmVtb3ZlIG1hbnkgd2FybmluZ3MgdGhyb3VnaCBleHBsaWNpdCBjYXN0cywgYWRkZWQgI2luY2x1ZGUncywKKwlhbmQgY29ycmVjdGVkIHByaW50ZiBmb3JtYXRzLgorCitUdWUgTWF5ICA1IDA1OjE4OjEyIDE5OTggIEluc29tbmlhIChTdGVhIEdyZWVuZSkgPGluc29tbmlhQGNvcmUuYmluZ2hhbXRvbi5lZHU+CisKKwkqIFtncmFwaGljcy9kZHJhdy5jXQorCUtlcHQgdW5jaGFuZ2VkIHBvcnRpb24gb2Ygb2xkIHBhbGV0dGUgd2hlbiBjaGFuZ2luZyBvbmx5IGEgZmV3CisJcGFsZXR0ZSBlbnRyaWVzLiAgUmVhbGx5IHNob3VsZCBvbmx5IGRlYWxsb2NhdGUgdGhlIGNoYW5nZWQgY2VsbHMuCisJVGhpcyBtYWtlIFN0YXJDcmFmdCB3b3JrIGFsbW9zdCBwZXJmZWN0bHkgKHNvdW5kIG92ZXJmbG93cyBzdGlsbAorCWNhdXNlIHN0YXRpYykuCisKK01vbiBNYXkgIDQgMTU6MDQ6NTcgMTk5OCAgQWxleGFuZGVyIFYuIEx1a3lhbm92IDxsYXZAbG9uZy55YXIucnU+CisKKwkqIFttaXNjL2xzdHIuY10KKwlGb3JtYXRNZXNzYWdlOiB0ZXJtaW5hdGUgc3RyaW5nIG9uICUwLCB1bmRvIGxpbmVmZWVkIHN0cmlwLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBUaHUgQXByIDMwIDE2OjI4OjEyIDE5OTggIEphbWVzIEp1cmFuIDxqcmoxMjBAcHN1LmVkdT4KIAogCSogW3NjaGVkdWxlci9wcm9jZXNzLmNdCmRpZmYgLS1naXQgYS9NYWtlLnJ1bGVzLmluIGIvTWFrZS5ydWxlcy5pbgppbmRleCA3NmEyZjFjLi45MDgwYjkzIDEwMDY0NAotLS0gYS9NYWtlLnJ1bGVzLmluCisrKyBiL01ha2UucnVsZXMuaW4KQEAgLTEzMiw3ICsxMzIsNyBAQAogCSQoTUFLRURFUCkgJChESVZJTkNMKSAtQyQoU1JDRElSKSAkKENfU1JDUykgJChSQ19TUkNTKSAkKEVYVFJBX1NSQ1MpCiAKIGNsZWFuOjoKLQkkKFJNKSAqLm8gXCMqXCMgKn4gKi5iYWsgKi5vcmlnICoucmVqICouZmxjICotdG1wLmMgeS50YWIuYyB5LnRhYi5oIGxleC55eS5jIGNvcmUgJChHRU5fQVNNX1NSQ1MpICQoUkNfU1JDUzoucmM9LmMpICQoUkNfU1JDUzoucmM9LmgpICQoUFJPR1JBTVMpCisJJChSTSkgKi5vIFwjKlwjICp+IColICouYmFrICoub3JpZyAqLnJlaiAqLmZsYyAqLXRtcC5jIHkudGFiLmMgeS50YWIuaCBsZXgueXkuYyBjb3JlICQoR0VOX0FTTV9TUkNTKSAkKFJDX1NSQ1M6LnJjPS5jKSAkKFJDX1NSQ1M6LnJjPS5oKSAkKFBST0dSQU1TKQogCiBkdW1teToKIApkaWZmIC0tZ2l0IGEvTWFrZWZpbGUuaW4gYi9NYWtlZmlsZS5pbgppbmRleCBjOTU0OGZhLi5hZDAyM2Q5IDEwMDY0NAotLS0gYS9NYWtlZmlsZS5pbgorKysgYi9NYWtlZmlsZS5pbgpAQCAtMTIyLDYgKzEyMiw4IEBACiAJJChDQykgLXNoYXJlZCAtV2wsLXNvbmFtZSxsaWJ3aW5lLnNvIC1vJEAgJChMSUJPQkpTKSAkKExET1BUSU9OUykgJChYX0xJQlMpICQoWFBNX0xJQikgJChYTElCKSAkKExJQlMpCiAKIGluc3RhbGxfZW11OiBpbnN0YWxsX2xpYgorCS1ta2RpcmhpZXIgJChiaW5kaXIpCisJLW1rZGlyaGllciAkKGxpYmRpcikKIAkkKElOU1RBTExfUFJPR1JBTSkgd2luZSAkKGJpbmRpcikvd2luZQogCSQoSU5TVEFMTF9EQVRBKSB3aW5lLnN5bSAkKGxpYmRpcikvd2luZS5zeW0KIApAQCAtMTU3LDcgKzE1OSw3IEBACiAKIGNsZWFuOjoKIAlmb3IgaSBpbiAkKEFMTFNVQkRJUlMpOyBkbyAoY2QgJCRpOyAkKE1BS0UpIGNsZWFuKSB8fCBleGl0IDE7IGRvbmUKLQlmb3IgaSBpbiBpbmNsdWRlOyBkbyAoY2QgJCRpOyAkKFJNKSAqLm8gXCMqXCMgKn4gKi5iYWsgKi5vcmlnICoucmVqICouZmxjKTsgZG9uZQorCWZvciBpIGluIGluY2x1ZGU7IGRvIChjZCAkJGk7ICQoUk0pICoubyBcIypcIyAqfiAqJSAqLmJhayAqLm9yaWcgKi5yZWogKi5mbGMpOyBkb25lCiAJJChSTSkgd2luZSB3aW5lLnN5bSBsaWJ3aW5lLmEgbGlid2luZS5zby4xLjAgVEFHUwogCiBkaXN0Y2xlYW46IGNsZWFuCmRpZmYgLS1naXQgYS9jb25maWd1cmUgYi9jb25maWd1cmUKaW5kZXggOGExMWEwYy4uNTg2M2NiMiAxMDA3NTUKLS0tIGEvY29uZmlndXJlCisrKyBiL2NvbmZpZ3VyZQpAQCAtMjEzNSwzMCArMjEzNSwzMyBAQAogaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTM2OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgYWNfY3ZfY19vcGVuc291bmRzeXN0ZW09InllcyIKLQljYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9PU1MgMQotRU9GCi0KIGVsc2UKICAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKICAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAgIHJtIC1yZiBjb25mdGVzdCoKICAgYWNfY3ZfY19vcGVuc291bmRzeXN0ZW09Im5vIgotCiBmaQogcm0gLWYgY29uZnRlc3QqCiBmaQogCiBlY2hvICIkYWNfdCIiJGFjX2N2X2Nfb3BlbnNvdW5kc3lzdGVtIiAxPiY2CiAKK2lmIHRlc3QgIiRhY19jdl9jX29wZW5zb3VuZHN5c3RlbSIgPSAieWVzIgordGhlbgorICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX09TUyAxCitFT0YKKworZmkKKwogCiBlY2hvICRhY19uICJjaGVja2luZyAiZm9yIHVuaW9uIHNlbXVuIiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjE1NzogY2hlY2tpbmcgImZvciB1bmlvbiBzZW11biIiID4mNQorZWNobyAiY29uZmlndXJlOjIxNjA6IGNoZWNraW5nICJmb3IgdW5pb24gc2VtdW4iIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX3VuaW9uX3NlbXVuJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjE2MiAiY29uZmlndXJlIgorI2xpbmUgMjE2NSAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3NlbS5oPgpAQCAtMjE2Niw3ICsyMTY5LDcgQEAKIHVuaW9uIHNlbXVuIGZvbwogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIxNzA6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjE3MzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGFjX2N2X2NfdW5pb25fc2VtdW49InllcyIKIGVsc2UKQEAgLTIxOTQsNyArMjE5Nyw3IEBACiB0aGVuCiAgIENGTEFHUz0iJENGTEFHUyAtV2FsbCIKICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgImZvciBnY2Mgc3RyZW5ndGgtcmVkdWNlIGJ1ZyIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIxOTg6IGNoZWNraW5nICJmb3IgZ2NjIHN0cmVuZ3RoLXJlZHVjZSBidWciIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToyMjAxOiBjaGVja2luZyAiZm9yIGdjYyBzdHJlbmd0aC1yZWR1Y2UgYnVnIiIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19nY2Nfc3RyZW5ndGhfYnVnJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTIyMDIsNyArMjIwNSw3IEBACiAgIGFjX2N2X2NfZ2NjX3N0cmVuZ3RoX2J1Zz0ieWVzIgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMjA2ICJjb25maWd1cmUiCisjbGluZSAyMjA5ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIAogaW50IG1haW4odm9pZCkgewpAQCAtMjIxMyw3ICsyMjE2LDcgQEAKICAgZXhpdCggQXJyYXlbMV0gIT0gLTIgKTsKIH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjE3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3QgJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIyMjA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKIHRoZW4KICAgYWNfY3ZfY19nY2Nfc3RyZW5ndGhfYnVnPSJubyIKIGVsc2UKQEAgLTIyMzYsNyArMjIzOSw3IEBACiAKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgIndoZXRoZXIgZXh0ZXJuYWwgc3ltYm9scyBuZWVkIGFuIHVuZGVyc2NvcmUgcHJlZml4IiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjI0MDogY2hlY2tpbmcgIndoZXRoZXIgZXh0ZXJuYWwgc3ltYm9scyBuZWVkIGFuIHVuZGVyc2NvcmUgcHJlZml4IiIgPiY1CitlY2hvICJjb25maWd1cmU6MjI0MzogY2hlY2tpbmcgIndoZXRoZXIgZXh0ZXJuYWwgc3ltYm9scyBuZWVkIGFuIHVuZGVyc2NvcmUgcHJlZml4IiIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19leHRlcm5fcHJlZml4JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTIyNDgsMTQgKzIyNTEsMTQgQEAKIAkubG9uZyAwCiBFT0YKIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyNTIgImNvbmZpZ3VyZSIKKyNsaW5lIDIyNTUgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogZXh0ZXJuIGludCBhY190ZXN0OwogaW50IG1haW4oKSB7CiBpZiAoYWNfdGVzdCkgcmV0dXJuIDEKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjU5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjI2MjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgYWNfY3ZfY19leHRlcm5fcHJlZml4PSJ5ZXMiCiBlbHNlCkBAIC0yMjc5LDcgKzIyODIsNyBAQAogCiAKIGVjaG8gJGFjX24gImNoZWNraW5nICJ3aGV0aGVyIGFzc2VtYmxlciBhY2NlcHRzIC5zdHJpbmciIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMjgzOiBjaGVja2luZyAid2hldGhlciBhc3NlbWJsZXIgYWNjZXB0cyAuc3RyaW5nIiIgPiY1CitlY2hvICJjb25maWd1cmU6MjI4NjogY2hlY2tpbmcgIndoZXRoZXIgYXNzZW1ibGVyIGFjY2VwdHMgLnN0cmluZyIiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfYXNtX3N0cmluZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC0yMjg5LDE0ICsyMjkyLDE0IEBACiAJLnN0cmluZyAidGVzdCIKIEVPRgogY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjI5MyAiY29uZmlndXJlIgorI2xpbmUgMjI5NiAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAKIGludCBtYWluKCkgewogCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjMwMDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIzMDM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGFjX2N2X2NfYXNtX3N0cmluZz0ieWVzIgogZWxzZQpAQCAtMjMyMywyMSArMjMyNiwyMSBAQAogaWYgdGVzdCAiJExJQl9UQVJHRVQiID0gImxpYndpbmUuc28uMS4wIgogdGhlbgogICBlY2hvICRhY19uICJjaGVja2luZyAid2hldGhlciB3ZSBjYW4gYnVpbGQgYSBkbGwiIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzI3OiBjaGVja2luZyAid2hldGhlciB3ZSBjYW4gYnVpbGQgYSBkbGwiIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToyMzMwOiBjaGVja2luZyAid2hldGhlciB3ZSBjYW4gYnVpbGQgYSBkbGwiIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2RsbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIHNhdmVkX2NmbGFncz0kQ0ZMQUdTCiAgIENGTEFHUz0iJENGTEFHUyAtZlBJQyAtc2hhcmVkIC1XbCwtc29uYW1lLGNvbmZ0ZXN0LnNvLjEuMCIKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjMzNCAiY29uZmlndXJlIgorI2xpbmUgMjMzNyAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAKIGludCBtYWluKCkgewogcmV0dXJuIDEKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzQxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjM0NDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgYWNfY3ZfY19kbGw9InllcyIKIGVsc2UKQEAgLTIzNjMsNyArMjM2Niw3IEBACiAKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgImZvciByZWVudHJhbnQgWCBsaWJyYXJpZXMiIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzY3OiBjaGVja2luZyAiZm9yIHJlZW50cmFudCBYIGxpYnJhcmllcyIiID4mNQorZWNobyAiY29uZmlndXJlOjIzNzA6IGNoZWNraW5nICJmb3IgcmVlbnRyYW50IFggbGlicmFyaWVzIiIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snd2luZV9jdl94X3JlZW50cmFudCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC0yNDA3LDEyICsyNDEwLDEyIEBACiBmb3IgYWNfZnVuYyBpbiBjbG9uZSBnZXRwYWdlc2l6ZSBtZW1tb3ZlIHNpZ2FsdHN0YWNrIHN0cmVycm9yIHRjZ2V0YXR0ciB0aW1lZ20gdXNsZWVwIHdhaXQ0IHdhaXRwaWQKIGRvCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI0MTE6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitlY2hvICJjb25maWd1cmU6MjQxNDogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjQxNiAiY29uZmlndXJlIgorI2xpbmUgMjQxOSAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCiAgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCkBAIC0yNDM1LDcgKzI0MzgsNyBAQAogCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQzOTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI0NDI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgogZWxzZQpAQCAtMjQ2MywxNyArMjQ2NiwxNyBAQAogZG8KIGFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI0Njc6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToyNDcwOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjQ3MiAiY29uZmlndXJlIgorI2xpbmUgMjQ3NSAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8JGFjX2hkcj4KIEVPRgogYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQ3NzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MjQ4MDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KIGFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0YAogaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgpAQCAtMjUwMCwxMiArMjUwMywxMiBAQAogZG9uZQogCiBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHN0YXQgZmlsZS1tb2RlIG1hY3JvcyBhcmUgYnJva2VuIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNTA0OiBjaGVja2luZyB3aGV0aGVyIHN0YXQgZmlsZS1tb2RlIG1hY3JvcyBhcmUgYnJva2VuIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToyNTA3OiBjaGVja2luZyB3aGV0aGVyIHN0YXQgZmlsZS1tb2RlIG1hY3JvcyBhcmUgYnJva2VuIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfc3RhdF9icm9rZW4nK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNTA5ICJjb25maWd1cmUiCisjbGluZSAyNTEyICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgpAQCAtMjU1NiwxMiArMjU1OSwxMiBAQAogZmkKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI1NjA6IGNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiA+JjUKK2VjaG8gImNvbmZpZ3VyZToyNTYzOiBjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19jb25zdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI1NjUgImNvbmZpZ3VyZSIKKyNsaW5lIDI1NjggImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogCiBpbnQgbWFpbigpIHsKQEAgLTI2MTAsNyArMjYxMyw3IEBACiAKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNjE0OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI2MTc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBhY19jdl9jX2NvbnN0PXllcwogZWxzZQpAQCAtMjYzMSwxMiArMjYzNCwxMiBAQAogZmkKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI2MzU6IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToyNjM4OiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX3N0ZGMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNjQwICJjb25maWd1cmUiCisjbGluZSAyNjQzICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdGRhcmcuaD4KQEAgLTI2NDQsNyArMjY0Nyw3IEBACiAjaW5jbHVkZSA8ZmxvYXQuaD4KIEVPRgogYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjY0ODogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MjY1MTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KIGFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0YAogaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgpAQCAtMjY2MSw3ICsyNjY0LDcgQEAKIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCiAgICMgU3VuT1MgNC54IHN0cmluZy5oIGRvZXMgbm90IGRlY2xhcmUgbWVtKiwgY29udHJhcnkgdG8gQU5TSS4KIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI2NjUgImNvbmZpZ3VyZSIKKyNsaW5lIDI2NjggImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2luY2x1ZGUgPHN0cmluZy5oPgogRU9GCkBAIC0yNjc5LDcgKzI2ODIsNyBAQAogaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KICAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgogY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjY4MyAiY29uZmlndXJlIgorI2xpbmUgMjY4NiAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8c3RkbGliLmg+CiBFT0YKQEAgLTI3MDAsNyArMjcwMyw3IEBACiAgIDoKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjcwNCAiY29uZmlndXJlIgorI2xpbmUgMjcwNyAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8Y3R5cGUuaD4KICNkZWZpbmUgSVNMT1dFUihjKSAoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ3onKQpAQCAtMjcxMSw3ICsyNzE0LDcgQEAKIGV4aXQgKDApOyB9CiAKIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNzE1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3QgJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI3MTg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKIHRoZW4KICAgOgogZWxzZQpAQCAtMjczNSwxMiArMjczOCwxMiBAQAogZmkKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHNpemVfdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjczOTogY2hlY2tpbmcgZm9yIHNpemVfdCIgPiY1CitlY2hvICJjb25maWd1cmU6Mjc0MjogY2hlY2tpbmcgZm9yIHNpemVfdCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9zaXplX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNzQ0ICJjb25maWd1cmUiCisjbGluZSAyNzQ3ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpZiBTVERDX0hFQURFUlMKQEAgLTI3NjgsNyArMjc3MSw3IEBACiBmaQogCiBlY2hvICRhY19uICJjaGVja2luZyBzaXplIG9mIGxvbmcgbG9uZyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mjc3MjogY2hlY2tpbmcgc2l6ZSBvZiBsb25nIGxvbmciID4mNQorZWNobyAiY29uZmlndXJlOjI3NzU6IGNoZWNraW5nIHNpemUgb2YgbG9uZyBsb25nIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9zaXplb2ZfbG9uZ19sb25nJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTI3NzYsNyArMjc3OSw3IEBACiAgIGFjX2N2X3NpemVvZl9sb25nX2xvbmc9MAogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNzgwICJjb25maWd1cmUiCisjbGluZSAyNzgzICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKICNpbmNsdWRlIDxzdGRpby5oPgogbWFpbigpCkBAIC0yNzg3LDcgKzI3OTAsNyBAQAogICBleGl0KDApOwogfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI3OTE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjc5NDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAogdGhlbgogICBhY19jdl9zaXplb2ZfbG9uZ19sb25nPWBjYXQgY29uZnRlc3R2YWxgCiBlbHNlCkBAIC0yODA3LDggKzI4MTAsMjEzIEBACiAKIAogCisKK2lmIHRlc3QgIiRhY19jdl9oZWFkZXJfc3lzX3Zmc19oIiA9ICJ5ZXMiCit0aGVuCisgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgIndoZXRoZXIgc3lzL3Zmcy5oIGRlZmluZXMgc3RhdGZzIiIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjgxODogY2hlY2tpbmcgIndoZXRoZXIgc3lzL3Zmcy5oIGRlZmluZXMgc3RhdGZzIiIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snd2luZV9jdl9zeXNfdmZzX2hhc19zdGF0ZnMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyODIzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworCSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKwkjaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAorCSMgaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisJI2VuZGlmCisJI2luY2x1ZGUgPHN5cy92ZnMuaD4KKwkKK2ludCBtYWluKCkgeworCisJCXN0cnVjdCBzdGF0ZnMgc3RmczsKKworCQltZW1zZXQoJnN0ZnMsMCxzaXplb2Yoc3RmcykpOworCQorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI4NDA6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICB3aW5lX2N2X3N5c192ZnNfaGFzX3N0YXRmcz15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgd2luZV9jdl9zeXNfdmZzX2hhc19zdGF0ZnM9bm8KKwkKK2ZpCitybSAtZiBjb25mdGVzdCoKKyAgICAKK2ZpCisKK2VjaG8gIiRhY190IiIkd2luZV9jdl9zeXNfdmZzX2hhc19zdGF0ZnMiIDE+JjYKKyAgICBpZiB0ZXN0ICIkd2luZV9jdl9zeXNfdmZzX2hhc19zdGF0ZnMiID0gInllcyIKKyAgICB0aGVuCisgICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgU1RBVEZTX0RFRklORURfQllfU1lTX1ZGUyAxCitFT0YKKworICAgIGZpCitmaQorCitpZiB0ZXN0ICIkYWNfY3ZfaGVhZGVyX3N5c19zdGF0ZnNfaCIgPSAieWVzIgordGhlbgorICAgIGVjaG8gJGFjX24gImNoZWNraW5nICJ3aGV0aGVyIHN5cy9zdGF0ZnMuaCBkZWZpbmVzIHN0YXRmcyIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI4Njc6IGNoZWNraW5nICJ3aGV0aGVyIHN5cy9zdGF0ZnMuaCBkZWZpbmVzIHN0YXRmcyIiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J3dpbmVfY3Zfc3lzX3N0YXRmc19oYXNfc3RhdGZzJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjg3MiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKwkjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisJI2lmZGVmIEhBVkVfU1lTX1BBUkFNX0gKKwkjIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgorCSNlbmRpZgorCSNpbmNsdWRlIDxzeXMvc3RhdGZzLmg+CisJCitpbnQgbWFpbigpIHsKKworCQlzdHJ1Y3Qgc3RhdGZzIHN0ZnM7CisJCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjg4NzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIHdpbmVfY3Zfc3lzX3N0YXRmc19oYXNfc3RhdGZzPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICB3aW5lX2N2X3N5c19zdGF0ZnNfaGFzX3N0YXRmcz1ubworCQorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorICAgIAorZmkKKworZWNobyAiJGFjX3QiIiR3aW5lX2N2X3N5c19zdGF0ZnNfaGFzX3N0YXRmcyIgMT4mNgorICAgIGlmIHRlc3QgIiR3aW5lX2N2X3N5c19zdGF0ZnNfaGFzX3N0YXRmcyIgPSAieWVzIgorICAgIHRoZW4KKyAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBTVEFURlNfREVGSU5FRF9CWV9TWVNfU1RBVEZTIDEKK0VPRgorCisgICAgZmkKK2ZpCisKK2lmIHRlc3QgIiRhY19jdl9oZWFkZXJfc3lzX21vdW50X2giID0gInllcyIKK3RoZW4KKyAgICBlY2hvICRhY19uICJjaGVja2luZyAid2hldGhlciBzeXMvbW91bnQuaCBkZWZpbmVzIHN0YXRmcyIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI5MTQ6IGNoZWNraW5nICJ3aGV0aGVyIHN5cy9tb3VudC5oIGRlZmluZXMgc3RhdGZzIiIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snd2luZV9jdl9zeXNfbW91bnRfaGFzX3N0YXRmcycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI5MTkgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCisJI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCSNpZmRlZiBIQVZFX1NZU19QQVJBTV9ICisJIyBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKwkjZW5kaWYKKwkjaW5jbHVkZSA8c3lzL21vdW50Lmg+CisJCitpbnQgbWFpbigpIHsKKworCQlzdHJ1Y3Qgc3RhdGZzIHN0ZnM7CisJCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjkzNDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIHdpbmVfY3Zfc3lzX21vdW50X2hhc19zdGF0ZnM9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIHdpbmVfY3Zfc3lzX21vdW50X2hhc19zdGF0ZnM9bm8KKwkKK2ZpCitybSAtZiBjb25mdGVzdCoKKyAgICAKK2ZpCisKK2VjaG8gIiRhY190IiIkd2luZV9jdl9zeXNfbW91bnRfaGFzX3N0YXRmcyIgMT4mNgorICAgIGlmIHRlc3QgIiR3aW5lX2N2X3N5c19tb3VudF9oYXNfc3RhdGZzIiA9ICJ5ZXMiCisgICAgdGhlbgorICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIFNUQVRGU19ERUZJTkVEX0JZX1NZU19NT1VOVCAxCitFT0YKKworICAgIGZpCitmaQorCisKK2VjaG8gJGFjX24gImNoZWNraW5nICJmb3Igc3RhdGZzLmZfYmZyZWUiIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyOTYwOiBjaGVja2luZyAiZm9yIHN0YXRmcy5mX2JmcmVlIiIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snd2luZV9jdl9zdGF0ZnNfYmZyZWUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICAgaWYgdGVzdCAieCRzdGF0ZnNfYmZyZWUiID0gInhubyIKKyAgICB0aGVuCisgICAgICAgIHdpbmVfY3Zfc3RhdGZzX2JmcmVlPW5vCisgICAgZWxzZQorICAgIAljYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyOTY5ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworCSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKwkjaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAorCSMgaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisJI2VuZGlmCisJI2lmZGVmIFNUQVRGU19ERUZJTkVEX0JZX1NZU19NT1VOVAorCSMgaW5jbHVkZSA8c3lzL21vdW50Lmg+CisJI2Vsc2UKKwkjIGlmZGVmIFNUQVRGU19ERUZJTkVEX0JZX1NZU19WRlMKKwkjICBpbmNsdWRlIDxzeXMvdmZzLmg+CisJIyBlbHNlCisJIyAgaWZkZWYgU1RBVEZTX0RFRklORURfQllfU1lTX1NUQVRGUworCSMgICBpbmNsdWRlIDxzeXMvc3RhdGZzLmg+CisJIyAgZW5kaWYKKwkjIGVuZGlmCisJI2VuZGlmCisJCitpbnQgbWFpbigpIHsKKworCQlzdHJ1Y3Qgc3RhdGZzIHN0ZnM7CisKKwkJc3Rmcy5mX2JmcmVlKys7CisJCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjk5NjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIHdpbmVfY3Zfc3RhdGZzX2JmcmVlPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICB3aW5lX2N2X3N0YXRmc19iZnJlZT1ubworCQorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorICAgIGZpICAKK2ZpCisKK2VjaG8gIiRhY190IiIkd2luZV9jdl9zdGF0ZnNfYmZyZWUiIDE+JjYKK2lmIHRlc3QgIiR3aW5lX2N2X3N0YXRmc19iZnJlZSIgPSAieWVzIgordGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgU1RBVEZTX0hBU19CRlJFRSAxCitFT0YKKworZmkKKwogZWNobyAkYWNfbiAiY2hlY2tpbmcgImZvciBzdGF0ZnMuZl9iYXZhaWwiIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyODEyOiBjaGVja2luZyAiZm9yIHN0YXRmcy5mX2JhdmFpbCIiID4mNQorZWNobyAiY29uZmlndXJlOjMwMjA6IGNoZWNraW5nICJmb3Igc3RhdGZzLmZfYmF2YWlsIiIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snd2luZV9jdl9zdGF0ZnNfYmF2YWlsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTI4MTcsMjEgKzMwMjUsMjMgQEAKICAgICAgICAgd2luZV9jdl9zdGF0ZnNfYmF2YWlsPW5vCiAgICAgZWxzZQogICAgIAljYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyODIxICJjb25maWd1cmUiCisjbGluZSAzMDI5ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIAogCSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIAkjaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAogCSMgaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiAJI2VuZGlmCi0JI2lmZGVmIEhBVkVfU1lTX1NUQVRGU19ICi0JIyBpbmNsdWRlIDxzeXMvc3RhdGZzLmg+Ci0JI2VuZGlmCi0JI2lmZGVmIEhBVkVfU1lTX01PVU5UX0gKKwkjaWZkZWYgU1RBVEZTX0RFRklORURfQllfU1lTX01PVU5UCiAJIyBpbmNsdWRlIDxzeXMvbW91bnQuaD4KLQkjZW5kaWYKLQkjaWZkZWYgSEFWRV9TWVNfVkZTX0gKLQkjIGluY2x1ZGUgPHN5cy92ZnMuaD4KKwkjZWxzZQorCSMgaWZkZWYgU1RBVEZTX0RFRklORURfQllfU1lTX1ZGUworCSMgIGluY2x1ZGUgPHN5cy92ZnMuaD4KKwkjIGVsc2UKKwkjICBpZmRlZiBTVEFURlNfREVGSU5FRF9CWV9TWVNfU1RBVEZTCisJIyAgIGluY2x1ZGUgPHN5cy9zdGF0ZnMuaD4KKwkjICBlbmRpZgorCSMgZW5kaWYKIAkjZW5kaWYKIAkKIGludCBtYWluKCkgewpAQCAtMjg0Miw3ICszMDUyLDcgQEAKIAkKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyODQ2OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMwNTY6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICB3aW5lX2N2X3N0YXRmc19iYXZhaWw9eWVzCiBlbHNlCkBAIC0yODY1LDYwICszMDc1LDc1IEBACiAKIGZpCiAKLWVjaG8gJGFjX24gImNoZWNraW5nICJmb3Igc3RhdGZzLmZfYmZyZWUiIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyODcwOiBjaGVja2luZyAiZm9yIHN0YXRmcy5mX2JmcmVlIiIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snd2luZV9jdl9zdGF0ZnNfYmZyZWUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorCitlY2hvICRhY19uICJjaGVja2luZyAiZm9yIHdvcmtpbmcgc2lnYWx0c3RhY2siIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozMDgxOiBjaGVja2luZyAiZm9yIHdvcmtpbmcgc2lnYWx0c3RhY2siIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX3dvcmtpbmdfc2lnYWx0c3RhY2snK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQotICAgaWYgdGVzdCAieCRzdGF0ZnNfYmZyZWUiID0gInhubyIKLSAgICB0aGVuCi0gICAgICAgIHdpbmVfY3Zfc3RhdGZzX2JmcmVlPW5vCi0gICAgZWxzZQotICAgIAljYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyODc5ICJjb25maWd1cmUiCisgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCisgIGFjX2N2X2Nfd29ya2luZ19zaWdhbHRzdGFjaz0ibm8iCisKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzA5MCAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAKKwkjaW5jbHVkZSA8c3RkaW8uaD4KKwkjaW5jbHVkZSA8dGltZS5oPiAvKiA8c3lzL3RpbWUuaD4gPyBiYWQgbWFnaWMgd2l0aG91dCBlbmQgKi8KIAkjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisJI2luY2x1ZGUgPHN5cy9zaWduYWwuaD4KIAkjaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAogCSMgaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiAJI2VuZGlmCi0JI2lmZGVmIEhBVkVfU1lTX1NUQVRGU19ICi0JIyBpbmNsdWRlIDxzeXMvc3RhdGZzLmg+Ci0JI2VuZGlmCi0JI2lmZGVmIEhBVkVfU1lTX01PVU5UX0gKLQkjIGluY2x1ZGUgPHN5cy9tb3VudC5oPgotCSNlbmRpZgotCSNpZmRlZiBIQVZFX1NZU19WRlNfSAotCSMgaW5jbHVkZSA8c3lzL3Zmcy5oPgorCSNpZmRlZiBIQVZFX1NZU0NBTExfSAorCSMgaW5jbHVkZSA8c3lzY2FsbC5oPgorCSNlbHNlCisJIyBpZmRlZiBIQVZFX1NZU19TWVNDQUxMX0gKKwkjICBpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorCSMgZW5kaWYKIAkjZW5kaWYKIAkKLWludCBtYWluKCkgeworCXVuc2lnbmVkIGNoYXIgKnhhbHRzdGFjazsKIAotCQlzdHJ1Y3Qgc3RhdGZzIHN0ZnM7CisJaW50CisJbWFpbihpbnQgYXJnYyxjaGFyICoqYXJndikgeworCSAgICBzdHJ1Y3Qgc2lnYWx0c3RhY2sJc3M7CiAKLQkJc3Rmcy5mX2JmcmVlKys7CisJICAgIHhhbHRzdGFjayA9IG1hbGxvYygxNjM4NCk7CisJICAgIHNzLnNzX3NwICAgID0geGFsdHN0YWNrOworCSAgICBzcy5zc19zaXplICA9IDE2Mzg0OworCSAgICBzcy5zc19mbGFncyA9IDA7CisJICAgIGlmIChzaWdhbHRzdGFjaygmc3MsIE5VTEwpIDwgMCkgeworCSAgICAJLyogdGhpcyBjYXRjaGVzIHRoZSBnbGliYyBjYXNlICovCisJCXBlcnJvcigic2lnYWx0c3RhY2siKTsKKwkgICAgCXJldHVybiAoMSk7IC8qIGFrYSBleGl0KDEpIGFrYSBmYWlsICovCisJICAgIH0KKwkgICAgLyogYXNzdW1lIGl0IHdvcmtzLiAqLworCSAgICByZXR1cm4gMDsgLyogT0sgKi8KKwl9CiAJCi07IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjkwNDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIHdpbmVfY3Zfc3RhdGZzX2JmcmVlPXllcworaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMTI4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3QgJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCit0aGVuCisgIGFjX2N2X2Nfd29ya2luZ19zaWdhbHRzdGFjaz0ieWVzIgogZWxzZQogICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICB3aW5lX2N2X3N0YXRmc19iZnJlZT1ubwotCQorICBybSAtZnIgY29uZnRlc3QqCisgIGFjX2N2X2Nfd29ya2luZ19zaWdhbHRzdGFjaz0ibm8iCiBmaQotcm0gLWYgY29uZnRlc3QqCi0gICAgZmkgIAorcm0gLWZyIGNvbmZ0ZXN0KgogZmkKIAotZWNobyAiJGFjX3QiIiR3aW5lX2N2X3N0YXRmc19iZnJlZSIgMT4mNgotaWYgdGVzdCAiJHdpbmVfY3Zfc3RhdGZzX2JmcmVlIiA9ICJ5ZXMiCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2Nfd29ya2luZ19zaWdhbHRzdGFjayIgMT4mNgorCitpZiB0ZXN0ICIkYWNfY3ZfY193b3JraW5nX3NpZ2FsdHN0YWNrIiA9ICJ5ZXMiCiB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBTVEFURlNfSEFTX0JGUkVFIDEKKyAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9XT1JLSU5HX1NJR0FMVFNUQUNLIDEKIEVPRgogCiBmaQpAQCAtMzA1Nyw2ICszMjgyLDcgQEAKIHByb2dyYW1zL2Nsb2NrL01ha2VmaWxlCiBwcm9ncmFtcy9ub3RlcGFkL01ha2VmaWxlCiBwcm9ncmFtcy9wcm9nbWFuL01ha2VmaWxlCitwcm9ncmFtcy9yZWd0ZXN0L01ha2VmaWxlCiBwcm9ncmFtcy92aWV3L01ha2VmaWxlCiBwcm9ncmFtcy93aW5oZWxwL01ha2VmaWxlCiBwcm9ncmFtcy93aW52ZXIvTWFrZWZpbGUKQEAgLTMxODcsNiArMzQxMyw3IEBACiBwcm9ncmFtcy9jbG9jay9NYWtlZmlsZQogcHJvZ3JhbXMvbm90ZXBhZC9NYWtlZmlsZQogcHJvZ3JhbXMvcHJvZ21hbi9NYWtlZmlsZQorcHJvZ3JhbXMvcmVndGVzdC9NYWtlZmlsZQogcHJvZ3JhbXMvdmlldy9NYWtlZmlsZQogcHJvZ3JhbXMvd2luaGVscC9NYWtlZmlsZQogcHJvZ3JhbXMvd2ludmVyL01ha2VmaWxlCmRpZmYgLS1naXQgYS9jb25maWd1cmUuaW4gYi9jb25maWd1cmUuaW4KaW5kZXggZDc4M2EwMC4uNDNlMjYyNyAxMDA2NDQKLS0tIGEvY29uZmlndXJlLmluCisrKyBiL2NvbmZpZ3VyZS5pbgpAQCAtNzUsMTEgKzc1LDEyIEBACiAjaWYgIWRlZmluZWQoU05EQ1RMX0RTUF9TVEVSRU8pCiAjZXJyb3IgTm8gb3BlbiBzb3VuZCBzeXN0ZW0KICNlbmRpZgotXSwKLQlhY19jdl9jX29wZW5zb3VuZHN5c3RlbT0ieWVzIgotCUFDX0RFRklORShIQVZFX09TUyksCi0JYWNfY3ZfY19vcGVuc291bmRzeXN0ZW09Im5vIgotKSkKK10sYWNfY3ZfY19vcGVuc291bmRzeXN0ZW09InllcyIsYWNfY3ZfY19vcGVuc291bmRzeXN0ZW09Im5vIikpCisKK2lmIHRlc3QgIiRhY19jdl9jX29wZW5zb3VuZHN5c3RlbSIgPSAieWVzIgordGhlbgorICAgIEFDX0RFRklORShIQVZFX09TUykKK2ZpCiAKIGRubCAqKioqIENoZWNrIGZvciB1bmlvbiBzZW11biAqKioqCiAKQEAgLTIyMCw3ICsyMjEsMTA4IEBACiBBQ19UWVBFX1NJWkVfVCgpCiBBQ19DSEVDS19TSVpFT0YobG9uZyBsb25nLDApCiAKLWRubCAqKioqIERlcGVuZGVudCBjaGVja3MgKioqKgorZG5sICoqKiogc3RhdGZzIGNoZWNrcyAqKioqCisKK2lmIHRlc3QgIiRhY19jdl9oZWFkZXJfc3lzX3Zmc19oIiA9ICJ5ZXMiCit0aGVuCisgICAgQUNfQ0FDSEVfQ0hFQ0soICJ3aGV0aGVyIHN5cy92ZnMuaCBkZWZpbmVzIHN0YXRmcyIsCisJCSAgICB3aW5lX2N2X3N5c192ZnNfaGFzX3N0YXRmcywKKwlBQ19UUllfQ09NUElMRShbCisJI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCSNpZmRlZiBIQVZFX1NZU19QQVJBTV9ICisJIyBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKwkjZW5kaWYKKwkjaW5jbHVkZSA8c3lzL3Zmcy5oPgorCV0sWworCQlzdHJ1Y3Qgc3RhdGZzIHN0ZnM7CisKKwkJbWVtc2V0KCZzdGZzLDAsc2l6ZW9mKHN0ZnMpKTsKKwldLHdpbmVfY3Zfc3lzX3Zmc19oYXNfc3RhdGZzPXllcyx3aW5lX2N2X3N5c192ZnNfaGFzX3N0YXRmcz1ubworCSkKKyAgICApCisgICAgaWYgdGVzdCAiJHdpbmVfY3Zfc3lzX3Zmc19oYXNfc3RhdGZzIiA9ICJ5ZXMiCisgICAgdGhlbgorICAgICAgQUNfREVGSU5FKFNUQVRGU19ERUZJTkVEX0JZX1NZU19WRlMpCisgICAgZmkKK2ZpCisKK2lmIHRlc3QgIiRhY19jdl9oZWFkZXJfc3lzX3N0YXRmc19oIiA9ICJ5ZXMiCit0aGVuCisgICAgQUNfQ0FDSEVfQ0hFQ0soICJ3aGV0aGVyIHN5cy9zdGF0ZnMuaCBkZWZpbmVzIHN0YXRmcyIsCisJCSAgICB3aW5lX2N2X3N5c19zdGF0ZnNfaGFzX3N0YXRmcywKKwlBQ19UUllfQ09NUElMRShbCisJI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCSNpZmRlZiBIQVZFX1NZU19QQVJBTV9ICisJIyBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKwkjZW5kaWYKKwkjaW5jbHVkZSA8c3lzL3N0YXRmcy5oPgorCV0sWworCQlzdHJ1Y3Qgc3RhdGZzIHN0ZnM7CisJXSx3aW5lX2N2X3N5c19zdGF0ZnNfaGFzX3N0YXRmcz15ZXMsd2luZV9jdl9zeXNfc3RhdGZzX2hhc19zdGF0ZnM9bm8KKwkpCisgICAgKQorICAgIGlmIHRlc3QgIiR3aW5lX2N2X3N5c19zdGF0ZnNfaGFzX3N0YXRmcyIgPSAieWVzIgorICAgIHRoZW4KKyAgICAgIEFDX0RFRklORShTVEFURlNfREVGSU5FRF9CWV9TWVNfU1RBVEZTKQorICAgIGZpCitmaQorCitpZiB0ZXN0ICIkYWNfY3ZfaGVhZGVyX3N5c19tb3VudF9oIiA9ICJ5ZXMiCit0aGVuCisgICAgQUNfQ0FDSEVfQ0hFQ0soICJ3aGV0aGVyIHN5cy9tb3VudC5oIGRlZmluZXMgc3RhdGZzIiwKKwkJICAgIHdpbmVfY3Zfc3lzX21vdW50X2hhc19zdGF0ZnMsCisJQUNfVFJZX0NPTVBJTEUoWworCSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKwkjaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAorCSMgaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisJI2VuZGlmCisJI2luY2x1ZGUgPHN5cy9tb3VudC5oPgorCV0sWworCQlzdHJ1Y3Qgc3RhdGZzIHN0ZnM7CisJXSx3aW5lX2N2X3N5c19tb3VudF9oYXNfc3RhdGZzPXllcyx3aW5lX2N2X3N5c19tb3VudF9oYXNfc3RhdGZzPW5vCisJKQorICAgICkKKyAgICBpZiB0ZXN0ICIkd2luZV9jdl9zeXNfbW91bnRfaGFzX3N0YXRmcyIgPSAieWVzIgorICAgIHRoZW4KKyAgICAgIEFDX0RFRklORShTVEFURlNfREVGSU5FRF9CWV9TWVNfTU9VTlQpCisgICAgZmkKK2ZpCisKK2RubCAqKioqIEZJWE1FOiB3aGF0IGFib3V0IG1peGVkIGNhc2VzLCB3aGVyZSB3ZSBuZWVkIHR3byBvZiB0aGVtPyAqKioKKworQUNfQ0FDSEVfQ0hFQ0soICJmb3Igc3RhdGZzLmZfYmZyZWUiLCB3aW5lX2N2X3N0YXRmc19iZnJlZSwKKyAgWyBpZiB0ZXN0ICJ4JHN0YXRmc19iZnJlZSIgPSAieG5vIgorICAgIHRoZW4KKyAgICAgICAgd2luZV9jdl9zdGF0ZnNfYmZyZWU9bm8KKyAgICBlbHNlCisgICAgCUFDX1RSWV9DT01QSUxFKFsKKwkjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisJI2lmZGVmIEhBVkVfU1lTX1BBUkFNX0gKKwkjIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgorCSNlbmRpZgorCSNpZmRlZiBTVEFURlNfREVGSU5FRF9CWV9TWVNfTU9VTlQKKwkjIGluY2x1ZGUgPHN5cy9tb3VudC5oPgorCSNlbHNlCisJIyBpZmRlZiBTVEFURlNfREVGSU5FRF9CWV9TWVNfVkZTCisJIyAgaW5jbHVkZSA8c3lzL3Zmcy5oPgorCSMgZWxzZQorCSMgIGlmZGVmIFNUQVRGU19ERUZJTkVEX0JZX1NZU19TVEFURlMKKwkjICAgaW5jbHVkZSA8c3lzL3N0YXRmcy5oPgorCSMgIGVuZGlmCisJIyBlbmRpZgorCSNlbmRpZgorCV0sWworCQlzdHJ1Y3Qgc3RhdGZzIHN0ZnM7CisKKwkJc3Rmcy5mX2JmcmVlKys7CisJXSx3aW5lX2N2X3N0YXRmc19iZnJlZT15ZXMsd2luZV9jdl9zdGF0ZnNfYmZyZWU9bm8KKwkpCisgICAgZmkgXSApCitpZiB0ZXN0ICIkd2luZV9jdl9zdGF0ZnNfYmZyZWUiID0gInllcyIKK3RoZW4KKyAgQUNfREVGSU5FKFNUQVRGU19IQVNfQkZSRUUpCitmaQorCiBBQ19DQUNIRV9DSEVDSyggImZvciBzdGF0ZnMuZl9iYXZhaWwiLCB3aW5lX2N2X3N0YXRmc19iYXZhaWwsCiAgIFsgaWYgdGVzdCAieCRzdGF0ZnNfYmF2YWlsIiA9ICJ4bm8iCiAgICAgdGhlbgpAQCAtMjMxLDE0ICszMzMsMTYgQEAKIAkjaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAogCSMgaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiAJI2VuZGlmCi0JI2lmZGVmIEhBVkVfU1lTX1NUQVRGU19ICi0JIyBpbmNsdWRlIDxzeXMvc3RhdGZzLmg+Ci0JI2VuZGlmCi0JI2lmZGVmIEhBVkVfU1lTX01PVU5UX0gKKwkjaWZkZWYgU1RBVEZTX0RFRklORURfQllfU1lTX01PVU5UCiAJIyBpbmNsdWRlIDxzeXMvbW91bnQuaD4KLQkjZW5kaWYKLQkjaWZkZWYgSEFWRV9TWVNfVkZTX0gKLQkjIGluY2x1ZGUgPHN5cy92ZnMuaD4KKwkjZWxzZQorCSMgaWZkZWYgU1RBVEZTX0RFRklORURfQllfU1lTX1ZGUworCSMgIGluY2x1ZGUgPHN5cy92ZnMuaD4KKwkjIGVsc2UKKwkjICBpZmRlZiBTVEFURlNfREVGSU5FRF9CWV9TWVNfU1RBVEZTCisJIyAgIGluY2x1ZGUgPHN5cy9zdGF0ZnMuaD4KKwkjICBlbmRpZgorCSMgZW5kaWYKIAkjZW5kaWYKIAldLFsKIAkJc3RydWN0IHN0YXRmcyBzdGZzOwpAQCAtMjUyLDM1ICszNTYsNTQgQEAKICAgQUNfREVGSU5FKFNUQVRGU19IQVNfQkFWQUlMKQogZmkKIAotQUNfQ0FDSEVfQ0hFQ0soICJmb3Igc3RhdGZzLmZfYmZyZWUiLCB3aW5lX2N2X3N0YXRmc19iZnJlZSwKLSAgWyBpZiB0ZXN0ICJ4JHN0YXRmc19iZnJlZSIgPSAieG5vIgotICAgIHRoZW4KLSAgICAgICAgd2luZV9jdl9zdGF0ZnNfYmZyZWU9bm8KLSAgICBlbHNlCi0gICAgCUFDX1RSWV9DT01QSUxFKFsKK2RubCAqKiogY2hlY2sgZm9yIHdvcmtpbmcgc2lnYWx0c3RhY2sKK2RubCBnbGliYyAyLjB4IGRlZmluZXMgaXQsIGJ1dCBpdCBhbHdheXMgZmFpbHMuLi4gc28gaXQgaXMgdXNlbGVzcyBmb3IgdXMuCisKK0FDX0NBQ0hFX0NIRUNLKCJmb3Igd29ya2luZyBzaWdhbHRzdGFjayIsCisJYWNfY3ZfY193b3JraW5nX3NpZ2FsdHN0YWNrLAorCUFDX1RSWV9SVU4oWworCSNpbmNsdWRlIDxzdGRpby5oPgorCSNpbmNsdWRlIDx0aW1lLmg+IC8qIDxzeXMvdGltZS5oPiA/IGJhZCBtYWdpYyB3aXRob3V0IGVuZCAqLwogCSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKwkjaW5jbHVkZSA8c3lzL3NpZ25hbC5oPgogCSNpZmRlZiBIQVZFX1NZU19QQVJBTV9ICiAJIyBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KIAkjZW5kaWYKLQkjaWZkZWYgSEFWRV9TWVNfU1RBVEZTX0gKLQkjIGluY2x1ZGUgPHN5cy9zdGF0ZnMuaD4KKwkjaWZkZWYgSEFWRV9TWVNDQUxMX0gKKwkjIGluY2x1ZGUgPHN5c2NhbGwuaD4KKwkjZWxzZQorCSMgaWZkZWYgSEFWRV9TWVNfU1lTQ0FMTF9ICisJIyAgaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KKwkjIGVuZGlmCiAJI2VuZGlmCi0JI2lmZGVmIEhBVkVfU1lTX01PVU5UX0gKLQkjIGluY2x1ZGUgPHN5cy9tb3VudC5oPgotCSNlbmRpZgotCSNpZmRlZiBIQVZFX1NZU19WRlNfSAotCSMgaW5jbHVkZSA8c3lzL3Zmcy5oPgotCSNlbmRpZgotCV0sWwotCQlzdHJ1Y3Qgc3RhdGZzIHN0ZnM7CisJCisJdW5zaWduZWQgY2hhciAqeGFsdHN0YWNrOwogCi0JCXN0ZnMuZl9iZnJlZSsrOwotCV0sd2luZV9jdl9zdGF0ZnNfYmZyZWU9eWVzLHdpbmVfY3Zfc3RhdGZzX2JmcmVlPW5vCi0JKQotICAgIGZpIF0gKQotaWYgdGVzdCAiJHdpbmVfY3Zfc3RhdGZzX2JmcmVlIiA9ICJ5ZXMiCisJaW50CisJbWFpbihpbnQgYXJnYyxjaGFyICoqYXJndikgeworCSAgICBzdHJ1Y3Qgc2lnYWx0c3RhY2sJc3M7CisKKwkgICAgeGFsdHN0YWNrID0gbWFsbG9jKDE2Mzg0KTsKKwkgICAgc3Muc3Nfc3AgICAgPSB4YWx0c3RhY2s7CisJICAgIHNzLnNzX3NpemUgID0gMTYzODQ7CisJICAgIHNzLnNzX2ZsYWdzID0gMDsKKwkgICAgaWYgKHNpZ2FsdHN0YWNrKCZzcywgTlVMTCkgPCAwKSB7CisJICAgIAkvKiB0aGlzIGNhdGNoZXMgdGhlIGdsaWJjIGNhc2UgKi8KKwkJcGVycm9yKCJzaWdhbHRzdGFjayIpOworCSAgICAJcmV0dXJuICgxKTsgLyogYWthIGV4aXQoMSkgYWthIGZhaWwgKi8KKwkgICAgfQorCSAgICAvKiBhc3N1bWUgaXQgd29ya3MuICovCisJICAgIHJldHVybiAwOyAvKiBPSyAqLworCX0KKwldLAorCWFjX2N2X2Nfd29ya2luZ19zaWdhbHRzdGFjaz0ieWVzIiwKKwlhY19jdl9jX3dvcmtpbmdfc2lnYWx0c3RhY2s9Im5vIiwKKwlhY19jdl9jX3dvcmtpbmdfc2lnYWx0c3RhY2s9Im5vIgorKSkKKworaWYgdGVzdCAiJGFjX2N2X2Nfd29ya2luZ19zaWdhbHRzdGFjayIgPSAieWVzIgogdGhlbgotICBBQ19ERUZJTkUoU1RBVEZTX0hBU19CRlJFRSkKKyAgICBBQ19ERUZJTkUoSEFWRV9XT1JLSU5HX1NJR0FMVFNUQUNLKQogZmkKIAogCkBAIC0zMTcsNiArNDQwLDcgQEAKIHByb2dyYW1zL2Nsb2NrL01ha2VmaWxlCiBwcm9ncmFtcy9ub3RlcGFkL01ha2VmaWxlCiBwcm9ncmFtcy9wcm9nbWFuL01ha2VmaWxlCitwcm9ncmFtcy9yZWd0ZXN0L01ha2VmaWxlCiBwcm9ncmFtcy92aWV3L01ha2VmaWxlCiBwcm9ncmFtcy93aW5oZWxwL01ha2VmaWxlCiBwcm9ncmFtcy93aW52ZXIvTWFrZWZpbGUKZGlmZiAtLWdpdCBhL2NvbnRyb2xzL01ha2VmaWxlLmluIGIvY29udHJvbHMvTWFrZWZpbGUuaW4KaW5kZXggM2E2NGE3Yi4uNzM2YzAwYiAxMDA2NDQKLS0tIGEvY29udHJvbHMvTWFrZWZpbGUuaW4KKysrIGIvY29udHJvbHMvTWFrZWZpbGUuaW4KQEAgLTExLDYgKzExLDcgQEAKIAljb21tY3RybC5jIFwKIAlkZXNrdG9wLmMgXAogCWVkaXQuYyBcCisJaGVhZGVyLmMgXAogCWljb250aXRsZS5jIFwKIAlsaXN0Ym94LmMgXAogCW1lbnUuYyBcCmRpZmYgLS1naXQgYS9jb250cm9scy9jb21tY3RybC5jIGIvY29udHJvbHMvY29tbWN0cmwuYwppbmRleCBhNzIwNjYwLi4yNDVlYjg2IDEwMDY0NAotLS0gYS9jb250cm9scy9jb21tY3RybC5jCisrKyBiL2NvbnRyb2xzL2NvbW1jdHJsLmMKQEAgLTgsMjQgKzgsMTEgQEAKICNpbmNsdWRlICJ3aW4uaCIKICNpbmNsdWRlICJoZWFwLmgiCiAjaW5jbHVkZSAiY29tbWN0cmwuaCIKKyNpbmNsdWRlICJoZWFkZXIuaCIKICNpbmNsdWRlICJwcm9ncmVzcy5oIgogI2luY2x1ZGUgInN0YXR1cy5oIgogI2luY2x1ZGUgInVwZG93bi5oIgotCi0vKiBXaW4zMiBjb21tb24gY29udHJvbHMgKi8KLQotc3RhdGljIFdORENMQVNTMzJBIFdJREdFVFNfQ29tbW9uQ29udHJvbHMzMltdID0KLXsKLSAgICB7IENTX0dMT0JBTENMQVNTIHwgQ1NfVlJFRFJBVyB8IENTX0hSRURSQVcsIFN0YXR1c1dpbmRvd1Byb2MsIDAsCi0gICAgICBzaXplb2YoU1RBVFVTV0lORE9XSU5GTyksIDAsIDAsIDAsIDAsIDAsIFNUQVRVU0NMQVNTTkFNRTMyQSB9LAotICAgIHsgQ1NfR0xPQkFMQ0xBU1MgfCBDU19WUkVEUkFXIHwgQ1NfSFJFRFJBVywgVXBEb3duV2luZG93UHJvYywgMCwKLSAgICAgIHNpemVvZihVUERPV05fSU5GTyksIDAsIDAsIDAsIDAsIDAsIFVQRE9XTl9DTEFTUzMyQSB9LAotICAgIHsgQ1NfR0xPQkFMQ0xBU1MgfCBDU19WUkVEUkFXIHwgQ1NfSFJFRFJBVywgUHJvZ3Jlc3NXaW5kb3dQcm9jLCAwLAotICAgICAgc2l6ZW9mKFBST0dSRVNTX0lORk8pLCAwLCAwLCAwLCAwLCAwLCBQUk9HUkVTU19DTEFTUzMyQSB9Ci19OwotCi0jZGVmaW5lIE5CX0NPTU1PTl9DT05UUk9MUzMyIFwKLSAgICAgICAgIChzaXplb2YoV0lER0VUU19Db21tb25Db250cm9sczMyKS9zaXplb2YoV0lER0VUU19Db21tb25Db250cm9sczMyWzBdKSkKKyNpbmNsdWRlICJkZWJ1Zy5oIgogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMzcsOCArMjQsNiBAQAogICAgIFJFQ1QzMiByID0gKmxwcmM7CiAgICAgVUlOVDMyIGJvcmRlciA9IEJEUl9TVU5LRU5PVVRFUjsKIAotICAgIERyYXdFZGdlMzIoaGRjLCAmciwgQkRSX1JBSVNFRElOTkVSLCBCRl9SRUNUfEJGX0FESlVTVHxCRl9GTEFUKTsKLQogICAgIGlmKHN0eWxlPT1TQlRfUE9QT1VUKQogICAgICAgYm9yZGVyID0gQkRSX1JBSVNFRE9VVEVSOwogICAgIGVsc2UgaWYoc3R5bGU9PVNCVF9OT0JPUkRFUlMpCkBAIC01OSw3ICs0NCw3IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIERyYXdTdGF0dXNUZXh0MzJXICAgKENPTUNUTDMyLjI0KQorICogICAgICAgICAgIERyYXdTdGF0dXNUZXh0MzJXICAgKENPTUNUTDMyLjI4KQogICovCiB2b2lkIFdJTkFQSSBEcmF3U3RhdHVzVGV4dDMyVyggSERDMzIgaGRjLCBMUFJFQ1QzMiBscHJjLCBMUENXU1RSIHRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDMyIHN0eWxlICkKQEAgLTcwLDcgKzU1LDcgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgRHJhd1N0YXR1c1RleHQxNiAgIChDT01DVEwzMi4yMykKKyAqICAgICAgICAgICBEcmF3U3RhdHVzVGV4dDE2ICAgKENPTUNUTDMyLjI3KQogICovCiB2b2lkIFdJTkFQSSBEcmF3U3RhdHVzVGV4dDE2KCBIREMxNiBoZGMsIExQUkVDVDE2IGxwcmMsIExQQ1NUUiB0ZXh0LAogCQkJICAgICAgVUlOVDE2IHN0eWxlICkKQEAgLTk3LDcgKzgyLDcgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgQ3JlYXRlU3RhdHVzV2luZG93MTYgICAoQ09NQ1RMMzIuMTgpCisgKiAgICAgICAgICAgQ3JlYXRlU3RhdHVzV2luZG93MTYgICAoQ09NQ1RMMzIuMjEpCiAgKi8KIEhXTkQxNiBXSU5BUEkgQ3JlYXRlU3RhdHVzV2luZG93MTYoIElOVDE2IHN0eWxlLCBMUENTVFIgdGV4dCwgSFdORDE2IHBhcmVudCwKIAkJCQkgICAgVUlOVDE2IHdpZCApCkBAIC0xMDksNyArOTQsNyBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBDcmVhdGVTdGF0dXNXaW5kb3czMlcgICAoQ09NQ1RMMzIuMTkpCisgKiAgICAgICAgICAgQ3JlYXRlU3RhdHVzV2luZG93MzJXICAgKENPTUNUTDMyLjIyKQogICovCiBIV05EMzIgV0lOQVBJIENyZWF0ZVN0YXR1c1dpbmRvdzMyVyggSU5UMzIgc3R5bGUsIExQQ1dTVFIgdGV4dCwgSFdORDMyIHBhcmVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMzIgd2lkICkKQEAgLTE0MSwyNCArMTI2LDE2NSBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEluaXRDb21tb25Db250cm9scyAgIChDT01DVEwzMi4xNykKKyAqIEluaXRDb21tb25Db250cm9scyBbQ09NQ1RMMzIuMTddCisgKgorICoKKyAqCiAgKi8KLXZvaWQgV0lOQVBJIEluaXRDb21tb25Db250cm9scyh2b2lkKQotewotICAgIGludCBpOwotICAgIGNoYXIgbmFtZVszMF07Ci0gICAgY29uc3QgY2hhciAqb2xkX25hbWU7Ci0gICAgV05EQ0xBU1MzMkEgKmNsYXNzMzIgPSBXSURHRVRTX0NvbW1vbkNvbnRyb2xzMzI7CiAKLSAgICBmb3IgKGkgPSAwOyBpIDwgTkJfQ09NTU9OX0NPTlRST0xTMzI7IGkrKywgY2xhc3MzMisrKQotICAgIHsKLSAgICAgICAgLyogSnVzdCB0byBtYWtlIHN1cmUgdGhlIHN0cmluZyBpcyA+IDB4MTAwMDAgKi8KLSAgICAgICAgb2xkX25hbWUgPSBjbGFzczMyLT5scHN6Q2xhc3NOYW1lOwotICAgICAgICBzdHJjcHkoIG5hbWUsIChjaGFyICopY2xhc3MzMi0+bHBzekNsYXNzTmFtZSApOwotICAgICAgICBjbGFzczMyLT5scHN6Q2xhc3NOYW1lID0gbmFtZTsKLSAgICAgICAgY2xhc3MzMi0+aEN1cnNvciA9IExvYWRDdXJzb3IzMkEoIDAsIElEQ19BUlJPVzMyQSApOwotICAgICAgICBSZWdpc3RlckNsYXNzMzJBKCBjbGFzczMyICk7Ci0gICAgICAgIGNsYXNzMzItPmxwc3pDbGFzc05hbWUgPSBvbGRfbmFtZTsJCi0gICAgfQorVk9JRCBXSU5BUEkKK0luaXRDb21tb25Db250cm9scyAoVk9JRCkKK3sKKyAgICBJTklUQ09NTU9OQ09OVFJPTFNFWCBpY2M7CisKKyAgICBpY2MuZHdTaXplID0gc2l6ZW9mKElOSVRDT01NT05DT05UUk9MU0VYKTsKKyAgICBpY2MuZHdJQ0MgPSBJQ0NfV0lOOTVfQ0xBU1NFUzsKKworICAgIEluaXRDb21tb25Db250cm9sc0V4ICgmaWNjKTsKIH0KIAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEluaXRDb21tb25Db250cm9sc0V4IFtDT01DVEwzMi44MV0KKyAqCisgKgorICoKKyAqLworCitCT09MMzIgV0lOQVBJCitJbml0Q29tbW9uQ29udHJvbHNFeCAoTFBJTklUQ09NTU9OQ09OVFJPTFNFWCBscEluaXRDdHJscykKK3sKKyAgSU5UMzIgY0NvdW50OworICBEV09SRCBkd01hc2s7CisKKyAgaWYgKGxwSW5pdEN0cmxzID09IE5VTEwpIHJldHVybiAoRkFMU0UpOworICBpZiAobHBJbml0Q3RybHMtPmR3U2l6ZSA8IHNpemVvZihJTklUQ09NTU9OQ09OVFJPTFNFWCkpIHJldHVybiAoRkFMU0UpOworCisgIGZvciAoY0NvdW50ID0gMDsgY0NvdW50IDw9IDMxOyBjQ291bnQrKykgeworICAgIGR3TWFzayA9IDEgPDwgY0NvdW50OworICAgIGlmICghKGxwSW5pdEN0cmxzLT5kd0lDQyAmIGR3TWFzaykpCisgICAgICBjb250aW51ZTsKKworICAgIHN3aXRjaCAobHBJbml0Q3RybHMtPmR3SUNDICYgZHdNYXNrKSB7CisgICAgICBjYXNlIElDQ19MSVNUVklFV19DTEFTU0VTOgorICAgICAgICBUUkFDRSAoY29tbWN0cmwsICJObyBsaXN0dmlldyBjbGFzcyBpbXBsZW1lbnRlZCFcbiIpOworICAgICAgICBIRUFERVJfUmVnaXN0ZXIoKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSUNDX1RSRUVWSUVXX0NMQVNTRVM6CisgICAgICAgIFRSQUNFIChjb21tY3RybCwgIk5vIHRyZWV2aWV3IGNsYXNzIGltcGxlbWVudGVkIVxuIik7CisgICAgICAgIFRSQUNFIChjb21tY3RybCwgIk5vIHRvb2x0aXAgY2xhc3MgaW1wbGVtZW50ZWQhXG4iKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSUNDX0JBUl9DTEFTU0VTOgorICAgICAgICBUUkFDRSAoY29tbWN0cmwsICJObyB0b29sYmFyIGNsYXNzIGltcGxlbWVudGVkIVxuIik7CisJU1RBVFVTX1JlZ2lzdGVyICgpOworICAgICAgICBUUkFDRSAoY29tbWN0cmwsICJObyB0cmFja2JhciBjbGFzcyBpbXBsZW1lbnRlZCFcbiIpOworICAgICAgICBUUkFDRSAoY29tbWN0cmwsICJObyB0b29sdGlwIGNsYXNzIGltcGxlbWVudGVkIVxuIik7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIElDQ19UQUJfQ0xBU1NFUzoKKyAgICAgICAgVFJBQ0UgKGNvbW1jdHJsLCAiTm8gdGFiIGNsYXNzIGltcGxlbWVudGVkIVxuIik7CisgICAgICAgIFRSQUNFIChjb21tY3RybCwgIk5vIHRvb2x0aXAgY2xhc3MgaW1wbGVtZW50ZWQhXG4iKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSUNDX1VQRE9XTl9DTEFTUzoKKyAgICAgICAgVVBET1dOX1JlZ2lzdGVyICgpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBJQ0NfUFJPR1JFU1NfQ0xBU1M6CisgICAgICAgIFBST0dSRVNTX1JlZ2lzdGVyICgpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBJQ0NfSE9US0VZX0NMQVNTOgorICAgICAgICBUUkFDRSAoY29tbWN0cmwsICJObyBob3RrZXkgY2xhc3MgaW1wbGVtZW50ZWQhXG4iKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSUNDX0FOSU1BVEVfQ0xBU1M6CisgICAgICAgIFRSQUNFIChjb21tY3RybCwgIk5vIGFuaW1hdGlvbiBjbGFzcyBpbXBsZW1lbnRlZCFcbiIpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBJQ0NfREFURV9DTEFTU0VTOgorICAgICAgICBUUkFDRSAoY29tbWN0cmwsICJObyBtb250aCBjYWxlbmRhciBjbGFzcyBpbXBsZW1lbnRlZCFcbiIpOworICAgICAgICBUUkFDRSAoY29tbWN0cmwsICJObyBkYXRlIHBpY2tlciBjbGFzcyBpbXBsZW1lbnRlZCFcbiIpOworICAgICAgICBUUkFDRSAoY29tbWN0cmwsICJObyB0aW1lIHBpY2tlciBjbGFzcyBpbXBsZW1lbnRlZCFcbiIpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBJQ0NfVVNFUkVYX0NMQVNTRVM6CisgICAgICAgIFRSQUNFIChjb21tY3RybCwgIk5vIGNvbWJvZXggY2xhc3MgaW1wbGVtZW50ZWQhXG4iKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSUNDX0NPT0xfQ0xBU1NFUzoKKyAgICAgICAgVFJBQ0UgKGNvbW1jdHJsLCAiTm8gcmViYXIgY2xhc3MgaW1wbGVtZW50ZWQhXG4iKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSUNDX0lOVEVSTkVUX0NMQVNTRVM6CisgICAgICAgIFRSQUNFIChjb21tY3RybCwgIk5vIGludGVybmV0IGNsYXNzZXMgaW1wbGVtZW50ZWQhXG4iKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSUNDX1BBR0VTQ1JPTExFUl9DTEFTUzoKKyAgICAgICAgVFJBQ0UgKGNvbW1jdHJsLCAiTm8gcGFnZSBzY3JvbGxlciBjbGFzcyBpbXBsZW1lbnRlZCFcbiIpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBJQ0NfTkFUSVZFRk5UQ1RMX0NMQVNTOgorICAgICAgICBUUkFDRSAoY29tbWN0cmwsICJObyBuYXRpdmUgZm9udCBjbGFzcyBpbXBsZW1lbnRlZCFcbiIpOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgV0FSTiAoY29tbWN0cmwsICJVbmtub3duIGNsYXNzISBkd0lDQz0weCVsWFxuIiwgZHdNYXNrKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgcmV0dXJuIChUUlVFKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1lbnVIZWxwIChDT01DVEwzMi4yKQorICoKKyAqCisgKgorICoKKyAqLworCitWT0lEIFdJTkFQSQorTWVudUhlbHAgKFVJTlQzMiB1TXNnLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0sIEhNRU5VMzIgaE1haW5NZW51LAorCSAgSElOU1RBTkNFMzIgaEluc3QsIEhXTkQzMiBod25kU3RhdHVzLCBMUFVJTlQzMiBscHdJRHMpCit7CisgICAgY2hhciBzelN0YXR1c1RleHRbMTI4XTsKKworICAgIGlmICghSXNXaW5kb3czMiAoaHduZFN0YXR1cykpIHJldHVybjsKKworICAgIHN3aXRjaCAodU1zZykgeworICAgICAgICBjYXNlIFdNX01FTlVTRUxFQ1Q6CisgICAgICAgICAgICBUUkFDRSAoY29tbWN0cmwsICJXTV9NRU5VU0VMRUNUIHdQYXJhbT0weCVYIGxQYXJhbT0weCVsWFxuIiwKKyAgICAgICAgICAgICAgICAgICB3UGFyYW0sIGxQYXJhbSk7CisKKyAgICAgICAgICAgIGlmICgoSElXT1JEKHdQYXJhbSkgPT0gMHhGRkZGKSAmJiAobFBhcmFtID09IDApKSB7CisgICAgICAgICAgICAgICAgLyogbWVudSB3YXMgY2xvc2VkICovCisgICAgICAgICAgICAgICAgU2VuZE1lc3NhZ2UzMkEgKGh3bmRTdGF0dXMsIFNCX1NJTVBMRSwgRkFMU0UsIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKEhJV09SRCh3UGFyYW0pICYgTUZfUE9QVVApIHsKKyAgICAgICAgICAgICAgICAgICAgVFJBQ0UgKGNvbW1jdHJsLCAiUG9wdXAgbWVudSBzZWxlY3RlZCFcbiIpOworICAgICAgICAgICAgICAgICAgICBGSVhNRSAoY29tbWN0cmwsICJObyBwb3B1cCBtZW51IHRleHRzIVxuIik7CisKKyAgICAgICAgICAgICAgICAgICAgc3pTdGF0dXNUZXh0WzBdID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFRSQUNFIChjb21tY3RybCwgIk1lbnUgaXRlbSBzZWxlY3RlZCFcbiIpOworICAgICAgICAgICAgICAgICAgICBpZiAoIUxvYWRTdHJpbmczMkEgKGhJbnN0LCBMT1dPUkQod1BhcmFtKSwgc3pTdGF0dXNUZXh0LCAxMjgpKQorICAgICAgICAgICAgICAgICAgICAgICAgc3pTdGF0dXNUZXh0WzBdID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU2VuZE1lc3NhZ2UzMkEgKGh3bmRTdGF0dXMsIFNCX1NFVFRFWFQzMkEsIDI1NSB8IFNCVF9OT0JPUkRFUlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMUEFSQU0pc3pTdGF0dXNUZXh0KTsKKyAgICAgICAgICAgICAgICBTZW5kTWVzc2FnZTMyQSAoaHduZFN0YXR1cywgU0JfU0lNUExFLCBUUlVFLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBXQVJOIChjb21tY3RybCwgIkludmFsaWQgTWVzc2FnZSFcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udHJvbHMvaGVhZGVyLmMgYi9jb250cm9scy9oZWFkZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWExMzU3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJvbHMvaGVhZGVyLmMKQEAgLTAsMCArMSwxMjc4IEBACisvKgorICogIEhlYWRlciBjb250cm9sCisgKgorICogIENvcHlyaWdodCAxOTk4IEVyaWMgS29obAorICoKKyAqICBUT0RPOgorICogICAtIEJpdG1hcCBzdXBwb3J0IChwYXJ0aWFsbHkpLgorICogICAtIEltYWdlbGlzdCBzdXBwb3J0IChwYXJ0aWFsbHkpLgorICogICAtIEhvdHRyYWNrIHN1cHBvcnQgKHBhcnRpYWxseSkuCisgKiAgIC0gQ29udHJvbCBzcGVjaWZpYyBjdXJzb3JzIChvdmVyIGRpdmlkZXJzKS4KKyAqICAgLSBPd25lciBkcmF3IHN1cHBvcnQuCisgKiAgIC0gT3JkZXIgbGlzdCBzdXBwb3J0LgorICogICAtIEN1c3RvbSBkcmF3IHN1cHBvcnQgKGluY2x1ZGluZyBOb3RpZmljYXRpb25zKS4KKyAqICAgLSBEcmFnIGFuZCBEcm9wIHN1cHBvcnQgKGluY2x1ZGluZyBOb3RpZmljYXRpb25zKS4KKyAqICAgLSBVbmljb2RlIHN1cHBvcnQuCisgKi8KKworI2luY2x1ZGUgIndpbmRvd3MuaCIKKyNpbmNsdWRlICJjb21tY3RybC5oIgorI2luY2x1ZGUgImhlYWRlci5oIgorI2luY2x1ZGUgImhlYXAuaCIKKyNpbmNsdWRlICJ3aW4uaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorCisKKyNkZWZpbmUgX19IRE1fTEFZT1VUX0hBQ0tfXworCisKKyNkZWZpbmUgVkVSVF9CT1JERVIgICAgIDQKKyNkZWZpbmUgRElWSURFUl9XSURUSCAgMTAKKworI2RlZmluZSBVTktOT1dOX1BBUkFNKG1zZywgd1BhcmFtLCBsUGFyYW0pIFdBUk4oaGVhZGVyLCBcCisgICAgICAgICJVbmtub3duIHBhcmFtZXRlcihzKSBmb3IgbWVzc2FnZSAiICNtc2cgICAgIFwKKwkiKCUwNHgpOiB3cD0lMDR4IGxwPSUwOGx4XG4iLCBtc2csIHdQYXJhbSwgbFBhcmFtKTsgCisKKyNkZWZpbmUgSEVBREVSX0dldEluZm9QdHIod25kUHRyKSAoKEhFQURFUl9JTkZPICopd25kUHRyLT53RXh0cmFbMF0pCisKKworc3RhdGljIElOVDMyCitIRUFERVJfRHJhd0l0ZW0gKFdORCAqd25kUHRyLCBIREMzMiBoZGMsIEhFQURFUl9JVEVNICpwaGRpLCBCT09MMzIgYkhvdFRyYWNrKQoreworICAgIFJFQ1QzMiByOworICAgIElOVDMyICBvbGRCa01vZGU7CisKKyAgICByID0gcGhkaS0+cmVjdDsKKyAgICBpZiAoci5yaWdodCAtIHIubGVmdCA9PSAwKQorCXJldHVybiBwaGRpLT5yZWN0LnJpZ2h0OworCisgICAgaWYgKHduZFB0ci0+ZHdTdHlsZSAmIEhEU19CVVRUT05TKSB7CisJaWYgKHBoZGktPmJEb3duKSB7CisJICAgIERyYXdFZGdlMzIgKGhkYywgJnIsIEJEUl9SQUlTRURPVVRFUiwKKwkJCUJGX1JFQ1QgfCBCRl9GTEFUIHwgQkZfTUlERExFIHwgQkZfQURKVVNUKTsKKwkgICAgci5sZWZ0ICs9IDI7CisgICAgICAgICAgICByLnRvcCAgKz0gMjsKKwl9CisJZWxzZQorCSAgICBEcmF3RWRnZTMyIChoZGMsICZyLCBFREdFX1JBSVNFRCwKKwkJCUJGX1JFQ1QgfCBCRl9TT0ZUIHwgQkZfTUlERExFIHwgQkZfQURKVVNUKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBEcmF3RWRnZTMyIChoZGMsICZyLCBFREdFX0VUQ0hFRCwgQkZfQk9UVE9NIHwgQkZfUklHSFQgfCBCRl9BREpVU1QpOworCisgICAgaWYgKHBoZGktPmZtdCAmIEhERl9PV05FUkRSQVcpIHsKKyAgICAgICAgLyogRklYTUU6IG93bmVyIGRyYXduIGl0ZW1zICovCisgICAgfQorICAgIGVsc2UgeworICAgICAgICBVSU5UMzIgdVRleHRKdXN0aWZ5ID0gRFRfTEVGVDsKKworICAgICAgICBpZiAoKHBoZGktPmZtdCAmIEhERl9KVVNUSUZZTUFTSykgPT0gSERGX0NFTlRFUikKKyAgICAgICAgICAgIHVUZXh0SnVzdGlmeSA9IERUX0NFTlRFUjsKKyAgICAgICAgZWxzZSBpZiAoKHBoZGktPmZtdCAmIEhERl9KVVNUSUZZTUFTSykgPT0gSERGX1JJR0hUKQorICAgICAgICAgICAgdVRleHRKdXN0aWZ5ID0gRFRfUklHSFQ7CisKKwlpZiAoKHBoZGktPmZtdCAmIEhERl9CSVRNQVApICYmIChwaGRpLT5oYm0pKSB7CisJICAgIEJJVE1BUDMyIGJtcDsKKwkgICAgSERDMzIgICAgaGRjQml0bWFwOworCSAgICBJTlQzMiAgICB5RCwgeVMsIGN4LCBjeSwgcngsIHJ5OworCisJICAgIHJ5ID0gci5ib3R0b20gLSByLnRvcDsKKwkgICAgcnggPSByLnJpZ2h0IC0gci5sZWZ0OworCisJICAgIGlmIChyeSA+PSBibXAuYm1IZWlnaHQpIHsKKwkJY3kgPSBibXAuYm1IZWlnaHQ7CisJCXlEID0gci50b3AgKyAocnkgLSBibXAuYm1IZWlnaHQpIC8gMjsKKwkJeVMgPSAwOworCSAgICB9CisJICAgIGVsc2UgeworCQljeSA9IHJ5OworCQl5RCA9IHIudG9wOworCQl5UyA9IChibXAuYm1IZWlnaHQgLSByeSkgLyAyOworCisJICAgIH0KKworCSAgICBpZiAocnggPj0gYm1wLmJtV2lkdGggKyA2KSB7CisJCWN4ID0gYm1wLmJtV2lkdGg7CisJICAgIH0KKwkgICAgZWxzZSB7CisJCWN4ID0gcnggLSA2OworCSAgICB9CisKKwkgICAgR2V0T2JqZWN0MzJBIChwaGRpLT5oYm0sIHNpemVvZihCSVRNQVAzMiksIChMUFZPSUQpJmJtcCk7CisJICAgIGhkY0JpdG1hcCA9IENyZWF0ZUNvbXBhdGlibGVEQzMyIChoZGMpOworCSAgICBTZWxlY3RPYmplY3QzMiAoaGRjQml0bWFwLCBwaGRpLT5oYm0pOworCSAgICBCaXRCbHQzMiAoaGRjLCByLmxlZnQgKyAzLCB5RCwgY3gsIGN5LCBoZGNCaXRtYXAsIDAsIHlTLCBTUkNDT1BZKTsKKwkgICAgRGVsZXRlREMzMiAoaGRjQml0bWFwKTsKKworCSAgICByLmxlZnQgKz0gKGJtcC5ibVdpZHRoICsgMyk7CisJfQorCisvKgorCWlmICgocGhkaS0+Zm10ICYgSERGX0JJVE1BUF9PTl9SSUdIVCkgJiYgKHBoZGktPmhibSkpIHsKKwkgICAgQklUTUFQMzIgYm1wOworCSAgICBIREMzMiAgICBoZGNCaXRtYXA7CisKKwkgICAgR2V0T2JqZWN0MzJBIChwaGRpLT5oYm0sIHNpemVvZihCSVRNQVAzMiksIChMUFZPSUQpJmJtcCk7CisKKworCX0KKyovCisKKy8qCisJaWYgKHBoZGktPmZtdCAmIEhERl9JTUFHRSkgeworCisJICAgIEltYWdlTGlzdF9EcmF3ICguLi4uKTsKKworCX0KKyovCisKKyAgICAgICAgaWYgKChwaGRpLT5mbXQgJiBIREZfU1RSSU5HKSAmJiAocGhkaS0+cHN6VGV4dCkpIHsKKyAgICAgICAgICAgIG9sZEJrTW9kZSA9IFNldEJrTW9kZTMyKGhkYywgVFJBTlNQQVJFTlQpOworICAgICAgICAgICAgci5sZWZ0ICs9IDM7CisJICAgIHIucmlnaHQgLT0gMzsKKwkgICAgU2V0VGV4dENvbG9yMzIgKGhkYywgYkhvdFRyYWNrID8gQ09MT1JfSElHSExJR0hUIDogQ09MT1JfQlROVEVYVCk7CisgICAgICAgICAgICBEcmF3VGV4dDMyQShoZGMsIHBoZGktPnBzelRleHQsIGxzdHJsZW4zMkEocGhkaS0+cHN6VGV4dCksCisJICAgCSAgJnIsIHVUZXh0SnVzdGlmeXxEVF9WQ0VOVEVSfERUX1NJTkdMRUxJTkUpOworICAgICAgICAgICAgaWYgKG9sZEJrTW9kZSAhPSBUUkFOU1BBUkVOVCkKKyAgICAgICAgICAgICAgICBTZXRCa01vZGUzMihoZGMsIG9sZEJrTW9kZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHBoZGktPnJlY3QucmlnaHQ7Cit9CisKKworc3RhdGljIHZvaWQgCitIRUFERVJfUmVmcmVzaCAoV05EICp3bmRQdHIsIEhEQzMyIGhkYykKK3sKKyAgICBIRUFERVJfSU5GTyAqaW5mb1B0ciA9IEhFQURFUl9HZXRJbmZvUHRyKHduZFB0cik7CisgICAgSEZPTlQzMiBoRm9udCwgaE9sZEZvbnQ7CisgICAgUkVDVDMyIHJlY3Q7CisgICAgSEJSVVNIMzIgaGJyQms7CisgICAgSU5UMzIgaSwgeDsKKworICAgIC8qIGdldCByZWN0IGZvciB0aGUgYmFyLCBhZGp1c3RlZCBmb3IgdGhlIGJvcmRlciAqLworICAgIEdldENsaWVudFJlY3QzMiAod25kUHRyLT5od25kU2VsZiwgJnJlY3QpOworCisgICAgaEZvbnQgPSBpbmZvUHRyLT5oRm9udCA/IGluZm9QdHItPmhGb250IDogR2V0U3RvY2tPYmplY3QzMiAoU1lTVEVNX0ZPTlQpOworICAgIGhPbGRGb250ID0gU2VsZWN0T2JqZWN0MzIgKGhkYywgaEZvbnQpOworCisgICAgLyogZHJhdyBCYWNrZ3JvdW5kICovCisgICAgaGJyQmsgPSBHZXRTeXNDb2xvckJydXNoMzIoQ09MT1JfM0RGQUNFKTsKKyAgICBGaWxsUmVjdDMyKGhkYywgJnJlY3QsIGhickJrKTsKKworICAgIHggPSByZWN0LmxlZnQ7CisgICAgZm9yIChpID0gMDsgaSA8IGluZm9QdHItPnVOdW1JdGVtOyBpKyspIHsKKyAgICAgICAgeCA9IEhFQURFUl9EcmF3SXRlbSAod25kUHRyLCBoZGMsICZpbmZvUHRyLT5pdGVtc1tpXSwgRkFMU0UpOworICAgIH0KKworICAgIGlmICgoeCA8PSByZWN0LnJpZ2h0KSAmJiAoaW5mb1B0ci0+dU51bUl0ZW0gPiAwKSkgeworICAgICAgICByZWN0LmxlZnQgPSB4OworICAgICAgICBpZiAod25kUHRyLT5kd1N0eWxlICYgSERTX0JVVFRPTlMpCisgICAgICAgICAgICBEcmF3RWRnZTMyIChoZGMsICZyZWN0LCBFREdFX1JBSVNFRCwgQkZfVE9QfEJGX0xFRlR8QkZfQk9UVE9NfEJGX1NPRlQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBEcmF3RWRnZTMyIChoZGMsICZyZWN0LCBFREdFX0VUQ0hFRCwgQkZfQk9UVE9NKTsKKyAgICB9CisKKyAgICBTZWxlY3RPYmplY3QzMiAoaGRjLCBoT2xkRm9udCk7Cit9CisKKworc3RhdGljIHZvaWQKK0hFQURFUl9SZWZyZXNoSXRlbSAoV05EICp3bmRQdHIsIEhEQzMyIGhkYywgSEVBREVSX0lURU0gKnBoZGkpCit7CisgICAgSEVBREVSX0lORk8gKmluZm9QdHIgPSBIRUFERVJfR2V0SW5mb1B0cih3bmRQdHIpOworICAgIEhGT05UMzIgaEZvbnQsIGhPbGRGb250OworCisgICAgaEZvbnQgPSBpbmZvUHRyLT5oRm9udCA/IGluZm9QdHItPmhGb250IDogR2V0U3RvY2tPYmplY3QzMiAoU1lTVEVNX0ZPTlQpOworICAgIGhPbGRGb250ID0gU2VsZWN0T2JqZWN0MzIgKGhkYywgaEZvbnQpOworICAgIEhFQURFUl9EcmF3SXRlbSAod25kUHRyLCBoZGMsIHBoZGksIEZBTFNFKTsKKyAgICBTZWxlY3RPYmplY3QzMiAoaGRjLCBoT2xkRm9udCk7Cit9CisKKworc3RhdGljIHZvaWQKK0hFQURFUl9TZXRJdGVtQm91bmRzIChXTkQgKnduZFB0cikKK3sKKyAgICBIRUFERVJfSU5GTyAqaW5mb1B0ciA9IEhFQURFUl9HZXRJbmZvUHRyKHduZFB0cik7CisgICAgSEVBREVSX0lURU0gKnBoZGk7CisgICAgUkVDVDMyIHJlY3Q7CisgICAgaW50IGksIHg7CisKKyAgICBpZiAoaW5mb1B0ci0+dU51bUl0ZW0gPT0gMCkKKyAgICAgICAgcmV0dXJuOworCisgICAgR2V0Q2xpZW50UmVjdDMyICh3bmRQdHItPmh3bmRTZWxmLCAmcmVjdCk7CisKKyAgICB4ID0gcmVjdC5sZWZ0OworICAgIGZvciAoaSA9IDA7IGkgPCBpbmZvUHRyLT51TnVtSXRlbTsgaSsrKSB7CisgICAgICAgIHBoZGkgPSAmaW5mb1B0ci0+aXRlbXNbaV07CisgICAgICAgIHBoZGktPnJlY3QudG9wID0gcmVjdC50b3A7CisgICAgICAgIHBoZGktPnJlY3QuYm90dG9tID0gcmVjdC5ib3R0b207CisgICAgICAgIHBoZGktPnJlY3QubGVmdCA9IHg7CisgICAgICAgIHBoZGktPnJlY3QucmlnaHQgPSBwaGRpLT5yZWN0LmxlZnQgKyBwaGRpLT5jeHk7CisgICAgICAgIHggPSBwaGRpLT5yZWN0LnJpZ2h0OworICAgIH0KK30KKworCitzdGF0aWMgdm9pZAorSEVBREVSX0ZvcmNlSXRlbUJvdW5kcyAoV05EICp3bmRQdHIsIElOVDMyIGN5KQoreworICAgIEhFQURFUl9JTkZPICppbmZvUHRyID0gSEVBREVSX0dldEluZm9QdHIod25kUHRyKTsKKyAgICBIRUFERVJfSVRFTSAqcGhkaTsKKyAgICBpbnQgaSwgeDsKKworICAgIGlmIChpbmZvUHRyLT51TnVtSXRlbSA9PSAwKQorCXJldHVybjsKKworICAgIHggPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBpbmZvUHRyLT51TnVtSXRlbTsgaSsrKSB7CisJcGhkaSA9ICZpbmZvUHRyLT5pdGVtc1tpXTsKKwlwaGRpLT5yZWN0LnRvcCA9IDA7CisJcGhkaS0+cmVjdC5ib3R0b20gPSBjeTsKKwlwaGRpLT5yZWN0LmxlZnQgPSB4OworCXBoZGktPnJlY3QucmlnaHQgPSBwaGRpLT5yZWN0LmxlZnQgKyBwaGRpLT5jeHk7CisJeCA9IHBoZGktPnJlY3QucmlnaHQ7CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkCitIRUFERVJfSW50ZXJuYWxIaXRUZXN0IChXTkQgKnduZFB0ciwgTFBQT0lOVDMyIGxwUHQsIFVJTlQzMiAqcEZsYWdzLCBJTlQzMiAqcEl0ZW0pCit7CisgICAgSEVBREVSX0lORk8gKmluZm9QdHIgPSBIRUFERVJfR2V0SW5mb1B0cih3bmRQdHIpOworICAgIFJFQ1QzMiByZWN0LCByY1Rlc3Q7CisgICAgSU5UMzIgIGlDb3VudCwgd2lkdGg7CisgICAgQk9PTDMyIGJOb1dpZHRoOworCisgICAgR2V0Q2xpZW50UmVjdDMyICh3bmRQdHItPmh3bmRTZWxmLCAmcmVjdCk7CisKKyAgICAqcEZsYWdzID0gMDsKKyAgICBiTm9XaWR0aCA9IEZBTFNFOworICAgIGlmIChQdEluUmVjdDMyICgmcmVjdCwgKmxwUHQpKQorICAgIHsKKwlpZiAoaW5mb1B0ci0+dU51bUl0ZW0gPT0gMCkgeworCSAgICAqcEZsYWdzIHw9IEhIVF9OT1dIRVJFOworCSAgICAqcEl0ZW0gPSAxOworCSAgICBUUkFDRSAoaGVhZGVyLCAiTk9XSEVSRVxuIik7CisJICAgIHJldHVybjsKKwl9CisJZWxzZSB7CisJICAgIC8qIHNvbWV3aGVyZSBpbnNpZGUgKi8KKwkgICAgZm9yIChpQ291bnQgPSAwOyBpQ291bnQgPCBpbmZvUHRyLT51TnVtSXRlbTsgaUNvdW50KyspIHsKKwkJcmVjdCA9IGluZm9QdHItPml0ZW1zW2lDb3VudF0ucmVjdDsKKwkJd2lkdGggPSByZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0OworCQlpZiAod2lkdGggPT0gMCkgeworCQkgICAgYk5vV2lkdGggPSBUUlVFOworCQkgICAgY29udGludWU7CisJCX0KKwkJaWYgKFB0SW5SZWN0MzIgKCZyZWN0LCAqbHBQdCkpIHsKKwkJICAgIGlmICh3aWR0aCA8PSAyICogRElWSURFUl9XSURUSCkgeworCQkJKnBGbGFncyB8PSBISFRfT05IRUFERVI7CisJCQkqcEl0ZW0gPSBpQ291bnQ7CisJCQlUUkFDRSAoaGVhZGVyLCAiT04gSEVBREVSICVkXG4iLCBpQ291bnQpOworCQkJcmV0dXJuOworCQkgICAgfQorCQkgICAgaWYgKGlDb3VudCA+IDApIHsKKwkJCXJjVGVzdCA9IHJlY3Q7CisJCQlyY1Rlc3QucmlnaHQgPSByY1Rlc3QubGVmdCArIERJVklERVJfV0lEVEg7CisJCQlpZiAoUHRJblJlY3QzMiAoJnJjVGVzdCwgKmxwUHQpKSB7CisJCQkgICAgaWYgKGJOb1dpZHRoKSB7CisJCQkJKnBGbGFncyB8PSBISFRfT05ESVZPUEVOOworCQkJCSpwSXRlbSA9IGlDb3VudCAtIDE7CisJCQkJVFJBQ0UgKGhlYWRlciwgIk9OIERJVk9QRU4gJWRcbiIsICpwSXRlbSk7CisJCQkJcmV0dXJuOworCQkJICAgIH0KKwkJCSAgICBlbHNlIHsKKwkJCQkqcEZsYWdzIHw9IEhIVF9PTkRJVklERVI7CisJCQkJKnBJdGVtID0gaUNvdW50IC0gMTsKKwkJCQlUUkFDRSAoaGVhZGVyLCAiT04gRElWSURFUiAlZFxuIiwgKnBJdGVtKTsKKwkJCQlyZXR1cm47CisJCQkgICAgfQorCQkJfQorCQkgICAgfQorCQkgICAgcmNUZXN0ID0gcmVjdDsKKwkJICAgIHJjVGVzdC5sZWZ0ID0gcmNUZXN0LnJpZ2h0IC0gRElWSURFUl9XSURUSDsKKwkJICAgIGlmIChQdEluUmVjdDMyICgmcmNUZXN0LCAqbHBQdCkpIHsKKwkJCSpwRmxhZ3MgfD0gSEhUX09ORElWSURFUjsKKwkJCSpwSXRlbSA9IGlDb3VudDsKKwkJCVRSQUNFIChoZWFkZXIsICJPTiBESVZJREVSICVkXG4iLCAqcEl0ZW0pOworCQkJcmV0dXJuOworCQkgICAgfQorCisJCSAgICAqcEZsYWdzIHw9IEhIVF9PTkhFQURFUjsKKwkJICAgICpwSXRlbSA9IGlDb3VudDsKKwkJICAgIFRSQUNFIChoZWFkZXIsICJPTiBIRUFERVIgJWRcbiIsIGlDb3VudCk7CisJCSAgICByZXR1cm47CisJCX0KKwkgICAgfQorCisJICAgIC8qIGNoZWNrIGZvciBsYXN0IGRpdmlkZXIgcGFydCAob24gbm93aGVyZSkgKi8KKwkgICAgcmVjdCA9IGluZm9QdHItPml0ZW1zW2luZm9QdHItPnVOdW1JdGVtLTFdLnJlY3Q7CisJICAgIHJlY3QubGVmdCA9IHJlY3QucmlnaHQ7CisJICAgIHJlY3QucmlnaHQgKz0gRElWSURFUl9XSURUSDsKKwkgICAgaWYgKFB0SW5SZWN0MzIgKCZyZWN0LCAqbHBQdCkpIHsKKwkJaWYgKGJOb1dpZHRoKSB7CisJCSAgICAqcEZsYWdzIHw9IEhIVF9PTkRJVk9QRU47CisJCSAgICAqcEl0ZW0gPSBpbmZvUHRyLT51TnVtSXRlbSAtIDE7CisJCSAgICBUUkFDRSAoaGVhZGVyLCAiT04gRElWT1BFTiAlZFxuIiwgKnBJdGVtKTsKKwkJICAgIHJldHVybjsKKwkJfQorCQllbHNlIHsKKwkJICAgICpwRmxhZ3MgfD0gSEhUX09ORElWSURFUjsKKwkJICAgICpwSXRlbSA9IGluZm9QdHItPnVOdW1JdGVtLTE7CisJCSAgICBUUkFDRSAoaGVhZGVyLCAiT04gRElWSURFUiAlZFxuIiwgKnBJdGVtKTsKKwkJICAgIHJldHVybjsKKwkJfQorCSAgICB9CisKKwkgICAgKnBGbGFncyB8PSBISFRfTk9XSEVSRTsKKwkgICAgKnBJdGVtID0gMTsKKwkgICAgVFJBQ0UgKGhlYWRlciwgIk5PV0hFUkVcbiIpOworCSAgICByZXR1cm47CisJfQorICAgIH0KKyAgICBlbHNlIHsKKwlpZiAobHBQdC0+eCA8IHJlY3QubGVmdCkgeworCSAgIFRSQUNFIChoZWFkZXIsICJUTyBMRUZUXG4iKTsKKwkgICAqcEZsYWdzIHw9IEhIVF9UT0xFRlQ7CisJfQorCWVsc2UgaWYgKGxwUHQtPnggPiByZWN0LnJpZ2h0KSB7CisJICAgIFRSQUNFIChoZWFkZXIsICJUTyBMRUZUXG4iKTsKKwkgICAgKnBGbGFncyB8PSBISFRfVE9SSUdIVDsKKwl9CisKKwlpZiAobHBQdC0+eSA8IHJlY3QudG9wKSB7CisJICAgIFRSQUNFIChoZWFkZXIsICJBQk9WRVxuIik7CisJICAgICpwRmxhZ3MgfD0gSEhUX0FCT1ZFOworCX0KKwllbHNlIGlmIChscFB0LT55ID4gcmVjdC5ib3R0b20pIHsKKwkgICAgVFJBQ0UgKGhlYWRlciwgIkJFTE9XXG4iKTsKKwkgICAgKnBGbGFncyB8PSBISFRfQkVMT1c7CisJfQorICAgIH0KKworICAgICpwSXRlbSA9IDE7CisgICAgVFJBQ0UgKGhlYWRlciwgImZsYWdzPTB4JVhcbiIsICpwRmxhZ3MpOworICAgIHJldHVybjsKK30KKworCitzdGF0aWMgdm9pZAorSEVBREVSX0RyYXdUcmFja0xpbmUgKFdORCAqd25kUHRyLCBIREMzMiBoZGMsIElOVDMyIHgpCit7CisgICAgUkVDVDMyIHJlY3Q7CisgICAgSFBFTjMyIGhPbGRQZW47CisgICAgSU5UMzIgIG9sZFJvcDsKKworICAgIEdldENsaWVudFJlY3QzMiAod25kUHRyLT5od25kU2VsZiwgJnJlY3QpOworCisgICAgaE9sZFBlbiA9IFNlbGVjdE9iamVjdDMyIChoZGMsIEdldFN0b2NrT2JqZWN0MzIgKEJMQUNLX1BFTikpOworICAgIG9sZFJvcCA9IFNldFJPUDIzMiAoaGRjLCBSMl9YT1JQRU4pOworICAgIE1vdmVUb0V4MzIgKGhkYywgeCwgcmVjdC50b3AsIE5VTEwpOworICAgIExpbmVUbzMyIChoZGMsIHgsIHJlY3QuYm90dG9tKTsKKyAgICBTZXRST1AyMzIgKGhkYywgb2xkUm9wKTsKKyAgICBTZWxlY3RPYmplY3QzMiAoaGRjLCBoT2xkUGVuKTsKK30KKworCitzdGF0aWMgQk9PTDMyCitIRUFERVJfU2VuZFNpbXBsZU5vdGlmeSAoV05EICp3bmRQdHIsIFVJTlQzMiBjb2RlKQoreworICAgIE5NSERSIG5taGRyOworCisgICAgbm1oZHIuaHduZEZyb20gPSB3bmRQdHItPmh3bmRTZWxmOworICAgIG5taGRyLmlkRnJvbSAgID0gd25kUHRyLT53SURtZW51OworICAgIG5taGRyLmNvZGUgICAgID0gY29kZTsKKworICAgIHJldHVybiAoQk9PTDMyKVNlbmRNZXNzYWdlMzJBIChHZXRQYXJlbnQzMiAod25kUHRyLT5od25kU2VsZiksIFdNX05PVElGWSwKKwkJCQkgICAoV1BBUkFNMzIpbm1oZHIuaWRGcm9tLCAoTFBBUkFNKSZubWhkcik7Cit9CisKKworc3RhdGljIEJPT0wzMgorSEVBREVSX1NlbmRIZWFkZXJOb3RpZnkgKFdORCAqd25kUHRyLCBVSU5UMzIgY29kZSwgSU5UMzIgaUl0ZW0pCit7CisgICAgSEVBREVSX0lORk8gKmluZm9QdHIgPSBIRUFERVJfR2V0SW5mb1B0cih3bmRQdHIpOyAgIAorICAgIE5NSEVBREVSQSBubWhkcjsKKyAgICBIRF9JVEVNQSAgbm1pdGVtOworCisgICAgbm1oZHIuaGRyLmh3bmRGcm9tID0gd25kUHRyLT5od25kU2VsZjsKKyAgICBubWhkci5oZHIuaWRGcm9tID0gd25kUHRyLT53SURtZW51OworICAgIG5taGRyLmhkci5jb2RlID0gY29kZTsKKyAgICBubWhkci5pSXRlbSA9IGlJdGVtOworICAgIG5taGRyLmlCdXR0b24gPSAwOworICAgIG5taGRyLnBpdGVtID0gJm5taXRlbTsKKyAgICBubWl0ZW0ubWFzayA9IGluZm9QdHItPml0ZW1zW2lJdGVtXS5tYXNrOworICAgIG5taXRlbS5jeHkgPSBpbmZvUHRyLT5pdGVtc1tpSXRlbV0uY3h5OworICAgIG5taXRlbS5oYm0gPSBpbmZvUHRyLT5pdGVtc1tpSXRlbV0uaGJtOworICAgIG5taXRlbS5wc3pUZXh0ID0gaW5mb1B0ci0+aXRlbXNbaUl0ZW1dLnBzelRleHQ7CisgICAgbm1pdGVtLmNjaFRleHRNYXggPSBpbmZvUHRyLT5pdGVtc1tpSXRlbV0uY2NoVGV4dE1heDsKKyAgICBubWl0ZW0uZm10ID0gaW5mb1B0ci0+aXRlbXNbaUl0ZW1dLmZtdDsKKyAgICBubWl0ZW0ubFBhcmFtID0gaW5mb1B0ci0+aXRlbXNbaUl0ZW1dLmxQYXJhbTsKKyAgICBubWl0ZW0uaU9yZGVyID0gaW5mb1B0ci0+aXRlbXNbaUl0ZW1dLmlPcmRlcjsKKyAgICBubWl0ZW0uaUltYWdlID0gaW5mb1B0ci0+aXRlbXNbaUl0ZW1dLmlJbWFnZTsKKworICAgIHJldHVybiAoQk9PTDMyKVNlbmRNZXNzYWdlMzJBIChHZXRQYXJlbnQzMiAod25kUHRyLT5od25kU2VsZiksIFdNX05PVElGWSwKKwkJCQkgICAoV1BBUkFNMzIpd25kUHRyLT53SURtZW51LCAoTFBBUkFNKSZubWhkcik7Cit9CisKKworc3RhdGljIEJPT0wzMgorSEVBREVSX1NlbmRDbGlja05vdGlmeSAoV05EICp3bmRQdHIsIFVJTlQzMiBjb2RlLCBJTlQzMiBpSXRlbSkKK3sKKyAgICBOTUhFQURFUkEgbm1oZHI7CisKKyAgICBubWhkci5oZHIuaHduZEZyb20gPSB3bmRQdHItPmh3bmRTZWxmOworICAgIG5taGRyLmhkci5pZEZyb20gPSB3bmRQdHItPndJRG1lbnU7CisgICAgbm1oZHIuaGRyLmNvZGUgPSBjb2RlOworICAgIG5taGRyLmlJdGVtID0gaUl0ZW07CisgICAgbm1oZHIuaUJ1dHRvbiA9IDA7CisgICAgbm1oZHIucGl0ZW0gPSBOVUxMOworCisgICAgcmV0dXJuIChCT09MMzIpU2VuZE1lc3NhZ2UzMkEgKEdldFBhcmVudDMyICh3bmRQdHItPmh3bmRTZWxmKSwgV01fTk9USUZZLAorCQkJCSAgIChXUEFSQU0zMil3bmRQdHItPndJRG1lbnUsIChMUEFSQU0pJm5taGRyKTsKK30KKworCitzdGF0aWMgTFJFU1VMVAorSEVBREVSX0NyZWF0ZURyYWdJbWFnZSAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSkKK3sKKyAgICBGSVhNRSAoaGVhZGVyLCAiZW1wdHkgc3R1YiFcbiIpOworICAgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBMUkVTVUxUCitIRUFERVJfRGVsZXRlSXRlbSAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSkKK3sKKyAgICBIRUFERVJfSU5GTyAqaW5mb1B0ciA9IEhFQURFUl9HZXRJbmZvUHRyKHduZFB0cik7CisgICAgSERDMzIgaGRjOworICAgIElOVDMyIGlJdGVtOworCisgICAgaUl0ZW0gPSAoSU5UMzIpd1BhcmFtOworCisgICAgVFJBQ0UoaGVhZGVyLCAiW2lJdGVtPSVkXVxuIiwgaUl0ZW0pOworICAgIAorICAgIGlmICgoaUl0ZW0gPCAwKSB8fCAoaUl0ZW0gPiBpbmZvUHRyLT51TnVtSXRlbSAtIDEpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBpZiAoaW5mb1B0ci0+dU51bUl0ZW0gPT0gMSkgeworICAgICAgICBUUkFDRShoZWFkZXIsICJTaW1wbGUgZGVsZXRlIVxuIik7CisgICAgICAgIGlmIChpbmZvUHRyLT5pdGVtc1swXS5wc3pUZXh0KQorICAgICAgICAgICAgSGVhcEZyZWUgKFN5c3RlbUhlYXAsIDAsIGluZm9QdHItPml0ZW1zWzBdLnBzelRleHQpOworICAgICAgICBIZWFwRnJlZSAoU3lzdGVtSGVhcCwgMCwgaW5mb1B0ci0+aXRlbXMpOworICAgICAgICBpbmZvUHRyLT5pdGVtcyA9IDA7CisgICAgICAgIGluZm9QdHItPnVOdW1JdGVtID0gMDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIEhFQURFUl9JVEVNICpvbGRJdGVtcyA9IGluZm9QdHItPml0ZW1zOworICAgICAgICBUUkFDRShoZWFkZXIsICJDb21wbGV4IGRlbGV0ZSEgW2lJdGVtPSVkXVxuIiwgaUl0ZW0pOworCisgICAgICAgIGlmIChpbmZvUHRyLT5pdGVtc1tpSXRlbV0ucHN6VGV4dCkKKyAgICAgICAgICAgIEhlYXBGcmVlIChTeXN0ZW1IZWFwLCAwLCBpbmZvUHRyLT5pdGVtc1tpSXRlbV0ucHN6VGV4dCk7CisKKyAgICAgICAgaW5mb1B0ci0+dU51bUl0ZW0tLTsKKyAgICAgICAgaW5mb1B0ci0+aXRlbXMgPSBIZWFwQWxsb2MgKFN5c3RlbUhlYXAsIEhFQVBfWkVST19NRU1PUlksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKEhFQURFUl9JVEVNKSAqIGluZm9QdHItPnVOdW1JdGVtKTsKKyAgICAgICAgLyogcHJlIGRlbGV0ZSBjb3B5ICovCisgICAgICAgIGlmIChpSXRlbSA+IDApIHsKKyAgICAgICAgICAgIG1lbWNweSAoJmluZm9QdHItPml0ZW1zWzBdLCAmb2xkSXRlbXNbMF0sCisgICAgICAgICAgICAgICAgICAgIGlJdGVtICogc2l6ZW9mKEhFQURFUl9JVEVNKSk7CisgICAgICAgIH0KKworICAgICAgICAvKiBwb3N0IGRlbGV0ZSBjb3B5ICovCisgICAgICAgIGlmIChpSXRlbSA8IGluZm9QdHItPnVOdW1JdGVtKSB7CisgICAgICAgICAgICBtZW1jcHkgKCZpbmZvUHRyLT5pdGVtc1tpSXRlbV0sICZvbGRJdGVtc1tpSXRlbSsxXSwKKyAgICAgICAgICAgICAgICAgICAgKGluZm9QdHItPnVOdW1JdGVtIC0gaUl0ZW0pICogc2l6ZW9mKEhFQURFUl9JVEVNKSk7CisgICAgICAgIH0KKworICAgICAgICBIZWFwRnJlZSAoU3lzdGVtSGVhcCwgMCwgb2xkSXRlbXMpOworICAgIH0KKworICAgIEhFQURFUl9TZXRJdGVtQm91bmRzICh3bmRQdHIpOworCisgICAgaGRjID0gR2V0REMzMiAod25kUHRyLT5od25kU2VsZik7CisgICAgSEVBREVSX1JlZnJlc2ggKHduZFB0ciwgaGRjKTsKKyAgICBSZWxlYXNlREMzMiAod25kUHRyLT5od25kU2VsZiwgaGRjKTsKKyAgICAKKyAgICByZXR1cm4gVFJVRTsKK30KKworCitzdGF0aWMgTFJFU1VMVAorSEVBREVSX0dldEltYWdlTGlzdCAoV05EICp3bmRQdHIpCit7CisgICAgSEVBREVSX0lORk8gKmluZm9QdHIgPSBIRUFERVJfR2V0SW5mb1B0cih3bmRQdHIpOworCisgICAgcmV0dXJuIChMUkVTVUxUKWluZm9QdHItPmhpbWw7Cit9CisKKworc3RhdGljIExSRVNVTFQKK0hFQURFUl9HZXRJdGVtMzJBIChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworICAgIEhFQURFUl9JTkZPICppbmZvUHRyID0gSEVBREVSX0dldEluZm9QdHIod25kUHRyKTsKKyAgICBIRF9JVEVNQSAqcGhkaTsKKyAgICBJTlQzMiAgICBpSXRlbTsKKyAgICBVSU5UMzIgICB1TWFzazsKKworICAgIHBoZGkgPSAoSERfSVRFTUEqKWxQYXJhbTsKKyAgICBpSXRlbSA9IChJTlQzMil3UGFyYW07CisKKyAgICBpZiAoKGlJdGVtIDwgMCkgfHwgKGlJdGVtID4gaW5mb1B0ci0+dU51bUl0ZW0gLSAxKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgVFJBQ0UgKGhlYWRlciwgIltpSXRlbT0lZF1cbiIsIGlJdGVtKTsKKworICAgIHVNYXNrID0gcGhkaS0+bWFzazsKKyAgICBpZiAodU1hc2sgPT0gMCkKKwlyZXR1cm4gVFJVRTsKKyAgICBwaGRpLT5tYXNrID0gMDsKKworICAgIGlmICh1TWFzayAmIGluZm9QdHItPml0ZW1zW2lJdGVtXS5tYXNrICYgSERJX0JJVE1BUCkgeworCXBoZGktPmhibSA9IGluZm9QdHItPml0ZW1zW2lJdGVtXS5oYm07CisgICAgICAgIHBoZGktPm1hc2sgfD0gSERJX0JJVE1BUDsKKyAgICB9CisKKyAgICBpZiAodU1hc2sgJiBpbmZvUHRyLT5pdGVtc1tpSXRlbV0ubWFzayAmIEhESV9GT1JNQVQpIHsKKwlwaGRpLT5mbXQgPSBpbmZvUHRyLT5pdGVtc1tpSXRlbV0uZm10OworICAgICAgICBwaGRpLT5tYXNrIHw9IEhESV9GT1JNQVQ7CisgICAgfQorCisgICAgaWYgKHVNYXNrICYgaW5mb1B0ci0+aXRlbXNbaUl0ZW1dLm1hc2sgJiBIRElfV0lEVEgpIHsKKwlwaGRpLT5jeHkgPSBpbmZvUHRyLT5pdGVtc1tpSXRlbV0uY3h5OworICAgICAgICBwaGRpLT5tYXNrIHw9IEhESV9XSURUSDsKKyAgICB9CisKKyAgICBpZiAodU1hc2sgJiBpbmZvUHRyLT5pdGVtc1tpSXRlbV0ubWFzayAmIEhESV9MUEFSQU0pIHsKKwlwaGRpLT5sUGFyYW0gPSBpbmZvUHRyLT5pdGVtc1tpSXRlbV0ubFBhcmFtOworICAgICAgICBwaGRpLT5tYXNrIHw9IEhESV9MUEFSQU07CisgICAgfQorCisgICAgaWYgKHVNYXNrICYgaW5mb1B0ci0+aXRlbXNbaUl0ZW1dLm1hc2sgJiBIRElfVEVYVCkgeworCXBoZGktPnBzelRleHQgPSBpbmZvUHRyLT5pdGVtc1tpSXRlbV0ucHN6VGV4dDsKKwlwaGRpLT5jY2hUZXh0TWF4ID0gaW5mb1B0ci0+aXRlbXNbaUl0ZW1dLmNjaFRleHRNYXg7CisgICAgICAgIHBoZGktPm1hc2sgfD0gSERJX1RFWFQ7CisgICAgfQorCisgICAgaWYgKHVNYXNrICYgaW5mb1B0ci0+aXRlbXNbaUl0ZW1dLm1hc2sgJiBIRElfSU1BR0UpIHsKKwlwaGRpLT5pSW1hZ2UgPSBpbmZvUHRyLT5pdGVtc1tpSXRlbV0uaUltYWdlOworICAgICAgICBwaGRpLT5tYXNrIHw9IEhESV9JTUFHRTsKKyAgICB9CisKKyAgICBpZiAodU1hc2sgJiBpbmZvUHRyLT5pdGVtc1tpSXRlbV0ubWFzayAmIEhESV9PUkRFUikgeworCXBoZGktPmlPcmRlciA9IGluZm9QdHItPml0ZW1zW2lJdGVtXS5pT3JkZXI7CisgICAgICAgIHBoZGktPm1hc2sgfD0gSERJX09SREVSOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorCisKK3N0YXRpYyBMUkVTVUxUCitIRUFERVJfR2V0SXRlbUNvdW50IChXTkQgKnduZFB0cikKK3sKKyAgICBIRUFERVJfSU5GTyAqaW5mb1B0ciA9IEhFQURFUl9HZXRJbmZvUHRyKHduZFB0cik7CisKKyAgICByZXR1cm4gKGluZm9QdHItPnVOdW1JdGVtKTsKK30KKworCitzdGF0aWMgTFJFU1VMVAorSEVBREVSX0dldEl0ZW1SZWN0IChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworICAgIEhFQURFUl9JTkZPICppbmZvUHRyID0gSEVBREVSX0dldEluZm9QdHIod25kUHRyKTsKKyAgICBJTlQzMiBpSXRlbTsKKyAgICBMUFJFQ1QzMiBscFJlY3Q7CisKKyAgICBpSXRlbSA9IChJTlQzMil3UGFyYW07CisgICAgbHBSZWN0ID0gKExQUkVDVDMyKWxQYXJhbTsKKworICAgIGlmICgoaUl0ZW0gPCAwKSB8fCAoaUl0ZW0gPiBpbmZvUHRyLT51TnVtSXRlbSAtIDEpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBscFJlY3QtPmxlZnQgICA9IGluZm9QdHItPml0ZW1zW2lJdGVtXS5yZWN0LmxlZnQ7CisgICAgbHBSZWN0LT5yaWdodCAgPSBpbmZvUHRyLT5pdGVtc1tpSXRlbV0ucmVjdC5yaWdodDsKKyAgICBscFJlY3QtPnRvcCAgICA9IGluZm9QdHItPml0ZW1zW2lJdGVtXS5yZWN0LnRvcDsKKyAgICBscFJlY3QtPmJvdHRvbSA9IGluZm9QdHItPml0ZW1zW2lJdGVtXS5yZWN0LmJvdHRvbTsKKworICAgIHJldHVybiBUUlVFOworfQorCisKK3N0YXRpYyBMUkVTVUxUCitIRUFERVJfSGl0VGVzdCAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBMUEhESElUVEVTVElORk8gcGh0aSA9IChMUEhESElUVEVTVElORk8pbFBhcmFtOworCisgICAgSEVBREVSX0ludGVybmFsSGl0VGVzdCAod25kUHRyLCAmcGh0aS0+cHQsICZwaHRpLT5mbGFncywgJnBodGktPmlJdGVtKTsKKworICAgIHJldHVybiBwaHRpLT5mbGFnczsKK30KKworCitzdGF0aWMgTFJFU1VMVAorSEVBREVSX0luc2VydEl0ZW0zMkEgKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCit7CisgICAgSEVBREVSX0lORk8gKmluZm9QdHIgPSBIRUFERVJfR2V0SW5mb1B0cih3bmRQdHIpOworICAgIEhEX0lURU1BICpwaGRpOworICAgIEhEQzMyICAgIGhkYzsKKyAgICBJTlQzMiAgICBpSXRlbSwgbGVuOworCisgICAgcGhkaSA9IChIRF9JVEVNQSopbFBhcmFtOworICAgIGlJdGVtID0gKElOVDMyKXdQYXJhbTsKKyAgICAKKyAgICBpZiAoaUl0ZW0gPCAwKSByZXR1cm4gLTE7CisgICAgaWYgKGlJdGVtID4gaW5mb1B0ci0+dU51bUl0ZW0pCisgICAgICAgIGlJdGVtID0gaW5mb1B0ci0+dU51bUl0ZW07CisKKyAgICBpZiAoaW5mb1B0ci0+dU51bUl0ZW0gPT0gMCkgeworICAgICAgICBpbmZvUHRyLT5pdGVtcyA9IEhlYXBBbGxvYyAoU3lzdGVtSGVhcCwgSEVBUF9aRVJPX01FTU9SWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoSEVBREVSX0lURU0pKTsKKyAgICAgICAgaW5mb1B0ci0+dU51bUl0ZW0rKzsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIEhFQURFUl9JVEVNICpvbGRJdGVtcyA9IGluZm9QdHItPml0ZW1zOworCisgICAgICAgIGluZm9QdHItPnVOdW1JdGVtKys7CisgICAgICAgIGluZm9QdHItPml0ZW1zID0gSGVhcEFsbG9jIChTeXN0ZW1IZWFwLCBIRUFQX1pFUk9fTUVNT1JZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIChIRUFERVJfSVRFTSkgKiBpbmZvUHRyLT51TnVtSXRlbSk7CisgICAgICAgIC8qIHByZSBpbnNlcnQgY29weSAqLworICAgICAgICBpZiAoaUl0ZW0gPiAwKSB7CisgICAgICAgICAgICBtZW1jcHkgKCZpbmZvUHRyLT5pdGVtc1swXSwgJm9sZEl0ZW1zWzBdLAorICAgICAgICAgICAgICAgICAgICBpSXRlbSAqIHNpemVvZihIRUFERVJfSVRFTSkpOworICAgICAgICB9CisKKyAgICAgICAgLyogcG9zdCBpbnNlcnQgY29weSAqLworICAgICAgICBpZiAoaUl0ZW0gPCBpbmZvUHRyLT51TnVtSXRlbSAtIDEpIHsKKyAgICAgICAgICAgIG1lbWNweSAoJmluZm9QdHItPml0ZW1zW2lJdGVtKzFdLCAmb2xkSXRlbXNbaUl0ZW1dLAorICAgICAgICAgICAgICAgICAgICAoaW5mb1B0ci0+dU51bUl0ZW0gLSBpSXRlbSkgKiBzaXplb2YoSEVBREVSX0lURU0pKTsKKyAgICAgICAgfQorCisgICAgICAgIEhlYXBGcmVlIChTeXN0ZW1IZWFwLCAwLCBvbGRJdGVtcyk7CisgICAgfQorCisgICAgaW5mb1B0ci0+aXRlbXNbaUl0ZW1dLmJEb3duID0gRkFMU0U7CisKKyAgICBpbmZvUHRyLT5pdGVtc1tpSXRlbV0ubWFzayA9IHBoZGktPm1hc2s7CisgICAgaWYgKHBoZGktPm1hc2sgJiBIRElfV0lEVEgpCisgICAgICAgIGluZm9QdHItPml0ZW1zW2lJdGVtXS5jeHkgPSBwaGRpLT5jeHk7CisKKyAgICBpZiAocGhkaS0+bWFzayAmIEhESV9URVhUKSB7CisgICAgICAgIGxlbiA9IGxzdHJsZW4zMkEgKHBoZGktPnBzelRleHQpOworICAgICAgICBpbmZvUHRyLT5pdGVtc1tpSXRlbV0ucHN6VGV4dCA9CisgICAgICAgICAgICBIZWFwQWxsb2MgKFN5c3RlbUhlYXAsIEhFQVBfWkVST19NRU1PUlksIGxlbisxKTsKKyAgICAgICAgbHN0cmNweTMyQSAoaW5mb1B0ci0+aXRlbXNbaUl0ZW1dLnBzelRleHQsIHBoZGktPnBzelRleHQpOworICAgICAgICBpbmZvUHRyLT5pdGVtc1tpSXRlbV0uY2NoVGV4dE1heCA9IHBoZGktPmNjaFRleHRNYXg7CisgICAgfQorCisgICAgaWYgKHBoZGktPm1hc2sgJiBIRElfRk9STUFUKQorICAgICAgICBpbmZvUHRyLT5pdGVtc1tpSXRlbV0uZm10ID0gcGhkaS0+Zm10OworCisgICAgaWYgKHBoZGktPm1hc2sgJiBIRElfQklUTUFQKQorICAgICAgICBpbmZvUHRyLT5pdGVtc1tpSXRlbV0uaGJtID0gcGhkaS0+aGJtOworCisgICAgaWYgKHBoZGktPm1hc2sgJiBIRElfTFBBUkFNKQorICAgICAgICBpbmZvUHRyLT5pdGVtc1tpSXRlbV0ubFBhcmFtID0gcGhkaS0+bFBhcmFtOworCisgICAgaWYgKHBoZGktPm1hc2sgJiBIRElfSU1BR0UpCisgICAgICAgIGluZm9QdHItPml0ZW1zW2lJdGVtXS5pSW1hZ2UgPSBwaGRpLT5pSW1hZ2U7CisKKyAgICBpZiAocGhkaS0+bWFzayAmIEhESV9PUkRFUikKKyAgICAgICAgaW5mb1B0ci0+aXRlbXNbaUl0ZW1dLmlPcmRlciA9IHBoZGktPmlPcmRlcjsKKworICAgIEhFQURFUl9TZXRJdGVtQm91bmRzICh3bmRQdHIpOworCisgICAgaGRjID0gR2V0REMzMiAod25kUHRyLT5od25kU2VsZik7CisgICAgSEVBREVSX1JlZnJlc2ggKHduZFB0ciwgaGRjKTsKKyAgICBSZWxlYXNlREMzMiAod25kUHRyLT5od25kU2VsZiwgaGRjKTsKKworICAgIHJldHVybiBpSXRlbTsKK30KKworCitzdGF0aWMgTFJFU1VMVAorSEVBREVSX0xheW91dCAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBIRUFERVJfSU5GTyAqaW5mb1B0ciA9IEhFQURFUl9HZXRJbmZvUHRyKHduZFB0cik7CisgICAgTFBIRExBWU9VVCBscExheW91dCA9IChMUEhETEFZT1VUKWxQYXJhbTsKKworICAgIGxwTGF5b3V0LT5wd3Bvcy0+aHduZCA9IHduZFB0ci0+aHduZFNlbGY7CisgICAgbHBMYXlvdXQtPnB3cG9zLT5od25kSW5zZXJ0QWZ0ZXIgPSAwOworICAgIGxwTGF5b3V0LT5wd3Bvcy0+eCA9IGxwTGF5b3V0LT5wcmMtPmxlZnQ7CisgICAgbHBMYXlvdXQtPnB3cG9zLT55ID0gbHBMYXlvdXQtPnByYy0+dG9wOworICAgIGxwTGF5b3V0LT5wd3Bvcy0+Y3ggPSBscExheW91dC0+cHJjLT5yaWdodCAtIGxwTGF5b3V0LT5wcmMtPmxlZnQ7CisgICAgaWYgKHduZFB0ci0+ZHdTdHlsZSAmIEhEU19ISURERU4pCisgICAgICAgIGxwTGF5b3V0LT5wd3Bvcy0+Y3kgPSAwOworICAgIGVsc2UKKyAgICAgICAgbHBMYXlvdXQtPnB3cG9zLT5jeSA9IGluZm9QdHItPm5IZWlnaHQ7CisgICAgbHBMYXlvdXQtPnB3cG9zLT5mbGFncyA9IFNXUF9OT0FDVElWQVRFfFNXUF9OT1pPUkRFUjsKKworICAgIFRSQUNFIChoZWFkZXIsICJMYXlvdXQgeD0lZCB5PSVkIGN4PSVkIGN5PSVkXG4iLAorICAgICAgICAgICBscExheW91dC0+cHdwb3MtPngsIGxwTGF5b3V0LT5wd3Bvcy0+eSwKKyAgICAgICAgICAgbHBMYXlvdXQtPnB3cG9zLT5jeCwgbHBMYXlvdXQtPnB3cG9zLT5jeSk7CisKKyAgICBIRUFERVJfRm9yY2VJdGVtQm91bmRzICh3bmRQdHIsIGxwTGF5b3V0LT5wd3Bvcy0+Y3kpOworCisgICAgLyogaGFjayAqLworI2lmZGVmIF9fSERNX0xBWU9VVF9IQUNLX18KKyAgICBNb3ZlV2luZG93MzIgKGxwTGF5b3V0LT5wd3Bvcy0+aHduZCwgbHBMYXlvdXQtPnB3cG9zLT54LCBscExheW91dC0+cHdwb3MtPnksCisgICAgICAgICAgICAgICAgICBscExheW91dC0+cHdwb3MtPmN4LCBscExheW91dC0+cHdwb3MtPmN5LCBUUlVFKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworc3RhdGljIExSRVNVTFQKK0hFQURFUl9TZXRJbWFnZUxpc3QgKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCit7CisgICAgSEVBREVSX0lORk8gKmluZm9QdHIgPSBIRUFERVJfR2V0SW5mb1B0cih3bmRQdHIpOworICAgIEhJTUFHRUxJU1QgaGltbE9sZDsKKworICAgIGhpbWxPbGQgPSBpbmZvUHRyLT5oaW1sOworICAgIGluZm9QdHItPmhpbWwgPSAoSElNQUdFTElTVClsUGFyYW07CisKKyAgICAvKiBGSVhNRTogUmVmcmVzaCBuZWVkZWQ/Pz8gKi8KKworICAgIHJldHVybiAoTFJFU1VMVCloaW1sT2xkOworfQorCisKK3N0YXRpYyBMUkVTVUxUCitIRUFERVJfU2V0SXRlbTMyQSAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBIRUFERVJfSU5GTyAqaW5mb1B0ciA9IEhFQURFUl9HZXRJbmZvUHRyKHduZFB0cik7CisgICAgSERfSVRFTUEgKnBoZGk7CisgICAgSU5UMzIgICAgaUl0ZW07CisgICAgSERDMzIgICAgaGRjOworCisgICAgcGhkaSA9IChIRF9JVEVNQSopbFBhcmFtOworICAgIGlJdGVtID0gKElOVDMyKXdQYXJhbTsKKworICAgIGlmICgoaUl0ZW0gPCAwKSB8fCAoaUl0ZW0gPiBpbmZvUHRyLT51TnVtSXRlbSAtIDEpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBUUkFDRSAoaGVhZGVyLCAiW2lJdGVtPSVkXVxuIiwgaUl0ZW0pOworCisgICAgaWYgKEhFQURFUl9TZW5kSGVhZGVyTm90aWZ5ICh3bmRQdHIsIEhETl9JVEVNQ0hBTkdJTkczMkEsIGlJdGVtKSkKKwlyZXR1cm4gRkFMU0U7CisKKyAgICBpZiAocGhkaS0+bWFzayAmIEhESV9CSVRNQVApIHsKKwlpbmZvUHRyLT5pdGVtc1tpSXRlbV0uaGJtID0gcGhkaS0+aGJtOworCWluZm9QdHItPml0ZW1zW2lJdGVtXS5tYXNrICB8PSBIRElfQklUTUFQOworICAgIH0KKworICAgIGlmIChwaGRpLT5tYXNrICYgSERJX0ZPUk1BVCkgeworCWluZm9QdHItPml0ZW1zW2lJdGVtXS5mbXQgPSBwaGRpLT5mbXQ7CisJaW5mb1B0ci0+aXRlbXNbaUl0ZW1dLm1hc2sgIHw9IEhESV9GT1JNQVQ7CisgICAgfQorCisgICAgaWYgKHBoZGktPm1hc2sgJiBIRElfTFBBUkFNKSB7CisJaW5mb1B0ci0+aXRlbXNbaUl0ZW1dLmxQYXJhbSA9IHBoZGktPmxQYXJhbTsKKwlpbmZvUHRyLT5pdGVtc1tpSXRlbV0ubWFzayAgfD0gSERJX0xQQVJBTTsKKyAgICB9CisKKyAgICBpZiAocGhkaS0+bWFzayAmIEhESV9URVhUKSB7CisgICAgICAgIElOVDMyIGxlbiA9IGxzdHJsZW4zMkEgKHBoZGktPnBzelRleHQpOworICAgICAgICBpZiAoaW5mb1B0ci0+aXRlbXNbaUl0ZW1dLnBzelRleHQpCisJICAgIEhlYXBGcmVlIChTeXN0ZW1IZWFwLCAwLCBpbmZvUHRyLT5pdGVtc1tpSXRlbV0ucHN6VGV4dCk7CisgICAgICAgIGluZm9QdHItPml0ZW1zW2lJdGVtXS5wc3pUZXh0ID0KKyAgICAgICAgICAgIEhlYXBBbGxvYyAoU3lzdGVtSGVhcCwgSEVBUF9aRVJPX01FTU9SWSwgbGVuKzEpOworICAgICAgICBsc3RyY3B5MzJBIChpbmZvUHRyLT5pdGVtc1tpSXRlbV0ucHN6VGV4dCwgcGhkaS0+cHN6VGV4dCk7CisgICAgICAgIGluZm9QdHItPml0ZW1zW2lJdGVtXS5jY2hUZXh0TWF4ID0gcGhkaS0+Y2NoVGV4dE1heDsKKyAgICB9CisKKyAgICBpZiAocGhkaS0+bWFzayAmIEhESV9XSURUSCkgeworCWluZm9QdHItPml0ZW1zW2lJdGVtXS5jeHkgPSBwaGRpLT5jeHk7CisJaW5mb1B0ci0+aXRlbXNbaUl0ZW1dLm1hc2sgIHw9IEhESV9XSURUSDsKKyAgICB9CisKKyAgICBpZiAocGhkaS0+bWFzayAmIEhESV9JTUFHRSkgeworCWluZm9QdHItPml0ZW1zW2lJdGVtXS5pSW1hZ2UgPSBwaGRpLT5pSW1hZ2U7CisJaW5mb1B0ci0+aXRlbXNbaUl0ZW1dLm1hc2sgIHw9IEhESV9JTUFHRTsKKyAgICB9CisKKyAgICBpZiAocGhkaS0+bWFzayAmIEhESV9PUkRFUikgeworCWluZm9QdHItPml0ZW1zW2lJdGVtXS5pT3JkZXIgPSBwaGRpLT5pT3JkZXI7CisJaW5mb1B0ci0+aXRlbXNbaUl0ZW1dLm1hc2sgIHw9IEhESV9PUkRFUjsKKyAgICB9CisKKyAgICBIRUFERVJfU2VuZEhlYWRlck5vdGlmeSAod25kUHRyLCBIRE5fSVRFTUNIQU5HRUQzMkEsIGlJdGVtKTsKKworICAgIEhFQURFUl9TZXRJdGVtQm91bmRzICh3bmRQdHIpOworICAgIGhkYyA9IEdldERDMzIgKHduZFB0ci0+aHduZFNlbGYpOworICAgIEhFQURFUl9SZWZyZXNoICh3bmRQdHIsIGhkYyk7CisgICAgUmVsZWFzZURDMzIgKHduZFB0ci0+aHduZFNlbGYsIGhkYyk7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworCitzdGF0aWMgTFJFU1VMVAorSEVBREVSX0NyZWF0ZSAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBIRUFERVJfSU5GTyAqaW5mb1B0cjsKKyAgICBURVhUTUVUUklDMzJBIHRtOworICAgIEhGT05UMzIgaE9sZEZvbnQ7CisgICAgSERDMzIgICBoZGM7CisKKyAgICBpbmZvUHRyID0gKEhFQURFUl9JTkZPICopSGVhcEFsbG9jKCBTeXN0ZW1IZWFwLCBIRUFQX1pFUk9fTUVNT1JZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIRUFERVJfSU5GTykpOworICAgIHduZFB0ci0+d0V4dHJhWzBdID0gKERXT1JEKWluZm9QdHI7CisKKyAgICBpbmZvUHRyLT51TnVtSXRlbSA9IDA7CisgICAgaW5mb1B0ci0+bkhlaWdodCA9IDIwOworICAgIGluZm9QdHItPmhGb250ID0gMDsKKyAgICBpbmZvUHRyLT5pdGVtcyA9IDA7CisgICAgaW5mb1B0ci0+aGN1ckFycm93ID0gTG9hZEN1cnNvcjMyQSAoMCwgSURDX0FSUk9XMzJBKTsKKyAgICBpbmZvUHRyLT5oY3VyRGl2aWRlciA9IExvYWRDdXJzb3IzMkEgKDAsIElEQ19TSVpFV0UzMkEpOworICAgIGluZm9QdHItPmhjdXJEaXZvcGVuID0gTG9hZEN1cnNvcjMyQSAoMCwgSURDX1NJWkVOUzMyQSk7CisgICAgaW5mb1B0ci0+YlByZXNzZWQgID0gRkFMU0U7CisgICAgaW5mb1B0ci0+YlRyYWNraW5nID0gRkFMU0U7CisgICAgaW5mb1B0ci0+aU1vdmVJdGVtID0gMDsKKyAgICBpbmZvUHRyLT5oaW1sID0gMDsKKyAgICBpbmZvUHRyLT5pSG90SXRlbSA9IC0xOworCisgICAgaGRjID0gR2V0REMzMiAoMCk7CisgICAgaE9sZEZvbnQgPSBTZWxlY3RPYmplY3QzMiAoaGRjLCBHZXRTdG9ja09iamVjdDMyIChTWVNURU1fRk9OVCkpOworICAgIEdldFRleHRNZXRyaWNzMzJBIChoZGMsICZ0bSk7CisgICAgaW5mb1B0ci0+bkhlaWdodCA9IHRtLnRtSGVpZ2h0ICsgVkVSVF9CT1JERVI7CisgICAgU2VsZWN0T2JqZWN0MzIgKGhkYywgaE9sZEZvbnQpOworICAgIFJlbGVhc2VEQzMyICgwLCBoZGMpOworCisgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIExSRVNVTFQKK0hFQURFUl9EZXN0cm95IChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworICAgIEhFQURFUl9JTkZPICppbmZvUHRyID0gSEVBREVSX0dldEluZm9QdHIod25kUHRyKTsKKyAgICBJTlQzMiBpSXRlbTsKKworICAgIGlmIChpbmZvUHRyLT5pdGVtcykgeworICAgICAgICBmb3IgKGlJdGVtID0gMDsgaUl0ZW0gPCBpbmZvUHRyLT51TnVtSXRlbTsgaUl0ZW0rKykgeworICAgICAgICAgICAgaWYgKGluZm9QdHItPml0ZW1zW2lJdGVtXS5wc3pUZXh0KQorICAgICAgICAgICAgICAgIEhlYXBGcmVlIChTeXN0ZW1IZWFwLCAwLCBpbmZvUHRyLT5pdGVtc1tpSXRlbV0ucHN6VGV4dCk7CisgICAgICAgIH0KKyAgICAgICAgSGVhcEZyZWUgKFN5c3RlbUhlYXAsIDAsIGluZm9QdHItPml0ZW1zKTsKKyAgICB9CisKKyAgICBpZiAoaW5mb1B0ci0+aGltbCkKKwlJbWFnZUxpc3RfRGVzdHJveSAoaW5mb1B0ci0+aGltbCk7CisKKyAgICBIZWFwRnJlZSAoU3lzdGVtSGVhcCwgMCwgaW5mb1B0cik7CisKKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgTFJFU1VMVAorSEVBREVSX0dldEZvbnQgKFdORCAqd25kUHRyKQoreworICAgIEhFQURFUl9JTkZPICppbmZvUHRyID0gSEVBREVSX0dldEluZm9QdHIod25kUHRyKTsKKworICAgIHJldHVybiAoTFJFU1VMVClpbmZvUHRyLT5oRm9udDsKK30KKworCitzdGF0aWMgTFJFU1VMVAorSEVBREVSX0xCdXR0b25EYmxDbGsgKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCit7CisgICAgUE9JTlQzMiBwdDsKKyAgICBVSU5UMzIgIGZsYWdzOworICAgIElOVDMyICAgaUl0ZW07CisKKyAgICBwdC54ID0gKElOVDMyKUxPV09SRChsUGFyYW0pOyAKKyAgICBwdC55ID0gKElOVDMyKUhJV09SRChsUGFyYW0pOworICAgIEhFQURFUl9JbnRlcm5hbEhpdFRlc3QgKHduZFB0ciwgJnB0LCAmZmxhZ3MsICZpSXRlbSk7CisKKyAgICBpZiAoKHduZFB0ci0+ZHdTdHlsZSAmIEhEU19CVVRUT05TKSAmJiAoZmxhZ3MgPT0gSEhUX09OSEVBREVSKSkKKwlIRUFERVJfU2VuZEhlYWRlck5vdGlmeSAod25kUHRyLCBIRE5fSVRFTURCTENMSUNLMzJBLCBpSXRlbSk7CisgICAgZWxzZSBpZiAoKGZsYWdzID09IEhIVF9PTkRJVklERVIpIHx8IChmbGFncyA9PSBISFRfT05ESVZPUEVOKSkKKwlIRUFERVJfU2VuZEhlYWRlck5vdGlmeSAod25kUHRyLCBIRE5fRElWSURFUkRCTENMSUNLMzJBLCBpSXRlbSk7CisKKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgTFJFU1VMVAorSEVBREVSX0xCdXR0b25Eb3duIChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworICAgIEhFQURFUl9JTkZPICppbmZvUHRyID0gSEVBREVSX0dldEluZm9QdHIod25kUHRyKTsKKyAgICBQT0lOVDMyIHB0OworICAgIFVJTlQzMiAgZmxhZ3M7CisgICAgSU5UMzIgICBpSXRlbTsKKyAgICBIREMzMiAgIGhkYzsKKworICAgIHB0LnggPSAoSU5UMzIpTE9XT1JEKGxQYXJhbSk7IAorICAgIHB0LnkgPSAoSU5UMzIpSElXT1JEKGxQYXJhbSk7CisgICAgSEVBREVSX0ludGVybmFsSGl0VGVzdCAod25kUHRyLCAmcHQsICZmbGFncywgJmlJdGVtKTsKKworICAgIGlmICgod25kUHRyLT5kd1N0eWxlICYgSERTX0JVVFRPTlMpICYmIChmbGFncyA9PSBISFRfT05IRUFERVIpKSB7CisJU2V0Q2FwdHVyZTMyICh3bmRQdHItPmh3bmRTZWxmKTsKKwlpbmZvUHRyLT5iQ2FwdHVyZWQgPSBUUlVFOyAgIAorCWluZm9QdHItPmJQcmVzc2VkICA9IFRSVUU7CisJaW5mb1B0ci0+aU1vdmVJdGVtID0gaUl0ZW07CisKKwlpbmZvUHRyLT5pdGVtc1tpSXRlbV0uYkRvd24gPSBUUlVFOworCisJLyogU2VuZCBXTV9DVVNUT01EUkFXICovCisJaGRjID0gR2V0REMzMiAod25kUHRyLT5od25kU2VsZik7CisJSEVBREVSX1JlZnJlc2hJdGVtICh3bmRQdHIsIGhkYywgJmluZm9QdHItPml0ZW1zW2lJdGVtXSk7CisJUmVsZWFzZURDMzIgKHduZFB0ci0+aHduZFNlbGYsIGhkYyk7CisKKwlUUkFDRSAoaGVhZGVyLCAiUHJlc3NlZCBpdGVtICVkIVxuIiwgaUl0ZW0pOworICAgIH0gCisgICAgZWxzZSBpZiAoKGZsYWdzID09IEhIVF9PTkRJVklERVIpIHx8IChmbGFncyA9PSBISFRfT05ESVZPUEVOKSkgeworCWlmICghKEhFQURFUl9TZW5kSGVhZGVyTm90aWZ5ICh3bmRQdHIsIEhETl9CRUdJTlRSQUNLMzJBLCBpSXRlbSkpKSB7CisJICAgIFNldENhcHR1cmUzMiAod25kUHRyLT5od25kU2VsZik7CisJICAgIGluZm9QdHItPmJDYXB0dXJlZCA9IFRSVUU7ICAgCisJICAgIGluZm9QdHItPmJUcmFja2luZyA9IFRSVUU7CisJICAgIGluZm9QdHItPmlNb3ZlSXRlbSA9IGlJdGVtOworCSAgICBpbmZvUHRyLT5uT2xkV2lkdGggPSBpbmZvUHRyLT5pdGVtc1tpSXRlbV0uY3h5OworCSAgICBpbmZvUHRyLT54VHJhY2tPZmZzZXQgPSBpbmZvUHRyLT5pdGVtc1tpSXRlbV0ucmVjdC5yaWdodCAtIHB0Lng7CisKKwkgICAgaWYgKCEod25kUHRyLT5kd1N0eWxlICYgSERTX0ZVTExEUkFHKSkgeworCQlpbmZvUHRyLT54T2xkVHJhY2sgPSBpbmZvUHRyLT5pdGVtc1tpSXRlbV0ucmVjdC5yaWdodDsKKwkJaGRjID0gR2V0REMzMiAod25kUHRyLT5od25kU2VsZik7CisJCUhFQURFUl9EcmF3VHJhY2tMaW5lICh3bmRQdHIsIGhkYywgaW5mb1B0ci0+eE9sZFRyYWNrKTsKKwkJUmVsZWFzZURDMzIgKHduZFB0ci0+aHduZFNlbGYsIGhkYyk7CisJICAgIH0KKworCSAgICBUUkFDRSAoaGVhZGVyLCAiQmVnaW4gdHJhY2tpbmcgaXRlbSAlZCFcbiIsIGlJdGVtKTsKKwl9CisgICAgfQorCisKKworICAgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBMUkVTVUxUCitIRUFERVJfTEJ1dHRvblVwIChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworICAgIEhFQURFUl9JTkZPICppbmZvUHRyID0gSEVBREVSX0dldEluZm9QdHIod25kUHRyKTsKKyAgICBQT0lOVDMyIHB0OworICAgIFVJTlQzMiAgZmxhZ3M7CisgICAgSU5UMzIgICBpSXRlbSwgbldpZHRoOworICAgIEhEQzMyICAgaGRjOworCisgICAgcHQueCA9IChJTlQzMilMT1dPUkQobFBhcmFtKTsKKyAgICBwdC55ID0gKElOVDMyKUhJV09SRChsUGFyYW0pOworICAgIEhFQURFUl9JbnRlcm5hbEhpdFRlc3QgKHduZFB0ciwgJnB0LCAmZmxhZ3MsICZpSXRlbSk7CisKKyAgICBpZiAoaW5mb1B0ci0+YlByZXNzZWQpIHsKKwlpZiAoKGlJdGVtID09IGluZm9QdHItPmlNb3ZlSXRlbSkgJiYgKGZsYWdzID09IEhIVF9PTkhFQURFUikpIHsKKwkgICAgaW5mb1B0ci0+aXRlbXNbaW5mb1B0ci0+aU1vdmVJdGVtXS5iRG93biA9IEZBTFNFOworCSAgICBoZGMgPSBHZXREQzMyICh3bmRQdHItPmh3bmRTZWxmKTsKKwkgICAgSEVBREVSX1JlZnJlc2hJdGVtICh3bmRQdHIsIGhkYywgJmluZm9QdHItPml0ZW1zW2luZm9QdHItPmlNb3ZlSXRlbV0pOworCSAgICBSZWxlYXNlREMzMiAod25kUHRyLT5od25kU2VsZiwgaGRjKTsKKworCSAgICBIRUFERVJfU2VuZENsaWNrTm90aWZ5ICh3bmRQdHIsIEhETl9JVEVNQ0xJQ0szMkEsIGluZm9QdHItPmlNb3ZlSXRlbSk7CisJfQorCVRSQUNFIChoZWFkZXIsICJSZWxlYXNlZCBpdGVtICVkIVxuIiwgaW5mb1B0ci0+aU1vdmVJdGVtKTsKKwlpbmZvUHRyLT5iUHJlc3NlZCA9IEZBTFNFOworICAgIH0KKyAgICBlbHNlIGlmIChpbmZvUHRyLT5iVHJhY2tpbmcpIHsKKwlUUkFDRSAoaGVhZGVyLCAiRW5kIHRyYWNraW5nIGl0ZW0gJWQhXG4iLCBpbmZvUHRyLT5pTW92ZUl0ZW0pOworCWluZm9QdHItPmJUcmFja2luZyA9IEZBTFNFOworCisJSEVBREVSX1NlbmRIZWFkZXJOb3RpZnkgKHduZFB0ciwgSEROX0VORFRSQUNLMzJBLCBpbmZvUHRyLT5pTW92ZUl0ZW0pOworCisJaWYgKCEod25kUHRyLT5kd1N0eWxlICYgSERTX0ZVTExEUkFHKSkgeworCSAgICBoZGMgPSBHZXREQzMyICh3bmRQdHItPmh3bmRTZWxmKTsKKwkgICAgSEVBREVSX0RyYXdUcmFja0xpbmUgKHduZFB0ciwgaGRjLCBpbmZvUHRyLT54T2xkVHJhY2spOworCSAgICBSZWxlYXNlREMzMiAod25kUHRyLT5od25kU2VsZiwgaGRjKTsKKwkgICAgaWYgKEhFQURFUl9TZW5kSGVhZGVyTm90aWZ5ICh3bmRQdHIsIEhETl9JVEVNQ0hBTkdJTkczMkEsIGluZm9QdHItPmlNb3ZlSXRlbSkpCisJCWluZm9QdHItPml0ZW1zW2luZm9QdHItPmlNb3ZlSXRlbV0uY3h5ID0gaW5mb1B0ci0+bk9sZFdpZHRoOworCSAgICBlbHNlIHsKKwkJbldpZHRoID0gcHQueCAtIGluZm9QdHItPml0ZW1zW2luZm9QdHItPmlNb3ZlSXRlbV0ucmVjdC5sZWZ0ICsKKwkJaW5mb1B0ci0+eFRyYWNrT2Zmc2V0OworCQlpZiAobldpZHRoIDwgMCkKKwkJICAgIG5XaWR0aCA9IDA7CisJCWluZm9QdHItPml0ZW1zW2luZm9QdHItPmlNb3ZlSXRlbV0uY3h5ID0gbldpZHRoOworCQlIRUFERVJfU2VuZEhlYWRlck5vdGlmeSAod25kUHRyLCBIRE5fSVRFTUNIQU5HRUQzMkEsIGluZm9QdHItPmlNb3ZlSXRlbSk7CisJICAgIH0KKworCSAgICBIRUFERVJfU2V0SXRlbUJvdW5kcyAod25kUHRyKTsKKwkgICAgaGRjID0gR2V0REMzMiAod25kUHRyLT5od25kU2VsZik7CisJICAgIEhFQURFUl9SZWZyZXNoICh3bmRQdHIsIGhkYyk7CisJICAgIFJlbGVhc2VEQzMyICh3bmRQdHItPmh3bmRTZWxmLCBoZGMpOworCX0KKyAgICB9CisKKyAgICBpZiAoaW5mb1B0ci0+YkNhcHR1cmVkKSB7CisJaW5mb1B0ci0+YkNhcHR1cmVkID0gRkFMU0U7CisJUmVsZWFzZUNhcHR1cmUgKCk7CisJSEVBREVSX1NlbmRTaW1wbGVOb3RpZnkgKHduZFB0ciwgTk1fUkVMRUFTRURDQVBUVVJFKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgTFJFU1VMVAorSEVBREVSX01vdXNlTW92ZSAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBIRUFERVJfSU5GTyAqaW5mb1B0ciA9IEhFQURFUl9HZXRJbmZvUHRyKHduZFB0cik7CisgICAgUE9JTlQzMiBwdDsKKyAgICBVSU5UMzIgIGZsYWdzOworICAgIElOVDMyICAgaUl0ZW0sIG5XaWR0aDsKKyAgICBIREMzMiAgIGhkYzsKKworICAgIHB0LnggPSAoSU5UMzIpTE9XT1JEKGxQYXJhbSk7CisgICAgcHQueSA9IChJTlQzMilISVdPUkQobFBhcmFtKTsKKyAgICBIRUFERVJfSW50ZXJuYWxIaXRUZXN0ICh3bmRQdHIsICZwdCwgJmZsYWdzLCAmaUl0ZW0pOworCisgICAgaWYgKCh3bmRQdHItPmR3U3R5bGUgJiBIRFNfQlVUVE9OUykgJiYgKHduZFB0ci0+ZHdTdHlsZSAmIEhEU19IT1RUUkFDSykpIHsKKwlpZiAoZmxhZ3MgJiAoSEhUX09OSEVBREVSIHwgSEhUX09ORElWSURFUiB8IEhIVF9PTkRJVk9QRU4pKQorCSAgICBpbmZvUHRyLT5pSG90SXRlbSA9IGlJdGVtOworCWVsc2UKKwkgICAgaW5mb1B0ci0+aUhvdEl0ZW0gPSAtMTsKKwloZGMgPSBHZXREQzMyICh3bmRQdHItPmh3bmRTZWxmKTsKKwlIRUFERVJfUmVmcmVzaCAod25kUHRyLCBoZGMpOworCVJlbGVhc2VEQzMyICh3bmRQdHItPmh3bmRTZWxmLCBoZGMpOworICAgIH0KKworICAgIGlmIChpbmZvUHRyLT5iQ2FwdHVyZWQpIHsKKwlpZiAoaW5mb1B0ci0+YlByZXNzZWQpIHsKKwkgICAgaWYgKChpSXRlbSA9PSBpbmZvUHRyLT5pTW92ZUl0ZW0pICYmIChmbGFncyA9PSBISFRfT05IRUFERVIpKQorCQlpbmZvUHRyLT5pdGVtc1tpbmZvUHRyLT5pTW92ZUl0ZW1dLmJEb3duID0gVFJVRTsKKwkgICAgZWxzZQorCQlpbmZvUHRyLT5pdGVtc1tpbmZvUHRyLT5pTW92ZUl0ZW1dLmJEb3duID0gRkFMU0U7CisJICAgIGhkYyA9IEdldERDMzIgKHduZFB0ci0+aHduZFNlbGYpOworCSAgICBIRUFERVJfUmVmcmVzaEl0ZW0gKHduZFB0ciwgaGRjLCAmaW5mb1B0ci0+aXRlbXNbaW5mb1B0ci0+aU1vdmVJdGVtXSk7CisJICAgIFJlbGVhc2VEQzMyICh3bmRQdHItPmh3bmRTZWxmLCBoZGMpOworCisJICAgIFRSQUNFIChoZWFkZXIsICJNb3ZpbmcgcHJlc3NlZCBpdGVtICVkIVxuIiwgaW5mb1B0ci0+aU1vdmVJdGVtKTsKKwl9CisJZWxzZSBpZiAoaW5mb1B0ci0+YlRyYWNraW5nKSB7CisJICAgIGlmICh3bmRQdHItPmR3U3R5bGUgJiBIRFNfRlVMTERSQUcpIHsKKwkJaWYgKEhFQURFUl9TZW5kSGVhZGVyTm90aWZ5ICh3bmRQdHIsIEhETl9JVEVNQ0hBTkdJTkczMkEsIGluZm9QdHItPmlNb3ZlSXRlbSkpCisJCSAgICBpbmZvUHRyLT5pdGVtc1tpbmZvUHRyLT5pTW92ZUl0ZW1dLmN4eSA9IGluZm9QdHItPm5PbGRXaWR0aDsKKwkJZWxzZSB7CisJCSAgICBuV2lkdGggPSBwdC54IC0gaW5mb1B0ci0+aXRlbXNbaW5mb1B0ci0+aU1vdmVJdGVtXS5yZWN0LmxlZnQgKworCQkgICAgaW5mb1B0ci0+eFRyYWNrT2Zmc2V0OworCQkgICAgaWYgKG5XaWR0aCA8IDApCisJCQluV2lkdGggPSAwOworCQkgICAgaW5mb1B0ci0+aXRlbXNbaW5mb1B0ci0+aU1vdmVJdGVtXS5jeHkgPSBuV2lkdGg7CisJCSAgICBIRUFERVJfU2VuZEhlYWRlck5vdGlmeSAod25kUHRyLCBIRE5fSVRFTUNIQU5HRUQzMkEsCisJCQkJCSAgICAgaW5mb1B0ci0+aU1vdmVJdGVtKTsKKwkJfQorCQlIRUFERVJfU2V0SXRlbUJvdW5kcyAod25kUHRyKTsKKwkJaGRjID0gR2V0REMzMiAod25kUHRyLT5od25kU2VsZik7CisJCUhFQURFUl9SZWZyZXNoICh3bmRQdHIsIGhkYyk7CisJCVJlbGVhc2VEQzMyICh3bmRQdHItPmh3bmRTZWxmLCBoZGMpOworCSAgICB9CisJICAgIGVsc2UgeworCQloZGMgPSBHZXREQzMyICh3bmRQdHItPmh3bmRTZWxmKTsKKwkJSEVBREVSX0RyYXdUcmFja0xpbmUgKHduZFB0ciwgaGRjLCBpbmZvUHRyLT54T2xkVHJhY2spOworCQlpbmZvUHRyLT54T2xkVHJhY2sgPSBwdC54ICsgaW5mb1B0ci0+eFRyYWNrT2Zmc2V0OworCQlpZiAoaW5mb1B0ci0+eE9sZFRyYWNrIDwgaW5mb1B0ci0+aXRlbXNbaW5mb1B0ci0+aU1vdmVJdGVtXS5yZWN0LmxlZnQpCisJCSAgICBpbmZvUHRyLT54T2xkVHJhY2sgPSBpbmZvUHRyLT5pdGVtc1tpbmZvUHRyLT5pTW92ZUl0ZW1dLnJlY3QubGVmdDsKKwkJaW5mb1B0ci0+aXRlbXNbaW5mb1B0ci0+aU1vdmVJdGVtXS5jeHkgPSAKKwkJICAgIGluZm9QdHItPnhPbGRUcmFjayAtIGluZm9QdHItPml0ZW1zW2luZm9QdHItPmlNb3ZlSXRlbV0ucmVjdC5sZWZ0OworCQlIRUFERVJfRHJhd1RyYWNrTGluZSAod25kUHRyLCBoZGMsIGluZm9QdHItPnhPbGRUcmFjayk7CisJCVJlbGVhc2VEQzMyICh3bmRQdHItPmh3bmRTZWxmLCBoZGMpOworCSAgICB9CisKKwkgICAgSEVBREVSX1NlbmRIZWFkZXJOb3RpZnkgKHduZFB0ciwgSEROX1RSQUNLMzJBLCBpbmZvUHRyLT5pTW92ZUl0ZW0pOworCSAgICBUUkFDRSAoaGVhZGVyLCAiVHJhY2tpbmcgaXRlbSAlZCFcbiIsIGluZm9QdHItPmlNb3ZlSXRlbSk7CisJfQorICAgIH0KKworICAgIGlmICgod25kUHRyLT5kd1N0eWxlICYgSERTX0JVVFRPTlMpICYmICh3bmRQdHItPmR3U3R5bGUgJiBIRFNfSE9UVFJBQ0spKSB7CisKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgTFJFU1VMVAorSEVBREVSX1BhaW50IChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtKQoreworICAgIEhEQzMyIGhkYzsKKyAgICBQQUlOVFNUUlVDVDMyIHBzOworCisgICAgaGRjID0gd1BhcmFtPT0wID8gQmVnaW5QYWludDMyICh3bmRQdHItPmh3bmRTZWxmLCAmcHMpIDogKEhEQzMyKXdQYXJhbTsKKyAgICBIRUFERVJfUmVmcmVzaCAod25kUHRyLCBoZGMpOworICAgIGlmKCF3UGFyYW0pCisJRW5kUGFpbnQzMiAod25kUHRyLT5od25kU2VsZiwgJnBzKTsKKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgTFJFU1VMVAorSEVBREVSX1JCdXR0b25VcCAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICByZXR1cm4gSEVBREVSX1NlbmRTaW1wbGVOb3RpZnkgKHduZFB0ciwgTk1fUkNMSUNLKTsKK30KKworCitzdGF0aWMgTFJFU1VMVAorSEVBREVSX1NldEN1cnNvciAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBIRUFERVJfSU5GTyAqaW5mb1B0ciA9IEhFQURFUl9HZXRJbmZvUHRyKHduZFB0cik7CisgICAgUE9JTlQzMiBwdDsKKyAgICBVSU5UMzIgIGZsYWdzOworICAgIElOVDMyICAgaUl0ZW07CisKKyAgICBUUkFDRSAoaGVhZGVyLCAiY29kZT0weCVYICBpZD0weCVYXG4iLCBMT1dPUkQobFBhcmFtKSwgSElXT1JEKGxQYXJhbSkpOworCisgICAgR2V0Q3Vyc29yUG9zMzIgKCZwdCk7CisgICAgU2NyZWVuVG9DbGllbnQzMiAod25kUHRyLT5od25kU2VsZiwgJnB0KTsKKworICAgIEhFQURFUl9JbnRlcm5hbEhpdFRlc3QgKHduZFB0ciwgJnB0LCAmZmxhZ3MsICZpSXRlbSk7CisKKyAgICBpZiAoZmxhZ3MgPT0gSEhUX09ORElWSURFUikKKyAgICAgICAgU2V0Q3Vyc29yMzIgKGluZm9QdHItPmhjdXJEaXZpZGVyKTsKKyAgICBlbHNlIGlmIChmbGFncyA9PSBISFRfT05ESVZPUEVOKQorICAgICAgICBTZXRDdXJzb3IzMiAoaW5mb1B0ci0+aGN1ckRpdm9wZW4pOworICAgIGVsc2UKKyAgICAgICAgU2V0Q3Vyc29yMzIgKGluZm9QdHItPmhjdXJBcnJvdyk7CisKKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgTFJFU1VMVAorSEVBREVSX1NldEZvbnQgKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCit7CisgICAgSEVBREVSX0lORk8gKmluZm9QdHIgPSBIRUFERVJfR2V0SW5mb1B0cih3bmRQdHIpOworICAgIFRFWFRNRVRSSUMzMkEgdG07CisgICAgSEZPTlQzMiBoRm9udCwgaE9sZEZvbnQ7CisgICAgSERDMzIgaGRjOworCisgICAgaW5mb1B0ci0+aEZvbnQgPSAoSEZPTlQzMil3UGFyYW07CisKKyAgICBoRm9udCA9IGluZm9QdHItPmhGb250ID8gaW5mb1B0ci0+aEZvbnQgOiBHZXRTdG9ja09iamVjdDMyIChTWVNURU1fRk9OVCk7CisKKyAgICBoZGMgPSBHZXREQzMyICgwKTsKKyAgICBoT2xkRm9udCA9IFNlbGVjdE9iamVjdDMyIChoZGMsIGhGb250KTsKKyAgICBHZXRUZXh0TWV0cmljczMyQSAoaGRjLCAmdG0pOworICAgIGluZm9QdHItPm5IZWlnaHQgPSB0bS50bUhlaWdodCArIFZFUlRfQk9SREVSOworICAgIFNlbGVjdE9iamVjdDMyIChoZGMsIGhPbGRGb250KTsKKyAgICBSZWxlYXNlREMzMiAoMCwgaGRjKTsKKworICAgIGlmIChsUGFyYW0pIHsKKyAgICAgICAgSEVBREVSX0ZvcmNlSXRlbUJvdW5kcyAod25kUHRyLCBpbmZvUHRyLT5uSGVpZ2h0KTsKKyAgICAgICAgaGRjID0gR2V0REMzMiAod25kUHRyLT5od25kU2VsZik7CisgICAgICAgIEhFQURFUl9SZWZyZXNoICh3bmRQdHIsIGhkYyk7CisgICAgICAgIFJlbGVhc2VEQzMyICh3bmRQdHItPmh3bmRTZWxmLCBoZGMpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisKK0xSRVNVTFQgV0lOQVBJCitIZWFkZXJXaW5kb3dQcm9jIChIV05EMzIgaHduZCwgVUlOVDMyIG1zZywgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworICAgIFdORCAqd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoaHduZCk7CisKKyAgICBzd2l0Y2ggKG1zZykgeworCWNhc2UgSERNX0NSRUFURURSQUdJTUFHRToKKwkgICAgcmV0dXJuIEhFQURFUl9DcmVhdGVEcmFnSW1hZ2UgKHduZFB0ciwgd1BhcmFtKTsKKworCWNhc2UgSERNX0RFTEVURUlURU06CisJICAgIHJldHVybiBIRUFERVJfRGVsZXRlSXRlbSAod25kUHRyLCB3UGFyYW0pOworCisJY2FzZSBIRE1fR0VUSU1BR0VMSVNUOgorCSAgICByZXR1cm4gSEVBREVSX0dldEltYWdlTGlzdCAod25kUHRyKTsKKworCWNhc2UgSERNX0dFVElURU0zMkE6CisJICAgIHJldHVybiBIRUFERVJfR2V0SXRlbTMyQSAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisKKwljYXNlIEhETV9HRVRJVEVNQ09VTlQ6CisJICAgIHJldHVybiBIRUFERVJfR2V0SXRlbUNvdW50ICh3bmRQdHIpOworCisJY2FzZSBIRE1fR0VUSVRFTVJFQ1Q6CisJICAgIHJldHVybiBIRUFERVJfR2V0SXRlbVJlY3QgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCisJY2FzZSBIRE1fSElUVEVTVDoKKwkgICAgcmV0dXJuIEhFQURFUl9IaXRUZXN0ICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKworCWNhc2UgSERNX0lOU0VSVElURU0zMkE6CisJICAgIHJldHVybiBIRUFERVJfSW5zZXJ0SXRlbTMyQSAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisKKwljYXNlIEhETV9MQVlPVVQ6CisJICAgIHJldHVybiBIRUFERVJfTGF5b3V0ICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKworCWNhc2UgSERNX1NFVElNQUdFTElTVDoKKwkgICAgcmV0dXJuIEhFQURFUl9TZXRJbWFnZUxpc3QgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCisJY2FzZSBIRE1fU0VUSVRFTTMyQToKKwkgICAgcmV0dXJuIEhFQURFUl9TZXRJdGVtMzJBICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKworCisgICAgICAgIGNhc2UgV01fQ1JFQVRFOgorICAgICAgICAgICAgcmV0dXJuIEhFQURFUl9DcmVhdGUgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCisgICAgICAgIGNhc2UgV01fREVTVFJPWToKKyAgICAgICAgICAgIHJldHVybiBIRUFERVJfRGVzdHJveSAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisKKyAgICAgICAgY2FzZSBXTV9FUkFTRUJLR05EOgorICAgICAgICAgICAgcmV0dXJuIDE7CisKKyAgICAgICAgY2FzZSBXTV9HRVRETEdDT0RFOgorICAgICAgICAgICAgcmV0dXJuIERMR0NfV0FOVFRBQiB8IERMR0NfV0FOVEFSUk9XUzsKKworICAgICAgICBjYXNlIFdNX0dFVEZPTlQ6CisgICAgICAgICAgICByZXR1cm4gSEVBREVSX0dldEZvbnQgKHduZFB0cik7CisKKyAgICAgICAgY2FzZSBXTV9MQlVUVE9OREJMQ0xLOgorICAgICAgICAgICAgcmV0dXJuIEhFQURFUl9MQnV0dG9uRGJsQ2xrICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKworICAgICAgICBjYXNlIFdNX0xCVVRUT05ET1dOOgorICAgICAgICAgICAgcmV0dXJuIEhFQURFUl9MQnV0dG9uRG93biAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisKKyAgICAgICAgY2FzZSBXTV9MQlVUVE9OVVA6CisgICAgICAgICAgICByZXR1cm4gSEVBREVSX0xCdXR0b25VcCAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisKKyAgICAgICAgY2FzZSBXTV9NT1VTRU1PVkU6CisgICAgICAgICAgICByZXR1cm4gSEVBREVSX01vdXNlTW92ZSAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisKKyAgICAgICAgY2FzZSBXTV9QQUlOVDoKKyAgICAgICAgICAgIHJldHVybiBIRUFERVJfUGFpbnQgKHduZFB0ciwgd1BhcmFtKTsKKworICAgICAgICBjYXNlIFdNX1JCVVRUT05VUDoKKyAgICAgICAgICAgIHJldHVybiBIRUFERVJfUkJ1dHRvblVwICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKworICAgICAgICBjYXNlIFdNX1NFVENVUlNPUjoKKyAgICAgICAgICAgIHJldHVybiBIRUFERVJfU2V0Q3Vyc29yICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKworICAgICAgICBjYXNlIFdNX1NFVEZPTlQ6CisgICAgICAgICAgICByZXR1cm4gSEVBREVSX1NldEZvbnQgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBpZiAobXNnID49IFdNX1VTRVIpIAorCQlFUlIgKGhlYWRlciwgInVua25vd24gbXNnICUwNHggd3A9JTA0eCBscD0lMDhseFxuIiwKKwkJICAgICBtc2csIHdQYXJhbSwgbFBhcmFtICk7CisJICAgIHJldHVybiBEZWZXaW5kb3dQcm9jMzJBIChod25kLCBtc2csIHdQYXJhbSwgbFBhcmFtKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKwordm9pZCBIRUFERVJfUmVnaXN0ZXIoIHZvaWQgKQoreworICAgIFdORENMQVNTMzJBIHduZENsYXNzOworCisgICAgaWYgKEdsb2JhbEZpbmRBdG9tMzJBIChXQ19IRUFERVIzMkEpKSByZXR1cm47CisKKyAgICBaZXJvTWVtb3J5ICgmd25kQ2xhc3MsIHNpemVvZihXTkRDTEFTUzMyQSkpOworICAgIHduZENsYXNzLnN0eWxlICAgICAgICAgPSBDU19HTE9CQUxDTEFTUyB8IENTX0RCTENMS1M7CisgICAgd25kQ2xhc3MubHBmblduZFByb2MgICA9IChXTkRQUk9DMzIpSGVhZGVyV2luZG93UHJvYzsKKyAgICB3bmRDbGFzcy5jYkNsc0V4dHJhICAgID0gMDsKKyAgICB3bmRDbGFzcy5jYlduZEV4dHJhICAgID0gc2l6ZW9mKEhFQURFUl9JTkZPICopOworICAgIHduZENsYXNzLmhDdXJzb3IgICAgICAgPSBMb2FkQ3Vyc29yMzJBICgwLCBJRENfQVJST1czMkEpOworICAgIHduZENsYXNzLmxwc3pDbGFzc05hbWUgPSBXQ19IRUFERVIzMkE7CisgCisgICAgUmVnaXN0ZXJDbGFzczMyQSAoJnduZENsYXNzKTsKK30KKwpkaWZmIC0tZ2l0IGEvY29udHJvbHMvbGlzdGJveC5jIGIvY29udHJvbHMvbGlzdGJveC5jCmluZGV4IDU4YjY1MGUuLmU2MzAxYTcgMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL2xpc3Rib3guYworKysgYi9jb250cm9scy9saXN0Ym94LmMKQEAgLTE3MSw2ICsxNzEsMTUgQEAKIHsKICAgICBTQ1JPTExJTkZPIGluZm87CiAKKyAgICBpZiAoIShkZXNjci0+c3R5bGUgJiBXU19WU0NST0xMKSkgcmV0dXJuOyAKKyAgICAvKiAgIEl0IGlzIGltcG9ydGFudCB0aGF0IHdlIGNoZWNrIGRlc2NyLT5zdHlsZSwgYW5kIG5vdCB3bmQtPmR3U3R5bGUsIAorICAgICAgIGZvciBXU19WU0NST0xMLCBhcyB0aGUgZm9ybWVyIGlzIGV4YWN0bHkgdGhlIG9uZSBwYXNzZWQgaW4gCisgICAgICAgYXJndW1lbnQgdG8gQ3JlYXRlV2luZG93LiAgCisgICAgICAgICBJbiBXaW5kb3dzIChhbmQgZnJvbSBub3cgb24gaW4gV2luZSA6KSBhIGxpc3Rib3ggY3JlYXRlZCAKKyAgICAgICB3aXRoIHN1Y2ggYSBzdHlsZSAobm8gV1NfU0NST0xMKSBkb2VzIG5vdCB1cGRhdGUgCisgICAgICAgdGhlIHNjcm9sbGJhciB3aXRoIGxpc3Rib3gtcmVsYXRlZCBkYXRhLCB0aHVzIGxldHRpbmcgCisgICAgICAgdGhlIHByb2dyYW1tZXIgdXNlIGl0IGZvciBoaXMvaGVyIG93biBwdXJwb3Nlcy4gKi8KKwogICAgIGlmIChkZXNjci0+c3R5bGUgJiBMQlNfTk9SRURSQVcpIHJldHVybjsKICAgICBpbmZvLmNiU2l6ZSA9IHNpemVvZihpbmZvKTsKIApAQCAtMTA4OSw4ICsxMDk4LDggQEAKICAgICBpZiAob2xkRm9udCkgU2VsZWN0T2JqZWN0MzIoIGhkYywgb2xkRm9udCApOwogICAgIFJlbGVhc2VEQzMyKCB3bmQtPmh3bmRTZWxmLCBoZGMgKTsKICAgICBpZiAoIUlTX09XTkVSRFJBVyhkZXNjcikpCi0gICAgICAgIExJU1RCT1hfU2V0SXRlbUhlaWdodCggd25kLCBkZXNjciwgMCwgdG0udG1IZWlnaHQgKyAyICk7Ci0gICAgcmV0dXJuIHRtLnRtSGVpZ2h0ICsgMjsKKyAgICAgICAgTElTVEJPWF9TZXRJdGVtSGVpZ2h0KCB3bmQsIGRlc2NyLCAwLCB0bS50bUhlaWdodCApOworICAgIHJldHVybiB0bS50bUhlaWdodCA7CiB9CiAKIApkaWZmIC0tZ2l0IGEvY29udHJvbHMvbWVudS5jIGIvY29udHJvbHMvbWVudS5jCmluZGV4IDNjZmU1MWYuLjc4YWFmMGEgMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL21lbnUuYworKysgYi9jb250cm9scy9tZW51LmMKQEAgLTg1NSwxMCArODU1LDEwIEBACiAgICAgICAgIGRpcy5oREMgICAgICAgID0gaGRjOwogICAgICAgICBkaXMucmNJdGVtICAgICA9IGxwaXRlbS0+cmVjdDsKICAgICAgICAgVFJBQ0UobWVudSwgIk93bmVyZHJhdzogaXRlbUlEPSVkLCBpdGVtU3RhdGU9JWQsIGl0ZW1BY3Rpb249JWQsICIKLQkgICAgICAiaHduZEl0ZW09JTA0eCwgaGRjPSUwNHgsIHJjSXRlbT17JWQsJWQsJWQsJWR9LCByY0l0ZW09JXBcbiIsZGlzLml0ZW1JRCwKKwkgICAgICAiaHduZEl0ZW09JTA0eCwgaGRjPSUwNHgsIHJjSXRlbT17JWQsJWQsJWQsJWR9XG4iLGRpcy5pdGVtSUQsCiAJICAgICAgZGlzLml0ZW1TdGF0ZSwgZGlzLml0ZW1BY3Rpb24sIGRpcy5od25kSXRlbSwgZGlzLmhEQywKIAkgICAgICBkaXMucmNJdGVtLmxlZnQsIGRpcy5yY0l0ZW0udG9wLCBkaXMucmNJdGVtLnJpZ2h0LAotCSAgICAgIGRpcy5yY0l0ZW0uYm90dG9tLCBkaXMucmNJdGVtICk7CisJICAgICAgZGlzLnJjSXRlbS5ib3R0b20gKTsKICAgICAgICAgU2VuZE1lc3NhZ2UzMkEoIEdldFdpbmRvdzMyKGh3bmQsR1dfT1dORVIpLCBXTV9EUkFXSVRFTSwgMCwgKExQQVJBTSkmZGlzICk7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC0yNzk5LDcgKzI3OTksNyBAQAogCiAgICAgd2hpbGUoIChpdGVtID0gTUVOVV9GaW5kSXRlbSggJmhNZW51LCAmd0l0ZW1JRCwgd0ZsYWdzICkpICkKICAgICB7Ci0gICAgICBpZiggIShpdGVtLT5mVHlwZSAmIE1GX1BPUFVQKSApCisgICAgICBpZiggKHdGbGFncyAmIE1GX0JZUE9TSVRJT04pIHx8ICEoaXRlbS0+ZlR5cGUgJiBNRl9QT1BVUCkgKQogICAgICAgewogICAgICAgICAgICAvKiBXZSBjYW4ndCBoYXZlIE1GX0dSQVlFRCBhbmQgTUZfRElTQUJMRUQgdG9nZXRoZXIgKi8KICAgICAgICAgICAgaWYgKHdGbGFncyAmIE1GX0dSQVlFRCkKZGlmZiAtLWdpdCBhL2NvbnRyb2xzL3Byb2dyZXNzLmMgYi9jb250cm9scy9wcm9ncmVzcy5jCmluZGV4IDgwYTJmYzQuLjc5MzdkMmIgMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL3Byb2dyZXNzLmMKKysrIGIvY29udHJvbHMvcHJvZ3Jlc3MuYwpAQCAtNywxNiArNywxNCBAQAogICogICAtIEkgZG8gbm90IGtub3cgd2hhdCB0byB0byBvbiBXTV9bU0ddRVRfRk9OVAogICovCiAKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKLSNpbmNsdWRlICJzeXNtZXRyaWNzLmgiCiAjaW5jbHVkZSAicHJvZ3Jlc3MuaCIKLSNpbmNsdWRlICJncmFwaGljcy5oIgorI2luY2x1ZGUgImNvbW1jdHJsLmgiCiAjaW5jbHVkZSAiaGVhcC5oIgogI2luY2x1ZGUgIndpbi5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKKwogLyogQ29udHJvbCBjb25maWd1cmF0aW9uIGNvbnN0YW50cyAqLwogCiAjZGVmaW5lIExFRF9HQVAgICAgMgpAQCAtMjcsNyArMjUsNyBAQAogICAgICAgICAiVW5rbm93biBwYXJhbWV0ZXIocykgZm9yIG1lc3NhZ2UgIiAjbXNnICAgICBcCiAJIiglMDR4KTogd3A9JTA0eCBscD0lMDhseFxuIiwgbXNnLCB3UGFyYW0sIGxQYXJhbSk7IAogCi0jZGVmaW5lIFBST0dSRVNTX0dldEluZm9QdHIod25kUHRyKSAoKFBST0dSRVNTX0lORk8gKil3bmRQdHItPndFeHRyYSkKKyNkZWZpbmUgUFJPR1JFU1NfR2V0SW5mb1B0cih3bmRQdHIpICgoUFJPR1JFU1NfSU5GTyAqKXduZFB0ci0+d0V4dHJhWzBdKQogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNTcsMjUgKzU1LDE4IEBACiAgICAgaGJyQmFyID0gQ3JlYXRlU29saWRCcnVzaDMyIChpbmZvUHRyLT5Db2xvckJhcik7CiAKICAgLyogZ2V0IHRoZSByZXF1aXJlZCBiYWNrZ3JvdW5kIGJydXNoICovCi0gIGlmIChpbmZvUHRyLT5Db2xvckJrICE9IENMUl9ERUZBVUxUKQotICAgIGhickJrID0gQ3JlYXRlU29saWRCcnVzaDMyIChpbmZvUHRyLT5Db2xvckJrKTsKKyAgaWYgKGluZm9QdHItPkNvbG9yQmsgPT0gQ0xSX0RFRkFVTFQpCisgICAgaGJyQmsgPSBHZXRTeXNDb2xvckJydXNoMzIgKENPTE9SXzNERkFDRSk7CiAgIGVsc2UKLSAgICBoYnJCayA9IDA7IC8qIHRvIGtlZXAgdGhlIGNvbXBpbGVyIGhhcHB5IDstKSAqLworICAgIGhickJrID0gQ3JlYXRlU29saWRCcnVzaDMyIChpbmZvUHRyLT5Db2xvckJrKTsKIAogICAvKiBnZXQgcmVjdCBmb3IgdGhlIGJhciwgYWRqdXN0ZWQgZm9yIHRoZSBib3JkZXIgKi8KICAgR2V0Q2xpZW50UmVjdDMyICh3bmRQdHItPmh3bmRTZWxmLCAmcmVjdCk7CiAKLSAgLyogSGFjayBiZWNhdXNlIG9mIG1pc3NpbmcgdG9wIGJvcmRlciAqLwotICByZWN0LnRvcCsrOwotCiAgIC8qIGRyYXcgdGhlIGJvcmRlciAqLwotICBpZiAoaW5mb1B0ci0+Q29sb3JCayA9PSBDTFJfREVGQVVMVCkKLSAgICBEcmF3RWRnZTMyKGhkYywgJnJlY3QsIEJEUl9TVU5LRU5PVVRFUiwgQkZfUkVDVHxCRl9BREpVU1R8QkZfTUlERExFKTsKLSAgZWxzZQotICB7Ci0gICAgRHJhd0VkZ2UzMihoZGMsICZyZWN0LCBCRFJfU1VOS0VOT1VURVIsIEJGX1JFQ1R8QkZfQURKVVNUKTsKLSAgICBGaWxsUmVjdDMyKGhkYywgJnJlY3QsIGhickJrKTsKLSAgfQorICBEcmF3RWRnZTMyKGhkYywgJnJlY3QsIEJEUl9TVU5LRU5PVVRFUiwgQkZfUkVDVHxCRl9BREpVU1QpOworICBGaWxsUmVjdDMyKGhkYywgJnJlY3QsIGhickJrKTsKKwogICByZWN0LmxlZnQrKzsgcmVjdC5yaWdodC0tOyByZWN0LnRvcCsrOyByZWN0LmJvdHRvbS0tOwogCiAgIC8qIGNvbXB1dGUgZXh0ZW50IG9mIHByb2dyZXNzIGJhciAqLwpAQCAtMTY3LDYgKzE1OCwxMCBAQAogICBzd2l0Y2gobWVzc2FnZSkKICAgICB7CiAgICAgY2FzZSBXTV9DUkVBVEU6CisgICAgICAvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIGluZm8gc3RydWN0ICovCisgICAgICB3bmRQdHItPndFeHRyYVswXSA9IEhlYXBBbGxvYyAoU3lzdGVtSGVhcCwgSEVBUF9aRVJPX01FTU9SWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoUFJPR1JFU1NfSU5GTykpOworICAgICAgaW5mb1B0ciA9IChQUk9HUkVTU19JTkZPICopd25kUHRyLT53RXh0cmFbMF07CiAgICAgICAvKiBpbml0aWFsaXplIHRoZSBpbmZvIHN0cnVjdCAqLwogICAgICAgaW5mb1B0ci0+TWluVmFsPTA7IAogICAgICAgaW5mb1B0ci0+TWF4VmFsPTEwMDsKQEAgLTE3OSw2ICsxNzQsNyBAQAogICAgIAogICAgIGNhc2UgV01fREVTVFJPWToKICAgICAgIFRSQUNFKHVwZG93biwgIlByb2dyZXNzIEN0cmwgZGVzdHJ1Y3Rpb24sIGh3bmQ9JTA0eFxuIiwgaHduZCk7CisgICAgICBIZWFwRnJlZSAoU3lzdGVtSGVhcCwgMCwgaW5mb1B0cik7CiAgICAgICBicmVhazsKIAogICAgIGNhc2UgV01fRVJBU0VCS0dORDoKQEAgLTIwNyw3ICsyMDMsNiBAQAogCVBST0dSRVNTX0NvZXJjZVBvcyh3bmRQdHIpOwogICAgICAgICBJbnZhbGlkYXRlUmVjdDMyIChod25kLCBOVUxMLCBGQUxTRSk7CiAgICAgICAgIFVwZGF0ZVdpbmRvdzMyIChod25kKTsKLS8vCVBST0dSRVNTX1BhaW50KHduZFB0ciwgMCk7CiAgICAgICB9CiAgICAgICByZXR1cm4gdGVtcDsKIApAQCAtMzExLDMgKzMwNiwyNyBAQAogICAgIHJldHVybiAwOwogfQogCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFBST0dSRVNTX1JlZ2lzdGVyIFtJbnRlcm5hbF0KKyAqCisgKiBSZWdpc3RlcnMgdGhlIHByb2dyZXNzIGJhciB3aW5kb3cgY2xhc3MuCisgKiAKKyAqLwordm9pZCBQUk9HUkVTU19SZWdpc3Rlcih2b2lkKQoreworICAgIFdORENMQVNTMzJBIHduZENsYXNzOworCisgICAgaWYoIEdsb2JhbEZpbmRBdG9tMzJBKCBQUk9HUkVTU19DTEFTUzMyQSApICkgcmV0dXJuOworCisgICAgWmVyb01lbW9yeSggJnduZENsYXNzLCBzaXplb2YoIFdORENMQVNTMzJBICkgKTsKKyAgICB3bmRDbGFzcy5zdHlsZSAgICAgICAgID0gQ1NfR0xPQkFMQ0xBU1MgfCBDU19WUkVEUkFXIHwgQ1NfSFJFRFJBVzsKKyAgICB3bmRDbGFzcy5scGZuV25kUHJvYyAgID0gKFdORFBST0MzMilQcm9ncmVzc1dpbmRvd1Byb2M7CisgICAgd25kQ2xhc3MuY2JDbHNFeHRyYSAgICA9IDA7CisgICAgd25kQ2xhc3MuY2JXbmRFeHRyYSAgICA9IHNpemVvZihQUk9HUkVTU19JTkZPICopOworICAgIHduZENsYXNzLmhDdXJzb3IgICAgICAgPSBMb2FkQ3Vyc29yMzJBKCAwLCBJRENfQVJST1czMkEgKTsKKyAgICB3bmRDbGFzcy5scHN6Q2xhc3NOYW1lID0gUFJPR1JFU1NfQ0xBU1MzMkE7CisKKyAgICBSZWdpc3RlckNsYXNzMzJBKCAmd25kQ2xhc3MgKTsKK30KKwpkaWZmIC0tZ2l0IGEvY29udHJvbHMvc3RhdHVzLmMgYi9jb250cm9scy9zdGF0dXMuYwppbmRleCAzOTVlYmNlLi5lMWQ4Yjk1IDEwMDY0NAotLS0gYS9jb250cm9scy9zdGF0dXMuYworKysgYi9jb250cm9scy9zdGF0dXMuYwpAQCAtMiwxMCArMiwxMSBAQAogICogSW50ZXJmYWNlIGNvZGUgdG8gU3RhdHVzV2luZG93IHdpZGdldC9jb250cm9sCiAgKgogICogQ29weXJpZ2h0IDE5OTYgQnJ1Y2UgTWlsbmVyCisgKiBDb3B5cmlnaHQgMTk5OCBFcmljIEtvaGwKICAqLwogCiAjaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KKwogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJzdGF0dXMuaCIKICNpbmNsdWRlICJjb21tY3RybC5oIgpAQCAtMjAsNDQgKzIxLDIwNiBAQAogCiAvKgogICogRml4bWUvVG9kbwotICogMSkgQWRkIHNpemUgZ3JpcCB0byBzdGF0dXMgYmFyIC0gU0JBUlNfU0laRUdSSVAKLSAqIDIpIERvbid0IGhhcmQgY29kZSBiYXIgdG8gYm90dG9tIG9mIHdpbmRvdywgYWxsb3cgQ0NTX1RPUCBhbHNvCi0gKiAzKSBGaXggU0JUX09XTkVSRFJBVwotICogNCkgQWRkIERyYXdTdGF0dXNUZXh0MzJBIGZ1bnRpb24KKyAqIDEpIERvbid0IGhhcmQgY29kZSBiYXIgdG8gYm90dG9tIG9mIHdpbmRvdywgYWxsb3cgQ0NTX1RPUCBhbHNvCisgKiAyKSBBZGQgJ25vbiBoYWNrJyB2ZXJzaW9uIG9mIGljb24gZHJhd2luZyBjb2RlCiAgKi8KIAorI2RlZmluZSBfX0dFVF9JQ09OX0lORk9fSEFDS19fCisKKyNpZmRlZiBfX0dFVF9JQ09OX0lORk9fSEFDS19fCisjaW5jbHVkZSAiYml0bWFwLmgiCisjZW5kaWYKKworI2RlZmluZSBfTUFYKGEsYikgKCgoYSk+KGIpKT8oYSk6KGIpKQorI2RlZmluZSBfTUlOKGEsYikgKCgoYSk+KGIpKT8oYik6KGEpKQorCisjZGVmaW5lIEhPUlpfQk9SREVSIDAKKyNkZWZpbmUgVkVSVF9CT1JERVIgMgorI2RlZmluZSBIT1JaX0dBUCAgICAyCisKKwogc3RhdGljIFNUQVRVU1dJTkRPV0lORk8gKkdldFN0YXR1c0luZm8oSFdORDMyIGh3bmQpCiB7CiAgICAgV05EICp3bmRQdHI7CiAKICAgICB3bmRQdHIgPSBXSU5fRmluZFduZFB0cihod25kKTsKLSAgICByZXR1cm4gKChTVEFUVVNXSU5ET1dJTkZPICopICZ3bmRQdHItPndFeHRyYVswXSk7CisgICAgcmV0dXJuICgoU1RBVFVTV0lORE9XSU5GTyAqKSB3bmRQdHItPndFeHRyYVswXSk7CiB9CiAKLXN0YXRpYyBCT09MMzIgU1dfUmVmcmVzaCggSFdORDMyIGh3bmQsIEhEQzMyIGhkYywgU1RBVFVTV0lORE9XSU5GTyAqc2VsZiApCisKK3N0YXRpYyB2b2lkCitTVEFUVVNfRHJhd1NpemVHcmlwIChIREMzMiBoZGMsIExQUkVDVDMyIGxwUmVjdCkKIHsKLQlpbnQJaTsKKyAgICBIUEVOMzIgaE9sZFBlbjsKKyAgICBQT0lOVDMyIHB0OworICAgIElOVDMyIGk7CiAKLQlpZiAoIUlzV2luZG93VmlzaWJsZTMyKGh3bmQpKSB7Ci0JICAgIHJldHVybiAoVFJVRSk7Ci0JfQorICAgIHB0LnggPSBscFJlY3QtPnJpZ2h0IC0gMTsKKyAgICBwdC55ID0gbHBSZWN0LT5ib3R0b20gLSAxOwogCi0JaWYgKHNlbGYtPnNpbXBsZSkgewotCSAgICBEcmF3U3RhdHVzVGV4dDMyQShoZGMsCi0JCQkgICAgICAmc2VsZi0+cGFydDAuYm91bmQsCi0JCQkgICAgICBzZWxmLT5wYXJ0MC50ZXh0LAotCQkJICAgICAgc2VsZi0+cGFydDAuc3R5bGUpOworICAgIGhPbGRQZW4gPSBTZWxlY3RPYmplY3QzMiAoaGRjLCBHZXRTeXNDb2xvclBlbjMyIChDT0xPUl8zREZBQ0UpKTsKKyAgICBNb3ZlVG9FeDMyIChoZGMsIHB0LnggLSAxMiwgcHQueSwgTlVMTCk7CisgICAgTGluZVRvMzIgKGhkYywgcHQueCwgcHQueSk7CisgICAgTGluZVRvMzIgKGhkYywgcHQueCwgcHQueSAtIDEyKTsKKworICAgIHB0LngtLTsKKyAgICBwdC55LS07CisKKyAgICBTZWxlY3RPYmplY3QzMiAoaGRjLCBHZXRTeXNDb2xvclBlbjMyIChDT0xPUl8zRFNIQURPVykpOworICAgIGZvciAoaSA9IDE7IGkgPCAxMTsgaSArPSA0KSB7CisJTW92ZVRvRXgzMiAoaGRjLCBwdC54IC0gaSwgcHQueSwgTlVMTCk7CisJTGluZVRvMzIgKGhkYywgcHQueCwgcHQueSAtIGkpOworCisJTW92ZVRvRXgzMiAoaGRjLCBwdC54IC0gaS0xLCBwdC55LCBOVUxMKTsKKwlMaW5lVG8zMiAoaGRjLCBwdC54LCBwdC55IC0gaS0xKTsKKyAgICB9CisKKyAgICBTZWxlY3RPYmplY3QzMiAoaGRjLCBHZXRTeXNDb2xvclBlbjMyIChDT0xPUl8zREhJR0hMSUdIVCkpOworICAgIGZvciAoaSA9IDM7IGkgPCAxMzsgaSArPSA0KSB7CisJTW92ZVRvRXgzMiAoaGRjLCBwdC54IC0gaSwgcHQueSwgTlVMTCk7CisJTGluZVRvMzIgKGhkYywgcHQueCwgcHQueSAtIGkpOworICAgIH0KKworICAgIFNlbGVjdE9iamVjdDMyIChoZGMsIGhPbGRQZW4pOworfQorCisKK3N0YXRpYyB2b2lkIAorU0JfRHJhd1BhcnQoIEhEQzMyIGhkYywgTFBSRUNUMzIgbHByYywgSElDT04zMiBoSWNvbiwKKyAgICAgICAgICAgICBMUENTVFIgdGV4dCwgVUlOVDMyIHN0eWxlICkKK3sKKyAgICBSRUNUMzIgciA9ICpscHJjOworICAgIFVJTlQzMiBib3JkZXIgPSBCRFJfU1VOS0VOT1VURVI7CisKKyAgICBpZihzdHlsZT09U0JUX1BPUE9VVCkKKyAgICAgIGJvcmRlciA9IEJEUl9SQUlTRURPVVRFUjsKKyAgICBlbHNlIGlmKHN0eWxlPT1TQlRfTk9CT1JERVJTKQorICAgICAgYm9yZGVyID0gMDsKKworICAgIERyYXdFZGdlMzIoaGRjLCAmciwgYm9yZGVyLCBCRl9SRUNUfEJGX0FESlVTVCk7CisKKyAgICAvKiBkcmF3IHRoZSBpY29uICovCisgICAgaWYgKGhJY29uKSB7CisjaWZkZWYgX19HRVRfSUNPTl9JTkZPX0hBQ0tfXworICAgICAgICBIQklUTUFQMzIgaGJtSW1hZ2U7CisgICAgICAgIEhCSVRNQVAzMiBoYm1NYXNrOworICAgICAgICBDVVJTT1JJQ09OSU5GTyAqcHRyOworICAgICAgICBIREMzMiBoZGNTcmM7CisJSU5UMzIgeSwgY3ksIHJ5LCB0eTsKKworICAgICAgICBpZiAocHRyID0gKENVUlNPUklDT05JTkZPICopR2xvYmFsTG9jazE2KGhJY29uKSkgeworICAgICAgICBoYm1NYXNrICA9IENyZWF0ZUJpdG1hcDMyIChwdHItPm5XaWR0aCwgcHRyLT5uSGVpZ2h0LCAxLCAxLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikocHRyICsgMSkpOworICAgICAgICBoYm1JbWFnZSA9IENyZWF0ZUJpdG1hcDMyIChwdHItPm5XaWR0aCwgcHRyLT5uSGVpZ2h0LCBwdHItPmJQbGFuZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ci0+YkJpdHNQZXJQaXhlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikocHRyICsgMSkgKyBwdHItPm5IZWlnaHQgKiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUTUFQX1dJRFRIX0JZVEVTKHB0ci0+bldpZHRoLCAxKSk7CisJci5sZWZ0ICs9IDI7CisJcnkgPSByLmJvdHRvbSAtIHIudG9wOworCWlmIChyeSA+PSBwdHItPm5IZWlnaHQpIHsKKwkgICAgLyogZnVsbCB2aWV3IG9mIGljb24gKi8KKwkgICAgeSA9IDA7CisJICAgIGN5ID0gcHRyLT5uSGVpZ2h0OworCSAgICB0eSA9IHIudG9wICsgKHJ5IC0gcHRyLT5uSGVpZ2h0KSAvIDI7CiAJfQogCWVsc2UgewotCSAgICBmb3IgKGkgPSAwOyBpIDwgc2VsZi0+bnVtUGFydHM7IGkrKykgewotCQlEcmF3U3RhdHVzVGV4dDMyQShoZGMsCi0JCQkJICAmc2VsZi0+cGFydHNbaV0uYm91bmQsCi0JCQkJICBzZWxmLT5wYXJ0c1tpXS50ZXh0LAotCQkJCSAgc2VsZi0+cGFydHNbaV0uc3R5bGUpOwotCSAgICB9CisJICAgIC8qIHBhcnRpYWwgdmlldyBvZiBpY29uICovCisJICAgIHkgPSAocHRyLT5uSGVpZ2h0IC0gcnkpIC8gMjsKKwkgICAgY3kgPSByeTsKKwkgICAgdHkgPSByLnRvcDsKIAl9CiAKLQlyZXR1cm4gVFJVRTsKKwkgICAgaGRjU3JjID0gQ3JlYXRlQ29tcGF0aWJsZURDMzIgKGhkYyk7CisJICAgIFNlbGVjdE9iamVjdDMyIChoZGNTcmMsIGhibU1hc2spOworCSAgICBCaXRCbHQzMiAoaGRjLCByLmxlZnQsIHIudG9wLCBwdHItPm5XaWR0aCwgY3ksCisJCSAgICAgIGhkY1NyYywgMCwgeSwgU1JDQU5EKTsKKwkgICAgU2VsZWN0T2JqZWN0MzIgKGhkY1NyYywgaGJtSW1hZ2UpOworCSAgICBCaXRCbHQzMiAoaGRjLCByLmxlZnQsIHIudG9wLCBwdHItPm5XaWR0aCwgY3ksCisJCSAgICAgIGhkY1NyYywgMCwgeSwgU1JDUEFJTlQpOworCSAgICBEZWxldGVEQzMyIChoZGNTcmMpOworCisJICAgIHIubGVmdCArPSBwdHItPm5XaWR0aDsKKwkgICAgRGVsZXRlT2JqZWN0MzIgKGhibUltYWdlKTsKKwkgICAgRGVsZXRlT2JqZWN0MzIgKGhibU1hc2spOworCSAgICBHbG9iYWxVbmxvY2sxNiAoaEljb24pOworCX0KKyNlbHNlCisJLyogRklYTUU6IG5vICJub24gaGFjayIgdmVyc2lvbiBhdmFpbGFibGUhISEgKi8KKyNlbmRpZgorICAgIH0KKworICAgIC8qIG5vdyBkcmF3IHRleHQgKi8KKyAgICBpZiAodGV4dCkgeworICAgICAgaW50IG9sZGJrbW9kZSA9IFNldEJrTW9kZTMyKGhkYywgVFJBTlNQQVJFTlQpOworICAgICAgci5sZWZ0ICs9IDM7CisgICAgICBEcmF3VGV4dDMyQShoZGMsIHRleHQsIGxzdHJsZW4zMkEodGV4dCksCisJCSAgJnIsIERUX0xFRlR8RFRfVkNFTlRFUnxEVF9TSU5HTEVMSU5FKTsgIAorICAgICAgaWYgKG9sZGJrbW9kZSAhPSBUUkFOU1BBUkVOVCkKKwlTZXRCa01vZGUzMihoZGMsIG9sZGJrbW9kZSk7CisgICAgfQorfQorCisKK3N0YXRpYyBCT09MMzIKK1NXX1JlZnJlc2goIEhXTkQzMiBod25kLCBIREMzMiBoZGMsIFNUQVRVU1dJTkRPV0lORk8gKnNlbGYgKQoreworICAgIGludCAgICAgIGk7CisgICAgUkVDVDMyICAgcmVjdDsKKyAgICBIQlJVU0gzMiBoYnJCazsKKyAgICBXTkQgKnduZFB0cjsKKworICAgIHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKGh3bmQpOworCisgICAgaWYgKCFJc1dpbmRvd1Zpc2libGUzMihod25kKSkgeworICAgICAgICByZXR1cm4gKFRSVUUpOworICAgIH0KKworICAgIEdldENsaWVudFJlY3QzMiAoaHduZCwgJnJlY3QpOworCisgICAgaWYgKHNlbGYtPmNsckJrICE9IENMUl9ERUZBVUxUKQorCWhickJrID0gQ3JlYXRlU29saWRCcnVzaDMyIChzZWxmLT5jbHJCayk7CisgICAgZWxzZQorCWhickJrID0gR2V0U3lzQ29sb3JCcnVzaDMyIChDT0xPUl8zREZBQ0UpOworICAgIEZpbGxSZWN0MzIoaGRjLCAmcmVjdCwgaGJyQmspOworCisgICAgaWYgKHNlbGYtPnNpbXBsZSkgeworCVNCX0RyYXdQYXJ0IChoZGMsCisJCSAgICAgJnNlbGYtPnBhcnQwLmJvdW5kLAorCQkgICAgIHNlbGYtPnBhcnQwLmhJY29uLAorCQkgICAgIHNlbGYtPnBhcnQwLnRleHQsCisJCSAgICAgc2VsZi0+cGFydDAuc3R5bGUpOworICAgIH0KKyAgICBlbHNlIHsKKwlmb3IgKGkgPSAwOyBpIDwgc2VsZi0+bnVtUGFydHM7IGkrKykgeworCSAgICBpZiAoc2VsZi0+cGFydHNbaV0uc3R5bGUgPT0gU0JUX09XTkVSRFJBVykgeworCQlEUkFXSVRFTVNUUlVDVDMyIGRpczsKKwkJV05EICp3bmRQdHIgPSBXSU5fRmluZFduZFB0cihod25kKTsKKworCQlkaXMuQ3RsSUQgPSB3bmRQdHItPndJRG1lbnU7CisJCWRpcy5pdGVtSUQgPSAtMTsKKwkJZGlzLmh3bmRJdGVtID0gaHduZDsKKwkJZGlzLmhEQyA9IGhkYzsKKwkJZGlzLnJjSXRlbSA9IHNlbGYtPnBhcnQwLmJvdW5kOworCQlkaXMuaXRlbURhdGEgPSAoSU5UMzIpc2VsZi0+cGFydDAudGV4dDsKKwkJU2VuZE1lc3NhZ2UzMkEgKEdldFBhcmVudDMyIChod25kKSwgV01fRFJBV0lURU0sIAorCQkJCShXUEFSQU0zMil3bmRQdHItPndJRG1lbnUsIChMUEFSQU0pJmRpcyk7CisJICAgIH0KKwkgICAgZWxzZQorCQlTQl9EcmF3UGFydCAoaGRjLAorCQkJICAgICAmc2VsZi0+cGFydHNbaV0uYm91bmQsCisJCQkgICAgIHNlbGYtPnBhcnRzW2ldLmhJY29uLAorCQkJICAgICBzZWxmLT5wYXJ0c1tpXS50ZXh0LAorCQkJICAgICBzZWxmLT5wYXJ0c1tpXS5zdHlsZSk7CisJfQorICAgIH0KKworICAgIGlmIChzZWxmLT5jbHJCayAhPSBDTFJfREVGQVVMVCkKKwlEZWxldGVPYmplY3QzMiAoaGJyQmspOworCisgICAgaWYgKHduZFB0ci0+ZHdTdHlsZSAmIFNCQVJTX1NJWkVHUklQKQorCVNUQVRVU19EcmF3U2l6ZUdyaXAgKGhkYywgJnJlY3QpOworCisgICAgcmV0dXJuIFRSVUU7CiB9CiAKIApAQCAtNjYsMTEgKzIyOSwxMCBAQAogewogICAgIExQSU5UMzIJb3V0OwogCi0gICAgLyogRklYTUUgZm9yIHNpemVncmlwcyAqLwogICAgIG91dCA9IChMUElOVDMyKSBsUGFyYW07Ci0gICAgb3V0WzBdID0gMTsgLyogdmVydGljYWwgYm9yZGVyIHdpZHRoICovCi0gICAgb3V0WzFdID0gMTsgLyogaG9yaXpvbnRhbCBib3JkZXIgd2lkdGggKi8KLSAgICBvdXRbMl0gPSAxOyAvKiB3aWR0aCBvZiBib3JkZXIgYmV0d2VlbiByZWN0YW5nbGVzICovCisgICAgb3V0WzBdID0gSE9SWl9CT1JERVI7IC8qIGhvcml6b250YWwgYm9yZGVyIHdpZHRoICovCisgICAgb3V0WzFdID0gVkVSVF9CT1JERVI7IC8qIHZlcnRpY2FsIGJvcmRlciB3aWR0aCAqLworICAgIG91dFsyXSA9IEhPUlpfR0FQOyAvKiB3aWR0aCBvZiBib3JkZXIgYmV0d2VlbiByZWN0YW5nbGVzICovCiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKQEAgLTgwLDExICsyNDIsMTIgQEAKICAgICBpbnQJaTsKICAgICBSRUNUMzIJcmVjdCwgKnI7CiAgICAgU1RBVFVTV0lORE9XUEFSVCAqcGFydDsKLSAgICBpbnQJc2VwID0gMTsKIAogICAgIC8qIGdldCBvdXIgd2luZG93IHNpemUgKi8KICAgICBHZXRDbGllbnRSZWN0MzIoaHduZCwgJnJlY3QpOwogCisgICAgcmVjdC50b3AgKz0gVkVSVF9CT1JERVI7CisKICAgICAvKiBzZXQgYm91bmRzIGZvciBzaW1wbGUgcmVjdGFuZ2xlICovCiAgICAgc2VsZi0+cGFydDAuYm91bmQgPSByZWN0OwogCkBAIC05Nyw3ICsyNjAsNyBAQAogCWlmIChpID09IDApCiAJICAgIHItPmxlZnQgPSAwOwogCWVsc2UKLQkgICAgci0+bGVmdCA9IHNlbGYtPnBhcnRzW2ktMV0uYm91bmQucmlnaHQrc2VwOworCSAgICByLT5sZWZ0ID0gc2VsZi0+cGFydHNbaS0xXS5ib3VuZC5yaWdodCArIEhPUlpfR0FQOwogCWlmIChwYXJ0LT54ID09IC0xKQogCSAgICByLT5yaWdodCA9IHJlY3QucmlnaHQ7CiAJZWxzZQpAQCAtMjA0LDE3ICszNjcsMjYgQEAKIH0KIAogc3RhdGljIExSRVNVTFQKLVNXX0NyZWF0ZShTVEFUVVNXSU5ET1dJTkZPICpzZWxmLCBIV05EMzIgaHduZCwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQorU1dfQ3JlYXRlKEhXTkQzMiBod25kLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCiB7CiAgICAgUkVDVDMyCXJlY3Q7CiAgICAgTFBDUkVBVEVTVFJVQ1QzMkEgbHBDcmVhdGUgPSAoTFBDUkVBVEVTVFJVQ1QzMkEpIGxQYXJhbTsKLSAgICBpbnQJaGVpZ2h0LCB3aWR0aDsKKyAgICBpbnQJaGVpZ2h0LCB3aWR0aCwgbGVuOwogICAgIEhEQzMyCWhkYzsKICAgICBIV05EMzIJcGFyZW50OworICAgIFdORCAqd25kUHRyOworICAgIFNUQVRVU1dJTkRPV0lORk8gKnNlbGY7CiAKLSAgICBzZWxmLT5udW1QYXJ0cyA9IDA7CisgICAgd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoaHduZCk7CisgICAgd25kUHRyLT53RXh0cmFbMF0gPSBIZWFwQWxsb2MgKFN5c3RlbUhlYXAsIEhFQVBfWkVST19NRU1PUlksCisJCQkJICAgc2l6ZW9mKFNUQVRVU1dJTkRPV0lORk8pKTsKKworICAgIHNlbGYgPSAoU1RBVFVTV0lORE9XSU5GTyopd25kUHRyLT53RXh0cmFbMF07CisgICAgc2VsZi0+bnVtUGFydHMgPSAxOwogICAgIHNlbGYtPnBhcnRzID0gMDsKLSAgICBzZWxmLT5zaW1wbGUgPSBUUlVFOworICAgIHNlbGYtPnNpbXBsZSA9IEZBTFNFOworICAgIHNlbGYtPmNsckJrID0gQ0xSX0RFRkFVTFQ7CisgICAgc2VsZi0+aEZvbnQgPSAwOwogICAgIEdldENsaWVudFJlY3QzMihod25kLCAmcmVjdCk7CiAKICAgICAvKiBpbml0aWFsaXplIHNpbXBsZSBjYXNlICovCkBAIC0yMjIsOCArMzk0LDIzIEBACiAgICAgc2VsZi0+cGFydDAudGV4dCA9IDA7CiAgICAgc2VsZi0+cGFydDAueCA9IDA7CiAgICAgc2VsZi0+cGFydDAuc3R5bGUgPSAwOworICAgIHNlbGYtPnBhcnQwLmhJY29uID0gMDsKIAotICAgIGhlaWdodCA9IDQwOworICAgIC8qIGluaXRpYWxpemUgZmlyc3QgcGFydCAqLworICAgIHNlbGYtPnBhcnRzID0gSGVhcEFsbG9jKFN5c3RlbUhlYXAsIEhFQVBfWkVST19NRU1PUlksCisJCQkgICAgc2l6ZW9mKFNUQVRVU1dJTkRPV1BBUlQpKTsKKyAgICBzZWxmLT5wYXJ0c1swXS5ib3VuZCA9IHJlY3Q7CisgICAgc2VsZi0+cGFydHNbMF0udGV4dCA9IDA7CisgICAgc2VsZi0+cGFydHNbMF0ueCA9IC0xOworICAgIHNlbGYtPnBhcnRzWzBdLnN0eWxlID0gMDsKKyAgICBzZWxmLT5wYXJ0c1swXS5oSWNvbiA9IDA7CisKKyAgICBpZiAobGVuID0gbHN0cmxlbjMyQSggbHBDcmVhdGUtPmxwc3pOYW1lICkgKSB7CisgICAgICAgIHNlbGYtPnBhcnRzWzBdLnRleHQgPSBIZWFwQWxsb2MoIFN5c3RlbUhlYXAsIDAsIGxlbiArIDEgKTsKKyAgICAgICAgbHN0cmNweTMyQSggc2VsZi0+cGFydHNbMF0udGV4dCwgbHBDcmVhdGUtPmxwc3pOYW1lICk7CisgICAgfQorCisgICAgaGVpZ2h0ID0gMjA7CiAgICAgaWYgKChoZGMgPSBHZXREQzMyKDApKSkgewogCVRFWFRNRVRSSUMzMkEgdG07CiAJR2V0VGV4dE1ldHJpY3MzMkEoaGRjLCAmdG0pOwpAQCAtMjM0LDggKzQyMSw4IEBACiAgICAgcGFyZW50ID0gR2V0UGFyZW50MzIoaHduZCk7CiAgICAgR2V0Q2xpZW50UmVjdDMyKHBhcmVudCwgJnJlY3QpOwogICAgIHdpZHRoID0gcmVjdC5yaWdodCAtIHJlY3QubGVmdDsKLSAgICBoZWlnaHQgPSAoc2VsZi0+dGV4dEhlaWdodCAqIDMpLzI7Ci0gICAgTW92ZVdpbmRvdzMyKGh3bmQsIGxwQ3JlYXRlLT54LCBscENyZWF0ZS0+eS0xLCB3aWR0aCwgaGVpZ2h0LCBGQUxTRSk7CisgICAgc2VsZi0+aGVpZ2h0ID0gc2VsZi0+dGV4dEhlaWdodCArIDQgKyBWRVJUX0JPUkRFUjsKKyAgICBNb3ZlV2luZG93MzIoaHduZCwgbHBDcmVhdGUtPngsIGxwQ3JlYXRlLT55LTEsIHdpZHRoLCBzZWxmLT5oZWlnaHQsIEZBTFNFKTsKICAgICBTV19TZXRQYXJ0Qm91bmRzKGh3bmQsIHNlbGYpOwogICAgIHJldHVybiAwOwogfQpAQCAtMzA4LDI1ICs0OTUsMjQyIEBACiBzdGF0aWMgTFJFU1VMVAogU1dfU2V0TWluSGVpZ2h0KFNUQVRVU1dJTkRPV0lORk8gKnNlbGYsIEhXTkQzMiBod25kLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCiB7Ci0gICAgLyogRklYTUUgKi8KLSAgICAvKiBzaXplIGlzIHdQYXJhbSB8IDIqcGl4ZWxzX29mX2hvcnpfYm9yZGVyICovCisgICAgSU5UMzIJd2lkdGgsIGhlaWdodCwgeCwgeTsKKyAgICBSRUNUMzIJcGFyZW50X3JlY3Q7CisgICAgSFdORDMyCXBhcmVudDsKKworICAgIGlmIChJc1dpbmRvd1Zpc2libGUzMiAoaHduZCkpIHsKKwkvKiB3aWR0aCBhbmQgaGVpZ2h0IGRvbid0IGFwcGx5ICovCisJcGFyZW50ID0gR2V0UGFyZW50MzIoaHduZCk7CisJR2V0Q2xpZW50UmVjdDMyKHBhcmVudCwgJnBhcmVudF9yZWN0KTsKKwlzZWxmLT5oZWlnaHQgPSAoSU5UMzIpd1BhcmFtICsgVkVSVF9CT1JERVI7CisJd2lkdGggPSBwYXJlbnRfcmVjdC5yaWdodCAtIHBhcmVudF9yZWN0LmxlZnQ7CisJeCA9IHBhcmVudF9yZWN0LmxlZnQ7CisJeSA9IHBhcmVudF9yZWN0LmJvdHRvbSAtIHNlbGYtPmhlaWdodDsKKwlNb3ZlV2luZG93MzIoaHduZCwgcGFyZW50X3JlY3QubGVmdCwgcGFyZW50X3JlY3QuYm90dG9tIC0gc2VsZi0+aGVpZ2h0LAorCQkgICAgIHdpZHRoLCBzZWxmLT5oZWlnaHQsIFRSVUUpOworCVNXX1NldFBhcnRCb3VuZHMoaHduZCwgc2VsZik7CisgICAgfQorCiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKIHN0YXRpYyBMUkVTVUxUCitTV19TZXRCa0NvbG9yKFNUQVRVU1dJTkRPV0lORk8gKnNlbGYsIEhXTkQzMiBod25kLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCit7CisgICAgQ09MT1JSRUYgb2xkQmtDb2xvcjsKKyAgICBIREMzMiAgICBoZGM7CisKKyAgICBvbGRCa0NvbG9yID0gc2VsZi0+Y2xyQms7CisgICAgc2VsZi0+Y2xyQmsgPSAoQ09MT1JSRUYpbFBhcmFtOworICAgIGhkYyA9IEdldERDMzIoaHduZCk7CisgICAgU1dfUmVmcmVzaChod25kLCBoZGMsIHNlbGYpOworICAgIFJlbGVhc2VEQzMyKGh3bmQsIGhkYyk7CisgICAgcmV0dXJuIG9sZEJrQ29sb3I7Cit9CisKKworc3RhdGljIExSRVNVTFQKK1NXX1NldEljb24oU1RBVFVTV0lORE9XSU5GTyAqc2VsZiwgSFdORDMyIGh3bmQsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBIREMzMiAgICBoZGM7CisgICAgSU5UMzIgICAgblBhcnQ7CisKKyAgICBuUGFydCA9IChJTlQzMil3UGFyYW0gJiAweDAwZmY7CisgICAgaWYgKChuUGFydCA8IC0xKSB8fCAoblBhcnQgPj0gc2VsZi0+bnVtUGFydHMpKSByZXR1cm4gRkFMU0U7CisKKyAgICBpZiAoblBhcnQgPT0gLTEpIHsKKyAgICAgICAgc2VsZi0+cGFydDAuaEljb24gPSAoSElDT04zMilsUGFyYW07CisgICAgICAgIGlmIChzZWxmLT5zaW1wbGUpIAorICAgICAgICAgICAgSW52YWxpZGF0ZVJlY3QzMihod25kLCAmc2VsZi0+cGFydDAuYm91bmQsIEZBTFNFKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHNlbGYtPnBhcnRzW25QYXJ0XS5oSWNvbiA9IChISUNPTjMyKWxQYXJhbTsKKyAgICAgICAgaWYgKCEoc2VsZi0+c2ltcGxlKSkKKyAgICAgICAgICAgIEludmFsaWRhdGVSZWN0MzIoaHduZCwgJnNlbGYtPnBhcnRzW25QYXJ0XS5ib3VuZCwgRkFMU0UpOworICAgIH0KKyAgICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIExSRVNVTFQKK1NXX0dldEljb24oU1RBVFVTV0lORE9XSU5GTyAqc2VsZiwgSFdORDMyIGh3bmQsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBJTlQzMiAgICBuUGFydDsKKworICAgIG5QYXJ0ID0gKElOVDMyKXdQYXJhbSAmIDB4MDBmZjsKKyAgICBpZiAoKG5QYXJ0IDwgLTEpIHx8IChuUGFydCA+PSBzZWxmLT5udW1QYXJ0cykpIHJldHVybiBOVUxMOworCisgICAgaWYgKG5QYXJ0ID09IC0xKQorICAgICAgICByZXR1cm4gKHNlbGYtPnBhcnQwLmhJY29uKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAoc2VsZi0+cGFydHNbblBhcnRdLmhJY29uKTsKK30KKworc3RhdGljIExSRVNVTFQKIFNXX1NpbXBsZShTVEFUVVNXSU5ET1dJTkZPICpzZWxmLCBIV05EMzIgaHduZCwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogeworICAgIFdORCAqd25kUHRyOwogICAgIEJPT0wzMiBzaW1wbGU7Ci0gICAgSERDMzIJaGRjOworICAgIEhEQzMyICBoZGM7CisgICAgTk1IRFIgIG5taGRyOworCisgICAgd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoaHduZCk7CiAKICAgICBzaW1wbGUgPSAoQk9PTDMyKSB3UGFyYW07CiAgICAgc2VsZi0+c2ltcGxlID0gc2ltcGxlOworCisgICAgLyogc2VuZCBub3RpZmljYXRpb24gKi8KKyAgICBubWhkci5od25kRnJvbSA9IGh3bmQ7CisgICAgbm1oZHIuaWRGcm9tID0gd25kUHRyLT53SURtZW51OworICAgIG5taGRyLmNvZGUgPSBTQk5fU0lNUExFTU9ERUNIQU5HRTsKKyAgICBTZW5kTWVzc2FnZTMyQSAoR2V0UGFyZW50MzIgKGh3bmQpLCBXTV9OT1RJRlksIDAsIChMUEFSQU0pJm5taGRyKTsKKwogICAgIGhkYyA9IEdldERDMzIoaHduZCk7CiAgICAgU1dfUmVmcmVzaChod25kLCBoZGMsIHNlbGYpOwogICAgIFJlbGVhc2VEQzMyKGh3bmQsIGhkYyk7CisKICAgICByZXR1cm4gVFJVRTsKIH0KIAorCitzdGF0aWMgTFJFU1VMVAorU1dfRGVzdHJveShTVEFUVVNXSU5ET1dJTkZPICpzZWxmLCBIV05EMzIgaHduZCwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworICAgIGludAlpOworCisgICAgZm9yIChpID0gMDsgaSA8IHNlbGYtPm51bVBhcnRzOyBpKyspIHsKKwlpZiAoc2VsZi0+cGFydHNbaV0udGV4dCAmJiAoc2VsZi0+cGFydHNbaV0uc3R5bGUgIT0gU0JUX09XTkVSRFJBVykpCisJICAgIEhlYXBGcmVlKFN5c3RlbUhlYXAsIDAsIHNlbGYtPnBhcnRzW2ldLnRleHQpOworICAgIH0KKyAgICBpZiAoc2VsZi0+cGFydDAudGV4dCAmJiAoc2VsZi0+cGFydDAuc3R5bGUgIT0gU0JUX09XTkVSRFJBVykpCisJSGVhcEZyZWUoU3lzdGVtSGVhcCwgMCwgc2VsZi0+cGFydDAudGV4dCk7CisgICAgSGVhcEZyZWUoU3lzdGVtSGVhcCwgMCwgc2VsZi0+cGFydHMpOworICAgIEhlYXBGcmVlKFN5c3RlbUhlYXAsIDAsIHNlbGYpOworICAgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBMUkVTVUxUCitTV19XTUdldFRleHQgKFNUQVRVU1dJTkRPV0lORk8gKnNlbGYsIEhXTkQzMiBod25kLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCit7CisgICAgSU5UMzIgbGVuOworCisgICAgaWYgKCEoc2VsZi0+cGFydHNbMF0udGV4dCkpCisgICAgICAgIHJldHVybiAwOworICAgIGxlbiA9IGxzdHJsZW4zMkEgKHNlbGYtPnBhcnRzWzBdLnRleHQpOworICAgIGlmICh3UGFyYW0gPiBsZW4pIHsKKyAgICAgICAgbHN0cmNweTMyQSAoKExQU1RSKWxQYXJhbSwgc2VsZi0+cGFydHNbMF0udGV4dCk7CisgICAgICAgIHJldHVybiBsZW47CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIC0xOworfQorCisKK3N0YXRpYyBMUkVTVUxUCitTV19XTUdldFRleHRMZW5ndGggKFNUQVRVU1dJTkRPV0lORk8gKnNlbGYsIEhXTkQzMiBod25kLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCit7CisgICAgaWYgKCEoc2VsZi0+cGFydHNbMF0udGV4dCkpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiAobHN0cmxlbjMyQSAoc2VsZi0+cGFydHNbMF0udGV4dCkpOworfQorCisKK3N0YXRpYyBMUkVTVUxUCitTV19OY0hpdFRlc3QgKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCit7CisgICAgUkVDVDMyICByZWN0OworICAgIFBPSU5UMzIgcHQ7CisKKyAgICBpZiAod25kUHRyLT5kd1N0eWxlICYgU0JBUlNfU0laRUdSSVApIHsKKwlHZXRDbGllbnRSZWN0MzIgKHduZFB0ci0+aHduZFNlbGYsICZyZWN0KTsKKworCXB0LnggPSAoSU5UMzIpTE9XT1JEKGxQYXJhbSk7CisJcHQueSA9IChJTlQzMilISVdPUkQobFBhcmFtKTsKKwlTY3JlZW5Ub0NsaWVudDMyICh3bmRQdHItPmh3bmRTZWxmLCAmcHQpOworCisJcmVjdC5sZWZ0ID0gcmVjdC5yaWdodCAtIDEzOworCXJlY3QudG9wICs9IDI7CisKKwlpZiAoUHRJblJlY3QzMiAoJnJlY3QsIHB0KSkKKwkgICAgcmV0dXJuIEhUQk9UVE9NUklHSFQ7CisgICAgfQorCisgICAgcmV0dXJuIERlZldpbmRvd1Byb2MzMkEgKHduZFB0ci0+aHduZFNlbGYsIFdNX05DSElUVEVTVCwgd1BhcmFtLCBsUGFyYW0pOworfQorCisKK3N0YXRpYyBMUkVTVUxUCitTV19OY0xCdXR0b25Eb3duIChIV05EMzIgaHduZCwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworLy8gICAgVFJBQ0UgKHN0YXR1cywgIldNX05DTEJVVFRPTkRPV05cbiIpOworICAgIFBvc3RNZXNzYWdlMzJBIChHZXRQYXJlbnQzMiAoaHduZCksIFdNX05DTEJVVFRPTkRPV04sCisJCSAgICB3UGFyYW0sIGxQYXJhbSk7CisgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIExSRVNVTFQKK1NXX05jTEJ1dHRvblVwIChIV05EMzIgaHduZCwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworLy8gICAgVFJBQ0UgKHN0YXR1cywgIldNX05DTEJVVFRPTlVQXG4iKTsKKyAgICBQb3N0TWVzc2FnZTMyQSAoR2V0UGFyZW50MzIgKGh3bmQpLCBXTV9OQ0xCVVRUT05VUCwKKwkJICAgIHdQYXJhbSwgbFBhcmFtKTsKKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgTFJFU1VMVAorU1dfUGFpbnQoU1RBVFVTV0lORE9XSU5GTyAqc2VsZiwgSFdORDMyIGh3bmQpCit7CisgICAgSERDMzIgaGRjOworICAgIFBBSU5UU1RSVUNUMzIJcHM7CisKKyAgICBoZGMgPSBCZWdpblBhaW50MzIoaHduZCwgJnBzKTsKKyAgICBTV19SZWZyZXNoKGh3bmQsIGhkYywgc2VsZik7CisgICAgRW5kUGFpbnQzMihod25kLCAmcHMpOworICAgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBMUkVTVUxUCitTV19XTVNldEZvbnQgKFNUQVRVU1dJTkRPV0lORk8gKnNlbGYsIEhXTkQzMiBod25kLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCit7CisgICAgSERDMzIgaGRjOworCisgICAgc2VsZi0+aEZvbnQgPSAoSEZPTlQzMil3UGFyYW07CisgICAgaWYgKExPV09SRChsUGFyYW0pID09IFRSVUUpIHsKKyAgICAgICAgaGRjID0gR2V0REMzMihod25kKTsKKyAgICAgICAgU1dfUmVmcmVzaChod25kLCBoZGMsIHNlbGYpOworICAgICAgICBSZWxlYXNlREMzMihod25kLCBoZGMpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgTFJFU1VMVAorU1dfV01TZXRUZXh0IChTVEFUVVNXSU5ET1dJTkZPICpzZWxmLCBIV05EMzIgaHduZCwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworICAgIGludCBsZW47CisgICAgU1RBVFVTV0lORE9XUEFSVCAqcGFydDsKKworICAgIGlmIChzZWxmLT5udW1QYXJ0cyA9PSAwKSByZXR1cm4gRkFMU0U7CisKKyAgICBwYXJ0ID0gJnNlbGYtPnBhcnRzWzBdOworICAgIC8qIGR1cGxpY2F0ZSBzdHJpbmcgKi8KKyAgICBpZiAocGFydC0+dGV4dCkKKyAgICAgICAgSGVhcEZyZWUoU3lzdGVtSGVhcCwgMCwgcGFydC0+dGV4dCk7CisgICAgcGFydC0+dGV4dCA9IDA7CisgICAgaWYgKGxQYXJhbSAmJiAobGVuID0gbHN0cmxlbjMyQSgoTFBDU1RSKWxQYXJhbSkpKSB7CisgICAgICAgIHBhcnQtPnRleHQgPSBIZWFwQWxsb2MoU3lzdGVtSGVhcCwgMCwgbGVuKzEpOworICAgICAgICBsc3RyY3B5MzJBKHBhcnQtPnRleHQsIChMUENTVFIpbFBhcmFtKTsKKyAgICB9CisgICAgSW52YWxpZGF0ZVJlY3QzMihod25kLCAmcGFydC0+Ym91bmQsIEZBTFNFKTsKKworICAgIHJldHVybiBUUlVFOworfQorCisKIHN0YXRpYyBMUkVTVUxUCiBTV19TaXplKFNUQVRVU1dJTkRPV0lORk8gKnNlbGYsIEhXTkQzMiBod25kLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCiB7CkBAIC0zNDcsNTYgKzc1MSw0OCBAQAogCS8qIHdpZHRoIGFuZCBoZWlnaHQgZG9uJ3QgYXBwbHkgKi8KIAlwYXJlbnQgPSBHZXRQYXJlbnQzMihod25kKTsKIAlHZXRDbGllbnRSZWN0MzIocGFyZW50LCAmcGFyZW50X3JlY3QpOwotCWhlaWdodCA9IChzZWxmLT50ZXh0SGVpZ2h0ICogMykvMjsKIAl3aWR0aCA9IHBhcmVudF9yZWN0LnJpZ2h0IC0gcGFyZW50X3JlY3QubGVmdDsKIAl4ID0gcGFyZW50X3JlY3QubGVmdDsKLQl5ID0gcGFyZW50X3JlY3QuYm90dG9tIC0gaGVpZ2h0OwotCU1vdmVXaW5kb3czMihod25kLCBwYXJlbnRfcmVjdC5sZWZ0LCBwYXJlbnRfcmVjdC5ib3R0b20gLSBoZWlnaHQgLSAxLAotCQkgICAgIHdpZHRoLCBoZWlnaHQsIFRSVUUpOworCXkgPSBwYXJlbnRfcmVjdC5ib3R0b20gLSBzZWxmLT5oZWlnaHQ7CisJTW92ZVdpbmRvdzMyKGh3bmQsIHBhcmVudF9yZWN0LmxlZnQsIHBhcmVudF9yZWN0LmJvdHRvbSAtIHNlbGYtPmhlaWdodCwKKwkJICAgICB3aWR0aCwgc2VsZi0+aGVpZ2h0LCBUUlVFKTsKIAlTV19TZXRQYXJ0Qm91bmRzKGh3bmQsIHNlbGYpOwogICAgIH0KICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIExSRVNVTFQKLVNXX0Rlc3Ryb3koU1RBVFVTV0lORE9XSU5GTyAqc2VsZiwgSFdORDMyIGh3bmQsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKLXsKLSAgICBpbnQJaTsKIAotICAgIGZvciAoaSA9IDA7IGkgPCBzZWxmLT5udW1QYXJ0czsgaSsrKSB7Ci0JaWYgKHNlbGYtPnBhcnRzW2ldLnRleHQgJiYgKHNlbGYtPnBhcnRzW2ldLnN0eWxlICE9IFNCVF9PV05FUkRSQVcpKQotCSAgICBIZWFwRnJlZShTeXN0ZW1IZWFwLCAwLCBzZWxmLT5wYXJ0c1tpXS50ZXh0KTsKLSAgICB9Ci0gICAgaWYgKHNlbGYtPnBhcnQwLnRleHQgJiYgKHNlbGYtPnBhcnQwLnN0eWxlICE9IFNCVF9PV05FUkRSQVcpKQotCUhlYXBGcmVlKFN5c3RlbUhlYXAsIDAsIHNlbGYtPnBhcnQwLnRleHQpOwotICAgIEhlYXBGcmVlKFN5c3RlbUhlYXAsIDAsIHNlbGYtPnBhcnRzKTsKK3N0YXRpYyBMUkVTVUxUCitTV19TZW5kTm90aWZ5IChIV05EMzIgaHduZCwgVUlOVDMyIGNvZGUpCit7CisgICAgV05EICAgICp3bmRQdHI7CisgICAgTk1IRFIgIG5taGRyOworCisgICAgd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoaHduZCk7CisgICAgbm1oZHIuaHduZEZyb20gPSBod25kOworICAgIG5taGRyLmlkRnJvbSA9IHduZFB0ci0+d0lEbWVudTsKKyAgICBubWhkci5jb2RlID0gY29kZTsKKyAgICBTZW5kTWVzc2FnZTMyQSAoR2V0UGFyZW50MzIgKGh3bmQpLCBXTV9OT1RJRlksIDAsIChMUEFSQU0pJm5taGRyKTsKKwogICAgIHJldHVybiAwOwogfQogCiAKIAotc3RhdGljIExSRVNVTFQKLVNXX1BhaW50KFNUQVRVU1dJTkRPV0lORk8gKnNlbGYsIEhXTkQzMiBod25kKQotewotICAgIEhEQzMyIGhkYzsKLSAgICBQQUlOVFNUUlVDVDMyCXBzOwotCi0gICAgaGRjID0gQmVnaW5QYWludDMyKGh3bmQsICZwcyk7Ci0gICAgU1dfUmVmcmVzaChod25kLCBoZGMsIHNlbGYpOwotICAgIEVuZFBhaW50MzIoaHduZCwgJnBzKTsKLSAgICByZXR1cm4gMDsKLX0KLQotTFJFU1VMVCBXSU5BUEkgU3RhdHVzV2luZG93UHJvYyggSFdORDMyIGh3bmQsIFVJTlQzMiBtc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0gKQorTFJFU1VMVCBXSU5BUEkKK1N0YXR1c1dpbmRvd1Byb2MgKEhXTkQzMiBod25kLCBVSU5UMzIgbXNnLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCiB7CiAgICAgU1RBVFVTV0lORE9XSU5GTyAqc2VsZjsKKyAgICBXTkQgKnduZFB0cjsKIAorICAgIHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKGh3bmQpOwogICAgIHNlbGYgPSBHZXRTdGF0dXNJbmZvKGh3bmQpOwogCiAgICAgc3dpdGNoIChtc2cpIHsKICAgICBjYXNlIFNCX0dFVEJPUkRFUlM6CiAJcmV0dXJuIFNXX0dldEJvcmRlcnMoc2VsZiwgaHduZCwgd1BhcmFtLCBsUGFyYW0pOworICAgIGNhc2UgU0JfR0VUSUNPTjoKKyAgICAgICAgcmV0dXJuIFNXX0dldEljb24oc2VsZiwgaHduZCwgd1BhcmFtLCBsUGFyYW0pOwogICAgIGNhc2UgU0JfR0VUUEFSVFM6CiAJcmV0dXJuIFNXX0dldFBhcnRzKHNlbGYsIGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKICAgICBjYXNlIFNCX0dFVFJFQ1Q6CkBAIC00MDUsNiArODAxLDEyIEBACiAJcmV0dXJuIFNXX0dldFRleHQoc2VsZiwgaHduZCwgd1BhcmFtLCBsUGFyYW0pOwogICAgIGNhc2UgU0JfR0VUVEVYVExFTkdUSDMyQToKIAlyZXR1cm4gU1dfR2V0VGV4dExlbmd0aChzZWxmLCBod25kLCB3UGFyYW0sIGxQYXJhbSk7CisgICAgY2FzZSBTQl9JU1NJTVBMRToKKyAgICAgICAgcmV0dXJuIHNlbGYtPnNpbXBsZTsKKyAgICBjYXNlIFNCX1NFVEJLQ09MT1I6CisgICAgICAgIHJldHVybiBTV19TZXRCa0NvbG9yKHNlbGYsIGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKKyAgICBjYXNlIFNCX1NFVElDT046CisgICAgICAgIHJldHVybiBTV19TZXRJY29uKHNlbGYsIGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKICAgICBjYXNlIFNCX1NFVE1JTkhFSUdIVDoKIAlyZXR1cm4gU1dfU2V0TWluSGVpZ2h0KHNlbGYsIGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKICAgICBjYXNlIFNCX1NFVFBBUlRTOgkKQEAgLTQxNSwxOCArODE3LDcwIEBACiAJcmV0dXJuIFNXX1NpbXBsZShzZWxmLCBod25kLCB3UGFyYW0sIGxQYXJhbSk7CiAKICAgICBjYXNlIFdNX0NSRUFURToKLQlyZXR1cm4gU1dfQ3JlYXRlKHNlbGYsIGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKKwlyZXR1cm4gU1dfQ3JlYXRlKGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKICAgICBjYXNlIFdNX0RFU1RST1k6CiAJcmV0dXJuIFNXX0Rlc3Ryb3koc2VsZiwgaHduZCwgd1BhcmFtLCBsUGFyYW0pOworICAgIGNhc2UgV01fR0VURk9OVDoKKyAgICAgICAgcmV0dXJuIHNlbGYtPmhGb250OworICAgIGNhc2UgV01fR0VUVEVYVDoKKyAgICAgICAgcmV0dXJuIFNXX1dNR2V0VGV4dChzZWxmLCBod25kLCB3UGFyYW0sIGxQYXJhbSk7CisgICAgY2FzZSBXTV9HRVRURVhUTEVOR1RIOgorICAgICAgICByZXR1cm4gU1dfV01HZXRUZXh0TGVuZ3RoKHNlbGYsIGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKKworICAgIGNhc2UgV01fTEJVVFRPTkRCTENMSzoKKyAgICAgICAgcmV0dXJuIFNXX1NlbmROb3RpZnkgKGh3bmQsIE5NX0RCTENMSyk7CisKKyAgICBjYXNlIFdNX0xCVVRUT05VUDoKKwlyZXR1cm4gU1dfU2VuZE5vdGlmeSAoaHduZCwgTk1fQ0xJQ0spOworCisgICAgY2FzZSBXTV9OQ0hJVFRFU1Q6CisgICAgICAgIHJldHVybiBTV19OY0hpdFRlc3QgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCisgICBjYXNlIFdNX05DTEJVVFRPTkRPV046CisJcmV0dXJuIFNXX05jTEJ1dHRvbkRvd24gKGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKKworICAgIGNhc2UgV01fTkNMQlVUVE9OVVA6CisJcmV0dXJuIFNXX05jTEJ1dHRvblVwIChod25kLCB3UGFyYW0sIGxQYXJhbSk7CisKICAgICBjYXNlIFdNX1BBSU5UOgogCXJldHVybiBTV19QYWludChzZWxmLCBod25kKTsKKyAgICBjYXNlIFdNX1JCVVRUT05EQkxDTEs6CisgICAgICAgIHJldHVybiBTV19TZW5kTm90aWZ5IChod25kLCBOTV9SREJMQ0xLKTsKKyAgICBjYXNlIFdNX1JCVVRUT05VUDoKKyAgICAgICAgcmV0dXJuIFNXX1NlbmROb3RpZnkgKGh3bmQsIE5NX1JDTElDSyk7CisgICAgY2FzZSBXTV9TRVRGT05UOgorICAgICAgICByZXR1cm4gU1dfV01TZXRGb250KHNlbGYsIGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKKyAgICBjYXNlIFdNX1NFVFRFWFQ6CisgICAgICAgIHJldHVybiBTV19XTVNldFRleHQoc2VsZiwgaHduZCwgd1BhcmFtLCBsUGFyYW0pOwogICAgIGNhc2UgV01fU0laRToKIAlyZXR1cm4gU1dfU2l6ZShzZWxmLCBod25kLCB3UGFyYW0sIGxQYXJhbSk7CiAgICAgZGVmYXVsdDoKLQlyZXR1cm4gRGVmV2luZG93UHJvYzMyQShod25kLCBtc2csIHdQYXJhbSwgbFBhcmFtKTsKKwlyZXR1cm4gRGVmV2luZG93UHJvYzMyQSAoaHduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSk7CiAgICAgfQogICAgIHJldHVybiAwOwogfQogCiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFNUQVRVU19SZWdpc3RlciBbSW50ZXJuYWxdCisgKgorICogUmVnaXN0ZXJzIHRoZSBzdGF0dXMgd2luZG93IGNsYXNzLgorICovCit2b2lkIFNUQVRVU19SZWdpc3Rlcih2b2lkKQoreworICAgIFdORENMQVNTMzJBIHduZENsYXNzOworCisgICAgaWYoIEdsb2JhbEZpbmRBdG9tMzJBKCBTVEFUVVNDTEFTU05BTUUzMkEgKSApIHJldHVybjsKKworICAgIFplcm9NZW1vcnkoICZ3bmRDbGFzcywgc2l6ZW9mKCBXTkRDTEFTUzMyQSApICk7CisgICAgd25kQ2xhc3Muc3R5bGUgICAgICAgICA9IENTX0dMT0JBTENMQVNTIHwgQ1NfREJMQ0xLUyB8IENTX1ZSRURSQVc7CisgICAgd25kQ2xhc3MubHBmblduZFByb2MgICA9IChXTkRQUk9DMzIpU3RhdHVzV2luZG93UHJvYzsKKyAgICB3bmRDbGFzcy5jYkNsc0V4dHJhICAgID0gMDsKKyAgICB3bmRDbGFzcy5jYlduZEV4dHJhICAgID0gc2l6ZW9mKFNUQVRVU1dJTkRPV0lORk8gKik7CisgICAgd25kQ2xhc3MuaEN1cnNvciAgICAgICA9IExvYWRDdXJzb3IzMkEoIDAsIElEQ19BUlJPVzMyQSApOworICAgIHduZENsYXNzLmhickJhY2tncm91bmQgPSAoSEJSVVNIMzIpKENPTE9SXzNERkFDRSArIDEpOworICAgIHduZENsYXNzLmxwc3pDbGFzc05hbWUgPSBTVEFUVVNDTEFTU05BTUUzMkE7CisgCisgICAgUmVnaXN0ZXJDbGFzczMyQSggJnduZENsYXNzICk7Cit9CiAKZGlmZiAtLWdpdCBhL2NvbnRyb2xzL3VwZG93bi5jIGIvY29udHJvbHMvdXBkb3duLmMKaW5kZXggODNlMmE2ZC4uNjZjMjUzMiAxMDA2NDQKLS0tIGEvY29udHJvbHMvdXBkb3duLmMKKysrIGIvY29udHJvbHMvdXBkb3duLmMKQEAgLTc4NSwzICs3ODUsMjYgQEAKICAgICByZXR1cm4gMDsKIH0KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgVVBET1dOX1JlZ2lzdGVyIFtJbnRlcm5hbF0KKyAqCisgKiBSZWdpc3RlcnMgdGhlIHVwZG93biB3aW5kb3cgY2xhc3MuCisgKi8KK3ZvaWQgVVBET1dOX1JlZ2lzdGVyKHZvaWQpCit7CisgICAgV05EQ0xBU1MzMkEgd25kQ2xhc3M7CisKKyAgICBpZiggR2xvYmFsRmluZEF0b20zMkEoIFVQRE9XTl9DTEFTUzMyQSApICkgcmV0dXJuOworCisgICAgWmVyb01lbW9yeSggJnduZENsYXNzLCBzaXplb2YoIFdORENMQVNTMzJBICkgKTsKKyAgICB3bmRDbGFzcy5zdHlsZSAgICAgICAgID0gQ1NfR0xPQkFMQ0xBU1MgfCBDU19EQkxDTEtTIHwgQ1NfVlJFRFJBVzsKKyAgICB3bmRDbGFzcy5scGZuV25kUHJvYyAgID0gKFdORFBST0MzMilVcERvd25XaW5kb3dQcm9jOworICAgIHduZENsYXNzLmNiQ2xzRXh0cmEgICAgPSAwOworICAgIHduZENsYXNzLmNiV25kRXh0cmEgICAgPSBzaXplb2YoVVBET1dOX0lORk8pOworICAgIHduZENsYXNzLmhDdXJzb3IgICAgICAgPSBMb2FkQ3Vyc29yMzJBKCAwLCBJRENfQVJST1czMkEgKTsKKyAgICB3bmRDbGFzcy5oYnJCYWNrZ3JvdW5kID0gKEhCUlVTSDMyKShDT0xPUl8zREZBQ0UgKyAxKTsKKyAgICB3bmRDbGFzcy5scHN6Q2xhc3NOYW1lID0gVVBET1dOX0NMQVNTMzJBOworIAorICAgIFJlZ2lzdGVyQ2xhc3MzMkEoICZ3bmRDbGFzcyApOworfQorCmRpZmYgLS1naXQgYS9kZWJ1Z2dlci9icmVhay5jIGIvZGVidWdnZXIvYnJlYWsuYwppbmRleCAxN2UwNTVlLi5hY2JmY2IzIDEwMDY0NAotLS0gYS9kZWJ1Z2dlci9icmVhay5jCisrKyBiL2RlYnVnZ2VyL2JyZWFrLmMKQEAgLTM0Myw3ICszNDMsNyBAQAogCiAgICAgZm9yIChvayA9IE1vZHVsZUZpcnN0KCZlbnRyeSk7IG9rOyBvayA9IE1vZHVsZU5leHQoJmVudHJ5KSkKICAgICB7Ci0gICAgICAgIGlmICghKHBNb2R1bGUgPSBNT0RVTEVfR2V0UHRyMTYoIGVudHJ5LmhNb2R1bGUgKSkpIGNvbnRpbnVlOworICAgICAgICBpZiAoIShwTW9kdWxlID0gTkVfR2V0UHRyKCBlbnRyeS5oTW9kdWxlICkpKSBjb250aW51ZTsKICAgICAgICAgaWYgKHBNb2R1bGUtPmZsYWdzICYgTkVfRkZMQUdTX0xJQk1PRFVMRSkgY29udGludWU7ICAvKiBMaWJyYXJ5ICovCiAKICAgICAgICAgaWYgKCEocE1vZHVsZS0+ZmxhZ3MgJiBORV9GRkxBR1NfV0lOMzIpKSAgLyogTkUgbW9kdWxlICovCmRpZmYgLS1naXQgYS9kZWJ1Z2dlci9kYmcueSBiL2RlYnVnZ2VyL2RiZy55CmluZGV4IGY3OTYzZWYuLjdhMDZjNDAgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyL2RiZy55CisrKyBiL2RlYnVnZ2VyL2RiZy55CkBAIC01NDgsMjQgKzU0OCwxNiBAQAogfQogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIERlYnVnQnJlYWszMiAgIChLRVJORUwzMikKLSAqLwotdm9pZCBEZWJ1Z0JyZWFrMzIoIENPTlRFWFQgKnJlZ3MgKQotewotICAgIGNvbnN0IGNoYXIgKm1vZHVsZSA9IE1PRFVMRV9HZXRNb2R1bGVOYW1lKCBHZXRDdXJyZW50VGFzaygpICk7Ci0gICAgZnByaW50Ziggc3RkZXJyLCAiJXMgY2FsbGVkIERlYnVnQnJlYWtcbiIsIG1vZHVsZSA/IG1vZHVsZSA6ICI/Pz8iICk7Ci0gICAgREVCVUdfY29udGV4dCA9ICpyZWdzOwotICAgIERFQlVHX01haW4oIFNJR1RSQVAgKTsKLX0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgRGVidWdCcmVhazE2ICAgKEtFUk5FTC4yMDMpCisgKiAgICAgICAgICAgRGVidWdCcmVhayAgIChLRVJORUwuMjAzKSAoS0VSTkVMMzIuMTgxKQogICovCi12b2lkIERlYnVnQnJlYWsxNiggQ09OVEVYVCAqcmVncyApCit2b2lkIERlYnVnQnJlYWsoIENPTlRFWFQgKnJlZ3MgKQogewotICAgIGNvbnN0IGNoYXIgKm1vZHVsZSA9IE1PRFVMRV9HZXRNb2R1bGVOYW1lKCBHZXRDdXJyZW50VGFzaygpICk7Ci0gICAgZnByaW50Ziggc3RkZXJyLCAiJXMgY2FsbGVkIERlYnVnQnJlYWtcbiIsIG1vZHVsZSA/IG1vZHVsZSA6ICI/Pz8iICk7CisgICAgY2hhciBtb2R1bGVbMTBdOworICAgIGlmICghR2V0TW9kdWxlTmFtZSggR2V0Q3VycmVudFRhc2soKSwgbW9kdWxlLCBzaXplb2YobW9kdWxlKSApKQorICAgICAgICBzdHJjcHkoIG1vZHVsZSwgIj8/PyIgKTsKKyAgICBmcHJpbnRmKCBzdGRlcnIsICIlcyBjYWxsZWQgRGVidWdCcmVha1xuIiwgbW9kdWxlICk7CiAgICAgREVCVUdfY29udGV4dCA9ICpyZWdzOwogICAgIERFQlVHX01haW4oIFNJR1RSQVAgKTsKIH0KZGlmZiAtLWdpdCBhL2RlYnVnZ2VyL2RiZ21haW4uYyBiL2RlYnVnZ2VyL2RiZ21haW4uYwppbmRleCAyZjQ3MTMyLi4xNzg1NzE0IDEwMDY0NAotLS0gYS9kZWJ1Z2dlci9kYmdtYWluLmMKKysrIGIvZGVidWdnZXIvZGJnbWFpbi5jCkBAIC01MCwxMSArNTAsNiBAQAogICBleGl0KDApOwogfQogCi1MUFNUUiBNT0RVTEVfR2V0TW9kdWxlTmFtZSggSE1PRFVMRTE2IGhNb2R1bGUgKQotewotICBleGl0KDApOwotfQotCiBpbnQgUFJPRklMRV9HZXRXaW5lSW5pU3RyaW5nKCBjb25zdCBjaGFyICpzZWN0aW9uLCBjb25zdCBjaGFyICprZXlfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZWYsIGNoYXIgKmJ1ZmZlciwgaW50IGxlbiApCiB7CkBAIC0xMDMsNyArOTgsNyBAQAogICBleGl0KDApOwogfQogCi1ORV9NT0RVTEUgKk1PRFVMRV9HZXRQdHIxNiggSE1PRFVMRTE2IGhNb2R1bGUgKQorTkVfTU9EVUxFICpORV9HZXRQdHIoIEhNT0RVTEUxNiBoTW9kdWxlICkKIHsKICAgZXhpdCgwKTsKIH0KZGlmZiAtLWdpdCBhL2RlYnVnZ2VyL2hhc2guYyBiL2RlYnVnZ2VyL2hhc2guYwppbmRleCA0OTI3NjljLi40YmVmYTQ3IDEwMDY0NAotLS0gYS9kZWJ1Z2dlci9oYXNoLmMKKysrIGIvZGVidWdnZXIvaGFzaC5jCkBAIC04NzcsNyArODc3LDcgQEAKIAogICAgIGZvciAob2sgPSBNb2R1bGVGaXJzdCgmZW50cnkpOyBvazsgb2sgPSBNb2R1bGVOZXh0KCZlbnRyeSkpCiAgICAgewotICAgICAgICBpZiAoIShwTW9kdWxlID0gTU9EVUxFX0dldFB0cjE2KCBlbnRyeS5oTW9kdWxlICkpKSBjb250aW51ZTsKKyAgICAgICAgaWYgKCEocE1vZHVsZSA9IE5FX0dldFB0ciggZW50cnkuaE1vZHVsZSApKSkgY29udGludWU7CiAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIiAlcyIsIGVudHJ5LnN6TW9kdWxlICk7CiAKICAgICAgICAgaWYgKCEocE1vZHVsZS0+ZmxhZ3MgJiBORV9GRkxBR1NfV0lOMzIpKSAgLyogTkUgbW9kdWxlICovCmRpZmYgLS1naXQgYS9kZWJ1Z2dlci9zdGFicy5jIGIvZGVidWdnZXIvc3RhYnMuYwppbmRleCBiYjY3MGYxLi4zNmZiZTJjIDEwMDY0NAotLS0gYS9kZWJ1Z2dlci9zdGFicy5jCisrKyBiL2RlYnVnZ2VyL3N0YWJzLmMKQEAgLTExNDQsNyArMTE0NCw3IEBACiAgICAqLwogICBlaHB0ciA9IChFbGYzMl9FaGRyICopIGFkZHI7CiAKLSAgaWYoIGxvYWRfb2Zmc2V0ID09IE5VTEwgKQorICBpZiggbG9hZF9vZmZzZXQgPT0gMCApCiAgICAgewogICAgICAgREVCVUdfUmVnaXN0ZXJFTEZEZWJ1Z0luZm8oZWhwdHItPmVfZW50cnksIHN0YXRidWYuc3Rfc2l6ZSwgZmlsZW5hbWUpOwogICAgIH0KQEAgLTEyNzEsNyArMTI3MSw3IEBACiAgICAgfQogCiAgIGlmKCAgICAoZHlucG50LT5kX3RhZyAhPSBEVF9ERUJVRykKLSAgICAgIHx8IChkeW5wbnQtPmRfdW4uZF9wdHIgPT0gTlVMTCkgKQorICAgICAgfHwgKGR5bnBudC0+ZF91bi5kX3B0ciA9PSAwKSApCiAgICAgewogICAgICAgZ290byBsZWF2ZTsKICAgICB9CkBAIC0xMjk2LDcgKzEyOTYsNyBAQAogICAgICAgICogc2hhcmVkIGxpYnJhcmllcyB3aGljaCBtYXkgYmUgbG9hZGVkLgogICAgICAgICovCiAgICAgICBlaGRyID0gKEVsZjMyX0VoZHIgKikgbHBudC0+bF9hZGRyOwotICAgICAgaWYoIChscG50LT5sX2FkZHIgPT0gTlVMTCkgfHwgKGVoZHItPmVfdHlwZSAhPSBFVF9EWU4pICkKKyAgICAgIGlmKCAobHBudC0+bF9hZGRyID09IDApIHx8IChlaGRyLT5lX3R5cGUgIT0gRVRfRFlOKSApCiAJewogCSAgY29udGludWU7CiAJfQpkaWZmIC0tZ2l0IGEvZG9jdW1lbnRhdGlvbi9wcm9ncmFtcyBiL2RvY3VtZW50YXRpb24vcHJvZ3JhbXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI1Y2U5OAotLS0gL2Rldi9udWxsCisrKyBiL2RvY3VtZW50YXRpb24vcHJvZ3JhbXMKQEAgLTAsMCArMSwxMiBAQAorCitNYXksIDE5OTgJTWF0dGhldyBCZWNrZXIgKG1iZWNrZXJAZ2xhc3NjaXR5Lm5ldAorCitIZWxwLCB0aGlzIGRvZXMgbm90IHdvcmshICBXaGF0IGFtIEkgbWlzc2luZz8KKworSG93IHRvIGFkZCBhIG5ldyB0ZXN0IHByb2dyYW0KKy0gY3JlYXRlIHRoZSBkaXJlY3RvcnkgdW5kZXIgLi4uL3Byb2dyYW1zCistIGFkZCB0aGUgZGlyZWN0b3J5IHRvIFdJTkVST09UL3Byb2dyYW1zL01ha2VmaWxlLmluCistIGFkZCB0aGUgZGlyZWN0b3J5IHRvIFdJTkVST09UL2NvbmZpZ3VyZS5pbgorLSB3aGVuIGNyZWF0aW5nIHRoZSBkaWZmLCB1c2UgLU4gdG8gZm9yY2UgdGhlIGVudGlyZSB0ZXh0IHRvIGJlIGluY2x1ZGVkIGluIAorICB0aGUgZGlmZgorCmRpZmYgLS1naXQgYS9maWxlcy9kaXJlY3RvcnkuYyBiL2ZpbGVzL2RpcmVjdG9yeS5jCmluZGV4IDBmMjExZDcuLjFjOThjYWEgMTAwNjQ0Ci0tLSBhL2ZpbGVzL2RpcmVjdG9yeS5jCisrKyBiL2ZpbGVzL2RpcmVjdG9yeS5jCkBAIC0xNCw2ICsxNCw3IEBACiAKICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAid2luZXJyb3IuaCIKKyNpbmNsdWRlICJwcm9jZXNzLmgiCiAjaW5jbHVkZSAiZHJpdmUuaCIKICNpbmNsdWRlICJmaWxlLmgiCiAjaW5jbHVkZSAiaGVhcC5oIgpAQCAtNDU0LDEzICs0NTUsMjAgQEAKICAqLwogc3RhdGljIEJPT0wzMiBESVJfVHJ5TW9kdWxlUGF0aCggTFBDU1RSIG5hbWUsIERPU19GVUxMX05BTUUgKmZ1bGxfbmFtZSApCiB7CisgICAgUERCMzIJKnBkYiA9IFBST0NFU1NfQ3VycmVudCgpOworCiAgICAgLyogRklYTUU6IGZvciBub3csIEdldE1vZHVsZUZpbGVOYW1lMzJBIGNhbid0IHJldHVybiBtb3JlICovCiAgICAgLyogdGhhbiBPRlNfTUFYUEFUSE5BTUUuIFRoaXMgbWF5IGNoYW5nZSB3aXRoIFdpbjMyLiAqLworCiAgICAgY2hhciBidWZmZXJbT0ZTX01BWFBBVEhOQU1FXTsKICAgICBMUFNUUiBwOwogCi0gICAgaWYgKCFHZXRDdXJyZW50VGFzaygpKSByZXR1cm4gRkFMU0U7Ci0gICAgR2V0TW9kdWxlRmlsZU5hbWUzMkEoIEdldEN1cnJlbnRUYXNrKCksIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikgKTsKKyAgICBpZiAocGRiLT5mbGFncyAmIFBEQjMyX1dJTjE2X1BST0MpIHsKKwlpZiAoIUdldEN1cnJlbnRUYXNrKCkpIHJldHVybiBGQUxTRTsKKwlHZXRNb2R1bGVGaWxlTmFtZTE2KCBHZXRDdXJyZW50VGFzaygpLCBidWZmZXIsIHNpemVvZihidWZmZXIpICk7CisgICAgfSBlbHNlIHsKKwlHZXRNb2R1bGVGaWxlTmFtZTMyQSggMCwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSApOworICAgIH0KICAgICBpZiAoIShwID0gc3RycmNociggYnVmZmVyLCAnXFwnICkpKSByZXR1cm4gRkFMU0U7CiAgICAgaWYgKHNpemVvZihidWZmZXIpIC0gKCsrcCAtIGJ1ZmZlcikgPD0gc3RybGVuKG5hbWUpKSByZXR1cm4gRkFMU0U7CiAgICAgc3RyY3B5KCBwLCBuYW1lICk7CmRpZmYgLS1naXQgYS9maWxlcy9kb3NfZnMuYyBiL2ZpbGVzL2Rvc19mcy5jCmluZGV4IGU3YjVhNGYuLjM5ZmJhMTcgMTAwNjQ0Ci0tLSBhL2ZpbGVzL2Rvc19mcy5jCisrKyBiL2ZpbGVzL2Rvc19mcy5jCkBAIC0xOCw5ICsxOCw2IEBACiAjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CiAjaW5jbHVkZSA8dGltZS5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2lmZGVmIEhBVkVfU1lTX1NUQVRGU19ICi0jIGluY2x1ZGUgPHN5cy9zdGF0ZnMuaD4KLSNlbmRpZgogCiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgIndpbmVycm9yLmgiCkBAIC02MTksNyArNjE2LDcgQEAKIAkJCQlicmVhazsKIAkJCX0KIAkJfQotCQkvKiBGSVhNRTogdGhlIHJlc3Qgb2YgdGhlIGRldmljZXMgLi4uIGxwdFgsIGNvbVggZXQuYWwuICovCisJCUZJWE1FKGRvc2ZzLCJkZXZpY2Ugb3BlbiAlcyBub3Qgc3VwcG9ydGVkICh5ZXQpXG4iLERPU0ZTX0RldmljZXNbaV0pOwogICAgIAkJcmV0dXJuIEhGSUxFX0VSUk9SMzI7CiAJICAgIH0KICAgICAgICAgfQpAQCAtODM3LDcgKzgzNCw3IEBACiB7CiAgICAgRE9TX0ZVTExfTkFNRSBmdWxsX25hbWU7CiAKLSAgICAvKiBGSVhNRTogaXMgaXQgY29ycmVjdCB0byBhbHdheXMgcmV0dXJuIGEgZnVsbHkgcXVhbGlmaWVkIHNob3J0IHBhdGg/ICovCisgICAgLyogRklYTUU6IElzIGl0IGNvcnJlY3QgdG8gcmV0dXJuIGEgVU5JWCBzdHlsZSBwYXRoIGhlcmU/ICovCiAgICAgaWYgKCFET1NGU19HZXRGdWxsTmFtZSggc2hvcnRwYXRoLCBUUlVFLCAmZnVsbF9uYW1lICkpIHJldHVybiAwOwogICAgIGxzdHJjcHluMzJBKCBsb25ncGF0aCwgZnVsbF9uYW1lLmxvbmdfbmFtZSwgbG9uZ2xlbiApOwogICAgIHJldHVybiBzdHJsZW4oIGZ1bGxfbmFtZS5sb25nX25hbWUgKTsKZGlmZiAtLWdpdCBhL2ZpbGVzL2RyaXZlLmMgYi9maWxlcy9kcml2ZS5jCmluZGV4IGMwN2QzNTAuLmE1MTY4YmMgMTAwNjQ0Ci0tLSBhL2ZpbGVzL2RyaXZlLmMKKysrIGIvZmlsZXMvZHJpdmUuYwpAQCAtMTYsMTcgKzE2LDE5IEBACiAjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDxlcnJuby5oPgogCi0jaWZkZWYgSEFWRV9TWVNfVkZTX0gKLSMgaW5jbHVkZSA8c3lzL3Zmcy5oPgotI2VuZGlmCiAjaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAogIyBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KICNlbmRpZgotI2lmZGVmIEhBVkVfU1lTX01PVU5UX0gKLSMgaW5jbHVkZSA8c3lzL21vdW50Lmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1NZU19TVEFURlNfSAotIyBpbmNsdWRlIDxzeXMvc3RhdGZzLmg+CisjaWZkZWYgU1RBVEZTX0RFRklORURfQllfU1lTX1ZGUworIyBpbmNsdWRlIDxzeXMvdmZzLmg+CisjZWxzZQorIyBpZmRlZiBTVEFURlNfREVGSU5FRF9CWV9TWVNfTU9VTlQKKyMgIGluY2x1ZGUgPHN5cy9tb3VudC5oPgorIyBlbHNlCisjICBpZmRlZiBTVEFURlNfREVGSU5FRF9CWV9TWVNfU1RBVEZTCisjICAgaW5jbHVkZSA8c3lzL3N0YXRmcy5oPgorIyAgZW5kaWYKKyMgZW5kaWYKICNlbmRpZgogCiAjaW5jbHVkZSAid2luZG93cy5oIgpkaWZmIC0tZ2l0IGEvZmlsZXMvcHJvZmlsZS5jIGIvZmlsZXMvcHJvZmlsZS5jCmluZGV4IDAzN2NmYjAuLmUxYzM1NDQgMTAwNjQ0Ci0tLSBhL2ZpbGVzL3Byb2ZpbGUuYworKysgYi9maWxlcy9wcm9maWxlLmMKQEAgLTQ5NCw3ICs0OTQsNyBAQAogICAgICAgICBzZWN0aW9uID0gc2VjdGlvbi0+bmV4dDsKICAgICB9CiAgICAgYnVmZmVyWzBdID0gYnVmZmVyWzFdID0gJ1wwJzsKLSAgICByZXR1cm4gMjsKKyAgICByZXR1cm4gMDsKIH0KIAogCmRpZmYgLS1naXQgYS9ncmFwaGljcy9kZHJhdy5jIGIvZ3JhcGhpY3MvZGRyYXcuYwppbmRleCA5MmMxMThmLi42NmRmODA0IDEwMDY0NAotLS0gYS9ncmFwaGljcy9kZHJhdy5jCisrKyBiL2dyYXBoaWNzL2RkcmF3LmMKQEAgLTE0NCw3ICsxNDQsNyBAQAogCX07CiAJZm9yIChpPTA7aTxzaXplb2YoZmxhZ3MpL3NpemVvZihmbGFnc1swXSk7aSsrKQogCQlpZiAoZmxhZ3NbaV0ubWFzayAmIGZsYWdtYXNrKQotCQkJRFVNUCgiJXMgIixpLGZsYWdzW2ldLm5hbWUpOworCQkJRFVNUCgiJXMgIixmbGFnc1tpXS5uYW1lKTsKIAlEVU1QKCJcbiIpOwogfQogCkBAIC0xODQsNyArMTg0LDcgQEAKIAl9OwogCWZvciAoaT0wO2k8c2l6ZW9mKGZsYWdzKS9zaXplb2YoZmxhZ3NbMF0pO2krKykKIAkJaWYgKGZsYWdzW2ldLm1hc2sgJiBmbGFnbWFzaykKLQkJCURVTVAoIiVzICIsaSxmbGFnc1tpXS5uYW1lKTsKKwkJCURVTVAoIiVzICIsZmxhZ3NbaV0ubmFtZSk7CiB9CiAKIHN0YXRpYyB2b2lkIF9kdW1wX0REU0NBUFMoRFdPUkQgZmxhZ21hc2spIHsKQEAgLTIzMSw3ICsyMzEsNyBAQAogCURVTVAoIlxuIik7CiB9CiAKLXN0YXRpYyB2b2lkIF9kdW1wX0REQ0FQUyhEV09SRCBmbGFnbWFzaykgewordm9pZCBfZHVtcF9ERENBUFMoRFdPUkQgZmxhZ21hc2spIHsKIAlpbnQJaTsKIAljb25zdCBzdHJ1Y3QgewogCQlEV09SRAltYXNrOwpAQCAtMzAyLDcgKzMwMiw3IEBACiAJfTsKIAlmb3IgKGk9MDtpPHNpemVvZihmbGFncykvc2l6ZW9mKGZsYWdzWzBdKTtpKyspCiAJCWlmIChmbGFnc1tpXS5tYXNrICYgZmxhZ21hc2spCi0JCQlEVU1QKCIlcyAiLGksZmxhZ3NbaV0ubmFtZSk7CisJCQlEVU1QKCIlcyAiLGZsYWdzW2ldLm5hbWUpOwogCURVTVAoIlxuIik7CiB9CiAKQEAgLTEwMzEsNiArMTAzMSwyOSBAQAogCQl0aGlzLT5wYWxlbnRzW2ldLnBlQmx1ZSA9IHBhbGVudFtpLXN0YXJ0XS5wZUJsdWU7CiAJCXRoaXMtPnBhbGVudHNbaV0ucGVHcmVlbiA9IHBhbGVudFtpLXN0YXJ0XS5wZUdyZWVuOwogCX0KKworLyogSW5zb21uaWEncyAoU3RlYSBHcmVlbmUncykgTW9kcyBTdGFydCBIZXJlICovCisvKiBGSVhNRTogU3RpbGwgc2hvdWxkIGZyZWUgaW5kaXZpZHVhbCBjZWxscywgYnV0IHRoaXMgZml4ZXMgbG9zcyBvZiAqLworLyogICAgICAgIHVuY2hhbmdlIHNlY3Rpb25zIG9mIG9sZCBwYWxldHRlICovCisKKwlmb3IgKGk9MDtpPHN0YXJ0O2krKykgeworCQl4Yy5yZWQgPSB0aGlzLT5wYWxlbnRzW2ldLnBlUmVkPDw4OworCQl4Yy5ibHVlID0gdGhpcy0+cGFsZW50c1tpXS5wZUJsdWU8PDg7CisJCXhjLmdyZWVuID0gdGhpcy0+cGFsZW50c1tpXS5wZUdyZWVuPDw4OworCQl4Yy5mbGFncyA9IERvUmVkfERvQmx1ZXxEb0dyZWVuOworCQl4Yy5waXhlbCA9IGk7CisJCVRTWFN0b3JlQ29sb3IoZGlzcGxheSx0aGlzLT5jbSwmeGMpOworCX0KKwlmb3IgKGk9ZW5kO2k8MjU2O2krKykgeworCQl4Yy5yZWQgPSB0aGlzLT5wYWxlbnRzW2ldLnBlUmVkPDw4OworCQl4Yy5ibHVlID0gdGhpcy0+cGFsZW50c1tpXS5wZUJsdWU8PDg7CisJCXhjLmdyZWVuID0gdGhpcy0+cGFsZW50c1tpXS5wZUdyZWVuPDw4OworCQl4Yy5mbGFncyA9IERvUmVkfERvQmx1ZXxEb0dyZWVuOworCQl4Yy5waXhlbCA9IGk7CisJCVRTWFN0b3JlQ29sb3IoZGlzcGxheSx0aGlzLT5jbSwmeGMpOworCX0KKy8qIEVuZCBJbnNvbW5pYSdzIE1vZHMgKi8KKwogCVhGODZER0FJbnN0YWxsQ29sb3JtYXAoZGlzcGxheSxEZWZhdWx0U2NyZWVuKGRpc3BsYXkpLHRoaXMtPmNtKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTEyNDgsNyArMTI3MSw2IEBACiAJTFBESVJFQ1REUkFXIHRoaXMsRFdPUkQgd2lkdGgsRFdPUkQgaGVpZ2h0LERXT1JEIGRlcHRoCiApIHsKIAlpbnQJaSwqZGVwdGhzLGRlcGNvdW50OwotCWNoYXIJYnVmWzIwMF07CiAKIAlUUkFDRShkZHJhdywgIiglcCktPiglbGQsJWxkLCVsZClcbiIsCiAJCSAgICAgIHRoaXMsIHdpZHRoLCBoZWlnaHQsIGRlcHRoKTsKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL21hcHBpbmcuYyBiL2dyYXBoaWNzL21hcHBpbmcuYwppbmRleCAwNjAwZTk0Li41MmViN2EzIDEwMDY0NAotLS0gYS9ncmFwaGljcy9tYXBwaW5nLmMKKysrIGIvZ3JhcGhpY3MvbWFwcGluZy5jCkBAIC01NiwzNSArNTYsMTMgQEAKICAqLwogQk9PTDMyIFdJTkFQSSBEUHRvTFAzMiggSERDMzIgaGRjLCBMUFBPSU5UMzIgcG9pbnRzLCBJTlQzMiBjb3VudCApCiB7Ci0gICAgRkxPQVQgZGV0ZXJtaW5hbnQ9MS4wLCB4LCB5OwotICAgIAogICAgIERDICogZGMgPSAoREMgKikgR0RJX0dldE9ialB0ciggaGRjLCBEQ19NQUdJQyApOwogICAgIGlmICghZGMpIHJldHVybiBGQUxTRTsKIAotICAgIGlmIChkYy0+dy5Vc2VXb3JsZFhmb3JtKQotICAgIHsKLSAgICAgICAgZGV0ZXJtaW5hbnQgPSBkYy0+dy5Xb3JsZFhmb3JtLmVNMTEqZGMtPncuV29ybGRYZm9ybS5lTTIyIC0KLSAgICAgICAgICAgIGRjLT53LldvcmxkWGZvcm0uZU0xMipkYy0+dy5Xb3JsZFhmb3JtLmVNMjE7Ci0gICAgICAgIGlmIChkZXRlcm1pbmFudCA+IC0xZS0xMiAmJiBkZXRlcm1pbmFudCA8IDFlLTEyKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQogICAgIHdoaWxlIChjb3VudC0tKQogICAgIHsKLQlpZiAoZGMtPncuVXNlV29ybGRYZm9ybSkKLQl7Ci0gICAgICAgICAgICB4ID0gKEZMT0FUKVhEUFRPTFAoIGRjLCBwb2ludHMtPnggKSAtIGRjLT53LldvcmxkWGZvcm0uZUR4OwotCSAgICB5ID0gKEZMT0FUKVlEUFRPTFAoIGRjLCBwb2ludHMtPnkgKSAtIGRjLT53LldvcmxkWGZvcm0uZUR5OwotCSAgICBwb2ludHMtPnggPSAoSU5UMzIpKCAoeCpkYy0+dy5Xb3JsZFhmb3JtLmVNMjIgLQotCSAgICAgICB5KmRjLT53LldvcmxkWGZvcm0uZU0yMSkgLyBkZXRlcm1pbmFudCApOwotCSAgICBwb2ludHMtPnkgPSAoSU5UMzIpKCAoLXgqZGMtPncuV29ybGRYZm9ybS5lTTEyICsKLQkgICAgICAgeSpkYy0+dy5Xb3JsZFhmb3JtLmVNMTEpIC8gZGV0ZXJtaW5hbnQgKTsKLQl9Ci0JZWxzZQotCXsKLQkgICAgcG9pbnRzLT54ID0gWERQVE9MUCggZGMsIHBvaW50cy0+eCApOwotCSAgICBwb2ludHMtPnkgPSBZRFBUT0xQKCBkYywgcG9pbnRzLT55ICk7Ci0JfQorICAgICAgICBpZiAoIUlOVEVSTkFMX0RQVE9MUCggZGMsIHBvaW50cyApKQorCSAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIHBvaW50cysrOwogICAgIH0KICAgICByZXR1cm4gVFJVRTsKQEAgLTExNCwzMCArOTIsMTIgQEAKICAqLwogQk9PTDMyIFdJTkFQSSBMUHRvRFAzMiggSERDMzIgaGRjLCBMUFBPSU5UMzIgcG9pbnRzLCBJTlQzMiBjb3VudCApCiB7Ci0gICAgRkxPQVQgeCwgeTsKLQogICAgIERDICogZGMgPSAoREMgKikgR0RJX0dldE9ialB0ciggaGRjLCBEQ19NQUdJQyApOwogICAgIGlmICghZGMpIHJldHVybiBGQUxTRTsKIAogICAgIHdoaWxlIChjb3VudC0tKQogICAgIHsKLQlpZiAoZGMtPncuVXNlV29ybGRYZm9ybSkKLQl7Ci0JICAgIHggPSAoRkxPQVQpcG9pbnRzLT54ICogZGMtPncuV29ybGRYZm9ybS5lTTExICsKLQkgICAgCShGTE9BVClwb2ludHMtPnkgKiBkYy0+dy5Xb3JsZFhmb3JtLmVNMjEgKwotCQlkYy0+dy5Xb3JsZFhmb3JtLmVEeDsKLQkgICAgeSA9IChGTE9BVClwb2ludHMtPnggKiBkYy0+dy5Xb3JsZFhmb3JtLmVNMTIgKwotCSAgICAgICAgKEZMT0FUKXBvaW50cy0+eSAqIGRjLT53LldvcmxkWGZvcm0uZU0yMiArCi0JCWRjLT53LldvcmxkWGZvcm0uZUR5OwotCSAgICBwb2ludHMtPnggPSBYTFBUT0RQKCBkYywgKElOVDMyKXggKTsKLQkgICAgcG9pbnRzLT55ID0gWUxQVE9EUCggZGMsIChJTlQzMil5ICk7Ci0JICAgIAotCX0KLQllbHNlCi0JewotCSAgICBwb2ludHMtPnggPSBYTFBUT0RQKCBkYywgcG9pbnRzLT54ICk7Ci0JICAgIHBvaW50cy0+eSA9IFlMUFRPRFAoIGRjLCBwb2ludHMtPnkgKTsKLQl9CisJSU5URVJOQUxfTFBUT0RQKCBkYywgcG9pbnRzICk7CiAgICAgICAgIHBvaW50cysrOwogICAgIH0KICAgICByZXR1cm4gVFJVRTsKQEAgLTIzMCw2ICsxOTAsNyBAQAogCSAgcmV0dXJuIHByZXZNb2RlOwogICAgIH0KICAgICBkYy0+dy5NYXBNb2RlID0gbW9kZTsKKyAgICBEQ19VcGRhdGVYZm9ybXMoIGRjICk7CiAgICAgcmV0dXJuIHByZXZNb2RlOwogfQogCkBAIC0yNzcsNiArMjM4LDcgQEAKICAgICBkYy0+dnBvcnRFeHRYID0geDsKICAgICBkYy0+dnBvcnRFeHRZID0geTsKICAgICBpZiAoZGMtPncuTWFwTW9kZSA9PSBNTV9JU09UUk9QSUMpIE1BUFBJTkdfRml4SXNvdHJvcGljKCBkYyApOworICAgIERDX1VwZGF0ZVhmb3JtcyggZGMgKTsKICAgICByZXR1cm4gVFJVRTsKIH0KIApAQCAtMzIwLDYgKzI4Miw3IEBACiAgICAgfQogICAgIGRjLT52cG9ydE9yZ1ggPSB4OwogICAgIGRjLT52cG9ydE9yZ1kgPSB5OworICAgIERDX1VwZGF0ZVhmb3JtcyggZGMgKTsKICAgICByZXR1cm4gVFJVRTsKIH0KIApAQCAtMzY2LDYgKzMyOSw3IEBACiAgICAgZGMtPnduZEV4dFggPSB4OwogICAgIGRjLT53bmRFeHRZID0geTsKICAgICBpZiAoZGMtPncuTWFwTW9kZSA9PSBNTV9JU09UUk9QSUMpIE1BUFBJTkdfRml4SXNvdHJvcGljKCBkYyApOworICAgIERDX1VwZGF0ZVhmb3JtcyggZGMgKTsKICAgICByZXR1cm4gVFJVRTsKIH0KIApAQCAtNDA4LDYgKzM3Miw3IEBACiAgICAgfQogICAgIGRjLT53bmRPcmdYID0geDsKICAgICBkYy0+d25kT3JnWSA9IHk7CisgICAgRENfVXBkYXRlWGZvcm1zKCBkYyApOwogICAgIHJldHVybiBUUlVFOwogfQogCkBAIC00NTEsNiArNDE2LDcgQEAKICAgICB9CiAgICAgZGMtPnZwb3J0T3JnWCArPSB4OwogICAgIGRjLT52cG9ydE9yZ1kgKz0geTsKKyAgICBEQ19VcGRhdGVYZm9ybXMoIGRjICk7CiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKQEAgLTQ5NCw2ICs0NjAsNyBAQAogICAgIH0KICAgICBkYy0+d25kT3JnWCArPSB4OwogICAgIGRjLT53bmRPcmdZICs9IHk7CisgICAgRENfVXBkYXRlWGZvcm1zKCBkYyApOwogICAgIHJldHVybiBUUlVFOwogfQogCkBAIC01NDgsNiArNTE1LDcgQEAKICAgICBpZiAoZGMtPnZwb3J0RXh0WCA9PSAwKSBkYy0+dnBvcnRFeHRYID0gMTsKICAgICBpZiAoZGMtPnZwb3J0RXh0WSA9PSAwKSBkYy0+dnBvcnRFeHRZID0gMTsKICAgICBpZiAoZGMtPncuTWFwTW9kZSA9PSBNTV9JU09UUk9QSUMpIE1BUFBJTkdfRml4SXNvdHJvcGljKCBkYyApOworICAgIERDX1VwZGF0ZVhmb3JtcyggZGMgKTsKICAgICByZXR1cm4gVFJVRTsKIH0KIApAQCAtNjAyLDUgKzU3MCw2IEBACiAgICAgaWYgKGRjLT53bmRFeHRYID09IDApIGRjLT53bmRFeHRYID0gMTsKICAgICBpZiAoZGMtPnduZEV4dFkgPT0gMCkgZGMtPnduZEV4dFkgPSAxOwogICAgIGlmIChkYy0+dy5NYXBNb2RlID09IE1NX0lTT1RST1BJQykgTUFQUElOR19GaXhJc290cm9waWMoIGRjICk7CisgICAgRENfVXBkYXRlWGZvcm1zKCBkYyApOwogICAgIHJldHVybiBUUlVFOwogfQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvbWV0YWZpbGVkcnYvaW5pdC5jIGIvZ3JhcGhpY3MvbWV0YWZpbGVkcnYvaW5pdC5jCmluZGV4IDc3ZWNiYTUuLmE3ODkxNTkgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL21ldGFmaWxlZHJ2L2luaXQuYworKysgYi9ncmFwaGljcy9tZXRhZmlsZWRydi9pbml0LmMKQEAgLTI3MCw3ICsyNzAsNyBAQAogCQkJCSAgIEhEQzMyIGhkYyAvKiBNZXRhZmlsZSBEQyB0byBjbG9zZSAqLwogKQogewotICByZXR1cm4gQ2xvc2VNZXRhRmlsZTMyKGhkYyk7CisgIHJldHVybiBDbG9zZU1ldGFGaWxlMTYoaGRjKTsKIH0KIAogCmRpZmYgLS1naXQgYS9ncmFwaGljcy9wYWludGluZy5jIGIvZ3JhcGhpY3MvcGFpbnRpbmcuYwppbmRleCBhMTQyYzkxLi40ZDc1ZGRkIDEwMDY0NAotLS0gYS9ncmFwaGljcy9wYWludGluZy5jCisrKyBiL2dyYXBoaWNzL3BhaW50aW5nLmMKQEAgLTIxOSw2ICsyMTksMTAgQEAKIHsKICAgICBEQyAqIGRjID0gRENfR2V0RENQdHIoIGhkYyApOwogICAKKyAgICBpZihkYyAmJiBQQVRIX0lzUGF0aE9wZW4oZGMtPncucGF0aCkpCisgICAgICAgIGlmKCFQQVRIX1JlY3RhbmdsZShoZGMsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSkpCisgICAgICAgICAgIHJldHVybiBGQUxTRTsKKwogICAgIHJldHVybiBkYyAmJiBkYy0+ZnVuY3MtPnBSZWN0YW5nbGUgJiYKICAgICAJICAgZGMtPmZ1bmNzLT5wUmVjdGFuZ2xlKGRjLGxlZnQsdG9wLHJpZ2h0LGJvdHRvbSk7CiB9CkBAIC05NTksNyArOTYzLDggQEAKICAgICAvKiBiZWZvcmUgaXQgaXMgZGlzcGxheWVkICovCiAgICAgZmcgPSBTZXRUZXh0Q29sb3IzMihoZGMsIFJHQigwLCAwLCAwKSk7CiAgICAgYmcgPSBTZXRCa0NvbG9yMzIoaGRjLCBSR0IoMjU1LCAyNTUsIDI1NSkpOwotICAgIGhibSA9IE5VTEw7IGhibXNhdmUgPSBOVUxMOyBtZW1kYyA9IE5VTEw7IG1lbWRjID0gTlVMTDsgaGJzYXZlID0gTlVMTDsKKyAgICBoYm0gPSAoSEJJVE1BUDMyKU5VTEw7IGhibXNhdmUgPSAoSEJJVE1BUDMyKU5VTEw7CisgICAgbWVtZGMgPSAoSERDMzIpTlVMTDsgaGJzYXZlID0gKEhCUlVTSDMyKU5VTEw7CiAgICAgcmV0dmFsID0gRkFMU0U7IC8qIGFzc3VtZSBmYWlsdXJlICovCiAgICAgCiAgICAgLyogRnJvbSBoZXJlIG9uIHdlIG11c3QgdXNlICJnb3RvIGNsZWFudXAiIHdoZW4gc29tZXRoaW5nIGdvZXMgd3JvbmcgKi8KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL3BhdGguYyBiL2dyYXBoaWNzL3BhdGguYwppbmRleCBhNzk1YWY4Li5iNjhkMjg2IDEwMDY0NAotLS0gYS9ncmFwaGljcy9wYXRoLmMKKysrIGIvZ3JhcGhpY3MvcGF0aC5jCkBAIC02MiwxNSArNjIsMTYgQEAKIHN0YXRpYyBCT09MMzIgUEFUSF9QYXRoVG9SZWdpb24oY29uc3QgR2RpUGF0aCAqcFBhdGgsIElOVDMyIG5Qb2x5RmlsbE1vZGUsCiAgICBIUkdOMzIgKnBIcmduKTsKIHN0YXRpYyB2b2lkICAgUEFUSF9FbXB0eVBhdGgoR2RpUGF0aCAqcFBhdGgpOwotc3RhdGljIEJPT0wzMiBQQVRIX0FkZEVudHJ5KEdkaVBhdGggKnBQYXRoLCBQT0lOVDMyIHBvaW50LCBCWVRFIGZsYWdzKTsKK3N0YXRpYyBCT09MMzIgUEFUSF9BZGRFbnRyeShHZGlQYXRoICpwUGF0aCwgY29uc3QgUE9JTlQzMiAqcFBvaW50LAorICAgQllURSBmbGFncyk7CiBzdGF0aWMgQk9PTDMyIFBBVEhfUmVzZXJ2ZUVudHJpZXMoR2RpUGF0aCAqcFBhdGgsIElOVDMyIG51bUVudHJpZXMpOwogc3RhdGljIEJPT0wzMiBQQVRIX0dldFBhdGhGcm9tSERDKEhEQzMyIGhkYywgR2RpUGF0aCAqKnBwUGF0aCk7Ci1zdGF0aWMgQk9PTDMyIFBBVEhfRG9BcmNQYXJ0KEdkaVBhdGggKnBQYXRoLCBQT0lOVDMyIGNvcm5lcnNbXSwKK3N0YXRpYyBCT09MMzIgUEFUSF9Eb0FyY1BhcnQoR2RpUGF0aCAqcFBhdGgsIEZMT0FUX1BPSU5UIGNvcm5lcnNbXSwKICAgIGRvdWJsZSBhbmdsZVN0YXJ0LCBkb3VibGUgYW5nbGVFbmQsIEJPT0wzMiBhZGRNb3ZlVG8pOwotc3RhdGljIHZvaWQgUEFUSF9TY2FsZU5vcm1hbGl6ZWRQb2ludChQT0lOVDMyIGNvcm5lcnNbXSwgZG91YmxlIHgsIGRvdWJsZSB5LAotICAgUE9JTlQzMiAqcFBvaW50KTsKLXN0YXRpYyB2b2lkIFBBVEhfTm9ybWFsaXplUG9pbnQoUE9JTlQzMiBjb3JuZXJzW10sIGNvbnN0IFBPSU5UMzIgKnBQb2ludCwKLSAgIGRvdWJsZSAqcFgsIGRvdWJsZSAqcFkpOworc3RhdGljIHZvaWQgUEFUSF9TY2FsZU5vcm1hbGl6ZWRQb2ludChGTE9BVF9QT0lOVCBjb3JuZXJzW10sIGRvdWJsZSB4LAorICAgZG91YmxlIHksIFBPSU5UMzIgKnBQb2ludCk7CitzdGF0aWMgdm9pZCBQQVRIX05vcm1hbGl6ZVBvaW50KEZMT0FUX1BPSU5UIGNvcm5lcnNbXSwgY29uc3QgRkxPQVRfUE9JTlQKKyAgICpwUG9pbnQsIGRvdWJsZSAqcFgsIGRvdWJsZSAqcFkpOwogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMjE4LDYgKzIxOSw4IEBACiAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CiAgICAKKyAgIC8qIEZJWE1FOiBTaG91bGRuJ3Qgd2UgZHJhdyBhIGxpbmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlndXJlPyAqLworICAgCiAgICAvKiBTZXQgUFRfQ0xPU0VGSUdVUkUgb24gdGhlIGxhc3QgZW50cnkgYW5kIHN0YXJ0IGEgbmV3IHN0cm9rZSAqLwogICAgaWYocFBhdGgtPm51bUVudHJpZXNVc2VkKQogICAgewpAQCAtNDM2LDcgKzQzOSw3IEBACiAgICBpZihQQVRIX1BhdGhUb1JlZ2lvbihwUGF0aCwgR2V0UG9seUZpbGxNb2RlMzIoaGRjKSwgJmhyZ25QYXRoKSkKICAgIHsKICAgICAgIGhyZ25DbGlwPUNyZWF0ZVJlY3RSZ24zMigwLCAwLCAwLCAwKTsKLSAgICAgIGlmKGhyZ25DbGlwPT1OVUxMKQorICAgICAgaWYoaHJnbkNsaXA9PShIUkdOMzIpMCkKICAgICAgICAgIHN1Y2Nlc3M9RkFMU0U7CiAgICAgICBlbHNlCiAgICAgICB7CkBAIC01NjQsNyArNTY3LDYgQEAKICAgIAogICAgLyogQ2hlY2sgdGhhdCBwYXRoIGlzIG9wZW4gKi8KICAgIGlmKHBQYXRoLT5zdGF0ZSE9UEFUSF9PcGVuKQotICAgICAgLyogRklYTUU6IERvIHdlIGhhdmUgdG8gY2FsbCBTZXRMYXN0RXJyb3I/ICovCiAgICAgICByZXR1cm4gRkFMU0U7CiAKICAgIC8qIENvbnZlcnQgcG9pbnQgdG8gZGV2aWNlIGNvb3JkaW5hdGVzICovCkBAIC01ODAsMTIgKzU4Miw5MyBAQAogICAgICAgaWYoIUdldEN1cnJlbnRQb3NpdGlvbkV4MzIoaGRjLCAmcG9pbnRDdXJQb3MpIHx8CiAgICAgICAgICAhTFB0b0RQMzIoaGRjLCAmcG9pbnRDdXJQb3MsIDEpKQogICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgaWYoIVBBVEhfQWRkRW50cnkocFBhdGgsIHBvaW50Q3VyUG9zLCBQVF9NT1ZFVE8pKQorICAgICAgaWYoIVBBVEhfQWRkRW50cnkocFBhdGgsICZwb2ludEN1clBvcywgUFRfTU9WRVRPKSkKICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KICAgIAogICAgLyogQWRkIGEgUFRfTElORVRPIGVudHJ5ICovCi0gICByZXR1cm4gUEFUSF9BZGRFbnRyeShwUGF0aCwgcG9pbnQsIFBUX0xJTkVUTyk7CisgICByZXR1cm4gUEFUSF9BZGRFbnRyeShwUGF0aCwgJnBvaW50LCBQVF9MSU5FVE8pOworfQorCisvKiBQQVRIX1JlY3RhbmdsZQorICoKKyAqIFNob3VsZCBiZSBjYWxsZWQgd2hlbiBhIGNhbGwgdG8gUmVjdGFuZ2xlIGlzIHBlcmZvcm1lZCBvbiBhIERDIHRoYXQgaGFzCisgKiBhbiBvcGVuIHBhdGguIFJldHVybnMgVFJVRSBpZiBzdWNjZXNzZnVsLCBlbHNlIEZBTFNFLgorICovCitCT09MMzIgUEFUSF9SZWN0YW5nbGUoSERDMzIgaGRjLCBJTlQzMiB4MSwgSU5UMzIgeTEsIElOVDMyIHgyLCBJTlQzMiB5MikKK3sKKyAgIEdkaVBhdGggKnBQYXRoOworICAgUE9JTlQzMiBjb3JuZXJzWzJdLCBwb2ludFRlbXA7CisgICBJTlQzMiAgIHRlbXA7CisKKyAgIC8qIEdldCBwb2ludGVyIHRvIHBhdGggKi8KKyAgIGlmKCFQQVRIX0dldFBhdGhGcm9tSERDKGhkYywgJnBQYXRoKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgIAorICAgLyogQ2hlY2sgdGhhdCBwYXRoIGlzIG9wZW4gKi8KKyAgIGlmKHBQYXRoLT5zdGF0ZSE9UEFUSF9PcGVuKQorICAgICAgcmV0dXJuIEZBTFNFOworCisgICAvKiBDb252ZXJ0IHBvaW50cyB0byBkZXZpY2UgY29vcmRpbmF0ZXMgKi8KKyAgIGNvcm5lcnNbMF0ueD14MTsKKyAgIGNvcm5lcnNbMF0ueT15MTsKKyAgIGNvcm5lcnNbMV0ueD14MjsKKyAgIGNvcm5lcnNbMV0ueT15MjsKKyAgIGlmKCFMUHRvRFAzMihoZGMsIGNvcm5lcnMsIDIpKQorICAgICAgcmV0dXJuIEZBTFNFOworICAgCisgICAvKiBNYWtlIHN1cmUgZmlyc3QgY29ybmVyIGlzIHRvcCBsZWZ0IGFuZCBzZWNvbmQgY29ybmVyIGlzIGJvdHRvbSByaWdodCAqLworICAgaWYoY29ybmVyc1swXS54PmNvcm5lcnNbMV0ueCkKKyAgIHsKKyAgICAgIHRlbXA9Y29ybmVyc1swXS54OworICAgICAgY29ybmVyc1swXS54PWNvcm5lcnNbMV0ueDsKKyAgICAgIGNvcm5lcnNbMV0ueD10ZW1wOworICAgfQorICAgaWYoY29ybmVyc1swXS55PmNvcm5lcnNbMV0ueSkKKyAgIHsKKyAgICAgIHRlbXA9Y29ybmVyc1swXS55OworICAgICAgY29ybmVyc1swXS55PWNvcm5lcnNbMV0ueTsKKyAgICAgIGNvcm5lcnNbMV0ueT10ZW1wOworICAgfQorICAgCisgICAvKiBJbiBHTV9DT01QQVRJQkxFLCBkb24ndCBpbmNsdWRlIGJvdHRvbSBhbmQgcmlnaHQgZWRnZXMgKi8KKyAgIGlmKEdldEdyYXBoaWNzTW9kZShoZGMpPT1HTV9DT01QQVRJQkxFKQorICAgeworICAgICAgY29ybmVyc1sxXS54LS07CisgICAgICBjb3JuZXJzWzFdLnktLTsKKyAgIH0KKworICAgLyogQ2xvc2UgYW55IHByZXZpb3VzIGZpZ3VyZSAqLworICAgaWYoIUNsb3NlRmlndXJlMzIoaGRjKSkKKyAgIHsKKyAgICAgIC8qIFRoZSBDbG9zZUZpZ3VyZSBjYWxsIHNob3VsZG4ndCBoYXZlIGZhaWxlZCAqLworICAgICAgYXNzZXJ0KEZBTFNFKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgIH0KKworICAgLyogQWRkIGZvdXIgcG9pbnRzIHRvIHRoZSBwYXRoICovCisgICBwb2ludFRlbXAueD1jb3JuZXJzWzFdLng7CisgICBwb2ludFRlbXAueT1jb3JuZXJzWzBdLnk7CisgICBpZighUEFUSF9BZGRFbnRyeShwUGF0aCwgJnBvaW50VGVtcCwgUFRfTU9WRVRPKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgIGlmKCFQQVRIX0FkZEVudHJ5KHBQYXRoLCBjb3JuZXJzLCBQVF9MSU5FVE8pKQorICAgICAgcmV0dXJuIEZBTFNFOworICAgcG9pbnRUZW1wLng9Y29ybmVyc1swXS54OworICAgcG9pbnRUZW1wLnk9Y29ybmVyc1sxXS55OworICAgaWYoIVBBVEhfQWRkRW50cnkocFBhdGgsICZwb2ludFRlbXAsIFBUX0xJTkVUTykpCisgICAgICByZXR1cm4gRkFMU0U7CisgICBpZighUEFUSF9BZGRFbnRyeShwUGF0aCwgY29ybmVycysxLCBQVF9MSU5FVE8pKQorICAgICAgcmV0dXJuIEZBTFNFOworCisgICAvKiBDbG9zZSB0aGUgcmVjdGFuZ2xlIGZpZ3VyZSAqLworICAgaWYoIUNsb3NlRmlndXJlMzIoaGRjKSkKKyAgIHsKKyAgICAgIC8qIFRoZSBDbG9zZUZpZ3VyZSBjYWxsIHNob3VsZG4ndCBoYXZlIGZhaWxlZCAqLworICAgICAgYXNzZXJ0KEZBTFNFKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgIH0KKworICAgcmV0dXJuIFRSVUU7CiB9CiAKIC8qIFBBVEhfRWxsaXBzZQpAQCAtNTk2LDcgKzY3OSw5IEBACiAgKi8KIEJPT0wzMiBQQVRIX0VsbGlwc2UoSERDMzIgaGRjLCBJTlQzMiB4MSwgSU5UMzIgeTEsIElOVDMyIHgyLCBJTlQzMiB5MikKIHsKLSAgIHJldHVybiBQQVRIX0FyYyhoZGMsIHgxLCB5MSwgeDIsIHkyLCB4MSwgMCwgeDEsIDApOworICAgLy8gVE9ETzogVGhpcyBzaG91bGQgcHJvYmFibHkgYmUgcmV2aXNlZCB0byBjYWxsIFBBVEhfQW5nbGVBcmMKKyAgIC8vIChvbmNlIGl0IGV4aXN0cykKKyAgIHJldHVybiBQQVRIX0FyYyhoZGMsIHgxLCB5MSwgeDIsIHkyLCB4MSwgKHkxK3kyKS8yLCB4MSwgKHkxK3kyKS8yKTsKIH0KIAogLyogUEFUSF9BcmMKQEAgLTYwOCwxNiArNjkzLDIzIEBACiBCT09MMzIgUEFUSF9BcmMoSERDMzIgaGRjLCBJTlQzMiB4MSwgSU5UMzIgeTEsIElOVDMyIHgyLCBJTlQzMiB5MiwKICAgIElOVDMyIHhTdGFydCwgSU5UMzIgeVN0YXJ0LCBJTlQzMiB4RW5kLCBJTlQzMiB5RW5kKQogewotICAgR2RpUGF0aCAqcFBhdGg7Ci0gICBkb3VibGUgIGFuZ2xlU3RhcnQsIGFuZ2xlRW5kLCBhbmdsZVN0YXJ0UXVhZHJhbnQsIGFuZ2xlRW5kUXVhZHJhbnQ9MC4wOwotICAgICAgICAgICAvKiBJbml0aWFsaXplIGFuZ2xlRW5kUXVhZHJhbnQgdG8gc2lsZW5jZSBnY2MncyB3YXJuaW5nICovCi0gICBkb3VibGUgIHgsIHk7Ci0gICBQT0lOVDMyIGNvcm5lcnNbMl0sIHBvaW50U3RhcnQsIHBvaW50RW5kOwotICAgQk9PTDMyICBzdGFydCwgZW5kOwotICAgSU5UMzIgICB0ZW1wOworICAgR2RpUGF0aCAgICAgKnBQYXRoOworICAgREMgICAgICAgICAgKnBEQzsKKyAgIGRvdWJsZSAgICAgIGFuZ2xlU3RhcnQsIGFuZ2xlRW5kLCBhbmdsZVN0YXJ0UXVhZHJhbnQsIGFuZ2xlRW5kUXVhZHJhbnQ9MC4wOworICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSBhbmdsZUVuZFF1YWRyYW50IHRvIHNpbGVuY2UgZ2NjJ3Mgd2FybmluZyAqLworICAgZG91YmxlICAgICAgeCwgeTsKKyAgIEZMT0FUX1BPSU5UIGNvcm5lcnNbMl0sIHBvaW50U3RhcnQsIHBvaW50RW5kOworICAgQk9PTDMyICAgICAgc3RhcnQsIGVuZDsKKyAgIElOVDMyICAgICAgIHRlbXA7CiAKICAgIC8qIEZJWE1FOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBjaGVjayBmb3IgYWxsIHBvc3NpYmxlIGVycm9yIHJldHVybnMgKi8KKyAgIC8qIEZJWE1FOiBEbyB3ZSBoYXZlIHRvIHJlc3BlY3QgbmV3U3Ryb2tlPyAqLwogICAgCisgICAvKiBHZXQgcG9pbnRlciB0byBEQyAqLworICAgcERDPURDX0dldERDUHRyKGhkYyk7CisgICBpZihwREM9PU5VTEwpCisgICAgICByZXR1cm4gRkFMU0U7CisKICAgIC8qIEdldCBwb2ludGVyIHRvIHBhdGggKi8KICAgIGlmKCFQQVRIX0dldFBhdGhGcm9tSERDKGhkYywgJnBQYXRoKSkKICAgICAgIHJldHVybiBGQUxTRTsKQEAgLTYyNiwzNCArNzE4LDI4IEBACiAgICBpZihwUGF0aC0+c3RhdGUhPVBBVEhfT3BlbikKICAgICAgIHJldHVybiBGQUxTRTsKIAorICAgLyogRklYTUU6IERvIHdlIGhhdmUgdG8gY2xvc2UgdGhlIGN1cnJlbnQgZmlndXJlPyAqLworICAgCiAgICAvKiBDaGVjayBmb3IgemVybyBoZWlnaHQgLyB3aWR0aCAqLwotICAgLyogRklYTUU6IFNob3VsZCB3ZSBkbyB0aGlzIGJlZm9yZSBvciBhZnRlciBMUHRvRFA/ICovCisgICAvKiBGSVhNRTogT25seSBpbiBHTV9DT01QQVRJQkxFPyAqLwogICAgaWYoeDE9PXgyIHx8IHkxPT15MikKICAgICAgIHJldHVybiBUUlVFOwogICAgCi0gICAvKiBJbiBHTV9DT01QQVRJQkxFLCBkb24ndCBpbmNsdWRlIGJvdHRvbSBhbmQgcmlnaHQgZWRnZXMgKi8KLSAgIGlmKEdldEdyYXBoaWNzTW9kZShoZGMpPT1HTV9DT01QQVRJQkxFKQotICAgewotICAgICAgLyogRklYTUU6IFNob3VsZCB3ZSBkbyB0aGlzIGJlZm9yZSBvciBhZnRlciBMUHRvRFA/ICovCi0gICAgICB4Mi0tOwotICAgICAgeTItLTsKLSAgIH0KLQogICAgLyogQ29udmVydCBwb2ludHMgdG8gZGV2aWNlIGNvb3JkaW5hdGVzICovCi0gICBjb3JuZXJzWzBdLng9eDE7Ci0gICBjb3JuZXJzWzBdLnk9eTE7Ci0gICBjb3JuZXJzWzFdLng9eDI7Ci0gICBjb3JuZXJzWzFdLnk9eTI7Ci0gICBwb2ludFN0YXJ0Lng9eFN0YXJ0OwotICAgcG9pbnRTdGFydC55PXlTdGFydDsKLSAgIHBvaW50RW5kLng9eEVuZDsKLSAgIHBvaW50RW5kLnk9eUVuZDsKLSAgIGlmKCFMUHRvRFAzMihoZGMsIGNvcm5lcnMsIDIpIHx8ICFMUHRvRFAzMihoZGMsICZwb2ludFN0YXJ0LCAxKSB8fAotICAgICAgIUxQdG9EUDMyKGhkYywgJnBvaW50RW5kLCAxKSkKLSAgICAgIHJldHVybiBGQUxTRTsKKyAgIGNvcm5lcnNbMF0ueD0oRkxPQVQpeDE7CisgICBjb3JuZXJzWzBdLnk9KEZMT0FUKXkxOworICAgY29ybmVyc1sxXS54PShGTE9BVCl4MjsKKyAgIGNvcm5lcnNbMV0ueT0oRkxPQVQpeTI7CisgICBwb2ludFN0YXJ0Lng9KEZMT0FUKXhTdGFydDsKKyAgIHBvaW50U3RhcnQueT0oRkxPQVQpeVN0YXJ0OworICAgcG9pbnRFbmQueD0oRkxPQVQpeEVuZDsKKyAgIHBvaW50RW5kLnk9KEZMT0FUKXlFbmQ7CisgICBJTlRFUk5BTF9MUFRPRFBfRkxPQVQocERDLCBjb3JuZXJzKTsKKyAgIElOVEVSTkFMX0xQVE9EUF9GTE9BVChwREMsIGNvcm5lcnMrMSk7CisgICBJTlRFUk5BTF9MUFRPRFBfRkxPQVQocERDLCAmcG9pbnRTdGFydCk7CisgICBJTlRFUk5BTF9MUFRPRFBfRkxPQVQocERDLCAmcG9pbnRFbmQpOwogCi0gICAvKiBNYWtlIHN1cmUgZmlyc3QgY29ybmVyIGlzIHRvcCBsZWZ0IGFuZCByaWdodCBjb3JuZXIgaXMgYm90dG9tIHJpZ2h0ICovCi0gICAvKiBGSVhNRTogU2hvdWxkIHdlIGRvIHRoaXMgYmVmb3JlIG9yIGFmdGVyIExQdG9EUD8gKi8KKyAgIC8qIE1ha2Ugc3VyZSBmaXJzdCBjb3JuZXIgaXMgdG9wIGxlZnQgYW5kIHNlY29uZCBjb3JuZXIgaXMgYm90dG9tIHJpZ2h0ICovCiAgICBpZihjb3JuZXJzWzBdLng+Y29ybmVyc1sxXS54KQogICAgewogICAgICAgdGVtcD1jb3JuZXJzWzBdLng7CkBAIC02OTEsNiArNzc3LDEzIEBACiAgICAgICB9CiAgICB9CiAKKyAgIC8qIEluIEdNX0NPTVBBVElCTEUsIGRvbid0IGluY2x1ZGUgYm90dG9tIGFuZCByaWdodCBlZGdlcyAqLworICAgaWYoR2V0R3JhcGhpY3NNb2RlKGhkYyk9PUdNX0NPTVBBVElCTEUpCisgICB7CisgICAgICBjb3JuZXJzWzFdLngtLTsKKyAgICAgIGNvcm5lcnNbMV0ueS0tOworICAgfQorICAgCiAgICAvKiBBZGQgdGhlIGFyYyB0byB0aGUgcGF0aCB3aXRoIG9uZSBCZXppZXIgc3BsaW5lIHBlciBxdWFkcmFudCB0aGF0IHRoZQogICAgICogYXJjIHNwYW5zICovCiAgICBzdGFydD1UUlVFOwpAQCAtNzE3LDkgKzgxMCw5IEBACiAKICAgICAgIC8qIEhhdmUgd2UgcmVhY2hlZCB0aGUgbGFzdCBwYXJ0IG9mIHRoZSBhcmM/ICovCiAgICAgICBpZigoR2V0QXJjRGlyZWN0aW9uMzIoaGRjKT09QURfQ0xPQ0tXSVNFICYmCi0gICAgICAgICBhbmdsZUVuZDw9YW5nbGVFbmRRdWFkcmFudCkgfHwKKyAgICAgICAgIGFuZ2xlRW5kPGFuZ2xlRW5kUXVhZHJhbnQpIHx8CiAJIChHZXRBcmNEaXJlY3Rpb24zMihoZGMpPT1BRF9DT1VOVEVSQ0xPQ0tXSVNFICYmCi0JIGFuZ2xlRW5kPj1hbmdsZUVuZFF1YWRyYW50KSkKKwkgYW5nbGVFbmQ+YW5nbGVFbmRRdWFkcmFudCkpCiAgICAgICB7CiAJIC8qIEFkanVzdCB0aGUgZW5kIGFuZ2xlIGZvciB0aGlzIHF1YWRyYW50ICovCiAgICAgICAgICBhbmdsZUVuZFF1YWRyYW50PWFuZ2xlRW5kOwpAQCAtNzkxLDcgKzg4NCw3IEBACiAgICAvKiBDcmVhdGUgYSByZWdpb24gZnJvbSB0aGUgc3Ryb2tlcyAqLwogICAgaHJnbj1DcmVhdGVQb2x5UG9seWdvblJnbjMyKHBQYXRoLT5wUG9pbnRzLCBwTnVtUG9pbnRzSW5TdHJva2UsCiAgICAgICBudW1TdHJva2VzLCBuUG9seUZpbGxNb2RlKTsKLSAgIGlmKGhyZ249PU5VTEwpCisgICBpZihocmduPT0oSFJHTjMyKTApCiAgICB7CiAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfTk9UX0VOT1VHSF9NRU1PUlkpOwogICAgICAgcmV0dXJuIEZBTFNFOwpAQCAtODIzLDEwICs5MTYsMTQgQEAKICAqIG9yIFBUX0JFWklFUlRPLCBvcHRpb25hbGx5IE9SZWQgd2l0aCBQVF9DTE9TRUZJR1VSRS4gUmV0dXJucyBUUlVFIGlmCiAgKiBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgKGUuZy4gaWYgbm90IGVub3VnaCBtZW1vcnkgd2FzIGF2YWlsYWJsZSkuCiAgKi8KLUJPT0wzMiBQQVRIX0FkZEVudHJ5KEdkaVBhdGggKnBQYXRoLCBQT0lOVDMyIHBvaW50LCBCWVRFIGZsYWdzKQorQk9PTDMyIFBBVEhfQWRkRW50cnkoR2RpUGF0aCAqcFBhdGgsIGNvbnN0IFBPSU5UMzIgKnBQb2ludCwgQllURSBmbGFncykKIHsKICAgIGFzc2VydChwUGF0aCE9TlVMTCk7CiAgICAKKyAgIC8qIEZJWE1FOiBJZiBuZXdTdHJva2UgaXMgdHJ1ZSwgcGVyaGFwcyB3ZSB3YW50IHRvIGNoZWNrIHRoYXQgd2UncmUKKyAgICAqIGdldHRpbmcgYSBQVF9NT1ZFVE8KKyAgICAqLworCiAgICAvKiBDaGVjayB0aGF0IHBhdGggaXMgb3BlbiAqLwogICAgaWYocFBhdGgtPnN0YXRlIT1QQVRIX09wZW4pCiAgICAgICByZXR1cm4gRkFMU0U7CkBAIC04MzYsOSArOTMzLDEzIEBACiAgICAgICByZXR1cm4gRkFMU0U7CiAKICAgIC8qIFN0b3JlIGluZm9ybWF0aW9uIGluIHBhdGggZW50cnkgKi8KLSAgIHBQYXRoLT5wUG9pbnRzW3BQYXRoLT5udW1FbnRyaWVzVXNlZF09cG9pbnQ7CisgICBwUGF0aC0+cFBvaW50c1twUGF0aC0+bnVtRW50cmllc1VzZWRdPSpwUG9pbnQ7CiAgICBwUGF0aC0+cEZsYWdzW3BQYXRoLT5udW1FbnRyaWVzVXNlZF09ZmxhZ3M7CiAKKyAgIC8qIElmIHRoaXMgaXMgUFRfQ0xPU0VGSUdVUkUsIHdlIGhhdmUgdG8gc3RhcnQgYSBuZXcgc3Ryb2tlIG5leHQgdGltZSAqLworICAgaWYoKGZsYWdzICYgUFRfQ0xPU0VGSUdVUkUpID09IFBUX0NMT1NFRklHVVJFKQorICAgICAgcFBhdGgtPm5ld1N0cm9rZT1UUlVFOworCiAgICAvKiBJbmNyZW1lbnQgZW50cnkgY291bnQgKi8KICAgIHBQYXRoLT5udW1FbnRyaWVzVXNlZCsrOwogCkBAIC05MzYsNyArMTAzNyw3IEBACiAgKiBwb2ludCBpcyBhZGRlZCB0byB0aGUgcGF0aDsgb3RoZXJ3aXNlLCBpdCBpcyBhc3N1bWVkIHRoYXQgdGhlIGN1cnJlbnQKICAqIHBvc2l0aW9uIGlzIGVxdWFsIHRvIHRoZSBmaXJzdCBjb250cm9sIHBvaW50LgogICovCi1zdGF0aWMgQk9PTDMyIFBBVEhfRG9BcmNQYXJ0KEdkaVBhdGggKnBQYXRoLCBQT0lOVDMyIGNvcm5lcnNbXSwKK3N0YXRpYyBCT09MMzIgUEFUSF9Eb0FyY1BhcnQoR2RpUGF0aCAqcFBhdGgsIEZMT0FUX1BPSU5UIGNvcm5lcnNbXSwKICAgIGRvdWJsZSBhbmdsZVN0YXJ0LCBkb3VibGUgYW5nbGVFbmQsIEJPT0wzMiBhZGRNb3ZlVG8pCiB7CiAgICBkb3VibGUgIGhhbGZBbmdsZSwgYTsKQEAgLTk1MCwyMSArMTA1MSwzMCBAQAogCiAgICAvKiBDb21wdXRlIGNvbnRyb2wgcG9pbnRzICovCiAgICBoYWxmQW5nbGU9KGFuZ2xlRW5kLWFuZ2xlU3RhcnQpLzIuMDsKLSAgIGE9NC4wLzMuMCooMS1jb3MoaGFsZkFuZ2xlKSkvc2luKGhhbGZBbmdsZSk7Ci0gICB4Tm9ybVswXT1jb3MoYW5nbGVTdGFydCk7Ci0gICB5Tm9ybVswXT1zaW4oYW5nbGVTdGFydCk7Ci0gICB4Tm9ybVsxXT14Tm9ybVswXSAtIGEqeU5vcm1bMF07Ci0gICB5Tm9ybVsxXT15Tm9ybVswXSArIGEqeE5vcm1bMF07Ci0gICB4Tm9ybVszXT1jb3MoYW5nbGVFbmQpOwotICAgeU5vcm1bM109c2luKGFuZ2xlRW5kKTsKLSAgIHhOb3JtWzJdPXhOb3JtWzNdICsgYSp5Tm9ybVszXTsKLSAgIHlOb3JtWzJdPXlOb3JtWzNdIC0gYSp4Tm9ybVszXTsKKyAgIGlmKGZhYnMoaGFsZkFuZ2xlKT4xZS04KQorICAgeworICAgICAgYT00LjAvMy4wKigxLWNvcyhoYWxmQW5nbGUpKS9zaW4oaGFsZkFuZ2xlKTsKKyAgICAgIHhOb3JtWzBdPWNvcyhhbmdsZVN0YXJ0KTsKKyAgICAgIHlOb3JtWzBdPXNpbihhbmdsZVN0YXJ0KTsKKyAgICAgIHhOb3JtWzFdPXhOb3JtWzBdIC0gYSp5Tm9ybVswXTsKKyAgICAgIHlOb3JtWzFdPXlOb3JtWzBdICsgYSp4Tm9ybVswXTsKKyAgICAgIHhOb3JtWzNdPWNvcyhhbmdsZUVuZCk7CisgICAgICB5Tm9ybVszXT1zaW4oYW5nbGVFbmQpOworICAgICAgeE5vcm1bMl09eE5vcm1bM10gKyBhKnlOb3JtWzNdOworICAgICAgeU5vcm1bMl09eU5vcm1bM10gLSBhKnhOb3JtWzNdOworICAgfQorICAgZWxzZQorICAgICAgZm9yKGk9MDsgaTw0OyBpKyspCisgICAgICB7CisJIHhOb3JtW2ldPWNvcyhhbmdsZVN0YXJ0KTsKKwkgeU5vcm1baV09c2luKGFuZ2xlU3RhcnQpOworICAgICAgfQogICAgCiAgICAvKiBBZGQgc3RhcnRpbmcgcG9pbnQgdG8gcGF0aCBpZiBkZXNpcmVkICovCiAgICBpZihhZGRNb3ZlVG8pCiAgICB7CiAgICAgICBQQVRIX1NjYWxlTm9ybWFsaXplZFBvaW50KGNvcm5lcnMsIHhOb3JtWzBdLCB5Tm9ybVswXSwgJnBvaW50KTsKLSAgICAgIGlmKCFQQVRIX0FkZEVudHJ5KHBQYXRoLCBwb2ludCwgUFRfTU9WRVRPKSkKKyAgICAgIGlmKCFQQVRIX0FkZEVudHJ5KHBQYXRoLCAmcG9pbnQsIFBUX01PVkVUTykpCiAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CiAKQEAgLTk3Miw3ICsxMDgyLDcgQEAKICAgIGZvcihpPTE7IGk8NDsgaSsrKQogICAgewogICAgICAgUEFUSF9TY2FsZU5vcm1hbGl6ZWRQb2ludChjb3JuZXJzLCB4Tm9ybVtpXSwgeU5vcm1baV0sICZwb2ludCk7Ci0gICAgICBpZighUEFUSF9BZGRFbnRyeShwUGF0aCwgcG9pbnQsIFBUX0JFWklFUlRPKSkKKyAgICAgIGlmKCFQQVRIX0FkZEVudHJ5KHBQYXRoLCAmcG9pbnQsIFBUX0JFWklFUlRPKSkKICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KIApAQCAtOTg2LDEyICsxMDk2LDEyIEBACiAgKiBjb29yZGluYXRlcyAoLTEuMCwgLTEuMCkgY29ycmVzcG9uZCB0byBjb3JuZXJzWzBdLCB0aGUgY29vcmRpbmF0ZXMKICAqICgxLjAsIDEuMCkgY29ycmVzcG9uZCB0byBjb3JuZXJzWzFdLgogICovCi1zdGF0aWMgdm9pZCBQQVRIX1NjYWxlTm9ybWFsaXplZFBvaW50KFBPSU5UMzIgY29ybmVyc1tdLCBkb3VibGUgeCwgZG91YmxlIHksCi0gICBQT0lOVDMyICpwUG9pbnQpCitzdGF0aWMgdm9pZCBQQVRIX1NjYWxlTm9ybWFsaXplZFBvaW50KEZMT0FUX1BPSU5UIGNvcm5lcnNbXSwgZG91YmxlIHgsCisgICBkb3VibGUgeSwgUE9JTlQzMiAqcFBvaW50KQogewotICAgcFBvaW50LT54PShJTlQzMilmbG9vciggKGRvdWJsZSljb3JuZXJzWzBdLnggKworICAgcFBvaW50LT54PUdESV9ST1VORCggKGRvdWJsZSljb3JuZXJzWzBdLnggKwogICAgICAgKGRvdWJsZSkoY29ybmVyc1sxXS54LWNvcm5lcnNbMF0ueCkqMC41Kih4KzEuMCkgKTsKLSAgIHBQb2ludC0+eT0oSU5UMzIpZmxvb3IoIChkb3VibGUpY29ybmVyc1swXS55ICsKKyAgIHBQb2ludC0+eT1HRElfUk9VTkQoIChkb3VibGUpY29ybmVyc1swXS55ICsKICAgICAgIChkb3VibGUpKGNvcm5lcnNbMV0ueS1jb3JuZXJzWzBdLnkpKjAuNSooeSsxLjApICk7CiB9CiAKQEAgLTEwMDAsNyArMTExMCw4IEBACiAgKiBOb3JtYWxpemVzIGEgcG9pbnQgd2l0aCByZXNwZWN0IHRvIHRoZSBib3ggd2hvc2UgY29ybmVycyBhcmUgcGFzc2VkIGluCiAgKiAiY29ybmVycyIuIFRoZSBub3JtYWxpemVkIGNvb3JkaW5hdGVzIGFyZSBzdG9yZWQgaW4gIipwWCIgYW5kICIqcFkiLgogICovCi1zdGF0aWMgdm9pZCBQQVRIX05vcm1hbGl6ZVBvaW50KFBPSU5UMzIgY29ybmVyc1tdLCBjb25zdCBQT0lOVDMyICpwUG9pbnQsCitzdGF0aWMgdm9pZCBQQVRIX05vcm1hbGl6ZVBvaW50KEZMT0FUX1BPSU5UIGNvcm5lcnNbXSwKKyAgIGNvbnN0IEZMT0FUX1BPSU5UICpwUG9pbnQsCiAgICBkb3VibGUgKnBYLCBkb3VibGUgKnBZKQogewogICAgKnBYPShkb3VibGUpKHBQb2ludC0+eC1jb3JuZXJzWzBdLngpLyhkb3VibGUpKGNvcm5lcnNbMV0ueC1jb3JuZXJzWzBdLngpICoKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL3dpbjE2ZHJ2L2ZvbnQuYyBiL2dyYXBoaWNzL3dpbjE2ZHJ2L2ZvbnQuYwppbmRleCA3ZWQ5ZjcxLi5mYjlkMWU1IDEwMDY0NAotLS0gYS9ncmFwaGljcy93aW4xNmRydi9mb250LmMKKysrIGIvZ3JhcGhpY3Mvd2luMTZkcnYvZm9udC5jCkBAIC0yMDAsOCArMjAwLDggQEAKICAqLwogCiAKLVdPUkQgV0lOQVBJIFdpbmVFbnVtREZvbnRDYWxsYmFjayhMUExPR0ZPTlQxNiBscExvZ0ZvbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBURVhUTUVUUklDMTYgbHBUZXh0TWV0cmljcywKK1dPUkQgV0lOQVBJIFdpbmVFbnVtREZvbnRDYWxsYmFjayhMUEVOVU1MT0dGT05UMTYgbHBMb2dGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQTkVXVEVYVE1FVFJJQzE2IGxwVGV4dE1ldHJpY3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV09SRCB3Rm9udFR5cGUsIExPTkcgbHBDbGllbnREYXRhKSAKIHsKICAgICBUUkFDRSh3aW4xNmRydiwgIkluIFdpbmVFbnVtREZvbnRDYWxsYmFjayBwbGY9JXBcbiIsIGxwTG9nRm9udCk7CmRpZmYgLS1naXQgYS9ncmFwaGljcy93aW4xNmRydi9wcnRkcnYuYyBiL2dyYXBoaWNzL3dpbjE2ZHJ2L3BydGRydi5jCmluZGV4IDlhN2JkZTEuLjQzYmI3ZTggMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL3dpbjE2ZHJ2L3BydGRydi5jCisrKyBiL2dyYXBoaWNzL3dpbjE2ZHJ2L3BydGRydi5jCkBAIC02NzQsNyArNjc0LDcgQEAKICAgICBpZiAod1N0eWxlIDwgMCkgeyAvKiBGcmVlIGV4dHJhIG1lbW9yeSBvZiBnaXZlbiBvYmplY3QncyBzdHJ1Y3R1cmUgKi8KIAlzd2l0Y2ggKCAtd1N0eWxlICkgewogICAgICAgICAgICAgY2FzZSBEUlZPQkpfUEVOOiAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQTE9HUEVOMTYgRGVsZXRlUGVuID0gKExQTE9HUEVOMTYpbHBJbk9iajsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTFBMT0dQRU4xNiBEZWxldGVQZW4gPSAoTFBMT0dQRU4xNilscEluT2JqOyAqLwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRFJWT0JKX1BFTl9kZWxldGVcbiIpOwogCQkJCWJyZWFrOwpAQCAtNjg0LDggKzY4NCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCQkJCX0KICAgICAgICAgICAgIGNhc2UgRFJWT0JKX0ZPTlQ6CXsKLQkJCQlMUFRFWFRYRk9STTE2IFRleHRYRm9ybQotCQkJCQk9IChMUFRFWFRYRk9STTE2KWxwVGV4dFhGb3JtOworCQkJCS8qIExQVEVYVFhGT1JNMTYgVGV4dFhGb3JtCisJCQkJCT0gKExQVEVYVFhGT1JNMTYpbHBUZXh0WEZvcm07ICovCiAJCQkJZnByaW50ZihzdGRlcnIsICJEUlZPQkpfRk9OVF9kZWxldGVcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKIAkJCQl9CkBAIC03MjAsNyArNzIwLDcgQEAKIAkgICAgY2FzZSBEUlZPQkpfQlJVU0g6IHsKIAkJCQlMUExPR0JSVVNIMTYgSW5CcnVzaCAgPSAoTFBMT0dCUlVTSDE2KWxwSW5PYmo7CiAJCQkJTFBMT0dCUlVTSDE2IE91dEJydXNoID0gKExQTE9HQlJVU0gxNilscE91dE9iajsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBQT0lOVDE2IFBvaW50ID0gKExQUE9JTlQxNilscFRleHRYRm9ybTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTFBQT0lOVDE2IFBvaW50ID0gKExQUE9JTlQxNilscFRleHRYRm9ybTsgKi8KIAogCQkJCWZwcmludGYoc3RkZXJyLCAiRFJWT0JKX0JSVVNIXG4iKTsKIAkJCQlpZiAoIWxwT3V0T2JqKSByZXR1cm4gc2l6ZW9mKExPR0JSVVNIMTYpOwpAQCAtNzM0LDggKzczNCw4IEBACiAJCQkJfQogCQkgICAgICAgICAgICAgICB9CiAJICAgIGNhc2UgRFJWT0JKX0ZPTlQ6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBURVhUWEZPUk0xNiBUZXh0WEZvcm0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IChMUFRFWFRYRk9STTE2KWxwVGV4dFhGb3JtOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMUFRFWFRYRk9STTE2IFRleHRYRm9ybQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gKExQVEVYVFhGT1JNMTYpbHBUZXh0WEZvcm07ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRFJWT0JKX0ZPTlRcbiIpOwogCQkJCXJldHVybiAwOy8qIERJU1BMQVkuRFJWIGRvZXNuJ3QgcmVhbGl6ZSBmb250cyAqLwogCQkJICAgICAgfQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3Mvd2luZy5jIGIvZ3JhcGhpY3Mvd2luZy5jCmluZGV4IGRhOWMzMTUuLjk2MmE3NTIgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL3dpbmcuYworKysgYi9ncmFwaGljcy93aW5nLmMKQEAgLTcwLDcgKzcwLDcgQEAKICAgX19pbml0V2luRygpOwogCiAgIGlmKCBfX1dpbkdPSyA+IDAgKQotCXJldHVybiBDcmVhdGVDb21wYXRpYmxlREMxNihOVUxMKTsKKwlyZXR1cm4gQ3JlYXRlQ29tcGF0aWJsZURDMTYoMCk7CiAgIHJldHVybiAoSERDMTYpTlVMTDsKIH0KIApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MveDExZHJ2L2dyYXBoaWNzLmMgYi9ncmFwaGljcy94MTFkcnYvZ3JhcGhpY3MuYwppbmRleCA4NDQyMzIwLi44ODc0MzY4IDEwMDY0NAotLS0gYS9ncmFwaGljcy94MTFkcnYvZ3JhcGhpY3MuYworKysgYi9ncmFwaGljcy94MTFkcnYvZ3JhcGhpY3MuYwpAQCAtOTEsNyArOTEsNyBAQAogICAgIHhlbmQgICA9IFhMUFRPRFAoIGRjLCB4ZW5kICk7CiAgICAgeWVuZCAgID0gWUxQVE9EUCggZGMsIHllbmQgKTsKIAotICAgIGlmICgobGVmdCA9PSByaWdodCkgfHwgKHRvcCA9PSBib3R0b20pKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKChsZWZ0ID09IHJpZ2h0KSB8fCAodG9wID09IGJvdHRvbSkpIHJldHVybiBUUlVFOwogCiAgICAgaWYgKGxlZnQgPiByaWdodCkgeyB0bXA9bGVmdDsgbGVmdD1yaWdodDsgcmlnaHQ9dG1wOyB9CiAgICAgaWYgKHRvcCA+IGJvdHRvbSkgeyB0bXA9dG9wOyB0b3A9Ym90dG9tOyBib3R0b209dG1wOyB9IApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MveDExZHJ2L3hmb250LmMgYi9ncmFwaGljcy94MTFkcnYveGZvbnQuYwppbmRleCA1MDVmNDQ0Li5hYWYwZTIwIDEwMDY0NAotLS0gYS9ncmFwaGljcy94MTFkcnYveGZvbnQuYworKysgYi9ncmFwaGljcy94MTFkcnYveGZvbnQuYwpAQCAtNDYwLDggKzQ2MCw4IEBACiAgICAgIGNoYXIgKnM7CiAgICAgIHNwcmludGYoaF9zdHJpbmcsICJbJStmJStmJStmJStmXSIsIGhfbWF0cml4WzBdLCBoX21hdHJpeFsxXSwgaF9tYXRyaXhbMl0sIGhfbWF0cml4WzNdKTsKICAgICAgc3ByaW50Zihwb2ludF9zdHJpbmcsICJbJStmJStmJStmJStmXSIsIHBvaW50X21hdHJpeFswXSwgcG9pbnRfbWF0cml4WzFdLCBwb2ludF9tYXRyaXhbMl0sIHBvaW50X21hdHJpeFszXSk7Ci0gICAgIHdoaWxlIChzID0gc3RyY2hyKGhfc3RyaW5nLCAnLScpKSAqcz0nfic7Ci0gICAgIHdoaWxlIChzID0gc3RyY2hyKHBvaW50X3N0cmluZywgJy0nKSkgKnM9J34nOworICAgICB3aGlsZSAoKHMgPSBzdHJjaHIoaF9zdHJpbmcsICctJykpKSAqcz0nfic7CisgICAgIHdoaWxlICgocyA9IHN0cmNocihwb2ludF9zdHJpbmcsICctJykpKSAqcz0nfic7CiAgICB9IGVsc2UgewogICAgICBzcHJpbnRmKGhfc3RyaW5nLCAiJWQiLCBoKTsKICAgICAgc3ByaW50Zihwb2ludF9zdHJpbmcsICIlZCIsIHBvaW50KTsKZGlmZiAtLWdpdCBhL2lmMTYzMi9idWlsdGluLmMgYi9pZjE2MzIvYnVpbHRpbi5jCmluZGV4IGMwNmQ5MWMuLjc0ZmRiZDYgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9idWlsdGluLmMKKysrIGIvaWYxNjMyL2J1aWx0aW4uYwpAQCAtMTg2LDYgKzE4Niw3IEBACiAgICAgTkVfTU9EVUxFICpwTW9kdWxlOwogICAgIFdPUkQgdmVjdG9yOwogICAgIEhNT0RVTEUxNiBoTW9kdWxlOworICAgIFdPUkQgY3MsIGRzOwogCiAgICAgZm5CVUlMVElOX0xvYWRNb2R1bGUgPSBCVUlMVElOX0xvYWRNb2R1bGU7CiAKQEAgLTE5Nyw5ICsxOTgsOSBAQAogCiAgICAgLyogU2V0IHRoZSBVU0VSIGFuZCBHREkgaGVhcCBzZWxlY3RvcnMgKi8KIAotICAgIHBNb2R1bGUgICAgICA9IE1PRFVMRV9HZXRQdHIxNiggR2V0TW9kdWxlSGFuZGxlMTYoICJVU0VSIiApKTsKKyAgICBwTW9kdWxlICAgICAgPSBORV9HZXRQdHIoIEdldE1vZHVsZUhhbmRsZTE2KCAiVVNFUiIgKSk7CiAgICAgVVNFUl9IZWFwU2VsID0gKE5FX1NFR19UQUJMRSggcE1vZHVsZSApICsgcE1vZHVsZS0+ZGdyb3VwIC0gMSktPnNlbGVjdG9yOwotICAgIHBNb2R1bGUgICAgICA9IE1PRFVMRV9HZXRQdHIxNiggR2V0TW9kdWxlSGFuZGxlMTYoICJHREkiICkpOworICAgIHBNb2R1bGUgICAgICA9IE5FX0dldFB0ciggR2V0TW9kdWxlSGFuZGxlMTYoICJHREkiICkpOwogICAgIEdESV9IZWFwU2VsICA9IChORV9TRUdfVEFCTEUoIHBNb2R1bGUgKSArIHBNb2R1bGUtPmRncm91cCAtIDEpLT5zZWxlY3RvcjsKIAogICAgIC8qIEluaXRpYWxpemUgS0VSTkVMLjE3OCAoX19XSU5GTEFHUykgd2l0aCB0aGUgY29ycmVjdCBmbGFncyB2YWx1ZSAqLwpAQCAtMjA3LDYgKzIwOCwxMiBAQAogICAgIGhNb2R1bGUgPSBHZXRNb2R1bGVIYW5kbGUxNiggIktFUk5FTCIgKTsKICAgICBORV9TZXRFbnRyeVBvaW50KCBoTW9kdWxlLCAxNzgsIEdldFdpbkZsYWdzKCkgKTsKIAorICAgIC8qIEluaXRpYWxpemUgS0VSTkVMLjQ1NC80NTUgKF9fRkxBVENTL19fRkxBVERTKSAqLworCisgICAgR0VUX0NTKGNzKTsgR0VUX0RTKGRzKTsKKyAgICBORV9TZXRFbnRyeVBvaW50KCBoTW9kdWxlLCA0NTQsIGNzICk7CisgICAgTkVfU2V0RW50cnlQb2ludCggaE1vZHVsZSwgNDU1LCBkcyApOworICAKICAgICAvKiBJbml0aWFsaXplIHRoZSByZWFsLW1vZGUgc2VsZWN0b3IgZW50cnkgcG9pbnRzICovCiAKICNkZWZpbmUgU0VUX0VOVFJZX1BPSU5UKCBudW0sIGFkZHIgKSBcCkBAIC0yNDcsNyArMjU0LDcgQEAKICAqIExvYWQgYSBidWlsdC1pbiBtb2R1bGUuIElmIHRoZSAnZm9yY2UnIHBhcmFtZXRlciBpcyBGQUxTRSwgd2Ugb25seQogICogbG9hZCB0aGUgbW9kdWxlIGlmIGl0IGhhcyBub3QgYmVlbiBkaXNhYmxlZCB2aWEgdGhlIC1kbGwgb3B0aW9uLgogICovCi1ITU9EVUxFMzIgQlVJTFRJTl9Mb2FkTW9kdWxlKCBMUENTVFIgbmFtZSwgQk9PTDMyIGZvcmNlICkKK0hNT0RVTEUxNiBCVUlMVElOX0xvYWRNb2R1bGUoIExQQ1NUUiBuYW1lLCBCT09MMzIgZm9yY2UgKQogewogICAgIEJVSUxUSU4xNl9ETEwgKnRhYmxlOwogICAgIGNoYXIgZGxsbmFtZVsxNl0sICpwOwpAQCAtMjYwLDggKzI2Nyw3IEBACiAKICAgICBmb3IgKHRhYmxlID0gQnVpbHRpbkRMTHM7IHRhYmxlLT5kZXNjcjsgdGFibGUrKykKICAgICAgICAgaWYgKCFsc3RyY21waTMyQSggdGFibGUtPmRlc2NyLT5uYW1lLCBkbGxuYW1lICkpIGJyZWFrOwotICAgIGlmICghdGFibGUtPmRlc2NyKSByZXR1cm4gQlVJTFRJTjMyX0xvYWRNb2R1bGUoIG5hbWUsIGZvcmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NfQ3VycmVudCgpICk7CisgICAgaWYgKCF0YWJsZS0+ZGVzY3IpIHJldHVybiAwOwogICAgIGlmICgodGFibGUtPmZsYWdzICYgRExMX0ZMQUdfTk9UX1VTRUQpICYmICFmb3JjZSkgcmV0dXJuIDA7CiAKICAgICByZXR1cm4gQlVJTFRJTl9Eb0xvYWRNb2R1bGUxNiggdGFibGUtPmRlc2NyICk7CkBAIC0yODEsNyArMjg3LDcgQEAKICAgICByZWdpc3RlciBCWVRFICpwOwogICAgIE5FX01PRFVMRSAqcE1vZHVsZTsKIAotICAgIGlmICghKHBNb2R1bGUgPSBNT0RVTEVfR2V0UHRyMTYoIEZhckdldE93bmVyKCBHbG9iYWxIYW5kbGUxNihjcykgKSkpKQorICAgIGlmICghKHBNb2R1bGUgPSBORV9HZXRQdHIoIEZhckdldE93bmVyKCBHbG9iYWxIYW5kbGUxNihjcykgKSkpKQogICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIC8qIFNlYXJjaCBmb3IgdGhlIG9yZGluYWwgKi8KZGlmZiAtLWdpdCBhL2lmMTYzMi9jb21tZGxnLnNwZWMgYi9pZjE2MzIvY29tbWRsZy5zcGVjCmluZGV4IDAxYzk3YWUuLjdlMGEzYmEgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9jb21tZGxnLnNwZWMKKysrIGIvaWYxNjMyL2NvbW1kbGcuc3BlYwpAQCAtMyw3ICszLDcgQEAKIAogMSAgIHBhc2NhbDE2IEdldE9wZW5GaWxlTmFtZShzZWdwdHIpIEdldE9wZW5GaWxlTmFtZTE2CiAyICAgcGFzY2FsMTYgR2V0U2F2ZUZpbGVOYW1lKHNlZ3B0cikgR2V0U2F2ZUZpbGVOYW1lMTYKLTUgICBwYXNjYWwxNiBDaG9vc2VDb2xvcihwdHIpIENob29zZUNvbG9yCis1ICAgcGFzY2FsMTYgQ2hvb3NlQ29sb3IocHRyKSBDaG9vc2VDb2xvcjE2CiA2ICAgcGFzY2FsICAgRmlsZU9wZW5EbGdQcm9jKHdvcmQgd29yZCB3b3JkIGxvbmcpIEZpbGVPcGVuRGxnUHJvYwogNyAgIHBhc2NhbCAgIEZpbGVTYXZlRGxnUHJvYyh3b3JkIHdvcmQgd29yZCBsb25nKSBGaWxlU2F2ZURsZ1Byb2MKIDggICBwYXNjYWwgICBDb2xvckRsZ1Byb2Mod29yZCB3b3JkIHdvcmQgbG9uZykgQ29sb3JEbGdQcm9jCmRpZmYgLS1naXQgYS9pZjE2MzIvZGRlbWwuc3BlYyBiL2lmMTYzMi9kZGVtbC5zcGVjCmluZGV4IDMwNDk4ZDEuLjM0YWE0ZjkgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9kZGVtbC5zcGVjCisrKyBiL2lmMTYzMi9kZGVtbC5zcGVjCkBAIC00LDcgKzQsNyBAQAogMiBwYXNjYWwxNiBEZGVJbml0aWFsaXplKHB0ciBzZWdwdHIgbG9uZyBsb25nKSBEZGVJbml0aWFsaXplMTYKIDMgcGFzY2FsMTYgRGRlVW5pbml0aWFsaXplKGxvbmcpIERkZVVuaW5pdGlhbGl6ZTE2CiA0IHBhc2NhbCBEZGVDb25uZWN0TGlzdChsb25nIHdvcmQgd29yZCB3b3JkIHB0cikgRGRlQ29ubmVjdExpc3QxNgotNSBwYXNjYWwgRGRlUXVlcnlOZXh0U2VydmVyKHdvcmQgd29yZCkgRGRlUXVlcnlOZXh0U2VydmVyCis1IHBhc2NhbCBEZGVRdWVyeU5leHRTZXJ2ZXIod29yZCB3b3JkKSBEZGVRdWVyeU5leHRTZXJ2ZXIxNgogNiBwYXNjYWwgRGRlRGlzY29ubmVjdExpc3Qod29yZCkgRGRlRGlzY29ubmVjdExpc3QxNgogNyBwYXNjYWwgICBEZGVDb25uZWN0KGxvbmcgbG9uZyBsb25nIHB0cikgRGRlQ29ubmVjdDE2CiA4IHBhc2NhbDE2IERkZURpc2Nvbm5lY3QobG9uZykgRGRlRGlzY29ubmVjdDE2CmRpZmYgLS1naXQgYS9pZjE2MzIva2VybmVsLnNwZWMgYi9pZjE2MzIva2VybmVsLnNwZWMKaW5kZXggOGE4MjE2OS4uYWQ0NTFkMyAxMDA2NDQKLS0tIGEvaWYxNjMyL2tlcm5lbC5zcGVjCisrKyBiL2lmMTYzMi9rZXJuZWwuc3BlYwpAQCAtMjAyLDcgKzIwMiw3IEBACiAyMDAgcmV0dXJuIFZhbGlkYXRlRnJlZVNwYWNlcyAwIDAKIDIwMSBzdHViIFJlcGxhY2VJbnN0CiAyMDIgc3R1YiBSZWdpc3RlclB0cmFjZQotMjAzIHJlZ2lzdGVyIERlYnVnQnJlYWsoKSBEZWJ1Z0JyZWFrMTYKKzIwMyByZWdpc3RlciBEZWJ1Z0JyZWFrKCkgRGVidWdCcmVhawogMjA0IHN0dWIgU3dhcFJlY29yZGluZwogMjA1IHN0dWIgQ1ZXQnJlYWsKIDIwNiBwYXNjYWwxNiBBbGxvY1NlbGVjdG9yQXJyYXkod29yZCkgQWxsb2NTZWxlY3RvckFycmF5CkBAIC0yNzcsOSArMjc3LDkgQEAKIDM1NCBwYXNjYWwgICBHZXRBcHBDb21wYXRGbGFncyh3b3JkKSBHZXRBcHBDb21wYXRGbGFnczE2CiAzNTUgcGFzY2FsMTYgR2V0V2luRGVidWdJbmZvKHB0ciB3b3JkKSBHZXRXaW5EZWJ1Z0luZm8KIDM1NiBwYXNjYWwxNiBTZXRXaW5EZWJ1Z0luZm8ocHRyKSBTZXRXaW5EZWJ1Z0luZm8KLTM1NyBzdHViIEtFUk5FTF8zNTcKKzM1NyBwYXNjYWwgTWFwU0woc2VncHRyKSBNYXBTTAogMzU4IHBhc2NhbCBNYXBMUyhsb25nKSBNYXBMUwotMzU5IHBhc2NhbCBVbk1hcExTKHB0cikgVW5NYXBMUworMzU5IHBhc2NhbCBVbk1hcExTKHNlZ3B0cikgVW5NYXBMUwogMzYwIHN0dWIgT3BlbkZpbGVFeAogIzM2MSBQSUdMRVRfMzYxCiAzNjUgc3R1YiBLRVJORUxfMzY1CkBAIC0zMTEsMTUgKzMxMSwxNSBAQAogNDQ3IHN0dWIgS0VSTkVMXzQ0NwogNDQ5IHBhc2NhbCBLRVJORUxfNDQ5KCkgS0VSTkVMXzQ0OQogNDUwIHBhc2NhbDE2IEtFUk5FTF80NTAoKSBzdHViX0tFUk5FTF80NTAKLTQ1NCBzdHViIEtFUk5FTF80NTQKLTQ1NSBzdHViIEtFUk5FTF80NTUKKzQ1NCBlcXVhdGUgX19GTEFUQ1MgMCAgICMgaW5pdGlhbGl6ZWQgYnkgQlVJTFRJTl9Jbml0KCkKKzQ1NSBlcXVhdGUgX19GTEFURFMgMCAgICMgaW5pdGlhbGl6ZWQgYnkgQlVJTFRJTl9Jbml0KCkKIDQ3MSBwYXNjYWwgS0VSTkVMXzQ3MSgpIF9LRVJORUxfNDcxCiA0NzIgcmVnaXN0ZXIgS0VSTkVMXzQ3MigpIF9LRVJORUxfNDcyCiA0NzMgc3R1YiBLRVJORUxfNDczCi00NzUgc3R1YiBLRVJORUxfNDc1Cis0NzUgcmV0dXJuIEtFUk5FTF80NzUgMCAwCiA0ODAgc3R1YiBLRVJORUxfNDgwCiA0ODEgc3R1YiBLRVJORUxfNDgxCi00ODIgc3R1YiBLRVJORUxfNDgyCis0ODIgcGFzY2FsIExvYWRMaWJyYXJ5MzIoc3RyKSBMb2FkTGlicmFyeTMyQQogNDg1IHN0dWIgS0VSTkVMXzQ4NQogNDkxIHN0dWIgUmVnaXN0ZXJTZXJ2aWNlUHJvY2VzcwogNTAwIHN0dWIgS0VSTkVMXzUwMApAQCAtMzQ2LDE2ICszNDYsMTYgQEAKIDYwNCBzdHViIEtFUk5FTF82MDQKIDYwNSBzdHViIEtFUk5FTF82MDUKIDYwNiBzdHViIEtFUk5FTF82MDYKLTYwNyBzdHViIEtFUk5FTF82MDcKLTYwOCBzdHViIEtFUk5FTF82MDgKLTYxMSBzdHViIEtFUk5FTF82MTEKKzYwNyBwYXNjYWwgS0VSTkVMXzYwNyhsb25nIGxvbmcgbG9uZykgX0tFUk5FTF82MDcKKzYwOCBwYXNjYWwgS0VSTkVMXzYwOChsb25nIGxvbmcgbG9uZykgX0tFUk5FTF82MDgKKzYxMSBwYXNjYWwgS0VSTkVMXzYxMShsb25nIGxvbmcpIF9LRVJORUxfNjExCiA2MTIgc3R1YiBLRVJORUxfNjEyCiA2MTMgc3R1YiBLRVJORUxfNjEzCiA2MTQgc3R1YiBLRVJORUxfNjE0CiA2MTkgcGFzY2FsIEtFUk5FTF82MTkod29yZCBsb25nIGxvbmcpIF9LRVJORUxfNjE5CiA2MjEgc3R1YiBLRVJORUxfNjIxCiA2Mjcgc3R1YiBJc0JhZEZsYXRSZWFkV3JpdGVQdHIKLTYzMCBzdHViIEtFUk5FTF82MzAKLTYzMSByZWdpc3RlciBGVU5DMDA0KHdvcmQgd29yZCB3b3JkKSBGVU5DMDA0CSNDMTZUaGtTbDAxPwotNjUxIHN0dWIgS0VSTkVMXzY1MQkJCQkjVGh1bmtDb25uZWN0MTY/Cis2MzAgcmVnaXN0ZXIgQzE2VGhrU0woKSBDMTZUaGtTTAorNjMxIHJlZ2lzdGVyIEMxNlRoa1NMMDEoKSBDMTZUaGtTTDAxCis2NTEgcGFzY2FsIFRodW5rQ29ubmVjdDE2KHN0ciBzdHIgd29yZCBsb25nIHB0ciBzdHIgd29yZCkgVGh1bmtDb25uZWN0MTYKIDcwMCBwYXNjYWwgS0VSTkVMXzcwMCgpIHN0dWJfS0VSTkVMXzcwMApkaWZmIC0tZ2l0IGEvaWYxNjMyL3NpZ25hbC5jIGIvaWYxNjMyL3NpZ25hbC5jCmluZGV4IGUwN2Q0MWEuLjljMjJkODIgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9zaWduYWwuYworKysgYi9pZjE2MzIvc2lnbmFsLmMKQEAgLTg2LDYgKzg2LDcgQEAKICAqCiAgKiBTZXQgdGhlIHJlZ2lzdGVyIHZhbHVlcyBmcm9tIGEgc2lnY29udGV4dC4gCiAgKi8KKyNpZmRlZiBVTlVTRURfRlVOQ1RJT05TCiBzdGF0aWMgdm9pZCBTSUdOQUxfU2V0U2lnQ29udGV4dCggY29uc3QgU0lHQ09OVEVYVCAqc2lnY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUICpjb250ZXh0ICkKIHsKQEAgLTExNiw2ICsxMTcsNyBAQAogICAgIEdTX3JlZyhjb250ZXh0KSAmPSAweGZmZmY7CiAjZW5kaWYKIH0KKyNlbmRpZgogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTIzLDYgKzEyNSw3IEBACiAgKgogICogQnVpbGQgYSBzaWdjb250ZXh0IGZyb20gdGhlIHJlZ2lzdGVyIHZhbHVlcy4KICAqLworI2lmZGVmIFVOVVNFRF9GVU5DVElPTlMKIHN0YXRpYyB2b2lkIFNJR05BTF9HZXRTaWdDb250ZXh0KCBTSUdDT05URVhUICpzaWdjb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENPTlRFWFQgKmNvbnRleHQgKQogewpAQCAtMTUxLDYgKzE1NCw3IEBACiAgICAgU0VUX0dTKCBHU19yZWcoJkRFQlVHX2NvbnRleHQpICk7CiAjZW5kaWYKIH0KKyNlbmRpZgogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY2NvbmZpZy5oIGIvaW5jbHVkZS9hY2NvbmZpZy5oCmluZGV4IDQ1NDg5ZmQuLjIwZmFhMmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNjb25maWcuaAorKysgYi9pbmNsdWRlL2FjY29uZmlnLmgKQEAgLTI2LDMgKzI2LDE1IEBACiAKIC8qIERlZmluZSBpZiB0aGUgc3RydWN0IHN0YXRmcyBoYXMgdGhlIG1lbWJlciBiZnJlZSAqLwogI3VuZGVmIFNUQVRGU19IQVNfQkZSRUUKKworLyogRGVmaW5lIGlmIHdlIGhhdmUgYSB3b3JraW5nIHNpZ2FsdHN0YWNrICovCisjdW5kZWYgSEFWRV9XT1JLSU5HX1NJR0FMVFNUQUNLCisKKy8qIERlZmluZSBpZiB0aGUgc3RydWN0IHN0YXRmcyBpcyBkZWZpbmVkIGJ5IDxzeXMvdmZzLmg+ICovCisjdW5kZWYgU1RBVEZTX0RFRklORURfQllfU1lTX1ZGUworCisvKiBEZWZpbmUgaWYgdGhlIHN0cnVjdCBzdGF0ZnMgaXMgZGVmaW5lZCBieSA8c3lzL3N0YXRmcy5oPiAqLworI3VuZGVmIFNUQVRGU19ERUZJTkVEX0JZX1NZU19TVEFURlMKKworLyogRGVmaW5lIGlmIHRoZSBzdHJ1Y3Qgc3RhdGZzIGlzIGRlZmluZWQgYnkgPHN5cy9tb3VudC5oPiAqLworI3VuZGVmIFNUQVRGU19ERUZJTkVEX0JZX1NZU19NT1VOVApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb21tY3RybC5oIGIvaW5jbHVkZS9jb21tY3RybC5oCmluZGV4IDJlZDk1ZjYuLmEyNjcwZTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29tbWN0cmwuaAorKysgYi9pbmNsdWRlL2NvbW1jdHJsLmgKQEAgLTksNiArOSwzMCBAQAogCiB2b2lkIFdJTkFQSSBJbml0Q29tbW9uQ29udHJvbHModm9pZCk7CiAKK3R5cGVkZWYgc3RydWN0IHRhZ0lOSVRDT01NT05DT05UUk9MU0VYIHsKKyAgICBEV09SRCBkd1NpemU7CisgICAgRFdPUkQgZHdJQ0M7Cit9IElOSVRDT01NT05DT05UUk9MU0VYLCAqTFBJTklUQ09NTU9OQ09OVFJPTFNFWDsKKworQk9PTDMyIFdJTkFQSSBJbml0Q29tbW9uQ29udHJvbHNFeChMUElOSVRDT01NT05DT05UUk9MU0VYKTsKKworI2RlZmluZSBJQ0NfTElTVFZJRVdfQ0xBU1NFUyAgIDB4MDAwMDAwMDEgIC8qIGxpc3R2aWV3LCBoZWFkZXIgKi8KKyNkZWZpbmUgSUNDX1RSRUVWSUVXX0NMQVNTRVMgICAweDAwMDAwMDAyICAvKiB0cmVldmlldywgdG9vbHRpcHMgKi8KKyNkZWZpbmUgSUNDX0JBUl9DTEFTU0VTICAgICAgICAweDAwMDAwMDA0ICAvKiB0b29sYmFyLCBzdGF0dXNiYXIsIHRyYWNrYmFyLCB0b29sdGlwcyAqLworI2RlZmluZSBJQ0NfVEFCX0NMQVNTRVMgICAgICAgIDB4MDAwMDAwMDggIC8qIHRhYiwgdG9vbHRpcHMgKi8KKyNkZWZpbmUgSUNDX1VQRE9XTl9DTEFTUyAgICAgICAweDAwMDAwMDEwICAvKiB1cGRvd24gKi8KKyNkZWZpbmUgSUNDX1BST0dSRVNTX0NMQVNTICAgICAweDAwMDAwMDIwICAvKiBwcm9ncmVzcyAqLworI2RlZmluZSBJQ0NfSE9US0VZX0NMQVNTICAgICAgIDB4MDAwMDAwNDAgIC8qIGhvdGtleSAqLworI2RlZmluZSBJQ0NfQU5JTUFURV9DTEFTUyAgICAgIDB4MDAwMDAwODAgIC8qIGFuaW1hdGUgKi8KKyNkZWZpbmUgSUNDX1dJTjk1X0NMQVNTRVMgICAgICAweDAwMDAwMEZGCisjZGVmaW5lIElDQ19EQVRFX0NMQVNTRVMgICAgICAgMHgwMDAwMDEwMCAgLyogbW9udGggcGlja2VyLCBkYXRlIHBpY2tlciwgdGltZSBwaWNrZXIsIHVwZG93biAqLworI2RlZmluZSBJQ0NfVVNFUkVYX0NMQVNTRVMgICAgIDB4MDAwMDAyMDAgIC8qIGNvbWJvZXggKi8KKyNkZWZpbmUgSUNDX0NPT0xfQ0xBU1NFUyAgICAgICAweDAwMDAwNDAwICAvKiByZWJhciAoY29vbGJhcikgKi8KKyNkZWZpbmUgSUNDX0lOVEVSTkVUX0NMQVNTRVMgICAweDAwMDAwODAwICAvKiBJUCBhZGRyZXNzLCAuLi4gKi8KKyNkZWZpbmUgSUNDX1BBR0VTQ1JPTExFUl9DTEFTUyAweDAwMDAxMDAwICAvKiBwYWdlIHNjcm9sbGVyICovCisjZGVmaW5lIElDQ19OQVRJVkVGTlRDVExfQ0xBU1MgMHgwMDAwMjAwMCAgLyogbmF0aXZlIGZvbnQgY29udHJvbCA/Pz8qLworCisKIC8qIGNvbW1vbiBjb250cm9sIHN0eWxlcyAqLwogCiAjZGVmaW5lIENDU19UT1AgICAgICAgICAgICAgMHgwMDAwMDAwMUwKQEAgLTI1LDEwICs0OSwzMSBAQAogCiAKIC8qIGNvbW1vbiBjb250cm9sIHNoYXJlZCBtZXNzYWdlcyAqLwotCiAjZGVmaW5lIENDTV9GSVJTVCAgICAgICAgICAgMHgyMDAwCiAKLSNkZWZpbmUgQ0NNX1NFVEJLQ09MT1IgICAgICAoQ0NNX0ZJUlNUKzEpICAgICAvLyBsUGFyYW0gPSBia0NvbG9yCisjZGVmaW5lIENDTV9TRVRCS0NPTE9SICAgICAgKENDTV9GSVJTVCsxKSAgICAgLyogbFBhcmFtID0gYmtDb2xvciAqLworCisKKy8qIGNvbW1vbiBub3RpZmljYXRpb24gY29kZXMgKi8KKyNkZWZpbmUgTk1fRklSU1QgICAgICAgICAgICAgKDBVLTBVKQorI2RlZmluZSBOTV9MQVNUICAgICAgICAgICAgICAoMFUtOTlVKQorCisjZGVmaW5lIE5NX09VVE9GTUVNT1JZICAgICAgIChOTV9GSVJTVC0xKQorI2RlZmluZSBOTV9DTElDSyAgICAgICAgICAgICAoTk1fRklSU1QtMikKKyNkZWZpbmUgTk1fREJMQ0xLICAgICAgICAgICAgKE5NX0ZJUlNULTMpCisjZGVmaW5lIE5NX1JFVFVSTiAgICAgICAgICAgIChOTV9GSVJTVC00KQorI2RlZmluZSBOTV9SQ0xJQ0sgICAgICAgICAgICAoTk1fRklSU1QtNSkKKyNkZWZpbmUgTk1fUkRCTENMSyAgICAgICAgICAgKE5NX0ZJUlNULTYpCisjZGVmaW5lIE5NX1NFVEZPQ1VTICAgICAgICAgIChOTV9GSVJTVC03KQorI2RlZmluZSBOTV9LSUxMRk9DVVMgICAgICAgICAoTk1fRklSU1QtOCkKKyNkZWZpbmUgTk1fQ1VTVE9NRFJBVyAgICAgICAgKE5NX0ZJUlNULTEyKQorI2RlZmluZSBOTV9IT1ZFUiAgICAgICAgICAgICAoTk1fRklSU1QtMTMpCisjZGVmaW5lIE5NX05DSElUVEVTVCAgICAgICAgIChOTV9GSVJTVC0xNCkKKyNkZWZpbmUgTk1fS0VZRE9XTiAgICAgICAgICAgKE5NX0ZJUlNULTE1KQorI2RlZmluZSBOTV9SRUxFQVNFRENBUFRVUkUgICAoTk1fRklSU1QtMTYpCisjZGVmaW5lIE5NX1NFVENVUlNPUiAgICAgICAgIChOTV9GSVJTVC0xNykKKyNkZWZpbmUgTk1fQ0hBUiAgICAgICAgICAgICAgKE5NX0ZJUlNULTE4KQorI2RlZmluZSBOTV9UT09MVElQU0NSRUFURUQgICAoTk1fRklSU1QtMTkpCiAKIAogLyogU3RhdHVzV2luZG93ICovCkBAIC01NCwxNCArOTksMjYgQEAKICNkZWZpbmUgU0JfU0VUTUlOSEVJR0hUICAgICAgIChXTV9VU0VSKzgpCiAjZGVmaW5lIFNCX1NJTVBMRSAgICAgICAgICAgICAoV01fVVNFUis5KQogI2RlZmluZSBTQl9HRVRSRUNUICAgICAgICAgICAgKFdNX1VTRVIrMTApCisjZGVmaW5lIFNCX0lTU0lNUExFICAgICAgICAgICAoV01fVVNFUisxNCkKKyNkZWZpbmUgU0JfU0VUSUNPTiAgICAgICAgICAgIChXTV9VU0VSKzE1KQorI2RlZmluZSBTQl9HRVRJQ09OICAgICAgICAgICAgKFdNX1VTRVIrMjApCisjZGVmaW5lIFNCX1NFVEJLQ09MT1IgICAgICAgICBDQ01fU0VUQktDT0xPUiAgIC8qIGxQYXJhbSA9IGJrQ29sb3IgKi8KIAogI2RlZmluZSBTQlRfTk9CT1JERVJTICAgICAgICAgMHgwMTAwCiAjZGVmaW5lIFNCVF9QT1BPVVQgICAgICAgICAgICAweDAyMDAKLSNkZWZpbmUgU0JUX1JUTFJFQURJTkcgICAgICAgIDB4MDQwMAorI2RlZmluZSBTQlRfUlRMUkVBRElORyAgICAgICAgMHgwNDAwICAvKiBub3Qgc3VwcG9ydGVkICovCiAjZGVmaW5lIFNCVF9PV05FUkRSQVcgICAgICAgICAweDEwMDAKIAogI2RlZmluZSBTQkFSU19TSVpFR1JJUCAgICAgICAgMHgwMTAwCiAKKyNkZWZpbmUgU0JOX0ZJUlNUICAgICAgICAgICAgICgwVS04ODBVKQorI2RlZmluZSBTQk5fTEFTVCAgICAgICAgICAgICAgKDBVLTg5OVUpCisjZGVmaW5lIFNCTl9TSU1QTEVNT0RFQ0hBTkdFICAoU0JOX0ZJUlNULTApCisKK3ZvaWQgV0lOQVBJIE1lbnVIZWxwIChVSU5UMzIsIFdQQVJBTTMyLCBMUEFSQU0sIEhNRU5VMzIsCisgICAgICAgICAgICAgICAgICAgICAgSElOU1RBTkNFMzIsIEhXTkQzMiwgTFBVSU5UMzIpOworCisKIC8qIFVwRG93biAqLwogCiAjZGVmaW5lIFVQRE9XTl9DTEFTUzE2ICAgICAgICAibXNjdGxzX3VwZG93biIKQEAgLTIwMCwyMiArMjU3LDIyIEBACiAKIAogdHlwZWRlZiBzdHJ1Y3QgX0lNQUdFTElTVERSQVdQQVJBTVMKLXsgCi0gICAgRFdPUkQgICAgICAgY2JTaXplOyAKLSAgICBISU1BR0VMSVNUICBoaW1sOyAKLSAgICBJTlQzMiAgICAgICBpOyAKLSAgICBIREMzMiAgICAgICBoZGNEc3Q7IAotICAgIElOVDMyICAgICAgIHg7IAotICAgIElOVDMyICAgICAgIHk7IAotICAgIElOVDMyICAgICAgIGN4OyAKLSAgICBJTlQzMiAgICAgICBjeTsgCi0gICAgSU5UMzIgICAgICAgeEJpdG1hcDsgICAgICAgIC8vIHggb2ZmZXN0IGZyb20gdGhlIHVwcGVybGVmdCBvZiBiaXRtYXAgCi0gICAgSU5UMzIgICAgICAgeUJpdG1hcDsgICAgICAgIC8vIHkgb2Zmc2V0IGZyb20gdGhlIHVwcGVybGVmdCBvZiBiaXRtYXAgCi0gICAgQ09MT1JSRUYgICAgcmdiQms7IAotICAgIENPTE9SUkVGICAgIHJnYkZnOyAKLSAgICBVSU5UMzIgICAgICBmU3R5bGU7IAotICAgIERXT1JEICAgICAgIGR3Um9wOyAKLX0gSU1BR0VMSVNURFJBV1BBUkFNUywgKkxQSU1BR0VMSVNURFJBV1BBUkFNUzsgCit7CisgICAgRFdPUkQgICAgICAgY2JTaXplOworICAgIEhJTUFHRUxJU1QgIGhpbWw7CisgICAgSU5UMzIgICAgICAgaTsKKyAgICBIREMzMiAgICAgICBoZGNEc3Q7CisgICAgSU5UMzIgICAgICAgeDsKKyAgICBJTlQzMiAgICAgICB5OworICAgIElOVDMyICAgICAgIGN4OworICAgIElOVDMyICAgICAgIGN5OworICAgIElOVDMyICAgICAgIHhCaXRtYXA7ICAvKiB4IG9mZmVzdCBmcm9tIHRoZSB1cHBlcmxlZnQgb2YgYml0bWFwICovCisgICAgSU5UMzIgICAgICAgeUJpdG1hcDsgIC8qIHkgb2Zmc2V0IGZyb20gdGhlIHVwcGVybGVmdCBvZiBiaXRtYXAgKi8KKyAgICBDT0xPUlJFRiAgICByZ2JCazsKKyAgICBDT0xPUlJFRiAgICByZ2JGZzsKKyAgICBVSU5UMzIgICAgICBmU3R5bGU7CisgICAgRFdPUkQgICAgICAgZHdSb3A7Cit9IElNQUdFTElTVERSQVdQQVJBTVMsICpMUElNQUdFTElTVERSQVdQQVJBTVM7CiAKICAKIElOVDMyICAgICAgV0lOQVBJIEltYWdlTGlzdF9BZGQoSElNQUdFTElTVCxIQklUTUFQMzIsSEJJVE1BUDMyKTsKQEAgLTI2NSw0ICszMjIsMTQ0IEBACiAjZGVmaW5lIEltYWdlTGlzdF9SZW1vdmVBbGwoaGltbCkgSW1hZ2VMaXN0X1JlbW92ZShoaW1sLC0xKQogCiAKKy8qIEhlYWRlciBjb250cm9sICovCisKKyNkZWZpbmUgV0NfSEVBREVSMTYgICAgIlN5c0hlYWRlciIgCisjZGVmaW5lIFdDX0hFQURFUjMyQSAgICJTeXNIZWFkZXIzMiIgCisjZGVmaW5lIFdDX0hFQURFUjMyVyAgTCJTeXNIZWFkZXIzMiIgCisKKyNkZWZpbmUgV0NfSEVBREVSICAgICBXSU5FTElCX05BTUVfQVcoV0NfSEVBREVSKQorIAorI2RlZmluZSBIRFNfSE9SWiAgICAgICAgICAgICAgICAweDAwMDAgCisjZGVmaW5lIEhEU19CVVRUT05TICAgICAgICAgICAgIDB4MDAwMiAKKyNkZWZpbmUgSERTX0hPVFRSQUNLICAgICAgICAgICAgMHgwMDA0IAorI2RlZmluZSBIRFNfSElEREVOICAgICAgICAgICAgICAweDAwMDggCisjZGVmaW5lIEhEU19EUkFHRFJPUCAgICAgICAgICAgIDB4MDA0MCAKKyNkZWZpbmUgSERTX0ZVTExEUkFHICAgICAgICAgICAgMHgwMDgwIAorCisjZGVmaW5lIEhESV9XSURUSCAgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBIRElfSEVJR0hUICAgICAgICAgICAgICBIRElfV0lEVEgKKyNkZWZpbmUgSERJX1RFWFQgICAgICAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIEhESV9GT1JNQVQgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBIRElfTFBBUkFNICAgICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgSERJX0JJVE1BUCAgICAgICAgICAgICAgMHgwMDEwCisjZGVmaW5lIEhESV9JTUFHRSAgICAgICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBIRElfRElfU0VUSVRFTSAgICAgICAgICAweDAwNDAKKyNkZWZpbmUgSERJX09SREVSICAgICAgICAgICAgICAgMHgwMDgwCisKKyNkZWZpbmUgSERGX0xFRlQgICAgICAgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIEhERl9SSUdIVCAgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBIREZfQ0VOVEVSICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgSERGX0pVU1RJRllNQVNLICAgICAgICAgMHgwMDAzCisKKyNkZWZpbmUgSERGX0lNQUdFICAgICAgICAgICAgICAgMHgwODAwCisjZGVmaW5lIEhERl9CSVRNQVBfT05fUklHSFQgICAgIDB4MTAwMAorI2RlZmluZSBIREZfQklUTUFQICAgICAgICAgICAgICAweDIwMDAKKyNkZWZpbmUgSERGX1NUUklORyAgICAgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIEhERl9PV05FUkRSQVcgICAgICAgICAgIDB4ODAwMAorCisjZGVmaW5lIEhIVF9OT1dIRVJFICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBISFRfT05IRUFERVIgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgSEhUX09ORElWSURFUiAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIEhIVF9PTkRJVk9QRU4gICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBISFRfQUJPVkUgICAgICAgICAgICAgICAweDAxMDAKKyNkZWZpbmUgSEhUX0JFTE9XICAgICAgICAgICAgICAgMHgwMjAwCisjZGVmaW5lIEhIVF9UT1JJR0hUICAgICAgICAgICAgIDB4MDQwMAorI2RlZmluZSBISFRfVE9MRUZUICAgICAgICAgICAgICAweDA4MDAKKworI2RlZmluZSBIRE1fRklSU1QgICAgICAgICAgICAgICAweDEyMDAKKyNkZWZpbmUgSERNX0dFVElURU1DT1VOVCAgICAgICAgKEhETV9GSVJTVCswKQorI2RlZmluZSBIRE1fSU5TRVJUSVRFTTMyQSAgICAgICAoSERNX0ZJUlNUKzEpCisjZGVmaW5lIEhETV9JTlNFUlRJVEVNMzJXICAgICAgIChIRE1fRklSU1QrMTApCisjZGVmaW5lIEhETV9JTlNFUlRJVEVNIFdJTkVMSUJfTkFNRV9BVyhIRE1fSU5TRVJUSVRFTSkKKyNkZWZpbmUgSERNX0RFTEVURUlURU0gICAgICAgICAgKEhETV9GSVJTVCsyKQorI2RlZmluZSBIRE1fR0VUSVRFTTMyQSAgICAgICAgICAoSERNX0ZJUlNUKzMpCisjZGVmaW5lIEhETV9HRVRJVEVNMzJXICAgICAgICAgIChIRE1fRklSU1QrMTEpCisjZGVmaW5lIEhETV9HRVRJVEVNIFdJTkVMSUJfTkFNRV9BVyhIRE1fR0VUSVRFTSkKKyNkZWZpbmUgSERNX1NFVElURU0zMkEgICAgICAgICAgKEhETV9GSVJTVCs0KQorI2RlZmluZSBIRE1fU0VUSVRFTTMyVyAgICAgICAgICAoSERNX0ZJUlNUKzEyKQorI2RlZmluZSBIRE1fU0VUSVRFTSBXSU5FTElCX05BTUVfQVcoSERNX1NFVElURU0pCisjZGVmaW5lIEhETV9MQVlPVVQgICAgICAgICAgICAgIChIRE1fRklSU1QrNSkKKyNkZWZpbmUgSERNX0hJVFRFU1QgICAgICAgICAgICAgKEhETV9GSVJTVCs2KQorI2RlZmluZSBIRE1fR0VUSVRFTVJFQ1QgICAgICAgICAoSERNX0ZJUlNUKzcpCisjZGVmaW5lIEhETV9TRVRJTUFHRUxJU1QgICAgICAgIChIRE1fRklSU1QrOCkKKyNkZWZpbmUgSERNX0dFVElNQUdFTElTVCAgICAgICAgKEhETV9GSVJTVCs5KQorCisKKyNkZWZpbmUgSERNX09SREVSVE9JTkRFWCAgICAgICAgKEhETV9GSVJTVCsxNSkKKyNkZWZpbmUgSERNX0NSRUFURURSQUdJTUFHRSAgICAgKEhETV9GSVJTVCsxNikKKyNkZWZpbmUgSERNX0dFVE9SREVSQVJSQVkgICAgICAgKEhETV9GSVJTVCsxNykKKyNkZWZpbmUgSERNX1NFVE9SREVSQVJSQVkgICAgICAgKEhETV9GSVJTVCsxOCkKKyNkZWZpbmUgSERNX1NFVEhPVERJVklERVIgICAgICAgKEhETV9GSVJTVCsxOSkKKworI2RlZmluZSBIRE5fRklSU1QgICAgICAgICAgICAgICAoMFUtMzAwVSkKKyNkZWZpbmUgSEROX0xBU1QgICAgICAgICAgICAgICAgKDBVLTM5OVUpCisjZGVmaW5lIEhETl9JVEVNQ0hBTkdJTkczMkEgICAgIChIRE5fRklSU1QtMCkKKyNkZWZpbmUgSEROX0lURU1DSEFOR0lORzMyVyAgICAgKEhETl9GSVJTVC0yMCkKKyNkZWZpbmUgSEROX0lURU1DSEFOR0VEMzJBICAgICAgKEhETl9GSVJTVC0xKQorI2RlZmluZSBIRE5fSVRFTUNIQU5HRUQzMlcgICAgICAoSEROX0ZJUlNULTIxKQorI2RlZmluZSBIRE5fSVRFTUNMSUNLMzJBICAgICAgICAoSEROX0ZJUlNULTIpCisjZGVmaW5lIEhETl9JVEVNQ0xJQ0szMlcgICAgICAgIChIRE5fRklSU1QtMjIpCisjZGVmaW5lIEhETl9JVEVNREJMQ0xJQ0szMkEgICAgIChIRE5fRklSU1QtMykKKyNkZWZpbmUgSEROX0lURU1EQkxDTElDSzMyVyAgICAgKEhETl9GSVJTVC0yMykKKyNkZWZpbmUgSEROX0RJVklERVJEQkxDTElDSzMyQSAgKEhETl9GSVJTVC01KQorI2RlZmluZSBIRE5fRElWSURFUkRCTENMSUNLMzJXICAoSEROX0ZJUlNULTI1KQorI2RlZmluZSBIRE5fQkVHSU5UUkFDSzMyQSAgICAgICAoSEROX0ZJUlNULTYpCisjZGVmaW5lIEhETl9CRUdJTlRSQUNLMzJXICAgICAgIChIRE5fRklSU1QtMjYpCisjZGVmaW5lIEhETl9FTkRUUkFDSzMyQSAgICAgICAgIChIRE5fRklSU1QtNykKKyNkZWZpbmUgSEROX0VORFRSQUNLMzJXICAgICAgICAgKEhETl9GSVJTVC0yNykKKyNkZWZpbmUgSEROX1RSQUNLMzJBICAgICAgICAgICAgKEhETl9GSVJTVC04KQorI2RlZmluZSBIRE5fVFJBQ0szMlcgICAgICAgICAgICAoSEROX0ZJUlNULTI4KQorI2RlZmluZSBIRE5fR0VURElTUElORk8zMkEgICAgICAoSEROX0ZJUlNULTkpCisjZGVmaW5lIEhETl9HRVRESVNQSU5GTzMyVyAgICAgIChIRE5fRklSU1QtMjkpCisjZGVmaW5lIEhETl9CRUdJTkRSQUNLICAgICAgICAgIChIRE5fRklSU1QtMTApCisjZGVmaW5lIEhETl9FTkREUkFDSyAgICAgICAgICAgIChIRE5fRklSU1QtMTEpCisKKworI2RlZmluZSBIZWFkZXJfTGF5b3V0KGh3bmRIRCxwbGF5b3V0KSBcCisgIChCT09MMzIpU2VuZE1lc3NhZ2UzMkEoKGh3bmRIRCksSERNX0xBWU9VVCwwLChMUEFSQU0pKExQSERMQVlPVVQpKHBsYXlvdXQpKQorCisKK3R5cGVkZWYgc3RydWN0IF9IRF9MQVlPVVQKK3sKKyAgICBSRUNUMzIgICAgICAqcHJjOworICAgIFdJTkRPV1BPUzMyICpwd3BvczsKK30gSERMQVlPVVQsICpMUEhETEFZT1VUOworCisjZGVmaW5lIEhEX0xBWU9VVCAgIEhETEFZT1VUCisKKwordHlwZWRlZiBzdHJ1Y3QgX0hEX0lURU1BCit7CisgICAgVUlOVDMyICAgIG1hc2s7CisgICAgSU5UMzIgICAgIGN4eTsKKyAgICBMUFNUUiAgICAgcHN6VGV4dDsKKyAgICBIQklUTUFQMzIgaGJtOworICAgIElOVDMyICAgICBjY2hUZXh0TWF4OworICAgIElOVDMyICAgICBmbXQ7CisgICAgTFBBUkFNICAgIGxQYXJhbTsKKyAgICBJTlQzMiAgICAgaUltYWdlOworICAgIElOVDMyICAgICBpT3JkZXI7Cit9IEhEX0lURU1BOworCisKK3R5cGVkZWYgc3RydWN0IF9IRF9ISVRURVNUSU5GTworeworICAgIFBPSU5UMzIgcHQ7CisgICAgVUlOVDMyICBmbGFnczsKKyAgICBJTlQzMiAgIGlJdGVtOworfSBIREhJVFRFU1RJTkZPLCAqTFBIREhJVFRFU1RJTkZPOworCisjZGVmaW5lIEhEX0hJVFRFU1RJTkZPICAgSERISVRURVNUSU5GTworCisKK3R5cGVkZWYgc3RydWN0IHRhZ05NSEVBREVSQQoreworICAgIE5NSERSICAgIGhkcjsKKyAgICBJTlQzMiAgICBpSXRlbTsKKyAgICBJTlQzMiAgICBpQnV0dG9uOworICAgIEhEX0lURU1BICpwaXRlbTsKK30gTk1IRUFERVJBLCAqTFBOTUhFQURFUkE7CisKKwogI2VuZGlmICAvKiBfX1dJTkVfQ09NTUNUUkxfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb21tZGxnLmggYi9pbmNsdWRlL2NvbW1kbGcuaAppbmRleCA3ZWRjN2JhLi5iMGNiZmRkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbW1kbGcuaAorKysgYi9pbmNsdWRlL2NvbW1kbGcuaApAQCAtMTE2LDYgKzExNiw4IEBACiBERUNMX1dJTkVMSUJfVFlQRV9BVyhPUEVORklMRU5BTUUpOwogREVDTF9XSU5FTElCX1RZUEVfQVcoTFBPUEVORklMRU5BTUUpOwogCit0eXBlZGVmIFVJTlQzMiAoQ0FMTEJBQ0sgKkxQQ0NIT09LUFJPQykgKEhXTkQzMiwgVUlOVDMyLCBXUEFSQU0zMiwgTFBBUkFNKTsKKwogdHlwZWRlZiBzdHJ1Y3QgewogCURXT1JECQlsU3RydWN0U2l6ZTsKIAlIV05EMTYJCWh3bmRPd25lcjsKQEAgLTEyNiw4ICsxMjgsMzggQEAKIAlMUEFSQU0JCWxDdXN0RGF0YTsKICAgICAgICAgV05EUFJPQzE2ICAgICAgIGxwZm5Ib29rOwogCVNFR1BUUiAJCWxwVGVtcGxhdGVOYW1lOwotfSBDSE9PU0VDT0xPUjsKLXR5cGVkZWYgQ0hPT1NFQ09MT1IgKkxQQ0hPT1NFQ09MT1I7Cit9IENIT09TRUNPTE9SMTY7Cit0eXBlZGVmIENIT09TRUNPTE9SMTYgKkxQQ0hPT1NFQ09MT1IxNjsKKwordHlwZWRlZiBzdHJ1Y3QgeworCURXT1JECQlsU3RydWN0U2l6ZTsKKwlIV05EMzIJCWh3bmRPd25lcjsKKwlIV05EMzIJCWhJbnN0YW5jZTsKKwlEV09SRAkgICAgICAgIHJnYlJlc3VsdDsKKwlMUERXT1JEICAgICAgICAgbHBDdXN0Q29sb3JzOworCURXT1JEIAkJRmxhZ3M7CisJRFdPUkQJCWxDdXN0RGF0YTsKKyAgICAgICAgTFBDQ0hPT0tQUk9DICAgIGxwZm5Ib29rOworCUxQQ1NUUiAJCWxwVGVtcGxhdGVOYW1lOworfSBDSE9PU0VDT0xPUjMyQTsKK3R5cGVkZWYgQ0hPT1NFQ09MT1IzMkEgKkxQQ0hPT1NFQ09MT1IzMkE7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlEV09SRAkJbFN0cnVjdFNpemU7CisJSFdORDMyCQlod25kT3duZXI7CisJSFdORDMyCQloSW5zdGFuY2U7CisJRFdPUkQJICAgICAgICByZ2JSZXN1bHQ7CisJTFBEV09SRCAgICAgICAgICpscEN1c3RDb2xvcnM7CisJRFdPUkQgCQlGbGFnczsKKwlEV09SRAkJbEN1c3REYXRhOworICAgICAgICBMUENDSE9PS1BST0MgICAgbHBmbkhvb2s7CisJTFBDV1NUUiAJbHBUZW1wbGF0ZU5hbWU7Cit9IENIT09TRUNPTE9SMzJXOwordHlwZWRlZiBDSE9PU0VDT0xPUjMyVyAqTFBDSE9PU0VDT0xPUjMyVzsKKworREVDTF9XSU5FTElCX1RZUEVfQVcoQ0hPT1NFQ09MT1IpOworREVDTF9XSU5FTElCX1RZUEVfQVcoTFBDSE9PU0VDT0xPUik7CisKIAogI2RlZmluZSBDQ19SR0JJTklUICAgICAgICAgICAgICAgMHgwMDAwMDAwMQogI2RlZmluZSBDQ19GVUxMT1BFTiAgICAgICAgICAgICAgMHgwMDAwMDAwMgpAQCAtMjMwLDYgKzI2Miw3IEBACiAJCQkJCQkJLyogQ0ZfTElNSVRTSVpFIGlzIHVzZWQgICAgICAqLwogfSBDSE9PU0VGT05UMTYsICpMUENIT09TRUZPTlQxNjsKIAorCiB0eXBlZGVmIHN0cnVjdAogewogCVVJTlQzMiAgCWxTdHJ1Y3RTaXplOyAKQEAgLTQ1Miw3ICs0ODUsMTAgQEAKICNkZWZpbmUgQ0RFUlJfTk9IT09LICAgICAgICAgICAweDAwMEIKICNkZWZpbmUgQ0RFUlJfUkVHSVNURVJNU0dGQUlMICAweDAwMEMKIAotQk9PTDE2ICBXSU5BUEkgQ2hvb3NlQ29sb3IoTFBDSE9PU0VDT0xPUiBscENoQ29sKTsKK0JPT0wxNiAgV0lOQVBJIENob29zZUNvbG9yMTYoTFBDSE9PU0VDT0xPUjE2IGxwQ2hDb2wpOworQk9PTDMyICBXSU5BUEkgQ2hvb3NlQ29sb3IzMkEoTFBDSE9PU0VDT0xPUjMyQSBscENoQ29sKTsKK0JPT0wzMiAgV0lOQVBJIENob29zZUNvbG9yMzJXKExQQ0hPT1NFQ09MT1IzMlcgbHBDaENvbCk7CisjZGVmaW5lIENob29zZUNvbG9yIFdJTkVMSUJfTkFNRV9BVyhDaG9vc2VDb2xvcikKIERXT1JEICAgV0lOQVBJIENvbW1EbGdFeHRlbmRlZEVycm9yKHZvaWQpOwogSFdORDE2ICBXSU5BUEkgRmluZFRleHQxNiggU0VHUFRSIGZpbmQpOwogSFdORDMyICBXSU5BUEkgRmluZFRleHQzMkEoTFBGSU5EUkVQTEFDRTMyQSBscEZpbmQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWcuaC5pbiBiL2luY2x1ZGUvY29uZmlnLmguaW4KaW5kZXggMjZmMGE4Zi4uMTY0MmNiNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWcuaC5pbgorKysgYi9pbmNsdWRlL2NvbmZpZy5oLmluCkBAIC0zOSw2ICszOSwxOCBAQAogLyogRGVmaW5lIGlmIHRoZSBzdHJ1Y3Qgc3RhdGZzIGhhcyB0aGUgbWVtYmVyIGJmcmVlICovCiAjdW5kZWYgU1RBVEZTX0hBU19CRlJFRQogCisvKiBEZWZpbmUgaWYgd2UgaGF2ZSBhIHdvcmtpbmcgc2lnYWx0c3RhY2sgKi8KKyN1bmRlZiBIQVZFX1dPUktJTkdfU0lHQUxUU1RBQ0sKKworLyogRGVmaW5lIGlmIHRoZSBzdHJ1Y3Qgc3RhdGZzIGlzIGRlZmluZWQgYnkgPHN5cy92ZnMuaD4gKi8KKyN1bmRlZiBTVEFURlNfREVGSU5FRF9CWV9TWVNfVkZTCisKKy8qIERlZmluZSBpZiB0aGUgc3RydWN0IHN0YXRmcyBpcyBkZWZpbmVkIGJ5IDxzeXMvc3RhdGZzLmg+ICovCisjdW5kZWYgU1RBVEZTX0RFRklORURfQllfU1lTX1NUQVRGUworCisvKiBEZWZpbmUgaWYgdGhlIHN0cnVjdCBzdGF0ZnMgaXMgZGVmaW5lZCBieSA8c3lzL21vdW50Lmg+ICovCisjdW5kZWYgU1RBVEZTX0RFRklORURfQllfU1lTX01PVU5UCisKIC8qIFRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gYSBsb25nIGxvbmcuICAqLwogI3VuZGVmIFNJWkVPRl9MT05HX0xPTkcKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kYy5oIGIvaW5jbHVkZS9kYy5oCmluZGV4IGYwNGEzMTguLmVhMWEzOTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZGMuaAorKysgYi9pbmNsdWRlL2RjLmgKQEAgLTIxLDYgKzIxLDcgQEAKIGV4dGVybiBCT09MMzIgRENfU2V0dXBHQ0ZvckJydXNoKCBEQyAqIGRjICk7CiBleHRlcm4gQk9PTDMyIERDX1NldHVwR0NGb3JQZW4oIERDICogZGMgKTsKIGV4dGVybiBCT09MMzIgRENfU2V0dXBHQ0ZvclRleHQoIERDICogZGMgKTsKK2V4dGVybiB2b2lkIERDX1VwZGF0ZVhmb3JtcyggREMgKiBkYyApOwogCiBleHRlcm4gY29uc3QgaW50IERDX1hST1BmdW5jdGlvbltdOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RlYnVnLmggYi9pbmNsdWRlL2RlYnVnLmgKaW5kZXggNmM2Mjg5Yy4uZTllMWIzMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kZWJ1Zy5oCisrKyBiL2luY2x1ZGUvZGVidWcuaApAQCAtMTksMTAyICsxOSwxMDUgQEAKICNkZWZpbmUgZGJjaF9jbGlwcGluZyAxMQogI2RlZmluZSBkYmNoX2NvbWJvIDEyCiAjZGVmaW5lIGRiY2hfY29tbSAxMwotI2RlZmluZSBkYmNoX2NvbW1kbGcgMTQKLSNkZWZpbmUgZGJjaF9jb25zb2xlIDE1Ci0jZGVmaW5lIGRiY2hfY3J0ZGxsIDE2Ci0jZGVmaW5lIGRiY2hfY3Vyc29yIDE3Ci0jZGVmaW5lIGRiY2hfZGMgMTgKLSNkZWZpbmUgZGJjaF9kZGUgMTkKLSNkZWZpbmUgZGJjaF9kZGVtbCAyMAotI2RlZmluZSBkYmNoX2RkcmF3IDIxCi0jZGVmaW5lIGRiY2hfZGVidWcgMjIKLSNkZWZpbmUgZGJjaF9kaWFsb2cgMjMKLSNkZWZpbmUgZGJjaF9kbGwgMjQKLSNkZWZpbmUgZGJjaF9kb3NmcyAyNQotI2RlZmluZSBkYmNoX2Rvc21lbSAyNgotI2RlZmluZSBkYmNoX2RyaXZlciAyNwotI2RlZmluZSBkYmNoX2Rzb3VuZCAyOAotI2RlZmluZSBkYmNoX2VkaXQgMjkKLSNkZWZpbmUgZGJjaF9ldmVudCAzMAotI2RlZmluZSBkYmNoX2V4ZWMgMzEKLSNkZWZpbmUgZGJjaF9maWxlIDMyCi0jZGVmaW5lIGRiY2hfZml4dXAgMzMKLSNkZWZpbmUgZGJjaF9mb250IDM0Ci0jZGVmaW5lIGRiY2hfZ2RpIDM1Ci0jZGVmaW5lIGRiY2hfZ2xvYmFsIDM2Ci0jZGVmaW5lIGRiY2hfZ3JhcGhpY3MgMzcKLSNkZWZpbmUgZGJjaF9oZWFwIDM4Ci0jZGVmaW5lIGRiY2hfaG9vayAzOQotI2RlZmluZSBkYmNoX2ljb24gNDAKLSNkZWZpbmUgZGJjaF9pbWFnZWxpc3QgNDEKLSNkZWZpbmUgZGJjaF9pbnQgNDIKLSNkZWZpbmUgZGJjaF9pbnQyMSA0MwotI2RlZmluZSBkYmNoX2ludDMxIDQ0Ci0jZGVmaW5lIGRiY2hfa2V5IDQ1Ci0jZGVmaW5lIGRiY2hfa2V5Ym9hcmQgNDYKLSNkZWZpbmUgZGJjaF9sZHQgNDcKLSNkZWZpbmUgZGJjaF9saXN0Ym94IDQ4Ci0jZGVmaW5lIGRiY2hfbG9jYWwgNDkKLSNkZWZpbmUgZGJjaF9tY2kgNTAKLSNkZWZpbmUgZGJjaF9tY2lhbmltIDUxCi0jZGVmaW5lIGRiY2hfbWNpd2F2ZSA1MgotI2RlZmluZSBkYmNoX21kaSA1MwotI2RlZmluZSBkYmNoX21lbnUgNTQKLSNkZWZpbmUgZGJjaF9tZXNzYWdlIDU1Ci0jZGVmaW5lIGRiY2hfbWV0YWZpbGUgNTYKLSNkZWZpbmUgZGJjaF9taWRpIDU3Ci0jZGVmaW5lIGRiY2hfbW1hdXggNTgKLSNkZWZpbmUgZGJjaF9tbWlvIDU5Ci0jZGVmaW5lIGRiY2hfbW1zeXMgNjAKLSNkZWZpbmUgZGJjaF9tbXRpbWUgNjEKLSNkZWZpbmUgZGJjaF9tb2R1bGUgNjIKLSNkZWZpbmUgZGJjaF9tcHIgNjMKLSNkZWZpbmUgZGJjaF9tc2cgNjQKLSNkZWZpbmUgZGJjaF9ub25jbGllbnQgNjUKLSNkZWZpbmUgZGJjaF9udGRsbCA2NgotI2RlZmluZSBkYmNoX29sZSA2NwotI2RlZmluZSBkYmNoX3BhbGV0dGUgNjgKLSNkZWZpbmUgZGJjaF9wcmludCA2OQotI2RlZmluZSBkYmNoX3Byb2ZpbGUgNzAKLSNkZWZpbmUgZGJjaF9wcm9ncmVzcyA3MQotI2RlZmluZSBkYmNoX3Byb3AgNzIKLSNkZWZpbmUgZGJjaF9yZWcgNzMKLSNkZWZpbmUgZGJjaF9yZWdpb24gNzQKLSNkZWZpbmUgZGJjaF9yZWxheSA3NQotI2RlZmluZSBkYmNoX3Jlc291cmNlIDc2Ci0jZGVmaW5lIGRiY2hfc2Nyb2xsIDc3Ci0jZGVmaW5lIGRiY2hfc2VjdXJpdHkgNzgKLSNkZWZpbmUgZGJjaF9zZWdtZW50IDc5Ci0jZGVmaW5lIGRiY2hfc2VsZWN0b3IgODAKLSNkZWZpbmUgZGJjaF9zZW0gODEKLSNkZWZpbmUgZGJjaF9zZW5kbXNnIDgyCi0jZGVmaW5lIGRiY2hfc2hlbGwgODMKLSNkZWZpbmUgZGJjaF9zaG0gODQKLSNkZWZpbmUgZGJjaF9zb3VuZCA4NQotI2RlZmluZSBkYmNoX3N0YXRpYyA4NgotI2RlZmluZSBkYmNoX3N0cmVzcyA4NwotI2RlZmluZSBkYmNoX3N0cmluZyA4OAotI2RlZmluZSBkYmNoX3N5c3RlbSA4OQotI2RlZmluZSBkYmNoX3Rhc2sgOTAKLSNkZWZpbmUgZGJjaF90ZXh0IDkxCi0jZGVmaW5lIGRiY2hfdGhyZWFkIDkyCi0jZGVmaW5lIGRiY2hfdGh1bmsgOTMKLSNkZWZpbmUgZGJjaF90aW1lciA5NAotI2RlZmluZSBkYmNoX3Rvb2xoZWxwIDk1Ci0jZGVmaW5lIGRiY2hfdHdlYWsgOTYKLSNkZWZpbmUgZGJjaF91aXRvb2xzIDk3Ci0jZGVmaW5lIGRiY2hfdXBkb3duIDk4Ci0jZGVmaW5lIGRiY2hfdmVyIDk5Ci0jZGVmaW5lIGRiY2hfdmlydHVhbCAxMDAKLSNkZWZpbmUgZGJjaF92eGQgMTAxCi0jZGVmaW5lIGRiY2hfd2luIDEwMgotI2RlZmluZSBkYmNoX3dpbjE2ZHJ2IDEwMwotI2RlZmluZSBkYmNoX3dpbjMyIDEwNAotI2RlZmluZSBkYmNoX3dpbmcgMTA1Ci0jZGVmaW5lIGRiY2hfd2luc29jayAxMDYKLSNkZWZpbmUgZGJjaF93bmV0IDEwNwotI2RlZmluZSBkYmNoX3gxMSAxMDgKLSNkZWZpbmUgZGJjaF94MTFkcnYgMTA5CisjZGVmaW5lIGRiY2hfY29tbWN0cmwgMTQKKyNkZWZpbmUgZGJjaF9jb21tZGxnIDE1CisjZGVmaW5lIGRiY2hfY29uc29sZSAxNgorI2RlZmluZSBkYmNoX2NydGRsbCAxNworI2RlZmluZSBkYmNoX2N1cnNvciAxOAorI2RlZmluZSBkYmNoX2RjIDE5CisjZGVmaW5lIGRiY2hfZGRlIDIwCisjZGVmaW5lIGRiY2hfZGRlbWwgMjEKKyNkZWZpbmUgZGJjaF9kZHJhdyAyMgorI2RlZmluZSBkYmNoX2RlYnVnIDIzCisjZGVmaW5lIGRiY2hfZGlhbG9nIDI0CisjZGVmaW5lIGRiY2hfZGxsIDI1CisjZGVmaW5lIGRiY2hfZG9zZnMgMjYKKyNkZWZpbmUgZGJjaF9kb3NtZW0gMjcKKyNkZWZpbmUgZGJjaF9kcml2ZXIgMjgKKyNkZWZpbmUgZGJjaF9kc291bmQgMjkKKyNkZWZpbmUgZGJjaF9lZGl0IDMwCisjZGVmaW5lIGRiY2hfZXZlbnQgMzEKKyNkZWZpbmUgZGJjaF9leGVjIDMyCisjZGVmaW5lIGRiY2hfZmlsZSAzMworI2RlZmluZSBkYmNoX2ZpeHVwIDM0CisjZGVmaW5lIGRiY2hfZm9udCAzNQorI2RlZmluZSBkYmNoX2dkaSAzNgorI2RlZmluZSBkYmNoX2dsb2JhbCAzNworI2RlZmluZSBkYmNoX2dyYXBoaWNzIDM4CisjZGVmaW5lIGRiY2hfaGVhZGVyIDM5CisjZGVmaW5lIGRiY2hfaGVhcCA0MAorI2RlZmluZSBkYmNoX2hvb2sgNDEKKyNkZWZpbmUgZGJjaF9pY29uIDQyCisjZGVmaW5lIGRiY2hfaW1hZ2VsaXN0IDQzCisjZGVmaW5lIGRiY2hfaW50IDQ0CisjZGVmaW5lIGRiY2hfaW50MjEgNDUKKyNkZWZpbmUgZGJjaF9pbnQzMSA0NgorI2RlZmluZSBkYmNoX2tleSA0NworI2RlZmluZSBkYmNoX2tleWJvYXJkIDQ4CisjZGVmaW5lIGRiY2hfbGR0IDQ5CisjZGVmaW5lIGRiY2hfbGlzdGJveCA1MAorI2RlZmluZSBkYmNoX2xvY2FsIDUxCisjZGVmaW5lIGRiY2hfbWNpIDUyCisjZGVmaW5lIGRiY2hfbWNpYW5pbSA1MworI2RlZmluZSBkYmNoX21jaXdhdmUgNTQKKyNkZWZpbmUgZGJjaF9tZGkgNTUKKyNkZWZpbmUgZGJjaF9tZW51IDU2CisjZGVmaW5lIGRiY2hfbWVzc2FnZSA1NworI2RlZmluZSBkYmNoX21ldGFmaWxlIDU4CisjZGVmaW5lIGRiY2hfbWlkaSA1OQorI2RlZmluZSBkYmNoX21tYXV4IDYwCisjZGVmaW5lIGRiY2hfbW1pbyA2MQorI2RlZmluZSBkYmNoX21tc3lzIDYyCisjZGVmaW5lIGRiY2hfbW10aW1lIDYzCisjZGVmaW5lIGRiY2hfbW9kdWxlIDY0CisjZGVmaW5lIGRiY2hfbXByIDY1CisjZGVmaW5lIGRiY2hfbXNnIDY2CisjZGVmaW5lIGRiY2hfbm9uY2xpZW50IDY3CisjZGVmaW5lIGRiY2hfbnRkbGwgNjgKKyNkZWZpbmUgZGJjaF9vbGUgNjkKKyNkZWZpbmUgZGJjaF9wYWxldHRlIDcwCisjZGVmaW5lIGRiY2hfcHJpbnQgNzEKKyNkZWZpbmUgZGJjaF9wcm9maWxlIDcyCisjZGVmaW5lIGRiY2hfcHJvZ3Jlc3MgNzMKKyNkZWZpbmUgZGJjaF9wcm9wIDc0CisjZGVmaW5lIGRiY2hfcmVnIDc1CisjZGVmaW5lIGRiY2hfcmVnaW9uIDc2CisjZGVmaW5lIGRiY2hfcmVsYXkgNzcKKyNkZWZpbmUgZGJjaF9yZXNvdXJjZSA3OAorI2RlZmluZSBkYmNoX3Njcm9sbCA3OQorI2RlZmluZSBkYmNoX3NlY3VyaXR5IDgwCisjZGVmaW5lIGRiY2hfc2VnbWVudCA4MQorI2RlZmluZSBkYmNoX3NlbGVjdG9yIDgyCisjZGVmaW5lIGRiY2hfc2VtIDgzCisjZGVmaW5lIGRiY2hfc2VuZG1zZyA4NAorI2RlZmluZSBkYmNoX3NoZWxsIDg1CisjZGVmaW5lIGRiY2hfc2htIDg2CisjZGVmaW5lIGRiY2hfc291bmQgODcKKyNkZWZpbmUgZGJjaF9zdGF0aWMgODgKKyNkZWZpbmUgZGJjaF9zdGF0dXMgODkKKyNkZWZpbmUgZGJjaF9zdHJlc3MgOTAKKyNkZWZpbmUgZGJjaF9zdHJpbmcgOTEKKyNkZWZpbmUgZGJjaF9zeXN0ZW0gOTIKKyNkZWZpbmUgZGJjaF90YXNrIDkzCisjZGVmaW5lIGRiY2hfdGV4dCA5NAorI2RlZmluZSBkYmNoX3RocmVhZCA5NQorI2RlZmluZSBkYmNoX3RodW5rIDk2CisjZGVmaW5lIGRiY2hfdGltZXIgOTcKKyNkZWZpbmUgZGJjaF90b29saGVscCA5OAorI2RlZmluZSBkYmNoX3R3ZWFrIDk5CisjZGVmaW5lIGRiY2hfdWl0b29scyAxMDAKKyNkZWZpbmUgZGJjaF91cGRvd24gMTAxCisjZGVmaW5lIGRiY2hfdmVyIDEwMgorI2RlZmluZSBkYmNoX3ZpcnR1YWwgMTAzCisjZGVmaW5lIGRiY2hfdnhkIDEwNAorI2RlZmluZSBkYmNoX3dpbiAxMDUKKyNkZWZpbmUgZGJjaF93aW4xNmRydiAxMDYKKyNkZWZpbmUgZGJjaF93aW4zMiAxMDcKKyNkZWZpbmUgZGJjaF93aW5nIDEwOAorI2RlZmluZSBkYmNoX3dpbnNvY2sgMTA5CisjZGVmaW5lIGRiY2hfd25ldCAxMTAKKyNkZWZpbmUgZGJjaF94MTEgMTExCisjZGVmaW5lIGRiY2hfeDExZHJ2IDExMgogLyogRGVmaW5pdGlvbnMgZm9yIGNsYXNzZXMgaWRlbnRpZmllcnMgKi8KICNkZWZpbmUgZGJjbF9maXhtZSAwCiAjZGVmaW5lIGRiY2xfZXJyIDEKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZGVidWdkZWZzLmggYi9pbmNsdWRlL2RlYnVnZGVmcy5oCmluZGV4IDJiOGY1ZmMuLmVhOTg3NDQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZGVidWdkZWZzLmgKKysrIGIvaW5jbHVkZS9kZWJ1Z2RlZnMuaApAQCAtNCw3ICs0LDcgQEAKICNpbmNsdWRlICJkZWJ1Z3Rvb2xzLmgiCiAjZW5kaWYKIAotI2RlZmluZSBERUJVR19DSEFOTkVMX0NPVU5UIDExMAorI2RlZmluZSBERUJVR19DSEFOTkVMX0NPVU5UIDExMwogI2lmZGVmIERFQlVHX1JVTlRJTUUKIHNob3J0IGRlYnVnX21zZ19lbmFibGVkW11bREVCVUdfQ0xBU1NfQ09VTlRdID0gewogezEsIDEsIDAsIDB9LApAQCAtMTE3LDYgKzExNyw5IEBACiB7MSwgMSwgMCwgMH0sCiB7MSwgMSwgMCwgMH0sCiB7MSwgMSwgMCwgMH0sCit7MSwgMSwgMCwgMH0sCit7MSwgMSwgMCwgMH0sCit7MSwgMSwgMCwgMH0sCiB9OwogY29uc3QgY2hhciogZGVidWdfY2hfbmFtZVtdID0gewogImFjY2VsIiwKQEAgLTEzMyw2ICsxMzYsNyBAQAogImNsaXBwaW5nIiwKICJjb21ibyIsCiAiY29tbSIsCisiY29tbWN0cmwiLAogImNvbW1kbGciLAogImNvbnNvbGUiLAogImNydGRsbCIsCkBAIC0xNTcsNiArMTYxLDcgQEAKICJnZGkiLAogImdsb2JhbCIsCiAiZ3JhcGhpY3MiLAorImhlYWRlciIsCiAiaGVhcCIsCiAiaG9vayIsCiAiaWNvbiIsCkBAIC0yMDYsNiArMjExLDcgQEAKICJzaG0iLAogInNvdW5kIiwKICJzdGF0aWMiLAorInN0YXR1cyIsCiAic3RyZXNzIiwKICJzdHJpbmciLAogInN5c3RlbSIsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2dkaS5oIGIvaW5jbHVkZS9nZGkuaAppbmRleCA0ZWE3YzdiLi4wN2FiNWEyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2dkaS5oCisrKyBiL2luY2x1ZGUvZ2RpLmgKQEAgLTEyLDYgKzEyLDcgQEAKICNpbmNsdWRlICJsb2NhbC5oIgogI2luY2x1ZGUgIngxMWRydi5oIgogI2luY2x1ZGUgInBhdGguaCIKKyNpbmNsdWRlIDxtYXRoLmg+CiAKICAgLyogR0RJIG9iamVjdHMgbWFnaWMgbnVtYmVycyAqLwogI2RlZmluZSBQRU5fTUFHSUMgICAgICAgICAgICAgMHg0ZjQ3CkBAIC0xMzIsMTAgKzEzMywxMCBAQAogICAgIElOVDMyICAgICAgICAgQ3Vyc1Bvc1g7ICAgICAgICAgIC8qIEN1cnJlbnQgcG9zaXRpb24gKi8KICAgICBJTlQzMiAgICAgICAgIEN1cnNQb3NZOwogICAgIElOVDMyICAgICAgICAgQXJjRGlyZWN0aW9uOwotICAgIEJPT0wzMiAgICAgICAgVXNlV29ybGRYZm9ybTsgICAgIC8qIFNob3VsZCB3ZSB1c2UgdGhlIHdvcmxkIHRyYW5zZm9ybT8gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaS5lLiBpcyBpdCBub3QgZXF1YWwgdG8gdGhlICAgICAgICovCi0JCQkJICAgICAvKiBpZGVudGl0eSB0cmFuc2Zvcm1hdGlvbj8pICAgICAgICAgICovCi0gICAgWEZPUk0gICAgICAgICBXb3JsZFhmb3JtOyAgICAgICAgLyogV29ybGQgdHJhbnNmb3JtICovCisgICAgWEZPUk0gICAgICAgICB4Zm9ybVdvcmxkMlduZDsgICAgLyogV29ybGQtdG8td2luZG93IHRyYW5zZm9ybWF0aW9uICovCisgICAgWEZPUk0gICAgICAgICB4Zm9ybVdvcmxkMlZwb3J0OyAgLyogV29ybGQtdG8tdmlld3BvcnQgdHJhbnNmb3JtYXRpb24gKi8KKyAgICBYRk9STSAgICAgICAgIHhmb3JtVnBvcnQyV29ybGQ7ICAvKiBJbnZlcnNlIG9mIHRoZSBhYm92ZSB0cmFuc2Zvcm1hdGlvbiAqLworICAgIEJPT0wzMiAgICAgICAgdnBvcnQyV29ybGRWYWxpZDsgIC8qIElzIHhmb3JtVnBvcnQyV29ybGQgdmFsaWQ/ICovCiB9IFdJTl9EQ19JTkZPOwogCiB0eXBlZGVmIFgxMURSVl9QREVWSUNFIFhfRENfSU5GTzsgIC8qIFRlbXBvcmFyeSAqLwpAQCAtMjgzLDYgKzI4NCwxMDAgQEAKIAogICAvKiBEZXZpY2UgPC0+IGxvZ2ljYWwgY29vcmRzIGNvbnZlcnNpb24gKi8KIAorLyogQSBmbG9hdGluZyBwb2ludCB2ZXJzaW9uIG9mIHRoZSBQT0lOVCBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IHRhZ0ZMT0FUX1BPSU5UCit7CisgICBGTE9BVCB4LCB5OworfSBGTE9BVF9QT0lOVDsKKworLyogUm91bmRzIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIHRvIGludGVnZXIuIFRoZSB3b3JsZC10by12aWV3cG9ydAorICogdHJhbnNmb3JtYXRpb24gcHJvY2VzcyBpcyBkb25lIGluIGZsb2F0aW5nIHBvaW50IGludGVybmFsbHkuIFRoaXMgZnVuY3Rpb24KKyAqIGlzIHRoZW4gdXNlZCB0byByb3VuZCB0aGVzZSBjb29yZGluYXRlcyB0byBpbnRlZ2VyIHZhbHVlcy4KKyAqLworc3RhdGljIF9faW5saW5lX18gSU5UMzIgR0RJX1JPVU5EKEZMT0FUIHZhbCkKK3sKKyAgIHJldHVybiAoaW50KWZsb29yKHZhbCArIDAuNSk7Cit9CisKKy8qIFBlcmZvcm1zIGEgdmlld3BvcnQtdG8td29ybGQgdHJhbnNmb3JtYXRpb24gb24gdGhlIHNwZWNpZmllZCBwb2ludCAod2hpY2gKKyAqIGlzIGluIGZsb2F0aW5nIHBvaW50IGZvcm1hdCkuIFJldHVybnMgVFJVRSBpZiBzdWNjZXNzZnVsLCBlbHNlIEZBTFNFLgorICovCitzdGF0aWMgX19pbmxpbmVfXyBCT09MMzIgSU5URVJOQUxfRFBUT0xQX0ZMT0FUKERDICpkYywgRkxPQVRfUE9JTlQgKnBvaW50KQoreworICAgIEZMT0FUIHgsIHk7CisgICAgCisgICAgLyogQ2hlY2sgdGhhdCB0aGUgdmlld3BvcnQtdG8td29ybGQgdHJhbnNmb3JtYXRpb24gaXMgdmFsaWQgKi8KKyAgICBpZiAoIWRjLT53LnZwb3J0MldvcmxkVmFsaWQpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIC8qIFBlcmZvcm0gdGhlIHRyYW5zZm9ybWF0aW9uICovCisgICAgeCA9IHBvaW50LT54OworICAgIHkgPSBwb2ludC0+eTsKKyAgICBwb2ludC0+eCA9IHggKiBkYy0+dy54Zm9ybVZwb3J0MldvcmxkLmVNMTEgKworICAgICAgICAgICAgICAgeSAqIGRjLT53Lnhmb3JtVnBvcnQyV29ybGQuZU0yMSArCisJICAgICAgIGRjLT53Lnhmb3JtVnBvcnQyV29ybGQuZUR4OworICAgIHBvaW50LT55ID0geCAqIGRjLT53Lnhmb3JtVnBvcnQyV29ybGQuZU0xMiArCisgICAgICAgICAgICAgICB5ICogZGMtPncueGZvcm1WcG9ydDJXb3JsZC5lTTIyICsKKwkgICAgICAgZGMtPncueGZvcm1WcG9ydDJXb3JsZC5lRHk7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyogUGVyZm9ybXMgYSB2aWV3cG9ydC10by13b3JsZCB0cmFuc2Zvcm1hdGlvbiBvbiB0aGUgc3BlY2lmaWVkIHBvaW50ICh3aGljaAorICogaXMgaW4gaW50ZWdlciBmb3JtYXQpLiBSZXR1cm5zIFRSVUUgaWYgc3VjY2Vzc2Z1bCwgZWxzZSBGQUxTRS4KKyAqLworc3RhdGljIF9faW5saW5lX18gQk9PTDMyIElOVEVSTkFMX0RQVE9MUChEQyAqZGMsIExQUE9JTlQzMiBwb2ludCkKK3sKKyAgICBGTE9BVF9QT0lOVCBmbG9hdFBvaW50OworICAgIAorICAgIC8qIFBlcmZvcm0gb3BlcmF0aW9uIHdpdGggZmxvYXRpbmcgcG9pbnQgKi8KKyAgICBmbG9hdFBvaW50Lng9KEZMT0FUKXBvaW50LT54OworICAgIGZsb2F0UG9pbnQueT0oRkxPQVQpcG9pbnQtPnk7CisgICAgaWYgKCFJTlRFUk5BTF9EUFRPTFBfRkxPQVQoZGMsICZmbG9hdFBvaW50KSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIAorICAgIC8qIFJvdW5kIHRvIGludGVnZXJzICovCisgICAgcG9pbnQtPnggPSBHRElfUk9VTkQoZmxvYXRQb2ludC54KTsKKyAgICBwb2ludC0+eSA9IEdESV9ST1VORChmbG9hdFBvaW50LnkpOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIFBlcmZvcm1zIGEgd29ybGQtdG8tdmlld3BvcnQgdHJhbnNmb3JtYXRpb24gb24gdGhlIHNwZWNpZmllZCBwb2ludCAod2hpY2gKKyAqIGlzIGluIGZsb2F0aW5nIHBvaW50IGZvcm1hdCkuCisgKi8KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgSU5URVJOQUxfTFBUT0RQX0ZMT0FUKERDICpkYywgRkxPQVRfUE9JTlQgKnBvaW50KQoreworICAgIEZMT0FUIHgsIHk7CisgICAgCisgICAgLyogUGVyZm9ybSB0aGUgdHJhbnNmb3JtYXRpb24gKi8KKyAgICB4ID0gcG9pbnQtPng7CisgICAgeSA9IHBvaW50LT55OworICAgIHBvaW50LT54ID0geCAqIGRjLT53Lnhmb3JtV29ybGQyVnBvcnQuZU0xMSArCisgICAgICAgICAgICAgICB5ICogZGMtPncueGZvcm1Xb3JsZDJWcG9ydC5lTTIxICsKKwkgICAgICAgZGMtPncueGZvcm1Xb3JsZDJWcG9ydC5lRHg7CisgICAgcG9pbnQtPnkgPSB4ICogZGMtPncueGZvcm1Xb3JsZDJWcG9ydC5lTTEyICsKKyAgICAgICAgICAgICAgIHkgKiBkYy0+dy54Zm9ybVdvcmxkMlZwb3J0LmVNMjIgKworCSAgICAgICBkYy0+dy54Zm9ybVdvcmxkMlZwb3J0LmVEeTsKK30KKworLyogUGVyZm9ybXMgYSB3b3JsZC10by12aWV3cG9ydCB0cmFuc2Zvcm1hdGlvbiBvbiB0aGUgc3BlY2lmaWVkIHBvaW50ICh3aGljaAorICogaXMgaW4gaW50ZWdlciBmb3JtYXQpLgorICovCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIElOVEVSTkFMX0xQVE9EUChEQyAqZGMsIExQUE9JTlQzMiBwb2ludCkKK3sKKyAgICBGTE9BVF9QT0lOVCBmbG9hdFBvaW50OworICAgIAorICAgIC8qIFBlcmZvcm0gb3BlcmF0aW9uIHdpdGggZmxvYXRpbmcgcG9pbnQgKi8KKyAgICBmbG9hdFBvaW50Lng9KEZMT0FUKXBvaW50LT54OworICAgIGZsb2F0UG9pbnQueT0oRkxPQVQpcG9pbnQtPnk7CisgICAgSU5URVJOQUxfTFBUT0RQX0ZMT0FUKGRjLCAmZmxvYXRQb2ludCk7CisgICAgCisgICAgLyogUm91bmQgdG8gaW50ZWdlcnMgKi8KKyAgICBwb2ludC0+eCA9IEdESV9ST1VORChmbG9hdFBvaW50LngpOworICAgIHBvaW50LT55ID0gR0RJX1JPVU5EKGZsb2F0UG9pbnQueSk7Cit9CisKICNkZWZpbmUgWERQVE9MUChkYyx4KSBcCiAgICAgKCgoeCktKGRjKS0+dnBvcnRPcmdYKSAqIChkYyktPnduZEV4dFggLyAoZGMpLT52cG9ydEV4dFgrKGRjKS0+d25kT3JnWCkKICNkZWZpbmUgWURQVE9MUChkYyx5KSBcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2hlYWRlci5oIGIvaW5jbHVkZS9oZWFkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OThlYTBmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9oZWFkZXIuaApAQCAtMCwwICsxLDUyIEBACisvKgorICogSGVhZGVyIHdpbmRvdyBkZWZpbml0aW9ucworICoKKyAqIENvcHlyaWdodCAxOTk4IEVyaWMgS29obAorICoKKyAqLworCisjaWZuZGVmIF9fV0lORV9IRUFERVJfSF8KKyNkZWZpbmUgX19XSU5FX0hFQURFUl9IXworCit0eXBlZGVmIHN0cnVjdCAKK3sKKyAgICBVSU5UMzIgICAgbWFzazsKKyAgICBJTlQzMiAgICAgY3h5OworICAgIEhCSVRNQVAzMiBoYm07CisgICAgTFBTVFIgICAgIHBzelRleHQ7CisgICAgSU5UMzIgICAgIGNjaFRleHRNYXg7CisgICAgSU5UMzIgICAgIGZtdDsKKyAgICBMUEFSQU0gICAgbFBhcmFtOworICAgIElOVDMyICAgICBpSW1hZ2U7CisgICAgSU5UMzIgICAgIGlPcmRlcjsKKworICAgIEJPT0wzMiAgICBiRG93bjsKKyAgICBSRUNUMzIgICAgcmVjdDsKK30gSEVBREVSX0lURU07CisKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBVSU5UMzIgICAgICB1TnVtSXRlbTsKKyAgICBJTlQzMiAgICAgICBuSGVpZ2h0OworICAgIEhGT05UMzIgICAgIGhGb250OworICAgIEhDVVJTT1IzMiAgIGhjdXJBcnJvdzsKKyAgICBIQ1VSU09SMzIgICBoY3VyRGl2aWRlcjsKKyAgICBIQ1VSU09SMzIgICBoY3VyRGl2b3BlbjsKKyAgICBCT09MMzIgICAgICBiQ2FwdHVyZWQ7CisgICAgQk9PTDMyICAgICAgYlByZXNzZWQ7CisgICAgQk9PTDMyICAgICAgYlRyYWNraW5nOworICAgIElOVDMyICAgICAgIGlNb3ZlSXRlbTsKKyAgICBJTlQzMiAgICAgICB4VHJhY2tPZmZzZXQ7CisgICAgSU5UMzIgICAgICAgeE9sZFRyYWNrOworICAgIElOVDMyICAgICAgIG5PbGRXaWR0aDsKKyAgICBJTlQzMiAgICAgICBpSG90SXRlbTsKKworICAgIEhJTUFHRUxJU1QgIGhpbWw7CisgICAgSEVBREVSX0lURU0gKml0ZW1zOworfSBIRUFERVJfSU5GTzsKKworCit2b2lkIEhFQURFUl9SZWdpc3Rlciggdm9pZCApOworCisjZW5kaWYgLyogX19XSU5FX0hFQURFUl9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saWJyZXMuaCBiL2luY2x1ZGUvbGlicmVzLmgKaW5kZXggYWRkZWI4NC4uZDcwZWY4NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saWJyZXMuaAorKysgYi9pbmNsdWRlL2xpYnJlcy5oCkBAIC03LDEzICs3LDggQEAKICNpbmNsdWRlICJ3aW50eXBlcy5oIgogI2luY2x1ZGUgInJlc291cmNlLmgiCiAKLWV4dGVybiBJTlQzMiBMSUJSRVNfQWNjZXNzUmVzb3VyY2UoIEhJTlNUQU5DRTMyIGhNb2R1bGUsIEhSU1JDMzIgaFJzcmMgKTsKLWV4dGVybiBIR0xPQkFMMzIgTElCUkVTX0FsbG9jUmVzb3VyY2UoIEhJTlNUQU5DRTMyIGhNb2R1bGUsIEhSU1JDMzIgaFJzcmMsIERXT1JEIHNpemUgKTsKLWV4dGVybiBIUlNSQzMyIExJQlJFU19GaW5kUmVzb3VyY2UxNiggSElOU1RBTkNFMzIgaE1vZHVsZSwgTFBDU1RSIG5hbWUsIExQQ1NUUiB0eXBlICk7Ci1leHRlcm4gSFJTUkMzMiBMSUJSRVNfRmluZFJlc291cmNlMzIoIEhJTlNUQU5DRTMyIGhNb2R1bGUsIExQQ1dTVFIgbmFtZSwgTFBDV1NUUiB0eXBlICk7Ci1leHRlcm4gQk9PTDMyIExJQlJFU19GcmVlUmVzb3VyY2UoIEhHTE9CQUwzMiBoYW5kbGUgKTsKK2V4dGVybiBIUlNSQzMyIExJQlJFU19GaW5kUmVzb3VyY2UoIEhJTlNUQU5DRTMyIGhNb2R1bGUsIExQQ1dTVFIgbmFtZSwgTFBDV1NUUiB0eXBlICk7CiBleHRlcm4gSEdMT0JBTDMyIExJQlJFU19Mb2FkUmVzb3VyY2UoIEhJTlNUQU5DRTMyIGhNb2R1bGUsIEhSU1JDMzIgaFJzcmMgKTsKLWV4dGVybiBMUFZPSUQgTElCUkVTX0xvY2tSZXNvdXJjZSggSEdMT0JBTDMyIGhhbmRsZSApOwogZXh0ZXJuIERXT1JEIExJQlJFU19TaXplb2ZSZXNvdXJjZSggSElOU1RBTkNFMzIgaE1vZHVsZSwgSFJTUkMzMiBoUnNyYyApOwogCi0jZW5kaWYKKyNlbmRpZiAvKiBfX1dJTkVfTElCUkVTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbHpleHBhbmQuaCBiL2luY2x1ZGUvbHpleHBhbmQuaAppbmRleCBhMDI2NzkzLi5lNTE4YmMzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2x6ZXhwYW5kLmgKKysrIGIvaW5jbHVkZS9semV4cGFuZC5oCkBAIC02LDEzICs2LDEzIEBACiAjaWZuZGVmIF9fV0lORV9MWkVYUEFORF9ICiAjZGVmaW5lIF9fV0lORV9MWkVYUEFORF9ICiAKLSNkZWZpbmUgTFpFUlJPUl9CQURJTkhBTkRMRQkweEZGRkYJLyogLTEgKi8KLSNkZWZpbmUgTFpFUlJPUl9CQURPVVRIQU5ETEUJMHhGRkZFCS8qIC0yICovCi0jZGVmaW5lIExaRVJST1JfUkVBRAkJMHhGRkZECS8qIC0zICovCi0jZGVmaW5lIExaRVJST1JfV1JJVEUJCTB4RkZGQwkvKiAtNCAqLwotI2RlZmluZSBMWkVSUk9SX0dMT0JBTExPQwkweEZGRkIJLyogLTUgKi8KLSNkZWZpbmUgTFpFUlJPUl9HTE9CTE9DSwkweEZGRkEJLyogLTYgKi8KLSNkZWZpbmUgTFpFUlJPUl9CQURWQUxVRQkweEZGRjkJLyogLTcgKi8KLSNkZWZpbmUgTFpFUlJPUl9VTktOT1dOQUxHCTB4RkZGOAkvKiAtOCAqLworI2RlZmluZSBMWkVSUk9SX0JBRElOSEFORExFCS0xCS8qIC0xICovCisjZGVmaW5lIExaRVJST1JfQkFET1VUSEFORExFCS0yCS8qIC0yICovCisjZGVmaW5lIExaRVJST1JfUkVBRAkJLTMJLyogLTMgKi8KKyNkZWZpbmUgTFpFUlJPUl9XUklURQkJLTQJLyogLTQgKi8KKyNkZWZpbmUgTFpFUlJPUl9HTE9CQUxMT0MJLTUJLyogLTUgKi8KKyNkZWZpbmUgTFpFUlJPUl9HTE9CTE9DSwktNgkvKiAtNiAqLworI2RlZmluZSBMWkVSUk9SX0JBRFZBTFVFCS03CS8qIC03ICovCisjZGVmaW5lIExaRVJST1JfVU5LTk9XTkFMRwktOAkvKiAtOCAqLwogCiAjZW5kaWYgIC8qIF9fV0lORV9MWkVYUEFORF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21haW4uaCBiL2luY2x1ZGUvbWFpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhM2EyOWMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21haW4uaApAQCAtMCwwICsxLDEzIEBACisvKgorICogV2luZSBpbml0aWFsaXphdGlvbiBkZWZpbml0aW9ucworICovCisKKyNpZm5kZWYgX19XSU5FX01BSU5fSAorI2RlZmluZSBfX1dJTkVfTUFJTl9ICisKK2V4dGVybiBCT09MMzIgTUFJTl9LZXJuZWxJbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgTUFJTl9Vc2FnZShjaGFyKik7CitleHRlcm4gQk9PTDMyIE1BSU5fVXNlckluaXQodm9pZCk7CitleHRlcm4gQk9PTDMyIE1BSU5fV2luZUluaXQoIGludCAqYXJnYywgY2hhciAqYXJndltdICk7CisKKyNlbmRpZiAgLyogX19XSU5FX01BSU5fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tb2R1bGUuaCBiL2luY2x1ZGUvbW9kdWxlLmgKaW5kZXggNTY2NjY5NS4uYjk5OGI2ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tb2R1bGUuaAorKysgYi9pbmNsdWRlL21vZHVsZS5oCkBAIC0xMTUsOSArMTE1LDggQEAKIAlITU9EVUxFMzIJCW1vZHVsZTsKIAogCWNoYXIJCQkqbW9kbmFtZTsKLQljaGFyIAkJCSpmdWxsbmFtZTsKIAljaGFyCQkJKnNob3J0bmFtZTsKLQljaGFyCQkJKnVuaXhuYW1lOworCWNoYXIgCQkJKmxvbmduYW1lOwogfSBXSU5FX01PRFJFRjsKIAogLyogUmVzb3VyY2UgdHlwZXMgKi8KQEAgLTEzNCwzNSArMTMzLDI4IEBACiAgICAgKCgoT0ZTVFJVQ1QgKikoKGNoYXIqKShwTW9kdWxlKSArIChwTW9kdWxlKS0+ZmlsZWluZm8pKS0+c3pQYXRoTmFtZSkKIAogLyogbW9kdWxlLmMgKi8KLWV4dGVybiBORV9NT0RVTEUgKk1PRFVMRV9HZXRQdHIxNiggSE1PRFVMRTE2IGhNb2R1bGUgKTsKLWV4dGVybiBORV9NT0RVTEUgKk1PRFVMRV9HZXRQdHIzMiggSE1PRFVMRTMyIGhNb2R1bGUgKTsKLWV4dGVybiBITU9EVUxFMTYgTU9EVUxFX0hBTkRMRXRvSE1PRFVMRTE2KCBIQU5ETEUzMiBoYW5kbGUgKTsKLWV4dGVybiBpbnQgTU9EVUxFX09wZW5GaWxlKCBITU9EVUxFMzIgaE1vZHVsZSApOwotZXh0ZXJuIExQU1RSIE1PRFVMRV9HZXRNb2R1bGVOYW1lKCBITU9EVUxFMzIgaE1vZHVsZSApOwogZXh0ZXJuIEZBUlBST0MzMiBNT0RVTEVfR2V0UHJvY0FkZHJlc3MzMiggc3RydWN0IF9QREIzMipwZGIsSE1PRFVMRTMyIGhNb2R1bGUsTFBDU1RSIGZ1bmN0aW9uICk7CiBleHRlcm4gV0lORV9NT0RSRUYgKk1PRFVMRTMyX0xvb2t1cEhNT0RVTEUoIHN0cnVjdCBfUERCMzIgKnByb2Nlc3MsIEhNT0RVTEUzMiBoTW9kdWxlICk7Ci1leHRlcm4gSE1PRFVMRTMyIE1PRFVMRV9GaW5kTW9kdWxlMTYoIExQQ1NUUiBwYXRoICk7CiBleHRlcm4gSE1PRFVMRTMyIE1PRFVMRV9GaW5kTW9kdWxlMzIoIHN0cnVjdCBfUERCMzIgKnByb2Nlc3MsIExQQ1NUUiBwYXRoICk7Ci1leHRlcm4gSElOU1RBTkNFMTYgTU9EVUxFX0NyZWF0ZUluc3RhbmNlKCBITU9EVUxFMTYgaE1vZHVsZSwgSElOU1RBTkNFMTYgKnByZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MMzIgbGliX29ubHkgKTsKIGV4dGVybiBITU9EVUxFMzIgTU9EVUxFX0NyZWF0ZUR1bW15TW9kdWxlKCBjb25zdCBPRlNUUlVDVCAqb2ZzICk7Ci1leHRlcm4gSElOU1RBTkNFMTYgTU9EVUxFX0xvYWQoIExQQ1NUUiBuYW1lLCBVSU5UMTYgdUZsYWdzLCBMUENTVFIgY21kX2xpbmUsCitleHRlcm4gSElOU1RBTkNFMTYgTU9EVUxFX0xvYWQoIExQQ1NUUiBuYW1lLCBCT09MMzIgaW1wbGljaXQsIExQQ1NUUiBjbWRfbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIGVudiwgVUlOVDMyIHNob3dfY21kICk7CiBleHRlcm4gRkFSUFJPQzE2IE1PRFVMRV9HZXRXbmRQcm9jRW50cnkxNiggY29uc3QgY2hhciAqbmFtZSApOwotZXh0ZXJuIEZBUlBST0MxNiBXSU5BUEkgV0lOMzJfR2V0UHJvY0FkZHJlc3MxNiggSE1PRFVMRTMyIGhtb2R1bGUsIExQU1RSIG5hbWUgKTsKK2V4dGVybiBGQVJQUk9DMTYgV0lOQVBJIFdJTjMyX0dldFByb2NBZGRyZXNzMTYoIEhNT0RVTEUzMiBobW9kdWxlLCBMUENTVFIgbmFtZSApOwogCiB0eXBlZGVmIEhHTE9CQUwxNiAoQ0FMTEJBQ0sgKlJFU09VUkNFSEFORExFUjE2KShIR0xPQkFMMTYsSE1PRFVMRTE2LEhSU1JDMTYpOwogCiAvKiBsb2FkZXIvbmUvbW9kdWxlLmMgKi8KK2V4dGVybiBORV9NT0RVTEUgKk5FX0dldFB0ciggSE1PRFVMRTE2IGhNb2R1bGUgKTsKIGV4dGVybiB2b2lkIE5FX0R1bXBNb2R1bGUoIEhNT0RVTEUxNiBoTW9kdWxlICk7CiBleHRlcm4gdm9pZCBORV9XYWxrTW9kdWxlcyh2b2lkKTsKIGV4dGVybiB2b2lkIE5FX1JlZ2lzdGVyTW9kdWxlKCBORV9NT0RVTEUgKnBNb2R1bGUgKTsKIGV4dGVybiBXT1JEIE5FX0dldE9yZGluYWwoIEhNT0RVTEUxNiBoTW9kdWxlLCBjb25zdCBjaGFyICpuYW1lICk7CiBleHRlcm4gRkFSUFJPQzE2IE5FX0dldEVudHJ5UG9pbnQoIEhNT0RVTEUxNiBoTW9kdWxlLCBXT1JEIG9yZGluYWwgKTsKIGV4dGVybiBCT09MMTYgTkVfU2V0RW50cnlQb2ludCggSE1PRFVMRTE2IGhNb2R1bGUsIFdPUkQgb3JkaW5hbCwgV09SRCBvZmZzZXQgKTsKLWV4dGVybiBISU5TVEFOQ0UxNiBORV9Mb2FkTW9kdWxlKCBIRklMRTMyIGhGaWxlLCBPRlNUUlVDVCAqb2ZzLCBVSU5UMTYgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIGNtZF9saW5lLCBMUENTVFIgZW52LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiBzaG93X2NtZCApOworZXh0ZXJuIGludCBORV9PcGVuRmlsZSggTkVfTU9EVUxFICpwTW9kdWxlICk7CitleHRlcm4gSElOU1RBTkNFMTYgTkVfTG9hZE1vZHVsZSggTFBDU1RSIG5hbWUsIEhJTlNUQU5DRTE2ICpoUHJldkluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wzMiBpbXBsaWNpdCwgQk9PTDMyIGxpYl9vbmx5ICk7CiAKIC8qIGxvYWRlci9uZS9yZXNvdXJjZS5jICovCiBleHRlcm4gSEdMT0JBTDE2IFdJTkFQSSBORV9EZWZSZXNvdXJjZUhhbmRsZXIoSEdMT0JBTDE2LEhNT0RVTEUxNixIUlNSQzE2KTsKQEAgLTE3MywxNCArMTY1LDE0IEBACiBleHRlcm4gQk9PTDMyIE5FX0xvYWRBbGxTZWdtZW50cyggTkVfTU9EVUxFICpwTW9kdWxlICk7CiBleHRlcm4gdm9pZCBORV9GaXh1cFByb2xvZ3MoIE5FX01PRFVMRSAqcE1vZHVsZSApOwogZXh0ZXJuIHZvaWQgTkVfSW5pdGlhbGl6ZURMTHMoIEhNT0RVTEUxNiBoTW9kdWxlICk7Ci1leHRlcm4gQk9PTDMyIE5FX0NyZWF0ZVNlZ21lbnRzKCBITU9EVUxFMTYgaE1vZHVsZSApOworZXh0ZXJuIEJPT0wzMiBORV9DcmVhdGVTZWdtZW50cyggTkVfTU9EVUxFICpwTW9kdWxlICk7CitleHRlcm4gSElOU1RBTkNFMTYgTkVfQ3JlYXRlSW5zdGFuY2UoIE5FX01PRFVMRSAqcE1vZHVsZSwgSElOU1RBTkNFMTYgKnByZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wzMiBsaWJfb25seSApOwogCi0vKiBidWlsdGluLmMgKi8KKy8qIGlmMTYzMi9idWlsdGluLmMgKi8KIGV4dGVybiBCT09MMzIgQlVJTFRJTl9Jbml0KHZvaWQpOwotZXh0ZXJuIEhNT0RVTEUzMiBCVUlMVElOX0xvYWRNb2R1bGUoIExQQ1NUUiBuYW1lLCBCT09MMzIgZm9yY2UgKTsKK2V4dGVybiBITU9EVUxFMTYgQlVJTFRJTl9Mb2FkTW9kdWxlKCBMUENTVFIgbmFtZSwgQk9PTDMyIGZvcmNlICk7CiBleHRlcm4gTFBDU1RSIEJVSUxUSU5fR2V0RW50cnlQb2ludDE2KCBXT1JEIGNzLCBXT1JEIGlwLCBXT1JEICpwT3JkICk7Ci1leHRlcm4gRkFSUFJPQzMyIEJVSUxUSU5fR2V0RW50cnlQb2ludDMyKCBjaGFyICpidWZmZXIsIHZvaWQgKnJlbGF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgKnR5cGVtYXNrICk7CiBleHRlcm4gQk9PTDMyIEJVSUxUSU5fUGFyc2VETExPcHRpb25zKCBjb25zdCBjaGFyICpzdHIgKTsKIGV4dGVybiB2b2lkIEJVSUxUSU5fUHJpbnRETExzKHZvaWQpOwogCkBAIC0xODksNiArMTgxLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBfUERCMzIgKnByb2Nlc3MgKTsKIAogLyogaWYxNjMyL2J1aWx0aW4uYyAqLwotZXh0ZXJuIEhNT0RVTEUzMiAoKmZuQlVJTFRJTl9Mb2FkTW9kdWxlKShMUENTVFIgbmFtZSwgQk9PTDMyIGZvcmNlKTsKK2V4dGVybiBITU9EVUxFMTYgKCpmbkJVSUxUSU5fTG9hZE1vZHVsZSkoTFBDU1RSIG5hbWUsIEJPT0wzMiBmb3JjZSk7CiAKICNlbmRpZiAgLyogX19XSU5FX01PRFVMRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25lZXhlLmggYi9pbmNsdWRlL25lZXhlLmgKaW5kZXggN2E0MjhmZC4uNmZhZjMzMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZWV4ZS5oCisrKyBiL2luY2x1ZGUvbmVleGUuaApAQCAtODgsNyArODgsNiBAQAogI2RlZmluZSBORV9GRkxBR1NfTVVMVElQTEVEQVRBCTB4MDAwMgogI2RlZmluZSBORV9GRkxBR1NfV0lOMzIgICAgICAgICAweDAwMTAKICNkZWZpbmUgTkVfRkZMQUdTX0JVSUxUSU4gICAgICAgMHgwMDIwICAvKiBXaW5lIGJ1aWx0LWluIG1vZHVsZSAqLwotI2RlZmluZSBORV9GRkxBR1NfSU1QTElDSVQJMHgwMDQwCiAjZGVmaW5lIE5FX0ZGTEFHU19GUkFNRUJVRgkweDAxMDAgIC8qIE9TLzIgZnVsbHNjcmVlbiBhcHAgKi8KICNkZWZpbmUgTkVfRkZMQUdTX0NPTlNPTEUJMHgwMjAwICAvKiBPUy8yIGNvbnNvbGUgYXBwICovCiAjZGVmaW5lIE5FX0ZGTEFHU19HVUkJCTB4MDMwMAkvKiByaWdodCwgKE5FX0ZGTEFHU19GUkFNRUJVRiB8IE5FX0ZGTEFHU19DT05TT0xFKSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9udGRsbC5oIGIvaW5jbHVkZS9udGRsbC5oCmluZGV4IDI4ZjM1ODMuLjE3OTFhNmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbnRkbGwuaAorKysgYi9pbmNsdWRlL250ZGxsLmgKQEAgLTE1LDE2ICsxNSwyMCBAQAogCiAvKiBTZWN1cml0eSBJZHMgb2YgTlQgKi8KIAorLyogTW92ZWQgdG8gd2luZG93cy5oCiB0eXBlZGVmIHN0cnVjdCB7CiAJQllURQlWYWx1ZVs2XTsKIH0gU0lEX0lERU5USUZJRVJfQVVUSE9SSVRZLCpQU0lEX0lERU5USUZJRVJfQVVUSE9SSVRZLCpMUFNJRF9JREVOVElGSUVSX0FVVEhPUklUWTsKKyovCiAKKy8qIE1vdmVkIHRvIHdpbmRvd3MuaAogdHlwZWRlZiBzdHJ1Y3QgX1NJRCB7CiAJQllURQlSZXZpc2lvbjsKIAlCWVRFCVN1YkF1dGhvcml0eUNvdW50OwogCVNJRF9JREVOVElGSUVSX0FVVEhPUklUWQlJZGVudGlmaWVyQXV0aG9yaXR5OwotCURXT1JECVN1YkF1dGhvcml0eVsxXTsJLyogbW9yZSB0aGFuIG9uZSAqLworCURXT1JECVN1YkF1dGhvcml0eVsxXTsKIH0gU0lELCpQU0lELCpMUFNJRDsKKyovCiAKICNkZWZpbmUJU0lEX1JFVklTSU9OCQkJKDEpCS8qIEN1cnJlbnQgcmV2aXNpb24gKi8KICNkZWZpbmUJU0lEX01BWF9TVUJfQVVUSE9SSVRJRVMJCSgxNSkJLyogY3VycmVudCBtYXggc3ViYXV0aHMgKi8KQEAgLTM3LDYgKzQxLDcgQEAKICNkZWZpbmUJQUNMX1JFVklTSU9OMQkxCiAjZGVmaW5lCUFDTF9SRVZJU0lPTjIJMgogCisvKiBNb3ZlZCB0byB3aW5kb3dzLmgKIHR5cGVkZWYgc3RydWN0IF9BQ0wgewogCUJZVEUJQWNsUmV2aXNpb247CiAJQllURQlTYnoxOwpAQCAtNDQsNiArNDksNyBAQAogCVdPUkQJQWNlQ291bnQ7CiAJV09SRAlTYnoyOwogfSBBQ0wsKkxQQUNMOworKi8KIAogLyogQUNFcywgZGlyZWN0bHkgc3RhcnRpbmcgYWZ0ZXIgYW4gQUNMICovCiB0eXBlZGVmIHN0cnVjdCBfQUNFX0hFQURFUiB7CkBAIC0xMDMsNyArMTA5LDkgQEAKICNkZWZpbmUJU0VDVVJJVFlfREVTQ1JJUFRPUl9SRVZJU0lPTgkxCiAjZGVmaW5lCVNFQ1VSSVRZX0RFU0NSSVBUT1JfUkVWSVNJT04xCTEKIAorLyoKIHR5cGVkZWYgV09SRCBTRUNVUklUWV9ERVNDUklQVE9SX0NPTlRST0w7CisgKi8KIAogI2RlZmluZQlTRV9PV05FUl9ERUZBVUxURUQJMHgwMDAxCiAjZGVmaW5lCVNFX0dST1VQX0RFRkFVTFRFRAkweDAwMDIKQEAgLTExMyw2ICsxMjEsNyBAQAogI2RlZmluZQlTRV9TQUNMX0RFRkFVTFRFRAkweDAwMjAKICNkZWZpbmUJU0VfU0VMRl9SRUxBVElWRQkweDgwMDAKIAorLyogVGhpcyB3YXMgbW92ZWQgdG8gd2luZG93cy5oCiB0eXBlZGVmIHN0cnVjdCB7CiAJQllURQlSZXZpc2lvbjsKIAlCWVRFCVNiejE7CkBAIC0xMjIsNiArMTMxLDcgQEAKIAlMUEFDTAlTYWNsOwogCUxQQUNMCURhY2w7CiB9IFNFQ1VSSVRZX0RFU0NSSVBUT1IsKlBTRUNVUklUWV9ERVNDUklQVE9SLCpMUFNFQ1VSSVRZX0RFU0NSSVBUT1I7CisqLwogCiB0eXBlZGVmIGVudW0gdGFnU0lEX05BTUVfVVNFIHsKIAlTaWRUeXBlVXNlciA9IDEsCmRpZmYgLS1naXQgYS9pbmNsdWRlL29sZTIuaCBiL2luY2x1ZGUvb2xlMi5oCmluZGV4IGY2Njk5MjkuLmU4MDQ1NGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvb2xlMi5oCisrKyBiL2luY2x1ZGUvb2xlMi5oCkBAIC01LDggKzUsNiBAQAogI2lmbmRlZiBfX1dJTkVfT0xFMl9ICiAjZGVmaW5lIF9fV0lORV9PTEUyX0gKIAotdHlwZWRlZiBMT05HIEhSRVNVTFQ7Ci0KIC8qIHRvIGJlIGltcGxlbWVudGVkICovCiB0eXBlZGVmIExQVk9JRCBMUE1FU1NBR0VGSUxURVI7CiB0eXBlZGVmIExQVk9JRCBMUERST1BUQVJHRVQ7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3BhdGguaCBiL2luY2x1ZGUvcGF0aC5oCmluZGV4IDRkZGZjMjguLjgyNjNlMmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcGF0aC5oCisrKyBiL2luY2x1ZGUvcGF0aC5oCkBAIC00Miw2ICs0Miw4IEBACiAKIGV4dGVybiBCT09MMzIgUEFUSF9Nb3ZlVG8oSERDMzIgaGRjKTsKIGV4dGVybiBCT09MMzIgUEFUSF9MaW5lVG8oSERDMzIgaGRjLCBJTlQzMiB4LCBJTlQzMiB5KTsKK2V4dGVybiBCT09MMzIgUEFUSF9SZWN0YW5nbGUoSERDMzIgaGRjLCBJTlQzMiB4MSwgSU5UMzIgeTEsCisgICBJTlQzMiB4MiwgSU5UMzIgeTIpOwogZXh0ZXJuIEJPT0wzMiBQQVRIX0VsbGlwc2UoSERDMzIgaGRjLCBJTlQzMiB4MSwgSU5UMzIgeTEsCiAgICBJTlQzMiB4MiwgSU5UMzIgeTIpOwogZXh0ZXJuIEJPT0wzMiBQQVRIX0FyYyhIREMzMiBoZGMsIElOVDMyIHgxLCBJTlQzMiB5MSwgSU5UMzIgeDIsIElOVDMyIHkyLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wZV9pbWFnZS5oIGIvaW5jbHVkZS9wZV9pbWFnZS5oCmluZGV4IGJmMjc2ZjYuLjViOTE0NjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcGVfaW1hZ2UuaAorKysgYi9pbmNsdWRlL3BlX2ltYWdlLmgKQEAgLTQwLDggKzQwLDggQEAKIGV4dGVybiBEV09SRCBQRV9TaXplb2ZSZXNvdXJjZTMyKEhNT0RVTEUzMixIUlNSQzMyKTsKIGV4dGVybiBITU9EVUxFMzIgUEVfTG9hZExpYnJhcnlFeDMyQShMUENTVFIsc3RydWN0IF9QREIzMiosSEZJTEUzMixEV09SRCk7CiBleHRlcm4gSEdMT0JBTDMyIFBFX0xvYWRSZXNvdXJjZTMyKHN0cnVjdCBfd2luZV9tb2RyZWYgKndtLEhSU1JDMzIpOwotZXh0ZXJuIEhJTlNUQU5DRTE2IFBFX0xvYWRNb2R1bGUoIEhGSUxFMzIgaEZpbGUsIE9GU1RSVUNUICpvZnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIGNtZF9saW5lLCBMUENTVFIgZW52LCBVSU5UMTYgc2hvd0NtZCk7CitleHRlcm4gSElOU1RBTkNFMTYgUEVfTG9hZE1vZHVsZSggTFBDU1RSIG5hbWUsIExQQ1NUUiBjbWRfbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENTVFIgZW52LCBVSU5UMTYgc2hvd0NtZCApOwogCiBzdHJ1Y3QgX1BEQjMyOyAvKiBmb3J3YXJkIGRlZmluaXRpb24gKi8KIHN0cnVjdCBfVEhEQjsgLyogZm9yd2FyZCBkZWZpbml0aW9uICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Byb2dyZXNzLmggYi9pbmNsdWRlL3Byb2dyZXNzLmgKaW5kZXggMzZiNzA2My4uMzE5MzY3ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9wcm9ncmVzcy5oCisrKyBiL2luY2x1ZGUvcHJvZ3Jlc3MuaApAQCAtMjAsNiArMjAsNiBAQAogICBDT0xPUlJFRiAgICBDb2xvckJrOyAgICAgIC8qIEJhY2tncm91bmQgY29sb3IgKi8KIH0gUFJPR1JFU1NfSU5GTzsKIAotTFJFU1VMVCBXSU5BUEkgUHJvZ3Jlc3NXaW5kb3dQcm9jKEhXTkQzMiwgVUlOVDMyLCBXUEFSQU0zMiwgTFBBUkFNKTsKK2V4dGVybiB2b2lkIFBST0dSRVNTX1JlZ2lzdGVyICh2b2lkKTsKIAogI2VuZGlmICAvKiBfX1dJTkVfUFJPR1JFU1NfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zdGF0dXMuaCBiL2luY2x1ZGUvc3RhdHVzLmgKaW5kZXggMjRhMjI5MC4uYTUzY2VhZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zdGF0dXMuaAorKysgYi9pbmNsdWRlL3N0YXR1cy5oCkBAIC03LDggKzcsNyBAQAogI2lmbmRlZiBfX1dJTkVfU1RBVFVTX0gKICNkZWZpbmUgX19XSU5FX1NUQVRVU19ICiAKLUxSRVNVTFQgV0lOQVBJIFN0YXR1c1dpbmRvd1Byb2MoIEhXTkQzMiBod25kLCBVSU5UMzIgbXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtICk7CitleHRlcm4gdm9pZCBTVEFUVVNfUmVnaXN0ZXIodm9pZCk7CiAKIHR5cGVkZWYgc3RydWN0CiB7CkBAIC0xNiwxMyArMTUsMTcgQEAKICAgICBJTlQzMglzdHlsZTsKICAgICBSRUNUMzIJYm91bmQ7CiAgICAgTFBTVFIJdGV4dDsKKyAgICBISUNPTjMyICAgICBoSWNvbjsKIH0gU1RBVFVTV0lORE9XUEFSVDsKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBVSU5UMTYgICAgICAgICAgICAgIG51bVBhcnRzOwogICAgIFVJTlQxNiAgICAgICAgICAgICAgdGV4dEhlaWdodDsKKyAgICBVSU5UMzIgICAgICAgICAgICAgIGhlaWdodDsKICAgICBCT09MMzIgICAgICAgICAgICAgIHNpbXBsZTsKKyAgICBIRk9OVDMyICAgICAgICAgICAgIGhGb250OworICAgIENPTE9SUkVGICAgICAgICAgICAgY2xyQms7ICAvKiBiYWNrZ3JvdW5kIGNvbG9yICovCiAgICAgU1RBVFVTV0lORE9XUEFSVAlwYXJ0MDsJLyogc2ltcGxlIHdpbmRvdyAqLwogICAgIFNUQVRVU1dJTkRPV1BBUlQgICAqcGFydHM7CiB9IFNUQVRVU1dJTkRPV0lORk87CmRpZmYgLS1naXQgYS9pbmNsdWRlL3VwZG93bi5oIGIvaW5jbHVkZS91cGRvd24uaAppbmRleCBiYjU2ZTEzLi4yMmExZTNkIDEwMDY0NAotLS0gYS9pbmNsdWRlL3VwZG93bi5oCisrKyBiL2luY2x1ZGUvdXBkb3duLmgKQEAgLTI5LDcgKzI5LDYgQEAKICAgaW50IGlEZWx0YTsKIH0gTk1fVVBET1dOOwogCi1MUkVTVUxUIFdJTkFQSSBVcERvd25XaW5kb3dQcm9jKEhXTkQzMiBod25kLCBVSU5UMzIgbWVzc2FnZSwgV1BBUkFNMzIgd1BhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEFSQU0gbFBhcmFtKTsKK2V4dGVybiB2b2lkIFVQRE9XTl9SZWdpc3RlciAodm9pZCk7CiAKICNlbmRpZiAgLyogX19XSU5FX1VQRE9XTl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3ZlcnNpb24uaCBiL2luY2x1ZGUvdmVyc2lvbi5oCmluZGV4IGFlZDY3MzMuLjMxZTA5NGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdmVyc2lvbi5oCisrKyBiL2luY2x1ZGUvdmVyc2lvbi5oCkBAIC0xICsxIEBACi0jZGVmaW5lIFdJTkVfUkVMRUFTRV9JTkZPICJXaW5lIHJlbGVhc2UgOTgwNTAzIgorI2RlZmluZSBXSU5FX1JFTEVBU0VfSU5GTyAiV2luZSByZWxlYXNlIDk4MDUxNyIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvd2luZG93cy5oIGIvaW5jbHVkZS93aW5kb3dzLmgKaW5kZXggNmE2Njc1Mi4uOTU3ZWIxOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS93aW5kb3dzLmgKKysrIGIvaW5jbHVkZS93aW5kb3dzLmgKQEAgLTEyNTksNiArMTI1OSwxMSBAQAogICBGT05UU0lHTkFUVVJFCWZzOwogfSBDSEFSU0VUSU5GTywqTFBDSEFSU0VUSU5GTzsKIAorLyogRmxhZ3MgZm9yIE1vZGlmeVdvcmxkVHJhbnNmb3JtICovCisjZGVmaW5lIE1XVF9JREVOVElUWSAgICAgIDEKKyNkZWZpbmUgTVdUX0xFRlRNVUxUSVBMWSAgMgorI2RlZmluZSBNV1RfUklHSFRNVUxUSVBMWSAzCisKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgRkxPQVQgIGVNMTE7CkBAIC0yMjEyLDggKzIyMTcsMjYgQEAKICNkZWZpbmUgRERMX0RSSVZFUwkweDQwMDAKICNkZWZpbmUgRERMX0VYQ0xVU0lWRQkweDgwMDAKIAotLyogVGhlIHNlY3VyaXR5IGF0dHJpYnV0ZXMgc3RydWN0dXJlIAotICovCit0eXBlZGVmIHN0cnVjdCBfQUNMIHsKKyAgICBCWVRFIEFjbFJldmlzaW9uOworICAgIEJZVEUgU2J6MTsKKyAgICBXT1JEIEFjbFNpemU7CisgICAgV09SRCBBY2VDb3VudDsKKyAgICBXT1JEIFNiejI7Cit9IEFDTCwgKkxQQUNMOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURSBWYWx1ZVs2XTsKK30gU0lEX0lERU5USUZJRVJfQVVUSE9SSVRZLCpQU0lEX0lERU5USUZJRVJfQVVUSE9SSVRZLCpMUFNJRF9JREVOVElGSUVSX0FVVEhPUklUWTsKKwordHlwZWRlZiBzdHJ1Y3QgX1NJRCB7CisgICAgQllURSBSZXZpc2lvbjsKKyAgICBCWVRFIFN1YkF1dGhvcml0eUNvdW50OworICAgIFNJRF9JREVOVElGSUVSX0FVVEhPUklUWSBJZGVudGlmaWVyQXV0aG9yaXR5OworICAgIERXT1JEIFN1YkF1dGhvcml0eVsxXTsKK30gU0lELCpQU0lELCpMUFNJRDsKKworLyogVGhlIHNlY3VyaXR5IGF0dHJpYnV0ZXMgc3RydWN0dXJlICovCiB0eXBlZGVmIHN0cnVjdAogewogICAgIERXT1JEICAgbkxlbmd0aDsKQEAgLTIyMjEsNiArMjI0NCwxOSBAQAogICAgIEJPT0wzMiAgYkluaGVyaXRIYW5kbGU7CiB9IFNFQ1VSSVRZX0FUVFJJQlVURVMsICpMUFNFQ1VSSVRZX0FUVFJJQlVURVM7CiAKK3R5cGVkZWYgV09SRCBTRUNVUklUWV9ERVNDUklQVE9SX0NPTlRST0w7CisKKy8qIFRoZSBzZWN1cml0eSBkZXNjcmlwdG9yIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUgUmV2aXNpb247CisgICAgQllURSBTYnoxOworICAgIFNFQ1VSSVRZX0RFU0NSSVBUT1JfQ09OVFJPTCBDb250cm9sOworICAgIExQU0lEIE93bmVyOworICAgIExQU0lEIEdyb3VwOworICAgIExQQUNMIFNhY2w7CisgICAgTFBBQ0wgRGFjbDsKK30gU0VDVVJJVFlfREVTQ1JJUFRPUiwgKkxQU0VDVVJJVFlfREVTQ1JJUFRPUjsKKwogdHlwZWRlZiBEV09SRCAgIFNFQ1VSSVRZX0lORk9STUFUSU9OOwogCiAKQEAgLTYwNjQsNyArNjEwMCw2IEBACiBCT09MMTYgICAgICBXSU5BUEkgU2V0V2luRGVidWdJbmZvKExQV0lOREVCVUdJTkZPKTsKIERXT1JEICAgICAgIFdJTkFQSSBTZXRXaW5kb3dFeHQoSERDMTYsSU5UMTYsSU5UMTYpOwogRFdPUkQgICAgICAgV0lOQVBJIFNldFdpbmRvd09yZyhIREMxNixJTlQxNixJTlQxNik7Ci1WT0lEICAgICAgICBXSU5BUEkgU3dpdGNoU3RhY2tCYWNrKHZvaWQpOwogVk9JRCAgICAgICAgV0lOQVBJIFN3aXRjaFN0YWNrVG8oV09SRCxXT1JELFdPUkQpOwogVk9JRCAgICAgICAgV0lOQVBJIFRpbGVDaGlsZFdpbmRvd3MoSFdORDE2LFdPUkQpOwogSU5UMTYgICAgICAgV0lOQVBJIFVuZ2V0Q29tbUNoYXIoSU5UMTYsQ0hBUik7CkBAIC02MDgzLDYgKzYxMTgsNyBAQAogQk9PTDMyICAgICAgV0lOQVBJIENsZWFyQ29tbUVycm9yKElOVDMyLExQRFdPUkQsTFBDT01TVEFUKTsKIEJPT0wzMiAgICAgIFdJTkFQSSBDbG9zZUhhbmRsZShIQU5ETEUzMik7CiBCT09MMzIgICAgICBXSU5BUEkgQ2xvc2VTZXJ2aWNlSGFuZGxlKEhBTkRMRTMyKTsKK0JPT0wzMiAgICAgIFdJTkFQSSBDb21iaW5lVHJhbnNmb3JtKExQWEZPUk0sY29uc3QgWEZPUk0gKixjb25zdCBYRk9STSAqKTsKIElOVDMyICAgICAgIFdJTkFQSSBDb3B5QWNjZWxlcmF0b3JUYWJsZTMyQShIQUNDRUwzMixMUEFDQ0VMMzIsSU5UMzIpOwogSU5UMzIgICAgICAgV0lOQVBJIENvcHlBY2NlbGVyYXRvclRhYmxlMzJXKEhBQ0NFTDMyLExQQUNDRUwzMixJTlQzMik7CiAjZGVmaW5lICAgICBDb3B5QWNjZWxlcmF0b3JUYWJsZSBXSU5FTElCX05BTUVfQVcoQ29weUFjY2VsZXJhdG9yVGFibGUpCkBAIC02MjE1LDYgKzYyNTEsOSBAQAogRFdPUkQgICAgICAgV0lOQVBJIEdldExhcmdlc3RDb25zb2xlV2luZG93U2l6ZShIQU5ETEUzMik7CiBWT0lEICAgICAgICBXSU5BUEkgR2V0TG9jYWxUaW1lKExQU1lTVEVNVElNRSk7CiBEV09SRCAgICAgICBXSU5BUEkgR2V0TG9naWNhbERyaXZlcyh2b2lkKTsKK0RXT1JEICAgICAgIFdJTkFQSSBHZXRMb25nUGF0aE5hbWUzMkEoTFBDU1RSLExQU1RSLERXT1JEKTsKK0RXT1JEICAgICAgIFdJTkFQSSBHZXRMb25nUGF0aE5hbWUzMlcoTFBDV1NUUixMUFdTVFIsRFdPUkQpOworI2RlZmluZSAgICAgR2V0TG9uZ1BhdGhOYW1lIFdJTkVMSUJfTkFNRV9BVyhHZXRMb25nUGF0aE5hbWUpCiBCT09MMzIgICAgICBXSU5BUEkgR2V0TWVudUl0ZW1JbmZvMzJBKEhNRU5VMzIsVUlOVDMyLEJPT0wzMixNRU5VSVRFTUlORk8zMkEqKTsKIEJPT0wzMiAgICAgIFdJTkFQSSBHZXRNZW51SXRlbUluZm8zMlcoSE1FTlUzMixVSU5UMzIsQk9PTDMyLE1FTlVJVEVNSU5GTzMyVyopOwogI2RlZmluZSAgICAgR2V0TWVudUl0ZW1JbmZvIFdJTkVMSUJfTkFNRV9BVyhHZXRNZW51SXRlbUluZm8pCkBAIC02MjM5LDYgKzYyNzgsNyBAQAogVk9JRCAgICAgICAgV0lOQVBJIEdldFN5c3RlbUluZm8oTFBTWVNURU1fSU5GTyk7CiBCT09MMzIgICAgICBXSU5BUEkgR2V0U3lzdGVtUG93ZXJTdGF0dXMoTFBTWVNURU1fUE9XRVJfU1RBVFVTKTsKIFZPSUQgICAgICAgIFdJTkFQSSBHZXRTeXN0ZW1UaW1lKExQU1lTVEVNVElNRSk7CitJTlQzMiAgICAgICBXSU5BUEkgR2V0VGV4dENoYXJzZXRJbmZvKEhEQzMyLExQQ0hBUlNFVElORk8sRFdPUkQpOwogQk9PTDMyICAgICAgV0lOQVBJIEdldFRleHRFeHRlbnRFeFBvaW50MzJBKEhEQzMyLExQQ1NUUixJTlQzMixJTlQzMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUElOVDMyLExQSU5UMzIsTFBTSVpFMzIpOwogQk9PTDMyICAgICAgV0lOQVBJIEdldFRleHRFeHRlbnRFeFBvaW50MzJXKEhEQzMyLExQQ1dTVFIsSU5UMzIsSU5UMzIsCkBAIC02Mjg2LDYgKzYzMjYsNyBAQAogSU5UMzIgICAgICAgV0lOQVBJIE1lc3NhZ2VCb3hFeDMyQShIV05EMzIsTFBDU1RSLExQQ1NUUixVSU5UMzIsV09SRCk7CiBJTlQzMiAgICAgICBXSU5BUEkgTWVzc2FnZUJveEV4MzJXKEhXTkQzMixMUENXU1RSLExQQ1dTVFIsVUlOVDMyLFdPUkQpOwogI2RlZmluZSAgICAgTWVzc2FnZUJveEV4IFdJTkVMSUJfTkFNRV9BVyhNZXNzYWdlQm94RXgpCitCT09MMzIgICAgICBXSU5BUEkgTW9kaWZ5V29ybGRUcmFuc2Zvcm0oSERDMzIsY29uc3QgWEZPUk0gKiwgRFdPUkQpOwogQk9PTDMyICAgICAgV0lOQVBJIE1vdmVGaWxlMzJBKExQQ1NUUixMUENTVFIpOwogQk9PTDMyICAgICAgV0lOQVBJIE1vdmVGaWxlMzJXKExQQ1dTVFIsTFBDV1NUUik7CiAjZGVmaW5lICAgICBNb3ZlRmlsZSBXSU5FTElCX05BTUVfQVcoTW92ZUZpbGUpCkBAIC02MzI2LDYgKzYzNjcsOSBAQAogQk9PTDMyICAgICAgV0lOQVBJIFJlYWRDb25zb2xlMzJXKEhBTkRMRTMyLExQVk9JRCxEV09SRCxMUERXT1JELExQVk9JRCk7CiAjZGVmaW5lICAgICBSZWFkQ29uc29sZSBXSU5FTElCX05BTUVfQVcoUmVhZENvbnNvbGUpCiBCT09MMzIgICAgICBXSU5BUEkgUmVhZEZpbGUoSEFORExFMzIsTFBWT0lELERXT1JELExQRFdPUkQsTFBPVkVSTEFQUEVEKTsKK0xPTkcgICAgICAgIFdJTkFQSSBSZWdDb25uZWN0UmVnaXN0cnkzMkEoTFBDU1RSLEhLRVksTFBIS0VZKTsKK0xPTkcgICAgICAgIFdJTkFQSSBSZWdDb25uZWN0UmVnaXN0cnkzMlcoTFBDV1NUUixIS0VZLExQSEtFWSk7CisjZGVmaW5lICAgICBSZWdDb25uZWN0UmVnaXN0cnkgV0lORUxJQl9OQU1FX0FXKFJlZ0Nvbm5lY3RSZWdpc3RyeSkKIERXT1JEICAgICAgIFdJTkFQSSBSZWdDcmVhdGVLZXlFeDMyQShIS0VZLExQQ1NUUixEV09SRCxMUFNUUixEV09SRCxSRUdTQU0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBTRUNVUklUWV9BVFRSSUJVVEVTLExQSEtFWSxMUERXT1JEKTsKIERXT1JEICAgICAgIFdJTkFQSSBSZWdDcmVhdGVLZXlFeDMyVyhIS0VZLExQQ1dTVFIsRFdPUkQsTFBXU1RSLERXT1JELFJFR1NBTSwKQEAgLTYzMzYsMTAgKzYzODAsMTQgQEAKIERXT1JEICAgICAgIFdJTkFQSSBSZWdFbnVtS2V5RXgzMlcoSEtFWSxEV09SRCxMUFdTVFIsTFBEV09SRCxMUERXT1JELExQV1NUUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEV09SRCxMUEZJTEVUSU1FKTsKICNkZWZpbmUgICAgIFJlZ0VudW1LZXlFeCBXSU5FTElCX05BTUVfQVcoUmVnRW51bUtleUV4KQotTE9ORyAgICAgICAgV0lOQVBJIFJlZ0dldEtleVNlY3VyaXR5KEhLRVksU0VDVVJJVFlfSU5GT1JNQVRJT04sTFBWT0lELExQRFdPUkQpOworTE9ORyAgICAgICAgV0lOQVBJIFJlZ0dldEtleVNlY3VyaXR5KEhLRVksU0VDVVJJVFlfSU5GT1JNQVRJT04sTFBTRUNVUklUWV9ERVNDUklQVE9SLExQRFdPUkQpOwogSEFORExFMzIgICAgV0lOQVBJIFJlZ2lzdGVyRXZlbnRTb3VyY2UzMkEoTFBDU1RSLExQQ1NUUik7CiBIQU5ETEUzMiAgICBXSU5BUEkgUmVnaXN0ZXJFdmVudFNvdXJjZTMyVyhMUENXU1RSLExQQ1dTVFIpOwogI2RlZmluZSAgICAgUmVnaXN0ZXJFdmVudFNvdXJjZSBXSU5FTElCX05BTUVfQVcoUmVnaXN0ZXJFdmVudFNvdXJjZSkKK0xPTkcgICAgICAgIFdJTkFQSSBSZWdMb2FkS2V5MzJBKEhLRVksTFBDU1RSLExQQ1NUUik7CitMT05HICAgICAgICBXSU5BUEkgUmVnTG9hZEtleTMyVyhIS0VZLExQQ1dTVFIsTFBDV1NUUik7CisjZGVmaW5lICAgICBSZWdMb2FkS2V5IFdJTkVMSUJfTkFNRV9BVyhSZWdMb2FkS2V5KQorTE9ORyAgICAgICAgV0lOQVBJIFJlZ05vdGlmeUNoYW5nZUtleVZhbHVlKEhLRVksQk9PTDMyLERXT1JELEhBTkRMRTMyLEJPT0wzMik7CiBEV09SRCAgICAgICBXSU5BUEkgUmVnT3BlbktleUV4MzJXKEhLRVksTFBDV1NUUixEV09SRCxSRUdTQU0sTFBIS0VZKTsKIERXT1JEICAgICAgIFdJTkFQSSBSZWdPcGVuS2V5RXgzMkEoSEtFWSxMUENTVFIsRFdPUkQsUkVHU0FNLExQSEtFWSk7CiAjZGVmaW5lICAgICBSZWdPcGVuS2V5RXggV0lORUxJQl9OQU1FX0FXKFJlZ09wZW5LZXlFeCkKQEAgLTc1NTMsNiArNzYwMSw5IEBACiBJTlQxNiAgICAgICBXSU5BUEkgR2V0VGV4dENoYXJhY3RlckV4dHJhMTYoSERDMTYpOwogSU5UMzIgICAgICAgV0lOQVBJIEdldFRleHRDaGFyYWN0ZXJFeHRyYTMyKEhEQzMyKTsKICNkZWZpbmUgICAgIEdldFRleHRDaGFyYWN0ZXJFeHRyYSBXSU5FTElCX05BTUUoR2V0VGV4dENoYXJhY3RlckV4dHJhKQorSU5UMTYgICAgICAgV0lOQVBJIEdldFRleHRDaGFyc2V0MTYoSERDMTYpOworSU5UMzIgICAgICAgV0lOQVBJIEdldFRleHRDaGFyc2V0MzIoSERDMzIpOworI2RlZmluZSAgICAgR2V0VGV4dENoYXJzZXQgV0lORUxJQl9OQU1FKEdldFRleHRDaGFyc2V0KQogQ09MT1JSRUYgICAgV0lOQVBJIEdldFRleHRDb2xvcjE2KEhEQzE2KTsKIENPTE9SUkVGICAgIFdJTkFQSSBHZXRUZXh0Q29sb3IzMihIREMzMik7CiAjZGVmaW5lICAgICBHZXRUZXh0Q29sb3IgV0lORUxJQl9OQU1FKEdldFRleHRDb2xvcikKQEAgLTg3MzgsNyArODc4OSw3IEBACiBJTlQzMiAgICAgICBXSU5BUEkgTG9hZE1lc3NhZ2UzMkEoSE1PRFVMRTMyLFVJTlQzMixXT1JELExQU1RSLElOVDMyKTsKIElOVDMyICAgICAgIFdJTkFQSSBMb2FkTWVzc2FnZTMyVyhITU9EVUxFMzIsVUlOVDMyLFdPUkQsTFBXU1RSLElOVDMyKTsKIFNFR1BUUiAgICAgIFdJTkFQSSBXSU4xNl9HbG9iYWxMb2NrMTYoSEdMT0JBTDE2KTsKLVNFR1BUUiAgICAgIFdJTkFQSSBXSU4xNl9Mb2NrUmVzb3VyY2UoSEdMT0JBTDE2KTsKK1NFR1BUUiAgICAgIFdJTkFQSSBXSU4xNl9Mb2NrUmVzb3VyY2UxNihIR0xPQkFMMTYpOwogTE9ORyAgICAgICAgV0lOQVBJIFdJTjE2X2hyZWFkKEhGSUxFMTYsU0VHUFRSLExPTkcpOwogSU5UMzIgICAgICAgV0lOQVBJIGxzdHJuY21wMzJBKExQQ1NUUixMUENTVFIsSU5UMzIpOwogSU5UMzIgICAgICAgV0lOQVBJIGxzdHJuY21wMzJXKExQQ1dTVFIsTFBDV1NUUixJTlQzMik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3dpbmVycm9yLmggYi9pbmNsdWRlL3dpbmVycm9yLmgKaW5kZXggNzYzYTEyNC4uMzRhZTIzOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS93aW5lcnJvci5oCisrKyBiL2luY2x1ZGUvd2luZXJyb3IuaApAQCAtMzAsMTEgKzMwLDEzIEBACiAjZGVmaW5lIEVSUk9SX0lOVkFMSURfSEFORExFICAgICAgICA2CiAjZGVmaW5lIEVSUk9SX05PVF9FTk9VR0hfTUVNT1JZICAgICA4CiAjZGVmaW5lIEVSUk9SX0JBRF9GT1JNQVQgICAgICAgICAgICAxMQorI2RlZmluZSBFUlJPUl9JTlZBTElEX0FDQ0VTUyAgICAgICAgMTIKICNkZWZpbmUgRVJST1JfT1VUT0ZNRU1PUlkgICAgICAgICAgIDE0CiAjZGVmaW5lIEVSUk9SX05PX01PUkVfRklMRVMgICAgICAgICAxOAogI2RlZmluZSBFUlJPUl9TSEFSSU5HX1ZJT0xBVElPTiAgICAgMzIKICNkZWZpbmUgRVJST1JfTE9DS19WSU9MQVRJT04gICAgICAgIDMzCiAjZGVmaW5lIEVSUk9SX0RVUF9OQU1FICAgICAgICAgICAgICA1MgorI2RlZmluZSBFUlJPUl9CQURfTkVUUEFUSCAgICAgICAgICAgNTMKICNkZWZpbmUgRVJST1JfRklMRV9FWElTVFMgICAgICAgICAgIDgwCiAjZGVmaW5lIEVSUk9SX0NBTk5PVF9NQUtFICAgICAgICAgICA4MgogI2RlZmluZSBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUiAgICAgODcKQEAgLTQ0LDYgKzQ2LDcgQEAKICNkZWZpbmUgRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUiAgIDEyMgogI2RlZmluZSBFUlJPUl9TRUVLX09OX0RFVklDRSAgICAgICAgMTMyCiAjZGVmaW5lIEVSUk9SX0RJUl9OT1RfRU1QVFkgICAgICAgICAxNDUKKyNkZWZpbmUgRVJST1JfQkFEX1BBVEhOQU1FICAgICAgICAgIDE2MQogI2RlZmluZSBFUlJPUl9CVVNZICAgICAgICAgICAgICAgICAgMTcwCiAjZGVmaW5lIEVSUk9SX0FMUkVBRFlfRVhJU1RTICAgICAgICAxODMKICNkZWZpbmUgRVJST1JfRklMRU5BTUVfRVhDRURfUkFOR0UgIDIwNgpAQCAtNTMsMTEgKzU2LDE0IEBACiAjZGVmaW5lIEVSUk9SX1RPT19NQU5ZX1BPU1RTICAgICAgICAyOTgKICNkZWZpbmUgRVJST1JfSU5WQUxJRF9BRERSRVNTICAgICAgIDQ4NwogI2RlZmluZSBFUlJPUl9DQU5fTk9UX0NPTVBMRVRFICAgICAgMTAwMworI2RlZmluZSBFUlJPUl9CQURLRVkgICAgICAgICAgICAgICAgMTAxMCAvKiBDb25maWcgcmVnIGtleSBpbnZhbGlkICovCisjZGVmaW5lIEVSUk9SX0NBTlRXUklURSAgICAgICAgICAgICAxMDEzIC8qIENvbmZpZyByZWcga2V5IGNvdWxkbid0IGJlIHdyaXR0ZW4gKi8KICNkZWZpbmUgRVJST1JfSU9fREVWSUNFICAgICAgICAgICAgIDExMTcKICNkZWZpbmUgRVJST1JfUE9TU0lCTEVfREVBRExPQ0sgICAgIDExMzEKICNkZWZpbmUgRVJST1JfQkFEX0RFVklDRSAgICAgICAgICAgIDEyMDAKICNkZWZpbmUgRVJST1JfTk9fTkVUV09SSyAgICAgICAgICAgIDEyMjIKICNkZWZpbmUgRVJST1JfQUxSRUFEWV9JTklUSUFMSVpFRCAgIDEyNDcKKyNkZWZpbmUgRVJST1JfUFJJVklMRUdFX05PVF9IRUxEICAgIDEzMTQKICNkZWZpbmUgRVJST1JfQ09NTUlUTUVOVF9MSU1JVCAgICAgIDE0NTUKIAogLyogSFJFU1VMVCB2YWx1ZXMgZm9yIE9MRSwgU0hFTEwgYW5kIG90aGVyIEludGVyZmFjZSBzdHVmZiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS93aW5yZWcuaCBiL2luY2x1ZGUvd2lucmVnLmgKaW5kZXggZjU5NTRhZC4uNjZjOGZjNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS93aW5yZWcuaAorKysgYi9pbmNsdWRlL3dpbnJlZy5oCkBAIC02Miw2ICs2Miw5IEBACiAjZGVmaW5lIFJFR19DUkVBVEVEX05FV19LRVkJMHgwMDAwMDAwMQogI2RlZmluZSBSRUdfT1BFTkVEX0VYSVNUSU5HX0tFWQkweDAwMDAwMDAyCiAKKy8qIEZvciBSZWdOb3RpZnlDaGFuZ2VLZXlWYWx1ZSAqLworI2RlZmluZSBSRUdfTk9USUZZX0NIQU5HRV9OQU1FCTB4MQorCiAjZGVmaW5lIEtFWV9RVUVSWV9WQUxVRSAgICAgICAgIDB4MDAwMDAwMDEKICNkZWZpbmUgS0VZX1NFVF9WQUxVRSAgICAgICAgICAgMHgwMDAwMDAwMgogI2RlZmluZSBLRVlfQ1JFQVRFX1NVQl9LRVkgICAgICAweDAwMDAwMDA0CmRpZmYgLS1naXQgYS9pbmNsdWRlL3dpbnR5cGVzLmggYi9pbmNsdWRlL3dpbnR5cGVzLmgKaW5kZXggNjU1ZjdiMi4uYjQ4MDRiYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS93aW50eXBlcy5oCisrKyBiL2luY2x1ZGUvd2ludHlwZXMuaApAQCAtODgsNiArODgsNyBAQAogdHlwZWRlZiBVSU5UMTYgICAgICAgICAgV1BBUkFNMTY7CiB0eXBlZGVmIFVJTlQzMiAgICAgICAgICBXUEFSQU0zMjsKIHR5cGVkZWYgTE9ORyAgICAgICAgICAgIExQQVJBTTsKK3R5cGVkZWYgTE9ORyAgICAgICAgICAgIEhSRVNVTFQ7CiB0eXBlZGVmIExPTkcgICAgICAgICAgICBMUkVTVUxUOwogdHlwZWRlZiBXT1JEICAgICAgICAgICAgQVRPTTsKIHR5cGVkZWYgV09SRCAgICAgICAgICAgIENBVENIQlVGWzldOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS93bmV0LmggYi9pbmNsdWRlL3duZXQuaAppbmRleCA2ZjZiOTUxLi45ODk1YTY5IDEwMDY0NAotLS0gYS9pbmNsdWRlL3duZXQuaAorKysgYi9pbmNsdWRlL3duZXQuaApAQCAtMTA3LDYgKzEwNyw5IEBACiAjZGVmaW5lIFdOTkNfRVJSX0dldEVycm9yICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEKICNkZWZpbmUgV05OQ19FUlJfR2V0RXJyb3JUZXh0ICAgICAgICAgICAgICAgICAgIDB4MDAwMgogCisjZGVmaW5lIFdORFRfTk9STUFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgV05EVF9ORVRXT1JLICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MQorCiAjZGVmaW5lIFdJTjMwWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAKICNkZWZpbmUgV0lOMzFYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MQogI2RlZmluZSBXSU4zMTFYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyCmRpZmYgLS1naXQgYS9sb2FkZXIvbGlicmVzLmMgYi9sb2FkZXIvbGlicmVzLmMKaW5kZXggNWRhZmM4Zi4uZWI5NTk4YiAxMDA2NDQKLS0tIGEvbG9hZGVyL2xpYnJlcy5jCisrKyBiL2xvYWRlci9saWJyZXMuYwpAQCAtNzYsNyArNzYsNyBAQAogICAgIGZvcihSZXM9UmVzQmxvY2stPlJlc291cmNlczsgKlJlczsgUmVzKyspCiAgICAgICBpZihuYW1lKQogICAgICAgewotCWlmKCgqUmVzKS0+dHlwZT09dHlwZWlkICYmICFsc3RyY21waTMyVygoKlJlcyktPm5hbWUsbmFtZSkpCisJaWYoKCpSZXMpLT50eXBlPT10eXBlaWQgJiYgIWxzdHJjbXBpMzJXKChMUENXU1RSKSgqUmVzKS0+bmFtZSxuYW1lKSkKIAkgIHJldHVybiAoSFJTUkMzMikqUmVzOwogICAgICAgfQogICAgICAgZWxzZQpkaWZmIC0tZ2l0IGEvbG9hZGVyL21haW4uYyBiL2xvYWRlci9tYWluLmMKaW5kZXggNWFiMTFkYS4uNWIxZWFlYyAxMDA2NDQKLS0tIGEvbG9hZGVyL21haW4uYworKysgYi9sb2FkZXIvbWFpbi5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSAiYml0bWFwLmgiCiAjaW5jbHVkZSAiY29tbS5oIgogI2luY2x1ZGUgIndpbi5oIgorI2luY2x1ZGUgIm1haW4uaCIKICNpbmNsdWRlICJtZW51LmgiCiAjaW5jbHVkZSAiYXRvbS5oIgogI2luY2x1ZGUgImRpYWxvZy5oIgpkaWZmIC0tZ2l0IGEvbG9hZGVyL21vZHVsZS5jIGIvbG9hZGVyL21vZHVsZS5jCmluZGV4IDYzNTY4ZWUuLjE3ZjFiYjAgMTAwNjQ0Ci0tLSBhL2xvYWRlci9tb2R1bGUuYworKysgYi9sb2FkZXIvbW9kdWxlLmMKQEAgLTI1LDE4ICsyNSwxMSBAQAogI2luY2x1ZGUgInNlbGVjdG9ycy5oIgogI2luY2x1ZGUgInN0YWNrZnJhbWUuaCIKICNpbmNsdWRlICJ0YXNrLmgiCi0jaW5jbHVkZSAidG9vbGhlbHAuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogI2luY2x1ZGUgImNhbGxiYWNrLmgiCiAKIGV4dGVybiBCT09MMzIgVEhSRUFEX0luaXREb25lOwogCi1leHRlcm4gSE1PRFVMRTE2IGhGaXJzdE1vZHVsZTsgIC8qIEZJWE1FICovCi1zdGF0aWMgSE1PRFVMRTE2IGhDYWNoZWRNb2R1bGUgPSAwOyAgLyogTW9kdWxlIGNhY2hlZCBieSBNT0RVTEVfT3BlbkZpbGUgKi8KLQotc3RhdGljIEhNT0RVTEUzMiBNT0RVTEVfTG9hZE1vZHVsZShMUENTVFIgbmFtZSxCT09MMzIgZm9yY2UpIHsgcmV0dXJuIDA7IH0KLUhNT0RVTEUzMiAoKmZuQlVJTFRJTl9Mb2FkTW9kdWxlKShMUENTVFIgbmFtZSxCT09MMzIgZm9yY2UpID0gTU9EVUxFX0xvYWRNb2R1bGU7Ci0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCQlNT0RVTEUzMl9Mb29rdXBITU9EVUxFCkBAIC01OCwxMTYgKzUxLDYgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgTU9EVUxFX0dldFB0cjE2Ci0gKi8KLU5FX01PRFVMRSAqTU9EVUxFX0dldFB0cjE2KCBITU9EVUxFMTYgaE1vZHVsZSApCi17Ci0gICAgcmV0dXJuIChORV9NT0RVTEUqKUdsb2JhbExvY2sxNiggR2V0RXhlUHRyKGhNb2R1bGUpICk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgTU9EVUxFX0dldFB0cjMyCi0gKi8KLU5FX01PRFVMRSAqTU9EVUxFX0dldFB0cjMyKCBITU9EVUxFMzIgaE1vZHVsZSApCi17Ci0gICAgcmV0dXJuIChORV9NT0RVTEUqKUdsb2JhbExvY2sxNiggTU9EVUxFX0hBTkRMRXRvSE1PRFVMRTE2KGhNb2R1bGUpICk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIE1PRFVMRV9IQU5ETEV0b0hNT0RVTEUxNgotICovCi1ITU9EVUxFMTYKLU1PRFVMRV9IQU5ETEV0b0hNT0RVTEUxNihIQU5ETEUzMiBoYW5kbGUpIHsKLSAgICBORV9NT0RVTEUJKnBNb2R1bGU7Ci0KLSAgICBpZiAoSElXT1JEKGhhbmRsZSkpCi0gICAgewotICAgICAgICBXQVJOKG1vZHVsZSwibG9va2luZyB1cCAweCUwOHggaW4gd2luMTYgZnVuY3Rpb24hXG4iLGhhbmRsZSk7Ci0JLyogdGhpcyBpcyBhIEhNT0RVTEUzMiAqLwotCi0gICAgICAgIC8qIHdhbGsgdGhlIGxpc3QgbG9va2luZyBmb3IgdGhlIGNvcnJlY3Qgc3RhcnRhZGRyZXNzICovCi0gICAgCXBNb2R1bGUgPSAoTkVfTU9EVUxFICopR2xvYmFsTG9jazE2KCBoRmlyc3RNb2R1bGUgKTsKLQl3aGlsZSAocE1vZHVsZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHBNb2R1bGUtPm1vZHVsZTMyID09IGhhbmRsZSkgcmV0dXJuIHBNb2R1bGUtPnNlbGY7Ci0gICAgICAgICAgICBwTW9kdWxlID0gKE5FX01PRFVMRSopR2xvYmFsTG9jazE2KHBNb2R1bGUtPm5leHQpOwotCX0KLQlyZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIEdldEV4ZVB0cihoYW5kbGUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBNT0RVTEVfT3BlbkZpbGUKLSAqLwotaW50IE1PRFVMRV9PcGVuRmlsZSggSE1PRFVMRTMyIGhNb2R1bGUgKQotewotICAgIE5FX01PRFVMRSAqcE1vZHVsZTsKLSAgICBET1NfRlVMTF9OQU1FIGZ1bGxfbmFtZTsKLSAgICBjaGFyICpuYW1lOwotCi0gICAgc3RhdGljIGludCBjYWNoZWRmZCA9IC0xOwotCi0gICAgaE1vZHVsZSA9IE1PRFVMRV9IQU5ETEV0b0hNT0RVTEUxNihoTW9kdWxlKTsKLSAgICBUUkFDRShtb2R1bGUsICIoJTA0eCkgY2FjaGU6IG1vZD0lMDR4IGZkPSVkXG4iLAotICAgICAgICAgICAgICAgICAgICBoTW9kdWxlLCBoQ2FjaGVkTW9kdWxlLCBjYWNoZWRmZCApOwotICAgIGlmICghKHBNb2R1bGUgPSBNT0RVTEVfR2V0UHRyMzIoIGhNb2R1bGUgKSkpIHJldHVybiAtMTsKLSAgICBpZiAoaENhY2hlZE1vZHVsZSA9PSBoTW9kdWxlKSByZXR1cm4gY2FjaGVkZmQ7Ci0gICAgY2xvc2UoIGNhY2hlZGZkICk7Ci0gICAgaENhY2hlZE1vZHVsZSA9IGhNb2R1bGU7Ci0gICAgbmFtZSA9IE5FX01PRFVMRV9OQU1FKCBwTW9kdWxlICk7Ci0gICAgaWYgKCFET1NGU19HZXRGdWxsTmFtZSggbmFtZSwgVFJVRSwgJmZ1bGxfbmFtZSApIHx8Ci0gICAgICAgIChjYWNoZWRmZCA9IG9wZW4oIGZ1bGxfbmFtZS5sb25nX25hbWUsIE9fUkRPTkxZICkpID09IC0xKQotICAgICAgICBXQVJOKCBtb2R1bGUsICJDYW4ndCBvcGVuIGZpbGUgJyVzJyBmb3IgbW9kdWxlICUwNHhcbiIsCi0gICAgICAgICAgICAgICAgIG5hbWUsIGhNb2R1bGUgKTsKLSAgICBUUkFDRShtb2R1bGUsICJvcGVuZWQgJyVzJyAtPiAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgbmFtZSwgY2FjaGVkZmQgKTsKLSAgICByZXR1cm4gY2FjaGVkZmQ7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgTU9EVUxFX0NyZWF0ZUluc3RhbmNlCi0gKgotICogSWYgbGliX29ubHkgaXMgVFJVRSwgaGFuZGxlIHRoZSBtb2R1bGUgbGlrZSBhIGxpYnJhcnkgZXZlbiBpZiBpdCBpcyBhIC5FWEUKLSAqLwotSElOU1RBTkNFMTYgTU9EVUxFX0NyZWF0ZUluc3RhbmNlKCBITU9EVUxFMTYgaE1vZHVsZSwgSElOU1RBTkNFMTYgKnByZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wzMiBsaWJfb25seSApCi17Ci0gICAgU0VHVEFCTEVFTlRSWSAqcFNlZ21lbnQ7Ci0gICAgTkVfTU9EVUxFICpwTW9kdWxlOwotICAgIGludCBtaW5zaXplOwotICAgIEhJTlNUQU5DRTE2IGhOZXdJbnN0YW5jZTsKLQotICAgIGlmICghKHBNb2R1bGUgPSBNT0RVTEVfR2V0UHRyMTYoIGhNb2R1bGUgKSkpIHJldHVybiAwOwotICAgIGlmIChwTW9kdWxlLT5kZ3JvdXAgPT0gMCkKLSAgICB7Ci0gICAgICAgIGlmIChwcmV2KSAqcHJldiA9IGhNb2R1bGU7Ci0gICAgICAgIHJldHVybiBoTW9kdWxlOwotICAgIH0KLQotICAgIHBTZWdtZW50ID0gTkVfU0VHX1RBQkxFKCBwTW9kdWxlICkgKyBwTW9kdWxlLT5kZ3JvdXAgLSAxOwotICAgIGlmIChwcmV2KSAqcHJldiA9IHBTZWdtZW50LT5zZWxlY3RvcjsKLQotICAgICAgLyogaWYgaXQncyBhIGxpYnJhcnksIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvbmx5IHRoZSBmaXJzdCB0aW1lICovCi0gICAgaWYgKHBTZWdtZW50LT5zZWxlY3RvcikKLSAgICB7Ci0gICAgICAgIGlmIChwTW9kdWxlLT5mbGFncyAmIE5FX0ZGTEFHU19MSUJNT0RVTEUpIHJldHVybiBwU2VnbWVudC0+c2VsZWN0b3I7Ci0gICAgICAgIGlmIChsaWJfb25seSkgcmV0dXJuIHBTZWdtZW50LT5zZWxlY3RvcjsKLSAgICB9Ci0KLSAgICBtaW5zaXplID0gcFNlZ21lbnQtPm1pbnNpemUgPyBwU2VnbWVudC0+bWluc2l6ZSA6IDB4MTAwMDA7Ci0gICAgaWYgKHBNb2R1bGUtPnNzID09IHBNb2R1bGUtPmRncm91cCkgbWluc2l6ZSArPSBwTW9kdWxlLT5zdGFja19zaXplOwotICAgIG1pbnNpemUgKz0gcE1vZHVsZS0+aGVhcF9zaXplOwotICAgIGhOZXdJbnN0YW5jZSA9IEdMT0JBTF9BbGxvYyggR01FTV9aRVJPSU5JVCB8IEdNRU1fRklYRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5zaXplLCBoTW9kdWxlLCBGQUxTRSwgRkFMU0UsIEZBTFNFICk7Ci0gICAgaWYgKCFoTmV3SW5zdGFuY2UpIHJldHVybiAwOwotICAgIHBTZWdtZW50LT5zZWxlY3RvciA9IGhOZXdJbnN0YW5jZTsKLSAgICByZXR1cm4gaE5ld0luc3RhbmNlOwotfQotCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIE1PRFVMRV9DcmVhdGVEdW1teU1vZHVsZQpAQCAtMzEyLDYzICsxOTUsNiBAQAogfQogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIE1PRFVMRV9HZXRNb2R1bGVOYW1lCi0gKi8KLUxQU1RSIE1PRFVMRV9HZXRNb2R1bGVOYW1lKCBITU9EVUxFMzIgaE1vZHVsZSApCi17Ci0gICAgTkVfTU9EVUxFICpwTW9kdWxlOwotICAgIEJZVEUgKnAsIGxlbjsKLSAgICBzdGF0aWMgY2hhciBidWZmZXJbMTBdOwotCi0gICAgaWYgKCEocE1vZHVsZSA9IE1PRFVMRV9HZXRQdHIzMiggaE1vZHVsZSApKSkgcmV0dXJuIE5VTEw7Ci0gICAgcCA9IChCWVRFICopcE1vZHVsZSArIHBNb2R1bGUtPm5hbWVfdGFibGU7Ci0gICAgbGVuID0gTUlOKCAqcCwgOCApOwotICAgIG1lbWNweSggYnVmZmVyLCBwICsgMSwgbGVuICk7Ci0gICAgYnVmZmVyW2xlbl0gPSAnXDAnOwotICAgIHJldHVybiBidWZmZXI7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCSAgICBNT0RVTEVfRmluZE1vZHVsZQotICoKLSAqIEZpbmQgYSBtb2R1bGUgZnJvbSBhIHBhdGggbmFtZS4KLSAqIFJFVFVSTlMKLSAqCXRoZSB3aW4xNiBtb2R1bGUgaGFuZGxlIGlmIGZvdW5kCi0gKiAJMCBpZiBub3QKLSAqLwotSE1PRFVMRTMyIE1PRFVMRV9GaW5kTW9kdWxlMTYoCi0JTFBDU1RSIHBhdGgJLyogW2luXSBwYXRoIG9mIHRoZSBtb2R1bGUgdG8gYmUgZm91bmQgKi8KLSkgewotICAgIEhNT0RVTEUzMiBoTW9kdWxlID0gaEZpcnN0TW9kdWxlOwotICAgIExQQ1NUUglmaWxlbmFtZSwgZG90cHRyLCBtb2R1bGVwYXRoLCBtb2R1bGVuYW1lOwotICAgIEJZVEUJbGVuLCAqbmFtZV90YWJsZTsKLQotICAgIGlmICghKGZpbGVuYW1lID0gc3RycmNociggcGF0aCwgJ1xcJyApKSkgZmlsZW5hbWUgPSBwYXRoOwotICAgIGVsc2UgZmlsZW5hbWUrKzsKLSAgICBpZiAoKGRvdHB0ciA9IHN0cnJjaHIoIGZpbGVuYW1lLCAnLicgKSkgIT0gTlVMTCkKLSAgICAgICAgbGVuID0gKEJZVEUpKGRvdHB0ciAtIGZpbGVuYW1lKTsKLSAgICBlbHNlIGxlbiA9IHN0cmxlbiggZmlsZW5hbWUgKTsKLQotICAgIHdoaWxlKGhNb2R1bGUpCi0gICAgewotICAgICAgICBORV9NT0RVTEUgKnBNb2R1bGUgPSBNT0RVTEVfR2V0UHRyMTYoIGhNb2R1bGUgKTsKLSAgICAgICAgaWYgKCFwTW9kdWxlKSBicmVhazsKLSAgICAgICAgbW9kdWxlcGF0aCA9IE5FX01PRFVMRV9OQU1FKHBNb2R1bGUpOwotICAgICAgICBpZiAoIShtb2R1bGVuYW1lID0gc3RycmNociggbW9kdWxlcGF0aCwgJ1xcJyApKSkKLSAgICAgICAgICAgIG1vZHVsZW5hbWUgPSBtb2R1bGVwYXRoOwotICAgICAgICBlbHNlIG1vZHVsZW5hbWUrKzsKLSAgICAgICAgaWYgKCFsc3RyY21waTMyQSggbW9kdWxlbmFtZSwgZmlsZW5hbWUgKSkgcmV0dXJuIGhNb2R1bGU7Ci0KLSAgICAgICAgbmFtZV90YWJsZSA9IChCWVRFICopcE1vZHVsZSArIHBNb2R1bGUtPm5hbWVfdGFibGU7Ci0gICAgICAgIGlmICgoKm5hbWVfdGFibGUgPT0gbGVuKSAmJiAhbHN0cm5jbXBpMzJBKGZpbGVuYW1lLCBuYW1lX3RhYmxlKzEsIGxlbikpCi0gICAgICAgICAgICByZXR1cm4gaE1vZHVsZTsKLSAgICAgICAgaE1vZHVsZSA9IHBNb2R1bGUtPm5leHQ7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJICAgIE1PRFVMRV9GaW5kTW9kdWxlMzIKICAqCkBAIC00MjcsMTA1ICsyNTMsNiBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkgICAgTU9EVUxFX0NhbGxXRVAKLSAqCi0gKiBDYWxsIGEgRExMJ3MgV0VQLCBhbGxvd2luZyBpdCB0byBzaHV0IGRvd24uCi0gKiBGSVhNRTogd2UgYWx3YXlzIHBhc3MgdGhlIFdFUCBXRVBfRlJFRV9ETEwsIG5ldmVyIFdFUF9TWVNURU1fRVhJVAotICovCi1zdGF0aWMgQk9PTDE2IE1PRFVMRV9DYWxsV0VQKCBITU9EVUxFMTYgaE1vZHVsZSApCi17Ci0gICAgRkFSUFJPQzE2IFdFUCA9IChGQVJQUk9DMTYpMDsKLSAgICBXT1JEIG9yZGluYWwgPSBORV9HZXRPcmRpbmFsKCBoTW9kdWxlLCAiV0VQIiApOwotCi0gICAgaWYgKG9yZGluYWwpIFdFUCA9IE5FX0dldEVudHJ5UG9pbnQoIGhNb2R1bGUsIG9yZGluYWwgKTsKLSAgICBpZiAoIVdFUCkKLSAgICB7Ci0JV0FSTihtb2R1bGUsICJtb2R1bGUgJTA0eCBkb2Vzbid0IGhhdmUgYSBXRVBcbiIsIGhNb2R1bGUgKTsKLQlyZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHJldHVybiBDYWxsYmFja3MtPkNhbGxXaW5kb3dzRXhpdFByb2MoIFdFUCwgV0VQX0ZSRUVfRExMICk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCSAgICBNT0RVTEVfRnJlZU1vZHVsZQotICoKLSAqIFJlbW92ZSBhIG1vZHVsZSBmcm9tIG1lbW9yeS4KLSAqLwotQk9PTDE2IE1PRFVMRV9GcmVlTW9kdWxlKCBITU9EVUxFMzIgaE1vZHVsZSwgVERCKiBwVGFza0NvbnRleHQgKQotewotICAgIEhNT0RVTEUxNiAqaFByZXZNb2R1bGU7Ci0gICAgTkVfTU9EVUxFICpwTW9kdWxlOwotICAgIFNFR1RBQkxFRU5UUlkgKnBTZWdtZW50OwotICAgIEhNT0RVTEUxNiAqcE1vZFJlZjsKLSAgICBpbnQgaTsKLQotICAgIGlmICghKHBNb2R1bGUgPSBNT0RVTEVfR2V0UHRyMzIoIGhNb2R1bGUgKSkpIHJldHVybiBGQUxTRTsKLSAgICBoTW9kdWxlID0gcE1vZHVsZS0+c2VsZjsKLQotICAgIGlmICgoKElOVDE2KSgtLXBNb2R1bGUtPmNvdW50KSkgPiAwICkgcmV0dXJuIFRSVUU7Ci0gICAgZWxzZSBwTW9kdWxlLT5jb3VudCA9IDA7Ci0KLSAgICBpZiAocE1vZHVsZS0+ZmxhZ3MgJiBORV9GRkxBR1NfQlVJTFRJTikKLSAgICAgICAgcmV0dXJuIEZBTFNFOyAgLyogQ2FuJ3QgZnJlZSBidWlsdC1pbiBtb2R1bGUgKi8KLQotICAgIGlmIChwTW9kdWxlLT5mbGFncyAmIE5FX0ZGTEFHU19MSUJNT0RVTEUpIAotICAgIHsKLQlNT0RVTEVfQ2FsbFdFUCggaE1vZHVsZSApOwotCi0JLyogRnJlZSB0aGUgb2JqZWN0cyBvd25lZCBieSB0aGUgRExMIG1vZHVsZSAqLwotCi0JaWYoIHBUYXNrQ29udGV4dCAmJiBwVGFza0NvbnRleHQtPnVzZXJoYW5kbGVyICkKLQl7Ci0gICAgICAgICAgICBwVGFza0NvbnRleHQtPnVzZXJoYW5kbGVyKCBoTW9kdWxlLCBVU0lHX0RMTF9VTkxPQUQsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGFza0NvbnRleHQtPmhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUYXNrQ29udGV4dC0+aFF1ZXVlICk7Ci0JfQotICAgIH0KLSAgICAvKiBDbGVhciBtYWdpYyBudW1iZXIganVzdCBpbiBjYXNlICovCi0KLSAgICBwTW9kdWxlLT5tYWdpYyA9IHBNb2R1bGUtPnNlbGYgPSAwOwotCi0gICAgICAvKiBSZW1vdmUgaXQgZnJvbSB0aGUgbGlua2VkIGxpc3QgKi8KLQotICAgIGhQcmV2TW9kdWxlID0gJmhGaXJzdE1vZHVsZTsKLSAgICB3aGlsZSAoKmhQcmV2TW9kdWxlICYmICgqaFByZXZNb2R1bGUgIT0gaE1vZHVsZSkpCi0gICAgewotICAgICAgICBoUHJldk1vZHVsZSA9ICYoTU9EVUxFX0dldFB0cjE2KCAqaFByZXZNb2R1bGUgKSktPm5leHQ7Ci0gICAgfQotICAgIGlmICgqaFByZXZNb2R1bGUpICpoUHJldk1vZHVsZSA9IHBNb2R1bGUtPm5leHQ7Ci0KLSAgICAgIC8qIEZyZWUgYWxsIHRoZSBzZWdtZW50cyAqLwotCi0gICAgcFNlZ21lbnQgPSBORV9TRUdfVEFCTEUoIHBNb2R1bGUgKTsKLSAgICBmb3IgKGkgPSAxOyBpIDw9IHBNb2R1bGUtPnNlZ19jb3VudDsgaSsrLCBwU2VnbWVudCsrKQotICAgIHsKLSAgICAgICAgR2xvYmFsRnJlZTE2KCBwU2VnbWVudC0+c2VsZWN0b3IgKTsKLSAgICB9Ci0KLSAgICAgIC8qIEZyZWUgdGhlIHJlZmVyZW5jZWQgbW9kdWxlcyAqLwotCi0gICAgcE1vZFJlZiA9IChITU9EVUxFMTYqKU5FX01PRFVMRV9UQUJMRSggcE1vZHVsZSApOwotICAgIGZvciAoaSA9IDA7IGkgPCBwTW9kdWxlLT5tb2RyZWZfY291bnQ7IGkrKywgcE1vZFJlZisrKQotICAgIHsKLSAgICAgICAgRnJlZU1vZHVsZTE2KCAqcE1vZFJlZiApOwotICAgIH0KLQotICAgICAgLyogRnJlZSB0aGUgbW9kdWxlIHN0b3JhZ2UgKi8KLQotICAgIGlmIChwTW9kdWxlLT5ucm5hbWVfaGFuZGxlKSBHbG9iYWxGcmVlMTYoIHBNb2R1bGUtPm5ybmFtZV9oYW5kbGUgKTsKLSAgICBpZiAocE1vZHVsZS0+ZGxsc190b19pbml0KSBHbG9iYWxGcmVlMTYoIHBNb2R1bGUtPmRsbHNfdG9faW5pdCApOwotICAgIEdsb2JhbEZyZWUxNiggaE1vZHVsZSApOwotCi0gICAgICAvKiBSZW1vdmUgbW9kdWxlIGZyb20gY2FjaGUgKi8KLQotICAgIGlmIChoQ2FjaGVkTW9kdWxlID09IGhNb2R1bGUpIGhDYWNoZWRNb2R1bGUgPSAwOwotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCSAgICBNT0RVTEVfTG9hZAogICoKICAqIEltcGxlbWVudGF0aW9uIG9mIExvYWRNb2R1bGUoKS4KQEAgLTUzNCw3NCArMjYxLDM0IEBACiAgKiB3aXRob3V0IGEgcHJlY2VkaW5nIGxlbmd0aCBieXRlKS4KICAqIElmIGNtZF9saW5lIGlzIE5VTEwsIHRoZSBtb2R1bGUgaXMgbG9hZGVkIGFzIGEgbGlicmFyeSBldmVuIGlmIGl0IGlzIGEgLmV4ZQogICovCi1ISU5TVEFOQ0UxNiBNT0RVTEVfTG9hZCggTFBDU1RSIG5hbWUsIFVJTlQxNiB1RmxhZ3MsCitISU5TVEFOQ0UxNiBNT0RVTEVfTG9hZCggTFBDU1RSIG5hbWUsIEJPT0wzMiBpbXBsaWNpdCwKICAgICAgICAgICAgICAgICAgICAgICAgICBMUENTVFIgY21kX2xpbmUsIExQQ1NUUiBlbnYsIFVJTlQzMiBzaG93X2NtZCApCiB7Ci0gICAgSE1PRFVMRTMyIGhNb2R1bGU7CisgICAgSE1PRFVMRTE2IGhNb2R1bGU7CiAgICAgSElOU1RBTkNFMTYgaEluc3RhbmNlLCBoUHJldkluc3RhbmNlOwogICAgIE5FX01PRFVMRSAqcE1vZHVsZTsKLSAgICBPRlNUUlVDVCBvZnM7Ci0gICAgSEZJTEUzMiBoRmlsZTsKIAogICAgIGlmIChfX3dpbmVsaWIpCiAgICAgeworICAgICAgICBPRlNUUlVDVCBvZnM7CiAgICAgICAgIGxzdHJjcHluMzJBKCBvZnMuc3pQYXRoTmFtZSwgbmFtZSwgc2l6ZW9mKG9mcy5zelBhdGhOYW1lKSApOwogICAgICAgICBpZiAoKGhNb2R1bGUgPSBNT0RVTEVfQ3JlYXRlRHVtbXlNb2R1bGUoICZvZnMgKSkgPCAzMikgcmV0dXJuIGhNb2R1bGU7CiAgICAgICAgIHBNb2R1bGUgPSAoTkVfTU9EVUxFICopR2xvYmFsTG9jazE2KCBoTW9kdWxlICk7Ci0gICAgICAgIGhJbnN0YW5jZSA9IE1PRFVMRV9DcmVhdGVJbnN0YW5jZSggaE1vZHVsZSwgJmhQcmV2SW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNtZF9saW5lID09IE5VTEwpICk7CisgICAgICAgIGhJbnN0YW5jZSA9IE5FX0NyZWF0ZUluc3RhbmNlKCBwTW9kdWxlLCAmaFByZXZJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbWRfbGluZSA9PSBOVUxMKSApOwogICAgIH0KICAgICBlbHNlCiAgICAgewotICAgICAgICBoTW9kdWxlID0gTU9EVUxFX0ZpbmRNb2R1bGUxNiggbmFtZSApOwotCi0gICAgICAgIGlmICghaE1vZHVsZSkgIC8qIFdlIGhhdmUgdG8gbG9hZCB0aGUgbW9kdWxlICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFRyeSB0byBsb2FkIHRoZSBidWlsdC1pbiBmaXJzdCBpZiBub3QgZGlzYWJsZWQgKi8KLSAgICAgICAgICAgIGlmICgoaE1vZHVsZSA9IGZuQlVJTFRJTl9Mb2FkTW9kdWxlKCBuYW1lLCBGQUxTRSApKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gTU9EVUxFX0hBTkRMRXRvSE1PRFVMRTE2KCBoTW9kdWxlICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICgoaEZpbGUgPSBPcGVuRmlsZTMyKCBuYW1lLCAmb2ZzLCBPRl9SRUFEICkpID09IEhGSUxFX0VSUk9SMzIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogTm93IHRyeSB0aGUgYnVpbHQtaW4gZXZlbiBpZiBkaXNhYmxlZCAqLwotICAgICAgICAgICAgICAgIGlmICgoaE1vZHVsZSA9IGZuQlVJTFRJTl9Mb2FkTW9kdWxlKCBuYW1lLCBUUlVFICkpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgV0FSTihtb2R1bGUsICJDb3VsZCBub3QgbG9hZCBXaW5kb3dzIERMTCAnJXMnLCB1c2luZyBidWlsdC1pbiBtb2R1bGUuXG4iLCBuYW1lICk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNT0RVTEVfSEFORExFdG9ITU9EVUxFMTYoIGhNb2R1bGUgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDI7ICAvKiBGaWxlIG5vdCBmb3VuZCAqLwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBDcmVhdGUgdGhlIG1vZHVsZSBzdHJ1Y3R1cmUgKi8KLQotICAgICAgICAgICAgaE1vZHVsZSA9IE5FX0xvYWRNb2R1bGUoIGhGaWxlLCAmb2ZzLCB1RmxhZ3MsIGNtZF9saW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudiwgc2hvd19jbWQgKTsKLSAgICAgICAgICAgIGlmIChoTW9kdWxlIDwgMzIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKChoTW9kdWxlID09IDIxKSAmJiBjbWRfbGluZSkKLSAgICAgICAgICAgICAgICAgICAgaE1vZHVsZSA9IFBFX0xvYWRNb2R1bGUoIGhGaWxlLCAmb2ZzLCBjbWRfbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudiwgc2hvd19jbWQgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGhNb2R1bGUgPCAzMikKLSAgICAgICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJMb2FkTW9kdWxlOiBjYW4ndCBsb2FkICclcycsIGVycm9yPSVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIGhNb2R1bGUgKTsKLSAgICAgICAgICAgIF9sY2xvc2UzMiggaEZpbGUgKTsKLSAgICAgICAgICAgIHJldHVybiBoTW9kdWxlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgLyogbW9kdWxlIGlzIGFscmVhZHkgbG9hZGVkLCBqdXN0IGNyZWF0ZSBhIG5ldyBkYXRhIHNlZ21lbnQgaWYgaXQncyBhIHRhc2sgKi8KLSAgICAgICAgewotICAgICAgICAgICAgcE1vZHVsZSA9IE1PRFVMRV9HZXRQdHIzMiggaE1vZHVsZSApOwotICAgICAgICAgICAgaEluc3RhbmNlID0gTU9EVUxFX0NyZWF0ZUluc3RhbmNlKCBoTW9kdWxlLCAmaFByZXZJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNtZF9saW5lID09IE5VTEwpICk7Ci0gICAgICAgICAgICBpZiAoaEluc3RhbmNlICE9IGhQcmV2SW5zdGFuY2UpICAvKiBub3QgYSBsaWJyYXJ5ICovCi0gICAgICAgICAgICAgICAgTkVfTG9hZFNlZ21lbnQoIHBNb2R1bGUsIHBNb2R1bGUtPmRncm91cCApOwotICAgICAgICAgICAgcE1vZHVsZS0+Y291bnQrKzsKLSAgICAgICAgfQotICAgIH0gLyogIXdpbmVsaWIgKi8KKyAgICAgICAgaEluc3RhbmNlID0gTkVfTG9hZE1vZHVsZSggbmFtZSwgJmhQcmV2SW5zdGFuY2UsIGltcGxpY2l0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNtZF9saW5lID09IE5VTEwpICk7CisgICAgICAgIGlmICgoaEluc3RhbmNlID09IDIxKSAmJiBjbWRfbGluZSkKKyAgICAgICAgICAgIHJldHVybiBQRV9Mb2FkTW9kdWxlKCBuYW1lLCBjbWRfbGluZSwgZW52LCBzaG93X2NtZCApOworICAgIH0KIAogICAgIC8qIENyZWF0ZSBhIHRhc2sgZm9yIHRoaXMgaW5zdGFuY2UgKi8KIAorICAgIGlmIChoSW5zdGFuY2UgPCAzMikgcmV0dXJuIGhJbnN0YW5jZTsKKyAgICBwTW9kdWxlID0gTkVfR2V0UHRyKCBoSW5zdGFuY2UgKTsKICAgICBpZiAoY21kX2xpbmUgJiYgIShwTW9kdWxlLT5mbGFncyAmIE5FX0ZGTEFHU19MSUJNT0RVTEUpKQogICAgIHsKICAgICAgICAgUERCMzIgKnBkYjsKQEAgLTYyMiw5ICszMDksOCBAQAogICovCiBISU5TVEFOQ0UxNiBMb2FkTW9kdWxlMTYoIExQQ1NUUiBuYW1lLCBMUFZPSUQgcGFyYW1CbG9jayApCiB7Ci0gICAgTE9BRFBBUkFNUyAqcGFyYW1zID0gKExPQURQQVJBTVMgKilwYXJhbUJsb2NrOwotICAgIExQU1RSIGNtZF9saW5lID0gKExQU1RSKVBUUl9TRUdfVE9fTElOKCBwYXJhbXMtPmNtZExpbmUgKTsKLSAgICBMUFNUUiBuZXdfY21kX2xpbmU7CisgICAgTE9BRFBBUkFNUyAqcGFyYW1zOworICAgIExQU1RSIGNtZF9saW5lLCBuZXdfY21kX2xpbmU7CiAgICAgVUlOVDE2IHNob3dfY21kID0gMDsKICAgICBMUENWT0lEIGVudiA9IE5VTEw7CiAgICAgSElOU1RBTkNFMTYgaEluc3RhbmNlOwpAQCAtNjQ5LDcgKzMzNSw3IEBACiAgICAgc3RyY2F0KCBuZXdfY21kX2xpbmUsIGNtZF9saW5lICk7CiAKICAgICBpZiAocGFyYW1zLT5oRW52aXJvbm1lbnQpIGVudiA9IEdsb2JhbExvY2sxNiggcGFyYW1zLT5oRW52aXJvbm1lbnQgKTsKLSAgICBoSW5zdGFuY2UgPSBNT0RVTEVfTG9hZCggbmFtZSwgMCwgbmV3X2NtZF9saW5lLCBlbnYsIHNob3dfY21kICk7CisgICAgaEluc3RhbmNlID0gTU9EVUxFX0xvYWQoIG5hbWUsIEZBTFNFLCBuZXdfY21kX2xpbmUsIGVudiwgc2hvd19jbWQgKTsKICAgICBpZiAocGFyYW1zLT5oRW52aXJvbm1lbnQpIEdsb2JhbFVubG9jazE2KCBwYXJhbXMtPmhFbnZpcm9ubWVudCApOwogICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBuZXdfY21kX2xpbmUgKTsKICAgICByZXR1cm4gaEluc3RhbmNlOwpAQCAtNjgyLDQxICszNjgsMTIgQEAKICAgQ2xvc2VIYW5kbGUzMihwaS5oVGhyZWFkKTsgCiAKICNlbHNlCi0gIHJldHVybiBNT0RVTEVfTG9hZCggbmFtZSwgMCwgcGFyYW1zLT5scENtZExpbmUsIHBhcmFtcy0+bHBFbnZBZGRyZXNzLCAKKyAgcmV0dXJuIE1PRFVMRV9Mb2FkKCBuYW1lLCBGQUxTRSwgcGFyYW1zLT5scENtZExpbmUsIHBhcmFtcy0+bHBFbnZBZGRyZXNzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICooKFVJTlQxNiAqKXBhcmFtcy0+bHBDbWRTaG93ICsgMSkgKTsKICNlbmRpZgogfQogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkgICAgRnJlZU1vZHVsZTE2ICAgIChLRVJORUwuNDYpCi0gKi8KLUJPT0wxNiBXSU5BUEkgRnJlZU1vZHVsZTE2KCBITU9EVUxFMTYgaE1vZHVsZSApCi17Ci0gICAgTkVfTU9EVUxFICpwTW9kdWxlOwotCi0gICAgaWYgKCEocE1vZHVsZSA9IE1PRFVMRV9HZXRQdHIxNiggaE1vZHVsZSApKSkgcmV0dXJuIEZBTFNFOwotICAgIFRSQUNFKG1vZHVsZSwgIiVzIGNvdW50ICVkXG4iLCAKLQkJICAgIE1PRFVMRV9HZXRNb2R1bGVOYW1lKGhNb2R1bGUpLCBwTW9kdWxlLT5jb3VudCApOwotCi0gICAgcmV0dXJuIE1PRFVMRV9GcmVlTW9kdWxlKCBoTW9kdWxlLCBHbG9iYWxMb2NrMTYoR2V0Q3VycmVudFRhc2soKSkgKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJICAgIEdldE1vZHVsZUhhbmRsZTE2ICAgIChLRVJORUwuNDcpCi0gKi8KLUhNT0RVTEUxNiBXSU5BUEkgV0lOMTZfR2V0TW9kdWxlSGFuZGxlKCBTRUdQVFIgbmFtZSApCi17Ci0gICAgaWYgKEhJV09SRChuYW1lKSA9PSAwKSByZXR1cm4gR2V0RXhlUHRyKCAoSElOU1RBTkNFMTYpbmFtZSApOwotICAgIHJldHVybiBNT0RVTEVfRmluZE1vZHVsZTE2KCBQVFJfU0VHX1RPX0xJTihuYW1lKSApOwotfQotCi1ITU9EVUxFMTYgV0lOQVBJIEdldE1vZHVsZUhhbmRsZTE2KCBMUENTVFIgbmFtZSApCi17Ci0gICAgcmV0dXJuIE1PRFVMRV9GaW5kTW9kdWxlMTYoIG5hbWUgKTsKLX0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgICAgR2V0TW9kdWxlSGFuZGxlICAgICAgICAgKEtFUk5FTDMyLjIzNykKICAqLwpAQCAtNzQwLDUyICszOTcsMjMgQEAKIH0KIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJICAgIEdldE1vZHVsZVVzYWdlICAgIChLRVJORUwuNDgpCi0gKi8KLUlOVDE2IFdJTkFQSSBHZXRNb2R1bGVVc2FnZSggSElOU1RBTkNFMTYgaE1vZHVsZSApCi17Ci0gICAgTkVfTU9EVUxFICpwTW9kdWxlOwotCi0gICAgaWYgKCEocE1vZHVsZSA9IE1PRFVMRV9HZXRQdHIxNiggaE1vZHVsZSApKSkgcmV0dXJuIDA7Ci0gICAgVFJBQ0UobW9kdWxlLCAiKCUwNHgpOiByZXR1cm5pbmcgJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgIGhNb2R1bGUsIHBNb2R1bGUtPmNvdW50ICk7Ci0gICAgcmV0dXJuIHBNb2R1bGUtPmNvdW50OwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkgICAgR2V0TW9kdWxlRmlsZU5hbWUxNiAgICAoS0VSTkVMLjQ5KQotICovCi1JTlQxNiBXSU5BUEkgR2V0TW9kdWxlRmlsZU5hbWUxNiggSElOU1RBTkNFMTYgaE1vZHVsZSwgTFBTVFIgbHBGaWxlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQxNiBuU2l6ZSApCi17Ci0gICAgTkVfTU9EVUxFICpwTW9kdWxlOwotCi0gICAgaWYgKCFoTW9kdWxlKSBoTW9kdWxlID0gR2V0Q3VycmVudFRhc2soKTsKLSAgICBpZiAoIShwTW9kdWxlID0gTU9EVUxFX0dldFB0cjE2KCBoTW9kdWxlICkpKSByZXR1cm4gMDsKLSAgICBsc3RyY3B5bjMyQSggbHBGaWxlTmFtZSwgTkVfTU9EVUxFX05BTUUocE1vZHVsZSksIG5TaXplICk7Ci0gICAgVFJBQ0UobW9kdWxlLCAiJXNcbiIsIGxwRmlsZU5hbWUgKTsKLSAgICByZXR1cm4gc3RybGVuKGxwRmlsZU5hbWUpOwotfQotCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgICAgIEdldE1vZHVsZUZpbGVOYW1lMzJBICAgICAgKEtFUk5FTDMyLjIzNSkKLSAqIEZJWE1FIEZJWE1FCiAgKi8KLURXT1JEIFdJTkFQSSBHZXRNb2R1bGVGaWxlTmFtZTMyQSggSE1PRFVMRTMyIGhNb2R1bGUsIExQU1RSIGxwRmlsZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIHNpemUgKQoteyAgICAgICAgICAgICAgICAgICAKLSAgICBORV9NT0RVTEUgKnBNb2R1bGU7Ci0gICAgICAgICAgIAotICAgIGlmICghaE1vZHVsZSkKLSAgICB7Ci0gICAgICAgIFREQiAqcFRhc2sgPSAoVERCICopR2xvYmFsTG9jazE2KCBHZXRDdXJyZW50VGFzaygpICk7Ci0gICAgICAgIGhNb2R1bGUgPSBwVGFzay0+aEluc3RhbmNlOwotICAgIH0KLSAgICBpZiAoIShwTW9kdWxlID0gTU9EVUxFX0dldFB0cjMyKCBoTW9kdWxlICkpKSByZXR1cm4gMDsKLSAgICBsc3RyY3B5bjMyQSggbHBGaWxlTmFtZSwgTkVfTU9EVUxFX05BTUUocE1vZHVsZSksIHNpemUgKTsKK0RXT1JEIFdJTkFQSSBHZXRNb2R1bGVGaWxlTmFtZTMyQSggCisJSE1PRFVMRTMyIGhNb2R1bGUsCS8qIFtpbl0gbW9kdWxlIGhhbmRsZSAoMzJiaXQpICovCisJTFBTVFIgbHBGaWxlTmFtZSwJLyogW291dF0gZmlsZW5hbWVidWZmZXIgKi8KKyAgICAgICAgRFdPUkQgc2l6ZQkJLyogW2luXSBzaXplIG9mIGZpbGVuYW1lYnVmZmVyICovCispIHsgICAgICAgICAgICAgICAgICAgCisgICAgV0lORV9NT0RSRUYgKndtID0gTU9EVUxFMzJfTG9va3VwSE1PRFVMRShQUk9DRVNTX0N1cnJlbnQoKSxoTW9kdWxlKTsKKworICAgIGlmICghd20pIC8qIGNhbiBoYXBwZW4gb24gc3RhcnQgdXAgb3IgdGhlIGxpa2UgKi8KKyAgICAJcmV0dXJuIDA7CisKKyAgICAvKiBGSVhNRTogd2Ugc2hvdWxkIHByb2JhYmx5IGdldCBhIHJlYWwgbG9uZyBuYW1lLCBidXQgd20tPmxvbmduYW1lCisgICAgICogaXMgY3VycmVudGx5IGEgVU5JWCBmaWxlbmFtZSEKKyAgICAgKi8KKyAgICBsc3RyY3B5bjMyQSggbHBGaWxlTmFtZSwgd20tPnNob3J0bmFtZSwgc2l6ZSApOwogICAgIFRSQUNFKG1vZHVsZSwgIiVzXG4iLCBscEZpbGVOYW1lICk7CiAgICAgcmV0dXJuIHN0cmxlbihscEZpbGVOYW1lKTsKIH0gICAgICAgICAgICAgICAgICAgCkBAIC04MDUsMTkgKzQzMyw2IEBACiB9CiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCSAgICBHZXRNb2R1bGVOYW1lICAgIChLRVJORUwuMjcpCi0gKi8KLUJPT0wxNiBXSU5BUEkgR2V0TW9kdWxlTmFtZSggSElOU1RBTkNFMTYgaGluc3QsIExQU1RSIGJ1ZiwgSU5UMTYgblNpemUgKQotewotICAgIExQU1RSIG5hbWUgPSBNT0RVTEVfR2V0TW9kdWxlTmFtZShoaW5zdCk7Ci0KLSAgICBpZiAoIW5hbWUpIHJldHVybiBGQUxTRTsKLSAgICBsc3RyY3B5bjMyQSggYnVmLCBuYW1lLCBuU2l6ZSApOwotICAgIHJldHVybiBUUlVFOwotfQotCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIExvYWRMaWJyYXJ5RXgzMlcgICAoS0VSTkVMLjUxMykKICAqIEZJWE1FCkBAIC04ODIsMjkgKzQ5Nyw4IEBACiAgKi8KIEJPT0wzMiBXSU5BUEkgRnJlZUxpYnJhcnkzMihISU5TVEFOQ0UzMiBoTGliTW9kdWxlKQogewotICAgIFRSQUNFKG1vZHVsZSwiaExpYk1vZHVsZT0lMDh4XG4iLCBoTGliTW9kdWxlKTsKLSAgICByZXR1cm4gTU9EVUxFX0ZyZWVNb2R1bGUoaExpYk1vZHVsZSxHbG9iYWxMb2NrMTYoR2V0Q3VycmVudFRhc2soKSkgKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBMb2FkTGlicmFyeSAgIChLRVJORUwuOTUpCi0gKi8KLUhJTlNUQU5DRTE2IFdJTkFQSSBMb2FkTGlicmFyeTE2KCBMUENTVFIgbGlibmFtZSApCi17Ci0gICAgSElOU1RBTkNFMTYgaGFuZGxlOwotCi0gICAgVFJBQ0UobW9kdWxlLCAiKCUwOHgpICVzXG4iLCAoaW50KWxpYm5hbWUsIGxpYm5hbWUpOwotCi0gICAgaGFuZGxlID0gTU9EVUxFX0xvYWQoIGxpYm5hbWUsIDAsIE5VTEwsIE5VTEwsIDAgKTsKLSAgICBpZiAoaGFuZGxlID09IChISU5TVEFOQ0UxNikyKSAgLyogZmlsZSBub3QgZm91bmQgKi8KLSAgICB7Ci0gICAgICAgIGNoYXIgYnVmZmVyWzI1Nl07Ci0gICAgICAgIGxzdHJjcHluMzJBKCBidWZmZXIsIGxpYm5hbWUsIDI1MiApOwotICAgICAgICBzdHJjYXQoIGJ1ZmZlciwgIi5kbGwiICk7Ci0gICAgICAgIGhhbmRsZSA9IE1PRFVMRV9Mb2FkKCBidWZmZXIsIDAsIE5VTEwsIE5VTEwsIDAgKTsKLSAgICB9Ci0gICAgcmV0dXJuIGhhbmRsZTsKKyAgICBXQVJOKG1vZHVsZSwiKCUwOHgpOiBzdHViXG4iLCBoTGliTW9kdWxlKTsKKyAgICByZXR1cm4gVFJVRTsgIC8qIEZJWE1FICovCiB9CiAKIApAQCAtOTE5LDE1ICs1MTMsNiBAQAogfQogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEZyZWVMaWJyYXJ5MTYgICAoS0VSTkVMLjk2KQotICovCi12b2lkIFdJTkFQSSBGcmVlTGlicmFyeTE2KCBISU5TVEFOQ0UxNiBoYW5kbGUgKQotewotICAgIFRSQUNFKG1vZHVsZSwiJTA0eFxuIiwgaGFuZGxlICk7Ci0gICAgRnJlZU1vZHVsZTE2KCBoYW5kbGUgKTsKLX0KLQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBQcml2YXRlRnJlZUxpYnJhcnkgICAgICAgKEtFUk5FTDMyKQpAQCAtMTAwMSw3ICs1ODYsNyBAQAogCXsKIAkgICAgLyogV2luZWxpYjogVXNlIExvYWRNb2R1bGUoKSBvbmx5IGZvciB0aGUgcHJvZ3JhbSBpdHNlbGYgKi8KIAkgICAgaWYgKF9fd2luZWxpYikgdXNlX2xvYWRfbW9kdWxlID0gMDsKLSAgICAgICAgICAgIGhhbmRsZSA9IE1PRFVMRV9Mb2FkKCBmaWxlbmFtZSwgMCwgbHBDbWRMaW5lLCBOVUxMLCBuQ21kU2hvdyApOworICAgICAgICAgICAgaGFuZGxlID0gTU9EVUxFX0xvYWQoIGZpbGVuYW1lLCBGQUxTRSwgbHBDbWRMaW5lLCBOVUxMLCBuQ21kU2hvdyApOwogCSAgICBpZiAoaGFuZGxlID09IDIpICAvKiBmaWxlIG5vdCBmb3VuZCAqLwogCSAgICB7CiAJCS8qIENoZWNrIHRoYXQgdGhlIG9yaWdpbmFsIGZpbGUgbmFtZSBkaWQgbm90IGhhdmUgYSBzdWZmaXggKi8KQEAgLTEwMTEsNyArNTk2LDcgQEAKIAkJewogCQkgICAgcCA9IGZpbGVuYW1lICsgc3RybGVuKGZpbGVuYW1lKTsKIAkJICAgIHN0cmNweSggcCwgIi5leGUiICk7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZSA9IE1PRFVMRV9Mb2FkKCBmaWxlbmFtZSwgMCwgbHBDbWRMaW5lLAorICAgICAgICAgICAgICAgICAgICBoYW5kbGUgPSBNT0RVTEVfTG9hZCggZmlsZW5hbWUsIEZBTFNFLCBscENtZExpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBuQ21kU2hvdyApOwogICAgICAgICAgICAgICAgICAgICAqcCA9ICdcMCc7ICAvKiBSZW1vdmUgZXh0ZW5zaW9uICovCiAJCX0KQEAgLTEwOTQsNyArNjc5LDcgQEAKICAqICAgICAgICAgICBXSU4zMl9HZXRQcm9jQWRkcmVzczE2ICAgKEtFUk5FTDMyLjM2KQogICogR2V0IHByb2NhZGRyZXNzIGluIDE2Yml0IG1vZHVsZSBmcm9tIHdpbjMyLi4uIChrZXJuZWwzMiB1bmRvYy4gb3JkaW5hbCBmdW5jKQogICovCi1GQVJQUk9DMTYgV0lOQVBJIFdJTjMyX0dldFByb2NBZGRyZXNzMTYoIEhNT0RVTEUzMiBoTW9kdWxlLCBMUFNUUiBuYW1lICkKK0ZBUlBST0MxNiBXSU5BUEkgV0lOMzJfR2V0UHJvY0FkZHJlc3MxNiggSE1PRFVMRTMyIGhNb2R1bGUsIExQQ1NUUiBuYW1lICkKIHsKICAgICBXT1JECW9yZGluYWw7CiAgICAgRkFSUFJPQzE2CXJldDsKQEAgLTExMDMsNyArNjg4LDEyIEBACiAgICAgCVdBUk4obW9kdWxlLCJoTW9kdWxlIG1heSBub3QgYmUgMCFcbiIpOwogCXJldHVybiAoRkFSUFJPQzE2KTA7CiAgICAgfQotICAgIGhNb2R1bGUgPSBNT0RVTEVfSEFORExFdG9ITU9EVUxFMTYoaE1vZHVsZSk7CisgICAgaWYgKEhJV09SRChoTW9kdWxlKSkKKyAgICB7CisgICAgCVdBUk4oIG1vZHVsZSwgImhNb2R1bGUgaXMgV2luMzIgaGFuZGxlICglMDh4KVxuIiwgaE1vZHVsZSApOworCXJldHVybiAoRkFSUFJPQzE2KTA7CisgICAgfQorICAgIGhNb2R1bGUgPSBHZXRFeGVQdHIoIGhNb2R1bGUgKTsKICAgICBpZiAoSElXT1JEKG5hbWUpKSB7CiAgICAgICAgIG9yZGluYWwgPSBORV9HZXRPcmRpbmFsKCBoTW9kdWxlLCBuYW1lICk7CiAgICAgICAgIFRSQUNFKG1vZHVsZSwgIiUwNHggJyVzJ1xuIiwKQEAgLTEyMDEsNzggKzc5MSwzIEBACiAgICAgaWYgKCF3bSB8fCAod20tPnR5cGUgIT0gTU9EVUxFMzJfUEUpKSByZXR1cm4gKExQSU1BR0VfTlRfSEVBREVSUykwOwogICAgIHJldHVybiBQRV9IRUFERVIod20tPm1vZHVsZSk7CiB9Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCSAgICBHZXRFeHBXaW5WZXIgICAgKEtFUk5FTC4xNjcpCi0gKi8KLVdPUkQgV0lOQVBJIEdldEV4cFdpblZlciggSE1PRFVMRTE2IGhNb2R1bGUgKQotewotICAgIE5FX01PRFVMRSAqcE1vZHVsZSA9IE1PRFVMRV9HZXRQdHIxNiggaE1vZHVsZSApOwotICAgIHJldHVybiBwTW9kdWxlID8gcE1vZHVsZS0+ZXhwZWN0ZWRfdmVyc2lvbiA6IDA7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCSAgICBJc1NoYXJlZFNlbGVjdG9yICAgIChLRVJORUwuMzQ1KQotICovCi1CT09MMTYgV0lOQVBJIElzU2hhcmVkU2VsZWN0b3IoIEhBTkRMRTE2IHNlbGVjdG9yICkKLXsKLSAgICAvKiBDaGVjayB3aGV0aGVyIHRoZSBzZWxlY3RvciBiZWxvbmdzIHRvIGEgRExMICovCi0gICAgTkVfTU9EVUxFICpwTW9kdWxlID0gTU9EVUxFX0dldFB0cjE2KCBzZWxlY3RvciApOwotICAgIGlmICghcE1vZHVsZSkgcmV0dXJuIEZBTFNFOwotICAgIHJldHVybiAocE1vZHVsZS0+ZmxhZ3MgJiBORV9GRkxBR1NfTElCTU9EVUxFKSAhPSAwOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkgICAgTW9kdWxlRmlyc3QgICAgKFRPT0xIRUxQLjU5KQotICovCi1CT09MMTYgV0lOQVBJIE1vZHVsZUZpcnN0KCBNT0RVTEVFTlRSWSAqbHBtZSApCi17Ci0gICAgbHBtZS0+d05leHQgPSBoRmlyc3RNb2R1bGU7Ci0gICAgcmV0dXJuIE1vZHVsZU5leHQoIGxwbWUgKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJICAgIE1vZHVsZU5leHQgICAgKFRPT0xIRUxQLjYwKQotICovCi1CT09MMTYgV0lOQVBJIE1vZHVsZU5leHQoIE1PRFVMRUVOVFJZICpscG1lICkKLXsKLSAgICBORV9NT0RVTEUgKnBNb2R1bGU7Ci0gICAgY2hhciAqbmFtZTsKLQotICAgIGlmICghbHBtZS0+d05leHQpIHJldHVybiBGQUxTRTsKLSAgICBpZiAoIShwTW9kdWxlID0gTU9EVUxFX0dldFB0cjE2KCBscG1lLT53TmV4dCApKSkgcmV0dXJuIEZBTFNFOwotICAgIG5hbWUgPSAoY2hhciAqKXBNb2R1bGUgKyBwTW9kdWxlLT5uYW1lX3RhYmxlOwotICAgIG1lbWNweSggbHBtZS0+c3pNb2R1bGUsIG5hbWUgKyAxLCAqbmFtZSApOwotICAgIGxwbWUtPnN6TW9kdWxlWyhCWVRFKSpuYW1lXSA9ICdcMCc7Ci0gICAgbHBtZS0+aE1vZHVsZSA9IGxwbWUtPndOZXh0OwotICAgIGxwbWUtPndjVXNhZ2UgPSBwTW9kdWxlLT5jb3VudDsKLSAgICBzdHJuY3B5KCBscG1lLT5zekV4ZVBhdGgsIE5FX01PRFVMRV9OQU1FKHBNb2R1bGUpLCBNQVhfUEFUSCApOwotICAgIGxwbWUtPnN6RXhlUGF0aFtNQVhfUEFUSF0gPSAnXDAnOwotICAgIGxwbWUtPndOZXh0ID0gcE1vZHVsZS0+bmV4dDsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJICAgIE1vZHVsZUZpbmROYW1lICAgIChUT09MSEVMUC42MSkKLSAqLwotQk9PTDE2IFdJTkFQSSBNb2R1bGVGaW5kTmFtZSggTU9EVUxFRU5UUlkgKmxwbWUsIExQQ1NUUiBuYW1lICkKLXsKLSAgICBscG1lLT53TmV4dCA9IEdldE1vZHVsZUhhbmRsZTE2KCBuYW1lICk7Ci0gICAgcmV0dXJuIE1vZHVsZU5leHQoIGxwbWUgKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJICAgIE1vZHVsZUZpbmRIYW5kbGUgICAgKFRPT0xIRUxQLjYyKQotICovCi1CT09MMTYgV0lOQVBJIE1vZHVsZUZpbmRIYW5kbGUoIE1PRFVMRUVOVFJZICpscG1lLCBITU9EVUxFMTYgaE1vZHVsZSApCi17Ci0gICAgaE1vZHVsZSA9IEdldEV4ZVB0ciggaE1vZHVsZSApOwotICAgIGxwbWUtPndOZXh0ID0gaE1vZHVsZTsKLSAgICByZXR1cm4gTW9kdWxlTmV4dCggbHBtZSApOwotfQpkaWZmIC0tZ2l0IGEvbG9hZGVyL25lL21vZHVsZS5jIGIvbG9hZGVyL25lL21vZHVsZS5jCmluZGV4IDVjZDk3ZjguLjBhMmZlNzAgMTAwNjQ0Ci0tLSBhL2xvYWRlci9uZS9tb2R1bGUuYworKysgYi9sb2FkZXIvbmUvbW9kdWxlLmMKQEAgLTUsMTUgKzUsMzYgQEAKICAqLwogCiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlICJtb2R1bGUuaCIKKyNpbmNsdWRlICJmaWxlLmgiCiAjaW5jbHVkZSAibGR0LmgiCisjaW5jbHVkZSAiY2FsbGJhY2suaCIKICNpbmNsdWRlICJoZWFwLmgiCisjaW5jbHVkZSAidGFzay5oIgogI2luY2x1ZGUgImdsb2JhbC5oIgogI2luY2x1ZGUgInByb2Nlc3MuaCIKKyNpbmNsdWRlICJ0b29saGVscC5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKLUhNT0RVTEUxNiBoRmlyc3RNb2R1bGUgPSAwOworc3RhdGljIEhNT0RVTEUxNiBoRmlyc3RNb2R1bGUgPSAwOworc3RhdGljIE5FX01PRFVMRSAqcENhY2hlZE1vZHVsZSA9IDA7ICAvKiBNb2R1bGUgY2FjaGVkIGJ5IE5FX09wZW5GaWxlICovCisKK3N0YXRpYyBITU9EVUxFMTYgTkVfTG9hZEJ1aWx0aW4oTFBDU1RSIG5hbWUsQk9PTDMyIGZvcmNlKSB7IHJldHVybiAwOyB9CitITU9EVUxFMTYgKCpmbkJVSUxUSU5fTG9hZE1vZHVsZSkoTFBDU1RSIG5hbWUsQk9PTDMyIGZvcmNlKSA9IE5FX0xvYWRCdWlsdGluOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIE5FX0dldFB0cgorICovCitORV9NT0RVTEUgKk5FX0dldFB0ciggSE1PRFVMRTE2IGhNb2R1bGUgKQoreworICAgIHJldHVybiAoTkVfTU9EVUxFICopR2xvYmFsTG9jazE2KCBHZXRFeGVQdHIoaE1vZHVsZSkgKTsKK30KKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBORV9EdW1wTW9kdWxlCkBAIC0yNiw3ICs0Nyw3IEBACiAgICAgV09SRCAqcHdvcmQ7CiAgICAgTkVfTU9EVUxFICpwTW9kdWxlOwogCi0gICAgaWYgKCEocE1vZHVsZSA9IE1PRFVMRV9HZXRQdHIxNiggaE1vZHVsZSApKSkKKyAgICBpZiAoIShwTW9kdWxlID0gTkVfR2V0UHRyKCBoTW9kdWxlICkpKQogICAgIHsKICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiKioqKiAlMDR4IGlzIG5vdCBhIG1vZHVsZSBoYW5kbGVcbiIsIGhNb2R1bGUgKTsKICAgICAgICAgcmV0dXJuOwpAQCAtOTksOCArMTIwLDkgQEAKICAgICAgICAgcHdvcmQgPSAoV09SRCAqKSgoQllURSAqKXBNb2R1bGUgKyBwTW9kdWxlLT5tb2RyZWZfdGFibGUpOwogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcE1vZHVsZS0+bW9kcmVmX2NvdW50OyBpKyssIHB3b3JkKyspCiAgICAgICAgIHsKLQkgICAgRFVNUCggIiVkOiAlMDR4IC0+ICclcydcbiIsIGksICpwd29yZCwKLQkJICAgIE1PRFVMRV9HZXRNb2R1bGVOYW1lKCpwd29yZCkpOworICAgICAgICAgICAgY2hhciBuYW1lWzEwXTsKKyAgICAgICAgICAgIEdldE1vZHVsZU5hbWUoICpwd29yZCwgbmFtZSwgc2l6ZW9mKG5hbWUpICk7CisJICAgIERVTVAoICIlZDogJTA0eCAtPiAnJXMnXG4iLCBpLCAqcHdvcmQsIG5hbWUgKTsKICAgICAgICAgfQogICAgIH0KICAgICBlbHNlIERVTVAoICJOb25lXG4iICk7CkBAIC0xNzAsNyArMTkyLDcgQEAKICAgICBmcHJpbnRmKCBzdGRlcnIsICJNb2R1bGUgRmxhZ3MgTmFtZVxuIiApOwogICAgIHdoaWxlIChoTW9kdWxlKQogICAgIHsKLSAgICAgICAgTkVfTU9EVUxFICpwTW9kdWxlID0gTU9EVUxFX0dldFB0cjE2KCBoTW9kdWxlICk7CisgICAgICAgIE5FX01PRFVMRSAqcE1vZHVsZSA9IE5FX0dldFB0ciggaE1vZHVsZSApOwogICAgICAgICBpZiAoIXBNb2R1bGUpCiAgICAgICAgIHsKICAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIioqKiogQmFkIG1vZHVsZSAlMDR4IGluIGxpc3RcbiIsIGhNb2R1bGUgKTsKQEAgLTIwNSw3ICsyMjcsNyBAQAogICAgIEJZVEUgbGVuOwogICAgIE5FX01PRFVMRSAqcE1vZHVsZTsKIAotICAgIGlmICghKHBNb2R1bGUgPSBNT0RVTEVfR2V0UHRyMTYoIGhNb2R1bGUgKSkpIHJldHVybiAwOworICAgIGlmICghKHBNb2R1bGUgPSBORV9HZXRQdHIoIGhNb2R1bGUgKSkpIHJldHVybiAwOwogICAgIGFzc2VydCggIShwTW9kdWxlLT5mbGFncyAmIE5FX0ZGTEFHU19XSU4zMikgKTsKIAogICAgIFRSQUNFKCBtb2R1bGUsICIoJTA0eCwnJXMnKVxuIiwgaE1vZHVsZSwgbmFtZSApOwpAQCAtMjcwLDcgKzI5Miw3IEBACiAgICAgQllURSAqcDsKICAgICBXT1JEIHNlbCwgb2Zmc2V0OwogCi0gICAgaWYgKCEocE1vZHVsZSA9IE1PRFVMRV9HZXRQdHIxNiggaE1vZHVsZSApKSkgcmV0dXJuIDA7CisgICAgaWYgKCEocE1vZHVsZSA9IE5FX0dldFB0ciggaE1vZHVsZSApKSkgcmV0dXJuIDA7CiAgICAgYXNzZXJ0KCAhKHBNb2R1bGUtPmZsYWdzICYgTkVfRkZMQUdTX1dJTjMyKSApOwogCiAgICAgcCA9IChCWVRFICopcE1vZHVsZSArIHBNb2R1bGUtPmVudHJ5X3RhYmxlOwpAQCAtMzIxLDcgKzM0Myw3IEBACiAgICAgV09SRCBjdXJPcmRpbmFsID0gMTsKICAgICBCWVRFICpwOwogCi0gICAgaWYgKCEocE1vZHVsZSA9IE1PRFVMRV9HZXRQdHIxNiggaE1vZHVsZSApKSkgcmV0dXJuIEZBTFNFOworICAgIGlmICghKHBNb2R1bGUgPSBORV9HZXRQdHIoIGhNb2R1bGUgKSkpIHJldHVybiBGQUxTRTsKICAgICBhc3NlcnQoICEocE1vZHVsZS0+ZmxhZ3MgJiBORV9GRkxBR1NfV0lOMzIpICk7CiAKICAgICBwID0gKEJZVEUgKilwTW9kdWxlICsgcE1vZHVsZS0+ZW50cnlfdGFibGU7CkBAIC0zNTYsOSArMzc4LDM1IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgTkVfT3BlbkZpbGUKKyAqLworaW50IE5FX09wZW5GaWxlKCBORV9NT0RVTEUgKnBNb2R1bGUgKQoreworICAgIERPU19GVUxMX05BTUUgZnVsbF9uYW1lOworICAgIGNoYXIgKm5hbWU7CisKKyAgICBzdGF0aWMgaW50IGNhY2hlZGZkID0gLTE7CisKKyAgICBUUkFDRSggbW9kdWxlLCAiKCVwKSBjYWNoZTogbW9kPSVwIGZkPSVkXG4iLAorICAgICAgICAgICBwTW9kdWxlLCBwQ2FjaGVkTW9kdWxlLCBjYWNoZWRmZCApOworICAgIGlmIChwQ2FjaGVkTW9kdWxlID09IHBNb2R1bGUpIHJldHVybiBjYWNoZWRmZDsKKyAgICBjbG9zZSggY2FjaGVkZmQgKTsKKyAgICBwQ2FjaGVkTW9kdWxlID0gcE1vZHVsZTsKKyAgICBuYW1lID0gTkVfTU9EVUxFX05BTUUoIHBNb2R1bGUgKTsKKyAgICBpZiAoIURPU0ZTX0dldEZ1bGxOYW1lKCBuYW1lLCBUUlVFLCAmZnVsbF9uYW1lICkgfHwKKyAgICAgICAgKGNhY2hlZGZkID0gb3BlbiggZnVsbF9uYW1lLmxvbmdfbmFtZSwgT19SRE9OTFkgKSkgPT0gLTEpCisgICAgICAgIFdBUk4oIG1vZHVsZSwgIkNhbid0IG9wZW4gZmlsZSAnJXMnIGZvciBtb2R1bGUgJTA0eFxuIiwKKyAgICAgICAgICAgICAgbmFtZSwgcE1vZHVsZS0+c2VsZiApOworICAgIFRSQUNFKG1vZHVsZSwgIm9wZW5lZCAnJXMnIC0+ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICBuYW1lLCBjYWNoZWRmZCApOworICAgIHJldHVybiBjYWNoZWRmZDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBORV9Mb2FkRXhlSGVhZGVyCiAgKi8KLXN0YXRpYyBITU9EVUxFMTYgTkVfTG9hZEV4ZUhlYWRlciggSEZJTEUzMiBoRmlsZSwgT0ZTVFJVQ1QgKm9mcyApCitzdGF0aWMgSE1PRFVMRTE2IE5FX0xvYWRFeGVIZWFkZXIoIEhGSUxFMTYgaEZpbGUsIE9GU1RSVUNUICpvZnMgKQogewogICAgIElNQUdFX0RPU19IRUFERVIgbXpfaGVhZGVyOwogICAgIElNQUdFX09TMl9IRUFERVIgbmVfaGVhZGVyOwpAQCAtMzc0LDIzICs0MjIsMjMgQEAKICAgICAgICAoKGZhc3Rsb2FkICYmICgob2Zmc2V0KSA+PSBmYXN0bG9hZF9vZmZzZXQpICYmIFwKICAgICAgICAgICgob2Zmc2V0KSsoc2l6ZSkgPD0gZmFzdGxvYWRfb2Zmc2V0K2Zhc3Rsb2FkX2xlbmd0aCkpID8gXAogICAgICAgICAobWVtY3B5KCBidWZmZXIsIGZhc3Rsb2FkKyhvZmZzZXQpLWZhc3Rsb2FkX29mZnNldCwgKHNpemUpICksIFRSVUUpIDogXAotICAgICAgICAoX2xsc2VlazMyKCBoRmlsZSwgKG9mZnNldCksIFNFRUtfU0VUKSwgXAotICAgICAgICAgX2xyZWFkMzIoIGhGaWxlLCAoYnVmZmVyKSwgKHNpemUpICkgPT0gKHNpemUpKSkKKyAgICAgICAgKF9sbHNlZWsxNiggaEZpbGUsIChvZmZzZXQpLCBTRUVLX1NFVCksIFwKKyAgICAgICAgIF9ocmVhZDE2KCBoRmlsZSwgKGJ1ZmZlciksIChzaXplKSApID09IChzaXplKSkpCiAKLSAgICBfbGxzZWVrMzIoIGhGaWxlLCAwLCBTRUVLX1NFVCApOwotICAgIGlmICgoX2xyZWFkMzIoaEZpbGUsJm16X2hlYWRlcixzaXplb2YobXpfaGVhZGVyKSkgIT0gc2l6ZW9mKG16X2hlYWRlcikpIHx8CisgICAgX2xsc2VlazE2KCBoRmlsZSwgMCwgU0VFS19TRVQgKTsKKyAgICBpZiAoKF9ocmVhZDE2KGhGaWxlLCZtel9oZWFkZXIsc2l6ZW9mKG16X2hlYWRlcikpICE9IHNpemVvZihtel9oZWFkZXIpKSB8fAogICAgICAgICAobXpfaGVhZGVyLmVfbWFnaWMgIT0gSU1BR0VfRE9TX1NJR05BVFVSRSkpCiAgICAgICAgIHJldHVybiAoSE1PRFVMRTE2KTExOyAgLyogaW52YWxpZCBleGUgKi8KIAotICAgIF9sbHNlZWszMiggaEZpbGUsIG16X2hlYWRlci5lX2xmYW5ldywgU0VFS19TRVQgKTsKLSAgICBpZiAoX2xyZWFkMzIoIGhGaWxlLCAmbmVfaGVhZGVyLCBzaXplb2YobmVfaGVhZGVyKSApICE9IHNpemVvZihuZV9oZWFkZXIpKQorICAgIF9sbHNlZWsxNiggaEZpbGUsIG16X2hlYWRlci5lX2xmYW5ldywgU0VFS19TRVQgKTsKKyAgICBpZiAoX2hyZWFkMTYoIGhGaWxlLCAmbmVfaGVhZGVyLCBzaXplb2YobmVfaGVhZGVyKSApICE9IHNpemVvZihuZV9oZWFkZXIpKQogICAgICAgICByZXR1cm4gKEhNT0RVTEUxNikxMTsgIC8qIGludmFsaWQgZXhlICovCiAKICAgICBpZiAobmVfaGVhZGVyLm5lX21hZ2ljID09IElNQUdFX05UX1NJR05BVFVSRSkgcmV0dXJuIChITU9EVUxFMTYpMjE7ICAvKiB3aW4zMiBleGUgKi8KICAgICBpZiAobmVfaGVhZGVyLm5lX21hZ2ljICE9IElNQUdFX09TMl9TSUdOQVRVUkUpIHJldHVybiAoSE1PRFVMRTE2KTExOyAgLyogaW52YWxpZCBleGUgKi8KIAogICAgIGlmIChuZV9oZWFkZXIubmVfbWFnaWMgPT0gSU1BR0VfT1MyX1NJR05BVFVSRV9MWCkgewotICAgICAgZnByaW50ZihzdGRlcnIsICJTb3JyeSwgdGhpcyBpcyBhbiBPUy8yIGxpbmVhciBleGVjdXRhYmxlIChMWCkgZmlsZSAhXG4iKTsKKyAgICAgIE1TRygiU29ycnksIHRoaXMgaXMgYW4gT1MvMiBsaW5lYXIgZXhlY3V0YWJsZSAoTFgpIGZpbGUgIVxuIik7CiAgICAgICByZXR1cm4gKEhNT0RVTEUxNikxMjsKICAgICB9CiAKQEAgLTQyNSw3ICs0NzMsNyBAQAogCiAgICAgLyogQ2xlYXIgaW50ZXJuYWwgV2luZSBmbGFncyBpbiBjYXNlIHRoZXkgYXJlIHNldCBpbiB0aGUgRVhFIGZpbGUgKi8KIAotICAgIHBNb2R1bGUtPmZsYWdzICY9IH4oTkVfRkZMQUdTX0JVSUxUSU58TkVfRkZMQUdTX1dJTjMyfE5FX0ZGTEFHU19JTVBMSUNJVCk7CisgICAgcE1vZHVsZS0+ZmxhZ3MgJj0gfihORV9GRkxBR1NfQlVJTFRJTiB8IE5FX0ZGTEFHU19XSU4zMik7CiAKICAgICAvKiBSZWFkIHRoZSBmYXN0LWxvYWQgYXJlYSAqLwogCkBAIC00MzcsMTEgKzQ4NSwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgZmFzdGxvYWRfb2Zmc2V0LCBmYXN0bG9hZF9sZW5ndGggKTsKICAgICAgICAgaWYgKChmYXN0bG9hZCA9IEhlYXBBbGxvYyggU3lzdGVtSGVhcCwgMCwgZmFzdGxvYWRfbGVuZ3RoICkpICE9IE5VTEwpCiAgICAgICAgIHsKLSAgICAgICAgICAgIF9sbHNlZWszMiggaEZpbGUsIGZhc3Rsb2FkX29mZnNldCwgU0VFS19TRVQpOwotICAgICAgICAgICAgaWYgKF9scmVhZDMyKGhGaWxlLCBmYXN0bG9hZCwgZmFzdGxvYWRfbGVuZ3RoKSAhPSBmYXN0bG9hZF9sZW5ndGgpCisgICAgICAgICAgICBfbGxzZWVrMTYoIGhGaWxlLCBmYXN0bG9hZF9vZmZzZXQsIFNFRUtfU0VUKTsKKyAgICAgICAgICAgIGlmIChfaHJlYWQxNihoRmlsZSwgZmFzdGxvYWQsIGZhc3Rsb2FkX2xlbmd0aCkgIT0gZmFzdGxvYWRfbGVuZ3RoKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIEhlYXBGcmVlKCBTeXN0ZW1IZWFwLCAwLCBmYXN0bG9hZCApOwotICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IgcmVhZGluZyBmYXN0LWxvYWQgYXJlYSAhXG4iKTsKKyAgICAgICAgICAgICAgICBXQVJOKCBtb2R1bGUsICJFcnJvciByZWFkaW5nIGZhc3QtbG9hZCBhcmVhIVxuIik7CiAgICAgICAgICAgICAgICAgZmFzdGxvYWQgPSBOVUxMOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC01NzUsOCArNjIzLDggQEAKICAgICAgICAgICAgIHJldHVybiAoSE1PRFVMRTE2KTExOyAgLyogaW52YWxpZCBleGUgKi8KICAgICAgICAgfQogICAgICAgICBidWZmZXIgPSBHbG9iYWxMb2NrMTYoIHBNb2R1bGUtPm5ybmFtZV9oYW5kbGUgKTsKLSAgICAgICAgX2xsc2VlazMyKCBoRmlsZSwgbmVfaGVhZGVyLm5ybmFtZV90YWJfb2Zmc2V0LCBTRUVLX1NFVCApOwotICAgICAgICBpZiAoX2xyZWFkMzIoIGhGaWxlLCBidWZmZXIsIG5lX2hlYWRlci5ucm5hbWVfdGFiX2xlbmd0aCApCisgICAgICAgIF9sbHNlZWsxNiggaEZpbGUsIG5lX2hlYWRlci5ucm5hbWVfdGFiX29mZnNldCwgU0VFS19TRVQgKTsKKyAgICAgICAgaWYgKF9ocmVhZDE2KCBoRmlsZSwgYnVmZmVyLCBuZV9oZWFkZXIubnJuYW1lX3RhYl9sZW5ndGggKQogICAgICAgICAgICAgICAhPSBuZV9oZWFkZXIubnJuYW1lX3RhYl9sZW5ndGgpCiAgICAgICAgIHsKICAgICAgICAgICAgIEdsb2JhbEZyZWUxNiggcE1vZHVsZS0+bnJuYW1lX2hhbmRsZSApOwpAQCAtNjIwLDE5ICs2NjgsMTggQEAKIAogICAgIGZvciAoaSA9IDA7IGkgPCBwTW9kdWxlLT5tb2RyZWZfY291bnQ7IGkrKywgcE1vZFJlZisrKQogICAgIHsKLSAgICAgICAgY2hhciBidWZmZXJbMjU2XTsKKyAgICAgICAgY2hhciBidWZmZXJbMjYwXTsKICAgICAgICAgQllURSAqcHN0ciA9IChCWVRFICopcE1vZHVsZSArIHBNb2R1bGUtPmltcG9ydF90YWJsZSArICpwTW9kUmVmOwogICAgICAgICBtZW1jcHkoIGJ1ZmZlciwgcHN0ciArIDEsICpwc3RyICk7CiAgICAgICAgIHN0cmNweSggYnVmZmVyICsgKnBzdHIsICIuZGxsIiApOwogICAgICAgICBUUkFDRShtb2R1bGUsICJMb2FkaW5nICclcydcbiIsIGJ1ZmZlciApOwotICAgICAgICBpZiAoISgqcE1vZFJlZiA9IE1PRFVMRV9GaW5kTW9kdWxlMTYoIGJ1ZmZlciApKSkKKyAgICAgICAgaWYgKCEoKnBNb2RSZWYgPSBHZXRNb2R1bGVIYW5kbGUxNiggYnVmZmVyICkpKQogICAgICAgICB7CiAgICAgICAgICAgICAvKiBJZiB0aGUgRExMIGlzIG5vdCBsb2FkZWQgeWV0LCBsb2FkIGl0IGFuZCBzdG9yZSAqLwogICAgICAgICAgICAgLyogaXRzIGhhbmRsZSBpbiB0aGUgbGlzdCBvZiBETExzIHRvIGluaXRpYWxpemUuICAgKi8KICAgICAgICAgICAgIEhNT0RVTEUxNiBoRExMOwogCi0gICAgICAgICAgICBpZiAoKGhETEwgPSBNT0RVTEVfTG9hZCggYnVmZmVyLCBORV9GRkxBR1NfSU1QTElDSVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgMCApKSA9PSAyKQorICAgICAgICAgICAgaWYgKChoRExMID0gTkVfTG9hZE1vZHVsZSggYnVmZmVyLCBOVUxMLCBUUlVFLCBUUlVFICkpID09IDIpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgLyogZmlsZSBub3QgZm91bmQgKi8KICAgICAgICAgICAgICAgICBjaGFyICpwOwpAQCAtNjQyLDEzICs2ODksMTMgQEAKICAgICAgICAgICAgICAgICBpZiAoIShwID0gc3RycmNociggYnVmZmVyLCAnXFwnICkpKSBwID0gYnVmZmVyOwogICAgICAgICAgICAgICAgIG1lbWNweSggcCArIDEsIHBzdHIgKyAxLCAqcHN0ciApOwogICAgICAgICAgICAgICAgIHN0cmNweSggcCArIDEgKyAqcHN0ciwgIi5kbGwiICk7Ci0gICAgICAgICAgICAgICAgaERMTCA9IE1PRFVMRV9Mb2FkKCBidWZmZXIsIE5FX0ZGTEFHU19JTVBMSUNJVCwgTlVMTCwgTlVMTCwgMCk7CisgICAgICAgICAgICAgICAgaERMTCA9IE5FX0xvYWRNb2R1bGUoIGJ1ZmZlciwgTlVMTCwgVFJVRSwgVFJVRSApOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGhETEwgPCAzMikKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAvKiBGSVhNRTogY2xlYW51cCB3aGF0IHdhcyBkb25lICovCiAKLSAgICAgICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJDb3VsZCBub3QgbG9hZCAnJXMnIHJlcXVpcmVkIGJ5ICclLipzJywgZXJyb3IgPSAlZFxuIiwKKyAgICAgICAgICAgICAgIFdBUk4oIG1vZHVsZSwgIkNvdWxkIG5vdCBsb2FkICclcycgcmVxdWlyZWQgYnkgJyUuKnMnLCBlcnJvcj0lZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsICooKEJZVEUqKXBNb2R1bGUgKyBwTW9kdWxlLT5uYW1lX3RhYmxlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKXBNb2R1bGUgKyBwTW9kdWxlLT5uYW1lX3RhYmxlICsgMSwgaERMTCApOwogICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKQEAgLTY1OCw3ICs3MDUsNyBAQAogICAgICAgICB9CiAgICAgICAgIGVsc2UgIC8qIEluY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIHRoZSBETEwgKi8KICAgICAgICAgewotICAgICAgICAgICAgTkVfTU9EVUxFICpwT2xkRExMID0gTU9EVUxFX0dldFB0cjE2KCAqcE1vZFJlZiApOworICAgICAgICAgICAgTkVfTU9EVUxFICpwT2xkRExMID0gTkVfR2V0UHRyKCAqcE1vZFJlZiApOwogICAgICAgICAgICAgaWYgKHBPbGRETEwpIHBPbGRETEwtPmNvdW50Kys7CiAgICAgICAgIH0KICAgICB9CkBAIC02NzUsMjQgKzcyMiw2MCBAQAogICogd2l0aG91dCBhIHByZWNlZGluZyBsZW5ndGggYnl0ZSkuCiAgKiBJZiBjbWRfbGluZSBpcyBOVUxMLCB0aGUgbW9kdWxlIGlzIGxvYWRlZCBhcyBhIGxpYnJhcnkgZXZlbiBpZiBpdCBpcyBhIC5leGUKICAqLwotSElOU1RBTkNFMTYgTkVfTG9hZE1vZHVsZSggSEZJTEUzMiBoRmlsZSwgT0ZTVFJVQ1QgKm9mcywgVUlOVDE2IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIGNtZF9saW5lLCBMUENTVFIgZW52LCBVSU5UMzIgc2hvd19jbWQgKQorSElOU1RBTkNFMTYgTkVfTG9hZE1vZHVsZSggTFBDU1RSIG5hbWUsIEhJTlNUQU5DRTE2ICpoUHJldkluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTDMyIGltcGxpY2l0LCBCT09MMzIgbGliX29ubHkgKQogewogICAgIEhNT0RVTEUxNiBoTW9kdWxlOwogICAgIEhJTlNUQU5DRTE2IGhJbnN0YW5jZTsKICAgICBORV9NT0RVTEUgKnBNb2R1bGU7CisgICAgSEZJTEUxNiBoRmlsZTsKKyAgICBPRlNUUlVDVCBvZnM7CisKKyAgICAvKiBDaGVjayBpZiB0aGUgbW9kdWxlIGlzIGFscmVhZHkgbG9hZGVkICovCisKKyAgICBpZiAoKGhNb2R1bGUgPSBHZXRNb2R1bGVIYW5kbGUxNiggbmFtZSApKSAhPSAwKQorICAgIHsKKyAgICAgICAgSElOU1RBTkNFMTYgcHJldjsKKyAgICAgICAgcE1vZHVsZSA9IE5FX0dldFB0ciggaE1vZHVsZSApOworICAgICAgICBoSW5zdGFuY2UgPSBORV9DcmVhdGVJbnN0YW5jZSggcE1vZHVsZSwgJnByZXYsIGxpYl9vbmx5ICk7CisgICAgICAgIGlmIChoSW5zdGFuY2UgIT0gcHJldikgIC8qIG5vdCBhIGxpYnJhcnkgKi8KKyAgICAgICAgICAgIE5FX0xvYWRTZWdtZW50KCBwTW9kdWxlLCBwTW9kdWxlLT5kZ3JvdXAgKTsKKyAgICAgICAgcE1vZHVsZS0+Y291bnQrKzsKKyAgICAgICAgaWYgKGhQcmV2SW5zdGFuY2UpICpoUHJldkluc3RhbmNlID0gcHJldjsKKyAgICAgICAgcmV0dXJuIGhJbnN0YW5jZTsKKyAgICB9CisgICAgaWYgKGhQcmV2SW5zdGFuY2UpICpoUHJldkluc3RhbmNlID0gMDsKKworICAgIC8qIFRyeSB0byBsb2FkIHRoZSBidWlsdC1pbiBmaXJzdCBpZiBub3QgZGlzYWJsZWQgKi8KKworICAgIGlmICgoaE1vZHVsZSA9IGZuQlVJTFRJTl9Mb2FkTW9kdWxlKCBuYW1lLCBGQUxTRSApKSkgcmV0dXJuIGhNb2R1bGU7CisKKyAgICBpZiAoKGhGaWxlID0gT3BlbkZpbGUxNiggbmFtZSwgJm9mcywgT0ZfUkVBRCApKSA9PSBIRklMRV9FUlJPUjE2KQorICAgIHsKKyAgICAgICAgLyogTm93IHRyeSB0aGUgYnVpbHQtaW4gZXZlbiBpZiBkaXNhYmxlZCAqLworICAgICAgICBpZiAoKGhNb2R1bGUgPSBmbkJVSUxUSU5fTG9hZE1vZHVsZSggbmFtZSwgVFJVRSApKSkKKyAgICAgICAgeworICAgICAgICAgICAgV0FSTihtb2R1bGUsICJDb3VsZCBub3QgbG9hZCBXaW5kb3dzIERMTCAnJXMnLCB1c2luZyBidWlsdC1pbiBtb2R1bGUuXG4iLCBuYW1lICk7CisgICAgICAgICAgICByZXR1cm4gaE1vZHVsZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMjsgIC8qIEZpbGUgbm90IGZvdW5kICovCisgICAgfQogCiAgICAgLyogQ3JlYXRlIHRoZSBtb2R1bGUgc3RydWN0dXJlICovCiAKLSAgICBpZiAoKGhNb2R1bGUgPSBORV9Mb2FkRXhlSGVhZGVyKCBoRmlsZSwgb2ZzICkpIDwgMzIpIHJldHVybiBoTW9kdWxlOwotCi0gICAgcE1vZHVsZSA9IE1PRFVMRV9HZXRQdHIxNiggaE1vZHVsZSApOwotICAgIHBNb2R1bGUtPmZsYWdzIHw9IGZsYWdzOyAvKiBzdGFtcCBpbXBsaWNpdGx5IGxvYWRlZCBtb2R1bGVzICovCisgICAgaE1vZHVsZSA9IE5FX0xvYWRFeGVIZWFkZXIoIGhGaWxlLCAmb2ZzICk7CisgICAgX2xjbG9zZTE2KCBoRmlsZSApOworICAgIGlmIChoTW9kdWxlIDwgMzIpIHJldHVybiBoTW9kdWxlOworICAgIHBNb2R1bGUgPSBORV9HZXRQdHIoIGhNb2R1bGUgKTsKIAogICAgIC8qIEFsbG9jYXRlIHRoZSBzZWdtZW50cyBmb3IgdGhpcyBtb2R1bGUgKi8KIAotICAgIE5FX0NyZWF0ZVNlZ21lbnRzKCBoTW9kdWxlICk7Ci0gICAgaEluc3RhbmNlID0gTU9EVUxFX0NyZWF0ZUluc3RhbmNlKCBoTW9kdWxlLCBOVUxMLCAoY21kX2xpbmUgPT0gTlVMTCkgKTsKKyAgICBpZiAoIU5FX0NyZWF0ZVNlZ21lbnRzKCBwTW9kdWxlICkgfHwKKyAgICAgICAgIShoSW5zdGFuY2UgPSBORV9DcmVhdGVJbnN0YW5jZSggcE1vZHVsZSwgTlVMTCwgbGliX29ubHkgKSkpCisgICAgeworICAgICAgICBHbG9iYWxGcmVlQWxsKCBoTW9kdWxlICk7CisgICAgICAgIHJldHVybiA4OyAgLyogSW5zdWZmaWNpZW50IG1lbW9yeSAqLworICAgIH0KIAogICAgIC8qIExvYWQgdGhlIHJlZmVyZW5jZWQgRExMcyAqLwogCkBAIC03MTYsMjEgKzc5OSwzMDcgQEAKICAgICAgKiB3aGVuIHdlIGxvYWQgaW1wbGljaXRseSBsaW5rZWQgRExMcyB0aGlzIHdpbGwgYmUgZG9uZSBieSBJbml0VGFzaygpLgogICAgICAqLwogCi0gICAgaWYgKChwTW9kdWxlLT5mbGFncyAmIChORV9GRkxBR1NfTElCTU9EVUxFIHwgTkVfRkZMQUdTX0lNUExJQ0lUKSkgPT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVfRkZMQUdTX0xJQk1PRFVMRSkKKyAgICBpZiAoIWltcGxpY2l0ICYmIChwTW9kdWxlLT5mbGFncyAmIE5FX0ZGTEFHU19MSUJNT0RVTEUpKQogICAgICAgICBORV9Jbml0aWFsaXplRExMcyggaE1vZHVsZSApOwogCi0gICAgLyogQ3JlYXRlIGEgdGFzayBmb3IgdGhpcyBpbnN0YW5jZSAqLworICAgIHJldHVybiBoSW5zdGFuY2U7Cit9CiAKLSAgICBpZiAoY21kX2xpbmUgJiYgIShwTW9kdWxlLT5mbGFncyAmIE5FX0ZGTEFHU19MSUJNT0RVTEUpKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBMb2FkTGlicmFyeSAgIChLRVJORUwuOTUpCisgKi8KK0hJTlNUQU5DRTE2IFdJTkFQSSBMb2FkTGlicmFyeTE2KCBMUENTVFIgbGlibmFtZSApCit7CisgICAgSElOU1RBTkNFMTYgaGFuZGxlOworICAgIExQQ1NUUiBwOworICAgIGNoYXIgKm5ld19uYW1lOworCisgICAgVFJBQ0UobW9kdWxlLCAiKCUwOHgpICVzXG4iLCAoaW50KWxpYm5hbWUsIGxpYm5hbWUpOworCisgICAgLyogQ2hlY2sgZm9yIGFuIGV4dGVuc2lvbiAqLworCisgICAgaWYgKChwID0gc3RycmNociggbGlibmFtZSwgJy4nKSkgJiYgIXN0cmNociggcCwgJy8nICkgJiYgIXN0cmNociggcCwgJ1xcJykpCiAgICAgewotICAgICAgICBQREIzMiAqcGRiOwotCi0JcE1vZHVsZS0+ZmxhZ3MgfD0gTkVfRkZMQUdTX0dVSTsKLQotICAgICAgICBwZGIgPSBQUk9DRVNTX0NyZWF0ZSggcE1vZHVsZSwgY21kX2xpbmUsIGVudiwgaEluc3RhbmNlLCAwLCBzaG93X2NtZCApOwotICAgICAgICBpZiAocGRiICYmIChHZXROdW1UYXNrcygpID4gMSkpIFlpZWxkMTYoKTsKKyAgICAgICAgLyogQW4gZXh0ZW5zaW9uIGlzIHByZXNlbnQgLT4gdXNlIHRoZSBuYW1lIGFzIGlzICovCisgICAgICAgIHJldHVybiBORV9Mb2FkTW9kdWxlKCBsaWJuYW1lLCBOVUxMLCBGQUxTRSwgVFJVRSApOwogICAgIH0KIAotICAgIHJldHVybiBoSW5zdGFuY2U7CisgICAgLyogTm93IGFwcGVuZCAuZGxsIGJlZm9yZSBsb2FkaW5nICovCisKKyAgICBpZiAoIShuZXdfbmFtZSA9IEhlYXBBbGxvYyggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3RybGVuKGxpYm5hbWUpICsgNCApKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgc3RyY3B5KCBuZXdfbmFtZSwgbGlibmFtZSApOworICAgIHN0cmNhdCggbmV3X25hbWUsICIuZGxsIiApOworICAgIGhhbmRsZSA9IE5FX0xvYWRNb2R1bGUoIG5ld19uYW1lLCBOVUxMLCBGQUxTRSwgVFJVRSApOworICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBuZXdfbmFtZSApOworICAgIHJldHVybiBoYW5kbGU7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCSAgICBNT0RVTEVfQ2FsbFdFUAorICoKKyAqIENhbGwgYSBETEwncyBXRVAsIGFsbG93aW5nIGl0IHRvIHNodXQgZG93bi4KKyAqIEZJWE1FOiB3ZSBhbHdheXMgcGFzcyB0aGUgV0VQIFdFUF9GUkVFX0RMTCwgbmV2ZXIgV0VQX1NZU1RFTV9FWElUCisgKi8KK3N0YXRpYyBCT09MMTYgTU9EVUxFX0NhbGxXRVAoIEhNT0RVTEUxNiBoTW9kdWxlICkKK3sKKyAgICBGQVJQUk9DMTYgV0VQID0gKEZBUlBST0MxNikwOworICAgIFdPUkQgb3JkaW5hbCA9IE5FX0dldE9yZGluYWwoIGhNb2R1bGUsICJXRVAiICk7CisKKyAgICBpZiAob3JkaW5hbCkgV0VQID0gTkVfR2V0RW50cnlQb2ludCggaE1vZHVsZSwgb3JkaW5hbCApOworICAgIGlmICghV0VQKQorICAgIHsKKwlXQVJOKG1vZHVsZSwgIm1vZHVsZSAlMDR4IGRvZXNuJ3QgaGF2ZSBhIFdFUFxuIiwgaE1vZHVsZSApOworCXJldHVybiBGQUxTRTsKKyAgICB9CisgICAgcmV0dXJuIENhbGxiYWNrcy0+Q2FsbFdpbmRvd3NFeGl0UHJvYyggV0VQLCBXRVBfRlJFRV9ETEwgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJICAgIE5FX0ZyZWVNb2R1bGUKKyAqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiBGcmVlTW9kdWxlMTYoKS4KKyAqLworc3RhdGljIEJPT0wxNiBORV9GcmVlTW9kdWxlKCBITU9EVUxFMTYgaE1vZHVsZSwgQk9PTDMyIGNhbGxfd2VwICkKK3sKKyAgICBITU9EVUxFMTYgKmhQcmV2TW9kdWxlOworICAgIE5FX01PRFVMRSAqcE1vZHVsZTsKKyAgICBITU9EVUxFMTYgKnBNb2RSZWY7CisgICAgaW50IGk7CisKKyAgICBpZiAoIShwTW9kdWxlID0gTkVfR2V0UHRyKCBoTW9kdWxlICkpKSByZXR1cm4gRkFMU0U7CisgICAgaE1vZHVsZSA9IHBNb2R1bGUtPnNlbGY7CisKKyAgICBUUkFDRSggbW9kdWxlLCAiJTA0eCBjb3VudCAlZFxuIiwgaE1vZHVsZSwgcE1vZHVsZS0+Y291bnQgKTsKKworICAgIGlmICgoKElOVDE2KSgtLXBNb2R1bGUtPmNvdW50KSkgPiAwICkgcmV0dXJuIFRSVUU7CisgICAgZWxzZSBwTW9kdWxlLT5jb3VudCA9IDA7CisKKyAgICBpZiAocE1vZHVsZS0+ZmxhZ3MgJiBORV9GRkxBR1NfQlVJTFRJTikKKyAgICAgICAgcmV0dXJuIEZBTFNFOyAgLyogQ2FuJ3QgZnJlZSBidWlsdC1pbiBtb2R1bGUgKi8KKworICAgIGlmIChjYWxsX3dlcCkKKyAgICB7CisgICAgICAgIGlmIChwTW9kdWxlLT5mbGFncyAmIE5FX0ZGTEFHU19MSUJNT0RVTEUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFREQiAqcFRhc2sgPSAoVERCICopR2xvYmFsTG9jazE2KCBHZXRDdXJyZW50VGFzaygpICk7CisgICAgICAgICAgICBNT0RVTEVfQ2FsbFdFUCggaE1vZHVsZSApOworCisgICAgICAgICAgICAvKiBGcmVlIHRoZSBvYmplY3RzIG93bmVkIGJ5IHRoZSBETEwgbW9kdWxlICovCisKKyAgICAgICAgICAgIGlmIChwVGFzayAmJiBwVGFzay0+dXNlcmhhbmRsZXIpCisgICAgICAgICAgICAgICAgcFRhc2stPnVzZXJoYW5kbGVyKCBoTW9kdWxlLCBVU0lHX0RMTF9VTkxPQUQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGFzay0+aEluc3RhbmNlLCBwVGFzay0+aFF1ZXVlICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY2FsbF93ZXAgPSBGQUxTRTsgIC8qIFdlIGFyZSBmcmVlaW5nIGEgdGFzayAtPiBubyBtb3JlIFdFUHMgKi8KKyAgICB9CisgICAgCisKKyAgICAvKiBDbGVhciBtYWdpYyBudW1iZXIganVzdCBpbiBjYXNlICovCisKKyAgICBwTW9kdWxlLT5tYWdpYyA9IHBNb2R1bGUtPnNlbGYgPSAwOworCisgICAgICAvKiBSZW1vdmUgaXQgZnJvbSB0aGUgbGlua2VkIGxpc3QgKi8KKworICAgIGhQcmV2TW9kdWxlID0gJmhGaXJzdE1vZHVsZTsKKyAgICB3aGlsZSAoKmhQcmV2TW9kdWxlICYmICgqaFByZXZNb2R1bGUgIT0gaE1vZHVsZSkpCisgICAgeworICAgICAgICBoUHJldk1vZHVsZSA9ICYoTkVfR2V0UHRyKCAqaFByZXZNb2R1bGUgKSktPm5leHQ7CisgICAgfQorICAgIGlmICgqaFByZXZNb2R1bGUpICpoUHJldk1vZHVsZSA9IHBNb2R1bGUtPm5leHQ7CisKKyAgICAvKiBGcmVlIHRoZSByZWZlcmVuY2VkIG1vZHVsZXMgKi8KKworICAgIHBNb2RSZWYgPSAoSE1PRFVMRTE2KilORV9NT0RVTEVfVEFCTEUoIHBNb2R1bGUgKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcE1vZHVsZS0+bW9kcmVmX2NvdW50OyBpKyssIHBNb2RSZWYrKykKKyAgICB7CisgICAgICAgIE5FX0ZyZWVNb2R1bGUoICpwTW9kUmVmLCBjYWxsX3dlcCApOworICAgIH0KKworICAgIC8qIEZyZWUgdGhlIG1vZHVsZSBzdG9yYWdlICovCisKKyAgICBHbG9iYWxGcmVlQWxsKCBoTW9kdWxlICk7CisKKyAgICAvKiBSZW1vdmUgbW9kdWxlIGZyb20gY2FjaGUgKi8KKworICAgIGlmIChwQ2FjaGVkTW9kdWxlID09IHBNb2R1bGUpIHBDYWNoZWRNb2R1bGUgPSBOVUxMOworICAgIHJldHVybiBUUlVFOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkgICAgRnJlZU1vZHVsZTE2ICAgIChLRVJORUwuNDYpCisgKi8KK0JPT0wxNiBXSU5BUEkgRnJlZU1vZHVsZTE2KCBITU9EVUxFMTYgaE1vZHVsZSApCit7CisgICAgcmV0dXJuIE5FX0ZyZWVNb2R1bGUoIGhNb2R1bGUsIFRSVUUgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBGcmVlTGlicmFyeTE2ICAgKEtFUk5FTC45NikKKyAqLwordm9pZCBXSU5BUEkgRnJlZUxpYnJhcnkxNiggSElOU1RBTkNFMTYgaGFuZGxlICkKK3sKKyAgICBUUkFDRShtb2R1bGUsIiUwNHhcbiIsIGhhbmRsZSApOworICAgIEZyZWVNb2R1bGUxNiggaGFuZGxlICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCSAgICBHZXRNb2R1bGVOYW1lICAgIChLRVJORUwuMjcpCisgKi8KK0JPT0wxNiBXSU5BUEkgR2V0TW9kdWxlTmFtZSggSElOU1RBTkNFMTYgaGluc3QsIExQU1RSIGJ1ZiwgSU5UMTYgY291bnQgKQoreworICAgIE5FX01PRFVMRSAqcE1vZHVsZTsKKyAgICBCWVRFICpwOworCisgICAgaWYgKCEocE1vZHVsZSA9IE5FX0dldFB0ciggaGluc3QgKSkpIHJldHVybiBGQUxTRTsKKyAgICBwID0gKEJZVEUgKilwTW9kdWxlICsgcE1vZHVsZS0+bmFtZV90YWJsZTsKKyAgICBpZiAoY291bnQgPiAqcCkgY291bnQgPSAqcCArIDE7CisgICAgaWYgKGNvdW50ID4gMCkKKyAgICB7CisgICAgICAgIG1lbWNweSggYnVmLCBwICsgMSwgY291bnQgLSAxICk7CisgICAgICAgIGJ1Zltjb3VudC0xXSA9ICdcMCc7CisgICAgfQorICAgIHJldHVybiBUUlVFOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkgICAgR2V0TW9kdWxlVXNhZ2UgICAgKEtFUk5FTC40OCkKKyAqLworSU5UMTYgV0lOQVBJIEdldE1vZHVsZVVzYWdlKCBISU5TVEFOQ0UxNiBoTW9kdWxlICkKK3sKKyAgICBORV9NT0RVTEUgKnBNb2R1bGUgPSBORV9HZXRQdHIoIGhNb2R1bGUgKTsKKyAgICByZXR1cm4gcE1vZHVsZSA/IHBNb2R1bGUtPmNvdW50IDogMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJICAgIEdldEV4cFdpblZlciAgICAoS0VSTkVMLjE2NykKKyAqLworV09SRCBXSU5BUEkgR2V0RXhwV2luVmVyKCBITU9EVUxFMTYgaE1vZHVsZSApCit7CisgICAgTkVfTU9EVUxFICpwTW9kdWxlID0gTkVfR2V0UHRyKCBoTW9kdWxlICk7CisgICAgcmV0dXJuIHBNb2R1bGUgPyBwTW9kdWxlLT5leHBlY3RlZF92ZXJzaW9uIDogMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJICAgIEdldE1vZHVsZUZpbGVOYW1lMTYgICAgKEtFUk5FTC40OSkKKyAqLworSU5UMTYgV0lOQVBJIEdldE1vZHVsZUZpbGVOYW1lMTYoIEhJTlNUQU5DRTE2IGhNb2R1bGUsIExQU1RSIGxwRmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMTYgblNpemUgKQoreworICAgIE5FX01PRFVMRSAqcE1vZHVsZTsKKworICAgIGlmICghaE1vZHVsZSkgaE1vZHVsZSA9IEdldEN1cnJlbnRUYXNrKCk7CisgICAgaWYgKCEocE1vZHVsZSA9IE5FX0dldFB0ciggaE1vZHVsZSApKSkgcmV0dXJuIDA7CisgICAgbHN0cmNweW4zMkEoIGxwRmlsZU5hbWUsIE5FX01PRFVMRV9OQU1FKHBNb2R1bGUpLCBuU2l6ZSApOworICAgIFRSQUNFKG1vZHVsZSwgIiVzXG4iLCBscEZpbGVOYW1lICk7CisgICAgcmV0dXJuIHN0cmxlbihscEZpbGVOYW1lKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJICAgIEdldE1vZHVsZUhhbmRsZTE2ICAgIChLRVJORUwuNDcpCisgKgorICogRmluZCBhIG1vZHVsZSBmcm9tIGEgcGF0aCBuYW1lLgorICoKKyAqIFJFVFVSTlMKKyAqCXRoZSB3aW4xNiBtb2R1bGUgaGFuZGxlIGlmIGZvdW5kCisgKiAJMCBpZiBub3QKKyAqLworSE1PRFVMRTE2IFdJTkFQSSBXSU4xNl9HZXRNb2R1bGVIYW5kbGUoIFNFR1BUUiBuYW1lICkKK3sKKyAgICBpZiAoSElXT1JEKG5hbWUpID09IDApIHJldHVybiBHZXRFeGVQdHIoIChISU5TVEFOQ0UxNiluYW1lICk7CisgICAgcmV0dXJuIEdldE1vZHVsZUhhbmRsZTE2KCBQVFJfU0VHX1RPX0xJTihuYW1lKSApOworfQorCitITU9EVUxFMTYgV0lOQVBJIEdldE1vZHVsZUhhbmRsZTE2KCBMUENTVFIgbmFtZSApCit7CisgICAgSE1PRFVMRTE2IGhNb2R1bGUgPSBoRmlyc3RNb2R1bGU7CisgICAgTFBDU1RSIGZpbGVuYW1lLCBkb3RwdHIsIG1vZHVsZXBhdGgsIG1vZHVsZW5hbWU7CisgICAgQllURSBsZW4sICpuYW1lX3RhYmxlOworCisgICAgaWYgKCEoZmlsZW5hbWUgPSBzdHJyY2hyKCBuYW1lLCAnXFwnICkpKSBmaWxlbmFtZSA9IG5hbWU7CisgICAgZWxzZSBmaWxlbmFtZSsrOworICAgIGlmICgoZG90cHRyID0gc3RycmNociggZmlsZW5hbWUsICcuJyApKSAhPSBOVUxMKQorICAgICAgICBsZW4gPSAoQllURSkoZG90cHRyIC0gZmlsZW5hbWUpOworICAgIGVsc2UgbGVuID0gc3RybGVuKCBmaWxlbmFtZSApOworCisgICAgd2hpbGUgKGhNb2R1bGUpCisgICAgeworICAgICAgICBORV9NT0RVTEUgKnBNb2R1bGUgPSBORV9HZXRQdHIoIGhNb2R1bGUgKTsKKyAgICAgICAgaWYgKCFwTW9kdWxlKSBicmVhazsKKyAgICAgICAgbW9kdWxlcGF0aCA9IE5FX01PRFVMRV9OQU1FKHBNb2R1bGUpOworICAgICAgICBpZiAoIShtb2R1bGVuYW1lID0gc3RycmNociggbW9kdWxlcGF0aCwgJ1xcJyApKSkKKyAgICAgICAgICAgIG1vZHVsZW5hbWUgPSBtb2R1bGVwYXRoOworICAgICAgICBlbHNlIG1vZHVsZW5hbWUrKzsKKyAgICAgICAgaWYgKCFsc3RyY21waTMyQSggbW9kdWxlbmFtZSwgZmlsZW5hbWUgKSkgcmV0dXJuIGhNb2R1bGU7CisKKyAgICAgICAgbmFtZV90YWJsZSA9IChCWVRFICopcE1vZHVsZSArIHBNb2R1bGUtPm5hbWVfdGFibGU7CisgICAgICAgIGlmICgoKm5hbWVfdGFibGUgPT0gbGVuKSAmJiAhbHN0cm5jbXBpMzJBKGZpbGVuYW1lLCBuYW1lX3RhYmxlKzEsIGxlbikpCisgICAgICAgICAgICByZXR1cm4gaE1vZHVsZTsKKyAgICAgICAgaE1vZHVsZSA9IHBNb2R1bGUtPm5leHQ7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkgICAgTW9kdWxlRmlyc3QgICAgKFRPT0xIRUxQLjU5KQorICovCitCT09MMTYgV0lOQVBJIE1vZHVsZUZpcnN0KCBNT0RVTEVFTlRSWSAqbHBtZSApCit7CisgICAgbHBtZS0+d05leHQgPSBoRmlyc3RNb2R1bGU7CisgICAgcmV0dXJuIE1vZHVsZU5leHQoIGxwbWUgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJICAgIE1vZHVsZU5leHQgICAgKFRPT0xIRUxQLjYwKQorICovCitCT09MMTYgV0lOQVBJIE1vZHVsZU5leHQoIE1PRFVMRUVOVFJZICpscG1lICkKK3sKKyAgICBORV9NT0RVTEUgKnBNb2R1bGU7CisgICAgY2hhciAqbmFtZTsKKworICAgIGlmICghbHBtZS0+d05leHQpIHJldHVybiBGQUxTRTsKKyAgICBpZiAoIShwTW9kdWxlID0gTkVfR2V0UHRyKCBscG1lLT53TmV4dCApKSkgcmV0dXJuIEZBTFNFOworICAgIG5hbWUgPSAoY2hhciAqKXBNb2R1bGUgKyBwTW9kdWxlLT5uYW1lX3RhYmxlOworICAgIG1lbWNweSggbHBtZS0+c3pNb2R1bGUsIG5hbWUgKyAxLCAqbmFtZSApOworICAgIGxwbWUtPnN6TW9kdWxlWyhCWVRFKSpuYW1lXSA9ICdcMCc7CisgICAgbHBtZS0+aE1vZHVsZSA9IGxwbWUtPndOZXh0OworICAgIGxwbWUtPndjVXNhZ2UgPSBwTW9kdWxlLT5jb3VudDsKKyAgICBzdHJuY3B5KCBscG1lLT5zekV4ZVBhdGgsIE5FX01PRFVMRV9OQU1FKHBNb2R1bGUpLCBNQVhfUEFUSCApOworICAgIGxwbWUtPnN6RXhlUGF0aFtNQVhfUEFUSF0gPSAnXDAnOworICAgIGxwbWUtPndOZXh0ID0gcE1vZHVsZS0+bmV4dDsKKyAgICByZXR1cm4gVFJVRTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJICAgIE1vZHVsZUZpbmROYW1lICAgIChUT09MSEVMUC42MSkKKyAqLworQk9PTDE2IFdJTkFQSSBNb2R1bGVGaW5kTmFtZSggTU9EVUxFRU5UUlkgKmxwbWUsIExQQ1NUUiBuYW1lICkKK3sKKyAgICBscG1lLT53TmV4dCA9IEdldE1vZHVsZUhhbmRsZTE2KCBuYW1lICk7CisgICAgcmV0dXJuIE1vZHVsZU5leHQoIGxwbWUgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJICAgIE1vZHVsZUZpbmRIYW5kbGUgICAgKFRPT0xIRUxQLjYyKQorICovCitCT09MMTYgV0lOQVBJIE1vZHVsZUZpbmRIYW5kbGUoIE1PRFVMRUVOVFJZICpscG1lLCBITU9EVUxFMTYgaE1vZHVsZSApCit7CisgICAgaE1vZHVsZSA9IEdldEV4ZVB0ciggaE1vZHVsZSApOworICAgIGxwbWUtPndOZXh0ID0gaE1vZHVsZTsKKyAgICByZXR1cm4gTW9kdWxlTmV4dCggbHBtZSApOwogfQpkaWZmIC0tZ2l0IGEvbG9hZGVyL25lL3Jlc291cmNlLmMgYi9sb2FkZXIvbmUvcmVzb3VyY2UuYwppbmRleCA4MzJiZTNiLi44MDc4NzFkIDEwMDY0NAotLS0gYS9sb2FkZXIvbmUvcmVzb3VyY2UuYworKysgYi9sb2FkZXIvbmUvcmVzb3VyY2UuYwpAQCAtMTgzLDggKzE4Myw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJTUkMxNiBoUnNyYyApCiB7CiAgICAgaW50ICBmZDsKLSAgICBORV9NT0RVTEUqIHBNb2R1bGUgPSBNT0RVTEVfR2V0UHRyMTYoIGhNb2R1bGUgKTsKLSAgICBpZiAoIHBNb2R1bGUgJiYgKGZkID0gTU9EVUxFX09wZW5GaWxlKCBoTW9kdWxlICkpID49IDApCisgICAgTkVfTU9EVUxFKiBwTW9kdWxlID0gTkVfR2V0UHRyKCBoTW9kdWxlICk7CisgICAgaWYgKHBNb2R1bGUgJiYgKGZkID0gTkVfT3BlbkZpbGUoIHBNb2R1bGUgKSkgPj0gMCkKICAgICB7CiAJSEdMT0JBTDE2IGhhbmRsZTsKIAlXT1JEIHNpemVTaGlmdCA9ICooV09SRCAqKSgoY2hhciAqKXBNb2R1bGUgKyBwTW9kdWxlLT5yZXNfdGFibGUpOwpAQCAtMjE1LDcgKzIxNSw3IEBACiAgKi8KIEJPT0wzMiBORV9Jbml0UmVzb3VyY2VIYW5kbGVyKCBITU9EVUxFMTYgaE1vZHVsZSApCiB7Ci0gICAgTkVfTU9EVUxFICpwTW9kdWxlID0gTU9EVUxFX0dldFB0cjE2KCBoTW9kdWxlICk7CisgICAgTkVfTU9EVUxFICpwTW9kdWxlID0gTkVfR2V0UHRyKCBoTW9kdWxlICk7CiAgICAgTkVfVFlQRUlORk8gKnBUeXBlSW5mbyA9IChORV9UWVBFSU5GTyAqKSgoY2hhciAqKXBNb2R1bGUgKyBwTW9kdWxlLT5yZXNfdGFibGUgKyAyKTsKIAogICAgIFRSQUNFKHJlc291cmNlLCJJbml0UmVzb3VyY2VIYW5kbGVyWyUwNHhdXG4iLCBoTW9kdWxlICk7CkBAIC0yMzYsNyArMjM2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVJQUk9DMTYgcmVzb3VyY2VIYW5kbGVyICkKIHsKICAgICBGQVJQUk9DMTYgcHJldkhhbmRsZXIgPSBOVUxMOwotICAgIE5FX01PRFVMRSAqcE1vZHVsZSA9IE1PRFVMRV9HZXRQdHIxNiggaE1vZHVsZSApOworICAgIE5FX01PRFVMRSAqcE1vZHVsZSA9IE5FX0dldFB0ciggaE1vZHVsZSApOwogICAgIE5FX1RZUEVJTkZPICpwVHlwZUluZm8gPSAoTkVfVFlQRUlORk8gKikoKGNoYXIgKilwTW9kdWxlICsgcE1vZHVsZS0+cmVzX3RhYmxlICsgMik7CiAKICAgICBpZiAoIXBNb2R1bGUgfHwgIXBNb2R1bGUtPnJlc190YWJsZSkgcmV0dXJuIE5VTEw7CkBAIC0yNjQsNyArMjY0LDcgQEAKICAgICBORV9UWVBFSU5GTyAqcFR5cGVJbmZvOwogICAgIEhSU1JDMTYgaFJzcmM7CiAKLSAgICBORV9NT0RVTEUgKnBNb2R1bGUgPSBNT0RVTEVfR2V0UHRyMTYoIGhNb2R1bGUgKTsKKyAgICBORV9NT0RVTEUgKnBNb2R1bGUgPSBORV9HZXRQdHIoIGhNb2R1bGUgKTsKICAgICBpZiAoIXBNb2R1bGUgfHwgIXBNb2R1bGUtPnJlc190YWJsZSkgcmV0dXJuIDA7CiAKICAgICBhc3NlcnQoICFfX3dpbmVsaWIgKTsgIC8qIENhbid0IHVzZSBXaW4xNiByZXNvdXJjZSBmdW5jdGlvbnMgaW4gV2luZWxpYiAqLwpAQCAtMzMzLDcgKzMzMyw3IEBACiAgICAgTkVfTkFNRUlORk8gKnBOYW1lSW5mbz1OVUxMOwogICAgIFdPUkQgc2l6ZVNoaWZ0OwogCi0gICAgTkVfTU9EVUxFICpwTW9kdWxlID0gTU9EVUxFX0dldFB0cjE2KCBoTW9kdWxlICk7CisgICAgTkVfTU9EVUxFICpwTW9kdWxlID0gTkVfR2V0UHRyKCBoTW9kdWxlICk7CiAgICAgaWYgKCFwTW9kdWxlIHx8ICFwTW9kdWxlLT5yZXNfdGFibGUgfHwgIWhSc3JjKSByZXR1cm4gMDsKIAogICAgIFRSQUNFKCByZXNvdXJjZSwgIm1vZHVsZT0lMDR4IHJlcz0lMDR4IHNpemU9JWxkXG4iLCBoTW9kdWxlLCBoUnNyYywgc2l6ZSApOwpAQCAtMzYxLDcgKzM2MSw3IEBACiAgICAgaWYgKCEoaEluc3RhbmNlID0gR2V0RXhlUHRyKCBoSW5zdGFuY2UgKSkpIHJldHVybiAwOwogICAgIGlmKHdUeXBlICE9IDB4MTApCS8qIDB4MTAgaXMgdGhlIG9ubHkgb2JzZXJ2ZWQgdmFsdWUsIHBhc3NlZCBmcm9tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVDdXJzb3JJbmRpcmVjdC4gKi8KLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJEaXJlY3RSZXNBbGxvYzogd1R5cGUgPSAleFxuIiwgd1R5cGUpOworICAgICAgICBUUkFDRShyZXNvdXJjZSwgIih3VHlwZT0leClcbiIsIHdUeXBlKTsKICAgICByZXR1cm4gR0xPQkFMX0FsbG9jKEdNRU1fTU9WRUFCTEUsIHdTaXplLCBoSW5zdGFuY2UsIEZBTFNFLCBGQUxTRSwgRkFMU0UpOwogfQogCkBAIC0zNzMsNyArMzczLDcgQEAKIHsKICAgICBIRklMRTMyIGZkOwogCi0gICAgTkVfTU9EVUxFICpwTW9kdWxlID0gTU9EVUxFX0dldFB0cjE2KCBoTW9kdWxlICk7CisgICAgTkVfTU9EVUxFICpwTW9kdWxlID0gTkVfR2V0UHRyKCBoTW9kdWxlICk7CiAgICAgaWYgKCFwTW9kdWxlIHx8ICFwTW9kdWxlLT5yZXNfdGFibGUgfHwgIWhSc3JjKSByZXR1cm4gLTE7CiAKICAgICBUUkFDRShyZXNvdXJjZSwgIm1vZHVsZT0lMDR4IHJlcz0lMDR4XG4iLCBoTW9kdWxlLCBoUnNyYyApOwpAQCAtMzk4LDcgKzM5OCw3IEBACiAgICAgTkVfTkFNRUlORk8gKnBOYW1lSW5mbz1OVUxMOwogICAgIFdPUkQgc2l6ZVNoaWZ0OwogCi0gICAgTkVfTU9EVUxFICpwTW9kdWxlID0gTU9EVUxFX0dldFB0cjE2KCBoTW9kdWxlICk7CisgICAgTkVfTU9EVUxFICpwTW9kdWxlID0gTkVfR2V0UHRyKCBoTW9kdWxlICk7CiAgICAgaWYgKCFwTW9kdWxlIHx8ICFwTW9kdWxlLT5yZXNfdGFibGUpIHJldHVybiAwOwogCiAgICAgVFJBQ0UocmVzb3VyY2UsICJtb2R1bGU9JTA0eCByZXM9JTA0eFxuIiwgaE1vZHVsZSwgaFJzcmMgKTsKQEAgLTQxOCw3ICs0MTgsNyBAQAogewogICAgIE5FX1RZUEVJTkZPICpwVHlwZUluZm87CiAgICAgTkVfTkFNRUlORk8gKnBOYW1lSW5mbyA9IE5VTEw7Ci0gICAgTkVfTU9EVUxFICpwTW9kdWxlID0gTU9EVUxFX0dldFB0cjE2KCBoTW9kdWxlICk7CisgICAgTkVfTU9EVUxFICpwTW9kdWxlID0gTkVfR2V0UHRyKCBoTW9kdWxlICk7CiAgICAgaW50IGQ7CiAKICAgICBUUkFDRSggcmVzb3VyY2UsICJtb2R1bGU9JTA0eCByZXM9JTA0eFxuIiwgaE1vZHVsZSwgaFJzcmMgKTsKQEAgLTQ2NCw3ICs0NjQsNyBAQAogCSAgCWxvYWRlciA9IChSRVNPVVJDRUhBTkRMRVIxNilwVHlwZUluZm8tPnJlc2xvYWRlcjsKIAkgICAgZWxzZSAvKiB0aGlzIGlzIHJlYWxseSBiYWQgKi8KIAkgICAgewotCQlmcHJpbnRmKCBzdGRlcnIsICJbJTA0eF06IE1pc3NpbmcgcmVzb3VyY2UgaGFuZGxlciEhIS4uLlxuIiwgaE1vZHVsZSk7CisJCUVSUihyZXNvdXJjZSwgIlslMDR4XTogTWlzc2luZyByZXNvdXJjZSBoYW5kbGVyIVxuIiwgaE1vZHVsZSk7CiAJCWxvYWRlciA9IE5FX0RlZlJlc291cmNlSGFuZGxlcjsKIAkgICAgfQogCkBAIC01MTMsOCArNTEzLDcgQEAKICAgICBORV9UWVBFSU5GTyAqcFR5cGVJbmZvOwogICAgIE5FX05BTUVJTkZPICpwTmFtZUluZm87CiAgICAgV09SRCBjb3VudDsKLSAgICBITU9EVUxFMTYgaE1vZHVsZSAgPSBHZXRFeGVQdHIoIGhhbmRsZSApOwotICAgIE5FX01PRFVMRSAqcE1vZHVsZSA9IE1PRFVMRV9HZXRQdHIxNiggaE1vZHVsZSApOworICAgIE5FX01PRFVMRSAqcE1vZHVsZSA9IE5FX0dldFB0ciggR2V0RXhlUHRyKGhhbmRsZSkgKTsKIAogICAgIGlmICghaGFuZGxlIHx8ICFwTW9kdWxlIHx8ICFwTW9kdWxlLT5yZXNfdGFibGUpIHJldHVybiBoYW5kbGU7CiAKQEAgLTU0NSw3ICs1NDQsNyBAQAogICAgIH0KIAogICAgIFRSQUNFKHJlc291cmNlLCAiWyUwNHhdOiBubyBpbnRyaW5zaWMgcmVzb3VyY2UgZm9yICUwNHgsIGFzc3VtaW5nIERpcmVjdFJlc0FsbG9jKCkhXG4iLCAKLQkJIGhNb2R1bGUsIGhhbmRsZSApOworICAgICAgICAgIHBNb2R1bGUtPnNlbGYsIGhhbmRsZSApOwogICAgIEdsb2JhbEZyZWUxNiggaGFuZGxlICk7IAogICAgIHJldHVybiBoYW5kbGU7CiB9CmRpZmYgLS1naXQgYS9sb2FkZXIvbmUvc2VnbWVudC5jIGIvbG9hZGVyL25lL3NlZ21lbnQuYwppbmRleCA5OWY3OGNlLi5hNjQ3OGE1IDEwMDY0NAotLS0gYS9sb2FkZXIvbmUvc2VnbWVudC5jCisrKyBiL2xvYWRlci9uZS9zZWdtZW50LmMKQEAgLTcyLDcgKzcyLDcgQEAKIAogICAgIGlmICghcFNlZy0+ZmlsZXBvcykgcmV0dXJuIFRSVUU7ICAvKiBObyBmaWxlIGltYWdlLCBqdXN0IHJldHVybiAqLwogCQotICAgIGZkID0gTU9EVUxFX09wZW5GaWxlKCBwTW9kdWxlLT5zZWxmICk7CisgICAgZmQgPSBORV9PcGVuRmlsZSggcE1vZHVsZSApOwogICAgIFRSQUNFKG1vZHVsZSwgIkxvYWRpbmcgc2VnbWVudCAlZCwgc2VsZWN0b3I9JTA0eCwgZmxhZ3M9JTA0eFxuIiwKICAgICAgICAgICAgICAgICAgICAgc2VnbnVtLCBwU2VnLT5zZWxlY3RvciwgcFNlZy0+ZmxhZ3MgKTsKICAgICBsc2VlayggZmQsIHBTZWctPmZpbGVwb3MgPDwgcE1vZHVsZS0+YWxpZ25tZW50LCBTRUVLX1NFVCApOwpAQCAtMTE4LDggKzExOCw4IEBACiAgCQkgICBwU2VnLT5taW5zaXplID8gcFNlZy0+bWluc2l6ZSA6IDB4MTAwMDApOwogIAkgICAgRnJlZVNlbGVjdG9yKG5ld3NlbGVjdG9yKTsKICAJICAgIHBTZWctPnNlbGVjdG9yID0gb2xkc2VsZWN0b3I7Ci0gCSAgICBmcHJpbnRmKHN0ZGVyciwgIkEgbmV3IHNlbGVjdG9yIHdhcyBhbGxvY2F0ZWQgZm9yIHRoZSBkZ3JvdXAgc2VnbWVudFxuIgotIAkJICAgICJPbGQgc2VsZWN0b3IgaXMgJWQsIG5ldyBvbmUgaXMgJWQiLCBvbGRzZWxlY3RvciwgbmV3c2VsZWN0b3IpOworIAkgICAgVFJBQ0UobW9kdWxlLCAiTmV3IHNlbGVjdG9yIGFsbG9jYXRlZCBmb3IgZGdyb3VwIHNlZ21lbnQ6T2xkPSVkLE5ldz0lZFxuIiwgCisgICAgICAgICAgICAgICAgb2xkc2VsZWN0b3IsIG5ld3NlbGVjdG9yKTsKICAJICB9IGVsc2UgewogIAkgICAgRnJlZVNlbGVjdG9yKHBTZWctPnNlbGVjdG9yKTsKICAJICAgIHBTZWctPnNlbGVjdG9yID0gbmV3c2VsZWN0b3I7CkBAIC0yMDEsMjIgKzIwMSwyMiBAQAogICAgICAgICAgICAgYWRkcmVzcyA9IE5FX0dldEVudHJ5UG9pbnQoIG1vZHVsZSwgb3JkaW5hbCApOwogICAgICAgICAgICAgaWYgKCFhZGRyZXNzKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE5FX01PRFVMRSAqcFRhcmdldCA9IE1PRFVMRV9HZXRQdHIxNiggbW9kdWxlICk7CisgICAgICAgICAgICAgICAgTkVfTU9EVUxFICpwVGFyZ2V0ID0gTkVfR2V0UHRyKCBtb2R1bGUgKTsKICAgICAgICAgICAgICAgICBpZiAoIXBUYXJnZXQpCi0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIk1vZHVsZSBub3QgZm91bmQ6ICUwNHgsIHJlZmVyZW5jZSAlZCBvZiBtb2R1bGUgJSouKnNcbiIsCisgICAgICAgICAgICAgICAgICAgIFdBUk4obW9kdWxlLCAiTW9kdWxlIG5vdCBmb3VuZDogJTA0eCwgcmVmZXJlbmNlICVkIG9mIG1vZHVsZSAlKi4qc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLCByZXAtPnRhcmdldDEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKChCWVRFICopcE1vZHVsZSArIHBNb2R1bGUtPm5hbWVfdGFibGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKChCWVRFICopcE1vZHVsZSArIHBNb2R1bGUtPm5hbWVfdGFibGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKXBNb2R1bGUgKyBwTW9kdWxlLT5uYW1lX3RhYmxlICsgMSApOwogICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiV2FybmluZzogbm8gaGFuZGxlciBmb3IgJS4qcy4lZCwgc2V0dGluZyB0byAwOjBcbiIsCisgICAgICAgICAgICAgICAgICAgIFdBUk4obW9kdWxlLCAiTm8gaGFuZGxlciBmb3IgJS4qcy4lZCwgc2V0dGluZyB0byAwOjBcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKigoQllURSAqKXBUYXJnZXQgKyBwVGFyZ2V0LT5uYW1lX3RhYmxlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKXBUYXJnZXQgKyBwVGFyZ2V0LT5uYW1lX3RhYmxlICsgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRpbmFsICk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoVFJBQ0VfT04oZml4dXApKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE5FX01PRFVMRSAqcFRhcmdldCA9IE1PRFVMRV9HZXRQdHIxNiggbW9kdWxlICk7CisgICAgICAgICAgICAgICAgTkVfTU9EVUxFICpwVGFyZ2V0ID0gTkVfR2V0UHRyKCBtb2R1bGUgKTsKICAgICAgICAgICAgICAgICBUUkFDRSggZml4dXAsICIlZDogJS4qcy4lZD0lMDR4OiUwNHggJXNcbiIsIGkgKyAxLCAKICAgICAgICAgICAgICAgICAgICAgICAgKigoQllURSAqKXBUYXJnZXQgKyBwVGFyZ2V0LT5uYW1lX3RhYmxlKSwKICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKilwVGFyZ2V0ICsgcFRhcmdldC0+bmFtZV90YWJsZSArIDEsCkBAIC0yMzYsMTQgKzIzNiwxNCBAQAogCiAgICAgICAgICAgICBpZiAoRVJSX09OKGZpeHVwKSAmJiAhYWRkcmVzcykKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBORV9NT0RVTEUgKnBUYXJnZXQgPSBNT0RVTEVfR2V0UHRyMTYoIG1vZHVsZSApOworICAgICAgICAgICAgICAgIE5FX01PRFVMRSAqcFRhcmdldCA9IE5FX0dldFB0ciggbW9kdWxlICk7CiAgICAgICAgICAgICAgICAgRVJSKGZpeHVwLCAiV2FybmluZzogbm8gaGFuZGxlciBmb3IgJS4qcy4lcywgc2V0dGluZyB0byAwOjBcbiIsCiAgICAgICAgICAgICAgICAgICAgICooKEJZVEUgKilwVGFyZ2V0ICsgcFRhcmdldC0+bmFtZV90YWJsZSksCiAgICAgICAgICAgICAgICAgICAgIChjaGFyICopcFRhcmdldCArIHBUYXJnZXQtPm5hbWVfdGFibGUgKyAxLCBmdW5jX25hbWUgKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChUUkFDRV9PTihmaXh1cCkpCiAgICAgICAgICAgICB7Ci0JICAgICAgICBORV9NT0RVTEUgKnBUYXJnZXQgPSBNT0RVTEVfR2V0UHRyMTYoIG1vZHVsZSApOworCSAgICAgICAgTkVfTU9EVUxFICpwVGFyZ2V0ID0gTkVfR2V0UHRyKCBtb2R1bGUgKTsKICAgICAgICAgICAgICAgICBUUkFDRSggZml4dXAsICIlZDogJS4qcy4lcz0lMDR4OiUwNHggJXNcbiIsIGkgKyAxLCAKICAgICAgICAgICAgICAgICAgICAgICAgKigoQllURSAqKXBUYXJnZXQgKyBwVGFyZ2V0LT5uYW1lX3RhYmxlKSwKICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKilwVGFyZ2V0ICsgcFRhcmdldC0+bmFtZV90YWJsZSArIDEsCkBAIC0yODgsOCArMjg4LDEyIEBACiAgICAgICAgIC8qIEFwcGFyZW50bHksIGhpZ2ggYml0IG9mIGFkZHJlc3NfdHlwZSBpcyBzb21ldGltZXMgc2V0OyAqLwogICAgICAgICAvKiB3ZSBpZ25vcmUgaXQgZm9yIG5vdyAqLwogCWlmIChyZXAtPmFkZHJlc3NfdHlwZSA+IE5FX1JBRERSX09GRlNFVDMyKQorICAgICAgICB7CisgICAgICAgICAgICBjaGFyIG1vZHVsZVsxMF07CisgICAgICAgICAgICBHZXRNb2R1bGVOYW1lKCBwTW9kdWxlLT5zZWxmLCBtb2R1bGUsIHNpemVvZihtb2R1bGUpICk7CiAgICAgICAgICAgICBFUlIoIGZpeHVwLCAiV0FSTklORzogbW9kdWxlICVzOiB1bmtub3duIHJlbG9jIGFkZHIgdHlwZSA9IDB4JTAyeC4gUGxlYXNlIHJlcG9ydC5cbiIsCi0gICAgICAgICAgICAgICAgIE1PRFVMRV9HZXRNb2R1bGVOYW1lKHBNb2R1bGUtPnNlbGYpLCByZXAtPmFkZHJlc3NfdHlwZSApOworICAgICAgICAgICAgICAgICBtb2R1bGUsIHJlcC0+YWRkcmVzc190eXBlICk7CisgICAgICAgIH0KIAogICAgICAgICBpZiAoYWRkaXRpdmUpCiAgICAgICAgIHsKQEAgLTQwNSw3ICs0MDksNyBAQAogICAgICAgICBzdGFjazE2VG9wLT5pcCA9IDA7CiAgICAgICAgIHN0YWNrMTZUb3AtPmNzID0gMDsKIAotICAgICAgICBoZiA9IEZJTEVfRHVwVW5peEhhbmRsZSggTU9EVUxFX09wZW5GaWxlKCBwTW9kdWxlLT5zZWxmICkgKTsKKyAgICAgICAgaGYgPSBGSUxFX0R1cFVuaXhIYW5kbGUoIE5FX09wZW5GaWxlKCBwTW9kdWxlICkgKTsKICAgICAgICAgQ2FsbGJhY2tzLT5DYWxsQm9vdEFwcFByb2Moc2VsZmxvYWRoZWFkZXItPkJvb3RBcHAsIHBNb2R1bGUtPnNlbGYsIGhmKTsKICAgICAgICAgX2xjbG9zZTMyKGhmKTsKICAgICAgICAgLyogc29tZSBCb290QXBwIHByb2NzIG92ZXJ3cml0ZSB0aGUgc2VsZWN0b3Igb2YgZGdyb3VwICovCkBAIC00OTAsNyArNDk0LDcgQEAKIAkJCWlmIChwTW9kdWxlLT5mbGFncyAmIE5FX0ZGTEFHU19NVUxUSVBMRURBVEEpCiAgICAgICAgICAgICAgICAgICAgICAgICB7CiAJCQkgICAgLyogY2FuIHRoaXMgaGFwcGVuPyAqLwotCQkJICAgIGZwcmludGYoIHN0ZGVyciwgIkZpeHVwUHJvbG9ncyBnb3QgY29uZnVzZWRcbiIgKTsKKwkJCSAgICBFUlIoZml4dXAsICJGaXh1cFByb2xvZ3MgZ290IGNvbmZ1c2VkXG4iICk7CiAJCQl9CiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChwTW9kdWxlLT5mbGFncyAmIE5FX0ZGTEFHU19TSU5HTEVEQVRBKQogICAgICAgICAgICAgICAgICAgICAgICAgewpAQCAtNTIzLDkgKzUyNyw4IEBACiAgKgogICogQ2FsbCB0aGUgRExMIGluaXRpYWxpemF0aW9uIGNvZGUKICAqLwotc3RhdGljIEJPT0wzMiBORV9Jbml0RExMKCBUREIqIHBUYXNrLCBITU9EVUxFMTYgaE1vZHVsZSApCitzdGF0aWMgQk9PTDMyIE5FX0luaXRETEwoIFREQiogcFRhc2ssIE5FX01PRFVMRSAqcE1vZHVsZSApCiB7Ci0gICAgTkVfTU9EVUxFICpwTW9kdWxlOwogICAgIFNFR1RBQkxFRU5UUlkgKnBTZWdUYWJsZTsKICAgICBDT05URVhUIGNvbnRleHQ7CiAKQEAgLTUzNiw3ICs1MzksNiBAQAogICAgICAqIGVzOnNpICBjb21tYW5kIGxpbmUgKGFsd2F5cyAwKQogICAgICAqLwogCi0gICAgaWYgKCEocE1vZHVsZSA9IE1PRFVMRV9HZXRQdHIxNiggaE1vZHVsZSApKSkgcmV0dXJuIEZBTFNFOwogICAgIHBTZWdUYWJsZSA9IE5FX1NFR19UQUJMRSggcE1vZHVsZSApOwogCiAgICAgaWYgKCEocE1vZHVsZS0+ZmxhZ3MgJiBORV9GRkxBR1NfTElCTU9EVUxFKSB8fApAQCAtNTQ4LDcgKzU1MCw3IEBACiAKICAgICBpZiAocFRhc2sgJiYgcFRhc2stPnVzZXJoYW5kbGVyKQogICAgIHsKLSAgICAgICAgcFRhc2stPnVzZXJoYW5kbGVyKCBoTW9kdWxlLCBVU0lHX0RMTF9MT0FELCAwLCBwVGFzay0+aEluc3RhbmNlLAorICAgICAgICBwVGFzay0+dXNlcmhhbmRsZXIoIHBNb2R1bGUtPnNlbGYsIFVTSUdfRExMX0xPQUQsIDAsIHBUYXNrLT5oSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRhc2stPmhRdWV1ZSApOwogICAgIH0KIApAQCAtNTYxLDcgKzU2Myw3IEBACiAgICAgICAgIGlmIChwTW9kdWxlLT5mbGFncyAmIE5FX0ZGTEFHU19NVUxUSVBMRURBVEEgfHwgcE1vZHVsZS0+ZGdyb3VwKQogICAgICAgICB7CiAgICAgICAgICAgICAvKiBOb3QgU0lOR0xFREFUQSAqLwotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJMaWJyYXJ5IGlzIG5vdCBtYXJrZWQgU0lOR0xFREFUQVxuIik7CisgICAgICAgICAgICBFUlIoZGxsLCAiTGlicmFyeSBpcyBub3QgbWFya2VkIFNJTkdMRURBVEFcbiIpOwogICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICAgfQogICAgICAgICBlbHNlICAvKiBEQVRBIE5PTkUgRExMICovCkBAIC01ODksNyArNTkxLDcgQEAKICAgICBFSVBfcmVnKCZjb250ZXh0KSA9IHBNb2R1bGUtPmlwOwogICAgIEVCUF9yZWcoJmNvbnRleHQpID0gT0ZGU0VUT0YoVEhSRUFEX0N1cnJlbnQoKS0+Y3VyX3N0YWNrKQogICAgICAgICAgICAgICAgICAgICAgICAgICArIChXT1JEKSYoKFNUQUNLMTZGUkFNRSopMCktPmJwOwotICAgIEVESV9yZWcoJmNvbnRleHQpID0gRFNfcmVnKCZjb250ZXh0KSA/IERTX3JlZygmY29udGV4dCkgOiBoTW9kdWxlOworICAgIEVESV9yZWcoJmNvbnRleHQpID0gRFNfcmVnKCZjb250ZXh0KSA/IERTX3JlZygmY29udGV4dCkgOiBwTW9kdWxlLT5zZWxmOwogCiAKICAgICBwTW9kdWxlLT5jcyA9IDA7ICAvKiBEb24ndCBpbml0aWFsaXplIGl0IHR3aWNlICovCkBAIC02MDAsNiArNjAyLDQ0IEBACiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIE5FX0NhbGxEbGxFbnRyeVBvaW50CisgKgorICogQ2FsbCB0aGUgRGxsRW50cnlQb2ludCBvZiBETExzIHdpdGggc3Vic3lzdGVtID49IDQuMCAKKyAqLworCitzdGF0aWMgdm9pZCBORV9DYWxsRGxsRW50cnlQb2ludCggTkVfTU9EVUxFICpwTW9kdWxlLCBEV09SRCBkd1JlYXNvbiApCit7CisgICAgRkFSUFJPQzE2IGVudHJ5UG9pbnQ7CisgICAgV09SRCBvcmRpbmFsOworICAgIENPTlRFWFQgY29udGV4dDsKKyAgICBUSERCICp0aGRiID0gVEhSRUFEX0N1cnJlbnQoKTsKKyAgICBMUEJZVEUgc3RhY2sgPSAoTFBCWVRFKVRIUkVBRF9TVEFDSzE2KHRoZGIpOworCisgICAgaWYgKHBNb2R1bGUtPmV4cGVjdGVkX3ZlcnNpb24gPCAweDA0MDApIHJldHVybjsKKyAgICBpZiAoIShvcmRpbmFsID0gTkVfR2V0T3JkaW5hbCggcE1vZHVsZS0+c2VsZiwgIkRsbEVudHJ5UG9pbnQiICkpKSByZXR1cm47CisgICAgaWYgKCEoZW50cnlQb2ludCA9IE5FX0dldEVudHJ5UG9pbnQoIHBNb2R1bGUtPnNlbGYsIG9yZGluYWwgKSkpIHJldHVybjsKKworICAgIG1lbXNldCggJmNvbnRleHQsIDAsIHNpemVvZihjb250ZXh0KSApOworCisgICAgQ1NfcmVnKCZjb250ZXh0KSA9IEhJV09SRChlbnRyeVBvaW50KTsKKyAgICBJUF9yZWcoJmNvbnRleHQpID0gTE9XT1JEKGVudHJ5UG9pbnQpOworICAgIEVCUF9yZWcoJmNvbnRleHQpID0gIE9GRlNFVE9GKCB0aGRiLT5jdXJfc3RhY2sgKQorICAgICAgICAgICAgICAgICAgICAgICAgICsgKFdPUkQpJigoU1RBQ0sxNkZSQU1FKikwKS0+YnA7CisKKyAgICAqKERXT1JEICopKHN0YWNrIC0gIDQpID0gZHdSZWFzb247ICAgICAgLyogZHdSZWFzb24gKi8KKyAgICAqKFdPUkQgKikgKHN0YWNrIC0gIDYpID0gcE1vZHVsZS0+c2VsZjsgLyogaEluc3QgKi8KKyAgICAqKFdPUkQgKikgKHN0YWNrIC0gIDgpID0gMDsgICAgICAgICAgICAgLyogd0RTICovCisgICAgKihXT1JEICopIChzdGFjayAtIDEwKSA9IDA7ICAgICAgICAgICAgIC8qIHdIZWFwU2l6ZSAqLworICAgICooRFdPUkQgKikoc3RhY2sgLSAxNCkgPSAwOyAgICAgICAgICAgICAvKiBkd1Jlc2VydmVkMSAqLworICAgICooV09SRCAqKSAoc3RhY2sgLSAxNikgPSAwOyAgICAgICAgICAgICAvKiB3UmVzZXJ2ZWQyICovCisKKyAgICBUUkFDRShkbGwsICJDYWxsaW5nIERsbEVudHJ5UG9pbnQsIGNzOmlwPSUwNGx4OiUwNHhcbiIsCisgICAgICAgICAgQ1NfcmVnKCZjb250ZXh0KSwgSVBfcmVnKCZjb250ZXh0KSk7CisKKyAgICBDYWxsYmFja3MtPkNhbGxSZWdpc3RlclNob3J0UHJvYyggJmNvbnRleHQsIDE2ICk7Cit9CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTkVfSW5pdGlhbGl6ZURMTHMKQEAgLTYxMyw4ICs2NTMsOCBAQAogICAgIE5FX01PRFVMRSAqcE1vZHVsZTsKICAgICBITU9EVUxFMTYgKnBETEw7CiAKLSAgICBpZiAoIShwTW9kdWxlID0gTU9EVUxFX0dldFB0cjE2KCBoTW9kdWxlICkpKSByZXR1cm47Ci0gICAgaWYgKHBNb2R1bGUtPmZsYWdzICYgTkVfRkZMQUdTX1dJTjMyKSByZXR1cm47CisgICAgaWYgKCEocE1vZHVsZSA9IE5FX0dldFB0ciggaE1vZHVsZSApKSkgcmV0dXJuOworICAgIGFzc2VydCggIShwTW9kdWxlLT5mbGFncyAmIE5FX0ZGTEFHU19XSU4zMikgKTsKIAogICAgIGlmIChwTW9kdWxlLT5kbGxzX3RvX2luaXQpCiAgICAgewpAQCAtNjI2LDcgKzY2Niw0NyBAQAogICAgICAgICB9CiAgICAgICAgIEdsb2JhbEZyZWUxNiggdG9faW5pdCApOwogICAgIH0KLSAgICBORV9Jbml0RExMKCBwVGFzaywgaE1vZHVsZSApOworICAgIE5FX0luaXRETEwoIHBUYXNrLCBwTW9kdWxlICk7CisgICAgTkVfQ2FsbERsbEVudHJ5UG9pbnQoIHBNb2R1bGUsIERMTF9QUk9DRVNTX0FUVEFDSCApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIE5FX0NyZWF0ZUluc3RhbmNlCisgKgorICogSWYgbGliX29ubHkgaXMgVFJVRSwgaGFuZGxlIHRoZSBtb2R1bGUgbGlrZSBhIGxpYnJhcnkgZXZlbiBpZiBpdCBpcyBhIC5FWEUKKyAqLworSElOU1RBTkNFMTYgTkVfQ3JlYXRlSW5zdGFuY2UoIE5FX01PRFVMRSAqcE1vZHVsZSwgSElOU1RBTkNFMTYgKnByZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTDMyIGxpYl9vbmx5ICkKK3sKKyAgICBTRUdUQUJMRUVOVFJZICpwU2VnbWVudDsKKyAgICBpbnQgbWluc2l6ZTsKKyAgICBISU5TVEFOQ0UxNiBoTmV3SW5zdGFuY2U7CisKKyAgICBpZiAocE1vZHVsZS0+ZGdyb3VwID09IDApCisgICAgeworICAgICAgICBpZiAocHJldikgKnByZXYgPSBwTW9kdWxlLT5zZWxmOworICAgICAgICByZXR1cm4gcE1vZHVsZS0+c2VsZjsKKyAgICB9CisKKyAgICBwU2VnbWVudCA9IE5FX1NFR19UQUJMRSggcE1vZHVsZSApICsgcE1vZHVsZS0+ZGdyb3VwIC0gMTsKKyAgICBpZiAocHJldikgKnByZXYgPSBwU2VnbWVudC0+c2VsZWN0b3I7CisKKyAgICAgIC8qIGlmIGl0J3MgYSBsaWJyYXJ5LCBjcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb25seSB0aGUgZmlyc3QgdGltZSAqLworICAgIGlmIChwU2VnbWVudC0+c2VsZWN0b3IpCisgICAgeworICAgICAgICBpZiAocE1vZHVsZS0+ZmxhZ3MgJiBORV9GRkxBR1NfTElCTU9EVUxFKSByZXR1cm4gcFNlZ21lbnQtPnNlbGVjdG9yOworICAgICAgICBpZiAobGliX29ubHkpIHJldHVybiBwU2VnbWVudC0+c2VsZWN0b3I7CisgICAgfQorCisgICAgbWluc2l6ZSA9IHBTZWdtZW50LT5taW5zaXplID8gcFNlZ21lbnQtPm1pbnNpemUgOiAweDEwMDAwOworICAgIGlmIChwTW9kdWxlLT5zcyA9PSBwTW9kdWxlLT5kZ3JvdXApIG1pbnNpemUgKz0gcE1vZHVsZS0+c3RhY2tfc2l6ZTsKKyAgICBtaW5zaXplICs9IHBNb2R1bGUtPmhlYXBfc2l6ZTsKKyAgICBoTmV3SW5zdGFuY2UgPSBHTE9CQUxfQWxsb2MoIEdNRU1fWkVST0lOSVQgfCBHTUVNX0ZJWEVELCBtaW5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1vZHVsZS0+c2VsZiwgRkFMU0UsIEZBTFNFLCBGQUxTRSApOworICAgIGlmICghaE5ld0luc3RhbmNlKSByZXR1cm4gMDsKKyAgICBwU2VnbWVudC0+c2VsZWN0b3IgPSBoTmV3SW5zdGFuY2U7CisgICAgcmV0dXJuIGhOZXdJbnN0YW5jZTsKIH0KIAogCkBAIC02MzksNyArNzE5LDcgQEAKIC8qIEl0IGRvZXMgbm90aGluZyAqLwogdm9pZCBXSU5BUEkgUGF0Y2hDb2RlSGFuZGxlKEhBTkRMRTE2IGhTZWwpCiB7Ci0JZnByaW50ZihzdGRlcnIsIlBhdGNoQ29kZUhhbmRsZSglMDR4KSxzdHViIVxuIixoU2VsKTsKKyAgICBGSVhNRShtb2R1bGUsIiglMDR4KTogc3R1Yi5cbiIsaFNlbCk7CiB9CiAKIApAQCAtNjgyLDEzICs3NjIsMTEgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIE5FX0NyZWF0ZVNlZ21lbnRzCiAgKi8KLUJPT0wzMiBORV9DcmVhdGVTZWdtZW50cyggSE1PRFVMRTE2IGhNb2R1bGUgKQorQk9PTDMyIE5FX0NyZWF0ZVNlZ21lbnRzKCBORV9NT0RVTEUgKnBNb2R1bGUgKQogewogICAgIFNFR1RBQkxFRU5UUlkgKnBTZWdtZW50OwotICAgIE5FX01PRFVMRSAqcE1vZHVsZTsKICAgICBpbnQgaSwgbWluc2l6ZTsKIAotICAgIGlmICghKHBNb2R1bGUgPSBNT0RVTEVfR2V0UHRyMTYoIGhNb2R1bGUgKSkpIHJldHVybiBGQUxTRTsKICAgICBhc3NlcnQoICEocE1vZHVsZS0+ZmxhZ3MgJiBORV9GRkxBR1NfV0lOMzIpICk7CiAKICAgICBwU2VnbWVudCA9IE5FX1NFR19UQUJMRSggcE1vZHVsZSApOwpAQCAtNjk2LDEwICs3NzQsMTAgQEAKICAgICB7CiAgICAgICAgIG1pbnNpemUgPSBwU2VnbWVudC0+bWluc2l6ZSA/IHBTZWdtZW50LT5taW5zaXplIDogMHgxMDAwMDsKICAgICAgICAgaWYgKGkgPT0gcE1vZHVsZS0+c3MpIG1pbnNpemUgKz0gcE1vZHVsZS0+c3RhY2tfc2l6ZTsKLQkvKiBUaGUgREdST1VQIGlzIGFsbG9jYXRlZCBieSBNT0RVTEVfQ3JlYXRlSW5zdGFuY2UgKi8KKwkvKiBUaGUgREdST1VQIGlzIGFsbG9jYXRlZCBieSBORV9DcmVhdGVJbnN0YW5jZSAqLwogICAgICAgICBpZiAoaSA9PSBwTW9kdWxlLT5kZ3JvdXApIGNvbnRpbnVlOwogICAgICAgICBwU2VnbWVudC0+c2VsZWN0b3IgPSBHTE9CQUxfQWxsb2MoIE5FX05lMk1lbUZsYWdzKHBTZWdtZW50LT5mbGFncyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbnNpemUsIGhNb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbnNpemUsIHBNb2R1bGUtPnNlbGYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEocFNlZ21lbnQtPmZsYWdzICYgTkVfU0VHRkxBR1NfREFUQSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFIC8qcFNlZ21lbnQtPmZsYWdzICYgTkVfU0VHRkxBR1NfUkVBRE9OTFkqLyApOwpAQCAtNzEwLDMgKzc4OCwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwTW9kdWxlLT5kZ3JvdXAgLSAxKSAqIHNpemVvZihTRUdUQUJMRUVOVFJZKSA6IDA7CiAgICAgcmV0dXJuIFRSVUU7CiB9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCSAgICBJc1NoYXJlZFNlbGVjdG9yICAgIChLRVJORUwuMzQ1KQorICovCitCT09MMTYgV0lOQVBJIElzU2hhcmVkU2VsZWN0b3IoIEhBTkRMRTE2IHNlbGVjdG9yICkKK3sKKyAgICAvKiBDaGVjayB3aGV0aGVyIHRoZSBzZWxlY3RvciBiZWxvbmdzIHRvIGEgRExMICovCisgICAgTkVfTU9EVUxFICpwTW9kdWxlID0gTkVfR2V0UHRyKCBzZWxlY3RvciApOworICAgIGlmICghcE1vZHVsZSkgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiAocE1vZHVsZS0+ZmxhZ3MgJiBORV9GRkxBR1NfTElCTU9EVUxFKSAhPSAwOworfQpkaWZmIC0tZ2l0IGEvbG9hZGVyL3BlX2ltYWdlLmMgYi9sb2FkZXIvcGVfaW1hZ2UuYwppbmRleCAxMmM5NjJlLi4zZDJkZmJkIDEwMDY0NAotLS0gYS9sb2FkZXIvcGVfaW1hZ2UuYworKysgYi9sb2FkZXIvcGVfaW1hZ2UuYwpAQCAtMjQxLDE4ICsyNDEsMTQgQEAKIAkvKiBkb24ndCB1c2UgTU9EVUxFX0xvYWQsIFdpbjMyIGNyZWF0ZXMgbmV3IHRhc2sgZGlmZmVyZW50bHkgKi8KIAlyZXMgPSBQRV9Mb2FkTGlicmFyeUV4MzJBKCBuYW1lLCBwcm9jZXNzLCAwLCAwICk7CiAJaWYgKHJlcyA8PSAoSE1PRFVMRTMyKSAzMikgewotCSAgICBjaGFyIGJ1ZmZlclsxMDI0XTsKLQotCSAgICAvKiBUcnkgd2l0aCBwcmVwZW5kaW5nIHRoZSBwYXRoIG9mIHRoZSBjdXJyZW50IG1vZHVsZSAqLwotCSAgICBpZiAoR2V0TW9kdWxlRmlsZU5hbWUzMkEoIHdtLT5tb2R1bGUsIGJ1ZmZlciwgc2l6ZW9mIChidWZmZXIpKSkgewotCSAgICAgICAgY2hhciAqcDsKLQotCQlpZiAoIShwID0gc3RycmNociAoYnVmZmVyLCAnXFwnKSkpCi0JCSAgICBwID0gYnVmZmVyOwotCQlzdHJjcHkgKHAgKyAxLCBuYW1lKTsKLQkJcmVzID0gUEVfTG9hZExpYnJhcnlFeDMyQSggYnVmZmVyLCBwcm9jZXNzLCAwLCAwICk7Ci0JICAgIH0gZWxzZQotCSAgICAJRVJSKHdpbjMyLCJjYW5ub3QgZmluZCB0aGUgbW9kdWxlIGp1c3QgbG9hZGVkIVxuIik7CisJICAgIGNoYXIgKnAsYnVmZmVyWzIwMDBdOworCSAgICAKKwkgICAgLyogR2V0TW9kdWxlRmlsZU5hbWUgd291bGQgdXNlIHRoZSB3cm9uZyBwcm9jZXNzLCBzbyBkb24ndCB1c2UgaXQgKi8KKwkgICAgc3RyY3B5KGJ1ZmZlcix3bS0+c2hvcnRuYW1lKTsKKwkgICAgaWYgKCEocCA9IHN0cnJjaHIgKGJ1ZmZlciwgJ1xcJykpKQorCQlwID0gYnVmZmVyOworCSAgICBzdHJjcHkgKHAgKyAxLCBuYW1lKTsKKwkgICAgcmVzID0gUEVfTG9hZExpYnJhcnlFeDMyQSggYnVmZmVyLCBwcm9jZXNzLCAwLCAwICk7CiAJfQogCWlmIChyZXMgPD0gKEhNT0RVTEUzMikgMzIpIHsKIAkgICAgV0FSTiAobW9kdWxlLCAiTW9kdWxlICVzIG5vdCBmb3VuZFxuIiwgbmFtZSk7CkBAIC01MzMsMzYgKzUyOSwzMiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFRoaXMgbWFwcyBhIGxvYWRlZCBQRSBkbGwgaW50byB0aGUgYWRkcmVzcyBzcGFjZSBvZiB0aGUgc3BlY2lmaWVkIHByb2Nlc3MuCiAgKi8KLXN0YXRpYyBCT09MMzIgUEVfTWFwSW1hZ2UoIEhNT0RVTEUzMiAqcGhNb2R1bGUsIFBEQjMyICpwcm9jZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgT0ZTVFJVQ1QgKm9mcywgRFdPUkQgZmxhZ3MgKQorc3RhdGljIEJPT0wzMiBQRV9NYXBJbWFnZSggUERCMzIgKnByb2Nlc3MsV0lORV9NT0RSRUYgKndtLCBPRlNUUlVDVCAqb2ZzLCBEV09SRCBmbGFncyApCiB7Ci0JV0lORV9NT0RSRUYJCSp3bTsKIAlQRV9NT0RSRUYJCSpwZW07CiAJaW50CQkJaSwgcmVzdWx0OwogCURXT1JECQkJbG9hZF9hZGRyOwogCUlNQUdFX0RBVEFfRElSRUNUT1JZCWRpcjsKIAljaGFyCQkJKm1vZG5hbWU7CiAJaW50CQkJdm1hX3NpemU7Ci0JSE1PRFVMRTMyCQloTW9kdWxlID0gKnBoTW9kdWxlOworCUhNT0RVTEUzMgkJaE1vZHVsZSA9IHdtLT5tb2R1bGU7CiAKICAgICAgICAgSU1BR0VfU0VDVElPTl9IRUFERVIgKnBlX3NlZzsKICAgICAgICAgSU1BR0VfRE9TX0hFQURFUiAqZG9zX2hlYWRlciA9IChJTUFHRV9ET1NfSEVBREVSICopaE1vZHVsZTsKICAgICAgICAgSU1BR0VfTlRfSEVBREVSUyAqbnRfaGVhZGVyID0gUEVfSEVBREVSKGhNb2R1bGUpOwogCQotCi0Jd20gPSAoV0lORV9NT0RSRUYqKUhlYXBBbGxvYyhwcm9jZXNzLT5oZWFwLEhFQVBfWkVST19NRU1PUlksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKndtKSk7Ci0Jd20tPnR5cGU9IE1PRFVMRTMyX1BFOwogCXBlbSAJPSAmKHdtLT5iaW5mbXQucGUpOwogCi0JLyogTk9URTogZml4dXBfaW1wb3J0cyB0YWtlcyBjYXJlIG9mIHRoZSBjb3JyZWN0IG9yZGVyICovCi0Jd20tPm5leHQJPSBwcm9jZXNzLT5tb2RyZWZfbGlzdDsKLQlwcm9jZXNzLT5tb2RyZWZfbGlzdCA9IHdtOworCXJlc3VsdCA9IEdldExvbmdQYXRoTmFtZTMyQShvZnMtPnN6UGF0aE5hbWUsTlVMTCwwKTsKKwl3bS0+bG9uZ25hbWUgPSAoY2hhciopSGVhcEFsbG9jKHByb2Nlc3MtPmhlYXAsMCxyZXN1bHQrMSk7CisJR2V0TG9uZ1BhdGhOYW1lMzJBKG9mcy0+c3pQYXRoTmFtZSx3bS0+bG9uZ25hbWUscmVzdWx0KzEpOworCisJd20tPnNob3J0bmFtZSA9IEhFQVBfc3RyZHVwQShwcm9jZXNzLT5oZWFwLDAsb2ZzLT5zelBhdGhOYW1lKTsKIAogCWlmICghKG50X2hlYWRlci0+RmlsZUhlYWRlci5DaGFyYWN0ZXJpc3RpY3MgJiBJTUFHRV9GSUxFX0RMTCkpCiAgICAgICAgIHsKIAkJaWYgKHByb2Nlc3MtPmV4ZV9tb2RyZWYpCi0JCQlXQVJOKHdpbjMyLCJvdmVyd3JpdGluZyBvbGQgZXhlX21vZHJlZi4uLiBhcnJnaFxuIik7CisJCQlGSVhNRSh3aW4zMiwib3ZlcndyaXRpbmcgb2xkIGV4ZV9tb2RyZWYuLi4gYXJyZ2hcbiIpOwogCQlwcm9jZXNzLT5leGVfbW9kcmVmID0gd207CiAJfQogCkBAIC01NzcsMTAgKzU2OSwxMCBAQAogCQkJCQkJIE1FTV9SRVNFUlZFIHwgTUVNX0NPTU1JVCwKIAkJCQkJCSBQQUdFX0VYRUNVVEVfUkVBRFdSSVRFICk7CiAJfQotCS8qICpwaE1vZHVsZSBpcyB0aGUgbW9kdWxlMzIgZW50cnkgaW4gdGhlIE5FX01PRFVMRS4gV2UgbmVlZCB0bwotCSAqIGNoYW5nZSBpdCBoZXJlLCBzaW5jZSBpdCBjYW4gZ2V0IHJlZmVyZW5jZWQgYnkgZml4dXBfaW1wb3J0cygpCisJLyogTk9URTogdGhpcyBjaGFuZ2VzIGEgdmFsdWUgaW4gdGhlIHByb2Nlc3MgbW9kcmVmIGNoYWluLCB3aGljaCBjYW4KKwkgKiBiZSBhY2Nlc3NlZCBpbmRlcGVuZGVudGx5IGZyb20gdGhpcyBmdW5jdGlvbgogCSAqLwotCXdtLT5tb2R1bGUgPSAqcGhNb2R1bGUgPSAoSE1PRFVMRTMyKWxvYWRfYWRkcjsKKwl3bS0+bW9kdWxlID0gKEhNT0RVTEUzMilsb2FkX2FkZHI7CiAKIAlUUkFDRSh3aW4zMiwgIkxvYWQgYWRkciBpcyByZWFsbHkgJWx4LCByYW5nZSAleFxuIiwKICAgICAgICAgICAgICAgICAgICAgICBsb2FkX2FkZHIsIHZtYV9zaXplKTsKQEAgLTcxMyw4ICs3MDUsNiBAQAogCQltb2RuYW1lID0gcyA9IG9mcy0+c3pQYXRoTmFtZTsKIAkJd2hpbGUgKChzPXN0cmNocihtb2RuYW1lLCdcXCcpKSkKIAkJCW1vZG5hbWUgPSBzKzE7Ci0JCWlmICgocz1zdHJjaHIobW9kbmFtZSwnLicpKSkKLQkJCSpzPSdcMCc7CiAJCXdtLT5tb2RuYW1lID0gSEVBUF9zdHJkdXBBKHByb2Nlc3MtPmhlYXAsMCxtb2RuYW1lKTsKIAl9CiAJaWYocGVtLT5wZV9pbXBvcnQpCXsKQEAgLTc2MCwxMyArNzUwLDkgQEAKIAlXSU5FX01PRFJFRgkqd207CiAKIAlpZiAoKGhNb2R1bGUgPSBNT0RVTEVfRmluZE1vZHVsZTMyKCBwcm9jZXNzLCBuYW1lICkpKSB7Ci0JCQotCQlwTW9kdWxlID0gTU9EVUxFX0dldFB0cjMyKGhNb2R1bGUpOwogCQlmb3IgKHdtPSBwcm9jZXNzLT5tb2RyZWZfbGlzdDt3bTt3bT13bS0+bmV4dCkKLQkJCWlmICh3bS0+bW9kdWxlID09IGhNb2R1bGUpIHsKLQkJCQlwTW9kdWxlLT5jb3VudCsrOworCQkJaWYgKHdtLT5tb2R1bGUgPT0gaE1vZHVsZSkKIAkJCQlyZXR1cm4gaE1vZHVsZTsKLQkJCX0KIAkJLyogU2luY2UgTU9EVUxFX0ZpbmRNb2R1bGUzMiB1c2VzIHRoZSBtb2RyZWYgY2hhaW4gdG9vLCB0aGUKIAkJICogbW9kdWxlIE1VU1QgaGF2ZSBiZWVuIGZvdW5kIGFib3ZlLiBJZiBub3QsIHNvbWV0aGluZyBoYXMgZ29uZQogCQkgKiB0ZXJyaWJseSB3cm9uZy4KQEAgLTc4MSwzMSArNzY3LDU1IEBACiAJaWYgKEhGSUxFX0VSUk9SMzI9PShoRmlsZT1PcGVuRmlsZTMyKG5hbWUsJm9mcyxPRl9SRUFEKSkpIHsKIAkJLyogTm93IHRyeSB0aGUgYnVpbHQtaW4gZXZlbiBpZiBkaXNhYmxlZCAqLwogCQlpZiAoKGhNb2R1bGUgPSBCVUlMVElOMzJfTG9hZE1vZHVsZSggbmFtZSwgVFJVRSwgcHJvY2VzcyApKSkgewotCQkJZnByaW50Ziggc3RkZXJyLCAiV2FybmluZzogY291bGQgbm90IGxvYWQgZXh0ZXJuYWwgRExMICclcycsIHVzaW5nIGJ1aWx0LWluIG1vZHVsZS5cbiIsIG5hbWUgKTsKLQkJCXJldHVybiBoTW9kdWxlOworCQkgICAgV0FSTiggbW9kdWxlLCAiQ291bGQgbm90IGxvYWQgZXh0ZXJuYWwgRExMICclcycsIHVzaW5nIGJ1aWx0LWluIG1vZHVsZS5cbiIsIG5hbWUgKTsKKwkJICAgIHJldHVybiBoTW9kdWxlOwogCQl9CiAJCXJldHVybiAxOwogCX0KKwkvKiB3aWxsIGdvIGF3YXkgLi4uICovCiAJaWYgKChoTW9kdWxlID0gTU9EVUxFX0NyZWF0ZUR1bW15TW9kdWxlKCAmb2ZzICkpIDwgMzIpIHsKIAkJX2xjbG9zZTMyKGhGaWxlKTsKIAkJcmV0dXJuIGhNb2R1bGU7CiAJfQotCXBNb2R1bGUJCT0gKE5FX01PRFVMRSAqKUdsb2JhbExvY2sxNiggaE1vZHVsZSApOwotCXBNb2R1bGUtPmZsYWdzCT0gTkVfRkZMQUdTX1dJTjMyOwotCXBNb2R1bGUtPm1vZHVsZTMyID0gUEVfTG9hZEltYWdlKCBoRmlsZSApOworCXBNb2R1bGUgICAgICAgICA9IChORV9NT0RVTEUgKilHbG9iYWxMb2NrMTYoIGhNb2R1bGUgKTsKKwlwTW9kdWxlLT5mbGFncyAgPSBORV9GRkxBR1NfV0lOMzI7CisJLyogLi4gKi8KKworCXdtPShXSU5FX01PRFJFRiopSGVhcEFsbG9jKHByb2Nlc3MtPmhlYXAsSEVBUF9aRVJPX01FTU9SWSxzaXplb2YoKndtKSk7CisJd20tPnR5cGUgPSBNT0RVTEUzMl9QRTsKKwkvKiBOT1RFOiBmaXh1cF9pbXBvcnRzIHRha2VzIGNhcmUgb2YgdGhlIGNvcnJlY3Qgb3JkZXIgKi8KKwl3bS0+bmV4dCA9IHByb2Nlc3MtPm1vZHJlZl9saXN0OworCXByb2Nlc3MtPm1vZHJlZl9saXN0ID0gd207CisKKwl3bS0+bW9kdWxlID0gcE1vZHVsZS0+bW9kdWxlMzIgPSBQRV9Mb2FkSW1hZ2UoIGhGaWxlICk7CisKIAlDbG9zZUhhbmRsZSggaEZpbGUgKTsKLSAgICAgICAgaWYgKHBNb2R1bGUtPm1vZHVsZTMyIDwgMzIpIAorICAgICAgICBpZiAod20tPm1vZHVsZSA8IDMyKSAKICAgICAgICAgewotICAgICAgICAgICAgRnJlZUxpYnJhcnkzMiggaE1vZHVsZSk7CisJICAgIHByb2Nlc3MtPm1vZHJlZl9saXN0ID0gd20tPm5leHQ7CisJICAgIEhlYXBGcmVlKHByb2Nlc3MtPmhlYXAsMCx3bSk7CisJICAgIEVSUih3aW4zMiwiY2FuJ3QgbG9hZCAlc1xuIixvZnMuc3pQYXRoTmFtZSk7CiAgICAgICAgICAgICByZXR1cm4gMjE7IC8qIEZJWE1FOiBwcm9iYWJseSAwICovCiAgICAgICAgIH0KIAogCS8qIChwb3NzaWJsZSkgcmVjdXJzaW9uICovCi0JaWYgKCFQRV9NYXBJbWFnZSggJihwTW9kdWxlLT5tb2R1bGUzMiksIHByb2Nlc3MsICZvZnMsZmxhZ3MpKSB7Ci0JCS8qIEZJWE1FOiBzaG91bGQgZnJlZSB0aGlzIG1vZHVsZSBhbmQgaXRzIHJlZmVyZW5jZWQgb25lcyAqLwotCQlyZXR1cm4gMDsKKwlpZiAoIVBFX01hcEltYWdlKHByb2Nlc3Msd20sJm9mcyxmbGFncykpIHsKKwkgICAgLyogRVJST1IgY2xlYW51cCAuLi4gKi8KKwkgICAgV0lORV9NT0RSRUYJKip4d207CisKKwkgICAgRVJSKHdpbjMyLCJjb3VsZG4ndCBsb2FkICVzXG4iLG9mcy5zelBhdGhOYW1lKTsKKwkgICAgLyogdW5saW5rIGZyb20gcHJvY2VzcyBtb2RyZWYgY2hhaW4gKi8KKwkgICAgZm9yICggICAgeHdtPSYocHJvY2Vzcy0+bW9kcmVmX2xpc3QpOworCQkgICAgICp4d20gJiYgKCp4d20hPXdtKTsKKwkJICAgICB4d209JigoKnh3bSktPm5leHQpCisJICAgICkgLyogRU1QVFkgKi87CisJICAgIGlmICgqeHdtKQorCSAgICAJKnh3bT0oKnh3bSktPm5leHQ7CisJICAgIAkKKwkgICAgcmV0dXJuIDA7CiAJfQotCXJldHVybiBwTW9kdWxlLT5tb2R1bGUzMjsKKyAgICAgICAgcE1vZHVsZS0+bW9kdWxlMzIgPSB3bS0+bW9kdWxlOworCXJldHVybiB3bS0+bW9kdWxlOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTgxMywyMyArODIzLDMwIEBACiAgKiBGSVhNRTogdGhpcyBmdW5jdGlvbiBzaG91bGQgdXNlIFBFX0xvYWRMaWJyYXJ5RXgzMkEsIGJ1dCBjdXJyZW50bHkgY2FuJ3QKICAqIGR1ZSB0byB0aGUgUFJPQ0VTU19DcmVhdGUgc3R1ZmYuCiAgKi8KLUhJTlNUQU5DRTE2IFBFX0xvYWRNb2R1bGUoIEhGSUxFMzIgaEZpbGUsIE9GU1RSVUNUICpvZnMsIExQQ1NUUiBjbWRfbGluZSwKK0hJTlNUQU5DRTE2IFBFX0xvYWRNb2R1bGUoIExQQ1NUUiBuYW1lLCBMUENTVFIgY21kX2xpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENTVFIgZW52LCBVSU5UMTYgc2hvd19jbWQgKQogewogICAgIEhNT0RVTEUxNiBoTW9kdWxlMTY7CiAgICAgSE1PRFVMRTMyIGhNb2R1bGUzMjsKICAgICBISU5TVEFOQ0UxNiBoSW5zdGFuY2U7CiAgICAgTkVfTU9EVUxFICpwTW9kdWxlOworICAgIEhGSUxFMzIgaEZpbGU7CisgICAgT0ZTVFJVQ1Qgb2ZzOwogICAgIFRIREIgKnRoZGIgPSBUSFJFQURfQ3VycmVudCgpOwotICAgIAotICAgIGlmICgoaE1vZHVsZTE2ID0gTU9EVUxFX0NyZWF0ZUR1bW15TW9kdWxlKCBvZnMgKSkgPCAzMikgcmV0dXJuIGhNb2R1bGUxNjsKKyAgICBQREIzMiAqcHJvY2VzczsKKyAgICBXSU5FX01PRFJFRgkqd207CisKKyAgICBpZiAoKGhGaWxlID0gT3BlbkZpbGUzMiggbmFtZSwgJm9mcywgT0ZfUkVBRCApKSA9PSBIRklMRV9FUlJPUjMyKQorICAgICAgICByZXR1cm4gMjsgIC8qIEZpbGUgbm90IGZvdW5kICovCisKKyAgICBpZiAoKGhNb2R1bGUxNiA9IE1PRFVMRV9DcmVhdGVEdW1teU1vZHVsZSggJm9mcyApKSA8IDMyKSByZXR1cm4gaE1vZHVsZTE2OwogICAgIHBNb2R1bGUgPSAoTkVfTU9EVUxFICopR2xvYmFsTG9jazE2KCBoTW9kdWxlMTYgKTsKICAgICBwTW9kdWxlLT5mbGFncyA9IE5FX0ZGTEFHU19XSU4zMjsKIAogICAgIHBNb2R1bGUtPm1vZHVsZTMyID0gaE1vZHVsZTMyID0gUEVfTG9hZEltYWdlKCBoRmlsZSApOwogICAgIGlmIChoTW9kdWxlMzIgPCAzMikgcmV0dXJuIDIxOwogCi0gICAgaEluc3RhbmNlID0gTU9EVUxFX0NyZWF0ZUluc3RhbmNlKCBoTW9kdWxlMTYsIE5VTEwsIChjbWRfbGluZSA9PSBOVUxMKSApOworICAgIGhJbnN0YW5jZSA9IE5FX0NyZWF0ZUluc3RhbmNlKCBwTW9kdWxlLCBOVUxMLCAoY21kX2xpbmUgPT0gTlVMTCkgKTsKICAgICBpZiAoY21kX2xpbmUgJiYKICAgICAgICAgIShQRV9IRUFERVIoaE1vZHVsZTMyKS0+RmlsZUhlYWRlci5DaGFyYWN0ZXJpc3RpY3MgJiBJTUFHRV9GSUxFX0RMTCkpCiAgICAgewpAQCAtODM4LDExICs4NTUsMjEgQEAKICAgICAgICAgVERCICpwVGFzayA9IChUREIgKilHbG9iYWxMb2NrMTYoIHBkYi0+dGFzayApOwogICAgICAgICB0aGRiID0gcFRhc2stPnRoZGI7CiAgICAgfQotICAgIGlmICghUEVfTWFwSW1hZ2UoICYocE1vZHVsZS0+bW9kdWxlMzIpLCB0aGRiLT5wcm9jZXNzLCBvZnMsIDAgKSkKKworICAgIHByb2Nlc3MgPSB0aGRiLT5wcm9jZXNzOworCisgICAgd209KFdJTkVfTU9EUkVGKilIZWFwQWxsb2MocHJvY2Vzcy0+aGVhcCxIRUFQX1pFUk9fTUVNT1JZLHNpemVvZigqd20pKTsKKyAgICB3bS0+dHlwZSA9IE1PRFVMRTMyX1BFOworICAgIC8qIE5PVEU6IGZpeHVwX2ltcG9ydHMgdGFrZXMgY2FyZSBvZiB0aGUgY29ycmVjdCBvcmRlciAqLworICAgIHdtLT5uZXh0ID0gcHJvY2Vzcy0+bW9kcmVmX2xpc3Q7CisgICAgd20tPm1vZHVsZSA9IGhNb2R1bGUzMjsKKyAgICBwcm9jZXNzLT5tb2RyZWZfbGlzdCA9IHdtOworICAgIGlmICghUEVfTWFwSW1hZ2UoIHByb2Nlc3MsIHdtLCAmb2ZzLCAwICkpCiAgICAgewogICAgICAJLyogRklYTUU6IHNob3VsZCBkZXN0cm95IHRoZSB0YXNrIGNyZWF0ZWQgYW5kIGZyZWUgcmVmZXJlbmNlZCBzdHVmZiAqLwogICAgICAgICByZXR1cm4gMDsKICAgICB9CisgICAgcE1vZHVsZS0+bW9kdWxlMzIgPSB3bS0+bW9kdWxlOwogICAgIC8qIEZJWE1FOiBZdWNrLiBJcyB0aGVyZSBubyBvdGhlciBnb29kIHBsYWNlIHRvIGRvIHRoYXQ/ICovCiAgICAgUEVfSW5pdFRscyggdGhkYiApOwogICAgIHJldHVybiBoSW5zdGFuY2U7CmRpZmYgLS1naXQgYS9sb2FkZXIvcmVzb3VyY2UuYyBiL2xvYWRlci9yZXNvdXJjZS5jCmluZGV4IDMyZjJhNmQuLmM0YmVjMmYgMTAwNjQ0Ci0tLSBhL2xvYWRlci9yZXNvdXJjZS5jCisrKyBiL2xvYWRlci9yZXNvdXJjZS5jCkBAIC0xODcsNyArMTg3LDcgQEAKIAkgICAgYnJlYWs7CiAJfQogICAgIGlmIChfX3dpbmVsaWIpCi0gICAgICAgIGZwcmludGYoc3RkZXJyLCJTaXplb2ZSZXNvdXJjZTMyOiBub3QgaW1wbGVtZW50ZWQgZm9yIFdJTkVMSUJcbiIpOworICAgICAgICBGSVhNRShtb2R1bGUsIk5vdCBpbXBsZW1lbnRlZCBmb3IgV0lORUxJQlxuIik7CiAgICAgcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2xvYWRlci9zaWduYWwuYyBiL2xvYWRlci9zaWduYWwuYwppbmRleCAwNWNmNzBhLi4yZTNkZWM2IDEwMDY0NAotLS0gYS9sb2FkZXIvc2lnbmFsLmMKKysrIGIvbG9hZGVyL3NpZ25hbC5jCkBAIC0xNTgsNyArMTU4LDcgQEAKIHsKICAgICBleHRlcm4gdm9pZCBTWU5DX1NldHVwU2lnbmFscyh2b2lkKTsKIAotI2lmZGVmIEhBVkVfU0lHQUxUU1RBQ0sKKyNpZmRlZiBIQVZFX1dPUktJTkdfU0lHQUxUU1RBQ0sKICAgICBzdHJ1Y3Qgc2lnYWx0c3RhY2sgc3M7CiAgICAgc3Muc3Nfc3AgICAgPSBTSUdOQUxfU3RhY2s7CiAgICAgc3Muc3Nfc2l6ZSAgPSBzaXplb2YoU0lHTkFMX1N0YWNrKTsKZGlmZiAtLWdpdCBhL2xvYWRlci90YXNrLmMgYi9sb2FkZXIvdGFzay5jCmluZGV4IDk5Yzc2MTEuLjJkMjVlYWMgMTAwNjQ0Ci0tLSBhL2xvYWRlci90YXNrLmMKKysrIGIvbG9hZGVyL3Rhc2suYwpAQCAtMzcsNyArMzcsNiBAQAogI2RlZmluZSBNSU5fVEhVTktTICAzMgogCiBleHRlcm4gSU5UMzIgV0lOU09DS19EZWxldGVUYXNrV1NJKCBUREIqIHBUYXNrLCBzdHJ1Y3QgX1dTSU5GTyogKTsKLWV4dGVybiBCT09MMzIgTU9EVUxFX0ZyZWVNb2R1bGUoIEhNT0RVTEUxNiBoTW9kdWxlLCBUREIqIHB0YXNrQ29udGV4dCApOwogCiAgIC8qIFBvaW50ZXIgdG8gZnVuY3Rpb24gdG8gc3dpdGNoIHRvIGEgbGFyZ2VyIHN0YWNrICovCiBpbnQgKCpJRjE2MzJfQ2FsbExhcmdlU3RhY2spKCBpbnQgKCpmdW5jKSgpLCB2b2lkICphcmcgKSA9IE5VTEw7CkBAIC0yMDgsNyArMjA3LDcgQEAKIHsKICAgICBpbnQgZXhpdF9jb2RlID0gMTsKICAgICBUREIgKnBUYXNrID0gKFREQiAqKUdsb2JhbExvY2sxNiggaEN1cnJlbnRUYXNrICk7Ci0gICAgTkVfTU9EVUxFICpwTW9kdWxlID0gTU9EVUxFX0dldFB0cjE2KCBwVGFzay0+aE1vZHVsZSApOworICAgIE5FX01PRFVMRSAqcE1vZHVsZSA9IE5FX0dldFB0ciggcFRhc2stPmhNb2R1bGUgKTsKICAgICBTRUdUQUJMRUVOVFJZICpwU2VnVGFibGUgPSBORV9TRUdfVEFCTEUoIHBNb2R1bGUgKTsKIAogICAgIFNFVF9DVVJfVEhSRUFEKCBwVGFzay0+dGhkYiApOwpAQCAtMjc2LDkgKzI3NSwxMCBAQAogewogICAgIEhUQVNLMTYgaFRhc2s7CiAgICAgVERCICpwVGFzazsKLSAgICBMUFNUUiBuYW1lLCBjbWRfbGluZTsKKyAgICBMUFNUUiBjbWRfbGluZTsKICAgICBXT1JEIHNwOwogICAgIGNoYXIgKnN0YWNrMzJUb3A7CisgICAgY2hhciBuYW1lWzEwXTsKICAgICBTVEFDSzE2RlJBTUUgKmZyYW1lMTY7CiAgICAgU1RBQ0szMkZSQU1FICpmcmFtZTMyOwogICAgIFBEQjMyICpwZGIzMiA9IHRoZGItPnByb2Nlc3M7CkBAIC0zMTksNyArMzE5LDcgQEAKIAogICAgICAgLyogQ29weSB0aGUgbW9kdWxlIG5hbWUgKi8KIAotICAgIG5hbWUgPSBNT0RVTEVfR2V0TW9kdWxlTmFtZSggcE1vZHVsZS0+c2VsZiApOworICAgIEdldE1vZHVsZU5hbWUoIHBNb2R1bGUtPnNlbGYsIG5hbWUsIHNpemVvZihuYW1lKSApOwogICAgIHN0cm5jcHkoIHBUYXNrLT5tb2R1bGVfbmFtZSwgbmFtZSwgc2l6ZW9mKHBUYXNrLT5tb2R1bGVfbmFtZSkgKTsKIAogICAgICAgLyogQWxsb2NhdGUgYSBzZWxlY3RvciBmb3IgdGhlIFBEQiAqLwpAQCAtNDMyLDcgKzQzMiw3IEBACiAKICAgICAvKiBGcmVlIHRoZSB0YXNrIG1vZHVsZSAqLwogCi0gICAgTU9EVUxFX0ZyZWVNb2R1bGUoIHBUYXNrLT5oTW9kdWxlLCBwVGFzayApOworICAgIEZyZWVNb2R1bGUxNiggcFRhc2stPmhNb2R1bGUgKTsKIAogICAgIC8qIEZyZWUgdGhlIHNlbGVjdG9yIGFsaWFzZXMgKi8KIApAQCAtNjYwLDcgKzY2MCw3IEBACiAKICAgICBpZiAoY29udGV4dCkgRUFYX3JlZyhjb250ZXh0KSA9IDA7CiAgICAgaWYgKCEocFRhc2sgPSAoVERCICopR2xvYmFsTG9jazE2KCBoQ3VycmVudFRhc2sgKSkpIHJldHVybjsKLSAgICBpZiAoIShwTW9kdWxlID0gTU9EVUxFX0dldFB0cjE2KCBwVGFzay0+aE1vZHVsZSApKSkgcmV0dXJuOworICAgIGlmICghKHBNb2R1bGUgPSBORV9HZXRQdHIoIHBUYXNrLT5oTW9kdWxlICkpKSByZXR1cm47CiAKICAgICAvKiBUaGlzIGlzIGEgaGFjayB0byBpbnN0YWxsIHRhc2sgVVNFUiBzaWduYWwgaGFuZGxlciBiZWZvcmUgCiAgICAgICogaW1wbGljaXRseSBsb2FkZWQgRExMcyBhcmUgaW5pdGlhbGl6ZWQgKHNlZSB3aW5kb3dzL3VzZXIuYykgKi8KQEAgLTg1NSw3ICs4NTUsNyBAQAogICAgIEJZVEUgKnRodW5rLCpsZnVuYzsKICAgICBTRUdQVFIgdGh1bmthZGRyOwogCi0gICAgaWYgKCFoSW5zdGFuY2UpIHJldHVybiAwOworICAgIGlmICghaEluc3RhbmNlKSBoSW5zdGFuY2UgPSBDVVJSRU5UX0RTOwogICAgIHRodW5rYWRkciA9IFRBU0tfQWxsb2NUaHVuayggaEN1cnJlbnRUYXNrICk7CiAgICAgaWYgKCF0aHVua2FkZHIpIHJldHVybiAoRkFSUFJPQzE2KTA7CiAgICAgdGh1bmsgPSBQVFJfU0VHX1RPX0xJTiggdGh1bmthZGRyICk7CkBAIC05OTUsMTIgKzk5NSw4IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFN3aXRjaFN0YWNrQmFjayAgIChLRVJORUwuMTA5KQotICoKLSAqIE5vdGU6IHRoZSBmdW5jdGlvbiBpcyBkZWNsYXJlZCBhcyAncmVnaXN0ZXInIGluIHRoZSBzcGVjIGZpbGUgaW4gb3JkZXIKLSAqIHRvIG1ha2Ugc3VyZSBhbGwgcmVnaXN0ZXJzIGFyZSBwcmVzZXJ2ZWQsIGJ1dCB3ZSBkb24ndCB1c2UgdGhlbSBpbiBhbnkKLSAqIHdheSwgc28gd2UgZG9uJ3QgbmVlZCBhIENPTlRFWFQqIGFyZ3VtZW50LgogICovCi12b2lkIFdJTkFQSSBTd2l0Y2hTdGFja0JhY2sodm9pZCkKK3ZvaWQgV0lOQVBJIFN3aXRjaFN0YWNrQmFjayggQ09OVEVYVCAqY29udGV4dCApCiB7CiAgICAgVERCICpwVGFzazsKICAgICBTVEFDSzE2RlJBTUUgKm9sZEZyYW1lLCAqbmV3RnJhbWU7CkBAIC0xMDIyLDYgKzEwMTgsOCBAQAogICAgIC8qIFN3aXRjaCBiYWNrIHRvIHRoZSBvbGQgc3RhY2sgKi8KIAogICAgIHBUYXNrLT50aGRiLT5jdXJfc3RhY2sgPSBwRGF0YS0+b2xkX3NzX3NwOworICAgIFNTX3JlZyhjb250ZXh0KSAgPSBTRUxFQ1RPUk9GKHBEYXRhLT5vbGRfc3Nfc3ApOworICAgIEVTUF9yZWcoY29udGV4dCkgPSBPRkZTRVRPRihwRGF0YS0+b2xkX3NzX3NwKTsKICAgICBwRGF0YS0+b2xkX3NzX3NwID0gMDsKIAogICAgIC8qIEJ1aWxkIGEgc3RhY2sgZnJhbWUgZm9yIHRoZSByZXR1cm4gKi8KZGlmZiAtLWdpdCBhL21lbW9yeS9sb2NhbC5jIGIvbWVtb3J5L2xvY2FsLmMKaW5kZXggZjIwY2RhNi4uNWU0MTkyYyAxMDA2NDQKLS0tIGEvbWVtb3J5L2xvY2FsLmMKKysrIGIvbWVtb3J5L2xvY2FsLmMKQEAgLTM0Miw3ICszNDIsNyBAQAogICAgIGlmIChzdGFydCA9PSAwKSB7CiAgICAgICAvKiBDaGVjayBpZiB0aGUgc2VnbWVudCBpcyB0aGUgREdST1VQIG9mIGEgbW9kdWxlICovCiAKLQlpZiAoKHBNb2R1bGUgPSBNT0RVTEVfR2V0UHRyMTYoIHNlbGVjdG9yICkpKQorCWlmICgocE1vZHVsZSA9IE5FX0dldFB0ciggc2VsZWN0b3IgKSkpCiAJewogCSAgICBTRUdUQUJMRUVOVFJZICpwU2VnID0gTkVfU0VHX1RBQkxFKCBwTW9kdWxlICkgKyBwTW9kdWxlLT5kZ3JvdXAgLSAxOwogCSAgICBpZiAocE1vZHVsZS0+ZGdyb3VwICYmIChwU2VnLT5zZWxlY3RvciA9PSBzZWxlY3RvcikpIHsKQEAgLTE2MDEsNyArMTYwMSw3IEBACiAgICAgTkVfTU9EVUxFICpwTW9kdWxlOwogICAgIFdPUkQgZHM7CiAKLSAgICBpZiAoIShwTW9kdWxlID0gTU9EVUxFX0dldFB0cjE2KCBtb2R1bGUgKSkpIHJldHVybiAwOworICAgIGlmICghKHBNb2R1bGUgPSBORV9HZXRQdHIoIG1vZHVsZSApKSkgcmV0dXJuIDA7CiAgICAgZHMgPSAoTkVfU0VHX1RBQkxFKCBwTW9kdWxlICkgKyBwTW9kdWxlLT5kZ3JvdXAgLSAxKS0+c2VsZWN0b3I7CiAgICAgcmV0dXJuIE1BS0VMT05HKCBMT0NBTF9Db3VudEZyZWUoIGRzICksIExPQ0FMX0hlYXBTaXplKCBkcyApICk7CiB9CmRpZmYgLS1naXQgYS9tZW1vcnkvc2VsZWN0b3IuYyBiL21lbW9yeS9zZWxlY3Rvci5jCmluZGV4IDIxOGVlNzEuLjhlZGJjMmUgMTAwNjQ0Ci0tLSBhL21lbW9yeS9zZWxlY3Rvci5jCisrKyBiL21lbW9yeS9zZWxlY3Rvci5jCkBAIC0xOTMsMTEgKzE5MywxMCBAQAogCiAgICAgLyogQ2xlYXIgdGhlIHNhdmVkIDE2LWJpdCBzZWxlY3RvciAqLwogICAgIGZyYW1lID0gQ1VSUkVOVF9TVEFDSzE2OwotICAgIHdoaWxlIChmcmFtZSkKKyAgICB3aGlsZSAoZnJhbWUgJiYgZnJhbWUtPmZyYW1lMzIpCiAgICAgewogICAgICAgICBpZiAoKGZyYW1lLT5kcyA+PSBzZWwpICYmIChmcmFtZS0+ZHMgPCBuZXh0c2VsKSkgZnJhbWUtPmRzID0gMDsKICAgICAgICAgaWYgKChmcmFtZS0+ZXMgPj0gc2VsKSAmJiAoZnJhbWUtPmVzIDwgbmV4dHNlbCkpIGZyYW1lLT5lcyA9IDA7Ci0gICAgICAgIGlmICghZnJhbWUtPmZyYW1lMzIpIGJyZWFrOwogICAgICAgICBmcmFtZSA9IFBUUl9TRUdfVE9fTElOKCBmcmFtZS0+ZnJhbWUzMi0+ZnJhbWUxNiApOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL21pc2MvY29tbS5jIGIvbWlzYy9jb21tLmMKaW5kZXggMzMzYWRiOS4uMjFjYTVlOCAxMDA2NDQKLS0tIGEvbWlzYy9jb21tLmMKKysrIGIvbWlzYy9jb21tLmMKQEAgLTgyMyw3ICs4MjMsNyBAQAogICAgICAgICBpZiAoKGFjdCA9IEdldENvbW1Qb3J0KGZkKSkgPT0gLTEpIHsKICAgICAgICAgICAgIFdBUk4oY29tbSwiIGZkICVkIG5vdCBjb21tIHBvcnRcbiIsYWN0KTsKICAgICAgICAgICAgIHJldHVybiBOVUxMO30KLSAgICAgICAgc3RvbCA9ICB1bmtub3duW2FjdF07CisgICAgICAgIHN0b2wgPSAodW5zaWduZWQgY2hhciAqKXVua25vd25bYWN0XTsKICAgICAgICAgc3RvbCArPSBtc3I7ICAgIAogCXJlcGlkID0gaW9jdGwoZmQsVElPQ01HRVQsJm1zdGF0KTsKIAlUUkFDRShjb21tLCAiIGlvY3RsICAlZCwgbXNyICV4IGF0ICVwICVwXG4iLHJlcGlkLG1zdGF0LHN0b2wsdW5rbm93blthY3RdKTsKZGlmZiAtLWdpdCBhL21pc2MvY29tbWRsZy5jIGIvbWlzYy9jb21tZGxnLmMKaW5kZXggZDhlYzgyNS4uZmY1ZTI3NSAxMDA2NDQKLS0tIGEvbWlzYy9jb21tZGxnLmMKKysrIGIvbWlzYy9jb21tZGxnLmMKQEAgLTE1ODksNyArMTU4OSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBDaG9vc2VDb2xvciAgIChDT01NRExHLjUpCiAgKi8KLUJPT0wxNiBXSU5BUEkgQ2hvb3NlQ29sb3IoTFBDSE9PU0VDT0xPUiBscENoQ29sKQorQk9PTDE2IFdJTkFQSSBDaG9vc2VDb2xvcjE2KExQQ0hPT1NFQ09MT1IxNiBscENoQ29sKQogewogICAgIEhJTlNUQU5DRTE2IGhJbnN0OwogICAgIEhBTkRMRTE2IGhEbGdUbXBsID0gMDsKQEAgLTE2NjIsNyArMTY2Miw3IEBACiAKIHN0cnVjdCBDQ1BSSVZBVEUKIHsKLSBMUENIT09TRUNPTE9SIGxwY2M7ICAvKiBwb2ludHMgdG8gcHVibGljIGtub3duIGRhdGEgc3RydWN0dXJlICovCisgTFBDSE9PU0VDT0xPUjE2IGxwY2M7ICAvKiBwb2ludHMgdG8gcHVibGljIGtub3duIGRhdGEgc3RydWN0dXJlICovCiAgaW50IG5leHR1c2VyZGVmOyAgICAgLyogbmV4dCBmcmVlIHBsYWNlIGluIHVzZXIgZGVmaW5lZCBjb2xvciBhcnJheSAqLwogIEhEQzE2IGhkY01lbTsgICAgICAgIC8qIGNvbG9yIGdyYXBoIHVzZWQgZm9yIEJpdEJsdCgpICovCiAgSEJJVE1BUDE2IGhibU1lbTsgICAgLyogY29sb3IgZ3JhcGggYml0bWFwICovICAgIApAQCAtMjM0Miw3ICsyMzQyLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDX0hvb2tDYWxsQ2hrICAgICAgICAgICAgICAgICBbaW50ZXJuYWxdCiAgKi8KLXN0YXRpYyBCT09MMzIgQ0NfSG9va0NhbGxDaGsoTFBDSE9PU0VDT0xPUiBscGNjKQorc3RhdGljIEJPT0wzMiBDQ19Ib29rQ2FsbENoayhMUENIT09TRUNPTE9SMTYgbHBjYykKIHsKICBpZiAobHBjYykKICAgaWYobHBjYy0+RmxhZ3MgJiBDQ19FTkFCTEVIT09LKQpAQCAtMjM2NCw4ICsyMzY0LDggQEAKICAgIAogICAgVFJBQ0UoY29tbWRsZywiV01fSU5JVERJQUxPRyBsUGFyYW09JTA4bFhcbiIsIGxQYXJhbSk7CiAgICBscHA9Y2FsbG9jKDEsc2l6ZW9mKHN0cnVjdCBDQ1BSSVZBVEUpKTsKLSAgIGxwcC0+bHBjYz0oTFBDSE9PU0VDT0xPUilsUGFyYW07Ci0gICBpZiAobHBwLT5scGNjLT5sU3RydWN0U2l6ZSAhPSBzaXplb2YoQ0hPT1NFQ09MT1IpKQorICAgbHBwLT5scGNjPShMUENIT09TRUNPTE9SMTYpbFBhcmFtOworICAgaWYgKGxwcC0+bHBjYy0+bFN0cnVjdFNpemUgIT0gc2l6ZW9mKENIT09TRUNPTE9SMTYpKQogICAgewogICAgICAgRW5kRGlhbG9nMzIgKGhEbGcsIDApIDsKICAgICAgIHJldHVybiBGQUxTRTsKQEAgLTM2NDIsNyArMzY0Miw3IEBACiAJb2ZuMTYtPmxTdHJ1Y3RTaXplID0gc2l6ZW9mKCpvZm4xNik7CiAJb2ZuMTYtPmh3bmRPd25lciA9IG9mbi0+aHduZE93bmVyOwogCS8qIEZJWE1FOiBPUEVORklMRU5BTUUxNiBnb3Qgb25seSAxNiBiaXQgZm9yIEhJTlNUQU5DRS4uLiAqLwotCW9mbjE2LT5oSW5zdGFuY2UgPSBNT0RVTEVfSEFORExFdG9ITU9EVUxFMTYob2ZuLT5oSW5zdGFuY2UpOworCW9mbjE2LT5oSW5zdGFuY2UgPSAwOwogCWlmIChvZm4tPmxwc3RyRmlsdGVyKSB7CiAJCUxQU1RSCXMseDsKIApAQCAtMzczMiw3ICszNzMyLDcgQEAKIAlvZm4xNi0+bFN0cnVjdFNpemUgPSBzaXplb2YoKm9mbjE2KTsKIAlvZm4xNi0+aHduZE93bmVyID0gb2ZuLT5od25kT3duZXI7CiAJLyogRklYTUU6IE9QRU5GSUxFTkFNRTE2IGdvdCBvbmx5IDE2IGJpdCBmb3IgSElOU1RBTkNFLi4uICovCi0Jb2ZuMTYtPmhJbnN0YW5jZSA9IE1PRFVMRV9IQU5ETEV0b0hNT0RVTEUxNihvZm4tPmhJbnN0YW5jZSk7CisJb2ZuMTYtPmhJbnN0YW5jZSA9IDA7CiAJaWYgKG9mbi0+bHBzdHJGaWx0ZXIpIHsKIAkJTFBXU1RSCXM7CiAJCUxQU1RSCXgseTsKQEAgLTM4NjEsMyArMzg2MSw3MSBAQAogICAgQk9PTDE2IChXSU5BUEkgKiBkb2Z1bmN0aW9uKShTRUdQVFIgb2ZuMTYpID0gR2V0U2F2ZUZpbGVOYW1lMTY7CiAgICByZXR1cm4gQ29tbWRsZ19HZXRGaWxlTmFtZTMyVyhkb2Z1bmN0aW9uLG9mbik7CiB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICBDaG9vc2VDb2xvckEgIChDT01ETEczMi4xKQorICovCitCT09MMzIgV0lOQVBJIENob29zZUNvbG9yMzJBKExQQ0hPT1NFQ09MT1IzMkEgbHBDaENvbCApCisKK3sKKyAgQk9PTDE2IHJldDsKKyAgY2hhciAqc3RyID0gTlVMTDsKKyAgQ09MT1JSRUYqIGNjcmVmPVNFR1BUUl9BTExPQyg2NCk7CisgIExQQ0hPT1NFQ09MT1IxNiBscGNjMTY9U0VHUFRSX0FMTE9DKHNpemVvZihDSE9PU0VDT0xPUjE2KSk7CisKKyAgbWVtc2V0KGxwY2MxNiwnXDAnLHNpemVvZigqbHBjYzE2KSk7CisgIGxwY2MxNi0+bFN0cnVjdFNpemU9c2l6ZW9mKCpscGNjMTYpOworICBscGNjMTYtPmh3bmRPd25lcj1scENoQ29sLT5od25kT3duZXI7CisgIGxwY2MxNi0+aEluc3RhbmNlPTA7IC8qIEZJWE1FOk1PRFVMRV9IQU5ETEV0b0hNT0RVTEUxNihscENoQ29sLT5oSW5zdGFuY2UpKi8KKyAgbHBjYzE2LT5yZ2JSZXN1bHQ9bHBDaENvbC0+cmdiUmVzdWx0OworICBtZW1jcHkoY2NyZWYsbHBDaENvbC0+bHBDdXN0Q29sb3JzLDY0KTsKKyAgbHBjYzE2LT5scEN1c3RDb2xvcnM9KENPTE9SUkVGKilTRUdQVFJfR0VUKGNjcmVmKTsKKyAgbHBjYzE2LT5GbGFncz1scENoQ29sLT5GbGFnczsKKyAgbHBjYzE2LT5sQ3VzdERhdGE9bHBDaENvbC0+bEN1c3REYXRhOworICBscGNjMTYtPmxwZm5Ib29rPShXTkRQUk9DMTYpbHBDaENvbC0+bHBmbkhvb2s7CisgIGlmIChscENoQ29sLT5scFRlbXBsYXRlTmFtZSkKKyAgICBzdHIgPSBTRUdQVFJfU1RSRFVQKGxwQ2hDb2wtPmxwVGVtcGxhdGVOYW1lICk7CisgIGxwY2MxNi0+bHBUZW1wbGF0ZU5hbWU9U0VHUFRSX0dFVChzdHIpOworICAKKyAgcmV0ID0gQ2hvb3NlQ29sb3IxNihscGNjMTYpOworICBpZihzdHIpCisgICAgU0VHUFRSX0ZSRUUoc3RyKTsKKyAgbWVtY3B5KGxwQ2hDb2wtPmxwQ3VzdENvbG9ycyxjY3JlZiw2NCk7CisgIFNFR1BUUl9GUkVFKGNjcmVmKTsKKyAgU0VHUFRSX0ZSRUUobHBjYzE2KTsKKyAgcmV0dXJuIChCT09MMzIpcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgQ2hvb3NlQ29sb3JXICAoQ09NRExHMzIuMikKKyAqLworQk9PTDMyIFdJTkFQSSBDaG9vc2VDb2xvcjMyVyhMUENIT09TRUNPTE9SMzJXIGxwQ2hDb2wgKQorCit7CisgIEJPT0wxNiByZXQ7CisgIGNoYXIgKnN0ciA9IE5VTEw7CisgIENPTE9SUkVGKiBjY3JlZj1TRUdQVFJfQUxMT0MoNjQpOworICBMUENIT09TRUNPTE9SMTYgbHBjYzE2PVNFR1BUUl9BTExPQyhzaXplb2YoQ0hPT1NFQ09MT1IxNikpOworCisgIG1lbXNldChscGNjMTYsJ1wwJyxzaXplb2YoKmxwY2MxNikpOworICBscGNjMTYtPmxTdHJ1Y3RTaXplPXNpemVvZigqbHBjYzE2KTsKKyAgbHBjYzE2LT5od25kT3duZXI9bHBDaENvbC0+aHduZE93bmVyOworICBscGNjMTYtPmhJbnN0YW5jZT0wOyAvKkZJWE1FOk1PRFVMRV9IQU5ETEV0b0hNT0RVTEUxNihscENoQ29sLT5oSW5zdGFuY2UpKi8KKyAgbHBjYzE2LT5yZ2JSZXN1bHQ9bHBDaENvbC0+cmdiUmVzdWx0OworICBtZW1jcHkoY2NyZWYsbHBDaENvbC0+bHBDdXN0Q29sb3JzLDY0KTsKKyAgbHBjYzE2LT5scEN1c3RDb2xvcnM9KENPTE9SUkVGKilTRUdQVFJfR0VUKGNjcmVmKTsKKyAgbHBjYzE2LT5GbGFncz1scENoQ29sLT5GbGFnczsKKyAgbHBjYzE2LT5sQ3VzdERhdGE9bHBDaENvbC0+bEN1c3REYXRhOworICBscGNjMTYtPmxwZm5Ib29rPShXTkRQUk9DMTYpbHBDaENvbC0+bHBmbkhvb2s7CisgIGlmIChscENoQ29sLT5scFRlbXBsYXRlTmFtZSkKKyAgICBzdHIgPSBTRUdQVFJfU1RSRFVQX1d0b0EobHBDaENvbC0+bHBUZW1wbGF0ZU5hbWUgKTsKKyAgbHBjYzE2LT5scFRlbXBsYXRlTmFtZT1TRUdQVFJfR0VUKHN0cik7CisgIAorICByZXQgPSBDaG9vc2VDb2xvcjE2KGxwY2MxNik7CisgIGlmKHN0cikKKyAgICBTRUdQVFJfRlJFRShzdHIpOworICBtZW1jcHkobHBDaENvbC0+bHBDdXN0Q29sb3JzLGNjcmVmLDY0KTsKKyAgU0VHUFRSX0ZSRUUoY2NyZWYpOworICBTRUdQVFJfRlJFRShscGNjMTYpOworICByZXR1cm4gKEJPT0wzMilyZXQ7Cit9CmRpZmYgLS1naXQgYS9taXNjL2NwdS5jIGIvbWlzYy9jcHUuYwppbmRleCAwMzY5YjQ5Li4zOTBjNDc3IDEwMDY0NAotLS0gYS9taXNjL2NwdS5jCisrKyBiL21pc2MvY3B1LmMKQEAgLTExLDcgKzExLDEyIEBACiAjaW5jbHVkZSAiZ2xvYmFsLmgiCiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgIndpbm50LmgiCisjaW5jbHVkZSAid2luZXJyb3IuaCIKICNpbmNsdWRlICJ3aW5yZWcuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorCisvKiBTaG91bGQgdGhpcyB3cml0ZSB0byB0aGUgcmVnaXN0cnk/ICovCisjZGVmaW5lIERPX1JFRyBGQUxTRQogCiBzdGF0aWMgQllURSBQRls2NF0gPSB7MCx9OwogCkBAIC0yMiw3ICsyNyw3IEBACiB7CiAJc3RhdGljIGludCBjYWNoZSA9IDA7CiAJc3RhdGljIFNZU1RFTV9JTkZPIGNhY2hlZHNpOwotCUhLRVkJeGhrZXk9MCxoa2V5OworCUhLRVkJaGtleTsKIAljaGFyCWJ1ZlsyMF07CiAKIAlpZiAoY2FjaGUpIHsKQEAgLTUyLDYgKzU3LDE2IEBACiAKIAkvKiBobW0sIHJlYXNvbmFibGUgcHJvY2Vzc29yIGZlYXR1cmUgZGVmYXVsdHM/ICovCiAKKyAgICAgICAgLyogVGhlIHJlZ2lzdHJ5IGNhbGxzIHdlcmUgcmVtb3ZlZCBiZWNhdXNlIHRoZXkgd2VyZSBiZWluZyBjYWxsZWQgCisgICAgICAgICAgIGJlZm9yZSB0aGUgcmVnaXN0cmllcyB3ZXJlIGxvYWRlZCwgYW5kIHRoZXkgd2VyZSBnaXZpbmcgZXJyb3JzICovCisgICAgICAgIC8qIENyZWF0ZSB0aGlzIHJlZ2lzdHJ5IGtleSBmb3IgYWxsIHN5c3RlbXMgKi8KKworI2lmIERPX1JFRworCWlmIChSZWdDcmVhdGVLZXkxNihIS0VZX0xPQ0FMX01BQ0hJTkUsIkhBUkRXQVJFXFxERVNDUklQVElPTlxcU3lzdGVtXFxDZW50cmFsUHJvY2Vzc29yIiwmaGtleSkhPUVSUk9SX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIFdBUk4ocmVnLCJVbmFibGUgdG8gcmVnaXN0ZXIgQ1BVIGluZm9ybWF0aW9uXG4iKTsKKyAgICAgICAgfQorI2VuZGlmCisKICNpZmRlZiBsaW51eAogCXsKIAljaGFyIGxpbmVbMjAwXTsKQEAgLTU5LDggKzc0LDcgQEAKIAogCWlmICghZikKIAkJcmV0dXJuOwotICAgICAgICB4aGtleSA9IDA7Ci0JUmVnQ3JlYXRlS2V5MTYoSEtFWV9MT0NBTF9NQUNISU5FLCJcXEhBUkRXQVJFXFxERVNDUklQVElPTlxcU3lzdGVtXFxDZW50cmFsUHJvY2Vzc29yIiwmaGtleSk7CisgICAgICAgIC8qeGhrZXkgPSAwOyovCiAJd2hpbGUgKGZnZXRzKGxpbmUsMjAwLGYpIT1OVUxMKSB7CiAJCWNoYXIJKnMsKnZhbHVlOwogCkBAIC05NCwxMCArMTA4LDEyIEBACiAJCQkJCWJyZWFrOwogCQkJCX0KIAkJCX0KKyNpZiBET19SRUcKIAkJCS8qIHNldCB0aGUgQ1BVIHR5cGUgb2YgdGhlIGN1cnJlbnQgcHJvY2Vzc29yICovCiAJCQlzcHJpbnRmKGJ1ZiwiQ1BVICVsZCIsY2FjaGVkc2kuZHdQcm9jZXNzb3JUeXBlKTsKLQkJCWlmICh4aGtleSkKLQkJCQlSZWdTZXRWYWx1ZUV4MzJBKHhoa2V5LCJJZGVudGlmaWVyIiwwLFJFR19TWixidWYsc3RybGVuKGJ1ZikpOworCQkJaWYgKGhrZXkpCisJCQkJUmVnU2V0VmFsdWVFeDMyQShoa2V5LCJJZGVudGlmaWVyIiwwLFJFR19TWixidWYsc3RybGVuKGJ1ZikpOworI2VuZGlmCiAJCQljb250aW51ZTsKIAkJfQogCQkvKiBvbGQgMi4wIG1ldGhvZCAqLwpAQCAtMTIyLDEwICsxMzgsMTIgQEAKIAkJCQkJYnJlYWs7CiAJCQkJfQogCQkJfQorI2lmIERPX1JFRwogCQkJLyogc2V0IHRoZSBDUFUgdHlwZSBvZiB0aGUgY3VycmVudCBwcm9jZXNzb3IgKi8KIAkJCXNwcmludGYoYnVmLCJDUFUgJWxkIixjYWNoZWRzaS5kd1Byb2Nlc3NvclR5cGUpOwotCQkJaWYgKHhoa2V5KQotCQkJCVJlZ1NldFZhbHVlRXgzMkEoeGhrZXksIklkZW50aWZpZXIiLDAsUkVHX1NaLGJ1ZixzdHJsZW4oYnVmKSk7CisJCQlpZiAoaGtleSkKKwkJCQlSZWdTZXRWYWx1ZUV4MzJBKGhrZXksIklkZW50aWZpZXIiLDAsUkVHX1NaLGJ1ZixzdHJsZW4oYnVmKSk7CisjZW5kaWYKIAkJCWNvbnRpbnVlOwogCQl9CiAJCWlmICghbHN0cm5jbXBpMzJBKGxpbmUsImZkaXZfYnVnIixzdHJsZW4oImZkaXZfYnVnIikpKSB7CkBAIC0xNDgsMTEgKzE2NiwxNCBAQAogCQkJCWlmICh4KzE+Y2FjaGVkc2kuZHdOdW1iZXJPZlByb2Nlc3NvcnMpCiAJCQkJCWNhY2hlZHNpLmR3TnVtYmVyT2ZQcm9jZXNzb3JzPXgrMTsKIAorI2lmIDAKIAkJCS8qIGNyZWF0ZSBhIG5ldyBwcm9jZXNzb3Igc3Via2V5ICovCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBXaGF0IGV4YWN0bHkgaXMgdHJ5aW5nIHRvIGJlIGRvbmUgaGVyZT8gKi8KIAkJCXNwcmludGYoYnVmLCIlZCIseCk7CiAJCQlpZiAoeGhrZXkpCiAJCQkJUmVnQ2xvc2VLZXkoeGhrZXkpOwogCQkJUmVnQ3JlYXRlS2V5MTYoaGtleSxidWYsJnhoa2V5KTsKKyNlbmRpZgogCQl9CiAJCWlmICghbHN0cm5jbXBpMzJBKGxpbmUsInN0ZXBwaW5nIixzdHJsZW4oInN0ZXBwaW5nIikpKSB7CiAJCQlpbnQJeDsKQEAgLTE3NCwxNCArMTk1LDI0IEBACiAjZWxzZSAgLyogbGludXggKi8KIAkvKiBGSVhNRTogaG93IGRvIHdlIGRvIHRoaXMgb24gb3RoZXIgc3lzdGVtcz8gKi8KIAotCVJlZ0NyZWF0ZUtleTE2KGhrZXksIjAiLCZ4aGtleSk7CisjaWYgMAogCVJlZ1NldFZhbHVlRXgzMkEoeGhrZXksIklkZW50aWZpZXIiLDAsUkVHX1NaLCJDUFUgMzg2IixzdHJsZW4oIkNQVSAzODYiKSk7CisjZW5kaWYKKwogI2VuZGlmICAvKiAhbGludXggKi8KLQlpZiAoeGhrZXkpCisKKyNpZiAwCisJKHhoa2V5KQogCQlSZWdDbG9zZUtleSh4aGtleSk7Ci0JUmVnQ2xvc2VLZXkoaGtleSk7CisjZW5kaWYKKyNpZiBET19SRUcKKyAgICBpZiAoaGtleSkKKyAgICAgICAgUmVnQ2xvc2VLZXkoaGtleSk7CisjZW5kaWYKKwogfQogCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogCQkJSXNQcm9jZXNzb3JGZWF0dXJlUHJlc2VudAlbS0VSTkVMTDMyLjg4MF0KICAqLwpkaWZmIC0tZ2l0IGEvbWlzYy9jcnRkbGwuYyBiL21pc2MvY3J0ZGxsLmMKaW5kZXggZTlmMWRkMy4uMGFjYWQyOSAxMDA2NDQKLS0tIGEvbWlzYy9jcnRkbGwuYworKysgYi9taXNjL2NydGRsbC5jCkBAIC0yMCw2ICsyMCw3IEBACiAKIC8qIEZJWE1FOiBhbGwgdGhlIGZpbGUgaGFuZGxpbmcgaXMgaG9wZWxlc3NseSBicm9rZW4gLS0gQUogKi8KIAorI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdGRhcmcuaD4KQEAgLTM0LDYgKzM1LDcgQEAKICNpbmNsdWRlIDxzZXRqbXAuaD4KICNpbmNsdWRlICJ3aW4uaCIKICNpbmNsdWRlICJ3aW5kb3dzLmgiCisjaW5jbHVkZSAid2luZXJyb3IuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogI2luY2x1ZGUgIm1vZHVsZS5oIgogI2luY2x1ZGUgImhlYXAuaCIKQEAgLTMwNSw2ICszMDcsMjAgQEAKIH0KICAgCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgIGZzY2FuZiAgICAgKENSVERMTC4zODEpCisgKi8KK0lOVDMyIF9fY2RlY2wgQ1JURExMX2ZzY2FuZiggTFBWT0lEIHN0cmVhbSwgTFBTVFIgZm9ybWF0LCAuLi4gKQoreworICAgIHZhX2xpc3QgdmFsaXN0OworICAgIElOVDMyIHJlczsKKworICAgIHZhX3N0YXJ0KCB2YWxpc3QsIGZvcm1hdCApOworICAgIHJlcyA9IHZmc2NhbmYoIHhsYXRfZmlsZV9wdHIoc3RyZWFtKSwgZm9ybWF0LCB2YWxpc3QgKTsKKyAgICB2YV9lbmQoIHZhbGlzdCApOworICAgIHJldHVybiByZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICAgICAgICAgZnNlZWsgICAgIChDUlRETEwuMzgyKQogICovCiBMT05HIF9fY2RlY2wgQ1JURExMX2ZzZWVrKExQVk9JRCBzdHJlYW0sIExPTkcgb2Zmc2V0LCBJTlQzMiB3aGVuY2UpCkBAIC0zMjMsNiArMzM5LDE1IEBACiB9CiAgIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICBmc2V0cG9zICAgICAoQ1JURExMLjM4MykKKyAqLworSU5UMzIgX19jZGVjbCBDUlRETExfZnNldHBvcyhMUFZPSUQgc3RyZWFtLCBmcG9zX3QgKnBvcykKK3sKKyAgVFJBQ0UoY3J0ZGxsLCAiZmlsZSAlcFxuIiwgc3RyZWFtKTsKKyAgcmV0dXJuIGZzZWVrKHhsYXRfZmlsZV9wdHIoc3RyZWFtKSwgKnBvcywgU0VFS19TRVQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgICAgICAgIGZ0ZWxsICAgICAoQ1JURExMLjM4NCkKICAqLwogTE9ORyBfX2NkZWNsIENSVERMTF9mdGVsbChMUFZPSUQgc3RyZWFtKQpAQCAtNTE0LDcgKzUzOSw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICBfYWJub3JtYWxfdGVybWluYXRpb24gICAgICAgICAgKENSVERMTC4zNiApCisgKiAgICAgICAgICAgICAgICAgIF9hYm5vcm1hbF90ZXJtaW5hdGlvbiAgICAgICAgICAoQ1JURExMLjM2KQogICovCiBJTlQzMiBfX2NkZWNsIENSVERMTF9fYWJub3JtYWxfdGVybWluYXRpb24odm9pZCkKIHsKQEAgLTUyNCw2ICs1NDksMzIgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgIF9hY2Nlc3MgICAgICAgICAgKENSVERMTC4zNykKKyAqLworSU5UMzIgX19jZGVjbCBDUlRETExfX2FjY2VzcyhMUENTVFIgZmlsZW5hbWUsIElOVDMyIG1vZGUpCit7CisgICAgRFdPUkQgYXR0ciA9IEdldEZpbGVBdHRyaWJ1dGVzMzJBKGZpbGVuYW1lKTsKKworICAgIGlmIChhdHRyID09IC0xKQorICAgIHsKKyAgICAgICAgaWYgKEdldExhc3RFcnJvcigpID09IEVSUk9SX0lOVkFMSURfQUNDRVNTKQorICAgICAgICAgICAgZXJybm8gPSBFQUNDRVM7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVycm5vID0gRU5PRU5UOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKChhdHRyICYgRklMRV9BVFRSSUJVVEVfUkVBRE9OTFkpICYmIChtb2RlICYgV19PSykpCisgICAgeworICAgICAgICBlcnJubyA9IEVBQ0NFUzsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiAwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICAgICAgICAgZmZsdXNoICAgICAgICAoQ1JURExMLjM2NSkKICAqLwogSU5UMzIgX19jZGVjbCBDUlRETExfZmZsdXNoKExQVk9JRCBzdHJlYW0pCkBAIC0xMzY2LDYgKzE0MTcsMTQgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICBfZnByZXNldCAgICAgICAgICAgKENSVERMTC4xMDcpCisgKi8KK1ZPSUQgX19jZGVjbCBDUlRETExfX2ZwcmVzZXQodm9pZCkKK3sKKyAgICAgICBGSVhNRShjcnRkbGwsIiBTVFVCLlxuIik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICAgICAgICAgYXRleGl0ICAgICAgICAgICAoQ1JURExMLjM0NSkKICAqLwogSU5UMzIgX19jZGVjbCBDUlRETExfYXRleGl0KExQVk9JRCB4KQpAQCAtMTQ3NSwxMSArMTUzNCwxNCBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgICAgICAgIF9jaGRyaXZlICAgICAgICAgICAoQ1JURExMLjUyKQorICoKKyAqICBuZXdkaXIgICAgICBbSV0gZHJpdmUgdG8gY2hhbmdlIHRvLCBBPTEKKyAqCiAgKi8KIEJPT0wzMiBfX2NkZWNsIENSVERMTF9fY2hkcml2ZShJTlQzMiBuZXdkcml2ZSkKIHsKIAkvKiBGSVhNRTogZ2VuZXJhdGVzIGVycm5vcyAqLwotCXJldHVybiBEUklWRV9TZXRDdXJyZW50RHJpdmUobmV3ZHJpdmUpOworCXJldHVybiBEUklWRV9TZXRDdXJyZW50RHJpdmUobmV3ZHJpdmUtMSk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTE0ODgsNyArMTU1MCw3IEBACiBJTlQzMiBfX2NkZWNsIENSVERMTF9fY2hkaXIoTFBDU1RSIG5ld2RpcikKIHsKIAlpZiAoIVNldEN1cnJlbnREaXJlY3RvcnkzMkEobmV3ZGlyKSkKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gMTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTYwNCw2ICsxNjY2LDE2IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgX2dldGRyaXZlICAgICAgICAgICAoQ1JURExMLjEyNCkKKyAqCisgKiAgUmV0dXJuIGN1cnJlbnQgZHJpdmUsIDEgZm9yIEEsIDIgZm9yIEIKKyAqLworSU5UMzIgX19jZGVjbCBDUlRETExfX2dldGRyaXZlKFZPSUQpCit7CisgICAgcmV0dXJuIERSSVZFX0dldEN1cnJlbnREcml2ZSgpICsgMTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgICAgICAgICBfbWtkaXIgICAgICAgICAgIChDUlRETEwuMjM0KQogICovCiBJTlQzMiBfX2NkZWNsIENSVERMTF9fbWtkaXIoTFBDU1RSIG5ld2RpcikKQEAgLTE3MDEsNiArMTc3MywyNSBAQAogICAgIHJldHVybiBidWY7CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgX2x0b2EgICAgICAgICAgIChDUlRETEwuMTgwKQorICovCitMUFNUUiAgX19jZGVjbCBDUlRETExfX2x0b2EobG9uZyB4LExQU1RSIGJ1ZixJTlQzMiByYWRpeCkKK3sKKyAgICBzd2l0Y2gocmFkaXgpIHsKKyAgICAgICAgY2FzZSAgMjogRklYTUUoY3J0ZGxsLCAiYmluYXJ5IGZvcm1hdCBub3QgaW1wbGVtZW50ZWQgIVxuIik7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICA4OiB3c25wcmludGYzMkEoYnVmLDB4ODAsIiVvIix4KTsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTA6IHdzbnByaW50ZjMyQShidWYsMHg4MCwiJWQiLHgpOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxNjogd3NucHJpbnRmMzJBKGJ1ZiwweDgwLCIleCIseCk7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiBGSVhNRShjcnRkbGwsICJyYWRpeCAlZCBub3QgaW1wbGVtZW50ZWQgIVxuIiwgcmFkaXgpOworICAgIH0KKyAgICByZXR1cm4gYnVmOworfQorCiB0eXBlZGVmIFZPSUQgKCpzaWdfaGFuZGxlcl90eXBlKShWT0lEKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTcyNSw2ICsxODE2LDcgQEAKICAgVFJBQ0UoY3J0ZGxsLCJDUlRETExfX3NsZWVwIGZvciAlbGQgbWlsbGlzZWNvbmRzXG4iLHRpbWVvdXQpOwogICBTbGVlcCgodGltZW91dCk/dGltZW91dDoxKTsKIH0KKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgICAgICAgICBnZXRlbnYgICAgICAgICAgIChDUlRETEwuNDM3KQogICovCkBAIC0xNzUxLDMgKzE4NDMsMTEgQEAKICAgICAgRnJlZUVudmlyb25tZW50U3RyaW5nczMyQSggZW52aXJvbiApOwogICAgICByZXR1cm4gcHA7CiB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgX21ic3JjaHIgICAgICAgICAgIChDUlRETEwuMjIzKQorICovCitMUFNUUiBfX2NkZWNsIENSVERMTF9fbWJzcmNocihMUFNUUiBzLENIQVIgeCkgeworCS8qIEZJWE1FOiBoYW5kbGUgbXVsdGlieXRlIHN0cmluZ3MgKi8KKwlyZXR1cm4gc3RycmNocihzLHgpOworfQpkaWZmIC0tZ2l0IGEvbWlzYy9kZGVtbC5jIGIvbWlzYy9kZGVtbC5jCmluZGV4IDVkNTk5NDAuLjRiYmMxZmUgMTAwNjQ0Ci0tLSBhL21pc2MvZGRlbWwuYworKysgYi9taXNjL2RkZW1sLmMKQEAgLTEyMSwxNCArMTIxLDI0IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgIERkZVF1ZXJ5TmV4dFNlcnZlciAoRERFTUwuNSkKKyAqIERkZVF1ZXJ5TmV4dFNlcnZlcjE2IFtEREVNTC41XQogICovCi1IQ09OViBXSU5BUEkgRGRlUXVlcnlOZXh0U2VydmVyKCBIQ09OVkxJU1QgaENvbnZMaXN0LCBIQ09OViBoQ29udlByZXYgKQorSENPTlYgV0lOQVBJIERkZVF1ZXJ5TmV4dFNlcnZlcjE2KCBIQ09OVkxJU1QgaENvbnZMaXN0LCBIQ09OViBoQ29udlByZXYgKQogewotICAgIEZJWE1FKCBkZGVtbCwgImVtcHR5IHN0dWJcbiIgKTsKKyAgICByZXR1cm4gRGRlUXVlcnlOZXh0U2VydmVyMzIoaENvbnZMaXN0LCBoQ29udlByZXYpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRGRlUXVlcnlOZXh0U2VydmVyMzIgW1VTRVIzMi4xMTJdCisgKi8KK0hDT05WIFdJTkFQSSBEZGVRdWVyeU5leHRTZXJ2ZXIzMiggSENPTlZMSVNUIGhDb252TGlzdCwgSENPTlYgaENvbnZQcmV2ICkKK3sKKyAgICBGSVhNRShkZGVtbCwgIiglbGQsJWxkKTogc3R1YlxuIixoQ29udkxpc3QsaENvbnZQcmV2KTsKICAgICByZXR1cm4gMDsKIH0KIAorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICAgRGRlRGlzY29ubmVjdExpc3QgKERERU1MLjYpCiAgKi8KQEAgLTI3Myw3ICsyODMsNyBAQAogICovCiBCT09MMzIgV0lOQVBJIERkZUZyZWVTdHJpbmdIYW5kbGUzMiggRFdPUkQgaWRJbnN0LCBIU1ogaHN6ICkKIHsKLSAgICBGSVhNRSggZGRlbWwsICJlbXB0eSBzdHViXG4iICk7CisgICAgRklYTUUoIGRkZW1sLCAiKCVkLCVkKTogc3R1YlxuIixpZEluc3QsIGhzeiApOwogICAgIHJldHVybiBUUlVFOwogfQogCkBAIC01MTEsNSArNTIxLDMgQEAKICAgICAgcmV0dXJuIDA7CiB9CiAKLQotCmRpZmYgLS1naXQgYS9taXNjL2RlYnVnc3RyLmMgYi9taXNjL2RlYnVnc3RyLmMKaW5kZXggZDVkOGU2OS4uNzg4MmIwZiAxMDA2NDQKLS0tIGEvbWlzYy9kZWJ1Z3N0ci5jCisrKyBiL21pc2MvZGVidWdzdHIuYwpAQCAtMTczLDcgKzE3Myw3IEBACiAJICBicmVhazsKIAlkZWZhdWx0OgogCSAgaWYgKCpzPCcgJykKLQkgICAgcHJpbnRmICgiXFwweCUwMngiLCAqcyk7CisJICAgIGZwcmludGYgKHN0ZGVyciwgIlxcMHglMDJ4IiwgKnMpOwogCSAgZWxzZQogCSAgICBmcHV0YyAoKnMsIHN0ZGVycik7CiAJfQpkaWZmIC0tZ2l0IGEvbWlzYy9pbWFnZWxpc3QuYyBiL21pc2MvaW1hZ2VsaXN0LmMKaW5kZXggMTdmNmQyYy4uOTVjMjdkOSAxMDA2NDQKLS0tIGEvbWlzYy9pbWFnZWxpc3QuYworKysgYi9taXNjL2ltYWdlbGlzdC5jCkBAIC00LDcgKzQsNiBAQAogICogIENvcHlyaWdodCAxOTk4IEVyaWMgS29obAogICoKICAqICBUT0RPOgotICogICAgLSBJbXByb3ZlIHRoZSBkb2N1bWVudGF0aW9uLgogICogICAgLSBJbXByb3ZlIGVycm9yIGNoZWNraW5nIGluIHNvbWUgZnVuY3Rpb25zLgogICogICAgLSBGaXggSUxEX1RSQU5TUEFSRU5UIGVycm9yIGluIEltYWdlTGlzdF9EcmF3SW5kaXJlY3QuCiAgKiAgICAtIEZpeCBvZmZzZXRzIGluIEltYWdlTGlzdF9EcmF3SW5kaXJlY3QuCkBAIC0zOCw3ICszNyw3IEBACiAjZGVmaW5lIF9fV0lORV9JTUFHRUxJU1RfQwogIAogLyogVGhpcyBtdXN0IGJlIGRlZmluZWQgdW50aWwgIkdldEljb25JbmZvIiBpcyBpbXBsZW1lbnRlZCBjb21wbGV0ZWx5LgotICogVG8gZG8gdGhhdCB0aGUgQ3Vyc29yIGFuZCBJY29uIGNvZGUgaW4gb2JqZWN0cy9jdXJzb3JpY29uLmMgbXVzdAorICogVG8gZG8gdGhhdCB0aGUgY3Vyc29yIGFuZCBpY29uIGNvZGUgaW4gb2JqZWN0cy9jdXJzb3JpY29uLmMgbXVzdAogICogYmUgcmV3cml0dGVuLgogICovCiAjZGVmaW5lIF9fR0VUX0lDT05fSU5GT19IQUNLX18gCkBAIC01OSwzMSArNTgsMzcgQEAKICNkZWZpbmUgTUFYX09WRVJMQVlJTUFHRSAxNQogCiAKLS8qCi0gKiBpbnRlcm5hbCBJbWFnZUxpc3QgZGF0YSB1c2VkIGZvciBkcmFnZ2luZwotICovCisvKiBpbnRlcm5hbCBpbWFnZSBsaXN0IGRhdGEgdXNlZCBmb3IgRHJhZyAmIERyb3Agb3BlcmF0aW9ucyAqLworCiBzdGF0aWMgSElNQUdFTElTVCBoaW1sSW50ZXJuYWxEcmFnID0gTlVMTDsKIHN0YXRpYyBJTlQzMiAgICAgIG5JbnRlcm5hbERyYWdIb3RzcG90WCA9IDA7CiBzdGF0aWMgSU5UMzIgICAgICBuSW50ZXJuYWxEcmFnSG90c3BvdFkgPSAwOwotc3RhdGljIEhDVVJTT1IzMiAgaGN1ckludGVybmFsID0gMDsKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJIAkJIElNQUdFTElTVF9JbnRlcm5hbEdyb3dCaXRtYXBzICAgW0ludGVybmFsXQorICogSU1BR0VMSVNUX0ludGVybmFsRXhwYW5kQml0bWFwcyBbSW50ZXJuYWxdIAogICoKLSAqICBHcm93cyB0aGUgYml0bWFwcyBvZiB0aGUgZ2l2ZW4gaW1hZ2UgbGlzdCBieSB0aGUgZ2l2ZW4gbnVtYmVyIG9mIAotICogIGltYWdlcy4gQ2FuIE5PVCBiZSB1c2VkIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIGltYWdlcy4KKyAqIEV4cGFuZHMgdGhlIGJpdG1hcHMgb2YgYW4gaW1hZ2UgbGlzdCBieSB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGltYWdlcy4KKyAqCisgKiBQQVJBTVMKKyAqICAgICBoaW1sICAgICAgICBbSV0gaW1hZ2UgbGlzdCBoYW5kbGUKKyAqICAgICBuSW1hZ2VDb3VudCBbSV0gTnVtYmVyIG9mIGltYWdlcyB0byBhZGQuCisgKgorICogUkVUVVJOUworICogICAgIG5vdGhpbmcKKyAqCisgKiBOT1RFUworICogICAgIFRoaXMgZnVuY3Rpb24gY2FuIE5PVCBiZSB1c2VkIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIGltYWdlcy4KICAqLwogCi1zdGF0aWMgdm9pZCBJTUFHRUxJU1RfSW50ZXJuYWxHcm93Qml0bWFwcyAoCi0JSElNQUdFTElTVCBoaW1sLCAgICAvKiBpbWFnZSBsaXN0IGhhbmRsZSAqLwotCUlOVDMyIG5JbWFnZUNvdW50KSAgLyogbnVtYmVyIG9mIGltYWdlcyB0byBncm93IGJ5ICovCitzdGF0aWMgVk9JRAorSU1BR0VMSVNUX0ludGVybmFsRXhwYW5kQml0bWFwcyAoSElNQUdFTElTVCBoaW1sLCBJTlQzMiBuSW1hZ2VDb3VudCkKIHsKICAgICBIREMzMiAgICAgaGRjSW1hZ2VMaXN0LCBoZGNCaXRtYXA7CiAgICAgSEJJVE1BUDMyIGhibU5ld0JpdG1hcDsKICAgICBJTlQzMiAgICAgbk5ld1dpZHRoLCBuTmV3Q291bnQ7CiAKLSAgICBUUkFDRShpbWFnZWxpc3QsICJDcmVhdGUgZ3Jvd24gYml0bWFwcyFcbiIpOworICAgIFRSQUNFKGltYWdlbGlzdCwgIkNyZWF0ZSBleHBhbmRlZCBiaXRtYXBzIVxuIik7CiAKICAgICBuTmV3Q291bnQgPSBoaW1sLT5jQ3VySW1hZ2UgKyBuSW1hZ2VDb3VudCArIGhpbWwtPmNHcm93OwogICAgIG5OZXdXaWR0aCA9IG5OZXdDb3VudCAqIGhpbWwtPmN4OwpAQCAtOTQsNyArOTksNyBAQAogICAgIGhibU5ld0JpdG1hcCA9CiAgICAgICAgIENyZWF0ZUJpdG1hcDMyIChuTmV3V2lkdGgsIGhpbWwtPmN5LCAxLCBoaW1sLT51Qml0c1BpeGVsLCBOVUxMKTsKICAgICBpZiAoaGJtTmV3Qml0bWFwID09IDApCi0gICAgICAgIEVSUiAoaW1hZ2VsaXN0LCAiRXJyb3IgY3JlYXRpbmcgbmV3IGltYWdlIGJpdG1hcCFcbiIpOworICAgICAgICBFUlIgKGltYWdlbGlzdCwgImNyZWF0aW5nIG5ldyBpbWFnZSBiaXRtYXAhXG4iKTsKIAogICAgIFNlbGVjdE9iamVjdDMyIChoZGNJbWFnZUxpc3QsIGhpbWwtPmhibUltYWdlKTsKICAgICBTZWxlY3RPYmplY3QzMiAoaGRjQml0bWFwLCBoYm1OZXdCaXRtYXApOwpAQCAtMTA5LDcgKzExNCw3IEBACiAgICAgICAgICAgICBDcmVhdGVCaXRtYXAzMiAobk5ld1dpZHRoLCBoaW1sLT5jeSwgMSwgMSwgTlVMTCk7CiAKICAgICAgICAgaWYgKGhibU5ld0JpdG1hcCA9PSAwKQotICAgICAgICAgICAgRVJSIChpbWFnZWxpc3QsICJFcnJvciBjcmVhdGluZyBuZXcgbWFzayBiaXRtYXAhIik7CisgICAgICAgICAgICBFUlIgKGltYWdlbGlzdCwgImNyZWF0aW5nIG5ldyBtYXNrIGJpdG1hcCEiKTsKIAogICAgICAgICBTZWxlY3RPYmplY3QzMiAoaGRjSW1hZ2VMaXN0LCBoaW1sLT5oYm1NYXNrKTsKICAgICAgICAgU2VsZWN0T2JqZWN0MzIgKGhkY0JpdG1hcCwgaGJtTmV3Qml0bWFwKTsKQEAgLTEyNyw5NyArMTMyLDkyIEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCSAJCSBJbWFnZUxpc3RfQWRkICAgW0NPTUNUTDMyLjM5XQorICogSW1hZ2VMaXN0X0FkZCBbQ09NQ1RMMzIuMzldCiAgKgotICogIEFkZCBhbiBpbWFnZSAoYW5kIGEgbWFzaykgdG8gYW4gaW1hZ2UgbGlzdC4KKyAqIEFkZCBhbiBpbWFnZSBvciBpbWFnZXMgdG8gYW4gaW1hZ2UgbGlzdC4KICAqCi0gKiAgUkVUVVJOUwotICogICAgSW5kZXggb2YgdGhlIGZpcnN0IGltYWdlIHRoYXQgd2FzIGFkZGVkLgotICogICAgLTEgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCisgKiBQQVJBTVMKKyAqICAgICBoaW1sICAgICBbSV0gaW1hZ2UgbGlzdCBoYW5kbGUKKyAqICAgICBoYm1JbWFnZSBbSV0gaW1hZ2UgYml0bWFwIGhhbmRsZQorICogICAgIGhibU1hc2sgIFtJXSBtYXNrIGJpdG1hcCBoYW5kbGUKKyAqCisgKiBSRVRVUk5TCisgKiAgICAgU3VjY2VzczogSW5kZXggb2YgdGhlIGZpcnN0IG5ldyBpbWFnZS4KKyAqICAgICBGYWlsdXJlOiAtMQogICovCiAKLUlOVDMyIFdJTkFQSSBJbWFnZUxpc3RfQWRkICgKLQlISU1BR0VMSVNUIGhpbWwsICAgICAvKiBpbWFnZWxpc3QgaGFuZGxlICovCi0JSEJJVE1BUDMyIGhibUltYWdlLCAgLyogaW1hZ2UgYml0bWFwICovCi0JSEJJVE1BUDMyIGhibU1hc2spICAgLyogbWFzayBiaXRtYXAgKi8KK0lOVDMyIFdJTkFQSQorSW1hZ2VMaXN0X0FkZCAoSElNQUdFTElTVCBoaW1sLAlIQklUTUFQMzIgaGJtSW1hZ2UsIEhCSVRNQVAzMiBoYm1NYXNrKQogewotICAgIEhEQzMyICAgIGhkY0ltYWdlTGlzdCwgaGRjSW1hZ2UsIGhkY01hc2s7CisgICAgSERDMzIgICAgaGRjU3JjLCBoZGNEc3Q7CiAgICAgSU5UMzIgICAgbkZpcnN0SW5kZXgsIG5JbWFnZUNvdW50OwogICAgIElOVDMyICAgIG5TdGFydFgsIG5SdW5YLCBuUnVuWTsKICAgICBCSVRNQVAzMiBibXA7CiAKICAgICBpZiAoaGltbCA9PSBOVUxMKSByZXR1cm4gKC0xKTsKLQotICAgIGhkY01hc2sgPSAwOyAvKiB0byBrZWVwIGNvbXBpbGVyIGhhcHB5IDstKSAqLworICAgIGlmIChoYm1JbWFnZSA9PSAwKSByZXR1cm4gKC0xKTsKIAogICAgIEdldE9iamVjdDMyQSAoaGJtSW1hZ2UsIHNpemVvZihCSVRNQVAzMiksIChMUFZPSUQpJmJtcCk7CiAgICAgbkltYWdlQ291bnQgPSBibXAuYm1XaWR0aCAvIGhpbWwtPmN4OwogCiAgICAgaWYgKGhpbWwtPmNDdXJJbWFnZSArIG5JbWFnZUNvdW50ID49IGhpbWwtPmNNYXhJbWFnZSkKLSAgICAgICAgSU1BR0VMSVNUX0ludGVybmFsR3Jvd0JpdG1hcHMgKGhpbWwsIG5JbWFnZUNvdW50KTsKKyAgICAgICAgSU1BR0VMSVNUX0ludGVybmFsRXhwYW5kQml0bWFwcyAoaGltbCwgbkltYWdlQ291bnQpOwogCi0gICAgaGRjSW1hZ2VMaXN0ID0gQ3JlYXRlQ29tcGF0aWJsZURDMzIgKDApOwotICAgIGhkY0ltYWdlID0gQ3JlYXRlQ29tcGF0aWJsZURDMzIgKDApOworICAgIGhkY1NyYyA9IENyZWF0ZUNvbXBhdGlibGVEQzMyICgwKTsKKyAgICBoZGNEc3QgPSBDcmVhdGVDb21wYXRpYmxlREMzMiAoMCk7CiAKLSAgICBTZWxlY3RPYmplY3QzMiAoaGRjSW1hZ2VMaXN0LCBoaW1sLT5oYm1JbWFnZSk7Ci0gICAgU2VsZWN0T2JqZWN0MzIgKGhkY0ltYWdlLCBoYm1JbWFnZSk7CisgICAgU2VsZWN0T2JqZWN0MzIgKGhkY0RzdCwgaGltbC0+aGJtSW1hZ2UpOworICAgIFNlbGVjdE9iamVjdDMyIChoZGNTcmMsIGhibUltYWdlKTsKIAotICAgIEJpdEJsdDMyIChoZGNJbWFnZUxpc3QsIGhpbWwtPmNDdXJJbWFnZSAqIGhpbWwtPmN4LCAwLAotICAgICAgICAgICAgICBibXAuYm1XaWR0aCwgaGltbC0+Y3ksIGhkY0ltYWdlLCAwLCAwLCBTUkNDT1BZKTsKKyAgICBCaXRCbHQzMiAoaGRjRHN0LCBoaW1sLT5jQ3VySW1hZ2UgKiBoaW1sLT5jeCwgMCwKKyAgICAgICAgICAgICAgYm1wLmJtV2lkdGgsIGhpbWwtPmN5LCBoZGNTcmMsIDAsIDAsIFNSQ0NPUFkpOwogICAgICAgICAgIAotICAgIGlmIChoaW1sLT5oYm1NYXNrKQotICAgIHsKLSAgICAgICAgaWYgKGhibU1hc2spCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNlbGVjdE9iamVjdDMyIChoZGNJbWFnZUxpc3QsIGhpbWwtPmhibU1hc2spOwotICAgICAgICAgICAgU2VsZWN0T2JqZWN0MzIgKGhkY0ltYWdlLCBoYm1NYXNrKTsKLSAgICAgICAgICAgIEJpdEJsdDMyIChoZGNJbWFnZUxpc3QsIGhpbWwtPmNDdXJJbWFnZSAqIGhpbWwtPmN4LCAwLAotICAgICAgICAgICAgICAgICAgICAgIGJtcC5ibVdpZHRoLCBoaW1sLT5jeSwgaGRjSW1hZ2UsIDAsIDAsIFNSQ0NPUFkpOworICAgIGlmIChoaW1sLT5oYm1NYXNrKSB7CisgICAgICAgIGlmIChoYm1NYXNrKSB7CisgICAgICAgICAgICBTZWxlY3RPYmplY3QzMiAoaGRjRHN0LCBoaW1sLT5oYm1NYXNrKTsKKyAgICAgICAgICAgIFNlbGVjdE9iamVjdDMyIChoZGNTcmMsIGhibU1hc2spOworICAgICAgICAgICAgQml0Qmx0MzIgKGhkY0RzdCwgaGltbC0+Y0N1ckltYWdlICogaGltbC0+Y3gsIDAsCisgICAgICAgICAgICAgICAgICAgICAgYm1wLmJtV2lkdGgsIGhpbWwtPmN5LCBoZGNTcmMsIDAsIDAsIFNSQ0NPUFkpOwogCiAgICAgICAgICAgICAvKiBmaXggdHJhbnNwYXJlbnQgYXJlYXMgb2YgdGhlIGltYWdlIGJpdG1hcCovCi0gICAgICAgICAgICBTZWxlY3RPYmplY3QzMiAoaGRjTWFzaywgaGltbC0+aGJtTWFzayk7Ci0gICAgICAgICAgICBTZWxlY3RPYmplY3QzMiAoaGRjSW1hZ2UsIGhpbWwtPmhibUltYWdlKTsKKyAgICAgICAgICAgIFNlbGVjdE9iamVjdDMyIChoZGNTcmMsIGhpbWwtPmhibU1hc2spOworICAgICAgICAgICAgU2VsZWN0T2JqZWN0MzIgKGhkY0RzdCwgaGltbC0+aGJtSW1hZ2UpOwogICAgICAgICAgICAgblN0YXJ0WCA9IGhpbWwtPmNDdXJJbWFnZSAqIGhpbWwtPmN4OwotICAgICAgICAgICAgZm9yIChuUnVuWSA9IDA7IG5SdW5ZIDwgaGltbC0+Y3k7IG5SdW5ZKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yIChuUnVuWCA9IDA7IG5SdW5YIDwgYm1wLmJtV2lkdGg7IG5SdW5YKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoR2V0UGl4ZWwzMiAoaGRjTWFzaywgblN0YXJ0WCArIG5SdW5YLCBuUnVuWSkgPT0KLSAgICAgICAgICAgICAgICAgICAgICAgIFJHQigyNTUsIDI1NSwgMjU1KSkKLSAgICAgICAgICAgICAgICAgICAgICAgIFNldFBpeGVsMzIgKGhkY0ltYWdlLCBuU3RhcnRYICsgblJ1blgsIG5SdW5ZLCAKKworICAgICAgICAgICAgZm9yIChuUnVuWSA9IDA7IG5SdW5ZIDwgaGltbC0+Y3k7IG5SdW5ZKyspIHsKKyAgICAgICAgICAgICAgICBmb3IgKG5SdW5YID0gMDsgblJ1blggPCBibXAuYm1XaWR0aDsgblJ1blgrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoR2V0UGl4ZWwzMiAoaGRjU3JjLCBuU3RhcnRYICsgblJ1blgsIG5SdW5ZKSAhPQorICAgICAgICAgICAgICAgICAgICAgICAgUkdCKDAsIDAsIDApKQorICAgICAgICAgICAgICAgICAgICAgICAgU2V0UGl4ZWwzMiAoaGRjRHN0LCBuU3RhcnRYICsgblJ1blgsIG5SdW5ZLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJHQigwLCAwLCAwKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgeworICAgICAgICBlbHNlIHsKICAgICAgICAgICAgIC8qIGNyZWF0ZSBtYXNrIGZyb20gdGhlIGltYWdlbGlzdCdzIGJhY2tncm91bmQgY29sb3IgKi8KLSAgICAgICAgICAgIGhkY01hc2sgPSBDcmVhdGVDb21wYXRpYmxlREMzMiAoMCk7Ci0gICAgICAgICAgICBTZWxlY3RPYmplY3QzMiAoaGRjTWFzaywgaGltbC0+aGJtTWFzayk7CisgICAgICAgICAgICBTZWxlY3RPYmplY3QzMiAoaGRjRHN0LCBoaW1sLT5oYm1NYXNrKTsKKyAgICAgICAgICAgIFNlbGVjdE9iamVjdDMyIChoZGNTcmMsIGhpbWwtPmhibUltYWdlKTsKICAgICAgICAgICAgIG5TdGFydFggPSBoaW1sLT5jQ3VySW1hZ2UgKiBoaW1sLT5jeDsKLSAgICAgICAgICAgIGZvciAoblJ1blkgPSAwOyBuUnVuWSA8IGhpbWwtPmN5OyBuUnVuWSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAoblJ1blggPSAwOyBuUnVuWCA8IGJtcC5ibVdpZHRoOyBuUnVuWCsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKEdldFBpeGVsMzIgKGhkY0ltYWdlTGlzdCwgblN0YXJ0WCArIG5SdW5YLCBuUnVuWSkgPT0KKyAgICAgICAgICAgIGZvciAoblJ1blkgPSAwOyBuUnVuWSA8IGhpbWwtPmN5OyBuUnVuWSsrKSB7CisgICAgICAgICAgICAgICAgZm9yIChuUnVuWCA9IDA7IG5SdW5YIDwgYm1wLmJtV2lkdGg7IG5SdW5YKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEdldFBpeGVsMzIgKGhkY1NyYywgblN0YXJ0WCArIG5SdW5YLCBuUnVuWSkgPT0KICAgICAgICAgICAgICAgICAgICAgICAgIGhpbWwtPmNsckJrKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXRQaXhlbDMyIChoZGNJbWFnZUxpc3QsIG5TdGFydFggKyBuUnVuWCwgblJ1blksIAorICAgICAgICAgICAgICAgICAgICAgICAgU2V0UGl4ZWwzMiAoaGRjU3JjLCBuU3RhcnRYICsgblJ1blgsIG5SdW5ZLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJHQigwLCAwLCAwKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXRQaXhlbDMyIChoZGNNYXNrLCBuU3RhcnRYICsgblJ1blgsIG5SdW5ZLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIFNldFBpeGVsMzIgKGhkY0RzdCwgblN0YXJ0WCArIG5SdW5YLCBuUnVuWSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSR0IoMjU1LCAyNTUsIDI1NSkpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIFNldFBpeGVsMzIgKGhkY01hc2ssIG5TdGFydFggKyBuUnVuWCwgblJ1blksIAorICAgICAgICAgICAgICAgICAgICAgICAgU2V0UGl4ZWwzMiAoaGRjRHN0LCBuU3RhcnRYICsgblJ1blgsIG5SdW5ZLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJHQigwLCAwLCAwKSk7ICAgICAgICAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBEZWxldGVEQzMyIChoZGNNYXNrKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIERlbGV0ZURDMzIgKGhkY0ltYWdlTGlzdCk7Ci0gICAgRGVsZXRlREMzMiAoaGRjSW1hZ2UpOworICAgIERlbGV0ZURDMzIgKGhkY1NyYyk7CisgICAgRGVsZXRlREMzMiAoaGRjRHN0KTsKIAogICAgIG5GaXJzdEluZGV4ID0gaGltbC0+Y0N1ckltYWdlOwogICAgIGhpbWwtPmNDdXJJbWFnZSArPSBuSW1hZ2VDb3VudDsKQEAgLTIyNywzMyArMjI3LDM3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCSAJCSBJbWFnZUxpc3RfQWRkTWFza2VkICAgW0NPTUNUTDMyLjQxXQorICogSW1hZ2VMaXN0X0FkZE1hc2tlZCBbQ09NQ1RMMzIuNDFdIAogICoKLSAqICBBZGRzIGFuIGltYWdlIHRvIGFuIGltYWdlbGlzdCBhbmQgY3JlYXRlcyBhIG1hc2sgZnJvbSB0aGUgZ2l2ZW4KLSAqICBtYXNrIGNvbG9yLgorICogQWRkcyBhbiBpbWFnZSBvciBpbWFnZXMgdG8gYW4gaW1hZ2UgbGlzdCBhbmQgY3JlYXRlcyBhIG1hc2sgZnJvbSB0aGUKKyAqIHNwZWNpZmllZCBiaXRtYXAgdXNpbmcgdGhlIG1hc2sgY29sb3IuCiAgKgotICogIFJFVFVSTlMKLSAqICAgIEluZGV4IG9mIHRoZSBmaXJzdCBpbWFnZSB0aGF0IHdhcyBhZGRlZC4KLSAqICAgIC0xIGlmIGFuIGVycm9yIG9jY3VycmVkLgorICogUEFSQU1TCisgKiAgICAgaGltbCAgICAgW0ldIGltYWdlIGxpc3QgaGFuZGxlLgorICogICAgIGhibUltYWdlIFtJXSBpbWFnZSBiaXRtYXAgaGFuZGxlLgorICogICAgIGNsck1hc2sgIFtJXSBtYXNrIGNvbG9yLgorICoKKyAqIFJFVFVSTlMKKyAqICAgICBTdWNjZXNzOiBJbmRleCBvZiB0aGUgZmlyc3QgbmV3IGltYWdlLgorICogICAgIEZhaWx1cmU6IC0xCiAgKi8KIAotSU5UMzIgV0lOQVBJIEltYWdlTGlzdF9BZGRNYXNrZWQgKAotCUhJTUFHRUxJU1QgaGltbCwgICAgLyogaW1hZ2UgbGlzdCBoYW5kbGUgKi8KLQlIQklUTUFQMzIgaGJtSW1hZ2UsIC8qIGJpdG1hcCBoYW5kbGUgKi8KLQlDT0xPUlJFRiBjbHJNYXNrKSAgIC8qIGJhY2tyb3VuZCBjb2xvciBvZiB0aGUgaW1hZ2UgKi8KK0lOVDMyIFdJTkFQSQorSW1hZ2VMaXN0X0FkZE1hc2tlZCAoSElNQUdFTElTVCBoaW1sLCBIQklUTUFQMzIgaGJtSW1hZ2UsIENPTE9SUkVGIGNsck1hc2spCiB7CiAgICAgSERDMzIgICAgaGRjSW1hZ2VMaXN0LCBoZGNJbWFnZSwgaGRjTWFzazsKICAgICBJTlQzMiAgICBuSW5kZXgsIG5JbWFnZUNvdW50OwogICAgIEJJVE1BUDMyIGJtcDsKICAgICBJTlQzMiAgICBuU3RhcnRYLCBuUnVuWCwgblJ1blk7CiAKLSAgICBpZiAoaGltbCA9PSBOVUxMKSByZXR1cm4gKC0xKTsKKyAgICBpZiAoaGltbCA9PSBOVUxMKQorCXJldHVybiAoLTEpOwogCiAgICAgR2V0T2JqZWN0MzJBIChoYm1JbWFnZSwgc2l6ZW9mKEJJVE1BUDMyKSwgJmJtcCk7CiAgICAgbkltYWdlQ291bnQgPSBibXAuYm1XaWR0aCAvIGhpbWwtPmN4OwogCiAgICAgaWYgKGhpbWwtPmNDdXJJbWFnZSArIG5JbWFnZUNvdW50ID49IGhpbWwtPmNNYXhJbWFnZSkKLSAgICAgICAgSU1BR0VMSVNUX0ludGVybmFsR3Jvd0JpdG1hcHMgKGhpbWwsIG5JbWFnZUNvdW50KTsKKyAgICAgICAgSU1BR0VMSVNUX0ludGVybmFsRXhwYW5kQml0bWFwcyAoaGltbCwgbkltYWdlQ291bnQpOwogCiAgICAgbkluZGV4ID0gaGltbC0+Y0N1ckltYWdlOwogICAgIGhpbWwtPmNDdXJJbWFnZSArPSBuSW1hZ2VDb3VudDsKQEAgLTI2NiwxNiArMjcwLDEzIEBACiAgICAgQml0Qmx0MzIgKGhkY0ltYWdlTGlzdCwgbkluZGV4ICogaGltbC0+Y3gsIDAsIGJtcC5ibVdpZHRoLCBoaW1sLT5jeSwKICAgICAgICAgICAgICAgaGRjSW1hZ2UsIDAsIDAsIFNSQ0NPUFkpOwogCi0gICAgaWYgKGhpbWwtPmhibU1hc2spCi0gICAgeworICAgIGlmIChoaW1sLT5oYm1NYXNrKSB7CiAgICAgICAgIC8qIGNyZWF0ZSBNYXNrICovCiAgICAgICAgIGhkY01hc2sgPSBDcmVhdGVDb21wYXRpYmxlREMzMiAoMCk7CiAgICAgICAgIFNlbGVjdE9iamVjdDMyIChoZGNNYXNrLCBoaW1sLT5oYm1NYXNrKTsKICAgICAgICAgblN0YXJ0WCA9IG5JbmRleCAqIGhpbWwtPmN4OwotICAgICAgICBmb3IgKG5SdW5ZID0gMDsgblJ1blkgPCBoaW1sLT5jeTsgblJ1blkrKykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChuUnVuWCA9IDA7IG5SdW5YIDwgYm1wLmJtV2lkdGg7IG5SdW5YKyspCi0gICAgICAgICAgICB7CisgICAgICAgIGZvciAoblJ1blkgPSAwOyBuUnVuWSA8IGhpbWwtPmN5OyBuUnVuWSsrKSB7CisgICAgICAgICAgICBmb3IgKG5SdW5YID0gMDsgblJ1blggPCBibXAuYm1XaWR0aDsgblJ1blgrKykgewogICAgICAgICAgICAgICAgIGlmIChHZXRQaXhlbDMyIChoZGNJbWFnZUxpc3QsIG5TdGFydFggKyBuUnVuWCwgblJ1blkpID09CiAgICAgICAgICAgICAgICAgICAgIGNsck1hc2spCiAgICAgICAgICAgICAgICAgewpAQCAtMjk5LDMzICszMDAsNDAgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJIAkJIEltYWdlTGlzdF9CZWdpbkRyYWcgICBbQ09NQ1RMMzIuNDJdCisgKiBJbWFnZUxpc3RfQmVnaW5EcmFnIFtDT01DVEwzMi40Ml0gCiAgKgotICogIENyZWF0ZXMgYSB0ZW1wb3JhcnkgaW1hZ2VsaXN0IHdpdGggYW4gaW1hZ2UgaW4gaXQsIHdoaWNoIHdpbGwgYmUgdXNlZAotICogIGFzIGEgZHJhZyBpbWFnZS4KKyAqIENyZWF0ZXMgYSB0ZW1wb3JhcnkgaW1hZ2UgbGlzdCB0aGF0IGNvbnRhaW5zIG9uZSBpbWFnZS4gSXQgd2lsbCBiZSB1c2VkCisgKiBhcyBhIGRyYWcgaW1hZ2UuCiAgKgotICogIFJFVFVSTlMKLSAqICAgIC4uLgorICogUEFSQU1TCisgKiAgICAgaGltbFRyYWNrIFtJXSBIYW5kbGUgb2YgdGhlIHNvdXJjZSBpbWFnZSBsaXN0CisgKiAgICAgaVRyYWNrICAgIFtJXSBJbmRleCBvZiB0aGUgZHJhZyBpbWFnZSBpbiB0aGUgc291cmNlIGltYWdlIGxpc3QKKyAqICAgICBkeEhvdHNwb3QgW0ldIFggcG9zaXRpb24gb2YgdGhlIGhvdCBzcG90IG9mIHRoZSBkcmFnIGltYWdlCisgKiAgICAgZHlIb3RzcG90IFtJXSBZIHBvc2l0aW9uIG9mIHRoZSBob3Qgc3BvdCBvZiB0aGUgZHJhZyBpbWFnZQorICoKKyAqIFJFVFVSTlMKKyAqICAgICBTdWNjZXNzOiBUUlVFCisgKiAgICAgRmFpbHVyZTogRkFMU0UKICAqLwogCi1CT09MMzIgV0lOQVBJIEltYWdlTGlzdF9CZWdpbkRyYWcgKAotCUhJTUFHRUxJU1QgaGltbFRyYWNrLCAvKiBIYW5kbGUgb2YgdGhlIHNvdXJjZSBpbWFnZWxpc3QgKi8KLQlJTlQzMiBpVHJhY2ssICAgICAgICAgLyogSW5kZXggb2YgdGhlIGltYWdlIGluIHRoZSBzb3VyY2UgaW1hZ2VsaXN0ICovCi0JSU5UMzIgZHhIb3RzcG90LCAgICAgIC8qIFBvc2l0aW9uIG9mIHRoZSBob3Qgc3BvdCBvZiB0aGUgKi8KLQlJTlQzMiBkeUhvdHNwb3QpICAgICAgLyogZHJhZyBpbWFnZSAqLworQk9PTDMyIFdJTkFQSQorSW1hZ2VMaXN0X0JlZ2luRHJhZyAoSElNQUdFTElTVCBoaW1sVHJhY2ssIElOVDMyIGlUcmFjaywKKwkgICAgICAgICAgICAgSU5UMzIgZHhIb3RzcG90LCBJTlQzMiBkeUhvdHNwb3QpCiB7CiAgICAgSERDMzIgaGRjU3JjLCBoZGNEc3Q7CiAKLSAgICBGSVhNRShpbWFnZWxpc3QsICJJbWFnZUxpc3RfQmVnaW5EcmFnOiBwYXJ0aWFsbHkgaW1wbGVtZW50ZWQhXG4iKTsKKyAgICBGSVhNRShpbWFnZWxpc3QsICJwYXJ0aWFsbHkgaW1wbGVtZW50ZWQhXG4iKTsKIAotICAgIGlmIChoaW1sVHJhY2sgPT0gTlVMTCkgcmV0dXJuIChGQUxTRSk7CisgICAgaWYgKGhpbWxUcmFjayA9PSBOVUxMKQorCXJldHVybiAoRkFMU0UpOworCiAgICAgaWYgKGhpbWxJbnRlcm5hbERyYWcpCiAgICAgICAgIEltYWdlTGlzdF9FbmREcmFnICgpOwogCi0gICAgaGltbEludGVybmFsRHJhZyA9IEltYWdlTGlzdF9DcmVhdGUgKGhpbWxUcmFjay0+Y3gsIGhpbWxUcmFjay0+Y3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbWxUcmFjay0+ZmxhZ3MsIDEsIDEpOwotICAgIGlmIChoaW1sSW50ZXJuYWxEcmFnID09IE5VTEwpCi0gICAgeworICAgIGhpbWxJbnRlcm5hbERyYWcgPQorCUltYWdlTGlzdF9DcmVhdGUgKGhpbWxUcmFjay0+Y3gsIGhpbWxUcmFjay0+Y3ksCisJCQkgIGhpbWxUcmFjay0+ZmxhZ3MsIDEsIDEpOworICAgIGlmIChoaW1sSW50ZXJuYWxEcmFnID09IE5VTEwpIHsKICAgICAgICAgRVJSKGltYWdlbGlzdCwgIkVycm9yIGNyZWF0aW5nIGRyYWcgaW1hZ2UgbGlzdCFcbiIpOwogICAgICAgICByZXR1cm4gKEZBTFNFKTsKICAgICB9CkBAIC0zNTgsMjQgKzM2NiwzMSBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkgCQkgSW1hZ2VMaXN0X0NvcHkgICBbQ09NQ1RMMzIuNDNdCisgKiBJbWFnZUxpc3RfQ29weSBbQ09NQ1RMMzIuNDNdIAogICoKLSAqICBDb3BpZXMgYW4gaW1hZ2Ugb2YgdGhlIHNvdXJjZSBpbWFnZWxpc3QgdG8gYW4gaW1hZ2Ugb2YgdGhlIAotICogIGRlc3RpbmF0aW9uIGltYWdlbGlzdC4gSW1hZ2VzIGNhbiBiZSBjb3BpZWQgb3Igc3dhcHBlZC4KLSAqICBDb3B5aW5nIGZyb20gb25lIGltYWdlbGlzdCB0byBhbm90aGVyIGlzIGFsbG93ZWQsIGluIGNvbnRyYXJ5IHRvCi0gKiAgTSQncyBvcmlnaW5hbCBpbXBsZW1lbnRhdGlvbi4gVGhleSBqdXN0IGFsbG93IGNvcHlpbmcgb3Igc3dhcHBpbmcKLSAqICB3aXRoaW4gb25lIGltYWdlbGlzdCAoaGltbERzdCBhbmQgaGltbFNyYyBtdXN0IGJlIHRoZSBzYW1lKS4KKyAqICBDb3BpZXMgYW4gaW1hZ2Ugb2YgdGhlIHNvdXJjZSBpbWFnZSBsaXN0IHRvIGFuIGltYWdlIG9mIHRoZSAKKyAqICBkZXN0aW5hdGlvbiBpbWFnZSBsaXN0LiBJbWFnZXMgY2FuIGJlIGNvcGllZCBvciBzd2FwcGVkLgogICoKLSAqICBSRVRVUk5TCi0gKiAgICAuLi4KKyAqIFBBUkFNUworICogICAgIGhpbWxEc3QgW0ldIGRlc3RpbmF0aW9uIGltYWdlIGxpc3QgaGFuZGxlLgorICogICAgIGlEc3QgICAgW0ldIGRlc3RpbmF0aW9uIGltYWdlIGluZGV4LgorICogICAgIGhpbWxTcmMgW0ldIHNvdXJjZSBpbWFnZSBsaXN0IGhhbmRsZQorICogICAgIGlTcmMgICAgW0ldIHNvdXJjZSBpbWFnZSBpbmRleAorICogICAgIHVGbGFncyAgW0ldIGZsYWdzIGZvciB0aGUgY29weSBvcGVyYXRpb24KKyAqCisgKiBSRVRVUk5TCisgKiAgICAgU3VjY2VzczogVFJVRQorICogICAgIEZhaWx1cmU6IEZBTFNFCisgKgorICogTk9URVMKKyAqICAgICBDb3B5aW5nIGZyb20gb25lIGltYWdlIGxpc3QgdG8gYW5vdGhlciBpcyBwb3NzaWJsZS4gVGhlIG9yaWdpbmFsCisgKiAgICAgaW1wbGVtZW50YXRpb24ganVzdCBjb3BpZXMgb3Igc3dhcHBzIHdpdGhpbiBvbmUgaW1hZ2UgbGlzdC4KKyAqICAgICBDb3VsZCB0aGlzIGZlYXR1cmUgYmVjb21lIGEgYnVnPz8/IDstKQogICovCiAKLUJPT0wzMiBXSU5BUEkgSW1hZ2VMaXN0X0NvcHkgKAotCUhJTUFHRUxJU1QgaGltbERzdCwgIC8qIEhhbmRsZSBvZiB0aGUgZGVzdGluYXRpb24gaW1hZ2VsaXN0ICovCi0JSU5UMzIgaURzdCwgICAgICAgICAgLyogSW5kZXggb2YgdGhlIGRlc3RpbmF0aW9uIGltYWdlICovCi0JSElNQUdFTElTVCBoaW1sU3JjLCAgLyogSGFuZGVsIG9kIHRoZSBzb3VyY2UgaW1hZ2VsaXN0ICovCi0JSU5UMzIgaVNyYywgICAgICAgICAgLyogSW5kZXggb2YgdGhlIHNvdXJjZSBpbWFnZSAqLwotCUlOVDMyIHVGbGFncykgICAgICAgIC8qIEZsYWdzIHVzZWQgZm9yIHRoZSBjb3B5IG9wZXJhdGlvbiAqLworQk9PTDMyIFdJTkFQSQorSW1hZ2VMaXN0X0NvcHkgKEhJTUFHRUxJU1QgaGltbERzdCwgSU5UMzIgaURzdCwJSElNQUdFTElTVCBoaW1sU3JjLAorCQlJTlQzMiBpU3JjLCBJTlQzMiB1RmxhZ3MpCiB7CiAgICAgSERDMzIgaGRjU3JjLCBoZGNEc3Q7ICAgIAogCkBAIC0zOTEsOCArNDA2LDcgQEAKICAgICBlbHNlCiAgICAgICAgIGhkY0RzdCA9IENyZWF0ZUNvbXBhdGlibGVEQzMyICgwKTsKIAotICAgIGlmICh1RmxhZ3MgJiBJTENGX1NXQVApCi0gICAgeworICAgIGlmICh1RmxhZ3MgJiBJTENGX1NXQVApIHsKICAgICAgICAgLyogc3dhcCAqLwogICAgICAgICBIQklUTUFQMzIgaGJtVGVtcEltYWdlLCBoYm1UZW1wTWFzazsKIApAQCAtNDQ1LDggKzQ1OSw3IEBACiAgICAgICAgIERlbGV0ZU9iamVjdDMyIChoYm1UZW1wTWFzayk7CiAgICAgICAgIERlbGV0ZU9iamVjdDMyIChoYm1UZW1wSW1hZ2UpOwogICAgIH0KLSAgICBlbHNlCi0gICAgeworICAgIGVsc2UgewogICAgICAgICAvKiBjb3B5IGltYWdlICovCiAgICAgICAgIFNlbGVjdE9iamVjdDMyIChoZGNTcmMsIGhpbWxTcmMtPmhibUltYWdlKTsKICAgICAgICAgaWYgKGhpbWxTcmMgPT0gaGltbERzdCkKQEAgLTQ3NywyMiArNDkwLDI1IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCSAJCSBJbWFnZUxpc3RfQ3JlYXRlICAgW0NPTUNUTDMyLjQ0XQorICogSW1hZ2VMaXN0X0NyZWF0ZSBbQ09NQ1RMMzIuNDRdIAogICoKLSAqICBDcmVhdGVzIGFuIGltYWdlbGlzdCBvZiB0aGUgZ2l2ZW4gaW1hZ2Ugc2l6ZSBhbmQgbnVtYmVyIG9mIGltYWdlcy4KKyAqIENyZWF0ZXMgYSBuZXcgaW1hZ2UgbGlzdC4KICAqCi0gKiAgUkVUVVJOUwotICogICAgSGFuZGxlIG9mIHRoZSBjcmVhdGVkIGltYWdlIGxpc3QuCi0gKiAgICAwIGlmIGFuIGVycm9yIG9jY3VycmVkLgorICogUEFSQU1TCisgKiAgICAgY3ggICAgICAgW0ldIGltYWdlIGhlaWdodAorICogICAgIGN5ICAgICAgIFtJXSBpbWFnZSB3aWR0aAorICogICAgIGZsYWdzICAgIFtJXSBjcmVhdGlvbiBmbGFncworICogICAgIGNJbml0aWFsIFtJXSBpbml0aWFsIG51bWJlciBvZiBpbWFnZXMgaW4gdGhlIGltYWdlIGxpc3QKKyAqICAgICBjR3JvdyAgICBbSV0gbnVtYmVyIG9mIGltYWdlcyBieSB3aGljaCBpbWFnZSBsaXN0IGdyb3dzCisgKgorICogUkVUVVJOUworICogICAgIFN1Y2Nlc3M6IEhhbmRsZSBvZiB0aGUgY3JlYXRlZCBpbWFnZSBsaXN0CisgKiAgICAgRmFpbHVyZTogMAogICovCiAKLUhJTUFHRUxJU1QgV0lOQVBJIEltYWdlTGlzdF9DcmVhdGUgKAotCUlOVDMyIGN4LCAgICAgICAgLyogV2lkdGggb2YgYW4gaW1hZ2UgKi8KLQlJTlQzMiBjeSwgICAgICAgIC8qIEhlaWdodCBvZiBhbiBpbWFnZSAqLwotCVVJTlQzMiBmbGFncywgICAgLyogRmxhZ3MgZm9yIGltYWdlbGlzdCBjcmVhdGlvbiAqLwotCUlOVDMyIGNJbml0aWFsLCAgLyogSW5pdGlhbCBudW1iZXIgb2YgaW1hZ2VzIGluIHRoZSBpbWFnbGlzdCAqLwotCUlOVDMyIGNHcm93KSAgICAgLyogTnVtYmVyIG9mIGltYWdlcyB0aGF0IGlzIGFkZGVkIHRvIHRoZSAqLwotCSAgICAgICAgICAgICAgICAgLyogaW1hZ2VsaXN0IHdoZW4gaXQgZ3Jvd3MgKi8KK0hJTUFHRUxJU1QgV0lOQVBJCitJbWFnZUxpc3RfQ3JlYXRlIChJTlQzMiBjeCwgSU5UMzIgY3ksIFVJTlQzMiBmbGFncywKKwkJICBJTlQzMiBjSW5pdGlhbCwgSU5UMzIgY0dyb3cpCiB7CiAgICAgSElNQUdFTElTVCBoaW1sOwogICAgIEhEQzMyICAgICAgaGRjOwpAQCAtNTMxLDE4ICs1NDcsMTUgQEAKICAgICBoaW1sLT5oYm1JbWFnZSA9CiAgICAgICAgIENyZWF0ZUJpdG1hcDMyIChoaW1sLT5jeCAqIGhpbWwtPmNNYXhJbWFnZSwgaGltbC0+Y3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAxLCBoaW1sLT51Qml0c1BpeGVsLCBOVUxMKTsKLSAgICBpZiAoaGltbC0+aGJtSW1hZ2UgPT0gMCkKLSAgICB7CisgICAgaWYgKGhpbWwtPmhibUltYWdlID09IDApIHsKICAgICAgICAgRVJSKGltYWdlbGlzdCwgIkVycm9yIGNyZWF0aW5nIGltYWdlIGJpdG1hcCFcbiIpOwogICAgICAgICByZXR1cm4gKDApOwogICAgIH0KIAotICAgIGlmIChoaW1sLT5mbGFncyAmIElMQ19NQVNLKQotICAgIHsKKyAgICBpZiAoaGltbC0+ZmxhZ3MgJiBJTENfTUFTSykgewogICAgICAgICBoaW1sLT5oYm1NYXNrID0gCiAgICAgICAgICAgICBDcmVhdGVCaXRtYXAzMiAoaGltbC0+Y3ggKiBoaW1sLT5jTWF4SW1hZ2UsIGhpbWwtPmN5LCAxLCAxLCBOVUxMKTsKLSAgICAgICAgaWYgKGhpbWwtPmhibU1hc2sgPT0gMCkKLSAgICAgICAgeworICAgICAgICBpZiAoaGltbC0+aGJtTWFzayA9PSAwKSB7CiAgICAgICAgICAgICBFUlIoaW1hZ2VsaXN0LCAiRXJyb3IgY3JlYXRpbmcgbWFzayBiaXRtYXAhXG4iKTsKICAgICAgICAgICAgIGlmIChoaW1sLT5oYm1JbWFnZSkKICAgICAgICAgICAgICAgICBEZWxldGVPYmplY3QzMiAoaGltbC0+aGJtSW1hZ2UpOwpAQCAtNTY2LDE3ICs1NzksMjAgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJIAkJIEltYWdlTGlzdF9EZXN0cm95ICAgW0NPTUNUTDMyLjQ1XQorICogSW1hZ2VMaXN0X0Rlc3Ryb3kgW0NPTUNUTDMyLjQ1XSAKICAqCi0gKiAgRGVzdHJveSB0aGUgZ2l2ZW4gaW1hZ2VsaXN0LgorICogRGVzdHJveXMgYW4gaW1hZ2UgbGlzdC4KICAqCi0gKiAgUkVUVVJOUwotICogICAgVFJVRSBpZiB0aGUgaW1hZ2UgbGlzdCB3YXMgZGVzdHJveWVkLgotICogICAgRkFMU0UgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCisgKiBQQVJBTVMKKyAqICAgICBoaW1sIFtJXSBpbWFnZSBsaXN0IGhhbmRsZQorICoKKyAqIFJFVFVSTlMKKyAqICAgICBTdWNjZXNzOiBUUlVFCisgKiAgICAgRmFpbHVyZTogRkFMU0UKICAqLwogCi1CT09MMzIgV0lOQVBJIEltYWdlTGlzdF9EZXN0cm95ICgKLQlISU1BR0VMSVNUIGhpbWwpICAvKiBIYW5kbGUgb2YgdGhlIGltYWdlbGlzdCAqLworQk9PTDMyIFdJTkFQSQorSW1hZ2VMaXN0X0Rlc3Ryb3kgKEhJTUFHRUxJU1QgaGltbCkKIHsgCiAgICAgaWYgKGhpbWwgPT0gTlVMTCkgcmV0dXJuIChGQUxTRSk7CiAKQEAgLTU5MSw2OCArNjA3LDEwNSBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkgCQkgSW1hZ2VMaXN0X0RyYWdFbnRlciAgIFtDT01DVEwzMi40Nl0KKyAqIEltYWdlTGlzdF9EcmFnRW50ZXIgW0NPTUNUTDMyLjQ2XSAKICAqCi0gKiAgRklYTUUKLSAqICAgIFRoaXMgaXMgc3RpbGwgYW4gZW1wdHkgc3R1Yi4KKyAqIExvY2tzIHdpbmRvdyB1cGRhdGUgYW5kIGRpc3BsYXlzIHRoZSBkcmFnIGltYWdlIGF0IHRoZSBnaXZlbiBwb3NpdGlvbi4KKyAqCisgKiBQQVJBTVMKKyAqICAgICBod25kTG9jayBbSV0gaGFuZGxlIG9mIHRoZSB3aW5kb3cgdGhhdCBvd25zIHRoZSBkcmFnIGltYWdlLgorICogICAgIHggICAgICAgIFtJXSBYIHBvc2l0aW9uIG9mIHRoZSBkcmFnIGltYWdlLgorICogICAgIHkgICAgICAgIFtJXSBZIHBvc2l0aW9uIG9mIHRoZSBkcmFnIGltYWdlLgorICoKKyAqIFJFVFVSTlMKKyAqICAgICBTdWNjZXNzOiBUUlVFCisgKiAgICAgRmFpbHVyZTogRkFMU0UKKyAqCisgKiBGSVhNRQorICogICAgIFRoaXMgaXMgc3RpbGwgYW4gZW1wdHkgc3R1Yi4KKyAqCisgKiBOT1RFUworICogICAgIFRoZSBwb3NpdGlvbiBvZiB0aGUgZHJhZyBpbWFnZSBpcyByZWxhdGl2ZSB0byB0aGUgd2luZG93LCBub3QKKyAqICAgICB0aGUgY2xpZW50IGFyZWEuCiAgKi8KIAotQk9PTDMyIFdJTkFQSSBJbWFnZUxpc3RfRHJhZ0VudGVyICgKLQlIV05EMzIgaHduZExvY2ssIAotCUlOVDMyIHgsIAotCUlOVDMyIHkpCitCT09MMzIgV0lOQVBJCitJbWFnZUxpc3RfRHJhZ0VudGVyIChIV05EMzIgaHduZExvY2ssIElOVDMyIHgsIElOVDMyIHkpCiB7CiAgICAgRklYTUUgKGltYWdlbGlzdCwgImVtcHR5IHN0dWIhXG4iKTsKIAotICAgIGhjdXJJbnRlcm5hbCA9IEdldEN1cnNvcjMyICgpOwotCi0KLSAgICBTaG93Q3Vyc29yMzIgKFRSVUUpOwotCiAgICAgcmV0dXJuIChGQUxTRSk7CiB9CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCSAJCSBJbWFnZUxpc3RfRHJhZ0xlYXZlICAgW0NPTUNUTDMyLjQ3XQorICogSW1hZ2VMaXN0X0RyYWdMZWF2ZSBbQ09NQ1RMMzIuNDddIAorICoKKyAqIFVubG9ja3Mgd2luZG93IHVwZGF0ZSBhbmQgaGlkZXMgdGhlIGRyYWcgaW1hZ2UuCisgKgorICogUEFSQU1TCisgKiAgICAgaHduZExvY2sgW0ldIGhhbmRsZSBvZiB0aGUgd2luZG93IHRoYXQgb3ducyB0aGUgZHJhZyBpbWFnZS4KKyAqCisgKiBSRVRVUk5TCisgKiAgICAgU3VjY2VzczogVFJVRQorICogICAgIEZhaWx1cmU6IEZBTFNFCisgKgorICogRklYTUUKKyAqICAgICBUaGlzIGlzIHN0aWxsIGFuIGVtcHR5IHN0dWIuCiAgKi8KIAotQk9PTDMyIFdJTkFQSSBJbWFnZUxpc3RfRHJhZ0xlYXZlICgKLQlIV05EMzIgaHduZExvY2spCitCT09MMzIgV0lOQVBJCitJbWFnZUxpc3RfRHJhZ0xlYXZlIChIV05EMzIgaHduZExvY2spCiB7CiAgICAgRklYTUUgKGltYWdlbGlzdCwgImVtcHR5IHN0dWIhXG4iKTsKIAotCi0gICAgU2V0Q3Vyc29yMzIgKGhjdXJJbnRlcm5hbCk7Ci0gICAgaGN1ckludGVybmFsID0gMDsKLSAKLSAgICBTaG93Q3Vyc29yMzIgKEZBTFNFKTsKLQogICAgIHJldHVybiAoRkFMU0UpOwogfQogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkgCQkgSW1hZ2VMaXN0X0RyYWdNb3ZlICAgW0NPTUNUTDMyLjQ4XQorICogSW1hZ2VMaXN0X0RyYWdNb3ZlIFtDT01DVEwzMi40OF0gCisgKgorICogTW92ZXMgdGhlIGRyYWcgaW1hZ2UuCisgKgorICogUEFSQU1TCisgKiAgICAgeCBbSV0gWCBwb3NpdGlvbiBvZiB0aGUgZHJhZyBpbWFnZS4KKyAqICAgICB5IFtJXSBZIHBvc2l0aW9uIG9mIHRoZSBkcmFnIGltYWdlLgorICoKKyAqIFJFVFVSTlMKKyAqICAgICBTdWNjZXNzOiBUUlVFCisgKiAgICAgRmFpbHVyZTogRkFMU0UKKyAqCisgKiBOT1RFUworICogICAgIFRoZSBwb3NpdGlvbiBvZiB0aGUgZHJhZyBpbWFnZSBpcyByZWxhdGl2ZSB0byB0aGUgd2luZG93LCBub3QKKyAqICAgICB0aGUgY2xpZW50IGFyZWEuCisgKgorICogRklYTUUKKyAqICAgICBUaGlzIGlzIHN0aWxsIGFuIGVtcHR5IHN0dWIuCiAgKi8KIAotQk9PTDMyIFdJTkFQSSBJbWFnZUxpc3RfRHJhZ01vdmUgKAotCUlOVDMyIHgsCi0JSU5UMzIgeSkKK0JPT0wzMiBXSU5BUEkKK0ltYWdlTGlzdF9EcmFnTW92ZSAoSU5UMzIgeCwgSU5UMzIgeSkKIHsKICAgICBGSVhNRSAoaW1hZ2VsaXN0LCAiZW1wdHkgc3R1YiFcbiIpOwogCi0vLyAgICBpZiAoaGN1ckludGVybmFsKQotLy8gICAgICAgIFNldEN1cnNvcjMyIChoY3VySW50ZXJuYWwpOwotLy8gICAgSW1hZ2VMaXN0X0RyYXcgKGhpbWxJbnRlcm5hbERyYWcsIDAsIHgsIHksIDApOwotCi0KICAgICByZXR1cm4gKEZBTFNFKTsKIH0KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJIAkJIEltYWdlTGlzdF9EcmFnU2hvd05vbG9jayAgIFtDT01DVEwzMi40OV0KKyAqIEltYWdlTGlzdF9EcmFnU2hvd05vbG9jayBbQ09NQ1RMMzIuNDldIAorICoKKyAqIFNob3dzIG9yIGhpZGVzIHRoZSBkcmFnIGltYWdlLgorICoKKyAqIFBBUkFNUworICogICAgIGJTaG93IFtJXSBUUlVFIHNob3dzIHRoZSBkcmFnIGltYWdlLCBGQUxTRSBoaWRlcyBpdC4KKyAqCisgKiBSRVRVUk5TCisgKiAgICAgU3VjY2VzczogVFJVRQorICogICAgIEZhaWx1cmU6IEZBTFNFCisgKgorICogRklYTUUKKyAqICAgICBUaGlzIGlzIHN0aWxsIGFuIGVtcHR5IHN0dWIuCiAgKi8KIAogQk9PTDMyIFdJTkFQSQpAQCAtNjY1LDE2ICs3MTgsMzAgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJIAkJIEltYWdlTGlzdF9EcmF3ICAgW0NPTUNUTDMyLjUwXQorICogSW1hZ2VMaXN0X0RyYXcgW0NPTUNUTDMyLjUwXSBEcmF3cyBhbiBpbWFnZS4KKyAqCisgKiBQQVJBTVMKKyAqICAgICBoaW1sICAgW0ldIGltYWdlIGxpc3QgaGFuZGxlCisgKiAgICAgaSAgICAgIFtJXSBpbWFnZSBpbmRleAorICogICAgIGhkYyAgICBbSV0gZGlzcGxheSBjb250ZXh0IGhhbmRsZQorICogICAgIHggICAgICBbSV0geCBwb3NpdGlvbgorICogICAgIHkgICAgICBbSV0geSBwb3NpdGlvbgorICogICAgIGZTdHlsZSBbSV0gZHJhd2luZyBmbGFncworICoKKyAqIFJFVFVSTlMKKyAqICAgICBTdWNjZXNzOiBUUlVFCisgKiAgICAgRmFpbHVyZTogRkFMU0UKKyAqCisgKiBOT1RFUworICogICAgIENhbGxzIEltYWdlTGlzdF9EcmF3SW5kaXJlY3QuCisgKgorICogU0VFCisgKiAgICAgSW1hZ2VMaXN0X0RyYXdJbmRpcmVjdC4KICAqLwogCi1CT09MMzIgV0lOQVBJIEltYWdlTGlzdF9EcmF3ICgKLQlISU1BR0VMSVNUIGhpbWwsCi0JSU5UMzIgaSwKLQlIREMzMiBoZGMsIAotCUlOVDMyIHgsCi0JSU5UMzIgeSwKLQlVSU5UMzIgZlN0eWxlKQorQk9PTDMyIFdJTkFQSQorSW1hZ2VMaXN0X0RyYXcgKEhJTUFHRUxJU1QgaGltbCwgSU5UMzIgaSwgSERDMzIgaGRjLAorCQlJTlQzMiB4LCBJTlQzMiB5LCBVSU5UMzIgZlN0eWxlKQogewogICAgIElNQUdFTElTVERSQVdQQVJBTVMgaW1sZHA7CiAKQEAgLTY5OCwyMCArNzY1LDM3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCSAJCSBJbWFnZUxpc3RfRHJhd0V4ICAgW0NPTUNUTDMyLjUxXQorICogSW1hZ2VMaXN0X0RyYXdFeCBbQ09NQ1RMMzIuNTFdCisgKgorICogRHJhd3MgYW4gaW1hZ2UgYW5kIGFsbG93cyB0byB1c2UgZXh0ZW5kZWQgZHJhd2luZyBmZWF0dXJlcy4KKyAqCisgKiBQQVJBTVMKKyAqICAgICBoaW1sICAgW0ldIGltYWdlIGxpc3QgaGFuZGxlCisgKiAgICAgaSAgICAgIFtJXSBpbWFnZSBpbmRleAorICogICAgIGhkYyAgICBbSV0gZGV2aWNlIGNvbnRleHQgaGFuZGxlCisgKiAgICAgeCAgICAgIFtJXSBYIHBvc2l0aW9uCisgKiAgICAgeSAgICAgIFtJXSBZIHBvc2l0aW9uCisgKiAgICAgeE9mZnMgIFtJXSAKKyAqICAgICB5T2ZmcyAgW0ldCisgKiAgICAgcmdiQmsgIFtJXSBiYWNrZ3JvdW5kIGNvbG9yCisgKiAgICAgcmdiRmcgIFtJXSBmb3JlZ3JvdW5kIGNvbG9yCisgKiAgICAgZlN0eWxlIFtJXSBkcmF3aW5nIGZsYWdzCisgKgorICogUkVUVVJOUworICogICAgIFN1Y2Nlc3M6IFRSVUUKKyAqICAgICBGYWlsdXJlOiBGQUxTRQorICoKKyAqIE5PVEVTCisgKiAgICAgQ2FsbHMgSW1hZ2VMaXN0X0RyYXdJbmRpcmVjdC4KKyAqCisgKiBTRUUKKyAqICAgICBJbWFnZUxpc3RfRHJhd0luZGlyZWN0LgogICovCiAKLUJPT0wzMiBXSU5BUEkgSW1hZ2VMaXN0X0RyYXdFeCAoCi0JSElNQUdFTElTVCBoaW1sLAotCUlOVDMyIGksCi0JSERDMzIgaGRjLAotCUlOVDMyIHgsCi0JSU5UMzIgeSwKLQlJTlQzMiB4T2ZmcywKLQlJTlQzMiB5T2ZmcywKLQlDT0xPUlJFRiByZ2JCaywKLQlDT0xPUlJFRiByZ2JGZywKLQlVSU5UMzIgZlN0eWxlKQorQk9PTDMyIFdJTkFQSQorSW1hZ2VMaXN0X0RyYXdFeCAoSElNQUdFTElTVCBoaW1sLCBJTlQzMiBpLCBIREMzMiBoZGMsIElOVDMyIHgsIElOVDMyIHksCisJCSAgSU5UMzIgeE9mZnMsIElOVDMyIHlPZmZzLCBDT0xPUlJFRiByZ2JCaywgQ09MT1JSRUYgcmdiRmcsCisJCSAgVUlOVDMyIGZTdHlsZSkKIHsKICAgICBJTUFHRUxJU1REUkFXUEFSQU1TIGltbGRwOwogCkBAIC03MzUsMTEgKzgxOSwyMCBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkgCQkgSW1hZ2VMaXN0X0RyYXdJbmRpcmVjdCAgIFtDT01DVEwzMi41Ml0KKyAqIEltYWdlTGlzdF9EcmF3SW5kaXJlY3QgW0NPTUNUTDMyLjUyXSAKKyAqCisgKiBEcmF3cyBhbiBpbWFnZSB1c2luZyAuLi4KKyAqCisgKiBQQVJBTVMKKyAqICAgICBwaW1sZHAgW0ldIHBvaW50ZXIgdG8gLi4uCisgKgorICogUkVUVVJOUworICogICAgIFN1Y2Nlc3M6CisgKiAgICAgRmFpbHVyZToKICAqLwogCi1CT09MMzIgV0lOQVBJIEltYWdlTGlzdF9EcmF3SW5kaXJlY3QgKAotCUlNQUdFTElTVERSQVdQQVJBTVMgKnBpbWxkcCkKK0JPT0wzMiBXSU5BUEkKK0ltYWdlTGlzdF9EcmF3SW5kaXJlY3QgKElNQUdFTElTVERSQVdQQVJBTVMgKnBpbWxkcCkKIHsKICAgICBISU1BR0VMSVNUIGhpbWxMb2NhbDsKICAgICBIREMzMiAgICAgIGhkY0ltYWdlTGlzdCwgaGRjVGVtcEltYWdlOwpAQCAtNzU2LDYgKzg0OSw3IEBACiAKICAgICBpZiAocGltbGRwID09IE5VTEwpIHJldHVybiAoRkFMU0UpOwogICAgIGlmIChwaW1sZHAtPmNiU2l6ZSA8IHNpemVvZihJTUFHRUxJU1REUkFXUEFSQU1TKSkgcmV0dXJuIChGQUxTRSk7CisgICAgaWYgKHBpbWxkcC0+aGltbCA9PSBOVUxMKSByZXR1cm4gKEZBTFNFKTsKIAogICAgIGhpbWxMb2NhbCA9IHBpbWxkcC0+aGltbDsKICAgICAKQEAgLTkxMiwxNiArMTAwNiwxOCBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkgCQkgSW1hZ2VMaXN0X0R1cGxpY2F0ZSAgIFtDT01DVEwzMi41M10KKyAqIEltYWdlTGlzdF9EdXBsaWNhdGUgW0NPTUNUTDMyLjUzXSBEdXBsaWNhdGVzIGFuIGltYWdlIGxpc3QuCiAgKgotICogIER1cGxpY2F0ZXMgYW4gaW1hZ2UgbGlzdC4KKyAqIFBBUkFNUworICogICAgIGhpbWxTcmMgW0ldIHNvdXJjZSBpbWFnZSBsaXN0IGhhbmRsZQogICoKLSAqICBSRVRVUk5TCi0gKiAgICBIYW5kbGUgb2YgZHVwbGljYXRlIGltYWdlIGxpc3QsIDAgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCisgKiBSRVRVUk5TCisgKiAgICAgU3VjY2VzczogSGFuZGxlIG9mIGR1cGxpY2F0ZWQgaW1hZ2UgbGlzdC4KKyAqICAgICBGYWlsdXJlOiAwCiAgKi8KIAotSElNQUdFTElTVCBXSU5BUEkgSW1hZ2VMaXN0X0R1cGxpY2F0ZSAoCi0JSElNQUdFTElTVCBoaW1sU3JjKQorSElNQUdFTElTVCBXSU5BUEkKK0ltYWdlTGlzdF9EdXBsaWNhdGUgKEhJTUFHRUxJU1QgaGltbFNyYykKIHsKICAgICBISU1BR0VMSVNUIGhpbWxEc3Q7CiAgICAgSERDMzIgaGRjU3JjLCBoZGNEc3Q7CkBAIC05NjAsMTUgKzEwNTYsMjMgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJIAkJIEltYWdlTGlzdF9FbmREcmFnICAgW0NPTUNUTDMyLjU0XQorICogSW1hZ2VMaXN0X0VuZERyYWcgW0NPTUNUTDMyLjU0XSBGaW5pc2hlcyBhIGRyYWcgb3BlcmF0aW9uLgogICoKLSAqICBGaW5pc2hlcyBhIGRyYWcgb3BlcmF0aW9uLgorICogRmluaXNoZXMgYSBkcmFnIG9wZXJhdGlvbi4KICAqCi0gKiAgRklYTUUKLSAqICAgIHNlbWktc3R1Yi4KKyAqIFBBUkFNUworICogICAgIG5vCisgKgorICogUkVUVVJOUworICogICAgIFN1Y2Nlc3M6IFRSVUUKKyAqICAgICBGYWlsdXJlOiBGQUxTRQorICoKKyAqIEJVR1MKKyAqICAgICBzZW1pLXN0dWIuCiAgKi8KIAotQk9PTDMyIFdJTkFQSSBJbWFnZUxpc3RfRW5kRHJhZyAoVk9JRCkKK0JPT0wzMiBXSU5BUEkKK0ltYWdlTGlzdF9FbmREcmFnIChWT0lEKQogewogICAgIEZJWE1FIChpbWFnZWxpc3QsICJwYXJ0aWFsbHkgaW1wbGVtZW50ZWQhXG4iKTsKIApAQCAtOTg4LDMzICsxMDkyLDQ2IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCSAJCSBJbWFnZUxpc3RfR2V0QmtDb2xvciAgIFtDT01DVEwzMi41NV0KKyAqIEltYWdlTGlzdF9HZXRCa0NvbG9yIFtDT01DVEwzMi41NV0KICAqCi0gKiAgUmV0dXJucyB0aGUgYmFja2dyb3VuZCBjb2xvciBvZiBhbiBpbWFnZSBsaXN0LgorICogUmV0dXJucyB0aGUgYmFja2dyb3VuZCBjb2xvciBvZiBhbiBpbWFnZSBsaXN0LgogICoKLSAqICBSRVRVUk5TCi0gKiAgICBCYWNrZ3JvdW5kIGNvbG9yLgorICogUEFSQU1TCisgKiAgICAgaGltbCBbSV0gSW1hZ2UgbGlzdCBoYW5kbGUuCisgKgorICogUkVUVVJOUworICogICAgIEJhY2tncm91bmQgY29sb3IuCiAgKi8KIAotQ09MT1JSRUYgV0lOQVBJIEltYWdlTGlzdF9HZXRCa0NvbG9yICgKLQlISU1BR0VMSVNUIGhpbWwpCitDT0xPUlJFRiBXSU5BUEkKK0ltYWdlTGlzdF9HZXRCa0NvbG9yIChISU1BR0VMSVNUIGhpbWwpCiB7CisvLyAgICBpZiAoaGltbCA9PSBOVUxMKQorLy8JcmV0dXJuIENMUl9OT05FOworCiAgICAgcmV0dXJuIChoaW1sLT5jbHJCayk7CiB9CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCSAJCSBJbWFnZUxpc3RfR2V0RHJhZ0ltYWdlICAgW0NPTUNUTDMyLjU2XQorICogSW1hZ2VMaXN0X0dldERyYWdJbWFnZSBbQ09NQ1RMMzIuNTZdCiAgKgotICogIFJldHVybnMgdGhlIGhhbmRsZSB0byB0aGUgaW50ZXJuYWwgZHJhZyBpbWFnZSBsaXN0LgorICogUmV0dXJucyB0aGUgaGFuZGxlIHRvIHRoZSBpbnRlcm5hbCBkcmFnIGltYWdlIGxpc3QuCiAgKgotICogIEZJWE1FCi0gKiAgICBzZW1pLXN0dWIuCisgKiBQQVJBTVMKKyAqICAgICBwcHQgICAgICAgIFtPXSBQb2ludGVyIHRvIHRoZSBkcmFnIHBvc2l0aW9uLiBDYW4gYmUgTlVMTC4KKyAqICAgICBwcHRIb3RzcG90IFtPXSBQb2ludGVyIHRvIHRoZSBwb3NpdGlvbiBvZiB0aGUgaG90IHNwb3QuIENhbiBiZSBOVUxMLgorICoKKyAqIFJFVFVSTlMKKyAqICAgICBTdWNjZXNzOiBIYW5kbGUgb2YgdGhlIGRyYWcgaW1hZ2UgbGlzdC4KKyAqICAgICBGYWlsdXJlOiBOVUxMLgorICoKKyAqIEJVR1MKKyAqICAgICBzZW1pLXN0dWIuCiAgKi8KIAotSElNQUdFTElTVCBXSU5BUEkgSW1hZ2VMaXN0X0dldERyYWdJbWFnZSAoCi0JUE9JTlQzMiAqcHB0LAotCVBPSU5UMzIgKnBwdEhvdHNwb3QpCitISU1BR0VMSVNUIFdJTkFQSQorSW1hZ2VMaXN0X0dldERyYWdJbWFnZSAoUE9JTlQzMiAqcHB0LCBQT0lOVDMyICpwcHRIb3RzcG90KQogewogICAgIEZJWE1FIChpbWFnZWxpc3QsICJwYXJ0aWFsbHkgaW1sZW1lbnRlZCFcbiIpOwogCkBAIC0xMDI2LDEzICsxMTQzLDIyIEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCSAJCSBJbWFnZUxpc3RfR2V0SWNvbiAgIFtDT01DVEwzMi41N10KKyAqIEltYWdlTGlzdF9HZXRJY29uIFtDT01DVEwzMi41N10gCisgKgorICogQ3JlYXRlcyBhbiBpY29uIGZyb20gYSBtYXNrZWQgaW1hZ2Ugb2YgYW4gaW1hZ2UgbGlzdC4KKyAqCisgKiBQQVJBTVMKKyAqICAgICBoaW1sICBbSV0gaW1hZ2UgbGlzdCBoYW5kbGUKKyAqICAgICBpICAgICBbSV0gaW1hZ2UgaW5kZXgKKyAqICAgICBmbGFncyBbSV0gZHJhd2luZyBzdHlsZSBmbGFncworICoKKyAqIFJFVFVSTlMKKyAqICAgICBTdWNjZXNzOiBpY29uIGhhbmRsZQorICogICAgIEZhaWx1cmU6IE5VTEwKICAqLwogCi1ISUNPTjMyIFdJTkFQSSBJbWFnZUxpc3RfR2V0SWNvbiAoCi0JSElNQUdFTElTVCBoaW1sLCAKLQlJTlQzMiBpLCAKLQlVSU5UMzIgZlN0eWxlKQorSElDT04zMiBXSU5BUEkKK0ltYWdlTGlzdF9HZXRJY29uIChISU1BR0VMSVNUIGhpbWwsIElOVDMyIGksIFVJTlQzMiBmU3R5bGUpCiB7CiAgICAgSUNPTklORk8gaWk7CiAgICAgSElDT04zMiAgaEljb247CkBAIC0xMDcxLDEzICsxMTk3LDI1IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCSAJCSBJbWFnZUxpc3RfR2V0SWNvblNpemUgICBbQ09NQ1RMMzIuNThdCisgKiBJbWFnZUxpc3RfR2V0SWNvblNpemUgW0NPTUNUTDMyLjU4XQorICoKKyAqIFJldHJpZXZlcyB0aGUgc2l6ZSBvZiBhbiBpbWFnZSBpbiBhbiBpbWFnZSBsaXN0LgorICoKKyAqIFBBUkFNUworICogICAgIGhpbWwgW0ldIGltYWdlIGxpc3QgaGFuZGxlCisgKiAgICAgY3ggICBbT10gcG9pbnRlciB0byB0aGUgaW1hZ2Ugd2lkdGguCisgKiAgICAgY3kgICBbT10gcG9pbnRlciB0byB0aGUgaW1hZ2UgaGVpZ2h0LgorICoKKyAqIFJFVFVSTlMKKyAqICAgICBTdWNjZXNzOiBUUlVFCisgKiAgICAgRmFpbHVyZTogRkFMU0UKKyAqCisgKiBOT1RFUworICogICAgIEFsbCBpbWFnZXMgaW4gYW4gaW1hZ2UgbGlzdCBoYXZlIHRoZSBzYW1lIHNpemUuCiAgKi8KIAotQk9PTDMyIFdJTkFQSSBJbWFnZUxpc3RfR2V0SWNvblNpemUgKAotCUhJTUFHRUxJU1QgaGltbCwKLQlJTlQzMiAqY3gsCi0JSU5UMzIgKmN5KQorQk9PTDMyIFdJTkFQSQorSW1hZ2VMaXN0X0dldEljb25TaXplIChISU1BR0VMSVNUIGhpbWwsIElOVDMyICpjeCwgSU5UMzIgKmN5KQogewogCiAgICAgaWYgKGhpbWwgPT0gTlVMTCkgcmV0dXJuIChGQUxTRSk7CkBAIC0xMDkyLDI0ICsxMjMwLDQ1IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCSAJCSBJbWFnZUxpc3RfR2V0SWNvbkNvdW50ICAgW0NPTUNUTDMyLjU5XQorICogSW1hZ2VMaXN0X0dldEljb25Db3VudCBbQ09NQ1RMMzIuNTldCisgKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGltYWdlcyBpbiBhbiBpbWFnZSBsaXN0LgorICoKKyAqIFBBUkFNUworICogICAgIGhpbWwgW0ldIGltYWdlIGxpc3QgaGFuZGxlLgorICoKKyAqIFJFVFVSTlMKKyAqICAgICBTdWNjZXNzOiBOdW1iZXIgb2YgaW1hZ2VzLgorICogICAgIEZhaWx1cmU6ID8/Pz8gKE51bWJlciBvZiB3aGF0Li4uKQogICovCiAKLUlOVDMyIFdJTkFQSSBJbWFnZUxpc3RfR2V0SW1hZ2VDb3VudCAoCi0JSElNQUdFTElTVCBoaW1sKQorSU5UMzIgV0lOQVBJCitJbWFnZUxpc3RfR2V0SW1hZ2VDb3VudCAoSElNQUdFTElTVCBoaW1sKQogeworLy8gICAgaWYgKGhpbWwgPT0gTlVMTCkKKy8vCXJldHVybiAtMTsKKwogICAgIHJldHVybiAoaGltbC0+Y0N1ckltYWdlKTsKIH0KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJIAkJIEltYWdlTGlzdF9HZXRJbWFnZUluZm8gICBbQ09NQ1RMMzIuNjBdCisgKiBJbWFnZUxpc3RfR2V0SW1hZ2VJbmZvIFtDT01DVEwzMi42MF0KKyAqCisgKiBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IGFuIGltYWdlIGluIGFuIGltYWdlIGxpc3QuCisgKgorICogUEFSQU1TCisgKiAgICAgaGltbCAgICAgICBbSV0gaW1hZ2UgbGlzdCBoYW5kbGUuCisgKiAgICAgaSAgICAgICAgICBbSV0gaW1hZ2UgaW5kZXgKKyAqICAgICBwSW1hZ2VJbmZvIFtPXSBwb2ludGVyIHRvIHRoZSBpbWFnZSBpbmZvcm1hdGlvbi4KKyAqCisgKiBSRVRVUk5TCisgKiAgICAgU3VjY2VzczogVFJVRQorICogICAgIEZhaWx1cmU6IEZBTFNFCiAgKi8KIAotQk9PTDMyIFdJTkFQSSBJbWFnZUxpc3RfR2V0SW1hZ2VJbmZvICgKLQlISU1BR0VMSVNUIGhpbWwsCi0JSU5UMzIgaSwKLQlJTUFHRUlORk8gKnBJbWFnZUluZm8pCitCT09MMzIgV0lOQVBJCitJbWFnZUxpc3RfR2V0SW1hZ2VJbmZvIChISU1BR0VMSVNUIGhpbWwsIElOVDMyIGksIElNQUdFSU5GTyAqcEltYWdlSW5mbykKIHsKICAgICBpZiAoKGhpbWwgPT0gTlVMTCkgfHwgKHBJbWFnZUluZm8gPT0gTlVMTCkpIHJldHVybiAoRkFMU0UpOwogCkBAIC0xMTI2LDE2ICsxMjg1LDI4IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCSAJCSBJbWFnZUxpc3RfR2V0SW1hZ2VSZWN0ICAgW0NPTUNUTDMyLjYxXQorICogSW1hZ2VMaXN0X0dldEltYWdlUmVjdCBbQ09NQ1RMMzIuNjFdIAogICoKLSAqICBDT01NRU5UUworICogUmV0cmlldmVzIHRoZSByZWN0YW5nbGUgb2YgdGhlIHNwZWNpZmllZCBpbWFnZSBpbiBhbiBpbWFnZSBsaXN0LgorICoKKyAqIFBBUkFNUworICogICAgIGhpbWwgICBbSV0gaW1hZ2UgbGlzdCBoYW5kbGUKKyAqICAgICBpICAgICAgW0ldIGltYWdlIGluZGV4CisgKiAgICAgbHBSZWN0IFtPXSBwb2ludGVyIHRvIHRoZSBpbWFnZSByZWN0YW5nbGUKKyAqCisgKiBSRVRVUk5TCisgKiAgICBTdWNjZXNzOiBUUlVFID8/Pz8KKyAqICAgIEZhaWx1cmU6IEZBTFNFID8/Pz8KKyAqCisgKiBOT1RFUworICogICAgVGhpcyBpcyBhbiBVTkRPQ1VNRU5URUQgZnVuY3Rpb24hISEKKyAqCisgKiBCVUdTCiAgKiAgICBJIGRvbid0IGtub3cgaWYgaXQgcmVhbGx5IHJldHVybnMgYSBCT09MMzIgb3Igc29tZXRoaW5nIGVsc2UhISE/PwogICovCiAKLUJPT0wzMiBXSU5BUEkgSW1hZ2VMaXN0X0dldEltYWdlUmVjdCAoCi0JSElNQUdFTElTVCBoaW1sLAotCUlOVDMyIGksCi0JTFBSRUNUMzIgbHBSZWN0KQorQk9PTDMyIFdJTkFQSQorSW1hZ2VMaXN0X0dldEltYWdlUmVjdCAoSElNQUdFTElTVCBoaW1sLCBJTlQzMiBpLCBMUFJFQ1QzMiBscFJlY3QpCiB7CiAgICAgaWYgKGhpbWwgPT0gTlVMTCkgcmV0dXJuIChGQUxTRSk7CiAgICAgaWYgKChpIDwgMCkgfHwgKGkgPj0gaGltbC0+Y0N1ckltYWdlKSkgcmV0dXJuIChGQUxTRSk7CkBAIC0xMTUxLDE3ICsxMzIyLDI4IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCSAJCSBJbWFnZUxpc3RfTG9hZEltYWdlMzJBICAgW0NPTUNUTDMyLjYzXQorICogSW1hZ2VMaXN0X0xvYWRJbWFnZTMyQSAgIFtDT01DVEwzMi42M10KKyAqCisgKiBDcmVhdGVzIGFuIGltYWdlIGxpc3QgZnJvbSBhIGJpdG1hcCwgaWNvbiBvciBjdXJzb3IuCisgKgorICogUEFSQU1TCisgKiAgICAgaGkgICAgICBbSV0KKyAqICAgICBscGJtcCAgIFtJXQorICogICAgIGN4ICAgICAgW0ldCisgKiAgICAgY3kgICAgICBbSV0KKyAqICAgICBjR3JvdyAgIFtJXQorICogICAgIGNsck1hc2sgW0ldCisgKiAgICAgdVR5cGUgICBbSV0KKyAqICAgICB1RmxhZ3MgIFtJXQorICoKKyAqIFJFVFVSTlMKKyAqICAgICBTdWNjZXNzOgorICogICAgIEZhaWx1cmU6CiAgKi8KIAotSElNQUdFTElTVCBXSU5BUEkgSW1hZ2VMaXN0X0xvYWRJbWFnZTMyQSAoCi0JSElOU1RBTkNFMzIgaGksCi0JTFBDU1RSIGxwYm1wLAotCUlOVDMyIGN4LAotCUlOVDMyIGNHcm93LCAKLQlDT0xPUlJFRiBjbHJNYXNrLAotCVVJTlQzMiB1VHlwZSwKLQlVSU5UMzIgdUZsYWdzKQorSElNQUdFTElTVCBXSU5BUEkKK0ltYWdlTGlzdF9Mb2FkSW1hZ2UzMkEgKEhJTlNUQU5DRTMyIGhpLCBMUENTVFIgbHBibXAsIElOVDMyIGN4LAlJTlQzMiBjR3JvdywKKwkJCUNPTE9SUkVGIGNsck1hc2ssIFVJTlQzMiB1VHlwZSwJVUlOVDMyIHVGbGFncykKIHsKICAgICBISU1BR0VMSVNUIGhpbWwgPSBOVUxMOwogICAgIEhBTkRMRTMyICAgaGFuZGxlOwpAQCAtMTIxNywxNyArMTM5OSwyOCBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkgCQkgSW1hZ2VMaXN0X0xvYWRJbWFnZTMyVyAgIFtDT01DVEwzMi42NF0KKyAqIEltYWdlTGlzdF9Mb2FkSW1hZ2UzMlcgW0NPTUNUTDMyLjY0XQorICoKKyAqIENyZWF0ZXMgYW4gaW1hZ2UgbGlzdCBmcm9tIGEgYml0bWFwLCBpY29uIG9yIGN1cnNvci4KKyAqCisgKiBQQVJBTVMKKyAqICAgICBoaSAgICAgIFtJXQorICogICAgIGxwYm1wICAgW0ldCisgKiAgICAgY3ggICAgICBbSV0KKyAqICAgICBjeSAgICAgIFtJXQorICogICAgIGNHcm93ICAgW0ldCisgKiAgICAgY2xyTWFzayBbSV0KKyAqICAgICB1VHlwZSAgIFtJXQorICogICAgIHVGbGFncyAgW0ldCisgKgorICogUkVUVVJOUworICogICAgIFN1Y2Nlc3M6CisgKiAgICAgRmFpbHVyZToKICAqLwogCi1ISU1BR0VMSVNUIFdJTkFQSSBJbWFnZUxpc3RfTG9hZEltYWdlMzJXICgKLQlISU5TVEFOQ0UzMiBoaSwKLQlMUENXU1RSIGxwYm1wLAotCUlOVDMyIGN4LAotCUlOVDMyIGNHcm93LAotCUNPTE9SUkVGIGNsck1hc2ssCi0JVUlOVDMyIHVUeXBlLAotCVVJTlQzMiB1RmxhZ3MpCitISU1BR0VMSVNUIFdJTkFQSQorSW1hZ2VMaXN0X0xvYWRJbWFnZTMyVyAoSElOU1RBTkNFMzIgaGksIExQQ1dTVFIgbHBibXAsIElOVDMyIGN4LCBJTlQzMiBjR3JvdywKKwkJCUNPTE9SUkVGIGNsck1hc2ssIFVJTlQzMiB1VHlwZSwJVUlOVDMyIHVGbGFncykKIHsKICAgICBISU1BR0VMSVNUIGhpbWwgPSBOVUxMOwogICAgIEhBTkRMRTMyICAgaGFuZGxlOwpAQCAtMTI4NiwxNiArMTQ3OSwyNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkgCQkgSW1hZ2VMaXN0X01lcmdlICAgW0NPTUNUTDMyLjY1XQorICogSW1hZ2VMaXN0X01lcmdlIFtDT01DVEwzMi42NV0gCisgKgorICogQ3JlYXRlcyBhIG5ldyBpbWFnZSBsaXN0IHRoYXQgY29udGFpbnMgYSBtZXJnZWQgaW1hZ2UgZnJvbSB0aGUgc3BlY2lmaWVkCisgKiBpbWFnZXMgb2YgYm90aCBzb3VyY2UgaW1hZ2UgbGlzdHMuCisgKgorICogUEFSQU1TCisgKiAgICAgaGltbDEgW0ldIGZpcnN0IGltYWdlIGxpc3QgaGFuZGxlCisgKiAgICAgaTEgICAgW0ldIGZpcnN0IGltYWdlIGluZGV4CisgKiAgICAgaGltbDIgW0ldIHNlY29uZCBpbWFnZSBsaXN0IGhhbmRsZQorICogICAgIGkyICAgIFtJXSBzZWNvbmQgaW1hZ2UgaW5kZXgKKyAqICAgICBkeCAgICBbSV0gWCBvZmZzZXQgb2YgdGhlIHNlY29uZCBpbWFnZSByZWxhdGl2ZSB0byB0aGUgZmlyc3QuCisgKiAgICAgZHkgICAgW0ldIFkgb2Zmc2V0IG9mIHRoZSBzZWNvbmQgaW1hZ2UgcmVsYXRpdmUgdG8gdGhlIGZpcnN0LgorICoKKyAqIFJFVFVSTlMKKyAqICAgICBTdWNjZXNzOgorICogICAgIEZhaWx1cmU6CiAgKi8KIAotSElNQUdFTElTVCBXSU5BUEkgSW1hZ2VMaXN0X01lcmdlICgKLQlISU1BR0VMSVNUIGhpbWwxLAotCUlOVDMyIGkxLAotCUhJTUFHRUxJU1QgaGltbDIsCi0JSU5UMzIgaTIsCi0JSU5UMzIgeE9mZnMsCi0JSU5UMzIgeU9mZnMpCitISU1BR0VMSVNUIFdJTkFQSQorSW1hZ2VMaXN0X01lcmdlIChISU1BR0VMSVNUIGhpbWwxLCBJTlQzMiBpMSwgSElNQUdFTElTVCBoaW1sMiwgSU5UMzIgaTIsCisJCSBJTlQzMiBkeCwgSU5UMzIgZHkpCiB7CiAgICAgSElNQUdFTElTVCBoaW1sRHN0ID0gTlVMTDsKICAgICBIREMzMiAgICAgIGhkY1NyY0ltYWdlLCBoZGNEc3RJbWFnZTsKQEAgLTEzMTYsMzQgKzE1MjAsMzQgQEAKICAgICAgICAgcmV0dXJuIChOVUxMKTsKICAgICB9CiAKLSAgICBpZiAoeE9mZnMgPiAwKSB7Ci0gICAgICAgIGN4RHN0ID0gX01BWCAoaGltbDEtPmN4LCB4T2ZmcyArIGhpbWwyLT5jeCk7CisgICAgaWYgKGR4ID4gMCkgeworICAgICAgICBjeERzdCA9IF9NQVggKGhpbWwxLT5jeCwgZHggKyBoaW1sMi0+Y3gpOwogICAgICAgICB4T2ZmMSA9IDA7Ci0gICAgICAgIHhPZmYyID0geE9mZnM7CisgICAgICAgIHhPZmYyID0gZHg7CiAgICAgfQotICAgIGVsc2UgaWYgKHhPZmZzIDwgMCkgewotICAgICAgICBjeERzdCA9IF9NQVggKGhpbWwyLT5jeCwgaGltbDEtPmN4IC0geE9mZnMpOwotICAgICAgICB4T2ZmMSA9IC14T2ZmczsKKyAgICBlbHNlIGlmIChkeCA8IDApIHsKKyAgICAgICAgY3hEc3QgPSBfTUFYIChoaW1sMi0+Y3gsIGhpbWwxLT5jeCAtIGR4KTsKKyAgICAgICAgeE9mZjEgPSAtZHg7CiAgICAgICAgIHhPZmYyID0gMDsKICAgICB9CiAgICAgZWxzZSB7Ci0gICAgICAgIGN4RHN0ID0gMDsKKyAgICAgICAgY3hEc3QgPSBfTUFYIChoaW1sMS0+Y3gsIGhpbWwyLT5jeCk7CiAgICAgICAgIHhPZmYxID0gMDsKICAgICAgICAgeE9mZjIgPSAwOwogICAgIH0KIAotICAgIGlmICh5T2ZmcyA+IDApIHsKLSAgICAgICAgY3lEc3QgPSBfTUFYIChoaW1sMS0+Y3ksIHlPZmZzICsgaGltbDItPmN5KTsKKyAgICBpZiAoZHkgPiAwKSB7CisgICAgICAgIGN5RHN0ID0gX01BWCAoaGltbDEtPmN5LCBkeSArIGhpbWwyLT5jeSk7CiAgICAgICAgIHlPZmYxID0gMDsKLSAgICAgICAgeU9mZjIgPSB5T2ZmczsKKyAgICAgICAgeU9mZjIgPSBkeTsKICAgICB9Ci0gICAgZWxzZSBpZiAoeU9mZnMgPCAwKSB7Ci0gICAgICAgIGN5RHN0ID0gX01BWCAoaGltbDItPmN5LCBoaW1sMS0+Y3kgLSB5T2Zmcyk7Ci0gICAgICAgIHlPZmYxID0gLXlPZmZzOworICAgIGVsc2UgaWYgKGR5IDwgMCkgeworICAgICAgICBjeURzdCA9IF9NQVggKGhpbWwyLT5jeSwgaGltbDEtPmN5IC0gZHkpOworICAgICAgICB5T2ZmMSA9IC1keTsKICAgICAgICAgeU9mZjIgPSAwOwogICAgIH0KICAgICBlbHNlIHsKLSAgICAgICAgY3lEc3QgPSAwOworICAgICAgICBjeURzdCA9IF9NQVggKGhpbWwxLT5jeSwgaGltbDItPmN5KTsKICAgICAgICAgeU9mZjEgPSAwOwogICAgICAgICB5T2ZmMiA9IDA7CiAgICAgfQpAQCAtMTM5MiwxMCArMTU5NiwyMiBAQAogfQogCiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJbWFnZUxpc3RfUmVhZCBbQ09NQ1RMMzIuNjZdCisgKgorICogUmVhZHMgYW4gaW1hZ2UgbGlzdCBmcm9tIGEgc3RyZWFtLgorICoKKyAqIFBBUkFNUworICogICAgIHBzdG0gW0ldIHBvaW50ZXIgdG8gYSBzdHJlYW0KKyAqCisgKiBSRVRVUk5TCisgKiAgICAgU3VjY2VzczogaW1hZ2UgbGlzdCBoYW5kbGUKKyAqICAgICBGYWlsdXJlOiBOVUxMCisgKi8KKwogI2lmIDAKICNpZiBfX0lTdHJlYW1fSU5URVJGQUNFX0RFRklORURfXwotSElNQUdFTElTVCBXSU5BUEkgSW1hZ2VMaXN0X1JlYWQgKAotCUxQU1RSRUFNIHBzdG0pCitISU1BR0VMSVNUIFdJTkFQSSBJbWFnZUxpc3RfUmVhZCAoTFBTVFJFQU0gcHN0bSkKIHsKICAgICBGSVhNRSAoaW1hZ2VsaXN0LCAiZW1wdHkgc3R1YiFcbiIpOwogCkBAIC0xNDA2LDkgKzE2MjIsMjAgQEAKICNlbmRpZiAvKiAwICovCiAKIAotQk9PTDMyIFdJTkFQSSBJbWFnZUxpc3RfUmVtb3ZlICgKLQlISU1BR0VMSVNUIGhpbWwsCi0JSU5UMzIgaSkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJbWFnZUxpc3RfUmVtb3ZlIFtDT01DVEwzMi42N10gUmVtb3ZlcyBhbiBpbWFnZSBmcm9tIGFuIGltYWdlIGxpc3QKKyAqCisgKiBQQVJBTVMKKyAqICAgICBoaW1sIFtJXSBpbWFnZSBsaXN0IGhhbmRsZQorICogICAgIGkgICAgW0ldIGltYWdlIGluZGV4CisgKgorICogUkVUVVJOUworICogICAgIFN1Y2Nlc3M6IFRSVUUKKyAqICAgICBGYWlsdXJlOiBGQUxTRQorICovCisKK0JPT0wzMiBXSU5BUEkKK0ltYWdlTGlzdF9SZW1vdmUgKEhJTUFHRUxJU1QgaGltbCwgSU5UMzIgaSkKIHsKICAgICBIQklUTUFQMzIgaGJtTmV3SW1hZ2UsIGhibU5ld01hc2s7CiAgICAgSERDMzIgICAgIGhkY1NyYywgaGRjRHN0OwpAQCAtMTUyMSwxMSArMTc0OCwyNSBAQAogfQogCiAKLUJPT0wzMiBXSU5BUEkgSW1hZ2VMaXN0X1JlcGxhY2UgKAotCUhJTUFHRUxJU1QgaGltbCwKLQlJTlQzMiBpLAotCUhCSVRNQVAzMiBoYm1JbWFnZSwgCi0JSEJJVE1BUDMyIGhibU1hc2spCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSW1hZ2VMaXN0X1JlcGxhY2UgW0NPTUNUTDMyLjY4XSAKKyAqCisgKiBSZXBsYWNlcyBhbiBpbWFnZSBpbiBhbiBpbWFnZSBsaXN0IHdpdGggYSBuZXcgaW1hZ2UuCisgKgorICogUEFSQU1TCisgKiAgICAgaGltbCAgICAgW0ldIGltYWdlIGxpc3QgaGFuZGxlCisgKiAgICAgaSAgICAgICAgW0ldIGltYWdlIGluZGV4CisgKiAgICAgaGJtSW1hZ2UgW0ldIGltYWdlIGJpdG1hcCBoYW5kbGUKKyAqICAgICBoYm1NYXNrICBbSV0gbWFzayBiaXRtYXAgaGFuZGxlLiBDYW4gYmUgTlVMTC4KKyAqCisgKiBSRVRVUk5TCisgKiAgICAgU3VjY2VzczogVFJVRQorICogICAgIEZhaWx1cmU6IEZBTFNFCisgKi8KKworQk9PTDMyIFdJTkFQSQorSW1hZ2VMaXN0X1JlcGxhY2UgKEhJTUFHRUxJU1QgaGltbCwgSU5UMzIgaSwgSEJJVE1BUDMyIGhibUltYWdlLAorCQkgICBIQklUTUFQMzIgaGJtTWFzaykKIHsKICAgICBIREMzMiBoZGNJbWFnZUxpc3QsIGhkY0ltYWdlOwogICAgIEJJVE1BUDMyIGJtcDsKQEAgLTE1NjgsMTAgKzE4MDksMjMgQEAKIH0KIAogCi1JTlQzMiBXSU5BUEkgSW1hZ2VMaXN0X1JlcGxhY2VJY29uICgKLQlISU1BR0VMSVNUIGhpbWwsCi0JSU5UMzIgaSwKLQlISUNPTjMyIGhJY29uKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEltYWdlTGlzdF9SZXBsYWNlSWNvbiBbQ09NQ1RMMzIuNjldCisgKgorICogUmVwbGFjZXMgYW4gaW1hZ2UgaW4gYW4gaW1hZ2UgbGlzdCB1c2luZyBhbiBpY29uLgorICoKKyAqIFBBUkFNUworICogICAgIGhpbWwgIFtJXSBpbWFnZSBsaXN0IGhhbmRsZQorICogICAgIGkgICAgIFtJXSBpbWFnZSBpbmRleAorICogICAgIGhJY29uIFtJXSBpY29uIGhhbmRsZQorICoKKyAqIFJFVFVSTlMKKyAqICAgICBTdWNjZXNzOiBpbmRleCBvZiB0aGUgcmVwbGFjZWQgaW1hZ2UKKyAqICAgICBGYWlsdXJlOiAtMQorICovCisKK0lOVDMyIFdJTkFQSQorSW1hZ2VMaXN0X1JlcGxhY2VJY29uIChISU1BR0VMSVNUIGhpbWwsIElOVDMyIGksIEhJQ09OMzIgaEljb24pCiB7CiAgICAgSERDMzIgICAgIGhkY0ltYWdlTGlzdCwgaGRjSW1hZ2U7CiAgICAgSU5UMzIgICAgIG5JbmRleDsKQEAgLTE2MDIsNyArMTg1Niw3IEBACiAKICAgICBpZiAoaSA9PSAtMSkgewogICAgICAgICBpZiAoaGltbC0+Y0N1ckltYWdlICsgMSA+PSBoaW1sLT5jTWF4SW1hZ2UpCi0gICAgICAgICAgICBJTUFHRUxJU1RfSW50ZXJuYWxHcm93Qml0bWFwcyAoaGltbCwgMSk7CisgICAgICAgICAgICBJTUFHRUxJU1RfSW50ZXJuYWxFeHBhbmRCaXRtYXBzIChoaW1sLCAxKTsKIAogICAgICAgICBuSW5kZXggPSBoaW1sLT5jQ3VySW1hZ2U7CiAgICAgICAgIGhpbWwtPmNDdXJJbWFnZSsrOwpAQCAtMTY0OCwzNSArMTkwMiwxMDEgQEAKIH0KIAogCi1DT0xPUlJFRiBXSU5BUEkgSW1hZ2VMaXN0X1NldEJrQ29sb3IgKAotCUhJTUFHRUxJU1QgaGltbCwKLQlDT0xPUlJFRiBjbHJCaykKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJbWFnZUxpc3RfU2V0QmtDb2xvciBbQ09NQ1RMMzIuNzBdIAorICoKKyAqIFNldHMgdGhlIGJhY2tncm91bmQgY29sb3Igb2YgYW4gaW1hZ2UgbGlzdC4KKyAqCisgKiBQQVJBTVMKKyAqICAgICBoaW1sICBbSV0gaW1hZ2UgbGlzdCBoYW5kbGUKKyAqICAgICBjbHJCayBbSV0gYmFja2dyb3VuZCBjb2xvcgorICoKKyAqIFJFVFVSTlMKKyAqICAgICBTdWNjZXNzOiBwcmV2aW91cyBiYWNrZ3JvdW5kIGNvbG9yCisgKiAgICAgRmFpbHVyZTogQ0xSX05PTkUKKyAqLworCitDT0xPUlJFRiBXSU5BUEkKK0ltYWdlTGlzdF9TZXRCa0NvbG9yIChISU1BR0VMSVNUIGhpbWwsIENPTE9SUkVGIGNsckJrKQogewogICAgIENPTE9SUkVGIGNsck9sZEJrOwogCisgICAgaWYgKGhpbWwgPT0gTlVMTCkKKwlyZXR1cm4gKENMUl9OT05FKTsKKwogICAgIGNsck9sZEJrID0gaGltbC0+Y2xyQms7CiAgICAgaGltbC0+Y2xyQmsgPSBjbHJCazsKICAgICByZXR1cm4gKGNsck9sZEJrKTsKIH0KIAogCi1CT09MMzIgV0lOQVBJIEltYWdlTGlzdF9TZXREcmFnQ3Vyc29ySW1hZ2UgKAotCUhJTUFHRUxJU1QgaGltbERyYWcsCi0JSU5UMzIgaURyYWcsCi0JSU5UMzIgZHhIb3RzcG90LAotCUlOVDMyIGR5SG90c3BvdCkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJbWFnZUxpc3RfU2V0RHJhZ0N1cnNvckltYWdlIFtDT01DVEwzMi43NV0KKyAqCisgKiBDb21iaW5lcyB0aGUgc3BlY2lmaWVkIGltYWdlIHdpdGggdGhlIGN1cnJlbnQgZHJhZyBpbWFnZQorICoKKyAqIFBBUkFNUworICogICAgIGhpbWxEcmFnICBbSV0gZHJhZyBpbWFnZSBsaXN0IGhhbmRsZQorICogICAgIGlEcmFnICAgICBbSV0gZHJhZyBpbWFnZSBpbmRleAorICogICAgIGR4SG90c3BvdCBbSV0gWCBwb3NpdGlvbiBvZiB0aGUgaG90IHNwb3QKKyAqICAgICBkeUhvdHNwb3QgW0ldIFkgcG9zaXRpb24gb2YgdGhlIGhvdCBzcG90CisgKgorICogUkVUVVJOUworICogICAgIFN1Y2Nlc3M6IFRSVUUKKyAqICAgICBGYWlsdXJlOiBGQUxTRQorICoKKyAqIEJVR1MKKyAqICAgICBlbXB0eSBzdHViLgorICovCisKK0JPT0wzMiBXSU5BUEkKK0ltYWdlTGlzdF9TZXREcmFnQ3Vyc29ySW1hZ2UgKEhJTUFHRUxJU1QgaGltbERyYWcsIElOVDMyIGlEcmFnLAorCQkJICAgICAgSU5UMzIgZHhIb3RzcG90LCBJTlQzMiBkeUhvdHNwb3QpCiB7CisgICAgSElNQUdFTElTVCBoaW1sVGVtcDsKKwogICAgIEZJWE1FIChpbWFnZWxpc3QsICJlbXB0eSBzdHViIVxuIik7CiAKKyAgICBpZiAoaGltbEludGVybmFsRHJhZyA9PSBOVUxMKSByZXR1cm4gKEZBTFNFKTsKKworICAgIFRSQUNFIChpbWFnZWxpc3QsICIgZHhIPSVkIGR5SD0lZCBuWD0lZCBuWT0lZFxuIiwKKwkgICBkeEhvdHNwb3QsIGR5SG90c3BvdCwgbkludGVybmFsRHJhZ0hvdHNwb3RYLCBuSW50ZXJuYWxEcmFnSG90c3BvdFkpOworCisgICAgaGltbFRlbXAgPSBJbWFnZUxpc3RfTWVyZ2UgKGhpbWxJbnRlcm5hbERyYWcsIDAsIGhpbWxEcmFnLCBpRHJhZywKKwkJCQlkeEhvdHNwb3QsIGR5SG90c3BvdCk7CisKKyAgICBJbWFnZUxpc3RfRGVzdHJveSAoaGltbEludGVybmFsRHJhZyk7CisgICAgaGltbEludGVybmFsRHJhZyA9IGhpbWxUZW1wOworCisgICAgbkludGVybmFsRHJhZ0hvdHNwb3RYID0gZHhIb3RzcG90OworICAgIG5JbnRlcm5hbERyYWdIb3RzcG90WSA9IGR5SG90c3BvdDsKKwogICAgIHJldHVybiAoRkFMU0UpOwogfQogCiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJbWFnZUxpc3RfU2V0RmlsdGVyIFtDT01DVEwzMi43Nl0gCisgKgorICogU2V0cyBhIGZpbHRlciAob3IgZG9lcyBzb21ldGhpbmcgY29tcGxldGVseSBkaWZmZXJlbnQpISE/Pz8KKyAqCisgKiBQQVJBTVMKKyAqICAgICBoaW1sICAgICBbSV0gPz8/CisgKiAgICAgaSAgICAgICAgW0ldID8/PworICogICAgIGR3RmlsdGVyIFtJXSA/Pz8KKyAqCisgKiBSRVRVUk5TCisgKiAgICAgU3VjY2VzczogVFJVRQorICogICAgIEZhaWx1cmU6IEZBTFNFCisgKgorICogQlVHUworICogICAgIHVuZG9jdW1lbnRlZCEhISEKKyAqICAgICBlbXB0eSBzdHViLgorICovCisKICNpZiAwCi1CT09MMzIgV0lOQVBJIEltYWdlTGlzdF9TZXRGaWx0ZXIgKAotCUhJTUFHRUxJU1QgaGltbCwgCi0JSU5UMzIgaUluZGV4LCAKLQlJTlQzMiBpRmlsdGVyKQorQk9PTDMyIFdJTkFQSQorSW1hZ2VMaXN0X1NldEZpbHRlciAoSElNQUdFTElTVCBoaW1sLCBJTlQzMiBpLCBEV09SRCBkd0ZpbHRlcikKIHsKICAgICBGSVhNRSAoaW1hZ2VsaXN0LCAiZW1wdHkgc3R1YiFcbiIpOwogCkBAIC0xNjg1LDEwICsyMDA1LDIzIEBACiAjZW5kaWYgLyogMCAqLwogCiAKLUJPT0wzMiBXSU5BUEkgSW1hZ2VMaXN0X1NldEljb25TaXplICgKLQlISU1BR0VMSVNUIGhpbWwsIAotCUlOVDMyIGN4LCAKLQlJTlQzMiBjeSkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJbWFnZUxpc3RfU2V0SWNvblNpemUgW0NPTUNUTDMyLjc3XQorICoKKyAqIFNldHMgdGhlIGltYWdlIHNpemUgb2YgdGhlIGJpdG1hcCBhbmQgZGVsZXRlcyBhbGwgaW1hZ2VzLgorICoKKyAqIFBBUkFNUworICogICAgIGhpbWwgW0ldIGltYWdlIGxpc3QgaGFuZGxlCisgKiAgICAgY3ggICBbSV0gaW1hZ2Ugd2lkdGgKKyAqICAgICBjeSAgIFtJXSBpbWFnZSBoZWlnaHQKKyAqCisgKiBSRVRVUk5TCisgKiAgICAgU3VjY2VzczogVFJVRQorICogICAgIEZhaWx1cmU6IEZBTFNFCisgKi8KKworQk9PTDMyIFdJTkFQSQorSW1hZ2VMaXN0X1NldEljb25TaXplIChISU1BR0VMSVNUIGhpbWwsIElOVDMyIGN4LCBJTlQzMiBjeSkKIHsKICAgICBJTlQzMiBuQ291bnQ7CiAKQEAgLTE3MTgsOSArMjA1MSwyMiBAQAogfQogCiAKLUJPT0wzMiBXSU5BUEkgSW1hZ2VMaXN0X1NldEltYWdlQ291bnQgKAotCUhJTUFHRUxJU1QgaGltbCwgCi0JSU5UMzIgaUltYWdlQ291bnQpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSW1hZ2VMaXN0X1NldEltYWdlQ291bnQgW0NPTUNUTDMyLjc4XQorICoKKyAqIFJlc2l6ZXMgYW4gaW1hZ2UgbGlzdCB0byB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBpbWFnZXMuCisgKgorICogUEFSQU1TCisgKiAgICAgaGltbCAgICAgICAgW0ldIGltYWdlIGxpc3QgaGFuZGxlCisgKiAgICAgaUltYWdlQ291bnQgW0ldIG51bWJlciBvZiBpbWFnZXMgaW4gdGhlIGltYWdlIGxpc3QKKyAqCisgKiBSRVRVUk5TCisgKiAgICAgU3VjY2VzczogVFJVRQorICogICAgIEZhaWx1cmU6IEZBTFNFCisgKi8KKworQk9PTDMyIFdJTkFQSQorSW1hZ2VMaXN0X1NldEltYWdlQ291bnQgKEhJTUFHRUxJU1QgaGltbCwgSU5UMzIgaUltYWdlQ291bnQpCiB7CiAgICAgSERDMzIgICAgIGhkY0ltYWdlTGlzdCwgaGRjQml0bWFwOwogICAgIEhCSVRNQVAzMiBoYm1OZXdCaXRtYXA7CkBAIC0xNzgzLDEwICsyMTI5LDIzIEBACiB9CiAKIAotQk9PTDMyIFdJTkFQSSBJbWFnZUxpc3RfU2V0T3ZlcmxheUltYWdlICgKLQlISU1BR0VMSVNUIGhpbWwsIAotCUlOVDMyIGlJbWFnZSwgCi0JSU5UMzIgaU92ZXJsYXkpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSW1hZ2VMaXN0X1NldE92ZXJsYXlJbWFnZSBbQ09NQ1RMMzIuNzldCisgKgorICogQXNzaWducyBhbiBvdmVybGF5IG1hc2sgaW5kZXggdG8gYW4gZXhpc3RpbmcgaW1hZ2UgaW4gYW4gaW1hZ2UgbGlzdC4KKyAqCisgKiBQQVJBTVMKKyAqICAgICBoaW1sICAgICBbSV0gaW1hZ2UgbGlzdCBoYW5kbGUKKyAqICAgICBpSW1hZ2UgICBbSV0gaW1hZ2UgaW5kZXgKKyAqICAgICBpT3ZlcmxheSBbSV0gb3ZlcmxheSBtYXNrIGluZGV4CisgKgorICogUkVUVVJOUworICogICAgIFN1Y2Nlc3M6IFRSVUUKKyAqICAgICBGYWlsdXJlOiBGQUxTRQorICovCisKK0JPT0wzMiBXSU5BUEkKK0ltYWdlTGlzdF9TZXRPdmVybGF5SW1hZ2UgKEhJTUFHRUxJU1QgaGltbCwgSU5UMzIgaUltYWdlLCBJTlQzMiBpT3ZlcmxheSkKIHsKICAgICBpZiAoKGlPdmVybGF5IDwgMSkgfHwgKGlPdmVybGF5ID4gTUFYX09WRVJMQVlJTUFHRSkpIHJldHVybiAoRkFMU0UpOwogICAgIGlmICgoaUltYWdlIDwgMCkgfHwgKGlJbWFnZSA+IGhpbWwtPmNDdXJJbWFnZSkpIHJldHVybiAoRkFMU0UpOwpAQCAtMTc5NiwxMSArMjE1NSwyNyBAQAogfQogCiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJbWFnZUxpc3RfV3JpdGUgW0NPTUNUTDMyLjgwXQorICoKKyAqIFdyaXRlcyBhbiBpbWFnZSBsaXN0IHRvIGEgc3RyZWFtLgorICoKKyAqIFBBUkFNUworICogICAgIGhpbWwgW0ldIEltYWdlIGxpc3QgaGFuZGxlLgorICogICAgIHBzdG0gW09dIFBvaW50ZXIgdG8gYSBzdHJlYW0uCisgKgorICogUkVUVVJOUworICogICAgIFN1Y2Nlc3M6IFRSVUUKKyAqICAgICBGYWlsdXJlOiBGQUxTRQorICoKKyAqIEJVR1MKKyAqICAgICBlbXB0eSBzdHViLgorICovCisKICNpZiAwCiAjaWYgX19JU3RyZWFtX0lOVEVSRkFDRV9ERUZJTkVEX18KLUJPT0wzMiBXSU5BUEkgSW1hZ2VMaXN0X1dyaXRlICgKLQlISU1BR0VMSVNUIGhpbWwsIAotCUxQU1RSRUFNIHBzdG0pCitCT09MMzIgV0lOQVBJCitJbWFnZUxpc3RfV3JpdGUgKEhJTUFHRUxJU1QgaGltbCwgTFBTVFJFQU0gcHN0bSkKIHsKICAgICBGSVhNRSAoaW1hZ2VsaXN0LCAiZW1wdHkgc3R1YiFcbiIpOwogCkBAIC0xODA5LDMgKzIxODQsNCBAQAogfQogI2VuZGlmICAvKiBfX0lTdHJlYW1fSU5URVJGQUNFX0RFRklORURfXyAqLwogI2VuZGlmICAvKiAwICovCisKZGlmZiAtLWdpdCBhL21pc2MvbHN0ci5jIGIvbWlzYy9sc3RyLmMKaW5kZXggOThkODc0OC4uMTQ5MWQ0ZiAxMDA2NDQKLS0tIGEvbWlzYy9sc3RyLmMKKysrIGIvbWlzYy9sc3RyLmMKQEAgLTE1MiwxNSArMTUyLDE1IEBACiAgKi8KIHZvaWQgV0lOQVBJIE91dHB1dERlYnVnU3RyaW5nMTYoIExQQ1NUUiBzdHIgKQogewotICAgIGNoYXIgKm1vZHVsZTsKKyAgICBjaGFyIG1vZHVsZVsxMF07CiAgICAgY2hhciAqcCwgKmJ1ZmZlciA9IEhlYXBBbGxvYyggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3RybGVuKHN0cikrMiApOwogICAgIC8qIFJlbW92ZSBDUnMgKi8KICAgICBmb3IgKHAgPSBidWZmZXI7ICpzdHI7IHN0cisrKSBpZiAoKnN0ciAhPSAnXHInKSAqcCsrID0gKnN0cjsKICAgICAqcCA9ICdcMCc7CiAgICAgaWYgKChwID4gYnVmZmVyKSAmJiAocFstMV0gPT0gJ1xuJykpIHBbMV0gPSAnXDAnOyAvKiBSZW1vdmUgdHJhaWxpbmcgXG4gKi8KLSAgICBtb2R1bGUgPSBNT0RVTEVfR2V0TW9kdWxlTmFtZSggR2V0Q3VycmVudFRhc2soKSApOwotICAgIFRSQUNFKHJlc291cmNlLCAiJXMgc2F5cyAnJXMnXG4iLAotICAgICAgICAgICAgIG1vZHVsZSA/IG1vZHVsZSA6ICI/Pz8iLCBidWZmZXIgKTsKKyAgICBpZiAoIUdldE1vZHVsZU5hbWUoIEdldEN1cnJlbnRUYXNrKCksIG1vZHVsZSwgc2l6ZW9mKG1vZHVsZSkgKSkKKyAgICAgICAgc3RyY3B5KCBtb2R1bGUsICI/Pz8iICk7CisgICAgVFJBQ0UocmVzb3VyY2UsICIlcyBzYXlzICclcydcbiIsIG1vZHVsZSwgYnVmZmVyICk7CiAgICAgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIGJ1ZmZlciApOwogfQogCkBAIC01NTMsNyArNTUzLDcgQEAKIAogCWlmIChmcm9tKSB7CiAJCWY9ZnJvbTsKLQkJd2hpbGUgKCpmKSB7CisJCXdoaWxlICgqZiAmJiAhbm9saW5lZmVlZCkgewogCQkJaWYgKCpmPT0nJScpIHsKIAkJCQlpbnQJaW5zZXJ0bnI7CiAJCQkJY2hhcgkqZm10c3RyLCpzcHJpbnRmYnVmLCp4LCpsYXN0ZjsKQEAgLTY0NiwxNCArNjQ2LDcgQEAKIAkJfQogCQkqdD0nXDAnOwogCX0KLQlpZiAobm9saW5lZmVlZCkgewotCSAgICAvKiByZW1vdmUgbGluZWZlZWQgKi8KLQkgICAgaWYodD50YXJnZXQgJiYgdFstMV09PSdcbicpIHsKLQkJKi0tdD0wOwotCQlpZih0PnRhcmdldCAmJiB0Wy0xXT09J1xyJykKLQkJICAgICotLXQ9MDsKLQkgICAgfQotCX0gZWxzZSB7CisJaWYgKCFub2xpbmVmZWVkKSB7CiAJICAgIC8qIGFkZCBsaW5lZmVlZCAqLwogCSAgICBpZih0PT10YXJnZXQgfHwgdFstMV0hPSdcbicpCiAJCUFERF9UT19UKCdcbicpOyAvKiBGSVhNRTogcGVyaGFwcyBhZGQgXHIgdG9vPyAqLwpAQCAtNzMyLDcgKzcyNSw3IEBACiAKIAlpZiAoZnJvbSkgewogCQlmPWZyb207Ci0JCXdoaWxlICgqZikgeworCQl3aGlsZSAoKmYgJiYgIW5vbGluZWZlZWQpIHsKIAkJCWlmICgqZj09JyUnKSB7CiAJCQkJaW50CWluc2VydG5yOwogCQkJCWNoYXIJKmZtdHN0ciwqc3ByaW50ZmJ1ZiwqeDsKQEAgLTgyNiwxNCArODE5LDcgQEAKIAkJfQogCQkqdD0nXDAnOwogCX0KLQlpZiAobm9saW5lZmVlZCkgewotCSAgICAvKiByZW1vdmUgbGluZWZlZWQgKi8KLQkgICAgaWYodD50YXJnZXQgJiYgdFstMV09PSdcbicpIHsKLQkJKi0tdD0wOwotCQlpZih0PnRhcmdldCAmJiB0Wy0xXT09J1xyJykKLQkJICAgICotLXQ9MDsKLQkgICAgfQotCX0gZWxzZSB7CisJaWYgKCFub2xpbmVmZWVkKSB7CiAJICAgIC8qIGFkZCBsaW5lZmVlZCAqLwogCSAgICBpZih0PT10YXJnZXQgfHwgdFstMV0hPSdcbicpCiAJCUFERF9UT19UKCdcbicpOyAvKiBGSVhNRTogcGVyaGFwcyBhZGQgXHIgdG9vPyAqLwpkaWZmIC0tZ2l0IGEvbWlzYy9semV4cGFuZC5jIGIvbWlzYy9semV4cGFuZC5jCmluZGV4IGRjZjY2NzUuLjZiYzlmNDQgMTAwNjQ0Ci0tLSBhL21pc2MvbHpleHBhbmQuYworKysgYi9taXNjL2x6ZXhwYW5kLmMKQEAgLTQ3MywxNyArNDczLDI1IEBACiAgKi8KIExPTkcgV0lOQVBJIExaQ29weTMyKCBIRklMRTMyIHNyYywgSEZJTEUzMiBkZXN0ICkKIHsKLQlpbnQJaSxyZXQsd3JldDsKKwlpbnQJdXNlZGx6aW5pdD0wLGkscmV0LHdyZXQ7CiAJTE9ORwlsZW47CisJSEZJTEUzMglvbGRzcmMgPSBzcmM7CiAjZGVmaW5lIEJVRkxFTgkxMDAwCiAJQllURQlidWZbQlVGTEVOXTsKIAlJTlQzMglXSU5BUEkgKCp4cmVhZCkoSEZJTEUzMixMUFZPSUQsVUlOVDMyKTsKIAogCVRSQUNFKGZpbGUsIiglZCwlZClcbiIsc3JjLGRlc3QpOworCWlmIChzcmM8MHg0MDApIHsKKwkJc3JjID0gTFpJbml0MzIoc3JjKTsKKwkJaWYgKHNyYyE9b2xkc3JjKQorCQkJdXNlZGx6aW5pdD0xOworCQlpZiAoc3JjPjB4ZmZmMCkKKwkJCXJldHVybiAwOworCX0KKwogCWZvciAoaT0wO2k8bnJvZmx6c3RhdGVzO2krKykKIAkJaWYgKHNyYz09bHpzdGF0ZXNbaV0ubHpmZCkKIAkJCWJyZWFrOwotCiAJLyogbm90IGNvbXByZXNzZWQ/IGp1c3QgY29weSAqLwogCWlmIChpPT1ucm9mbHpzdGF0ZXMpCiAJCXhyZWFkPShJTlQzMigqKShIRklMRTMyLExQVk9JRCxVSU5UMzIpKV9scmVhZDMyOwpAQCAtNTA0LDYgKzUxMiw4IEBACiAJCWlmICh3cmV0IT1yZXQpCiAJCQlyZXR1cm4gTFpFUlJPUl9XUklURTsKIAl9CisJaWYgKHVzZWRsemluaXQpCisJCUxaQ2xvc2UzMihzcmMpOwogCXJldHVybiBsZW47CiAjdW5kZWYgQlVGTEVOCiB9CmRpZmYgLS1naXQgYS9taXNjL21haW4uYyBiL21pc2MvbWFpbi5jCmluZGV4IGVlYTU4YjkuLjZkN2Y0N2QgMTAwNjQ0Ci0tLSBhL21pc2MvbWFpbi5jCisrKyBiL21pc2MvbWFpbi5jCkBAIC0xMTYsNiArMTE2LDcgQEAKICNkZWZpbmUgTkJfT1BUSU9OUyAgKHNpemVvZihvcHRpb25zVGFibGUpIC8gc2l6ZW9mKG9wdGlvbnNUYWJsZVswXSkpCiAKICNkZWZpbmUgVVNBR0UgXAorICAiJXNcbiIgXAogICAiVXNhZ2U6ICAlcyBbb3B0aW9uc10gXCJwcm9ncmFtX25hbWUgW2FyZ3VtZW50c11cIlxuIiBcCiAgICJcbiIgXAogICAiT3B0aW9uczpcbiIgXApAQCAtMTI4LDYgKzEyOSw3IEBACiAgICIgICAgLWRsbCBuYW1lICAgICAgIEVuYWJsZSBvciBkaXNhYmxlIGJ1aWx0LWluIERMTHNcbiIgXAogICAiICAgIC1mYWlscmVhZG9ubHkgICBSZWFkIG9ubHkgZmlsZXMgbWF5IG5vdCBiZSBvcGVuZWQgaW4gd3JpdGUgbW9kZVxuIiBcCiAgICIgICAgLWZpeGVkbWFwICAgICAgIFVzZSBhIFwic3RhbmRhcmRcIiBjb2xvciBtYXBcbiIgXAorICAiICAgIC1oZWxwICAgICAgICAgICBTaG93IHRoaXMgaGVscCBtZXNzYWdlXG4iIFwKICAgIiAgICAtaWNvbmljICAgICAgICAgU3RhcnQgYXMgYW4gaWNvblxuIiBcCiAgICIgICAgLWxhbmd1YWdlIHh4ICAgIFNldCB0aGUgbGFuZ3VhZ2UgKG9uZSBvZiBFbixFcyxEZSxObyxGcixGaSxEYSxDeixFbyxJdCxLbyxcbiAgICAgICAgICAgICAgICAgICAgSHUsUGwsUG8sU3csQ2EpXG4iIFwKICAgIiAgICAtbWFuYWdlZCAgICAgICAgQWxsb3cgdGhlIHdpbmRvdyBtYW5hZ2VyIHRvIG1hbmFnZSBjcmVhdGVkIHdpbmRvd3NcbiIgXApAQCAtMTQ2LDcgKzE0OCw3IEBACiAgKi8KIHZvaWQgTUFJTl9Vc2FnZSggY2hhciAqbmFtZSApCiB7Ci0gICAgTVNHKCBVU0FHRSwgbmFtZSApOworICAgIE1TRyggVVNBR0UsIFdJTkVfUkVMRUFTRV9JTkZPLCBuYW1lICk7CiAgICAgZXhpdCgxKTsKIH0KIApAQCAtMTk5LDEyICsyMDEsMTQgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICBQYXJzZURlYnVnT3B0aW9ucworICogICAgICAgICAgTUFJTl9QYXJzZURlYnVnT3B0aW9ucwogICoKICAqICBUdXJucyBzcGVjaWZpYyBkZWJ1ZyBtZXNzYWdlcyBvbiBvciBvZmYsIGFjY29yZGluZyB0byAib3B0aW9ucyIuCi0gKiAgUmV0dXJucyBUUlVFIGlmIHBhcnNpbmcgd2FzIHN1Y2Nlc3NmdWwKKyAqICAKKyAqICBSRVRVUk5TCisgKiAgICBUUlVFIGlmIHBhcnNpbmcgd2FzIHN1Y2Nlc3NmdWwKICAqLwotQk9PTDMyIFBhcnNlRGVidWdPcHRpb25zKGNoYXIgKm9wdGlvbnMpCitzdGF0aWMgQk9PTDMyIE1BSU5fUGFyc2VEZWJ1Z09wdGlvbnMoY2hhciAqb3B0aW9ucykKIHsKICAgaW50IGwsIGNsczsKICAgaWYgKHN0cmxlbihvcHRpb25zKTwzKQpAQCAtMzMwLDYgKzMzNCwxMSBAQAogICAgICAgICAgICAgTVNHKCAiJXNcbiIsIFdJTkVfUkVMRUFTRV9JTkZPICk7CiAgICAgICAgICAgICBleGl0KDApOwogICAgICAgICB9CisgICAgICAgIGlmICghc3RyY21wKCBhcmd2W2ldLCAiLWgiICkgfHwgIXN0cmNtcCggYXJndltpXSwgIi1oZWxwIiApKQorICAgICAgICB7CisgICAgICAgICAgICBNQUlOX1VzYWdlKGFyZ3ZbMF0pOworICAgICAgICAgICAgZXhpdCgwKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgICAgLyogT3BlbiBkaXNwbGF5ICovCkBAIC0zODMsNyArMzkyLDcgQEAKICAgICBpZiAoTUFJTl9HZXRSZXNvdXJjZSggZGIsICIubW9kZSIsICZ2YWx1ZSkpCiAgICAgICAgIE1BSU5fUGFyc2VNb2RlT3B0aW9uKCAoY2hhciAqKXZhbHVlLmFkZHIgKTsKICAgICBpZiAoTUFJTl9HZXRSZXNvdXJjZSggZGIsICIuZGVidWdvcHRpb25zIiwgJnZhbHVlKSkKLQlQYXJzZURlYnVnT3B0aW9ucygoY2hhciopdmFsdWUuYWRkcik7CisJTUFJTl9QYXJzZURlYnVnT3B0aW9ucygoY2hhciopdmFsdWUuYWRkcik7CiAgICAgaWYgKE1BSU5fR2V0UmVzb3VyY2UoIGRiLCAiLmRlYnVnbXNnIiwgJnZhbHVlKSkKICAgICAgIHsKICNpZm5kZWYgREVCVUdfUlVOVElNRQpAQCAtMzkyLDcgKzQwMSw3IEBACiAJICBhcmd2WzBdKTsKIAlleGl0KDEpOwogI2Vsc2UKLQlpZiAoUGFyc2VEZWJ1Z09wdGlvbnMoKGNoYXIqKXZhbHVlLmFkZHIpPT1GQUxTRSkKKwlpZiAoTUFJTl9QYXJzZURlYnVnT3B0aW9ucygoY2hhciopdmFsdWUuYWRkcik9PUZBTFNFKQogCSAgewogCSAgICBpbnQgaTsKIAkgICAgTVNHKCIlczogU3ludGF4OiAtZGVidWdtc2cgW2NsYXNzXSt4eHgsLi4uICBvciAiCkBAIC01MzEsNiArNTQwLDkgQEAKIH0KIAogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBjYWxsZWRfYXRfZXhpdAorICovCiBzdGF0aWMgdm9pZCBjYWxsZWRfYXRfZXhpdCh2b2lkKQogewogICAgIE1BSU5fUmVzdG9yZVNldHVwKCk7CmRpZmYgLS1naXQgYS9taXNjL25ldHdvcmsuYyBiL21pc2MvbmV0d29yay5jCmluZGV4IDFkZjVhMWMuLjJjMTdkY2IgMTAwNjQ0Ci0tLSBhL21pc2MvbmV0d29yay5jCisrKyBiL21pc2MvbmV0d29yay5jCkBAIC00NzgsOSArNDc4LDE0IEBACiAgKi8KIGludCBXSU5BUEkgV05ldEdldERpcmVjdG9yeVR5cGUxNihMUFNUUiBscE5hbWUsIExQSU5UMTYgbHBUeXBlKQogewotCUZJWE1FKHduZXQsICIoJyVzJywlcCk6IHN0dWJcbiIsbHBOYW1lLGxwVHlwZSk7Ci0JKmxwVHlwZSA9IDA7Ci0JcmV0dXJuIFdOX05PX05FVFdPUks7CisgICAgICAgIFVJTlQzMiB0eXBlID0gR2V0RHJpdmVUeXBlMzJBKGxwTmFtZSk7CisKKwlpZiAodHlwZSA9PSBEUklWRV9ET0VTTk9URVhJU1QpCisJICB0eXBlID0gR2V0RHJpdmVUeXBlMzJBKE5VTEwpOworCSpscFR5cGUgPSAodHlwZT09RFJJVkVfUkVNT1RFKT9XTkRUX05FVFdPUks6V05EVF9OT1JNQUw7CisJVFJBQ0Uod25ldCwiJXMgaXMgJXNcbiIsbHBOYW1lLCgqbHBUeXBlPT1XTkRUX05FVFdPUkspPworCSAgICAgICJXTkRUX05FVFdPUksiOiJXTkRUX05PUk1BTCIpOworCXJldHVybiBXTl9TVUNDRVNTOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL21pc2MvcmVnaXN0cnkuYyBiL21pc2MvcmVnaXN0cnkuYwppbmRleCA1MzdjNGVkLi5kNDU2OWU2IDEwMDY0NAotLS0gYS9taXNjL3JlZ2lzdHJ5LmMKKysrIGIvbWlzYy9yZWdpc3RyeS5jCkBAIC02LDYgKzYsMTcgQEAKICAqIERlY2VtYmVyIDIxLCAxOTk3IC0gS2V2aW4gQ296ZW5zCiAgKiBGaXhlZCBidWdzIGluIHRoZSBfdzk1X2xvYWRyZWcoKSBmdW5jdGlvbi4gQWRkZWQgZXh0cmEgaW5mb3JtYXRpb24KICAqIHJlZ2FyZGluZyB0aGUgZm9ybWF0IG9mIHRoZSBXaW5kb3dzICc5NSByZWdpc3RyeSBmaWxlcy4KKyAqCisgKiBNYXkgNSwgMTk5OCAtIE1hdHRoZXcgQmVja2VyCisgKiBDaGFuZ2VkIG9wdGlvbmZsYWdzIHRvIERXT1JEIGluc3RlYWQgb2YgaW50IGJlY2F1c2UgaXQgY291bGQgYmUgMHg4MDAwMDAwCisgKiBBbGwgZXJyb3IgcmV0dXJuIHZhbHVlcyBtdXN0IGNvbWUgZnJvbSB3aW5lcnJvci5oCisgKgorICogTk9URVMKKyAqICAgIFdoZW4gY2hhbmdpbmcgdGhpcyBmaWxlLCBwbGVhc2UgcmUtcnVuIHRoZSByZWd0ZXN0IHByb2dyYW0gdG8gZW5zdXJlCisgKiAgICB0aGUgY29uZGl0aW9ucyBhcmUgaGFuZGxlZCBwcm9wZXJseS4KKyAqCisgKiBUT0RPCisgKiAgICBTZWN1cml0eSBhY2Nlc3MKICAqLwogCiAjaW5jbHVkZSA8c3RkbGliLmg+CkBAIC0yOSw2ICs0MCw5IEBACiAjaW5jbHVkZSAieG1hbGxvYy5oIgogI2luY2x1ZGUgIndpbnJlZy5oIgogCit2b2lkIFNIRUxMX1N0YXJ0dXBSZWdpc3RyeSgpOworCisvKiBUaGlzIGlzIG5vdCB1c2VkIGFueXdoZXJlICovCiAjZGVmaW5lCURFQlVHX1c5NV9MT0FEUkVHCTAKIAogLyogRklYTUU6IGZvbGxvd2luZyBkZWZpbmVzIHNob3VsZCBiZSBjb25maWd1cmVkIGdsb2JhbCAuLi4gKi8KQEAgLTgzLDggKzk3LDEyIEBACiAvKiB3aGF0IHZhbHVldHlwZXMgZG8gd2UgbmVlZCB0byBjb252ZXJ0PyAqLwogI2RlZmluZSBVTklDT05WTUFTSwkoKDE8PFJFR19TWil8KDE8PFJFR19NVUxUSV9TWil8KDE8PFJFR19FWFBBTkRfU1opKQogCi1leHRlcm4gTFBXU1RSIF9fY2RlY2wgQ1JURExMX3djc2NocihMUFdTVFIgYSxXQ0hBUiBjKTsKIAorLyoKKyAqIEZJWE1FCisgKiAgIEFyZSB0aGVzZSBkb2luZyB0aGUgc2FtZSBhcyBIRUFQX3N0cmR1cEF0b1cgYW5kIEhFQVBfc3RyZHVwV3RvQT8KKyAqICAgSWYgc28sIGNhbiB3ZSByZW1vdmUgdGhlbT8KKyAqLwogc3RhdGljIExQV1NUUiBzdHJkdXBBMlcoTFBDU1RSIHNyYykKIHsKIAlMUFdTVFIgZGVzdD14bWFsbG9jKDIqc3RybGVuKHNyYykrMik7CkBAIC0xMTEsNjEgKzEyOSw5NyBAQAogc3RhdGljIGludAlucm9mb3BlbmhhbmRsZXM9MDsKIHN0YXRpYyBpbnQJY3VycmVudGhhbmRsZT0xOwogCi1zdGF0aWMgdm9pZAotYWRkX2hhbmRsZShIS0VZIGhrZXksTFBLRVlTVFJVQ1QgbHBrZXksUkVHU0FNIGFjY2Vzc21hc2spIHsKLQlpbnQJaTsKIAotCWZvciAoaT0wO2k8bnJvZm9wZW5oYW5kbGVzO2krKykgewotCQlpZiAob3BlbmhhbmRsZXNbaV0ubHBrZXk9PWxwa2V5KSB7Ci0JCQlXQVJOKHJlZywgIlRyaWVkIHRvIGFkZCAlcCB0d2ljZSFcbiIsbHBrZXkpOwotCQl9Ci0JCWlmIChvcGVuaGFuZGxlc1tpXS5oa2V5PT1oa2V5KSB7Ci0JCQlXQVJOKHJlZywgIlRyaWVkIHRvIGFkZCAlbHggdHdpY2UhXG4iLChMT05HKWhrZXkpOwotCQl9Ci0JfQotCW9wZW5oYW5kbGVzPXhyZWFsbG9jKAlvcGVuaGFuZGxlcywKLQkJCQlzaXplb2Yoc3RydWN0IG9wZW5oYW5kbGUpKihucm9mb3BlbmhhbmRsZXMrMSkKLQkJKTsKLQlvcGVuaGFuZGxlc1tpXS5scGtleQk9IGxwa2V5OwotCW9wZW5oYW5kbGVzW2ldLmhrZXkJPSBoa2V5OwotCW9wZW5oYW5kbGVzW2ldLmFjY2Vzc21hc2s9IGFjY2Vzc21hc2s7Ci0JbnJvZm9wZW5oYW5kbGVzKys7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBhZGRfaGFuZGxlIFtJbnRlcm5hbF0KKyAqLworc3RhdGljIHZvaWQgYWRkX2hhbmRsZSggSEtFWSBoa2V5LCBMUEtFWVNUUlVDVCBscGtleSwgUkVHU0FNIGFjY2Vzc21hc2sgKQoreworICAgIGludCBpOworCisgICAgVFJBQ0UocmVnLCIoJXgsJXAsJWx4KVxuIixoa2V5LGxwa2V5LGFjY2Vzc21hc2spOworICAgIGlmIChscGtleSkKKyAgICAgICAgVFJBQ0UocmVnLCIgKCVzKVxuIixkZWJ1Z3N0cl93KGxwa2V5LT5rZXluYW1lKSk7CisKKyAgICAvKiBDaGVjayBmb3IgZHVwbGljYXRlcyAqLworICAgIGZvciAoaT0wO2k8bnJvZm9wZW5oYW5kbGVzO2krKykgeworICAgICAgICBpZiAob3BlbmhhbmRsZXNbaV0ubHBrZXk9PWxwa2V5KSB7CisgICAgICAgICAgICAvKiBUaGlzIGlzIG5vdCByZWFsbHkgYW4gZXJyb3IgLSB0aGUgdXNlciBpcyBhbGxvd2VkIHRvIGNyZWF0ZQorICAgICAgICAgICAgICAgdHdvIChvciBtb3JlKSBoYW5kbGVzIHRvIHRoZSBzYW1lIGtleSAqLworICAgICAgICAgICAgLypXQVJOKHJlZywgIkFkZGluZyBrZXkgJXAgdHdpY2VcbiIsbHBrZXkpOyovCisgICAgICAgIH0KKyAgICAgICAgaWYgKG9wZW5oYW5kbGVzW2ldLmhrZXk9PWhrZXkpIHsKKyAgICAgICAgICAgIFdBUk4ocmVnLCAiQWRkaW5nIGhhbmRsZSAleCB0d2ljZVxuIixoa2V5KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBvcGVuaGFuZGxlcz14cmVhbGxvYyggb3BlbmhhbmRsZXMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IG9wZW5oYW5kbGUpKihucm9mb3BlbmhhbmRsZXMrMSkpOworCisgICAgb3BlbmhhbmRsZXNbaV0ubHBrZXkgPSBscGtleTsKKyAgICBvcGVuaGFuZGxlc1tpXS5oa2V5ID0gaGtleTsKKyAgICBvcGVuaGFuZGxlc1tpXS5hY2Nlc3NtYXNrID0gYWNjZXNzbWFzazsKKyAgICBucm9mb3BlbmhhbmRsZXMrKzsKIH0KIAotc3RhdGljIExQS0VZU1RSVUNUCi1nZXRfaGFuZGxlKEhLRVkgaGtleSkgewotCWludAlpOwogCi0JZm9yIChpPTA7aTxucm9mb3BlbmhhbmRsZXM7aSsrKQotCQlpZiAob3BlbmhhbmRsZXNbaV0uaGtleT09aGtleSkKLQkJCXJldHVybiBvcGVuaGFuZGxlc1tpXS5scGtleTsKLQlXQVJOKHJlZywgIkRpZG4ndCBmaW5kIGhhbmRsZSAlbHg/XG4iLChMT05HKWhrZXkpOwotCXJldHVybiBOVUxMOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ2V0X2hhbmRsZSBbSW50ZXJuYWxdCisgKgorICogUkVUVVJOUworICogICAgU3VjY2VzczogUG9pbnRlciB0byBrZXkKKyAqICAgIEZhaWx1cmU6IE5VTEwKKyAqLworc3RhdGljIExQS0VZU1RSVUNUIGdldF9oYW5kbGUoIEhLRVkgaGtleSApCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGk9MDsgaTxucm9mb3BlbmhhbmRsZXM7IGkrKykKKyAgICAgICAgaWYgKG9wZW5oYW5kbGVzW2ldLmhrZXkgPT0gaGtleSkKKyAgICAgICAgICAgIHJldHVybiBvcGVuaGFuZGxlc1tpXS5scGtleTsKKyAgICBXQVJOKHJlZywgIkNvdWxkIG5vdCBmaW5kIGhhbmRsZSAleFxuIixoa2V5KTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIHZvaWQKLXJlbW92ZV9oYW5kbGUoSEtFWSBoa2V5KSB7Ci0JaW50CWk7CiAKLQlmb3IgKGk9MDtpPG5yb2ZvcGVuaGFuZGxlcztpKyspCi0JCWlmIChvcGVuaGFuZGxlc1tpXS5oa2V5PT1oa2V5KQotCQkJYnJlYWs7Ci0JaWYgKGk9PW5yb2ZvcGVuaGFuZGxlcykgewotCQlXQVJOKHJlZywgIkRpZG4ndCBmaW5kIGhhbmRsZSAlMDh4P1xuIixoa2V5KTsKLQkJcmV0dXJuOwotCX0KLQltZW1jcHkoCW9wZW5oYW5kbGVzK2ksCi0JCW9wZW5oYW5kbGVzK2krMSwKLQkJc2l6ZW9mKHN0cnVjdCBvcGVuaGFuZGxlKSoobnJvZm9wZW5oYW5kbGVzLWktMSkKLQkpOwotCW9wZW5oYW5kbGVzPXhyZWFsbG9jKG9wZW5oYW5kbGVzLHNpemVvZihzdHJ1Y3Qgb3BlbmhhbmRsZSkqKG5yb2ZvcGVuaGFuZGxlcy0xKSk7Ci0JbnJvZm9wZW5oYW5kbGVzLS07Ci0JcmV0dXJuOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogcmVtb3ZlX2hhbmRsZSBbSW50ZXJuYWxdCisgKgorICogUEFSQU1TCisgKiAgICBoa2V5IFtJXSBIYW5kbGUgb2Yga2V5IHRvIHJlbW92ZQorICoKKyAqIFJFVFVSTlMKKyAqICAgIFN1Y2Nlc3M6IEVSUk9SX1NVQ0NFU1MKKyAqICAgIEZhaWx1cmU6IEVSUk9SX0lOVkFMSURfSEFORExFCisgKi8KK3N0YXRpYyBEV09SRCByZW1vdmVfaGFuZGxlKCBIS0VZIGhrZXkgKQoreworICAgIGludCBpOworCisgICAgZm9yIChpPTA7aTxucm9mb3BlbmhhbmRsZXM7aSsrKQorICAgICAgICBpZiAob3BlbmhhbmRsZXNbaV0uaGtleT09aGtleSkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgaWYgKGkgPT0gbnJvZm9wZW5oYW5kbGVzKSB7CisgICAgICAgIFdBUk4ocmVnLCAiQ291bGQgbm90IGZpbmQgaGFuZGxlICV4XG4iLGhrZXkpOworICAgICAgICByZXR1cm4gRVJST1JfSU5WQUxJRF9IQU5ETEU7CisgICAgfQorCisgICAgbWVtY3B5KCBvcGVuaGFuZGxlcytpLAorICAgICAgICAgICAgb3BlbmhhbmRsZXMraSsxLAorICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBvcGVuaGFuZGxlKSoobnJvZm9wZW5oYW5kbGVzLWktMSkKKyAgICApOworICAgIG9wZW5oYW5kbGVzPXhyZWFsbG9jKG9wZW5oYW5kbGVzLHNpemVvZihzdHJ1Y3Qgb3BlbmhhbmRsZSkqKG5yb2ZvcGVuaGFuZGxlcy0xKSk7CisgICAgbnJvZm9wZW5oYW5kbGVzLS07CisgICAgcmV0dXJuIEVSUk9SX1NVQ0NFU1M7CiB9CiAKIAogLyogZGVidWcgZnVuY3Rpb24sIGNvbnZlcnRzIGEgdW5pY29kZSBpbnRvIGEgc3RhdGljIG1lbW9yeSBhcmVhIAogICogKHN1YiBmb3IgdXNpbmcgdHdvIHN0YXRpYyBzdHJpbmdzLCBpbiBjYXNlIHdlIG5lZWQgdGhlbSBpbiBhIHNpbmdsZSBjYWxsKQorICoKKyAqIEZJWE1FCisgKiAgICBUaGlzIHNlZW1zIHRvIGJlIHVzZWQgdGhlIHNhbWUgYXMgZGVidWdzdHJfdy4KKyAqICAgIElmIHNvLCBjYW4gdGhpcyBvbmUgZ28gYXdheT8KICAqLwogTFBTVFIKIFcyQyhMUENXU1RSIHgsaW50IHN1YikgewpAQCAtMTc5LDExICsyMzMsMjAgQEAKIAlyZXR1cm4gdW5pY29kZWRlYnVnW3N1Yl07CiB9CiAKLXN0YXRpYyBMUEtFWVNUUlVDVAotbG9va3VwX2hrZXkoSEtFWSBoa2V5KSB7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGxvb2t1cF9oa2V5IFtJbnRlcm5hbF0KKyAqCisgKiBSRVRVUk5TCisgKiAgICBTdWNjZXNzOiBQb2ludGVyIHRvIGtleSBzdHJ1Y3R1cmUKKyAqICAgIEZhaWx1cmU6IE5VTEwKKyAqLworc3RhdGljIExQS0VZU1RSVUNUIGxvb2t1cF9oa2V5KCBIS0VZIGhrZXkgKQorewogCXN3aXRjaCAoaGtleSkgewotCWNhc2UgMHgwMDAwMDAwMDoKLQljYXNlIDB4MDAwMDAwMDE6CisgICAgLyogVGhlc2Ugc2VlbSBlcnJvbmVvdXMgKi8KKyAgICAvKgljYXNlIDB4MDAwMDAwMDA6ICovCisgICAgLyoJY2FzZSAweDAwMDAwMDAxOiAqLwogCWNhc2UgSEtFWV9DTEFTU0VTX1JPT1Q6CiAJCXJldHVybiBrZXlfY2xhc3Nlc19yb290OwogCWNhc2UgSEtFWV9DVVJSRU5UX1VTRVI6CkBAIC0yMDQsNDIgKzI2Nyw2NSBAQAogCS8qTk9UUkVBQ0hFRCovCiB9CiAKLS8qIAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBzcGxpdF9rZXlwYXRoIFtJbnRlcm5hbF0KICAqIHNwbGl0cyB0aGUgdW5pY29kZSBzdHJpbmcgJ3dwJyBpbnRvIGFuIGFycmF5IG9mIHN0cmluZ3MuCiAgKiB0aGUgYXJyYXkgaXMgYWxsb2NhdGVkIGJ5IHRoaXMgZnVuY3Rpb24uIAotICogdGhlIG51bWJlciBvZiBjb21wb25lbnRzIHdpbGwgYmUgc3RvcmVkIGluICd3cGMnCiAgKiBGcmVlIHRoZSBhcnJheSB1c2luZyBGUkVFX0tFWV9QQVRICisgKgorICogUEFSQU1TCisgKiAgICB3cCAgW0ldIFN0cmluZyB0byBzcGxpdCB1cAorICogICAgd3B2IFtPXSBBcnJheSBvZiBwb2ludGVycyB0byBzdHJpbmdzCisgKiAgICB3cGMgW09dIE51bWJlciBvZiBjb21wb25lbnRzCiAgKi8KLXN0YXRpYyB2b2lkCi1zcGxpdF9rZXlwYXRoKExQQ1dTVFIgd3AsTFBXU1RSICoqd3B2LGludCAqd3BjKSB7Ci0JaW50CWksaixsZW47Ci0JTFBXU1RSCXdzOworc3RhdGljIHZvaWQgc3BsaXRfa2V5cGF0aCggTFBDV1NUUiB3cCwgTFBXU1RSICoqd3B2LCBpbnQgKndwYykKK3sKKyAgICBpbnQJaSxqLGxlbjsKKyAgICBMUFdTVFIgd3M7CiAKLQl3cwk9IEhFQVBfc3RyZHVwVyggU3lzdGVtSGVhcCwgMCwgd3AgKTsKLQkqd3BjCT0gMTsKLQlmb3IgKGk9MDt3c1tpXTtpKyspIHsKLQkJaWYgKHdzW2ldPT0nXFwnKSB7Ci0JCQl3c1tpXT0wOwotCQkJKCp3cGMpKys7Ci0JCX0KLQl9Ci0JbGVuCT0gaTsKLQkqd3B2CT0gKExQV1NUUiopSGVhcEFsbG9jKCBTeXN0ZW1IZWFwLCAwLCBzaXplb2YoTFBXU1RSKSooKndwYysyKSk7Ci0JKCp3cHYpWzBdPSB3czsKLQlqCT0gMTsKLQlmb3IgKGk9MTtpPGxlbjtpKyspCi0JCWlmICh3c1tpLTFdPT0wKQotCQkJKCp3cHYpW2orK109d3MraTsKLQkoKndwdilbal09TlVMTDsKKyAgICBUUkFDRShyZWcsIiglcywlcCwlcClcbiIsZGVidWdzdHJfdyh3cCksd3B2LHdwYyk7CisKKyAgICB3cwk9IEhFQVBfc3RyZHVwVyggU3lzdGVtSGVhcCwgMCwgd3AgKTsKKworICAgIC8qIFdlIGtub3cgd2UgaGF2ZSBhdCBsZWFzdCBvbmUgc3Vic3RyaW5nICovCisgICAgKndwYyA9IDE7CisKKyAgICAvKiBSZXBsYWNlIGVhY2ggYmFja3NsYXNoIHdpdGggTlVMTCwgYW5kIGluY3JlbWVudCB0aGUgY291bnQgKi8KKyAgICBmb3IgKGk9MDt3c1tpXTtpKyspIHsKKyAgICAgICAgaWYgKHdzW2ldPT0nXFwnKSB7CisgICAgICAgICAgICB3c1tpXT0wOworICAgICAgICAgICAgKCp3cGMpKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBsZW4gPSBpOworCisgICAgLyogQWxsb2NhdGUgdGhlIHNwYWNlIGZvciB0aGUgYXJyYXkgb2YgcG9pbnRlcnMsIGxlYXZpbmcgcm9vbSBmb3IgdGhlCisgICAgICAgTlVMTCBhdCB0aGUgZW5kICovCisgICAgKndwdiA9IChMUFdTVFIqKUhlYXBBbGxvYyggU3lzdGVtSGVhcCwgMCwgc2l6ZW9mKExQV1NUUikqKCp3cGMrMikpOworICAgICgqd3B2KVswXT0gd3M7CisKKyAgICAvKiBBc3NpZ24gZWFjaCBwb2ludGVyIHRvIHRoZSBhcHByb3ByaWF0ZSBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZyAqLworICAgIGogPSAxOworICAgIGZvciAoaT0xO2k8bGVuO2krKykKKyAgICAgICAgaWYgKHdzW2ktMV09PTApIHsKKyAgICAgICAgICAgICgqd3B2KVtqKytdPXdzK2k7CisgICAgICAgICAgICAvKiBUUkFDRShyZWcsICIgU3ViaXRlbSAlZCA9ICVzXG4iLGotMSxkZWJ1Z3N0cl93KCgqd3B2KVtqLTFdKSk7ICovCisgICAgICAgIH0KKworICAgICgqd3B2KVtqXT1OVUxMOwogfQogI2RlZmluZSBGUkVFX0tFWV9QQVRIIEhlYXBGcmVlKFN5c3RlbUhlYXAsMCx3cHNbMF0pO0hlYXBGcmVlKFN5c3RlbUhlYXAsMCx3cHMpOwogCi0vKgorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU0hFTExfSW5pdCBbSW50ZXJuYWxdCiAgKiBTaGVsbCBpbml0aWFsaXNhdGlvbiwgYWxsb2NhdGVzIGtleXMuIAogICovCi12b2lkIFNIRUxMX1N0YXJ0dXBSZWdpc3RyeSgpOwotdm9pZAotU0hFTExfSW5pdCgpIHsKK3ZvaWQgU0hFTExfSW5pdCgpIHsKIAlzdHJ1Y3QJcGFzc3dkCSpwd2Q7CiAKIAlIS0VZCWNsX3JfaGtleSxjX3VfaGtleTsKQEAgLTI0OSw4ICszMzUsOCBAQAogCXh4LT5rZXluYW1lPSBzdHJkdXBBMlcoIjxzaG91bGRfbm90X2FwcGVhcl9hbnl3aGVyZT4iKTsKIAogCUFERF9ST09UX0tFWShrZXlfbG9jYWxfbWFjaGluZSk7Ci0JaWYgKFJlZ0NyZWF0ZUtleTE2KEhLRVlfTE9DQUxfTUFDSElORSwiXFxTT0ZUV0FSRVxcQ2xhc3NlcyIsJmNsX3JfaGtleSkhPUVSUk9SX1NVQ0NFU1MpIHsKLQkJRVJSKHJlZywiY291bGRuJ3QgY3JlYXRlIEhLRVlfTE9DQUxfTUFDSElORVxcU09GVFdBUkVcXENsYXNzZXMuIFRoaXMgaXMgaW1wb3NzaWJsZS5cbiIpOworCWlmIChSZWdDcmVhdGVLZXkxNihIS0VZX0xPQ0FMX01BQ0hJTkUsIlNPRlRXQVJFXFxDbGFzc2VzIiwmY2xfcl9oa2V5KSE9RVJST1JfU1VDQ0VTUykgeworCQlFUlIocmVnLCJDb3VsZCBub3QgY3JlYXRlIEhLTE1cXFNPRlRXQVJFXFxDbGFzc2VzLiBUaGlzIGlzIGltcG9zc2libGUuXG4iKTsKIAkJZXhpdCgxKTsKIAl9CiAJa2V5X2NsYXNzZXNfcm9vdCA9IGxvb2t1cF9oa2V5KGNsX3JfaGtleSk7CkBAIC0yODMsMTcgKzM2OSwyNSBAQAogfQogCiAKLXZvaWQKLVNIRUxMX1N0YXJ0dXBSZWdpc3RyeSgpIHsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNIRUxMX1N0YXJ0dXBSZWdpc3RyeSBbSW50ZXJuYWxdCisgKi8KK3ZvaWQgU0hFTExfU3RhcnR1cFJlZ2lzdHJ5KCB2b2lkICkKK3sKIAlIS0VZCWhrZXk7CiAJY2hhcglidWZbMjAwXTsKIAotCVJlZ0NyZWF0ZUtleTE2KEhLRVlfRFlOX0RBVEEsIlxcUGVyZlN0YXRzXFxTdGF0RGF0YSIsJmhrZXkpOworICAgIFRSQUNFKHJlZywiKHZvaWQpXG4iKTsKKworCVJlZ0NyZWF0ZUtleTE2KEhLRVlfRFlOX0RBVEEsIlBlcmZTdGF0c1xcU3RhdERhdGEiLCZoa2V5KTsKIAlSZWdDbG9zZUtleShoa2V5KTsKIAotCVJlZ09wZW5LZXkxNihIS0VZX0xPQ0FMX01BQ0hJTkUsIlxcSEFSRFdBUkVcXERFU0NSSVBUSU9OXFxTeXN0ZW0iLCZoa2V5KTsKKyAgICAgICAgLyogVGhpcyB3YXMgYW4gT3BlbiwgYnV0IHNpbmNlIGl0IGlzIGNhbGxlZCBiZWZvcmUgdGhlIHJlYWwgcmVnaXN0cmllcworICAgICAgICAgICBhcmUgbG9hZGVkLCBpdCB3YXMgY2hhbmdlZCB0byBhIENyZWF0ZSAtIE1UQiA5ODA1MDcqLworCVJlZ0NyZWF0ZUtleTE2KEhLRVlfTE9DQUxfTUFDSElORSwiSEFSRFdBUkVcXERFU0NSSVBUSU9OXFxTeXN0ZW0iLCZoa2V5KTsKIAlSZWdTZXRWYWx1ZUV4MzJBKGhrZXksIklkZW50aWZpZXIiLDAsUkVHX1NaLCJTeXN0ZW1UeXBlIFdJTkUiLHN0cmxlbigiU3lzdGVtVHlwZSBXSU5FIikpOwogCVJlZ0Nsb3NlS2V5KGhrZXkpOworCiAJLyogXFxTT0ZUV0FSRVxcTWljcm9zb2Z0XFxXaW5kb3cgTlRcXEN1cnJlbnRWZXJzaW9uCiAJICoJCQkJCQlDdXJyZW50VmVyc2lvbgogCSAqCQkJCQkJQ3VycmVudEJ1aWxkTnVtYmVyCkBAIC0zMTMsNiArNDA3LDggQEAKIAkJUmVnQ2xvc2VLZXkoaGtleSk7CiAJfQogfQorCisKIC8qKioqKioqKioqKioqKioqKioqKioqKiogU0FWRSBSZWdpc3RyeSBGdW5jdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjZGVmaW5lIFJFR0lTVFJZX1NBVkVfVkVSU0lPTgkweDAwMDAwMDAxCkBAIC00NTQsMTQgKzU1MCwyMCBAQAogICAgICAgICByZXR1cm4gVFJVRTsKIH0KIAotdm9pZAotU0hFTExfU2F2ZVJlZ2lzdHJ5KCkgeworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTSEVMTF9TYXZlUmVnaXN0cnkgW0ludGVybmFsXQorICovCit2b2lkIFNIRUxMX1NhdmVSZWdpc3RyeSggdm9pZCApCit7CiAJY2hhcgkqZm47CiAJc3RydWN0CXBhc3N3ZAkqcHdkOwogCWNoYXIJYnVmWzRdOwogCUhLRVkJaGtleTsKIAlpbnQJYWxsOwogCisgICAgVFJBQ0UocmVnLCIodm9pZClcbiIpOworCiAJYWxsPTA7CiAJaWYgKFJlZ09wZW5LZXkxNihIS0VZX0NVUlJFTlRfVVNFUixLRVlfUkVHSVNUUlksJmhrZXkpIT1FUlJPUl9TVUNDRVNTKSB7CiAJCXN0cmNweShidWYsInllcyIpOwpAQCAtNTI0LDExICs2MjYsMTUgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKiBMT0FEIFJlZ2lzdHJ5IEZ1bmN0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyBMUEtFWVNUUlVDVAotX2ZpbmRfb3JfYWRkX2tleShMUEtFWVNUUlVDVCBscGtleSxMUFdTVFIga2V5bmFtZSkgeworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBfZmluZF9vcl9hZGRfa2V5IFtJbnRlcm5hbF0KKyAqLworc3RhdGljIExQS0VZU1RSVUNUIF9maW5kX29yX2FkZF9rZXkoIExQS0VZU1RSVUNUIGxwa2V5LCBMUFdTVFIga2V5bmFtZSApCit7CiAJTFBLRVlTVFJVQ1QJbHB4a2V5LCpscGxwa2V5OwogCi0JaWYgKGtleW5hbWVbMF09PTApIHsKKwlpZiAoKCFrZXluYW1lKSB8fCAoa2V5bmFtZVswXT09MCkpIHsKIAkJZnJlZShrZXluYW1lKTsKIAkJcmV0dXJuIGxwa2V5OwogCX0KQEAgLTY5NSwzMyArODAxLDQ3IEBACiAJcmV0dXJuIHM7CiB9CiAKLXN0YXRpYyBpbnQKLV93aW5lX2xvYWRzdWJrZXkoCi0JRklMRSAqRixMUEtFWVNUUlVDVCBscGtleSxpbnQgbGV2ZWwsY2hhciAqKmJ1ZixpbnQgKmJ1ZmxlbixpbnQgb3B0ZmxhZwotKSB7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIF93aW5lX2xvYWRzdWJrZXkgW0ludGVybmFsXQorICoKKyAqIE5PVEVTCisgKiAgICBJdCBzZWVtcyBsaWtlIHRoaXMgaXMgcmV0dXJuaW5nIGEgYm9vbGVhbi4gIFNob3VsZCBpdD8KKyAqCisgKiBSRVRVUk5TCisgKiAgICBTdWNjZXNzOiAxCisgKiAgICBGYWlsdXJlOiAwCisgKi8KK3N0YXRpYyBpbnQgX3dpbmVfbG9hZHN1YmtleSggRklMRSAqRiwgTFBLRVlTVFJVQ1QgbHBrZXksIGludCBsZXZlbCwgY2hhciAqKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpidWZsZW4sIERXT1JEIG9wdGZsYWcgKQorewogCUxQS0VZU1RSVUNUCWxweGtleTsKIAlpbnQJCWk7CiAJY2hhcgkJKnM7CiAJTFBXU1RSCQluYW1lOwogCi0JbHBrZXktPmZsYWdzIHw9IG9wdGZsYWc7CisgICAgVFJBQ0UocmVnLCIoJXAsJXAsJWQsJXMsJWQsJWx4KVxuIiwgRiwgbHBrZXksIGxldmVsLCBkZWJ1Z3N0cl9hKCpidWYpLAorICAgICAgICAgICpidWZsZW4sIG9wdGZsYWcpOwogCi0JLyogZ29vZC4gd2UgYWxyZWFkeSBnb3QgYSBsaW5lIGhlcmUgLi4uIHNvIHBhcnNlIGl0ICovCi0JbHB4a2V5CT0gTlVMTDsKLQl3aGlsZSAoMSkgewotCQlpPTA7cz0qYnVmOwotCQl3aGlsZSAoKnM9PSdcdCcpIHsKLQkJCXMrKzsKLQkJCWkrKzsKLQkJfQotCQlpZiAoaT5sZXZlbCkgewotCQkJaWYgKGxweGtleT09TlVMTCkgewotCQkJCVdBUk4ocmVnLCJHb3QgYSBzdWJoaWVyYXJjaHkgd2l0aG91dCByZXNwLiBrZXk/XG4iKTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCV93aW5lX2xvYWRzdWJrZXkoRixscHhrZXksbGV2ZWwrMSxidWYsYnVmbGVuLG9wdGZsYWcpOwotCQkJY29udGludWU7Ci0JCX0KKyAgICBscGtleS0+ZmxhZ3MgfD0gb3B0ZmxhZzsKKworICAgIC8qIEdvb2QuICBXZSBhbHJlYWR5IGdvdCBhIGxpbmUgaGVyZSAuLi4gc28gcGFyc2UgaXQgKi8KKyAgICBscHhrZXkgPSBOVUxMOworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGk9MDtzPSpidWY7CisgICAgICAgIHdoaWxlICgqcz09J1x0JykgeworICAgICAgICAgICAgcysrOworICAgICAgICAgICAgaSsrOworICAgICAgICB9CisgICAgICAgIGlmIChpPmxldmVsKSB7CisgICAgICAgICAgICBpZiAobHB4a2V5PT1OVUxMKSB7CisgICAgICAgICAgICAgICAgV0FSTihyZWcsIkdvdCBhIHN1YmhpZXJhcmNoeSB3aXRob3V0IHJlc3AuIGtleT9cbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX3dpbmVfbG9hZHN1YmtleShGLGxweGtleSxsZXZlbCsxLGJ1ZixidWZsZW4sb3B0ZmxhZyk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCiAJCS8qIGxldCB0aGUgY2FsbGVyIGhhbmRsZSB0aGlzIGxpbmUgKi8KIAkJaWYgKGk8bGV2ZWwgfHwgKipidWY9PSdcMCcpCiAJCQlyZXR1cm4gMTsKQEAgLTc4MywxMiArOTAzLDE2IEBACiAJCS8qIHJlYWQgdGhlIG5leHQgbGluZSAqLwogCQlpZiAoIV93aW5lX3JlYWRfbGluZShGLGJ1ZixidWZsZW4pKQogCQkJcmV0dXJuIDE7Ci0JfQotCXJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMTsKIH0KIAotc3RhdGljIGludAotX3dpbmVfbG9hZHN1YnJlZyhGSUxFICpGLExQS0VZU1RSVUNUIGxwa2V5LGludCBvcHRmbGFnKSB7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIF93aW5lX2xvYWRzdWJyZWcgW0ludGVybmFsXQorICovCitzdGF0aWMgaW50IF93aW5lX2xvYWRzdWJyZWcoIEZJTEUgKkYsIExQS0VZU1RSVUNUIGxwa2V5LCBEV09SRCBvcHRmbGFnICkKK3sKIAlpbnQJdmVyOwogCWNoYXIJKmJ1ZjsKIAlpbnQJYnVmbGVuOwpAQCAtODE5LDI3ICs5NDMsMzUgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIHZvaWQKLV93aW5lX2xvYWRyZWcoTFBLRVlTVFJVQ1QgbHBrZXksY2hhciAqZm4saW50IG9wdGZsYWcpIHsKLQlGSUxFCSpGOwogCi0JRj1mb3BlbihmbiwicmIiKTsKLQlpZiAoRj09TlVMTCkgewotCQlXQVJOKHJlZywiQ291bGRuJ3Qgb3BlbiAlcyBmb3IgcmVhZGluZzogJXNcbiIsCi0JCSAgICAgICBmbixzdHJlcnJvcihlcnJubykKLQkJKTsKLQkJcmV0dXJuOwotCX0KLQlpZiAoIV93aW5lX2xvYWRzdWJyZWcoRixscGtleSxvcHRmbGFnKSkgewotCQlmY2xvc2UoRik7Ci0JCXVubGluayhmbik7Ci0JCXJldHVybjsKLQl9Ci0JZmNsb3NlKEYpOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogX3dpbmVfbG9hZHJlZyBbSW50ZXJuYWxdCisgKi8KK3N0YXRpYyB2b2lkIF93aW5lX2xvYWRyZWcoIExQS0VZU1RSVUNUIGxwa2V5LCBjaGFyICpmbiwgRFdPUkQgb3B0ZmxhZyApCit7CisgICAgRklMRSAqRjsKKworICAgIFRSQUNFKHJlZywiKCVwLCVzLCVseClcbiIsbHBrZXksZGVidWdzdHJfYShmbiksb3B0ZmxhZyk7CisKKyAgICBGID0gZm9wZW4oZm4sInJiIik7CisgICAgaWYgKEY9PU5VTEwpIHsKKyAgICAgICAgV0FSTihyZWcsIkNvdWxkbid0IG9wZW4gJXMgZm9yIHJlYWRpbmc6ICVzXG4iLGZuLHN0cmVycm9yKGVycm5vKSApOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICghX3dpbmVfbG9hZHN1YnJlZyhGLGxwa2V5LG9wdGZsYWcpKSB7CisgICAgICAgIGZjbG9zZShGKTsKKyAgICAgICAgdW5saW5rKGZuKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmY2xvc2UoRik7CiB9CiAKLXN0YXRpYyB2b2lkCi1fY29weV9yZWdpc3RyeShMUEtFWVNUUlVDVCBmcm9tLExQS0VZU1RSVUNUIHRvKSB7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIF9jb3B5X3JlZ2lzdHJ5IFtJbnRlcm5hbF0KKyAqLworc3RhdGljIHZvaWQgX2NvcHlfcmVnaXN0cnkoIExQS0VZU1RSVUNUIGZyb20sIExQS0VZU1RSVUNUIHRvICkKK3sKIAlMUEtFWVNUUlVDVAlscHhrZXk7CiAJaW50CQlqOwogCUxQS0VZVkFMVUUJdmFsZnJvbTsKQEAgLTg3Miw2ICsxMDA0LDcgQEAKIAl9CiB9CiAKKwogLyogV0lORE9XUyA5NSBSRUdJU1RSWSBMT0FERVIgKi8KIC8qIAogICogU3RydWN0dXJlIG9mIGEgd2luOTUgcmVnaXN0cnkgZGF0YWJhc2UuCkBAIC05OTgsNiArMTEzMSwxMCBAQAogICAgcmV0dXJuIGRlc3Q7CiB9CiAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogX3c5NV9wcm9jZXNzS2V5IFtJbnRlcm5hbF0KKyAqLwogc3RhdGljIExQS0VZU1RSVUNUIF93OTVfcHJvY2Vzc0tleSAoIExQS0VZU1RSVUNUIGxwa2V5LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5yTFMsIGludCBuck1TLCBzdHJ1Y3QgX3c5NV9pbmZvICppbmZvICkKIApAQCAtMTIyMiw2ICsxMzU5LDcgQEAKIAlmcmVlIChpbmZvLnJna25idWZmZXIpOwogfQogCisKIC8qIFdJTkRPV1MgMzEgUkVHSVNUUlkgTE9BREVSLCBzdXBwbGllZCBieSBUb3IgU2r4d2FsbCwgdG9yQHNuLm5vICovCiAKIC8qCkBAIC0xMzU3LDggKzE0OTUsMTEgQEAKIAl9CiB9CiAKLXZvaWQKLV93MzFfbG9hZHJlZygpIHsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogX3czMV9sb2FkcmVnIFtJbnRlcm5hbF0KKyAqLwordm9pZCBfdzMxX2xvYWRyZWcoKSB7CiAJSEZJTEUzMgkJCWhmOwogCXN0cnVjdCBfdzMxX2hlYWRlcgloZWFkOwogCXN0cnVjdCBfdzMxX3RhYmVudAkqdGFiOwpAQCAtMTM3MCw2ICsxNTExLDggQEAKIAlIS0VZCQkJaGtleTsKIAlMUEtFWVNUUlVDVAkJbHBrZXk7CiAKKyAgICBUUkFDRShyZWcsIih2b2lkKVxuIik7CisKIAloZiA9IE9wZW5GaWxlMzIoInJlZy5kYXQiLCZvZnMsT0ZfUkVBRCk7CiAJaWYgKGhmPT1IRklMRV9FUlJPUjMyKQogCQlyZXR1cm47CkBAIC0xNDIyLDcgKzE1NjUsNyBAQAogCX0KIAlsYXN0bW9kaWZpZWQgPSBET1NGU19GaWxlVGltZVRvVW5peFRpbWUoJmhmaW5mby5mdExhc3RXcml0ZVRpbWUsTlVMTCk7CiAKLQlpZiAoUmVnQ3JlYXRlS2V5MTYoSEtFWV9MT0NBTF9NQUNISU5FLCJcXFNPRlRXQVJFXFxDbGFzc2VzIiwmaGtleSkhPUVSUk9SX1NVQ0NFU1MpCisJaWYgKFJlZ0NyZWF0ZUtleTE2KEhLRVlfTE9DQUxfTUFDSElORSwiU09GVFdBUkVcXENsYXNzZXMiLCZoa2V5KSE9RVJST1JfU1VDQ0VTUykKIAkJcmV0dXJuOwogCWxwa2V5ID0gbG9va3VwX2hrZXkoaGtleSk7CiAJX193MzFfZHVtcHRyZWUodGFiWzBdLncxLHR4dCx0YWIsJmhlYWQsbHBrZXksbGFzdG1vZGlmaWVkLDApOwpAQCAtMTQzMiwxMyArMTU3NSwxOCBAQAogCXJldHVybjsKIH0KIAotdm9pZAotU0hFTExfTG9hZFJlZ2lzdHJ5KCkgeworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU0hFTExfTG9hZFJlZ2lzdHJ5IFtJbnRlcm5hbF0KKyAqLwordm9pZCBTSEVMTF9Mb2FkUmVnaXN0cnkoIHZvaWQgKQorewogCWNoYXIJKmZuOwogCXN0cnVjdAlwYXNzd2QJKnB3ZDsKIAlMUEtFWVNUUlVDVAlscGtleTsKIAlIS0VZCQloa2V5OwogCisgICAgVFJBQ0UocmVnLCIodm9pZClcbiIpOwogCiAJaWYgKGtleV9jbGFzc2VzX3Jvb3Q9PU5VTEwpCiAJCVNIRUxMX0luaXQoKTsKQEAgLTE0NTMsNiArMTYwMSw4IEBACiAJLyogdGhlIGdsb2JhbCB1c2VyIGRlZmF1bHQgaXMgbG9hZGVkIHVuZGVyIEhLRVlfVVNFUlNcXC5EZWZhdWx0ICovCiAJUmVnQ3JlYXRlS2V5MTYoSEtFWV9VU0VSUywiLkRlZmF1bHQiLCZoa2V5KTsKIAlscGtleSA9IGxvb2t1cF9oa2V5KGhrZXkpOworICAgICAgICBpZighbHBrZXkpCisgICAgICAgICAgICBXQVJOKHJlZywiQ291bGQgbm90IGNyZWF0ZSBnbG9iYWwgdXNlciBkZWZhdWx0IGtleVxuIik7CiAJX3dpbmVfbG9hZHJlZyhscGtleSxTQVZFX1VTRVJTX0RFRkFVTFQsMCk7CiAKIAkvKiBIS0VZX1VTRVJTXFwuRGVmYXVsdCBpcyBjb3BpZWQgdG8gSEtFWV9DVVJSRU5UX1VTRVIgKi8KQEAgLTE1MTUsMTE0ICsxNjY1LDEyNyBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnT3BlbktleTMyVyAgIC0+IFJlZ09wZW5LZXlFeDMyVyAKICAqLwogCi0vKiBSZWdPcGVuS2V5RXhXCQlbQURWQVBJMzIuMTUwXSAqLwotRFdPUkQgV0lOQVBJIFJlZ09wZW5LZXlFeDMyVygKLQlIS0VZCWhrZXksCi0JTFBDV1NUUglscHN6U3ViS2V5LAotCURXT1JECWR3UmVzZXJ2ZWQsCi0JUkVHU0FNCXNhbURlc2lyZWQsCi0JTFBIS0VZCXJldGtleQotKSB7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJlZ09wZW5LZXlFeDMyVyBbQURWQVBJMzIuMTUwXQorICogT3BlbnMgdGhlIHNwZWNpZmllZCBrZXkKKyAqCisgKiBVbmxpa2UgUmVnQ3JlYXRlS2V5RXgsIHRoaXMgZG9lcyBub3QgY3JlYXRlIHRoZSBrZXkgaWYgaXQgZG9lcyBub3QgZXhpc3QuCisgKgorICogUEFSQU1TCisgKiAgICBoa2V5ICAgICAgIFtJXSBIYW5kbGUgb2Ygb3BlbiBrZXkKKyAqICAgIGxwc3pTdWJLZXkgW0ldIE5hbWUgb2Ygc3Via2V5IHRvIG9wZW4KKyAqICAgIGR3UmVzZXJ2ZWQgW0ldIFJlc2VydmVkIC0gbXVzdCBiZSB6ZXJvCisgKiAgICBzYW1EZXNpcmVkIFtJXSBTZWN1cml0eSBhY2Nlc3MgbWFzaworICogICAgcmV0a2V5ICAgICBbT10gQWRkcmVzcyBvZiBoYW5kbGUgb2Ygb3BlbiBrZXkKKyAqCisgKiBSRVRVUk5TCisgKiAgICBTdWNjZXNzOiBFUlJPUl9TVUNDRVNTCisgKiAgICBGYWlsdXJlOiBFcnJvciBjb2RlCisgKi8KK0RXT1JEIFdJTkFQSSBSZWdPcGVuS2V5RXgzMlcoIEhLRVkgaGtleSwgTFBDV1NUUiBscHN6U3ViS2V5LCBEV09SRCBkd1Jlc2VydmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHU0FNIHNhbURlc2lyZWQsIExQSEtFWSByZXRrZXkgKQorewogCUxQS0VZU1RSVUNUCWxwTmV4dEtleSxscHhrZXk7CiAJTFBXU1RSCQkqd3BzOwogCWludAkJd3BjLGk7Ci0JVFJBQ0UocmVnLCIoJWx4LCVzLCVsZCwlbHgsJXApXG4iLAotCQkoTE9ORyloa2V5LFcyQyhscHN6U3ViS2V5LDApLGR3UmVzZXJ2ZWQsc2FtRGVzaXJlZCxyZXRrZXkKLQkpOwogCi0JbHBOZXh0S2V5CT0gbG9va3VwX2hrZXkoaGtleSk7Ci0JaWYgKCFscE5leHRLZXkpCi0JCXJldHVybiBTSEVMTF9FUlJPUl9CQURLRVk7Ci0JaWYgKCFscHN6U3ViS2V5IHx8ICEqbHBzelN1YktleSkgewotCQlhZGRfaGFuZGxlKCsrY3VycmVudGhhbmRsZSxscE5leHRLZXksc2FtRGVzaXJlZCk7Ci0JCSpyZXRrZXk9Y3VycmVudGhhbmRsZTsKLQkJcmV0dXJuIFNIRUxMX0VSUk9SX1NVQ0NFU1M7Ci0JfQorICAgIFRSQUNFKHJlZywiKCV4LCVzLCVsZCwlbHgsJXApXG4iLCBoa2V5LGRlYnVnc3RyX3cobHBzelN1YktleSksZHdSZXNlcnZlZCwKKyAgICAgICAgICBzYW1EZXNpcmVkLHJldGtleSk7CisKKyAgICBscE5leHRLZXkgPSBsb29rdXBfaGtleShoa2V5KTsKKyAgICBpZiAoIWxwTmV4dEtleSkgeworICAgICAgICBXQVJOKHJlZywiSW52YWxpZCBoYW5kbGU6ICV4XG4iLGhrZXkpOworICAgICAgICByZXR1cm4gRVJST1JfSU5WQUxJRF9IQU5ETEU7CisgICAgfQorCisgICAgaWYgKCFscHN6U3ViS2V5IHx8ICEqbHBzelN1YktleSkgeworICAgICAgICAvKiBFaXRoZXIgTlVMTCBvciBwb2ludGVyIHRvIGVtcHR5IHN0cmluZywgc28gcmV0dXJuIGEgbmV3IGhhbmRsZQorICAgICAgICAgICB0byB0aGUgb3JpZ2luYWwgaGtleSAqLworICAgICAgICBhZGRfaGFuZGxlKCsrY3VycmVudGhhbmRsZSxscE5leHRLZXksc2FtRGVzaXJlZCk7CisgICAgICAgICpyZXRrZXk9Y3VycmVudGhhbmRsZTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX1NVQ0NFU1M7CisgICAgfQorCiAJc3BsaXRfa2V5cGF0aChscHN6U3ViS2V5LCZ3cHMsJndwYyk7Ci0JaSAJPSAwOworCWkgPSAwOwogCXdoaWxlICgoaTx3cGMpICYmICh3cHNbaV1bMF09PSdcMCcpKSBpKys7Ci0JbHB4a2V5CT0gbHBOZXh0S2V5OwotCXdoaWxlICh3cHNbaV0pIHsKLQkJbHB4a2V5PWxwTmV4dEtleS0+bmV4dHN1YjsKLQkJd2hpbGUgKGxweGtleSkgewotCQkJaWYgKCFsc3RyY21waTMyVyh3cHNbaV0sbHB4a2V5LT5rZXluYW1lKSkKLQkJCQlicmVhazsKLQkJCWxweGtleT1scHhrZXktPm5leHQ7Ci0JCX0KLQkJaWYgKCFscHhrZXkpIHsKLQkJCUZSRUVfS0VZX1BBVEg7Ci0JCQlyZXR1cm4gU0hFTExfRVJST1JfQkFES0VZOwotCQl9Ci0JCWkrKzsKLQkJbHBOZXh0S2V5CT0gbHB4a2V5OwotCX0KLQlhZGRfaGFuZGxlKCsrY3VycmVudGhhbmRsZSxscHhrZXksc2FtRGVzaXJlZCk7Ci0JKnJldGtleQk9IGN1cnJlbnRoYW5kbGU7Ci0JRlJFRV9LRVlfUEFUSDsKLQlyZXR1cm4JU0hFTExfRVJST1JfU1VDQ0VTUzsKLX0KKwlscHhrZXkgPSBscE5leHRLZXk7CiAKLS8qIFJlZ09wZW5LZXlXCQkJW0FEVkFQSTMyLjE1MV0gKi8KLURXT1JEIFdJTkFQSSBSZWdPcGVuS2V5MzJXKAotCUhLRVkJaGtleSwKLQlMUENXU1RSCWxwc3pTdWJLZXksCi0JTFBIS0VZCXJldGtleQotKSB7Ci0JVFJBQ0UocmVnLCIoJWx4LCVzLCVwKVxuIiwKLQkJKExPTkcpaGtleSxXMkMobHBzelN1YktleSwwKSxyZXRrZXkKLQkpOwotCXJldHVybiBSZWdPcGVuS2V5RXgzMlcoaGtleSxscHN6U3ViS2V5LDAsS0VZX0FMTF9BQ0NFU1MscmV0a2V5KTsKKyAgICB3aGlsZSAod3BzW2ldKSB7CisgICAgICAgIGxweGtleT1scE5leHRLZXktPm5leHRzdWI7CisgICAgICAgIHdoaWxlIChscHhrZXkpIHsKKyAgICAgICAgICAgIGlmICghbHN0cmNtcGkzMlcod3BzW2ldLGxweGtleS0+a2V5bmFtZSkpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxweGtleT1scHhrZXktPm5leHQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWxweGtleSkgeworICAgICAgICAgICAgVFJBQ0UocmVnLCJDb3VsZCBub3QgZmluZCBzdWJrZXkgJXNcbiIsZGVidWdzdHJfdyh3cHNbaV0pKTsKKyAgICAgICAgICAgIEZSRUVfS0VZX1BBVEg7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfQkFES0VZOworICAgICAgICB9CisgICAgICAgIGkrKzsKKyAgICAgICAgbHBOZXh0S2V5ID0gbHB4a2V5OworICAgIH0KKworICAgIGFkZF9oYW5kbGUoKytjdXJyZW50aGFuZGxlLGxweGtleSxzYW1EZXNpcmVkKTsKKyAgICAqcmV0a2V5ID0gY3VycmVudGhhbmRsZTsKKyAgICBUUkFDRShyZWcsIiAgUmV0dXJuaW5nICV4XG4iLCBjdXJyZW50aGFuZGxlKTsKKyAgICBGUkVFX0tFWV9QQVRIOworICAgIHJldHVybiBFUlJPUl9TVUNDRVNTOwogfQogCiAKLS8qIFJlZ09wZW5LZXlFeEEJCVtBRFZBUEkzMi4xNDldICovCi1EV09SRCBXSU5BUEkgUmVnT3BlbktleUV4MzJBKAotCUhLRVkJaGtleSwKLQlMUENTVFIJbHBzelN1YktleSwKLQlEV09SRAlkd1Jlc2VydmVkLAotCVJFR1NBTQlzYW1EZXNpcmVkLAotCUxQSEtFWQlyZXRrZXkKLSkgewotCUxQV1NUUglscHN6U3ViS2V5VzsKLQlEV09SRAlyZXQ7Ci0KLQlUUkFDRShyZWcsIiglbHgsJXMsJWxkLCVseCwlcClcbiIsCi0JCShMT05HKWhrZXksbHBzelN1YktleSxkd1Jlc2VydmVkLHNhbURlc2lyZWQscmV0a2V5Ci0JKTsKLQlpZiAobHBzelN1YktleSkKLQkJbHBzelN1YktleVc9c3RyZHVwQTJXKGxwc3pTdWJLZXkpOwotCWVsc2UKLQkJbHBzelN1YktleVc9TlVMTDsKLQlyZXQ9UmVnT3BlbktleUV4MzJXKGhrZXksbHBzelN1YktleVcsZHdSZXNlcnZlZCxzYW1EZXNpcmVkLHJldGtleSk7Ci0JaWYgKGxwc3pTdWJLZXlXKQotCQlmcmVlKGxwc3pTdWJLZXlXKTsKLQlyZXR1cm4gcmV0OworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmVnT3BlbktleTMyVyBbQURWQVBJMzIuMTUxXQorICovCitEV09SRCBXSU5BUEkgUmVnT3BlbktleTMyVyggSEtFWSBoa2V5LCBMUENXU1RSIGxwc3pTdWJLZXksIExQSEtFWSByZXRrZXkgKQoreworICAgIFRSQUNFKHJlZywiKCV4LCVzLCVwKVxuIixoa2V5LGRlYnVnc3RyX3cobHBzelN1YktleSkscmV0a2V5KTsKKyAgICByZXR1cm4gUmVnT3BlbktleUV4MzJXKGhrZXksbHBzelN1YktleSwwLEtFWV9BTExfQUNDRVNTLHJldGtleSk7CiB9CiAKLS8qIFJlZ09wZW5LZXlBCQkJW0FEVkFQSTMyLjE0OF0gKi8KLURXT1JEIFdJTkFQSSBSZWdPcGVuS2V5MzJBKAotCUhLRVkJaGtleSwKLQlMUENTVFIJbHBzelN1YktleSwKLQlMUEhLRVkJcmV0a2V5Ci0pIHsKLQlUUkFDRShyZWcsIiglbHgsJXMsJXApXG4iLAotCQkoTE9ORyloa2V5LGxwc3pTdWJLZXkscmV0a2V5Ci0JKTsKLQlyZXR1cm4JUmVnT3BlbktleUV4MzJBKGhrZXksbHBzelN1YktleSwwLEtFWV9BTExfQUNDRVNTLHJldGtleSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJlZ09wZW5LZXlFeDMyQSBbQURWQVBJMzIuMTQ5XQorICovCitEV09SRCBXSU5BUEkgUmVnT3BlbktleUV4MzJBKCBIS0VZIGhrZXksIExQQ1NUUiBscHN6U3ViS2V5LCBEV09SRCBkd1Jlc2VydmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHU0FNIHNhbURlc2lyZWQsIExQSEtFWSByZXRrZXkgKQoreworICAgIExQV1NUUiBscHN6U3ViS2V5VyA9IEhFQVBfc3RyZHVwQXRvVyhHZXRQcm9jZXNzSGVhcCgpLDAsbHBzelN1YktleSk7CisgICAgRFdPUkQgcmV0OworCisgICAgVFJBQ0UocmVnLCIoJXgsJXMsJWxkLCVseCwlcClcbiIsaGtleSxkZWJ1Z3N0cl9hKGxwc3pTdWJLZXkpLGR3UmVzZXJ2ZWQsCisgICAgICAgICAgc2FtRGVzaXJlZCxyZXRrZXkpOworCisgICAgcmV0ID0gUmVnT3BlbktleUV4MzJXKGhrZXksbHBzelN1YktleVcsZHdSZXNlcnZlZCxzYW1EZXNpcmVkLHJldGtleSk7CisgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLGxwc3pTdWJLZXlXKTsKKyAgICByZXR1cm4gcmV0OwogfQogCi0vKiBSZWdPcGVuS2V5CQkJW1NIRUxMLjFdIFtLRVJORUwuMjE3XSAqLwotRFdPUkQgV0lOQVBJIFJlZ09wZW5LZXkxNigKLQlIS0VZCWhrZXksCi0JTFBDU1RSCWxwc3pTdWJLZXksCi0JTFBIS0VZCXJldGtleQotKSB7Ci0JVFJBQ0UocmVnLCIoJWx4LCVzLCVwKVxuIiwKLQkJKExPTkcpaGtleSxscHN6U3ViS2V5LHJldGtleQotCSk7Ci0JcmV0dXJuIFJlZ09wZW5LZXkzMkEoaGtleSxscHN6U3ViS2V5LHJldGtleSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJlZ09wZW5LZXkzMkEgW0FEVkFQSTMyLjE0OF0KKyAqLworRFdPUkQgV0lOQVBJIFJlZ09wZW5LZXkzMkEoIEhLRVkgaGtleSwgTFBDU1RSIGxwc3pTdWJLZXksIExQSEtFWSByZXRrZXkgKQoreworICAgIFRSQUNFKHJlZywiKCV4LCVzLCVwKVxuIixoa2V5LGRlYnVnc3RyX2EobHBzelN1YktleSkscmV0a2V5KTsKKyAgICByZXR1cm4gUmVnT3BlbktleUV4MzJBKGhrZXksbHBzelN1YktleSwwLEtFWV9BTExfQUNDRVNTLHJldGtleSk7CiB9CiAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmVnT3BlbktleTE2IFtTSEVMTC4xXSBbS0VSTkVMLjIxN10KKyAqLworRFdPUkQgV0lOQVBJIFJlZ09wZW5LZXkxNiggSEtFWSBoa2V5LCBMUENTVFIgbHBzelN1YktleSwgTFBIS0VZIHJldGtleSApCit7CisgICAgVFJBQ0UocmVnLCIoJXgsJXMsJXApXG4iLGhrZXksZGVidWdzdHJfYShscHN6U3ViS2V5KSxyZXRrZXkpOworICAgIHJldHVybiBSZWdPcGVuS2V5MzJBKGhrZXksbHBzelN1YktleSxyZXRrZXkpOworfQorCisKIC8qIAogICogQ3JlYXRlIGtleXMKICAqIApAQCAtMTYzNiw0NCArMTc5OSw0OCBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ0NyZWF0ZUtleTMyVyAgIC0+IFJlZ0NyZWF0ZUtleUV4MzJXCiAgKi8KIAotLyogUmVnQ3JlYXRlS2V5RXhXCQlbQURWQVBJMzIuMTMxXSAqLwotRFdPUkQgV0lOQVBJIFJlZ0NyZWF0ZUtleUV4MzJXKAotCUhLRVkJaGtleSwKLQlMUENXU1RSCWxwc3pTdWJLZXksCi0JRFdPUkQJZHdSZXNlcnZlZCwKLQlMUFdTVFIJbHBzekNsYXNzLAotCURXT1JECWZkd09wdGlvbnMsCi0JUkVHU0FNCXNhbURlc2lyZWQsCi0JTFBTRUNVUklUWV9BVFRSSUJVVEVTIGxwU2VjQXR0cmlicywKLQlMUEhLRVkJcmV0a2V5LAotCUxQRFdPUkQJbHBEaXNwb3MKLSkgeworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSZWdDcmVhdGVLZXlFeDMyVyBbQURWQVBJMzIuMTMxXQorICoKKyAqIFBBUkFNUworICogICAgLi4uCisgKiAgICByZXRrZXkgICBbT10gQWRkcmVzcyBvZiBidWZmZXIgZm9yIG9wZW5lZCBoYW5kbGUKKyAqICAgIGxwRGlzcG9zIFtPXSBSZWNlaXZlcyBSRUdfQ1JFQVRFRF9ORVdfS0VZIG9yIFJFR19PUEVORURfRVhJU1RJTkdfS0VZCisgKi8KK0RXT1JEIFdJTkFQSSBSZWdDcmVhdGVLZXlFeDMyVyggSEtFWSBoa2V5LCBMUENXU1RSIGxwc3pTdWJLZXksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd1Jlc2VydmVkLCBMUFdTVFIgbHBzekNsYXNzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZmR3T3B0aW9ucywgUkVHU0FNIHNhbURlc2lyZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQU0VDVVJJVFlfQVRUUklCVVRFUyBscFNlY0F0dHJpYnMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEhLRVkgcmV0a2V5LCBMUERXT1JEIGxwRGlzcG9zICkKK3sKIAlMUEtFWVNUUlVDVAkqbHBscFByZXZLZXksbHBOZXh0S2V5LGxweGtleTsKIAlMUFdTVFIJCSp3cHM7CiAJaW50CQl3cGMsaTsKIAotLypGSVhNRTogaGFuZGxlIHNlY3VyaXR5L2FjY2Vzcy93aGF0ZXZlciAqLwotCVRSQUNFKHJlZywiKCVseCwlcywlbGQsJXMsJWx4LCVseCwlcCwlcCwlcClcbiIsCi0JCShMT05HKWhrZXksCi0JCVcyQyhscHN6U3ViS2V5LDApLAotCQlkd1Jlc2VydmVkLAotCQlXMkMobHBzekNsYXNzLDEpLAotCQlmZHdPcHRpb25zLAotCQlzYW1EZXNpcmVkLAotCQlscFNlY0F0dHJpYnMsCi0JCXJldGtleSwKLQkJbHBEaXNwb3MKLQkpOworICAgIC8qRklYTUU6IGhhbmRsZSBzZWN1cml0eS9hY2Nlc3Mvd2hhdGV2ZXIgKi8KIAotCWxwTmV4dEtleQk9IGxvb2t1cF9oa2V5KGhrZXkpOwotCWlmICghbHBOZXh0S2V5KQotCQlyZXR1cm4gU0hFTExfRVJST1JfQkFES0VZOworICAgIFRSQUNFKHJlZywiKCV4LCVzLCVsZCwlcywlbHgsJWx4LCVwLCVwLCVwKVxuIiwgaGtleSwKKwkJZGVidWdzdHJfdyhscHN6U3ViS2V5KSwgZHdSZXNlcnZlZCwgZGVidWdzdHJfdyhscHN6Q2xhc3MpLAorCQlmZHdPcHRpb25zLCBzYW1EZXNpcmVkLCBscFNlY0F0dHJpYnMsIHJldGtleSwgbHBEaXNwb3MpOworCisgICAgbHBOZXh0S2V5ID0gbG9va3VwX2hrZXkoaGtleSk7CisgICAgaWYgKCFscE5leHRLZXkpCisgICAgICAgIHJldHVybiBFUlJPUl9CQURLRVk7CisKKyAgICBpZiAobHBzelN1YktleVswXSA9PSAnXFwnKSB7CisgICAgICAgIFdBUk4ocmVnLCJTdWJrZXkgJXMgbXVzdCBub3QgYmVnaW4gd2l0aCBiYWNrc2xhc2guXG4iLGRlYnVnc3RyX3cobHBzelN1YktleSkpOworICAgICAgICByZXR1cm4gRVJST1JfQkFEX1BBVEhOQU1FOworICAgIH0KKwogCWlmICghbHBzelN1YktleSB8fCAhKmxwc3pTdWJLZXkpIHsKIAkJYWRkX2hhbmRsZSgrK2N1cnJlbnRoYW5kbGUsbHBOZXh0S2V5LHNhbURlc2lyZWQpOwogCQkqcmV0a2V5PWN1cnJlbnRoYW5kbGU7CisgICAgICAgICAgICAgICAgVFJBQ0UocmVnLCAiUmV0dXJuaW5nICV4XG4iLCBjdXJyZW50aGFuZGxlKTsKIAkJbHBOZXh0S2V5LT5mbGFnc3w9UkVHX09QVElPTl9UQUlOVEVEOwotCQlyZXR1cm4gU0hFTExfRVJST1JfU1VDQ0VTUzsKKwkJcmV0dXJuIEVSUk9SX1NVQ0NFU1M7CiAJfQorCiAJc3BsaXRfa2V5cGF0aChscHN6U3ViS2V5LCZ3cHMsJndwYyk7CiAJaSAJPSAwOwogCXdoaWxlICgoaTx3cGMpICYmICh3cHNbaV1bMF09PSdcMCcpKSBpKys7CkBAIC0xNjk0LDEyICsxODYxLDE0IEBACiAJCWFkZF9oYW5kbGUoKytjdXJyZW50aGFuZGxlLGxweGtleSxzYW1EZXNpcmVkKTsKIAkJbHB4a2V5LT5mbGFncyAgfD0gUkVHX09QVElPTl9UQUlOVEVEOwogCQkqcmV0a2V5CQk9IGN1cnJlbnRoYW5kbGU7CisgICAgICAgICAgICAgICAgVFJBQ0UocmVnLCAiUmV0dXJuaW5nICV4XG4iLCBjdXJyZW50aGFuZGxlKTsKIAkJaWYgKGxwRGlzcG9zKQogCQkJKmxwRGlzcG9zCT0gUkVHX09QRU5FRF9FWElTVElOR19LRVk7CiAJCUZSRUVfS0VZX1BBVEg7Ci0JCXJldHVybglTSEVMTF9FUlJPUl9TVUNDRVNTOworCQlyZXR1cm4gRVJST1JfU1VDQ0VTUzsKIAl9Ci0JLyogZ29vZC4gbm93IHRoZSBoYXJkIHBhcnQgKi8KKworCS8qIEdvb2QuICBOb3cgdGhlIGhhcmQgcGFydCAqLwogCXdoaWxlICh3cHNbaV0pIHsKIAkJbHBscFByZXZLZXkJPSAmKGxwTmV4dEtleS0+bmV4dHN1Yik7CiAJCWxweGtleQkJPSAqbHBscFByZXZLZXk7CkBAIC0xNzEwLDkgKzE4NzksMTEgQEAKIAkJKmxwbHBQcmV2S2V5PW1hbGxvYyhzaXplb2YoS0VZU1RSVUNUKSk7CiAJCWlmICghKmxwbHBQcmV2S2V5KSB7CiAJCQlGUkVFX0tFWV9QQVRIOwotCQkJcmV0dXJuIFNIRUxMX0VSUk9SX09VVE9GTUVNT1JZOworICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0UocmVnLCAiUmV0dXJuaW5nIE9VVE9GTUVNT1JZXG4iKTsKKwkJCXJldHVybiBFUlJPUl9PVVRPRk1FTU9SWTsKIAkJfQogCQltZW1zZXQoKmxwbHBQcmV2S2V5LCdcMCcsc2l6ZW9mKEtFWVNUUlVDVCkpOworICAgICAgICAgICAgICAgIFRSQUNFKHJlZywiQWRkaW5nICVzXG4iLCBkZWJ1Z3N0cl93KHdwc1tpXSkpOwogCQkoKmxwbHBQcmV2S2V5KS0+a2V5bmFtZQk9IHN0cmR1cFcod3BzW2ldKTsKIAkJKCpscGxwUHJldktleSktPm5leHQJPSBOVUxMOwogCQkoKmxwbHBQcmV2S2V5KS0+bmV4dHN1Ygk9IE5VTEw7CkBAIC0xNzM1LDEwMCArMTkwNiw3OCBAQAogCWVsc2UKIAkJbHBOZXh0S2V5LT5jbGFzcyA9IE5VTEw7CiAJKnJldGtleQkJPSBjdXJyZW50aGFuZGxlOworICAgICAgICBUUkFDRShyZWcsICJSZXR1cm5pbmcgJXhcbiIsIGN1cnJlbnRoYW5kbGUpOwogCWlmIChscERpc3BvcykKIAkJKmxwRGlzcG9zCT0gUkVHX0NSRUFURURfTkVXX0tFWTsKIAlGUkVFX0tFWV9QQVRIOwotCXJldHVybiBTSEVMTF9FUlJPUl9TVUNDRVNTOworCXJldHVybiBFUlJPUl9TVUNDRVNTOwogfQogCi0vKiBSZWdDcmVhdGVLZXlXCQlbQURWQVBJMzIuMTMyXSAqLwotRFdPUkQgV0lOQVBJIFJlZ0NyZWF0ZUtleTMyVygKLQlIS0VZCWhrZXksCi0JTFBDV1NUUglscHN6U3ViS2V5LAotCUxQSEtFWQlyZXRrZXkKLSkgewotCURXT1JECWp1bmsscmV0OwogCi0JVFJBQ0UocmVnLCIoJWx4LCVzLCVwKVxuIiwKLQkJKExPTkcpaGtleSxXMkMobHBzelN1YktleSwwKSxyZXRrZXkKLQkpOwotCXJldD1SZWdDcmVhdGVLZXlFeDMyVygKLQkJaGtleSwJCS8qIGtleSBoYW5kbGUgKi8KLQkJbHBzelN1YktleSwJLyogc3Via2V5IG5hbWUgKi8KLQkJMCwJCS8qIHJlc2VydmVkID0gMCAqLwotCQlOVUxMLAkJLyogbHBzekNsYXNzPyBGSVhNRTogPyAqLwotCQlSRUdfT1BUSU9OX05PTl9WT0xBVElMRSwJLyogb3B0aW9ucyAqLwotCQlLRVlfQUxMX0FDQ0VTUywJLyogZGVzaXJlZCBhY2Nlc3MgYXR0cmlicyAqLwotCQlOVUxMLAkJLyogbHBzZWN1cml0eSBhdHRyaWJ1dGVzICovCi0JCXJldGtleSwJCS8qIGxwcmV0a2V5ICovCi0JCSZqdW5rCQkvKiBkaXNwb3NpdGlvbiB2YWx1ZSAqLwotCSk7Ci0JcmV0dXJuCXJldDsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJlZ0NyZWF0ZUtleTMyVyBbQURWQVBJMzIuMTMyXQorICovCitEV09SRCBXSU5BUEkgUmVnQ3JlYXRlS2V5MzJXKCBIS0VZIGhrZXksIExQQ1dTVFIgbHBzelN1YktleSwgTFBIS0VZIHJldGtleSApCit7CisgICAgRFdPUkQganVuazsKKworICAgIFRSQUNFKHJlZywiKCV4LCVzLCVwKVxuIiwgaGtleSxkZWJ1Z3N0cl93KGxwc3pTdWJLZXkpLHJldGtleSk7CisgICAgcmV0dXJuIFJlZ0NyZWF0ZUtleUV4MzJXKCBoa2V5LCBscHN6U3ViS2V5LCAwLCBOVUxMLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PUFRJT05fTk9OX1ZPTEFUSUxFLCBLRVlfQUxMX0FDQ0VTUyxOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0a2V5LCAmanVuayk7CiB9CiAKLS8qIFJlZ0NyZWF0ZUtleUV4QQkJW0FEVkFQSTMyLjEzMF0gKi8KLURXT1JEIFdJTkFQSSBSZWdDcmVhdGVLZXlFeDMyQSgKLQlIS0VZCWhrZXksCi0JTFBDU1RSCWxwc3pTdWJLZXksCi0JRFdPUkQJZHdSZXNlcnZlZCwKLQlMUFNUUglscHN6Q2xhc3MsCi0JRFdPUkQJZmR3T3B0aW9ucywKLQlSRUdTQU0Jc2FtRGVzaXJlZCwKLQlMUFNFQ1VSSVRZX0FUVFJJQlVURVMgbHBTZWNBdHRyaWJzLAotCUxQSEtFWQlyZXRrZXksCi0JTFBEV09SRAlscERpc3BvcwotKSB7Ci0JTFBXU1RSCWxwc3pTdWJLZXlXLGxwc3pDbGFzc1c7Ci0JRFdPUkQJcmV0OwogCi0JVFJBQ0UocmVnLCIoJWx4LCVzLCVsZCwlcywlbHgsJWx4LCVwLCVwLCVwKVxuIiwKLQkJKExPTkcpaGtleSwKLQkJbHBzelN1YktleSwKLQkJZHdSZXNlcnZlZCwKLQkJbHBzekNsYXNzLAotCQlmZHdPcHRpb25zLAotCQlzYW1EZXNpcmVkLAotCQlscFNlY0F0dHJpYnMsCi0JCXJldGtleSwKLQkJbHBEaXNwb3MKLQkpOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmVnQ3JlYXRlS2V5RXgzMkEgW0FEVkFQSTMyLjEzMF0KKyAqLworRFdPUkQgV0lOQVBJIFJlZ0NyZWF0ZUtleUV4MzJBKCBIS0VZIGhrZXksIExQQ1NUUiBscHN6U3ViS2V5LCBEV09SRCBkd1Jlc2VydmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFNUUiBscHN6Q2xhc3MsIERXT1JEIGZkd09wdGlvbnMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdTQU0gc2FtRGVzaXJlZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQU0VDVVJJVFlfQVRUUklCVVRFUyBscFNlY0F0dHJpYnMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEhLRVkgcmV0a2V5LCBMUERXT1JEIGxwRGlzcG9zICkKK3sKKyAgICBMUFdTVFIgbHBzelN1YktleVcsIGxwc3pDbGFzc1c7CisgICAgRFdPUkQgIHJldDsKKworICAgIFRSQUNFKHJlZywiKCV4LCVzLCVsZCwlcywlbHgsJWx4LCVwLCVwLCVwKVxuIixoa2V5LGRlYnVnc3RyX2EobHBzelN1YktleSksCisgICAgICAgICAgZHdSZXNlcnZlZCxkZWJ1Z3N0cl9hKGxwc3pDbGFzcyksZmR3T3B0aW9ucyxzYW1EZXNpcmVkLGxwU2VjQXR0cmlicywKKyAgICAgICAgICByZXRrZXksbHBEaXNwb3MpOworCisgICAgbHBzelN1YktleVcgPSBIRUFQX3N0cmR1cEF0b1coR2V0UHJvY2Vzc0hlYXAoKSwwLGxwc3pTdWJLZXkpOworLyoKIAlpZiAobHBzelN1YktleSkKIAkJbHBzelN1YktleVc9c3RyZHVwQTJXKGxwc3pTdWJLZXkpOwogCWVsc2UKIAkJbHBzelN1YktleVc9TlVMTDsKKyovCiAJaWYgKGxwc3pDbGFzcykKIAkJbHBzekNsYXNzVz1zdHJkdXBBMlcobHBzekNsYXNzKTsKIAllbHNlCiAJCWxwc3pDbGFzc1c9TlVMTDsKLQlyZXQ9UmVnQ3JlYXRlS2V5RXgzMlcoCi0JCWhrZXksCi0JCWxwc3pTdWJLZXlXLAotCQlkd1Jlc2VydmVkLAotCQlscHN6Q2xhc3NXLAotCQlmZHdPcHRpb25zLAotCQlzYW1EZXNpcmVkLAotCQlscFNlY0F0dHJpYnMsCi0JCXJldGtleSwKLQkJbHBEaXNwb3MKLQkpOworICAgIHJldCA9IFJlZ0NyZWF0ZUtleUV4MzJXKCBoa2V5LCBscHN6U3ViS2V5VywgZHdSZXNlcnZlZCwgbHBzekNsYXNzVywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkd09wdGlvbnMsIHNhbURlc2lyZWQsIGxwU2VjQXR0cmlicywgcmV0a2V5LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBEaXNwb3MgKTsKKyAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsbHBzelN1YktleVcpOworLyoKIAlpZiAobHBzelN1YktleVcpCiAJCWZyZWUobHBzelN1YktleVcpOworKi8KIAlpZiAobHBzekNsYXNzVykKIAkJZnJlZShscHN6Q2xhc3NXKTsKLQlyZXR1cm4gcmV0OworICAgIHJldHVybiByZXQ7CiB9CiAKLS8qIFJlZ0NyZWF0ZUtleUEJCVtBRFZBUEkzMi4xMjldICovCi1EV09SRCBXSU5BUEkgUmVnQ3JlYXRlS2V5MzJBKAotCUhLRVkJaGtleSwKLQlMUENTVFIJbHBzelN1YktleSwKLQlMUEhLRVkJcmV0a2V5Ci0pIHsKLQlEV09SRAlqdW5rOwogCi0JVFJBQ0UocmVnLCIoJWx4LCVzLCVwKVxuIiwKLQkJKExPTkcpaGtleSxscHN6U3ViS2V5LHJldGtleQotCSk7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSZWdDcmVhdGVLZXkzMkEgW0FEVkFQSTMyLjEyOV0KKyAqLworRFdPUkQgV0lOQVBJIFJlZ0NyZWF0ZUtleTMyQSggSEtFWSBoa2V5LCBMUENTVFIgbHBzelN1YktleSwgTFBIS0VZIHJldGtleSApCit7CisgICAgRFdPUkQganVuazsKKworICAgIFRSQUNFKHJlZywiKCV4LCVzLCVwKVxuIixoa2V5LGRlYnVnc3RyX2EobHBzelN1YktleSkscmV0a2V5KTsKKwogCXJldHVybglSZWdDcmVhdGVLZXlFeDMyQSgKIAkJaGtleSwJCS8qIGtleSBoYW5kbGUgKi8KIAkJbHBzelN1YktleSwJLyogc3Via2V5IG5hbWUgKi8KQEAgLTE4NDIsMTggKzE5OTEsMTcgQEAKIAkpOwogfQogCi0vKiBSZWdDcmVhdGVLZXkJCQlbU0hFTEwuMl0gW0tFUk5FTC4yMThdICovCi1EV09SRCBXSU5BUEkgUmVnQ3JlYXRlS2V5MTYoCi0JSEtFWQloa2V5LAotCUxQQ1NUUglscHN6U3ViS2V5LAotCUxQSEtFWQlyZXRrZXkKLSkgewotCVRSQUNFKHJlZywiKCVseCwlcywlcClcbiIsCi0JCShMT05HKWhrZXksbHBzelN1YktleSxyZXRrZXkKLQkpOwotCXJldHVybiBSZWdDcmVhdGVLZXkzMkEoaGtleSxscHN6U3ViS2V5LHJldGtleSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJlZ0NyZWF0ZUtleTE2IFtTSEVMTC4yXSBbS0VSTkVMLjIxOF0KKyAqLworRFdPUkQgV0lOQVBJIFJlZ0NyZWF0ZUtleTE2KCBIS0VZIGhrZXksIExQQ1NUUiBscHN6U3ViS2V5LCBMUEhLRVkgcmV0a2V5ICkKK3sKKyAgICBUUkFDRShyZWcsIigleCwlcywlcClcbiIsaGtleSxkZWJ1Z3N0cl9hKGxwc3pTdWJLZXkpLHJldGtleSk7CisgICAgcmV0dXJuIFJlZ0NyZWF0ZUtleTMyQSggaGtleSwgbHBzelN1YktleSwgcmV0a2V5ICk7CiB9CiAKKwogLyogCiAgKiBRdWVyeSBWYWx1ZSBGdW5jdGlvbnMKICAqIFdpbjMyIGRpZmZlcnMgYmV0d2VlbiBrZXluYW1lcyBhbmQgdmFsdWVuYW1lcy4gCkBAIC0xODY2LDgxICsyMDE0LDE0MCBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdRdWVyeVZhbHVlMzJXIC0+IFJlZ1F1ZXJ5VmFsdWVFeDMyVwogICovCiAKLS8qIFJlZ1F1ZXJ5VmFsdWVFeFcJCVtBRFZBUEkzMi4xNThdICovCi1EV09SRCBXSU5BUEkgUmVnUXVlcnlWYWx1ZUV4MzJXKAotCUhLRVkJaGtleSwKLQlMUFdTVFIJbHBzelZhbHVlTmFtZSwKLQlMUERXT1JECWxwZHdSZXNlcnZlZCwKLQlMUERXT1JECWxwZHdUeXBlLAotCUxQQllURQlscGJEYXRhLAotCUxQRFdPUkQJbHBjYkRhdGEKLSkgeworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSZWdRdWVyeVZhbHVlRXgzMlcgW0FEVkFQSTMyLjE1OF0KKyAqIFJldHJpZXZlcyB0eXBlIGFuZCBkYXRhIGZvciBhIHNwZWNpZmllZCBuYW1lIGFzc29jaWF0ZWQgd2l0aCBhbiBvcGVuIGtleQorICoKKyAqIFBBUkFNUworICogICAgaGtleSAgICAgICAgICBbSV0gICBIYW5kbGUgb2Yga2V5IHRvIHF1ZXJ5CisgKiAgICBscFZhbHVlTmFtZSAgIFtJXSAgIE5hbWUgb2YgdmFsdWUgdG8gcXVlcnkKKyAqICAgIGxwZHdSZXNlcnZlZCAgW0ldICAgUmVzZXJ2ZWQgLSBtdXN0IGJlIE5VTEwKKyAqICAgIGxwZHdUeXBlICAgICAgW09dICAgQWRkcmVzcyBvZiBidWZmZXIgZm9yIHZhbHVlIHR5cGUuICBJZiBOVUxMLCB0aGUgdHlwZQorICogICAgICAgICAgICAgICAgICAgICAgICBpcyBub3QgcmVxdWlyZWQuCisgKiAgICBscGJEYXRhICAgICAgIFtPXSAgIEFkZHJlc3Mgb2YgZGF0YSBidWZmZXIuICBJZiBOVUxMLCB0aGUgYWN0dWFsIGRhdGEgaXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgbm90IHJlcXVpcmVkLgorICogICAgbHBjYkRhdGEgICAgICBbSS9PXSBBZGRyZXNzIG9mIGRhdGEgYnVmZmVyIHNpemUKKyAqCisgKiBSRVRVUk5TIAorICogICAgRVJST1JfU1VDQ0VTUzogICBTdWNjZXNzCisgKiAgICBFUlJPUl9NT1JFX0RBVEE6IFRoZSBzcGVjaWZpZWQgYnVmZmVyIGlzIG5vdCBiaWcgZW5vdWdoIHRvIGhvbGQgdGhlIGRhdGEKKyAqLworRFdPUkQgV0lOQVBJIFJlZ1F1ZXJ5VmFsdWVFeDMyVyggSEtFWSBoa2V5LCBMUFdTVFIgbHBWYWx1ZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUERXT1JEIGxwZHdSZXNlcnZlZCwgTFBEV09SRCBscGR3VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQllURSBscGJEYXRhLCBMUERXT1JEIGxwY2JEYXRhICkKK3sKIAlMUEtFWVNUUlVDVAlscGtleTsKIAlpbnQJCWk7CiAKLQlUUkFDRShyZWcsIigleCwlcywlcCwlcCwlcCwlbGQpXG4iLAotCQkgICAgIGhrZXksVzJDKGxwc3pWYWx1ZU5hbWUsMCksbHBkd1Jlc2VydmVkLGxwZHdUeXBlLGxwYkRhdGEsCi0JCSAgICAgbHBjYkRhdGE/KmxwY2JEYXRhOjApOworICAgIFRSQUNFKHJlZywiKCV4LCVzLCVwLCVwLCVwLCVsZClcbiIsIGhrZXksIGRlYnVnc3RyX3cobHBWYWx1ZU5hbWUpLAorICAgICAgICAgIGxwZHdSZXNlcnZlZCwgbHBkd1R5cGUsIGxwYkRhdGEsIGxwY2JEYXRhPypscGNiRGF0YTowKTsKIAotCWxwa2V5CT0gbG9va3VwX2hrZXkoaGtleSk7Ci0JaWYgKCFscGtleSkKLQkJcmV0dXJuIFNIRUxMX0VSUk9SX0JBREtFWTsKLQlpZiAobHBzelZhbHVlTmFtZSAmJiAhKmxwc3pWYWx1ZU5hbWUpCi0JCWxwc3pWYWx1ZU5hbWUgPSBOVUxMOwotCWlmIChscHN6VmFsdWVOYW1lPT1OVUxMKSB7CisgICAgbHBrZXkgPSBsb29rdXBfaGtleShoa2V5KTsKKyAgICBpZiAoIWxwa2V5KSB7CisgICAgICAgIFRSQUNFKHJlZywgIkludmFsaWQgaGFuZGxlKCV4KVxuIixoa2V5KTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lOVkFMSURfSEFORExFOworICAgIH0KKworICAgIC8qIEFuIGVtcHR5IG5hbWUgc3RyaW5nIGlzIGVxdWl2YWxlbnQgdG8gTlVMTCAqLworICAgIGlmIChscFZhbHVlTmFtZSAmJiAhKmxwVmFsdWVOYW1lKQorICAgICAgICBscFZhbHVlTmFtZSA9IE5VTEw7CisKKwlpZiAobHBWYWx1ZU5hbWU9PU5VTEwpIHsKKyAgICAgICAgICAgICAgICAvKiBVc2Uga2V5J3MgdW5uYW1lZCBvciBkZWZhdWx0IHZhbHVlLCBpZiBhbnkgKi8KIAkJZm9yIChpPTA7aTxscGtleS0+bnJvZnZhbHVlcztpKyspCiAJCQlpZiAobHBrZXktPnZhbHVlc1tpXS5uYW1lPT1OVUxMKQogCQkJCWJyZWFrOwogCX0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogU2VhcmNoIGZvciB0aGUga2V5IG5hbWUgKi8KIAkJZm9yIChpPTA7aTxscGtleS0+bnJvZnZhbHVlcztpKyspCiAJCQlpZiAoCWxwa2V5LT52YWx1ZXNbaV0ubmFtZSAmJgotCQkJCSFsc3RyY21waTMyVyhscHN6VmFsdWVOYW1lLGxwa2V5LT52YWx1ZXNbaV0ubmFtZSkKKwkJCQkhbHN0cmNtcGkzMlcobHBWYWx1ZU5hbWUsbHBrZXktPnZhbHVlc1tpXS5uYW1lKQogCQkJKQogCQkJCWJyZWFrOwogCX0KKwogCWlmIChpPT1scGtleS0+bnJvZnZhbHVlcykgewotCQlpZiAobHBzelZhbHVlTmFtZT09TlVMTCkgeworICAgICAgICAgICAgICAgIFRSQUNFKHJlZywiS2V5IG5vdCBmb3VuZFxuIik7CisJCWlmIChscFZhbHVlTmFtZT09TlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogRW1wdHkga2V5bmFtZSBub3QgZm91bmQgKi8KIAkJCWlmIChscGJEYXRhKSB7CiAJCQkJKihXQ0hBUiopbHBiRGF0YSA9IDA7CiAJCQkJKmxwY2JEYXRhCT0gMjsKIAkJCX0KIAkJCWlmIChscGR3VHlwZSkKIAkJCQkqbHBkd1R5cGUJPSBSRUdfU1o7Ci0JCQlyZXR1cm4gU0hFTExfRVJST1JfU1VDQ0VTUzsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFKHJlZywgIlJldHVybmluZyBhbiBlbXB0eSBzdHJpbmdcbiIpOworCQkJcmV0dXJuIEVSUk9SX1NVQ0NFU1M7CiAJCX0KLQkJcmV0dXJuIFNIRUxMX0VSUk9SX0JBREtFWTsvKkZJWE1FOiBjb3JyZWN0IHJldHVybj8gKi8KKwkJcmV0dXJuIEVSUk9SX0JBREtFWTsgLyogRklYTUUgKi8KIAl9Ci0JaWYgKGxwZHdUeXBlKQotCQkqbHBkd1R5cGUJPSBscGtleS0+dmFsdWVzW2ldLnR5cGU7Ci0JaWYgKGxwYkRhdGE9PU5VTEwpIHsKLQkJaWYgKGxwY2JEYXRhPT1OVUxMKQotCQkJcmV0dXJuIFNIRUxMX0VSUk9SX1NVQ0NFU1M7Ci0JCSpscGNiRGF0YQk9IGxwa2V5LT52YWx1ZXNbaV0ubGVuOwotCQlyZXR1cm4gU0hFTExfRVJST1JfU1VDQ0VTUzsKLQl9Ci0JaWYgKCpscGNiRGF0YTxscGtleS0+dmFsdWVzW2ldLmxlbikgewotCQkqKFdDSEFSKilscGJEYXRhPSAwOwotCQkqbHBjYkRhdGEJPSBscGtleS0+dmFsdWVzW2ldLmxlbjsKLQkJcmV0dXJuIEVSUk9SX01PUkVfREFUQTsKLQl9Ci0JbWVtY3B5KGxwYkRhdGEsbHBrZXktPnZhbHVlc1tpXS5kYXRhLGxwa2V5LT52YWx1ZXNbaV0ubGVuKTsKLQkqbHBjYkRhdGEJPSBscGtleS0+dmFsdWVzW2ldLmxlbjsKLQlyZXR1cm4gU0hFTExfRVJST1JfU1VDQ0VTUzsKKworICAgIGlmIChscGR3VHlwZSkKKyAgICAgICAgKmxwZHdUeXBlID0gbHBrZXktPnZhbHVlc1tpXS50eXBlOworCisgICAgaWYgKGxwYkRhdGE9PU5VTEwpIHsKKyAgICAgICAgLyogRGF0YSBpcyBub3QgcmVxdWlyZWQgKi8KKyAgICAgICAgaWYgKGxwY2JEYXRhPT1OVUxMKSB7CisgICAgICAgICAgICAvKiBBbmQgZGF0YSBzaXplIGlzIG5vdCByZXF1aXJlZCAqLworICAgICAgICAgICAgLyogU28gYWxsIHRoYXQgaXMgcmV0dXJuZWQgaXMgdGhlIHR5cGUgKHNldCBhYm92ZSkgKi8KKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9TVUNDRVNTOworICAgICAgICB9CisgICAgICAgIC8qIFNldCB0aGUgc2l6ZSByZXF1aXJlZCBhbmQgcmV0dXJuIHN1Y2Nlc3MgKi8KKyAgICAgICAgKmxwY2JEYXRhID0gbHBrZXktPnZhbHVlc1tpXS5sZW47CisgICAgICAgIHJldHVybiBFUlJPUl9TVUNDRVNTOworICAgIH0KKworICAgIGlmICgqbHBjYkRhdGE8bHBrZXktPnZhbHVlc1tpXS5sZW4pIHsKKyAgICAgICAgLyogVGhlIHNpemUgd2FzIHNwZWNpZmllZCwgYnV0IHRoZSBkYXRhIGlzIHRvbyBiaWcgZm9yIGl0ICovCisgICAgICAgIC8qIEluc3RlYWQgb2Ygc2V0dGluZyBpdCB0byBOVUxMLCBmaWxsIGluIHdpdGggYXMgbXVjaCBhcyBwb3NzaWJsZSAqLworICAgICAgICAvKiBCdXQgdGhlIGRvY3MgZG8gbm90IHNwZWNpZnkgaG93IHRvIGhhbmRsZSB0aGUgbHBiRGF0YSBoZXJlICovCisgICAgICAgIC8qICooV0NIQVIqKWxwYkRhdGE9IDA7ICovCisgICAgICAgIG1lbWNweShscGJEYXRhLGxwa2V5LT52YWx1ZXNbaV0uZGF0YSwqbHBjYkRhdGEpOworICAgICAgICAqbHBjYkRhdGEgPSBscGtleS0+dmFsdWVzW2ldLmxlbjsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01PUkVfREFUQTsKKyAgICB9CisKKyAgICBtZW1jcHkobHBiRGF0YSxscGtleS0+dmFsdWVzW2ldLmRhdGEsbHBrZXktPnZhbHVlc1tpXS5sZW4pOworCisgICAgLyogRXh0cmEgZGVidWdnaW5nIG91dHB1dCAqLworICAgIGlmIChscGR3VHlwZSkgeworICAgICAgICBzd2l0Y2goKmxwZHdUeXBlKXsKKyAgICAgICAgICAgIGNhc2UgUkVHX1NaOgorICAgICAgICAgICAgICAgIFRSQUNFKHJlZywiIERhdGEoc3opPSVzXG4iLGRlYnVnc3RyX3coKExQQ1dTVFIpbHBiRGF0YSkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBSRUdfRFdPUkQ6CisgICAgICAgICAgICAgICAgVFJBQ0UocmVnLCIgRGF0YShkd29yZCk9JWx4XG4iLCAoRFdPUkQpKmxwYkRhdGEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBSRUdfQklOQVJZOgorICAgICAgICAgICAgICAgIFRSQUNFKHJlZywiIERhdGEoYmluYXJ5KVxuIik7CisgICAgICAgICAgICAgICAgLyogSXMgdGhlcmUgYSB3YXkgb2YgcHJpbnRpbmcgdGhpcyBpbiByZWFkYWJsZSBmb3JtPyAqLworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBUUkFDRShyZWcsICJVbmtub3duIGRhdGEgdHlwZSAlbGRcbiIsICpscGR3VHlwZSk7CisgICAgICAgIH0gLyogc3dpdGNoICovCisgICAgfSAvKiBpZiAqLworCisgICAgLyogU2V0IHRoZSBhY3R1YWwgc2l6ZSAqLworICAgICpscGNiRGF0YSA9IGxwa2V5LT52YWx1ZXNbaV0ubGVuOworICAgIHJldHVybiBFUlJPUl9TVUNDRVNTOwogfQogCi0vKiBSZWdRdWVyeVZhbHVlVwkJW0FEVkFQSTMyLjE1OV0gKi8KLURXT1JEIFdJTkFQSSBSZWdRdWVyeVZhbHVlMzJXKAotCUhLRVkJaGtleSwKLQlMUFdTVFIJbHBzelN1YktleSwKLQlMUFdTVFIJbHBzekRhdGEsCi0JTFBEV09SRAlscGNiRGF0YQotKSB7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJlZ1F1ZXJ5VmFsdWUzMlcgW0FEVkFQSTMyLjE1OV0KKyAqCisgKiBOT1RFUworICogICAgV2h5IGlzIHRoaXMgY2FsbGluZyBSZWdPcGVuS2V5MzJXPworICovCitEV09SRCBXSU5BUEkgUmVnUXVlcnlWYWx1ZTMyVyggSEtFWSBoa2V5LCBMUFdTVFIgbHBzelN1YktleSwgTFBXU1RSIGxwc3pEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRFdPUkQgbHBjYkRhdGEgKQorewogCUhLRVkJeGhrZXk7CiAJRFdPUkQJcmV0LGxwZHdUeXBlOwogCi0JVFJBQ0UocmVnLCIoJXgsJXMsJXAsJWxkKVxuIiwKLQkJICAgICBoa2V5LFcyQyhscHN6U3ViS2V5LDApLGxwc3pEYXRhLAotCQkgICAgIGxwY2JEYXRhPypscGNiRGF0YTowKTsKKyAgICBUUkFDRShyZWcsIigleCwlcywlcCwlbGQpXG4iLGhrZXksZGVidWdzdHJfdyhscHN6U3ViS2V5KSxscHN6RGF0YSwKKyAgICAgICAgICBscGNiRGF0YT8qbHBjYkRhdGE6MCk7CiAKIAkvKiBvbmx5IG9wZW4gc3Via2V5LCBpZiB3ZSByZWFsbHkgZG8gZGVzY2VuZCAqLwogCWlmIChscHN6U3ViS2V5ICYmICpscHN6U3ViS2V5KSB7CkBAIC0xOTY0LDM3ICsyMTcxLDM4IEBACiAJcmV0dXJuIHJldDsKIH0KIAotLyogUmVnUXVlcnlWYWx1ZUV4QQkJW0FEVkFQSTMyLjE1N10gKi8KLURXT1JEIFdJTkFQSSBSZWdRdWVyeVZhbHVlRXgzMkEoCi0JSEtFWQloa2V5LAotCUxQU1RSCWxwc3pWYWx1ZU5hbWUsCi0JTFBEV09SRAlscGR3UmVzZXJ2ZWQsCi0JTFBEV09SRAlscGR3VHlwZSwKLQlMUEJZVEUJbHBiRGF0YSwKLQlMUERXT1JECWxwY2JEYXRhCi0pIHsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmVnUXVlcnlWYWx1ZUV4MzJBIFtBRFZBUEkzMi4xNTddCisgKgorICogQ2FuIHRoaXMgdXNlIEhFQVBfc3RyZHVwQXRvVz8KKyAqLworRFdPUkQgV0lOQVBJIFJlZ1F1ZXJ5VmFsdWVFeDMyQSggSEtFWSBoa2V5LCBMUFNUUiBscHN6VmFsdWVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEV09SRCBscGR3UmVzZXJ2ZWQsIExQRFdPUkQgbHBkd1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEJZVEUgbHBiRGF0YSwgTFBEV09SRCBscGNiRGF0YSApCit7CiAJTFBXU1RSCWxwc3pWYWx1ZU5hbWVXOwogCUxQQllURQlidWY7CiAJRFdPUkQJcmV0LG15eGxlbjsKIAlEV09SRAkqbXlsZW47CiAJRFdPUkQJdHlwZTsKIAotCVRSQUNFKHJlZywiKCV4LCVzLCVwLCVwLCVwLCVsZClcbiIsCi0JCSAgICAgaGtleSxscHN6VmFsdWVOYW1lLGxwZHdSZXNlcnZlZCxscGR3VHlwZSxscGJEYXRhLAotCQkgICAgIGxwY2JEYXRhPypscGNiRGF0YTowKTsKKyAgICBUUkFDRShyZWcsIigleCwlcywlcCwlcCwlcCwlbGQpXG4iLCBoa2V5LGRlYnVnc3RyX2EobHBzelZhbHVlTmFtZSksCisgICAgICAgICAgbHBkd1Jlc2VydmVkLGxwZHdUeXBlLGxwYkRhdGEsbHBjYkRhdGE/KmxwY2JEYXRhOjApOwogCi0JaWYgKGxwc3pWYWx1ZU5hbWUpCi0JCWxwc3pWYWx1ZU5hbWVXPXN0cmR1cEEyVyhscHN6VmFsdWVOYW1lKTsKLQllbHNlIAotCQlscHN6VmFsdWVOYW1lVz1OVUxMOworICAgIGlmIChscHN6VmFsdWVOYW1lKQorICAgICAgICBscHN6VmFsdWVOYW1lVz1zdHJkdXBBMlcobHBzelZhbHVlTmFtZSk7CisgICAgZWxzZSAKKyAgICAgICAgbHBzelZhbHVlTmFtZVc9TlVMTDsKIAotCWlmIChscGR3VHlwZSkKLQkJdHlwZT0qbHBkd1R5cGU7CisgICAgaWYgKGxwZHdUeXBlKQorICAgICAgICB0eXBlPSpscGR3VHlwZTsKIAogCWlmIChscGJEYXRhKSB7CiAJCW15eGxlbiAgPSAwOwogCQlteWxlbgk9ICZteXhsZW47CiAJCWJ1Zgk9IHhtYWxsb2MoNCk7CisgICAgICAgICAgICAgICAgLyogT25seSBnZXQgdGhlIHNpemUgZm9yIG5vdyAqLwogCQlyZXQ9UmVnUXVlcnlWYWx1ZUV4MzJXKAogCQkJaGtleSwKIAkJCWxwc3pWYWx1ZU5hbWVXLApAQCAtMjAxOCw2ICsyMjI2LDcgQEAKIAkJfSBlbHNlCiAJCQlteWxlbgk9IE5VTEw7CiAJfQorICAgICAgICAvKiBOb3cgZ2V0IHRoZSBkYXRhICovCiAJcmV0PVJlZ1F1ZXJ5VmFsdWVFeDMyVygKIAkJaGtleSwKIAkJbHBzelZhbHVlTmFtZVcsCkBAIC0yMDI4LDYgKzIyMzcsNyBAQAogCSk7CiAJaWYgKGxwZHdUeXBlKSAKIAkJKmxwZHdUeXBlPXR5cGU7CisKIAlpZiAocmV0PT1FUlJPUl9TVUNDRVNTKSB7CiAJCWlmIChidWYpIHsKIAkJCWlmIChVTklDT05WTUFTSyAmICgxPDwodHlwZSkpKSB7CkBAIC0yMDUyLDMzICsyMjYyLDMxIEBACiAJfQogCWlmIChidWYpCiAJCWZyZWUoYnVmKTsKLQlyZXR1cm4gcmV0OworCisgICAgcmV0dXJuIHJldDsKIH0KIAotLyogUmVnUXVlcnlWYWx1ZUV4CQlbS0VSTkVMLjIyNV0gKi8KLURXT1JEIFdJTkFQSSBSZWdRdWVyeVZhbHVlRXgxNigKLQlIS0VZCWhrZXksCi0JTFBTVFIJbHBzelZhbHVlTmFtZSwKLQlMUERXT1JECWxwZHdSZXNlcnZlZCwKLQlMUERXT1JECWxwZHdUeXBlLAotCUxQQllURQlscGJEYXRhLAotCUxQRFdPUkQJbHBjYkRhdGEKLSkgewotCVRSQUNFKHJlZywiKCV4LCVzLCVwLCVwLCVwLCVsZClcbiIsCi0JCSAgICAgaGtleSxscHN6VmFsdWVOYW1lLGxwZHdSZXNlcnZlZCxscGR3VHlwZSxscGJEYXRhLAotCQkgICAgIGxwY2JEYXRhPypscGNiRGF0YTowKTsKIAotCXJldHVybiBSZWdRdWVyeVZhbHVlRXgzMkEoCi0JCWhrZXksCi0JCWxwc3pWYWx1ZU5hbWUsCi0JCWxwZHdSZXNlcnZlZCwKLQkJbHBkd1R5cGUsCi0JCWxwYkRhdGEsCi0JCWxwY2JEYXRhCi0JKTsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJlZ1F1ZXJ5VmFsdWVFeDE2IFtLRVJORUwuMjI1XQorICovCitEV09SRCBXSU5BUEkgUmVnUXVlcnlWYWx1ZUV4MTYoIEhLRVkgaGtleSwgTFBTVFIgbHBzelZhbHVlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEV09SRCBscGR3UmVzZXJ2ZWQsIExQRFdPUkQgbHBkd1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQllURSBscGJEYXRhLCBMUERXT1JEIGxwY2JEYXRhICkKK3sKKyAgICBUUkFDRShyZWcsIigleCwlcywlcCwlcCwlcCwlbGQpXG4iLGhrZXksZGVidWdzdHJfYShscHN6VmFsdWVOYW1lKSwKKyAgICAgICAgICBscGR3UmVzZXJ2ZWQsbHBkd1R5cGUsbHBiRGF0YSxscGNiRGF0YT8qbHBjYkRhdGE6MCk7CisgICAgcmV0dXJuIFJlZ1F1ZXJ5VmFsdWVFeDMyQSggaGtleSwgbHBzelZhbHVlTmFtZSwgbHBkd1Jlc2VydmVkLCBscGR3VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscGJEYXRhLCBscGNiRGF0YSApOwogfQogCi0vKiBSZWdRdWVyeVZhbHVlQQkJW0FEVkFQSTMyLjE1Nl0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmVnUXVlcnlWYWx1ZTMyQSBbQURWQVBJMzIuMTU2XQorICoKKyAqIE5PVEVTCisgKiAgICBXaHkgaXMgdGhpcyBjYWxsaW5nIFJlZ09wZW5LZXkxNj8KKyAqLwogRFdPUkQgV0lOQVBJIFJlZ1F1ZXJ5VmFsdWUzMkEoCiAJSEtFWQloa2V5LAogCUxQU1RSCWxwc3pTdWJLZXksCkBAIC0yMDg4LDEzICsyMjk2LDEyIEBACiAJSEtFWQl4aGtleTsKIAlEV09SRAlyZXQsbHBkd1R5cGU7CiAKLQlUUkFDRShyZWcsIigleCwlcywlcCwlbGQpXG4iLAotCQkgICAgIGhrZXksbHBzelN1YktleSxscHN6RGF0YSwKLQkJICAgICBscGNiRGF0YT8qbHBjYkRhdGE6MCk7CisgICAgVFJBQ0UocmVnLCIoJXgsJXMsJXAsJWxkKVxuIixoa2V5LGRlYnVnc3RyX2EobHBzelN1YktleSksbHBzekRhdGEsCisgICAgICAgICAgbHBjYkRhdGE/KmxwY2JEYXRhOjApOwogCiAJLyogb25seSBvcGVuIHN1YmtleSwgaWYgd2UgcmVhbGx5IGRvIGRlc2NlbmQgKi8KIAlpZiAobHBzelN1YktleSAmJiAqbHBzelN1YktleSkgewotCQlyZXQJPSBSZWdPcGVuS2V5MTYoaGtleSxscHN6U3ViS2V5LCZ4aGtleSk7CisJCXJldCA9IFJlZ09wZW5LZXkxNihoa2V5LGxwc3pTdWJLZXksJnhoa2V5KTsKIAkJaWYgKHJldCE9RVJST1JfU1VDQ0VTUykKIAkJCXJldHVybiByZXQ7CiAJfSBlbHNlCkBAIC0yMTE0LDI1ICsyMzIxLDMwIEBACiAJcmV0dXJuIHJldDsKIH0KIAotLyogUmVnUXVlcnlWYWx1ZQkJW1NIRUxMLjZdIFtLRVJORUwuMjI0XSAqLwotRFdPUkQgV0lOQVBJIFJlZ1F1ZXJ5VmFsdWUxNigKLQlIS0VZCWhrZXksCi0JTFBTVFIJbHBzelN1YktleSwKLQlMUFNUUglscHN6RGF0YSwKLQlMUERXT1JECWxwY2JEYXRhCi0pIHsKLQlUUkFDRShyZWcsIigleCwlcywlcCwlbGQpXG4iLAotCQkgICAgIGhrZXksbHBzelN1YktleSxscHN6RGF0YSxscGNiRGF0YT8qbHBjYkRhdGE6MCk7CiAKLQkvKiBIQUNLOiB0aGUgMTZiaXQgUmVnUXVlcnlWYWx1ZSBkb2Vzbid0IGhhbmRsZSBzZWxlY3RvcmJsb2NrcwotCSAqICAgICAgIGFueXdheSwgc28gd2UganVzdCBtYXNrIG91dCB0aGUgaGlnaCAxNiBiaXQuCi0JICogICAgICAgKHRoaXMgKG5vdCBzbyBtdWNoIGluY2lkZW50bHk7KSBob3BlZnVsbHkgZml4ZXMgQWxkdXMgRkg0KQotCSAqLwotCWlmIChscGNiRGF0YSkKLQkJKmxwY2JEYXRhICY9IDB4RkZGRjsKLQlyZXR1cm4gUmVnUXVlcnlWYWx1ZTMyQShoa2V5LGxwc3pTdWJLZXksbHBzekRhdGEsbHBjYkRhdGEpOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmVnUXVlcnlWYWx1ZTE2IFtTSEVMTC42XSBbS0VSTkVMLjIyNF0KKyAqCisgKiBOT1RFUworICogICAgSXMgdGhpcyBIQUNLIHN0aWxsIGFwcGxpY2FibGU/CisgKgorICogSEFDSworICogICAgVGhlIDE2Yml0IFJlZ1F1ZXJ5VmFsdWUgZG9lc24ndCBoYW5kbGUgc2VsZWN0b3JibG9ja3MgYW55d2F5LCBzbyB3ZSBqdXN0CisgKiAgICBtYXNrIG91dCB0aGUgaGlnaCAxNiBiaXQuICBUaGlzIChub3Qgc28gbXVjaCBpbmNpZGVudGx5KSBob3BlZnVsbHkgZml4ZXMKKyAqICAgIEFsZHVzIEZINCkKKyAqLworRFdPUkQgV0lOQVBJIFJlZ1F1ZXJ5VmFsdWUxNiggSEtFWSBoa2V5LCBMUFNUUiBscHN6U3ViS2V5LCBMUFNUUiBscHN6RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRFdPUkQgbHBjYkRhdGEgKQoreworICAgIFRSQUNFKHJlZywiKCV4LCVzLCVwLCVsZClcbiIsaGtleSxkZWJ1Z3N0cl9hKGxwc3pTdWJLZXkpLGxwc3pEYXRhLAorICAgICAgICAgIGxwY2JEYXRhPypscGNiRGF0YTowKTsKKworICAgIGlmIChscGNiRGF0YSkKKyAgICAgICAgKmxwY2JEYXRhICY9IDB4RkZGRjsKKyAgICByZXR1cm4gUmVnUXVlcnlWYWx1ZTMyQShoa2V5LGxwc3pTdWJLZXksbHBzekRhdGEsbHBjYkRhdGEpOwogfQogCisKIC8qCiAgKiBTZXR0aW5nIHZhbHVlcyBvZiBSZWdpc3RyeSBrZXlzCiAgKgpAQCAtMjE0MSwyOSArMjM1Myw1NyBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdTZXRWYWx1ZTMyVyAgIC0+IFJlZ1NldFZhbHVlRXgzMlcKICAqLwogCi0vKiBSZWdTZXRWYWx1ZUV4VwkJW0FEVkFQSTMyLjE3MF0gKi8KLURXT1JEIFdJTkFQSSBSZWdTZXRWYWx1ZUV4MzJXKAotCUhLRVkJaGtleSwKLQlMUFdTVFIJbHBzelZhbHVlTmFtZSwKLQlEV09SRAlkd1Jlc2VydmVkLAotCURXT1JECWR3VHlwZSwKLQlMUEJZVEUJbHBiRGF0YSwKLQlEV09SRAljYkRhdGEKLSkgewotCUxQS0VZU1RSVUNUCWxwa2V5OwotCWludAkJaTsKIAotCVRSQUNFKHJlZywiKCV4LCVzLCVsZCwlbGQsJXAsJWxkKVxuIiwKLQkJaGtleSxXMkMobHBzelZhbHVlTmFtZSwwKSxkd1Jlc2VydmVkLGR3VHlwZSxscGJEYXRhLGNiRGF0YQotCSk7Ci0JLyogd2Ugbm8gbG9uZ2VyIGNhcmUgYWJvdXQgdGhlIGxwYkRhdGEgdHlwZSBoZXJlLi4uICovCi0JbHBrZXkJPSBsb29rdXBfaGtleShoa2V5KTsKLQlpZiAoIWxwa2V5KQotCQlyZXR1cm4gU0hFTExfRVJST1JfQkFES0VZOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmVnU2V0VmFsdWVFeDMyVyBbQURWQVBJMzIuMTcwXQorICogU2V0cyB0aGUgZGF0YSBhbmQgdHlwZSBvZiBhIHZhbHVlIHVuZGVyIGEgcmVnaXN0ZXIga2V5CisgKgorICogUEFSQU1TCisgKiAgICBoa2V5ICAgICAgICAgIFtJXSBIYW5kbGUgb2Yga2V5IHRvIHNldCB2YWx1ZSBmb3IKKyAqICAgIGxwc3pWYWx1ZU5hbWUgW0ldIE5hbWUgb2YgdmFsdWUgdG8gc2V0CisgKiAgICBkd1Jlc2VydmVkICAgIFtJXSBSZXNlcnZlZCAtIG11c3QgYmUgemVybworICogICAgZHdUeXBlICAgICAgICBbSV0gRmxhZyBmb3IgdmFsdWUgdHlwZQorICogICAgbHBiRGF0YSAgICAgICBbSV0gQWRkcmVzcyBvZiB2YWx1ZSBkYXRhCisgKiAgICBjYkRhdGEgICAgICAgIFtJXSBTaXplIG9mIHZhbHVlIGRhdGEKKyAqCisgKiBSRVRVUk5TCisgKiAgICBTdWNjZXNzOiBFUlJPUl9TVUNDRVNTCisgKiAgICBGYWlsdXJlOiBFcnJvciBjb2RlCisgKi8KK0RXT1JEIFdJTkFQSSBSZWdTZXRWYWx1ZUV4MzJXKCBIS0VZIGhrZXksIExQV1NUUiBscHN6VmFsdWVOYW1lLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd1Jlc2VydmVkLCBEV09SRCBkd1R5cGUsIExQQllURSBscGJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGNiRGF0YSkKK3sKKyAgICBMUEtFWVNUUlVDVCBscGtleTsKKyAgICBpbnQgaTsKKworICAgIFRSQUNFKHJlZywiKCV4LCVzLCVsZCwlbGQsJXAsJWxkKVxuIiwgaGtleSwgZGVidWdzdHJfdyhscHN6VmFsdWVOYW1lKSwKKyAgICAgICAgICBkd1Jlc2VydmVkLCBkd1R5cGUsIGxwYkRhdGEsIGNiRGF0YSk7CisKKyAgICBzd2l0Y2ggKGR3VHlwZSkgeworICAgICAgICBjYXNlIFJFR19TWjoKKyAgICAgICAgICAgIFRSQUNFKHJlZywiIERhdGEoc3opPSVzXG4iLCBkZWJ1Z3N0cl93KChMUENXU1RSKWxwYkRhdGEpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJFR19CSU5BUlk6CisgICAgICAgICAgICBUUkFDRShyZWcsIiBEYXRhKGJpbmFyeSlcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUkVHX0RXT1JEOgorICAgICAgICAgICAgVFJBQ0UocmVnLCIgRGF0YShkd29yZCk9JWx4XG4iLCAoRFdPUkQpKmxwYkRhdGEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBUUkFDRShyZWcsIlVua25vd24gdHlwZTogJWxkXG4iLCBkd1R5cGUpOworICAgIH0KKworCWxwa2V5ID0gbG9va3VwX2hrZXkoaGtleSk7CisJaWYgKCFscGtleSkgeworICAgICAgICAgICAgV0FSTihyZWcsIlJldHVybmluZyBiYWRrZXlcbiIpOworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lOVkFMSURfSEFORExFOworICAgICAgICB9CiAKIAlscGtleS0+ZmxhZ3MgfD0gUkVHX09QVElPTl9UQUlOVEVEOwogCiAJaWYgKGxwc3pWYWx1ZU5hbWU9PU5VTEwpIHsKKyAgICAgICAgICAgICAvKiBTZXRzIHR5cGUgYW5kIG5hbWUgZm9yIGtleSdzIHVubmFtZWQgb3IgZGVmYXVsdCB2YWx1ZSAqLwogCQlmb3IgKGk9MDtpPGxwa2V5LT5ucm9mdmFsdWVzO2krKykKIAkJCWlmIChscGtleS0+dmFsdWVzW2ldLm5hbWU9PU5VTEwpCiAJCQkJYnJlYWs7CkBAIC0yMTk0LDI1ICsyNDM0LDI3IEBACiAJbHBrZXktPnZhbHVlc1tpXS5kYXRhCT0gKExQQllURSl4bWFsbG9jKGNiRGF0YSk7CiAJbHBrZXktPnZhbHVlc1tpXS5sYXN0bW9kaWZpZWQgPSB0aW1lKE5VTEwpOwogCW1lbWNweShscGtleS0+dmFsdWVzW2ldLmRhdGEsbHBiRGF0YSxjYkRhdGEpOwotCXJldHVybiBTSEVMTF9FUlJPUl9TVUNDRVNTOworCXJldHVybiBFUlJPUl9TVUNDRVNTOwogfQogCi0vKiBSZWdTZXRWYWx1ZUV4QQkJW0FEVkFQSTMyLjE2OV0gKi8KLURXT1JEIFdJTkFQSSBSZWdTZXRWYWx1ZUV4MzJBKAotCUhLRVkJaGtleSwKLQlMUFNUUglscHN6VmFsdWVOYW1lLAotCURXT1JECWR3UmVzZXJ2ZWQsCi0JRFdPUkQJZHdUeXBlLAotCUxQQllURQlscGJEYXRhLAotCURXT1JECWNiRGF0YQotKSB7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJlZ1NldFZhbHVlRXgzMkEgW0FEVkFQSTMyLjE2OV0KKyAqCisgKiBOT1RFUworICogICAgQ2FuIHRoaXMgdXNlIHRoZSBzdGFuZGFyZCBIRUFQX3N0cmR1cEF0b1cgaW5zdGVhZD8KKyAqLworRFdPUkQgV0lOQVBJIFJlZ1NldFZhbHVlRXgzMkEoIEhLRVkgaGtleSwgTFBTVFIgbHBzelZhbHVlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd1Jlc2VydmVkLCBEV09SRCBkd1R5cGUsIExQQllURSBscGJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGNiRGF0YSApCit7CiAJTFBCWVRFCWJ1ZjsKIAlMUFdTVFIJbHBzelZhbHVlTmFtZVc7CiAJRFdPUkQJcmV0OwogCi0JVFJBQ0UocmVnLCIoJXgsJXMsJWxkLCVsZCwlcCwlbGQpXG4iLAotCQloa2V5LGxwc3pWYWx1ZU5hbWUsZHdSZXNlcnZlZCxkd1R5cGUsbHBiRGF0YSxjYkRhdGEKLQkpOworICAgIFRSQUNFKHJlZywiKCV4LCVzLCVsZCwlbGQsJXAsJWxkKVxuIixoa2V5LGRlYnVnc3RyX2EobHBzelZhbHVlTmFtZSksCisgICAgICAgICAgZHdSZXNlcnZlZCxkd1R5cGUsbHBiRGF0YSxjYkRhdGEpOworCiAJaWYgKCgxPDxkd1R5cGUpICYgVU5JQ09OVk1BU0spIHsKIAkJYnVmPShMUEJZVEUpc3RyZHVwQTJXKGxwYkRhdGEpOwogCQljYkRhdGE9MipzdHJsZW4obHBiRGF0YSkrMjsKQEAgLTIyMzAsMjIgKzI0NzIsMjMgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0vKiBSZWdTZXRWYWx1ZUV4CQlbS0VSTkVMLjIyNl0gKi8KLURXT1JEIFdJTkFQSSBSZWdTZXRWYWx1ZUV4MTYoCi0JSEtFWQloa2V5LAotCUxQU1RSCWxwc3pWYWx1ZU5hbWUsCi0JRFdPUkQJZHdSZXNlcnZlZCwKLQlEV09SRAlkd1R5cGUsCi0JTFBCWVRFCWxwYkRhdGEsCi0JRFdPUkQJY2JEYXRhCi0pIHsKLQlUUkFDRShyZWcsIigleCwlcywlbGQsJWxkLCVwLCVsZClcbiIsCi0JCWhrZXksbHBzelZhbHVlTmFtZSxkd1Jlc2VydmVkLGR3VHlwZSxscGJEYXRhLGNiRGF0YQotCSk7Ci0JcmV0dXJuIFJlZ1NldFZhbHVlRXgzMkEoaGtleSxscHN6VmFsdWVOYW1lLGR3UmVzZXJ2ZWQsZHdUeXBlLGxwYkRhdGEsY2JEYXRhKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmVnU2V0VmFsdWVFeDE2IFtLRVJORUwuMjI2XQorICovCitEV09SRCBXSU5BUEkgUmVnU2V0VmFsdWVFeDE2KCBIS0VZIGhrZXksIExQU1RSIGxwc3pWYWx1ZU5hbWUsIERXT1JEIGR3UmVzZXJ2ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd1R5cGUsIExQQllURSBscGJEYXRhLCBEV09SRCBjYkRhdGEgKQoreworICAgIFRSQUNFKHJlZywiKCV4LCVzLCVsZCwlbGQsJXAsJWxkKVxuIixoa2V5LGRlYnVnc3RyX2EobHBzelZhbHVlTmFtZSksCisgICAgICAgICAgZHdSZXNlcnZlZCxkd1R5cGUsbHBiRGF0YSxjYkRhdGEpOworICAgIHJldHVybiBSZWdTZXRWYWx1ZUV4MzJBKCBoa2V5LCBscHN6VmFsdWVOYW1lLCBkd1Jlc2VydmVkLCBkd1R5cGUsIGxwYkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiRGF0YSApOwogfQogCi0vKiBSZWdTZXRWYWx1ZVcJCQlbQURWQVBJMzIuMTcxXSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSZWdTZXRWYWx1ZTMyVwlbQURWQVBJMzIuMTcxXQorICovCiBEV09SRCBXSU5BUEkgUmVnU2V0VmFsdWUzMlcoCiAJSEtFWQloa2V5LAogCUxQQ1dTVFIJbHBzelN1YktleSwKQEAgLTIyNzksOSArMjUyMiwxNSBAQAogCWlmIChoa2V5IT14aGtleSkKIAkJUmVnQ2xvc2VLZXkoeGhrZXkpOwogCXJldHVybiByZXQ7Ci0KIH0KLS8qIFJlZ1NldFZhbHVlQQkJCVtBRFZBUEkzMi4xNjhdICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmVnU2V0VmFsdWUzMkEgW0FEVkFQSTMyLjE2OF0KKyAqCisgKiBOT1RFUworICogICAgV2h5IGlzIHRoaXMgY2FsbGluZyBSZWdDcmVhdGVLZXkxNj8KKyAqLwogRFdPUkQgV0lOQVBJIFJlZ1NldFZhbHVlMzJBKAogCUhLRVkJaGtleSwKIAlMUENTVFIJbHBzelN1YktleSwKQEAgLTIzMTQsMjIgKzI1NjMsMTkgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0vKiBSZWdTZXRWYWx1ZQkJCVtLRVJORUwuMjIxXSBbU0hFTEwuNV0gKi8KLURXT1JEIFdJTkFQSSBSZWdTZXRWYWx1ZTE2KAotCUhLRVkJaGtleSwKLQlMUENTVFIJbHBzelN1YktleSwKLQlEV09SRAlkd1R5cGUsCi0JTFBDU1RSCWxwc3pEYXRhLAotCURXT1JECWNiRGF0YQotKSB7Ci0JRFdPUkQJcmV0OwotCVRSQUNFKHJlZywiKCV4LCVzLCVsZCwlcywlbGQpXG4iLAotCQloa2V5LGxwc3pTdWJLZXksZHdUeXBlLGxwc3pEYXRhLGNiRGF0YQotCSk7Ci0JcmV0PVJlZ1NldFZhbHVlMzJBKGhrZXksbHBzelN1YktleSxkd1R5cGUsbHBzekRhdGEsY2JEYXRhKTsKLQlyZXR1cm4gcmV0OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSZWdTZXRWYWx1ZTE2IFtLRVJORUwuMjIxXSBbU0hFTEwuNV0KKyAqLworRFdPUkQgV0lOQVBJIFJlZ1NldFZhbHVlMTYoIEhLRVkgaGtleSwgTFBDU1RSIGxwc3pTdWJLZXksIERXT1JECWR3VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENTVFIgbHBzekRhdGEsIERXT1JEIGNiRGF0YSApCit7CisgICAgVFJBQ0UocmVnLCIoJXgsJXMsJWxkLCVzLCVsZClcbiIsaGtleSxkZWJ1Z3N0cl9hKGxwc3pTdWJLZXkpLGR3VHlwZSwKKyAgICAgICAgICBkZWJ1Z3N0cl9hKGxwc3pEYXRhKSxjYkRhdGEpOworICAgIHJldHVybiBSZWdTZXRWYWx1ZTMyQShoa2V5LGxwc3pTdWJLZXksZHdUeXBlLGxwc3pEYXRhLGNiRGF0YSk7CiB9CiAKKwogLyogCiAgKiBLZXkgRW51bWVyYXRpb24KICAqCkBAIC0yMzM4LDI1ICsyNTg0LDI0IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ0VudW1LZXkzMlcgICAtPiBSZWdFbnVtS2V5RXgzMlcKICAqLwogCi0vKiBSZWdFbnVtS2V5RXhXCQlbQURWQVBJMzIuMTM5XSAqLwotRFdPUkQgV0lOQVBJIFJlZ0VudW1LZXlFeDMyVygKLQlIS0VZCWhrZXksCi0JRFdPUkQJaVN1YmtleSwKLQlMUFdTVFIJbHBzek5hbWUsCi0JTFBEV09SRAlscGNjaE5hbWUsCi0JTFBEV09SRAlscGR3UmVzZXJ2ZWQsCi0JTFBXU1RSCWxwc3pDbGFzcywKLQlMUERXT1JECWxwY2NoQ2xhc3MsCi0JRklMRVRJTUUJKmZ0Ci0pIHsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmVnRW51bUtleUV4MzJXIFtBRFZBUEkzMi4xMzldCisgKi8KK0RXT1JEIFdJTkFQSSBSZWdFbnVtS2V5RXgzMlcoIEhLRVkgaGtleSwgRFdPUkQgaVN1YmtleSwgTFBXU1RSIGxwc3pOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEV09SRCBscGNjaE5hbWUsIExQRFdPUkQgbHBkd1Jlc2VydmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBXU1RSIGxwc3pDbGFzcywgTFBEV09SRCBscGNjaENsYXNzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEVUSU1FICpmdCApCit7CiAJTFBLRVlTVFJVQ1QJbHBrZXksbHB4a2V5OwogCi0JVFJBQ0UocmVnLCIoJXgsJWxkLCVwLCVsZCwlcCwlcCwlcCwlcClcbiIsCi0JCWhrZXksaVN1YmtleSxscHN6TmFtZSwqbHBjY2hOYW1lLGxwZHdSZXNlcnZlZCxscHN6Q2xhc3MsbHBjY2hDbGFzcyxmdAotCSk7Ci0JbHBrZXk9bG9va3VwX2hrZXkoaGtleSk7Ci0JaWYgKCFscGtleSkKLQkJcmV0dXJuIFNIRUxMX0VSUk9SX0JBREtFWTsKKyAgICBUUkFDRShyZWcsIigleCwlbGQsJXAsJWxkLCVwLCVwLCVwLCVwKVxuIixoa2V5LGlTdWJrZXksbHBzek5hbWUsCisgICAgICAgICAgKmxwY2NoTmFtZSxscGR3UmVzZXJ2ZWQsbHBzekNsYXNzLGxwY2NoQ2xhc3MsZnQpOworCisgICAgbHBrZXkgPSBsb29rdXBfaGtleShoa2V5KTsKKyAgICBpZiAoIWxwa2V5KQorICAgICAgICByZXR1cm4gRVJST1JfSU5WQUxJRF9IQU5ETEU7CisKIAlpZiAoIWxwa2V5LT5uZXh0c3ViKQogCQlyZXR1cm4gRVJST1JfTk9fTU9SRV9JVEVNUzsKIAlscHhrZXk9bHBrZXktPm5leHRzdWI7CkBAIC0yMzc1LDIzICsyNjIwLDIyIEBACiAJCSpscGNjaENsYXNzCT0gMjsKIAl9CiAJcmV0dXJuIEVSUk9SX1NVQ0NFU1M7Ci0KIH0KIAotLyogUmVnRW51bUtleVcJCQlbQURWQVBJMzIuMTQwXSAqLwotRFdPUkQgV0lOQVBJIFJlZ0VudW1LZXkzMlcoCi0JSEtFWQloa2V5LAotCURXT1JECWlTdWJrZXksCi0JTFBXU1RSCWxwc3pOYW1lLAotCURXT1JECWxwY2NoTmFtZQotKSB7Ci0JRklMRVRJTUUJZnQ7CiAKLQlUUkFDRShyZWcsIigleCwlbGQsJXAsJWxkKVxuIiwKLQkJaGtleSxpU3Via2V5LGxwc3pOYW1lLGxwY2NoTmFtZQotCSk7Ci0JcmV0dXJuIFJlZ0VudW1LZXlFeDMyVyhoa2V5LGlTdWJrZXksbHBzek5hbWUsJmxwY2NoTmFtZSxOVUxMLE5VTEwsTlVMTCwmZnQpOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmVnRW51bUtleTMyVyBbQURWQVBJMzIuMTQwXQorICovCitEV09SRCBXSU5BUEkgUmVnRW51bUtleTMyVyggSEtFWSBoa2V5LCBEV09SRCBpU3Via2V5LCBMUFdTVFIgbHBzek5hbWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGxwY2NoTmFtZSApCit7CisgICAgRklMRVRJTUUJZnQ7CisKKyAgICBUUkFDRShyZWcsIigleCwlbGQsJXAsJWxkKVxuIixoa2V5LGlTdWJrZXksbHBzek5hbWUsbHBjY2hOYW1lKTsKKyAgICByZXR1cm4gUmVnRW51bUtleUV4MzJXKGhrZXksaVN1YmtleSxscHN6TmFtZSwmbHBjY2hOYW1lLE5VTEwsTlVMTCxOVUxMLCZmdCk7CiB9CisKKwogLyogUmVnRW51bUtleUV4QQkJW0FEVkFQSTMyLjEzOF0gKi8KIERXT1JEIFdJTkFQSSBSZWdFbnVtS2V5RXgzMkEoCiAJSEtFWQloa2V5LApAQCAtMjQ0OSw0MyArMjY5MywzMiBAQAogCXJldHVybiByZXQ7CiB9CiAKLS8qIFJlZ0VudW1LZXlBCQkJW0FEVkFQSTMyLjEzN10gKi8KLURXT1JEIFdJTkFQSSBSZWdFbnVtS2V5MzJBKAotCUhLRVkJaGtleSwKLQlEV09SRAlpU3Via2V5LAotCUxQU1RSCWxwc3pOYW1lLAotCURXT1JECWxwY2NoTmFtZQotKSB7Ci0JRklMRVRJTUUJZnQ7CiAKLQlUUkFDRShyZWcsIigleCwlbGQsJXAsJWxkKVxuIiwKLQkJaGtleSxpU3Via2V5LGxwc3pOYW1lLGxwY2NoTmFtZQotCSk7Ci0JcmV0dXJuCVJlZ0VudW1LZXlFeDMyQSgKLQkJaGtleSwKLQkJaVN1YmtleSwKLQkJbHBzek5hbWUsCi0JCSZscGNjaE5hbWUsCi0JCU5VTEwsCi0JCU5VTEwsCi0JCU5VTEwsCi0JCSZmdAotCSk7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSZWdFbnVtS2V5MzJBIFtBRFZBUEkzMi4xMzddCisgKi8KK0RXT1JEIFdJTkFQSSBSZWdFbnVtS2V5MzJBKCBIS0VZIGhrZXksIERXT1JEIGlTdWJrZXksIExQU1RSIGxwc3pOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGxwY2NoTmFtZSApCit7CisgICAgRklMRVRJTUUJZnQ7CisKKyAgICBUUkFDRShyZWcsIigleCwlbGQsJXAsJWxkKVxuIixoa2V5LGlTdWJrZXksbHBzek5hbWUsbHBjY2hOYW1lKTsKKyAgICByZXR1cm4gUmVnRW51bUtleUV4MzJBKCBoa2V5LCBpU3Via2V5LCBscHN6TmFtZSwgJmxwY2NoTmFtZSwgTlVMTCwgTlVMTCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgJmZ0ICk7CiB9CiAKLS8qIFJlZ0VudW1LZXkJCQlbU0hFTEwuN10gW0tFUk5FTC4yMTZdICovCi1EV09SRCBXSU5BUEkgUmVnRW51bUtleTE2KAotCUhLRVkJaGtleSwKLQlEV09SRAlpU3Via2V5LAotCUxQU1RSCWxwc3pOYW1lLAotCURXT1JECWxwY2NoTmFtZQotKSB7Ci0JVFJBQ0UocmVnLCIoJXgsJWxkLCVwLCVsZClcbiIsCi0JCWhrZXksaVN1YmtleSxscHN6TmFtZSxscGNjaE5hbWUKLQkpOwotCXJldHVybiBSZWdFbnVtS2V5MzJBKGhrZXksaVN1YmtleSxscHN6TmFtZSxscGNjaE5hbWUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSZWdFbnVtS2V5MTYgW1NIRUxMLjddIFtLRVJORUwuMjE2XQorICovCitEV09SRCBXSU5BUEkgUmVnRW51bUtleTE2KCBIS0VZIGhrZXksIERXT1JEIGlTdWJrZXksIExQU1RSIGxwc3pOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgbHBjY2hOYW1lICkKK3sKKyAgICBUUkFDRShyZWcsIigleCwlbGQsJXAsJWxkKVxuIixoa2V5LGlTdWJrZXksbHBzek5hbWUsbHBjY2hOYW1lKTsKKyAgICByZXR1cm4gUmVnRW51bUtleTMyQSggaGtleSwgaVN1YmtleSwgbHBzek5hbWUsIGxwY2NoTmFtZSk7CiB9CiAKKwogLyogCiAgKiBFbnVtZXJhdGUgUmVnaXN0cnkgVmFsdWVzCiAgKgpAQCAtMjQ5MywxMSArMjcyNiwxNCBAQAogICogUmVnRW51bVZhbHVlMTYgLT4gUmVnRW51bVZhbHVlMzJBIC0+IFJlZ0VudW1WYWx1ZTMyVwogICovCiAKLS8qIFJlZ0VudW1WYWx1ZVcJCVtBRFZBUEkzMi4xNDJdICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJlZ0VudW1WYWx1ZTMyVyBbQURWQVBJMzIuMTQyXQorICovCiBEV09SRCBXSU5BUEkgUmVnRW51bVZhbHVlMzJXKAotCUhLRVkJaGtleSwKLQlEV09SRAlpVmFsdWUsCi0JTFBXU1RSCWxwc3pWYWx1ZSwKKwlIS0VZIGhrZXksCisJRFdPUkQgaVZhbHVlLAorCUxQV1NUUiBscHN6VmFsdWUsCiAJTFBEV09SRAlscGNjaFZhbHVlLAogCUxQRFdPUkQJbHBkUmVzZXJ2ZWQsCiAJTFBEV09SRAlscGR3VHlwZSwKQEAgLTI1MTIsNyArMjc0OCw4IEBACiAJKTsKIAlscGtleSA9IGxvb2t1cF9oa2V5KGhrZXkpOwogCWlmICghbHBrZXkpCi0JCXJldHVybiBTSEVMTF9FUlJPUl9CQURLRVk7CisJCXJldHVybiBFUlJPUl9JTlZBTElEX0hBTkRMRTsKKwogCWlmIChscGtleS0+bnJvZnZhbHVlczw9aVZhbHVlKQogCQlyZXR1cm4gRVJST1JfTk9fTU9SRV9JVEVNUzsKIAl2YWwJPSBscGtleS0+dmFsdWVzK2lWYWx1ZTsKQEAgLTI1MzYsOSArMjc3MywxMCBAQAogCQltZW1jcHkobHBiRGF0YSx2YWwtPmRhdGEsdmFsLT5sZW4pOwogCQkqbHBjYkRhdGEgPSB2YWwtPmxlbjsKIAl9Ci0JcmV0dXJuIFNIRUxMX0VSUk9SX1NVQ0NFU1M7CisJcmV0dXJuIEVSUk9SX1NVQ0NFU1M7CiB9CiAKKwogLyogUmVnRW51bVZhbHVlQQkJW0FEVkFQSTMyLjE0MV0gKi8KIERXT1JEIFdJTkFQSSBSZWdFbnVtVmFsdWUzMkEoCiAJSEtFWQloa2V5LApAQCAtMjU5Niw2NSArMjgzNCw3NyBAQAogCXJldHVybiByZXQ7CiB9CiAKLS8qIFJlZ0VudW1WYWx1ZQkJCVtLRVJORUwuMjIzXSAqLwotRFdPUkQgV0lOQVBJIFJlZ0VudW1WYWx1ZTE2KAotCUhLRVkJaGtleSwKLQlEV09SRAlpVmFsdWUsCi0JTFBTVFIJbHBzelZhbHVlLAotCUxQRFdPUkQJbHBjY2hWYWx1ZSwKLQlMUERXT1JECWxwZFJlc2VydmVkLAotCUxQRFdPUkQJbHBkd1R5cGUsCi0JTFBCWVRFCWxwYkRhdGEsCi0JTFBEV09SRAlscGNiRGF0YQotKSB7Ci0JVFJBQ0UocmVnLCIoJXgsJWxkLCVwLCVwLCVwLCVwLCVwLCVwKVxuIiwKLQkJaGtleSxpVmFsdWUsbHBzelZhbHVlLGxwY2NoVmFsdWUsbHBkUmVzZXJ2ZWQsbHBkd1R5cGUsbHBiRGF0YSxscGNiRGF0YQotCSk7Ci0JcmV0dXJuIFJlZ0VudW1WYWx1ZTMyQSgKLQkJaGtleSwKLQkJaVZhbHVlLAotCQlscHN6VmFsdWUsCi0JCWxwY2NoVmFsdWUsCi0JCWxwZFJlc2VydmVkLAotCQlscGR3VHlwZSwKLQkJbHBiRGF0YSwKLQkJbHBjYkRhdGEKLQkpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSZWdFbnVtVmFsdWUxNiBbS0VSTkVMLjIyM10KKyAqLworRFdPUkQgV0lOQVBJIFJlZ0VudW1WYWx1ZTE2KCBIS0VZIGhrZXksIERXT1JEIGlWYWx1ZSwgTFBTVFIgbHBzelZhbHVlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEV09SRCBscGNjaFZhbHVlLCBMUERXT1JEIGxwZFJlc2VydmVkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEV09SRCBscGR3VHlwZSwgTFBCWVRFIGxwYkRhdGEsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUERXT1JEIGxwY2JEYXRhICkKK3sKKyAgICBUUkFDRShyZWcsIigleCwlbGQsJXAsJXAsJXAsJXAsJXAsJXApXG4iLGhrZXksaVZhbHVlLGxwc3pWYWx1ZSxscGNjaFZhbHVlLAorICAgICAgICAgIGxwZFJlc2VydmVkLGxwZHdUeXBlLGxwYkRhdGEsbHBjYkRhdGEpOworICAgIHJldHVybiBSZWdFbnVtVmFsdWUzMkEoIGhrZXksIGlWYWx1ZSwgbHBzelZhbHVlLCBscGNjaFZhbHVlLCBscGRSZXNlcnZlZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBkd1R5cGUsIGxwYkRhdGEsIGxwY2JEYXRhICk7CiB9CiAKLS8qIAotICogIENsb3NlIHJlZ2lzdHJ5IGtleQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSZWdDbG9zZUtleSBbU0hFTEwuM10gW0tFUk5FTC4yMjBdIFtBRFZBUEkzMi4xMjZdCisgKiBSZWxlYXNlcyB0aGUgaGFuZGxlIG9mIHRoZSBzcGVjaWZpZWQga2V5CisgKgorICogUEFSQU1TCisgKiAgICBoa2V5IFtJXSBIYW5kbGUgb2Yga2V5IHRvIGNsb3NlCisgKgorICogUkVUVVJOUworICogICAgU3VjY2VzczogRVJST1JfU1VDQ0VTUworICogICAgRmFpbHVyZTogRXJyb3IgY29kZQogICovCi0vKiBSZWdDbG9zZUtleQkJCVtTSEVMTC4zXSBbS0VSTkVMLjIyMF0gW0FEVkFQSTMyLjEyNl0gKi8KLURXT1JEIFdJTkFQSSBSZWdDbG9zZUtleShIS0VZIGhrZXkpIHsKLQlUUkFDRShyZWcsIigleClcbiIsaGtleSk7Ci0JcmVtb3ZlX2hhbmRsZShoa2V5KTsKLQlyZXR1cm4gRVJST1JfU1VDQ0VTUzsKK0RXT1JEIFdJTkFQSSBSZWdDbG9zZUtleSggSEtFWSBoa2V5ICkKK3sKKyAgICBUUkFDRShyZWcsIigleClcbiIsaGtleSk7CisgICAgcmV0dXJuIHJlbW92ZV9oYW5kbGUoaGtleSk7CiB9CisKKwogLyogCiAgKiBEZWxldGUgcmVnaXN0cnkga2V5CiAgKgogICogQ2FsbHBhdGg6CiAgKiBSZWdEZWxldGVLZXkxNiAtPiBSZWdEZWxldGVLZXkzMkEgLT4gUmVnRGVsZXRlS2V5MzJXCiAgKi8KLS8qIFJlZ0RlbGV0ZUtleVcJCVtBRFZBUEkzMi4xMzRdICovCi1EV09SRCBXSU5BUEkgUmVnRGVsZXRlS2V5MzJXKEhLRVkgaGtleSxMUFdTVFIgbHBzelN1YktleSkgeworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJlZ0RlbGV0ZUtleTMyVyBbQURWQVBJMzIuMTM0XQorICoKKyAqIFBBUkFNUworICogICAgaGtleSAgICAgICBbSV0KKyAqICAgIGxwc3pTdWJLZXkgW0ldCisgKgorICogUkVUVVJOUworICogICAgU3VjY2VzczogRVJST1JfU1VDQ0VTUworICogICAgRmFpbHVyZTogRXJyb3IgY29kZQorICovCitEV09SRCBXSU5BUEkgUmVnRGVsZXRlS2V5MzJXKCBIS0VZIGhrZXksIExQV1NUUiBscHN6U3ViS2V5ICkKK3sKIAlMUEtFWVNUUlVDVAkqbHBscFByZXZLZXksbHBOZXh0S2V5LGxweGtleTsKIAlMUFdTVFIJCSp3cHM7CiAJaW50CQl3cGMsaTsKIAotCVRSQUNFKHJlZywiKCV4LCVzKVxuIiwKLQkJaGtleSxXMkMobHBzelN1YktleSwwKQotCSk7Ci0JbHBOZXh0S2V5CT0gbG9va3VwX2hrZXkoaGtleSk7Ci0JaWYgKCFscE5leHRLZXkpIHsKLQkJVFJBQ0UocmVnLCAiICBCYWRrZXlbMV0uXG4iKTsKLQkJcmV0dXJuIFNIRUxMX0VSUk9SX0JBREtFWTsKLQl9CisgICAgVFJBQ0UocmVnLCIoJXgsJXMpXG4iLGhrZXksZGVidWdzdHJfdyhscHN6U3ViS2V5KSk7CisKKyAgICBscE5leHRLZXkgPSBsb29rdXBfaGtleShoa2V5KTsKKyAgICBpZiAoIWxwTmV4dEtleSkgeworICAgICAgICBUUkFDRShyZWcsICIgIEludmFsaWQgaGFuZGxlLlxuIik7CisgICAgICAgIHJldHVybiBFUlJPUl9JTlZBTElEX0hBTkRMRTsKKyAgICB9CisKIAkvKiB3ZSBuZWVkIHRvIGtub3cgdGhlIHByZXZpb3VzIGtleSBpbiB0aGUgaGllci4gKi8KIAlpZiAoIWxwc3pTdWJLZXkgfHwgISpscHN6U3ViS2V5KSB7CiAJCVRSQUNFKHJlZywgIiAgQmFka2V5WzJdLlxuIik7Ci0JCXJldHVybiBTSEVMTF9FUlJPUl9CQURLRVk7CisJCXJldHVybiBFUlJPUl9CQURLRVk7CiAJfQogCXNwbGl0X2tleXBhdGgobHBzelN1YktleSwmd3BzLCZ3cGMpOwogCWkgCT0gMDsKQEAgLTI2NzIsNyArMjkyMiw3IEBACiAJCQlGUkVFX0tFWV9QQVRIOwogCQkJVFJBQ0UocmVnLCAiICBOb3QgZm91bmQuXG4iKTsKIAkJCS8qIG5vdCBmb3VuZCBpcyBzdWNjZXNzICovCi0JCQlyZXR1cm4gU0hFTExfRVJST1JfU1VDQ0VTUzsKKwkJCXJldHVybiBFUlJPUl9TVUNDRVNTOwogCQl9CiAJCWkrKzsKIAkJbHBOZXh0S2V5CT0gbHB4a2V5OwpAQCAtMjY4NywxNSArMjkzNywxNyBAQAogCQlscGxwUHJldktleQk9ICYobHB4a2V5LT5uZXh0KTsKIAkJbHB4a2V5CQk9IGxweGtleS0+bmV4dDsKIAl9CisKIAlpZiAoIWxweGtleSkgewogCQlGUkVFX0tFWV9QQVRIOwogCQlXQVJOKHJlZyAsICIgIE5vdCBmb3VuZC5cbiIpOwotCQlyZXR1cm4gU0hFTExfRVJST1JfQkFES0VZOworCQlyZXR1cm4gRVJST1JfRklMRV9OT1RfRk9VTkQ7CiAJfQorCiAJaWYgKGxweGtleS0+bmV4dHN1YikgewogCQlGUkVFX0tFWV9QQVRIOwogCQlXQVJOKHJlZyAsICIgIE5vdCBlbXB0eS5cbiIpOwotCQlyZXR1cm4gU0hFTExfRVJST1JfQ0FOVFdSSVRFOworCQlyZXR1cm4gRVJST1JfQ0FOVFdSSVRFOwogCX0KIAkqbHBscFByZXZLZXkJPSBscHhrZXktPm5leHQ7CiAJZnJlZShscHhrZXktPmtleW5hbWUpOwpAQCAtMjcwNiw1MCArMjk1OCw2NSBAQAogCWZyZWUobHB4a2V5KTsKIAlGUkVFX0tFWV9QQVRIOwogCVRSQUNFKHJlZywgIiAgRG9uZS5cbiIpOwotCXJldHVybglTSEVMTF9FUlJPUl9TVUNDRVNTOworCXJldHVybglFUlJPUl9TVUNDRVNTOwogfQogCi0vKiBSZWdEZWxldGVLZXlBCQlbQURWQVBJMzIuMTMzXSAqLwotRFdPUkQgV0lOQVBJIFJlZ0RlbGV0ZUtleTMyQShIS0VZIGhrZXksTFBDU1RSIGxwc3pTdWJLZXkpIHsKLQlMUFdTVFIJbHBzelN1YktleVc7Ci0JRFdPUkQJcmV0OwogCi0JVFJBQ0UocmVnLCIoJXgsJXMpXG4iLAotCQloa2V5LGxwc3pTdWJLZXkKLQkpOwotCWxwc3pTdWJLZXlXPUhFQVBfc3RyZHVwQXRvVyhHZXRQcm9jZXNzSGVhcCgpLDAsbHBzelN1YktleSk7Ci0JcmV0PVJlZ0RlbGV0ZUtleTMyVyhoa2V5LGxwc3pTdWJLZXlXKTsKLQlIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsbHBzelN1YktleVcpOwotCXJldHVybiByZXQ7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSZWdEZWxldGVLZXkzMkEgW0FEVkFQSTMyLjEzM10KKyAqLworRFdPUkQgV0lOQVBJIFJlZ0RlbGV0ZUtleTMyQSggSEtFWSBoa2V5LCBMUENTVFIgbHBzelN1YktleSApCit7CisgICAgTFBXU1RSIGxwc3pTdWJLZXlXOworICAgIERXT1JEICByZXQ7CisKKyAgICBUUkFDRShyZWcsIigleCwlcylcbiIsaGtleSxscHN6U3ViS2V5KTsKKyAgICBscHN6U3ViS2V5VyA9IEhFQVBfc3RyZHVwQXRvVyggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbHBzelN1YktleSApOworICAgIHJldCA9IFJlZ0RlbGV0ZUtleTMyVyggaGtleSwgbHBzelN1YktleVcgKTsKKyAgICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbHBzelN1YktleVcgKTsKKyAgICByZXR1cm4gcmV0OwogfQogCi0vKiBSZWdEZWxldGVLZXkJCQlbU0hFTEwuNF0gW0tFUk5FTC4yMTldICovCi1EV09SRCBXSU5BUEkgUmVnRGVsZXRlS2V5MTYoSEtFWSBoa2V5LExQQ1NUUiBscHN6U3ViS2V5KSB7Ci0JVFJBQ0UocmVnLCIoJXgsJXMpXG4iLAotCQloa2V5LGxwc3pTdWJLZXkKLQkpOwotCXJldHVybiBSZWdEZWxldGVLZXkzMkEoaGtleSxscHN6U3ViS2V5KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmVnRGVsZXRlS2V5MTYgW1NIRUxMLjRdIFtLRVJORUwuMjE5XQorICovCitEV09SRCBXSU5BUEkgUmVnRGVsZXRlS2V5MTYoIEhLRVkgaGtleSwgTFBDU1RSIGxwc3pTdWJLZXkgKQoreworICAgIFRSQUNFKHJlZywiKCV4LCVzKVxuIixoa2V5LGRlYnVnc3RyX2EobHBzelN1YktleSkpOworICAgIHJldHVybiBSZWdEZWxldGVLZXkzMkEoIGhrZXksIGxwc3pTdWJLZXkgKTsKIH0KIAorCiAvKiAKICAqIERlbGV0ZSByZWdpc3RyeSB2YWx1ZQogICoKICAqIENhbGxwYXRoOgogICogUmVnRGVsZXRlVmFsdWUxNiAtPiBSZWdEZWxldGVWYWx1ZTMyQSAtPiBSZWdEZWxldGVWYWx1ZTMyVwogICovCi0vKiBSZWdEZWxldGVWYWx1ZVcJCVtBRFZBUEkzMi4xMzZdICovCi1EV09SRCBXSU5BUEkgUmVnRGVsZXRlVmFsdWUzMlcoSEtFWSBoa2V5LExQV1NUUiBscHN6VmFsdWUpCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmVnRGVsZXRlVmFsdWUzMlcgW0FEVkFQSTMyLjEzNl0KKyAqCisgKiBQQVJBTVMKKyAqICAgIGhrZXkgICAgICBbSV0KKyAqICAgIGxwc3pWYWx1ZSBbSV0KKyAqCisgKiBSRVRVUk5TCisgKi8KK0RXT1JEIFdJTkFQSSBSZWdEZWxldGVWYWx1ZTMyVyggSEtFWSBoa2V5LCBMUFdTVFIgbHBzelZhbHVlICkKIHsKIAlEV09SRAkJaTsKIAlMUEtFWVNUUlVDVAlscGtleTsKIAlMUEtFWVZBTFVFCXZhbDsKIAotCVRSQUNFKHJlZywiKCV4LCVzKVxuIiwKLQkJaGtleSxXMkMobHBzelZhbHVlLDApCi0JKTsKLQlscGtleT1sb29rdXBfaGtleShoa2V5KTsKLQlpZiAoIWxwa2V5KQotCQlyZXR1cm4gU0hFTExfRVJST1JfQkFES0VZOworICAgIFRSQUNFKHJlZywiKCV4LCVzKVxuIixoa2V5LGRlYnVnc3RyX3cobHBzelZhbHVlKSk7CisKKyAgICBscGtleSA9IGxvb2t1cF9oa2V5KGhrZXkpOworICAgIGlmICghbHBrZXkpCisgICAgICAgIHJldHVybiBFUlJPUl9JTlZBTElEX0hBTkRMRTsKKwogCWlmIChscHN6VmFsdWUpIHsKIAkJZm9yIChpPTA7aTxscGtleS0+bnJvZnZhbHVlcztpKyspCiAJCQlpZiAoCWxwa2V5LT52YWx1ZXNbaV0ubmFtZSAmJgpAQCAtMjc2MSw4ICszMDI4LDEwIEBACiAJCQlpZiAobHBrZXktPnZhbHVlc1tpXS5uYW1lPT1OVUxMKQogCQkJCWJyZWFrOwogCX0KLQlpZiAoaT09bHBrZXktPm5yb2Z2YWx1ZXMpCi0JCXJldHVybiBTSEVMTF9FUlJPUl9CQURLRVk7LypGSVhNRTogY29ycmVjdCBlcnJvcmNvZGU/ICovCisKKyAgICBpZiAoaSA9PSBscGtleS0+bnJvZnZhbHVlcykKKyAgICAgICAgcmV0dXJuIEVSUk9SX0ZJTEVfTk9UX0ZPVU5EOworCiAJdmFsCT0gbHBrZXktPnZhbHVlcytpOwogCWlmICh2YWwtPm5hbWUpIGZyZWUodmFsLT5uYW1lKTsKIAlpZiAodmFsLT5kYXRhKSBmcmVlKHZhbC0+ZGF0YSk7CkBAIC0yNzc2LDI3ICszMDQ1LDMzIEBACiAJCQkJKGxwa2V5LT5ucm9mdmFsdWVzLTEpKnNpemVvZihLRVlWQUxVRSkKIAkJCSk7CiAJbHBrZXktPm5yb2Z2YWx1ZXMtLTsKLQlyZXR1cm4gU0hFTExfRVJST1JfU1VDQ0VTUzsKKwlyZXR1cm4gRVJST1JfU1VDQ0VTUzsKIH0KIAotLyogUmVnRGVsZXRlVmFsdWVBCQlbQURWQVBJMzIuMTM1XSAqLwotRFdPUkQgV0lOQVBJIFJlZ0RlbGV0ZVZhbHVlMzJBKEhLRVkgaGtleSxMUFNUUiBscHN6VmFsdWUpCi17Ci0JTFBXU1RSCWxwc3pWYWx1ZVc7Ci0JRFdPUkQJcmV0OwogCi0JVFJBQ0UocmVnLCAiKCV4LCVzKVxuIiwgaGtleSxscHN6VmFsdWUgKTsKLSAgICAgICAgbHBzelZhbHVlVz1IRUFQX3N0cmR1cEF0b1coR2V0UHJvY2Vzc0hlYXAoKSwwLGxwc3pWYWx1ZSk7Ci0JcmV0PVJlZ0RlbGV0ZVZhbHVlMzJXKGhrZXksbHBzelZhbHVlVyk7Ci0gICAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxscHN6VmFsdWVXKTsKLQlyZXR1cm4gcmV0OworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmVnRGVsZXRlVmFsdWUzMkEgW0FEVkFQSTMyLjEzNV0KKyAqLworRFdPUkQgV0lOQVBJIFJlZ0RlbGV0ZVZhbHVlMzJBKCBIS0VZIGhrZXksIExQU1RSIGxwc3pWYWx1ZSApCit7CisgICAgTFBXU1RSIGxwc3pWYWx1ZVc7CisgICAgRFdPUkQgIHJldDsKKworICAgIFRSQUNFKHJlZywgIigleCwlcylcbiIsaGtleSxkZWJ1Z3N0cl9hKGxwc3pWYWx1ZSkpOworICAgIGxwc3pWYWx1ZVc9SEVBUF9zdHJkdXBBdG9XKEdldFByb2Nlc3NIZWFwKCksMCxscHN6VmFsdWUpOworICAgIHJldCA9IFJlZ0RlbGV0ZVZhbHVlMzJXKCBoa2V5LCBscHN6VmFsdWVXICk7CisgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLGxwc3pWYWx1ZVcpOworICAgIHJldHVybiByZXQ7CiB9CiAKLS8qIFJlZ0RlbGV0ZVZhbHVlCQlbS0VSTkVMLjIyMl0gKi8KLURXT1JEIFdJTkFQSSBSZWdEZWxldGVWYWx1ZTE2KEhLRVkgaGtleSxMUFNUUiBscHN6VmFsdWUpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJlZ0RlbGV0ZVZhbHVlMTYgW0tFUk5FTC4yMjJdCisgKi8KK0RXT1JEIFdJTkFQSSBSZWdEZWxldGVWYWx1ZTE2KCBIS0VZIGhrZXksIExQU1RSIGxwc3pWYWx1ZSApCiB7Ci0JVFJBQ0UocmVnLCIoJXgsJXMpXG4iLCBoa2V5LGxwc3pWYWx1ZSApOwotCXJldHVybiBSZWdEZWxldGVWYWx1ZTMyQShoa2V5LGxwc3pWYWx1ZSk7CisgICAgVFJBQ0UocmVnLCIoJXgsJXMpXG4iLCBoa2V5LGRlYnVnc3RyX2EobHBzelZhbHVlKSk7CisgICAgcmV0dXJuIFJlZ0RlbGV0ZVZhbHVlMzJBKGhrZXksbHBzelZhbHVlKTsKIH0KIAogCkBAIC0yODIwLDcgKzMwOTUsOSBAQAogCiAvKiBGSVhNRTogbHBjY2hYWFhYIC4uLiBpcyB0aGlzIGNvdW50aW5nIGluIFdDSEFSUyBvciBpbiBCWVRFcyA/PyAqLwogCi0vKiBSZWdRdWVyeUluZm9LZXlXCQlbQURWQVBJMzIuMTUzXSAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmVnUXVlcnlJbmZvS2V5MzJXIFtBRFZBUEkzMi4xNTNdCisgKi8KIERXT1JEIFdJTkFQSSBSZWdRdWVyeUluZm9LZXkzMlcoCiAJSEtFWQloa2V5LAogCUxQV1NUUglscHN6Q2xhc3MsCkBAIC0yODM2LDEzICszMTEzLDEzIEBACiAJRklMRVRJTUUJKmZ0CiApIHsKIAlMUEtFWVNUUlVDVAlscGtleSxscHhrZXk7Ci0JaW50CQlucm9ma2V5cyxtYXhzdWJrZXksbWF4Y2xhc3MsbWF4dmFsdWVzLG1heHZuYW1lLG1heHZkYXRhOworCWludAkJbnJvZmtleXMsbWF4c3Via2V5LG1heGNsYXNzLG1heHZuYW1lLG1heHZkYXRhOwogCWludAkJaTsKIAogCVRSQUNFKHJlZywiKCV4LC4uLi4uLilcbiIsaGtleSk7Ci0JbHBrZXk9bG9va3VwX2hrZXkoaGtleSk7CisJbHBrZXkgPSBsb29rdXBfaGtleShoa2V5KTsKIAlpZiAoIWxwa2V5KQotCQlyZXR1cm4gU0hFTExfRVJST1JfQkFES0VZOworCQlyZXR1cm4gRVJST1JfSU5WQUxJRF9IQU5ETEU7CiAJaWYgKGxwc3pDbGFzcykgewogCQlpZiAobHBrZXktPmNsYXNzKSB7CiAJCQlpZiAobHN0cmxlbjMyVyhscGtleS0+Y2xhc3MpKjIrMj4qbHBjY2hDbGFzcykgewpAQCAtMjg2MCw0MiArMzEzNyw0MSBAQAogCQkJKmxwY2NoQ2xhc3MJPSBsc3RybGVuMzJXKGxwa2V5LT5jbGFzcykqMjsKIAl9CiAJbHB4a2V5PWxwa2V5LT5uZXh0c3ViOwotCW5yb2ZrZXlzPW1heHN1YmtleT1tYXhjbGFzcz1tYXh2YWx1ZXM9bWF4dm5hbWU9bWF4dmRhdGE9MDsKKwlucm9ma2V5cz1tYXhzdWJrZXk9bWF4Y2xhc3M9bWF4dm5hbWU9bWF4dmRhdGE9MDsKIAl3aGlsZSAobHB4a2V5KSB7CiAJCW5yb2ZrZXlzKys7CiAJCWlmIChsc3RybGVuMzJXKGxweGtleS0+a2V5bmFtZSk+bWF4c3Via2V5KQogCQkJbWF4c3Via2V5PWxzdHJsZW4zMlcobHB4a2V5LT5rZXluYW1lKTsKIAkJaWYgKGxweGtleS0+Y2xhc3MgJiYgbHN0cmxlbjMyVyhscHhrZXktPmNsYXNzKT5tYXhjbGFzcykKIAkJCW1heGNsYXNzPWxzdHJsZW4zMlcobHB4a2V5LT5jbGFzcyk7Ci0JCWlmIChscHhrZXktPm5yb2Z2YWx1ZXM+bWF4dmFsdWVzKQotCQkJbWF4dmFsdWVzPWxweGtleS0+bnJvZnZhbHVlczsKLQkJZm9yIChpPTA7aTxscHhrZXktPm5yb2Z2YWx1ZXM7aSsrKSB7Ci0JCQlMUEtFWVZBTFVFCXZhbD1scHhrZXktPnZhbHVlcytpOwotCi0JCQlpZiAodmFsLT5uYW1lICYmIGxzdHJsZW4zMlcodmFsLT5uYW1lKT5tYXh2bmFtZSkKLQkJCQltYXh2bmFtZT1sc3RybGVuMzJXKHZhbC0+bmFtZSk7Ci0JCQlpZiAodmFsLT5sZW4+bWF4dmRhdGEpCi0JCQkJbWF4dmRhdGE9dmFsLT5sZW47Ci0JCX0KIAkJbHB4a2V5PWxweGtleS0+bmV4dDsKIAl9CisJZm9yIChpPTA7aTxscGtleS0+bnJvZnZhbHVlcztpKyspIHsKKwkJTFBLRVlWQUxVRQl2YWw9bHBrZXktPnZhbHVlcytpOworCisJCWlmICh2YWwtPm5hbWUgJiYgbHN0cmxlbjMyVyh2YWwtPm5hbWUpPm1heHZuYW1lKQorCQkJbWF4dm5hbWU9bHN0cmxlbjMyVyh2YWwtPm5hbWUpOworCQlpZiAodmFsLT5sZW4+bWF4dmRhdGEpCisJCQltYXh2ZGF0YT12YWwtPmxlbjsKKwl9CiAJaWYgKCFtYXhjbGFzcykgbWF4Y2xhc3MJPSAxOwogCWlmICghbWF4dm5hbWUpIG1heHZuYW1lCT0gMTsKKwlpZiAobHBjVmFsdWVzKQorCQkqbHBjVmFsdWVzCT0gbHBrZXktPm5yb2Z2YWx1ZXM7CiAJaWYgKGxwY1N1YktleXMpCiAJCSpscGNTdWJLZXlzCT0gbnJvZmtleXM7CiAJaWYgKGxwY2NoTWF4U3Via2V5KQogCQkqbHBjY2hNYXhTdWJrZXkJPSBtYXhzdWJrZXkqMjsKIAlpZiAobHBjY2hNYXhDbGFzcykKIAkJKmxwY2NoTWF4Q2xhc3MJPSBtYXhjbGFzcyoyOwotCWlmIChscGNWYWx1ZXMpCi0JCSpscGNWYWx1ZXMJPSBtYXh2YWx1ZXM7CiAJaWYgKGxwY2NoTWF4VmFsdWVOYW1lKQogCQkqbHBjY2hNYXhWYWx1ZU5hbWU9IG1heHZuYW1lOwogCWlmIChscGNjYk1heFZhbHVlRGF0YSkKIAkJKmxwY2NiTWF4VmFsdWVEYXRhPSBtYXh2ZGF0YTsKLQlyZXR1cm4gU0hFTExfRVJST1JfU1VDQ0VTUzsKKwlyZXR1cm4gRVJST1JfU1VDQ0VTUzsKIH0KIAorCiAvKiBSZWdRdWVyeUluZm9LZXlBCQlbQURWQVBJMzIuMTUyXSAqLwogRFdPUkQgV0lOQVBJIFJlZ1F1ZXJ5SW5mb0tleTMyQSgKIAlIS0VZCWhrZXksCkBAIC0yOTQ5LDExICszMjI1LDI4IEBACiAJCWZyZWUobHBzekNsYXNzVyk7CiAJcmV0dXJuIHJldDsKIH0KLS8qIFJlZ0Nvbm5lY3RSZWdpc3RyeUEJCVtBRFZBUEkzMi4xMjddICovCi1EV09SRCBXSU5BUEkgUmVnQ29ubmVjdFJlZ2lzdHJ5MzJBKExQQ1NUUiBtYWNoaW5lLEhLRVkgaGtleSxMUEhLRVkgcmVza2V5KQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJlZ0Nvbm5lY3RSZWdpc3RyeTMyVyBbQURWQVBJMzIuMTI4XQorICovCitMT05HIFdJTkFQSSBSZWdDb25uZWN0UmVnaXN0cnkzMlcoIExQQ1dTVFIgbWFjaGluZSwgSEtFWSBoa2V5LCBMUEhLRVkgcmVza2V5ICkKIHsKLQlGSVhNRShyZWcsIiglcywlMDh4LCVwKTpzdHViLlxuIixtYWNoaW5lLGhrZXkscmVza2V5KTsKLQlyZXR1cm4gRVJST1JfRklMRV9OT1RfRk9VTkQ7IC8qIEZJWE1FICovCisgICAgRklYTUUocmVnLCIoJXMsJXgsJXApOiBzdHViXG4iLGRlYnVnc3RyX3cobWFjaGluZSksaGtleSxyZXNrZXkpOworICAgIHJldHVybiBFUlJPUl9CQURfTkVUUEFUSDsgLyogRklYTUUgKi8KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSZWdDb25uZWN0UmVnaXN0cnkzMkEgW0FEVkFQSTMyLjEyN10KKyAqLworTE9ORyBXSU5BUEkgUmVnQ29ubmVjdFJlZ2lzdHJ5MzJBKCBMUENTVFIgbWFjaGluZSwgSEtFWSBoa2V5LCBMUEhLRVkgcmVza2V5ICkKK3sKKyAgICBEV09SRCByZXQ7CisgICAgTFBXU1RSIG1hY2hpbmVXID0gSEVBUF9zdHJkdXBBdG9XKEdldFByb2Nlc3NIZWFwKCksMCxtYWNoaW5lKTsKKyAgICByZXQgPSBSZWdDb25uZWN0UmVnaXN0cnkzMlcoIG1hY2hpbmVXLCBoa2V5LCByZXNrZXkgKTsKKyAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsbWFjaGluZVcpOworICAgIHJldHVybiByZXQ7CiB9CiAKIApAQCAtMjk2MSwyMCArMzI1NCw2MSBAQAogICogUmVnR2V0S2V5U2VjdXJpdHkgW0FEVkFQSTMyLjE0NF0KICAqIFJldHJpZXZlcyBhIGNvcHkgb2Ygc2VjdXJpdHkgZGVzY3JpcHRvciBwcm90ZWN0aW5nIHRoZSByZWdpc3RyeSBrZXkKICAqCi0gKiBOT1RFUwotICogICAgcFNlY3VyaXR5RGVzY3JpcHRvciBzaG91bGQgYmUgUFNFQ1VSSVRZX0RFU0NSSVBUT1IKLSAqCiAgKiBSRVRVUk5TCiAgKiAgICBTdWNjZXNzOiBFUlJPUl9TVUNDRVNTCiAgKiAgICBGYWlsdXJlOiBFcnJvciBjb2RlCiAgKi8KLUxPTkcgV0lOQVBJIFJlZ0dldEtleVNlY3VyaXR5KCBIS0VZIGhLZXksIAorTE9ORyBXSU5BUEkgUmVnR2V0S2V5U2VjdXJpdHkoIEhLRVkgaGtleSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VDVVJJVFlfSU5GT1JNQVRJT04gU2VjdXJpdHlJbmZvcm1hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFZPSUQgcFNlY3VyaXR5RGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFNFQ1VSSVRZX0RFU0NSSVBUT1IgcFNlY3VyaXR5RGVzY3JpcHRvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUERXT1JEIGxwY2JTZWN1cml0eURlc2NyaXB0b3IgKQogewotICAgIEZJWE1FKHJlZywgIiglZCwlbGQsJXAsJXApOiBzdHViXG4iLCBoS2V5LCBTZWN1cml0eUluZm9ybWF0aW9uLAorICAgIExQS0VZU1RSVUNUCWxwa2V5OworICAgIGxwa2V5ID0gbG9va3VwX2hrZXkoaGtleSk7CisgICAgaWYgKCFscGtleSkKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lOVkFMSURfSEFORExFOworCisgICAgRklYTUUocmVnLCAiKCVkLCVsZCwlcCwlcCk6IHN0dWJcbiIsIGhrZXksIFNlY3VyaXR5SW5mb3JtYXRpb24sCiAgICAgICAgICAgcFNlY3VyaXR5RGVzY3JpcHRvciwgbHBjYlNlY3VyaXR5RGVzY3JpcHRvcik7CiAgICAgcmV0dXJuIEVSUk9SX1NVQ0NFU1M7CiB9CiAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmVnTG9hZEtleTMyVyBbQURWQVBJMzIuPz8/XQorICovCitMT05HIFdJTkFQSSBSZWdMb2FkS2V5MzJXKCBIS0VZIGhrZXksIExQQ1dTVFIgbHBzelN1YktleSwgTFBDV1NUUiBscHN6RmlsZSApCit7CisgICAgRklYTUUocmVnLCIoJXgsJXMsJXMpOiBzdHViXG4iLGhrZXksZGVidWdzdHJfdyhscHN6U3ViS2V5KSwKKyAgICAgICAgICBkZWJ1Z3N0cl93KGxwc3pGaWxlKSk7CisgICAgcmV0dXJuIEVSUk9SX1NVQ0NFU1M7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmVnTG9hZEtleTMyQSBbQURWQVBJMzIuPz8/XQorICovCitMT05HIFdJTkFQSSBSZWdMb2FkS2V5MzJBKCBIS0VZIGhrZXksIExQQ1NUUiBscHN6U3ViS2V5LCBMUENTVFIgbHBzekZpbGUgKQoreworICAgIExPTkcgcmV0OworICAgIExQV1NUUiBscHN6U3ViS2V5VyA9IEhFQVBfc3RyZHVwQXRvVyhHZXRQcm9jZXNzSGVhcCgpLDAsbHBzelN1YktleSk7CisgICAgTFBXU1RSIGxwc3pGaWxlVyA9IEhFQVBfc3RyZHVwQXRvVyhHZXRQcm9jZXNzSGVhcCgpLDAsbHBzekZpbGUpOworICAgIHJldCA9IFJlZ0xvYWRLZXkzMlcoIGhrZXksIGxwc3pTdWJLZXlXLCBscHN6RmlsZVcgKTsKKyAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsbHBzekZpbGVXKTsKKyAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsbHBzelN1YktleVcpOworICAgIHJldHVybiByZXQ7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmVnTm90aWZ5Q2hhbmdlS2V5VmFsdWUgW0FEVkFQSTMyLj8/P10KKyAqLworTE9ORyBXSU5BUEkgUmVnTm90aWZ5Q2hhbmdlS2V5VmFsdWUoIEhLRVkgaGtleSwgQk9PTDMyIGZXYXRjaFN1YlRyZWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGZkd05vdGlmeUZpbHRlciwgSEFORExFMzIgaEV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wzMiBmQXN5bmMgKQoreworICAgIEZJWE1FKHJlZywiKCV4LCVpLCVsZCwlZCwlaSk6IHN0dWJcbiIsaGtleSxmV2F0Y2hTdWJUcmVlLGZkd05vdGlmeUZpbHRlciwKKyAgICAgICAgICBoRXZlbnQsZkFzeW5jKTsKKyAgICByZXR1cm4gRVJST1JfU1VDQ0VTUzsKK30KKwpkaWZmIC0tZ2l0IGEvbWlzYy9zaGVsbC5jIGIvbWlzYy9zaGVsbC5jCmluZGV4IGVjZWExNGQuLjA1MjBkNjkgMTAwNjQ0Ci0tLSBhL21pc2Mvc2hlbGwuYworKysgYi9taXNjL3NoZWxsLmMKQEAgLTc5NCw5ICs3OTQsMTQgQEAKICAgX2xsc2VlazMyKCBoRmlsZSwgMCwgU0VFS19TRVQgKTsKICAgaWYgKAkoX2xyZWFkMzIoaEZpbGUsJm16X2hlYWRlcixzaXplb2YobXpfaGVhZGVyKSkgIT0gc2l6ZW9mKG16X2hlYWRlcikpIHx8CiAgIAkobXpfaGVhZGVyLmVfbWFnaWMgIT0gSU1BR0VfRE9TX1NJR05BVFVSRSkKLSAgKQotICAJcmV0dXJuIDA7Ci0KKyAgKSB7IC8qIC5JQ08gZmlsZSA/ICovCisgICAgICAgIGlmIChtel9oZWFkZXIuZV9jYmxwID09IDEpIHsgLyogSUNPTkhFQURFUi5pZFR5cGUsIG11c3QgYmUgMSAqLworCSAgICAqcmV0cHRyID0gKExQQllURSktMTsKKyAgCSAgICByZXR1cm4gMTsKKwl9CisJZWxzZQorCSAgICByZXR1cm4gMDsgLyogZmFpbGVkICovCisgIH0KICAgX2xsc2VlazMyKCBoRmlsZSwgbXpfaGVhZGVyLmVfbGZhbmV3LCBTRUVLX1NFVCApOwogICBpZiAoX2xyZWFkMzIoIGhGaWxlLCBtYWdpYywgc2l6ZW9mKG1hZ2ljKSApICE9IHNpemVvZihtYWdpYykpCiAJcmV0dXJuIDA7CkBAIC04MjUsMTAgKzgzMCw5IEBACiAJICAgIH0KIAl9CiAgIAkqcmV0cHRyID0gcFR5cGVJbmZvOworICAgICAgICByZXR1cm4gSU1BR0VfT1MyX1NJR05BVFVSRTsKICAgfSBlbHNlCi0gIAkqcmV0cHRyID0gKExQQllURSktMTsKLSAgcmV0dXJuIElNQUdFX09TMl9TSUdOQVRVUkU7IC8qIGhhbmRsZXMgLklDTyB0b28gKi8KLQorICAJcmV0dXJuIDA7IC8qIGZhaWxlZCAqLwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtOTQ1LDcgKzk0OSw4IEBACiAKICAgc2lnID0gU0hFTExfR2V0UmVzb3VyY2VUYWJsZShoRmlsZSwmcERhdGEpOwogCi0gIGlmKHNpZyA9PSBJTUFHRV9PUzJfU0lHTkFUVVJFKQorICBpZigoc2lnID09IElNQUdFX09TMl9TSUdOQVRVUkUpCisgIHx8IChzaWcgPT0gMSkpIC8qIC5JQ08gZmlsZSAqLwogICB7CiAgICAgSElDT04xNgkgaEljb24gPSAwOwogICAgIE5FX1RZUEVJTkZPKiBwVEluZm8gPSAoTkVfVFlQRUlORk8qKShwRGF0YSArIDIpOwpkaWZmIC0tZ2l0IGEvbWlzYy9zaGVsbG9yZC5jIGIvbWlzYy9zaGVsbG9yZC5jCmluZGV4IGEyMWFiOGEuLjM0NGVhMTEgMTAwNjQ0Ci0tLSBhL21pc2Mvc2hlbGxvcmQuYworKysgYi9taXNjL3NoZWxsb3JkLmMKQEAgLTUyMSw3ICs1MjEsNyBAQAogCQlzdHJjcHkoYnVmLCJEZXNrdG9wIik7CiAJTG9hZFN0cmluZzMyQShobW9kLGlkLGJ1ZjIsMTAwKTsKIAkvKiBGSVhNRTogdGhlIHZhcmFyZ3MgaGFuZGxpbmcgZG9lc24ndC4gKi8KLQlGb3JtYXRNZXNzYWdlMzJBKDB4NTAwLGJ1ZjIsMCwwLCZidWYzLDI1NiwmYXJncyk7CisJRm9ybWF0TWVzc2FnZTMyQSgweDUwMCxidWYyLDAsMCwoTFBTVFIpJmJ1ZjMsMjU2LChMUERXT1JEKSZhcmdzKTsKIAogCUZJWE1FKHNoZWxsLCIoJTA4bHgsJTA4bHgsJTA4bHgoJXMpLCUwOGx4KCVzKSwlMDhseCwlcCk6c3R1Yi5cbiIsCiAJCShEV09SRClobW9kLChEV09SRClod25kLGlkLGJ1ZjIseCxidWYsdHlwZSxhcmdsaXN0CkBAIC02NjAsMyArNjYwLDE0IEBACiAJcmV0dXJuIFNIRUxMMzJfMTk1KHgpOwogfQogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU0hFTEwzMl84NSBbU0hFTEwzMi44NV0KKyAqIHVua25vd24KKyAqLworRFdPUkQgV0lOQVBJIFNIRUxMMzJfODUoRFdPUkQgeDEsRFdPUkQgeDIsRFdPUkQgeDMsRFdPUkQgeDQpIHsKKyAgICBGSVhNRShzaGVsbCwiKDB4JTA4bHgsMHglMDhseCwweCUwOGx4LDB4JTA4bHgpOnN0dWIuXG4iLAorICAgIAl4MSx4Mix4Myx4NAorICAgICk7CisgICAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL21pc2Mvc3B5LmMgYi9taXNjL3NweS5jCmluZGV4IDJkNTM1N2MuLjk3OWFkMjMgMTAwNjQ0Ci0tLSBhL21pc2Mvc3B5LmMKKysrIGIvbWlzYy9zcHkuYwpAQCAtNjY5LDggKzY2OSwxMSBAQAogCiAgICAgICAgICAgICBpZiAoaFRhc2sgPT0gR2V0Q3VycmVudFRhc2soKSkgc3RyY3B5KCB0YXNrTmFtZSwgInNlbGYiICk7CiAgICAgICAgICAgICBlbHNlIGlmICghaFRhc2spIHN0cmNweSggdGFza05hbWUsICJXaW5lIiApOwotICAgICAgICAgICAgZWxzZSBzcHJpbnRmKCB0YXNrTmFtZSwgInRhc2sgJTA0eCAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGhUYXNrLCBNT0RVTEVfR2V0TW9kdWxlTmFtZShoVGFzaykgKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzcHJpbnRmKCB0YXNrTmFtZSwgInRhc2sgJTA0eCA/Pz8iLCBoVGFzayApOworICAgICAgICAgICAgICAgIEdldE1vZHVsZU5hbWUoIGhUYXNrLCB0YXNrTmFtZSArIDEwLCBzaXplb2YodGFza05hbWUpIC0gMTAgKTsKKyAgICAgICAgICAgIH0KIAkgICAgcG5hbWUgPSBTUFlfR2V0V25kTmFtZShoV25kKTsKIAogICAgICAgICAgICAgaWYgKGlGbGFnID09IFNQWV9TRU5ETUVTU0FHRTE2KQpAQCAtNzE4LDM5ICs3MjEsMzkgQEAKICAgICBzd2l0Y2goaUZsYWcpCiAgICAgewogICAgIGNhc2UgU1BZX1JFU1VMVF9ERUZXTkQxNjoKLQlUUkFDRShtZXNzYWdlLCIlKnMoJTA0eCkgIERlZldpbmRvd1Byb2MxNjogJXMgWyUwNHhdIHJldHVybmVkICUwOGx4XG4iLAorCVRSQUNFKG1lc3NhZ2UsIiAlKnMoJTA0eCkgIERlZldpbmRvd1Byb2MxNjogJXMgWyUwNHhdIHJldHVybmVkICUwOGx4XG4iLAogCQkJU1BZX0luZGVudExldmVsLCAiIiwgaFduZCwgU1BZX0dldE1zZ05hbWUoIG1zZyApLCBtc2csIGxSZXR1cm4gKTsKIAlicmVhazsKIAogICAgIGNhc2UgU1BZX1JFU1VMVF9ERUZXTkQzMjoKLQlUUkFDRShtZXNzYWdlLCIlKnMoJTA4eCkgIERlZldpbmRvd1Byb2MzMjogJXMgWyUwNHhdIHJldHVybmVkICUwOGx4XG4iLAorCVRSQUNFKG1lc3NhZ2UsIiAlKnMoJTA4eCkgIERlZldpbmRvd1Byb2MzMjogJXMgWyUwNHhdIHJldHVybmVkICUwOGx4XG4iLAogCQkJU1BZX0luZGVudExldmVsLCAiIiwgaFduZCwgU1BZX0dldE1zZ05hbWUoIG1zZyApLCBtc2csIGxSZXR1cm4gKTsKIAlicmVhazsKIAogICAgIGNhc2UgU1BZX1JFU1VMVF9PSzE2OgogCXBuYW1lID0gU1BZX0dldFduZE5hbWUoaFduZCk7Ci0gICAgICAgIFRSQUNFKG1lc3NhZ2UsIiUqcyglMDR4KSAlLTE2cyBtZXNzYWdlIFslMDR4XSAlcyByZXR1cm5lZCAlMDhseFxuIiwKKyAgICAgICAgVFJBQ0UobWVzc2FnZSwiICUqcyglMDR4KSAlLTE2cyBtZXNzYWdlIFslMDR4XSAlcyByZXR1cm5lZCAlMDhseFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIFNQWV9JbmRlbnRMZXZlbCwgIiIsIGhXbmQsIHBuYW1lLCBtc2csCiAgICAgICAgICAgICAgICAgICAgICAgICBTUFlfR2V0TXNnTmFtZSggbXNnICksIGxSZXR1cm4gKTsKICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIFNQWV9SRVNVTFRfT0szMjoKIAlwbmFtZSA9IFNQWV9HZXRXbmROYW1lKGhXbmQpOwotICAgICAgICBUUkFDRShtZXNzYWdlLCIlKnMoJTA4eCkgJS0xNnMgbWVzc2FnZSBbJTA0eF0gJXMgcmV0dXJuZWQgJTA4bHhcbiIsCisgICAgICAgIFRSQUNFKG1lc3NhZ2UsIiAlKnMoJTA4eCkgJS0xNnMgbWVzc2FnZSBbJTA0eF0gJXMgcmV0dXJuZWQgJTA4bHhcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBTUFlfSW5kZW50TGV2ZWwsICIiLCBoV25kLCBwbmFtZSwgbXNnLAogICAgICAgICAgICAgICAgICAgICAgICAgU1BZX0dldE1zZ05hbWUoIG1zZyApLCBsUmV0dXJuICk7CiAgICAgICAgIGJyZWFrOyAKIAogICAgIGNhc2UgU1BZX1JFU1VMVF9JTlZBTElESFdORDE2OgogCXBuYW1lID0gU1BZX0dldFduZE5hbWUoaFduZCk7Ci0gICAgICAgIFdBUk4obWVzc2FnZSwgIiUqcyglMDR4KSAlLTE2cyBtZXNzYWdlIFslMDR4XSAlcyBIQVMgSU5WQUxJRCBIV05EXG4iLAorICAgICAgICBXQVJOKG1lc3NhZ2UsICIgJSpzKCUwNHgpICUtMTZzIG1lc3NhZ2UgWyUwNHhdICVzIEhBUyBJTlZBTElEIEhXTkRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBTUFlfSW5kZW50TGV2ZWwsICIiLCBoV25kLCBwbmFtZSwgbXNnLAogICAgICAgICAgICAgICAgICAgICAgICAgU1BZX0dldE1zZ05hbWUoIG1zZyApICk7CiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBTUFlfUkVTVUxUX0lOVkFMSURIV05EMzI6CiAJcG5hbWUgPSBTUFlfR2V0V25kTmFtZShoV25kKTsKLSAgICAgICAgV0FSTihtZXNzYWdlLCAiJSpzKCUwOHgpICUtMTZzIG1lc3NhZ2UgWyUwNHhdICVzIEhBUyBJTlZBTElEIEhXTkRcbiIsCisgICAgICAgIFdBUk4obWVzc2FnZSwgIiAlKnMoJTA4eCkgJS0xNnMgbWVzc2FnZSBbJTA0eF0gJXMgSEFTIElOVkFMSUQgSFdORFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIFNQWV9JbmRlbnRMZXZlbCwgIiIsIGhXbmQsIHBuYW1lLCBtc2csCiAgICAgICAgICAgICAgICAgICAgICAgICBTUFlfR2V0TXNnTmFtZSggbXNnICkgKTsKICAgICAgICAgYnJlYWs7CmRpZmYgLS1naXQgYS9taXNjL3dpbnNvY2suYyBiL21pc2Mvd2luc29jay5jCmluZGV4IDUwNWFkZmQuLjI0ZDUyNDIgMTAwNjQ0Ci0tLSBhL21pc2Mvd2luc29jay5jCisrKyBiL21pc2Mvd2luc29jay5jCkBAIC0yNTgxLDExICsyNTgxLDEwIEBACiBVSU5UMTYgd3NhRXJybm8odm9pZCkKIHsKICAgICBpbnQJbG9jX2Vycm5vID0gZXJybm87IAotI2lmIGRlZmluZWQoX19GcmVlQlNEX18pCi0gICAgICAgRVJSKHdpbnNvY2ssICJlcnJubyAlZCwgKCVzKS5cbiIsIAotICAgICAgICAgICAgICAgIAkJCSBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsKKyNpZmRlZiBIQVZFX1NUUkVSUk9SCisgICAgV0FSTih3aW5zb2NrLCAiZXJybm8gJWQsICglcykuXG4iLCBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsKICNlbHNlCi0gICAgICAgRVJSKHdpbnNvY2ssICJlcnJubyAlZFxuIiwgZXJybm8pOworICAgIFdBUk4od2luc29jaywgImVycm5vICVkXG4iLCBlcnJubyk7CiAjZW5kaWYKIAogICAgIHN3aXRjaChsb2NfZXJybm8pCkBAIC0yNjU3LDExICsyNjU2LDEwIEBACiB7CiAgICAgaW50CQlsb2NfZXJybm8gPSBoX2Vycm5vOwogCi0jaWYgZGVmaW5lZChfX0ZyZWVCU0RfXykKLSAgICBFUlIod2luc29jaywgImhfZXJybm8gJWQsICglcykuXG4iLCAKLSAgICAgICAgICAgICAgIAkgICAgaF9lcnJubywgc3RyZXJyb3IoaF9lcnJubykpOworI2lmZGVmIEhBVkVfU1RSRVJST1IKKyAgICBXQVJOKHdpbnNvY2ssICJoX2Vycm5vICVkLCAoJXMpLlxuIiwgaF9lcnJubywgc3RyZXJyb3IoaF9lcnJubykpOwogI2Vsc2UKLSAgICBFUlIod2luc29jaywgImhfZXJybm8gJWQuXG4iLCBoX2Vycm5vKTsKKyAgICBXQVJOKHdpbnNvY2ssICJoX2Vycm5vICVkLlxuIiwgaF9lcnJubyk7CiAjZW5kaWYKIAogICAgIHN3aXRjaChsb2NfZXJybm8pCmRpZmYgLS1naXQgYS9taXNjZW11L21haW4uYyBiL21pc2NlbXUvbWFpbi5jCmluZGV4IGU3YzZlOWYuLjFmNTNjODkgMTAwNjQ0Ci0tLSBhL21pc2NlbXUvbWFpbi5jCisrKyBiL21pc2NlbXUvbWFpbi5jCkBAIC0zLDEwICszLDEwIEBACiAgKgogICovCiAKLSNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJjYWxsYmFjay5oIgogI2luY2x1ZGUgImRlYnVnZ2VyLmgiCisjaW5jbHVkZSAibWFpbi5oIgogI2luY2x1ZGUgIm1pc2NlbXUuaCIKICNpbmNsdWRlICJtb2R1bGUuaCIKICNpbmNsdWRlICJvcHRpb25zLmgiCkBAIC0xOCw4ICsxOCw2IEBACiAgKi8KIEJPT0wzMiBNQUlOX0VtdWxhdG9ySW5pdCh2b2lkKQogewotICAgIGV4dGVybiBCT09MMzIgTUFJTl9LZXJuZWxJbml0KHZvaWQpOwotICAgIGV4dGVybiBCT09MMzIgTUFJTl9Vc2VySW5pdCh2b2lkKTsKICAgICBleHRlcm4gQk9PTDMyIFdJTjE2RFJWX0luaXQodm9pZCk7CiAgICAgZXh0ZXJuIEJPT0wzMiBSRUxBWV9Jbml0KHZvaWQpOwogCkBAIC00Niw3ICs0NCw2IEBACiBpbnQgbWFpbiggaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSApCiB7CiAgICAgZXh0ZXJuIEJPT0wzMiBQUk9DRVNTX0luaXQodm9pZCk7Ci0gICAgZXh0ZXJuIEJPT0wzMiBNQUlOX1dpbmVJbml0KCBpbnQgKmFyZ2MsIGNoYXIgKmFyZ3ZbXSApOwogICAgIGV4dGVybiB2b2lkICpDQUxMMzJfSW5pdCh2b2lkKTsKICAgICBleHRlcm4gY2hhciAqIERFQlVHX2FyZ3YwOwogCkBAIC0xMDcsNyArMTA0LDYgQEAKICAgICB9CiAKICAgICBpZiAoIWxvYWRlZCkgeyAvKiBub3RoaW5nIGxvYWRlZCAqLwotICAgIAlleHRlcm4gdm9pZCBNQUlOX1VzYWdlKGNoYXIqKTsKICAgICAJTUFJTl9Vc2FnZShhcmd2WzBdKTsKIAlyZXR1cm4gMTsKICAgICB9CmRpZmYgLS1naXQgYS9tc2Rvcy9kcG1pLmMgYi9tc2Rvcy9kcG1pLmMKaW5kZXggYTQ1MjU5Mi4uMzZkNzA1OCAxMDA2NDQKLS0tIGEvbXNkb3MvZHBtaS5jCisrKyBiL21zZG9zL2RwbWkuYwpAQCAtMjI0LDEzICsyMjQsMTQgQEAKICAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgaWYgKEVGTF9yZWcoY29udGV4dCkmMSkKKyAgICBpZiAoRUZMX3JlZyhjb250ZXh0KSYxKSB7CiAgICAgICBGSVhNRShpbnQzMSwiJTAyeDogRUFYPSUwOGx4IEVCWD0lMDhseCBFQ1g9JTA4bHggRURYPSUwOGx4XG4iLAogCSAgICBCTF9yZWcoY29udGV4dCksIEVBWF9yZWcoJnJlYWxtb2RlX2N0eCksIEVCWF9yZWcoJnJlYWxtb2RlX2N0eCksIAogCSAgICBFQ1hfcmVnKCZyZWFsbW9kZV9jdHgpLCBFRFhfcmVnKCZyZWFsbW9kZV9jdHgpKTsKICAgICAgIEZJWE1FKGludDMxLCIgICAgICBFU0k9JTA4bHggRURJPSUwOGx4IERTPSUwNGx4IEVTPSUwNGx4XG4iLAogCSAgICBFU0lfcmVnKCZyZWFsbW9kZV9jdHgpLCBFRElfcmVnKCZyZWFsbW9kZV9jdHgpLCAKIAkgICAgRFNfcmVnKCZyZWFsbW9kZV9jdHgpLCBFU19yZWcoJnJlYWxtb2RlX2N0eCkgKTsKKyAgICB9CiAgICAgSU5UX1NldFJlYWxNb2RlQ29udGV4dCggY2FsbCwgJnJlYWxtb2RlX2N0eCApOwogfQogCmRpZmYgLS1naXQgYS9tc2Rvcy9pbnQyMS5jIGIvbXNkb3MvaW50MjEuYwppbmRleCA1Y2NmMThmLi5iZDNjNzcyIDEwMDY0NAotLS0gYS9tc2Rvcy9pbnQyMS5jCisrKyBiL21zZG9zL2ludDIxLmMKQEAgLTEzMTgsNyArMTMxOCw3IEBACiAgICAgICAgIGNhc2UgMHgwMToKICAgICAgICAgICAgIGJyZWFrOwogCWNhc2UgMHgwNTp7CS8qIElPQ1RMIC0gV1JJVEUgVE8gQkxPQ0sgREVWSUNFIENPTlRST0wgQ0hBTk5FTCAqLwotCSAgICBCWVRFICpkYXRhcHRyID0gUFRSX1NFR19PRkZfVE9fTElOKERTX3JlZyhjb250ZXh0KSxEWF9yZWcoY29udGV4dCkpOworCSAgICAvKkJZVEUgKmRhdGFwdHIgPSBQVFJfU0VHX09GRl9UT19MSU4oRFNfcmVnKGNvbnRleHQpLERYX3JlZyhjb250ZXh0KSk7Ki8KIAkgICAgaW50CWRyaXZlID0gRE9TX0dFVF9EUklWRShCTF9yZWcoY29udGV4dCkpOwogCiAJICAgIEZJWE1FKGludDIxLCJwcm9ncmFtIHRyaWVkIHRvIHdyaXRlIHRvIGJsb2NrIGRldmljZSBjb250cm9sIGNoYW5uZWwgb2YgZHJpdmUgJWQ6XG4iLGRyaXZlKTsKZGlmZiAtLWdpdCBhL21zZG9zL2ludDJmLmMgYi9tc2Rvcy9pbnQyZi5jCmluZGV4IGZiOGNmNjcuLjdhYjhlZGUgMTAwNjQ0Ci0tLSBhL21zZG9zL2ludDJmLmMKKysrIGIvbXNkb3MvaW50MmYuYwpAQCAtNzIsNiArNzIsMTYgQEAKICAgICAgICAgICAgIElOVF9CQVJGKCBjb250ZXh0LCAweDJmICk7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDU2OiAgLyogSU5URVJMTksgKi8KKwlzd2l0Y2goQUxfcmVnKGNvbnRleHQpKQorCXsKKwljYXNlIDB4MDE6ICAvKiBjaGVjayBpZiByZWRpcmVjdGVkIGRyaXZlICovCisJICAgIEFMX3JlZyhjb250ZXh0KSA9IDA7IC8qIG5vdCByZWRpcmVjdGVkICovCisJICAgIGJyZWFrOworCWRlZmF1bHQ6CisJICAgIElOVF9CQVJGKCBjb250ZXh0LCAweDJmICk7CisJfQorCWJyZWFrOwogICAgIGNhc2UgMHhiNzogIC8qIGFwcGVuZCAqLwogICAgICAgICBBTF9yZWcoY29udGV4dCkgPSAwOyAvKiBub3QgaW5zdGFsbGVkICovCiAgICAgICAgIGJyZWFrOwpAQCAtMjE3LDcgKzIyNyw3IEBACiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgRklYTUUoaW50LCAiVW5pbXBsZW1lbnRlZCBNU0NERVggZnVuY3Rpb24gMHglMDIuMlguXG4iLCBBTF9yZWcoY29udGV4dCkpOworICAgICAgICAgICAgRklYTUUoaW50LCAiVW5pbXBsZW1lbnRlZCBNU0NERVggZnVuY3Rpb24gMHglMDJYLlxuIiwgQUxfcmVnKGNvbnRleHQpKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL211bHRpbWVkaWEvYXVkaW8uYyBiL211bHRpbWVkaWEvYXVkaW8uYwppbmRleCBjMTkyYTVjLi45MmQ2ZTZlIDEwMDY0NAotLS0gYS9tdWx0aW1lZGlhL2F1ZGlvLmMKKysrIGIvbXVsdGltZWRpYS9hdWRpby5jCkBAIC03ODAsOSArNzgwLDEzIEBACiAJbHBDYXBzLT52RHJpdmVyVmVyc2lvbiA9IDB4MDEwMDsKIAlscENhcHMtPmR3Rm9ybWF0cyA9IDB4MDAwMDAwMDA7CiAJbHBDYXBzLT5kd1N1cHBvcnQgPSBXQVZFQ0FQU19WT0xVTUU7CisKKwkvKiBGaXJzdCBieXRlc3BlcnNhbXBsLCB0aGVuIHN0ZXJlbyAqLworCWJ5dGVzcGVyc21wbCA9IChJT0NUTChhdWRpbywgU05EQ1RMX0RTUF9TQU1QTEVTSVpFLCBzYW1wbGVzaXplKSAhPSAwKSA/IDEgOiAyOworCiAJbHBDYXBzLT53Q2hhbm5lbHMgPSAoSU9DVEwoYXVkaW8sIFNORENUTF9EU1BfU1RFUkVPLCBkc3Bfc3RlcmVvKSAhPSAwKSA/IDEgOiAyOwogCWlmIChscENhcHMtPndDaGFubmVscyA+IDEpIGxwQ2Fwcy0+ZHdTdXBwb3J0IHw9IFdBVkVDQVBTX0xSVk9MVU1FOwotCWJ5dGVzcGVyc21wbCA9IChJT0NUTChhdWRpbywgU05EQ1RMX0RTUF9TQU1QTEVTSVpFLCBzYW1wbGVzaXplKSAhPSAwKSA/IDEgOiAyOworCiAJc21wbHJhdGUgPSA0NDEwMDsKIAlpZiAoSU9DVEwoYXVkaW8sIFNORENUTF9EU1BfU1BFRUQsIHNtcGxyYXRlKSA9PSAwKSB7CiAJCWxwQ2Fwcy0+ZHdGb3JtYXRzIHw9IFdBVkVfRk9STUFUXzRNMDg7CkBAIC05MDEsOSArOTA1LDEyIEBACiAJc2FtcGxlc2l6ZSA9IFdPdXREZXZbd0RldklEXS5Gb3JtYXQud0JpdHNQZXJTYW1wbGU7CiAJc21wbHJhdGUgPSBXT3V0RGV2W3dEZXZJRF0uRm9ybWF0LndmLm5TYW1wbGVzUGVyU2VjOwogCWRzcF9zdGVyZW8gPSAoV091dERldlt3RGV2SURdLkZvcm1hdC53Zi5uQ2hhbm5lbHMgPiAxKSA/IFRSVUUgOiBGQUxTRTsKLQlJT0NUTChhdWRpbywgU05EQ1RMX0RTUF9TUEVFRCwgc21wbHJhdGUpOworCisJLyogRmlyc3Qgc2l6ZSBhbmQgc3RlcmVvIHRoZW4gc2FtcGxlcmF0ZSAqLwogCUlPQ1RMKGF1ZGlvLCBTTkRDVExfRFNQX1NBTVBMRVNJWkUsIHNhbXBsZXNpemUpOwogCUlPQ1RMKGF1ZGlvLCBTTkRDVExfRFNQX1NURVJFTywgZHNwX3N0ZXJlbyk7CisJSU9DVEwoYXVkaW8sIFNORENUTF9EU1BfU1BFRUQsIHNtcGxyYXRlKTsKKwogCVRSQUNFKG1jaXdhdmUsIndCaXRzUGVyU2FtcGxlPSV1ICFcbiIsCiAJCSAgICAgV091dERldlt3RGV2SURdLkZvcm1hdC53Qml0c1BlclNhbXBsZSk7CiAJVFJBQ0UobWNpd2F2ZSwibkF2Z0J5dGVzUGVyU2VjPSVsdSAhXG4iLApkaWZmIC0tZ2l0IGEvbXVsdGltZWRpYS9tbWlvLmMgYi9tdWx0aW1lZGlhL21taW8uYwppbmRleCBiMWY2OTQxLi4wZTY3ZjQxIDEwMDY0NAotLS0gYS9tdWx0aW1lZGlhL21taW8uYworKysgYi9tdWx0aW1lZGlhL21taW8uYwpAQCAtMzc1LDkgKzM3NSwxMiBAQAogVUlOVDE2IFdJTkFQSSBtbWlvU2V0QnVmZmVyKEhNTUlPMTYgaG1taW8sIExQU1RSIHBjaEJ1ZmZlciwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9ORyBjY2hCdWZmZXIsIFVJTlQxNiB1RmxhZ3MpCiB7Ci0JRklYTUUobW1pbywgIihobW1pbz0lZCwgcGNoQnVmPSVwLCBjY2hCdWY9JWQsIHVGbGFncz0lIzA4eCk6IHN0dWJcbiIsCisJRklYTUUobW1pbywgIihobW1pbz0lZCwgcGNoQnVmPSVwLCBjY2hCdWY9JWxkLCB1RmxhZ3M9JSMwOHgpOiBzdHViXG4iLAogCSAgICAgIGhtbWlvLCBwY2hCdWZmZXIsIGNjaEJ1ZmZlciwgdUZsYWdzKTsKKwlyZXR1cm4gKFVJTlQxNikgMDsKKy8qCXN0b3BzIENvcmVsIERyYXcgNCAoMTYgYml0KSBmcm9tIHdvcmtpbmcKIAlyZXR1cm4gTU1JT0VSUl9PVVRPRk1FTU9SWTsKKyovCiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvbXVsdGltZWRpYS9tbXN5c3RlbS5jIGIvbXVsdGltZWRpYS9tbXN5c3RlbS5jCmluZGV4IGYxM2FlZmEuLmQ0MDAwMGUgMTAwNjQ0Ci0tLSBhL211bHRpbWVkaWEvbW1zeXN0ZW0uYworKysgYi9tdWx0aW1lZGlhL21tc3lzdGVtLmMKQEAgLTE0MTIsNyArMTQxMiw3IEBACiAgICAgICBMUFNUUiAgICAgICAgICAgc2Vnc3RyOwogICAgICAgU0VHUFRSICAgICAgICAgIHhtZW07CiAgICAgICBMUEJZVEUgICAgICAgICAgbG1lbTsKLSAgICAgIHN0YXRpYyAgICAgICAgICBtY2lkZXZ0eXBlID0gMDsKKyAgICAgIHN0YXRpYyBVSU5UMTYgICBtY2lkZXZ0eXBlID0gMDsKIAogICAgICAgRklYTUUobW1zeXMsIiglMDR4LCVzLCVkKTogc3R1YiFcbiIsaGluc3QscmVzbmFtZSx0eXBlKTsKICAgICAgIGlmICghbHN0cmNtcGkzMkEocmVzbmFtZSwiY29yZSIpKSB7CmRpZmYgLS1naXQgYS9vYmplY3RzL2N1cnNvcmljb24uYyBiL29iamVjdHMvY3Vyc29yaWNvbi5jCmluZGV4IDM2OTE4ZWYuLjc0ZGE0NzcgMTAwNjQ0Ci0tLSBhL29iamVjdHMvY3Vyc29yaWNvbi5jCisrKyBiL29iamVjdHMvY3Vyc29yaWNvbi5jCkBAIC03NjEsOCArNzYxLDcgQEAKIAogICAgIFRSQUNFKGN1cnNvciwgIiVkeCVkIHNwb3Q9JWQsJWQgeG9yPSVwIGFuZD0lcFxuIiwKICAgICAgICAgICAgICAgICAgICAgbldpZHRoLCBuSGVpZ2h0LCB4SG90U3BvdCwgeUhvdFNwb3QsIGxwWE9SYml0cywgbHBBTkRiaXRzKTsKLSAgICByZXR1cm4gQ3JlYXRlQ3Vyc29ySWNvbkluZGlyZWN0KCBNT0RVTEVfSEFORExFdG9ITU9EVUxFMTYoIGhJbnN0YW5jZSApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmZvLCBscEFORGJpdHMsIGxwWE9SYml0cyApOworICAgIHJldHVybiBDcmVhdGVDdXJzb3JJY29uSW5kaXJlY3QoIDAsICZpbmZvLCBscEFORGJpdHMsIGxwWE9SYml0cyApOwogfQogCiAKQEAgLTc5Miw4ICs3OTEsNyBAQAogCiAgICAgVFJBQ0UoaWNvbiwgIiVkeCVkeCVkLCB4b3I9JXAsIGFuZD0lcFxuIiwKICAgICAgICAgICAgICAgICAgIG5XaWR0aCwgbkhlaWdodCwgYlBsYW5lcyAqIGJCaXRzUGl4ZWwsIGxwWE9SYml0cywgbHBBTkRiaXRzKTsKLSAgICByZXR1cm4gQ3JlYXRlQ3Vyc29ySWNvbkluZGlyZWN0KCBNT0RVTEVfSEFORExFdG9ITU9EVUxFMTYoIGhJbnN0YW5jZSApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmZvLCBscEFORGJpdHMsIGxwWE9SYml0cyApOworICAgIHJldHVybiBDcmVhdGVDdXJzb3JJY29uSW5kaXJlY3QoIDAsICZpbmZvLCBscEFORGJpdHMsIGxwWE9SYml0cyApOwogfQogCiAKQEAgLTgxMCwxMyArODA4LDE0IEBACiAgICAgaW50IHNpemVBbmQsIHNpemVYb3I7CiAKICAgICBoSW5zdGFuY2UgPSBHZXRFeGVQdHIoIGhJbnN0YW5jZSApOyAgLyogTWFrZSBpdCBhIG1vZHVsZSBoYW5kbGUgKi8KLSAgICBpZiAoIWhJbnN0YW5jZSB8fCAhbHBYT1JiaXRzIHx8ICFscEFORGJpdHMgfHwgaW5mby0+YlBsYW5lcyAhPSAxKSByZXR1cm4gMDsKKyAgICBpZiAoIWxwWE9SYml0cyB8fCAhbHBBTkRiaXRzIHx8IGluZm8tPmJQbGFuZXMgIT0gMSkgcmV0dXJuIDA7CiAgICAgaW5mby0+bldpZHRoQnl0ZXMgPSBCSVRNQVBfV0lEVEhfQllURVMoaW5mby0+bldpZHRoLGluZm8tPmJCaXRzUGVyUGl4ZWwpOwogICAgIHNpemVYb3IgPSBpbmZvLT5uSGVpZ2h0ICogaW5mby0+bldpZHRoQnl0ZXM7CiAgICAgc2l6ZUFuZCA9IGluZm8tPm5IZWlnaHQgKiBCSVRNQVBfV0lEVEhfQllURVMoIGluZm8tPm5XaWR0aCwgMSApOwotICAgIGlmICghKGhhbmRsZSA9IERpcmVjdFJlc0FsbG9jKGhJbnN0YW5jZSwgMHgxMCwKKyAgICBpZiAoIShoYW5kbGUgPSBHbG9iYWxBbGxvYzE2KCBHTUVNX01PVkVBQkxFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihDVVJTT1JJQ09OSU5GTykgKyBzaXplWG9yICsgc2l6ZUFuZCkpKQogICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoaEluc3RhbmNlKSBGYXJTZXRPd25lciggaGFuZGxlLCBoSW5zdGFuY2UgKTsKICAgICBwdHIgPSAoY2hhciAqKUdsb2JhbExvY2sxNiggaGFuZGxlICk7CiAgICAgbWVtY3B5KCBwdHIsIGluZm8sIHNpemVvZigqaW5mbykgKTsKICAgICBtZW1jcHkoIHB0ciArIHNpemVvZihDVVJTT1JJQ09OSU5GTyksIGxwQU5EYml0cywgc2l6ZUFuZCApOwpkaWZmIC0tZ2l0IGEvb2JqZWN0cy9kYy5jIGIvb2JqZWN0cy9kYy5jCmluZGV4IDZjNzFjMTguLmY2MDhiMDkgMTAwNjQ0Ci0tLSBhL29iamVjdHMvZGMuYworKysgYi9vYmplY3RzL2RjLmMKQEAgLTEwMCw1MCArMTAwLDUyIEBACiAgKi8KIHN0YXRpYyB2b2lkIERDX0luaXRfRENfSU5GTyggV0lOX0RDX0lORk8gKndpbl9kY19pbmZvICkKIHsKLSAgICB3aW5fZGNfaW5mby0+ZmxhZ3MgICAgICAgICAgID0gMDsKLSAgICB3aW5fZGNfaW5mby0+ZGV2Q2FwcyAgICAgICAgID0gTlVMTDsKLSAgICB3aW5fZGNfaW5mby0+aENsaXBSZ24gICAgICAgID0gMDsKLSAgICB3aW5fZGNfaW5mby0+aFZpc1JnbiAgICAgICAgID0gMDsKLSAgICB3aW5fZGNfaW5mby0+aEdDQ2xpcFJnbiAgICAgID0gMDsKLSAgICB3aW5fZGNfaW5mby0+aFBlbiAgICAgICAgICAgID0gU1RPQ0tfQkxBQ0tfUEVOOwotICAgIHdpbl9kY19pbmZvLT5oQnJ1c2ggICAgICAgICAgPSBTVE9DS19XSElURV9CUlVTSDsKLSAgICB3aW5fZGNfaW5mby0+aEZvbnQgICAgICAgICAgID0gU1RPQ0tfU1lTVEVNX0ZPTlQ7Ci0gICAgd2luX2RjX2luZm8tPmhCaXRtYXAgICAgICAgICA9IDA7Ci0gICAgd2luX2RjX2luZm8tPmhGaXJzdEJpdG1hcCAgICA9IDA7Ci0gICAgd2luX2RjX2luZm8tPmhEZXZpY2UgICAgICAgICA9IDA7Ci0gICAgd2luX2RjX2luZm8tPmhQYWxldHRlICAgICAgICA9IFNUT0NLX0RFRkFVTFRfUEFMRVRURTsKLSAgICB3aW5fZGNfaW5mby0+Uk9QbW9kZSAgICAgICAgID0gUjJfQ09QWVBFTjsKLSAgICB3aW5fZGNfaW5mby0+cG9seUZpbGxNb2RlICAgID0gQUxURVJOQVRFOwotICAgIHdpbl9kY19pbmZvLT5zdHJldGNoQmx0TW9kZSAgPSBCTEFDS09OV0hJVEU7Ci0gICAgd2luX2RjX2luZm8tPnJlbEFic01vZGUgICAgICA9IEFCU09MVVRFOwotICAgIHdpbl9kY19pbmZvLT5iYWNrZ3JvdW5kTW9kZSAgPSBPUEFRVUU7Ci0gICAgd2luX2RjX2luZm8tPmJhY2tncm91bmRDb2xvciA9IFJHQiggMjU1LCAyNTUsIDI1NSApOwotICAgIHdpbl9kY19pbmZvLT50ZXh0Q29sb3IgICAgICAgPSBSR0IoIDAsIDAsIDAgKTsKLSAgICB3aW5fZGNfaW5mby0+YmFja2dyb3VuZFBpeGVsID0gMDsKLSAgICB3aW5fZGNfaW5mby0+dGV4dFBpeGVsICAgICAgID0gMDsKLSAgICB3aW5fZGNfaW5mby0+YnJ1c2hPcmdYICAgICAgID0gMDsKLSAgICB3aW5fZGNfaW5mby0+YnJ1c2hPcmdZICAgICAgID0gMDsKLSAgICB3aW5fZGNfaW5mby0+dGV4dEFsaWduICAgICAgID0gVEFfTEVGVCB8IFRBX1RPUCB8IFRBX05PVVBEQVRFQ1A7Ci0gICAgd2luX2RjX2luZm8tPmNoYXJFeHRyYSAgICAgICA9IDA7Ci0gICAgd2luX2RjX2luZm8tPmJyZWFrVG90YWxFeHRyYSA9IDA7Ci0gICAgd2luX2RjX2luZm8tPmJyZWFrQ291bnQgICAgICA9IDA7Ci0gICAgd2luX2RjX2luZm8tPmJyZWFrRXh0cmEgICAgICA9IDA7Ci0gICAgd2luX2RjX2luZm8tPmJyZWFrUmVtICAgICAgICA9IDA7Ci0gICAgd2luX2RjX2luZm8tPmJpdHNQZXJQaXhlbCAgICA9IDE7Ci0gICAgd2luX2RjX2luZm8tPk1hcE1vZGUgICAgICAgICA9IE1NX1RFWFQ7Ci0gICAgd2luX2RjX2luZm8tPkdyYXBoaWNzTW9kZSAgICA9IEdNX0NPTVBBVElCTEU7Ci0gICAgd2luX2RjX2luZm8tPkRDT3JnWCAgICAgICAgICA9IDA7Ci0gICAgd2luX2RjX2luZm8tPkRDT3JnWSAgICAgICAgICA9IDA7Ci0gICAgd2luX2RjX2luZm8tPkN1cnNQb3NYICAgICAgICA9IDA7Ci0gICAgd2luX2RjX2luZm8tPkN1cnNQb3NZICAgICAgICA9IDA7Ci0gICAgd2luX2RjX2luZm8tPkFyY0RpcmVjdGlvbiAgICA9IEFEX0NPVU5URVJDTE9DS1dJU0U7Ci0gICAgd2luX2RjX2luZm8tPlVzZVdvcmxkWGZvcm0gICA9IEZBTFNFOwotICAgIHdpbl9kY19pbmZvLT5Xb3JsZFhmb3JtLmVNMTEgPSAxLjBmOwotICAgIHdpbl9kY19pbmZvLT5Xb3JsZFhmb3JtLmVNMTIgPSAwLjBmOwotICAgIHdpbl9kY19pbmZvLT5Xb3JsZFhmb3JtLmVNMjEgPSAwLjBmOwotICAgIHdpbl9kY19pbmZvLT5Xb3JsZFhmb3JtLmVNMjIgPSAxLjBmOwotICAgIHdpbl9kY19pbmZvLT5Xb3JsZFhmb3JtLmVEeCAgPSAwLjBmOwotICAgIHdpbl9kY19pbmZvLT5Xb3JsZFhmb3JtLmVEeSAgPSAwLjBmOworICAgIHdpbl9kY19pbmZvLT5mbGFncyAgICAgICAgICAgICAgID0gMDsKKyAgICB3aW5fZGNfaW5mby0+ZGV2Q2FwcyAgICAgICAgICAgICA9IE5VTEw7CisgICAgd2luX2RjX2luZm8tPmhDbGlwUmduICAgICAgICAgICAgPSAwOworICAgIHdpbl9kY19pbmZvLT5oVmlzUmduICAgICAgICAgICAgID0gMDsKKyAgICB3aW5fZGNfaW5mby0+aEdDQ2xpcFJnbiAgICAgICAgICA9IDA7CisgICAgd2luX2RjX2luZm8tPmhQZW4gICAgICAgICAgICAgICAgPSBTVE9DS19CTEFDS19QRU47CisgICAgd2luX2RjX2luZm8tPmhCcnVzaCAgICAgICAgICAgICAgPSBTVE9DS19XSElURV9CUlVTSDsKKyAgICB3aW5fZGNfaW5mby0+aEZvbnQgICAgICAgICAgICAgICA9IFNUT0NLX1NZU1RFTV9GT05UOworICAgIHdpbl9kY19pbmZvLT5oQml0bWFwICAgICAgICAgICAgID0gMDsKKyAgICB3aW5fZGNfaW5mby0+aEZpcnN0Qml0bWFwICAgICAgICA9IDA7CisgICAgd2luX2RjX2luZm8tPmhEZXZpY2UgICAgICAgICAgICAgPSAwOworICAgIHdpbl9kY19pbmZvLT5oUGFsZXR0ZSAgICAgICAgICAgID0gU1RPQ0tfREVGQVVMVF9QQUxFVFRFOworICAgIHdpbl9kY19pbmZvLT5ST1Btb2RlICAgICAgICAgICAgID0gUjJfQ09QWVBFTjsKKyAgICB3aW5fZGNfaW5mby0+cG9seUZpbGxNb2RlICAgICAgICA9IEFMVEVSTkFURTsKKyAgICB3aW5fZGNfaW5mby0+c3RyZXRjaEJsdE1vZGUgICAgICA9IEJMQUNLT05XSElURTsKKyAgICB3aW5fZGNfaW5mby0+cmVsQWJzTW9kZSAgICAgICAgICA9IEFCU09MVVRFOworICAgIHdpbl9kY19pbmZvLT5iYWNrZ3JvdW5kTW9kZSAgICAgID0gT1BBUVVFOworICAgIHdpbl9kY19pbmZvLT5iYWNrZ3JvdW5kQ29sb3IgICAgID0gUkdCKCAyNTUsIDI1NSwgMjU1ICk7CisgICAgd2luX2RjX2luZm8tPnRleHRDb2xvciAgICAgICAgICAgPSBSR0IoIDAsIDAsIDAgKTsKKyAgICB3aW5fZGNfaW5mby0+YmFja2dyb3VuZFBpeGVsICAgICA9IDA7CisgICAgd2luX2RjX2luZm8tPnRleHRQaXhlbCAgICAgICAgICAgPSAwOworICAgIHdpbl9kY19pbmZvLT5icnVzaE9yZ1ggICAgICAgICAgID0gMDsKKyAgICB3aW5fZGNfaW5mby0+YnJ1c2hPcmdZICAgICAgICAgICA9IDA7CisgICAgd2luX2RjX2luZm8tPnRleHRBbGlnbiAgICAgICAgICAgPSBUQV9MRUZUIHwgVEFfVE9QIHwgVEFfTk9VUERBVEVDUDsKKyAgICB3aW5fZGNfaW5mby0+Y2hhckV4dHJhICAgICAgICAgICA9IDA7CisgICAgd2luX2RjX2luZm8tPmJyZWFrVG90YWxFeHRyYSAgICAgPSAwOworICAgIHdpbl9kY19pbmZvLT5icmVha0NvdW50ICAgICAgICAgID0gMDsKKyAgICB3aW5fZGNfaW5mby0+YnJlYWtFeHRyYSAgICAgICAgICA9IDA7CisgICAgd2luX2RjX2luZm8tPmJyZWFrUmVtICAgICAgICAgICAgPSAwOworICAgIHdpbl9kY19pbmZvLT5iaXRzUGVyUGl4ZWwgICAgICAgID0gMTsKKyAgICB3aW5fZGNfaW5mby0+TWFwTW9kZSAgICAgICAgICAgICA9IE1NX1RFWFQ7CisgICAgd2luX2RjX2luZm8tPkdyYXBoaWNzTW9kZSAgICAgICAgPSBHTV9DT01QQVRJQkxFOworICAgIHdpbl9kY19pbmZvLT5EQ09yZ1ggICAgICAgICAgICAgID0gMDsKKyAgICB3aW5fZGNfaW5mby0+RENPcmdZICAgICAgICAgICAgICA9IDA7CisgICAgd2luX2RjX2luZm8tPkN1cnNQb3NYICAgICAgICAgICAgPSAwOworICAgIHdpbl9kY19pbmZvLT5DdXJzUG9zWSAgICAgICAgICAgID0gMDsKKyAgICB3aW5fZGNfaW5mby0+QXJjRGlyZWN0aW9uICAgICAgICA9IEFEX0NPVU5URVJDTE9DS1dJU0U7CisgICAgd2luX2RjX2luZm8tPnhmb3JtV29ybGQyV25kLmVNMTEgPSAxLjBmOworICAgIHdpbl9kY19pbmZvLT54Zm9ybVdvcmxkMlduZC5lTTEyID0gMC4wZjsKKyAgICB3aW5fZGNfaW5mby0+eGZvcm1Xb3JsZDJXbmQuZU0yMSA9IDAuMGY7CisgICAgd2luX2RjX2luZm8tPnhmb3JtV29ybGQyV25kLmVNMjIgPSAxLjBmOworICAgIHdpbl9kY19pbmZvLT54Zm9ybVdvcmxkMlduZC5lRHggID0gMC4wZjsKKyAgICB3aW5fZGNfaW5mby0+eGZvcm1Xb3JsZDJXbmQuZUR5ICA9IDAuMGY7CisgICAgd2luX2RjX2luZm8tPnhmb3JtV29ybGQyVnBvcnQgICAgPSB3aW5fZGNfaW5mby0+eGZvcm1Xb3JsZDJXbmQ7CisgICAgd2luX2RjX2luZm8tPnhmb3JtVnBvcnQyV29ybGQgICAgPSB3aW5fZGNfaW5mby0+eGZvcm1Xb3JsZDJXbmQ7CisgICAgd2luX2RjX2luZm8tPnZwb3J0MldvcmxkVmFsaWQgICAgPSBUUlVFOwogCiAgICAgUEFUSF9Jbml0R2RpUGF0aCgmd2luX2RjX2luZm8tPnBhdGgpOwogfQpAQCAtNDM0LDYgKzQzNiw3MiBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIERDX0ludmVydFhmb3JtCisgKgorICogQ29tcHV0ZXMgdGhlIGludmVyc2Ugb2YgdGhlIHRyYW5zZm9ybWF0aW9uIHhmb3JtU3JjIGFuZCBzdG9yZXMgaXQgdG8KKyAqIHhmb3JtRGVzdC4gUmV0dXJucyBUUlVFIGlmIHN1Y2Nlc3NmdWwgb3IgRkFMU0UgaWYgdGhlIHhmb3JtU3JjIG1hdHJpeAorICogaXMgc2luZ3VsYXIuCisgKi8KK3N0YXRpYyBCT09MMzIgRENfSW52ZXJ0WGZvcm0oIGNvbnN0IFhGT1JNICp4Zm9ybVNyYywgWEZPUk0gKnhmb3JtRGVzdCApCit7CisgICAgRkxPQVQgZGV0ZXJtaW5hbnQ7CisgICAgCisgICAgZGV0ZXJtaW5hbnQgPSB4Zm9ybVNyYy0+ZU0xMSp4Zm9ybVNyYy0+ZU0yMiAtCisgICAgICAgIHhmb3JtU3JjLT5lTTEyKnhmb3JtU3JjLT5lTTIxOworICAgIGlmIChkZXRlcm1pbmFudCA+IC0xZS0xMiAmJiBkZXRlcm1pbmFudCA8IDFlLTEyKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICB4Zm9ybURlc3QtPmVNMTEgPSAgeGZvcm1TcmMtPmVNMjIgLyBkZXRlcm1pbmFudDsKKyAgICB4Zm9ybURlc3QtPmVNMTIgPSAteGZvcm1TcmMtPmVNMTIgLyBkZXRlcm1pbmFudDsKKyAgICB4Zm9ybURlc3QtPmVNMjEgPSAteGZvcm1TcmMtPmVNMjEgLyBkZXRlcm1pbmFudDsKKyAgICB4Zm9ybURlc3QtPmVNMjIgPSAgeGZvcm1TcmMtPmVNMTEgLyBkZXRlcm1pbmFudDsKKyAgICB4Zm9ybURlc3QtPmVEeCAgPSAteGZvcm1TcmMtPmVEeCAqIHhmb3JtRGVzdC0+ZU0xMSAtCisgICAgICAgICAgICAgICAgICAgICAgIHhmb3JtU3JjLT5lRHkgKiB4Zm9ybURlc3QtPmVNMjE7CisgICAgeGZvcm1EZXN0LT5lRHkgID0gLXhmb3JtU3JjLT5lRHggKiB4Zm9ybURlc3QtPmVNMTIgLQorICAgICAgICAgICAgICAgICAgICAgICB4Zm9ybVNyYy0+ZUR5ICogeGZvcm1EZXN0LT5lTTIyOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgRENfVXBkYXRlWGZvcm1zCisgKgorICogVXBkYXRlcyB0aGUgeGZvcm1Xb3JsZDJWcG9ydCwgeGZvcm1WcG9ydDJXb3JsZCBhbmQgdnBvcnQyV29ybGRWYWxpZAorICogZmllbGRzIG9mIHRoZSBzcGVjaWZpZWQgREMgYnkgY3JlYXRpbmcgYSB0cmFuc2Zvcm1hdGlvbiB0aGF0CisgKiByZXByZXNlbnRzIHRoZSBjdXJyZW50IG1hcHBpbmcgbW9kZSBhbmQgY29tYmluaW5nIGl0IHdpdGggdGhlIERDJ3MKKyAqIHdvcmxkIHRyYW5zZm9ybS4gVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIHdoZW5ldmVyIHRoZQorICogcGFyYW1ldGVycyBhc3NvY2lhdGVkIHdpdGggdGhlIG1hcHBpbmcgbW9kZSAod2luZG93IGFuZCB2aWV3cG9ydAorICogZXh0ZW50cyBhbmQgb3JpZ2lucykgb3IgdGhlIHdvcmxkIHRyYW5zZm9ybSBjaGFuZ2UuCisgKi8KK3ZvaWQgRENfVXBkYXRlWGZvcm1zKCBEQyAqZGMgKQoreworICAgIFhGT1JNIHhmb3JtV25kMlZwb3J0OworICAgIEZMT0FUIHNjYWxlWCwgc2NhbGVZOworICAgIAorICAgIC8qIENvbnN0cnVjdCBhIHRyYW5zZm9ybWF0aW9uIHRvIGRvIHRoZSB3aW5kb3ctdG8tdmlld3BvcnQgY29udmVyc2lvbiAqLworICAgIHNjYWxlWCA9IChGTE9BVClkYy0+dnBvcnRFeHRYIC8gKEZMT0FUKWRjLT53bmRFeHRYOworICAgIHNjYWxlWSA9IChGTE9BVClkYy0+dnBvcnRFeHRZIC8gKEZMT0FUKWRjLT53bmRFeHRZOworICAgIHhmb3JtV25kMlZwb3J0LmVNMTEgPSBzY2FsZVg7CisgICAgeGZvcm1XbmQyVnBvcnQuZU0xMiA9IDAuMDsKKyAgICB4Zm9ybVduZDJWcG9ydC5lTTIxID0gMC4wOworICAgIHhmb3JtV25kMlZwb3J0LmVNMjIgPSBzY2FsZVk7CisgICAgeGZvcm1XbmQyVnBvcnQuZUR4ICA9IChGTE9BVClkYy0+dnBvcnRPcmdYIC0KKyAgICAgICAgc2NhbGVYICogKEZMT0FUKWRjLT53bmRPcmdYOworICAgIHhmb3JtV25kMlZwb3J0LmVEeSAgPSAoRkxPQVQpZGMtPnZwb3J0T3JnWSAtCisgICAgICAgIHNjYWxlWSAqIChGTE9BVClkYy0+d25kT3JnWTsKKworICAgIC8qIENvbWJpbmUgd2l0aCB0aGUgd29ybGQgdHJhbnNmb3JtYXRpb24gKi8KKyAgICBDb21iaW5lVHJhbnNmb3JtKCAmZGMtPncueGZvcm1Xb3JsZDJWcG9ydCwgJmRjLT53Lnhmb3JtV29ybGQyV25kLAorICAgICAgICAmeGZvcm1XbmQyVnBvcnQgKTsKKworICAgIC8qIENyZWF0ZSBpbnZlcnNlIG9mIHdvcmxkLXRvLXZpZXdwb3J0IHRyYW5zZm9ybWF0aW9uICovCisgICAgZGMtPncudnBvcnQyV29ybGRWYWxpZCA9IERDX0ludmVydFhmb3JtKCAmZGMtPncueGZvcm1Xb3JsZDJWcG9ydCwKKyAgICAgICAgJmRjLT53Lnhmb3JtVnBvcnQyV29ybGQgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBHZXREQ1N0YXRlICAgIChHREkuMTc5KQogICovCiBIREMxNiBXSU5BUEkgR2V0RENTdGF0ZSggSERDMTYgaGRjICkKQEAgLTQ1Miw1MCArNTIwLDUyIEBACiAgICAgVFJBQ0UoZGMsICIoJTA0eCk6IHJldHVybmluZyAlMDR4XG4iLCBoZGMsIGhhbmRsZSApOwogCiAgICAgbWVtc2V0KCAmbmV3ZGMtPnUueCwgMCwgc2l6ZW9mKG5ld2RjLT51LngpICk7Ci0gICAgbmV3ZGMtPncuZmxhZ3MgICAgICAgICAgID0gZGMtPncuZmxhZ3MgfCBEQ19TQVZFRDsKLSAgICBuZXdkYy0+dy5kZXZDYXBzICAgICAgICAgPSBkYy0+dy5kZXZDYXBzOwotICAgIG5ld2RjLT53LmhQZW4gICAgICAgICAgICA9IGRjLT53LmhQZW47ICAgICAgIAotICAgIG5ld2RjLT53LmhCcnVzaCAgICAgICAgICA9IGRjLT53LmhCcnVzaDsgICAgIAotICAgIG5ld2RjLT53LmhGb250ICAgICAgICAgICA9IGRjLT53LmhGb250OyAgICAgIAotICAgIG5ld2RjLT53LmhCaXRtYXAgICAgICAgICA9IGRjLT53LmhCaXRtYXA7ICAgIAotICAgIG5ld2RjLT53LmhGaXJzdEJpdG1hcCAgICA9IGRjLT53LmhGaXJzdEJpdG1hcDsKLSAgICBuZXdkYy0+dy5oRGV2aWNlICAgICAgICAgPSBkYy0+dy5oRGV2aWNlOwotICAgIG5ld2RjLT53LmhQYWxldHRlICAgICAgICA9IGRjLT53LmhQYWxldHRlOyAgIAotICAgIG5ld2RjLT53LmJpdHNQZXJQaXhlbCAgICA9IGRjLT53LmJpdHNQZXJQaXhlbDsKLSAgICBuZXdkYy0+dy5ST1Btb2RlICAgICAgICAgPSBkYy0+dy5ST1Btb2RlOwotICAgIG5ld2RjLT53LnBvbHlGaWxsTW9kZSAgICA9IGRjLT53LnBvbHlGaWxsTW9kZTsKLSAgICBuZXdkYy0+dy5zdHJldGNoQmx0TW9kZSAgPSBkYy0+dy5zdHJldGNoQmx0TW9kZTsKLSAgICBuZXdkYy0+dy5yZWxBYnNNb2RlICAgICAgPSBkYy0+dy5yZWxBYnNNb2RlOwotICAgIG5ld2RjLT53LmJhY2tncm91bmRNb2RlICA9IGRjLT53LmJhY2tncm91bmRNb2RlOwotICAgIG5ld2RjLT53LmJhY2tncm91bmRDb2xvciA9IGRjLT53LmJhY2tncm91bmRDb2xvcjsKLSAgICBuZXdkYy0+dy50ZXh0Q29sb3IgICAgICAgPSBkYy0+dy50ZXh0Q29sb3I7Ci0gICAgbmV3ZGMtPncuYmFja2dyb3VuZFBpeGVsID0gZGMtPncuYmFja2dyb3VuZFBpeGVsOwotICAgIG5ld2RjLT53LnRleHRQaXhlbCAgICAgICA9IGRjLT53LnRleHRQaXhlbDsKLSAgICBuZXdkYy0+dy5icnVzaE9yZ1ggICAgICAgPSBkYy0+dy5icnVzaE9yZ1g7Ci0gICAgbmV3ZGMtPncuYnJ1c2hPcmdZICAgICAgID0gZGMtPncuYnJ1c2hPcmdZOwotICAgIG5ld2RjLT53LnRleHRBbGlnbiAgICAgICA9IGRjLT53LnRleHRBbGlnbjsKLSAgICBuZXdkYy0+dy5jaGFyRXh0cmEgICAgICAgPSBkYy0+dy5jaGFyRXh0cmE7Ci0gICAgbmV3ZGMtPncuYnJlYWtUb3RhbEV4dHJhID0gZGMtPncuYnJlYWtUb3RhbEV4dHJhOwotICAgIG5ld2RjLT53LmJyZWFrQ291bnQgICAgICA9IGRjLT53LmJyZWFrQ291bnQ7Ci0gICAgbmV3ZGMtPncuYnJlYWtFeHRyYSAgICAgID0gZGMtPncuYnJlYWtFeHRyYTsKLSAgICBuZXdkYy0+dy5icmVha1JlbSAgICAgICAgPSBkYy0+dy5icmVha1JlbTsKLSAgICBuZXdkYy0+dy5NYXBNb2RlICAgICAgICAgPSBkYy0+dy5NYXBNb2RlOwotICAgIG5ld2RjLT53LkdyYXBoaWNzTW9kZSAgICA9IGRjLT53LkdyYXBoaWNzTW9kZTsKLSAgICBuZXdkYy0+dy5EQ09yZ1ggICAgICAgICAgPSBkYy0+dy5EQ09yZ1g7Ci0gICAgbmV3ZGMtPncuRENPcmdZICAgICAgICAgID0gZGMtPncuRENPcmdZOwotICAgIG5ld2RjLT53LkN1cnNQb3NYICAgICAgICA9IGRjLT53LkN1cnNQb3NYOwotICAgIG5ld2RjLT53LkN1cnNQb3NZICAgICAgICA9IGRjLT53LkN1cnNQb3NZOwotICAgIG5ld2RjLT53LkFyY0RpcmVjdGlvbiAgICA9IGRjLT53LkFyY0RpcmVjdGlvbjsKLSAgICBuZXdkYy0+dy5Vc2VXb3JsZFhmb3JtICAgPSBkYy0+dy5Vc2VXb3JsZFhmb3JtOwotICAgIG5ld2RjLT53LldvcmxkWGZvcm0gICAgICA9IGRjLT53LldvcmxkWGZvcm07Ci0gICAgbmV3ZGMtPnduZE9yZ1ggICAgICAgICAgID0gZGMtPnduZE9yZ1g7Ci0gICAgbmV3ZGMtPnduZE9yZ1kgICAgICAgICAgID0gZGMtPnduZE9yZ1k7Ci0gICAgbmV3ZGMtPnduZEV4dFggICAgICAgICAgID0gZGMtPnduZEV4dFg7Ci0gICAgbmV3ZGMtPnduZEV4dFkgICAgICAgICAgID0gZGMtPnduZEV4dFk7Ci0gICAgbmV3ZGMtPnZwb3J0T3JnWCAgICAgICAgID0gZGMtPnZwb3J0T3JnWDsKLSAgICBuZXdkYy0+dnBvcnRPcmdZICAgICAgICAgPSBkYy0+dnBvcnRPcmdZOwotICAgIG5ld2RjLT52cG9ydEV4dFggICAgICAgICA9IGRjLT52cG9ydEV4dFg7Ci0gICAgbmV3ZGMtPnZwb3J0RXh0WSAgICAgICAgID0gZGMtPnZwb3J0RXh0WTsKKyAgICBuZXdkYy0+dy5mbGFncyAgICAgICAgICAgID0gZGMtPncuZmxhZ3MgfCBEQ19TQVZFRDsKKyAgICBuZXdkYy0+dy5kZXZDYXBzICAgICAgICAgID0gZGMtPncuZGV2Q2FwczsKKyAgICBuZXdkYy0+dy5oUGVuICAgICAgICAgICAgID0gZGMtPncuaFBlbjsgICAgICAgCisgICAgbmV3ZGMtPncuaEJydXNoICAgICAgICAgICA9IGRjLT53LmhCcnVzaDsgICAgIAorICAgIG5ld2RjLT53LmhGb250ICAgICAgICAgICAgPSBkYy0+dy5oRm9udDsgICAgICAKKyAgICBuZXdkYy0+dy5oQml0bWFwICAgICAgICAgID0gZGMtPncuaEJpdG1hcDsgICAgCisgICAgbmV3ZGMtPncuaEZpcnN0Qml0bWFwICAgICA9IGRjLT53LmhGaXJzdEJpdG1hcDsKKyAgICBuZXdkYy0+dy5oRGV2aWNlICAgICAgICAgID0gZGMtPncuaERldmljZTsKKyAgICBuZXdkYy0+dy5oUGFsZXR0ZSAgICAgICAgID0gZGMtPncuaFBhbGV0dGU7ICAgCisgICAgbmV3ZGMtPncuYml0c1BlclBpeGVsICAgICA9IGRjLT53LmJpdHNQZXJQaXhlbDsKKyAgICBuZXdkYy0+dy5ST1Btb2RlICAgICAgICAgID0gZGMtPncuUk9QbW9kZTsKKyAgICBuZXdkYy0+dy5wb2x5RmlsbE1vZGUgICAgID0gZGMtPncucG9seUZpbGxNb2RlOworICAgIG5ld2RjLT53LnN0cmV0Y2hCbHRNb2RlICAgPSBkYy0+dy5zdHJldGNoQmx0TW9kZTsKKyAgICBuZXdkYy0+dy5yZWxBYnNNb2RlICAgICAgID0gZGMtPncucmVsQWJzTW9kZTsKKyAgICBuZXdkYy0+dy5iYWNrZ3JvdW5kTW9kZSAgID0gZGMtPncuYmFja2dyb3VuZE1vZGU7CisgICAgbmV3ZGMtPncuYmFja2dyb3VuZENvbG9yICA9IGRjLT53LmJhY2tncm91bmRDb2xvcjsKKyAgICBuZXdkYy0+dy50ZXh0Q29sb3IgICAgICAgID0gZGMtPncudGV4dENvbG9yOworICAgIG5ld2RjLT53LmJhY2tncm91bmRQaXhlbCAgPSBkYy0+dy5iYWNrZ3JvdW5kUGl4ZWw7CisgICAgbmV3ZGMtPncudGV4dFBpeGVsICAgICAgICA9IGRjLT53LnRleHRQaXhlbDsKKyAgICBuZXdkYy0+dy5icnVzaE9yZ1ggICAgICAgID0gZGMtPncuYnJ1c2hPcmdYOworICAgIG5ld2RjLT53LmJydXNoT3JnWSAgICAgICAgPSBkYy0+dy5icnVzaE9yZ1k7CisgICAgbmV3ZGMtPncudGV4dEFsaWduICAgICAgICA9IGRjLT53LnRleHRBbGlnbjsKKyAgICBuZXdkYy0+dy5jaGFyRXh0cmEgICAgICAgID0gZGMtPncuY2hhckV4dHJhOworICAgIG5ld2RjLT53LmJyZWFrVG90YWxFeHRyYSAgPSBkYy0+dy5icmVha1RvdGFsRXh0cmE7CisgICAgbmV3ZGMtPncuYnJlYWtDb3VudCAgICAgICA9IGRjLT53LmJyZWFrQ291bnQ7CisgICAgbmV3ZGMtPncuYnJlYWtFeHRyYSAgICAgICA9IGRjLT53LmJyZWFrRXh0cmE7CisgICAgbmV3ZGMtPncuYnJlYWtSZW0gICAgICAgICA9IGRjLT53LmJyZWFrUmVtOworICAgIG5ld2RjLT53Lk1hcE1vZGUgICAgICAgICAgPSBkYy0+dy5NYXBNb2RlOworICAgIG5ld2RjLT53LkdyYXBoaWNzTW9kZSAgICAgPSBkYy0+dy5HcmFwaGljc01vZGU7CisgICAgbmV3ZGMtPncuRENPcmdYICAgICAgICAgICA9IGRjLT53LkRDT3JnWDsKKyAgICBuZXdkYy0+dy5EQ09yZ1kgICAgICAgICAgID0gZGMtPncuRENPcmdZOworICAgIG5ld2RjLT53LkN1cnNQb3NYICAgICAgICAgPSBkYy0+dy5DdXJzUG9zWDsKKyAgICBuZXdkYy0+dy5DdXJzUG9zWSAgICAgICAgID0gZGMtPncuQ3Vyc1Bvc1k7CisgICAgbmV3ZGMtPncuQXJjRGlyZWN0aW9uICAgICA9IGRjLT53LkFyY0RpcmVjdGlvbjsKKyAgICBuZXdkYy0+dy54Zm9ybVdvcmxkMlduZCAgID0gZGMtPncueGZvcm1Xb3JsZDJXbmQ7CisgICAgbmV3ZGMtPncueGZvcm1Xb3JsZDJWcG9ydCA9IGRjLT53Lnhmb3JtV29ybGQyVnBvcnQ7CisgICAgbmV3ZGMtPncueGZvcm1WcG9ydDJXb3JsZCA9IGRjLT53Lnhmb3JtVnBvcnQyV29ybGQ7CisgICAgbmV3ZGMtPncudnBvcnQyV29ybGRWYWxpZCA9IGRjLT53LnZwb3J0MldvcmxkVmFsaWQ7CisgICAgbmV3ZGMtPnduZE9yZ1ggICAgICAgICAgICA9IGRjLT53bmRPcmdYOworICAgIG5ld2RjLT53bmRPcmdZICAgICAgICAgICAgPSBkYy0+d25kT3JnWTsKKyAgICBuZXdkYy0+d25kRXh0WCAgICAgICAgICAgID0gZGMtPnduZEV4dFg7CisgICAgbmV3ZGMtPnduZEV4dFkgICAgICAgICAgICA9IGRjLT53bmRFeHRZOworICAgIG5ld2RjLT52cG9ydE9yZ1ggICAgICAgICAgPSBkYy0+dnBvcnRPcmdYOworICAgIG5ld2RjLT52cG9ydE9yZ1kgICAgICAgICAgPSBkYy0+dnBvcnRPcmdZOworICAgIG5ld2RjLT52cG9ydEV4dFggICAgICAgICAgPSBkYy0+dnBvcnRFeHRYOworICAgIG5ld2RjLT52cG9ydEV4dFkgICAgICAgICAgPSBkYy0+dnBvcnRFeHRZOwogCiAgICAgbmV3ZGMtPmhTZWxmID0gKEhEQzMyKWhhbmRsZTsKICAgICBuZXdkYy0+c2F2ZUxldmVsID0gMDsKQEAgLTUzOSw0NSArNjA5LDQ3IEBACiAgICAgfQogICAgIFRSQUNFKGRjLCAiJTA0eCAlMDR4XG4iLCBoZGMsIGhkY3MgKTsKIAotICAgIGRjLT53LmZsYWdzICAgICAgICAgICA9IGRjcy0+dy5mbGFncyAmIH5EQ19TQVZFRDsKLSAgICBkYy0+dy5kZXZDYXBzICAgICAgICAgPSBkY3MtPncuZGV2Q2FwczsKLSAgICBkYy0+dy5oRmlyc3RCaXRtYXAgICAgPSBkY3MtPncuaEZpcnN0Qml0bWFwOwotICAgIGRjLT53LmhEZXZpY2UgICAgICAgICA9IGRjcy0+dy5oRGV2aWNlOwotICAgIGRjLT53LlJPUG1vZGUgICAgICAgICA9IGRjcy0+dy5ST1Btb2RlOwotICAgIGRjLT53LnBvbHlGaWxsTW9kZSAgICA9IGRjcy0+dy5wb2x5RmlsbE1vZGU7Ci0gICAgZGMtPncuc3RyZXRjaEJsdE1vZGUgID0gZGNzLT53LnN0cmV0Y2hCbHRNb2RlOwotICAgIGRjLT53LnJlbEFic01vZGUgICAgICA9IGRjcy0+dy5yZWxBYnNNb2RlOwotICAgIGRjLT53LmJhY2tncm91bmRNb2RlICA9IGRjcy0+dy5iYWNrZ3JvdW5kTW9kZTsKLSAgICBkYy0+dy5iYWNrZ3JvdW5kQ29sb3IgPSBkY3MtPncuYmFja2dyb3VuZENvbG9yOwotICAgIGRjLT53LnRleHRDb2xvciAgICAgICA9IGRjcy0+dy50ZXh0Q29sb3I7Ci0gICAgZGMtPncuYmFja2dyb3VuZFBpeGVsID0gZGNzLT53LmJhY2tncm91bmRQaXhlbDsKLSAgICBkYy0+dy50ZXh0UGl4ZWwgICAgICAgPSBkY3MtPncudGV4dFBpeGVsOwotICAgIGRjLT53LmJydXNoT3JnWCAgICAgICA9IGRjcy0+dy5icnVzaE9yZ1g7Ci0gICAgZGMtPncuYnJ1c2hPcmdZICAgICAgID0gZGNzLT53LmJydXNoT3JnWTsKLSAgICBkYy0+dy50ZXh0QWxpZ24gICAgICAgPSBkY3MtPncudGV4dEFsaWduOwotICAgIGRjLT53LmNoYXJFeHRyYSAgICAgICA9IGRjcy0+dy5jaGFyRXh0cmE7Ci0gICAgZGMtPncuYnJlYWtUb3RhbEV4dHJhID0gZGNzLT53LmJyZWFrVG90YWxFeHRyYTsKLSAgICBkYy0+dy5icmVha0NvdW50ICAgICAgPSBkY3MtPncuYnJlYWtDb3VudDsKLSAgICBkYy0+dy5icmVha0V4dHJhICAgICAgPSBkY3MtPncuYnJlYWtFeHRyYTsKLSAgICBkYy0+dy5icmVha1JlbSAgICAgICAgPSBkY3MtPncuYnJlYWtSZW07Ci0gICAgZGMtPncuTWFwTW9kZSAgICAgICAgID0gZGNzLT53Lk1hcE1vZGU7Ci0gICAgZGMtPncuR3JhcGhpY3NNb2RlICAgID0gZGNzLT53LkdyYXBoaWNzTW9kZTsKLSAgICBkYy0+dy5EQ09yZ1ggICAgICAgICAgPSBkY3MtPncuRENPcmdYOwotICAgIGRjLT53LkRDT3JnWSAgICAgICAgICA9IGRjcy0+dy5EQ09yZ1k7Ci0gICAgZGMtPncuQ3Vyc1Bvc1ggICAgICAgID0gZGNzLT53LkN1cnNQb3NYOwotICAgIGRjLT53LkN1cnNQb3NZICAgICAgICA9IGRjcy0+dy5DdXJzUG9zWTsKLSAgICBkYy0+dy5BcmNEaXJlY3Rpb24gICAgPSBkY3MtPncuQXJjRGlyZWN0aW9uOwotICAgIGRjLT53LlVzZVdvcmxkWGZvcm0gICA9IGRjcy0+dy5Vc2VXb3JsZFhmb3JtOwotICAgIGRjLT53LldvcmxkWGZvcm0gICAgICA9IGRjcy0+dy5Xb3JsZFhmb3JtOworICAgIGRjLT53LmZsYWdzICAgICAgICAgICAgPSBkY3MtPncuZmxhZ3MgJiB+RENfU0FWRUQ7CisgICAgZGMtPncuZGV2Q2FwcyAgICAgICAgICA9IGRjcy0+dy5kZXZDYXBzOworICAgIGRjLT53LmhGaXJzdEJpdG1hcCAgICAgPSBkY3MtPncuaEZpcnN0Qml0bWFwOworICAgIGRjLT53LmhEZXZpY2UgICAgICAgICAgPSBkY3MtPncuaERldmljZTsKKyAgICBkYy0+dy5ST1Btb2RlICAgICAgICAgID0gZGNzLT53LlJPUG1vZGU7CisgICAgZGMtPncucG9seUZpbGxNb2RlICAgICA9IGRjcy0+dy5wb2x5RmlsbE1vZGU7CisgICAgZGMtPncuc3RyZXRjaEJsdE1vZGUgICA9IGRjcy0+dy5zdHJldGNoQmx0TW9kZTsKKyAgICBkYy0+dy5yZWxBYnNNb2RlICAgICAgID0gZGNzLT53LnJlbEFic01vZGU7CisgICAgZGMtPncuYmFja2dyb3VuZE1vZGUgICA9IGRjcy0+dy5iYWNrZ3JvdW5kTW9kZTsKKyAgICBkYy0+dy5iYWNrZ3JvdW5kQ29sb3IgID0gZGNzLT53LmJhY2tncm91bmRDb2xvcjsKKyAgICBkYy0+dy50ZXh0Q29sb3IgICAgICAgID0gZGNzLT53LnRleHRDb2xvcjsKKyAgICBkYy0+dy5iYWNrZ3JvdW5kUGl4ZWwgID0gZGNzLT53LmJhY2tncm91bmRQaXhlbDsKKyAgICBkYy0+dy50ZXh0UGl4ZWwgICAgICAgID0gZGNzLT53LnRleHRQaXhlbDsKKyAgICBkYy0+dy5icnVzaE9yZ1ggICAgICAgID0gZGNzLT53LmJydXNoT3JnWDsKKyAgICBkYy0+dy5icnVzaE9yZ1kgICAgICAgID0gZGNzLT53LmJydXNoT3JnWTsKKyAgICBkYy0+dy50ZXh0QWxpZ24gICAgICAgID0gZGNzLT53LnRleHRBbGlnbjsKKyAgICBkYy0+dy5jaGFyRXh0cmEgICAgICAgID0gZGNzLT53LmNoYXJFeHRyYTsKKyAgICBkYy0+dy5icmVha1RvdGFsRXh0cmEgID0gZGNzLT53LmJyZWFrVG90YWxFeHRyYTsKKyAgICBkYy0+dy5icmVha0NvdW50ICAgICAgID0gZGNzLT53LmJyZWFrQ291bnQ7CisgICAgZGMtPncuYnJlYWtFeHRyYSAgICAgICA9IGRjcy0+dy5icmVha0V4dHJhOworICAgIGRjLT53LmJyZWFrUmVtICAgICAgICAgPSBkY3MtPncuYnJlYWtSZW07CisgICAgZGMtPncuTWFwTW9kZSAgICAgICAgICA9IGRjcy0+dy5NYXBNb2RlOworICAgIGRjLT53LkdyYXBoaWNzTW9kZSAgICAgPSBkY3MtPncuR3JhcGhpY3NNb2RlOworICAgIGRjLT53LkRDT3JnWCAgICAgICAgICAgPSBkY3MtPncuRENPcmdYOworICAgIGRjLT53LkRDT3JnWSAgICAgICAgICAgPSBkY3MtPncuRENPcmdZOworICAgIGRjLT53LkN1cnNQb3NYICAgICAgICAgPSBkY3MtPncuQ3Vyc1Bvc1g7CisgICAgZGMtPncuQ3Vyc1Bvc1kgICAgICAgICA9IGRjcy0+dy5DdXJzUG9zWTsKKyAgICBkYy0+dy5BcmNEaXJlY3Rpb24gICAgID0gZGNzLT53LkFyY0RpcmVjdGlvbjsKKyAgICBkYy0+dy54Zm9ybVdvcmxkMlduZCAgID0gZGNzLT53Lnhmb3JtV29ybGQyV25kOworICAgIGRjLT53Lnhmb3JtV29ybGQyVnBvcnQgPSBkY3MtPncueGZvcm1Xb3JsZDJWcG9ydDsKKyAgICBkYy0+dy54Zm9ybVZwb3J0MldvcmxkID0gZGNzLT53Lnhmb3JtVnBvcnQyV29ybGQ7CisgICAgZGMtPncudnBvcnQyV29ybGRWYWxpZCA9IGRjcy0+dy52cG9ydDJXb3JsZFZhbGlkOwogCi0gICAgZGMtPnduZE9yZ1ggICAgICAgICAgID0gZGNzLT53bmRPcmdYOwotICAgIGRjLT53bmRPcmdZICAgICAgICAgICA9IGRjcy0+d25kT3JnWTsKLSAgICBkYy0+d25kRXh0WCAgICAgICAgICAgPSBkY3MtPnduZEV4dFg7Ci0gICAgZGMtPnduZEV4dFkgICAgICAgICAgID0gZGNzLT53bmRFeHRZOwotICAgIGRjLT52cG9ydE9yZ1ggICAgICAgICA9IGRjcy0+dnBvcnRPcmdYOwotICAgIGRjLT52cG9ydE9yZ1kgICAgICAgICA9IGRjcy0+dnBvcnRPcmdZOwotICAgIGRjLT52cG9ydEV4dFggICAgICAgICA9IGRjcy0+dnBvcnRFeHRYOwotICAgIGRjLT52cG9ydEV4dFkgICAgICAgICA9IGRjcy0+dnBvcnRFeHRZOworICAgIGRjLT53bmRPcmdYICAgICAgICAgICAgPSBkY3MtPnduZE9yZ1g7CisgICAgZGMtPnduZE9yZ1kgICAgICAgICAgICA9IGRjcy0+d25kT3JnWTsKKyAgICBkYy0+d25kRXh0WCAgICAgICAgICAgID0gZGNzLT53bmRFeHRYOworICAgIGRjLT53bmRFeHRZICAgICAgICAgICAgPSBkY3MtPnduZEV4dFk7CisgICAgZGMtPnZwb3J0T3JnWCAgICAgICAgICA9IGRjcy0+dnBvcnRPcmdYOworICAgIGRjLT52cG9ydE9yZ1kgICAgICAgICAgPSBkY3MtPnZwb3J0T3JnWTsKKyAgICBkYy0+dnBvcnRFeHRYICAgICAgICAgID0gZGNzLT52cG9ydEV4dFg7CisgICAgZGMtPnZwb3J0RXh0WSAgICAgICAgICA9IGRjcy0+dnBvcnRFeHRZOwogCiAgICAgaWYgKCEoZGMtPncuZmxhZ3MgJiBEQ19NRU1PUlkpKSBkYy0+dy5iaXRzUGVyUGl4ZWwgPSBkY3MtPncuYml0c1BlclBpeGVsOwogICAgIFNlbGVjdENsaXBSZ24zMiggaGRjLCBkY3MtPncuaENsaXBSZ24gKTsKQEAgLTEyMDgsMjEgKzEyODAsMTcgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgR2V0V29ybGRUcmFuc2Zvcm0gICAgKEdESTMyLjI0NCkKLSAqIEZJWE1FCi0gKglDaGVjayB0aGF0IFNldExhc3RFcnJvciBpcyBiZWluZyBjYWxsZWQgY29ycmVjdGx5CiAgKi8KIEJPT0wzMiBXSU5BUEkgR2V0V29ybGRUcmFuc2Zvcm0oIEhEQzMyIGhkYywgTFBYRk9STSB4Zm9ybSApCiB7CiAgICAgREMgKiBkYyA9IChEQyAqKSBHRElfR2V0T2JqUHRyKCBoZGMsIERDX01BR0lDICk7CiAgICAgCiAgICAgaWYgKCFkYykKLSAgICAgICAgLyogRklYTUU6IENhbGwgU2V0TGFzdEVycm9yPyAqLwogICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgaWYgKCF4Zm9ybSkKLSAgICAgICAgLyogRklYTUU6IENhbGwgU2V0TGFzdEVycm9yPyAqLwogCXJldHVybiBGQUxTRTsKIAotICAgICp4Zm9ybSA9IGRjLT53LldvcmxkWGZvcm07CisgICAgKnhmb3JtID0gZGMtPncueGZvcm1Xb3JsZDJXbmQ7CiAgICAgCiAgICAgcmV0dXJuIFRSVUU7CiB9CkBAIC0xMjQ4LDE2ICsxMzE2LDEyNSBAQAogICAgIGlmIChkYy0+dy5HcmFwaGljc01vZGUhPUdNX0FEVkFOQ0VEKQogICAgICAgIHJldHVybiBGQUxTRTsKIAotICAgIGRjLT53LldvcmxkWGZvcm0gPSAqeGZvcm07Ci0KLSAgICAvKiBXZSBvbmx5IGhhdmUgdG8gdXNlIHRoZSBuZXcgd29ybGQgdHJhbnNmb3JtIGlmIGl0J3Mgbm90IHRoZQotICAgICAqIGlkZW50aXR5IHRyYW5zZm9ybWF0aW9uCi0gICAgICovCi0gICAgZGMtPncuVXNlV29ybGRYZm9ybT0KLSAgICAgICAoeGZvcm0tPmVNMTEhPTEuMGYgfHwgeGZvcm0tPmVNMTIhPTAuMGYgfHwKLSAgICAgICAgeGZvcm0tPmVNMjEhPTAuMGYgfHwgeGZvcm0tPmVNMjIhPTEuMGYgfHwKLSAgICAgICAgeGZvcm0tPmVEeCE9MC4wZiAgfHwgeGZvcm0tPmVEeSE9MC4wZik7CisgICAgZGMtPncueGZvcm1Xb3JsZDJXbmQgPSAqeGZvcm07CiAgICAgCisgICAgRENfVXBkYXRlWGZvcm1zKCBkYyApOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1vZGlmeVdvcmxkVHJhbnNmb3JtIFtHREkzMi4yNTNdCisgKiBNb2RpZmllcyB0aGUgd29ybGQgdHJhbnNmb3JtYXRpb24gZm9yIGEgZGV2aWNlIGNvbnRleHQuCisgKgorICogUEFSQU1TCisgKiAgICBoZGMgICBbSV0gSGFuZGxlIHRvIGRldmljZSBjb250ZXh0CisgKiAgICB4Zm9ybSBbSV0gWEZPUk0gc3RydWN0dXJlIHRoYXQgd2lsbCBiZSB1c2VkIHRvIG1vZGlmeSB0aGUgd29ybGQKKyAqICAgICAgICAgICAgICB0cmFuc2Zvcm1hdGlvbgorICogICAgaU1vZGUgW0ldIFNwZWNpZmllcyBpbiB3aGF0IHdheSB0byBtb2RpZnkgdGhlIHdvcmxkIHRyYW5zZm9ybWF0aW9uCisgKiAgICAgICAgICAgICAgUG9zc2libGUgdmFsdWVzOgorICogICAgICAgICAgICAgIE1XVF9JREVOVElUWQorICogICAgICAgICAgICAgICAgIFJlc2V0cyB0aGUgd29ybGQgdHJhbnNmb3JtYXRpb24gdG8gdGhlIGlkZW50aXR5IG1hdHJpeC4KKyAqICAgICAgICAgICAgICAgICBUaGUgcGFyYW1ldGVyIHhmb3JtIGlzIGlnbm9yZWQuCisgKiAgICAgICAgICAgICAgTVdUX0xFRlRNVUxUSVBMWQorICogICAgICAgICAgICAgICAgIE11bHRpcGxpZXMgeGZvcm0gaW50byB0aGUgd29ybGQgdHJhbnNmb3JtYXRpb24gbWF0cml4IGZyb20KKyAqICAgICAgICAgICAgICAgICB0aGUgbGVmdC4KKyAqICAgICAgICAgICAgICBNV1RfUklHSFRNVUxUSVBMWQorICogICAgICAgICAgICAgICAgIE11bHRpcGxpZXMgeGZvcm0gaW50byB0aGUgd29ybGQgdHJhbnNmb3JtYXRpb24gbWF0cml4IGZyb20KKyAqICAgICAgICAgICAgICAgICB0aGUgcmlnaHQuCisgKgorICogUkVUVVJOUyBTVEQKKyAqLworQk9PTDMyIFdJTkFQSSBNb2RpZnlXb3JsZFRyYW5zZm9ybSggSERDMzIgaGRjLCBjb25zdCBYRk9STSAqeGZvcm0sCisgICAgRFdPUkQgaU1vZGUgKQoreworICAgIERDICogZGMgPSAoREMgKikgR0RJX0dldE9ialB0ciggaGRjLCBEQ19NQUdJQyApOworICAgIAorICAgIC8qIENoZWNrIGZvciBpbGxlZ2FsIHBhcmFtZXRlcnMgKi8KKyAgICBpZiAoIWRjKQorICAgIHsKKyAgICAgICAgU2V0TGFzdEVycm9yKCBFUlJPUl9JTlZBTElEX0hBTkRMRSApOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIGlmICgheGZvcm0pCisJcmV0dXJuIEZBTFNFOworICAgIAorICAgIC8qIENoZWNrIHRoYXQgZ3JhcGhpY3MgbW9kZSBpcyBHTV9BRFZBTkNFRCAqLworICAgIGlmIChkYy0+dy5HcmFwaGljc01vZGUhPUdNX0FEVkFOQ0VEKQorICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAKKyAgICBzd2l0Y2ggKGlNb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBNV1RfSURFTlRJVFk6CisJICAgIGRjLT53Lnhmb3JtV29ybGQyV25kLmVNMTEgPSAxLjBmOworCSAgICBkYy0+dy54Zm9ybVdvcmxkMlduZC5lTTEyID0gMC4wZjsKKwkgICAgZGMtPncueGZvcm1Xb3JsZDJXbmQuZU0yMSA9IDAuMGY7CisJICAgIGRjLT53Lnhmb3JtV29ybGQyV25kLmVNMjIgPSAxLjBmOworCSAgICBkYy0+dy54Zm9ybVdvcmxkMlduZC5lRHggID0gMC4wZjsKKwkgICAgZGMtPncueGZvcm1Xb3JsZDJXbmQuZUR5ICA9IDAuMGY7CisJICAgIGJyZWFrOworICAgICAgICBjYXNlIE1XVF9MRUZUTVVMVElQTFk6CisJICAgIENvbWJpbmVUcmFuc2Zvcm0oICZkYy0+dy54Zm9ybVdvcmxkMlduZCwgeGZvcm0sCisJICAgICAgICAmZGMtPncueGZvcm1Xb3JsZDJXbmQgKTsKKwkgICAgYnJlYWs7CisJY2FzZSBNV1RfUklHSFRNVUxUSVBMWToKKwkgICAgQ29tYmluZVRyYW5zZm9ybSggJmRjLT53Lnhmb3JtV29ybGQyV25kLCAmZGMtPncueGZvcm1Xb3JsZDJXbmQsCisJICAgICAgICB4Zm9ybSApOworCSAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKwkgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIERDX1VwZGF0ZVhmb3JtcyggZGMgKTsKKworICAgIHJldHVybiBUUlVFOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb21iaW5lVHJhbnNmb3JtIFtHREkzMi4yMF0KKyAqIENvbWJpbmVzIHR3byB0cmFuc2Zvcm1hdGlvbiBtYXRyaWNlcy4KKyAqCisgKiBQQVJBTVMKKyAqICAgIHhmb3JtUmVzdWx0IFtPXSBTdG9yZXMgdGhlIHJlc3VsdCBvZiBjb21iaW5pbmcgdGhlIHR3byBtYXRyaWNlcworICogICAgeGZvcm0xICAgICAgW0ldIFNwZWNpZmllcyB0aGUgZmlyc3QgbWF0cml4IHRvIGFwcGx5CisgKiAgICB4Zm9ybTIgICAgICBbSV0gU3BlY2lmaWVzIHRoZSBzZWNvbmQgbWF0cml4IHRvIGFwcGx5CisgKgorICogUkVNQVJLUworICogICAgVGhlIHNhbWUgbWF0cml4IGNhbiBiZSBwYXNzZWQgaW4gZm9yIG1vcmUgdGhhbiBvbmUgb2YgdGhlIHBhcmFtZXRlcnMuCisgKgorICogUkVUVVJOUyBTVEQKKyAqLworQk9PTDMyIFdJTkFQSSBDb21iaW5lVHJhbnNmb3JtKCBMUFhGT1JNIHhmb3JtUmVzdWx0LCBjb25zdCBYRk9STSAqeGZvcm0xLAorICAgIGNvbnN0IFhGT1JNICp4Zm9ybTIgKQoreworICAgIFhGT1JNIHhmb3JtVGVtcDsKKyAgICAKKyAgICAvKiBDaGVjayBmb3IgaWxsZWdhbCBwYXJhbWV0ZXJzICovCisgICAgaWYgKCF4Zm9ybVJlc3VsdCB8fCAheGZvcm0xIHx8ICF4Zm9ybTIpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIC8qIENyZWF0ZSB0aGUgcmVzdWx0IGluIGEgdGVtcG9yYXJ5IFhGT1JNLCBzaW5jZSB4Zm9ybVJlc3VsdCBtYXkgYmUKKyAgICAgKiBlcXVhbCB0byB4Zm9ybTEgb3IgeGZvcm0yICovCisgICAgeGZvcm1UZW1wLmVNMTEgPSB4Zm9ybTEtPmVNMTEgKiB4Zm9ybTItPmVNMTEgKworICAgICAgICAgICAgICAgICAgICAgeGZvcm0xLT5lTTEyICogeGZvcm0yLT5lTTIxOworICAgIHhmb3JtVGVtcC5lTTEyID0geGZvcm0xLT5lTTExICogeGZvcm0yLT5lTTEyICsKKyAgICAgICAgICAgICAgICAgICAgIHhmb3JtMS0+ZU0xMiAqIHhmb3JtMi0+ZU0yMjsKKyAgICB4Zm9ybVRlbXAuZU0yMSA9IHhmb3JtMS0+ZU0yMSAqIHhmb3JtMi0+ZU0xMSArCisgICAgICAgICAgICAgICAgICAgICB4Zm9ybTEtPmVNMjIgKiB4Zm9ybTItPmVNMjE7CisgICAgeGZvcm1UZW1wLmVNMjIgPSB4Zm9ybTEtPmVNMjEgKiB4Zm9ybTItPmVNMTIgKworICAgICAgICAgICAgICAgICAgICAgeGZvcm0xLT5lTTIyICogeGZvcm0yLT5lTTIyOworICAgIHhmb3JtVGVtcC5lRHggID0geGZvcm0xLT5lRHggICogeGZvcm0yLT5lTTExICsKKyAgICAgICAgICAgICAgICAgICAgIHhmb3JtMS0+ZUR5ICAqIHhmb3JtMi0+ZU0yMSArCisgICAgICAgICAgICAgICAgICAgICB4Zm9ybTItPmVEeDsKKyAgICB4Zm9ybVRlbXAuZUR5ICA9IHhmb3JtMS0+ZUR4ICAqIHhmb3JtMi0+ZU0xMiArCisgICAgICAgICAgICAgICAgICAgICB4Zm9ybTEtPmVEeSAgKiB4Zm9ybTItPmVNMjIgKworICAgICAgICAgICAgICAgICAgICAgeGZvcm0yLT5lRHk7CisKKyAgICAvKiBDb3B5IHRoZSByZXN1bHQgdG8geGZvcm1SZXN1bHQgKi8KKyAgICAqeGZvcm1SZXN1bHQgPSB4Zm9ybVRlbXA7CisKICAgICByZXR1cm4gVFJVRTsKIH0KIApkaWZmIC0tZ2l0IGEvb2JqZWN0cy9lbmhtZXRhZmlsZS5jIGIvb2JqZWN0cy9lbmhtZXRhZmlsZS5jCmluZGV4IGQ2Yjc4NGYuLjhjMzRiZjkgMTAwNjQ0Ci0tLSBhL29iamVjdHMvZW5obWV0YWZpbGUuYworKysgYi9vYmplY3RzL2VuaG1ldGFmaWxlLmMKQEAgLTE2NCw3ICsxNjQsNyBAQAogICAgIHsKICAgICBjYXNlIEVNUl9IRUFERVI6CiAgICAgICB7Ci0JRU5ITUVUQUhFQURFUiAqaCA9IChMUEVOSE1FVEFIRUFERVIpIG1yOworCS8qIEVOSE1FVEFIRUFERVIgKmggPSAoTFBFTkhNRVRBSEVBREVSKSBtcjsgKi8KIAlicmVhazsKICAgICAgIH0KICAgICBjYXNlIEVNUl9FT0Y6CkBAIC00MTgsNyArNDE4LDcgQEAKICAgICBpZiAocC0+aVR5cGUgPT0gRU1SX0VPRikgYnJlYWs7CiAgICAgcCA9ICh2b2lkICopIHAgKyBwLT5uU2l6ZTsKICAgfQotICBHbG9iYWxGcmVlMzIoaHQpOworICBHbG9iYWxGcmVlMzIoKEhHTE9CQUwzMilodCk7CiAgIEdsb2JhbFVubG9jazMyKGhtZik7CiAgIHJldHVybiByZXQ7CiB9CkBAIC00NjUsNyArNDY1LDggQEAKICAgICBwID0gKHZvaWQgKikgcCArIHAtPm5TaXplOyAvKiBjYXN0ZWQgc28gdGhhdCBhcml0aG1ldGljIGlzIGluIGJ5dGVzICovCiAgIH0KICAgR2xvYmFsVW5sb2NrMzIoaG1mKTsKLSAgcmV0dXJuIFRSVUU7CisgIHJldCA9IFRSVUU7IC8qIEZJWE1FOiBjYWxjdWxhdGUgYSBtb3JlIGFjY3VyYXRlIHJldHVybiB2YWx1ZSAqLworICByZXR1cm4gcmV0OwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL29iamVjdHMvbWV0YWZpbGUuYyBiL29iamVjdHMvbWV0YWZpbGUuYwppbmRleCA2ZTNkMGI4Li4wMzA4NjYwIDEwMDY0NAotLS0gYS9vYmplY3RzL21ldGFmaWxlLmMKKysrIGIvb2JqZWN0cy9tZXRhZmlsZS5jCkBAIC00NDQsNyArNDQ0LDcgQEAKICAgICBIRk9OVDMyIGhGb250OwogCiAgICAgVFJBQ0UobWV0YWZpbGUsIiglMDh4LCUwOHgsJXAsJXApXG4iLAotCQkgICAgIGhkYywgaG1mLCBscEVudW1GdW5jLCBscERhdGEpOworCQkgICAgIGhkYywgaG1mLCBscEVudW1GdW5jLCAodm9pZCopbHBEYXRhKTsKICAgICBpZiAoIW1oKSByZXR1cm4gMDsKIAogICAgIC8qIHNhdmUgdGhlIGN1cnJlbnQgcGVuLCBicnVzaCBhbmQgZm9udCAqLwpAQCAtNDg0LDcgKzQ4NCw3IEBACiAgICAgICAgIERlbGV0ZU9iamVjdDMyKCooaHQtPm9iamVjdEhhbmRsZSArIGkpKTsKIAogICAgIC8qIGZyZWUgaGFuZGxlIHRhYmxlICovCi0gICAgR2xvYmFsRnJlZTMyKGh0KTsKKyAgICBHbG9iYWxGcmVlMzIoKEhHTE9CQUwzMilodCk7CiAgICAgR2xvYmFsVW5sb2NrMTYoaG1mKTsKICAgICByZXR1cm4gcmVzdWx0OwogfQpAQCAtOTY4LDcgKzk2OCw3IEBACiAgIFBsYXlNZXRhRmlsZVJlY29yZDE2KGhkYywgaHQsIG1ldGFyZWNvcmQsIGhhbmRsZXMpOwogICBmb3IgKGk9MDsgaTxoYW5kbGVzOyBpKyspIAogICAgIGhhbmRsZXRhYmxlLT5vYmplY3RIYW5kbGVbaV0gPSBodC0+b2JqZWN0SGFuZGxlW2ldOwotICBHbG9iYWxGcmVlMzIoaHQpOworICBHbG9iYWxGcmVlMzIoKEhHTE9CQUwzMilodCk7CiAgIHJldHVybiBUUlVFOwogfQogCkBAIC0xMDYwLDcgKzEwNjAsNyBAQAogICBpZiAoIWgpIHJldHVybiAwOyAgLyogRklYTUU6IGVycm9yIGNvZGUgKi8KICAgaWYgKCFidWYpIHsKICAgICBHbG9iYWxVbmxvY2sxNihobWYpOwotICAgIFRSQUNFKG1ldGFmaWxlLCJyZXR1cm5pbmcgc2l6ZSAlZFxuIiwgaC0+bXRTaXplKTsKKyAgICBUUkFDRShtZXRhZmlsZSwicmV0dXJuaW5nIHNpemUgJWxkXG4iLCBoLT5tdFNpemUpOwogICAgIHJldHVybiBoLT5tdFNpemU7CiAgIH0KICAgbWVtbW92ZShidWYsIGgsIE1JTihuU2l6ZSwgaC0+bXRTaXplKSk7CmRpZmYgLS1naXQgYS9vYmplY3RzL29lbWJpdG1hcC5jIGIvb2JqZWN0cy9vZW1iaXRtYXAuYwppbmRleCA5ZjJjZDRiLi44NjJlYzUyIDEwMDY0NAotLS0gYS9vYmplY3RzL29lbWJpdG1hcC5jCisrKyBiL29iamVjdHMvb2VtYml0bWFwLmMKQEAgLTMzNSw3ICszMzUsNyBAQAogICAgIGJtcE9ialB0ci0+Yml0bWFwLmJtV2lkdGhCeXRlcyA9IEJJVE1BUF9XSURUSF9CWVRFUyggd2lkdGgsIGJwcCApOwogICAgIGJtcE9ialB0ci0+Yml0bWFwLmJtUGxhbmVzICAgICA9IDE7CiAgICAgYm1wT2JqUHRyLT5iaXRtYXAuYm1CaXRzUGl4ZWwgID0gYnBwOwotICAgIGJtcE9ialB0ci0+Yml0bWFwLmJtQml0cyAgICAgICA9IE5VTEw7CisgICAgYm1wT2JqUHRyLT5iaXRtYXAuYm1CaXRzICAgICAgID0gKFNFR1BUUilOVUxMOwogICAgIEdESV9IRUFQX1VOTE9DSyggaGJpdG1hcCApOwogICAgIHJldHVybiBoYml0bWFwOwogfQpkaWZmIC0tZ2l0IGEvb2JqZWN0cy9wYWxldHRlLmMgYi9vYmplY3RzL3BhbGV0dGUuYwppbmRleCBlNDcxMTQ4Li41NzUyY2I3IDEwMDY0NAotLS0gYS9vYmplY3RzL3BhbGV0dGUuYworKysgYi9vYmplY3RzL3BhbGV0dGUuYwpAQCAtMTI2LDcgKzEyNiw3IEBACiAgICAgSERDMzIgaGRjKSAvKiBbaW5dIEhhbmRsZSB0byBkZXZpY2UgY29udGV4dCAqLwogewogICAgIEZJWE1FKHBhbGV0dGUsIigleCk6IHN0dWJcbiIsIGhkYyk7Ci0gICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIChIUEFMRVRURTMyKU5VTEw7CiB9CiAKIApkaWZmIC0tZ2l0IGEvb2JqZWN0cy9yZWdpb24uYyBiL29iamVjdHMvcmVnaW9uLmMKaW5kZXggOWY3NzFlZC4uYTlhZWUxYyAxMDA2NDQKLS0tIGEvb2JqZWN0cy9yZWdpb24uYworKysgYi9vYmplY3RzL3JlZ2lvbi5jCkBAIC0xMTUxLDkgKzExNTEsMTUgQEAKICAgICByMUVuZCA9IHIxICsgcmVnMS0+bnVtUmVjdHM7CiAgICAgcjJFbmQgPSByMiArIHJlZzItPm51bVJlY3RzOwogICAgIAorCisgICAgLyoKKyAgICAgKiBuZXdSZWcgbWF5IGJlIG9uZSBvZiB0aGUgc3JjIHJlZ2lvbnMgc28gd2UgY2FuJ3QgZW1wdHkgaXQuIFdlIGtlZXAgYSAKKyAgICAgKiBub3RlIG9mIGl0cyByZWN0cyBwb2ludGVyIChzbyB0aGF0IHdlIGNhbiBmcmVlIHRoZW0gbGF0ZXIpLCBwcmVzZXJ2ZSBpdHMKKyAgICAgKiBleHRlbnRzIGFuZCBzaW1wbHkgc2V0IG51bVJlY3RzIHRvIHplcm8uIAorICAgICAqLworCiAgICAgb2xkUmVjdHMgPSBuZXdSZWctPnJlY3RzOwotICAgIAotICAgIEVNUFRZX1JFR0lPTihuZXdSZWcpOworICAgIG5ld1JlZy0+bnVtUmVjdHMgPSAwOwogCiAgICAgLyoKICAgICAgKiBBbGxvY2F0ZSBhIHJlYXNvbmFibGUgbnVtYmVyIG9mIHJlY3RhbmdsZXMgZm9yIHRoZSBuZXcgcmVnaW9uLiBUaGUgaWRlYQpkaWZmIC0tZ2l0IGEvb2xlL2NvbXBvYmouYyBiL29sZS9jb21wb2JqLmMKaW5kZXggY2U0NDgwNi4uMzVlYjI5MCAxMDA2NDQKLS0tIGEvb2xlL2NvbXBvYmouYworKysgYi9vbGUvY29tcG9iai5jCkBAIC03Miw3ICs3Miw3IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIENvR2V0TWFsbG9jICAgIFtDT01QT0JKLjRdCisgKiAgICAgICAgICAgQ29HZXRNYWxsb2MxNiAgICBbQ09NUE9CSi40XQogICogUkVUVVJOUwogICoJVGhlIGN1cnJlbnQgd2luMTYgSU1hbGxvYwogICovCkBAIC04Nyw3ICs4Nyw3IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIENvR2V0TWFsbG9jICAgIChPTEUzMi40XQorICogICAgICAgICAgIENvR2V0TWFsbG9jMzIgICAgW09MRTMyLjRdCiAgKiBSRVRVUk5TCiAgKglUaGUgY3VycmVudCB3aW4zMiBJTWFsbG9jCiAgKi8KZGlmZiAtLWdpdCBhL29sZS9pZnMuYyBiL29sZS9pZnMuYwppbmRleCAyOTgwZWQxLi4xNTdlNTE1IDEwMDY0NAotLS0gYS9vbGUvaWZzLmMKKysrIGIvb2xlL2lmcy5jCkBAIC0xMjEsNiArMTIxLDggQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAorI2lmZGVmIE9MRF9UQUJMRQorLyogRklYTUU6IFRoaXMgaXMgdW51c2VkICovCiBzdGF0aWMgSU1hbGxvYzE2X1ZUYWJsZSBtdnQxNiA9IHsKIAlJTWFsbG9jMTZfUXVlcnlJbnRlcmZhY2UsCiAJSU1hbGxvYzE2X0FkZFJlZiwKQEAgLTEzMiw2ICsxMzQsNyBAQAogCUlNYWxsb2MxNl9EaWRBbGxvYywKIAlJTWFsbG9jMTZfSGVhcE1pbmltaXplLAogfTsKKyNlbmRpZgogc3RhdGljIElNYWxsb2MxNl9WVGFibGUgKm1zZWd2dDE2ID0gTlVMTDsKIAogTFBNQUxMT0MxNgpkaWZmIC0tZ2l0IGEvb2xlL29sZTIuYyBiL29sZS9vbGUyLmMKaW5kZXggNTc3YzQxZC4uNWJmZTNjNyAxMDA2NDQKLS0tIGEvb2xlL29sZTIuYworKysgYi9vbGUvb2xlMi5jCkBAIC0yOCw4ICsyOCwxNCBAQAogICAgIHJldHVybiBTX09LOwogfQogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvR2V0Q3VycmVudFByb2Nlc3MgW09MRTIuMl1bT0xFMzIuMTA4XQorICoKKyAqIE5PVEVTCisgKiAgIElzIERXT1JEIHJlYWxseSB0aGUgY29ycmVjdCByZXR1cm4gdHlwZSBmb3IgdGhpcyBmdW5jdGlvbj8KKyAqLwogRFdPUkQgV0lOQVBJIENvR2V0Q3VycmVudFByb2Nlc3MoKSB7Ci0JcmV0dXJuIFBST0NFU1NfQ3VycmVudCgpOworCXJldHVybiAoRFdPUkQpUFJPQ0VTU19DdXJyZW50KCk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvb2xlL29sZTJubHMuYyBiL29sZS9vbGUybmxzLmMKaW5kZXggZWM4ZDAzOC4uYzFkNmZjYSAxMDA2NDQKLS0tIGEvb2xlL29sZTJubHMuYworKysgYi9vbGUvb2xlMm5scy5jCkBAIC03LDcgKzcsNiBAQAogCiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJoZWFwLmgiCkBAIC0yMzE4LDI0ICsyMzE3LDI1IEBACiAgICByZXR1cm4gb3V0cG9zOwogfQogCi0vKiAgT0xFX0dldEZvcm1hdFcgIFtpbnRlcm5hbF0gICovCi0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogT0xFX0dldEZvcm1hdFcgIFtpbnRlcm5hbF0gIAorICovCiBJTlQzMiBXSU5BUEkgT0xFX0dldEZvcm1hdFcoTENJRCBsb2NhbGUsIERXT1JEIGZsYWdzLAogCQkJICAgIExQU1lTVEVNVElNRSB4dGltZSwKIAkJCSAgICBMUENXU1RSIGZvcm1hdCwKIAkJCSAgICBMUFdTVFIgb3V0cHV0LCBJTlQzMiBvdXRsZW4pCiB7CiAgICBJTlQzMiAgIGlucG9zLCBvdXRwb3M7Ci0gICBpbnQgICAgIGNvdW50LCB0eXBlLCBpbnF1b3RlOworICAgaW50ICAgICBjb3VudCwgdHlwZT0wLCBpbnF1b3RlOwogICAgaW50ICAgICBPdmVyZmxvdzsgLyogbG9vcCBjaGVjayAqLwogICAgaW50IHVzZWRhdGUsIHVzZXRpbWU7CiAgICBXQ0hBUiAgIGJ1Zls0MF07Ci0gICBpbnQgICAgIGJ1ZmxlbjsKKyAgIGludCAgICAgYnVmbGVuPTA7CiAgICBjaGFyICAgIGFidWZbNDBdOwogICAgV0NIQVIgICBhcmcwW10gPSB7MH0sIGFyZzFbXSA9IHsnJScsJ2QnLDB9OwogICAgV0NIQVIgICBhcmcyW10gPSB7JyUnLCcwJywnMicsJ2QnLDB9OwogICAgV0NIQVIgICphcmdhcnJbXSA9IHthcmcwLCBhcmcxLCBhcmcyfTsKLSAgIGludCAgICAgZGF0ZXZhcnMsIHRpbWV2YXJzOworICAgaW50ICAgICBkYXRldmFycz0wLCB0aW1ldmFycz0wOwogCiAgICAvKiBtYWtlIGEgZGVidWcgcmVwb3J0ICovCiAgICBsc3RyY3B5bld0b0EoYWJ1ZiwgZm9ybWF0LCBzaXplb2YoZm9ybWF0KSk7CkBAIC0yNzE2LDcgKzI3MTYsNyBAQAogewogICAgY2hhciBkZWJ1Z2J1Zls0MF07CiAgICBXQ0hBUiBidWZbMjBdOwotICAgTFBDV1NUUiByZWFsZm9ybWF0OworICAgTFBDV1NUUiByZWFsZm9ybWF0PTA7CiAgICBTWVNURU1USU1FIHQ7CiAgICBMUFNZU1RFTVRJTUUgcmVhbHRpbWU7CiAgICBXQ0hBUiAqIGZtdF9idWYgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvb2xlL3N0b3JhZ2UuYyBiL29sZS9zdG9yYWdlLmMKaW5kZXggZDdmY2RjNi4uMDRkZmQzZiAxMDA2NDQKLS0tIGEvb2xlL3N0b3JhZ2UuYworKysgYi9vbGUvc3RvcmFnZS5jCkBAIC0yODIsNyArMjgyLDggQEAKIAlyZXR1cm4gLTE7CiB9CiAKLXN0YXRpYyB2b2lkCisvKiBGSVhNRTogRnVuY3Rpb24gaXMgdW51c2VkICovCit2b2lkCiBTVE9SQUdFX2R1bXBfcHBzX2VudHJ5KHN0cnVjdCBzdG9yYWdlX3Bwc19lbnRyeSAqc3RkZSkgewogCWNoYXIJbmFtZVszM10seGd1aWRbNTBdOwogCkBAIC0xMTAyLDcgKzExMDMsNyBAQAogCVRSQUNFKG9sZSwiKCVwKS0+KCVwLDB4JTA4bHgpXG4iLAogCQl0aGlzLHBzdGF0c3RnLGdyZlN0YXRGbGFnCiAJKTsKLQlwc3RhdHN0Zy0+cHdjc05hbWU9U0VHUFRSX0dFVChTRUdQVFJfU1RSRFVQX1d0b0EodGhpcy0+c3RkZS5wcHNfcmF3bmFtZSkpOworCXBzdGF0c3RnLT5wd2NzTmFtZT0oTFBPTEVTVFIxNilTRUdQVFJfR0VUKFNFR1BUUl9TVFJEVVBfV3RvQSh0aGlzLT5zdGRlLnBwc19yYXduYW1lKSk7CiAJcHN0YXRzdGctPnR5cGUgPSB0aGlzLT5zdGRlLnBwc190eXBlOwogCXBzdGF0c3RnLT5jYlNpemUuTG93UGFydCA9IHRoaXMtPnN0ZGUucHBzX3NpemU7CiAJcHN0YXRzdGctPm10aW1lID0gdGhpcy0+c3RkZS5wcHNfZnQxOyAvKiBGSVhNRSAqLyAvKiB3aHk/ICovCmRpZmYgLS1naXQgYS9vbGUvdHlwZWxpYi5jIGIvb2xlL3R5cGVsaWIuYwppbmRleCA5ZTUyOWZlLi4wZjY3NGFiIDEwMDY0NAotLS0gYS9vbGUvdHlwZWxpYi5jCisrKyBiL29sZS90eXBlbGliLmMKQEAgLTQzLDcgKzQzLDcgQEAKIAkJKTsKIAl9IGVsc2UgewogCQlzcHJpbnRmKHhndWlkLCI8Z3VpZCAweCUwOGx4PiIsKERXT1JEKWd1aWQpOwotCQlGSVhNRShvbGUsIiglcywlZCwlZCwweCUwNHgsJXApLGNhbid0IGhhbmRsZSBub24tc3RyaW5nIGd1aWRzLlxuIix4Z3VpZCx3TWFqLHdNaW4sbGNpZCxwYXRoKTsKKwkJRklYTUUob2xlLCIoJXMsJWQsJWQsMHglMDR4LCVwKSxjYW4ndCBoYW5kbGUgbm9uLXN0cmluZyBndWlkcy5cbiIseGd1aWQsd01haix3TWluLChEV09SRClsY2lkLHBhdGgpOwogCQlyZXR1cm4gRV9GQUlMOwogCX0KIAlwbGVuID0gc2l6ZW9mKHBhdGhuYW1lKTsKQEAgLTgwLDcgKzgwLDcgQEAKIAkJKTsKIAl9IGVsc2UgewogCQlzcHJpbnRmKHhndWlkLCI8Z3VpZCAweCUwOGx4PiIsKERXT1JEKWd1aWQpOwotCQlGSVhNRShvbGUsIiglcywlZCwlZCwweCUwNHgsJXApLHN0dWIhXG4iLHhndWlkLHdNYWosd01pbixsY2lkLHBhdGgpOworCQlGSVhNRShvbGUsIiglcywlZCwlZCwweCUwNHgsJXApLHN0dWIhXG4iLHhndWlkLHdNYWosd01pbiwoRFdPUkQpbGNpZCxwYXRoKTsKIAkJcmV0dXJuIEVfRkFJTDsKIAl9CiAJcGxlbiA9IHNpemVvZihwYXRobmFtZSk7CmRpZmYgLS1naXQgYS9wcm9ncmFtcy9NYWtlZmlsZS5pbiBiL3Byb2dyYW1zL01ha2VmaWxlLmluCmluZGV4IDY1M2M3ZjMuLmFhZjNjN2MgMTAwNjQ0Ci0tLSBhL3Byb2dyYW1zL01ha2VmaWxlLmluCisrKyBiL3Byb2dyYW1zL01ha2VmaWxlLmluCkBAIC0yLDYgKzIsNyBAQAogCWNsb2NrIFwKIAlub3RlcGFkIFwKIAlwcm9nbWFuIFwKKwlyZWd0ZXN0IFwKIAl2aWV3IFwKIAl3aW5oZWxwIFwKIAl3aW52ZXIKZGlmZiAtLWdpdCBhL3Byb2dyYW1zL25vdGVwYWQvQ2hhbmdlTG9nIGIvcHJvZ3JhbXMvbm90ZXBhZC9DaGFuZ2VMb2cKaW5kZXggMmMyOTg3Yi4uYmE3MmQ5NSAxMDA2NDQKLS0tIGEvcHJvZ3JhbXMvbm90ZXBhZC9DaGFuZ2VMb2cKKysrIGIvcHJvZ3JhbXMvbm90ZXBhZC9DaGFuZ2VMb2cKQEAgLTEsMzUgKzEsNDUgQEAKK0ZyaSBNYXkgMTUgMjM6NTk6MjIgMTk5OCAgTWFyY2VsIEJhdXIgPG1iYXVyQGcyNi5ldGh6LmNoPgorICAgICAgICAqIERhdGUvVGltZSBub3cgdXNlcyBsb2NhbGUtc3BlY2lmaWMgZm9ybWF0cworICAgICAgICAqIExhbmd1YWdlLXNwZWNpZmljIHdpbmRvdyBjYXB0aW9uLCBkaXNwbGF5cyBmaWxlIGJlaW5nIGVkaXRlZC4KKyAgICAgICAgKiBTdGFydGVkIHdpdGggcGFyc2luZyBvZiBjb21tYW5kIGxpbmUgc2V0dGluZ3MKKyAgICAgICAgKiBTdGFydGVkIHdpdGggRG9PcGVuRmlsZSwgRG9DbG9zZUZpbGUsIERvU2F2ZUZpbGUgbG9naWNzCisgICAgICAgICogUHJvbXB0IHVzZXIgdG8gc2F2ZSBzZXR0aW5ncyB3aGVuIGNsb3NpbmcgYSBmaWxlCisgICAgICAgICAgLT4gSW50cm9kdWNlZCBhIG5ldyBtZXNzYWdlIGJveCAobm90IHlldCBmaW5pc2hlZCkKKyAgICAgICAgKiBGaXhlZCBtaW5vciBmZWF0dXJlcyAobWlzc2luZyBJRFMgaW4gbWFpbi5oLCAuLi4pCisKIFN1biBNYXIgMjkgMjA6Mjk6NDEgMTk5OCAgTGF1cmVudCBCdWZmbGVyIDxsYXVyZW50QGJsdWV3aW4uY2g+Ci0JKiBbRnIucmNdCi0JQWRkZWQgRnJlbmNoIGxhbmd1YWdlIHN1cHBvcnQuCisgICAgICAgICogW0ZyLnJjXQorICAgICAgICBBZGRlZCBGcmVuY2ggbGFuZ3VhZ2Ugc3VwcG9ydC4KIAogRnJpIEZlYiAyNyAyMTowMzozNyAxOTk4ICBLYXJsIEJhY2tzdHL2bSA8a2FybF9iQGdlb2NpdGllcy5jb20+Ci0JKiBGaXhlZCBzb21lIG1pbm9yIGZlYXR1cmVzLgorICAgICAgICAqIEZpeGVkIHNvbWUgbWlub3IgZmVhdHVyZXMuCiAKIFNhdCBGZWIgMTQgMTc6NDI6MjkgMTk5OCAgS2FybCBCYWNrc3Ry9m0gPGthcmxfYkBnZW9jaXRpZXMuY29tPgogICAgICAgICAqIE5FVyBbbGFuZ3VhZ2UuY10gW2xhbmd1YWdlLmhdCi0JVGFrZXMgY2FyZSBvZiBhbGwgbGFuZ3VhZ2UgcmVsYXRlZCBzdHVmZi4KLQlBIG5ldyBbcHJvZ3JhbXNdIGluIC53aW5lcmMgaXMgaW4gdXNlLgorICAgICAgICBUYWtlcyBjYXJlIG9mIGFsbCBsYW5ndWFnZSByZWxhdGVkIHN0dWZmLgorICAgICAgICBBIG5ldyBbcHJvZ3JhbXNdIGluIC53aW5lcmMgaXMgaW4gdXNlLgogCiBUdWUgRmViIDEwIDIzOjM0OjA4IDE5OTggIE1hcmNlbCBCYXVyIDxtYmF1ckBnMjYuZXRoei5jaD4KICAgICAgICAgKiBGaXhlZCBicm9rZW4gbGFuZ3VhZ2UgbWVudXMKIAogRnJpIEZlYiAwNiAyMy41NC4zNSAxOTk4ICBLYXJsIEJhY2tzdHL2bSA8a2FybF9iQGdlb2NpdGllcy5jb20+Ci0JKiBbbWFpbi5jXSBbbWFpbi5oXSBbbm90ZXBhZC5yY10KLQlGaXhlZCBsYW5ndWFnZSBzdXBwb3J0IGZvciBtZW51cy4gICAgIAotCSogTkVXIFtkaWFsb2cuY10gW2RpYWxvZy5oXQotCU1vdmVkIGFsbCBtZW51IGFuZCBkaWFsb2cgcmVsYXRlZCBzdHVmZiBoZXJlLgorICAgICAgICAqIFttYWluLmNdIFttYWluLmhdIFtub3RlcGFkLnJjXQorICAgICAgICBGaXhlZCBsYW5ndWFnZSBzdXBwb3J0IGZvciBtZW51cy4gICAgIAorICAgICAgICAqIE5FVyBbZGlhbG9nLmNdIFtkaWFsb2cuaF0KKyAgICAgICAgTW92ZWQgYWxsIG1lbnUgYW5kIGRpYWxvZyByZWxhdGVkIHN0dWZmIGhlcmUuCiAKIFN1biBKYW4gMTggMjM6MDU6MDQgMTk5OCAgS2FybCBCYWNrc3Ry9m0gPGthcmxfYkBnZW9jaXRpZXMuY29tPgotCSogW1N3LnJjXQotCUFkZGVkL3VwZGF0ZWQgU3dlZGlzaCBsYW5ndWFnZSBzdXBwb3J0LgorICAgICAgICAqIFtTdy5yY10KKyAgICAgICAgQWRkZWQvdXBkYXRlZCBTd2VkaXNoIGxhbmd1YWdlIHN1cHBvcnQuCiAKIFR1ZSBEZWMgMjMgMjM6MzU6MDQgMTk5NyAgTWFyY2VsIEJhdXIgPG1iYXVyQGcyNi5ldGh6LmNoPgotICAgICAgICogRml4ZWQgbG90cyBvZiBidWdzIHcvIHJlc291cmNlcyBpbiAqLnJjCi0gICAgICAgKiBtb3ZlZCBbbm90ZXBhZC5jXSBpbnRvIFttYWluLmNdCi0gICAgICAgKiBtb3ZlZCBbbm90ZXBhZC5oXSBpbnRvIFttYWluLmhdCisgICAgICAgICogRml4ZWQgbG90cyBvZiBidWdzIHcvIHJlc291cmNlcyBpbiAqLnJjCisgICAgICAgICogbW92ZWQgW25vdGVwYWQuY10gaW50byBbbWFpbi5jXQorICAgICAgICAqIG1vdmVkIFtub3RlcGFkLmhdIGludG8gW21haW4uaF0KICAgICAgICAKIEZyaSBEZWMgMDUgMjA6NTE6NTUgMTk5NyAgTWFyY2VsIEJhdXIgPG1iYXVyQGcyNi5ldGh6LmNoPgotICAgICAgICogW25vdGVwYWQuY10gW25vdGVwYWQuaF0gW25vdGVwYWQucmNdIFtFbi5yY10gW0RlLnJjXQotICAgICAgICAgW2xpY2Vuc2UuY10gW2xpY2Vuc2UuaF0gW0xpY2Vuc2VfRW4uY10KLSAgICAgICAgIFtSRUFETUVdIFtUT0RPXSBbQ2hhbmdlTG9nXQotICAgICAgICAgT3JpZ2luYWxzIGJ5IE1hcmNlbCBCYXVyCisgICAgICAgICogW25vdGVwYWQuY10gW25vdGVwYWQuaF0gW25vdGVwYWQucmNdIFtFbi5yY10gW0RlLnJjXQorICAgICAgICAgIFtsaWNlbnNlLmNdIFtsaWNlbnNlLmhdIFtMaWNlbnNlX0VuLmNdCisgICAgICAgICAgW1JFQURNRV0gW1RPRE9dIFtDaGFuZ2VMb2ddCisgICAgICAgICAgT3JpZ2luYWxzIGJ5IE1hcmNlbCBCYXVyCisKZGlmZiAtLWdpdCBhL3Byb2dyYW1zL25vdGVwYWQvVE9ETyBiL3Byb2dyYW1zL25vdGVwYWQvVE9ETwppbmRleCBjN2EyYmMzLi4yN2U4ZmZmIDEwMDY0NAotLS0gYS9wcm9ncmFtcy9ub3RlcGFkL1RPRE8KKysrIGIvcHJvZ3JhbXMvbm90ZXBhZC9UT0RPCkBAIC0xLDYgKzEsMTkgQEAKIAogIC0gTG9nZmlsZSBmZWF0dXJlCisgICBpZiBOb3RlcGFkIG9wZW5zIGEgZmlsZSB3aXRoICIuTE9HIiAocmVhbGx5PykgaW4gdGhlIGZpcnN0IGxpbmUsIHRoZQorICAgY3VycmVudCBkYXRlL3RpbWUgc2hvdWxkIGF1dG9tYXRpY2FsbHkgYmUgaW5zZXJ0ZWQgaW50byB0aGUgbGFzdCBsaW5lCisgICBvZiB0aGUgZmlsZSBhdCBzdGFydHVwLiBUaGlzIGZlYXR1cmUgaXMgbm90IHdlbGwgZG9jdW1lbnRlZC4KIAogIC0gTm90ZXBhZCBzZWdmYXVsdHMgd2hlbiBzZWxlY3RpbmcgIkZpbmQiIGJ1dHRvbiBpbiAiU2VhcmNoIiBkaWFsb2cuCisgICBUaGlzIGlzIHByb2JhYmx5IGEgcHJvYmxlbSByZWxhdGVkIHRvIFdpbmVsaWIuCiAgCisgLSBUaGVyZSBpcyBzdGlsbCBzb21ldGhpbmcgd3Jvbmcgd2l0aCB0aGUgMm5kIGZvcm1hdCBzdHJpbmcgb2YgRGF0ZS9UaW1lLgorICAgV2l0aCBzb21lIGxhbmd1YWdlcywgdHdpY2UgdGhlIGRhdGUgaXMgcHJpbnRlZCAoaW5zdGVhZCBvZiB0aW1lKS4KKyAgIE90aGVyIGxhbmd1YWdlcywgc3VjaCBhcyBmcmVuY2ggZG8gbm90IHN1cHBvcnQgYW55IGxvY2FsZXMgLT4gYW5ub3lpbmcuCisKKyAtIFBhZ2UgU2V0dXAgZGlhbG9nIGJveCBzaG91bGQgZXhjaGFuZ2Ugc3RyaW5ncyB3aXRoIHRoZSBjb3JyZXNwb25kaW5nCisgICBHbG9iYWxzLnN6TWFyZ2luPz8/LXN0cmluZ3MgKG5lZWRlZCB0byBldmFsdWF0ZSBzdHJpbmdzIHdoZW4gcHJpbnRpbmcpCisgICAKKyAtIEZpZWxkcyBpbiAiUGFnZSBTZXR1cCIgZGlhbG9nIGJveCBzaG91bGQgYmUgaW5pdGlhbGl6ZWQuCisgICAKICAtIGNyZWF0ZSBuZXcgKi5yYyBmaWxlcyBmb3IgYWxsIGxhbmd1YWdlcyB5b3Uga25vdy4KZGlmZiAtLWdpdCBhL3Byb2dyYW1zL25vdGVwYWQvZGlhbG9nLmMgYi9wcm9ncmFtcy9ub3RlcGFkL2RpYWxvZy5jCmluZGV4IDYyNzkwZDguLjE3MjFkY2QgMTAwNjQ0Ci0tLSBhL3Byb2dyYW1zL25vdGVwYWQvZGlhbG9nLmMKKysrIGIvcHJvZ3JhbXMvbm90ZXBhZC9kaWFsb2cuYwpAQCAtNywyNjEgKzcsMzg2IEBACiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAiY29tbWRsZy5oIgorI2luY2x1ZGUgIndpbm5scy5oIgorI2luY2x1ZGUgIndpbmVycm9yLmgiCiAjaWZkZWYgV0lORUxJQgogI2luY2x1ZGUgInNoZWxsLmgiCiAjaW5jbHVkZSAib3B0aW9ucy5oIgogI2VuZGlmCiAjaW5jbHVkZSAibWFpbi5oIgogI2luY2x1ZGUgImxpY2Vuc2UuaCIKKyNpbmNsdWRlICJsYW5ndWFnZS5oIgogI2luY2x1ZGUgImRpYWxvZy5oIgogI2luY2x1ZGUgInZlcnNpb24uaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCisKIHN0YXRpYyBMUkVTVUxUIERJQUxPR19QQUdFU0VUVVBfRGxnUHJvYyhIV05EIGhEbGcsIFVJTlQgbXNnLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKIAorCitpbnQgQWxlcnRJRFMoVUlOVCBpZHNfbWVzc2FnZSwgVUlOVCBpZHNfY2FwdGlvbiwgV09SRCB0eXBlKSB7CisvKgorICogR2l2ZW4gc29tZSBpZHMgc3RyaW5ncywgdGhpcyBhY3RzIGFzIGEgbGFuZ3VhZ2UtYXdhcmUgd3JhcHBlciBmb3IgCisgKiAiTWVzc2FnZUJveCIKKyAqLworICAgQ0hBUiBzek1lc3NhZ2VbTUFYX1NUUklOR19MRU5dOworICAgQ0hBUiBzekNhcHRpb25bTUFYX1NUUklOR19MRU5dOworICAgCisgICBMb2FkU3RyaW5nKEdsb2JhbHMuaEluc3RhbmNlLCBpZHNfbWVzc2FnZSwgc3pNZXNzYWdlLCBzaXplb2Yoc3pNZXNzYWdlKSk7CisgICBMb2FkU3RyaW5nKEdsb2JhbHMuaEluc3RhbmNlLCBpZHNfY2FwdGlvbiwgc3pDYXB0aW9uLCBzaXplb2Yoc3pDYXB0aW9uKSk7CisgICAKKyAgIHJldHVybiAoTWVzc2FnZUJveChHbG9iYWxzLmhNYWluV25kLCBzek1lc3NhZ2UsIHN6Q2FwdGlvbiwgdHlwZSkpOworfQorCit2b2lkIEFsZXJ0RmlsZU5vdEZvdW5kKExQQ1NUUiBzekZpbGVuYW1lKSB7CisKKyAgIGludCBuUmVzdWx0OworICAgCisgICBuUmVzdWx0ID0gQWxlcnRJRFMoSURTX05PVEZPVU5ELCBJRFNfRVJST1IsIDApOworfQorCisKK1ZPSUQgQWxlcnRPdXRPZk1lbW9yeSh2b2lkKSB7CisKKyAgIGludCBuUmVzdWx0OworICAgCisgICBuUmVzdWx0ID0gQWxlcnRJRFMoSURTX09VVF9PRl9NRU1PUlksIElEU19FUlJPUiwgMCk7CisgICBQb3N0UXVpdE1lc3NhZ2UoMSk7Cit9CisKKworQk9PTCBFeGlzdEZpbGUoTFBDU1RSIHN6RmlsZW5hbWUpIHsKKy8qCisgKiAgUmV0dXJuczogVFJVRSAgLSBpZiAic3pGaWxlTmFtZSIgZXhpc3RzCisgKiAgICAgICAgICAgRkFMU0UgLSBpZiBpdCBkb2VzIG5vdAorICovCisgICBXSU4zMl9GSU5EX0RBVEEzMkEgZW50cnk7CisgICBIQU5ETEUzMiBoYW5kbGU7CisgICAKKyAgIGhhbmRsZSA9IEZpbmRGaXJzdEZpbGUzMkEoc3pGaWxlbmFtZSwgJmVudHJ5KTsKKyAgIAorICAgcmV0dXJuIChoYW5kbGUhPUlOVkFMSURfSEFORExFX1ZBTFVFMzIpOworfQorCitWT0lEIERvU2F2ZUZpbGUoVk9JRCkgeworICAgLy8gUmVhbGx5IFNhdmUgdGhlIGZpbGUgCisgICAKKyAgIC8vIC4uLiAoR2xvYmFscy5zekZpbGVOYW1lKTsKK30KKworCitCT09MIERvQ2xvc2VGaWxlKHZvaWQpIHsKKy8vIFJldHVybiB2YWx1ZTogVFJVRSAgLSBVc2VyIGFncmVlZCB0byBjbG9zZSAoYm90aCBzYXZlL2Rvbid0IHNhdmUpCisvLyAgICAgICAgICAgICAgIEZBTFNFIC0gVXNlciBjYW5jZWxsZWQgY2xvc2UgYnkgc2VsZWN0aW5nICJDYW5jZWwiCisKKyAgIENIQVIgc3pNZXNzYWdlW01BWF9TVFJJTkdfTEVOXTsKKyAgIENIQVIgc3pDYXB0aW9uW01BWF9TVFJJTkdfTEVOXTsKKworICAgSU5UIG5SZXN1bHQ7CisgICAKKyAgIGlmIChzdHJsZW4oR2xvYmFscy5zekZpbGVOYW1lKT4wKSB7CisKKyAgIC8vIHByb21wdCB1c2VyIHRvIHNhdmUgY2hhbmdlcworICAgCisgICAvLyBGSVhNRTogVGhlIGZvbGxvd2luZyByZXNvdXJjZXMgYXJlIG5vdCB5ZXQgaW4gdGhlIC5yYyBmaWxlcworICAgLy8gc3pNZXNzYWdlLCBzekNhcHRpb24gc2hvdyB1cCByYW5kb20gdmFsdWVzLiBQbGVhc2Uga2VlcCB0aGVzZSBsaW5lcyEKKyAgIAorLy8gIExvYWRTdHJpbmcoR2xvYmFscy5oSW5zdGFuY2UsIGlkc19zYXZlY2hhbmdlcywgc3pNZXNzYWdlLCBzaXplb2Yoc3pNZXNzYWdlKSk7CisvLyAgTG9hZFN0cmluZyhHbG9iYWxzLmhJbnN0YW5jZSwgaWRzX3NhdmV0aXRsZSwgc3pDYXB0aW9uLCBzaXplb2Yoc3pDYXB0aW9uKSk7CisgICAKKyAgIG5SZXN1bHQgPSBNZXNzYWdlQm94KEdsb2JhbHMuaE1haW5XbmQsIHN6TWVzc2FnZSwgc3pDYXB0aW9uLCBNQl9ZRVNOT0NBTkNFTCk7CisKKyAgIHN3aXRjaCAoblJlc3VsdCkgeworICAgICAgICAgIGNhc2UgSURZRVM6ICAgICBEb1NhdmVGaWxlKCk7CisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIElETk86ICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBJRENBTkNFTDogIHJldHVybihGQUxTRSk7CisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgIGRlZmF1bHQ6ICAgIHJldHVybihGQUxTRSk7CisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIAorICAgIAorICB9CisgIAorICAvLyBGb3JnZXQgZmlsZSBuYW1lCisgIAorICBsc3RyY3B5bihHbG9iYWxzLnN6RmlsZU5hbWUsICJcMCIsIDEpOworICBMQU5HVUFHRV9VcGRhdGVXaW5kb3dDYXB0aW9uKCk7CisKKyAgcmV0dXJuKFRSVUUpOworICAKK30KKworCit2b2lkIERvT3BlbkZpbGUoTFBDU1RSIHN6RmlsZU5hbWUpIHsKKworICAgIC8vIENsb3NlIGFueSBmaWxlcyBhbmQgcHJvbXB0IHRvIHNhdmUgY2hhbmdlcworICAgIGlmIChEb0Nsb3NlRmlsZSkgeworCisgICAgICAgIC8vIE9wZW4gZmlsZQorICAgICAgICBsc3RyY3B5bihHbG9iYWxzLnN6RmlsZU5hbWUsIHN6RmlsZU5hbWUsIHN0cmxlbihzekZpbGVOYW1lKSsxKTsgCisgICAgICAgIExBTkdVQUdFX1VwZGF0ZVdpbmRvd0NhcHRpb24oKTsKKyAgICAKKyAgICB9Cit9CisKKwogVk9JRCBESUFMT0dfRmlsZU5ldyhWT0lEKQogewotLy8gIGRwcmludGZfZml4bWUoR2xvYmFsLCAiRmlsZU5ldygpIG5vdCB5ZXQgaW1wbGVtZW50ZWRcbiIpOwotICBwcmludGYoIkZpbGVOZXcoKVxuIik7CisgICAgLy8gQ2xvc2UgYW55IGZpbGVzIGFuZCBwcm9tdCB0byBzYXZlIGNoYW5nZXMKKyAgICBpZiAoRG9DbG9zZUZpbGUoKSkgeworICAgIAorICAgICAgICAvLyBkbyBub3RoaW5nIHlldAorICAgIAorICAgIH0KIH0KIAorCiBWT0lEIERJQUxPR19GaWxlT3BlbihWT0lEKQogewotCSAgT1BFTkZJTEVOQU1FIG9wZW5maWxlbmFtZTsKLQkgIENIQVIgc3pQYXRoW01BWF9QQVRITkFNRV9MRU5dOwotCSAgQ0hBUiBzekRpcltNQVhfUEFUSE5BTUVfTEVOXTsKLQkgIENIQVIgc3p6RmlsdGVyWzIgKiBNQVhfU1RSSU5HX0xFTiArIDEwMF07Ci0JICBMUFNUUiBwID0gc3p6RmlsdGVyOwogCi0JICBMb2FkU3RyaW5nKEdsb2JhbHMuaEluc3RhbmNlLCBJRFNfVEVYVF9GSUxFU19UWFQsIHAsIE1BWF9TVFJJTkdfTEVOKTsKLQkgIHAgKz0gc3RybGVuKHApICsgMTsKLQkgIGxzdHJjcHkocCwgIioudHh0Iik7Ci0JICBwICs9IHN0cmxlbihwKSArIDE7Ci0JICBMb2FkU3RyaW5nKEdsb2JhbHMuaEluc3RhbmNlLCBJRFNfQUxMX0ZJTEVTLCBwLCBNQVhfU1RSSU5HX0xFTik7Ci0JICBwICs9IHN0cmxlbihwKSArIDE7Ci0JICBsc3RyY3B5KHAsICIqLioiKTsKLQkgIHAgKz0gc3RybGVuKHApICsgMTsKLQkgICpwID0gJ1wwJzsKKyAgICAgICAgT1BFTkZJTEVOQU1FIG9wZW5maWxlbmFtZTsKKyAgICAgICAgQ0hBUiBzelBhdGhbTUFYX1BBVEhOQU1FX0xFTl07CisgICAgICAgIENIQVIgc3pEaXJbTUFYX1BBVEhOQU1FX0xFTl07CisgICAgICAgIENIQVIgc3p6RmlsdGVyWzIgKiBNQVhfU1RSSU5HX0xFTiArIDEwMF07CisgICAgICAgIExQU1RSIHAgPSBzenpGaWx0ZXI7CiAKLQkgIEdldFdpbmRvd3NEaXJlY3Rvcnkoc3pEaXIsIHNpemVvZihzekRpcikpOworICAgICAgICBMb2FkU3RyaW5nKEdsb2JhbHMuaEluc3RhbmNlLCBJRFNfVEVYVF9GSUxFU19UWFQsIHAsIE1BWF9TVFJJTkdfTEVOKTsKKyAgICAgICAgcCArPSBzdHJsZW4ocCkgKyAxOworICAgICAgICBsc3RyY3B5KHAsICIqLnR4dCIpOworICAgICAgICBwICs9IHN0cmxlbihwKSArIDE7CisgICAgICAgIExvYWRTdHJpbmcoR2xvYmFscy5oSW5zdGFuY2UsIElEU19BTExfRklMRVMsIHAsIE1BWF9TVFJJTkdfTEVOKTsKKyAgICAgICAgcCArPSBzdHJsZW4ocCkgKyAxOworICAgICAgICBsc3RyY3B5KHAsICIqLioiKTsKKyAgICAgICAgcCArPSBzdHJsZW4ocCkgKyAxOworICAgICAgICAqcCA9ICdcMCc7CiAKLQkgIG9wZW5maWxlbmFtZS5sU3RydWN0U2l6ZSAgICAgICA9IDA7Ci0JICBvcGVuZmlsZW5hbWUuaHduZE93bmVyICAgICAgICAgPSBHbG9iYWxzLmhNYWluV25kOwotCSAgb3BlbmZpbGVuYW1lLmhJbnN0YW5jZSAgICAgICAgID0gR2xvYmFscy5oSW5zdGFuY2U7Ci0JICBvcGVuZmlsZW5hbWUubHBzdHJGaWx0ZXIgICAgICAgPSBzenpGaWx0ZXI7Ci0JICBvcGVuZmlsZW5hbWUubHBzdHJDdXN0b21GaWx0ZXIgPSAwOwotCSAgb3BlbmZpbGVuYW1lLm5NYXhDdXN0RmlsdGVyICAgID0gMDsKLQkgIG9wZW5maWxlbmFtZS5uRmlsdGVySW5kZXggICAgICA9IDA7Ci0JICBvcGVuZmlsZW5hbWUubHBzdHJGaWxlICAgICAgICAgPSBzelBhdGg7Ci0JICBvcGVuZmlsZW5hbWUubk1heEZpbGUgICAgICAgICAgPSBzaXplb2Yoc3pQYXRoKTsKLQkgIG9wZW5maWxlbmFtZS5scHN0ckZpbGVUaXRsZSAgICA9IDA7Ci0JICBvcGVuZmlsZW5hbWUubk1heEZpbGVUaXRsZSAgICAgPSAwOwotCSAgb3BlbmZpbGVuYW1lLmxwc3RySW5pdGlhbERpciAgID0gc3pEaXI7Ci0JICBvcGVuZmlsZW5hbWUubHBzdHJUaXRsZSAgICAgICAgPSAwOwotCSAgb3BlbmZpbGVuYW1lLkZsYWdzICAgICAgICAgICAgID0gMDsKLQkgIG9wZW5maWxlbmFtZS5uRmlsZU9mZnNldCAgICAgICA9IDA7Ci0JICBvcGVuZmlsZW5hbWUubkZpbGVFeHRlbnNpb24gICAgPSAwOwotCSAgb3BlbmZpbGVuYW1lLmxwc3RyRGVmRXh0ICAgICAgID0gMDsKLQkgIG9wZW5maWxlbmFtZS5sQ3VzdERhdGEgICAgICAgICA9IDA7Ci0JICBvcGVuZmlsZW5hbWUubHBmbkhvb2sgICAgICAgICAgPSAwOwotIAkgIG9wZW5maWxlbmFtZS5scFRlbXBsYXRlTmFtZSAgICA9IDA7CisgICAgICAgIEdldFdpbmRvd3NEaXJlY3Rvcnkoc3pEaXIsIHNpemVvZihzekRpcikpOwogCi0gIAkgIGlmIChHZXRPcGVuRmlsZU5hbWUoJm9wZW5maWxlbmFtZSkpIHsKLSAgICAgICAgICAgIGxzdHJjcHluKEdsb2JhbHMuc3pGaWxlTmFtZSwgb3BlbmZpbGVuYW1lLmxwc3RyRmlsZSwgCi0gICAgICAgICAgICAgICAgICAgICBzdHJsZW4ob3BlbmZpbGVuYW1lLmxwc3RyRmlsZSkrMSk7Ci0gICAgICAgICAgcHJpbnRmKCJPcGVuRmlsZTogJXNcbiIsIEdsb2JhbHMuc3pGaWxlTmFtZSk7Ci0JICB9CisgICAgICAgIG9wZW5maWxlbmFtZS5sU3RydWN0U2l6ZSAgICAgICA9IHNpemVvZihvcGVuZmlsZW5hbWUpOworICAgICAgICBvcGVuZmlsZW5hbWUuaHduZE93bmVyICAgICAgICAgPSBHbG9iYWxzLmhNYWluV25kOworICAgICAgICBvcGVuZmlsZW5hbWUuaEluc3RhbmNlICAgICAgICAgPSBHbG9iYWxzLmhJbnN0YW5jZTsKKyAgICAgICAgb3BlbmZpbGVuYW1lLmxwc3RyRmlsdGVyICAgICAgID0gc3p6RmlsdGVyOworICAgICAgICBvcGVuZmlsZW5hbWUubHBzdHJDdXN0b21GaWx0ZXIgPSAwOworICAgICAgICBvcGVuZmlsZW5hbWUubk1heEN1c3RGaWx0ZXIgICAgPSAwOworICAgICAgICBvcGVuZmlsZW5hbWUubkZpbHRlckluZGV4ICAgICAgPSAwOworICAgICAgICBvcGVuZmlsZW5hbWUubHBzdHJGaWxlICAgICAgICAgPSBzelBhdGg7CisgICAgICAgIG9wZW5maWxlbmFtZS5uTWF4RmlsZSAgICAgICAgICA9IHNpemVvZihzelBhdGgpOworICAgICAgICBvcGVuZmlsZW5hbWUubHBzdHJGaWxlVGl0bGUgICAgPSAwOworICAgICAgICBvcGVuZmlsZW5hbWUubk1heEZpbGVUaXRsZSAgICAgPSAwOworICAgICAgICBvcGVuZmlsZW5hbWUubHBzdHJJbml0aWFsRGlyICAgPSBzekRpcjsKKyAgICAgICAgb3BlbmZpbGVuYW1lLmxwc3RyVGl0bGUgICAgICAgID0gMDsKKyAgICAgICAgb3BlbmZpbGVuYW1lLkZsYWdzICAgICAgICAgICAgID0gMDsKKyAgICAgICAgb3BlbmZpbGVuYW1lLm5GaWxlT2Zmc2V0ICAgICAgID0gMDsKKyAgICAgICAgb3BlbmZpbGVuYW1lLm5GaWxlRXh0ZW5zaW9uICAgID0gMDsKKyAgICAgICAgb3BlbmZpbGVuYW1lLmxwc3RyRGVmRXh0ICAgICAgID0gMDsKKyAgICAgICAgb3BlbmZpbGVuYW1lLmxDdXN0RGF0YSAgICAgICAgID0gMDsKKyAgICAgICAgb3BlbmZpbGVuYW1lLmxwZm5Ib29rICAgICAgICAgID0gMDsKKyAgICAgICAgb3BlbmZpbGVuYW1lLmxwVGVtcGxhdGVOYW1lICAgID0gMDsKKworICAgICAgICBpZiAoR2V0T3BlbkZpbGVOYW1lKCZvcGVuZmlsZW5hbWUpKSB7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKEV4aXN0RmlsZShvcGVuZmlsZW5hbWUubHBzdHJGaWxlKSkKKyAgICAgICAgICAgICAgICAgICAgRG9PcGVuRmlsZShvcGVuZmlsZW5hbWUubHBzdHJGaWxlKTsKKyAgICAgICAgICAgICAgICBlbHNlIAorICAgICAgICAgICAgICAgICAgICBBbGVydEZpbGVOb3RGb3VuZChvcGVuZmlsZW5hbWUubHBzdHJGaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgICAKIH0KIAogVk9JRCBESUFMT0dfRmlsZVNhdmUoVk9JRCkKIHsKLSAgZnByaW50ZihzdGRlcnIsICJGaWxlU2F2ZSgpXG4iKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJGaWxlU2F2ZSgpXG4iKTsKIH0KIAogVk9JRCBESUFMT0dfRmlsZVNhdmVBcyhWT0lEKQogewotICAgICAgICAgIE9QRU5GSUxFTkFNRSBzYXZlYXM7Ci0gICAgICAgICAgQ0hBUiBzelBhdGhbTUFYX1BBVEhOQU1FX0xFTl07Ci0gICAgICAgICAgQ0hBUiBzekRpcltNQVhfUEFUSE5BTUVfTEVOXTsKLSAgICAgICAgICBDSEFSIHN6ekZpbHRlclsyICogTUFYX1NUUklOR19MRU4gKyAxMDBdOwotICAgICAgICAgIExQU1RSIHAgPSBzenpGaWx0ZXI7CisgICAgICAgIE9QRU5GSUxFTkFNRSBzYXZlYXM7CisgICAgICAgIENIQVIgc3pQYXRoW01BWF9QQVRITkFNRV9MRU5dOworICAgICAgICBDSEFSIHN6RGlyW01BWF9QQVRITkFNRV9MRU5dOworICAgICAgICBDSEFSIHN6ekZpbHRlclsyICogTUFYX1NUUklOR19MRU4gKyAxMDBdOworICAgICAgICBMUFNUUiBwID0gc3p6RmlsdGVyOwogCi0gICAgICAgICAgTG9hZFN0cmluZyhHbG9iYWxzLmhJbnN0YW5jZSwgSURTX1RFWFRfRklMRVNfVFhULCBwLCBNQVhfU1RSSU5HX0xFTik7Ci0gICAgICAgICAgcCArPSBzdHJsZW4ocCkgKyAxOwotICAgICAgICAgIGxzdHJjcHkocCwgIioudHh0Iik7Ci0gICAgICAgICAgcCArPSBzdHJsZW4ocCkgKyAxOwotICAgICAgICAgIExvYWRTdHJpbmcoR2xvYmFscy5oSW5zdGFuY2UsIElEU19BTExfRklMRVMsIHAsIE1BWF9TVFJJTkdfTEVOKTsKLSAgICAgICAgICBwICs9IHN0cmxlbihwKSArIDE7Ci0gICAgICAgICAgbHN0cmNweShwLCAiKi4qIik7Ci0gICAgICAgICAgcCArPSBzdHJsZW4ocCkgKyAxOwotICAgICAgICAgICpwID0gJ1wwJzsKKyAgICAgICAgTG9hZFN0cmluZyhHbG9iYWxzLmhJbnN0YW5jZSwgSURTX1RFWFRfRklMRVNfVFhULCBwLCBNQVhfU1RSSU5HX0xFTik7CisgICAgICAgIHAgKz0gc3RybGVuKHApICsgMTsKKyAgICAgICAgbHN0cmNweShwLCAiKi50eHQiKTsKKyAgICAgICAgcCArPSBzdHJsZW4ocCkgKyAxOworICAgICAgICBMb2FkU3RyaW5nKEdsb2JhbHMuaEluc3RhbmNlLCBJRFNfQUxMX0ZJTEVTLCBwLCBNQVhfU1RSSU5HX0xFTik7CisgICAgICAgIHAgKz0gc3RybGVuKHApICsgMTsKKyAgICAgICAgbHN0cmNweShwLCAiKi4qIik7CisgICAgICAgIHAgKz0gc3RybGVuKHApICsgMTsKKyAgICAgICAgKnAgPSAnXDAnOwogCi0gICAgICAgICAgR2V0V2luZG93c0RpcmVjdG9yeShzekRpciwgc2l6ZW9mKHN6RGlyKSk7CisgICAgICAgIEdldFdpbmRvd3NEaXJlY3Rvcnkoc3pEaXIsIHNpemVvZihzekRpcikpOwogCi0gICAgICAgICAgc2F2ZWFzLmxTdHJ1Y3RTaXplICAgICAgID0gMDsKLSAgICAgICAgICBzYXZlYXMuaHduZE93bmVyICAgICAgICAgPSBHbG9iYWxzLmhNYWluV25kOwotICAgICAgICAgIHNhdmVhcy5oSW5zdGFuY2UgICAgICAgICA9IEdsb2JhbHMuaEluc3RhbmNlOwotICAgICAgICAgIHNhdmVhcy5scHN0ckZpbHRlciAgICAgICA9IHN6ekZpbHRlcjsKLSAgICAgICAgICBzYXZlYXMubHBzdHJDdXN0b21GaWx0ZXIgPSAwOwotICAgICAgICAgIHNhdmVhcy5uTWF4Q3VzdEZpbHRlciAgICA9IDA7Ci0gICAgICAgICAgc2F2ZWFzLm5GaWx0ZXJJbmRleCAgICAgID0gMDsKLSAgICAgICAgICBzYXZlYXMubHBzdHJGaWxlICAgICAgICAgPSBzelBhdGg7Ci0gICAgICAgICAgc2F2ZWFzLm5NYXhGaWxlICAgICAgICAgID0gc2l6ZW9mKHN6UGF0aCk7Ci0gICAgICAgICAgc2F2ZWFzLmxwc3RyRmlsZVRpdGxlICAgID0gMDsKLSAgICAgICAgICBzYXZlYXMubk1heEZpbGVUaXRsZSAgICAgPSAwOwotICAgICAgICAgIHNhdmVhcy5scHN0ckluaXRpYWxEaXIgICA9IHN6RGlyOwotICAgICAgICAgIHNhdmVhcy5scHN0clRpdGxlICAgICAgICA9IDA7Ci0gICAgICAgICAgc2F2ZWFzLkZsYWdzICAgICAgICAgICAgID0gMDsKLSAgICAgICAgICBzYXZlYXMubkZpbGVPZmZzZXQgICAgICAgPSAwOwotICAgICAgICAgIHNhdmVhcy5uRmlsZUV4dGVuc2lvbiAgICA9IDA7Ci0gICAgICAgICAgc2F2ZWFzLmxwc3RyRGVmRXh0ICAgICAgID0gMDsKLSAgICAgICAgICBzYXZlYXMubEN1c3REYXRhICAgICAgICAgPSAwOwotICAgICAgICAgIHNhdmVhcy5scGZuSG9vayAgICAgICAgICA9IDA7Ci0gICAgICAgICAgc2F2ZWFzLmxwVGVtcGxhdGVOYW1lICAgID0gMDsKKyAgICAgICAgc2F2ZWFzLmxTdHJ1Y3RTaXplICAgICAgID0gMDsKKyAgICAgICAgc2F2ZWFzLmh3bmRPd25lciAgICAgICAgID0gR2xvYmFscy5oTWFpblduZDsKKyAgICAgICAgc2F2ZWFzLmhJbnN0YW5jZSAgICAgICAgID0gR2xvYmFscy5oSW5zdGFuY2U7CisgICAgICAgIHNhdmVhcy5scHN0ckZpbHRlciAgICAgICA9IHN6ekZpbHRlcjsKKyAgICAgICAgc2F2ZWFzLmxwc3RyQ3VzdG9tRmlsdGVyID0gMDsKKyAgICAgICAgc2F2ZWFzLm5NYXhDdXN0RmlsdGVyICAgID0gMDsKKyAgICAgICAgc2F2ZWFzLm5GaWx0ZXJJbmRleCAgICAgID0gMDsKKyAgICAgICAgc2F2ZWFzLmxwc3RyRmlsZSAgICAgICAgID0gc3pQYXRoOworICAgICAgICBzYXZlYXMubk1heEZpbGUgICAgICAgICAgPSBzaXplb2Yoc3pQYXRoKTsKKyAgICAgICAgc2F2ZWFzLmxwc3RyRmlsZVRpdGxlICAgID0gMDsKKyAgICAgICAgc2F2ZWFzLm5NYXhGaWxlVGl0bGUgICAgID0gMDsKKyAgICAgICAgc2F2ZWFzLmxwc3RySW5pdGlhbERpciAgID0gc3pEaXI7CisgICAgICAgIHNhdmVhcy5scHN0clRpdGxlICAgICAgICA9IDA7CisgICAgICAgIHNhdmVhcy5GbGFncyAgICAgICAgICAgICA9IDA7CisgICAgICAgIHNhdmVhcy5uRmlsZU9mZnNldCAgICAgICA9IDA7CisgICAgICAgIHNhdmVhcy5uRmlsZUV4dGVuc2lvbiAgICA9IDA7CisgICAgICAgIHNhdmVhcy5scHN0ckRlZkV4dCAgICAgICA9IDA7CisgICAgICAgIHNhdmVhcy5sQ3VzdERhdGEgICAgICAgICA9IDA7CisgICAgICAgIHNhdmVhcy5scGZuSG9vayAgICAgICAgICA9IDA7CisgICAgICAgIHNhdmVhcy5scFRlbXBsYXRlTmFtZSAgICA9IDA7CiAKLSAgICAgICAgICBpZiAoR2V0U2F2ZUZpbGVOYW1lKCZzYXZlYXMpKSB7CisgICAgICAgIGlmIChHZXRTYXZlRmlsZU5hbWUoJnNhdmVhcykpIHsKICAgICAgICAgICAgIGxzdHJjcHluKEdsb2JhbHMuc3pGaWxlTmFtZSwgc2F2ZWFzLmxwc3RyRmlsZSwgCi0gICAgICAgICAgICAgICAgICAgICBzdHJsZW4oc2F2ZWFzLmxwc3RyRmlsZSkrMSk7Ci0gICAgICAgICAgICBwcmludGYoIlNhdmVBcyglcylcbiIsIEdsb2JhbHMuc3pGaWxlTmFtZSk7Ci0gICAgICAgICAgfQorICAgICAgICAgICAgc3RybGVuKHNhdmVhcy5scHN0ckZpbGUpKzEpOworICAgICAgICAgICAgTEFOR1VBR0VfVXBkYXRlV2luZG93Q2FwdGlvbigpOworICAgICAgICAgICAgRElBTE9HX0ZpbGVTYXZlKCk7CisgICAgICAgIH0KIH0KIAogVk9JRCBESUFMT0dfRmlsZVByaW50KFZPSUQpCiB7Ci0JUFJJTlRETEcgcHJpbnRlcjsKLQlwcmludGVyLmxTdHJ1Y3RTaXplICAgICAgICAgICA9IHNpemVvZihwcmludGVyKTsKKyAgICAgICAgUFJJTlRETEcgcHJpbnRlcjsKKyAgICAgICAgcHJpbnRlci5sU3RydWN0U2l6ZSAgICAgICAgICAgPSBzaXplb2YocHJpbnRlcik7CiAgICAgICAgIHByaW50ZXIuaHduZE93bmVyICAgICAgICAgICAgID0gR2xvYmFscy5oTWFpblduZDsKICAgICAgICAgcHJpbnRlci5oSW5zdGFuY2UgICAgICAgICAgICAgPSBHbG9iYWxzLmhJbnN0YW5jZTsKICAgICAgICAgcHJpbnRlci5oRGV2TW9kZSAgICAgICAgICAgICAgPSAwOwotCXByaW50ZXIuaERldk5hbWVzICAgICAgICAgICAgID0gMDsKLQlwcmludGVyLmhEQyAgICAgICAgICAgICAgICAgICA9IDA7CisgICAgICAgIHByaW50ZXIuaERldk5hbWVzICAgICAgICAgICAgID0gMDsKKyAgICAgICAgcHJpbnRlci5oREMgICAgICAgICAgICAgICAgICAgPSAwOwogICAgICAgICBwcmludGVyLkZsYWdzICAgICAgICAgICAgICAgICA9IDA7Ci0JcHJpbnRlci5uRnJvbVBhZ2UgICAgICAgICAgICAgPSAwOworICAgICAgICBwcmludGVyLm5Gcm9tUGFnZSAgICAgICAgICAgICA9IDA7CiAgICAgICAgIHByaW50ZXIublRvUGFnZSAgICAgICAgICAgICAgID0gMDsKLQlwcmludGVyLm5NaW5QYWdlICAgICAgICAgICAgICA9IDA7Ci0JcHJpbnRlci5uTWF4UGFnZSAgICAgICAgICAgICAgPSAwOwotCXByaW50ZXIubkNvcGllcyAgICAgICAgICAgICAgID0gMDsKLQlwcmludGVyLmxDdXN0RGF0YSAgICAgICAgICAgICA9IDA7Ci0JcHJpbnRlci5scGZuUHJpbnRIb29rICAgICAgID0gMDsKLQlwcmludGVyLmxwZm5TZXR1cEhvb2sgICAgICAgICA9IDA7Ci0JcHJpbnRlci5scFByaW50VGVtcGxhdGVOYW1lICAgPSAwOwotCXByaW50ZXIubHBTZXR1cFRlbXBsYXRlTmFtZSAgID0gMDsKLQlwcmludGVyLmhQcmludFRlbXBsYXRlICAgICAgICA9IDA7Ci0JcHJpbnRlci5oU2V0dXBUZW1wbGF0ZSAgICAgICAgPSAwOwotCQotCWlmKFByaW50RGxnMTYoJnByaW50ZXIpKSB7Ci0gICAgICAgICAgLyogZG8gbm90aGluZyAqLworICAgICAgICBwcmludGVyLm5NaW5QYWdlICAgICAgICAgICAgICA9IDA7CisgICAgICAgIHByaW50ZXIubk1heFBhZ2UgICAgICAgICAgICAgID0gMDsKKyAgICAgICAgcHJpbnRlci5uQ29waWVzICAgICAgICAgICAgICAgPSAwOworICAgICAgICBwcmludGVyLmxDdXN0RGF0YSAgICAgICAgICAgICA9IDA7CisgICAgICAgIHByaW50ZXIubHBmblByaW50SG9vayAgICAgICAgID0gMDsKKyAgICAgICAgcHJpbnRlci5scGZuU2V0dXBIb29rICAgICAgICAgPSAwOworICAgICAgICBwcmludGVyLmxwUHJpbnRUZW1wbGF0ZU5hbWUgICA9IDA7CisgICAgICAgIHByaW50ZXIubHBTZXR1cFRlbXBsYXRlTmFtZSAgID0gMDsKKyAgICAgICAgcHJpbnRlci5oUHJpbnRUZW1wbGF0ZSAgICAgICAgPSAwOworICAgICAgICBwcmludGVyLmhTZXR1cFRlbXBsYXRlICAgICAgICA9IDA7CisgICAgICAgIAorICAgICAgICBpZiAoUHJpbnREbGcxNigmcHJpbnRlcikpIHsKKyAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcKICAgICAgICAgfTsKIH0KIAogVk9JRCBESUFMT0dfRmlsZVBhZ2VTZXR1cChWT0lEKQogewotICBESUFMT0dfUGFnZVNldHVwKCk7CisgICAgICAgIERJQUxPR19QYWdlU2V0dXAoKTsKIH0KIAogVk9JRCBESUFMT0dfRmlsZVByaW50ZXJTZXR1cChWT0lEKQogewotICBmcHJpbnRmKHN0ZGVyciwgIkZpbGVQcmludGVyU2V0dXAoKVxuIik7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmlsZVByaW50ZXJTZXR1cCgpXG4iKTsKIH0KIAogVk9JRCBESUFMT0dfRmlsZUV4aXQoVk9JRCkKIHsKLSAgUG9zdFF1aXRNZXNzYWdlKDApOworICAgICAgICBpZiAoRG9DbG9zZUZpbGUoKSkgeworICAgICAgICAgICAgICAgUG9zdFF1aXRNZXNzYWdlKDApOworICAgICAgICB9CiB9CiAKIFZPSUQgRElBTE9HX0VkaXRVbmRvKFZPSUQpCiB7Ci0gIGZwcmludGYoc3RkZXJyLCAiRWRpdFVuZG8oKVxuIik7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRWRpdFVuZG8oKVxuIik7CiB9CiAKIFZPSUQgRElBTE9HX0VkaXRDdXQoVk9JRCkKIHsKLSAgZnByaW50ZihzdGRlcnIsICJFZGl0Q3V0KClcbiIpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVkaXRDdXQoKVxuIik7CiB9CiAKIFZPSUQgRElBTE9HX0VkaXRDb3B5KFZPSUQpCiB7Ci0gIGZwcmludGYoc3RkZXJyLCAiRWRpdENvcHkoKVxuIik7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRWRpdENvcHkoKVxuIik7CiB9CiAKIFZPSUQgRElBTE9HX0VkaXRQYXN0ZShWT0lEKQogewotICBmcHJpbnRmKHN0ZGVyciwgIkVkaXRQYXN0ZSgpXG4iKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJFZGl0UGFzdGUoKVxuIik7CiB9CiAKIFZPSUQgRElBTE9HX0VkaXREZWxldGUoVk9JRCkKIHsKLSAgZnByaW50ZihzdGRlcnIsICJFZGl0RGVsZXRlKClcbiIpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVkaXREZWxldGUoKVxuIik7CiB9CiAKIFZPSUQgRElBTE9HX0VkaXRTZWxlY3RBbGwoVk9JRCkKIHsKLSAgIGZwcmludGYoc3RkZXJyLCAiRWRpdFNlbGVjdEFsbCgpXG4iKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJFZGl0U2VsZWN0QWxsKClcbiIpOwogfQogCiBWT0lEIERJQUxPR19FZGl0VGltZURhdGUoVk9JRCkKIHsKLSAgRElBTE9HX1RpbWVEYXRlKCk7ICAgCisgICAgICAgIERJQUxPR19UaW1lRGF0ZSgpOyAgIAogfQogCiBWT0lEIERJQUxPR19FZGl0V3JhcChWT0lEKQogewotICBHbG9iYWxzLmJXcmFwTG9uZ0xpbmVzID0gIUdsb2JhbHMuYldyYXBMb25nTGluZXM7Ci0JQ2hlY2tNZW51SXRlbShHbG9iYWxzLmhFZGl0TWVudSwgTlBfRURJVF9XUkFQLCBNRl9CWUNPTU1BTkQgfCAKKyAgICAgICAgR2xvYmFscy5iV3JhcExvbmdMaW5lcyA9ICFHbG9iYWxzLmJXcmFwTG9uZ0xpbmVzOworICAgICAgICBDaGVja01lbnVJdGVtKEdsb2JhbHMuaEVkaXRNZW51LCBOUF9FRElUX1dSQVAsIE1GX0JZQ09NTUFORCB8IAogICAgICAgICAoR2xvYmFscy5iV3JhcExvbmdMaW5lcyA/IE1GX0NIRUNLRUQgOiBNRl9VTkNIRUNLRUQpKTsKIH0KIAogVk9JRCBESUFMT0dfU2VhcmNoKFZPSUQpCiB7Ci0gICAgICAgICAgRklORFJFUExBQ0UgZmluZDsKLQkgIENIQVIgc3pGaW5kW01BWF9QQVRITkFNRV9MRU5dOworICAgICAgICBGSU5EUkVQTEFDRSBmaW5kOworICAgICAgICBDSEFSIHN6RmluZFtNQVhfUEFUSE5BTUVfTEVOXTsKICAgICAgICAgICAKLSAgICAgICAgICBsc3RyY3B5bihzekZpbmQsIEdsb2JhbHMuc3pGaW5kVGV4dCwgc3RybGVuKEdsb2JhbHMuc3pGaW5kVGV4dCkrMSk7CisgICAgICAgIGxzdHJjcHluKHN6RmluZCwgR2xvYmFscy5zekZpbmRUZXh0LCBzdHJsZW4oR2xvYmFscy5zekZpbmRUZXh0KSsxKTsKICAgICAgICAgICAKLQkgIGZpbmQubFN0cnVjdFNpemUgICAgICAgICAgICAgICA9IDA7Ci0gICAgICAgICAgZmluZC5od25kT3duZXIgICAgICAgICAgICAgICAgID0gR2xvYmFscy5oTWFpblduZDsKLSAgICAgICAgICBmaW5kLmhJbnN0YW5jZSAgICAgICAgICAgICAgICAgPSBHbG9iYWxzLmhJbnN0YW5jZTsKLSAgICAgICAgICBmaW5kLmxwc3RyRmluZFdoYXQgICAgICAgICAgICAgPSBzekZpbmQ7Ci0gICAgICAgICAgZmluZC53RmluZFdoYXRMZW4gICAgICAgICAgICAgID0gc2l6ZW9mKHN6RmluZCk7Ci0gICAgICAgICAgZmluZC5GbGFncyAgICAgICAgICAgICAgICAgICAgID0gMDsKLSAgICAgICAgICBmaW5kLmxDdXN0RGF0YSAgICAgICAgICAgICAgICAgPSAwOwotICAgICAgICAgIGZpbmQubHBmbkhvb2sgICAgICAgICAgICAgICAgICA9IDA7Ci0gICAgICAgICAgZmluZC5scFRlbXBsYXRlTmFtZSAgICAgICAgICAgID0gMDsKKyAgICAgICAgZmluZC5sU3RydWN0U2l6ZSAgICAgID0gc2l6ZW9mKGZpbmQpOworICAgICAgICBmaW5kLmh3bmRPd25lciAgICAgICAgPSBHbG9iYWxzLmhNYWluV25kOworICAgICAgICBmaW5kLmhJbnN0YW5jZSAgICAgICAgPSBHbG9iYWxzLmhJbnN0YW5jZTsKKyAgICAgICAgZmluZC5scHN0ckZpbmRXaGF0ICAgID0gc3pGaW5kOworICAgICAgICBmaW5kLndGaW5kV2hhdExlbiAgICAgPSBzaXplb2Yoc3pGaW5kKTsKKyAgICAgICAgZmluZC5GbGFncyAgICAgICAgICAgID0gMDsKKyAgICAgICAgZmluZC5sQ3VzdERhdGEgICAgICAgID0gMDsKKyAgICAgICAgZmluZC5scGZuSG9vayAgICAgICAgID0gMDsKKyAgICAgICAgZmluZC5scFRlbXBsYXRlTmFtZSAgID0gMDsKIAotCSAgaWYgKEZpbmRUZXh0KCZmaW5kKSkgeworICAgICAgICBpZiAoRmluZFRleHQoJmZpbmQpKSB7CiAgICAgICAgICAgICAgbHN0cmNweW4oR2xvYmFscy5zekZpbmRUZXh0LCBzekZpbmQsIHN0cmxlbihzekZpbmQpKzEpOwotICAgICAgICAgIH0gCisgICAgICAgIH0gCiAgICAgICAgICAgICAgZWxzZSAKLSAgICAgICAgICB7IAotICAgICAgICAgICAgIC8qIGRvIG5vdGhpbmcgKi8gCi0gICAgICAgICAgfTsKKyAgICAgICAgeyAKKyAgICAgICAgICAgICAvLyBkbyBub3RoaW5nIHlldAorICAgICAgICB9OwogfQogCiBWT0lEIERJQUxPR19TZWFyY2hOZXh0KFZPSUQpCiB7Ci0gIGZwcmludGYoc3RkZXJyLCAiU2VhcmNoTmV4dCgpXG4iKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJTZWFyY2hOZXh0KClcbiIpOwogfQogCiBWT0lEIERJQUxPR19IZWxwQ29udGVudHMoVk9JRCkKIHsKLSAgcHJpbnRmKCJOUF9IRUxQX0NPTlRFTlRTXG4iKTsKLSAgV2luSGVscChHbG9iYWxzLmhNYWluV25kLCBIRUxQRklMRSwgSEVMUF9JTkRFWCwgMCk7CisgICAgICAgIFdpbkhlbHAoR2xvYmFscy5oTWFpblduZCwgSEVMUEZJTEUsIEhFTFBfSU5ERVgsIDApOwogfQogCiBWT0lEIERJQUxPR19IZWxwU2VhcmNoKFZPSUQpCiB7Ci0gIGZwcmludGYoc3RkZXJyLCAiSGVscFNlYXJjaCgpXG4iKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJIZWxwU2VhcmNoKClcbiIpOwogfQogCiBWT0lEIERJQUxPR19IZWxwSGVscChWT0lEKQogewotICBwcmludGYoIk5QX0hFTFBfT05fSEVMUFxuIik7Ci0gIFdpbkhlbHAoR2xvYmFscy5oTWFpblduZCwgSEVMUEZJTEUsIEhFTFBfSEVMUE9OSEVMUCwgMCk7CisgICAgICAgIFdpbkhlbHAoR2xvYmFscy5oTWFpblduZCwgSEVMUEZJTEUsIEhFTFBfSEVMUE9OSEVMUCwgMCk7CiB9CiAKIFZPSUQgRElBTE9HX0hlbHBMaWNlbnNlKFZPSUQpCiB7Ci0gIFdpbmVMaWNlbnNlKEdsb2JhbHMuaE1haW5XbmQsIEdsb2JhbHMubHBzekxhbmd1YWdlKTsKKyAgICAgICAgV2luZUxpY2Vuc2UoR2xvYmFscy5oTWFpblduZCwgR2xvYmFscy5scHN6TGFuZ3VhZ2UpOwogfQogCiBWT0lEIERJQUxPR19IZWxwTm9XYXJyYW50eShWT0lEKQpAQCAtMjcxLDcgKzM5Niw3IEBACiAKIFZPSUQgRElBTE9HX0hlbHBBYm91dFdpbmUoVk9JRCkKIHsKLSAgU2hlbGxBYm91dChHbG9iYWxzLmhNYWluV25kLCAiTm90ZXBhZCIsICJOb3RlcGFkXG4iIFdJTkVfUkVMRUFTRV9JTkZPLCAwKTsKKyAgICAgICAgU2hlbGxBYm91dChHbG9iYWxzLmhNYWluV25kLCAiTm90ZXBhZCIsICJOb3RlcGFkXG4iIFdJTkVfUkVMRUFTRV9JTkZPLCAwKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0yODIsOCArNDA3LDcgQEAKIFZPSUQgRElBTE9HX1BhZ2VTZXR1cChWT0lEKQogewogICBXTkRQUk9DIGxwZm5EbGcgPSBNYWtlUHJvY0luc3RhbmNlKERJQUxPR19QQUdFU0VUVVBfRGxnUHJvYywgR2xvYmFscy5oSW5zdGFuY2UpOwotICBEaWFsb2dCb3goR2xvYmFscy5oSW5zdGFuY2UsICBTVFJJTkdfUEFHRVNFVFVQX1h4LAotCSAgICBHbG9iYWxzLmhNYWluV25kLCBscGZuRGxnKTsKKyAgRGlhbG9nQm94KEdsb2JhbHMuaEluc3RhbmNlLCBTVFJJTkdfUEFHRVNFVFVQX1h4LCBHbG9iYWxzLmhNYWluV25kLCBscGZuRGxnKTsKICAgRnJlZVByb2NJbnN0YW5jZShscGZuRGxnKTsKIH0KIApAQCAtMjk0LDE3ICs0MTgsMjIgQEAKIAogVk9JRCBESUFMT0dfVGltZURhdGUoVk9JRCkKIHsKLSAgU1lTVEVNVElNRSBzdDsKLSAgIGludCBILCBNaW4sIFksIE0sIEQ7Ci0gICBHZXRMb2NhbFRpbWUoJnN0KTsKLSAgIEggPSBzdC53SG91cjsgTWluID0gc3Qud01pbnV0ZTsgWSAgPSBzdC53WWVhcjsgTSA9IHN0LndNb250aDsgRCA9IHN0LndEYXk7Ci0gICBwcmludGYoIlRpbWVEYXRlPSVpOiIsIEgpOwotICAgaWYgKE1pbiA8IDEwKSBwcmludGYoIjAiKTsKLSAgIHByaW50ZigiJWkgICVpLyIsIE1pbiwgWSk7Ci0gICBpZiAoTSA8IDEwKSBwcmludGYoIjAiKTsKLSAgIHByaW50ZigiJWkvIiwgTSk7Ci0gICBpZiAoRCA8IDEwKSBwcmludGYoIjAiKTsKLSAgIHByaW50ZigiJWlcbiIsIEQpOworICAvLyB1c2VzIFtLRVJORUwzMi4zMTBdIChvbGUybmxzLmMpCisgIAorICBTWVNURU1USU1FICAgc3Q7CisgIExQU1lTVEVNVElNRSBscHN0ID0gJnN0OworICBDSEFSICAgICAgICAgc3pEYXRlW01BWF9TVFJJTkdfTEVOXTsKKyAgTFBTVFIgICAgICAgIGRhdGUgPSBzekRhdGU7CisgIAorICBHZXRMb2NhbFRpbWUoJnN0KTsKKyAgR2V0RGF0ZUZvcm1hdChMT0NBTEVfVVNFUl9ERUZBVUxULCBMT0NBTEVfU0xPTkdEQVRFLCBscHN0LCBOVUxMLCBkYXRlLCBNQVhfU1RSSU5HX0xFTik7CisgIAorICBwcmludGYoIkRhdGU6ICVzXG4iLCBkYXRlKTsKKyAgCisgIEdldERhdGVGb3JtYXQoTE9DQUxFX1VTRVJfREVGQVVMVCwgTE9DQUxFX1NUSU1FRk9STUFULCBscHN0LCBOVUxMLCBkYXRlLCBNQVhfU1RSSU5HX0xFTik7CisgIAorICBwcmludGYoIlRpbWU6ICVzXG4iLCBkYXRlKTsKKwogfQogCiAvKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICoKQEAgLTMxOCwxNSArNDQ3LDE1IEBACiAgICAgewogICAgIGNhc2UgV01fQ09NTUFORDoKICAgICAgIHN3aXRjaCAod1BhcmFtKQotCXsKLQljYXNlIElET0s6Ci0JICBFbmREaWFsb2coaERsZywgSURPSyk7Ci0JICByZXR1cm4gVFJVRTsKKyAgICAgICAgeworICAgICAgICBjYXNlIElET0s6CisgICAgICAgICAgRW5kRGlhbG9nKGhEbGcsIElET0spOworICAgICAgICAgIHJldHVybiBUUlVFOwogCi0JY2FzZSBJRENBTkNFTDoKLQkgIEVuZERpYWxvZyhoRGxnLCBJRENBTkNFTCk7Ci0JICByZXR1cm4gVFJVRTsKLQl9CisgICAgICAgIGNhc2UgSURDQU5DRUw6CisgICAgICAgICAgRW5kRGlhbG9nKGhEbGcsIElEQ0FOQ0VMKTsKKyAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgfQogICAgIH0KICAgcmV0dXJuIEZBTFNFOwogfQpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvbm90ZXBhZC9sYW5ndWFnZS5jIGIvcHJvZ3JhbXMvbm90ZXBhZC9sYW5ndWFnZS5jCmluZGV4IDM5ZjE3NDYuLjg1NDA1M2QgMTAwNjQ0Ci0tLSBhL3Byb2dyYW1zL25vdGVwYWQvbGFuZ3VhZ2UuYworKysgYi9wcm9ncmFtcy9ub3RlcGFkL2xhbmd1YWdlLmMKQEAgLTE2LDYgKzE2LDM1IEBACiBDSEFSIFNUUklOR19NRU5VX1h4W10gICAgICA9ICJNRU5VX1h4IjsKIENIQVIgU1RSSU5HX1BBR0VTRVRVUF9YeFtdID0gIkRJQUxPR19QQUdFU0VUVVBfWHgiOwogCit2b2lkIExBTkdVQUdFX1VwZGF0ZVdpbmRvd0NhcHRpb24odm9pZCkgeworICAvKiBTZXRzIHRoZSBjYXB0aW9uIG9mIHRoZSBtYWluIHdpbmRvdyBhY2NvcmRpbmcgdG8gR2xvYmFscy5zekZpbGVOYW1lOgorICAgICAgTm90ZXBhZCAtICh1bnRpdGxlZCkgICAgICBpZiBubyBmaWxlIGlzIG9wZW4KKyAgICAgIE5vdGVwYWQgLSBbZmlsZW5hbWVdICAgICAgaWYgYSBmaWxlIGlzIGdpdmVuCisgICovCisgIAorICBDSEFSIHN6Q2FwdGlvbltNQVhfU1RSSU5HX0xFTl07CisgIENIQVIgc3pVbnRpdGxlZFtNQVhfU1RSSU5HX0xFTl07CisKKyAgTG9hZFN0cmluZyhHbG9iYWxzLmhJbnN0YW5jZSwgSURTX05PVEVQQUQsIHN6Q2FwdGlvbiwgc2l6ZW9mKHN6Q2FwdGlvbikpOworICAKKyAgaWYgKHN0cmxlbihHbG9iYWxzLnN6RmlsZU5hbWUpPjApIHsKKyAgICAgIGxzdHJjYXQoc3pDYXB0aW9uLCAiIC0gWyIpOworICAgICAgbHN0cmNhdChzekNhcHRpb24sIEdsb2JhbHMuc3pGaWxlTmFtZSk7CisgICAgICBsc3RyY2F0KHN6Q2FwdGlvbiwgIl0iKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAgIExvYWRTdHJpbmcoR2xvYmFscy5oSW5zdGFuY2UsIElEU19VTlRJVExFRCwgc3pVbnRpdGxlZCwgc2l6ZW9mKHN6VW50aXRsZWQpKTsKKyAgICAgIGxzdHJjYXQoc3pDYXB0aW9uLCAiIC0gIik7CisgICAgICBsc3RyY2F0KHN6Q2FwdGlvbiwgc3pVbnRpdGxlZCk7CisgIH0KKyAgICAKKyAgU2V0V2luZG93VGV4dChHbG9iYWxzLmhNYWluV25kLCBzekNhcHRpb24pOworICAKK30KKworCisKIHN0YXRpYyBCT09MIExBTkdVQUdFX0xvYWRTdHJpbmdPdGhlcihVSU5UIG51bSwgVUlOVCBpZHMsIExQU1RSIHN0ciwgVUlOVCBsZW4pCiB7CiAgIGlkcyAtPSBHbG9iYWxzLndTdHJpbmdUYWJsZU9mZnNldDsKQEAgLTIzLDYgKzUyLDggQEAKICAgcmV0dXJuKExvYWRTdHJpbmcoR2xvYmFscy5oSW5zdGFuY2UsIGlkcywgc3RyLCBsZW4pKTsKIH07CiAKKworCiBWT0lEIExBTkdVQUdFX1NlbGVjdEJ5TmFtZShMUENTVFIgbGFuZykKIHsKICAgSU5UIGk7CkBAIC0zMCwxOCArNjEsMTggQEAKIAogICBmb3IgKGkgPSAwOyBpIDw9IE1BWF9MQU5HVUFHRV9OVU1CRVI7IGkrKykKICAgICBpZiAoTEFOR1VBR0VfTG9hZFN0cmluZ090aGVyKGksIElEU19MQU5HVUFHRV9JRCwgbmV3bGFuZywgc2l6ZW9mKG5ld2xhbmcpKSAmJgotCSFsc3RyY21wKGxhbmcsIG5ld2xhbmcpKQorICAgICAgICAhbHN0cmNtcChsYW5nLCBuZXdsYW5nKSkKICAgICAgIHsKICAgICAgICAgTEFOR1VBR0VfU2VsZWN0QnlOdW1iZXIoaSk7Ci0JcmV0dXJuOworICAgICAgICByZXR1cm47CiAgICAgICB9CiAKICAgLyogRmFsbGJhY2sgKi8KICAgICBmb3IgKGkgPSAwOyBpIDw9IE1BWF9MQU5HVUFHRV9OVU1CRVI7IGkrKykKICAgICBpZiAoTEFOR1VBR0VfTG9hZFN0cmluZ090aGVyKGksIElEU19MQU5HVUFHRV9JRCwgbmV3bGFuZywgc2l6ZW9mKG5ld2xhbmcpKSkKICAgICAgIHsKLQlMQU5HVUFHRV9TZWxlY3RCeU51bWJlcihpKTsKLQlyZXR1cm47CisgICAgICAgIExBTkdVQUdFX1NlbGVjdEJ5TnVtYmVyKGkpOworICAgICAgICByZXR1cm47CiAgICAgICB9CiAKICAgTWVzc2FnZUJveChHbG9iYWxzLmhNYWluV25kLCAiTm8gbGFuZ3VhZ2UgZm91bmQiLCAiRkFUQUwgRVJST1IiLCBNQl9PSyk7CkBAIC01Miw3ICs4Myw2IEBACiB7CiAgIElOVCAgICBpOwogICBDSEFSICAgbGFuZ1szXTsKLSAgQ0hBUiAgIGNhcHRpb25bTUFYX1NUUklOR19MRU5dOwogICBDSEFSICAgaXRlbVtNQVhfU1RSSU5HX0xFTl07CiAgIEhNRU5VICBoTWFpbk1lbnU7CiAKQEAgLTY0LDEyICs5NCwxMSBAQAogICBHbG9iYWxzLmxwc3pMYW5ndWFnZSA9IGxhbmc7CiAKICAgLyogU2V0IGZyYW1lIGNhcHRpb24gKi8KLSAgTG9hZFN0cmluZyhHbG9iYWxzLmhJbnN0YW5jZSwgSURTX05PVEVQQUQsIGNhcHRpb24sIHNpemVvZihjYXB0aW9uKSk7Ci0gIFNldFdpbmRvd1RleHQoR2xvYmFscy5oTWFpblduZCwgY2FwdGlvbik7Ci0KKyAgTEFOR1VBR0VfVXBkYXRlV2luZG93Q2FwdGlvbigpOworICAKICAgLyogQ2hhbmdlIFJlc291cmNlIG5hbWVzICovCi0gIGxzdHJjcHluKFNUUklOR19NRU5VX1h4ICAgICsgc2l6ZW9mKFNUUklOR19NRU5VX1h4KSAgICAtIDMsIGxhbmcsIDMpOwotICBsc3RyY3B5bihTVFJJTkdfUEFHRVNFVFVQX1h4ICAgICsgc2l6ZW9mKFNUUklOR19QQUdFU0VUVVBfWHgpICAgIC0gMywgbGFuZywgMyk7CisgIGxzdHJjcHluKFNUUklOR19NRU5VX1h4ICAgICAgKyBzaXplb2YoU1RSSU5HX01FTlVfWHgpICAgICAgLSAzLCBsYW5nLCAzKTsKKyAgbHN0cmNweW4oU1RSSU5HX1BBR0VTRVRVUF9YeCArIHNpemVvZihTVFJJTkdfUEFHRVNFVFVQX1h4KSAtIDMsIGxhbmcsIDMpOwogCiAgIC8qIENyZWF0ZSBtZW51ICovCiAgIGhNYWluTWVudSA9IExvYWRNZW51KEdsb2JhbHMuaEluc3RhbmNlLCBTVFJJTkdfTUVOVV9YeCk7CkBAIC04NSw3ICsxMTQsNyBAQAogICBmb3IgKGkgPSAwOyBpIDw9IE1BWF9MQU5HVUFHRV9OVU1CRVI7IGkrKykKICAgICBpZiAoTEFOR1VBR0VfTG9hZFN0cmluZ090aGVyKGksIElEU19MQU5HVUFHRV9NRU5VX0lURU0sIGl0ZW0sIHNpemVvZihpdGVtKSkpCiAgICAgICBBcHBlbmRNZW51KEdsb2JhbHMuaExhbmd1YWdlTWVudSwgTUZfU1RSSU5HIHwgTUZfQllDT01NQU5ELAotCQkgTlBfRklSU1RfTEFOR1VBR0UgKyBpLCBpdGVtKTsKKyAgICAgICAgICAgICAgICAgTlBfRklSU1RfTEFOR1VBR0UgKyBpLCBpdGVtKTsKIAogICBTZXRNZW51KEdsb2JhbHMuaE1haW5XbmQsIGhNYWluTWVudSk7CiAKQEAgLTEyNSwzICsxNTQsNCBAQAogLyogTG9jYWwgVmFyaWFibGVzOiAgICAqLwogLyogYy1maWxlLXN0eWxlOiAiR05VIiAqLwogLyogRW5kOiAgICAgICAgICAgICAgICAqLworCmRpZmYgLS1naXQgYS9wcm9ncmFtcy9ub3RlcGFkL2xhbmd1YWdlLmggYi9wcm9ncmFtcy9ub3RlcGFkL2xhbmd1YWdlLmgKaW5kZXggODQ4YzRmNC4uMzUxNWQ2OCAxMDA2NDQKLS0tIGEvcHJvZ3JhbXMvbm90ZXBhZC9sYW5ndWFnZS5oCisrKyBiL3Byb2dyYW1zL25vdGVwYWQvbGFuZ3VhZ2UuaApAQCAtNSw2ICs1LDcgQEAKICAqIENvcHlyaWdodCAxOTk4IEthcmwgQmFja3N0cvZtIDxrYXJsX2JAZ2VvY2l0aWVzLmNvbT4KICAqLwogCitWT0lEIExBTkdVQUdFX1VwZGF0ZVdpbmRvd0NhcHRpb24oVk9JRCk7CiBWT0lEIExBTkdVQUdFX1NlbGVjdEJ5TnVtYmVyKFVJTlQgbnVtKTsKIFZPSUQgTEFOR1VBR0VfU2VsZWN0QnlOYW1lKExQQ1NUUiBsYW5nKTsKIFZPSUQgTEFOR1VBR0VfRGVmYXVsdEhhbmRsZShXUEFSQU0gd1BhcmFtKTsKZGlmZiAtLWdpdCBhL3Byb2dyYW1zL25vdGVwYWQvbGljZW5zZS5oIGIvcHJvZ3JhbXMvbm90ZXBhZC9saWNlbnNlLmgKaW5kZXggMjBmYWMyZS4uODJhZDA1NCAxMDA2NDQKLS0tIGEvcHJvZ3JhbXMvbm90ZXBhZC9saWNlbnNlLmgKKysrIGIvcHJvZ3JhbXMvbm90ZXBhZC9saWNlbnNlLmgKQEAgLTMxLDYgKzMxLDYgQEAKIGV4dGVybiBMSUNFTlNFIFdpbmVMaWNlbnNlX05vOwogZXh0ZXJuIExJQ0VOU0UgV2luZUxpY2Vuc2VfUGw7CiBleHRlcm4gTElDRU5TRSBXaW5lTGljZW5zZV9QbzsKLWV4dGVybiBMSUNFTlNFIFdpbmVMaWNlbnNlX1ZhOwogZXh0ZXJuIExJQ0VOU0UgV2luZUxpY2Vuc2VfU3c7CitleHRlcm4gTElDRU5TRSBXaW5lTGljZW5zZV9WYTsKICovCmRpZmYgLS1naXQgYS9wcm9ncmFtcy9ub3RlcGFkL21haW4uYyBiL3Byb2dyYW1zL25vdGVwYWQvbWFpbi5jCmluZGV4IDhjZDVmY2QuLmI3MzdjNzIgMTAwNjQ0Ci0tLSBhL3Byb2dyYW1zL25vdGVwYWQvbWFpbi5jCisrKyBiL3Byb2dyYW1zL25vdGVwYWQvbWFpbi5jCkBAIC04MCwxMiArODAsMTIgQEAKICAgICBzd2l0Y2ggKG1zZykgewogCiAgICAgICAgY2FzZSBXTV9DUkVBVEU6Ci0gICAJYnJlYWs7CisgICAgICAgIGJyZWFrOwogCiAgICAgICAgY2FzZSBXTV9QQUlOVDoKICAgICAgICAgICBCZWdpblBhaW50KGhXbmQsICZwcyk7CiAgICAgICAgICAgRW5kUGFpbnQoaFduZCwgJnBzKTsKLSAgIAlicmVhazsKKyAgICAgICAgYnJlYWs7CiAKICAgICAgICBjYXNlIFdNX0NPTU1BTkQ6CiAgICAgICAgICAgTk9URVBBRF9NZW51Q29tbWFuZCh3UGFyYW0pOwpAQCAtMTM2LDM4ICsxMzYsNjggQEAKICAgICBpZiAoIUdsb2JhbHMuaE1haW5JY29uKSBHbG9iYWxzLmhNYWluSWNvbiA9IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvYWRJY29uKDAsIE1BS0VJTlRSRVNPVVJDRShERUZBVUxUSUNPTikpOwogCi0gICAgbHN0cmNweW4oR2xvYmFscy5zekZpbmRUZXh0LCAiXDAiLCAxKTsKLSAgICBsc3RyY3B5bihHbG9iYWxzLnN6RmlsZU5hbWUsICJcMCIsIDEpOworICAgIGxzdHJjcHluKEdsb2JhbHMuc3pGaW5kVGV4dCwgICAgICJcMCIsIDEpOworICAgIGxzdHJjcHluKEdsb2JhbHMuc3pGaWxlTmFtZSwgICAgICJcMCIsIDEpOworICAgIGxzdHJjcHluKEdsb2JhbHMuc3pNYXJnaW5Ub3AsICAgICJcMCIsIDEpOworICAgIGxzdHJjcHluKEdsb2JhbHMuc3pNYXJnaW5Cb3R0b20sICJcMCIsIDEpOworICAgIGxzdHJjcHluKEdsb2JhbHMuc3pNYXJnaW5MZWZ0LCAgICJcMCIsIDEpOworICAgIGxzdHJjcHluKEdsb2JhbHMuc3pNYXJnaW5SaWdodCwgICJcMCIsIDEpOworICAgIGxzdHJjcHluKEdsb2JhbHMuc3pIZWFkZXIsICAgICAgICJcMCIsIDEpOworICAgIGxzdHJjcHluKEdsb2JhbHMuc3pGb290ZXIsICAgICAgICJcMCIsIDEpOwogCiAgICAgaWYgKCFwcmV2KXsKLQljbGFzcy5zdHlsZSAgICAgICAgID0gQ1NfSFJFRFJBVyB8IENTX1ZSRURSQVc7Ci0JY2xhc3MubHBmblduZFByb2MgICA9IE5PVEVQQURfV25kUHJvYzsKLQljbGFzcy5jYkNsc0V4dHJhICAgID0gMDsKLQljbGFzcy5jYlduZEV4dHJhICAgID0gMDsKLQljbGFzcy5oSW5zdGFuY2UgICAgID0gR2xvYmFscy5oSW5zdGFuY2U7Ci0JY2xhc3MuaEljb24gICAgICAgICA9IExvYWRJY29uICgwLCBJRElfQVBQTElDQVRJT04pOwotCWNsYXNzLmhDdXJzb3IgICAgICAgPSBMb2FkQ3Vyc29yICgwLCBJRENfQVJST1cpOwotCWNsYXNzLmhickJhY2tncm91bmQgPSBHZXRTdG9ja09iamVjdCAoV0hJVEVfQlJVU0gpOwotCWNsYXNzLmxwc3pNZW51TmFtZSAgPSAwOwotCWNsYXNzLmxwc3pDbGFzc05hbWUgPSBjbGFzc05hbWU7CisgICAgICAgIGNsYXNzLnN0eWxlICAgICAgICAgPSBDU19IUkVEUkFXIHwgQ1NfVlJFRFJBVzsKKyAgICAgICAgY2xhc3MubHBmblduZFByb2MgICA9IE5PVEVQQURfV25kUHJvYzsKKyAgICAgICAgY2xhc3MuY2JDbHNFeHRyYSAgICA9IDA7CisgICAgICAgIGNsYXNzLmNiV25kRXh0cmEgICAgPSAwOworICAgICAgICBjbGFzcy5oSW5zdGFuY2UgICAgID0gR2xvYmFscy5oSW5zdGFuY2U7CisgICAgICAgIGNsYXNzLmhJY29uICAgICAgICAgPSBMb2FkSWNvbiAoMCwgSURJX0FQUExJQ0FUSU9OKTsKKyAgICAgICAgY2xhc3MuaEN1cnNvciAgICAgICA9IExvYWRDdXJzb3IgKDAsIElEQ19BUlJPVyk7CisgICAgICAgIGNsYXNzLmhickJhY2tncm91bmQgPSBHZXRTdG9ja09iamVjdCAoV0hJVEVfQlJVU0gpOworICAgICAgICBjbGFzcy5scHN6TWVudU5hbWUgID0gMDsKKyAgICAgICAgY2xhc3MubHBzekNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKICAgICB9CiAKICAgICBpZiAoIVJlZ2lzdGVyQ2xhc3MgKCZjbGFzcykpCi0JcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gRkFMU0U7CiAKICAgICBHbG9iYWxzLmhNYWluV25kID0gQ3JlYXRlV2luZG93IChjbGFzc05hbWUsIHdpbk5hbWUsIFdTX09WRVJMQVBQRURXSU5ET1csCi0JCQlDV19VU0VERUZBVUxULCAwLCBDV19VU0VERUZBVUxULCAwLCAwLCAKLQkJCUxvYWRNZW51KEdsb2JhbHMuaEluc3RhbmNlLCBTVFJJTkdfTUVOVV9YeCksCi0JCQlHbG9iYWxzLmhJbnN0YW5jZSwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBDV19VU0VERUZBVUxULCAwLCBDV19VU0VERUZBVUxULCAwLCAwLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIExvYWRNZW51KEdsb2JhbHMuaEluc3RhbmNlLCBTVFJJTkdfTUVOVV9YeCksCisgICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWxzLmhJbnN0YW5jZSwgMCk7CiAKICAgICBMQU5HVUFHRV9TZWxlY3RCeU5hbWUoR2xvYmFscy5scHN6TGFuZ3VhZ2UpOwogCi0gICAgU2V0TWVudShHbG9iYWxzLmhNYWluV25kLCBHbG9iYWxzLmhNYWluTWVudSk7CQkKLQkJCQorICAgIFNldE1lbnUoR2xvYmFscy5oTWFpblduZCwgR2xvYmFscy5oTWFpbk1lbnUpOyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgU2hvd1dpbmRvdyAoR2xvYmFscy5oTWFpblduZCwgc2hvdyk7CiAgICAgVXBkYXRlV2luZG93IChHbG9iYWxzLmhNYWluV25kKTsKIAorICAgIC8vIG5vdyBoYW5kbGUgY29tbWFuZCBsaW5lCisgICAgCisgICAgd2hpbGUgKCpjbWRsaW5lICYmICgqY21kbGluZSA9PSAnICcgfHwgKmNtZGxpbmUgPT0gJy0nKSkgCisgICAgCisgICAgeworICAgICAgICBDSEFSICAgb3B0aW9uOworICAgICAgICBMUENTVFIgdG9waWNfaWQ7CiAKKyAgICAgICAgaWYgKCpjbWRsaW5lKysgPT0gJyAnKSBjb250aW51ZTsKKworICAgICAgICBvcHRpb24gPSAqY21kbGluZTsKKyAgICAgICAgaWYgKG9wdGlvbikgY21kbGluZSsrOworICAgICAgICB3aGlsZSAoKmNtZGxpbmUgJiYgKmNtZGxpbmUgPT0gJyAnKSBjbWRsaW5lKys7CisKKyAgICAgICAgc3dpdGNoKG9wdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSAncCc6CisgICAgICAgICAgICBjYXNlICdQJzogcHJpbnRmKCJQcmludCBmaWxlOiAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAvLyBOb3QgeWV0IGFibGUgdG8gcHJpbnQgYSBmaWxlCisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAKKyAgICAKICAgICB3aGlsZSAoR2V0TWVzc2FnZSAoJm1zZywgMCwgMCwgMCkpIHsKICAgICAgICAgVHJhbnNsYXRlTWVzc2FnZSAoJm1zZyk7CiAgICAgICAgIERpc3BhdGNoTWVzc2FnZSAoJm1zZyk7CkBAIC0xNzgsMyArMjA4LDQgQEAKIC8qIExvY2FsIFZhcmlhYmxlczogICAgKi8KIC8qIGMtZmlsZS1zdHlsZTogIkdOVSIgKi8KIC8qIEVuZDogICAgICAgICAgICAgICAgKi8KKwpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvbm90ZXBhZC9tYWluLmggYi9wcm9ncmFtcy9ub3RlcGFkL21haW4uaAppbmRleCA3Yzc2YjMwLi42YmIzNzYzIDEwMDY0NAotLS0gYS9wcm9ncmFtcy9ub3RlcGFkL21haW4uaAorKysgYi9wcm9ncmFtcy9ub3RlcGFkL21haW4uaApAQCAtMzMsNiArMzMsMTIgQEAKICAgQk9PTCAgICBiV3JhcExvbmdMaW5lczsKICAgQ0hBUiAgICBzekZpbmRUZXh0W01BWF9QQVRITkFNRV9MRU5dOwogICBDSEFSICAgIHN6RmlsZU5hbWVbTUFYX1BBVEhOQU1FX0xFTl07CisgIENIQVIgICAgc3pNYXJnaW5Ub3BbTUFYX1BBVEhOQU1FX0xFTl07CisgIENIQVIgICAgc3pNYXJnaW5Cb3R0b21bTUFYX1BBVEhOQU1FX0xFTl07CisgIENIQVIgICAgc3pNYXJnaW5MZWZ0W01BWF9QQVRITkFNRV9MRU5dOworICBDSEFSICAgIHN6TWFyZ2luUmlnaHRbTUFYX1BBVEhOQU1FX0xFTl07CisgIENIQVIgICAgc3pIZWFkZXJbTUFYX1BBVEhOQU1FX0xFTl07CisgIENIQVIgICAgc3pGb290ZXJbTUFYX1BBVEhOQU1FX0xFTl07CiB9IE5PVEVQQURfR0xPQkFMUzsKIAogZXh0ZXJuIE5PVEVQQURfR0xPQkFMUyBHbG9iYWxzOwpAQCAtNTQsMTggKzYwLDE5IEBACiAjZW5kaWYKIAogLyogc3RyaW5nIHRhYmxlIGluZGV4ICovCi0jZGVmaW5lIElEU19MQU5HVUFHRV9JRCAgICAgICAgICAgICAgICAJU1RSSU5HSUQoMDApCi0jZGVmaW5lIElEU19MQU5HVUFHRV9NRU5VX0lURU0gICAgICAgICAJU1RSSU5HSUQoMDEpCi0jZGVmaW5lIElEU19OT1RFUEFEICAgICAgICAgICAgICAgICAgICAJU1RSSU5HSUQoMDIpCi0jZGVmaW5lIElEU19URVhUX0ZJTEVTX1RYVAkgICAgICAgCVNUUklOR0lEKDAzKQotI2RlZmluZSBJRFNfQUxMX0ZJTEVTICAgICAgICAgICAgICAgICAgCVNUUklOR0lEKDA0KQotI2RlZmluZSBJRFNfRVJST1IJCQlTVFJJTkdJRCgwNSkKLSNkZWZpbmUgSURTX1dBUk5JTkcJCQlTVFJJTkdJRCgwNikKLSNkZWZpbmUgSURTX0lORk8JCQlTVFJJTkdJRCgwNykKLSNkZWZpbmUgSURTX1RPT0xBUkdFCQkJU1RSSU5HSUQoMDgpCi0jZGVmaW5lIElEU19OT1RFWFQJCQlTVFJJTkdJRCgwOSkKLSNkZWZpbmUgSURTX05PVEZPVU5ECQkJU1RSSU5HSUQoMEEpCi0jZGVmaW5lIElEU19PVVRfT0ZfTUVNT1JZCQlTVFJJTkdJRCgwQikKKyNkZWZpbmUgSURTX0xBTkdVQUdFX0lEICAgICAgICAgICAgICAgICBTVFJJTkdJRCgwMCkKKyNkZWZpbmUgSURTX0xBTkdVQUdFX01FTlVfSVRFTSAgICAgICAgICBTVFJJTkdJRCgwMSkKKyNkZWZpbmUgSURTX05PVEVQQUQgICAgICAgICAgICAgICAgICAgICBTVFJJTkdJRCgwMikKKyNkZWZpbmUgSURTX1RFWFRfRklMRVNfVFhUICAgICAgICAgICAgICBTVFJJTkdJRCgwMykKKyNkZWZpbmUgSURTX0FMTF9GSUxFUyAgICAgICAgICAgICAgICAgICBTVFJJTkdJRCgwNCkKKyNkZWZpbmUgSURTX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICBTVFJJTkdJRCgwNSkKKyNkZWZpbmUgSURTX1dBUk5JTkcgICAgICAgICAgICAgICAgICAgICBTVFJJTkdJRCgwNikKKyNkZWZpbmUgSURTX0lORk8gICAgICAgICAgICAgICAgICAgICAgICBTVFJJTkdJRCgwNykKKyNkZWZpbmUgSURTX1RPT0xBUkdFICAgICAgICAgICAgICAgICAgICBTVFJJTkdJRCgwOCkKKyNkZWZpbmUgSURTX05PVEVYVCAgICAgICAgICAgICAgICAgICAgICBTVFJJTkdJRCgwOSkKKyNkZWZpbmUgSURTX05PVEZPVU5EICAgICAgICAgICAgICAgICAgICBTVFJJTkdJRCgwQSkKKyNkZWZpbmUgSURTX09VVF9PRl9NRU1PUlkgICAgICAgICAgICAgICBTVFJJTkdJRCgwQikKKyNkZWZpbmUgSURTX1VOVElUTEVEICAgICAgICAgICAgICAgICAgICBTVFJJTkdJRCgwQykKIAogLyogbWFpbiBtZW51ICovCiAKQEAgLTEwMywyMCArMTEwLDIwIEBACiAKIC8qIERpYWxvZyBgUGFnZSBTZXR1cCcgKi8KIAotI2RlZmluZSBOUF9QQUdFU0VUVVBfSEVBRAkxMDAwCi0jZGVmaW5lIE5QX1BBR0VTRVRVUF9IRUFEX1RYVAkxMDAxCi0jZGVmaW5lIE5QX1BBR0VTRVRVUF9UQUlMCTEwMDIKLSNkZWZpbmUgTlBfUEFHRVNFVFVQX1RBSUxfVFhUCTEwMDMKKyNkZWZpbmUgTlBfUEFHRVNFVFVQX0hFQUQgICAgICAgMTAwMAorI2RlZmluZSBOUF9QQUdFU0VUVVBfSEVBRF9UWFQgICAxMDAxCisjZGVmaW5lIE5QX1BBR0VTRVRVUF9UQUlMICAgICAgIDEwMDIKKyNkZWZpbmUgTlBfUEFHRVNFVFVQX1RBSUxfVFhUICAgMTAwMwogI2RlZmluZSBOUF9QQUdFU0VUVVBfTEVGVCAgICAgICAxMDA1Ci0jZGVmaW5lIE5QX1BBR0VTRVRVUF9MRUZUX1RYVAkxMDA2Ci0jZGVmaW5lIE5QX1BBR0VTRVRVUF9SSUdIVCAgIAkxMDA3Ci0jZGVmaW5lIE5QX1BBR0VTRVRVUF9SSUdIVF9UWFQJMTAwOAotI2RlZmluZSBOUF9QQUdFU0VUVVBfVE9QICAgICAgCTEwMDkKLSNkZWZpbmUgTlBfUEFHRVNFVFVQX1RPUF9UWFQJMTAxMAorI2RlZmluZSBOUF9QQUdFU0VUVVBfTEVGVF9UWFQgICAxMDA2CisjZGVmaW5lIE5QX1BBR0VTRVRVUF9SSUdIVCAgICAgIDEwMDcKKyNkZWZpbmUgTlBfUEFHRVNFVFVQX1JJR0hUX1RYVCAgMTAwOAorI2RlZmluZSBOUF9QQUdFU0VUVVBfVE9QICAgICAgICAxMDA5CisjZGVmaW5lIE5QX1BBR0VTRVRVUF9UT1BfVFhUICAgIDEwMTAKICNkZWZpbmUgTlBfUEFHRVNFVFVQX0JPVFRPTSAgICAgMTAxMQotI2RlZmluZSBOUF9QQUdFU0VUVVBfQk9UVE9NX1RYVAkxMDEyCi0jZGVmaW5lIE5QX0hFTFAJCQkxMDEzCi0jZGVmaW5lIE5QX1BBR0VTRVRVUF9NQVJHSU4gCTEwMTQKKyNkZWZpbmUgTlBfUEFHRVNFVFVQX0JPVFRPTV9UWFQgMTAxMgorI2RlZmluZSBOUF9IRUxQICAgICAgICAgICAgICAgICAxMDEzCisjZGVmaW5lIE5QX1BBR0VTRVRVUF9NQVJHSU4gICAgIDEwMTQKIAogCiAvKiBMb2NhbCBWYXJpYWJsZXM6ICAgICovCmRpZmYgLS1naXQgYS9wcm9ncmFtcy9ub3RlcGFkL25vdGVwYWQucmMgYi9wcm9ncmFtcy9ub3RlcGFkL25vdGVwYWQucmMKaW5kZXggM2ZmMjg0ZS4uMjZhZGU2MyAxMDA2NDQKLS0tIGEvcHJvZ3JhbXMvbm90ZXBhZC9ub3RlcGFkLnJjCisrKyBiL3Byb2dyYW1zL25vdGVwYWQvbm90ZXBhZC5yYwpAQCAtMTEyLDQgKzExMiw1IEBACiBBRERTVFJJTkcoTk9URVhUKQogQUREU1RSSU5HKE5PVEZPVU5EKQogQUREU1RSSU5HKE9VVF9PRl9NRU1PUlkpCitBRERTVFJJTkcoVU5USVRMRUQpCiB9CmRpZmYgLS1naXQgYS9wcm9ncmFtcy9yZWd0ZXN0L0NoYW5nZUxvZyBiL3Byb2dyYW1zL3JlZ3Rlc3QvQ2hhbmdlTG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmODQxMTAKLS0tIC9kZXYvbnVsbAorKysgYi9wcm9ncmFtcy9yZWd0ZXN0L0NoYW5nZUxvZwpAQCAtMCwwICsxLDQgQEAKK1dlZCBNYXkgMTMgMjI6NTg6MDUgMTk5NyAgTWF0dGhldyBCZWNrZXIgPG1iZWNrZXJAZ2xhc3NjaXR5Lm5ldD4KKworCSogW3JlZ3Rlc3QuY10gKG5ldykKKwpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvcmVndGVzdC9NYWtlZmlsZS5pbiBiL3Byb2dyYW1zL3JlZ3Rlc3QvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc0OWM4YwotLS0gL2Rldi9udWxsCisrKyBiL3Byb2dyYW1zL3JlZ3Rlc3QvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSwyNSBAQAorREVGUyAgICAgID0gLURXSU5FTElCCitUT1BTUkNESVIgPSBAdG9wX3NyY2RpckAKK1RPUE9CSkRJUiA9IC4uLy4uCitTUkNESVIgICAgPSBAc3JjZGlyQAorVlBBVEggICAgID0gQHNyY2RpckAKK01PRFVMRSAgICA9IG5vbmUKK1BST0dSQU1TICA9IHJlZ3Rlc3QKK0FMTF9MSUJTICA9ICQoV0lORUxJQikgJChYX0xJQlMpICQoWFBNX0xJQikgJChYTElCKSAkKExJQlMpCitSQ0ZMQUdTICAgPSAtdzMyIC1oCisKK0NfU1JDUyA9IHJlZ3Rlc3QuYworCithbGw6ICQoUFJPR1JBTVMpCisKK0BNQUtFX1JVTEVTQAorCityZWd0ZXN0OiAkKE9CSlMpCisJJChDQykgLW8gcmVndGVzdCAkKE9CSlMpICQoTERPUFRJT05TKSAkKEFMTF9MSUJTKQorCitpbnN0YWxsOiBkdW1teQorCSQoSU5TVEFMTF9QUk9HUkFNKSByZWd0ZXN0ICQoYmluZGlyKS9wcm9ncmFtCisKK2R1bW15OgorCisjIyMgRGVwZW5kZW5jaWVzOgpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvcmVndGVzdC9yZWd0ZXN0LmMgYi9wcm9ncmFtcy9yZWd0ZXN0L3JlZ3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODc5ZDljCi0tLSAvZGV2L251bGwKKysrIGIvcHJvZ3JhbXMvcmVndGVzdC9yZWd0ZXN0LmMKQEAgLTAsMCArMSw0NTIgQEAKKy8qCisgKiBSZWdpc3RyeSB0ZXN0aW5nIHByb2dyYW0KKyAqCisgKiBUaGUgcmV0dXJuIGNvZGVzIHdlcmUgZ2VuZXJhdGVkIGluIGFuIE5UNDAgZW52aXJvbm1lbnQsIHVzaW5nIGxjYy13aW4zMgorICoKKyAqIENvcHlyaWdodCAxOTk4IGJ5IE1hdHRoZXcgQmVja2VyIChtYmVja2VyQGdsYXNzY2l0eS5uZXQpCisgKgorKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWFsbG9jLmg+CisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgPHdpbnJlZy5oPgorI2luY2x1ZGUgPHdpbmVycm9yLmg+CisKKy8qCisgKiBOT1RFUzogVGhlc2UgaW5kaXZpZHVhbCByb3V0aW5lcyBhcmUgbGlzdGVkIGluIGFscGhhYmV0aWNhbCBvcmRlci4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUZXN0Q2xvc2VLZXkKKyAqLwordm9pZCBUZXN0Q2xvc2VLZXkoKQoreworICAgIGxvbmcgbFN0czsKKyAgICBIS0VZIGhrZXk7CisgICAgZnByaW50ZihzdGRlcnIsICJUZXN0aW5nIFJlZ0Nsb3NlS2V5Li4uXG4iKTsKKworICAgIGhrZXkgPSAoSEtFWSkwOworICAgIGxTdHMgPSBSZWdDbG9zZUtleShoa2V5KTsKKyAgICBpZiAobFN0cyAhPSBFUlJPUl9JTlZBTElEX0hBTkRMRSkgZnByaW50ZihzdGRlcnIsICIgMTolbGRcbiIsbFN0cyk7CisKKyAgICBoa2V5ID0gKEhLRVkpLTI7CisgICAgbFN0cyA9IFJlZ0Nsb3NlS2V5KGhrZXkpOworICAgIGlmIChsU3RzICE9IEVSUk9SX0lOVkFMSURfSEFORExFKSBmcHJpbnRmKHN0ZGVyciwgIiAyOiVsZFxuIixsU3RzKTsKKworICAgIGxTdHMgPSBSZWdDbG9zZUtleShIS0VZX0xPQ0FMX01BQ0hJTkUpOworICAgIGlmIChsU3RzICE9IEVSUk9SX1NVQ0NFU1MpIGZwcmludGYoc3RkZXJyLCAiIDM6JWxkXG4iLGxTdHMpOworCisgICAgbFN0cyA9IFJlZ0Nsb3NlS2V5KEhLRVlfTE9DQUxfTUFDSElORSk7CisgICAgaWYgKGxTdHMgIT0gRVJST1JfU1VDQ0VTUykgZnByaW50ZihzdGRlcnIsICIgNDolbGRcbiIsbFN0cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRlc3RDb25uZWN0UmVnaXN0cnkKKyAqLwordm9pZCBUZXN0Q29ubmVjdFJlZ2lzdHJ5KCkKK3sKKyAgICBsb25nIGxTdHM7CisgICAgSEtFWSBoa2V5OworICAgIGZwcmludGYoc3RkZXJyLCAiVGVzdGluZyBSZWdDb25uZWN0UmVnaXN0cnkuLi5cbiIpOworCisgICAgbFN0cyA9IFJlZ0Nvbm5lY3RSZWdpc3RyeSgiIiwwLCZoa2V5KTsKKyAgICBpZiAobFN0cyAhPSBFUlJPUl9TVUNDRVNTKSBmcHJpbnRmKHN0ZGVyciwgIiAxOiVsZFxuIixsU3RzKTsKKworICAgIGxTdHMgPSBSZWdDb25uZWN0UmVnaXN0cnkoIiIsSEtFWV9MT0NBTF9NQUNISU5FLCZoa2V5KTsKKyAgICBpZiAobFN0cyAhPSBFUlJPUl9TVUNDRVNTKSBmcHJpbnRmKHN0ZGVyciwgIiAyOiVsZFxuIixsU3RzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVGVzdENyZWF0ZUtleQorICovCit2b2lkIFRlc3RDcmVhdGVLZXkoKQoreworICAgIEhLRVkgaEtleUluOworICAgIGxvbmcgbFN0czsKKyAgICBIS0VZIGhrZXk7CisKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlRlc3RpbmcgUmVnQ3JlYXRlS2V5Li4uXG4iKTsKKworICAgIGhLZXlJbiA9IChIS0VZKTE7CisgICAgbFN0cyA9IFJlZ0NyZWF0ZUtleShoS2V5SW4sIiIsJmhrZXkpOworICAgIGlmIChsU3RzICE9IEVSUk9SX0JBREtFWSkgZnByaW50ZihzdGRlcnIsICIgMTolbGRcbiIsbFN0cyk7CisKKyAgICBsU3RzID0gUmVnQ3JlYXRlS2V5KEhLRVlfTE9DQUxfTUFDSElORSwiXFxhc2RmIiwmaGtleSk7CisgICAgaWYgKGxTdHMgIT0gRVJST1JfQkFEX1BBVEhOQU1FKSBmcHJpbnRmKHN0ZGVyciwgIiAyOiVsZFxuIixsU3RzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVGVzdENyZWF0ZUtleUV4CisgKi8KK3ZvaWQgVGVzdENyZWF0ZUtleUV4KCkKK3sKKyAgICBIS0VZIGhLZXlJbjsKKyAgICBsb25nIGxTdHM7CisgICAgSEtFWSBoa2V5OworICAgIERXT1JEIGR3RGlzcDsKKworICAgIGZwcmludGYoc3RkZXJyLCAiVGVzdGluZyBSZWdDcmVhdGVLZXlFeC4uLlxuIik7CisKKyAgICBoS2V5SW4gPSAoSEtFWSkxOworICAgIGxTdHMgPSBSZWdDcmVhdGVLZXlFeChoS2V5SW4sIiIsMCwiIiwwLDAsTlVMTCwmaGtleSwmZHdEaXNwKTsKKyAgICBpZiAobFN0cyAhPSBFUlJPUl9TVUNDRVNTKSBmcHJpbnRmKHN0ZGVyciwgIiAxOiVsZFxuIixsU3RzKTsKKworICAgIGxTdHMgPSBSZWdDcmVhdGVLZXlFeChoS2V5SW4sInJlZ3Rlc3QiLDAsIiIsMCwwLE5VTEwsJmhrZXksJmR3RGlzcCk7CisgICAgaWYgKGxTdHMgIT0gRVJST1JfU1VDQ0VTUykgZnByaW50ZihzdGRlcnIsICIgMjolbGRcbiIsbFN0cyk7CisKKyAgICBsU3RzID0gUmVnQ3JlYXRlS2V5RXgoaEtleUluLCJyZWd0ZXN0IiwwLCJhc2RmIiwwLEtFWV9BTExfQUNDRVNTLE5VTEwsJmhrZXksJmR3RGlzcCk7CisgICAgaWYgKGxTdHMgIT0gRVJST1JfU1VDQ0VTUykgZnByaW50ZihzdGRlcnIsICIgMzolbGRcbiIsbFN0cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRlc3REZWxldGVLZXkKKyAqLwordm9pZCBUZXN0RGVsZXRlS2V5KCkKK3sKKyAgICBsb25nIGxTdHM7CisgICAgSEtFWSBoa2V5OworICAgIGZwcmludGYoc3RkZXJyLCAiVGVzdGluZyBSZWdEZWxldGVLZXkuLi5cbiIpOworCisgICAgaGtleSA9IChIS0VZKTA7CisgICAgbFN0cyA9IFJlZ0RlbGV0ZUtleShoa2V5LCAiYXNkZiIpOworICAgIGlmIChsU3RzICE9IEVSUk9SX0lOVkFMSURfSEFORExFKSBmcHJpbnRmKHN0ZGVyciwgIiAxOiVsZFxuIixsU3RzKTsKKworICAgIGxTdHMgPSBSZWdEZWxldGVLZXkoSEtFWV9DVVJSRU5UX1VTRVIsICJhc2RmIik7CisgICAgaWYgKGxTdHMgIT0gRVJST1JfRklMRV9OT1RfRk9VTkQpIGZwcmludGYoc3RkZXJyLCAiIDI6JWxkXG4iLGxTdHMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUZXN0RGVsZXRlVmFsdWUKKyAqLwordm9pZCBUZXN0RGVsZXRlVmFsdWUoKQoreworICAgIGxvbmcgbFN0czsKKyAgICBIS0VZIGhrZXk7CisgICAgZnByaW50ZihzdGRlcnIsICJUZXN0aW5nIFJlZ0RlbGV0ZVZhbHVlLi4uXG4iKTsKKworICAgIGhrZXkgPSAoSEtFWSkwOworICAgIGxTdHMgPSBSZWdEZWxldGVWYWx1ZShoa2V5LCAiYXNkZiIpOworICAgIGlmIChsU3RzICE9IEVSUk9SX0lOVkFMSURfSEFORExFKSBmcHJpbnRmKHN0ZGVyciwgIiAxOiVsZFxuIixsU3RzKTsKKworICAgIGxTdHMgPSBSZWdEZWxldGVWYWx1ZShIS0VZX0NVUlJFTlRfVVNFUiwgImFzZGYiKTsKKyAgICBpZiAobFN0cyAhPSBFUlJPUl9GSUxFX05PVF9GT1VORCkgZnByaW50ZihzdGRlcnIsICIgMjolbGRcbiIsbFN0cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRlc3RFbnVtS2V5CisgKi8KK3ZvaWQgVGVzdEVudW1LZXkoKQoreworICAgIGxvbmcgbFN0czsKKyAgICBjaGFyICpzVmFsOworICAgIGxvbmcgbFZhbDsKKyAgICBIS0VZIGhrZXk7CisKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlRlc3RpbmcgUmVnRW51bUtleS4uLlxuIik7CisgICAgc1ZhbCA9IChjaGFyICopbWFsbG9jKDEgKiBzaXplb2YoY2hhcikpOworICAgIGxWYWwgPSBzaXplb2Yoc1ZhbCk7CisKKyAgICBoa2V5ID0gKEhLRVkpMDsKKyAgICBsU3RzID0gUmVnRW51bUtleShoa2V5LDMsc1ZhbCxsVmFsKTsKKyAgICBpZiAobFN0cyAhPSBFUlJPUl9JTlZBTElEX0hBTkRMRSkgZnByaW50ZihzdGRlcnIsICIgMTolbGRcbiIsbFN0cyk7CisKKyAgICBsU3RzID0gUmVnRW51bUtleShIS0VZX0NVUlJFTlRfVVNFUiwtMSxzVmFsLGxWYWwpOworICAgIGlmIChsU3RzICE9IEVSUk9SX05PX01PUkVfSVRFTVMpIGZwcmludGYoc3RkZXJyLCAiIDI6JWxkXG4iLGxTdHMpOworCisgICAgbFN0cyA9IFJlZ0VudW1LZXkoSEtFWV9DVVJSRU5UX1VTRVIsMCxzVmFsLGxWYWwpOworICAgIGlmIChsU3RzICE9IEVSUk9SX01PUkVfREFUQSkgZnByaW50ZihzdGRlcnIsICIgMzolbGRcbiIsbFN0cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRlc3RFbnVtS2V5RXgKKyAqLwordm9pZCBUZXN0RW51bUtleUV4KCkKK3sKKyAgICBsb25nIGxTdHM7CisgICAgY2hhciAqc1ZhbDsKKyAgICBjaGFyICpzQ2xhc3M7CisgICAgdW5zaWduZWQgbG9uZyBsTGVuMTsKKyAgICB1bnNpZ25lZCBsb25nIGxMZW4yOworICAgIEZJTEVUSU1FIGZ0OworCisgICAgZnByaW50ZihzdGRlcnIsICJUZXN0aW5nIFJlZ0VudW1LZXlFeC4uLlxuIik7CisgICAgc1ZhbCA9IChjaGFyICopbWFsbG9jKDgwICogc2l6ZW9mKGNoYXIpKTsKKyAgICBsTGVuMT0gc2l6ZW9mKHNWYWwpOworICAgIHNDbGFzcyA9IChjaGFyICopbWFsbG9jKDEwICogc2l6ZW9mKGNoYXIpKTsKKyAgICBsTGVuMiA9IHNpemVvZihzQ2xhc3MpOworCisgICAgbFN0cyA9IFJlZ0VudW1LZXlFeCgwLDAsc1ZhbCwmbExlbjEsMCxzQ2xhc3MsJmxMZW4yLCZmdCk7CisgICAgaWYgKGxTdHMgIT0gRVJST1JfSU5WQUxJRF9IQU5ETEUpIGZwcmludGYoc3RkZXJyLCAiIDE6JWxkXG4iLGxTdHMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUZXN0RW51bVZhbHVlCisgKi8KK3ZvaWQgVGVzdEVudW1WYWx1ZSgpCit7CisgICAgbG9uZyBsU3RzOworICAgIGNoYXIgKnNWYWw7CisgICAgdW5zaWduZWQgbG9uZyBsVmFsOworICAgIHVuc2lnbmVkIGxvbmcgbFR5cGU7CisgICAgdW5zaWduZWQgbG9uZyBsTGVuMTsKKyAgICBjaGFyICpiVmFsOworICAgIEhLRVkgaGtleTsKKworICAgIGZwcmludGYoc3RkZXJyLCAiVGVzdGluZyBSZWdFbnVtVmFsdWUuLi5cbiIpOworICAgIHNWYWwgPSAoY2hhciAqKW1hbGxvYyg4MCAqIHNpemVvZihjaGFyKSk7CisgICAgYlZhbCA9IChjaGFyICopbWFsbG9jKDgwICogc2l6ZW9mKGNoYXIpKTsKKyAgICBsVmFsID0gc2l6ZW9mKHNWYWwpOworICAgIGxMZW4xID0gc2l6ZW9mKGJWYWwpOworCisgICAgaGtleSA9IChIS0VZKTA7CisgICAgbFN0cyA9IFJlZ0VudW1WYWx1ZShoa2V5LC0xLHNWYWwsJmxWYWwsMCwmbFR5cGUsTlVMTCwmbExlbjEpOworICAgIGlmIChsU3RzICE9IEVSUk9SX0lOVkFMSURfSEFORExFKSBmcHJpbnRmKHN0ZGVyciwgIiAxOiVsZFxuIixsU3RzKTsKKworICAgIGxTdHMgPSBSZWdFbnVtVmFsdWUoSEtFWV9MT0NBTF9NQUNISU5FLC0xLHNWYWwsJmxWYWwsMCwmbFR5cGUsTlVMTCwmbExlbjEpOworICAgIGlmIChsU3RzICE9IEVSUk9SX05PX01PUkVfSVRFTVMpIGZwcmludGYoc3RkZXJyLCAiIDI6JWxkXG4iLGxTdHMpOworCisgICAgbFN0cyA9IFJlZ0VudW1WYWx1ZShIS0VZX0xPQ0FMX01BQ0hJTkUsMCxzVmFsLCZsVmFsLDAsJmxUeXBlLE5VTEwsJmxMZW4xKTsKKyAgICBpZiAobFN0cyAhPSBFUlJPUl9OT19NT1JFX0lURU1TKSBmcHJpbnRmKHN0ZGVyciwgIiAzOiVsZFxuIixsU3RzKTsKKworICAgIGxTdHMgPSBSZWdFbnVtVmFsdWUoSEtFWV9MT0NBTF9NQUNISU5FLDEsc1ZhbCwmbFZhbCwwLCZsVHlwZSxiVmFsLCZsTGVuMSk7CisgICAgaWYgKGxTdHMgIT0gRVJST1JfTk9fTU9SRV9JVEVNUykgZnByaW50ZihzdGRlcnIsICIgNDolbGRcbiIsbFN0cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRlc3RGbHVzaEtleQorICovCit2b2lkIFRlc3RGbHVzaEtleSgpCit7CisgICAgbG9uZyBsU3RzOworICAgIGZwcmludGYoc3RkZXJyLCAiVGVzdGluZyBSZWdGbHVzaEtleS4uLlxuIik7CisKKyAgICBsU3RzID0gUmVnRmx1c2hLZXkoMCk7CisgICAgaWYgKGxTdHMgIT0gRVJST1JfSU5WQUxJRF9IQU5ETEUpIGZwcmludGYoc3RkZXJyLCAiIDE6JWxkXG4iLGxTdHMpOworCisgICAgbFN0cyA9IFJlZ0ZsdXNoS2V5KEhLRVlfTE9DQUxfTUFDSElORSk7CisgICAgaWYgKGxTdHMgIT0gRVJST1JfU1VDQ0VTUykgZnByaW50ZihzdGRlcnIsICIgMjolbGRcbiIsbFN0cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRlc3RHZXRLZXlTZWN1cml0eQorICovCit2b2lkIFRlc3RHZXRLZXlTZWN1cml0eSgpCit7CisgICAgbG9uZyBsU3RzOworICAgIFNFQ1VSSVRZX0lORk9STUFUSU9OIHNpOworICAgIFNFQ1VSSVRZX0RFU0NSSVBUT1Igc2Q7CisgICAgdW5zaWduZWQgbG9uZyBsTGVuOworICAgIEhLRVkgaGtleTsKKworICAgIGZwcmludGYoc3RkZXJyLCAiVGVzdGluZyBSZWdHZXRLZXlTZWN1cml0eS4uLlxuIik7CisgICAgbExlbiA9IHNpemVvZihzZCk7CisKKyAgICBoa2V5ID0gKEhLRVkpMDsKKyAgICBsU3RzID0gUmVnR2V0S2V5U2VjdXJpdHkoaGtleSxzaSwmc2QsJmxMZW4pOworICAgIGlmIChsU3RzICE9IEVSUk9SX0lOVkFMSURfSEFORExFKSBmcHJpbnRmKHN0ZGVyciwgIiAxOiVsZFxuIixsU3RzKTsKKworICAgIGxTdHMgPSBSZWdHZXRLZXlTZWN1cml0eShIS0VZX0xPQ0FMX01BQ0hJTkUsc2ksJnNkLCZsTGVuKTsKKyAgICBpZiAobFN0cyAhPSBFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKSBmcHJpbnRmKHN0ZGVyciwgIiAyOiVsZFxuIixsU3RzKTsKKworI2lmIDAKKyAgICBzaSA9IEdST1VQX1NFQ1VSSVRZX0lORk9STUFUSU9OOworI2VuZGlmCisgICAgbFN0cyA9IFJlZ0dldEtleVNlY3VyaXR5KEhLRVlfTE9DQUxfTUFDSElORSxzaSwmc2QsJmxMZW4pOworICAgIGlmIChsU3RzICE9IEVSUk9SX1NVQ0NFU1MpIGZwcmludGYoc3RkZXJyLCAiIDM6JWxkXG4iLGxTdHMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUZXN0TG9hZEtleQorICovCit2b2lkIFRlc3RMb2FkS2V5KCkKK3sKKyAgICBsb25nIGxTdHM7CisgICAgZnByaW50ZihzdGRlcnIsICJUZXN0aW5nIFJlZ0xvYWRLZXkuLi5cbiIpOworCisgICAgbFN0cyA9IFJlZ0xvYWRLZXkoMCwiIiwiIik7CisgICAgaWYgKGxTdHMgIT0gRVJST1JfSU5WQUxJRF9IQU5ETEUpIGZwcmludGYoc3RkZXJyLCAiIDE6JWxkXG4iLGxTdHMpOworCisgICAgbFN0cyA9IFJlZ0xvYWRLZXkoSEtFWV9DVVJSRU5UX1VTRVIsIiIsIiIpOworICAgIGlmIChsU3RzICE9IEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKSBmcHJpbnRmKHN0ZGVyciwgIiAyOiVsZFxuIixsU3RzKTsKKworICAgIGxTdHMgPSBSZWdMb2FkS2V5KEhLRVlfQ1VSUkVOVF9VU0VSLCJyZWd0ZXN0IiwiIik7CisgICAgaWYgKGxTdHMgIT0gRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpIGZwcmludGYoc3RkZXJyLCAiIDM6JWxkXG4iLGxTdHMpOworCisgICAgbFN0cyA9IFJlZ0xvYWRLZXkoSEtFWV9DVVJSRU5UX1VTRVIsInJlZ3Rlc3QiLCJyZWd0ZXN0LmRhdCIpOworICAgIGlmIChsU3RzICE9IEVSUk9SX1BSSVZJTEVHRV9OT1RfSEVMRCkgZnByaW50ZihzdGRlcnIsICIgNDolbGRcbiIsbFN0cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRlc3ROb3RpZnlDaGFuZ2VLZXlWYWx1ZQorICovCit2b2lkIFRlc3ROb3RpZnlDaGFuZ2VLZXlWYWx1ZSgpCit7CisgICAgbG9uZyBsU3RzOworICAgIEhBTkRMRSBoRXZlbnQ7CisgICAgSEtFWSBoa2V5OworCisgICAgZnByaW50ZihzdGRlcnIsICJUZXN0aW5nIFJlZ05vdGlmeUNoYW5nZUtleVZhbHVlLi4uXG4iKTsKKyAgICBoRXZlbnQgPSAwOworCisgICAgaGtleSA9IChIS0VZKTI7CisgICAgbFN0cyA9IFJlZ05vdGlmeUNoYW5nZUtleVZhbHVlKGhrZXksIFRSVUUsIFJFR19OT1RJRllfQ0hBTkdFX05BTUUsIDAsIDApOworICAgIGlmIChsU3RzICE9IEVSUk9SX0lOVkFMSURfSEFORExFKSBmcHJpbnRmKHN0ZGVyciwgIiAxOiVsZFxuIixsU3RzKTsKKworICAgIGxTdHMgPSBSZWdOb3RpZnlDaGFuZ2VLZXlWYWx1ZShIS0VZX0NVUlJFTlRfVVNFUiwgVFJVRSwgUkVHX05PVElGWV9DSEFOR0VfTkFNRSwgMCwgMSk7CisgICAgaWYgKGxTdHMgIT0gRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpIGZwcmludGYoc3RkZXJyLCAiIDI6JWxkXG4iLGxTdHMpOworCisgICAgbFN0cyA9IFJlZ05vdGlmeUNoYW5nZUtleVZhbHVlKEhLRVlfQ1VSUkVOVF9VU0VSLCBUUlVFLCBSRUdfTk9USUZZX0NIQU5HRV9OQU1FLCBoRXZlbnQsIDEpOworICAgIGlmIChsU3RzICE9IEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKSBmcHJpbnRmKHN0ZGVyciwgIiAzOiVsZFxuIixsU3RzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVGVzdE9wZW5LZXkKKyAqLwordm9pZCBUZXN0T3BlbktleSgpCit7CisgICAgbG9uZyBsU3RzOworICAgIEhLRVkgaGtleTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlRlc3RpbmcgUmVnT3BlbktleS4uLlxuIik7CisKKyAgICBsU3RzID0gUmVnT3BlbktleSgwLCAiIiwmaGtleSk7CisgICAgaWYgKGxTdHMgIT0gRVJST1JfU1VDQ0VTUykgZnByaW50ZihzdGRlcnIsICIgMTolbGRcbiIsbFN0cyk7CisKKyAgICBsU3RzID0gUmVnT3BlbktleSgwLCAicmVndGVzdCIsJmhrZXkpOworICAgIGlmIChsU3RzICE9IEVSUk9SX0lOVkFMSURfSEFORExFKSBmcHJpbnRmKHN0ZGVyciwgIiAyOiVsZFxuIixsU3RzKTsKKworICAgIGxTdHMgPSBSZWdPcGVuS2V5KEhLRVlfQ1VSUkVOVF9VU0VSLCAicmVndGVzdDEiLCZoa2V5KTsKKyAgICBpZiAobFN0cyAhPSBFUlJPUl9GSUxFX05PVF9GT1VORCkgZnByaW50ZihzdGRlcnIsICIgMzolbGRcbiIsbFN0cyk7CisKKyAgICBsU3RzID0gUmVnT3BlbktleShIS0VZX0NVUlJFTlRfVVNFUiwgIlxccmVndGVzdCIsJmhrZXkpOworICAgIGlmIChsU3RzICE9IEVSUk9SX0JBRF9QQVRITkFNRSkgZnByaW50ZihzdGRlcnIsICIgNDolbGRcbiIsbFN0cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRlc3RPcGVuS2V5RXgKKyAqLwordm9pZCBUZXN0T3BlbktleUV4KCkKK3sKKyAgICBsb25nIGxTdHM7CisgICAgSEtFWSBoa2V5SW47CisgICAgSEtFWSBoa2V5OworICAgIGZwcmludGYoc3RkZXJyLCAiVGVzdGluZyBSZWdPcGVuS2V5RXguLi5cbiIpOworCisgICAgaGtleUluID0gKEhLRVkpMDsKKyAgICBsU3RzID0gUmVnT3BlbktleUV4KGhrZXlJbiwiIiwwLEtFWV9BTExfQUNDRVNTLCZoa2V5KTsKKyAgICBpZiAobFN0cyAhPSBFUlJPUl9JTlZBTElEX0hBTkRMRSkgZnByaW50ZihzdGRlcnIsICIgMTolbGRcbiIsbFN0cyk7CisKKyAgICBsU3RzID0gUmVnT3BlbktleUV4KEhLRVlfQ1VSUkVOVF9VU0VSLCJcXHJlZ3Rlc3QiLDAsS0VZX0FMTF9BQ0NFU1MsJmhrZXkpOworICAgIGlmIChsU3RzICE9IEVSUk9SX0JBRF9QQVRITkFNRSkgZnByaW50ZihzdGRlcnIsICIgMjolbGRcbiIsbFN0cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRlc3RRdWVyeUluZm9LZXkKKyAqLwordm9pZCBUZXN0UXVlcnlJbmZvS2V5KCkKK3sKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlRlc3RpbmcgUmVnUXVlcnlJbmZvS2V5Li4uXG4iKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVGVzdFF1ZXJ5VmFsdWUKKyAqLwordm9pZCBUZXN0UXVlcnlWYWx1ZSgpCit7CisgICAgbG9uZyBsU3RzOworICAgIEhLRVkgaGtleTsKKyAgICBsb25nIGxMZW47CisgICAgY2hhciAqc1ZhbDsKKworICAgIGZwcmludGYoc3RkZXJyLCAiVGVzdGluZyBSZWdRdWVyeVZhbHVlLi4uXG4iKTsKKyAgICBoa2V5ID0gKEhLRVkpMDsKKyAgICBzVmFsID0gKGNoYXIgKiltYWxsb2MoODAgKiBzaXplb2YoY2hhcikpOworICAgIGxMZW4gPSBzdHJsZW4oc1ZhbCk7CisKKyAgICBsU3RzID0gUmVnUXVlcnlWYWx1ZShoa2V5LCIiLE5VTEwsJmxMZW4pOworICAgIGlmIChsU3RzICE9IEVSUk9SX0lOVkFMSURfSEFORExFKSBmcHJpbnRmKHN0ZGVyciwgIiAxOiVsZFxuIixsU3RzKTsKKworICAgIGxTdHMgPSBSZWdRdWVyeVZhbHVlKEhLRVlfQ1VSUkVOVF9VU0VSLCIiLE5VTEwsJmxMZW4pOworICAgIGlmIChsU3RzICE9IEVSUk9SX1NVQ0NFU1MpIGZwcmludGYoc3RkZXJyLCAiIDI6JWxkXG4iLGxTdHMpOworCisgICAgbFN0cyA9IFJlZ1F1ZXJ5VmFsdWUoSEtFWV9DVVJSRU5UX1VTRVIsIlxccmVndGVzdCIsTlVMTCwmbExlbik7CisgICAgaWYgKGxTdHMgIT0gRVJST1JfQkFEX1BBVEhOQU1FKSBmcHJpbnRmKHN0ZGVyciwgIiAzOiVsZFxuIixsU3RzKTsKKworICAgIGxTdHMgPSBSZWdRdWVyeVZhbHVlKEhLRVlfQ1VSUkVOVF9VU0VSLCIiLHNWYWwsJmxMZW4pOworICAgIGlmIChsU3RzICE9IEVSUk9SX1NVQ0NFU1MpIGZwcmludGYoc3RkZXJyLCAiIDQ6JWxkXG4iLGxTdHMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUZXN0UXVlcnlWYWx1ZUV4CisgKi8KK3ZvaWQgVGVzdFF1ZXJ5VmFsdWVFeCgpCit7CisgICAgZnByaW50ZihzdGRlcnIsICJUZXN0aW5nIFJlZ1F1ZXJ5VmFsdWVFeC4uLlxuIik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRlc3RSZXBsYWNlS2V5CisgKi8KK3ZvaWQgVGVzdFJlcGxhY2VLZXkoKQoreworICAgIGZwcmludGYoc3RkZXJyLCAiVGVzdGluZyBSZWdSZXBsYWNlS2V5Li4uXG4iKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVGVzdFJlc3RvcmVLZXkKKyAqLwordm9pZCBUZXN0UmVzdG9yZUtleSgpCit7CisgICAgZnByaW50ZihzdGRlcnIsICJUZXN0aW5nIFJlZ1Jlc3RvcmVLZXkuLi5cbiIpOworfQorCit2b2lkIFRlc3RTZXF1ZW5jZTEoKQoreworICAgIEhLRVkgaGtleTsKKyAgICBsb25nIGxTdHM7CisKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlRlc3RpbmcgU2VxdWVuY2UxLi4uXG4iKTsKKworICAgIGxTdHMgPSBSZWdDcmVhdGVLZXkoSEtFWV9DVVJSRU5UX1VTRVIsInJlZ3Rlc3QiLCZoa2V5KTsKKyAgICBpZiAobFN0cyAhPSBFUlJPUl9TVUNDRVNTKSBmcHJpbnRmKHN0ZGVyciwgIiAxOiVsZFxuIixsU3RzKTsKK30KKworCitpbnQgUEFTQ0FMIFdpbk1haW4gKEhBTkRMRSBpbnN0LCBIQU5ETEUgcHJldiwgTFBTVFIgY21kbGluZSwgaW50IHNob3cpCit7CisKKyAgICAvKiBUaGVzZSBjYW4gYmUgaW4gYW55IG9yZGVyICovCisgICAgVGVzdENsb3NlS2V5KCk7CisgICAgVGVzdENvbm5lY3RSZWdpc3RyeSgpOworICAgIFRlc3RDcmVhdGVLZXkoKTsKKyAgICBUZXN0Q3JlYXRlS2V5RXgoKTsKKyAgICBUZXN0RGVsZXRlS2V5KCk7CisgICAgVGVzdERlbGV0ZVZhbHVlKCk7CisgICAgVGVzdEVudW1LZXkoKTsKKyAgICBUZXN0RW51bUtleUV4KCk7CisgICAgVGVzdEVudW1WYWx1ZSgpOworICAgIFRlc3RGbHVzaEtleSgpOworICAgIFRlc3RHZXRLZXlTZWN1cml0eSgpOworICAgIFRlc3RMb2FkS2V5KCk7CisgICAgVGVzdE5vdGlmeUNoYW5nZUtleVZhbHVlKCk7CisgICAgVGVzdE9wZW5LZXkoKTsKKyAgICBUZXN0T3BlbktleUV4KCk7CisgICAgVGVzdFF1ZXJ5SW5mb0tleSgpOworICAgIFRlc3RRdWVyeVZhbHVlKCk7CisgICAgVGVzdFF1ZXJ5VmFsdWVFeCgpOworICAgIFRlc3RSZXBsYWNlS2V5KCk7CisgICAgVGVzdFJlc3RvcmVLZXkoKTsKKy8qCisgICAgVGVzdFNhdmVLZXkoKTsKKyAgICBUZXN0U2V0S2V5U2VjdXJpdHkoKTsKKyAgICBUZXN0U2V0VmFsdWUoKTsKKyAgICBUZXN0U2V0VmFsdWVFeCgpOworICAgIFRlc3RVbmxvYWRLZXkoKTsKKyovCisKKyAgICAvKiBOb3cgd2UgaGF2ZSBzb21lIHNlcXVlbmNlIHRlc3RpbmcgKi8KKyAgICBUZXN0U2VxdWVuY2UxKCk7CisKKyAgICByZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvcmVsYXkzMi9NYWtlZmlsZS5pbiBiL3JlbGF5MzIvTWFrZWZpbGUuaW4KaW5kZXggYjQyZjNjNC4uOTVmYTE2YyAxMDA2NDQKLS0tIGEvcmVsYXkzMi9NYWtlZmlsZS5pbgorKysgYi9yZWxheTMyL01ha2VmaWxlLmluCkBAIC0zMyw2ICszMyw3IEBACiAJdzMyc2tybmwuc3BlYyBcCiAJd2lubW0uc3BlYyBcCiAJd2luc3Bvb2wuc3BlYyBcCisJd25hc3BpMzIuc3BlYyBcCiAJd293MzIuc3BlYyBcCiAJd3NvY2szMi5zcGVjCiAKZGlmZiAtLWdpdCBhL3JlbGF5MzIvYWR2YXBpMzIuc3BlYyBiL3JlbGF5MzIvYWR2YXBpMzIuc3BlYwppbmRleCA1M2E5NTA4Li5jYWRkM2FhIDEwMDY0NAotLS0gYS9yZWxheTMyL2FkdmFwaTMyLnNwZWMKKysrIGIvcmVsYXkzMi9hZHZhcGkzMi5zcGVjCkBAIC0xMjksNyArMTI5LDcgQEAKIDAxMjUgc3R1YiBSZWFkRXZlbnRMb2dXCiAwMTI2IHN0ZGNhbGwgUmVnQ2xvc2VLZXkobG9uZykgUmVnQ2xvc2VLZXkKIDAxMjcgc3RkY2FsbCBSZWdDb25uZWN0UmVnaXN0cnlBKHN0ciBsb25nIHB0cikgUmVnQ29ubmVjdFJlZ2lzdHJ5MzJBCi0wMTI4IHN0dWIgUmVnQ29ubmVjdFJlZ2lzdHJ5VworMDEyOCBzdGRjYWxsIFJlZ0Nvbm5lY3RSZWdpc3RyeVcod3N0ciBsb25nIHB0cikgUmVnQ29ubmVjdFJlZ2lzdHJ5MzJXCiAwMTI5IHN0ZGNhbGwgUmVnQ3JlYXRlS2V5QShsb25nIHN0ciBwdHIpIFJlZ0NyZWF0ZUtleTMyQQogMDEzMCBzdGRjYWxsIFJlZ0NyZWF0ZUtleUV4QShsb25nIHN0ciBsb25nIHB0ciBsb25nIGxvbmcgcHRyIHB0ciBwdHIpIFJlZ0NyZWF0ZUtleUV4MzJBCiAwMTMxIHN0ZGNhbGwgUmVnQ3JlYXRlS2V5RXhXKGxvbmcgd3N0ciBsb25nIHB0ciBsb25nIGxvbmcgcHRyIHB0ciBwdHIpIFJlZ0NyZWF0ZUtleUV4MzJXCkBAIC0xNDYsOSArMTQ2LDkgQEAKIDAxNDIgc3RkY2FsbCBSZWdFbnVtVmFsdWVXKGxvbmcgbG9uZyBwdHIgcHRyIHB0ciBwdHIgcHRyIHB0cikgUmVnRW51bVZhbHVlMzJXCiAwMTQzIHN0ZGNhbGwgUmVnRmx1c2hLZXkobG9uZykgUmVnRmx1c2hLZXkKIDAxNDQgc3RkY2FsbCBSZWdHZXRLZXlTZWN1cml0eShsb25nIGxvbmcgcHRyIHB0cikgUmVnR2V0S2V5U2VjdXJpdHkKLTAxNDUgc3R1YiBSZWdMb2FkS2V5QQotMDE0NiBzdHViIFJlZ0xvYWRLZXlXCi0wMTQ3IHN0dWIgUmVnTm90aWZ5Q2hhbmdlS2V5VmFsdWUKKzAxNDUgc3RkY2FsbCBSZWdMb2FkS2V5QShsb25nIHN0ciBzdHIpIFJlZ0xvYWRLZXkzMkEKKzAxNDYgc3RkY2FsbCBSZWdMb2FkS2V5Vyhsb25nIHdzdHIgd3N0cikgUmVnTG9hZEtleTMyVworMDE0NyBzdGRjYWxsIFJlZ05vdGlmeUNoYW5nZUtleVZhbHVlKGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZykgUmVnTm90aWZ5Q2hhbmdlS2V5VmFsdWUKIDAxNDggc3RkY2FsbCBSZWdPcGVuS2V5QShsb25nIHN0ciBwdHIpIFJlZ09wZW5LZXkzMkEKIDAxNDkgc3RkY2FsbCBSZWdPcGVuS2V5RXhBKGxvbmcgc3RyIGxvbmcgbG9uZyBwdHIpIFJlZ09wZW5LZXlFeDMyQQogMDE1MCBzdGRjYWxsIFJlZ09wZW5LZXlFeFcobG9uZyB3c3RyIGxvbmcgbG9uZyBwdHIpIFJlZ09wZW5LZXlFeDMyVwpkaWZmIC0tZ2l0IGEvcmVsYXkzMi9idWlsdGluMzIuYyBiL3JlbGF5MzIvYnVpbHRpbjMyLmMKaW5kZXggNTkzY2MxMC4uZWUxN2E2OSAxMDA2NDQKLS0tIGEvcmVsYXkzMi9idWlsdGluMzIuYworKysgYi9yZWxheTMyL2J1aWx0aW4zMi5jCkBAIC02Niw2ICs2Niw3IEBACiBleHRlcm4gY29uc3QgQlVJTFRJTjMyX0RFU0NSSVBUT1IgVzMyU0tSTkxfRGVzY3JpcHRvcjsKIGV4dGVybiBjb25zdCBCVUlMVElOMzJfREVTQ1JJUFRPUiBXSU5NTV9EZXNjcmlwdG9yOwogZXh0ZXJuIGNvbnN0IEJVSUxUSU4zMl9ERVNDUklQVE9SIFdJTlNQT09MX0Rlc2NyaXB0b3I7CitleHRlcm4gY29uc3QgQlVJTFRJTjMyX0RFU0NSSVBUT1IgV05BU1BJMzJfRGVzY3JpcHRvcjsKIGV4dGVybiBjb25zdCBCVUlMVElOMzJfREVTQ1JJUFRPUiBXT1czMl9EZXNjcmlwdG9yOwogZXh0ZXJuIGNvbnN0IEJVSUxUSU4zMl9ERVNDUklQVE9SIFdTT0NLMzJfRGVzY3JpcHRvcjsKIApAQCAtOTgsNiArOTksNyBAQAogICAgIHsgJlczMlNLUk5MX0Rlc2NyaXB0b3IsIE5VTEwsIFRSVUUgIH0sCiAgICAgeyAmV0lOTU1fRGVzY3JpcHRvciwgICAgTlVMTCwgVFJVRSAgfSwKICAgICB7ICZXSU5TUE9PTF9EZXNjcmlwdG9yLCBOVUxMLCBUUlVFICB9LAorICAgIHsgJldOQVNQSTMyX0Rlc2NyaXB0b3IsIE5VTEwsIFRSVUUgIH0sCiAgICAgeyAmV09XMzJfRGVzY3JpcHRvciwgICAgTlVMTCwgVFJVRSAgfSwKICAgICB7ICZXU09DSzMyX0Rlc2NyaXB0b3IsICBOVUxMLCBUUlVFICB9LAogICAgIC8qIExhc3QgZW50cnkgKi8KQEAgLTI4OSw2ICsyOTEsOSBAQAogICAgIHdtLT5uZXh0CQk9IHBkYi0+bW9kcmVmX2xpc3Q7CiAgICAgcGRiLT5tb2RyZWZfbGlzdAk9IHdtOwogICAgIHdtLT5tb2RuYW1lCQk9IEhFQVBfc3RyZHVwQShwZGItPmhlYXAsMCxkbGwtPmRlc2NyLT5uYW1lKTsKKyAgICAvKiBGSVhNRTogaG1tIC4uLiBwcm9iYWJseSBhZGQgd2luZG93cyBkaXJlY3Rvcnk/IGRvbid0IGtub3cgLi4uIC1NTSAqLworICAgIHdtLT5zaG9ydG5hbWUJPSBIRUFQX3N0cmR1cEEocGRiLT5oZWFwLDAsd20tPm1vZG5hbWUpOworICAgIHdtLT5sb25nbmFtZQk9IEhFQVBfc3RyZHVwQShwZGItPmhlYXAsMCx3bS0+bW9kbmFtZSk7CiAKICAgICBwZW0tPnBlX2V4cG9ydAk9IGV4cDsKICAgICBwZW0tPmZsYWdzCQk9IFBFX01PRFJFRl9JTlRFUk5BTDsKZGlmZiAtLWdpdCBhL3JlbGF5MzIvY29tY3RsMzIuc3BlYyBiL3JlbGF5MzIvY29tY3RsMzIuc3BlYwppbmRleCA1ZjM5NTZjLi5mNDQ0OGMzIDEwMDY0NAotLS0gYS9yZWxheTMyL2NvbWN0bDMyLnNwZWMKKysrIGIvcmVsYXkzMi9jb21jdGwzMi5zcGVjCkBAIC02LDcgKzYsNyBAQAogIyAgaW1wb3J0IGNvbWN0bDMyLmRsbCBieSBvcmRpbmFsKQogIyAgIFRoaXMgbGlzdCB3YXMgY3JlYXRlZCBmcm9tIGEgY29tY3RsMzIuZGxsIHY0LjcyIChJRTQuMDEpLgogCi0gIDIgc3R1YiBNZW51SGVscAorICAyIHN0ZGNhbGwgTWVudUhlbHAobG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgcHRyKSBNZW51SGVscAogICAzIHN0dWIgU2hvd0hpZGVNZW51Q3RsCiAgIDQgc3R1YiBHZXRFZmZlY3RpdmVDbGllbnRSZWN0CiAgIDUgc3RkY2FsbCBEcmF3U3RhdHVzVGV4dEEobG9uZyBwdHIgcHRyIGxvbmcpIERyYXdTdGF0dXNUZXh0MzJBCkBAIC03Miw3ICs3Miw2IEBACiAgNjMgc3RkY2FsbCBJbWFnZUxpc3RfTG9hZEltYWdlQShsb25nIHB0ciBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcpIEltYWdlTGlzdF9Mb2FkSW1hZ2UzMkEKICA2NCBzdGRjYWxsIEltYWdlTGlzdF9Mb2FkSW1hZ2VXKGxvbmcgcHRyIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZykgSW1hZ2VMaXN0X0xvYWRJbWFnZTMyVwogIDY1IHN0ZGNhbGwgSW1hZ2VMaXN0X01lcmdlKHB0ciBsb25nIHB0ciBsb25nIGxvbmcgbG9uZykgSW1hZ2VMaXN0X01lcmdlCi0jIDY2IHN0ZGNhbGwgSW1hZ2VMaXN0X1JlYWQocHRyKSBJbWFnZUxpc3RfUmVhZAogIDY2IHN0dWIgSW1hZ2VMaXN0X1JlYWQKICA2NyBzdGRjYWxsIEltYWdlTGlzdF9SZW1vdmUocHRyIGxvbmcpIEltYWdlTGlzdF9SZW1vdmUKICA2OCBzdGRjYWxsIEltYWdlTGlzdF9SZXBsYWNlKHB0ciBsb25nIGxvbmcgbG9uZykgSW1hZ2VMaXN0X1JlcGxhY2UKQEAgLTg4LDcgKzg3LDcgQEAKICA3OCBzdGRjYWxsIEltYWdlTGlzdF9TZXRJbWFnZUNvdW50KHB0ciBsb25nKSBJbWFnZUxpc3RfU2V0SW1hZ2VDb3VudAogIDc5IHN0ZGNhbGwgSW1hZ2VMaXN0X1NldE92ZXJsYXlJbWFnZShwdHIgbG9uZyBsb25nKSBJbWFnZUxpc3RfU2V0T3ZlcmxheUltYWdlCiAgODAgc3R1YiBJbWFnZUxpc3RfV3JpdGUKLSA4MSBzdHViIEluaXRDb21tb25Db250cm9sc0V4CisgODEgc3RkY2FsbCBJbml0Q29tbW9uQ29udHJvbHNFeChwdHIpIEluaXRDb21tb25Db250cm9sc0V4CiAgODIgc3R1YiBJbml0aWFsaXplRmxhdFNCCiAgODMgc3R1YiBQcm9wZXJ0eVNoZWV0CiAgODQgc3R1YiBQcm9wZXJ0eVNoZWV0QQpkaWZmIC0tZ2l0IGEvcmVsYXkzMi9jb21kbGczMi5zcGVjIGIvcmVsYXkzMi9jb21kbGczMi5zcGVjCmluZGV4IDY5NmQxNDkuLmYzYzYyMjMgMTAwNjQ0Ci0tLSBhL3JlbGF5MzIvY29tZGxnMzIuc3BlYworKysgYi9yZWxheTMyL2NvbWRsZzMyLnNwZWMKQEAgLTIsOCArMiw4IEBACiB0eXBlCXdpbjMyCiAKICAwIHN0dWIgQXJyb3dCdG5XbmRQcm9jCi0gMSBzdHViIENob29zZUNvbG9yQQotIDIgc3R1YiBDaG9vc2VDb2xvclcKKyAxIHN0ZGNhbGwgQ2hvb3NlQ29sb3JBKHB0cikgQ2hvb3NlQ29sb3IzMkEKKyAyIHN0ZGNhbGwgQ2hvb3NlQ29sb3JXKHB0cikgQ2hvb3NlQ29sb3IzMlcKICAzIHN0ZGNhbGwgQ2hvb3NlRm9udEEocHRyKSBDaG9vc2VGb250MzJBCiAgNCBzdGRjYWxsIENob29zZUZvbnRXKHB0cikgQ2hvb3NlRm9udDMyVwogIDUgc3RkY2FsbCBDb21tRGxnRXh0ZW5kZWRFcnJvcigpIENvbW1EbGdFeHRlbmRlZEVycm9yCmRpZmYgLS1naXQgYS9yZWxheTMyL2NydGRsbC5zcGVjIGIvcmVsYXkzMi9jcnRkbGwuc3BlYwppbmRleCAyYzRiMTVkLi44NGQ2MDI1IDEwMDY0NAotLS0gYS9yZWxheTMyL2NydGRsbC5zcGVjCisrKyBiL3JlbGF5MzIvY3J0ZGxsLnNwZWMKQEAgLTM4LDcgKzM4LDcgQEAKICAzNCBzdHViIF9fdGhyZWFkaWQKICAzNSBzdHViIF9fdG9hc2NpaQogIDM2IGNkZWNsIF9hYm5vcm1hbF90ZXJtaW5hdGlvbigpIENSVERMTF9fYWJub3JtYWxfdGVybWluYXRpb24KLSAzNyBzdHViIF9hY2Nlc3MKKyAzNyBjZGVjbCBfYWNjZXNzKHN0ciBsb25nKSBDUlRETExfX2FjY2VzcwogIDM4IGV4dGVybiBfYWNtZGxuX2RsbCBDUlRETExfYWNtZGxuX2RsbAogIDM5IHN0dWIgX2FleGl0X3J0bl9kbGwKICA0MCBzdHViIF9hbXNnX2V4aXQKQEAgLTEwOCw3ICsxMDgsNyBAQAogMTA0IGV4dGVybiBfZm1vZGVfZGxsIENSVERMTF9mbW9kZV9kbGwKIDEwNSBzdHViIF9mcGNsYXNzCiAxMDYgc3R1YiBfZnBpZWVlX2ZsdAotMTA3IHN0dWIgX2ZwcmVzZXQKKzEwNyBjZGVjbCBfZnByZXNldCgpIENSVERMTF9fZnByZXNldAogMTA4IHN0dWIgX2ZwdXRjaGFyCiAxMDkgc3R1YiBfZnB1dHdjaGFyCiAxMTAgc3R1YiBfZnNvcGVuCkBAIC0xMjUsNyArMTI1LDcgQEAKIDEyMSBzdHViIF9nZXRkY3dkCiAxMjIgc3R1YiBfZ2V0ZGlza2ZyZWUKIDEyMyBzdHViIF9nZXRkbGxwcm9jYWRkcgotMTI0IHN0dWIgX2dldGRyaXZlCisxMjQgY2RlY2wgX2dldGRyaXZlKCkgQ1JURExMX19nZXRkcml2ZQogMTI1IHN0dWIgX2dldGRyaXZlcwogMTI2IHN0dWIgX2dldHBpZAogMTI3IHN0dWIgX2dldHN5c3RpbWUKQEAgLTEzNSw3ICsxMzUsNyBAQAogMTMxIHN0dWIgX2hlYXBtaW4KIDEzMiBzdHViIF9oZWFwc2V0CiAxMzMgc3R1YiBfaGVhcHdhbGsKLTEzNCBzdHViIF9oeXBvdAorMTM0IGNkZWNsIF9oeXBvdChkb3VibGUgZG91YmxlKSBoeXBvdAogMTM1IGNkZWNsIF9pbml0dGVybShwdHIgcHRyKSBDUlRETExfX2luaXR0ZXJtCiAxMzYgZXh0ZXJuIF9pb2IgQ1JURExMX2lvYgogMTM3IGNkZWNsIF9pc2F0dHkobG9uZykgQ1JURExMX19pc2F0dHkKQEAgLTE2OCw5ICsxNjgsOSBAQAogMTY0IHN0dWIgX2lzbmFuCiAxNjUgY2RlY2wgX2l0b2EobG9uZyBwdHIgbG9uZykgQ1JURExMX19pdG9hCiAxNjYgc3R1YiBfaXRvdwotMTY3IHN0dWIgX2owCi0xNjggc3R1YiBfajEKLTE2OSBzdHViIF9qbgorMTY3IGNkZWNsIF9qMChkb3VibGUpIGowCisxNjggY2RlY2wgX2oxKGRvdWJsZSkgajEKKzE2OSBjZGVjbCBfam4obG9uZyBkb3VibGUpIGpuCiAxNzAgc3R1YiBfa2JoaXQKIDE3MSBzdHViIF9sZmluZAogMTcyIHN0dWIgX2xvYWRkbGwKQEAgLTE4MSw3ICsxODEsNyBAQAogMTc3IHN0dWIgX2xyb3RyCiAxNzggc3R1YiBfbHNlYXJjaAogMTc5IHN0dWIgX2xzZWVrCi0xODAgc3R1YiBfbHRvYQorMTgwIGNkZWNsIF9sdG9hKGxvbmcgc3RyIGxvbmcpIENSVERMTF9fbHRvYQogMTgxIHN0dWIgX2x0b3cKIDE4MiBzdHViIF9tYWtlcGF0aAogMTgzIHN0dWIgX21hdGhlcnIKQEAgLTIyNCw3ICsyMjQsNyBAQAogMjIwIHN0dWIgX21ic25pbmMKIDIyMSBzdHViIF9tYnNuc2V0CiAyMjIgc3R1YiBfbWJzcGJyawotMjIzIHN0dWIgX21ic3JjaHIKKzIyMyBjZGVjbCBfbWJzcmNocihzdHIgbG9uZykgQ1JURExMX19tYnNyY2hyCiAyMjQgc3R1YiBfbWJzcmV2CiAyMjUgc3R1YiBfbWJzc2V0CiAyMjYgc3R1YiBfbWJzc3BuCkBAIC0zNTIsNyArMzUyLDcgQEAKIDM0OCBjZGVjbCBhdG9sKHN0cikgYXRvbAogMzQ5IHN0dWIgYnNlYXJjaAogMzUwIGNkZWNsIGNhbGxvYyhsb25nIGxvbmcpIENSVERMTF9jYWxsb2MKLTM1MSBzdHViIGNlaWwKKzM1MSBjZGVjbCBjZWlsKGRvdWJsZSkgY2VpbAogMzUyIHN0dWIgY2xlYXJlcnIKIDM1MyBjZGVjbCBjbG9jaygpIENSVERMTF9jbG9jawogMzU0IGNkZWNsIGNvcyhkb3VibGUpIGNvcwpAQCAtMzgyLDkgKzM4Miw5IEBACiAzNzggY2RlY2wgZnJlZShwdHIpIENSVERMTF9mcmVlCiAzNzkgc3R1YiBmcmVvcGVuCiAzODAgY2RlY2wgZnJleHAoZG91YmxlIHB0cikgZnJleHAKLTM4MSBzdHViIGZzY2FuZgorMzgxIHZhcmFyZ3MgZnNjYW5mKCkgQ1JURExMX2ZzY2FuZgogMzgyIGNkZWNsIGZzZWVrKHB0ciBsb25nIGxvbmcpIENSVERMTF9mc2VlawotMzgzIHN0dWIgZnNldHBvcworMzgzIGNkZWNsIGZzZXRwb3MocHRyIHB0cikgQ1JURExMX2ZzZXRwb3MKIDM4NCBjZGVjbCBmdGVsbChwdHIpIENSVERMTF9mdGVsbAogMzg1IHN0dWIgZndwcmludGYKIDM4NiBjZGVjbCBmd3JpdGUocHRyIGxvbmcgbG9uZyBwdHIpIENSVERMTF9md3JpdGUgCmRpZmYgLS1naXQgYS9yZWxheTMyL2dkaTMyLnNwZWMgYi9yZWxheTMyL2dkaTMyLnNwZWMKaW5kZXggYTQ0N2I4ZC4uNTc2ZWNiNCAxMDA2NDQKLS0tIGEvcmVsYXkzMi9nZGkzMi5zcGVjCisrKyBiL3JlbGF5MzIvZ2RpMzIuc3BlYwpAQCAtMjEsNyArMjEsNyBAQAogIDE3IHN0ZGNhbGwgQ2xvc2VNZXRhRmlsZShsb25nKSBDbG9zZU1ldGFGaWxlMzIKICAxOCBzdHViIENvbG9yTWF0Y2hUb1RhcmdldAogIDE5IHN0ZGNhbGwgQ29tYmluZVJnbihsb25nIGxvbmcgbG9uZyBsb25nKSBDb21iaW5lUmduMzIKLSAyMCBzdHViIENvbWJpbmVUcmFuc2Zvcm0KKyAyMCBzdGRjYWxsIENvbWJpbmVUcmFuc2Zvcm0ocHRyIHB0ciBwdHIpIENvbWJpbmVUcmFuc2Zvcm0KICAyMSBzdGRjYWxsIENvcHlFbmhNZXRhRmlsZUEobG9uZyBzdHIpIENvcHlFbmhNZXRhRmlsZTMyQQogIDIyIHN0dWIgQ29weUVuaE1ldGFGaWxlVwogIDIzIHN0ZGNhbGwgQ29weU1ldGFGaWxlQShsb25nIHN0cikgQ29weU1ldGFGaWxlMzJBCkBAIC0yNTcsNyArMjU3LDcgQEAKIDI1MCBzdHViIExvYWRJbWFnZUNvbG9yTWF0Y2hlckEKIDI1MSBzdHViIExvYWRJbWFnZUNvbG9yTWF0Y2hlclcKIDI1MiBzdHViIE1hc2tCbHQKLTI1MyBzdHViIE1vZGlmeVdvcmxkVHJhbnNmb3JtCisyNTMgc3RkY2FsbCBNb2RpZnlXb3JsZFRyYW5zZm9ybShsb25nIHB0ciBsb25nKSBNb2RpZnlXb3JsZFRyYW5zZm9ybQogMjU0IHN0ZGNhbGwgTW92ZVRvRXgobG9uZyBsb25nIGxvbmcgcHRyKSBNb3ZlVG9FeDMyCiAyNTUgc3RkY2FsbCBPZmZzZXRDbGlwUmduKGxvbmcgbG9uZyBsb25nKSBPZmZzZXRDbGlwUmduMzIKIDI1NiBzdGRjYWxsIE9mZnNldFJnbihsb25nIGxvbmcgbG9uZykgT2Zmc2V0UmduMzIKZGlmZiAtLWdpdCBhL3JlbGF5MzIva2VybmVsMzIuc3BlYyBiL3JlbGF5MzIva2VybmVsMzIuc3BlYwppbmRleCA1YTk5NmI0Li41ZWMyMWYzIDEwMDY0NAotLS0gYS9yZWxheTMyL2tlcm5lbDMyLnNwZWMKKysrIGIvcmVsYXkzMi9rZXJuZWwzMi5zcGVjCkBAIC0xMCw2ICsxMCw3IEBACiAjIC0gazMyZXhwLmggYnkgQW5kcmV3IFNjaHVsbWFuCiAjIC0gZXJyb3IgbWVzc2FnZXMgYW5kIHN0cmluZ3MgZnJvbSB0aGUgZGVidWcgdmVyc2lvbiBvZiBrZXJuZWwzMi5kbGwKICMgLSBjb2RlIGdlbmVyYXRlZCBieSB0aGUgTVMgVGh1bmsgQ29tcGlsZXIKKyMgLSBzeW1ib2xzIGV4cG9ydGVkIGJ5IHRoZSBPY3QgOTQgYmV0YSB2ZXJzaW9uIG9mIGtlcm5lbDMyLmRsbAogCiAgIDEgc3R1YiBWeERDYWxsMAogICAyIHN0dWIgVnhEQ2FsbDEKQEAgLTIwLDIwICsyMSwyMCBAQAogICA3IHN0dWIgVnhEQ2FsbDYKICAgOCBzdHViIFZ4RENhbGw3CiAgIDkgc3R1YiBWeERDYWxsOAotIDEwIHN0ZGNhbGwgQ2hhclRvT2VtQShzdHIgc3RyKSBDaGFyVG9PZW0zMkEKLSAxMSBzdGRjYWxsIENoYXJUb09lbUJ1ZmZBKHN0ciBzdHIgbG9uZykgQ2hhclRvT2VtQnVmZjMyQQotIDEyIHN0ZGNhbGwgT2VtVG9DaGFyQShwdHIgcHRyKSBPZW1Ub0NoYXIzMkEKLSAxMyBzdGRjYWxsIE9lbVRvQ2hhckJ1ZmZBKHB0ciBwdHIgbG9uZykgT2VtVG9DaGFyQnVmZjMyQQotIDE0IHN0ZGNhbGwgTG9hZFN0cmluZ0EobG9uZyBsb25nIHB0ciBsb25nKSBMb2FkU3RyaW5nMzJBCi0gMTUgdmFyYXJncyB3c3ByaW50ZkEoKSB3c3ByaW50ZjMyQQotIDE2IHN0ZGNhbGwgd3ZzcHJpbnRmQSgpIHd2c3ByaW50ZjMyQQotIDE3IHN0dWIgX0tFUk5FTDMyXzE3X1ZETUNhbGwKLSAxOCBzdGRjYWxsIEdldFByb2Nlc3NEV09SRChsb25nIGxvbmcpIEdldFByb2Nlc3NEV09SRAotIDE5IHN0dWIgVGhlVGVtcGxhdGVIYW5kbGUKLSAyMCBzdHViIF9LRVJORUwzMl8yMF9GYWtlV2luMzJIYW5kbGVGcm9tRE9TRmlsZUhhbmRsZQotIDIxIHN0dWIgX0tFUk5FTDMyXzIxX0dldERPU0ZpbGVIYW5kbGVGcm9tV2luMzJIYW5kbGUKLSAyMiBzdHViIF9LRVJORUwzMl8yMl9DbGVhbnVwRmFrZVdpbjMySGFuZGxlCi0gMjMgc3R1YiBfS0VSTkVMMzJfMjMKKyAxMCBzdGRjYWxsIGszMkNoYXJUb09lbUEoc3RyIHN0cikgQ2hhclRvT2VtMzJBCisgMTEgc3RkY2FsbCBrMzJDaGFyVG9PZW1CdWZmQShzdHIgc3RyIGxvbmcpIENoYXJUb09lbUJ1ZmYzMkEKKyAxMiBzdGRjYWxsIGszMk9lbVRvQ2hhckEocHRyIHB0cikgT2VtVG9DaGFyMzJBCisgMTMgc3RkY2FsbCBrMzJPZW1Ub0NoYXJCdWZmQShwdHIgcHRyIGxvbmcpIE9lbVRvQ2hhckJ1ZmYzMkEKKyAxNCBzdGRjYWxsIGszMkxvYWRTdHJpbmdBKGxvbmcgbG9uZyBwdHIgbG9uZykgTG9hZFN0cmluZzMyQQorIDE1IHZhcmFyZ3MgazMyd3NwcmludGZBKCkgd3NwcmludGYzMkEKKyAxNiBzdGRjYWxsIGszMnd2c3ByaW50ZkEoKSB3dnNwcmludGYzMkEKKyAxNyBzdHViIENvbW1vblVuaW1wU3R1YgorIDE4IHN0ZGNhbGwgR2V0UHJvY2Vzc0R3b3JkKGxvbmcgbG9uZykgR2V0UHJvY2Vzc0R3b3JkCisgMTkgc3R1YiBUaHVua1RoZVRlbXBsYXRlSGFuZGxlCisgMjAgc3R1YiBEb3NGaWxlSGFuZGxlVG9XaW4zMkhhbmRsZQorIDIxIHN0dWIgV2luMzJIYW5kbGVUb0Rvc0ZpbGVIYW5kbGUKKyAyMiBzdHViIERpc3Bvc2VMWjMySGFuZGxlCisgMjMgc3R1YiBHRElSZWFsbHlDYXJlcwogIDI0IHN0ZGNhbGwgR2xvYmFsQWxsb2MxNihsb25nIGxvbmcpIEdsb2JhbEFsbG9jMTYKICAyNSBzdGRjYWxsIEdsb2JhbExvY2sxNihsb25nKSBHbG9iYWxMb2NrMTYKICAyNiBzdGRjYWxsIEdsb2JhbFVubG9jazE2KGxvbmcpIEdsb2JhbFVubG9jazE2CkBAIC00Myw3MiArNDQsNzIgQEAKICAzMCBzdGRjYWxsIEdsb2JhbFVuV2lyZTE2KGxvbmcpIEdsb2JhbFVuV2lyZTE2CiAgMzEgc3RkY2FsbCBHbG9iYWxGcmVlMTYobG9uZykgR2xvYmFsRnJlZTE2CiAgMzIgc3RkY2FsbCBHbG9iYWxTaXplMTYobG9uZykgR2xvYmFsU2l6ZTE2Ci0gMzMgc3R1YiBfS0VSTkVMMzJfMzMKKyAzMyBzdHViIEhvdXNlQ2xlYW5Mb2dpY2FsbHlEZWFkSGFuZGxlcwogIDM0IHN0ZGNhbGwgR2V0V2luMTZET1NFbnYoKSBHZXRXaW4xNkRPU0VudgogIDM1IHN0ZGNhbGwgTG9hZExpYnJhcnkxNihzdHIpIExvYWRMaWJyYXJ5MTYKICAzNiBzdGRjYWxsIEZyZWVMaWJyYXJ5MTYobG9uZykgRnJlZUxpYnJhcnkxNgogIDM3IHN0ZGNhbGwgR2V0UHJvY0FkZHJlc3MxNihsb25nIHN0cikgV0lOMzJfR2V0UHJvY0FkZHJlc3MxNgogIDM4IHJlZ2lzdGVyIEFsbG9jTWFwcGVkQnVmZmVyKCkgQWxsb2NNYXBwZWRCdWZmZXIKICAzOSByZWdpc3RlciBGcmVlTWFwcGVkQnVmZmVyKCkgRnJlZU1hcHBlZEJ1ZmZlcgotIDQwIHJlZ2lzdGVyIF9LRVJORUwzMl80MCgpIF9LRVJORUwzMl80MAorIDQwIHJlZ2lzdGVyIE9UXzMyVGhrTFNGKCkgT1RfMzJUaGtMU0YKICA0MSBzdGRjYWxsIFRodW5rSW5pdExTRihsb25nIHN0ciBsb25nIHN0ciBzdHIpIFRodW5rSW5pdExTRgotIDQyIHN0dWIgX0RlYnVnVGh1bmtMU0YKKyA0MiBzdHViIExvZ0FwaVRoa0xTRgogIDQzIHN0ZGNhbGwgVGh1bmtJbml0TFMobG9uZyBzdHIgbG9uZyBzdHIgc3RyKSBUaHVua0luaXRMUwotIDQ0IHN0dWIgX0RlYnVnVGh1bmtMUworIDQ0IHN0dWIgTG9nQXBpVGhrU0wKICA0NSByZWdpc3RlciBDb21tb24zMlRoa0xTKCkgQ29tbW9uMzJUaGtMUyAKICA0NiBzdGRjYWxsIFRodW5rSW5pdFNMKGxvbmcgc3RyIGxvbmcgc3RyIHN0cikgVGh1bmtJbml0U0wKLSA0NyBzdHViIF9EZWJ1Z1RodW5rU0wKKyA0NyBzdHViIExvZ0NCVGhrU0wKICA0OCBzdHViIFJlbGVhc2VUaHVua0xvY2sKICA0OSBzdHViIFJlc3RvcmVUaHVua0xvY2sKICA1MCBzdGRjYWxsIEFkZEF0b21BKHN0cikgQWRkQXRvbTMyQQotIDUxIHN0dWIgX0tFUk5FTDMyXzUxCi0gNTIgc3RkY2FsbCBfS0VSTkVMMzJfNTIoKSBfS0VSTkVMMzJfNTIKLSA1MyBzdHViIF9LRVJORUwzMl81M19Mb2FkTGlicmFyeUFuZEdldFByb2MxNgotIDU0IHN0ZGNhbGwgV09XQ2FsbGJhY2sxNihsb25nIGxvbmcpIFdPV0NhbGxiYWNrMTYKLSA1NSBzdGRjYWxsIFdPV0NhbGxiYWNrMTZFeChwdHIgbG9uZyBsb25nIHB0ciBwdHIpIFdPV0NhbGxiYWNrMTZFeAotIDU2IHN0ZGNhbGwgV09XR2V0VkRNUG9pbnRlcihsb25nIGxvbmcgbG9uZykgV09XR2V0VkRNUG9pbnRlcgotIDU3IHN0ZGNhbGwgV09XSGFuZGxlMzIobG9uZyBsb25nKSBXT1dIYW5kbGUzMgotIDU4IHN0dWIgV09XSGFuZGxlMTYKLSA1OSBzdGRjYWxsIFdPV0dsb2JhbEFsbG9jMTYobG9uZyBsb25nKSBHbG9iYWxBbGxvYzE2Ci0gNjAgc3RkY2FsbCBXT1dHbG9iYWxMb2NrMTYobG9uZykgV0lOMTZfR2xvYmFsTG9jazE2Ci0gNjEgc3RkY2FsbCBXT1dHbG9iYWxVbmxvY2sxNihsb25nKSBHbG9iYWxVbmxvY2sxNgotIDYyIHN0ZGNhbGwgV09XR2xvYmFsRnJlZTE2KGxvbmcpIEdsb2JhbEZyZWUxNgotIDYzIHN0ZGNhbGwgV09XR2xvYmFsQWxsb2NMb2NrMTYobG9uZyBsb25nIHB0cikgV09XR2xvYmFsQWxsb2NMb2NrMTYKLSA2NCBzdGRjYWxsIFdPV0dsb2JhbFVubG9ja0ZyZWUxNihsb25nKSBXT1dHbG9iYWxVbmxvY2tGcmVlMTYKLSA2NSBzdHViIFdPV0dsb2JhbExvY2tTaXplMTYKLSA2NiBzdHViIFdPV1lpZWxkMTYKLSA2NyBzdHViIFdPV0RpcmVjdGVkWWllbGQxNgotIDY4IHN0ZGNhbGwgV09XR2V0VkRNUG9pbnRlckZpeChsb25nIGxvbmcgbG9uZykgV09XR2V0VkRNUG9pbnRlckZpeAotIDY5IHN0ZGNhbGwgV09XR2V0VkRNUG9pbnRlclVuZml4KGxvbmcpIFdPV0dldFZETVBvaW50ZXJVbmZpeAotIDcwIHN0ZGNhbGwgV09XMzJfMShsb25nIGxvbmcpIFdPVzMyXzEKKyA1MSBzdHViIFczMlNfQmFja1RvMzIKKyA1MiBzdGRjYWxsIEdldFRodW5rQnVmZigpIEdldFRodW5rQnVmZgorIDUzIHN0ZGNhbGwgR2V0VGh1bmtTdHVmZihzdHIgc3RyKSBHZXRUaHVua1N0dWZmCisgNTQgc3RkY2FsbCBLMzJXT1dDYWxsYmFjazE2KGxvbmcgbG9uZykgV09XQ2FsbGJhY2sxNgorIDU1IHN0ZGNhbGwgSzMyV09XQ2FsbGJhY2sxNkV4KHB0ciBsb25nIGxvbmcgcHRyIHB0cikgV09XQ2FsbGJhY2sxNkV4CisgNTYgc3RkY2FsbCBLMzJXT1dHZXRWRE1Qb2ludGVyKGxvbmcgbG9uZyBsb25nKSBXT1dHZXRWRE1Qb2ludGVyCisgNTcgc3RkY2FsbCBLMzJXT1dIYW5kbGUzMihsb25nIGxvbmcpIFdPV0hhbmRsZTMyCisgNTggc3R1YiBLMzJXT1dIYW5kbGUxNgorIDU5IHN0ZGNhbGwgSzMyV09XR2xvYmFsQWxsb2MxNihsb25nIGxvbmcpIEdsb2JhbEFsbG9jMTYKKyA2MCBzdGRjYWxsIEszMldPV0dsb2JhbExvY2sxNihsb25nKSBXSU4xNl9HbG9iYWxMb2NrMTYKKyA2MSBzdGRjYWxsIEszMldPV0dsb2JhbFVubG9jazE2KGxvbmcpIEdsb2JhbFVubG9jazE2CisgNjIgc3RkY2FsbCBLMzJXT1dHbG9iYWxGcmVlMTYobG9uZykgR2xvYmFsRnJlZTE2CisgNjMgc3RkY2FsbCBLMzJXT1dHbG9iYWxBbGxvY0xvY2sxNihsb25nIGxvbmcgcHRyKSBXT1dHbG9iYWxBbGxvY0xvY2sxNgorIDY0IHN0ZGNhbGwgSzMyV09XR2xvYmFsVW5sb2NrRnJlZTE2KGxvbmcpIFdPV0dsb2JhbFVubG9ja0ZyZWUxNgorIDY1IHN0dWIgSzMyV09XR2xvYmFsTG9ja1NpemUxNgorIDY2IHN0dWIgSzMyV09XWWllbGQxNgorIDY3IHN0dWIgSzMyV09XRGlyZWN0ZWRZaWVsZDE2CisgNjggc3RkY2FsbCBLMzJXT1dHZXRWRE1Qb2ludGVyRml4KGxvbmcgbG9uZyBsb25nKSBXT1dHZXRWRE1Qb2ludGVyRml4CisgNjkgc3RkY2FsbCBLMzJXT1dHZXRWRE1Qb2ludGVyVW5maXgobG9uZykgV09XR2V0VkRNUG9pbnRlclVuZml4CisgNzAgc3RkY2FsbCBLMzJXT1dHZXREZXNjcmlwdG9yKGxvbmcgbG9uZykgV09XR2V0RGVzY3JpcHRvcgogIDcxIHN0dWIgSXNUaHJlYWRJZAotIDcyIHN0dWIgUnRsTGFyZ2VJbnRlZ2VyQWRkCi0gNzMgc3R1YiBSdGxFbmxhcmdlZEludGVnZXJNdWx0aXBseQotIDc0IHN0dWIgUnRsRW5sYXJnZWRVbnNpZ25lZE11bHRpcGx5Ci0gNzUgc3R1YiBSdGxFbmxhcmdlZFVuc2lnbmVkRGl2aWRlCi0gNzYgc3R1YiBSdGxFeHRlbmRlZExhcmdlSW50ZWdlckRpdmlkZQotIDc3IHN0dWIgUnRsRXh0ZW5kZWRNYWdpY0RpdmlkZQotIDc4IHN0dWIgUnRsRXh0ZW5kZWRJbnRlZ2VyTXVsdGlwbHkKLSA3OSBzdHViIFJ0bExhcmdlSW50ZWdlclNoaWZ0TGVmdAotIDgwIHN0dWIgUnRsTGFyZ2VJbnRlZ2VyU2hpZnRSaWdodAotIDgxIHN0dWIgUnRsTGFyZ2VJbnRlZ2VyQXJpdGhtZXRpY1NoaWZ0Ci0gODIgc3R1YiBSdGxMYXJnZUludGVnZXJOZWdhdGUKLSA4MyBzdHViIFJ0bExhcmdlSW50ZWdlclN1YnRyYWN0Ci0gODQgc3R1YiBSdGxDb252ZXJ0TG9uZ1RvTGFyZ2VJbnRlZ2VyCi0gODUgc3R1YiBSdGxDb252ZXJ0VWxvbmdUb0xhcmdlSW50ZWdlcgotIDg2IHN0dWIgX0tFUk5FTDMyXzg2X0VudGVyU3lzTGV2ZWxTcGVjaWFsCisgNzIgc3R1YiBLMzJSdGxMYXJnZUludGVnZXJBZGQKKyA3MyBzdHViIEszMlJ0bEVubGFyZ2VkSW50ZWdlck11bHRpcGx5CisgNzQgc3R1YiBLMzJSdGxFbmxhcmdlZFVuc2lnbmVkTXVsdGlwbHkKKyA3NSBzdHViIEszMlJ0bEVubGFyZ2VkVW5zaWduZWREaXZpZGUKKyA3NiBzdHViIEszMlJ0bEV4dGVuZGVkTGFyZ2VJbnRlZ2VyRGl2aWRlCisgNzcgc3R1YiBLMzJSdGxFeHRlbmRlZE1hZ2ljRGl2aWRlCisgNzggc3R1YiBLMzJSdGxFeHRlbmRlZEludGVnZXJNdWx0aXBseQorIDc5IHN0dWIgSzMyUnRsTGFyZ2VJbnRlZ2VyU2hpZnRMZWZ0CisgODAgc3R1YiBLMzJSdGxMYXJnZUludGVnZXJTaGlmdFJpZ2h0CisgODEgc3R1YiBLMzJSdGxMYXJnZUludGVnZXJBcml0aG1ldGljU2hpZnQKKyA4MiBzdHViIEszMlJ0bExhcmdlSW50ZWdlck5lZ2F0ZQorIDgzIHN0dWIgSzMyUnRsTGFyZ2VJbnRlZ2VyU3VidHJhY3QKKyA4NCBzdHViIEszMlJ0bENvbnZlcnRMb25nVG9MYXJnZUludGVnZXIKKyA4NSBzdHViIEszMlJ0bENvbnZlcnRVbG9uZ1RvTGFyZ2VJbnRlZ2VyCisgODYgc3R1YiBfS0VSTkVMMzJfODYKICA4NyBzdGRjYWxsIFNTT25CaWdTdGFjaygpIFNTT25CaWdTdGFjawogIDg4IHZhcmFyZ3MgU1NDYWxsKCkgU1NDYWxsCiAgODkgcmVnaXN0ZXIgRlRfUHJvbG9nUHJpbWUoKSBGVF9Qcm9sb2dQcmltZQogIDkwIHJlZ2lzdGVyIFFUX1RodW5rUHJpbWUoKSBRVF9UaHVua1ByaW1lCiAgOTEgc3R1YiBQSzE2Rk5GCi0gOTIgc3R1YiBfS0VSTkVMMzJfOTIKLSA5MyBzdGRjYWxsIEdldFBXaW4xNkxvY2socHRyKSBHZXRQV2luTG9jawotIDk0IHN0dWIgX0RlYnVnQ2hlY2tOb3RTeXNMZXZlbAotIDk1IHN0dWIgX0RlYnVnQXNzZXJ0Q3JpdGljYWxTZWN0aW9uCi0gOTYgc3R1YiBDb25maXJtV2luMTZMb2NrCi0gOTcgc3R1YiBFbnRlclN5c0xldmVsCi0gOTggc3R1YiBMZWF2ZVN5c0xldmVsCisgOTIgc3RkY2FsbCBHZXRQSzE2U3lzVmFyKCkgR2V0UEsxNlN5c1ZhcgorIDkzIHN0ZGNhbGwgR2V0cFdpbjE2TG9jayhwdHIpIEdldHBXaW4xNkxvY2sKKyA5NCBzdHViIF9DaGVja05vdFN5c0xldmVsCisgOTUgc3R1YiBfQ29uZmlybVN5c0xldmVsCisgOTYgc3R1YiBfQ29uZmlybVdpbjE2TG9jaworIDk3IHN0dWIgX0VudGVyU3lzTGV2ZWwKKyA5OCBzdHViIF9MZWF2ZVN5c0xldmVsCiAgOTkgc3RkY2FsbCBfS0VSTkVMMzJfOTkobG9uZykgX0tFUk5FTDMyXzk5CiAxMDAgc3RkY2FsbCBfS0VSTkVMMzJfMTAwKGxvbmcgbG9uZyBsb25nKSBfS0VSTkVMMzJfMTAwCiAxMDEgc3R1YiBfS0VSTkVMMzJfMTAxCkBAIC0xOTIsNyArMTkzLDcgQEAKIDE3OCBzdGRjYWxsIENyZWF0ZVRocmVhZChwdHIgbG9uZyBwdHIgbG9uZyBsb25nIHB0cikgQ3JlYXRlVGhyZWFkCiAxNzkgc3R1YiBDcmVhdGVUb29saGVscDMyU25hcHNob3QKIDE4MCBzdHViIERlYnVnQWN0aXZlUHJvY2VzcwotMTgxIHN0dWIgRGVidWdCcmVhaworMTgxIHJlZ2lzdGVyIERlYnVnQnJlYWsoKSBEZWJ1Z0JyZWFrCiAxODIgc3R1YiBEZWZpbmVEb3NEZXZpY2VBCiAxODMgc3R1YiBEZWZpbmVEb3NEZXZpY2VXCiAxODQgc3RkY2FsbCBEZWxldGVBdG9tKGxvbmcpIERlbGV0ZUF0b20zMgpAQCAtNTAxLDggKzUwMiw4IEBACiA0ODcgc3R1YiBJc1NMQ2FsbGJhY2sKIDQ4OCBzdGRjYWxsIElzVmFsaWRDb2RlUGFnZShsb25nKSBJc1ZhbGlkQ29kZVBhZ2UKIDQ4OSBzdGRjYWxsIElzVmFsaWRMb2NhbGUobG9uZyBsb25nKSBJc1ZhbGlkTG9jYWxlCi00OTAgc3R1YiBLMzJUaGsxNjMyRXBpbG9nCi00OTEgc3R1YiBLMzJUaGsxNjMyUHJvbG9nCis0OTAgcmVnaXN0ZXIgSzMyVGhrMTYzMkVwaWxvZygpIEszMlRoazE2MzJFcGlsb2cKKzQ5MSByZWdpc3RlciBLMzJUaGsxNjMyUHJvbG9nKCkgSzMyVGhrMTYzMlByb2xvZwogNDkyIHN0ZGNhbGwgTENNYXBTdHJpbmdBKGxvbmcgbG9uZyBzdHIgbG9uZyBwdHIgbG9uZykgTENNYXBTdHJpbmczMkEKIDQ5MyBzdGRjYWxsIExDTWFwU3RyaW5nVyhsb25nIGxvbmcgd3N0ciBsb25nIHB0ciBsb25nKSBMQ01hcFN0cmluZzMyVwogNDk0IHN0ZGNhbGwgTGVhdmVDcml0aWNhbFNlY3Rpb24ocHRyKSBMZWF2ZUNyaXRpY2FsU2VjdGlvbgpAQCAtNzcwLDcgKzc3MSw3IEBACiA3NTYgc3RkY2FsbCBfbGNsb3NlKGxvbmcpIF9sY2xvc2UzMgogNzU3IHN0ZGNhbGwgX2xjcmVhdChwdHIgbG9uZykgX2xjcmVhdDMyCiA3NTggc3RkY2FsbCBfbGxzZWVrKGxvbmcgbG9uZyBsb25nKSBfbGxzZWVrMzIKLTc1OSBzdGRjYWxsIF9sb3BlbihwdHIgbG9uZykgX2xvcGVuMzIKKzc1OSBzdGRjYWxsIF9sb3BlbihzdHIgbG9uZykgX2xvcGVuMzIKIDc2MCBzdGRjYWxsIF9scmVhZChsb25nIHB0ciBsb25nKSBfbHJlYWQzMgogNzYxIHN0ZGNhbGwgX2x3cml0ZShsb25nIHB0ciBsb25nKSBfbHdyaXRlMzIKIDc2MiBzdHViIGRwcmludGYKZGlmZiAtLWdpdCBhL3JlbGF5MzIvcmVsYXkzODYuYyBiL3JlbGF5MzIvcmVsYXkzODYuYwppbmRleCA4MjAzZTQwLi5iYmU5OTMzIDEwMDY0NAotLS0gYS9yZWxheTMyL3JlbGF5Mzg2LmMKKysrIGIvcmVsYXkzMi9yZWxheTM4Ni5jCkBAIC0xOTMsNiArMTkzLDggQEAKICAgICB0eXBlZGVmIHZvaWQgKENBTExCQUNLICplbnRyeV9wb2ludF90KShDT05URVhUICopOwogICAgIGVudHJ5X3BvaW50X3QgZW50cnlfcG9pbnQgPSAqKGVudHJ5X3BvaW50X3QqKSAoRVNQX3JlZygmY29udGV4dCkgLSA0KTsKIAorICAgIF9fUkVTVE9SRV9FUzsKKwogICAgIGlmICghVFJBQ0VfT04ocmVsYXkpKQogICAgIHsKICAgICAgICAgLyogU2ltcGx5IGNhbGwgdGhlIGVudHJ5IHBvaW50ICovCkBAIC0yMDQsOCArMjA2LDYgQEAKICAgICAgICAgdW5zaWduZWQgaW50IHR5cGVtYXNrOwogCUJZVEUgKnJlbGF5X2FkZHI7CiAKLSAgICAJX19SRVNUT1JFX0VTOwotCiAgICAgICAgIC8qCiAJICogRml4dXAgdGhlIGNvbnRleHQgc3RydWN0dXJlIGJlY2F1c2Ugb2YgdGhlIGV4dHJhIHBhcmFtZXRlcgogICAgICAgICAgKiBwdXNoZWQgYnkgdGhlIHJlbGF5IGRlYnVnZ2luZyBjb2RlLgpkaWZmIC0tZ2l0IGEvcmVsYXkzMi9zaGVsbDMyLnNwZWMgYi9yZWxheTMyL3NoZWxsMzIuc3BlYwppbmRleCBmMzFkOGEzLi5jODE1ZDBjIDEwMDY0NAotLS0gYS9yZWxheTMyL3NoZWxsMzIuc3BlYworKysgYi9yZWxheTMyL3NoZWxsMzIuc3BlYwpAQCAtODQsNyArODQsNyBAQAogICA4MiBzdHViIEV4dHJhY3RBc3NvY2lhdGVkSWNvbkEKICAgODMgc3R1YiBTSEVMTDMyXzgzCiAgIDg0IHN0dWIgU0hFTEwzMl84NAotICA4NSBzdHViIFNIRUxMMzJfODUKKyAgODUgc3RkY2FsbCBTSEVMTDMyXzg1KGxvbmcgbG9uZyBsb25nIGxvbmcpIFNIRUxMMzJfODUKICAgODYgc3R1YiBTSEVMTDMyXzg2CiAgIDg3IHN0dWIgU0hFTEwzMl84NwogICA4OCBzdHViIFNIRUxMMzJfODgKZGlmZiAtLWdpdCBhL3JlbGF5MzIvdXNlcjMyLnNwZWMgYi9yZWxheTMyL3VzZXIzMi5zcGVjCmluZGV4IGU3M2JkODAuLjkxMGE2YTEgMTAwNjQ0Ci0tLSBhL3JlbGF5MzIvdXNlcjMyLnNwZWMKKysrIGIvcmVsYXkzMi91c2VyMzIuc3BlYwpAQCAtMTE0LDcgKzExNCw3IEBACiAxMDkgc3RkY2FsbCBEZGVOYW1lU2VydmljZShsb25nIGxvbmcgbG9uZyBsb25nKSBEZGVOYW1lU2VydmljZTMyCiAxMTAgc3RkY2FsbCBEZGVQb3N0QWR2aXNlKGxvbmcgbG9uZyBsb25nKSBEZGVQb3N0QWR2aXNlMzIKIDExMSBzdHViIERkZVF1ZXJ5Q29udkluZm8KLTExMiBzdHViIERkZVF1ZXJ5TmV4dFNlcnZlcgorMTEyIHN0ZGNhbGwgRGRlUXVlcnlOZXh0U2VydmVyKGxvbmcgbG9uZykgRGRlUXVlcnlOZXh0U2VydmVyMzIKIDExMyBzdHViIERkZVF1ZXJ5U3RyaW5nQQogMTE0IHN0dWIgRGRlUXVlcnlTdHJpbmdXCiAxMTUgc3RkY2FsbCBEZGVSZWNvbm5lY3QobG9uZykgRGRlUmVjb25uZWN0CkBAIC01MzcsNyArNTM3LDcgQEAKIDUzMiBzdGRjYWxsIFNob3dTY3JvbGxCYXIobG9uZyBsb25nIGxvbmcpIFNob3dTY3JvbGxCYXIzMgogNTMzIHN0dWIgU2hvd1N0YXJ0R2xhc3MKIDUzNCBzdGRjYWxsIFNob3dXaW5kb3cobG9uZyBsb25nKSBTaG93V2luZG93MzIKLTUzNSBzdHViIFNob3dXaW5kb3dBc3luYworNTM1IHN0ZGNhbGwgU2hvd1dpbmRvd0FzeW5jKGxvbmcgbG9uZykgU2hvd1dpbmRvd0FzeW5jMzIKIDUzNiBzdGRjYWxsIFN1YnRyYWN0UmVjdChwdHIgcHRyIHB0cikgU3VidHJhY3RSZWN0MzIKIDUzNyBzdGRjYWxsIFN3YXBNb3VzZUJ1dHRvbihsb25nKSBTd2FwTW91c2VCdXR0b24zMgogNTM4IHN0dWIgU3dpdGNoRGVza3RvcApkaWZmIC0tZ2l0IGEvcmVsYXkzMi93bmFzcGkzMi5zcGVjIGIvcmVsYXkzMi93bmFzcGkzMi5zcGVjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MzQ5YmEKLS0tIC9kZXYvbnVsbAorKysgYi9yZWxheTMyL3duYXNwaTMyLnNwZWMKQEAgLTAsMCArMSw2IEBACituYW1lCXduYXNwaTMyCit0eXBlCXdpbjMyCisKKzAgc3R1YiBHZXRBU1BJMzJTdXBwb3J0SW5mbworMSBzdHViIFNlbmRBU1BJMzJDb21tYW5kCiszIHN0dWIgR2V0QVNQSTMyRExMVmVyc2lvbgpkaWZmIC0tZ2l0IGEvcmVsYXkzMi93b3czMi5zcGVjIGIvcmVsYXkzMi93b3czMi5zcGVjCmluZGV4IDliNWJhY2UuLjMzOWU4YTMgMTAwNjQ0Ci0tLSBhL3JlbGF5MzIvd293MzIuc3BlYworKysgYi9yZWxheTMyL3dvdzMyLnNwZWMKQEAgLTEsNyArMSw3IEBACiBuYW1lCXdvdzMyCiB0eXBlCXdpbjMyCiAKLSAgMSBzdGRjYWxsIFdPV18xKGxvbmcgbG9uZykgV09XMzJfMQorICAxIHN0ZGNhbGwgV09XR2V0RGVzY3JpcHRvcihsb25nIGxvbmcpIFdPV0dldERlc2NyaXB0b3IKICAgMiBzdGRjYWxsIFdPV0NhbGxiYWNrMTYobG9uZyBsb25nKSBXT1dDYWxsYmFjazE2CiAgIDMgc3RkY2FsbCBXT1dDYWxsYmFjazE2RXgocHRyIGxvbmcgbG9uZyBwdHIgcHRyKSBXT1dDYWxsYmFjazE2RXgKICAgNCBzdHViICAgIFdPV0RpcmVjdGVkWWllbGQxNgpkaWZmIC0tZ2l0IGEvdG9vbHMvYnVpbGQuYyBiL3Rvb2xzL2J1aWxkLmMKaW5kZXggODE0YTViMC4uMzE5YjZlNyAxMDA2NDQKLS0tIGEvdG9vbHMvYnVpbGQuYworKysgYi90b29scy9idWlsZC5jCkBAIC0xNDk2LDYgKzE0OTYsMTYgQEAKICAqIEZvciByZWdpc3RlciBmdW5jdGlvbnMsIHRoZSBhcmd1bWVudHMgYXJlIGlnbm9yZWQsIGJ1dCB0aGV5IGFyZSBzdGlsbAogICogcmVtb3ZlZCBmcm9tIHRoZSBzdGFjayB1cG9uIHJldHVybi4KICAqCisgKiBBIHNwZWNpYWwgdmFyaWFudCBvZiB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gaXMgZ2VuZXJhdGVkIGJ5IHRoZSBmdW5jdGlvbiAKKyAqIHByb2ZpbGUgInRfbG9uZ18iLiBUaGlzIGlzIHVzZWQgYnkgdGhlIFdpbjk1IDE2LT4zMiB0aHVuaworICogZnVuY3Rpb25zIEMxNlRoa1NMIGFuZCBDMTZUaGtTTDAxIGFuZCBpcyBpbXBsZW1lbnRlZCBhcyBmb2xsb3dzOgorICogT24gZW50cnksIHRoZSBFQlggcmVnaXN0ZXIgaXMgc2V0IHVwIHRvIGNvbnRhaW4gYSBmbGF0IHBvaW50ZXIgdG8gdGhlCisgKiAxNi1iaXQgc3RhY2sgc3VjaCB0aGF0IEVCWCsyMiBwb2ludHMgdG8gdGhlIGZpcnN0IGFyZ3VtZW50LgorICogVGhlbiwgdGhlIGVudHJ5IHBvaW50IGlzIGNhbGxlZCwgd2hpbGUgRUJQIGlzIHNldCB1cCB0byBwb2ludAorICogdG8gdGhlIHJldHVybiBhZGRyZXNzIChvbiB0aGUgMzItYml0IHN0YWNrKS4KKyAqIFRoZSBjYWxsZWQgZnVuY3Rpb24gcmV0dXJucyB3aXRoIENYIHNldCB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzCisgKiB0byBiZSBwb3BwZWQgb2YgdGhlIGNhbGxlcidzIHN0YWNrLgorICoKICAqIFN0YWNrIGxheW91dCB1cG9uIGVudHJ5IHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbjoKICAqICAuLi4gICAgICAgICAgIC4uLgogICogKHNwKzE4KSB3b3JkICAgZmlyc3QgMTYtYml0IGFyZwpAQCAtMTUxOCwxMSArMTUyOCwxMyBAQAogICAgIGludCBzaG9ydF9yZXQgPSAwOwogICAgIGludCByZWdfZnVuYyA9IDA7CiAgICAgaW50IGNkZWNsID0gMDsKKyAgICBpbnQgdGh1bmsgPSAwOwogICAgIGNoYXIgKmFyZ3MgPSBwcm9maWxlICsgNzsKIAogICAgIC8qIFBhcnNlIGZ1bmN0aW9uIHR5cGUgKi8KIAogICAgIGlmICghc3RybmNtcCggImNfIiwgcHJvZmlsZSwgMiApKSBjZGVjbCA9IDE7CisgICAgZWxzZSBpZiAoIXN0cm5jbXAoICJ0XyIsIHByb2ZpbGUsIDIgKSkgdGh1bmsgPSAxOwogICAgIGVsc2UgaWYgKHN0cm5jbXAoICJwXyIsIHByb2ZpbGUsIDIgKSkKICAgICB7CiAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIkludmFsaWQgZnVuY3Rpb24gbmFtZSAnJXMnLCBpZ25vcmVkXG4iLCBwcm9maWxlICk7CkBAIC0xNTk0LDYgKzE2MDYsMTcgQEAKIAogICAgIGlmIChyZWdfZnVuYykgQnVpbGRDb250ZXh0MTYoIG91dGZpbGUgKTsKICAgICBlbHNlIGlmICgqYXJncykgYXJnc2l6ZSA9IFRyYW5zZmVyQXJnczE2VG8zMiggb3V0ZmlsZSwgYXJncywgY2RlY2wgKTsKKyAgICBlbHNlIGlmICh0aHVuaykKKyAgICB7CisgICAgICAgIC8qIEdldCB0aGUgc3RhY2sgc2VsZWN0b3IgYmFzZSAqLworICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3Z3ICUlc3MsJSVheFxuIiApOworICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRhbmRsICQweGZmZjgsJSVlYXhcbiIgKTsKKyAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92bCAiIFBSRUZJWCAibGR0X2NvcHkoJSVlYXgpLCUlZWF4XG4iICk7CisgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdmwgJSVlYXgsLTIwKCUlZWJwKVxuIiApOworICAgICAgICAvKiBBZGQgdGhlIG9mZnNldCAqLworICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRsZWFsIC0xNiglJWVicCksJSVlYXhcbiIgKTsKKyAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0YWRkbCAlJWVheCwtMjAoJSVlYnApXG4iICk7CisgICAgfQogCiAgICAgLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBBUEkgZnVuY3Rpb24gKi8KIApAQCAtMTYyNSw3ICsxNjQ4LDcgQEAKIAogICAgIC8qIFByaW50IHRoZSBkZWJ1ZyBpbmZvcm1hdGlvbiBiZWZvcmUgdGhlIGNhbGwgKi8KIAotICAgIGlmIChkZWJ1Z2dpbmcpCisgICAgaWYgKGRlYnVnZ2luZyAmJiAhdGh1bmspCiAgICAgewogICAgICAgICBpbnQgZnR5cGUgPSAwOwogCkBAIC0xNjQ0LDExICsxNjY3LDIwIEBACiAKICAgICAvKiBDYWxsIHRoZSBlbnRyeSBwb2ludCAqLwogCi0gICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0Y2FsbCAqJSVlYXhcbiIgKTsKKyAgICBpZiAodGh1bmspCisgICAgeworICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwdXNobCAlJWVicFxuIiApOworICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRsZWFsIC00KCUlZXNwKSwgJSVlYnBcbiIgKTsKKyAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0Y2FsbCAqJSVlYXhcbiIgKTsKKyAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cG9wbCAlJWVicFxuIiApOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdGNhbGwgKiUlZWF4XG4iICk7CisKIAogICAgIC8qIFByaW50IHRoZSBkZWJ1ZyBpbmZvcm1hdGlvbiBhZnRlciB0aGUgY2FsbCAqLwogCi0gICAgaWYgKGRlYnVnZ2luZykKKyAgICBpZiAoZGVidWdnaW5nICYmICF0aHVuaykKICAgICB7CiAgICAgICAgIGlmIChyZWdfZnVuYykKICAgICAgICAgewpAQCAtMTcyOCw4ICsxNzYwLDE3IEBACiAgICAgfQogCiAgICAgLyogUmVtb3ZlIHRoZSBhcmd1bWVudHMgYW5kIHJldHVybiAqLwotCi0gICAgaWYgKGFyZ3NpemUgJiYgIWNkZWNsKQorICAgIAorICAgIGlmICh0aHVuaykKKyAgICB7CisgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdHBvcGwgJSVlYnhcbiIgKTsKKyAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0eG9yYiAlJWNoLCUlY2hcbiIgKTsKKyAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0YWRkdyAlJWN4LCAlJXNwXG4iICk7CisgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdHB1c2hsICUlZWJ4XG4iICk7CisgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdC5ieXRlIDB4NjZcbiIgKTsKKyAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bHJldFxuIiApOworICAgIH0KKyAgICBlbHNlIGlmIChhcmdzaXplICYmICFjZGVjbCkKICAgICB7CiAgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdC5ieXRlIDB4NjZcbiIgKTsKICAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bHJldCAkJWRcbiIsIGFyZ3NpemUgKTsKQEAgLTIyNDgsNiArMjI4OSwxMCBAQAogCiAgICAgZm9yIChpID0gMjsgaSA8IGFyZ2M7IGkrKykgQnVpbGRDYWxsRnJvbTE2RnVuYyggb3V0ZmlsZSwgYXJndltpXSApOwogCisgICAgLyogQnVpbGQgdGhlIHRodW5rIGNhbGxiYWNrIGZ1bmN0aW9uICovCisKKyAgICBCdWlsZENhbGxGcm9tMTZGdW5jKCBvdXRmaWxlLCAidF9sb25nXyIgKTsKKwogICAgIC8qIE91dHB1dCB0aGUgYXJndW1lbnQgZGVidWdnaW5nIHN0cmluZ3MgKi8KIAogICAgIGlmIChkZWJ1Z2dpbmcpCmRpZmYgLS1naXQgYS93aW4zMi9jb25zb2xlLmMgYi93aW4zMi9jb25zb2xlLmMKaW5kZXggODlkNzBkYy4uMThjYjE1OCAxMDA2NDQKLS0tIGEvd2luMzIvY29uc29sZS5jCisrKyBiL3dpbjMyL2NvbnNvbGUuYwpAQCAtNzk2LDE1ICs3OTYsMTAgQEAKICAgICBUUkFDRShjb25zb2xlLCAiJWQgKCVkIHggJWQpXG4iLCBoQ29uc29sZU91dHB1dCwgZHdDdXJzb3JQb3NpdGlvbi54LCAKICAgICAgICAgICBkd0N1cnNvclBvc2l0aW9uLnkpOwogICAgIC8qIHggYXJlIGNvbHVtbnMsIHkgcm93cyAqLwotICAgIGlmICghZHdDdXJzb3JQb3NpdGlvbi55KSB7CiAgICAgCWZwcmludGYoc3RkZXJyLCJcciIpOwotCWlmIChkd0N1cnNvclBvc2l0aW9uLngpCiAgICAgICAgICAgICAvKiBub3RlOiAweDFCID09IEVTQyAqLwotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIiVjWyVkQyIsIDB4MUIsIGR3Q3Vyc29yUG9zaXRpb24ueCk7CisgICAgZnByaW50ZihzdGRvdXQsIiVjWyVkOyVkSCIsIDB4MUIsIGR3Q3Vyc29yUG9zaXRpb24ueSwgZHdDdXJzb3JQb3NpdGlvbi54KTsKIAlyZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgRklYTUUoY29uc29sZSwgIlVuaGFuZGxlZCBjYXNlOiB5PSVkXG4iLCBkd0N1cnNvclBvc2l0aW9uLnkpOwotICAgIHJldHVybiBGQUxTRTsKIH0KIAogCkBAIC05MjgsMTEgKzkyMywxMDMgQEAKICAqICAgIFN1Y2Nlc3M6IFRSVUUKICAqICAgIEZhaWx1cmU6IEZBTFNFCiAgKi8KLUJPT0wzMiBXSU5BUEkgU2V0Q29uc29sZVRleHRBdHRyaWJ1dGUzMigKLSAgICBIQU5ETEUzMiBoY29uLCAgICAvKiBbaW5dIEhhbmRsZSB0byBjb25zb2xlIHNjcmVlbiBidWZmZXIgKi8KLSAgICBEV09SRCBhdHRyaWJ1dGVzKSAvKiBbaW5dIFRleHQgYW5kIGJhY2tncm91bmQgY29sb3JzICovCitCT09MMzIgV0lOQVBJIFNldENvbnNvbGVUZXh0QXR0cmlidXRlMzIoSEFORExFMzIgaENvbnNvbGVPdXRwdXQsV09SRCB3QXR0cikKIHsKLSAgICBGSVhNRShjb25zb2xlLCAiKCV4LCVseCk6IHN0dWJcbiIsIGhjb24sIGF0dHJpYnV0ZXMpOworICAgIGludCBmb3JlY29sb3IgPSAwOworICAgIGludCBiYWNrY29sb3IgPSAwOworICAgIGludCBib2xkdGV4dCA9IDA7CisgICAgdW5zaWduZWQgaW50IGF0dHJpYjsKKyAgICAKKyAgICBhdHRyaWIgPSB3QXR0cjsKKyAgICBpZiggYXR0cmliID49IEJBQ0tHUk9VTkRfSU5URU5TSVRZICkKKyAgICAgICAgYXR0cmliIC09IEJBQ0tHUk9VTkRfSU5URU5TSVRZOyAvKiBCYWNrZ3JvdW5kIGludGVuc2l0eSBpcyBpZ25vcmVkICovCisgICAgaWYoIGF0dHJpYiA+PSBCQUNLR1JPVU5EX1JFRCApCisgICAgeworICAgICAgICBhdHRyaWIgLT0gQkFDS0dST1VORF9SRUQ7CisgICAgICAgIGlmKCBhdHRyaWIgPj0gQkFDS0dST1VORF9HUkVFTiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGF0dHJpYiAtPSBCQUNLR1JPVU5EX0dSRUVOOworICAgICAgICAgICAgaWYoIGF0dHJpYiA+PSBCQUNLR1JPVU5EX0JMVUUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF0dHJpYiAtPSBCQUNLR1JPVU5EX0JMVUU7CisgICAgICAgICAgICAgICAgYmFja2NvbG9yID0gNDc7IC8qIFdoaXRlIGJhY2tncm91bmQgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBiYWNrY29sb3IgPSA0MzsgLyogWWVsbG93IGJhY2tncm91bmQgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCBhdHRyaWIgPj0gQkFDS0dST1VORF9CTFVFICkKKyAgICAgICAgeworICAgICAgICAgICAgYXR0cmliIC09IEJBQ0tHUk9VTkRfQkxVRTsKKyAgICAgICAgICAgIGJhY2tjb2xvciA9IDQ1OyAvKiBNYWdlbnRhIGJhY2tncm91bmQgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBiYWNrY29sb3IgPSA0MTsgLyogUmVkIEJhY2tncm91bmQgKi8KKyAgICB9CisgICAgZWxzZSBpZiggYXR0cmliID49IEJBQ0tHUk9VTkRfR1JFRU4gKQorICAgIHsKKyAgICAgICAgYXR0cmliIC09IEJBQ0tHUk9VTkRfR1JFRU47CisgICAgICAgIGlmKCBhdHRyaWIgPj0gQkFDS0dST1VORF9CTFVFICkKKyAgICAgICAgeworICAgICAgICAgICAgYXR0cmliIC09IEJBQ0tHUk9VTkRfQkxVRTsKKyAgICAgICAgICAgIGJhY2tjb2xvciA9IDQ2OyAvKiBDeWFuIGJhY2tncm91bmQgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBiYWNrY29sb3IgPSA0MjsgLyogR3JlZW4gYmFja2dyb3VuZCAqLworICAgIH0KKyAgICBlbHNlIGlmKCBhdHRyaWIgPj0gQkFDS0dST1VORF9CTFVFICkKKyAgICB7CisgICAgICAgIGF0dHJpYiAtPSBCQUNLR1JPVU5EX0JMVUU7CisgICAgICAgIGJhY2tjb2xvciA9IDQ0OyAvKiBCbHVlIGJhY2tncm91bmQgKi8KKyAgICB9CisgICAgZWxzZQorICAgICAgICBiYWNrY29sb3IgPSA0MDsgLyogQmxhY2sgYmFja2dyb3VuZCAqLworICAgIGlmKCBhdHRyaWIgPj0gRk9SRUdST1VORF9JTlRFTlNJVFkgKQorICAgIHsKKyAgICAgICAgYXR0cmliIC09IEZPUkVHUk9VTkRfSU5URU5TSVRZOworICAgICAgICBib2xkdGV4dCA9IDE7ICAgLyogQm9sZCBhdHRyaWJ1dGUgaXMgb24gKi8KKyAgICB9CisgICAgaWYoIGF0dHJpYiA+PSBGT1JFR1JPVU5EX1JFRCApCisgICAgeworICAgICAgICBhdHRyaWIgLT0gRk9SRUdST1VORF9SRUQ7CisgICAgICAgIGlmKCBhdHRyaWIgPj0gRk9SRUdST1VORF9HUkVFTiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGF0dHJpYiAtPSBGT1JFR1JPVU5EX0dSRUVOOworICAgICAgICAgICAgaWYoIGF0dHJpYiA+PSBGT1JFR1JPVU5EX0JMVUUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF0dHJpYiAtPSBGT1JFR1JPVU5EX0JMVUU7CisgICAgICAgICAgICAgICAgZm9yZWNvbG9yID0gMzc7IC8qIFdoaXRlIGZvcmVncm91bmQgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBmb3JlY29sb3IgPSAzMzsgLyogWWVsbG93IGZvcmVncm91bmQgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCBhdHRyaWIgPj0gRk9SRUdST1VORF9CTFVFICkKKyAgICAgICAgeworICAgICAgICAgICAgYXR0cmliIC09IEZPUkVHUk9VTkRfQkxVRTsKKyAgICAgICAgICAgIGZvcmVjb2xvciA9IDM1OyAvKiBNYWdlbnRhIGZvcmVncm91bmQgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBmb3JlY29sb3IgPSAzMTsgLyogUmVkIGZvcmVncm91bmQgKi8KKyAgICB9CisgICAgZWxzZSBpZiggYXR0cmliID49IEZPUkVHUk9VTkRfR1JFRU4gKQorICAgIHsKKyAgICAgICAgYXR0cmliIC09IEZPUkVHUk9VTkRfR1JFRU47CisgICAgICAgIGlmKCBhdHRyaWIgPj0gRk9SRUdST1VORF9CTFVFICkKKyAgICAgICAgeworICAgICAgICAgICAgYXR0cmliIC09IEZPUkVHUk9VTkRfQkxVRTsKKyAgICAgICAgICAgIGZvcmVjb2xvciA9IDM2OyAvKiBDeWFuIGZvcmVncm91bmQgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBmb3JlY29sb3IgPSAzMjsgLyogR3JlZW4gZm9yZWdyb3VuZCAqLworICAgIH0KKyAgICBlbHNlIGlmKCBhdHRyaWIgPj0gRk9SRUdST1VORF9CTFVFICkKKyAgICB7CisgICAgICAgIGF0dHJpYiAtPSBGT1JFR1JPVU5EX0JMVUU7CisgICAgICAgIGZvcmVjb2xvciA9IDM0OyAvKiBCbHVlIGZvcmVncm91bmQgKi8KKyAgICB9CisgICAgZWxzZQorICAgICAgICBmb3JlY29sb3IgPSAzMDsgLyogQmxhY2sgZm9yZWdyb3VuZCAqLworCisgICAgZnByaW50ZihzdGRvdXQsIiVjWyVkOyVkOyVkbSIsMHgxQixib2xkdGV4dCxmb3JlY29sb3IsYmFja2NvbG9yKTsKICAgICByZXR1cm4gVFJVRTsKIH0KIApAQCAtOTU4LDE3ICsxMDQ1LDMwIEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEZpbGxDb25zb2xlT3V0cHV0Q2hhcmFjdGVyQSBbS0VSTkVMMzIuMjQyXQorICoKKyAqIFBBUkFNUworICogICAgaENvbnNvbGVPdXRwdXQgICAgW0ldIEhhbmRsZSB0byBzY3JlZW4gYnVmZmVyCisgKiAgICBjQ2hhcmFjdGVyICAgICAgICBbSV0gQ2hhcmFjdGVyIHRvIHdyaXRlCisgKiAgICBuTGVuZ3RoICAgICAgICAgICBbSV0gTnVtYmVyIG9mIGNlbGxzIHRvIHdyaXRlIHRvCisgKiAgICBkd0Nvb3JkICAgICAgICAgICBbSV0gQ29vcmRzIG9mIGZpcnN0IGNlbGwKKyAqICAgIGxwTnVtQ2hhcnNXcml0dGVuIFtPXSBQb2ludGVyIHRvIG51bWJlciBvZiBjZWxscyB3cml0dGVuCisgKgorICogUkVUVVJOUworICogICAgU3VjY2VzczogVFJVRQorICogICAgRmFpbHVyZTogRkFMU0UKICAqLwogQk9PTDMyIFdJTkFQSSBGaWxsQ29uc29sZU91dHB1dENoYXJhY3RlckEoCiAgICAgSEFORExFMzIgaENvbnNvbGVPdXRwdXQsCi0gICAgQ0hBUiBjQ2hhcmFjdGVyLAorICAgIEJZVEUgY0NoYXJhY3RlciwKICAgICBEV09SRCBuTGVuZ3RoLAotICAgIENPT1JEIGR3V3JpdGVDb29yZCwKLSAgICBMUERXT1JEIGxwTnVtYmVyT2ZDaGFyc1dyaXR0ZW4pCisgICAgQ09PUkQgZHdDb29yZCwKKyAgICBMUERXT1JEIGxwTnVtQ2hhcnNXcml0dGVuKQogewotICAgIEZJWE1FKGNvbnNvbGUsICIoJWQsJWMsJWxkLCVkeCVkLCVwKTogc3R1YlxuIiwgaENvbnNvbGVPdXRwdXQsY0NoYXJhY3RlciwKLSAgICAgICAgICBuTGVuZ3RoLGR3V3JpdGVDb29yZC54LGR3V3JpdGVDb29yZC55LGxwTnVtYmVyT2ZDaGFyc1dyaXR0ZW4pOwotICAgICpscE51bWJlck9mQ2hhcnNXcml0dGVuID0gMDsKKyAgICBsb25nIGNvdW50OworICAgIFNldENvbnNvbGVDdXJzb3JQb3NpdGlvbihoQ29uc29sZU91dHB1dCxkd0Nvb3JkKTsKKyAgICBmb3IoY291bnQ9MDtjb3VudDxuTGVuZ3RoO2NvdW50KyspCisgICAgICAgIHB1dGMoY0NoYXJhY3RlcixzdGRvdXQpOworICAgICpscE51bUNoYXJzV3JpdHRlbiA9IG5MZW5ndGg7CiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKQEAgLTk4NywxNCArMTA4NywxNyBAQAogICogICAgU3VjY2VzczogVFJVRQogICogICAgRmFpbHVyZTogRkFMU0UKICAqLwotQk9PTDMyIFdJTkFQSSBGaWxsQ29uc29sZU91dHB1dENoYXJhY3RlclcoIEhBTkRMRTMyIGhDb25zb2xlT3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdDSEFSIGNDaGFyYWN0ZXIsIERXT1JEIG5MZW5ndGgsCitCT09MMzIgV0lOQVBJIEZpbGxDb25zb2xlT3V0cHV0Q2hhcmFjdGVyVyhIQU5ETEUzMiBoQ29uc29sZU91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0NIQVIgY0NoYXJhY3RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgbkxlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT09SRCBkd0Nvb3JkLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUERXT1JEIGxwTnVtQ2hhcnNXcml0dGVuICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEV09SRCBscE51bUNoYXJzV3JpdHRlbikKIHsKLSAgICBGSVhNRShjb25zb2xlLCAiKCVkLCVjLCVsZCwlZHglZCwlcCk6IHN0dWJcbiIsIGhDb25zb2xlT3V0cHV0LAotICAgICAgICAgIGNDaGFyYWN0ZXIsbkxlbmd0aCxkd0Nvb3JkLngsZHdDb29yZC55LGxwTnVtQ2hhcnNXcml0dGVuKTsKLSAgICAqbHBOdW1DaGFyc1dyaXR0ZW4gPSAwOworICAgIGxvbmcgY291bnQ7CisgICAgU2V0Q29uc29sZUN1cnNvclBvc2l0aW9uKGhDb25zb2xlT3V0cHV0LGR3Q29vcmQpOworICAgIGZvcihjb3VudD0wO2NvdW50PG5MZW5ndGg7Y291bnQrKykKKyAgICAgICAgcHV0YyhjQ2hhcmFjdGVyLHN0ZG91dCk7CisgICAgKmxwTnVtQ2hhcnNXcml0dGVuID0gbkxlbmd0aDsKICAgICByZXR1cm4gVFJVRTsKIH0KIApkaWZmIC0tZ2l0IGEvd2luMzIva2VybmVsMzIuYyBiL3dpbjMyL2tlcm5lbDMyLmMKaW5kZXggNWI2NzE3OS4uMTMzZDZhMCAxMDA2NDQKLS0tIGEvd2luMzIva2VybmVsMzIuYworKysgYi93aW4zMi9rZXJuZWwzMi5jCkBAIC03NSw4MSArNzUsMzA3IEBACiAJLyogc2hvdWxkIGZpbGwgdGhlIHJlc3Qgb2YgdGhlIDMyIGJ5dGVzIHdpdGggMHhDQyAqLwogfQogCi1zdHJ1Y3QgdGh1bmtzdHJ1Y3QKLXsKLQljaGFyCW1hZ2ljWzRdOwotCURXT1JECWxlbmd0aDsKLQlEV09SRAlwdHI7Ci0JRFdPUkQJeDBDOwogCi0JRFdPUkQJeDEwOwotCURXT1JECXgxNDsKLQlEV09SRAl4MTg7Ci0JRFdPUkQJeDFDOwotCURXT1JECXgyMDsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVGh1bmtDb25uZWN0IGRhdGEgc3RydWN0dXJlcworICovCisKK3N0cnVjdCBUaHVua0RhdGFDb21tb24KK3sKKyAgICBjaGFyICAgICAgICAgICAgICAgICAgIG1hZ2ljWzRdOyAgICAgICAgIC8qIDAwICovCisgICAgRFdPUkQgICAgICAgICAgICAgICAgICBjaGVja3N1bTsgICAgICAgICAvKiAwNCAqLwogfTsKIAorc3RydWN0IFRodW5rRGF0YUxTMTYKK3sKKyAgICBzdHJ1Y3QgVGh1bmtEYXRhQ29tbW9uIGNvbW1vbjsgICAgICAgICAgIC8qIDAwICovCisgICAgU0VHUFRSICAgICAgICAgICAgICAgICB0YXJnZXRUYWJsZTsgICAgICAvKiAwOCAqLworICAgIERXT1JEICAgICAgICAgICAgICAgICAgZmlyc3RUaW1lOyAgICAgICAgLyogMEMgKi8KK307CisKK3N0cnVjdCBUaHVua0RhdGFMUzMyCit7CisgICAgc3RydWN0IFRodW5rRGF0YUNvbW1vbiBjb21tb247ICAgICAgICAgICAvKiAwMCAqLworICAgIERXT1JEICogICAgICAgICAgICAgICAgdGFyZ2V0VGFibGU7ICAgICAgLyogMDggKi8KKyAgICBjaGFyICAgICAgICAgICAgICAgICAgIGxhdGVCaW5kaW5nWzRdOyAgIC8qIDBDICovCisgICAgRFdPUkQgICAgICAgICAgICAgICAgICBmbGFnczsgICAgICAgICAgICAvKiAxMCAqLworICAgIERXT1JEICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQxOyAgICAgICAgLyogMTQgKi8KKyAgICBEV09SRCAgICAgICAgICAgICAgICAgIHJlc2VydmVkMjsgICAgICAgIC8qIDE4ICovCisgICAgRFdPUkQgICAgICAgICAgICAgICAgICBvZmZzZXRRVFRodW5rOyAgICAvKiAxQyAqLworICAgIERXT1JEICAgICAgICAgICAgICAgICAgb2Zmc2V0RlRQcm9sb2c7ICAgLyogMjAgKi8KK307CisKK3N0cnVjdCBUaHVua0RhdGFTTDE2Cit7CisgICAgc3RydWN0IFRodW5rRGF0YUNvbW1vbiBjb21tb247ICAgICAgICAgICAgLyogMDAgKi8KKyAgICBEV09SRCAgICAgICAgICAgICAgICAgIGZsYWdzMTsgICAgICAgICAgICAvKiAwOCAqLworICAgIERXT1JEICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQxOyAgICAgICAgIC8qIDBDICovCisgICAgc3RydWN0IFRodW5rRGF0YVNMICogICBmcERhdGE7ICAgICAgICAgICAgLyogMTAgKi8KKyAgICBTRUdQVFIgICAgICAgICAgICAgICAgIHNwRGF0YTsgICAgICAgICAgICAvKiAxNCAqLworICAgIERXT1JEICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQyOyAgICAgICAgIC8qIDE4ICovCisgICAgY2hhciAgICAgICAgICAgICAgICAgICBsYXRlQmluZGluZ1s0XTsgICAgLyogMUMgKi8KKyAgICBEV09SRCAgICAgICAgICAgICAgICAgIGZsYWdzMjsgICAgICAgICAgICAvKiAyMCAqLworICAgIERXT1JEICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQzOyAgICAgICAgIC8qIDIwICovCisgICAgU0VHUFRSICAgICAgICAgICAgICAgICBhcGlEYXRhYmFzZTsgICAgICAgLyogMjggKi8KK307CisKK3N0cnVjdCBUaHVua0RhdGFTTDMyCit7CisgICAgc3RydWN0IFRodW5rRGF0YUNvbW1vbiBjb21tb247ICAgICAgICAgICAgLyogMDAgKi8KKyAgICBEV09SRCAgICAgICAgICAgICAgICAgIHJlc2VydmVkMTsgICAgICAgICAvKiAwOCAqLworICAgIHN0cnVjdCBUaHVua0RhdGFTTCAqICAgZGF0YTsgICAgICAgICAgICAgIC8qIDBDICovCisgICAgY2hhciAgICAgICAgICAgICAgICAgICBsYXRlQmluZGluZ1s0XTsgICAgLyogMTAgKi8KKyAgICBEV09SRCAgICAgICAgICAgICAgICAgIGZsYWdzOyAgICAgICAgICAgICAvKiAxNCAqLworICAgIERXT1JEICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQyOyAgICAgICAgIC8qIDE4ICovCisgICAgRFdPUkQgICAgICAgICAgICAgICAgICByZXNlcnZlZDM7ICAgICAgICAgLyogMUMgKi8KKyAgICBEV09SRCAgICAgICAgICAgICAgICAgIG9mZnNldFRhcmdldFRhYmxlOyAvKiAyMCAqLworfTsKKworc3RydWN0IFRodW5rRGF0YVNMCit7CisjaWYgMAorICAgIFRoaXMgc3RydWN0dXJlIGRpZmZlcnMgZnJvbSB0aGUgV2luOTUgb3JpZ2luYWwsCisgICAgYnV0IHRoaXMgc2hvdWxkIG5vdCBtYXR0ZXIgc2luY2UgaXQgaXMgc3RyaWN0bHkgaW50ZXJuYWwgdG8gCisgICAgdGhlIHRodW5rIGhhbmRsaW5nIHJvdXRpbmVzIGluIEtSTkwzODYgLyBLRVJORUwzMi4KKworICAgIEZvciByZWZlcmVuY2UsIGhlcmUgaXMgdGhlIFdpbjk1IGxheW91dDoKKworICAgIHN0cnVjdCBUaHVua0RhdGFDb21tb24gY29tbW9uOyAgICAgICAgICAgIC8qIDAwICovCisgICAgRFdPUkQgICAgICAgICAgICAgICAgICBmbGFnczE7ICAgICAgICAgICAgLyogMDggKi8KKyAgICBTRUdQVFIgICAgICAgICAgICAgICAgIGFwaURhdGFiYXNlOyAgICAgICAvKiAwQyAqLworICAgIFdPUkQgICAgICAgICAgICAgICAgICAgZXhlUHRyOyAgICAgICAgICAgIC8qIDEwICovCisgICAgV09SRCAgICAgICAgICAgICAgICAgICBzZWdNQkE7ICAgICAgICAgICAgLyogMTIgKi8KKyAgICBEV09SRCAgICAgICAgICAgICAgICAgIGxlbk1CQVRvdGFsOyAgICAgICAvKiAxNCAqLworICAgIERXT1JEICAgICAgICAgICAgICAgICAgbGVuTUJBVXNlZDsgICAgICAgIC8qIDE4ICovCisgICAgRFdPUkQgICAgICAgICAgICAgICAgICBmbGFnczI7ICAgICAgICAgICAgLyogMUMgKi8KKyAgICBjaGFyICAgICAgICAgICAgICAgICAgIHBzekRsbDE2WzI1Nl07ICAgICAvKiAyMCAqLworICAgIGNoYXIgICAgICAgICAgICAgICAgICAgcHN6RGxsMzJbMjU2XTsgICAgIC8qMTIwICovCisgIAorICAgIFdlIGRvIGl0IGRpZmZlcmVudGx5IHNpbmNlIGFsbCBvdXIgdGh1bmsgaGFuZGxpbmcgaXMgZG9uZQorICAgIGJ5IDMyLWJpdCBjb2RlLiBUaGVyZWZvcmUgd2UgZG8gbm90IG5lZWQgZG8gcHJvdmlkZQorICAgIGVhc3kgYWNjZXNzIHRvIHRoaXMgZGF0YSwgZXNwZWNpYWxseSB0aGUgcHJvY2VzcyB0YXJnZXQKKyAgICB0YWJsZSBkYXRhYmFzZSwgZm9yIDE2LWJpdCBjb2RlLgorI2VuZGlmCisgICAgCisgICAgc3RydWN0IFRodW5rRGF0YUNvbW1vbiBjb21tb247CisgICAgRFdPUkQgICAgICAgICAgICAgICAgICBmbGFnczE7CisgICAgc3RydWN0IFNMQXBpREIgKiAgICAgICBhcGlEQjsKKyAgICBzdHJ1Y3QgU0xUYXJnZXREQiAqICAgIHRhcmdldERCOworICAgIERXT1JEICAgICAgICAgICAgICAgICAgZmxhZ3MyOworICAgIGNoYXIgICAgICAgICAgICAgICAgICAgcHN6RGxsMTZbMjU2XTsKKyAgICBjaGFyICAgICAgICAgICAgICAgICAgIHBzekRsbDMyWzI1Nl07Cit9OworCitzdHJ1Y3QgU0xUYXJnZXREQgoreworICAgICBzdHJ1Y3QgU0xUYXJnZXREQiAqICAgbmV4dDsKKyAgICAgUERCMzIgKiAgICAgICAgICAgICAgIHByb2Nlc3M7CisgICAgIERXT1JEICogICAgICAgICAgICAgICB0YXJnZXRUYWJsZTsKK307CisKK3N0cnVjdCBTTEFwaURCCit7CisgICAgRFdPUkQgICAgICAgICAgICAgICAgICBuckFyZ0J5dGVzOworICAgIERXT1JEICAgICAgICAgICAgICAgICAgZXJyb3JSZXR1cm5WYWx1ZTsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEdldFRodW5rU3R1ZmYgICAgKEtFUk5FTDMyLjUzKQorICovCitMUFZPSUQgV0lOQVBJIEdldFRodW5rU3R1ZmYoTFBTVFIgbW9kdWxlLCBMUFNUUiBmdW5jKQoreworICAgIEhNT0RVTEUzMiBobW9kID0gTG9hZExpYnJhcnkxNihtb2R1bGUpOworICAgIGlmIChobW9kIDw9IDMyKSByZXR1cm4gMDsKKworICAgIHJldHVybiBQVFJfU0VHX1RPX0xJTihXSU4zMl9HZXRQcm9jQWRkcmVzczE2KGhtb2QsIGZ1bmMpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgR2V0VGh1bmtCdWZmICAgIChLRVJORUwzMi41MikKKyAqIFJldHVybnMgYSBwb2ludGVyIHRvIFRoa0J1ZiBpbiB0aGUgMTZiaXQgbGlicmFyeSBTWVNUSFVOSy5ETEwuCisgKi8KK0xQVk9JRCBXSU5BUEkgR2V0VGh1bmtCdWZmKHZvaWQpCit7CisgICAgcmV0dXJuIEdldFRodW5rU3R1ZmYoIlNZU1RIVU5LLkRMTCIsICJUaGtCdWYiKTsKK30KKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkJVGh1bmtDb25uZWN0MzIJCShLRVJORUwzMikKICAqIENvbm5lY3RzIGEgMzJiaXQgYW5kIGEgMTZiaXQgdGh1bmtidWZmZXIuCiAgKi8KIFVJTlQzMiBXSU5BUEkgVGh1bmtDb25uZWN0MzIoIAotCXN0cnVjdCB0aHVua3N0cnVjdCAqdGhzLAkvKiBbaW4vb3V0XSB0aHVua2J1ZmZlciAqLwotCUxQQ1NUUiB0aHVua2Z1bjE2LAkJLyogW2luXSB3aW4xNiB0aHVua2Z1bmN0aW9uICovCi0JTFBDU1RSIG1vZHVsZTE2LAkJLyogW2luXSBuYW1lIG9mIHdpbjE2IGRsbCAqLwotCUxQQ1NUUiBtb2R1bGUzMiwJCS8qIFtpbl0gbmFtZSBvZiB3aW4zMiBkbGwgKi8KLQlITU9EVUxFMzIgaG1vZDMyLAkJLyogW2luXSBobW9kdWxlIG9mIHdpbjMyIGRsbCAodXNlZD8pICovCi0JRFdPUkQgZGxsaW5pdGFyZzEJCS8qIFtpbl0gaW5pdGlhbGlzYXRpb24gYXJndW1lbnQgKi8KKwlzdHJ1Y3QgVGh1bmtEYXRhQ29tbW9uICpURCwgIC8qIFtpbi9vdXRdIHRodW5rYnVmZmVyICovCisJTFBTVFIgdGh1bmtmdW4xNiwgICAgICAgICAgICAvKiBbaW5dIHdpbjE2IHRodW5rZnVuY3Rpb24gKi8KKwlMUFNUUiBtb2R1bGUxNiwgICAgICAgICAgICAgIC8qIFtpbl0gbmFtZSBvZiB3aW4xNiBkbGwgKi8KKwlMUFNUUiBtb2R1bGUzMiwgICAgICAgICAgICAgIC8qIFtpbl0gbmFtZSBvZiB3aW4zMiBkbGwgKi8KKwlITU9EVUxFMzIgaG1vZDMyLCAgICAgICAgICAgIC8qIFtpbl0gaG1vZHVsZSBvZiB3aW4zMiBkbGwgKi8KKwlEV09SRCBkd1JlYXNvbiAgICAgICAgICAgICAgIC8qIFtpbl0gaW5pdGlhbGlzYXRpb24gYXJndW1lbnQgKi8KICkgewotCUhJTlNUQU5DRTE2CWhtbTsKLQlTRUdQVFIJCXRoa2J1ZjsKLQlzdHJ1Y3QJdGh1bmtzdHJ1Y3QJKnRoczE2OworICAgIEJPT0wzMiBkaXJlY3Rpb25TTDsKIAotCVRSQUNFKHRodW5rLCIoPHN0cnVjdD4sJXMsJXMsJXMsJXgsJWx4KVxuIiwKLQkJdGh1bmtmdW4xNixtb2R1bGUzMixtb2R1bGUxNixobW9kMzIsZGxsaW5pdGFyZzEKLQkpOwotCVRSQUNFKHRodW5rLCIJbWFnaWMgPSAlYyVjJWMlY1xuIiwKLQkJdGhzLT5tYWdpY1swXSwKLQkJdGhzLT5tYWdpY1sxXSwKLQkJdGhzLT5tYWdpY1syXSwKLQkJdGhzLT5tYWdpY1szXQotCSk7Ci0JVFJBQ0UodGh1bmssIglsZW5ndGggPSAlbHhcbiIsdGhzLT5sZW5ndGgpOwotCWlmIChsc3RybmNtcDMyQSh0aHMtPm1hZ2ljLCJTTDAxIiw0KSYmbHN0cm5jbXAzMkEodGhzLT5tYWdpYywiTFMwMSIsNCkpCi0JCXJldHVybiAwOwotCWhtbT1Mb2FkTW9kdWxlMTYobW9kdWxlMTYsTlVMTCk7Ci0JaWYgKGhtbTw9MzIpCi0JCXJldHVybiAwOwotCXRoa2J1Zj0oU0VHUFRSKVdJTjMyX0dldFByb2NBZGRyZXNzMTYoaG1tLHRodW5rZnVuMTYpOwotCWlmICghdGhrYnVmKQotCQlyZXR1cm4gMDsKLQl0aHMxNj0oc3RydWN0IHRodW5rc3RydWN0KilQVFJfU0VHX1RPX0xJTih0aGtidWYpOwotCWlmIChsc3RybmNtcDMyQSh0aHMxNi0+bWFnaWMsdGhzLT5tYWdpYyw0KSkKLQkJcmV0dXJuIDA7CisgICAgaWYgKCFsc3RybmNtcDMyQShURC0+bWFnaWMsICJTTDAxIiwgNCkpCisgICAgeworICAgICAgICBkaXJlY3Rpb25TTCA9IFRSVUU7CiAKLQlpZiAoIWxzdHJuY21wMzJBKHRocy0+bWFnaWMsIlNMMDEiLDQpKSAgewotCQlpZiAodGhzMTYtPmxlbmd0aCAhPSB0aHMtPmxlbmd0aCkKLQkJCXJldHVybiAwOwotCQl0aHMtPngwQyA9IChEV09SRCl0aHMxNjsKKyAgICAgICAgVFJBQ0UodGh1bmssICJTTDAxIHRodW5rICVzICglbHgpIDwtICVzICglcyksIFJlYXNvbjogJWxkXG4iLAorICAgICAgICAgICAgICAgICAgICAgbW9kdWxlMzIsIChEV09SRClURCwgbW9kdWxlMTYsIHRodW5rZnVuMTYsIGR3UmVhc29uKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIWxzdHJuY21wMzJBKFRELT5tYWdpYywgIkxTMDEiLCA0KSkKKyAgICB7CisgICAgICAgIGRpcmVjdGlvblNMID0gRkFMU0U7CiAKLQkJVFJBQ0UodGh1bmssIgl0aHMxNiBtYWdpYyBpcyAweCUwOGx4XG4iLCooRFdPUkQqKXRoczE2LT5tYWdpYyk7Ci0JCWlmICgqKChEV09SRCopdGhzMTYtPm1hZ2ljKSAhPSAweDAwMDAzMDRDKQotCQkJcmV0dXJuIDA7Ci0JCWlmICghKihXT1JEKikoKChMUEJZVEUpdGhzMTYpKzB4MTIpKQotCQkJcmV0dXJuIDA7Ci0JCQotCX0KLQlpZiAoIWxzdHJuY21wMzJBKHRocy0+bWFnaWMsIkxTMDEiLDQpKSAgewotCQlpZiAodGhzMTYtPmxlbmd0aCAhPSB0aHMtPmxlbmd0aCkKLQkJCXJldHVybiAwOwotCQl0aHMtPnB0ciA9IChEV09SRClQVFJfU0VHX1RPX0xJTih0aHMxNi0+cHRyKTsKLQkJLyogY29kZSBvZmZzZXQgZm9yIFFUX1RodW5rIGlzIGF0IDB4MUMuLi4gICovCi0JCV93cml0ZV9xdHRodW5rICgoKExQQllURSl0aHMpICsgdGhzLT54MUMsKERXT1JEICopdGhzLT5wdHIpOwotCQkvKiBjb2RlIG9mZnNldCBmb3IgRlRfUHJvbG9nIGlzIGF0IDB4MjAuLi4gICovCi0JCV93cml0ZV9mdHByb2xvZygoKExQQllURSl0aHMpICsgdGhzLT54MjAsKERXT1JEICopdGhzLT5wdHIpOwotCQlyZXR1cm4gMTsKLQl9Ci0JcmV0dXJuIFRSVUU7CisgICAgICAgIFRSQUNFKHRodW5rLCAiTFMwMSB0aHVuayAlcyAoJWx4KSAtPiAlcyAoJXMpLCBSZWFzb246ICVsZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgIG1vZHVsZTMyLCAoRFdPUkQpVEQsIG1vZHVsZTE2LCB0aHVua2Z1bjE2LCBkd1JlYXNvbik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEVSUih0aHVuaywgIkludmFsaWQgbWFnaWMgJWMlYyVjJWNcbiIsIAorICAgICAgICAgICAgICAgICAgIFRELT5tYWdpY1swXSwgVEQtPm1hZ2ljWzFdLCBURC0+bWFnaWNbMl0sIFRELT5tYWdpY1szXSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAKKyAgICBzd2l0Y2ggKGR3UmVhc29uKQorICAgIHsKKyAgICAgICAgY2FzZSBETExfUFJPQ0VTU19BVFRBQ0g6CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cnVjdCBUaHVua0RhdGFDb21tb24gKlREMTYgPSBHZXRUaHVua1N0dWZmKG1vZHVsZTE2LCB0aHVua2Z1bjE2KTsKKyAgICAgICAgICAgIGlmICghVEQxNiB8fCBURDE2LT5jaGVja3N1bSAhPSBURC0+Y2hlY2tzdW0KKyAgICAgICAgICAgICAgICAgICAgICB8fCBtZW1jbXAoVEQxNi0+bWFnaWMsIFRELT5tYWdpYywgNCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRVJSKHRodW5rLCAiUHJvYmxlbSBsb2FkaW5nIDE2LWJpdCB0aHVuayBidWZmZXIhXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGRpcmVjdGlvblNMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cnVjdCBUaHVua0RhdGFTTDMyICpTTDMyID0gKHN0cnVjdCBUaHVua0RhdGFTTDMyICopVEQ7CisgICAgICAgICAgICAgICAgc3RydWN0IFRodW5rRGF0YVNMMTYgKlNMMTYgPSAoc3RydWN0IFRodW5rRGF0YVNMMTYgKilURDE2OworICAgICAgICAgICAgICAgIHN0cnVjdCBTTFRhcmdldERCICp0ZGI7CisKKyAgICAgICAgICAgICAgICBpZiAoU0wxNi0+ZnBEYXRhID09IE5VTEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBFUlIodGh1bmssICJUaHVua0Nvbm5lY3QxNiB3YXMgbm90IGNhbGxlZCFcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBTTDMyLT5kYXRhID0gU0wxNi0+ZnBEYXRhOworCisgICAgICAgICAgICAgICAgdGRiID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIHNpemVvZigqdGRiKSk7CisgICAgICAgICAgICAgICAgdGRiLT5wcm9jZXNzID0gUFJPQ0VTU19DdXJyZW50KCk7CisgICAgICAgICAgICAgICAgdGRiLT50YXJnZXRUYWJsZSA9IChEV09SRCAqKSh0aHVua2Z1bjE2ICsgU0wzMi0+b2Zmc2V0VGFyZ2V0VGFibGUpOworCisgICAgICAgICAgICAgICAgdGRiLT5uZXh0ID0gU0wzMi0+ZGF0YS0+dGFyZ2V0REI7ICAgLyogRklYTUU6IG5vdCB0aHJlYWQtc2FmZSEgKi8KKyAgICAgICAgICAgICAgICBTTDMyLT5kYXRhLT50YXJnZXREQiA9IHRkYjsKKworICAgICAgICAgICAgICAgIFRSQUNFKHRodW5rLCAiUHJvY2VzcyAlMDhseCBhbGxvY2F0ZWQgVGFyZ2V0REIgZW50cnkgZm9yIFRodW5rRGF0YVNMICUwOGx4XG4iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKERXT1JEKVBST0NFU1NfQ3VycmVudCgpLCAoRFdPUkQpU0wzMi0+ZGF0YSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RydWN0IFRodW5rRGF0YUxTMzIgKkxTMzIgPSAoc3RydWN0IFRodW5rRGF0YUxTMzIgKilURDsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgVGh1bmtEYXRhTFMxNiAqTFMxNiA9IChzdHJ1Y3QgVGh1bmtEYXRhTFMxNiAqKVREMTY7CisKKyAgICAgICAgICAgICAgICBMUzMyLT50YXJnZXRUYWJsZSA9IFBUUl9TRUdfVE9fTElOKExTMTYtPnRhcmdldFRhYmxlKTsKKworICAgICAgICAgICAgICAgIC8qIHdyaXRlIFFUX1RodW5rIGFuZCBGVF9Qcm9sb2cgc3R1YnMgKi8KKyAgICAgICAgICAgICAgICBfd3JpdGVfcXR0aHVuayAoKExQQllURSlURCArIExTMzItPm9mZnNldFFUVGh1bmssICBMUzMyLT50YXJnZXRUYWJsZSk7CisgICAgICAgICAgICAgICAgX3dyaXRlX2Z0cHJvbG9nKChMUEJZVEUpVEQgKyBMUzMyLT5vZmZzZXRGVFByb2xvZywgTFMzMi0+dGFyZ2V0VGFibGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIERMTF9QUk9DRVNTX0RFVEFDSDoKKyAgICAgICAgICAgIC8qIEZJWE1FOiBjbGVhbnVwICovCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gMTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJVGh1bmtDb25uZWN0MTYJCShLRVJORUwuNjUxKQorICogQ29ubmVjdHMgYSAzMmJpdCBhbmQgYSAxNmJpdCB0aHVua2J1ZmZlci4KKyAqLworVUlOVDMyIFdJTkFQSSBUaHVua0Nvbm5lY3QxNiggCisJTFBTVFIgbW9kdWxlMTYsICAgICAgICAgICAgICAvKiBbaW5dIG5hbWUgb2Ygd2luMTYgZGxsICovCisJTFBTVFIgbW9kdWxlMzIsICAgICAgICAgICAgICAvKiBbaW5dIG5hbWUgb2Ygd2luMzIgZGxsICovCisJSElOU1RBTkNFMTYgaEluc3QxNiwgICAgICAgICAvKiBbaW5dIGhJbnN0IG9mIHdpbjE2IGRsbCAqLworCURXT1JEIGR3UmVhc29uLCAgICAgICAgICAgICAgLyogW2luXSBpbml0aWFsaXNhdGlvbiBhcmd1bWVudCAqLworCXN0cnVjdCBUaHVua0RhdGFDb21tb24gKlRELCAgLyogW2luL291dF0gdGh1bmtidWZmZXIgKi8KKwlMUFNUUiB0aHVua2Z1bjMyLCAgICAgICAgICAgIC8qIFtpbl0gd2luMzIgdGh1bmtmdW5jdGlvbiAqLworICAgICAgICBXT1JEIENTICAgICAgICAgICAgICAgICAgICAgIC8qIFtpbl0gQ1Mgb2Ygd2luMTYgZGxsICovCispIHsKKyAgICBCT09MMzIgZGlyZWN0aW9uU0w7CisKKyAgICBpZiAoIWxzdHJuY21wMzJBKFRELT5tYWdpYywgIlNMMDEiLCA0KSkKKyAgICB7CisgICAgICAgIGRpcmVjdGlvblNMID0gVFJVRTsKKworICAgICAgICBUUkFDRSh0aHVuaywgIlNMMDEgdGh1bmsgJXMgKCVseCkgLT4gJXMgKCVzKSwgUmVhc29uOiAlbGRcbiIsCisgICAgICAgICAgICAgICAgICAgICBtb2R1bGUxNiwgKERXT1JEKVRELCBtb2R1bGUzMiwgdGh1bmtmdW4zMiwgZHdSZWFzb24pOworICAgIH0KKyAgICBlbHNlIGlmICghbHN0cm5jbXAzMkEoVEQtPm1hZ2ljLCAiTFMwMSIsIDQpKQorICAgIHsKKyAgICAgICAgZGlyZWN0aW9uU0wgPSBGQUxTRTsKKworICAgICAgICBUUkFDRSh0aHVuaywgIkxTMDEgdGh1bmsgJXMgKCVseCkgPC0gJXMgKCVzKSwgUmVhc29uOiAlbGRcbiIsCisgICAgICAgICAgICAgICAgICAgICBtb2R1bGUxNiwgKERXT1JEKVRELCBtb2R1bGUzMiwgdGh1bmtmdW4zMiwgZHdSZWFzb24pOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBFUlIodGh1bmssICJJbnZhbGlkIG1hZ2ljICVjJWMlYyVjXG4iLCAKKyAgICAgICAgICAgICAgICAgICBURC0+bWFnaWNbMF0sIFRELT5tYWdpY1sxXSwgVEQtPm1hZ2ljWzJdLCBURC0+bWFnaWNbM10pOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgCisgICAgc3dpdGNoIChkd1JlYXNvbikKKyAgICB7CisgICAgICAgIGNhc2UgRExMX1BST0NFU1NfQVRUQUNIOgorICAgICAgICAgICAgaWYgKGRpcmVjdGlvblNMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cnVjdCBUaHVua0RhdGFTTDE2ICpTTDE2ID0gKHN0cnVjdCBUaHVua0RhdGFTTDE2ICopVEQ7CisgICAgICAgICAgICAgICAgc3RydWN0IFRodW5rRGF0YVNMICAgKlNMICAgPSBTTDE2LT5mcERhdGE7CisKKyAgICAgICAgICAgICAgICBpZiAoU0wgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFNMID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIHNpemVvZigqU0wpKTsKKworICAgICAgICAgICAgICAgICAgICBTTC0+Y29tbW9uICAgPSBTTDE2LT5jb21tb247CisgICAgICAgICAgICAgICAgICAgIFNMLT5mbGFnczEgICA9IFNMMTYtPmZsYWdzMTsKKyAgICAgICAgICAgICAgICAgICAgU0wtPmZsYWdzMiAgID0gU0wxNi0+ZmxhZ3MyOworCisgICAgICAgICAgICAgICAgICAgIFNMLT5hcGlEQiAgICA9IFBUUl9TRUdfVE9fTElOKFNMMTYtPmFwaURhdGFiYXNlKTsKKyAgICAgICAgICAgICAgICAgICAgU0wtPnRhcmdldERCID0gTlVMTDsKKworICAgICAgICAgICAgICAgICAgICBsc3RyY3B5bjMyQShTTC0+cHN6RGxsMTYsIG1vZHVsZTE2LCAyNTUpOworICAgICAgICAgICAgICAgICAgICBsc3RyY3B5bjMyQShTTC0+cHN6RGxsMzIsIG1vZHVsZTMyLCAyNTUpOworCisgICAgICAgICAgICAgICAgICAgIC8qIFdlIHNob3VsZCBjcmVhdGUgYSBTRUdQVFIgdG8gdGhlIFRodW5rRGF0YVNMLAorICAgICAgICAgICAgICAgICAgICAgICBidXQgc2luY2UgdGhlIGNvbnRlbnRzIGFyZSBub3QgaW4gdGhlIG9yaWdpbmFsIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgYW55IGFjY2VzcyB0byB0aGlzIGJ5IDE2LWJpdCBjb2RlIHdvdWxkIGNyYXNoIGFueXdheS4gKi8KKyAgICAgICAgICAgICAgICAgICAgU0wxNi0+c3BEYXRhID0gMDsKKyAgICAgICAgICAgICAgICAgICAgU0wxNi0+ZnBEYXRhID0gU0w7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICBpZiAoU0wtPmZsYWdzMiAmIDB4ODAwMDAwMDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBUUkFDRSh0aHVuaywgIlByZWxvYWRpbmcgMzItYml0IGxpYnJhcnlcbiIpOworICAgICAgICAgICAgICAgICAgICBMb2FkTGlicmFyeTMyQShtb2R1bGUzMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRExMX1BST0NFU1NfREVUQUNIOgorICAgICAgICAgICAgLyogRklYTUU6IGNsZWFudXAgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiAxOwogfQogCiAKQEAgLTM5NiwyMiArNjIyLDYgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgX0tFUk5FTDMyXzUyICAgIChLRVJORUwzMi41MikKLSAqIFJldHVybnMgYSBwb2ludGVyIHRvIFRoa0J1ZiBpbiB0aGUgMTZiaXQgbGlicmFyeSBTWVNUSFVOSy5ETEwuCi0gKiBbb2sgcHJvYmFibHldCi0gKi8KLUxQVk9JRCBXSU5BUEkgX0tFUk5FTDMyXzUyKCkKLXsKLQlITU9EVUxFMzIJaG1vZCA9IExvYWRMaWJyYXJ5MTYoInN5c3RodW5rLmRsbCIpOwotCi0JVFJBQ0UodGh1bmssICJzeXN0aHVuay5kbGwgbW9kdWxlICVkXG4iLCBobW9kKTsKLQkKLQlpZiAoaG1vZDw9MzIpCi0JCXJldHVybiAwOwotCXJldHVybiBQVFJfU0VHX1RPX0xJTihXSU4zMl9HZXRQcm9jQWRkcmVzczE2KGhtb2QsIlRoa0J1ZiIpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAJCVRodW5rSW5pdExTIAkoS0VSTkVMMzIuNDMpCiAgKiBBIHRodW5rYnVmZmVyIGxpbmsgcm91dGluZSAKICAqIFRoZSB0aHVua2J1ZiBsb29rcyBsaWtlOgpAQCAtNTMwLDQwICs3NDAsNTYgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAJCV9LRVJORUwzMl80MCAJKEtFUk5FTDMyLjQwKQotICogWUVUIEFub3RoZXIgMzItPjE2IHRodW5rLCB0aGUgZGlmZmVyZW5jZSB0byB0aGUgb3RoZXJzIGlzIHN0aWxsIG15c3RlcmlvdXMKLSAqIFRhcmdldCBhZGRyZXNzIGlzIGluIEVEWC4KKyAqCQlPVF8zMlRoa0xTRgkoS0VSTkVMMzIuNDApCiAgKgotICogW2NyYXNoZXNdCisgKiBZRVQgQW5vdGhlciAzMi0+MTYgdGh1bmsuIFRoZSBkaWZmZXJlbmNlIHRvIENvbW1vbjMyVGhrTFMgaXMgdGhhdAorICogYXJndW1lbnQgcHJvY2Vzc2luZyBpcyBkb25lIG9uIGJvdGggdGhlIDMyLWJpdCBhbmQgdGhlIDE2LWJpdCBzaWRlOgorICogVGhlIDMyLWJpdCBzaWRlIHByZXBhcmVzIGFyZ3VtZW50cywgY29weWluZyB0aGVtIG9udG8gdGhlIHN0YWNrLgorICogCisgKiBXaGVuIHRoaXMgcm91dGluZSBpcyBjYWxsZWQsIHRoZSBmaXJzdCB3b3JkIG9uIHRoZSBzdGFjayBpcyB0aGUgCisgKiBudW1iZXIgb2YgYXJndW1lbnQgYnl0ZXMgcHJlcGFyZWQgYnkgdGhlIDMyLWJpdCBjb2RlLCBhbmQgRURYCisgKiBjb250YWlucyB0aGUgMTYtYml0IHRhcmdldCBhZGRyZXNzLgorICoKKyAqIFRoZSBjYWxsZWQgMTYtYml0IHJvdXRpbmUgaXMgYW5vdGhlciByZWxheWNvZGUsIGRvaW5nIGZ1cnRoZXIgCisgKiBhcmd1bWVudCBwcm9jZXNzaW5nIGFuZCB0aGVuIGNhbGxpbmcgdGhlIHJlYWwgMTYtYml0IHRhcmdldAorICogd2hvc2UgYWRkcmVzcyBpcyBzdG9yZWQgYXQgW2JwLTA0XS4KKyAqCisgKiBUaGUgY2FsbCBwcm9jZWVkcyB1c2luZyBhIG5vcm1hbCBDYWxsUmVnaXN0ZXJTaG9ydFByb2MuCisgKiBBZnRlciByZXR1cm4gZnJvbSB0aGUgMTYtYml0IHJlbGF5Y29kZSwgdGhlIGFyZ3VtZW50cyBuZWVkCisgKiB0byBiZSBjb3BpZWQgKmJhY2sqIHRvIHRoZSAzMi1iaXQgc3RhY2ssIHNpbmNlIHRoZSAzMi1iaXQKKyAqIHJlbGF5Y29kZSBwcm9jZXNzZXMgb3V0cHV0IHBhcmFtZXRlcnMuCisgKiAKKyAqIE5vdGUgdGhhdCB3ZSBjb3B5IHR3aWNlIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzLCBzaW5jZSBzb21lIG9mIHRoZQorICogMTYtYml0IHJlbGF5Y29kZXMgaW4gU1lTVEhVTksuRExMIGRpcmVjdGx5IGFjY2VzcyB0aGUgb3JpZ2luYWwKKyAqIGFyZ3VtZW50cyBvZiB0aGUgY2FsbGVyIQorICoKKyAqIChOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBzZWVtcyBvbmx5IHRvIGJlIHVzZWQgZm9yCisgKiAgT0xFQ0xJMzIgLT4gT0xFQ0xJIGFuZCBPTEVTVlIzMiAtPiBPTEVTVlIgdGh1bmtpbmcuKQogICovCi1WT0lEIFdJTkFQSSBfS0VSTkVMMzJfNDAoQ09OVEVYVCAqY29udGV4dCkKK1ZPSUQgV0lOQVBJIE9UXzMyVGhrTFNGKENPTlRFWFQgKmNvbnRleHQpCiB7Ci0JQ09OVEVYVAljb250ZXh0MTY7Ci0JTFBCWVRFCWN1cnN0YWNrOwotCURXT1JECXJldCxzdGFja3NpemU7Ci0JVEhEQiAqdGhkYiA9IFRIUkVBRF9DdXJyZW50KCk7CisgICAgQ09OVEVYVCBjb250ZXh0MTY7CisgICAgRFdPUkQgYXJnc2l6ZTsKKyAgICBUSERCICp0aGRiID0gVEhSRUFEX0N1cnJlbnQoKTsKIAotCV9fUkVTVE9SRV9FUzsKLQlUUkFDRSh0aHVuaywiKEVEWD0weCUwOGx4KVxuIiwgRURYX3JlZyhjb250ZXh0KSApOwotCXN0YWNrc2l6ZSA9IEVCUF9yZWcoY29udGV4dCktRVNQX3JlZyhjb250ZXh0KTsKLQlUUkFDRSh0aHVuaywiCXN0YWNrc2l6ZSA9ICVsZFxuIixzdGFja3NpemUpOwotCVRSQUNFKHRodW5rLCJvbiB0b3Agb2Ygc3RhY2s6IDB4JTA0eFxuIiwqKFdPUkQqKUVTUF9yZWcoY29udGV4dCkpOworICAgIG1lbWNweSgmY29udGV4dDE2LGNvbnRleHQsc2l6ZW9mKGNvbnRleHQxNikpOwogCi0JbWVtY3B5KCZjb250ZXh0MTYsY29udGV4dCxzaXplb2YoY29udGV4dDE2KSk7CisgICAgQ1NfcmVnKCZjb250ZXh0MTYpICA9IEhJV09SRChFRFhfcmVnKGNvbnRleHQpKTsKKyAgICBJUF9yZWcoJmNvbnRleHQxNikgID0gTE9XT1JEKEVEWF9yZWcoY29udGV4dCkpOworICAgIEVCUF9yZWcoJmNvbnRleHQxNikgPSBPRkZTRVRPRiggdGhkYi0+Y3VyX3N0YWNrICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKFdPUkQpJigoU1RBQ0sxNkZSQU1FKikwKS0+YnA7CiAKLQlDU19yZWcoJmNvbnRleHQxNikJID0gSElXT1JEKEVEWF9yZWcoY29udGV4dCkpOwotCUlQX3JlZygmY29udGV4dDE2KQkgPSBMT1dPUkQoRURYX3JlZyhjb250ZXh0KSk7CisgICAgYXJnc2l6ZSA9IDIgKiAqKFdPUkQgKikoRVNQX3JlZyhjb250ZXh0KSArIDQpICsgMjsKIAotCWN1cnN0YWNrID0gUFRSX1NFR19UT19MSU4oU1RBQ0sxNl9QVVNIKCB0aGRiLCBzdGFja3NpemUgKSk7Ci0JbWVtY3B5KGN1cnN0YWNrLXN0YWNrc2l6ZSwoTFBCWVRFKUVTUF9yZWcoY29udGV4dCksc3RhY2tzaXplKTsKLQlyZXQgPSBDYWxsYmFja3MtPkNhbGxSZWdpc3RlclNob3J0UHJvYygmY29udGV4dDE2LDApOwotCVNUQUNLMTZfUE9QKCB0aGRiLCBzdGFja3NpemUgKTsKKyAgICBtZW1jcHkoICgoTFBCWVRFKVRIUkVBRF9TVEFDSzE2KHRoZGIpKS1hcmdzaXplLAorICAgICAgICAgICAgKExQQllURSlFU1BfcmVnKGNvbnRleHQpKzQsIGFyZ3NpemUgKTsKIAotCVRSQUNFKHRodW5rLCIuIHJldHVybmVkICUwOGx4XG4iLHJldCk7Ci0JRUFYX3JlZyhjb250ZXh0KSAJID0gcmV0OworICAgIEVBWF9yZWcoY29udGV4dCkgPSBDYWxsYmFja3MtPkNhbGxSZWdpc3RlclNob3J0UHJvYygmY29udGV4dDE2LCBhcmdzaXplKTsKKworICAgIG1lbWNweSggKExQQllURSlFU1BfcmVnKGNvbnRleHQpKzQsIAorICAgICAgICAgICAgKChMUEJZVEUpVEhSRUFEX1NUQUNLMTYodGhkYikpLWFyZ3NpemUsIGFyZ3NpemUgKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCQlUaHVua0luaXRMU0YJCShLRVJORUwzMi40MSkKICAqIEEgdGh1bmsgc2V0dXAgcm91dGluZS4KQEAgLTY5Niw3ICs5MjIsNyBAQAogICAgIERXT1JEICB0YXJnZXRUYWJsZU9mZnNldCA9IEVEWF9yZWcoY29udGV4dCk7CiAgICAgTFBCWVRFIHJlbGF5Q29kZSA9IChMUEJZVEUpRUFYX3JlZyhjb250ZXh0KTsKICAgICBEV09SRCAqdGFyZ2V0VGFibGUgPSAqKERXT1JEICoqKShyZWxheUNvZGUrdGFyZ2V0VGFibGVPZmZzZXQpOwotICAgIERXT1JEICB0YXJnZXROciA9ICooRFdPUkQgKikoRUJQX3JlZyhjb250ZXh0KSAtIDQpOworICAgIERXT1JEICB0YXJnZXROciA9IExPQllURSgqKERXT1JEICopKEVCUF9yZWcoY29udGV4dCkgLSA0KSk7CiAKICAgICBfd3JpdGVfcXR0aHVuayhyZWxheUNvZGUsIHRhcmdldFRhYmxlKTsKIApAQCAtNzMwLDcgKzk1Niw3IEBACiAJCUVSUih0aHVuaywiY291bGRuJ3QgbG9hZCAlcywgZXJyb3IgJWRcbiIsZGxsMTYsaG1vZCk7CiAJCXJldHVybjsKIAl9Ci0Jc2VnYWRkciA9IChTRUdQVFIpV0lOMzJfR2V0UHJvY0FkZHJlc3MxNihobW9kLHRoa2J1Zik7CisJc2VnYWRkciA9IChTRUdQVFIpV0lOMzJfR2V0UHJvY0FkZHJlc3MxNihobW9kLChMUFNUUil0aGtidWYpOwogCWlmICghc2VnYWRkcikgewogCQlFUlIodGh1bmssImhhdmVuJ3QgZm91bmQgJXMgaW4gJXMhXG4iLHRoa2J1ZixkbGwxNik7CiAJCXJldHVybjsKQEAgLTgzNCw2ICsxMDYwLDU1IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAJCUtFUk5FTF82MDcJCShLRVJORUwpCisgKi8KK0xQVk9JRCBXSU5BUEkgX0tFUk5FTF82MDcoU0VHUFRSIHRhcmdldCwgTFBWT0lEIHJlbGF5LCBEV09SRCBkdW1teSkKK3sKKyAgICBUREIgKnBUYXNrID0gKFREQiopR2xvYmFsTG9jazE2KEdldEN1cnJlbnRUYXNrKCkpOworICAgIExQQllURSB0aHVuayA9IEhlYXBBbGxvYyggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgMjIgKSwgeCA9IHRodW5rOworCisgICAgKngrKz0weDkwOyAqeCsrPTB4Njg7ICooKERXT1JEKil4KSsrPShEV09SRClyZWxheTsJLyogbm9wOyBwdXNobCByZWxheSAqLworICAgICp4Kys9MHg5MDsgKngrKz0weDY4OyAqKChEV09SRCopeCkrKz0oRFdPUkQpdGFyZ2V0OyAvKiBub3A7IHB1c2hsIHRhcmdldCAqLworICAgICp4Kys9MHg5MDsgKngrKz0weDU4OwkJCQkvKiBub3A7IHBvcGwgZWF4ICovCisgICAgKngrKz0weEMzOwkJCQkJCS8qIHJldCAqLworICAgICp4Kys9MHhDQzsgKngrKz0weENDOworICAgICp4Kys9MHgwMTsJCQkJCQkvKiB0eXBlOiBMUyAqLworICAgICooKFdPUkQgKil4KSsrID0gcFRhc2stPmhJbnN0YW5jZTsJCQkvKiBvd25lciAqLworICAgICooKFdPUkQgKil4KSsrID0gMDsJCQkJCS8qIG5leHQgKi8KKworICAgIHJldHVybiB0aHVuazsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIAkJS0VSTkVMXzYwOAkJKEtFUk5FTCkKKyAqLworU0VHUFRSIFdJTkFQSSBfS0VSTkVMXzYwOChMUFZPSUQgdGFyZ2V0LCBTRUdQVFIgcmVsYXksIERXT1JEIGR1bW15KQoreworICAgIFREQiAqcFRhc2sgPSAoVERCKilHbG9iYWxMb2NrMTYoR2V0Q3VycmVudFRhc2soKSk7CisgICAgTFBCWVRFIHRodW5rID0gSGVhcEFsbG9jKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCAyMiApLCB4ID0gdGh1bms7CisgICAgV09SRCBzZWw7CisKKyAgICAqeCsrPTB4NjY7ICp4Kys9MHg2ODsgKigoRFdPUkQqKXgpKys9KERXT1JEKXJlbGF5OwkvKiBwdXNobCByZWxheSAqLworICAgICp4Kys9MHg2NjsgKngrKz0weDY4OyAqKChEV09SRCopeCkrKz0oRFdPUkQpdGFyZ2V0OyAvKiBwdXNobCB0YXJnZXQgKi8KKyAgICAqeCsrPTB4NjY7ICp4Kys9MHg1ODsJCQkJLyogcG9wbCBlYXggKi8KKyAgICAqeCsrPTB4Q0I7CQkJCQkJLyogcmV0ICovCisgICAgKngrKz0weENDOyAqeCsrPTB4Q0M7CisgICAgKngrKz0weDAyOwkJCQkJCS8qIHR5cGU6IFNMICovCisgICAgKigoV09SRCAqKXgpKysgPSBwVGFzay0+aEluc3RhbmNlOwkJCS8qIG93bmVyICovCisgICAgKigoV09SRCAqKXgpKysgPSAwOwkJCQkJLyogbmV4dCAqLworCisgICAgc2VsID0gU0VMRUNUT1JfQWxsb2NCbG9jayggdGh1bmssIDIyLCBTRUdNRU5UX0NPREUsIEZBTFNFLCBGQUxTRSApOworICAgIHJldHVybiBQVFJfU0VHX09GRl9UT19TRUdQVFIoIHNlbCwgMCApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogCQlLRVJORUxfNjExCQkoS0VSTkVMKQorICovCitWT0lEIFdJTkFQSSBfS0VSTkVMXzYxMShEV09SRCByZWxheSwgRFdPUkQgdGFyZ2V0KQoreworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJCQlBbGxvY1NMQ2FsbGJhY2sJCShLRVJORUwzMikKICAqCiAgKiBXaW45NSB1c2VzIHNvbWUgc3RydWN0Y2hhaW5zIGZvciBjYWxsYmFja3MuIEl0IGFsbG9jYXRlcyB0aGVtCkBAIC05ODQsNDQgKzEyNTksMjM2IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEZVTkMwMDQJCQkJKEtFUk5FTC42MzEpCi0gKiBBIDE2LT4zMiB0aHVuayBzZXR1cCBmdW5jdGlvbi4KLSAqIEdldHMgY2FsbGVkIGZyb20gYSB0aHVua2J1ZmZlciAodmFsdWUgb2YgRUFYKS4gSXQgb3ZlcndyaXRlcyB0aGUgc3RhcnQKLSAqIHdpdGggYSBqbXAgdG8gYSBrZXJuZWwzMiBmdW5jdGlvbi4gVGhlIGtlcm5lbDMyIGZ1bmN0aW9uIGdldHMgcGFzc2VkIEVEWC4KLSAqIChhbmQgcG9zc2libHkgQ1gpLgorICogICAgICAgICAgIEMxNlRoa1NMCQkJCShLRVJORUwuNjMwKQogICovCi12b2lkIFdJTkFQSSBGVU5DMDA0KAotCUNPTlRFWFQgKmNvbnRleHQJLyogW2luL291dF0gcmVnaXN0ZXIgY29udGV4dCBmcm9tIDE2MzItcmVsYXkgKi8KLSkgewogCi0JRklYTUUocmVnLCIsU1RVQiAoZWR4IGlzIDB4JTA4bHgsIGVheCBpcyAweCUwOGx4LGVkeFsweDEwXSBpcyAweCUwOGx4KSFcbiIsCi0JCUVEWF9yZWcoY29udGV4dCksCi0JCUVBWF9yZWcoY29udGV4dCksCi0JCSgoRFdPUkQqKVBUUl9TRUdfVE9fTElOKEVEWF9yZWcoY29udGV4dCkpKVsweDEwLzRdCi0JKTsKLQotI2lmIDAKK3ZvaWQgV0lOQVBJIEMxNlRoa1NMKENPTlRFWFQgKmNvbnRleHQpCiB7Ci0JTFBCWVRFCXgsdGFyZ2V0ID0gKExQQllURSlQVFJfU0VHX1RPX0xJTihFQVhfcmVnKGNvbnRleHQpKTsKLQlXT1JECWRzLGNzOworICAgIGV4dGVybiB2b2lkIENhbGxGcm9tMTZfdF9sb25nXyh2b2lkKTsKKyAgICBMUEJZVEUgc3R1YiA9IFBUUl9TRUdfVE9fTElOKEVBWF9yZWcoY29udGV4dCkpLCB4ID0gc3R1YjsKKyAgICBXT1JEIGNzLCBkczsKKyAgICBHRVRfQ1MoY3MpOworICAgIEdFVF9EUyhkcyk7CiAKLQlHRVRfRFMoZHMpOwotCUdFVF9DUyhjcyk7Ci0vKiBXb24ndCB3b3JrIGFueXdheSBzaW5jZSB3ZSBkb24ndCBrbm93IHRoZSBmdW5jdGlvbiBjYWxsZWQgaW4gS0VSTkVMMzIgLU1hcmN1cyovCi0JeCA9IHRhcmdldDsKLQkqeCsrPSAweGI4OyAqKFdPUkQqKXg9IGRzO3grPTI7CQkvKiBtb3YgYXgsS0VSTkVMMzJfRFMgKi8KLQkqeCsrPSAweDhlOyAqeCsrID0gMHhjMDsgCQkvKiBtb3YgZXMsYXggKi8KLQkqeCsrPSAweDY2OyAqeCsrID0gMHhiYTsgKihEV09SRCopeD1FRFhfcmVnKGNvbnRleHQpO3grPTQ7Ci0JCQkJCQkvKiBtb3YgZWR4LCAkRURYICovCi0JKngrKz0gMHg2NjsgKngrKyA9IDB4ZWE7CS8qIGptcCBLRVJORUwzMl9DUzprZXJuZWwzMmZ1biAqLwotCQkqKERXT1JEKil4PTA7eCs9NDsvKiBGSVhNRTogX3doYXRfIGZ1bmN0aW9uIGRvZXMgaXQgY2FsbD8gKi8KLQkJKihXT1JEKil4PWNzO3grPTI7Ci0JCQkJCQorICAgIC8qIFdlIHByb2R1Y2UgdGhlIGZvbGxvd2luZyBjb2RlOgorICAgICAqCisgICAgICogICBtb3YgYXgsIF9fRkxBVERTCisgICAgICogICBtb3YgZXMsIGF4CisgICAgICogICBtb3Z6eCBlY3gsIGN4CisgICAgICogICBtb3YgZWR4LCBlczpbZWN4ICsgJEVEWF0KKyAgICAgKiAgIHB1c2ggYnAKKyAgICAgKiAgIHB1c2ggZWR4CisgICAgICogICBjYWxsIF9fRkxBVENTOkNhbGxGcm9tMTZfdF9sb25nXworICAgICAqLwogCi0JSVBfcmVnKGNvbnRleHQpID0gTE9XT1JEKEVBWF9yZWcoY29udGV4dCkpOwotCUNTX3JlZyhjb250ZXh0KSA9IEhJV09SRChFQVhfcmVnKGNvbnRleHQpKTsKLX0KLSNlbmRpZgotCXJldHVybjsKKyAgICAqeCsrID0gMHhCODsgKigoV09SRCAqKXgpKysgPSBkczsKKyAgICAqeCsrID0gMHg4RTsgKngrKyA9IDB4QzA7CisgICAgKngrKyA9IDB4NjA7ICp4KysgPSAweDBGOyAqeCsrID0gMHhCNzsgKngrKyA9IDB4Qzk7CisgICAgKngrKyA9IDB4Njc7ICp4KysgPSAweDY2OyAqeCsrID0gMHgyNjsgKngrKyA9IDB4OEI7CisgICAgICAgICAgICAgICAgICp4KysgPSAweDkxOyAqKChEV09SRCAqKXgpKysgPSBFRFhfcmVnKGNvbnRleHQpOworCisgICAgKngrKyA9IDB4NTU7CisgICAgKngrKyA9IDB4NjY7ICp4KysgPSAweDUyOworICAgICp4KysgPSAweDY2OyAqeCsrID0gMHg5QTsgKigoRFdPUkQgKil4KSsrID0gKERXT1JEKUNhbGxGcm9tMTZfdF9sb25nXzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooKFdPUkQgKil4KSsrID0gY3M7CisKKyAgICAvKiBKdW1wIHRvIHRoZSBzdHViIGNvZGUganVzdCBjcmVhdGVkICovCisgICAgSVBfcmVnKGNvbnRleHQpID0gTE9XT1JEKEVBWF9yZWcoY29udGV4dCkpOworICAgIENTX3JlZyhjb250ZXh0KSA9IEhJV09SRChFQVhfcmVnKGNvbnRleHQpKTsKKworICAgIC8qIFNpbmNlIEMxNlRoa1NMIGdvdCBjYWxsZWQgYnkgYSBqbXAsIHdlIG5lZWQgdG8gbGVhdmUgdGhlCisgICAgICAgb3JnaW5hbCByZXR1cm4gYWRkcmVzcyBvbiB0aGUgc3RhY2sgKi8KKyAgICBTUF9yZWcoY29udGV4dCkgLT0gNDsKIH0KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQzE2VGhrU0wwMQkJCQkoS0VSTkVMLjYzMSkKKyAqLworCit2b2lkIFdJTkFQSSBDMTZUaGtTTDAxKENPTlRFWFQgKmNvbnRleHQpCit7CisgICAgTFBCWVRFIHN0dWIgPSBQVFJfU0VHX1RPX0xJTihFQVhfcmVnKGNvbnRleHQpKSwgeCA9IHN0dWI7CisKKyAgICBpZiAoc3R1YikKKyAgICB7CisgICAgICAgIHN0cnVjdCBUaHVua0RhdGFTTDE2ICpTTDE2ID0gUFRSX1NFR19UT19MSU4oRURYX3JlZyhjb250ZXh0KSk7CisgICAgICAgIHN0cnVjdCBUaHVua0RhdGFTTCAqdGQgPSBTTDE2LT5mcERhdGE7CisKKyAgICAgICAgZXh0ZXJuIHZvaWQgQ2FsbEZyb20xNl90X2xvbmdfKHZvaWQpOworICAgICAgICBEV09SRCBwcm9jQWRkcmVzcyA9IChEV09SRClHZXRQcm9jQWRkcmVzczE2KEdldE1vZHVsZUhhbmRsZTE2KCJLRVJORUwiKSwgNjMxKTsKKyAgICAgICAgV09SRCBjczsKKyAgICAgICAgR0VUX0NTKGNzKTsKKworICAgICAgICBpZiAoIXRkKQorICAgICAgICB7CisgICAgICAgICAgICBFUlIodGh1bmssICJUaHVua0Nvbm5lY3QxNiB3YXMgbm90IGNhbGxlZCFcbiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgVFJBQ0UodGh1bmssICJDcmVhdGluZyBzdHViIGZvciBUaHVua0RhdGFTTCAlMDhseFxuIiwgKERXT1JEKXRkKTsKKworCisgICAgICAgIC8qIFdlIHByb2R1Y2UgdGhlIGZvbGxvd2luZyBjb2RlOgorICAgICAgICAgKgorICAgICAgICAgKiAgIHhvciBlYXgsIGVheAorICAgICAgICAgKiAgIG1vdiBlZHgsICR0ZAorICAgICAgICAgKiAgIGNhbGwgQzE2VGhrU0wwMQorICAgICAgICAgKiAgIHB1c2ggYnAKKyAgICAgICAgICogICBwdXNoIGVkeAorICAgICAgICAgKiAgIGNhbGwgX19GTEFUQ1M6Q2FsbEZyb20xNl90X2xvbmdfCisgICAgICAgICAqLworCisgICAgICAgICp4KysgPSAweDY2OyAqeCsrID0gMHgzMzsgKngrKyA9IDB4QzA7CisgICAgICAgICp4KysgPSAweDY2OyAqeCsrID0gMHhCQTsgKigoRFdPUkQgKil4KSsrID0gKERXT1JEKXRkOworICAgICAgICAqeCsrID0gMHg5QTsgKigoRFdPUkQgKil4KSsrID0gcHJvY0FkZHJlc3M7CisKKyAgICAgICAgKngrKyA9IDB4NTU7CisgICAgICAgICp4KysgPSAweDY2OyAqeCsrID0gMHg1MjsKKyAgICAgICAgKngrKyA9IDB4NjY7ICp4KysgPSAweDlBOyAqKChEV09SRCAqKXgpKysgPSAoRFdPUkQpQ2FsbEZyb20xNl90X2xvbmdfOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooKFdPUkQgKil4KSsrID0gY3M7CisgICAgICAgIAorICAgICAgICAvKiBKdW1wIHRvIHRoZSBzdHViIGNvZGUganVzdCBjcmVhdGVkICovCisgICAgICAgIElQX3JlZyhjb250ZXh0KSA9IExPV09SRChFQVhfcmVnKGNvbnRleHQpKTsKKyAgICAgICAgQ1NfcmVnKGNvbnRleHQpID0gSElXT1JEKEVBWF9yZWcoY29udGV4dCkpOworCisgICAgICAgIC8qIFNpbmNlIEMxNlRoa1NMMDEgZ290IGNhbGxlZCBieSBhIGptcCwgd2UgbmVlZCB0byBsZWF2ZSB0aGUKKyAgICAgICAgICAgb3JnaW5hbCByZXR1cm4gYWRkcmVzcyBvbiB0aGUgc3RhY2sgKi8KKyAgICAgICAgU1BfcmVnKGNvbnRleHQpIC09IDQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7IAorICAgICAgICBzdHJ1Y3QgVGh1bmtEYXRhU0wgKnRkID0gKHN0cnVjdCBUaHVua0RhdGFTTCAqKUVEWF9yZWcoY29udGV4dCk7CisgICAgICAgIERXT1JEIHRhcmdldE5yID0gQ1hfcmVnKGNvbnRleHQpIC8gNDsKKyAgICAgICAgc3RydWN0IFNMVGFyZ2V0REIgKnRkYjsKKworICAgICAgICBUUkFDRSh0aHVuaywgIlByb2Nlc3MgJTA4bHggY2FsbGluZyB0YXJnZXQgJWxkIG9mIFRodW5rRGF0YVNMICUwOGx4XG4iLCAKKyAgICAgICAgICAgICAgICAgICAgIChEV09SRClQUk9DRVNTX0N1cnJlbnQoKSwgdGFyZ2V0TnIsIChEV09SRCl0ZCk7CisKKyAgICAgICAgZm9yICh0ZGIgPSB0ZC0+dGFyZ2V0REI7IHRkYjsgdGRiID0gdGRiLT5uZXh0KQorICAgICAgICAgICAgaWYgKHRkYi0+cHJvY2VzcyA9PSBQUk9DRVNTX0N1cnJlbnQoKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICBpZiAoIXRkYikKKyAgICAgICAgeworICAgICAgICAgICAgVFJBQ0UodGh1bmssICJMb2FkaW5nIDMyLWJpdCBsaWJyYXJ5ICVzXG4iLCB0ZC0+cHN6RGxsMzIpOworICAgICAgICAgICAgTG9hZExpYnJhcnkzMkEodGQtPnBzekRsbDMyKTsKKworICAgICAgICAgICAgZm9yICh0ZGIgPSB0ZC0+dGFyZ2V0REI7IHRkYjsgdGRiID0gdGRiLT5uZXh0KQorICAgICAgICAgICAgICAgIGlmICh0ZGItPnByb2Nlc3MgPT0gUFJPQ0VTU19DdXJyZW50KCkpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRkYikKKyAgICAgICAgeworICAgICAgICAgICAgRURYX3JlZyhjb250ZXh0KSA9IHRkYi0+dGFyZ2V0VGFibGVbdGFyZ2V0TnJdOworCisgICAgICAgICAgICBUUkFDRSh0aHVuaywgIkNhbGwgdGFyZ2V0IGlzICUwOGx4XG4iLCBFRFhfcmVnKGNvbnRleHQpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIFdPUkQgKnN0YWNrID0gUFRSX1NFR19PRkZfVE9fTElOKFNTX3JlZyhjb250ZXh0KSwgU1BfcmVnKGNvbnRleHQpKTsKKyAgICAgICAgICAgIERYX3JlZyhjb250ZXh0KSA9IEhJV09SRCh0ZC0+YXBpREJbdGFyZ2V0TnJdLmVycm9yUmV0dXJuVmFsdWUpOworICAgICAgICAgICAgQVhfcmVnKGNvbnRleHQpID0gTE9XT1JEKHRkLT5hcGlEQlt0YXJnZXROcl0uZXJyb3JSZXR1cm5WYWx1ZSk7CisgICAgICAgICAgICBJUF9yZWcoY29udGV4dCkgPSBzdGFja1syXTsKKyAgICAgICAgICAgIENTX3JlZyhjb250ZXh0KSA9IHN0YWNrWzNdOworICAgICAgICAgICAgU1BfcmVnKGNvbnRleHQpICs9IHRkLT5hcGlEQlt0YXJnZXROcl0ubnJBcmdCeXRlcyArIDQ7CisKKyAgICAgICAgICAgIC8qIFdpbjk1IGFsbG93cyBkZWxheWVkIGxvYWRpbmcgb2YgdGhlIDMyLWJpdCBETEwuCisgICAgICAgICAgICAgICBXZSBkb24ndCBkbyB0aGF0IGF0IHRoZSBtb21lbnQuICovCisgICAgICAgICAgICBFUlIodGh1bmssICJQcm9jZXNzICUwOGx4IGRpZCBub3QgVGh1bmtDb25uZWN0MzIgJXMgdG8gJXNcbiIsIAorICAgICAgICAgICAgICAgICAgICAgICAoRFdPUkQpUFJPQ0VTU19DdXJyZW50KCksIHRkLT5wc3pEbGwzMiwgdGQtPnBzekRsbDE2KTsKKyAgICAgICAgfQorICAgIH0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBLMzJUaGsxNjMyUHJvbG9nCQkJKEtFUk5FTDMyLjQ5MikKKyAqLworVk9JRCBXSU5BUEkgSzMyVGhrMTYzMlByb2xvZyhDT05URVhUICpjb250ZXh0KQoreworICAgTFBCWVRFIGNvZGUgPSAoTFBCWVRFKUVJUF9yZWcoY29udGV4dCkgLSA1OworCisgICAvKiBBcnJyZ2ghIFNZU1RIVU5LLkRMTCBqdXN0IGhhcyB0byByZS1pbXBsZW1lbnQgYW5vdGhlciBtZXRob2QKKyAgICAgIG9mIDE2LT4zMiB0aHVua3MgaW5zdGVhZCBvZiB1c2luZyBvbmUgb2YgdGhlIHN0YW5kYXJkIG1ldGhvZHMhCisgICAgICBUaGlzIG1lYW5zIHRoYXQgU1lTVEhVTksuRExMIGl0c2VsZiBzd2l0Y2hlcyB0byBhIDMyLWJpdCBzdGFjaywKKyAgICAgIGFuZCBkb2VzIGEgZmFyIGNhbGwgdG8gdGhlIDMyLWJpdCBjb2RlIHNlZ21lbnQgb2YgT0xFQ0xJMzIvT0xFU1ZSMzIuCisgICAgICBVbmZvcnR1bmF0ZWx5LCBvdXIgQ2FsbFRvL0NhbGxGcm9tIG1lY2hhbmlzbSBpcyB0aGVyZWZvcmUgY29tcGxldGVseQorICAgICAgYnlwYXNzZWQsIHdoaWNoIG1lYW5zIGl0IHdpbGwgY3Jhc2ggdGhlIG5leHQgdGltZSB0aGUgMzItYml0IE9MRSAKKyAgICAgIGNvZGUgdGh1bmtzIGRvd24gYWdhaW4gdG8gMTYtYml0ICh0aGlzICp3aWxsKiBoYXBwZW4hKS4KKworICAgICAgVGhlIGZvbGxvd2luZyBoYWNrIHRyaWVzIHRvIHJlY29nbml6ZSB0aGlzIHNpdHVhdGlvbi4KKyAgICAgIFRoaXMgaXMgcG9zc2libGUgc2luY2UgdGhlIGNhbGxlZCBzdHVicyBpbiBPTEVDTEkzMi9PTEVTVlIzMiBhbGwKKyAgICAgIGxvb2sgZXhhY3RseSB0aGUgc2FtZToKKyAgICAgICAgMDAgICBFOHh4eHh4eHh4ICAgIGNhbGwgSzMyVGhrMTYzMlByb2xvZworICAgICAgICAwNSAgIEZGNTVGQyAgICAgICAgY2FsbCBbZWJwLTA0XQorICAgICAgICAwOCAgIEU4eHh4eHh4eHggICAgY2FsbCBLMzJUaGsxNjMyRXBpbG9nCisgICAgICAgIDBEICAgNjZDQiAgICAgICAgICByZXRmCisKKyAgICAgIElmIHdlIHJlY29nbml6ZSB0aGlzIHNpdHVhdGlvbiwgd2UgdHJ5IHRvIHNpbXVsYXRlIHRoZSBhY3Rpb25zCisgICAgICBvZiBvdXIgQ2FsbFRvL0NhbGxGcm9tIG1lY2hhbmlzbSBieSBjb3B5aW5nIHRoZSAxNi1iaXQgc3RhY2sKKyAgICAgIHRvIG91ciAzMi1iaXQgc3RhY2ssIGNyZWF0aW5nIGEgcHJvcGVyIFNUQUNLMTZGUkFNRSBhbmQgCisgICAgICB1cGRhdGluZyB0aGRiLT5jdXJfc3RhY2suICovIAorCisgICBpZiAoICAgY29kZVs1XSA9PSAweEZGICYmIGNvZGVbNl0gPT0gMHg1NSAmJiBjb2RlWzddID09IDB4RkMKKyAgICAgICAmJiBjb2RlWzEzXSA9PSAweDY2ICYmIGNvZGVbMTRdID09IDB4Q0IpCisgICB7CisgICAgICBXT1JEICBzdGFja1NlbCAgPSBOdEN1cnJlbnRUZWIoKS0+c3RhY2tfc2VsOworICAgICAgRFdPUkQgc3RhY2tCYXNlID0gR2V0U2VsZWN0b3JCYXNlKHN0YWNrU2VsKTsKKworICAgICAgVEhEQiAqdGhkYiA9IFRIUkVBRF9DdXJyZW50KCk7CisgICAgICBEV09SRCBhcmdTaXplID0gRUJQX3JlZyhjb250ZXh0KSAtIEVTUF9yZWcoY29udGV4dCk7CisgICAgICBjaGFyICpzdGFjazE2ID0gKGNoYXIgKilFU1BfcmVnKGNvbnRleHQpOworICAgICAgY2hhciAqc3RhY2szMiA9IChjaGFyICopdGhkYi0+Y3VyX3N0YWNrIC0gYXJnU2l6ZTsKKyAgICAgIFNUQUNLMTZGUkFNRSAqZnJhbWUxNiA9IChTVEFDSzE2RlJBTUUgKilzdGFjazE2IC0gMTsKKworICAgICAgVFJBQ0UodGh1bmssICJiZWZvcmUgU1lTVEhVTksgaGFjazogRUJQOiAlMDhseCBFU1A6ICUwOGx4IGN1cl9zdGFjazogJTA4bHhcbiIsCisgICAgICAgICAgICAgICAgICAgRUJQX3JlZyhjb250ZXh0KSwgRVNQX3JlZyhjb250ZXh0KSwgdGhkYi0+Y3VyX3N0YWNrKTsKKworICAgICAgbWVtc2V0KGZyYW1lMTYsICdcMCcsIHNpemVvZihTVEFDSzE2RlJBTUUpKTsKKyAgICAgIGZyYW1lMTYtPmZyYW1lMzIgPSAoU1RBQ0szMkZSQU1FICopdGhkYi0+Y3VyX3N0YWNrOworICAgICAgZnJhbWUxNi0+ZWJwID0gRUJQX3JlZyhjb250ZXh0KTsKKworICAgICAgbWVtY3B5KHN0YWNrMzIsIHN0YWNrMTYsIGFyZ1NpemUpOworICAgICAgdGhkYi0+Y3VyX3N0YWNrID0gUFRSX1NFR19PRkZfVE9fU0VHUFRSKHN0YWNrU2VsLCAoRFdPUkQpZnJhbWUxNiAtIHN0YWNrQmFzZSk7CisKKyAgICAgIEVTUF9yZWcoY29udGV4dCkgPSAoRFdPUkQpc3RhY2szMjsKKyAgICAgIEVCUF9yZWcoY29udGV4dCkgPSBFU1BfcmVnKGNvbnRleHQpICsgYXJnU2l6ZTsKKworICAgICAgVFJBQ0UodGh1bmssICJhZnRlciAgU1lTVEhVTksgaGFjazogRUJQOiAlMDhseCBFU1A6ICUwOGx4IGN1cl9zdGFjazogJTA4bHhcbiIsCisgICAgICAgICAgICAgICAgICAgRUJQX3JlZyhjb250ZXh0KSwgRVNQX3JlZyhjb250ZXh0KSwgdGhkYi0+Y3VyX3N0YWNrKTsKKyAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgSzMyVGhrMTYzMkVwaWxvZwkJCShLRVJORUwzMi40OTEpCisgKi8KK1ZPSUQgV0lOQVBJIEszMlRoazE2MzJFcGlsb2coQ09OVEVYVCAqY29udGV4dCkKK3sKKyAgIExQQllURSBjb2RlID0gKExQQllURSlFSVBfcmVnKGNvbnRleHQpIC0gMTM7CisKKyAgIC8qIFdlIHVuZG8gdGhlIFNZU1RIVU5LIGhhY2sgaWYgbmVjZXNzYXJ5LiBTZWUgSzMyVGhrMTYzMlByb2xvZy4gKi8KKworICAgaWYgKCAgIGNvZGVbNV0gPT0gMHhGRiAmJiBjb2RlWzZdID09IDB4NTUgJiYgY29kZVs3XSA9PSAweEZDCisgICAgICAgJiYgY29kZVsxM10gPT0gMHg2NiAmJiBjb2RlWzE0XSA9PSAweENCKQorICAgeworICAgICAgVEhEQiAqdGhkYiA9IFRIUkVBRF9DdXJyZW50KCk7CisgICAgICBTVEFDSzE2RlJBTUUgKmZyYW1lMTYgPSAoU1RBQ0sxNkZSQU1FICopUFRSX1NFR19UT19MSU4odGhkYi0+Y3VyX3N0YWNrKTsKKyAgICAgIGNoYXIgKnN0YWNrMTYgPSAoY2hhciAqKShmcmFtZTE2ICsgMSk7CisgICAgICBEV09SRCBhcmdTaXplID0gZnJhbWUxNi0+ZWJwIC0gKERXT1JEKXN0YWNrMTY7CisgICAgICBjaGFyICpzdGFjazMyID0gKGNoYXIgKilmcmFtZTE2LT5mcmFtZTMyIC0gYXJnU2l6ZTsKKworICAgICAgRFdPUkQgbkFyZ3NQb3BwZWQgPSBFU1BfcmVnKGNvbnRleHQpIC0gKERXT1JEKXN0YWNrMzI7CisKKyAgICAgIFRSQUNFKHRodW5rLCAiYmVmb3JlIFNZU1RIVU5LIGhhY2s6IEVCUDogJTA4bHggRVNQOiAlMDhseCBjdXJfc3RhY2s6ICUwOGx4XG4iLAorICAgICAgICAgICAgICAgICAgIEVCUF9yZWcoY29udGV4dCksIEVTUF9yZWcoY29udGV4dCksIHRoZGItPmN1cl9zdGFjayk7CisKKyAgICAgIHRoZGItPmN1cl9zdGFjayA9IChEV09SRClmcmFtZTE2LT5mcmFtZTMyOworCisgICAgICBFU1BfcmVnKGNvbnRleHQpID0gKERXT1JEKXN0YWNrMTYgKyBuQXJnc1BvcHBlZDsKKyAgICAgIEVCUF9yZWcoY29udGV4dCkgPSBmcmFtZTE2LT5lYnA7CisKKyAgICAgIFRSQUNFKHRodW5rLCAiYWZ0ZXIgIFNZU1RIVU5LIGhhY2s6IEVCUDogJTA4bHggRVNQOiAlMDhseCBjdXJfc3RhY2s6ICUwOGx4XG4iLAorICAgICAgICAgICAgICAgICAgIEVCUF9yZWcoY29udGV4dCksIEVTUF9yZWcoY29udGV4dCksIHRoZGItPmN1cl9zdGFjayk7CisgICB9Cit9CmRpZmYgLS1naXQgYS93aW4zMi9uZXdmbnMuYyBiL3dpbjMyL25ld2Zucy5jCmluZGV4IGVkMGFhOWQuLmE4YzBhNjMgMTAwNjQ0Ci0tLSBhL3dpbjMyL25ld2Zucy5jCisrKyBiL3dpbjMyL25ld2Zucy5jCkBAIC0xMDksNyArMTA5LDcgQEAKIAkJCQkgIERXT1JEIG5EYWZhdWx0VGltZU91dCwKIAkJCQkgIExQU0VDVVJJVFlfQVRUUklCVVRFUyBscFNlY3VyaXR5QXR0cmlidXRlcykKIHsKLSAgRklYTUUgKHdpbjMyLCAiKE5hbWU9JXMsIE9wZW5Nb2RlPSUjMDh4LCBkd1BpcGVNb2RlPSUjMDh4LCBNYXhJbnN0PSVkLCBPdXRCU2l6ZT0lZCwgSW5CdWZmU2l6ZT0lZCwgRGVmVGltZU91dD0lZCwgU2VjQXR0cj0lcCk6IHN0dWJcbiIsCisgIEZJWE1FICh3aW4zMiwgIihOYW1lPSVzLCBPcGVuTW9kZT0lIzA4bHgsIGR3UGlwZU1vZGU9JSMwOGx4LCBNYXhJbnN0PSVsZCwgT3V0QlNpemU9JWxkLCBJbkJ1ZmZTaXplPSVsZCwgRGVmVGltZU91dD0lbGQsIFNlY0F0dHI9JXApOiBzdHViXG4iLAogCSBkZWJ1Z3N0cl9hKGxwTmFtZSksIGR3T3Blbk1vZGUsIGR3UGlwZU1vZGUsIG5NYXhJbnN0YW5jZXMsCiAJIG5PdXRCdWZmZXJTaXplLCBuSW5CdWZmZXJTaXplLCBuRGFmYXVsdFRpbWVPdXQsIAogCSBscFNlY3VyaXR5QXR0cmlidXRlcyk7CkBAIC0xMzEsNyArMTMxLDcgQEAKIAkJCQkgIERXT1JEIG5EYWZhdWx0VGltZU91dCwKIAkJCQkgIExQU0VDVVJJVFlfQVRUUklCVVRFUyBscFNlY3VyaXR5QXR0cmlidXRlcykKIHsKLSAgRklYTUUgKHdpbjMyLCAiKE5hbWU9JXMsIE9wZW5Nb2RlPSUjMDh4LCBkd1BpcGVNb2RlPSUjMDh4LCBNYXhJbnN0PSVkLCBPdXRCU2l6ZT0lZCwgSW5CdWZmU2l6ZT0lZCwgRGVmVGltZU91dD0lZCwgU2VjQXR0cj0lcCk6IHN0dWJcbiIsCisgIEZJWE1FICh3aW4zMiwgIihOYW1lPSVzLCBPcGVuTW9kZT0lIzA4bHgsIGR3UGlwZU1vZGU9JSMwOGx4LCBNYXhJbnN0PSVsZCwgT3V0QlNpemU9JWxkLCBJbkJ1ZmZTaXplPSVsZCwgRGVmVGltZU91dD0lbGQsIFNlY0F0dHI9JXApOiBzdHViXG4iLAogCSBkZWJ1Z3N0cl93KGxwTmFtZSksIGR3T3Blbk1vZGUsIGR3UGlwZU1vZGUsIG5NYXhJbnN0YW5jZXMsCiAJIG5PdXRCdWZmZXJTaXplLCBuSW5CdWZmZXJTaXplLCBuRGFmYXVsdFRpbWVPdXQsIAogCSBscFNlY3VyaXR5QXR0cmlidXRlcyk7CmRpZmYgLS1naXQgYS93aW4zMi9vcmRpbmFscy5jIGIvd2luMzIvb3JkaW5hbHMuYwppbmRleCA2YWExODRhLi5jNTBiYWM1IDEwMDY0NAotLS0gYS93aW4zMi9vcmRpbmFscy5jCisrKyBiL3dpbjMyL29yZGluYWxzLmMKQEAgLTIyLDQwICsyMiw1MiBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEdldFBXaW5Mb2NrICAgIChLRVJORUwzMi45MykKKyAqICAgICAgICAgICBHZXRwV2luMTZMb2NrICAgIChLRVJORUwzMi45MykKICAqIFJldHVybiB0aGUgaW5mYW1vdXMgV2luMTZNdXRleC4KICAqLwotVk9JRCBXSU5BUEkgR2V0UFdpbkxvY2soQ1JJVElDQUxfU0VDVElPTiAqKmxvY2spCitWT0lEIFdJTkFQSSBHZXRwV2luMTZMb2NrKENSSVRJQ0FMX1NFQ1RJT04gKipsb2NrKQogewogICAgIEZJWE1FKHdpbjMyLCAiKCVwKVxuIixsb2NrKTsKICAgICAqbG9jayA9ICZXaW4xNk11dGV4OwogfQogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBHZXRQSzE2U3lzVmFyICAgIChLRVJORUwzMi45MikKKyAqIFJldHVybiB0aGUgaW5mYW1vdXMgV2luMTZNdXRleC4KKyAqLworTFBWT0lEIFdJTkFQSSBHZXRQSzE2U3lzVmFyKHZvaWQpCit7CisgICAgc3RhdGljIEJZVEUgUEsxNlN5c1ZhclsxMjhdOworCisgICAgRklYTUUod2luMzIsICIoKVxuIik7CisgICAgcmV0dXJuIFBLMTZTeXNWYXI7Cit9CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBXT1czMl8xICAgICAgICAoS0VSTkVMMzIuODgpCisgKiAgICAgICAgICAgV09XR2V0RGVzY3JpcHRvciAgICAgICAgKEtFUk5FTDMyLjg4KSAoV09XMzIuMSkKICAqLwotQk9PTDMyIFdJTkFQSSBXT1czMl8xKFNFR1BUUiBzZWdwdHIsTFBMRFRfRU5UUlkgbGR0ZW50KQorQk9PTDMyIFdJTkFQSSBXT1dHZXREZXNjcmlwdG9yKFNFR1BUUiBzZWdwdHIsTFBMRFRfRU5UUlkgbGR0ZW50KQogewogICAgIHJldHVybiBHZXRUaHJlYWRTZWxlY3RvckVudHJ5KEdldEN1cnJlbnRUaHJlYWRJZCgpLHNlZ3B0cj4+MTYsbGR0ZW50KTsKIH0KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBHZXRQcm9jZXNzRFdPUkQgICAgKEtFUk5FTDMyLjE4KQorICogICAgICAgICAgIEdldFByb2Nlc3NEd29yZCAgICAoS0VSTkVMMzIuMTgpCiAgKiAnT2YgY291cnNlIHlvdSBjYW5ub3QgZGlyZWN0bHkgYWNjZXNzIFdpbmRvd3MgaW50ZXJuYWwgc3RydWN0dXJlcycKICAqLwogCi1EV09SRCBXSU5BUEkgR2V0UHJvY2Vzc0RXT1JEKERXT1JEIHByb2Nlc3NpZCxEV09SRCBhY3Rpb24pCitEV09SRCBXSU5BUEkgR2V0UHJvY2Vzc0R3b3JkKERXT1JEIHByb2Nlc3NpZCxEV09SRCBhY3Rpb24pCiB7Ci0JUERCMzIJKnByb2Nlc3M7CisJUERCMzIJKnByb2Nlc3MgPSBwcm9jZXNzaWQ/IFBST0NFU1NfSWRUb1BEQiggcHJvY2Vzc2lkICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogUFJPQ0VTU19DdXJyZW50KCk7CiAJVERCCSpwVGFzazsKIAogCWFjdGlvbis9NTY7CiAJZnByaW50ZihzdGRlcnIsIktFUk5FTDMyXzE4KCVsZCwlbGQrMHgzOClcbiIscHJvY2Vzc2lkLGFjdGlvbik7Ci0JaWYgKGFjdGlvbj41NikKKwlpZiAoIXByb2Nlc3MgfHwgYWN0aW9uPjU2KQogCQlyZXR1cm4gMDsKLSAgICAgICAgaWYgKCEocHJvY2VzcyA9IFBST0NFU1NfSWRUb1BEQiggcHJvY2Vzc2lkICkpKSByZXR1cm4gMDsKIAlzd2l0Y2ggKGFjdGlvbikgewogCWNhc2UgMDoJLyogcmV0dXJuIGFwcCBjb21wYXQgZmxhZ3MgKi8KIAkJcFRhc2sgPSAoVERCKilHbG9iYWxMb2NrMTYocHJvY2Vzcy0+dGFzayk7CmRpZmYgLS1naXQgYS93aW4zMi9wcm9jZXNzLmMgYi93aW4zMi9wcm9jZXNzLmMKaW5kZXggMThiZDVjMi4uMTVkMjczNCAxMDA2NDQKLS0tIGEvd2luMzIvcHJvY2Vzcy5jCisrKyBiL3dpbjMyL3Byb2Nlc3MuYwpAQCAtMjUsMTIgKzI1LDE3IEBACiAJRFdPUkQgbkNvdW50LEhBTkRMRTMyICpwSGFuZGxlcyxCT09MMzIgZldhaXRBbGwsRFdPUkQgZHdNaWxsaXNlY29uZHMsCiAJRFdPUkQgZHdXYWtlTWFzawogKSB7CisjaWYgMAogCWludAlpOwogCWZwcmludGYoc3RkZXJyLCJNc2dXYWl0Rm9yTXVsdGlwbGVPYmplY3RzKCVsZCxbIixuQ291bnQpOwogCWZvciAoaT0wO2k8bkNvdW50O2krKykKIAkJZnByaW50ZihzdGRlcnIsIiVsZCwiLChEV09SRClwSGFuZGxlc1tpXSk7CiAJZnByaW50ZihzdGRlcnIsIl0sJWQsJWxkLDB4JTA4bHgpXG4iLGZXYWl0QWxsLGR3TWlsbGlzZWNvbmRzLGR3V2FrZU1hc2spOwogCXJldHVybiAwOworI2Vsc2UKKwlyZXR1cm4gV2FpdEZvck11bHRpcGxlT2JqZWN0c0V4KG5Db3VudCwgcEhhbmRsZXMsIGZXYWl0QWxsLCBkd01pbGxpc2Vjb25kcywKKwkJCQkJRkFMU0UpOworI2VuZGlmCiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS93aW4zMi90aW1lLmMgYi93aW4zMi90aW1lLmMKaW5kZXggZmQ1M2EzZS4uYmZhMjc2NSAxMDA2NDQKLS0tIGEvd2luMzIvdGltZS5jCisrKyBiL3dpbjMyL3RpbWUuYwpAQCAtOCw2ICs4LDcgQEAKICNpbmNsdWRlIDx0aW1lLmg+CiAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlICJmaWxlLmgiCiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgIndpbmVycm9yLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKZGlmZiAtLWdpdCBhL3dpbmRvd3MvZGVmd25kLmMgYi93aW5kb3dzL2RlZnduZC5jCmluZGV4IDA0MTFiNjQuLmJkZDM1ZmIgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvZGVmd25kLmMKKysrIGIvd2luZG93cy9kZWZ3bmQuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgInN5c21ldHJpY3MuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogI2luY2x1ZGUgInNweS5oIgorI2luY2x1ZGUgInR3ZWFrLmgiCiAKICAgLyogTGFzdCBDT0xPUiBpZCAqLwogI2RlZmluZSBDT0xPUl9NQVggICBDT0xPUl9CVE5ISUdITElHSFQKQEAgLTg0LDggKzg1LDE4IEBACiAgICAgICAgIHJldHVybiBoYjsKICAgICB9CiAKLSAgICBTZXRCa0NvbG9yMzIoIGhEQywgR2V0U3lzQ29sb3IzMihDT0xPUl9XSU5ET1cpICk7CiAgICAgU2V0VGV4dENvbG9yMzIoIGhEQywgR2V0U3lzQ29sb3IzMihDT0xPUl9XSU5ET1dURVhUKSk7CisKKyAgICBpZiAoVFdFQUtfV2luOTVMb29rKSB7CisJaWYgKChjdGxUeXBlID09IENUTENPTE9SX0VESVQpIHx8IChjdGxUeXBlID09IENUTENPTE9SX0xJU1RCT1gpKQorCSAgICBTZXRCa0NvbG9yMzIoIGhEQywgR2V0U3lzQ29sb3IzMihDT0xPUl9XSU5ET1cpICk7CisJZWxzZSB7CisJICAgIFNldEJrQ29sb3IzMiggaERDLCBHZXRTeXNDb2xvcjMyKENPTE9SXzNERkFDRSkgKTsKKwkgICAgcmV0dXJuIEdldFN5c0NvbG9yQnJ1c2gzMihDT0xPUl8zREZBQ0UpOworCX0KKyAgICB9CisgICAgZWxzZQorCVNldEJrQ29sb3IzMiggaERDLCBHZXRTeXNDb2xvcjMyKENPTE9SX1dJTkRPVykgKTsKICAgICByZXR1cm4gR2V0U3lzQ29sb3JCcnVzaDMyKENPTE9SX1dJTkRPVyk7CiB9CiAKZGlmZiAtLWdpdCBhL3dpbmRvd3MvZXZlbnQuYyBiL3dpbmRvd3MvZXZlbnQuYwppbmRleCA5M2E4ZDAzLi4zODc3YTBlIDEwMDY0NAotLS0gYS93aW5kb3dzL2V2ZW50LmMKKysrIGIvd2luZG93cy9ldmVudC5jCkBAIC0zOTEsNyArMzkxLDcgQEAKIAogICAgIC8qIFByb2Nlc3MgY3VycmVudCBYIGV2ZW50IChhbmQgcG9zc2libHkgb3RoZXJzIHRoYXQgb2NjdXJyZWQgaW4gdGhlIG1lYW50aW1lKSAqLwogCi0gICAgZG8KKyAgICB3aGlsZSAoVFNYUGVuZGluZyggZGlzcGxheSApKQogICAgIHsKIAogI2lmZGVmIENPTkZJR19JUEMKQEAgLTQzOCw3ICs0MzgsNiBAQAogICAgICAgICB9CiAgICAgICAgIGVsc2UgRVZFTlRfUHJvY2Vzc0V2ZW50KCAmZXZlbnQgKTsKICAgICB9Ci0gICAgd2hpbGUgKFRTWFBlbmRpbmcoIGRpc3BsYXkgKSk7CiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKZGlmZiAtLWdpdCBhL3dpbmRvd3MvbWVzc2FnZS5jIGIvd2luZG93cy9tZXNzYWdlLmMKaW5kZXggMTVlZjQ4ZS4uZjZiYmMwZSAxMDA2NDQKLS0tIGEvd2luZG93cy9tZXNzYWdlLmMKKysrIGIvd2luZG93cy9tZXNzYWdlLmMKQEAgLTIzLDYgKzIzLDggQEAKICNpbmNsdWRlICJkZGUuaCIKICNpbmNsdWRlICJxdWV1ZS5oIgogI2luY2x1ZGUgIndpbnByb2MuaCIKKyNpbmNsdWRlICJwcm9jZXNzLmgiCisjaW5jbHVkZSAidGhyZWFkLmgiCiAjaW5jbHVkZSAib3B0aW9ucy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKQEAgLTExMzYsOCArMTEzOCwxMSBAQAogQk9PTDMyIFdJTkFQSSBQb3N0VGhyZWFkTWVzc2FnZTMyQShEV09SRCBpZFRocmVhZCAsIFVJTlQzMiBtZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0gKQogewotICAgRklYTUUoc2VuZG1zZywgIiguLi4pOiBTdHViXG4iKTsKLSAgIHJldHVybiBGQUxTRTsKKyAgIFRIREIgKnRoZGIgPSBUSFJFQURfSURfVE9fVEhEQihpZFRocmVhZCk7CisgICBpZiAoIXRoZGIgfHwgIXRoZGItPnByb2Nlc3MpIHJldHVybiBGQUxTRTsKKworICAgRklYTUUoc2VuZG1zZywgIiguLi4pOiBTaG91bGQgdXNlIHRocmVhZC1sb2NhbCBtZXNzYWdlIHF1ZXVlIVxuIik7CisgICByZXR1cm4gUG9zdEFwcE1lc3NhZ2UxNih0aGRiLT5wcm9jZXNzLT50YXNrLCBtZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvd2luZG93cy9ub25jbGllbnQuYyBiL3dpbmRvd3Mvbm9uY2xpZW50LmMKaW5kZXggZmU3ZTdjOS4uNzUyZjJjYyAxMDA2NDQKLS0tIGEvd2luZG93cy9ub25jbGllbnQuYworKysgYi93aW5kb3dzL25vbmNsaWVudC5jCkBAIC0xNTAsNyArMTUwLDcgQEAKICAgICAgICAgICAgIHJlY3QtPnRvcCAtPSBTWVNNRVRSSUNTX0NZQ0FQVElPTiAtIFNZU01FVFJJQ1NfQ1lCT1JERVI7CiAgICAgfQogICAgIGlmIChtZW51KSByZWN0LT50b3AgLT0gU1lTTUVUUklDU19DWU1FTlUgKyBTWVNNRVRSSUNTX0NZQk9SREVSICsgMjsKLSAgICBlbHNlIHJlY3QtPnRvcCArPSBTWVNNRVRSSUNTX0NZQk9SREVSOworICAgIGVsc2UgIGlmICghKHN0eWxlICYgV1NfQ0hJTEQpKSByZWN0LT50b3AgKz0gU1lTTUVUUklDU19DWUJPUkRFUjsKIAogICAgIGlmIChzdHlsZSAmIFdTX1ZTQ1JPTEwpIHJlY3QtPnJpZ2h0ICArPSBTWVNNRVRSSUNTX0NYVlNDUk9MTDsKICAgICBpZiAoc3R5bGUgJiBXU19IU0NST0xMKSByZWN0LT5ib3R0b20gKz0gU1lTTUVUUklDU19DWUhTQ1JPTEw7CmRpZmYgLS1naXQgYS93aW5kb3dzL3Byb3BlcnR5LmMgYi93aW5kb3dzL3Byb3BlcnR5LmMKaW5kZXggNDNiYzk3OC4uZjJmZmM4YSAxMDA2NDQKLS0tIGEvd2luZG93cy9wcm9wZXJ0eS5jCisrKyBiL3dpbmRvd3MvcHJvcGVydHkuYwpAQCAtMTgyLDcgKzE4Miw3IEBACiAgICAgICBUUkFDRShwcm9wLCAiJTA0eCAjJTA0eFxuIiwgaHduZCwgTE9XT1JEKHN0cikpOwogCiAKLSAgICBpZiAoIXBXbmQpIHJldHVybiBOVUxMOworICAgIGlmICghcFduZCkgcmV0dXJuIChIQU5ETEUzMikwOwogICAgIGlmIChISVdPUkQoc3RyKSkKICAgICB7CiAgICAgICAgIGF0b20gPSBHbG9iYWxGaW5kQXRvbTMyQSggc3RyICk7CmRpZmYgLS1naXQgYS93aW5kb3dzL3F1ZXVlLmMgYi93aW5kb3dzL3F1ZXVlLmMKaW5kZXggN2VjZDI1Ni4uYTM0ZTQ2MCAxMDA2NDQKLS0tIGEvd2luZG93cy9xdWV1ZS5jCisrKyBiL3dpbmRvd3MvcXVldWUuYwpAQCAtNzIsNiArNzIsNyBAQAogICovCiB2b2lkIFFVRVVFX1dhbGtRdWV1ZXModm9pZCkKIHsKKyAgICBjaGFyIG1vZHVsZVsxMF07CiAgICAgSFFVRVVFMTYgaFF1ZXVlID0gaEZpcnN0UXVldWU7CiAKICAgICBmcHJpbnRmKCBzdGRlcnIsICJRdWV1ZSBTaXplIE1zZ3MgVGFza1xuIiApOwpAQCAtODMsOSArODQsMTAgQEAKICAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIioqKiBCYWQgcXVldWUgaGFuZGxlICUwNHhcbiIsIGhRdWV1ZSApOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIGZwcmludGYoIHN0ZGVyciwgIiUwNHggJTVkICU0ZCAlMDR4ICVzXG4iLAotICAgICAgICAgICAgICAgICBoUXVldWUsIHF1ZXVlLT5tc2dTaXplLCBxdWV1ZS0+bXNnQ291bnQsIHF1ZXVlLT5oVGFzaywKLSAgICAgICAgICAgICAgICAgTU9EVUxFX0dldE1vZHVsZU5hbWUoIHF1ZXVlLT5oVGFzayApICk7CisgICAgICAgIGlmICghR2V0TW9kdWxlTmFtZSggcXVldWUtPmhUYXNrLCBtb2R1bGUsIHNpemVvZihtb2R1bGUgKSkpCisgICAgICAgICAgICBzdHJjcHkoIG1vZHVsZSwgIj8/PyIgKTsKKyAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiJTA0eCAlNWQgJTRkICUwNHggJXNcbiIsIGhRdWV1ZSwgcXVldWUtPm1zZ1NpemUsCisgICAgICAgICAgICAgICAgIHF1ZXVlLT5tc2dDb3VudCwgcXVldWUtPmhUYXNrLCBtb2R1bGUgKTsKICAgICAgICAgaFF1ZXVlID0gcXVldWUtPm5leHQ7CiAgICAgfQogICAgIGZwcmludGYoIHN0ZGVyciwgIlxuIiApOwpAQCAtODE2LDcgKzgxOCw3IEBACiAgKi8KIERXT1JEIFdJTkFQSSBXYWl0Rm9ySW5wdXRJZGxlIChIQU5ETEUzMiBoUHJvY2VzcywgRFdPUkQgZHdUaW1lT3V0KQogewotICBGSVhNRSAobXNnLCAiKGhQcm9jZXNzPSVkLCBkd1RpbWVPdXQ9JWQpOiBzdHViXG4iLCBoUHJvY2VzcywgZHdUaW1lT3V0KTsKKyAgRklYTUUgKG1zZywgIihoUHJvY2Vzcz0lZCwgZHdUaW1lT3V0PSVsZCk6IHN0dWJcbiIsIGhQcm9jZXNzLCBkd1RpbWVPdXQpOwogCiAgIHJldHVybiBXQUlUX1RJTUVPVVQ7CiB9CmRpZmYgLS1naXQgYS93aW5kb3dzL3N5c2NvbG9yLmMgYi93aW5kb3dzL3N5c2NvbG9yLmMKaW5kZXggYmFmM2FlNS4uNGFmNDc3YiAxMDA2NDQKLS0tIGEvd2luZG93cy9zeXNjb2xvci5jCisrKyBiL3dpbmRvd3Mvc3lzY29sb3IuYwpAQCAtNDMsNyArNDMsNyBAQAogCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IERlZlN5c0NvbG9yczk1W10gPQogewotICAgICJTY3JvbGxiYXIiLCAiMjI0IDIyNCAyMjQiLCAgICAgIC8qIENPTE9SX1NDUk9MTEJBUiAgICAgICAgICAgKi8KKyAgICAiU2Nyb2xsYmFyIiwgIjIyMyAyMjMgMjIzIiwgICAgICAvKiBDT0xPUl9TQ1JPTExCQVIgICAgICAgICAgICovCiAgICAgIkJhY2tncm91bmQiLCAiMTkyIDE5MiAxOTIiLCAgICAgLyogQ09MT1JfQkFDS0dST1VORCAgICAgICAgICAqLwogICAgICJBY3RpdmVUaXRsZSIsICIwIDY0IDEyOCIsICAgICAgIC8qIENPTE9SX0FDVElWRUNBUFRJT04gICAgICAgKi8KICAgICAiSW5hY3RpdmVUaXRsZSIsICIyNTUgMjU1IDI1NSIsICAvKiBDT0xPUl9JTkFDVElWRUNBUFRJT04gICAgICovCkBAIC01Niw3ICs1Niw3IEBACiAgICAgIkFjdGl2ZUJvcmRlciIsICIxMjggMTI4IDEyOCIsICAgLyogQ09MT1JfQUNUSVZFQk9SREVSICAgICAgICAqLwogICAgICJJbmFjdGl2ZUJvcmRlciIsICIyNTUgMjU1IDI1NSIsIC8qIENPTE9SX0lOQUNUSVZFQk9SREVSICAgICAgKi8KICAgICAiQXBwV29ya3NwYWNlIiwgIjI1NSAyNTUgMjMyIiwgICAvKiBDT0xPUl9BUFBXT1JLU1BBQ0UgICAgICAgICovCi0gICAgIkhpbGlnaHQiLCAiMjI0IDIyNCAyMjQiLCAgICAgICAgLyogQ09MT1JfSElHSExJR0hUICAgICAgICAgICAqLworICAgICJIaWxpZ2h0IiwgIjIyMyAyMjMgMjIzIiwgICAgICAgIC8qIENPTE9SX0hJR0hMSUdIVCAgICAgICAgICAgKi8KICAgICAiSGlsaWdodFRleHQiLCAiMCAwIDAiLCAgICAgICAgICAvKiBDT0xPUl9ISUdITElHSFRURVhUICAgICAgICovCiAgICAgIkJ1dHRvbkZhY2UiLCAiMTkyIDE5MiAxOTIiLCAgICAgLyogQ09MT1JfQlRORkFDRSAgICAgICAgICAgICAqLwogICAgICJCdXR0b25TaGFkb3ciLCAiMTI4IDEyOCAxMjgiLCAgIC8qIENPTE9SX0JUTlNIQURPVyAgICAgICAgICAgKi8KQEAgLTY0LDggKzY0LDggQEAKICAgICAiQnV0dG9uVGV4dCIsICIwIDAgMCIsICAgICAgICAgICAvKiBDT0xPUl9CVE5URVhUICAgICAgICAgICAgICovCiAgICAgIkluYWN0aXZlVGl0bGVUZXh0IiwgIjAgMCAwIiwgICAgLyogQ09MT1JfSU5BQ1RJVkVDQVBUSU9OVEVYVCAqLwogICAgICJCdXR0b25IaWxpZ2h0IiwgIjI1NSAyNTUgMjU1IiwgIC8qIENPTE9SX0JUTkhJR0hMSUdIVCAgICAgICAgKi8KLSAgICAiM0REYXJrU2hhZG93IiwgIjMyIDMyIDMyIiwgICAgICAvKiBDT0xPUl8zRERLU0hBRE9XICAgICAgICAgICovCi0gICAgIjNETGlnaHQiLCAiMTkyIDE5MiAxOTIiLCAgICAgICAgLyogQ09MT1JfM0RMSUdIVCAgICAgICAgICAgICAqLworICAgICIzRERhcmtTaGFkb3ciLCAiMCAwIDAiLCAgICAgICAgIC8qIENPTE9SXzNEREtTSEFET1cgICAgICAgICAgKi8KKyAgICAiM0RMaWdodCIsICIyMjMgMjIzIDIyMyIsICAgICAgICAvKiBDT0xPUl8zRExJR0hUICAgICAgICAgICAgICovCiAgICAgIkluZm9UZXh0IiwgIjAgMCAwIiwgICAgICAgICAgICAgLyogQ09MT1JfSU5GT1RFWFQgICAgICAgICAgICAqLwogICAgICJJbmZvQmFja2dyb3VuZCIsICIyNTUgMjU1IDE5MiIgIC8qIENPTE9SX0lORk9CSyAgICAgICAgICAgICAgKi8KIH07CmRpZmYgLS1naXQgYS93aW5kb3dzL3dpbnBvcy5jIGIvd2luZG93cy93aW5wb3MuYwppbmRleCA1MTZmNmU4Li4wNDNjZjc1IDEwMDY0NAotLS0gYS93aW5kb3dzL3dpbnBvcy5jCisrKyBiL3dpbmRvd3Mvd2lucG9zLmMKQEAgLTUsNiArNSw3IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICAgMTk5NSwgMTk5NiBBbGV4IEtvcm9ia2EKICAqLwogCisjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSAidHNfeGxpYi5oIgogI2luY2x1ZGUgInRzX3h1dGlsLmgiCiAjaW5jbHVkZSA8WDExL1hhdG9tLmg+CkBAIC0xMDEwLDYgKzEwMTEsMTkgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgU2hvd1dpbmRvd0FzeW5jMzIgICAoVVNFUjMyLjUzNSkKKyAqCisgKiBkb2Vzbid0IHdhaXQ7IHJldHVybnMgaW1tZWRpYXRlbHkuCisgKiB1c2VkIGJ5IHRocmVhZHMgdG8gdG9nZ2xlIHdpbmRvd3MgaW4gb3RoZXIgKHBvc3NpYmx5IGhhbmdpbmcpIHRocmVhZHMKKyAqLworQk9PTDMyIFdJTkFQSSBTaG93V2luZG93QXN5bmMzMiggSFdORDMyIGh3bmQsIElOVDMyIGNtZCApCit7CisgICAgLyogRklYTUU6IGRvZXMgU2hvd1dpbmRvdzMyKCkgcmV0dXJuIGltbWVkaWF0ZWx5ID8gKi8KKyAgICByZXR1cm4gU2hvd1dpbmRvdzMyKGh3bmQsIGNtZCk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgU2hvd1dpbmRvdzE2ICAgKFVTRVIuNDIpCiAgKi8KIEJPT0wxNiBXSU5BUEkgU2hvd1dpbmRvdzE2KCBIV05EMTYgaHduZCwgSU5UMTYgY21kICkgCkBAIC0xMDE5LDcgKzEwMzMsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFNob3dXaW5kb3czMiAgIChVU0VSLjQyKQorICogICAgICAgICAgIFNob3dXaW5kb3czMiAgIChVU0VSMzIuNTM0KQogICovCiBCT09MMzIgV0lOQVBJIFNob3dXaW5kb3czMiggSFdORDMyIGh3bmQsIElOVDMyIGNtZCApIAogeyAgICAKQEAgLTI0OTksMTkgKzI1MTMsMjQgQEAKICAgICBEV1AgKnBEV1A7CiAgICAgaW50IGk7CiAgICAgSERXUDMyIG5ld2hkd3AgPSBoZHdwOwotICAgIEhXTkQzMiBwYXJlbnQ7CisgICAgLyogSFdORDMyIHBhcmVudDsgKi8KICAgICBXTkQgKnBXbmQ7CiAKICAgICBwRFdQID0gKERXUCAqKSBVU0VSX0hFQVBfTElOX0FERFIoIGhkd3AgKTsKICAgICBpZiAoIXBEV1ApIHJldHVybiAwOwogICAgIGlmIChod25kID09IEdldERlc2t0b3BXaW5kb3czMigpKSByZXR1cm4gMDsKIAotICAgIC8qIEFsbCB0aGUgd2luZG93cyBvZiBhIERlZmVyV2luZG93UG9zKCkgbXVzdCBoYXZlIHRoZSBzYW1lIHBhcmVudCAqLwogICAgIGlmICghKHBXbmQ9V0lOX0ZpbmRXbmRQdHIoIGh3bmQgKSkpIHsKICAgICAgICAgVVNFUl9IRUFQX0ZSRUUoIGhkd3AgKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogICAgIAkKKy8qIE51bWVnYSBCb3VuZHMgQ2hlY2tlciBEZW1vIGRpc2xpa2VzIHRoZSBmb2xsb3dpbmcgY29kZS4KKyAgIEluIGZhY3QsIEkndmUgbm90IGJlZW4gYWJsZSB0byBmaW5kIGFueSAic2FtZSBwYXJlbnQiIHJlcXVpcmVtZW50IGluIGFueSBkb2N1CisgICBbQU0gOTgwNTA5XQorICovCisjaWYgMAorICAgIC8qIEFsbCB0aGUgd2luZG93cyBvZiBhIERlZmVyV2luZG93UG9zKCkgbXVzdCBoYXZlIHRoZSBzYW1lIHBhcmVudCAqLwogICAgIHBhcmVudCA9IHBXbmQtPnBhcmVudC0+aHduZFNlbGY7CiAgICAgaWYgKHBEV1AtPmFjdHVhbENvdW50ID09IDApIHBEV1AtPmh3bmRQYXJlbnQgPSBwYXJlbnQ7CiAgICAgZWxzZSBpZiAocGFyZW50ICE9IHBEV1AtPmh3bmRQYXJlbnQpCkBAIC0yNTE5LDYgKzI1MzgsNyBAQAogICAgICAgICBVU0VSX0hFQVBfRlJFRSggaGR3cCApOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CisjZW5kaWYKIAogICAgIGZvciAoaSA9IDA7IGkgPCBwRFdQLT5hY3R1YWxDb3VudDsgaSsrKQogICAgIHsKZGlmZiAtLWdpdCBhL3dpbmRvd3Mvd2lucHJvYy5jIGIvd2luZG93cy93aW5wcm9jLmMKaW5kZXggNTE3MjcyYi4uN2Y3NzdjZiAxMDA2NDQKLS0tIGEvd2luZG93cy93aW5wcm9jLmMKKysrIGIvd2luZG93cy93aW5wcm9jLmMKQEAgLTE0MDYsNiArMTQwNiw5IEBACiAgICAgICAgICAgICAqcGxwYXJhbSA9IE1BS0VMUEFSQU0oIChIV05EMTYpKnBscGFyYW0sIEhJV09SRCh3UGFyYW0zMikpOwogICAgICAgICAvKiBlbHNlIG5vdGhpbmcgdG8gZG8gKi8KICAgICAgICAgcmV0dXJuIDA7CisgICAgY2FzZSBXTV9OT1RJRlk6CisJKnBscGFyYW0gPSBNYXBMUyggKE5NSERSICopKnBscGFyYW0gKTsgLyogTk1IRFIgaXMgYWxyZWFkeSAzMi1iaXQgKi8KKwlyZXR1cm4gMTsKICAgICBjYXNlIFdNX1NFVFRFWFQ6CiAgICAgICAgIHsKICAgICAgICAgICAgIExQU1RSIHN0ciA9IFNFR1BUUl9TVFJEVVAoIChMUFNUUikqcGxwYXJhbSApOwpAQCAtMTU3NCw2ICsxNTc3LDkgQEAKICAgICAgICAgICAgIFNFR1BUUl9GUkVFKHdwKTsKICAgICAgICAgfQogICAgICAgICBicmVhazsKKyAgICBjYXNlIFdNX05PVElGWToKKwlVbk1hcExTKHAxNi0+bFBhcmFtKTsKKwlicmVhazsKICAgICB9CiB9CiAK