ZGlmZiAtLWdpdCBhL2F1dG8vc291cmNlcyBiL2F1dG8vc291cmNlcwppbmRleCBmZDQ2ZWRkLi4xYTJhYmFkIDEwMDY0NAotLS0gYS9hdXRvL3NvdXJjZXMKKysrIGIvYXV0by9zb3VyY2VzCkBAIC0xMyw3ICsxMyw3IEBACiAgICAgICAgICAgIHNyYy9jb3JlL25neF9wYWxsb2MuaCBcCiAgICAgICAgICAgIHNyYy9jb3JlL25neF9hcnJheS5oIFwKICAgICAgICAgICAgc3JjL2NvcmUvbmd4X2xpc3QuaCBcCi0gICAgICAgICAgIHNyYy9jb3JlL25neF90YWJsZS5oIFwKKyAgICAgICAgICAgc3JjL2NvcmUvbmd4X2hhc2guaCBcCiAgICAgICAgICAgIHNyYy9jb3JlL25neF9idWYuaCBcCiAgICAgICAgICAgIHNyYy9jb3JlL25neF9zdHJpbmcuaCBcCiAgICAgICAgICAgIHNyYy9jb3JlL25neF9wYXJzZS5oIFwKQEAgLTM0LDYgKzM0LDcgQEAKICAgICAgICAgICAgc3JjL2NvcmUvbmd4X3BhbGxvYy5jIFwKICAgICAgICAgICAgc3JjL2NvcmUvbmd4X2FycmF5LmMgXAogICAgICAgICAgICBzcmMvY29yZS9uZ3hfbGlzdC5jIFwKKyAgICAgICAgICAgc3JjL2NvcmUvbmd4X2hhc2guYyBcCiAgICAgICAgICAgIHNyYy9jb3JlL25neF9idWYuYyBcCiAgICAgICAgICAgIHNyYy9jb3JlL25neF9vdXRwdXRfY2hhaW4uYyBcCiAgICAgICAgICAgIHNyYy9jb3JlL25neF9zdHJpbmcuYyBcCkBAIC0yNDMsNiArMjQ0LDcgQEAKICAgICAgICAgICAgc3JjL2h0dHAvbmd4X2h0dHBfY29yZV9tb2R1bGUuaCBcCiAgICAgICAgICAgIHNyYy9odHRwL25neF9odHRwX2NhY2hlLmggXAogICAgICAgICAgICBzcmMvaHR0cC9uZ3hfaHR0cF92YXJpYWJsZXMuaCBcCisgICAgICAgICAgIHNyYy9odHRwL25neF9odHRwX3NjcmlwdC5oIFwKICAgICAgICAgICAgc3JjL2h0dHAvbmd4X2h0dHBfdXBzdHJlYW0uaCBcCiAgICAgICAgICAgIHNyYy9odHRwL25neF9odHRwX2J1c3lfbG9jay5oIFwKICAgICAgICAgICAgc3JjL2h0dHAvbmd4X2h0dHBfbG9nX21vZHVsZS5oIgpAQCAtMjU4LDYgKzI2MCw3IEBACiAgICAgICAgICAgIHNyYy9odHRwL25neF9odHRwX2xvZ19tb2R1bGUuYyBcCiAgICAgICAgICAgIHNyYy9odHRwL25neF9odHRwX3JlcXVlc3RfYm9keS5jIFwKICAgICAgICAgICAgc3JjL2h0dHAvbmd4X2h0dHBfdmFyaWFibGVzLmMgXAorICAgICAgICAgICBzcmMvaHR0cC9uZ3hfaHR0cF9zY3JpcHQuYyBcCiAgICAgICAgICAgIHNyYy9odHRwL25neF9odHRwX3Vwc3RyZWFtLmMgXAogICAgICAgICAgICBzcmMvaHR0cC9uZ3hfaHR0cF9wYXJzZV90aW1lLmMgXAogICAgICAgICAgICBzcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3N0YXRpY19tb2R1bGUuYyBcCkBAIC0zMjAsNiArMzIzLDggQEAKIAogCiBIVFRQX1BST1hZX01PRFVMRT1uZ3hfaHR0cF9wcm94eV9tb2R1bGUKKyNIVFRQX1BST1hZX1NSQ1M9c3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9wcm94eV9tb2R1bGUuYworCiBIVFRQX1BST1hZX0lOQ1M9InNyYy9odHRwL21vZHVsZXMvcHJveHkiCiBIVFRQX1BST1hZX0RFUFM9c3JjL2h0dHAvbW9kdWxlcy9wcm94eS9uZ3hfaHR0cF9wcm94eV9oYW5kbGVyLmgKIEhUVFBfUFJPWFlfU1JDUz0ic3JjL2h0dHAvbW9kdWxlcy9wcm94eS9uZ3hfaHR0cF9wcm94eV9oYW5kbGVyLmMgXApkaWZmIC0tZ2l0IGEvY29uZi9taW1lLnR5cGVzIGIvY29uZi9taW1lLnR5cGVzCmluZGV4IGY4ZGY1MWMuLjM3ODVlNTMgMTAwNjQ0Ci0tLSBhL2NvbmYvbWltZS50eXBlcworKysgYi9jb25mL21pbWUudHlwZXMKQEAgLTQsMjEgKzQsMjcgQEAKICAgICB0ZXh0L3htbCAgICAgICAgICAgICAgICAgICAgICAgeG1sIHJzczsKICAgICB0ZXh0L2NzcyAgICAgICAgICAgICAgICAgICAgICAgY3NzOwogICAgIHRleHQvcGxhaW4gICAgICAgICAgICAgICAgICAgICB0eHQ7CisgICAgdGV4dC94LWNvbXBvbmVudCAgICAgICAgICAgICAgIGh0YzsKIAogICAgIGltYWdlL2dpZiAgICAgICAgICAgICAgICAgICAgICBnaWY7CiAgICAgaW1hZ2UvcG5nICAgICAgICAgICAgICAgICAgICAgIHBuZzsKICAgICBpbWFnZS9qcGVnICAgICAgICAgICAgICAgICAgICAganBlZyBqcGc7CiAgICAgaW1hZ2UveC1pY29uICAgICAgICAgICAgICAgICAgIGljbzsKKyAgICBpbWFnZS94LWpuZyAgICAgICAgICAgICAgICAgICAgam5nOwogCiAgICAgYXBwbGljYXRpb24vcGRmICAgICAgICAgICAgICAgIHBkZjsKICAgICBhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCAgc3dmOwogICAgIGFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCAgICAgICBqczsKKyAgICBhcHBsaWNhdGlvbi94LXJhci1jb21wcmVzc2VkICAgcmFyOworICAgIGFwcGxpY2F0aW9uL3gteHBpbnN0YWxsICAgICAgICB4cGk7CiAKICAgICBhdWRpby9tcGVnICAgICAgICAgICAgICAgICAgICAgbXAzOwogICAgIGF1ZGlvL3gtcmVhbGF1ZGlvICAgICAgICAgICAgICByYTsKIAogICAgIHZpZGVvL21wZWcgICAgICAgICAgICAgICAgICAgICBtcGVnIG1wZzsKICAgICB2aWRlby9xdWlja3RpbWUgICAgICAgICAgICAgICAgbW92OworICAgIHZpZGVvL3gtZmx2ICAgICAgICAgICAgICAgICAgICBmbHY7CiAgICAgdmlkZW8veC1tc3ZpZGVvICAgICAgICAgICAgICAgIGF2aTsKICAgICB2aWRlby94LW1zLXdtdiAgICAgICAgICAgICAgICAgd212OworICAgIHZpZGVvL3gtbW5nICAgICAgICAgICAgICAgICAgICBtbmc7CiB9CmRpZmYgLS1naXQgYS9kb2NzL3htbC9uZ2lueC9jaGFuZ2VzLnhtbCBiL2RvY3MveG1sL25naW54L2NoYW5nZXMueG1sCmluZGV4IDNlNDYyNmIuLjk0NDRiYWMgMTAwNjQ0Ci0tLSBhL2RvY3MveG1sL25naW54L2NoYW5nZXMueG1sCisrKyBiL2RvY3MveG1sL25naW54L2NoYW5nZXMueG1sCkBAIC05LDE0ICs5LDM3IEBACiA8dGl0bGUgbGFuZz0iZW4iPm5naW54IGNoYW5nZWxvZzwvdGl0bGU+CiAKIAorPGNoYW5nZXMgdmVyPSIwLjEuMjgiIGRhdGU9IjA4LjA0LjIwMDUiPgorCis8Y2hhbmdlIHR5cGU9ImJ1Z2ZpeCI+Cis8cGFyYSBsYW5nPSJydSI+CivQ0skg0NLPy9PJ0s/Xwc7JySDCz8zY28nIIMbByszP1yBuZ2lueCDTyczYzs8gzsHH0tXWwcwg0NLPw8XT08/SLgorPC9wYXJhPgorPHBhcmEgbGFuZz0iZW4iPgorbmdpbnggaG9ncyBDUFUgd2hpbGUgcHJveGluZyB0aGUgaHVnZSBmaWxlcy4KKzwvcGFyYT4KKzwvY2hhbmdlPgorCis8Y2hhbmdlIHR5cGU9ImJ1Z2ZpeCI+Cis8cGFyYSBsYW5nPSJydSI+CituZ2lueCDOxSDTz8LJ0sHM09EgZ2NjIDQuMCDOwSBMaW51eC4KKzwvcGFyYT4KKzxwYXJhIGxhbmc9ImVuIj4KK25naW54IGNvdWxkIG5vdCBiZSBidWlsdCBieSBnY2MgNC4wIG9uIExpbnV4LgorPC9wYXJhPgorPC9jaGFuZ2U+CisKKzwvY2hhbmdlcz4KKworCiA8Y2hhbmdlcyB2ZXI9IjAuMS4yNyIgZGF0ZT0iMjguMDMuMjAwNSI+CiAKIDxjaGFuZ2UgdHlwZT0iZmVhdHVyZSI+CiA8cGFyYSBsYW5nPSJydSI+Ci3QwdLBzcXU0iBibG9ja2VkINcgxMnSxcvUydfFIGludmFsaWRfcmVmZXJlcnMuCivQwdLBzcXU0iBibG9ja2VkINcgxMnSxcvUydfFIHZhbGlkX3JlZmVyZXJzLgogPC9wYXJhPgogPHBhcmEgbGFuZz0iZW4iPgotdGhlICJibG9ja2VkIiBwYXJhbWV0ZXIgb2YgdGhlICJpbnZhbGlkX3JlZmVyZXJzIiBkaXJlY3RpdmUuCit0aGUgImJsb2NrZWQiIHBhcmFtZXRlciBvZiB0aGUgInZhbGlkX3JlZmVyZXJzIiBkaXJlY3RpdmUuCiA8L3BhcmE+CiA8L2NoYW5nZT4KIApkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbmdpbnguaCBiL3NyYy9jb3JlL25naW54LmgKaW5kZXggZDA5N2NmNy4uOWZhMTQxYSAxMDA2NDQKLS0tIGEvc3JjL2NvcmUvbmdpbnguaAorKysgYi9zcmMvY29yZS9uZ2lueC5oCkBAIC04LDcgKzgsNyBAQAogI2RlZmluZSBfTkdJTlhfSF9JTkNMVURFRF8KIAogCi0jZGVmaW5lIE5HSU5YX1ZFUiAgICAgICAgICAibmdpbngvMC4xLjI3IgorI2RlZmluZSBOR0lOWF9WRVIgICAgICAgICAgIm5naW54LzAuMS4yOCIKIAogI2RlZmluZSBOR0lOWF9WQVIgICAgICAgICAgIk5HSU5YIgogI2RlZmluZSBOR1hfTkVXUElEX0VYVCAgICAgIi5uZXdiaW4iCmRpZmYgLS1naXQgYS9zcmMvY29yZS9uZ3hfYnVmLmMgYi9zcmMvY29yZS9uZ3hfYnVmLmMKaW5kZXggMmYwMzU2Zi4uNGMxYjFkNSAxMDA2NDQKLS0tIGEvc3JjL2NvcmUvbmd4X2J1Zi5jCisrKyBiL3NyYy9jb3JlL25neF9idWYuYwpAQCAtNDQsNiArNDQsMjcgQEAKIAogCiBuZ3hfY2hhaW5fdCAqCituZ3hfYWxsb2NfY2hhaW5fbGluayhuZ3hfcG9vbF90ICpwb29sKQoreworICAgIG5neF9jaGFpbl90ICAqY2w7CisKKyAgICBjbCA9IHBvb2wtPmNoYWluOworCisgICAgaWYgKGNsKSB7CisgICAgICAgIHBvb2wtPmNoYWluID0gY2wtPm5leHQ7CisgICAgICAgIHJldHVybiBjbDsKKyAgICB9CisKKyAgICBjbCA9IG5neF9wYWxsb2MocG9vbCwgc2l6ZW9mKG5neF9jaGFpbl90KSk7CisgICAgaWYgKGNsID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIGNsOworfQorCisKK25neF9jaGFpbl90ICoKIG5neF9jcmVhdGVfY2hhaW5fb2ZfYnVmcyhuZ3hfcG9vbF90ICpwb29sLCBuZ3hfYnVmc190ICpidWZzKQogewogICAgIHVfY2hhciAgICAgICAqcDsKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL25neF9idWYuaCBiL3NyYy9jb3JlL25neF9idWYuaAppbmRleCA3MjFiOWMyLi45NjM5NGY5IDEwMDY0NAotLS0gYS9zcmMvY29yZS9uZ3hfYnVmLmgKKysrIGIvc3JjL2NvcmUvbmd4X2J1Zi5oCkBAIC01NSw4ICs1NSw2IEBACiB9OwogCiAKLXR5cGVkZWYgc3RydWN0IG5neF9jaGFpbl9zICAgICAgIG5neF9jaGFpbl90OwotCiBzdHJ1Y3Qgbmd4X2NoYWluX3MgewogICAgIG5neF9idWZfdCAgICAqYnVmOwogICAgIG5neF9jaGFpbl90ICAqbmV4dDsKQEAgLTExOSw3ICsxMTcsMTEgQEAKICNkZWZpbmUgbmd4X2FsbG9jX2J1Zihwb29sKSAgbmd4X3BhbGxvYyhwb29sLCBzaXplb2Yobmd4X2J1Zl90KSkKICNkZWZpbmUgbmd4X2NhbGxvY19idWYocG9vbCkgbmd4X3BjYWxsb2MocG9vbCwgc2l6ZW9mKG5neF9idWZfdCkpCiAKLSNkZWZpbmUgbmd4X2FsbG9jX2NoYWluX2xpbmsocG9vbCkgbmd4X3BhbGxvYyhwb29sLCBzaXplb2Yobmd4X2NoYWluX3QpKQorbmd4X2NoYWluX3QgKm5neF9hbGxvY19jaGFpbl9saW5rKG5neF9wb29sX3QgKnBvb2wpOworI2RlZmluZSBuZ3hfZnJlZV9jaGFpbihwb29sLCBjbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2wtPm5leHQgPSBwb29sLT5jaGFpbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBwb29sLT5jaGFpbiA9IGNsCisKIAogCiBuZ3hfaW50X3Qgbmd4X291dHB1dF9jaGFpbihuZ3hfb3V0cHV0X2NoYWluX2N0eF90ICpjdHgsIG5neF9jaGFpbl90ICppbik7CmRpZmYgLS1naXQgYS9zcmMvY29yZS9uZ3hfY29uZl9maWxlLmMgYi9zcmMvY29yZS9uZ3hfY29uZl9maWxlLmMKaW5kZXggZTgxMTlmYy4uMzVlZThiOCAxMDA2NDQKLS0tIGEvc3JjL2NvcmUvbmd4X2NvbmZfZmlsZS5jCisrKyBiL3NyYy9jb3JlL25neF9jb25mX2ZpbGUuYwpAQCAtMTM3LDcgKzEzNyw3IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19FTUVSRywgY2YtPmxvZywgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgaW4gJXM6JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICIlcyBpbiAlczoldWkiLAogICAgICAgICAgICAgICAgICAgICAgICAgIHJ2LCBjZi0+Y29uZl9maWxlLT5maWxlLm5hbWUuZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjZi0+Y29uZl9maWxlLT5saW5lKTsKICAgICAgICAgICAgIHJjID0gTkdYX0VSUk9SOwpAQCAtMjA3LDcgKzIwNyw3IEBACiAKICAgICAgICAgICAgICAgICBpZiAoIShjbWQtPnR5cGUgJiBjZi0+Y21kX3R5cGUpKSB7CiAgICAgICAgICAgICAgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19FTUVSRywgY2YtPmxvZywgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGlyZWN0aXZlIFwiJXNcIiBpbiAlczolZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRpcmVjdGl2ZSBcIiVzXCIgaW4gJXM6JXVpICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaXMgbm90IGFsbG93ZWQgaGVyZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS0+ZGF0YSwgY2YtPmNvbmZfZmlsZS0+ZmlsZS5uYW1lLmRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2YtPmNvbmZfZmlsZS0+bGluZSk7CkBAIC0yMTYsNyArMjE2LDcgQEAKIAogICAgICAgICAgICAgICAgIGlmICghKGNtZC0+dHlwZSAmIE5HWF9DT05GX0JMT0NLKSAmJiBsYXN0ICE9IE5HWF9PSykgewogICAgICAgICAgICAgICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfRU1FUkcsIGNmLT5sb2csIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRpcmVjdGl2ZSBcIiVzXCIgaW4gJXM6JWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkaXJlY3RpdmUgXCIlc1wiIGluICVzOiV1aSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlzIG5vdCB0ZXJtaW5hdGVkIGJ5IFwiO1wiIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLT5kYXRhLCBjZi0+Y29uZl9maWxlLT5maWxlLm5hbWUuZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZi0+Y29uZl9maWxlLT5saW5lKTsKQEAgLTIyNyw3ICsyMjcsNyBAQAogICAgICAgICAgICAgICAgICAgICAmJiBsYXN0ICE9IE5HWF9DT05GX0JMT0NLX1NUQVJUKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBjZi0+bG9nLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkaXJlY3RpdmUgXCIlc1wiIGluICVzOiVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGlyZWN0aXZlIFwiJXNcIiBpbiAlczoldWkgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoYXMgbm90IHRoZSBvcGVuaW5nIFwie1wiIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLT5kYXRhLCBjZi0+Y29uZl9maWxlLT5maWxlLm5hbWUuZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZi0+Y29uZl9maWxlLT5saW5lKTsKQEAgLTI3Niw3ICsyNzYsNyBAQAogICAgICAgICAgICAgICAgIGlmICghdmFsaWQpIHsKICAgICAgICAgICAgICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBjZi0+bG9nLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIG51bWJlciBhcmd1bWVudHMgaW4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkaXJlY3RpdmUgXCIlc1wiIGluICVzOiVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGlyZWN0aXZlIFwiJXNcIiBpbiAlczoldWkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUtPmRhdGEsIGNmLT5jb25mX2ZpbGUtPmZpbGUubmFtZS5kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmLT5jb25mX2ZpbGUtPmxpbmUpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwpAQCAtMzExLDcgKzMxMSw3IEBACiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBjZi0+bG9nLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBcIiVzXCIgZGlyZWN0aXZlICVzIGluICVzOiVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgXCIlc1wiIGRpcmVjdGl2ZSAlcyBpbiAlczoldWkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS0+ZGF0YSwgcnYsIGNmLT5jb25mX2ZpbGUtPmZpbGUubmFtZS5kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2YtPmNvbmZfZmlsZS0+bGluZSk7CiAKQEAgLTMyMyw3ICszMjMsNyBAQAogICAgIH0KIAogICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19FTUVSRywgY2YtPmxvZywgMCwKLSAgICAgICAgICAgICAgICAgICJ1bmtub3duIGRpcmVjdGl2ZSBcIiVzXCIgaW4gJXM6JWQiLAorICAgICAgICAgICAgICAgICAgInVua25vd24gZGlyZWN0aXZlIFwiJXNcIiBpbiAlczoldWkiLAogICAgICAgICAgICAgICAgICAgbmFtZS0+ZGF0YSwgY2YtPmNvbmZfZmlsZS0+ZmlsZS5uYW1lLmRhdGEsCiAgICAgICAgICAgICAgICAgICBjZi0+Y29uZl9maWxlLT5saW5lKTsKIApAQCAtMzYwLDcgKzM2MCw3IEBACiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYgKGNmLT5hcmdzLT5uZWx0cyA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBjZi0+bG9nLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIGluICVzOiVkLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUgaW4gJXM6JXVpLCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGluZyBcIjtcIiBvciBcIn1cIiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2YtPmNvbmZfZmlsZS0+ZmlsZS5uYW1lLmRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2YtPmNvbmZfZmlsZS0+bGluZSk7CkBAIC00MjMsNyArNDIzLDcgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBjZi0+bG9nLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZCBcIiVjXCIgaW4gJXM6JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZCBcIiVjXCIgaW4gJXM6JXVpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY2gsIGNmLT5jb25mX2ZpbGUtPmZpbGUubmFtZS5kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjZi0+Y29uZl9maWxlLT5saW5lKTsKIApAQCAtNDQzLDcgKzQ0Myw3IEBACiAgICAgICAgICAgICBjYXNlICd7JzoKICAgICAgICAgICAgICAgICBpZiAoY2YtPmFyZ3MtPm5lbHRzID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBjZi0+bG9nLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkIFwiJWNcIiBpbiAlczolZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQgXCIlY1wiIGluICVzOiV1aSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2gsIGNmLT5jb25mX2ZpbGUtPmZpbGUubmFtZS5kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmLT5jb25mX2ZpbGUtPmxpbmUpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwpAQCAtNDU4LDcgKzQ1OCw3IEBACiAgICAgICAgICAgICBjYXNlICd9JzoKICAgICAgICAgICAgICAgICBpZiAoY2YtPmFyZ3MtPm5lbHRzID4gMCkgewogICAgICAgICAgICAgICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfRU1FUkcsIGNmLT5sb2csIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQgXCJ9XCIgaW4gJXM6JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkIFwifVwiIGluICVzOiV1aSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2YtPmNvbmZfZmlsZS0+ZmlsZS5uYW1lLmRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2YtPmNvbmZfZmlsZS0+bGluZSk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CkBAIC03MjksNyArNzI5LDcgQEAKICAgICAgICAgKmJ1ZiA9ICdcMCc7CiAgICAgfQogCi0gICAgbmd4X2xvZ19lcnJvcihsZXZlbCwgY2YtPmxvZywgMCwgIiVzIGluICVzOiVkIiwKKyAgICBuZ3hfbG9nX2Vycm9yKGxldmVsLCBjZi0+bG9nLCAwLCAiJXMgaW4gJXM6JXVpIiwKICAgICAgICAgICAgICAgICAgIGVycnN0ciwgY2YtPmNvbmZfZmlsZS0+ZmlsZS5uYW1lLmRhdGEsIGNmLT5jb25mX2ZpbGUtPmxpbmUpOwogfQogCkBAIC0xMDY1LDcgKzEwNjUsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgbmd4X2NvbmZfbG9nX2Vycm9yKE5HWF9MT0dfRU1FUkcsIGNmLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIG11c3QgYmUgZXF1YWwgb3IgbW9yZSB0aGFuICVkIiwgYm91bmRzLT5sb3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIG11c3QgYmUgZXF1YWwgb3IgbW9yZSB0aGFuICVpIiwgYm91bmRzLT5sb3cpOwogCiAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICB9CkBAIC0xMDc1LDcgKzEwNzUsNyBAQAogICAgIH0KIAogICAgIG5neF9jb25mX2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBjZiwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIG11c3QgYmUgYmV0d2VlbiAlZCBhbmQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUgbXVzdCBiZSBiZXR3ZWVuICVpIGFuZCAlaSIsCiAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kcy0+bG93LCBib3VuZHMtPmhpZ2gpOwogCiAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbmd4X2NvbmZfZmlsZS5oIGIvc3JjL2NvcmUvbmd4X2NvbmZfZmlsZS5oCmluZGV4IGQ1YTdhNjYuLjRmYWI4YzEgMTAwNjQ0Ci0tLSBhL3NyYy9jb3JlL25neF9jb25mX2ZpbGUuaAorKysgYi9zcmMvY29yZS9uZ3hfY29uZl9maWxlLmgKQEAgLTczLDYwICs3Myw2MCBAQAogCiAKIHN0cnVjdCBuZ3hfY29tbWFuZF9zIHsKLSAgICBuZ3hfc3RyX3QgICAgIG5hbWU7Ci0gICAgaW50ICAgICAgICAgICB0eXBlOwotICAgIGNoYXIgICAgICAgKigqc2V0KShuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqY21kLCB2b2lkICpjb25mKTsKLSAgICBpbnQgICAgICAgICAgIGNvbmY7Ci0gICAgaW50ICAgICAgICAgICBvZmZzZXQ7Ci0gICAgdm9pZCAgICAgICAgICpwb3N0OworICAgIG5neF9zdHJfdCAgICAgICAgICAgICBuYW1lOworICAgIG5neF91aW50X3QgICAgICAgICAgICB0eXBlOworICAgIGNoYXIgICAgICAgICAgICAgICAqKCpzZXQpKG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpjbWQsIHZvaWQgKmNvbmYpOworICAgIG5neF91aW50X3QgICAgICAgICAgICBjb25mOworICAgIG5neF91aW50X3QgICAgICAgICAgICBvZmZzZXQ7CisgICAgdm9pZCAgICAgICAgICAgICAgICAgKnBvc3Q7CiB9OwogCiAjZGVmaW5lIG5neF9udWxsX2NvbW1hbmQgICB7IG5neF9udWxsX3N0cmluZywgMCwgTlVMTCwgMCwgMCwgTlVMTCB9CiAKIAogc3RydWN0IG5neF9vcGVuX2ZpbGVfcyB7Ci0gICAgbmd4X2ZkX3QgICBmZDsKLSAgICBuZ3hfc3RyX3QgIG5hbWU7CisgICAgbmd4X2ZkX3QgICAgICAgICAgICAgIGZkOworICAgIG5neF9zdHJfdCAgICAgICAgICAgICBuYW1lOwogI2lmIDAKICAgICAvKiBlLmcuIGFwcGVuZCBtb2RlLCBlcnJvcl9sb2cgKi8KLSAgICBpbnQgICAgICAgIGZsYWdzOworICAgIG5neF91aW50X3QgICAgICAgICAgICBmbGFnczsKICAgICAvKiBlLmcuIHJlb3BlbiBkYiBmaWxlICovCi0gICAgaW50ICAgICAgKCpoYW5kbGVyKSh2b2lkICpkYXRhLCBuZ3hfb3Blbl9maWxlX3QgKmZpbGUpOwotICAgIHZvaWQgICAgICAqZGF0YTsKKyAgICBuZ3hfdWludF90ICAgICAgICAgICgqaGFuZGxlcikodm9pZCAqZGF0YSwgbmd4X29wZW5fZmlsZV90ICpmaWxlKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgICAqZGF0YTsKICNlbmRpZgogfTsKIAogCiBzdHJ1Y3Qgbmd4X21vZHVsZV9zIHsKLSAgICBuZ3hfdWludF90ICAgICAgIGN0eF9pbmRleDsKLSAgICBuZ3hfdWludF90ICAgICAgIGluZGV4OwotICAgIHZvaWQgICAgICAgICAgICAqY3R4OwotICAgIG5neF9jb21tYW5kX3QgICAqY29tbWFuZHM7Ci0gICAgbmd4X3VpbnRfdCAgICAgICB0eXBlOwotICAgIG5neF9pbnRfdCAgICAgICgqaW5pdF9tb2R1bGUpKG5neF9jeWNsZV90ICpjeWNsZSk7Ci0gICAgbmd4X2ludF90ICAgICAgKCppbml0X3Byb2Nlc3MpKG5neF9jeWNsZV90ICpjeWNsZSk7CisgICAgbmd4X3VpbnRfdCAgICAgICAgICAgIGN0eF9pbmRleDsKKyAgICBuZ3hfdWludF90ICAgICAgICAgICAgaW5kZXg7CisgICAgdm9pZCAgICAgICAgICAgICAgICAgKmN0eDsKKyAgICBuZ3hfY29tbWFuZF90ICAgICAgICAqY29tbWFuZHM7CisgICAgbmd4X3VpbnRfdCAgICAgICAgICAgIHR5cGU7CisgICAgbmd4X2ludF90ICAgICAgICAgICAoKmluaXRfbW9kdWxlKShuZ3hfY3ljbGVfdCAqY3ljbGUpOworICAgIG5neF9pbnRfdCAgICAgICAgICAgKCppbml0X3Byb2Nlc3MpKG5neF9jeWNsZV90ICpjeWNsZSk7CiAjaWYgMAotICAgIG5neF9pbnRfdCAgICAgICgqaW5pdF90aHJlYWQpKG5neF9jeWNsZV90ICpjeWNsZSk7CisgICAgbmd4X2ludF90ICAgICAgICAgICAoKmluaXRfdGhyZWFkKShuZ3hfY3ljbGVfdCAqY3ljbGUpOwogI2VuZGlmCiB9OwogCiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgICBuZ3hfc3RyX3QgICAgICAgbmFtZTsKLSAgICB2b2lkICAgICAgICAgKigqY3JlYXRlX2NvbmYpKG5neF9jeWNsZV90ICpjeWNsZSk7Ci0gICAgY2hhciAgICAgICAgICooKmluaXRfY29uZikobmd4X2N5Y2xlX3QgKmN5Y2xlLCB2b2lkICpjb25mKTsKKyAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgbmFtZTsKKyAgICB2b2lkICAgICAgICAgICAgICAgKigqY3JlYXRlX2NvbmYpKG5neF9jeWNsZV90ICpjeWNsZSk7CisgICAgY2hhciAgICAgICAgICAgICAgICooKmluaXRfY29uZikobmd4X2N5Y2xlX3QgKmN5Y2xlLCB2b2lkICpjb25mKTsKIH0gbmd4X2NvcmVfbW9kdWxlX3Q7IAogCiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgICBuZ3hfZmlsZV90ICAgZmlsZTsKLSAgICBuZ3hfYnVmX3QgICAqYnVmZmVyOwotICAgIG5neF91aW50X3QgICBsaW5lOworICAgIG5neF9maWxlX3QgICAgICAgICAgICBmaWxlOworICAgIG5neF9idWZfdCAgICAgICAgICAgICpidWZmZXI7CisgICAgbmd4X3VpbnRfdCAgICAgICAgICAgIGxpbmU7CiB9IG5neF9jb25mX2ZpbGVfdDsKIAogCiB0eXBlZGVmIGNoYXIgKigqbmd4X2NvbmZfaGFuZGxlcl9wdCkobmd4X2NvbmZfdCAqY2YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2NvbW1hbmRfdCAqZHVtbXksIHZvaWQgKmNvbmYpOworICAgIG5neF9jb21tYW5kX3QgKmR1bW15LCB2b2lkICpjb25mKTsKIAogCiBzdHJ1Y3Qgbmd4X2NvbmZfcyB7CkBAIC0xNTcsMjIgKzE1NywyMiBAQAogCiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgbmd4X2NvbmZfcG9zdF9oYW5kbGVyX3B0ICBwb3N0X2hhbmRsZXI7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICBsb3c7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICBoaWdoOworICAgIG5neF9pbnRfdCAgICAgICAgICAgICAgICAgbG93OworICAgIG5neF9pbnRfdCAgICAgICAgICAgICAgICAgaGlnaDsKIH0gbmd4X2NvbmZfbnVtX2JvdW5kc190OwogCiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgICBuZ3hfc3RyX3QgICBuYW1lOwotICAgIG5neF91aW50X3QgIHZhbHVlOworICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgbmFtZTsKKyAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgIHZhbHVlOwogfSBuZ3hfY29uZl9lbnVtX3Q7CiAKIAogI2RlZmluZSBOR1hfQ09ORl9CSVRNQVNLX1NFVCAgMQogCiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgbmd4X3N0cl90ICAgbmFtZTsKLSAgICBuZ3hfdWludF90ICBtYXNrOworICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgbmFtZTsKKyAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgIG1hc2s7CiB9IG5neF9jb25mX2JpdG1hc2tfdDsKIAogCmRpZmYgLS1naXQgYS9zcmMvY29yZS9uZ3hfY29yZS5oIGIvc3JjL2NvcmUvbmd4X2NvcmUuaAppbmRleCAxMzA1M2YyLi45NjQ2ZjZjIDEwMDY0NAotLS0gYS9zcmMvY29yZS9uZ3hfY29yZS5oCisrKyBiL3NyYy9jb3JlL25neF9jb3JlLmgKQEAgLTEyLDYgKzEyLDcgQEAKIHR5cGVkZWYgc3RydWN0IG5neF9jb25mX3MgICAgICAgIG5neF9jb25mX3Q7CiB0eXBlZGVmIHN0cnVjdCBuZ3hfY3ljbGVfcyAgICAgICBuZ3hfY3ljbGVfdDsKIHR5cGVkZWYgc3RydWN0IG5neF9wb29sX3MgICAgICAgIG5neF9wb29sX3Q7Cit0eXBlZGVmIHN0cnVjdCBuZ3hfY2hhaW5fcyAgICAgICBuZ3hfY2hhaW5fdDsgCiB0eXBlZGVmIHN0cnVjdCBuZ3hfbG9nX3MgICAgICAgICBuZ3hfbG9nX3Q7CiB0eXBlZGVmIHN0cnVjdCBuZ3hfYXJyYXlfcyAgICAgICBuZ3hfYXJyYXlfdDsKIHR5cGVkZWYgc3RydWN0IG5neF9vcGVuX2ZpbGVfcyAgIG5neF9vcGVuX2ZpbGVfdDsKQEAgLTUxLDcgKzUyLDcgQEAKICNpbmNsdWRlIDxuZ3hfYnVmLmg+CiAjaW5jbHVkZSA8bmd4X2FycmF5Lmg+CiAjaW5jbHVkZSA8bmd4X2xpc3QuaD4KLSNpbmNsdWRlIDxuZ3hfdGFibGUuaD4KKyNpbmNsdWRlIDxuZ3hfaGFzaC5oPgogI2luY2x1ZGUgPG5neF9maWxlLmg+CiAjaW5jbHVkZSA8bmd4X2ZpbGVzLmg+CiAjaW5jbHVkZSA8bmd4X2NyYy5oPgpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbmd4X2N5Y2xlLmMgYi9zcmMvY29yZS9uZ3hfY3ljbGUuYwppbmRleCA1MTg2NGUzLi41MTA0MjA1IDEwMDY0NAotLS0gYS9zcmMvY29yZS9uZ3hfY3ljbGUuYworKysgYi9zcmMvY29yZS9uZ3hfY3ljbGUuYwpAQCAtNTQsNyArNTQsNyBAQAogCiAgICAgbG9nID0gb2xkX2N5Y2xlLT5sb2c7CiAKLSAgICBwb29sID0gbmd4X2NyZWF0ZV9wb29sKDE2ICogMTAyNCwgbG9nKTsKKyAgICBwb29sID0gbmd4X2NyZWF0ZV9wb29sKE5HWF9DWUNMRV9QT09MX1NJWkUsIGxvZyk7CiAgICAgaWYgKHBvb2wgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvY29yZS9uZ3hfY3ljbGUuaCBiL3NyYy9jb3JlL25neF9jeWNsZS5oCmluZGV4IGZhY2U2N2YuLmIxYjUzNDggMTAwNjQ0Ci0tLSBhL3NyYy9jb3JlL25neF9jeWNsZS5oCisrKyBiL3NyYy9jb3JlL25neF9jeWNsZS5oCkBAIC0xMiw2ICsxMiwxMSBAQAogI2luY2x1ZGUgPG5neF9jb3JlLmg+CiAKIAorI2lmbmRlZiBOR1hfQ1lDTEVfUE9PTF9TSVpFCisjZGVmaW5lIE5HWF9DWUNMRV9QT09MX1NJWkUgICAgIDE2Mzg0CisjZW5kaWYKKworCiAjZGVmaW5lIE5HWF9ERUJVR19QT0lOVFNfU1RPUCAgIDEKICNkZWZpbmUgTkdYX0RFQlVHX1BPSU5UU19BQk9SVCAgMgogCmRpZmYgLS1naXQgYS9zcmMvY29yZS9uZ3hfaGFzaC5jIGIvc3JjL2NvcmUvbmd4X2hhc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzA2MmI3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbmd4X2hhc2guYwpAQCAtMCwwICsxLDE2MCBAQAorCisvKgorICogQ29weXJpZ2h0IChDKSBJZ29yIFN5c29ldgorICovCisKKworI2luY2x1ZGUgPG5neF9jb25maWcuaD4KKyNpbmNsdWRlIDxuZ3hfY29yZS5oPgorCisKK25neF9pbnRfdAorbmd4X2hhc2hfaW5pdChuZ3hfaGFzaF90ICpoYXNoLCBuZ3hfcG9vbF90ICpwb29sLCB2b2lkICpuYW1lcykKK3sKKyAgICB1X2NoYXIgICAgICAqcDsKKyAgICBuZ3hfc3RyX3QgICAqbiwgKmJ1Y2tldDsKKyAgICBuZ3hfdWludF90ICAgaSwga2V5LCBzaXplLCBiZXN0LCAqdGVzdCwgYnVja2V0cywgbWluX2J1Y2tldHM7CisKKyAgICB0ZXN0ID0gbmd4X2FsbG9jKGhhc2gtPm1heF9zaXplICogc2l6ZW9mKG5neF91aW50X3QpLCBwb29sLT5sb2cpOworICAgIGlmICh0ZXN0ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICB9CisKKyAgICBtaW5fYnVja2V0cyA9IGhhc2gtPmJ1Y2tldF9saW1pdCArIDE7CisKKyNpZiAoTkdYX1NVUFBSRVNTX1dBUk4pCisgICAgYmVzdCA9IDA7CisjZW5kaWYKKworICAgIGZvciAoc2l6ZSA9IDE7IHNpemUgPCBoYXNoLT5tYXhfc2l6ZTsgc2l6ZSsrKSB7CisKKyAgICAgICAgYnVja2V0cyA9IDA7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgdGVzdFtpXSA9IDA7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKG4gPSAobmd4X3N0cl90ICopIG5hbWVzOworICAgICAgICAgICAgIG4tPmxlbjsKKyAgICAgICAgICAgICBuID0gKG5neF9zdHJfdCAqKSAoKGNoYXIgKikgbiArIGhhc2gtPmJ1Y2tldF9zaXplKSkKKyAgICAgICAgeworICAgICAgICAgICAga2V5ID0gMDsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG4tPmxlbjsgaSsrKSB7CisgICAgICAgICAgICAgICAga2V5ICs9IG5neF90b2xvd2VyKG4tPmRhdGFbaV0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBrZXkgJT0gc2l6ZTsKKworICAgICAgICAgICAgaWYgKHRlc3Rba2V5XSA9PSBoYXNoLT5idWNrZXRfbGltaXQpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGVzdFtrZXldKys7CisKKyAgICAgICAgICAgIGlmIChidWNrZXRzIDwgdGVzdFtrZXldKSB7CisgICAgICAgICAgICAgICAgYnVja2V0cyA9IHRlc3Rba2V5XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChuLT5sZW4gPT0gMCkgeworICAgICAgICAgICAgaWYgKG1pbl9idWNrZXRzID4gYnVja2V0cykgeworICAgICAgICAgICAgICAgIG1pbl9idWNrZXRzID0gYnVja2V0czsKKyAgICAgICAgICAgICAgICBiZXN0ID0gc2l6ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGhhc2gtPmJ1Y2tldF9saW1pdCA9PSAxKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobWluX2J1Y2tldHMgPT0gaGFzaC0+YnVja2V0X2xpbWl0ICsgMSkgeworICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfRU1FUkcsIHBvb2wtPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAiY291bGQgbm90IGJ1aWxkIHRoZSAlcyBoYXNoLCB5b3Ugc2hvdWxkIGluY3JlYXNlICIKKyAgICAgICAgICAgICAgICAgICAgICAiZWl0aGVyICVzX3NpemU6ICVpIG9yICVzX2J1Y2tldF9saW1pdDogJWkiLAorICAgICAgICAgICAgICAgICAgICAgIGhhc2gtPm5hbWUsIGhhc2gtPm5hbWUsIGhhc2gtPm1heF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgIGhhc2gtPm5hbWUsIGhhc2gtPmJ1Y2tldF9saW1pdCk7CisgICAgICAgIG5neF9mcmVlKHRlc3QpOworICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgIH0KKworICAgIGhhc2gtPmJ1Y2tldHMgPSBuZ3hfcGNhbGxvYyhwb29sLCBiZXN0ICogaGFzaC0+YnVja2V0X3NpemUpOworICAgIGlmIChoYXNoLT5idWNrZXRzID09IE5VTEwpIHsKKyAgICAgICAgbmd4X2ZyZWUodGVzdCk7CisgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgfQorCisgICAgaWYgKGhhc2gtPmJ1Y2tldF9saW1pdCAhPSAxKSB7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGJlc3Q7IGkrKykgeworICAgICAgICAgICAgdGVzdFtpXSA9IDA7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKG4gPSAobmd4X3N0cl90ICopIG5hbWVzOworICAgICAgICAgICAgIG4tPmxlbjsKKyAgICAgICAgICAgICBuID0gKG5neF9zdHJfdCAqKSAoKGNoYXIgKikgbiArIGhhc2gtPmJ1Y2tldF9zaXplKSkKKyAgICAgICAgeworICAgICAgICAgICAga2V5ID0gMDsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG4tPmxlbjsgaSsrKSB7CisgICAgICAgICAgICAgICAga2V5ICs9IG5neF90b2xvd2VyKG4tPmRhdGFbaV0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBrZXkgJT0gYmVzdDsKKworICAgICAgICAgICAgdGVzdFtrZXldKys7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYmVzdDsgaSsrKSB7CisgICAgICAgICAgICBpZiAodGVzdFtpXSA9PSAwKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJ1Y2tldCA9IG5neF9wYWxsb2MocG9vbCwgdGVzdFtpXSAqIGhhc2gtPmJ1Y2tldF9zaXplKTsKKyAgICAgICAgICAgIGlmIChidWNrZXQgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG5neF9mcmVlKHRlc3QpOworICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGhhc2gtPmJ1Y2tldHNbaV0gPSBidWNrZXQ7CisgICAgICAgICAgICBidWNrZXQtPmxlbiA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKG4gPSAobmd4X3N0cl90ICopIG5hbWVzOworICAgICAgICAgbi0+bGVuOworICAgICAgICAgbiA9IChuZ3hfc3RyX3QgKikgKChjaGFyICopIG4gKyBoYXNoLT5idWNrZXRfc2l6ZSkpCisgICAgeworICAgICAgICBrZXkgPSAwOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuLT5sZW47IGkrKykgeworICAgICAgICAgICAga2V5ICs9IG5neF90b2xvd2VyKG4tPmRhdGFbaV0pOworICAgICAgICB9CisKKyAgICAgICAga2V5ICU9IGJlc3Q7CisKKyAgICAgICAgaWYgKGhhc2gtPmJ1Y2tldF9saW1pdCA9PSAxKSB7CisgICAgICAgICAgICBwID0gKHVfY2hhciAqKSBoYXNoLT5idWNrZXRzICsga2V5ICogaGFzaC0+YnVja2V0X3NpemU7CisgICAgICAgICAgICBuZ3hfbWVtY3B5KHAsIG4sIGhhc2gtPmJ1Y2tldF9zaXplKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChidWNrZXQgPSBoYXNoLT5idWNrZXRzW2tleV07CisgICAgICAgICAgICAgYnVja2V0LT5sZW47CisgICAgICAgICAgICAgYnVja2V0ID0gKG5neF9zdHJfdCAqKSAoKGNoYXIgKikgYnVja2V0ICsgaGFzaC0+YnVja2V0X3NpemUpKQorICAgICAgICB7CisgICAgICAgICAgICBidWNrZXQtPmxlbiAmPSAweDdmZmZmZmZmOworICAgICAgICB9CisKKyAgICAgICAgbmd4X21lbWNweShidWNrZXQsIG4sIGhhc2gtPmJ1Y2tldF9zaXplKTsKKyAgICAgICAgYnVja2V0LT5sZW4gfD0gMHg4MDAwMDAwMDsKKyAgICB9CisKKyAgICBuZ3hfZnJlZSh0ZXN0KTsKKworICAgIGhhc2gtPmhhc2hfc2l6ZSA9IGJlc3Q7CisgICAgaGFzaC0+bWluX2J1Y2tldHMgPSBtaW5fYnVja2V0czsKKworICAgIHJldHVybiBOR1hfT0s7Cit9CmRpZmYgLS1naXQgYS9zcmMvY29yZS9uZ3hfaGFzaC5oIGIvc3JjL2NvcmUvbmd4X2hhc2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTRiZjVmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbmd4X2hhc2guaApAQCAtMCwwICsxLDM3IEBACisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIElnb3IgU3lzb2V2CisgKi8KKworCisjaWZuZGVmIF9OR1hfSEFTSF9IX0lOQ0xVREVEXworI2RlZmluZSBfTkdYX0hBU0hfSF9JTkNMVURFRF8KKworCisjaW5jbHVkZSA8bmd4X2NvbmZpZy5oPgorI2luY2x1ZGUgPG5neF9jb3JlLmg+CisKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHZvaWQgICAgICAgICoqYnVja2V0czsKKyAgICBuZ3hfdWludF90ICAgIGhhc2hfc2l6ZTsKKworICAgIG5neF91aW50X3QgICAgbWF4X3NpemU7CisgICAgbmd4X3VpbnRfdCAgICBidWNrZXRfbGltaXQ7CisgICAgc2l6ZV90ICAgICAgICBidWNrZXRfc2l6ZTsKKyAgICBjaGFyICAgICAgICAgKm5hbWU7CisgICAgbmd4X3VpbnRfdCAgICBtaW5fYnVja2V0czsKK30gbmd4X2hhc2hfdDsKKworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgbmd4X3VpbnRfdCAgaGFzaDsKKyAgICBuZ3hfc3RyX3QgICBrZXk7CisgICAgbmd4X3N0cl90ICAgdmFsdWU7Cit9IG5neF90YWJsZV9lbHRfdDsKKworCituZ3hfaW50X3Qgbmd4X2hhc2hfaW5pdChuZ3hfaGFzaF90ICpoYXNoLCBuZ3hfcG9vbF90ICpwb29sLCB2b2lkICpuYW1lcyk7CisKKworI2VuZGlmIC8qIF9OR1hfSEFTSF9IX0lOQ0xVREVEXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbmd4X291dHB1dF9jaGFpbi5jIGIvc3JjL2NvcmUvbmd4X291dHB1dF9jaGFpbi5jCmluZGV4IDMxMzU1N2QuLmZjOGEwYmYgMTAwNjQ0Ci0tLSBhL3NyYy9jb3JlL25neF9vdXRwdXRfY2hhaW4uYworKysgYi9zcmMvY29yZS9uZ3hfb3V0cHV0X2NoYWluLmMKQEAgLTExOSw4ICsxMTksMTAgQEAKICAgICAgICAgICAgICAgICAvKiBnZXQgdGhlIGZyZWUgYnVmICovCiAKICAgICAgICAgICAgICAgICBpZiAoY3R4LT5mcmVlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGN0eC0+YnVmID0gY3R4LT5mcmVlLT5idWY7Ci0gICAgICAgICAgICAgICAgICAgIGN0eC0+ZnJlZSA9IGN0eC0+ZnJlZS0+bmV4dDsKKyAgICAgICAgICAgICAgICAgICAgY2wgPSBjdHgtPmZyZWU7CisgICAgICAgICAgICAgICAgICAgIGN0eC0+YnVmID0gY2wtPmJ1ZjsKKyAgICAgICAgICAgICAgICAgICAgY3R4LT5mcmVlID0gY2wtPm5leHQ7CisgICAgICAgICAgICAgICAgICAgIG5neF9mcmVlX2NoYWluKGN0eC0+cG9vbCwgY2wpOwogCiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvdXQgfHwgY3R4LT5hbGxvY2F0ZWQgPT0gY3R4LT5idWZzLm51bSkgewogCmRpZmYgLS1naXQgYS9zcmMvY29yZS9uZ3hfcGFsbG9jLmMgYi9zcmMvY29yZS9uZ3hfcGFsbG9jLmMKaW5kZXggOGZhZjlhNy4uMjgwNGRkMCAxMDA2NDQKLS0tIGEvc3JjL2NvcmUvbmd4X3BhbGxvYy5jCisrKyBiL3NyYy9jb3JlL25neF9wYWxsb2MuYwpAQCAtMjIsNiArMjIsNyBAQAogICAgIHAtPmVuZCA9ICh1X2NoYXIgKikgcCArIHNpemU7CiAgICAgcC0+bmV4dCA9IE5VTEw7CiAgICAgcC0+bGFyZ2UgPSBOVUxMOworICAgIHAtPmNoYWluID0gTlVMTDsKICAgICBwLT5sb2cgPSBsb2c7CiAKICAgICByZXR1cm4gcDsKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL25neF9wYWxsb2MuaCBiL3NyYy9jb3JlL25neF9wYWxsb2MuaAppbmRleCBiMzEwMDgyLi5iZDI1NmU4IDEwMDY0NAotLS0gYS9zcmMvY29yZS9uZ3hfcGFsbG9jLmgKKysrIGIvc3JjL2NvcmUvbmd4X3BhbGxvYy5oCkBAIC0zMyw2ICszMyw3IEBACiBzdHJ1Y3Qgbmd4X3Bvb2xfcyB7CiAgICAgdV9jaGFyICAgICAgICAgICAgKmxhc3Q7CiAgICAgdV9jaGFyICAgICAgICAgICAgKmVuZDsKKyAgICBuZ3hfY2hhaW5fdCAgICAgICAqY2hhaW47CiAgICAgbmd4X3Bvb2xfdCAgICAgICAgKm5leHQ7CiAgICAgbmd4X3Bvb2xfbGFyZ2VfdCAgKmxhcmdlOwogICAgIG5neF9sb2dfdCAgICAgICAgICpsb2c7CmRpZmYgLS1naXQgYS9zcmMvY29yZS9uZ3hfdGFibGUuaCBiL3NyYy9jb3JlL25neF90YWJsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTJmM2E5Li4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL25neF90YWJsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotCi0vKgotICogQ29weXJpZ2h0IChDKSBJZ29yIFN5c29ldgotICovCi0KLQotI2lmbmRlZiBfTkdYX1RBQkxFX0hfSU5DTFVERURfCi0jZGVmaW5lIF9OR1hfVEFCTEVfSF9JTkNMVURFRF8KLQotCi0jaW5jbHVkZSA8bmd4X2NvbmZpZy5oPgotI2luY2x1ZGUgPG5neF9jb3JlLmg+Ci0KLQotdHlwZWRlZiBuZ3hfYXJyYXlfdCAgbmd4X3RhYmxlX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBuZ3hfc3RyX3QgIGtleTsKLSAgICBuZ3hfc3RyX3QgIHZhbHVlOwotfSBuZ3hfdGFibGVfZWx0X3Q7Ci0KLQotI2RlZmluZSBuZ3hfY3JlYXRlX3RhYmxlKHAsIG4pICBuZ3hfY3JlYXRlX2FycmF5KHAsIG4sIDIgKiBzaXplb2Yobmd4X3N0cl90KSkKLSNkZWZpbmUgbmd4X3B1c2hfdGFibGUodCkgICAgICAgbmd4X3B1c2hfYXJyYXkodCkKLQotCi0jZW5kaWYgLyogX05HWF9UQUJMRV9IX0lOQ0xVREVEXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL2V2ZW50L25neF9ldmVudF9waXBlLmMgYi9zcmMvZXZlbnQvbmd4X2V2ZW50X3BpcGUuYwppbmRleCBiNTQ4OGJhLi41ZjlkN2MwIDEwMDY0NAotLS0gYS9zcmMvZXZlbnQvbmd4X2V2ZW50X3BpcGUuYworKysgYi9zcmMvZXZlbnQvbmd4X2V2ZW50X3BpcGUuYwpAQCAtODQsNyArODQsNyBAQAogICAgIHNzaXplX3QgICAgICAgbiwgc2l6ZTsKICAgICBuZ3hfaW50X3QgICAgIHJjOwogICAgIG5neF9idWZfdCAgICAqYjsKLSAgICBuZ3hfY2hhaW5fdCAgKmNoYWluLCAqY2w7CisgICAgbmd4X2NoYWluX3QgICpjaGFpbiwgKmNsLCAqbG47CiAKICAgICBpZiAocC0+dXBzdHJlYW1fZW9mIHx8IHAtPnVwc3RyZWFtX2Vycm9yIHx8IHAtPnVwc3RyZWFtX2RvbmUpIHsKICAgICAgICAgcmV0dXJuIE5HWF9PSzsKQEAgLTI5Myw3ICsyOTMsOSBAQAogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIG4gLT0gc2l6ZTsKKyAgICAgICAgICAgICAgICBsbiA9IGNsOwogICAgICAgICAgICAgICAgIGNsID0gY2wtPm5leHQ7CisgICAgICAgICAgICAgICAgbmd4X2ZyZWVfY2hhaW4ocC0+cG9vbCwgbG4pOwogCiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGNsLT5idWYtPmxhc3QgKz0gbjsKQEAgLTY4Niw4ICs2ODgsMTAgQEAKICAgICB9CiAKICAgICBpZiAocC0+ZnJlZSkgewotICAgICAgICBiID0gcC0+ZnJlZS0+YnVmOwotICAgICAgICBwLT5mcmVlID0gcC0+ZnJlZS0+bmV4dDsKKyAgICAgICAgY2wgPSBwLT5mcmVlOworICAgICAgICBiID0gY2wtPmJ1ZjsKKyAgICAgICAgcC0+ZnJlZSA9IGNsLT5uZXh0OworICAgICAgICBuZ3hfZnJlZV9jaGFpbihwLT5wb29sLCBjbCk7CiAKICAgICB9IGVsc2UgewogICAgICAgICBiID0gbmd4X2FsbG9jX2J1ZihwLT5wb29sKTsKZGlmZiAtLWdpdCBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfZmFzdGNnaV9tb2R1bGUuYyBiL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfZmFzdGNnaV9tb2R1bGUuYwppbmRleCA5ODYyMTViLi40YjkyY2Q0IDEwMDY0NAotLS0gYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2Zhc3RjZ2lfbW9kdWxlLmMKKysrIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9mYXN0Y2dpX21vZHVsZS5jCkBAIC0zOTYsNyArMzk2LDcgQEAKIAogICAgIHUtPmNvbmYgPSAmZmxjZi0+dXBzdHJlYW07CiAKLSAgICB1LT5sb2NhdGlvbiA9IGZsY2YtPmxvY2F0aW9uOworICAgIHUtPmxvY2F0aW9uMCA9IGZsY2YtPmxvY2F0aW9uOwogCiAgICAgdS0+Y3JlYXRlX3JlcXVlc3QgPSBuZ3hfaHR0cF9mYXN0Y2dpX2NyZWF0ZV9yZXF1ZXN0OwogICAgIHUtPnJlaW5pdF9yZXF1ZXN0ID0gbmd4X2h0dHBfZmFzdGNnaV9yZWluaXRfcmVxdWVzdDsKQEAgLTQxMSwxMCArNDExLDEwIEBACiAgICAgdS0+bG9nX2N0eCA9IHItPmNvbm5lY3Rpb24tPmxvZy0+ZGF0YTsKICAgICB1LT5sb2dfaGFuZGxlciA9IG5neF9odHRwX3Vwc3RyZWFtX2xvZ19lcnJvcjsKIAotICAgIHUtPnNjaGVtYS5sZW4gPSBzaXplb2YoImZhc3RjZ2k6Ly8iKSAtIDE7Ci0gICAgdS0+c2NoZW1hLmRhdGEgPSAodV9jaGFyICopICJmYXN0Y2dpOi8vIjsKLSAgICB1LT51cmkubGVuID0gc2l6ZW9mKCIvIikgLSAxOwotICAgIHUtPnVyaS5kYXRhID0gKHVfY2hhciAqKSAiLyI7CisgICAgdS0+c2NoZW1hMC5sZW4gPSBzaXplb2YoImZhc3RjZ2k6Ly8iKSAtIDE7CisgICAgdS0+c2NoZW1hMC5kYXRhID0gKHVfY2hhciAqKSAiZmFzdGNnaTovLyI7CisgICAgdS0+dXJpMC5sZW4gPSBzaXplb2YoIi8iKSAtIDE7CisgICAgdS0+dXJpMC5kYXRhID0gKHVfY2hhciAqKSAiLyI7CiAKICAgICByLT51cHN0cmVhbSA9IHU7CiAKQEAgLTEyNDQsNyArMTI0NCw4IEBACiB9CiAKIAotc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9mYXN0Y2dpX3Byb2Nlc3NfaGVhZGVyKG5neF9odHRwX3JlcXVlc3RfdCAqcikKK3N0YXRpYyBuZ3hfaW50X3QKK25neF9odHRwX2Zhc3RjZ2lfcHJvY2Vzc19oZWFkZXIobmd4X2h0dHBfcmVxdWVzdF90ICpyKQogewogICAgIHVfY2hhciAgICAgICAgICAgICAgICAgICpzdGFydCwgKmxhc3Q7CiAgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgKnN0YXR1c19saW5lLCBsaW5lOwpAQCAtMjEyNywxNiArMjEyOCwxNiBAQAogCiAgICAgY29uZi0+dXBzdHJlYW0uY29ubmVjdF90aW1lb3V0ID0gTkdYX0NPTkZfVU5TRVRfTVNFQzsKICAgICBjb25mLT51cHN0cmVhbS5zZW5kX3RpbWVvdXQgPSBOR1hfQ09ORl9VTlNFVF9NU0VDOwotICAgIGNvbmYtPnVwc3RyZWFtLnNlbmRfbG93YXQgPSBOR1hfQ09ORl9VTlNFVF9TSVpFOwotCi0gICAgY29uZi0+dXBzdHJlYW0uaGVhZGVyX2J1ZmZlcl9zaXplID0gTkdYX0NPTkZfVU5TRVRfU0laRTsKICAgICBjb25mLT51cHN0cmVhbS5yZWFkX3RpbWVvdXQgPSBOR1hfQ09ORl9VTlNFVF9NU0VDOwotICAgIGNvbmYtPnVwc3RyZWFtLmJ1c3lfYnVmZmVyc19zaXplID0gTkdYX0NPTkZfVU5TRVRfU0laRTsKIAorICAgIGNvbmYtPnVwc3RyZWFtLnNlbmRfbG93YXQgPSBOR1hfQ09ORl9VTlNFVF9TSVpFOworICAgIGNvbmYtPnVwc3RyZWFtLmhlYWRlcl9idWZmZXJfc2l6ZSA9IE5HWF9DT05GX1VOU0VUX1NJWkU7CisgICAgY29uZi0+dXBzdHJlYW0uYnVzeV9idWZmZXJzX3NpemUgPSBOR1hfQ09ORl9VTlNFVF9TSVpFOwogICAgIGNvbmYtPnVwc3RyZWFtLm1heF90ZW1wX2ZpbGVfc2l6ZSA9IE5HWF9DT05GX1VOU0VUX1NJWkU7IAogICAgIGNvbmYtPnVwc3RyZWFtLnRlbXBfZmlsZV93cml0ZV9zaXplID0gTkdYX0NPTkZfVU5TRVRfU0laRTsKICAgICAKICAgICBjb25mLT51cHN0cmVhbS5yZWRpcmVjdF9lcnJvcnMgPSBOR1hfQ09ORl9VTlNFVDsKKyAgICBjb25mLT51cHN0cmVhbS5wYXNzX3VucGFyc2VkX3VyaSA9IE5HWF9DT05GX1VOU0VUOwogICAgIGNvbmYtPnVwc3RyZWFtLnhfcG93ZXJlZF9ieSA9IE5HWF9DT05GX1VOU0VUOwogCiAgICAgLyogImZhc3RjZ2lfY3ljbGljX3RlbXBfZmlsZSIgaXMgZGlzYWJsZWQgKi8KQEAgLTIxNTYsMjUgKzIxNTcsMjEgQEAKIAogICAgIG5neF9jb25mX21lcmdlX21zZWNfdmFsdWUoY29uZi0+dXBzdHJlYW0uY29ubmVjdF90aW1lb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldi0+dXBzdHJlYW0uY29ubmVjdF90aW1lb3V0LCA2MDAwMCk7CisKICAgICBuZ3hfY29uZl9tZXJnZV9tc2VjX3ZhbHVlKGNvbmYtPnVwc3RyZWFtLnNlbmRfdGltZW91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXYtPnVwc3RyZWFtLnNlbmRfdGltZW91dCwgNjAwMDApOwotICAgIG5neF9jb25mX21lcmdlX3NpemVfdmFsdWUoY29uZi0+dXBzdHJlYW0uc2VuZF9sb3dhdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXYtPnVwc3RyZWFtLnNlbmRfbG93YXQsIDApOwogCiAgICAgbmd4X2NvbmZfbWVyZ2VfbXNlY192YWx1ZShjb25mLT51cHN0cmVhbS5yZWFkX3RpbWVvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2LT51cHN0cmVhbS5yZWFkX3RpbWVvdXQsIDYwMDAwKTsKIAotICAgIG5neF9jb25mX21lcmdlX21zZWNfdmFsdWUoY29uZi0+dXBzdHJlYW0ucmVkaXJlY3RfZXJyb3JzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldi0+dXBzdHJlYW0ucmVkaXJlY3RfZXJyb3JzLCAwKTsKLQotICAgIG5neF9jb25mX21lcmdlX21zZWNfdmFsdWUoY29uZi0+dXBzdHJlYW0ueF9wb3dlcmVkX2J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldi0+dXBzdHJlYW0ueF9wb3dlcmVkX2J5LCAxKTsKLQorICAgIG5neF9jb25mX21lcmdlX3NpemVfdmFsdWUoY29uZi0+dXBzdHJlYW0uc2VuZF9sb3dhdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXYtPnVwc3RyZWFtLnNlbmRfbG93YXQsIDApOwogCiAgICAgbmd4X2NvbmZfbWVyZ2Vfc2l6ZV92YWx1ZShjb25mLT51cHN0cmVhbS5oZWFkZXJfYnVmZmVyX3NpemUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldi0+dXBzdHJlYW0uaGVhZGVyX2J1ZmZlcl9zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVfdCkgbmd4X3BhZ2VzaXplKTsKIAorCiAgICAgbmd4X2NvbmZfbWVyZ2VfYnVmc192YWx1ZShjb25mLT51cHN0cmVhbS5idWZzLCBwcmV2LT51cHN0cmVhbS5idWZzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCwgbmd4X3BhZ2VzaXplKTsKIApAQCAtMjI2Nyw2ICsyMjY0LDIzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfZ2FyYmFnZV9jb2xsZWN0b3JfdGVtcF9oYW5kbGVyLCBjZik7CiAKIAorICAgIG5neF9jb25mX21lcmdlX21zZWNfdmFsdWUoY29uZi0+dXBzdHJlYW0ucmVkaXJlY3RfZXJyb3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldi0+dXBzdHJlYW0ucmVkaXJlY3RfZXJyb3JzLCAwKTsKKworICAgIG5neF9jb25mX21lcmdlX21zZWNfdmFsdWUoY29uZi0+dXBzdHJlYW0ucGFzc191bnBhcnNlZF91cmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2LT51cHN0cmVhbS5wYXNzX3VucGFyc2VkX3VyaSwgMCk7CisKKyAgICBpZiAoY29uZi0+dXBzdHJlYW0ucGFzc191bnBhcnNlZF91cmkgJiYgY29uZi0+bG9jYXRpb24tPmxlbiA+IDEpIHsKKyAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBjZi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICAgICJcImZhc3RjZ2lfcGFzc191bnBhcnNlZF91cmlcIiBjYW4gYmUgc2V0IGZvciAiCisgICAgICAgICAgICAgICAgICAgICAgImxvY2F0aW9uIFwiL1wiIG9yIGdpdmVuIGJ5IHJlZ3VsYXIgZXhwcmVzc2lvbi4iKTsKKyAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgIH0KKworICAgIG5neF9jb25mX21lcmdlX21zZWNfdmFsdWUoY29uZi0+dXBzdHJlYW0ueF9wb3dlcmVkX2J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldi0+dXBzdHJlYW0ueF9wb3dlcmVkX2J5LCAxKTsKKworCiAgICAgbmd4X2NvbmZfbWVyZ2VfYml0bWFza192YWx1ZShjb25mLT5wYXJhbXMsIHByZXYtPnBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChOR1hfQ09ORl9CSVRNQVNLX1NFVAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxOR1hfSFRUUF9GQVNUQ0dJX1JFTU9URV9BRERSCkBAIC0yMjkwLDUgKzIzMDQsMTAgQEAKICAgICAgICAgY29uZi0+dmFycyA9IHByZXYtPnZhcnM7CiAgICAgfQogCisgICAgaWYgKGNvbmYtPnBlZXJzID09IE5VTEwpIHsKKyAgICAgICAgY29uZi0+cGVlcnMgPSBwcmV2LT5wZWVyczsKKyAgICAgICAgY29uZi0+dXBzdHJlYW0gPSBwcmV2LT51cHN0cmVhbTsKKyAgICB9CisKICAgICByZXR1cm4gTkdYX0NPTkZfT0s7CiB9CmRpZmYgLS1naXQgYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3Byb3h5X21vZHVsZS5jIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9wcm94eV9tb2R1bGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDIwODU2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9wcm94eV9tb2R1bGUuYwpAQCAtMCwwICsxLDEyMDkgQEAKKworLyogIAorICogQ29weXJpZ2h0IChDKSBJZ29yIFN5c29ldgorICovCisKKworI2luY2x1ZGUgPG5neF9jb25maWcuaD4KKyNpbmNsdWRlIDxuZ3hfY29yZS5oPgorI2luY2x1ZGUgPG5neF9ldmVudC5oPgorI2luY2x1ZGUgPG5neF9odHRwLmg+CisKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIG5neF9odHRwX3Vwc3RyZWFtX2NvbmZfdCAgIHVwc3RyZWFtOworCisgICAgbmd4X3BlZXJzX3QgICAgICAgICAgICAgICAqcGVlcnM7CisKKyAgICBuZ3hfYXJyYXlfdCAgICAgICAgICAgICAgICpoZWFkZXJzX3NldF9sZW47CisgICAgbmd4X2FycmF5X3QgICAgICAgICAgICAgICAqaGVhZGVyc19zZXQ7CisgICAgbmd4X2hhc2hfdCAgICAgICAgICAgICAgICAqaGVhZGVyc19zZXRfaGFzaDsKKworICAgIG5neF9mbGFnX3QgICAgICAgICAgICAgICAgIHByZXNlcnZlX2hvc3Q7CisgICAgbmd4X2ZsYWdfdCAgICAgICAgICAgICAgICAgc2V0X3hfdXJsOworICAgIG5neF9mbGFnX3QgICAgICAgICAgICAgICAgIHNldF94X3JlYWxfaXA7CisgICAgbmd4X2ZsYWdfdCAgICAgICAgICAgICAgICAgYWRkX3hfZm9yd2FyZGVkX2ZvcjsKKyAgICBuZ3hfZmxhZ190ICAgICAgICAgICAgICAgICBwYXNzX3NlcnZlcjsKKyAgICBuZ3hfZmxhZ190ICAgICAgICAgICAgICAgICBwYXNzX3hfYWNjZWxfZXhwaXJlczsKKworICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgKmxvY2F0aW9uMDsKKworICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgIGhvc3RfaGVhZGVyOworICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgIHVyaTA7CisKKyAgICBuZ3hfYXJyYXlfdCAgICAgICAgICAgICAgICpoZWFkZXJzX3NvdXJjZXM7CisgICAgbmd4X2FycmF5X3QgICAgICAgICAgICAgICAqaGVhZGVyc19uYW1lczsKK30gbmd4X2h0dHBfcHJveHlfbG9jX2NvbmZfdDsKKworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgbmd4X2xpc3RfdCAgICAgICAgICAgICAgICAgaGVhZGVyczsKKyAgICAKKyAgICBuZ3hfdGFibGVfZWx0X3QgICAgICAgICAgICpkYXRlOworICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICAgKnNlcnZlcjsKKworICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICAgKmV4cGlyZXM7CisgICAgbmd4X3RhYmxlX2VsdF90ICAgICAgICAgICAqY2FjaGVfY29udHJvbDsKKyAgICBuZ3hfdGFibGVfZWx0X3QgICAgICAgICAgICpldGFnOworICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICAgKnhfYWNjZWxfZXhwaXJlczsKKworICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICAgKmNvbm5lY3Rpb247CisgICAgbmd4X3RhYmxlX2VsdF90ICAgICAgICAgICAqY29udGVudF90eXBlOworICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICAgKmNvbnRlbnRfbGVuZ3RoOworICAgIAorI2lmIChOR1hfSFRUUF9HWklQKQorICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICAgKmNvbnRlbnRfZW5jb2Rpbmc7CisjZW5kaWYKKyAgICAKKyAgICBuZ3hfdGFibGVfZWx0X3QgICAgICAgICAgICpsYXN0X21vZGlmaWVkOworICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICAgKmxvY2F0aW9uOworICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICAgKmFjY2VwdF9yYW5nZXM7CisgICAgbmd4X3RhYmxlX2VsdF90ICAgICAgICAgICAqeF9wYWQ7CisKKyAgICBvZmZfdCAgICAgICAgICAgICAgICAgICAgICBjb250ZW50X2xlbmd0aF9uOworfSBuZ3hfaHR0cF9wcm94eV9oZWFkZXJzX2luX3Q7CisKKworc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9wcm94eV9jcmVhdGVfcmVxdWVzdChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpOworc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9wcm94eV9yZWluaXRfcmVxdWVzdChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpOworc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9wcm94eV9wcm9jZXNzX2hlYWRlcihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpOworc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9wcm94eV9zZW5kX2hlYWRlcihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpOworc3RhdGljIHZvaWQgbmd4X2h0dHBfcHJveHlfYWJvcnRfcmVxdWVzdChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpOworc3RhdGljIHZvaWQgbmd4X2h0dHBfcHJveHlfZmluYWxpemVfcmVxdWVzdChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCisgICAgbmd4X2ludF90IHJjKTsKKworc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9wcm94eV9jb21waWxlX2hlYWRlcl9zdGFydChuZ3hfdGFibGVfZWx0X3QgKmgsCisgICAgbmd4X2FycmF5X3QgKmxlbmd0aHMsIG5neF9hcnJheV90ICp2YWx1ZXMsIG5neF91aW50X3QgdmFsdWUpOworc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9wcm94eV9jb21waWxlX2hlYWRlcl9lbmQobmd4X2FycmF5X3QgKmxlbmd0aHMsCisgICAgbmd4X2FycmF5X3QgKnZhbHVlcyk7CisKK3N0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfcHJveHlfaW5pdChuZ3hfY3ljbGVfdCAqY3ljbGUpOworc3RhdGljIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgKm5neF9odHRwX3Byb3h5X2hvc3RfdmFyaWFibGUKKyAgICAobmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1aW50cHRyX3QgZGF0YSk7CitzdGF0aWMgdm9pZCAqbmd4X2h0dHBfcHJveHlfY3JlYXRlX2xvY19jb25mKG5neF9jb25mX3QgKmNmKTsKK3N0YXRpYyBjaGFyICpuZ3hfaHR0cF9wcm94eV9tZXJnZV9sb2NfY29uZihuZ3hfY29uZl90ICpjZiwKKyAgICB2b2lkICpwYXJlbnQsIHZvaWQgKmNoaWxkKTsKKworc3RhdGljIGNoYXIgKm5neF9odHRwX3Byb3h5X3Bhc3Mobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwKKyAgICB2b2lkICpjb25mKTsKKworc3RhdGljIGNoYXIgKm5neF9odHRwX3Byb3h5X3NldF94X3ZhcihuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqY21kLAorICAgIHZvaWQgKmNvbmYpOworc3RhdGljIGNoYXIgKm5neF9odHRwX3Byb3h5X2xvd2F0X2NoZWNrKG5neF9jb25mX3QgKmNmLCB2b2lkICpwb3N0LCB2b2lkICpkYXRhKTsKKworc3RhdGljIG5neF9jb25mX3Bvc3RfdCAgbmd4X2h0dHBfcHJveHlfbG93YXRfcG9zdCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IG5neF9odHRwX3Byb3h5X2xvd2F0X2NoZWNrIH07CisKK3N0YXRpYyBuZ3hfY29uZl9iaXRtYXNrX3QgIG5neF9odHRwX3Byb3h5X25leHRfdXBzdHJlYW1fbWFza3NbXSA9IHsKKyAgICB7IG5neF9zdHJpbmcoImVycm9yIiksIE5HWF9IVFRQX1VQU1RSRUFNX0ZUX0VSUk9SIH0sCisgICAgeyBuZ3hfc3RyaW5nKCJ0aW1lb3V0IiksIE5HWF9IVFRQX1VQU1RSRUFNX0ZUX1RJTUVPVVQgfSwKKyAgICB7IG5neF9zdHJpbmcoImludmFsaWRfaGVhZGVyIiksIE5HWF9IVFRQX1VQU1RSRUFNX0ZUX0lOVkFMSURfSEVBREVSIH0sCisgICAgeyBuZ3hfc3RyaW5nKCJodHRwXzUwMCIpLCBOR1hfSFRUUF9VUFNUUkVBTV9GVF9IVFRQXzUwMCB9LAorICAgIHsgbmd4X3N0cmluZygiaHR0cF80MDQiKSwgTkdYX0hUVFBfVVBTVFJFQU1fRlRfSFRUUF80MDQgfSwKKyAgICB7IG5neF9udWxsX3N0cmluZywgMCB9Cit9OworCisKK3N0YXRpYyBuZ3hfY29tbWFuZF90ICBuZ3hfaHR0cF9wcm94eV9jb21tYW5kc1tdID0geworCisgICAgeyBuZ3hfc3RyaW5nKCJwcm94eV9wYXNzIiksCisgICAgICBOR1hfSFRUUF9MT0NfQ09ORnxOR1hfQ09ORl9UQUtFMSwKKyAgICAgIG5neF9odHRwX3Byb3h5X3Bhc3MsCisgICAgICBOR1hfSFRUUF9MT0NfQ09ORl9PRkZTRVQsCisgICAgICAwLAorICAgICAgTlVMTCB9LAorCisgICAgeyBuZ3hfc3RyaW5nKCJwcm94eV9jb25uZWN0X3RpbWVvdXQiKSwKKyAgICAgIE5HWF9IVFRQX01BSU5fQ09ORnxOR1hfSFRUUF9TUlZfQ09ORnxOR1hfSFRUUF9MT0NfQ09ORnxOR1hfQ09ORl9UQUtFMSwKKyAgICAgIG5neF9jb25mX3NldF9tc2VjX3Nsb3QsCisgICAgICBOR1hfSFRUUF9MT0NfQ09ORl9PRkZTRVQsCisgICAgICBvZmZzZXRvZihuZ3hfaHR0cF9wcm94eV9sb2NfY29uZl90LCB1cHN0cmVhbS5jb25uZWN0X3RpbWVvdXQpLAorICAgICAgTlVMTCB9LAorCisgICAgeyBuZ3hfc3RyaW5nKCJwcm94eV9zZW5kX3RpbWVvdXQiKSwKKyAgICAgIE5HWF9IVFRQX01BSU5fQ09ORnxOR1hfSFRUUF9TUlZfQ09ORnxOR1hfSFRUUF9MT0NfQ09ORnxOR1hfQ09ORl9UQUtFMSwKKyAgICAgIG5neF9jb25mX3NldF9tc2VjX3Nsb3QsCisgICAgICBOR1hfSFRUUF9MT0NfQ09ORl9PRkZTRVQsCisgICAgICBvZmZzZXRvZihuZ3hfaHR0cF9wcm94eV9sb2NfY29uZl90LCB1cHN0cmVhbS5zZW5kX3RpbWVvdXQpLAorICAgICAgTlVMTCB9LAorCisgICAgeyBuZ3hfc3RyaW5nKCJwcm94eV9zZW5kX2xvd2F0IiksCisgICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0NPTkZfVEFLRTEsCisgICAgICBuZ3hfY29uZl9zZXRfc2l6ZV9zbG90LAorICAgICAgTkdYX0hUVFBfTE9DX0NPTkZfT0ZGU0VULAorICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfcHJveHlfbG9jX2NvbmZfdCwgdXBzdHJlYW0uc2VuZF9sb3dhdCksCisgICAgICAmbmd4X2h0dHBfcHJveHlfbG93YXRfcG9zdCB9LAorCisgICAgeyBuZ3hfc3RyaW5nKCJwcm94eV9wYXNzX3VucGFyc2VkX3VyaSIpLAorICAgICAgTkdYX0hUVFBfTUFJTl9DT05GfE5HWF9IVFRQX1NSVl9DT05GfE5HWF9IVFRQX0xPQ19DT05GfE5HWF9DT05GX0ZMQUcsCisgICAgICBuZ3hfY29uZl9zZXRfZmxhZ19zbG90LAorICAgICAgTkdYX0hUVFBfTE9DX0NPTkZfT0ZGU0VULAorICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfcHJveHlfbG9jX2NvbmZfdCwgdXBzdHJlYW0ucGFzc191bnBhcnNlZF91cmkpLAorICAgICAgTlVMTCB9LAorCisgICAgeyBuZ3hfc3RyaW5nKCJwcm94eV9wcmVzZXJ2ZV9ob3N0IiksCisgICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0NPTkZfRkxBRywKKyAgICAgIG5neF9jb25mX3NldF9mbGFnX3Nsb3QsCisgICAgICBOR1hfSFRUUF9MT0NfQ09ORl9PRkZTRVQsCisgICAgICBvZmZzZXRvZihuZ3hfaHR0cF9wcm94eV9sb2NfY29uZl90LCBwcmVzZXJ2ZV9ob3N0KSwKKyAgICAgIE5VTEwgfSwKKworICAgIHsgbmd4X3N0cmluZygicHJveHlfc2V0X3hfdXJsIiksCisgICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0NPTkZfRkxBRywKKyAgICAgIG5neF9jb25mX3NldF9mbGFnX3Nsb3QsCisgICAgICBOR1hfSFRUUF9MT0NfQ09ORl9PRkZTRVQsCisgICAgICBvZmZzZXRvZihuZ3hfaHR0cF9wcm94eV9sb2NfY29uZl90LCBzZXRfeF91cmwpLAorICAgICAgTlVMTCB9LAorCisgICAgeyBuZ3hfc3RyaW5nKCJwcm94eV9zZXRfeF9yZWFsX2lwIiksCisgICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0NPTkZfRkxBRywKKyAgICAgIG5neF9jb25mX3NldF9mbGFnX3Nsb3QsCisgICAgICBOR1hfSFRUUF9MT0NfQ09ORl9PRkZTRVQsCisgICAgICBvZmZzZXRvZihuZ3hfaHR0cF9wcm94eV9sb2NfY29uZl90LCBzZXRfeF9yZWFsX2lwKSwKKyAgICAgIE5VTEwgfSwKKworICAgIHsgbmd4X3N0cmluZygicHJveHlfc2V0X3hfdmFyIiksCisgICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0NPTkZfVEFLRTEsCisgICAgICBuZ3hfaHR0cF9wcm94eV9zZXRfeF92YXIsCisgICAgICBOR1hfSFRUUF9MT0NfQ09ORl9PRkZTRVQsCisgICAgICAwLAorICAgICAgTlVMTCB9LAorCisgICAgeyBuZ3hfc3RyaW5nKCJwcm94eV9hZGRfeF9mb3J3YXJkZWRfZm9yIiksCisgICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0NPTkZfRkxBRywKKyAgICAgIG5neF9jb25mX3NldF9mbGFnX3Nsb3QsCisgICAgICBOR1hfSFRUUF9MT0NfQ09ORl9PRkZTRVQsCisgICAgICBvZmZzZXRvZihuZ3hfaHR0cF9wcm94eV9sb2NfY29uZl90LCBhZGRfeF9mb3J3YXJkZWRfZm9yKSwKKyAgICAgIE5VTEwgfSwKKworICAgIHsgbmd4X3N0cmluZygicHJveHlfaGVhZGVyX2J1ZmZlcl9zaXplIiksCisgICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0NPTkZfVEFLRTEsCisgICAgICBuZ3hfY29uZl9zZXRfc2l6ZV9zbG90LAorICAgICAgTkdYX0hUVFBfTE9DX0NPTkZfT0ZGU0VULAorICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfcHJveHlfbG9jX2NvbmZfdCwgdXBzdHJlYW0uaGVhZGVyX2J1ZmZlcl9zaXplKSwKKyAgICAgIE5VTEwgfSwKKworICAgIHsgbmd4X3N0cmluZygicHJveHlfcmVhZF90aW1lb3V0IiksCisgICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0NPTkZfVEFLRTEsCisgICAgICBuZ3hfY29uZl9zZXRfbXNlY19zbG90LAorICAgICAgTkdYX0hUVFBfTE9DX0NPTkZfT0ZGU0VULAorICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfcHJveHlfbG9jX2NvbmZfdCwgdXBzdHJlYW0ucmVhZF90aW1lb3V0KSwKKyAgICAgIE5VTEwgfSwKKworICAgIHsgbmd4X3N0cmluZygicHJveHlfYnVmZmVycyIpLAorICAgICAgTkdYX0hUVFBfTUFJTl9DT05GfE5HWF9IVFRQX1NSVl9DT05GfE5HWF9IVFRQX0xPQ19DT05GfE5HWF9DT05GX1RBS0UyLAorICAgICAgbmd4X2NvbmZfc2V0X2J1ZnNfc2xvdCwKKyAgICAgIE5HWF9IVFRQX0xPQ19DT05GX09GRlNFVCwKKyAgICAgIG9mZnNldG9mKG5neF9odHRwX3Byb3h5X2xvY19jb25mX3QsIHVwc3RyZWFtLmJ1ZnMpLAorICAgICAgTlVMTCB9LAorCisgICAgeyBuZ3hfc3RyaW5nKCJwcm94eV9idXN5X2J1ZmZlcnNfc2l6ZSIpLAorICAgICAgTkdYX0hUVFBfTUFJTl9DT05GfE5HWF9IVFRQX1NSVl9DT05GfE5HWF9IVFRQX0xPQ19DT05GfE5HWF9DT05GX1RBS0UxLAorICAgICAgbmd4X2NvbmZfc2V0X3NpemVfc2xvdCwKKyAgICAgIE5HWF9IVFRQX0xPQ19DT05GX09GRlNFVCwKKyAgICAgIG9mZnNldG9mKG5neF9odHRwX3Byb3h5X2xvY19jb25mX3QsIHVwc3RyZWFtLmJ1c3lfYnVmZmVyc19zaXplKSwKKyAgICAgIE5VTEwgfSwKKworICAgIHsgbmd4X3N0cmluZygicHJveHlfdGVtcF9wYXRoIiksCisgICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0NPTkZfVEFLRTEyMzQsCisgICAgICBuZ3hfY29uZl9zZXRfcGF0aF9zbG90LAorICAgICAgTkdYX0hUVFBfTE9DX0NPTkZfT0ZGU0VULAorICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfcHJveHlfbG9jX2NvbmZfdCwgdXBzdHJlYW0udGVtcF9wYXRoKSwKKyAgICAgICh2b2lkICopIG5neF9nYXJiYWdlX2NvbGxlY3Rvcl90ZW1wX2hhbmRsZXIgfSwKKworICAgIHsgbmd4X3N0cmluZygicHJveHlfbWF4X3RlbXBfZmlsZV9zaXplIiksCisgICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0NPTkZfVEFLRTEsCisgICAgICBuZ3hfY29uZl9zZXRfc2l6ZV9zbG90LAorICAgICAgTkdYX0hUVFBfTE9DX0NPTkZfT0ZGU0VULAorICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfcHJveHlfbG9jX2NvbmZfdCwgdXBzdHJlYW0ubWF4X3RlbXBfZmlsZV9zaXplKSwKKyAgICAgIE5VTEwgfSwKKworICAgIHsgbmd4X3N0cmluZygicHJveHlfdGVtcF9maWxlX3dyaXRlX3NpemUiKSwKKyAgICAgIE5HWF9IVFRQX01BSU5fQ09ORnxOR1hfSFRUUF9TUlZfQ09ORnxOR1hfSFRUUF9MT0NfQ09ORnxOR1hfQ09ORl9UQUtFMSwKKyAgICAgIG5neF9jb25mX3NldF9zaXplX3Nsb3QsCisgICAgICBOR1hfSFRUUF9MT0NfQ09ORl9PRkZTRVQsCisgICAgICBvZmZzZXRvZihuZ3hfaHR0cF9wcm94eV9sb2NfY29uZl90LCB1cHN0cmVhbS50ZW1wX2ZpbGVfd3JpdGVfc2l6ZSksCisgICAgICBOVUxMIH0sCisKKyAgICB7IG5neF9zdHJpbmcoInByb3h5X25leHRfdXBzdHJlYW0iKSwKKyAgICAgIE5HWF9IVFRQX01BSU5fQ09ORnxOR1hfSFRUUF9TUlZfQ09ORnxOR1hfSFRUUF9MT0NfQ09ORnxOR1hfQ09ORl9BTlksCisgICAgICBuZ3hfY29uZl9zZXRfYml0bWFza19zbG90LAorICAgICAgTkdYX0hUVFBfTE9DX0NPTkZfT0ZGU0VULAorICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfcHJveHlfbG9jX2NvbmZfdCwgdXBzdHJlYW0ubmV4dF91cHN0cmVhbSksCisgICAgICAmbmd4X2h0dHBfcHJveHlfbmV4dF91cHN0cmVhbV9tYXNrcyB9LAorCisgICAgeyBuZ3hfc3RyaW5nKCJwcm94eV9wYXNzX3NlcnZlciIpLAorICAgICAgTkdYX0hUVFBfTUFJTl9DT05GfE5HWF9IVFRQX1NSVl9DT05GfE5HWF9IVFRQX0xPQ19DT05GfE5HWF9DT05GX0ZMQUcsCisgICAgICBuZ3hfY29uZl9zZXRfZmxhZ19zbG90LAorICAgICAgTkdYX0hUVFBfTE9DX0NPTkZfT0ZGU0VULAorICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfcHJveHlfbG9jX2NvbmZfdCwgcGFzc19zZXJ2ZXIpLAorICAgICAgTlVMTCB9LAorCisgICAgeyBuZ3hfc3RyaW5nKCJwcm94eV9wYXNzX3hfYWNjZWxfZXhwaXJlcyIpLAorICAgICAgTkdYX0hUVFBfTUFJTl9DT05GfE5HWF9IVFRQX1NSVl9DT05GfE5HWF9IVFRQX0xPQ19DT05GfE5HWF9DT05GX0ZMQUcsCisgICAgICBuZ3hfY29uZl9zZXRfZmxhZ19zbG90LAorICAgICAgTkdYX0hUVFBfTE9DX0NPTkZfT0ZGU0VULAorICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfcHJveHlfbG9jX2NvbmZfdCwgcGFzc194X2FjY2VsX2V4cGlyZXMpLAorICAgICAgTlVMTCB9LAorCisgICAgICBuZ3hfbnVsbF9jb21tYW5kCit9OworCisKK25neF9odHRwX21vZHVsZV90ICBuZ3hfaHR0cF9wcm94eV9tb2R1bGVfY3R4ID0geworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByZSBjb25mICovCisKKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjcmVhdGUgbWFpbiBjb25maWd1cmF0aW9uICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdCBtYWluIGNvbmZpZ3VyYXRpb24gKi8KKworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSBzZXJ2ZXIgY29uZmlndXJhdGlvbiAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1lcmdlIHNlcnZlciBjb25maWd1cmF0aW9uICovCisKKyAgICBuZ3hfaHR0cF9wcm94eV9jcmVhdGVfbG9jX2NvbmYsICAgICAgICAvKiBjcmVhdGUgbG9jYXRpb24gY29uZmlncmF0aW9uICovCisgICAgbmd4X2h0dHBfcHJveHlfbWVyZ2VfbG9jX2NvbmYgICAgICAgICAgLyogbWVyZ2UgbG9jYXRpb24gY29uZmlncmF0aW9uICovCit9OworCisKK25neF9tb2R1bGVfdCAgbmd4X2h0dHBfcHJveHlfbW9kdWxlID0geworICAgIE5HWF9NT0RVTEUsCisgICAgJm5neF9odHRwX3Byb3h5X21vZHVsZV9jdHgsICAgICAgICAgICAgLyogbW9kdWxlIGNvbnRleHQgKi8KKyAgICBuZ3hfaHR0cF9wcm94eV9jb21tYW5kcywgICAgICAgICAgICAgICAvKiBtb2R1bGUgZGlyZWN0aXZlcyAqLworICAgIE5HWF9IVFRQX01PRFVMRSwgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vZHVsZSB0eXBlICovCisgICAgbmd4X2h0dHBfcHJveHlfaW5pdCwgICAgICAgICAgICAgICAgICAgLyogaW5pdCBtb2R1bGUgKi8KKyAgICBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0IHByb2Nlc3MgKi8KK307CisKKworc3RhdGljIG5neF9zdHJfdCBuZ3hfaHR0cF9wcm94eV9tZXRob2RzW10gPSB7CisgICAgbmd4X3N0cmluZygiR0VUIiksCisgICAgbmd4X3N0cmluZygiSEVBRCIpLAorICAgIG5neF9zdHJpbmcoIlBPU1QiKQorfTsKKworCitzdGF0aWMgY2hhciAgbmd4X2h0dHBfcHJveHlfdmVyc2lvbltdID0gIiBIVFRQLzEuMCIgQ1JMRjsKKworc3RhdGljIG5neF9zdHJfdCAgbmd4X2h0dHBfcHJveHlfaG9zdCA9IG5neF9zdHJpbmcoIlBST1hZX0hPU1QiKTsKKworCisjaWYgKE5HWF9QQ1JFKQorc3RhdGljIG5neF9zdHJfdCBuZ3hfaHR0cF9wcm94eV91cmkgPSBuZ3hfc3RyaW5nKCIvIik7CisjZW5kaWYKKworCisjaWYgMAorCituZ3hfaHR0cF9oZWFkZXJfdCBuZ3hfaHR0cF9wcm94eV9oZWFkZXJzX2luW10gPSB7CisgICAgeyBuZ3hfc3RyaW5nKCJEYXRlIiksIG9mZnNldG9mKG5neF9odHRwX3Byb3h5X2hlYWRlcnNfaW5fdCwgZGF0ZSkgfSwKKyAgICB7IG5neF9zdHJpbmcoIlNlcnZlciIpLCBvZmZzZXRvZihuZ3hfaHR0cF9wcm94eV9oZWFkZXJzX2luX3QsIHNlcnZlcikgfSwKKworICAgIHsgbmd4X3N0cmluZygiRXhwaXJlcyIpLCBvZmZzZXRvZihuZ3hfaHR0cF9wcm94eV9oZWFkZXJzX2luX3QsIGV4cGlyZXMpIH0sCisgICAgeyBuZ3hfc3RyaW5nKCJDYWNoZS1Db250cm9sIiksCisgICAgICAgICAgICAgICAgIG9mZnNldG9mKG5neF9odHRwX3Byb3h5X2hlYWRlcnNfaW5fdCwgY2FjaGVfY29udHJvbCkgfSwKKyAgICB7IG5neF9zdHJpbmcoIkVUYWciKSwgb2Zmc2V0b2Yobmd4X2h0dHBfcHJveHlfaGVhZGVyc19pbl90LCBldGFnKSB9LAorICAgIHsgbmd4X3N0cmluZygiWC1BY2NlbC1FeHBpcmVzIiksCisgICAgICAgICAgICAgICAgIG9mZnNldG9mKG5neF9odHRwX3Byb3h5X2hlYWRlcnNfaW5fdCwgeF9hY2NlbF9leHBpcmVzKSB9LAorCisgICAgeyBuZ3hfc3RyaW5nKCJDb25uZWN0aW9uIiksCisgICAgICAgICAgICAgICAgIG9mZnNldG9mKG5neF9odHRwX3Byb3h5X2hlYWRlcnNfaW5fdCwgY29ubmVjdGlvbikgfSwKKyAgICB7IG5neF9zdHJpbmcoIkNvbnRlbnQtVHlwZSIpLAorICAgICAgICAgICAgICAgICBvZmZzZXRvZihuZ3hfaHR0cF9wcm94eV9oZWFkZXJzX2luX3QsIGNvbnRlbnRfdHlwZSkgfSwKKyAgICB7IG5neF9zdHJpbmcoIkNvbnRlbnQtTGVuZ3RoIiksCisgICAgICAgICAgICAgICAgIG9mZnNldG9mKG5neF9odHRwX3Byb3h5X2hlYWRlcnNfaW5fdCwgY29udGVudF9sZW5ndGgpIH0sCisKKyNpZiAoTkdYX0hUVFBfR1pJUCkKKyAgICB7IG5neF9zdHJpbmcoIkNvbnRlbnQtRW5jb2RpbmciKSwKKyAgICAgICAgICAgICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfcHJveHlfaGVhZGVyc19pbl90LCBjb250ZW50X2VuY29kaW5nKSB9LAorI2VuZGlmCisKKyAgICB7IG5neF9zdHJpbmcoIkxhc3QtTW9kaWZpZWQiKSwKKyAgICAgICAgICAgICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfcHJveHlfaGVhZGVyc19pbl90LCBsYXN0X21vZGlmaWVkKSB9LAorICAgIHsgbmd4X3N0cmluZygiTG9jYXRpb24iKSwKKyAgICAgICAgICAgICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfcHJveHlfaGVhZGVyc19pbl90LCBsb2NhdGlvbikgfSwKKyAgICB7IG5neF9zdHJpbmcoIkFjY2VwdC1SYW5nZXMiKSwKKyAgICAgICAgICAgICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfcHJveHlfaGVhZGVyc19pbl90LCBhY2NlcHRfcmFuZ2VzKSB9LAorICAgIHsgbmd4X3N0cmluZygiWC1QYWQiKSwgb2Zmc2V0b2Yobmd4X2h0dHBfcHJveHlfaGVhZGVyc19pbl90LCB4X3BhZCkgfSwKKworICAgIHsgbmd4X251bGxfc3RyaW5nLCAwIH0KK307CisKKyNlbmRpZgorCisKK3N0YXRpYyBuZ3hfaW50X3QKK25neF9odHRwX3Byb3h5X2hhbmRsZXIobmd4X2h0dHBfcmVxdWVzdF90ICpyKQoreyAgIAorICAgIG5neF9pbnRfdCAgICAgICAgICAgICAgICAgICByYzsKKyAgICBuZ3hfaHR0cF91cHN0cmVhbV90ICAgICAgICAqdTsKKyAgICBuZ3hfaHR0cF9wcm94eV9sb2NfY29uZl90ICAqcGxjZjsKKyAgICAKKyAgICBwbGNmID0gbmd4X2h0dHBfZ2V0X21vZHVsZV9sb2NfY29uZihyLCBuZ3hfaHR0cF9wcm94eV9tb2R1bGUpOworICAgIAorICAgIHUgPSBuZ3hfcGNhbGxvYyhyLT5wb29sLCBzaXplb2Yobmd4X2h0dHBfdXBzdHJlYW1fdCkpOworICAgIGlmICh1ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKKyAgICB9CisgICAgCisgICAgdS0+cGVlci5sb2cgPSByLT5jb25uZWN0aW9uLT5sb2c7CisgICAgdS0+cGVlci5sb2dfZXJyb3IgPSBOR1hfRVJST1JfRVJSOworICAgIHUtPnBlZXIucGVlcnMgPSBwbGNmLT5wZWVyczsKKyAgICB1LT5wZWVyLnRyaWVzID0gcGxjZi0+cGVlcnMtPm51bWJlcjsKKyNpZiAoTkdYX1RIUkVBRFMpCisgICAgdS0+cGVlci5sb2NrID0gJnItPmNvbm5lY3Rpb24tPmxvY2s7CisjZW5kaWYKKworICAgIHUtPm91dHB1dC50YWcgPSAobmd4X2J1Zl90YWdfdCkgJm5neF9odHRwX3Byb3h5X21vZHVsZTsKKworICAgIHUtPmNvbmYgPSAmcGxjZi0+dXBzdHJlYW07CisKKyAgICB1LT5jcmVhdGVfcmVxdWVzdCA9IG5neF9odHRwX3Byb3h5X2NyZWF0ZV9yZXF1ZXN0OworICAgIHUtPnJlaW5pdF9yZXF1ZXN0ID0gbmd4X2h0dHBfcHJveHlfcmVpbml0X3JlcXVlc3Q7CisgICAgdS0+cHJvY2Vzc19oZWFkZXIgPSBuZ3hfaHR0cF9wcm94eV9wcm9jZXNzX2hlYWRlcjsKKyAgICB1LT5zZW5kX2hlYWRlciA9IG5neF9odHRwX3Byb3h5X3NlbmRfaGVhZGVyOworICAgIHUtPmFib3J0X3JlcXVlc3QgPSBuZ3hfaHR0cF9wcm94eV9hYm9ydF9yZXF1ZXN0OworICAgIHUtPmZpbmFsaXplX3JlcXVlc3QgPSBuZ3hfaHR0cF9wcm94eV9maW5hbGl6ZV9yZXF1ZXN0OworCisgICAgdS0+cGlwZS5pbnB1dF9maWx0ZXIgPSBuZ3hfZXZlbnRfcGlwZV9jb3B5X2lucHV0X2ZpbHRlcjsKKworICAgIHUtPmxvZ19jdHggPSByLT5jb25uZWN0aW9uLT5sb2ctPmRhdGE7CisgICAgdS0+bG9nX2hhbmRsZXIgPSBuZ3hfaHR0cF91cHN0cmVhbV9sb2dfZXJyb3I7CisKKyAgICB1LT5zY2hlbWEwLmxlbiA9IHNpemVvZigiaHR0cDovLyIpIC0gMTsKKyAgICB1LT5zY2hlbWEwLmRhdGEgPSAodV9jaGFyICopICJodHRwOi8vIjsKKyAgICB1LT51cmkwID0gcGxjZi0+dXJpMDsKKyAgICB1LT5sb2NhdGlvbjAgPSBwbGNmLT5sb2NhdGlvbjA7CisgICAgCisgICAgci0+dXBzdHJlYW0gPSB1OworCisgICAgcmMgPSBuZ3hfaHR0cF9yZWFkX2NsaWVudF9yZXF1ZXN0X2JvZHkociwgbmd4X2h0dHBfdXBzdHJlYW1faW5pdCk7CisKKyAgICBpZiAocmMgPj0gTkdYX0hUVFBfU1BFQ0lBTF9SRVNQT05TRSkgeworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgcmV0dXJuIE5HWF9ET05FOworfQorCisKK3N0YXRpYyBuZ3hfaW50X3QKK25neF9odHRwX3Byb3h5X2NyZWF0ZV9yZXF1ZXN0KG5neF9odHRwX3JlcXVlc3RfdCAqcikKK3sKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbjsKKyAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgICAgIGksIGtleTsKKyAgICB1aW50cHRyX3QgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZTsKKyAgICBuZ3hfYnVmX3QgICAgICAgICAgICAgICAgICAgICAgKmI7CisgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgICAgICpoaDsKKyAgICBuZ3hfY2hhaW5fdCAgICAgICAgICAgICAgICAgICAgKmNsOworICAgIG5neF9saXN0X3BhcnRfdCAgICAgICAgICAgICAgICAqcGFydDsKKyAgICBuZ3hfdGFibGVfZWx0X3QgICAgICAgICAgICAgICAgKmhlYWRlcjsKKyAgICBuZ3hfaHR0cF91cHN0cmVhbV90ICAgICAgICAgICAgKnU7CisgICAgbmd4X2h0dHBfcHJveHlfbG9jX2NvbmZfdCAgICAgICpwbGNmOworICAgIG5neF9odHRwX3NjcmlwdF9jb2RlX3B0ICAgICAgICAgY29kZTsKKyAgICBuZ3hfaHR0cF9zY3JpcHRfbGVuX2NvZGVfcHQgICAgIGxjb2RlOworICAgIG5neF9odHRwX3NjcmlwdF9saXRlX2VuZ2luZV90ICAgZTsKKworICAgIHUgPSByLT51cHN0cmVhbTsKKworICAgIHBsY2YgPSBuZ3hfaHR0cF9nZXRfbW9kdWxlX2xvY19jb25mKHIsIG5neF9odHRwX3Byb3h5X21vZHVsZSk7CisKKyAgICBsZW4gPSBzaXplb2Yobmd4X2h0dHBfcHJveHlfdmVyc2lvbikgLSAxICsgc2l6ZW9mKENSTEYpIC0gMTsKKworICAgIGlmICh1LT5tZXRob2QpIHsKKyAgICAgICAgbGVuICs9IG5neF9odHRwX3Byb3h5X21ldGhvZHNbdS0+bWV0aG9kIC0gMV0ubGVuICsgdS0+dXJpMC5sZW47CisgICAgfSBlbHNlIHsKKyAgICAgICAgbGVuICs9IHItPm1ldGhvZF9uYW1lLmxlbiArIHUtPnVyaTAubGVuOworICAgIH0KKworICAgIGVzY2FwZSA9IDA7CisgICAgCisgICAgaWYgKHBsY2YtPnVwc3RyZWFtLnBhc3NfdW5wYXJzZWRfdXJpICYmIHItPnZhbGlkX3VucGFyc2VkX3VyaSkgeworICAgICAgICBsZW4gKz0gci0+dW5wYXJzZWRfdXJpLmxlbiAtIDE7CisKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoci0+cXVvdGVkX3VyaSkgeworICAgICAgICAgICAgZXNjYXBlID0gMiAqIG5neF9lc2NhcGVfdXJpKE5VTEwsIHItPnVyaS5kYXRhICsgdS0+bG9jYXRpb24wLT5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+dXJpLmxlbiAtIHUtPmxvY2F0aW9uMC0+bGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HWF9FU0NBUEVfVVJJKTsKKyAgICAgICAgfQorCisgICAgICAgIGxlbiArPSByLT51cmkubGVuIC0gdS0+bG9jYXRpb24wLT5sZW4gKyBlc2NhcGUKKyAgICAgICAgICAgICsgc2l6ZW9mKCI/IikgLSAxICsgci0+YXJncy5sZW47CisgICAgfQorCisKKyAgICBlLmlwID0gcGxjZi0+aGVhZGVyc19zZXRfbGVuLT5lbHRzOworICAgIGUucmVxdWVzdCA9IHI7CisKKyAgICB3aGlsZSAoKih1aW50cHRyX3QgKikgZS5pcCkgeworICAgICAgICBsY29kZSA9ICoobmd4X2h0dHBfc2NyaXB0X2xlbl9jb2RlX3B0ICopIGUuaXA7CisgICAgICAgIGxlbiArPSBsY29kZSgmZSk7CisgICAgfQorCisKKyAgICBwYXJ0ID0gJnItPmhlYWRlcnNfaW4uaGVhZGVycy5wYXJ0OworICAgIGhlYWRlciA9IHBhcnQtPmVsdHM7CisgICAgaGggPSAobmd4X3N0cl90ICopIHBsY2YtPmhlYWRlcnNfc2V0X2hhc2gtPmJ1Y2tldHM7CisKKyAgICBmb3IgKGkgPSAwOyAvKiB2b2lkICovOyBpKyspIHsKKworICAgICAgICBpZiAoaSA+PSBwYXJ0LT5uZWx0cykgeworICAgICAgICAgICAgaWYgKHBhcnQtPm5leHQgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwYXJ0ID0gcGFydC0+bmV4dDsKKyAgICAgICAgICAgIGhlYWRlciA9IHBhcnQtPmVsdHM7CisgICAgICAgICAgICBpID0gMDsgCisgICAgICAgIH0KKworICAgICAgICBrZXkgPSBoZWFkZXJbaV0uaGFzaCAlIHBsY2YtPmhlYWRlcnNfc2V0X2hhc2gtPmhhc2hfc2l6ZTsKKworICAgICAgICBpZiAoaGhba2V5XS5sZW4gPT0gaGVhZGVyW2ldLmtleS5sZW4KKyAgICAgICAgICAgICYmIG5neF9zdHJjYXNlY21wKGhoW2tleV0uZGF0YSwgaGVhZGVyW2ldLmtleS5kYXRhKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGxlbiArPSBoZWFkZXJbaV0ua2V5LmxlbiArIHNpemVvZigiOiAiKSAtIDEKKyAgICAgICAgICAgICsgaGVhZGVyW2ldLnZhbHVlLmxlbiArIHNpemVvZihDUkxGKSAtIDE7CisgICAgfQorCisgICAgYiA9IG5neF9jcmVhdGVfdGVtcF9idWYoci0+cG9vbCwgbGVuKTsKKyAgICBpZiAoYiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgfQorCisgICAgY2wgPSBuZ3hfYWxsb2NfY2hhaW5fbGluayhyLT5wb29sKTsKKyAgICBpZiAoY2wgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgIH0KKworICAgIGNsLT5idWYgPSBiOworICAgIGNsLT5uZXh0ID0gTlVMTDsKKworICAgIHItPnJlcXVlc3RfYm9keS0+YnVmcyA9IGNsOworCisKKyAgICAvKiB0aGUgcmVxdWVzdCBsaW5lICovCisKKyAgICBpZiAodS0+bWV0aG9kKSB7CisgICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX3Byb3h5X21ldGhvZHNbdS0+bWV0aG9kIC0gMV0uZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfcHJveHlfbWV0aG9kc1t1LT5tZXRob2QgLSAxXS5sZW4pOworICAgIH0gZWxzZSB7CisgICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsIHItPm1ldGhvZF9uYW1lLmRhdGEsIHItPm1ldGhvZF9uYW1lLmxlbik7CisgICAgfQorCisgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgdS0+dXJpMC5kYXRhLCB1LT51cmkwLmxlbik7CisKKyAgICBpZiAocGxjZi0+dXBzdHJlYW0ucGFzc191bnBhcnNlZF91cmkgJiYgci0+dmFsaWRfdW5wYXJzZWRfdXJpKSB7CisgICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsIHItPnVucGFyc2VkX3VyaS5kYXRhICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+dW5wYXJzZWRfdXJpLmxlbiAtIDEpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChlc2NhcGUpIHsKKyAgICAgICAgICAgIG5neF9lc2NhcGVfdXJpKGItPmxhc3QsIHItPnVyaS5kYXRhICsgdS0+bG9jYXRpb24wLT5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICByLT51cmkubGVuIC0gdS0+bG9jYXRpb24wLT5sZW4sIE5HWF9FU0NBUEVfVVJJKTsKKyAgICAgICAgICAgIGItPmxhc3QgKz0gci0+dXJpLmxlbiAtIHUtPmxvY2F0aW9uMC0+bGVuICsgZXNjYXBlOworCisgICAgICAgIH0gZWxzZSB7IAorICAgICAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgci0+dXJpLmRhdGEgKyB1LT5sb2NhdGlvbjAtPmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHItPnVyaS5sZW4gLSB1LT5sb2NhdGlvbjAtPmxlbik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoci0+YXJncy5sZW4gPiAwKSB7CisgICAgICAgICAgICAqYi0+bGFzdCsrID0gJz8nOworICAgICAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgci0+YXJncy5kYXRhLCByLT5hcmdzLmxlbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCBuZ3hfaHR0cF9wcm94eV92ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfaHR0cF9wcm94eV92ZXJzaW9uKSAtIDEpOworCisKKyAgICBlLmlwID0gcGxjZi0+aGVhZGVyc19zZXQtPmVsdHM7CisgICAgZS5wb3MgPSBiLT5sYXN0OworCisgICAgd2hpbGUgKCoodWludHB0cl90ICopIGUuaXApIHsKKyAgICAgICAgY29kZSA9ICoobmd4X2h0dHBfc2NyaXB0X2NvZGVfcHQgKikgZS5pcDsKKyAgICAgICAgY29kZSgobmd4X2h0dHBfc2NyaXB0X2VuZ2luZV90ICopICZlKTsKKyAgICB9CisKKyAgICBiLT5sYXN0ID0gZS5wb3M7CisKKworICAgIHBhcnQgPSAmci0+aGVhZGVyc19pbi5oZWFkZXJzLnBhcnQ7CisgICAgaGVhZGVyID0gcGFydC0+ZWx0czsKKyAgICAKKyAgICBmb3IgKGkgPSAwOyAvKiB2b2lkICovOyBpKyspIHsKKworICAgICAgICBpZiAoaSA+PSBwYXJ0LT5uZWx0cykgeworICAgICAgICAgICAgaWYgKHBhcnQtPm5leHQgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwYXJ0ID0gcGFydC0+bmV4dDsKKyAgICAgICAgICAgIGhlYWRlciA9IHBhcnQtPmVsdHM7CisgICAgICAgICAgICBpID0gMDsgCisgICAgICAgIH0KKworICAgICAgICBrZXkgPSBoZWFkZXJbaV0uaGFzaCAlIHBsY2YtPmhlYWRlcnNfc2V0X2hhc2gtPmhhc2hfc2l6ZTsKKworICAgICAgICBpZiAoaGhba2V5XS5sZW4gPT0gaGVhZGVyW2ldLmtleS5sZW4KKyAgICAgICAgICAgICYmIG5neF9zdHJjYXNlY21wKGhoW2tleV0uZGF0YSwgaGVhZGVyW2ldLmtleS5kYXRhKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsIGhlYWRlcltpXS5rZXkuZGF0YSwgaGVhZGVyW2ldLmtleS5sZW4pOworCisgICAgICAgICpiLT5sYXN0KysgPSAnOic7ICpiLT5sYXN0KysgPSAnICc7CisKKyAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgaGVhZGVyW2ldLnZhbHVlLmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcltpXS52YWx1ZS5sZW4pOworCisgICAgICAgICpiLT5sYXN0KysgPSBDUjsgKmItPmxhc3QrKyA9IExGOworCisgICAgICAgIG5neF9sb2dfZGVidWcyKE5HWF9MT0dfREVCVUdfSFRUUCwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAiaHR0cCBwcm94eSBoZWFkZXI6IFwiJVY6ICVWXCIiLAorICAgICAgICAgICAgICAgICAgICAgICAmaGVhZGVyW2ldLmtleSwgJmhlYWRlcltpXS52YWx1ZSk7CisgICAgfQorCisgICAgLyogYWRkICJcclxuIiBhdCB0aGUgaGVhZGVyIGVuZCAqLworICAgICpiLT5sYXN0KysgPSBDUjsgKmItPmxhc3QrKyA9IExGOworCisjaWYgKE5HWF9ERUJVRykKKyAgICB7CisgICAgbmd4X3N0cl90ICBzOworCisgICAgcy5sZW4gPSBiLT5sYXN0IC0gYi0+cG9zOworICAgIHMuZGF0YSA9IGItPnBvczsKKyAgICBuZ3hfbG9nX2RlYnVnMShOR1hfTE9HX0RFQlVHX0hUVFAsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAiaHR0cCBwcm94eSBoZWFkZXI6XG5cIiVWXCIiLCAmcyk7CisgICAgfQorI2VuZGlmCisKKyAgICByZXR1cm4gTkdYX09LOworfQorCisKK3N0YXRpYyBuZ3hfaW50X3QKK25neF9odHRwX3Byb3h5X3JlaW5pdF9yZXF1ZXN0KG5neF9odHRwX3JlcXVlc3RfdCAqcikKK3sKKyAgICByZXR1cm4gTkdYX09LOworfQorCisKK3N0YXRpYyBuZ3hfaW50X3QKK25neF9odHRwX3Byb3h5X3Byb2Nlc3NfaGVhZGVyKG5neF9odHRwX3JlcXVlc3RfdCAqcikKK3sKKyAgICByZXR1cm4gTkdYX09LOworfQorCisKK3N0YXRpYyBuZ3hfaW50X3QKK25neF9odHRwX3Byb3h5X3NlbmRfaGVhZGVyKG5neF9odHRwX3JlcXVlc3RfdCAqcikKK3sKKyAgICByZXR1cm4gTkdYX09LOworfQorCisKK3N0YXRpYyB2b2lkCituZ3hfaHR0cF9wcm94eV9hYm9ydF9yZXF1ZXN0KG5neF9odHRwX3JlcXVlc3RfdCAqcikKK3sKKyAgICBuZ3hfbG9nX2RlYnVnMChOR1hfTE9HX0RFQlVHX0hUVFAsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAiYWJvcnQgaHR0cCBwcm94eSByZXF1ZXN0Iik7CisgICAgCisgICAgcmV0dXJuOworfQorCisKK3N0YXRpYyB2b2lkCituZ3hfaHR0cF9wcm94eV9maW5hbGl6ZV9yZXF1ZXN0KG5neF9odHRwX3JlcXVlc3RfdCAqciwgbmd4X2ludF90IHJjKQoreyAgIAorICAgIG5neF9sb2dfZGVidWcwKE5HWF9MT0dfREVCVUdfSFRUUCwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICJmaW5hbGl6ZSBodHRwIHByb3h5IHJlcXVlc3QiKTsKKworICAgIHJldHVybjsKK30KKworCitzdGF0aWMgbmd4X2ludF90CituZ3hfaHR0cF9wcm94eV9pbml0KG5neF9jeWNsZV90ICpjeWNsZSkKK3sKKyNpZiAwCisgICAgbmd4X2h0dHBfdmFyaWFibGVfdCAgKnZhcjsKKworICAgIHZhciA9IG5neF9odHRwX2FkZF92YXJpYWJsZShjZiwgJm5neF9odHRwX3Byb3h5X2hvc3QsIDEpOworICAgIGlmICh2YXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgIH0KKworICAgIHZhci0+aGFuZGxlciA9IG5neF9odHRwX3Byb3h5X2hvc3RfdmFyaWFibGU7CisjZW5kaWYKKworICAgIHJldHVybiBOR1hfT0s7CisKKyNpZiAwCisgICAgbmd4X2h0dHBfbG9nX29wX25hbWVfdCAgKm9wOworCisgICAgZm9yIChvcCA9IG5neF9odHRwX3Byb3h5X2xvZ19mbXRfb3BzOyBvcC0+bmFtZS5sZW47IG9wKyspIHsgLyogdm9pZCAqLyB9CisgICAgb3AtPnJ1biA9IE5VTEw7CisKKyAgICBmb3IgKG9wID0gbmd4X2h0dHBfbG9nX2ZtdF9vcHM7IG9wLT5ydW47IG9wKyspIHsKKyAgICAgICAgaWYgKG9wLT5uYW1lLmxlbiA9PSAwKSB7CisgICAgICAgICAgICBvcCA9IChuZ3hfaHR0cF9sb2dfb3BfbmFtZV90ICopIG9wLT5ydW47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBvcC0+cnVuID0gKG5neF9odHRwX2xvZ19vcF9ydW5fcHQpIG5neF9odHRwX3Byb3h5X2xvZ19mbXRfb3BzOworCisjZW5kaWYKK30KKworCitzdGF0aWMgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAqCituZ3hfaHR0cF9wcm94eV9ob3N0X3ZhcmlhYmxlKG5neF9odHRwX3JlcXVlc3RfdCAqciwgdWludHB0cl90IGRhdGEpCit7CisgICAgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAgKnZhcjsKKyAgICBuZ3hfaHR0cF9wcm94eV9sb2NfY29uZl90ICAqcGxjZjsKKworICAgIHZhciA9IG5neF9wYWxsb2Moci0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QpKTsKKyAgICBpZiAodmFyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcGxjZiA9IG5neF9odHRwX2dldF9tb2R1bGVfbG9jX2NvbmYociwgbmd4X2h0dHBfcHJveHlfbW9kdWxlKTsKKworICAgIHZhci0+dmFsdWUgPSAwOworICAgIHZhci0+dGV4dCA9IHBsY2YtPmhvc3RfaGVhZGVyOworCisgICAgcmV0dXJuIHZhcjsKK30KKworCitzdGF0aWMgdm9pZCAqCituZ3hfaHR0cF9wcm94eV9jcmVhdGVfbG9jX2NvbmYobmd4X2NvbmZfdCAqY2YpCit7CisgICAgbmd4X2h0dHBfcHJveHlfbG9jX2NvbmZfdCAgKmNvbmY7CisKKyAgICBjb25mID0gbmd4X3BjYWxsb2MoY2YtPnBvb2wsIHNpemVvZihuZ3hfaHR0cF9wcm94eV9sb2NfY29uZl90KSk7CisgICAgaWYgKGNvbmYgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBzZXQgYnkgbmd4X3BjYWxsb2MoKToKKyAgICAgKgorICAgICAqICAgICBjb25mLT51cHN0cmVhbS5idWZzLm51bSA9IDA7CisgICAgICogICAgIGNvbmYtPnVwc3RyZWFtLnBhdGggPSBOVUxMOworICAgICAqICAgICBjb25mLT51cHN0cmVhbS5uZXh0X3Vwc3RyZWFtID0gMDsKKyAgICAgKiAgICAgY29uZi0+dXBzdHJlYW0udGVtcF9wYXRoID0gTlVMTDsKKyAgICAgKi8KKyAgICAKKyAgICBjb25mLT51cHN0cmVhbS5jb25uZWN0X3RpbWVvdXQgPSBOR1hfQ09ORl9VTlNFVF9NU0VDOworICAgIGNvbmYtPnVwc3RyZWFtLnNlbmRfdGltZW91dCA9IE5HWF9DT05GX1VOU0VUX01TRUM7CisgICAgY29uZi0+dXBzdHJlYW0ucmVhZF90aW1lb3V0ID0gTkdYX0NPTkZfVU5TRVRfTVNFQzsKKworICAgIGNvbmYtPnVwc3RyZWFtLnNlbmRfbG93YXQgPSBOR1hfQ09ORl9VTlNFVF9TSVpFOworICAgIGNvbmYtPnVwc3RyZWFtLmhlYWRlcl9idWZmZXJfc2l6ZSA9IE5HWF9DT05GX1VOU0VUX1NJWkU7CisgICAgY29uZi0+dXBzdHJlYW0uYnVzeV9idWZmZXJzX3NpemUgPSBOR1hfQ09ORl9VTlNFVF9TSVpFOworICAgIGNvbmYtPnVwc3RyZWFtLm1heF90ZW1wX2ZpbGVfc2l6ZSA9IE5HWF9DT05GX1VOU0VUX1NJWkU7ICAKKyAgICBjb25mLT51cHN0cmVhbS50ZW1wX2ZpbGVfd3JpdGVfc2l6ZSA9IE5HWF9DT05GX1VOU0VUX1NJWkU7CisgICAgCisgICAgY29uZi0+dXBzdHJlYW0ucmVkaXJlY3RfZXJyb3JzID0gTkdYX0NPTkZfVU5TRVQ7CisgICAgY29uZi0+dXBzdHJlYW0ucGFzc191bnBhcnNlZF91cmkgPSBOR1hfQ09ORl9VTlNFVDsKKyAgICBjb25mLT51cHN0cmVhbS54X3Bvd2VyZWRfYnkgPSBOR1hfQ09ORl9VTlNFVDsKKworICAgIC8qICJwcm94eV9jeWNsaWNfdGVtcF9maWxlIiBpcyBkaXNhYmxlZCAqLworICAgIGNvbmYtPnVwc3RyZWFtLmN5Y2xpY190ZW1wX2ZpbGUgPSAwOworCisgICAgY29uZi0+cHJlc2VydmVfaG9zdCA9IE5HWF9DT05GX1VOU0VUOworICAgIGNvbmYtPnNldF94X3VybCA9IE5HWF9DT05GX1VOU0VUOworICAgIGNvbmYtPnNldF94X3JlYWxfaXAgPSBOR1hfQ09ORl9VTlNFVDsKKyAgICBjb25mLT5hZGRfeF9mb3J3YXJkZWRfZm9yID0gTkdYX0NPTkZfVU5TRVQ7CisKKyAgICBjb25mLT5wYXNzX3NlcnZlciA9IE5HWF9DT05GX1VOU0VUOworICAgIGNvbmYtPnBhc3NfeF9hY2NlbF9leHBpcmVzID0gTkdYX0NPTkZfVU5TRVQ7CisKKyAgICByZXR1cm4gY29uZjsKK30KKworCitzdGF0aWMgY2hhciAqCituZ3hfaHR0cF9wcm94eV9tZXJnZV9sb2NfY29uZihuZ3hfY29uZl90ICpjZiwgdm9pZCAqcGFyZW50LCB2b2lkICpjaGlsZCkKK3sKKyAgICBuZ3hfaHR0cF9wcm94eV9sb2NfY29uZl90ICpwcmV2ID0gcGFyZW50OworICAgIG5neF9odHRwX3Byb3h5X2xvY19jb25mX3QgKmNvbmYgPSBjaGlsZDsKKworICAgIHNpemVfdCAgICAgICAgICAgIHNpemU7CisgICAgbmd4X3N0cl90ICAgICAgICAqbmFtZTsKKyAgICBuZ3hfdGFibGVfZWx0X3QgICpzcmM7CisgICAgbmd4X2h0dHBfdmFyaWFibGVfdCAgKnZhcjsKKyAgICAKKyAgICBuZ3hfY29uZl9tZXJnZV9tc2VjX3ZhbHVlKGNvbmYtPnVwc3RyZWFtLmNvbm5lY3RfdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXYtPnVwc3RyZWFtLmNvbm5lY3RfdGltZW91dCwgNjAwMDApOworCisgICAgbmd4X2NvbmZfbWVyZ2VfbXNlY192YWx1ZShjb25mLT51cHN0cmVhbS5zZW5kX3RpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2LT51cHN0cmVhbS5zZW5kX3RpbWVvdXQsIDYwMDAwKTsKKworICAgIG5neF9jb25mX21lcmdlX21zZWNfdmFsdWUoY29uZi0+dXBzdHJlYW0ucmVhZF90aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldi0+dXBzdHJlYW0ucmVhZF90aW1lb3V0LCA2MDAwMCk7CisKKyAgICBuZ3hfY29uZl9tZXJnZV9zaXplX3ZhbHVlKGNvbmYtPnVwc3RyZWFtLnNlbmRfbG93YXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2LT51cHN0cmVhbS5zZW5kX2xvd2F0LCAwKTsKKworICAgIG5neF9jb25mX21lcmdlX3NpemVfdmFsdWUoY29uZi0+dXBzdHJlYW0uaGVhZGVyX2J1ZmZlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldi0+dXBzdHJlYW0uaGVhZGVyX2J1ZmZlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVfdCkgbmd4X3BhZ2VzaXplKTsKKworICAgIG5neF9jb25mX21lcmdlX2J1ZnNfdmFsdWUoY29uZi0+dXBzdHJlYW0uYnVmcywgcHJldi0+dXBzdHJlYW0uYnVmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsIG5neF9wYWdlc2l6ZSk7CisKKyAgICBpZiAoY29uZi0+dXBzdHJlYW0uYnVmcy5udW0gPCAyKSB7CisgICAgICAgIG5neF9jb25mX2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBjZiwgMCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlcmUgbXVzdCBiZSBhdCBsZWFzdCAyIFwicHJveHlfYnVmZmVyc1wiIik7CisgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICB9CisgICAgCisKKyAgICBzaXplID0gY29uZi0+dXBzdHJlYW0uaGVhZGVyX2J1ZmZlcl9zaXplOworICAgIGlmIChzaXplIDwgY29uZi0+dXBzdHJlYW0uYnVmcy5zaXplKSB7IAorICAgICAgICBzaXplID0gY29uZi0+dXBzdHJlYW0uYnVmcy5zaXplOworICAgIH0KKworCisgICAgbmd4X2NvbmZfbWVyZ2Vfc2l6ZV92YWx1ZShjb25mLT51cHN0cmVhbS5idXN5X2J1ZmZlcnNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXYtPnVwc3RyZWFtLmJ1c3lfYnVmZmVyc19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdYX0NPTkZfVU5TRVRfU0laRSk7CisKKyAgICBpZiAoY29uZi0+dXBzdHJlYW0uYnVzeV9idWZmZXJzX3NpemUgPT0gTkdYX0NPTkZfVU5TRVRfU0laRSkgeworICAgICAgICBjb25mLT51cHN0cmVhbS5idXN5X2J1ZmZlcnNfc2l6ZSA9IDIgKiBzaXplOworCisgICAgfSBlbHNlIGlmIChjb25mLT51cHN0cmVhbS5idXN5X2J1ZmZlcnNfc2l6ZSA8IHNpemUpIHsKKyAgICAgICAgbmd4X2NvbmZfbG9nX2Vycm9yKE5HWF9MT0dfRU1FUkcsIGNmLCAwLAorICAgICAgICAgICAgICJcInByb3h5X2J1c3lfYnVmZmVyc19zaXplXCIgbXVzdCBiZSBlcXVhbCBvciBiaWdnZXIgdGhhbiAiCisgICAgICAgICAgICAgIm1heGltdW0gb2YgdGhlIHZhbHVlIG9mIFwicHJveHlfaGVhZGVyX2J1ZmZlcl9zaXplXCIgYW5kICIKKyAgICAgICAgICAgICAib25lIG9mIHRoZSBcInByb3h5X2J1ZmZlcnNcIiIpOworCisgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKworICAgIH0gZWxzZSBpZiAoY29uZi0+dXBzdHJlYW0uYnVzeV9idWZmZXJzX3NpemUKKyAgICAgICAgICAgICAgID4gKGNvbmYtPnVwc3RyZWFtLmJ1ZnMubnVtIC0gMSkgKiBjb25mLT51cHN0cmVhbS5idWZzLnNpemUpCisgICAgeworICAgICAgICBuZ3hfY29uZl9sb2dfZXJyb3IoTkdYX0xPR19FTUVSRywgY2YsIDAsCisgICAgICAgICAgICAgIlwicHJveHlfYnVzeV9idWZmZXJzX3NpemVcIiBtdXN0IGJlIGxlc3MgdGhhbiAiCisgICAgICAgICAgICAgInRoZSBzaXplIG9mIGFsbCBcInByb3h5X2J1ZmZlcnNcIiBtaW51cyBvbmUgYnVmZmVyIik7CisKKyAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgIH0KKyAgICAKKworICAgIG5neF9jb25mX21lcmdlX3NpemVfdmFsdWUoY29uZi0+dXBzdHJlYW0udGVtcF9maWxlX3dyaXRlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2LT51cHN0cmVhbS50ZW1wX2ZpbGVfd3JpdGVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HWF9DT05GX1VOU0VUX1NJWkUpOworCisgICAgaWYgKGNvbmYtPnVwc3RyZWFtLnRlbXBfZmlsZV93cml0ZV9zaXplID09IE5HWF9DT05GX1VOU0VUX1NJWkUpIHsKKyAgICAgICAgY29uZi0+dXBzdHJlYW0udGVtcF9maWxlX3dyaXRlX3NpemUgPSAyICogc2l6ZTsKKworICAgIH0gZWxzZSBpZiAoY29uZi0+dXBzdHJlYW0udGVtcF9maWxlX3dyaXRlX3NpemUgPCBzaXplKSB7CisgICAgICAgIG5neF9jb25mX2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBjZiwgMCwKKyAgICAgICAgICAgICAiXCJwcm94eV90ZW1wX2ZpbGVfd3JpdGVfc2l6ZVwiIG11c3QgYmUgZXF1YWwgb3IgYmlnZ2VyIHRoYW4gIgorICAgICAgICAgICAgICJtYXhpbXVtIG9mIHRoZSB2YWx1ZSBvZiBcInByb3h5X2hlYWRlcl9idWZmZXJfc2l6ZVwiIGFuZCAiCisgICAgICAgICAgICAgIm9uZSBvZiB0aGUgXCJwcm94eV9idWZmZXJzXCIiKTsKKworICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgfQorCisKKyAgICBuZ3hfY29uZl9tZXJnZV9zaXplX3ZhbHVlKGNvbmYtPnVwc3RyZWFtLm1heF90ZW1wX2ZpbGVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXYtPnVwc3RyZWFtLm1heF90ZW1wX2ZpbGVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HWF9DT05GX1VOU0VUX1NJWkUpOworCisgICAgaWYgKGNvbmYtPnVwc3RyZWFtLm1heF90ZW1wX2ZpbGVfc2l6ZSA9PSBOR1hfQ09ORl9VTlNFVF9TSVpFKSB7CisKKyAgICAgICAgY29uZi0+dXBzdHJlYW0ubWF4X3RlbXBfZmlsZV9zaXplID0gMTAyNCAqIDEwMjQgKiAxMDI0OworCisgICAgfSBlbHNlIGlmIChjb25mLT51cHN0cmVhbS5tYXhfdGVtcF9maWxlX3NpemUgIT0gMAorICAgICAgICAgICAgICAgJiYgY29uZi0+dXBzdHJlYW0ubWF4X3RlbXBfZmlsZV9zaXplIDwgc2l6ZSkKKyAgICB7CisgICAgICAgIG5neF9jb25mX2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBjZiwgMCwKKyAgICAgICAgICAgICAiXCJmYXN0Y2dpX21heF90ZW1wX2ZpbGVfc2l6ZVwiIG11c3QgYmUgZXF1YWwgdG8gemVybyB0byBkaXNhYmxlICIKKyAgICAgICAgICAgICAidGhlIHRlbXBvcmFyeSBmaWxlcyB1c2FnZSBvciBtdXN0IGJlIGVxdWFsIG9yIGJpZ2dlciB0aGFuICIKKyAgICAgICAgICAgICAibWF4aW11bSBvZiB0aGUgdmFsdWUgb2YgXCJmYXN0Y2dpX2hlYWRlcl9idWZmZXJfc2l6ZVwiIGFuZCAiCisgICAgICAgICAgICAgIm9uZSBvZiB0aGUgXCJmYXN0Y2dpX2J1ZmZlcnNcIiIpOworCisgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICB9CisKKyAgICBuZ3hfY29uZl9tZXJnZV9iaXRtYXNrX3ZhbHVlKGNvbmYtPnVwc3RyZWFtLm5leHRfdXBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2LT51cHN0cmVhbS5uZXh0X3Vwc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE5HWF9DT05GX0JJVE1BU0tfU0VUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfE5HWF9IVFRQX1VQU1RSRUFNX0ZUX0VSUk9SCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfE5HWF9IVFRQX1VQU1RSRUFNX0ZUX1RJTUVPVVQpKTsKKworICAgIG5neF9jb25mX21lcmdlX21zZWNfdmFsdWUoY29uZi0+dXBzdHJlYW0ucmVkaXJlY3RfZXJyb3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldi0+dXBzdHJlYW0ucmVkaXJlY3RfZXJyb3JzLCAwKTsKKworICAgIG5neF9jb25mX21lcmdlX21zZWNfdmFsdWUoY29uZi0+dXBzdHJlYW0ucGFzc191bnBhcnNlZF91cmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2LT51cHN0cmVhbS5wYXNzX3VucGFyc2VkX3VyaSwgMCk7CisKKyAgICBpZiAoY29uZi0+dXBzdHJlYW0ucGFzc191bnBhcnNlZF91cmkgJiYgY29uZi0+bG9jYXRpb24wLT5sZW4gPiAxKSB7CisgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19FTUVSRywgY2YtPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAiXCJwcm94eV9wYXNzX3VucGFyc2VkX3VyaVwiIGNhbiBiZSBzZXQgZm9yICIKKyAgICAgICAgICAgICAgICAgICAgICAibG9jYXRpb24gXCIvXCIgb3IgZ2l2ZW4gYnkgcmVndWxhciBleHByZXNzaW9uLiIpOworICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgfQorCisgICAgbmd4X2NvbmZfbWVyZ2VfbXNlY192YWx1ZShjb25mLT51cHN0cmVhbS54X3Bvd2VyZWRfYnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2LT51cHN0cmVhbS54X3Bvd2VyZWRfYnksIDEpOworCisgICAgbmd4X2NvbmZfbWVyZ2VfdmFsdWUoY29uZi0+cHJlc2VydmVfaG9zdCwgcHJldi0+cHJlc2VydmVfaG9zdCwgMCk7CisgICAgbmd4X2NvbmZfbWVyZ2VfdmFsdWUoY29uZi0+c2V0X3hfdXJsLCBwcmV2LT5zZXRfeF91cmwsIDApOworICAgIG5neF9jb25mX21lcmdlX3ZhbHVlKGNvbmYtPnNldF94X3JlYWxfaXAsIHByZXYtPnNldF94X3JlYWxfaXAsIDApOworICAgIG5neF9jb25mX21lcmdlX3ZhbHVlKGNvbmYtPmFkZF94X2ZvcndhcmRlZF9mb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2LT5hZGRfeF9mb3J3YXJkZWRfZm9yLCAwKTsKKworICAgIGlmIChjb25mLT5wZWVycyA9PSBOVUxMKSB7CisgICAgICAgIGNvbmYtPnBlZXJzID0gcHJldi0+cGVlcnM7CisgICAgICAgIGNvbmYtPnVwc3RyZWFtID0gcHJldi0+dXBzdHJlYW07CisgICAgfQorCisgICAgaWYgKGNvbmYtPmhlYWRlcnNfc2V0X2hhc2ggPT0gTlVMTCkgeworICAgICAgICBjb25mLT5oZWFkZXJzX3NldF9sZW4gPSBwcmV2LT5oZWFkZXJzX3NldF9sZW47CisgICAgICAgIGNvbmYtPmhlYWRlcnNfc2V0ID0gcHJldi0+aGVhZGVyc19zZXQ7CisgICAgICAgIGNvbmYtPmhlYWRlcnNfc2V0X2hhc2ggPSBwcmV2LT5oZWFkZXJzX3NldF9oYXNoOworICAgIH0KKworICAgIGlmIChjb25mLT5oZWFkZXJzX3NldF9oYXNoID09IE5VTEwpIHsKKworICAgICAgICBpZiAoY29uZi0+aGVhZGVyc19uYW1lcyA9PSBOVUxMKSB7CisgICAgICAgICAgICBjb25mLT5oZWFkZXJzX25hbWVzID0gbmd4X2FycmF5X2NyZWF0ZShjZi0+cG9vbCwgNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfc3RyX3QpKTsKKyAgICAgICAgICAgIGlmIChjb25mLT5oZWFkZXJzX25hbWVzID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29uZi0+aGVhZGVyc19zb3VyY2VzID09IE5VTEwpIHsKKyAgICAgICAgICAgIGNvbmYtPmhlYWRlcnNfc291cmNlcyA9IG5neF9hcnJheV9jcmVhdGUoY2YtPnBvb2wsIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfdGFibGVfZWx0X3QpKTsKKyAgICAgICAgICAgIGlmIChjb25mLT5oZWFkZXJzX3NvdXJjZXMgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIFNUVUIgKi8KKyAgICAgICAgdmFyID0gbmd4X2h0dHBfYWRkX3ZhcmlhYmxlKGNmLCAmbmd4X2h0dHBfcHJveHlfaG9zdCwgMCk7CisgICAgICAgIGlmICh2YXIgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgdmFyLT5oYW5kbGVyID0gbmd4X2h0dHBfcHJveHlfaG9zdF92YXJpYWJsZTsKKyAgICAgICAgLyoqLworCisKKyAgICAgICAgbmFtZSA9IG5neF9hcnJheV9wdXNoKGNvbmYtPmhlYWRlcnNfbmFtZXMpOworICAgICAgICBpZiAobmFtZSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBuYW1lLT5sZW4gPSBzaXplb2YoIkhvc3QiKSAtIDE7CisgICAgICAgIG5hbWUtPmRhdGEgPSAodV9jaGFyICopICJIb3N0IjsKKworICAgICAgICBzcmMgPSBuZ3hfYXJyYXlfcHVzaChjb25mLT5oZWFkZXJzX3NvdXJjZXMpOworICAgICAgICBpZiAoc3JjID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIHNyYy0+aGFzaCA9IDA7CisgICAgICAgIHNyYy0+a2V5LmxlbiA9IHNpemVvZigiSG9zdCIpIC0gMTsKKyAgICAgICAgc3JjLT5rZXkuZGF0YSA9ICh1X2NoYXIgKikgIkhvc3QiOworICAgICAgICBzcmMtPnZhbHVlLmxlbiA9IHNpemVvZigiJFBST1hZX0hPU1QiKSAtIDE7CisgICAgICAgIHNyYy0+dmFsdWUuZGF0YSA9ICh1X2NoYXIgKikgIiRQUk9YWV9IT1NUIjsKKworCisgICAgICAgIG5hbWUgPSBuZ3hfYXJyYXlfcHVzaChjb25mLT5oZWFkZXJzX25hbWVzKTsKKyAgICAgICAgaWYgKG5hbWUgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgbmFtZS0+bGVuID0gc2l6ZW9mKCJDb25uZWN0aW9uIikgLSAxOworICAgICAgICBuYW1lLT5kYXRhID0gKHVfY2hhciAqKSAiQ29ubmVjdGlvbiI7CisKKyAgICAgICAgc3JjID0gbmd4X2FycmF5X3B1c2goY29uZi0+aGVhZGVyc19zb3VyY2VzKTsKKyAgICAgICAgaWYgKHNyYyA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBzcmMtPmhhc2ggPSAwOworICAgICAgICBzcmMtPmtleS5sZW4gPSBzaXplb2YoIkNvbm5lY3Rpb24iKSAtIDE7CisgICAgICAgIHNyYy0+a2V5LmRhdGEgPSAodV9jaGFyICopICJDb25uZWN0aW9uIjsKKyAgICAgICAgc3JjLT52YWx1ZS5sZW4gPSBzaXplb2YoImNsb3NlIikgLSAxOworICAgICAgICBzcmMtPnZhbHVlLmRhdGEgPSAodV9jaGFyICopICJjbG9zZSI7CisKKworICAgICAgICBuYW1lID0gbmd4X2FycmF5X3B1c2goY29uZi0+aGVhZGVyc19uYW1lcyk7CisgICAgICAgIGlmIChuYW1lID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIG5hbWUtPmxlbiA9IDA7CisgICAgICAgIG5hbWUtPmRhdGEgPSBOVUxMOworCisKKyAgICAgICAgaWYgKG5neF9odHRwX3NjcmlwdF9jb21waWxlX2xpdGUoY2YsIGNvbmYtPmhlYWRlcnNfc291cmNlcywKKyAgICAgICAgICAgICAgICAmY29uZi0+aGVhZGVyc19zZXRfbGVuLCAmY29uZi0+aGVhZGVyc19zZXQsCisgICAgICAgICAgICAgICAgbmd4X2h0dHBfcHJveHlfY29tcGlsZV9oZWFkZXJfc3RhcnQsCisgICAgICAgICAgICAgICAgbmd4X2h0dHBfcHJveHlfY29tcGlsZV9oZWFkZXJfZW5kKSAhPSBOR1hfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICAgICAgfQorCisKKyAgICAgICAgY29uZi0+aGVhZGVyc19zZXRfaGFzaCA9IG5neF9wY2FsbG9jKGNmLT5wb29sLCBzaXplb2Yobmd4X2hhc2hfdCkpOworICAgICAgICBpZiAoY29uZi0+aGVhZGVyc19zZXRfaGFzaCA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjb25mLT5oZWFkZXJzX3NldF9oYXNoLT5tYXhfc2l6ZSA9IDEwMDsKKyAgICAgICAgY29uZi0+aGVhZGVyc19zZXRfaGFzaC0+YnVja2V0X2xpbWl0ID0gMTsKKyAgICAgICAgY29uZi0+aGVhZGVyc19zZXRfaGFzaC0+YnVja2V0X3NpemUgPSBzaXplb2Yobmd4X3N0cl90KTsKKyAgICAgICAgY29uZi0+aGVhZGVyc19zZXRfaGFzaC0+bmFtZSA9ICJwcm94eV9oZWFkZXJzIjsKKworICAgICAgICBpZiAobmd4X2hhc2hfaW5pdChjb25mLT5oZWFkZXJzX3NldF9oYXNoLCBjZi0+cG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZi0+aGVhZGVyc19uYW1lcy0+ZWx0cykgIT0gTkdYX09LKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgICAgIH0KKworI2lmIDAKKyAgICAgICAgbmd4X2xvZ19kZWJ1ZzIoTkdYX0xPR19ERUJVR19IVFRQLCBjZi0+bG9nLCAwLAorI2VuZGlmCisgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19OT1RJQ0UsIGNmLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgICAgICJwcm94eV9oZWFkZXJzIGhhc2ggc2l6ZTogJXVpLCAiCisgICAgICAgICAgICAgICAgICAgICAgICJtYXggYnVja2V0cyBwZXIgZW50cnk6ICV1aSIsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbmYtPmhlYWRlcnNfc2V0X2hhc2gtPmhhc2hfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uZi0+aGVhZGVyc19zZXRfaGFzaC0+bWluX2J1Y2tldHMpOworICAgIH0KKworICAgIHJldHVybiBOR1hfQ09ORl9PSzsKK30KKworCitzdGF0aWMgbmd4X2ludF90CituZ3hfaHR0cF9wcm94eV9jb21waWxlX2hlYWRlcl9zdGFydChuZ3hfdGFibGVfZWx0X3QgKmgsCisgICAgbmd4X2FycmF5X3QgKmxlbmd0aHMsIG5neF9hcnJheV90ICp2YWx1ZXMsIG5neF91aW50X3QgdmFsdWUpCit7CisgICAgdV9jaGFyICAgICAgICAgICAgICAgICAgICAgICAqcDsKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICBzaXplOworICAgIG5neF9odHRwX3NjcmlwdF9jb3B5X2NvZGVfdCAgKmNvcHk7CisKKyAgICBjb3B5ID0gbmd4X2FycmF5X3B1c2hfbihsZW5ndGhzLCBzaXplb2Yobmd4X2h0dHBfc2NyaXB0X2NvcHlfY29kZV90KSk7CisgICAgaWYgKGNvcHkgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgIH0KKworICAgIGNvcHktPmNvZGUgPSAobmd4X2h0dHBfc2NyaXB0X2NvZGVfcHQpIG5neF9odHRwX3NjcmlwdF9jb3B5X2xlbjsKKyAgICBjb3B5LT5sZW4gPSBoLT5rZXkubGVuICsgc2l6ZW9mKCI6ICIpIC0gMTsKKworICAgIGlmICh2YWx1ZSkgeworICAgICAgICBjb3B5LT5sZW4gKz0gaC0+dmFsdWUubGVuICsgc2l6ZW9mKENSTEYpIC0gMTsKKyAgICB9CisKKyAgICBzaXplID0gKGNvcHktPmxlbiArIHNpemVvZih1aW50cHRyX3QpIC0gMSkgJiB+KHNpemVvZih1aW50cHRyX3QpIC0gMSk7CisKKyAgICBjb3B5ID0gbmd4X2FycmF5X3B1c2hfbih2YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5neF9odHRwX3NjcmlwdF9jb3B5X2NvZGVfdCkgKyBzaXplKTsKKyAgICBpZiAoY29weSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgfQorCisgICAgY29weS0+Y29kZSA9IG5neF9odHRwX3NjcmlwdF9jb3B5OworICAgIGNvcHktPmxlbiA9IGgtPmtleS5sZW4gKyBzaXplb2YoIjogIikgLSAxOworCisgICAgaWYgKHZhbHVlKSB7CisgICAgICAgIGNvcHktPmxlbiArPSBoLT52YWx1ZS5sZW4gKyBzaXplb2YoQ1JMRikgLSAxOworICAgIH0KKworICAgIHAgPSAodV9jaGFyICopIGNvcHkgKyBzaXplb2Yobmd4X2h0dHBfc2NyaXB0X2NvcHlfY29kZV90KTsKKworICAgIHAgPSBuZ3hfY3B5bWVtKHAsIGgtPmtleS5kYXRhLCBoLT5rZXkubGVuKTsKKyAgICBwID0gbmd4X2NweW1lbShwLCAiOiAiLCBzaXplb2YoIjogIikgLSAxKTsKKworICAgIGlmICh2YWx1ZSkgeworICAgICAgICBwID0gbmd4X2NweW1lbShwLCBoLT52YWx1ZS5kYXRhLCBoLT52YWx1ZS5sZW4pOworICAgICAgICBuZ3hfbWVtY3B5KHAsIENSTEYsIHNpemVvZihDUkxGKSAtIDEpOworICAgIH0KKworICAgIHJldHVybiBOR1hfT0s7Cit9CisKKworc3RhdGljIG5neF9pbnRfdAorbmd4X2h0dHBfcHJveHlfY29tcGlsZV9oZWFkZXJfZW5kKG5neF9hcnJheV90ICpsZW5ndGhzLCBuZ3hfYXJyYXlfdCAqdmFsdWVzKQoreworICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgIHNpemU7CisgICAgbmd4X2h0dHBfc2NyaXB0X2NvcHlfY29kZV90ICAqY29weTsKKworICAgIGNvcHkgPSBuZ3hfYXJyYXlfcHVzaF9uKGxlbmd0aHMsIHNpemVvZihuZ3hfaHR0cF9zY3JpcHRfY29weV9jb2RlX3QpKTsKKyAgICBpZiAoY29weSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgfQorCisgICAgY29weS0+Y29kZSA9IChuZ3hfaHR0cF9zY3JpcHRfY29kZV9wdCkgbmd4X2h0dHBfc2NyaXB0X2NvcHlfbGVuOworICAgIGNvcHktPmxlbiA9IHNpemVvZihDUkxGKSAtIDE7CisKKyAgICBzaXplID0gKHNpemVvZihDUkxGKSAtIDEgKyBzaXplb2YodWludHB0cl90KSAtIDEpCisgICAgICAgICAgICAmIH4oc2l6ZW9mKHVpbnRwdHJfdCkgLSAxKTsKKworICAgIGNvcHkgPSBuZ3hfYXJyYXlfcHVzaF9uKHZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yobmd4X2h0dHBfc2NyaXB0X2NvcHlfY29kZV90KSArIHNpemUpOworICAgIGlmIChjb3B5ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICB9CisKKyAgICBjb3B5LT5jb2RlID0gbmd4X2h0dHBfc2NyaXB0X2NvcHk7CisgICAgY29weS0+bGVuID0gc2l6ZW9mKENSTEYpIC0gMTsKKworICAgIG5neF9tZW1jcHkoKHVfY2hhciAqKSBjb3B5ICsgc2l6ZW9mKG5neF9odHRwX3NjcmlwdF9jb3B5X2NvZGVfdCksCisgICAgICAgICAgICAgICBDUkxGLCBzaXplb2YoQ1JMRikgLSAxKTsKKworICAgIHJldHVybiBOR1hfT0s7Cit9CisKKworc3RhdGljIGNoYXIgKgorbmd4X2h0dHBfcHJveHlfcGFzcyhuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqY21kLCB2b2lkICpjb25mKQoreworICAgIG5neF9odHRwX3Byb3h5X2xvY19jb25mX3QgKmxjZiA9IGNvbmY7CisKKyAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgIGk7CisgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgICp2YWx1ZSwgKnVybDsKKyAgICBuZ3hfaW5ldF91cHN0cmVhbV90ICAgICAgICAgIGluZXRfdXBzdHJlYW07CisgICAgbmd4X2h0dHBfY29yZV9sb2NfY29uZl90ICAgICpjbGNmOworI2lmIChOR1hfSEFWRV9VTklYX0RPTUFJTikKKyAgICBuZ3hfdW5peF9kb21haW5fdXBzdHJlYW1fdCAgIHVuaXhfdXBzdHJlYW07CisjZW5kaWYKKworICAgIHZhbHVlID0gY2YtPmFyZ3MtPmVsdHM7CisKKyAgICB1cmwgPSAmdmFsdWVbMV07CisKKyAgICBpZiAobmd4X3N0cm5jYXNlY21wKHVybC0+ZGF0YSwgImh0dHA6Ly8iLCA3KSAhPSAwKSB7CisgICAgICAgIG5neF9jb25mX2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBjZiwgMCwgImludmFsaWQgVVJMIHByZWZpeCIpOworICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgfQorCisgICAgaWYgKG5neF9zdHJuY2FzZWNtcCh1cmwtPmRhdGEgKyA3LCAidW5peDoiLCA1KSA9PSAwKSB7CisKKyNpZiAoTkdYX0hBVkVfVU5JWF9ET01BSU4pCisKKyAgICAgICAgbmd4X21lbXplcm8oJnVuaXhfdXBzdHJlYW0sIHNpemVvZihuZ3hfdW5peF9kb21haW5fdXBzdHJlYW1fdCkpOworCisgICAgICAgIHVuaXhfdXBzdHJlYW0ubmFtZSA9ICp1cmw7CisgICAgICAgIHVuaXhfdXBzdHJlYW0udXJsLmxlbiA9IHVybC0+bGVuIC0gNzsKKyAgICAgICAgdW5peF91cHN0cmVhbS51cmwuZGF0YSA9IHVybC0+ZGF0YSArIDc7CisgICAgICAgIHVuaXhfdXBzdHJlYW0udXJpX3BhcnQgPSAxOworCisgICAgICAgIGxjZi0+cGVlcnMgPSBuZ3hfdW5peF91cHN0cmVhbV9wYXJzZShjZiwgJnVuaXhfdXBzdHJlYW0pOworICAgICAgICBpZiAobGNmLT5wZWVycyA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBsY2YtPnBlZXJzLT5wZWVyWzBdLnVyaV9zZXBhcmF0b3IgPSAiOiI7CisKKyAgICAgICAgbGNmLT5ob3N0X2hlYWRlci5sZW4gPSBzaXplb2YoImxvY2FsaG9zdCIpIC0gMTsKKyAgICAgICAgbGNmLT5ob3N0X2hlYWRlci5kYXRhID0gKHVfY2hhciAqKSAibG9jYWxob3N0IjsKKyAgICAgICAgbGNmLT51cmkwID0gdW5peF91cHN0cmVhbS51cmk7CisjaWYgMAorCVNUVUIKKyAgICAgICAgbGNmLT51cHN0cmVhbS0+ZGVmYXVsdF9wb3J0ID0gMTsKKyNlbmRpZgorCisjZWxzZQorICAgICAgICBuZ3hfY29uZl9sb2dfZXJyb3IoTkdYX0xPR19FTUVSRywgY2YsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIHVuaXggZG9tYWluIHNvY2tldHMgYXJlIG5vdCBzdXBwb3J0ZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9uIHRoaXMgcGxhdGZvcm0iKTsKKyAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworCisjZW5kaWYKKworICAgIH0gZWxzZSB7CisgICAgICAgIG5neF9tZW16ZXJvKCZpbmV0X3Vwc3RyZWFtLCBzaXplb2Yobmd4X2luZXRfdXBzdHJlYW1fdCkpOworCisgICAgICAgIGluZXRfdXBzdHJlYW0ubmFtZSA9ICp1cmw7CisgICAgICAgIGluZXRfdXBzdHJlYW0udXJsLmxlbiA9IHVybC0+bGVuIC0gNzsKKyAgICAgICAgaW5ldF91cHN0cmVhbS51cmwuZGF0YSA9IHVybC0+ZGF0YSArIDc7CisgICAgICAgIGluZXRfdXBzdHJlYW0uZGVmYXVsdF9wb3J0X3ZhbHVlID0gODA7CisgICAgICAgIGluZXRfdXBzdHJlYW0udXJpX3BhcnQgPSAxOworCisgICAgICAgIGxjZi0+cGVlcnMgPSBuZ3hfaW5ldF91cHN0cmVhbV9wYXJzZShjZiwgJmluZXRfdXBzdHJlYW0pOworICAgICAgICBpZiAobGNmLT5wZWVycyA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGNmLT5wZWVycy0+bnVtYmVyOyBpKyspIHsKKyAgICAgICAgICAgIGxjZi0+cGVlcnMtPnBlZXJbaV0udXJpX3NlcGFyYXRvciA9ICI6IjsKKyAgICAgICAgfQorCisgICAgICAgIGxjZi0+aG9zdF9oZWFkZXIgPSBpbmV0X3Vwc3RyZWFtLmhvc3RfaGVhZGVyOworICAgICAgICBsY2YtPnVyaTAgPSBpbmV0X3Vwc3RyZWFtLnVyaTsKKyNpZiAwCisJU1RVQgorICAgICAgICBsY2YtPnBvcnRfdGV4dCA9IGluZXRfdXBzdHJlYW0ucG9ydF90ZXh0OworICAgICAgICBsY2YtPnVwc3RyZWFtLT5kZWZhdWx0X3BvcnQgPSBpbmV0X3Vwc3RyZWFtLmRlZmF1bHRfcG9ydDsKKyNlbmRpZgorICAgIH0KKworICAgIGNsY2YgPSBuZ3hfaHR0cF9jb25mX2dldF9tb2R1bGVfbG9jX2NvbmYoY2YsIG5neF9odHRwX2NvcmVfbW9kdWxlKTsKKworICAgIGNsY2YtPmhhbmRsZXIgPSBuZ3hfaHR0cF9wcm94eV9oYW5kbGVyOworCisjaWYgKE5HWF9QQ1JFKQorICAgIGxjZi0+bG9jYXRpb24wID0gY2xjZi0+cmVnZXggPyAmbmd4X2h0dHBfcHJveHlfdXJpIDogJmNsY2YtPm5hbWU7CisjZWxzZQorICAgIGxjZi0+bG9jYXRpb24wID0gJmNsY2YtPm5hbWU7CisjZW5kaWYKKworICAgIGlmIChjbGNmLT5uYW1lLmRhdGFbY2xjZi0+bmFtZS5sZW4gLSAxXSA9PSAnLycpIHsKKyAgICAgICAgY2xjZi0+YXV0b19yZWRpcmVjdCA9IDE7CisgICAgfQorCisgICAgcmV0dXJuIE5HWF9DT05GX09LOworfQorCisKK3N0YXRpYyBjaGFyICoKK25neF9odHRwX3Byb3h5X3NldF94X3ZhcihuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqY21kLCB2b2lkICpjb25mKQoreworICAgIHJldHVybiBOR1hfQ09ORl9PSzsKK30KKworCitzdGF0aWMgY2hhciAqCituZ3hfaHR0cF9wcm94eV9sb3dhdF9jaGVjayhuZ3hfY29uZl90ICpjZiwgdm9pZCAqcG9zdCwgdm9pZCAqZGF0YSkKK3sKKyNpZiAoTkdYX0ZSRUVCU0QpCisgICAgc3NpemVfdCAqbnAgPSBkYXRhOworCisgICAgaWYgKCpucCA+PSBuZ3hfZnJlZWJzZF9uZXRfaW5ldF90Y3Bfc2VuZHNwYWNlKSB7CisgICAgICAgIG5neF9jb25mX2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBjZiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJcInByb3h5X3NlbmRfbG93YXRcIiBtdXN0IGJlIGxlc3MgdGhhbiAlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiKHN5c2N0bCBuZXQuaW5ldC50Y3Auc2VuZHNwYWNlKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfZnJlZWJzZF9uZXRfaW5ldF90Y3Bfc2VuZHNwYWNlKTsKKworICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgfQorCisjZWxpZiAhKE5HWF9IQVZFX1NPX1NORExPV0FUKQorICAgIHNzaXplX3QgKm5wID0gZGF0YTsKKworICAgIG5neF9jb25mX2xvZ19lcnJvcihOR1hfTE9HX1dBUk4sIGNmLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAiXCJwcm94eV9zZW5kX2xvd2F0XCIgaXMgbm90IHN1cHBvcnRlZCwgaWdub3JlZCIpOworCisgICAgKm5wID0gMDsKKworI2VuZGlmCisKKyAgICByZXR1cm4gTkdYX0NPTkZfT0s7Cit9CmRpZmYgLS1naXQgYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3Jld3JpdGVfbW9kdWxlLmMgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3Jld3JpdGVfbW9kdWxlLmMKaW5kZXggZWQxMDY3Yi4uMWRhNDc1YyAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9yZXdyaXRlX21vZHVsZS5jCisrKyBiL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfcmV3cml0ZV9tb2R1bGUuYwpAQCAtMTAyMSw2ICsxMDIxLDcgQEAKICAgICByZWdleC0+dXJpID0gMTsKICAgICByZWdleC0+YXJncyA9IDE7CiAgICAgcmVnZXgtPnJlZGlyZWN0ID0gMDsKKyAgICByZWdleC0+YnJlYWtfY3ljbGUgPSAwOwogICAgIHJlZ2V4LT5uYW1lID0gdmFsdWVbMV07CiAKICAgICBsYXN0ID0gMDsKQEAgLTE0NjYsNiArMTQ2Nyw3IEBACiAgICAgICAgIHJlZ2V4LT51cmkgPSAwOwogICAgICAgICByZWdleC0+YXJncyA9IDA7CiAgICAgICAgIHJlZ2V4LT5yZWRpcmVjdCA9IDA7CisgICAgICAgIHJlZ2V4LT5icmVha19jeWNsZSA9IDA7CiAgICAgICAgIHJlZ2V4LT5uYW1lID0gdmFsdWVbbGFzdF07CiAKICAgICAgICAgcmV0dXJuIE5HWF9DT05GX09LOwpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9zc2xfbW9kdWxlLmMgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3NzbF9tb2R1bGUuYwppbmRleCAxYzQxMjhjLi5jMThjNDkzIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3NzbF9tb2R1bGUuYworKysgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3NzbF9tb2R1bGUuYwpAQCAtMTk3LDYgKzE5NywxMiBAQAogICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgfQogCisjaWYgMAorICAgIFNTTF9DVFhfc2V0X29wdGlvbnMoY29uZi0+c3NsX2N0eCwgU1NMX09QX0FMTCk7CisgICAgU1NMX0NUWF9zZXRfb3B0aW9ucyhjb25mLT5zc2xfY3R4LCBTU0xfT1BfTk9fU1NMdjMpOworICAgIFNTTF9DVFhfc2V0X29wdGlvbnMoY29uZi0+c3NsX2N0eCwgU1NMX09QX1NJTkdMRV9ESF9VU0UpOworI2VuZGlmCisKICAgICBpZiAoY29uZi0+Y2lwaGVycy5sZW4pIHsKICAgICAgICAgaWYgKFNTTF9DVFhfc2V0X2NpcGhlcl9saXN0KGNvbmYtPnNzbF9jdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICopIGNvbmYtPmNpcGhlcnMuZGF0YSkgPT0gMCkKZGlmZiAtLWdpdCBhL3NyYy9odHRwL21vZHVsZXMvcHJveHkvbmd4X2h0dHBfcHJveHlfaGFuZGxlci5jIGIvc3JjL2h0dHAvbW9kdWxlcy9wcm94eS9uZ3hfaHR0cF9wcm94eV9oYW5kbGVyLmMKaW5kZXggOWFkZGZjMi4uMTJkNDE3MSAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbW9kdWxlcy9wcm94eS9uZ3hfaHR0cF9wcm94eV9oYW5kbGVyLmMKKysrIGIvc3JjL2h0dHAvbW9kdWxlcy9wcm94eS9uZ3hfaHR0cF9wcm94eV9oYW5kbGVyLmMKQEAgLTEzMzIsNiArMTMzMiwxMSBAQAogICAgICAgICBjb25mLT54X3ZhcnMgPSBwcmV2LT54X3ZhcnM7CiAgICAgfQogCisgICAgaWYgKGNvbmYtPnBlZXJzID09IE5VTEwpIHsKKyAgICAgICAgY29uZi0+cGVlcnMgPSBwcmV2LT5wZWVyczsKKyAgICAgICAgY29uZi0+dXBzdHJlYW0gPSBwcmV2LT51cHN0cmVhbTsKKyAgICB9CisKICAgICByZXR1cm4gTlVMTDsKIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbmd4X2h0dHAuYyBiL3NyYy9odHRwL25neF9odHRwLmMKaW5kZXggMmM5N2Q3MS4uZTJkNWZlNCAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbmd4X2h0dHAuYworKysgYi9zcmMvaHR0cC9uZ3hfaHR0cC5jCkBAIC05MCw3ICs5MCw2IEBACiAgICAgbmd4X21lbXplcm8oJmluX3BvcnRzLCBzaXplb2Yobmd4X2FycmF5X3QpKTsKICNlbmRpZgogCi0KICAgICAvKiB0aGUgbWFpbiBodHRwIGNvbnRleHQgKi8KIAogICAgIGN0eCA9IG5neF9wY2FsbG9jKGNmLT5wb29sLCBzaXplb2Yobmd4X2h0dHBfY29uZl9jdHhfdCkpOwpAQCAtMzE3LDYgKzMxNiwyMiBAQAogICAgIGNtY2YtPnBoYXNlc1tOR1hfSFRUUF9DT05URU5UX1BIQVNFXS50eXBlID0gTkdYX09LOwogCiAKKyAgICBjbWNmLT5oZWFkZXJzX2luX2hhc2gubWF4X3NpemUgPSAxMDA7CisgICAgY21jZi0+aGVhZGVyc19pbl9oYXNoLmJ1Y2tldF9saW1pdCA9IDE7CisgICAgY21jZi0+aGVhZGVyc19pbl9oYXNoLmJ1Y2tldF9zaXplID0gc2l6ZW9mKG5neF9odHRwX2hlYWRlcl90KTsKKyAgICBjbWNmLT5oZWFkZXJzX2luX2hhc2gubmFtZSA9ICJodHRwIGhlYWRlcnNfaW4iOworCisgICAgaWYgKG5neF9oYXNoX2luaXQoJmNtY2YtPmhlYWRlcnNfaW5faGFzaCwgY2YtPnBvb2wsIG5neF9odHRwX2hlYWRlcnNfaW4pCisgICAgICAgICE9IE5HWF9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICB9CisKKyAgICBuZ3hfbG9nX2RlYnVnMihOR1hfTE9HX0RFQlVHX0hUVFAsIGNmLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgImh0dHAgaGVhZGVyc19pbiBoYXNoIHNpemU6ICV1aSwgbWF4IGJ1Y2tldHMgcGVyIGVudHJ5OiAldWkiLAorICAgICAgICAgICAgICAgICAgICBjbWNmLT5oZWFkZXJzX2luX2hhc2guaGFzaF9zaXplLAorICAgICAgICAgICAgICAgICAgICBjbWNmLT5oZWFkZXJzX2luX2hhc2gubWluX2J1Y2tldHMpOworCiAgICAgLyoKICAgICAgKiBjcmVhdGUgdGhlIGxpc3RzIG9mIHBvcnRzLCBhZGRyZXNzZXMgYW5kIHNlcnZlciBuYW1lcwogICAgICAqIHRvIHF1aWNrbHkgZmluZCB0aGUgc2VydmVyIGNvcmUgbW9kdWxlIGNvbmZpZ3VyYXRpb24gYXQgcnVuLXRpbWUKZGlmZiAtLWdpdCBhL3NyYy9odHRwL25neF9odHRwLmggYi9zcmMvaHR0cC9uZ3hfaHR0cC5oCmluZGV4IDQ3NThlODQuLmRlZDk0ZTIgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL25neF9odHRwLmgKKysrIGIvc3JjL2h0dHAvbmd4X2h0dHAuaApAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgPG5neF9odHRwX2xvZ19tb2R1bGUuaD4KICNpbmNsdWRlIDxuZ3hfaHR0cF9jb3JlX21vZHVsZS5oPgogI2luY2x1ZGUgPG5neF9odHRwX3ZhcmlhYmxlcy5oPgorI2luY2x1ZGUgPG5neF9odHRwX3NjcmlwdC5oPgogCiAjaWYgKE5HWF9IVFRQX1NTTCkKICNpbmNsdWRlIDxuZ3hfaHR0cF9zc2xfbW9kdWxlLmg+CmRpZmYgLS1naXQgYS9zcmMvaHR0cC9uZ3hfaHR0cF9jb3JlX21vZHVsZS5oIGIvc3JjL2h0dHAvbmd4X2h0dHBfY29yZV9tb2R1bGUuaAppbmRleCBmOGM2MDE3Li5hYzU3MmQ2IDEwMDY0NAotLS0gYS9zcmMvaHR0cC9uZ3hfaHR0cF9jb3JlX21vZHVsZS5oCisrKyBiL3NyYy9odHRwL25neF9odHRwX2NvcmVfbW9kdWxlLmgKQEAgLTQ4LDYgKzQ4LDggQEAKICAgICBuZ3hfaHR0cF9waGFzZV90ICAgICAgICAgICBwaGFzZXNbTkdYX0hUVFBfTEFTVF9QSEFTRV07CiAgICAgbmd4X2FycmF5X3QgICAgICAgICAgICAgICAgaW5kZXhfaGFuZGxlcnM7CiAKKyAgICBuZ3hfaGFzaF90ICAgICAgICAgICAgICAgICBoZWFkZXJzX2luX2hhc2g7CisKICAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICBzZXJ2ZXJfbmFtZXNfaGFzaDsKICAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICBzZXJ2ZXJfbmFtZXNfaGFzaF90aHJlc2hvbGQ7CiAKZGlmZiAtLWdpdCBhL3NyYy9odHRwL25neF9odHRwX3BhcnNlLmMgYi9zcmMvaHR0cC9uZ3hfaHR0cF9wYXJzZS5jCmluZGV4IDM0MzM2YWQuLjVhOTY4NWMgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL25neF9odHRwX3BhcnNlLmMKKysrIGIvc3JjL2h0dHAvbmd4X2h0dHBfcGFyc2UuYwpAQCAtMTEsNyArMTEsNyBAQAogCiBuZ3hfaW50X3Qgbmd4X2h0dHBfcGFyc2VfcmVxdWVzdF9saW5lKG5neF9odHRwX3JlcXVlc3RfdCAqciwgbmd4X2J1Zl90ICpiKQogewotICAgIHVfY2hhciAgY2gsICpwLCAqbTsKKyAgICB1X2NoYXIgIGMsIGNoLCAqcCwgKm07CiAgICAgZW51bSB7CiAgICAgICAgIHN3X3N0YXJ0ID0gMCwKICAgICAgICAgc3dfbWV0aG9kLApAQCAtMTA5LDcgKzEwOSw5IEBACiAKICAgICAgICAgLyogc3BhY2UqIGJlZm9yZSBVUkkgKi8KICAgICAgICAgY2FzZSBzd19zcGFjZXNfYmVmb3JlX3VyaToKLSAgICAgICAgICAgIGlmICgoY2ggPj0gJ0EnICYmIGNoIDw9ICdaJykgfHwgKGNoID49ICdhJyAmJiBjaCA8PSAneicpKSB7CisKKyAgICAgICAgICAgIGMgPSAodV9jaGFyKSAoY2ggfCAweDIwKTsKKyAgICAgICAgICAgIGlmIChjID49ICdhJyAmJiBjIDw9ICdmJykgewogICAgICAgICAgICAgICAgIHItPnNjaGVtYV9zdGFydCA9IHA7CiAgICAgICAgICAgICAgICAgc3RhdGUgPSBzd19zY2hlbWE7CiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xMjgsNyArMTMwLDkgQEAKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2Ugc3dfc2NoZW1hOgotICAgICAgICAgICAgaWYgKChjaCA+PSAnQScgJiYgY2ggPD0gJ1onKSB8fCAoY2ggPj0gJ2EnICYmIGNoIDw9ICd6JykpIHsKKworICAgICAgICAgICAgYyA9ICh1X2NoYXIpIChjaCB8IDB4MjApOworICAgICAgICAgICAgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ2YnKSB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKQEAgLTE2NCw4ICsxNjgsMTMgQEAKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2Ugc3dfaG9zdDoKLSAgICAgICAgICAgIGlmICgoY2ggPj0gJ0EnICYmIGNoIDw9ICdaJykgfHwgKGNoID49ICdhJyAmJiBjaCA8PSAneicpCi0gICAgICAgICAgICAgICAgfHwgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpIHx8IGNoID09ICcuJyB8fCBjaCA9PSAnLScpCisKKyAgICAgICAgICAgIGMgPSAodV9jaGFyKSAoY2ggfCAweDIwKTsKKyAgICAgICAgICAgIGlmIChjID49ICdhJyAmJiBjIDw9ICdmJykgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKGNoID49ICcwJyAmJiBjaCA8PSAnOScpIHx8IGNoID09ICcuJyB8fCBjaCA9PSAnLScpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC0yMDQsMTAgKzIxMywxMyBAQAogICAgICAgICAvKiBjaGVjayAiLy4iLCAiLy8iLCAiJSIsIGFuZCAiXCIgKFdpbjMyKSBpbiBVUkkgKi8KICAgICAgICAgY2FzZSBzd19hZnRlcl9zbGFzaF9pbl91cmk6CiAKLSAgICAgICAgICAgIGlmICgoY2ggPj0gJ2EnICYmIGNoIDw9ICd6JykKLSAgICAgICAgICAgICAgICB8fCAoY2ggPj0gJ0EnICYmIGNoIDw9ICdaJykKLSAgICAgICAgICAgICAgICB8fCAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykpCi0gICAgICAgICAgICB7CisgICAgICAgICAgICBjID0gKHVfY2hhcikgKGNoIHwgMHgyMCk7CisgICAgICAgICAgICBpZiAoYyA+PSAnYScgJiYgYyA8PSAnZicpIHsKKyAgICAgICAgICAgICAgICBzdGF0ZSA9IHN3X2NoZWNrX3VyaTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpIHsKICAgICAgICAgICAgICAgICBzdGF0ZSA9IHN3X2NoZWNrX3VyaTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTI2MywxMCArMjc1LDEyIEBACiAgICAgICAgIC8qIGNoZWNrICIvIiwgIiUiIGFuZCAiXCIgKFdpbjMyKSBpbiBVUkkgKi8KICAgICAgICAgY2FzZSBzd19jaGVja191cmk6CiAKLSAgICAgICAgICAgIGlmICgoY2ggPj0gJ2EnICYmIGNoIDw9ICd6JykKLSAgICAgICAgICAgICAgICB8fCAoY2ggPj0gJ0EnICYmIGNoIDw9ICdaJykKLSAgICAgICAgICAgICAgICB8fCAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykpCi0gICAgICAgICAgICB7CisgICAgICAgICAgICBjID0gKHVfY2hhcikgKGNoIHwgMHgyMCk7CisgICAgICAgICAgICBpZiAoYyA+PSAnYScgJiYgYyA8PSAnZicpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpIHsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIApAQCAtNDkwLDcgKzUwNCw4IEBACiAKIG5neF9pbnRfdCBuZ3hfaHR0cF9wYXJzZV9oZWFkZXJfbGluZShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIG5neF9idWZfdCAqYikKIHsKLSAgICB1X2NoYXIgIGMsIGNoLCAqcDsKKyAgICB1X2NoYXIgICAgICBjLCBjaCwgKnA7CisgICAgbmd4X3VpbnRfdCAgaGFzaDsKICAgICBlbnVtIHsKICAgICAgICAgc3dfc3RhcnQgPSAwLAogICAgICAgICBzd19uYW1lLApAQCAtNTA0LDYgKzUxOSw3IEBACiAgICAgfSBzdGF0ZTsKIAogICAgIHN0YXRlID0gci0+c3RhdGU7CisgICAgaGFzaCA9IHItPmhlYWRlcl9oYXNoOwogCiAgICAgZm9yIChwID0gYi0+cG9zOyBwIDwgYi0+bGFzdDsgcCsrKSB7CiAgICAgICAgIGNoID0gKnA7CkBAIC01MjgsMTQgKzU0NCwxNyBAQAogCiAgICAgICAgICAgICAgICAgYyA9ICh1X2NoYXIpIChjaCB8IDB4MjApOwogICAgICAgICAgICAgICAgIGlmIChjID49ICdhJyAmJiBjIDw9ICd6JykgeworICAgICAgICAgICAgICAgICAgICBoYXNoID0gYzsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKGNoID09ICctJykgeworICAgICAgICAgICAgICAgICAgICBoYXNoID0gY2g7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB7CisgICAgICAgICAgICAgICAgICAgIGhhc2ggPSBjaDsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCkBAIC01NTAsNiArNTY5LDcgQEAKICAgICAgICAgY2FzZSBzd19uYW1lOgogICAgICAgICAgICAgYyA9ICh1X2NoYXIpIChjaCB8IDB4MjApOwogICAgICAgICAgICAgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSB7CisgICAgICAgICAgICAgICAgaGFzaCArPSBjOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCkBAIC01NjAsMTAgKzU4MCwxMiBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoY2ggPT0gJy0nKSB7CisgICAgICAgICAgICAgICAgaGFzaCArPSBjaDsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpIHsKKyAgICAgICAgICAgICAgICBoYXNoICs9IGNoOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCkBAIC02ODEsNiArNzAzLDcgQEAKIAogICAgIGItPnBvcyA9IHA7CiAgICAgci0+c3RhdGUgPSBzdGF0ZTsKKyAgICByLT5oZWFkZXJfaGFzaCA9IGhhc2g7CiAKICAgICByZXR1cm4gTkdYX0FHQUlOOwogCkBAIC02ODgsNiArNzExLDcgQEAKIAogICAgIGItPnBvcyA9IHAgKyAxOwogICAgIHItPnN0YXRlID0gc3dfc3RhcnQ7CisgICAgci0+aGVhZGVyX2hhc2ggPSBoYXNoOwogCiAgICAgcmV0dXJuIE5HWF9PSzsKIApkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbmd4X2h0dHBfcmVxdWVzdC5jIGIvc3JjL2h0dHAvbmd4X2h0dHBfcmVxdWVzdC5jCmluZGV4IDE1MjdhZjIuLjQ4YjczNTcgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL25neF9odHRwX3JlcXVlc3QuYworKysgYi9zcmMvaHR0cC9uZ3hfaHR0cF9yZXF1ZXN0LmMKQEAgLTM0NCw3ICszNDQsNyBAQAogCiAgICAgICAgIGlmIChjLT5zc2wgPT0gTlVMTCkgewogICAgICAgICAgICAgaWYgKG5neF9zc2xfY3JlYXRlX3Nlc3Npb24oc3NjZi0+c3NsX2N0eCwgYywgTkdYX1NTTF9CVUZGRVIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBOR1hfRVJST1IpCisgICAgICAgICAgICAgICAgPT0gTkdYX0VSUk9SKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIG5neF9odHRwX2Nsb3NlX2Nvbm5lY3Rpb24oYyk7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwpAQCAtNzA3LDEyICs3MDcsMTUgQEAKIHN0YXRpYyB2b2lkCiBuZ3hfaHR0cF9wcm9jZXNzX3JlcXVlc3RfaGVhZGVycyhuZ3hfZXZlbnRfdCAqcmV2KQogewotICAgIHNzaXplX3QgICAgICAgICAgICAgIG47Ci0gICAgbmd4X2ludF90ICAgICAgICAgICAgcmMsIHJ2LCBpOwotICAgIG5neF9zdHJfdCAgICAgICAgICAgIGhlYWRlcjsKLSAgICBuZ3hfdGFibGVfZWx0X3QgICAgICpoLCAqKmNvb2tpZTsKLSAgICBuZ3hfY29ubmVjdGlvbl90ICAgICpjOwotICAgIG5neF9odHRwX3JlcXVlc3RfdCAgKnI7CisgICAgc3NpemVfdCAgICAgICAgICAgICAgICAgICAgIG47CisgICAgbmd4X2ludF90ICAgICAgICAgICAgICAgICAgIHJjLCBydjsKKyAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAga2V5OworICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICBoZWFkZXI7CisgICAgbmd4X3RhYmxlX2VsdF90ICAgICAgICAgICAgKmgsICoqY29va2llOworICAgIG5neF9jb25uZWN0aW9uX3QgICAgICAgICAgICpjOworICAgIG5neF9odHRwX2hlYWRlcl90ICAgICAgICAgICpoaDsKKyAgICBuZ3hfaHR0cF9yZXF1ZXN0X3QgICAgICAgICAqcjsKKyAgICBuZ3hfaHR0cF9jb3JlX21haW5fY29uZl90ICAqY21jZjsKIAogICAgIGMgPSByZXYtPmRhdGE7CiAgICAgciA9IGMtPmRhdGE7CkBAIC03MjgsNiArNzMxLDkgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAorICAgIGNtY2YgPSBuZ3hfaHR0cF9nZXRfbW9kdWxlX21haW5fY29uZihyLCBuZ3hfaHR0cF9jb3JlX21vZHVsZSk7CisgICAgaGggPSAobmd4X2h0dHBfaGVhZGVyX3QgKikgY21jZi0+aGVhZGVyc19pbl9oYXNoLmJ1Y2tldHM7CisKICAgICByYyA9IE5HWF9BR0FJTjsKIAogICAgIGZvciAoIDs7ICkgewpAQCAtNzkxLDYgKzc5Nyw4IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBoLT5oYXNoID0gci0+aGVhZGVyX2hhc2g7CisKICAgICAgICAgICAgIGgtPmtleS5sZW4gPSByLT5oZWFkZXJfbmFtZV9lbmQgLSByLT5oZWFkZXJfbmFtZV9zdGFydDsKICAgICAgICAgICAgIGgtPmtleS5kYXRhID0gci0+aGVhZGVyX25hbWVfc3RhcnQ7CiAgICAgICAgICAgICBoLT5rZXkuZGF0YVtoLT5rZXkubGVuXSA9ICdcMCc7CkBAIC04MTIsMTkgKzgyMCwxMyBAQAogICAgICAgICAgICAgICAgICpjb29raWUgPSBoOwogCiAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGtleSA9IGgtPmhhc2ggJSBjbWNmLT5oZWFkZXJzX2luX2hhc2guaGFzaF9zaXplOwogCi0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgbmd4X2h0dHBfaGVhZGVyc19pbltpXS5uYW1lLmxlbiAhPSAwOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5neF9odHRwX2hlYWRlcnNfaW5baV0ubmFtZS5sZW4gIT0gaC0+a2V5LmxlbikgewotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAobmd4X3N0cmNhc2VjbXAobmd4X2h0dHBfaGVhZGVyc19pbltpXS5uYW1lLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5rZXkuZGF0YSkgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgKigobmd4X3RhYmxlX2VsdF90ICoqKSAoKGNoYXIgKikgJnItPmhlYWRlcnNfaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBuZ3hfaHR0cF9oZWFkZXJzX2luW2ldLm9mZnNldCkpID0gaDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGhoW2tleV0ubmFtZS5sZW4gPT0gaC0+a2V5LmxlbgorICAgICAgICAgICAgICAgICAgICAmJiBuZ3hfc3RyY2FzZWNtcChoaFtrZXldLm5hbWUuZGF0YSwgaC0+a2V5LmRhdGEpID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAqKChuZ3hfdGFibGVfZWx0X3QgKiopCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGNoYXIgKikgJnItPmhlYWRlcnNfaW4gKyBoaFtrZXldLm9mZnNldCkpID0gaDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKQEAgLTEyMzcsOSArMTIzOSw5IEBACiAgICAgbmd4X2ludF90ICAgICAgICAgICAgICAgICAgIHJjOwogICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICBpLCBuLCBrZXksIGZvdW5kOwogICAgIG5neF9odHRwX3NlcnZlcl9uYW1lX3QgICAgICpuYW1lOwotICAgIG5neF9odHRwX2NvcmVfbWFpbl9jb25mX3QgICpjbWNmOwotICAgIG5neF9odHRwX2NvcmVfc3J2X2NvbmZfdCAgICpjc2NmOwogICAgIG5neF9odHRwX2NvcmVfbG9jX2NvbmZfdCAgICpjbGNmOworICAgIG5neF9odHRwX2NvcmVfc3J2X2NvbmZfdCAgICpjc2NmOworICAgIG5neF9odHRwX2NvcmVfbWFpbl9jb25mX3QgICpjbWNmOwogCiAgICAgaWYgKHItPnZpcnR1YWxfbmFtZXMtPmhhc2gpIHsKICAgICAgICAgY21jZiA9IG5neF9odHRwX2dldF9tb2R1bGVfbWFpbl9jb25mKHIsIG5neF9odHRwX2NvcmVfbW9kdWxlKTsKZGlmZiAtLWdpdCBhL3NyYy9odHRwL25neF9odHRwX3JlcXVlc3QuaCBiL3NyYy9odHRwL25neF9odHRwX3JlcXVlc3QuaAppbmRleCAxYjA2ODBjLi5kOTg4OWM4IDEwMDY0NAotLS0gYS9zcmMvaHR0cC9uZ3hfaHR0cF9yZXF1ZXN0LmgKKysrIGIvc3JjL2h0dHAvbmd4X2h0dHBfcmVxdWVzdC5oCkBAIC0zODYsMTEgKzM4NiwxMiBAQAogICAgIHVfY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICpoZWFkZXJfbmFtZV9lbmQ7CiAgICAgdV9jaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgKmhlYWRlcl9zdGFydDsKICAgICB1X2NoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAqaGVhZGVyX2VuZDsKKyAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyX2hhc2g7CiB9OwogCiAKLWV4dGVybiBuZ3hfaHR0cF9oZWFkZXJfdCBuZ3hfaHR0cF9oZWFkZXJzX2luW107Ci1leHRlcm4gbmd4X2h0dHBfaGVhZGVyX3Qgbmd4X2h0dHBfaGVhZGVyc19vdXRbXTsKK2V4dGVybiBuZ3hfaHR0cF9oZWFkZXJfdCAgIG5neF9odHRwX2hlYWRlcnNfaW5bXTsKK2V4dGVybiBuZ3hfaHR0cF9oZWFkZXJfdCAgIG5neF9odHRwX2hlYWRlcnNfb3V0W107CiAKIAogCmRpZmYgLS1naXQgYS9zcmMvaHR0cC9uZ3hfaHR0cF9zY3JpcHQuYyBiL3NyYy9odHRwL25neF9odHRwX3NjcmlwdC5jCmluZGV4IGU4MDgyNGIuLmM3ZWIwNzQgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL25neF9odHRwX3NjcmlwdC5jCisrKyBiL3NyYy9odHRwL25neF9odHRwX3NjcmlwdC5jCkBAIC05LDQ2ICs5LDE4NiBAQAogI2luY2x1ZGUgPG5neF9odHRwLmg+CiAKIAotdV9jaGFyICpuZ3hfaHR0cF9zY3JpcHRfY29weShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVfY2hhciAqYnVmLCB2b2lkICpkYXRhKQorbmd4X2ludF90CituZ3hfaHR0cF9zY3JpcHRfY29tcGlsZV9saXRlKG5neF9jb25mX3QgKmNmLCBuZ3hfYXJyYXlfdCAqc291cmNlcywKKyAgICBuZ3hfYXJyYXlfdCAqKmxlbmd0aHMsIG5neF9hcnJheV90ICoqdmFsdWVzLAorICAgIG5neF9odHRwX3NjcmlwdF9jb21waWxlX2xpdGVfc3RhcnRfcHQgc3RhcnQsCisgICAgbmd4X2h0dHBfc2NyaXB0X2NvbXBpbGVfbGl0ZV9lbmRfcHQgZW5kKQogewotICAgIHVfY2hhciAgKipwID0gZGF0YTsKKyAgICB1aW50cHRyX3QgICAgICAgICAgICAgICAgICAgKmNvZGU7CisgICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgICBpOworICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICAgICAqc3JjOworICAgIG5neF9odHRwX3ZhcmlhYmxlX3QgICAgICAgICAqdmFyOworICAgIG5neF9odHRwX3NjcmlwdF92YXJfY29kZV90ICAqdmFyX2NvZGU7CiAKLSAgICBuZ3hfaHR0cF9zY3JpcHRfY29kZV90ICAqY29kZTsKKyAgICBpZiAoc291cmNlcy0+bmVsdHMgPT0gMCkgeworICAgICAgICByZXR1cm4gTkdYX09LOworICAgIH0KIAotICAgIGNvZGUgPSAobmd4X2h0dHBfc2NyaXB0X2NvZGVfdCAqKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChjaGFyICopIGRhdGEgLSBzaXplb2Yobmd4X2h0dHBfc2NyaXB0X2NvZGVfdCkpOworICAgIGlmICgqbGVuZ3RocyA9PSBOVUxMKSB7CisgICAgICAgICpsZW5ndGhzID0gbmd4X2FycmF5X2NyZWF0ZShjZi0+cG9vbCwgNjQsIDEpOworICAgICAgICBpZiAoKmxlbmd0aHMgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICAgICAgfQorICAgIH0KIAotICAgIHJldHVybiBuZ3hfY3B5bWVtKGJ1ZiwgKnAsIGNvZGUtPmRhdGFfbGVuKTsKKyAgICBpZiAoKnZhbHVlcyA9PSBOVUxMKSB7CisgICAgICAgICp2YWx1ZXMgPSBuZ3hfYXJyYXlfY3JlYXRlKGNmLT5wb29sLCAyNTYsIDEpOworICAgICAgICBpZiAoKnZhbHVlcyA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgICAgICB9CisgICAgfQorCisgICAgc3JjID0gc291cmNlcy0+ZWx0czsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc291cmNlcy0+bmVsdHM7IGkrKykgeworCisgICAgICAgIGlmIChzcmNbaV0udmFsdWUuZGF0YVswXSA9PSAnJCcpIHsKKyAgICAgICAgICAgIGlmIChzdGFydCgmc3JjW2ldLCAqbGVuZ3RocywgKnZhbHVlcywgMCkgIT0gTkdYX09LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3JjW2ldLnZhbHVlLmxlbi0tOworICAgICAgICAgICAgc3JjW2ldLnZhbHVlLmRhdGErKzsKKworICAgICAgICAgICAgdmFyID0gbmd4X2h0dHBfYWRkX3ZhcmlhYmxlKGNmLCAmc3JjW2ldLnZhbHVlLCAwKTsKKworICAgICAgICAgICAgaWYgKHZhciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyX2NvZGUgPSBuZ3hfYXJyYXlfcHVzaF9uKCpsZW5ndGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfaHR0cF9zY3JpcHRfdmFyX2NvZGVfdCkpOworICAgICAgICAgICAgaWYgKHZhcl9jb2RlID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXJfY29kZS0+Y29kZSA9IChuZ3hfaHR0cF9zY3JpcHRfY29kZV9wdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfc2NyaXB0X2NvcHlfdmFyX2xlbjsKKyAgICAgICAgICAgIHZhcl9jb2RlLT5pbmRleCA9IHZhci0+aW5kZXg7CisKKworICAgICAgICAgICAgdmFyX2NvZGUgPSBuZ3hfYXJyYXlfcHVzaF9uKCp2YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5neF9odHRwX3NjcmlwdF92YXJfY29kZV90KSk7CisgICAgICAgICAgICBpZiAodmFyX2NvZGUgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhcl9jb2RlLT5jb2RlID0gbmd4X2h0dHBfc2NyaXB0X2NvcHlfdmFyOworICAgICAgICAgICAgdmFyX2NvZGUtPmluZGV4ID0gdmFyLT5pbmRleDsKKworCisgICAgICAgICAgICBpZiAoZW5kKCpsZW5ndGhzLCAqdmFsdWVzKSAhPSBOR1hfT0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdGFydCgmc3JjW2ldLCAqbGVuZ3RocywgKnZhbHVlcywgMSkgIT0gTkdYX09LKSB7CisgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgICAgICB9CisgICAgfQorCisgICAgY29kZSA9IG5neF9hcnJheV9wdXNoX24oKmxlbmd0aHMsIHNpemVvZih1aW50cHRyX3QpKTsKKyAgICBpZiAoY29kZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgfQorCisgICAgKmNvZGUgPSAodWludHB0cl90KSBOVUxMOworCisgICAgY29kZSA9IG5neF9hcnJheV9wdXNoX24oKnZhbHVlcywgc2l6ZW9mKHVpbnRwdHJfdCkpOworICAgIGlmIChjb2RlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICB9CisKKyAgICAqY29kZSA9ICh1aW50cHRyX3QpIE5VTEw7CisKKyAgICByZXR1cm4gTkdYX09LOwogfQogCiAKLXVfY2hhciAqbmd4X2h0dHBfc2NyaXB0X2hlYWRlcl9pbihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICpidWYsIHZvaWQgKmRhdGEpCisjaWYgMAorCitzdGF0aWMgdm9pZCAqCituZ3hfaHR0cF9zY3JpcHRfc3RhcnRfY29kZShuZ3hfcG9vbF90ICpwb29sLCBuZ3hfYXJyYXlfdCAqKmNvZGVzLCBzaXplX3Qgc2l6ZSkKIHsKLSAgICBzaXplX3QgICpvZmZzZXQgPSBkYXRhOworICAgIGlmICgqY29kZXMgPT0gTlVMTCkgeworICAgICAgICAqY29kZXMgPSBuZ3hfYXJyYXlfY3JlYXRlKHBvb2wsIDI1NiwgMSk7CisgICAgICAgIGlmICgqY29kZXMgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CiAKLSAgICBuZ3hfdGFibGVfZWx0X3QgICpoOworICAgIHJldHVybiBuZ3hfYXJyYXlfcHVzaF9uKCpjb2Rlcywgc2l6ZSk7Cit9CiAKLSAgICBoID0gKihuZ3hfdGFibGVfZWx0X3QgKiopICgoKGNoYXIgKikgci0+aGVhZGVyc19pbikgKyAqb2Zmc2V0KTsKKyNlbmRpZgogCi0gICAgcmV0dXJuIG5neF9jcHltZW0ocCwgaC0+dmFsdWUuZGF0YSwgaC0+dmFsdWUubGVuKTsKKworc2l6ZV90CituZ3hfaHR0cF9zY3JpcHRfY29weV9sZW4obmd4X2h0dHBfc2NyaXB0X2VuZ2luZV90ICplKQoreworICAgIG5neF9odHRwX3NjcmlwdF9jb3B5X2NvZGVfdCAgKmNvZGU7CisKKyAgICBjb2RlID0gKG5neF9odHRwX3NjcmlwdF9jb3B5X2NvZGVfdCAqKSBlLT5saXRlLmlwOworCisgICAgZS0+bGl0ZS5pcCArPSBzaXplb2Yobmd4X2h0dHBfc2NyaXB0X2NvcHlfY29kZV90KTsKKworICAgIHJldHVybiBjb2RlLT5sZW47CiB9CiAKIAotdV9jaGFyICpuZ3hfaHR0cF9zY3JpcHRfcmVxdWVzdF9saW5lKG5neF9odHRwX3JlcXVlc3RfdCAqciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKmJ1Ziwgdm9pZCAqZGF0YSkKK3ZvaWQKK25neF9odHRwX3NjcmlwdF9jb3B5KG5neF9odHRwX3NjcmlwdF9lbmdpbmVfdCAqZSkKIHsKLSAgICByZXR1cm4gbmd4X2NweW1lbShwLCByLT5yZXF1ZXN0X2xpbmUuZGF0YSwgci0+cmVxdWVzdF9saW5lLmxlbik7CisgICAgbmd4X2h0dHBfc2NyaXB0X2NvcHlfY29kZV90ICAqY29kZTsKKworICAgIGNvZGUgPSAobmd4X2h0dHBfc2NyaXB0X2NvcHlfY29kZV90ICopIGUtPmxpdGUuaXA7CisKKyAgICBlLT5saXRlLnBvcyA9IG5neF9jcHltZW0oZS0+bGl0ZS5wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUtPmxpdGUuaXAgKyBzaXplb2Yobmd4X2h0dHBfc2NyaXB0X2NvcHlfY29kZV90KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZS0+bGVuKTsKKworICAgIGUtPmxpdGUuaXAgKz0gc2l6ZW9mKG5neF9odHRwX3NjcmlwdF9jb3B5X2NvZGVfdCkKKyAgICAgICAgICAgICsgKChjb2RlLT5sZW4gKyBzaXplb2YodWludHB0cl90KSAtIDEpICYgfihzaXplb2YodWludHB0cl90KSAtIDEpKTsKIH0KIAogCi11X2NoYXIgKm5neF9odHRwX3NjcmlwdF9zdGF0dXMobmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1X2NoYXIgKmJ1Ziwgdm9pZCAqZGF0YSkKK3NpemVfdAorbmd4X2h0dHBfc2NyaXB0X2NvcHlfdmFyX2xlbihuZ3hfaHR0cF9zY3JpcHRfZW5naW5lX3QgKmUpCiB7Ci0gICAgcmV0dXJuIG5neF9zcHJpbnRmKGJ1ZiwgIiV1aSIsIHItPmhlYWRlcnNfb3V0LnN0YXR1cyk7CisgICAgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAgICp2YWx1ZTsKKyAgICBuZ3hfaHR0cF9zY3JpcHRfdmFyX2NvZGVfdCAgKmNvZGU7CisKKyAgICBjb2RlID0gKG5neF9odHRwX3NjcmlwdF92YXJfY29kZV90ICopIGUtPmxpdGUuaXA7CisKKyAgICBlLT5saXRlLmlwICs9IHNpemVvZihuZ3hfaHR0cF9zY3JpcHRfdmFyX2NvZGVfdCk7CisKKyAgICB2YWx1ZSA9IG5neF9odHRwX2dldF9pbmRleGVkX3ZhcmlhYmxlKGUtPmxpdGUucmVxdWVzdCwgY29kZS0+aW5kZXgpOworCisgICAgaWYgKHZhbHVlID09IE5VTEwgfHwgdmFsdWUgPT0gTkdYX0hUVFBfVkFSSUFCTEVfTk9UX0ZPVU5EKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHJldHVybiB2YWx1ZS0+dGV4dC5sZW47CiB9CiAKIAotdV9jaGFyICpuZ3hfaHR0cF9zY3JpcHRfc2VudChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVfY2hhciAqYnVmLCB2b2lkICpkYXRhKQordm9pZAorbmd4X2h0dHBfc2NyaXB0X2NvcHlfdmFyKG5neF9odHRwX3NjcmlwdF9lbmdpbmVfdCAqZSkKIHsKLSAgICByZXR1cm4gbmd4X3NwcmludGYoYnVmLCAiJU8iLCByLT5jb25uZWN0aW9uLT5zZW50KTsKKyAgICBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICAgKnZhbHVlOworICAgIG5neF9odHRwX3NjcmlwdF92YXJfY29kZV90ICAqY29kZTsKKworICAgIGNvZGUgPSAobmd4X2h0dHBfc2NyaXB0X3Zhcl9jb2RlX3QgKikgZS0+bGl0ZS5pcDsKKworICAgIGUtPmxpdGUuaXAgKz0gc2l6ZW9mKG5neF9odHRwX3NjcmlwdF92YXJfY29kZV90KTsKKworICAgIHZhbHVlID0gbmd4X2h0dHBfZ2V0X2luZGV4ZWRfdmFyaWFibGUoZS0+bGl0ZS5yZXF1ZXN0LCBjb2RlLT5pbmRleCk7CisKKyAgICBpZiAodmFsdWUgPT0gTlVMTCB8fCB2YWx1ZSA9PSBOR1hfSFRUUF9WQVJJQUJMRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGUtPmxpdGUucG9zID0gbmd4X2NweW1lbShlLT5saXRlLnBvcywgdmFsdWUtPnRleHQuZGF0YSwgdmFsdWUtPnRleHQubGVuKTsKIH0KZGlmZiAtLWdpdCBhL3NyYy9odHRwL25neF9odHRwX3NjcmlwdC5oIGIvc3JjL2h0dHAvbmd4X2h0dHBfc2NyaXB0LmgKaW5kZXggNjU4ZmFhYS4uZmFlMmI3YiAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbmd4X2h0dHBfc2NyaXB0LmgKKysrIGIvc3JjL2h0dHAvbmd4X2h0dHBfc2NyaXB0LmgKQEAgLTEzLDE0ICsxMyw1NCBAQAogI2luY2x1ZGUgPG5neF9odHRwLmg+CiAKIAotdHlwZWRlZiB1X2NoYXIgKigqbmd4X2h0dHBfc2NyaXB0X2NvZGVfcHQpIChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqYnVmLCB2b2lkICpkYXRhKTsKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1X2NoYXIgICAgICAgICAgICAgICAgICAgICAgICAgKmlwOworICAgIHVfY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAqcG9zOworICAgIG5neF9odHRwX3JlcXVlc3RfdCAgICAgICAgICAgICAqcmVxdWVzdDsKK30gbmd4X2h0dHBfc2NyaXB0X2xpdGVfZW5naW5lX3Q7CiAKLXR5cGVkZWYgc3RydWN0IG5neF9odHRwX3NjcmlwdF9jb2RlX3MgewotICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICBkYXRhX2xlbjsKLSAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgY29kZV9sZW47Ci0gICAgbmd4X2h0dHBfc2NyaXB0X2NvZGVfcHQgIGNvZGU7Ci19IG5neF9odHRwX3NjcmlwdF9jb2RlX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBuZ3hfaHR0cF9zY3JpcHRfbGl0ZV9lbmdpbmVfdCAgIGxpdGU7Cit9IG5neF9odHRwX3NjcmlwdF9lbmdpbmVfdDsKKworCit0eXBlZGVmIHZvaWQgKCpuZ3hfaHR0cF9zY3JpcHRfY29kZV9wdCkgKG5neF9odHRwX3NjcmlwdF9lbmdpbmVfdCAqZSk7Cit0eXBlZGVmIHNpemVfdCAoKm5neF9odHRwX3NjcmlwdF9sZW5fY29kZV9wdCkKKyAgICAobmd4X2h0dHBfc2NyaXB0X2xpdGVfZW5naW5lX3QgKmUpOworCit0eXBlZGVmIG5neF9pbnRfdCAoKm5neF9odHRwX3NjcmlwdF9jb21waWxlX2xpdGVfc3RhcnRfcHQpIChuZ3hfdGFibGVfZWx0X3QgKmgsCisgICAgbmd4X2FycmF5X3QgKmxlbmd0aHMsIG5neF9hcnJheV90ICp2YWx1ZXMsIG5neF91aW50X3QgdmFsdWUpOwordHlwZWRlZiBuZ3hfaW50X3QgKCpuZ3hfaHR0cF9zY3JpcHRfY29tcGlsZV9saXRlX2VuZF9wdCkgKG5neF9hcnJheV90ICpsZW5ndGhzLAorICAgIG5neF9hcnJheV90ICp2YWx1ZXMpOworCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBuZ3hfaHR0cF9zY3JpcHRfY29kZV9wdCAgICAgICAgIGNvZGU7CisgICAgdWludHB0cl90ICAgICAgICAgICAgICAgICAgICAgICBsZW47Cit9IG5neF9odHRwX3NjcmlwdF9jb3B5X2NvZGVfdDsKKworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgbmd4X2h0dHBfc2NyaXB0X2NvZGVfcHQgICAgICAgICBjb2RlOworICAgIHVpbnRwdHJfdCAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg7Cit9IG5neF9odHRwX3NjcmlwdF92YXJfY29kZV90OworCisKK25neF9pbnRfdCBuZ3hfaHR0cF9zY3JpcHRfY29tcGlsZV9saXRlKG5neF9jb25mX3QgKmNmLCBuZ3hfYXJyYXlfdCAqc291cmNlcywKKyAgICBuZ3hfYXJyYXlfdCAqKmxlbmd0aHMsIG5neF9hcnJheV90ICoqdmFsdWVzLAorICAgIG5neF9odHRwX3NjcmlwdF9jb21waWxlX2xpdGVfc3RhcnRfcHQgc3RhcnQsCisgICAgbmd4X2h0dHBfc2NyaXB0X2NvbXBpbGVfbGl0ZV9lbmRfcHQgZW5kKTsKKworCitzdGF0aWMgdm9pZCAqbmd4X2h0dHBfc2NyaXB0X3N0YXJ0X2NvZGUobmd4X3Bvb2xfdCAqcG9vbCwgbmd4X2FycmF5X3QgKipjb2RlcywKKyAgICBzaXplX3Qgc2l6ZSk7CisKK3NpemVfdCBuZ3hfaHR0cF9zY3JpcHRfY29weV9sZW4obmd4X2h0dHBfc2NyaXB0X2VuZ2luZV90ICplKTsKK3ZvaWQgbmd4X2h0dHBfc2NyaXB0X2NvcHkobmd4X2h0dHBfc2NyaXB0X2VuZ2luZV90ICplKTsKK3NpemVfdCBuZ3hfaHR0cF9zY3JpcHRfY29weV92YXJfbGVuKG5neF9odHRwX3NjcmlwdF9lbmdpbmVfdCAqZSk7Cit2b2lkIG5neF9odHRwX3NjcmlwdF9jb3B5X3ZhcihuZ3hfaHR0cF9zY3JpcHRfZW5naW5lX3QgKmUpOworCiAKIAogI2VuZGlmIC8qIF9OR1hfSFRUUF9TQ1JJUFRfSF9JTkNMVURFRF8gKi8KZGlmZiAtLWdpdCBhL3NyYy9odHRwL25neF9odHRwX3Vwc3RyZWFtLmMgYi9zcmMvaHR0cC9uZ3hfaHR0cF91cHN0cmVhbS5jCmluZGV4IDg5ZGVlMGUuLjNkYWI1YzMgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL25neF9odHRwX3Vwc3RyZWFtLmMKKysrIGIvc3JjL2h0dHAvbmd4X2h0dHBfdXBzdHJlYW0uYwpAQCAtMTEzNSw3ICsxMTM1LDcgQEAKIG5neF9odHRwX3Vwc3RyZWFtX2xvZ19lcnJvcihuZ3hfbG9nX3QgKmxvZywgdV9jaGFyICpidWYsIHNpemVfdCBsZW4pCiB7CiAgICAgdV9jaGFyICAgICAgICAgICAgICAgICAqcDsKLSAgICBuZ3hfaW50X3QgICAgICAgICAgICAgICBlc2NhcGU7CisgICAgdWludHB0cl90ICAgICAgICAgICAgICAgZXNjYXBlOwogICAgIG5neF9odHRwX2xvZ19jdHhfdCAgICAgKmN0eDsKICAgICBuZ3hfaHR0cF9yZXF1ZXN0X3QgICAgICpyOwogICAgIG5neF9odHRwX3Vwc3RyZWFtX3QgICAgKnU7CkBAIC0xMTUzLDI5ICsxMTUzLDI5IEBACiAgICAgICAgICAgICAgICAgICAgICAmci0+Y29ubmVjdGlvbi0+YWRkcl90ZXh0LAogICAgICAgICAgICAgICAgICAgICAgJnItPnNlcnZlcl9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgJnItPnVucGFyc2VkX3VyaSwKLSAgICAgICAgICAgICAgICAgICAgICZ1LT5zY2hlbWEsCisgICAgICAgICAgICAgICAgICAgICAmdS0+c2NoZW1hMCwKICAgICAgICAgICAgICAgICAgICAgICZwZWVyLT5wZWVycy0+cGVlcltwZWVyLT5jdXJfcGVlcl0ubmFtZSwKICAgICAgICAgICAgICAgICAgICAgIHBlZXItPnBlZXJzLT5wZWVyW3BlZXItPmN1cl9wZWVyXS51cmlfc2VwYXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgJnUtPnVyaSk7CisgICAgICAgICAgICAgICAgICAgICAmdS0+dXJpMCk7CiAgICAgbGVuIC09IHAgLSBidWY7CiAgICAgYnVmID0gcDsKIAogICAgIGlmIChyLT5xdW90ZWRfdXJpKSB7Ci0gICAgICAgIGVzY2FwZSA9IDIgKiBuZ3hfZXNjYXBlX3VyaShOVUxMLCByLT51cmkuZGF0YSArIHUtPmxvY2F0aW9uLT5sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLT51cmkubGVuIC0gdS0+bG9jYXRpb24tPmxlbiwKKyAgICAgICAgZXNjYXBlID0gMiAqIG5neF9lc2NhcGVfdXJpKE5VTEwsIHItPnVyaS5kYXRhICsgdS0+bG9jYXRpb24wLT5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLT51cmkubGVuIC0gdS0+bG9jYXRpb24wLT5sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR1hfRVNDQVBFX1VSSSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgZXNjYXBlID0gMDsKICAgICB9CiAKICAgICBpZiAoZXNjYXBlKSB7Ci0gICAgICAgIGlmIChsZW4gPj0gci0+dXJpLmxlbiAtIHUtPmxvY2F0aW9uLT5sZW4gKyBlc2NhcGUpIHsKKyAgICAgICAgaWYgKGxlbiA+PSByLT51cmkubGVuIC0gdS0+bG9jYXRpb24wLT5sZW4gKyBlc2NhcGUpIHsKIAotICAgICAgICAgICAgbmd4X2VzY2FwZV91cmkoYnVmLCByLT51cmkuZGF0YSArIHUtPmxvY2F0aW9uLT5sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByLT51cmkubGVuIC0gdS0+bG9jYXRpb24tPmxlbiwgTkdYX0VTQ0FQRV9VUkkpOworICAgICAgICAgICAgbmd4X2VzY2FwZV91cmkoYnVmLCByLT51cmkuZGF0YSArIHUtPmxvY2F0aW9uMC0+bGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+dXJpLmxlbiAtIHUtPmxvY2F0aW9uMC0+bGVuLCBOR1hfRVNDQVBFX1VSSSk7CiAKLSAgICAgICAgICAgIGJ1ZiArPSByLT51cmkubGVuIC0gdS0+bG9jYXRpb24tPmxlbiArIGVzY2FwZTsKLSAgICAgICAgICAgIGxlbiAtPSByLT51cmkubGVuIC0gdS0+bG9jYXRpb24tPmxlbiArIGVzY2FwZTsKKyAgICAgICAgICAgIGJ1ZiArPSByLT51cmkubGVuIC0gdS0+bG9jYXRpb24wLT5sZW4gKyBlc2NhcGU7CisgICAgICAgICAgICBsZW4gLT0gci0+dXJpLmxlbiAtIHUtPmxvY2F0aW9uMC0+bGVuICsgZXNjYXBlOwogCiAgICAgICAgICAgICBpZiAoci0+YXJncy5sZW4pIHsKICAgICAgICAgICAgICAgICBwID0gbmd4X3NucHJpbnRmKGJ1ZiwgbGVuLCAiPyVWIiwgJnItPmFyZ3MpOwpAQCAtMTE4NiwxOSArMTE4NiwxOSBAQAogICAgICAgICAgICAgcmV0dXJuIG5neF9odHRwX2xvZ19lcnJvcl9pbmZvKHIsIGJ1ZiwgbGVuKTsKICAgICAgICAgfQogCi0gICAgICAgIHAgPSBuZ3hfcGFsbG9jKHItPnBvb2wsIHItPnVyaS5sZW4gLSB1LT5sb2NhdGlvbi0+bGVuICsgZXNjYXBlKTsKKyAgICAgICAgcCA9IG5neF9wYWxsb2Moci0+cG9vbCwgci0+dXJpLmxlbiAtIHUtPmxvY2F0aW9uMC0+bGVuICsgZXNjYXBlKTsKICAgICAgICAgaWYgKHAgPT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuIGJ1ZjsKICAgICAgICAgfQogCi0gICAgICAgIG5neF9lc2NhcGVfdXJpKHAsIHItPnVyaS5kYXRhICsgdS0+bG9jYXRpb24tPmxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgci0+dXJpLmxlbiAtIHUtPmxvY2F0aW9uLT5sZW4sIE5HWF9FU0NBUEVfVVJJKTsKKyAgICAgICAgbmd4X2VzY2FwZV91cmkocCwgci0+dXJpLmRhdGEgKyB1LT5sb2NhdGlvbjAtPmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgci0+dXJpLmxlbiAtIHUtPmxvY2F0aW9uMC0+bGVuLCBOR1hfRVNDQVBFX1VSSSk7CiAKLSAgICAgICAgcCA9IG5neF9jcHltZW0oYnVmLCBwLCByLT51cmkubGVuIC0gdS0+bG9jYXRpb24tPmxlbiArIGVzY2FwZSk7CisgICAgICAgIHAgPSBuZ3hfY3B5bWVtKGJ1ZiwgcCwgci0+dXJpLmxlbiAtIHUtPmxvY2F0aW9uMC0+bGVuICsgZXNjYXBlKTsKIAogICAgIH0gZWxzZSB7Ci0gICAgICAgIHAgPSBuZ3hfY3B5bWVtKGJ1Ziwgci0+dXJpLmRhdGEgKyB1LT5sb2NhdGlvbi0+bGVuLAotICAgICAgICAgICAgICAgICAgICAgICByLT51cmkubGVuIC0gdS0+bG9jYXRpb24tPmxlbik7CisgICAgICAgIHAgPSBuZ3hfY3B5bWVtKGJ1Ziwgci0+dXJpLmRhdGEgKyB1LT5sb2NhdGlvbjAtPmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgci0+dXJpLmxlbiAtIHUtPmxvY2F0aW9uMC0+bGVuKTsKICAgICB9CiAKICAgICBsZW4gLT0gcCAtIGJ1ZjsKZGlmZiAtLWdpdCBhL3NyYy9odHRwL25neF9odHRwX3Vwc3RyZWFtLmggYi9zcmMvaHR0cC9uZ3hfaHR0cF91cHN0cmVhbS5oCmluZGV4IGM3MjIxNTIuLmMxYmMwZDkgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL25neF9odHRwX3Vwc3RyZWFtLmgKKysrIGIvc3JjL2h0dHAvbmd4X2h0dHBfdXBzdHJlYW0uaApAQCAtNTUsNiArNTUsNyBAQAogICAgIG5neF9idWZzX3QgICAgICAgICAgICAgICAgICBidWZzOwogCiAgICAgbmd4X2ZsYWdfdCAgICAgICAgICAgICAgICAgIHJlZGlyZWN0X2Vycm9yczsKKyAgICBuZ3hfZmxhZ190ICAgICAgICAgICAgICAgICAgcGFzc191bnBhcnNlZF91cmk7CiAgICAgbmd4X2ZsYWdfdCAgICAgICAgICAgICAgICAgIHhfcG93ZXJlZF9ieTsKICAgICBuZ3hfZmxhZ190ICAgICAgICAgICAgICAgICAgY3ljbGljX3RlbXBfZmlsZTsKIApAQCAtODcsOSArODgsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaW50X3QgcmMpOwogICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICBtZXRob2Q7CiAKLSAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgICAgc2NoZW1hOwotICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICB1cmk7Ci0gICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgKmxvY2F0aW9uOworICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICBzY2hlbWEwOworICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICB1cmkwOworICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICpsb2NhdGlvbjA7CiAKICAgICBuZ3hfaHR0cF9sb2dfY3R4X3QgICAgICAgICAqbG9nX2N0eDsKICAgICBuZ3hfbG9nX2hhbmRsZXJfcHQgICAgICAgICAgbG9nX2hhbmRsZXI7CmRpZmYgLS1naXQgYS9zcmMvaHR0cC9uZ3hfaHR0cF93cml0ZV9maWx0ZXJfbW9kdWxlLmMgYi9zcmMvaHR0cC9uZ3hfaHR0cF93cml0ZV9maWx0ZXJfbW9kdWxlLmMKaW5kZXggODg4MzkwNy4uYTk1MjY5NyAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbmd4X2h0dHBfd3JpdGVfZmlsdGVyX21vZHVsZS5jCisrKyBiL3NyYy9odHRwL25neF9odHRwX3dyaXRlX2ZpbHRlcl9tb2R1bGUuYwpAQCAtMjMxLDYgKzIzMSwxMiBAQAogICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgIH0KIAorICAgIGZvciAoY2wgPSBjdHgtPm91dDsgY2wgJiYgY2wgIT0gY2hhaW47IC8qIHZvaWQgKi8pIHsKKyAgICAgICAgbG4gPSBjbDsKKyAgICAgICAgY2wgPSBjbC0+bmV4dDsKKyAgICAgICAgbmd4X2ZyZWVfY2hhaW4oci0+cG9vbCwgbG4pOworICAgIH0KKwogICAgIGN0eC0+b3V0ID0gY2hhaW47CiAKICAgICBpZiAoY2hhaW4gfHwgKGxhc3QgJiYgYy0+YnVmZmVyZWQpKSB7CmRpZmYgLS1naXQgYS9zcmMvb3MvdW5peC9uZ3hfc2V0cHJvY3RpdGxlLmMgYi9zcmMvb3MvdW5peC9uZ3hfc2V0cHJvY3RpdGxlLmMKaW5kZXggMjViYmM5Yi4uNzEyYzIyYyAxMDA2NDQKLS0tIGEvc3JjL29zL3VuaXgvbmd4X3NldHByb2N0aXRsZS5jCisrKyBiL3NyYy9vcy91bml4L25neF9zZXRwcm9jdGl0bGUuYwpAQCAtODgsNyArODgsNyBAQAogCiAgICAgbmd4X29zX2FyZ3ZbMV0gPSBOVUxMOwogCi0gICAgcCA9IG5neF9jcHlzdHJuKCh1X2NoYXIgKikgbmd4X29zX2FyZ3ZbMF0sICJuZ2lueDogIiwKKyAgICBwID0gbmd4X2NweXN0cm4oKHVfY2hhciAqKSBuZ3hfb3NfYXJndlswXSwgKHVfY2hhciAqKSAibmdpbng6ICIsCiAgICAgICAgICAgICAgICAgICAgIG5neF9vc19hcmd2X2xhc3QgLSBuZ3hfb3NfYXJndlswXSk7CiAKICAgICBwID0gbmd4X2NweXN0cm4ocCwgKHVfY2hhciAqKSB0aXRsZSwgbmd4X29zX2FyZ3ZfbGFzdCAtIChjaGFyICopIHApOwo=