ZGlmZiAtLWdpdCBhL2F1dG8vY2MvZ2NjIGIvYXV0by9jYy9nY2MKaW5kZXggYzViNGU3NC4uNDZiMGFhYiAxMDA2NDQKLS0tIGEvYXV0by9jYy9nY2MKKysrIGIvYXV0by9jYy9nY2MKQEAgLTIsOCArMiwxNSBAQAogIyBDb3B5cmlnaHQgKEMpIElnb3IgU3lzb2V2CiAKIAotIyBnY2MgMi43LjIuMywgMi44LjEsIDIuOTUuNCwKKyMgZ2NjIDIuNy4yLjMsIDIuOC4xLCAyLjk1LjQsIGVnY3MtMS4xLjIKICMgICAgIDMuMC40LCAzLjEuMSwgMy4yLjMsIDMuMy4yLCAzLjMuMywgMy4zLjQsIDMuNC4wLCAzLjQuMgorIyAgICAgNC4wLjAKKworCitOR1hfR0NDX1ZFUj1gJENDIC12IDI+JjEgfCBncmVwICdnY2MgdmVyc2lvbicgMj4mMSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgfCBzZWQgLWUgJ3MvXi4qIHZlcnNpb24gXCguKlwpL1wxLydgCisKK2VjaG8gIiArIGdjYyB2ZXJzaW9uOiAkTkdYX0dDQ19WRVIiCiAKIAogIyBTb2xhcmlzIDcncyAvdXNyL2Njcy9iaW4vYXMgZG9lcyBub3Qgc3VwcG9ydCAiLXBpcGUiCkBAIC0yNCw3ICszMSw2IEBACiAgICAgUElQRT0iLXBpcGUiCiBmaQogCi0KICMgb3B0aW1pemF0aW9ucwogCiAjTkdYX0dDQ19PUFQ9Ii1PMiIKQEAgLTYxLDggKzY3LDEyIEBACiBlc2FjCiAKIAotIyBTVFVCIGZvciBiYXRjaCBidWlsZHMKLWlmIFsgJENDID0gZ2NjMjcgXTsgdGhlbiBDUFVfT1BUPTsgZmkKK2Nhc2UgIiROR1hfR0NDX1ZFUiIgaW4KKyAgICAyLjcqKQorICAgICAgICAjIGJhdGNoIGJ1aWxkCisgICAgICAgIENQVV9PUFQ9CisgICAgOzsKK2VzYWMKIAogCiBDRkxBR1M9IiRDRkxBR1MgJFBJUEUgJENQVV9PUFQiCkBAIC05NSw4ICsxMDUsMjEgQEAKICNDRkxBR1M9IiRDRkxBR1MgLVdjb252ZXJzaW9uIiAKICNDRkxBR1M9IiRDRkxBR1MgLVdpbmxpbmUiCiAKLSMgd2UgaGF2ZSBhIGxvdCBvZiB0aGUgdW51c2VkIGZ1bmN0aW9uIGFyZ3VtZW50cwotQ0ZMQUdTPSIkQ0ZMQUdTIC1Xbm8tdW51c2VkIgorCitjYXNlICIkTkdYX0dDQ19WRVIiIGluCisgICAgMy4qIHwgNC4qICkKKyAgICAgICAgIyB3ZSBoYXZlIGEgbG90IG9mIHRoZSB1bnVzZWQgZnVuY3Rpb24gYXJndW1lbnRzCisgICAgICAgIENGTEFHUz0iJENGTEFHUyAtV25vLXVudXNlZC1wYXJhbWV0ZXIiCisgICAgICAgIENGTEFHUz0iJENGTEFHUyAtV25vLXVudXNlZC1mdW5jdGlvbiIKKyAgICAgICAgI0NGTEFHUz0iJENGTEFHUyAtV3VucmVhY2hhYmxlLWNvZGUiCisgICAgOzsKKworICAgICopCisgICAgICAgICMgd2UgaGF2ZSBhIGxvdCBvZiB0aGUgdW51c2VkIGZ1bmN0aW9uIGFyZ3VtZW50cworICAgICAgICBDRkxBR1M9IiRDRkxBR1MgLVduby11bnVzZWQiCisgICAgOzsKK2VzYWMKKwogCiAjIHN0b3Agb24gd2FybmluZwogQ0ZMQUdTPSIkQ0ZMQUdTIC1XZXJyb3IiCmRpZmYgLS1naXQgYS9hdXRvL2NjL2ljYyBiL2F1dG8vY2MvaWNjCmluZGV4IDQ3YjkxZDcuLmI2YWU3NTkgMTAwNjQ0Ci0tLSBhL2F1dG8vY2MvaWNjCisrKyBiL2F1dG8vY2MvaWNjCkBAIC03LDcgKzcsNyBAQAogIyBvcHRpbWl6YXRpb25zCiAKIENGTEFHUz0iJENGTEFHUyAtTyIKLSMgaW5saW5lIGZ1bmN0aW9ucyBkZWNsYXJlZCB3aXRoIF9faW5saW5lCisjIGlubGluZSB0aGUgZnVuY3Rpb25zIGRlY2xhcmVkIHdpdGggX19pbmxpbmUKICNDRkxBR1M9IiRDRkxBR1MgLU9iMSIKICMgaW5saW5lIGFueSBmdW5jdGlvbiwgYXQgdGhlIGNvbXBpbGVyJ3MgZGlzY3JldGlvbgogQ0ZMQUdTPSIkQ0ZMQUdTIC1PYjIiCkBAIC01NCwxNCArNTQsMzQgQEAKIAogIyB3YXJuaW5ncwogCi1DRkxBR1M9IiRDRkxBR1MgLXcxIgotI0NGTEFHUz0iJENGTEFHUyAtdzIiCitDRkxBR1M9IiRDRkxBR1MgLXcyIgogCi0jIGRpc2FibGUgdGhlIElDQyA4LjEgZXJyb3JzOgotIyAgICBlcnJvciAjMTgxOiBhcmd1bWVudCBpcyBpbmNvbXBhdGlibGUgd2l0aCBjb3JyZXNwb25kaW5nIGZvcm1hdAotIyAgICAgICAgICAgICAgICBzdHJpbmcgY29udmVyc2lvbgotIyAgICBlcnJvciAjMjY5OiBpbnZhbGlkIGZvcm1hdCBzdHJpbmcgY29udmVyc2lvbgotQ0ZMQUdTPSIkQ0ZMQUdTIC13ZDE4MSAtd2QyNjkiCisjIGRpc2FibGUgc29tZSB3YXJuaW5ncworCisjIGludmFsaWQgdHlwZSBjb252ZXJzaW9uOiAiaW50IiB0byAiY2hhciAqIgorQ0ZMQUdTPSIkQ0ZMQUdTIC13ZDE3MSIKKyMgYXJndW1lbnQgaXMgaW5jb21wYXRpYmxlIHdpdGggY29ycmVzcG9uZGluZyBmb3JtYXQgc3RyaW5nIGNvbnZlcnNpb24KK0NGTEFHUz0iJENGTEFHUyAtd2QxODEiCisjIHplcm8gdXNlZCBmb3IgdW5kZWZpbmVkIHByZXByb2Nlc3NpbmcgaWRlbnRpZmllcgorQ0ZMQUdTPSIkQ0ZMQUdTIC13ZDE5MyIKKyMgaW52YWxpZCBmb3JtYXQgc3RyaW5nIGNvbnZlcnNpb24KK0NGTEFHUz0iJENGTEFHUyAtd2QyNjkiCisjIGNvbnZlcnNpb24gZnJvbSAibG9uZyBsb25nIiB0byAic2l6ZV90IiBtYXkgbG9zZSBzaWduaWZpY2FudCBiaXRzCitDRkxBR1M9IiRDRkxBR1MgLXdkODEwIgorIyBwYXJhbWV0ZXIgd2FzIG5ldmVyIHJlZmVyZW5jZWQKK0NGTEFHUz0iJENGTEFHUyAtd2Q4NjkiCisKKyMgU1RVQgorIyBlbnVtZXJhdGVkIHR5cGUgbWl4ZWQgd2l0aCBhbm90aGVyIHR5cGUKK0NGTEFHUz0iJENGTEFHUyAtd2QxODgiCisjIGNvbnRyb2xsaW5nIGV4cHJlc3Npb24gaXMgY29uc3RhbnQKK0NGTEFHUz0iJENGTEFHUyAtd2QyNzkiCisjIG9wZXJhbmRzIGFyZSBldmFsdWF0ZWQgaW4gdW5zcGVjaWZpZWQgb3JkZXIKK0NGTEFHUz0iJENGTEFHUyAtd2Q5ODEiCisjIGV4dGVybmFsIGRlZmluaXRpb24gd2l0aCBubyBwcmlvciBkZWNsYXJhdGlvbgorQ0ZMQUdTPSIkQ0ZMQUdTIC13ZDE0MTgiCisjIGV4dGVybmFsIGRlY2xhcmF0aW9uIGluIHByaW1hcnkgc291cmNlIGZpbGUKK0NGTEFHUz0iJENGTEFHUyAtd2QxNDE5IgogCiAjIHN0b3Agb24gd2FybmluZwogQ0ZMQUdTPSIkQ0ZMQUdTIC1XZXJyb3IiCmRpZmYgLS1naXQgYS9hdXRvL2xpYi9vcGVuc3NsL21ha2UgYi9hdXRvL2xpYi9vcGVuc3NsL21ha2UKaW5kZXggYzFhZWM4OC4uZmYwNWEzOCAxMDA2NDQKLS0tIGEvYXV0by9saWIvb3BlbnNzbC9tYWtlCisrKyBiL2F1dG8vbGliL29wZW5zc2wvbWFrZQpAQCAtMSwxNyArMSwyOCBAQAogCiAjIENvcHlyaWdodCAoQykgSWdvciBTeXNvZXYKIAoraWYgdGVzdCAtbiAiJE9QRU5TU0xfT1BUIjsgdGhlbgorICAgIE5HWF9PUEVOU1NMX0NPTkZJRz0iLi9Db25maWd1cmUgXCIkT1BFTlNTTF9PUFRcIiIKK2Vsc2UKKyAgICBOR1hfT1BFTlNTTF9DT05GSUc9Ii4vY29uZmlnIgorZmkKKworaWYgdGVzdCAtbiAiJFVTRV9USFJFQURTIjsgdGhlbgorICAgIE5HWF9PUEVOU1NMX0NPTkZJRz0iJE5HWF9PUEVOU1NMX0NPTkZJRyB0aHJlYWRzIgorZmkKIAogY2FzZSAiJE5HWF9QTEFURk9STSIgaW4KICAgICAqKQotICAgICAgICBlY2hvICIkT1BFTlNTTC9saWJzc2wuYToiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gJE1BS0VGSUxFCi0gICAgICAgIGVjaG8gIgljZCAkT1BFTlNTTCBcXCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+ICRNQUtFRklMRQotICAgICAgICBlY2hvICIJJiYgXCQoTUFLRSkgY2xlYW4gXFwiICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiAkTUFLRUZJTEUKLSAgICAgICAgZWNobyAiCSYmIENDPVwiXCQoQ0MpXCIgXFwiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gJE1BS0VGSUxFCi0gICAgICAgIGVjaG8gIgkuL2NvbmZpZyB0aHJlYWRzIG5vLXNoYXJlZCBcXCIgICAgICAgICAgICAgICAgICAgID4+ICRNQUtFRklMRQotICAgICAgICBlY2hvICIJJiYgXCQoTUFLRSkiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiAkTUFLRUZJTEUKKyAgICAgICAgY2F0IDw8IEVORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gJE5HWF9NQUtFRklMRQorCiskT1BFTlNTTC9saWJzc2wuYToKKwljZCAkT1BFTlNTTCBcXAorCSYmIFwkKE1BS0UpIGNsZWFuIFxcCisJJiYgJE5HWF9PUEVOU1NMX0NPTkZJRyBuby1zaGFyZWQgXFwKKwkmJiBcJChNQUtFKQorCitFTkQKKwogICAgIDs7CiAKIGVzYWMKLQotZWNobyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gJE1BS0VGSUxFCmRpZmYgLS1naXQgYS9hdXRvL29wdGlvbnMgYi9hdXRvL29wdGlvbnMKaW5kZXggOGI5NDExMy4uYTgxNDZkOSAxMDA2NDQKLS0tIGEvYXV0by9vcHRpb25zCisrKyBiL2F1dG8vb3B0aW9ucwpAQCAtMTUzLDYgKzE1Myw3IEBACiAgICAgICAgIC0td2l0aC1wY3JlLW9wdD0qKSAgICAgICAgICAgICAgIFBDUkVfT1BUPSIkdmFsdWUiICAgICAgICAgIDs7CiAKICAgICAgICAgLS13aXRoLW9wZW5zc2w9KikgICAgICAgICAgICAgICAgT1BFTlNTTD0iJHZhbHVlIiAgICAgICAgICAgOzsKKyAgICAgICAgLS13aXRoLW9wZW5zc2wtb3B0PSopICAgICAgICAgICAgT1BFTlNTTF9PUFQ9IiR2YWx1ZSIgICAgICAgOzsKIAogICAgICAgICAtLXdpdGgtbWQ1PSopICAgICAgICAgICAgICAgICAgICBNRDU9IiR2YWx1ZSIgICAgICAgICAgICAgICA7OwogICAgICAgICAtLXdpdGgtbWQ1LW9wdD0qKSAgICAgICAgICAgICAgICBNRDVfT1BUPSIkdmFsdWUiICAgICAgICAgICA7OwpAQCAtMjAzLDYgKzIwNCw3IEBACiAgIC0td2l0aC1odHRwX3NzbF9tb2R1bGUgICAgICAgICAgICAgZW5hYmxlIG5neF9odHRwX3NzbF9tb2R1bGUKICAgLS13aXRob3V0LWh0dHBfY2hhcnNldF9tb2R1bGUgICAgICBkaXNhYmxlIG5neF9odHRwX2NoYXJzZXRfbW9kdWxlCiAgIC0td2l0aG91dC1odHRwX2d6aXBfbW9kdWxlICAgICAgICAgZGlzYWJsZSBuZ3hfaHR0cF9nemlwX21vZHVsZQorICAtLXdpdGhvdXQtaHR0cF9zc2lfbW9kdWxlICAgICAgICAgIGRpc2FibGUgbmd4X2h0dHBfc3NpX21vZHVsZQogICAtLXdpdGhvdXQtaHR0cF91c2VyaWRfbW9kdWxlICAgICAgIGRpc2FibGUgbmd4X2h0dHBfdXNlcmlkX21vZHVsZQogICAtLXdpdGhvdXQtaHR0cF9hY2Nlc3NfbW9kdWxlICAgICAgIGRpc2FibGUgbmd4X2h0dHBfYWNjZXNzX21vZHVsZQogICAtLXdpdGhvdXQtaHR0cF9hdXRvaW5kZXhfbW9kdWxlICAgIGRpc2FibGUgbmd4X2h0dHBfYXV0b2luZGV4X21vZHVsZQpAQCAtMjQxLDYgKzI0Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVudGl1bSwgcGVudGl1bXBybwogCiAgIC0td2l0aC1vcGVuc3NsPURJUiAgICAgICAgICAgICAgICAgc2V0IHBhdGggdG8gT3BlblNTTCBsaWJyYXJ5IHNvdXJjZXMKKyAgLS13aXRoLW9wZW5zc2wtb3B0PU9QVElPTlMgICAgICAgICBzZXQgYWRkaXRpb25hbCBvcHRpb25zIGZvciBPcGVuU1NMIGJ1aWxkaW5nCiAKICAgLS13aXRoLWRlYnVnICAgICAgICAgICAgICAgICAgICAgICBlbmFibGUgdGhlIGRlYnVnZ2luZyBsb2dnaW5nCiAKZGlmZiAtLWdpdCBhL2F1dG8vc291cmNlcyBiL2F1dG8vc291cmNlcwppbmRleCA1NzkxNWRlLi4yODg0OTVmIDEwMDY0NAotLS0gYS9hdXRvL3NvdXJjZXMKKysrIGIvYXV0by9zb3VyY2VzCkBAIC0yNDEsMjcgKzI0MSwyNyBAQAogICAgICAgICAgICBzcmMvaHR0cC9uZ3hfaHR0cF92YXJpYWJsZXMuaCBcCiAgICAgICAgICAgIHNyYy9odHRwL25neF9odHRwX3Vwc3RyZWFtLmggXAogICAgICAgICAgICBzcmMvaHR0cC9uZ3hfaHR0cF9idXN5X2xvY2suaCBcCi0gICAgICAgICAgIHNyYy9odHRwL25neF9odHRwX2xvZ19oYW5kbGVyLmgiCisgICAgICAgICAgIHNyYy9odHRwL25neF9odHRwX2xvZ19tb2R1bGUuaCIKIAogSFRUUF9TUkNTPSJzcmMvaHR0cC9uZ3hfaHR0cC5jIFwKICAgICAgICAgICAgc3JjL2h0dHAvbmd4X2h0dHBfY29yZV9tb2R1bGUuYyBcCiAgICAgICAgICAgIHNyYy9odHRwL25neF9odHRwX3NwZWNpYWxfcmVzcG9uc2UuYyBcCiAgICAgICAgICAgIHNyYy9odHRwL25neF9odHRwX3JlcXVlc3QuYyBcCiAgICAgICAgICAgIHNyYy9odHRwL25neF9odHRwX3BhcnNlLmMgXAotICAgICAgICAgICBzcmMvaHR0cC9uZ3hfaHR0cF9oZWFkZXJfZmlsdGVyLmMgXAotICAgICAgICAgICBzcmMvaHR0cC9uZ3hfaHR0cF93cml0ZV9maWx0ZXIuYyBcCi0gICAgICAgICAgIHNyYy9odHRwL25neF9odHRwX2NvcHlfZmlsdGVyLmMgXAotICAgICAgICAgICBzcmMvaHR0cC9uZ3hfaHR0cF9sb2dfaGFuZGxlci5jIFwKKyAgICAgICAgICAgc3JjL2h0dHAvbmd4X2h0dHBfaGVhZGVyX2ZpbHRlcl9tb2R1bGUuYyBcCisgICAgICAgICAgIHNyYy9odHRwL25neF9odHRwX3dyaXRlX2ZpbHRlcl9tb2R1bGUuYyBcCisgICAgICAgICAgIHNyYy9odHRwL25neF9odHRwX2NvcHlfZmlsdGVyX21vZHVsZS5jIFwKKyAgICAgICAgICAgc3JjL2h0dHAvbmd4X2h0dHBfbG9nX21vZHVsZS5jIFwKICAgICAgICAgICAgc3JjL2h0dHAvbmd4X2h0dHBfcmVxdWVzdF9ib2R5LmMgXAogICAgICAgICAgICBzcmMvaHR0cC9uZ3hfaHR0cF92YXJpYWJsZXMuYyBcCiAgICAgICAgICAgIHNyYy9odHRwL25neF9odHRwX3Vwc3RyZWFtLmMgXAogICAgICAgICAgICBzcmMvaHR0cC9uZ3hfaHR0cF9wYXJzZV90aW1lLmMgXAotICAgICAgICAgICBzcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3N0YXRpY19oYW5kbGVyLmMgXAotICAgICAgICAgICBzcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2luZGV4X2hhbmRsZXIuYyBcCi0gICAgICAgICAgIHNyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfY2h1bmtlZF9maWx0ZXIuYyBcCi0gICAgICAgICAgIHNyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfcmFuZ2VfZmlsdGVyLmMgXAotICAgICAgICAgICBzcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2hlYWRlcnNfZmlsdGVyLmMgXAotICAgICAgICAgICBzcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX25vdF9tb2RpZmllZF9maWx0ZXIuYyIKKyAgICAgICAgICAgc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9zdGF0aWNfbW9kdWxlLmMgXAorICAgICAgICAgICBzcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2luZGV4X21vZHVsZS5jIFwKKyAgICAgICAgICAgc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9jaHVua2VkX2ZpbHRlcl9tb2R1bGUuYyBcCisgICAgICAgICAgIHNyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfcmFuZ2VfZmlsdGVyX21vZHVsZS5jIFwKKyAgICAgICAgICAgc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9oZWFkZXJzX2ZpbHRlcl9tb2R1bGUuYyBcCisgICAgICAgICAgIHNyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfbm90X21vZGlmaWVkX2ZpbHRlcl9tb2R1bGUuYyIKIAogIyBTVFVCCiBIVFRQX1NSQ1M9IiRIVFRQX1NSQ1Mgc3JjL2h0dHAvbmd4X2h0dHBfYnVzeV9sb2NrLmMiCkBAIC0yNzEsMzEgKzI3MSwzMSBAQAogCiAKIEhUVFBfQ0hBUlNFVF9GSUxURVJfTU9EVUxFPW5neF9odHRwX2NoYXJzZXRfZmlsdGVyX21vZHVsZQotSFRUUF9DSEFSU0VUX1NSQ1M9c3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9jaGFyc2V0X2ZpbHRlci5jCitIVFRQX0NIQVJTRVRfU1JDUz1zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2NoYXJzZXRfZmlsdGVyX21vZHVsZS5jCiAKIAogSFRUUF9HWklQX0ZJTFRFUl9NT0RVTEU9bmd4X2h0dHBfZ3ppcF9maWx0ZXJfbW9kdWxlCi1IVFRQX0daSVBfU1JDUz1zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2d6aXBfZmlsdGVyLmMKK0hUVFBfR1pJUF9TUkNTPXNyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfZ3ppcF9maWx0ZXJfbW9kdWxlLmMKIAogCiBIVFRQX1NTSV9GSUxURVJfTU9EVUxFPW5neF9odHRwX3NzaV9maWx0ZXJfbW9kdWxlCi1IVFRQX1NTSV9TUkNTPXNyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfc3NpX2ZpbHRlci5jCitIVFRQX1NTSV9TUkNTPXNyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfc3NpX2ZpbHRlcl9tb2R1bGUuYwogCiAKIEhUVFBfVVNFUklEX0ZJTFRFUl9NT0RVTEU9bmd4X2h0dHBfdXNlcmlkX2ZpbHRlcl9tb2R1bGUKLUhUVFBfVVNFUklEX1NSQ1M9c3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF91c2VyaWRfZmlsdGVyLmMKK0hUVFBfVVNFUklEX1NSQ1M9c3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF91c2VyaWRfZmlsdGVyX21vZHVsZS5jCiAKIAogSFRUUF9BQ0NFU1NfTU9EVUxFPW5neF9odHRwX2FjY2Vzc19tb2R1bGUKLUhUVFBfQUNDRVNTX1NSQ1M9c3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9hY2Nlc3NfaGFuZGxlci5jCitIVFRQX0FDQ0VTU19TUkNTPXNyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfYWNjZXNzX21vZHVsZS5jCiAKIAogSFRUUF9BVVRPSU5ERVhfTU9EVUxFPW5neF9odHRwX2F1dG9pbmRleF9tb2R1bGUKLUhUVFBfQVVUT0lOREVYX1NSQ1M9c3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9hdXRvaW5kZXhfaGFuZGxlci5jCitIVFRQX0FVVE9JTkRFWF9TUkNTPXNyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfYXV0b2luZGV4X21vZHVsZS5jCiAKIAogSFRUUF9TVEFUVVNfTU9EVUxFPW5neF9odHRwX3N0YXR1c19tb2R1bGUKLUhUVFBfU1RBVFVTX1NSQ1M9c3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9zdGF0dXNfaGFuZGxlci5jCitIVFRQX1NUQVRVU19TUkNTPXNyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfc3RhdHVzX21vZHVsZS5jCiAKIAogSFRUUF9HRU9fTU9EVUxFPW5neF9odHRwX2dlb19tb2R1bGUKQEAgLTMwMyw3ICszMDMsNyBAQAogCiAKIEhUVFBfUkVXUklURV9NT0RVTEU9bmd4X2h0dHBfcmV3cml0ZV9tb2R1bGUKLUhUVFBfUkVXUklURV9TUkNTPXNyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfcmV3cml0ZV9oYW5kbGVyLmMKK0hUVFBfUkVXUklURV9TUkNTPXNyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfcmV3cml0ZV9tb2R1bGUuYwogCiAKIEhUVFBfU1NMX01PRFVMRT1uZ3hfaHR0cF9zc2xfbW9kdWxlCkBAIC0zMjQsNyArMzI0LDcgQEAKIAogCiBIVFRQX0ZBU1RDR0lfTU9EVUxFPW5neF9odHRwX2Zhc3RjZ2lfbW9kdWxlCi1IVFRQX0ZBU1RDR0lfU1JDUz1zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2Zhc3RjZ2lfaGFuZGxlci5jCitIVFRQX0ZBU1RDR0lfU1JDUz1zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2Zhc3RjZ2lfbW9kdWxlLmMKIAogCiBJTUFQX0lOQ1M9InNyYy9pbWFwIgpkaWZmIC0tZ2l0IGEvYXV0by9zdW1tYXJ5IGIvYXV0by9zdW1tYXJ5CmluZGV4IDQ4NDhjMjIuLjdlZjZlZGUgMTAwNjQ0Ci0tLSBhL2F1dG8vc3VtbWFyeQorKysgYi9hdXRvL3N1bW1hcnkKQEAgLTE3LDcgKzE3LDcgQEAKIGVzYWMKIAogaWYgWyAkVVNFX1BDUkUgPSBESVNBQkxFRCBdOyB0aGVuCi0gICAgZWNobyAiICsgUENSRSBsaWJyYXJ5IGlzIGRpc2FibGVkIgorICAgIGVjaG8gIiAgKyBQQ1JFIGxpYnJhcnkgaXMgZGlzYWJsZWQiCiAKIGVsc2UKICAgICBjYXNlICRQQ1JFIGluCmRpZmYgLS1naXQgYS9kb2NzL3htbC9uZ2lueC9jaGFuZ2VzLnhtbCBiL2RvY3MveG1sL25naW54L2NoYW5nZXMueG1sCmluZGV4IDhjNTU1ZmUuLmEyMWRmODYgMTAwNjQ0Ci0tLSBhL2RvY3MveG1sL25naW54L2NoYW5nZXMueG1sCisrKyBiL2RvY3MveG1sL25naW54L2NoYW5nZXMueG1sCkBAIC05LDYgKzksMTIzIEBACiA8dGl0bGUgbGFuZz0iZW4iPm5naW54IGNoYW5nZWxvZzwvdGl0bGU+CiAKIAorPGNoYW5nZXMgdmVyPSIwLjEuMjUiIGRhdGU9IjE5LjAzLjIwMDUiPgorCis8Y2hhbmdlIHR5cGU9ImJ1Z2ZpeCI+Cis8cGFyYSBsYW5nPSJydSI+CituZ2lueCDOxSDSwcLP1MHMIM7BIExpbnV4IHBhcmlzYy4KKzwvcGFyYT4KKzxwYXJhIGxhbmc9ImVuIj4KK25naW54IGRpZCBydW4gb24gTGludXggcGFyaXNjLgorPC9wYXJhPgorPC9jaGFuZ2U+CisKKzxjaGFuZ2UgdHlwZT0iZmVhdHVyZSI+Cis8cGFyYSBsYW5nPSJydSI+CituZ2lueCDUxdDF0tggzsUg2sHQ1dPLwcXU09Eg0M/EIEZyZWVCU0QsIMXTzMkg2s7B3sXOycUKK3N5c2N0bCBrZXJuLmlwYy5zb21heGNvbm4g08zJ28vPzSDCz8zY28/FLgorPC9wYXJhPgorPHBhcmEgbGFuZz0iZW4iPgorbmdpbnggbm93IGRvZXMgbm90IHN0YXJ0IHVuZGVyIEZyZWVCU0QgaWYgdGhlIHN5c2N0bCBrZXJuLmlwYy5zb21heGNvbm4KK3ZhbHVlIGlzIHRvbyBiaWcuCis8L3BhcmE+Cis8L2NoYW5nZT4KKworPGNoYW5nZSB0eXBlPSJidWdmaXgiPgorPHBhcmEgbGFuZz0icnUiPgorxdPMySDNz8TVzNggbmd4X2h0dHBfaW5kZXhfbW9kdWxlIMTFzMHMINfO1dTSxc7OxcUg0MXSxc7B0NLB18zFzsnFINrB0NLP08EKK9cgzc/E1czJIG5neF9odHRwX3Byb3h5X21vZHVsZSDJzMkgbmd4X2h0dHBfZmFzdGNnaV9tb2R1bGUsINTPIMbByswgyc7ExcvTwQorzsUg2sHL0tnXwczT0SDQz9PMxSDPwtPM1dbJ18HOydEg2sHQ0s/TwS4KKzwvcGFyYT4KKzxwYXJhIGxhbmc9ImVuIj4KK2lmIGEgcmVxdWVzdCB3YXMgaW50ZXJuYWxseSByZWRpcmVjdGVkIGJ5IHRoZSBuZ3hfaHR0cF9pbmRleF9tb2R1bGUKK21vZHVsZSB0byB0aGUgbmd4X2h0dHBfcHJveHlfbW9kdWxlIG9yIG5neF9odHRwX2Zhc3RjZ2lfbW9kdWxlIG1vZHVsZXMsCit0aGVuIHRoZSBpbmRleCBmaWxlIHdhcyBub3QgY2xvc2VkIGFmdGVyIHJlcXVlc3QgY29tcGxldGlvbi4KKzwvcGFyYT4KKzwvY2hhbmdlPgorCis8Y2hhbmdlIHR5cGU9ImZlYXR1cmUiPgorPHBhcmEgbGFuZz0icnUiPgorxMnSxcvUydfBIHByb3h5X3Bhc3Mgzc/WxdQgydPQz8zY2s/XwdTY09Eg1yBsb2NhdGlvbiwg2sHEwc7O2cgg0sXH1czR0s7ZzQor19nSwdbFzsnFzS4KKzwvcGFyYT4KKzxwYXJhIGxhbmc9ImVuIj4KK3RoZSAicHJveHlfcGFzcyIgY2FuIGJlIHVzZWQgaW4gbG9jYXRpb24gd2l0aCByZWd1bGFyIGV4cHJlc3Npb24uCis8L3BhcmE+Cis8L2NoYW5nZT4KKworPGNoYW5nZSB0eXBlPSJmZWF0dXJlIj4KKzxwYXJhIGxhbmc9InJ1Ij4KK83PxNXM2CBuZ3hfaHR0cF9yZXdyaXRlX2ZpbHRlcl9tb2R1bGUg0M/ExMXS1snXwcXUINXTzM/XydEg18nEwQorImlmICgkSFRUUF9VU0VSX0FHRU5UIH4gTVNJRSkiLgorPC9wYXJhPgorPHBhcmEgbGFuZz0iZW4iPgordGhlIG5neF9odHRwX3Jld3JpdGVfZmlsdGVyX21vZHVsZSBtb2R1bGUgc3VwcG9ydHMgdGhlIGNvbmRpdGlvbiBsaWtlCisiaWYgKCRIVFRQX1VTRVJfQUdFTlQgfiBNU0lFKSIuCis8L3BhcmE+Cis8L2NoYW5nZT4KKworPGNoYW5nZSB0eXBlPSJidWdmaXgiPgorPHBhcmEgbGFuZz0icnUiPgorbmdpbnggz97FztggzcXEzMXOzs8g2sHQ1dPLwczT0SDQ0skgws/M2NvPzSDLz8zJ3sXT1NfFIMHE0sXTz9cgyQorydPQz8zY2s/Xwc7JySDUxcvT1M/X2cgg2s7B3sXOycog1yDEydLFy9TJ18UgZ2VvLgorPC9wYXJhPgorPHBhcmEgbGFuZz0iZW4iPgorbmdpbnggc3RhcnRlZCB0b28gc2xvdyBpZiB0aGUgbGFyZ2UgbnVtYmVyIG9mIGFkZHJlc3NlcyBhbmQgdGV4dCB2YWx1ZXMKK3dlcmUgdXNlZCBpbiB0aGUgImdlbyIgZGlyZWN0aXZlLgorPC9wYXJhPgorPC9jaGFuZ2U+CisKKzxjaGFuZ2UgdHlwZT0iY2hhbmdlIj4KKzxwYXJhIGxhbmc9InJ1Ij4KK8nN0SDQxdLFzcXOzs/KINcgxMnSxcvUydfFIGdlbyDO1dbOzyDVy8Ha2dfB1NgsIMvByyAkbmFtZS4KK/DSxdbOycog18HSycHO1CDCxdogIiQiINDPy8Eg0sHCz9TBxdQsIM7PINfTy8/SxSDC1cTF1CDVwtLBzi4KKzwvcGFyYT4KKzxwYXJhIGxhbmc9ImVuIj4KK2EgdmFyaWFibGUgbmFtZSBtdXN0IGJlIGRlY2xhcmVkIGFzICIkbmFtZSIgaW4gdGhlICJnZW8iIGRpcmVjdGl2ZS4KK1RoZSBwcmV2aW91cyB2YXJpYW50IHdpdGhvdXQgIiQiIGlzIHN0aWxsIHN1cHBvcnRlZCwgYnV0IHdpbGwgYmUgcmVtb3ZlZCBzb29uLgorPC9wYXJhPgorPC9jaGFuZ2U+CisKKzxjaGFuZ2UgdHlwZT0iZmVhdHVyZSI+Cis8cGFyYSBsYW5nPSJydSI+CivQwdLBzcXU0iDMz8fBICIle1ZBUklBQkxFfXYiLgorPC9wYXJhPgorPHBhcmEgbGFuZz0iZW4iPgordGhlICIle1ZBUklBQkxFfXYiIGxvZ2dpbmcgcGFyYW1ldGVyLgorPC9wYXJhPgorPC9jaGFuZ2U+CisKKzxjaGFuZ2UgdHlwZT0iZmVhdHVyZSI+Cis8cGFyYSBsYW5nPSJydSI+CivEydLFy9TJ18EgInNldCAkbmFtZSB2YWx1ZSIuCis8L3BhcmE+Cis8cGFyYSBsYW5nPSJlbiI+Cit0aGUgInNldCAkbmFtZSB2YWx1ZSIgZGlyZWN0aXZlLgorPC9wYXJhPgorPC9jaGFuZ2U+CisKKzxjaGFuZ2UgdHlwZT0iYnVnZml4Ij4KKzxwYXJhIGxhbmc9InJ1Ij4KK9PP183F09TJzc/T1Ngg0yBnY2MgNC4wLgorPC9wYXJhPgorPHBhcmEgbGFuZz0iZW4iPgorZ2NjIDQuMCBjb21wYXRpYmlsaXR5LgorPC9wYXJhPgorPC9jaGFuZ2U+CisKKzxjaGFuZ2UgdHlwZT0iZmVhdHVyZSI+Cis8cGFyYSBsYW5nPSJydSI+CivQwdLBzcXU0iDB19TPy8/OxsnH1dLBw8nJIC0td2l0aC1vcGVuc3NsLW9wdD1PUFRJT05TLgorPC9wYXJhPgorPHBhcmEgbGFuZz0iZW4iPgordGhlIC0td2l0aC1vcGVuc3NsLW9wdD1PUFRJT05TIGF1dG9jb25maWd1cmF0aW9uIGRpcmVjdGl2ZS4KKzwvcGFyYT4KKzwvY2hhbmdlPgorCis8L2NoYW5nZXM+CisKKwogPGNoYW5nZXMgdmVyPSIwLjEuMjQiIGRhdGU9IjA0LjAzLjIwMDUiPgogCiA8Y2hhbmdlIHR5cGU9ImZlYXR1cmUiPgpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbmdpbnguYyBiL3NyYy9jb3JlL25naW54LmMKaW5kZXggZDZlZTlmNi4uZTJhMzVkYyAxMDA2NDQKLS0tIGEvc3JjL2NvcmUvbmdpbnguYworKysgYi9zcmMvY29yZS9uZ2lueC5jCkBAIC0xNDEsNyArMTQxLDggQEAKIAogICAgIG5neF9waWQgPSBuZ3hfZ2V0cGlkKCk7CiAKLSAgICBpZiAoIShsb2cgPSBuZ3hfbG9nX2luaXQoKSkpIHsKKyAgICBsb2cgPSBuZ3hfbG9nX2luaXQoKTsKKyAgICBpZiAobG9nID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIDE7CiAgICAgfQogCkBAIC0xNTUsNyArMTU2LDggQEAKICAgICBpbml0X2N5Y2xlLmxvZyA9IGxvZzsKICAgICBuZ3hfY3ljbGUgPSAmaW5pdF9jeWNsZTsKIAotICAgIGlmICghKGluaXRfY3ljbGUucG9vbCA9IG5neF9jcmVhdGVfcG9vbCgxMDI0LCBsb2cpKSkgeworICAgIGluaXRfY3ljbGUucG9vbCA9IG5neF9jcmVhdGVfcG9vbCgxMDI0LCBsb2cpOworICAgIGlmIChpbml0X2N5Y2xlLnBvb2wgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gMTsKICAgICB9CiAKQEAgLTI1NSw5ICsyNTcsOSBAQAogc3RhdGljIG5neF9pbnRfdAogbmd4X2FkZF9pbmhlcml0ZWRfc29ja2V0cyhuZ3hfY3ljbGVfdCAqY3ljbGUpCiB7Ci0gICAgdV9jaGFyICAgICAgICAgICAgICAqcCwgKnYsICppbmhlcml0ZWQ7Ci0gICAgbmd4X3NvY2tldF90ICAgICAgICAgczsKLSAgICBuZ3hfbGlzdGVuaW5nX3QgICAgICpsczsKKyAgICB1X2NoYXIgICAgICAgICAgICpwLCAqdiwgKmluaGVyaXRlZDsKKyAgICBuZ3hfaW50X3QgICAgICAgICBzOworICAgIG5neF9saXN0ZW5pbmdfdCAgKmxzOwogCiAgICAgaW5oZXJpdGVkID0gKHVfY2hhciAqKSBnZXRlbnYoTkdJTlhfVkFSKTsKIApAQCAtMjg3LDExICsyODksMTIgQEAKIAogICAgICAgICAgICAgdiA9IHAgKyAxOwogCi0gICAgICAgICAgICBpZiAoIShscyA9IG5neF9hcnJheV9wdXNoKCZjeWNsZS0+bGlzdGVuaW5nKSkpIHsKKyAgICAgICAgICAgIGxzID0gbmd4X2FycmF5X3B1c2goJmN5Y2xlLT5saXN0ZW5pbmcpOworICAgICAgICAgICAgaWYgKGxzID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBscy0+ZmQgPSBzOworICAgICAgICAgICAgbHMtPmZkID0gKG5neF9zb2NrZXRfdCkgczsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzE1LDcgKzMxOCw3IEBACiAgICAgY3R4LmFyZ3YgPSBhcmd2OwogCiAgICAgdmFyID0gbmd4X2FsbG9jKHNpemVvZihOR0lOWF9WQVIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjeWNsZS0+bGlzdGVuaW5nLm5lbHRzICogKE5HWF9JTlQzMl9MRU4gKyAxKSArIDIsCisgICAgICAgICAgICAgICAgICAgICsgY3ljbGUtPmxpc3RlbmluZy5uZWx0cyAqIChOR1hfSU5UMzJfTEVOICsgMSkgKyAyLAogICAgICAgICAgICAgICAgICAgICBjeWNsZS0+bG9nKTsKIAogICAgIHAgPSBuZ3hfY3B5bWVtKHZhciwgTkdJTlhfVkFSICI9Iiwgc2l6ZW9mKE5HSU5YX1ZBUikpOwpAQCAtNDExLDI3ICs0MTQsMjkgQEAKIHN0YXRpYyBuZ3hfaW50X3QKIG5neF9zYXZlX2FyZ3Yobmd4X2N5Y2xlX3QgKmN5Y2xlLCBpbnQgYXJnYywgY2hhciAqY29uc3QgKmFyZ3YpCiB7CisjaWYgKE5HWF9GUkVFQlNEKQorCisgICAgbmd4X29zX2FyZ3YgPSAoY2hhciAqKikgYXJndjsKKyAgICBuZ3hfYXJnYyA9IGFyZ2M7CisgICAgbmd4X2FyZ3YgPSAoY2hhciAqKikgYXJndjsKKworI2Vsc2UKICAgICBzaXplX3QgICAgIGxlbjsKICAgICBuZ3hfaW50X3QgIGk7CiAKICAgICBuZ3hfb3NfYXJndiA9IChjaGFyICoqKSBhcmd2OwotCiAgICAgbmd4X2FyZ2MgPSBhcmdjOwogCi0jaWYgKE5HWF9GUkVFQlNEKQotCi0gICAgbmd4X2FyZ3YgPSAoY2hhciAqKikgYXJndjsKLQotI2Vsc2UKLQotICAgIGlmICghKG5neF9hcmd2ID0gbmd4X2FsbG9jKChhcmdjICsgMSkgKiBzaXplb2YoY2hhciAqKSwgY3ljbGUtPmxvZykpKSB7CisgICAgbmd4X2FyZ3YgPSBuZ3hfYWxsb2MoKGFyZ2MgKyAxKSAqIHNpemVvZihjaGFyICopLCBjeWNsZS0+bG9nKTsKKyAgICBpZiAobmd4X2FyZ3YgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgIH0KIAogICAgIGZvciAoaSA9IDA7IGkgPCBhcmdjOyBpKyspIHsKICAgICAgICAgbGVuID0gbmd4X3N0cmxlbihhcmd2W2ldKSArIDE7CiAKLSAgICAgICAgaWYgKCEobmd4X2FyZ3ZbaV0gPSBuZ3hfYWxsb2MobGVuLCBjeWNsZS0+bG9nKSkpIHsKKyAgICAgICAgbmd4X2FyZ3ZbaV0gPSBuZ3hfYWxsb2MobGVuLCBjeWNsZS0+bG9nKTsKKyAgICAgICAgaWYgKG5neF9hcmd2W2ldID09IE5VTEwpIHsKICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgICAgIH0KIApAQCAtNDUxLDcgKzQ1Niw4IEBACiB7CiAgICAgbmd4X2NvcmVfY29uZl90ICAqY2NmOwogCi0gICAgaWYgKCEoY2NmID0gbmd4X3BjYWxsb2MoY3ljbGUtPnBvb2wsIHNpemVvZihuZ3hfY29yZV9jb25mX3QpKSkpIHsKKyAgICBjY2YgPSBuZ3hfcGNhbGxvYyhjeWNsZS0+cG9vbCwgc2l6ZW9mKG5neF9jb3JlX2NvbmZfdCkpOworICAgIGlmIChjY2YgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKQEAgLTUzNCw3ICs1NDAsOCBAQAogCiAgICAgY2NmLT5uZXdwaWQubGVuID0gY2NmLT5waWQubGVuICsgc2l6ZW9mKE5HWF9ORVdQSURfRVhUKTsKIAotICAgIGlmICghKGNjZi0+bmV3cGlkLmRhdGEgPSBuZ3hfcGFsbG9jKGN5Y2xlLT5wb29sLCBjY2YtPm5ld3BpZC5sZW4pKSkgeworICAgIGNjZi0+bmV3cGlkLmRhdGEgPSBuZ3hfcGFsbG9jKGN5Y2xlLT5wb29sLCBjY2YtPm5ld3BpZC5sZW4pOworICAgIGlmIChjY2YtPm5ld3BpZC5kYXRhID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbmdpbnguaCBiL3NyYy9jb3JlL25naW54LmgKaW5kZXggNWY3NmI5Yi4uNTRhZmNhOSAxMDA2NDQKLS0tIGEvc3JjL2NvcmUvbmdpbnguaAorKysgYi9zcmMvY29yZS9uZ2lueC5oCkBAIC04LDcgKzgsNyBAQAogI2RlZmluZSBfTkdJTlhfSF9JTkNMVURFRF8KIAogCi0jZGVmaW5lIE5HSU5YX1ZFUiAgICAgICAgICAibmdpbngvMC4xLjI0IgorI2RlZmluZSBOR0lOWF9WRVIgICAgICAgICAgIm5naW54LzAuMS4yNSIKIAogI2RlZmluZSBOR0lOWF9WQVIgICAgICAgICAgIk5HSU5YIgogI2RlZmluZSBOR1hfTkVXUElEX0VYVCAgICAgIi5uZXdiaW4iCmRpZmYgLS1naXQgYS9zcmMvY29yZS9uZ3hfYXJyYXkuYyBiL3NyYy9jb3JlL25neF9hcnJheS5jCmluZGV4IDgyZDVkMWQuLmI2MTY3YWYgMTAwNjQ0Ci0tLSBhL3NyYy9jb3JlL25neF9hcnJheS5jCisrKyBiL3NyYy9jb3JlL25neF9hcnJheS5jCkBAIC0xMiwxMSArMTIsMTMgQEAKIHsKICAgICBuZ3hfYXJyYXlfdCAqYTsKIAotICAgIGlmICghKGEgPSBuZ3hfcGFsbG9jKHAsIHNpemVvZihuZ3hfYXJyYXlfdCkpKSkgeworICAgIGEgPSBuZ3hfcGFsbG9jKHAsIHNpemVvZihuZ3hfYXJyYXlfdCkpOworICAgIGlmIChhID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgaWYgKCEoYS0+ZWx0cyA9IG5neF9wYWxsb2MocCwgbiAqIHNpemUpKSkgeworICAgIGEtPmVsdHMgPSBuZ3hfcGFsbG9jKHAsIG4gKiBzaXplKTsKKyAgICBpZiAoYS0+ZWx0cyA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIApAQCAtNzIsNyArNzQsOCBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLyogYWxsb2NhdGUgYSBuZXcgYXJyYXkgKi8KIAotICAgICAgICAgICAgaWYgKCEobmV3ID0gbmd4X3BhbGxvYyhwLCAyICogc2l6ZSkpKSB7CisgICAgICAgICAgICBuZXcgPSBuZ3hfcGFsbG9jKHAsIDIgKiBzaXplKTsKKyAgICAgICAgICAgIGlmIChuZXcgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgfQogCkBAIC0xMjAsNyArMTIzLDggQEAKIAogICAgICAgICAgICAgbmFsbG9jID0gMiAqICgobiA+PSBhLT5uYWxsb2MpID8gbiA6IGEtPm5hbGxvYyk7CiAKLSAgICAgICAgICAgIGlmICghKG5ldyA9IG5neF9wYWxsb2MocCwgbmFsbG9jICogYS0+c2l6ZSkpKSB7CisgICAgICAgICAgICBuZXcgPSBuZ3hfcGFsbG9jKHAsIG5hbGxvYyAqIGEtPnNpemUpOworICAgICAgICAgICAgaWYgKG5ldyA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL25neF9hcnJheS5oIGIvc3JjL2NvcmUvbmd4X2FycmF5LmgKaW5kZXggZDkwY2Y3Ni4uNWY5NzQ1MSAxMDA2NDQKLS0tIGEvc3JjL2NvcmUvbmd4X2FycmF5LmgKKysrIGIvc3JjL2NvcmUvbmd4X2FycmF5LmgKQEAgLTI3LDEwICsyNywxMSBAQAogdm9pZCAqbmd4X2FycmF5X3B1c2hfbihuZ3hfYXJyYXlfdCAqYSwgbmd4X3VpbnRfdCBuKTsKIAogCi1zdGF0aWMgbmd4X2lubGluZSBuZ3hfaW50X3Qgbmd4X2FycmF5X2luaXQobmd4X2FycmF5X3QgKmFycmF5LCBuZ3hfcG9vbF90ICpwb29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF91aW50X3Qgbiwgc2l6ZV90IHNpemUpCitzdGF0aWMgbmd4X2lubGluZSBuZ3hfaW50X3QKK25neF9hcnJheV9pbml0KG5neF9hcnJheV90ICphcnJheSwgbmd4X3Bvb2xfdCAqcG9vbCwgbmd4X3VpbnRfdCBuLCBzaXplX3Qgc2l6ZSkKIHsKLSAgICBpZiAoIShhcnJheS0+ZWx0cyA9IG5neF9wYWxsb2MocG9vbCwgbiAqIHNpemUpKSkgeworICAgIGFycmF5LT5lbHRzID0gbmd4X3BhbGxvYyhwb29sLCBuICogc2l6ZSk7CisgICAgaWYgKGFycmF5LT5lbHRzID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICB9CiAKQEAgLTQzLDE0ICs0NCw0IEBACiB9CiAKIAotLyogU1RVQiAqLwotI2RlZmluZSBuZ3hfaW5pdF9hcnJheShhLCBwLCBuLCBzLCByYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgbmd4X3Rlc3RfbnVsbChhLmVsdHMsIG5neF9wYWxsb2MocCwgbiAqIHMpLCByYyk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBhLm5lbHRzID0gMDsgYS5zaXplID0gczsgYS5uYWxsb2MgPSBuOyBhLnBvb2wgPSBwOwotCi0jZGVmaW5lIG5neF9jcmVhdGVfYXJyYXkgIG5neF9hcnJheV9jcmVhdGUKLSNkZWZpbmUgbmd4X3B1c2hfYXJyYXkgICAgbmd4X2FycmF5X3B1c2gKLS8qKi8KLQotCiAjZW5kaWYgLyogX05HWF9BUlJBWV9IX0lOQ0xVREVEXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbmd4X2J1Zi5jIGIvc3JjL2NvcmUvbmd4X2J1Zi5jCmluZGV4IDk3Yzk0YTMuLjJmMDM1NmYgMTAwNjQ0Ci0tLSBhL3NyYy9jb3JlL25neF9idWYuYworKysgYi9zcmMvY29yZS9uZ3hfYnVmLmMKQEAgLTEzLDExICsxMywxMyBAQAogewogICAgIG5neF9idWZfdCAqYjsKIAotICAgIGlmICghKGIgPSBuZ3hfY2FsbG9jX2J1Zihwb29sKSkpIHsKKyAgICBiID0gbmd4X2NhbGxvY19idWYocG9vbCk7CisgICAgaWYgKGIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICBpZiAoIShiLT5zdGFydCA9IG5neF9wYWxsb2MocG9vbCwgc2l6ZSkpKSB7CisgICAgYi0+c3RhcnQgPSBuZ3hfcGFsbG9jKHBvb2wsIHNpemUpOworICAgIGlmIChiLT5zdGFydCA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIApAQCAtNDksMTQgKzUxLDE3IEBACiAgICAgbmd4X2J1Zl90ICAgICpiOwogICAgIG5neF9jaGFpbl90ICAqY2hhaW4sICpjbCwgKipsbDsKIAotICAgIGlmICghKHAgPSBuZ3hfcGFsbG9jKHBvb2wsIGJ1ZnMtPm51bSAqIGJ1ZnMtPnNpemUpKSkgeworICAgIHAgPSBuZ3hfcGFsbG9jKHBvb2wsIGJ1ZnMtPm51bSAqIGJ1ZnMtPnNpemUpOworICAgIGlmIChwID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgbGwgPSAmY2hhaW47CiAKICAgICBmb3IgKGkgPSAwOyBpIDwgYnVmcy0+bnVtOyBpKyspIHsKLSAgICAgICAgaWYgKCEoYiA9IG5neF9jYWxsb2NfYnVmKHBvb2wpKSkgeworCisgICAgICAgIGIgPSBuZ3hfY2FsbG9jX2J1Zihwb29sKTsKKyAgICAgICAgaWYgKGIgPT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KIApAQCAtNzksNyArODQsOCBAQAogICAgICAgICBwICs9IGJ1ZnMtPnNpemU7CiAgICAgICAgIGItPmVuZCA9IHA7CiAKLSAgICAgICAgaWYgKCEoY2wgPSBuZ3hfYWxsb2NfY2hhaW5fbGluayhwb29sKSkpIHsKKyAgICAgICAgY2wgPSBuZ3hfYWxsb2NfY2hhaW5fbGluayhwb29sKTsKKyAgICAgICAgaWYgKGNsID09IE5VTEwpIHsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAKQEAgLTEwNiw3ICsxMTIsMTAgQEAKICAgICB9CiAKICAgICB3aGlsZSAoaW4pIHsKLSAgICAgICAgbmd4X3Rlc3RfbnVsbChjbCwgbmd4X2FsbG9jX2NoYWluX2xpbmsocG9vbCksIE5HWF9FUlJPUik7CisgICAgICAgIGNsID0gbmd4X2FsbG9jX2NoYWluX2xpbmsocG9vbCk7CisgICAgICAgIGlmIChjbCA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgICAgICB9CiAKICAgICAgICAgY2wtPmJ1ZiA9IGluLT5idWY7CiAgICAgICAgICpsbCA9IGNsOwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbmd4X2J1Zi5oIGIvc3JjL2NvcmUvbmd4X2J1Zi5oCmluZGV4IGQ2NzJjZjQuLjcyMWI5YzIgMTAwNjQ0Ci0tLSBhL3NyYy9jb3JlL25neF9idWYuaAorKysgYi9zcmMvY29yZS9uZ3hfYnVmLmgKQEAgLTExOSwyNyArMTE5LDkgQEAKICNkZWZpbmUgbmd4X2FsbG9jX2J1Zihwb29sKSAgbmd4X3BhbGxvYyhwb29sLCBzaXplb2Yobmd4X2J1Zl90KSkKICNkZWZpbmUgbmd4X2NhbGxvY19idWYocG9vbCkgbmd4X3BjYWxsb2MocG9vbCwgc2l6ZW9mKG5neF9idWZfdCkpCiAKLQogI2RlZmluZSBuZ3hfYWxsb2NfY2hhaW5fbGluayhwb29sKSBuZ3hfcGFsbG9jKHBvb2wsIHNpemVvZihuZ3hfY2hhaW5fdCkpCiAKIAotI2RlZmluZSBuZ3hfYWxsb2NfbGlua19hbmRfc2V0X2J1ZihjaGFpbiwgYiwgcG9vbCwgZXJyb3IpICAgICAgICAgICAgICAgICAgICBcCi0gICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgbmd4X3Rlc3RfbnVsbChjaGFpbiwgbmd4X2FsbG9jX2NoYWluX2xpbmsocG9vbCksIGVycm9yKTsgICAgICAgICAgICAgXAotICAgICAgICBjaGFpbi0+YnVmID0gYjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGNoYWluLT5uZXh0ID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9IHdoaWxlICgwKTsKLQotCi0jZGVmaW5lIG5neF9jaGFpbl9hZGRfbGluayhjaGFpbiwgbGFzdCwgY2wpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoY2hhaW4pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAqbGFzdCA9IGNsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgY2hhaW4gPSBjbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgbGFzdCA9ICZjbC0+bmV4dAotCi0KIG5neF9pbnRfdCBuZ3hfb3V0cHV0X2NoYWluKG5neF9vdXRwdXRfY2hhaW5fY3R4X3QgKmN0eCwgbmd4X2NoYWluX3QgKmluKTsKIG5neF9pbnRfdCBuZ3hfY2hhaW5fd3JpdGVyKHZvaWQgKmN0eCwgbmd4X2NoYWluX3QgKmluKTsKIApkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbmd4X2NvbmZfZmlsZS5jIGIvc3JjL2NvcmUvbmd4X2NvbmZfZmlsZS5jCmluZGV4IDQzN2Q3YTIuLjY1M2ZmNDggMTAwNjQ0Ci0tLSBhL3NyYy9jb3JlL25neF9jb25mX2ZpbGUuYworKysgYi9zcmMvY29yZS9uZ3hfY29uZl9maWxlLmMKQEAgLTgsNiArOCw3IEBACiAjaW5jbHVkZSA8bmd4X2NvcmUuaD4KIAogCitzdGF0aWMgbmd4X2ludF90IG5neF9jb25mX2hhbmRsZXIobmd4X2NvbmZfdCAqY2YsIG5neF9pbnRfdCBsYXN0KTsKIHN0YXRpYyBjaGFyICpuZ3hfY29uZl9pbmNsdWRlKG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpjbWQsIHZvaWQgKmNvbmYpOwogCiAKQEAgLTUzLDEzICs1NCwxMCBAQAogCiBjaGFyICpuZ3hfY29uZl9wYXJzZShuZ3hfY29uZl90ICpjZiwgbmd4X3N0cl90ICpmaWxlbmFtZSkKIHsKLSAgICBpbnQgICAgICAgICAgICAgICBtLCByYywgZm91bmQsIHZhbGlkOwogICAgIGNoYXIgICAgICAgICAgICAgKnJ2OwotICAgIHZvaWQgICAgICAgICAgICAgKmNvbmYsICoqY29uZnA7CiAgICAgbmd4X2ZkX3QgICAgICAgICAgZmQ7Ci0gICAgbmd4X3N0cl90ICAgICAgICAqbmFtZTsKKyAgICBuZ3hfaW50X3QgICAgICAgICByYzsKICAgICBuZ3hfY29uZl9maWxlX3QgICpwcmV2OwotICAgIG5neF9jb21tYW5kX3QgICAgKmNtZDsKIAogI2lmIChOR1hfU1VQUFJFU1NfV0FSTikKICAgICBmZCA9IE5HWF9JTlZBTElEX0ZJTEU7CkBAIC03OCw3ICs3Niw5IEBACiAgICAgICAgIH0KIAogICAgICAgICBwcmV2ID0gY2YtPmNvbmZfZmlsZTsKLSAgICAgICAgaWYgKCEoY2YtPmNvbmZfZmlsZSA9IG5neF9wYWxsb2MoY2YtPnBvb2wsIHNpemVvZihuZ3hfY29uZl9maWxlX3QpKSkpIHsKKworICAgICAgICBjZi0+Y29uZl9maWxlID0gbmd4X3BhbGxvYyhjZi0+cG9vbCwgc2l6ZW9mKG5neF9jb25mX2ZpbGVfdCkpOworICAgICAgICBpZiAoY2YtPmNvbmZfZmlsZSA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgICAgIH0KIApAQCAtMTMwLDE5NCArMTMwLDMwIEBACiAgICAgICAgICAgICBydiA9ICgqY2YtPmhhbmRsZXIpKGNmLCBOVUxMLCBjZi0+aGFuZGxlcl9jb25mKTsKICAgICAgICAgICAgIGlmIChydiA9PSBOR1hfQ09ORl9PSykgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQogCi0gICAgICAgICAgICB9IGVsc2UgaWYgKHJ2ID09IE5HWF9DT05GX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmMgPSBOR1hfRVJST1I7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBjZi0+bG9nLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgaW4gJXM6JWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2YtPmNvbmZfZmlsZS0+ZmlsZS5uYW1lLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmLT5jb25mX2ZpbGUtPmxpbmUpOworICAgICAgICAgICAgaWYgKHJ2ID09IE5HWF9DT05GX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgcmMgPSBOR1hfRVJST1I7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0KIAotICAgICAgICBuYW1lID0gKG5neF9zdHJfdCAqKSBjZi0+YXJncy0+ZWx0czsKLSAgICAgICAgZm91bmQgPSAwOwotCi0gICAgICAgIGZvciAobSA9IDA7IHJjICE9IE5HWF9FUlJPUiAmJiAhZm91bmQgJiYgbmd4X21vZHVsZXNbbV07IG0rKykgewotCi0gICAgICAgICAgICAvKiBsb29rIHVwIHRoZSBkaXJlY3RpdmUgaW4gdGhlIGFwcHJvcHJpYXRlIG1vZHVsZXMgKi8KLQotICAgICAgICAgICAgaWYgKG5neF9tb2R1bGVzW21dLT50eXBlICE9IE5HWF9DT05GX01PRFVMRQotICAgICAgICAgICAgICAgICYmIG5neF9tb2R1bGVzW21dLT50eXBlICE9IGNmLT5tb2R1bGVfdHlwZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY21kID0gbmd4X21vZHVsZXNbbV0tPmNvbW1hbmRzOwotICAgICAgICAgICAgaWYgKGNtZCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHdoaWxlIChjbWQtPm5hbWUubGVuKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWUtPmxlbiA9PSBjbWQtPm5hbWUubGVuCi0gICAgICAgICAgICAgICAgICAgICYmIG5neF9zdHJjbXAobmFtZS0+ZGF0YSwgY21kLT5uYW1lLmRhdGEpID09IDApCi0gICAgICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgICAgIGZvdW5kID0gMTsKLQotICAgICAgICAgICAgICAgICAgICAvKiBpcyB0aGUgZGlyZWN0aXZlJ3MgbG9jYXRpb24gcmlnaHQgPyAqLwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgoY21kLT50eXBlICYgY2YtPmNtZF90eXBlKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfRU1FUkcsIGNmLT5sb2csIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkaXJlY3RpdmUgXCIlc1wiIGluICVzOiVkICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlzIG5vdCBhbGxvd2VkIGhlcmUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLT5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZi0+Y29uZl9maWxlLT5maWxlLm5hbWUuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2YtPmNvbmZfZmlsZS0+bGluZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByYyA9IE5HWF9FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCEoY21kLT50eXBlICYgTkdYX0NPTkZfQkxPQ0spICYmIHJjICE9IE5HWF9PSykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBjZi0+bG9nLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGlyZWN0aXZlIFwiJXNcIiBpbiAlczolZCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpcyBub3QgdGVybWluYXRlZCBieSBcIjtcIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUtPmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmLT5jb25mX2ZpbGUtPmZpbGUubmFtZS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZi0+Y29uZl9maWxlLT5saW5lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gTkdYX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoKGNtZC0+dHlwZSAmIE5HWF9DT05GX0JMT0NLKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgcmMgIT0gTkdYX0NPTkZfQkxPQ0tfU1RBUlQpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19FTUVSRywgY2YtPmxvZywgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRpcmVjdGl2ZSBcIiVzXCIgaW4gJXM6JWQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGFzIG5vdCB0aGUgb3BlbmluZyBcIntcIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUtPmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmLT5jb25mX2ZpbGUtPmZpbGUubmFtZS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZi0+Y29uZl9maWxlLT5saW5lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gTkdYX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKiBpcyB0aGUgZGlyZWN0aXZlJ3MgYXJndW1lbnQgY291bnQgcmlnaHQgPyAqLwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChjbWQtPnR5cGUgJiBOR1hfQ09ORl9BTlkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gMTsKLQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNtZC0+dHlwZSAmIE5HWF9DT05GX0ZMQUcpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNmLT5hcmdzLT5uZWx0cyA9PSAyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjbWQtPnR5cGUgJiBOR1hfQ09ORl8xTU9SRSkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2YtPmFyZ3MtPm5lbHRzID4gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY21kLT50eXBlICYgTkdYX0NPTkZfMk1PUkUpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNmLT5hcmdzLT5uZWx0cyA+IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNmLT5hcmdzLT5uZWx0cyA8PSAxMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChjbWQtPnR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiBhcmd1bWVudF9udW1iZXJbY2YtPmFyZ3MtPm5lbHRzIC0gMV0pKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IDE7Ci0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gMDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmICghdmFsaWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19FTUVSRywgY2YtPmxvZywgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgbnVtYmVyIGFyZ3VtZW50cyBpbiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkaXJlY3RpdmUgXCIlc1wiIGluICVzOiVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS0+ZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2YtPmNvbmZfZmlsZS0+ZmlsZS5uYW1lLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmLT5jb25mX2ZpbGUtPmxpbmUpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSBOR1hfRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qIHNldCB1cCB0aGUgZGlyZWN0aXZlJ3MgY29uZmlndXJhdGlvbiBjb250ZXh0ICovCi0KLSAgICAgICAgICAgICAgICAgICAgY29uZiA9IE5VTEw7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNtZC0+dHlwZSAmIE5HWF9ESVJFQ1RfQ09ORikgewotICAgICAgICAgICAgICAgICAgICAgICAgY29uZiA9ICgodm9pZCAqKikgY2YtPmN0eClbbmd4X21vZHVsZXNbbV0tPmluZGV4XTsKLQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNtZC0+dHlwZSAmIE5HWF9NQUlOX0NPTkYpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbmYgPSAmKCgodm9pZCAqKikgY2YtPmN0eClbbmd4X21vZHVsZXNbbV0tPmluZGV4XSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjZi0+Y3R4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb25mcCA9ICoodm9pZCAqKikgKChjaGFyICopIGNmLT5jdHggKyBjbWQtPmNvbmYpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZnApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mID0gY29uZnBbbmd4X21vZHVsZXNbbV0tPmN0eF9pbmRleF07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBydiA9IGNtZC0+c2V0KGNmLCBjbWQsIGNvbmYpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChydiA9PSBOR1hfQ09ORl9PSykgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChydiA9PSBOR1hfQ09ORl9FUlJPUikgewotICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSBOR1hfRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBjZi0+bG9nLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIFwiJXNcIiBkaXJlY3RpdmUgJXMgaW4gJXM6JWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLT5kYXRhLCBydiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2YtPmNvbmZfZmlsZS0+ZmlsZS5uYW1lLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmLT5jb25mX2ZpbGUtPmxpbmUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICByYyA9IE5HWF9FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY21kKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWZvdW5kKSB7CiAgICAgICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfRU1FUkcsIGNmLT5sb2csIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmtub3duIGRpcmVjdGl2ZSBcIiVzXCIgaW4gJXM6JWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLT5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjZi0+Y29uZl9maWxlLT5maWxlLm5hbWUuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY2YtPmNvbmZfZmlsZS0+bGluZSk7Ci0KKyAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgaW4gJXM6JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJ2LCBjZi0+Y29uZl9maWxlLT5maWxlLm5hbWUuZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjZi0+Y29uZl9maWxlLT5saW5lKTsKICAgICAgICAgICAgIHJjID0gTkdYX0VSUk9SOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorCisgICAgICAgIHJjID0gbmd4X2NvbmZfaGFuZGxlcihjZiwgcmMpOworCiAgICAgICAgIGlmIChyYyA9PSBOR1hfRVJST1IpIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQogCisKICAgICBpZiAoZmlsZW5hbWUpIHsKICAgICAgICAgY2YtPmNvbmZfZmlsZSA9IHByZXY7CiAKQEAgLTMzNyw2ICsxNzMsMTY0IEBACiB9CiAKIAorc3RhdGljIG5neF9pbnRfdCBuZ3hfY29uZl9oYW5kbGVyKG5neF9jb25mX3QgKmNmLCBuZ3hfaW50X3QgbGFzdCkKK3sKKyAgICBjaGFyICAgICAgICAgICAqcnY7CisgICAgdm9pZCAgICAgICAgICAgKmNvbmYsICoqY29uZnA7CisgICAgbmd4X3VpbnRfdCAgICAgIGksIHZhbGlkOworICAgIG5neF9zdHJfdCAgICAgICpuYW1lOworICAgIG5neF9jb21tYW5kX3QgICpjbWQ7CisKKyAgICBuYW1lID0gY2YtPmFyZ3MtPmVsdHM7CisKKyAgICBmb3IgKGkgPSAwOyBuZ3hfbW9kdWxlc1tpXTsgaSsrKSB7CisKKyAgICAgICAgLyogbG9vayB1cCB0aGUgZGlyZWN0aXZlIGluIHRoZSBhcHByb3ByaWF0ZSBtb2R1bGVzICovCisKKyAgICAgICAgaWYgKG5neF9tb2R1bGVzW2ldLT50eXBlICE9IE5HWF9DT05GX01PRFVMRQorICAgICAgICAgICAgJiYgbmd4X21vZHVsZXNbaV0tPnR5cGUgIT0gY2YtPm1vZHVsZV90eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGNtZCA9IG5neF9tb2R1bGVzW2ldLT5jb21tYW5kczsKKyAgICAgICAgaWYgKGNtZCA9PSBOVUxMKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlIChjbWQtPm5hbWUubGVuKSB7CisKKyAgICAgICAgICAgIGlmIChuYW1lLT5sZW4gPT0gY21kLT5uYW1lLmxlbgorICAgICAgICAgICAgICAgICYmIG5neF9zdHJjbXAobmFtZS0+ZGF0YSwgY21kLT5uYW1lLmRhdGEpID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogaXMgdGhlIGRpcmVjdGl2ZSdzIGxvY2F0aW9uIHJpZ2h0ID8gKi8KKworICAgICAgICAgICAgICAgIGlmICghKGNtZC0+dHlwZSAmIGNmLT5jbWRfdHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBjZi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkaXJlY3RpdmUgXCIlc1wiIGluICVzOiVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaXMgbm90IGFsbG93ZWQgaGVyZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS0+ZGF0YSwgY2YtPmNvbmZfZmlsZS0+ZmlsZS5uYW1lLmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2YtPmNvbmZfZmlsZS0+bGluZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCEoY21kLT50eXBlICYgTkdYX0NPTkZfQkxPQ0spICYmIGxhc3QgIT0gTkdYX09LKSB7CisgICAgICAgICAgICAgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19FTUVSRywgY2YtPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGlyZWN0aXZlIFwiJXNcIiBpbiAlczolZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlzIG5vdCB0ZXJtaW5hdGVkIGJ5IFwiO1wiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLT5kYXRhLCBjZi0+Y29uZl9maWxlLT5maWxlLm5hbWUuZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZi0+Y29uZl9maWxlLT5saW5lKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKGNtZC0+dHlwZSAmIE5HWF9DT05GX0JMT0NLKQorICAgICAgICAgICAgICAgICAgICAmJiBsYXN0ICE9IE5HWF9DT05GX0JMT0NLX1NUQVJUKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBjZi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkaXJlY3RpdmUgXCIlc1wiIGluICVzOiVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGFzIG5vdCB0aGUgb3BlbmluZyBcIntcIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS0+ZGF0YSwgY2YtPmNvbmZfZmlsZS0+ZmlsZS5uYW1lLmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2YtPmNvbmZfZmlsZS0+bGluZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogaXMgdGhlIGRpcmVjdGl2ZSdzIGFyZ3VtZW50IGNvdW50IHJpZ2h0ID8gKi8KKworICAgICAgICAgICAgICAgIGlmIChjbWQtPnR5cGUgJiBOR1hfQ09ORl9BTlkpIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSAxOworCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjbWQtPnR5cGUgJiBOR1hfQ09ORl9GTEFHKSB7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNmLT5hcmdzLT5uZWx0cyA9PSAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IDE7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY21kLT50eXBlICYgTkdYX0NPTkZfMU1PUkUpIHsKKworICAgICAgICAgICAgICAgICAgICBpZiAoY2YtPmFyZ3MtPm5lbHRzID4gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSAxOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNtZC0+dHlwZSAmIE5HWF9DT05GXzJNT1JFKSB7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNmLT5hcmdzLT5uZWx0cyA+IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gMTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjZi0+YXJncy0+bmVsdHMgPD0gMTAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChjbWQtPnR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIGFyZ3VtZW50X251bWJlcltjZi0+YXJncy0+bmVsdHMgLSAxXSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IDE7CisKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCF2YWxpZCkgeworICAgICAgICAgICAgICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfRU1FUkcsIGNmLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgbnVtYmVyIGFyZ3VtZW50cyBpbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRpcmVjdGl2ZSBcIiVzXCIgaW4gJXM6JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUtPmRhdGEsIGNmLT5jb25mX2ZpbGUtPmZpbGUubmFtZS5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmLT5jb25mX2ZpbGUtPmxpbmUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIHNldCB1cCB0aGUgZGlyZWN0aXZlJ3MgY29uZmlndXJhdGlvbiBjb250ZXh0ICovCisKKyAgICAgICAgICAgICAgICBjb25mID0gTlVMTDsKKworICAgICAgICAgICAgICAgIGlmIChjbWQtPnR5cGUgJiBOR1hfRElSRUNUX0NPTkYpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uZiA9ICgodm9pZCAqKikgY2YtPmN0eClbbmd4X21vZHVsZXNbaV0tPmluZGV4XTsKKworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY21kLT50eXBlICYgTkdYX01BSU5fQ09ORikgeworICAgICAgICAgICAgICAgICAgICBjb25mID0gJigoKHZvaWQgKiopIGNmLT5jdHgpW25neF9tb2R1bGVzW2ldLT5pbmRleF0pOworCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjZi0+Y3R4KSB7CisgICAgICAgICAgICAgICAgICAgIGNvbmZwID0gKih2b2lkICoqKSAoKGNoYXIgKikgY2YtPmN0eCArIGNtZC0+Y29uZik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25mID0gY29uZnBbbmd4X21vZHVsZXNbaV0tPmN0eF9pbmRleF07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBydiA9IGNtZC0+c2V0KGNmLCBjbWQsIGNvbmYpOworCisgICAgICAgICAgICAgICAgaWYgKHJ2ID09IE5HWF9DT05GX09LKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfT0s7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHJ2ID09IE5HWF9DT05GX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBjZi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBcIiVzXCIgZGlyZWN0aXZlICVzIGluICVzOiVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUtPmRhdGEsIHJ2LCBjZi0+Y29uZl9maWxlLT5maWxlLm5hbWUuZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmLT5jb25mX2ZpbGUtPmxpbmUpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY21kKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfRU1FUkcsIGNmLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAidW5rbm93biBkaXJlY3RpdmUgXCIlc1wiIGluICVzOiVkIiwKKyAgICAgICAgICAgICAgICAgIG5hbWUtPmRhdGEsIGNmLT5jb25mX2ZpbGUtPmZpbGUubmFtZS5kYXRhLAorICAgICAgICAgICAgICAgICAgY2YtPmNvbmZfZmlsZS0+bGluZSk7CisKKyAgICByZXR1cm4gTkdYX0VSUk9SOworfQorCisKIHN0YXRpYyBuZ3hfaW50X3Qgbmd4X2NvbmZfcmVhZF90b2tlbihuZ3hfY29uZl90ICpjZikKIHsKICAgICB1X2NoYXIgICAgICAqc3RhcnQsIGNoLCAqc3JjLCAqZHN0OwpAQCAtNTIzLDExICs1MTcsMTMgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKGZvdW5kKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCEod29yZCA9IG5neF9wdXNoX2FycmF5KGNmLT5hcmdzKSkpIHsKKyAgICAgICAgICAgICAgICB3b3JkID0gbmd4X2FycmF5X3B1c2goY2YtPmFyZ3MpOworICAgICAgICAgICAgICAgIGlmICh3b3JkID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAoISh3b3JkLT5kYXRhID0gbmd4X3BhbGxvYyhjZi0+cG9vbCwgYi0+cG9zIC0gc3RhcnQgKyAxKSkpIHsKKyAgICAgICAgICAgICAgICB3b3JkLT5kYXRhID0gbmd4X3BhbGxvYyhjZi0+cG9vbCwgYi0+cG9zIC0gc3RhcnQgKyAxKTsKKyAgICAgICAgICAgICAgICBpZiAod29yZC0+ZGF0YSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgICAgICAgICAgICAgfQogCkBAIC02MjMsNyArNjE5LDggQEAKICAgICBuYW1lLT5sZW4gPSBjeWNsZS0+cm9vdC5sZW4gKyBvbGQubGVuOwogCiAgICAgaWYgKGN5Y2xlLT5jb25uZWN0aW9ucykgewotICAgICAgICBpZiAoIShuYW1lLT5kYXRhID0gbmd4X3BhbGxvYyhjeWNsZS0+cG9vbCwgbmFtZS0+bGVuICsgMSkpKSB7CisgICAgICAgIG5hbWUtPmRhdGEgPSBuZ3hfcGFsbG9jKGN5Y2xlLT5wb29sLCBuYW1lLT5sZW4gKyAxKTsKKyAgICAgICAgaWYgKG5hbWUtPmRhdGEgPT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuICBOR1hfRVJST1I7CiAgICAgICAgIH0KIApAQCAtNjMxLDcgKzYyOCw4IEBACiAKICAgICAgICAgLyogdGhlIGluaXRfY3ljbGUgKi8KIAotICAgICAgICBpZiAoIShuYW1lLT5kYXRhID0gbmd4X2FsbG9jKG5hbWUtPmxlbiArIDEsIGN5Y2xlLT5sb2cpKSkgeworICAgICAgICBuYW1lLT5kYXRhID0gbmd4X2FsbG9jKG5hbWUtPmxlbiArIDEsIGN5Y2xlLT5sb2cpOworICAgICAgICBpZiAobmFtZS0+ZGF0YSA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gIE5HWF9FUlJPUjsKICAgICAgICAgfQogICAgIH0KQEAgLTY4Niw3ICs2ODQsOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKCEoZmlsZSA9IG5neF9saXN0X3B1c2goJmN5Y2xlLT5vcGVuX2ZpbGVzKSkpIHsKKyAgICBmaWxlID0gbmd4X2xpc3RfcHVzaCgmY3ljbGUtPm9wZW5fZmlsZXMpOworICAgIGlmIChmaWxlID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvY29yZS9uZ3hfY29ubmVjdGlvbi5jIGIvc3JjL2NvcmUvbmd4X2Nvbm5lY3Rpb24uYwppbmRleCBlOGYwNmZkLi40MjY4MTU3IDEwMDY0NAotLS0gYS9zcmMvY29yZS9uZ3hfY29ubmVjdGlvbi5jCisrKyBiL3NyYy9jb3JlL25neF9jb25uZWN0aW9uLmMKQEAgLTIwLDEzICsyMCwxNSBAQAogICAgIG5neF9saXN0ZW5pbmdfdCAgICAgKmxzOwogICAgIHN0cnVjdCBzb2NrYWRkcl9pbiAgKnNpbjsKIAotICAgIGlmICghKGxzID0gbmd4X2FycmF5X3B1c2goJmNmLT5jeWNsZS0+bGlzdGVuaW5nKSkpIHsKKyAgICBscyA9IG5neF9hcnJheV9wdXNoKCZjZi0+Y3ljbGUtPmxpc3RlbmluZyk7CisgICAgaWYgKGxzID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgbmd4X21lbXplcm8obHMsIHNpemVvZihuZ3hfbGlzdGVuaW5nX3QpKTsKIAotICAgIGlmICghKHNpbiA9IG5neF9wY2FsbG9jKGNmLT5wb29sLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSkpKSB7CisgICAgc2luID0gbmd4X3BjYWxsb2MoY2YtPnBvb2wsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pKTsKKyAgICBpZiAoc2luID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCkBAIC00Niw3ICs0OCw2IEBACiAgICAgbHMtPmFkZHJfdGV4dC5sZW4gPSBuZ3hfc3ByaW50Zihscy0+YWRkcl90ZXh0LmRhdGEgKyBsZW4sICI6JWQiLCBwb3J0KQogICAgICAgICAgICAgICAgICAgICAgICAgLSBscy0+YWRkcl90ZXh0LmRhdGE7CiAKLQogICAgIGxzLT5mZCA9IChuZ3hfc29ja2V0X3QpIC0xOwogICAgIGxzLT5mYW1pbHkgPSBBRl9JTkVUOwogICAgIGxzLT50eXBlID0gU09DS19TVFJFQU07CmRpZmYgLS1naXQgYS9zcmMvY29yZS9uZ3hfY3ljbGUuYyBiL3NyYy9jb3JlL25neF9jeWNsZS5jCmluZGV4IGFkOTA0OWUuLjUxODY0ZTMgMTAwNjQ0Ci0tLSBhL3NyYy9jb3JlL25neF9jeWNsZS5jCisrKyBiL3NyYy9jb3JlL25neF9jeWNsZS5jCkBAIC01NCwxNSArNTQsMTggQEAKIAogICAgIGxvZyA9IG9sZF9jeWNsZS0+bG9nOwogCi0gICAgaWYgKCEocG9vbCA9IG5neF9jcmVhdGVfcG9vbCgxNiAqIDEwMjQsIGxvZykpKSB7CisgICAgcG9vbCA9IG5neF9jcmVhdGVfcG9vbCgxNiAqIDEwMjQsIGxvZyk7CisgICAgaWYgKHBvb2wgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgICAgcG9vbC0+bG9nID0gbG9nOwogCi0gICAgaWYgKCEoY3ljbGUgPSBuZ3hfcGNhbGxvYyhwb29sLCBzaXplb2Yobmd4X2N5Y2xlX3QpKSkpIHsKKyAgICBjeWNsZSA9IG5neF9wY2FsbG9jKHBvb2wsIHNpemVvZihuZ3hfY3ljbGVfdCkpOworICAgIGlmIChjeWNsZSA9PSBOVUxMKSB7CiAgICAgICAgIG5neF9kZXN0cm95X3Bvb2wocG9vbCk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KKwogICAgIGN5Y2xlLT5wb29sID0gcG9vbDsKICAgICBjeWNsZS0+bG9nID0gbG9nOwogICAgIGN5Y2xlLT5vbGRfY3ljbGUgPSBvbGRfY3ljbGU7CkBAIC03MiwxMCArNzUsMTMgQEAKIAogCiAgICAgbiA9IG9sZF9jeWNsZS0+cGF0aGVzLm5lbHRzID8gb2xkX2N5Y2xlLT5wYXRoZXMubmVsdHMgOiAxMDsKLSAgICBpZiAoIShjeWNsZS0+cGF0aGVzLmVsdHMgPSBuZ3hfcGNhbGxvYyhwb29sLCBuICogc2l6ZW9mKG5neF9wYXRoX3QgKikpKSkgeworCisgICAgY3ljbGUtPnBhdGhlcy5lbHRzID0gbmd4X3BjYWxsb2MocG9vbCwgbiAqIHNpemVvZihuZ3hfcGF0aF90ICopKTsKKyAgICBpZiAoY3ljbGUtPnBhdGhlcy5lbHRzID09IE5VTEwpIHsKICAgICAgICAgbmd4X2Rlc3Ryb3lfcG9vbChwb29sKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQorCiAgICAgY3ljbGUtPnBhdGhlcy5uZWx0cyA9IDA7CiAgICAgY3ljbGUtPnBhdGhlcy5zaXplID0gc2l6ZW9mKG5neF9wYXRoX3QgKik7CiAgICAgY3ljbGUtPnBhdGhlcy5uYWxsb2MgPSBuOwpAQCAtMTAwLDcgKzEwNiw4IEBACiAgICAgfQogCiAKLSAgICBpZiAoIShjeWNsZS0+bmV3X2xvZyA9IG5neF9sb2dfY3JlYXRlX2VycmxvZyhjeWNsZSwgTlVMTCkpKSB7CisgICAgY3ljbGUtPm5ld19sb2cgPSBuZ3hfbG9nX2NyZWF0ZV9lcnJsb2coY3ljbGUsIE5VTEwpOworICAgIGlmIChjeWNsZS0+bmV3X2xvZyA9PSBOVUxMKSB7CiAgICAgICAgIG5neF9kZXN0cm95X3Bvb2wocG9vbCk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTEwOSwxMSArMTE2LDEzIEBACiAKIAogICAgIG4gPSBvbGRfY3ljbGUtPmxpc3RlbmluZy5uZWx0cyA/IG9sZF9jeWNsZS0+bGlzdGVuaW5nLm5lbHRzIDogMTA7CisKICAgICBjeWNsZS0+bGlzdGVuaW5nLmVsdHMgPSBuZ3hfcGNhbGxvYyhwb29sLCBuICogc2l6ZW9mKG5neF9saXN0ZW5pbmdfdCkpOwogICAgIGlmIChjeWNsZS0+bGlzdGVuaW5nLmVsdHMgPT0gTlVMTCkgewogICAgICAgICBuZ3hfZGVzdHJveV9wb29sKHBvb2wpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CisKICAgICBjeWNsZS0+bGlzdGVuaW5nLm5lbHRzID0gMDsKICAgICBjeWNsZS0+bGlzdGVuaW5nLnNpemUgPSBzaXplb2Yobmd4X2xpc3RlbmluZ190KTsKICAgICBjeWNsZS0+bGlzdGVuaW5nLm5hbGxvYyA9IG47CkBAIC0xNDcsNyArMTU2LDcgQEAKIAogICAgIG5neF9tZW16ZXJvKCZjb25mLCBzaXplb2Yobmd4X2NvbmZfdCkpOwogICAgIC8qIFNUVUI6IGluaXQgYXJyYXkgPyAqLwotICAgIGNvbmYuYXJncyA9IG5neF9jcmVhdGVfYXJyYXkocG9vbCwgMTAsIHNpemVvZihuZ3hfc3RyX3QpKTsKKyAgICBjb25mLmFyZ3MgPSBuZ3hfYXJyYXlfY3JlYXRlKHBvb2wsIDEwLCBzaXplb2Yobmd4X3N0cl90KSk7CiAgICAgaWYgKGNvbmYuYXJncyA9PSBOVUxMKSB7CiAgICAgICAgIG5neF9kZXN0cm95X3Bvb2wocG9vbCk7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtNTE2LDcgKzUyNSw3IEBACiAKICAgICBuZ3hfdGVtcF9wb29sLT5sb2cgPSBjeWNsZS0+bG9nOwogCi0gICAgb2xkID0gbmd4X3B1c2hfYXJyYXkoJm5neF9vbGRfY3ljbGVzKTsKKyAgICBvbGQgPSBuZ3hfYXJyYXlfcHVzaCgmbmd4X29sZF9jeWNsZXMpOwogICAgIGlmIChvbGQgPT0gTlVMTCkgewogICAgICAgICBleGl0KDEpOwogICAgIH0KQEAgLTU2Miw3ICs1NzEsNyBAQAogewogICAgIG5neF91aW50X3QgICAgICAgIHRydW5jOwogICAgIHNpemVfdCAgICAgICAgICAgIGxlbjsKLSAgICB1X2NoYXIgICAgICAgICAgICpuYW1lLCBwaWRbTkdYX0lOVDY0X0xFTl07CisgICAgdV9jaGFyICAgICAgICAgICAgcGlkW05HWF9JTlQ2NF9MRU5dOwogICAgIG5neF9maWxlX3QgICAgICAgIGZpbGU7CiAgICAgbmd4X2NvcmVfY29uZl90ICAqY2NmLCAqb2xkX2NjZjsKIApkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbmd4X2ZpbGUuYyBiL3NyYy9jb3JlL25neF9maWxlLmMKaW5kZXggNTYxZjA4MC4uNmZlMDRlNyAxMDA2NDQKLS0tIGEvc3JjL2NvcmUvbmd4X2ZpbGUuYworKysgYi9zcmMvY29yZS9uZ3hfZmlsZS5jCkBAIC00Myw3ICs0Myw4IEBACiAKICAgICBmaWxlLT5uYW1lLmxlbiA9IHBhdGgtPm5hbWUubGVuICsgMSArIHBhdGgtPmxlbiArIE5HWF9BVE9NSUNfVF9MRU47CiAKLSAgICBpZiAoIShmaWxlLT5uYW1lLmRhdGEgPSBuZ3hfcGFsbG9jKHBvb2wsIGZpbGUtPm5hbWUubGVuICsgMSkpKSB7CisgICAgZmlsZS0+bmFtZS5kYXRhID0gbmd4X3BhbGxvYyhwb29sLCBmaWxlLT5uYW1lLmxlbiArIDEpOworICAgIGlmIChmaWxlLT5uYW1lLmRhdGEgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgIH0KIApAQCAtMjAzLDcgKzIwNCw4IEBACiAgICAgICAgIHJldHVybiAiaXMgZHVwbGljYXRlIjsKICAgICB9CiAKLSAgICBpZiAoIShwYXRoID0gbmd4X3BjYWxsb2MoY2YtPnBvb2wsIHNpemVvZihuZ3hfcGF0aF90KSkpKSB7CisgICAgcGF0aCA9IG5neF9wY2FsbG9jKGNmLT5wb29sLCBzaXplb2Yobmd4X3BhdGhfdCkpOworICAgIGlmIChwYXRoID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgIH0KIApAQCAtMjkyLDcgKzI5NCw4IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoIShwID0gbmd4X2FycmF5X3B1c2goJmNmLT5jeWNsZS0+cGF0aGVzKSkpIHsKKyAgICBwID0gbmd4X2FycmF5X3B1c2goJmNmLT5jeWNsZS0+cGF0aGVzKTsKKyAgICBpZiAocCA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvY29yZS9uZ3hfZmlsZS5oIGIvc3JjL2NvcmUvbmd4X2ZpbGUuaAppbmRleCBjOTA2M2M1Li4yYmRhODU4IDEwMDY0NAotLS0gYS9zcmMvY29yZS9uZ3hfZmlsZS5oCisrKyBiL3NyYy9jb3JlL25neF9maWxlLmgKQEAgLTcwLDcgKzcwLDggQEAKICNkZWZpbmUgbmd4X2NvbmZfbWVyZ2VfcGF0aF92YWx1ZShjdXJyLCBwcmV2LCBwYXRoLCBsMSwgbDIsIGwzLCBjbGVhbiwgY2YpICAgIFwKICAgICBpZiAoY3VyciA9PSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgaWYgKHByZXYgPT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGlmICghKGN1cnIgPSBuZ3hfcGFsbG9jKGNmLT5wb29sLCBzaXplb2Yobmd4X3BhdGhfdCkpKSkgeyAgICAgICAgIFwKKyAgICAgICAgICAgIGN1cnIgPSBuZ3hfcGFsbG9jKGNmLT5wb29sLCBzaXplb2Yobmd4X3BhdGhfdCkpOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmIChjdXJyID09IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL25neF9nYXJiYWdlX2NvbGxlY3Rvci5jIGIvc3JjL2NvcmUvbmd4X2dhcmJhZ2VfY29sbGVjdG9yLmMKaW5kZXggYmE3ZDczMy4uMDdhM2Y3ZiAxMDA2NDQKLS0tIGEvc3JjL2NvcmUvbmd4X2dhcmJhZ2VfY29sbGVjdG9yLmMKKysrIGIvc3JjL2NvcmUvbmd4X2dhcmJhZ2VfY29sbGVjdG9yLmMKQEAgLTc3LDcgKzc3LDggQEAKIAogICAgICAgICAgICAgYnVmLmxlbiA9IGRuYW1lLT5sZW4gKyAxICsgbGVuICsgTkdYX0RJUl9NQVNLX0xFTjsKIAotICAgICAgICAgICAgaWYgKCEoYnVmLmRhdGEgPSBuZ3hfYWxsb2MoYnVmLmxlbiArIDEsIGN0eC0+bG9nKSkpIHsKKyAgICAgICAgICAgIGJ1Zi5kYXRhID0gbmd4X2FsbG9jKGJ1Zi5sZW4gKyAxLCBjdHgtPmxvZyk7CisgICAgICAgICAgICBpZiAoYnVmLmRhdGEgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIHJldHVybiBOR1hfQUJPUlQ7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL25neF9pbmV0LmMgYi9zcmMvY29yZS9uZ3hfaW5ldC5jCmluZGV4IGEzMGZmMDMuLjZjYWQwNTMgMTAwNjQ0Ci0tLSBhL3NyYy9jb3JlL25neF9pbmV0LmMKKysrIGIvc3JjL2NvcmUvbmd4X2luZXQuYwpAQCAtMjQ0LDcgKzI0NCw4IEBACiAKICAgICAgICAgdS0+cG9ydCA9IHUtPmRlZmF1bHRfcG9ydF92YWx1ZTsKIAotICAgICAgICBpZiAoISh1LT5wb3J0X3RleHQuZGF0YSA9IG5neF9wYWxsb2MoY2YtPnBvb2wsIHNpemVvZigiNjU1MzYiKSAtIDEpKSkgeworICAgICAgICB1LT5wb3J0X3RleHQuZGF0YSA9IG5neF9wYWxsb2MoY2YtPnBvb2wsIHNpemVvZigiNjU1MzYiKSAtIDEpOworICAgICAgICBpZiAodS0+cG9ydF90ZXh0LmRhdGEgPT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KIApAQCAtMjcxLDcgKzI3Miw4IEBACiAKICAgICB1LT5wb3J0ID0gaHRvbnModS0+cG9ydCk7CiAKLSAgICBpZiAoIShob3N0ID0gbmd4X3BhbGxvYyhjZi0+cG9vbCwgdS0+aG9zdC5sZW4gKyAxKSkpIHsKKyAgICBob3N0ID0gbmd4X3BhbGxvYyhjZi0+cG9vbCwgdS0+aG9zdC5sZW4gKyAxKTsKKyAgICBpZiAoaG9zdCA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIApAQCAtMjk3LDcgKzI5OSw2IEBACiAKICAgICAgICAgcGVlcnMgPSBuZ3hfcGNhbGxvYyhjZi0+cG9vbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yobmd4X3BlZXJzX3QpICsgc2l6ZW9mKG5neF9wZWVyX3QpICogKGkgLSAxKSk7Ci0KICAgICAgICAgaWYgKHBlZXJzID09IE5VTEwpIHsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CkBAIC0zMDcsNyArMzA4LDggQEAKIAogICAgICAgICBmb3IgKGkgPSAwOyBoLT5oX2FkZHJfbGlzdFtpXSAhPSBOVUxMOyBpKyspIHsKIAotICAgICAgICAgICAgaWYgKCEoc2luID0gbmd4X3BjYWxsb2MoY2YtPnBvb2wsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pKSkpIHsKKyAgICAgICAgICAgIHNpbiA9IG5neF9wY2FsbG9jKGNmLT5wb29sLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSk7CisgICAgICAgICAgICBpZiAoc2luID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgIH0KIApAQCAtMzIwLDcgKzMyMiw4IEBACiAKICAgICAgICAgICAgIGxlbiA9IElORVRfQUREUlNUUkxFTiAtIDEgKyAxICsgdS0+cG9ydF90ZXh0LmxlbjsKICAgICAKLSAgICAgICAgICAgIGlmICghKHBlZXJzLT5wZWVyW2ldLm5hbWUuZGF0YSA9IG5neF9wYWxsb2MoY2YtPnBvb2wsIGxlbikpKSB7CisgICAgICAgICAgICBwZWVycy0+cGVlcltpXS5uYW1lLmRhdGEgPSBuZ3hfcGFsbG9jKGNmLT5wb29sLCBsZW4pOworICAgICAgICAgICAgaWYgKHBlZXJzLT5wZWVyW2ldLm5hbWUuZGF0YSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICB9CiAKQEAgLTM0NSwxMSArMzQ4LDEzIEBACiAKICAgICAgICAgLyogTVA6IG5neF9zaGFyZWRfcGFsbG9jKCkgKi8KIAotICAgICAgICBpZiAoIShwZWVycyA9IG5neF9wY2FsbG9jKGNmLT5wb29sLCBzaXplb2Yobmd4X3BlZXJzX3QpKSkpIHsKKyAgICAgICAgcGVlcnMgPSBuZ3hfcGNhbGxvYyhjZi0+cG9vbCwgc2l6ZW9mKG5neF9wZWVyc190KSk7CisgICAgICAgIGlmIChwZWVycyA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQogCi0gICAgICAgIGlmICghKHNpbiA9IG5neF9wY2FsbG9jKGNmLT5wb29sLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSkpKSB7CisgICAgICAgIHNpbiA9IG5neF9wY2FsbG9jKGNmLT5wb29sLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSk7CisgICAgICAgIGlmIChzaW4gPT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KIApAQCAtMzY2LDcgKzM3MSw4IEBACiAKICAgICAgICAgcGVlcnMtPnBlZXJbMF0ubmFtZS5sZW4gPSBsZW47CiAKLSAgICAgICAgaWYgKCEocGVlcnMtPnBlZXJbMF0ubmFtZS5kYXRhID0gbmd4X3BhbGxvYyhjZi0+cG9vbCwgbGVuKSkpIHsKKyAgICAgICAgcGVlcnMtPnBlZXJbMF0ubmFtZS5kYXRhID0gbmd4X3BhbGxvYyhjZi0+cG9vbCwgbGVuKTsKKyAgICAgICAgaWYgKHBlZXJzLT5wZWVyWzBdLm5hbWUuZGF0YSA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvY29yZS9uZ3hfbGlzdC5jIGIvc3JjL2NvcmUvbmd4X2xpc3QuYwppbmRleCAyMzZlZmY0Li5jMDgyYWZhIDEwMDY0NAotLS0gYS9zcmMvY29yZS9uZ3hfbGlzdC5jCisrKyBiL3NyYy9jb3JlL25neF9saXN0LmMKQEAgLTE5LDExICsxOSwxMyBAQAogCiAgICAgICAgIC8qIHRoZSBsYXN0IHBhcnQgaXMgZnVsbCwgYWxsb2NhdGUgYSBuZXcgbGlzdCBwYXJ0ICovCiAKLSAgICAgICAgaWYgKCEobGFzdCA9IG5neF9wYWxsb2MobC0+cG9vbCwgc2l6ZW9mKG5neF9saXN0X3BhcnRfdCkpKSkgeworICAgICAgICBsYXN0ID0gbmd4X3BhbGxvYyhsLT5wb29sLCBzaXplb2Yobmd4X2xpc3RfcGFydF90KSk7CisgICAgICAgIGlmIChsYXN0ID09IE5VTEwpIHsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKCEobGFzdC0+ZWx0cyA9IG5neF9wYWxsb2MobC0+cG9vbCwgbC0+bmFsbG9jICogbC0+c2l6ZSkpKSB7CisgICAgICAgIGxhc3QtPmVsdHMgPSBuZ3hfcGFsbG9jKGwtPnBvb2wsIGwtPm5hbGxvYyAqIGwtPnNpemUpOworICAgICAgICBpZiAobGFzdC0+ZWx0cyA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvY29yZS9uZ3hfbGlzdC5oIGIvc3JjL2NvcmUvbmd4X2xpc3QuaAppbmRleCAyZGQ4YWIzLi5jMDMwY2YyIDEwMDY0NAotLS0gYS9zcmMvY29yZS9uZ3hfbGlzdC5oCisrKyBiL3NyYy9jb3JlL25neF9saXN0LmgKQEAgLTMwLDEwICszMCwxMiBAQAogfSBuZ3hfbGlzdF90OwogCiAKLXN0YXRpYyBuZ3hfaW5saW5lIG5neF9pbnRfdCBuZ3hfbGlzdF9pbml0KG5neF9saXN0X3QgKmxpc3QsIG5neF9wb29sX3QgKnBvb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfdWludF90IG4sIHNpemVfdCBzaXplKQorc3RhdGljIG5neF9pbmxpbmUKK25neF9pbnRfdCBuZ3hfbGlzdF9pbml0KG5neF9saXN0X3QgKmxpc3QsIG5neF9wb29sX3QgKnBvb2wsIG5neF91aW50X3QgbiwKKyAgICBzaXplX3Qgc2l6ZSkKIHsKLSAgICBpZiAoIShsaXN0LT5wYXJ0LmVsdHMgPSBuZ3hfcGFsbG9jKHBvb2wsIG4gKiBzaXplKSkpIHsKKyAgICBsaXN0LT5wYXJ0LmVsdHMgPSBuZ3hfcGFsbG9jKHBvb2wsIG4gKiBzaXplKTsKKyAgICBpZiAobGlzdC0+cGFydC5lbHRzID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL25neF9sb2cuYyBiL3NyYy9jb3JlL25neF9sb2cuYwppbmRleCA1ZDkzN2YyLi5hZGNjZDVlIDEwMDY0NAotLS0gYS9zcmMvY29yZS9uZ3hfbG9nLmMKKysrIGIvc3JjL2NvcmUvbmd4X2xvZy5jCkBAIC0yNTMsMTEgKzI1MywxMyBAQAogICAgICAgICBuYW1lID0gTlVMTDsKICAgICB9CiAKLSAgICBpZiAoIShsb2cgPSBuZ3hfcGNhbGxvYyhjeWNsZS0+cG9vbCwgc2l6ZW9mKG5neF9sb2dfdCkpKSkgeworICAgIGxvZyA9IG5neF9wY2FsbG9jKGN5Y2xlLT5wb29sLCBzaXplb2Yobmd4X2xvZ190KSk7CisgICAgaWYgKGxvZyA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIGlmICghKGxvZy0+ZmlsZSA9IG5neF9jb25mX29wZW5fZmlsZShjeWNsZSwgbmFtZSkpKSB7CisgICAgbG9nLT5maWxlID0gbmd4X2NvbmZfb3Blbl9maWxlKGN5Y2xlLCBuYW1lKTsKKyAgICBpZiAobG9nLT5maWxlID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvY29yZS9uZ3hfb3V0cHV0X2NoYWluLmMgYi9zcmMvY29yZS9uZ3hfb3V0cHV0X2NoYWluLmMKaW5kZXggNWY2OTcwZi4uMzEzNTU3ZCAxMDA2NDQKLS0tIGEvc3JjL2NvcmUvbmd4X291dHB1dF9jaGFpbi5jCisrKyBiL3NyYy9jb3JlL25neF9vdXRwdXRfY2hhaW4uYwpAQCAtMTU1LDcgKzE1NSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBpZiAoIShjdHgtPmJ1ZiA9IG5neF9jcmVhdGVfdGVtcF9idWYoY3R4LT5wb29sLCBzaXplKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY3R4LT5idWYgPSBuZ3hfY3JlYXRlX3RlbXBfYnVmKGN0eC0+cG9vbCwgc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjdHgtPmJ1ZiA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgICAgICAgICAgICAgICAgICB9CiAKQEAgLTE4Niw5ICsxODcsMTEgQEAKICAgICAgICAgICAgICAgICBjdHgtPmluID0gY3R4LT5pbi0+bmV4dDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKCEoY2wgPSBuZ3hfYWxsb2NfY2hhaW5fbGluayhjdHgtPnBvb2wpKSkgeworICAgICAgICAgICAgY2wgPSBuZ3hfYWxsb2NfY2hhaW5fbGluayhjdHgtPnBvb2wpOworICAgICAgICAgICAgaWYgKGNsID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBjbC0+YnVmID0gY3R4LT5idWY7CiAgICAgICAgICAgICBjbC0+bmV4dCA9IE5VTEw7CiAgICAgICAgICAgICAqbGFzdF9vdXQgPSBjbDsKQEAgLTI2OSw3ICsyNzIsOCBAQAogCiAgICAgd2hpbGUgKGluKSB7CiAKLSAgICAgICAgaWYgKCEoY2wgPSBuZ3hfYWxsb2NfY2hhaW5fbGluayhwb29sKSkpIHsKKyAgICAgICAgY2wgPSBuZ3hfYWxsb2NfY2hhaW5fbGluayhwb29sKTsKKyAgICAgICAgaWYgKGNsID09IE5VTEwpIHsKICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgICAgIH0KIApAQCAtMjgxLDcgKzI4NSw4IEBACiAgICAgICAgICAgICAmJiBidWYtPmZpbGVfcG9zIDwgTkdYX1NFTkRGSUxFX0xJTUlUCiAgICAgICAgICAgICAmJiBidWYtPmZpbGVfbGFzdCA+IE5HWF9TRU5ERklMRV9MSU1JVCkKICAgICAgICAgewotICAgICAgICAgICAgaWYgKCEoYiA9IG5neF9jYWxsb2NfYnVmKHBvb2wpKSkgeworICAgICAgICAgICAgYiA9IG5neF9jYWxsb2NfYnVmKHBvb2wpOworICAgICAgICAgICAgaWYgKGIgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgICAgICAgICB9CiAKQEAgLTQzMSw5ICs0MzYsMTEgQEAKICAgICAgICAgbmd4X2xvZ19kZWJ1ZzEoTkdYX0xPR19ERUJVR19DT1JFLCBjdHgtPmNvbm5lY3Rpb24tPmxvZywgMCwKICAgICAgICAgICAgICAgICAgICAgICAgImNoYWluIHdyaXRlciBidWYgc2l6ZTogJXV6Iiwgbmd4X2J1Zl9zaXplKGluLT5idWYpKTsKIAotICAgICAgICBpZiAoIShjbCA9IG5neF9hbGxvY19jaGFpbl9saW5rKGN0eC0+cG9vbCkpKSB7CisgICAgICAgIGNsID0gbmd4X2FsbG9jX2NoYWluX2xpbmsoY3R4LT5wb29sKTsKKyAgICAgICAgaWYgKGNsID09IE5VTEwpIHsKICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgICAgIH0KKwogICAgICAgICBjbC0+YnVmID0gaW4tPmJ1ZjsKICAgICAgICAgY2wtPm5leHQgPSBOVUxMOwogICAgICAgICAqY3R4LT5sYXN0ID0gY2w7CmRpZmYgLS1naXQgYS9zcmMvY29yZS9uZ3hfcGFsbG9jLmMgYi9zcmMvY29yZS9uZ3hfcGFsbG9jLmMKaW5kZXggZmM2ZjM2ZS4uOGZhZjlhNyAxMDA2NDQKLS0tIGEvc3JjL2NvcmUvbmd4X3BhbGxvYy5jCisrKyBiL3NyYy9jb3JlL25neF9wYWxsb2MuYwpAQCAtOCwxMSArOCwxMyBAQAogI2luY2x1ZGUgPG5neF9jb3JlLmg+CiAKIAotbmd4X3Bvb2xfdCAqbmd4X2NyZWF0ZV9wb29sKHNpemVfdCBzaXplLCBuZ3hfbG9nX3QgKmxvZykKK25neF9wb29sX3QgKgorbmd4X2NyZWF0ZV9wb29sKHNpemVfdCBzaXplLCBuZ3hfbG9nX3QgKmxvZykKIHsKICAgICBuZ3hfcG9vbF90ICAqcDsKIAotICAgIGlmICghKHAgPSBuZ3hfYWxsb2Moc2l6ZSwgbG9nKSkpIHsKKyAgICBwID0gbmd4X2FsbG9jKHNpemUsIGxvZyk7CisgICAgaWYgKHAgPT0gTlVMTCkgewogICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIApAQCAtMjYsNyArMjgsOCBAQAogfQogCiAKLXZvaWQgbmd4X2Rlc3Ryb3lfcG9vbChuZ3hfcG9vbF90ICpwb29sKQordm9pZAorbmd4X2Rlc3Ryb3lfcG9vbChuZ3hfcG9vbF90ICpwb29sKQogewogICAgIG5neF9wb29sX3QgICAgICAgICpwLCAqbjsKICAgICBuZ3hfcG9vbF9sYXJnZV90ICAqbDsKQEAgLTY4LDcgKzcxLDggQEAKIH0KIAogCi12b2lkICpuZ3hfcGFsbG9jKG5neF9wb29sX3QgKnBvb2wsIHNpemVfdCBzaXplKQordm9pZCAqCituZ3hfcGFsbG9jKG5neF9wb29sX3QgKnBvb2wsIHNpemVfdCBzaXplKQogewogICAgIHVfY2hhciAgICAgICAgICAgICptOwogICAgIG5neF9wb29sX3QgICAgICAgICpwLCAqbjsKQEAgLTk0LDcgKzk4LDggQEAKIAogICAgICAgICAvKiBhbGxvY2F0ZSBhIG5ldyBwb29sIGJsb2NrICovCiAKLSAgICAgICAgaWYgKCEobiA9IG5neF9jcmVhdGVfcG9vbCgoc2l6ZV90KSAocC0+ZW5kIC0gKHVfY2hhciAqKSBwKSwgcC0+bG9nKSkpIHsKKyAgICAgICAgbiA9IG5neF9jcmVhdGVfcG9vbCgoc2l6ZV90KSAocC0+ZW5kIC0gKHVfY2hhciAqKSBwKSwgcC0+bG9nKTsKKyAgICAgICAgaWYgKG4gPT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KIApAQCAtMTI1LDcgKzEzMCw4IEBACiAgICAgfQogCiAgICAgaWYgKGxhcmdlID09IE5VTEwpIHsKLSAgICAgICAgaWYgKCEobGFyZ2UgPSBuZ3hfcGFsbG9jKHBvb2wsIHNpemVvZihuZ3hfcG9vbF9sYXJnZV90KSkpKSB7CisgICAgICAgIGxhcmdlID0gbmd4X3BhbGxvYyhwb29sLCBzaXplb2Yobmd4X3Bvb2xfbGFyZ2VfdCkpOworICAgICAgICBpZiAobGFyZ2UgPT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KIApAQCAtMTMzLDExICsxMzksMTMgQEAKICAgICB9CiAKICNpZiAwCi0gICAgaWYgKCEocCA9IG5neF9tZW1hbGlnbihuZ3hfcGFnZXNpemUsIHNpemUsIHBvb2wtPmxvZykpKSB7CisgICAgcCA9IG5neF9tZW1hbGlnbihuZ3hfcGFnZXNpemUsIHNpemUsIHBvb2wtPmxvZyk7CisgICAgaWYgKHAgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAjZWxzZQotICAgIGlmICghKHAgPSBuZ3hfYWxsb2Moc2l6ZSwgcG9vbC0+bG9nKSkpIHsKKyAgICBwID0gbmd4X2FsbG9jKHNpemUsIHBvb2wtPmxvZyk7CisgICAgaWYgKHAgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAjZW5kaWYKQEAgLTE1NSw3ICsxNjMsOCBAQAogfQogCiAKLW5neF9pbnRfdCBuZ3hfcGZyZWUobmd4X3Bvb2xfdCAqcG9vbCwgdm9pZCAqcCkKK25neF9pbnRfdAorbmd4X3BmcmVlKG5neF9wb29sX3QgKnBvb2wsIHZvaWQgKnApCiB7CiAgICAgbmd4X3Bvb2xfbGFyZ2VfdCAgKmw7CiAKQEAgLTE3NCw3ICsxODMsOCBAQAogfQogCiAKLXZvaWQgKm5neF9wY2FsbG9jKG5neF9wb29sX3QgKnBvb2wsIHNpemVfdCBzaXplKQordm9pZCAqCituZ3hfcGNhbGxvYyhuZ3hfcG9vbF90ICpwb29sLCBzaXplX3Qgc2l6ZSkKIHsKICAgICB2b2lkICpwOwogCkBAIC0xODgsNyArMTk4LDggQEAKIAogI2lmIDAKIAotc3RhdGljIHZvaWQgKm5neF9nZXRfY2FjaGVkX2Jsb2NrKHNpemVfdCBzaXplKQorc3RhdGljIHZvaWQgKgorbmd4X2dldF9jYWNoZWRfYmxvY2soc2l6ZV90IHNpemUpCiB7CiAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICpwOwogICAgIG5neF9jYWNoZWRfYmxvY2tfc2xvdF90ICAqc2xvdDsKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL25neF9wYWxsb2MuaCBiL3NyYy9jb3JlL25neF9wYWxsb2MuaAppbmRleCA3MWJlNzQyLi5iMzEwMDgyIDEwMDY0NAotLS0gYS9zcmMvY29yZS9uZ3hfcGFsbG9jLmgKKysrIGIvc3JjL2NvcmUvbmd4X3BhbGxvYy5oCkBAIC0yMSw4ICsyMSw2IEBACiAKICNkZWZpbmUgTkdYX0RFRkFVTFRfUE9PTF9TSVpFICAgKDE2ICogMTAyNCkKIAotI2RlZmluZSBuZ3hfdGVzdF9udWxsKHAsIGFsbG9jLCByYykgIGlmICgocCA9IGFsbG9jKSA9PSBOVUxMKSB7IHJldHVybiByYzsgfQotCiAKIHR5cGVkZWYgc3RydWN0IG5neF9wb29sX2xhcmdlX3MgIG5neF9wb29sX2xhcmdlX3Q7CiAKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL25neF9yYWRpeF90cmVlLmMgYi9zcmMvY29yZS9uZ3hfcmFkaXhfdHJlZS5jCmluZGV4IGY4ZGViMjEuLmY4MmE1ZTUgMTAwNjQ0Ci0tLSBhL3NyYy9jb3JlL25neF9yYWRpeF90cmVlLmMKKysrIGIvc3JjL2NvcmUvbmd4X3JhZGl4X3RyZWUuYwpAQCAtMTcsNyArMTcsOCBAQAogICAgIHVpbnQzMl90ICAgICAgICAgICBrZXksIG1hc2ssIGluYzsKICAgICBuZ3hfcmFkaXhfdHJlZV90ICAqdHJlZTsKIAotICAgIGlmICghKHRyZWUgPSBuZ3hfcGFsbG9jKHBvb2wsIHNpemVvZihuZ3hfcmFkaXhfdHJlZV90KSkpKSB7CisgICAgdHJlZSA9IG5neF9wYWxsb2MocG9vbCwgc2l6ZW9mKG5neF9yYWRpeF90cmVlX3QpKTsKKyAgICBpZiAodHJlZSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIApAQCAtMjYsNyArMjcsOCBAQAogICAgIHRyZWUtPnN0YXJ0ID0gTlVMTDsKICAgICB0cmVlLT5zaXplID0gMDsKIAotICAgIGlmICghKHRyZWUtPnJvb3QgPSBuZ3hfcmFkaXhfYWxsb2ModHJlZSkpKSB7CisgICAgdHJlZS0+cm9vdCA9IG5neF9yYWRpeF9hbGxvYyh0cmVlKTsKKyAgICBpZiAodHJlZS0+cm9vdCA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIApAQCAtMTQwLDcgKzE0Miw4IEBACiAgICAgfQogCiAgICAgd2hpbGUgKGJpdCAmIG1hc2spIHsKLSAgICAgICAgaWYgKCEobmV4dCA9IG5neF9yYWRpeF9hbGxvYyh0cmVlKSkpIHsKKyAgICAgICAgbmV4dCA9IG5neF9yYWRpeF9hbGxvYyh0cmVlKTsKKyAgICAgICAgaWYgKG5leHQgPT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICAgICAgfQogCkBAIC0yNjYsNyArMjY5LDggQEAKICAgICB9CiAKICAgICBpZiAodHJlZS0+c2l6ZSA8IHNpemVvZihuZ3hfcmFkaXhfbm9kZV90KSkgewotICAgICAgICBpZiAoISh0cmVlLT5zdGFydCA9IG5neF9wYWxsb2ModHJlZS0+cG9vbCwgbmd4X3BhZ2VzaXplKSkpIHsKKyAgICAgICAgdHJlZS0+c3RhcnQgPSBuZ3hfcGFsbG9jKHRyZWUtPnBvb2wsIG5neF9wYWdlc2l6ZSk7CisgICAgICAgIGlmICh0cmVlLT5zdGFydCA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvY29yZS9uZ3hfcmVnZXguYyBiL3NyYy9jb3JlL25neF9yZWdleC5jCmluZGV4IGJiNzE5YTUuLjEyNTc5OTQgMTAwNjQ0Ci0tLSBhL3NyYy9jb3JlL25neF9yZWdleC5jCisrKyBiL3NyYy9jb3JlL25neF9yZWdleC5jCkBAIC03OSw3ICs3OSw3IEBACiB9CiAKIAotbmd4X3VpbnRfdCBuZ3hfcmVnZXhfY2FwdHVyZV9jb3VudChuZ3hfcmVnZXhfdCAqcmUpCituZ3hfaW50X3Qgbmd4X3JlZ2V4X2NhcHR1cmVfY291bnQobmd4X3JlZ2V4X3QgKnJlKQogewogICAgIGludCAgcmMsIG47CiAKQEAgLTg3LDcgKzg3LDExIEBACiAKICAgICByYyA9IHBjcmVfZnVsbGluZm8ocmUsIE5VTEwsIFBDUkVfSU5GT19DQVBUVVJFQ09VTlQsICZuKTsKIAotICAgIHJldHVybiAobmd4X3VpbnRfdCkgbjsKKyAgICBpZiAocmMgPCAwKSB7CisgICAgICAgIHJldHVybiAobmd4X2ludF90KSByYzsKKyAgICB9CisKKyAgICByZXR1cm4gKG5neF9pbnRfdCkgbjsKIH0KIAogCmRpZmYgLS1naXQgYS9zcmMvY29yZS9uZ3hfcmVnZXguaCBiL3NyYy9jb3JlL25neF9yZWdleC5oCmluZGV4IGZmMDdmYzcuLjdlZWZkYmUgMTAwNjQ0Ci0tLSBhL3NyYy9jb3JlL25neF9yZWdleC5oCisrKyBiL3NyYy9jb3JlL25neF9yZWdleC5oCkBAIC0yMywxMSArMjMsMTIgQEAKIHZvaWQgbmd4X3JlZ2V4X2luaXQodm9pZCk7CiBuZ3hfcmVnZXhfdCAqbmd4X3JlZ2V4X2NvbXBpbGUobmd4X3N0cl90ICpwYXR0ZXJuLCBuZ3hfaW50X3Qgb3B0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfcG9vbF90ICpwb29sLCBuZ3hfc3RyX3QgKmVycik7Ci1uZ3hfdWludF90IG5neF9yZWdleF9jYXB0dXJlX2NvdW50KG5neF9yZWdleF90ICpyZSk7CituZ3hfaW50X3Qgbmd4X3JlZ2V4X2NhcHR1cmVfY291bnQobmd4X3JlZ2V4X3QgKnJlKTsKIG5neF9pbnRfdCBuZ3hfcmVnZXhfZXhlYyhuZ3hfcmVnZXhfdCAqcmUsIG5neF9zdHJfdCAqcywKICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmNhcHR1cmVzLCBuZ3hfaW50X3Qgc2l6ZSk7CiAKLSNkZWZpbmUgbmd4X3JlZ2V4X2V4ZWNfbiAgInBjcmVfZXhlYygpIgorI2RlZmluZSBuZ3hfcmVnZXhfZXhlY19uICAgICAgICAgICAicGNyZV9leGVjKCkiCisjZGVmaW5lIG5neF9yZWdleF9jYXB0dXJlX2NvdW50X24gICJwY3JlX2Z1bGxpbmZvKCkiCiAKIAogI2VuZGlmIC8qIF9OR1hfUkVHRVhfSF9JTkNMVURFRF8gKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL25neF9zdHJpbmcuYyBiL3NyYy9jb3JlL25neF9zdHJpbmcuYwppbmRleCBmZGI1OWZkLi5hMWY1OTNmIDEwMDY0NAotLS0gYS9zcmMvY29yZS9uZ3hfc3RyaW5nLmMKKysrIGIvc3JjL2NvcmUvbmd4X3N0cmluZy5jCkBAIC0zNCw3ICszNCw4IEBACiB7CiAgICAgdV9jaGFyICAqZHN0OwogCi0gICAgaWYgKCEoZHN0ID0gbmd4X3BhbGxvYyhwb29sLCBzcmMtPmxlbikpKSB7CisgICAgZHN0ID0gbmd4X3BhbGxvYyhwb29sLCBzcmMtPmxlbik7CisgICAgaWYgKGRzdCA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIApAQCAtNDg5LDYgKzQ5MCw4NCBAQAogfQogCiAKK3NzaXplX3QKK25neF9hdG9zeih1X2NoYXIgKmxpbmUsIHNpemVfdCBuKQoreworICAgIHNzaXplX3QgIHZhbHVlOworCisgICAgaWYgKG4gPT0gMCkgeworICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgIH0KKworICAgIGZvciAodmFsdWUgPSAwOyBuLS07IGxpbmUrKykgeworICAgICAgICBpZiAoKmxpbmUgPCAnMCcgfHwgKmxpbmUgPiAnOScpIHsKKyAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICB2YWx1ZSA9IHZhbHVlICogMTAgKyAoKmxpbmUgLSAnMCcpOworICAgIH0KKworICAgIGlmICh2YWx1ZSA8IDApIHsKKyAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9Cit9CisKKworb2ZmX3QKK25neF9hdG9vZih1X2NoYXIgKmxpbmUsIHNpemVfdCBuKQoreworICAgIG9mZl90ICB2YWx1ZTsKKworICAgIGlmIChuID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICB9CisKKyAgICBmb3IgKHZhbHVlID0gMDsgbi0tOyBsaW5lKyspIHsKKyAgICAgICAgaWYgKCpsaW5lIDwgJzAnIHx8ICpsaW5lID4gJzknKSB7CisgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgdmFsdWUgPSB2YWx1ZSAqIDEwICsgKCpsaW5lIC0gJzAnKTsKKyAgICB9CisKKyAgICBpZiAodmFsdWUgPCAwKSB7CisgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorfQorCisKK3RpbWVfdAorbmd4X2F0b3RtKHVfY2hhciAqbGluZSwgc2l6ZV90IG4pCit7CisgICAgdGltZV90ICB2YWx1ZTsKKworICAgIGlmIChuID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICB9CisKKyAgICBmb3IgKHZhbHVlID0gMDsgbi0tOyBsaW5lKyspIHsKKyAgICAgICAgaWYgKCpsaW5lIDwgJzAnIHx8ICpsaW5lID4gJzknKSB7CisgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgdmFsdWUgPSB2YWx1ZSAqIDEwICsgKCpsaW5lIC0gJzAnKTsKKyAgICB9CisKKyAgICBpZiAodmFsdWUgPCAwKSB7CisgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorfQorCisKIG5neF9pbnRfdAogbmd4X2hleHRvaSh1X2NoYXIgKmxpbmUsIHNpemVfdCBuKQogewpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbmd4X3N0cmluZy5oIGIvc3JjL2NvcmUvbmd4X3N0cmluZy5oCmluZGV4IDUyYmFjNmEuLjI1YjA2YjMgMTAwNjQ0Ci0tLSBhL3NyYy9jb3JlL25neF9zdHJpbmcuaAorKysgYi9zcmMvY29yZS9uZ3hfc3RyaW5nLmgKQEAgLTIzLDYgKzIzLDcgQEAKIAogCiAjZGVmaW5lIG5neF90b2xvd2VyKGMpICAgICAodV9jaGFyKSAoKGMgPj0gJ0EnICYmIGMgPD0gJ1onKSA/IChjIHwgMHgyMCkgOiBjKQorI2RlZmluZSBuZ3hfdG91cHBlcihjKSAgICAgKHVfY2hhcikgKChjID49ICdhJyAmJiBjIDw9ICd6JykgPyAoYyAmIH4weDIwKSA6IGMpCiAKIAogI2lmIChOR1hfV0lOMzIpCkBAIC04MSw2ICs4Miw5IEBACiBuZ3hfaW50X3Qgbmd4X3JzdHJuY2FzZWNtcCh1X2NoYXIgKnMxLCB1X2NoYXIgKnMyLCBzaXplX3Qgbik7CiAKIG5neF9pbnRfdCBuZ3hfYXRvaSh1X2NoYXIgKmxpbmUsIHNpemVfdCBuKTsKK3NzaXplX3Qgbmd4X2F0b3N6KHVfY2hhciAqbGluZSwgc2l6ZV90IG4pOworb2ZmX3Qgbmd4X2F0b29mKHVfY2hhciAqbGluZSwgc2l6ZV90IG4pOwordGltZV90IG5neF9hdG90bSh1X2NoYXIgKmxpbmUsIHNpemVfdCBuKTsKIG5neF9pbnRfdCBuZ3hfaGV4dG9pKHVfY2hhciAqbGluZSwgc2l6ZV90IG4pOwogCiB2b2lkIG5neF9tZDVfdGV4dCh1X2NoYXIgKnRleHQsIHVfY2hhciAqbWQ1KTsKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL25neF90aW1lcy5jIGIvc3JjL2NvcmUvbmd4X3RpbWVzLmMKaW5kZXggNDI5MzI4OS4uZTRmYTY5ZCAxMDA2NDQKLS0tIGEvc3JjL2NvcmUvbmd4X3RpbWVzLmMKKysrIGIvc3JjL2NvcmUvbmd4X3RpbWVzLmMKQEAgLTcwLDggKzcwLDggQEAKIHN0YXRpYyBjaGFyICAqbW9udGhzW10gPSB7ICJKYW4iLCAiRmViIiwgIk1hciIsICJBcHIiLCAiTWF5IiwgIkp1biIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSnVsIiwgIkF1ZyIsICJTZXAiLCAiT2N0IiwgIk5vdiIsICJEZWMiIH07CiAKLQotdm9pZCBuZ3hfdGltZV9pbml0KHZvaWQpCit2b2lkCituZ3hfdGltZV9pbml0KHZvaWQpCiB7CiAgICAgc3RydWN0IHRpbWV2YWwgIHR2OwogCkBAIC0xMDQsOSArMTA0LDEyIEBACiAKICNpZiAoTkdYX1RIUkVBRFMpCiAKLW5neF9pbnRfdCBuZ3hfdGltZV9tdXRleF9pbml0KG5neF9sb2dfdCAqbG9nKQorbmd4X2ludF90CituZ3hfdGltZV9tdXRleF9pbml0KG5neF9sb2dfdCAqbG9nKQogewotICAgIGlmICghKG5neF90aW1lX211dGV4ID0gbmd4X211dGV4X2luaXQobG9nLCBOR1hfTVVURVhfTElHSFQpKSkgeworICAgIG5neF90aW1lX211dGV4ID0gbmd4X211dGV4X2luaXQobG9nLCBOR1hfTVVURVhfTElHSFQpOworCisgICAgaWYgKG5neF90aW1lX211dGV4ID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICB9CiAKQEAgLTExNiw3ICsxMTksOCBAQAogI2VuZGlmCiAKIAotdm9pZCBuZ3hfdGltZV91cGRhdGUodGltZV90IHMpCit2b2lkCituZ3hfdGltZV91cGRhdGUodGltZV90IHMpCiB7CiAgICAgdV9jaGFyICAgICpwOwogICAgIG5neF90bV90ICAgdG07CkBAIC0yMDksNyArMjEzLDggQEAKIH0KIAogCi11X2NoYXIgKm5neF9odHRwX3RpbWUodV9jaGFyICpidWYsIHRpbWVfdCB0KQordV9jaGFyICoKK25neF9odHRwX3RpbWUodV9jaGFyICpidWYsIHRpbWVfdCB0KQogewogICAgIG5neF90bV90ICB0bTsKIApAQCAtMjI2LDcgKzIzMSw4IEBACiB9CiAKIAotdV9jaGFyICpuZ3hfaHR0cF9jb29raWVfdGltZSh1X2NoYXIgKmJ1ZiwgdGltZV90IHQpCit1X2NoYXIgKgorbmd4X2h0dHBfY29va2llX3RpbWUodV9jaGFyICpidWYsIHRpbWVfdCB0KQogewogICAgIG5neF90bV90ICB0bTsKIApAQCAtMjUyLDcgKzI1OCw4IEBACiB9CiAKIAotdm9pZCBuZ3hfZ210aW1lKHRpbWVfdCB0LCBuZ3hfdG1fdCAqdHApCit2b2lkCituZ3hfZ210aW1lKHRpbWVfdCB0LCBuZ3hfdG1fdCAqdHApCiB7CiAgICAgbmd4X2ludF90ICBzZWMsIG1pbiwgaG91ciwgbWRheSwgbW9uLCB5ZWFyLCB3ZGF5LCB5ZGF5LCBkYXlzOwogCmRpZmYgLS1naXQgYS9zcmMvY29yZS9uZ3hfdW5peF9kb21haW4uYyBiL3NyYy9jb3JlL25neF91bml4X2RvbWFpbi5jCmluZGV4IDQzNjc3N2YuLjNkZjgzYmIgMTAwNjQ0Ci0tLSBhL3NyYy9jb3JlL25neF91bml4X2RvbWFpbi5jCisrKyBiL3NyYy9jb3JlL25neF91bml4X2RvbWFpbi5jCkBAIC01OSwxMSArNTksMTMgQEAKIAogICAgIC8qIE1QOiBuZ3hfc2hhcmVkX3BhbGxvYygpICovCiAKLSAgICBpZiAoIShwZWVycyA9IG5neF9wY2FsbG9jKGNmLT5wb29sLCBzaXplb2Yobmd4X3BlZXJzX3QpKSkpIHsKKyAgICBwZWVycyA9IG5neF9wY2FsbG9jKGNmLT5wb29sLCBzaXplb2Yobmd4X3BlZXJzX3QpKTsKKyAgICBpZiAocGVlcnMgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICBpZiAoIShzdW4gPSBuZ3hfcGNhbGxvYyhjZi0+cG9vbCwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl91bikpKSkgeworICAgIHN1biA9IG5neF9wY2FsbG9jKGNmLT5wb29sLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX3VuKSk7CisgICAgaWYgKHN1biA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2V2ZW50L21vZHVsZXMvbmd4X2RldnBvbGxfbW9kdWxlLmMgYi9zcmMvZXZlbnQvbW9kdWxlcy9uZ3hfZGV2cG9sbF9tb2R1bGUuYwppbmRleCAyZDk0YmE0Li41N2I2YjEyIDEwMDY0NAotLS0gYS9zcmMvZXZlbnQvbW9kdWxlcy9uZ3hfZGV2cG9sbF9tb2R1bGUuYworKysgYi9zcmMvZXZlbnQvbW9kdWxlcy9uZ3hfZGV2cG9sbF9tb2R1bGUuYwpAQCAtMTM0LDE5ICsxMzQsMjEgQEAKICAgICAgICAgICAgIG5neF9mcmVlKGNoYW5nZV9saXN0KTsKICAgICAgICAgfQogCi0gICAgICAgIG5neF90ZXN0X251bGwoY2hhbmdlX2xpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgbmd4X2FsbG9jKHNpemVvZihzdHJ1Y3QgcG9sbGZkKSAqIGRwY2YtPmNoYW5nZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN5Y2xlLT5sb2cpLAotICAgICAgICAgICAgICAgICAgICAgIE5HWF9FUlJPUik7CisgICAgICAgIGNoYW5nZV9saXN0ID0gbmd4X2FsbG9jKHNpemVvZihzdHJ1Y3QgcG9sbGZkKSAqIGRwY2YtPmNoYW5nZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN5Y2xlLT5sb2cpOworICAgICAgICBpZiAoY2hhbmdlX2xpc3QgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICAgICAgfQogCiAgICAgICAgIGlmIChjaGFuZ2VfaW5kZXgpIHsKICAgICAgICAgICAgIG5neF9mcmVlKGNoYW5nZV9pbmRleCk7CiAgICAgICAgIH0KIAotICAgICAgICBuZ3hfdGVzdF9udWxsKGNoYW5nZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICBuZ3hfYWxsb2Moc2l6ZW9mKG5neF9ldmVudF90ICopICogZHBjZi0+Y2hhbmdlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ljbGUtPmxvZyksCi0gICAgICAgICAgICAgICAgICAgICAgTkdYX0VSUk9SKTsKKyAgICAgICAgY2hhbmdlX2luZGV4ID0gbmd4X2FsbG9jKHNpemVvZihuZ3hfZXZlbnRfdCAqKSAqIGRwY2YtPmNoYW5nZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeWNsZS0+bG9nKTsKKyAgICAgICAgaWYgKGNoYW5nZV9pbmRleCA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgICAgICB9CiAgICAgfQogCiAgICAgbWF4X2NoYW5nZXMgPSBkcGNmLT5jaGFuZ2VzOwpAQCAtMTU2LDEwICsxNTgsMTEgQEAKICAgICAgICAgICAgIG5neF9mcmVlKGV2ZW50X2xpc3QpOwogICAgICAgICB9CiAKLSAgICAgICAgbmd4X3Rlc3RfbnVsbChldmVudF9saXN0LAotICAgICAgICAgICAgICAgICAgICAgIG5neF9hbGxvYyhzaXplb2Yoc3RydWN0IHBvbGxmZCkgKiBkcGNmLT5ldmVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN5Y2xlLT5sb2cpLAotICAgICAgICAgICAgICAgICAgICAgIE5HWF9FUlJPUik7CisgICAgICAgIGV2ZW50X2xpc3QgPSBuZ3hfYWxsb2Moc2l6ZW9mKHN0cnVjdCBwb2xsZmQpICogZHBjZi0+ZXZlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN5Y2xlLT5sb2cpOworICAgICAgICBpZiAoZXZlbnRfbGlzdCA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgICAgICB9CiAgICAgfQogCiAgICAgbmV2ZW50cyA9IGRwY2YtPmV2ZW50czsKQEAgLTMxOCwxMSArMzIxLDEzIEBACiB7CiAgICAgaW50ICAgICAgICAgICAgICAgICBldmVudHMsIHJldmVudHM7CiAgICAgbmd4X2ludF90ICAgICAgICAgICBpOwotICAgIG5neF91aW50X3QgICAgICAgICAgaiwgbG9jaywgYWNjZXB0X2xvY2ssIGV4cGlyZTsKKyAgICBuZ3hfdWludF90ICAgICAgICAgIGxvY2ssIGFjY2VwdF9sb2NrLCBleHBpcmU7CiAgICAgc2l6ZV90ICAgICAgICAgICAgICBuOwogICAgIG5neF9tc2VjX3QgICAgICAgICAgdGltZXI7CiAgICAgbmd4X2Vycl90ICAgICAgICAgICBlcnI7CisjaWYgMAogICAgIG5neF9jeWNsZV90ICAgICAgICoqb2xkX2N5Y2xlOworI2VuZGlmCiAgICAgbmd4X2V2ZW50X3QgICAgICAgICpyZXYsICp3ZXY7CiAgICAgbmd4X2Nvbm5lY3Rpb25fdCAgICpjOwogICAgIG5neF9lcG9jaF9tc2VjX3QgICAgZGVsdGE7CkBAIC01ODAsOCArNTg1LDEwIEBACiB7CiAgICAgbmd4X2RldnBvbGxfY29uZl90ICAqZHBjZjsKIAotICAgIG5neF90ZXN0X251bGwoZHBjZiwgbmd4X3BhbGxvYyhjeWNsZS0+cG9vbCwgc2l6ZW9mKG5neF9kZXZwb2xsX2NvbmZfdCkpLAotICAgICAgICAgICAgICAgICAgTkdYX0NPTkZfRVJST1IpOworICAgIGRwY2YgPSBuZ3hfcGFsbG9jKGN5Y2xlLT5wb29sLCBzaXplb2Yobmd4X2RldnBvbGxfY29uZl90KSk7CisgICAgaWYgKGRwY2YgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgfQogCiAgICAgZHBjZi0+Y2hhbmdlcyA9IE5HWF9DT05GX1VOU0VUOwogICAgIGRwY2YtPmV2ZW50cyA9IE5HWF9DT05GX1VOU0VUOwpkaWZmIC0tZ2l0IGEvc3JjL2V2ZW50L21vZHVsZXMvbmd4X2Vwb2xsX21vZHVsZS5jIGIvc3JjL2V2ZW50L21vZHVsZXMvbmd4X2Vwb2xsX21vZHVsZS5jCmluZGV4IGYyYzk3M2YuLjE0Yjc3NTAgMTAwNjQ0Ci0tLSBhL3NyYy9ldmVudC9tb2R1bGVzL25neF9lcG9sbF9tb2R1bGUuYworKysgYi9zcmMvZXZlbnQvbW9kdWxlcy9uZ3hfZXBvbGxfbW9kdWxlLmMKQEAgLTEzMyw3ICsxMzMsNiBAQAogc3RhdGljIG5neF9pbnRfdAogbmd4X2Vwb2xsX2luaXQobmd4X2N5Y2xlX3QgKmN5Y2xlKQogewotICAgIHNpemVfdCAgICAgICAgICAgICBuOwogICAgIG5neF9ldmVudF9jb25mX3QgICplY2Y7CiAgICAgbmd4X2Vwb2xsX2NvbmZfdCAgKmVwY2Y7CiAKQEAgLTM4MCw3ICszNzksNiBAQAogbmd4X2Vwb2xsX3Byb2Nlc3NfZXZlbnRzKG5neF9jeWNsZV90ICpjeWNsZSkKIHsKICAgICBpbnQgICAgICAgICAgICAgICAgZXZlbnRzOwotICAgIHNpemVfdCAgICAgICAgICAgICBuOwogICAgIHVpbnQzMl90ICAgICAgICAgICByZXZlbnRzOwogICAgIG5neF9pbnRfdCAgICAgICAgICBpbnN0YW5jZSwgaTsKICAgICBuZ3hfdWludF90ICAgICAgICAgbG9jaywgYWNjZXB0X2xvY2ssIGV4cGlyZTsKQEAgLTY2Myw4ICs2NjEsMTAgQEAKIHsKICAgICBuZ3hfZXBvbGxfY29uZl90ICAqZXBjZjsKIAotICAgIG5neF90ZXN0X251bGwoZXBjZiwgbmd4X3BhbGxvYyhjeWNsZS0+cG9vbCwgc2l6ZW9mKG5neF9lcG9sbF9jb25mX3QpKSwKLSAgICAgICAgICAgICAgICAgIE5HWF9DT05GX0VSUk9SKTsKKyAgICBlcGNmID0gbmd4X3BhbGxvYyhjeWNsZS0+cG9vbCwgc2l6ZW9mKG5neF9lcG9sbF9jb25mX3QpKTsKKyAgICBpZiAoZXBjZiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICB9CiAKICAgICBlcGNmLT5ldmVudHMgPSBOR1hfQ09ORl9VTlNFVDsKIApkaWZmIC0tZ2l0IGEvc3JjL2V2ZW50L21vZHVsZXMvbmd4X2lvY3BfbW9kdWxlLmMgYi9zcmMvZXZlbnQvbW9kdWxlcy9uZ3hfaW9jcF9tb2R1bGUuYwppbmRleCA0YTNjZDlmLi4wYTA0YTIwIDEwMDY0NAotLS0gYS9zcmMvZXZlbnQvbW9kdWxlcy9uZ3hfaW9jcF9tb2R1bGUuYworKysgYi9zcmMvZXZlbnQvbW9kdWxlcy9uZ3hfaW9jcF9tb2R1bGUuYwpAQCAtOTAsNyArOTAsOCBAQAogc3RhdGljIEhBTkRMRSAgaW9jcDsKIAogCi1zdGF0aWMgbmd4X2ludF90IG5neF9pb2NwX2luaXQobmd4X2N5Y2xlX3QgKmN5Y2xlKQorc3RhdGljIG5neF9pbnRfdAorbmd4X2lvY3BfaW5pdChuZ3hfY3ljbGVfdCAqY3ljbGUpCiB7CiAgICAgbmd4X2lvY3BfY29uZl90ICAqY2Y7CiAKQEAgLTExNyw3ICsxMTgsOCBAQAogfQogCiAKLXN0YXRpYyB2b2lkIG5neF9pb2NwX2RvbmUobmd4X2N5Y2xlX3QgKmN5Y2xlKQorc3RhdGljIHZvaWQKK25neF9pb2NwX2RvbmUobmd4X2N5Y2xlX3QgKmN5Y2xlKQogewogICAgIGlmIChDbG9zZUhhbmRsZShpb2NwKSA9PSAtMSkgewogICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfQUxFUlQsIGN5Y2xlLT5sb2csIG5neF9lcnJubywKQEAgLTEyOCw3ICsxMzAsOCBAQAogfQogCiAKLXN0YXRpYyBuZ3hfaW50X3Qgbmd4X2lvY3BfYWRkX2V2ZW50KG5neF9ldmVudF90ICpldiwgaW50IGV2ZW50LCB1X2ludCBrZXkpCitzdGF0aWMgbmd4X2ludF90CituZ3hfaW9jcF9hZGRfZXZlbnQobmd4X2V2ZW50X3QgKmV2LCBpbnQgZXZlbnQsIHVfaW50IGtleSkKIHsKICAgICBuZ3hfY29ubmVjdGlvbl90ICAqYzsKIApAQCAtMTUwLDcgKzE1Myw4IEBACiB9CiAKIAotc3RhdGljIG5neF9pbnRfdCBuZ3hfaW9jcF9kZWxfY29ubmVjdGlvbihuZ3hfY29ubmVjdGlvbl90ICpjLCB1X2ludCBmbGFncykKK3N0YXRpYyBuZ3hfaW50X3QKK25neF9pb2NwX2RlbF9jb25uZWN0aW9uKG5neF9jb25uZWN0aW9uX3QgKmMsIHVfaW50IGZsYWdzKQogewogI2lmIDAKICAgICBpZiAoZmxhZ3MgJiBOR1hfQ0xPU0VfRVZFTlQpIHsKQEAgLTE2Nyw3ICsxNzEsOCBAQAogfQogCiAKLXN0YXRpYyBuZ3hfaW50X3Qgbmd4X2lvY3BfcHJvY2Vzc19ldmVudHMobmd4X2N5Y2xlX3QgKmN5Y2xlKQorc3RhdGljCituZ3hfaW50X3Qgbmd4X2lvY3BfcHJvY2Vzc19ldmVudHMobmd4X2N5Y2xlX3QgKmN5Y2xlKQogewogICAgIGludCAgICAgICAgICAgICAgICByYzsKICAgICB1X2ludCAgICAgICAgICAgICAga2V5OwpAQCAtMzAxLDEyICszMDYsMTUgQEAKIH0KIAogCi1zdGF0aWMgdm9pZCAqbmd4X2lvY3BfY3JlYXRlX2NvbmYobmd4X2N5Y2xlX3QgKmN5Y2xlKQorc3RhdGljIHZvaWQgKgorbmd4X2lvY3BfY3JlYXRlX2NvbmYobmd4X2N5Y2xlX3QgKmN5Y2xlKQogewogICAgIG5neF9pb2NwX2NvbmZfdCAgKmNmOwogCi0gICAgbmd4X3Rlc3RfbnVsbChjZiwgbmd4X3BhbGxvYyhjeWNsZS0+cG9vbCwgc2l6ZW9mKG5neF9pb2NwX2NvbmZfdCkpLAotICAgICAgICAgICAgICAgICAgTkdYX0NPTkZfRVJST1IpOworICAgIGNmID0gbmd4X3BhbGxvYyhjeWNsZS0+cG9vbCwgc2l6ZW9mKG5neF9pb2NwX2NvbmZfdCkpOworICAgIGlmIChjZiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICB9CiAKICAgICBjZi0+dGhyZWFkcyA9IE5HWF9DT05GX1VOU0VUOwogICAgIGNmLT5wb3N0X2FjY2VwdGV4ID0gTkdYX0NPTkZfVU5TRVQ7CkBAIC0zMTYsNyArMzI0LDggQEAKIH0KIAogCi1zdGF0aWMgY2hhciAqbmd4X2lvY3BfaW5pdF9jb25mKG5neF9jeWNsZV90ICpjeWNsZSwgdm9pZCAqY29uZikKK3N0YXRpYyBjaGFyICoKK25neF9pb2NwX2luaXRfY29uZihuZ3hfY3ljbGVfdCAqY3ljbGUsIHZvaWQgKmNvbmYpCiB7CiAgICAgbmd4X2lvY3BfY29uZl90ICpjZiA9IGNvbmY7CiAKZGlmZiAtLWdpdCBhL3NyYy9ldmVudC9tb2R1bGVzL25neF9rcXVldWVfbW9kdWxlLmMgYi9zcmMvZXZlbnQvbW9kdWxlcy9uZ3hfa3F1ZXVlX21vZHVsZS5jCmluZGV4IGI0NTU1ZDkuLjE0YmJmYWYgMTAwNjQ0Ci0tLSBhL3NyYy9ldmVudC9tb2R1bGVzL25neF9rcXVldWVfbW9kdWxlLmMKKysrIGIvc3JjL2V2ZW50L21vZHVsZXMvbmd4X2txdWV1ZV9tb2R1bGUuYwpAQCAtMTIzLDExICsxMjMsMTMgQEAKIAogI2lmIChOR1hfVEhSRUFEUykKIAotICAgICAgICBpZiAoIShsaXN0X211dGV4ID0gbmd4X211dGV4X2luaXQoY3ljbGUtPmxvZywgMCkpKSB7CisgICAgICAgIGxpc3RfbXV0ZXggPSBuZ3hfbXV0ZXhfaW5pdChjeWNsZS0+bG9nLCAwKTsKKyAgICAgICAgaWYgKGxpc3RfbXV0ZXggPT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICAgICAgfQogCi0gICAgICAgIGlmICghKGtldmVudF9tdXRleCA9IG5neF9tdXRleF9pbml0KGN5Y2xlLT5sb2csIDApKSkgeworICAgICAgICBrZXZlbnRfbXV0ZXggPSBuZ3hfbXV0ZXhfaW5pdChjeWNsZS0+bG9nLCAwKTsKKyAgICAgICAgaWYgKGtldmVudF9tdXRleCA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgICAgICB9CiAKQEAgLTc5Nyw4ICs3OTksMTAgQEAKIHsKICAgICBuZ3hfa3F1ZXVlX2NvbmZfdCAgKmtjZjsKIAotICAgIG5neF90ZXN0X251bGwoa2NmLCBuZ3hfcGFsbG9jKGN5Y2xlLT5wb29sLCBzaXplb2Yobmd4X2txdWV1ZV9jb25mX3QpKSwKLSAgICAgICAgICAgICAgICAgIE5HWF9DT05GX0VSUk9SKTsKKyAgICBrY2YgPSBuZ3hfcGFsbG9jKGN5Y2xlLT5wb29sLCBzaXplb2Yobmd4X2txdWV1ZV9jb25mX3QpKTsKKyAgICBpZiAoa2NmID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgIH0KIAogICAgIGtjZi0+Y2hhbmdlcyA9IE5HWF9DT05GX1VOU0VUOwogICAgIGtjZi0+ZXZlbnRzID0gTkdYX0NPTkZfVU5TRVQ7CmRpZmYgLS1naXQgYS9zcmMvZXZlbnQvbW9kdWxlcy9uZ3hfcG9sbF9tb2R1bGUuYyBiL3NyYy9ldmVudC9tb2R1bGVzL25neF9wb2xsX21vZHVsZS5jCmluZGV4IDZlYTNhZjQuLmMyNWE1NjEgMTAwNjQ0Ci0tLSBhL3NyYy9ldmVudC9tb2R1bGVzL25neF9wb2xsX21vZHVsZS5jCisrKyBiL3NyYy9ldmVudC9tb2R1bGVzL25neF9wb2xsX21vZHVsZS5jCkBAIC03MywxMCArNzMsMTEgQEAKICAgICAgICAgfHwgY3ljbGUtPm9sZF9jeWNsZSA9PSBOVUxMCiAgICAgICAgIHx8IGN5Y2xlLT5vbGRfY3ljbGUtPmNvbm5lY3Rpb25fbiA8IGN5Y2xlLT5jb25uZWN0aW9uX24pCiAgICAgewotICAgICAgICBuZ3hfdGVzdF9udWxsKGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgbmd4X2FsbG9jKHNpemVvZihzdHJ1Y3QgcG9sbGZkKSAqIGN5Y2xlLT5jb25uZWN0aW9uX24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN5Y2xlLT5sb2cpLAotICAgICAgICAgICAgICAgICAgICAgIE5HWF9FUlJPUik7CisgICAgICAgIGxpc3QgPSBuZ3hfYWxsb2Moc2l6ZW9mKHN0cnVjdCBwb2xsZmQpICogY3ljbGUtPmNvbm5lY3Rpb25fbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjeWNsZS0+bG9nKTsKKyAgICAgICAgaWYgKGxpc3QgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICAgICAgfQogCiAgICAgICAgIGlmIChldmVudF9saXN0KSB7CiAgICAgICAgICAgICBuZ3hfbWVtY3B5KGxpc3QsIGV2ZW50X2xpc3QsIHNpemVvZihuZ3hfZXZlbnRfdCAqKSAqIG5ldmVudHMpOwpAQCAtOTAsMTAgKzkxLDExIEBACiAgICAgICAgICAgICBuZ3hfZnJlZShyZWFkeV9pbmRleCk7CiAgICAgICAgIH0KIAotICAgICAgICBuZ3hfdGVzdF9udWxsKHJlYWR5X2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgIG5neF9hbGxvYyhzaXplb2Yobmd4X2V2ZW50X3QgKikgKiAyICogY3ljbGUtPmNvbm5lY3Rpb25fbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ljbGUtPmxvZyksCi0gICAgICAgICAgICAgICAgICAgICAgTkdYX0VSUk9SKTsKKyAgICAgICAgcmVhZHlfaW5kZXggPSBuZ3hfYWxsb2Moc2l6ZW9mKG5neF9ldmVudF90ICopICogMiAqIGN5Y2xlLT5jb25uZWN0aW9uX24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN5Y2xlLT5sb2cpOworICAgICAgICBpZiAocmVhZHlfaW5kZXggPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICAgICAgfQogI2VuZGlmCiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvZXZlbnQvbW9kdWxlcy9uZ3hfcnRzaWdfbW9kdWxlLmMgYi9zcmMvZXZlbnQvbW9kdWxlcy9uZ3hfcnRzaWdfbW9kdWxlLmMKaW5kZXggMDdiOGJkOS4uNmM5NDk3NyAxMDA2NDQKLS0tIGEvc3JjL2V2ZW50L21vZHVsZXMvbmd4X3J0c2lnX21vZHVsZS5jCisrKyBiL3NyYy9ldmVudC9tb2R1bGVzL25neF9ydHNpZ19tb2R1bGUuYwpAQCAtMjc0LDkgKzI3NCw4IEBACiBuZ3hfcnRzaWdfcHJvY2Vzc19ldmVudHMobmd4X2N5Y2xlX3QgKmN5Y2xlKQogewogICAgIGludCAgICAgICAgICAgICAgICAgc2lnbm87Ci0gICAgbmd4X2ludF90ICAgICAgICAgICBpbnN0YW5jZSwgaTsKKyAgICBuZ3hfaW50X3QgICAgICAgICAgIGluc3RhbmNlOwogICAgIG5neF91aW50X3QgICAgICAgICAgZXhwaXJlOwotICAgIHNpemVfdCAgICAgICAgICAgICAgbjsKICAgICBuZ3hfbXNlY190ICAgICAgICAgIHRpbWVyOwogICAgIG5neF9lcnJfdCAgICAgICAgICAgZXJyOwogICAgIHNpZ2luZm9fdCAgICAgICAgICAgc2k7CkBAIC03NzcsOCArNzc2LDEwIEBACiB7CiAgICAgbmd4X3J0c2lnX2NvbmZfdCAgKnJ0c2NmOwogCi0gICAgbmd4X3Rlc3RfbnVsbChydHNjZiwgbmd4X3BhbGxvYyhjeWNsZS0+cG9vbCwgc2l6ZW9mKG5neF9ydHNpZ19jb25mX3QpKSwKLSAgICAgICAgICAgICAgICAgIE5HWF9DT05GX0VSUk9SKTsKKyAgICBydHNjZiA9IG5neF9wYWxsb2MoY3ljbGUtPnBvb2wsIHNpemVvZihuZ3hfcnRzaWdfY29uZl90KSk7CisgICAgaWYgKHJ0c2NmID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgIH0KIAogICAgIHJ0c2NmLT5zaWdubyA9IE5HWF9DT05GX1VOU0VUOwogICAgIHJ0c2NmLT5vdmVyZmxvd19ldmVudHMgPSBOR1hfQ09ORl9VTlNFVDsKZGlmZiAtLWdpdCBhL3NyYy9ldmVudC9tb2R1bGVzL25neF9zZWxlY3RfbW9kdWxlLmMgYi9zcmMvZXZlbnQvbW9kdWxlcy9uZ3hfc2VsZWN0X21vZHVsZS5jCmluZGV4IDYyM2UxM2MuLjZlZGMyODQgMTAwNjQ0Ci0tLSBhL3NyYy9ldmVudC9tb2R1bGVzL25neF9zZWxlY3RfbW9kdWxlLmMKKysrIGIvc3JjL2V2ZW50L21vZHVsZXMvbmd4X3NlbGVjdF9tb2R1bGUuYwpAQCAtNzIsNyArNzIsOCBAQAogfTsKIAogCi1zdGF0aWMgbmd4X2ludF90IG5neF9zZWxlY3RfaW5pdChuZ3hfY3ljbGVfdCAqY3ljbGUpCitzdGF0aWMgbmd4X2ludF90CituZ3hfc2VsZWN0X2luaXQobmd4X2N5Y2xlX3QgKmN5Y2xlKQogewogICAgIG5neF9ldmVudF90ICAqKmluZGV4OwogCkBAIC04NiwxMCArODcsMTEgQEAKICAgICAgICAgfHwgY3ljbGUtPm9sZF9jeWNsZSA9PSBOVUxMCiAgICAgICAgIHx8IGN5Y2xlLT5vbGRfY3ljbGUtPmNvbm5lY3Rpb25fbiA8IGN5Y2xlLT5jb25uZWN0aW9uX24pCiAgICAgewotICAgICAgICBuZ3hfdGVzdF9udWxsKGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgIG5neF9hbGxvYyhzaXplb2Yobmd4X2V2ZW50X3QgKikgKiAyICogY3ljbGUtPmNvbm5lY3Rpb25fbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ljbGUtPmxvZyksCi0gICAgICAgICAgICAgICAgICAgICAgTkdYX0VSUk9SKTsKKyAgICAgICAgaW5kZXggPSBuZ3hfYWxsb2Moc2l6ZW9mKG5neF9ldmVudF90ICopICogMiAqIGN5Y2xlLT5jb25uZWN0aW9uX24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGN5Y2xlLT5sb2cpOworICAgICAgICBpZiAoaW5kZXggPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICAgICAgfQogCiAgICAgICAgIGlmIChldmVudF9pbmRleCkgewogICAgICAgICAgICAgbmd4X21lbWNweShpbmRleCwgZXZlbnRfaW5kZXgsIHNpemVvZihuZ3hfZXZlbnRfdCAqKSAqIG5ldmVudHMpOwpAQCAtMTAxLDEwICsxMDMsMTIgQEAKICAgICAgICAgaWYgKHJlYWR5X2luZGV4KSB7CiAgICAgICAgICAgICBuZ3hfZnJlZShyZWFkeV9pbmRleCk7CiAgICAgICAgIH0KLSAgICAgICAgbmd4X3Rlc3RfbnVsbChyZWFkeV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICBuZ3hfYWxsb2Moc2l6ZW9mKG5neF9ldmVudF90ICopICogMiAqIGN5Y2xlLT5jb25uZWN0aW9uX24sCi0gICAgICAgICAgICAgICAgICAgICAgY3ljbGUtPmxvZyksCi0gICAgICAgICAgICAgICAgICAgICAgTkdYX0VSUk9SKTsKKworICAgICAgICByZWFkeV9pbmRleCA9IG5neF9hbGxvYyhzaXplb2Yobmd4X2V2ZW50X3QgKikgKiAyICogY3ljbGUtPmNvbm5lY3Rpb25fbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ljbGUtPmxvZyk7CisgICAgICAgIGlmIChyZWFkeV9pbmRleCA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgICAgICB9CiAjZW5kaWYKICAgICB9CiAKQEAgLTEyNCw3ICsxMjgsOCBAQAogfQogCiAKLXN0YXRpYyB2b2lkIG5neF9zZWxlY3RfZG9uZShuZ3hfY3ljbGVfdCAqY3ljbGUpCitzdGF0aWMgdm9pZAorbmd4X3NlbGVjdF9kb25lKG5neF9jeWNsZV90ICpjeWNsZSkKIHsKICAgICBuZ3hfZnJlZShldmVudF9pbmRleCk7CiAjaWYgMApAQCAtMTM1LDcgKzE0MCw4IEBACiB9CiAKIAotc3RhdGljIG5neF9pbnRfdCBuZ3hfc2VsZWN0X2FkZF9ldmVudChuZ3hfZXZlbnRfdCAqZXYsIGludCBldmVudCwgdV9pbnQgZmxhZ3MpCitzdGF0aWMgbmd4X2ludF90CituZ3hfc2VsZWN0X2FkZF9ldmVudChuZ3hfZXZlbnRfdCAqZXYsIGludCBldmVudCwgdV9pbnQgZmxhZ3MpCiB7CiAgICAgbmd4X2Nvbm5lY3Rpb25fdCAgKmM7CiAKQEAgLTE5Niw3ICsyMDIsOCBAQAogfQogCiAKLXN0YXRpYyBuZ3hfaW50X3Qgbmd4X3NlbGVjdF9kZWxfZXZlbnQobmd4X2V2ZW50X3QgKmV2LCBpbnQgZXZlbnQsIHVfaW50IGZsYWdzKQorc3RhdGljIG5neF9pbnRfdAorbmd4X3NlbGVjdF9kZWxfZXZlbnQobmd4X2V2ZW50X3QgKmV2LCBpbnQgZXZlbnQsIHVfaW50IGZsYWdzKQogewogICAgIG5neF9jb25uZWN0aW9uX3QgICpjOwogCkBAIC0yNDgsNyArMjU1LDggQEAKIH0KIAogCi1zdGF0aWMgbmd4X2ludF90IG5neF9zZWxlY3RfcHJvY2Vzc19ldmVudHMobmd4X2N5Y2xlX3QgKmN5Y2xlKQorc3RhdGljIG5neF9pbnRfdAorbmd4X3NlbGVjdF9wcm9jZXNzX2V2ZW50cyhuZ3hfY3ljbGVfdCAqY3ljbGUpCiB7CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICByZWFkeSwgbnJlYWR5OwogICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgaSwgZm91bmQsIGxvY2ssIGV4cGlyZTsKQEAgLTU5Miw3ICs2MDAsOCBAQAogfQogCiAKLXN0YXRpYyBjaGFyICpuZ3hfc2VsZWN0X2luaXRfY29uZihuZ3hfY3ljbGVfdCAqY3ljbGUsIHZvaWQgKmNvbmYpCitzdGF0aWMgY2hhciAqCituZ3hfc2VsZWN0X2luaXRfY29uZihuZ3hfY3ljbGVfdCAqY3ljbGUsIHZvaWQgKmNvbmYpCiB7CiAgICAgbmd4X2V2ZW50X2NvbmZfdCAgKmVjZjsKIApkaWZmIC0tZ2l0IGEvc3JjL2V2ZW50L25neF9ldmVudC5jIGIvc3JjL2V2ZW50L25neF9ldmVudC5jCmluZGV4IDVhMDAyYzAuLjM3MWM1YzcgMTAwNjQ0Ci0tLSBhL3NyYy9ldmVudC9uZ3hfZXZlbnQuYworKysgYi9zcmMvZXZlbnQvbmd4X2V2ZW50LmMKQEAgLTIxOSw3ICsyMTksOCBAQAogCiAjZW5kaWYKIAotICAgIGlmICghKHNoYXJlZCA9IG5neF9jcmVhdGVfc2hhcmVkX21lbW9yeShzaXplLCBjeWNsZS0+bG9nKSkpIHsKKyAgICBzaGFyZWQgPSBuZ3hfY3JlYXRlX3NoYXJlZF9tZW1vcnkoc2l6ZSwgY3ljbGUtPmxvZyk7CisgICAgaWYgKHNoYXJlZCA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgfQogCkBAIC0yNzIsNyArMjczLDggQEAKICAgICB9CiAKICNpZiAoTkdYX1RIUkVBRFMpCi0gICAgaWYgKCEobmd4X3Bvc3RlZF9ldmVudHNfbXV0ZXggPSBuZ3hfbXV0ZXhfaW5pdChjeWNsZS0+bG9nLCAwKSkpIHsKKyAgICBuZ3hfcG9zdGVkX2V2ZW50c19tdXRleCA9IG5neF9tdXRleF9pbml0KGN5Y2xlLT5sb2csIDApOworICAgIGlmIChuZ3hfcG9zdGVkX2V2ZW50c19tdXRleCA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgfQogI2VuZGlmCkBAIC00OTcsNDIgKzQ5OSw0NyBAQAogCiBzdGF0aWMgY2hhciAqbmd4X2V2ZW50c19ibG9jayhuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqY21kLCB2b2lkICpjb25mKQogewotICAgIGludCAgICAgICAgICAgICAgICAgICAgbTsKLSAgICBjaGFyICAgICAgICAgICAgICAgICAgKnJ2OworICAgIGNoYXIgICAgICAgICAgICAgICAgICpydjsKICAgICB2b2lkICAgICAgICAgICAgICAgKioqY3R4OworICAgIG5neF91aW50X3QgICAgICAgICAgICBpOwogICAgIG5neF9jb25mX3QgICAgICAgICAgICBwY2Y7Ci0gICAgbmd4X2V2ZW50X21vZHVsZV90ICAgKm1vZHVsZTsKKyAgICBuZ3hfZXZlbnRfbW9kdWxlX3QgICAqbTsKIAogICAgIC8qIGNvdW50IHRoZSBudW1iZXIgb2YgdGhlIGV2ZW50IG1vZHVsZXMgYW5kIHNldCB1cCB0aGVpciBpbmRpY2VzICovCiAKICAgICBuZ3hfZXZlbnRfbWF4X21vZHVsZSA9IDA7Ci0gICAgZm9yIChtID0gMDsgbmd4X21vZHVsZXNbbV07IG0rKykgewotICAgICAgICBpZiAobmd4X21vZHVsZXNbbV0tPnR5cGUgIT0gTkdYX0VWRU5UX01PRFVMRSkgeworICAgIGZvciAoaSA9IDA7IG5neF9tb2R1bGVzW2ldOyBpKyspIHsKKyAgICAgICAgaWYgKG5neF9tb2R1bGVzW2ldLT50eXBlICE9IE5HWF9FVkVOVF9NT0RVTEUpIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKLSAgICAgICAgbmd4X21vZHVsZXNbbV0tPmN0eF9pbmRleCA9IG5neF9ldmVudF9tYXhfbW9kdWxlKys7CisgICAgICAgIG5neF9tb2R1bGVzW2ldLT5jdHhfaW5kZXggPSBuZ3hfZXZlbnRfbWF4X21vZHVsZSsrOwogICAgIH0KIAotICAgIG5neF90ZXN0X251bGwoY3R4LCBuZ3hfcGNhbGxvYyhjZi0+cG9vbCwgc2l6ZW9mKHZvaWQgKikpLCBOR1hfQ09ORl9FUlJPUik7CisgICAgY3R4ID0gbmd4X3BjYWxsb2MoY2YtPnBvb2wsIHNpemVvZih2b2lkICopKTsKKyAgICBpZiAoY3R4ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgIH0KIAotICAgIG5neF90ZXN0X251bGwoKmN0eCwKLSAgICAgICAgICAgICAgICAgIG5neF9wY2FsbG9jKGNmLT5wb29sLCBuZ3hfZXZlbnRfbWF4X21vZHVsZSAqIHNpemVvZih2b2lkICopKSwKLSAgICAgICAgICAgICAgICAgIE5HWF9DT05GX0VSUk9SKTsKKyAgICAqY3R4ID0gbmd4X3BjYWxsb2MoY2YtPnBvb2wsIG5neF9ldmVudF9tYXhfbW9kdWxlICogc2l6ZW9mKHZvaWQgKikpOworICAgIGlmICgqY3R4ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgIH0KIAogICAgICoodm9pZCAqKikgY29uZiA9IGN0eDsKIAotICAgIGZvciAobSA9IDA7IG5neF9tb2R1bGVzW21dOyBtKyspIHsKLSAgICAgICAgaWYgKG5neF9tb2R1bGVzW21dLT50eXBlICE9IE5HWF9FVkVOVF9NT0RVTEUpIHsKKyAgICBmb3IgKGkgPSAwOyBuZ3hfbW9kdWxlc1tpXTsgaSsrKSB7CisgICAgICAgIGlmIChuZ3hfbW9kdWxlc1tpXS0+dHlwZSAhPSBOR1hfRVZFTlRfTU9EVUxFKSB7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCi0gICAgICAgIG1vZHVsZSA9IG5neF9tb2R1bGVzW21dLT5jdHg7CisgICAgICAgIG0gPSBuZ3hfbW9kdWxlc1tpXS0+Y3R4OwogCi0gICAgICAgIGlmIChtb2R1bGUtPmNyZWF0ZV9jb25mKSB7Ci0gICAgICAgICAgICBuZ3hfdGVzdF9udWxsKCgqY3R4KVtuZ3hfbW9kdWxlc1ttXS0+Y3R4X2luZGV4XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLT5jcmVhdGVfY29uZihjZi0+Y3ljbGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBOR1hfQ09ORl9FUlJPUik7CisgICAgICAgIGlmIChtLT5jcmVhdGVfY29uZikgeworICAgICAgICAgICAgKCpjdHgpW25neF9tb2R1bGVzW2ldLT5jdHhfaW5kZXhdID0gbS0+Y3JlYXRlX2NvbmYoY2YtPmN5Y2xlKTsKKyAgICAgICAgICAgIGlmICgoKmN0eClbbmd4X21vZHVsZXNbaV0tPmN0eF9pbmRleF0gPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtNTQwLDIyICs1NDcsMjMgQEAKICAgICBjZi0+Y3R4ID0gY3R4OwogICAgIGNmLT5tb2R1bGVfdHlwZSA9IE5HWF9FVkVOVF9NT0RVTEU7CiAgICAgY2YtPmNtZF90eXBlID0gTkdYX0VWRU5UX0NPTkY7CisKICAgICBydiA9IG5neF9jb25mX3BhcnNlKGNmLCBOVUxMKTsKKwogICAgICpjZiA9IHBjZjsKIAogICAgIGlmIChydiAhPSBOR1hfQ09ORl9PSykKICAgICAgICAgcmV0dXJuIHJ2OwogCi0gICAgZm9yIChtID0gMDsgbmd4X21vZHVsZXNbbV07IG0rKykgewotICAgICAgICBpZiAobmd4X21vZHVsZXNbbV0tPnR5cGUgIT0gTkdYX0VWRU5UX01PRFVMRSkgeworICAgIGZvciAoaSA9IDA7IG5neF9tb2R1bGVzW2ldOyBpKyspIHsKKyAgICAgICAgaWYgKG5neF9tb2R1bGVzW2ldLT50eXBlICE9IE5HWF9FVkVOVF9NT0RVTEUpIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKLSAgICAgICAgbW9kdWxlID0gbmd4X21vZHVsZXNbbV0tPmN0eDsKKyAgICAgICAgbSA9IG5neF9tb2R1bGVzW2ldLT5jdHg7CiAKLSAgICAgICAgaWYgKG1vZHVsZS0+aW5pdF9jb25mKSB7Ci0gICAgICAgICAgICBydiA9IG1vZHVsZS0+aW5pdF9jb25mKGNmLT5jeWNsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpjdHgpW25neF9tb2R1bGVzW21dLT5jdHhfaW5kZXhdKTsKKyAgICAgICAgaWYgKG0tPmluaXRfY29uZikgeworICAgICAgICAgICAgcnYgPSBtLT5pbml0X2NvbmYoY2YtPmN5Y2xlLCAoKmN0eClbbmd4X21vZHVsZXNbaV0tPmN0eF9pbmRleF0pOwogICAgICAgICAgICAgaWYgKHJ2ICE9IE5HWF9DT05GX09LKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHJ2OwogICAgICAgICAgICAgfQpAQCAtNjY4LDcgKzY3Niw4IEBACiAKICAgICAvKiBBRl9JTkVUIG9ubHkgKi8KIAotICAgIGlmICghKGFkZHIgPSBuZ3hfcHVzaF9hcnJheSgmZWNmLT5kZWJ1Z19jb25uZWN0aW9uKSkpIHsKKyAgICBhZGRyID0gbmd4X2FycmF5X3B1c2goJmVjZi0+ZGVidWdfY29ubmVjdGlvbik7CisgICAgaWYgKGFkZHIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgfQogCkBAIC03MDQsOCArNzEzLDEwIEBACiB7CiAgICAgbmd4X2V2ZW50X2NvbmZfdCAgKmVjZjsKIAotICAgIG5neF90ZXN0X251bGwoZWNmLCBuZ3hfcGFsbG9jKGN5Y2xlLT5wb29sLCBzaXplb2Yobmd4X2V2ZW50X2NvbmZfdCkpLAotICAgICAgICAgICAgICAgICAgTkdYX0NPTkZfRVJST1IpOworICAgIGVjZiA9IG5neF9wYWxsb2MoY3ljbGUtPnBvb2wsIHNpemVvZihuZ3hfZXZlbnRfY29uZl90KSk7CisgICAgaWYgKGVjZiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICB9CiAKICAgICBlY2YtPmNvbm5lY3Rpb25zID0gTkdYX0NPTkZfVU5TRVRfVUlOVDsKICAgICBlY2YtPnVzZSA9IE5HWF9DT05GX1VOU0VUX1VJTlQ7CkBAIC03MTUsOCArNzI2LDEzIEBACiAgICAgZWNmLT5uYW1lID0gKHZvaWQgKikgTkdYX0NPTkZfVU5TRVQ7CiAKICNpZiAoTkdYX0RFQlVHKQotICAgIG5neF9pbml0X2FycmF5KGVjZi0+ZGVidWdfY29ubmVjdGlvbiwgY3ljbGUtPnBvb2wsIDQsIHNpemVvZihpbl9hZGRyX3QpLAotICAgICAgICAgICAgICAgICAgIE5HWF9DT05GX0VSUk9SKTsKKworICAgIGlmIChuZ3hfYXJyYXlfaW5pdCgmZWNmLT5kZWJ1Z19jb25uZWN0aW9uLCBjeWNsZS0+cG9vbCwgNCwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGluX2FkZHJfdCkpID09IE5HWF9FUlJPUikKKyAgICB7CisgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICB9CisKICNlbmRpZgogCiAgICAgcmV0dXJuIGVjZjsKQEAgLTcyNyw3ICs3NDMsMTIgQEAKIHsKICAgICBuZ3hfZXZlbnRfY29uZl90ICAqZWNmID0gY29uZjsKIAotICAgIGludCAgICAgICAgICAgICAgICAgIGZkLCBydHNpZzsKKyNpZiAoTkdYX0hBVkVfRVBPTEwpICYmICEoTkdYX1RFU1RfQlVJTERfRVBPTEwpCisgICAgaW50ICAgICAgICAgICAgICAgICAgZmQ7CisjZW5kaWYKKyNpZiAoTkdYX0hBVkVfUlRTSUcpCisgICAgbmd4X3VpbnRfdCAgICAgICAgICAgcnRzaWc7CisjZW5kaWYKICAgICBuZ3hfaW50X3QgICAgICAgICAgICBpLCBjb25uZWN0aW9uczsKICAgICBuZ3hfbW9kdWxlX3QgICAgICAgICptb2R1bGU7CiAgICAgbmd4X2NvcmVfY29uZl90ICAgICAqY2NmOwpAQCAtNzM1LDggKzc1Niw2IEBACiAKICAgICBjb25uZWN0aW9ucyA9IE5HWF9DT05GX1VOU0VUX1VJTlQ7CiAgICAgbW9kdWxlID0gTlVMTDsKLSAgICBydHNpZyA9IDA7Ci0gICAgZmQgPSAwOwogCiAjaWYgKE5HWF9IQVZFX0VQT0xMKSAmJiAhKE5HWF9URVNUX0JVSUxEX0VQT0xMKQogCkBAIC03NjAsNiArNzc5LDkgQEAKICAgICAgICAgY29ubmVjdGlvbnMgPSBERUZBVUxUX0NPTk5FQ1RJT05TOwogICAgICAgICBtb2R1bGUgPSAmbmd4X3J0c2lnX21vZHVsZTsKICAgICAgICAgcnRzaWcgPSAxOworCisgICAgfSBlbHNlIHsKKyAgICAgICAgcnRzaWcgPSAwOwogICAgIH0KIAogI2VuZGlmCkBAIC03ODIsMTEgKzgwNCwxMCBAQAogCiAgICAgaWYgKG1vZHVsZSA9PSBOVUxMKSB7CiAKLSNpZiAoTkdYX1dJTjMyKQorI2lmIChOR1hfV0lOMzIgfHwgRkRfU0VUU0laRSA+PSBERUZBVUxUX0NPTk5FQ1RJT05TKQogICAgICAgICBjb25uZWN0aW9ucyA9IERFRkFVTFRfQ09OTkVDVElPTlM7CiAjZWxzZQotICAgICAgICBjb25uZWN0aW9ucyA9IEZEX1NFVFNJWkUgPCBERUZBVUxUX0NPTk5FQ1RJT05TID8gRkRfU0VUU0laRToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfQ09OTkVDVElPTlM7CisgICAgICAgIGNvbm5lY3Rpb25zID0gRkRfU0VUU0laRTsKICNlbmRpZgogICAgICAgICBtb2R1bGUgPSAmbmd4X3NlbGVjdF9tb2R1bGU7CiAgICAgfQpAQCAtODI4LDcgKzg0OSwxNSBAQAogICAgIG5neF9jb25mX2luaXRfbXNlY192YWx1ZShlY2YtPmFjY2VwdF9tdXRleF9kZWxheSwgNTAwKTsKIAogCi0gICAgaWYgKCFydHNpZyB8fCBlY2YtPmFjY2VwdF9tdXRleCkgeworI2lmIChOR1hfSEFWRV9SVFNJRykKKworICAgIGlmICghcnRzaWcpIHsKKyAgICAgICAgcmV0dXJuIE5HWF9DT05GX09LOworICAgIH0KKworI2VuZGlmCisKKyAgICBpZiAoZWNmLT5hY2NlcHRfbXV0ZXgpIHsKICAgICAgICAgcmV0dXJuIE5HWF9DT05GX09LOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2V2ZW50L25neF9ldmVudF9hY2NlcHQuYyBiL3NyYy9ldmVudC9uZ3hfZXZlbnRfYWNjZXB0LmMKaW5kZXggZjMwZTFmYy4uOGUyYTFlYSAxMDA2NDQKLS0tIGEvc3JjL2V2ZW50L25neF9ldmVudF9hY2NlcHQuYworKysgYi9zcmMvZXZlbnQvbmd4X2V2ZW50X2FjY2VwdC5jCkBAIC0xNiw3ICsxNiwxMCBAQAogdm9pZAogbmd4X2V2ZW50X2FjY2VwdChuZ3hfZXZlbnRfdCAqZXYpCiB7Ci0gICAgbmd4X3VpbnRfdCAgICAgICAgIGluc3RhbmNlLCBhY2NlcHRlZDsKKyAgICBuZ3hfdWludF90ICAgICAgICAgaW5zdGFuY2U7CisjaWYgMAorICAgIG5neF91aW50X3QgICAgICAgICBhY2NlcHRlZDsKKyNlbmRpZgogICAgIHNvY2tsZW5fdCAgICAgICAgICBsZW47CiAgICAgc3RydWN0IHNvY2thZGRyICAgKnNhOwogICAgIG5neF9lcnJfdCAgICAgICAgICBlcnI7CkBAIC00Myw4ICs0NiwxMCBAQAogICAgICAgICAgICAgICAgICAgICZscy0+bGlzdGVuaW5nLT5hZGRyX3RleHQsIGV2LT5hdmFpbGFibGUpOwogCiAgICAgZXYtPnJlYWR5ID0gMDsKLSAgICBhY2NlcHRlZCA9IDA7CiAgICAgcG9vbCA9IE5VTEw7CisjaWYgMAorICAgIGFjY2VwdGVkID0gMDsKKyNlbmRpZgogCiAgICAgZG8gewogCkBAIC01NiwxNyArNjEsMjAgQEAKICAgICAgICAgICAgICAqIGNhc2UgYW5kIGJlc2lkZXMgdGhlIHBvb2wgY2FuIGJlIGdvdCBmcm9tIHRoZSBmcmVlIHBvb2wgbGlzdC4KICAgICAgICAgICAgICAqLwogCi0gICAgICAgICAgICBpZiAoIShwb29sID0gbmd4X2NyZWF0ZV9wb29sKGxzLT5saXN0ZW5pbmctPnBvb2xfc2l6ZSwgZXYtPmxvZykpKSB7CisgICAgICAgICAgICBwb29sID0gbmd4X2NyZWF0ZV9wb29sKGxzLT5saXN0ZW5pbmctPnBvb2xfc2l6ZSwgZXYtPmxvZyk7CisgICAgICAgICAgICBpZiAocG9vbCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgaWYgKCEoc2EgPSBuZ3hfcGFsbG9jKHBvb2wsIGxzLT5saXN0ZW5pbmctPnNvY2tsZW4pKSkgeworICAgICAgICBzYSA9IG5neF9wYWxsb2MocG9vbCwgbHMtPmxpc3RlbmluZy0+c29ja2xlbik7CisgICAgICAgIGlmIChzYSA9PSBOVUxMKSB7CiAgICAgICAgICAgICBuZ3hfZGVzdHJveV9wb29sKHBvb2wpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKCEobG9nID0gbmd4X3BhbGxvYyhwb29sLCBzaXplb2Yobmd4X2xvZ190KSkpKSB7CisgICAgICAgIGxvZyA9IG5neF9wYWxsb2MocG9vbCwgc2l6ZW9mKG5neF9sb2dfdCkpOworICAgICAgICBpZiAobG9nID09IE5VTEwpIHsKICAgICAgICAgICAgIG5neF9kZXN0cm95X3Bvb2wocG9vbCk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KQEAgLTMzMSw3ICszMzksOSBAQAogICAgICAgICAgICAgZXYtPmF2YWlsYWJsZS0tOwogICAgICAgICB9CiAKKyNpZiAwCiAgICAgICAgIGFjY2VwdGVkKys7CisjZW5kaWYKIAogICAgIH0gd2hpbGUgKGV2LT5hdmFpbGFibGUpOwogfQpkaWZmIC0tZ2l0IGEvc3JjL2V2ZW50L25neF9ldmVudF9hY2NlcHRleC5jIGIvc3JjL2V2ZW50L25neF9ldmVudF9hY2NlcHRleC5jCmluZGV4IGQwMWRiZjEuLmIwMmRmZDAgMTAwNjQ0Ci0tLSBhL3NyYy9ldmVudC9uZ3hfZXZlbnRfYWNjZXB0ZXguYworKysgYi9zcmMvZXZlbnQvbmd4X2V2ZW50X2FjY2VwdGV4LmMKQEAgLTE1Myw3ICsxNTMsOCBAQAogICAgICAgICBjLT5yZWN2ID0gbmd4X3JlY3Y7CiAgICAgICAgIGMtPnNlbmRfY2hhaW4gPSBuZ3hfc2VuZF9jaGFpbjsKIAotICAgICAgICBpZiAoIShjLT5wb29sID0gbmd4X2NyZWF0ZV9wb29sKGxzLT5wb29sX3NpemUsIGxzLT5sb2cpKSkgeworICAgICAgICBjLT5wb29sID0gbmd4X2NyZWF0ZV9wb29sKGxzLT5wb29sX3NpemUsIGxzLT5sb2cpOworICAgICAgICBpZiAoYy0+cG9vbCA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgICAgICB9CiAKQEAgLTE2NCwxNSArMTY1LDE4IEBACiAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKCEoYy0+bG9jYWxfc29ja2FkZHIgPSBuZ3hfcGFsbG9jKGMtPnBvb2wsIGxzLT5zb2NrbGVuKSkpIHsKKyAgICAgICAgYy0+bG9jYWxfc29ja2FkZHIgPSBuZ3hfcGFsbG9jKGMtPnBvb2wsIGxzLT5zb2NrbGVuKTsKKyAgICAgICAgaWYgKGMtPmxvY2FsX3NvY2thZGRyID09IE5VTEwpIHsKICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoIShjLT5zb2NrYWRkciA9IG5neF9wYWxsb2MoYy0+cG9vbCwgbHMtPnNvY2tsZW4pKSkgeworICAgICAgICBjLT5zb2NrYWRkciA9IG5neF9wYWxsb2MoYy0+cG9vbCwgbHMtPnNvY2tsZW4pOworICAgICAgICBpZiAoYy0+c29ja2FkZHIgPT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICAgICAgfQogCi0gICAgICAgIGlmICghKGMtPmxvZyA9IG5neF9wYWxsb2MoYy0+cG9vbCwgc2l6ZW9mKG5neF9sb2dfdCkpKSkgeworICAgICAgICBjLT5sb2cgPSBuZ3hfcGFsbG9jKGMtPnBvb2wsIHNpemVvZihuZ3hfbG9nX3QpKTsKKyAgICAgICAgaWYgKGMtPmxvZyA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9ldmVudC9uZ3hfZXZlbnRfb3BlbnNzbC5jIGIvc3JjL2V2ZW50L25neF9ldmVudF9vcGVuc3NsLmMKaW5kZXggYjY1Nzc5MC4uZDIxM2ViMSAxMDA2NDQKLS0tIGEvc3JjL2V2ZW50L25neF9ldmVudF9vcGVuc3NsLmMKKysrIGIvc3JjL2V2ZW50L25neF9ldmVudF9vcGVuc3NsLmMKQEAgLTIwLDggKzIwLDYgQEAKIG5neF9pbnRfdAogbmd4X3NzbF9pbml0KG5neF9sb2dfdCAqbG9nKQogewotICAgIEVOR0lORSAgKmVuZ2luZTsKLQogICAgIFNTTF9saWJyYXJ5X2luaXQoKTsKICAgICBTU0xfbG9hZF9lcnJvcl9zdHJpbmdzKCk7CiAgICAgRU5HSU5FX2xvYWRfYnVpbHRpbl9lbmdpbmVzKCk7CkBAIC0zNiwxMSArMzQsMTMgQEAKIHsgICAKICAgICBuZ3hfc3NsX3QgICpzc2w7CiAKLSAgICBpZiAoIShzc2wgPSBuZ3hfcGNhbGxvYyhjLT5wb29sLCBzaXplb2Yobmd4X3NzbF90KSkpKSB7CisgICAgc3NsID0gbmd4X3BjYWxsb2MoYy0+cG9vbCwgc2l6ZW9mKG5neF9zc2xfdCkpOworICAgIGlmIChzc2wgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgIH0KIAotICAgIGlmICghKHNzbC0+YnVmID0gbmd4X2NyZWF0ZV90ZW1wX2J1ZihjLT5wb29sLCBOR1hfU1NMX0JVRlNJWkUpKSkgeworICAgIHNzbC0+YnVmID0gbmd4X2NyZWF0ZV90ZW1wX2J1ZihjLT5wb29sLCBOR1hfU1NMX0JVRlNJWkUpOworICAgIGlmIChzc2wtPmJ1ZiA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgfQogCkBAIC01ODYsNyArNTg2LDcgQEAKICAgICBwID0gbmd4X3ZzbnByaW50ZihlcnJzdHIsIHNpemVvZihlcnJzdHIpIC0gMSwgZm10LCBhcmdzKTsKICAgICB2YV9lbmQoYXJncyk7CiAKLSAgICBwID0gbmd4X2NweXN0cm4ocCwgIiAoU1NMOiAiLCBsYXN0IC0gcCk7CisgICAgcCA9IG5neF9jcHlzdHJuKHAsICh1X2NoYXIgKikgIiAoU1NMOiAiLCBsYXN0IC0gcCk7CiAKICAgICBFUlJfZXJyb3Jfc3RyaW5nX24oRVJSX2dldF9lcnJvcigpLCAoY2hhciAqKSBwLCBsYXN0IC0gcCk7CiAKZGlmZiAtLWdpdCBhL3NyYy9ldmVudC9uZ3hfZXZlbnRfcGlwZS5jIGIvc3JjL2V2ZW50L25neF9ldmVudF9waXBlLmMKaW5kZXggMDIwNmJmOC4uYjU0ODhiYSAxMDA2NDQKLS0tIGEvc3JjL2V2ZW50L25neF9ldmVudF9waXBlLmMKKysrIGIvc3JjL2V2ZW50L25neF9ldmVudF9waXBlLmMKQEAgLTE2NSwxMyArMTY1LDE1IEBACiAKICAgICAgICAgICAgICAgICAvKiBhbGxvY2F0ZSBhIG5ldyBidWYgaWYgaXQncyBzdGlsbCBhbGxvd2VkICovCiAKLSAgICAgICAgICAgICAgICBpZiAoIShiID0gbmd4X2NyZWF0ZV90ZW1wX2J1ZihwLT5wb29sLCBwLT5idWZzLnNpemUpKSkgeworICAgICAgICAgICAgICAgIGIgPSBuZ3hfY3JlYXRlX3RlbXBfYnVmKHAtPnBvb2wsIHAtPmJ1ZnMuc2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKGIgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0FCT1JUOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIHAtPmFsbG9jYXRlZCsrOwogCi0gICAgICAgICAgICAgICAgaWYgKCEoY2hhaW4gPSBuZ3hfYWxsb2NfY2hhaW5fbGluayhwLT5wb29sKSkpIHsKKyAgICAgICAgICAgICAgICBjaGFpbiA9IG5neF9hbGxvY19jaGFpbl9saW5rKHAtPnBvb2wpOworICAgICAgICAgICAgICAgIGlmIChjaGFpbiA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfQUJPUlQ7CiAgICAgICAgICAgICAgICAgfQogCkBAIC00OTUsNyArNDk3LDEzIEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGNsLT5uZXh0ID0gTlVMTDsKLSAgICAgICAgICAgIG5neF9jaGFpbl9hZGRfbGluayhvdXQsIGxsLCBjbCk7CisKKyAgICAgICAgICAgIGlmIChvdXQpIHsKKyAgICAgICAgICAgICAgICAqbGwgPSBjbDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb3V0ID0gY2w7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsbCA9ICZjbC0+bmV4dDsKICAgICAgICAgfQogCiAgICAgICAgIG5neF9sb2dfZGVidWcyKE5HWF9MT0dfREVCVUdfRVZFTlQsIHAtPmxvZywgMCwKQEAgLTYzNSwxMSArNjQzLDE3IEBACiAgICAgICAgIGItPmluX2ZpbGUgPSAxOwogICAgICAgICBiLT50ZW1wX2ZpbGUgPSAxOwogCi0gICAgICAgIG5neF9jaGFpbl9hZGRfbGluayhwLT5vdXQsIHAtPmxhc3Rfb3V0LCBjbCk7CisgICAgICAgIGlmIChwLT5vdXQpIHsKKyAgICAgICAgICAgICpwLT5sYXN0X291dCA9IGNsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcC0+b3V0ID0gY2w7CisgICAgICAgIH0KKyAgICAgICAgcC0+bGFzdF9vdXQgPSAmY2wtPm5leHQ7CiAKICAgICAgICAgaWYgKGItPmxhc3Rfc2hhZG93KSB7CiAKLSAgICAgICAgICAgIGlmICghKHRsID0gbmd4X2FsbG9jX2NoYWluX2xpbmsocC0+cG9vbCkpKSB7CisgICAgICAgICAgICB0bCA9IG5neF9hbGxvY19jaGFpbl9saW5rKHAtPnBvb2wpOworICAgICAgICAgICAgaWYgKHRsID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0FCT1JUOwogICAgICAgICAgICAgfQogCkBAIC02NzYsNyArNjkwLDggQEAKICAgICAgICAgcC0+ZnJlZSA9IHAtPmZyZWUtPm5leHQ7CiAKICAgICB9IGVsc2UgewotICAgICAgICBpZiAoIShiID0gbmd4X2FsbG9jX2J1ZihwLT5wb29sKSkpIHsKKyAgICAgICAgYiA9IG5neF9hbGxvY19idWYocC0+cG9vbCk7CisgICAgICAgIGlmIChiID09IE5VTEwpIHsKICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgICAgIH0KICAgICB9CkBAIC02ODgsNyArNzAzLDggQEAKICAgICBiLT5yZWN5Y2xlZCA9IDE7CiAgICAgYnVmLT5zaGFkb3cgPSBiOwogCi0gICAgaWYgKCEoY2wgPSBuZ3hfYWxsb2NfY2hhaW5fbGluayhwLT5wb29sKSkpIHsKKyAgICBjbCA9IG5neF9hbGxvY19jaGFpbl9saW5rKHAtPnBvb2wpOworICAgIGlmIChjbCA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgfQogCkBAIC02OTcsNyArNzEzLDEyIEBACiAKICAgICBuZ3hfbG9nX2RlYnVnMShOR1hfTE9HX0RFQlVHX0VWRU5ULCBwLT5sb2csIDAsICJpbnB1dCBidWYgIyVkIiwgYi0+bnVtKTsKIAotICAgIG5neF9jaGFpbl9hZGRfbGluayhwLT5pbiwgcC0+bGFzdF9pbiwgY2wpOworICAgIGlmIChwLT5pbikgeworICAgICAgICAqcC0+bGFzdF9pbiA9IGNsOworICAgIH0gZWxzZSB7CisgICAgICAgIHAtPmluID0gY2w7CisgICAgfQorICAgIHAtPmxhc3RfaW4gPSAmY2wtPm5leHQ7CiAKICAgICByZXR1cm4gTkdYX09LOwogfQpAQCAtNzY2LDcgKzc4Nyw4IEBACiB7CiAgICAgbmd4X2NoYWluX3QgICpjbDsKIAotICAgIGlmICghKGNsID0gbmd4X2FsbG9jX2NoYWluX2xpbmsocC0+cG9vbCkpKSB7CisgICAgY2wgPSBuZ3hfYWxsb2NfY2hhaW5fbGluayhwLT5wb29sKTsKKyAgICBpZiAoY2wgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2V2ZW50L25neF9ldmVudF9wb3N0ZWQuYyBiL3NyYy9ldmVudC9uZ3hfZXZlbnRfcG9zdGVkLmMKaW5kZXggYTk5YTQzNC4uODA1MGMzMiAxMDA2NDQKLS0tIGEvc3JjL2V2ZW50L25neF9ldmVudF9wb3N0ZWQuYworKysgYi9zcmMvZXZlbnQvbmd4X2V2ZW50X3Bvc3RlZC5jCkBAIC00MywxMCArNDMsMTAgQEAKIHZvaWQgbmd4X3dha2V1cF93b3JrZXJfdGhyZWFkKG5neF9jeWNsZV90ICpjeWNsZSkKIHsKICAgICBuZ3hfaW50X3QgICAgIGk7CisjaWYgMAogICAgIG5neF91aW50X3QgICAgYnVzeTsKICAgICBuZ3hfZXZlbnRfdCAgKmV2OwogCi0jaWYgMAogICAgIGJ1c3kgPSAxOwogCiAgICAgaWYgKG5neF9tdXRleF9sb2NrKG5neF9wb3N0ZWRfZXZlbnRzX211dGV4KSA9PSBOR1hfRVJST1IpIHsKZGlmZiAtLWdpdCBhL3NyYy9ldmVudC9uZ3hfZXZlbnRfdGltZXIuYyBiL3NyYy9ldmVudC9uZ3hfZXZlbnRfdGltZXIuYwppbmRleCA0Yjk4NjU2Li43NjU1YzRmIDEwMDY0NAotLS0gYS9zcmMvZXZlbnQvbmd4X2V2ZW50X3RpbWVyLmMKKysrIGIvc3JjL2V2ZW50L25neF9ldmVudF90aW1lci5jCkBAIC0zMSw3ICszMSw4IEBACiAgICAgbmd4X2V2ZW50X3RpbWVyX3JidHJlZSA9ICZuZ3hfZXZlbnRfdGltZXJfc2VudGluZWw7CiAKICNpZiAoTkdYX1RIUkVBRFMpCi0gICAgaWYgKCEobmd4X2V2ZW50X3RpbWVyX211dGV4ID0gbmd4X211dGV4X2luaXQobG9nLCAwKSkpIHsKKyAgICBuZ3hfZXZlbnRfdGltZXJfbXV0ZXggPSBuZ3hfbXV0ZXhfaW5pdChsb2csIDApOworICAgIGlmIChuZ3hfZXZlbnRfdGltZXJfbXV0ZXggPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL2V2ZW50L25neF9ldmVudF90aW1lci5oIGIvc3JjL2V2ZW50L25neF9ldmVudF90aW1lci5oCmluZGV4IGVkYmZjZjYuLjQ5NTQ4MDkgMTAwNjQ0Ci0tLSBhL3NyYy9ldmVudC9uZ3hfZXZlbnRfdGltZXIuaAorKysgYi9zcmMvZXZlbnQvbmd4X2V2ZW50X3RpbWVyLmgKQEAgLTEzLDggKzEzLDggQEAKICNpbmNsdWRlIDxuZ3hfZXZlbnQuaD4KIAogCi0jZGVmaW5lIE5HWF9USU1FUl9JTkZJTklURSAgLTEKLSNkZWZpbmUgTkdYX1RJTUVSX0VSUk9SICAgICAtMgorI2RlZmluZSBOR1hfVElNRVJfSU5GSU5JVEUgIChuZ3hfbXNlY190KSAtMQorI2RlZmluZSBOR1hfVElNRVJfRVJST1IgICAgIChuZ3hfbXNlY190KSAtMgogCiAKIC8qCmRpZmYgLS1naXQgYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2FjY2Vzc19oYW5kbGVyLmMgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2FjY2Vzc19tb2R1bGUuYwpzaW1pbGFyaXR5IGluZGV4IDg1JQpyZW5hbWUgZnJvbSBzcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2FjY2Vzc19oYW5kbGVyLmMKcmVuYW1lIHRvIHNyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfYWNjZXNzX21vZHVsZS5jCmluZGV4IDI4NTU3MGYuLjY4NWQxNWQgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfYWNjZXNzX2hhbmRsZXIuYworKysgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2FjY2Vzc19tb2R1bGUuYwpAQCAtMjUsMTAgKzI1LDEwIEBACiAKIHN0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfYWNjZXNzX2hhbmRsZXIobmd4X2h0dHBfcmVxdWVzdF90ICpyKTsKIHN0YXRpYyBjaGFyICpuZ3hfaHR0cF9hY2Nlc3NfcnVsZShuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqY21kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNvbmYpOworICAgIHZvaWQgKmNvbmYpOwogc3RhdGljIHZvaWQgKm5neF9odHRwX2FjY2Vzc19jcmVhdGVfbG9jX2NvbmYobmd4X2NvbmZfdCAqY2YpOwogc3RhdGljIGNoYXIgKm5neF9odHRwX2FjY2Vzc19tZXJnZV9sb2NfY29uZihuZ3hfY29uZl90ICpjZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcGFyZW50LCB2b2lkICpjaGlsZCk7CisgICAgdm9pZCAqcGFyZW50LCB2b2lkICpjaGlsZCk7CiBzdGF0aWMgbmd4X2ludF90IG5neF9odHRwX2FjY2Vzc19pbml0KG5neF9jeWNsZV90ICpjeWNsZSk7CiAKIApAQCAtNzcsNyArNzcsOCBAQAogfTsKIAogCi1zdGF0aWMgbmd4X2ludF90IG5neF9odHRwX2FjY2Vzc19oYW5kbGVyKG5neF9odHRwX3JlcXVlc3RfdCAqcikKK3N0YXRpYyBuZ3hfaW50X3QKK25neF9odHRwX2FjY2Vzc19oYW5kbGVyKG5neF9odHRwX3JlcXVlc3RfdCAqcikKIHsKICAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgIGk7CiAgICAgc3RydWN0IHNvY2thZGRyX2luICAgICAgICAgICpzaW47CkBAIC0xMTcsOCArMTE4LDggQEAKIH0KIAogCi1zdGF0aWMgY2hhciAqbmd4X2h0dHBfYWNjZXNzX3J1bGUobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjb25mKQorc3RhdGljIGNoYXIgKgorbmd4X2h0dHBfYWNjZXNzX3J1bGUobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwgdm9pZCAqY29uZikKIHsKICAgICBuZ3hfaHR0cF9hY2Nlc3NfbG9jX2NvbmZfdCAqYWxjZiA9IGNvbmY7CiAKQEAgLTEyNywxNCArMTI4LDE1IEBACiAgICAgbmd4X2h0dHBfYWNjZXNzX3J1bGVfdCAgKnJ1bGU7CiAKICAgICBpZiAoYWxjZi0+cnVsZXMgPT0gTlVMTCkgewotICAgICAgICBhbGNmLT5ydWxlcyA9IG5neF9jcmVhdGVfYXJyYXkoY2YtPnBvb2wsIDQsCisgICAgICAgIGFsY2YtPnJ1bGVzID0gbmd4X2FycmF5X2NyZWF0ZShjZi0+cG9vbCwgNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfaHR0cF9hY2Nlc3NfcnVsZV90KSk7CiAgICAgICAgIGlmIChhbGNmLT5ydWxlcyA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoIShydWxlID0gbmd4X3B1c2hfYXJyYXkoYWxjZi0+cnVsZXMpKSkgeworICAgIHJ1bGUgPSBuZ3hfYXJyYXlfcHVzaChhbGNmLT5ydWxlcyk7CisgICAgaWYgKHJ1bGUgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgfQogCkBAIC0xNzAsMTEgKzE3MiwxMyBAQAogfQogCiAKLXN0YXRpYyB2b2lkICpuZ3hfaHR0cF9hY2Nlc3NfY3JlYXRlX2xvY19jb25mKG5neF9jb25mX3QgKmNmKQorc3RhdGljIHZvaWQgKgorbmd4X2h0dHBfYWNjZXNzX2NyZWF0ZV9sb2NfY29uZihuZ3hfY29uZl90ICpjZikKIHsKICAgICBuZ3hfaHR0cF9hY2Nlc3NfbG9jX2NvbmZfdCAgKmNvbmY7CiAKLSAgICBpZiAoIShjb25mID0gbmd4X3BjYWxsb2MoY2YtPnBvb2wsIHNpemVvZihuZ3hfaHR0cF9hY2Nlc3NfbG9jX2NvbmZfdCkpKSkgeworICAgIGNvbmYgPSBuZ3hfcGNhbGxvYyhjZi0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX2FjY2Vzc19sb2NfY29uZl90KSk7CisgICAgaWYgKGNvbmYgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgfQogCkBAIC0xODIsOCArMTg2LDggQEAKIH0KIAogCi1zdGF0aWMgY2hhciAqbmd4X2h0dHBfYWNjZXNzX21lcmdlX2xvY19jb25mKG5neF9jb25mX3QgKmNmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwYXJlbnQsIHZvaWQgKmNoaWxkKQorc3RhdGljIGNoYXIgKgorbmd4X2h0dHBfYWNjZXNzX21lcmdlX2xvY19jb25mKG5neF9jb25mX3QgKmNmLCB2b2lkICpwYXJlbnQsIHZvaWQgKmNoaWxkKQogewogICAgIG5neF9odHRwX2FjY2Vzc19sb2NfY29uZl90ICAqcHJldiA9IHBhcmVudDsKICAgICBuZ3hfaHR0cF9hY2Nlc3NfbG9jX2NvbmZfdCAgKmNvbmYgPSBjaGlsZDsKQEAgLTE5NiwxNCArMjAwLDE1IEBACiB9CiAKIAotc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9hY2Nlc3NfaW5pdChuZ3hfY3ljbGVfdCAqY3ljbGUpCitzdGF0aWMgbmd4X2ludF90CituZ3hfaHR0cF9hY2Nlc3NfaW5pdChuZ3hfY3ljbGVfdCAqY3ljbGUpCiB7CiAgICAgbmd4X2h0dHBfaGFuZGxlcl9wdCAgICAgICAgKmg7CiAgICAgbmd4X2h0dHBfY29yZV9tYWluX2NvbmZfdCAgKmNtY2Y7CiAKICAgICBjbWNmID0gbmd4X2h0dHBfY3ljbGVfZ2V0X21vZHVsZV9tYWluX2NvbmYoY3ljbGUsIG5neF9odHRwX2NvcmVfbW9kdWxlKTsKIAotICAgIGggPSBuZ3hfcHVzaF9hcnJheSgmY21jZi0+cGhhc2VzW05HWF9IVFRQX0FDQ0VTU19QSEFTRV0uaGFuZGxlcnMpOworICAgIGggPSBuZ3hfYXJyYXlfcHVzaCgmY21jZi0+cGhhc2VzW05HWF9IVFRQX0FDQ0VTU19QSEFTRV0uaGFuZGxlcnMpOwogICAgIGlmIChoID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2F1dG9pbmRleF9oYW5kbGVyLmMgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2F1dG9pbmRleF9tb2R1bGUuYwpzaW1pbGFyaXR5IGluZGV4IDk2JQpyZW5hbWUgZnJvbSBzcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2F1dG9pbmRleF9oYW5kbGVyLmMKcmVuYW1lIHRvIHNyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfYXV0b2luZGV4X21vZHVsZS5jCmluZGV4IDg5NzZhZDUuLmE3Yjk5ODYgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfYXV0b2luZGV4X2hhbmRsZXIuYworKysgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2F1dG9pbmRleF9tb2R1bGUuYwpAQCAtMjE4LDEwICsyMTgsNyBAQAogICAgICAgICBpZiAobmd4X3JlYWRfZGlyKCZkaXIpID09IE5HWF9FUlJPUikgewogICAgICAgICAgICAgZXJyID0gbmd4X2Vycm5vOwogCi0gICAgICAgICAgICBpZiAoZXJyID09IE5HWF9FTk9NT1JFRklMRVMpIHsKLSAgICAgICAgICAgICAgICByYyA9IE5HWF9PSzsKLQotICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gTkdYX0VOT01PUkVGSUxFUykgewogICAgICAgICAgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19DUklULCByLT5jb25uZWN0aW9uLT5sb2csIGVyciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9yZWFkX2Rpcl9uICIgXCIlc1wiIGZhaWxlZCIsIGRuYW1lLmRhdGEpOwogICAgICAgICAgICAgICAgIHJldHVybiBuZ3hfaHR0cF9hdXRvaW5kZXhfZXJyb3IociwgJmRpciwgZG5hbWUuZGF0YSk7CkBAIC0yNTEsNyArMjQ4LDggQEAKICAgICAgICAgICAgIGlmIChkbmFtZS5sZW4gKyAxICsgbGVuID4gZm5hbWUubGVuKSB7CiAgICAgICAgICAgICAgICAgZm5hbWUubGVuID0gZG5hbWUubGVuICsgMSArIGxlbiArIDMyOwogCi0gICAgICAgICAgICAgICAgaWYgKCEoZm5hbWUuZGF0YSA9IG5neF9wYWxsb2MocG9vbCwgZm5hbWUubGVuKSkpIHsKKyAgICAgICAgICAgICAgICBmbmFtZS5kYXRhID0gbmd4X3BhbGxvYyhwb29sLCBmbmFtZS5sZW4pOworICAgICAgICAgICAgICAgIGlmIChmbmFtZS5kYXRhID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5neF9odHRwX2F1dG9pbmRleF9lcnJvcihyLCAmZGlyLCBkbmFtZS5kYXRhKTsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTI4MCw3ICsyNzgsOCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgaWYgKCEoZW50cnkgPSBuZ3hfYXJyYXlfcHVzaCgmZW50cmllcykpKSB7CisgICAgICAgIGVudHJ5ID0gbmd4X2FycmF5X3B1c2goJmVudHJpZXMpOworICAgICAgICBpZiAoZW50cnkgPT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuIG5neF9odHRwX2F1dG9pbmRleF9lcnJvcihyLCAmZGlyLCBkbmFtZS5kYXRhKTsKICAgICAgICAgfQogCkBAIC0yODgsNyArMjg3LDggQEAKICAgICAgICAgZW50cnktPmVzY2FwZSA9IDIgKiBuZ3hfZXNjYXBlX3VyaShOVUxMLCBuZ3hfZGVfbmFtZSgmZGlyKSwgbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HWF9FU0NBUEVfSFRNTCk7CiAKLSAgICAgICAgaWYgKCEoZW50cnktPm5hbWUuZGF0YSA9IG5neF9wYWxsb2MocG9vbCwgbGVuICsgZW50cnktPmVzY2FwZSArIDEpKSkgeworICAgICAgICBlbnRyeS0+bmFtZS5kYXRhID0gbmd4X3BhbGxvYyhwb29sLCBsZW4gKyBlbnRyeS0+ZXNjYXBlICsgMSk7CisgICAgICAgIGlmIChlbnRyeS0+bmFtZS5kYXRhID09IE5VTEwpIHsKICAgICAgICAgICAgIHJldHVybiBuZ3hfaHR0cF9hdXRvaW5kZXhfZXJyb3IociwgJmRpciwgZG5hbWUuZGF0YSk7CiAgICAgICAgIH0KIApAQCAtMzI2LDcgKzMyNiw4IEBACiAgICAgICAgICAgICAgICArIDI7CiAgICAgfQogCi0gICAgaWYgKCEoYiA9IG5neF9jcmVhdGVfdGVtcF9idWYoci0+cG9vbCwgbGVuKSkpIHsKKyAgICBiID0gbmd4X2NyZWF0ZV90ZW1wX2J1ZihyLT5wb29sLCBsZW4pOworICAgIGlmIChiID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKICAgICB9CiAKQEAgLTQ4MSwxMSArNDgyLDEzIEBACiAgICAgICAgIGN0eC0+c2l6ZSArPSBjdHgtPmJ1Zi0+bGFzdCAtIGN0eC0+YnVmLT5wb3M7CiAgICAgfQogCi0gICAgaWYgKCEoY3R4LT5idWYgPSBuZ3hfY3JlYXRlX3RlbXBfYnVmKGN0eC0+cG9vbCwgY3R4LT5hbGxvY19zaXplKSkpIHsKKyAgICBjdHgtPmJ1ZiA9IG5neF9jcmVhdGVfdGVtcF9idWYoY3R4LT5wb29sLCBjdHgtPmFsbG9jX3NpemUpOworICAgIGlmIChjdHgtPmJ1ZiA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIGlmICghKGNsID0gbmd4X2FsbG9jX2NoYWluX2xpbmsoY3R4LT5wb29sKSkpIHsKKyAgICBjbCA9IG5neF9hbGxvY19jaGFpbl9saW5rKGN0eC0+cG9vbCk7CisgICAgaWYgKGNsID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2NoYXJzZXRfZmlsdGVyLmMgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2NoYXJzZXRfZmlsdGVyX21vZHVsZS5jCnNpbWlsYXJpdHkgaW5kZXggODYlCnJlbmFtZSBmcm9tIHNyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfY2hhcnNldF9maWx0ZXIuYwpyZW5hbWUgdG8gc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9jaGFyc2V0X2ZpbHRlcl9tb2R1bGUuYwppbmRleCBjYmQwZmNhLi5kYWQyNmJhIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2NoYXJzZXRfZmlsdGVyLmMKKysrIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9jaGFyc2V0X2ZpbHRlcl9tb2R1bGUuYwpAQCAtNDgsMTEgKzQ4LDExIEBACiBzdGF0aWMgbmd4X3VpbnRfdCBuZ3hfY2hhcnNldF9yZWNvZGUobmd4X2J1Zl90ICpiLCBjaGFyICp0YWJsZSk7CiAKIHN0YXRpYyBjaGFyICpuZ3hfY2hhcnNldF9tYXBfYmxvY2sobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY29uZik7CisgICAgdm9pZCAqY29uZik7CiBzdGF0aWMgY2hhciAqbmd4X2NoYXJzZXRfbWFwKG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpkdW1teSwgdm9pZCAqY29uZik7CiAKIHN0YXRpYyBjaGFyICpuZ3hfaHR0cF9zZXRfY2hhcnNldF9zbG90KG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpjbWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjb25mKTsKKyAgICB2b2lkICpjb25mKTsKIHN0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfYWRkX2NoYXJzZXQobmd4X2FycmF5X3QgKmNoYXJzZXRzLCBuZ3hfc3RyX3QgKm5hbWUpOwogCiBzdGF0aWMgbmd4X2ludF90IG5neF9odHRwX2NoYXJzZXRfZmlsdGVyX2luaXQobmd4X2N5Y2xlX3QgKmN5Y2xlKTsKQEAgLTYxLDcgKzYxLDcgQEAKIHN0YXRpYyBjaGFyICpuZ3hfaHR0cF9jaGFyc2V0X2luaXRfbWFpbl9jb25mKG5neF9jb25mX3QgKmNmLCB2b2lkICpjb25mKTsKIHN0YXRpYyB2b2lkICpuZ3hfaHR0cF9jaGFyc2V0X2NyZWF0ZV9sb2NfY29uZihuZ3hfY29uZl90ICpjZik7CiBzdGF0aWMgY2hhciAqbmd4X2h0dHBfY2hhcnNldF9tZXJnZV9sb2NfY29uZihuZ3hfY29uZl90ICpjZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBhcmVudCwgdm9pZCAqY2hpbGQpOworICAgIHZvaWQgKnBhcmVudCwgdm9pZCAqY2hpbGQpOwogCiAKIHN0YXRpYyBuZ3hfY29tbWFuZF90ICBuZ3hfaHR0cF9jaGFyc2V0X2ZpbHRlcl9jb21tYW5kc1tdID0gewpAQCAtMTMzLDcgKzEzMyw4IEBACiBzdGF0aWMgbmd4X2h0dHBfb3V0cHV0X2JvZHlfZmlsdGVyX3B0ICAgIG5neF9odHRwX25leHRfYm9keV9maWx0ZXI7CiAKIAotc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9jaGFyc2V0X2hlYWRlcl9maWx0ZXIobmd4X2h0dHBfcmVxdWVzdF90ICpyKQorc3RhdGljIG5neF9pbnRfdAorbmd4X2h0dHBfY2hhcnNldF9oZWFkZXJfZmlsdGVyKG5neF9odHRwX3JlcXVlc3RfdCAqcikKIHsKICAgICBuZ3hfaHR0cF9jaGFyc2V0X3QgICAgICAgICAgICAqY2hhcnNldHM7CiAgICAgbmd4X2h0dHBfY2hhcnNldF9jdHhfdCAgICAgICAgKmN0eDsKQEAgLTE2NSw3ICsxNjYsNyBAQAogICAgIH0KIAogICAgIGlmIChyLT5oZWFkZXJzX291dC5zdGF0dXMgPT0gTkdYX0hUVFBfTU9WRURfUEVSTUFORU5UTFkKLSAgICAgICAgJiYgci0+aGVhZGVyc19vdXQuc3RhdHVzID09IE5HWF9IVFRQX01PVkVEX1RFTVBPUkFSSUxZKQorICAgICAgICB8fCByLT5oZWFkZXJzX291dC5zdGF0dXMgPT0gTkdYX0hUVFBfTU9WRURfVEVNUE9SQVJJTFkpCiAgICAgewogICAgICAgICAvKgogICAgICAgICAgKiBkbyBub3Qgc2V0IGNoYXJzZXQgZm9yIHRoZSByZWRpcmVjdCBiZWNhdXNlIE5OIDQueCB1c2VzIHRoaXMKQEAgLTE4Nyw4ICsxODgsMTQgQEAKICAgICAgICAgcmV0dXJuIG5neF9odHRwX25leHRfaGVhZGVyX2ZpbHRlcihyKTsKICAgICB9CiAKLSAgICBuZ3hfaHR0cF9jcmVhdGVfY3R4KHIsIGN0eCwgbmd4X2h0dHBfY2hhcnNldF9maWx0ZXJfbW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5neF9odHRwX2NoYXJzZXRfY3R4X3QpLCBOR1hfRVJST1IpOworCisgICAgY3R4ID0gbmd4X3BjYWxsb2Moci0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX2NoYXJzZXRfY3R4X3QpKTsKKyAgICBpZiAoY3R4ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICB9CisKKyAgICBuZ3hfaHR0cF9zZXRfY3R4KHIsIGN0eCwgbmd4X2h0dHBfY2hhcnNldF9maWx0ZXJfbW9kdWxlKTsKKwogCiAgICAgci0+ZmlsdGVyX25lZWRfaW5fbWVtb3J5ID0gMTsKIApAQCAtMTk2LDggKzIwMyw4IEBACiB9CiAKIAotc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9jaGFyc2V0X2JvZHlfZmlsdGVyKG5neF9odHRwX3JlcXVlc3RfdCAqciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfY2hhaW5fdCAqaW4pCitzdGF0aWMgbmd4X2ludF90CituZ3hfaHR0cF9jaGFyc2V0X2JvZHlfZmlsdGVyKG5neF9odHRwX3JlcXVlc3RfdCAqciwgbmd4X2NoYWluX3QgKmluKQogewogICAgIGNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICp0YWJsZTsKICAgICBuZ3hfY2hhaW5fdCAgICAgICAgICAgICAgICAgICAqY2w7CkBAIC0yMjYsNyArMjMzLDggQEAKIH0KIAogCi1zdGF0aWMgbmd4X3VpbnRfdCBuZ3hfY2hhcnNldF9yZWNvZGUobmd4X2J1Zl90ICpiLCBjaGFyICp0YWJsZSkKK3N0YXRpYyBuZ3hfdWludF90CituZ3hfY2hhcnNldF9yZWNvZGUobmd4X2J1Zl90ICpiLCBjaGFyICp0YWJsZSkKIHsKICAgICB1X2NoYXIgICAgICAqcDsKICAgICBuZ3hfdWludF90ICAgY2hhbmdlOwpAQCAtMjU0LDggKzI2Miw4IEBACiB9CiAKIAotc3RhdGljIGNoYXIgKm5neF9jaGFyc2V0X21hcF9ibG9jayhuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqY21kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjb25mKQorc3RhdGljIGNoYXIgKgorbmd4X2NoYXJzZXRfbWFwX2Jsb2NrKG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpjbWQsIHZvaWQgKmNvbmYpCiB7CiAgICAgbmd4X2h0dHBfY2hhcnNldF9tYWluX2NvbmZfdCAgKm1jZiA9IGNvbmY7CiAKQEAgLTI5NywxOCArMzA1LDIxIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoISh0YWJsZSA9IG5neF9wdXNoX2FycmF5KCZtY2YtPnRhYmxlcykpKSB7CisgICAgdGFibGUgPSBuZ3hfYXJyYXlfcHVzaCgmbWNmLT50YWJsZXMpOworICAgIGlmICh0YWJsZSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICB9CiAKICAgICB0YWJsZS0+c3JjID0gc3JjOwogICAgIHRhYmxlLT5kc3QgPSBkc3Q7CiAKLSAgICBpZiAoISh0YWJsZS0+c3JjMmRzdCA9IG5neF9wYWxsb2MoY2YtPnBvb2wsIDI1NikpKSB7CisgICAgdGFibGUtPnNyYzJkc3QgPSBuZ3hfcGFsbG9jKGNmLT5wb29sLCAyNTYpOworICAgIGlmICh0YWJsZS0+c3JjMmRzdCA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICB9CiAKLSAgICBpZiAoISh0YWJsZS0+ZHN0MnNyYyA9IG5neF9wYWxsb2MoY2YtPnBvb2wsIDI1NikpKSB7CisgICAgdGFibGUtPmRzdDJzcmMgPSBuZ3hfcGFsbG9jKGNmLT5wb29sLCAyNTYpOworICAgIGlmICh0YWJsZS0+ZHN0MnNyYyA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICB9CiAKQEAgLTMyNiwxNCArMzM3LDE3IEBACiAgICAgY2YtPmN0eCA9IHRhYmxlOwogICAgIGNmLT5oYW5kbGVyID0gbmd4X2NoYXJzZXRfbWFwOwogICAgIGNmLT5oYW5kbGVyX2NvbmYgPSBjb25mOworCiAgICAgcnYgPSBuZ3hfY29uZl9wYXJzZShjZiwgTlVMTCk7CisKICAgICAqY2YgPSBwdmNmOwogCiAgICAgcmV0dXJuIHJ2OwogfQogCiAKLXN0YXRpYyBjaGFyICpuZ3hfY2hhcnNldF9tYXAobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmR1bW15LCB2b2lkICpjb25mKQorc3RhdGljIGNoYXIgKgorbmd4X2NoYXJzZXRfbWFwKG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpkdW1teSwgdm9pZCAqY29uZikKIHsKICAgICBuZ3hfaW50X3QgICAgICAgICAgICAgICAgICAgc3JjLCBkc3Q7CiAgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgKnZhbHVlOwpAQCAtMzY5LDggKzM4Myw4IEBACiB9CiAKIAotc3RhdGljIGNoYXIgKm5neF9odHRwX3NldF9jaGFyc2V0X3Nsb3Qobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNvbmYpCitzdGF0aWMgY2hhciAqCituZ3hfaHR0cF9zZXRfY2hhcnNldF9zbG90KG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpjbWQsIHZvaWQgKmNvbmYpCiB7CiAgICAgY2hhciAgKnAgPSBjb25mOwogCkBAIC00MDQsNyArNDE4LDggQEAKIH0KIAogCi1zdGF0aWMgbmd4X2ludF90IG5neF9odHRwX2FkZF9jaGFyc2V0KG5neF9hcnJheV90ICpjaGFyc2V0cywgbmd4X3N0cl90ICpuYW1lKQorc3RhdGljIG5neF9pbnRfdAorbmd4X2h0dHBfYWRkX2NoYXJzZXQobmd4X2FycmF5X3QgKmNoYXJzZXRzLCBuZ3hfc3RyX3QgKm5hbWUpCiB7CiAgICAgbmd4X3VpbnRfdCAgICAgICAgICAgaTsKICAgICBuZ3hfaHR0cF9jaGFyc2V0X3QgICpjOwpAQCAtNDI0LDcgKzQzOSw4IEBACiAgICAgICAgIHJldHVybiBpOwogICAgIH0KIAotICAgIGlmICghKGMgPSBuZ3hfcHVzaF9hcnJheShjaGFyc2V0cykpKSB7CisgICAgYyA9IG5neF9hcnJheV9wdXNoKGNoYXJzZXRzKTsKKyAgICBpZiAoYyA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgfQogCkBAIC00MzYsNyArNDUyLDggQEAKIH0KIAogCi1zdGF0aWMgbmd4X2ludF90IG5neF9odHRwX2NoYXJzZXRfZmlsdGVyX2luaXQobmd4X2N5Y2xlX3QgKmN5Y2xlKQorc3RhdGljIG5neF9pbnRfdAorbmd4X2h0dHBfY2hhcnNldF9maWx0ZXJfaW5pdChuZ3hfY3ljbGVfdCAqY3ljbGUpCiB7CiAgICAgbmd4X2h0dHBfbmV4dF9oZWFkZXJfZmlsdGVyID0gbmd4X2h0dHBfdG9wX2hlYWRlcl9maWx0ZXI7CiAgICAgbmd4X2h0dHBfdG9wX2hlYWRlcl9maWx0ZXIgPSBuZ3hfaHR0cF9jaGFyc2V0X2hlYWRlcl9maWx0ZXI7CkBAIC00NDgsMjUgKzQ2NSwzNCBAQAogfQogCiAKLXN0YXRpYyB2b2lkICpuZ3hfaHR0cF9jaGFyc2V0X2NyZWF0ZV9tYWluX2NvbmYobmd4X2NvbmZfdCAqY2YpCitzdGF0aWMgdm9pZCAqCituZ3hfaHR0cF9jaGFyc2V0X2NyZWF0ZV9tYWluX2NvbmYobmd4X2NvbmZfdCAqY2YpCiB7CiAgICAgbmd4X2h0dHBfY2hhcnNldF9tYWluX2NvbmZfdCAgKm1jZjsKIAotICAgIGlmICghKG1jZiA9IG5neF9wY2FsbG9jKGNmLT5wb29sLCBzaXplb2Yobmd4X2h0dHBfY2hhcnNldF9tYWluX2NvbmZfdCkpKSkgeworICAgIG1jZiA9IG5neF9wY2FsbG9jKGNmLT5wb29sLCBzaXplb2Yobmd4X2h0dHBfY2hhcnNldF9tYWluX2NvbmZfdCkpOworICAgIGlmIChtY2YgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgfQogCi0gICAgbmd4X2luaXRfYXJyYXkobWNmLT5jaGFyc2V0cywgY2YtPnBvb2wsIDIsIHNpemVvZihuZ3hfaHR0cF9jaGFyc2V0X3QpLAotICAgICAgICAgICAgICAgICAgIE5HWF9DT05GX0VSUk9SKTsKKyAgICBpZiAobmd4X2FycmF5X2luaXQoJm1jZi0+Y2hhcnNldHMsIGNmLT5wb29sLCAyLCBzaXplb2Yobmd4X2h0dHBfY2hhcnNldF90KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IE5HWF9FUlJPUikKKyAgICB7CisgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICB9CiAKLSAgICBuZ3hfaW5pdF9hcnJheShtY2YtPnRhYmxlcywgY2YtPnBvb2wsIDQsIHNpemVvZihuZ3hfaHR0cF9jaGFyc2V0X3RhYmxlc190KSwKLSAgICAgICAgICAgICAgICAgICBOR1hfQ09ORl9FUlJPUik7CisgICAgaWYgKG5neF9hcnJheV9pbml0KCZtY2YtPnRhYmxlcywgY2YtPnBvb2wsIDQsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfaHR0cF9jaGFyc2V0X3RhYmxlc190KSkgPT0gTkdYX0VSUk9SKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgIH0KIAogICAgIHJldHVybiBtY2Y7CiB9CiAKIAotc3RhdGljIGNoYXIgKm5neF9odHRwX2NoYXJzZXRfaW5pdF9tYWluX2NvbmYobmd4X2NvbmZfdCAqY2YsIHZvaWQgKmNvbmYpCitzdGF0aWMgY2hhciAqCituZ3hfaHR0cF9jaGFyc2V0X2luaXRfbWFpbl9jb25mKG5neF9jb25mX3QgKmNmLCB2b2lkICpjb25mKQogewogICAgIG5neF9odHRwX2NoYXJzZXRfbWFpbl9jb25mX3QgKm1jZiA9IGNvbmY7CiAKQEAgLTQ4NCw3ICs1MTAsNiBAQAogCiAgICAgICAgIGNoYXJzZXRbaV0udGFibGVzID0gbmd4X3BjYWxsb2MoY2YtPnBvb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGNoYXIgKikgKiBtY2YtPmNoYXJzZXRzLm5lbHRzKTsKLQogICAgICAgICBpZiAoY2hhcnNldFtpXS50YWJsZXMgPT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgICAgICB9CkBAIC01MjcsMTEgKzU1MiwxMyBAQAogfQogCiAKLXN0YXRpYyB2b2lkICpuZ3hfaHR0cF9jaGFyc2V0X2NyZWF0ZV9sb2NfY29uZihuZ3hfY29uZl90ICpjZikKK3N0YXRpYyB2b2lkICoKK25neF9odHRwX2NoYXJzZXRfY3JlYXRlX2xvY19jb25mKG5neF9jb25mX3QgKmNmKQogewogICAgIG5neF9odHRwX2NoYXJzZXRfbG9jX2NvbmZfdCAgKmxjZjsKIAotICAgIGlmICghKGxjZiA9IG5neF9wY2FsbG9jKGNmLT5wb29sLCBzaXplb2Yobmd4X2h0dHBfY2hhcnNldF9sb2NfY29uZl90KSkpKSB7CisgICAgbGNmID0gbmd4X3BjYWxsb2MoY2YtPnBvb2wsIHNpemVvZihuZ3hfaHR0cF9jaGFyc2V0X2xvY19jb25mX3QpKTsKKyAgICBpZiAobGNmID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgIH0KIApAQCAtNTQ0LDggKzU3MSw4IEBACiB9CiAKIAotc3RhdGljIGNoYXIgKm5neF9odHRwX2NoYXJzZXRfbWVyZ2VfbG9jX2NvbmYobmd4X2NvbmZfdCAqY2YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwYXJlbnQsIHZvaWQgKmNoaWxkKQorc3RhdGljIGNoYXIgKgorbmd4X2h0dHBfY2hhcnNldF9tZXJnZV9sb2NfY29uZihuZ3hfY29uZl90ICpjZiwgdm9pZCAqcGFyZW50LCB2b2lkICpjaGlsZCkKIHsKICAgICBuZ3hfaHR0cF9jaGFyc2V0X2xvY19jb25mX3QgKnByZXYgPSBwYXJlbnQ7CiAgICAgbmd4X2h0dHBfY2hhcnNldF9sb2NfY29uZl90ICpjb25mID0gY2hpbGQ7CmRpZmYgLS1naXQgYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2NodW5rZWRfZmlsdGVyLmMgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2NodW5rZWRfZmlsdGVyX21vZHVsZS5jCnNpbWlsYXJpdHkgaW5kZXggODclCnJlbmFtZSBmcm9tIHNyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfY2h1bmtlZF9maWx0ZXIuYwpyZW5hbWUgdG8gc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9jaHVua2VkX2ZpbHRlcl9tb2R1bGUuYwppbmRleCA1MTQ1ZmY2Li5iNzQyZGJiIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2NodW5rZWRfZmlsdGVyLmMKKysrIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9jaHVua2VkX2ZpbHRlcl9tb2R1bGUuYwpAQCAtNDAsNyArNDAsOCBAQAogc3RhdGljIG5neF9odHRwX291dHB1dF9ib2R5X2ZpbHRlcl9wdCAgICBuZ3hfaHR0cF9uZXh0X2JvZHlfZmlsdGVyOwogCiAKLXN0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfY2h1bmtlZF9oZWFkZXJfZmlsdGVyKG5neF9odHRwX3JlcXVlc3RfdCAqcikKK3N0YXRpYyBuZ3hfaW50X3QKK25neF9odHRwX2NodW5rZWRfaGVhZGVyX2ZpbHRlcihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpCiB7CiAgICAgaWYgKHItPmhlYWRlcnNfb3V0LnN0YXR1cyA9PSBOR1hfSFRUUF9OT1RfTU9ESUZJRUQpIHsKICAgICAgICAgcmV0dXJuIG5neF9odHRwX25leHRfaGVhZGVyX2ZpbHRlcihyKTsKQEAgLTU5LDggKzYwLDggQEAKIH0KIAogCi1zdGF0aWMgbmd4X2ludF90IG5neF9odHRwX2NodW5rZWRfYm9keV9maWx0ZXIobmd4X2h0dHBfcmVxdWVzdF90ICpyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9jaGFpbl90ICppbikKK3N0YXRpYyBuZ3hfaW50X3QKK25neF9odHRwX2NodW5rZWRfYm9keV9maWx0ZXIobmd4X2h0dHBfcmVxdWVzdF90ICpyLCBuZ3hfY2hhaW5fdCAqaW4pCiB7CiAgICAgdV9jaGFyICAgICAgICpjaHVuazsKICAgICBvZmZfdCAgICAgICAgIHNpemU7CkBAIC04NSw3ICs4Niw4IEBACiAKICAgICAgICAgaWYgKGNsLT5idWYtPmZsdXNoIHx8IG5neF9idWZfaW5fbWVtb3J5KGNsLT5idWYpIHx8IGNsLT5idWYtPmluX2ZpbGUpIHsKIAotICAgICAgICAgICAgaWYgKCEodGwgPSBuZ3hfYWxsb2NfY2hhaW5fbGluayhyLT5wb29sKSkpIHsKKyAgICAgICAgICAgIHRsID0gbmd4X2FsbG9jX2NoYWluX2xpbmsoci0+cG9vbCk7CisgICAgICAgICAgICBpZiAodGwgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgICAgICAgICB9CiAKQEAgLTEwMiwxMCArMTA0LDEzIEBACiAgICAgfQogCiAgICAgaWYgKHNpemUpIHsKLSAgICAgICAgaWYgKCEoYiA9IG5neF9jYWxsb2NfYnVmKHItPnBvb2wpKSkgeworICAgICAgICBiID0gbmd4X2NhbGxvY19idWYoci0+cG9vbCk7CisgICAgICAgIGlmIChiID09IE5VTEwpIHsKICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgICAgIH0KIAorICAgICAgICAvKiB0aGUgIjAwMDAwMDAwMDAwMDAwMDAiIGlzIDY0LWJpdCBoZXhhZGltYWwgc3RyaW5nICovCisKICAgICAgICAgY2h1bmsgPSBuZ3hfcGFsbG9jKHItPnBvb2wsIHNpemVvZigiMDAwMDAwMDAwMDAwMDAwMCIgQ1JMRikgLSAxKTsKICAgICAgICAgaWYgKGNodW5rID09IE5VTEwpIHsKICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CkBAIC0xMTksNyArMTI0LDggQEAKICAgICB9CiAKICAgICBpZiAoY2wtPmJ1Zi0+bGFzdF9idWYpIHsKLSAgICAgICAgaWYgKCEoYiA9IG5neF9jYWxsb2NfYnVmKHItPnBvb2wpKSkgeworICAgICAgICBiID0gbmd4X2NhbGxvY19idWYoci0+cG9vbCk7CisgICAgICAgIGlmIChiID09IE5VTEwpIHsKICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgICAgIH0KIApAQCAtMTQ0LDcgKzE1MCw4IEBACiAgICAgICAgICAgICByZXR1cm4gbmd4X2h0dHBfbmV4dF9ib2R5X2ZpbHRlcihyLCBvdXQubmV4dCk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoIShiID0gbmd4X2NhbGxvY19idWYoci0+cG9vbCkpKSB7CisgICAgICAgIGIgPSBuZ3hfY2FsbG9jX2J1ZihyLT5wb29sKTsKKyAgICAgICAgaWYgKGIgPT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICAgICAgfQogCkBAIC0xNjEsNyArMTY4LDggQEAKIH0KIAogCi1zdGF0aWMgbmd4X2ludF90IG5neF9odHRwX2NodW5rZWRfZmlsdGVyX2luaXQobmd4X2N5Y2xlX3QgKmN5Y2xlKQorc3RhdGljIG5neF9pbnRfdAorbmd4X2h0dHBfY2h1bmtlZF9maWx0ZXJfaW5pdChuZ3hfY3ljbGVfdCAqY3ljbGUpCiB7CiAgICAgbmd4X2h0dHBfbmV4dF9oZWFkZXJfZmlsdGVyID0gbmd4X2h0dHBfdG9wX2hlYWRlcl9maWx0ZXI7CiAgICAgbmd4X2h0dHBfdG9wX2hlYWRlcl9maWx0ZXIgPSBuZ3hfaHR0cF9jaHVua2VkX2hlYWRlcl9maWx0ZXI7CmRpZmYgLS1naXQgYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2Zhc3RjZ2lfaGFuZGxlci5jIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9mYXN0Y2dpX21vZHVsZS5jCnNpbWlsYXJpdHkgaW5kZXggOTYlCnJlbmFtZSBmcm9tIHNyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfZmFzdGNnaV9oYW5kbGVyLmMKcmVuYW1lIHRvIHNyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfZmFzdGNnaV9tb2R1bGUuYwppbmRleCA1YjM4NGI4Li5hNWY5YTAyIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2Zhc3RjZ2lfaGFuZGxlci5jCisrKyBiL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfZmFzdGNnaV9tb2R1bGUuYwpAQCAtMzc3LDcgKzM3Nyw4IEBACiAKICAgICBmbGNmID0gbmd4X2h0dHBfZ2V0X21vZHVsZV9sb2NfY29uZihyLCBuZ3hfaHR0cF9mYXN0Y2dpX21vZHVsZSk7CiAKLSAgICBpZiAoISh1ID0gbmd4X3BjYWxsb2Moci0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX3Vwc3RyZWFtX3QpKSkpIHsKKyAgICB1ID0gbmd4X3BjYWxsb2Moci0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX3Vwc3RyZWFtX3QpKTsKKyAgICBpZiAodSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7CiAgICAgfQogCkBAIC00OTIsMjUgKzQ5MywyNCBAQAogICAgIGluZGV4ID0gKHItPnVyaS5kYXRhW3ItPnVyaS5sZW4gLSAxXSA9PSAnLycpID8gZmxjZi0+aW5kZXgubGVuIDogMDsKIAogICAgIGxlbiArPSAxICsgKChmbGNmLT5yb290LmxlbiArIHItPnVyaS5sZW4gKyBpbmRleCA+IDEyNykgPyA0IDogMSkKLSAgICAgICAgICAgICArIHNpemVvZigiUEFUSF9UUkFOU0xBVEVEIikgLSAxCi0gICAgICAgICAgICAgKyBmbGNmLT5yb290LmxlbiArIHItPnVyaS5sZW4gKyBpbmRleDsKKyAgICAgICAgKyBzaXplb2YoIlBBVEhfVFJBTlNMQVRFRCIpIC0gMSArIGZsY2YtPnJvb3QubGVuICsgci0+dXJpLmxlbiArIGluZGV4OwogCiAgICAgaWYgKHItPmFyZ3MubGVuKSB7CiAgICAgICAgIGxlbiArPSAxICsgKChyLT5hcmdzLmxlbiA+IDEyNykgPyA0IDogMSkgKyBzaXplb2YoIlFVRVJZX1NUUklORyIpIC0gMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgci0+YXJncy5sZW47CisgICAgICAgICAgICArIHItPmFyZ3MubGVuOwogICAgIH0KIAogICAgIGlmIChyLT5oZWFkZXJzX2luLmNvbnRlbnRfbGVuZ3RoX24gPiAwKSB7CiAgICAgICAgIGxlbiArPSAxICsgKChyLT5oZWFkZXJzX2luLmNvbnRlbnRfbGVuZ3RoLT52YWx1ZS5sZW4gPiAxMjcpID8gNCA6IDEpCi0gICAgICAgICAgICAgICAgICsgc2l6ZW9mKCJDT05URU5UX0xFTkdUSCIpIC0gMQotICAgICAgICAgICAgICAgICArIHItPmhlYWRlcnNfaW4uY29udGVudF9sZW5ndGgtPnZhbHVlLmxlbjsKKyAgICAgICAgICAgICsgc2l6ZW9mKCJDT05URU5UX0xFTkdUSCIpIC0gMQorICAgICAgICAgICAgKyByLT5oZWFkZXJzX2luLmNvbnRlbnRfbGVuZ3RoLT52YWx1ZS5sZW47CiAgICAgfQogCiAKICAgICBpZiAoci0+aGVhZGVyc19pbi5jb250ZW50X3R5cGUpIHsKICAgICAgICAgbGVuICs9IDEgKyAoKHItPmhlYWRlcnNfaW4uY29udGVudF90eXBlLT52YWx1ZS5sZW4gPiAxMjcpID8gNCA6IDEpCi0gICAgICAgICAgICAgICAgICsgc2l6ZW9mKCJDT05URU5UX1RZUEUiKSAtIDEKLSAgICAgICAgICAgICAgICAgKyByLT5oZWFkZXJzX2luLmNvbnRlbnRfdHlwZS0+dmFsdWUubGVuOworICAgICAgICAgICAgKyBzaXplb2YoIkNPTlRFTlRfVFlQRSIpIC0gMQorICAgICAgICAgICAgKyByLT5oZWFkZXJzX2luLmNvbnRlbnRfdHlwZS0+dmFsdWUubGVuOwogICAgIH0KIAogCkBAIC01MjAsMjQgKzUyMCwyNCBAQAogCiAgICAgaWYgKGZsY2YtPnBhcmFtcyAmIE5HWF9IVFRQX0ZBU1RDR0lfUkVRVUVTVF9VUkkpIHsKICAgICAgICAgbGVuICs9IDEgKyAoKHItPnVucGFyc2VkX3VyaS5sZW4gPiAxMjcpID8gNCA6IDEpCi0gICAgICAgICAgICAgICAgICsgc2l6ZW9mKCJSRVFVRVNUX1VSSSIpIC0gMSArIHItPnVucGFyc2VkX3VyaS5sZW47CisgICAgICAgICAgICArIHNpemVvZigiUkVRVUVTVF9VUkkiKSAtIDEgKyByLT51bnBhcnNlZF91cmkubGVuOwogICAgIH0KIAogICAgIGlmIChmbGNmLT5wYXJhbXMgJiBOR1hfSFRUUF9GQVNUQ0dJX0RPQ1VNRU5UX1JPT1QpIHsKICAgICAgICAgY2xjZiA9IG5neF9odHRwX2dldF9tb2R1bGVfbG9jX2NvbmYociwgbmd4X2h0dHBfY29yZV9tb2R1bGUpOwogICAgICAgICBsZW4gKz0gMSArICgoY2xjZi0+cm9vdC5sZW4gPiAxMjcpID8gNCA6IDEpCi0gICAgICAgICAgICAgICAgICsgc2l6ZW9mKCJET0NVTUVOVF9ST09UIikgLSAxICsgY2xjZi0+cm9vdC5sZW47CisgICAgICAgICAgICArIHNpemVvZigiRE9DVU1FTlRfUk9PVCIpIC0gMSArIGNsY2YtPnJvb3QubGVuOwogICAgIH0KIAogICAgIGlmIChmbGNmLT5wYXJhbXMgJiBOR1hfSFRUUF9GQVNUQ0dJX1NDUklQVF9GSUxFTkFNRSkgewogICAgICAgICBsZW4gKz0gMSArICgoZmxjZi0+cm9vdC5sZW4gKyByLT51cmkubGVuICsgaW5kZXggPiAxMjcpID8gNCA6IDEpCi0gICAgICAgICAgICAgICAgICsgc2l6ZW9mKCJTQ1JJUFRfRklMRU5BTUUiKSAtIDEKLSAgICAgICAgICAgICAgICAgKyBmbGNmLT5yb290LmxlbiArIHItPnVyaS5sZW4gKyBpbmRleDsKKyAgICAgICAgICAgICsgc2l6ZW9mKCJTQ1JJUFRfRklMRU5BTUUiKSAtIDEKKyAgICAgICAgICAgICsgZmxjZi0+cm9vdC5sZW4gKyByLT51cmkubGVuICsgaW5kZXg7CiAgICAgfQogCiAgICAgaWYgKGZsY2YtPnBhcmFtcyAmIE5HWF9IVFRQX0ZBU1RDR0lfU0NSSVBUX05BTUUpIHsKICAgICAgICAgbGVuICs9IDEgKyAoKHItPnVyaS5sZW4gKyBpbmRleCA+IDEyNykgPyA0IDogMSkKLSAgICAgICAgICAgICAgICAgKyBzaXplb2YoIlNDUklQVF9OQU1FIikgLSAxICsgci0+dXJpLmxlbiArIGluZGV4IDsKKyAgICAgICAgICAgICsgc2l6ZW9mKCJTQ1JJUFRfTkFNRSIpIC0gMSArIHItPnVyaS5sZW4gKyBpbmRleCA7CiAgICAgfQogCiAgICAgaWYgKGZsY2YtPnBhcmFtcyAmIE5HWF9IVFRQX0ZBU1RDR0lfUkVNT1RFX0FERFIpIHsKQEAgLTU3OSw3ICs1NzksNyBAQAogICAgICAgICAmJiByLT5odHRwX3Byb3RvY29sLmxlbikKICAgICB7CiAgICAgICAgIGxlbiArPSAxICsgKChyLT5odHRwX3Byb3RvY29sLmxlbiA+IDEyNykgPyA0IDogMSkKLSAgICAgICAgICAgICAgICAgKyBzaXplb2YoIlNFUlZFUl9QUk9UT0NPTCIpIC0gMSArIHItPmh0dHBfcHJvdG9jb2wubGVuOworICAgICAgICAgICAgKyBzaXplb2YoIlNFUlZFUl9QUk9UT0NPTCIpIC0gMSArIHItPmh0dHBfcHJvdG9jb2wubGVuOwogICAgIH0KIAogICAgIGlmIChmbGNmLT5wYXJhbXMgJiBOR1hfSFRUUF9GQVNUQ0dJX1NFUlZFUl9TT0ZUV0FSRSkgewpAQCAtNTk5LDcgKzU5OSw4IEBACiAKICAgICAgICAgZm9yIChpID0gMDsgaSA8IGZsY2YtPnZhcnMtPm5lbHRzOyBpKyspIHsKIAotICAgICAgICAgICAgaWYgKCEodmFsdWUgPSBuZ3hfaHR0cF9nZXRfaW5kZXhlZF92YXJpYWJsZShyLCB2aW5kZXhbaV0pKSkgeworICAgICAgICAgICAgdmFsdWUgPSBuZ3hfaHR0cF9nZXRfaW5kZXhlZF92YXJpYWJsZShyLCB2aW5kZXhbaV0pOworICAgICAgICAgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KIApAQCAtNjI2LDggKzYyNyw4IEBACiAgICAgICAgIH0KIAogICAgICAgICBsZW4gKz0gKChoZWFkZXJbaV0ua2V5LmxlbiA+IDEyNykgPyA0IDogMSkKLSAgICAgICAgICAgICAgICsgKChoZWFkZXJbaV0udmFsdWUubGVuID4gMTI3KSA/IDQgOiAxKQotICAgICAgICAgICAgICAgKyA1ICsgaGVhZGVyW2ldLmtleS5sZW4gKyBoZWFkZXJbaV0udmFsdWUubGVuOworICAgICAgICAgICAgKyAoKGhlYWRlcltpXS52YWx1ZS5sZW4gPiAxMjcpID8gNCA6IDEpCisgICAgICAgICAgICArIDUgKyBoZWFkZXJbaV0ua2V5LmxlbiArIGhlYWRlcltpXS52YWx1ZS5sZW47CiAgICAgfQogCiAKQEAgLTY1MiwxMSArNjUzLDEzIEBACiAgICAgICAgICAgICsgc2l6ZW9mKG5neF9odHRwX2Zhc3RjZ2lfaGVhZGVyX3QpOyAvKiBOR1hfSFRUUF9GQVNUQ0dJX1NURElOICovCiAKIAotICAgIGlmICghKGIgPSBuZ3hfY3JlYXRlX3RlbXBfYnVmKHItPnBvb2wsIHNpemUpKSkgeworICAgIGIgPSBuZ3hfY3JlYXRlX3RlbXBfYnVmKHItPnBvb2wsIHNpemUpOworICAgIGlmIChiID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICB9CiAKLSAgICBpZiAoIShjbCA9IG5neF9hbGxvY19jaGFpbl9saW5rKHItPnBvb2wpKSkgeworICAgIGNsID0gbmd4X2FsbG9jX2NoYWluX2xpbmsoci0+cG9vbCk7CisgICAgaWYgKGNsID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICB9CiAKQEAgLTk5OCw3ICsxMDAxLDggQEAKICAgICBpZiAoZmxjZi0+dmFycykgewogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZmxjZi0+dmFycy0+bmVsdHM7IGkrKykgewogCi0gICAgICAgICAgICBpZiAoISh2YWx1ZSA9IG5neF9odHRwX2dldF9pbmRleGVkX3ZhcmlhYmxlKHIsIHZpbmRleFtpXSkpKSB7CisgICAgICAgICAgICB2YWx1ZSA9IG5neF9odHRwX2dldF9pbmRleGVkX3ZhcmlhYmxlKHIsIHZpbmRleFtpXSk7CisgICAgICAgICAgICBpZiAodmFsdWUgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogCkBAIC0xMTE1LDcgKzExMTksOCBAQAogICAgICAgICBuZXh0ID0gMDsKIAogICAgICAgICBkbyB7Ci0gICAgICAgICAgICBpZiAoIShiID0gbmd4X2FsbG9jX2J1ZihyLT5wb29sKSkpIHsKKyAgICAgICAgICAgIGIgPSBuZ3hfYWxsb2NfYnVmKHItPnBvb2wpOworICAgICAgICAgICAgaWYgKGIgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgICAgICAgICB9CiAKQEAgLTExNTgsNyArMTE2Myw4IEBACiAgICAgICAgICAgICBoLT5wYWRkaW5nX2xlbmd0aCA9ICh1X2NoYXIpIHBhZGRpbmc7CiAgICAgICAgICAgICBoLT5yZXNlcnZlZCA9IDA7CiAKLSAgICAgICAgICAgIGlmICghKGNsLT5uZXh0ID0gbmd4X2FsbG9jX2NoYWluX2xpbmsoci0+cG9vbCkpKSB7CisgICAgICAgICAgICBjbC0+bmV4dCA9IG5neF9hbGxvY19jaGFpbl9saW5rKHItPnBvb2wpOworICAgICAgICAgICAgaWYgKGNsLT5uZXh0ID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgICAgICAgICAgfQogCkBAIC0xMTc5LDcgKzExODUsOCBAQAogICAgICAgICAgICAgaCA9IChuZ3hfaHR0cF9mYXN0Y2dpX2hlYWRlcl90ICopIGItPmxhc3Q7CiAgICAgICAgICAgICBiLT5sYXN0ICs9IHNpemVvZihuZ3hfaHR0cF9mYXN0Y2dpX2hlYWRlcl90KTsKIAotICAgICAgICAgICAgaWYgKCEoY2wtPm5leHQgPSBuZ3hfYWxsb2NfY2hhaW5fbGluayhyLT5wb29sKSkpIHsKKyAgICAgICAgICAgIGNsLT5uZXh0ID0gbmd4X2FsbG9jX2NoYWluX2xpbmsoci0+cG9vbCk7CisgICAgICAgICAgICBpZiAoY2wtPm5leHQgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgICAgICAgICB9CiAKQEAgLTEyNDgsNyArMTI1NSw4IEBACiAgICAgZiA9IG5neF9odHRwX2dldF9tb2R1bGVfY3R4KHIsIG5neF9odHRwX2Zhc3RjZ2lfbW9kdWxlKTsKIAogICAgIGlmIChmID09IE5VTEwpIHsKLSAgICAgICAgaWYgKCEoZiA9IG5neF9wY2FsbG9jKHItPnBvb2wsIHNpemVvZihuZ3hfaHR0cF9mYXN0Y2dpX2N0eF90KSkpKSB7CisgICAgICAgIGYgPSBuZ3hfcGNhbGxvYyhyLT5wb29sLCBzaXplb2Yobmd4X2h0dHBfZmFzdGNnaV9jdHhfdCkpOworICAgICAgICBpZiAoZiA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwogICAgICAgICB9CiAKQEAgLTE0MTMsNyArMTQyMSw4IEBACiAKICAgICAgICAgICAgICAgICAvKiBhIGhlYWRlciBsaW5lIGhhcyBiZWVuIHBhcnNlZCBzdWNjZXNzZnVsbHkgKi8KIAotICAgICAgICAgICAgICAgIGlmICghKGggPSBuZ3hfbGlzdF9wdXNoKCZmLT51cHN0cmVhbS0+aGVhZGVyc19pbi5oZWFkZXJzKSkpIHsKKyAgICAgICAgICAgICAgICBoID0gbmd4X2xpc3RfcHVzaCgmZi0+dXBzdHJlYW0tPmhlYWRlcnNfaW4uaGVhZGVycyk7CisgICAgICAgICAgICAgICAgaWYgKGggPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwogICAgICAgICAgICAgICAgIH0KIApAQCAtMTU4MCw3ICsxNTg5LDggQEAKIAogICAgICAgICAvKiBjb3B5IHNvbWUgaGVhZGVyIHBvaW50ZXJzIGFuZCBzZXQgdXAgci0+aGVhZGVyc19vdXQgKi8KIAotICAgICAgICBpZiAoIShobyA9IG5neF9saXN0X3B1c2goJnItPmhlYWRlcnNfb3V0LmhlYWRlcnMpKSkgeworICAgICAgICBobyA9IG5neF9saXN0X3B1c2goJnItPmhlYWRlcnNfb3V0LmhlYWRlcnMpOworICAgICAgICBpZiAoaG8gPT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKICAgICAgICAgfQogCkBAIC0xNzMzLDcgKzE3NDMsOCBAQAogICAgICAgICAgICAgcC0+ZnJlZSA9IHAtPmZyZWUtPm5leHQ7CiAKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmICghKGIgPSBuZ3hfYWxsb2NfYnVmKHAtPnBvb2wpKSkgeworICAgICAgICAgICAgYiA9IG5neF9hbGxvY19idWYocC0+cG9vbCk7CisgICAgICAgICAgICBpZiAoYiA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTc1MCwxOCArMTc2MSwyNiBAQAogICAgICAgICAqcHJldiA9IGI7CiAgICAgICAgIHByZXYgPSAmYi0+c2hhZG93OwogCi0gICAgICAgIGlmICghKGNsID0gbmd4X2FsbG9jX2NoYWluX2xpbmsocC0+cG9vbCkpKSB7CisgICAgICAgIGNsID0gbmd4X2FsbG9jX2NoYWluX2xpbmsocC0+cG9vbCk7CisgICAgICAgIGlmIChjbCA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgICAgICB9CiAKICAgICAgICAgY2wtPmJ1ZiA9IGI7CiAgICAgICAgIGNsLT5uZXh0ID0gTlVMTDsKIAorICAgICAgICBpZiAocC0+aW4pIHsKKyAgICAgICAgICAgICpwLT5sYXN0X2luID0gY2w7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwLT5pbiA9IGNsOworICAgICAgICB9CisgICAgICAgIHAtPmxhc3RfaW4gPSAmY2wtPm5leHQ7CisKKwogICAgICAgICAvKiBTVFVCICovIGItPm51bSA9IGJ1Zi0+bnVtOwogCiAgICAgICAgIG5neF9sb2dfZGVidWcxKE5HWF9MT0dfREVCVUdfRVZFTlQsIHAtPmxvZywgMCwgImlucHV0IGJ1ZiAjJWQiLCBiLT5udW0pOwogCi0gICAgICAgIG5neF9jaGFpbl9hZGRfbGluayhwLT5pbiwgcC0+bGFzdF9pbiwgY2wpOwogCiAgICAgICAgIGlmIChmLT5wb3MgKyBmLT5sZW5ndGggPCBmLT5sYXN0KSB7CiAKQEAgLTE4MjAsMTEgKzE4MzksOCBAQAogICAgIG5neF9odHRwX2Zhc3RjZ2lfY3R4X3QgKmYpCiB7CiAgICAgdV9jaGFyICAgICAgICAgICAgICAgICAgICAgY2gsICpwOwotICAgIG5neF9odHRwX3Vwc3RyZWFtX3QgICAgICAgKnU7CiAgICAgbmd4X2h0dHBfZmFzdGNnaV9zdGF0ZV9lICAgc3RhdGU7CiAKLSAgICB1ID0gci0+dXBzdHJlYW07Ci0KICAgICBzdGF0ZSA9IGYtPnN0YXRlOwogCiAgICAgZm9yIChwID0gZi0+cG9zOyBwIDwgZi0+bGFzdDsgcCsrKSB7CkBAIC0xOTY4LDcgKzE5ODQsOCBAQAogICAgICAgICB1bml4X3Vwc3RyZWFtLm5hbWUgPSB2YWx1ZVsxXTsKICAgICAgICAgdW5peF91cHN0cmVhbS51cmwgPSB2YWx1ZVsxXTsKIAotICAgICAgICBpZiAoIShsY2YtPnBlZXJzID0gbmd4X3VuaXhfdXBzdHJlYW1fcGFyc2UoY2YsICZ1bml4X3Vwc3RyZWFtKSkpIHsKKyAgICAgICAgbGNmLT5wZWVycyA9IG5neF91bml4X3Vwc3RyZWFtX3BhcnNlKGNmLCAmdW5peF91cHN0cmVhbSk7CisgICAgICAgIGlmIChsY2YtPnBlZXJzID09IE5VTEwpIHsKICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICAgICAgfQogCkBAIC0xOTg2LDcgKzIwMDMsOCBAQAogICAgICAgICBpbmV0X3Vwc3RyZWFtLm5hbWUgPSB2YWx1ZVsxXTsKICAgICAgICAgaW5ldF91cHN0cmVhbS51cmwgPSB2YWx1ZVsxXTsKICAgICAKLSAgICAgICAgaWYgKCEobGNmLT5wZWVycyA9IG5neF9pbmV0X3Vwc3RyZWFtX3BhcnNlKGNmLCAmaW5ldF91cHN0cmVhbSkpKSB7CisgICAgICAgIGxjZi0+cGVlcnMgPSBuZ3hfaW5ldF91cHN0cmVhbV9wYXJzZShjZiwgJmluZXRfdXBzdHJlYW0pOworICAgICAgICBpZiAobGNmLT5wZWVycyA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgICAgIH0KICAgICB9CkBAIC0xOTk2LDcgKzIwMTQsNyBAQAogICAgIGNsY2YtPmhhbmRsZXIgPSBuZ3hfaHR0cF9mYXN0Y2dpX2hhbmRsZXI7CiAKICNpZiAoTkdYX1BDUkUpCi0gICAgbGNmLT5sb2NhdGlvbiA9IGNsY2YtPnJlZ2V4ID8gJm5neF9odHRwX2Zhc3RjZ2lfdXJpOiAmY2xjZi0+bmFtZTsKKyAgICBsY2YtPmxvY2F0aW9uID0gY2xjZi0+cmVnZXggPyAmbmd4X2h0dHBfZmFzdGNnaV91cmkgOiAmY2xjZi0+bmFtZTsKICNlbHNlCiAgICAgbGNmLT5sb2NhdGlvbiA9ICZjbGNmLT5uYW1lOwogI2VuZGlmCkBAIC0yMDM1LDcgKzIwNTMsOCBAQAogICAgIGZvciAoaSA9IDA7IGkgPCBjbWNmLT52YXJpYWJsZXMubmVsdHM7IGkrKykgewogICAgICAgICBpZiAobmd4X3N0cmNhc2VjbXAodmFyW2ldLm5hbWUuZGF0YSwgdmFsdWVbMV0uZGF0YSkgPT0gMCkgewogCi0gICAgICAgICAgICBpZiAoIShpbmRleCA9IG5neF9hcnJheV9wdXNoKGxjZi0+dmFycykpKSB7CisgICAgICAgICAgICBpbmRleCA9IG5neF9hcnJheV9wdXNoKGxjZi0+dmFycyk7CisgICAgICAgICAgICBpZiAoaW5kZXggPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICAgICAgICAgIH0KIApAQCAtMjA4NCw3ICsyMTAzLDggQEAKIHsKICAgICBuZ3hfaHR0cF9mYXN0Y2dpX2xvY19jb25mX3QgICpjb25mOwogCi0gICAgaWYgKCEoY29uZiA9IG5neF9wY2FsbG9jKGNmLT5wb29sLCBzaXplb2Yobmd4X2h0dHBfZmFzdGNnaV9sb2NfY29uZl90KSkpKSB7CisgICAgY29uZiA9IG5neF9wY2FsbG9jKGNmLT5wb29sLCBzaXplb2Yobmd4X2h0dHBfZmFzdGNnaV9sb2NfY29uZl90KSk7CisgICAgaWYgKGNvbmYgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2dlb19tb2R1bGUuYyBiL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfZ2VvX21vZHVsZS5jCmluZGV4IDBkODI2N2QuLjg2NWY4MjUgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfZ2VvX21vZHVsZS5jCisrKyBiL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfZ2VvX21vZHVsZS5jCkBAIC02NCw5ICs2NCw5IEBACiAvKiBBRl9JTkVUIG9ubHkgKi8KIAogc3RhdGljIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgKgotbmd4X2h0dHBfZ2VvX3ZhcmlhYmxlKG5neF9odHRwX3JlcXVlc3RfdCAqciwgdm9pZCAqZGF0YSkKK25neF9odHRwX2dlb192YXJpYWJsZShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVpbnRwdHJfdCBkYXRhKQogewotICAgIG5neF9yYWRpeF90cmVlX3QgKnRyZWUgPSBkYXRhOworICAgIG5neF9yYWRpeF90cmVlX3QgKnRyZWUgPSAobmd4X3JhZGl4X3RyZWVfdCAqKSBkYXRhOwogCiAgICAgc3RydWN0IHNvY2thZGRyX2luICAgICAgICAgKnNpbjsKICAgICBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICAqdmFyOwpAQCAtOTAsMzMgKzkwLDQ2IEBACiBuZ3hfaHR0cF9nZW9fYmxvY2sobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwgdm9pZCAqY29uZikKIHsKICAgICBjaGFyICAgICAgICAgICAgICAgICAqcnY7Ci0gICAgbmd4X3N0cl90ICAgICAgICAgICAgKnZhbHVlOworICAgIG5neF9zdHJfdCAgICAgICAgICAgICp2YWx1ZSwgbmFtZTsKICAgICBuZ3hfY29uZl90ICAgICAgICAgICAgc2F2ZTsKICAgICBuZ3hfcG9vbF90ICAgICAgICAgICAqcG9vbDsKICAgICBuZ3hfcmFkaXhfdHJlZV90ICAgICAqdHJlZTsKICAgICBuZ3hfaHR0cF9nZW9fY29uZl90ICAgZ2VvOwogICAgIG5neF9odHRwX3ZhcmlhYmxlX3QgICp2YXI7CiAKLSAgICBpZiAoISh2YXIgPSBuZ3hfaHR0cF9hZGRfdmFyaWFibGUoY2YpKSkgewotICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7Ci0gICAgfQotCi0gICAgaWYgKCEodHJlZSA9IG5neF9yYWRpeF90cmVlX2NyZWF0ZShjZi0+cG9vbCwgLTEpKSkgewotICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7Ci0gICAgfQotCiAgICAgdmFsdWUgPSBjZi0+YXJncy0+ZWx0czsKIAotICAgIHZhci0+bmFtZSA9IHZhbHVlWzFdOworICAgIG5hbWUgPSB2YWx1ZVsxXTsKKworICAgIGlmIChuYW1lLmRhdGFbMF0gIT0gJyQnKSB7CisgICAgICAgIG5neF9jb25mX2xvZ19lcnJvcihOR1hfTE9HX1dBUk4sIGNmLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiJVZcIiB2YXJpYWJsZSBuYW1lIHNob3VsZCBzdGFydCB3aXRoICckJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVbMV0pOworICAgIH0gZWxzZSB7CisgICAgICAgIG5hbWUubGVuLS07CisgICAgICAgIG5hbWUuZGF0YSsrOworICAgIH0KKworICAgIHZhciA9IG5neF9odHRwX2FkZF92YXJpYWJsZShjZiwgJm5hbWUsIDEpOworICAgIGlmICh2YXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgfQorCisgICAgdHJlZSA9IG5neF9yYWRpeF90cmVlX2NyZWF0ZShjZi0+cG9vbCwgLTEpOworICAgIGlmICh0cmVlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgIH0KKwogICAgIHZhci0+aGFuZGxlciA9IG5neF9odHRwX2dlb192YXJpYWJsZTsKLSAgICB2YXItPmRhdGEgPSB0cmVlOworICAgIHZhci0+ZGF0YSA9ICh1aW50cHRyX3QpIHRyZWU7CiAKICAgICAvKgogICAgICAqIGNyZWF0ZSB0aGUgdGVtcG9yYXJ5IHBvb2wgb2YgYSBodWdlIGluaXRpYWwgc2l6ZQogICAgICAqIHRvIHByb2Nlc3MgcXVpY2tseSBhIGxhcmdlIG51bWJlciBvZiBnZW8gbGluZXMKICAgICAgKi8KIAotICAgIGlmICghKHBvb2wgPSBuZ3hfY3JlYXRlX3Bvb2woNTEyICogMTAyNCwgY2YtPmxvZykpKSB7CisgICAgcG9vbCA9IG5neF9jcmVhdGVfcG9vbCg1MTIgKiAxMDI0LCBjZi0+bG9nKTsKKyAgICBpZiAocG9vbCA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICB9CiAKQEAgLTIxMiw3ICsyMjUsMTIgQEAKIAogICAgIGlmIChuID09IE5HWF9FUlJPUikgewogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZ2VvLT52YWx1ZXMubmVsdHM7IGkrKykgewotICAgICAgICAgICAgaWYgKG5neF9zdHJjbXAodmFsdWVbMV0uZGF0YSwgdltpXS0+dGV4dC5kYXRhKSA9PSAwKSB7CisgICAgICAgICAgICBpZiAodltpXS0+dGV4dC5sZW4gIT0gdmFsdWVbMV0ubGVuKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChuZ3hfc3RybmNtcCh2YWx1ZVsxXS5kYXRhLCB2W2ldLT50ZXh0LmRhdGEsIHZhbHVlWzFdLmxlbikgPT0gMCkKKyAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB2YXIgPSB2W2ldOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtMjI3LDIwICsyNDUsMjIgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChpID09IGdlby0+dmFsdWVzLm5lbHRzKSB7CisgICAgaWYgKHZhciA9PSBOVUxMKSB7CiAgICAgICAgIHZhciA9IG5neF9wYWxsb2MoZ2VvLT5wb29sLCBzaXplb2Yobmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCkpOwogICAgICAgICBpZiAodmFyID09IE5VTEwpIHsKICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICAgICAgfQogCiAgICAgICAgIHZhci0+dGV4dC5sZW4gPSB2YWx1ZVsxXS5sZW47Ci0gICAgICAgIGlmICghKHZhci0+dGV4dC5kYXRhID0gbmd4X3BzdHJkdXAoZ2VvLT5wb29sLCAmdmFsdWVbMV0pKSkgeworICAgICAgICB2YXItPnRleHQuZGF0YSA9IG5neF9wc3RyZHVwKGdlby0+cG9vbCwgJnZhbHVlWzFdKTsKKyAgICAgICAgaWYgKHZhci0+dGV4dC5kYXRhID09IE5VTEwpIHsKICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICAgICAgfQogCiAgICAgICAgIHZhci0+dmFsdWUgPSAobiA9PSBOR1hfRVJST1IpID8gMCA6IG47CiAKLSAgICAgICAgaWYgKCEodiA9IG5neF9hcnJheV9wdXNoKCZnZW8tPnZhbHVlcykpKSB7CisgICAgICAgIHYgPSBuZ3hfYXJyYXlfcHVzaCgmZ2VvLT52YWx1ZXMpOworICAgICAgICBpZiAodiA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9nemlwX2ZpbHRlci5jIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9nemlwX2ZpbHRlcl9tb2R1bGUuYwpzaW1pbGFyaXR5IGluZGV4IDk0JQpyZW5hbWUgZnJvbSBzcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2d6aXBfZmlsdGVyLmMKcmVuYW1lIHRvIHNyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfZ3ppcF9maWx0ZXJfbW9kdWxlLmMKaW5kZXggZWVjNmExMy4uNGE0ZGE3ZiAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9nemlwX2ZpbHRlci5jCisrKyBiL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfZ3ppcF9maWx0ZXJfbW9kdWxlLmMKQEAgLTMzMSw5ICszMzEsMTQgQEAKICAgICAgICAgcmV0dXJuIG5neF9odHRwX25leHRfaGVhZGVyX2ZpbHRlcihyKTsKICAgICB9CiAKKyAgICBjdHggPSBuZ3hfcGNhbGxvYyhyLT5wb29sLCBzaXplb2Yobmd4X2h0dHBfZ3ppcF9jdHhfdCkpOworICAgIGlmIChjdHggPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgIH0KIAotICAgIG5neF9odHRwX2NyZWF0ZV9jdHgociwgY3R4LCBuZ3hfaHR0cF9nemlwX2ZpbHRlcl9tb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yobmd4X2h0dHBfZ3ppcF9jdHhfdCksIE5HWF9FUlJPUik7CisgICAgbmd4X2h0dHBfc2V0X2N0eChyLCBjdHgsIG5neF9odHRwX2d6aXBfZmlsdGVyX21vZHVsZSk7CisKKwogICAgIGN0eC0+cmVxdWVzdCA9IHI7CiAKICAgICByLT5oZWFkZXJzX291dC5jb250ZW50X2VuY29kaW5nID0gbmd4X2xpc3RfcHVzaCgmci0+aGVhZGVyc19vdXQuaGVhZGVycyk7CkBAIC00NDUsNyArNDUwLDcgQEAKICAgICBuZ3hfaW50X3QgICAgICAgICAgICAgIGxhc3Q7CiAgICAgc3RydWN0IGd6dHJhaWxlciAgICAgICp0cmFpbGVyOwogICAgIG5neF9idWZfdCAgICAgICAgICAgICAqYjsKLSAgICBuZ3hfY2hhaW5fdCAgICAgICAgICAgKmNsOworICAgIG5neF9jaGFpbl90ICAgICAgICAgICAqY2wsIG91dDsKICAgICBuZ3hfaHR0cF9nemlwX2N0eF90ICAgKmN0eDsKICAgICBuZ3hfaHR0cF9nemlwX2NvbmZfdCAgKmNvbmY7CiAKQEAgLTQ4NSw3ICs0OTAsOCBAQAogCiAgICAgICAgIGN0eC0+YWxsb2NhdGVkID0gODE5MiArICgxIDw8ICh3Yml0cyArIDIpKSArICgxIDw8IChtZW1sZXZlbCArIDkpKTsKIAotICAgICAgICBpZiAoIShjdHgtPnByZWFsbG9jYXRlZCA9IG5neF9wYWxsb2Moci0+cG9vbCwgY3R4LT5hbGxvY2F0ZWQpKSkgeworICAgICAgICBjdHgtPnByZWFsbG9jYXRlZCA9IG5neF9wYWxsb2Moci0+cG9vbCwgY3R4LT5hbGxvY2F0ZWQpOworICAgICAgICBpZiAoY3R4LT5wcmVhbGxvY2F0ZWQgPT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICAgICAgfQogCkBAIC01MDUsNyArNTExLDggQEAKICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoIShiID0gbmd4X3BjYWxsb2Moci0+cG9vbCwgc2l6ZW9mKG5neF9idWZfdCkpKSkgeworICAgICAgICBiID0gbmd4X3BjYWxsb2Moci0+cG9vbCwgc2l6ZW9mKG5neF9idWZfdCkpOworICAgICAgICBpZiAoYiA9PSBOVUxMKSB7CiAgICAgICAgICAgICBuZ3hfaHR0cF9nemlwX2Vycm9yKGN0eCk7CiAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgICAgICB9CkBAIC01MTQsMTIgKzUyMSw4IEBACiAgICAgICAgIGItPnBvcyA9IGd6aGVhZGVyOwogICAgICAgICBiLT5sYXN0ID0gYi0+cG9zICsgMTA7CiAKLSAgICAgICAgaWYgKCEoY2wgPSBuZ3hfYWxsb2NfY2hhaW5fbGluayhyLT5wb29sKSkpIHsKLSAgICAgICAgICAgIG5neF9odHRwX2d6aXBfZXJyb3IoY3R4KTsKLSAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7Ci0gICAgICAgIH0KLSAgICAgICAgY2wtPmJ1ZiA9IGI7Ci0gICAgICAgIGNsLT5uZXh0ID0gTlVMTDsKKyAgICAgICAgb3V0LmJ1ZiA9IGI7CisgICAgICAgIG91dC5uZXh0ID0gTlVMTDsKIAogICAgICAgICAvKgogICAgICAgICAgKiBXZSBwYXNzIHRoZSBnemhlYWRlciB0byB0aGUgbmV4dCBmaWx0ZXIgbm93IHRvIGF2b2lkIGl0cyBsaW5raW5nCkBAIC01MjgsNyArNTMxLDcgQEAKICAgICAgICAgICogdG8gdGhlIGN0eC0+YnVzeSBjaGFpbiB3b3VsZCBiZSBmbHVzaGVkIGJ5IG5neF9odHRwX3dyaXRlX2ZpbHRlcigpLgogICAgICAgICAgKi8KIAotICAgICAgICBpZiAobmd4X2h0dHBfbmV4dF9ib2R5X2ZpbHRlcihyLCBjbCkgPT0gTkdYX0VSUk9SKSB7CisgICAgICAgIGlmIChuZ3hfaHR0cF9uZXh0X2JvZHlfZmlsdGVyKHIsICZvdXQpID09IE5HWF9FUlJPUikgewogICAgICAgICAgICAgbmd4X2h0dHBfZ3ppcF9lcnJvcihjdHgpOwogICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICAgICAgfQpAQCAtNjczLDEwICs2NzYsMTIgQEAKIAogICAgICAgICAgICAgICAgIC8qIHpsaWIgd2FudHMgdG8gb3V0cHV0IHNvbWUgbW9yZSBnemlwcGVkIGRhdGEgKi8KIAotICAgICAgICAgICAgICAgIGlmICghKGNsID0gbmd4X2FsbG9jX2NoYWluX2xpbmsoci0+cG9vbCkpKSB7CisgICAgICAgICAgICAgICAgY2wgPSBuZ3hfYWxsb2NfY2hhaW5fbGluayhyLT5wb29sKTsKKyAgICAgICAgICAgICAgICBpZiAoY2wgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9nemlwX2Vycm9yKGN0eCk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgY2wtPmJ1ZiA9IGN0eC0+b3V0X2J1ZjsKICAgICAgICAgICAgICAgICBjbC0+bmV4dCA9IE5VTEw7CiAgICAgICAgICAgICAgICAgKmN0eC0+bGFzdF9vdXQgPSBjbDsKQEAgLTY5NCwxMCArNjk5LDEyIEBACiAgICAgICAgICAgICAgICAgY3R4LT5vdXRfYnVmLT5mbHVzaCA9IDA7CiAgICAgICAgICAgICAgICAgY3R4LT5mbHVzaCA9IFpfTk9fRkxVU0g7CiAKLSAgICAgICAgICAgICAgICBpZiAoIShjbCA9IG5neF9hbGxvY19jaGFpbl9saW5rKHItPnBvb2wpKSkgeworICAgICAgICAgICAgICAgIGNsID0gbmd4X2FsbG9jX2NoYWluX2xpbmsoci0+cG9vbCk7CisgICAgICAgICAgICAgICAgaWYgKGNsID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfZ3ppcF9lcnJvcihjdHgpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIGNsLT5idWYgPSBjdHgtPm91dF9idWY7CiAgICAgICAgICAgICAgICAgY2wtPm5leHQgPSBOVUxMOwogICAgICAgICAgICAgICAgICpjdHgtPmxhc3Rfb3V0ID0gY2w7CkBAIC03MjIsMTAgKzcyOSwxMiBAQAogCiAgICAgICAgICAgICAgICAgbmd4X3BmcmVlKHItPnBvb2wsIGN0eC0+cHJlYWxsb2NhdGVkKTsKIAotICAgICAgICAgICAgICAgIGlmICghKGNsID0gbmd4X2FsbG9jX2NoYWluX2xpbmsoci0+cG9vbCkpKSB7CisgICAgICAgICAgICAgICAgY2wgPSBuZ3hfYWxsb2NfY2hhaW5fbGluayhyLT5wb29sKTsKKyAgICAgICAgICAgICAgICBpZiAoY2wgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9nemlwX2Vycm9yKGN0eCk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgY2wtPmJ1ZiA9IGN0eC0+b3V0X2J1ZjsKICAgICAgICAgICAgICAgICBjbC0+bmV4dCA9IE5VTEw7CiAgICAgICAgICAgICAgICAgKmN0eC0+bGFzdF9vdXQgPSBjbDsKQEAgLTczNywxNyArNzQ2LDIwIEBACiAgICAgICAgICAgICAgICAgICAgIGN0eC0+b3V0X2J1Zi0+bGFzdF9idWYgPSAxOwogCiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCEoYiA9IG5neF9jcmVhdGVfdGVtcF9idWYoci0+cG9vbCwgOCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGIgPSBuZ3hfY3JlYXRlX3RlbXBfYnVmKHItPnBvb2wsIDgpOworICAgICAgICAgICAgICAgICAgICBpZiAoYiA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9nemlwX2Vycm9yKGN0eCk7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgYi0+bGFzdF9idWYgPSAxOwogCi0gICAgICAgICAgICAgICAgICAgIGlmICghKGNsID0gbmd4X2FsbG9jX2NoYWluX2xpbmsoci0+cG9vbCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGNsID0gbmd4X2FsbG9jX2NoYWluX2xpbmsoci0+cG9vbCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9nemlwX2Vycm9yKGN0eCk7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgICAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICAgICAgY2wtPmJ1ZiA9IGI7CiAgICAgICAgICAgICAgICAgICAgIGNsLT5uZXh0ID0gTlVMTDsKICAgICAgICAgICAgICAgICAgICAgKmN0eC0+bGFzdF9vdXQgPSBjbDsKQEAgLTc4MiwxMCArNzk0LDEzIEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChjb25mLT5ub19idWZmZXIgJiYgY3R4LT5pbiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCEoY2wgPSBuZ3hfYWxsb2NfY2hhaW5fbGluayhyLT5wb29sKSkpIHsKKworICAgICAgICAgICAgICAgIGNsID0gbmd4X2FsbG9jX2NoYWluX2xpbmsoci0+cG9vbCk7CisgICAgICAgICAgICAgICAgaWYgKGNsID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfZ3ppcF9lcnJvcihjdHgpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIGNsLT5idWYgPSBjdHgtPm91dF9idWY7CiAgICAgICAgICAgICAgICAgY2wtPm5leHQgPSBOVUxMOwogICAgICAgICAgICAgICAgICpjdHgtPmxhc3Rfb3V0ID0gY2w7CkBAIC04MTYsNyArODMxLDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIG5neF9jaGFpbl91cGRhdGVfY2hhaW5zKCZjdHgtPmZyZWUsICZjdHgtPmJ1c3ksICZjdHgtPm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ3hfYnVmX3RhZ190KSAmbmd4X2h0dHBfZ3ppcF9maWx0ZXJfbW9kdWxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5neF9idWZfdGFnX3QpICZuZ3hfaHR0cF9nemlwX2ZpbHRlcl9tb2R1bGUpOwogICAgICAgICBjdHgtPmxhc3Rfb3V0ID0gJmN0eC0+b3V0OwogCiAgICAgICAgIGlmIChjdHgtPmRvbmUpIHsKQEAgLTk2OSw3ICs5ODQsOCBAQAogewogICAgIG5neF9odHRwX2d6aXBfY29uZl90ICAqY29uZjsKIAotICAgIGlmICghKGNvbmYgPSBuZ3hfcGNhbGxvYyhjZi0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX2d6aXBfY29uZl90KSkpKSB7CisgICAgY29uZiA9IG5neF9wY2FsbG9jKGNmLT5wb29sLCBzaXplb2Yobmd4X2h0dHBfZ3ppcF9jb25mX3QpKTsKKyAgICBpZiAoY29uZiA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICB9CiAKQEAgLTEwMjcsNyArMTA0Myw4IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoISh0eXBlID0gbmd4X2FycmF5X3B1c2goY29uZi0+dHlwZXMpKSkgeworICAgICAgICAgICAgdHlwZSA9IG5neF9hcnJheV9wdXNoKGNvbmYtPnR5cGVzKTsKKyAgICAgICAgICAgIGlmICh0eXBlID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgICAgICAgICB9CiAKQEAgLTEwNTUsMTIgKzEwNzIsMTMgQEAKIAogICAgIGlmIChnY2YtPnR5cGVzID09IE5VTEwpIHsKICAgICAgICAgZ2NmLT50eXBlcyA9IG5neF9hcnJheV9jcmVhdGUoY2YtPnBvb2wsIDQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yobmd4X2h0dHBfZ3ppcF90eXBlX3QpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5neF9odHRwX2d6aXBfdHlwZV90KSk7CiAgICAgICAgIGlmIChnY2YtPnR5cGVzID09IE5VTEwpIHsKICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICAgICAgfQogCi0gICAgICAgIGlmICghKHR5cGUgPSBuZ3hfYXJyYXlfcHVzaChnY2YtPnR5cGVzKSkpIHsKKyAgICAgICAgdHlwZSA9IG5neF9hcnJheV9wdXNoKGdjZi0+dHlwZXMpOworICAgICAgICBpZiAodHlwZSA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgICAgIH0KIApAQCAtMTA3NywxMyArMTA5NSwxNSBAQAogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoISh0eXBlID0gbmd4X2FycmF5X3B1c2goZ2NmLT50eXBlcykpKSB7CisgICAgICAgIHR5cGUgPSBuZ3hfYXJyYXlfcHVzaChnY2YtPnR5cGVzKTsKKyAgICAgICAgaWYgKHR5cGUgPT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgICAgICB9CiAKICAgICAgICAgdHlwZS0+bmFtZS5sZW4gPSB2YWx1ZVtpXS5sZW47CiAKLSAgICAgICAgaWYgKCEodHlwZS0+bmFtZS5kYXRhID0gbmd4X3BhbGxvYyhjZi0+cG9vbCwgdHlwZS0+bmFtZS5sZW4gKyAxKSkpIHsKKyAgICAgICAgdHlwZS0+bmFtZS5kYXRhID0gbmd4X3BhbGxvYyhjZi0+cG9vbCwgdHlwZS0+bmFtZS5sZW4gKyAxKTsKKyAgICAgICAgaWYgKHR5cGUtPm5hbWUuZGF0YSA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9oZWFkZXJzX2ZpbHRlci5jIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9oZWFkZXJzX2ZpbHRlcl9tb2R1bGUuYwpzaW1pbGFyaXR5IGluZGV4IDg4JQpyZW5hbWUgZnJvbSBzcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2hlYWRlcnNfZmlsdGVyLmMKcmVuYW1lIHRvIHNyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfaGVhZGVyc19maWx0ZXJfbW9kdWxlLmMKaW5kZXggMzliMzU4My4uNzkzY2VmZCAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9oZWFkZXJzX2ZpbHRlci5jCisrKyBiL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfaGVhZGVyc19maWx0ZXJfbW9kdWxlLmMKQEAgLTIzLDcgKzIzLDggQEAKIHN0YXRpYyB2b2lkICpuZ3hfaHR0cF9oZWFkZXJzX2NyZWF0ZV9jb25mKG5neF9jb25mX3QgKmNmKTsKIHN0YXRpYyBjaGFyICpuZ3hfaHR0cF9oZWFkZXJzX21lcmdlX2NvbmYobmd4X2NvbmZfdCAqY2YsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBhcmVudCwgdm9pZCAqY2hpbGQpOwotY2hhciAqbmd4X2h0dHBfaGVhZGVyc19leHBpcmVzKG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpjbWQsIHZvaWQgKmNvbmYpOworc3RhdGljIGNoYXIgKm5neF9odHRwX2hlYWRlcnNfZXhwaXJlcyhuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqY21kLAorICAgIHZvaWQgKmNvbmYpOwogCiAKIHN0YXRpYyBuZ3hfY29tbWFuZF90ICBuZ3hfaHR0cF9oZWFkZXJzX2ZpbHRlcl9jb21tYW5kc1tdID0gewpAQCAtNjYsNyArNjcsOCBAQAogc3RhdGljIG5neF9odHRwX291dHB1dF9oZWFkZXJfZmlsdGVyX3B0ICBuZ3hfaHR0cF9uZXh0X2hlYWRlcl9maWx0ZXI7CiAKIAotc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9oZWFkZXJzX2ZpbHRlcihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpCitzdGF0aWMgbmd4X2ludF90CituZ3hfaHR0cF9oZWFkZXJzX2ZpbHRlcihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpCiB7CiAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICBsZW47CiAgICAgbmd4X3RhYmxlX2VsdF90ICAgICAgICAgICpleHBpcmVzLCAqY2M7CkBAIC04MCwxMyArODIsMTUgQEAKIAogICAgIGlmIChjb25mLT5leHBpcmVzICE9IE5HWF9IVFRQX0VYUElSRVNfT0ZGKSB7CiAKLSAgICAgICAgaWYgKCEoZXhwaXJlcyA9IG5neF9saXN0X3B1c2goJnItPmhlYWRlcnNfb3V0LmhlYWRlcnMpKSkgeworICAgICAgICBleHBpcmVzID0gbmd4X2xpc3RfcHVzaCgmci0+aGVhZGVyc19vdXQuaGVhZGVycyk7CisgICAgICAgIGlmIChleHBpcmVzID09IE5VTEwpIHsKICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgICAgIH0KIAogICAgICAgICByLT5oZWFkZXJzX291dC5leHBpcmVzID0gZXhwaXJlczsKIAotICAgICAgICBpZiAoIShjYyA9IG5neF9saXN0X3B1c2goJnItPmhlYWRlcnNfb3V0LmhlYWRlcnMpKSkgeworICAgICAgICBjYyA9IG5neF9saXN0X3B1c2goJnItPmhlYWRlcnNfb3V0LmhlYWRlcnMpOworICAgICAgICBpZiAoY2MgPT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICAgICAgfQogCkBAIC0xNDcsNyArMTUxLDggQEAKIH0KIAogCi1zdGF0aWMgbmd4X2ludF90IG5neF9odHRwX2hlYWRlcnNfZmlsdGVyX2luaXQobmd4X2N5Y2xlX3QgKmN5Y2xlKQorc3RhdGljIG5neF9pbnRfdAorbmd4X2h0dHBfaGVhZGVyc19maWx0ZXJfaW5pdChuZ3hfY3ljbGVfdCAqY3ljbGUpCiB7CiAgICAgbmd4X2h0dHBfbmV4dF9oZWFkZXJfZmlsdGVyID0gbmd4X2h0dHBfdG9wX2hlYWRlcl9maWx0ZXI7CiAgICAgbmd4X2h0dHBfdG9wX2hlYWRlcl9maWx0ZXIgPSBuZ3hfaHR0cF9oZWFkZXJzX2ZpbHRlcjsKQEAgLTE1NiwxMSArMTYxLDEzIEBACiB9CiAKIAotc3RhdGljIHZvaWQgKm5neF9odHRwX2hlYWRlcnNfY3JlYXRlX2NvbmYobmd4X2NvbmZfdCAqY2YpCitzdGF0aWMgdm9pZCAqCituZ3hfaHR0cF9oZWFkZXJzX2NyZWF0ZV9jb25mKG5neF9jb25mX3QgKmNmKQogeyAgIAogICAgIG5neF9odHRwX2hlYWRlcnNfY29uZl90ICAqY29uZjsKIAotICAgIGlmICghKGNvbmYgPSBuZ3hfcGFsbG9jKGNmLT5wb29sLCBzaXplb2Yobmd4X2h0dHBfaGVhZGVyc19jb25mX3QpKSkpIHsKKyAgICBjb25mID0gbmd4X3BhbGxvYyhjZi0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX2hlYWRlcnNfY29uZl90KSk7CisgICAgaWYgKGNvbmYgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgfQogCkBAIC0xNzAsOCArMTc3LDggQEAKIH0KIAogCi1zdGF0aWMgY2hhciAqbmd4X2h0dHBfaGVhZGVyc19tZXJnZV9jb25mKG5neF9jb25mX3QgKmNmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwYXJlbnQsIHZvaWQgKmNoaWxkKQorc3RhdGljIGNoYXIgKgorbmd4X2h0dHBfaGVhZGVyc19tZXJnZV9jb25mKG5neF9jb25mX3QgKmNmLCB2b2lkICpwYXJlbnQsIHZvaWQgKmNoaWxkKQogewogICAgIG5neF9odHRwX2hlYWRlcnNfY29uZl90ICpwcmV2ID0gcGFyZW50OwogICAgIG5neF9odHRwX2hlYWRlcnNfY29uZl90ICpjb25mID0gY2hpbGQ7CkBAIC0xODUsNyArMTkyLDggQEAKIH0KIAogCi1jaGFyICpuZ3hfaHR0cF9oZWFkZXJzX2V4cGlyZXMobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwgdm9pZCAqY29uZikKK3N0YXRpYyBjaGFyICoKK25neF9odHRwX2hlYWRlcnNfZXhwaXJlcyhuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqY21kLCB2b2lkICpjb25mKQogewogICAgIG5neF9odHRwX2hlYWRlcnNfY29uZl90ICpoY2YgPSBjb25mOwogCkBAIC0yMjMsNiArMjMxLDcgQEAKICAgICB9CiAKICAgICBoY2YtPmV4cGlyZXMgPSBuZ3hfcGFyc2VfdGltZSgmdmFsdWVbMV0sIDEpOworCiAgICAgaWYgKGhjZi0+ZXhwaXJlcyA9PSBOR1hfRVJST1IpIHsKICAgICAgICAgcmV0dXJuICJpbnZhbGlkIHZhbHVlIjsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2luZGV4X2hhbmRsZXIuYyBiL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfaW5kZXhfbW9kdWxlLmMKc2ltaWxhcml0eSBpbmRleCA5MiUKcmVuYW1lIGZyb20gc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9pbmRleF9oYW5kbGVyLmMKcmVuYW1lIHRvIHNyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfaW5kZXhfbW9kdWxlLmMKaW5kZXggNGUzNzU1Ny4uMzczYzMxNSAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9pbmRleF9oYW5kbGVyLmMKKysrIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9pbmRleF9tb2R1bGUuYwpAQCAtOTMsMTAgKzkzLDEwIEBACiAvKgogICogVHJ5IHRvIG9wZW4gdGhlIGZpcnN0IGluZGV4IGZpbGUgYmVmb3JlIHRoZSB0ZXN0IG9mIHRoZSBkaXJlY3RvcnkgZXhpc3RlbmNlCiAgKiBiZWNhdXNlIHRoZSB2YWxpZCByZXF1ZXN0cyBzaG91bGQgYmUgbWFueSBtb3JlIHRoYW4gaW52YWxpZCBvbmVzLgotICogSWYgb3BlbigpIGZhaWxlZCB0aGVuIHN0YXQoKSBzaG91bGQgYmUgbW9yZSBxdWlja2x5IGJlY2F1c2Ugc29tZSBkYXRhCisgKiBJZiBvcGVuKCkgd291bGQgZmFpbCwgdGhlbiBzdGF0KCkgc2hvdWxkIGJlIG1vcmUgcXVpY2tseSBiZWNhdXNlIHNvbWUgZGF0YQogICogaXMgYWxyZWFkeSBjYWNoZWQgaW4gdGhlIGtlcm5lbC4KLSAqIEJlc2lkZXMgV2luMzIgaGFzIEVSUk9SX1BBVEhfTk9UX0ZPVU5EIChOR1hfRU5PVERJUikuCi0gKiBVbml4IGhhcyBFTk9URElSIGVycm9yLCBhbHRob3VnaCBpdCBsZXNzIGhlbHBmdWxsIC0gaXQgc2hvd3Mgb25seQorICogQmVzaWRlcywgV2luMzIgaGFzIEVSUk9SX1BBVEhfTk9UX0ZPVU5EIChOR1hfRU5PVERJUikuCisgKiBVbml4IGhhcyBFTk9URElSIGVycm9yLCBhbHRob3VnaCBpdCBsZXNzIGhlbHBmdWxsIC0gaXQgcG9pbnRzIG9ubHkKICAqIHRoYXQgcGF0aCBjb250YWlucyB0aGUgdXN1YWwgZmlsZSBpbiBwbGFjZSBvZiB0aGUgZGlyZWN0b3J5LgogICovCiAKQEAgLTEzNyw5ICsxMzcsMTMgQEAKIAogICAgIGN0eCA9IG5neF9odHRwX2dldF9tb2R1bGVfY3R4KHIsIG5neF9odHRwX2luZGV4X21vZHVsZSk7CiAgICAgaWYgKGN0eCA9PSBOVUxMKSB7Ci0gICAgICAgIG5neF9odHRwX2NyZWF0ZV9jdHgociwgY3R4LCBuZ3hfaHR0cF9pbmRleF9tb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5neF9odHRwX2luZGV4X2N0eF90KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IpOworCisgICAgICAgIGN0eCA9IG5neF9wY2FsbG9jKHItPnBvb2wsIHNpemVvZihuZ3hfaHR0cF9pbmRleF9jdHhfdCkpOworICAgICAgICBpZiAoY3R4ID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBuZ3hfaHR0cF9zZXRfY3R4KHIsIGN0eCwgbmd4X2h0dHBfaW5kZXhfbW9kdWxlKTsKIAogI2lmIChOR1hfSFRUUF9DQUNIRSkKIApAQCAtNDE3LDcgKzQyMSw3IEBACiAKICAgICBjbWNmID0gbmd4X2h0dHBfY3ljbGVfZ2V0X21vZHVsZV9tYWluX2NvbmYoY3ljbGUsIG5neF9odHRwX2NvcmVfbW9kdWxlKTsKIAotICAgIGggPSBuZ3hfcHVzaF9hcnJheSgmY21jZi0+cGhhc2VzW05HWF9IVFRQX0NPTlRFTlRfUEhBU0VdLmhhbmRsZXJzKTsKKyAgICBoID0gbmd4X2FycmF5X3B1c2goJmNtY2YtPnBoYXNlc1tOR1hfSFRUUF9DT05URU5UX1BIQVNFXS5oYW5kbGVycyk7CiAgICAgaWYgKGggPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgIH0KQEAgLTQzMiwxMSArNDM2LDE3IEBACiB7CiAgICAgbmd4X2h0dHBfaW5kZXhfbG9jX2NvbmZfdCAgKmNvbmY7CiAKLSAgICBuZ3hfdGVzdF9udWxsKGNvbmYsIG5neF9wYWxsb2MoY2YtPnBvb2wsIHNpemVvZihuZ3hfaHR0cF9pbmRleF9sb2NfY29uZl90KSksCi0gICAgICAgICAgICAgICAgICBOR1hfQ09ORl9FUlJPUik7CisgICAgY29uZiA9IG5neF9wYWxsb2MoY2YtPnBvb2wsIHNpemVvZihuZ3hfaHR0cF9pbmRleF9sb2NfY29uZl90KSk7CisgICAgaWYgKGNvbmYgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgfQogCi0gICAgbmd4X2luaXRfYXJyYXkoY29uZi0+aW5kaWNlcywgY2YtPnBvb2wsIDMsIHNpemVvZihuZ3hfc3RyX3QpLAotICAgICAgICAgICAgICAgICAgIE5HWF9DT05GX0VSUk9SKTsKKyAgICBpZiAobmd4X2FycmF5X2luaXQoJmNvbmYtPmluZGljZXMsIGNmLT5wb29sLCAyLCBzaXplb2Yobmd4X3N0cl90KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IE5HWF9FUlJPUikKKyAgICB7CisgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICB9CisKICAgICBjb25mLT5tYXhfaW5kZXhfbGVuID0gMDsKIAogICAgIGNvbmYtPmluZGV4X2NhY2hlID0gTlVMTDsKQEAgLTQ2MSw3ICs0NzEsMTEgQEAKICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9PSzsKICAgICAgICAgfQogCi0gICAgICAgIG5neF90ZXN0X251bGwoaW5kZXgsIG5neF9wdXNoX2FycmF5KCZjb25mLT5pbmRpY2VzKSwgTkdYX0NPTkZfRVJST1IpOworICAgICAgICBpbmRleCA9IG5neF9hcnJheV9wdXNoKCZjb25mLT5pbmRpY2VzKTsKKyAgICAgICAgaWYgKGluZGV4ID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICAgICAgfQorCiAgICAgICAgIGluZGV4LT5sZW4gPSBzaXplb2YoTkdYX0hUVFBfREVGQVVMVF9JTkRFWCkgLSAxOwogICAgICAgICBpbmRleC0+ZGF0YSA9ICh1X2NoYXIgKikgTkdYX0hUVFBfREVGQVVMVF9JTkRFWDsKICAgICAgICAgY29uZi0+bWF4X2luZGV4X2xlbiA9IHNpemVvZihOR1hfSFRUUF9ERUZBVUxUX0lOREVYKTsKQEAgLTQ3NSw4ICs0ODksMTEgQEAKIAogICAgICAgICBwcmV2X2luZGV4ID0gcHJldi0+aW5kaWNlcy5lbHRzOwogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcHJldi0+aW5kaWNlcy5uZWx0czsgaSsrKSB7Ci0gICAgICAgICAgICBuZ3hfdGVzdF9udWxsKGluZGV4LCBuZ3hfcHVzaF9hcnJheSgmY29uZi0+aW5kaWNlcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE5HWF9DT05GX0VSUk9SKTsKKyAgICAgICAgICAgIGluZGV4ID0gbmd4X2FycmF5X3B1c2goJmNvbmYtPmluZGljZXMpOworICAgICAgICAgICAgaWYgKGluZGV4ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGluZGV4LT5sZW4gPSBwcmV2X2luZGV4W2ldLmxlbjsKICAgICAgICAgICAgIGluZGV4LT5kYXRhID0gcHJldl9pbmRleFtpXS5kYXRhOwogICAgICAgICB9CkBAIC01MjQsNyArNTQxLDExIEBACiAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgICAgIH0KIAotICAgICAgICBuZ3hfdGVzdF9udWxsKGluZGV4LCBuZ3hfcHVzaF9hcnJheSgmaWxjZi0+aW5kaWNlcyksIE5HWF9DT05GX0VSUk9SKTsKKyAgICAgICAgaW5kZXggPSBuZ3hfYXJyYXlfcHVzaCgmaWxjZi0+aW5kaWNlcyk7CisgICAgICAgIGlmIChpbmRleCA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgICAgIH0KKwogICAgICAgICBpbmRleC0+bGVuID0gdmFsdWVbaV0ubGVuOwogICAgICAgICBpbmRleC0+ZGF0YSA9IHZhbHVlW2ldLmRhdGE7CiAKZGlmZiAtLWdpdCBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfbm90X21vZGlmaWVkX2ZpbHRlci5jIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9ub3RfbW9kaWZpZWRfZmlsdGVyX21vZHVsZS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX25vdF9tb2RpZmllZF9maWx0ZXIuYwpyZW5hbWUgdG8gc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9ub3RfbW9kaWZpZWRfZmlsdGVyX21vZHVsZS5jCmRpZmYgLS1naXQgYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3JhbmdlX2ZpbHRlci5jIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9yYW5nZV9maWx0ZXJfbW9kdWxlLmMKc2ltaWxhcml0eSBpbmRleCA5MSUKcmVuYW1lIGZyb20gc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9yYW5nZV9maWx0ZXIuYwpyZW5hbWUgdG8gc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9yYW5nZV9maWx0ZXJfbW9kdWxlLmMKaW5kZXggMDNmMjc0NS4uODQzODFjOSAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9yYW5nZV9maWx0ZXIuYworKysgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3JhbmdlX2ZpbHRlcl9tb2R1bGUuYwpAQCAtMTg2LDcgKzE4Niw4IEBACiAgICAgICAgICAgICB3aGlsZSAoKnAgPT0gJyAnKSB7IHArKzsgfQogCiAgICAgICAgICAgICBpZiAoKnAgPT0gJywnIHx8ICpwID09ICdcMCcpIHsKLSAgICAgICAgICAgICAgICBpZiAoIShyYW5nZSA9IG5neF9hcnJheV9wdXNoKCZyLT5oZWFkZXJzX291dC5yYW5nZXMpKSkgeworICAgICAgICAgICAgICAgIHJhbmdlID0gbmd4X2FycmF5X3B1c2goJnItPmhlYWRlcnNfb3V0LnJhbmdlcyk7CisgICAgICAgICAgICAgICAgaWYgKHJhbmdlID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTIzMSw3ICsyMzIsOCBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoIShyYW5nZSA9IG5neF9hcnJheV9wdXNoKCZyLT5oZWFkZXJzX291dC5yYW5nZXMpKSkgeworICAgICAgICByYW5nZSA9IG5neF9hcnJheV9wdXNoKCZyLT5oZWFkZXJzX291dC5yYW5nZXMpOworICAgICAgICBpZiAocmFuZ2UgPT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICAgICAgfQogCkBAIC0yNjAsNyArMjYyLDggQEAKICAgICAgICAgci0+aGVhZGVyc19vdXQuc3RhdHVzID0gcmM7CiAgICAgICAgIHItPmhlYWRlcnNfb3V0LnJhbmdlcy5uZWx0cyA9IDA7CiAKLSAgICAgICAgaWYgKCEoY29udGVudF9yYW5nZSA9IG5neF9saXN0X3B1c2goJnItPmhlYWRlcnNfb3V0LmhlYWRlcnMpKSkgeworICAgICAgICBjb250ZW50X3JhbmdlID0gbmd4X2xpc3RfcHVzaCgmci0+aGVhZGVyc19vdXQuaGVhZGVycyk7CisgICAgICAgIGlmIChjb250ZW50X3JhbmdlID09IE5VTEwpIHsKICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgICAgIH0KIApAQCAtMjY5LDkgKzI3Miw4IEBACiAgICAgICAgIGNvbnRlbnRfcmFuZ2UtPmtleS5sZW4gPSBzaXplb2YoIkNvbnRlbnQtUmFuZ2UiKSAtIDE7CiAgICAgICAgIGNvbnRlbnRfcmFuZ2UtPmtleS5kYXRhID0gKHVfY2hhciAqKSAiQ29udGVudC1SYW5nZSI7CiAKLSAgICAgICAgY29udGVudF9yYW5nZS0+dmFsdWUuZGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgbmd4X3BhbGxvYyhyLT5wb29sLCBzaXplb2YoImJ5dGVzICovIikgLSAxICsgTkdYX09GRl9UX0xFTik7Ci0KKyAgICAgICAgY29udGVudF9yYW5nZS0+dmFsdWUuZGF0YSA9IG5neF9wYWxsb2Moci0+cG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigiYnl0ZXMgKi8iKSAtIDEgKyBOR1hfT0ZGX1RfTEVOKTsKICAgICAgICAgaWYgKGNvbnRlbnRfcmFuZ2UtPnZhbHVlLmRhdGEgPT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICAgICAgfQpAQCAtMjk0LDcgKzI5Niw4IEBACiAKICAgICBpZiAoci0+aGVhZGVyc19vdXQucmFuZ2VzLm5lbHRzID09IDEpIHsKIAotICAgICAgICBpZiAoIShjb250ZW50X3JhbmdlID0gbmd4X2xpc3RfcHVzaCgmci0+aGVhZGVyc19vdXQuaGVhZGVycykpKSB7CisgICAgICAgIGNvbnRlbnRfcmFuZ2UgPSBuZ3hfbGlzdF9wdXNoKCZyLT5oZWFkZXJzX291dC5oZWFkZXJzKTsKKyAgICAgICAgaWYgKGNvbnRlbnRfcmFuZ2UgPT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICAgICAgfQogCkBAIC0zMjUsOCArMzI4LDEyIEBACiAKICAgICAvKiBUT0RPOiB3aGF0IGlmIG5vIGNvbnRlbnRfdHlwZSA/PyAqLwogCi0gICAgbmd4X2h0dHBfY3JlYXRlX2N0eChyLCBjdHgsIG5neF9odHRwX3JhbmdlX2JvZHlfZmlsdGVyX21vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfaHR0cF9yYW5nZV9maWx0ZXJfY3R4X3QpLCBOR1hfRVJST1IpOworICAgIGN0eCA9IG5neF9wY2FsbG9jKHItPnBvb2wsIHNpemVvZihuZ3hfaHR0cF9yYW5nZV9maWx0ZXJfY3R4X3QpKTsKKyAgICBpZiAoY3R4ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICB9CisgICAgCisgICAgbmd4X2h0dHBfc2V0X2N0eChyLCBjdHgsIG5neF9odHRwX3JhbmdlX2JvZHlfZmlsdGVyX21vZHVsZSk7CiAKIAogICAgIGxlbiA9IHNpemVvZihDUkxGICItLSIpIC0gMSArIE5HWF9BVE9NSUNfVF9MRU4KQEAgLTMzOCw3ICszNDUsOCBAQAogICAgICAgICBsZW4gKz0gc2l6ZW9mKCI7IGNoYXJzZXQ9IikgLSAxICsgci0+aGVhZGVyc19vdXQuY2hhcnNldC5sZW47CiAgICAgfQogCi0gICAgaWYgKCEoY3R4LT5ib3VuZGFyeV9oZWFkZXIuZGF0YSA9IG5neF9wYWxsb2Moci0+cG9vbCwgbGVuKSkpIHsKKyAgICBjdHgtPmJvdW5kYXJ5X2hlYWRlci5kYXRhID0gbmd4X3BhbGxvYyhyLT5wb29sLCBsZW4pOworICAgIGlmIChjdHgtPmJvdW5kYXJ5X2hlYWRlci5kYXRhID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICB9CiAKQEAgLTQ2Niw3ICs0NzQsOCBAQAogICAgICAgICAgICAgICogIkNvbnRlbnQtUmFuZ2U6IGJ5dGVzICIKICAgICAgICAgICAgICAqLwogCi0gICAgICAgICAgICBpZiAoIShiID0gbmd4X2NhbGxvY19idWYoci0+cG9vbCkpKSB7CisgICAgICAgICAgICBiID0gbmd4X2NhbGxvY19idWYoci0+cG9vbCk7CisgICAgICAgICAgICBpZiAoYiA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICAgICAgICAgIH0KIApAQCAtNDc0LDcgKzQ4Myw4IEBACiAgICAgICAgICAgICBiLT5wb3MgPSBjdHgtPmJvdW5kYXJ5X2hlYWRlci5kYXRhOwogICAgICAgICAgICAgYi0+bGFzdCA9IGN0eC0+Ym91bmRhcnlfaGVhZGVyLmRhdGEgKyBjdHgtPmJvdW5kYXJ5X2hlYWRlci5sZW47CiAKLSAgICAgICAgICAgIGlmICghKGhjbCA9IG5neF9hbGxvY19jaGFpbl9saW5rKHItPnBvb2wpKSkgeworICAgICAgICAgICAgaGNsID0gbmd4X2FsbG9jX2NoYWluX2xpbmsoci0+cG9vbCk7CisgICAgICAgICAgICBpZiAoaGNsID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgICAgICAgICAgfQogCkBAIC00ODMsNyArNDkzLDggQEAKIAogICAgICAgICAgICAgLyogIlNTU1MtRUVFRS9UVFRUIiBDUkxGIENSTEYgKi8KIAotICAgICAgICAgICAgaWYgKCEoYiA9IG5neF9jYWxsb2NfYnVmKHItPnBvb2wpKSkgeworICAgICAgICAgICAgYiA9IG5neF9jYWxsb2NfYnVmKHItPnBvb2wpOworICAgICAgICAgICAgaWYgKGIgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgICAgICAgICB9CiAKQEAgLTQ5MSw3ICs1MDIsOCBAQAogICAgICAgICAgICAgYi0+cG9zID0gcmFuZ2VbaV0uY29udGVudF9yYW5nZS5kYXRhOwogICAgICAgICAgICAgYi0+bGFzdCA9IHJhbmdlW2ldLmNvbnRlbnRfcmFuZ2UuZGF0YSArIHJhbmdlW2ldLmNvbnRlbnRfcmFuZ2UubGVuOwogCi0gICAgICAgICAgICBpZiAoIShyY2wgPSBuZ3hfYWxsb2NfY2hhaW5fbGluayhyLT5wb29sKSkpIHsKKyAgICAgICAgICAgIHJjbCA9IG5neF9hbGxvY19jaGFpbl9saW5rKHItPnBvb2wpOworICAgICAgICAgICAgaWYgKHJjbCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICAgICAgICAgIH0KIApAQCAtNTAwLDcgKzUxMiw4IEBACiAKICAgICAgICAgICAgIC8qIHRoZSByYW5nZSBkYXRhICovCiAKLSAgICAgICAgICAgIGlmICghKGIgPSBuZ3hfY2FsbG9jX2J1ZihyLT5wb29sKSkpIHsKKyAgICAgICAgICAgIGIgPSBuZ3hfY2FsbG9jX2J1ZihyLT5wb29sKTsKKyAgICAgICAgICAgIGlmIChiID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgICAgICAgICAgfQogCkBAIC01MDksNyArNTIyLDggQEAKICAgICAgICAgICAgIGItPmZpbGVfbGFzdCA9IHJhbmdlW2ldLmVuZDsKICAgICAgICAgICAgIGItPmZpbGUgPSBpbi0+YnVmLT5maWxlOwogCi0gICAgICAgICAgICBpZiAoIShkY2wgPSBuZ3hfYWxsb2NfY2hhaW5fbGluayhyLT5wb29sKSkpIHsKKyAgICAgICAgICAgIGRjbCA9IG5neF9hbGxvY19jaGFpbl9saW5rKHItPnBvb2wpOworICAgICAgICAgICAgaWYgKGRjbCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICAgICAgICAgIH0KIApAQCAtNTIzLDcgKzUzNyw4IEBACiAKICAgICAgICAgLyogdGhlIGxhc3QgYm91bmRhcnkgQ1JMRiAiLS0wMTIzNDU2Nzg5LS0iIENSTEYgICovCiAKLSAgICAgICAgaWYgKCEoYiA9IG5neF9jYWxsb2NfYnVmKHItPnBvb2wpKSkgeworICAgICAgICBiID0gbmd4X2NhbGxvY19idWYoci0+cG9vbCk7CisgICAgICAgIGlmIChiID09IE5VTEwpIHsKICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgICAgIH0KIApAQCAtNTQwLDcgKzU1NSw4IEBACiAgICAgICAgICpiLT5sYXN0KysgPSAnLSc7ICpiLT5sYXN0KysgPSAnLSc7CiAgICAgICAgICpiLT5sYXN0KysgPSBDUjsgKmItPmxhc3QrKyA9IExGOwogCi0gICAgICAgIGlmICghKGhjbCA9IG5neF9hbGxvY19jaGFpbl9saW5rKHItPnBvb2wpKSkgeworICAgICAgICBoY2wgPSBuZ3hfYWxsb2NfY2hhaW5fbGluayhyLT5wb29sKTsKKyAgICAgICAgaWYgKGhjbCA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfcmV3cml0ZV9oYW5kbGVyLmMgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3Jld3JpdGVfbW9kdWxlLmMKc2ltaWxhcml0eSBpbmRleCA3MSUKcmVuYW1lIGZyb20gc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9yZXdyaXRlX2hhbmRsZXIuYwpyZW5hbWUgdG8gc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9yZXdyaXRlX21vZHVsZS5jCmluZGV4IDMwODBiZDYuLmQwMzEzYTAgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfcmV3cml0ZV9oYW5kbGVyLmMKKysrIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9yZXdyaXRlX21vZHVsZS5jCkBAIC0yMSw2ICsyMSwxMiBAQAogCiAKIHR5cGVkZWYgc3RydWN0IHsKKyAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgICAgICpuYW1lOworICAgIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgICAgKnZhbHVlOworfSBuZ3hfaHR0cF9yZXdyaXRlX3ZhcmlhYmxlX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgewogICAgIG5neF9hcnJheV90ICAgICAgICAgICAgICAgICAgKmNvZGVzOyAgICAgICAgLyogdWludHB0cl90ICovCiAgICAgbmd4X2FycmF5X3QgICAgICAgICAgICAgICAgICAqcmVmZXJlcnM7ICAgICAvKiBuZ3hfaHR0cF9yZXdyaXRlX3JlZmVyZXJfdCAqLwogCkBAIC00MSw2ICs0Nyw3IEBACiAgICAgdWludHB0cl90ICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwogICAgIHVpbnRwdHJfdCAgICAgICAgICAgICAgICAgICAgIG5leHQ7CiAKKyAgICB1aW50cHRyX3QgICAgICAgICAgICAgICAgICAgICB0ZXN0OjE7CiAgICAgdWludHB0cl90ICAgICAgICAgICAgICAgICAgICAgdXJpOjE7CiAKICAgICAvKiBhZGQgdGhlIHItPmFyZ3MgdG8gdGhlIG5ldyBhcmd1bWVudHMgKi8KQEAgLTkyLDEzICs5OSwyMSBAQAogCiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgbmd4X2h0dHBfcmV3cml0ZV9jb2RlX3B0ICAgICAgY29kZTsKKyAgICB1aW50cHRyX3QgICAgICAgICAgICAgICAgICAgICB2YWx1ZTsKKyAgICB1aW50cHRyX3QgICAgICAgICAgICAgICAgICAgICB0ZXh0X2xlbjsKKyAgICB1aW50cHRyX3QgICAgICAgICAgICAgICAgICAgICB0ZXh0X2RhdGE7Cit9IG5neF9odHRwX3Jld3JpdGVfdmFsdWVfY29kZV90OworCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBuZ3hfaHR0cF9yZXdyaXRlX2NvZGVfcHQgICAgICBjb2RlOwogICAgIHVpbnRwdHJfdCAgICAgICAgICAgICAgICAgICAgIGluZGV4OwogfSBuZ3hfaHR0cF9yZXdyaXRlX3Zhcl9jb2RlX3Q7CiAKIAogc3RydWN0IG5neF9odHRwX3Jld3JpdGVfZW5naW5lX3MgewogICAgIHVfY2hhciAgICAgICAgICAgICAgICAgICAgICAgKmlwOwotICAgIHVpbnRwdHJfdCAgICAgICAgICAgICAgICAgICAgKnNwOworICAgIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgICAgKnNwOwogCiAgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgICAgYnVmOwogICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICAgKmxpbmU7CkBAIC0xMjgsOCArMTQzLDE0IEBACiAgICAgdm9pZCAqY29uZik7CiBzdGF0aWMgY2hhciAqbmd4X2h0dHBfcmV3cml0ZV9pZihuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqY21kLAogICAgIHZvaWQgKmNvbmYpOworc3RhdGljIGNoYXIgKiBuZ3hfaHR0cF9yZXdyaXRlX2lmX2NvbmRpdGlvbihuZ3hfY29uZl90ICpjZiwKKyAgICBuZ3hfaHR0cF9yZXdyaXRlX2xvY19jb25mX3QgKmxjZik7CitzdGF0aWMgY2hhciAqbmd4X2h0dHBfcmV3cml0ZV92YXJpYWJsZShuZ3hfY29uZl90ICpjZiwKKyAgICBuZ3hfaHR0cF9yZXdyaXRlX2xvY19jb25mX3QgKmxjZiwgbmd4X3N0cl90ICp2YWx1ZSk7CiBzdGF0aWMgY2hhciAqbmd4X2h0dHBfcmV3cml0ZV92YWxpZF9yZWZlcmVycyhuZ3hfY29uZl90ICpjZiwKICAgICBuZ3hfY29tbWFuZF90ICpjbWQsIHZvaWQgKmNvbmYpOworc3RhdGljIGNoYXIgKiBuZ3hfaHR0cF9yZXdyaXRlX3NldChuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqY21kLAorICAgIHZvaWQgKmNvbmYpOwogc3RhdGljIHZvaWQgKm5neF9odHRwX3Jld3JpdGVfc3RhcnRfY29kZShuZ3hfcG9vbF90ICpwb29sLAogICAgIG5neF9hcnJheV90ICoqY29kZXMsIHNpemVfdCBzaXplKTsKIHN0YXRpYyB2b2lkICpuZ3hfaHR0cF9yZXdyaXRlX2FkZF9jb2RlKG5neF9hcnJheV90ICpjb2Rlcywgc2l6ZV90IHNpemUsCkBAIC0xNjgsNiArMTg5LDE0IEBACiAgICAgICAwLAogICAgICAgTlVMTCB9LAogCisgICAgeyBuZ3hfc3RyaW5nKCJzZXQiKSwKKyAgICAgIE5HWF9IVFRQX1NSVl9DT05GfE5HWF9IVFRQX1NJRl9DT05GfE5HWF9IVFRQX0xPQ19DT05GfE5HWF9IVFRQX0xJRl9DT05GCisgICAgICAgICAgICAgICAgICAgICAgIHxOR1hfQ09ORl9UQUtFMiwKKyAgICAgIG5neF9odHRwX3Jld3JpdGVfc2V0LAorICAgICAgTkdYX0hUVFBfTE9DX0NPTkZfT0ZGU0VULAorICAgICAgMCwKKyAgICAgIE5VTEwgfSwKKwogICAgIHsgbmd4X3N0cmluZygicmV3cml0ZV9sb2ciKSwKICAgICAgIE5HWF9IVFRQX1NSVl9DT05GfE5HWF9IVFRQX1NJRl9DT05GfE5HWF9IVFRQX0xPQ19DT05GfE5HWF9IVFRQX0xJRl9DT05GCiAgICAgICAgICAgICAgICAgICAgICAgIHxOR1hfQ09ORl9UQUtFMSwKQEAgLTIwOCw2ICsyMzcsOSBAQAogCiB1aW50cHRyX3Qgbmd4X2h0dHBfcmV3cml0ZV9leGl0X2NvZGUgPSAodWludHB0cl90KSBOVUxMOwogCitzdGF0aWMgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAgbmd4X2h0dHBfcmV3cml0ZV9udWxsX3ZhbHVlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAwLCBuZ3hfc3RyaW5nKCIiKSB9OworCiAKIHN0YXRpYyBuZ3hfaW50X3QKIG5neF9odHRwX3Jld3JpdGVfaGFuZGxlcihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpCkBAIC0yMjIsMTEgKzI1NCwxMyBAQAogICAgICAgICByZXR1cm4gTkdYX0RFQ0xJTkVEOwogICAgIH0KIAotICAgIGlmICghKGUgPSBuZ3hfcGFsbG9jKHItPnBvb2wsIHNpemVvZihuZ3hfaHR0cF9yZXdyaXRlX2VuZ2luZV90KSkpKSB7CisgICAgZSA9IG5neF9wYWxsb2Moci0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX3Jld3JpdGVfZW5naW5lX3QpKTsKKyAgICBpZiAoZSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7CiAgICAgfQogCi0gICAgZS0+c3AgPSBuZ3hfcGFsbG9jKHItPnBvb2wsIGNmLT5zdGFja19zaXplICogc2l6ZW9mKG5neF9pbnRfdCkpOworICAgIGUtPnNwID0gbmd4X3BhbGxvYyhyLT5wb29sLAorICAgICAgICAgICAgICAgICAgICAgICBjZi0+c3RhY2tfc2l6ZSAqIHNpemVvZihuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90KSk7CiAgICAgaWYgKGUtPnNwID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKICAgICB9CkBAIC0yNzQsMTIgKzMwOCwxMyBAQAogICAgIHIgPSBlLT5yZXF1ZXN0OwogCiAgICAgbmd4X2xvZ19kZWJ1ZzEoTkdYX0xPR19ERUJVR19IVFRQLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCi0gICAgICAgICAgICAgICAgICAgImh0dHAgcmV3cml0ZSBzdGFydDogXCIlVlwiIiwgJmNvZGUtPm5hbWUpOworICAgICAgICAgICAgICAgICAgICJodHRwIHJld3JpdGUgcmVnZXg6IFwiJVZcIiIsICZjb2RlLT5uYW1lKTsKIAogICAgIGlmIChjb2RlLT51cmkpIHsKICAgICAgICAgZS0+bGluZSA9ICZyLT51cmk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgZS0+bGluZSA9ICoobmd4X3N0cl90ICoqKSBlLT5zcC0tOworICAgICAgICBlLT5zcC0tOworICAgICAgICBlLT5saW5lID0gJmUtPnNwLT50ZXh0OwogICAgIH0KIAogICAgIHJjID0gbmd4X3JlZ2V4X2V4ZWMoY29kZS0+cmVnZXgsIGUtPmxpbmUsIGUtPmNhcHR1cmVzLCBjb2RlLT5uY2FwdHVyZXMpOwpAQCAtMjkwLDYgKzMyNSwxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIlVlwiIGRvZXMgbm90IG1hdGNoIFwiJVZcIiIsICZjb2RlLT5uYW1lLCBlLT5saW5lKTsKICAgICAgICAgfQogCisgICAgICAgIGlmIChjb2RlLT50ZXN0KSB7CisgICAgICAgICAgICBlLT5zcC0+dmFsdWUgPSAwOworICAgICAgICAgICAgZS0+c3AtPnRleHQubGVuID0gMDsKKyAgICAgICAgICAgIGUtPnNwLT50ZXh0LmRhdGEgPSAodV9jaGFyICopICIiOworICAgICAgICAgICAgZS0+c3ArKzsKKworICAgICAgICAgICAgZS0+aXAgKz0gc2l6ZW9mKG5neF9odHRwX3Jld3JpdGVfcmVnZXhfY29kZV90KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCiAgICAgICAgIGUtPmlwICs9IGNvZGUtPm5leHQ7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC0zMDksNiArMzU0LDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgIlwiJVZcIiBtYXRjaGVzIFwiJVZcIiIsICZjb2RlLT5uYW1lLCBlLT5saW5lKTsKICAgICB9CiAKKyAgICBpZiAoY29kZS0+dGVzdCkgeworICAgICAgICBlLT5zcC0+dmFsdWUgPSAxOworICAgICAgICBlLT5zcC0+dGV4dC5sZW4gPSAxOworICAgICAgICBlLT5zcC0+dGV4dC5kYXRhID0gKHVfY2hhciAqKSAiMSI7CisgICAgICAgIGUtPnNwKys7CisKKyAgICAgICAgZS0+aXAgKz0gc2l6ZW9mKG5neF9odHRwX3Jld3JpdGVfcmVnZXhfY29kZV90KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwogICAgIGlmIChjb2RlLT5zdGF0dXMpIHsKICAgICAgICAgZS0+c3RhdHVzID0gY29kZS0+c3RhdHVzOwogCkBAIC0zMzksNyArMzk0LDggQEAKICAgICAgICAgZS0+YnVmLmxlbiArPSByLT5hcmdzLmxlbiArIDE7CiAgICAgfQogCi0gICAgaWYgKCEoZS0+YnVmLmRhdGEgPSBuZ3hfcGFsbG9jKHItPnBvb2wsIGUtPmJ1Zi5sZW4pKSkgeworICAgIGUtPmJ1Zi5kYXRhID0gbmd4X3BhbGxvYyhyLT5wb29sLCBlLT5idWYubGVuKTsKKyAgICBpZiAoZS0+YnVmLmRhdGEgPT0gTlVMTCkgewogICAgICAgICBlLT5pcCA9IG5neF9odHRwX3Jld3JpdGVfZXhpdDsKICAgICAgICAgZS0+c3RhdHVzID0gTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwogICAgICAgICByZXR1cm47CkBAIC0zNjYsNyArNDIyLDcgQEAKICAgICBlLT5xdW90ZSA9IDA7CiAKICAgICBuZ3hfbG9nX2RlYnVnMChOR1hfTE9HX0RFQlVHX0hUVFAsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKLSAgICAgICAgICAgICAgICAgICAiaHR0cCByZXdyaXRlIGVuZCIpOworICAgICAgICAgICAgICAgICAgICJodHRwIHJld3JpdGUgcmVnZXggZW5kIik7CiAKICAgICBpZiAoZS0+YXJncykgewogICAgICAgICBlLT5idWYubGVuID0gZS0+YXJncyAtIGUtPmJ1Zi5kYXRhOwpAQCAtNDE0LDcgKzQ3MCw4IEBACiAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX05PVElDRSwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAogICAgICAgICAgICAgICAgICAgInJld3JpdHRlbiByZWRpcmVjdDogXCIlVlwiIiwgJmUtPmJ1Zik7CiAKLSAgICBpZiAoIShyLT5oZWFkZXJzX291dC5sb2NhdGlvbiA9IG5neF9saXN0X3B1c2goJnItPmhlYWRlcnNfb3V0LmhlYWRlcnMpKSkgeworICAgIHItPmhlYWRlcnNfb3V0LmxvY2F0aW9uID0gbmd4X2xpc3RfcHVzaCgmci0+aGVhZGVyc19vdXQuaGVhZGVycyk7CisgICAgaWYgKHItPmhlYWRlcnNfb3V0LmxvY2F0aW9uID09IE5VTEwpIHsKICAgICAgICAgZS0+aXAgPSBuZ3hfaHR0cF9yZXdyaXRlX2V4aXQ7CiAgICAgICAgIGUtPnN0YXR1cyA9IE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKICAgICAgICAgcmV0dXJuOwpAQCAtNDY4LDcgKzUyNSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlLT5sZW4pOwogCiAgICAgZS0+aXAgKz0gc2l6ZW9mKG5neF9odHRwX3Jld3JpdGVfY29weV9jb2RlX3QpCi0gICAgICAgICAgICAgKyAoKGNvZGUtPmxlbiArIHNpemVvZih1aW50cHRyX3QpIC0gMSkgJiB+KHNpemVvZih1aW50cHRyX3QpIC0gMSkpOworICAgICAgICAgICsgKChjb2RlLT5sZW4gKyBzaXplb2YodWludHB0cl90KSAtIDEpICYgfihzaXplb2YodWludHB0cl90KSAtIDEpKTsKIAogICAgIG5neF9sb2dfZGVidWcxKE5HWF9MT0dfREVCVUdfSFRUUCwgZS0+cmVxdWVzdC0+Y29ubmVjdGlvbi0+bG9nLCAwLAogICAgICAgICAgICAgICAgICAgICJodHRwIHJld3JpdGUgY29weTogXCIlVlwiIiwgJmUtPmJ1Zik7CkBAIC01MDksNyArNTY2LDkgQEAKICAgICBuZ3hfbG9nX2RlYnVnMChOR1hfTE9HX0RFQlVHX0hUVFAsIGUtPnJlcXVlc3QtPmNvbm5lY3Rpb24tPmxvZywgMCwKICAgICAgICAgICAgICAgICAgICAiaHR0cCByZXdyaXRlIGlmIik7CiAKLSAgICBpZiAoKmUtPnNwLS0pIHsKKyAgICBlLT5zcC0tOworCisgICAgaWYgKGUtPnNwLT52YWx1ZSkgewogICAgICAgICBpZiAoY29kZS0+bG9jX2NvbmYpIHsKICAgICAgICAgICAgIGUtPnJlcXVlc3QtPmxvY19jb25mID0gY29kZS0+bG9jX2NvbmY7CiAgICAgICAgIH0KQEAgLTUyNiw2ICs1ODUsNjkgQEAKIAogCiBzdGF0aWMgdm9pZAorbmd4X2h0dHBfcmV3cml0ZV92YWx1ZV9jb2RlKG5neF9odHRwX3Jld3JpdGVfZW5naW5lX3QgKmUpCit7CisgICAgbmd4X2h0dHBfcmV3cml0ZV92YWx1ZV9jb2RlX3QgICpjb2RlOworCisgICAgY29kZSA9IChuZ3hfaHR0cF9yZXdyaXRlX3ZhbHVlX2NvZGVfdCAqKSBlLT5pcDsKKworICAgIGUtPmlwICs9IHNpemVvZihuZ3hfaHR0cF9yZXdyaXRlX3ZhbHVlX2NvZGVfdCk7CisKKyAgICBuZ3hfbG9nX2RlYnVnMChOR1hfTE9HX0RFQlVHX0hUVFAsIGUtPnJlcXVlc3QtPmNvbm5lY3Rpb24tPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAiaHR0cCByZXdyaXRlIHZhbHVlIik7CisKKyAgICBlLT5zcC0+dmFsdWUgPSAobmd4X3VpbnRfdCkgY29kZS0+dmFsdWU7CisgICAgZS0+c3AtPnRleHQubGVuID0gKHNpemVfdCkgY29kZS0+dGV4dF9sZW47CisgICAgZS0+c3AtPnRleHQuZGF0YSA9ICh1X2NoYXIgKikgY29kZS0+dGV4dF9kYXRhOworICAgIGUtPnNwKys7Cit9CisKKworc3RhdGljIHZvaWQKK25neF9odHRwX3Jld3JpdGVfc2V0X3Zhcl9jb2RlKG5neF9odHRwX3Jld3JpdGVfZW5naW5lX3QgKmUpCit7CisgICAgbmd4X2h0dHBfcmVxdWVzdF90ICAgICAgICAgICAqcjsKKyAgICBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICAgICp2YWx1ZTsKKyAgICBuZ3hfaHR0cF9jb3JlX21haW5fY29uZl90ICAgICpjbWNmOworICAgIG5neF9odHRwX3Jld3JpdGVfdmFyX2NvZGVfdCAgKmNvZGU7CisKKyAgICBuZ3hfbG9nX2RlYnVnMChOR1hfTE9HX0RFQlVHX0hUVFAsIGUtPnJlcXVlc3QtPmNvbm5lY3Rpb24tPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAiaHR0cCByZXdyaXRlIHNldCB2YXIiKTsKKworICAgIGNvZGUgPSAobmd4X2h0dHBfcmV3cml0ZV92YXJfY29kZV90ICopIGUtPmlwOworCisgICAgZS0+aXAgKz0gc2l6ZW9mKG5neF9odHRwX3Jld3JpdGVfdmFyX2NvZGVfdCk7CisKKyAgICByID0gZS0+cmVxdWVzdDsKKworICAgIGlmIChyLT52YXJpYWJsZXMgPT0gTlVMTCkgeworICAgICAgICBjbWNmID0gbmd4X2h0dHBfZ2V0X21vZHVsZV9tYWluX2NvbmYociwgbmd4X2h0dHBfY29yZV9tb2R1bGUpOworCisgICAgICAgIHItPnZhcmlhYmxlcyA9IG5neF9wY2FsbG9jKHItPnBvb2wsIGNtY2YtPnZhcmlhYmxlcy5uZWx0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2l6ZW9mKG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgKikpOworICAgICAgICBpZiAoci0+dmFyaWFibGVzID09IE5VTEwpIHsKKyAgICAgICAgICAgIGUtPmlwID0gbmd4X2h0dHBfcmV3cml0ZV9leGl0OworICAgICAgICAgICAgZS0+c3RhdHVzID0gTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgdmFsdWUgPSBuZ3hfcGFsbG9jKHItPnBvb2wsIHNpemVvZihuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90KSk7CisgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgZS0+aXAgPSBuZ3hfaHR0cF9yZXdyaXRlX2V4aXQ7CisgICAgICAgIGUtPnN0YXR1cyA9IE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGUtPnNwLS07CisKKyAgICAqdmFsdWUgPSAqZS0+c3A7CisKKyAgICByLT52YXJpYWJsZXNbY29kZS0+aW5kZXhdID0gdmFsdWU7Cit9CisKKworc3RhdGljIHZvaWQKIG5neF9odHRwX3Jld3JpdGVfdmFyX2NvZGUobmd4X2h0dHBfcmV3cml0ZV9lbmdpbmVfdCAqZSkKIHsKICAgICBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICAgICp2YWx1ZTsKQEAgLTUzNiwxOSArNjU4LDI0IEBACiAKICAgICBjb2RlID0gKG5neF9odHRwX3Jld3JpdGVfdmFyX2NvZGVfdCAqKSBlLT5pcDsKIAotICAgIGUtPnNwKys7Ci0KICAgICBlLT5pcCArPSBzaXplb2Yobmd4X2h0dHBfcmV3cml0ZV92YXJfY29kZV90KTsKIAotICAgIGlmICghKHZhbHVlID0gbmd4X2h0dHBfZ2V0X2luZGV4ZWRfdmFyaWFibGUoZS0+cmVxdWVzdCwgY29kZS0+aW5kZXgpKSkgewotICAgICAgICAqZS0+c3AgPSAodWludHB0cl90KSAwOworICAgIHZhbHVlID0gbmd4X2h0dHBfZ2V0X2luZGV4ZWRfdmFyaWFibGUoZS0+cmVxdWVzdCwgY29kZS0+aW5kZXgpOworCisgICAgaWYgKHZhbHVlID09IE5VTEwgfHwgdmFsdWUgPT0gTkdYX0hUVFBfVkFSSUFCTEVfTk9UX0ZPVU5EKSB7CisgICAgICAgIGUtPnNwLT52YWx1ZSA9IDA7CisgICAgICAgIGUtPnNwLT50ZXh0LmxlbiA9IDA7CisgICAgICAgIGUtPnNwLT50ZXh0LmRhdGEgPSAodV9jaGFyICopICIiOworICAgICAgICBlLT5zcCsrOworCiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBuZ3hfbG9nX2RlYnVnMShOR1hfTE9HX0RFQlVHX0hUVFAsIGUtPnJlcXVlc3QtPmNvbm5lY3Rpb24tPmxvZywgMCwKLSAgICAgICAgICAgICAgICAgICAiaHR0cCByZXdyaXRlIHZhcjogJXAiLCB2YWx1ZS0+dmFsdWUpOworICAgIG5neF9sb2dfZGVidWcyKE5HWF9MT0dfREVCVUdfSFRUUCwgZS0+cmVxdWVzdC0+Y29ubmVjdGlvbi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICJodHRwIHJld3JpdGUgdmFyOiAldWksIFwiJVZcIiIsIHZhbHVlLT52YWx1ZSwgJnZhbHVlLT50ZXh0KTsKIAotICAgICplLT5zcCA9IHZhbHVlLT52YWx1ZTsKKyAgICAqZS0+c3AgPSAqdmFsdWU7CisgICAgZS0+c3ArKzsKIH0KIAogCkBAIC01NjksMjAgKzY5NiwzMSBAQAogCiAgICAgY2YgPSBuZ3hfaHR0cF9nZXRfbW9kdWxlX2xvY19jb25mKHIsIG5neF9odHRwX3Jld3JpdGVfbW9kdWxlKTsKIAotICAgIGUtPnNwKys7CiAgICAgZS0+aXAgKz0gc2l6ZW9mKHVpbnRwdHJfdCk7CiAKICAgICBpZiAoY2YtPnJlZmVyZXJzID09IE5VTEwpIHsKLSAgICAgICAgKmUtPnNwID0gKHVpbnRwdHJfdCkgMDsKKyAgICAgICAgZS0+c3AtPnZhbHVlID0gMDsKKyAgICAgICAgZS0+c3AtPnRleHQubGVuID0gMDsKKyAgICAgICAgZS0+c3AtPnRleHQuZGF0YSA9ICh1X2NoYXIgKikgIiI7CisgICAgICAgIGUtPnNwKys7CisKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIGlmIChyLT5oZWFkZXJzX2luLnJlZmVyZXIgPT0gTlVMTCkgewogICAgICAgICBpZiAoY2YtPm5vX3JlZmVyZXIpIHsKLSAgICAgICAgICAgICplLT5zcCA9ICh1aW50cHRyX3QpIDA7CisgICAgICAgICAgICBlLT5zcC0+dmFsdWUgPSAwOworICAgICAgICAgICAgZS0+c3AtPnRleHQubGVuID0gMDsKKyAgICAgICAgICAgIGUtPnNwLT50ZXh0LmRhdGEgPSAodV9jaGFyICopICIiOworICAgICAgICAgICAgZS0+c3ArKzsKKwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgKmUtPnNwID0gKHVpbnRwdHJfdCkgMTsKKyAgICAgICAgICAgIGUtPnNwLT52YWx1ZSA9IDE7CisgICAgICAgICAgICBlLT5zcC0+dGV4dC5sZW4gPSAxOworICAgICAgICAgICAgZS0+c3AtPnRleHQuZGF0YSA9ICh1X2NoYXIgKikgIjEiOworICAgICAgICAgICAgZS0+c3ArKzsKKwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgfQpAQCAtNTkzLDcgKzczMSwxMSBAQAogICAgIGlmIChsZW4gPCBzaXplb2YoImh0dHA6Ly9pLnJ1IikgLSAxCiAgICAgICAgIHx8IChuZ3hfc3RybmNhc2VjbXAocmVmLCAiaHR0cDovLyIsIDcpICE9IDApKQogICAgIHsKLSAgICAgICAgKmUtPnNwID0gKHVpbnRwdHJfdCkgMTsKKyAgICAgICAgZS0+c3AtPnZhbHVlID0gMTsKKyAgICAgICAgZS0+c3AtPnRleHQubGVuID0gMTsKKyAgICAgICAgZS0+c3AtPnRleHQuZGF0YSA9ICh1X2NoYXIgKikgIjEiOworICAgICAgICBlLT5zcCsrOworCiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTYyMCw3ICs3NjIsMTEgQEAKICAgICAgICAgICAgICAgICBpZiAobmd4X3N0cm5jbXAoJnJlZltuXSwgcmVmc1tpXS5uYW1lLmRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnNbaV0ubmFtZS5sZW4pID09IDApCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAqZS0+c3AgPSAodWludHB0cl90KSAwOworICAgICAgICAgICAgICAgICAgICBlLT5zcC0+dmFsdWUgPSAwOworICAgICAgICAgICAgICAgICAgICBlLT5zcC0+dGV4dC5sZW4gPSAwOworICAgICAgICAgICAgICAgICAgICBlLT5zcC0+dGV4dC5kYXRhID0gKHVfY2hhciAqKSAiIjsKKyAgICAgICAgICAgICAgICAgICAgZS0+c3ArKzsKKwogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtNjI4LDEzICs3NzQsMjAgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChuZ3hfc3RybmNhc2VjbXAocmVmc1tpXS5uYW1lLmRhdGEsIHJlZiwgcmVmc1tpXS5uYW1lLmxlbikgPT0gMCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAqZS0+c3AgPSAodWludHB0cl90KSAwOworICAgICAgICAgICAgICAgIGUtPnNwLT52YWx1ZSA9IDA7CisgICAgICAgICAgICAgICAgZS0+c3AtPnRleHQubGVuID0gMDsKKyAgICAgICAgICAgICAgICBlLT5zcC0+dGV4dC5kYXRhID0gKHVfY2hhciAqKSAiIjsKKyAgICAgICAgICAgICAgICBlLT5zcCsrOworCiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCi0gICAgKmUtPnNwID0gKHVpbnRwdHJfdCkgMTsKKyAgICBlLT5zcC0+dmFsdWUgPSAxOworICAgIGUtPnNwLT50ZXh0LmxlbiA9IDE7CisgICAgZS0+c3AtPnRleHQuZGF0YSA9ICh1X2NoYXIgKikgIjEiOworICAgIGUtPnNwKys7CiB9CiAKIApAQCAtNjQ1LDYgKzc5OCwyOSBAQAogfQogCiAKK3N0YXRpYyBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICoKK25neF9odHRwX3Jld3JpdGVfdmFyKG5neF9odHRwX3JlcXVlc3RfdCAqciwgdWludHB0cl90IGRhdGEpCit7CisgICAgbmd4X2h0dHBfdmFyaWFibGVfdCAgICAgICAgKnZhcjsKKyAgICBuZ3hfaHR0cF9jb3JlX21haW5fY29uZl90ICAqY21jZjsKKworICAgIGNtY2YgPSBuZ3hfaHR0cF9nZXRfbW9kdWxlX21haW5fY29uZihyLCBuZ3hfaHR0cF9jb3JlX21vZHVsZSk7CisKKyAgICB2YXIgPSBjbWNmLT52YXJpYWJsZXMuZWx0czsKKworICAgIC8qCisgICAgICogdGhlIG5neF9odHRwX3Jld3JpdGVfbW9kdWxlIHNldHMgdmFyaWFibGVzIGRpcmVjdGx5IGluIHItPnZhcmlhYmxlcywKKyAgICAgKiBhbmQgdGhleSBzaG91bGQgYmUgaGFuZGxlIGJ5IG5neF9odHRwX2dldF9pbmRleGVkX3ZhcmlhYmxlKCksCisgICAgICogc28gdGhlIGhhbmRsZXIgaXMgY2FsbGVkIG9ubHkgaWYgdGhlIHZhcmlhYmxlIGlzIG5vdCBpbml0aWFsaXplZAorICAgICAqLworCisgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0FMRVJULCByLT5jb25uZWN0aW9uLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAidXNpbmcgdW5pbml0aWFsaXplZCBcIiVWXCIgdmFyaWFibGUiLCAmdmFyW2RhdGFdLm5hbWUpOworCisgICAgcmV0dXJuICZuZ3hfaHR0cF9yZXdyaXRlX251bGxfdmFsdWU7Cit9CisKKwogc3RhdGljIG5neF9pbnRfdAogbmd4X2h0dHBfcmV3cml0ZV9pbml0KG5neF9jeWNsZV90ICpjeWNsZSkKIHsgICAKQEAgLTY1Myw3ICs4MjksNyBAQAogICAgIAogICAgIGNtY2YgPSBuZ3hfaHR0cF9jeWNsZV9nZXRfbW9kdWxlX21haW5fY29uZihjeWNsZSwgbmd4X2h0dHBfY29yZV9tb2R1bGUpOwogCi0gICAgaCA9IG5neF9wdXNoX2FycmF5KCZjbWNmLT5waGFzZXNbTkdYX0hUVFBfUkVXUklURV9QSEFTRV0uaGFuZGxlcnMpOworICAgIGggPSBuZ3hfYXJyYXlfcHVzaCgmY21jZi0+cGhhc2VzW05HWF9IVFRQX1JFV1JJVEVfUEhBU0VdLmhhbmRsZXJzKTsKICAgICBpZiAoaCA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgfQpAQCAtNjY5LDcgKzg0NSw4IEBACiB7CiAgICAgbmd4X2h0dHBfcmV3cml0ZV9sb2NfY29uZl90ICAqY29uZjsKIAotICAgIGlmICghKGNvbmYgPSBuZ3hfcGNhbGxvYyhjZi0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX3Jld3JpdGVfbG9jX2NvbmZfdCkpKSkgeworICAgIGNvbmYgPSBuZ3hfcGNhbGxvYyhjZi0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX3Jld3JpdGVfbG9jX2NvbmZfdCkpOworICAgIGlmIChjb25mID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgIH0KIApAQCAtNzI0LDMwICs5MDEsNTMgQEAKICAgICAgICAgICAgICAgICBjb25mLT5tYXhfY2FwdHVyZXMgPSByZWdleC0+bmNhcHR1cmVzOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgY29kZSA9ICh1aW50cHRyX3QgKikgKCh1X2NoYXIgKikgY29kZSArIHJlZ2V4LT5uZXh0KTsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKCpjb2RlID09ICh1aW50cHRyX3QpICZuZ3hfaHR0cF9yZXdyaXRlX2lmX2NvZGUpIHsKICAgICAgICAgICAgIGNvZGUgKz0gc2l6ZW9mKG5neF9odHRwX3Jld3JpdGVfaWZfY29kZV90KSAvIHNpemVvZih1aW50cHRyX3QpOworICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoKmNvZGUgPT0gKHVpbnRwdHJfdCkgJm5neF9odHRwX3Jld3JpdGVfcmV0dXJuX2NvZGUpIHsKICAgICAgICAgICAgIGNvZGUgKz0gc2l6ZW9mKG5neF9odHRwX3Jld3JpdGVfcmV0dXJuX2NvZGVfdCkgLyBzaXplb2YodWludHB0cl90KTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCpjb2RlID09ICh1aW50cHRyX3QpICZuZ3hfaHR0cF9yZXdyaXRlX3NldF92YXJfY29kZSkgeworICAgICAgICAgICAgY29kZSArPSBzaXplb2Yobmd4X2h0dHBfcmV3cml0ZV92YXJfY29kZV90KSAvIHNpemVvZih1aW50cHRyX3QpOworICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoKmNvZGUgPT0gKHVpbnRwdHJfdCkgJm5neF9odHRwX3Jld3JpdGVfdmFyX2NvZGUpIHsKICAgICAgICAgICAgIGNvZGUgKz0gc2l6ZW9mKG5neF9odHRwX3Jld3JpdGVfdmFyX2NvZGVfdCkgLyBzaXplb2YodWludHB0cl90KTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCpjb2RlID09ICh1aW50cHRyX3QpICZuZ3hfaHR0cF9yZXdyaXRlX3ZhbHVlX2NvZGUpIHsKKyAgICAgICAgICAgIGNvZGUgKz0gc2l6ZW9mKG5neF9odHRwX3Jld3JpdGVfdmFsdWVfY29kZV90KSAvIHNpemVvZih1aW50cHRyX3QpOworICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoKmNvZGUgPT0gKHVpbnRwdHJfdCkgJm5neF9odHRwX3Jld3JpdGVfaW52YWxpZF9yZWZlcmVyX2NvZGUpIHsKICAgICAgICAgICAgIGNvZGUrKzsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKCpjb2RlID09ICh1aW50cHRyX3QpICZuZ3hfaHR0cF9yZXdyaXRlX25vcF9jb2RlKSB7CiAgICAgICAgICAgICBjb2RlKys7CisgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQorCisjaWYgKE5HWF9ERUJVRykKKyAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBjZi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICAgICJ1bmtub3duIHJld3JpdGUgY29kZTogJXAiLCAqY29kZSk7CisgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyNlbmRpZgogICAgIH0KIAotICAgIGlmICghKGNvZGUgPSBuZ3hfYXJyYXlfcHVzaF9uKGNvbmYtPmNvZGVzLCBzaXplb2YodWludHB0cl90KSkpKSB7CisgICAgY29kZSA9IG5neF9hcnJheV9wdXNoX24oY29uZi0+Y29kZXMsIHNpemVvZih1aW50cHRyX3QpKTsKKyAgICBpZiAoY29kZSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICB9CiAKQEAgLTc2NSw3ICs5NjUsOCBAQAogICAgIHVfY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGE7CiAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCBzaXplOwogICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnZhbHVlLCBlcnI7Ci0gICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgbiwgbGFzdDsKKyAgICBuZ3hfaW50X3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuOworICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIGxhc3Q7CiAgICAgbmd4X2h0dHBfcmV3cml0ZV9jb2RlX3B0ICAgICAgICAgICAgICAqY29kZTsKICAgICBuZ3hfaHR0cF9yZXdyaXRlX2NvcHlfY29kZV90ICAgICAgICAgICpjb3B5OwogICAgIG5neF9odHRwX3Jld3JpdGVfcmVnZXhfY29kZV90ICAgICAgICAgKnJlZ2V4OwpAQCAtNzk3LDYgKzk5OCw3IEBACiAgICAgcmVnZXgtPnNpemUgPSAwOwogICAgIHJlZ2V4LT5uY2FwdHVyZXMgPSAwOwogICAgIHJlZ2V4LT5zdGF0dXMgPSAwOworICAgIHJlZ2V4LT50ZXN0ID0gMDsKICAgICByZWdleC0+dXJpID0gMTsKICAgICByZWdleC0+YXJncyA9IDE7CiAgICAgcmVnZXgtPnJlZGlyZWN0ID0gMDsKQEAgLTk0Niw3ICsxMTQ4LDE0IEBACiAKICAgICBuID0gbmd4X3JlZ2V4X2NhcHR1cmVfY291bnQocmVnZXgtPnJlZ2V4KTsKIAotICAgIGlmIChyZWdleC0+bmNhcHR1cmVzID4gbikgeworICAgIGlmIChuIDwgMCkgeworICAgICAgICBuZ3hfY29uZl9sb2dfZXJyb3IoTkdYX0xPR19FTUVSRywgY2YsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfcmVnZXhfY2FwdHVyZV9jb3VudF9uICIgZmFpbGVkIGZvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAicGF0dGVybiBcIiVWXCIiLCAmdmFsdWVbMV0pOworICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgfQorCisgICAgaWYgKHJlZ2V4LT5uY2FwdHVyZXMgPiAobmd4X3VpbnRfdCkgbikgewogICAgICAgICBuZ3hfY29uZl9sb2dfZXJyb3IoTkdYX0xPR19FTUVSRywgY2YsIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGF0dGVybiBcIiVWXCIgaGFzIGxlc3MgY2FwdHVyZXMgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoYW4gcmVmZXJyZW5jZWQgaW4gc3Vic3RpdHV0aW9uIFwiJVZcIiIsCkBAIC05NTQsOCArMTE2Myw4IEBACiAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICB9CiAKLSAgICBpZiAocmVnZXgtPm5jYXB0dXJlcyA8IG4pIHsKLSAgICAgICAgcmVnZXgtPm5jYXB0dXJlcyA9IG47CisgICAgaWYgKHJlZ2V4LT5uY2FwdHVyZXMgPCAobmd4X3VpbnRfdCkgbikgeworICAgICAgICByZWdleC0+bmNhcHR1cmVzID0gKG5neF91aW50X3QpIG47CiAgICAgfQogCiAgICAgaWYgKHJlZ2V4LT5uY2FwdHVyZXMpIHsKQEAgLTEwMjgsMjAgKzEyMzcsMTYgQEAKICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICptY29uZjsKICAgICBjaGFyICAgICAgICAgICAgICAgICAgICAgICAgICpydjsKICAgICB1X2NoYXIgICAgICAgICAgICAgICAgICAgICAgICplbHRzOwotICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICAgKnZhbHVlOwotICAgIG5neF9pbnRfdCAgICAgICAgICAgICAgICAgICAgIGluZGV4OwogICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICAgIGk7CiAgICAgbmd4X2NvbmZfdCAgICAgICAgICAgICAgICAgICAgc2F2ZTsKLSAgICBuZ3hfaHR0cF9yZXdyaXRlX2NvZGVfcHQgICAgICpjb2RlOwogICAgIG5neF9odHRwX21vZHVsZV90ICAgICAgICAgICAgKm1vZHVsZTsKICAgICBuZ3hfaHR0cF9jb25mX2N0eF90ICAgICAgICAgICpjdHgsICpwY3R4OwogICAgIG5neF9odHRwX2NvcmVfbG9jX2NvbmZfdCAgICAgKmNsY2YsICpwY2xjZiwgKipjbGNmcDsKLSAgICBuZ3hfaHR0cF9jb3JlX21haW5fY29uZl90ICAgICpjbWNmOwogICAgIG5neF9odHRwX3Jld3JpdGVfaWZfY29kZV90ICAgKmlmX2NvZGU7Ci0gICAgbmd4X2h0dHBfcmV3cml0ZV92YXJfY29kZV90ICAqdmFyX2NvZGU7CiAgICAgbmd4X2h0dHBfcmV3cml0ZV9sb2NfY29uZl90ICAqbmxjZjsKIAotICAgIGlmICghKGN0eCA9IG5neF9wY2FsbG9jKGNmLT5wb29sLCBzaXplb2Yobmd4X2h0dHBfY29uZl9jdHhfdCkpKSkgeworICAgIGN0eCA9IG5neF9wY2FsbG9jKGNmLT5wb29sLCBzaXplb2Yobmd4X2h0dHBfY29uZl9jdHhfdCkpOworICAgIGlmIChjdHggPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgfQogCkBAIC0xMDYzLDcgKzEyNjgsOCBAQAogICAgIAogICAgICAgICBpZiAobW9kdWxlLT5jcmVhdGVfbG9jX2NvbmYpIHsKIAotICAgICAgICAgICAgaWYgKCEobWNvbmYgPSBtb2R1bGUtPmNyZWF0ZV9sb2NfY29uZihjZikpKSB7CisgICAgICAgICAgICBtY29uZiA9IG1vZHVsZS0+Y3JlYXRlX2xvY19jb25mKGNmKTsKKyAgICAgICAgICAgIGlmIChtY29uZiA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICAgICAgICAgIH0KIApAQCAtMTA4Niw2MyArMTI5MiwxOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKCEoY2xjZnAgPSBuZ3hfcHVzaF9hcnJheSgmcGNsY2YtPmxvY2F0aW9ucykpKSB7CisgICAgY2xjZnAgPSBuZ3hfYXJyYXlfcHVzaCgmcGNsY2YtPmxvY2F0aW9ucyk7CisgICAgaWYgKGNsY2ZwID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgIH0KIAogICAgICpjbGNmcCA9IGNsY2Y7CiAKIAotICAgIC8qIFNUVUI6ICJpZiAoJHZhcikiICovCi0KLSAgICB2YWx1ZSA9IGNmLT5hcmdzLT5lbHRzOwotCi0gICAgaWYgKHZhbHVlWzFdLmxlbiA8IDIKLSAgICAgICAgfHwgdmFsdWVbMV0uZGF0YVswXSAhPSAnKCcKLSAgICAgICAgfHwgdmFsdWVbMV0uZGF0YVsxXSAhPSAnJCcKLSAgICAgICAgfHwgdmFsdWVbMV0uZGF0YVt2YWx1ZVsxXS5sZW4gLSAxXSAhPSAnKScpCi0gICAgewotICAgICAgICBuZ3hfY29uZl9sb2dfZXJyb3IoTkdYX0xPR19FTUVSRywgY2YsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBjb25kaXRpb24gXCIlVlwiIiwgJnZhbHVlWzFdKTsKKyAgICBpZiAobmd4X2h0dHBfcmV3cml0ZV9pZl9jb25kaXRpb24oY2YsIGxjZikgIT0gTkdYX0NPTkZfT0spIHsKICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgIH0KIAotICAgIHZhbHVlWzFdLmxlbiAtPSAzOwotICAgIHZhbHVlWzFdLmRhdGEgKz0gMjsKLQotICAgIGlmICh2YWx1ZVsxXS5sZW4gPT0gc2l6ZW9mKCJpbnZhbGlkX3JlZmVyZXIiKSAtIDEKLSAgICAgICAgJiYgbmd4X3N0cm5jbXAodmFsdWVbMV0uZGF0YSwgImludmFsaWRfcmVmZXJlciIsCi0gICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigiaW52YWxpZF9yZWZlcmVyIikgLSAxKSA9PSAwKQotICAgIHsKLSAgICAgICAgY29kZSA9IG5neF9odHRwX3Jld3JpdGVfc3RhcnRfY29kZShjZi0+cG9vbCwgJmxjZi0+Y29kZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5neF9odHRwX3Jld3JpdGVfY29kZV9wdCkpOwotICAgICAgICBpZiAoY29kZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICAqY29kZSA9IG5neF9odHRwX3Jld3JpdGVfaW52YWxpZF9yZWZlcmVyX2NvZGU7Ci0KLSAgICB9IGVsc2UgewotICAgICAgICBjbWNmID0gbmd4X2h0dHBfY29uZl9nZXRfbW9kdWxlX21haW5fY29uZihjZiwgbmd4X2h0dHBfY29yZV9tb2R1bGUpOwotCi0gICAgICAgIGluZGV4ID0gbmd4X2h0dHBfZ2V0X3ZhcmlhYmxlX2luZGV4KGNtY2YsICZ2YWx1ZVsxXSk7Ci0KLSAgICAgICAgaWYgKGluZGV4ID09IC0xKSB7Ci0gICAgICAgICAgICBuZ3hfY29uZl9sb2dfZXJyb3IoTkdYX0xPR19FTUVSRywgY2YsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVua25vd24gdmFyaWFibGUgbmFtZSBcIiVWXCIiLCAmdmFsdWVbMV0pOwotICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICAgICAgdmFyX2NvZGUgPSBuZ3hfaHR0cF9yZXdyaXRlX3N0YXJ0X2NvZGUoY2YtPnBvb2wsICZsY2YtPmNvZGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfaHR0cF9yZXdyaXRlX3Zhcl9jb2RlX3QpKTsKLSAgICAgICAgaWYgKHZhcl9jb2RlID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIHZhcl9jb2RlLT5jb2RlID0gbmd4X2h0dHBfcmV3cml0ZV92YXJfY29kZTsKLSAgICAgICAgdmFyX2NvZGUtPmluZGV4ID0gaW5kZXg7Ci0gICAgfQotCiAgICAgaWZfY29kZSA9IG5neF9hcnJheV9wdXNoX24obGNmLT5jb2Rlcywgc2l6ZW9mKG5neF9odHRwX3Jld3JpdGVfaWZfY29kZV90KSk7CiAgICAgaWYgKGlmX2NvZGUgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTExOTMsNiArMTM1NCwxNTYgQEAKIAogCiBzdGF0aWMgY2hhciAqCituZ3hfaHR0cF9yZXdyaXRlX2lmX2NvbmRpdGlvbihuZ3hfY29uZl90ICpjZiwgbmd4X2h0dHBfcmV3cml0ZV9sb2NfY29uZl90ICpsY2YpCit7CisgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgICAgICp2YWx1ZSwgZXJyOworICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICAgICAgY3VyLCBsYXN0OworICAgIG5neF9odHRwX3Jld3JpdGVfcmVnZXhfY29kZV90ICAqcmVnZXg7CisgICAgdV9jaGFyICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJzdHJbTkdYX01BWF9DT05GX0VSUlNUUl07CisKKyAgICB2YWx1ZSA9IGNmLT5hcmdzLT5lbHRzOworICAgIGxhc3QgPSBjZi0+YXJncy0+bmVsdHMgLSAxOworCisgICAgaWYgKHZhbHVlWzFdLmxlbiA8IDEgfHwgdmFsdWVbMV0uZGF0YVswXSAhPSAnKCcpIHsKKyAgICAgICAgbmd4X2NvbmZfbG9nX2Vycm9yKE5HWF9MT0dfRU1FUkcsIGNmLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgY29uZGl0aW9uIFwiJVZcIiIsICZ2YWx1ZVsxXSk7CisgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICB9CisKKyAgICBpZiAodmFsdWVbMV0ubGVuID09IDEpIHsKKyAgICAgICAgY3VyID0gMjsKKworICAgIH0gZWxzZSB7CisgICAgICAgIGN1ciA9IDE7CisgICAgICAgIHZhbHVlWzFdLmxlbi0tOworICAgICAgICB2YWx1ZVsxXS5kYXRhKys7CisgICAgfQorCisgICAgaWYgKHZhbHVlW2xhc3RdLmxlbiA8IDEgfHwgdmFsdWVbbGFzdF0uZGF0YVt2YWx1ZVtsYXN0XS5sZW4gLSAxXSAhPSAnKScpIHsKKyAgICAgICAgbmd4X2NvbmZfbG9nX2Vycm9yKE5HWF9MT0dfRU1FUkcsIGNmLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgY29uZGl0aW9uIFwiJVZcIiIsICZ2YWx1ZVtsYXN0XSk7CisgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICB9CisKKyAgICBpZiAodmFsdWVbbGFzdF0ubGVuID09IDEpIHsKKyAgICAgICAgbGFzdC0tOworCisgICAgfSBlbHNlIHsKKyAgICAgICAgdmFsdWVbbGFzdF0ubGVuLS07CisgICAgICAgIHZhbHVlW2xhc3RdLmRhdGFbdmFsdWVbbGFzdF0ubGVuXSA9ICdcMCc7CisgICAgfQorCisgICAgaWYgKHZhbHVlW2N1cl0ubGVuID4gMSAmJiB2YWx1ZVtjdXJdLmRhdGFbMF0gPT0gJyQnKSB7CisKKyAgICAgICAgaWYgKGN1ciAhPSBsYXN0ICYmIGN1ciArIDIgIT0gbGFzdCkgeworICAgICAgICAgICAgbmd4X2NvbmZfbG9nX2Vycm9yKE5HWF9MT0dfRU1FUkcsIGNmLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBjb25kaXRpb24gXCIlVlwiIiwgJnZhbHVlW2N1cl0pOworICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG5neF9odHRwX3Jld3JpdGVfdmFyaWFibGUoY2YsIGxjZiwgJnZhbHVlW2N1cl0pIT0gTkdYX0NPTkZfT0spIHsKKyAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjdXIgPT0gbGFzdCkgeworICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX09LOworICAgICAgICB9CisKKyAgICAgICAgY3VyKys7CisKKyAgICAgICAgaWYgKCh2YWx1ZVtjdXJdLmxlbiA9PSAxICYmIHZhbHVlW2N1cl0uZGF0YVswXSAhPSAnficpCisgICAgICAgICAgICB8fCAodmFsdWVbY3VyXS5sZW4gPT0gMgorICAgICAgICAgICAgICAgICYmIHZhbHVlW2N1cl0uZGF0YVswXSAhPSAnficgJiYgdmFsdWVbY3VyXS5kYXRhWzFdICE9ICcqJykpCisgICAgICAgIHsKKyAgICAgICAgICAgIG5neF9jb25mX2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBjZiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZCBcIiVWXCIgaW4gY29uZGl0aW9uIiwgJnZhbHVlW2N1cl0pOworICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgcmVnZXggPSBuZ3hfaHR0cF9yZXdyaXRlX3N0YXJ0X2NvZGUoY2YtPnBvb2wsICZsY2YtPmNvZGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfaHR0cF9yZXdyaXRlX3JlZ2V4X2NvZGVfdCkpOworICAgICAgICBpZiAocmVnZXggPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgZXJyLmxlbiA9IE5HWF9NQVhfQ09ORl9FUlJTVFI7CisgICAgICAgIGVyci5kYXRhID0gZXJyc3RyOworCisgICAgICAgIHJlZ2V4LT5yZWdleCA9IG5neF9yZWdleF9jb21waWxlKCZ2YWx1ZVtsYXN0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZhbHVlW2N1cl0ubGVuID09IDIpID8gTkdYX1JFR0VYX0NBU0VMRVNTIDogMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2YtPnBvb2wsICZlcnIpOworCisgICAgICAgIGlmIChyZWdleC0+cmVnZXggPT0gTlVMTCkgeworICAgICAgICAgICAgbmd4X2NvbmZfbG9nX2Vycm9yKE5HWF9MT0dfRU1FUkcsIGNmLCAwLCAiJXMiLCBlcnIuZGF0YSk7CisgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICByZWdleC0+Y29kZSA9IG5neF9odHRwX3Jld3JpdGVfcmVnZXhfc3RhcnRfY29kZTsKKyAgICAgICAgcmVnZXgtPnNpemUgPSAwOworICAgICAgICByZWdleC0+bmNhcHR1cmVzID0gMDsKKyAgICAgICAgcmVnZXgtPnN0YXR1cyA9IDA7CisgICAgICAgIHJlZ2V4LT5uZXh0ID0gc2l6ZW9mKG5neF9odHRwX3Jld3JpdGVfcmVnZXhfY29kZV90KTsKKyAgICAgICAgcmVnZXgtPnRlc3QgPSAxOworICAgICAgICByZWdleC0+dXJpID0gMDsKKyAgICAgICAgcmVnZXgtPmFyZ3MgPSAwOworICAgICAgICByZWdleC0+cmVkaXJlY3QgPSAwOworICAgICAgICByZWdleC0+bmFtZSA9IHZhbHVlW2xhc3RdOworCisgICAgICAgIHJldHVybiBOR1hfQ09ORl9PSzsKKyAgICB9CisKKyAgICBuZ3hfY29uZl9sb2dfZXJyb3IoTkdYX0xPR19FTUVSRywgY2YsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIGNvbmRpdGlvbiBcIiVWXCIiLCAmdmFsdWVbY3VyXSk7CisKKyAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7Cit9CisKKworc3RhdGljIGNoYXIgKgorbmd4X2h0dHBfcmV3cml0ZV92YXJpYWJsZShuZ3hfY29uZl90ICpjZiwgbmd4X2h0dHBfcmV3cml0ZV9sb2NfY29uZl90ICpsY2YsCisgICAgbmd4X3N0cl90ICp2YWx1ZSkKK3sKKyAgICBuZ3hfaHR0cF92YXJpYWJsZV90ICAgICAgICAgICp2YXI7CisgICAgbmd4X2h0dHBfcmV3cml0ZV9jb2RlX3B0ICAgICAqY29kZTsKKyAgICBuZ3hfaHR0cF9yZXdyaXRlX3Zhcl9jb2RlX3QgICp2YXJfY29kZTsKKworICAgIHZhbHVlLT5sZW4tLTsKKyAgICB2YWx1ZS0+ZGF0YSsrOworCisgICAgaWYgKHZhbHVlLT5sZW4gPT0gc2l6ZW9mKCJpbnZhbGlkX3JlZmVyZXIiKSAtIDEKKyAgICAgICAgJiYgbmd4X3N0cm5jbXAodmFsdWUtPmRhdGEsICJpbnZhbGlkX3JlZmVyZXIiLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoImludmFsaWRfcmVmZXJlciIpIC0gMSkgPT0gMCkKKyAgICB7CisgICAgICAgIGNvZGUgPSBuZ3hfaHR0cF9yZXdyaXRlX3N0YXJ0X2NvZGUoY2YtPnBvb2wsICZsY2YtPmNvZGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfaHR0cF9yZXdyaXRlX2NvZGVfcHQpKTsKKyAgICAgICAgaWYgKGNvZGUgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgKmNvZGUgPSBuZ3hfaHR0cF9yZXdyaXRlX2ludmFsaWRfcmVmZXJlcl9jb2RlOworCisgICAgfSBlbHNlIHsKKyAgICAgICAgdmFyID0gbmd4X2h0dHBfYWRkX3ZhcmlhYmxlKGNmLCB2YWx1ZSwgMCk7CisKKyAgICAgICAgaWYgKHZhciA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICB2YXJfY29kZSA9IG5neF9odHRwX3Jld3JpdGVfc3RhcnRfY29kZShjZi0+cG9vbCwgJmxjZi0+Y29kZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5neF9odHRwX3Jld3JpdGVfdmFyX2NvZGVfdCkpOworICAgICAgICBpZiAodmFyX2NvZGUgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgdmFyX2NvZGUtPmNvZGUgPSBuZ3hfaHR0cF9yZXdyaXRlX3Zhcl9jb2RlOworICAgICAgICB2YXJfY29kZS0+aW5kZXggPSB2YXItPmluZGV4OworICAgIH0KKworICAgIHJldHVybiBOR1hfQ09ORl9PSzsKK30KKworCitzdGF0aWMgY2hhciAqCiBuZ3hfaHR0cF9yZXdyaXRlX3ZhbGlkX3JlZmVyZXJzKG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpjbWQsIHZvaWQgKmNvbmYpCiB7CiAgICAgbmd4X2h0dHBfcmV3cml0ZV9sb2NfY29uZl90ICpsY2YgPSBjb25mOwpAQCAtMTIzNCw3ICsxNTQ1LDggQEAKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKCEocmVmID0gbmd4X2FycmF5X3B1c2gobGNmLT5yZWZlcmVycykpKSB7CisgICAgICAgIHJlZiA9IG5neF9hcnJheV9wdXNoKGxjZi0+cmVmZXJlcnMpOworICAgICAgICBpZiAocmVmID09IE5VTEwpIHsKICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICAgICAgfQogCkBAIC0xMjYxLDEyICsxNTczLDE0IEBACiAKICAgICBzbiA9IGNzY2YtPnNlcnZlcl9uYW1lcy5lbHRzOwogICAgIGZvciAoaSA9IDA7IGkgPCBjc2NmLT5zZXJ2ZXJfbmFtZXMubmVsdHM7IGkrKykgewotICAgICAgICBpZiAoIShyZWYgPSBuZ3hfYXJyYXlfcHVzaChsY2YtPnJlZmVyZXJzKSkpIHsKKyAgICAgICAgcmVmID0gbmd4X2FycmF5X3B1c2gobGNmLT5yZWZlcmVycyk7CisgICAgICAgIGlmIChyZWYgPT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgICAgICB9CiAKICAgICAgICAgcmVmLT5uYW1lLmxlbiA9IHNuW2ldLm5hbWUubGVuICsgMTsKLSAgICAgICAgaWYgKCEocmVmLT5uYW1lLmRhdGEgPSBuZ3hfcGFsbG9jKGNmLT5wb29sLCByZWYtPm5hbWUubGVuKSkpIHsKKyAgICAgICAgcmVmLT5uYW1lLmRhdGEgPSBuZ3hfcGFsbG9jKGNmLT5wb29sLCByZWYtPm5hbWUubGVuKTsKKyAgICAgICAgaWYgKHJlZi0+bmFtZS5kYXRhID09IE5VTEwpIHsKICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICAgICAgfQogCkBAIC0xMjc5LDExICsxNTkzLDcyIEBACiB9CiAKIAorc3RhdGljIGNoYXIgKgorbmd4X2h0dHBfcmV3cml0ZV9zZXQobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwgdm9pZCAqY29uZikKK3sKKyAgICBuZ3hfaHR0cF9yZXdyaXRlX2xvY19jb25mX3QgKmxjZiA9IGNvbmY7CisKKyAgICBuZ3hfaW50X3QgICAgICAgICAgICAgICAgICAgICAgIG47CisgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgICAgICp2YWx1ZTsKKyAgICBuZ3hfaHR0cF92YXJpYWJsZV90ICAgICAgICAgICAgKnY7CisgICAgbmd4X2h0dHBfcmV3cml0ZV92YXJfY29kZV90ICAgICp2YXI7CisgICAgbmd4X2h0dHBfcmV3cml0ZV92YWx1ZV9jb2RlX3QgICp2YWw7CisKKyAgICB2YWx1ZSA9IGNmLT5hcmdzLT5lbHRzOworCisgICAgaWYgKHZhbHVlWzFdLmRhdGFbMF0gIT0gJyQnKSB7CisgICAgICAgIG5neF9jb25mX2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBjZiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIHZhcmlhYmxlIG5hbWUgXCIlVlwiIiwgJnZhbHVlWzFdKTsKKyAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgIH0KKworICAgIHZhbHVlWzFdLmxlbi0tOworICAgIHZhbHVlWzFdLmRhdGErKzsKKworICAgIHYgPSBuZ3hfaHR0cF9hZGRfdmFyaWFibGUoY2YsICZ2YWx1ZVsxXSwgMSk7CisgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgfQorCisgICAgdi0+aGFuZGxlciA9IG5neF9odHRwX3Jld3JpdGVfdmFyOworICAgIHYtPmRhdGEgPSB2LT5pbmRleDsKKworICAgIHZhbCA9IG5neF9odHRwX3Jld3JpdGVfc3RhcnRfY29kZShjZi0+cG9vbCwgJmxjZi0+Y29kZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfaHR0cF9yZXdyaXRlX3ZhbHVlX2NvZGVfdCkpOworICAgIGlmICh2YWwgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgfQorCisgICAgbiA9IG5neF9hdG9pKHZhbHVlWzJdLmRhdGEsIHZhbHVlWzJdLmxlbik7CisKKyAgICBpZiAobiA9PSBOR1hfRVJST1IpIHsKKyAgICAgICAgbiA9IDA7CisgICAgfQorCisgICAgdmFsLT5jb2RlID0gbmd4X2h0dHBfcmV3cml0ZV92YWx1ZV9jb2RlOworICAgIHZhbC0+dmFsdWUgPSAodWludHB0cl90KSBuOworICAgIHZhbC0+dGV4dF9sZW4gPSAodWludHB0cl90KSB2YWx1ZVsyXS5sZW47CisgICAgdmFsLT50ZXh0X2RhdGEgPSAodWludHB0cl90KSB2YWx1ZVsyXS5kYXRhOworCisgICAgdmFyID0gbmd4X2h0dHBfcmV3cml0ZV9zdGFydF9jb2RlKGNmLT5wb29sLCAmbGNmLT5jb2RlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5neF9odHRwX3Jld3JpdGVfdmFyX2NvZGVfdCkpOworICAgIGlmICh2YXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgfQorCisgICAgdmFyLT5jb2RlID0gbmd4X2h0dHBfcmV3cml0ZV9zZXRfdmFyX2NvZGU7CisgICAgdmFyLT5pbmRleCA9ICh1aW50cHRyX3QpIHYtPmluZGV4OworCisgICAgcmV0dXJuIE5HWF9DT05GX09LOworfQorCisKIHN0YXRpYyB2b2lkICoKIG5neF9odHRwX3Jld3JpdGVfc3RhcnRfY29kZShuZ3hfcG9vbF90ICpwb29sLCBuZ3hfYXJyYXlfdCAqKmNvZGVzLCBzaXplX3Qgc2l6ZSkKIHsKICAgICBpZiAoKmNvZGVzID09IE5VTEwpIHsKLSAgICAgICAgaWYgKCEoKmNvZGVzID0gbmd4X2FycmF5X2NyZWF0ZShwb29sLCAyNTYsIDEpKSkgeworICAgICAgICAqY29kZXMgPSBuZ3hfYXJyYXlfY3JlYXRlKHBvb2wsIDI1NiwgMSk7CisgICAgICAgIGlmICgqY29kZXMgPT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMzAwLDcgKzE2NzUsOCBAQAogCiAgICAgZWx0cyA9IGNvZGVzLT5lbHRzOwogCi0gICAgaWYgKCEobmV3ID0gbmd4X2FycmF5X3B1c2hfbihjb2Rlcywgc2l6ZSkpKSB7CisgICAgbmV3ID0gbmd4X2FycmF5X3B1c2hfbihjb2Rlcywgc2l6ZSk7CisgICAgaWYgKG5ldyA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfc3NpX2ZpbHRlci5jIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9zc2lfZmlsdGVyX21vZHVsZS5jCnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIHNyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfc3NpX2ZpbHRlci5jCnJlbmFtZSB0byBzcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3NzaV9maWx0ZXJfbW9kdWxlLmMKaW5kZXggY2E4NzdhYy4uYTM1MTc0NyAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9zc2lfZmlsdGVyLmMKKysrIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9zc2lfZmlsdGVyX21vZHVsZS5jCkBAIC05OCw4ICs5OCw2IEBACiB9IG5neF9odHRwX3NzaV9zdGF0ZV9lOwogCiAKLXN0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfc3NpX2Vycm9yKG5neF9odHRwX3JlcXVlc3RfdCAqciwKLSAgICBuZ3hfaHR0cF9zc2lfY3R4X3QgKmN0eCk7CiBzdGF0aWMgbmd4X2ludF90IG5neF9odHRwX3NzaV9wYXJzZShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCiAgICAgbmd4X2h0dHBfc3NpX2N0eF90ICpjdHgpOwogCkBAIC0xMTQ3LDIxICsxMTQ1LDI1IEBACiBuZ3hfaHR0cF9zc2lfZWNobyhuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIG5neF9odHRwX3NzaV9jdHhfdCAqY3R4LAogICAgIG5neF9zdHJfdCAqKnBhcmFtcykKIHsKKyAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgaTsKICAgICBuZ3hfYnVmX3QgICAgICAgICAgICAgICAgICAqYjsKICAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgICAqdmFyLCAqdmFsdWU7CiAgICAgbmd4X2NoYWluX3QgICAgICAgICAgICAgICAgKmNsOwotICAgIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgICp2OworICAgIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgICp2djsKIAogICAgIHZhciA9IHBhcmFtc1tOR1hfSFRUUF9TU0lfRUNIT19WQVJdOwotICAgIHZhbHVlID0gTlVMTDsKIAotICAgIHYgPSBuZ3hfaHR0cF9nZXRfdmFyaWFibGUociwgdmFyKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgdmFyLT5sZW47IGkrKykgeworICAgICAgICB2YXItPmRhdGFbaV0gPSBuZ3hfdG91cHBlcih2YXItPmRhdGFbaV0pOworICAgIH0KIAotICAgIGlmICh2ID09IE5VTEwpIHsKKyAgICB2diA9IG5neF9odHRwX2dldF92YXJpYWJsZShyLCB2YXIpOworCisgICAgaWYgKHZ2ID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5HWF9IVFRQX1NTSV9FUlJPUjsKICAgICB9CiAKLSAgICBpZiAodiA9PSBOR1hfSFRUUF9WQVJJQUJMRV9OT1RfRk9VTkQpIHsKKyAgICBpZiAodnYgPT0gTkdYX0hUVFBfVkFSSUFCTEVfTk9UX0ZPVU5EKSB7CiAgICAgICAgIHZhbHVlID0gcGFyYW1zW05HWF9IVFRQX1NTSV9FQ0hPX0RFRkFVTFRdOwogCiAgICAgICAgIGlmICh2YWx1ZSA9PSBOVUxMKSB7CkBAIC0xMTcyLDcgKzExNzQsNyBAQAogICAgICAgICB9CiAKICAgICB9IGVsc2UgewotICAgICAgICB2YWx1ZSA9ICZ2LT50ZXh0OworICAgICAgICB2YWx1ZSA9ICZ2di0+dGV4dDsKIAogICAgICAgICBpZiAodmFsdWUtPmxlbiA9PSAwKSB7CiAgICAgICAgICAgICByZXR1cm4gTkdYX09LOwpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9zc2xfbW9kdWxlLmMgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3NzbF9tb2R1bGUuYwppbmRleCA4ODNlNDRmLi4xYzQxMjhjIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3NzbF9tb2R1bGUuYworKysgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3NzbF9tb2R1bGUuYwpAQCAtMTksNyArMTksNyBAQAogc3RhdGljIGNoYXIgKm5neF9odHRwX3NzbF9pbml0X21haW5fY29uZihuZ3hfY29uZl90ICpjZiwgdm9pZCAqY29uZik7CiBzdGF0aWMgdm9pZCAqbmd4X2h0dHBfc3NsX2NyZWF0ZV9zcnZfY29uZihuZ3hfY29uZl90ICpjZik7CiBzdGF0aWMgY2hhciAqbmd4X2h0dHBfc3NsX21lcmdlX3Nydl9jb25mKG5neF9jb25mX3QgKmNmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwYXJlbnQsIHZvaWQgKmNoaWxkKTsKKyAgICB2b2lkICpwYXJlbnQsIHZvaWQgKmNoaWxkKTsKIAogCiBzdGF0aWMgbmd4X2NvbW1hbmRfdCAgbmd4X2h0dHBfc3NsX2NvbW1hbmRzW10gPSB7CkBAIC04NywxMSArODcsMTMgQEAKIH07CiAKIAotc3RhdGljIHZvaWQgKm5neF9odHRwX3NzbF9jcmVhdGVfbWFpbl9jb25mKG5neF9jb25mX3QgKmNmKQorc3RhdGljIHZvaWQgKgorbmd4X2h0dHBfc3NsX2NyZWF0ZV9tYWluX2NvbmYobmd4X2NvbmZfdCAqY2YpCiB7CiAgICAgbmd4X2h0dHBfc3NsX21haW5fY29uZl90ICAqbWNmOwogCi0gICAgaWYgKCEobWNmID0gbmd4X3BjYWxsb2MoY2YtPnBvb2wsIHNpemVvZihuZ3hfaHR0cF9zc2xfbWFpbl9jb25mX3QpKSkpIHsKKyAgICBtY2YgPSBuZ3hfcGNhbGxvYyhjZi0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX3NzbF9tYWluX2NvbmZfdCkpOworICAgIGlmIChtY2YgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgfQogCkBAIC0xMDYsNyArMTA4LDggQEAKIH0KIAogCi1zdGF0aWMgY2hhciAqbmd4X2h0dHBfc3NsX2luaXRfbWFpbl9jb25mKG5neF9jb25mX3QgKmNmLCB2b2lkICpjb25mKQorc3RhdGljIGNoYXIgKgorbmd4X2h0dHBfc3NsX2luaXRfbWFpbl9jb25mKG5neF9jb25mX3QgKmNmLCB2b2lkICpjb25mKQogewogICAgIG5neF9odHRwX3NzbF9tYWluX2NvbmZfdCAqbWNmID0gY29uZjsKIApAQCAtMTM3LDExICsxNDAsMTMgQEAKIH0KIAogCi1zdGF0aWMgdm9pZCAqbmd4X2h0dHBfc3NsX2NyZWF0ZV9zcnZfY29uZihuZ3hfY29uZl90ICpjZikKK3N0YXRpYyB2b2lkICoKK25neF9odHRwX3NzbF9jcmVhdGVfc3J2X2NvbmYobmd4X2NvbmZfdCAqY2YpCiB7CiAgICAgbmd4X2h0dHBfc3NsX3Nydl9jb25mX3QgICpzY2Y7CiAKLSAgICBpZiAoIShzY2YgPSBuZ3hfcGNhbGxvYyhjZi0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX3NzbF9zcnZfY29uZl90KSkpKSB7CisgICAgc2NmID0gbmd4X3BjYWxsb2MoY2YtPnBvb2wsIHNpemVvZihuZ3hfaHR0cF9zc2xfc3J2X2NvbmZfdCkpOworICAgIGlmIChzY2YgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgfQogCkBAIC0xNjIsOCArMTY3LDggQEAKIH0KIAogCi1zdGF0aWMgY2hhciAqbmd4X2h0dHBfc3NsX21lcmdlX3Nydl9jb25mKG5neF9jb25mX3QgKmNmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwYXJlbnQsIHZvaWQgKmNoaWxkKQorc3RhdGljIGNoYXIgKgorbmd4X2h0dHBfc3NsX21lcmdlX3Nydl9jb25mKG5neF9jb25mX3QgKmNmLCB2b2lkICpwYXJlbnQsIHZvaWQgKmNoaWxkKQogewogICAgIG5neF9odHRwX3NzbF9zcnZfY29uZl90ICpwcmV2ID0gcGFyZW50OwogICAgIG5neF9odHRwX3NzbF9zcnZfY29uZl90ICpjb25mID0gY2hpbGQ7CkBAIC0yMjYsNyArMjMxLDggQEAKIAogI2lmIDAKIAotc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9zc2xfaW5pdF9wcm9jZXNzKG5neF9jeWNsZV90ICpjeWNsZSkKK3N0YXRpYyBuZ3hfaW50X3QKK25neF9odHRwX3NzbF9pbml0X3Byb2Nlc3Mobmd4X2N5Y2xlX3QgKmN5Y2xlKQogewogICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICAgaTsKICAgICBuZ3hfaHR0cF9zc2xfc3J2X2NvbmZfdCAgICAgKnNzY2Y7CmRpZmYgLS1naXQgYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3NzbF9tb2R1bGUuaCBiL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfc3NsX21vZHVsZS5oCmluZGV4IDg3MTY2ODcuLmJmNjAzNjYgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfc3NsX21vZHVsZS5oCisrKyBiL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfc3NsX21vZHVsZS5oCkBAIC0zMiw3ICszMiw3IEBACiBuZ3hfaW50X3Qgbmd4X2h0dHBfc3NsX3JlYWQobmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1X2NoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpOwogbmd4X2ludF90IG5neF9odHRwX3NzbF9zaHV0ZG93bihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpOwogbmd4X2NoYWluX3QgKm5neF9odHRwX3NzbF93cml0ZShuZ3hfY29ubmVjdGlvbl90ICpjLCBuZ3hfY2hhaW5fdCAqaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZl90IGxpbWl0KTsKKyAgICBvZmZfdCBsaW1pdCk7CiAKIHZvaWQgbmd4X2h0dHBfc3NsX2Nsb3NlX2Nvbm5lY3Rpb24oU1NMICpzc2wsIG5neF9sb2dfdCAqbG9nKTsKIApkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9zdGF0aWNfaGFuZGxlci5jIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9zdGF0aWNfbW9kdWxlLmMKc2ltaWxhcml0eSBpbmRleCA5MyUKcmVuYW1lIGZyb20gc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9zdGF0aWNfaGFuZGxlci5jCnJlbmFtZSB0byBzcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3N0YXRpY19tb2R1bGUuYwppbmRleCA0ZjBmOTZkLi5jMmM0NTgyIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3N0YXRpY19oYW5kbGVyLmMKKysrIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9zdGF0aWNfbW9kdWxlLmMKQEAgLTc1LDEwICs3NSwxMyBAQAogICAgIG5neF9idWZfdCAgICAgICAgICAgICAgICAgICAqYjsKICAgICBuZ3hfY2hhaW5fdCAgICAgICAgICAgICAgICAgIG91dDsKICAgICBuZ3hfZmlsZV9pbmZvX3QgICAgICAgICAgICAgIGZpOwotICAgIG5neF9odHRwX2NsZWFudXBfdCAgICAgICAgICAqZmlsZV9jbGVhbnVwLCAqcmVkaXJlY3RfY2xlYW51cDsKLSAgICBuZ3hfaHR0cF9jb3JlX2xvY19jb25mX3QgICAgKmNsY2Y7Ci0gICAgbmd4X2h0dHBfc3RhdGljX2xvY19jb25mX3QgICpzbGNmOworICAgIG5neF9odHRwX2NsZWFudXBfdCAgICAgICAgICAqZmlsZV9jbGVhbnVwOwogI2lmIChOR1hfSFRUUF9DQUNIRSkKKyAgICBuZ3hfaHR0cF9jbGVhbnVwX3QgICAgICAgICAgKnJlZGlyZWN0X2NsZWFudXA7CisjZW5kaWYKKyAgICBuZ3hfaHR0cF9jb3JlX2xvY19jb25mX3QgICAgKmNsY2Y7CisjaWYgKE5HWF9IVFRQX0NBQ0hFKQorICAgIG5neF9odHRwX3N0YXRpY19sb2NfY29uZl90ICAqc2xjZjsKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgIGZpbGVfY3JjLCByZWRpcmVjdF9jcmM7CiAgICAgbmd4X2h0dHBfY2FjaGVfdCAgICAgICAgICAgICpmaWxlLCAqcmVkaXJlY3Q7CiAjZW5kaWYKQEAgLTE3NiwxNCArMTc5LDE4IEBACiAKICAgICAvKiBhbGxvY2F0ZSBjbGVhbnVwcyAqLwogCi0gICAgaWYgKCEoZmlsZV9jbGVhbnVwID0gbmd4X3B1c2hfYXJyYXkoJnItPmNsZWFudXApKSkgeworICAgIGZpbGVfY2xlYW51cCA9IG5neF9hcnJheV9wdXNoKCZyLT5jbGVhbnVwKTsKKyAgICBpZiAoZmlsZV9jbGVhbnVwID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKICAgICB9CiAgICAgZmlsZV9jbGVhbnVwLT52YWxpZCA9IDA7CiAKKyNpZiAoTkdYX0hUVFBfQ0FDSEUpCisKICAgICBzbGNmID0gbmd4X2h0dHBfZ2V0X21vZHVsZV9sb2NfY29uZihyLCBuZ3hfaHR0cF9zdGF0aWNfbW9kdWxlKTsKICAgICBpZiAoc2xjZi0+cmVkaXJlY3RfY2FjaGUpIHsKLSAgICAgICAgaWYgKCEocmVkaXJlY3RfY2xlYW51cCA9IG5neF9wdXNoX2FycmF5KCZyLT5jbGVhbnVwKSkpIHsKKyAgICAgICAgcmVkaXJlY3RfY2xlYW51cCA9IG5neF9hcnJheV9wdXNoKCZyLT5jbGVhbnVwKTsKKyAgICAgICAgaWYgKHJlZGlyZWN0X2NsZWFudXAgPT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKICAgICAgICAgfQogICAgICAgICByZWRpcmVjdF9jbGVhbnVwLT52YWxpZCA9IDA7CkBAIC0xOTIsOCArMTk5LDYgQEAKICAgICAgICAgcmVkaXJlY3RfY2xlYW51cCA9IE5VTEw7CiAgICAgfQogCi0jaWYgKE5HWF9IVFRQX0NBQ0hFKQotCiAgICAgLyogbG9vayB1cCBhbiBvcGVuIGZpbGVzIGNhY2hlICovCiAKICAgICBpZiAoY2xjZi0+b3Blbl9maWxlcykgewpAQCAtMjMyLDkgKzIzNyw5IEBACiAgICAgICAgICAgICAgKiBzaG91bGQga2VlcCBtb3JlIHBvcHVsYXIgcmVkaXJlY3RzIGluIGNhY2hlLgogICAgICAgICAgICAgICovCiAKLSAgICAgICAgICAgIGlmICghKHItPmhlYWRlcnNfb3V0LmxvY2F0aW9uID0KLSAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9hZGRfaGVhZGVyKCZyLT5oZWFkZXJzX291dCwgbmd4X2h0dHBfaGVhZGVyc19vdXQpKSkKLSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHItPmhlYWRlcnNfb3V0LmxvY2F0aW9uID0gbmd4X2h0dHBfYWRkX2hlYWRlcigmci0+aGVhZGVyc19vdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfaGVhZGVyc19vdXQpOworICAgICAgICAgICAgaWYgKHItPmhlYWRlcnNfb3V0LmxvY2F0aW9uID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwogICAgICAgICAgICAgfQogCkBAIC0yODMsOSArMjg4LDkgQEAKICAgICAgICAgICAgIG5neF9sb2dfZGVidWcxKE5HWF9MT0dfREVCVUdfSFRUUCwgbG9nLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhUVFAgRElSOiBcIiVzXCIiLCBuYW1lLmRhdGEpOwogCi0gICAgICAgICAgICBpZiAoIShyLT5oZWFkZXJzX291dC5sb2NhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfYWRkX2hlYWRlcigmci0+aGVhZGVyc19vdXQsIG5neF9odHRwX2hlYWRlcnNfb3V0KSkpCi0gICAgICAgICAgICB7CisgICAgICAgICAgICByLT5oZWFkZXJzX291dC5sb2NhdGlvbiA9IG5neF9odHRwX2FkZF9oZWFkZXIoJnItPmhlYWRlcnNfb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX2hlYWRlcnNfb3V0KTsKKyAgICAgICAgICAgIGlmIChyLT5oZWFkZXJzX291dC5sb2NhdGlvbiA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKICAgICAgICAgICAgIH0KIApAQCAtNTA2LDExICs1MTEsMTMgQEAKICAgICBpZiAoIXItPmhlYWRlcl9vbmx5KSB7CiAgICAgICAgIC8qIHdlIG5lZWQgdG8gYWxsb2NhdGUgYWxsIGJlZm9yZSB0aGUgaGVhZGVyIHdvdWxkIGJlIHNlbnQgKi8KIAotICAgICAgICBpZiAoIShiID0gbmd4X3BjYWxsb2Moci0+cG9vbCwgc2l6ZW9mKG5neF9idWZfdCkpKSkgeworICAgICAgICBiID0gbmd4X3BjYWxsb2Moci0+cG9vbCwgc2l6ZW9mKG5neF9idWZfdCkpOworICAgICAgICBpZiAoYiA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKCEoYi0+ZmlsZSA9IG5neF9wY2FsbG9jKHItPnBvb2wsIHNpemVvZihuZ3hfZmlsZV90KSkpKSB7CisgICAgICAgIGItPmZpbGUgPSBuZ3hfcGNhbGxvYyhyLT5wb29sLCBzaXplb2Yobmd4X2ZpbGVfdCkpOworICAgICAgICBpZiAoYi0+ZmlsZSA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwogICAgICAgICB9CiAKQEAgLTU0Nyw3ICs1NTQsOCBAQAogewogICAgIG5neF9odHRwX3N0YXRpY19sb2NfY29uZl90ICAqY29uZjsKIAotICAgIGlmICghKGNvbmYgPSBuZ3hfcGFsbG9jKGNmLT5wb29sLCBzaXplb2Yobmd4X2h0dHBfc3RhdGljX2xvY19jb25mX3QpKSkpIHsKKyAgICBjb25mID0gbmd4X3BhbGxvYyhjZi0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX3N0YXRpY19sb2NfY29uZl90KSk7CisgICAgaWYgKGNvbmYgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgfQogCkBAIC01NzgsNyArNTg2LDcgQEAKIAogICAgIGNtY2YgPSBuZ3hfaHR0cF9jeWNsZV9nZXRfbW9kdWxlX21haW5fY29uZihjeWNsZSwgbmd4X2h0dHBfY29yZV9tb2R1bGUpOwogICAgIAotICAgIGggPSBuZ3hfcHVzaF9hcnJheSgmY21jZi0+cGhhc2VzW05HWF9IVFRQX0NPTlRFTlRfUEhBU0VdLmhhbmRsZXJzKTsKKyAgICBoID0gbmd4X2FycmF5X3B1c2goJmNtY2YtPnBoYXNlc1tOR1hfSFRUUF9DT05URU5UX1BIQVNFXS5oYW5kbGVycyk7CiAgICAgaWYgKGggPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfc3RhdHVzX2hhbmRsZXIuYyBiL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfc3RhdHVzX21vZHVsZS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3N0YXR1c19oYW5kbGVyLmMKcmVuYW1lIHRvIHNyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfc3RhdHVzX21vZHVsZS5jCmRpZmYgLS1naXQgYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3N0dWJfc3RhdHVzX21vZHVsZS5jIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9zdHViX3N0YXR1c19tb2R1bGUuYwppbmRleCA3ZWVlZjU5Li4xYTAxYmNlIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3N0dWJfc3RhdHVzX21vZHVsZS5jCisrKyBiL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfc3R1Yl9zdGF0dXNfbW9kdWxlLmMKQEAgLTg4LDcgKzg4LDggQEAKICAgICAgICAgICAgKyA2ICsgMyAqIE5HWF9BVE9NSUNfVF9MRU4KICAgICAgICAgICAgKyBzaXplb2YoIlJlYWRpbmc6ICBXcml0aW5nOiAgV2FpdGluZzogIFxuIikgKyAzICogTkdYX0FUT01JQ19UX0xFTjsKIAotICAgIGlmICghKGIgPSBuZ3hfY3JlYXRlX3RlbXBfYnVmKHItPnBvb2wsIHNpemUpKSkgeworICAgIGIgPSBuZ3hfY3JlYXRlX3RlbXBfYnVmKHItPnBvb2wsIHNpemUpOworICAgIGlmIChiID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfdXNlcmlkX2ZpbHRlci5jIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF91c2VyaWRfZmlsdGVyX21vZHVsZS5jCnNpbWlsYXJpdHkgaW5kZXggOTklCnJlbmFtZSBmcm9tIHNyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfdXNlcmlkX2ZpbHRlci5jCnJlbmFtZSB0byBzcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3VzZXJpZF9maWx0ZXJfbW9kdWxlLmMKaW5kZXggZWE0OWY5Mi4uNjJkNDBhYyAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF91c2VyaWRfZmlsdGVyLmMKKysrIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF91c2VyaWRfZmlsdGVyX21vZHVsZS5jCkBAIC02MTgsNyArNjE4LDcgQEAKICAgICB9CiAKICAgICBwID0gbmd4X2NweW1lbShuZXcsICI7IGRvbWFpbj0iLCBzaXplb2YoIjsgZG9tYWluPSIpIC0gMSk7Ci0gICAgcCA9IG5neF9jcHltZW0ocCwgZG9tYWluLT5kYXRhLCBkb21haW4tPmxlbik7CisgICAgbmd4X21lbWNweShwLCBkb21haW4tPmRhdGEsIGRvbWFpbi0+bGVuKTsKIAogICAgIGRvbWFpbi0+bGVuICs9IHNpemVvZigiOyBkb21haW49IikgLSAxOwogICAgIGRvbWFpbi0+ZGF0YSA9IG5ldzsKQEAgLTY0MCw3ICs2NDAsNyBAQAogICAgIH0KIAogICAgIHAgPSBuZ3hfY3B5bWVtKG5ldywgIjsgcGF0aD0iLCBzaXplb2YoIjsgcGF0aD0iKSAtIDEpOwotICAgIHAgPSBuZ3hfY3B5bWVtKHAsIHBhdGgtPmRhdGEsIHBhdGgtPmxlbik7CisgICAgbmd4X21lbWNweShwLCBwYXRoLT5kYXRhLCBwYXRoLT5sZW4pOwogCiAgICAgcGF0aC0+bGVuICs9IHNpemVvZigiOyBwYXRoPSIpIC0gMTsKICAgICBwYXRoLT5kYXRhID0gbmV3OwpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbW9kdWxlcy9wcm94eS9uZ3hfaHR0cF9wcm94eV9oYW5kbGVyLmMgYi9zcmMvaHR0cC9tb2R1bGVzL3Byb3h5L25neF9odHRwX3Byb3h5X2hhbmRsZXIuYwppbmRleCBkMjEzZDY5Li5lZGFkMjJjIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9tb2R1bGVzL3Byb3h5L25neF9odHRwX3Byb3h5X2hhbmRsZXIuYworKysgYi9zcmMvaHR0cC9tb2R1bGVzL3Byb3h5L25neF9odHRwX3Byb3h5X2hhbmRsZXIuYwpAQCAtMTEsNyArMTEsOSBAQAogCiAKIHN0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfcHJveHlfaGFuZGxlcihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpOworI2lmIDAKIHN0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfcHJveHlfY2FjaGVfZ2V0KG5neF9odHRwX3Byb3h5X2N0eF90ICpwKTsKKyNlbmRpZgogCiBzdGF0aWMgc2l6ZV90IG5neF9odHRwX3Byb3h5X2xvZ19wcm94eV9zdGF0ZV9nZXRsZW4obmd4X2h0dHBfcmVxdWVzdF90ICpyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnRwdHJfdCBkYXRhKTsKQEAgLTMzLDggKzM1LDYgQEAKIAogc3RhdGljIGNoYXIgKm5neF9odHRwX3Byb3h5X3NldF9wYXNzKG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpjbWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY29uZik7Ci1zdGF0aWMgY2hhciAqbmd4X2h0dHBfcHJveHlfcGFyc2VfdXBzdHJlYW0obmd4X3N0cl90ICp1cmwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfcHJveHlfdXBzdHJlYW1fY29uZl90ICp1KTsKIAogc3RhdGljIGNoYXIgKm5neF9odHRwX3Byb3h5X3NldF94X3ZhcihuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqY21kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjb25mKTsKQEAgLTM2MiwxMyArMzYyLDIwIEBACiB9OwogCiAKK3N0YXRpYyBuZ3hfc3RyX3Qgbmd4X2h0dHBfcHJveHlfdXJpID0gbmd4X3N0cmluZygiLyIpOworCisKIHN0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfcHJveHlfaGFuZGxlcihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpCiB7CiAgICAgbmd4X2h0dHBfcHJveHlfY3R4X3QgICpwOwogCi0gICAgbmd4X2h0dHBfY3JlYXRlX2N0eChyLCBwLCBuZ3hfaHR0cF9wcm94eV9tb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yobmd4X2h0dHBfcHJveHlfY3R4X3QpLAotICAgICAgICAgICAgICAgICAgICAgICAgTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SKTsKKyAgICBwID0gbmd4X3BjYWxsb2Moci0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX3Byb3h5X2N0eF90KSk7CisgICAgaWYgKHAgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOworICAgIH0KKworICAgIG5neF9odHRwX3NldF9jdHgociwgcCwgbmd4X2h0dHBfcHJveHlfbW9kdWxlKTsKKwogCiAgICAgcC0+bGNmID0gbmd4X2h0dHBfZ2V0X21vZHVsZV9sb2NfY29uZihyLCBuZ3hfaHR0cF9wcm94eV9tb2R1bGUpOwogICAgIHAtPnJlcXVlc3QgPSByOwpAQCAtMzgyLDcgKzM4OSw4IEBACiAgICAgICAgIHJldHVybiBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7CiAgICAgfQogCi0gICAgaWYgKCEocC0+c3RhdGUgPSBuZ3hfYXJyYXlfcHVzaCgmcC0+c3RhdGVzKSkpIHsKKyAgICBwLT5zdGF0ZSA9IG5neF9hcnJheV9wdXNoKCZwLT5zdGF0ZXMpOworICAgIGlmIChwLT5zdGF0ZSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7CiAgICAgfQogCkBAIC00MzksNyArNDQ3LDggQEAKICAgICB1ID0gcC0+bGNmLT51cHN0cmVhbTsKIAogICAgIGN0eC5rZXkubGVuID0gdS0+dXJsLmxlbiArIHItPnVyaS5sZW4gLSB1LT5sb2NhdGlvbi0+bGVuICsgci0+YXJncy5sZW47Ci0gICAgaWYgKCEoY3R4LmtleS5kYXRhID0gbmd4X3BhbGxvYyhyLT5wb29sLCBjdHgua2V5LmxlbikpKSB7CisgICAgY3R4LmtleS5kYXRhID0gbmd4X3BhbGxvYyhyLT5wb29sLCBjdHgua2V5Lmxlbik7CisgICAgaWYgKGN0eC5rZXkuZGF0YSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7CiAgICAgfQogCkBAIC0xMDcyLDcgKzEwODEsOCBAQAogewogICAgIG5neF9odHRwX3Byb3h5X2xvY19jb25mX3QgICpjb25mOwogCi0gICAgaWYgKCEoY29uZiA9IG5neF9wY2FsbG9jKGNmLT5wb29sLCBzaXplb2Yobmd4X2h0dHBfcHJveHlfbG9jX2NvbmZfdCkpKSkgeworICAgIGNvbmYgPSBuZ3hfcGNhbGxvYyhjZi0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX3Byb3h5X2xvY19jb25mX3QpKTsKKyAgICBpZiAoY29uZiA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICB9CiAKQEAgLTEzMzIsNyArMTM0Miw4IEBACiAgICAgICAgIHVuaXhfdXBzdHJlYW0udXJsLmRhdGEgPSB1cmwtPmRhdGEgKyA3OwogICAgICAgICB1bml4X3Vwc3RyZWFtLnVyaV9wYXJ0ID0gMTsKIAotICAgICAgICBpZiAoIShsY2YtPnBlZXJzID0gbmd4X3VuaXhfdXBzdHJlYW1fcGFyc2UoY2YsICZ1bml4X3Vwc3RyZWFtKSkpIHsKKyAgICAgICAgbGNmLT5wZWVycyA9IG5neF91bml4X3Vwc3RyZWFtX3BhcnNlKGNmLCAmdW5peF91cHN0cmVhbSk7CisgICAgICAgIGlmIChsY2YtPnBlZXJzID09IE5VTEwpIHsKICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICAgICAgfQogCkBAIC0xMzU5LDcgKzEzNzAsOCBAQAogICAgICAgICBpbmV0X3Vwc3RyZWFtLmRlZmF1bHRfcG9ydF92YWx1ZSA9IDgwOwogICAgICAgICBpbmV0X3Vwc3RyZWFtLnVyaV9wYXJ0ID0gMTsKIAotICAgICAgICBpZiAoIShsY2YtPnBlZXJzID0gbmd4X2luZXRfdXBzdHJlYW1fcGFyc2UoY2YsICZpbmV0X3Vwc3RyZWFtKSkpIHsKKyAgICAgICAgbGNmLT5wZWVycyA9IG5neF9pbmV0X3Vwc3RyZWFtX3BhcnNlKGNmLCAmaW5ldF91cHN0cmVhbSk7CisgICAgICAgIGlmIChsY2YtPnBlZXJzID09IE5VTEwpIHsKICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICAgICAgfQogCkBAIC0xMzcyLDkgKzEzODQsMTQgQEAKIAogICAgIGNsY2YgPSBuZ3hfaHR0cF9jb25mX2dldF9tb2R1bGVfbG9jX2NvbmYoY2YsIG5neF9odHRwX2NvcmVfbW9kdWxlKTsKIAotICAgIGxjZi0+dXBzdHJlYW0tPmxvY2F0aW9uID0gJmNsY2YtPm5hbWU7CiAgICAgY2xjZi0+aGFuZGxlciA9IG5neF9odHRwX3Byb3h5X2hhbmRsZXI7CiAKKyNpZiAoTkdYX1BDUkUpCisgICAgbGNmLT51cHN0cmVhbS0+bG9jYXRpb24gPSBjbGNmLT5yZWdleCA/ICZuZ3hfaHR0cF9wcm94eV91cmkgOiAmY2xjZi0+bmFtZTsKKyNlbHNlCisgICAgbGNmLT51cHN0cmVhbS0+bG9jYXRpb24gPSAmY2xjZi0+bmFtZTsKKyNlbmRpZgorCiAgICAgaWYgKGNsY2YtPm5hbWUuZGF0YVtjbGNmLT5uYW1lLmxlbiAtIDFdID09ICcvJykgewogICAgICAgICBjbGNmLT5hdXRvX3JlZGlyZWN0ID0gMTsKICAgICB9CkBAIC0xNDA5LDcgKzE0MjYsOCBAQAogICAgIGZvciAoaSA9IDA7IGkgPCBjbWNmLT52YXJpYWJsZXMubmVsdHM7IGkrKykgewogICAgICAgICBpZiAobmd4X3N0cmNhc2VjbXAodmFyW2ldLm5hbWUuZGF0YSwgdmFsdWVbMV0uZGF0YSkgPT0gMCkgewogCi0gICAgICAgICAgICBpZiAoIShpbmRleCA9IG5neF9hcnJheV9wdXNoKGxjZi0+eF92YXJzKSkpIHsKKyAgICAgICAgICAgIGluZGV4ID0gbmd4X2FycmF5X3B1c2gobGNmLT54X3ZhcnMpOworICAgICAgICAgICAgaWYgKGluZGV4ID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9odHRwL21vZHVsZXMvcHJveHkvbmd4X2h0dHBfcHJveHlfaGVhZGVyLmMgYi9zcmMvaHR0cC9tb2R1bGVzL3Byb3h5L25neF9odHRwX3Byb3h5X2hlYWRlci5jCmluZGV4IDc4YWU2NTMuLmE0NmZmOWUgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL21vZHVsZXMvcHJveHkvbmd4X2h0dHBfcHJveHlfaGVhZGVyLmMKKysrIGIvc3JjL2h0dHAvbW9kdWxlcy9wcm94eS9uZ3hfaHR0cF9wcm94eV9oZWFkZXIuYwpAQCAtODcsNyArODcsOCBAQAogCiAgICAgICAgIC8qIGNvcHkgc29tZSBoZWFkZXIgcG9pbnRlcnMgYW5kIHNldCB1cCByLT5oZWFkZXJzX291dCAqLwogCi0gICAgICAgIGlmICghKGhvID0gbmd4X2xpc3RfcHVzaCgmci0+aGVhZGVyc19vdXQuaGVhZGVycykpKSB7CisgICAgICAgIGhvID0gbmd4X2xpc3RfcHVzaCgmci0+aGVhZGVyc19vdXQuaGVhZGVycyk7CisgICAgICAgIGlmIChobyA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgICAgICB9CiAKQEAgLTE2Miw3ICsxNjMsOCBAQAogICAgIHIgPSBwLT5yZXF1ZXN0OwogICAgIHVjID0gcC0+bGNmLT51cHN0cmVhbTsKIAotICAgIGlmICghKGxvY2F0aW9uID0gbmd4X2xpc3RfcHVzaCgmci0+aGVhZGVyc19vdXQuaGVhZGVycykpKSB7CisgICAgbG9jYXRpb24gPSBuZ3hfbGlzdF9wdXNoKCZyLT5oZWFkZXJzX291dC5oZWFkZXJzKTsKKyAgICBpZiAobG9jYXRpb24gPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgIH0KIApAQCAtMTg5LDcgKzE5MSw4IEBACiAKICAgICBsb2NhdGlvbi0+dmFsdWUubGVuID0gdWMtPmxvY2F0aW9uLT5sZW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKGxvYy0+dmFsdWUubGVuIC0gdWMtPnVybC5sZW4pICsgMTsKLSAgICBpZiAoIShsb2NhdGlvbi0+dmFsdWUuZGF0YSA9IG5neF9wYWxsb2Moci0+cG9vbCwgbG9jYXRpb24tPnZhbHVlLmxlbikpKSB7CisgICAgbG9jYXRpb24tPnZhbHVlLmRhdGEgPSBuZ3hfcGFsbG9jKHItPnBvb2wsIGxvY2F0aW9uLT52YWx1ZS5sZW4pOworICAgIGlmIChsb2NhdGlvbi0+dmFsdWUuZGF0YSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvaHR0cC9tb2R1bGVzL3Byb3h5L25neF9odHRwX3Byb3h5X3Vwc3RyZWFtLmMgYi9zcmMvaHR0cC9tb2R1bGVzL3Byb3h5L25neF9odHRwX3Byb3h5X3Vwc3RyZWFtLmMKaW5kZXggMDYxYWI5Zi4uNDVkYzA0ZCAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbW9kdWxlcy9wcm94eS9uZ3hfaHR0cF9wcm94eV91cHN0cmVhbS5jCisrKyBiL3NyYy9odHRwL21vZHVsZXMvcHJveHkvbmd4X2h0dHBfcHJveHlfdXBzdHJlYW0uYwpAQCAtNTgsNyArNTgsOCBAQAogCiAgICAgciA9IHAtPnJlcXVlc3Q7CiAKLSAgICBpZiAoISh1ID0gbmd4X3BjYWxsb2Moci0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX3Byb3h5X3Vwc3RyZWFtX3QpKSkpIHsKKyAgICB1ID0gbmd4X3BjYWxsb2Moci0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX3Byb3h5X3Vwc3RyZWFtX3QpKTsKKyAgICBpZiAodSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7CiAgICAgfQogCkBAIC04NSw3ICs4Niw3IEBACiAKIHN0YXRpYyBuZ3hfY2hhaW5fdCAqbmd4X2h0dHBfcHJveHlfY3JlYXRlX3JlcXVlc3Qobmd4X2h0dHBfcHJveHlfY3R4X3QgKnApCiB7Ci0gICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuOworICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgbG9jX2xlbjsKICAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgICAgICBpLCBlc2NhcGUsICppbmRleDsKICAgICBuZ3hfYnVmX3QgICAgICAgICAgICAgICAgICAgICAgICpiOwogICAgIG5neF9jaGFpbl90ICAgICAgICAgICAgICAgICAgICAgKmNoYWluOwpAQCAtOTQsNiArOTUsNyBAQAogICAgIG5neF9odHRwX3JlcXVlc3RfdCAgICAgICAgICAgICAgKnI7CiAgICAgbmd4X2h0dHBfdmFyaWFibGVfdCAgICAgICAgICAgICAqdmFyOwogICAgIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgICAgICAgKnZhbHVlOworICAgIG5neF9odHRwX2NvcmVfbG9jX2NvbmZfdCAgICAgICAgKmNsY2Y7CiAgICAgbmd4X2h0dHBfY29yZV9tYWluX2NvbmZfdCAgICAgICAqY21jZjsKICAgICBuZ3hfaHR0cF9wcm94eV91cHN0cmVhbV9jb25mX3QgICp1YzsKIApAQCAtMTEyLDE2ICsxMTQsMjMgQEAKICAgICAgICAgbGVuID0gci0+bWV0aG9kX25hbWUubGVuOwogICAgIH0KIAorICAgIGNsY2YgPSBuZ3hfaHR0cF9nZXRfbW9kdWxlX2xvY19jb25mKHIsIG5neF9odHRwX2NvcmVfbW9kdWxlKTsKKworI2lmIChOR1hfUENSRSkKKyAgICBsb2NfbGVuID0gKGNsY2YtPnJlZ2V4KSA/IDEgOiBjbGNmLT5uYW1lLmxlbjsKKyNlbHNlCisgICAgbG9jX2xlbiA9IGNsY2YtPm5hbWUubGVuOworI2VuZGlmCisKICAgICBpZiAoci0+cXVvdGVkX3VyaSkgewotICAgICAgICBlc2NhcGUgPSAyICogbmd4X2VzY2FwZV91cmkoTlVMTCwgci0+dXJpLmRhdGEgKyB1Yy0+bG9jYXRpb24tPmxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHItPnVyaS5sZW4gLSB1Yy0+bG9jYXRpb24tPmxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HWF9FU0NBUEVfVVJJKTsKKyAgICAgICAgZXNjYXBlID0gMiAqIG5neF9lc2NhcGVfdXJpKE5VTEwsIHItPnVyaS5kYXRhICsgbG9jX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHItPnVyaS5sZW4gLSBsb2NfbGVuLCBOR1hfRVNDQVBFX1VSSSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgZXNjYXBlID0gMDsKICAgICB9CiAKICAgICBsZW4gKz0gdWMtPnVyaS5sZW4KLSAgICAgICAgKyByLT51cmkubGVuIC0gdWMtPmxvY2F0aW9uLT5sZW4gKyBlc2NhcGUKKyAgICAgICAgKyByLT51cmkubGVuIC0gbG9jX2xlbiArIGVzY2FwZQogICAgICAgICArIHNpemVvZigiPyIpIC0gMSArIHItPmFyZ3MubGVuCiAgICAgICAgICsgc2l6ZW9mKGh0dHBfdmVyc2lvbikgLSAxCiAgICAgICAgICsgc2l6ZW9mKGNvbm5lY3Rpb25fY2xvc2VfaGVhZGVyKSAtIDEKQEAgLTE5MCw3ICsxOTksOCBAQAogCiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwLT5sY2YtPnhfdmFycy0+bmVsdHM7IGkrKykgewogCi0gICAgICAgICAgICBpZiAoISh2YWx1ZSA9IG5neF9odHRwX2dldF9pbmRleGVkX3ZhcmlhYmxlKHIsIGluZGV4W2ldKSkpIHsKKyAgICAgICAgICAgIHZhbHVlID0gbmd4X2h0dHBfZ2V0X2luZGV4ZWRfdmFyaWFibGUociwgaW5kZXhbaV0pOworICAgICAgICAgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KIApAQCAtMjMzLDExICsyNDMsMTMgQEAKICAgICBsZW4rKzsKICNlbmRpZgogCi0gICAgaWYgKCEoYiA9IG5neF9jcmVhdGVfdGVtcF9idWYoci0+cG9vbCwgbGVuKSkpIHsKKyAgICBiID0gbmd4X2NyZWF0ZV90ZW1wX2J1ZihyLT5wb29sLCBsZW4pOworICAgIGlmIChiID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgaWYgKCEoY2hhaW4gPSBuZ3hfYWxsb2NfY2hhaW5fbGluayhyLT5wb29sKSkpIHsKKyAgICBjaGFpbiA9IG5neF9hbGxvY19jaGFpbl9saW5rKHItPnBvb2wpOworICAgIGlmIChjaGFpbiA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIApAQCAtMjU4LDE0ICsyNzAsMTMgQEAKICAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCB1Yy0+dXJpLmRhdGEsIHVjLT51cmkubGVuKTsKIAogICAgIGlmIChlc2NhcGUpIHsKLSAgICAgICAgbmd4X2VzY2FwZV91cmkoYi0+bGFzdCwgci0+dXJpLmRhdGEgKyB1Yy0+bG9jYXRpb24tPmxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgci0+dXJpLmxlbiAtIHVjLT5sb2NhdGlvbi0+bGVuLCBOR1hfRVNDQVBFX1VSSSk7Ci0gICAgICAgIGItPmxhc3QgKz0gci0+dXJpLmxlbiAtIHVjLT5sb2NhdGlvbi0+bGVuICsgZXNjYXBlOworICAgICAgICBuZ3hfZXNjYXBlX3VyaShiLT5sYXN0LCByLT51cmkuZGF0YSArIGxvY19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgIHItPnVyaS5sZW4gLSBsb2NfbGVuLCBOR1hfRVNDQVBFX1VSSSk7CisgICAgICAgIGItPmxhc3QgKz0gci0+dXJpLmxlbiAtIGxvY19sZW4gKyBlc2NhcGU7CiAKICAgICB9IGVsc2UgewotICAgICAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLT51cmkuZGF0YSArIHVjLT5sb2NhdGlvbi0+bGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLT51cmkubGVuIC0gdWMtPmxvY2F0aW9uLT5sZW4pOworICAgICAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCByLT51cmkuZGF0YSArIGxvY19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHItPnVyaS5sZW4gLSBsb2NfbGVuKTsKICAgICB9CiAKICAgICBpZiAoci0+YXJncy5sZW4gPiAwKSB7CkBAIC0zNzksNyArMzkwLDggQEAKICAgICBpZiAocC0+bGNmLT54X3ZhcnMpIHsKICAgICAgICAgZm9yIChpID0gMDsgaSA8IHAtPmxjZi0+eF92YXJzLT5uZWx0czsgaSsrKSB7CiAKLSAgICAgICAgICAgIGlmICghKHZhbHVlID0gbmd4X2h0dHBfZ2V0X2luZGV4ZWRfdmFyaWFibGUociwgaW5kZXhbaV0pKSkgeworICAgICAgICAgICAgdmFsdWUgPSBuZ3hfaHR0cF9nZXRfaW5kZXhlZF92YXJpYWJsZShyLCBpbmRleFtpXSk7CisgICAgICAgICAgICBpZiAodmFsdWUgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogCkBAIC01MDYsNyArNTE4LDggQEAKICAgICB9CiAKIAotICAgIGlmICghKGNsID0gbmd4X2h0dHBfcHJveHlfY3JlYXRlX3JlcXVlc3QocCkpKSB7CisgICAgY2wgPSBuZ3hfaHR0cF9wcm94eV9jcmVhdGVfcmVxdWVzdChwKTsKKyAgICBpZiAoY2wgPT0gTlVMTCkgewogICAgICAgICBuZ3hfaHR0cF9maW5hbGl6ZV9yZXF1ZXN0KHIsIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC01MTcsNyArNTMwLDggQEAKIAogICAgIHItPnJlcXVlc3RfYm9keS0+YnVmcyA9IGNsOwogCi0gICAgaWYgKCEoY3R4ID0gbmd4X3BjYWxsb2Moci0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX3Byb3h5X2xvZ19jdHhfdCkpKSkgeworICAgIGN0eCA9IG5neF9wY2FsbG9jKHItPnBvb2wsIHNpemVvZihuZ3hfaHR0cF9wcm94eV9sb2dfY3R4X3QpKTsKKyAgICBpZiAoY3R4ID09IE5VTEwpIHsKICAgICAgICAgbmd4X2h0dHBfcHJveHlfZmluYWxpemVfcmVxdWVzdChwLCBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IpOwogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtNTMxLDcgKzU0NSw4IEBACiAgICAgci0+Y29ubmVjdGlvbi0+bG9nLT5oYW5kbGVyID0gbmd4X2h0dHBfcHJveHlfbG9nX2Vycm9yOwogICAgIHAtPmFjdGlvbiA9ICJjb25uZWN0aW5nIHRvIHVwc3RyZWFtIjsKIAotICAgIGlmICghKG91dHB1dCA9IG5neF9wY2FsbG9jKHItPnBvb2wsIHNpemVvZihuZ3hfb3V0cHV0X2NoYWluX2N0eF90KSkpKSB7CisgICAgb3V0cHV0ID0gbmd4X3BjYWxsb2Moci0+cG9vbCwgc2l6ZW9mKG5neF9vdXRwdXRfY2hhaW5fY3R4X3QpKTsKKyAgICBpZiAob3V0cHV0ID09IE5VTEwpIHsKICAgICAgICAgbmd4X2h0dHBfcHJveHlfZmluYWxpemVfcmVxdWVzdChwLCBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IpOwogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtNTQ0LDcgKzU1OSw4IEBACiAgICAgb3V0cHV0LT50YWcgPSAobmd4X2J1Zl90YWdfdCkgJm5neF9odHRwX3Byb3h5X21vZHVsZTsKICAgICBvdXRwdXQtPm91dHB1dF9maWx0ZXIgPSBuZ3hfY2hhaW5fd3JpdGVyOwogCi0gICAgaWYgKCEod3JpdGVyID0gbmd4X3BhbGxvYyhyLT5wb29sLCBzaXplb2Yobmd4X2NoYWluX3dyaXRlcl9jdHhfdCkpKSkgeworICAgIHdyaXRlciA9IG5neF9wYWxsb2Moci0+cG9vbCwgc2l6ZW9mKG5neF9jaGFpbl93cml0ZXJfY3R4X3QpKTsKKyAgICBpZiAod3JpdGVyID09IE5VTEwpIHsKICAgICAgICAgbmd4X2h0dHBfcHJveHlfZmluYWxpemVfcmVxdWVzdChwLCBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IpOwogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtNjAzLDcgKzYxOSw4IEBACiAKICAgICBzdGF0ZSA9IHAtPnN0YXRlLT5jYWNoZV9zdGF0ZTsKIAotICAgIGlmICghKHAtPnN0YXRlID0gbmd4X3B1c2hfYXJyYXkoJnAtPnN0YXRlcykpKSB7CisgICAgcC0+c3RhdGUgPSBuZ3hfYXJyYXlfcHVzaCgmcC0+c3RhdGVzKTsKKyAgICBpZiAocC0+c3RhdGUgPT0gTlVMTCkgewogICAgICAgICBuZ3hfaHR0cF9wcm94eV9maW5hbGl6ZV9yZXF1ZXN0KHAsIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC03NzUsNyArNzkyLDggQEAKICAgICBpZiAoci0+cmVxdWVzdF9ib2R5LT5idWYpIHsKICAgICAgICAgaWYgKHItPnJlcXVlc3RfYm9keS0+dGVtcF9maWxlKSB7CiAKLSAgICAgICAgICAgIGlmICghKG91dHB1dC0+ZnJlZSA9IG5neF9hbGxvY19jaGFpbl9saW5rKHItPnBvb2wpKSkgeworICAgICAgICAgICAgb3V0cHV0LT5mcmVlID0gbmd4X2FsbG9jX2NoYWluX2xpbmsoci0+cG9vbCk7CisgICAgICAgICAgICBpZiAob3V0cHV0LT5mcmVlID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9wcm94eV9maW5hbGl6ZV9yZXF1ZXN0KHAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IpOwogICAgICAgICAgICAgICAgIHJldHVybjsKQEAgLTEwMDUsNyArMTAyMyw3IEBACiAgICAgcmMgPSBuZ3hfaHR0cF9wcm94eV9wYXJzZV9zdGF0dXNfbGluZShwKTsKIAogICAgIGlmIChyYyA9PSBOR1hfQUdBSU4pIHsKLSAgICAgICAgaWYgKHAtPmhlYWRlcl9pbi0+cG9zID09IHAtPmhlYWRlcl9pbi0+bGFzdCkgeworICAgICAgICBpZiAocC0+aGVhZGVyX2luLT5wb3MgPT0gcC0+aGVhZGVyX2luLT5lbmQpIHsKICAgICAgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19FUlIsIHJldi0+bG9nLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAidXBzdHJlYW0gc2VudCB0b28gbG9uZyBzdGF0dXMgbGluZSIpOwogICAgICAgICAgICAgbmd4X2h0dHBfcHJveHlfbmV4dF91cHN0cmVhbShwLCBOR1hfSFRUUF9QUk9YWV9GVF9JTlZBTElEX0hFQURFUik7CkBAIC0xMTU4LDcgKzExNzYsOCBAQAogCiAgICAgICAgICAgICAvKiBhIGhlYWRlciBsaW5lIGhhcyBiZWVuIHBhcnNlZCBzdWNjZXNzZnVsbHkgKi8KIAotICAgICAgICAgICAgaWYgKCEoaCA9IG5neF9saXN0X3B1c2goJnAtPnVwc3RyZWFtLT5oZWFkZXJzX2luLmhlYWRlcnMpKSkgeworICAgICAgICAgICAgaCA9IG5neF9saXN0X3B1c2goJnAtPnVwc3RyZWFtLT5oZWFkZXJzX2luLmhlYWRlcnMpOworICAgICAgICAgICAgaWYgKGggPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIG5neF9odHRwX3Byb3h5X2ZpbmFsaXplX3JlcXVlc3QocCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwpAQCAtMTMxNSw2ICsxMzM0LDExIEBACiAKICAgICByYyA9IG5neF9odHRwX3NlbmRfaGVhZGVyKHIpOwogCisgICAgaWYgKHJjID09IE5HWF9FUlJPUiB8fCByYyA+IE5HWF9PSykgeworICAgICAgICBuZ3hfaHR0cF9wcm94eV9maW5hbGl6ZV9yZXF1ZXN0KHAsIHJjKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwogICAgIHAtPmhlYWRlcl9zZW50ID0gMTsKIAogICAgIGlmIChwLT5jYWNoZSAmJiBwLT5jYWNoZS0+Y3R4LmZpbGUuZmQgIT0gTkdYX0lOVkFMSURfRklMRSkgewpAQCAtMTM2MSw3ICsxMzg1LDggQEAKIAogICAgIGVwLT5jYWNoYWJsZSA9IHAtPmNhY2hhYmxlOwogCi0gICAgaWYgKCEoZXAtPnRlbXBfZmlsZSA9IG5neF9wY2FsbG9jKHItPnBvb2wsIHNpemVvZihuZ3hfdGVtcF9maWxlX3QpKSkpIHsKKyAgICBlcC0+dGVtcF9maWxlID0gbmd4X3BjYWxsb2Moci0+cG9vbCwgc2l6ZW9mKG5neF90ZW1wX2ZpbGVfdCkpOworICAgIGlmIChlcC0+dGVtcF9maWxlID09IE5VTEwpIHsKICAgICAgICAgbmd4X2h0dHBfcHJveHlfZmluYWxpemVfcmVxdWVzdChwLCAwKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTEzODEsNyArMTQwNiw4IEBACiAgICAgZXAtPm1heF90ZW1wX2ZpbGVfc2l6ZSA9IHAtPmxjZi0+bWF4X3RlbXBfZmlsZV9zaXplOwogICAgIGVwLT50ZW1wX2ZpbGVfd3JpdGVfc2l6ZSA9IHAtPmxjZi0+dGVtcF9maWxlX3dyaXRlX3NpemU7CiAKLSAgICBpZiAoIShlcC0+cHJlcmVhZF9idWZzID0gbmd4X2FsbG9jX2NoYWluX2xpbmsoci0+cG9vbCkpKSB7CisgICAgZXAtPnByZXJlYWRfYnVmcyA9IG5neF9hbGxvY19jaGFpbl9saW5rKHItPnBvb2wpOworICAgIGlmIChlcC0+cHJlcmVhZF9idWZzID09IE5VTEwpIHsKICAgICAgICAgbmd4X2h0dHBfcHJveHlfZmluYWxpemVfcmVxdWVzdChwLCAwKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTE0NjcsNyArMTQ5Myw2IEBACiAgICAgICAgIG5neF9sb2dfZGVidWcwKE5HWF9MT0dfREVCVUdfSFRUUCwgZXYtPmxvZywgMCwKICAgICAgICAgICAgICAgICAgICAgICAgImh0dHAgcHJveHkgcHJvY2VzcyB1cHN0cmVhbSIpOwogICAgICAgICBwID0gYy0+ZGF0YTsKLSAgICAgICAgciA9IHAtPnJlcXVlc3Q7CiAgICAgICAgIHAtPmFjdGlvbiA9ICJyZWFkaW5nIHVwc3RyZWFtIGJvZHkiOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbmd4X2h0dHAuYyBiL3NyYy9odHRwL25neF9odHRwLmMKaW5kZXggZjljOTI2MC4uZTRjOGYyZSAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbmd4X2h0dHAuYworKysgYi9zcmMvaHR0cC9uZ3hfaHR0cC5jCkBAIC05Miw3ICs5Miw4IEBACiAKICAgICAvKiB0aGUgbWFpbiBodHRwIGNvbnRleHQgKi8KIAotICAgIGlmICghKGN0eCA9IG5neF9wY2FsbG9jKGNmLT5wb29sLCBzaXplb2Yobmd4X2h0dHBfY29uZl9jdHhfdCkpKSkgeworICAgIGN0eCA9IG5neF9wY2FsbG9jKGNmLT5wb29sLCBzaXplb2Yobmd4X2h0dHBfY29uZl9jdHhfdCkpOworICAgIGlmIChjdHggPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgfQogCkBAIC0xNjIsMTkgKzE2MywyMiBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKG1vZHVsZS0+Y3JlYXRlX21haW5fY29uZikgewotICAgICAgICAgICAgaWYgKCEoY3R4LT5tYWluX2NvbmZbbWldID0gbW9kdWxlLT5jcmVhdGVfbWFpbl9jb25mKGNmKSkpIHsKKyAgICAgICAgICAgIGN0eC0+bWFpbl9jb25mW21pXSA9IG1vZHVsZS0+Y3JlYXRlX21haW5fY29uZihjZik7CisgICAgICAgICAgICBpZiAoY3R4LT5tYWluX2NvbmZbbWldID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBpZiAobW9kdWxlLT5jcmVhdGVfc3J2X2NvbmYpIHsKLSAgICAgICAgICAgIGlmICghKGN0eC0+c3J2X2NvbmZbbWldID0gbW9kdWxlLT5jcmVhdGVfc3J2X2NvbmYoY2YpKSkgeworICAgICAgICAgICAgY3R4LT5zcnZfY29uZlttaV0gPSBtb2R1bGUtPmNyZWF0ZV9zcnZfY29uZihjZik7CisgICAgICAgICAgICBpZiAoY3R4LT5zcnZfY29uZlttaV0gPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIGlmIChtb2R1bGUtPmNyZWF0ZV9sb2NfY29uZikgewotICAgICAgICAgICAgaWYgKCEoY3R4LT5sb2NfY29uZlttaV0gPSBtb2R1bGUtPmNyZWF0ZV9sb2NfY29uZihjZikpKSB7CisgICAgICAgICAgICBjdHgtPmxvY19jb25mW21pXSA9IG1vZHVsZS0+Y3JlYXRlX2xvY19jb25mKGNmKTsKKyAgICAgICAgICAgIGlmIChjdHgtPmxvY19jb25mW21pXSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0yNjEsMTMgKzI2NSwxNCBAQAogCiAKICAgICAvKiB3ZSBuZWVkZWQgaHR0cHt9J3MgY2YtPmN0eCB3aGlsZSB0aGUgbWVyZ2luZyBjb25maWd1cmF0aW9uICovCisKICAgICAqY2YgPSBwY2Y7CiAKIAogICAgIC8qIGluaXQgbGlzdHMgb2YgdGhlIGhhbmRsZXJzICovCiAKICAgICBpZiAobmd4X2FycmF5X2luaXQoJmNtY2YtPnBoYXNlc1tOR1hfSFRUUF9SRVdSSVRFX1BIQVNFXS5oYW5kbGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgY2YtPnBvb2wsIDEsIHNpemVvZihuZ3hfaHR0cF9oYW5kbGVyX3B0KSkgPT0gTkdYX0VSUk9SKQorICAgICAgICAgICAgICAgICAgICAgICBjZi0+cG9vbCwgMSwgc2l6ZW9mKG5neF9odHRwX2hhbmRsZXJfcHQpKSAhPSBOR1hfT0spCiAgICAgewogICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgfQpAQCAtMjc4LDE0ICsyODMsMTQgQEAKICAgICAvKiB0aGUgc3BlY2lhbCBmaW5kIGNvbmZpZyBwaGFzZSBmb3IgYSBzaW5nbGUgaGFuZGxlciAqLwogCiAgICAgaWYgKG5neF9hcnJheV9pbml0KCZjbWNmLT5waGFzZXNbTkdYX0hUVFBfRklORF9DT05GSUdfUEhBU0VdLmhhbmRsZXJzLAotICAgICAgICAgICAgICAgICAgICAgICBjZi0+cG9vbCwgMSwgc2l6ZW9mKG5neF9odHRwX2hhbmRsZXJfcHQpKSA9PSBOR1hfRVJST1IpCisgICAgICAgICAgICAgICAgICAgICAgIGNmLT5wb29sLCAxLCBzaXplb2Yobmd4X2h0dHBfaGFuZGxlcl9wdCkpICE9IE5HWF9PSykKICAgICB7CiAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICB9CiAKICAgICBjbWNmLT5waGFzZXNbTkdYX0hUVFBfRklORF9DT05GSUdfUEhBU0VdLnR5cGUgPSBOR1hfT0s7CiAKLSAgICBoID0gbmd4X3B1c2hfYXJyYXkoJmNtY2YtPnBoYXNlc1tOR1hfSFRUUF9GSU5EX0NPTkZJR19QSEFTRV0uaGFuZGxlcnMpOworICAgIGggPSBuZ3hfYXJyYXlfcHVzaCgmY21jZi0+cGhhc2VzW05HWF9IVFRQX0ZJTkRfQ09ORklHX1BIQVNFXS5oYW5kbGVycyk7CiAgICAgaWYgKGggPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgfQpAQCAtMjk0LDcgKzI5OSw3IEBACiAKIAogICAgIGlmIChuZ3hfYXJyYXlfaW5pdCgmY21jZi0+cGhhc2VzW05HWF9IVFRQX0FDQ0VTU19QSEFTRV0uaGFuZGxlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgIGNmLT5wb29sLCAxLCBzaXplb2Yobmd4X2h0dHBfaGFuZGxlcl9wdCkpID09IE5HWF9FUlJPUikKKyAgICAgICAgICAgICAgICAgICAgICAgY2YtPnBvb2wsIDEsIHNpemVvZihuZ3hfaHR0cF9oYW5kbGVyX3B0KSkgIT0gTkdYX09LKQogICAgIHsKICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgIH0KQEAgLTMwMyw3ICszMDgsNyBAQAogCiAKICAgICBpZiAobmd4X2FycmF5X2luaXQoJmNtY2YtPnBoYXNlc1tOR1hfSFRUUF9DT05URU5UX1BIQVNFXS5oYW5kbGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgY2YtPnBvb2wsIDQsIHNpemVvZihuZ3hfaHR0cF9oYW5kbGVyX3B0KSkgPT0gTkdYX0VSUk9SKQorICAgICAgICAgICAgICAgICAgICAgICBjZi0+cG9vbCwgNCwgc2l6ZW9mKG5neF9odHRwX2hhbmRsZXJfcHQpKSAhPSBOR1hfT0spCiAgICAgewogICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgfQpAQCAtMzE3LDcgKzMyMiw3IEBACiAgICAgICovCiAKICAgICBpZiAobmd4X2FycmF5X2luaXQoJmluX3BvcnRzLCBjZi0+cG9vbCwgMTAsIHNpemVvZihuZ3hfaHR0cF9pbl9wb3J0X3QpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gTkdYX0VSUk9SKQorICAgICAgICAhPSBOR1hfT0spCiAgICAgewogICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgfQpAQCAtMzU0LDcgKzM1OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlIGFkZHJlc3MgaXMgYWxyZWFkeSBpbiB0aGUgYWRkcmVzcyBsaXN0ICovCiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmd4X2h0dHBfYWRkX25hbWVzKGNmLCAmaW5fYWRkclthXSwgY3NjZnBbc10pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBOR1hfRVJST1IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IE5HWF9PSykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC0zODYsNyArMzkxLDggQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZSBJTkFERFJfQU5ZIGlzIGFsd2F5cyB0aGUgbGFzdCBhZGRyZXNzICovCiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShpbmFkZHIgPSBuZ3hfYXJyYXlfcHVzaCgmaW5fcG9ydFtwXS5hZGRycykpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5hZGRyID0gbmd4X2FycmF5X3B1c2goJmluX3BvcnRbcF0uYWRkcnMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmFkZHIgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCkBAIC00MDcsNyArNDEzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9hZGRyW2FdLmNvcmVfc3J2X2NvbmYgPSBjc2NmcFtzXTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZ3hfaHR0cF9hZGRfbmFtZXMoY2YsICZpbl9hZGRyW2FdLCBjc2NmcFtzXSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IE5HWF9FUlJPUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gTkdYX09LKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTQyNiw3ICs0MzIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZ3hfaHR0cF9hZGRfYWRkcmVzcyhjZiwgJmluX3BvcnRbcF0sICZsc2NmW2xdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc2NmcFtzXSkgPT0gTkdYX0VSUk9SKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzY2ZwW3NdKSAhPSBOR1hfT0spCiAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNDM4LDE0ICs0NDQsMTYgQEAKIAogICAgICAgICAgICAgICAgIC8qIGFkZCB0aGUgcG9ydCB0byB0aGUgaW5fcG9ydCBsaXN0ICovCiAKLSAgICAgICAgICAgICAgICBpZiAoIShpbl9wb3J0ID0gbmd4X2FycmF5X3B1c2goJmluX3BvcnRzKSkpIHsKKyAgICAgICAgICAgICAgICBpbl9wb3J0ID0gbmd4X2FycmF5X3B1c2goJmluX3BvcnRzKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5fcG9ydCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpbl9wb3J0LT5wb3J0ID0gbHNjZltsXS5wb3J0OwogICAgICAgICAgICAgICAgIGluX3BvcnQtPmFkZHJzLmVsdHMgPSBOVUxMOwogCi0gICAgICAgICAgICAgICAgaWYgKCEoaW5fcG9ydC0+cG9ydF90ZXh0LmRhdGEgPSBuZ3hfcGFsbG9jKGNmLT5wb29sLCA3KSkpIHsKKyAgICAgICAgICAgICAgICBpbl9wb3J0LT5wb3J0X3RleHQuZGF0YSA9IG5neF9wYWxsb2MoY2YtPnBvb2wsIDcpOworICAgICAgICAgICAgICAgIGlmIChpbl9wb3J0LT5wb3J0X3RleHQuZGF0YSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTQ1NCw3ICs0NjIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGluX3BvcnQtPnBvcnRfdGV4dC5kYXRhOwogCiAgICAgICAgICAgICAgICAgaWYgKG5neF9odHRwX2FkZF9hZGRyZXNzKGNmLCBpbl9wb3J0LCAmbHNjZltsXSwgY3NjZnBbc10pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBOR1hfRVJST1IpCisgICAgICAgICAgICAgICAgICAgICE9IE5HWF9PSykKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICAgICAgICAgICAgICB9CkBAIC00ODQsNyArNDkyLDcgQEAKICAgICAgICAgICAgIGZvciAobiA9IDA7IG4gPCBpbl9hZGRyW2FdLm5hbWVzLm5lbHRzOyBuKyspIHsKICAgICAgICAgICAgICAgICBpZiAoaW5fYWRkclthXS5jb3JlX3Nydl9jb25mICE9IG5hbWVbbl0uY29yZV9zcnZfY29uZgogICAgICAgICAgICAgICAgICAgICB8fCBuYW1lW25dLmNvcmVfc3J2X2NvbmYtPnJlc3RyaWN0X2hvc3RfbmFtZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBOR1hfSFRUUF9SRVNUUklDVF9IT1NUX09GRikKKyAgICAgICAgICAgICAgICAgICAgICAgIT0gTkdYX0hUVFBfUkVTVFJJQ1RfSE9TVF9PRkYpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsX25hbWVzID0gMTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC00OTYsNyArNTA0LDcgQEAKICAgICAgICAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgaW5fYWRkclthXS53aWxkY2FyZHMubmVsdHM7IG4rKykgewogICAgICAgICAgICAgICAgICAgICBpZiAoaW5fYWRkclthXS5jb3JlX3Nydl9jb25mICE9IG5hbWVbbl0uY29yZV9zcnZfY29uZgogICAgICAgICAgICAgICAgICAgICAgICAgfHwgbmFtZVtuXS5jb3JlX3Nydl9jb25mLT5yZXN0cmljdF9ob3N0X25hbWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gTkdYX0hUVFBfUkVTVFJJQ1RfSE9TVF9PRkYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBOR1hfSFRUUF9SRVNUUklDVF9IT1NUX09GRikKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgdmlydHVhbF9uYW1lcyA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTUzMiw3ICs1NDAsNyBAQAogCiAgICAgICAgICAgICAgICAgZm9yIChuID0gMDsgbiA8IGNtY2YtPnNlcnZlcl9uYW1lc19oYXNoOyBuKyspIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKG5neF9hcnJheV9pbml0KCZpbl9hZGRyW2FdLmhhc2hbbl0sIGNmLT5wb29sLCA1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfaHR0cF9zZXJ2ZXJfbmFtZV90KSkgPT0gTkdYX0VSUk9SKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfaHR0cF9zZXJ2ZXJfbmFtZV90KSkgIT0gTkdYX09LKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTU0NCw3ICs1NTIsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZVtzXS5uYW1lLmxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtY2YtPnNlcnZlcl9uYW1lc19oYXNoKTsKIAotICAgICAgICAgICAgICAgICAgICBpZiAoIShzX25hbWUgPSBuZ3hfYXJyYXlfcHVzaCgmaW5fYWRkclthXS5oYXNoW2tleV0pKSkgeworICAgICAgICAgICAgICAgICAgICBzX25hbWUgPSBuZ3hfYXJyYXlfcHVzaCgmaW5fYWRkclthXS5oYXNoW2tleV0pOworICAgICAgICAgICAgICAgICAgICBpZiAoc19uYW1lID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICAgICAgICAgICAgICAgICAgfQogCkBAIC01NzUsMTMgKzU4NCw3IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGxzLT5iYWNrbG9nID0gLTE7Ci0jaWYgMAotI2lmIDAKLSAgICAgICAgICAgIGxzLT5ub25ibG9ja2luZyA9IDE7Ci0jZWxzZQotICAgICAgICAgICAgbHMtPm5vbmJsb2NraW5nID0gMDsKLSNlbmRpZgotI2VuZGlmCisKICAgICAgICAgICAgIGxzLT5hZGRyX250b3AgPSAxOwogCiAgICAgICAgICAgICBscy0+aGFuZGxlciA9IG5neF9odHRwX2luaXRfY29ubmVjdGlvbjsKQEAgLTYxMiwxOSArNjE1LDIxIEBACiAgICAgICAgICAgICAgICAgICAgICAqIHRoZSBzZXBhcmF0ZSBuZ3hfaHR0cF9pbl9wb3J0X3QgZm9yIHRoZSBhbGwgYmluZGluZ3MKICAgICAgICAgICAgICAgICAgICAgICovCiAKLSAgICAgICAgICAgICAgICAgICAgbmd4X3Rlc3RfbnVsbChpbnBvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X3BhbGxvYyhjZi0+cG9vbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfaHR0cF9pbl9wb3J0X3QpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR1hfQ09ORl9FUlJPUik7CisgICAgICAgICAgICAgICAgICAgIGlucG9ydCA9IG5neF9wYWxsb2MoY2YtPnBvb2wsIHNpemVvZihuZ3hfaHR0cF9pbl9wb3J0X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlucG9ydCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICBpbnBvcnQtPnBvcnQgPSBpbl9wb3J0W3BdLnBvcnQ7CiAgICAgICAgICAgICAgICAgICAgIGlucG9ydC0+cG9ydF90ZXh0ID0gaW5fcG9ydFtwXS5wb3J0X3RleHQ7CiAKICAgICAgICAgICAgICAgICAgICAgLyogaW5pdCBsaXN0IG9mIHRoZSBhZGRyZXNzZXMgLi4uICovCiAKLSAgICAgICAgICAgICAgICAgICAgbmd4X2luaXRfYXJyYXkoaW5wb3J0LT5hZGRycywgY2YtPnBvb2wsIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfaHR0cF9pbl9hZGRyX3QpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR1hfQ09ORl9FUlJPUik7CisgICAgICAgICAgICAgICAgICAgIGlmIChuZ3hfYXJyYXlfaW5pdCgmaW5wb3J0LT5hZGRycywgY2YtPnBvb2wsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yobmd4X2h0dHBfaW5fYWRkcl90KSkgIT0gTkdYX09LKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICAvKiAuLi4gYW5kIHNldCB1cCBpdCB3aXRoIHRoZSBmaXJzdCBhZGRyZXNzICovCiAKQEAgLTYzNiw3ICs2NDEsNyBAQAogICAgICAgICAgICAgICAgICAgICAvKiBwcmVwYXJlIGZvciB0aGUgbmV4dCBjeWNsZSAqLwogCiAgICAgICAgICAgICAgICAgICAgIGluX3BvcnRbcF0uYWRkcnMuZWx0cyA9IChjaGFyICopIGluX3BvcnRbcF0uYWRkcnMuZWx0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaW5fcG9ydFtwXS5hZGRycy5zaXplOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBpbl9wb3J0W3BdLmFkZHJzLnNpemU7CiAgICAgICAgICAgICAgICAgICAgIGluX3BvcnRbcF0uYWRkcnMubmVsdHMtLTsKIAogICAgICAgICAgICAgICAgICAgICBpbl9hZGRyID0gKG5neF9odHRwX2luX2FkZHJfdCAqKSBpbl9wb3J0W3BdLmFkZHJzLmVsdHM7CkBAIC03MDUsMTMgKzcxMCwxNCBAQAogCiAgICAgaWYgKGluX3BvcnQtPmFkZHJzLmVsdHMgPT0gTlVMTCkgewogICAgICAgICBpZiAobmd4X2FycmF5X2luaXQoJmluX3BvcnQtPmFkZHJzLCBjZi0+cG9vbCwgMTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfaHR0cF9pbl9hZGRyX3QpKSA9PSBOR1hfRVJST1IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yobmd4X2h0dHBfaW5fYWRkcl90KSkgIT0gTkdYX09LKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKCEoaW5fYWRkciA9IG5neF9hcnJheV9wdXNoKCZpbl9wb3J0LT5hZGRycykpKSB7CisgICAgaW5fYWRkciA9IG5neF9hcnJheV9wdXNoKCZpbl9wb3J0LT5hZGRycyk7CisgICAgaWYgKGluX2FkZHIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgIH0KIApAQCAtNzUwLDcgKzc1Niw3IEBACiAKICAgICBpZiAoaW5fYWRkci0+bmFtZXMuZWx0cyA9PSBOVUxMKSB7CiAgICAgICAgIGlmIChuZ3hfYXJyYXlfaW5pdCgmaW5fYWRkci0+bmFtZXMsIGNmLT5wb29sLCAxMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yobmd4X2h0dHBfc2VydmVyX25hbWVfdCkpID09IE5HWF9FUlJPUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfaHR0cF9zZXJ2ZXJfbmFtZV90KSkgIT0gTkdYX09LKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgICAgICB9CkBAIC03NTgsNyArNzY0LDcgQEAKIAogICAgIGlmIChpbl9hZGRyLT53aWxkY2FyZHMuZWx0cyA9PSBOVUxMKSB7CiAgICAgICAgIGlmIChuZ3hfYXJyYXlfaW5pdCgmaW5fYWRkci0+d2lsZGNhcmRzLCBjZi0+cG9vbCwgMTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5neF9odHRwX3NlcnZlcl9uYW1lX3QpKSA9PSBOR1hfRVJST1IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yobmd4X2h0dHBfc2VydmVyX25hbWVfdCkpICE9IE5HWF9PSykKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICAgICAgfQpAQCAtNzg1LDcgKzc5MSw4IEBACiAgICAgICAgICAgICBhcnJheSA9ICZpbl9hZGRyLT5uYW1lczsKICAgICAgICAgfQogCi0gICAgICAgIGlmICghKG5hbWUgPSBuZ3hfYXJyYXlfcHVzaChhcnJheSkpKSB7CisgICAgICAgIG5hbWUgPSBuZ3hfYXJyYXlfcHVzaChhcnJheSk7CisgICAgICAgIGlmIChuYW1lID09IE5VTEwpIHsKICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbmd4X2h0dHAuaCBiL3NyYy9odHRwL25neF9odHRwLmgKaW5kZXggNmYxOWFmMS4uMmQ0MTU4ZiAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbmd4X2h0dHAuaAorKysgYi9zcmMvaHR0cC9uZ3hfaHR0cC5oCkBAIC0xNiw2ICsxNiw4IEBACiB0eXBlZGVmIHN0cnVjdCBuZ3hfaHR0cF9sb2dfY3R4X3MgIG5neF9odHRwX2xvZ19jdHhfdDsKIHR5cGVkZWYgc3RydWN0IG5neF9odHRwX2NsZWFudXBfcyAgbmd4X2h0dHBfY2xlYW51cF90OwogdHlwZWRlZiBzdHJ1Y3Qgbmd4X2h0dHBfaW5fYWRkcl9zICBuZ3hfaHR0cF9pbl9hZGRyX3Q7Cit0eXBlZGVmIHN0cnVjdCBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV9zICBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90OworCiAKICNpZiAoTkdYX0hUVFBfQ0FDSEUpCiAjaW5jbHVkZSA8bmd4X2h0dHBfY2FjaGUuaD4KQEAgLTI3LDcgKzI5LDcgQEAKICNpbmNsdWRlIDxuZ3hfaHR0cF9yZXF1ZXN0Lmg+CiAjaW5jbHVkZSA8bmd4X2h0dHBfY29uZmlnLmg+CiAjaW5jbHVkZSA8bmd4X2h0dHBfYnVzeV9sb2NrLmg+Ci0jaW5jbHVkZSA8bmd4X2h0dHBfbG9nX2hhbmRsZXIuaD4KKyNpbmNsdWRlIDxuZ3hfaHR0cF9sb2dfbW9kdWxlLmg+CiAjaW5jbHVkZSA8bmd4X2h0dHBfY29yZV9tb2R1bGUuaD4KICNpbmNsdWRlIDxuZ3hfaHR0cF92YXJpYWJsZXMuaD4KIApAQCAtNDYsMTYgKzQ4LDcgQEAKICNkZWZpbmUgbmd4X2h0dHBfZ2V0X21vZHVsZV9lcnJfY3R4KHIsIG1vZHVsZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAoKHIpLT5lcnJfY3R4ID8gKHIpLT5lcnJfY3R4W21vZHVsZS5jdHhfaW5kZXhdIDogKHIpLT5jdHhbbW9kdWxlLmN0eF9pbmRleF0pCiAKLS8qIFNUVUIgKi8KLSNkZWZpbmUgbmd4X2h0dHBfY3JlYXRlX2N0eChyLCBjeCwgbW9kdWxlLCBzaXplLCBlcnJvcikgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICBuZ3hfdGVzdF9udWxsKGN4LCBuZ3hfcGNhbGxvYyhyLT5wb29sLCBzaXplKSwgZXJyb3IpOyAgICAgICAgIFwKLSAgICAgICAgICAgICAgICByLT5jdHhbbW9kdWxlLmN0eF9pbmRleF0gPSBjeDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIH0gd2hpbGUgKDApCi0vKiovCi0KICNkZWZpbmUgbmd4X2h0dHBfc2V0X2N0eChyLCBjLCBtb2R1bGUpICAgICAgICAgci0+Y3R4W21vZHVsZS5jdHhfaW5kZXhdID0gYzsKLQogI2RlZmluZSBuZ3hfaHR0cF9kZWxldGVfY3R4KHIsIG1vZHVsZSkgICAgICAgICByLT5jdHhbbW9kdWxlLmN0eF9pbmRleF0gPSBOVUxMOwogCiAKZGlmZiAtLWdpdCBhL3NyYy9odHRwL25neF9odHRwX2J1c3lfbG9jay5jIGIvc3JjL2h0dHAvbmd4X2h0dHBfYnVzeV9sb2NrLmMKaW5kZXggMmIzZWUxMC4uZmUwNDM5MCAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbmd4X2h0dHBfYnVzeV9sb2NrLmMKKysrIGIvc3JjL2h0dHAvbmd4X2h0dHBfYnVzeV9sb2NrLmMKQEAgLTIwNSwxMyArMjA1LDE1IEBACiAgICAgfQogCiAgICAgLyogbmd4X2NhbGxvY19zaGFyZWQoKSAqLwotICAgIGlmICghKGJsID0gbmd4X3BjYWxsb2MoY2YtPnBvb2wsIHNpemVvZihuZ3hfaHR0cF9idXN5X2xvY2tfdCkpKSkgeworICAgIGJsID0gbmd4X3BjYWxsb2MoY2YtPnBvb2wsIHNpemVvZihuZ3hfaHR0cF9idXN5X2xvY2tfdCkpOworICAgIGlmIChibCA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICB9CiAgICAgKmJscCA9IGJsOwogCiAgICAgLyogbmd4X2NhbGxvY19zaGFyZWQoKSAqLwotICAgIGlmICghKGJsLT5tdXRleCA9IG5neF9wY2FsbG9jKGNmLT5wb29sLCBzaXplb2Yobmd4X2V2ZW50X211dGV4X3QpKSkpIHsKKyAgICBibC0+bXV0ZXggPSBuZ3hfcGNhbGxvYyhjZi0+cG9vbCwgc2l6ZW9mKG5neF9ldmVudF9tdXRleF90KSk7CisgICAgaWYgKGJsLT5tdXRleCA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9odHRwL25neF9odHRwX2NvbmZpZy5oIGIvc3JjL2h0dHAvbmd4X2h0dHBfY29uZmlnLmgKaW5kZXggMGJmNjMzOC4uNTgxNTU2ZiAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbmd4X2h0dHBfY29uZmlnLmgKKysrIGIvc3JjL2h0dHAvbmd4X2h0dHBfY29uZmlnLmgKQEAgLTU5LDE1ICs1OSwxNSBAQAogICovCiAKICNkZWZpbmUgbmd4X2h0dHBfY29uZl9nZXRfbW9kdWxlX21haW5fY29uZihjZiwgbW9kdWxlKSAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICgobmd4X2h0dHBfY29uZl9jdHhfdCAqKSBjZi0+Y3R4KS0+bWFpbl9jb25mW21vZHVsZS5jdHhfaW5kZXhdCisgICAgKChuZ3hfaHR0cF9jb25mX2N0eF90ICopIGNmLT5jdHgpLT5tYWluX2NvbmZbbW9kdWxlLmN0eF9pbmRleF0KICNkZWZpbmUgbmd4X2h0dHBfY29uZl9nZXRfbW9kdWxlX3Nydl9jb25mKGNmLCBtb2R1bGUpICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICgobmd4X2h0dHBfY29uZl9jdHhfdCAqKSBjZi0+Y3R4KS0+c3J2X2NvbmZbbW9kdWxlLmN0eF9pbmRleF0KKyAgICAoKG5neF9odHRwX2NvbmZfY3R4X3QgKikgY2YtPmN0eCktPnNydl9jb25mW21vZHVsZS5jdHhfaW5kZXhdCiAjZGVmaW5lIG5neF9odHRwX2NvbmZfZ2V0X21vZHVsZV9sb2NfY29uZihjZiwgbW9kdWxlKSAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAoKG5neF9odHRwX2NvbmZfY3R4X3QgKikgY2YtPmN0eCktPmxvY19jb25mW21vZHVsZS5jdHhfaW5kZXhdCisgICAgKChuZ3hfaHR0cF9jb25mX2N0eF90ICopIGNmLT5jdHgpLT5sb2NfY29uZlttb2R1bGUuY3R4X2luZGV4XQogCiAjZGVmaW5lIG5neF9odHRwX2N5Y2xlX2dldF9tb2R1bGVfbWFpbl9jb25mKGN5Y2xlLCBtb2R1bGUpICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgKChuZ3hfaHR0cF9jb25mX2N0eF90ICopICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIGN5Y2xlLT5jb25mX2N0eFtuZ3hfaHR0cF9tb2R1bGUuaW5kZXhdKS0+bWFpbl9jb25mW21vZHVsZS5jdHhfaW5kZXhdCisgICAgKChuZ3hfaHR0cF9jb25mX2N0eF90ICopICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBjeWNsZS0+Y29uZl9jdHhbbmd4X2h0dHBfbW9kdWxlLmluZGV4XSktPm1haW5fY29uZlttb2R1bGUuY3R4X2luZGV4XQogCiAKIApkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbmd4X2h0dHBfY29weV9maWx0ZXIuYyBiL3NyYy9odHRwL25neF9odHRwX2NvcHlfZmlsdGVyX21vZHVsZS5jCnNpbWlsYXJpdHkgaW5kZXggNzQlCnJlbmFtZSBmcm9tIHNyYy9odHRwL25neF9odHRwX2NvcHlfZmlsdGVyLmMKcmVuYW1lIHRvIHNyYy9odHRwL25neF9odHRwX2NvcHlfZmlsdGVyX21vZHVsZS5jCmluZGV4IDEwYzU3NGYuLjRlODk0MzggMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL25neF9odHRwX2NvcHlfZmlsdGVyLmMKKysrIGIvc3JjL2h0dHAvbmd4X2h0dHBfY29weV9maWx0ZXJfbW9kdWxlLmMKQEAgLTE2LDIwICsxNiwyMCBAQAogCiBzdGF0aWMgdm9pZCAqbmd4X2h0dHBfY29weV9maWx0ZXJfY3JlYXRlX2NvbmYobmd4X2NvbmZfdCAqY2YpOwogc3RhdGljIGNoYXIgKm5neF9odHRwX2NvcHlfZmlsdGVyX21lcmdlX2NvbmYobmd4X2NvbmZfdCAqY2YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwYXJlbnQsIHZvaWQgKmNoaWxkKTsKKyAgICB2b2lkICpwYXJlbnQsIHZvaWQgKmNoaWxkKTsKIHN0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfY29weV9maWx0ZXJfaW5pdChuZ3hfY3ljbGVfdCAqY3ljbGUpOwogCiAKIHN0YXRpYyBuZ3hfY29tbWFuZF90ICBuZ3hfaHR0cF9jb3B5X2ZpbHRlcl9jb21tYW5kc1tdID0gewogCi0gICAge25neF9zdHJpbmcoIm91dHB1dF9idWZmZXJzIiksCi0gICAgIE5HWF9IVFRQX01BSU5fQ09ORnxOR1hfSFRUUF9TUlZfQ09ORnxOR1hfSFRUUF9MT0NfQ09ORnxOR1hfQ09ORl9UQUtFMiwKLSAgICAgbmd4X2NvbmZfc2V0X2J1ZnNfc2xvdCwKLSAgICAgTkdYX0hUVFBfTE9DX0NPTkZfT0ZGU0VULAotICAgICBvZmZzZXRvZihuZ3hfaHR0cF9jb3B5X2ZpbHRlcl9jb25mX3QsIGJ1ZnMpLAotICAgICBOVUxMfSwKKyAgICB7IG5neF9zdHJpbmcoIm91dHB1dF9idWZmZXJzIiksCisgICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0NPTkZfVEFLRTIsCisgICAgICBuZ3hfY29uZl9zZXRfYnVmc19zbG90LAorICAgICAgTkdYX0hUVFBfTE9DX0NPTkZfT0ZGU0VULAorICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfY29weV9maWx0ZXJfY29uZl90LCBidWZzKSwKKyAgICAgIE5VTEwgfSwKIAotICAgIG5neF9udWxsX2NvbW1hbmQKKyAgICAgIG5neF9udWxsX2NvbW1hbmQKIH07CiAKIApAQCAtNjAsNyArNjAsOCBAQAogc3RhdGljIG5neF9odHRwX291dHB1dF9ib2R5X2ZpbHRlcl9wdCAgICBuZ3hfaHR0cF9uZXh0X2ZpbHRlcjsKIAogCi1uZ3hfaW50X3Qgbmd4X2h0dHBfY29weV9maWx0ZXIobmd4X2h0dHBfcmVxdWVzdF90ICpyLCBuZ3hfY2hhaW5fdCAqaW4pCitzdGF0aWMgbmd4X2ludF90CituZ3hfaHR0cF9jb3B5X2ZpbHRlcihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIG5neF9jaGFpbl90ICppbikKIHsKICAgICBuZ3hfb3V0cHV0X2NoYWluX2N0eF90ICAgICAgICpjdHg7CiAgICAgbmd4X2h0dHBfY29weV9maWx0ZXJfY29uZl90ICAqY29uZjsKQEAgLTc2LDggKzc3LDEyIEBACiAgICAgICAgIGNvbmYgPSBuZ3hfaHR0cF9nZXRfbW9kdWxlX2xvY19jb25mKHItPm1haW4gPyByLT5tYWluIDogciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfY29weV9maWx0ZXJfbW9kdWxlKTsKIAotICAgICAgICBuZ3hfaHR0cF9jcmVhdGVfY3R4KHIsIGN0eCwgbmd4X2h0dHBfY29weV9maWx0ZXJfbW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfb3V0cHV0X2NoYWluX2N0eF90KSwgTkdYX0VSUk9SKTsKKyAgICAgICAgY3R4ID0gbmd4X3BjYWxsb2Moci0+cG9vbCwgc2l6ZW9mKG5neF9vdXRwdXRfY2hhaW5fY3R4X3QpKTsKKyAgICAgICAgaWYgKGN0eCA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgbmd4X2h0dHBfc2V0X2N0eChyLCBjdHgsIG5neF9odHRwX2NvcHlfZmlsdGVyX21vZHVsZSk7CiAKICAgICAgICAgY3R4LT5zZW5kZmlsZSA9IHItPmNvbm5lY3Rpb24tPnNlbmRmaWxlOwogICAgICAgICBjdHgtPm5lZWRfaW5fbWVtb3J5ID0gci0+ZmlsdGVyX25lZWRfaW5fbWVtb3J5OwpAQCAtOTYsMTMgKzEwMSwxNSBAQAogfQogCiAKLXN0YXRpYyB2b2lkICpuZ3hfaHR0cF9jb3B5X2ZpbHRlcl9jcmVhdGVfY29uZihuZ3hfY29uZl90ICpjZikKK3N0YXRpYyB2b2lkICoKK25neF9odHRwX2NvcHlfZmlsdGVyX2NyZWF0ZV9jb25mKG5neF9jb25mX3QgKmNmKQogewogICAgIG5neF9odHRwX2NvcHlfZmlsdGVyX2NvbmZfdCAqY29uZjsKIAotICAgIG5neF90ZXN0X251bGwoY29uZiwKLSAgICAgICAgICAgICAgICAgIG5neF9wYWxsb2MoY2YtPnBvb2wsIHNpemVvZihuZ3hfaHR0cF9jb3B5X2ZpbHRlcl9jb25mX3QpKSwKLSAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIGNvbmYgPSBuZ3hfcGFsbG9jKGNmLT5wb29sLCBzaXplb2Yobmd4X2h0dHBfY29weV9maWx0ZXJfY29uZl90KSk7CisgICAgaWYgKGNvbmYgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKICAgICBjb25mLT5idWZzLm51bSA9IDA7CiAKQEAgLTExMCw4ICsxMTcsOCBAQAogfQogCiAKLXN0YXRpYyBjaGFyICpuZ3hfaHR0cF9jb3B5X2ZpbHRlcl9tZXJnZV9jb25mKG5neF9jb25mX3QgKmNmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcGFyZW50LCB2b2lkICpjaGlsZCkKK3N0YXRpYyBjaGFyICoKK25neF9odHRwX2NvcHlfZmlsdGVyX21lcmdlX2NvbmYobmd4X2NvbmZfdCAqY2YsIHZvaWQgKnBhcmVudCwgdm9pZCAqY2hpbGQpCiB7CiAgICAgbmd4X2h0dHBfY29weV9maWx0ZXJfY29uZl90ICpwcmV2ID0gcGFyZW50OwogICAgIG5neF9odHRwX2NvcHlfZmlsdGVyX2NvbmZfdCAqY29uZiA9IGNoaWxkOwpAQCAtMTIyLDcgKzEyOSw4IEBACiB9CiAKIAotc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9jb3B5X2ZpbHRlcl9pbml0KG5neF9jeWNsZV90ICpjeWNsZSkKK3N0YXRpYyBuZ3hfaW50X3QKK25neF9odHRwX2NvcHlfZmlsdGVyX2luaXQobmd4X2N5Y2xlX3QgKmN5Y2xlKQogewogICAgIG5neF9odHRwX25leHRfZmlsdGVyID0gbmd4X2h0dHBfdG9wX2JvZHlfZmlsdGVyOwogICAgIG5neF9odHRwX3RvcF9ib2R5X2ZpbHRlciA9IG5neF9odHRwX2NvcHlfZmlsdGVyOwpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbmd4X2h0dHBfY29yZV9tb2R1bGUuYyBiL3NyYy9odHRwL25neF9odHRwX2NvcmVfbW9kdWxlLmMKaW5kZXggYzc3M2Q4Zi4uNjIwZDJlOSAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbmd4X2h0dHBfY29yZV9tb2R1bGUuYworKysgYi9zcmMvaHR0cC9uZ3hfaHR0cF9jb3JlX21vZHVsZS5jCkBAIC03ODUsNyArNzg1LDggQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKGkgPCByLT5leHRlbi5sZW4pIHsKLSAgICAgICAgICAgICAgICBpZiAoIShwID0gbmd4X3BhbGxvYyhyLT5wb29sLCByLT5leHRlbi5sZW4pKSkgeworICAgICAgICAgICAgICAgIHAgPSBuZ3hfcGFsbG9jKHItPnBvb2wsIHItPmV4dGVuLmxlbik7CisgICAgICAgICAgICAgICAgaWYgKHAgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwogICAgICAgICAgICAgICAgIH0KIApAQCAtODk3LDcgKzg5OCw4IEBACiAgICAgICAgICAgICByLT5leHRlbi5sZW4gPSByLT51cmkubGVuIC0gaSAtIDE7CiAKICAgICAgICAgICAgIGlmIChyLT5leHRlbi5sZW4gPiAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCEoci0+ZXh0ZW4uZGF0YSA9IG5neF9wYWxsb2Moci0+cG9vbCwgci0+ZXh0ZW4ubGVuICsgMSkpKSB7CisgICAgICAgICAgICAgICAgci0+ZXh0ZW4uZGF0YSA9IG5neF9wYWxsb2Moci0+cG9vbCwgci0+ZXh0ZW4ubGVuICsgMSk7CisgICAgICAgICAgICAgICAgaWYgKHItPmV4dGVuLmRhdGEgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgICAgICAgICAgICAgIH0KIApAQCAtOTk3LDcgKzk5OSw4IEBACiAgICAgbmd4X2h0dHBfY29yZV9zcnZfY29uZl90ICAgKmNzY2YsICoqY3NjZnA7CiAgICAgbmd4X2h0dHBfY29yZV9tYWluX2NvbmZfdCAgKmNtY2Y7CiAKLSAgICBpZiAoIShjdHggPSBuZ3hfcGNhbGxvYyhjZi0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX2NvbmZfY3R4X3QpKSkpIHsKKyAgICBjdHggPSBuZ3hfcGNhbGxvYyhjZi0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX2NvbmZfY3R4X3QpKTsKKyAgICBpZiAoY3R4ID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgIH0KIApAQCAtMTAyNiw3ICsxMDI5LDggQEAKICAgICAgICAgbW9kdWxlID0gbmd4X21vZHVsZXNbbV0tPmN0eDsKIAogICAgICAgICBpZiAobW9kdWxlLT5jcmVhdGVfc3J2X2NvbmYpIHsKLSAgICAgICAgICAgIGlmICghKG1jb25mID0gbW9kdWxlLT5jcmVhdGVfc3J2X2NvbmYoY2YpKSkgeworICAgICAgICAgICAgbWNvbmYgPSBtb2R1bGUtPmNyZWF0ZV9zcnZfY29uZihjZik7CisgICAgICAgICAgICBpZiAobWNvbmYgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICAgICAgICAgIH0KIApAQCAtMTAzNCw3ICsxMDM4LDggQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChtb2R1bGUtPmNyZWF0ZV9sb2NfY29uZikgewotICAgICAgICAgICAgaWYgKCEobWNvbmYgPSBtb2R1bGUtPmNyZWF0ZV9sb2NfY29uZihjZikpKSB7CisgICAgICAgICAgICBtY29uZiA9IG1vZHVsZS0+Y3JlYXRlX2xvY19jb25mKGNmKTsKKyAgICAgICAgICAgIGlmIChtY29uZiA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgICAgICAgICAgfQogCkBAIC0xMDUxLDcgKzEwNTYsOCBAQAogCiAgICAgY21jZiA9IGN0eC0+bWFpbl9jb25mW25neF9odHRwX2NvcmVfbW9kdWxlLmN0eF9pbmRleF07CiAKLSAgICBpZiAoIShjc2NmcCA9IG5neF9hcnJheV9wdXNoKCZjbWNmLT5zZXJ2ZXJzKSkpIHsKKyAgICBjc2NmcCA9IG5neF9hcnJheV9wdXNoKCZjbWNmLT5zZXJ2ZXJzKTsKKyAgICBpZiAoY3NjZnAgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgfQogCkBAIC0xMDk1LDcgKzExMDEsOCBAQAogICAgIHVfY2hhciAgICAgICAgICAgICAgICAgICAgIGVycnN0cltOR1hfTUFYX0NPTkZfRVJSU1RSXTsKICNlbmRpZgogCi0gICAgaWYgKCEoY3R4ID0gbmd4X3BjYWxsb2MoY2YtPnBvb2wsIHNpemVvZihuZ3hfaHR0cF9jb25mX2N0eF90KSkpKSB7CisgICAgY3R4ID0gbmd4X3BjYWxsb2MoY2YtPnBvb2wsIHNpemVvZihuZ3hfaHR0cF9jb25mX2N0eF90KSk7CisgICAgaWYgKGN0eCA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICB9CiAKQEAgLTExODEsNyArMTE4OCw5IEBACiAKICAgICBpZiAocGNsY2YtPm5hbWUubGVuID09IDApIHsKICAgICAgICAgY3NjZiA9IGN0eC0+c3J2X2NvbmZbbmd4X2h0dHBfY29yZV9tb2R1bGUuY3R4X2luZGV4XTsKLSAgICAgICAgaWYgKCEoY2xjZnAgPSBuZ3hfYXJyYXlfcHVzaCgmY3NjZi0+bG9jYXRpb25zKSkpIHsKKworICAgICAgICBjbGNmcCA9IG5neF9hcnJheV9wdXNoKCZjc2NmLT5sb2NhdGlvbnMpOworICAgICAgICBpZiAoY2xjZnAgPT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgICAgICB9CiAKQEAgLTEyMTQsMTEgKzEyMjMsMTUgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChwY2xjZi0+bG9jYXRpb25zLmVsdHMgPT0gTlVMTCkgewotICAgICAgICAgICAgbmd4X2luaXRfYXJyYXkocGNsY2YtPmxvY2F0aW9ucywgY2YtPnBvb2wsIDQsIHNpemVvZih2b2lkICopLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdYX0NPTkZfRVJST1IpOworICAgICAgICAgICAgaWYgKG5neF9hcnJheV9pbml0KCZwY2xjZi0+bG9jYXRpb25zLCBjZi0+cG9vbCwgNCwgc2l6ZW9mKHZvaWQgKikpCisgICAgICAgICAgICAgICAgIT0gTkdYX09LKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGlmICghKGNsY2ZwID0gbmd4X3B1c2hfYXJyYXkoJnBjbGNmLT5sb2NhdGlvbnMpKSkgeworICAgICAgICBjbGNmcCA9IG5neF9hcnJheV9wdXNoKCZwY2xjZi0+bG9jYXRpb25zKTsKKyAgICAgICAgaWYgKGNsY2ZwID09IE5VTEwpIHsKICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICAgICAgfQogICAgIH0KQEAgLTEzNDcsNyArMTM2MCw4IEBACiAgICAgZm9yIChpID0gMTsgaSA8IGNmLT5hcmdzLT5uZWx0czsgaSsrKSB7CiAgICAgICAgIG5neF9odHRwX3R5cGVzX2hhc2hfa2V5KGtleSwgdmFsdWVbaV0pOwogCi0gICAgICAgIGlmICghKHR5cGUgPSBuZ3hfYXJyYXlfcHVzaCgmbGNmLT50eXBlc1trZXldKSkpIHsKKyAgICAgICAgdHlwZSA9IG5neF9hcnJheV9wdXNoKCZsY2YtPnR5cGVzW2tleV0pOworICAgICAgICBpZiAodHlwZSA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgICAgIH0KIApAQCAtMTM2NCw3ICsxMzc4LDggQEAKIHsKICAgICBuZ3hfaHR0cF9jb3JlX21haW5fY29uZl90ICAqY21jZjsKIAotICAgIGlmICghKGNtY2YgPSBuZ3hfcGNhbGxvYyhjZi0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX2NvcmVfbWFpbl9jb25mX3QpKSkpIHsKKyAgICBjbWNmID0gbmd4X3BjYWxsb2MoY2YtPnBvb2wsIHNpemVvZihuZ3hfaHR0cF9jb3JlX21haW5fY29uZl90KSk7CisgICAgaWYgKGNtY2YgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgfQogCkBAIC0xNDAzLDcgKzE0MTgsOCBAQAogewogICAgIG5neF9odHRwX2NvcmVfc3J2X2NvbmZfdCAgKmNzY2Y7CiAKLSAgICBpZiAoIShjc2NmID0gbmd4X3BjYWxsb2MoY2YtPnBvb2wsIHNpemVvZihuZ3hfaHR0cF9jb3JlX3Nydl9jb25mX3QpKSkpIHsKKyAgICBjc2NmID0gbmd4X3BjYWxsb2MoY2YtPnBvb2wsIHNpemVvZihuZ3hfaHR0cF9jb3JlX3Nydl9jb25mX3QpKTsKKyAgICBpZiAoY3NjZiA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICB9CiAKQEAgLTE0NTUsNyArMTQ3MSw4IEBACiAgICAgLyogVE9ETzogaXQgZG9lcyBub3QgbWVyZ2UsIGl0IGluaXRzIG9ubHkgKi8KIAogICAgIGlmIChjb25mLT5saXN0ZW4ubmVsdHMgPT0gMCkgewotICAgICAgICBpZiAoIShscyA9IG5neF9hcnJheV9wdXNoKCZjb25mLT5saXN0ZW4pKSkgeworICAgICAgICBscyA9IG5neF9hcnJheV9wdXNoKCZjb25mLT5saXN0ZW4pOworICAgICAgICBpZiAobHMgPT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgICAgICB9CiAKQEAgLTE0NzAsMTEgKzE0ODcsMTMgQEAKICAgICB9CiAKICAgICBpZiAoY29uZi0+c2VydmVyX25hbWVzLm5lbHRzID09IDApIHsKLSAgICAgICAgaWYgKCEoc24gPSBuZ3hfYXJyYXlfcHVzaCgmY29uZi0+c2VydmVyX25hbWVzKSkpIHsKKyAgICAgICAgc24gPSBuZ3hfYXJyYXlfcHVzaCgmY29uZi0+c2VydmVyX25hbWVzKTsKKyAgICAgICAgaWYgKHNuID09IE5VTEwpIHsKICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICAgICAgfQogCi0gICAgICAgIGlmICghKHNuLT5uYW1lLmRhdGEgPSBuZ3hfcGFsbG9jKGNmLT5wb29sLCBOR1hfTUFYSE9TVE5BTUVMRU4pKSkgeworICAgICAgICBzbi0+bmFtZS5kYXRhID0gbmd4X3BhbGxvYyhjZi0+cG9vbCwgTkdYX01BWEhPU1ROQU1FTEVOKTsKKyAgICAgICAgaWYgKHNuLT5uYW1lLmRhdGEgPT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgICAgICB9CiAKQEAgLTE1MjgsNyArMTU0Nyw4IEBACiB7CiAgICAgbmd4X2h0dHBfY29yZV9sb2NfY29uZl90ICAqbGNmOwogCi0gICAgaWYgKCEobGNmID0gbmd4X3BjYWxsb2MoY2YtPnBvb2wsIHNpemVvZihuZ3hfaHR0cF9jb3JlX2xvY19jb25mX3QpKSkpIHsKKyAgICBsY2YgPSBuZ3hfcGNhbGxvYyhjZi0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX2NvcmVfbG9jX2NvbmZfdCkpOworICAgIGlmIChsY2YgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgfQogCkBAIC0xNjE4LDcgKzE2MzgsOCBAQAogICAgICAgICAgICAgICAgIG5neF9odHRwX3R5cGVzX2hhc2hfa2V5KGtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9jb3JlX2RlZmF1bHRfdHlwZXNbaV0uZXh0ZW4pOwogCi0gICAgICAgICAgICAgICAgaWYgKCEodHlwZSA9IG5neF9hcnJheV9wdXNoKCZjb25mLT50eXBlc1trZXldKSkpIHsKKyAgICAgICAgICAgICAgICB0eXBlID0gbmd4X2FycmF5X3B1c2goJmNvbmYtPnR5cGVzW2tleV0pOworICAgICAgICAgICAgICAgIGlmICh0eXBlID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgICAgICAgICAgICAgIH0KIApAQCAtMTcwMCw3ICsxNzIxLDggQEAKICAgICAgKiAgICAgICBhZGQgcmVzb2x2ZWQgbmFtZSB0byBzZXJ2ZXIgbmFtZXMgPz8/CiAgICAgICovCiAKLSAgICBpZiAoIShscyA9IG5neF9hcnJheV9wdXNoKCZzY2YtPmxpc3RlbikpKSB7CisgICAgbHMgPSBuZ3hfYXJyYXlfcHVzaCgmc2NmLT5saXN0ZW4pOworICAgIGlmIChscyA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICB9CiAKQEAgLTE3OTYsNyArMTgxOCw4IEBACiAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoIShzbiA9IG5neF9hcnJheV9wdXNoKCZzY2YtPnNlcnZlcl9uYW1lcykpKSB7CisgICAgICAgIHNuID0gbmd4X2FycmF5X3B1c2goJnNjZi0+c2VydmVyX25hbWVzKTsKKyAgICAgICAgaWYgKHNuID09IE5VTEwpIHsKICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICAgICAgfQogCkBAIC0xOTA4LDcgKzE5MzEsOCBAQAogICAgIH0KIAogICAgIGZvciAoaSA9IDE7IGkgPCBjZi0+YXJncy0+bmVsdHMgLSBuOyBpKyspIHsKLSAgICAgICAgaWYgKCEoZXJyID0gbmd4X2FycmF5X3B1c2gobGNmLT5lcnJvcl9wYWdlcykpKSB7CisgICAgICAgIGVyciA9IG5neF9hcnJheV9wdXNoKGxjZi0+ZXJyb3JfcGFnZXMpOworICAgICAgICBpZiAoZXJyID09IE5VTEwpIHsKICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICAgICAgfQogCkBAIC0xOTgxLDcgKzIwMDUsOCBAQAogewogICAgIG5neF9odHRwX2NvcmVfbG9jX2NvbmZfdCAqbGNmID0gY29uZjsKIAotICAgIGlmICghKGxjZi0+ZXJyX2xvZyA9IG5neF9sb2dfY3JlYXRlX2VycmxvZyhjZi0+Y3ljbGUsIGNmLT5hcmdzKSkpIHsKKyAgICBsY2YtPmVycl9sb2cgPSBuZ3hfbG9nX2NyZWF0ZV9lcnJsb2coY2YtPmN5Y2xlLCBjZi0+YXJncyk7CisgICAgaWYgKGxjZi0+ZXJyX2xvZyA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICB9CiAKQEAgLTIwMjEsNSArMjA0Niw1IEBACiBzdGF0aWMgbmd4X2ludF90CiBuZ3hfaHR0cF9jb3JlX2luaXQobmd4X2N5Y2xlX3QgKmN5Y2xlKQogewotICAgIHJldHVybiBuZ3hfaHR0cF9jb3JlX3ZhcmlhYmxlc19pbml0KGN5Y2xlKTsKKyAgICByZXR1cm4gbmd4X2h0dHBfdmFyaWFibGVzX2luaXQoY3ljbGUpOwogfQpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbmd4X2h0dHBfaGVhZGVyX2ZpbHRlci5jIGIvc3JjL2h0dHAvbmd4X2h0dHBfaGVhZGVyX2ZpbHRlcl9tb2R1bGUuYwpzaW1pbGFyaXR5IGluZGV4IDk3JQpyZW5hbWUgZnJvbSBzcmMvaHR0cC9uZ3hfaHR0cF9oZWFkZXJfZmlsdGVyLmMKcmVuYW1lIHRvIHNyYy9odHRwL25neF9odHRwX2hlYWRlcl9maWx0ZXJfbW9kdWxlLmMKaW5kZXggNjVkOGRlZS4uYjlkZDg4ZCAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbmd4X2h0dHBfaGVhZGVyX2ZpbHRlci5jCisrKyBiL3NyYy9odHRwL25neF9odHRwX2hlYWRlcl9maWx0ZXJfbW9kdWxlLmMKQEAgLTE0NSw3ICsxNDUsNyBAQAogICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgIGxlbjsKICAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICBzdGF0dXMsIGk7CiAgICAgbmd4X2J1Zl90ICAgICAgICAgICAgICAgICAqYjsKLSAgICBuZ3hfY2hhaW5fdCAgICAgICAgICAgICAgICpsbjsKKyAgICBuZ3hfY2hhaW5fdCAgICAgICAgICAgICAgICBvdXQ7CiAgICAgbmd4X2xpc3RfcGFydF90ICAgICAgICAgICAqcGFydDsKICAgICBuZ3hfdGFibGVfZWx0X3QgICAgICAgICAgICpoZWFkZXI7CiAgICAgbmd4X2h0dHBfY29yZV9sb2NfY29uZl90ICAqY2xjZjsKQEAgLTMxMSw3ICszMTEsOCBAQAogICAgICAgICAgICAgICAgKyBzaXplb2YoQ1JMRikgLSAxOwogICAgIH0KIAotICAgIGlmICghKGIgPSBuZ3hfY3JlYXRlX3RlbXBfYnVmKHItPnBvb2wsIGxlbikpKSB7CisgICAgYiA9IG5neF9jcmVhdGVfdGVtcF9idWYoci0+cG9vbCwgbGVuKTsKKyAgICBpZiAoYiA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgfQogCkBAIC00NjEsMTQgKzQ2MiwxMCBAQAogICAgICAgICBiLT5sYXN0X2J1ZiA9IDE7CiAgICAgfQogCi0gICAgaWYgKCEobG4gPSBuZ3hfYWxsb2NfY2hhaW5fbGluayhyLT5wb29sKSkpIHsKLSAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKLSAgICB9CisgICAgb3V0LmJ1ZiA9IGI7CisgICAgb3V0Lm5leHQgPSBOVUxMOwogCi0gICAgbG4tPmJ1ZiA9IGI7Ci0gICAgbG4tPm5leHQgPSBOVUxMOwotCi0gICAgcmV0dXJuIG5neF9odHRwX3dyaXRlX2ZpbHRlcihyLCBsbik7CisgICAgcmV0dXJuIG5neF9odHRwX3dyaXRlX2ZpbHRlcihyLCAmb3V0KTsKIH0KIAogCmRpZmYgLS1naXQgYS9zcmMvaHR0cC9uZ3hfaHR0cF9sb2dfaGFuZGxlci5jIGIvc3JjL2h0dHAvbmd4X2h0dHBfbG9nX21vZHVsZS5jCnNpbWlsYXJpdHkgaW5kZXggODglCnJlbmFtZSBmcm9tIHNyYy9odHRwL25neF9odHRwX2xvZ19oYW5kbGVyLmMKcmVuYW1lIHRvIHNyYy9odHRwL25neF9odHRwX2xvZ19tb2R1bGUuYwppbmRleCA0Y2I0YWY3Li5kMTljYWU3IDEwMDY0NAotLS0gYS9zcmMvaHR0cC9uZ3hfaHR0cF9sb2dfaGFuZGxlci5jCisrKyBiL3NyYy9odHRwL25neF9odHRwX2xvZ19tb2R1bGUuYwpAQCAtMzYsOCArMzYsOCBAQAogc3RhdGljIHVfY2hhciAqbmd4X2h0dHBfbG9nX3JlcXVlc3Qobmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1X2NoYXIgKmJ1ZiwKICAgICBuZ3hfaHR0cF9sb2dfb3BfdCAqb3ApOwogCi1zdGF0aWMgbmd4X2ludF90IG5neF9odHRwX2xvZ19oZWFkZXJfaW5fY29tcGlsZShuZ3hfaHR0cF9sb2dfb3BfdCAqb3AsCi0gICAgbmd4X3N0cl90ICp2YWx1ZSk7CitzdGF0aWMgbmd4X2ludF90IG5neF9odHRwX2xvZ19oZWFkZXJfaW5fY29tcGlsZShuZ3hfY29uZl90ICpjZiwKKyAgICBuZ3hfaHR0cF9sb2dfb3BfdCAqb3AsIG5neF9zdHJfdCAqdmFsdWUpOwogc3RhdGljIHNpemVfdCBuZ3hfaHR0cF9sb2dfaGVhZGVyX2luX2dldGxlbihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCiAgICAgdWludHB0cl90IGRhdGEpOwogc3RhdGljIHVfY2hhciAqbmd4X2h0dHBfbG9nX2hlYWRlcl9pbihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVfY2hhciAqYnVmLApAQCAtNDcsOCArNDcsOCBAQAogc3RhdGljIHVfY2hhciAqbmd4X2h0dHBfbG9nX3Vua25vd25faGVhZGVyX2luKG5neF9odHRwX3JlcXVlc3RfdCAqciwKICAgICB1X2NoYXIgKmJ1Ziwgbmd4X2h0dHBfbG9nX29wX3QgKm9wKTsKIAotc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9sb2dfaGVhZGVyX291dF9jb21waWxlKG5neF9odHRwX2xvZ19vcF90ICpvcCwKLSAgICBuZ3hfc3RyX3QgKnZhbHVlKTsKK3N0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfbG9nX2hlYWRlcl9vdXRfY29tcGlsZShuZ3hfY29uZl90ICpjZiwKKyAgICBuZ3hfaHR0cF9sb2dfb3BfdCAqb3AsIG5neF9zdHJfdCAqdmFsdWUpOwogc3RhdGljIHNpemVfdCBuZ3hfaHR0cF9sb2dfaGVhZGVyX291dF9nZXRsZW4obmd4X2h0dHBfcmVxdWVzdF90ICpyLAogICAgIHVpbnRwdHJfdCBkYXRhKTsKIHN0YXRpYyB1X2NoYXIgKm5neF9odHRwX2xvZ19oZWFkZXJfb3V0KG5neF9odHRwX3JlcXVlc3RfdCAqciwgdV9jaGFyICpidWYsCkBAIC02Niw2ICs2NiwxNCBAQAogc3RhdGljIG5neF90YWJsZV9lbHRfdCAqbmd4X2h0dHBfbG9nX3Vua25vd25faGVhZGVyKG5neF9saXN0X3QgKmhlYWRlcnMsCiAgICAgbmd4X3N0cl90ICp2YWx1ZSk7CiAKK3N0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfbG9nX3ZhcmlhYmxlX2NvbXBpbGUobmd4X2NvbmZfdCAqY2YsCisgICAgbmd4X2h0dHBfbG9nX29wX3QgKm9wLCBuZ3hfc3RyX3QgKnZhbHVlKTsKK3N0YXRpYyBzaXplX3Qgbmd4X2h0dHBfbG9nX3ZhcmlhYmxlX2dldGxlbihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCisgICAgdWludHB0cl90IGRhdGEpOworc3RhdGljIHVfY2hhciAqbmd4X2h0dHBfbG9nX3ZhcmlhYmxlKG5neF9odHRwX3JlcXVlc3RfdCAqciwgdV9jaGFyICpidWYsCisgICAgbmd4X2h0dHBfbG9nX29wX3QgKm9wKTsKKworCiBzdGF0aWMgbmd4X2ludF90IG5neF9odHRwX2xvZ19zZXRfZm9ybWF0cyhuZ3hfY29uZl90ICpjZik7CiBzdGF0aWMgdm9pZCAqbmd4X2h0dHBfbG9nX2NyZWF0ZV9tYWluX2NvbmYobmd4X2NvbmZfdCAqY2YpOwogc3RhdGljIHZvaWQgKm5neF9odHRwX2xvZ19jcmVhdGVfbG9jX2NvbmYobmd4X2NvbmZfdCAqY2YpOwpAQCAtNzUsOCArODMsNiBAQAogICAgIHZvaWQgKmNvbmYpOwogc3RhdGljIGNoYXIgKm5neF9odHRwX2xvZ19zZXRfZm9ybWF0KG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpjbWQsCiAgICAgdm9pZCAqY29uZik7Ci1zdGF0aWMgbmd4X2ludF90IG5neF9odHRwX2xvZ19wYXJzZV9mb3JtYXQobmd4X2NvbmZfdCAqY2YsIG5neF9hcnJheV90ICpvcHMsCi0gICAgbmd4X3N0cl90ICpsaW5lKTsKIAogCiBzdGF0aWMgbmd4X2NvbW1hbmRfdCAgbmd4X2h0dHBfbG9nX2NvbW1hbmRzW10gPSB7CkBAIC0xNTIsMTMgKzE1OCwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9sb2dfcmVxdWVzdF9nZXRsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX2xvZ19yZXF1ZXN0IH0sCiAKLSAgICB7IG5neF9zdHJpbmcoImkiKSwgMCwgbmd4X2h0dHBfbG9nX2hlYWRlcl9pbl9jb21waWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9sb2dfaGVhZGVyX2luX2dldGxlbiwKKyAgICB7IG5neF9zdHJpbmcoImkiKSwgMCwgbmd4X2h0dHBfbG9nX2hlYWRlcl9pbl9jb21waWxlLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9sb2dfaGVhZGVyX2luIH0sCi0KLSAgICB7IG5neF9zdHJpbmcoIm8iKSwgMCwgbmd4X2h0dHBfbG9nX2hlYWRlcl9vdXRfY29tcGlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfbG9nX2hlYWRlcl9vdXRfZ2V0bGVuLAorICAgIHsgbmd4X3N0cmluZygibyIpLCAwLCBuZ3hfaHR0cF9sb2dfaGVhZGVyX291dF9jb21waWxlLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9sb2dfaGVhZGVyX291dCB9LAorICAgIHsgbmd4X3N0cmluZygidiIpLCAwLCBuZ3hfaHR0cF9sb2dfdmFyaWFibGVfY29tcGlsZSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfbG9nX3ZhcmlhYmxlIH0sCiAKICAgICB7IG5neF9udWxsX3N0cmluZywgMCwgTlVMTCwgTlVMTCwgTlVMTCB9CiB9OwpAQCAtMjA2LDcgKzIxMSw4IEBACiAgICAgICAgIGxlbisrOwogI2VuZGlmCiAKLSAgICAgICAgaWYgKCEobGluZSA9IG5neF9wYWxsb2Moci0+cG9vbCwgbGVuKSkpIHsKKyAgICAgICAgbGluZSA9IG5neF9wYWxsb2Moci0+cG9vbCwgbGVuKTsKKyAgICAgICAgaWYgKGxpbmUgPT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICAgICAgfQogCkBAIC0zNzIsNyArMzc4LDggQEAKIAogCiBzdGF0aWMgbmd4X2ludF90Ci1uZ3hfaHR0cF9sb2dfaGVhZGVyX2luX2NvbXBpbGUobmd4X2h0dHBfbG9nX29wX3QgKm9wLCBuZ3hfc3RyX3QgKnZhbHVlKQorbmd4X2h0dHBfbG9nX2hlYWRlcl9pbl9jb21waWxlKG5neF9jb25mX3QgKmNmLCBuZ3hfaHR0cF9sb2dfb3BfdCAqb3AsCisgICAgbmd4X3N0cl90ICp2YWx1ZSkKIHsKICAgICBuZ3hfdWludF90ICBpOwogCkBAIC0zODUsNyArMzkyLDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChuZ3hfc3RybmNhc2VjbXAobmd4X2h0dHBfaGVhZGVyc19pbltpXS5uYW1lLmRhdGEsIHZhbHVlLT5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS0+bGVuKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLT5sZW4pID09IDApCiAgICAgICAgIHsKICAgICAgICAgICAgIG9wLT5nZXRsZW4gPSBuZ3hfaHR0cF9sb2dfaGVhZGVyX2luX2dldGxlbjsKICAgICAgICAgICAgIG9wLT5ydW4gPSBuZ3hfaHR0cF9sb2dfaGVhZGVyX2luOwpAQCAtNDcxLDcgKzQ3OCw4IEBACiAKIAogc3RhdGljIG5neF9pbnRfdAotbmd4X2h0dHBfbG9nX2hlYWRlcl9vdXRfY29tcGlsZShuZ3hfaHR0cF9sb2dfb3BfdCAqb3AsIG5neF9zdHJfdCAqdmFsdWUpCituZ3hfaHR0cF9sb2dfaGVhZGVyX291dF9jb21waWxlKG5neF9jb25mX3QgKmNmLCBuZ3hfaHR0cF9sb2dfb3BfdCAqb3AsCisgICAgbmd4X3N0cl90ICp2YWx1ZSkKIHsKICAgICBuZ3hfdWludF90ICBpOwogCkBAIC03MjEsNiArNzI5LDY4IEBACiB9CiAKIAorc3RhdGljIG5neF9pbnRfdCAKK25neF9odHRwX2xvZ192YXJpYWJsZV9jb21waWxlKG5neF9jb25mX3QgKmNmLCBuZ3hfaHR0cF9sb2dfb3BfdCAqb3AsCisgICAgbmd4X3N0cl90ICp2YWx1ZSkKK3sKKyAgICBuZ3hfdWludF90ICAgICAgICAgICAgaTsKKyAgICBuZ3hfaHR0cF92YXJpYWJsZV90ICAqdmFyOworCisgICAgZm9yIChpID0gMDsgaSA8IHZhbHVlLT5sZW47IGkrKykgeworICAgICAgICB2YWx1ZS0+ZGF0YVtpXSA9IG5neF90b3VwcGVyKHZhbHVlLT5kYXRhW2ldKTsKKyAgICB9CisKKyAgICB2YXIgPSBuZ3hfaHR0cF9hZGRfdmFyaWFibGUoY2YsIHZhbHVlLCAwKTsKKyAgICBpZiAodmFyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICB9CisKKyAgICBvcC0+bGVuID0gMDsKKyAgICBvcC0+Z2V0bGVuID0gbmd4X2h0dHBfbG9nX3ZhcmlhYmxlX2dldGxlbjsKKyAgICBvcC0+cnVuID0gbmd4X2h0dHBfbG9nX3ZhcmlhYmxlOworICAgIG9wLT5kYXRhID0gdmFyLT5pbmRleDsKKworICAgIHJldHVybiBOR1hfT0s7Cit9CisKKworc3RhdGljIHNpemVfdAorbmd4X2h0dHBfbG9nX3ZhcmlhYmxlX2dldGxlbihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVpbnRwdHJfdCBkYXRhKQoreworICAgIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgICp2YWx1ZTsKKworICAgIHZhbHVlID0gbmd4X2h0dHBfZ2V0X2luZGV4ZWRfdmFyaWFibGUociwgZGF0YSk7CisKKyAgICBpZiAodmFsdWUgPT0gTlVMTAorICAgICAgICB8fCB2YWx1ZSA9PSBOR1hfSFRUUF9WQVJJQUJMRV9OT1RfRk9VTkQKKyAgICAgICAgfHwgdmFsdWUtPnRleHQubGVuID09IDApCisgICAgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICByZXR1cm4gdmFsdWUtPnRleHQubGVuOworfQorCisKK3N0YXRpYyB1X2NoYXIgKgorbmd4X2h0dHBfbG9nX3ZhcmlhYmxlKG5neF9odHRwX3JlcXVlc3RfdCAqciwgdV9jaGFyICpidWYsIG5neF9odHRwX2xvZ19vcF90ICpvcCkKK3sKKyAgICBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICAqdmFsdWU7CisKKyAgICB2YWx1ZSA9IG5neF9odHRwX2dldF9pbmRleGVkX3ZhcmlhYmxlKHIsIG9wLT5kYXRhKTsKKworICAgIGlmICh2YWx1ZSA9PSBOVUxMCisgICAgICAgIHx8IHZhbHVlID09IE5HWF9IVFRQX1ZBUklBQkxFX05PVF9GT1VORAorICAgICAgICB8fCB2YWx1ZS0+dGV4dC5sZW4gPT0gMCkKKyAgICB7CisgICAgICAgICpidWYgPSAnLSc7CisgICAgICAgIHJldHVybiBidWYgKyAxOworICAgIH0KKworICAgIHJldHVybiBuZ3hfY3B5bWVtKGJ1ZiwgdmFsdWUtPnRleHQuZGF0YSwgdmFsdWUtPnRleHQubGVuKTsKK30KKworCiBzdGF0aWMgbmd4X2ludF90CiBuZ3hfaHR0cF9sb2dfc2V0X2Zvcm1hdHMobmd4X2NvbmZfdCAqY2YpCiB7CkBAIC03NDEsNyArODExLDggQEAKICAgICBjaGFyICAgICAgICpyYzsKICAgICBuZ3hfc3RyX3QgICp2YWx1ZTsKIAotICAgIGlmICghKGNvbmYgPSBuZ3hfcGNhbGxvYyhjZi0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX2xvZ19tYWluX2NvbmZfdCkpKSkgeworICAgIGNvbmYgPSBuZ3hfcGNhbGxvYyhjZi0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX2xvZ19tYWluX2NvbmZfdCkpOworICAgIGlmIChjb25mID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgIH0KIApAQCAtNzUzLDE4ICs4MjQsMjEgQEAKIAogICAgIGNmLT5hcmdzLT5uZWx0cyA9IDA7CiAKLSAgICBpZiAoISh2YWx1ZSA9IG5neF9hcnJheV9wdXNoKGNmLT5hcmdzKSkpIHsKKyAgICB2YWx1ZSA9IG5neF9hcnJheV9wdXNoKGNmLT5hcmdzKTsKKyAgICBpZiAodmFsdWUgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgfQogCi0gICAgaWYgKCEodmFsdWUgPSBuZ3hfYXJyYXlfcHVzaChjZi0+YXJncykpKSB7CisgICAgdmFsdWUgPSBuZ3hfYXJyYXlfcHVzaChjZi0+YXJncyk7CisgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgIH0KIAogICAgIHZhbHVlLT5sZW4gPSBzaXplb2YoImNvbWJpbmVkIikgLSAxOwogICAgIHZhbHVlLT5kYXRhID0gKHVfY2hhciAqKSAiY29tYmluZWQiOwogCi0gICAgaWYgKCEodmFsdWUgPSBuZ3hfYXJyYXlfcHVzaChjZi0+YXJncykpKSB7CisgICAgdmFsdWUgPSBuZ3hfYXJyYXlfcHVzaChjZi0+YXJncyk7CisgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgIH0KIApAQCAtNzg0LDcgKzg1OCw4IEBACiB7CiAgICAgbmd4X2h0dHBfbG9nX2xvY19jb25mX3QgICpjb25mOwogCi0gICAgaWYgKCEoY29uZiA9IG5neF9wY2FsbG9jKGNmLT5wb29sLCBzaXplb2Yobmd4X2h0dHBfbG9nX2xvY19jb25mX3QpKSkpIHsKKyAgICBjb25mID0gbmd4X3BjYWxsb2MoY2YtPnBvb2wsIHNpemVvZihuZ3hfaHR0cF9sb2dfbG9jX2NvbmZfdCkpOworICAgIGlmIChjb25mID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgIH0KIApAQCAtODIzLDcgKzg5OCw4IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoIShsb2cgPSBuZ3hfYXJyYXlfcHVzaChjb25mLT5sb2dzKSkpIHsKKyAgICAgICAgICAgIGxvZyA9IG5neF9hcnJheV9wdXNoKGNvbmYtPmxvZ3MpOworICAgICAgICAgICAgaWYgKGxvZyA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgICAgICAgICAgfQogCkBAIC04NzEsMTEgKzk0NywxMyBAQAogCiAgICAgbG1jZiA9IG5neF9odHRwX2NvbmZfZ2V0X21vZHVsZV9tYWluX2NvbmYoY2YsIG5neF9odHRwX2xvZ19tb2R1bGUpOwogCi0gICAgaWYgKCEobG9nID0gbmd4X2FycmF5X3B1c2gobGxjZi0+bG9ncykpKSB7CisgICAgbG9nID0gbmd4X2FycmF5X3B1c2gobGxjZi0+bG9ncyk7CisgICAgaWYgKGxvZyA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICB9CiAKLSAgICBpZiAoIShsb2ctPmZpbGUgPSBuZ3hfY29uZl9vcGVuX2ZpbGUoY2YtPmN5Y2xlLCAmdmFsdWVbMV0pKSkgeworICAgIGxvZy0+ZmlsZSA9IG5neF9jb25mX29wZW5fZmlsZShjZi0+Y3ljbGUsICZ2YWx1ZVsxXSk7CisgICAgaWYgKGxvZy0+ZmlsZSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICB9CiAKQEAgLTkyNywxOSArMTAwNSwyMSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKCEoZm10ID0gbmd4X3B1c2hfYXJyYXkoJmxtY2YtPmZvcm1hdHMpKSkgeworICAgIGZtdCA9IG5neF9hcnJheV9wdXNoKCZsbWNmLT5mb3JtYXRzKTsKKyAgICBpZiAoZm10ID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgIH0KIAogICAgIGZtdC0+bmFtZSA9IHZhbHVlWzFdOwogCi0gICAgaWYgKCEoZm10LT5vcHMgPSBuZ3hfYXJyYXlfY3JlYXRlKGNmLT5wb29sLCAyMCwgc2l6ZW9mKG5neF9odHRwX2xvZ19vcF90KSkpKQotICAgIHsKKyAgICBmbXQtPm9wcyA9IG5neF9hcnJheV9jcmVhdGUoY2YtPnBvb2wsIDIwLCBzaXplb2Yobmd4X2h0dHBfbG9nX29wX3QpKTsKKyAgICBpZiAoZm10LT5vcHMgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgfQogCiAgICAgaW52YWxpZCA9IDA7CiAgICAgZGF0YSA9IE5VTEw7CisgICAgYXJnLmRhdGEgPSBOVUxMOwogCiAgICAgZm9yIChzID0gMjsgcyA8IGNmLT5hcmdzLT5uZWx0cyAmJiAhaW52YWxpZDsgcysrKSB7CiAKQEAgLTk0Nyw3ICsxMDI3LDggQEAKIAogICAgICAgICB3aGlsZSAoaSA8IHZhbHVlW3NdLmxlbikgewogCi0gICAgICAgICAgICBpZiAoIShvcCA9IG5neF9wdXNoX2FycmF5KGZtdC0+b3BzKSkpIHsKKyAgICAgICAgICAgIG9wID0gbmd4X2FycmF5X3B1c2goZm10LT5vcHMpOworICAgICAgICAgICAgaWYgKG9wID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgICAgICAgICB9CiAKQEAgLTEwMzIsMTIgKzExMTMsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGEgPSBuZ3hfcGFsbG9jKGNmLT5wb29sLCBzaXplb2Yobmd4X3N0cl90KSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhID0gbmd4X3BhbGxvYyhjZi0+cG9vbCwgc2l6ZW9mKG5neF9zdHJfdCkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICAgICAgKmEgPSBhcmc7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZS0+Y29tcGlsZShvcCwgYSkgPT0gTkdYX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZS0+Y29tcGlsZShjZiwgb3AsIGEpID09IE5HWF9FUlJPUikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KIApAQCAtMTA3Niw3ICsxMTU4LDggQEAKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG9wLT5ydW4gPSBuZ3hfaHR0cF9sb2dfY29weV9sb25nOwogCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShwID0gbmd4X3BhbGxvYyhjZi0+cG9vbCwgbGVuKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHAgPSBuZ3hfcGFsbG9jKGNmLT5wb29sLCBsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHAgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbmd4X2h0dHBfbG9nX2hhbmRsZXIuaCBiL3NyYy9odHRwL25neF9odHRwX2xvZ19tb2R1bGUuaApzaW1pbGFyaXR5IGluZGV4IDc3JQpyZW5hbWUgZnJvbSBzcmMvaHR0cC9uZ3hfaHR0cF9sb2dfaGFuZGxlci5oCnJlbmFtZSB0byBzcmMvaHR0cC9uZ3hfaHR0cF9sb2dfbW9kdWxlLmgKaW5kZXggNDQ3MmVkOS4uYzQxNGJjNCAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbmd4X2h0dHBfbG9nX2hhbmRsZXIuaAorKysgYi9zcmMvaHR0cC9uZ3hfaHR0cF9sb2dfbW9kdWxlLmgKQEAgLTQsOCArNCw4IEBACiAgKi8KIAogCi0jaWZuZGVmIF9OR1hfSFRUUF9MT0dfSEFORExFUl9IX0lOQ0xVREVEXwotI2RlZmluZSBfTkdYX0hUVFBfTE9HX0hBTkRMRVJfSF9JTkNMVURFRF8KKyNpZm5kZWYgX05HWF9IVFRQX0xPR19NT0RVTEVfSF9JTkNMVURFRF8KKyNkZWZpbmUgX05HWF9IVFRQX0xPR19NT0RVTEVfSF9JTkNMVURFRF8KIAogCiAjaW5jbHVkZSA8bmd4X2NvbmZpZy5oPgpAQCAtMTYsMTMgKzE2LDE0IEBACiB0eXBlZGVmIHN0cnVjdCBuZ3hfaHR0cF9sb2dfb3BfcyAgbmd4X2h0dHBfbG9nX29wX3Q7CiAKIHR5cGVkZWYgdV9jaGFyICooKm5neF9odHRwX2xvZ19vcF9ydW5fcHQpIChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVfY2hhciAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX2xvZ19vcF90ICpvcCk7CisgICAgbmd4X2h0dHBfbG9nX29wX3QgKm9wKTsKIAogdHlwZWRlZiBzaXplX3QgKCpuZ3hfaHR0cF9sb2dfb3BfZ2V0bGVuX3B0KSAobmd4X2h0dHBfcmVxdWVzdF90ICpyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludHB0cl90IGRhdGEpOworICAgIHVpbnRwdHJfdCBkYXRhKTsKIAotdHlwZWRlZiBuZ3hfaW50X3QgKCpuZ3hfaHR0cF9sb2dfb3BfY29tcGlsZV9wdCkgKG5neF9odHRwX2xvZ19vcF90ICpvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfc3RyX3QgKnZhbHVlKTsKK3R5cGVkZWYgbmd4X2ludF90ICgqbmd4X2h0dHBfbG9nX29wX2NvbXBpbGVfcHQpIChuZ3hfY29uZl90ICpjZiwKKyAgICBuZ3hfaHR0cF9sb2dfb3BfdCAqb3AsIG5neF9zdHJfdCAqdmFsdWUpOworCiAKIHN0cnVjdCBuZ3hfaHR0cF9sb2dfb3BfcyB7CiAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgIGxlbjsKQEAgLTY3LDQgKzY4LDQgQEAKIGV4dGVybiBuZ3hfaHR0cF9sb2dfb3BfbmFtZV90IG5neF9odHRwX2xvZ19mbXRfb3BzW107CiAKIAotI2VuZGlmIC8qIF9OR1hfSFRUUF9MT0dfSEFORExFUl9IX0lOQ0xVREVEXyAqLworI2VuZGlmIC8qIF9OR1hfSFRUUF9MT0dfTU9EVUxFX0hfSU5DTFVERURfICovCmRpZmYgLS1naXQgYS9zcmMvaHR0cC9uZ3hfaHR0cF9wYXJzZS5jIGIvc3JjL2h0dHAvbmd4X2h0dHBfcGFyc2UuYwppbmRleCBjYTg0ZDE2Li5hN2Q4ZmUzIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9uZ3hfaHR0cF9wYXJzZS5jCisrKyBiL3NyYy9odHRwL25neF9odHRwX3BhcnNlLmMKQEAgLTQ2MSw3ICs0NjEsNiBAQAogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0hUVFBfUEFSU0VfSU5WQUxJRF9SRVFVRVNUOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTY0Niw3ICs2NDUsNiBAQAogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0hUVFBfUEFSU0VfSU5WQUxJRF9IRUFERVI7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKIAogICAgICAgICAvKiBlbmQgb2YgaGVhZGVyICovCiAgICAgICAgIGNhc2Ugc3dfaGVhZGVyX2FsbW9zdF9kb25lOgpAQCAtNjU2LDcgKzY1NCw2IEBACiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIHJldHVybiBOR1hfSFRUUF9QQVJTRV9JTlZBTElEX0hFQURFUjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvaHR0cC9uZ3hfaHR0cF9wYXJzZV90aW1lLmMgYi9zcmMvaHR0cC9uZ3hfaHR0cF9wYXJzZV90aW1lLmMKaW5kZXggZGE5Nzk3MS4uNTQ5ODczNyAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbmd4X2h0dHBfcGFyc2VfdGltZS5jCisrKyBiL3NyYy9odHRwL25neF9odHRwX3BhcnNlX3RpbWUuYwpAQCAtMjI5LDEwICsyMjksMTQgQEAKICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICB9CiAKLSAgICBpZiAoc2l6ZW9mKHRpbWVfdCkgPD0gNCAmJiB5ZWFyID49IDIwMzgpIHsKKyNpZiAoTkdYX1RJTUVfVF9TSVpFIDw9IDQpCisKKyAgICBpZiAoeWVhciA+PSAyMDM4KSB7CiAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgfQogCisjZW5kaWYKKwogICAgIC8qCiAgICAgICogc2hpZnQgbmV3IHllYXIgdG8gTWFyY2ggMSBhbmQgc3RhcnQgbW9udGhzIGZyb20gMSAobm90IDApLAogICAgICAqIGl0IGlzIG5lZWRlZCBmb3IgR2F1c3MncyBmb3JtdWxhCmRpZmYgLS1naXQgYS9zcmMvaHR0cC9uZ3hfaHR0cF9yZXF1ZXN0LmMgYi9zcmMvaHR0cC9uZ3hfaHR0cF9yZXF1ZXN0LmMKaW5kZXggZDQxY2I4ZC4uMzg3NmUzOSAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbmd4X2h0dHBfcmVxdWVzdC5jCisrKyBiL3NyYy9odHRwL25neF9odHRwX3JlcXVlc3QuYwpAQCAtMTgsNyArMTgsNyBAQAogc3RhdGljIHZvaWQgbmd4X2h0dHBfcHJvY2Vzc19yZXF1ZXN0X2hlYWRlcnMobmd4X2V2ZW50X3QgKnJldik7CiBzdGF0aWMgc3NpemVfdCBuZ3hfaHR0cF9yZWFkX3JlcXVlc3RfaGVhZGVyKG5neF9odHRwX3JlcXVlc3RfdCAqcik7CiBzdGF0aWMgbmd4X2ludF90IG5neF9odHRwX2FsbG9jX2xhcmdlX2hlYWRlcl9idWZmZXIobmd4X2h0dHBfcmVxdWVzdF90ICpyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF91aW50X3QgcmVxdWVzdF9saW5lKTsKKyAgICBuZ3hfdWludF90IHJlcXVlc3RfbGluZSk7CiBzdGF0aWMgbmd4X2ludF90IG5neF9odHRwX3Byb2Nlc3NfcmVxdWVzdF9oZWFkZXIobmd4X2h0dHBfcmVxdWVzdF90ICpyKTsKIHN0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfZmluZF92aXJ0dWFsX3NlcnZlcihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpOwogCkBAIC0zNCw3ICszNCw3IEBACiBzdGF0aWMgdm9pZCBuZ3hfaHR0cF9saW5nZXJpbmdfY2xvc2VfaGFuZGxlcihuZ3hfZXZlbnRfdCAqZXYpOwogCiBzdGF0aWMgdm9pZCBuZ3hfaHR0cF9jbGllbnRfZXJyb3Iobmd4X2h0dHBfcmVxdWVzdF90ICpyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGllbnRfZXJyb3IsIGludCBlcnJvcik7CisgICAgaW50IGNsaWVudF9lcnJvciwgaW50IGVycm9yKTsKIHN0YXRpYyB1X2NoYXIgKm5neF9odHRwX2xvZ19lcnJvcihuZ3hfbG9nX3QgKmxvZywgdV9jaGFyICpidWYsIHNpemVfdCBsZW4pOwogCiAKQEAgLTEwMCwxOSArMTAwLDIyIEBACiAKIAogI2lmIDAKLXN0YXRpYyB2b2lkIG5neF9odHRwX2R1bW15KG5neF9ldmVudF90ICp3ZXYpCitzdGF0aWMgdm9pZAorbmd4X2h0dHBfZHVtbXkobmd4X2V2ZW50X3QgKndldikKIHsKICAgICByZXR1cm47CiB9CiAjZW5kaWYKIAogCi12b2lkIG5neF9odHRwX2luaXRfY29ubmVjdGlvbihuZ3hfY29ubmVjdGlvbl90ICpjKQordm9pZAorbmd4X2h0dHBfaW5pdF9jb25uZWN0aW9uKG5neF9jb25uZWN0aW9uX3QgKmMpCiB7CiAgICAgbmd4X2V2ZW50X3QgICAgICAgICAqcmV2OwogICAgIG5neF9odHRwX2xvZ19jdHhfdCAgKmN0eDsKIAotICAgIGlmICghKGN0eCA9IG5neF9wYWxsb2MoYy0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX2xvZ19jdHhfdCkpKSkgeworICAgIGN0eCA9IG5neF9wYWxsb2MoYy0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX2xvZ19jdHhfdCkpOworICAgIGlmIChjdHggPT0gTlVMTCkgewogICAgICAgICBuZ3hfaHR0cF9jbG9zZV9jb25uZWN0aW9uKGMpOwogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMTg2LDcgKzE4OSw4IEBACiB9CiAKIAotc3RhdGljIHZvaWQgbmd4X2h0dHBfaW5pdF9yZXF1ZXN0KG5neF9ldmVudF90ICpyZXYpCitzdGF0aWMKK3ZvaWQgbmd4X2h0dHBfaW5pdF9yZXF1ZXN0KG5neF9ldmVudF90ICpyZXYpCiB7CiAgICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgaTsKICAgICBzb2NrbGVuX3QgICAgICAgICAgICAgICAgICBsZW47CkBAIC0yMjUsNyArMjI5LDggQEAKICNlbmRpZgogCiAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKCEoaGMgPSBuZ3hfcGNhbGxvYyhjLT5wb29sLCBzaXplb2Yobmd4X2h0dHBfY29ubmVjdGlvbl90KSkpKSB7CisgICAgICAgIGhjID0gbmd4X3BjYWxsb2MoYy0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX2Nvbm5lY3Rpb25fdCkpOworICAgICAgICBpZiAoaGMgPT0gTlVMTCkgewogCiAjaWYgKE5HWF9TVEFUX1NUVUIpCiAgICAgICAgICAgICBuZ3hfYXRvbWljX2RlYyhuZ3hfc3RhdF9yZWFkaW5nKTsKQEAgLTI0OCw3ICsyNTMsOCBAQAogICAgICAgICB9CiAKICAgICB9IGVsc2UgewotICAgICAgICBpZiAoIShyID0gbmd4X3BjYWxsb2MoYy0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX3JlcXVlc3RfdCkpKSkgeworICAgICAgICByID0gbmd4X3BjYWxsb2MoYy0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX3JlcXVlc3RfdCkpOworICAgICAgICBpZiAociA9PSBOVUxMKSB7CiAKICNpZiAoTkdYX1NUQVRfU1RVQikKICAgICAgICAgICAgIG5neF9hdG9taWNfZGVjKG5neF9zdGF0X3JlYWRpbmcpOwpAQCAtMzg4LDcgKzM5NCw4IEBACiAgICAgICAgIHItPmhlYWRlcl9pbiA9IGMtPmJ1ZmZlcjsKICAgICB9CiAKLSAgICBpZiAoIShyLT5wb29sID0gbmd4X2NyZWF0ZV9wb29sKGNzY2YtPnJlcXVlc3RfcG9vbF9zaXplLCBjLT5sb2cpKSkgeworICAgIHItPnBvb2wgPSBuZ3hfY3JlYXRlX3Bvb2woY3NjZi0+cmVxdWVzdF9wb29sX3NpemUsIGMtPmxvZyk7CisgICAgaWYgKHItPnBvb2wgPT0gTlVMTCkgewogICAgICAgICBuZ3hfaHR0cF9jbG9zZV9jb25uZWN0aW9uKGMpOwogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtNDQ0LDcgKzQ1MSw4IEBACiAKICNpZiAoTkdYX0hUVFBfU1NMKQogCi1zdGF0aWMgdm9pZCBuZ3hfaHR0cF9zc2xfaGFuZHNoYWtlKG5neF9ldmVudF90ICpyZXYpCitzdGF0aWMgdm9pZAorbmd4X2h0dHBfc3NsX2hhbmRzaGFrZShuZ3hfZXZlbnRfdCAqcmV2KQogewogICAgIHVfY2hhciAgICAgICAgICAgICAgIGJ1ZlsxXTsKICAgICBzc2l6ZV90ICAgICAgICAgICAgICBuOwpAQCAtNTA0LDcgKzUxMiw4IEBACiAjZW5kaWYKIAogCi1zdGF0aWMgdm9pZCBuZ3hfaHR0cF9wcm9jZXNzX3JlcXVlc3RfbGluZShuZ3hfZXZlbnRfdCAqcmV2KQorc3RhdGljIHZvaWQKK25neF9odHRwX3Byb2Nlc3NfcmVxdWVzdF9saW5lKG5neF9ldmVudF90ICpyZXYpCiB7CiAgICAgc3NpemVfdCAgICAgICAgICAgICAgbjsKICAgICBuZ3hfaW50X3QgICAgICAgICAgICByYywgcnY7CkBAIC01NTQsNyArNTYzLDggQEAKIAogICAgICAgICAgICAgaWYgKHItPmNvbXBsZXhfdXJpIHx8IHItPnF1b3RlZF91cmkpIHsKIAotICAgICAgICAgICAgICAgIGlmICghKHItPnVyaS5kYXRhID0gbmd4X3BhbGxvYyhyLT5wb29sLCByLT51cmkubGVuICsgMSkpKSB7CisgICAgICAgICAgICAgICAgci0+dXJpLmRhdGEgPSBuZ3hfcGFsbG9jKHItPnBvb2wsIHItPnVyaS5sZW4gKyAxKTsKKyAgICAgICAgICAgICAgICBpZiAoci0+dXJpLmRhdGEgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9jbG9zZV9yZXF1ZXN0KHIsIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7CiAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX2Nsb3NlX2Nvbm5lY3Rpb24oYyk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKQEAgLTcwNyw3ICs3MTcsOCBAQAogfQogCiAKLXN0YXRpYyB2b2lkIG5neF9odHRwX3Byb2Nlc3NfcmVxdWVzdF9oZWFkZXJzKG5neF9ldmVudF90ICpyZXYpCitzdGF0aWMgdm9pZAorbmd4X2h0dHBfcHJvY2Vzc19yZXF1ZXN0X2hlYWRlcnMobmd4X2V2ZW50X3QgKnJldikKIHsKICAgICBzc2l6ZV90ICAgICAgICAgICAgICBuOwogICAgIG5neF9pbnRfdCAgICAgICAgICAgIHJjLCBydiwgaTsKQEAgLTc2NCw3ICs3NzUsOCBAQAogCiAgICAgICAgICAgICByLT5oZWFkZXJzX24rKzsKIAotICAgICAgICAgICAgaWYgKCEoaCA9IG5neF9saXN0X3B1c2goJnItPmhlYWRlcnNfaW4uaGVhZGVycykpKSB7CisgICAgICAgICAgICBoID0gbmd4X2xpc3RfcHVzaCgmci0+aGVhZGVyc19pbi5oZWFkZXJzKTsKKyAgICAgICAgICAgIGlmIChoID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9jbG9zZV9yZXF1ZXN0KHIsIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7CiAgICAgICAgICAgICAgICAgbmd4X2h0dHBfY2xvc2VfY29ubmVjdGlvbihjKTsKICAgICAgICAgICAgICAgICByZXR1cm47CkBAIC03ODEsNyArNzkzLDggQEAKICAgICAgICAgICAgIGlmIChoLT5rZXkubGVuID09IHNpemVvZigiQ29va2llIikgLSAxCiAgICAgICAgICAgICAgICAgJiYgbmd4X3N0cmNhc2VjbXAoaC0+a2V5LmRhdGEsICJDb29raWUiKSA9PSAwKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghKGNvb2tpZSA9IG5neF9hcnJheV9wdXNoKCZyLT5oZWFkZXJzX2luLmNvb2tpZXMpKSkgeworICAgICAgICAgICAgICAgIGNvb2tpZSA9IG5neF9hcnJheV9wdXNoKCZyLT5oZWFkZXJzX2luLmNvb2tpZXMpOworICAgICAgICAgICAgICAgIGlmIChjb29raWUgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9jbG9zZV9yZXF1ZXN0KHIsIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7CiAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX2Nsb3NlX2Nvbm5lY3Rpb24oYyk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKQEAgLTg3OSw3ICs4OTIsOCBAQAogfQogCiAKLXN0YXRpYyBzc2l6ZV90IG5neF9odHRwX3JlYWRfcmVxdWVzdF9oZWFkZXIobmd4X2h0dHBfcmVxdWVzdF90ICpyKQorc3RhdGljIHNzaXplX3QKK25neF9odHRwX3JlYWRfcmVxdWVzdF9oZWFkZXIobmd4X2h0dHBfcmVxdWVzdF90ICpyKQogewogICAgIHNzaXplX3QgICAgICAgICAgICAgICAgICAgIG47CiAgICAgbmd4X2V2ZW50X3QgICAgICAgICAgICAgICAqcmV2OwpAQCAtOTMzLDggKzk0Nyw5IEBACiB9CiAKIAotc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9hbGxvY19sYXJnZV9oZWFkZXJfYnVmZmVyKG5neF9odHRwX3JlcXVlc3RfdCAqciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfdWludF90IHJlcXVlc3RfbGluZSkKK3N0YXRpYyBuZ3hfaW50X3QKK25neF9odHRwX2FsbG9jX2xhcmdlX2hlYWRlcl9idWZmZXIobmd4X2h0dHBfcmVxdWVzdF90ICpyLAorICAgIG5neF91aW50X3QgcmVxdWVzdF9saW5lKQogewogICAgIHVfY2hhciAgICAgICAgICAgICAgICAgICAgKm9sZCwgKm5ldzsKICAgICBuZ3hfYnVmX3QgICAgICAgICAgICAgICAgICpiOwpAQCAtMTA3Niw3ICsxMDkxLDggQEAKIH0KIAogCi1zdGF0aWMgbmd4X2ludF90IG5neF9odHRwX3Byb2Nlc3NfcmVxdWVzdF9oZWFkZXIobmd4X2h0dHBfcmVxdWVzdF90ICpyKQorc3RhdGljIG5neF9pbnRfdAorbmd4X2h0dHBfcHJvY2Vzc19yZXF1ZXN0X2hlYWRlcihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpCiB7CiAgICAgdV9jaGFyICAqdWEsICp1c2VyX2FnZW50LCBjaDsKICAgICBzaXplX3QgICBsZW47CkBAIC0xMTA2LDcgKzExMjIsNyBAQAogCiAgICAgaWYgKHItPmhlYWRlcnNfaW4uY29udGVudF9sZW5ndGgpIHsKICAgICAgICAgci0+aGVhZGVyc19pbi5jb250ZW50X2xlbmd0aF9uID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2F0b2koci0+aGVhZGVyc19pbi5jb250ZW50X2xlbmd0aC0+dmFsdWUuZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfYXRvc3ooci0+aGVhZGVyc19pbi5jb250ZW50X2xlbmd0aC0+dmFsdWUuZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+aGVhZGVyc19pbi5jb250ZW50X2xlbmd0aC0+dmFsdWUubGVuKTsKIAogICAgICAgICBpZiAoci0+aGVhZGVyc19pbi5jb250ZW50X2xlbmd0aF9uID09IE5HWF9FUlJPUikgewpAQCAtMTEzNyw3ICsxMTUzLDcgQEAKIAogICAgICAgICAgICAgaWYgKHItPmhlYWRlcnNfaW4ua2VlcF9hbGl2ZSkgewogICAgICAgICAgICAgICAgIHItPmhlYWRlcnNfaW4ua2VlcF9hbGl2ZV9uID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9hdG9pKHItPmhlYWRlcnNfaW4ua2VlcF9hbGl2ZS0+dmFsdWUuZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2F0b3RtKHItPmhlYWRlcnNfaW4ua2VlcF9hbGl2ZS0+dmFsdWUuZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHItPmhlYWRlcnNfaW4ua2VlcF9hbGl2ZS0+dmFsdWUubGVuKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTE5MSw3ICsxMjA3LDggQEAKIH0KIAogCi1zdGF0aWMgbmd4X2ludF90IG5neF9odHRwX2ZpbmRfdmlydHVhbF9zZXJ2ZXIobmd4X2h0dHBfcmVxdWVzdF90ICpyKQorc3RhdGljIG5neF9pbnRfdAorbmd4X2h0dHBfZmluZF92aXJ0dWFsX3NlcnZlcihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpCiB7CiAgICAgbmd4X2ludF90ICAgICAgICAgICAgICAgICAgIHJjOwogICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICBpLCBuLCBrZXksIGZvdW5kOwpAQCAtMTI5Nyw3ICsxMzE0LDggQEAKIH0KIAogCi12b2lkIG5neF9odHRwX2ZpbmFsaXplX3JlcXVlc3Qobmd4X2h0dHBfcmVxdWVzdF90ICpyLCBpbnQgcmMpCit2b2lkCituZ3hfaHR0cF9maW5hbGl6ZV9yZXF1ZXN0KG5neF9odHRwX3JlcXVlc3RfdCAqciwgaW50IHJjKQogewogICAgIG5neF9odHRwX2NvcmVfbG9jX2NvbmZfdCAgKmNsY2Y7CiAKQEAgLTEzODAsNyArMTM5OCw4IEBACiB9CiAKIAotc3RhdGljIHZvaWQgbmd4X2h0dHBfc2V0X3dyaXRlX2hhbmRsZXIobmd4X2h0dHBfcmVxdWVzdF90ICpyKQorc3RhdGljIHZvaWQKK25neF9odHRwX3NldF93cml0ZV9oYW5kbGVyKG5neF9odHRwX3JlcXVlc3RfdCAqcikKIHsKICAgICBuZ3hfZXZlbnRfdCAgICAgICAgICAgICAgICp3ZXY7CiAgICAgbmd4X2h0dHBfY29yZV9sb2NfY29uZl90ICAqY2xjZjsKQEAgLTE0MDksNyArMTQyOCw4IEBACiB9CiAKIAotdm9pZCBuZ3hfaHR0cF93cml0ZXIobmd4X2V2ZW50X3QgKndldikKK3ZvaWQKK25neF9odHRwX3dyaXRlcihuZ3hfZXZlbnRfdCAqd2V2KQogewogICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgIHJjOwogICAgIG5neF9jb25uZWN0aW9uX3QgICAgICAgICAgKmM7CkBAIC0xNDg2LDcgKzE1MDYsOCBAQAogfQogCiAKLXN0YXRpYyB2b2lkIG5neF9odHRwX2Jsb2NrX3JlYWQobmd4X2V2ZW50X3QgKnJldikKK3N0YXRpYyB2b2lkCituZ3hfaHR0cF9ibG9ja19yZWFkKG5neF9ldmVudF90ICpyZXYpCiB7CiAgICAgbmd4X2Nvbm5lY3Rpb25fdCAgICAgICAgICAqYzsKICAgICBuZ3hfaHR0cF9yZXF1ZXN0X3QgICAgICAgICpyOwpAQCAtMTUwNiw3ICsxNTI3LDggQEAKIH0KIAogCi1uZ3hfaW50X3Qgbmd4X2h0dHBfZGlzY2FyZF9ib2R5KG5neF9odHRwX3JlcXVlc3RfdCAqcikKK25neF9pbnRfdAorbmd4X2h0dHBfZGlzY2FyZF9ib2R5KG5neF9odHRwX3JlcXVlc3RfdCAqcikKIHsKICAgICBzc2l6ZV90ICAgICAgIHNpemU7CiAgICAgbmd4X2V2ZW50X3QgICpyZXY7CkBAIC0xNTQ2LDcgKzE1NjgsOCBAQAogfQogCiAKLXN0YXRpYyB2b2lkIG5neF9odHRwX3JlYWRfZGlzY2FyZGVkX2JvZHlfZXZlbnQobmd4X2V2ZW50X3QgKnJldikKK3N0YXRpYyB2b2lkCituZ3hfaHR0cF9yZWFkX2Rpc2NhcmRlZF9ib2R5X2V2ZW50KG5neF9ldmVudF90ICpyZXYpCiB7CiAgICAgbmd4X2ludF90ICAgICAgICAgICAgcmM7CiAgICAgbmd4X2Nvbm5lY3Rpb25fdCAgICAqYzsKQEAgLTE1NzIsNyArMTU5NSw4IEBACiB9CiAKIAotc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9yZWFkX2Rpc2NhcmRlZF9ib2R5KG5neF9odHRwX3JlcXVlc3RfdCAqcikKK3N0YXRpYyBuZ3hfaW50X3QKK25neF9odHRwX3JlYWRfZGlzY2FyZGVkX2JvZHkobmd4X2h0dHBfcmVxdWVzdF90ICpyKQogewogICAgIHNzaXplX3QgIHNpemUsIG47CiAgICAgdV9jaGFyICAgYnVmZmVyW05HWF9IVFRQX0RJU0NBUkRfQlVGRkVSX1NJWkVdOwpAQCAtMTYxNSw3ICsxNjM5LDggQEAKIH0KIAogCi1zdGF0aWMgdm9pZCBuZ3hfaHR0cF9zZXRfa2VlcGFsaXZlKG5neF9odHRwX3JlcXVlc3RfdCAqcikKK3N0YXRpYyB2b2lkCituZ3hfaHR0cF9zZXRfa2VlcGFsaXZlKG5neF9odHRwX3JlcXVlc3RfdCAqcikKIHsKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICB0Y3Bfbm9kZWxheTsKICAgICBuZ3hfaW50X3QgICAgICAgICAgICAgICAgICBpOwpAQCAtMTc3Niw3ICsxODAxLDcgQEAKICAgICBjLT5sb2ctPmFjdGlvbiA9ICJrZWVwYWxpdmUiOwogCiAgICAgaWYgKGMtPnRjcF9ub3B1c2ggPT0gTkdYX1RDUF9OT1BVU0hfU0VUKSB7Ci0gICAgICAgIGlmIChuZ3hfdGNwX3B1c2goYy0+ZmQpID09IE5HWF9FUlJPUikgeworICAgICAgICBpZiAobmd4X3RjcF9wdXNoKGMtPmZkKSA9PSAtMSkgewogICAgICAgICAgICAgbmd4X2Nvbm5lY3Rpb25fZXJyb3IoYywgbmd4X3NvY2tldF9lcnJubywgbmd4X3RjcF9wdXNoX24gIiBmYWlsZWQiKTsKICAgICAgICAgICAgIG5neF9odHRwX2Nsb3NlX2Nvbm5lY3Rpb24oYyk7CiAgICAgICAgICAgICByZXR1cm47CkBAIC0xODE4LDEzICsxODQzLDEzIEBACiB9CiAKIAotc3RhdGljIHZvaWQgbmd4X2h0dHBfa2VlcGFsaXZlX2hhbmRsZXIobmd4X2V2ZW50X3QgKnJldikKK3N0YXRpYyB2b2lkCituZ3hfaHR0cF9rZWVwYWxpdmVfaGFuZGxlcihuZ3hfZXZlbnRfdCAqcmV2KQogewotICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIHNpemU7Ci0gICAgc3NpemVfdCAgICAgICAgICAgICAgICAgbjsKLSAgICBuZ3hfYnVmX3QgICAgICAgICAgICAgICpiOwotICAgIG5neF9jb25uZWN0aW9uX3QgICAgICAgKmM7Ci0gICAgbmd4X2h0dHBfY29ubmVjdGlvbl90ICAqaGM7CisgICAgc2l6ZV90ICAgICAgICAgICAgIHNpemU7CisgICAgc3NpemVfdCAgICAgICAgICAgIG47CisgICAgbmd4X2J1Zl90ICAgICAgICAgKmI7CisgICAgbmd4X2Nvbm5lY3Rpb25fdCAgKmM7CiAKICAgICBjID0gcmV2LT5kYXRhOwogCkBAIC0xODU1LDcgKzE4ODAsNiBAQAogCiAjZW5kaWYKIAotICAgIGhjID0gYy0+ZGF0YTsKICAgICBiID0gYy0+YnVmZmVyOwogICAgIHNpemUgPSBiLT5lbmQgLSBiLT5zdGFydDsKIApAQCAtMTg2Nyw3ICsxODkxLDggQEAKICAgICAgICAgICogdG8ga2VlcCB0aGUgYnVmZmVyIHNpemUuCiAgICAgICAgICAqLwogCi0gICAgICAgIGlmICghKGItPnBvcyA9IG5neF9wYWxsb2MoYy0+cG9vbCwgc2l6ZSkpKSB7CisgICAgICAgIGItPnBvcyA9IG5neF9wYWxsb2MoYy0+cG9vbCwgc2l6ZSk7CisgICAgICAgIGlmIChiLT5wb3MgPT0gTlVMTCkgewogICAgICAgICAgICAgbmd4X2h0dHBfY2xvc2VfY29ubmVjdGlvbihjKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQpAQCAtMTkxOSw3ICsxOTQ0LDggQEAKIH0KIAogCi1zdGF0aWMgdm9pZCBuZ3hfaHR0cF9zZXRfbGluZ2VyaW5nX2Nsb3NlKG5neF9odHRwX3JlcXVlc3RfdCAqcikKK3N0YXRpYyB2b2lkCituZ3hfaHR0cF9zZXRfbGluZ2VyaW5nX2Nsb3NlKG5neF9odHRwX3JlcXVlc3RfdCAqcikKIHsgICAKICAgICBuZ3hfZXZlbnRfdCAgICAgICAgICAgICAgICpyZXYsICp3ZXY7CiAgICAgbmd4X2Nvbm5lY3Rpb25fdCAgICAgICAgICAqYzsKQEAgLTE5NzcsNyArMjAwMyw4IEBACiB9CiAKIAotc3RhdGljIHZvaWQgbmd4X2h0dHBfbGluZ2VyaW5nX2Nsb3NlX2hhbmRsZXIobmd4X2V2ZW50X3QgKnJldikKK3N0YXRpYyB2b2lkCituZ3hfaHR0cF9saW5nZXJpbmdfY2xvc2VfaGFuZGxlcihuZ3hfZXZlbnRfdCAqcmV2KQogewogICAgIHNzaXplX3QgICAgICAgICAgICAgICAgICAgIG47CiAgICAgbmd4X21zZWNfdCAgICAgICAgICAgICAgICAgdGltZXI7CkBAIC0yMDM2LDcgKzIwNjMsOCBAQAogfQogCiAKLXZvaWQgbmd4X2h0dHBfZW1wdHlfaGFuZGxlcihuZ3hfZXZlbnRfdCAqd2V2KQordm9pZAorbmd4X2h0dHBfZW1wdHlfaGFuZGxlcihuZ3hfZXZlbnRfdCAqd2V2KQogewogICAgIG5neF9sb2dfZGVidWcwKE5HWF9MT0dfREVCVUdfSFRUUCwgd2V2LT5sb2csIDAsICJodHRwIGVtcHR5IGhhbmRsZXIiKTsKIApAQCAtMjA0NCwxMiArMjA3MiwxNCBAQAogfQogCiAKLW5neF9pbnRfdCBuZ3hfaHR0cF9zZW5kX2xhc3Qobmd4X2h0dHBfcmVxdWVzdF90ICpyKQorbmd4X2ludF90CituZ3hfaHR0cF9zZW5kX2xhc3Qobmd4X2h0dHBfcmVxdWVzdF90ICpyKQogewogICAgIG5neF9idWZfdCAgICAqYjsKICAgICBuZ3hfY2hhaW5fdCAgIG91dDsKIAotICAgIGlmICghKGIgPSBuZ3hfY2FsbG9jX2J1ZihyLT5wb29sKSkpIHsKKyAgICBiID0gbmd4X2NhbGxvY19idWYoci0+cG9vbCk7CisgICAgaWYgKGIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgIH0KIApAQCAtMjA2MSw3ICsyMDkxLDggQEAKIH0KIAogCi12b2lkIG5neF9odHRwX2Nsb3NlX3JlcXVlc3Qobmd4X2h0dHBfcmVxdWVzdF90ICpyLCBpbnQgZXJyb3IpCit2b2lkCituZ3hfaHR0cF9jbG9zZV9yZXF1ZXN0KG5neF9odHRwX3JlcXVlc3RfdCAqciwgaW50IGVycm9yKQogewogICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgIGk7CiAgICAgbmd4X2xvZ190ICAgICAgICAgICAgICAgICAqbG9nOwpAQCAtMjE3MSw3ICsyMjAyLDggQEAKIAogI2lmIChOR1hfSFRUUF9TU0wpCiAKLXZvaWQgbmd4X3NzbF9jbG9zZV9oYW5kbGVyKG5neF9ldmVudF90ICpldikKK3ZvaWQKK25neF9zc2xfY2xvc2VfaGFuZGxlcihuZ3hfZXZlbnRfdCAqZXYpCiB7CiAgICAgbmd4X2Nvbm5lY3Rpb25fdCAgKmM7CiAKQEAgLTIxODksNyArMjIyMSw4IEBACiAjZW5kaWYKIAogCi12b2lkIG5neF9odHRwX2Nsb3NlX2Nvbm5lY3Rpb24obmd4X2Nvbm5lY3Rpb25fdCAqYykKK3ZvaWQKK25neF9odHRwX2Nsb3NlX2Nvbm5lY3Rpb24obmd4X2Nvbm5lY3Rpb25fdCAqYykKIHsKICAgICBuZ3hfcG9vbF90ICAqcG9vbDsKIApAQCAtMjIxNiwxMiArMjI0OSwxMiBAQAogCiAgICAgbmd4X2Nsb3NlX2Nvbm5lY3Rpb24oYyk7CiAKLSAgICBuZ3hfZGVzdHJveV9wb29sKGMtPnBvb2wpOworICAgIG5neF9kZXN0cm95X3Bvb2wocG9vbCk7CiB9CiAKIAotc3RhdGljIHZvaWQgbmd4X2h0dHBfY2xpZW50X2Vycm9yKG5neF9odHRwX3JlcXVlc3RfdCAqciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpZW50X2Vycm9yLCBpbnQgZXJyb3IpCitzdGF0aWMgdm9pZAorbmd4X2h0dHBfY2xpZW50X2Vycm9yKG5neF9odHRwX3JlcXVlc3RfdCAqciwgaW50IGNsaWVudF9lcnJvciwgaW50IGVycm9yKQogewogICAgIHVfY2hhciAgICAgICAgICAgICAgICAgICAgKnA7CiAgICAgbmd4X2h0dHBfbG9nX2N0eF90ICAgICAgICAqY3R4OwpAQCAtMjMxNSw3ICsyMzQ4LDggQEAKIH0KIAogCi1zdGF0aWMgdV9jaGFyICpuZ3hfaHR0cF9sb2dfZXJyb3Iobmd4X2xvZ190ICpsb2csIHVfY2hhciAqYnVmLCBzaXplX3QgbGVuKQorc3RhdGljIHVfY2hhciAqCituZ3hfaHR0cF9sb2dfZXJyb3Iobmd4X2xvZ190ICpsb2csIHVfY2hhciAqYnVmLCBzaXplX3QgbGVuKQogewogICAgIHVfY2hhciAgICAgICAgICAgICAgKnA7CiAgICAgbmd4X2h0dHBfbG9nX2N0eF90ICAqY3R4OwpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbmd4X2h0dHBfcmVxdWVzdC5oIGIvc3JjL2h0dHAvbmd4X2h0dHBfcmVxdWVzdC5oCmluZGV4IDBlN2UxMDUuLjQxM2FmMmYgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL25neF9odHRwX3JlcXVlc3QuaAorKysgYi9zcmMvaHR0cC9uZ3hfaHR0cF9yZXF1ZXN0LmgKQEAgLTExOSw5MSArMTE5LDkxIEBACiAKIAogdHlwZWRlZiBzdHJ1Y3QgewotICAgIG5neF9zdHJfdCAgICAgICAgIG5hbWU7Ci0gICAgbmd4X3VpbnRfdCAgICAgICAgb2Zmc2V0OworICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOworICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ7CiB9IG5neF9odHRwX2hlYWRlcl90OwogCiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgICBuZ3hfbGlzdF90ICAgICAgICBoZWFkZXJzOworICAgIG5neF9saXN0X3QgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOwogCi0gICAgbmd4X3RhYmxlX2VsdF90ICAqaG9zdDsKLSAgICBuZ3hfdGFibGVfZWx0X3QgICpjb25uZWN0aW9uOwotICAgIG5neF90YWJsZV9lbHRfdCAgKmlmX21vZGlmaWVkX3NpbmNlOwotICAgIG5neF90YWJsZV9lbHRfdCAgKnVzZXJfYWdlbnQ7Ci0gICAgbmd4X3RhYmxlX2VsdF90ICAqcmVmZXJlcjsKLSAgICBuZ3hfdGFibGVfZWx0X3QgICpjb250ZW50X2xlbmd0aDsKLSAgICBuZ3hfdGFibGVfZWx0X3QgICpjb250ZW50X3R5cGU7CisgICAgbmd4X3RhYmxlX2VsdF90ICAgICAgICAgICAgICAgICAgKmhvc3Q7CisgICAgbmd4X3RhYmxlX2VsdF90ICAgICAgICAgICAgICAgICAgKmNvbm5lY3Rpb247CisgICAgbmd4X3RhYmxlX2VsdF90ICAgICAgICAgICAgICAgICAgKmlmX21vZGlmaWVkX3NpbmNlOworICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICAgICAgICAgICp1c2VyX2FnZW50OworICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICAgICAgICAgICpyZWZlcmVyOworICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICAgICAgICAgICpjb250ZW50X2xlbmd0aDsKKyAgICBuZ3hfdGFibGVfZWx0X3QgICAgICAgICAgICAgICAgICAqY29udGVudF90eXBlOwogCi0gICAgbmd4X3RhYmxlX2VsdF90ICAqcmFuZ2U7CisgICAgbmd4X3RhYmxlX2VsdF90ICAgICAgICAgICAgICAgICAgKnJhbmdlOwogCiAjaWYgKE5HWF9IVFRQX0daSVApCi0gICAgbmd4X3RhYmxlX2VsdF90ICAqYWNjZXB0X2VuY29kaW5nOwotICAgIG5neF90YWJsZV9lbHRfdCAgKnZpYTsKKyAgICBuZ3hfdGFibGVfZWx0X3QgICAgICAgICAgICAgICAgICAqYWNjZXB0X2VuY29kaW5nOworICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICAgICAgICAgICp2aWE7CiAjZW5kaWYKIAotICAgIG5neF90YWJsZV9lbHRfdCAgKmF1dGhvcml6YXRpb247CisgICAgbmd4X3RhYmxlX2VsdF90ICAgICAgICAgICAgICAgICAgKmF1dGhvcml6YXRpb247CiAKLSAgICBuZ3hfdGFibGVfZWx0X3QgICprZWVwX2FsaXZlOworICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICAgICAgICAgICprZWVwX2FsaXZlOwogCiAjaWYgKE5HWF9IVFRQX1BST1hZKQotICAgIG5neF90YWJsZV9lbHRfdCAgKnhfZm9yd2FyZGVkX2ZvcjsKLSAgICBuZ3hfdGFibGVfZWx0X3QgICp4X3JlYWxfaXA7Ci0gICAgbmd4X3RhYmxlX2VsdF90ICAqeF91cmw7CisgICAgbmd4X3RhYmxlX2VsdF90ICAgICAgICAgICAgICAgICAgKnhfZm9yd2FyZGVkX2ZvcjsKKyAgICBuZ3hfdGFibGVfZWx0X3QgICAgICAgICAgICAgICAgICAqeF9yZWFsX2lwOworICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICAgICAgICAgICp4X3VybDsKICNlbmRpZgogCiAjaWYgKE5HWF9IVFRQX0hFQURFUlMpCi0gICAgbmd4X3RhYmxlX2VsdF90ICAqYWNjZXB0OwotICAgIG5neF90YWJsZV9lbHRfdCAgKmFjY2VwdF9sYW5ndWFnZTsKKyAgICBuZ3hfdGFibGVfZWx0X3QgICAgICAgICAgICAgICAgICAqYWNjZXB0OworICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICAgICAgICAgICphY2NlcHRfbGFuZ3VhZ2U7CiAjZW5kaWYKIAotICAgIG5neF9hcnJheV90ICAgICAgIGNvb2tpZXM7CisgICAgbmd4X2FycmF5X3QgICAgICAgICAgICAgICAgICAgICAgIGNvb2tpZXM7CiAKLSAgICBzaXplX3QgICAgICAgICAgICBob3N0X25hbWVfbGVuOwotICAgIHNzaXplX3QgICAgICAgICAgIGNvbnRlbnRfbGVuZ3RoX247Ci0gICAgc2l6ZV90ICAgICAgICAgICAgY29ubmVjdGlvbl90eXBlOwotICAgIHNzaXplX3QgICAgICAgICAgIGtlZXBfYWxpdmVfbjsKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdF9uYW1lX2xlbjsKKyAgICBzc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudF9sZW5ndGhfbjsKKyAgICB0aW1lX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAga2VlcF9hbGl2ZV9uOwogCi0gICAgdW5zaWduZWQgICAgICAgICAgbXNpZToxOwotICAgIHVuc2lnbmVkICAgICAgICAgIG1zaWU0OjE7Ci0gICAgdW5zaWduZWQgICAgICAgICAgb3BlcmE6MTsKLSAgICB1bnNpZ25lZCAgICAgICAgICBnZWNrbzoxOwotICAgIHVuc2lnbmVkICAgICAgICAgIGtvbnF1ZXJvcjoxOworICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uX3R5cGU6MjsKKyAgICB1bnNpZ25lZCAgICAgICAgICAgICAgICAgICAgICAgICAgbXNpZToxOworICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgICAgICAgICBtc2llNDoxOworICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYToxOworICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgICAgICAgICBnZWNrbzoxOworICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgICAgICAgICBrb25xdWVyb3I6MTsKIH0gbmd4X2h0dHBfaGVhZGVyc19pbl90OwogCiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgICBvZmZfdCAgICAgICAgICAgICBzdGFydDsKLSAgICBvZmZfdCAgICAgICAgICAgICBlbmQ7Ci0gICAgbmd4X3N0cl90ICAgICAgICAgY29udGVudF9yYW5nZTsKKyAgICBvZmZfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQ7CisgICAgb2ZmX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZDsKKyAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudF9yYW5nZTsKIH0gbmd4X2h0dHBfcmFuZ2VfdDsKIAogCiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgbmd4X2xpc3RfdCAgICAgICAgaGVhZGVyczsKKyAgICBuZ3hfbGlzdF90ICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczsKIAotICAgIG5neF91aW50X3QgICAgICAgIHN0YXR1czsKLSAgICBuZ3hfc3RyX3QgICAgICAgICBzdGF0dXNfbGluZTsKKyAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfbGluZTsKIAotICAgIG5neF90YWJsZV9lbHRfdCAgKnNlcnZlcjsKLSAgICBuZ3hfdGFibGVfZWx0X3QgICpkYXRlOwotICAgIG5neF90YWJsZV9lbHRfdCAgKmNvbnRlbnRfdHlwZTsKLSAgICBuZ3hfdGFibGVfZWx0X3QgICpjb250ZW50X2xlbmd0aDsKLSAgICBuZ3hfdGFibGVfZWx0X3QgICpjb250ZW50X2VuY29kaW5nOwotICAgIG5neF90YWJsZV9lbHRfdCAgKmxvY2F0aW9uOwotICAgIG5neF90YWJsZV9lbHRfdCAgKmxhc3RfbW9kaWZpZWQ7Ci0gICAgbmd4X3RhYmxlX2VsdF90ICAqY29udGVudF9yYW5nZTsKLSAgICBuZ3hfdGFibGVfZWx0X3QgICphY2NlcHRfcmFuZ2VzOwotICAgIG5neF90YWJsZV9lbHRfdCAgKmV4cGlyZXM7Ci0gICAgbmd4X3RhYmxlX2VsdF90ICAqY2FjaGVfY29udHJvbDsKLSAgICBuZ3hfdGFibGVfZWx0X3QgICpldGFnOworICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICAgICAgICAgICpzZXJ2ZXI7CisgICAgbmd4X3RhYmxlX2VsdF90ICAgICAgICAgICAgICAgICAgKmRhdGU7CisgICAgbmd4X3RhYmxlX2VsdF90ICAgICAgICAgICAgICAgICAgKmNvbnRlbnRfdHlwZTsKKyAgICBuZ3hfdGFibGVfZWx0X3QgICAgICAgICAgICAgICAgICAqY29udGVudF9sZW5ndGg7CisgICAgbmd4X3RhYmxlX2VsdF90ICAgICAgICAgICAgICAgICAgKmNvbnRlbnRfZW5jb2Rpbmc7CisgICAgbmd4X3RhYmxlX2VsdF90ICAgICAgICAgICAgICAgICAgKmxvY2F0aW9uOworICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICAgICAgICAgICpsYXN0X21vZGlmaWVkOworICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICAgICAgICAgICpjb250ZW50X3JhbmdlOworICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICAgICAgICAgICphY2NlcHRfcmFuZ2VzOworICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICAgICAgICAgICpleHBpcmVzOworICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICAgICAgICAgICpjYWNoZV9jb250cm9sOworICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICAgICAgICAgICpldGFnOwogCi0gICAgbmd4X3N0cl90ICAgICAgICAgY2hhcnNldDsKLSAgICBuZ3hfYXJyYXlfdCAgICAgICByYW5nZXM7CisgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzZXQ7CisgICAgbmd4X2FycmF5X3QgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlczsKIAotICAgIG9mZl90ICAgICAgICAgICAgIGNvbnRlbnRfbGVuZ3RoX247Ci0gICAgdGltZV90ICAgICAgICAgICAgZGF0ZV90aW1lOwotICAgIHRpbWVfdCAgICAgICAgICAgIGxhc3RfbW9kaWZpZWRfdGltZTsKKyAgICBvZmZfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudF9sZW5ndGhfbjsKKyAgICB0aW1lX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZV90aW1lOworICAgIHRpbWVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0X21vZGlmaWVkX3RpbWU7CiB9IG5neF9odHRwX2hlYWRlcnNfb3V0X3Q7CiAKIApAQCAtMjIxLDE3MiArMjIxLDE3MSBAQAogc3RydWN0IG5neF9odHRwX2NsZWFudXBfcyB7CiAgICAgdW5pb24gewogICAgICAgICBzdHJ1Y3QgewotICAgICAgICAgICAgbmd4X2ZkX3QgICAgICAgICAgICAgICAgIGZkOwotICAgICAgICAgICAgdV9jaGFyICAgICAgICAgICAgICAgICAgKm5hbWU7CisgICAgICAgICAgICBuZ3hfZmRfdCAgICAgICAgICAgICAgICAgIGZkOworICAgICAgICAgICAgdV9jaGFyICAgICAgICAgICAgICAgICAgICpuYW1lOwogICAgICAgICB9IGZpbGU7CiAKICAgICAgICAgc3RydWN0IHsKLSAgICAgICAgICAgIG5neF9odHRwX2NhY2hlX2hhc2hfdCAgICpoYXNoOwotICAgICAgICAgICAgbmd4X2h0dHBfY2FjaGVfZW50cnlfdCAgKmNhY2hlOworICAgICAgICAgICAgbmd4X2h0dHBfY2FjaGVfaGFzaF90ICAgICpoYXNoOworICAgICAgICAgICAgbmd4X2h0dHBfY2FjaGVfZW50cnlfdCAgICpjYWNoZTsKICAgICAgICAgfSBjYWNoZTsKICAgICB9IGRhdGE7CiAKLSAgICB1bnNpZ25lZCAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZDoxOwotICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlOjE7CisgICAgdW5zaWduZWQgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkOjE7CisgICAgdW5zaWduZWQgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlOjE7CiB9OwogCiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgICBuZ3hfaHR0cF9yZXF1ZXN0X3QgICAqcmVxdWVzdDsKKyAgICBuZ3hfaHR0cF9yZXF1ZXN0X3QgICAgICAgICAgICAgICAqcmVxdWVzdDsKIAotICAgIG5neF9idWZfdCAgICAgICAgICAgKipidXN5OwotICAgIG5neF9pbnRfdCAgICAgICAgICAgICBuYnVzeTsKKyAgICBuZ3hfYnVmX3QgICAgICAgICAgICAgICAgICAgICAgICoqYnVzeTsKKyAgICBuZ3hfaW50X3QgICAgICAgICAgICAgICAgICAgICAgICAgbmJ1c3k7CiAKLSAgICBuZ3hfYnVmX3QgICAgICAgICAgICoqZnJlZTsKLSAgICBuZ3hfaW50X3QgICAgICAgICAgICAgbmZyZWU7CisgICAgbmd4X2J1Zl90ICAgICAgICAgICAgICAgICAgICAgICAqKmZyZWU7CisgICAgbmd4X2ludF90ICAgICAgICAgICAgICAgICAgICAgICAgIG5mcmVlOwogCi0gICAgbmd4X3VpbnRfdCAgICAgICAgICAgIHBpcGVsaW5lOyAgICAgIC8qIHVuc2lnbmVkICBwaXBlbGluZToxOyAqLworICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZTsgICAgLyogdW5zaWduZWQgIHBpcGVsaW5lOjE7ICovCiB9IG5neF9odHRwX2Nvbm5lY3Rpb25fdDsKIAogCiB0eXBlZGVmIG5neF9pbnRfdCAoKm5neF9odHRwX2hhbmRsZXJfcHQpKG5neF9odHRwX3JlcXVlc3RfdCAqcik7CiAKIHN0cnVjdCBuZ3hfaHR0cF9yZXF1ZXN0X3MgewotICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlOyAgICAgICAgIC8qICJIVFRQIiAqLworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmU7ICAgICAgICAgLyogIkhUVFAiICovCiAKLSAgICBuZ3hfY29ubmVjdGlvbl90ICAgICAgICAgKmNvbm5lY3Rpb247CisgICAgbmd4X2Nvbm5lY3Rpb25fdCAgICAgICAgICAgICAgICAgKmNvbm5lY3Rpb247CiAKLSAgICB2b2lkICAgICAgICAgICAgICAgICAgICAqKmN0eDsKLSAgICB2b2lkICAgICAgICAgICAgICAgICAgICAqKm1haW5fY29uZjsKLSAgICB2b2lkICAgICAgICAgICAgICAgICAgICAqKnNydl9jb25mOwotICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICoqbG9jX2NvbmY7CisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKmN0eDsKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqbWFpbl9jb25mOworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipzcnZfY29uZjsKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqbG9jX2NvbmY7CiAKLSAgICBuZ3hfaHR0cF9jYWNoZV90ICAgICAgICAgKmNhY2hlOworICAgIG5neF9odHRwX2NhY2hlX3QgICAgICAgICAgICAgICAgICpjYWNoZTsKIAotICAgIG5neF9odHRwX3Vwc3RyZWFtX3QgICAgICAqdXBzdHJlYW07CisgICAgbmd4X2h0dHBfdXBzdHJlYW1fdCAgICAgICAgICAgICAgKnVwc3RyZWFtOwogCi0gICAgbmd4X2ZpbGVfdCAgICAgICAgICAgICAgICBmaWxlOworICAgIG5neF9maWxlX3QgICAgICAgICAgICAgICAgICAgICAgICBmaWxlOwogCi0gICAgbmd4X3Bvb2xfdCAgICAgICAgICAgICAgICpwb29sOwotICAgIG5neF9idWZfdCAgICAgICAgICAgICAgICAqaGVhZGVyX2luOworICAgIG5neF9wb29sX3QgICAgICAgICAgICAgICAgICAgICAgICpwb29sOworICAgIG5neF9idWZfdCAgICAgICAgICAgICAgICAgICAgICAgICpoZWFkZXJfaW47CiAKLSAgICBuZ3hfaHR0cF9oZWFkZXJzX2luX3QgICAgIGhlYWRlcnNfaW47Ci0gICAgbmd4X2h0dHBfaGVhZGVyc19vdXRfdCAgICBoZWFkZXJzX291dDsKKyAgICBuZ3hfaHR0cF9oZWFkZXJzX2luX3QgICAgICAgICAgICAgaGVhZGVyc19pbjsKKyAgICBuZ3hfaHR0cF9oZWFkZXJzX291dF90ICAgICAgICAgICAgaGVhZGVyc19vdXQ7CiAKLSAgICBuZ3hfaHR0cF9yZXF1ZXN0X2JvZHlfdCAgKnJlcXVlc3RfYm9keTsKKyAgICBuZ3hfaHR0cF9yZXF1ZXN0X2JvZHlfdCAgICAgICAgICAqcmVxdWVzdF9ib2R5OwogCi0gICAgdGltZV90ICAgICAgICAgICAgICAgICAgICBsaW5nZXJpbmdfdGltZTsKLSAgICB0aW1lX3QgICAgICAgICAgICAgICAgICAgIHN0YXJ0X3RpbWU7CisgICAgdGltZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmdlcmluZ190aW1lOworICAgIHRpbWVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydF90aW1lOwogCi0gICAgbmd4X3VpbnRfdCAgICAgICAgICAgbWV0aG9kOwotICAgIG5neF91aW50X3QgICAgICAgICAgIGh0dHBfdmVyc2lvbjsKLSAgICBuZ3hfdWludF90ICAgICAgICAgICBodHRwX21ham9yOwotICAgIG5neF91aW50X3QgICAgICAgICAgIGh0dHBfbWlub3I7CisgICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDsKKyAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgICAgICAgaHR0cF92ZXJzaW9uOworICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICAgICAgICBodHRwX21ham9yOworICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICAgICAgICBodHRwX21pbm9yOworIAorICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0X2xpbmU7CisgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgICAgICAgIHVyaTsKKyAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgICAgICAgICAgYXJnczsKKyAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW47CisgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgICAgICAgIHVucGFyc2VkX3VyaTsKIAotICAgIG5neF9zdHJfdCAgICAgICAgICAgIHJlcXVlc3RfbGluZTsKLSAgICBuZ3hfc3RyX3QgICAgICAgICAgICB1cmk7Ci0gICAgbmd4X3N0cl90ICAgICAgICAgICAgYXJnczsKLSAgICBuZ3hfc3RyX3QgICAgICAgICAgICBleHRlbjsKLSAgICBuZ3hfc3RyX3QgICAgICAgICAgICB1bnBhcnNlZF91cmk7CisgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZF9uYW1lOworICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICAgICAgICBodHRwX3Byb3RvY29sOworIAorICAgIG5neF9odHRwX3JlcXVlc3RfdCAgICAgICAgICAgICAgICptYWluOwogCi0gICAgbmd4X3N0cl90ICAgICAgICAgICAgbWV0aG9kX25hbWU7Ci0gICAgbmd4X3N0cl90ICAgICAgICAgICAgaHR0cF9wcm90b2NvbDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgaW5fYWRkcjsKKyAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgICAgICAgcG9ydDsKKyAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgICAgICAgICAqcG9ydF90ZXh0OyAgICAvKiAiOjgwIiAqLworICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJfbmFtZTsKKyAgICBuZ3hfaHR0cF9pbl9hZGRyX3QgICAgICAgICAgICAgICAqdmlydHVhbF9uYW1lczsKIAotICAgIG5neF9odHRwX3JlcXVlc3RfdCAgKm1haW47CisgICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgICAgICAgIHBoYXNlOworICAgIG5neF9pbnRfdCAgICAgICAgICAgICAgICAgICAgICAgICBwaGFzZV9oYW5kbGVyOworICAgIG5neF9odHRwX2hhbmRsZXJfcHQgICAgICAgICAgICAgICBjb250ZW50X2hhbmRsZXI7CiAKLSAgICB1aW50MzJfdCAgICAgICAgICAgICBpbl9hZGRyOwotICAgIG5neF91aW50X3QgICAgICAgICAgIHBvcnQ7Ci0gICAgbmd4X3N0cl90ICAgICAgICAgICAqcG9ydF90ZXh0OyAgICAvKiAiOjgwIiAqLwotICAgIG5neF9zdHJfdCAgICAgICAgICAgIHNlcnZlcl9uYW1lOwotICAgIG5neF9odHRwX2luX2FkZHJfdCAgKnZpcnR1YWxfbmFtZXM7CisgICAgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAgICAgICAqKnZhcmlhYmxlczsKIAotICAgIG5neF91aW50X3QgICAgICAgICAgIHBoYXNlOwotICAgIG5neF9pbnRfdCAgICAgICAgICAgIHBoYXNlX2hhbmRsZXI7Ci0gICAgbmd4X2h0dHBfaGFuZGxlcl9wdCAgY29udGVudF9oYW5kbGVyOwotCi0gICAgbmd4X3VpbnRfdCAgICAgICAgICAgbnZhcmlhYmxlczsKLSAgICB2b2lkICAgICAgICAgICAgICAgKip2YXJpYWJsZXM7Ci0KLSAgICBuZ3hfYXJyYXlfdCAgICAgICAgICBjbGVhbnVwOworICAgIG5neF9hcnJheV90ICAgICAgICAgICAgICAgICAgICAgICBjbGVhbnVwOwogCiAgICAgLyogdXNlZCB0byBsZWFybiB0aGUgQXBhY2hlIGNvbXBhdGlibGUgcmVzcG9uc2UgbGVuZ3RoIHdpdGhvdXQgYSBoZWFkZXIgKi8KLSAgICBzaXplX3QgICAgICAgICAgICAgICBoZWFkZXJfc2l6ZTsKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyX3NpemU7CiAKLSAgICBzaXplX3QgICAgICAgICAgICAgICByZXF1ZXN0X2xlbmd0aDsKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdF9sZW5ndGg7CiAKLSAgICB1X2NoYXIgICAgICAgICAgICAgICpkaXNjYXJkZWRfYnVmZmVyOwotICAgIHZvaWQgICAgICAgICAgICAgICAqKmVycl9jdHg7Ci0gICAgbmd4X3VpbnRfdCAgICAgICAgICAgZXJyX3N0YXR1czsKKyAgICB1X2NoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGlzY2FyZGVkX2J1ZmZlcjsKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqZXJyX2N0eDsKKyAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgICAgICAgZXJyX3N0YXR1czsKIAotICAgIG5neF9odHRwX2Nvbm5lY3Rpb25fdCAgKmh0dHBfY29ubmVjdGlvbjsKKyAgICBuZ3hfaHR0cF9jb25uZWN0aW9uX3QgICAgICAgICAgICAqaHR0cF9jb25uZWN0aW9uOwogCi0gICAgdW5zaWduZWQgICAgICAgICAgICAgaHR0cF9zdGF0ZTo0OworICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwX3N0YXRlOjQ7CiAKICAgICAvKiBVUkkgd2l0aCAiLy4iIGFuZCBvbiBXaW4zMiB3aXRoICIvLyIgKi8KLSAgICB1bnNpZ25lZCAgICAgICAgICAgICBjb21wbGV4X3VyaToxOworICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV4X3VyaToxOwogCiAgICAgLyogVVJJIHdpdGggIiUiICovCi0gICAgdW5zaWduZWQgICAgICAgICAgICAgcXVvdGVkX3VyaToxOworICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgICAgICAgICBxdW90ZWRfdXJpOjE7CiAKICAgICAvKiBVUkkgd2l0aCAiKyIgKi8KLSAgICB1bnNpZ25lZCAgICAgICAgICAgICBwbHVzX2luX3VyaToxOworICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVzX2luX3VyaToxOwogCiAgICAgLyogVVJJIHdpdGggIlwwIiBvciAiJTAwIiAqLwotICAgIHVuc2lnbmVkICAgICAgICAgICAgIHplcm9faW5fdXJpOjE7CisgICAgdW5zaWduZWQgICAgICAgICAgICAgICAgICAgICAgICAgIHplcm9faW5fdXJpOjE7CiAKLSAgICB1bnNpZ25lZCAgICAgICAgICAgICB1cmlfY2hhbmdlZDoxOwotICAgIHVuc2lnbmVkICAgICAgICAgICAgIHVyaV9jaGFuZ2VzOjQ7CisgICAgdW5zaWduZWQgICAgICAgICAgICAgICAgICAgICAgICAgIHVyaV9jaGFuZ2VkOjE7CisgICAgdW5zaWduZWQgICAgICAgICAgICAgICAgICAgICAgICAgIHVyaV9jaGFuZ2VzOjQ7CiAKLSAgICB1bnNpZ25lZCAgICAgICAgICAgICBsb3dfY2FzZV9leHRlbjoxOwotICAgIHVuc2lnbmVkICAgICAgICAgICAgIGhlYWRlcl90aW1lb3V0X3NldDoxOworICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dfY2FzZV9leHRlbjoxOworICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJfdGltZW91dF9zZXQ6MTsKIAotICAgIHVuc2lnbmVkICAgICAgICAgICAgIHByb3h5OjE7Ci0gICAgdW5zaWduZWQgICAgICAgICAgICAgYnlwYXNzX2NhY2hlOjE7Ci0gICAgdW5zaWduZWQgICAgICAgICAgICAgbm9fY2FjaGU6MTsKKyAgICB1bnNpZ25lZCAgICAgICAgICAgICAgICAgICAgICAgICAgcHJveHk6MTsKKyAgICB1bnNpZ25lZCAgICAgICAgICAgICAgICAgICAgICAgICAgYnlwYXNzX2NhY2hlOjE7CisgICAgdW5zaWduZWQgICAgICAgICAgICAgICAgICAgICAgICAgIG5vX2NhY2hlOjE7CiAKICNpZiAwCi0gICAgdW5zaWduZWQgICAgICAgICAgICAgY2FjaGFibGU6MTsKKyAgICB1bnNpZ25lZCAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGFibGU6MTsKICNlbmRpZgotICAgIHVuc2lnbmVkICAgICAgICAgICAgIHBpcGVsaW5lOjE7CisgICAgdW5zaWduZWQgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lOjE7CiAKLSAgICB1bnNpZ25lZCAgICAgICAgICAgICBwbGFpbl9odHRwOjE7Ci0gICAgdW5zaWduZWQgICAgICAgICAgICAgY2h1bmtlZDoxOwotICAgIHVuc2lnbmVkICAgICAgICAgICAgIGhlYWRlcl9vbmx5OjE7Ci0gICAgdW5zaWduZWQgICAgICAgICAgICAga2VlcGFsaXZlOjE7Ci0gICAgdW5zaWduZWQgICAgICAgICAgICAgbGluZ2VyaW5nX2Nsb3NlOjE7Ci0gICAgdW5zaWduZWQgICAgICAgICAgICAgY2xvc2VkOjE7CisgICAgdW5zaWduZWQgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWluX2h0dHA6MTsKKyAgICB1bnNpZ25lZCAgICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtlZDoxOworICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJfb25seToxOworICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgICAgICAgICBrZWVwYWxpdmU6MTsKKyAgICB1bnNpZ25lZCAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZ2VyaW5nX2Nsb3NlOjE7CisgICAgdW5zaWduZWQgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlZDoxOwogCi0gICAgdW5zaWduZWQgICAgICAgICAgICAgZmlsdGVyX25lZWRfaW5fbWVtb3J5OjE7Ci0gICAgdW5zaWduZWQgICAgICAgICAgICAgZmlsdGVyX3NzaV9uZWVkX2luX21lbW9yeToxOwotICAgIHVuc2lnbmVkICAgICAgICAgICAgIGZpbHRlcl9uZWVkX3RlbXBvcmFyeToxOwotICAgIHVuc2lnbmVkICAgICAgICAgICAgIGZpbHRlcl9hbGxvd19yYW5nZXM6MTsKKyAgICB1bnNpZ25lZCAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX25lZWRfaW5fbWVtb3J5OjE7CisgICAgdW5zaWduZWQgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcl9zc2lfbmVlZF9pbl9tZW1vcnk6MTsKKyAgICB1bnNpZ25lZCAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX25lZWRfdGVtcG9yYXJ5OjE7CisgICAgdW5zaWduZWQgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcl9hbGxvd19yYW5nZXM6MTsKIAogI2lmIChOR1hfU1RBVF9TVFVCKQotICAgIHVuc2lnbmVkICAgICAgICAgICAgIHN0YXRfcmVhZGluZzoxOwotICAgIHVuc2lnbmVkICAgICAgICAgICAgIHN0YXRfd3JpdGluZzoxOworICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0X3JlYWRpbmc6MTsKKyAgICB1bnNpZ25lZCAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdF93cml0aW5nOjE7CiAjZW5kaWYKIAotICAgIG5neF91aW50X3QgICAgICAgICAgIGhlYWRlcnNfbjsKKyAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyc19uOwogCiAgICAgLyogdXNlZCB0byBwYXJzZSBIVFRQIGhlYWRlcnMgKi8KLSAgICBuZ3hfdWludF90ICAgICAgICAgICBzdGF0ZTsKLSAgICB1X2NoYXIgICAgICAgICAgICAgICp1cmlfc3RhcnQ7Ci0gICAgdV9jaGFyICAgICAgICAgICAgICAqdXJpX2VuZDsKLSAgICB1X2NoYXIgICAgICAgICAgICAgICp1cmlfZXh0OwotICAgIHVfY2hhciAgICAgICAgICAgICAgKmFyZ3Nfc3RhcnQ7Ci0gICAgdV9jaGFyICAgICAgICAgICAgICAqcmVxdWVzdF9zdGFydDsKLSAgICB1X2NoYXIgICAgICAgICAgICAgICpyZXF1ZXN0X2VuZDsKLSAgICB1X2NoYXIgICAgICAgICAgICAgICptZXRob2RfZW5kOwotICAgIHVfY2hhciAgICAgICAgICAgICAgKnNjaGVtYV9zdGFydDsKLSAgICB1X2NoYXIgICAgICAgICAgICAgICpzY2hlbWFfZW5kOwotICAgIHVfY2hhciAgICAgICAgICAgICAgKmhvc3Rfc3RhcnQ7Ci0gICAgdV9jaGFyICAgICAgICAgICAgICAqaG9zdF9lbmQ7Ci0gICAgdV9jaGFyICAgICAgICAgICAgICAqcG9ydF9zdGFydDsKLSAgICB1X2NoYXIgICAgICAgICAgICAgICpwb3J0X2VuZDsKLSAgICB1X2NoYXIgICAgICAgICAgICAgICpoZWFkZXJfbmFtZV9zdGFydDsKLSAgICB1X2NoYXIgICAgICAgICAgICAgICpoZWFkZXJfbmFtZV9lbmQ7Ci0gICAgdV9jaGFyICAgICAgICAgICAgICAqaGVhZGVyX3N0YXJ0OwotICAgIHVfY2hhciAgICAgICAgICAgICAgKmhlYWRlcl9lbmQ7CisgICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlOworICAgIHVfY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICp1cmlfc3RhcnQ7CisgICAgdV9jaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgKnVyaV9lbmQ7CisgICAgdV9jaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgKnVyaV9leHQ7CisgICAgdV9jaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgKmFyZ3Nfc3RhcnQ7CisgICAgdV9jaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgKnJlcXVlc3Rfc3RhcnQ7CisgICAgdV9jaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgKnJlcXVlc3RfZW5kOworICAgIHVfY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICptZXRob2RfZW5kOworICAgIHVfY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICpzY2hlbWFfc3RhcnQ7CisgICAgdV9jaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNjaGVtYV9lbmQ7CisgICAgdV9jaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgKmhvc3Rfc3RhcnQ7CisgICAgdV9jaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgKmhvc3RfZW5kOworICAgIHVfY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICpwb3J0X3N0YXJ0OworICAgIHVfY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICpwb3J0X2VuZDsKKyAgICB1X2NoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAqaGVhZGVyX25hbWVfc3RhcnQ7CisgICAgdV9jaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgKmhlYWRlcl9uYW1lX2VuZDsKKyAgICB1X2NoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAqaGVhZGVyX3N0YXJ0OworICAgIHVfY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICpoZWFkZXJfZW5kOwogfTsKIAogCmRpZmYgLS1naXQgYS9zcmMvaHR0cC9uZ3hfaHR0cF9yZXF1ZXN0X2JvZHkuYyBiL3NyYy9odHRwL25neF9odHRwX3JlcXVlc3RfYm9keS5jCmluZGV4IDU5ZjcyMjAuLmVlZmZkOGEgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL25neF9odHRwX3JlcXVlc3RfYm9keS5jCisrKyBiL3NyYy9odHRwL25neF9odHRwX3JlcXVlc3RfYm9keS5jCkBAIC0xMiw3ICsxMiw3IEBACiAKIHN0YXRpYyB2b2lkIG5neF9odHRwX3JlYWRfY2xpZW50X3JlcXVlc3RfYm9keV9oYW5kbGVyKG5neF9ldmVudF90ICpyZXYpOwogc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9kb19yZWFkX2NsaWVudF9yZXF1ZXN0X2JvZHkobmd4X2h0dHBfcmVxdWVzdF90ICpyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2Nvbm5lY3Rpb25fdCAqYyk7CisgICAgbmd4X2Nvbm5lY3Rpb25fdCAqYyk7CiAKIC8qCiAgKiBvbiBjb21wbGV0aW9uIG5neF9odHRwX3JlYWRfY2xpZW50X3JlcXVlc3RfYm9keSgpIGFkZHMgdG8KQEAgLTIxLDIyICsyMSwzNSBAQAogICogICAgKikgb25lIG1lbW9yeSBvciBmaWxlIGJ1ZiB0aGF0IGNvbnRhaW5zIHRoZSByZXN0IG9mIHRoZSBib2R5CiAgKi8KIAotbmd4X2ludF90IG5neF9odHRwX3JlYWRfY2xpZW50X3JlcXVlc3RfYm9keShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfY2xpZW50X2JvZHlfaGFuZGxlcl9wdCBwb3N0X2hhbmRsZXIpCituZ3hfaW50X3QKK25neF9odHRwX3JlYWRfY2xpZW50X3JlcXVlc3RfYm9keShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCisgICAgbmd4X2h0dHBfY2xpZW50X2JvZHlfaGFuZGxlcl9wdCBwb3N0X2hhbmRsZXIpCiAKIHsKICAgICBzc2l6ZV90ICAgICAgICAgICAgICAgICAgICBzaXplOwogICAgIG5neF9idWZfdCAgICAgICAgICAgICAgICAgKmI7CiAgICAgbmd4X2NoYWluX3QgICAgICAgICAgICAgICAqY2w7CisgICAgbmd4X2Nvbm5lY3Rpb25fdCAgICAgICAgICAqYzsKICAgICBuZ3hfaHR0cF9yZXF1ZXN0X2JvZHlfdCAgICpyYjsKICAgICBuZ3hfaHR0cF9jb3JlX2xvY19jb25mX3QgICpjbGNmOwogCi0gICAgaWYgKCEocmIgPSBuZ3hfcGNhbGxvYyhyLT5wb29sLCBzaXplb2Yobmd4X2h0dHBfcmVxdWVzdF9ib2R5X3QpKSkpIHsKKyAgICByYiA9IG5neF9wY2FsbG9jKHItPnBvb2wsIHNpemVvZihuZ3hfaHR0cF9yZXF1ZXN0X2JvZHlfdCkpOworICAgIGlmIChyYiA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7CiAgICAgfQogCiAgICAgci0+cmVxdWVzdF9ib2R5ID0gcmI7CiAKKyAgICAvKiBTVFVCICovCisgICAgaWYgKHItPmZpbGUuZmQgIT0gTkdYX0lOVkFMSURfRklMRSkgeworICAgICAgICBpZiAobmd4X2Nsb3NlX2ZpbGUoci0+ZmlsZS5mZCkgPT0gTkdYX0ZJTEVfRVJST1IpIHsKKyAgICAgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19BTEVSVCwgci0+Y29ubmVjdGlvbi0+bG9nLCBuZ3hfZXJybm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9jbG9zZV9maWxlX24gIiBcIiVWXCIgZmFpbGVkIiwgJnItPmZpbGUubmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgci0+ZmlsZS5mZCA9IE5HWF9JTlZBTElEX0ZJTEU7CisgICAgfQorICAgIC8qKi8KKwogICAgIGlmIChyLT5oZWFkZXJzX2luLmNvbnRlbnRfbGVuZ3RoX24gPD0gMCkgewogICAgICAgICBwb3N0X2hhbmRsZXIocik7CiAgICAgICAgIHJldHVybiBOR1hfT0s7CkBAIC01OCw3ICs3MSw4IEBACiAKICAgICAgICAgLyogdGhlcmUgaXMgdGhlIHByZS1yZWFkIHBhcnQgb2YgdGhlIHJlcXVlc3QgYm9keSAqLwogCi0gICAgICAgIGlmICghKGIgPSBuZ3hfY2FsbG9jX2J1ZihyLT5wb29sKSkpIHsKKyAgICAgICAgYiA9IG5neF9jYWxsb2NfYnVmKHItPnBvb2wpOworICAgICAgICBpZiAoYiA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwogICAgICAgICB9CiAKQEAgLTY2LDcgKzgwLDggQEAKICAgICAgICAgYi0+c3RhcnQgPSBiLT5wb3MgPSByLT5oZWFkZXJfaW4tPnBvczsKICAgICAgICAgYi0+ZW5kID0gYi0+bGFzdCA9IHItPmhlYWRlcl9pbi0+bGFzdDsKIAotICAgICAgICBpZiAoIShyYi0+YnVmcyA9IG5neF9hbGxvY19jaGFpbl9saW5rKHItPnBvb2wpKSkgeworICAgICAgICByYi0+YnVmcyA9IG5neF9hbGxvY19jaGFpbl9saW5rKHItPnBvb2wpOworICAgICAgICBpZiAocmItPmJ1ZnMgPT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKICAgICAgICAgfQogCkBAIC0xMDMsMTEgKzExOCwxMyBAQAogICAgICAgICBzaXplID0gY2xjZi0+Y2xpZW50X2JvZHlfYnVmZmVyX3NpemU7CiAgICAgfQogCi0gICAgaWYgKCEocmItPmJ1ZiA9IG5neF9jcmVhdGVfdGVtcF9idWYoci0+cG9vbCwgc2l6ZSkpKSB7CisgICAgcmItPmJ1ZiA9IG5neF9jcmVhdGVfdGVtcF9idWYoci0+cG9vbCwgc2l6ZSk7CisgICAgaWYgKHJiLT5idWYgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwogICAgIH0KIAotICAgIGlmICghKGNsID0gbmd4X2FsbG9jX2NoYWluX2xpbmsoci0+cG9vbCkpKSB7CisgICAgY2wgPSBuZ3hfYWxsb2NfY2hhaW5fbGluayhyLT5wb29sKTsKKyAgICBpZiAoY2wgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwogICAgIH0KIApAQCAtMTIxLDE0ICsxMzgsMTYgQEAKICAgICAgICAgcmItPmJ1ZnMgPSBjbDsKICAgICB9CiAKLSAgICByLT5jb25uZWN0aW9uLT5yZWFkLT5ldmVudF9oYW5kbGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9yZWFkX2NsaWVudF9yZXF1ZXN0X2JvZHlfaGFuZGxlcjsKKyAgICBjID0gci0+Y29ubmVjdGlvbjsKIAotICAgIHJldHVybiBuZ3hfaHR0cF9kb19yZWFkX2NsaWVudF9yZXF1ZXN0X2JvZHkociwgci0+Y29ubmVjdGlvbik7CisgICAgYy0+cmVhZC0+ZXZlbnRfaGFuZGxlciA9IG5neF9odHRwX3JlYWRfY2xpZW50X3JlcXVlc3RfYm9keV9oYW5kbGVyOworCisgICAgcmV0dXJuIG5neF9odHRwX2RvX3JlYWRfY2xpZW50X3JlcXVlc3RfYm9keShyLCBjKTsKIH0KIAogCi1zdGF0aWMgdm9pZCBuZ3hfaHR0cF9yZWFkX2NsaWVudF9yZXF1ZXN0X2JvZHlfaGFuZGxlcihuZ3hfZXZlbnRfdCAqcmV2KQorc3RhdGljIHZvaWQKK25neF9odHRwX3JlYWRfY2xpZW50X3JlcXVlc3RfYm9keV9oYW5kbGVyKG5neF9ldmVudF90ICpyZXYpCiB7CiAgICAgbmd4X2ludF90ICAgICAgICAgICAgcmM7CiAgICAgbmd4X2Nvbm5lY3Rpb25fdCAgICAqYzsKQEAgLTE1MCw4ICsxNjksOSBAQAogfQogCiAKLXN0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfZG9fcmVhZF9jbGllbnRfcmVxdWVzdF9ib2R5KG5neF9odHRwX3JlcXVlc3RfdCAqciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9jb25uZWN0aW9uX3QgKmMpCitzdGF0aWMgbmd4X2ludF90CituZ3hfaHR0cF9kb19yZWFkX2NsaWVudF9yZXF1ZXN0X2JvZHkobmd4X2h0dHBfcmVxdWVzdF90ICpyLAorICAgIG5neF9jb25uZWN0aW9uX3QgKmMpCiB7CiAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgc2l6ZTsKICAgICBzc2l6ZV90ICAgICAgICAgICAgICAgICAgICBuOwpAQCAtMTY5LDcgKzE4OSw4IEBACiAgICAgICAgIGlmIChyYi0+YnVmLT5sYXN0ID09IHJiLT5idWYtPmVuZCkgewogCiAgICAgICAgICAgICBpZiAocmItPnRlbXBfZmlsZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCEodGYgPSBuZ3hfcGNhbGxvYyhyLT5wb29sLCBzaXplb2Yobmd4X3RlbXBfZmlsZV90KSkpKSB7CisgICAgICAgICAgICAgICAgdGYgPSBuZ3hfcGNhbGxvYyhyLT5wb29sLCBzaXplb2Yobmd4X3RlbXBfZmlsZV90KSk7CisgICAgICAgICAgICAgICAgaWYgKHRmID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTI2OCw3ICsyODksOCBAQAogICAgICAgICAgICAgcmV0dXJuIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKICAgICAgICAgfQogCi0gICAgICAgIGlmICghKGIgPSBuZ3hfY2FsbG9jX2J1ZihyLT5wb29sKSkpIHsKKyAgICAgICAgYiA9IG5neF9jYWxsb2NfYnVmKHItPnBvb2wpOworICAgICAgICBpZiAoYiA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9odHRwL25neF9odHRwX3NwZWNpYWxfcmVzcG9uc2UuYyBiL3NyYy9odHRwL25neF9odHRwX3NwZWNpYWxfcmVzcG9uc2UuYwppbmRleCA1NzJhZDBhLi40NGRhNWYzIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9uZ3hfaHR0cF9zcGVjaWFsX3Jlc3BvbnNlLmMKKysrIGIvc3JjL2h0dHAvbmd4X2h0dHBfc3BlY2lhbF9yZXNwb25zZS5jCkBAIC0xNyw3ICsxNyw3IEBACiA7CiAKIAotc3RhdGljIHVfY2hhciBtc2llX3N0dWJbXSA9CitzdGF0aWMgdV9jaGFyIG5neF9odHRwX21zaWVfc3R1YltdID0KICI8IS0tIFRoZSBwYWRkaW5nIHRvIGRpc2FibGUgTVNJRSdzIGZyaWVuZGx5IGVycm9yIHBhZ2UgLS0+IiBDUkxGCiAiPCEtLSBUaGUgcGFkZGluZyB0byBkaXNhYmxlIE1TSUUncyBmcmllbmRseSBlcnJvciBwYWdlIC0tPiIgQ1JMRgogIjwhLS0gVGhlIHBhZGRpbmcgdG8gZGlzYWJsZSBNU0lFJ3MgZnJpZW5kbHkgZXJyb3IgcGFnZSAtLT4iIENSTEYKQEAgLTIzNCw5ICsyMzQsOSBAQAogbmd4X2h0dHBfc3BlY2lhbF9yZXNwb25zZV9oYW5kbGVyKG5neF9odHRwX3JlcXVlc3RfdCAqciwgbmd4X2ludF90IGVycm9yKQogewogICAgIG5neF9pbnRfdCAgICAgICAgICAgICAgICAgIHJjOwotICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgIGVyciwgaSwgbXNpZV9wYWRkaW5nOworICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgIGksIGVyciwgbXNpZV9wYWRkaW5nOwogICAgIG5neF9idWZfdCAgICAgICAgICAgICAgICAgKmI7Ci0gICAgbmd4X2NoYWluX3QgICAgICAgICAgICAgICAqb3V0LCAqKmxsLCAqY2w7CisgICAgbmd4X2NoYWluX3QgICAgICAgICAgICAgICAqb3V0LCAqY2w7CiAgICAgbmd4X2h0dHBfZXJyX3BhZ2VfdCAgICAgICAqZXJyX3BhZ2U7CiAgICAgbmd4X2h0dHBfY29yZV9sb2NfY29uZl90ICAqY2xjZjsKIApAQCAtMzI3LDcgKzMyNyw3IEBACiAgICAgICAgICAgICAmJiBlcnJvciA+PSBOR1hfSFRUUF9CQURfUkVRVUVTVAogICAgICAgICAgICAgJiYgZXJyb3IgIT0gTkdYX0hUVFBfUkVRVUVTVF9VUklfVE9PX0xBUkdFKQogICAgICAgICB7Ci0gICAgICAgICAgICByLT5oZWFkZXJzX291dC5jb250ZW50X2xlbmd0aF9uICs9IHNpemVvZihtc2llX3N0dWIpIC0gMTsKKyAgICAgICAgICAgIHItPmhlYWRlcnNfb3V0LmNvbnRlbnRfbGVuZ3RoX24gKz0gc2l6ZW9mKG5neF9odHRwX21zaWVfc3R1YikgLSAxOwogICAgICAgICAgICAgbXNpZV9wYWRkaW5nID0gMTsKICAgICAgICAgfQogCkBAIC0zNjAsNDMgKzM2MCw2NCBAQAogICAgICAgICByZXR1cm4gTkdYX09LOwogICAgIH0KIAotICAgIG91dCA9IE5VTEw7Ci0gICAgbGwgPSBOVUxMOwogCi0gICAgaWYgKCEoYiA9IG5neF9jYWxsb2NfYnVmKHItPnBvb2wpKSkgeworICAgIGIgPSBuZ3hfY2FsbG9jX2J1ZihyLT5wb29sKTsKKyAgICBpZiAoYiA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgfQorCiAgICAgYi0+bWVtb3J5ID0gMTsKICAgICBiLT5wb3MgPSBlcnJvcl9wYWdlc1tlcnJdLmRhdGE7CiAgICAgYi0+bGFzdCA9IGVycm9yX3BhZ2VzW2Vycl0uZGF0YSArIGVycm9yX3BhZ2VzW2Vycl0ubGVuOwogCi0gICAgbmd4X2FsbG9jX2xpbmtfYW5kX3NldF9idWYoY2wsIGIsIHItPnBvb2wsIE5HWF9FUlJPUik7Ci0gICAgbmd4X2NoYWluX2FkZF9saW5rKG91dCwgbGwsIGNsKTsKLQotCi0gICAgaWYgKCEoYiA9IG5neF9jYWxsb2NfYnVmKHItPnBvb2wpKSkgeworICAgIGNsID0gbmd4X2FsbG9jX2NoYWluX2xpbmsoci0+cG9vbCk7CisgICAgaWYgKGNsID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICB9CisKKyAgICBjbC0+YnVmID0gYjsKKyAgICBvdXQgPSBjbDsKKworCisgICAgYiA9IG5neF9jYWxsb2NfYnVmKHItPnBvb2wpOworICAgIGlmIChiID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICB9CisKICAgICBiLT5tZW1vcnkgPSAxOwogICAgIGItPnBvcyA9IGVycm9yX3RhaWw7CiAgICAgYi0+bGFzdCA9IGVycm9yX3RhaWwgKyBzaXplb2YoZXJyb3JfdGFpbCkgLSAxOwogCi0gICAgbmd4X2FsbG9jX2xpbmtfYW5kX3NldF9idWYoY2wsIGIsIHItPnBvb2wsIE5HWF9FUlJPUik7Ci0gICAgbmd4X2NoYWluX2FkZF9saW5rKG91dCwgbGwsIGNsKTsKKyAgICBjbC0+bmV4dCA9IG5neF9hbGxvY19jaGFpbl9saW5rKHItPnBvb2wpOworICAgIGlmIChjbC0+bmV4dCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgfQorCisgICAgY2wgPSBjbC0+bmV4dDsKKyAgICBjbC0+YnVmID0gYjsKIAogICAgIGlmIChtc2llX3BhZGRpbmcpIHsKLSAgICAgICAgaWYgKCEoYiA9IG5neF9jYWxsb2NfYnVmKHItPnBvb2wpKSkgeworICAgICAgICBiID0gbmd4X2NhbGxvY19idWYoci0+cG9vbCk7CisgICAgICAgIGlmIChiID09IE5VTEwpIHsKICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgICAgIH0KLSAgICAgICAgYi0+bWVtb3J5ID0gMTsKLSAgICAgICAgYi0+cG9zID0gbXNpZV9zdHViOwotICAgICAgICBiLT5sYXN0ID0gbXNpZV9zdHViICsgc2l6ZW9mKG1zaWVfc3R1YikgLSAxOwogCi0gICAgICAgIG5neF9hbGxvY19saW5rX2FuZF9zZXRfYnVmKGNsLCBiLCByLT5wb29sLCBOR1hfRVJST1IpOwotICAgICAgICBuZ3hfY2hhaW5fYWRkX2xpbmsob3V0LCBsbCwgY2wpOworICAgICAgICBiLT5tZW1vcnkgPSAxOworICAgICAgICBiLT5wb3MgPSBuZ3hfaHR0cF9tc2llX3N0dWI7CisgICAgICAgIGItPmxhc3QgPSBuZ3hfaHR0cF9tc2llX3N0dWIgKyBzaXplb2Yobmd4X2h0dHBfbXNpZV9zdHViKSAtIDE7CisKKyAgICAgICAgY2wtPm5leHQgPSBuZ3hfYWxsb2NfY2hhaW5fbGluayhyLT5wb29sKTsKKyAgICAgICAgaWYgKGNsLT5uZXh0ID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjbCA9IGNsLT5uZXh0OworICAgICAgICBjbC0+YnVmID0gYjsKICAgICB9CiAKICAgICBiLT5sYXN0X2J1ZiA9IDE7CiAKKyAgICBjbC0+bmV4dCA9IE5VTEw7CisKICAgICByZXR1cm4gbmd4X2h0dHBfb3V0cHV0X2ZpbHRlcihyLCBvdXQpOwogfQpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbmd4X2h0dHBfdXBzdHJlYW0uYyBiL3NyYy9odHRwL25neF9odHRwX3Vwc3RyZWFtLmMKaW5kZXggNWI4MzEyMS4uMzA3NmRmNyAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbmd4X2h0dHBfdXBzdHJlYW0uYworKysgYi9zcmMvaHR0cC9uZ3hfaHR0cF91cHN0cmVhbS5jCkBAIC0xMjksMTMgKzEyOSwxNCBAQAogICAgIHUtPndyaXRlci5wb29sID0gci0+cG9vbDsKIAogICAgIGlmIChuZ3hfYXJyYXlfaW5pdCgmdS0+c3RhdGVzLCByLT5wb29sLCB1LT5wZWVyLnBlZXJzLT5udW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5neF9odHRwX3Vwc3RyZWFtX3N0YXRlX3QpKSA9PSBOR1hfRVJST1IpCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfaHR0cF91cHN0cmVhbV9zdGF0ZV90KSkgIT0gTkdYX09LKQogICAgIHsKICAgICAgICAgbmd4X2h0dHBfZmluYWxpemVfcmVxdWVzdChyLCBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgaWYgKCEodS0+c3RhdGUgPSBuZ3hfcHVzaF9hcnJheSgmdS0+c3RhdGVzKSkpIHsKKyAgICB1LT5zdGF0ZSA9IG5neF9hcnJheV9wdXNoKCZ1LT5zdGF0ZXMpOworICAgIGlmICh1LT5zdGF0ZSA9PSBOVUxMKSB7CiAgICAgICAgIG5neF9odHRwX2ZpbmFsaXplX3JlcXVlc3QociwgTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTMxNyw3ICszMTgsOCBAQAogICAgIGlmIChyLT5yZXF1ZXN0X2JvZHktPmJ1ZikgewogICAgICAgICBpZiAoci0+cmVxdWVzdF9ib2R5LT50ZW1wX2ZpbGUpIHsKIAotICAgICAgICAgICAgaWYgKCEodS0+b3V0cHV0LmZyZWUgPSBuZ3hfYWxsb2NfY2hhaW5fbGluayhyLT5wb29sKSkpIHsKKyAgICAgICAgICAgIHUtPm91dHB1dC5mcmVlID0gbmd4X2FsbG9jX2NoYWluX2xpbmsoci0+cG9vbCk7CisgICAgICAgICAgICBpZiAodS0+b3V0cHV0LmZyZWUgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIG5neF9odHRwX3Vwc3RyZWFtX2ZpbmFsaXplX3JlcXVlc3QociwgdSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwpAQCAtMzkyLDcgKzM5NCw4IEBACiAKICAgICAvKiBhZGQgb25lIG1vcmUgc3RhdGUgKi8KIAotICAgIGlmICghKHUtPnN0YXRlID0gbmd4X3B1c2hfYXJyYXkoJnUtPnN0YXRlcykpKSB7CisgICAgdS0+c3RhdGUgPSBuZ3hfYXJyYXlfcHVzaCgmdS0+c3RhdGVzKTsKKyAgICBpZiAodS0+c3RhdGUgPT0gTlVMTCkgewogICAgICAgICBuZ3hfaHR0cF91cHN0cmVhbV9maW5hbGl6ZV9yZXF1ZXN0KHIsIHUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SKTsKICAgICAgICAgcmV0dXJuOwpAQCAtNzM5LDcgKzc0Miw4IEBACiAgICAgCiAgICAgcC0+Y2FjaGFibGUgPSB1LT5jYWNoYWJsZTsKIAotICAgIGlmICghKHAtPnRlbXBfZmlsZSA9IG5neF9wY2FsbG9jKHItPnBvb2wsIHNpemVvZihuZ3hfdGVtcF9maWxlX3QpKSkpIHsKKyAgICBwLT50ZW1wX2ZpbGUgPSBuZ3hfcGNhbGxvYyhyLT5wb29sLCBzaXplb2Yobmd4X3RlbXBfZmlsZV90KSk7CisgICAgaWYgKHAtPnRlbXBfZmlsZSA9PSBOVUxMKSB7CiAgICAgICAgIG5neF9odHRwX3Vwc3RyZWFtX2ZpbmFsaXplX3JlcXVlc3QociwgdSwgMCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC03NTksNyArNzYzLDggQEAKICAgICBwLT5tYXhfdGVtcF9maWxlX3NpemUgPSB1LT5jb25mLT5tYXhfdGVtcF9maWxlX3NpemU7CiAgICAgcC0+dGVtcF9maWxlX3dyaXRlX3NpemUgPSB1LT5jb25mLT50ZW1wX2ZpbGVfd3JpdGVfc2l6ZTsKIAotICAgIGlmICghKHAtPnByZXJlYWRfYnVmcyA9IG5neF9hbGxvY19jaGFpbl9saW5rKHItPnBvb2wpKSkgeworICAgIHAtPnByZXJlYWRfYnVmcyA9IG5neF9hbGxvY19jaGFpbl9saW5rKHItPnBvb2wpOworICAgIGlmIChwLT5wcmVyZWFkX2J1ZnMgPT0gTlVMTCkgewogICAgICAgICBuZ3hfaHR0cF91cHN0cmVhbV9maW5hbGl6ZV9yZXF1ZXN0KHIsIHUsIDApOwogICAgICAgICByZXR1cm47CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbmd4X2h0dHBfdmFyaWFibGVzLmMgYi9zcmMvaHR0cC9uZ3hfaHR0cF92YXJpYWJsZXMuYwppbmRleCBlNjVmMzg4Li4xNTRlZTEzIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9uZ3hfaHR0cF92YXJpYWJsZXMuYworKysgYi9zcmMvaHR0cC9uZ3hfaHR0cF92YXJpYWJsZXMuYwpAQCAtMjUsNyArMjUsNyBAQAogc3RhdGljIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgKgogICAgIG5neF9odHRwX3ZhcmlhYmxlX2hlYWRlcihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVpbnRwdHJfdCBkYXRhKTsKIHN0YXRpYyBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICoKLSAgICBuZ3hfaHR0cF92YXJpYWJsZV91bmtub3duX2hlYWRlcihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIG5neF9zdHJfdCAqdmFyKTsKKyAgICBuZ3hfaHR0cF92YXJpYWJsZV91bmtub3duX2hlYWRlcihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVpbnRwdHJfdCBkYXRhKTsKIHN0YXRpYyBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICoKICAgICBuZ3hfaHR0cF92YXJpYWJsZV9yZW1vdGVfYWRkcihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVpbnRwdHJfdCBkYXRhKTsKIHN0YXRpYyBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICoKQEAgLTY5LDM5ICs2OSw3MSBAQAogCiAKIG5neF9odHRwX3ZhcmlhYmxlX3QgKgotbmd4X2h0dHBfYWRkX3ZhcmlhYmxlKG5neF9jb25mX3QgKmNmKQorbmd4X2h0dHBfYWRkX3ZhcmlhYmxlKG5neF9jb25mX3QgKmNmLCBuZ3hfc3RyX3QgKm5hbWUsIG5neF91aW50X3Qgc2V0KQogewotICAgIG5neF9odHRwX3ZhcmlhYmxlX3QgICAgICAgICp2YXI7CisgICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgIGk7CisgICAgbmd4X2h0dHBfdmFyaWFibGVfdCAgICAgICAgKnY7CiAgICAgbmd4X2h0dHBfY29yZV9tYWluX2NvbmZfdCAgKmNtY2Y7CiAKICAgICBjbWNmID0gbmd4X2h0dHBfY29uZl9nZXRfbW9kdWxlX21haW5fY29uZihjZiwgbmd4X2h0dHBfY29yZV9tb2R1bGUpOwogCi0gICAgaWYgKGNtY2YtPnZhcmlhYmxlcy5lbHRzID09IE5VTEwpIHsKKyAgICB2ID0gY21jZi0+dmFyaWFibGVzLmVsdHM7CisKKyAgICBpZiAodiA9PSBOVUxMKSB7CiAgICAgICAgIGlmIChuZ3hfYXJyYXlfaW5pdCgmY21jZi0+dmFyaWFibGVzLCBjZi0+cG9vbCwgNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfaHR0cF92YXJpYWJsZV90KSkgPT0gTkdYX0VSUk9SKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQorCisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGNtY2YtPnZhcmlhYmxlcy5uZWx0czsgaSsrKSB7CisgICAgICAgICAgICBpZiAobmFtZS0+bGVuICE9IHZbaV0ubmFtZS5sZW4KKyAgICAgICAgICAgICAgICB8fCBuZ3hfc3RybmNhc2VjbXAobmFtZS0+ZGF0YSwgdltpXS5uYW1lLmRhdGEsIG5hbWUtPmxlbikgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHNldCAmJiB2W2ldLmhhbmRsZXIpIHsKKyAgICAgICAgICAgICAgICBuZ3hfY29uZl9sb2dfZXJyb3IoTkdYX0xPR19FTUVSRywgY2YsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgZHVwbGljYXRlIFwiJVZcIiB2YXJpYWJsZSIsIG5hbWUpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gJnZbaV07CisgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoISh2YXIgPSBuZ3hfYXJyYXlfcHVzaCgmY21jZi0+dmFyaWFibGVzKSkpIHsKKyAgICB2ID0gbmd4X2FycmF5X3B1c2goJmNtY2YtPnZhcmlhYmxlcyk7CisgICAgaWYgKHYgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICB2YXItPmluZGV4ID0gY21jZi0+dmFyaWFibGVzLm5lbHRzIC0gMTsKKyAgICB2LT5uYW1lLmxlbiA9IG5hbWUtPmxlbjsKKyAgICB2LT5uYW1lLmRhdGEgPSBuZ3hfcGFsbG9jKGNmLT5wb29sLCBuYW1lLT5sZW4pOworICAgIGlmICh2LT5uYW1lLmRhdGEgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLSAgICByZXR1cm4gdmFyOworICAgIGZvciAoaSA9IDA7IGkgPCBuYW1lLT5sZW47IGkrKykgeworICAgICAgICB2LT5uYW1lLmRhdGFbaV0gPSBuZ3hfdG91cHBlcihuYW1lLT5kYXRhW2ldKTsKKyAgICB9CisKKyAgICB2LT5pbmRleCA9IGNtY2YtPnZhcmlhYmxlcy5uZWx0cyAtIDE7CisgICAgdi0+aGFuZGxlciA9IE5VTEw7CisgICAgdi0+ZGF0YSA9IDA7CisKKyAgICByZXR1cm4gdjsKIH0KIAogCiBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICoKIG5neF9odHRwX2dldF9pbmRleGVkX3ZhcmlhYmxlKG5neF9odHRwX3JlcXVlc3RfdCAqciwgbmd4X3VpbnRfdCBpbmRleCkKIHsKLSAgICBuZ3hfaHR0cF92YXJpYWJsZV90ICAgICAgICAqdmFyOworICAgIG5neF9odHRwX3ZhcmlhYmxlX3QgICAgICAgICp2OworICAgIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgICp2djsKICAgICBuZ3hfaHR0cF9jb3JlX21haW5fY29uZl90ICAqY21jZjsKIAotICAgIC8qIFRPRE86IGNhY2hlZCB2YXJpYWJsZXMgKi8KLQogICAgIGNtY2YgPSBuZ3hfaHR0cF9nZXRfbW9kdWxlX21haW5fY29uZihyLCBuZ3hfaHR0cF9jb3JlX21vZHVsZSk7CiAKICAgICBpZiAoY21jZi0+dmFyaWFibGVzLmVsdHMgPT0gTlVMTCB8fCBjbWNmLT52YXJpYWJsZXMubmVsdHMgPD0gaW5kZXgpIHsKQEAgLTExMCw3MCArMTQyLDcwIEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIHZhciA9IGNtY2YtPnZhcmlhYmxlcy5lbHRzOworICAgIGlmIChyLT52YXJpYWJsZXMgJiYgci0+dmFyaWFibGVzW2luZGV4XSkgeworICAgICAgICByZXR1cm4gci0+dmFyaWFibGVzW2luZGV4XTsKKyAgICB9CiAKLSAgICByZXR1cm4gdmFyW2luZGV4XS5oYW5kbGVyKHIsIHZhcltpbmRleF0uZGF0YSk7Ci19CisgICAgdiA9IGNtY2YtPnZhcmlhYmxlcy5lbHRzOwogCisgICAgdnYgPSB2W2luZGV4XS5oYW5kbGVyKHIsIHZbaW5kZXhdLmRhdGEpOwogCi1uZ3hfaW50X3QKLW5neF9odHRwX2dldF92YXJpYWJsZV9pbmRleChuZ3hfaHR0cF9jb3JlX21haW5fY29uZl90ICpjbWNmLCBuZ3hfc3RyX3QgKm5hbWUpCi17Ci0gICAgbmd4X3VpbnRfdCAgICAgICAgICAgIGk7Ci0gICAgbmd4X2h0dHBfdmFyaWFibGVfdCAgKnZhcjsKLQotICAgIHZhciA9IGNtY2YtPnZhcmlhYmxlcy5lbHRzOwotICAgIGZvciAoaSA9IDA7IGkgPCBjbWNmLT52YXJpYWJsZXMubmVsdHM7IGkrKykgewotICAgICAgICBpZiAodmFyW2ldLm5hbWUubGVuICE9IG5hbWUtPmxlbikgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobmd4X3N0cm5jYXNlY21wKHZhcltpXS5uYW1lLmRhdGEsIG5hbWUtPmRhdGEsIG5hbWUtPmxlbikgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIHZhcltpXS5pbmRleDsKKyAgICBpZiAoci0+dmFyaWFibGVzID09IE5VTEwpIHsKKyAgICAgICAgci0+dmFyaWFibGVzID0gbmd4X3BjYWxsb2Moci0+cG9vbCwgY21jZi0+dmFyaWFibGVzLm5lbHRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzaXplb2Yobmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAqKSk7CisgICAgICAgIGlmIChyLT52YXJpYWJsZXMgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gLTE7CisgICAgci0+dmFyaWFibGVzW2luZGV4XSA9IHZ2OworCisgICAgcmV0dXJuIHZ2OwogfQogCiAKIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgKgogbmd4X2h0dHBfZ2V0X3ZhcmlhYmxlKG5neF9odHRwX3JlcXVlc3RfdCAqciwgbmd4X3N0cl90ICpuYW1lKQogewotICAgIG5neF9pbnRfdCAgICAgICAgICAgICAgICAgICBpbmRleDsKICAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgaSwga2V5OwotICAgIG5neF9odHRwX2NvcmVfdmFyaWFibGVfdCAgICp2YXI7CisgICAgbmd4X2h0dHBfdmFyaWFibGVfdCAgICAgICAgKnY7CisgICAgbmd4X2h0dHBfY29yZV92YXJpYWJsZV90ICAgKmN2OwogICAgIG5neF9odHRwX2NvcmVfbWFpbl9jb25mX3QgICpjbWNmOwogCiAgICAgY21jZiA9IG5neF9odHRwX2dldF9tb2R1bGVfbWFpbl9jb25mKHIsIG5neF9odHRwX2NvcmVfbW9kdWxlKTsKIAotICAgIGluZGV4ID0gbmd4X2h0dHBfZ2V0X3ZhcmlhYmxlX2luZGV4KGNtY2YsIG5hbWUpOworICAgIHYgPSBjbWNmLT52YXJpYWJsZXMuZWx0czsKKyAgICBmb3IgKGkgPSAwOyBpIDwgY21jZi0+dmFyaWFibGVzLm5lbHRzOyBpKyspIHsKKyAgICAgICAgaWYgKHZbaV0ubmFtZS5sZW4gIT0gbmFtZS0+bGVuKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQogCi0gICAgaWYgKGluZGV4ICE9IC0xKSB7Ci0gICAgICAgIHJldHVybiBuZ3hfaHR0cF9nZXRfaW5kZXhlZF92YXJpYWJsZShyLCBpbmRleCk7CisgICAgICAgIGlmIChuZ3hfc3RybmNtcCh2W2ldLm5hbWUuZGF0YSwgbmFtZS0+ZGF0YSwgbmFtZS0+bGVuKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gbmd4X2h0dHBfZ2V0X2luZGV4ZWRfdmFyaWFibGUociwgdltpXS5pbmRleCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBuZ3hfaHR0cF92YXJzX2hhc2hfa2V5KGtleSwgbmFtZSk7CiAKLSAgICB2YXIgPSBuZ3hfaHR0cF9jb3JlX3ZhcmlhYmxlc19oYXNoW2tleV0uZWx0czsKKyAgICBjdiA9IG5neF9odHRwX2NvcmVfdmFyaWFibGVzX2hhc2hba2V5XS5lbHRzOwogICAgIGZvciAoaSA9IDA7IGkgPCBuZ3hfaHR0cF9jb3JlX3ZhcmlhYmxlc19oYXNoW2tleV0ubmVsdHM7IGkrKykgewotCi0gICAgICAgIGlmICh2YXJbaV0ubmFtZS5sZW4gIT0gbmFtZS0+bGVuCi0gICAgICAgICAgICB8fCBuZ3hfc3RybmNhc2VjbXAodmFyW2ldLm5hbWUuZGF0YSwgbmFtZS0+ZGF0YSwgbmFtZS0+bGVuKSAhPSAwKQotICAgICAgICB7CisgICAgICAgIGlmIChjdltpXS5uYW1lLmxlbiAhPSBuYW1lLT5sZW4pIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuIHZhcltpXS5oYW5kbGVyKHIsIHZhcltpXS5kYXRhKTsKKyAgICAgICAgaWYgKG5neF9zdHJuY21wKGN2W2ldLm5hbWUuZGF0YSwgbmFtZS0+ZGF0YSwgbmFtZS0+bGVuKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gY3ZbaV0uaGFuZGxlcihyLCBjdltpXS5kYXRhKTsKKyAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChuZ3hfc3RybmNhc2VjbXAobmFtZS0+ZGF0YSwgIkhUVFBfIiwgNSkgIT0gMCkgewotICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfRVJSLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCi0gICAgICAgICAgICAgICAgICAgICAgInVua25vd24gXCIlVlwiIHZhcmlhYmxlIiwgbmFtZSk7Ci0gICAgICAgIHJldHVybiBOR1hfSFRUUF9WQVJJQUJMRV9OT1RfRk9VTkQ7CisgICAgaWYgKG5neF9zdHJuY21wKG5hbWUtPmRhdGEsICJIVFRQXyIsIDUpID09IDApIHsKKyAgICAgICAgcmV0dXJuIG5neF9odHRwX3ZhcmlhYmxlX3Vua25vd25faGVhZGVyKHIsICh1aW50cHRyX3QpIG5hbWUpOwogICAgIH0KIAotICAgIHJldHVybiBuZ3hfaHR0cF92YXJpYWJsZV91bmtub3duX2hlYWRlcihyLCBuYW1lKTsKKyAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfRVJSLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAidW5rbm93biBcIiVWXCIgdmFyaWFibGUiLCBuYW1lKTsKKworICAgIHJldHVybiBOR1hfSFRUUF9WQVJJQUJMRV9OT1RfRk9VTkQ7CiB9CiAKIApAQCAtMTgxLDcgKzIxMyw3IEBACiBuZ3hfaHR0cF92YXJpYWJsZV9oZWFkZXIobmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1aW50cHRyX3QgZGF0YSkKIHsKICAgICBuZ3hfdGFibGVfZWx0X3QgICAgICAgICAgICAqaDsKLSAgICBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICAqdjsKKyAgICBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICAqdnY7CiAKICAgICBoID0gKihuZ3hfdGFibGVfZWx0X3QgKiopICgoY2hhciAqKSAmci0+aGVhZGVyc19pbiArIGRhdGEpOwogCkBAIC0xODksMjUgKzIyMSwyOCBAQAogICAgICAgICByZXR1cm4gTkdYX0hUVFBfVkFSSUFCTEVfTk9UX0ZPVU5EOwogICAgIH0KIAotICAgIGlmICghKHYgPSBuZ3hfcGFsbG9jKHItPnBvb2wsIHNpemVvZihuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90KSkpKSB7CisgICAgdnYgPSBuZ3hfcGFsbG9jKHItPnBvb2wsIHNpemVvZihuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90KSk7CisgICAgaWYgKHZ2ID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgdi0+dmFsdWUgPSAwOwotICAgIHYtPnRleHQgPSBoLT52YWx1ZTsKKyAgICB2di0+dmFsdWUgPSAwOworICAgIHZ2LT50ZXh0ID0gaC0+dmFsdWU7CiAKLSAgICByZXR1cm4gdjsKKyAgICByZXR1cm4gdnY7CiB9CiAKIAogc3RhdGljIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgKgotbmd4X2h0dHBfdmFyaWFibGVfdW5rbm93bl9oZWFkZXIobmd4X2h0dHBfcmVxdWVzdF90ICpyLCBuZ3hfc3RyX3QgKnZhcikKK25neF9odHRwX3ZhcmlhYmxlX3Vua25vd25faGVhZGVyKG5neF9odHRwX3JlcXVlc3RfdCAqciwgdWludHB0cl90IGRhdGEpCiB7CisgICAgbmd4X3N0cl90ICAqdmFyID0gKG5neF9zdHJfdCAqKSBkYXRhOworCiAgICAgdV9jaGFyICAgICAgICAgICAgICAgICAgICAgIGNoOwogICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICBpLCBuOwogICAgIG5neF9saXN0X3BhcnRfdCAgICAgICAgICAgICpwYXJ0OwogICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICAgICpoZWFkZXI7Ci0gICAgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAgKnY7CisgICAgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAgKnZ2OwogCiAgICAgcGFydCA9ICZyLT5oZWFkZXJzX2luLmhlYWRlcnMucGFydDsKICAgICBoZWFkZXIgPSBwYXJ0LT5lbHRzOwpAQCAtMjQxLDEzICsyNzYsMTQgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChuICsgNSA9PSB2YXItPmxlbikgewotICAgICAgICAgICAgaWYgKCEodiA9IG5neF9wYWxsb2Moci0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QpKSkpIHsKKyAgICAgICAgICAgIHZ2ID0gbmd4X3BhbGxvYyhyLT5wb29sLCBzaXplb2Yobmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCkpOworICAgICAgICAgICAgaWYgKHZ2ID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgdi0+dmFsdWUgPSAwOwotICAgICAgICAgICAgdi0+dGV4dCA9IGhlYWRlcltpXS52YWx1ZTsKLSAgICAgICAgICAgIHJldHVybiB2OworICAgICAgICAgICAgdnYtPnZhbHVlID0gMDsKKyAgICAgICAgICAgIHZ2LT50ZXh0ID0gaGVhZGVyW2ldLnZhbHVlOworICAgICAgICAgICAgcmV0dXJuIHZ2OwogICAgICAgICB9CiAgICAgfQogCkBAIC0yNTgsNTYgKzI5NCw2MSBAQAogc3RhdGljIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgKgogbmd4X2h0dHBfdmFyaWFibGVfcmVtb3RlX2FkZHIobmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1aW50cHRyX3QgZGF0YSkKIHsKLSAgICBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICAqdjsKKyAgICBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICAqdnY7CiAKLSAgICBpZiAoISh2ID0gbmd4X3BhbGxvYyhyLT5wb29sLCBzaXplb2Yobmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCkpKSkgeworICAgIHZ2ID0gbmd4X3BhbGxvYyhyLT5wb29sLCBzaXplb2Yobmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCkpOworICAgIGlmICh2diA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIHYtPnZhbHVlID0gMDsKLSAgICB2LT50ZXh0ID0gci0+Y29ubmVjdGlvbi0+YWRkcl90ZXh0OworICAgIHZ2LT52YWx1ZSA9IDA7CisgICAgdnYtPnRleHQgPSByLT5jb25uZWN0aW9uLT5hZGRyX3RleHQ7CiAKLSAgICByZXR1cm4gdjsKKyAgICByZXR1cm4gdnY7CiB9CiAKIAogc3RhdGljIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgKgogbmd4X2h0dHBfdmFyaWFibGVfdXJpKG5neF9odHRwX3JlcXVlc3RfdCAqciwgdWludHB0cl90IGRhdGEpCiB7Ci0gICAgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAgKnY7CisgICAgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAgKnZ2OwogCi0gICAgaWYgKCEodiA9IG5neF9wYWxsb2Moci0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QpKSkpIHsKKyAgICB2diA9IG5neF9wYWxsb2Moci0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QpKTsKKyAgICBpZiAodnYgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICB2LT52YWx1ZSA9IDA7Ci0gICAgdi0+dGV4dCA9IHItPnVyaTsKKyAgICB2di0+dmFsdWUgPSAwOworICAgIHZ2LT50ZXh0ID0gci0+dXJpOwogCi0gICAgcmV0dXJuIHY7CisgICAgcmV0dXJuIHZ2OwogfQogCiAKIHN0YXRpYyBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICoKIG5neF9odHRwX3ZhcmlhYmxlX3F1ZXJ5X3N0cmluZyhuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVpbnRwdHJfdCBkYXRhKQogewotICAgIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgICp2OworICAgIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgICp2djsKIAotICAgIGlmICghKHYgPSBuZ3hfcGFsbG9jKHItPnBvb2wsIHNpemVvZihuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90KSkpKSB7CisgICAgdnYgPSBuZ3hfcGFsbG9jKHItPnBvb2wsIHNpemVvZihuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90KSk7CisgICAgaWYgKHZ2ID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgdi0+dmFsdWUgPSAwOwotICAgIHYtPnRleHQgPSByLT5hcmdzOworICAgIHZ2LT52YWx1ZSA9IDA7CisgICAgdnYtPnRleHQgPSByLT5hcmdzOwogCi0gICAgcmV0dXJuIHY7CisgICAgcmV0dXJuIHZ2OwogfQogCiAKIG5neF9pbnRfdAotbmd4X2h0dHBfY29yZV92YXJpYWJsZXNfaW5pdChuZ3hfY3ljbGVfdCAqY3ljbGUpCituZ3hfaHR0cF92YXJpYWJsZXNfaW5pdChuZ3hfY3ljbGVfdCAqY3ljbGUpCiB7Ci0gICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgaSwga2V5OwotICAgIG5neF9odHRwX2NvcmVfdmFyaWFibGVfdCAgKnZhciwgKnY7CisgICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgIGksIGosIGtleTsKKyAgICBuZ3hfaHR0cF92YXJpYWJsZV90ICAgICAgICAqdjsKKyAgICBuZ3hfaHR0cF9jb3JlX3ZhcmlhYmxlX3QgICAqY3YsICp2cDsKKyAgICBuZ3hfaHR0cF9jb3JlX21haW5fY29uZl90ICAqY21jZjsKIAogICAgIG5neF9odHRwX2NvcmVfdmFyaWFibGVzX2hhc2ggPSBuZ3hfcGFsbG9jKGN5Y2xlLT5wb29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HWF9IVFRQX1ZBUlNfSEFTSF9QUklNRQpAQCAtMzI0LDE0ICszNjUsNTQgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGZvciAodmFyID0gbmd4X2h0dHBfY29yZV92YXJpYWJsZXM7IHZhci0+bmFtZS5sZW47IHZhcisrKSB7Ci0gICAgICAgIG5neF9odHRwX3ZhcnNfaGFzaF9rZXkoa2V5LCAmdmFyLT5uYW1lKTsKKyAgICBmb3IgKGN2ID0gbmd4X2h0dHBfY29yZV92YXJpYWJsZXM7IGN2LT5uYW1lLmxlbjsgY3YrKykgeworICAgICAgICBuZ3hfaHR0cF92YXJzX2hhc2hfa2V5KGtleSwgJmN2LT5uYW1lKTsKIAotICAgICAgICBpZiAoISh2ID0gbmd4X2FycmF5X3B1c2goJm5neF9odHRwX2NvcmVfdmFyaWFibGVzX2hhc2hba2V5XSkpKSB7CisgICAgICAgIHZwID0gbmd4X2FycmF5X3B1c2goJm5neF9odHRwX2NvcmVfdmFyaWFibGVzX2hhc2hba2V5XSk7CisgICAgICAgIGlmICh2cCA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgICAgICB9CiAKLSAgICAgICAgKnYgPSAqdmFyOworICAgICAgICAqdnAgPSAqY3Y7CisgICAgfQorCisKKyAgICBjbWNmID0gbmd4X2h0dHBfY3ljbGVfZ2V0X21vZHVsZV9tYWluX2NvbmYoY3ljbGUsIG5neF9odHRwX2NvcmVfbW9kdWxlKTsKKworICAgIHYgPSBjbWNmLT52YXJpYWJsZXMuZWx0czsKKyAgICBmb3IgKGkgPSAwOyBpIDwgY21jZi0+dmFyaWFibGVzLm5lbHRzOyBpKyspIHsKKworICAgICAgICBpZiAodltpXS5oYW5kbGVyKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIG5neF9odHRwX3ZhcnNfaGFzaF9rZXkoa2V5LCAmdltpXS5uYW1lKTsKKworICAgICAgICBjdiA9IG5neF9odHRwX2NvcmVfdmFyaWFibGVzX2hhc2hba2V5XS5lbHRzOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgbmd4X2h0dHBfY29yZV92YXJpYWJsZXNfaGFzaFtrZXldLm5lbHRzOyBqKyspIHsKKyAgICAgICAgICAgIGlmIChjdltqXS5uYW1lLmxlbiAhPSB2W2ldLm5hbWUubGVuKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChuZ3hfc3RybmNtcChjdltqXS5uYW1lLmRhdGEsIHZbaV0ubmFtZS5kYXRhLCB2W2ldLm5hbWUubGVuKQorICAgICAgICAgICAgICAgID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdltpXS5oYW5kbGVyID0gY3Zbal0uaGFuZGxlcjsKKyAgICAgICAgICAgICAgICB2W2ldLmRhdGEgPSBjdltqXS5kYXRhOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG5neF9zdHJuY21wKHZbaV0ubmFtZS5kYXRhLCAiSFRUUF8iLCA1KSA9PSAwKSB7CisgICAgICAgICAgICB2W2ldLmhhbmRsZXIgPSBuZ3hfaHR0cF92YXJpYWJsZV91bmtub3duX2hlYWRlcjsKKyAgICAgICAgICAgIHZbaV0uZGF0YSA9ICh1aW50cHRyX3QpICZ2W2ldLm5hbWU7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19FUlIsIGN5Y2xlLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgICAgInVua25vd24gXCIlVlwiIHZhcmlhYmxlIiwgJnZbaV0ubmFtZSk7CisKKyAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICB9CiAKICAgICByZXR1cm4gTkdYX09LOwpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbmd4X2h0dHBfdmFyaWFibGVzLmggYi9zcmMvaHR0cC9uZ3hfaHR0cF92YXJpYWJsZXMuaAppbmRleCBjN2NjZGMxLi5iZjgwMzg2IDEwMDY0NAotLS0gYS9zcmMvaHR0cC9uZ3hfaHR0cF92YXJpYWJsZXMuaAorKysgYi9zcmMvaHR0cC9uZ3hfaHR0cF92YXJpYWJsZXMuaApAQCAtMTcsNDUgKzE3LDQxIEBACiAjZGVmaW5lIE5HWF9IVFRQX1ZBUklBQkxFX05PVF9GT1VORCAgKG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgKikgLTEKIAogCi10eXBlZGVmIHN0cnVjdCB7CitzdHJ1Y3Qgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfcyB7CiAgICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgICAgIHZhbHVlOwogICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICAgICB0ZXh0OwotfSBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90OwotICAgIAorfTsKIAogdHlwZWRlZiBzdHJ1Y3Qgbmd4X2h0dHBfdmFyaWFibGVfcyAgbmd4X2h0dHBfdmFyaWFibGVfdDsKIAogdHlwZWRlZiBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICoKLSAgICAgICAgICAgICAgICAoKm5neF9odHRwX2dldF92YXJpYWJsZV9wdCkgKG5neF9odHRwX3JlcXVlc3RfdCAqciwgdm9pZCAqdmFyKTsKKyAgICAoKm5neF9odHRwX2dldF92YXJpYWJsZV9wdCkgKG5neF9odHRwX3JlcXVlc3RfdCAqciwgdWludHB0cl90IGRhdGEpOwogCiAKIHN0cnVjdCBuZ3hfaHR0cF92YXJpYWJsZV9zIHsKLSAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgICAgICAgbmFtZTsKLSAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgICAgaW5kZXg7Ci0gICAgbmd4X2h0dHBfZ2V0X3ZhcmlhYmxlX3B0ICAgICAgIGhhbmRsZXI7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGE7Ci0gICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgICAgIHVzZXM7CisgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgbmFtZTsKKyAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICBpbmRleDsKKyAgICBuZ3hfaHR0cF9nZXRfdmFyaWFibGVfcHQgICBoYW5kbGVyOworICAgIHVpbnRwdHJfdCAgICAgICAgICAgICAgICAgIGRhdGE7CiB9OwogCiAKLXR5cGVkZWYgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAqCi0gICAgKCpuZ3hfaHR0cF9nZXRfY29yZV92YXJpYWJsZV9wdCkgKG5neF9odHRwX3JlcXVlc3RfdCAqciwgdWludHB0cl90IGRhdGEpOwotCiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgICAgIG5hbWU7Ci0gICAgbmd4X2h0dHBfZ2V0X2NvcmVfdmFyaWFibGVfcHQgIGhhbmRsZXI7Ci0gICAgdWludHB0cl90ICAgICAgICAgICAgICAgICAgICAgIGRhdGE7CisgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgbmFtZTsKKyAgICBuZ3hfaHR0cF9nZXRfdmFyaWFibGVfcHQgICBoYW5kbGVyOworICAgIHVpbnRwdHJfdCAgICAgICAgICAgICAgICAgIGRhdGE7CiB9IG5neF9odHRwX2NvcmVfdmFyaWFibGVfdDsKIAogCi1uZ3hfaHR0cF92YXJpYWJsZV90ICpuZ3hfaHR0cF9hZGRfdmFyaWFibGUobmd4X2NvbmZfdCAqY2YpOworbmd4X2h0dHBfdmFyaWFibGVfdCAqbmd4X2h0dHBfYWRkX3ZhcmlhYmxlKG5neF9jb25mX3QgKmNmLCBuZ3hfc3RyX3QgKm5hbWUsCisgICAgbmd4X3VpbnRfdCBzZXQpOwogbmd4X2ludF90IG5neF9odHRwX2dldF92YXJpYWJsZV9pbmRleChuZ3hfaHR0cF9jb3JlX21haW5fY29uZl90ICpjbWNmLAogICAgIG5neF9zdHJfdCAqbmFtZSk7CiBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICpuZ3hfaHR0cF9nZXRfaW5kZXhlZF92YXJpYWJsZShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCiAgICAgbmd4X3VpbnRfdCBpbmRleCk7CiBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICpuZ3hfaHR0cF9nZXRfdmFyaWFibGUobmd4X2h0dHBfcmVxdWVzdF90ICpyLAogICAgIG5neF9zdHJfdCAqbmFtZSk7Ci1uZ3hfaW50X3Qgbmd4X2h0dHBfY29yZV92YXJpYWJsZXNfaW5pdChuZ3hfY3ljbGVfdCAqY3ljbGUpOworbmd4X2ludF90IG5neF9odHRwX3ZhcmlhYmxlc19pbml0KG5neF9jeWNsZV90ICpjeWNsZSk7CiAKIAogI2VuZGlmIC8qIF9OR1hfSFRUUF9WQVJJQUJMRVNfSF9JTkNMVURFRF8gKi8KZGlmZiAtLWdpdCBhL3NyYy9odHRwL25neF9odHRwX3dyaXRlX2ZpbHRlci5jIGIvc3JjL2h0dHAvbmd4X2h0dHBfd3JpdGVfZmlsdGVyX21vZHVsZS5jCnNpbWlsYXJpdHkgaW5kZXggOTIlCnJlbmFtZSBmcm9tIHNyYy9odHRwL25neF9odHRwX3dyaXRlX2ZpbHRlci5jCnJlbmFtZSB0byBzcmMvaHR0cC9uZ3hfaHR0cF93cml0ZV9maWx0ZXJfbW9kdWxlLmMKaW5kZXggMTI2OTkwOS4uODg4MzkwNyAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbmd4X2h0dHBfd3JpdGVfZmlsdGVyLmMKKysrIGIvc3JjL2h0dHAvbmd4X2h0dHBfd3JpdGVfZmlsdGVyX21vZHVsZS5jCkBAIC00Miw3ICs0Miw4IEBACiB9OwogCiAKLW5neF9pbnRfdCBuZ3hfaHR0cF93cml0ZV9maWx0ZXIobmd4X2h0dHBfcmVxdWVzdF90ICpyLCBuZ3hfY2hhaW5fdCAqaW4pCituZ3hfaW50X3QKK25neF9odHRwX3dyaXRlX2ZpbHRlcihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIG5neF9jaGFpbl90ICppbikKIHsKICAgICBvZmZfdCAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLCBzZW50OwogICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICAgIGxhc3QsIGZsdXNoOwpAQCAtNTUsOCArNTYsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF93cml0ZV9maWx0ZXJfbW9kdWxlKTsKIAogICAgIGlmIChjdHggPT0gTlVMTCkgewotICAgICAgICBuZ3hfaHR0cF9jcmVhdGVfY3R4KHIsIGN0eCwgbmd4X2h0dHBfd3JpdGVfZmlsdGVyX21vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yobmd4X2h0dHBfd3JpdGVfZmlsdGVyX2N0eF90KSwgTkdYX0VSUk9SKTsKKworICAgICAgICBjdHggPSBuZ3hfcGNhbGxvYyhyLT5wb29sLCBzaXplb2Yobmd4X2h0dHBfd3JpdGVfZmlsdGVyX2N0eF90KSk7CisgICAgICAgIGlmIChjdHggPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIG5neF9odHRwX3NldF9jdHgociwgY3R4LCBuZ3hfaHR0cF93cml0ZV9maWx0ZXJfbW9kdWxlKTsKICAgICB9CiAKICAgICBzaXplID0gMDsKQEAgLTExMiw3ICsxMTgsOCBAQAogICAgIC8qIGFkZCB0aGUgbmV3IGNoYWluIHRvIHRoZSBleGlzdGVudCBvbmUgKi8KIAogICAgIGZvciAobG4gPSBpbjsgbG47IGxuID0gbG4tPm5leHQpIHsKLSAgICAgICAgaWYgKCEoY2wgPSBuZ3hfYWxsb2NfY2hhaW5fbGluayhyLT5wb29sKSkpIHsKKyAgICAgICAgY2wgPSBuZ3hfYWxsb2NfY2hhaW5fbGluayhyLT5wb29sKTsKKyAgICAgICAgaWYgKGNsID09IE5VTEwpIHsKICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgICAgIH0KIApAQCAtMTkwLDcgKzE5NywxMSBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKGZsdXNoKSB7Ci0gICAgICAgICAgICB3aGlsZSAoKGN0eC0+b3V0ID0gY3R4LT5vdXQtPm5leHQpKSB7IC8qIHZvaWQgKi8gfQorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGN0eC0+b3V0ID0gY3R4LT5vdXQtPm5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAoY3R4LT5vdXQpOworCiAgICAgICAgICAgICByZXR1cm4gTkdYX09LOwogICAgICAgICB9CiAKQEAgLTIzMCw3ICsyNDEsOCBAQAogfQogCiAKLXN0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfd3JpdGVfZmlsdGVyX2luaXQobmd4X2N5Y2xlX3QgKmN5Y2xlKQorc3RhdGljIG5neF9pbnRfdAorbmd4X2h0dHBfd3JpdGVfZmlsdGVyX2luaXQobmd4X2N5Y2xlX3QgKmN5Y2xlKQogewogICAgIG5neF9odHRwX3RvcF9ib2R5X2ZpbHRlciA9IG5neF9odHRwX3dyaXRlX2ZpbHRlcjsKIApkaWZmIC0tZ2l0IGEvc3JjL2ltYXAvbmd4X2ltYXBfaGFuZGxlci5jIGIvc3JjL2ltYXAvbmd4X2ltYXBfaGFuZGxlci5jCmluZGV4IDRkOWU5M2EuLjM3MWQ3N2YgMTAwNjQ0Ci0tLSBhL3NyYy9pbWFwL25neF9pbWFwX2hhbmRsZXIuYworKysgYi9zcmMvaW1hcC9uZ3hfaW1hcF9oYW5kbGVyLmMKQEAgLTE3LDcgKzE3LDkgQEAKIAogCiBzdGF0aWMgdV9jaGFyIHBvcDNfZ3JlZXRpbmdbXSA9ICIrT0sgIiBOR0lOWF9WRVIgIiByZWFkeSIgQ1JMRjsKKyNpZiAwCiBzdGF0aWMgdV9jaGFyIGltYXBfZ3JlZXRpbmdbXSA9ICIqIE9LICIgTkdJTlhfVkVSICIgcmVhZHkiIENSTEY7CisjZW5kaWYKIAogc3RhdGljIHVfY2hhciBwb3AzX29rW10gPSAiK09LIiBDUkxGOwogc3RhdGljIHVfY2hhciBwb3AzX2ludmFsaWRfY29tbWFuZFtdID0gIi1FUlIgaW52YWxpZCBjb21tYW5kIiBDUkxGOwpAQCAtNjksNyArNzEsOCBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgaWYgKCEocyA9IG5neF9wY2FsbG9jKGMtPnBvb2wsIHNpemVvZihuZ3hfaW1hcF9zZXNzaW9uX3QpKSkpIHsKKyAgICBzID0gbmd4X3BjYWxsb2MoYy0+cG9vbCwgc2l6ZW9mKG5neF9pbWFwX3Nlc3Npb25fdCkpOworICAgIGlmIChzID09IE5VTEwpIHsKICAgICAgICAgbmd4X2ltYXBfY2xvc2VfY29ubmVjdGlvbihjKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTMwNyw1ICszMTAsNSBAQAogCiAgICAgbmd4X2Nsb3NlX2Nvbm5lY3Rpb24oYyk7CiAKLSAgICBuZ3hfZGVzdHJveV9wb29sKGMtPnBvb2wpOworICAgIG5neF9kZXN0cm95X3Bvb2wocG9vbCk7CiB9CmRpZmYgLS1naXQgYS9zcmMvaW1hcC9uZ3hfaW1hcF9wYXJzZS5jIGIvc3JjL2ltYXAvbmd4X2ltYXBfcGFyc2UuYwppbmRleCAwMzk1MWE2Li42YzFjM2U5IDEwMDY0NAotLS0gYS9zcmMvaW1hcC9uZ3hfaW1hcF9wYXJzZS5jCisrKyBiL3NyYy9pbWFwL25neF9pbWFwX3BhcnNlLmMKQEAgLTEyMiw3ICsxMjIsOCBAQAogICAgICAgICAgICAgY2FzZSAnICc6CiAgICAgICAgICAgICBjYXNlIENSOgogICAgICAgICAgICAgY2FzZSBMRjoKLSAgICAgICAgICAgICAgICBpZiAoIShhcmcgPSBuZ3hfYXJyYXlfcHVzaCgmcy0+YXJncykpKSB7CisgICAgICAgICAgICAgICAgYXJnID0gbmd4X2FycmF5X3B1c2goJnMtPmFyZ3MpOworICAgICAgICAgICAgICAgIGlmIChhcmcgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBhcmctPmxlbiA9IHAgLSAxIC0gcy0+YXJnX3N0YXJ0OwpAQCAtMTY5LDcgKzE3MCw4IEBACiAKICAgICBpZiAoc3RhdGUgPT0gc3dfZG9uZSkgewogICAgICAgICBpZiAocy0+YXJnX3N0YXJ0KSB7Ci0gICAgICAgICAgICBpZiAoIShhcmcgPSBuZ3hfYXJyYXlfcHVzaCgmcy0+YXJncykpKSB7CisgICAgICAgICAgICBhcmcgPSBuZ3hfYXJyYXlfcHVzaCgmcy0+YXJncyk7CisgICAgICAgICAgICBpZiAoYXJnID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYXJnLT5sZW4gPSBzLT5hcmdfZW5kIC0gcy0+YXJnX3N0YXJ0OwpkaWZmIC0tZ2l0IGEvc3JjL2ltYXAvbmd4X2ltYXBfcHJveHkuYyBiL3NyYy9pbWFwL25neF9pbWFwX3Byb3h5LmMKaW5kZXggZGRlMzQ5NS4uNDUxZmIzNyAxMDA2NDQKLS0tIGEvc3JjL2ltYXAvbmd4X2ltYXBfcHJveHkuYworKysgYi9zcmMvaW1hcC9uZ3hfaW1hcF9wcm94eS5jCkBAIC0xMyw3ICsxMyw2IEBACiAKIHN0YXRpYyB2b2lkIG5neF9pbWFwX3Byb3h5X2Jsb2NrX3JlYWQobmd4X2V2ZW50X3QgKnJldik7CiBzdGF0aWMgdm9pZCBuZ3hfaW1hcF9wcm94eV9hdXRoX2hhbmRsZXIobmd4X2V2ZW50X3QgKnJldik7Ci1zdGF0aWMgdm9pZCBuZ3hfaW1hcF9wcm94eV9pbml0X2hhbmRsZXIobmd4X2V2ZW50X3QgKndldik7CiBzdGF0aWMgdm9pZCBuZ3hfaW1hcF9wcm94eV9kdW1teV9oYW5kbGVyKG5neF9ldmVudF90ICpldik7CiBzdGF0aWMgbmd4X2ludF90IG5neF9pbWFwX3Byb3h5X3JlYWRfcmVzcG9uc2Uobmd4X2ltYXBfc2Vzc2lvbl90ICpzKTsKIHN0YXRpYyB2b2lkIG5neF9pbWFwX3Byb3h5X2hhbmRsZXIobmd4X2V2ZW50X3QgKmV2KTsKQEAgLTI3LDcgKzI2LDggQEAKICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gICAgKnNpbjsKICAgICBuZ3hfaW1hcF9wcm94eV9jdHhfdCAgKnA7CiAKLSAgICBpZiAoIShwID0gbmd4X3BjYWxsb2Mocy0+Y29ubmVjdGlvbi0+cG9vbCwgc2l6ZW9mKG5neF9pbWFwX3Byb3h5X2N0eF90KSkpKSB7CisgICAgcCA9IG5neF9wY2FsbG9jKHMtPmNvbm5lY3Rpb24tPnBvb2wsIHNpemVvZihuZ3hfaW1hcF9wcm94eV9jdHhfdCkpOworICAgIGlmIChwID09IE5VTEwpIHsKICAgICAgICAgbmd4X2ltYXBfY2xvc2VfY29ubmVjdGlvbihzLT5jb25uZWN0aW9uKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTM2LDcgKzM2LDggQEAKIAogICAgIC8qKi8KIAotICAgIGlmICghKHBlZXJzID0gbmd4X3BjYWxsb2Mocy0+Y29ubmVjdGlvbi0+cG9vbCwgc2l6ZW9mKG5neF9wZWVyc190KSkpKSB7CisgICAgcGVlcnMgPSBuZ3hfcGNhbGxvYyhzLT5jb25uZWN0aW9uLT5wb29sLCBzaXplb2Yobmd4X3BlZXJzX3QpKTsKKyAgICBpZiAocGVlcnMgPT0gTlVMTCkgewogICAgICAgICBuZ3hfaW1hcF9jbG9zZV9jb25uZWN0aW9uKHMtPmNvbm5lY3Rpb24pOwogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtNDUsNyArNDYsOCBAQAogICAgIHAtPnVwc3RyZWFtLmxvZyA9IHMtPmNvbm5lY3Rpb24tPmxvZzsKICAgICBwLT51cHN0cmVhbS5sb2dfZXJyb3IgPSBOR1hfRVJST1JfRVJSOwogCi0gICAgaWYgKCEoc2luID0gbmd4X3BjYWxsb2Mocy0+Y29ubmVjdGlvbi0+cG9vbCwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpKSkgeworICAgIHNpbiA9IG5neF9wY2FsbG9jKHMtPmNvbm5lY3Rpb24tPnBvb2wsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pKTsKKyAgICBpZiAoc2luID09IE5VTEwpIHsKICAgICAgICAgbmd4X2ltYXBfY2xvc2VfY29ubmVjdGlvbihzLT5jb25uZWN0aW9uKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTE0NiwxNCArMTQ4LDE1IEBACiAgICAgICAgIG5neF9sb2dfZGVidWcwKE5HWF9MT0dfREVCVUdfSU1BUCwgcmV2LT5sb2csIDAsICJpbWFwIHByb3h5IHNlbmQgdXNlciIpOwogCiAgICAgICAgIGxpbmUubGVuID0gc2l6ZW9mKCJVU0VSICIpICsgcy0+bG9naW4ubGVuIC0gMSArIDI7Ci0gICAgICAgIGlmICghKGxpbmUuZGF0YSA9IG5neF9wYWxsb2MoYy0+cG9vbCwgbGluZS5sZW4pKSkgeworICAgICAgICBsaW5lLmRhdGEgPSBuZ3hfcGFsbG9jKGMtPnBvb2wsIGxpbmUubGVuKTsKKyAgICAgICAgaWYgKGxpbmUuZGF0YSA9PSBOVUxMKSB7CiAgICAgICAgICAgICBuZ3hfaW1hcF9wcm94eV9jbG9zZV9zZXNzaW9uKHMpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKICAgICAgICAgcCA9IG5neF9jcHltZW0obGluZS5kYXRhLCAiVVNFUiAiLCBzaXplb2YoIlVTRVIgIikgLSAxKTsKICAgICAgICAgcCA9IG5neF9jcHltZW0ocCwgcy0+bG9naW4uZGF0YSwgcy0+bG9naW4ubGVuKTsKLSAgICAgICAgKnArKyA9IENSOyAqcCsrID0gTEY7CisgICAgICAgICpwKysgPSBDUjsgKnAgPSBMRjsKIAogICAgICAgICBpZiAobmd4X3NlbmQoYywgbGluZS5kYXRhLCBsaW5lLmxlbikgPCAoc3NpemVfdCkgbGluZS5sZW4pIHsKICAgICAgICAgICAgIC8qCkBAIC0xNzUsMTQgKzE3OCwxNSBAQAogICAgIG5neF9sb2dfZGVidWcwKE5HWF9MT0dfREVCVUdfSU1BUCwgcmV2LT5sb2csIDAsICJpbWFwIHByb3h5IHNlbmQgcGFzcyIpOwogCiAgICAgbGluZS5sZW4gPSBzaXplb2YoIlBBU1MgIikgKyBzLT5wYXNzd2QubGVuIC0gMSArIDI7Ci0gICAgaWYgKCEobGluZS5kYXRhID0gbmd4X3BhbGxvYyhjLT5wb29sLCBsaW5lLmxlbikpKSB7CisgICAgbGluZS5kYXRhID0gbmd4X3BhbGxvYyhjLT5wb29sLCBsaW5lLmxlbik7CisgICAgaWYgKGxpbmUuZGF0YSA9PSBOVUxMKSB7CiAgICAgICAgIG5neF9pbWFwX3Byb3h5X2Nsb3NlX3Nlc3Npb24ocyk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKICAgICBwID0gbmd4X2NweW1lbShsaW5lLmRhdGEsICJQQVNTICIsIHNpemVvZigiUEFTUyAiKSAtIDEpOwogICAgIHAgPSBuZ3hfY3B5bWVtKHAsIHMtPnBhc3N3ZC5kYXRhLCBzLT5wYXNzd2QubGVuKTsKLSAgICAqcCsrID0gQ1I7ICpwKysgPSBMRjsKKyAgICAqcCsrID0gQ1I7ICpwID0gTEY7CiAKICAgICBpZiAobmd4X3NlbmQoYywgbGluZS5kYXRhLCBsaW5lLmxlbikgPCAoc3NpemVfdCkgbGluZS5sZW4pIHsKICAgICAgICAgLyoKZGlmZiAtLWdpdCBhL3NyYy9vcy91bml4L25neF9haW9fcmVhZF9jaGFpbi5jIGIvc3JjL29zL3VuaXgvbmd4X2Fpb19yZWFkX2NoYWluLmMKaW5kZXggMzE3OTNkNS4uYzZmOWFlYSAxMDA2NDQKLS0tIGEvc3JjL29zL3VuaXgvbmd4X2Fpb19yZWFkX2NoYWluLmMKKysrIGIvc3JjL29zL3VuaXgvbmd4X2Fpb19yZWFkX2NoYWluLmMKQEAgLTE2LDcgKzE2LDYgQEAKICAgICB1X2NoYXIgICAgICAgKmJ1ZiwgKnByZXY7CiAgICAgc2l6ZV90ICAgICAgICBzaXplOwogICAgIHNzaXplX3QgICAgICAgdG90YWw7Ci0gICAgbmd4X2Vycl90ICAgICBlcnI7CiAKICAgICBpZiAoYy0+cmVhZC0+cGVuZGluZ19lb2YpIHsKICAgICAgICAgYy0+cmVhZC0+cmVhZHkgPSAwOwpkaWZmIC0tZ2l0IGEvc3JjL29zL3VuaXgvbmd4X2Fpb193cml0ZV9jaGFpbi5jIGIvc3JjL29zL3VuaXgvbmd4X2Fpb193cml0ZV9jaGFpbi5jCmluZGV4IDg4YjI0NzQuLmI5MGY4YmIgMTAwNjQ0Ci0tLSBhL3NyYy9vcy91bml4L25neF9haW9fd3JpdGVfY2hhaW4uYworKysgYi9zcmMvb3MvdW5peC9uZ3hfYWlvX3dyaXRlX2NoYWluLmMKQEAgLTE3LDcgKzE3LDYgQEAKICAgICBvZmZfdCAgICAgICAgIHNlbmQsIHNlbnQ7CiAgICAgc2l6ZV90ICAgICAgICBsZW47CiAgICAgc3NpemVfdCAgICAgICBuLCBzaXplOwotICAgIG5neF9lcnJfdCAgICAgZXJyOwogICAgIG5neF9jaGFpbl90ICAqY2w7CiAKICAgICAvKiB0aGUgbWF4aW11bSBsaW1pdCBzaXplIGlzIHRoZSBtYXhpbXVtIHNpemVfdCB2YWx1ZSAtIHRoZSBwYWdlIHNpemUgKi8KZGlmZiAtLWdpdCBhL3NyYy9vcy91bml4L25neF9hbGxvYy5jIGIvc3JjL29zL3VuaXgvbmd4X2FsbG9jLmMKaW5kZXggMjU4YTEwZi4uNzJjZjRlNCAxMDA2NDQKLS0tIGEvc3JjL29zL3VuaXgvbmd4X2FsbG9jLmMKKysrIGIvc3JjL29zL3VuaXgvbmd4X2FsbG9jLmMKQEAgLTExLDExICsxMSwxMyBAQAogaW50IG5neF9wYWdlc2l6ZTsKIAogCi12b2lkICpuZ3hfYWxsb2Moc2l6ZV90IHNpemUsIG5neF9sb2dfdCAqbG9nKQordm9pZCAqCituZ3hfYWxsb2Moc2l6ZV90IHNpemUsIG5neF9sb2dfdCAqbG9nKQogewogICAgIHZvaWQgICpwOwogCi0gICAgaWYgKCEocCA9IG1hbGxvYyhzaXplKSkpIHsKKyAgICBwID0gbWFsbG9jKHNpemUpOworICAgIGlmIChwID09IE5VTEwpIHsKICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBsb2csIG5neF9lcnJubywKICAgICAgICAgICAgICAgICAgICAgICAibWFsbG9jKCkgJXV6IGJ5dGVzIGZhaWxlZCIsIHNpemUpOwogICAgIH0KQEAgLTI2LDcgKzI4LDggQEAKIH0KIAogCi12b2lkICpuZ3hfY2FsbG9jKHNpemVfdCBzaXplLCBuZ3hfbG9nX3QgKmxvZykKK3ZvaWQgKgorbmd4X2NhbGxvYyhzaXplX3Qgc2l6ZSwgbmd4X2xvZ190ICpsb2cpCiB7CiAgICAgdm9pZCAgKnA7CiAKQEAgLTQyLDcgKzQ1LDggQEAKIAogI2lmIChOR1hfSEFWRV9QT1NJWF9NRU1BTElHTikKIAotdm9pZCAqbmd4X21lbWFsaWduKHNpemVfdCBhbGlnbm1lbnQsIHNpemVfdCBzaXplLCBuZ3hfbG9nX3QgKmxvZykKK3ZvaWQgKgorbmd4X21lbWFsaWduKHNpemVfdCBhbGlnbm1lbnQsIHNpemVfdCBzaXplLCBuZ3hfbG9nX3QgKmxvZykKIHsKICAgICB2b2lkICAqcDsKIApAQCAtNjAsMTEgKzY0LDEzIEBACiAKICNlbGlmIChOR1hfSEFWRV9NRU1BTElHTikKIAotdm9pZCAqbmd4X21lbWFsaWduKHNpemVfdCBhbGlnbm1lbnQsIHNpemVfdCBzaXplLCBuZ3hfbG9nX3QgKmxvZykKK3ZvaWQgKgorbmd4X21lbWFsaWduKHNpemVfdCBhbGlnbm1lbnQsIHNpemVfdCBzaXplLCBuZ3hfbG9nX3QgKmxvZykKIHsKICAgICB2b2lkICAqcDsKIAotICAgIGlmICghKHAgPSBtZW1hbGlnbihhbGlnbm1lbnQsIHNpemUpKSkgeworICAgIHAgPSBtZW1hbGlnbihhbGlnbm1lbnQsIHNpemUpOworICAgIGlmIChwID09IE5VTEwpIHsKICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBsb2csIG5neF9lcnJubywKICAgICAgICAgICAgICAgICAgICAgICAibWVtYWxpZ24oKSAldXogYnl0ZXMgYWxpZ25lZCB0byAldXogZmFpbGVkIiwKICAgICAgICAgICAgICAgICAgICAgICBzaXplLCBhbGlnbm1lbnQpOwpkaWZmIC0tZ2l0IGEvc3JjL29zL3VuaXgvbmd4X2Vycm5vLmMgYi9zcmMvb3MvdW5peC9uZ3hfZXJybm8uYwppbmRleCA2MDdiMzYxLi5hM2FkZGYwIDEwMDY0NAotLS0gYS9zcmMvb3MvdW5peC9uZ3hfZXJybm8uYworKysgYi9zcmMvb3MvdW5peC9uZ3hfZXJybm8uYwpAQCAtMzQsOCArMzQsNyBAQAogCiB1X2NoYXIgKm5neF9zdHJlcnJvcl9yKGludCBlcnIsIHVfY2hhciAqZXJyc3RyLCBzaXplX3Qgc2l6ZSkKIHsKLSAgICBjaGFyICAgICpzdHI7Ci0gICAgc2l6ZV90ICAgbGVuOworICAgIGNoYXIgICpzdHI7CiAKICAgICBpZiAoc2l6ZSA9PSAwKSB7CiAgICAgICAgIHJldHVybiAwOwpkaWZmIC0tZ2l0IGEvc3JjL29zL3VuaXgvbmd4X2Vycm5vLmggYi9zcmMvb3MvdW5peC9uZ3hfZXJybm8uaAppbmRleCBjMWM1ODAxLi41MWQ2MDhiIDEwMDY0NAotLS0gYS9zcmMvb3MvdW5peC9uZ3hfZXJybm8uaAorKysgYi9zcmMvb3MvdW5peC9uZ3hfZXJybm8uaApAQCAtMjUsNyArMjUsNyBAQAogI2RlZmluZSBOR1hfRU5PVERJUiAgICAgICBFTk9URElSCiAjZGVmaW5lIE5HWF9FSU5WQUwgICAgICAgIEVJTlZBTAogI2RlZmluZSBOR1hfRVBJUEUgICAgICAgICBFUElQRQotI2RlZmluZSBOR1hfRUFHQUlOICAgICAgICBFV09VTERCTE9DSworI2RlZmluZSBOR1hfRUFHQUlOICAgICAgICBFQUdBSU4KICNkZWZpbmUgTkdYX0VJTlBST0dSRVNTICAgRUlOUFJPR1JFU1MKICNkZWZpbmUgTkdYX0VBRERSSU5VU0UgICAgRUFERFJJTlVTRQogI2RlZmluZSBOR1hfRUNPTk5BQk9SVEVEICBFQ09OTkFCT1JURUQKQEAgLTUyLDEwICs1MiwxMCBAQAogCiAjZWxzZQogCi0vKiBTb2xhcmlzIGhhcyB0aHJlYWRzLXNhZmUgc3RyZXJyb3IoKSAqLworLyogU29sYXJpcyBoYXMgdGhyZWFkLXNhZmUgc3RyZXJyb3IoKSAqLwogCiAjZGVmaW5lIG5neF9zdHJlcnJvcl9yKGVyciwgZXJyc3RyLCBzaXplKSAgXAotICAgICAgICAgICAgIG5neF9jcHlzdHJuKGVycnN0ciwgKHVfY2hhciAqKSBzdHJlcnJvcihlcnIpLCBzaXplKQorICAgIG5neF9jcHlzdHJuKGVycnN0ciwgKHVfY2hhciAqKSBzdHJlcnJvcihlcnIpLCBzaXplKQogCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvc3JjL29zL3VuaXgvbmd4X2ZpbGVzLmMgYi9zcmMvb3MvdW5peC9uZ3hfZmlsZXMuYwppbmRleCBlNjdiMmNhLi5mOGY5OGM3IDEwMDY0NAotLS0gYS9zcmMvb3MvdW5peC9uZ3hfZmlsZXMuYworKysgYi9zcmMvb3MvdW5peC9uZ3hfZmlsZXMuYwpAQCAtMTMxLDcgKzEzMSw2IEBACiAgICAgdV9jaGFyICAgICAgICAqcHJldjsKICAgICBzaXplX3QgICAgICAgICBzaXplOwogICAgIHNzaXplX3QgICAgICAgIG47Ci0gICAgbmd4X2Vycl90ICAgICAgZXJyOwogICAgIG5neF9hcnJheV90ICAgIHZlYzsKICAgICBzdHJ1Y3QgaW92ZWMgICppb3YsIGlvdnNbTkdYX0lPVlNdOwogCkBAIC0xNjIsNyArMTYxLDggQEAKICAgICAgICAgICAgICAgICBpb3YtPmlvdl9sZW4gKz0gY2wtPmJ1Zi0+bGFzdCAtIGNsLT5idWYtPnBvczsKIAogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoIShpb3YgPSBuZ3hfYXJyYXlfcHVzaCgmdmVjKSkpIHsKKyAgICAgICAgICAgICAgICBpb3YgPSBuZ3hfYXJyYXlfcHVzaCgmdmVjKTsKKyAgICAgICAgICAgICAgICBpZiAoaW92ID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICAgICAgICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9vcy91bml4L25neF9mcmVlYnNkX2luaXQuYyBiL3NyYy9vcy91bml4L25neF9mcmVlYnNkX2luaXQuYwppbmRleCAwNDRkOWQ1Li43ZGVmYjQ2IDEwMDY0NAotLS0gYS9zcmMvb3MvdW5peC9uZ3hfZnJlZWJzZF9pbml0LmMKKysrIGIvc3JjL29zL3VuaXgvbmd4X2ZyZWVic2RfaW5pdC5jCkBAIC0xNCw2ICsxNCw3IEBACiBpbnQgbmd4X2ZyZWVic2Rfa2Vybl9vc3JlbGRhdGU7CiBpbnQgbmd4X2ZyZWVic2RfaHdfbmNwdTsKIGludCBuZ3hfZnJlZWJzZF9uZXRfaW5ldF90Y3Bfc2VuZHNwYWNlOworaW50IG5neF9mcmVlYnNkX2tlcm5faXBjX3NvbWF4Y29ubjsKIAogLyogRnJlZUJTRCA0LjkgKi8KIGludCBuZ3hfZnJlZWJzZF9tYWNoZGVwX2hsdF9sb2dpY2FsX2NwdXM7CkBAIC02MSw2ICs2MiwxMCBAQAogICAgICAgJm5neF9mcmVlYnNkX25ldF9pbmV0X3RjcF9zZW5kc3BhY2UsCiAgICAgICBzaXplb2YoaW50KSwgMCB9LAogCisgICAgeyAia2Vybi5pcGMuc29tYXhjb25uIiwKKyAgICAgICZuZ3hfZnJlZWJzZF9rZXJuX2lwY19zb21heGNvbm4sCisgICAgICBzaXplb2YoaW50KSwgMCB9LAorCiAgICAgeyAia2Vybi5pcGMuemVyb19jb3B5LnNlbmQiLAogICAgICAgJm5neF9mcmVlYnNkX2tlcm5faXBjX3plcm9fY29weV9zZW5kLAogICAgICAgc2l6ZW9mKGludCksIDAgfSwKQEAgLTg1LDcgKzkwLDcgQEAKIAogbmd4X2ludF90IG5neF9vc19pbml0KG5neF9sb2dfdCAqbG9nKQogewotICAgIGludCAgICAgICAgIHZlcnNpb247CisgICAgaW50ICAgICAgICAgdmVyc2lvbiwgc29tYXhjb25uOwogICAgIHNpemVfdCAgICAgIHNpemU7CiAgICAgbmd4X2Vycl90ICAgZXJyOwogICAgIG5neF91aW50X3QgIGk7CkBAIC0yMDMsNiArMjA4LDE4IEBACiAgICAgICAgIG5neF9uY3B1ID0gbmd4X2ZyZWVic2RfaHdfbmNwdTsKICAgICB9CiAKKyAgICBpZiAodmVyc2lvbiA8IDYwMDAwOCkgeworICAgICAgICBzb21heGNvbm4gPSAzMjc2NzsKKyAgICB9IGVsc2UgeworICAgICAgICBzb21heGNvbm4gPSA2NTUzNTsKKyAgICB9CisKKyAgICBpZiAobmd4X2ZyZWVic2Rfa2Vybl9pcGNfc29tYXhjb25uID4gc29tYXhjb25uKSB7CisgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19BTEVSVCwgbG9nLCAwLAorICAgICAgICAgICAgICAgICAgICAgICJzeXNjdGwga2Vybi5pcGMuc29tYXhjb25uIG11c3QgYmUgbm8gbW9yZSB0aGFuICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICBzb21heGNvbm4pOworICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgIH0KIAogICAgIG5neF90Y3Bfbm9kZWxheV9hbmRfdGNwX25vcHVzaCA9IDE7CiAKZGlmZiAtLWdpdCBhL3NyYy9vcy91bml4L25neF9mcmVlYnNkX3Jmb3JrX3RocmVhZC5jIGIvc3JjL29zL3VuaXgvbmd4X2ZyZWVic2RfcmZvcmtfdGhyZWFkLmMKaW5kZXggNWRmZDQ2OC4uYjdlODAzYiAxMDA2NDQKLS0tIGEvc3JjL29zL3VuaXgvbmd4X2ZyZWVic2RfcmZvcmtfdGhyZWFkLmMKKysrIGIvc3JjL29zL3VuaXgvbmd4X2ZyZWVic2RfcmZvcmtfdGhyZWFkLmMKQEAgLTIyNywxMyArMjI3LDE1IEBACiAKICAgICAvKiBjcmVhdGUgdGhlIHRocmVhZCBlcnJubycgYXJyYXkgKi8KIAotICAgIGlmICghKGVycm5vcyA9IG5neF9jYWxsb2MobiAqIHNpemVvZihpbnQpLCBjeWNsZS0+bG9nKSkpIHsKKyAgICBlcnJub3MgPSBuZ3hfY2FsbG9jKG4gKiBzaXplb2YoaW50KSwgY3ljbGUtPmxvZyk7CisgICAgaWYgKGVycm5vcyA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgfQogCiAgICAgLyogY3JlYXRlIHRoZSB0aHJlYWQgdGlkcyBhcnJheSAqLwogCi0gICAgaWYgKCEodGlkcyA9IG5neF9jYWxsb2MoKG4gKyAxKSAqIHNpemVvZihuZ3hfdGlkX3QpLCBjeWNsZS0+bG9nKSkpIHsKKyAgICB0aWRzID0gbmd4X2NhbGxvYygobiArIDEpICogc2l6ZW9mKG5neF90aWRfdCksIGN5Y2xlLT5sb2cpOworICAgIGlmICh0aWRzID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICB9CiAKQEAgLTI2NCw4ICsyNjYsNyBAQAogCiBuZ3hfdGlkX3Qgbmd4X3RocmVhZF9zZWxmKCkKIHsKLSAgICBpbnQgICAgICAgIHRpZDsKLSAgICBuZ3hfdGlkX3QgIHBpZDsKKyAgICBuZ3hfaW50X3QgIHRpZDsKIAogICAgIHRpZCA9IG5neF9nZXR0aWQoKTsKIApAQCAtMzA1LDcgKzMwNiw4IEBACiAgICAgbmd4X211dGV4X3QgICptOwogICAgIHVuaW9uIHNlbXVuICAgb3A7CiAKLSAgICBpZiAoIShtID0gbmd4X2FsbG9jKHNpemVvZihuZ3hfbXV0ZXhfdCksIGxvZykpKSB7CisgICAgbSA9IG5neF9hbGxvYyhzaXplb2Yobmd4X211dGV4X3QpLCBsb2cpOworICAgIGlmIChtID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCkBAIC0zNTMsNyArMzU1LDcgQEAKIAogbmd4X2ludF90IG5neF9tdXRleF9kb2xvY2sobmd4X211dGV4X3QgKm0sIG5neF9pbnRfdCB0cnkpCiB7Ci0gICAgdWludDMyX3QgICAgICAgbG9jaywgbmV3LCBvbGQ7CisgICAgdWludDMyX3QgICAgICAgbG9jaywgb2xkOwogICAgIG5neF91aW50X3QgICAgIHRyaWVzOwogICAgIHN0cnVjdCBzZW1idWYgIG9wOwogCkBAIC00ODMsNyArNDg1LDcgQEAKIAogbmd4X2ludF90IG5neF9tdXRleF91bmxvY2sobmd4X211dGV4X3QgKm0pCiB7Ci0gICAgdWludDMyX3QgICAgICAgbG9jaywgbmV3LCBvbGQ7CisgICAgdWludDMyX3QgICAgICAgbG9jaywgb2xkOwogICAgIHN0cnVjdCBzZW1idWYgIG9wOwogCiAgICAgaWYgKCFuZ3hfdGhyZWFkZWQpIHsKQEAgLTU3Niw3ICs1NzgsOCBAQAogewogICAgIG5neF9jb25kX3QgICpjdjsKIAotICAgIGlmICghKGN2ID0gbmd4X2FsbG9jKHNpemVvZihuZ3hfY29uZF90KSwgbG9nKSkpIHsKKyAgICBjdiA9IG5neF9hbGxvYyhzaXplb2Yobmd4X2NvbmRfdCksIGxvZyk7CisgICAgaWYgKGN2ID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvb3MvdW5peC9uZ3hfZnJlZWJzZF9yZm9ya190aHJlYWQuaCBiL3NyYy9vcy91bml4L25neF9mcmVlYnNkX3Jmb3JrX3RocmVhZC5oCmluZGV4IDJhZjBhZGIuLjIxNWQyZGMgMTAwNjQ0Ci0tLSBhL3NyYy9vcy91bml4L25neF9mcmVlYnNkX3Jmb3JrX3RocmVhZC5oCisrKyBiL3NyYy9vcy91bml4L25neF9mcmVlYnNkX3Jmb3JrX3RocmVhZC5oCkBAIC01Niw3ICs1Niw3IEBACiBleHRlcm4gc2l6ZV90ICAgbmd4X3RocmVhZF9zdGFja19zaXplOwogCiAKLXN0YXRpYyBpbmxpbmUgaW50IG5neF9nZXR0aWQoKQorc3RhdGljIG5neF9pbmxpbmUgbmd4X2ludF90IG5neF9nZXR0aWQoKQogewogICAgIGNoYXIgICpzcDsKIApkaWZmIC0tZ2l0IGEvc3JjL29zL3VuaXgvbmd4X2ZyZWVic2Rfc2VuZGZpbGVfY2hhaW4uYyBiL3NyYy9vcy91bml4L25neF9mcmVlYnNkX3NlbmRmaWxlX2NoYWluLmMKaW5kZXggNTBjYWQzMC4uYTI5YWFmMyAxMDA2NDQKLS0tIGEvc3JjL29zL3VuaXgvbmd4X2ZyZWVic2Rfc2VuZGZpbGVfY2hhaW4uYworKysgYi9zcmMvb3MvdW5peC9uZ3hfZnJlZWJzZF9zZW5kZmlsZV9jaGFpbi5jCkBAIC0yMSwxOSArMjEsMTkgQEAKICAqIHRvIHBvc3Rwb25lIHRoZSBzZW5kaW5nIC0gaXQgbm90IG9ubHkgc2VuZHMgYSBoZWFkZXIgYW5kIHRoZSBmaXJzdCBwYXJ0IG9mCiAgKiB0aGUgZmlsZSBpbiBvbmUgcGFja2V0LCBidXQgYWxzbyBzZW5kcyB0aGUgZmlsZSBwYWdlcyBpbiB0aGUgZnVsbCBwYWNrZXRzLgogICoKLSAqIEJ1dCB1bnRpbCBGcmVlQlNEIDQuNSB0aGUgdHVybmluZyBUQ1BfTk9QVVNIIG9mZiBkb2VzIG5vdCBmbHVzaCBhIHBlbmRpbmcKLSAqIGRhdGEgdGhhdCBsZXNzIHRoYW4gTVNTIHNvIHRoYXQgZGF0YSBtYXkgYmUgc2VudCB3aXRoIDUgc2Vjb25kIGRlbGF5LgotICogU28gd2UgZG8gbm90IHVzZSBUQ1BfTk9QVVNIIG9uIEZyZWVCU0QgcHJpb3IgdG8gNC41IGFsdGhvdWdoIGl0IGNhbiBiZSB1c2VkCisgKiBCdXQgdW50aWwgRnJlZUJTRCA0LjUgdHVybmluZyBUQ1BfTk9QVVNIIG9mZiBkb2VzIG5vdCBmbHVzaCBhIHBlbmRpbmcKKyAqIGRhdGEgdGhhdCBsZXNzIHRoYW4gTVNTLCBzbyB0aGF0IGRhdGEgbWF5IGJlIHNlbnQgd2l0aCA1IHNlY29uZCBkZWxheS4KKyAqIFNvIHdlIGRvIG5vdCB1c2UgVENQX05PUFVTSCBvbiBGcmVlQlNEIHByaW9yIHRvIDQuNSwgYWx0aG91Z2ggaXQgY2FuIGJlIHVzZWQKICAqIGZvciBub24ta2VlcGFsaXZlIEhUVFAgY29ubmVjdGlvbnMuCiAgKi8KIAogCiAjZGVmaW5lIE5HWF9IRUFERVJTICAgOAotI2RlZmluZSBOR1hfVFJBSUxFUlMgIDQKKyNkZWZpbmUgTkdYX1RSQUlMRVJTICA4CiAKIAotbmd4X2NoYWluX3QgKm5neF9mcmVlYnNkX3NlbmRmaWxlX2NoYWluKG5neF9jb25uZWN0aW9uX3QgKmMsIG5neF9jaGFpbl90ICppbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZfdCBsaW1pdCkKK25neF9jaGFpbl90ICoKK25neF9mcmVlYnNkX3NlbmRmaWxlX2NoYWluKG5neF9jb25uZWN0aW9uX3QgKmMsIG5neF9jaGFpbl90ICppbiwgb2ZmX3QgbGltaXQpCiB7CiAgICAgaW50ICAgICAgICAgICAgICByYzsKICAgICB1X2NoYXIgICAgICAgICAgKnByZXY7CkBAIC0xMjMsNyArMTIzLDggQEAKICAgICAgICAgICAgICAgICBpb3YtPmlvdl9sZW4gKz0gKHNpemVfdCkgc2l6ZTsKIAogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoIShpb3YgPSBuZ3hfYXJyYXlfcHVzaCgmaGVhZGVyKSkpIHsKKyAgICAgICAgICAgICAgICBpb3YgPSBuZ3hfYXJyYXlfcHVzaCgmaGVhZGVyKTsKKyAgICAgICAgICAgICAgICBpZiAoaW92ID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9DSEFJTl9FUlJPUjsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTE5Nyw3ICsxOTgsOCBAQAogICAgICAgICAgICAgICAgICAgICBpb3YtPmlvdl9sZW4gKz0gKHNpemVfdCkgc2l6ZTsKIAogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghKGlvdiA9IG5neF9hcnJheV9wdXNoKCZ0cmFpbGVyKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaW92ID0gbmd4X2FycmF5X3B1c2goJnRyYWlsZXIpOworICAgICAgICAgICAgICAgICAgICBpZiAoaW92ID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfQ0hBSU5fRVJST1I7CiAgICAgICAgICAgICAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL29zL3VuaXgvbmd4X2xpbnV4X3NlbmRmaWxlX2NoYWluLmMgYi9zcmMvb3MvdW5peC9uZ3hfbGludXhfc2VuZGZpbGVfY2hhaW4uYwppbmRleCBhYzhjMzAzLi45ZGRhYzY3IDEwMDY0NAotLS0gYS9zcmMvb3MvdW5peC9uZ3hfbGludXhfc2VuZGZpbGVfY2hhaW4uYworKysgYi9zcmMvb3MvdW5peC9uZ3hfbGludXhfc2VuZGZpbGVfY2hhaW4uYwpAQCAtMTIxLDcgKzEyMSw4IEBACiAgICAgICAgICAgICAgICAgaW92LT5pb3ZfbGVuICs9IChzaXplX3QpIHNpemU7CiAKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKCEoaW92ID0gbmd4X2FycmF5X3B1c2goJmhlYWRlcikpKSB7CisgICAgICAgICAgICAgICAgaW92ID0gbmd4X2FycmF5X3B1c2goJmhlYWRlcik7CisgICAgICAgICAgICAgICAgaWYgKGlvdiA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfQ0hBSU5fRVJST1I7CiAgICAgICAgICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvb3MvdW5peC9uZ3hfcG9zaXhfaW5pdC5jIGIvc3JjL29zL3VuaXgvbmd4X3Bvc2l4X2luaXQuYwppbmRleCA0ZmI1MTI2Li5kNDgzNDNiIDEwMDY0NAotLS0gYS9zcmMvb3MvdW5peC9uZ3hfcG9zaXhfaW5pdC5jCisrKyBiL3NyYy9vcy91bml4L25neF9wb3NpeF9pbml0LmMKQEAgLTE4Miw3ICsxODIsNyBAQAogCiAgICAgICAgIGNhc2Ugbmd4X3NpZ25hbF92YWx1ZShOR1hfTk9BQ0NFUFRfU0lHTkFMKToKICAgICAgICAgICAgIG5neF9ub2FjY2VwdCA9IDE7Ci0gICAgICAgICAgICBhY3Rpb24gPSAiLCBzdG9wIHRoZSBhY2NlcHRpbmcgY29ubmVjdGlvbnMiOworICAgICAgICAgICAgYWN0aW9uID0gIiwgc3RvcCBhY2NlcHRpbmcgY29ubmVjdGlvbnMiOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBuZ3hfc2lnbmFsX3ZhbHVlKE5HWF9SRUNPTkZJR1VSRV9TSUdOQUwpOgpkaWZmIC0tZ2l0IGEvc3JjL29zL3VuaXgvbmd4X3Byb2Nlc3MuYyBiL3NyYy9vcy91bml4L25neF9wcm9jZXNzLmMKaW5kZXggMDgyNWM1Zi4uMDU2MmE0NiAxMDA2NDQKLS0tIGEvc3JjL29zL3VuaXgvbmd4X3Byb2Nlc3MuYworKysgYi9zcmMvb3MvdW5peC9uZ3hfcHJvY2Vzcy5jCkBAIC0yMTQsNyArMjE0LDYgQEAKICAgICBuZ3hfZXJyX3QgICAgICAgIGVycjsKICAgICBuZ3hfaW50X3QgICAgICAgIGk7CiAgICAgbmd4X3VpbnRfdCAgICAgICBvbmU7Ci0gICAgc3RydWN0IHRpbWV2YWwgICB0djsKIAogICAgIG9uZSA9IDA7CiAKZGlmZiAtLWdpdCBhL3NyYy9vcy91bml4L25neF9wcm9jZXNzX2N5Y2xlLmMgYi9zcmMvb3MvdW5peC9uZ3hfcHJvY2Vzc19jeWNsZS5jCmluZGV4IGE0ODg4MDkuLjljNWE3ZWUgMTAwNjQ0Ci0tLSBhL3NyYy9vcy91bml4L25neF9wcm9jZXNzX2N5Y2xlLmMKKysrIGIvc3JjL29zL3VuaXgvbmd4X3Byb2Nlc3NfY3ljbGUuYwpAQCAtMTEsNyArMTEsNyBAQAogCiAKIHN0YXRpYyB2b2lkIG5neF9zdGFydF93b3JrZXJfcHJvY2Vzc2VzKG5neF9jeWNsZV90ICpjeWNsZSwgbmd4X2ludF90IG4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaW50X3QgdHlwZSk7CisgICAgbmd4X2ludF90IHR5cGUpOwogc3RhdGljIHZvaWQgbmd4X3N0YXJ0X2dhcmJhZ2VfY29sbGVjdG9yKG5neF9jeWNsZV90ICpjeWNsZSwgbmd4X2ludF90IHR5cGUpOwogc3RhdGljIHZvaWQgbmd4X3NpZ25hbF93b3JrZXJfcHJvY2Vzc2VzKG5neF9jeWNsZV90ICpjeWNsZSwgaW50IHNpZ25vKTsKIHN0YXRpYyBuZ3hfdWludF90IG5neF9yZWFwX2NoaWxkcyhuZ3hfY3ljbGVfdCAqY3ljbGUpOwpAQCAtMjMsNyArMjMsOSBAQAogc3RhdGljIHZvaWQgbmd4X3dha2V1cF93b3JrZXJfdGhyZWFkcyhuZ3hfY3ljbGVfdCAqY3ljbGUpOwogc3RhdGljIHZvaWQgKm5neF93b3JrZXJfdGhyZWFkX2N5Y2xlKHZvaWQgKmRhdGEpOwogI2VuZGlmCisjaWYgMAogc3RhdGljIHZvaWQgbmd4X2dhcmJhZ2VfY29sbGVjdG9yX2N5Y2xlKG5neF9jeWNsZV90ICpjeWNsZSwgdm9pZCAqZGF0YSk7CisjZW5kaWYKIAogCiBuZ3hfdWludF90ICAgIG5neF9wcm9jZXNzOwpAQCAtNTksNyArNjEsOCBAQAogdV9jaGFyICBtYXN0ZXJfcHJvY2Vzc1tdID0gIm1hc3RlciBwcm9jZXNzIjsKIAogCi12b2lkIG5neF9tYXN0ZXJfcHJvY2Vzc19jeWNsZShuZ3hfY3ljbGVfdCAqY3ljbGUpCit2b2lkCituZ3hfbWFzdGVyX3Byb2Nlc3NfY3ljbGUobmd4X2N5Y2xlX3QgKmN5Y2xlKQogewogICAgIGNoYXIgICAgICAgICAgICAgICp0aXRsZTsKICAgICB1X2NoYXIgICAgICAgICAgICAqcDsKQEAgLTI1NCw3ICsyNTcsOCBAQAogfQogCiAKLXZvaWQgbmd4X3NpbmdsZV9wcm9jZXNzX2N5Y2xlKG5neF9jeWNsZV90ICpjeWNsZSkKK3ZvaWQKK25neF9zaW5nbGVfcHJvY2Vzc19jeWNsZShuZ3hfY3ljbGVfdCAqY3ljbGUpCiB7CiAgICAgbmd4X3VpbnRfdCAgaTsKIApAQCAtMzAwLDggKzMwNCw4IEBACiB9CiAKIAotc3RhdGljIHZvaWQgbmd4X3N0YXJ0X3dvcmtlcl9wcm9jZXNzZXMobmd4X2N5Y2xlX3QgKmN5Y2xlLCBuZ3hfaW50X3QgbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9pbnRfdCB0eXBlKQorc3RhdGljIHZvaWQKK25neF9zdGFydF93b3JrZXJfcHJvY2Vzc2VzKG5neF9jeWNsZV90ICpjeWNsZSwgbmd4X2ludF90IG4sIG5neF9pbnRfdCB0eXBlKQogewogICAgIG5neF9pbnRfdCAgICAgICAgIGk7CiAgICAgbmd4X2NoYW5uZWxfdCAgICAgY2g7CkBAIC0zNTksMTIgKzM2MywxMiBAQAogfQogCiAKLXN0YXRpYyB2b2lkIG5neF9zdGFydF9nYXJiYWdlX2NvbGxlY3RvcihuZ3hfY3ljbGVfdCAqY3ljbGUsIG5neF9pbnRfdCB0eXBlKQorc3RhdGljIHZvaWQKK25neF9zdGFydF9nYXJiYWdlX2NvbGxlY3RvcihuZ3hfY3ljbGVfdCAqY3ljbGUsIG5neF9pbnRfdCB0eXBlKQogewotICAgIG5neF9pbnRfdCAgICAgICAgIGk7Ci0gICAgbmd4X2NoYW5uZWxfdCAgICAgY2g7Ci0KLSAgICByZXR1cm47CisjaWYgMAorICAgIG5neF9pbnRfdCAgICAgIGk7CisgICAgbmd4X2NoYW5uZWxfdCAgY2g7CiAKICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfTk9USUNFLCBjeWNsZS0+bG9nLCAwLCAic3RhcnQgZ2FyYmFnZSBjb2xsZWN0b3IiKTsKIApAQCAtMzk3LDE2ICs0MDEsMTcgQEAKICAgICAgICAgbmd4X3dyaXRlX2NoYW5uZWwobmd4X3Byb2Nlc3Nlc1tpXS5jaGFubmVsWzBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAmY2gsIHNpemVvZihuZ3hfY2hhbm5lbF90KSwgY3ljbGUtPmxvZyk7CiAgICAgfQorI2VuZGlmCiB9CiAKIAotc3RhdGljIHZvaWQgbmd4X3NpZ25hbF93b3JrZXJfcHJvY2Vzc2VzKG5neF9jeWNsZV90ICpjeWNsZSwgaW50IHNpZ25vKQorc3RhdGljIHZvaWQKK25neF9zaWduYWxfd29ya2VyX3Byb2Nlc3NlcyhuZ3hfY3ljbGVfdCAqY3ljbGUsIGludCBzaWdubykKIHsKICAgICBuZ3hfaW50X3QgICAgICBpOwogICAgIG5neF9lcnJfdCAgICAgIGVycjsKICAgICBuZ3hfY2hhbm5lbF90ICBjaDsKIAotCiAgICAgc3dpdGNoIChzaWdubykgewogCiAgICAgY2FzZSBuZ3hfc2lnbmFsX3ZhbHVlKE5HWF9TSFVURE9XTl9TSUdOQUwpOgpAQCAtNDkyLDcgKzQ5Nyw4IEBACiB9CiAKIAotc3RhdGljIG5neF91aW50X3Qgbmd4X3JlYXBfY2hpbGRzKG5neF9jeWNsZV90ICpjeWNsZSkKK3N0YXRpYyBuZ3hfdWludF90CituZ3hfcmVhcF9jaGlsZHMobmd4X2N5Y2xlX3QgKmN5Y2xlKQogewogICAgIG5neF9pbnRfdCAgICAgIGksIG47CiAgICAgbmd4X3VpbnRfdCAgICAgbGl2ZTsKQEAgLTYxOSw3ICs2MjUsOCBAQAogfQogCiAKLXN0YXRpYyB2b2lkIG5neF9tYXN0ZXJfZXhpdChuZ3hfY3ljbGVfdCAqY3ljbGUpCitzdGF0aWMgdm9pZAorbmd4X21hc3Rlcl9leGl0KG5neF9jeWNsZV90ICpjeWNsZSkKIHsKICAgICBuZ3hfZGVsZXRlX3BpZGZpbGUoY3ljbGUpOwogCkBAIC02MzEsMTEgKzYzOCwxNCBAQAogfQogCiAKLXN0YXRpYyB2b2lkIG5neF93b3JrZXJfcHJvY2Vzc19jeWNsZShuZ3hfY3ljbGVfdCAqY3ljbGUsIHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZAorbmd4X3dvcmtlcl9wcm9jZXNzX2N5Y2xlKG5neF9jeWNsZV90ICpjeWNsZSwgdm9pZCAqZGF0YSkKIHsKKyNpZiAoTkdYX1RIUkVBRFMpCiAgICAgbmd4X2ludF90ICAgICAgICAgIG47CiAgICAgbmd4X2Vycl90ICAgICAgICAgIGVycjsKICAgICBuZ3hfY29yZV9jb25mX3QgICAqY2NmOworI2VuZGlmCiAKICAgICBuZ3hfd29ya2VyX3Byb2Nlc3NfaW5pdChjeWNsZSwgMSk7CiAKQEAgLTY2OCw3ICs2NzgsOSBAQAogCiAgICAgICAgIGZvciAobiA9IDA7IG4gPCBuZ3hfdGhyZWFkc19uOyBuKyspIHsKIAotICAgICAgICAgICAgaWYgKCEobmd4X3RocmVhZHNbbl0uY3YgPSBuZ3hfY29uZF9pbml0KGN5Y2xlLT5sb2cpKSkgeworICAgICAgICAgICAgbmd4X3RocmVhZHNbbl0uY3YgPSBuZ3hfY29uZF9pbml0KGN5Y2xlLT5sb2cpOworCisgICAgICAgICAgICBpZiAobmd4X3RocmVhZHNbbl0uY3YgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIC8qIGZhdGFsICovCiAgICAgICAgICAgICAgICAgZXhpdCgyKTsKICAgICAgICAgICAgIH0KQEAgLTc0OCw3ICs3NjAsOCBAQAogfQogCiAKLXN0YXRpYyB2b2lkIG5neF93b3JrZXJfcHJvY2Vzc19pbml0KG5neF9jeWNsZV90ICpjeWNsZSwgbmd4X3VpbnRfdCBwcmlvcml0eSkKK3N0YXRpYyB2b2lkCituZ3hfd29ya2VyX3Byb2Nlc3NfaW5pdChuZ3hfY3ljbGVfdCAqY3ljbGUsIG5neF91aW50X3QgcHJpb3JpdHkpCiB7CiAgICAgc2lnc2V0X3QgICAgICAgICAgIHNldDsKICAgICBuZ3hfaW50X3QgICAgICAgICAgbjsKQEAgLTg3Myw3ICs4ODYsOCBAQAogfQogCiAKLXN0YXRpYyB2b2lkIG5neF9jaGFubmVsX2hhbmRsZXIobmd4X2V2ZW50X3QgKmV2KQorc3RhdGljIHZvaWQKK25neF9jaGFubmVsX2hhbmRsZXIobmd4X2V2ZW50X3QgKmV2KQogewogICAgIG5neF9pbnRfdCAgICAgICAgICBuOwogICAgIG5neF9jaGFubmVsX3QgICAgICBjaDsKQEAgLTk1Miw3ICs5NjYsOCBAQAogCiAjaWYgKE5HWF9USFJFQURTKQogCi1zdGF0aWMgdm9pZCBuZ3hfd2FrZXVwX3dvcmtlcl90aHJlYWRzKG5neF9jeWNsZV90ICpjeWNsZSkKK3N0YXRpYyB2b2lkCituZ3hfd2FrZXVwX3dvcmtlcl90aHJlYWRzKG5neF9jeWNsZV90ICpjeWNsZSkKIHsKICAgICBuZ3hfaW50X3QgICBpOwogICAgIG5neF91aW50X3QgIGxpdmU7CkBAIC05OTQsNyArMTAwOSw4IEBACiB9CiAKIAotc3RhdGljIHZvaWQgKm5neF93b3JrZXJfdGhyZWFkX2N5Y2xlKHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCAqCituZ3hfd29ya2VyX3RocmVhZF9jeWNsZSh2b2lkICpkYXRhKQogewogICAgIG5neF90aHJlYWRfdCAgKnRociA9IGRhdGE7CiAKQEAgLTEwMjIsNyArMTAzOCw4IEBACiAKICAgICBuZ3hfc2V0dGhydGl0bGUoIndvcmtlciB0aHJlYWQiKTsKIAotICAgIGlmICghKHRscyA9IG5neF9jYWxsb2Moc2l6ZW9mKG5neF9jb3JlX3Rsc190KSwgY3ljbGUtPmxvZykpKSB7CisgICAgdGxzID0gbmd4X2NhbGxvYyhzaXplb2Yobmd4X2NvcmVfdGxzX3QpLCBjeWNsZS0+bG9nKTsKKyAgICBpZiAodGxzID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuICh2b2lkICopIDE7CiAgICAgfQogCkBAIC0xMDc3LDcgKzEwOTQsMTAgQEAKICNlbmRpZgogCiAKLXN0YXRpYyB2b2lkIG5neF9nYXJiYWdlX2NvbGxlY3Rvcl9jeWNsZShuZ3hfY3ljbGVfdCAqY3ljbGUsIHZvaWQgKmRhdGEpCisjaWYgMAorCitzdGF0aWMgdm9pZAorbmd4X2dhcmJhZ2VfY29sbGVjdG9yX2N5Y2xlKG5neF9jeWNsZV90ICpjeWNsZSwgdm9pZCAqZGF0YSkKIHsKICAgICBuZ3hfdWludF90ICAgICAgICAgaTsKICAgICBuZ3hfZ2NfdCAgICAgICAgICAgY3R4OwpAQCAtMTEyMywzICsxMTQzLDUgQEAKICAgICAgICAgbmd4X3Byb2Nlc3NfZXZlbnRzKGN5Y2xlKTsKICAgICB9CiB9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL29zL3VuaXgvbmd4X3B0aHJlYWRfdGhyZWFkLmMgYi9zcmMvb3MvdW5peC9uZ3hfcHRocmVhZF90aHJlYWQuYwppbmRleCA0OTAzZDVlLi4wYjU1YzcxIDEwMDY0NAotLS0gYS9zcmMvb3MvdW5peC9uZ3hfcHRocmVhZF90aHJlYWQuYworKysgYi9zcmMvb3MvdW5peC9uZ3hfcHRocmVhZF90aHJlYWQuYwpAQCAtNzUsNyArNzUsOCBAQAogICAgIGludCAgICAgICAgICAgZXJyOwogICAgIG5neF9tdXRleF90ICAqbTsKIAotICAgIGlmICghKG0gPSBuZ3hfYWxsb2Moc2l6ZW9mKG5neF9tdXRleF90KSwgbG9nKSkpIHsKKyAgICBtID0gbmd4X2FsbG9jKHNpemVvZihuZ3hfbXV0ZXhfdCksIGxvZyk7CisgICAgaWYgKG0gPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgICAgCkBAIC0xODksNyArMTkwLDggQEAKICAgICBpbnQgICAgICAgICAgZXJyOwogICAgIG5neF9jb25kX3QgICpjdjsKIAotICAgIGlmICghKGN2ID0gbmd4X2FsbG9jKHNpemVvZihuZ3hfY29uZF90KSwgbG9nKSkpIHsKKyAgICBjdiA9IG5neF9hbGxvYyhzaXplb2Yobmd4X2NvbmRfdCksIGxvZyk7CisgICAgaWYgKGN2ID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIApkaWZmIC0tZ2l0IGEvc3JjL29zL3VuaXgvbmd4X3JlYWR2X2NoYWluLmMgYi9zcmMvb3MvdW5peC9uZ3hfcmVhZHZfY2hhaW4uYwppbmRleCA3YzU3YjdhLi40N2Q4ZjNiIDEwMDY0NAotLS0gYS9zcmMvb3MvdW5peC9uZ3hfcmVhZHZfY2hhaW4uYworKysgYi9zcmMvb3MvdW5peC9uZ3hfcmVhZHZfY2hhaW4uYwpAQCAtOSwxNiArOSwyMCBAQAogI2luY2x1ZGUgPG5neF9ldmVudC5oPgogCiAKKyNkZWZpbmUgTkdYX0lPVlMgIDE2CisKKwogI2lmIChOR1hfSEFWRV9LUVVFVUUpCiAKLXNzaXplX3Qgbmd4X3JlYWR2X2NoYWluKG5neF9jb25uZWN0aW9uX3QgKmMsIG5neF9jaGFpbl90ICpjaGFpbikKK3NzaXplX3QKK25neF9yZWFkdl9jaGFpbihuZ3hfY29ubmVjdGlvbl90ICpjLCBuZ3hfY2hhaW5fdCAqY2hhaW4pCiB7CiAgICAgdV9jaGFyICAgICAgICAqcHJldjsKICAgICBzc2l6ZV90ICAgICAgICBuLCBzaXplOwogICAgIG5neF9lcnJfdCAgICAgIGVycjsKLSAgICBuZ3hfYXJyYXlfdCAgICBpbzsKKyAgICBuZ3hfYXJyYXlfdCAgICB2ZWM7CiAgICAgbmd4X2V2ZW50X3QgICAqcmV2OwotICAgIHN0cnVjdCBpb3ZlYyAgKmlvdjsKKyAgICBzdHJ1Y3QgaW92ZWMgICppb3YsIGlvdnNbTkdYX0lPVlNdOwogCiAgICAgcmV2ID0gYy0+cmVhZDsgCiAKQEAgLTUzLDcgKzU3LDExIEBACiAgICAgaW92ID0gTlVMTDsKICAgICBzaXplID0gMDsKIAotICAgIG5neF9pbml0X2FycmF5KGlvLCBjLT5wb29sLCAxMCwgc2l6ZW9mKHN0cnVjdCBpb3ZlYyksIE5HWF9FUlJPUik7CisgICAgdmVjLmVsdHMgPSBpb3ZzOworICAgIHZlYy5uZWx0cyA9IDA7CisgICAgdmVjLnNpemUgPSBzaXplb2Yoc3RydWN0IGlvdmVjKTsKKyAgICB2ZWMubmFsbG9jID0gTkdYX0lPVlM7CisgICAgdmVjLnBvb2wgPSBjLT5wb29sOwogCiAgICAgLyogY29hbGVzY2UgdGhlIG5laWdoYm91cmluZyBidWZzICovCiAKQEAgLTYyLDcgKzcwLDExIEBACiAgICAgICAgICAgICBpb3YtPmlvdl9sZW4gKz0gY2hhaW4tPmJ1Zi0+ZW5kIC0gY2hhaW4tPmJ1Zi0+bGFzdDsKIAogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbmd4X3Rlc3RfbnVsbChpb3YsIG5neF9wdXNoX2FycmF5KCZpbyksIE5HWF9FUlJPUik7CisgICAgICAgICAgICBpb3YgPSBuZ3hfYXJyYXlfcHVzaCgmdmVjKTsKKyAgICAgICAgICAgIGlmIChpb3YgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlvdi0+aW92X2Jhc2UgPSAodm9pZCAqKSBjaGFpbi0+YnVmLT5sYXN0OwogICAgICAgICAgICAgaW92LT5pb3ZfbGVuID0gY2hhaW4tPmJ1Zi0+ZW5kIC0gY2hhaW4tPmJ1Zi0+bGFzdDsKICAgICAgICAgfQpAQCAtNzMsMTIgKzg1LDEyIEBACiAgICAgfQogCiAgICAgbmd4X2xvZ19kZWJ1ZzIoTkdYX0xPR19ERUJVR19FVkVOVCwgYy0+bG9nLCAwLAotICAgICAgICAgICAgICAgICAgICJyZWFkdjogJWQsIGxhc3Q6JWQiLCBpby5uZWx0cywgaW92LT5pb3ZfbGVuKTsKKyAgICAgICAgICAgICAgICAgICAicmVhZHY6ICVkLCBsYXN0OiVkIiwgdmVjLm5lbHRzLCBpb3YtPmlvdl9sZW4pOwogCiAgICAgcmV2ID0gYy0+cmVhZDsKIAogICAgIGRvIHsKLSAgICAgICAgbiA9IHJlYWR2KGMtPmZkLCAoc3RydWN0IGlvdmVjICopIGlvLmVsdHMsIGlvLm5lbHRzKTsKKyAgICAgICAgbiA9IHJlYWR2KGMtPmZkLCAoc3RydWN0IGlvdmVjICopIHZlYy5lbHRzLCB2ZWMubmVsdHMpOwogCiAgICAgICAgIGlmIChuID49IDApIHsKICAgICAgICAgICAgIGlmIChuZ3hfZXZlbnRfZmxhZ3MgJiBOR1hfVVNFX0tRVUVVRV9FVkVOVCkgewpAQCAtMTM4LDIwICsxNTAsMjUgQEAKIAogI2Vsc2UgLyogISBOR1hfSEFWRV9LUVVFVUUgKi8KIAotc3NpemVfdCBuZ3hfcmVhZHZfY2hhaW4obmd4X2Nvbm5lY3Rpb25fdCAqYywgbmd4X2NoYWluX3QgKmNoYWluKQorc3NpemVfdAorbmd4X3JlYWR2X2NoYWluKG5neF9jb25uZWN0aW9uX3QgKmMsIG5neF9jaGFpbl90ICpjaGFpbikKIHsKICAgICB1X2NoYXIgICAgICAgICpwcmV2OwogICAgIHNzaXplX3QgICAgICAgIG4sIHNpemU7CiAgICAgbmd4X2Vycl90ICAgICAgZXJyOwotICAgIG5neF9hcnJheV90ICAgIGlvOworICAgIG5neF9hcnJheV90ICAgIHZlYzsKICAgICBuZ3hfZXZlbnRfdCAgICpyZXY7Ci0gICAgc3RydWN0IGlvdmVjICAqaW92OworICAgIHN0cnVjdCBpb3ZlYyAgKmlvdiwgaW92c1tOR1hfSU9WU107CiAKICAgICBwcmV2ID0gTlVMTDsKICAgICBpb3YgPSBOVUxMOwogICAgIHNpemUgPSAwOwogCi0gICAgbmd4X2luaXRfYXJyYXkoaW8sIGMtPnBvb2wsIDEwLCBzaXplb2Yoc3RydWN0IGlvdmVjKSwgTkdYX0VSUk9SKTsKKyAgICB2ZWMuZWx0cyA9IGlvdnM7CisgICAgdmVjLm5lbHRzID0gMDsKKyAgICB2ZWMuc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaW92ZWMpOworICAgIHZlYy5uYWxsb2MgPSBOR1hfSU9WUzsKKyAgICB2ZWMucG9vbCA9IGMtPnBvb2w7CiAKICAgICAvKiBjb2FsZXNjZSB0aGUgbmVpZ2hib3VyaW5nIGJ1ZnMgKi8KIApAQCAtMTYwLDcgKzE3NywxMSBAQAogICAgICAgICAgICAgaW92LT5pb3ZfbGVuICs9IGNoYWluLT5idWYtPmVuZCAtIGNoYWluLT5idWYtPmxhc3Q7CiAKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG5neF90ZXN0X251bGwoaW92LCBuZ3hfcHVzaF9hcnJheSgmaW8pLCBOR1hfRVJST1IpOworICAgICAgICAgICAgaW92ID0gbmd4X2FycmF5X3B1c2goJnZlYyk7CisgICAgICAgICAgICBpZiAoaW92ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpb3YtPmlvdl9iYXNlID0gY2hhaW4tPmJ1Zi0+bGFzdDsKICAgICAgICAgICAgIGlvdi0+aW92X2xlbiA9IGNoYWluLT5idWYtPmVuZCAtIGNoYWluLT5idWYtPmxhc3Q7CiAgICAgICAgIH0KQEAgLTE3MSwxMiArMTkyLDEyIEBACiAgICAgfQogCiAgICAgbmd4X2xvZ19kZWJ1ZzIoTkdYX0xPR19ERUJVR19FVkVOVCwgYy0+bG9nLCAwLAotICAgICAgICAgICAgICAgICAgICJyZWFkdjogJWQ6JWQiLCBpby5uZWx0cywgaW92LT5pb3ZfbGVuKTsKKyAgICAgICAgICAgICAgICAgICAicmVhZHY6ICVkOiVkIiwgdmVjLm5lbHRzLCBpb3YtPmlvdl9sZW4pOwogCiAgICAgcmV2ID0gYy0+cmVhZDsKIAogICAgIGRvIHsKLSAgICAgICAgbiA9IHJlYWR2KGMtPmZkLCAoc3RydWN0IGlvdmVjICopIGlvLmVsdHMsIGlvLm5lbHRzKTsKKyAgICAgICAgbiA9IHJlYWR2KGMtPmZkLCAoc3RydWN0IGlvdmVjICopIHZlYy5lbHRzLCB2ZWMubmVsdHMpOwogCiAgICAgICAgIGlmIChuID09IDApIHsKICAgICAgICAgICAgIHJldi0+cmVhZHkgPSAwOwpkaWZmIC0tZ2l0IGEvc3JjL29zL3VuaXgvbmd4X3NldHByb2N0aXRsZS5jIGIvc3JjL29zL3VuaXgvbmd4X3NldHByb2N0aXRsZS5jCmluZGV4IDZjOTVjZGYuLjI1YmJjOWIgMTAwNjQ0Ci0tLSBhL3NyYy9vcy91bml4L25neF9zZXRwcm9jdGl0bGUuYworKysgYi9zcmMvb3MvdW5peC9uZ3hfc2V0cHJvY3RpdGxlLmMKQEAgLTQzLDcgKzQzLDggQEAKICAgICAgICAgc2l6ZSArPSBuZ3hfc3RybGVuKGVudmlyb25baV0pICsgMTsKICAgICB9CiAKLSAgICBpZiAoIShwID0gbmd4X2FsbG9jKHNpemUsIGxvZykpKSB7CisgICAgcCA9IG5neF9hbGxvYyhzaXplLCBsb2cpOworICAgIGlmIChwID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9vcy91bml4L25neF9zb2NrZXQuYyBiL3NyYy9vcy91bml4L25neF9zb2NrZXQuYwppbmRleCA1MjNmMWY0Li4xMjE5NTg5IDEwMDY0NAotLS0gYS9zcmMvb3MvdW5peC9uZ3hfc29ja2V0LmMKKysrIGIvc3JjL29zL3VuaXgvbmd4X3NvY2tldC5jCkBAIC0yMiw3ICsyMiw4IEBACiAKICNpZiAoTkdYX0hBVkVfRklPTkJJTykKIAotaW50IG5neF9ub25ibG9ja2luZyhuZ3hfc29ja2V0X3QgcykKK2ludAorbmd4X25vbmJsb2NraW5nKG5neF9zb2NrZXRfdCBzKQogewogICAgIHVfbG9uZyAgbmI7CiAKQEAgLTMyLDcgKzMzLDggQEAKIH0KIAogCi1pbnQgbmd4X2Jsb2NraW5nKG5neF9zb2NrZXRfdCBzKQoraW50CituZ3hfYmxvY2tpbmcobmd4X3NvY2tldF90IHMpCiB7CiAgICAgdV9sb25nICBuYjsKIApAQCAtNDYsNyArNDgsOCBAQAogCiAjaWYgKE5HWF9GUkVFQlNEKQogCi1pbnQgbmd4X3RjcF9ub3B1c2gobmd4X3NvY2tldF90IHMpCitpbnQKK25neF90Y3Bfbm9wdXNoKG5neF9zb2NrZXRfdCBzKQogewogICAgIGludCAgdGNwX25vcHVzaDsKIApAQCAtNTcsNyArNjAsOCBAQAogfQogCiAKLWludCBuZ3hfdGNwX3B1c2gobmd4X3NvY2tldF90IHMpCitpbnQKK25neF90Y3BfcHVzaChuZ3hfc29ja2V0X3QgcykKIHsKICAgICBpbnQgIHRjcF9ub3B1c2g7CiAKQEAgLTY5LDcgKzczLDggQEAKIAogI2VsaWYgKE5HWF9MSU5VWCkKIAotaW50IG5neF90Y3Bfbm9wdXNoKG5neF9zb2NrZXRfdCBzKQoraW50CituZ3hfdGNwX25vcHVzaChuZ3hfc29ja2V0X3QgcykKIHsKICAgICBpbnQgIGNvcms7CiAKQEAgLTc5LDcgKzg0LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAoY29uc3Qgdm9pZCAqKSAmY29yaywgc2l6ZW9mKGludCkpOwogfQogCi1pbnQgbmd4X3RjcF9wdXNoKG5neF9zb2NrZXRfdCBzKQoraW50CituZ3hfdGNwX3B1c2gobmd4X3NvY2tldF90IHMpCiB7CiAgICAgaW50ICBjb3JrOwogCkBAIC05MSwxNCArOTcsMTYgQEAKIAogI2Vsc2UKIAotaW50IG5neF90Y3Bfbm9wdXNoKG5neF9zb2NrZXRfdCBzKQoraW50CituZ3hfdGNwX25vcHVzaChuZ3hfc29ja2V0X3QgcykKIHsKLSAgICByZXR1cm4gTkdYX09LOworICAgIHJldHVybiAwOwogfQogCi1pbnQgbmd4X3RjcF9wdXNoKG5neF9zb2NrZXRfdCBzKQoraW50CituZ3hfdGNwX3B1c2gobmd4X3NvY2tldF90IHMpCiB7Ci0gICAgcmV0dXJuIE5HWF9PSzsKKyAgICByZXR1cm4gMDsKIH0KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvb3MvdW5peC9uZ3hfc29sYXJpc19zZW5kZmlsZXZfY2hhaW4uYyBiL3NyYy9vcy91bml4L25neF9zb2xhcmlzX3NlbmRmaWxldl9jaGFpbi5jCmluZGV4IGM1YjgxMjAuLjQzNDUzODUgMTAwNjQ0Ci0tLSBhL3NyYy9vcy91bml4L25neF9zb2xhcmlzX3NlbmRmaWxldl9jaGFpbi5jCisrKyBiL3NyYy9vcy91bml4L25neF9zb2xhcmlzX3NlbmRmaWxldl9jaGFpbi5jCkBAIC00Nyw3ICs0Nyw3IEBACiAgICAgc2VuZGZpbGV2ZWNfdCAgKnNmdiwgc2Z2c1tOR1hfU0VOREZJTEVWRUNTXTsKICAgICBuZ3hfYXJyYXlfdCAgICAgdmVjOwogICAgIG5neF9ldmVudF90ICAgICp3ZXY7Ci0gICAgbmd4X2NoYWluX3QgICAgKmNsLCAqdGFpbDsKKyAgICBuZ3hfY2hhaW5fdCAgICAqY2w7CiAKICAgICB3ZXYgPSBjLT53cml0ZTsKIApAQCAtMTA3LDcgKzEwNyw4IEBACiAgICAgICAgICAgICAgICAgICAgIHNmdi0+c2Z2X2xlbiArPSAoc2l6ZV90KSBzaXplOwogCiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCEoc2Z2ID0gbmd4X2FycmF5X3B1c2goJnZlYykpKSB7CisgICAgICAgICAgICAgICAgICAgIHNmdiA9IG5neF9hcnJheV9wdXNoKCZ2ZWMpOworICAgICAgICAgICAgICAgICAgICBpZiAoc2Z2ID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfQ0hBSU5fRVJST1I7CiAgICAgICAgICAgICAgICAgICAgIH0KIApAQCAtMTQwLDcgKzE0MSw4IEBACiAgICAgICAgICAgICAgICAgICAgIHNmdi0+c2Z2X2xlbiArPSAoc2l6ZV90KSBzaXplOwogCiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCEoc2Z2ID0gbmd4X2FycmF5X3B1c2goJnZlYykpKSB7CisgICAgICAgICAgICAgICAgICAgIHNmdiA9IG5neF9hcnJheV9wdXNoKCZ2ZWMpOworICAgICAgICAgICAgICAgICAgICBpZiAoc2Z2ID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfQ0hBSU5fRVJST1I7CiAgICAgICAgICAgICAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL29zL3VuaXgvbmd4X3dyaXRldl9jaGFpbi5jIGIvc3JjL29zL3VuaXgvbmd4X3dyaXRldl9jaGFpbi5jCmluZGV4IDljYmNkODYuLmVkM2FkNzEgMTAwNjQ0Ci0tLSBhL3NyYy9vcy91bml4L25neF93cml0ZXZfY2hhaW4uYworKysgYi9zcmMvb3MvdW5peC9uZ3hfd3JpdGV2X2NoYWluLmMKQEAgLTEyLDcgKzEyLDggQEAKICNkZWZpbmUgTkdYX0lPVlMgIDE2CiAKIAotbmd4X2NoYWluX3QgKm5neF93cml0ZXZfY2hhaW4obmd4X2Nvbm5lY3Rpb25fdCAqYywgbmd4X2NoYWluX3QgKmluLCBvZmZfdCBsaW1pdCkKK25neF9jaGFpbl90ICoKK25neF93cml0ZXZfY2hhaW4obmd4X2Nvbm5lY3Rpb25fdCAqYywgbmd4X2NoYWluX3QgKmluLCBvZmZfdCBsaW1pdCkKIHsKICAgICB1X2NoYXIgICAgICAgICpwcmV2OwogICAgIHNzaXplX3QgICAgICAgIG4sIHNpemUsIHNlbnQ7CkBAIC04OCw3ICs4OSw4IEBACiAgICAgICAgICAgICAgICAgaW92LT5pb3ZfbGVuICs9IHNpemU7CiAKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKCEoaW92ID0gbmd4X2FycmF5X3B1c2goJnZlYykpKSB7CisgICAgICAgICAgICAgICAgaW92ID0gbmd4X2FycmF5X3B1c2goJnZlYyk7CisgICAgICAgICAgICAgICAgaWYgKGlvdiA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfQ0hBSU5fRVJST1I7CiAgICAgICAgICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvb3Mvd2luMzIvbmd4X2FsbG9jLmMgYi9zcmMvb3Mvd2luMzIvbmd4X2FsbG9jLmMKaW5kZXggZTczYWEzMi4uYTNiY2EwMiAxMDA2NDQKLS0tIGEvc3JjL29zL3dpbjMyL25neF9hbGxvYy5jCisrKyBiL3NyYy9vcy93aW4zMi9uZ3hfYWxsb2MuYwpAQCAtMTUsNyArMTUsOCBAQAogewogICAgIHZvaWQgICpwOwogCi0gICAgaWYgKCEocCA9IG1hbGxvYyhzaXplKSkpIHsKKyAgICBwID0gbWFsbG9jKHNpemUpOworICAgIGlmIChwID09IE5VTEwpIHsKICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBsb2csIG5neF9lcnJubywKICAgICAgICAgICAgICAgICAgICAgICAibWFsbG9jKCkgJXV6IGJ5dGVzIGZhaWxlZCIsIHNpemUpOwogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9vcy93aW4zMi9uZ3hfZmlsZXMuYyBiL3NyYy9vcy93aW4zMi9uZ3hfZmlsZXMuYwppbmRleCBjZTBmZGM5Li5iZWE1ODBiIDEwMDY0NAotLS0gYS9zcmMvb3Mvd2luMzIvbmd4X2ZpbGVzLmMKKysrIGIvc3JjL29zL3dpbjMyL25neF9maWxlcy5jCkBAIC0xNzksNyArMTc5LDggQEAKICAgICBuZ3hfdWludF90ICAgICAgICAgIGNvbGxpc2lvbjsKICAgICBuZ3hfYXRvbWljX3VpbnRfdCAgIG51bTsKIAotICAgIGlmICghKG5hbWUgPSBuZ3hfcGFsbG9jKHBvb2wsIHRvLT5sZW4gKyAxICsgMTAgKyAxICsgc2l6ZW9mKCJERUxFVEUiKSkpKSB7CisgICAgbmFtZSA9IG5neF9wYWxsb2MocG9vbCwgdG8tPmxlbiArIDEgKyAxMCArIDEgKyBzaXplb2YoIkRFTEVURSIpKTsKKyAgICBpZiAobmFtZSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgfQogCkBAIC0zMDEsNiArMzAyLDIwIEBACiB9CiAKIAorbmd4X2ludF90CituZ3hfZGVfaW5mbyh1X2NoYXIgKm5hbWUsIG5neF9kaXJfdCAqZGlyKQoreworICAgIHJldHVybiBOR1hfT0s7Cit9CisKKworbmd4X2ludF90CituZ3hfZGVfbGlua19pbmZvKHVfY2hhciAqbmFtZSwgbmd4X2Rpcl90ICpkaXIpCit7CisgICAgcmV0dXJuIE5HWF9PSzsKK30KKworCiBuZ3hfaW50X3Qgbmd4X2ZpbGVfYXBwZW5kX21vZGUobmd4X2ZkX3QgZmQpCiB7CiAjaWYgMApkaWZmIC0tZ2l0IGEvc3JjL29zL3dpbjMyL25neF9maWxlcy5oIGIvc3JjL29zL3dpbjMyL25neF9maWxlcy5oCmluZGV4IDQ4YjU0YjMuLmE5MTc0MzEgMTAwNjQ0Ci0tLSBhL3NyYy9vcy93aW4zMi9uZ3hfZmlsZXMuaAorKysgYi9zcmMvb3Mvd2luMzIvbmd4X2ZpbGVzLmgKQEAgLTEzMiwxMCArMTMyLDEzIEBACiAKICNkZWZpbmUgbmd4X2RlX25hbWUoZGlyKSAgICAgICAgICAgICgodV9jaGFyICopIChkaXIpLT5mZC5jRmlsZU5hbWUpCiAjZGVmaW5lIG5neF9kZV9uYW1lbGVuKGRpcikgICAgICAgICBuZ3hfc3RybGVuKChkaXIpLT5mZC5jRmlsZU5hbWUpCi0jZGVmaW5lIG5neF9kZV9pbmZvKG5hbWUsIGRpcikgICAgICBOR1hfT0sKKworbmd4X2ludF90IG5neF9kZV9pbmZvKHVfY2hhciAqbmFtZSwgbmd4X2Rpcl90ICpkaXIpOwogI2RlZmluZSBuZ3hfZGVfaW5mb19uICAgICAgICAgICAgICAgImR1bW15KCkiCi0jZGVmaW5lIG5neF9kZV9saW5rX2luZm8obmFtZSwgZGlyKSBOR1hfT0sKKworbmd4X2ludF90IG5neF9kZV9saW5rX2luZm8odV9jaGFyICpuYW1lLCBuZ3hfZGlyX3QgKmRpcik7CiAjZGVmaW5lIG5neF9kZV9saW5rX2luZm9fbiAgICAgICAgICAiZHVtbXkoKSIKKwogI2RlZmluZSBuZ3hfZGVfaXNfZGlyKGRpcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICgoZGlyKS0+ZmQuZHdGaWxlQXR0cmlidXRlcyAmIEZJTEVfQVRUUklCVVRFX0RJUkVDVE9SWSkKICNkZWZpbmUgbmd4X2RlX2lzX2ZpbGUoZGlyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKZGlmZiAtLWdpdCBhL3NyYy9vcy93aW4zMi9uZ3hfcHJvY2Vzc19jeWNsZS5jIGIvc3JjL29zL3dpbjMyL25neF9wcm9jZXNzX2N5Y2xlLmMKaW5kZXggZTA2MzVhNS4uMjI1MWZmMiAxMDA2NDQKLS0tIGEvc3JjL29zL3dpbjMyL25neF9wcm9jZXNzX2N5Y2xlLmMKKysrIGIvc3JjL29zL3dpbjMyL25neF9wcm9jZXNzX2N5Y2xlLmMKQEAgLTIwNiw3ICsyMDYsNyBAQAogCiAgICAgY3ljbGUgPSAobmd4X2N5Y2xlX3QgKikgbmd4X2N5Y2xlOwogCi0gICAgZm9yICggOzsgKSB7CisgICAgd2hpbGUgKCFuZ3hfcXVpdCkgewogICAgICAgICBuZ3hfbG9nX2RlYnVnMChOR1hfTE9HX0RFQlVHX0VWRU5ULCBjeWNsZS0+bG9nLCAwLCAid29ya2VyIGN5Y2xlIik7CiAKICAgICAgICAgbmd4X3Byb2Nlc3NfZXZlbnRzKGN5Y2xlKTsKZGlmZiAtLWdpdCBhL3NyYy9vcy93aW4zMi9uZ3hfc29ja2V0LmMgYi9zcmMvb3Mvd2luMzIvbmd4X3NvY2tldC5jCmluZGV4IGZjNzc0MzMuLjc1OTBjMzMgMTAwNjQ0Ci0tLSBhL3NyYy9vcy93aW4zMi9uZ3hfc29ja2V0LmMKKysrIGIvc3JjL29zL3dpbjMyL25neF9zb2NrZXQuYwpAQCAtOCw3ICs4LDggQEAKICNpbmNsdWRlIDxuZ3hfY29yZS5oPgogCiAKLWludCBuZ3hfbm9uYmxvY2tpbmcobmd4X3NvY2tldF90IHMpCitpbnQKK25neF9ub25ibG9ja2luZyhuZ3hfc29ja2V0X3QgcykKIHsKICAgICB1bnNpZ25lZCBsb25nICBuYiA9IDE7CiAKQEAgLTE2LDkgKzE3LDE3IEBACiB9CiAKIAotaW50IG5neF9ibG9ja2luZyhuZ3hfc29ja2V0X3QgcykKK2ludAorbmd4X2Jsb2NraW5nKG5neF9zb2NrZXRfdCBzKQogewogICAgIHVuc2lnbmVkIGxvbmcgIG5iID0gMDsKIAogICAgIHJldHVybiBpb2N0bHNvY2tldChzLCBGSU9OQklPLCAmbmIpOwogfQorCisKK2ludAorbmd4X3RjcF9wdXNoKG5neF9zb2NrZXRfdCBzKQoreworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc3JjL29zL3dpbjMyL25neF9zb2NrZXQuaCBiL3NyYy9vcy93aW4zMi9uZ3hfc29ja2V0LmgKaW5kZXggODg3NTI4OC4uOTVlY2JlOCAxMDA2NDQKLS0tIGEvc3JjL29zL3dpbjMyL25neF9zb2NrZXQuaAorKysgYi9zcmMvb3Mvd2luMzIvbmd4X3NvY2tldC5oCkBAIC05OCwxMCArOTgsNyBAQAogZXh0ZXJuIExQRk5fVFJBTlNNSVRGSUxFICAgICAgICAgIHRyYW5zbWl0ZmlsZTsKIAogCi1zdGF0aWMgbmd4X2lubGluZSBpbnQgbmd4X3RjcF9wdXNoKG5neF9zb2NrZXRfdCBzKSB7Ci0gICAgIHJldHVybiAwOwotfQotCitpbnQgbmd4X3RjcF9wdXNoKG5neF9zb2NrZXRfdCBzKTsKICNkZWZpbmUgbmd4X3RjcF9wdXNoX24gICAgICAgICJ0Y3BfcHVzaCgpIgogCiAKZGlmZiAtLWdpdCBhL3NyYy9vcy93aW4zMi9uZ3hfdGhyZWFkLmMgYi9zcmMvb3Mvd2luMzIvbmd4X3RocmVhZC5jCmluZGV4IDhmYWUwZTMuLjA3MDNhYzcgMTAwNjQ0Ci0tLSBhL3NyYy9vcy93aW4zMi9uZ3hfdGhyZWFkLmMKKysrIGIvc3JjL29zL3dpbjMyL25neF90aHJlYWQuYwpAQCAtNjYsMyArNjYsMTkgQEAKIHsKICAgICByZXR1cm4gKG5neF9tdXRleF90ICopIDE7CiB9CisKKworLyogU1RVQiAqLworCituZ3hfaW50X3QKK25neF9tdXRleF9sb2NrKG5neF9tdXRleF90ICptKSB7CisgICAgcmV0dXJuIE5HWF9PSzsKK30KKworCituZ3hfaW50X3QKK25neF9tdXRleF90cnlsb2NrKG5neF9tdXRleF90ICptKSB7CisgICAgcmV0dXJuIE5HWF9PSzsKK30KKworLyoqLwpkaWZmIC0tZ2l0IGEvc3JjL29zL3dpbjMyL25neF90aHJlYWQuaCBiL3NyYy9vcy93aW4zMi9uZ3hfdGhyZWFkLmgKaW5kZXggNWIzYzRkYS4uYjU1ZGNjYSAxMDA2NDQKLS0tIGEvc3JjL29zL3dpbjMyL25neF90aHJlYWQuaAorKysgYi9zcmMvb3Mvd2luMzIvbmd4X3RocmVhZC5oCkBAIC0yMiw4ICsyMiw4IEBACiB9IG5neF9tdXRleF90OwogCiAKLW5neF9lcnJfdCBuZ3hfY3JlYXRlX3RocmVhZChuZ3hfdGlkX3QgKnRpZCwgdm9pZCogKCpmdW5jKSh2b2lkICphcmcpLCB2b2lkICphcmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2xvZ190ICpsb2cpOworbmd4X2Vycl90IG5neF9jcmVhdGVfdGhyZWFkKG5neF90aWRfdCAqdGlkLCB2b2lkKiAoKmZ1bmMpKHZvaWQgKmFyZyksCisgICAgdm9pZCAqYXJnLCBuZ3hfbG9nX3QgKmxvZyk7CiBuZ3hfaW50X3Qgbmd4X2luaXRfdGhyZWFkcyhpbnQgbiwgc2l6ZV90IHNpemUsIG5neF9jeWNsZV90ICpjeWNsZSk7CiAKIG5neF9lcnJfdCBuZ3hfdGhyZWFkX2tleV9jcmVhdGUobmd4X3Rsc19rZXlfdCAqa2V5KTsKQEAgLTQxLDE0ICs0MSwxNSBAQAogCiBuZ3hfbXV0ZXhfdCAqbmd4X211dGV4X2luaXQobmd4X2xvZ190ICpsb2csIG5neF91aW50X3QgZmxhZ3MpOwogCituZ3hfaW50X3Qgbmd4X211dGV4X2xvY2sobmd4X211dGV4X3QgKm0pOworbmd4X2ludF90IG5neF9tdXRleF90cnlsb2NrKG5neF9tdXRleF90ICptKTsKKwogCiAvKiBTVFVCICovCiAjZGVmaW5lIE5HWF9NVVRFWF9MSUdIVCAgICAgICAgICAgICAwCiAKLSNkZWZpbmUgbmd4X211dGV4X2xvY2sobSkgICAgICAgICAgIE5HWF9PSwotI2RlZmluZSBuZ3hfbXV0ZXhfdHJ5bG9jayhtKSAgICAgICAgTkdYX09LCiAjZGVmaW5lIG5neF9tdXRleF91bmxvY2sobSkKLS8qICovCisvKiovCiAKIAogZXh0ZXJuIG5neF9pbnRfdCAgbmd4X3RocmVhZHNfbjsKZGlmZiAtLWdpdCBhL3NyYy9vcy93aW4zMi9uZ3hfd2luMzJfY29uZmlnLmggYi9zcmMvb3Mvd2luMzIvbmd4X3dpbjMyX2NvbmZpZy5oCmluZGV4IDM2YWYyMzkuLjAyZDRkYjUgMTAwNjQ0Ci0tLSBhL3NyYy9vcy93aW4zMi9uZ3hfd2luMzJfY29uZmlnLmgKKysrIGIvc3JjL29zL3dpbjMyL25neF93aW4zMl9jb25maWcuaApAQCAtMzcsNyArMzcsNiBAQAogCiAjcHJhZ21hIHdhcm5pbmcoZGVmYXVsdDo0MjAxKQogCi0KIC8qIGRpc2FibGUgc29tZSAiLVc0IiBsZXZlbCB3YXJuaW5ncyAqLwogCiAvKiAndHlwZSBjYXN0JzogZnJvbSBmdW5jdGlvbiBwb2ludGVyIHRvIGRhdGEgcG9pbnRlciAqLwpAQCAtNDksMTQgKzQ4LDEzIEBACiAvKiB1bnJlZmVyZW5jZWQgZm9ybWFsIHBhcmFtZXRlciAqLwogI3ByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDEwMCkKIAotLyogY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBpcyBjb25zdGFudCAqLworLyogRkRfU0VUKCkgYW5kIEZEX0NMUigpOiBjb25kaXRpb25hbCBleHByZXNzaW9uIGlzIGNvbnN0YW50ICovCiAjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0MTI3KQogCi0vKiB1bnJlYWNoYWJsZSBjb2RlICovCi0jcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0NzAyKQotCisjaWYgMAogLyogYXNzaWdubWVudCB3aXRoaW4gY29uZGl0aW9uYWwgZXhwcmVzc2lvbiAqLwogI3ByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDcwNikKKyNlbmRpZgogCiAvKiBmdW5jdGlvbiAnbmd4X2hhbmRsZV93cml0ZV9ldmVudCcgbm90IGlubGluZWQgKi8KICNwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQ3MTApCkBAIC02Niw5ICs2NCw2IEBACiAKICNpZmRlZiBfX1dBVENPTUNfXwogCi0vKiB1bnJlYWNoYWJsZSBjb2RlICovCi0jcHJhZ21hIGRpc2FibGVfbWVzc2FnZSgyMDEpCi0KIC8qIHN5bWJvbCAnbmd4X3JidHJlZV9taW4nIGhhcyBiZWVuIGRlZmluZWQsIGJ1dCBub3QgcmVmZXJlbmNlZCAqLwogI3ByYWdtYSBkaXNhYmxlX21lc3NhZ2UoMjAyKQogCkBAIC04MCwyNSArNzUsMTYgQEAKIC8qIHRoZSBlbmQgb2YgdGhlIHByZWNvbXBpbGVkIGhlYWRlcnMgKi8KICNwcmFnbWEgaGRyc3RvcAogCi0vKgotICogJ2ZkJyBpcyBhc3NpZ25lZCBhIHZhbHVlIHRoYXQgaXMgbmV2ZXIgdXNlZCBpbiBmdW5jdGlvbiBuZ3hfZXZlbnRfaW5pdF9jb25mCi0gKi8KLSNwcmFnbWEgd2FybiAtODAwNAotCi0vKiBjb25kaXRpb24gaXMgYWx3YXlzIGZhbHNlICovCi0jcHJhZ21hIHdhcm4gLTgwMDgKLQogLyogZnVuY3Rpb25zIGNvbnRhaW5pbmcgKGZvcnx3aGlsZXxzb21lIGlmKSBhcmUgbm90IGV4cGFuZGVkIGlubGluZSAqLwogI3ByYWdtYSB3YXJuIC04MDI3CiAKIC8qIHVucmVmZXJlbmNlZCBmb3JtYWwgcGFyYW1ldGVyICovCiAjcHJhZ21hIHdhcm4gLTgwNTcKIAorI2lmIDAKIC8qIGFzc2lnbm1lbnQgd2l0aGluIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gKi8KICNwcmFnbWEgd2FybiAtODA2MAotCi0vKiB1bnJlYWNoYWJsZSBjb2RlICovCi0jcHJhZ21hIHdhcm4gLTgwNjYKKyNlbmRpZgogCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvc3JjL29zL3dpbjMyL25neF93c2FyZWN2X2NoYWluLmMgYi9zcmMvb3Mvd2luMzIvbmd4X3dzYXJlY3ZfY2hhaW4uYwppbmRleCAyZTJmN2NjLi5jMjJhMDhkIDEwMDY0NAotLS0gYS9zcmMvb3Mvd2luMzIvbmd4X3dzYXJlY3ZfY2hhaW4uYworKysgYi9zcmMvb3Mvd2luMzIvbmd4X3dzYXJlY3ZfY2hhaW4uYwpAQCAtOSwxNiArOSwyMSBAQAogI2luY2x1ZGUgPG5neF9ldmVudC5oPgogCiAKLXNzaXplX3Qgbmd4X3dzYXJlY3ZfY2hhaW4obmd4X2Nvbm5lY3Rpb25fdCAqYywgbmd4X2NoYWluX3QgKmNoYWluKQorI2RlZmluZSBOR1hfV1NBQlVGUyAgOCAKKworCitzc2l6ZV90CituZ3hfd3NhcmVjdl9jaGFpbihuZ3hfY29ubmVjdGlvbl90ICpjLCBuZ3hfY2hhaW5fdCAqY2hhaW4pCiB7CiAgICAgaW50ICAgICAgICAgICByYzsKICAgICB1X2NoYXIgICAgICAgKnByZXY7CiAgICAgdV9sb25nICAgICAgICBieXRlcywgZmxhZ3M7CiAgICAgc2l6ZV90ICAgICAgICBzaXplOwotICAgIFdTQUJVRiAgICAgICAqd3NhYnVmOwogICAgIG5neF9lcnJfdCAgICAgZXJyOwotICAgIG5neF9hcnJheV90ICAgaW87CisgICAgbmd4X2FycmF5X3QgICB2ZWM7CiAgICAgbmd4X2V2ZW50X3QgICpyZXY7CisgICAgTFBXU0FCVUYgICAgICB3c2FidWY7CisgICAgV1NBQlVGICAgICAgICB3c2FidWZzW05HWF9XU0FCVUZTXTsKIAogICAgIHByZXYgPSBOVUxMOwogICAgIHdzYWJ1ZiA9IE5VTEw7CkBAIC0yNiw3ICszMSwxMSBAQAogICAgIHNpemUgPSAwOwogICAgIGJ5dGVzID0gMDsKIAotICAgIG5neF9pbml0X2FycmF5KGlvLCBjLT5wb29sLCAxMCwgc2l6ZW9mKFdTQUJVRiksIE5HWF9FUlJPUik7CisgICAgdmVjLmVsdHMgPSB3c2FidWZzOworICAgIHZlYy5uZWx0cyA9IDA7CisgICAgdmVjLnNpemUgPSBzaXplb2YoV1NBQlVGKTsKKyAgICB2ZWMubmFsbG9jID0gTkdYX1dTQUJVRlM7IAorICAgIHZlYy5wb29sID0gYy0+cG9vbDsKIAogICAgIC8qIGNvYWxlc2NlIHRoZSBuZWlnaGJvdXJpbmcgYnVmcyAqLwogCkBAIC0zNSw3ICs0NCwxMSBAQAogICAgICAgICAgICAgd3NhYnVmLT5sZW4gKz0gY2hhaW4tPmJ1Zi0+ZW5kIC0gY2hhaW4tPmJ1Zi0+bGFzdDsKIAogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbmd4X3Rlc3RfbnVsbCh3c2FidWYsIG5neF9wdXNoX2FycmF5KCZpbyksIE5HWF9FUlJPUik7CisgICAgICAgICAgICB3c2FidWYgPSBuZ3hfYXJyYXlfcHVzaCgmdmVjKTsKKyAgICAgICAgICAgIGlmICh3c2FidWYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIHdzYWJ1Zi0+YnVmID0gKGNoYXIgKikgY2hhaW4tPmJ1Zi0+bGFzdDsKICAgICAgICAgICAgIHdzYWJ1Zi0+bGVuID0gY2hhaW4tPmJ1Zi0+ZW5kIC0gY2hhaW4tPmJ1Zi0+bGFzdDsKICAgICAgICAgfQpAQCAtNDYsMTAgKzU5LDEwIEBACiAgICAgfQogCiAgICAgbmd4X2xvZ19kZWJ1ZzIoTkdYX0xPR19ERUJVR19FVkVOVCwgYy0+bG9nLCAwLAotICAgICAgICAgICAgICAgICAgICJXU0FSZWN2OiAlZDolZCIsIGlvLm5lbHRzLCB3c2FidWYtPmxlbik7CisgICAgICAgICAgICAgICAgICAgIldTQVJlY3Y6ICVkOiVkIiwgdmVjLm5lbHRzLCB3c2FidWYtPmxlbik7CiAKIAotICAgIHJjID0gV1NBUmVjdihjLT5mZCwgaW8uZWx0cywgaW8ubmVsdHMsICZieXRlcywgJmZsYWdzLCBOVUxMLCBOVUxMKTsKKyAgICByYyA9IFdTQVJlY3YoYy0+ZmQsIHZlYy5lbHRzLCB2ZWMubmVsdHMsICZieXRlcywgJmZsYWdzLCBOVUxMLCBOVUxMKTsKIAogICAgIHJldiA9IGMtPnJlYWQ7CiAKZGlmZiAtLWdpdCBhL3NyYy9vcy93aW4zMi9uZ3hfd3Nhc2VuZF9jaGFpbi5jIGIvc3JjL29zL3dpbjMyL25neF93c2FzZW5kX2NoYWluLmMKaW5kZXggZDViMTMzNC4uYmMzYjAxNSAxMDA2NDQKLS0tIGEvc3JjL29zL3dpbjMyL25neF93c2FzZW5kX2NoYWluLmMKKysrIGIvc3JjL29zL3dpbjMyL25neF93c2FzZW5kX2NoYWluLmMKQEAgLTEyLDggKzEyLDggQEAKICNkZWZpbmUgTkdYX1dTQUJVRlMgIDgKIAogCi1uZ3hfY2hhaW5fdCAqbmd4X3dzYXNlbmRfY2hhaW4obmd4X2Nvbm5lY3Rpb25fdCAqYywgbmd4X2NoYWluX3QgKmluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZl90IGxpbWl0KQorbmd4X2NoYWluX3QgKgorbmd4X3dzYXNlbmRfY2hhaW4obmd4X2Nvbm5lY3Rpb25fdCAqYywgbmd4X2NoYWluX3QgKmluLCBvZmZfdCBsaW1pdCkKIHsKICAgICBpbnQgICAgICAgICAgIHJjOwogICAgIHVfY2hhciAgICAgICAqcHJldjsKQEAgLTIyLDkgKzIyLDkgQEAKICAgICBuZ3hfZXJyX3QgICAgIGVycjsKICAgICBuZ3hfZXZlbnRfdCAgKndldjsKICAgICBuZ3hfYXJyYXlfdCAgIHZlYzsKKyAgICBuZ3hfY2hhaW5fdCAgKmNsOwogICAgIExQV1NBQlVGICAgICAgd3NhYnVmOwogICAgIFdTQUJVRiAgICAgICAgd3NhYnVmc1tOR1hfV1NBQlVGU107Ci0gICAgbmd4X2NoYWluX3QgICpjbDsKIAogICAgIHdldiA9IGMtPndyaXRlOwogCkBAIC03OCw3ICs3OCw4IEBACiAgICAgICAgICAgICAgICAgd3NhYnVmLT5sZW4gKz0gY2wtPmJ1Zi0+bGFzdCAtIGNsLT5idWYtPnBvczsKIAogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoISh3c2FidWYgPSBuZ3hfYXJyYXlfcHVzaCgmdmVjKSkpIHsKKyAgICAgICAgICAgICAgICB3c2FidWYgPSBuZ3hfYXJyYXlfcHVzaCgmdmVjKTsKKyAgICAgICAgICAgICAgICBpZiAod3NhYnVmID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9DSEFJTl9FUlJPUjsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTE1NCwxOCArMTU1LDE4IEBACiB9CiAKIAotbmd4X2NoYWluX3QgKm5neF9vdmVybGFwcGVkX3dzYXNlbmRfY2hhaW4obmd4X2Nvbm5lY3Rpb25fdCAqYywgbmd4X2NoYWluX3QgKmluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmX3QgbGltaXQpCituZ3hfY2hhaW5fdCAqCituZ3hfb3ZlcmxhcHBlZF93c2FzZW5kX2NoYWluKG5neF9jb25uZWN0aW9uX3QgKmMsIG5neF9jaGFpbl90ICppbiwgb2ZmX3QgbGltaXQpCiB7CiAgICAgaW50ICAgICAgICAgICAgICAgcmM7CiAgICAgdV9jaGFyICAgICAgICAgICAqcHJldjsKICAgICB1X2xvbmcgICAgICAgICAgICBzaXplLCBzZW5kLCBzZW50OwotICAgIExQV1NBQlVGICAgICAgICAgIHdzYWJ1ZjsKICAgICBuZ3hfZXJyX3QgICAgICAgICBlcnI7CiAgICAgbmd4X2V2ZW50X3QgICAgICAqd2V2OwogICAgIG5neF9hcnJheV90ICAgICAgIHZlYzsKICAgICBuZ3hfY2hhaW5fdCAgICAgICpjbDsKICAgICBMUFdTQU9WRVJMQVBQRUQgICBvdmxwOworICAgIExQV1NBQlVGICAgICAgICAgIHdzYWJ1ZjsKICAgICBXU0FCVUYgICAgICAgICAgICB3c2FidWZzW05HWF9XU0FCVUZTXTsKIAogICAgIHdldiA9IGMtPndyaXRlOwpAQCAtMjIyLDcgKzIyMyw4IEBACiAgICAgICAgICAgICAgICAgd3NhYnVmLT5sZW4gKz0gY2wtPmJ1Zi0+bGFzdCAtIGNsLT5idWYtPnBvczsKIAogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoISh3c2FidWYgPSBuZ3hfYXJyYXlfcHVzaCgmdmVjKSkpIHsKKyAgICAgICAgICAgICAgICB3c2FidWYgPSBuZ3hfYXJyYXlfcHVzaCgmdmVjKTsKKyAgICAgICAgICAgICAgICBpZiAod3NhYnVmID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9DSEFJTl9FUlJPUjsKICAgICAgICAgICAgICAgICB9CiAK