ZGlmZiAtLWdpdCBhL2F1dG8vY2MvZ2NjIGIvYXV0by9jYy9nY2MKaW5kZXggOWUwZTUyZC4uNWM1ZjYxYyAxMDA2NDQKLS0tIGEvYXV0by9jYy9nY2MKKysrIGIvYXV0by9jYy9nY2MKQEAgLTU4LDI2ICs1OCwzMSBAQAogICAgIHBlbnRpdW0pCiAgICAgICAgICMgb3B0aW1pemUgZm9yIFBlbnRpdW0gYW5kIEF0aGxvbgogICAgICAgICBDUFVfT1BUPSItbWFyY2g9cGVudGl1bSIKKyAgICAgICAgTkdYX0NQVV9DQUNIRV9MSU5FPTMyCiAgICAgOzsKIAogICAgIHBlbnRpdW1wcm8gfCBwZW50aXVtMykKICAgICAgICAgIyBvcHRpbWl6ZSBmb3IgUGVudGl1bSBQcm8sIFBlbnRpdW0gSUkgYW5kIFBlbnRpdW0gSUlJCiAgICAgICAgIENQVV9PUFQ9Ii1tYXJjaD1wZW50aXVtcHJvIgorICAgICAgICBOR1hfQ1BVX0NBQ0hFX0xJTkU9MzIKICAgICA7OwogCiAgICAgcGVudGl1bTQpCiAgICAgICAgICMgb3B0aW1pemUgZm9yIFBlbnRpdW0gNCwgZ2NjIDMueAogICAgICAgICBDUFVfT1BUPSItbWFyY2g9cGVudGl1bTQiCisgICAgICAgIE5HWF9DUFVfQ0FDSEVfTElORT0xMjgKICAgICA7OwogCiAgICAgYXRobG9uKQogICAgICAgICAjIG9wdGltaXplIGZvciBBdGhsb24sIGdjYyAzLngKICAgICAgICAgQ1BVX09QVD0iLW1hcmNoPWF0aGxvbiIKKyAgICAgICAgTkdYX0NQVV9DQUNIRV9MSU5FPTY0CiAgICAgOzsKIAogICAgIG9wdGVyb24pCiAgICAgICAgICMgb3B0aW1pemUgZm9yIE9wdGVyb24sIGdjYyAzLngKICAgICAgICAgQ1BVX09QVD0iLW1hcmNoPW9wdGVyb24iCisgICAgICAgIE5HWF9DUFVfQ0FDSEVfTElORT02NAogICAgIDs7CiAKICAgICBzcGFyYzMyKQpAQCAtODUsNiArOTAsNyBAQAogICAgICAgICBDUFVfT1BUPSItbTMyIgogICAgICAgICBDT1JFX0xJTks9IiRDT1JFX0xJTksgLW0zMiIKICAgICAgICAgQ0NfQVVYX0ZMQUdTPSIkQ0NfQVVYX0ZMQUdTIC1tMzIiCisgICAgICAgIE5HWF9DUFVfQ0FDSEVfTElORT02NAogICAgIDs7CiAKICAgICBzcGFyYzY0KQpAQCAtOTIsNiArOTgsNyBAQAogICAgICAgICBDUFVfT1BUPSItbTY0IgogICAgICAgICBDT1JFX0xJTks9IiRDT1JFX0xJTksgLW02NCIKICAgICAgICAgQ0NfQVVYX0ZMQUdTPSIkQ0NfQVVYX0ZMQUdTIC1tNjQiCisgICAgICAgIE5HWF9DUFVfQ0FDSEVfTElORT02NAogICAgIDs7CiAKIGVzYWMKZGlmZiAtLWdpdCBhL2F1dG8vY2MvaWNjIGIvYXV0by9jYy9pY2MKaW5kZXggMTZjYjJiYi4uMWE0MTExYiAxMDA2NDQKLS0tIGEvYXV0by9jYy9pY2MKKysrIGIvYXV0by9jYy9pY2MKQEAgLTIsNyArMiw3IEBACiAjIENvcHlyaWdodCAoQykgSWdvciBTeXNvZXYKIAogCi0jIEludGVsIEMrKyBjb21waWxlciA3LjEsIDguMCwgOC4xCisjIEludGVsIEMrKyBjb21waWxlciA3LjEsIDguMCwgOC4xLCA5LjAKIAogTkdYX0lDQ19WRVI9YCRDQyAtViAyPiYxIHwgZ3JlcCAnVmVyc2lvbicgMj4mMSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzZWQgLWUgJ3MvXi4qIFZlcnNpb24gXCguKlwpICAgQnVpbGQuKiQvXDEvJ2AKZGlmZiAtLWdpdCBhL2F1dG8vbW9kdWxlcyBiL2F1dG8vbW9kdWxlcwppbmRleCA1OTQwYjI4Li4zOTIwOTRlIDEwMDY0NAotLS0gYS9hdXRvL21vZHVsZXMKKysrIGIvYXV0by9tb2R1bGVzCkBAIC0xNjAsNiArMTYwLDEyIEBACiAgICAgSFRUUF9TUkNTPSIkSFRUUF9TUkNTICRIVFRQX0dFT19TUkNTIgogZmkKIAoraWYgWyAkSFRUUF9NQVAgPSBZRVMgXTsgdGhlbgorICAgIGhhdmU9TkdYX0hUVFBfTUFQIC4gYXV0by9oYXZlCisgICAgSFRUUF9NT0RVTEVTPSIkSFRUUF9NT0RVTEVTICRIVFRQX01BUF9NT0RVTEUiCisgICAgSFRUUF9TUkNTPSIkSFRUUF9TUkNTICRIVFRQX01BUF9TUkNTIgorZmkKKwogaWYgWyAkSFRUUF9SRUZFUkVSID0gWUVTIF07IHRoZW4KICAgICBIVFRQX01PRFVMRVM9IiRIVFRQX01PRFVMRVMgJEhUVFBfUkVGRVJFUl9NT0RVTEUiCiAgICAgSFRUUF9TUkNTPSIkSFRUUF9TUkNTICRIVFRQX1JFRkVSRVJfU1JDUyIKZGlmZiAtLWdpdCBhL2F1dG8vb3B0aW9ucyBiL2F1dG8vb3B0aW9ucwppbmRleCA2YzI0OWIxLi5kYTAwZWRmIDEwMDY0NAotLS0gYS9hdXRvL29wdGlvbnMKKysrIGIvYXV0by9vcHRpb25zCkBAIC01Nyw2ICs1Nyw3IEBACiBIVFRQX0FVVE9JTkRFWD1ZRVMKIEhUVFBfU1RBVFVTPU5PCiBIVFRQX0dFTz1ZRVMKK0hUVFBfTUFQPVlFUwogSFRUUF9SRUZFUkVSPVlFUwogSFRUUF9SRVdSSVRFPVlFUwogSFRUUF9QUk9YWT1ZRVMKQEAgLTg5LDYgKzkwLDggQEAKIFpMSUJfT1BUPQogWkxJQl9BU009Tk8KIAorTkdYX0NQVV9DQUNIRV9MSU5FPQorCiAKIGZvciBvcHRpb24KIGRvCkBAIC0xMzksNiArMTQyLDcgQEAKICAgICAgICAgLS13aXRob3V0LWh0dHBfYXV0b2luZGV4X21vZHVsZSkgSFRUUF9BVVRPSU5ERVg9Tk8gICAgICAgICAgOzsKICAgICAgICAgLS13aXRob3V0LWh0dHBfc3RhdHVzX21vZHVsZSkgICAgSFRUUF9TVEFUVVM9Tk8gICAgICAgICAgICAgOzsKICAgICAgICAgLS13aXRob3V0LWh0dHBfZ2VvX21vZHVsZSkgICAgICAgSFRUUF9HRU89Tk8gICAgICAgICAgICAgICAgOzsKKyAgICAgICAgLS13aXRob3V0LWh0dHBfbWFwX21vZHVsZSkgICAgICAgSFRUUF9NQVA9Tk8gICAgICAgICAgICAgICAgOzsKICAgICAgICAgLS13aXRob3V0LWh0dHBfcmVmZXJlcl9tb2R1bGUpICAgSFRUUF9SRUZFUkVSPU5PICAgICAgICAgICAgOzsKICAgICAgICAgLS13aXRob3V0LWh0dHBfcmV3cml0ZV9tb2R1bGUpICAgSFRUUF9SRVdSSVRFPU5PICAgICAgICAgICAgOzsKICAgICAgICAgLS13aXRob3V0LWh0dHBfcHJveHlfbW9kdWxlKSAgICAgSFRUUF9QUk9YWT1OTyAgICAgICAgICAgICAgOzsKZGlmZiAtLWdpdCBhL2F1dG8vb3MvY29uZiBiL2F1dG8vb3MvY29uZgppbmRleCBmNGJhMzg4Li4wZGRiYWNiIDEwMDY0NAotLS0gYS9hdXRvL29zL2NvbmYKKysrIGIvYXV0by9vcy9jb25mCkBAIC01OSwxMiArNTksMzYgQEAKIAogY2FzZSAiJE5HWF9NQUNISU5FIiBpbgogCi0gICAgaTM4NiB8IGk2ODYgfCBpODZwYyB8IGFtZDY0KQorICAgIGkzODYgfCBpNjg2IHwgaTg2cGMpCiAgICAgICAgIGhhdmU9TkdYX0hBVkVfTk9OQUxJR05FRCAuIGF1dG8vaGF2ZQorICAgICAgICBOR1hfTUFDSF9DQUNIRV9MSU5FPTMyCiAgICAgOzsKIAotICAgIHN1bjR1IHwgc3BhcmMgfCBzcGFyYzY0IHwgaWE2NCApCisgICAgYW1kNjQpCisgICAgICAgIGhhdmU9TkdYX0hBVkVfTk9OQUxJR05FRCAuIGF1dG8vaGF2ZQorICAgICAgICBOR1hfTUFDSF9DQUNIRV9MSU5FPTY0CisgICAgOzsKKworICAgIHN1bjR1IHwgc3BhcmMgfCBzcGFyYzY0KQogICAgICAgICBoYXZlPU5HWF9BTElHTk1FTlQgdmFsdWU9MTYgLiBhdXRvL2RlZmluZQorICAgICAgICAjIFRPRE8KKyAgICAgICAgTkdYX01BQ0hfQ0FDSEVfTElORT02NAorICAgIDs7CisKKyAgICBpYTY0ICkKKyAgICAgICAgaGF2ZT1OR1hfQUxJR05NRU5UIHZhbHVlPTE2IC4gYXV0by9kZWZpbmUKKyAgICAgICAgIyBUT0RPCisgICAgICAgIE5HWF9NQUNIX0NBQ0hFX0xJTkU9NjQKKyAgICA7OworCisgICAgKikKKyAgICAgICAgTkdYX01BQ0hfQ0FDSEVfTElORT0zMgogICAgIDs7CiAKIGVzYWMKKworaWYgdGVzdCAteiAiJE5HWF9DUFVfQ0FDSEVfTElORSI7IHRoZW4KKyAgICBOR1hfQ1BVX0NBQ0hFX0xJTkU9JE5HWF9NQUNIX0NBQ0hFX0xJTkUKK2ZpCisKK2hhdmU9TkdYX0NQVV9DQUNIRV9MSU5FIHZhbHVlPSROR1hfQ1BVX0NBQ0hFX0xJTkUgLiBhdXRvL2RlZmluZQpkaWZmIC0tZ2l0IGEvYXV0by9zb3VyY2VzIGIvYXV0by9zb3VyY2VzCmluZGV4IDBiOTI0NWQuLmI1OTgwODMgMTAwNjQ0Ci0tLSBhL2F1dG8vc291cmNlcworKysgYi9hdXRvL3NvdXJjZXMKQEAgLTMzNCw2ICszMzQsMTAgQEAKIEhUVFBfR0VPX1NSQ1M9c3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9nZW9fbW9kdWxlLmMKIAogCitIVFRQX01BUF9NT0RVTEU9bmd4X2h0dHBfbWFwX21vZHVsZQorSFRUUF9NQVBfU1JDUz1zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX21hcF9tb2R1bGUuYworCisKIEhUVFBfUkVGRVJFUl9NT0RVTEU9bmd4X2h0dHBfcmVmZXJlcl9tb2R1bGUKIEhUVFBfUkVGRVJFUl9TUkNTPXNyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfcmVmZXJlcl9tb2R1bGUuYwogCmRpZmYgLS1naXQgYS9jb25mL21pbWUudHlwZXMgYi9jb25mL21pbWUudHlwZXMKaW5kZXggMDc5ODc0ZS4uZTE3YzNkMSAxMDA2NDQKLS0tIGEvY29uZi9taW1lLnR5cGVzCisrKyBiL2NvbmYvbWltZS50eXBlcwpAQCAtMSwxNCArMSwxNiBAQAogCiB0eXBlcyB7Ci0gICAgdGV4dC9jc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3M7CiAgICAgdGV4dC9odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodG1sIGh0bSBzaHRtbDsKLSAgICB0ZXh0L3BsYWluICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4dDsKKyAgICB0ZXh0L2NzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzczsKICAgICB0ZXh0L3htbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbCByc3M7CisgICAgaW1hZ2UvZ2lmICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaWY7CisgICAgaW1hZ2UvanBlZyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqcGVnIGpwZzsKKyAgICBhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQgICAgICAgICAgICAgIGpzOworCisgICAgdGV4dC9wbGFpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eHQ7CiAgICAgdGV4dC94LWNvbXBvbmVudCAgICAgICAgICAgICAgICAgICAgICBodGM7CiAgICAgdGV4dC9tYXRobWwgICAgICAgICAgICAgICAgICAgICAgICAgICBtbWw7CiAKLSAgICBpbWFnZS9naWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpZjsKLSAgICBpbWFnZS9qcGVnICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpwZWcganBnOwogICAgIGltYWdlL3BuZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG5nOwogICAgIGltYWdlL3gtaWNvbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvOwogICAgIGltYWdlL3gtam5nICAgICAgICAgICAgICAgICAgICAgICAgICAgam5nOwpAQCAtMTcsNyArMTksNiBAQAogICAgIGFwcGxpY2F0aW9uL21hYy1iaW5oZXg0MCAgICAgICAgICAgICAgaHF4OwogICAgIGFwcGxpY2F0aW9uL3BkZiAgICAgICAgICAgICAgICAgICAgICAgcGRmOwogICAgIGFwcGxpY2F0aW9uL3gtY29jb2EgICAgICAgICAgICAgICAgICAgY2NvOwotICAgIGFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCAgICAgICAgICAgICAganM7CiAgICAgYXBwbGljYXRpb24veC1qYXZhLWFyY2hpdmUtZGlmZiAgICAgICBqYXJkaWZmOwogICAgIGFwcGxpY2F0aW9uL3gtamF2YS1qbmxwLWZpbGUgICAgICAgICAgam5scDsKICAgICBhcHBsaWNhdGlvbi94LW1ha2VzZWxmICAgICAgICAgICAgICAgIHJ1bjsKZGlmZiAtLWdpdCBhL2RvY3MveG1sL25naW54L2NoYW5nZXMueG1sIGIvZG9jcy94bWwvbmdpbngvY2hhbmdlcy54bWwKaW5kZXggZDE4NDlhMi4uMDY2YjVhNSAxMDA2NDQKLS0tIGEvZG9jcy94bWwvbmdpbngvY2hhbmdlcy54bWwKKysrIGIvZG9jcy94bWwvbmdpbngvY2hhbmdlcy54bWwKQEAgLTksNiArOSw5MiBAQAogPHRpdGxlIGxhbmc9ImVuIj5uZ2lueCBjaGFuZ2Vsb2c8L3RpdGxlPgogCiAKKzxjaGFuZ2VzIHZlcj0iMC4zLjE2IiBkYXRlPSIxNi4xMi4yMDA1Ij4KKworPGNoYW5nZSB0eXBlPSJmZWF0dXJlIj4KKzxwYXJhIGxhbmc9InJ1Ij4KK83PxNXM2CBuZ3hfaHR0cF9tYXBfbW9kdWxlLgorPC9wYXJhPgorPHBhcmEgbGFuZz0iZW4iPgordGhlIG5neF9odHRwX21hcF9tb2R1bGUuCis8L3BhcmE+Cis8L2NoYW5nZT4KKworPGNoYW5nZSB0eXBlPSJmZWF0dXJlIj4KKzxwYXJhIGxhbmc9InJ1Ij4KK8TJ0sXL1MnX2SB0eXBlc19oYXNoX21heF9zaXplIMkgdHlwZXNfaGFzaF9idWNrZXRfc2l6ZS4KKzwvcGFyYT4KKzxwYXJhIGxhbmc9ImVuIj4KK3RoZSAidHlwZXNfaGFzaF9tYXhfc2l6ZSIgYW5kICJ0eXBlc19oYXNoX2J1Y2tldF9zaXplIiBkaXJlY3RpdmVzLgorPC9wYXJhPgorPC9jaGFuZ2U+CisKKzxjaGFuZ2UgdHlwZT0iZmVhdHVyZSI+Cis8cGFyYSBsYW5nPSJydSI+CivEydLFy9TJ18Egc3NpX3ZhbHVlX2xlbmd0aC4KKzwvcGFyYT4KKzxwYXJhIGxhbmc9ImVuIj4KK3RoZSAic3NpX3ZhbHVlX2xlbmd0aCIgZGlyZWN0aXZlLgorPC9wYXJhPgorPC9jaGFuZ2U+CisKKzxjaGFuZ2UgdHlwZT0iZmVhdHVyZSI+Cis8cGFyYSBsYW5nPSJydSI+CivEydLFy9TJ18Egd29ya2VyX3JsaW1pdF9jb3JlLgorPC9wYXJhPgorPHBhcmEgbGFuZz0iZW4iPgordGhlICJ3b3JrZXJfcmxpbWl0X2NvcmUiIGRpcmVjdGl2ZS4KKzwvcGFyYT4KKzwvY2hhbmdlPgorCis8Y2hhbmdlIHR5cGU9Indvcmthcm91bmQiPgorPHBhcmEgbGFuZz0icnUiPgor0NLJINPCz9LLxSDLz83QyczR1M/Swc3JIGljYyA4LjEgySA5LjAg0yDP0NTJzcnawcPJxcogxMzRCis8bm9icj5QZW50aXVtIDQ8L25vYnI+IM7PzcXSINPPxcTJzsXOydEg1yDMz8fByCDX08XHxMEgwtnMINLB18XOIDEuCis8L3BhcmE+Cis8cGFyYSBsYW5nPSJlbiI+Cit0aGUgY29ubmVjdGlvbiBudW1iZXIgaW4gbG9ncyB3YXMgYWx3YXlzIDEgaWYgbmdpbnggd2FzIGJ1aWx0IGJ5IHRoZQoraWNjIDguMSBvciA5LjAgY29tcGlsZXJzIHdpdGggb3B0aW1pemF0aW9uIGZvciA8bm9icj5QZW50aXVtIDQuPC9ub2JyPgorPC9wYXJhPgorPC9jaGFuZ2U+CisKKzxjaGFuZ2UgdHlwZT0iYnVnZml4Ij4KKzxwYXJhIGxhbmc9InJ1Ij4KK8vPzcHOxMEgY29uZmlnIHRpbWVmbXQg1yBTU0kg2sHEwdfBzMEgzsXXxdLO2cogxs/SzcHUINfSxc3FzskuCis8L3BhcmE+Cis8cGFyYSBsYW5nPSJlbiI+Cit0aGUgImNvbmZpZyB0aW1lZm10IiBTU0kgY29tbWFuZCBzZXQgaW5jb3JyZWN0IHRpbWUgZm9ybWF0LgorPC9wYXJhPgorPC9jaGFuZ2U+CisKKzxjaGFuZ2UgdHlwZT0iYnVnZml4Ij4KKzxwYXJhIGxhbmc9InJ1Ij4KK25naW54IM7FINrBy9LZ18HMINPPxcTJzsXOydEg0yBJTUFQL1BPUDMgwtzLxc7Ez80g0NLJIMnT0M/M2NrP18HOyckgU1NMCivTz8XEyc7FzsnKLgor89DB08nCzyBSb2IgTXVlbGxlci4KK+/bycLLwSDQz9HXyczB09gg1yAwLjMuMTMuCis8L3BhcmE+Cis8cGFyYSBsYW5nPSJlbiI+CituZ2lueCBkaWQgbm90IGNsb3NlIGNvbm5lY3Rpb24gdG8gSU1BUC9QT1AzIGJhY2tlbmQgZm9yIHRoZSBTU0wgY29ubmVjdGlvbnMuCitUaGFua3MgdG8gUm9iIE11ZWxsZXIuCitCdWcgYXBwZWFyZWQgaW4gMC4zLjEzLgorPC9wYXJhPgorPC9jaGFuZ2U+CisKKzxjaGFuZ2UgdHlwZT0iYnVnZml4Ij4KKzxwYXJhIGxhbmc9InJ1Ij4KK3NlZ21lbnRhdGlvbiBmYXVsdCDNz8cg0NLPydrPytTJINfPINfSxc3RIFNTTCBzaHV0ZG93bjsKK8/bycLLwSDQz9HXyczB09gg1yAwLjMuMTMuCis8L3BhcmE+Cis8cGFyYSBsYW5nPSJlbiI+CitzZWdtZW50YXRpb24gZmF1bHQgbWF5IG9jY3VycmVkIGluIGF0IFNTTCBzaHV0ZG93bjsKK2J1ZyBhcHBlYXJlZCBpbiAwLjMuMTMuCis8L3BhcmE+Cis8L2NoYW5nZT4KKworPC9jaGFuZ2VzPgorCisKIDxjaGFuZ2VzIHZlcj0iMC4zLjE1IiBkYXRlPSIwNy4xMi4yMDA1Ij4KIAogPGNoYW5nZSB0eXBlPSJmZWF0dXJlIj4KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL25naW54LmMgYi9zcmMvY29yZS9uZ2lueC5jCmluZGV4IGNkMTU1MTQuLmQzMGUxMjcgMTAwNjQ0Ci0tLSBhL3NyYy9jb3JlL25naW54LmMKKysrIGIvc3JjL2NvcmUvbmdpbnguYwpAQCAtMTAwLDYgKzEwMCwxMyBAQAogICAgICAgb2Zmc2V0b2Yobmd4X2NvcmVfY29uZl90LCBybGltaXRfbm9maWxlKSwKICAgICAgIE5VTEwgfSwKIAorICAgIHsgbmd4X3N0cmluZygid29ya2VyX3JsaW1pdF9jb3JlIiksCisgICAgICBOR1hfTUFJTl9DT05GfE5HWF9ESVJFQ1RfQ09ORnxOR1hfQ09ORl9UQUtFMSwKKyAgICAgIG5neF9jb25mX3NldF9udW1fc2xvdCwKKyAgICAgIDAsCisgICAgICBvZmZzZXRvZihuZ3hfY29yZV9jb25mX3QsIHJsaW1pdF9jb3JlKSwKKyAgICAgIE5VTEwgfSwKKwogICAgIHsgbmd4X3N0cmluZygid29ya2VyX3JsaW1pdF9zaWdwZW5kaW5nIiksCiAgICAgICBOR1hfTUFJTl9DT05GfE5HWF9ESVJFQ1RfQ09ORnxOR1hfQ09ORl9UQUtFMSwKICAgICAgIG5neF9jb25mX3NldF9udW1fc2xvdCwKQEAgLTU1OCw2ICs1NjUsNyBAQAogICAgIGNjZi0+ZGVidWdfcG9pbnRzID0gTkdYX0NPTkZfVU5TRVQ7CiAKICAgICBjY2YtPnJsaW1pdF9ub2ZpbGUgPSBOR1hfQ09ORl9VTlNFVDsKKyAgICBjY2YtPnJsaW1pdF9jb3JlID0gTkdYX0NPTkZfVU5TRVQ7CiAgICAgY2NmLT5ybGltaXRfc2lncGVuZGluZyA9IE5HWF9DT05GX1VOU0VUOwogCiAgICAgY2NmLT51c2VyID0gKG5neF91aWRfdCkgTkdYX0NPTkZfVU5TRVRfVUlOVDsKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL25naW54LmggYi9zcmMvY29yZS9uZ2lueC5oCmluZGV4IDgwZmQ0OTguLmNlOWU1OTYgMTAwNjQ0Ci0tLSBhL3NyYy9jb3JlL25naW54LmgKKysrIGIvc3JjL2NvcmUvbmdpbnguaApAQCAtOCw3ICs4LDcgQEAKICNkZWZpbmUgX05HSU5YX0hfSU5DTFVERURfCiAKIAotI2RlZmluZSBOR0lOWF9WRVIgICAgICAgICAgIm5naW54LzAuMy4xNSIKKyNkZWZpbmUgTkdJTlhfVkVSICAgICAgICAgICJuZ2lueC8wLjMuMTYiCiAKICNkZWZpbmUgTkdJTlhfVkFSICAgICAgICAgICJOR0lOWCIKICNkZWZpbmUgTkdYX09MRFBJRF9FWFQgICAgICIub2xkYmluIgpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbmd4X2NvbmZpZy5oIGIvc3JjL2NvcmUvbmd4X2NvbmZpZy5oCmluZGV4IDk2NTY5YjguLmQ5MjRlYzUgMTAwNjQ0Ci0tLSBhL3NyYy9jb3JlL25neF9jb25maWcuaAorKysgYi9zcmMvY29yZS9uZ3hfY29uZmlnLmgKQEAgLTk4LDggKzk4LDggQEAKICNkZWZpbmUgTkdYX0FMSUdOTUVOVCAgIHNpemVvZih1bnNpZ25lZCBsb25nKSAgICAvKiBwbGF0Zm9ybSB3b3JkICovCiAjZW5kaWYKIAotI2RlZmluZSBuZ3hfYWxpZ24ocCkgICAgKHVfY2hhciAqKSAoKCh1aW50cHRyX3QpIHAgKyAoTkdYX0FMSUdOTUVOVCAtIDEpKSAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIH4oTkdYX0FMSUdOTUVOVCAtIDEpKQorI2RlZmluZSBuZ3hfYWxpZ24oZCwgYSkgICAgICgoKGQpICsgKGEgLSAxKSkgJiB+KGEgLSAxKSkKKyNkZWZpbmUgbmd4X2FsaWduX3B0cihwLCBhKSAodV9jaGFyICopICgoKHVpbnRwdHJfdCkgKHApICsgKGEgLSAxKSkgJiB+KGEgLSAxKSkKIAogCiAjZGVmaW5lIG5neF9hYm9ydCAgICAgICBhYm9ydApkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbmd4X2N5Y2xlLmggYi9zcmMvY29yZS9uZ3hfY3ljbGUuaAppbmRleCBmYzA0ZTljLi5jYmY4YzdiIDEwMDY0NAotLS0gYS9zcmMvY29yZS9uZ3hfY3ljbGUuaAorKysgYi9zcmMvY29yZS9uZ3hfY3ljbGUuaApAQCAtNjAsNiArNjAsNyBAQAogICAgICBuZ3hfaW50X3QgICAgICAgICAgICAgICAgZGVidWdfcG9pbnRzOwogCiAgICAgIG5neF9pbnRfdCAgICAgICAgICAgICAgICBybGltaXRfbm9maWxlOworICAgICBuZ3hfaW50X3QgICAgICAgICAgICAgICAgcmxpbWl0X2NvcmU7CiAgICAgIG5neF9pbnRfdCAgICAgICAgICAgICAgICBybGltaXRfc2lncGVuZGluZzsKIAogICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHk7CmRpZmYgLS1naXQgYS9zcmMvY29yZS9uZ3hfaGFzaC5jIGIvc3JjL2NvcmUvbmd4X2hhc2guYwppbmRleCA5ZDQxZGY2Li40ZGVjZDQyIDEwMDY0NAotLS0gYS9zcmMvY29yZS9uZ3hfaGFzaC5jCisrKyBiL3NyYy9jb3JlL25neF9oYXNoLmMKQEAgLTgsOCArOCw0ODggQEAKICNpbmNsdWRlIDxuZ3hfY29yZS5oPgogCiAKK3ZvaWQgKgorbmd4X2hhc2hfZmluZChuZ3hfaGFzaF90ICpoYXNoLCBuZ3hfdWludF90IGtleSwgdV9jaGFyICpuYW1lLCBzaXplX3QgbGVuKQoreworICAgIG5neF91aW50X3QgICAgICAgaTsKKyAgICBuZ3hfaGFzaF9lbHRfdCAgKmVsdDsKKworI2lmIDAKKyAgICBuZ3hfc3RyX3QgIGxpbmU7CisKKyAgICBsaW5lLmxlbiA9IGxlbjsKKyAgICBsaW5lLmRhdGEgPSBuYW1lOworICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19BTEVSVCwgbmd4X2N5Y2xlLT5sb2csIDAsICJoZjpcIiVWXCIiLCAmbGluZSk7CisjZW5kaWYKKworICAgIGVsdCA9IGhhc2gtPmJ1Y2tldHNba2V5ICUgaGFzaC0+c2l6ZV07CisKKyAgICBpZiAoZWx0ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgd2hpbGUgKGVsdC0+dmFsdWUpIHsKKyAgICAgICAgaWYgKGxlbiAhPSAoc2l6ZV90KSBlbHQtPmxlbikgeworICAgICAgICAgICAgZ290byBuZXh0OworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICBpZiAobmFtZVtpXSAhPSBlbHQtPm5hbWVbaV0pIHsKKyAgICAgICAgICAgICAgICBnb3RvIG5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZWx0LT52YWx1ZTsKKworICAgIG5leHQ6CisKKyAgICAgICAgZWx0ID0gKG5neF9oYXNoX2VsdF90ICopIG5neF9hbGlnbl9wdHIoJmVsdC0+bmFtZVswXSArIGVsdC0+bGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yodm9pZCAqKSk7CisgICAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCisKK3ZvaWQgKgorbmd4X2hhc2hfZmluZF93aWxkY2FyZChuZ3hfaGFzaF93aWxkY2FyZF90ICpod2MsIHVfY2hhciAqbmFtZSwgc2l6ZV90IGxlbikKK3sKKyAgICB2b2lkICAgICAgICAqdmFsdWU7CisgICAgbmd4X3VpbnRfdCAgIGksIG4sIGtleTsKKworI2lmIDAKKyAgICBuZ3hfc3RyX3QgIGxpbmU7CisKKyAgICBsaW5lLmxlbiA9IGxlbjsKKyAgICBsaW5lLmRhdGEgPSBuYW1lOworICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19BTEVSVCwgbmd4X2N5Y2xlLT5sb2csIDAsICJ3YzpcIiVWXCIiLCAmbGluZSk7CisjZW5kaWYKKworICAgIG4gPSBsZW47CisKKyAgICB3aGlsZSAobikgeworICAgICAgICBpZiAobmFtZVtuIC0gMV0gPT0gJy4nKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIG4tLTsKKyAgICB9CisKKyAgICBpZiAobiA9PSAwKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGtleSA9IDA7CisKKyAgICBmb3IgKGkgPSBuOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAga2V5ID0gbmd4X2hhc2goa2V5LCBuYW1lW2ldKTsKKyAgICB9CisKKyNpZiAwCisgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0FMRVJULCBuZ3hfY3ljbGUtPmxvZywgMCwgImtleTpcIiV1aVwiIiwga2V5KTsKKyNlbmRpZgorCisgICAgdmFsdWUgPSBuZ3hfaGFzaF9maW5kKCZod2MtPmhhc2gsIGtleSwgJm5hbWVbbl0sIGxlbiAtIG4pOworCisgICAgaWYgKHZhbHVlKSB7CisgICAgICAgIGlmICgodWludHB0cl90KSB2YWx1ZSAmIDEpIHsKKyAgICAgICAgICAgIGh3YyA9IChuZ3hfaGFzaF93aWxkY2FyZF90ICopICgodWludHB0cl90KSB2YWx1ZSAmICh1aW50cHRyX3QpIH4xKTsKKworICAgICAgICAgICAgdmFsdWUgPSBuZ3hfaGFzaF9maW5kX3dpbGRjYXJkKGh3YywgbmFtZSwgbiAtIDEpOworCisgICAgICAgICAgICBpZiAodmFsdWUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBod2MtPnZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIHJldHVybiBod2MtPnZhbHVlOworfQorCisKKyNkZWZpbmUgTkdYX0hBU0hfRUxUX1NJWkUobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHNpemVvZih2b2lkICopICsgbmd4X2FsaWduKChuYW1lKS0+a2V5LmxlbiArIDEsIHNpemVvZih2b2lkICopKQorCiBuZ3hfaW50X3QKLW5neF9oYXNoX2luaXQobmd4X2hhc2hfdCAqaGFzaCwgbmd4X3Bvb2xfdCAqcG9vbCwgdm9pZCAqbmFtZXMsIG5neF91aW50X3QgbmVsdHMpCituZ3hfaGFzaF9pbml0KG5neF9oYXNoX2luaXRfdCAqaGluaXQsIG5neF9oYXNoX2tleV90ICpuYW1lcywgbmd4X3VpbnRfdCBuZWx0cykKK3sKKyAgICB1X2NoYXIgICAgICAgICAgKmVsdHM7CisgICAgc2l6ZV90ICAgICAgICAgICp0ZXN0LCBsZW47CisgICAgbmd4X3VpbnRfdCAgICAgICBpLCBuLCBrZXksIHNpemUsIHN0YXJ0LCBidWNrZXRfc2l6ZTsKKyAgICBuZ3hfaGFzaF9lbHRfdCAgKmVsdCwgKipidWNrZXRzOworCisgICAgZm9yIChuID0gMDsgbiA8IG5lbHRzOyBuKyspIHsKKyAgICAgICAgaWYgKG5hbWVzW25dLmtleS5sZW4gPj0gMjU1KSB7CisgICAgICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfRU1FUkcsIGhpbml0LT5wb29sLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgXCIlVlwiIHZhbHVlIHRvIGhhc2ggaXMgdG8gbG9uZzogJXV6IGJ5dGVzLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgbWF4aW11bSBsZW5ndGggY2FuIGJlIDI1NSBieXRlcyBvbmx5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVzW25dLmtleSwgbmFtZXNbbl0ua2V5Lmxlbik7CisgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGhpbml0LT5idWNrZXRfc2l6ZSA8IE5HWF9IQVNIX0VMVF9TSVpFKCZuYW1lc1tuXSkgKyBzaXplb2Yodm9pZCAqKSkKKyAgICAgICAgeworICAgICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBoaW5pdC0+cG9vbC0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiY291bGQgbm90IGJ1aWxkIHRoZSAlcyBoYXNoLCB5b3Ugc2hvdWxkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImluY3JlYXNlICVzX2J1Y2tldF9zaXplOiAlaSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbml0LT5uYW1lLCBoaW5pdC0+bmFtZSwgaGluaXQtPmJ1Y2tldF9zaXplKTsKKyAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB0ZXN0ID0gbmd4X2FsbG9jKGhpbml0LT5tYXhfc2l6ZSAqIHNpemVvZihuZ3hfdWludF90KSwgaGluaXQtPnBvb2wtPmxvZyk7CisgICAgaWYgKHRlc3QgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgIH0KKworICAgIHN0YXJ0ID0gbmVsdHMgLyAobmd4X2NhY2hlbGluZV9zaXplIC8gKDIgKiBzaXplb2Yodm9pZCAqKSkgLSAxKTsKKyAgICBzdGFydCA9IHN0YXJ0ID8gc3RhcnQgOiAxOworCisgICAgYnVja2V0X3NpemUgPSBoaW5pdC0+YnVja2V0X3NpemUgLSBzaXplb2Yodm9pZCAqKTsKKworICAgIGZvciAoc2l6ZSA9IHN0YXJ0OyBzaXplIDwgaGluaXQtPm1heF9zaXplOyBzaXplKyspIHsKKworICAgICAgICBuZ3hfbWVtemVybyh0ZXN0LCBzaXplICogc2l6ZW9mKG5neF91aW50X3QpKTsKKworICAgICAgICBmb3IgKG4gPSAwOyBuIDwgbmVsdHM7IG4rKykgeworICAgICAgICAgICAgaWYgKG5hbWVzW25dLmtleS5kYXRhID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAga2V5ID0gbmFtZXNbbl0ua2V5X2hhc2ggJSBzaXplOworICAgICAgICAgICAgdGVzdFtrZXldICs9IE5HWF9IQVNIX0VMVF9TSVpFKCZuYW1lc1tuXSk7CisKKyNpZiAwCisgICAgICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfQUxFUlQsIGhpbml0LT5wb29sLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICIldWk6ICV1aSAldWkgXCIlVlwiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwga2V5LCB0ZXN0W2tleV0sICZuYW1lc1tuXS5rZXkpOworI2VuZGlmCisKKyAgICAgICAgICAgIGlmICh0ZXN0W2tleV0gPiBidWNrZXRfc2l6ZSkgeworICAgICAgICAgICAgICAgIGdvdG8gbmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGdvdG8gZm91bmQ7CisKKyAgICBuZXh0OgorCisgICAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19FTUVSRywgaGluaXQtPnBvb2wtPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICJjb3VsZCBub3QgYnVpbGQgdGhlICVzIGhhc2gsIHlvdSBzaG91bGQgaW5jcmVhc2UgIgorICAgICAgICAgICAgICAgICAgImVpdGhlciAlc19tYXhfc2l6ZTogJWkgb3IgJXNfYnVja2V0X3NpemU6ICVpIiwKKyAgICAgICAgICAgICAgICAgIGhpbml0LT5uYW1lLCBoaW5pdC0+bmFtZSwgaGluaXQtPm1heF9zaXplLAorICAgICAgICAgICAgICAgICAgaGluaXQtPm5hbWUsIGhpbml0LT5idWNrZXRfc2l6ZSk7CisKKyAgICBuZ3hfZnJlZSh0ZXN0KTsKKworICAgIHJldHVybiBOR1hfRVJST1I7CisKK2ZvdW5kOgorCisgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICB0ZXN0W2ldID0gc2l6ZW9mKHZvaWQgKik7CisgICAgfQorCisgICAgZm9yIChuID0gMDsgbiA8IG5lbHRzOyBuKyspIHsKKyAgICAgICAgaWYgKG5hbWVzW25dLmtleS5kYXRhID09IE5VTEwpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAga2V5ID0gbmFtZXNbbl0ua2V5X2hhc2ggJSBzaXplOworICAgICAgICB0ZXN0W2tleV0gKz0gTkdYX0hBU0hfRUxUX1NJWkUoJm5hbWVzW25dKTsKKyAgICB9CisKKyAgICBsZW4gPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICBpZiAodGVzdFtpXSA9PSBzaXplb2Yodm9pZCAqKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICB0ZXN0W2ldID0gbmd4X2FsaWduKHRlc3RbaV0sIG5neF9jYWNoZWxpbmVfc2l6ZSk7CisKKyAgICAgICAgbGVuICs9IHRlc3RbaV07CisgICAgfQorCisgICAgaWYgKGhpbml0LT5oYXNoID09IE5VTEwpIHsKKyAgICAgICAgaGluaXQtPmhhc2ggPSBuZ3hfcGNhbGxvYyhoaW5pdC0+cG9vbCwgc2l6ZW9mKG5neF9oYXNoX3dpbGRjYXJkX3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNpemUgKiBzaXplb2Yobmd4X2hhc2hfZWx0X3QgKikpOworICAgICAgICBpZiAoaGluaXQtPmhhc2ggPT0gTlVMTCkgeworICAgICAgICAgICAgbmd4X2ZyZWUodGVzdCk7CisgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgYnVja2V0cyA9IChuZ3hfaGFzaF9lbHRfdCAqKikKKyAgICAgICAgICAgICAgICAgICAgICAoKHVfY2hhciAqKSBoaW5pdC0+aGFzaCArIHNpemVvZihuZ3hfaGFzaF93aWxkY2FyZF90KSk7CisKKyAgICB9IGVsc2UgeworICAgICAgICBidWNrZXRzID0gbmd4X3BjYWxsb2MoaGluaXQtPnBvb2wsIHNpemUgKiBzaXplb2Yobmd4X2hhc2hfZWx0X3QgKikpOworICAgICAgICBpZiAoYnVja2V0cyA9PSBOVUxMKSB7CisgICAgICAgICAgICBuZ3hfZnJlZSh0ZXN0KTsKKyAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBlbHRzID0gbmd4X3BhbGxvYyhoaW5pdC0+cG9vbCwgbGVuICsgbmd4X2NhY2hlbGluZV9zaXplKTsKKyAgICBpZiAoZWx0cyA9PSBOVUxMKSB7CisgICAgICAgIG5neF9mcmVlKHRlc3QpOworICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgIH0KKworICAgIGVsdHMgPSBuZ3hfYWxpZ25fcHRyKGVsdHMsIG5neF9jYWNoZWxpbmVfc2l6ZSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIGlmICh0ZXN0W2ldID09IHNpemVvZih2b2lkICopKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGJ1Y2tldHNbaV0gPSAobmd4X2hhc2hfZWx0X3QgKikgZWx0czsKKyAgICAgICAgZWx0cyArPSB0ZXN0W2ldOworCisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICB0ZXN0W2ldID0gMDsKKyAgICB9CisKKyAgICBmb3IgKG4gPSAwOyBuIDwgbmVsdHM7IG4rKykgeworICAgICAgICBpZiAobmFtZXNbbl0ua2V5LmRhdGEgPT0gTlVMTCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBrZXkgPSBuYW1lc1tuXS5rZXlfaGFzaCAlIHNpemU7CisgICAgICAgIGVsdCA9IChuZ3hfaGFzaF9lbHRfdCAqKSAoKHVfY2hhciAqKSBidWNrZXRzW2tleV0gKyB0ZXN0W2tleV0pOworCisgICAgICAgIGVsdC0+dmFsdWUgPSBuYW1lc1tuXS52YWx1ZTsKKyAgICAgICAgZWx0LT5sZW4gPSAodV9jaGFyKSBuYW1lc1tuXS5rZXkubGVuOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuYW1lc1tuXS5rZXkubGVuOyBpKyspIHsKKyAgICAgICAgICAgIGVsdC0+bmFtZVtpXSA9IG5neF90b2xvd2VyKG5hbWVzW25dLmtleS5kYXRhW2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIHRlc3Rba2V5XSArPSBOR1hfSEFTSF9FTFRfU0laRSgmbmFtZXNbbl0pOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgaWYgKGJ1Y2tldHNbaV0gPT0gTlVMTCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBlbHQgPSAobmd4X2hhc2hfZWx0X3QgKikgKCh1X2NoYXIgKikgYnVja2V0c1tpXSArIHRlc3RbaV0pOworCisgICAgICAgIGVsdC0+dmFsdWUgPSBOVUxMOworICAgIH0KKworICAgIG5neF9mcmVlKHRlc3QpOworCisgICAgaGluaXQtPmhhc2gtPmJ1Y2tldHMgPSBidWNrZXRzOworICAgIGhpbml0LT5oYXNoLT5zaXplID0gc2l6ZTsKKworI2lmIDAKKworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgbmd4X3N0cl90ICAgdmFsOworICAgICAgICBuZ3hfdWludF90ICBrZXk7CisKKyAgICAgICAgZWx0ID0gYnVja2V0c1tpXTsKKworICAgICAgICBpZiAoZWx0ID09IE5VTEwpIHsKKyAgICAgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19BTEVSVCwgaGluaXQtPnBvb2wtPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiV1aTogTlVMTCIsIGkpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSAoZWx0LT52YWx1ZSkgeworICAgICAgICAgICAgdmFsLmxlbiA9IGVsdC0+bGVuOworICAgICAgICAgICAgdmFsLmRhdGEgPSAmZWx0LT5uYW1lWzBdOworCisgICAgICAgICAgICBrZXkgPSBoaW5pdC0+a2V5KHZhbC5kYXRhLCB2YWwubGVuKTsKKworICAgICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0FMRVJULCBoaW5pdC0+cG9vbC0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiJXVpOiAlcCBcIiVWXCIgJXVpIiwgaSwgZWx0LCAmdmFsLCBrZXkpOworCisgICAgICAgICAgICBlbHQgPSAobmd4X2hhc2hfZWx0X3QgKikgbmd4X2FsaWduX3B0cigmZWx0LT5uYW1lWzBdICsgZWx0LT5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yodm9pZCAqKSk7CisgICAgICAgIH0KKyAgICB9CisKKyNlbmRpZgorCisgICAgcmV0dXJuIE5HWF9PSzsKK30KKworCituZ3hfaW50X3QKK25neF9oYXNoX3dpbGRjYXJkX2luaXQobmd4X2hhc2hfaW5pdF90ICpoaW5pdCwgbmd4X2hhc2hfa2V5X3QgKm5hbWVzLAorICAgIG5neF91aW50X3QgbmVsdHMpCit7CisgICAgc2l6ZV90ICAgICAgICAgICAgICAgIGxlbjsKKyAgICBuZ3hfdWludF90ICAgICAgICAgICAgaSwgbjsKKyAgICBuZ3hfYXJyYXlfdCAgICAgICAgICAgY3Vycl9uYW1lcywgbmV4dF9uYW1lczsKKyAgICBuZ3hfaGFzaF9rZXlfdCAgICAgICAqbmFtZSwgKm5leHRfbmFtZTsKKyAgICBuZ3hfaGFzaF9pbml0X3QgICAgICAgaDsKKyAgICBuZ3hfaGFzaF93aWxkY2FyZF90ICAqd2RjOworCisgICAgaWYgKG5neF9hcnJheV9pbml0KCZjdXJyX25hbWVzLCBoaW5pdC0+dGVtcF9wb29sLCBuZWx0cywKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5neF9oYXNoX2tleV90KSkKKyAgICAgICAgIT0gTkdYX09LKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICB9CisKKyAgICBpZiAobmd4X2FycmF5X2luaXQoJm5leHRfbmFtZXMsIGhpbml0LT50ZW1wX3Bvb2wsIG5lbHRzLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yobmd4X2hhc2hfa2V5X3QpKQorICAgICAgICAhPSBOR1hfT0spCisgICAgeworICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgIH0KKworICAgIGZvciAobiA9IDA7IG4gPCBuZWx0czsgbiA9IGkpIHsKKworI2lmIDAKKyAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0FMRVJULCBoaW5pdC0+cG9vbC0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICAgICJ3YzA6IFwiJVZcIiIsICZuYW1lc1tuXS5rZXkpOworI2VuZGlmCisKKyAgICAgICAgZm9yIChsZW4gPSAwOyBsZW4gPCBuYW1lc1tuXS5rZXkubGVuOyBsZW4rKykgeworICAgICAgICAgICAgaWYgKG5hbWVzW25dLmtleS5kYXRhW2xlbl0gPT0gJy4nKSB7CisgICAgICAgICAgICAgICAgbGVuKys7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBuYW1lID0gbmd4X2FycmF5X3B1c2goJmN1cnJfbmFtZXMpOworICAgICAgICBpZiAobmFtZSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgbmFtZS0+a2V5LmxlbiA9IGxlbiAtIDE7CisgICAgICAgIG5hbWUtPmtleS5kYXRhID0gbmFtZXNbbl0ua2V5LmRhdGE7CisgICAgICAgIG5hbWUtPmtleV9oYXNoID0gaGluaXQtPmtleShuYW1lLT5rZXkuZGF0YSwgbmFtZS0+a2V5Lmxlbik7CisgICAgICAgIG5hbWUtPnZhbHVlID0gbmFtZXNbbl0udmFsdWU7CisKKyNpZiAwCisgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19BTEVSVCwgaGluaXQtPnBvb2wtPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAid2MxOiBcIiVWXCIiLCAmbmFtZS0+a2V5KTsKKyNlbmRpZgorCisgICAgICAgIG5leHRfbmFtZXMubmVsdHMgPSAwOworCisgICAgICAgIGlmIChuYW1lc1tuXS5rZXkubGVuICE9IGxlbikgeworICAgICAgICAgICAgbmV4dF9uYW1lID0gbmd4X2FycmF5X3B1c2goJm5leHRfbmFtZXMpOworICAgICAgICAgICAgaWYgKG5leHRfbmFtZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbmV4dF9uYW1lLT5rZXkubGVuID0gbmFtZXNbbl0ua2V5LmxlbiAtIGxlbjsKKyAgICAgICAgICAgIG5leHRfbmFtZS0+a2V5LmRhdGEgPSBuYW1lc1tuXS5rZXkuZGF0YSArIGxlbjsKKyAgICAgICAgICAgIG5leHRfbmFtZS0+a2V5X2hhc2g9IDA7CisgICAgICAgICAgICBuZXh0X25hbWUtPnZhbHVlID0gbmFtZXNbbl0udmFsdWU7CisKKyNpZiAwCisgICAgICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfQUxFUlQsIGhpbml0LT5wb29sLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJ3YzI6IFwiJVZcIiIsICZuZXh0X25hbWUtPmtleSk7CisjZW5kaWYKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaSA9IG4gKyAxOyBpIDwgbmVsdHM7IGkrKykgeworICAgICAgICAgICAgaWYgKG5neF9zdHJuY21wKG5hbWVzW25dLmtleS5kYXRhLCBuYW1lc1tpXS5rZXkuZGF0YSwgbGVuKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG5leHRfbmFtZSA9IG5neF9hcnJheV9wdXNoKCZuZXh0X25hbWVzKTsKKyAgICAgICAgICAgIGlmIChuZXh0X25hbWUgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG5leHRfbmFtZS0+a2V5LmxlbiA9IG5hbWVzW2ldLmtleS5sZW4gLSBsZW47CisgICAgICAgICAgICBuZXh0X25hbWUtPmtleS5kYXRhID0gbmFtZXNbaV0ua2V5LmRhdGEgKyBsZW47CisgICAgICAgICAgICBuZXh0X25hbWUtPmtleV9oYXNoPSAwOworICAgICAgICAgICAgbmV4dF9uYW1lLT52YWx1ZSA9IG5hbWVzW2ldLnZhbHVlOworCisjaWYgMAorICAgICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0FMRVJULCBoaW5pdC0+cG9vbC0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAid2MyOiBcIiVWXCIiLCAmbmV4dF9uYW1lLT5rZXkpOworI2VuZGlmCisgICAgICAgIH0KKworICAgICAgICBpZiAobmV4dF9uYW1lcy5uZWx0cykgeworICAgICAgICAgICAgaCA9ICpoaW5pdDsKKyAgICAgICAgICAgIGguaGFzaCA9IE5VTEw7CisKKyAgICAgICAgICAgIGlmIChuZ3hfaGFzaF93aWxkY2FyZF9pbml0KCZoLCAobmd4X2hhc2hfa2V5X3QgKikgbmV4dF9uYW1lcy5lbHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dF9uYW1lcy5uZWx0cykKKyAgICAgICAgICAgICAgICAhPSBOR1hfT0spCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgd2RjID0gKG5neF9oYXNoX3dpbGRjYXJkX3QgKikgaC5oYXNoOworCisgICAgICAgICAgICBpZiAobmFtZXNbbl0ua2V5LmxlbiA9PSBsZW4pIHsKKyAgICAgICAgICAgICAgICB3ZGMtPnZhbHVlID0gbmFtZXNbbl0udmFsdWU7CisjaWYgMAorICAgICAgICAgICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfQUxFUlQsIGhpbml0LT5wb29sLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndkYzogXCIlVlwiIiwgd2RjLT52YWx1ZSk7CisjZW5kaWYKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbmFtZS0+dmFsdWUgPSAodm9pZCAqKSAoKHVpbnRwdHJfdCkgd2RjIHwgMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobmd4X2hhc2hfaW5pdChoaW5pdCwgKG5neF9oYXNoX2tleV90ICopIGN1cnJfbmFtZXMuZWx0cywKKyAgICAgICAgICAgICAgICAgICAgICBjdXJyX25hbWVzLm5lbHRzKQorICAgICAgICAhPSBOR1hfT0spCisgICAgeworICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBOR1hfT0s7Cit9CisKKworbmd4X3VpbnRfdAorbmd4X2hhc2hfa2V5KHVfY2hhciAqZGF0YSwgc2l6ZV90IGxlbikKK3sKKyAgICBuZ3hfdWludF90ICBpLCBrZXk7CisKKyAgICBrZXkgPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgIGtleSA9IG5neF9oYXNoKGtleSwgZGF0YVtpXSk7CisgICAgfQorCisgICAgcmV0dXJuIGtleTsKK30KKworCituZ3hfdWludF90CituZ3hfaGFzaF9rZXlfbGModV9jaGFyICpkYXRhLCBzaXplX3QgbGVuKQoreworICAgIG5neF91aW50X3QgIGksIGtleTsKKworICAgIGtleSA9IDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAga2V5ID0gbmd4X2hhc2goa2V5LCBuZ3hfdG9sb3dlcihkYXRhW2ldKSk7CisgICAgfQorCisgICAgcmV0dXJuIGtleTsKK30KKworCituZ3hfaW50X3QKK25neF9oYXNoMF9pbml0KG5neF9oYXNoMF90ICpoYXNoLCBuZ3hfcG9vbF90ICpwb29sLCB2b2lkICpuYW1lcywKKyAgICBuZ3hfdWludF90IG5lbHRzKQogewogICAgIHVfY2hhciAgICAgICpwOwogICAgIG5neF9zdHJfdCAgICpuYW1lLCAqYnVja2V0OwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbmd4X2hhc2guaCBiL3NyYy9jb3JlL25neF9oYXNoLmgKaW5kZXggZTk5MTI1Ny4uNzQ0OWQwNSAxMDA2NDQKLS0tIGEvc3JjL2NvcmUvbmd4X2hhc2guaAorKysgYi9zcmMvY29yZS9uZ3hfaGFzaC5oCkBAIC0xMywyNSArMTMsODEgQEAKIAogCiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgdm9pZCAgICAgICAgKipidWNrZXRzOwotICAgIG5neF91aW50X3QgICAgaGFzaF9zaXplOworICAgIHZvaWQgICAgICAgICAgICAgKnZhbHVlOworICAgIHVfY2hhciAgICAgICAgICAgIGxlbjsKKyAgICB1X2NoYXIgICAgICAgICAgICBuYW1lWzFdOworfSBuZ3hfaGFzaF9lbHRfdDsKIAotICAgIG5neF91aW50X3QgICAgbWF4X3NpemU7Ci0gICAgbmd4X3VpbnRfdCAgICBidWNrZXRfbGltaXQ7Ci0gICAgc2l6ZV90ICAgICAgICBidWNrZXRfc2l6ZTsKLSAgICBjaGFyICAgICAgICAgKm5hbWU7Ci0gICAgbmd4X3VpbnRfdCAgICBtaW5fYnVja2V0czsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIG5neF9oYXNoX2VsdF90ICAqKmJ1Y2tldHM7CisgICAgbmd4X3VpbnRfdCAgICAgICAgc2l6ZTsKIH0gbmd4X2hhc2hfdDsKIAogCiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgbmd4X3VpbnRfdCAgaGFzaDsKLSAgICBuZ3hfc3RyX3QgICBrZXk7Ci0gICAgbmd4X3N0cl90ICAgdmFsdWU7CisgICAgbmd4X2hhc2hfdCAgICAgICAgaGFzaDsKKyAgICB2b2lkICAgICAgICAgICAgICp2YWx1ZTsKK30gbmd4X2hhc2hfd2lsZGNhcmRfdDsKKworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgbmd4X3N0cl90ICAgICAgICAga2V5OworICAgIG5neF91aW50X3QgICAgICAgIGtleV9oYXNoOworICAgIHZvaWQgICAgICAgICAgICAgKnZhbHVlOworfSBuZ3hfaGFzaF9rZXlfdDsKKworCit0eXBlZGVmIG5neF91aW50X3QgKCpuZ3hfaGFzaF9rZXlfcHQpICh1X2NoYXIgKmRhdGEsIHNpemVfdCBsZW4pOworCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBuZ3hfaGFzaF90ICAgICAgICpoYXNoOworICAgIG5neF9oYXNoX2tleV9wdCAgIGtleTsKKworICAgIG5neF91aW50X3QgICAgICAgIG1heF9zaXplOworICAgIG5neF91aW50X3QgICAgICAgIGJ1Y2tldF9zaXplOworCisgICAgY2hhciAgICAgICAgICAgICAqbmFtZTsKKyAgICBuZ3hfcG9vbF90ICAgICAgICpwb29sOworICAgIG5neF9wb29sX3QgICAgICAgKnRlbXBfcG9vbDsKK30gbmd4X2hhc2hfaW5pdF90OworCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB2b2lkICAgICAgICAgICAgKipidWNrZXRzOworICAgIG5neF91aW50X3QgICAgICAgIGhhc2hfc2l6ZTsKKworICAgIG5neF91aW50X3QgICAgICAgIG1heF9zaXplOworICAgIG5neF91aW50X3QgICAgICAgIGJ1Y2tldF9saW1pdDsKKyAgICBzaXplX3QgICAgICAgICAgICBidWNrZXRfc2l6ZTsKKyAgICBjaGFyICAgICAgICAgICAgICpuYW1lOworICAgIG5neF91aW50X3QgICAgICAgIG1pbl9idWNrZXRzOworfSBuZ3hfaGFzaDBfdDsKKworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgbmd4X3VpbnRfdCAgICAgICAgaGFzaDsKKyAgICBuZ3hfc3RyX3QgICAgICAgICBrZXk7CisgICAgbmd4X3N0cl90ICAgICAgICAgdmFsdWU7CiB9IG5neF90YWJsZV9lbHRfdDsKIAogCi1uZ3hfaW50X3Qgbmd4X2hhc2hfaW5pdChuZ3hfaGFzaF90ICpoYXNoLCBuZ3hfcG9vbF90ICpwb29sLCB2b2lkICpuYW1lcywKK3ZvaWQgKm5neF9oYXNoX2ZpbmQobmd4X2hhc2hfdCAqaGFzaCwgbmd4X3VpbnRfdCBrZXksIHVfY2hhciAqbmFtZSwgc2l6ZV90IGxlbik7Cit2b2lkICpuZ3hfaGFzaF9maW5kX3dpbGRjYXJkKG5neF9oYXNoX3dpbGRjYXJkX3QgKmh3YywgdV9jaGFyICpuYW1lLAorICAgIHNpemVfdCBsZW4pOworCituZ3hfaW50X3Qgbmd4X2hhc2hfaW5pdChuZ3hfaGFzaF9pbml0X3QgKmhpbml0LCBuZ3hfaGFzaF9rZXlfdCAqbmFtZXMsCisgICAgbmd4X3VpbnRfdCBuZWx0cyk7CituZ3hfaW50X3Qgbmd4X2hhc2hfd2lsZGNhcmRfaW5pdChuZ3hfaGFzaF9pbml0X3QgKmhpbml0LCBuZ3hfaGFzaF9rZXlfdCAqbmFtZXMsCisgICAgbmd4X3VpbnRfdCBuZWx0cyk7CisKKyNkZWZpbmUgbmd4X2hhc2goa2V5LCBjKSAgIGtleSAqIDMxICsgYworbmd4X3VpbnRfdCBuZ3hfaGFzaF9rZXkodV9jaGFyICpkYXRhLCBzaXplX3QgbGVuKTsKK25neF91aW50X3Qgbmd4X2hhc2hfa2V5X2xjKHVfY2hhciAqZGF0YSwgc2l6ZV90IGxlbik7CisKKworbmd4X2ludF90IG5neF9oYXNoMF9pbml0KG5neF9oYXNoMF90ICpoYXNoLCBuZ3hfcG9vbF90ICpwb29sLCB2b2lkICpuYW1lcywKICAgICBuZ3hfdWludF90IG5lbHRzKTsKIAogCmRpZmYgLS1naXQgYS9zcmMvY29yZS9uZ3hfbG9nLmMgYi9zcmMvY29yZS9uZ3hfbG9nLmMKaW5kZXggNmNiZWRkZS4uOWUyMzU5MiAxMDA2NDQKLS0tIGEvc3JjL2NvcmUvbmd4X2xvZy5jCisrKyBiL3NyYy9jb3JlL25neF9sb2cuYwpAQCAtMzI0LDcgKzMyNCw3IEBACiAgICAgICAgIGNmLT5jeWNsZS0+bmV3X2xvZy0+ZmlsZS0+bmFtZSA9IHZhbHVlWzFdOwogCiAgICAgICAgIGlmIChuZ3hfY29uZl9mdWxsX25hbWUoY2YtPmN5Y2xlLCAmY2YtPmN5Y2xlLT5uZXdfbG9nLT5maWxlLT5uYW1lKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gTkdYX0VSUk9SKQorICAgICAgICAgICAgPT0gTkdYX0VSUk9SKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL25neF9wYWxsb2MuYyBiL3NyYy9jb3JlL25neF9wYWxsb2MuYwppbmRleCAzYmIwYjM1Li5hMDIyOWIyIDEwMDY0NAotLS0gYS9zcmMvY29yZS9uZ3hfcGFsbG9jLmMKKysrIGIvc3JjL2NvcmUvbmd4X3BhbGxvYy5jCkBAIC05MCwxMCArOTAsMTYgQEAKIAogICAgIGlmIChzaXplIDw9IChzaXplX3QpIE5HWF9NQVhfQUxMT0NfRlJPTV9QT09MCiAgICAgICAgICYmIHNpemUgPD0gKHNpemVfdCkgKHBvb2wtPmVuZCAtICh1X2NoYXIgKikgcG9vbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIChzaXplX3QpIG5neF9hbGlnbihzaXplb2Yobmd4X3Bvb2xfdCkpKQorICAgICAgICAgICAgICAgICAgIC0gKHNpemVfdCkgbmd4X2FsaWduX3B0cihzaXplb2Yobmd4X3Bvb2xfdCksIE5HWF9BTElHTk1FTlQpKQogICAgIHsKICAgICAgICAgZm9yIChwID0gcG9vbC0+Y3VycmVudDsgLyogdm9pZCAqLyA7IHAgPSBwLT5uZXh0KSB7Ci0gICAgICAgICAgICBtID0gbmd4X2FsaWduKHAtPmxhc3QpOworCisgICAgICAgICAgICBpZiAoc2l6ZSA8IHNpemVvZihpbnQpIHx8IChzaXplICYgMSkpIHsKKyAgICAgICAgICAgICAgICBtID0gcC0+bGFzdDsKKworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtID0gbmd4X2FsaWduX3B0cihwLT5sYXN0LCBOR1hfQUxJR05NRU5UKTsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKChzaXplX3QpIChwLT5lbmQgLSBtKSA+PSBzaXplKSB7CiAgICAgICAgICAgICAgICAgcC0+bGFzdCA9IG0gKyBzaXplOwpAQCAtMTIyLDcgKzEyOCw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBwLT5uZXh0ID0gbjsKLSAgICAgICAgbSA9IG5neF9hbGlnbihuLT5sYXN0KTsKKyAgICAgICAgbSA9IG5neF9hbGlnbl9wdHIobi0+bGFzdCwgTkdYX0FMSUdOTUVOVCk7CiAgICAgICAgIG4tPmxhc3QgPSBtICsgc2l6ZTsKIAogICAgICAgICByZXR1cm4gbTsKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL25neF9wYWxsb2MuaCBiL3NyYy9jb3JlL25neF9wYWxsb2MuaAppbmRleCAzMDU5MGVlLi4yMzk3MjgxIDEwMDY0NAotLS0gYS9zcmMvY29yZS9uZ3hfcGFsbG9jLmgKKysrIGIvc3JjL2NvcmUvbmd4X3BhbGxvYy5oCkBAIC0xMyw3ICsxMyw3IEBACiAKIAogLyoKLSAqIE5HWF9NQVhfQUxMT0NfRlJPTV9QT09MIHNob3VsZCBiZSAobmd4X3BhZ2Vfc2l6ZSAtIDEpLCBpLmUuIDQwOTUgb24geDg2LgorICogTkdYX01BWF9BTExPQ19GUk9NX1BPT0wgc2hvdWxkIGJlIChuZ3hfcGFnZXNpemUgLSAxKSwgaS5lLiA0MDk1IG9uIHg4Ni4KICAqIE9uIEZyZWVCU0QgNS54IGl0IGFsbG93cyB0byB1c2UgdGhlIHplcm8gY29weSBzZW5kaW5nLgogICogT24gV2luZG93cyBOVCBpdCBkZWNyZWFzZXMgYSBudW1iZXIgb2YgbG9ja2VkIHBhZ2VzIGluIGEga2VybmVsLgogICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9uZ3hfc3RyaW5nLmMgYi9zcmMvY29yZS9uZ3hfc3RyaW5nLmMKaW5kZXggZjA0MmQ3Yy4uMmJiMzM1YSAxMDA2NDQKLS0tIGEvc3JjL2NvcmUvbmd4X3N0cmluZy5jCisrKyBiL3NyYy9jb3JlL25neF9zdHJpbmcuYwpAQCAtOTgwLDIwICs5ODAsMjEgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgLyogc2tpcCB0aGUgaW52YWxpZCBxdW90ZWQgY2hhcmFjdGVyICovCisgICAgICAgICAgICAvKiB0aGUgaW52YWxpZCBxdW90ZWQgY2hhcmFjdGVyICovCiAKLSAgICAgICAgICAgIHMrKzsKLSAgICAgICAgICAgIHNpemUtLTsKKyAgICAgICAgICAgIHN0YXRlID0gc3dfdXN1YWw7CisKKyAgICAgICAgICAgICpkKysgPSBjaDsKIAogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBzd19xdW90ZWRfc2Vjb25kOgogCisgICAgICAgICAgICBzdGF0ZSA9IHN3X3VzdWFsOworCiAgICAgICAgICAgICBpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgewogICAgICAgICAgICAgICAgIGNoID0gKHVfY2hhcikgKChkZWNvZGVkIDw8IDQpICsgY2ggLSAnMCcpOwogCi0gICAgICAgICAgICAgICAgc3RhdGUgPSBzd191c3VhbDsKLQogICAgICAgICAgICAgICAgIGlmIChjaCA+ICclJyAmJiBjaCA8IDB4N2YpIHsKICAgICAgICAgICAgICAgICAgICAgKmQrKyA9IGNoOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTEwMTMsOCArMTAxNCw2IEBACiAgICAgICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBzdGF0ZSA9IHN3X3VzdWFsOwotCiAgICAgICAgICAgICAgICAgaWYgKGNoID4gJyUnICYmIGNoIDwgMHg3ZikgewogICAgICAgICAgICAgICAgICAgICAqZCsrID0gY2g7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTAyNSw3ICsxMDI0LDcgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgLyogc2tpcCB0aGUgaW52YWxpZCBxdW90ZWQgY2hhcmFjdGVyICovCisgICAgICAgICAgICAvKiB0aGUgaW52YWxpZCBxdW90ZWQgY2hhcmFjdGVyICovCiAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9zcmMvZXZlbnQvbmd4X2V2ZW50X29wZW5zc2wuYyBiL3NyYy9ldmVudC9uZ3hfZXZlbnRfb3BlbnNzbC5jCmluZGV4IDQ0MTQ3MmUuLmIzNDM3MTggMTAwNjQ0Ci0tLSBhL3NyYy9ldmVudC9uZ3hfZXZlbnRfb3BlbnNzbC5jCisrKyBiL3NyYy9ldmVudC9uZ3hfZXZlbnRfb3BlbnNzbC5jCkBAIC01NDAsNiArNTQwLDcgQEAKIAogICAgIGMtPnNzbC0+bm9fd2FpdF9zaHV0ZG93biA9IDE7CiAgICAgYy0+c3NsLT5ub19zZW5kX3NodXRkb3duID0gMTsKKyAgICBjLT5yZWFkLT5lb2YgPSAxOwogCiAgICAgaWYgKHNzbGVyciA9PSBTU0xfRVJST1JfWkVST19SRVRVUk4gfHwgRVJSX3BlZWtfZXJyb3IoKSA9PSAwKSB7CiAgICAgICAgIG5neF9sb2dfZGVidWcwKE5HWF9MT0dfREVCVUdfRVZFTlQsIGMtPmxvZywgMCwKQEAgLTgxNCw5ICs4MTUsNyBAQAogICAgIFNTTF9zZXRfc2h1dGRvd24oYy0+c3NsLT5jb25uZWN0aW9uLCBtb2RlKTsKIAogICAgIGFnYWluID0gMDsKLSNpZiAoTkdYX1NVUFBSRVNTX1dBUk4pCiAgICAgc3NsZXJyID0gMDsKLSNlbmRpZgogCiAgICAgZm9yICggOzsgKSB7CiAgICAgICAgIG4gPSBTU0xfc2h1dGRvd24oYy0+c3NsLT5jb25uZWN0aW9uKTsKQEAgLTg0NSwyNyArODQ0LDI1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICJTU0xfZ2V0X2Vycm9yOiAlZCIsIHNzbGVycik7CiAgICAgfQogCi0gICAgaWYgKGFnYWluIHx8IHNzbGVyciA9PSBTU0xfRVJST1JfV0FOVF9SRUFEKSB7Ci0KLSAgICAgICAgbmd4X2FkZF90aW1lcihjLT5yZWFkLCAzMDAwMCk7Ci0KKyAgICBpZiAoYWdhaW4KKyAgICAgICAgfHwgc3NsZXJyID09IFNTTF9FUlJPUl9XQU5UX1JFQUQKKyAgICAgICAgfHwgc3NsZXJyID09IFNTTF9FUlJPUl9XQU5UX1dSSVRFKQorICAgIHsKICAgICAgICAgYy0+cmVhZC0+aGFuZGxlciA9IG5neF9zc2xfc2h1dGRvd25faGFuZGxlcjsKKyAgICAgICAgYy0+d3JpdGUtPmhhbmRsZXIgPSBuZ3hfc3NsX3NodXRkb3duX2hhbmRsZXI7CiAKICAgICAgICAgaWYgKG5neF9oYW5kbGVfcmVhZF9ldmVudChjLT5yZWFkLCAwKSA9PSBOR1hfRVJST1IpIHsKICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgICAgIH0KIAotICAgICAgICByZXR1cm4gTkdYX0FHQUlOOwotICAgIH0KLQotICAgIGlmIChzc2xlcnIgPT0gU1NMX0VSUk9SX1dBTlRfV1JJVEUpIHsKLQotICAgICAgICBjLT53cml0ZS0+aGFuZGxlciA9IG5neF9zc2xfc2h1dGRvd25faGFuZGxlcjsKLQogICAgICAgICBpZiAobmd4X2hhbmRsZV93cml0ZV9ldmVudChjLT53cml0ZSwgMCkgPT0gTkdYX0VSUk9SKSB7CiAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgICAgICB9CiAKKyAgICAgICAgaWYgKGFnYWluIHx8IHNzbGVyciA9PSBTU0xfRVJST1JfV0FOVF9SRUFEKSB7CisgICAgICAgICAgICBuZ3hfYWRkX3RpbWVyKGMtPnJlYWQsIDMwMDAwKTsKKyAgICAgICAgfQorCiAgICAgICAgIHJldHVybiBOR1hfQUdBSU47CiAgICAgfQogCkBAIC05MTQsNiArOTExLDkgQEAKICAgICAgICAgaWYgKGVyciA9PSBOR1hfRUNPTk5SRVNFVAogICAgICAgICAgICAgfHwgZXJyID09IE5HWF9FUElQRQogICAgICAgICAgICAgfHwgZXJyID09IE5HWF9FTk9UQ09OTgorI2lmICEoTkdYX0NSSVRfRVRJTUVET1VUKQorICAgICAgICAgICAgfHwgZXJyID09IE5HWF9FVElNRURPVVQKKyNlbmRpZgogICAgICAgICAgICAgfHwgZXJyID09IE5HWF9FQ09OTlJFRlVTRUQKICAgICAgICAgICAgIHx8IGVyciA9PSBOR1hfRUhPU1RVTlJFQUNIKQogICAgICAgICB7CkBAIC05NzcsMTMgKzk3NywxMyBAQAogdm9pZAogbmd4X3NzbF9jbGVhbnVwX2N0eCh2b2lkICpkYXRhKQogewotICAgbmd4X3NzbF90ICAqc3NsID0gZGF0YTsKKyAgICBuZ3hfc3NsX3QgICpzc2wgPSBkYXRhOwogCi0gICBpZiAoc3NsLT5yc2E1MTJfa2V5KSB7Ci0gICAgICAgUlNBX2ZyZWUoc3NsLT5yc2E1MTJfa2V5KTsKLSAgIH0KKyAgICBpZiAoc3NsLT5yc2E1MTJfa2V5KSB7CisgICAgICAgIFJTQV9mcmVlKHNzbC0+cnNhNTEyX2tleSk7CisgICAgfQogCi0gICBTU0xfQ1RYX2ZyZWUoc3NsLT5jdHgpOworICAgIFNTTF9DVFhfZnJlZShzc2wtPmN0eCk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9nZW9fbW9kdWxlLmMgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2dlb19tb2R1bGUuYwppbmRleCBiZjdiOTI1Li5hNmU4ZGIzIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2dlb19tb2R1bGUuYworKysgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2dlb19tb2R1bGUuYwpAQCAtMTMsNyArMTMsNyBAQAogICAgIG5neF9yYWRpeF90cmVlX3QgICp0cmVlOwogICAgIG5neF9wb29sX3QgICAgICAgICpwb29sOwogICAgIG5neF9hcnJheV90ICAgICAgICB2YWx1ZXM7Ci19IG5neF9odHRwX2dlb19jb25mX3Q7Cit9IG5neF9odHRwX2dlb19jb25mX2N0eF90OwogCiAKIHN0YXRpYyBjaGFyICpuZ3hfaHR0cF9nZW9fYmxvY2sobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwgdm9pZCAqY29uZik7CkBAIC05NSwxMiArOTUsMTIgQEAKIHN0YXRpYyBjaGFyICoKIG5neF9odHRwX2dlb19ibG9jayhuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqY21kLCB2b2lkICpjb25mKQogewotICAgIGNoYXIgICAgICAgICAgICAgICAgICpydjsKLSAgICBuZ3hfc3RyX3QgICAgICAgICAgICAqdmFsdWUsIG5hbWU7Ci0gICAgbmd4X2NvbmZfdCAgICAgICAgICAgIHNhdmU7Ci0gICAgbmd4X3Bvb2xfdCAgICAgICAgICAgKnBvb2w7Ci0gICAgbmd4X3JhZGl4X3RyZWVfdCAgICAgKnRyZWU7Ci0gICAgbmd4X2h0dHBfZ2VvX2NvbmZfdCAgIGdlbzsKKyAgICBjaGFyICAgICAgICAgICAgICAgICAgICAgKnJ2OworICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAqdmFsdWUsIG5hbWU7CisgICAgbmd4X2NvbmZfdCAgICAgICAgICAgICAgICBzYXZlOworICAgIG5neF9wb29sX3QgICAgICAgICAgICAgICAqcG9vbDsKKyAgICBuZ3hfcmFkaXhfdHJlZV90ICAgICAgICAgKnRyZWU7CisgICAgbmd4X2h0dHBfZ2VvX2NvbmZfY3R4X3QgICBjdHg7CiAgICAgbmd4X2h0dHBfdmFyaWFibGVfdCAgKnZhcjsKIAogICAgIHZhbHVlID0gY2YtPmFyZ3MtPmVsdHM7CkBAIC0xMzUsMjAgKzEzNSwyMCBAQAogICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgfQogCi0gICAgaWYgKG5neF9hcnJheV9pbml0KCZnZW8udmFsdWVzLCBwb29sLCA1MTIsCisgICAgaWYgKG5neF9hcnJheV9pbml0KCZjdHgudmFsdWVzLCBwb29sLCA1MTIsCiAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICopKQotICAgICAgICA9PSBOR1hfRVJST1IpCisgICAgICAgICE9IE5HWF9PSykKICAgICB7CiAgICAgICAgIG5neF9kZXN0cm95X3Bvb2wocG9vbCk7CiAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICB9CiAKLSAgICBnZW8udHJlZSA9IHRyZWU7Ci0gICAgZ2VvLnBvb2wgPSBjZi0+cG9vbDsKKyAgICBjdHgudHJlZSA9IHRyZWU7CisgICAgY3R4LnBvb2wgPSBjZi0+cG9vbDsKIAogICAgIHNhdmUgPSAqY2Y7CiAgICAgY2YtPnBvb2wgPSBwb29sOwotICAgIGNmLT5jdHggPSAmZ2VvOworICAgIGNmLT5jdHggPSAmY3R4OwogICAgIGNmLT5oYW5kbGVyID0gbmd4X2h0dHBfZ2VvOwogICAgIGNmLT5oYW5kbGVyX2NvbmYgPSBjb25mOwogCkBAIC0xODIsMTAgKzE4MiwxMCBAQAogICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICp2YWx1ZSwgZmlsZTsKICAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgaTsKICAgICBuZ3hfaW5ldF9jaWRyX3QgICAgICAgICAgICAgY2lkcmluOwotICAgIG5neF9odHRwX2dlb19jb25mX3QgICAgICAgICpnZW87CisgICAgbmd4X2h0dHBfZ2VvX2NvbmZfY3R4X3QgICAgKmN0eDsKICAgICBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICAqdmFyLCAqb2xkLCAqKnY7CiAKLSAgICBnZW8gPSBjZi0+Y3R4OworICAgIGN0eCA9IGNmLT5jdHg7CiAKICAgICBpZiAoY2YtPmFyZ3MtPm5lbHRzICE9IDIpIHsKICAgICAgICAgbmd4X2NvbmZfbG9nX2Vycm9yKE5HWF9MT0dfRU1FUkcsIGNmLCAwLApAQCAtMjIzLDI4ICsyMjMsMjcgQEAKICAgICB9CiAKICAgICB2YXIgPSBOVUxMOwotICAgIHYgPSBnZW8tPnZhbHVlcy5lbHRzOworICAgIHYgPSBjdHgtPnZhbHVlcy5lbHRzOwogCi0gICAgZm9yIChpID0gMDsgaSA8IGdlby0+dmFsdWVzLm5lbHRzOyBpKyspIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgY3R4LT52YWx1ZXMubmVsdHM7IGkrKykgewogICAgICAgICBpZiAoKHNpemVfdCkgdltpXS0+bGVuICE9IHZhbHVlWzFdLmxlbikgewogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAobmd4X3N0cm5jbXAodmFsdWVbMV0uZGF0YSwgdltpXS0+ZGF0YSwgdmFsdWVbMV0ubGVuKSA9PSAwKQotICAgICAgICB7CisgICAgICAgIGlmIChuZ3hfc3RybmNtcCh2YWx1ZVsxXS5kYXRhLCB2W2ldLT5kYXRhLCB2YWx1ZVsxXS5sZW4pID09IDApIHsKICAgICAgICAgICAgIHZhciA9IHZbaV07CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIAogICAgIGlmICh2YXIgPT0gTlVMTCkgewotICAgICAgICB2YXIgPSBuZ3hfcGFsbG9jKGdlby0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QpKTsKKyAgICAgICAgdmFyID0gbmd4X3BhbGxvYyhjdHgtPnBvb2wsIHNpemVvZihuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90KSk7CiAgICAgICAgIGlmICh2YXIgPT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgICAgICB9CiAKICAgICAgICAgdmFyLT5sZW4gPSB2YWx1ZVsxXS5sZW47Ci0gICAgICAgIHZhci0+ZGF0YSA9IG5neF9wc3RyZHVwKGdlby0+cG9vbCwgJnZhbHVlWzFdKTsKKyAgICAgICAgdmFyLT5kYXRhID0gbmd4X3BzdHJkdXAoY3R4LT5wb29sLCAmdmFsdWVbMV0pOwogICAgICAgICBpZiAodmFyLT5kYXRhID09IE5VTEwpIHsKICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICAgICAgfQpAQCAtMjUzLDcgKzI1Miw3IEBACiAgICAgICAgIHZhci0+bm9fY2FjaGFibGUgPSAwOwogICAgICAgICB2YXItPm5vdF9mb3VuZCA9IDA7CiAKLSAgICAgICAgdiA9IG5neF9hcnJheV9wdXNoKCZnZW8tPnZhbHVlcyk7CisgICAgICAgIHYgPSBuZ3hfYXJyYXlfcHVzaCgmY3R4LT52YWx1ZXMpOwogICAgICAgICBpZiAodiA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgICAgIH0KQEAgLTI2Miw3ICsyNjEsNyBAQAogICAgIH0KIAogICAgIGZvciAoaSA9IDI7IGk7IGktLSkgewotICAgICAgICByYyA9IG5neF9yYWRpeDMydHJlZV9pbnNlcnQoZ2VvLT50cmVlLCBjaWRyaW4uYWRkciwgY2lkcmluLm1hc2ssCisgICAgICAgIHJjID0gbmd4X3JhZGl4MzJ0cmVlX2luc2VydChjdHgtPnRyZWUsIGNpZHJpbi5hZGRyLCBjaWRyaW4ubWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50cHRyX3QpIHZhcik7CiAgICAgICAgIGlmIChyYyA9PSBOR1hfT0spIHsKICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9PSzsKQEAgLTI3NSwxNCArMjc0LDE0IEBACiAgICAgICAgIC8qIHJjID09IE5HWF9CVVNZICovCiAKICAgICAgICAgb2xkICA9IChuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICopCi0gICAgICAgICAgICAgICAgICAgIG5neF9yYWRpeDMydHJlZV9maW5kKGdlby0+dHJlZSwgY2lkcmluLmFkZHIgJiBjaWRyaW4ubWFzayk7CisgICAgICAgICAgICAgICAgICAgIG5neF9yYWRpeDMydHJlZV9maW5kKGN0eC0+dHJlZSwgY2lkcmluLmFkZHIgJiBjaWRyaW4ubWFzayk7CiAKICAgICAgICAgbmd4X2NvbmZfbG9nX2Vycm9yKE5HWF9MT0dfV0FSTiwgY2YsIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZHVwbGljYXRlIHBhcmFtZXRlciBcIiVWXCIsIHZhbHVlOiBcIiVWXCIsICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvbGQgdmFsdWU6IFwiJVZcIiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVbMF0sIHZhciwgb2xkKTsKIAotICAgICAgICByYyA9IG5neF9yYWRpeDMydHJlZV9kZWxldGUoZ2VvLT50cmVlLCBjaWRyaW4uYWRkciwgY2lkcmluLm1hc2spOworICAgICAgICByYyA9IG5neF9yYWRpeDMydHJlZV9kZWxldGUoY3R4LT50cmVlLCBjaWRyaW4uYWRkciwgY2lkcmluLm1hc2spOwogCiAgICAgICAgIGlmIChyYyA9PSBOR1hfRVJST1IpIHsKICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKZGlmZiAtLWdpdCBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfZ3ppcF9maWx0ZXJfbW9kdWxlLmMgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2d6aXBfZmlsdGVyX21vZHVsZS5jCmluZGV4IGU4MTk3NTkuLjk0MGUwODIgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfZ3ppcF9maWx0ZXJfbW9kdWxlLmMKKysrIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9nemlwX2ZpbHRlcl9tb2R1bGUuYwpAQCAtMjIsNyArMjIsNyBAQAogICAgIG5neF91aW50X3QgICAgICAgICAgIGh0dHBfdmVyc2lvbjsKICAgICBuZ3hfdWludF90ICAgICAgICAgICBwcm94aWVkOwogCi0gICAgaW50ICAgICAgICAgICAgICAgICAgbGV2ZWw7CisgICAgbmd4X2ludF90ICAgICAgICAgICAgbGV2ZWw7CiAgICAgc2l6ZV90ICAgICAgICAgICAgICAgd2JpdHM7CiAgICAgc2l6ZV90ICAgICAgICAgICAgICAgbWVtbGV2ZWw7CiAgICAgc3NpemVfdCAgICAgICAgICAgICAgbWluX2xlbmd0aDsKQEAgLTUwOSw3ICs1MDksNyBAQAogICAgICAgICBjdHgtPnpzdHJlYW0uemZyZWUgPSBuZ3hfaHR0cF9nemlwX2ZpbHRlcl9mcmVlOwogICAgICAgICBjdHgtPnpzdHJlYW0ub3BhcXVlID0gY3R4OwogCi0gICAgICAgIHJjID0gZGVmbGF0ZUluaXQyKCZjdHgtPnpzdHJlYW0sIGNvbmYtPmxldmVsLCBaX0RFRkxBVEVELAorICAgICAgICByYyA9IGRlZmxhdGVJbml0MigmY3R4LT56c3RyZWFtLCAoaW50KSBjb25mLT5sZXZlbCwgWl9ERUZMQVRFRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgLXdiaXRzLCBtZW1sZXZlbCwgWl9ERUZBVUxUX1NUUkFURUdZKTsKIAogICAgICAgICBpZiAocmMgIT0gWl9PSykgewpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9tYXBfbW9kdWxlLmMgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX21hcF9tb2R1bGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzY5MDI4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9tYXBfbW9kdWxlLmMKQEAgLTAsMCArMSw2MzcgQEAKKworLyoKKyAqIENvcHlyaWdodCAoQykgSWdvciBTeXNvZXYKKyAqLworCisKKyNpbmNsdWRlIDxuZ3hfY29uZmlnLmg+CisjaW5jbHVkZSA8bmd4X2NvcmUuaD4KKyNpbmNsdWRlIDxuZ3hfaHR0cC5oPgorCisKKyNkZWZpbmUgTkdYX0hUVFBfTUFQX0hBU0ggICAgICAgMTAwMDcKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICBoYXNoX21heF9zaXplOworICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICBoYXNoX2J1Y2tldF9zaXplOworfSBuZ3hfaHR0cF9tYXBfY29uZl90OworCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBuZ3hfcG9vbF90ICAgICAgICAgICAgICAgICAqcG9vbDsKKworICAgIG5neF9hcnJheV90ICAgICAgICAgICAgICAgICBrZXlzOworICAgIG5neF9hcnJheV90ICAgICAgICAgICAgICAgICprZXlzX2hhc2g7CisKKyAgICBuZ3hfYXJyYXlfdCAgICAgICAgICAgICAgICAgZG5zX3dpbGRjYXJkczsKKyAgICBuZ3hfYXJyYXlfdCAgICAgICAgICAgICAgICAqZG5zX2hhc2g7CisKKyAgICBuZ3hfYXJyYXlfdCAgICAgICAgICAgICAgICAqdmFsdWVzX2hhc2g7CisKKyAgICBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICAqZGVmYXVsdF92YWx1ZTsKKyAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgaG9zdG5hbWVzOyAgICAgIC8qIHVuc2lnbmVkICBob3N0bmFtZXM6MSAqLworfSBuZ3hfaHR0cF9tYXBfY29uZl9jdHhfdDsKKworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgbmd4X2hhc2hfdCAgICAgICAgICAgICAgICAgIGhhc2g7CisgICAgbmd4X2hhc2hfd2lsZGNhcmRfdCAgICAgICAgKmRuc193aWxkY2FyZHM7CisgICAgbmd4X2ludF90ICAgICAgICAgICAgICAgICAgIGluZGV4OworICAgIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgICpkZWZhdWx0X3ZhbHVlOworICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICBob3N0bmFtZXM7ICAgICAgLyogdW5zaWduZWQgIGhvc3RuYW1lczoxICovCit9IG5neF9odHRwX21hcF9jdHhfdDsKKworCitzdGF0aWMgaW50IG5neF9saWJjX2NkZWNsIG5neF9odHRwX21hcF9jbXBfZG5zX3dpbGRjYXJkcyhjb25zdCB2b2lkICpvbmUsCisgICAgY29uc3Qgdm9pZCAqdHdvKTsKK3N0YXRpYyB2b2lkICpuZ3hfaHR0cF9tYXBfY3JlYXRlX2NvbmYobmd4X2NvbmZfdCAqY2YpOworc3RhdGljIGNoYXIgKm5neF9odHRwX21hcF9ibG9jayhuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqY21kLCB2b2lkICpjb25mKTsKK3N0YXRpYyBjaGFyICpuZ3hfaHR0cF9tYXAobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmR1bW15LCB2b2lkICpjb25mKTsKKworCitzdGF0aWMgbmd4X2NvbW1hbmRfdCAgbmd4X2h0dHBfbWFwX2NvbW1hbmRzW10gPSB7CisKKyAgICB7IG5neF9zdHJpbmcoIm1hcCIpLAorICAgICAgTkdYX0hUVFBfTUFJTl9DT05GfE5HWF9DT05GX0JMT0NLfE5HWF9DT05GX1RBS0UyLAorICAgICAgbmd4X2h0dHBfbWFwX2Jsb2NrLAorICAgICAgTkdYX0hUVFBfTUFJTl9DT05GX09GRlNFVCwKKyAgICAgIDAsCisgICAgICBOVUxMIH0sCisKKyAgICB7IG5neF9zdHJpbmcoIm1hcF9oYXNoX21heF9zaXplIiksCisgICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0NPTkZfVEFLRTEsCisgICAgICBuZ3hfY29uZl9zZXRfbnVtX3Nsb3QsCisgICAgICBOR1hfSFRUUF9NQUlOX0NPTkZfT0ZGU0VULAorICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfbWFwX2NvbmZfdCwgaGFzaF9tYXhfc2l6ZSksCisgICAgICBOVUxMIH0sCisKKyAgICB7IG5neF9zdHJpbmcoIm1hcF9oYXNoX2J1Y2tldF9zaXplIiksCisgICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0NPTkZfVEFLRTEsCisgICAgICBuZ3hfY29uZl9zZXRfbnVtX3Nsb3QsCisgICAgICBOR1hfSFRUUF9NQUlOX0NPTkZfT0ZGU0VULAorICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfbWFwX2NvbmZfdCwgaGFzaF9idWNrZXRfc2l6ZSksCisgICAgICBOVUxMIH0sCisKKyAgICAgIG5neF9udWxsX2NvbW1hbmQKK307CisKKworc3RhdGljIG5neF9odHRwX21vZHVsZV90ICBuZ3hfaHR0cF9tYXBfbW9kdWxlX2N0eCA9IHsKKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcmVjb25maWd1cmF0aW9uICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcG9zdGNvbmZpZ3VyYXRpb24gKi8KKworICAgIG5neF9odHRwX21hcF9jcmVhdGVfY29uZiwgICAgICAgICAgICAgIC8qIGNyZWF0ZSBtYWluIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0IG1haW4gY29uZmlndXJhdGlvbiAqLworCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3JlYXRlIHNlcnZlciBjb25maWd1cmF0aW9uICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbWVyZ2Ugc2VydmVyIGNvbmZpZ3VyYXRpb24gKi8KKworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSBsb2NhdGlvbiBjb25maWd1cmF0aW9uICovCisgICAgTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbWVyZ2UgbG9jYXRpb24gY29uZmlndXJhdGlvbiAqLworfTsKKworCituZ3hfbW9kdWxlX3QgIG5neF9odHRwX21hcF9tb2R1bGUgPSB7CisgICAgTkdYX01PRFVMRV9WMSwKKyAgICAmbmd4X2h0dHBfbWFwX21vZHVsZV9jdHgsICAgICAgICAgICAgICAvKiBtb2R1bGUgY29udGV4dCAqLworICAgIG5neF9odHRwX21hcF9jb21tYW5kcywgICAgICAgICAgICAgICAgIC8qIG1vZHVsZSBkaXJlY3RpdmVzICovCisgICAgTkdYX0hUVFBfTU9EVUxFLCAgICAgICAgICAgICAgICAgICAgICAgLyogbW9kdWxlIHR5cGUgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0IG1hc3RlciAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXQgbW9kdWxlICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdCBwcm9jZXNzICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdCB0aHJlYWQgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBleGl0IHRocmVhZCAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGV4aXQgcHJvY2VzcyAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGV4aXQgbWFzdGVyICovCisgICAgTkdYX01PRFVMRV9WMV9QQURESU5HCit9OworCisKK3N0YXRpYyBuZ3hfaW50X3QKK25neF9odHRwX21hcF92YXJpYWJsZShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgKnYsCisgICAgdWludHB0cl90IGRhdGEpCit7CisgICAgbmd4X2h0dHBfbWFwX2N0eF90ICAqbWFwID0gKG5neF9odHRwX21hcF9jdHhfdCAqKSBkYXRhOworCisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgIGxlbjsKKyAgICB1X2NoYXIgICAgICAgICAgICAgICAgICAgICAqbmFtZTsKKyAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAga2V5LCBpOworICAgIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgICp2diwgKnZhbHVlOworCisgICAgbmd4X2xvZ19kZWJ1ZzAoTkdYX0xPR19ERUJVR19IVFRQLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgImh0dHAgbWFwIHN0YXJ0ZWQiKTsKKworICAgIHZ2ID0gbmd4X2h0dHBfZ2V0X2ZsdXNoZWRfdmFyaWFibGUociwgbWFwLT5pbmRleCk7CisKKyAgICBsZW4gPSB2di0+bGVuOworCisgICAgaWYgKGxlbiAmJiBtYXAtPmhvc3RuYW1lcyAmJiB2di0+ZGF0YVtsZW4gLSAxXSA9PSAnLicpIHsKKyAgICAgICAgbGVuLS07CisgICAgfQorCisgICAgaWYgKGxlbiA9PSAwKSB7CisgICAgICAgICp2ID0gKm1hcC0+ZGVmYXVsdF92YWx1ZTsKKyAgICAgICAgcmV0dXJuIE5HWF9PSzsKKyAgICB9CisKKyAgICBuYW1lID0gbmd4X3BhbGxvYyhyLT5wb29sLCBsZW4pOworICAgIGlmIChuYW1lID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICB9CisKKyAgICBrZXkgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICBuYW1lW2ldID0gbmd4X3RvbG93ZXIodnYtPmRhdGFbaV0pOworICAgICAgICBrZXkgPSBuZ3hfaGFzaChrZXksIG5hbWVbaV0pOworICAgIH0KKworICAgIHZhbHVlID0gTlVMTDsKKworICAgIGlmIChtYXAtPmhhc2guYnVja2V0cykgeworICAgICAgICB2YWx1ZSA9IG5neF9oYXNoX2ZpbmQoJm1hcC0+aGFzaCwga2V5LCBuYW1lLCBsZW4pOworICAgIH0KKworICAgIGlmICh2YWx1ZSkgeworICAgICAgICAqdiA9ICp2YWx1ZTsKKworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChtYXAtPmRuc193aWxkY2FyZHMgJiYgbWFwLT5kbnNfd2lsZGNhcmRzLT5oYXNoLmJ1Y2tldHMpIHsKKyAgICAgICAgICAgIHZhbHVlID0gbmd4X2hhc2hfZmluZF93aWxkY2FyZChtYXAtPmRuc193aWxkY2FyZHMsIG5hbWUsIGxlbik7CisgICAgICAgICAgICBpZiAodmFsdWUpIHsKKyAgICAgICAgICAgICAgICAqdiA9ICp2YWx1ZTsKKworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAqdiA9ICptYXAtPmRlZmF1bHRfdmFsdWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICp2ID0gKm1hcC0+ZGVmYXVsdF92YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG5neF9sb2dfZGVidWcyKE5HWF9MT0dfREVCVUdfSFRUUCwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICJodHRwIG1hcDogXCIlVlwiIFwiJVZcIiIsIHZ2LCB2KTsKKworICAgIHJldHVybiBOR1hfT0s7Cit9CisKKworc3RhdGljIHZvaWQgKgorbmd4X2h0dHBfbWFwX2NyZWF0ZV9jb25mKG5neF9jb25mX3QgKmNmKQoreworICAgIG5neF9odHRwX21hcF9jb25mX3QgICptY2Y7CisKKyAgICBtY2YgPSBuZ3hfcGFsbG9jKGNmLT5wb29sLCBzaXplb2Yobmd4X2h0dHBfbWFwX2NvbmZfdCkpOworICAgIGlmIChtY2YgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgfQorCisgICAgbWNmLT5oYXNoX21heF9zaXplID0gTkdYX0NPTkZfVU5TRVRfVUlOVDsKKyAgICBtY2YtPmhhc2hfYnVja2V0X3NpemUgPSBOR1hfQ09ORl9VTlNFVF9VSU5UOworCisgICAgcmV0dXJuIG1jZjsKK30KKworCitzdGF0aWMgY2hhciAqCituZ3hfaHR0cF9tYXBfYmxvY2sobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwgdm9pZCAqY29uZikKK3sKKyAgICBuZ3hfaHR0cF9tYXBfY29uZl90ICAqbWNmID0gY29uZjsKKworICAgIGNoYXIgICAgICAgICAgICAgICAgICAgICAgKnJ2OworICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgKnZhbHVlLCBuYW1lOworICAgIG5neF9jb25mX3QgICAgICAgICAgICAgICAgIHNhdmU7CisgICAgbmd4X3Bvb2xfdCAgICAgICAgICAgICAgICAqcG9vbDsKKyAgICBuZ3hfaGFzaF9pbml0X3QgICAgICAgICAgICBoYXNoOworICAgIG5neF9odHRwX21hcF9jdHhfdCAgICAgICAgKm1hcDsKKyAgICBuZ3hfaHR0cF92YXJpYWJsZV90ICAgICAgICp2YXI7CisgICAgbmd4X2h0dHBfbWFwX2NvbmZfY3R4X3QgICAgY3R4OworCisgICAgaWYgKG1jZi0+aGFzaF9tYXhfc2l6ZSA9PSBOR1hfQ09ORl9VTlNFVF9VSU5UKSB7CisgICAgICAgIG1jZi0+aGFzaF9tYXhfc2l6ZSA9IDIwNDg7CisgICAgfQorCisgICAgaWYgKG1jZi0+aGFzaF9idWNrZXRfc2l6ZSA9PSBOR1hfQ09ORl9VTlNFVF9VSU5UKSB7CisgICAgICAgIG1jZi0+aGFzaF9idWNrZXRfc2l6ZSA9IG5neF9jYWNoZWxpbmVfc2l6ZTsKKworICAgIH0gZWxzZSB7CisgICAgICAgIG1jZi0+aGFzaF9idWNrZXRfc2l6ZSA9IG5neF9hbGlnbihtY2YtPmhhc2hfYnVja2V0X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfY2FjaGVsaW5lX3NpemUpOworICAgIH0KKworICAgIG1hcCA9IG5neF9wY2FsbG9jKGNmLT5wb29sLCBzaXplb2Yobmd4X2h0dHBfbWFwX2N0eF90KSk7CisgICAgaWYgKG1hcCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICB9CisKKyAgICB2YWx1ZSA9IGNmLT5hcmdzLT5lbHRzOworCisgICAgbmFtZSA9IHZhbHVlWzFdOworICAgIG5hbWUubGVuLS07CisgICAgbmFtZS5kYXRhKys7CisKKyAgICBtYXAtPmluZGV4ID0gbmd4X2h0dHBfZ2V0X3ZhcmlhYmxlX2luZGV4KGNmLCAmbmFtZSk7CisKKyAgICBpZiAobWFwLT5pbmRleCA9PSBOR1hfRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgIH0KKworICAgIG5hbWUgPSB2YWx1ZVsyXTsKKyAgICBuYW1lLmxlbi0tOworICAgIG5hbWUuZGF0YSsrOworCisgICAgdmFyID0gbmd4X2h0dHBfYWRkX3ZhcmlhYmxlKGNmLCAmbmFtZSwgTkdYX0hUVFBfVkFSX0NIQU5HQUJMRSk7CisgICAgaWYgKHZhciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICB9CisKKyAgICB2YXItPmhhbmRsZXIgPSBuZ3hfaHR0cF9tYXBfdmFyaWFibGU7CisgICAgdmFyLT5kYXRhID0gKHVpbnRwdHJfdCkgbWFwOworCisgICAgcG9vbCA9IG5neF9jcmVhdGVfcG9vbCgxNjM4NCwgY2YtPmxvZyk7CisgICAgaWYgKHBvb2wgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgfQorCisgICAgaWYgKG5neF9hcnJheV9pbml0KCZjdHgua2V5cywgcG9vbCwgMTYzODQsIHNpemVvZihuZ3hfaGFzaF9rZXlfdCkpCisgICAgICAgICE9IE5HWF9PSykKKyAgICB7CisgICAgICAgIG5neF9kZXN0cm95X3Bvb2wocG9vbCk7CisgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICB9CisKKyAgICBpZiAobmd4X2FycmF5X2luaXQoJmN0eC5kbnNfd2lsZGNhcmRzLCBwb29sLCAxNjM4NCwgc2l6ZW9mKG5neF9oYXNoX2tleV90KSkKKyAgICAgICAgIT0gTkdYX09LKQorICAgIHsKKyAgICAgICAgbmd4X2Rlc3Ryb3lfcG9vbChwb29sKTsKKyAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgIH0KKworICAgIGN0eC5rZXlzX2hhc2ggPSBuZ3hfcGNhbGxvYyhwb29sLCBzaXplb2Yobmd4X2FycmF5X3QpICogTkdYX0hUVFBfTUFQX0hBU0gpOworICAgIGlmIChjdHgua2V5c19oYXNoID09IE5VTEwpIHsKKyAgICAgICAgbmd4X2Rlc3Ryb3lfcG9vbChwb29sKTsKKyAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgIH0KKworICAgIGN0eC5kbnNfaGFzaCA9IG5neF9wY2FsbG9jKHBvb2wsIHNpemVvZihuZ3hfYXJyYXlfdCkgKiBOR1hfSFRUUF9NQVBfSEFTSCk7CisgICAgaWYgKGN0eC5kbnNfaGFzaCA9PSBOVUxMKSB7CisgICAgICAgIG5neF9kZXN0cm95X3Bvb2wocG9vbCk7CisgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICB9CisKKyAgICBjdHgudmFsdWVzX2hhc2ggPSBuZ3hfcGNhbGxvYyhwb29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfYXJyYXlfdCkgKiBOR1hfSFRUUF9NQVBfSEFTSCk7CisgICAgaWYgKGN0eC52YWx1ZXNfaGFzaCA9PSBOVUxMKSB7CisgICAgICAgIG5neF9kZXN0cm95X3Bvb2wocG9vbCk7CisgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICB9CisKKyAgICBjdHgucG9vbCA9IGNmLT5wb29sOworICAgIGN0eC5kZWZhdWx0X3ZhbHVlID0gTlVMTDsKKyAgICBjdHguaG9zdG5hbWVzID0gMDsKKworICAgIHNhdmUgPSAqY2Y7CisgICAgY2YtPnBvb2wgPSBwb29sOworICAgIGNmLT5jdHggPSAmY3R4OworICAgIGNmLT5oYW5kbGVyID0gbmd4X2h0dHBfbWFwOworICAgIGNmLT5oYW5kbGVyX2NvbmYgPSBjb25mOworCisgICAgcnYgPSBuZ3hfY29uZl9wYXJzZShjZiwgTlVMTCk7CisKKyAgICAqY2YgPSBzYXZlOworCisgICAgaWYgKHJ2ICE9IE5HWF9DT05GX09LKSB7CisgICAgICAgIG5neF9kZXN0cm95X3Bvb2wocG9vbCk7CisKKyAgICAgICAgcmV0dXJuIHJ2OworICAgIH0KKworICAgIGhhc2gua2V5ID0gbmd4X2hhc2hfa2V5X2xjOworICAgIGhhc2gubWF4X3NpemUgPSBtY2YtPmhhc2hfbWF4X3NpemU7CisgICAgaGFzaC5idWNrZXRfc2l6ZSA9IG1jZi0+aGFzaF9idWNrZXRfc2l6ZTsKKyAgICBoYXNoLm5hbWUgPSAibWFwX2hhc2giOworICAgIGhhc2gucG9vbCA9IGNmLT5wb29sOworCisgICAgaWYgKGN0eC5rZXlzLm5lbHRzKSB7CisgICAgICAgIGhhc2guaGFzaCA9ICZtYXAtPmhhc2g7CisgICAgICAgIGhhc2gudGVtcF9wb29sID0gTlVMTDsKKworICAgICAgICBpZiAobmd4X2hhc2hfaW5pdCgmaGFzaCwgY3R4LmtleXMuZWx0cywgY3R4LmtleXMubmVsdHMpICE9IE5HWF9PSykgeworICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgICAgICB9CisgICAgfQorCisgICAgbWFwLT5kZWZhdWx0X3ZhbHVlID0gY3R4LmRlZmF1bHRfdmFsdWUgPyBjdHguZGVmYXVsdF92YWx1ZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZ3hfaHR0cF92YXJpYWJsZV9udWxsX3ZhbHVlOworCisgICAgaWYgKGN0eC5kbnNfd2lsZGNhcmRzLm5lbHRzKSB7CisKKyAgICAgICAgbmd4X3Fzb3J0KGN0eC5kbnNfd2lsZGNhcmRzLmVsdHMsIChzaXplX3QpIGN0eC5kbnNfd2lsZGNhcmRzLm5lbHRzLAorICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5neF9oYXNoX2tleV90KSwgbmd4X2h0dHBfbWFwX2NtcF9kbnNfd2lsZGNhcmRzKTsKKworICAgICAgICBoYXNoLmhhc2ggPSBOVUxMOworICAgICAgICBoYXNoLnRlbXBfcG9vbCA9IHBvb2w7CisKKyAgICAgICAgaWYgKG5neF9oYXNoX3dpbGRjYXJkX2luaXQoJmhhc2gsIGN0eC5kbnNfd2lsZGNhcmRzLmVsdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5kbnNfd2lsZGNhcmRzLm5lbHRzKQorICAgICAgICAgICAgIT0gTkdYX09LKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBtYXAtPmRuc193aWxkY2FyZHMgPSAobmd4X2hhc2hfd2lsZGNhcmRfdCAqKSBoYXNoLmhhc2g7CisgICAgfQorCisgICAgbmd4X2Rlc3Ryb3lfcG9vbChwb29sKTsKKworICAgIHJldHVybiBydjsKK30KKworCitzdGF0aWMgaW50IG5neF9saWJjX2NkZWNsCituZ3hfaHR0cF9tYXBfY21wX2Ruc193aWxkY2FyZHMoY29uc3Qgdm9pZCAqb25lLCBjb25zdCB2b2lkICp0d28pCit7CisgICAgbmd4X2hhc2hfa2V5X3QgICpmaXJzdCwgKnNlY29uZDsKKworICAgIGZpcnN0ID0gKG5neF9oYXNoX2tleV90ICopIG9uZTsKKyAgICBzZWNvbmQgPSAobmd4X2hhc2hfa2V5X3QgKikgdHdvOworCisgICAgcmV0dXJuIG5neF9zdHJjbXAoZmlyc3QtPmtleS5kYXRhLCBzZWNvbmQtPmtleS5kYXRhKTsKK30KKworCitzdGF0aWMgY2hhciAqCituZ3hfaHR0cF9tYXAobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmR1bW15LCB2b2lkICpjb25mKQoreworICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICBsZW47CisgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgKnZhbHVlLCBmaWxlLCAqbmFtZTsKKyAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgaSwgbiwga2V5OworICAgIG5neF9oYXNoX2tleV90ICAgICAgICAgICAgICptOworICAgIG5neF9odHRwX21hcF9jb25mX2N0eF90ICAgICpjdHg7CisgICAgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAgKnZhciwgKm9sZCwgKip2cDsKKyAgICB1X2NoYXIgICAgICAgICAgICAgICAgICAgICAgYnVmWzIwNDhdOworCisgICAgY3R4ID0gY2YtPmN0eDsKKworICAgIHZhbHVlID0gY2YtPmFyZ3MtPmVsdHM7CisKKyAgICBpZiAoY2YtPmFyZ3MtPm5lbHRzID09IDEKKyAgICAgICAgJiYgbmd4X3N0cmNtcCh2YWx1ZVswXS5kYXRhLCAiaG9zdG5hbWVzIikgPT0gMCkKKyAgICB7CisgICAgICAgIGN0eC0+aG9zdG5hbWVzID0gMTsKKyAgICAgICAgcmV0dXJuIE5HWF9DT05GX09LOworCisgICAgfSBlbHNlIGlmIChjZi0+YXJncy0+bmVsdHMgIT0gMikgeworICAgICAgICBuZ3hfY29uZl9sb2dfZXJyb3IoTkdYX0xPR19FTUVSRywgY2YsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBudW1iZXIgb2YgdGhlIG1hcCBwYXJhbWV0ZXJzIik7CisgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKworICAgIH0gZWxzZSBpZiAodmFsdWVbMF0ubGVuID09IDApIHsKKyAgICAgICAgbmd4X2NvbmZfbG9nX2Vycm9yKE5HWF9MT0dfRU1FUkcsIGNmLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgZmlyc3QgcGFyYW1ldGVyIik7CisgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICB9CisKKyAgICBpZiAobmd4X3N0cmNtcCh2YWx1ZVswXS5kYXRhLCAiaW5jbHVkZSIpID09IDApIHsKKyAgICAgICAgZmlsZSA9IHZhbHVlWzFdOworCisgICAgICAgIGlmIChuZ3hfY29uZl9mdWxsX25hbWUoY2YtPmN5Y2xlLCAmZmlsZSkgPT0gTkdYX0VSUk9SKXsKKyAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIG5neF9sb2dfZGVidWcxKE5HWF9MT0dfREVCVUdfQ09SRSwgY2YtPmxvZywgMCwgImluY2x1ZGUgJXMiLCBmaWxlLmRhdGEpOworCisgICAgICAgIHJldHVybiBuZ3hfY29uZl9wYXJzZShjZiwgJmZpbGUpOworICAgIH0KKworICAgIGtleSA9IDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgdmFsdWVbMV0ubGVuOyBpKyspIHsKKyAgICAgICAga2V5ID0gbmd4X2hhc2goa2V5LCB2YWx1ZVsxXS5kYXRhW2ldKTsKKyAgICB9CisKKyAgICBrZXkgJT0gTkdYX0hUVFBfTUFQX0hBU0g7CisKKyAgICB2cCA9IGN0eC0+dmFsdWVzX2hhc2hba2V5XS5lbHRzOworCisgICAgaWYgKHZwKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPnZhbHVlc19oYXNoW2tleV0ubmVsdHM7IGkrKykgeworICAgICAgICAgICAgaWYgKHZhbHVlWzFdLmxlbiAhPSAoc2l6ZV90KSB2cFtpXS0+bGVuKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChuZ3hfc3RybmNtcCh2YWx1ZVsxXS5kYXRhLCB2cFtpXS0+ZGF0YSwgdmFsdWVbMV0ubGVuKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgdmFyID0gdnBbaV07CisgICAgICAgICAgICAgICAgZ290byBmb3VuZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG5neF9hcnJheV9pbml0KCZjdHgtPnZhbHVlc19oYXNoW2tleV0sIGNmLT5wb29sLCA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgKikpCisgICAgICAgICAgICAhPSBOR1hfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZhciA9IG5neF9wYWxsb2MoY3R4LT5wb29sLCBzaXplb2Yobmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCkpOworICAgIGlmICh2YXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgfQorCisgICAgdmFyLT5sZW4gPSB2YWx1ZVsxXS5sZW47CisgICAgdmFyLT5kYXRhID0gbmd4X3BzdHJkdXAoY3R4LT5wb29sLCAmdmFsdWVbMV0pOworICAgIGlmICh2YXItPmRhdGEgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgfQorCisgICAgdmFyLT52YWxpZCA9IDE7CisgICAgdmFyLT5ub19jYWNoYWJsZSA9IDA7CisgICAgdmFyLT5ub3RfZm91bmQgPSAwOworCisgICAgdnAgPSBuZ3hfYXJyYXlfcHVzaCgmY3R4LT52YWx1ZXNfaGFzaFtrZXldKTsKKyAgICBpZiAodnAgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgfQorCisgICAgKnZwID0gdmFyOworCitmb3VuZDoKKworICAgIGlmICh2YWx1ZVswXS5kYXRhWzBdICE9ICcqJyB8fCBjdHgtPmhvc3RuYW1lcyA9PSAwKSB7CisKKyAgICAgICAgaWYgKG5neF9zdHJjbXAodmFsdWVbMF0uZGF0YSwgImRlZmF1bHQiKSAhPSAwKSB7CisKKyAgICAgICAgICAgIGlmICh2YWx1ZVswXS5sZW4gJiYgdmFsdWVbMF0uZGF0YVswXSA9PSAnIScpIHsKKyAgICAgICAgICAgICAgICB2YWx1ZVswXS5sZW4tLTsKKyAgICAgICAgICAgICAgICB2YWx1ZVswXS5kYXRhKys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGtleSA9IDA7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB2YWx1ZVswXS5sZW47IGkrKykgeworICAgICAgICAgICAgICAgIHZhbHVlWzBdLmRhdGFbaV0gPSBuZ3hfdG9sb3dlcih2YWx1ZVswXS5kYXRhW2ldKTsKKyAgICAgICAgICAgICAgICBrZXkgPSBuZ3hfaGFzaChrZXksIHZhbHVlWzBdLmRhdGFbaV0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBrZXkgJT0gTkdYX0hUVFBfTUFQX0hBU0g7CisKKyAgICAgICAgICAgIG5hbWUgPSBjdHgtPmtleXNfaGFzaFtrZXldLmVsdHM7CisKKyAgICAgICAgICAgIGlmIChuYW1lKSB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGN0eC0+a2V5c19oYXNoW2tleV0ubmVsdHM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVbMF0ubGVuICE9IG5hbWVbaV0ubGVuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChuZ3hfc3RybmNtcCh2YWx1ZVswXS5kYXRhLCBuYW1lW2ldLmRhdGEsIHZhbHVlWzBdLmxlbikKKyAgICAgICAgICAgICAgICAgICAgICAgID09IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG0gPSBjdHgtPmtleXMuZWx0czsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPmtleXMubmVsdHM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZ3hfc3RyY21wKHZhbHVlWzBdLmRhdGEsIG1baV0ua2V5LmRhdGEpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkID0gbVtpXS52YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVtpXS52YWx1ZSA9IHZhcjsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGR1cGxpY2F0ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKG5neF9hcnJheV9pbml0KCZjdHgtPmtleXNfaGFzaFtrZXldLCBjZi0+cG9vbCwgNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5neF9zdHJfdCkpCisgICAgICAgICAgICAgICAgICAgICE9IE5HWF9PSykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG5hbWUgPSBuZ3hfYXJyYXlfcHVzaCgmY3R4LT5rZXlzX2hhc2hba2V5XSk7CisgICAgICAgICAgICBpZiAobmFtZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAqbmFtZSA9IHZhbHVlWzBdOworCisgICAgICAgICAgICBtID0gbmd4X2FycmF5X3B1c2goJmN0eC0+a2V5cyk7CisgICAgICAgICAgICBpZiAobSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtLT5rZXkgPSB2YWx1ZVswXTsKKyAgICAgICAgICAgIG0tPmtleV9oYXNoID0gbmd4X2hhc2hfa2V5KHZhbHVlWzBdLmRhdGEsIHZhbHVlWzBdLmxlbik7CisgICAgICAgICAgICBtLT52YWx1ZSA9IHZhcjsKKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGN0eC0+ZGVmYXVsdF92YWx1ZSkgeworICAgICAgICAgICAgICAgIG9sZCA9IGN0eC0+ZGVmYXVsdF92YWx1ZTsKKyAgICAgICAgICAgICAgICBjdHgtPmRlZmF1bHRfdmFsdWUgPSB2YXI7CisKKyAgICAgICAgICAgICAgICBnb3RvIGR1cGxpY2F0ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY3R4LT5kZWZhdWx0X3ZhbHVlID0gdmFyOworICAgICAgICB9CisKKyAgICB9IGVsc2UgeworCisgICAgICAgIGlmICh2YWx1ZVswXS5sZW4gPCAzIHx8IHZhbHVlWzBdLmRhdGFbMV0gIT0gJy4nKSB7CisgICAgICAgICAgICBuZ3hfY29uZl9sb2dfZXJyb3IoTkdYX0xPR19FTUVSRywgY2YsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgRE5TIHdpbGRjYXJkIFwiJVZcIiIsICZ2YWx1ZVswXSk7CisgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBrZXkgPSAwOworCisgICAgICAgIGZvciAoaSA9IDI7IGkgPCB2YWx1ZVswXS5sZW47IGkrKykgeworICAgICAgICAgICAgdmFsdWVbMF0uZGF0YVtpXSA9IG5neF90b2xvd2VyKHZhbHVlWzBdLmRhdGFbaV0pOworICAgICAgICAgICAga2V5ID0gbmd4X2hhc2goa2V5LCB2YWx1ZVswXS5kYXRhW2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIGtleSAlPSBOR1hfSFRUUF9NQVBfSEFTSDsKKworICAgICAgICAvKiBjb252ZXJ0ICIqLmV4YW1wbGUuY29tIiBpbnRvICJjb20uZXhhbXBsZS5cMCIgKi8KKworICAgICAgICBsZW4gPSAwOworICAgICAgICBuID0gMDsKKworICAgICAgICBmb3IgKGkgPSB2YWx1ZVswXS5sZW4gLSAxOyBpOyBpLS0pIHsKKyAgICAgICAgICAgIGlmICh2YWx1ZVswXS5kYXRhW2ldID09ICcuJykgeworICAgICAgICAgICAgICAgIG5neF9tZW1jcHkoJmJ1ZltuXSwgJnZhbHVlWzBdLmRhdGFbaSArIDFdLCBsZW4pOworICAgICAgICAgICAgICAgIG4gKz0gbGVuOworICAgICAgICAgICAgICAgIGJ1ZltuKytdID0gJy4nOworICAgICAgICAgICAgICAgIGxlbiA9IDA7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxlbisrOworICAgICAgICB9CisKKyAgICAgICAgYnVmW25dID0gJ1wwJzsKKworICAgICAgICBuYW1lID0gY3R4LT5kbnNfaGFzaFtrZXldLmVsdHM7CisKKyAgICAgICAgaWYgKG5hbWUpIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPmRuc19oYXNoW2tleV0ubmVsdHM7IGkrKykgeworICAgICAgICAgICAgICAgIGlmICh2YWx1ZVswXS5sZW4gIT0gbmFtZVtpXS5sZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG5neF9zdHJuY21wKHZhbHVlWzBdLmRhdGEsIG5hbWVbaV0uZGF0YSwgdmFsdWVbMF0ubGVuKQorICAgICAgICAgICAgICAgICAgICA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbSA9IGN0eC0+ZG5zX3dpbGRjYXJkcy5lbHRzOworICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY3R4LT5kbnNfd2lsZGNhcmRzLm5lbHRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZ3hfc3RyY21wKGJ1ZiwgbVtpXS5rZXkuZGF0YSkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZCA9IG1baV0udmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVtpXS52YWx1ZSA9IHZhcjsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZHVwbGljYXRlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAobmd4X2FycmF5X2luaXQoJmN0eC0+ZG5zX2hhc2hba2V5XSwgY2YtPnBvb2wsIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5neF9zdHJfdCkpCisgICAgICAgICAgICAgICAgIT0gTkdYX09LKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG5hbWUgPSBuZ3hfYXJyYXlfcHVzaCgmY3R4LT5kbnNfaGFzaFtrZXldKTsKKyAgICAgICAgaWYgKG5hbWUgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgKm5hbWUgPSB2YWx1ZVswXTsKKworICAgICAgICBuZ3hfbWVtY3B5KHZhbHVlWzBdLmRhdGEsIGJ1ZiwgdmFsdWVbMF0ubGVuKTsKKyAgICAgICAgdmFsdWVbMF0ubGVuLS07CisKKyAgICAgICAgbSA9IG5neF9hcnJheV9wdXNoKCZjdHgtPmRuc193aWxkY2FyZHMpOworICAgICAgICBpZiAobSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBtLT5rZXkgPSB2YWx1ZVswXTsKKyAgICAgICAgbS0+a2V5X2hhc2ggPSAwOworICAgICAgICBtLT52YWx1ZSA9IHZhcjsKKyAgICB9CisKKyAgICByZXR1cm4gTkdYX0NPTkZfT0s7CisKK2R1cGxpY2F0ZToKKworICAgIG5neF9jb25mX2xvZ19lcnJvcihOR1hfTE9HX1dBUk4sIGNmLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAiZHVwbGljYXRlIHBhcmFtZXRlciBcIiVWXCIsIHZhbHVlOiBcIiVWXCIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgIm9sZCB2YWx1ZTogXCIlVlwiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlWzBdLCB2YXIsIG9sZCk7CisKKyAgICByZXR1cm4gTkdYX0NPTkZfT0s7Cit9CmRpZmYgLS1naXQgYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3Byb3h5X21vZHVsZS5jIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9wcm94eV9tb2R1bGUuYwppbmRleCBhZmFkYzE4Li5jMzlmMzIwIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3Byb3h5X21vZHVsZS5jCisrKyBiL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfcHJveHlfbW9kdWxlLmMKQEAgLTQyLDcgKzQyLDcgQEAKICAgICBuZ3hfYXJyYXlfdCAgICAgICAgICAgICAgICAgKmJvZHlfc2V0OwogICAgIG5neF9hcnJheV90ICAgICAgICAgICAgICAgICAqaGVhZGVyc19zZXRfbGVuOwogICAgIG5neF9hcnJheV90ICAgICAgICAgICAgICAgICAqaGVhZGVyc19zZXQ7Ci0gICAgbmd4X2hhc2hfdCAgICAgICAgICAgICAgICAgICpoZWFkZXJzX3NldF9oYXNoOworICAgIG5neF9oYXNoMF90ICAgICAgICAgICAgICAgICAqaGVhZGVyc19zZXRfaGFzaDsKIAogICAgIG5neF9hcnJheV90ICAgICAgICAgICAgICAgICAqaGVhZGVyc19zb3VyY2U7CiAgICAgbmd4X2FycmF5X3QgICAgICAgICAgICAgICAgICpoZWFkZXJzX25hbWVzOwpAQCAtMTg5Miw3ICsxODkyLDcgQEAKICAgICAqY29kZSA9ICh1aW50cHRyX3QpIE5VTEw7CiAKIAotICAgIGNvbmYtPmhlYWRlcnNfc2V0X2hhc2ggPSBuZ3hfcGNhbGxvYyhjZi0+cG9vbCwgc2l6ZW9mKG5neF9oYXNoX3QpKTsKKyAgICBjb25mLT5oZWFkZXJzX3NldF9oYXNoID0gbmd4X3BjYWxsb2MoY2YtPnBvb2wsIHNpemVvZihuZ3hfaGFzaDBfdCkpOwogICAgIGlmIChjb25mLT5oZWFkZXJzX3NldF9oYXNoID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgIH0KQEAgLTE5MDIsOCArMTkwMiw5IEBACiAgICAgY29uZi0+aGVhZGVyc19zZXRfaGFzaC0+YnVja2V0X3NpemUgPSBzaXplb2Yobmd4X3N0cl90KTsKICAgICBjb25mLT5oZWFkZXJzX3NldF9oYXNoLT5uYW1lID0gInByb3h5X2hlYWRlcnMiOwogCi0gICAgaWYgKG5neF9oYXNoX2luaXQoY29uZi0+aGVhZGVyc19zZXRfaGFzaCwgY2YtPnBvb2wsCi0gICAgICAgICAgICAgIGNvbmYtPmhlYWRlcnNfbmFtZXMtPmVsdHMsIGNvbmYtPmhlYWRlcnNfbmFtZXMtPm5lbHRzKSAhPSBOR1hfT0spCisgICAgaWYgKG5neF9oYXNoMF9pbml0KGNvbmYtPmhlYWRlcnNfc2V0X2hhc2gsIGNmLT5wb29sLAorICAgICAgICAgICAgICAgICAgICAgICBjb25mLT5oZWFkZXJzX25hbWVzLT5lbHRzLCBjb25mLT5oZWFkZXJzX25hbWVzLT5uZWx0cykKKyAgICAgICAgIT0gTkdYX09LKQogICAgIHsKICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfc3NpX2ZpbHRlcl9tb2R1bGUuYyBiL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfc3NpX2ZpbHRlcl9tb2R1bGUuYwppbmRleCBkZDBlOTJmLi5jOTg0ZjdlIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3NzaV9maWx0ZXJfbW9kdWxlLmMKKysrIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9zc2lfZmlsdGVyX21vZHVsZS5jCkBAIC0xODYsNiArMTg2LDEzIEBACiAgICAgICBvZmZzZXRvZihuZ3hfaHR0cF9zc2lfY29uZl90LCBtaW5fZmlsZV9jaHVuayksCiAgICAgICBOVUxMIH0sCiAKKyAgICB7IG5neF9zdHJpbmcoInNzaV92YWx1ZV9sZW5ndGgiKSwKKyAgICAgIE5HWF9IVFRQX01BSU5fQ09ORnxOR1hfSFRUUF9TUlZfQ09ORnxOR1hfSFRUUF9MT0NfQ09ORnxOR1hfQ09ORl9GTEFHLAorICAgICAgbmd4X2NvbmZfc2V0X3NpemVfc2xvdCwKKyAgICAgIE5HWF9IVFRQX0xPQ19DT05GX09GRlNFVCwKKyAgICAgIG9mZnNldG9mKG5neF9odHRwX3NzaV9jb25mX3QsIHZhbHVlX2xlbiksCisgICAgICBOVUxMIH0sCisKICAgICB7IG5neF9zdHJpbmcoInNzaV90eXBlcyIpLAogICAgICAgTkdYX0hUVFBfTUFJTl9DT05GfE5HWF9IVFRQX1NSVl9DT05GfE5HWF9IVFRQX0xPQ19DT05GfE5HWF9DT05GXzFNT1JFLAogICAgICAgbmd4X2h0dHBfc3NpX3R5cGVzLApAQCAtMTcyOCw3ICsxNzM1LDEzIEBACiAgICAgdmFsdWUgPSBwYXJhbXNbTkdYX0hUVFBfU1NJX0NPTkZJR19USU1FRk1UXTsKIAogICAgIGlmICh2YWx1ZSkgewotICAgICAgICBjdHgtPnRpbWVmbXQgPSAqdmFsdWU7CisgICAgICAgIGN0eC0+dGltZWZtdC5sZW4gPSB2YWx1ZS0+bGVuOworICAgICAgICBjdHgtPnRpbWVmbXQuZGF0YSA9IG5neF9wYWxsb2Moci0+cG9vbCwgdmFsdWUtPmxlbiArIDEpOworICAgICAgICBpZiAoY3R4LT50aW1lZm10LmRhdGEgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5HWF9IVFRQX1NTSV9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIG5neF9jcHlzdHJuKGN0eC0+dGltZWZtdC5kYXRhLCB2YWx1ZS0+ZGF0YSwgdmFsdWUtPmxlbiArIDEpOwogICAgIH0KIAogICAgIHZhbHVlID0gcGFyYW1zW05HWF9IVFRQX1NTSV9DT05GSUdfRVJSTVNHXTsKZGlmZiAtLWdpdCBhL3NyYy9odHRwL25neF9odHRwLmMgYi9zcmMvaHR0cC9uZ3hfaHR0cC5jCmluZGV4IDAyMzg5OTguLjQ0OWE0ZTkgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL25neF9odHRwLmMKKysrIGIvc3JjL2h0dHAvbmd4X2h0dHAuYwpAQCAtMzcxLDcgKzM3MSw3IEBACiAgICAgY21jZi0+aGVhZGVyc19pbl9oYXNoLmJ1Y2tldF9zaXplID0gc2l6ZW9mKG5neF9odHRwX2hlYWRlcl90KTsKICAgICBjbWNmLT5oZWFkZXJzX2luX2hhc2gubmFtZSA9ICJodHRwIGhlYWRlcnNfaW4iOwogCi0gICAgaWYgKG5neF9oYXNoX2luaXQoJmNtY2YtPmhlYWRlcnNfaW5faGFzaCwgY2YtPnBvb2wsIG5neF9odHRwX2hlYWRlcnNfaW4sIDApCisgICAgaWYgKG5neF9oYXNoMF9pbml0KCZjbWNmLT5oZWFkZXJzX2luX2hhc2gsIGNmLT5wb29sLCBuZ3hfaHR0cF9oZWFkZXJzX2luLCAwKQogICAgICAgICAhPSBOR1hfT0spCiAgICAgewogICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CkBAIC03NzAsMTAgKzc3MCwxMCBAQAogICAgICAgICB9CiAgICAgfQogCi0jaWYgKE5HWF9ERUJVRzApCisjaWYgMAogICAgIHsKICAgICB1X2NoYXIgICAgICBhZGRyZXNzWzIwXTsKLSAgICBuZ3hfdWludF90ICBwLCBhLCBubjsKKyAgICBuZ3hfdWludF90ICBwLCBhOwogCiAgICAgaW5fcG9ydCA9IGluX3BvcnRzLmVsdHM7CiAgICAgZm9yIChwID0gMDsgcCA8IGluX3BvcnRzLm5lbHRzOyBwKyspIHsKZGlmZiAtLWdpdCBhL3NyYy9odHRwL25neF9odHRwX2NvcmVfbW9kdWxlLmMgYi9zcmMvaHR0cC9uZ3hfaHR0cF9jb3JlX21vZHVsZS5jCmluZGV4IGMxMDBiZWUuLmU0MjAyM2IgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL25neF9odHRwX2NvcmVfbW9kdWxlLmMKKysrIGIvc3JjL2h0dHAvbmd4X2h0dHBfY29yZV9tb2R1bGUuYwpAQCAtMTY0LDYgKzE2NCwyMCBAQAogICAgICAgMCwKICAgICAgIE5VTEwgfSwKIAorICAgIHsgbmd4X3N0cmluZygidHlwZXNfaGFzaF9tYXhfc2l6ZSIpLAorICAgICAgTkdYX0hUVFBfTUFJTl9DT05GfE5HWF9IVFRQX1NSVl9DT05GfE5HWF9IVFRQX0xPQ19DT05GfE5HWF9DT05GX1RBS0UxLAorICAgICAgbmd4X2NvbmZfc2V0X251bV9zbG90LAorICAgICAgTkdYX0hUVFBfTE9DX0NPTkZfT0ZGU0VULAorICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfY29yZV9sb2NfY29uZl90LCB0eXBlc19oYXNoX21heF9zaXplKSwKKyAgICAgIE5VTEwgfSwKKworICAgIHsgbmd4X3N0cmluZygidHlwZXNfaGFzaF9idWNrZXRfc2l6ZSIpLAorICAgICAgTkdYX0hUVFBfTUFJTl9DT05GfE5HWF9IVFRQX1NSVl9DT05GfE5HWF9IVFRQX0xPQ19DT05GfE5HWF9DT05GX1RBS0UxLAorICAgICAgbmd4X2NvbmZfc2V0X251bV9zbG90LAorICAgICAgTkdYX0hUVFBfTE9DX0NPTkZfT0ZGU0VULAorICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfY29yZV9sb2NfY29uZl90LCB0eXBlc19oYXNoX2J1Y2tldF9zaXplKSwKKyAgICAgIE5VTEwgfSwKKwogICAgIHsgbmd4X3N0cmluZygidHlwZXMiKSwKICAgICAgIE5HWF9IVFRQX01BSU5fQ09ORnxOR1hfSFRUUF9TUlZfQ09ORnxOR1hfSFRUUF9MT0NfQ09ORgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfE5HWF9DT05GX0JMT0NLfE5HWF9DT05GX05PQVJHUywKQEAgLTg0OSw5ICs4NjMsOCBAQAogbmd4X2h0dHBfc2V0X2NvbnRlbnRfdHlwZShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpCiB7CiAgICAgdV9jaGFyICAgICAgICAgICAgICAgICAgICAgYywgKnAsICpleHRlbjsKLSAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICBrZXk7CisgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAqdHlwZTsKICAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICBpOwotICAgIG5neF9odHRwX3R5cGVfdCAgICAgICAgICAgKnR5cGU7CiAgICAgbmd4X2h0dHBfY29yZV9sb2NfY29uZl90ICAqY2xjZjsKIAogICAgIGNsY2YgPSBuZ3hfaHR0cF9nZXRfbW9kdWxlX2xvY19jb25mKHIsIG5neF9odHRwX2NvcmVfbW9kdWxlKTsKQEAgLTg3NiwxMSArODg5LDcgQEAKIAogICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByLT5leHRlbi5sZW47IGkrKykgewogICAgICAgICAgICAgICAgICAgICBjID0gci0+ZXh0ZW4uZGF0YVtpXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqcCsrID0gKHVfY2hhcikgKGMgfCAweDIwKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpwKysgPSBjOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICpwKysgPSBuZ3hfdG9sb3dlcihjKTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICByLT5leHRlbi5kYXRhID0gZXh0ZW47CkBAIC04ODksMjYgKzg5OCwxNyBAQAogICAgICAgICAgICAgci0+bG93X2Nhc2VfZXh0ZW4gPSAxOwogICAgICAgICB9CiAKLSAgICAgICAgbmd4X2h0dHBfdHlwZXNfaGFzaF9rZXkoa2V5LCByLT5leHRlbik7CisgICAgICAgIHR5cGUgPSBuZ3hfaGFzaF9maW5kKCZjbGNmLT50eXBlc19oYXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaGFzaF9rZXkoci0+ZXh0ZW4uZGF0YSwgci0+ZXh0ZW4ubGVuKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+ZXh0ZW4uZGF0YSwgci0+ZXh0ZW4ubGVuKTsKIAotICAgICAgICB0eXBlID0gY2xjZi0+dHlwZXNba2V5XS5lbHRzOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2xjZi0+dHlwZXNba2V5XS5uZWx0czsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoci0+ZXh0ZW4ubGVuICE9IHR5cGVbaV0uZXh0ZW4ubGVuKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChuZ3hfbWVtY21wKHItPmV4dGVuLmRhdGEsIHR5cGVbaV0uZXh0ZW4uZGF0YSwgci0+ZXh0ZW4ubGVuKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByLT5oZWFkZXJzX291dC5jb250ZW50X3R5cGUgPSB0eXBlW2ldLnR5cGU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9CisgICAgICAgIGlmICh0eXBlKSB7CisgICAgICAgICAgICByLT5oZWFkZXJzX291dC5jb250ZW50X3R5cGUgPSAqdHlwZTsKKyAgICAgICAgICAgIHJldHVybiBOR1hfT0s7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoci0+aGVhZGVyc19vdXQuY29udGVudF90eXBlLmxlbiA9PSAwKSB7Ci0gICAgICAgIHItPmhlYWRlcnNfb3V0LmNvbnRlbnRfdHlwZT0gY2xjZi0+ZGVmYXVsdF90eXBlOwotICAgIH0KKyAgICByLT5oZWFkZXJzX291dC5jb250ZW50X3R5cGUgPSBjbGNmLT5kZWZhdWx0X3R5cGU7CiAKICAgICByZXR1cm4gTkdYX09LOwogfQpAQCAtMTYzNiwzOSArMTYzNiw1NSBAQAogewogICAgIG5neF9odHRwX2NvcmVfbG9jX2NvbmZfdCAqbGNmID0gY29uZjsKIAotICAgIHVpbnQzMl90ICAgICAgICAgIGtleTsKLSAgICBuZ3hfdWludF90ICAgICAgICBpOwotICAgIG5neF9zdHJfdCAgICAgICAgKnZhbHVlOwotICAgIG5neF9odHRwX3R5cGVfdCAgKnR5cGU7CisgICAgbmd4X3N0cl90ICAgICAgICp2YWx1ZSwgKmNvbnRlbnRfdHlwZSwgKm9sZDsKKyAgICBuZ3hfdWludF90ICAgICAgIGksIG47CisgICAgbmd4X2hhc2hfa2V5X3QgICp0eXBlOwogCiAgICAgaWYgKGxjZi0+dHlwZXMgPT0gTlVMTCkgewotICAgICAgICBsY2YtPnR5cGVzID0gbmd4X3BhbGxvYyhjZi0+cG9vbCwgTkdYX0hUVFBfVFlQRVNfSEFTSF9QUklNRQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihuZ3hfYXJyYXlfdCkpOworICAgICAgICBsY2YtPnR5cGVzID0gbmd4X2FycmF5X2NyZWF0ZShjZi0+cG9vbCwgNjQsIHNpemVvZihuZ3hfaGFzaF9rZXlfdCkpOwogICAgICAgICBpZiAobGNmLT50eXBlcyA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgICAgIH0KKyAgICB9CiAKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IE5HWF9IVFRQX1RZUEVTX0hBU0hfUFJJTUU7IGkrKykgewotICAgICAgICAgICAgaWYgKG5neF9hcnJheV9pbml0KCZsY2YtPnR5cGVzW2ldLCBjZi0+cG9vbCwgNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5neF9odHRwX3R5cGVfdCkpID09IE5HWF9FUlJPUikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICBjb250ZW50X3R5cGUgPSBuZ3hfcGFsbG9jKGNmLT5wb29sLCBzaXplb2Yobmd4X3N0cl90KSk7CisgICAgaWYgKGNvbnRlbnRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICB9CiAKICAgICB2YWx1ZSA9IGNmLT5hcmdzLT5lbHRzOworICAgICpjb250ZW50X3R5cGUgPSB2YWx1ZVswXTsKIAogICAgIGZvciAoaSA9IDE7IGkgPCBjZi0+YXJncy0+bmVsdHM7IGkrKykgewotICAgICAgICBuZ3hfaHR0cF90eXBlc19oYXNoX2tleShrZXksIHZhbHVlW2ldKTsKIAotICAgICAgICB0eXBlID0gbmd4X2FycmF5X3B1c2goJmxjZi0+dHlwZXNba2V5XSk7CisgICAgICAgIGZvciAobiA9IDA7IG4gPCB2YWx1ZVtpXS5sZW47IG4rKykgeworICAgICAgICAgICAgdmFsdWVbaV0uZGF0YVtuXSA9IG5neF90b2xvd2VyKHZhbHVlW2ldLmRhdGFbbl0pOworICAgICAgICB9CisKKyAgICAgICAgdHlwZSA9IGxjZi0+dHlwZXMtPmVsdHM7CisgICAgICAgIGZvciAobiA9IDA7IG4gPCBsY2YtPnR5cGVzLT5uZWx0czsgbisrKSB7CisgICAgICAgICAgICBpZiAobmd4X3N0cmNtcCh2YWx1ZVtpXS5kYXRhLCB0eXBlW25dLmtleS5kYXRhKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgb2xkID0gdHlwZVtuXS52YWx1ZTsKKyAgICAgICAgICAgICAgICB0eXBlW25dLnZhbHVlID0gY29udGVudF90eXBlOworCisgICAgICAgICAgICAgICAgbmd4X2NvbmZfbG9nX2Vycm9yKE5HWF9MT0dfV0FSTiwgY2YsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkdXBsaWNhdGUgZXh0ZW50aW9uIFwiJVZcIiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udGVudCB0eXBlOiBcIiVWXCIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9sZCBjb250ZW50IHR5cGU6IFwiJVZcIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZVtpXSwgY29udGVudF90eXBlLCBvbGQpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICB0eXBlID0gbmd4X2FycmF5X3B1c2gobGNmLT50eXBlcyk7CiAgICAgICAgIGlmICh0eXBlID09IE5VTEwpIHsKICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICAgICAgfQogCi0gICAgICAgIHR5cGUtPmV4dGVuID0gdmFsdWVbaV07Ci0gICAgICAgIHR5cGUtPnR5cGUgPSB2YWx1ZVswXTsKKyAgICAgICAgdHlwZS0+a2V5ID0gdmFsdWVbaV07CisgICAgICAgIHR5cGUtPmtleV9oYXNoID0gbmd4X2hhc2hfa2V5KHZhbHVlW2ldLmRhdGEsIHZhbHVlW2ldLmxlbik7CisgICAgICAgIHR5cGUtPnZhbHVlID0gY29udGVudF90eXBlOwogICAgIH0KIAogICAgIHJldHVybiBOR1hfQ09ORl9PSzsKQEAgLTE5MDUsMjkgKzE5MjEsMzQgQEAKICAgICBsY2YtPnBvcnRfaW5fcmVkaXJlY3QgPSBOR1hfQ09ORl9VTlNFVDsKICAgICBsY2YtPm1zaWVfcGFkZGluZyA9IE5HWF9DT05GX1VOU0VUOwogICAgIGxjZi0+bG9nX25vdF9mb3VuZCA9IE5HWF9DT05GX1VOU0VUOworICAgIGxjZi0+dHlwZXNfaGFzaF9tYXhfc2l6ZSA9IE5HWF9DT05GX1VOU0VUX1VJTlQ7CisgICAgbGNmLT50eXBlc19oYXNoX2J1Y2tldF9zaXplID0gTkdYX0NPTkZfVU5TRVRfVUlOVDsKIAogICAgIHJldHVybiBsY2Y7CiB9CiAKIAotc3RhdGljIG5neF9odHRwX3R5cGVfdCBuZ3hfaHR0cF9jb3JlX2RlZmF1bHRfdHlwZXNbXSA9IHsKLSAgICB7IG5neF9zdHJpbmcoImh0bWwiKSwgbmd4X3N0cmluZygidGV4dC9odG1sIikgfSwKLSAgICB7IG5neF9zdHJpbmcoImdpZiIpLCBuZ3hfc3RyaW5nKCJpbWFnZS9naWYiKSB9LAotICAgIHsgbmd4X3N0cmluZygianBnIiksIG5neF9zdHJpbmcoImltYWdlL2pwZWciKSB9LAotICAgIHsgbmd4X251bGxfc3RyaW5nLCBuZ3hfbnVsbF9zdHJpbmcgfQorc3RhdGljIG5neF9zdHJfdCAgbmd4X2h0dHBfY29yZV90ZXh0X2h0bWxfdHlwZSA9IG5neF9zdHJpbmcoInRleHQvaHRtbCIpOworc3RhdGljIG5neF9zdHJfdCAgbmd4X2h0dHBfY29yZV9pbWFnZV9naWZfdHlwZSA9IG5neF9zdHJpbmcoImltYWdlL2dpZiIpOworc3RhdGljIG5neF9zdHJfdCAgbmd4X2h0dHBfY29yZV9pbWFnZV9qcGVnX3R5cGUgPSBuZ3hfc3RyaW5nKCJpbWFnZS9qcGVnIik7CisKK3N0YXRpYyBuZ3hfaGFzaF9rZXlfdCAgbmd4X2h0dHBfY29yZV9kZWZhdWx0X3R5cGVzW10gPSB7CisgICAgeyBuZ3hfc3RyaW5nKCJodG1sIiksIDAsICZuZ3hfaHR0cF9jb3JlX3RleHRfaHRtbF90eXBlIH0sCisgICAgeyBuZ3hfc3RyaW5nKCJnaWYiKSwgMCwgJm5neF9odHRwX2NvcmVfaW1hZ2VfZ2lmX3R5cGUgfSwKKyAgICB7IG5neF9zdHJpbmcoImpwZyIpLCAwLCAmbmd4X2h0dHBfY29yZV9pbWFnZV9qcGVnX3R5cGUgfSwKKyAgICB7IG5neF9udWxsX3N0cmluZywgMCwgTlVMTCB9CiB9OwogCiAKIHN0YXRpYyBjaGFyICoKLW5neF9odHRwX2NvcmVfbWVyZ2VfbG9jX2NvbmYobmd4X2NvbmZfdCAqY2YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwYXJlbnQsIHZvaWQgKmNoaWxkKQorbmd4X2h0dHBfY29yZV9tZXJnZV9sb2NfY29uZihuZ3hfY29uZl90ICpjZiwgdm9pZCAqcGFyZW50LCB2b2lkICpjaGlsZCkKIHsKICAgICBuZ3hfaHR0cF9jb3JlX2xvY19jb25mX3QgKnByZXYgPSBwYXJlbnQ7CiAgICAgbmd4X2h0dHBfY29yZV9sb2NfY29uZl90ICpjb25mID0gY2hpbGQ7CiAKLSAgICB1aW50MzJfdCAgICAgICAgICBrZXk7CiAgICAgbmd4X3VpbnRfdCAgICAgICAgaTsKLSAgICBuZ3hfaHR0cF90eXBlX3QgICp0eXBlOworICAgIG5neF9oYXNoX2tleV90ICAgKnR5cGU7CisgICAgbmd4X2hhc2hfaW5pdF90ICAgdHlwZXNfaGFzaDsKIAogICAgIG5neF9jb25mX21lcmdlX3N0cl92YWx1ZShjb25mLT5yb290LCBwcmV2LT5yb290LCAiaHRtbCIpOwogCkBAIC0xOTM5LDM2ICsxOTYwLDc3IEBACiAgICAgICAgIGNvbmYtPnBvc3RfYWN0aW9uID0gcHJldi0+cG9zdF9hY3Rpb247CiAgICAgfQogCi0gICAgaWYgKGNvbmYtPnR5cGVzID09IE5VTEwpIHsKLSAgICAgICAgaWYgKHByZXYtPnR5cGVzKSB7Ci0gICAgICAgICAgICBjb25mLT50eXBlcyA9IHByZXYtPnR5cGVzOworICAgIG5neF9jb25mX21lcmdlX3Vuc2lnbmVkX3ZhbHVlKGNvbmYtPnR5cGVzX2hhc2hfbWF4X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldi0+dHlwZXNfaGFzaF9tYXhfc2l6ZSwgNTEyKTsKIAotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29uZi0+dHlwZXMgPSBuZ3hfcGFsbG9jKGNmLT5wb29sLCBOR1hfSFRUUF9UWVBFU19IQVNIX1BSSU1FCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2l6ZW9mKG5neF9hcnJheV90KSk7Ci0gICAgICAgICAgICBpZiAoY29uZi0+dHlwZXMgPT0gTlVMTCkgeworICAgIG5neF9jb25mX21lcmdlX3Vuc2lnbmVkX3ZhbHVlKGNvbmYtPnR5cGVzX2hhc2hfYnVja2V0X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldi0+dHlwZXNfaGFzaF9idWNrZXRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfY2FjaGVsaW5lX3NpemUpOworCisgICAgY29uZi0+dHlwZXNfaGFzaF9idWNrZXRfc2l6ZSA9IG5neF9hbGlnbihjb25mLT50eXBlc19oYXNoX2J1Y2tldF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2NhY2hlbGluZV9zaXplKTsKKworICAgIC8qCisgICAgICogdGhlIHNwZWNpYWwgaGFuZGxpbmcgdGhlICJ0eXBlcyIgZGlyZWN0aXZlIGluIHRoZSAiaHR0cCIgc2VjdGlvbgorICAgICAqIHRvIGluaGVyaXQgdGhlIGh0dHAncyBjb25mLT50eXBlc19oYXNoIHRvIGFsbCBzZXJ2ZXJzCisgICAgICovCisKKyAgICBpZiAocHJldi0+dHlwZXMgJiYgcHJldi0+dHlwZXNfaGFzaC5idWNrZXRzID09IE5VTEwpIHsKKworICAgICAgICB0eXBlc19oYXNoLmhhc2ggPSAmcHJldi0+dHlwZXNfaGFzaDsKKyAgICAgICAgdHlwZXNfaGFzaC5rZXkgPSBuZ3hfaGFzaF9rZXlfbGM7CisgICAgICAgIHR5cGVzX2hhc2gubWF4X3NpemUgPSBjb25mLT50eXBlc19oYXNoX21heF9zaXplOworICAgICAgICB0eXBlc19oYXNoLmJ1Y2tldF9zaXplID0gY29uZi0+dHlwZXNfaGFzaF9idWNrZXRfc2l6ZTsKKyAgICAgICAgdHlwZXNfaGFzaC5uYW1lID0gIm1pbWVfdHlwZXMiOworICAgICAgICB0eXBlc19oYXNoLnBvb2wgPSBjZi0+cG9vbDsKKyAgICAgICAgdHlwZXNfaGFzaC50ZW1wX3Bvb2wgPSBOVUxMOworCisgICAgICAgIGlmIChuZ3hfaGFzaF9pbml0KCZ0eXBlc19oYXNoLCBwcmV2LT50eXBlcy0+ZWx0cywgcHJldi0+dHlwZXMtPm5lbHRzKQorICAgICAgICAgICAgIT0gTkdYX09LKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY29uZi0+dHlwZXMgPT0gTlVMTCkgeworICAgICAgICBjb25mLT50eXBlcyA9IHByZXYtPnR5cGVzOworICAgICAgICBjb25mLT50eXBlc19oYXNoID0gcHJldi0+dHlwZXNfaGFzaDsKKyAgICB9CisKKyAgICBpZiAoY29uZi0+dHlwZXMgPT0gTlVMTCkgeworICAgICAgICBjb25mLT50eXBlcyA9IG5neF9hcnJheV9jcmVhdGUoY2YtPnBvb2wsIDQsIHNpemVvZihuZ3hfaGFzaF9rZXlfdCkpOworICAgICAgICBpZiAoY29uZi0+dHlwZXMgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpID0gMDsgbmd4X2h0dHBfY29yZV9kZWZhdWx0X3R5cGVzW2ldLmtleS5sZW47IGkrKykgeworICAgICAgICAgICAgdHlwZSA9IG5neF9hcnJheV9wdXNoKGNvbmYtPnR5cGVzKTsKKyAgICAgICAgICAgIGlmICh0eXBlID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOR1hfSFRUUF9UWVBFU19IQVNIX1BSSU1FOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAobmd4X2FycmF5X2luaXQoJmNvbmYtPnR5cGVzW2ldLCBjZi0+cG9vbCwgNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5neF9odHRwX3R5cGVfdCkpID09IE5HWF9FUlJPUikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICB0eXBlLT5rZXkgPSBuZ3hfaHR0cF9jb3JlX2RlZmF1bHRfdHlwZXNbaV0ua2V5OworICAgICAgICAgICAgdHlwZS0+a2V5X2hhc2ggPQorICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaGFzaF9rZXlfbGMobmd4X2h0dHBfY29yZV9kZWZhdWx0X3R5cGVzW2ldLmtleS5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfY29yZV9kZWZhdWx0X3R5cGVzW2ldLmtleS5sZW4pOworICAgICAgICAgICAgdHlwZS0+dmFsdWUgPSBuZ3hfaHR0cF9jb3JlX2RlZmF1bHRfdHlwZXNbaV0udmFsdWU7CisgICAgICAgIH0KKyAgICB9CiAKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IG5neF9odHRwX2NvcmVfZGVmYXVsdF90eXBlc1tpXS5leHRlbi5sZW47IGkrKykgewotICAgICAgICAgICAgICAgIG5neF9odHRwX3R5cGVzX2hhc2hfa2V5KGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9jb3JlX2RlZmF1bHRfdHlwZXNbaV0uZXh0ZW4pOworICAgIGlmIChjb25mLT50eXBlc19oYXNoLmJ1Y2tldHMgPT0gTlVMTCkgewogCi0gICAgICAgICAgICAgICAgdHlwZSA9IG5neF9hcnJheV9wdXNoKCZjb25mLT50eXBlc1trZXldKTsKLSAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgIHR5cGVzX2hhc2guaGFzaCA9ICZjb25mLT50eXBlc19oYXNoOworICAgICAgICB0eXBlc19oYXNoLmtleSA9IG5neF9oYXNoX2tleV9sYzsKKyAgICAgICAgdHlwZXNfaGFzaC5tYXhfc2l6ZSA9IGNvbmYtPnR5cGVzX2hhc2hfbWF4X3NpemU7CisgICAgICAgIHR5cGVzX2hhc2guYnVja2V0X3NpemUgPSBjb25mLT50eXBlc19oYXNoX2J1Y2tldF9zaXplOworICAgICAgICB0eXBlc19oYXNoLm5hbWUgPSAibWltZV90eXBlcyI7CisgICAgICAgIHR5cGVzX2hhc2gucG9vbCA9IGNmLT5wb29sOworICAgICAgICB0eXBlc19oYXNoLnRlbXBfcG9vbCA9IE5VTEw7CiAKLSAgICAgICAgICAgICAgICAqdHlwZSA9IG5neF9odHRwX2NvcmVfZGVmYXVsdF90eXBlc1tpXTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKG5neF9oYXNoX2luaXQoJnR5cGVzX2hhc2gsIGNvbmYtPnR5cGVzLT5lbHRzLCBjb25mLT50eXBlcy0+bmVsdHMpCisgICAgICAgICAgICAhPSBOR1hfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICAgICAgfQogICAgIH0KIApAQCAtMjExNSw2ICsyMTc3LDcgQEAKICAgICBpZiAobmd4X3N0cmNtcCh2YWx1ZVsyXS5kYXRhLCAiZGVmYXVsdCIpID09IDApIHsKICAgICAgICAgbHMtPmNvbmYuZGVmYXVsdF9zZXJ2ZXIgPSAxOwogICAgICAgICBuID0gMzsKKwogICAgIH0gZWxzZSB7CiAgICAgICAgIG4gPSAyOwogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9odHRwL25neF9odHRwX2NvcmVfbW9kdWxlLmggYi9zcmMvaHR0cC9uZ3hfaHR0cF9jb3JlX21vZHVsZS5oCmluZGV4IGU5Yzk5NGQuLjBkOGFlNzQgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL25neF9odHRwX2NvcmVfbW9kdWxlLmgKKysrIGIvc3JjL2h0dHAvbmd4X2h0dHBfY29yZV9tb2R1bGUuaApAQCAtNzAsOCArNzAsOCBAQAogCiAgICAgbmd4X2h0dHBfcGhhc2VfdCAgICAgICAgICAgcGhhc2VzW05HWF9IVFRQX0xPR19QSEFTRSArIDFdOwogCi0gICAgbmd4X2hhc2hfdCAgICAgICAgICAgICAgICAgaGVhZGVyc19pbl9oYXNoOwotICAgIG5neF9oYXNoX3QgICAgICAgICAgICAgICAgIHZhcmlhYmxlc19oYXNoOworICAgIG5neF9oYXNoMF90ICAgICAgICAgICAgICAgIGhlYWRlcnNfaW5faGFzaDsKKyAgICBuZ3hfaGFzaDBfdCAgICAgICAgICAgICAgICB2YXJpYWJsZXNfaGFzaDsKIAogICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgIHNlcnZlcl9uYW1lc19oYXNoOwogICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgIHNlcnZlcl9uYW1lc19oYXNoX3RocmVzaG9sZDsKQEAgLTE1NCwyMyArMTU0LDYgQEAKICAgICAgICAgfQogCiAKLSNkZWZpbmUgTkdYX0hUVFBfVFlQRVNfSEFTSF9QUklNRSAgMTMKLQotI2RlZmluZSBuZ3hfaHR0cF90eXBlc19oYXNoX2tleShrZXksIGV4dCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBuZ3hfdWludF90ICBuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgZm9yIChrZXkgPSAwLCBuID0gMDsgbiA8IGV4dC5sZW47IG4rKykgeyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICBrZXkgKz0gZXh0LmRhdGFbbl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAga2V5ICU9IE5HWF9IVFRQX1RZUEVTX0hBU0hfUFJJTUU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgfQotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgbmd4X3N0cl90ICAgICBleHRlbjsKLSAgICBuZ3hfc3RyX3QgICAgIHR5cGU7Ci19IG5neF9odHRwX3R5cGVfdDsKLQotCiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgbmd4X2ludF90ICAgICBzdGF0dXM7CiAgICAgbmd4X2ludF90ICAgICBvdmVyd3JpdGU7CkBAIC0yMDMsMTIgKzE4NiwxMyBAQAogCiAgICAgbmd4X2h0dHBfaGFuZGxlcl9wdCAgaGFuZGxlcjsKIAotICAgIG5neF9hcnJheV90ICAqdHlwZXM7Ci0gICAgbmd4X3N0cl90ICAgICBkZWZhdWx0X3R5cGU7Ci0KICAgICBuZ3hfc3RyX3QgICAgIHJvb3Q7ICAgICAgICAgICAgICAgICAgICAvKiByb290LCBhbGlhcyAqLwogICAgIG5neF9zdHJfdCAgICAgcG9zdF9hY3Rpb247CiAKKyAgICBuZ3hfYXJyYXlfdCAgKnR5cGVzOworICAgIG5neF9oYXNoX3QgICAgdHlwZXNfaGFzaDsKKyAgICBuZ3hfc3RyX3QgICAgIGRlZmF1bHRfdHlwZTsKKwogICAgIHNpemVfdCAgICAgICAgY2xpZW50X21heF9ib2R5X3NpemU7ICAgIC8qIGNsaWVudF9tYXhfYm9keV9zaXplICovCiAgICAgc2l6ZV90ICAgICAgICBjbGllbnRfYm9keV9idWZmZXJfc2l6ZTsgLyogY2xpZW50X2JvZHlfYnVmZmVyX3NpemUgKi8KICAgICBzaXplX3QgICAgICAgIHNlbmRfbG93YXQ7ICAgICAgICAgICAgICAvKiBzZW5kX2xvd2F0ICovCkBAIC0yNDEsNiArMjI1LDkgQEAKIAogICAgIG5neF9sb2dfdCAgICAqZXJyX2xvZzsKIAorICAgIG5neF91aW50X3QgICAgdHlwZXNfaGFzaF9tYXhfc2l6ZTsKKyAgICBuZ3hfdWludF90ICAgIHR5cGVzX2hhc2hfYnVja2V0X3NpemU7CisKICNpZiAwCiAgICAgbmd4X2h0dHBfY29yZV9sb2NfY29uZl90ICAqcHJldl9sb2NhdGlvbjsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbmd4X2h0dHBfcmVxdWVzdC5jIGIvc3JjL2h0dHAvbmd4X2h0dHBfcmVxdWVzdC5jCmluZGV4IGM2ZDZkNmYuLmJhOTNjMGQgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL25neF9odHRwX3JlcXVlc3QuYworKysgYi9zcmMvaHR0cC9uZ3hfaHR0cF9yZXF1ZXN0LmMKQEAgLTE1NjEsNiArMTU2MSwxMCBAQAogICAgICAgICBuZ3hfZGVsX3RpbWVyKHItPmNvbm5lY3Rpb24tPndyaXRlKTsKICAgICB9CiAKKyAgICBpZiAoci0+Y29ubmVjdGlvbi0+ZGVzdHJveWVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKICNpZiAwCiAgICAgaWYgKHItPmNvbm5lY3Rpb24tPnJlYWQtPnBlbmRpbmdfZW9mKSB7CiAjaWYgKE5HWF9IQVZFX0tRVUVVRSkKZGlmZiAtLWdpdCBhL3NyYy9odHRwL25neF9odHRwX3Vwc3RyZWFtLmMgYi9zcmMvaHR0cC9uZ3hfaHR0cF91cHN0cmVhbS5jCmluZGV4IGNmYWNhNmUuLmZjNTdmZTQgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL25neF9odHRwX3Vwc3RyZWFtLmMKKysrIGIvc3JjL2h0dHAvbmd4X2h0dHBfdXBzdHJlYW0uYwpAQCAtMjU0MSw3ICsyNTQxLDcgQEAKICAgICB1bWNmLT5oZWFkZXJzX2luX2hhc2guYnVja2V0X3NpemUgPSBzaXplb2Yobmd4X2h0dHBfdXBzdHJlYW1faGVhZGVyX3QpOwogICAgIHVtY2YtPmhlYWRlcnNfaW5faGFzaC5uYW1lID0gInVwc3RyZWFtX2hlYWRlcnNfaW4iOwogCi0gICAgaWYgKG5neF9oYXNoX2luaXQoJnVtY2YtPmhlYWRlcnNfaW5faGFzaCwgY2YtPnBvb2wsCisgICAgaWYgKG5neF9oYXNoMF9pbml0KCZ1bWNmLT5oZWFkZXJzX2luX2hhc2gsIGNmLT5wb29sLAogICAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX3Vwc3RyZWFtX2hlYWRlcnNfaW4sIDApICE9IE5HWF9PSykKICAgICB7CiAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKZGlmZiAtLWdpdCBhL3NyYy9odHRwL25neF9odHRwX3Vwc3RyZWFtLmggYi9zcmMvaHR0cC9uZ3hfaHR0cF91cHN0cmVhbS5oCmluZGV4IDIwMzI2NTkuLjFiNDc5NWEgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL25neF9odHRwX3Vwc3RyZWFtLmgKKysrIGIvc3JjL2h0dHAvbmd4X2h0dHBfdXBzdHJlYW0uaApAQCAtNDAsNyArNDAsNyBAQAogCiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgICBuZ3hfaGFzaF90ICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnNfaW5faGFzaDsKKyAgICBuZ3hfaGFzaDBfdCAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnNfaW5faGFzaDsKIH0gbmd4X2h0dHBfdXBzdHJlYW1fbWFpbl9jb25mX3Q7CiAKIApkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbmd4X2h0dHBfdmFyaWFibGVzLmMgYi9zcmMvaHR0cC9uZ3hfaHR0cF92YXJpYWJsZXMuYwppbmRleCA2ZTgzMWI1Li45MzA4MGFiIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9uZ3hfaHR0cF92YXJpYWJsZXMuYworKysgYi9zcmMvaHR0cC9uZ3hfaHR0cF92YXJpYWJsZXMuYwpAQCAtMTE2LDYgKzExNiwxMCBAQAogICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfcmVxdWVzdF90LCBhcmdzKSwKICAgICAgIE5HWF9IVFRQX1ZBUl9OT0NBQ0hBQkxFLCAwIH0sCiAKKyAgICB7IG5neF9zdHJpbmcoImFyZ3MiKSwgbmd4X2h0dHBfdmFyaWFibGVfcmVxdWVzdCwKKyAgICAgIG9mZnNldG9mKG5neF9odHRwX3JlcXVlc3RfdCwgYXJncyksCisgICAgICBOR1hfSFRUUF9WQVJfTk9DQUNIQUJMRSwgMCB9LAorCiAgICAgeyBuZ3hfc3RyaW5nKCJyZXF1ZXN0X2ZpbGVuYW1lIiksIG5neF9odHRwX3ZhcmlhYmxlX3JlcXVlc3RfZmlsZW5hbWUsIDAsCiAgICAgICBOR1hfSFRUUF9WQVJfTk9DQUNIQUJMRSwgMCB9LAogCkBAIC04NTcsNyArODYxLDcgQEAKICAgICBjbWNmLT52YXJpYWJsZXNfaGFzaC5idWNrZXRfc2l6ZSA9IHNpemVvZihuZ3hfaHR0cF92YXJpYWJsZV90KTsKICAgICBjbWNmLT52YXJpYWJsZXNfaGFzaC5uYW1lID0gImh0dHAgdmFyaWFibGVzIjsKIAotICAgIGlmIChuZ3hfaGFzaF9pbml0KCZjbWNmLT52YXJpYWJsZXNfaGFzaCwgY2YtPnBvb2wsCisgICAgaWYgKG5neF9oYXNoMF9pbml0KCZjbWNmLT52YXJpYWJsZXNfaGFzaCwgY2YtPnBvb2wsCiAgICAgICAgICAgICAgICAgICAgICAgY21jZi0+YWxsX3ZhcmlhYmxlcy5lbHRzLCBjbWNmLT5hbGxfdmFyaWFibGVzLm5lbHRzKQogICAgICAgICAhPSBOR1hfT0spCiAgICAgewpkaWZmIC0tZ2l0IGEvc3JjL2ltYXAvbmd4X2ltYXBfcHJveHlfbW9kdWxlLmMgYi9zcmMvaW1hcC9uZ3hfaW1hcF9wcm94eV9tb2R1bGUuYwppbmRleCA3ZWIxYjk0Li45N2RmMzgyIDEwMDY0NAotLS0gYS9zcmMvaW1hcC9uZ3hfaW1hcF9wcm94eV9tb2R1bGUuYworKysgYi9zcmMvaW1hcC9uZ3hfaW1hcF9wcm94eV9tb2R1bGUuYwpAQCAtNTY2LDE1ICs1NjYsMTUgQEAKIAogICAgIH0gZWxzZSB7CiAgICAgICAgIGlmIChldi0+d3JpdGUpIHsKLSAgICAgICAgICAgIHJlY3ZfYWN0aW9uID0gInByb3h5aW5nIGFuZCByZWFkaW5nIGZyb20gdXBzdHJlYW0iOwotICAgICAgICAgICAgc2VuZF9hY3Rpb24gPSAicHJveHlpbmcgYW5kIHNlbmRpbmcgdG8gY2xpZW50IjsKKyAgICAgICAgICAgIHJlY3ZfYWN0aW9uID0gInByb3h5aW5nIGFuZCByZWFkaW5nIGZyb20gY2xpZW50IjsKKyAgICAgICAgICAgIHNlbmRfYWN0aW9uID0gInByb3h5aW5nIGFuZCBzZW5kaW5nIHRvIHVwc3RyZWFtIjsKICAgICAgICAgICAgIHNyYyA9IHMtPmNvbm5lY3Rpb247CiAgICAgICAgICAgICBkc3QgPSBjOwogICAgICAgICAgICAgYiA9IHMtPmJ1ZmZlcjsKIAogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVjdl9hY3Rpb24gPSAicHJveHlpbmcgYW5kIHJlYWRpbmcgZnJvbSBjbGllbnQiOwotICAgICAgICAgICAgc2VuZF9hY3Rpb24gPSAicHJveHlpbmcgYW5kIHNlbmRpbmcgdG8gdXBzdHJlYW0iOworICAgICAgICAgICAgcmVjdl9hY3Rpb24gPSAicHJveHlpbmcgYW5kIHJlYWRpbmcgZnJvbSB1cHN0cmVhbSI7CisgICAgICAgICAgICBzZW5kX2FjdGlvbiA9ICJwcm94eWluZyBhbmQgc2VuZGluZyB0byBjbGllbnQiOwogICAgICAgICAgICAgc3JjID0gYzsKICAgICAgICAgICAgIGRzdCA9IHMtPmNvbm5lY3Rpb247CiAgICAgICAgICAgICBiID0gcy0+cHJveHktPmJ1ZmZlcjsKZGlmZiAtLWdpdCBhL3NyYy9vcy91bml4L25neF9hbGxvYy5jIGIvc3JjL29zL3VuaXgvbmd4X2FsbG9jLmMKaW5kZXggNzJjZjRlNC4uMjU2MDZlMiAxMDA2NDQKLS0tIGEvc3JjL29zL3VuaXgvbmd4X2FsbG9jLmMKKysrIGIvc3JjL29zL3VuaXgvbmd4X2FsbG9jLmMKQEAgLTgsNyArOCw4IEBACiAjaW5jbHVkZSA8bmd4X2NvcmUuaD4KIAogCi1pbnQgbmd4X3BhZ2VzaXplOworaW50ICAgICAgICAgbmd4X3BhZ2VzaXplOworbmd4X3VpbnRfdCAgbmd4X2NhY2hlbGluZV9zaXplOwogCiAKIHZvaWQgKgpkaWZmIC0tZ2l0IGEvc3JjL29zL3VuaXgvbmd4X2FsbG9jLmggYi9zcmMvb3MvdW5peC9uZ3hfYWxsb2MuaAppbmRleCA2NjU2MmExLi5hODg4MThlIDEwMDY0NAotLS0gYS9zcmMvb3MvdW5peC9uZ3hfYWxsb2MuaAorKysgYi9zcmMvb3MvdW5peC9uZ3hfYWxsb2MuaApAQCAtMzYsNyArMzYsOCBAQAogI2VuZGlmCiAKIAotZXh0ZXJuIGludCBuZ3hfcGFnZXNpemU7CitleHRlcm4gaW50ICAgICAgICAgbmd4X3BhZ2VzaXplOworZXh0ZXJuIG5neF91aW50X3QgIG5neF9jYWNoZWxpbmVfc2l6ZTsKIAogCiAjZW5kaWYgLyogX05HWF9BTExPQ19IX0lOQ0xVREVEXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL29zL3VuaXgvbmd4X2djY19hdG9taWNfeDg2LmggYi9zcmMvb3MvdW5peC9uZ3hfZ2NjX2F0b21pY194ODYuaAppbmRleCBiNDU4MDMyLi44ZTM0ODBkIDEwMDY0NAotLS0gYS9zcmMvb3MvdW5peC9uZ3hfZ2NjX2F0b21pY194ODYuaAorKysgYi9zcmMvb3MvdW5peC9uZ3hfZ2NjX2F0b21pY194ODYuaApAQCAtNjEsNyArNjEsMTYgQEAKICAqLwogCiAKLSNpZiAhKF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPD0gNykKKyNpZiAhKCggX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA8PSA3ICkgfHwgKCBfX0lOVEVMX0NPTVBJTEVSID49IDgwMCApKQorCisvKgorICogaWNjIDguMSBhbmQgOS4wIGNvbXBpbGUgYnJva2VuIGNvZGUgd2l0aCAtbWFyY2g9cGVudGl1bTQgb3B0aW9uOgorICogbmd4X2F0b21pY19mZXRjaF9hZGQoKSBhbHdheXMgcmV0dXJuIHRoZSBpbnB1dCAiYWRkIiB2YWx1ZSwKKyAqIHNvIHdlIHVzZSB0aGUgZ2NjIDIuNyB2ZXJzaW9uLgorICoKKyAqIGljYyA4LjEgYW5kIDkuMCB3aXRoIC1tYXJjaD1wZW50aXVtcHJvIG9wdGlvbiBvciBpY2MgNy4xIGNvbXBpbGUKKyAqIGNvcnJlY3QgY29kZS4KKyAqLwogCiBzdGF0aWMgbmd4X2lubGluZSBuZ3hfYXRvbWljX2ludF90CiBuZ3hfYXRvbWljX2ZldGNoX2FkZChuZ3hfYXRvbWljX3QgKnZhbHVlLCBuZ3hfYXRvbWljX2ludF90IGFkZCkKQEAgLTc3LDcgKzg2LDcgQEAKIH0KIAogCi0jZWxzZSAvKiAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA8PSA3KSAqLworI2Vsc2UKIAogLyoKICAqIGdjYyAyLjcgZG9lcyBub3Qgc3VwcG9ydCAiK3EiLCBzbyB3ZSBoYXZlIHRvIHVzZSB0aGUgZml4ZWQgJWVheCAoIj1hIiBhbmQKZGlmZiAtLWdpdCBhL3NyYy9vcy91bml4L25neF9saW51eF9zZW5kZmlsZV9jaGFpbi5jIGIvc3JjL29zL3VuaXgvbmd4X2xpbnV4X3NlbmRmaWxlX2NoYWluLmMKaW5kZXggZjM4MzBhOC4uMjI1ZjllMSAxMDA2NDQKLS0tIGEvc3JjL29zL3VuaXgvbmd4X2xpbnV4X3NlbmRmaWxlX2NoYWluLmMKKysrIGIvc3JjL29zL3VuaXgvbmd4X2xpbnV4X3NlbmRmaWxlX2NoYWluLmMKQEAgLTI2LDIxICsyNiwyMSBAQAogbmd4X2NoYWluX3QgKgogbmd4X2xpbnV4X3NlbmRmaWxlX2NoYWluKG5neF9jb25uZWN0aW9uX3QgKmMsIG5neF9jaGFpbl90ICppbiwgb2ZmX3QgbGltaXQpCiB7Ci0gICAgaW50ICAgICAgICAgICAgICByYywgdGNwX25vZGVsYXk7Ci0gICAgdV9jaGFyICAgICAgICAgICpwcmV2OwotICAgIG9mZl90ICAgICAgICAgICAgc2l6ZSwgc2VuZCwgcHJldl9zZW5kLCBhbGlnbmVkLCBzZW50LCBmcHJldjsKLSAgICBzaXplX3QgICAgICAgICAgIGZpbGVfc2l6ZTsKLSAgICBuZ3hfdWludF90ICAgICAgIGVpbnRyLCBjb21wbGV0ZTsKLSAgICBuZ3hfZXJyX3QgICAgICAgIGVycjsKLSAgICBuZ3hfYnVmX3QgICAgICAgKmZpbGU7Ci0gICAgbmd4X2FycmF5X3QgICAgICBoZWFkZXI7Ci0gICAgbmd4X2V2ZW50X3QgICAgICp3ZXY7Ci0gICAgbmd4X2NoYWluX3QgICAgICpjbDsKLSAgICBzdHJ1Y3QgaW92ZWMgICAgKmlvdiwgaGVhZGVyc1tOR1hfSEVBREVSU107CisgICAgaW50ICAgICAgICAgICAgcmMsIHRjcF9ub2RlbGF5OworICAgIG9mZl90ICAgICAgICAgIHNpemUsIHNlbmQsIHByZXZfc2VuZCwgYWxpZ25lZCwgc2VudCwgZnByZXY7CisgICAgdV9jaGFyICAgICAgICAqcHJldjsKKyAgICBzaXplX3QgICAgICAgICBmaWxlX3NpemU7CisgICAgbmd4X2Vycl90ICAgICAgZXJyOworICAgIG5neF9idWZfdCAgICAgKmZpbGU7CisgICAgbmd4X3VpbnRfdCAgICAgZWludHIsIGNvbXBsZXRlOworICAgIG5neF9hcnJheV90ICAgIGhlYWRlcjsKKyAgICBuZ3hfZXZlbnRfdCAgICp3ZXY7CisgICAgbmd4X2NoYWluX3QgICAqY2w7CisgICAgc3RydWN0IGlvdmVjICAqaW92LCBoZWFkZXJzW05HWF9IRUFERVJTXTsKICNpZiAoTkdYX0hBVkVfU0VOREZJTEU2NCkKLSAgICBvZmZfdCAgICAgICAgICAgIG9mZnNldDsKKyAgICBvZmZfdCAgICAgICAgICBvZmZzZXQ7CiAjZWxzZQotICAgIGludDMyX3QgICAgICAgICAgb2Zmc2V0OworICAgIGludDMyX3QgICAgICAgIG9mZnNldDsKICNlbmRpZgogCiAgICAgd2V2ID0gYy0+d3JpdGU7CkBAIC0yMzMsNiArMjMzLDEyIEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoZmlsZSkgeworI2lmIDEKKyAgICAgICAgICAgIGlmIChmaWxlX3NpemUgPT0gMCkgeworICAgICAgICAgICAgICAgIG5neF9kZWJ1Z19wb2ludCgpOworICAgICAgICAgICAgICAgIHJldHVybiBOR1hfQ0hBSU5fRVJST1I7CisgICAgICAgICAgICB9CisjZW5kaWYKICNpZiAoTkdYX0hBVkVfU0VOREZJTEU2NCkKICAgICAgICAgICAgIG9mZnNldCA9IGZpbGUtPmZpbGVfcG9zOwogI2Vsc2UKZGlmZiAtLWdpdCBhL3NyYy9vcy91bml4L25neF9wb3NpeF9pbml0LmMgYi9zcmMvb3MvdW5peC9uZ3hfcG9zaXhfaW5pdC5jCmluZGV4IDQ5NjhkZTUuLjgzZDVmMzAgMTAwNjQ0Ci0tLSBhL3NyYy9vcy91bml4L25neF9wb3NpeF9pbml0LmMKKysrIGIvc3JjL29zL3VuaXgvbmd4X3Bvc2l4X2luaXQuYwpAQCAtMzksNiArMzksNyBAQAogICAgIG5neF9pbml0X3NldHByb2N0aXRsZShsb2cpOwogCiAgICAgbmd4X3BhZ2VzaXplID0gZ2V0cGFnZXNpemUoKTsKKyAgICBuZ3hfY2FjaGVsaW5lX3NpemUgPSBOR1hfQ1BVX0NBQ0hFX0xJTkU7CiAKICAgICBpZiAobmd4X25jcHUgPT0gMCkgewogICAgICAgICBuZ3hfbmNwdSA9IDE7CmRpZmYgLS1naXQgYS9zcmMvb3MvdW5peC9uZ3hfcHJvY2Vzc19jeWNsZS5jIGIvc3JjL29zL3VuaXgvbmd4X3Byb2Nlc3NfY3ljbGUuYwppbmRleCAxNGJiZTgwLi5hMjYyYmE1IDEwMDY0NAotLS0gYS9zcmMvb3MvdW5peC9uZ3hfcHJvY2Vzc19jeWNsZS5jCisrKyBiL3NyYy9vcy91bml4L25neF9wcm9jZXNzX2N5Y2xlLmMKQEAgLTc4Nyw2ICs3ODcsMTcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCisgICAgICAgIGlmIChjY2YtPnJsaW1pdF9jb3JlICE9IE5HWF9DT05GX1VOU0VUKSB7CisgICAgICAgICAgICBybG10LnJsaW1fY3VyID0gKHJsaW1fdCkgY2NmLT5ybGltaXRfY29yZTsKKyAgICAgICAgICAgIHJsbXQucmxpbV9tYXggPSAocmxpbV90KSBjY2YtPnJsaW1pdF9jb3JlOworCisgICAgICAgICAgICBpZiAoc2V0cmxpbWl0KFJMSU1JVF9DT1JFLCAmcmxtdCkgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfRU1FUkcsIGN5Y2xlLT5sb2csIG5neF9lcnJubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXRybGltaXQoUkxJTUlUX0NPUkUsICVpKSBmYWlsZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2NmLT5ybGltaXRfY29yZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogI2lmZGVmIFJMSU1JVF9TSUdQRU5ESU5HCiAgICAgICAgIGlmIChjY2YtPnJsaW1pdF9zaWdwZW5kaW5nICE9IE5HWF9DT05GX1VOU0VUKSB7CiAgICAgICAgICAgICBybG10LnJsaW1fY3VyID0gKHJsaW1fdCkgY2NmLT5ybGltaXRfc2lncGVuZGluZzsKZGlmZiAtLWdpdCBhL3NyYy9vcy93aW4zMi9uZ3hfYWxsb2MuYyBiL3NyYy9vcy93aW4zMi9uZ3hfYWxsb2MuYwppbmRleCBhM2JjYTAyLi44MmVkZTcyIDEwMDY0NAotLS0gYS9zcmMvb3Mvd2luMzIvbmd4X2FsbG9jLmMKKysrIGIvc3JjL29zL3dpbjMyL25neF9hbGxvYy5jCkBAIC04LDcgKzgsOCBAQAogI2luY2x1ZGUgPG5neF9jb3JlLmg+CiAKIAotaW50IG5neF9wYWdlc2l6ZTsKK2ludCAgICAgICAgIG5neF9wYWdlc2l6ZTsKK25neF91aW50X3QgIG5neF9jYWNoZWxpbmVfc2l6ZTsKIAogCiB2b2lkICpuZ3hfYWxsb2Moc2l6ZV90IHNpemUsIG5neF9sb2dfdCAqbG9nKQpkaWZmIC0tZ2l0IGEvc3JjL29zL3dpbjMyL25neF9hbGxvYy5oIGIvc3JjL29zL3dpbjMyL25neF9hbGxvYy5oCmluZGV4IDZjZjY2OTEuLjlkOGQ4MzcgMTAwNjQ0Ci0tLSBhL3NyYy9vcy93aW4zMi9uZ3hfYWxsb2MuaAorKysgYi9zcmMvb3Mvd2luMzIvbmd4X2FsbG9jLmgKQEAgLTE4LDcgKzE4LDggQEAKICNkZWZpbmUgbmd4X2ZyZWUgICAgICAgICAgZnJlZQogI2RlZmluZSBuZ3hfbWVtYWxpZ24oYWxpZ25tZW50LCBzaXplLCBsb2cpICBuZ3hfYWxsb2Moc2l6ZSwgbG9nKQogCi1leHRlcm4gaW50IG5neF9wYWdlc2l6ZTsKK2V4dGVybiBpbnQgICAgICAgICBuZ3hfcGFnZXNpemU7CitleHRlcm4gbmd4X3VpbnRfdCAgbmd4X2NhY2hlbGluZV9zaXplOwogCiAKICNlbmRpZiAvKiBfTkdYX0FMTE9DX0hfSU5DTFVERURfICovCmRpZmYgLS1naXQgYS9zcmMvb3Mvd2luMzIvbmd4X3dpbjMyX2luaXQuYyBiL3NyYy9vcy93aW4zMi9uZ3hfd2luMzJfaW5pdC5jCmluZGV4IDljM2RmOTYuLmI0YWMyYjggMTAwNjQ0Ci0tLSBhL3NyYy9vcy93aW4zMi9uZ3hfd2luMzJfaW5pdC5jCisrKyBiL3NyYy9vcy93aW4zMi9uZ3hfd2luMzJfaW5pdC5jCkBAIC05OSw2ICs5OSw3IEBACiAgICAgR2V0U3lzdGVtSW5mbygmc2kpOwogICAgIG5neF9wYWdlc2l6ZSA9IHNpLmR3UGFnZVNpemU7CiAgICAgbmd4X25jcHUgPSBzaS5kd051bWJlck9mUHJvY2Vzc29yczsKKyAgICBuZ3hfY2FjaGVsaW5lX3NpemUgPSBOR1hfQ1BVX0NBQ0hFX0xJTkU7CiAKIAogICAgIC8qIGluaXQgV2luc29jayAqLwo=