ZGlmZiAtLWdpdCBhL2F1dG8vbGliL3BjcmUvbWFrZWZpbGUuYmNjIGIvYXV0by9saWIvcGNyZS9tYWtlZmlsZS5iY2MKaW5kZXggYTJkYzVmYi4uOWZkODIxZCAxMDA2NDQKLS0tIGEvYXV0by9saWIvcGNyZS9tYWtlZmlsZS5iY2MKKysrIGIvYXV0by9saWIvcGNyZS9tYWtlZmlsZS5iY2MKQEAgLTIsNyArMiw3IEBACiAjIENvcHlyaWdodCAoQykgSWdvciBTeXNvZXYKIAogCi1DRkxBR1MgPQktcSAtTzIgLXRXTSAkKENQVV9PUFQpCitDRkxBR1MgPQktcSAtTzIgLXRXTSAtdy04MDA0ICQoQ1BVX09QVCkKIFBDUkVGTEFHUyA9CS1EUENSRV9TVEFUSUMgLURQT1NJWF9NQUxMT0NfVEhSRVNIT0xEPTEwCiAKIApkaWZmIC0tZ2l0IGEvYXV0by9saWIvemxpYi9tYWtlZmlsZS5iY2MgYi9hdXRvL2xpYi96bGliL21ha2VmaWxlLmJjYwppbmRleCAyYzc2NDI0Li4yZTdiNzE5IDEwMDY0NAotLS0gYS9hdXRvL2xpYi96bGliL21ha2VmaWxlLmJjYworKysgYi9hdXRvL2xpYi96bGliL21ha2VmaWxlLmJjYwpAQCAtMiw3ICsyLDcgQEAKICMgQ29weXJpZ2h0IChDKSBJZ29yIFN5c29ldgogCiAKLUNGTEFHUyA9IC1xIC1PMiAtdFdNICQoQ1BVX09QVCkKK0NGTEFHUyA9IC1xIC1PMiAtdFdNIC13LTgwMDQgLXctODAxMiAkKENQVV9PUFQpCiAKIHpsaWIubGliOgogCWJjYzMyIC1jICQoQ0ZMQUdTKSBhZGxlcjMyLmMgY3JjMzIuYyBkZWZsYXRlLmMgdHJlZXMuYyB6dXRpbC5jIFwKZGlmZiAtLWdpdCBhL2F1dG8vbWFrZSBiL2F1dG8vbWFrZQppbmRleCBmN2VjYTg3Li5lNWM1ZWZiIDEwMDY0NAotLS0gYS9hdXRvL21ha2UKKysrIGIvYXV0by9tYWtlCkBAIC0zMjAsNiArMzIwLDE5IEBACiBmaQogCiAKKyMgdGhlIGFkZG9ucyBjb25maWcubWFrZQorCitpZiB0ZXN0IC1uICIkTkdYX0FERE9OUyI7IHRoZW4KKworICAgIGZvciBuZ3hfYWRkb25fZGlyIGluICROR1hfQURET05TCisgICAgZG8KKyAgICAgICAgaWYgdGVzdCAtZiAkbmd4X2FkZG9uX2Rpci9jb25maWcubWFrZTsgdGhlbgorICAgICAgICAgICAgLiAkbmd4X2FkZG9uX2Rpci9jb25maWcubWFrZQorICAgICAgICBmaQorICAgIGRvbmUKK2ZpCisKKwogIyBXaW4zMiByZXNvdXJjZSBmaWxlCiAKIGlmIHRlc3QgLW4gIiROR1hfUkVTIjsgdGhlbgpkaWZmIC0tZ2l0IGEvYXV0by9vcy9jb25mIGIvYXV0by9vcy9jb25mCmluZGV4IDBkZGJhY2IuLjE2YTM3MTggMTAwNjQ0Ci0tLSBhL2F1dG8vb3MvY29uZgorKysgYi9hdXRvL29zL2NvbmYKQEAgLTY0LDcgKzY0LDcgQEAKICAgICAgICAgTkdYX01BQ0hfQ0FDSEVfTElORT0zMgogICAgIDs7CiAKLSAgICBhbWQ2NCkKKyAgICBhbWQ2NCB8IHg4Nl82NCkKICAgICAgICAgaGF2ZT1OR1hfSEFWRV9OT05BTElHTkVEIC4gYXV0by9oYXZlCiAgICAgICAgIE5HWF9NQUNIX0NBQ0hFX0xJTkU9NjQKICAgICA7OwpkaWZmIC0tZ2l0IGEvYXV0by9zb3VyY2VzIGIvYXV0by9zb3VyY2VzCmluZGV4IDVlYWNjMWEuLmI1OTgwODMgMTAwNjQ0Ci0tLSBhL2F1dG8vc291cmNlcworKysgYi9hdXRvL3NvdXJjZXMKQEAgLTI2Niw3ICsyNjYsNiBAQAogCiBIVFRQX1NSQ1M9InNyYy9odHRwL25neF9odHRwLmMgXAogICAgICAgICAgICBzcmMvaHR0cC9uZ3hfaHR0cF9jb3JlX21vZHVsZS5jIFwKLSAgICAgICAgICAgc3JjL2h0dHAvbmd4X2h0dHBfY29uZmlnLmMgXAogICAgICAgICAgICBzcmMvaHR0cC9uZ3hfaHR0cF9zcGVjaWFsX3Jlc3BvbnNlLmMgXAogICAgICAgICAgICBzcmMvaHR0cC9uZ3hfaHR0cF9yZXF1ZXN0LmMgXAogICAgICAgICAgICBzcmMvaHR0cC9uZ3hfaHR0cF9wYXJzZS5jIFwKZGlmZiAtLWdpdCBhL2NvbmYvbmdpbnguY29uZiBiL2NvbmYvbmdpbnguY29uZgppbmRleCA0ZTM3MDhiLi43Yjk2N2Q2IDEwMDY0NAotLS0gYS9jb25mL25naW54LmNvbmYKKysrIGIvY29uZi9uZ2lueC5jb25mCkBAIC0xOCw3ICsxOCw3IEBACiAgICAgaW5jbHVkZSAgICAgICBjb25mL21pbWUudHlwZXM7CiAgICAgZGVmYXVsdF90eXBlICBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW07CiAKLSAgICAjbG9nX2Zvcm1hdCAgbWFpbiAgJyRyZW1vdGVfYWRkciAtICRyZW1vdGVfdXNlciBbJHRpbWVfZ210XSAkc3RhdHVzICcKKyAgICAjbG9nX2Zvcm1hdCAgbWFpbiAgJyRyZW1vdGVfYWRkciAtICRyZW1vdGVfdXNlciBbJHRpbWVfbG9jYWxdICRzdGF0dXMgJwogICAgICMgICAgICAgICAgICAgICAgICAnIiRyZXF1ZXN0IiAkYm9keV9ieXRlc19zZW50ICIkaHR0cF9yZWZlcmVyIiAnCiAgICAgIyAgICAgICAgICAgICAgICAgICciJGh0dHBfdXNlcl9hZ2VudCIgImh0dHBfeF9mb3J3YXJkZWRfZm9yIic7CiAKZGlmZiAtLWdpdCBhL2RvY3MveG1sL25naW54L2NoYW5nZXMueG1sIGIvZG9jcy94bWwvbmdpbngvY2hhbmdlcy54bWwKaW5kZXggMzMxNzMzNS4uYjI1YmRhOSAxMDA2NDQKLS0tIGEvZG9jcy94bWwvbmdpbngvY2hhbmdlcy54bWwKKysrIGIvZG9jcy94bWwvbmdpbngvY2hhbmdlcy54bWwKQEAgLTksNiArOSwxMDEgQEAKIDx0aXRsZSBsYW5nPSJlbiI+bmdpbnggY2hhbmdlbG9nPC90aXRsZT4KIAogCis8Y2hhbmdlcyB2ZXI9IjAuMy4xOCIgZGF0ZT0iMjYuMTIuMjAwNSI+CisKKzxjaGFuZ2UgdHlwZT0iZmVhdHVyZSI+Cis8cGFyYSBsYW5nPSJydSI+CivEydLFy9TJ18Egc2VydmVyX25hbWVzINDPxMTF0tbJ18HF1CDJzcXOwSDXycTBICIuZG9tYWluLnRsZCIuCis8L3BhcmE+Cis8cGFyYSBsYW5nPSJlbiI+Cit0aGUgInNlcnZlcl9uYW1lcyIgZGlyZWN0aXZlIHN1cHBvcnRzIHRoZSAiLmRvbWFpbi50bGQiIG5hbWVzLgorPC9wYXJhPgorPC9jaGFuZ2U+CisKKzxjaGFuZ2UgdHlwZT0iZmVhdHVyZSI+Cis8cGFyYSBsYW5nPSJydSI+CivEydLFy9TJ18Egc2VydmVyX25hbWVzIMnT0M/M2NrVxdQgyNzbIMTM0SDJzaPOINfJxMEgIiouZG9tYWluLnRsZCIKK8kgws/MxcUg3MbGxcvUydfO2cogyNzbIMTM0SDPwtneztnIIMnNo84uCis8L3BhcmE+Cis8cGFyYSBsYW5nPSJlbiI+Cit0aGUgInNlcnZlcl9uYW1lcyIgZGlyZWN0aXZlIHVzZXMgdGhlIGhhc2ggZm9yIHRoZSAiKi5kb21haW4udGxkIiBuYW1lcworYW5kIG1vcmUgZWZmZWN0aXZlIGhhc2ggZm9yIHVzdWFsIG5hbWVzLgorPC9wYXJhPgorPC9jaGFuZ2U+CisKKzxjaGFuZ2UgdHlwZT0iY2hhbmdlIj4KKzxwYXJhIGxhbmc9InJ1Ij4KK8TJ0sXL1MnX2SBzZXJ2ZXJfbmFtZXNfaGFzaF9tYXhfc2l6ZSDJIHNlcnZlcl9uYW1lc19oYXNoX2J1Y2tldF9zaXplLgorPC9wYXJhPgorPHBhcmEgbGFuZz0iZW4iPgordGhlICJzZXJ2ZXJfbmFtZXNfaGFzaF9tYXhfc2l6ZSIgYW5kICJzZXJ2ZXJfbmFtZXNfaGFzaF9idWNrZXRfc2l6ZSIgZGlyZWN0aXZlcy4KKzwvcGFyYT4KKzwvY2hhbmdlPgorCis8Y2hhbmdlIHR5cGU9ImNoYW5nZSI+Cis8cGFyYSBsYW5nPSJydSI+CivEydLFy9TJ19kgc2VydmVyX25hbWVzX2hhc2ggySBzZXJ2ZXJfbmFtZXNfaGFzaF90aHJlc2hvbGQg1dDSwdrEzsXO2S4KKzwvcGFyYT4KKzxwYXJhIGxhbmc9ImVuIj4KK3RoZSAic2VydmVyX25hbWVzX2hhc2giIGFuZCAic2VydmVyX25hbWVzX2hhc2hfdGhyZXNob2xkIiBkaXJlY3RpdmVzCit3ZXJlIGNhbmNlbGVkLgorPC9wYXJhPgorPC9jaGFuZ2U+CisKKzxjaGFuZ2UgdHlwZT0iZmVhdHVyZSI+Cis8cGFyYSBsYW5nPSJydSI+CivEydLFy9TJ18EgdmFsaWRfcmVmZXJlcnMgydPQz8zY2tXF1CDI3NsgxMzRIMnNo84g08HK1M/XLgorPC9wYXJhPgorPHBhcmEgbGFuZz0iZW4iPgordGhlICJ2YWxpZF9yZWZlcmVycyIgZGlyZWN0aXZlIHVzZXMgdGhlIGhhc2ggc2l0ZSBuYW1lcy4KKzwvcGFyYT4KKzwvY2hhbmdlPgorCis8Y2hhbmdlIHR5cGU9ImNoYW5nZSI+Cis8cGFyYSBsYW5nPSJydSI+CivUxdDF0tggxMnSxcvUydfBIHZhbGlkX3JlZmVyZXJzINDSz9fF0tHF1CDUz8zYy88gyc3FzsEg08HK1M/XIMLF2iDV3qPUwSBVUkkuCis8L3BhcmE+Cis8cGFyYSBsYW5nPSJlbiI+Citub3cgdGhlICJ2YWxpZF9yZWZlcmVycyIgZGlyZWN0aXZlIGNoZWNrcyB0aGUgc2l0ZSBuYW1lcyBvbmx5IHdpdGhvdXQKK3RoZSBVUkkgcGFydC4KKzwvcGFyYT4KKzwvY2hhbmdlPgorCis8Y2hhbmdlIHR5cGU9ImJ1Z2ZpeCI+Cis8cGFyYSBsYW5nPSJydSI+CivOxcvP1M/S2cUgyc3FzsEg18nEwSAiLmRvbWFpbi50bGQiIM7F18XSzs8gz8LSwcLB1NnXwczJ09ggzc/E1czFzQorbmd4X2h0dHBfbWFwX21vZHVsZS4KKzwvcGFyYT4KKzxwYXJhIGxhbmc9ImVuIj4KK3NvbWUgIi5kb21haW4udGxkIiBuYW1lcyBpbmNvcnJlY3RseSBwcm9jZXNzZWQgYnkgdGhlIG5neF9odHRwX21hcF9tb2R1bGUuCis8L3BhcmE+Cis8L2NoYW5nZT4KKworPGNoYW5nZSB0eXBlPSJidWdmaXgiPgorPHBhcmEgbGFuZz0icnUiPgorxdPMySDLz87GycfV0sHDyc/Ozs/HzyDGwcrMwSDOxSDC2czPLCDUzyDQ0s/J08jPxMnMIHNlZ21lbnRhdGlvbiBmYXVsdDsKK8/bycLLwSDQz9HXyczB09gg1yAwLjMuMTIuCis8L3BhcmE+Cis8cGFyYSBsYW5nPSJlbiI+CitzZWdtZW50YXRpb24gZmF1bHQgd2FzIG9jY3VycmVkIGlmIGNvbmZpZ3VyYXRpb24gZmlsZSBkaWQgbm90IGV4aXN0OworYnVnIGFwcGVhcmVkIGluIDAuMy4xMi4KKzwvcGFyYT4KKzwvY2hhbmdlPgorCis8Y2hhbmdlIHR5cGU9ImJ1Z2ZpeCI+Cis8cGFyYSBsYW5nPSJydSI+CivOwSA2NC3CydTO2cgg0MzB1MbP0s3ByCDQ0skg09TB0tTFIM3PxyDQ0s/J2s/K1Mkgc2VnbWVudGF0aW9uIGZhdWx0Oworz9vJwsvBINDP0dfJzMHT2CDXIDAuMy4xNi4KKzwvcGFyYT4KKzxwYXJhIGxhbmc9ImVuIj4KK29uIDY0LWJpdCBwbGF0Zm9ybXMgc2VnbWVudGF0aW9uIGZhdWx0IG1heSBvY2N1cnJlZCBvbiBzdGFydDsKK2J1ZyBhcHBlYXJlZCBpbiAwLjMuMTYuCis8L3BhcmE+Cis8L2NoYW5nZT4KKworPC9jaGFuZ2VzPgorCisKIDxjaGFuZ2VzIHZlcj0iMC4zLjE3IiBkYXRlPSIxOC4xMi4yMDA1Ij4KIAogPGNoYW5nZSB0eXBlPSJjaGFuZ2UiPgpAQCAtMzEsMTAgKzEyNiwxMiBAQAogCiA8Y2hhbmdlIHR5cGU9ImJ1Z2ZpeCI+CiA8cGFyYSBsYW5nPSJydSI+Ci3XzyDX0sXN0SBTU0wgaGFuZHNoYWtlIM7FIMlj0M/M2NrP18HMydPYINTBys3B1dTZLgor188g19LFzdEgU1NMIGhhbmRzaGFrZSDOxSDJY9DPzNjaz9fBzMnT2CDUwcrNwdXU2TsKK8/bycLLwSDQz9HXyczB09gg1yAwLjIuNC4KIDwvcGFyYT4KIDxwYXJhIGxhbmc9ImVuIj4KLXRoZSB0aW1lb3V0cyB3ZXJlIG5vdCB1c2VkIGluIFNTTCBoYW5kc2hha2UuCit0aGUgdGltZW91dHMgd2VyZSBub3QgdXNlZCBpbiBTU0wgaGFuZHNoYWtlOworYnVnIGFwcGVhcmVkIGluIDAuMi40LgogPC9wYXJhPgogPC9jaGFuZ2U+CiAKQEAgLTE5NzgsNyArMjA3NSw3IEBACiDEydLFy9TJ18EgcG9zdF9hY2NlcHRfdGltZW91dCDV0NLB2sTOxc7BLgogPC9wYXJhPgogPHBhcmEgbGFuZz0iZW4iPgotVGhlICJwb3N0X2FjY2VwdF90aW1lb3V0IiBkaXJlY3RpdmUgd2FzIGNhbmNlbGVkLgordGhlICJwb3N0X2FjY2VwdF90aW1lb3V0IiBkaXJlY3RpdmUgd2FzIGNhbmNlbGVkLgogPC9wYXJhPgogPC9jaGFuZ2U+CiAKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL25naW54LmggYi9zcmMvY29yZS9uZ2lueC5oCmluZGV4IGM2YzU2MmYuLjUxMWE3YzkgMTAwNjQ0Ci0tLSBhL3NyYy9jb3JlL25naW54LmgKKysrIGIvc3JjL2NvcmUvbmdpbnguaApAQCAtOCw3ICs4LDcgQEAKICNkZWZpbmUgX05HSU5YX0hfSU5DTFVERURfCiAKIAotI2RlZmluZSBOR0lOWF9WRVIgICAgICAgICAgIm5naW54LzAuMy4xNyIKKyNkZWZpbmUgTkdJTlhfVkVSICAgICAgICAgICJuZ2lueC8wLjMuMTgiCiAKICNkZWZpbmUgTkdJTlhfVkFSICAgICAgICAgICJOR0lOWCIKICNkZWZpbmUgTkdYX09MRFBJRF9FWFQgICAgICIub2xkYmluIgpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbmd4X2NvbmZfZmlsZS5jIGIvc3JjL2NvcmUvbmd4X2NvbmZfZmlsZS5jCmluZGV4IDM3N2NhZDUuLjU4OWViMGUgMTAwNjQ0Ci0tLSBhL3NyYy9jb3JlL25neF9jb25mX2ZpbGUuYworKysgYi9zcmMvY29yZS9uZ3hfY29uZl9maWxlLmMKQEAgLTc4LDcgKzc4LDggQEAKICAgICAgICAgZmQgPSBuZ3hfb3Blbl9maWxlKGZpbGVuYW1lLT5kYXRhLCBOR1hfRklMRV9SRE9OTFksIE5HWF9GSUxFX09QRU4pOwogICAgICAgICBpZiAoZmQgPT0gTkdYX0lOVkFMSURfRklMRSkgewogICAgICAgICAgICAgbmd4X2NvbmZfbG9nX2Vycm9yKE5HWF9MT0dfRU1FUkcsIGNmLCBuZ3hfZXJybm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfb3Blbl9maWxlX24gIiBcIiVzXCIgZmFpbGVkIiwgZmlsZW5hbWUtPmRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9vcGVuX2ZpbGVfbiAiIFwiJXNcIiBmYWlsZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lLT5kYXRhKTsKICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICAgICAgfQogCkBAIC04MTEsNiArODEyLDExIEBACiAgICAgICAgICpidWYgPSAnXDAnOwogICAgIH0KIAorICAgIGlmIChjZi0+Y29uZl9maWxlID09IE5VTEwpIHsKKyAgICAgICAgbmd4X2xvZ19lcnJvcihsZXZlbCwgY2YtPmxvZywgMCwgIiVzIiwgZXJyc3RyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwogICAgIG5neF9sb2dfZXJyb3IobGV2ZWwsIGNmLT5sb2csIDAsICIlcyBpbiAlczoldWkiLAogICAgICAgICAgICAgICAgICAgZXJyc3RyLCBjZi0+Y29uZl9maWxlLT5maWxlLm5hbWUuZGF0YSwgY2YtPmNvbmZfZmlsZS0+bGluZSk7CiB9CmRpZmYgLS1naXQgYS9zcmMvY29yZS9uZ3hfY29uZl9maWxlLmggYi9zcmMvY29yZS9uZ3hfY29uZl9maWxlLmgKaW5kZXggZTE4NTlmOC4uNjJmMzY1NSAxMDA2NDQKLS0tIGEvc3JjL2NvcmUvbmd4X2NvbmZfZmlsZS5oCisrKyBiL3NyYy9jb3JlL25neF9jb25mX2ZpbGUuaApAQCAtMTY3LDYgKzE2Nyw3IEBACiAKICAgICBuZ3hfY3ljbGVfdCAgICAgICAgICAqY3ljbGU7CiAgICAgbmd4X3Bvb2xfdCAgICAgICAgICAgKnBvb2w7CisgICAgbmd4X3Bvb2xfdCAgICAgICAgICAgKnRlbXBfcG9vbDsKICAgICBuZ3hfY29uZl9maWxlX3QgICAgICAqY29uZl9maWxlOwogICAgIG5neF9sb2dfdCAgICAgICAgICAgICpsb2c7CiAKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL25neF9jb25uZWN0aW9uLmMgYi9zcmMvY29yZS9uZ3hfY29ubmVjdGlvbi5jCmluZGV4IDA4MjBmZWQuLjkzYjQzYzQgMTAwNjQ0Ci0tLSBhL3NyYy9jb3JlL25neF9jb25uZWN0aW9uLmMKKysrIGIvc3JjL2NvcmUvbmd4X2Nvbm5lY3Rpb24uYwpAQCAtMjk1LDYgKzI5NSw5IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBuZ3hfbG9nX2RlYnVnMihOR1hfTE9HX0RFQlVHX0NPUkUsIGN5Y2xlLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmluZCgpICVWICMlZCAiLCAmbHNbaV0uYWRkcl90ZXh0LCBzKTsKKwogICAgICAgICAgICAgaWYgKGJpbmQocywgbHNbaV0uc29ja2FkZHIsIGxzW2ldLnNvY2tsZW4pID09IC0xKSB7CiAgICAgICAgICAgICAgICAgZXJyID0gbmd4X3NvY2tldF9lcnJubzsKIApkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbmd4X2N5Y2xlLmMgYi9zcmMvY29yZS9uZ3hfY3ljbGUuYwppbmRleCBkYTQzMDM2Li5lMTNiY2Q4IDEwMDY0NAotLS0gYS9zcmMvY29yZS9uZ3hfY3ljbGUuYworKysgYi9zcmMvY29yZS9uZ3hfY3ljbGUuYwpAQCAtMTYyLDYgKzE2MiwxMiBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKKyAgICBjb25mLnRlbXBfcG9vbCA9IG5neF9jcmVhdGVfcG9vbChOR1hfQ1lDTEVfUE9PTF9TSVpFLCBsb2cpOworICAgIGlmIChjb25mLnRlbXBfcG9vbCA9PSBOVUxMKSB7CisgICAgICAgIG5neF9kZXN0cm95X3Bvb2wocG9vbCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKwogICAgIGNvbmYuY3R4ID0gY3ljbGUtPmNvbmZfY3R4OwogICAgIGNvbmYuY3ljbGUgPSBjeWNsZTsKICAgICBjb25mLnBvb2wgPSBwb29sOwpAQCAtMTc0LDYgKzE4MCw3IEBACiAjZW5kaWYKIAogICAgIGlmIChuZ3hfY29uZl9wYXJzZSgmY29uZiwgJmN5Y2xlLT5jb25mX2ZpbGUpICE9IE5HWF9DT05GX09LKSB7CisgICAgICAgIG5neF9kZXN0cm95X3Bvb2woY29uZi50ZW1wX3Bvb2wpOwogICAgICAgICBuZ3hfZGVzdHJveV9wb29sKHBvb2wpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CkBAIC0xOTQsOCArMjAxLDkgQEAKIAogICAgICAgICBpZiAobW9kdWxlLT5pbml0X2NvbmYpIHsKICAgICAgICAgICAgIGlmIChtb2R1bGUtPmluaXRfY29uZihjeWNsZSwgY3ljbGUtPmNvbmZfY3R4W25neF9tb2R1bGVzW2ldLT5pbmRleF0pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IE5HWF9DT05GX0VSUk9SKQorICAgICAgICAgICAgICAgID09IE5HWF9DT05GX0VSUk9SKQogICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5neF9kZXN0cm95X3Bvb2woY29uZi50ZW1wX3Bvb2wpOwogICAgICAgICAgICAgICAgIG5neF9kZXN0cm95X3Bvb2wocG9vbCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICB9CkBAIC00MjEsNiArNDI5LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChuZ3hfdGVzdF9jb25maWcpIHsKKyAgICAgICAgICAgIG5neF9kZXN0cm95X3Bvb2woY29uZi50ZW1wX3Bvb2wpOwogICAgICAgICAgICAgbmd4X2Rlc3Ryb3lfcG9vbChwb29sKTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CkBAIC00MzgsNiArNDQ3LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCisgICAgICAgIG5neF9kZXN0cm95X3Bvb2woY29uZi50ZW1wX3Bvb2wpOwogICAgICAgICBuZ3hfZGVzdHJveV9wb29sKHBvb2wpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CkBAIC01MjEsNiArNTMxLDggQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIG5neF9kZXN0cm95X3Bvb2woY29uZi50ZW1wX3Bvb2wpOworCiAgICAgaWYgKG9sZF9jeWNsZS0+Y29ubmVjdGlvbnMgPT0gTlVMTCkgewogICAgICAgICAvKiBhbiBvbGQgY3ljbGUgaXMgYW4gaW5pdCBjeWNsZSAqLwogICAgICAgICBuZ3hfZGVzdHJveV9wb29sKG9sZF9jeWNsZS0+cG9vbCk7CmRpZmYgLS1naXQgYS9zcmMvY29yZS9uZ3hfaGFzaC5jIGIvc3JjL2NvcmUvbmd4X2hhc2guYwppbmRleCBkYWIxOTM1Li5mNDNkNjc1IDEwMDY0NAotLS0gYS9zcmMvY29yZS9uZ3hfaGFzaC5jCisrKyBiL3NyYy9jb3JlL25neF9oYXNoLmMKQEAgLTE1OCw3ICsxNTgsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgdGVzdCA9IG5neF9hbGxvYyhoaW5pdC0+bWF4X3NpemUgKiBzaXplb2Yobmd4X3VpbnRfdCksIGhpbml0LT5wb29sLT5sb2cpOworICAgIHRlc3QgPSBuZ3hfYWxsb2MoaGluaXQtPm1heF9zaXplICogc2l6ZW9mKHNpemVfdCksIGhpbml0LT5wb29sLT5sb2cpOwogICAgIGlmICh0ZXN0ID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICB9CkBAIC0xNzAsNyArMTcwLDcgQEAKIAogICAgIGZvciAoc2l6ZSA9IHN0YXJ0OyBzaXplIDwgaGluaXQtPm1heF9zaXplOyBzaXplKyspIHsKIAotICAgICAgICBuZ3hfbWVtemVybyh0ZXN0LCBzaXplICogc2l6ZW9mKG5neF91aW50X3QpKTsKKyAgICAgICAgbmd4X21lbXplcm8odGVzdCwgc2l6ZSAqIHNpemVvZihzaXplX3QpKTsKIAogICAgICAgICBmb3IgKG4gPSAwOyBuIDwgbmVsdHM7IG4rKykgewogICAgICAgICAgICAgaWYgKG5hbWVzW25dLmtleS5kYXRhID09IE5VTEwpIHsKQEAgLTM0Nyw3ICszNDcsNyBAQAogbmd4X2hhc2hfd2lsZGNhcmRfaW5pdChuZ3hfaGFzaF9pbml0X3QgKmhpbml0LCBuZ3hfaGFzaF9rZXlfdCAqbmFtZXMsCiAgICAgbmd4X3VpbnRfdCBuZWx0cykKIHsKLSAgICBzaXplX3QgICAgICAgICAgICAgICAgbGVuOworICAgIHNpemVfdCAgICAgICAgICAgICAgICBsZW4sIGRvdF9sZW47CiAgICAgbmd4X3VpbnRfdCAgICAgICAgICAgIGksIG4sIGRvdDsKICAgICBuZ3hfYXJyYXlfdCAgICAgICAgICAgY3Vycl9uYW1lcywgbmV4dF9uYW1lczsKICAgICBuZ3hfaGFzaF9rZXlfdCAgICAgICAqbmFtZSwgKm5leHRfbmFtZTsKQEAgLTM5Niw5ICszOTYsMTEgQEAKIAogI2lmIDAKICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0FMRVJULCBoaW5pdC0+cG9vbC0+bG9nLCAwLAotICAgICAgICAgICAgICAgICAgICAgICJ3YzE6IFwiJVZcIiIsICZuYW1lLT5rZXkpOworICAgICAgICAgICAgICAgICAgICAgICJ3YzE6IFwiJVZcIiAldWkiLCAmbmFtZS0+a2V5LCBkb3QpOwogI2VuZGlmCiAKKyAgICAgICAgZG90X2xlbiA9IGxlbiArIDE7CisKICAgICAgICAgaWYgKGRvdCkgewogICAgICAgICAgICAgbGVuKys7CiAgICAgICAgIH0KQEAgLTQyNywxMyArNDI5LDIwIEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGlmICghZG90CisgICAgICAgICAgICAgICAgJiYgbmFtZXNbaV0ua2V5LmxlbiA+IGxlbgorICAgICAgICAgICAgICAgICYmIG5hbWVzW2ldLmtleS5kYXRhW2xlbl0gIT0gJy4nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBuZXh0X25hbWUgPSBuZ3hfYXJyYXlfcHVzaCgmbmV4dF9uYW1lcyk7CiAgICAgICAgICAgICBpZiAobmV4dF9uYW1lID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBuZXh0X25hbWUtPmtleS5sZW4gPSBuYW1lc1tpXS5rZXkubGVuIC0gbGVuOwotICAgICAgICAgICAgbmV4dF9uYW1lLT5rZXkuZGF0YSA9IG5hbWVzW2ldLmtleS5kYXRhICsgbGVuOworICAgICAgICAgICAgbmV4dF9uYW1lLT5rZXkubGVuID0gbmFtZXNbaV0ua2V5LmxlbiAtIGRvdF9sZW47CisgICAgICAgICAgICBuZXh0X25hbWUtPmtleS5kYXRhID0gbmFtZXNbaV0ua2V5LmRhdGEgKyBkb3RfbGVuOwogICAgICAgICAgICAgbmV4dF9uYW1lLT5rZXlfaGFzaD0gMDsKICAgICAgICAgICAgIG5leHRfbmFtZS0+dmFsdWUgPSBuYW1lc1tpXS52YWx1ZTsKIApAQCAtNDQ0LDYgKzQ1Myw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAobmV4dF9uYW1lcy5uZWx0cykgeworCiAgICAgICAgICAgICBoID0gKmhpbml0OwogICAgICAgICAgICAgaC5oYXNoID0gTlVMTDsKIApAQCAtNDU5LDggKzQ2OSw4IEBACiAgICAgICAgICAgICBpZiAobmFtZXNbbl0ua2V5LmxlbiA9PSBsZW4pIHsKICAgICAgICAgICAgICAgICB3ZGMtPnZhbHVlID0gbmFtZXNbbl0udmFsdWU7CiAjaWYgMAotICAgICAgICAgICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfQUxFUlQsIGhpbml0LT5wb29sLT5sb2csIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndkYzogXCIlVlwiIiwgd2RjLT52YWx1ZSk7CisgICAgICAgICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0FMRVJULCBoaW5pdC0+cG9vbC0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndkYzogXCIlVlwiIiwgd2RjLT52YWx1ZSk7CiAjZW5kaWYKICAgICAgICAgICAgIH0KIApAQCAtNjgxLDMgKzY5MSwyNDkgQEAKIAogICAgIHJldHVybiBOR1hfT0s7CiB9CisKKworbmd4X2ludF90CituZ3hfaGFzaF9rZXlzX2FycmF5X2luaXQobmd4X2hhc2hfa2V5c19hcnJheXNfdCAqaGEsIG5neF91aW50X3QgdHlwZSkKK3sKKyAgICBuZ3hfdWludF90ICBhc2l6ZTsKKworICAgIGlmICh0eXBlID09IE5HWF9IQVNIX1NNQUxMKSB7CisgICAgICAgIGFzaXplID0gNDsKKyAgICAgICAgaGEtPmhzaXplID0gMTA3OworCisgICAgfSBlbHNlIHsKKyAgICAgICAgYXNpemUgPSBOR1hfSEFTSF9MQVJHRV9BU0laRTsKKyAgICAgICAgaGEtPmhzaXplID0gTkdYX0hBU0hfTEFSR0VfSFNJWkU7CisgICAgfQorCisgICAgaWYgKG5neF9hcnJheV9pbml0KCZoYS0+a2V5cywgaGEtPnRlbXBfcG9vbCwgYXNpemUsIHNpemVvZihuZ3hfaGFzaF9rZXlfdCkpCisgICAgICAgICE9IE5HWF9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgfQorCisgICAgaWYgKG5neF9hcnJheV9pbml0KCZoYS0+ZG5zX3dpbGRjYXJkcywgaGEtPnRlbXBfcG9vbCwgYXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfaGFzaF9rZXlfdCkpCisgICAgICAgICE9IE5HWF9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgfQorCisgICAgaGEtPmtleXNfaGFzaCA9IG5neF9wY2FsbG9jKGhhLT50ZW1wX3Bvb2wsIHNpemVvZihuZ3hfYXJyYXlfdCkgKiBoYS0+aHNpemUpOworICAgIGlmIChoYS0+a2V5c19oYXNoID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICB9CisKKyAgICBoYS0+ZG5zX3dpbGRjYXJkc19oYXNoID0gbmd4X3BjYWxsb2MoaGEtPnRlbXBfcG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5neF9hcnJheV90KSAqIGhhLT5oc2l6ZSk7CisgICAgaWYgKGhhLT5kbnNfd2lsZGNhcmRzX2hhc2ggPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBOR1hfT0s7Cit9CisKKworbmd4X2ludF90CituZ3hfaGFzaF9hZGRfa2V5KG5neF9oYXNoX2tleXNfYXJyYXlzX3QgKmhhLCBuZ3hfc3RyX3QgKmtleSwgdm9pZCAqdmFsdWUsCisgICAgbmd4X3VpbnRfdCBmbGFncykKK3sKKyAgICBzaXplX3QgICAgICAgICAgIGxlbjsKKyAgICBuZ3hfc3RyX3QgICAgICAgKm5hbWU7CisgICAgbmd4X3VpbnRfdCAgICAgICBpLCBrLCBuLCBza2lwOworICAgIG5neF9oYXNoX2tleV90ICAqaGs7CisgICAgdV9jaGFyICAgICAgICAgICBidWZbMjA0OF07CisKKyAgICBpZiAoIShmbGFncyAmIE5HWF9IQVNIX1dJTERDQVJEX0tFWSkpIHsKKworICAgICAgICAvKiBleGFjdCBoYXNoICovCisKKyAgICAgICAgayA9IDA7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGtleS0+bGVuOyBpKyspIHsKKyAgICAgICAgICAgIGtleS0+ZGF0YVtpXSA9IG5neF90b2xvd2VyKGtleS0+ZGF0YVtpXSk7CisgICAgICAgICAgICBrID0gbmd4X2hhc2goaywga2V5LT5kYXRhW2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIGsgJT0gaGEtPmhzaXplOworCisgICAgICAgIC8qIGNoZWNrIGNvbmZsaWN0cyBpbiBleGFjdCBoYXNoICovCisKKyAgICAgICAgbmFtZSA9IGhhLT5rZXlzX2hhc2hba10uZWx0czsKKworICAgICAgICBpZiAobmFtZSkgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGhhLT5rZXlzX2hhc2hba10ubmVsdHM7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChrZXktPmxlbiAhPSBuYW1lW2ldLmxlbikgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobmd4X3N0cm5jbXAoa2V5LT5kYXRhLCBuYW1lW2ldLmRhdGEsIGtleS0+bGVuKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfQlVTWTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChuZ3hfYXJyYXlfaW5pdCgmaGEtPmtleXNfaGFzaFtrXSwgaGEtPnRlbXBfcG9vbCwgNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yobmd4X3N0cl90KSkKKyAgICAgICAgICAgICAgICAhPSBOR1hfT0spCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG5hbWUgPSBuZ3hfYXJyYXlfcHVzaCgmaGEtPmtleXNfaGFzaFtrXSk7CisgICAgICAgIGlmIChuYW1lID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICAqbmFtZSA9ICprZXk7CisKKyAgICAgICAgaGsgPSBuZ3hfYXJyYXlfcHVzaCgmaGEtPmtleXMpOworICAgICAgICBpZiAoaGsgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGhrLT5rZXkgPSAqa2V5OworICAgICAgICBoay0+a2V5X2hhc2ggPSBuZ3hfaGFzaF9rZXkoa2V5LT5kYXRhLCBrZXktPmxlbik7CisgICAgICAgIGhrLT52YWx1ZSA9IHZhbHVlOworCisgICAgfSBlbHNlIHsKKworICAgICAgICAvKiB3aWxkY2FyZCBoYXNoICovCisKKyAgICAgICAgc2tpcCA9IChrZXktPmRhdGFbMF0gPT0gJyonKSA/IDIgOiAxOworICAgICAgICBrID0gMDsKKworICAgICAgICBmb3IgKGkgPSBza2lwOyBpIDwga2V5LT5sZW47IGkrKykgeworICAgICAgICAgICAga2V5LT5kYXRhW2ldID0gbmd4X3RvbG93ZXIoa2V5LT5kYXRhW2ldKTsKKyAgICAgICAgICAgIGsgPSBuZ3hfaGFzaChrLCBrZXktPmRhdGFbaV0pOworICAgICAgICB9CisKKyAgICAgICAgayAlPSBoYS0+aHNpemU7CisKKyAgICAgICAgaWYgKHNraXAgPT0gMSkgeworCisgICAgICAgICAgICAvKiBjaGVjayBjb25mbGljdHMgaW4gZXhhY3QgaGFzaCBmb3IgIi5leGFtcGxlLmNvbSIgKi8KKworICAgICAgICAgICAgbmFtZSA9IGhhLT5rZXlzX2hhc2hba10uZWx0czsKKworICAgICAgICAgICAgaWYgKG5hbWUpIHsKKyAgICAgICAgICAgICAgICBsZW4gPSBrZXktPmxlbiAtIHNraXA7CisKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaGEtPmtleXNfaGFzaFtrXS5uZWx0czsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChsZW4gIT0gbmFtZVtpXS5sZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5neF9zdHJuY21wKCZrZXktPmRhdGFbMV0sIG5hbWVbaV0uZGF0YSwgbGVuKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0JVU1k7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKG5neF9hcnJheV9pbml0KCZoYS0+a2V5c19oYXNoW2tdLCBoYS0+dGVtcF9wb29sLCA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yobmd4X3N0cl90KSkKKyAgICAgICAgICAgICAgICAgICAgIT0gTkdYX09LKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG5hbWUgPSBuZ3hfYXJyYXlfcHVzaCgmaGEtPmtleXNfaGFzaFtrXSk7CisgICAgICAgICAgICBpZiAobmFtZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbmFtZS0+bGVuID0ga2V5LT5sZW4gLSAxOworICAgICAgICAgICAgbmFtZS0+ZGF0YSA9IG5neF9wYWxsb2MoaGEtPnRlbXBfcG9vbCwgbmFtZS0+bGVuKTsKKyAgICAgICAgICAgIGlmIChuYW1lLT5kYXRhID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBuZ3hfbWVtY3B5KG5hbWUtPmRhdGEsICZrZXktPmRhdGFbMV0sIG5hbWUtPmxlbik7CisgICAgICAgIH0KKworCisgICAgICAgIC8qCisgICAgICAgICAqIGNvbnZlcnQgIiouZXhhbXBsZS5jb20iIHRvICJjb20uZXhhbXBsZS5cMCIKKyAgICAgICAgICogICAgICBhbmQgIi5leGFtcGxlLmNvbSIgdG8gImNvbS5leGFtcGxlXDAiCisgICAgICAgICAqLworCisgICAgICAgIGxlbiA9IDA7CisgICAgICAgIG4gPSAwOworCisgICAgICAgIGZvciAoaSA9IGtleS0+bGVuIC0gMTsgaTsgaS0tKSB7CisgICAgICAgICAgICBpZiAoa2V5LT5kYXRhW2ldID09ICcuJykgeworICAgICAgICAgICAgICAgIG5neF9tZW1jcHkoJmJ1ZltuXSwgJmtleS0+ZGF0YVtpICsgMV0sIGxlbik7CisgICAgICAgICAgICAgICAgbiArPSBsZW47CisgICAgICAgICAgICAgICAgYnVmW24rK10gPSAnLic7CisgICAgICAgICAgICAgICAgbGVuID0gMDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbGVuKys7CisgICAgICAgIH0KKworICAgICAgICBpZiAobGVuKSB7CisgICAgICAgICAgICBuZ3hfbWVtY3B5KCZidWZbbl0sICZrZXktPmRhdGFbMV0sIGxlbik7CisgICAgICAgICAgICBuICs9IGxlbjsKKyAgICAgICAgfQorCisgICAgICAgIGJ1ZltuXSA9ICdcMCc7CisKKworICAgICAgICAvKiBjaGVjayBjb25mbGljdHMgaW4gd2lsZGNhcmQgaGFzaCAqLworCisgICAgICAgIG5hbWUgPSBoYS0+ZG5zX3dpbGRjYXJkc19oYXNoW2tdLmVsdHM7CisKKyAgICAgICAgaWYgKG5hbWUpIHsKKyAgICAgICAgICAgIGxlbiA9IGtleS0+bGVuIC0gc2tpcDsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGhhLT5kbnNfd2lsZGNhcmRzX2hhc2hba10ubmVsdHM7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChsZW4gIT0gbmFtZVtpXS5sZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG5neF9zdHJuY21wKGtleS0+ZGF0YSArIHNraXAsIG5hbWVbaV0uZGF0YSwgbGVuKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfQlVTWTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChuZ3hfYXJyYXlfaW5pdCgmaGEtPmRuc193aWxkY2FyZHNfaGFzaFtrXSwgaGEtPnRlbXBfcG9vbCwgNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yobmd4X3N0cl90KSkKKyAgICAgICAgICAgICAgICAhPSBOR1hfT0spCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG5hbWUgPSBuZ3hfYXJyYXlfcHVzaCgmaGEtPmRuc193aWxkY2FyZHNfaGFzaFtrXSk7CisgICAgICAgIGlmIChuYW1lID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBuYW1lLT5sZW4gPSBrZXktPmxlbiAtIHNraXA7CisgICAgICAgIG5hbWUtPmRhdGEgPSBuZ3hfcGFsbG9jKGhhLT50ZW1wX3Bvb2wsIG5hbWUtPmxlbik7CisgICAgICAgIGlmIChuYW1lLT5kYXRhID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgbmd4X21lbWNweShuYW1lLT5kYXRhLCBrZXktPmRhdGEgKyBza2lwLCBuYW1lLT5sZW4pOworCisKKyAgICAgICAgbmd4X21lbWNweShrZXktPmRhdGEsIGJ1Ziwga2V5LT5sZW4pOworICAgICAgICBrZXktPmxlbi0tOworCisgICAgICAgIGhrID0gbmd4X2FycmF5X3B1c2goJmhhLT5kbnNfd2lsZGNhcmRzKTsKKyAgICAgICAgaWYgKGhrID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBoay0+a2V5ID0gKmtleTsKKyAgICAgICAgaGstPmtleV9oYXNoID0gMDsKKyAgICAgICAgaGstPnZhbHVlID0gdmFsdWU7CisgICAgfQorCisgICAgcmV0dXJuIE5HWF9PSzsKK30KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL25neF9oYXNoLmggYi9zcmMvY29yZS9uZ3hfaGFzaC5oCmluZGV4IDc0NDlkMDUuLjg1NWRkZTcgMTAwNjQ0Ci0tLSBhL3NyYy9jb3JlL25neF9oYXNoLmgKKysrIGIvc3JjL2NvcmUvbmd4X2hhc2guaApAQCAtNTQsNiArNTQsMjkgQEAKIH0gbmd4X2hhc2hfaW5pdF90OwogCiAKKyNkZWZpbmUgTkdYX0hBU0hfU01BTEwgICAgICAgICAgICAxCisjZGVmaW5lIE5HWF9IQVNIX0xBUkdFICAgICAgICAgICAgMgorCisjZGVmaW5lIE5HWF9IQVNIX0xBUkdFX0FTSVpFICAgICAgMTYzODQKKyNkZWZpbmUgTkdYX0hBU0hfTEFSR0VfSFNJWkUgICAgICAxMDAwNworCisjZGVmaW5lIE5HWF9IQVNIX1dJTERDQVJEX0tFWSAgICAgMQorCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBuZ3hfdWludF90ICAgICAgICBoc2l6ZTsKKworICAgIG5neF9wb29sX3QgICAgICAgKnBvb2w7CisgICAgbmd4X3Bvb2xfdCAgICAgICAqdGVtcF9wb29sOworCisgICAgbmd4X2FycmF5X3QgICAgICAga2V5czsKKyAgICBuZ3hfYXJyYXlfdCAgICAgICprZXlzX2hhc2g7CisKKyAgICBuZ3hfYXJyYXlfdCAgICAgICBkbnNfd2lsZGNhcmRzOworICAgIG5neF9hcnJheV90ICAgICAgKmRuc193aWxkY2FyZHNfaGFzaDsKK30gbmd4X2hhc2hfa2V5c19hcnJheXNfdDsKKworCiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgdm9pZCAgICAgICAgICAgICoqYnVja2V0czsKICAgICBuZ3hfdWludF90ICAgICAgICBoYXNoX3NpemU7CkBAIC04Niw2ICsxMDksMTAgQEAKIG5neF91aW50X3Qgbmd4X2hhc2hfa2V5KHVfY2hhciAqZGF0YSwgc2l6ZV90IGxlbik7CiBuZ3hfdWludF90IG5neF9oYXNoX2tleV9sYyh1X2NoYXIgKmRhdGEsIHNpemVfdCBsZW4pOwogCituZ3hfaW50X3Qgbmd4X2hhc2hfa2V5c19hcnJheV9pbml0KG5neF9oYXNoX2tleXNfYXJyYXlzX3QgKmhhLCBuZ3hfdWludF90IHR5cGUpOworbmd4X2ludF90IG5neF9oYXNoX2FkZF9rZXkobmd4X2hhc2hfa2V5c19hcnJheXNfdCAqaGEsIG5neF9zdHJfdCAqa2V5LAorICAgIHZvaWQgKnZhbHVlLCBuZ3hfdWludF90IGZsYWdzKTsKKwogCiBuZ3hfaW50X3Qgbmd4X2hhc2gwX2luaXQobmd4X2hhc2gwX3QgKmhhc2gsIG5neF9wb29sX3QgKnBvb2wsIHZvaWQgKm5hbWVzLAogICAgIG5neF91aW50X3QgbmVsdHMpOwpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9tYXBfbW9kdWxlLmMgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX21hcF9tb2R1bGUuYwppbmRleCAwNGUyZTBhLi4yY2ZiNDQzIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX21hcF9tb2R1bGUuYworKysgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX21hcF9tb2R1bGUuYwpAQCAtMTYsNyArMTYsNyBAQAogCiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgICBuZ3hfaHR0cF9oYXNoX2NvbmZfdCAgICAgICAgaGFzaDsKKyAgICBuZ3hfaGFzaF9rZXlzX2FycmF5c190ICAgICAga2V5czsKIAogICAgIG5neF9hcnJheV90ICAgICAgICAgICAgICAgICp2YWx1ZXNfaGFzaDsKIApAQCAtMjQ1LDQ0ICsyNDUsMjAgQEAKICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgIH0KIAotICAgIGlmIChuZ3hfYXJyYXlfaW5pdCgmY3R4Lmhhc2gua2V5cywgcG9vbCwgMTYzODQsIHNpemVvZihuZ3hfaGFzaF9rZXlfdCkpCi0gICAgICAgICE9IE5HWF9PSykKLSAgICB7CisgICAgY3R4LmtleXMucG9vbCA9IGNmLT5wb29sOworICAgIGN0eC5rZXlzLnRlbXBfcG9vbCA9IHBvb2w7CisKKyAgICBpZiAobmd4X2hhc2hfa2V5c19hcnJheV9pbml0KCZjdHgua2V5cywgTkdYX0hBU0hfTEFSR0UpICE9IE5HWF9PSykgewogICAgICAgICBuZ3hfZGVzdHJveV9wb29sKHBvb2wpOwogICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgfQogCi0gICAgaWYgKG5neF9hcnJheV9pbml0KCZjdHguaGFzaC5kbnNfd2lsZGNhcmRzLCBwb29sLCAxNjM4NCwKLSAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5neF9oYXNoX2tleV90KSkKLSAgICAgICAgIT0gTkdYX09LKQotICAgIHsKLSAgICAgICAgbmd4X2Rlc3Ryb3lfcG9vbChwb29sKTsKLSAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwotICAgIH0KLQotICAgIGN0eC5oYXNoLmtleXNfaGFzaCA9IG5neF9wY2FsbG9jKHBvb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yobmd4X2FycmF5X3QpICogTkdYX0hUVFBfQ09ORklHX0hBU0gpOwotICAgIGlmIChjdHguaGFzaC5rZXlzX2hhc2ggPT0gTlVMTCkgewotICAgICAgICBuZ3hfZGVzdHJveV9wb29sKHBvb2wpOwotICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7Ci0gICAgfQotCi0gICAgY3R4Lmhhc2guZG5zX2hhc2ggPSBuZ3hfcGNhbGxvYyhwb29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5neF9hcnJheV90KSAqIE5HWF9IVFRQX0NPTkZJR19IQVNIKTsKLSAgICBpZiAoY3R4Lmhhc2guZG5zX2hhc2ggPT0gTlVMTCkgewotICAgICAgICBuZ3hfZGVzdHJveV9wb29sKHBvb2wpOwotICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7Ci0gICAgfQotCi0gICAgY3R4LnZhbHVlc19oYXNoID0gbmd4X3BjYWxsb2MocG9vbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yobmd4X2FycmF5X3QpICogTkdYX0hUVFBfQ09ORklHX0hBU0gpOworICAgIGN0eC52YWx1ZXNfaGFzaCA9IG5neF9wY2FsbG9jKHBvb2wsIHNpemVvZihuZ3hfYXJyYXlfdCkgKiBjdHgua2V5cy5oc2l6ZSk7CiAgICAgaWYgKGN0eC52YWx1ZXNfaGFzaCA9PSBOVUxMKSB7CiAgICAgICAgIG5neF9kZXN0cm95X3Bvb2wocG9vbCk7CiAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICB9CiAKLSAgICBjdHguaGFzaC5wb29sID0gY2YtPnBvb2w7Ci0gICAgY3R4Lmhhc2gudGVtcF9wb29sID0gcG9vbDsKICAgICBjdHguZGVmYXVsdF92YWx1ZSA9IE5VTEw7CiAgICAgY3R4Lmhvc3RuYW1lcyA9IDA7CiAKQEAgLTI5OCw3ICsyNzQsNiBAQAogCiAgICAgaWYgKHJ2ICE9IE5HWF9DT05GX09LKSB7CiAgICAgICAgIG5neF9kZXN0cm95X3Bvb2wocG9vbCk7Ci0KICAgICAgICAgcmV0dXJuIHJ2OwogICAgIH0KIApAQCAtMzA4LDEzICsyODMsMTQgQEAKICAgICBoYXNoLm5hbWUgPSAibWFwX2hhc2giOwogICAgIGhhc2gucG9vbCA9IGNmLT5wb29sOwogCi0gICAgaWYgKGN0eC5oYXNoLmtleXMubmVsdHMpIHsKKyAgICBpZiAoY3R4LmtleXMua2V5cy5uZWx0cykgewogICAgICAgICBoYXNoLmhhc2ggPSAmbWFwLT5oYXNoOwogICAgICAgICBoYXNoLnRlbXBfcG9vbCA9IE5VTEw7CiAKLSAgICAgICAgaWYgKG5neF9oYXNoX2luaXQoJmhhc2gsIGN0eC5oYXNoLmtleXMuZWx0cywgY3R4Lmhhc2gua2V5cy5uZWx0cykKKyAgICAgICAgaWYgKG5neF9oYXNoX2luaXQoJmhhc2gsIGN0eC5rZXlzLmtleXMuZWx0cywgY3R4LmtleXMua2V5cy5uZWx0cykKICAgICAgICAgICAgICE9IE5HWF9PSykKICAgICAgICAgeworICAgICAgICAgICAgbmd4X2Rlc3Ryb3lfcG9vbChwb29sKTsKICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICAgICAgfQogICAgIH0KQEAgLTMyMiwxOSArMjk4LDIwIEBACiAgICAgbWFwLT5kZWZhdWx0X3ZhbHVlID0gY3R4LmRlZmF1bHRfdmFsdWUgPyBjdHguZGVmYXVsdF92YWx1ZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZ3hfaHR0cF92YXJpYWJsZV9udWxsX3ZhbHVlOwogCi0gICAgaWYgKGN0eC5oYXNoLmRuc193aWxkY2FyZHMubmVsdHMpIHsKKyAgICBpZiAoY3R4LmtleXMuZG5zX3dpbGRjYXJkcy5uZWx0cykgewogCi0gICAgICAgIG5neF9xc29ydChjdHguaGFzaC5kbnNfd2lsZGNhcmRzLmVsdHMsCi0gICAgICAgICAgICAgICAgICAoc2l6ZV90KSBjdHguaGFzaC5kbnNfd2lsZGNhcmRzLm5lbHRzLAorICAgICAgICBuZ3hfcXNvcnQoY3R4LmtleXMuZG5zX3dpbGRjYXJkcy5lbHRzLAorICAgICAgICAgICAgICAgICAgKHNpemVfdCkgY3R4LmtleXMuZG5zX3dpbGRjYXJkcy5uZWx0cywKICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfaGFzaF9rZXlfdCksIG5neF9odHRwX21hcF9jbXBfZG5zX3dpbGRjYXJkcyk7CiAKICAgICAgICAgaGFzaC5oYXNoID0gTlVMTDsKICAgICAgICAgaGFzaC50ZW1wX3Bvb2wgPSBwb29sOwogCi0gICAgICAgIGlmIChuZ3hfaGFzaF93aWxkY2FyZF9pbml0KCZoYXNoLCBjdHguaGFzaC5kbnNfd2lsZGNhcmRzLmVsdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5oYXNoLmRuc193aWxkY2FyZHMubmVsdHMpCisgICAgICAgIGlmIChuZ3hfaGFzaF93aWxkY2FyZF9pbml0KCZoYXNoLCBjdHgua2V5cy5kbnNfd2lsZGNhcmRzLmVsdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5rZXlzLmRuc193aWxkY2FyZHMubmVsdHMpCiAgICAgICAgICAgICAhPSBOR1hfT0spCiAgICAgICAgIHsKKyAgICAgICAgICAgIG5neF9kZXN0cm95X3Bvb2wocG9vbCk7CiAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgICAgIH0KIApAQCAtNDA4LDcgKzM4NSw3IEBACiAgICAgICAgIGtleSA9IG5neF9oYXNoKGtleSwgdmFsdWVbMV0uZGF0YVtpXSk7CiAgICAgfQogCi0gICAga2V5ICU9IE5HWF9IVFRQX0NPTkZJR19IQVNIOworICAgIGtleSAlPSBjdHgtPmtleXMuaHNpemU7CiAKICAgICB2cCA9IGN0eC0+dmFsdWVzX2hhc2hba2V5XS5lbHRzOwogCkBAIC00MzMsMTMgKzQxMCwxMyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgdmFyID0gbmd4X3BhbGxvYyhjdHgtPmhhc2gucG9vbCwgc2l6ZW9mKG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QpKTsKKyAgICB2YXIgPSBuZ3hfcGFsbG9jKGN0eC0+a2V5cy5wb29sLCBzaXplb2Yobmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCkpOwogICAgIGlmICh2YXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgfQogCiAgICAgdmFyLT5sZW4gPSB2YWx1ZVsxXS5sZW47Ci0gICAgdmFyLT5kYXRhID0gbmd4X3BzdHJkdXAoY3R4LT5oYXNoLnBvb2wsICZ2YWx1ZVsxXSk7CisgICAgdmFyLT5kYXRhID0gbmd4X3BzdHJkdXAoY3R4LT5rZXlzLnBvb2wsICZ2YWx1ZVsxXSk7CiAgICAgaWYgKHZhci0+ZGF0YSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICB9CkBAIC00OTIsMTAgKzQ2OSwxMCBAQAogICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgICAgICB9CiAKLSAgICAgICAgZmxhZ3MgPSBOR1hfSFRUUF9XSUxEQ0FSRF9IQVNIOworICAgICAgICBmbGFncyA9IE5HWF9IQVNIX1dJTERDQVJEX0tFWTsKICAgICB9CiAKLSAgICByYyA9IG5neF9odHRwX2NvbmZpZ19hZGRfaGFzaCgmY3R4LT5oYXNoLCAmdmFsdWVbMF0sIHZhciwgZmxhZ3MpOworICAgIHJjID0gbmd4X2hhc2hfYWRkX2tleSgmY3R4LT5rZXlzLCAmdmFsdWVbMF0sIHZhciwgZmxhZ3MpOwogCiAgICAgaWYgKHJjID09IE5HWF9PSykgewogICAgICAgICByZXR1cm4gTkdYX0NPTkZfT0s7CmRpZmYgLS1naXQgYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3Byb3h5X21vZHVsZS5jIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9wcm94eV9tb2R1bGUuYwppbmRleCBjMmJlMmM0Li5mNjNlMjg4IDEwMDY0NAotLS0gYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3Byb3h5X21vZHVsZS5jCisrKyBiL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfcHJveHlfbW9kdWxlLmMKQEAgLTE5MjUsOCArMTkyNSw4IEBACiAgICAgbmd4X2h0dHBfcHJveHlfbG9jX2NvbmZfdCAqcGxjZiA9IGNvbmY7CiAKICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgIGFkZDsKKyAgICB1X3Nob3J0ICAgICAgICAgICAgICAgICAgICAgIHBvcnQ7CiAgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgICp2YWx1ZSwgKnVybDsKLSAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgIHBvcnQ7CiAgICAgbmd4X2luZXRfdXBzdHJlYW1fdCAgICAgICAgICBpbmV0X3Vwc3RyZWFtOwogICAgIG5neF9odHRwX2NvcmVfbG9jX2NvbmZfdCAgICAqY2xjZjsKICNpZiAoTkdYX0hUVFBfU1NMKQpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9yZWZlcmVyX21vZHVsZS5jIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9yZWZlcmVyX21vZHVsZS5jCmluZGV4IGNkOGJlNzguLjYyMmYyNTcgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfcmVmZXJlcl9tb2R1bGUuYworKysgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3JlZmVyZXJfbW9kdWxlLmMKQEAgLTEwLDE1ICsxMCwxMyBAQAogCiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgICBuZ3hfc3RyX3QgICAgIG5hbWU7Ci0gICAgbmd4X3VpbnRfdCAgICB3aWxkY2FyZDsKLX0gbmd4X2h0dHBfcmVmZXJlcl90OworICAgIG5neF9oYXNoX3QgICAgICAgICAgICAgICBoYXNoOworICAgIG5neF9oYXNoX3dpbGRjYXJkX3QgICAgICpkbnNfd2lsZGNhcmRzOwogCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgbmd4X2FycmF5X3QgICpyZWZlcmVyczsgICAgIC8qIG5neF9odHRwX3JlZmVyZXJfdCAqLworICAgIG5neF9mbGFnX3QgICAgICAgICAgICAgICBub19yZWZlcmVyOworICAgIG5neF9mbGFnX3QgICAgICAgICAgICAgICBibG9ja2VkX3JlZmVyZXI7CiAKLSAgICBuZ3hfZmxhZ190ICAgIG5vX3JlZmVyZXI7Ci0gICAgbmd4X2ZsYWdfdCAgICBibG9ja2VkX3JlZmVyZXI7CisgICAgbmd4X2hhc2hfa2V5c19hcnJheXNfdCAgKmtleXM7CiB9IG5neF9odHRwX3JlZmVyZXJfY29uZl90OwogCiAKQEAgLTI3LDYgKzI1LDEwIEBACiAgICAgdm9pZCAqY2hpbGQpOwogc3RhdGljIGNoYXIgKm5neF9odHRwX3ZhbGlkX3JlZmVyZXJzKG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpjbWQsCiAgICAgdm9pZCAqY29uZik7CitzdGF0aWMgY2hhciAqbmd4X2h0dHBfYWRkX3JlZmVyZXIobmd4X2NvbmZfdCAqY2YsIG5neF9oYXNoX2tleXNfYXJyYXlzX3QgKmtleXMsCisgICAgbmd4X3N0cl90ICp2YWx1ZSk7CitzdGF0aWMgaW50IG5neF9saWJjX2NkZWNsIG5neF9odHRwX2NtcF9yZWZlcmVyX3dpbGRjYXJkcyhjb25zdCB2b2lkICpvbmUsCisgICAgY29uc3Qgdm9pZCAqdHdvKTsKIAogCiBzdGF0aWMgbmd4X2NvbW1hbmRfdCAgbmd4X2h0dHBfcmVmZXJlcl9jb21tYW5kc1tdID0gewpAQCAtNzcsMjEgKzc5LDIyIEBACiBuZ3hfaHR0cF9yZWZlcmVyX3ZhcmlhYmxlKG5neF9odHRwX3JlcXVlc3RfdCAqciwgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAqdiwKICAgICAgdWludHB0cl90IGRhdGEpCiB7Ci0gICAgdV9jaGFyICAgICAgICAgICAgICAgICAgKnJlZjsKLSAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgbGVuOwotICAgIG5neF91aW50X3QgICAgICAgICAgICAgICBpLCBuOwotICAgIG5neF9odHRwX3JlZmVyZXJfdCAgICAgICAqcmVmczsKLSAgICBuZ3hfaHR0cF9yZWZlcmVyX2NvbmZfdCAgKmNmOworICAgIHVfY2hhciAgICAgICAgICAgICAgICAgICAqcCwgKnJlZjsKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgIGxlbjsKKyAgICBuZ3hfaHR0cF9yZWZlcmVyX2NvbmZfdCAgKnJsY2Y7CiAKLSAgICBjZiA9IG5neF9odHRwX2dldF9tb2R1bGVfbG9jX2NvbmYociwgbmd4X2h0dHBfcmVmZXJlcl9tb2R1bGUpOworICAgIHJsY2YgPSBuZ3hfaHR0cF9nZXRfbW9kdWxlX2xvY19jb25mKHIsIG5neF9odHRwX3JlZmVyZXJfbW9kdWxlKTsKIAotICAgIGlmIChjZi0+cmVmZXJlcnMgPT0gTlVMTCkgeworICAgIGlmIChybGNmLT5oYXNoLmJ1Y2tldHMgPT0gTlVMTAorICAgICAgICAmJiBybGNmLT5kbnNfd2lsZGNhcmRzID09IE5VTEwKKyAgICAgICAgJiYgcmxjZi0+ZG5zX3dpbGRjYXJkcy0+aGFzaC5idWNrZXRzID09IE5VTEwpCisgICAgewogICAgICAgICAqdiA9IG5neF9odHRwX3ZhcmlhYmxlX251bGxfdmFsdWU7CiAgICAgICAgIHJldHVybiBOR1hfT0s7CiAgICAgfQogCiAgICAgaWYgKHItPmhlYWRlcnNfaW4ucmVmZXJlciA9PSBOVUxMKSB7Ci0gICAgICAgIGlmIChjZi0+bm9fcmVmZXJlcikgeworICAgICAgICBpZiAocmxjZi0+bm9fcmVmZXJlcikgewogICAgICAgICAgICAgKnYgPSBuZ3hfaHR0cF92YXJpYWJsZV9udWxsX3ZhbHVlOwogICAgICAgICAgICAgcmV0dXJuIE5HWF9PSzsKIApAQCAtMTA3LDcgKzExMCw3IEBACiAgICAgaWYgKGxlbiA8IHNpemVvZigiaHR0cDovL2kucnUiKSAtIDEKICAgICAgICAgfHwgKG5neF9zdHJuY2FzZWNtcChyZWYsICJodHRwOi8vIiwgNykgIT0gMCkpCiAgICAgewotICAgICAgICBpZiAoY2YtPmJsb2NrZWRfcmVmZXJlcikgeworICAgICAgICBpZiAocmxjZi0+YmxvY2tlZF9yZWZlcmVyKSB7CiAgICAgICAgICAgICAqdiA9IG5neF9odHRwX3ZhcmlhYmxlX251bGxfdmFsdWU7CiAgICAgICAgICAgICByZXR1cm4gTkdYX09LOwogCkBAIC0xMjAsMzcgKzEyMywyNSBAQAogICAgIGxlbiAtPSA3OwogICAgIHJlZiArPSA3OwogCi0gICAgcmVmcyA9IGNmLT5yZWZlcmVycy0+ZWx0czsKLSAgICBmb3IgKGkgPSAwOyBpIDwgY2YtPnJlZmVyZXJzLT5uZWx0czsgaSsrICl7Ci0KLSAgICAgICAgaWYgKHJlZnNbaV0ubmFtZS5sZW4gPiBsZW4pIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOworICAgIGZvciAocCA9IHJlZjsgcCA8IHJlZiArIGxlbjsgcCsrKSB7CisgICAgICAgIGlmICgqcCA9PSAnLycgfHwgKnAgPT0gJzonKSB7CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQorICAgIH0KIAotICAgICAgICBpZiAocmVmc1tpXS53aWxkY2FyZCkgewotICAgICAgICAgICAgZm9yIChuID0gMDsgbiA8IGxlbjsgbisrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlZltuXSA9PSAnLycgfHwgcmVmW25dID09ICc6JykgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9CisgICAgbGVuID0gcCAtIHJlZjsKIAotICAgICAgICAgICAgICAgIGlmIChyZWZbbl0gIT0gJy4nKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KKyAgICBpZiAocmxjZi0+aGFzaC5idWNrZXRzKSB7CisgICAgICAgIGlmIChuZ3hfaGFzaF9maW5kKCZybGNmLT5oYXNoLCBuZ3hfaGFzaF9rZXlfbGMocmVmLCBsZW4pLCByZWYsIGxlbikpIHsKKyAgICAgICAgICAgICp2ID0gbmd4X2h0dHBfdmFyaWFibGVfbnVsbF92YWx1ZTsKKyAgICAgICAgICAgIHJldHVybiBOR1hfT0s7CisgICAgICAgIH0KKyAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAobmd4X3N0cm5jbXAoJnJlZltuXSwgcmVmc1tpXS5uYW1lLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnNbaV0ubmFtZS5sZW4pID09IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAqdiA9IG5neF9odHRwX3ZhcmlhYmxlX251bGxfdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfT0s7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobmd4X3N0cm5jYXNlY21wKHJlZnNbaV0ubmFtZS5kYXRhLCByZWYsIHJlZnNbaV0ubmFtZS5sZW4pID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnYgPSBuZ3hfaHR0cF92YXJpYWJsZV9udWxsX3ZhbHVlOwotICAgICAgICAgICAgICAgIHJldHVybiBOR1hfT0s7Ci0gICAgICAgICAgICB9CisgICAgaWYgKHJsY2YtPmRuc193aWxkY2FyZHMgJiYgcmxjZi0+ZG5zX3dpbGRjYXJkcy0+aGFzaC5idWNrZXRzKSB7CisgICAgICAgIGlmIChuZ3hfaGFzaF9maW5kX3dpbGRjYXJkKHJsY2YtPmRuc193aWxkY2FyZHMsIHJlZiwgbGVuKSkgeworICAgICAgICAgICAgKnYgPSBuZ3hfaHR0cF92YXJpYWJsZV9udWxsX3ZhbHVlOworICAgICAgICAgICAgcmV0dXJuIE5HWF9PSzsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTY1LDEyICsxNTYsMTEgQEAKIHsKICAgICBuZ3hfaHR0cF9yZWZlcmVyX2NvbmZfdCAgKmNvbmY7CiAKLSAgICBjb25mID0gbmd4X3BhbGxvYyhjZi0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX3JlZmVyZXJfY29uZl90KSk7CisgICAgY29uZiA9IG5neF9wY2FsbG9jKGNmLT5wb29sLCBzaXplb2Yobmd4X2h0dHBfcmVmZXJlcl9jb25mX3QpKTsKICAgICBpZiAoY29uZiA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICB9CiAKLSAgICBjb25mLT5yZWZlcmVycyA9IE5VTEw7CiAgICAgY29uZi0+bm9fcmVmZXJlciA9IE5HWF9DT05GX1VOU0VUOwogICAgIGNvbmYtPmJsb2NrZWRfcmVmZXJlciA9IE5HWF9DT05GX1VOU0VUOwogCkBAIC0xODQsMTAgKzE3NCw1MyBAQAogICAgIG5neF9odHRwX3JlZmVyZXJfY29uZl90ICpwcmV2ID0gcGFyZW50OwogICAgIG5neF9odHRwX3JlZmVyZXJfY29uZl90ICpjb25mID0gY2hpbGQ7CiAKLSAgICBpZiAoY29uZi0+cmVmZXJlcnMgPT0gTlVMTCkgewotICAgICAgICBjb25mLT5yZWZlcmVycyA9IHByZXYtPnJlZmVyZXJzOworICAgIG5neF9oYXNoX2luaXRfdCAgaGFzaDsKKworICAgIGlmIChjb25mLT5rZXlzID09IE5VTEwpIHsKKyAgICAgICAgY29uZi0+aGFzaCA9IHByZXYtPmhhc2g7CisgICAgICAgIGNvbmYtPmRuc193aWxkY2FyZHMgPSBwcmV2LT5kbnNfd2lsZGNhcmRzOworCiAgICAgICAgIG5neF9jb25mX21lcmdlX3ZhbHVlKGNvbmYtPm5vX3JlZmVyZXIsIHByZXYtPm5vX3JlZmVyZXIsIDApOwogICAgICAgICBuZ3hfY29uZl9tZXJnZV92YWx1ZShjb25mLT5ibG9ja2VkX3JlZmVyZXIsIHByZXYtPmJsb2NrZWRfcmVmZXJlciwgMCk7CisKKyAgICAgICAgcmV0dXJuIE5HWF9DT05GX09LOworICAgIH0KKworICAgIGhhc2gua2V5ID0gbmd4X2hhc2hfa2V5X2xjOworICAgIGhhc2gubWF4X3NpemUgPSAyMDQ4OyAvKiBUT0RPOiByZWZlcmVyX2hhc2hfbWF4X3NpemU7ICovCisgICAgaGFzaC5idWNrZXRfc2l6ZSA9IDY0OyAvKiBUT0RPOiByZWZlcmVyX2hhc2hfYnVja2V0X3NpemU7ICovCisgICAgaGFzaC5uYW1lID0gInJlZmVyZXJzX2hhc2giOworICAgIGhhc2gucG9vbCA9IGNmLT5wb29sOworCisgICAgaWYgKGNvbmYtPmtleXMtPmtleXMubmVsdHMpIHsKKyAgICAgICAgaGFzaC5oYXNoID0gJmNvbmYtPmhhc2g7CisgICAgICAgIGhhc2gudGVtcF9wb29sID0gTlVMTDsKKworICAgICAgICBpZiAobmd4X2hhc2hfaW5pdCgmaGFzaCwgY29uZi0+a2V5cy0+a2V5cy5lbHRzLCBjb25mLT5rZXlzLT5rZXlzLm5lbHRzKQorICAgICAgICAgICAgIT0gTkdYX09LKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY29uZi0+a2V5cy0+ZG5zX3dpbGRjYXJkcy5uZWx0cykgeworCisgICAgICAgIG5neF9xc29ydChjb25mLT5rZXlzLT5kbnNfd2lsZGNhcmRzLmVsdHMsCisgICAgICAgICAgICAgICAgICAoc2l6ZV90KSBjb25mLT5rZXlzLT5kbnNfd2lsZGNhcmRzLm5lbHRzLAorICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5neF9oYXNoX2tleV90KSwKKyAgICAgICAgICAgICAgICAgIG5neF9odHRwX2NtcF9yZWZlcmVyX3dpbGRjYXJkcyk7CisKKyAgICAgICAgaGFzaC5oYXNoID0gTlVMTDsKKyAgICAgICAgaGFzaC50ZW1wX3Bvb2wgPSBjZi0+dGVtcF9wb29sOworCisgICAgICAgIGlmIChuZ3hfaGFzaF93aWxkY2FyZF9pbml0KCZoYXNoLCBjb25mLT5rZXlzLT5kbnNfd2lsZGNhcmRzLmVsdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmYtPmtleXMtPmRuc193aWxkY2FyZHMubmVsdHMpCisgICAgICAgICAgICAhPSBOR1hfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGNvbmYtPmRuc193aWxkY2FyZHMgPSAobmd4X2hhc2hfd2lsZGNhcmRfdCAqKSBoYXNoLmhhc2g7CiAgICAgfQogCiAgICAgaWYgKGNvbmYtPm5vX3JlZmVyZXIgPT0gTkdYX0NPTkZfVU5TRVQpIHsKQEAgLTIwNSwxMSArMjM4LDExIEBACiBzdGF0aWMgY2hhciAqCiBuZ3hfaHR0cF92YWxpZF9yZWZlcmVycyhuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqY21kLCB2b2lkICpjb25mKQogewotICAgIG5neF9odHRwX3JlZmVyZXJfY29uZl90ICAqbGNmID0gY29uZjsKKyAgICBuZ3hfaHR0cF9yZWZlcmVyX2NvbmZfdCAgKnJsY2YgPSBjb25mOwogCi0gICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgaSwgc2VydmVyX25hbWVzOworICAgIHVfY2hhciAgICAgICAgICAgICAgICAgICAgKnA7CiAgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAqdmFsdWUsIG5hbWU7Ci0gICAgbmd4X2h0dHBfcmVmZXJlcl90ICAgICAgICAqcmVmOworICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgIGksIG47CiAgICAgbmd4X2h0dHBfdmFyaWFibGVfdCAgICAgICAqdmFyOwogICAgIG5neF9odHRwX3NlcnZlcl9uYW1lX3QgICAgKnNuOwogICAgIG5neF9odHRwX2NvcmVfc3J2X2NvbmZfdCAgKmNzY2Y7CkBAIC0yMjUsMTkgKzI1OCwyMSBAQAogCiAgICAgdmFyLT5oYW5kbGVyID0gbmd4X2h0dHBfcmVmZXJlcl92YXJpYWJsZTsKIAotICAgIGNzY2YgPSBuZ3hfaHR0cF9jb25mX2dldF9tb2R1bGVfc3J2X2NvbmYoY2YsIG5neF9odHRwX2NvcmVfbW9kdWxlKTsKKyAgICBpZiAocmxjZi0+a2V5cyA9PSBOVUxMKSB7CisgICAgICAgIHJsY2YtPmtleXMgPSBuZ3hfcGNhbGxvYyhjZi0+dGVtcF9wb29sLCBzaXplb2Yobmd4X2hhc2hfa2V5c19hcnJheXNfdCkpOworICAgICAgICBpZiAocmxjZi0+a2V5cyA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgICAgIH0KIAotICAgIGlmIChsY2YtPnJlZmVyZXJzID09IE5VTEwpIHsKLSAgICAgICAgbGNmLT5yZWZlcmVycyA9IG5neF9hcnJheV9jcmVhdGUoY2YtPnBvb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZi0+YXJncy0+bmVsdHMgKyBjc2NmLT5zZXJ2ZXJfbmFtZXMubmVsdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yobmd4X2h0dHBfcmVmZXJlcl90KSk7Ci0gICAgICAgIGlmIChsY2YtPnJlZmVyZXJzID09IE5VTEwpIHsKKyAgICAgICAgcmxjZi0+a2V5cy0+cG9vbCA9IGNmLT5wb29sOworICAgICAgICBybGNmLT5rZXlzLT50ZW1wX3Bvb2wgPSBjZi0+cG9vbDsKKworICAgICAgICBpZiAobmd4X2hhc2hfa2V5c19hcnJheV9pbml0KHJsY2YtPmtleXMsIE5HWF9IQVNIX1NNQUxMKSAhPSBOR1hfT0spIHsKICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICAgICAgfQogICAgIH0KIAogICAgIHZhbHVlID0gY2YtPmFyZ3MtPmVsdHM7Ci0gICAgc2VydmVyX25hbWVzID0gMDsKIAogICAgIGZvciAoaSA9IDE7IGkgPCBjZi0+YXJncy0+bmVsdHM7IGkrKykgewogICAgICAgICBpZiAodmFsdWVbaV0ubGVuID09IDApIHsKQEAgLTI0Nyw2NCArMjgyLDkwIEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAobmd4X3N0cmNtcCh2YWx1ZVtpXS5kYXRhLCAibm9uZSIpID09IDApIHsKLSAgICAgICAgICAgIGxjZi0+bm9fcmVmZXJlciA9IDE7CisgICAgICAgICAgICBybGNmLT5ub19yZWZlcmVyID0gMTsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKG5neF9zdHJjbXAodmFsdWVbaV0uZGF0YSwgImJsb2NrZWQiKSA9PSAwKSB7Ci0gICAgICAgICAgICBsY2YtPmJsb2NrZWRfcmVmZXJlciA9IDE7CisgICAgICAgICAgICBybGNmLT5ibG9ja2VkX3JlZmVyZXIgPSAxOwogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAobmd4X3N0cmNtcCh2YWx1ZVtpXS5kYXRhLCAic2VydmVyX25hbWVzIikgPT0gMCkgewotICAgICAgICAgICAgc2VydmVyX25hbWVzID0gMTsKKworICAgICAgICAgICAgY3NjZiA9IG5neF9odHRwX2NvbmZfZ2V0X21vZHVsZV9zcnZfY29uZihjZiwgbmd4X2h0dHBfY29yZV9tb2R1bGUpOworCisgICAgICAgICAgICBzbiA9IGNzY2YtPnNlcnZlcl9uYW1lcy5lbHRzOworICAgICAgICAgICAgZm9yIChuID0gMDsgbiA8IGNzY2YtPnNlcnZlcl9uYW1lcy5uZWx0czsgbisrKSB7CisgICAgICAgICAgICAgICAgaWYgKG5neF9odHRwX2FkZF9yZWZlcmVyKGNmLCBybGNmLT5rZXlzLCAmc25bbl0ubmFtZSkgIT0gTkdYX09LKSAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKLSAgICAgICAgcmVmID0gbmd4X2FycmF5X3B1c2gobGNmLT5yZWZlcmVycyk7Ci0gICAgICAgIGlmIChyZWYgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwotICAgICAgICB9CisgICAgICAgIHAgPSAodV9jaGFyICopIG5neF9zdHJzdHIodmFsdWVbaV0uZGF0YSwgIi8iKTsKIAotICAgICAgICBpZiAodmFsdWVbaV0uZGF0YVswXSAhPSAnKicpIHsKLSAgICAgICAgICAgIHJlZi0+bmFtZSA9IHZhbHVlW2ldOwotICAgICAgICAgICAgcmVmLT53aWxkY2FyZCA9IDA7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgaWYgKHZhbHVlW2ldLmRhdGFbMV0gIT0gJy4nKSB7CisgICAgICAgIGlmIChwKSB7CiAgICAgICAgICAgICBuZ3hfY29uZl9sb2dfZXJyb3IoTkdYX0xPR19FTUVSRywgY2YsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgd2lsZGNhcmQgcmVmZXJlciBcIiVWXCIiLCAmdmFsdWVbaV0pOwotICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVUkkgcGFydCBcIiVzXCIgaXMgZGVwcmVjYXRlZCwgaWdub3JlZCIsIHApOworCisgICAgICAgICAgICB2YWx1ZVtpXS5sZW4gPSBwIC0gdmFsdWVbaV0uZGF0YTsKICAgICAgICAgfQogCi0gICAgICAgIHJlZi0+bmFtZS5sZW4gPSB2YWx1ZVtpXS5sZW4gLSAxOwotICAgICAgICByZWYtPm5hbWUuZGF0YSA9IHZhbHVlW2ldLmRhdGEgKyAxOwotICAgICAgICByZWYtPndpbGRjYXJkID0gMTsKLSAgICB9Ci0KLSAgICBpZiAoIXNlcnZlcl9uYW1lcykgewotICAgICAgICByZXR1cm4gTkdYX0NPTkZfT0s7Ci0gICAgfQotCi0gICAgc24gPSBjc2NmLT5zZXJ2ZXJfbmFtZXMuZWx0czsKLSAgICBmb3IgKGkgPSAwOyBpIDwgY3NjZi0+c2VydmVyX25hbWVzLm5lbHRzOyBpKyspIHsKLSAgICAgICAgcmVmID0gbmd4X2FycmF5X3B1c2gobGNmLT5yZWZlcmVycyk7Ci0gICAgICAgIGlmIChyZWYgPT0gTlVMTCkgeworICAgICAgICBpZiAobmd4X2h0dHBfYWRkX3JlZmVyZXIoY2YsIHJsY2YtPmtleXMsICZ2YWx1ZVtpXSkgIT0gTkdYX09LKSB7CiAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgICAgIH0KLQotICAgICAgICByZWYtPm5hbWUubGVuID0gc25baV0ubmFtZS5sZW4gKyAxOwotICAgICAgICByZWYtPm5hbWUuZGF0YSA9IG5neF9wYWxsb2MoY2YtPnBvb2wsIHJlZi0+bmFtZS5sZW4pOwotICAgICAgICBpZiAocmVmLT5uYW1lLmRhdGEgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICAgICAgbmd4X21lbWNweShyZWYtPm5hbWUuZGF0YSwgc25baV0ubmFtZS5kYXRhLCBzbltpXS5uYW1lLmxlbik7Ci0gICAgICAgIHJlZi0+bmFtZS5kYXRhW3NuW2ldLm5hbWUubGVuXSA9ICcvJzsKLSAgICAgICAgcmVmLT53aWxkY2FyZCA9IHNuW2ldLndpbGRjYXJkOwogICAgIH0KIAogICAgIHJldHVybiBOR1hfQ09ORl9PSzsKIH0KKworCitzdGF0aWMgY2hhciAqCituZ3hfaHR0cF9hZGRfcmVmZXJlcihuZ3hfY29uZl90ICpjZiwgbmd4X2hhc2hfa2V5c19hcnJheXNfdCAqa2V5cywKKyAgICBuZ3hfc3RyX3QgKnZhbHVlKQoreworICAgIHVfY2hhciAgICAgIGNoOworICAgIG5neF9pbnRfdCAgIHJjOworICAgIG5neF91aW50X3QgIGZsYWdzOworCisgICAgY2ggPSB2YWx1ZS0+ZGF0YVswXTsKKworICAgIGlmICgoY2ggPT0gJyonICYmICh2YWx1ZS0+bGVuIDwgMyB8fCB2YWx1ZS0+ZGF0YVsxXSAhPSAnLicpKQorICAgICAgICB8fCAoY2ggPT0gJy4nICYmIHZhbHVlLT5sZW4gPCAyKSkKKyAgICB7CisgICAgICAgIG5neF9jb25mX2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBjZiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIEROUyB3aWxkY2FyZCBcIiVWXCIiLCB2YWx1ZSk7CisKKyAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgIH0KKworICAgIGZsYWdzID0gKGNoID09ICcqJyB8fCBjaCA9PSAnLicpID8gTkdYX0hBU0hfV0lMRENBUkRfS0VZIDogMDsKKworICAgIHJjID0gbmd4X2hhc2hfYWRkX2tleShrZXlzLCB2YWx1ZSwgKHZvaWQgKikgNCwgZmxhZ3MpOworCisgICAgaWYgKHJjID09IE5HWF9PSykgeworICAgICAgICByZXR1cm4gTkdYX0NPTkZfT0s7CisgICAgfQorCisgICAgaWYgKHJjID09IE5HWF9CVVNZKSB7CisgICAgICAgIG5neF9jb25mX2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBjZiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb25mbGljdGluZyBwYXJhbWV0ZXIgXCIlVlwiIiwgdmFsdWUpOworICAgIH0KKworICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKK30KKworCitzdGF0aWMgaW50IG5neF9saWJjX2NkZWNsCituZ3hfaHR0cF9jbXBfcmVmZXJlcl93aWxkY2FyZHMoY29uc3Qgdm9pZCAqb25lLCBjb25zdCB2b2lkICp0d28pCit7CisgICAgbmd4X2hhc2hfa2V5X3QgICpmaXJzdCwgKnNlY29uZDsKKworICAgIGZpcnN0ID0gKG5neF9oYXNoX2tleV90ICopIG9uZTsKKyAgICBzZWNvbmQgPSAobmd4X2hhc2hfa2V5X3QgKikgdHdvOworCisgICAgcmV0dXJuIG5neF9zdHJjbXAoZmlyc3QtPmtleS5kYXRhLCBzZWNvbmQtPmtleS5kYXRhKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9odHRwL25neF9odHRwLmMgYi9zcmMvaHR0cC9uZ3hfaHR0cC5jCmluZGV4IDQ0OWE0ZTkuLmQxZDY0YjggMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL25neF9odHRwLmMKKysrIGIvc3JjL2h0dHAvbmd4X2h0dHAuYwpAQCAtMTQsMTggKzE0LDIyIEBACiBzdGF0aWMgaW50IG5neF9saWJjX2NkZWNsIG5neF9jbXBfc2VydmVyX25hbWVzKGNvbnN0IHZvaWQgKm9uZSwKICAgICBjb25zdCB2b2lkICp0d28pOwogc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9hZGRfYWRkcmVzcyhuZ3hfY29uZl90ICpjZiwKLSAgICBuZ3hfaHR0cF9pbl9wb3J0X3QgKmluX3BvcnQsIG5neF9odHRwX2xpc3Rlbl90ICpsc2NmLAorICAgIG5neF9odHRwX2NvbmZfaW5fcG9ydF90ICppbl9wb3J0LCBuZ3hfaHR0cF9saXN0ZW5fdCAqbHNjZiwKICAgICBuZ3hfaHR0cF9jb3JlX3Nydl9jb25mX3QgKmNzY2YpOwogc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9hZGRfbmFtZXMobmd4X2NvbmZfdCAqY2YsCi0gICAgbmd4X2h0dHBfaW5fYWRkcl90ICppbl9hZGRyLCBuZ3hfaHR0cF9jb3JlX3Nydl9jb25mX3QgKmNzY2YpOworICAgIG5neF9odHRwX2NvbmZfaW5fYWRkcl90ICppbl9hZGRyLCBuZ3hfaHR0cF9jb3JlX3Nydl9jb25mX3QgKmNzY2YpOwogc3RhdGljIGNoYXIgKm5neF9odHRwX21lcmdlX2xvY2F0aW9ucyhuZ3hfY29uZl90ICpjZiwKICAgICBuZ3hfYXJyYXlfdCAqbG9jYXRpb25zLCB2b2lkICoqbG9jX2NvbmYsIG5neF9odHRwX21vZHVsZV90ICptb2R1bGUsCiAgICAgbmd4X3VpbnRfdCBjdHhfaW5kZXgpOworc3RhdGljIGludCBuZ3hfbGliY19jZGVjbCBuZ3hfaHR0cF9jbXBfY29uZl9pbl9hZGRycyhjb25zdCB2b2lkICpvbmUsCisgICAgY29uc3Qgdm9pZCAqdHdvKTsKK3N0YXRpYyBpbnQgbmd4X2xpYmNfY2RlY2wgbmd4X2h0dHBfY21wX2Ruc193aWxkY2FyZHMoY29uc3Qgdm9pZCAqb25lLAorICAgIGNvbnN0IHZvaWQgKnR3byk7CiAKLW5neF91aW50X3QgIG5neF9odHRwX21heF9tb2R1bGU7CituZ3hfdWludF90ICAgbmd4X2h0dHBfbWF4X21vZHVsZTsKIAotbmd4X3VpbnRfdCAgbmd4X2h0dHBfdG90YWxfcmVxdWVzdHM7Ci11aW50NjRfdCAgICBuZ3hfaHR0cF90b3RhbF9zZW50Oworbmd4X3VpbnRfdCAgIG5neF9odHRwX3RvdGFsX3JlcXVlc3RzOwordWludDY0X3QgICAgIG5neF9odHRwX3RvdGFsX3NlbnQ7CiAKIAogbmd4X2ludF90ICAoKm5neF9odHRwX3RvcF9oZWFkZXJfZmlsdGVyKSAobmd4X2h0dHBfcmVxdWVzdF90ICpyKTsKQEAgLTcyLDE5ICs3NiwyNCBAQAogbmd4X2h0dHBfYmxvY2sobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwgdm9pZCAqY29uZikKIHsKICAgICBjaGFyICAgICAgICAgICAgICAgICAgICAgICAgKnJ2OwotICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICAgbWksIG0sIHMsIGwsIHAsIGEsIG4sIGtleTsKLSAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgIHBvcnRfZm91bmQsIGFkZHJfZm91bmQ7Ci0gICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgICB2aXJ0dWFsX25hbWVzLCBzZXBhcmF0ZV9iaW5kaW5nOworICAgIHVfY2hhciAgICAgICAgICAgICAgICAgICAgICAgY2g7CisgICAgbmd4X2ludF90ICAgICAgICAgICAgICAgICAgICByYzsKKyAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgIG1pLCBtLCBzLCBsLCBwLCBhLCBuLCBpOworICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICAgbGFzdCwgYmluZF9hbGwsIGRvbmU7CiAgICAgbmd4X2NvbmZfdCAgICAgICAgICAgICAgICAgICBwY2Y7CiAgICAgbmd4X2FycmF5X3QgICAgICAgICAgICAgICAgICBpbl9wb3J0czsKKyAgICBuZ3hfaGFzaF9pbml0X3QgICAgICAgICAgICAgIGhhc2g7CiAgICAgbmd4X2xpc3RlbmluZ190ICAgICAgICAgICAgICpsczsKICAgICBuZ3hfaHR0cF9saXN0ZW5fdCAgICAgICAgICAgKmxzY2Y7CiAgICAgbmd4X2h0dHBfbW9kdWxlX3QgICAgICAgICAgICptb2R1bGU7CisgICAgbmd4X2h0dHBfaW5fcG9ydF90ICAgICAgICAgICpoaXA7CiAgICAgbmd4X2h0dHBfaGFuZGxlcl9wdCAgICAgICAgICpoOwogICAgIG5neF9odHRwX2NvbmZfY3R4X3QgICAgICAgICAqY3R4OwotICAgIG5neF9odHRwX2luX3BvcnRfdCAgICAgICAgICAqaW5fcG9ydCwgKmlucG9ydDsKLSAgICBuZ3hfaHR0cF9pbl9hZGRyX3QgICAgICAgICAgKmluX2FkZHIsICppbmFkZHI7Ci0gICAgbmd4X2h0dHBfc2VydmVyX25hbWVfdCAgICAgICpzX25hbWUsICpuYW1lOworICAgIG5neF9odHRwX2NvbmZfaW5fcG9ydF90ICAgICAqaW5fcG9ydDsKKyAgICBuZ3hfaHR0cF9jb25mX2luX2FkZHJfdCAgICAgKmluX2FkZHI7CisgICAgbmd4X2hhc2hfa2V5c19hcnJheXNfdCAgICAgICBoYTsKKyAgICBuZ3hfaHR0cF9zZXJ2ZXJfbmFtZV90ICAgICAgKm5hbWU7CisgICAgbmd4X2h0dHBfdmlydHVhbF9uYW1lc190ICAgICp2bjsKICAgICBuZ3hfaHR0cF9jb3JlX3Nydl9jb25mX3QgICAqKmNzY2ZwLCAqY3NjZjsKICAgICBuZ3hfaHR0cF9jb3JlX2xvY19jb25mX3QgICAgKmNsY2Y7CiAgICAgbmd4X2h0dHBfY29yZV9tYWluX2NvbmZfdCAgICpjbWNmOwpAQCAtNDE0LDcgKzQyMyw4IEBACiAgICAgICogdG8gcXVpY2tseSBmaW5kIHRoZSBzZXJ2ZXIgY29yZSBtb2R1bGUgY29uZmlndXJhdGlvbiBhdCBydW4tdGltZQogICAgICAqLwogCi0gICAgaWYgKG5neF9hcnJheV9pbml0KCZpbl9wb3J0cywgY2YtPnBvb2wsIDIsIHNpemVvZihuZ3hfaHR0cF9pbl9wb3J0X3QpKQorICAgIGlmIChuZ3hfYXJyYXlfaW5pdCgmaW5fcG9ydHMsIGNmLT50ZW1wX3Bvb2wsIDIsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfaHR0cF9jb25mX2luX3BvcnRfdCkpCiAgICAgICAgICE9IE5HWF9PSykKICAgICB7CiAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKQEAgLTQzMCwxMzcgKzQ0MCw4NSBAQAogICAgICAgICBsc2NmID0gY3NjZnBbc10tPmxpc3Rlbi5lbHRzOwogICAgICAgICBmb3IgKGwgPSAwOyBsIDwgY3NjZnBbc10tPmxpc3Rlbi5uZWx0czsgbCsrKSB7CiAKLSAgICAgICAgICAgIHBvcnRfZm91bmQgPSAwOwotCiAgICAgICAgICAgICAvKiBBRl9JTkVUIG9ubHkgKi8KIAogICAgICAgICAgICAgaW5fcG9ydCA9IGluX3BvcnRzLmVsdHM7CiAgICAgICAgICAgICBmb3IgKHAgPSAwOyBwIDwgaW5fcG9ydHMubmVsdHM7IHArKykgewogCi0gICAgICAgICAgICAgICAgaWYgKGxzY2ZbbF0ucG9ydCA9PSBpbl9wb3J0W3BdLnBvcnQpIHsKKyAgICAgICAgICAgICAgICBpZiAobHNjZltsXS5wb3J0ICE9IGluX3BvcnRbcF0ucG9ydCkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgLyogdGhlIHBvcnQgaXMgYWxyZWFkeSBpbiB0aGUgcG9ydCBsaXN0ICovCisgICAgICAgICAgICAgICAgLyogdGhlIHBvcnQgaXMgYWxyZWFkeSBpbiB0aGUgcG9ydCBsaXN0ICovCiAKLSAgICAgICAgICAgICAgICAgICAgcG9ydF9mb3VuZCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIGFkZHJfZm91bmQgPSAwOworICAgICAgICAgICAgICAgIGluX2FkZHIgPSBpbl9wb3J0W3BdLmFkZHJzLmVsdHM7CisgICAgICAgICAgICAgICAgZm9yIChhID0gMDsgYSA8IGluX3BvcnRbcF0uYWRkcnMubmVsdHM7IGErKykgewogCi0gICAgICAgICAgICAgICAgICAgIGluX2FkZHIgPSBpbl9wb3J0W3BdLmFkZHJzLmVsdHM7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoYSA9IDA7IGEgPCBpbl9wb3J0W3BdLmFkZHJzLm5lbHRzOyBhKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxzY2ZbbF0uYWRkciAhPSBpbl9hZGRyW2FdLmFkZHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsc2NmW2xdLmFkZHIgPT0gaW5fYWRkclthXS5hZGRyKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIHRoZSBhZGRyZXNzIGlzIGFscmVhZHkgaW4gdGhlIGFkZHJlc3MgbGlzdCAqLwogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlIGFkZHJlc3MgaXMgYWxyZWFkeSBpbiB0aGUgYWRkcmVzcyBsaXN0ICovCisgICAgICAgICAgICAgICAgICAgIGlmIChuZ3hfaHR0cF9hZGRfbmFtZXMoY2YsICZpbl9hZGRyW2FdLCBjc2NmcFtzXSkgIT0gTkdYX09LKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZ3hfaHR0cF9hZGRfbmFtZXMoY2YsICZpbl9hZGRyW2FdLCBjc2NmcFtzXSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gTkdYX09LKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogY2hlY2sgdGhlIGR1cGxpY2F0ZSAiZGVmYXVsdCIgc2VydmVyCisgICAgICAgICAgICAgICAgICAgICAqIGZvciB0aGlzIGFkZHJlc3M6cG9ydAorICAgICAgICAgICAgICAgICAgICAgKi8KIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICogY2hlY2sgdGhlIGR1cGxpY2F0ZSAiZGVmYXVsdCIgc2VydmVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZm9yIHRoaXMgYWRkcmVzczpwb3J0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGlmIChsc2NmW2xdLmNvbmYuZGVmYXVsdF9zZXJ2ZXIpIHsKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsc2NmW2xdLmNvbmYuZGVmYXVsdF9zZXJ2ZXIpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5fYWRkclthXS5jb25mLmRlZmF1bHRfc2VydmVyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfRVJSLCBjZi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluX2FkZHJbYV0uZGVmYXVsdF9zZXJ2ZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfRVJSLCBjZi0+bG9nLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgZHVwbGljYXRlIGRlZmF1bHQgc2VydmVyIGluICVWOiVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbHNjZltsXS5maWxlX25hbWUsIGxzY2ZbbF0ubGluZSk7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluX2FkZHJbYV0uY29yZV9zcnZfY29uZiA9IGNzY2ZwW3NdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9hZGRyW2FdLmNvbmYuZGVmYXVsdF9zZXJ2ZXIgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJfZm91bmQgPSAxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5fYWRkclthXS5hZGRyID09IElOQUREUl9BTlkpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZSBJTkFERFJfQU5ZIGlzIGFsd2F5cyB0aGUgbGFzdCBhZGRyZXNzICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmFkZHIgPSBuZ3hfYXJyYXlfcHVzaCgmaW5fcG9ydFtwXS5hZGRycyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluYWRkciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5fYWRkciA9IGluX3BvcnRbcF0uYWRkcnMuZWx0czsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdGhlIElOQUREUl9BTlkgbXVzdCBiZSB0aGUgbGFzdCByZXNvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzbyB3ZSBtb3ZlIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGFkZHJlc3MgbGlzdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGFuZCBwdXQgdGhlIG5ldyBhZGRyZXNzIGluIGl0cyBwbGFjZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X21lbWNweShpbmFkZHIsICZpbl9hZGRyW2FdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5neF9odHRwX2luX2FkZHJfdCkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5fYWRkclthXS5hZGRyID0gbHNjZltsXS5hZGRyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluX2FkZHJbYV0ubmFtZXMuZWx0cyA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5fYWRkclthXS5oYXNoID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9hZGRyW2FdLndpbGRjYXJkcy5lbHRzID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9hZGRyW2FdLmNvcmVfc3J2X2NvbmYgPSBjc2NmcFtzXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9hZGRyW2FdLmNvbmYgPSBsc2NmW2xdLmNvbmY7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmd4X2h0dHBfYWRkX25hbWVzKGNmLCAmaW5fYWRkclthXSwgY3NjZnBbc10pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IE5HWF9PSykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyX2ZvdW5kID0gMTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFhZGRyX2ZvdW5kKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBhZGQgdGhlIGFkZHJlc3MgdG8gdGhlIGFkZHJlc3NlcyBsaXN0IHRoYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIGJvdW5kIHRvIHRoaXMgcG9ydAotICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZ3hfaHR0cF9hZGRfYWRkcmVzcyhjZiwgJmluX3BvcnRbcF0sICZsc2NmW2xdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzY2ZwW3NdKSAhPSBOR1hfT0spCi0gICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpbl9hZGRyW2FdLmNvcmVfc3J2X2NvbmYgPSBjc2NmcFtzXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluX2FkZHJbYV0uZGVmYXVsdF9zZXJ2ZXIgPSAxOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoIXBvcnRfZm91bmQpIHsKLQotICAgICAgICAgICAgICAgIC8qIGFkZCB0aGUgcG9ydCB0byB0aGUgaW5fcG9ydCBsaXN0ICovCi0KLSAgICAgICAgICAgICAgICBpbl9wb3J0ID0gbmd4X2FycmF5X3B1c2goJmluX3BvcnRzKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5fcG9ydCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgZ290byBmb3VuZDsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpbl9wb3J0LT5wb3J0ID0gbHNjZltsXS5wb3J0OwotICAgICAgICAgICAgICAgIGluX3BvcnQtPmFkZHJzLmVsdHMgPSBOVUxMOworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogYWRkIHRoZSBhZGRyZXNzIHRvIHRoZSBhZGRyZXNzZXMgbGlzdCB0aGF0CisgICAgICAgICAgICAgICAgICogYm91bmQgdG8gdGhpcyBwb3J0CisgICAgICAgICAgICAgICAgICovCiAKLSAgICAgICAgICAgICAgICBpbl9wb3J0LT5wb3J0X3RleHQuZGF0YSA9IG5neF9wYWxsb2MoY2YtPnBvb2wsIDcpOwotICAgICAgICAgICAgICAgIGlmIChpbl9wb3J0LT5wb3J0X3RleHQuZGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpbl9wb3J0LT5wb3J0X3RleHQubGVuID0gbmd4X3NwcmludGYoaW5fcG9ydC0+cG9ydF90ZXh0LmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6JWQiLCBpbl9wb3J0LT5wb3J0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGluX3BvcnQtPnBvcnRfdGV4dC5kYXRhOwotCi0gICAgICAgICAgICAgICAgaWYgKG5neF9odHRwX2FkZF9hZGRyZXNzKGNmLCBpbl9wb3J0LCAmbHNjZltsXSwgY3NjZnBbc10pCisgICAgICAgICAgICAgICAgaWYgKG5neF9odHRwX2FkZF9hZGRyZXNzKGNmLCAmaW5fcG9ydFtwXSwgJmxzY2ZbbF0sIGNzY2ZwW3NdKQogICAgICAgICAgICAgICAgICAgICAhPSBOR1hfT0spCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZ290byBmb3VuZDsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogYWRkIHRoZSBwb3J0IHRvIHRoZSBpbl9wb3J0IGxpc3QgKi8KKworICAgICAgICAgICAgaW5fcG9ydCA9IG5neF9hcnJheV9wdXNoKCZpbl9wb3J0cyk7CisgICAgICAgICAgICBpZiAoaW5fcG9ydCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbl9wb3J0LT5wb3J0ID0gbHNjZltsXS5wb3J0OworICAgICAgICAgICAgaW5fcG9ydC0+YWRkcnMuZWx0cyA9IE5VTEw7CisKKyAgICAgICAgICAgIGlmIChuZ3hfaHR0cF9hZGRfYWRkcmVzcyhjZiwgaW5fcG9ydCwgJmxzY2ZbbF0sIGNzY2ZwW3NdKSAhPSBOR1hfT0spCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgICAgICAgICAgfQorCisgICAgICAgIGZvdW5kOgorCisgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNTcyLDcgKzUzMCw4IEBACiAgICAgaW5fcG9ydCA9IGluX3BvcnRzLmVsdHM7CiAgICAgZm9yIChwID0gMDsgcCA8IGluX3BvcnRzLm5lbHRzOyBwKyspIHsKIAotICAgICAgICBzZXBhcmF0ZV9iaW5kaW5nID0gMDsKKyAgICAgICAgbmd4X3Fzb3J0KGluX3BvcnRbcF0uYWRkcnMuZWx0cywgKHNpemVfdCkgaW5fcG9ydFtwXS5hZGRycy5uZWx0cywKKyAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfaHR0cF9jb25mX2luX2FkZHJfdCksIG5neF9odHRwX2NtcF9jb25mX2luX2FkZHJzKTsKIAogICAgICAgICAvKgogICAgICAgICAgKiBjaGVjayB3aGV0aGVyIGFsbCBuYW1lLWJhc2VkIHNlcnZlcnMgaGF2ZSB0aGUgc2FtZSBjb25maWd1cmFpdG9uCkBAIC01ODIsMzMgKzU0MSwxMyBAQAogICAgICAgICBpbl9hZGRyID0gaW5fcG9ydFtwXS5hZGRycy5lbHRzOwogICAgICAgICBmb3IgKGEgPSAwOyBhIDwgaW5fcG9ydFtwXS5hZGRycy5uZWx0czsgYSsrKSB7CiAKLSAgICAgICAgICAgIGlmIChpbl9hZGRyW2FdLmNvbmYuYmluZCkgewotICAgICAgICAgICAgICAgIHNlcGFyYXRlX2JpbmRpbmcgPSAxOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB2aXJ0dWFsX25hbWVzID0gMDsKLQogICAgICAgICAgICAgbmFtZSA9IGluX2FkZHJbYV0ubmFtZXMuZWx0czsKICAgICAgICAgICAgIGZvciAobiA9IDA7IG4gPCBpbl9hZGRyW2FdLm5hbWVzLm5lbHRzOyBuKyspIHsKICAgICAgICAgICAgICAgICBpZiAoaW5fYWRkclthXS5jb3JlX3Nydl9jb25mICE9IG5hbWVbbl0uY29yZV9zcnZfY29uZgogICAgICAgICAgICAgICAgICAgICB8fCBuYW1lW25dLmNvcmVfc3J2X2NvbmYtPnJlc3RyaWN0X2hvc3RfbmFtZXMKICAgICAgICAgICAgICAgICAgICAgICAgIT0gTkdYX0hUVFBfUkVTVFJJQ1RfSE9TVF9PRkYpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsX25hbWVzID0gMTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIXZpcnR1YWxfbmFtZXMpIHsKLSAgICAgICAgICAgICAgICBuYW1lID0gaW5fYWRkclthXS53aWxkY2FyZHMuZWx0czsKLSAgICAgICAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgaW5fYWRkclthXS53aWxkY2FyZHMubmVsdHM7IG4rKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaW5fYWRkclthXS5jb3JlX3Nydl9jb25mICE9IG5hbWVbbl0uY29yZV9zcnZfY29uZgotICAgICAgICAgICAgICAgICAgICAgICAgfHwgbmFtZVtuXS5jb3JlX3Nydl9jb25mLT5yZXN0cmljdF9ob3N0X25hbWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBOR1hfSFRUUF9SRVNUUklDVF9IT1NUX09GRikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdmlydHVhbF9uYW1lcyA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBnb3RvIHZpcnR1YWxfbmFtZXM7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCkBAIC02MTgsNjUgKzU1NywxMzIgQEAKICAgICAgICAgICAgICAqIHRoZW4gd2UgZG8gbm90IG5lZWQgdG8gY2hlY2sgdGhlbSBhdCBydW4tdGltZSBhdCBhbGwKICAgICAgICAgICAgICAqLwogCi0gICAgICAgICAgICBpZiAoIXZpcnR1YWxfbmFtZXMpIHsKLSAgICAgICAgICAgICAgICBpbl9hZGRyW2FdLm5hbWVzLm5lbHRzID0gMDsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGluX2FkZHJbYV0ubmFtZXMubmVsdHMgPSAwOworCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICB2aXJ0dWFsX25hbWVzOgorCisgICAgICAgICAgICBoYS50ZW1wX3Bvb2wgPSBuZ3hfY3JlYXRlX3Bvb2woMTYzODQsIGNmLT5sb2cpOworICAgICAgICAgICAgaWYgKGhhLnRlbXBfcG9vbCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBoYS5wb29sID0gY2YtPnBvb2w7CiAKLSAgICAgICAgICAgIG5neF9xc29ydChpbl9hZGRyW2FdLm5hbWVzLmVsdHMsIGluX2FkZHJbYV0ubmFtZXMubmVsdHMsCi0gICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5neF9odHRwX3NlcnZlcl9uYW1lX3QpLCBuZ3hfY21wX3NlcnZlcl9uYW1lcyk7CisgICAgICAgICAgICBpZiAobmd4X2hhc2hfa2V5c19hcnJheV9pbml0KCZoYSwgTkdYX0hBU0hfTEFSR0UpICE9IE5HWF9PSykgeworICAgICAgICAgICAgICAgIG5neF9kZXN0cm95X3Bvb2woaGEudGVtcF9wb29sKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIG5hbWUgPSBpbl9hZGRyW2FdLm5hbWVzLmVsdHM7CisgICAgICAgICAgICBmb3IgKHMgPSAwOyBzIDwgaW5fYWRkclthXS5uYW1lcy5uZWx0czsgcysrKSB7CiAKLSAgICAgICAgICAgIC8qIGNyZWF0ZSBhIGhhc2ggZm9yIG1hbnkgbmFtZXMgKi8KKyAgICAgICAgICAgICAgICBjaCA9IG5hbWVbc10ubmFtZS5kYXRhWzBdOwogCi0gICAgICAgICAgICBpZiAoaW5fYWRkclthXS5uYW1lcy5uZWx0cyA+IGNtY2YtPnNlcnZlcl9uYW1lc19oYXNoX3RocmVzaG9sZCkgewotICAgICAgICAgICAgICAgIGluX2FkZHJbYV0uaGFzaCA9IG5neF9wYWxsb2MoY2YtPnBvb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWNmLT5zZXJ2ZXJfbmFtZXNfaGFzaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihuZ3hfYXJyYXlfdCkpOwotICAgICAgICAgICAgICAgIGlmIChpbl9hZGRyW2FdLmhhc2ggPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnKicgfHwgY2ggPT0gJy4nKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJjID0gbmd4X2hhc2hfYWRkX2tleSgmaGEsICZuYW1lW3NdLm5hbWUsIG5hbWVbc10uY29yZV9zcnZfY29uZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisKKyAgICAgICAgICAgICAgICBpZiAocmMgPT0gTkdYX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgY21jZi0+c2VydmVyX25hbWVzX2hhc2g7IG4rKykgewotICAgICAgICAgICAgICAgICAgICBpZiAobmd4X2FycmF5X2luaXQoJmluX2FkZHJbYV0uaGFzaFtuXSwgY2YtPnBvb2wsIDQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5neF9odHRwX3NlcnZlcl9uYW1lX3QpKSAhPSBOR1hfT0spCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG5hbWUgPSBpbl9hZGRyW2FdLm5hbWVzLmVsdHM7Ci0gICAgICAgICAgICAgICAgZm9yIChzID0gMDsgcyA8IGluX2FkZHJbYV0ubmFtZXMubmVsdHM7IHMrKykgewotICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9zZXJ2ZXJfbmFtZXNfaGFzaF9rZXkoa2V5LCBuYW1lW3NdLm5hbWUuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVbc10ubmFtZS5sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWNmLT5zZXJ2ZXJfbmFtZXNfaGFzaCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgc19uYW1lID0gbmd4X2FycmF5X3B1c2goJmluX2FkZHJbYV0uaGFzaFtrZXldKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNfbmFtZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGluX2FkZHJbYV0ubmFtZXMuZWx0czsKLQotICAgICAgICAgICAgICAgICAgICAqc19uYW1lID0gbmFtZVtzXTsKKyAgICAgICAgICAgICAgICBpZiAocmMgPT0gTkdYX0JVU1kpIHsKKyAgICAgICAgICAgICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX1dBUk4sIGNmLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbmZsaWN0aW5nIHNlcnZlciBuYW1lIFwiJVZcIiwgaWdub3JlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVbc10ubmFtZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKHMgPSAwOyBzIDwgaW5fYWRkclthXS5uYW1lcy5uZWx0czsgcysrKSB7CisKKyAgICAgICAgICAgICAgICBjaCA9IG5hbWVbc10ubmFtZS5kYXRhWzBdOworCisgICAgICAgICAgICAgICAgaWYgKGNoICE9ICcqJyAmJiBjaCAhPSAnLicpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmMgPSBuZ3hfaGFzaF9hZGRfa2V5KCZoYSwgJm5hbWVbc10ubmFtZSwgbmFtZVtzXS5jb3JlX3Nydl9jb25mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR1hfSEFTSF9XSUxEQ0FSRF9LRVkpOworCisgICAgICAgICAgICAgICAgaWYgKHJjID09IE5HWF9FUlJPUikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHJjID09IE5HWF9CVVNZKSB7CisgICAgICAgICAgICAgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19XQVJOLCBjZi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb25mbGljdGluZyBzZXJ2ZXIgbmFtZSBcIiVWXCIsIGlnbm9yZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lW3NdLm5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaGFzaC5rZXkgPSBuZ3hfaGFzaF9rZXlfbGM7CisgICAgICAgICAgICBoYXNoLm1heF9zaXplID0gY21jZi0+c2VydmVyX25hbWVzX2hhc2hfbWF4X3NpemU7CisgICAgICAgICAgICBoYXNoLmJ1Y2tldF9zaXplID0gY21jZi0+c2VydmVyX25hbWVzX2hhc2hfYnVja2V0X3NpemU7CisgICAgICAgICAgICBoYXNoLm5hbWUgPSAic2VydmVyX25hbWVzX2hhc2giOworICAgICAgICAgICAgaGFzaC5wb29sID0gY2YtPnBvb2w7CisKKyAgICAgICAgICAgIGlmIChoYS5rZXlzLm5lbHRzKSB7CisgICAgICAgICAgICAgICAgaGFzaC5oYXNoID0gJmluX2FkZHJbYV0uaGFzaDsKKyAgICAgICAgICAgICAgICBoYXNoLnRlbXBfcG9vbCA9IE5VTEw7CisKKyAgICAgICAgICAgICAgICBpZiAobmd4X2hhc2hfaW5pdCgmaGFzaCwgaGEua2V5cy5lbHRzLCBoYS5rZXlzLm5lbHRzKSAhPSBOR1hfT0spCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBuZ3hfZGVzdHJveV9wb29sKGhhLnRlbXBfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChoYS5kbnNfd2lsZGNhcmRzLm5lbHRzKSB7CisKKyAgICAgICAgICAgICAgICBuZ3hfcXNvcnQoaGEuZG5zX3dpbGRjYXJkcy5lbHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZV90KSBoYS5kbnNfd2lsZGNhcmRzLm5lbHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yobmd4X2hhc2hfa2V5X3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9jbXBfZG5zX3dpbGRjYXJkcyk7CisKKyAgICAgICAgICAgICAgICBoYXNoLmhhc2ggPSBOVUxMOworICAgICAgICAgICAgICAgIGhhc2gudGVtcF9wb29sID0gaGEudGVtcF9wb29sOworCisgICAgICAgICAgICAgICAgaWYgKG5neF9oYXNoX3dpbGRjYXJkX2luaXQoJmhhc2gsIGhhLmRuc193aWxkY2FyZHMuZWx0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYS5kbnNfd2lsZGNhcmRzLm5lbHRzKQorICAgICAgICAgICAgICAgICAgICAhPSBOR1hfT0spCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBuZ3hfZGVzdHJveV9wb29sKGhhLnRlbXBfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpbl9hZGRyW2FdLmRuc193aWxkY2FyZHMgPSAobmd4X2hhc2hfd2lsZGNhcmRfdCAqKSBoYXNoLmhhc2g7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG5neF9kZXN0cm95X3Bvb2woaGEudGVtcF9wb29sKTsKICAgICAgICAgfQogCisgICAgICAgIGluX2FkZHIgPSBpbl9wb3J0W3BdLmFkZHJzLmVsdHM7CisgICAgICAgIGxhc3QgPSBpbl9wb3J0W3BdLmFkZHJzLm5lbHRzOworCiAgICAgICAgIC8qCiAgICAgICAgICAqIGlmIHRoZXJlIGlzIHRoZSBiaW5kaW5nIHRvIHRoZSAiKjpwb3J0IiB0aGVuIHdlIG5lZWQgdG8gYmluZCgpCiAgICAgICAgICAqIHRvIHRoZSAiKjpwb3J0IiBvbmx5IGFuZCBpZ25vcmUgdGhlIG90aGVyIGJpbmRpbmdzCiAgICAgICAgICAqLwogCi0gICAgICAgIGlmIChpbl9hZGRyW2EgLSAxXS5hZGRyID09IElOQUREUl9BTlkgJiYgIXNlcGFyYXRlX2JpbmRpbmcpIHsKLSAgICAgICAgICAgIGEtLTsKKyAgICAgICAgaWYgKGluX2FkZHJbbGFzdCAtIDFdLmFkZHIgPT0gSU5BRERSX0FOWSkgeworICAgICAgICAgICAgaW5fYWRkcltsYXN0IC0gMV0uYmluZCA9IDE7CisgICAgICAgICAgICBiaW5kX2FsbCA9IDA7CiAKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGEgPSAwOworICAgICAgICAgICAgYmluZF9hbGwgPSAxOwogICAgICAgICB9CiAKLSAgICAgICAgaW5fYWRkciA9IGluX3BvcnRbcF0uYWRkcnMuZWx0czsKLSAgICAgICAgd2hpbGUgKGEgPCBpbl9wb3J0W3BdLmFkZHJzLm5lbHRzKSB7CisgICAgICAgIGZvciAoYSA9IDA7IGEgPCBsYXN0OyAvKiB2b2lkICovICkgeworCisgICAgICAgICAgICBpZiAoIWJpbmRfYWxsICYmICFpbl9hZGRyW2FdLmJpbmQpIHsKKyAgICAgICAgICAgICAgICBhKys7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGxzID0gbmd4X2xpc3RlbmluZ19pbmV0X3N0cmVhbV9zb2NrZXQoY2YsIGluX2FkZHJbYV0uYWRkciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5fcG9ydFtwXS5wb3J0KTsKQEAgLTcwNSw2OCArNzExLDk4IEBACiAgICAgICAgICAgICB9CiAjZW5kaWYKIAotICAgICAgICAgICAgbHMtPmJhY2tsb2cgPSBpbl9hZGRyW2FdLmNvbmYuYmFja2xvZzsKLSAgICAgICAgICAgIGxzLT5yY3ZidWYgPSBpbl9hZGRyW2FdLmNvbmYucmN2YnVmOwotICAgICAgICAgICAgbHMtPnNuZGJ1ZiA9IGluX2FkZHJbYV0uY29uZi5zbmRidWY7CisgICAgICAgICAgICBscy0+YmFja2xvZyA9IGluX2FkZHJbYV0ubGlzdGVuX2NvbmYtPmJhY2tsb2c7CisgICAgICAgICAgICBscy0+cmN2YnVmID0gaW5fYWRkclthXS5saXN0ZW5fY29uZi0+cmN2YnVmOworICAgICAgICAgICAgbHMtPnNuZGJ1ZiA9IGluX2FkZHJbYV0ubGlzdGVuX2NvbmYtPnNuZGJ1ZjsKIAogI2lmIChOR1hfSEFWRV9ERUZFUlJFRF9BQ0NFUFQgJiYgZGVmaW5lZCBTT19BQ0NFUFRGSUxURVIpCi0gICAgICAgICAgICBscy0+YWNjZXB0X2ZpbHRlciA9IGluX2FkZHJbYV0uY29uZi5hY2NlcHRfZmlsdGVyOworICAgICAgICAgICAgbHMtPmFjY2VwdF9maWx0ZXIgPSBpbl9hZGRyW2FdLmxpc3Rlbl9jb25mLT5hY2NlcHRfZmlsdGVyOwogI2VuZGlmCiAKICNpZiAoTkdYX0hBVkVfREVGRVJSRURfQUNDRVBUICYmIGRlZmluZWQgVENQX0RFRkVSX0FDQ0VQVCkKLSAgICAgICAgICAgIGxzLT5kZWZlcnJlZF9hY2NlcHQgPSBpbl9hZGRyW2FdLmNvbmYuZGVmZXJyZWRfYWNjZXB0OworICAgICAgICAgICAgbHMtPmRlZmVycmVkX2FjY2VwdCA9IGluX2FkZHJbYV0ubGlzdGVuX2NvbmYtPmRlZmVycmVkX2FjY2VwdDsKICNlbmRpZgogCiAgICAgICAgICAgICBscy0+Y3R4ID0gY3R4OwogCi0gICAgICAgICAgICBpZiAoaW5fcG9ydFtwXS5hZGRycy5uZWx0cyA+IDEpIHsKLQotICAgICAgICAgICAgICAgIGluX2FkZHIgPSBpbl9wb3J0W3BdLmFkZHJzLmVsdHM7Ci0gICAgICAgICAgICAgICAgaWYgKGluX2FkZHJbaW5fcG9ydFtwXS5hZGRycy5uZWx0cyAtIDFdLmFkZHIgIT0gSU5BRERSX0FOWSkgewotCi0gICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAqIGlmIHRoaXMgcG9ydCBoYXMgbm90IHRoZSAiKjpwb3J0IiBiaW5kaW5nIHRoZW4gY3JlYXRlCi0gICAgICAgICAgICAgICAgICAgICAqIHRoZSBzZXBhcmF0ZSBuZ3hfaHR0cF9pbl9wb3J0X3QgZm9yIHRoZSBhbGwgYmluZGluZ3MKLSAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgaW5wb3J0ID0gbmd4X3BhbGxvYyhjZi0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX2luX3BvcnRfdCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaW5wb3J0ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlucG9ydC0+cG9ydCA9IGluX3BvcnRbcF0ucG9ydDsKLSAgICAgICAgICAgICAgICAgICAgaW5wb3J0LT5wb3J0X3RleHQgPSBpbl9wb3J0W3BdLnBvcnRfdGV4dDsKLQotICAgICAgICAgICAgICAgICAgICAvKiBpbml0IGxpc3Qgb2YgdGhlIGFkZHJlc3NlcyAuLi4gKi8KLQotICAgICAgICAgICAgICAgICAgICBpZiAobmd4X2FycmF5X2luaXQoJmlucG9ydC0+YWRkcnMsIGNmLT5wb29sLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5neF9odHRwX2luX2FkZHJfdCkpICE9IE5HWF9PSykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogLi4uIGFuZCBzZXQgdXAgaXQgd2l0aCB0aGUgZmlyc3QgYWRkcmVzcyAqLwotCi0gICAgICAgICAgICAgICAgICAgIGlucG9ydC0+YWRkcnMubmVsdHMgPSAxOwotICAgICAgICAgICAgICAgICAgICBpbnBvcnQtPmFkZHJzLmVsdHMgPSBpbl9wb3J0W3BdLmFkZHJzLmVsdHM7Ci0KLSAgICAgICAgICAgICAgICAgICAgbHMtPnNlcnZlcnMgPSBpbnBvcnQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogcHJlcGFyZSBmb3IgdGhlIG5leHQgY3ljbGUgKi8KLQotICAgICAgICAgICAgICAgICAgICBpbl9wb3J0W3BdLmFkZHJzLmVsdHMgPSAoY2hhciAqKSBpbl9wb3J0W3BdLmFkZHJzLmVsdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaW5fcG9ydFtwXS5hZGRycy5zaXplOwotICAgICAgICAgICAgICAgICAgICBpbl9wb3J0W3BdLmFkZHJzLm5lbHRzLS07Ci0KLSAgICAgICAgICAgICAgICAgICAgaW5fYWRkciA9IChuZ3hfaHR0cF9pbl9hZGRyX3QgKikgaW5fcG9ydFtwXS5hZGRycy5lbHRzOwotICAgICAgICAgICAgICAgICAgICBhID0gMDsKLQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBoaXAgPSBuZ3hfcGFsbG9jKGNmLT5wb29sLCBzaXplb2Yobmd4X2h0dHBfaW5fcG9ydF90KSk7CisgICAgICAgICAgICBpZiAoaGlwID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGxzLT5zZXJ2ZXJzID0gJmluX3BvcnRbcF07Ci0gICAgICAgICAgICBhKys7CisgICAgICAgICAgICBoaXAtPnBvcnQgPSBpbl9wb3J0W3BdLnBvcnQ7CisKKyAgICAgICAgICAgIGhpcC0+cG9ydF90ZXh0LmRhdGEgPSBuZ3hfcGFsbG9jKGNmLT5wb29sLCA3KTsKKyAgICAgICAgICAgIGlmIChoaXAtPnBvcnRfdGV4dC5kYXRhID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxzLT5zZXJ2ZXJzID0gaGlwOworCisgICAgICAgICAgICBoaXAtPnBvcnRfdGV4dC5sZW4gPSBuZ3hfc3ByaW50ZihoaXAtPnBvcnRfdGV4dC5kYXRhLCAiOiVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpcC0+cG9ydCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gaGlwLT5wb3J0X3RleHQuZGF0YTsKKworICAgICAgICAgICAgaW5fYWRkciA9IGluX3BvcnRbcF0uYWRkcnMuZWx0czsKKworICAgICAgICAgICAgaWYgKGluX2FkZHJbYV0uYmluZCAmJiBpbl9hZGRyW2FdLmFkZHIgIT0gSU5BRERSX0FOWSkgeworICAgICAgICAgICAgICAgIGhpcC0+bmFkZHJzID0gMTsKKyAgICAgICAgICAgICAgICBkb25lID0gMDsKKworICAgICAgICAgICAgfSBlbHNlIGlmIChpbl9wb3J0W3BdLmFkZHJzLm5lbHRzID4gMQorICAgICAgICAgICAgICAgICAgICAgICAmJiBpbl9hZGRyW2xhc3QgLSAxXS5hZGRyID09IElOQUREUl9BTlkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaGlwLT5uYWRkcnMgPSBsYXN0OworICAgICAgICAgICAgICAgIGRvbmUgPSAxOworCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGhpcC0+bmFkZHJzID0gMTsKKyAgICAgICAgICAgICAgICBkb25lID0gMDsKKyAgICAgICAgICAgIH0KKworI2lmIDAKKyAgICAgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19BTEVSVCwgY2YtPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiV1aTogJVYgJWQgJXVpICV1aSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGEsICZscy0+YWRkcl90ZXh0LCBpbl9hZGRyW2FdLmJpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhpcC0+bmFkZHJzLCBsYXN0KTsKKyNlbmRpZgorCisgICAgICAgICAgICBoaXAtPmFkZHJzID0gbmd4X3BjYWxsb2MoY2YtPnBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlwLT5uYWRkcnMgKiBzaXplb2Yobmd4X2h0dHBfaW5fYWRkcl90KSk7CisgICAgICAgICAgICBpZiAoaGlwLT5hZGRycyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaGlwLT5uYWRkcnM7IGkrKykgeworICAgICAgICAgICAgICAgIGhpcC0+YWRkcnNbaV0uYWRkciA9IGluX2FkZHJbaV0uYWRkcjsKKyAgICAgICAgICAgICAgICBoaXAtPmFkZHJzW2ldLmNvcmVfc3J2X2NvbmYgPSBpbl9hZGRyW2ldLmNvcmVfc3J2X2NvbmY7CisKKyAgICAgICAgICAgICAgICBpZiAoaW5fYWRkcltpXS5oYXNoLmJ1Y2tldHMgPT0gTlVMTAorICAgICAgICAgICAgICAgICAgICAmJiAoaW5fYWRkcltpXS5kbnNfd2lsZGNhcmRzID09IE5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IGluX2FkZHJbaV0uZG5zX3dpbGRjYXJkcy0+aGFzaC5idWNrZXRzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdm4gPSBuZ3hfcGFsbG9jKGNmLT5wb29sLCBzaXplb2Yobmd4X2h0dHBfdmlydHVhbF9uYW1lc190KSk7CisgICAgICAgICAgICAgICAgaWYgKHZuID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBoaXAtPmFkZHJzW2ldLnZpcnR1YWxfbmFtZXMgPSB2bjsKKworICAgICAgICAgICAgICAgIHZuLT5oYXNoID0gaW5fYWRkcltpXS5oYXNoOworICAgICAgICAgICAgICAgIHZuLT5kbnNfd2lsZGNhcmRzID0gaW5fYWRkcltpXS5kbnNfd2lsZGNhcmRzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZG9uZSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbl9hZGRyKys7CisgICAgICAgICAgICBpbl9wb3J0W3BdLmFkZHJzLmVsdHMgPSBpbl9hZGRyOworICAgICAgICAgICAgbGFzdC0tOworCisgICAgICAgICAgICBhID0gMDsKICAgICAgICAgfQogICAgIH0KIApAQCAtNzg1LDEyICs4MjEsMTIgQEAKICAgICAgICAgICAgIG5neF9sb2dfZGVidWczKE5HWF9MT0dfREVCVUdfSFRUUCwgY2YtPmxvZywgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczolZCAlcCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLCBpbl9wb3J0W3BdLnBvcnQsIGluX2FkZHJbYV0uY29yZV9zcnZfY29uZik7Ci0gICAgICAgICAgICBzX25hbWUgPSBpbl9hZGRyW2FdLm5hbWVzLmVsdHM7CisgICAgICAgICAgICBuYW1lID0gaW5fYWRkclthXS5uYW1lcy5lbHRzOwogICAgICAgICAgICAgZm9yIChuID0gMDsgbiA8IGluX2FkZHJbYV0ubmFtZXMubmVsdHM7IG4rKykgewogICAgICAgICAgICAgICAgICBuZ3hfbG9nX2RlYnVnNChOR1hfTE9HX0RFQlVHX0hUVFAsIGNmLT5sb2csIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczolZCAlViAlcCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsIGluX3BvcnRbcF0ucG9ydCwgJnNfbmFtZVtuXS5uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzX25hbWVbbl0uY29yZV9zcnZfY29uZik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsIGluX3BvcnRbcF0ucG9ydCwgJm5hbWVbbl0ubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZVtuXS5jb3JlX3Nydl9jb25mKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTgwMSwzMCArODM3LDIwIEBACiB9CiAKIAotc3RhdGljIGludCBuZ3hfbGliY19jZGVjbAotbmd4X2NtcF9zZXJ2ZXJfbmFtZXMoY29uc3Qgdm9pZCAqb25lLCBjb25zdCB2b2lkICp0d28pCi17Ci0gICAgbmd4X2h0dHBfc2VydmVyX25hbWVfdCAqZmlyc3QgPSAobmd4X2h0dHBfc2VydmVyX25hbWVfdCAqKSBvbmU7Ci0gICAgbmd4X2h0dHBfc2VydmVyX25hbWVfdCAqc2Vjb25kID0gKG5neF9odHRwX3NlcnZlcl9uYW1lX3QgKikgdHdvOwotCi0gICAgcmV0dXJuIG5neF9zdHJjbXAoZmlyc3QtPm5hbWUuZGF0YSwgc2Vjb25kLT5uYW1lLmRhdGEpOwotfQotCi0KIC8qCiAgKiBhZGQgdGhlIHNlcnZlciBhZGRyZXNzLCB0aGUgc2VydmVyIG5hbWVzIGFuZCB0aGUgc2VydmVyIGNvcmUgbW9kdWxlCiAgKiBjb25maWd1cmF0aW9ucyB0byB0aGUgcG9ydCAoaW5fcG9ydCkKICAqLwogCiBzdGF0aWMgbmd4X2ludF90Ci1uZ3hfaHR0cF9hZGRfYWRkcmVzcyhuZ3hfY29uZl90ICpjZiwgbmd4X2h0dHBfaW5fcG9ydF90ICppbl9wb3J0LAorbmd4X2h0dHBfYWRkX2FkZHJlc3Mobmd4X2NvbmZfdCAqY2YsIG5neF9odHRwX2NvbmZfaW5fcG9ydF90ICppbl9wb3J0LAogICAgIG5neF9odHRwX2xpc3Rlbl90ICpsc2NmLCBuZ3hfaHR0cF9jb3JlX3Nydl9jb25mX3QgKmNzY2YpCiB7Ci0gICAgbmd4X2h0dHBfaW5fYWRkcl90ICAqaW5fYWRkcjsKKyAgICBuZ3hfaHR0cF9jb25mX2luX2FkZHJfdCAgKmluX2FkZHI7CiAKICAgICBpZiAoaW5fcG9ydC0+YWRkcnMuZWx0cyA9PSBOVUxMKSB7Ci0gICAgICAgIGlmIChuZ3hfYXJyYXlfaW5pdCgmaW5fcG9ydC0+YWRkcnMsIGNmLT5wb29sLCA0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5neF9odHRwX2luX2FkZHJfdCkpICE9IE5HWF9PSykKKyAgICAgICAgaWYgKG5neF9hcnJheV9pbml0KCZpbl9wb3J0LT5hZGRycywgY2YtPnRlbXBfcG9vbCwgNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfaHR0cF9jb25mX2luX2FkZHJfdCkpICE9IE5HWF9PSykKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICAgICAgfQpAQCAtODM2LDExICs4NjIsMTQgQEAKICAgICB9CiAKICAgICBpbl9hZGRyLT5hZGRyID0gbHNjZi0+YWRkcjsKKyAgICBpbl9hZGRyLT5oYXNoLmJ1Y2tldHMgPSBOVUxMOworICAgIGluX2FkZHItPmhhc2guc2l6ZSA9IDA7CisgICAgaW5fYWRkci0+ZG5zX3dpbGRjYXJkcyA9IE5VTEw7CiAgICAgaW5fYWRkci0+bmFtZXMuZWx0cyA9IE5VTEw7Ci0gICAgaW5fYWRkci0+aGFzaCA9IE5VTEw7Ci0gICAgaW5fYWRkci0+d2lsZGNhcmRzLmVsdHMgPSBOVUxMOwogICAgIGluX2FkZHItPmNvcmVfc3J2X2NvbmYgPSBjc2NmOwotICAgIGluX2FkZHItPmNvbmYgPSBsc2NmLT5jb25mOworICAgIGluX2FkZHItPmRlZmF1bHRfc2VydmVyID0gbHNjZi0+Y29uZi5kZWZhdWx0X3NlcnZlcjsKKyAgICBpbl9hZGRyLT5iaW5kID0gbHNjZi0+Y29uZi5iaW5kOworICAgIGluX2FkZHItPmxpc3Rlbl9jb25mID0gJmxzY2YtPmNvbmY7CiAKICNpZiAoTkdYX0RFQlVHKQogICAgIHsKQEAgLTg2MSwyMyArODkwLDE0IEBACiAgKi8KIAogc3RhdGljIG5neF9pbnRfdAotbmd4X2h0dHBfYWRkX25hbWVzKG5neF9jb25mX3QgKmNmLCBuZ3hfaHR0cF9pbl9hZGRyX3QgKmluX2FkZHIsCituZ3hfaHR0cF9hZGRfbmFtZXMobmd4X2NvbmZfdCAqY2YsIG5neF9odHRwX2NvbmZfaW5fYWRkcl90ICppbl9hZGRyLAogICAgIG5neF9odHRwX2NvcmVfc3J2X2NvbmZfdCAqY3NjZikKIHsKICAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgaSwgbjsKLSAgICBuZ3hfYXJyYXlfdCAgICAgICAgICAgICAqYXJyYXk7CiAgICAgbmd4X2h0dHBfc2VydmVyX25hbWVfdCAgKnNlcnZlcl9uYW1lcywgKm5hbWU7CiAKICAgICBpZiAoaW5fYWRkci0+bmFtZXMuZWx0cyA9PSBOVUxMKSB7Ci0gICAgICAgIGlmIChuZ3hfYXJyYXlfaW5pdCgmaW5fYWRkci0+bmFtZXMsIGNmLT5wb29sLCA0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5neF9odHRwX3NlcnZlcl9uYW1lX3QpKSAhPSBOR1hfT0spCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoaW5fYWRkci0+d2lsZGNhcmRzLmVsdHMgPT0gTlVMTCkgewotICAgICAgICBpZiAobmd4X2FycmF5X2luaXQoJmluX2FkZHItPndpbGRjYXJkcywgY2YtPnBvb2wsIDEsCisgICAgICAgIGlmIChuZ3hfYXJyYXlfaW5pdCgmaW5fYWRkci0+bmFtZXMsIGNmLT50ZW1wX3Bvb2wsIDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yobmd4X2h0dHBfc2VydmVyX25hbWVfdCkpICE9IE5HWF9PSykKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKQEAgLTg5NSwxNyArOTE1LDggQEAKICAgICAgICAgbmd4X2xvZ19kZWJ1ZzEoTkdYX0xPR19ERUJVR19IVFRQLCBjZi0+bG9nLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAibmFtZTogJVYiLCAmc2VydmVyX25hbWVzW2ldLm5hbWUpOwogCi0gICAgICAgIC8qIFRPRE86IGR1cGxpY2F0ZSBuYW1lcyBjYW4gYmUgY2hlY2tlZCBoZXJlICovCiAKLQotICAgICAgICBpZiAoc2VydmVyX25hbWVzW2ldLndpbGRjYXJkKSB7Ci0gICAgICAgICAgICBhcnJheSA9ICZpbl9hZGRyLT53aWxkY2FyZHM7Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFycmF5ID0gJmluX2FkZHItPm5hbWVzOwotICAgICAgICB9Ci0KLSAgICAgICAgbmFtZSA9IG5neF9hcnJheV9wdXNoKGFycmF5KTsKKyAgICAgICAgbmFtZSA9IG5neF9hcnJheV9wdXNoKCZpbl9hZGRyLT5uYW1lcyk7CiAgICAgICAgIGlmIChuYW1lID09IE5VTEwpIHsKICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgICAgIH0KQEAgLTkyNiw3ICs5MzcsNyBAQAogICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICBpOwogICAgIG5neF9odHRwX2NvcmVfbG9jX2NvbmZfdCAgKipjbGNmcDsKIAotICAgIGNsY2ZwID0gLyogKG5neF9odHRwX2NvcmVfbG9jX2NvbmZfdCAqKikgKi8gbG9jYXRpb25zLT5lbHRzOworICAgIGNsY2ZwID0gbG9jYXRpb25zLT5lbHRzOwogCiAgICAgZm9yIChpID0gMDsgaSA8IGxvY2F0aW9ucy0+bmVsdHM7IGkrKykgewogICAgICAgICBydiA9IG1vZHVsZS0+bWVyZ2VfbG9jX2NvbmYoY2YsIGxvY19jb25mW2N0eF9pbmRleF0sCkBAIC05NDQsMyArOTU1LDQ0IEBACiAKICAgICByZXR1cm4gTkdYX0NPTkZfT0s7CiB9CisKKworc3RhdGljIGludCBuZ3hfbGliY19jZGVjbAorbmd4X2h0dHBfY21wX2NvbmZfaW5fYWRkcnMoY29uc3Qgdm9pZCAqb25lLCBjb25zdCB2b2lkICp0d28pCit7CisgICAgbmd4X2h0dHBfY29uZl9pbl9hZGRyX3QgICpmaXJzdCwgKnNlY29uZDsKKworICAgIGZpcnN0ID0gKG5neF9odHRwX2NvbmZfaW5fYWRkcl90ICopIG9uZTsKKyAgICBzZWNvbmQgPSAobmd4X2h0dHBfY29uZl9pbl9hZGRyX3QgKikgdHdvOworCisgICAgaWYgKGZpcnN0LT5hZGRyID09IElOQUREUl9BTlkpIHsKKyAgICAgICAgLyogdGhlIElOQUREUl9BTlkgbXVzdCBiZSB0aGUgbGFzdCByZXNvcnQsIHNoaWZ0IGl0IHRvIHRoZSBlbmQgKi8KKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgaWYgKGZpcnN0LT5iaW5kICYmICFzZWNvbmQtPmJpbmQpIHsKKyAgICAgICAgLyogc2hpZnQgZXhwbGljaXQgYmluZCgpZWQgYWRkcmVzc2VzIHRvIHRoZSBzdGFydCAqLworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKCFmaXJzdC0+YmluZCAmJiBzZWNvbmQtPmJpbmQpIHsKKyAgICAgICAgLyogc2hpZnQgZXhwbGljaXQgYmluZCgpZWQgYWRkcmVzc2VzIHRvIHRoZSBzdGFydCAqLworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICAvKiBkbyBub3Qgc29ydCBieSBkZWZhdWx0ICovCisKKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IG5neF9saWJjX2NkZWNsCituZ3hfaHR0cF9jbXBfZG5zX3dpbGRjYXJkcyhjb25zdCB2b2lkICpvbmUsIGNvbnN0IHZvaWQgKnR3bykKK3sKKyAgICBuZ3hfaGFzaF9rZXlfdCAgKmZpcnN0LCAqc2Vjb25kOworCisgICAgZmlyc3QgPSAobmd4X2hhc2hfa2V5X3QgKikgb25lOworICAgIHNlY29uZCA9IChuZ3hfaGFzaF9rZXlfdCAqKSB0d287CisKKyAgICByZXR1cm4gbmd4X3N0cmNtcChmaXJzdC0+a2V5LmRhdGEsIHNlY29uZC0+a2V5LmRhdGEpOworfQpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbmd4X2h0dHAuaCBiL3NyYy9odHRwL25neF9odHRwLmgKaW5kZXggZGRjZDFiZS4uYjllMTI0ZCAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbmd4X2h0dHAuaAorKysgYi9zcmMvaHR0cC9uZ3hfaHR0cC5oCkBAIC0xNiw3ICsxNiw2IEBACiB0eXBlZGVmIHN0cnVjdCBuZ3hfaHR0cF9yZXF1ZXN0X3MgICBuZ3hfaHR0cF9yZXF1ZXN0X3Q7CiB0eXBlZGVmIHN0cnVjdCBuZ3hfaHR0cF91cHN0cmVhbV9zICBuZ3hfaHR0cF91cHN0cmVhbV90OwogdHlwZWRlZiBzdHJ1Y3Qgbmd4X2h0dHBfbG9nX2N0eF9zICAgbmd4X2h0dHBfbG9nX2N0eF90OwotdHlwZWRlZiBzdHJ1Y3Qgbmd4X2h0dHBfaW5fYWRkcl9zICAgbmd4X2h0dHBfaW5fYWRkcl90OwogCiB0eXBlZGVmIG5neF9pbnRfdCAoKm5neF9odHRwX2hlYWRlcl9oYW5kbGVyX3B0KShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCiAgICAgbmd4X3RhYmxlX2VsdF90ICpoLCBuZ3hfdWludF90IG9mZnNldCk7CmRpZmYgLS1naXQgYS9zcmMvaHR0cC9uZ3hfaHR0cF9jb25maWcuYyBiL3NyYy9odHRwL25neF9odHRwX2NvbmZpZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjU2MjVkLi4wMDAwMDAwCi0tLSBhL3NyYy9odHRwL25neF9odHRwX2NvbmZpZy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLQotLyoKLSAqIENvcHlyaWdodCAoQykgSWdvciBTeXNvZXYKLSAqLwotCi0KLSNpbmNsdWRlIDxuZ3hfY29uZmlnLmg+Ci0jaW5jbHVkZSA8bmd4X2NvcmUuaD4KLSNpbmNsdWRlIDxuZ3hfZXZlbnQuaD4KLSNpbmNsdWRlIDxuZ3hfaHR0cC5oPgotCi0KLW5neF9pbnRfdAotbmd4X2h0dHBfY29uZmlnX2FkZF9oYXNoKG5neF9odHRwX2hhc2hfY29uZl90ICpoLCBuZ3hfc3RyX3QgKmtleSwgdm9pZCAqdmFsdWUsCi0gICAgbmd4X3VpbnRfdCBmbGFncykKLXsKLSAgICBzaXplX3QgICAgICAgICAgIGxlbjsKLSAgICBuZ3hfc3RyX3QgICAgICAgKm5hbWU7Ci0gICAgbmd4X3VpbnRfdCAgICAgICBpLCBrLCBuLCBza2lwOwotICAgIG5neF9oYXNoX2tleV90ICAqaGs7Ci0gICAgdV9jaGFyICAgICAgICAgICBidWZbMjA0OF07Ci0KLSAgICBpZiAoIShmbGFncyAmIE5HWF9IVFRQX1dJTERDQVJEX0hBU0gpKSB7Ci0KLSAgICAgICAgLyogZXhhY3QgaGFzaCAqLwotCi0gICAgICAgIGsgPSAwOwotCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBrZXktPmxlbjsgaSsrKSB7Ci0gICAgICAgICAgICBrZXktPmRhdGFbaV0gPSBuZ3hfdG9sb3dlcihrZXktPmRhdGFbaV0pOwotICAgICAgICAgICAgayA9IG5neF9oYXNoKGssIGtleS0+ZGF0YVtpXSk7Ci0gICAgICAgIH0KLQotICAgICAgICBrICU9IE5HWF9IVFRQX0NPTkZJR19IQVNIOwotCi0gICAgICAgIC8qIGNoZWNrIGNvbmZsaWN0cyBpbiBleGFjdCBoYXNoICovCi0KLSAgICAgICAgbmFtZSA9IGgtPmtleXNfaGFzaFtrXS5lbHRzOwotCi0gICAgICAgIGlmIChuYW1lKSB7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaC0+a2V5c19oYXNoW2tdLm5lbHRzOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoa2V5LT5sZW4gIT0gbmFtZVtpXS5sZW4pIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5neF9zdHJuY21wKGtleS0+ZGF0YSwgbmFtZVtpXS5kYXRhLCBrZXktPmxlbikgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0JVU1k7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobmd4X2FycmF5X2luaXQoJmgtPmtleXNfaGFzaFtrXSwgaC0+dGVtcF9wb29sLCA0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfc3RyX3QpKQotICAgICAgICAgICAgICAgICE9IE5HWF9PSykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgbmFtZSA9IG5neF9hcnJheV9wdXNoKCZoLT5rZXlzX2hhc2hba10pOwotICAgICAgICBpZiAobmFtZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICAgICAgKm5hbWUgPSAqa2V5OwotCi0gICAgICAgIGhrID0gbmd4X2FycmF5X3B1c2goJmgtPmtleXMpOwotICAgICAgICBpZiAoaGsgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIGhrLT5rZXkgPSAqa2V5OwotICAgICAgICBoay0+a2V5X2hhc2ggPSBuZ3hfaGFzaF9rZXkoa2V5LT5kYXRhLCBrZXktPmxlbik7Ci0gICAgICAgIGhrLT52YWx1ZSA9IHZhbHVlOwotCi0gICAgfSBlbHNlIHsKLQotICAgICAgICAvKiB3aWxkY2FyZCBoYXNoICovCi0KLSAgICAgICAgc2tpcCA9IChrZXktPmRhdGFbMF0gPT0gJyonKSA/IDIgOiAxOwotICAgICAgICBrID0gMDsKLQotICAgICAgICBmb3IgKGkgPSBza2lwOyBpIDwga2V5LT5sZW47IGkrKykgewotICAgICAgICAgICAga2V5LT5kYXRhW2ldID0gbmd4X3RvbG93ZXIoa2V5LT5kYXRhW2ldKTsKLSAgICAgICAgICAgIGsgPSBuZ3hfaGFzaChrLCBrZXktPmRhdGFbaV0pOwotICAgICAgICB9Ci0KLSAgICAgICAgayAlPSBOR1hfSFRUUF9DT05GSUdfSEFTSDsKLQotICAgICAgICBpZiAoc2tpcCA9PSAxKSB7Ci0KLSAgICAgICAgICAgIC8qIGNoZWNrIGNvbmZsaWN0cyBpbiBleGFjdCBoYXNoIGZvciAiLmV4YW1wbGUuY29tIiAqLwotCi0gICAgICAgICAgICBuYW1lID0gaC0+a2V5c19oYXNoW2tdLmVsdHM7Ci0KLSAgICAgICAgICAgIGlmIChuYW1lKSB7Ci0gICAgICAgICAgICAgICAgbGVuID0ga2V5LT5sZW4gLSBza2lwOwotCi0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGgtPmtleXNfaGFzaFtrXS5uZWx0czsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsZW4gIT0gbmFtZVtpXS5sZW4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG5neF9zdHJuY21wKCZrZXktPmRhdGFbMV0sIG5hbWVbaV0uZGF0YSwgbGVuKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0JVU1k7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKG5neF9hcnJheV9pbml0KCZoLT5rZXlzX2hhc2hba10sIGgtPnRlbXBfcG9vbCwgNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5neF9zdHJfdCkpCi0gICAgICAgICAgICAgICAgICAgICE9IE5HWF9PSykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBuYW1lID0gbmd4X2FycmF5X3B1c2goJmgtPmtleXNfaGFzaFtrXSk7Ci0gICAgICAgICAgICBpZiAobmFtZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbmFtZS0+bGVuID0ga2V5LT5sZW4gLSAxOwotICAgICAgICAgICAgbmFtZS0+ZGF0YSA9IG5neF9wYWxsb2MoaC0+dGVtcF9wb29sLCBuYW1lLT5sZW4pOwotICAgICAgICAgICAgaWYgKG5hbWUtPmRhdGEgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG5neF9tZW1jcHkobmFtZS0+ZGF0YSwgJmtleS0+ZGF0YVsxXSwgbmFtZS0+bGVuKTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgLyoKLSAgICAgICAgICogY29udmVydCAiKi5leGFtcGxlLmNvbSIgdG8gImNvbS5leGFtcGxlLlwwIgotICAgICAgICAgKiAgICAgIGFuZCAiLmV4YW1wbGUuY29tIiB0byAiY29tLmV4YW1wbGVcMCIKLSAgICAgICAgICovCi0KLSAgICAgICAgbGVuID0gMDsKLSAgICAgICAgbiA9IDA7Ci0KLSAgICAgICAgZm9yIChpID0ga2V5LT5sZW4gLSAxOyBpOyBpLS0pIHsKLSAgICAgICAgICAgIGlmIChrZXktPmRhdGFbaV0gPT0gJy4nKSB7Ci0gICAgICAgICAgICAgICAgbmd4X21lbWNweSgmYnVmW25dLCAma2V5LT5kYXRhW2kgKyAxXSwgbGVuKTsKLSAgICAgICAgICAgICAgICBuICs9IGxlbjsKLSAgICAgICAgICAgICAgICBidWZbbisrXSA9ICcuJzsKLSAgICAgICAgICAgICAgICBsZW4gPSAwOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBsZW4rKzsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsZW4pIHsKLSAgICAgICAgICAgIG5neF9tZW1jcHkoJmJ1ZltuXSwgJmtleS0+ZGF0YVsxXSwgbGVuKTsKLSAgICAgICAgICAgIG4gKz0gbGVuOwotICAgICAgICB9Ci0KLSAgICAgICAgYnVmW25dID0gJ1wwJzsKLQotCi0gICAgICAgIC8qIGNoZWNrIGNvbmZsaWN0cyBpbiB3aWxkY2FyZCBoYXNoICovCi0KLSAgICAgICAgbmFtZSA9IGgtPmRuc19oYXNoW2tdLmVsdHM7Ci0KLSAgICAgICAgaWYgKG5hbWUpIHsKLSAgICAgICAgICAgIGxlbiA9IGtleS0+bGVuIC0gc2tpcDsKLQotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGgtPmRuc19oYXNoW2tdLm5lbHRzOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAobGVuICE9IG5hbWVbaV0ubGVuKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuZ3hfc3RybmNtcChrZXktPmRhdGEgKyBza2lwLCBuYW1lW2ldLmRhdGEsIGxlbikgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0JVU1k7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobmd4X2FycmF5X2luaXQoJmgtPmRuc19oYXNoW2tdLCBoLT50ZW1wX3Bvb2wsIDQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5neF9zdHJfdCkpCi0gICAgICAgICAgICAgICAgIT0gTkdYX09LKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBuYW1lID0gbmd4X2FycmF5X3B1c2goJmgtPmRuc19oYXNoW2tdKTsKLSAgICAgICAgaWYgKG5hbWUgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIG5hbWUtPmxlbiA9IGtleS0+bGVuIC0gc2tpcDsKLSAgICAgICAgbmFtZS0+ZGF0YSA9IG5neF9wYWxsb2MoaC0+dGVtcF9wb29sLCBuYW1lLT5sZW4pOwotICAgICAgICBpZiAobmFtZS0+ZGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwotICAgICAgICB9Ci0gICAgICAgIG5neF9tZW1jcHkobmFtZS0+ZGF0YSwga2V5LT5kYXRhICsgc2tpcCwgbmFtZS0+bGVuKTsKLQotCi0gICAgICAgIG5neF9tZW1jcHkoa2V5LT5kYXRhLCBidWYsIGtleS0+bGVuKTsKLSAgICAgICAga2V5LT5sZW4tLTsKLQotICAgICAgICBoayA9IG5neF9hcnJheV9wdXNoKCZoLT5kbnNfd2lsZGNhcmRzKTsKLSAgICAgICAgaWYgKGhrID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICBoay0+a2V5ID0gKmtleTsKLSAgICAgICAgaGstPmtleV9oYXNoID0gMDsKLSAgICAgICAgaGstPnZhbHVlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgcmV0dXJuIE5HWF9PSzsKLX0KZGlmZiAtLWdpdCBhL3NyYy9odHRwL25neF9odHRwX2NvbmZpZy5oIGIvc3JjL2h0dHAvbmd4X2h0dHBfY29uZmlnLmgKaW5kZXggNDc2ODA4NS4uODQ4MTZhZSAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbmd4X2h0dHBfY29uZmlnLmgKKysrIGIvc3JjL2h0dHAvbmd4X2h0dHBfY29uZmlnLmgKQEAgLTcyLDI1ICs3Miw0IEBACiAgICAgICAgICBjeWNsZS0+Y29uZl9jdHhbbmd4X2h0dHBfbW9kdWxlLmluZGV4XSktPm1haW5fY29uZlttb2R1bGUuY3R4X2luZGV4XQogCiAKLSNkZWZpbmUgTkdYX0hUVFBfQ09ORklHX0hBU0ggICAgMTAwMDcKLQotI2RlZmluZSBOR1hfSFRUUF9XSUxEQ0FSRF9IQVNIICAxCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBuZ3hfcG9vbF90ICAgKnBvb2w7Ci0gICAgbmd4X3Bvb2xfdCAgICp0ZW1wX3Bvb2w7Ci0KLSAgICBuZ3hfYXJyYXlfdCAgIGtleXM7Ci0gICAgbmd4X2FycmF5X3QgICprZXlzX2hhc2g7Ci0KLSAgICBuZ3hfYXJyYXlfdCAgIGRuc193aWxkY2FyZHM7Ci0gICAgbmd4X2FycmF5X3QgICpkbnNfaGFzaDsKLX0gbmd4X2h0dHBfaGFzaF9jb25mX3Q7Ci0KLQotbmd4X2ludF90IG5neF9odHRwX2NvbmZpZ19hZGRfaGFzaChuZ3hfaHR0cF9oYXNoX2NvbmZfdCAqaCwgbmd4X3N0cl90ICprZXksCi0gICAgdm9pZCAqdmFsdWUsIG5neF91aW50X3QgZmxhZ3MpOwotCi0KLQogI2VuZGlmIC8qIF9OR1hfSFRUUF9DT05GSUdfSF9JTkNMVURFRF8gKi8KZGlmZiAtLWdpdCBhL3NyYy9odHRwL25neF9odHRwX2NvcmVfbW9kdWxlLmMgYi9zcmMvaHR0cC9uZ3hfaHR0cF9jb3JlX21vZHVsZS5jCmluZGV4IGU0MjAyM2IuLjRmYTkxMDMgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL25neF9odHRwX2NvcmVfbW9kdWxlLmMKKysrIGIvc3JjL2h0dHAvbmd4X2h0dHBfY29yZV9tb2R1bGUuYwpAQCAtNzMsMTggKzczLDE4IEBACiAKIHN0YXRpYyBuZ3hfY29tbWFuZF90ICBuZ3hfaHR0cF9jb3JlX2NvbW1hbmRzW10gPSB7CiAKLSAgICB7IG5neF9zdHJpbmcoInNlcnZlcl9uYW1lc19oYXNoIiksCisgICAgeyBuZ3hfc3RyaW5nKCJzZXJ2ZXJfbmFtZXNfaGFzaF9tYXhfc2l6ZSIpLAogICAgICAgTkdYX0hUVFBfTUFJTl9DT05GfE5HWF9DT05GX1RBS0UxLAogICAgICAgbmd4X2NvbmZfc2V0X251bV9zbG90LAogICAgICAgTkdYX0hUVFBfTUFJTl9DT05GX09GRlNFVCwKLSAgICAgIG9mZnNldG9mKG5neF9odHRwX2NvcmVfbWFpbl9jb25mX3QsIHNlcnZlcl9uYW1lc19oYXNoKSwKKyAgICAgIG9mZnNldG9mKG5neF9odHRwX2NvcmVfbWFpbl9jb25mX3QsIHNlcnZlcl9uYW1lc19oYXNoX21heF9zaXplKSwKICAgICAgIE5VTEwgfSwKIAotICAgIHsgbmd4X3N0cmluZygic2VydmVyX25hbWVzX2hhc2hfdGhyZXNob2xkIiksCisgICAgeyBuZ3hfc3RyaW5nKCJzZXJ2ZXJfbmFtZXNfaGFzaF9idWNrZXRfc2l6ZSIpLAogICAgICAgTkdYX0hUVFBfTUFJTl9DT05GfE5HWF9DT05GX1RBS0UxLAogICAgICAgbmd4X2NvbmZfc2V0X251bV9zbG90LAogICAgICAgTkdYX0hUVFBfTUFJTl9DT05GX09GRlNFVCwKLSAgICAgIG9mZnNldG9mKG5neF9odHRwX2NvcmVfbWFpbl9jb25mX3QsIHNlcnZlcl9uYW1lc19oYXNoX3RocmVzaG9sZCksCisgICAgICBvZmZzZXRvZihuZ3hfaHR0cF9jb3JlX21haW5fY29uZl90LCBzZXJ2ZXJfbmFtZXNfaGFzaF9idWNrZXRfc2l6ZSksCiAgICAgICBOVUxMIH0sCiAKICAgICB7IG5neF9zdHJpbmcoInNlcnZlciIpLApAQCAtMTcxNSw4ICsxNzE1LDggQEAKICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgIH0KIAotICAgIGNtY2YtPnNlcnZlcl9uYW1lc19oYXNoID0gTkdYX0NPTkZfVU5TRVRfVUlOVDsKLSAgICBjbWNmLT5zZXJ2ZXJfbmFtZXNfaGFzaF90aHJlc2hvbGQgPSBOR1hfQ09ORl9VTlNFVF9VSU5UOworICAgIGNtY2YtPnNlcnZlcl9uYW1lc19oYXNoX21heF9zaXplID0gTkdYX0NPTkZfVU5TRVRfVUlOVDsKKyAgICBjbWNmLT5zZXJ2ZXJfbmFtZXNfaGFzaF9idWNrZXRfc2l6ZSA9IE5HWF9DT05GX1VOU0VUX1VJTlQ7CiAKICAgICByZXR1cm4gY21jZjsKIH0KQEAgLTE3MjcsMTQgKzE3MjcsMTcgQEAKIHsKICAgICBuZ3hfaHR0cF9jb3JlX21haW5fY29uZl90ICpjbWNmID0gY29uZjsKIAotICAgIGlmIChjbWNmLT5zZXJ2ZXJfbmFtZXNfaGFzaCA9PSBOR1hfQ09ORl9VTlNFVF9VSU5UKSB7Ci0gICAgICAgIGNtY2YtPnNlcnZlcl9uYW1lc19oYXNoID0gMTAwOTsKKyAgICBpZiAoY21jZi0+c2VydmVyX25hbWVzX2hhc2hfbWF4X3NpemUgPT0gTkdYX0NPTkZfVU5TRVRfVUlOVCkgeworICAgICAgICBjbWNmLT5zZXJ2ZXJfbmFtZXNfaGFzaF9tYXhfc2l6ZSA9IDUxMjsKICAgICB9CiAKLSAgICBpZiAoY21jZi0+c2VydmVyX25hbWVzX2hhc2hfdGhyZXNob2xkID09IE5HWF9DT05GX1VOU0VUX1VJTlQpIHsKLSAgICAgICAgY21jZi0+c2VydmVyX25hbWVzX2hhc2hfdGhyZXNob2xkID0gNTA7CisgICAgaWYgKGNtY2YtPnNlcnZlcl9uYW1lc19oYXNoX2J1Y2tldF9zaXplID09IE5HWF9DT05GX1VOU0VUX1VJTlQpIHsKKyAgICAgICAgY21jZi0+c2VydmVyX25hbWVzX2hhc2hfYnVja2V0X3NpemUgPSBuZ3hfY2FjaGVsaW5lX3NpemU7CiAgICAgfQogCisgICAgY21jZi0+c2VydmVyX25hbWVzX2hhc2hfYnVja2V0X3NpemUgPQorICAgICAgICAgICAgbmd4X2FsaWduKGNtY2YtPnNlcnZlcl9uYW1lc19oYXNoX2J1Y2tldF9zaXplLCBuZ3hfY2FjaGVsaW5lX3NpemUpOworCiAgICAgcmV0dXJuIE5HWF9DT05GX09LOwogfQogCkBAIC0xNzU2LDE5ICsxNzU5LDIwIEBACiAgICAgICovCiAKICAgICBpZiAobmd4X2FycmF5X2luaXQoJmNzY2YtPmxvY2F0aW9ucywgY2YtPnBvb2wsIDQsIHNpemVvZih2b2lkICopKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gTkdYX0VSUk9SKQorICAgICAgICA9PSBOR1hfRVJST1IpCiAgICAgewogICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgfQogCiAgICAgaWYgKG5neF9hcnJheV9pbml0KCZjc2NmLT5saXN0ZW4sIGNmLT5wb29sLCA0LCBzaXplb2Yobmd4X2h0dHBfbGlzdGVuX3QpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gTkdYX0VSUk9SKQorICAgICAgICA9PSBOR1hfRVJST1IpCiAgICAgewogICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgfQogCiAgICAgaWYgKG5neF9hcnJheV9pbml0KCZjc2NmLT5zZXJ2ZXJfbmFtZXMsIGNmLT5wb29sLCA0LAotICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yobmd4X2h0dHBfc2VydmVyX25hbWVfdCkpID09IE5HWF9FUlJPUikKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5neF9odHRwX3NlcnZlcl9uYW1lX3QpKQorICAgICAgICA9PSBOR1hfRVJST1IpCiAgICAgewogICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgfQpAQCAtMTc5MCw5ICsxNzk0LDggQEAKICAgICBuZ3hfaHR0cF9jb3JlX3Nydl9jb25mX3QgKnByZXYgPSBwYXJlbnQ7CiAgICAgbmd4X2h0dHBfY29yZV9zcnZfY29uZl90ICpjb25mID0gY2hpbGQ7CiAKLSAgICBuZ3hfaHR0cF9saXN0ZW5fdCAgICAgICAgICAqbHM7Ci0gICAgbmd4X2h0dHBfc2VydmVyX25hbWVfdCAgICAgKnNuOwotICAgIG5neF9odHRwX2NvcmVfbWFpbl9jb25mX3QgICpjbWNmOworICAgIG5neF9odHRwX2xpc3Rlbl90ICAgICAgICpsczsKKyAgICBuZ3hfaHR0cF9zZXJ2ZXJfbmFtZV90ICAqc247CiAKICAgICAvKiBUT0RPOiBpdCBkb2VzIG5vdCBtZXJnZSwgaXQgaW5pdHMgb25seSAqLwogCkBAIC0xODM3LDEzICsxODQwLDYgQEAKIAogICAgICAgICBzbi0+bmFtZS5sZW4gPSBuZ3hfc3RybGVuKHNuLT5uYW1lLmRhdGEpOwogICAgICAgICBzbi0+Y29yZV9zcnZfY29uZiA9IGNvbmY7Ci0gICAgICAgIHNuLT53aWxkY2FyZCA9IDA7Ci0KLSAgICAgICAgY21jZiA9IG5neF9odHRwX2NvbmZfZ2V0X21vZHVsZV9tYWluX2NvbmYoY2YsIG5neF9odHRwX2NvcmVfbW9kdWxlKTsKLQotICAgICAgICBpZiAoY21jZi0+bWF4X3NlcnZlcl9uYW1lX2xlbiA8IHNuLT5uYW1lLmxlbikgewotICAgICAgICAgICAgY21jZi0+bWF4X3NlcnZlcl9uYW1lX2xlbiA9IHNuLT5uYW1lLmxlbjsKLSAgICAgICAgfQogICAgIH0KIAogICAgIG5neF9jb25mX21lcmdlX3NpemVfdmFsdWUoY29uZi0+Y29ubmVjdGlvbl9wb29sX3NpemUsCkBAIC0yMjc5LDQ5ICsyMjc1LDYwIEBACiBzdGF0aWMgY2hhciAqCiBuZ3hfaHR0cF9jb3JlX3NlcnZlcl9uYW1lKG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpjbWQsIHZvaWQgKmNvbmYpCiB7Ci0gICAgbmd4X2h0dHBfY29yZV9zcnZfY29uZl90ICpzY2YgPSBjb25mOworICAgIG5neF9odHRwX2NvcmVfc3J2X2NvbmZfdCAqY3NjZiA9IGNvbmY7CiAKLSAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgaTsKLSAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgICAqdmFsdWU7Ci0gICAgbmd4X2h0dHBfc2VydmVyX25hbWVfdCAgICAgKnNuOwotICAgIG5neF9odHRwX2NvcmVfbWFpbl9jb25mX3QgICpjbWNmOwotCi0gICAgLyogVE9ETzogd2FybiBhYm91dCBkdXBsaWNhdGUgJ3NlcnZlcl9uYW1lJyBkaXJlY3RpdmVzICovCi0KLSAgICBjbWNmID0gbmd4X2h0dHBfY29uZl9nZXRfbW9kdWxlX21haW5fY29uZihjZiwgbmd4X2h0dHBfY29yZV9tb2R1bGUpOworICAgIHVfY2hhciAgICAgICAgICAgICAgICAgICBjaDsKKyAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAqdmFsdWUsIG5hbWU7CisgICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgIGk7CisgICAgbmd4X2h0dHBfc2VydmVyX25hbWVfdCAgKnNuOwogCiAgICAgdmFsdWUgPSBjZi0+YXJncy0+ZWx0czsKIAotICAgIGZvciAoaSA9IDE7IGkgPCBjZi0+YXJncy0+bmVsdHM7IGkrKykgewotICAgICAgICBpZiAodmFsdWVbaV0ubGVuID09IDApIHsKKyAgICBjaCA9IHZhbHVlWzFdLmRhdGFbMF07CisKKyAgICBpZiAoY3NjZi0+c2VydmVyX25hbWUuZGF0YSA9PSBOVUxMICYmIHZhbHVlWzFdLmxlbikgeworICAgICAgICBpZiAoY2ggPT0gJyonKSB7CiAgICAgICAgICAgICBuZ3hfY29uZl9sb2dfZXJyb3IoTkdYX0xPR19FTUVSRywgY2YsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlcnZlciBuYW1lIFwiJVZcIiBpcyBpbnZhbGlkICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4gXCIlVlwiIGRpcmVjdGl2ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlW2ldLCAmY21kLT5uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmlyc3Qgc2VydmVyIG5hbWUgXCIlVlwiIG11c3Qgbm90IGJlIHdpbGRjYXJkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVbMV0pOwogICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgICAgICB9CiAKLSAgICAgICAgc24gPSBuZ3hfYXJyYXlfcHVzaCgmc2NmLT5zZXJ2ZXJfbmFtZXMpOworICAgICAgICBuYW1lID0gdmFsdWVbMV07CisKKyAgICAgICAgaWYgKGNoID09ICcuJykgeworICAgICAgICAgICAgbmFtZS5sZW4tLTsKKyAgICAgICAgICAgIG5hbWUuZGF0YSsrOworICAgICAgICB9CisKKyAgICAgICAgY3NjZi0+c2VydmVyX25hbWUubGVuID0gbmFtZS5sZW47CisgICAgICAgIGNzY2YtPnNlcnZlcl9uYW1lLmRhdGEgPSBuZ3hfcHN0cmR1cChjZi0+cG9vbCwgJm5hbWUpOworICAgICAgICBpZiAoY3NjZi0+c2VydmVyX25hbWUuZGF0YSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGkgPSAxOyBpIDwgY2YtPmFyZ3MtPm5lbHRzOyBpKyspIHsKKworICAgICAgICBjaCA9IHZhbHVlW2ldLmRhdGFbMF07CisKKyAgICAgICAgaWYgKHZhbHVlW2ldLmxlbiA9PSAwCisgICAgICAgICAgICB8fCAoY2ggPT0gJyonICYmICh2YWx1ZVtpXS5sZW4gPCAzIHx8IHZhbHVlW2ldLmRhdGFbMV0gIT0gJy4nKSkKKyAgICAgICAgICAgIHx8IChjaCA9PSAnLicgJiYgdmFsdWVbaV0ubGVuIDwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIG5neF9jb25mX2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBjZiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VydmVyIG5hbWUgXCIlVlwiIGlzIGludmFsaWQiLCAmdmFsdWVbaV0pOworICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgc24gPSBuZ3hfYXJyYXlfcHVzaCgmY3NjZi0+c2VydmVyX25hbWVzKTsKICAgICAgICAgaWYgKHNuID09IE5VTEwpIHsKICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICAgICAgfQogCiAgICAgICAgIHNuLT5uYW1lLmxlbiA9IHZhbHVlW2ldLmxlbjsKICAgICAgICAgc24tPm5hbWUuZGF0YSA9IHZhbHVlW2ldLmRhdGE7Ci0gICAgICAgIHNuLT5jb3JlX3Nydl9jb25mID0gc2NmOwotCi0gICAgICAgIGlmIChzbi0+bmFtZS5kYXRhWzBdID09ICcqJykgewotICAgICAgICAgICAgc24tPm5hbWUubGVuLS07Ci0gICAgICAgICAgICBzbi0+bmFtZS5kYXRhKys7Ci0gICAgICAgICAgICBzbi0+d2lsZGNhcmQgPSAxOwotCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzbi0+d2lsZGNhcmQgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNtY2YtPm1heF9zZXJ2ZXJfbmFtZV9sZW4gPCBzbi0+bmFtZS5sZW4pIHsKLSAgICAgICAgICAgIGNtY2YtPm1heF9zZXJ2ZXJfbmFtZV9sZW4gPSBzbi0+bmFtZS5sZW47Ci0gICAgICAgIH0KKyAgICAgICAgc24tPmNvcmVfc3J2X2NvbmYgPSBjc2NmOwogICAgIH0KIAogICAgIHJldHVybiBOR1hfQ09ORl9PSzsKZGlmZiAtLWdpdCBhL3NyYy9odHRwL25neF9odHRwX2NvcmVfbW9kdWxlLmggYi9zcmMvaHR0cC9uZ3hfaHR0cF9jb3JlX21vZHVsZS5oCmluZGV4IDBkOGFlNzQuLjE2NTJmMzUgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL25neF9odHRwX2NvcmVfbW9kdWxlLmgKKysrIGIvc3JjL2h0dHAvbmd4X2h0dHBfY29yZV9tb2R1bGUuaApAQCAtNzMsMTAgKzczLDggQEAKICAgICBuZ3hfaGFzaDBfdCAgICAgICAgICAgICAgICBoZWFkZXJzX2luX2hhc2g7CiAgICAgbmd4X2hhc2gwX3QgICAgICAgICAgICAgICAgdmFyaWFibGVzX2hhc2g7CiAKLSAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICBzZXJ2ZXJfbmFtZXNfaGFzaDsKLSAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICBzZXJ2ZXJfbmFtZXNfaGFzaF90aHJlc2hvbGQ7Ci0KLSAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICBtYXhfc2VydmVyX25hbWVfbGVuOworICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgIHNlcnZlcl9uYW1lc19oYXNoX21heF9zaXplOworICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgIHNlcnZlcl9uYW1lc19oYXNoX2J1Y2tldF9zaXplOwogCiAgICAgbmd4X2FycmF5X3QgICAgICAgICAgICAgICAgdmFyaWFibGVzOyAgICAgICAgLyogbmd4X2h0dHBfdmFyaWFibGVfdCAqLwogICAgIG5neF9hcnJheV90ICAgICAgICAgICAgICAgIGFsbF92YXJpYWJsZXM7ICAgIC8qIG5neF9odHRwX3ZhcmlhYmxlX3QgKi8KQEAgLTk5LDYgKzk3LDggQEAKICAgICAvKiBzZXJ2ZXIgY3R4ICovCiAgICAgbmd4X2h0dHBfY29uZl9jdHhfdCAgICAgICAqY3R4OwogCisgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgc2VydmVyX25hbWU7CisKICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uX3Bvb2xfc2l6ZTsKICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0X3Bvb2xfc2l6ZTsKICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICBjbGllbnRfaGVhZGVyX2J1ZmZlcl9zaXplOwpAQCAtMTE1LDQ1ICsxMTUsNTMgQEAKIAogLyogbGlzdCBvZiBzdHJ1Y3R1cmVzIHRvIGZpbmQgY29yZV9zcnZfY29uZiBxdWlja2x5IGF0IHJ1biB0aW1lICovCiAKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGluX2FkZHJfdCAgICAgICAgICAgICAgICAgIGFkZHI7CisgICAgLyogdGhlIGRlZmF1bHQgc2VydmVyIGNvbmZpZ3VyYXRpb24gZm9yIHRoaXMgYWRkcmVzczpwb3J0ICovCisgICAgbmd4X2h0dHBfY29yZV9zcnZfY29uZl90ICAqY29yZV9zcnZfY29uZjsKKyAgICBuZ3hfaHR0cF92aXJ0dWFsX25hbWVzX3QgICp2aXJ0dWFsX25hbWVzOworfSBuZ3hfaHR0cF9pbl9hZGRyX3Q7CisKKwogdHlwZWRlZiBzdHJ1Y3QgewogICAgIGluX3BvcnRfdCAgICAgICAgICAgICAgICAgIHBvcnQ7CiAgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgcG9ydF90ZXh0OwotICAgIG5neF9hcnJheV90ICAgICAgICAgICAgICAgIGFkZHJzOyAgICAgICAvKiBhcnJheSBvZiBuZ3hfaHR0cF9pbl9hZGRyX3QgKi8KKyAgICBuZ3hfaHR0cF9pbl9hZGRyX3QgICAgICAgICphZGRyczsKKyAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICBuYWRkcnM7CiB9IG5neF9odHRwX2luX3BvcnRfdDsKIAogCi1zdHJ1Y3Qgbmd4X2h0dHBfaW5fYWRkcl9zIHsKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbl9wb3J0X3QgICAgICAgICAgICAgICAgICBwb3J0OworICAgIG5neF9hcnJheV90ICAgICAgICAgICAgICAgIGFkZHJzOyAgICAgLyogYXJyYXkgb2Ygbmd4X2h0dHBfY29uZl9pbl9hZGRyX3QgKi8KK30gbmd4X2h0dHBfY29uZl9pbl9wb3J0X3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgewogICAgIGluX2FkZHJfdCAgICAgICAgICAgICAgICAgIGFkZHI7CiAKLSAgICBuZ3hfYXJyYXlfdCAgICAgICAgICAgICAgICBuYW1lczsgICAgIC8qIGFycmF5IG9mIG5neF9odHRwX3NlcnZlcl9uYW1lX3QgKi8KLSAgICBuZ3hfYXJyYXlfdCAgICAgICAgICAgICAgICpoYXNoOyAgICAgIC8qIGhhc2ggb2Ygbmd4X2h0dHBfc2VydmVyX25hbWVfdCAqLwotICAgIG5neF9hcnJheV90ICAgICAgICAgICAgICAgIHdpbGRjYXJkczsgIC8qIGFycmF5IG9mIG5neF9odHRwX3NlcnZlcl9uYW1lX3QgKi8KKyAgICBuZ3hfaGFzaF90ICAgICAgICAgICAgICAgICBoYXNoOworICAgIG5neF9oYXNoX3dpbGRjYXJkX3QgICAgICAgICpkbnNfd2lsZGNhcmRzOworCisgICAgbmd4X2FycmF5X3QgICAgICAgICAgICAgICAgbmFtZXM7ICAgICAgLyogYXJyYXkgb2Ygbmd4X2h0dHBfc2VydmVyX25hbWVfdCAqLwogCiAgICAgLyogdGhlIGRlZmF1bHQgc2VydmVyIGNvbmZpZ3VyYXRpb24gZm9yIHRoaXMgYWRkcmVzczpwb3J0ICovCiAgICAgbmd4X2h0dHBfY29yZV9zcnZfY29uZl90ICAqY29yZV9zcnZfY29uZjsKIAotICAgIG5neF9odHRwX2xpc3Rlbl9jb25mX3QgICAgIGNvbmY7Ci19OworICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgIGRlZmF1bHRfc2VydmVyOjE7CisgICAgdW5zaWduZWQgICAgICAgICAgICAgICAgICAgYmluZDoxOworCisgICAgbmd4X2h0dHBfbGlzdGVuX2NvbmZfdCAgICAqbGlzdGVuX2NvbmY7Cit9IG5neF9odHRwX2NvbmZfaW5fYWRkcl90OwogCiAKIHR5cGVkZWYgc3RydWN0IHsKICAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgICBuYW1lOwogICAgIG5neF9odHRwX2NvcmVfc3J2X2NvbmZfdCAgKmNvcmVfc3J2X2NvbmY7IC8qIHZpcnR1YWwgbmFtZSBzZXJ2ZXIgY29uZiAqLwotCi0gICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgd2lsZGNhcmQ7ICAvKiB1bnNpZ25lZCAgd2lsZGNhcmQ6MSAqLwogfSBuZ3hfaHR0cF9zZXJ2ZXJfbmFtZV90OwogCiAKLSNkZWZpbmUgbmd4X2h0dHBfc2VydmVyX25hbWVzX2hhc2hfa2V5KGtleSwgbmFtZSwgbGVuLCBwcmltZSkgICAgICAgICAgICAgICBcCi0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgbmd4X3VpbnRfdCAgbjA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGZvciAoa2V5ID0gMCwgbjAgPSAwOyBuMCA8IGxlbjsgbjArKykgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAga2V5ICs9IG5hbWVbbjBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGtleSAlPSBwcmltZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIH0KLQotCiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgbmd4X2ludF90ICAgICBzdGF0dXM7CiAgICAgbmd4X2ludF90ICAgICBvdmVyd3JpdGU7CmRpZmYgLS1naXQgYS9zcmMvaHR0cC9uZ3hfaHR0cF9yZXF1ZXN0LmMgYi9zcmMvaHR0cC9uZ3hfaHR0cF9yZXF1ZXN0LmMKaW5kZXggYmE5M2MwZC4uZjE4MjYzMyAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbmd4X2h0dHBfcmVxdWVzdC5jCisrKyBiL3NyYy9odHRwL25neF9odHRwX3JlcXVlc3QuYwpAQCAtMjAzLDExICsyMDMsMTAgQEAKICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gICAgICAgICAgc2luOwogICAgIG5neF9jb25uZWN0aW9uX3QgICAgICAgICAgICpjOwogICAgIG5neF9odHRwX3JlcXVlc3RfdCAgICAgICAgICpyOwotICAgIG5neF9odHRwX2luX3BvcnRfdCAgICAgICAgICppbl9wb3J0OwotICAgIG5neF9odHRwX2luX2FkZHJfdCAgICAgICAgICppbl9hZGRyOworICAgIG5neF9odHRwX2luX3BvcnRfdCAgICAgICAgICpoaXA7CisgICAgbmd4X2h0dHBfaW5fYWRkcl90ICAgICAgICAgKmhpYTsKICAgICBuZ3hfaHR0cF9sb2dfY3R4X3QgICAgICAgICAqY3R4OwogICAgIG5neF9odHRwX2Nvbm5lY3Rpb25fdCAgICAgICpoYzsKLSAgICBuZ3hfaHR0cF9zZXJ2ZXJfbmFtZV90ICAgICAqc2VydmVyX25hbWU7CiAgICAgbmd4X2h0dHBfY29yZV9zcnZfY29uZl90ICAgKmNzY2Y7CiAgICAgbmd4X2h0dHBfY29yZV9sb2NfY29uZl90ICAgKmNsY2Y7CiAgICAgbmd4X2h0dHBfY29yZV9tYWluX2NvbmZfdCAgKmNtY2Y7CkBAIC0yNjksMTUgKzI2OCwxNSBAQAogCiAgICAgLyogQUZfSU5FVCBvbmx5ICovCiAKLSAgICBpbl9wb3J0ID0gYy0+c2VydmVyczsKLSAgICBpbl9hZGRyID0gaW5fcG9ydC0+YWRkcnMuZWx0czsKKyAgICBoaXAgPSBjLT5zZXJ2ZXJzOworICAgIGhpYSA9IGhpcC0+YWRkcnM7CiAKLSAgICByLT5wb3J0ID0gaW5fcG9ydC0+cG9ydDsKLSAgICByLT5wb3J0X3RleHQgPSAmaW5fcG9ydC0+cG9ydF90ZXh0OworICAgIHItPnBvcnQgPSBoaXAtPnBvcnQ7CisgICAgci0+cG9ydF90ZXh0ID0gJmhpcC0+cG9ydF90ZXh0OwogCiAgICAgaSA9IDA7CiAKLSAgICBpZiAoaW5fcG9ydC0+YWRkcnMubmVsdHMgPiAxKSB7CisgICAgaWYgKGhpcC0+bmFkZHJzID4gMSkgewogCiAgICAgICAgIC8qCiAgICAgICAgICAqIFRoZXJlIGFyZSBzZXZlcmFsIGFkZHJlc3NlcyBvbiB0aGlzIHBvcnQgYW5kIG9uZSBvZiB0aGVtCkBAIC0zMDgsMjUgKzMwNywyNyBAQAogCiAgICAgICAgIC8qIHRoZSBsYXN0IGluX3BvcnQtPmFkZHJzIGFkZHJlc3MgaXMgIioiICovCiAKLSAgICAgICAgZm9yICggLyogdm9pZCAqLyA7IGkgPCBpbl9wb3J0LT5hZGRycy5uZWx0cyAtIDE7IGkrKykgewotICAgICAgICAgICAgaWYgKGluX2FkZHJbaV0uYWRkciA9PSByLT5pbl9hZGRyKSB7CisgICAgICAgIGZvciAoIC8qIHZvaWQgKi8gOyBpIDwgaGlwLT5uYWRkcnMgLSAxOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChoaWFbaV0uYWRkciA9PSByLT5pbl9hZGRyKSB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgIH0gZWxzZSB7Ci0gICAgICAgIHItPmluX2FkZHIgPSBpbl9hZGRyWzBdLmFkZHI7CisgICAgICAgIHItPmluX2FkZHIgPSBoaWFbMF0uYWRkcjsKICAgICB9CiAKLSAgICByLT52aXJ0dWFsX25hbWVzID0gJmluX2FkZHJbaV07CisgICAgci0+dmlydHVhbF9uYW1lcyA9IGhpYVtpXS52aXJ0dWFsX25hbWVzOwogCiAgICAgLyogdGhlIGRlZmF1bHQgc2VydmVyIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBhZGRyZXNzOnBvcnQgKi8KLSAgICBjc2NmID0gaW5fYWRkcltpXS5jb3JlX3Nydl9jb25mOworICAgIGNzY2YgPSBoaWFbaV0uY29yZV9zcnZfY29uZjsKIAogICAgIHItPm1haW5fY29uZiA9IGNzY2YtPmN0eC0+bWFpbl9jb25mOwogICAgIHItPnNydl9jb25mID0gY3NjZi0+Y3R4LT5zcnZfY29uZjsKICAgICByLT5sb2NfY29uZiA9IGNzY2YtPmN0eC0+bG9jX2NvbmY7CiAKKyAgICByLT5zZXJ2ZXJfbmFtZSA9IGNzY2YtPnNlcnZlcl9uYW1lOworCiAgICAgcmV2LT5oYW5kbGVyID0gbmd4X2h0dHBfcHJvY2Vzc19yZXF1ZXN0X2xpbmU7CiAKICNpZiAoTkdYX0hUVFBfU1NMKQpAQCAtMzUwLDkgKzM1MSw2IEBACiAKICNlbmRpZgogCi0gICAgc2VydmVyX25hbWUgPSBjc2NmLT5zZXJ2ZXJfbmFtZXMuZWx0czsKLSAgICByLT5zZXJ2ZXJfbmFtZSA9IHNlcnZlcl9uYW1lLT5uYW1lOwotCiAgICAgY2xjZiA9IG5neF9odHRwX2dldF9tb2R1bGVfbG9jX2NvbmYociwgbmd4X2h0dHBfY29yZV9tb2R1bGUpOwogICAgIGMtPmxvZy0+ZmlsZSA9IGNsY2YtPmVycl9sb2ctPmZpbGU7CiAgICAgaWYgKCEoYy0+bG9nLT5sb2dfbGV2ZWwgJiBOR1hfTE9HX0RFQlVHX0NPTk5FQ1RJT04pKSB7CkBAIC0xMzIxLDc4ICsxMzE5LDM1IEBACiBzdGF0aWMgbmd4X2ludF90CiBuZ3hfaHR0cF9maW5kX3ZpcnR1YWxfc2VydmVyKG5neF9odHRwX3JlcXVlc3RfdCAqcikKIHsKLSAgICBuZ3hfaW50X3QgICAgICAgICAgICAgICAgICAgcmM7Ci0gICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgIGksIG4sIGtleTsKLSAgICBuZ3hfaHR0cF9zZXJ2ZXJfbmFtZV90ICAgICAqbmFtZTsKLSAgICBuZ3hfaHR0cF9jb3JlX2xvY19jb25mX3QgICAqY2xjZjsKLSAgICBuZ3hfaHR0cF9jb3JlX3Nydl9jb25mX3QgICAqY3NjZjsKLSAgICBuZ3hfaHR0cF9jb3JlX21haW5fY29uZl90ICAqY21jZjsKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICBsZW47CisgICAgdV9jaGFyICAgICAgICAgICAgICAgICAgICAqaG9zdDsKKyAgICBuZ3hfaHR0cF92aXJ0dWFsX25hbWVzX3QgICp2bjsKKyAgICBuZ3hfaHR0cF9jb3JlX2xvY19jb25mX3QgICpjbGNmOworICAgIG5neF9odHRwX2NvcmVfc3J2X2NvbmZfdCAgKmNzY2Y7CiAKLSAgICBpZiAoci0+dmlydHVhbF9uYW1lcy0+aGFzaCkgewotICAgICAgICBjbWNmID0gbmd4X2h0dHBfZ2V0X21vZHVsZV9tYWluX2NvbmYociwgbmd4X2h0dHBfY29yZV9tb2R1bGUpOworICAgIHZuID0gci0+dmlydHVhbF9uYW1lczsKIAotICAgICAgICBuZ3hfaHR0cF9zZXJ2ZXJfbmFtZXNfaGFzaF9rZXkoa2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+aGVhZGVyc19pbi5ob3N0LT52YWx1ZS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+aGVhZGVyc19pbi5ob3N0X25hbWVfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21jZi0+c2VydmVyX25hbWVzX2hhc2gpOwotCi0gICAgICAgIG5hbWUgPSByLT52aXJ0dWFsX25hbWVzLT5oYXNoW2tleV0uZWx0czsKLSAgICAgICAgbiA9IHItPnZpcnR1YWxfbmFtZXMtPmhhc2hba2V5XS5uZWx0czsKLQotICAgIH0gZWxzZSB7Ci0gICAgICAgIG5hbWUgPSByLT52aXJ0dWFsX25hbWVzLT5uYW1lcy5lbHRzOwotICAgICAgICBuID0gci0+dmlydHVhbF9uYW1lcy0+bmFtZXMubmVsdHM7CisgICAgaWYgKHZuID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5HWF9PSzsKICAgICB9CiAKLSAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgaG9zdCA9IHItPmhlYWRlcnNfaW4uaG9zdC0+dmFsdWUuZGF0YTsKKyAgICBsZW4gPSByLT5oZWFkZXJzX2luLmhvc3RfbmFtZV9sZW47CiAKLSAgICAgICAgbmd4X2xvZ19kZWJ1ZzEoTkdYX0xPR19ERUJVR19IVFRQLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICJzZXJ2ZXIgbmFtZTogJVYiLCAmbmFtZVtpXS5uYW1lKTsKKyAgICAvKiBTVFVCOiBuZ3hfaGFzaF9rZXkoKSBoZXJlIGlzIFNUVUIgKi8KIAotICAgICAgICBpZiAoci0+aGVhZGVyc19pbi5ob3N0X25hbWVfbGVuICE9IG5hbWVbaV0ubmFtZS5sZW4pIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmMgPSBuZ3hfc3RybmNtcChyLT5oZWFkZXJzX2luLmhvc3QtPnZhbHVlLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbmFtZVtpXS5uYW1lLmRhdGEsIG5hbWVbaV0ubmFtZS5sZW4pOwotCi0gICAgICAgIGlmIChyYyA9PSAwKSB7Ci0gICAgICAgICAgICByLT5zZXJ2ZXJfbmFtZSA9IG5hbWVbaV0ubmFtZTsKKyAgICBpZiAodm4tPmhhc2guYnVja2V0cykgeworICAgICAgICBjc2NmID0gbmd4X2hhc2hfZmluZCgmdm4tPmhhc2gsIG5neF9oYXNoX2tleShob3N0LCBsZW4pLCBob3N0LCBsZW4pOworICAgICAgICBpZiAoY3NjZikgewogICAgICAgICAgICAgZ290byBmb3VuZDsKICAgICAgICAgfQotCi0gICAgICAgIGlmIChyYyA8IDApIHsKLSAgICAgICAgICAgIC8qIHRoZSBzZXJ2ZXIgbmFtZXMgYXJlIGxleGljb2dyYXBoaWNhbGx5IHNvcnRlZCAqLwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoci0+dmlydHVhbF9uYW1lcy0+d2lsZGNhcmRzLm5lbHRzKSB7CisgICAgaWYgKHZuLT5kbnNfd2lsZGNhcmRzICYmIHZuLT5kbnNfd2lsZGNhcmRzLT5oYXNoLmJ1Y2tldHMpIHsKKyAgICAgICAgY3NjZiA9IG5neF9oYXNoX2ZpbmRfd2lsZGNhcmQodm4tPmRuc193aWxkY2FyZHMsIGhvc3QsIGxlbik7CiAKLSAgICAgICAgbmFtZSA9IHItPnZpcnR1YWxfbmFtZXMtPndpbGRjYXJkcy5lbHRzOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgci0+dmlydHVhbF9uYW1lcy0+d2lsZGNhcmRzLm5lbHRzOyBpKyspIHsKLQotICAgICAgICAgICAgbmd4X2xvZ19kZWJ1ZzEoTkdYX0xPR19ERUJVR19IVFRQLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAic2VydmVyIG5hbWU6ICVWIiwgJm5hbWVbaV0ubmFtZSk7Ci0KLSAgICAgICAgICAgIGlmIChyLT5oZWFkZXJzX2luLmhvc3RfbmFtZV9sZW4gPD0gbmFtZVtpXS5uYW1lLmxlbikgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBuZ3hfbG9nX2RlYnVnMShOR1hfTE9HX0RFQlVHX0hUVFAsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXJ2ZXIgbmFtZTogJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+aGVhZGVyc19pbi5ob3N0LT52YWx1ZS5kYXRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICArIChyLT5oZWFkZXJzX2luLmhvc3RfbmFtZV9sZW4gLSBuYW1lW2ldLm5hbWUubGVuKSk7Ci0KLSAgICAgICAgICAgIGlmIChuZ3hfc3RybmNtcChyLT5oZWFkZXJzX2luLmhvc3QtPnZhbHVlLmRhdGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIChyLT5oZWFkZXJzX2luLmhvc3RfbmFtZV9sZW4gLSBuYW1lW2ldLm5hbWUubGVuKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lW2ldLm5hbWUuZGF0YSwgbmFtZVtpXS5uYW1lLmxlbikgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByLT5zZXJ2ZXJfbmFtZS5sZW4gPSByLT5oZWFkZXJzX2luLmhvc3RfbmFtZV9sZW47Ci0gICAgICAgICAgICAgICAgci0+c2VydmVyX25hbWUuZGF0YSA9IHItPmhlYWRlcnNfaW4uaG9zdC0+dmFsdWUuZGF0YTsKLQotICAgICAgICAgICAgICAgIGdvdG8gZm91bmQ7Ci0gICAgICAgICAgICB9CisgICAgICAgIGlmIChjc2NmKSB7CisgICAgICAgICAgICBnb3RvIGZvdW5kOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xNDA2LDggKzEzNjEsMTEgQEAKIAogZm91bmQ6CiAKLSAgICByLT5zcnZfY29uZiA9IG5hbWVbaV0uY29yZV9zcnZfY29uZi0+Y3R4LT5zcnZfY29uZjsKLSAgICByLT5sb2NfY29uZiA9IG5hbWVbaV0uY29yZV9zcnZfY29uZi0+Y3R4LT5sb2NfY29uZjsKKyAgICByLT5zZXJ2ZXJfbmFtZS5sZW4gPSBsZW47CisgICAgci0+c2VydmVyX25hbWUuZGF0YSA9IGhvc3Q7CisKKyAgICByLT5zcnZfY29uZiA9IGNzY2YtPmN0eC0+c3J2X2NvbmY7CisgICAgci0+bG9jX2NvbmYgPSBjc2NmLT5jdHgtPmxvY19jb25mOwogCiAgICAgY2xjZiA9IG5neF9odHRwX2dldF9tb2R1bGVfbG9jX2NvbmYociwgbmd4X2h0dHBfY29yZV9tb2R1bGUpOwogICAgIHItPmNvbm5lY3Rpb24tPmxvZy0+ZmlsZSA9IGNsY2YtPmVycl9sb2ctPmZpbGU7CmRpZmYgLS1naXQgYS9zcmMvaHR0cC9uZ3hfaHR0cF9yZXF1ZXN0LmggYi9zcmMvaHR0cC9uZ3hfaHR0cF9yZXF1ZXN0LmgKaW5kZXggOWU2ZmQxNS4uZGNlOTE5ZiAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbmd4X2h0dHBfcmVxdWVzdC5oCisrKyBiL3NyYy9odHRwL25neF9odHRwX3JlcXVlc3QuaApAQCAtMjUwLDE0ICsyNTAsMjAgQEAKIH0gbmd4X2h0dHBfY29ubmVjdGlvbl90OwogCiAKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBuZ3hfaGFzaF90ICAgICAgICAgICAgICAgICAgICAgICAgaGFzaDsKKyAgICBuZ3hfaGFzaF93aWxkY2FyZF90ICAgICAgICAgICAgICAqZG5zX3dpbGRjYXJkczsKK30gbmd4X2h0dHBfdmlydHVhbF9uYW1lc190OworCisKIHR5cGVkZWYgdm9pZCAoKm5neF9odHRwX2NsZWFudXBfcHQpKHZvaWQgKmRhdGEpOwogCiB0eXBlZGVmIHN0cnVjdCBuZ3hfaHR0cF9jbGVhbnVwX3MgIG5neF9odHRwX2NsZWFudXBfdDsKIAogc3RydWN0IG5neF9odHRwX2NsZWFudXBfcyB7Ci0gICAgbmd4X2h0dHBfY2xlYW51cF9wdCAgIGhhbmRsZXI7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICAgKmRhdGE7Ci0gICAgbmd4X2h0dHBfY2xlYW51cF90ICAgKm5leHQ7CisgICAgbmd4X2h0dHBfY2xlYW51cF9wdCAgICAgICAgICAgICAgIGhhbmRsZXI7CisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGE7CisgICAgbmd4X2h0dHBfY2xlYW51cF90ICAgICAgICAgICAgICAgKm5leHQ7CiB9OwogCiAKQEAgLTMyNSw3ICszMzEsNyBAQAogICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICAgICAgICBwb3J0OwogICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICAgICAgICpwb3J0X3RleHQ7ICAgIC8qICI6ODAiICovCiAgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlcl9uYW1lOwotICAgIG5neF9odHRwX2luX2FkZHJfdCAgICAgICAgICAgICAgICp2aXJ0dWFsX25hbWVzOworICAgIG5neF9odHRwX3ZpcnR1YWxfbmFtZXNfdCAgICAgICAgICp2aXJ0dWFsX25hbWVzOwogCiAgICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgICAgICAgIHBoYXNlOwogICAgIG5neF9pbnRfdCAgICAgICAgICAgICAgICAgICAgICAgICBwaGFzZV9oYW5kbGVyOwpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbmd4X2h0dHBfdXBzdHJlYW0uYyBiL3NyYy9odHRwL25neF9odHRwX3Vwc3RyZWFtLmMKaW5kZXggNTcxMWI0YS4uY2RmOWEwNyAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbmd4X2h0dHBfdXBzdHJlYW0uYworKysgYi9zcmMvaHR0cC9uZ3hfaHR0cF91cHN0cmVhbS5jCkBAIC0zNDQsNyArMzQ0LDcgQEAKIAogICAgIHUtPnN0YXRlLT5yZXNwb25zZV90aW1lID0gdHAtPnNlYyAqIDEwMDAgKyB0cC0+bXNlYzsKIAotICAgIGNsbiA9IG5neF9odHRwX2NsZWFudXBfYWRkKHIsIHNpemVvZih2b2lkICopKTsKKyAgICBjbG4gPSBuZ3hfaHR0cF9jbGVhbnVwX2FkZChyLCAwKTsKICAgICBpZiAoY2xuID09IE5VTEwpIHsKICAgICAgICAgbmd4X2h0dHBfZmluYWxpemVfcmVxdWVzdChyLCBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IpOwogICAgICAgICByZXR1cm47Cg==