ZGlmZiAtLWdpdCBhL2F1dG8vY2MvYmNjIGIvYXV0by9jYy9iY2MKaW5kZXggYWYxMDhiYi4uODNiMmQ2MCAxMDA2NDQKLS0tIGEvYXV0by9jYy9iY2MKKysrIGIvYXV0by9jYy9iY2MKQEAgLTYzLDUgKzYzLDkgQEAKIG5neF9vYmpleHQ9Im9iaiIKIG5neF9iaW5leHQ9Ii5leGUiCiAKK25neF9sb25nX3N0YXJ0PSdAJiZ8CisJJworbmd4X2xvbmdfZW5kPSd8JworCiBuZ3hfcmVnZXhfZGlyc2VwPSdcXCcKIG5neF9kaXJzZXA9IlxcIgpkaWZmIC0tZ2l0IGEvYXV0by9jYy9jb25mIGIvYXV0by9jYy9jb25mCmluZGV4IDM3ZjJkMmUuLjgyODU0ZDggMTAwNjQ0Ci0tLSBhL2F1dG8vY2MvY29uZgorKysgYi9hdXRvL2NjL2NvbmYKQEAgLTExLDYgKzExLDkgQEAKIG5neF9vYmpleHQ9Im8iCiBuZ3hfYmluZXh0PQogCituZ3hfbG9uZ19zdGFydD0KK25neF9sb25nX2VuZD0KKwogbmd4X3JlZ2V4X2RpcnNlcD0iXC8iCiBuZ3hfZGlyc2VwPScvJwogCkBAIC0yMiw2ICsyNSw5IEBACiAJCScKIG5neF9zcGFjZXI9CiAKK25neF9sb25nX3JlZ2V4X2NvbnQ9JG5neF9yZWdleF9jb250CituZ3hfbG9uZ19jb250PSRuZ3hfY29udAorCiAuIGF1dG8vY2MvbmFtZQogCiBpZiB0ZXN0IC1uICIkQ0ZMQUdTIjsgdGhlbgpkaWZmIC0tZ2l0IGEvYXV0by9jYy9pY2MgYi9hdXRvL2NjL2ljYwppbmRleCBkM2ExNTFjLi42YWY5NzEzIDEwMDY0NAotLS0gYS9hdXRvL2NjL2ljYworKysgYi9hdXRvL2NjL2ljYwpAQCAtMzgsNiArMzgsNyBAQAogQ09SRV9MSU5LPSIkQ09SRV9MSU5LICRJUE8iCiBDT1JFX0xJTks9IiRDT1JFX0xJTksgLW9wdF9yZXBvcnRfZmlsZT0kTkdYX09CSlMvb3B0X3JlcG9ydF9maWxlIgogCisKIGNhc2UgJENQVSBpbgogICAgIHBlbnRpdW0pCiAgICAgICAgICMgb3B0aW1pemUgZm9yIFBlbnRpdW0gYW5kIEF0aGxvbgpAQCAtMTA0LDcgKzEwNSw3IEBACiBDRkxBR1M9IiRDRkxBR1MgLXdkMTQxOSIKIAogY2FzZSAiJE5HWF9JQ0NfVkVSIiBpbgotICAgIDguKiB8IDkuKikKKyAgICA5LiopCiAgICAgICAgICMgImNjIiBjbG9iYmVyIGlnbm9yZWQsIHdhcm5pbmdzIGZvciBMaXVueCdzIGh0b25zKCkKICAgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC13ZDE0NjkiCiAgICAgICAgICMgZXhwbGljaXQgY29udmVyc2lvbiBvZiBhIDY0LWJpdCBpbnRlZ3JhbCB0eXBlIHRvIGEgc21hbGxlcgpAQCAtMTE5LDYgKzEyMCwxNSBAQAogICAgICAgICBDRkxBR1M9IiRDRkxBR1MgLXdkMTU5NSIKICAgICA7OwogCisgICAgOC4qKQorICAgICAgICAjICJjYyIgY2xvYmJlciBpZ25vcmVkLCB3YXJuaW5ncyBmb3IgTGl1bngncyBodG9ucygpCisgICAgICAgIENGTEFHUz0iJENGTEFHUyAtd2QxNDY5IgorCisgICAgICAgICMgU1RVQgorICAgICAgICAjIG5vbi1QT0QgY2xhc3MgdHlwZSBwYXNzZWQgdGhyb3VnaCBlbGxpcHNpcywgTGludXggb25seSA/CisgICAgICAgIENGTEFHUz0iJENGTEFHUyAtd2QxNTk1IgorICAgIDs7CisKICAgICAqKQogICAgIDs7CiBlc2FjCmRpZmYgLS1naXQgYS9hdXRvL2NjL21zdmMgYi9hdXRvL2NjL21zdmMKaW5kZXggMGZhNWRmOS4uMjljNDBjNyAxMDA2NDQKLS0tIGEvYXV0by9jYy9tc3ZjCisrKyBiL2F1dG8vY2MvbXN2YwpAQCAtMTE0LDUgKzExNCwxMyBAQAogbmd4X29iamV4dD0ib2JqIgogbmd4X2JpbmV4dD0iLmV4ZSIKIAorbmd4X2xvbmdfc3RhcnQ9J0A8PAorICAgICAgICAnCituZ3hfbG9uZ19lbmQ9Jzw8Jworbmd4X2xvbmdfcmVnZXhfY29udD0nIFwKKwknCituZ3hfbG9uZ19jb250PScKKwknCisKICNuZ3hfcmVnZXhfZGlyc2VwPSdcXCcKICNuZ3hfZGlyc2VwPSJcXCIKZGlmZiAtLWdpdCBhL2F1dG8vbWFrZSBiL2F1dG8vbWFrZQppbmRleCBmY2MwNWIxLi5mN2VjYTg3IDEwMDY0NAotLS0gYS9hdXRvL21ha2UKKysrIGIvYXV0by9tYWtlCkBAIC0yNiw3ICsyNiw5IEBACiAgICAgZWNobyBNQUtFID0gd21ha2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+ICROR1hfTUFLRUZJTEUKIAogICAgIG5neF9yZWdleF9jb250PScgJworICAgIG5neF9sb25nX3JlZ2V4X2NvbnQ9JyAnCiAgICAgbmd4X2NvbnQ9JyAnCisgICAgbmd4X2xvbmdfY29udD0nICcKICAgICBuZ3hfdGFiPScgJwogCiBmaQpAQCAtMTcwLDIyICsxNzIsMjIgQEAKICAgICAgICAgICAtZSAicy9cLy8kbmd4X3JlZ2V4X2RpcnNlcC9nImAKIAogbmd4X29ianM9YGVjaG8gJG5neF9hbGxfb2JqcyAkbmd4X21vZHVsZXNfb2JqIFwKLSAgICB8IHNlZCAtZSAicy8gICpcKFteIF1bXiBdKlwpLyRuZ3hfcmVnZXhfY29udFwxL2ciIFwKKyAgICB8IHNlZCAtZSAicy8gICpcKFteIF1bXiBdKlwpLyRuZ3hfbG9uZ19yZWdleF9jb250XDEvZyIgXAogICAgICAgICAgIC1lICJzL1wvLyRuZ3hfcmVnZXhfZGlyc2VwL2ciYAogCiBuZ3hfbGlicz0ke0NPUkVfTElCUzorYGVjaG8gJE5HWF9MRF9PUFQgJENPUkVfTElCUyBcCi0gICAgfCBzZWQgLWUgInMvXC8vJG5neF9yZWdleF9kaXJzZXAvZyIgLWUgInMvXi8kbmd4X3JlZ2V4X2NvbnQvImB9CisgICAgfCBzZWQgLWUgInMvXC8vJG5neF9yZWdleF9kaXJzZXAvZyIgLWUgInMvXi8kbmd4X2xvbmdfcmVnZXhfY29udC8iYH0KIAogbmd4X2xpbms9JHtDT1JFX0xJTks6K2BlY2hvICRDT1JFX0xJTksgXAotICAgIHwgc2VkIC1lICJzL1wvLyRuZ3hfcmVnZXhfZGlyc2VwL2ciIC1lICJzL14vJG5neF9yZWdleF9jb250LyJgfQorICAgIHwgc2VkIC1lICJzL1wvLyRuZ3hfcmVnZXhfZGlyc2VwL2ciIC1lICJzL14vJG5neF9sb25nX3JlZ2V4X2NvbnQvImB9CiAKIAogY2F0IDw8IEVORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiAkTkdYX01BS0VGSUxFCiAKICROR1hfT0JKUyR7bmd4X2RpcnNlcH1uZ2lueCR7bmd4X2JpbmV4dH06CSRuZ3hfZGVwcyRuZ3hfc3BhY2VyCi0JXCQoTElOSykgJHtuZ3hfYmlub3V0fSROR1hfT0JKUyR7bmd4X2RpcnNlcH1uZ2lueCRuZ3hfY29udCRuZ3hfb2JqcyRuZ3hfbGlicyRuZ3hfbGluaworCVwkKExJTkspICR7bmd4X2xvbmdfc3RhcnR9JHtuZ3hfYmlub3V0fSROR1hfT0JKUyR7bmd4X2RpcnNlcH1uZ2lueCRuZ3hfbG9uZ19jb250JG5neF9vYmpzJG5neF9saWJzJG5neF9saW5rCiAJJG5neF9yY2MKLQorJHtuZ3hfbG9uZ19lbmR9CiBFTkQKIAogCmRpZmYgLS1naXQgYS9hdXRvL21vZHVsZXMgYi9hdXRvL21vZHVsZXMKaW5kZXggNDZmMzU2Yy4uMjZiMTA4NyAxMDA2NDQKLS0tIGEvYXV0by9tb2R1bGVzCisrKyBiL2F1dG8vbW9kdWxlcwpAQCAtMTM5LDYgKzEzOSwxMiBAQAogICAgIEhUVFBfU1JDUz0iJEhUVFBfU1JDUyAkSFRUUF9BQ0NFU1NfU1JDUyIKIGZpCiAKK2lmIFsgJEhUVFBfUkVBTElQID0gWUVTIF07IHRoZW4KKyAgICBoYXZlPU5HWF9IVFRQX1JFQUxJUCAuIGF1dG8vaGF2ZQorICAgIEhUVFBfTU9EVUxFUz0iJEhUVFBfTU9EVUxFUyAkSFRUUF9SRUFMSVBfTU9EVUxFIgorICAgIEhUVFBfU1JDUz0iJEhUVFBfU1JDUyAkSFRUUF9SRUFMSVBfU1JDUyIKK2ZpCisKIGlmIFsgJEhUVFBfU1RBVFVTID0gWUVTIF07IHRoZW4KICAgICBoYXZlPU5HWF9IVFRQX1NUQVRVUyAuIGF1dG8vaGF2ZQogICAgIEhUVFBfTU9EVUxFUz0iJEhUVFBfTU9EVUxFUyAkSFRUUF9TVEFUVVNfTU9EVUxFIgpkaWZmIC0tZ2l0IGEvYXV0by9vcHRpb25zIGIvYXV0by9vcHRpb25zCmluZGV4IDI5NjBmMDkuLjM1YzdhZDMgMTAwNjQ0Ci0tLSBhL2F1dG8vb3B0aW9ucworKysgYi9hdXRvL29wdGlvbnMKQEAgLTUwLDYgKzUwLDcgQEAKIEhUVFBfU1NMPU5PCiBIVFRQX1NTST1ZRVMKIEhUVFBfUE9TVFBPTkU9Tk8KK0hUVFBfUkVBTElQPU5PCiBIVFRQX0FDQ0VTUz1ZRVMKIEhUVFBfQVVUSF9CQVNJQz1ZRVMKIEhUVFBfVVNFUklEPVlFUwpAQCAtMTI1LDYgKzEyNiw3IEBACiAgICAgICAgIC0taHR0cC1mYXN0Y2dpLXRlbXAtcGF0aD0qKSAgICAgIE5HWF9IVFRQX0ZBU1RDR0lfVEVNUF9QQVRIPSIkdmFsdWUiIDs7CiAKICAgICAgICAgLS13aXRoLWh0dHBfc3NsX21vZHVsZSkgICAgICAgICAgSFRUUF9TU0w9WUVTICAgICAgICAgICAgICAgOzsKKyAgICAgICAgLS13aXRoLWh0dHBfcmVhbGlwX21vZHVsZSkgICAgICAgSFRUUF9SRUFMSVA9WUVTICAgICAgICAgICAgOzsKICAgICAgICAgLS13aXRob3V0LWh0dHBfY2hhcnNldF9tb2R1bGUpICAgSFRUUF9DSEFSU0VUPU5PICAgICAgICAgICAgOzsKICAgICAgICAgLS13aXRob3V0LWh0dHBfZ3ppcF9tb2R1bGUpICAgICAgSFRUUF9HWklQPU5PICAgICAgICAgICAgICAgOzsKICAgICAgICAgLS13aXRob3V0LWh0dHBfc3NpX21vZHVsZSkgICAgICAgSFRUUF9TU0k9Tk8gICAgICAgICAgICAgICAgOzsKZGlmZiAtLWdpdCBhL2F1dG8vc291cmNlcyBiL2F1dG8vc291cmNlcwppbmRleCBjNGFlYzcwLi44YWE1OTZjIDEwMDY0NAotLS0gYS9hdXRvL3NvdXJjZXMKKysrIGIvYXV0by9zb3VyY2VzCkBAIC0zMTAsNiArMzEwLDEwIEBACiBIVFRQX1VTRVJJRF9TUkNTPXNyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfdXNlcmlkX2ZpbHRlcl9tb2R1bGUuYwogCiAKK0hUVFBfUkVBTElQX01PRFVMRT1uZ3hfaHR0cF9yZWFsaXBfbW9kdWxlCitIVFRQX1JFQUxJUF9TUkNTPXNyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfcmVhbGlwX21vZHVsZS5jCisKKwogSFRUUF9BQ0NFU1NfTU9EVUxFPW5neF9odHRwX2FjY2Vzc19tb2R1bGUKIEhUVFBfQUNDRVNTX1NSQ1M9c3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9hY2Nlc3NfbW9kdWxlLmMKIApkaWZmIC0tZ2l0IGEvY29uZi9uZ2lueC5jb25mIGIvY29uZi9uZ2lueC5jb25mCmluZGV4IDhkNjU0NDUuLjc4M2VhMmUgMTAwNjQ0Ci0tLSBhL2NvbmYvbmdpbnguY29uZgorKysgYi9jb25mL25naW54LmNvbmYKQEAgLTEsMTMgKzEsMTMgQEAKIAogI3VzZXIgIG5vYm9keTsKLXdvcmtlcl9wcm9jZXNzZXMgIDM7Cit3b3JrZXJfcHJvY2Vzc2VzICAxOwogCiAjZXJyb3JfbG9nICBsb2dzL2Vycm9yLmxvZzsKICNwaWQgICAgICAgIGxvZ3MvbmdpbngucGlkOwogCiAKIGV2ZW50cyB7Ci0gICAgY29ubmVjdGlvbnMgIDEwMjQ7CisgICAgd29ya2VyX2Nvbm5lY3Rpb25zICAxMDI0OwogfQogCiAKQEAgLTI1LDcgKzI1LDcgQEAKICAgICBzZXJ2ZXIgewogICAgICAgICBsaXN0ZW4gIDgwOwogCi0gICAgICAgIGNoYXJzZXQga29pOC1yOworICAgICAgICAjY2hhcnNldCBrb2k4LXI7CiAKICAgICAgICAgI2FjY2Vzc19sb2cgIGxvZ3MvYWNjZXNzLmxvZzsKIApkaWZmIC0tZ2l0IGEvZG9jcy94bWwvY2hhbmdlX2xvZ19jb25mLnhtbCBiL2RvY3MveG1sL2NoYW5nZV9sb2dfY29uZi54bWwKaW5kZXggNGFiYjc3OS4uZjk3ZWYwNCAxMDA2NDQKLS0tIGEvZG9jcy94bWwvY2hhbmdlX2xvZ19jb25mLnhtbAorKysgYi9kb2NzL3htbC9jaGFuZ2VfbG9nX2NvbmYueG1sCkBAIC0xNSw2ICsxNSw3IEBACiAgICAgPGJ1Z2ZpeD7p09DSwdfMxc7JxTwvYnVnZml4PgogICAgIDxmZWF0dXJlPuTPwsHXzMXOycU8L2ZlYXR1cmU+CiAgICAgPGNoYW5nZT7p2s3FzsXOycU8L2NoYW5nZT4KKyAgICA8c2VjdXJpdHk+4sXaz9DB087P09TYPC9zZWN1cml0eT4KICAgICA8d29ya2Fyb3VuZD7p2s3FzsXOycU8L3dvcmthcm91bmQ+CiA8L2NoYW5nZXM+CiAKQEAgLTI1LDYgKzI2LDcgQEAKICAgICA8YnVnZml4PkJ1Z2ZpeDwvYnVnZml4PgogICAgIDxmZWF0dXJlPkZlYXR1cmU8L2ZlYXR1cmU+CiAgICAgPGNoYW5nZT5DaGFuZ2U8L2NoYW5nZT4KKyAgICA8c2VjdXJpdHk+U2VjdXJpdHk8L3NlY3VyaXR5PgogICAgIDx3b3JrYXJvdW5kPldvcmthcm91bmQ8L3dvcmthcm91bmQ+CiAKICAgICA8bW9udGg+IEphbiA8L21vbnRoPgpkaWZmIC0tZ2l0IGEvZG9jcy94bWwvbmdpbngvY2hhbmdlcy54bWwgYi9kb2NzL3htbC9uZ2lueC9jaGFuZ2VzLnhtbAppbmRleCAzYjFhYTEwLi5kZmFjMmEwIDEwMDY0NAotLS0gYS9kb2NzL3htbC9uZ2lueC9jaGFuZ2VzLnhtbAorKysgYi9kb2NzL3htbC9uZ2lueC9jaGFuZ2VzLnhtbApAQCAtOSw2ICs5LDE4MSBAQAogPHRpdGxlIGxhbmc9ImVuIj5uZ2lueCBjaGFuZ2Vsb2c8L3RpdGxlPgogCiAKKzxjaGFuZ2VzIHZlcj0iMC4zLjgiIGRhdGU9IjA5LjExLjIwMDUiPgorCis8Y2hhbmdlIHR5cGU9InNlY3VyaXR5Ij4KKzxwYXJhIGxhbmc9InJ1Ij4KK25naW54INTF0MXS2CDQ0s/XxdLR1CBVUkksINDPzNXexc7O2cUgz9QgwtzLxc7EwSDXINPU0s/LxSAiWC1BY2NlbC1SZWRpcmVjdCIKK9cg2sHHz8zP18vFIM/U18XUwSwgyczJINcgU1NJIMbByszFIM7BIM7BzMneycUg0NXUxcogIi8uLi8iIMkgztXMxcouCis8L3BhcmE+Cis8cGFyYSBsYW5nPSJlbiI+CituZ2lueCBub3cgY2hlY2tzIFVSSSBnb3QgZnJvbSBhIGJhY2tlbmQgaW4gIlgtQWNjZWwtUmVkaXJlY3QiIGhlYWRlciBsaW5lCitvciBpbiBTU0kgZmlsZSBmb3IgdGhlICIvLi4vIiBwYXRocyBhbmQgemVyb2VzLgorPC9wYXJhPgorPC9jaGFuZ2U+CisKKzxjaGFuZ2UgdHlwZT0iY2hhbmdlIj4KKzxwYXJhIGxhbmc9InJ1Ij4KK25naW54INTF0MXS2CDOxSDXz9PQ0snOyc3BxdQg0NXT1M/FIMnN0SDLwcsg0NLB18nM2M7PxQor1yDT1NLPy8UgIkF1dGhvcml6YXRpb24iINcg2sHHz8zP18vFINrB0NLP08EuCis8L3BhcmE+Cis8cGFyYSBsYW5nPSJlbiI+CituZ2lueCBub3cgZG9lcyBub3QgdHJlYXQgdGhlIGVtcHR5IHVzZXIgbmFtZSBpbiB0aGUgIkF1dGhvcml6YXRpb24iIGhlYWRlcgorbGluZSBhcyB2YWxpZCBvbmUuCis8L3BhcmE+Cis8L2NoYW5nZT4KKworPGNoYW5nZSB0eXBlPSJmZWF0dXJlIj4KKzxwYXJhIGxhbmc9InJ1Ij4KK8TJ0sXL1MnXwSBzc2xfc2Vzc2lvbl90aW1lb3V0IM3PxNXMxcoKK25neF9odHRwX3NzbF9tb2R1bGUgySBuZ3hfaW1hcF9zc2xfbW9kdWxlLgorPC9wYXJhPgorPHBhcmEgbGFuZz0iZW4iPgordGhlICJzc2xfc2Vzc2lvbl90aW1lb3V0IiBkaXJlY3RpdmVzCitvZiB0aGUgbmd4X2h0dHBfc3NsX21vZHVsZSBhbmQgbmd4X2ltYXBfc3NsX21vZHVsZS4KKzwvcGFyYT4KKzwvY2hhbmdlPgorCis8Y2hhbmdlIHR5cGU9ImZlYXR1cmUiPgorPHBhcmEgbGFuZz0icnUiPgorxMnSxcvUydfBIGF1dGhfaHR0cF9oZWFkZXIgzc/E1czRIG5neF9pbWFwX2F1dGhfaHR0cF9tb2R1bGUuCis8L3BhcmE+Cis8cGFyYSBsYW5nPSJlbiI+Cit0aGUgImF1dGhfaHR0cF9oZWFkZXIiIGRpcmVjdGl2ZSBvZiB0aGUgbmd4X2ltYXBfYXV0aF9odHRwX21vZHVsZS4KKzwvcGFyYT4KKzwvY2hhbmdlPgorCis8Y2hhbmdlIHR5cGU9ImZlYXR1cmUiPgorPHBhcmEgbGFuZz0icnUiPgorxMnSxcvUydfBIGFkZF9oZWFkZXIuCis8L3BhcmE+Cis8cGFyYSBsYW5nPSJlbiI+Cit0aGUgImFkZF9oZWFkZXIiIGRpcmVjdGl2ZS4KKzwvcGFyYT4KKzwvY2hhbmdlPgorCis8Y2hhbmdlIHR5cGU9ImZlYXR1cmUiPgorPHBhcmEgbGFuZz0icnUiPgorzc/E1czYIG5neF9odHRwX3JlYWxpcF9tb2R1bGUuCis8L3BhcmE+Cis8cGFyYSBsYW5nPSJlbiI+Cit0aGUgbmd4X2h0dHBfcmVhbGlwX21vZHVsZS4KK2RpcmVjdGl2ZXMuCis8L3BhcmE+Cis8L2NoYW5nZT4KKworPGNoYW5nZSB0eXBlPSJmZWF0dXJlIj4KKzxwYXJhIGxhbmc9InJ1Ij4KK87P19nFINDF0sXNxc7O2cUgxMzRIMnT0M/M2NrP18HOydEg1yDEydLFy9TJ18UgbG9nX2Zvcm1hdDoKKyRieXRlc19zZW50LCAkYXBhY2hlX2J5dGVzX3NlbnQsICRzdGF0dXMsICR0aW1lX2dtdCwKKyR1cmksICRyZXF1ZXN0X3RpbWUsICRyZXF1ZXN0X2xlbmd0aCwKKyR1cHN0cmVhbV9zdGF0dXMsICR1cHN0cmVhbV9yZXNwb25zZV90aW1lLAorJGd6aXBfcmF0aW8sCiskdWlkX2dvdCwgJHVpZF9zZXQsCiskY29ubmVjdGlvbiwgJHBpcGUgySAkbXNlYy4KK/DB0sHNxdTS2SDXINfJxMUgIiVuYW1lIiDTy8/SzyDC1cTV1CDV0NLB2sTOxc7ZLgorPC9wYXJhPgorPHBhcmEgbGFuZz0iZW4iPgordGhlIG5ldyB2YXJpYWJsZXMgdG8gdXNlIGluIHRoZSAibG9nX2Zvcm1hdCIgZGlyZWN0aXZlOgorJGJ5dGVzX3NlbnQsICRhcGFjaGVfYnl0ZXNfc2VudCwgJHN0YXR1cywgJHRpbWVfZ210LAorJHVyaSwgJHJlcXVlc3RfdGltZSwgJHJlcXVlc3RfbGVuZ3RoLAorJHVwc3RyZWFtX3N0YXR1cywgJHVwc3RyZWFtX3Jlc3BvbnNlX3RpbWUsCiskZ3ppcF9yYXRpbywKKyR1aWRfZ290LCAkdWlkX3NldCwKKyRjb25uZWN0aW9uLCAkcGlwZSwgYW5kICRtc2VjLgorVGhlIHBhcmFtZXRlcnMgaW4gdGhlICIlbmFtZSIgZm9ybSB3aWxsIGJlIGNhbmNlbGVkIHNvb24uCis8L3BhcmE+Cis8L2NoYW5nZT4KKworPGNoYW5nZSB0eXBlPSJjaGFuZ2UiPgorPHBhcmEgbGFuZz0icnUiPgor1yDEydLFy9TJ18UgImlmIiDMz9bO2c3JINrOwd7FzsnRzckg0MXSxc3Fzs7ZyCDUxdDF0tgg0dfM0cDU09EKK9DV09TB0SDT1NLPy8EgIiIgySDT1NLPy8ksIM7B3snOwcDdycXT0SDOwSAiMCIuCis8L3BhcmE+Cis8cGFyYSBsYW5nPSJlbiI+Citub3cgdGhlIGZhbHNlIHZhcmlhYmxlIHZhbHVlcyBpbiB0aGUgImlmIiBkaXJlY3RpdmUgYXJlIHRoZSBlbXB0eSBzdHJpbmcgIiIKK2FuZCBzdHJpbmcgc3RhcnRpbmcgd2l0aCAiMCIuCis8L3BhcmE+Cis8L2NoYW5nZT4KKworPGNoYW5nZSB0eXBlPSJidWdmaXgiPgorPHBhcmEgbGFuZz0icnUiPgor0NLJINLBws/UwcXUINMg0NLPy9PJ0s/Xwc7O2c3JIMnMySBGYXN0Q0dJLdPF0tfF0sHNySBuZ2lueCDNz8cgz9PUwdfM0dTYCivP1MvS2dTZzckg08/FxMnOxc7J0SDJINfSxc3Fzs7ZxSDGwcrM2SDTINrB0NLP08HNySDLzMnFztTP1y4KKzwvcGFyYT4KKzxwYXJhIGxhbmc9ImVuIj4KK3doaWxlIHVzaW5nIHByb3hpZWQgb3IgRmFzdENHSS1zZXJ2ZXIgbmdpbnggbWF5IGxlYXZlIGNvbm5lY3Rpb25zCithbmQgdGVtcG9yYXJ5IGZpbGVzIHdpdGggY2xpZW50IHJlcXVlc3RzIGluIG9wZW4gc3RhdGUuCis8L3BhcmE+Cis8L2NoYW5nZT4KKworPGNoYW5nZSB0eXBlPSJidWdmaXgiPgorPHBhcmEgbGFuZz0icnUiPgor0sHCz97JxSDQ0s/DxdPT2SDOxSDTwtLB09nXwcwgwtXGxdLJ2snSz9fBzs7ZxSDMz8fJINDSySDQzMHXzs/NINfZyM/ExS4KKzwvcGFyYT4KKzxwYXJhIGxhbmc9ImVuIj4KK3RoZSB3b3JrZXIgcHJvY2Vzc2VzIGRpZCBub3QgZmx1c2ggdGhlIGJ1ZmZlcmVkIGxvZ3Mgb24gZ3JhY2VmdWwgZXhpdC4KKzwvcGFyYT4KKzwvY2hhbmdlPgorCis8Y2hhbmdlIHR5cGU9ImJ1Z2ZpeCI+Cis8cGFyYSBsYW5nPSJydSI+CivF08zJIFVSSSDawdDSz9PBIMnazcXO0czP09gg0yDQz83P3djAIHJld3JpdGUsIMEg2sHUxc0g2sHQ0s/TINDSz8vTydLP18HM09EKK9cgbG9jYXRpb24sINrBxMHOzs/NINLFx9XM0dLO2c0g19nSwdbFzsnFzSwg1M8gwtzLxc7E1SDQxdLFxMHXwczT0QorzsXXxdLO2cog2sHQ0s/TOworz9vJwsvBINDP0dfJzMHT2CDXIDAuMi42LgorPC9wYXJhPgorPHBhcmEgbGFuZz0iZW4iPgoraWYgdGhlIHJlcXVlc3QgVVJJIHdhcyBjaGFuZ2VzIGJ5IHRoZSAicmV3cml0ZSIgZGlyZWN0aXZlIGFuZCB0aGUgcmVxdWVzdAord2FzIHByb3hpZWQgaW4gbG9jYXRpb24gZ2l2ZW4gYnkgcmVndWxhciBleHByZXNzaW9uLCB0aGVuIHRoZSBpbmNvcnJlY3QKK3JlcXVlc3Qgd2FzIHRyYW5zZmVycmVkIHRvIGJhY2tlbmQ7CitidWcgYXBwZWFyZWQgaW4gMC4yLjYuCis8L3BhcmE+Cis8L2NoYW5nZT4KKworPGNoYW5nZSB0eXBlPSJidWdmaXgiPgorPHBhcmEgbGFuZz0icnUiPgorxMnSxcvUydfBIGV4cGlyZXMgzsUg1cTBzNHMwSDV1sUg1dPUwc7P18zFzs7VwCDT1NLPy9Ug2sHHz8zP18vBICJFeHBpcmVzIi4KKzwvcGFyYT4KKzxwYXJhIGxhbmc9ImVuIj4KK3RoZSAiZXhwaXJlcyIgZGlyZWN0aXZlIGRpZCBub3QgcmVtb3ZlIHRoZSBwcmV2aW91cyAiRXhwaXJlcyIgaGVhZGVyLgorPC9wYXJhPgorPC9jaGFuZ2U+CisKKzxjaGFuZ2UgdHlwZT0iYnVnZml4Ij4KKzxwYXJhIGxhbmc9InJ1Ij4KK9DSySDJ09DPzNjaz9fBzsnJIM3F1M/EwSBydHNpZyDJIM7F08vPzNjLycgg0sHCz97JyCDQ0s/DxdPTwcggbmdpbngKK83PxyDQxdLF09TB1Ngg0NLJzsnNwdTYINrB0NLP09kuCis8L3BhcmE+Cis8cGFyYSBsYW5nPSJlbiI+CituZ2lueCBtYXkgc3RvcCB0byBhY2NlcHQgcmVxdWVzdHMgaWYgdGhlICJydHNpZyIgbWV0aG9kIGFuZCBzZXZlcmFsIHdvcmtlcgorcHJvY2Vzc2VzIHdlcmUgdXNlZC4KKzwvcGFyYT4KKzwvY2hhbmdlPgorCis8Y2hhbmdlIHR5cGU9ImJ1Z2ZpeCI+Cis8cGFyYSBsYW5nPSJydSI+CivXIFNTSSDLz83BzsTByCDOxdfF0s7PIM/C0sHCwdTZ18HMydPYINPU0s/LySAiXCIiIMkgIlwnIi4KKzwvcGFyYT4KKzxwYXJhIGxhbmc9ImVuIj4KK3RoZSAiXCIiIGFuZCAiXCciIGVzY2FwZSBzeW1ib2xzIHdlcmUgaW5jb3JyZWN0bHkgaGFuZGxlZCBpbiBTU0kgY29tbWFuZHMuCis8L3BhcmE+Cis8L2NoYW5nZT4KKworPGNoYW5nZSB0eXBlPSJidWdmaXgiPgorPHBhcmEgbGFuZz0icnUiPgorxdPMySDP1NfF1CDawcvBzt7J18HM09Eg09LB2tUg1sUg0M/TzMUgU1NJIMvPzcHOxNksINTPINDSySDJ09DPzNjaz9fBzsnJCivT1sHUydEgz9TXxdQg0MXSxcTB18HM09EgzsUgxM8gy8/Ow8EgyczJIM7FINDF0sXEwdfBzNPRINfPz8LdxS4KKzwvcGFyYT4KKzxwYXJhIGxhbmc9ImVuIj4KK2lmIHRoZSByZXNwb25zZSB3YXMgZW5kZWQganVzdCBhZnRlciB0aGUgU1NJIGNvbW1hbmQgYW5kIGd6aXBwaW5nIHdhcyB1c2VkLAordGhlbiB0aGUgcmVzcG9uc2UgZGlkIG5vdCB0cmFuc2ZlcnJlZCBjb21wbGV0ZSBvciBkaWQgbm90IHRyYW5zZmVycmVkIGF0IGFsbC4KKzwvcGFyYT4KKzwvY2hhbmdlPgorCis8L2NoYW5nZXM+CisKKwogPGNoYW5nZXMgdmVyPSIwLjMuNyIgZGF0ZT0iMjcuMTAuMjAwNSI+CiAKIDxjaGFuZ2UgdHlwZT0iZmVhdHVyZSI+CmRpZmYgLS1naXQgYS9zcmMvY29yZS9uZ2lueC5oIGIvc3JjL2NvcmUvbmdpbnguaAppbmRleCA3OGFlMmE3Li45NjZkNDA1IDEwMDY0NAotLS0gYS9zcmMvY29yZS9uZ2lueC5oCisrKyBiL3NyYy9jb3JlL25naW54LmgKQEAgLTgsNyArOCw3IEBACiAjZGVmaW5lIF9OR0lOWF9IX0lOQ0xVREVEXwogCiAKLSNkZWZpbmUgTkdJTlhfVkVSICAgICAgICAgICJuZ2lueC8wLjMuNyIKKyNkZWZpbmUgTkdJTlhfVkVSICAgICAgICAgICJuZ2lueC8wLjMuOCIKIAogI2RlZmluZSBOR0lOWF9WQVIgICAgICAgICAgIk5HSU5YIgogI2RlZmluZSBOR1hfT0xEUElEX0VYVCAgICAgIi5vbGRiaW4iCmRpZmYgLS1naXQgYS9zcmMvY29yZS9uZ3hfY29uZl9maWxlLmggYi9zcmMvY29yZS9uZ3hfY29uZl9maWxlLmgKaW5kZXggYjA5ZDhjYy4uYWRmMjAzYSAxMDA2NDQKLS0tIGEvc3JjL2NvcmUvbmd4X2NvbmZfZmlsZS5oCisrKyBiL3NyYy9jb3JlL25neF9jb25mX2ZpbGUuaApAQCAtODIsNyArODIsNyBAQAogICAgIHZvaWQgICAgICAgICAgICAgICAgICpwb3N0OwogfTsKIAotI2RlZmluZSBuZ3hfbnVsbF9jb21tYW5kICAgeyBuZ3hfbnVsbF9zdHJpbmcsIDAsIE5VTEwsIDAsIDAsIE5VTEwgfQorI2RlZmluZSBuZ3hfbnVsbF9jb21tYW5kICB7IG5neF9udWxsX3N0cmluZywgMCwgTlVMTCwgMCwgMCwgTlVMTCB9CiAKIAogc3RydWN0IG5neF9vcGVuX2ZpbGVfcyB7CmRpZmYgLS1naXQgYS9zcmMvY29yZS9uZ3hfc3RyaW5nLmMgYi9zcmMvY29yZS9uZ3hfc3RyaW5nLmMKaW5kZXggMTE2NGNjNC4uYTIzNjY1NCAxMDA2NDQKLS0tIGEvc3JjL2NvcmUvbmd4X3N0cmluZy5jCisrKyBiL3NyYy9jb3JlL25neF9zdHJpbmcuYwpAQCAtMTkwLDcgKzE5MCw5IEBACiAgICAgICAgICAgICBjYXNlICdWJzoKICAgICAgICAgICAgICAgICBzID0gdmFfYXJnKGFyZ3MsIG5neF9zdHJfdCAqKTsKIAotICAgICAgICAgICAgICAgIGxlbiA9IChidWYgKyBzLT5sZW4gPCBsYXN0KSA/IHMtPmxlbiA6IChzaXplX3QpIChsYXN0IC0gYnVmKTsKKyAgICAgICAgICAgICAgICBsZW4gPSBzLT5sZW4gJiAweGZmZmY7CisgICAgICAgICAgICAgICAgbGVuID0gKGJ1ZiArIGxlbiA8IGxhc3QpID8gbGVuIDogKHNpemVfdCkgKGxhc3QgLSBidWYpOworCiAgICAgICAgICAgICAgICAgYnVmID0gbmd4X2NweW1lbShidWYsIHMtPmRhdGEsIGxlbik7CiAgICAgICAgICAgICAgICAgZm10Kys7CiAKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL25neF9zdHJpbmcuaCBiL3NyYy9jb3JlL25neF9zdHJpbmcuaAppbmRleCA1NDVjNmNjLi5iMDE5ZTMzIDEwMDY0NAotLS0gYS9zcmMvY29yZS9uZ3hfc3RyaW5nLmgKKysrIGIvc3JjL2NvcmUvbmd4X3N0cmluZy5oCkBAIC00Niw3ICs0Niw3IEBACiAjZGVmaW5lIG5neF9zdHJuY21wKHMxLCBzMiwgbikgIHN0cm5jbXAoKGNvbnN0IGNoYXIgKikgczEsIChjb25zdCBjaGFyICopIHMyLCBuKQogCiAKLS8qIG1zdmMgYW5kIGljYyBjb21waWxlIHN0cmNtcCgpIHRvIGlubGluZSBsb29wICovCisvKiBtc3ZjIGFuZCBpY2M3IGNvbXBpbGUgc3RyY21wKCkgdG8gaW5saW5lIGxvb3AgKi8KICNkZWZpbmUgbmd4X3N0cmNtcChzMSwgczIpICBzdHJjbXAoKGNvbnN0IGNoYXIgKikgczEsIChjb25zdCBjaGFyICopIHMyKQogCiAKQEAgLTU1LDIwICs1NSw1NSBAQAogCiAKIC8qCi0gKiBtc3ZjIGFuZCBpY2MgY29tcGlsZSBtZW1zZXQoKSB0byB0aGUgaW5saW5lICJyZXAgc3RvcyIKKyAqIG1zdmMgYW5kIGljYzcgY29tcGlsZSBtZW1zZXQoKSB0byB0aGUgaW5saW5lICJyZXAgc3RvcyIKICAqIHdoaWxlIFplcm9NZW1vcnkoKSBhbmQgYnplcm8oKSBhcmUgdGhlIGNhbGxzLgotICogaWNjIG1heSBhbHNvIGlubGluZSBzZXZlcmFsIG1vdidzIG9mIGEgemVyb2VkIHJlZ2lzdGVyIGZvciBzbWFsbCBibG9ja3MuCisgKiBpY2M3IG1heSBhbHNvIGlubGluZSBzZXZlcmFsIG1vdidzIG9mIGEgemVyb2VkIHJlZ2lzdGVyIGZvciBzbWFsbCBibG9ja3MuCiAgKi8KICNkZWZpbmUgbmd4X21lbXplcm8oYnVmLCBuKSAgICAgICAodm9pZCkgbWVtc2V0KGJ1ZiwgMCwgbikKICNkZWZpbmUgbmd4X21lbXNldChidWYsIGMsIG4pICAgICAodm9pZCkgbWVtc2V0KGJ1ZiwgYywgbikKIAogCi0vKiBtc3ZjIGFuZCBpY2MgY29tcGlsZSBtZW1jcHkoKSB0byB0aGUgaW5saW5lICJyZXAgbW92cyIgKi8KKy8qCisgKiBnY2MzLCBtc3ZjLCBhbmQgaWNjNyBjb21waWxlIG1lbWNweSgpIHRvIHRoZSBpbmxpbmUgInJlcCBtb3ZzIi4KKyAqIGdjYzMgY29tcGlsZXMgbWVtY3B5KGQsIHMsIDQpIHRvIHRoZSBpbmxpbmUgIm1vdiJlcy4KKyAqIGljYzggY29tcGlsZSBtZW1jcHkoZCwgcywgNCkgdG8gdGhlIGlubGluZSAibW92ImVzIG9yIFhNTSBtb3Zlcy4KKyAqLwogI2RlZmluZSBuZ3hfbWVtY3B5KGRzdCwgc3JjLCBuKSAgICh2b2lkKSBtZW1jcHkoZHN0LCBzcmMsIG4pCiAjZGVmaW5lIG5neF9jcHltZW0oZHN0LCBzcmMsIG4pICAgKCh1X2NoYXIgKikgbWVtY3B5KGRzdCwgc3JjLCBuKSkgKyAobikKIAogCi0vKiBtc3ZjIGFuZCBpY2MgY29tcGlsZSBtZW1jbXAoKSB0byB0aGUgaW5saW5lIGxvb3AgKi8KKyNpZiAoIF9fSU5URUxfQ09NUElMRVIgPj0gODAwICkKKworLyoKKyAqIHRoZSBzaW1wbGUgaW5saW5lIGN5Y2xlIGNvcGllcyB0aGUgdmFyaWFibGUgbGVuZ3RoIHN0cmluZ3MgdXAgdG8gMTYKKyAqIGJ5dGVzIGZhc3RlciB0aGFuIGljYzggYXV0b2RldGVjdGluZyBfaW50ZWxfZmFzdF9tZW1jcHkoKQorICovCisKK3N0YXRpYyBuZ3hfaW5saW5lIHVfY2hhciAqCituZ3hfY29weSh1X2NoYXIgKmRzdCwgdV9jaGFyICpzcmMsIHNpemVfdCBsZW4pCit7CisgICAgaWYgKGxlbiA8IDE3KSB7CisKKyAgICAgICAgd2hpbGUgKGxlbikgeworICAgICAgICAgICAgKmRzdCsrID0gKnNyYysrOworICAgICAgICAgICAgbGVuLS07CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZHN0OworCisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG5neF9jcHltZW0oZHN0LCBzcmMsIGxlbik7CisgICAgfQorfQorCisjZWxzZQorCisjZGVmaW5lIG5neF9jb3B5ICAgICAgICAgICAgICAgICAgbmd4X2NweW1lbQorCisjZW5kaWYKKworCisvKiBtc3ZjIGFuZCBpY2M3IGNvbXBpbGUgbWVtY21wKCkgdG8gdGhlIGlubGluZSBsb29wICovCiAjZGVmaW5lIG5neF9tZW1jbXAgICAgICAgICAgICAgICAgbWVtY21wCiAKIApkaWZmIC0tZ2l0IGEvc3JjL2V2ZW50L21vZHVsZXMvbmd4X3J0c2lnX21vZHVsZS5jIGIvc3JjL2V2ZW50L21vZHVsZXMvbmd4X3J0c2lnX21vZHVsZS5jCmluZGV4IGU1N2E1ZGQuLmEzODkxZTggMTAwNjQ0Ci0tLSBhL3NyYy9ldmVudC9tb2R1bGVzL25neF9ydHNpZ19tb2R1bGUuYworKysgYi9zcmMvZXZlbnQvbW9kdWxlcy9uZ3hfcnRzaWdfbW9kdWxlLmMKQEAgLTI4OCw3ICsyODgsNyBAQAogICAgIG5neF9pbnRfdCAgICAgICAgICAgaW5zdGFuY2U7CiAgICAgbmd4X2Vycl90ICAgICAgICAgICBlcnI7CiAgICAgc2lnaW5mb190ICAgICAgICAgICBzaTsKLSAgICBuZ3hfZXZlbnRfdCAgICAgICAgKnJldiwgKndldjsKKyAgICBuZ3hfZXZlbnRfdCAgICAgICAgKnJldiwgKndldiwgKipxdWV1ZTsKICAgICBzdHJ1Y3QgdGltZXNwZWMgICAgIHRzLCAqdHA7CiAgICAgc3RydWN0IHNpZ2FjdGlvbiAgICBzYTsKICAgICBuZ3hfY29ubmVjdGlvbl90ICAgKmM7CkBAIC0zODEsMTUgKzM4MSwzMiBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKChzaS5zaV9iYW5kICYgKFBPTExJTnxQT0xMSFVQfFBPTExFUlIpKSAmJiByZXYtPmFjdGl2ZSkgeworCiAgICAgICAgICAgICByZXYtPnJlYWR5ID0gMTsKLSAgICAgICAgICAgIHJldi0+aGFuZGxlcihyZXYpOworCisgICAgICAgICAgICBpZiAoZmxhZ3MgJiBOR1hfUE9TVF9FVkVOVFMpIHsKKyAgICAgICAgICAgICAgICBxdWV1ZSA9IChuZ3hfZXZlbnRfdCAqKikgKHJldi0+YWNjZXB0ID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmd4X3Bvc3RlZF9hY2NlcHRfZXZlbnRzIDogJm5neF9wb3N0ZWRfZXZlbnRzKTsKKworICAgICAgICAgICAgICAgIG5neF9sb2NrZWRfcG9zdF9ldmVudChyZXYsIHF1ZXVlKTsKKworICAgICAgICAgICAgfSBlbHNlIHsgCisgICAgICAgICAgICAgICAgcmV2LT5oYW5kbGVyKHJldik7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICB3ZXYgPSBjLT53cml0ZTsKIAogICAgICAgICBpZiAoKHNpLnNpX2JhbmQgJiAoUE9MTE9VVHxQT0xMSFVQfFBPTExFUlIpKSAmJiB3ZXYtPmFjdGl2ZSkgeworCiAgICAgICAgICAgICB3ZXYtPnJlYWR5ID0gMTsKLSAgICAgICAgICAgIHdldi0+aGFuZGxlcih3ZXYpOworCisgICAgICAgICAgICBpZiAoZmxhZ3MgJiBOR1hfUE9TVF9FVkVOVFMpIHsKKyAgICAgICAgICAgICAgICBuZ3hfbG9ja2VkX3Bvc3RfZXZlbnQod2V2LCAmbmd4X3Bvc3RlZF9ldmVudHMpOworCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHdldi0+aGFuZGxlcih3ZXYpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIE5HWF9PSzsKZGlmZiAtLWdpdCBhL3NyYy9ldmVudC9uZ3hfZXZlbnQuYyBiL3NyYy9ldmVudC9uZ3hfZXZlbnQuYwppbmRleCA0Nzc1ZTVkLi41MTQ3MTk5IDEwMDY0NAotLS0gYS9zcmMvZXZlbnQvbmd4X2V2ZW50LmMKKysrIGIvc3JjL2V2ZW50L25neF9ldmVudC5jCkBAIC00OCw2ICs0OCw3IEBACiAKIAogbmd4X2F0b21pY190ICAgICAgICAgKm5neF9hY2NlcHRfbXV0ZXhfcHRyOworbmd4X2F0b21pY190ICAgICAgICAgKm5neF9hY2NlcHRfbXV0ZXhfbGFzdF9vd25lcjsKIG5neF9hdG9taWNfdCAgICAgICAgICpuZ3hfYWNjZXB0X211dGV4Owogbmd4X3VpbnRfdCAgICAgICAgICAgIG5neF9hY2NlcHRfbXV0ZXhfaGVsZDsKIG5neF9tc2VjX3QgICAgICAgICAgICBuZ3hfYWNjZXB0X211dGV4X2RlbGF5OwpAQCAtMjQ5LDEwICsyNTAsNiBAQAogICAgIG5neF9sb2dfZGVidWcxKE5HWF9MT0dfREVCVUdfRVZFTlQsIGN5Y2xlLT5sb2csIDAsCiAgICAgICAgICAgICAgICAgICAgInRpbWVyIGRlbHRhOiAlTSIsIGRlbHRhKTsKIAotICAgIGlmIChkZWx0YSkgewotICAgICAgICBuZ3hfZXZlbnRfZXhwaXJlX3RpbWVycygpOwotICAgIH0KLQogICAgIGlmIChuZ3hfcG9zdGVkX2FjY2VwdF9ldmVudHMpIHsKICAgICAgICAgbmd4X2V2ZW50X3Byb2Nlc3NfcG9zdGVkKGN5Y2xlLCAmbmd4X3Bvc3RlZF9hY2NlcHRfZXZlbnRzKTsKICAgICB9CkBAIC0yNjEsNiArMjU4LDEwIEBACiAgICAgICAgICpuZ3hfYWNjZXB0X211dGV4ID0gMDsKICAgICB9CiAKKyAgICBpZiAoZGVsdGEpIHsKKyAgICAgICAgbmd4X2V2ZW50X2V4cGlyZV90aW1lcnMoKTsKKyAgICB9CisKICAgICBuZ3hfbG9nX2RlYnVnMShOR1hfTE9HX0RFQlVHX0VWRU5ULCBjeWNsZS0+bG9nLCAwLAogICAgICAgICAgICAgICAgICAgICJwb3N0ZWQgZXZlbnRzICVwIiwgbmd4X3Bvc3RlZF9ldmVudHMpOwogCkBAIC00NzAsNiArNDcxLDcgQEAKICAgICAvKiBUT0RPOiBhZGp1c3QgY2FjaGUgbGluZSBzaXplLCAxMjggaXMgUDQgY2FjaGUgbGluZSBzaXplICovCiAKICAgICBzaXplID0gMTI4ICAgICAgICAgICAgLyogbmd4X2FjY2VwdF9tdXRleCAqLworICAgICAgICAgICArIDEyOCAgICAgICAgICAvKiBuZ3hfYWNjZXB0X211dGV4X2xhc3Rfb3duZXIgKi8KICAgICAgICAgICAgKyAxMjg7ICAgICAgICAgLyogbmd4X2Nvbm5lY3Rpb25fY291bnRlciAqLwogCiAjaWYgKE5HWF9TVEFUX1NUVUIpCkBAIC00ODksMTYgKzQ5MSwxNyBAQAogICAgIH0KIAogICAgIG5neF9hY2NlcHRfbXV0ZXhfcHRyID0gKG5neF9hdG9taWNfdCAqKSBzaGFyZWQ7Ci0gICAgbmd4X2Nvbm5lY3Rpb25fY291bnRlciA9IChuZ3hfYXRvbWljX3QgKikgKHNoYXJlZCArIDEyOCk7CisgICAgbmd4X2FjY2VwdF9tdXRleF9sYXN0X293bmVyID0gKG5neF9hdG9taWNfdCAqKSAoc2hhcmVkICsgMSAqIDEyOCk7CisgICAgbmd4X2Nvbm5lY3Rpb25fY291bnRlciA9IChuZ3hfYXRvbWljX3QgKikgKHNoYXJlZCArIDIgKiAxMjgpOwogCiAjaWYgKE5HWF9TVEFUX1NUVUIpCiAKLSAgICBuZ3hfc3RhdF9hY2NlcHRlZCA9IChuZ3hfYXRvbWljX3QgKikgKHNoYXJlZCArIDIgKiAxMjgpOwotICAgIG5neF9zdGF0X2hhbmRsZWQgPSAobmd4X2F0b21pY190ICopIChzaGFyZWQgKyAzICogMTI4KTsKLSAgICBuZ3hfc3RhdF9yZXF1ZXN0cyA9IChuZ3hfYXRvbWljX3QgKikgKHNoYXJlZCArIDQgKiAxMjgpOwotICAgIG5neF9zdGF0X2FjdGl2ZSA9IChuZ3hfYXRvbWljX3QgKikgKHNoYXJlZCArIDUgKiAxMjgpOwotICAgIG5neF9zdGF0X3JlYWRpbmcgPSAobmd4X2F0b21pY190ICopIChzaGFyZWQgKyA2ICogMTI4KTsKLSAgICBuZ3hfc3RhdF93cml0aW5nID0gKG5neF9hdG9taWNfdCAqKSAoc2hhcmVkICsgNyAqIDEyOCk7CisgICAgbmd4X3N0YXRfYWNjZXB0ZWQgPSAobmd4X2F0b21pY190ICopIChzaGFyZWQgKyAzICogMTI4KTsKKyAgICBuZ3hfc3RhdF9oYW5kbGVkID0gKG5neF9hdG9taWNfdCAqKSAoc2hhcmVkICsgNCAqIDEyOCk7CisgICAgbmd4X3N0YXRfcmVxdWVzdHMgPSAobmd4X2F0b21pY190ICopIChzaGFyZWQgKyA1ICogMTI4KTsKKyAgICBuZ3hfc3RhdF9hY3RpdmUgPSAobmd4X2F0b21pY190ICopIChzaGFyZWQgKyA2ICogMTI4KTsKKyAgICBuZ3hfc3RhdF9yZWFkaW5nID0gKG5neF9hdG9taWNfdCAqKSAoc2hhcmVkICsgNyAqIDEyOCk7CisgICAgbmd4X3N0YXRfd3JpdGluZyA9IChuZ3hfYXRvbWljX3QgKikgKHNoYXJlZCArIDggKiAxMjgpOwogCiAjZW5kaWYKIApAQCAtMTA4MiwxMCArMTA4NSwxMCBAQAogI2VuZGlmCiAjaWYgKE5HWF9IQVZFX1JUU0lHKQogICAgIG5neF91aW50X3QgICAgICAgICAgIHJ0c2lnOworICAgIG5neF9jb3JlX2NvbmZfdCAgICAgKmNjZjsKICNlbmRpZgogICAgIG5neF9pbnRfdCAgICAgICAgICAgIGksIGNvbm5lY3Rpb25zOwogICAgIG5neF9tb2R1bGVfdCAgICAgICAgKm1vZHVsZTsKLSAgICBuZ3hfY29yZV9jb25mX3QgICAgICpjY2Y7CiAgICAgbmd4X2V2ZW50X21vZHVsZV90ICAqZXZlbnRfbW9kdWxlOwogCiAgICAgY29ubmVjdGlvbnMgPSBOR1hfQ09ORl9VTlNFVF9VSU5UOwpAQCAtMTE4OSw4ICsxMTkyLDYgQEAKICAgICAgICAgcmV0dXJuIE5HWF9DT05GX09LOwogICAgIH0KIAotI2VuZGlmCi0KICAgICBpZiAoZWNmLT5hY2NlcHRfbXV0ZXgpIHsKICAgICAgICAgcmV0dXJuIE5HWF9DT05GX09LOwogICAgIH0KQEAgLTEyMDUsNiArMTIwNiwxMiBAQAogICAgICAgICAgICAgICAgICAgInRoZSBcInJ0c2lnXCIgbWV0aG9kIHJlcXVpcmVzIFwiYWNjZXB0X211dGV4XCIgdG8gYmUgb24iKTsKIAogICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKworI2Vsc2UKKworICAgIHJldHVybiBOR1hfQ09ORl9PSzsKKworI2VuZGlmCiB9CiAKIApkaWZmIC0tZ2l0IGEvc3JjL2V2ZW50L25neF9ldmVudC5oIGIvc3JjL2V2ZW50L25neF9ldmVudC5oCmluZGV4IGFmM2U0YTQuLjIxNTQ2MzUgMTAwNjQ0Ci0tLSBhL3NyYy9ldmVudC9uZ3hfZXZlbnQuaAorKysgYi9zcmMvZXZlbnQvbmd4X2V2ZW50LmgKQEAgLTQzOCw2ICs0MzgsNyBAQAogZXh0ZXJuIG5neF9hdG9taWNfdCAgICAgICAgICAqbmd4X2Nvbm5lY3Rpb25fY291bnRlcjsKIAogZXh0ZXJuIG5neF9hdG9taWNfdCAgICAgICAgICAqbmd4X2FjY2VwdF9tdXRleF9wdHI7CitleHRlcm4gbmd4X2F0b21pY190ICAgICAgICAgICpuZ3hfYWNjZXB0X211dGV4X2xhc3Rfb3duZXI7CiBleHRlcm4gbmd4X2F0b21pY190ICAgICAgICAgICpuZ3hfYWNjZXB0X211dGV4OwogZXh0ZXJuIG5neF91aW50X3QgICAgICAgICAgICAgbmd4X2FjY2VwdF9tdXRleF9oZWxkOwogZXh0ZXJuIG5neF9tc2VjX3QgICAgICAgICAgICAgbmd4X2FjY2VwdF9tdXRleF9kZWxheTsKQEAgLTQ3NCw4ICs0NzUsNiBAQAogCiB2b2lkIG5neF9ldmVudF9hY2NlcHQobmd4X2V2ZW50X3QgKmV2KTsKIG5neF9pbnRfdCBuZ3hfdHJ5bG9ja19hY2NlcHRfbXV0ZXgobmd4X2N5Y2xlX3QgKmN5Y2xlKTsKLW5neF9pbnRfdCBuZ3hfZGlzYWJsZV9hY2NlcHRfZXZlbnRzKG5neF9jeWNsZV90ICpjeWNsZSk7Ci1uZ3hfaW50X3Qgbmd4X2VuYWJsZV9hY2NlcHRfZXZlbnRzKG5neF9jeWNsZV90ICpjeWNsZSk7CiB1X2NoYXIgKm5neF9hY2NlcHRfbG9nX2Vycm9yKG5neF9sb2dfdCAqbG9nLCB1X2NoYXIgKmJ1Ziwgc2l6ZV90IGxlbik7CiAKIApkaWZmIC0tZ2l0IGEvc3JjL2V2ZW50L25neF9ldmVudF9hY2NlcHQuYyBiL3NyYy9ldmVudC9uZ3hfZXZlbnRfYWNjZXB0LmMKaW5kZXggMjM4YTQ5NC4uZjE3NDVjMSAxMDA2NDQKLS0tIGEvc3JjL2V2ZW50L25neF9ldmVudF9hY2NlcHQuYworKysgYi9zcmMvZXZlbnQvbmd4X2V2ZW50X2FjY2VwdC5jCkBAIC0xMyw2ICsxMyw4IEBACiAjZGVmaW5lIE5HWF9TT0NLTEVOICA1MTIKIAogCitzdGF0aWMgbmd4X2ludF90IG5neF9lbmFibGVfYWNjZXB0X2V2ZW50cyhuZ3hfY3ljbGVfdCAqY3ljbGUpOworc3RhdGljIG5neF9pbnRfdCBuZ3hfZGlzYWJsZV9hY2NlcHRfZXZlbnRzKG5neF9jeWNsZV90ICpjeWNsZSk7CiBzdGF0aWMgdm9pZCBuZ3hfY2xvc2VfYWNjZXB0ZWRfY29ubmVjdGlvbihuZ3hfY29ubmVjdGlvbl90ICpjKTsKIAogCkBAIC0yNjIsMTUgKzI2NCwyMCBAQAogICAgICAgICBuZ3hfbG9nX2RlYnVnMChOR1hfTE9HX0RFQlVHX0VWRU5ULCBjeWNsZS0+bG9nLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAiYWNjZXB0IG11dGV4IGxvY2tlZCIpOwogCi0gICAgICAgIGlmICghbmd4X2FjY2VwdF9tdXRleF9oZWxkKSB7Ci0gICAgICAgICAgICBpZiAobmd4X2VuYWJsZV9hY2NlcHRfZXZlbnRzKGN5Y2xlKSA9PSBOR1hfRVJST1IpIHsKLSAgICAgICAgICAgICAgICAqbmd4X2FjY2VwdF9tdXRleCA9IDA7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbmd4X2FjY2VwdF9tdXRleF9oZWxkID0gMTsKKyAgICAgICAgaWYgKG5neF9hY2NlcHRfbXV0ZXhfaGVsZAorICAgICAgICAgICAgJiYgKCEobmd4X2V2ZW50X2ZsYWdzICYgTkdYX1VTRV9SVFNJR19FVkVOVCkKKyAgICAgICAgICAgICAgICB8fCAqbmd4X2FjY2VwdF9tdXRleF9sYXN0X293bmVyID09IChuZ3hfYXRvbWljX3QpIG5neF9waWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gTkdYX09LOwogICAgICAgICB9CiAKKyAgICAgICAgaWYgKG5neF9lbmFibGVfYWNjZXB0X2V2ZW50cyhjeWNsZSkgPT0gTkdYX0VSUk9SKSB7CisgICAgICAgICAgICAqbmd4X2FjY2VwdF9tdXRleCA9IDA7CisgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgbmd4X2FjY2VwdF9tdXRleF9oZWxkID0gMTsKKwogICAgICAgICByZXR1cm4gTkdYX09LOwogICAgIH0KIApAQCAtMjg2LDcgKzI5Myw3IEBACiB9CiAKIAotbmd4X2ludF90CitzdGF0aWMgbmd4X2ludF90CiBuZ3hfZW5hYmxlX2FjY2VwdF9ldmVudHMobmd4X2N5Y2xlX3QgKmN5Y2xlKQogewogICAgIG5neF91aW50X3QgICAgICAgICBpOwpAQCAtMjk5LDEwICszMDYsMTcgQEAKICAgICAgICAgYyA9IGxzW2ldLmNvbm5lY3Rpb247CiAKICAgICAgICAgaWYgKG5neF9ldmVudF9mbGFncyAmIE5HWF9VU0VfUlRTSUdfRVZFTlQpIHsKKworICAgICAgICAgICAgaWYgKG5neF9hY2NlcHRfbXV0ZXhfaGVsZCkgeworICAgICAgICAgICAgICAgIGMtPnJlYWQtPmRpc2FibGVkID0gMTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKG5neF9hZGRfY29ubihjKSA9PSBOR1hfRVJST1IpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICAqbmd4X2FjY2VwdF9tdXRleF9sYXN0X293bmVyID0gbmd4X3BpZDsKKwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaWYgKG5neF9hZGRfZXZlbnQoYy0+cmVhZCwgTkdYX1JFQURfRVZFTlQsIDApID09IE5HWF9FUlJPUikgewogICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CkBAIC0zMTQsNyArMzI4LDcgQEAKIH0KIAogCi1uZ3hfaW50X3QKK3N0YXRpYyBuZ3hfaW50X3QKIG5neF9kaXNhYmxlX2FjY2VwdF9ldmVudHMobmd4X2N5Y2xlX3QgKmN5Y2xlKQogewogICAgIG5neF91aW50X3QgICAgICAgICBpOwpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9hY2Nlc3NfbW9kdWxlLmMgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2FjY2Vzc19tb2R1bGUuYwppbmRleCBiMDJlOGNmLi4wZTM0MzAzIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2FjY2Vzc19tb2R1bGUuYworKysgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2FjY2Vzc19tb2R1bGUuYwpAQCAtMTQsNyArMTQsNyBAQAogdHlwZWRlZiBzdHJ1Y3QgewogICAgIGluX2FkZHJfdCAgICAgbWFzazsKICAgICBpbl9hZGRyX3QgICAgIGFkZHI7Ci0gICAgdW5zaWduZWQgICAgICBkZW55OworICAgIG5neF91aW50X3QgICAgZGVueTsgICAgICAvKiB1bnNpZ25lZCAgZGVueToxOyAqLwogfSBuZ3hfaHR0cF9hY2Nlc3NfcnVsZV90OwogCiAKQEAgLTEwNiw3ICsxMDYsNyBAQAogICAgIGZvciAoaSA9IDA7IGkgPCBhbGNmLT5ydWxlcy0+bmVsdHM7IGkrKykgewogCiAgICAgICAgIG5neF9sb2dfZGVidWczKE5HWF9MT0dfREVCVUdfSFRUUCwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAiJTA4WEQgJTA4WEQgJTA4WEQiLAorICAgICAgICAgICAgICAgICAgICAgICAiYWNjZXNzOiAlMDhYRCAlMDhYRCAlMDhYRCIsCiAgICAgICAgICAgICAgICAgICAgICAgIHNpbi0+c2luX2FkZHIuc19hZGRyLCBydWxlW2ldLm1hc2ssIHJ1bGVbaV0uYWRkcik7CiAKICAgICAgICAgaWYgKChzaW4tPnNpbl9hZGRyLnNfYWRkciAmIHJ1bGVbaV0ubWFzaykgPT0gcnVsZVtpXS5hZGRyKSB7CmRpZmYgLS1naXQgYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2Zhc3RjZ2lfbW9kdWxlLmMgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2Zhc3RjZ2lfbW9kdWxlLmMKaW5kZXggZDU4YzdjNi4uMTYwYWFjYiAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9mYXN0Y2dpX21vZHVsZS5jCisrKyBiL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfZmFzdGNnaV9tb2R1bGUuYwpAQCAtMTcsNiArMTcsNyBAQAogCiAgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgICAgICBpbmRleDsKIAorICAgIG5neF9hcnJheV90ICAgICAgICAgICAgICAgICAgICAqZmx1c2hlczsKICAgICBuZ3hfYXJyYXlfdCAgICAgICAgICAgICAgICAgICAgKnBhcmFtc19sZW47CiAgICAgbmd4X2FycmF5X3QgICAgICAgICAgICAgICAgICAgICpwYXJhbXM7CiAgICAgbmd4X2FycmF5X3QgICAgICAgICAgICAgICAgICAgICpwYXJhbXNfc291cmNlOwpAQCAtMTExLDkgKzExMiw4IEBACiBzdGF0aWMgdm9pZCAqbmd4X2h0dHBfZmFzdGNnaV9jcmVhdGVfbG9jX2NvbmYobmd4X2NvbmZfdCAqY2YpOwogc3RhdGljIGNoYXIgKm5neF9odHRwX2Zhc3RjZ2lfbWVyZ2VfbG9jX2NvbmYobmd4X2NvbmZfdCAqY2YsCiAgICAgdm9pZCAqcGFyZW50LCB2b2lkICpjaGlsZCk7Ci1zdGF0aWMgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAqCi0gICAgbmd4X2h0dHBfZmFzdGNnaV9zY3JpcHRfbmFtZV92YXJpYWJsZShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCi0gICAgdWludHB0cl90IGRhdGEpOworc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9mYXN0Y2dpX3NjcmlwdF9uYW1lX3ZhcmlhYmxlKG5neF9odHRwX3JlcXVlc3RfdCAqciwKKyAgICBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICp2LCB1aW50cHRyX3QgZGF0YSk7CiAKIHN0YXRpYyBjaGFyICpuZ3hfaHR0cF9mYXN0Y2dpX3Bhc3Mobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwKICAgICB2b2lkICpjb25mKTsKQEAgLTQxMCw2ICs0MTAsOSBAQAogICAgIGlmIChmbGNmLT5wYXJhbXNfbGVuKSB7CiAgICAgICAgIG5neF9tZW16ZXJvKCZsZSwgc2l6ZW9mKG5neF9odHRwX3NjcmlwdF9lbmdpbmVfdCkpOwogCisgICAgICAgIG5neF9odHRwX3NjcmlwdF9mbHVzaF9ub19jYWNoYWJsZV92YXJpYWJsZXMociwgZmxjZi0+Zmx1c2hlcyk7CisgICAgICAgIGxlLmZsdXNoZWQgPSAxOworCiAgICAgICAgIGxlLmlwID0gZmxjZi0+cGFyYW1zX2xlbi0+ZWx0czsKICAgICAgICAgbGUucmVxdWVzdCA9IHI7CiAKQEAgLTUwNyw2ICs1MTAsNyBAQAogICAgICAgICBlLmlwID0gZmxjZi0+cGFyYW1zLT5lbHRzOwogICAgICAgICBlLnBvcyA9IGItPmxhc3Q7CiAgICAgICAgIGUucmVxdWVzdCA9IHI7CisgICAgICAgIGUuZmx1c2hlZCA9IDE7CiAKICAgICAgICAgbGUuaXAgPSBmbGNmLT5wYXJhbXNfbGVuLT5lbHRzOwogCkBAIC01OTcsOCArNjAxLDggQEAKICAgICAgICAgICAgICAgICAqYi0+bGFzdCsrID0gY2g7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsIGhlYWRlcltpXS52YWx1ZS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2ldLnZhbHVlLmxlbik7CisgICAgICAgICAgICBiLT5sYXN0ID0gbmd4X2NvcHkoYi0+bGFzdCwgaGVhZGVyW2ldLnZhbHVlLmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2ldLnZhbHVlLmxlbik7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE2MzQsOSArMTYzOCwxMCBAQAogICAgIH0KIAogICAgIGlmIChjb25mLT5wYXJhbXNfc291cmNlID09IE5VTEwpIHsKLSAgICAgICAgY29uZi0+cGFyYW1zX3NvdXJjZSA9IHByZXYtPnBhcmFtc19zb3VyY2U7CisgICAgICAgIGNvbmYtPmZsdXNoZXMgPSBwcmV2LT5mbHVzaGVzOwogICAgICAgICBjb25mLT5wYXJhbXNfbGVuID0gcHJldi0+cGFyYW1zX2xlbjsKICAgICAgICAgY29uZi0+cGFyYW1zID0gcHJldi0+cGFyYW1zOworICAgICAgICBjb25mLT5wYXJhbXNfc291cmNlID0gcHJldi0+cGFyYW1zX3NvdXJjZTsKIAogICAgICAgICBpZiAoY29uZi0+cGFyYW1zX3NvdXJjZSA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfT0s7CkBAIC0xNjQ3LDcgKzE2NTIsNyBAQAogICAgIGlmIChjb25mLT5wYXJhbXNfbGVuID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgIH0KLSAgICAKKwogICAgIGNvbmYtPnBhcmFtcyA9IG5neF9hcnJheV9jcmVhdGUoY2YtPnBvb2wsIDUxMiwgMSk7CiAgICAgaWYgKGNvbmYtPnBhcmFtcyA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKQEAgLTE3MjksNiArMTczNCw3IEBACiAKICAgICAgICAgICAgIHNjLmNmID0gY2Y7CiAgICAgICAgICAgICBzYy5zb3VyY2UgPSAmc3JjW2ldLnZhbHVlOworICAgICAgICAgICAgc2MuZmx1c2hlcyA9ICZjb25mLT5mbHVzaGVzOwogICAgICAgICAgICAgc2MubGVuZ3RocyA9ICZjb25mLT5wYXJhbXNfbGVuOwogICAgICAgICAgICAgc2MudmFsdWVzID0gJmNvbmYtPnBhcmFtczsKIApAQCAtMTc2NCwzOCArMTc3MCwzNiBAQAogfQogCiAKLXN0YXRpYyBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICoKLW5neF9odHRwX2Zhc3RjZ2lfc2NyaXB0X25hbWVfdmFyaWFibGUobmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1aW50cHRyX3QgZGF0YSkKK3N0YXRpYyBuZ3hfaW50X3QKK25neF9odHRwX2Zhc3RjZ2lfc2NyaXB0X25hbWVfdmFyaWFibGUobmd4X2h0dHBfcmVxdWVzdF90ICpyLAorICAgIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgKnYsIHVpbnRwdHJfdCBkYXRhKQogewogICAgIHVfY2hhciAgICAgICAgICAgICAgICAgICAgICAgKnA7Ci0gICAgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAgICAqdnY7CiAgICAgbmd4X2h0dHBfZmFzdGNnaV9sb2NfY29uZl90ICAqZmxjZjsKIAotICAgIHZ2ID0gbmd4X3BhbGxvYyhyLT5wb29sLCBzaXplb2Yobmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCkpOwotICAgIGlmICh2diA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHZ2LT52YWx1ZSA9IDA7CisgICAgdi0+dmFsaWQgPSAxOyAKKyAgICB2LT5ub19jYWNoYWJsZSA9IDA7CisgICAgdi0+bm90X2ZvdW5kID0gMDsKIAogICAgIGZsY2YgPSBuZ3hfaHR0cF9nZXRfbW9kdWxlX2xvY19jb25mKHIsIG5neF9odHRwX2Zhc3RjZ2lfbW9kdWxlKTsKIAogICAgIGlmIChyLT51cmkuZGF0YVtyLT51cmkubGVuIC0gMV0gIT0gJy8nKSB7Ci0gICAgICAgIHZ2LT50ZXh0ID0gci0+dXJpOwotICAgICAgICByZXR1cm4gdnY7CisgICAgICAgIHYtPmxlbiA9IHItPnVyaS5sZW47CisgICAgICAgIHYtPmRhdGEgPSByLT51cmkuZGF0YTsKKyAgICAgICAgcmV0dXJuIE5HWF9PSzsKICAgICB9CiAKLSAgICB2di0+dGV4dC5sZW4gPSByLT51cmkubGVuICsgZmxjZi0+aW5kZXgubGVuOworICAgIHYtPmxlbiA9IHItPnVyaS5sZW4gKyBmbGNmLT5pbmRleC5sZW47CiAKLSAgICB2di0+dGV4dC5kYXRhID0gbmd4X3BhbGxvYyhyLT5wb29sLCB2di0+dGV4dC5sZW4pOwotICAgIGlmICh2di0+dGV4dC5kYXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgdi0+ZGF0YSA9IG5neF9wYWxsb2Moci0+cG9vbCwgdi0+bGVuKTsKKyAgICBpZiAodi0+ZGF0YSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgfQogCi0gICAgcCA9IG5neF9jcHltZW0odnYtPnRleHQuZGF0YSwgci0+dXJpLmRhdGEsIHItPnVyaS5sZW4pOworICAgIHAgPSBuZ3hfY29weSh2LT5kYXRhLCByLT51cmkuZGF0YSwgci0+dXJpLmxlbik7CiAgICAgbmd4X21lbWNweShwLCBmbGNmLT5pbmRleC5kYXRhLCBmbGNmLT5pbmRleC5sZW4pOwogCi0gICAgcmV0dXJuIHZ2OworICAgIHJldHVybiBOR1hfT0s7CiB9CiAKIApAQCAtMTg2MCw3ICsxODY0LDcgQEAKIAogICAgIGNsY2YtPmhhbmRsZXIgPSBuZ3hfaHR0cF9mYXN0Y2dpX2hhbmRsZXI7CiAKLSAgICBsY2YtPnVwc3RyZWFtLmxvY2F0aW9uID0gJmNsY2YtPm5hbWU7CisgICAgbGNmLT51cHN0cmVhbS5sb2NhdGlvbiA9IGNsY2YtPm5hbWU7CiAKICAgICBpZiAoY2xjZi0+bmFtZS5kYXRhW2NsY2YtPm5hbWUubGVuIC0gMV0gPT0gJy8nKSB7CiAgICAgICAgIGNsY2YtPmF1dG9fcmVkaXJlY3QgPSAxOwpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9nZW9fbW9kdWxlLmMgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2dlb19tb2R1bGUuYwppbmRleCA2ZDk0YTA2Li5hMzYzOGU0IDEwMDY0NAotLS0gYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2dlb19tb2R1bGUuYworKysgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2dlb19tb2R1bGUuYwpAQCAtNjUsMzEgKzY1LDM0IEBACiAKIAogc3RhdGljIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgIG5neF9odHRwX2dlb19udWxsX3ZhbHVlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAwLCBuZ3hfc3RyaW5nKCIwIikgfTsKKyAgICBuZ3hfaHR0cF92YXJpYWJsZSgiIik7CiAKIAogLyogQUZfSU5FVCBvbmx5ICovCiAKLXN0YXRpYyBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICoKLW5neF9odHRwX2dlb192YXJpYWJsZShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVpbnRwdHJfdCBkYXRhKQorc3RhdGljIG5neF9pbnRfdAorbmd4X2h0dHBfZ2VvX3ZhcmlhYmxlKG5neF9odHRwX3JlcXVlc3RfdCAqciwgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAqdiwKKyAgICB1aW50cHRyX3QgZGF0YSkKIHsKICAgICBuZ3hfcmFkaXhfdHJlZV90ICp0cmVlID0gKG5neF9yYWRpeF90cmVlX3QgKikgZGF0YTsKIAogICAgIHN0cnVjdCBzb2NrYWRkcl9pbiAgICAgICAgICpzaW47Ci0gICAgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAgKnZhcjsKKyAgICBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICAqdnY7CiAKICAgICBzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopIHItPmNvbm5lY3Rpb24tPnNvY2thZGRyOwogCiAgICAgbmd4X2xvZ19kZWJ1ZzAoTkdYX0xPR19ERUJVR19IVFRQLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCiAgICAgICAgICAgICAgICAgICAgImh0dHAgZ2VvIHN0YXJ0ZWQiKTsKIAotICAgIHZhciAgPSAobmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAqKQorICAgIHZ2ID0gKG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgKikKICAgICAgICAgICAgICAgICAgICAgICAgbmd4X3JhZGl4MzJ0cmVlX2ZpbmQodHJlZSwgbnRvaGwoc2luLT5zaW5fYWRkci5zX2FkZHIpKTsKIAotICAgIG5neF9sb2dfZGVidWcyKE5HWF9MT0dfREVCVUdfSFRUUCwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAotICAgICAgICAgICAgICAgICAgICJodHRwIGdlbzogJVYgJVYiLCAmci0+Y29ubmVjdGlvbi0+YWRkcl90ZXh0LCAmdmFyLT50ZXh0KTsKKyAgICAqdiA9ICp2djsKIAotICAgIHJldHVybiB2YXI7CisgICAgbmd4X2xvZ19kZWJ1ZzIoTkdYX0xPR19ERUJVR19IVFRQLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgImh0dHAgZ2VvOiAlViAlViIsICZyLT5jb25uZWN0aW9uLT5hZGRyX3RleHQsIHYpOworCisgICAgcmV0dXJuIE5HWF9PSzsKIH0KIAogCkBAIC0xODIsNyArMTg1LDcgQEAKIHN0YXRpYyBjaGFyICoKIG5neF9odHRwX2dlbyhuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqZHVtbXksIHZvaWQgKmNvbmYpCiB7Ci0gICAgbmd4X2ludF90ICAgICAgICAgICAgICAgICAgIHJjLCBuOworICAgIG5neF9pbnRfdCAgICAgICAgICAgICAgICAgICByYzsKICAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgICAqdmFsdWUsIGZpbGU7CiAgICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgIGk7CiAgICAgbmd4X2luZXRfY2lkcl90ICAgICAgICAgICAgIGNpZHJpbjsKQEAgLTIyNiwzMCArMjI5LDE4IEBACiAgICAgICAgIGNpZHJpbi5tYXNrID0gbnRvaGwoY2lkcmluLm1hc2spOwogICAgIH0KIAotICAgIG4gPSBuZ3hfYXRvaSh2YWx1ZVsxXS5kYXRhLCB2YWx1ZVsxXS5sZW4pOwotCiAgICAgdmFyID0gTlVMTDsKICAgICB2ID0gZ2VvLT52YWx1ZXMuZWx0czsKIAotICAgIGlmIChuID09IE5HWF9FUlJPUikgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZ2VvLT52YWx1ZXMubmVsdHM7IGkrKykgewotICAgICAgICAgICAgaWYgKHZbaV0tPnRleHQubGVuICE9IHZhbHVlWzFdLmxlbikgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobmd4X3N0cm5jbXAodmFsdWVbMV0uZGF0YSwgdltpXS0+dGV4dC5kYXRhLCB2YWx1ZVsxXS5sZW4pID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyID0gdltpXTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgZ2VvLT52YWx1ZXMubmVsdHM7IGkrKykgeworICAgICAgICBpZiAoKHNpemVfdCkgdltpXS0+bGVuICE9IHZhbHVlWzFdLmxlbikgeworICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIAotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBnZW8tPnZhbHVlcy5uZWx0czsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAodltpXS0+dmFsdWUgPT0gKG5neF91aW50X3QpIG4pIHsKLSAgICAgICAgICAgICAgICB2YXIgPSB2W2ldOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQorICAgICAgICBpZiAobmd4X3N0cm5jbXAodmFsdWVbMV0uZGF0YSwgdltpXS0+ZGF0YSwgdmFsdWVbMV0ubGVuKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgPSB2W2ldOworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTI1OSwxMyArMjUwLDE1IEBACiAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgICAgIH0KIAotICAgICAgICB2YXItPnRleHQubGVuID0gdmFsdWVbMV0ubGVuOwotICAgICAgICB2YXItPnRleHQuZGF0YSA9IG5neF9wc3RyZHVwKGdlby0+cG9vbCwgJnZhbHVlWzFdKTsKLSAgICAgICAgaWYgKHZhci0+dGV4dC5kYXRhID09IE5VTEwpIHsKKyAgICAgICAgdmFyLT5sZW4gPSB2YWx1ZVsxXS5sZW47CisgICAgICAgIHZhci0+ZGF0YSA9IG5neF9wc3RyZHVwKGdlby0+cG9vbCwgJnZhbHVlWzFdKTsKKyAgICAgICAgaWYgKHZhci0+ZGF0YSA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgICAgIH0KIAotICAgICAgICB2YXItPnZhbHVlID0gKG4gPT0gTkdYX0VSUk9SKSA/IDAgOiBuOworICAgICAgICB2YXItPnZhbGlkID0gMTsKKyAgICAgICAgdmFyLT5ub19jYWNoYWJsZSA9IDA7CisgICAgICAgIHZhci0+bm90X2ZvdW5kID0gMDsKIAogICAgICAgICB2ID0gbmd4X2FycmF5X3B1c2goJmdlby0+dmFsdWVzKTsKICAgICAgICAgaWYgKHYgPT0gTlVMTCkgewpAQCAtMjk0LDcgKzI4Nyw3IEBACiAgICAgICAgIG5neF9jb25mX2xvZ19lcnJvcihOR1hfTE9HX1dBUk4sIGNmLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImR1cGxpY2F0ZSBwYXJhbWV0ZXIgXCIlVlwiLCB2YWx1ZTogXCIlVlwiLCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAib2xkIHZhbHVlOiBcIiVWXCIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlWzBdLCAmdmFyLT50ZXh0LCAmb2xkLT50ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZVswXSwgdmFyLCBvbGQpOwogCiAgICAgICAgIHJjID0gbmd4X3JhZGl4MzJ0cmVlX2RlbGV0ZShnZW8tPnRyZWUsIGNpZHJpbi5hZGRyLCBjaWRyaW4ubWFzayk7CiAKZGlmZiAtLWdpdCBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfZ3ppcF9maWx0ZXJfbW9kdWxlLmMgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2d6aXBfZmlsdGVyX21vZHVsZS5jCmluZGV4IDkyM2RkMTcuLmFkZjcwMDUgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfZ3ppcF9maWx0ZXJfbW9kdWxlLmMKKysrIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9nemlwX2ZpbHRlcl9tb2R1bGUuYwpAQCAtNzksNyArNzksOSBAQAogc3RhdGljIHVfY2hhciAqbmd4X2h0dHBfZ3ppcF9sb2dfcmF0aW8obmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1X2NoYXIgKmJ1ZiwKICAgICBuZ3hfaHR0cF9sb2dfb3BfdCAqb3ApOwogCi1zdGF0aWMgbmd4X2ludF90IG5neF9odHRwX2d6aXBfYWRkX2xvZ19mb3JtYXRzKG5neF9jb25mX3QgKmNmKTsKK3N0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfZ3ppcF9hZGRfdmFyaWFibGVzKG5neF9jb25mX3QgKmNmKTsKK3N0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfZ3ppcF9yYXRpb192YXJpYWJsZShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCisgICAgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAqdiwgdWludHB0cl90IGRhdGEpOwogCiBzdGF0aWMgbmd4X2ludF90IG5neF9odHRwX2d6aXBfZmlsdGVyX2luaXQobmd4X2N5Y2xlX3QgKmN5Y2xlKTsKIHN0YXRpYyB2b2lkICpuZ3hfaHR0cF9nemlwX2NyZWF0ZV9jb25mKG5neF9jb25mX3QgKmNmKTsKQEAgLTE5OSw3ICsyMDEsNyBAQAogCiAKIHN0YXRpYyBuZ3hfaHR0cF9tb2R1bGVfdCAgbmd4X2h0dHBfZ3ppcF9maWx0ZXJfbW9kdWxlX2N0eCA9IHsKLSAgICBuZ3hfaHR0cF9nemlwX2FkZF9sb2dfZm9ybWF0cywgICAgICAgICAvKiBwcmVjb25maWd1cmF0aW9uICovCisgICAgbmd4X2h0dHBfZ3ppcF9hZGRfdmFyaWFibGVzLCAgICAgICAgICAgLyogcHJlY29uZmlndXJhdGlvbiAqLwogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBvc3Rjb25maWd1cmF0aW9uICovCiAKICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjcmVhdGUgbWFpbiBjb25maWd1cmF0aW9uICovCkBAIC0yNTYsNiArMjU4LDcgQEAKICNlbmRpZgogCiAKK3N0YXRpYyBuZ3hfc3RyX3QgIG5neF9odHRwX2d6aXBfcmF0aW8gPSBuZ3hfc3RyaW5nKCJnemlwX3JhdGlvIik7CiBzdGF0aWMgbmd4X3N0cl90ICBuZ3hfaHR0cF9nemlwX25vX2NhY2hlID0gbmd4X3N0cmluZygibm8tY2FjaGUiKTsKIHN0YXRpYyBuZ3hfc3RyX3QgIG5neF9odHRwX2d6aXBfbm9fc3RvcmUgPSBuZ3hfc3RyaW5nKCJuby1zdG9yZSIpOwogc3RhdGljIG5neF9zdHJfdCAgbmd4X2h0dHBfZ3ppcF9wcml2YXRlID0gbmd4X3N0cmluZygicHJpdmF0ZSIpOwpAQCAtOTU2LDEwICs5NTksMTggQEAKIAogCiBzdGF0aWMgbmd4X2ludF90Ci1uZ3hfaHR0cF9nemlwX2FkZF9sb2dfZm9ybWF0cyhuZ3hfY29uZl90ICpjZikKK25neF9odHRwX2d6aXBfYWRkX3ZhcmlhYmxlcyhuZ3hfY29uZl90ICpjZikKIHsKKyAgICBuZ3hfaHR0cF92YXJpYWJsZV90ICAgICAqdmFyOwogICAgIG5neF9odHRwX2xvZ19vcF9uYW1lX3QgICpvcDsKIAorICAgIHZhciA9IG5neF9odHRwX2FkZF92YXJpYWJsZShjZiwgJm5neF9odHRwX2d6aXBfcmF0aW8sIDApOworICAgIGlmICh2YXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgIH0KKworICAgIHZhci0+aGFuZGxlciA9IG5neF9odHRwX2d6aXBfcmF0aW9fdmFyaWFibGU7CisKICAgICBmb3IgKG9wID0gbmd4X2h0dHBfZ3ppcF9sb2dfZm10X29wczsgb3AtPm5hbWUubGVuOyBvcCsrKSB7IC8qIHZvaWQgKi8gfQogICAgIG9wLT5ydW4gPSBOVUxMOwogCkBAIC05NzYsNiArOTg3LDUwIEBACiAKIAogc3RhdGljIG5neF9pbnRfdAorbmd4X2h0dHBfZ3ppcF9yYXRpb192YXJpYWJsZShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCisgICAgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAqdiwgdWludHB0cl90IGRhdGEpCit7CisgICAgbmd4X3VpbnRfdCAgICAgICAgICAgIHppbnQsIHpmcmFjOworICAgIG5neF9odHRwX2d6aXBfY3R4X3QgICpjdHg7CisKKyAgICB2LT52YWxpZCA9IDE7IAorICAgIHYtPm5vX2NhY2hhYmxlID0gMDsKKyAgICB2LT5ub3RfZm91bmQgPSAwOworCisgICAgY3R4ID0gbmd4X2h0dHBfZ2V0X21vZHVsZV9jdHgociwgbmd4X2h0dHBfZ3ppcF9maWx0ZXJfbW9kdWxlKTsKKworICAgIGlmIChjdHggPT0gTlVMTCB8fCBjdHgtPnpvdXQgPT0gMCkgeworICAgICAgICB2LT5ub3RfZm91bmQgPSAxOworICAgICAgICByZXR1cm4gTkdYX09LOworICAgIH0KKworICAgIHYtPmRhdGEgPSBuZ3hfcGFsbG9jKHItPnBvb2wsIE5HWF9JTlQzMl9MRU4gKyAzKTsKKyAgICBpZiAodi0+ZGF0YSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgfQorCisgICAgemludCA9IChuZ3hfdWludF90KSAoY3R4LT56aW4gLyBjdHgtPnpvdXQpOworICAgIHpmcmFjID0gKG5neF91aW50X3QpICgoY3R4LT56aW4gKiAxMDAgLyBjdHgtPnpvdXQpICUgMTAwKTsKKworICAgIGlmICgoY3R4LT56aW4gKiAxMDAwIC8gY3R4LT56b3V0KSAlIDEwID4gNCkgeworCisgICAgICAgIC8qIHRoZSByb3VuZGluZywgZS5nLiwgMi4xMjUgdG8gMi4xMyAqLworCisgICAgICAgIHpmcmFjKys7CisKKyAgICAgICAgaWYgKHpmcmFjID4gOTkpIHsKKyAgICAgICAgICAgIHppbnQrKzsKKyAgICAgICAgICAgIHpmcmFjID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHYtPmxlbiA9IG5neF9zcHJpbnRmKHYtPmRhdGEsICIldWkuJTAydWkiLCB6aW50LCB6ZnJhYykgLSB2LT5kYXRhOworCisgICAgcmV0dXJuIE5HWF9PSzsKK30KKworCitzdGF0aWMgbmd4X2ludF90CiBuZ3hfaHR0cF9nemlwX2ZpbHRlcl9pbml0KG5neF9jeWNsZV90ICpjeWNsZSkKIHsKICAgICBuZ3hfaHR0cF9uZXh0X2hlYWRlcl9maWx0ZXIgPSBuZ3hfaHR0cF90b3BfaGVhZGVyX2ZpbHRlcjsKZGlmZiAtLWdpdCBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfaGVhZGVyc19maWx0ZXJfbW9kdWxlLmMgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2hlYWRlcnNfZmlsdGVyX21vZHVsZS5jCmluZGV4IDA4NTU5OTAuLmRhOTA2MWIgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfaGVhZGVyc19maWx0ZXJfbW9kdWxlLmMKKysrIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9oZWFkZXJzX2ZpbHRlcl9tb2R1bGUuYwpAQCAtMTAsNyArMTAsOSBAQAogCiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgICB0aW1lX3QgIGV4cGlyZXM7CisgICAgdGltZV90ICAgICAgICBleHBpcmVzOworICAgIG5neF9zdHJfdCAgICAgY2FjaGVfY29udHJvbDsKKyAgICBuZ3hfYXJyYXlfdCAgKmhlYWRlcnM7CiB9IG5neF9odHRwX2hlYWRlcnNfY29uZl90OwogCiAKQEAgLTIyLDIwICsyNCwzMSBAQAogc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9oZWFkZXJzX2ZpbHRlcl9pbml0KG5neF9jeWNsZV90ICpjeWNsZSk7CiBzdGF0aWMgdm9pZCAqbmd4X2h0dHBfaGVhZGVyc19jcmVhdGVfY29uZihuZ3hfY29uZl90ICpjZik7CiBzdGF0aWMgY2hhciAqbmd4X2h0dHBfaGVhZGVyc19tZXJnZV9jb25mKG5neF9jb25mX3QgKmNmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwYXJlbnQsIHZvaWQgKmNoaWxkKTsKKyAgICB2b2lkICpwYXJlbnQsIHZvaWQgKmNoaWxkKTsKIHN0YXRpYyBjaGFyICpuZ3hfaHR0cF9oZWFkZXJzX2V4cGlyZXMobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwKICAgICB2b2lkICpjb25mKTsKK3N0YXRpYyBjaGFyICpuZ3hfaHR0cF9oZWFkZXJzX2FkZChuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqY21kLAorICAgIHZvaWQgKmNvbmYpOwogCiAKIHN0YXRpYyBuZ3hfY29tbWFuZF90ICBuZ3hfaHR0cF9oZWFkZXJzX2ZpbHRlcl9jb21tYW5kc1tdID0gewogCiAgICAgeyBuZ3hfc3RyaW5nKCJleHBpcmVzIiksCi0gICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0NPTkZfVEFLRTEsCisgICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0hUVFBfTElGX0NPTkYKKyAgICAgICAgICAgICAgICAgICAgICAgIHxOR1hfQ09ORl9UQUtFMSwKICAgICAgIG5neF9odHRwX2hlYWRlcnNfZXhwaXJlcywKICAgICAgIE5HWF9IVFRQX0xPQ19DT05GX09GRlNFVCwKICAgICAgIDAsCiAgICAgICBOVUxMfSwKIAorICAgIHsgbmd4X3N0cmluZygiYWRkX2hlYWRlciIpLAorICAgICAgTkdYX0hUVFBfTUFJTl9DT05GfE5HWF9IVFRQX1NSVl9DT05GfE5HWF9IVFRQX0xPQ19DT05GfE5HWF9IVFRQX0xJRl9DT05GCisgICAgICAgICAgICAgICAgICAgICAgICB8TkdYX0NPTkZfVEFLRTIsCisgICAgICBuZ3hfaHR0cF9oZWFkZXJzX2FkZCwKKyAgICAgIE5HWF9IVFRQX0xPQ19DT05GX09GRlNFVCwKKyAgICAgIDAsCisgICAgICBOVUxMfSwKKwogICAgICAgbmd4X251bGxfY29tbWFuZAogfTsKIApAQCAtNzksNyArOTIsNyBAQAogewogICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgbGVuOwogICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgaTsKLSAgICBuZ3hfdGFibGVfZWx0X3QgICAgICAgICAgKmV4cGlyZXMsICpjYywgKipjY3A7CisgICAgbmd4X3RhYmxlX2VsdF90ICAgICAgICAgICpleHBpcmVzLCAqY2MsICoqY2NwLCAqaCwgKm91dDsKICAgICBuZ3hfaHR0cF9oZWFkZXJzX2NvbmZfdCAgKmNvbmY7CiAKICAgICBpZiAoKHItPmhlYWRlcnNfb3V0LnN0YXR1cyAhPSBOR1hfSFRUUF9PSwpAQCAtMTE3LDcgKzEzMCw4IEBACiAgICAgICAgIGlmIChjY3AgPT0gTlVMTCkgewogCiAgICAgICAgICAgICBpZiAobmd4X2FycmF5X2luaXQoJnItPmhlYWRlcnNfb3V0LmNhY2hlX2NvbnRyb2wsIHItPnBvb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgc2l6ZW9mKG5neF90YWJsZV9lbHRfdCAqKSkgIT0gTkdYX09LKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIHNpemVvZihuZ3hfdGFibGVfZWx0X3QgKikpCisgICAgICAgICAgICAgICAgIT0gTkdYX09LKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgICAgICAgICB9CkBAIC0xODgsNiArMjAyLDUwIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBpZiAoY29uZi0+Y2FjaGVfY29udHJvbC5sZW4pIHsKKworICAgICAgICBjY3AgPSByLT5oZWFkZXJzX291dC5jYWNoZV9jb250cm9sLmVsdHM7CisKKyAgICAgICAgaWYgKGNjcCA9PSBOVUxMKSB7CisKKyAgICAgICAgICAgIGlmIChuZ3hfYXJyYXlfaW5pdCgmci0+aGVhZGVyc19vdXQuY2FjaGVfY29udHJvbCwgci0+cG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBzaXplb2Yobmd4X3RhYmxlX2VsdF90ICopKQorICAgICAgICAgICAgICAgICE9IE5HWF9PSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY2NwID0gbmd4X2FycmF5X3B1c2goJnItPmhlYWRlcnNfb3V0LmNhY2hlX2NvbnRyb2wpOworICAgICAgICBpZiAoY2NwID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjYyA9IG5neF9saXN0X3B1c2goJnItPmhlYWRlcnNfb3V0LmhlYWRlcnMpOworICAgICAgICBpZiAoY2MgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGNjLT5oYXNoID0gMTsKKyAgICAgICAgY2MtPmtleS5sZW4gPSBzaXplb2YoIkNhY2hlLUNvbnRyb2wiKSAtIDE7CisgICAgICAgIGNjLT5rZXkuZGF0YSA9ICh1X2NoYXIgKikgIkNhY2hlLUNvbnRyb2wiOworICAgICAgICBjYy0+dmFsdWUgPSBjb25mLT5jYWNoZV9jb250cm9sOworCisgICAgICAgICpjY3AgPSBjYzsKKyAgICB9CisKKyAgICBpZiAoY29uZi0+aGVhZGVycykgeworICAgICAgICBoID0gY29uZi0+aGVhZGVycy0+ZWx0czsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvbmYtPmhlYWRlcnMtPm5lbHRzOyBpKyspIHsKKyAgICAgICAgICAgIG91dCA9IG5neF9saXN0X3B1c2goJnItPmhlYWRlcnNfb3V0LmhlYWRlcnMpOworICAgICAgICAgICAgaWYgKG91dCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgKm91dCA9IGhbaV07CisgICAgICAgIH0KKyAgICB9CisKICAgICByZXR1cm4gbmd4X2h0dHBfbmV4dF9oZWFkZXJfZmlsdGVyKHIpOwogfQogCkBAIC0yMDcsMTEgKzI2NSwxOSBAQAogeyAgIAogICAgIG5neF9odHRwX2hlYWRlcnNfY29uZl90ICAqY29uZjsKIAotICAgIGNvbmYgPSBuZ3hfcGFsbG9jKGNmLT5wb29sLCBzaXplb2Yobmd4X2h0dHBfaGVhZGVyc19jb25mX3QpKTsKKyAgICBjb25mID0gbmd4X3BjYWxsb2MoY2YtPnBvb2wsIHNpemVvZihuZ3hfaHR0cF9oZWFkZXJzX2NvbmZfdCkpOwogICAgIGlmIChjb25mID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgIH0KIAorICAgIC8qCisgICAgICogc2V0IGJ5IG5neF9wY2FsbG9jKCk6CisgICAgICoKKyAgICAgKiAgICAgY29uZi0+Y2FjaGVfY29udHJvbC5sZW4gPSAwOworICAgICAqICAgICBjb25mLT5jYWNoZV9jb250cm9sLmRhdGEgPSBOVUxMOworICAgICAqICAgICBjb25mLT5oZWFkZXJzID0gTlVMTDsKKyAgICAgKi8KKwogICAgIGNvbmYtPmV4cGlyZXMgPSBOR1hfSFRUUF9FWFBJUkVTX1VOU0VUOwogCiAgICAgcmV0dXJuIGNvbmY7CkBAIC0yMjksNiArMjk1LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR1hfSFRUUF9FWFBJUkVTX09GRiA6IHByZXYtPmV4cGlyZXM7CiAgICAgfQogCisgICAgaWYgKGNvbmYtPmNhY2hlX2NvbnRyb2wuZGF0YSA9PSBOVUxMKSB7CisgICAgICAgIGNvbmYtPmNhY2hlX2NvbnRyb2wgPSBwcmV2LT5jYWNoZV9jb250cm9sOworICAgIH0KKworICAgIGlmIChjb25mLT5oZWFkZXJzID09IE5VTEwpIHsKKyAgICAgICAgY29uZi0+aGVhZGVycyA9IHByZXYtPmhlYWRlcnM7CisgICAgfQorCiAgICAgcmV0dXJuIE5HWF9DT05GX09LOwogfQogCkBAIC0yODcsMyArMzYxLDM4IEBACiAKICAgICByZXR1cm4gTkdYX0NPTkZfT0s7CiB9CisKKworc3RhdGljIGNoYXIgKgorbmd4X2h0dHBfaGVhZGVyc19hZGQobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwgdm9pZCAqY29uZikKK3sKKyAgICBuZ3hfaHR0cF9oZWFkZXJzX2NvbmZfdCAqaGNmID0gY29uZjsKKworICAgIG5neF9zdHJfdCAgICAgICAgKnZhbHVlOworICAgIG5neF90YWJsZV9lbHRfdCAgKmg7CisKKyAgICB2YWx1ZSA9IGNmLT5hcmdzLT5lbHRzOworCisgICAgaWYgKG5neF9zdHJjYXNlY21wKHZhbHVlWzFdLmRhdGEsICJjYWNoZS1jb250cm9sIikgPT0gMCkgeworICAgICAgICBoY2YtPmNhY2hlX2NvbnRyb2wgPSB2YWx1ZVsyXTsKKyAgICAgICAgcmV0dXJuIE5HWF9DT05GX09LOworICAgIH0KKworICAgIGlmIChoY2YtPmhlYWRlcnMgPT0gTlVMTCkgeworICAgICAgICBoY2YtPmhlYWRlcnMgPSBuZ3hfYXJyYXlfY3JlYXRlKGNmLT5wb29sLCAxLCBzaXplb2Yobmd4X3RhYmxlX2VsdF90KSk7CisgICAgICAgIGlmIChoY2YtPmhlYWRlcnMgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgICAgICB9CisgICAgfQorCisgICAgaCA9IG5neF9hcnJheV9wdXNoKGhjZi0+aGVhZGVycyk7CisgICAgaWYgKGggPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgfQorCisgICAgaC0+aGFzaCA9IDE7CisgICAgaC0+a2V5ID0gdmFsdWVbMV07CisgICAgaC0+dmFsdWUgPSB2YWx1ZVsyXTsKKworICAgIHJldHVybiBOR1hfQ09ORl9PSzsKK30KZGlmZiAtLWdpdCBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfaW5kZXhfbW9kdWxlLmMgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2luZGV4X21vZHVsZS5jCmluZGV4IGI3ZGFhNmQuLjQ4NDdjYjcgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfaW5kZXhfbW9kdWxlLmMKKysrIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9pbmRleF9tb2R1bGUuYwpAQCAtMTgwLDYgKzE4MCw3IEBACiAKICAgICAgICAgICAgIGUuaXAgPSBpbmRleFtpXS5sZW5ndGhzLT5lbHRzOwogICAgICAgICAgICAgZS5yZXF1ZXN0ID0gcjsKKyAgICAgICAgICAgIGUuZmx1c2hlZCA9IDE7CiAKICAgICAgICAgICAgIC8qIDEgYnl0ZSBmb3IgdGVybWluYXRpbmcgJ1wwJyAqLwogCkBAIC0yOTgsNyArMjk5LDcgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBsYXN0ID0gbmd4X2NweW1lbSh1cmkuZGF0YSwgci0+dXJpLmRhdGEsIHItPnVyaS5sZW4pOworICAgICAgICAgICAgbGFzdCA9IG5neF9jb3B5KHVyaS5kYXRhLCByLT51cmkuZGF0YSwgci0+dXJpLmxlbik7CiAgICAgICAgICAgICBuZ3hfbWVtY3B5KGxhc3QsIGN0eC0+aW5kZXguZGF0YSwgY3R4LT5pbmRleC5sZW4gLSAxKTsKICAgICAgICAgfQogCkBAIC00NzYsNyArNDc3LDcgQEAKICAgICAgICAgICAgICAgICBpbGNmLT5tYXhfaW5kZXhfbGVuID0gaW5kZXgtPm5hbWUubGVuOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAvKiBpbmNsdWRlIHRoZSB0ZXJtaW5hdGluZyAnXDAnIHRvIHRoZSBsZW5ndGggdG8gdXNlIG5neF9tZW1jcHkoKSAqLworICAgICAgICAgICAgLyogaW5jbHVkZSB0aGUgdGVybWluYXRpbmcgJ1wwJyB0byB0aGUgbGVuZ3RoIHRvIHVzZSBuZ3hfY29weSgpICovCiAgICAgICAgICAgICBpbmRleC0+bmFtZS5sZW4rKzsKIAogICAgICAgICAgICAgY29udGludWU7CmRpZmYgLS1naXQgYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2xvZ19tb2R1bGUuYyBiL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfbG9nX21vZHVsZS5jCmluZGV4IGY0OTkzYjUuLmU4MzIwNzAgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfbG9nX21vZHVsZS5jCisrKyBiL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfbG9nX21vZHVsZS5jCkBAIC0xMCw2ICsxMCwzNSBAQAogI2luY2x1ZGUgPG5naW54Lmg+CiAKIAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgIG5hbWU7CisgICAgbmd4X2FycmF5X3QgICAgICAgICAgICAgICAgKm9wczsgICAgICAgIC8qIGFycmF5IG9mIG5neF9odHRwX2xvZ19vcF90ICovCit9IG5neF9odHRwX2xvZ19mbXRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIG5neF9hcnJheV90ICAgICAgICAgICAgICAgICBmb3JtYXRzOyAgICAvKiBhcnJheSBvZiBuZ3hfaHR0cF9sb2dfZm10X3QgKi8KKyAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgY29tYmluZWRfdXNlZDsgLyogdW5zaWduZWQgIGNvbWJpbmVkX3VzZWQ6MSAqLworfSBuZ3hfaHR0cF9sb2dfbWFpbl9jb25mX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBuZ3hfb3Blbl9maWxlX3QgICAgICAgICAgICAqZmlsZTsKKyAgICBuZ3hfYXJyYXlfdCAgICAgICAgICAgICAgICAqb3BzOyAgICAgICAgLyogYXJyYXkgb2Ygbmd4X2h0dHBfbG9nX29wX3QgKi8KK30gbmd4X2h0dHBfbG9nX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBuZ3hfYXJyYXlfdCAgICAgICAgICAgICAgICAqbG9nczsgICAgICAgLyogYXJyYXkgb2Ygbmd4X2h0dHBfbG9nX3QgKi8KKyAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgb2ZmOyAgICAgICAgLyogdW5zaWduZWQgIG9mZjoxICovCit9IG5neF9odHRwX2xvZ19sb2NfY29uZl90OworCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgICAgbmFtZTsKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgbGVuOworICAgIG5neF9odHRwX2xvZ19vcF9ydW5fcHQgICAgICBydW47Cit9IG5neF9odHRwX2xvZ192YXJfdDsKKworCiBzdGF0aWMgdV9jaGFyICpuZ3hfaHR0cF9sb2dfYWRkcihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVfY2hhciAqYnVmLAogICAgIG5neF9odHRwX2xvZ19vcF90ICpvcCk7CiBzdGF0aWMgdV9jaGFyICpuZ3hfaHR0cF9sb2dfY29ubmVjdGlvbihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVfY2hhciAqYnVmLApAQCAtMjQsMTAgKzUzLDEwIEBACiAgICAgbmd4X2h0dHBfbG9nX29wX3QgKm9wKTsKIHN0YXRpYyB1X2NoYXIgKm5neF9odHRwX2xvZ19zdGF0dXMobmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1X2NoYXIgKmJ1ZiwKICAgICBuZ3hfaHR0cF9sb2dfb3BfdCAqb3ApOwotc3RhdGljIHVfY2hhciAqbmd4X2h0dHBfbG9nX2xlbmd0aChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVfY2hhciAqYnVmLAorc3RhdGljIHVfY2hhciAqbmd4X2h0dHBfbG9nX2J5dGVzX3NlbnQobmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1X2NoYXIgKmJ1ZiwKICAgICBuZ3hfaHR0cF9sb2dfb3BfdCAqb3ApOwotc3RhdGljIHVfY2hhciAqbmd4X2h0dHBfbG9nX2FwYWNoZV9sZW5ndGgobmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1X2NoYXIgKmJ1ZiwKLSAgICBuZ3hfaHR0cF9sb2dfb3BfdCAqb3ApOworc3RhdGljIHVfY2hhciAqbmd4X2h0dHBfbG9nX2FwYWNoZV9ieXRlc19zZW50KG5neF9odHRwX3JlcXVlc3RfdCAqciwKKyAgICB1X2NoYXIgKmJ1Ziwgbmd4X2h0dHBfbG9nX29wX3QgKm9wKTsKIHN0YXRpYyB1X2NoYXIgKm5neF9odHRwX2xvZ19yZXF1ZXN0X2xlbmd0aChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVfY2hhciAqYnVmLAogICAgIG5neF9odHRwX2xvZ19vcF90ICpvcCk7CiAKQEAgLTgzLDcgKzExMiw5IEBACiAgICAgdm9pZCAqY29uZik7CiBzdGF0aWMgY2hhciAqbmd4X2h0dHBfbG9nX3NldF9mb3JtYXQobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwKICAgICB2b2lkICpjb25mKTsKLXN0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfbG9nX2luaXQobmd4X2N5Y2xlX3QgKmN5Y2xlKTsKK3N0YXRpYyBjaGFyICpuZ3hfaHR0cF9sb2dfY29tcGlsZV9mb3JtYXQobmd4X2NvbmZfdCAqY2YsCisgICAgbmd4X2FycmF5X3QgKm9wcywgbmd4X2FycmF5X3QgKmFyZ3MsIG5neF91aW50X3Qgcyk7CitzdGF0aWMgbmd4X2ludF90IG5neF9odHRwX2xvZ19pbml0KG5neF9jb25mX3QgKmNmKTsKIAogCiBzdGF0aWMgbmd4X2NvbW1hbmRfdCAgbmd4X2h0dHBfbG9nX2NvbW1hbmRzW10gPSB7CkBAIC0xMDgsNyArMTM5LDcgQEAKIAogbmd4X2h0dHBfbW9kdWxlX3QgIG5neF9odHRwX2xvZ19tb2R1bGVfY3R4ID0gewogICAgIG5neF9odHRwX2xvZ19zZXRfZm9ybWF0cywgICAgICAgICAgICAgIC8qIHByZWNvbmZpZ3VyYXRpb24gKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwb3N0Y29uZmlndXJhdGlvbiAqLworICAgIG5neF9odHRwX2xvZ19pbml0LCAgICAgICAgICAgICAgICAgICAgIC8qIHBvc3Rjb25maWd1cmF0aW9uICovCiAKICAgICBuZ3hfaHR0cF9sb2dfY3JlYXRlX21haW5fY29uZiwgICAgICAgICAvKiBjcmVhdGUgbWFpbiBjb25maWd1cmF0aW9uICovCiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdCBtYWluIGNvbmZpZ3VyYXRpb24gKi8KQEAgLTEyNyw3ICsxNTgsNyBAQAogICAgIG5neF9odHRwX2xvZ19jb21tYW5kcywgICAgICAgICAgICAgICAgIC8qIG1vZHVsZSBkaXJlY3RpdmVzICovCiAgICAgTkdYX0hUVFBfTU9EVUxFLCAgICAgICAgICAgICAgICAgICAgICAgLyogbW9kdWxlIHR5cGUgKi8KICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0IG1hc3RlciAqLwotICAgIG5neF9odHRwX2xvZ19pbml0LCAgICAgICAgICAgICAgICAgICAgIC8qIGluaXQgbW9kdWxlICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdCBtb2R1bGUgKi8KICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0IHByb2Nlc3MgKi8KICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0IHRocmVhZCAqLwogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGV4aXQgdGhyZWFkICovCkBAIC0xMzcsMjEgKzE2OCwzNCBAQAogfTsKIAogCi1zdGF0aWMgbmd4X3N0cl90IGh0dHBfYWNjZXNzX2xvZyA9IG5neF9zdHJpbmcoTkdYX0hUVFBfTE9HX1BBVEgpOworc3RhdGljIG5neF9zdHJfdCAgaHR0cF9hY2Nlc3NfbG9nID0gbmd4X3N0cmluZyhOR1hfSFRUUF9MT0dfUEFUSCk7CiAKIAotc3RhdGljIG5neF9zdHJfdCBuZ3hfaHR0cF9jb21iaW5lZF9mbXQgPQotI2lmIDAKLSAgICBuZ3hfc3RyaW5nKCIkcmVtb3RlX2FkZHIgLSAkcmVtb3RlX3VzZXIgWyV0aW1lXSAiCi0gICAgICAgICAgICAgICAiXCIkcmVxdWVzdFwiICVzdGF0dXMgJWFwYWNoZV9sZW5ndGggIgorc3RhdGljIG5neF9zdHJfdCAgbmd4X2h0dHBfY29tYmluZWRfZm10ID0KKyAgICBuZ3hfc3RyaW5nKCIkcmVtb3RlX2FkZHIgLSAkcmVtb3RlX3VzZXIgWyR0aW1lX2dtdF0gIgorICAgICAgICAgICAgICAgIlwiJHJlcXVlc3RcIiAkc3RhdHVzICRhcGFjaGVfYnl0ZXNfc2VudCAiCiAgICAgICAgICAgICAgICAiXCIkaHR0cF9yZWZlcmVyXCIgXCIkaHR0cF91c2VyX2FnZW50XCIiKTsKLSNlbmRpZgotICAgIG5neF9zdHJpbmcoIiVhZGRyIC0gLSBbJXRpbWVdICIKLSAgICAgICAgICAgICAgICJcIiVyZXF1ZXN0XCIgJXN0YXR1cyAlYXBhY2hlX2xlbmd0aCAiCi0gICAgICAgICAgICAgICAiXCIle3JlZmVyZXJ9aVwiIFwiJXt1c2VyLWFnZW50fWlcIiIpOwogCiAKLW5neF9odHRwX2xvZ19vcF9uYW1lX3Qgbmd4X2h0dHBfbG9nX2ZtdF9vcHNbXSA9IHsKK3N0YXRpYyBuZ3hfaHR0cF9sb2dfdmFyX3QgIG5neF9odHRwX2xvZ192YXJzW10gPSB7CisgICAgeyBuZ3hfc3RyaW5nKCJjb25uZWN0aW9uIiksIE5HWF9BVE9NSUNfVF9MRU4sIG5neF9odHRwX2xvZ19jb25uZWN0aW9uIH0sCisgICAgeyBuZ3hfc3RyaW5nKCJwaXBlIiksIDEsIG5neF9odHRwX2xvZ19waXBlIH0sCisgICAgeyBuZ3hfc3RyaW5nKCJ0aW1lX2dtdCIpLCBzaXplb2YoIjI4L1NlcC8xOTcwOjEyOjAwOjAwICswNjAwIikgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9sb2dfdGltZSB9LAorICAgIHsgbmd4X3N0cmluZygibXNlYyIpLCBOR1hfVElNRV9UX0xFTiArIDQsIG5neF9odHRwX2xvZ19tc2VjIH0sCisgICAgeyBuZ3hfc3RyaW5nKCJyZXF1ZXN0X3RpbWUiKSwgTkdYX1RJTUVfVF9MRU4sIG5neF9odHRwX2xvZ19yZXF1ZXN0X3RpbWUgfSwKKyAgICB7IG5neF9zdHJpbmcoInN0YXR1cyIpLCAzLCBuZ3hfaHR0cF9sb2dfc3RhdHVzIH0sCisgICAgeyBuZ3hfc3RyaW5nKCJieXRlc19zZW50IiksIE5HWF9PRkZfVF9MRU4sIG5neF9odHRwX2xvZ19ieXRlc19zZW50IH0sCisgICAgeyBuZ3hfc3RyaW5nKCJhcGFjaGVfYnl0ZXNfc2VudCIpLCBOR1hfT0ZGX1RfTEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9sb2dfYXBhY2hlX2J5dGVzX3NlbnQgfSwKKyAgICB7IG5neF9zdHJpbmcoInJlcXVlc3RfbGVuZ3RoIiksIE5HWF9TSVpFX1RfTEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9sb2dfcmVxdWVzdF9sZW5ndGggfSwKKworICAgIHsgbmd4X251bGxfc3RyaW5nLCAwLCBOVUxMIH0KK307CisKKworbmd4X2h0dHBfbG9nX29wX25hbWVfdCAgbmd4X2h0dHBfbG9nX2ZtdF9vcHNbXSA9IHsKICAgICB7IG5neF9zdHJpbmcoImFkZHIiKSwgSU5FVF9BRERSU1RSTEVOIC0gMSwgTlVMTCwgTlVMTCwgbmd4X2h0dHBfbG9nX2FkZHIgfSwKICAgICB7IG5neF9zdHJpbmcoImNvbm4iKSwgTkdYX0FUT01JQ19UX0xFTiwgTlVMTCwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfbG9nX2Nvbm5lY3Rpb24gfSwKQEAgLTE2Miw5ICsyMDYsMTAgQEAKICAgICB7IG5neF9zdHJpbmcoInJlcXVlc3RfdGltZSIpLCBOR1hfVElNRV9UX0xFTiwgTlVMTCwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfbG9nX3JlcXVlc3RfdGltZSB9LAogICAgIHsgbmd4X3N0cmluZygic3RhdHVzIiksIDMsIE5VTEwsIE5VTEwsIG5neF9odHRwX2xvZ19zdGF0dXMgfSwKLSAgICB7IG5neF9zdHJpbmcoImxlbmd0aCIpLCBOR1hfT0ZGX1RfTEVOLCBOVUxMLCBOVUxMLCBuZ3hfaHR0cF9sb2dfbGVuZ3RoIH0sCisgICAgeyBuZ3hfc3RyaW5nKCJsZW5ndGgiKSwgTkdYX09GRl9UX0xFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgbmd4X2h0dHBfbG9nX2J5dGVzX3NlbnQgfSwKICAgICB7IG5neF9zdHJpbmcoImFwYWNoZV9sZW5ndGgiKSwgTkdYX09GRl9UX0xFTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgbmd4X2h0dHBfbG9nX2FwYWNoZV9sZW5ndGggfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgbmd4X2h0dHBfbG9nX2FwYWNoZV9ieXRlc19zZW50IH0sCiAgICAgeyBuZ3hfc3RyaW5nKCJyZXF1ZXN0X2xlbmd0aCIpLCBOR1hfU0laRV9UX0xFTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgbmd4X2h0dHBfbG9nX3JlcXVlc3RfbGVuZ3RoIH0sCiAKQEAgLTM3NiwxNCArNDIxLDE1IEBACiAKIAogc3RhdGljIHVfY2hhciAqCi1uZ3hfaHR0cF9sb2dfbGVuZ3RoKG5neF9odHRwX3JlcXVlc3RfdCAqciwgdV9jaGFyICpidWYsIG5neF9odHRwX2xvZ19vcF90ICpvcCkKK25neF9odHRwX2xvZ19ieXRlc19zZW50KG5neF9odHRwX3JlcXVlc3RfdCAqciwgdV9jaGFyICpidWYsCisgICAgbmd4X2h0dHBfbG9nX29wX3QgKm9wKQogewogICAgIHJldHVybiBuZ3hfc3ByaW50ZihidWYsICIlTyIsIHItPmNvbm5lY3Rpb24tPnNlbnQpOwogfQogCiAKIHN0YXRpYyB1X2NoYXIgKgotbmd4X2h0dHBfbG9nX2FwYWNoZV9sZW5ndGgobmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1X2NoYXIgKmJ1ZiwKK25neF9odHRwX2xvZ19hcGFjaGVfYnl0ZXNfc2VudChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVfY2hhciAqYnVmLAogICAgIG5neF9odHRwX2xvZ19vcF90ICpvcCkKIHsKICAgICBvZmZfdCAgbGVuZ3RoOwpAQCAtNzkyLDE0ICs4MzgsMTEgQEAKIAogICAgIHZhbHVlID0gbmd4X2h0dHBfZ2V0X2luZGV4ZWRfdmFyaWFibGUociwgZGF0YSk7CiAKLSAgICBpZiAodmFsdWUgPT0gTlVMTAotICAgICAgICB8fCB2YWx1ZSA9PSBOR1hfSFRUUF9WQVJfTk9UX0ZPVU5ECi0gICAgICAgIHx8IHZhbHVlLT50ZXh0LmxlbiA9PSAwKQotICAgIHsKKyAgICBpZiAodmFsdWUgPT0gTlVMTCB8fCB2YWx1ZS0+bm90X2ZvdW5kKSB7CiAgICAgICAgIHJldHVybiAxOwogICAgIH0KIAotICAgIHJldHVybiB2YWx1ZS0+dGV4dC5sZW47CisgICAgcmV0dXJuIHZhbHVlLT5sZW47CiB9CiAKIApAQCAtODEwLDE1ICs4NTMsMTIgQEAKIAogICAgIHZhbHVlID0gbmd4X2h0dHBfZ2V0X2luZGV4ZWRfdmFyaWFibGUociwgb3AtPmRhdGEpOwogCi0gICAgaWYgKHZhbHVlID09IE5VTEwKLSAgICAgICAgfHwgdmFsdWUgPT0gTkdYX0hUVFBfVkFSX05PVF9GT1VORAotICAgICAgICB8fCB2YWx1ZS0+dGV4dC5sZW4gPT0gMCkKLSAgICB7CisgICAgaWYgKHZhbHVlID09IE5VTEwgfHwgdmFsdWUtPm5vdF9mb3VuZCkgewogICAgICAgICAqYnVmID0gJy0nOwogICAgICAgICByZXR1cm4gYnVmICsgMTsKICAgICB9CiAKLSAgICByZXR1cm4gbmd4X2NweW1lbShidWYsIHZhbHVlLT50ZXh0LmRhdGEsIHZhbHVlLT50ZXh0Lmxlbik7CisgICAgcmV0dXJuIG5neF9jcHltZW0oYnVmLCB2YWx1ZS0+ZGF0YSwgdmFsdWUtPmxlbik7CiB9CiAKIApAQCAtODM5LDggKzg3OSw3IEBACiB7CiAgICAgbmd4X2h0dHBfbG9nX21haW5fY29uZl90ICAqY29uZjsKIAotICAgIGNoYXIgICAgICAgKnJjOwotICAgIG5neF9zdHJfdCAgKnZhbHVlOworICAgIG5neF9odHRwX2xvZ19mbXRfdCAgKmZtdDsKIAogICAgIGNvbmYgPSBuZ3hfcGNhbGxvYyhjZi0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX2xvZ19tYWluX2NvbmZfdCkpOwogICAgIGlmIChjb25mID09IE5VTEwpIHsKQEAgLTg0OCwzOCArODg3LDIxIEBACiAgICAgfQogCiAgICAgaWYgKG5neF9hcnJheV9pbml0KCZjb25mLT5mb3JtYXRzLCBjZi0+cG9vbCwgNCwgc2l6ZW9mKG5neF9odHRwX2xvZ19mbXRfdCkpCi0gICAgICAgID09IE5HWF9FUlJPUikKKyAgICAgICAgIT0gTkdYX09LKQogICAgIHsKICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgIH0KIAotICAgIGNmLT5hcmdzLT5uZWx0cyA9IDA7Ci0KLSAgICB2YWx1ZSA9IG5neF9hcnJheV9wdXNoKGNmLT5hcmdzKTsKLSAgICBpZiAodmFsdWUgPT0gTlVMTCkgeworICAgIGZtdCA9IG5neF9hcnJheV9wdXNoKCZjb25mLT5mb3JtYXRzKTsKKyAgICBpZiAoZm10ID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgIH0KIAotICAgIHZhbHVlLT5sZW4gPSAwOwotICAgIHZhbHVlLT5kYXRhID0gTlVMTDsKKyAgICBmbXQtPm5hbWUubGVuID0gc2l6ZW9mKCJjb21iaW5lZCIpIC0gMTsKKyAgICBmbXQtPm5hbWUuZGF0YSA9ICh1X2NoYXIgKikgImNvbWJpbmVkIjsKIAotICAgIHZhbHVlID0gbmd4X2FycmF5X3B1c2goY2YtPmFyZ3MpOwotICAgIGlmICh2YWx1ZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKLSAgICB9Ci0KLSAgICB2YWx1ZS0+bGVuID0gc2l6ZW9mKCJjb21iaW5lZCIpIC0gMTsKLSAgICB2YWx1ZS0+ZGF0YSA9ICh1X2NoYXIgKikgImNvbWJpbmVkIjsKLQotICAgIHZhbHVlID0gbmd4X2FycmF5X3B1c2goY2YtPmFyZ3MpOwotICAgIGlmICh2YWx1ZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKLSAgICB9Ci0KLSAgICAqdmFsdWUgPSBuZ3hfaHR0cF9jb21iaW5lZF9mbXQ7Ci0KLSAgICByYyA9IG5neF9odHRwX2xvZ19zZXRfZm9ybWF0KGNmLCBOVUxMLCBjb25mKTsKLSAgICBpZiAocmMgIT0gTkdYX0NPTkZfT0spIHsKKyAgICBmbXQtPm9wcyA9IG5neF9hcnJheV9jcmVhdGUoY2YtPnBvb2wsIDE2LCBzaXplb2Yobmd4X2h0dHBfbG9nX29wX3QpKTsKKyAgICBpZiAoZm10LT5vcHMgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgfQogCkBAIC05NDcsNiArOTY5LDcgQEAKIAogICAgICAgICAgICAgLyogdGhlIGRlZmF1bHQgImNvbWJpbmVkIiBmb3JtYXQgKi8KICAgICAgICAgICAgIGxvZy0+b3BzID0gZm10WzBdLm9wczsKKyAgICAgICAgICAgIGxtY2YtPmNvbWJpbmVkX3VzZWQgPSAxOwogICAgICAgICB9CiAgICAgfQogCkBAIC05OTcsNiArMTAyMCw3IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgbmFtZS5sZW4gPSBzaXplb2YoImNvbWJpbmVkIikgLSAxOwogICAgICAgICBuYW1lLmRhdGEgPSAodV9jaGFyICopICJjb21iaW5lZCI7CisgICAgICAgIGxtY2YtPmNvbWJpbmVkX3VzZWQgPSAxOwogICAgIH0KIAogICAgIGZtdCA9IGxtY2YtPmZvcm1hdHMuZWx0czsKQEAgLTEwNTgsMjAgKzEwODIsMTYgQEAKIHsKICAgICBuZ3hfaHR0cF9sb2dfbWFpbl9jb25mX3QgKmxtY2YgPSBjb25mOwogCi0gICAgdV9jaGFyICAgICAgICAgICAgICAgICAgICAgKmRhdGEsICpwLCAqZm5hbWUsIGNoOwotICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICBpLCBsZW4sIGZuYW1lX2xlbjsKLSAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgICAqdmFsdWUsIHZhciwgYXJnLCAqYTsKLSAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgcywgZiwgYnJhY2tldDsKLSAgICBuZ3hfaHR0cF9sb2dfb3BfdCAgICAgICAgICAqb3A7Ci0gICAgbmd4X2h0dHBfbG9nX2ZtdF90ICAgICAgICAgKmZtdDsKLSAgICBuZ3hfaHR0cF9sb2dfb3BfbmFtZV90ICAgICAqbmFtZTsKKyAgICBuZ3hfc3RyX3QgICAgICAgICAgICp2YWx1ZTsKKyAgICBuZ3hfdWludF90ICAgICAgICAgICBpOworICAgIG5neF9odHRwX2xvZ19mbXRfdCAgKmZtdDsKIAogICAgIHZhbHVlID0gY2YtPmFyZ3MtPmVsdHM7CiAKICAgICBmbXQgPSBsbWNmLT5mb3JtYXRzLmVsdHM7Ci0gICAgZm9yIChmID0gMDsgZiA8IGxtY2YtPmZvcm1hdHMubmVsdHM7IGYrKykgewotICAgICAgICBpZiAoZm10W2ZdLm5hbWUubGVuID09IHZhbHVlWzFdLmxlbgotICAgICAgICAgICAgJiYgbmd4X3N0cmNtcChmbXQtPm5hbWUuZGF0YSwgdmFsdWVbMV0uZGF0YSkgPT0gMCkKKyAgICBmb3IgKGkgPSAwOyBpIDwgbG1jZi0+Zm9ybWF0cy5uZWx0czsgaSsrKSB7CisgICAgICAgIGlmIChmbXRbaV0ubmFtZS5sZW4gPT0gdmFsdWVbMV0ubGVuCisgICAgICAgICAgICAmJiBuZ3hfc3RyY21wKGZtdFtpXS5uYW1lLmRhdGEsIHZhbHVlWzFdLmRhdGEpID09IDApCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiAiZHVwbGljYXRlIFwibG9nX2Zvcm1hdFwiIG5hbWUiOwogICAgICAgICB9CkBAIC0xMDg0LDIwICsxMTA0LDM4IEBACiAKICAgICBmbXQtPm5hbWUgPSB2YWx1ZVsxXTsKIAotICAgIGZtdC0+b3BzID0gbmd4X2FycmF5X2NyZWF0ZShjZi0+cG9vbCwgMjAsIHNpemVvZihuZ3hfaHR0cF9sb2dfb3BfdCkpOworICAgIGZtdC0+b3BzID0gbmd4X2FycmF5X2NyZWF0ZShjZi0+cG9vbCwgMTYsIHNpemVvZihuZ3hfaHR0cF9sb2dfb3BfdCkpOwogICAgIGlmIChmbXQtPm9wcyA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICB9CiAKLSAgICBhcmcuZGF0YSA9IE5VTEw7CisgICAgcmV0dXJuIG5neF9odHRwX2xvZ19jb21waWxlX2Zvcm1hdChjZiwgZm10LT5vcHMsIGNmLT5hcmdzLCAyKTsKK30KIAotICAgIGZvciAocyA9IDI7IHMgPCBjZi0+YXJncy0+bmVsdHM7IHMrKykgeworCitzdGF0aWMgY2hhciAqCituZ3hfaHR0cF9sb2dfY29tcGlsZV9mb3JtYXQobmd4X2NvbmZfdCAqY2YsIG5neF9hcnJheV90ICpvcHMsCisgICAgbmd4X2FycmF5X3QgKmFyZ3MsIG5neF91aW50X3QgcykKK3sKKyAgICB1X2NoYXIgICAgICAgICAgICAgICAgICAqZGF0YSwgKnAsICpmbmFtZSwgKmFyZ19kYXRhLCBjaDsKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgaSwgbGVuLCBmbmFtZV9sZW4sIGFyZ19sZW47CisgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgKnZhbHVlLCB2YXIsICphOworICAgIG5neF91aW50X3QgICAgICAgICAgICAgICBicmFja2V0OworICAgIG5neF9odHRwX2xvZ19vcF90ICAgICAgICpvcDsKKyAgICBuZ3hfaHR0cF9sb2dfdmFyX3QgICAgICAqdjsKKyAgICBuZ3hfaHR0cF9sb2dfb3BfbmFtZV90ICAqbmFtZTsKKyAgICBzdGF0aWMgbmd4X3VpbnRfdCAgICAgICAgd2FybjsKKworICAgIHZhbHVlID0gYXJncy0+ZWx0czsKKyAgICBhcmdfZGF0YSA9IE5VTEw7CisKKyAgICBmb3IgKCAvKiB2b2lkICovIDsgcyA8IGFyZ3MtPm5lbHRzOyBzKyspIHsKIAogICAgICAgICBpID0gMDsKIAogICAgICAgICB3aGlsZSAoaSA8IHZhbHVlW3NdLmxlbikgewogCi0gICAgICAgICAgICBvcCA9IG5neF9hcnJheV9wdXNoKGZtdC0+b3BzKTsKKyAgICAgICAgICAgIG9wID0gbmd4X2FycmF5X3B1c2gob3BzKTsKICAgICAgICAgICAgIGlmIChvcCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgICAgICAgICAgfQpAQCAtMTExNCwyMiArMTE1MiwyOSBAQAogICAgICAgICAgICAgICAgIGlmICh2YWx1ZVtzXS5kYXRhW2ldID09ICd7JykgewogICAgICAgICAgICAgICAgICAgICBpKys7CiAKLSAgICAgICAgICAgICAgICAgICAgYXJnLmRhdGEgPSAmdmFsdWVbc10uZGF0YVtpXTsKKyAgICAgICAgICAgICAgICAgICAgYXJnX2RhdGEgPSAmdmFsdWVbc10uZGF0YVtpXTsKIAogICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaSA8IHZhbHVlW3NdLmxlbiAmJiB2YWx1ZVtzXS5kYXRhW2ldICE9ICd9JykgewogICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgYXJnLmxlbiA9ICZ2YWx1ZVtzXS5kYXRhW2ldIC0gYXJnLmRhdGE7CisgICAgICAgICAgICAgICAgICAgIGFyZ19sZW4gPSAmdmFsdWVbc10uZGF0YVtpXSAtIGFyZ19kYXRhOwogCi0gICAgICAgICAgICAgICAgICAgIGlmIChpID09IHZhbHVlW3NdLmxlbiB8fCBhcmcubGVuID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gdmFsdWVbc10ubGVuIHx8IGFyZ19sZW4gPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgZ290byBpbnZhbGlkOwogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgaSsrOwogCiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXJnLmxlbiA9IDA7CisgICAgICAgICAgICAgICAgICAgIGFyZ19sZW4gPSAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh3YXJuID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbmd4X2NvbmZfbG9nX2Vycm9yKE5HWF9MT0dfV0FSTiwgY2YsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAidGhlIHBhcmFtZXRlcnMgaW4gdGhlIFwiJSVuYW1lXCIgZm9ybSBhcmUgZGVwcmVjYXRlZCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgInVzZSB0aGUgXCIkdmFyaWFibGVcIiBpbnN0ZWFkIik7CisgICAgICAgICAgICAgICAgICAgIHdhcm4gPSAxOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGZuYW1lID0gJnZhbHVlW3NdLmRhdGFbaV07CkBAIC0xMTU2LDcgKzEyMDEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgJiYgbmd4X3N0cm5jbXAobmFtZS0+bmFtZS5kYXRhLCBmbmFtZSwgZm5hbWVfbGVuKSA9PSAwKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZS0+Y29tcGlsZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyZy5sZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJnX2xlbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbmFtZVtmbmFtZV9sZW5dID0gJ1wwJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2NvbmZfbG9nX2Vycm9yKE5HWF9MT0dfRU1FUkcsIGNmLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIlc1wiIG11c3Qgbm90IGhhdmUgYXJndW1lbnQiLApAQCAtMTE3Miw3ICsxMjE3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyZy5sZW4gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ19sZW4gPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZuYW1lW2ZuYW1lX2xlbl0gPSAnXDAnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9jb25mX2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBjZiwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiJXNcIiByZXF1aXJlcyBhcmd1bWVudCIsIApAQCAtMTE4NSw3ICsxMjMwLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICphID0gYXJnOworICAgICAgICAgICAgICAgICAgICAgICAgYS0+bGVuID0gYXJnX2xlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGEtPmRhdGEgPSBhcmdfZGF0YTsKKwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUtPmNvbXBpbGUoY2YsIG9wLCBhKSA9PSBOR1hfRVJST1IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC0xMTk4LDYgKzEyNDUsOCBAQAogICAgICAgICAgICAgICAgICAgICBnb3RvIGludmFsaWQ7CiAgICAgICAgICAgICAgICAgfQogCisgICAgICAgICAgICAgICAgY29udGludWU7CisKICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWVbc10uZGF0YVtpXSA9PSAnJCcpIHsKIAogICAgICAgICAgICAgICAgIGlmICgrK2kgPT0gdmFsdWVbc10ubGVuKSB7CkBAIC0xMjQ5LDQ3ICsxMjk4LDY0IEBACiAgICAgICAgICAgICAgICAgICAgIGdvdG8gaW52YWxpZDsKICAgICAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgICAgICBmb3IgKHYgPSBuZ3hfaHR0cF9sb2dfdmFyczsgdi0+bmFtZS5sZW47IHYrKykgeworCisgICAgICAgICAgICAgICAgICAgIGlmICh2LT5uYW1lLmxlbiA9PSB2YXIubGVuCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBuZ3hfc3RybmNtcCh2LT5uYW1lLmRhdGEsIHZhci5kYXRhLCB2YXIubGVuKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcC0+bGVuID0gdi0+bGVuOworICAgICAgICAgICAgICAgICAgICAgICAgb3AtPmdldGxlbiA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICBvcC0+cnVuID0gdi0+cnVuOworICAgICAgICAgICAgICAgICAgICAgICAgb3AtPmRhdGEgPSAwOworCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZvdW5kOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgaWYgKG5neF9odHRwX2xvZ192YXJpYWJsZV9jb21waWxlKGNmLCBvcCwgJnZhcikgIT0gTkdYX09LKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3VuZDoKKworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpKys7CisKKyAgICAgICAgICAgIHdoaWxlIChpIDwgdmFsdWVbc10ubGVuCisgICAgICAgICAgICAgICAgICAgJiYgdmFsdWVbc10uZGF0YVtpXSAhPSAnJCcKKyAgICAgICAgICAgICAgICAgICAmJiB2YWx1ZVtzXS5kYXRhW2ldICE9ICclJykKKyAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICB3aGlsZSAoaSA8IHZhbHVlW3NdLmxlbgotICAgICAgICAgICAgICAgICAgICAgICAmJiB2YWx1ZVtzXS5kYXRhW2ldICE9ICckJwotICAgICAgICAgICAgICAgICAgICAgICAmJiB2YWx1ZVtzXS5kYXRhW2ldICE9ICclJykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBsZW4gPSAmdmFsdWVbc10uZGF0YVtpXSAtIGRhdGE7CiAKLSAgICAgICAgICAgICAgICBsZW4gPSAmdmFsdWVbc10uZGF0YVtpXSAtIGRhdGE7CisgICAgICAgICAgICBpZiAobGVuKSB7CiAKLSAgICAgICAgICAgICAgICBpZiAobGVuKSB7CisgICAgICAgICAgICAgICAgb3AtPmxlbiA9IGxlbjsKKyAgICAgICAgICAgICAgICBvcC0+Z2V0bGVuID0gTlVMTDsKIAotICAgICAgICAgICAgICAgICAgICBvcC0+bGVuID0gbGVuOwotICAgICAgICAgICAgICAgICAgICBvcC0+Z2V0bGVuID0gTlVMTDsKKyAgICAgICAgICAgICAgICBpZiAobGVuIDw9IHNpemVvZih1aW50cHRyX3QpKSB7CisgICAgICAgICAgICAgICAgICAgIG9wLT5ydW4gPSBuZ3hfaHR0cF9sb2dfY29weV9zaG9ydDsKKyAgICAgICAgICAgICAgICAgICAgb3AtPmRhdGEgPSAwOwogCi0gICAgICAgICAgICAgICAgICAgIGlmIChsZW4gPD0gc2l6ZW9mKHVpbnRwdHJfdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wLT5ydW4gPSBuZ3hfaHR0cF9sb2dfY29weV9zaG9ydDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wLT5kYXRhID0gMDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGxlbi0tKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AtPmRhdGEgPDw9IDg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AtPmRhdGEgfD0gZGF0YVtsZW5dOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcC0+cnVuID0gbmd4X2h0dHBfbG9nX2NvcHlfbG9uZzsKLQotICAgICAgICAgICAgICAgICAgICAgICAgcCA9IG5neF9wYWxsb2MoY2YtPnBvb2wsIGxlbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBuZ3hfbWVtY3B5KHAsIGRhdGEsIGxlbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcC0+ZGF0YSA9ICh1aW50cHRyX3QpIHA7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChsZW4tLSkgeworICAgICAgICAgICAgICAgICAgICAgICAgb3AtPmRhdGEgPDw9IDg7CisgICAgICAgICAgICAgICAgICAgICAgICBvcC0+ZGF0YSB8PSBkYXRhW2xlbl07CiAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG9wLT5ydW4gPSBuZ3hfaHR0cF9sb2dfY29weV9sb25nOworCisgICAgICAgICAgICAgICAgICAgIHAgPSBuZ3hfcGFsbG9jKGNmLT5wb29sLCBsZW4pOworICAgICAgICAgICAgICAgICAgICBpZiAocCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBuZ3hfbWVtY3B5KHAsIGRhdGEsIGxlbik7CisgICAgICAgICAgICAgICAgICAgIG9wLT5kYXRhID0gKHVpbnRwdHJfdCkgcDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTEzMDYsMTEgKzEzNzIsMzcgQEAKIAogCiBzdGF0aWMgbmd4X2ludF90Ci1uZ3hfaHR0cF9sb2dfaW5pdChuZ3hfY3ljbGVfdCAqY3ljbGUpCituZ3hfaHR0cF9sb2dfaW5pdChuZ3hfY29uZl90ICpjZikKIHsKKyAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgICAqdmFsdWU7CisgICAgbmd4X2FycmF5X3QgICAgICAgICAgICAgICAgIGE7CisgICAgbmd4X2h0dHBfbG9nX2ZtdF90ICAgICAgICAgKmZtdDsKKyAgICBuZ3hfaHR0cF9sb2dfbWFpbl9jb25mX3QgICAqbG1jZjsKICAgICBuZ3hfaHR0cF9jb3JlX21haW5fY29uZl90ICAqY21jZjsKIAotICAgIGNtY2YgPSBuZ3hfaHR0cF9jeWNsZV9nZXRfbW9kdWxlX21haW5fY29uZihjeWNsZSwgbmd4X2h0dHBfY29yZV9tb2R1bGUpOworICAgIGxtY2YgPSBuZ3hfaHR0cF9jb25mX2dldF9tb2R1bGVfbWFpbl9jb25mKGNmLCBuZ3hfaHR0cF9sb2dfbW9kdWxlKTsKKworICAgIGlmIChsbWNmLT5jb21iaW5lZF91c2VkKSB7CisgICAgICAgIGlmIChuZ3hfYXJyYXlfaW5pdCgmYSwgY2YtPnBvb2wsIDEsIHNpemVvZihuZ3hfc3RyX3QpKSAhPSBOR1hfT0spIHsKKyAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICB2YWx1ZSA9IG5neF9hcnJheV9wdXNoKCZhKTsKKyAgICAgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICAqdmFsdWUgPSBuZ3hfaHR0cF9jb21iaW5lZF9mbXQ7CisgICAgICAgIGZtdCA9IGxtY2YtPmZvcm1hdHMuZWx0czsKKworICAgICAgICBpZiAobmd4X2h0dHBfbG9nX2NvbXBpbGVfZm9ybWF0KGNmLCBmbXQtPm9wcywgJmEsIDApCisgICAgICAgICAgICAhPSBOR1hfQ09ORl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNtY2YgPSBuZ3hfaHR0cF9jb25mX2dldF9tb2R1bGVfbWFpbl9jb25mKGNmLCBuZ3hfaHR0cF9jb3JlX21vZHVsZSk7CiAKICAgICBjbWNmLT5sb2dfaGFuZGxlciA9IG5neF9odHRwX2xvZ19oYW5kbGVyOwogCmRpZmYgLS1naXQgYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2xvZ19tb2R1bGUuaCBiL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfbG9nX21vZHVsZS5oCmluZGV4IGM0MTRiYzQuLjAxY2ZiNTQgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfbG9nX21vZHVsZS5oCisrKyBiL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfbG9nX21vZHVsZS5oCkBAIC0zNSwxMiArMzUsNiBAQAogCiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgIG5hbWU7Ci0gICAgbmd4X2FycmF5X3QgICAgICAgICAgICAgICAgKm9wczsgICAgICAgIC8qIGFycmF5IG9mIG5neF9odHRwX2xvZ19vcF90ICovCi19IG5neF9odHRwX2xvZ19mbXRfdDsKLQotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgIG5hbWU7CiAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgIGxlbjsKICAgICBuZ3hfaHR0cF9sb2dfb3BfY29tcGlsZV9wdCAgY29tcGlsZTsKICAgICBuZ3hfaHR0cF9sb2dfb3BfZ2V0bGVuX3B0ICAgZ2V0bGVuOwpAQCAtNDgsMjMgKzQyLDYgQEAKIH0gbmd4X2h0dHBfbG9nX29wX25hbWVfdDsKIAogCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgbmd4X2FycmF5X3QgICAgICAgICAgICAgICAgIGZvcm1hdHM7ICAgIC8qIGFycmF5IG9mIG5neF9odHRwX2xvZ19mbXRfdCAqLwotfSBuZ3hfaHR0cF9sb2dfbWFpbl9jb25mX3Q7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIG5neF9vcGVuX2ZpbGVfdCAgICAgICAgICAgICpmaWxlOwotICAgIG5neF9hcnJheV90ICAgICAgICAgICAgICAgICpvcHM7ICAgICAgICAvKiBhcnJheSBvZiBuZ3hfaHR0cF9sb2dfb3BfdCAqLwotfSBuZ3hfaHR0cF9sb2dfdDsKLQotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgbmd4X2FycmF5X3QgICAgICAgICAgICAgICAgKmxvZ3M7ICAgICAgIC8qIGFycmF5IG9mIG5neF9odHRwX2xvZ190ICovCi0gICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgIG9mZjsgICAgICAgIC8qIHVuc2lnbmVkICBvZmY6MSAqLwotfSBuZ3hfaHR0cF9sb2dfbG9jX2NvbmZfdDsKLQotCiBleHRlcm4gbmd4X2h0dHBfbG9nX29wX25hbWVfdCBuZ3hfaHR0cF9sb2dfZm10X29wc1tdOwogCiAKZGlmZiAtLWdpdCBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfcHJveHlfbW9kdWxlLmMgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3Byb3h5X21vZHVsZS5jCmluZGV4IDhjNDIzMWEuLjI2ZjA4MzEgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfcHJveHlfbW9kdWxlLmMKKysrIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9wcm94eV9tb2R1bGUuYwpAQCAtMzcsNiArMzcsNyBAQAogCiAgICAgbmd4X3BlZXJzX3QgICAgICAgICAgICAgICAgICpwZWVyczsKIAorICAgIG5neF9hcnJheV90ICAgICAgICAgICAgICAgICAqZmx1c2hlczsKICAgICBuZ3hfYXJyYXlfdCAgICAgICAgICAgICAgICAgKmhlYWRlcnNfc2V0X2xlbjsKICAgICBuZ3hfYXJyYXlfdCAgICAgICAgICAgICAgICAgKmhlYWRlcnNfc2V0OwogICAgIG5neF9oYXNoX3QgICAgICAgICAgICAgICAgICAqaGVhZGVyc19zZXRfaGFzaDsKQEAgLTc1LDEzICs3NiwxMyBAQAogc3RhdGljIHZvaWQgbmd4X2h0dHBfcHJveHlfZmluYWxpemVfcmVxdWVzdChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCiAgICAgbmd4X2ludF90IHJjKTsKIAotc3RhdGljIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgKgotICAgIG5neF9odHRwX3Byb3h5X2hvc3RfdmFyaWFibGUobmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1aW50cHRyX3QgZGF0YSk7Ci1zdGF0aWMgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAqCi0gICAgbmd4X2h0dHBfcHJveHlfcG9ydF92YXJpYWJsZShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVpbnRwdHJfdCBkYXRhKTsKLXN0YXRpYyBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICoKK3N0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfcHJveHlfaG9zdF92YXJpYWJsZShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCisgICAgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAqdiwgdWludHB0cl90IGRhdGEpOworc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9wcm94eV9wb3J0X3ZhcmlhYmxlKG5neF9odHRwX3JlcXVlc3RfdCAqciwKKyAgICBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICp2LCB1aW50cHRyX3QgZGF0YSk7CitzdGF0aWMgbmd4X2ludF90CiAgICAgbmd4X2h0dHBfcHJveHlfYWRkX3hfZm9yd2FyZGVkX2Zvcl92YXJpYWJsZShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCi0gICAgdWludHB0cl90IGRhdGEpOworICAgIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgKnYsIHVpbnRwdHJfdCBkYXRhKTsKIHN0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfcHJveHlfcmV3cml0ZV9yZWRpcmVjdChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCiAgICAgbmd4X3RhYmxlX2VsdF90ICpoLCBzaXplX3QgcHJlZml4KTsKIApAQCAtNDMxLDcgKzQzMiw3IEBACiAKICAgICBlc2NhcGUgPSAwOwogCi0gICAgbG9jX2xlbiA9IHItPnZhbGlkX2xvY2F0aW9uID8gdS0+Y29uZi0+bG9jYXRpb24tPmxlbiA6IDA7CisgICAgbG9jX2xlbiA9IHItPnZhbGlkX2xvY2F0aW9uID8gdS0+Y29uZi0+bG9jYXRpb24ubGVuIDogMDsKIAogICAgIGlmICh1LT5jb25mLT51cmkubGVuID09IDAgJiYgci0+dmFsaWRfdW5wYXJzZWRfdXJpKSB7CiAgICAgICAgIGxlbiArPSByLT51bnBhcnNlZF91cmkubGVuOwpAQCAtNDQ3LDggKzQ0OCwxMSBAQAogCiAgICAgbmd4X21lbXplcm8oJmUsIHNpemVvZihuZ3hfaHR0cF9zY3JpcHRfZW5naW5lX3QpKTsKIAorICAgIG5neF9odHRwX3NjcmlwdF9mbHVzaF9ub19jYWNoYWJsZV92YXJpYWJsZXMociwgcGxjZi0+Zmx1c2hlcyk7CisKICAgICBsZS5pcCA9IHBsY2YtPmhlYWRlcnNfc2V0X2xlbi0+ZWx0czsKICAgICBsZS5yZXF1ZXN0ID0gcjsKKyAgICBsZS5mbHVzaGVkID0gMTsKIAogICAgIHdoaWxlICgqKHVpbnRwdHJfdCAqKSBsZS5pcCkgewogICAgICAgICB3aGlsZSAoKih1aW50cHRyX3QgKikgbGUuaXApIHsKQEAgLTUwNiwxNiArNTEwLDE2IEBACiAKICAgICAvKiB0aGUgcmVxdWVzdCBsaW5lICovCiAKLSAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCBtZXRob2QuZGF0YSwgbWV0aG9kLmxlbik7CisgICAgYi0+bGFzdCA9IG5neF9jb3B5KGItPmxhc3QsIG1ldGhvZC5kYXRhLCBtZXRob2QubGVuKTsKIAogICAgIHUtPnVyaS5kYXRhID0gYi0+bGFzdDsKIAogICAgIGlmICh1LT5jb25mLT51cmkubGVuID09IDAgJiYgci0+dmFsaWRfdW5wYXJzZWRfdXJpKSB7Ci0gICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsIHItPnVucGFyc2VkX3VyaS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLT51bnBhcnNlZF91cmkubGVuKTsKKyAgICAgICAgYi0+bGFzdCA9IG5neF9jb3B5KGItPmxhc3QsIHItPnVucGFyc2VkX3VyaS5kYXRhLCByLT51bnBhcnNlZF91cmkubGVuKTsKKwogICAgIH0gZWxzZSB7CiAgICAgICAgIGlmIChyLT52YWxpZF9sb2NhdGlvbikgewotICAgICAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgdS0+Y29uZi0+dXJpLmRhdGEsIHUtPmNvbmYtPnVyaS5sZW4pOworICAgICAgICAgICAgYi0+bGFzdCA9IG5neF9jb3B5KGItPmxhc3QsIHUtPmNvbmYtPnVyaS5kYXRhLCB1LT5jb25mLT51cmkubGVuKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChlc2NhcGUpIHsKQEAgLTUyNCwxMyArNTI4LDEzIEBACiAgICAgICAgICAgICBiLT5sYXN0ICs9IHItPnVyaS5sZW4gLSBsb2NfbGVuICsgZXNjYXBlOwogCiAgICAgICAgIH0gZWxzZSB7IAotICAgICAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgci0+dXJpLmRhdGEgKyBsb2NfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+dXJpLmxlbiAtIGxvY19sZW4pOworICAgICAgICAgICAgYi0+bGFzdCA9IG5neF9jb3B5KGItPmxhc3QsIHItPnVyaS5kYXRhICsgbG9jX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLT51cmkubGVuIC0gbG9jX2xlbik7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoci0+YXJncy5sZW4gPiAwKSB7CiAgICAgICAgICAgICAqYi0+bGFzdCsrID0gJz8nOwotICAgICAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgci0+YXJncy5kYXRhLCByLT5hcmdzLmxlbik7CisgICAgICAgICAgICBiLT5sYXN0ID0gbmd4X2NvcHkoYi0+bGFzdCwgci0+YXJncy5kYXRhLCByLT5hcmdzLmxlbik7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTU0Myw2ICs1NDcsNyBAQAogICAgIGUuaXAgPSBwbGNmLT5oZWFkZXJzX3NldC0+ZWx0czsKICAgICBlLnBvcyA9IGItPmxhc3Q7CiAgICAgZS5yZXF1ZXN0ID0gcjsKKyAgICBlLmZsdXNoZWQgPSAxOwogCiAgICAgbGUuaXAgPSBwbGNmLT5oZWFkZXJzX3NldF9sZW4tPmVsdHM7CiAKQEAgLTYwMCwxMyArNjA1LDEyIEBACiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsIGhlYWRlcltpXS5rZXkuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcltpXS5rZXkubGVuKTsKKyAgICAgICAgICAgIGItPmxhc3QgPSBuZ3hfY29weShiLT5sYXN0LCBoZWFkZXJbaV0ua2V5LmRhdGEsIGhlYWRlcltpXS5rZXkubGVuKTsKIAogICAgICAgICAgICAgKmItPmxhc3QrKyA9ICc6JzsgKmItPmxhc3QrKyA9ICcgJzsKIAotICAgICAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgaGVhZGVyW2ldLnZhbHVlLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaV0udmFsdWUubGVuKTsKKyAgICAgICAgICAgIGItPmxhc3QgPSBuZ3hfY29weShiLT5sYXN0LCBoZWFkZXJbaV0udmFsdWUuZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaV0udmFsdWUubGVuKTsKIAogICAgICAgICAgICAgKmItPmxhc3QrKyA9IENSOyAqYi0+bGFzdCsrID0gTEY7CiAKQEAgLTczNSw2ICs3MzksNyBAQAogICAgIGlmICh1LT5oZWFkZXJzX2luLnN0YXR1c19saW5lLmRhdGEgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwogICAgIH0KKwogICAgIG5neF9tZW1jcHkodS0+aGVhZGVyc19pbi5zdGF0dXNfbGluZS5kYXRhLCBwLT5zdGF0dXNfc3RhcnQsCiAgICAgICAgICAgICAgICB1LT5oZWFkZXJzX2luLnN0YXR1c19saW5lLmxlbik7CiAKQEAgLTEwNTQsODMgKzEwNTksNzcgQEAKIH0KIAogCi1zdGF0aWMgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAqCi1uZ3hfaHR0cF9wcm94eV9ob3N0X3ZhcmlhYmxlKG5neF9odHRwX3JlcXVlc3RfdCAqciwgdWludHB0cl90IGRhdGEpCitzdGF0aWMgbmd4X2ludF90CituZ3hfaHR0cF9wcm94eV9ob3N0X3ZhcmlhYmxlKG5neF9odHRwX3JlcXVlc3RfdCAqciwKKyAgICBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICp2LCB1aW50cHRyX3QgZGF0YSkKIHsKLSAgICBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICAqdnY7CiAgICAgbmd4X2h0dHBfcHJveHlfbG9jX2NvbmZfdCAgKnBsY2Y7CiAKLSAgICB2diA9IG5neF9wYWxsb2Moci0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QpKTsKLSAgICBpZiAodnYgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KICAgICBwbGNmID0gbmd4X2h0dHBfZ2V0X21vZHVsZV9sb2NfY29uZihyLCBuZ3hfaHR0cF9wcm94eV9tb2R1bGUpOwogCi0gICAgdnYtPnZhbHVlID0gMDsKLSAgICB2di0+dGV4dCA9IHBsY2YtPmhvc3RfaGVhZGVyOworICAgIHYtPmxlbiA9IHBsY2YtPmhvc3RfaGVhZGVyLmxlbjsKKyAgICB2LT52YWxpZCA9IDE7IAorICAgIHYtPm5vX2NhY2hhYmxlID0gMDsKKyAgICB2LT5ub3RfZm91bmQgPSAwOworICAgIHYtPmRhdGEgPSBwbGNmLT5ob3N0X2hlYWRlci5kYXRhOwogCi0gICAgcmV0dXJuIHZ2OworICAgIHJldHVybiBOR1hfT0s7CiB9CiAKIAotc3RhdGljIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgKgotbmd4X2h0dHBfcHJveHlfcG9ydF92YXJpYWJsZShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVpbnRwdHJfdCBkYXRhKQorc3RhdGljIG5neF9pbnRfdAorbmd4X2h0dHBfcHJveHlfcG9ydF92YXJpYWJsZShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCisgICAgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAqdiwgdWludHB0cl90IGRhdGEpCiB7Ci0gICAgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAgKnZ2OwogICAgIG5neF9odHRwX3Byb3h5X2xvY19jb25mX3QgICpwbGNmOwogCi0gICAgdnYgPSBuZ3hfcGFsbG9jKHItPnBvb2wsIHNpemVvZihuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90KSk7Ci0gICAgaWYgKHZ2ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCiAgICAgcGxjZiA9IG5neF9odHRwX2dldF9tb2R1bGVfbG9jX2NvbmYociwgbmd4X2h0dHBfcHJveHlfbW9kdWxlKTsKIAotICAgIHZ2LT52YWx1ZSA9IDA7Ci0gICAgdnYtPnRleHQgPSBwbGNmLT5wb3J0X3RleHQ7CisgICAgdi0+bGVuID0gcGxjZi0+cG9ydF90ZXh0LmxlbjsKKyAgICB2LT52YWxpZCA9IDE7IAorICAgIHYtPm5vX2NhY2hhYmxlID0gMDsKKyAgICB2LT5ub3RfZm91bmQgPSAwOworICAgIHYtPmRhdGEgPSBwbGNmLT5wb3J0X3RleHQuZGF0YTsKIAotICAgIHJldHVybiB2djsKKyAgICByZXR1cm4gTkdYX09LOwogfQogCiAKLXN0YXRpYyBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICoKK3N0YXRpYyBuZ3hfaW50X3QKIG5neF9odHRwX3Byb3h5X2FkZF94X2ZvcndhcmRlZF9mb3JfdmFyaWFibGUobmd4X2h0dHBfcmVxdWVzdF90ICpyLAotICAgIHVpbnRwdHJfdCBkYXRhKQorICAgIAorICAgIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgKnYsIHVpbnRwdHJfdCBkYXRhKQogewotICAgIHVfY2hhciAgICAgICAgICAgICAgICAgICAgICpwOwotICAgIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgICp2djsKKyAgICB1X2NoYXIgICpwOwogCi0gICAgdnYgPSBuZ3hfcGFsbG9jKHItPnBvb2wsIHNpemVvZihuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90KSk7Ci0gICAgaWYgKHZ2ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgdnYtPnZhbHVlID0gMDsKKyAgICB2LT52YWxpZCA9IDE7IAorICAgIHYtPm5vX2NhY2hhYmxlID0gMDsKKyAgICB2LT5ub3RfZm91bmQgPSAwOwogCiAgICAgaWYgKHItPmhlYWRlcnNfaW4ueF9mb3J3YXJkZWRfZm9yID09IE5VTEwpIHsKLSAgICAgICAgdnYtPnRleHQgPSByLT5jb25uZWN0aW9uLT5hZGRyX3RleHQ7Ci0gICAgICAgIHJldHVybiB2djsKKyAgICAgICAgdi0+bGVuID0gci0+Y29ubmVjdGlvbi0+YWRkcl90ZXh0LmxlbjsKKyAgICAgICAgdi0+ZGF0YSA9IHItPmNvbm5lY3Rpb24tPmFkZHJfdGV4dC5kYXRhOworICAgICAgICByZXR1cm4gTkdYX09LOwogICAgIH0KIAotICAgIHZ2LT50ZXh0LmxlbiA9IHItPmhlYWRlcnNfaW4ueF9mb3J3YXJkZWRfZm9yLT52YWx1ZS5sZW4KLSAgICAgICAgICAgICAgICAgICArIHNpemVvZigiLCAiKSAtIDEgKyByLT5jb25uZWN0aW9uLT5hZGRyX3RleHQubGVuOworICAgIHYtPmxlbiA9IHItPmhlYWRlcnNfaW4ueF9mb3J3YXJkZWRfZm9yLT52YWx1ZS5sZW4KKyAgICAgICAgICAgICArIHNpemVvZigiLCAiKSAtIDEgKyByLT5jb25uZWN0aW9uLT5hZGRyX3RleHQubGVuOwogCi0gICAgcCA9IG5neF9wYWxsb2Moci0+cG9vbCwgdnYtPnRleHQubGVuKTsKKyAgICBwID0gbmd4X3BhbGxvYyhyLT5wb29sLCB2LT5sZW4pOwogICAgIGlmIChwID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgfQogCi0gICAgdnYtPnRleHQuZGF0YSA9IHA7CisgICAgdi0+ZGF0YSA9IHA7CiAKLSAgICBwID0gbmd4X2NweW1lbShwLCByLT5oZWFkZXJzX2luLnhfZm9yd2FyZGVkX2Zvci0+dmFsdWUuZGF0YSwKLSAgICAgICAgICAgICAgICAgICByLT5oZWFkZXJzX2luLnhfZm9yd2FyZGVkX2Zvci0+dmFsdWUubGVuKTsKKyAgICBwID0gbmd4X2NvcHkocCwgci0+aGVhZGVyc19pbi54X2ZvcndhcmRlZF9mb3ItPnZhbHVlLmRhdGEsCisgICAgICAgICAgICAgICAgIHItPmhlYWRlcnNfaW4ueF9mb3J3YXJkZWRfZm9yLT52YWx1ZS5sZW4pOwogCiAgICAgKnArKyA9ICcsJzsgKnArKyA9ICcgJzsKIAogICAgIG5neF9tZW1jcHkocCwgci0+Y29ubmVjdGlvbi0+YWRkcl90ZXh0LmRhdGEsIHItPmNvbm5lY3Rpb24tPmFkZHJfdGV4dC5sZW4pOwogCi0gICAgcmV0dXJuIHZ2OworICAgIHJldHVybiBOR1hfT0s7CiB9CiAKIApAQCAtMTE4NiwxMSArMTE4NSw5IEBACiAKICAgICBwID0gZGF0YTsKIAotICAgIGlmIChwcmVmaXgpIHsKLSAgICAgICAgcCA9IG5neF9jcHltZW0ocCwgaC0+dmFsdWUuZGF0YSwgcHJlZml4KTsKLSAgICB9CisgICAgcCA9IG5neF9jb3B5KHAsIGgtPnZhbHVlLmRhdGEsIHByZWZpeCk7CiAKLSAgICBwID0gbmd4X2NweW1lbShwLCBwci0+cmVwbGFjZW1lbnQudGV4dC5kYXRhLCBwci0+cmVwbGFjZW1lbnQudGV4dC5sZW4pOworICAgIHAgPSBuZ3hfY29weShwLCBwci0+cmVwbGFjZW1lbnQudGV4dC5kYXRhLCBwci0+cmVwbGFjZW1lbnQudGV4dC5sZW4pOwogCiAgICAgbmd4X21lbWNweShwLCBoLT52YWx1ZS5kYXRhICsgcHJlZml4ICsgcHItPnJlZGlyZWN0LmxlbiwKICAgICAgICAgICAgICAgIGgtPnZhbHVlLmxlbiAtIHByLT5yZWRpcmVjdC5sZW4gLSBwcmVmaXgpOwpAQCAtMTIzNSw5ICsxMjMyLDcgQEAKIAogICAgIHAgPSBkYXRhOwogCi0gICAgaWYgKHByZWZpeCkgewotICAgICAgICBwID0gbmd4X2NweW1lbShwLCBoLT52YWx1ZS5kYXRhLCBwcmVmaXgpOwotICAgIH0KKyAgICBwID0gbmd4X2NvcHkocCwgaC0+dmFsdWUuZGF0YSwgcHJlZml4KTsKIAogICAgIGUuaXAgPSBwci0+cmVwbGFjZW1lbnQudmFycy52YWx1ZXM7CiAgICAgZS5wb3MgPSBwOwpAQCAtMTUzMCw3ICsxNTI1LDcgQEAKIAogICAgICAgICAgICAgcHItPmhhbmRsZXIgPSBuZ3hfaHR0cF9wcm94eV9yZXdyaXRlX3JlZGlyZWN0X3RleHQ7CiAgICAgICAgICAgICBwci0+cmVkaXJlY3QgPSBjb25mLT51cHN0cmVhbS51cmw7Ci0gICAgICAgICAgICBwci0+cmVwbGFjZW1lbnQudGV4dCA9ICpjb25mLT51cHN0cmVhbS5sb2NhdGlvbjsKKyAgICAgICAgICAgIHByLT5yZXBsYWNlbWVudC50ZXh0ID0gY29uZi0+dXBzdHJlYW0ubG9jYXRpb247CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE1NDAsMTAgKzE1MzUsMTEgQEAKICAgICB9CiAKICAgICBpZiAoY29uZi0+aGVhZGVyc19zb3VyY2UgPT0gTlVMTCkgewotICAgICAgICBjb25mLT5oZWFkZXJzX3NvdXJjZSA9IHByZXYtPmhlYWRlcnNfc291cmNlOworICAgICAgICBjb25mLT5mbHVzaGVzID0gcHJldi0+Zmx1c2hlczsKICAgICAgICAgY29uZi0+aGVhZGVyc19zZXRfbGVuID0gcHJldi0+aGVhZGVyc19zZXRfbGVuOwogICAgICAgICBjb25mLT5oZWFkZXJzX3NldCA9IHByZXYtPmhlYWRlcnNfc2V0OwogICAgICAgICBjb25mLT5oZWFkZXJzX3NldF9oYXNoID0gcHJldi0+aGVhZGVyc19zZXRfaGFzaDsKKyAgICAgICAgY29uZi0+aGVhZGVyc19zb3VyY2UgPSBwcmV2LT5oZWFkZXJzX3NvdXJjZTsKICAgICB9CiAKICAgICBpZiAoY29uZi0+aGVhZGVyc19zZXRfaGFzaCkgewpAQCAtMTY4MCw2ICsxNjc2LDcgQEAKIAogICAgICAgICAgICAgc2MuY2YgPSBjZjsKICAgICAgICAgICAgIHNjLnNvdXJjZSA9ICZzcmNbaV0udmFsdWU7CisgICAgICAgICAgICBzYy5mbHVzaGVzID0gJmNvbmYtPmZsdXNoZXM7CiAgICAgICAgICAgICBzYy5sZW5ndGhzID0gJmNvbmYtPmhlYWRlcnNfc2V0X2xlbjsKICAgICAgICAgICAgIHNjLnZhbHVlcyA9ICZjb25mLT5oZWFkZXJzX3NldDsKIApAQCAtMTg0MywxNSArMTg0MCwxOSBAQAogCiAgICAgY2xjZi0+aGFuZGxlciA9IG5neF9odHRwX3Byb3h5X2hhbmRsZXI7CiAKLSAgICBwbGNmLT51cHN0cmVhbS5sb2NhdGlvbiA9ICZjbGNmLT5uYW1lOworICAgIHBsY2YtPnVwc3RyZWFtLmxvY2F0aW9uID0gY2xjZi0+bmFtZTsKIAogI2lmIChOR1hfUENSRSkKIAotICAgIGlmIChjbGNmLT5yZWdleCAmJiBwbGNmLT51cHN0cmVhbS51cmkubGVuKSB7Ci0gICAgICAgIG5neF9jb25mX2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBjZiwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJcInByb3h5X3Bhc3NcIiBtYXkgbm90IGhhdmUgVVJJIHBhcnQgaW4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvY2F0aW9uIGdpdmVuIGJ5IHJlZ3VsYXIgZXhwcmVzc2lvbiIpOwotICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgaWYgKGNsY2YtPnJlZ2V4KSB7CisgICAgICAgIGlmIChwbGNmLT51cHN0cmVhbS51cmkubGVuKSB7CisgICAgICAgICAgICBuZ3hfY29uZl9sb2dfZXJyb3IoTkdYX0xPR19FTUVSRywgY2YsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwicHJveHlfcGFzc1wiIG1heSBub3QgaGF2ZSBVUkkgcGFydCBpbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvY2F0aW9uIGdpdmVuIGJ5IHJlZ3VsYXIgZXhwcmVzc2lvbiIpOworICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgcGxjZi0+dXBzdHJlYW0ubG9jYXRpb24ubGVuID0gMDsKICAgICB9CiAKICNlbmRpZgpAQCAtMTkxMSw3ICsxOTEyLDcgQEAKIAogICAgICAgICBwci0+aGFuZGxlciA9IG5neF9odHRwX3Byb3h5X3Jld3JpdGVfcmVkaXJlY3RfdGV4dDsKICAgICAgICAgcHItPnJlZGlyZWN0ID0gcGxjZi0+dXBzdHJlYW0udXJsOwotICAgICAgICBwci0+cmVwbGFjZW1lbnQudGV4dCA9ICpwbGNmLT51cHN0cmVhbS5sb2NhdGlvbjsKKyAgICAgICAgcHItPnJlcGxhY2VtZW50LnRleHQgPSBwbGNmLT51cHN0cmVhbS5sb2NhdGlvbjsKIAogICAgICAgICByZXR1cm4gTkdYX0NPTkZfT0s7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9yZWFsaXBfbW9kdWxlLmMgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3JlYWxpcF9tb2R1bGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzMyNDIzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9yZWFsaXBfbW9kdWxlLmMKQEAgLTAsMCArMSwyNzUgQEAKKworLyoKKyAqIENvcHlyaWdodCAoQykgSWdvciBTeXNvZXYKKyAqLworCisKKyNpbmNsdWRlIDxuZ3hfY29uZmlnLmg+CisjaW5jbHVkZSA8bmd4X2NvcmUuaD4KKyNpbmNsdWRlIDxuZ3hfaHR0cC5oPgorCisKKy8qIEFGX0lORVQgb25seSAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW5fYWRkcl90ICAgICBtYXNrOworICAgIGluX2FkZHJfdCAgICAgYWRkcjsKK30gbmd4X2h0dHBfcmVhbGlwX2Zyb21fdDsKKworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgbmd4X2FycmF5X3QgICpmcm9tOyAgICAgLyogYXJyYXkgb2Ygbmd4X2h0dHBfcmVhbGlwX2Zyb21fdCAqLworCisgICAgbmd4X3VpbnRfdCAgICB4ZndkOworfSBuZ3hfaHR0cF9yZWFsaXBfbG9jX2NvbmZfdDsKKworCitzdGF0aWMgbmd4X2ludF90IG5neF9odHRwX3JlYWxpcF9oYW5kbGVyKG5neF9odHRwX3JlcXVlc3RfdCAqcik7CitzdGF0aWMgY2hhciAqbmd4X2h0dHBfcmVhbGlwX2Zyb20obmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwKKyAgICB2b2lkICpjb25mKTsKK3N0YXRpYyB2b2lkICpuZ3hfaHR0cF9yZWFsaXBfY3JlYXRlX2xvY19jb25mKG5neF9jb25mX3QgKmNmKTsKK3N0YXRpYyBjaGFyICpuZ3hfaHR0cF9yZWFsaXBfbWVyZ2VfbG9jX2NvbmYobmd4X2NvbmZfdCAqY2YsCisgICAgdm9pZCAqcGFyZW50LCB2b2lkICpjaGlsZCk7CitzdGF0aWMgbmd4X2ludF90IG5neF9odHRwX3JlYWxpcF9pbml0KG5neF9jeWNsZV90ICpjeWNsZSk7CisKKworc3RhdGljIG5neF9jb25mX2VudW1fdCAgbmd4X2h0dHBfcmVhbGlwX2hlYWRlcltdID0geworICAgIHsgbmd4X3N0cmluZygiWC1Gb3J3YXJkZWQtRm9yIiksIDEgfSwKKyAgICB7IG5neF9zdHJpbmcoIlgtUmVhbC1JUCIpLCAwIH0sCisgICAgeyBuZ3hfbnVsbF9zdHJpbmcsIDAgfQorfTsKKworCitzdGF0aWMgbmd4X2NvbW1hbmRfdCAgbmd4X2h0dHBfcmVhbGlwX2NvbW1hbmRzW10gPSB7CisKKyAgICB7IG5neF9zdHJpbmcoInNldF9yZWFsX2lwX2Zyb20iKSwKKyAgICAgIE5HWF9IVFRQX01BSU5fQ09ORnxOR1hfSFRUUF9TUlZfQ09ORnxOR1hfSFRUUF9MT0NfQ09ORnxOR1hfQ09ORl9UQUtFMSwKKyAgICAgIG5neF9odHRwX3JlYWxpcF9mcm9tLAorICAgICAgTkdYX0hUVFBfTE9DX0NPTkZfT0ZGU0VULAorICAgICAgMCwKKyAgICAgIE5VTEwgfSwKKworICAgIHsgbmd4X3N0cmluZygicmVhbF9pcF9oZWFkZXIiKSwKKyAgICAgIE5HWF9IVFRQX01BSU5fQ09ORnxOR1hfSFRUUF9TUlZfQ09ORnxOR1hfSFRUUF9MT0NfQ09ORnxOR1hfQ09ORl9UQUtFMSwKKyAgICAgIG5neF9jb25mX3NldF9lbnVtX3Nsb3QsCisgICAgICBOR1hfSFRUUF9MT0NfQ09ORl9PRkZTRVQsCisgICAgICBvZmZzZXRvZihuZ3hfaHR0cF9yZWFsaXBfbG9jX2NvbmZfdCwgeGZ3ZCksCisgICAgICAmbmd4X2h0dHBfcmVhbGlwX2hlYWRlciB9LAorCisgICAgICBuZ3hfbnVsbF9jb21tYW5kCit9OworCisKKworbmd4X2h0dHBfbW9kdWxlX3QgIG5neF9odHRwX3JlYWxpcF9tb2R1bGVfY3R4ID0geworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByZWNvbmZpZ3VyYXRpb24gKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwb3N0Y29uZmlndXJhdGlvbiAqLworCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3JlYXRlIG1haW4gY29uZmlndXJhdGlvbiAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXQgbWFpbiBjb25maWd1cmF0aW9uICovCisKKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjcmVhdGUgc2VydmVyIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtZXJnZSBzZXJ2ZXIgY29uZmlndXJhdGlvbiAqLworCisgICAgbmd4X2h0dHBfcmVhbGlwX2NyZWF0ZV9sb2NfY29uZiwgICAgICAgLyogY3JlYXRlIGxvY2F0aW9uIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBuZ3hfaHR0cF9yZWFsaXBfbWVyZ2VfbG9jX2NvbmYgICAgICAgICAvKiBtZXJnZSBsb2NhdGlvbiBjb25maWd1cmF0aW9uICovCit9OworCisKK25neF9tb2R1bGVfdCAgbmd4X2h0dHBfcmVhbGlwX21vZHVsZSA9IHsKKyAgICBOR1hfTU9EVUxFX1YxLAorICAgICZuZ3hfaHR0cF9yZWFsaXBfbW9kdWxlX2N0eCwgICAgICAgICAgIC8qIG1vZHVsZSBjb250ZXh0ICovCisgICAgbmd4X2h0dHBfcmVhbGlwX2NvbW1hbmRzLCAgICAgICAgICAgICAgLyogbW9kdWxlIGRpcmVjdGl2ZXMgKi8KKyAgICBOR1hfSFRUUF9NT0RVTEUsICAgICAgICAgICAgICAgICAgICAgICAvKiBtb2R1bGUgdHlwZSAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXQgbWFzdGVyICovCisgICAgbmd4X2h0dHBfcmVhbGlwX2luaXQsICAgICAgICAgICAgICAgICAgLyogaW5pdCBtb2R1bGUgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0IHByb2Nlc3MgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0IHRocmVhZCAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGV4aXQgdGhyZWFkICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZXhpdCBwcm9jZXNzICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZXhpdCBtYXN0ZXIgKi8KKyAgICBOR1hfTU9EVUxFX1YxX1BBRERJTkcKK307CisKKworc3RhdGljIG5neF9pbnRfdAorbmd4X2h0dHBfcmVhbGlwX2hhbmRsZXIobmd4X2h0dHBfcmVxdWVzdF90ICpyKQoreworICAgIHVfY2hhciAgICAgICAgICAgICAgICAgICAgICAqaXAsICpwOworICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgbGVuOworICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICAgaTsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gICAgICAgICAgKnNpbjsKKyAgICBuZ3hfaHR0cF9yZWFsaXBfZnJvbV90ICAgICAgKmZyb207CisgICAgbmd4X2h0dHBfcmVhbGlwX2xvY19jb25mX3QgICpybGNmOworCisgICAgaWYgKHItPnJlYWxpcF9zZXQpIHsKKyAgICAgICAgcmV0dXJuIE5HWF9PSzsKKyAgICB9CisKKyAgICBybGNmID0gbmd4X2h0dHBfZ2V0X21vZHVsZV9sb2NfY29uZihyLCBuZ3hfaHR0cF9yZWFsaXBfbW9kdWxlKTsKKworICAgIGlmIChybGNmLT5mcm9tID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5HWF9PSzsKKyAgICB9CisKKyAgICBpZiAocmxjZi0+eGZ3ZCA9PSAwKSB7CisgICAgICAgIGlmIChyLT5oZWFkZXJzX2luLnhfcmVhbF9pcCA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTkdYX09LOworICAgICAgICB9CisKKyAgICAgICAgbGVuID0gci0+aGVhZGVyc19pbi54X3JlYWxfaXAtPnZhbHVlLmxlbjsKKyAgICAgICAgaXAgPSByLT5oZWFkZXJzX2luLnhfcmVhbF9pcC0+dmFsdWUuZGF0YTsKKworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChyLT5oZWFkZXJzX2luLnhfZm9yd2FyZGVkX2ZvciA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTkdYX09LOworICAgICAgICB9CisKKyAgICAgICAgbGVuID0gci0+aGVhZGVyc19pbi54X2ZvcndhcmRlZF9mb3ItPnZhbHVlLmxlbjsKKyAgICAgICAgaXAgPSByLT5oZWFkZXJzX2luLnhfZm9yd2FyZGVkX2Zvci0+dmFsdWUuZGF0YTsKKworICAgICAgICBmb3IgKHAgPSBpcCArIGxlbjsgcCA+IGlwOyBwLS0pIHsKKyAgICAgICAgICAgIGlmICgqcCA9PSAnICcgfHwgKnAgPT0gJywnKSB7CisgICAgICAgICAgICAgICBwKys7CisgICAgICAgICAgICAgICBsZW4gLT0gcCAtIGlwOworICAgICAgICAgICAgICAgaXAgPSBwOworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBBRl9JTkVUIG9ubHkgKi8KKworICAgIHNpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgci0+Y29ubmVjdGlvbi0+c29ja2FkZHI7CisKKyAgICBmcm9tID0gcmxjZi0+ZnJvbS0+ZWx0czsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcmxjZi0+ZnJvbS0+bmVsdHM7IGkrKykgeworCisgICAgICAgIG5neF9sb2dfZGVidWczKE5HWF9MT0dfREVCVUdfSFRUUCwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAicmVhbGlwOiAlMDhYRCAlMDhYRCAlMDhYRCIsCisgICAgICAgICAgICAgICAgICAgICAgIHNpbi0+c2luX2FkZHIuc19hZGRyLCBmcm9tW2ldLm1hc2ssIGZyb21baV0uYWRkcik7CisKKyAgICAgICAgaWYgKChzaW4tPnNpbl9hZGRyLnNfYWRkciAmIGZyb21baV0ubWFzaykgPT0gZnJvbVtpXS5hZGRyKSB7CisKKyAgICAgICAgICAgIHItPmNvbm5lY3Rpb24tPmFkZHJfdGV4dC5sZW4gPSBsZW47CisgICAgICAgICAgICByLT5jb25uZWN0aW9uLT5hZGRyX3RleHQuZGF0YSA9IGlwOworCisgICAgICAgICAgICBzaW4tPnNpbl9hZGRyLnNfYWRkciA9IGluZXRfYWRkcigoY2hhciAqKSBpcCk7CisKKyAgICAgICAgICAgIHItPnJlYWxpcF9zZXQgPSAxOworCisgICAgICAgICAgICByZXR1cm4gTkdYX09LOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE5HWF9PSzsKK30KKworCitzdGF0aWMgY2hhciAqCituZ3hfaHR0cF9yZWFsaXBfZnJvbShuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqY21kLCB2b2lkICpjb25mKQoreworICAgIG5neF9odHRwX3JlYWxpcF9sb2NfY29uZl90ICpybGNmID0gY29uZjsKKworICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAqdmFsdWU7CisgICAgbmd4X2luZXRfY2lkcl90ICAgICAgICAgICBpbl9jaWRyOworICAgIG5neF9odHRwX3JlYWxpcF9mcm9tX3QgICAqZnJvbTsKKworICAgIGlmIChybGNmLT5mcm9tID09IE5VTEwpIHsKKyAgICAgICAgcmxjZi0+ZnJvbSA9IG5neF9hcnJheV9jcmVhdGUoY2YtPnBvb2wsIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfaHR0cF9yZWFsaXBfZnJvbV90KSk7CisgICAgICAgIGlmIChybGNmLT5mcm9tID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZyb20gPSBuZ3hfYXJyYXlfcHVzaChybGNmLT5mcm9tKTsKKyAgICBpZiAoZnJvbSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICB9CisKKyAgICB2YWx1ZSA9IGNmLT5hcmdzLT5lbHRzOworCisgICAgZnJvbS0+YWRkciA9IGluZXRfYWRkcigoY2hhciAqKSB2YWx1ZVsxXS5kYXRhKTsKKworICAgIGlmIChmcm9tLT5hZGRyICE9IElOQUREUl9OT05FKSB7CisgICAgICAgIGZyb20tPm1hc2sgPSAweGZmZmZmZmZmOworCisgICAgICAgIHJldHVybiBOR1hfQ09ORl9PSzsKKyAgICB9CisKKyAgICBpZiAobmd4X3B0b2NpZHIoJnZhbHVlWzFdLCAmaW5fY2lkcikgPT0gTkdYX0VSUk9SKSB7CisgICAgICAgIG5neF9jb25mX2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBjZiwgMCwgImludmFsaWQgcGFyYW1ldGVyIFwiJVZcIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVbMV0pOworICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgfQorCisgICAgZnJvbS0+bWFzayA9IGluX2NpZHIubWFzazsKKyAgICBmcm9tLT5hZGRyID0gaW5fY2lkci5hZGRyOworCisgICAgcmV0dXJuIE5HWF9DT05GX09LOworfQorCisKK3N0YXRpYyB2b2lkICoKK25neF9odHRwX3JlYWxpcF9jcmVhdGVfbG9jX2NvbmYobmd4X2NvbmZfdCAqY2YpCit7CisgICAgbmd4X2h0dHBfcmVhbGlwX2xvY19jb25mX3QgICpjb25mOworCisgICAgY29uZiA9IG5neF9wY2FsbG9jKGNmLT5wb29sLCBzaXplb2Yobmd4X2h0dHBfcmVhbGlwX2xvY19jb25mX3QpKTsKKyAgICBpZiAoY29uZiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICB9CisKKyAgICAvKgorICAgICAqIHNldCBieSBuZ3hfcGNhbGxvYygpOgorICAgICAqCisgICAgICogICAgIGNvbmYtPmZyb20gPSBOVUxMOworICAgICAqLworCisgICAgY29uZi0+eGZ3ZCA9IE5HWF9DT05GX1VOU0VUX1VJTlQ7CisKKyAgICByZXR1cm4gY29uZjsKK30KKworCitzdGF0aWMgY2hhciAqCituZ3hfaHR0cF9yZWFsaXBfbWVyZ2VfbG9jX2NvbmYobmd4X2NvbmZfdCAqY2YsIHZvaWQgKnBhcmVudCwgdm9pZCAqY2hpbGQpCit7CisgICAgbmd4X2h0dHBfcmVhbGlwX2xvY19jb25mX3QgICpwcmV2ID0gcGFyZW50OworICAgIG5neF9odHRwX3JlYWxpcF9sb2NfY29uZl90ICAqY29uZiA9IGNoaWxkOworCisgICAgaWYgKGNvbmYtPmZyb20gPT0gTlVMTCkgeworICAgICAgICBjb25mLT5mcm9tID0gcHJldi0+ZnJvbTsKKyAgICB9CisKKyAgICBuZ3hfY29uZl9tZXJnZV91bnNpZ25lZF92YWx1ZShjb25mLT54ZndkLCBwcmV2LT54ZndkLCAwKTsKKworICAgIHJldHVybiBOR1hfQ09ORl9PSzsKK30KKworCitzdGF0aWMgbmd4X2ludF90CituZ3hfaHR0cF9yZWFsaXBfaW5pdChuZ3hfY3ljbGVfdCAqY3ljbGUpCit7CisgICAgbmd4X2h0dHBfaGFuZGxlcl9wdCAgICAgICAgKmg7CisgICAgbmd4X2h0dHBfY29yZV9tYWluX2NvbmZfdCAgKmNtY2Y7CisKKyAgICBjbWNmID0gbmd4X2h0dHBfY3ljbGVfZ2V0X21vZHVsZV9tYWluX2NvbmYoY3ljbGUsIG5neF9odHRwX2NvcmVfbW9kdWxlKTsKKworICAgIGggPSBuZ3hfYXJyYXlfcHVzaCgmY21jZi0+cGhhc2VzW05HWF9IVFRQX1BPU1RfUkVBRF9QSEFTRV0uaGFuZGxlcnMpOworICAgIGlmIChoID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICB9CisKKyAgICAqaCA9IG5neF9odHRwX3JlYWxpcF9oYW5kbGVyOworCisgICAgaCA9IG5neF9hcnJheV9wdXNoKCZjbWNmLT5waGFzZXNbTkdYX0hUVFBfQUNDRVNTX1BIQVNFXS5oYW5kbGVycyk7CisgICAgaWYgKGggPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgIH0KKworICAgICpoID0gbmd4X2h0dHBfcmVhbGlwX2hhbmRsZXI7CisKKyAgICByZXR1cm4gTkdYX09LOworfQpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9yZXdyaXRlX21vZHVsZS5jIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9yZXdyaXRlX21vZHVsZS5jCmluZGV4IGM1NzVkNDMuLjZlNjRmNmEgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfcmV3cml0ZV9tb2R1bGUuYworKysgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3Jld3JpdGVfbW9kdWxlLmMKQEAgLTE0Miw3ICsxNDIsNyBAQAogCiAKIHN0YXRpYyBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICBuZ3hfaHR0cF9yZXdyaXRlX251bGxfdmFsdWUgPQotICAgIHsgMCwgbmd4X3N0cmluZygiIikgfTsKKyAgICBuZ3hfaHR0cF92YXJpYWJsZSgiIik7CiAKIAogc3RhdGljIG5neF9pbnRfdApAQCAtMjE0LDkgKzIxNCw4IEBACiAgICAgZS0+aXAgKz0gc2l6ZW9mKHVpbnRwdHJfdCk7CiAKICAgICBpZiAoY2YtPnJlZmVyZXJzID09IE5VTEwpIHsKLSAgICAgICAgZS0+c3AtPnZhbHVlID0gMDsKLSAgICAgICAgZS0+c3AtPnRleHQubGVuID0gMDsKLSAgICAgICAgZS0+c3AtPnRleHQuZGF0YSA9ICh1X2NoYXIgKikgIiI7CisgICAgICAgIGUtPnNwLT5kYXRhID0gKHVfY2hhciAqKSAiIjsKKyAgICAgICAgZS0+c3AtPmxlbiA9IDA7CiAgICAgICAgIGUtPnNwKys7CiAKICAgICAgICAgcmV0dXJuOwpAQCAtMjI0LDE3ICsyMjMsMTUgQEAKIAogICAgIGlmIChyLT5oZWFkZXJzX2luLnJlZmVyZXIgPT0gTlVMTCkgewogICAgICAgICBpZiAoY2YtPm5vX3JlZmVyZXIpIHsKLSAgICAgICAgICAgIGUtPnNwLT52YWx1ZSA9IDA7Ci0gICAgICAgICAgICBlLT5zcC0+dGV4dC5sZW4gPSAwOwotICAgICAgICAgICAgZS0+c3AtPnRleHQuZGF0YSA9ICh1X2NoYXIgKikgIiI7CisgICAgICAgICAgICBlLT5zcC0+ZGF0YSA9ICh1X2NoYXIgKikgIiI7CisgICAgICAgICAgICBlLT5zcC0+bGVuID0gMDsKICAgICAgICAgICAgIGUtPnNwKys7CiAKICAgICAgICAgICAgIHJldHVybjsKIAogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZS0+c3AtPnZhbHVlID0gMTsKLSAgICAgICAgICAgIGUtPnNwLT50ZXh0LmxlbiA9IDE7Ci0gICAgICAgICAgICBlLT5zcC0+dGV4dC5kYXRhID0gKHVfY2hhciAqKSAiMSI7CisgICAgICAgICAgICBlLT5zcC0+ZGF0YSA9ICh1X2NoYXIgKikgIjEiOworICAgICAgICAgICAgZS0+c3AtPmxlbiA9IDE7CiAgICAgICAgICAgICBlLT5zcCsrOwogCiAgICAgICAgICAgICByZXR1cm47CkBAIC0yNDgsMTcgKzI0NSwxNSBAQAogICAgICAgICB8fCAobmd4X3N0cm5jYXNlY21wKHJlZiwgImh0dHA6Ly8iLCA3KSAhPSAwKSkKICAgICB7CiAgICAgICAgIGlmIChjZi0+YmxvY2tlZF9yZWZlcmVyKSB7Ci0gICAgICAgICAgICBlLT5zcC0+dmFsdWUgPSAwOwotICAgICAgICAgICAgZS0+c3AtPnRleHQubGVuID0gMDsKLSAgICAgICAgICAgIGUtPnNwLT50ZXh0LmRhdGEgPSAodV9jaGFyICopICIwIjsKKyAgICAgICAgICAgIGUtPnNwLT5kYXRhID0gKHVfY2hhciAqKSAiIjsKKyAgICAgICAgICAgIGUtPnNwLT5sZW4gPSAwOwogICAgICAgICAgICAgZS0+c3ArKzsKIAogICAgICAgICAgICAgcmV0dXJuOwogCiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBlLT5zcC0+dmFsdWUgPSAxOwotICAgICAgICAgICAgZS0+c3AtPnRleHQubGVuID0gMTsKLSAgICAgICAgICAgIGUtPnNwLT50ZXh0LmRhdGEgPSAodV9jaGFyICopICIxIjsKKyAgICAgICAgICAgIGUtPnNwLT5kYXRhID0gKHVfY2hhciAqKSAiMSI7CisgICAgICAgICAgICBlLT5zcC0+bGVuID0gMTsKICAgICAgICAgICAgIGUtPnNwKys7CiAKICAgICAgICAgICAgIHJldHVybjsKQEAgLTI4OCw5ICsyODMsOCBAQAogICAgICAgICAgICAgICAgIGlmIChuZ3hfc3RybmNtcCgmcmVmW25dLCByZWZzW2ldLm5hbWUuZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmc1tpXS5uYW1lLmxlbikgPT0gMCkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGUtPnNwLT52YWx1ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGUtPnNwLT50ZXh0LmxlbiA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGUtPnNwLT50ZXh0LmRhdGEgPSAodV9jaGFyICopICIiOworICAgICAgICAgICAgICAgICAgICBlLT5zcC0+ZGF0YSA9ICh1X2NoYXIgKikgIiI7CisgICAgICAgICAgICAgICAgICAgIGUtPnNwLT5sZW4gPSAwOwogICAgICAgICAgICAgICAgICAgICBlLT5zcCsrOwogCiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKQEAgLTMwMCw5ICsyOTQsOCBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaWYgKG5neF9zdHJuY2FzZWNtcChyZWZzW2ldLm5hbWUuZGF0YSwgcmVmLCByZWZzW2ldLm5hbWUubGVuKSA9PSAwKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGUtPnNwLT52YWx1ZSA9IDA7Ci0gICAgICAgICAgICAgICAgZS0+c3AtPnRleHQubGVuID0gMDsKLSAgICAgICAgICAgICAgICBlLT5zcC0+dGV4dC5kYXRhID0gKHVfY2hhciAqKSAiIjsKKyAgICAgICAgICAgICAgICBlLT5zcC0+ZGF0YSA9ICh1X2NoYXIgKikgIiI7CisgICAgICAgICAgICAgICAgZS0+c3AtPmxlbiA9IDA7CiAgICAgICAgICAgICAgICAgZS0+c3ArKzsKIAogICAgICAgICAgICAgICAgIHJldHVybjsKQEAgLTMxMCwxNSArMzAzLDE1IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBlLT5zcC0+dmFsdWUgPSAxOwotICAgIGUtPnNwLT50ZXh0LmxlbiA9IDE7Ci0gICAgZS0+c3AtPnRleHQuZGF0YSA9ICh1X2NoYXIgKikgIjEiOworICAgIGUtPnNwLT5kYXRhID0gKHVfY2hhciAqKSAiMSI7CisgICAgZS0+c3AtPmxlbiA9IDE7CiAgICAgZS0+c3ArKzsKIH0KIAogCi1zdGF0aWMgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAqCi1uZ3hfaHR0cF9yZXdyaXRlX3ZhcihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVpbnRwdHJfdCBkYXRhKQorc3RhdGljIG5neF9pbnRfdAorbmd4X2h0dHBfcmV3cml0ZV92YXIobmd4X2h0dHBfcmVxdWVzdF90ICpyLCBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICp2LAorICAgIHVpbnRwdHJfdCBkYXRhKQogewogICAgIG5neF9odHRwX3ZhcmlhYmxlX3QgICAgICAgICp2YXI7CiAgICAgbmd4X2h0dHBfY29yZV9tYWluX2NvbmZfdCAgKmNtY2Y7CkBAIC0zMzYsNyArMzI5LDkgQEAKICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfQUxFUlQsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKICAgICAgICAgICAgICAgICAgICJ1c2luZyB1bmluaXRpYWxpemVkIFwiJVZcIiB2YXJpYWJsZSIsICZ2YXJbZGF0YV0ubmFtZSk7CiAKLSAgICByZXR1cm4gJm5neF9odHRwX3Jld3JpdGVfbnVsbF92YWx1ZTsKKyAgICAqdiA9IG5neF9odHRwX3Jld3JpdGVfbnVsbF92YWx1ZTsKKworICAgIHJldHVybiBOR1hfT0s7CiB9CiAKIApAQCAtNDExLDYgKzQwNiwxMyBAQAogCiAgICAgY21jZiA9IG5neF9odHRwX2N5Y2xlX2dldF9tb2R1bGVfbWFpbl9jb25mKGN5Y2xlLCBuZ3hfaHR0cF9jb3JlX21vZHVsZSk7CiAKKyAgICBoID0gbmd4X2FycmF5X3B1c2goJmNtY2YtPnBoYXNlc1tOR1hfSFRUUF9TRVJWRVJfUkVXUklURV9QSEFTRV0uaGFuZGxlcnMpOworICAgIGlmIChoID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICB9CisKKyAgICAqaCA9IG5neF9odHRwX3Jld3JpdGVfaGFuZGxlcjsKKwogICAgIGggPSBuZ3hfYXJyYXlfcHVzaCgmY21jZi0+cGhhc2VzW05HWF9IVFRQX1JFV1JJVEVfUEhBU0VdLmhhbmRsZXJzKTsKICAgICBpZiAoaCA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CmRpZmYgLS1naXQgYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3NzaV9maWx0ZXJfbW9kdWxlLmMgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3NzaV9maWx0ZXJfbW9kdWxlLmMKaW5kZXggODBkZTY5MS4uODY3MDBlYyAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9zc2lfZmlsdGVyX21vZHVsZS5jCisrKyBiL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfc3NpX2ZpbHRlcl9tb2R1bGUuYwpAQCAtMTQ0LDggKzE0NCw4IEBACiBzdGF0aWMgbmd4X2ludF90IG5neF9odHRwX3NzaV9lbmRpZihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCiAgICAgbmd4X2h0dHBfc3NpX2N0eF90ICpjdHgsIG5neF9zdHJfdCAqKnBhcmFtcyk7CiAKLXN0YXRpYyBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICoKLSAgICBuZ3hfaHR0cF9zc2lfZGF0ZV9nbXRfbG9jYWxfdmFyaWFibGUobmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1aW50cHRyX3QgZ210KTsKK3N0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfc3NpX2RhdGVfZ210X2xvY2FsX3ZhcmlhYmxlKG5neF9odHRwX3JlcXVlc3RfdCAqciwKKyAgICBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICp2LCAgdWludHB0cl90IGdtdCk7CiAKIHN0YXRpYyBjaGFyICpuZ3hfaHR0cF9zc2lfdHlwZXMobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwgdm9pZCAqY29uZik7CiAKQEAgLTU2Miw2ICs1NjIsOCBAQAogICAgICAgICAgICAgfQogCiAKKyAgICAgICAgICAgIGIgPSBOVUxMOworCiAgICAgICAgICAgICBpZiAocmMgPT0gTkdYX09LKSB7CiAKICAgICAgICAgICAgICAgICBmb3IgKGNtZCA9IG5neF9odHRwX3NzaV9jb21tYW5kczsgY21kLT5oYW5kbGVyOyBjbWQrKykgewpAQCAtMTIwMCwxMCArMTIwMiwxMiBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoY2ggPT0gJyInICYmIHN0YXRlID09IHNzaV9kb3VibGVfcXVvdGVkX3ZhbHVlX3N0YXRlKSB7CisgICAgICAgICAgICAgICAgY3R4LT5wYXJhbS0+dmFsdWUuZGF0YVtjdHgtPnBhcmFtLT52YWx1ZS5sZW4gLSAxXSA9IGNoOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoY2ggPT0gJ1wnJyAmJiBzdGF0ZSA9PSBzc2lfcXVvdGVkX3ZhbHVlX3N0YXRlKSB7CisgICAgICAgICAgICAgICAgY3R4LT5wYXJhbS0+dmFsdWUuZGF0YVtjdHgtPnBhcmFtLT52YWx1ZS5sZW4gLSAxXSA9IGNoOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCkBAIC0xMzc4LDkgKzEzODIsOSBAQAogbmd4X2h0dHBfc3NpX2V2YWx1YXRlX3N0cmluZyhuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIG5neF9odHRwX3NzaV9jdHhfdCAqY3R4LAogICAgIG5neF9zdHJfdCAqdGV4dCwgbmd4X3VpbnRfdCBmbGFncykKIHsKLSAgICB1X2NoYXIgICAgICAgICAgICAgICAgICAgICAgY2gsICpwLCAqKnZhbHVlLCAqZGF0YTsKLSAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAqc2l6ZSwgbGVuLCBwcmVmaXg7Ci0gICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgIHZhciwgcGFydCwgKnZhbDsKKyAgICB1X2NoYXIgICAgICAgICAgICAgICAgICAgICAgY2gsICpwLCAqKnZhbHVlLCAqZGF0YSwgKnBhcnRfZGF0YTsKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAqc2l6ZSwgbGVuLCBwcmVmaXgsIHBhcnRfbGVuOworICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICB2YXIsICp2YWw7CiAgICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgIGksIGosIG4sIGJyYWNrZXQ7CiAgICAgbmd4X2FycmF5X3QgICAgICAgICAgICAgICAgIGxlbmd0aHMsIHZhbHVlczsKICAgICBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICAqdnY7CkBAIC0xNDA4LDcgKzE0MTIsNyBAQAogICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIHAgPSBuZ3hfY3B5bWVtKGRhdGEsIHItPnVyaS5kYXRhLCBwcmVmaXgpOworICAgICAgICAgICAgICAgIHAgPSBuZ3hfY29weShkYXRhLCByLT51cmkuZGF0YSwgcHJlZml4KTsKICAgICAgICAgICAgICAgICBuZ3hfbWVtY3B5KHAsIHRleHQtPmRhdGEsIHRleHQtPmxlbik7CiAKICAgICAgICAgICAgICAgICB0ZXh0LT5sZW4gPSBsZW47CkBAIC0xNDk4LDIwICsxNTAyLDIyIEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKHZ2ID09IE5HWF9IVFRQX1ZBUl9OT1RfRk9VTkQpIHsKKyAgICAgICAgICAgICAgICBpZiAodnYtPm5vdF9mb3VuZCkgewogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBwYXJ0ID0gdnYtPnRleHQ7CisgICAgICAgICAgICAgICAgcGFydF9kYXRhID0gdnYtPmRhdGE7CisgICAgICAgICAgICAgICAgcGFydF9sZW4gPSB2di0+bGVuOwogCiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHBhcnQgPSAqdmFsOworICAgICAgICAgICAgICAgIHBhcnRfZGF0YSA9IHZhbC0+ZGF0YTsKKyAgICAgICAgICAgICAgICBwYXJ0X2xlbiA9IHZhbC0+bGVuOwogICAgICAgICAgICAgfQogCiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwYXJ0LmRhdGEgPSAmdGV4dC0+ZGF0YVtpXTsKKyAgICAgICAgICAgIHBhcnRfZGF0YSA9ICZ0ZXh0LT5kYXRhW2ldOwogCi0gICAgICAgICAgICBmb3IgKHAgPSBwYXJ0LmRhdGE7IGkgPCB0ZXh0LT5sZW47IGkrKykgeworICAgICAgICAgICAgZm9yIChwID0gcGFydF9kYXRhOyBpIDwgdGV4dC0+bGVuOyBpKyspIHsKICAgICAgICAgICAgICAgICBjaCA9IHRleHQtPmRhdGFbaV07CiAKICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJyQnKSB7CkBAIC0xNTI3LDI0ICsxNTMzLDI0IEBACiAgICAgICAgICAgICAgICAgKnArKyA9IGNoOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBwYXJ0LmxlbiA9IHAgLSBwYXJ0LmRhdGE7CisgICAgICAgICAgICBwYXJ0X2xlbiA9IHAgLSBwYXJ0X2RhdGE7CiAgICAgICAgIH0KIAotICAgICAgICBsZW4gKz0gcGFydC5sZW47CisgICAgICAgIGxlbiArPSBwYXJ0X2xlbjsKIAogICAgICAgICBzaXplID0gbmd4X2FycmF5X3B1c2goJmxlbmd0aHMpOwogICAgICAgICBpZiAoc2l6ZSA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgICAgICB9CiAKLSAgICAgICAgKnNpemUgPSBwYXJ0LmxlbjsKKyAgICAgICAgKnNpemUgPSBwYXJ0X2xlbjsKIAogICAgICAgICB2YWx1ZSA9IG5neF9hcnJheV9wdXNoKCZ2YWx1ZXMpOwogICAgICAgICBpZiAodmFsdWUgPT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICAgICAgfQogCi0gICAgICAgICp2YWx1ZSA9IHBhcnQuZGF0YTsKKyAgICAgICAgKnZhbHVlID0gcGFydF9kYXRhOwogICAgIH0KIAogICAgIHByZWZpeCA9IDA7CkBAIC0xNTc3LDEyICsxNTgzLDEwIEBACiAgICAgdGV4dC0+bGVuID0gbGVuOwogICAgIHRleHQtPmRhdGEgPSBwOwogCi0gICAgaWYgKHByZWZpeCkgewotICAgICAgICBwID0gbmd4X2NweW1lbShwLCByLT51cmkuZGF0YSwgcHJlZml4KTsKLSAgICB9CisgICAgcCA9IG5neF9jb3B5KHAsIHItPnVyaS5kYXRhLCBwcmVmaXgpOwogCiAgICAgZm9yIChpID0gMDsgaSA8IHZhbHVlcy5uZWx0czsgaSsrKSB7Ci0gICAgICAgIHAgPSBuZ3hfY3B5bWVtKHAsIHZhbHVlW2ldLCBzaXplW2ldKTsKKyAgICAgICAgcCA9IG5neF9jb3B5KHAsIHZhbHVlW2ldLCBzaXplW2ldKTsKICAgICB9CiAKICAgICByZXR1cm4gTkdYX09LOwpAQCAtMTYwMSw3ICsxNjA1LDcgQEAKICAgICBuZ3hfc3RyX3QgKipwYXJhbXMpCiB7CiAgICAgbmd4X3N0cl90ICAgKnVyaSwgKmZpbGUsIGFyZ3M7Ci0gICAgbmd4X3VpbnRfdCAgIGk7CisgICAgbmd4X3VpbnRfdCAgIGZsYWdzOwogCiAgICAgdXJpID0gcGFyYW1zW05HWF9IVFRQX1NTSV9JTkNMVURFX1ZJUlRVQUxdOwogICAgIGZpbGUgPSBwYXJhbXNbTkdYX0hUVFBfU1NJX0lOQ0xVREVfRklMRV07CkBAIC0xNjMxLDIwICsxNjM1LDE2IEBACiAKICAgICBhcmdzLmxlbiA9IDA7CiAgICAgYXJncy5kYXRhID0gTlVMTDsKKyAgICBmbGFncyA9IDA7CiAKLSAgICBpZiAocGFyYW1zW05HWF9IVFRQX1NTSV9JTkNMVURFX1ZJUlRVQUxdKSB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCB1cmktPmxlbjsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAodXJpLT5kYXRhW2ldID09ICc/JykgewotICAgICAgICAgICAgICAgIGFyZ3MubGVuID0gdXJpLT5sZW4gLSBpIC0gMTsKLSAgICAgICAgICAgICAgICBhcmdzLmRhdGEgPSAmdXJpLT5kYXRhW2kgKyAxXTsKLSAgICAgICAgICAgICAgICB1cmktPmxlbiAtPSBhcmdzLmxlbiArIDE7CisgICAgbmd4X2xvZ19kZWJ1ZzEoTkdYX0xPR19ERUJVR19IVFRQLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgInNzaSBpbmNsdWRlOiBcIiVWXCIiLCB1cmkpOwogCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICBpZiAobmd4X2h0dHBfcGFyc2VfdW5zYWZlX3VyaShyLCB1cmksICZhcmdzLCAmZmxhZ3MpICE9IE5HWF9PSykgeworICAgICAgICByZXR1cm4gTkdYX0hUVFBfU1NJX0VSUk9SOwogICAgIH0KIAotICAgIGlmIChuZ3hfaHR0cF9zdWJyZXF1ZXN0KHIsIHVyaSwgJmFyZ3MpICE9IE5HWF9PSykgeworICAgIGlmIChuZ3hfaHR0cF9zdWJyZXF1ZXN0KHIsIHVyaSwgJmFyZ3MsIGZsYWdzKSAhPSBOR1hfT0spIHsKICAgICAgICAgcmV0dXJuIE5HWF9IVFRQX1NTSV9FUlJPUjsKICAgICB9CiAKQEAgLTE2NTgsNyArMTY1OCw3IEBACiB7CiAgICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgIGk7CiAgICAgbmd4X2J1Zl90ICAgICAgICAgICAgICAgICAgKmI7Ci0gICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgKnZhciwgKnZhbHVlOworICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICp2YXIsICp2YWx1ZSwgdGV4dDsKICAgICBuZ3hfY2hhaW5fdCAgICAgICAgICAgICAgICAqY2w7CiAgICAgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAgKnZ2OwogCkBAIC0xNjc3LDggKzE2NzcsMTAgQEAKICAgICAgICAgICAgIHJldHVybiBOR1hfSFRUUF9TU0lfRVJST1I7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAodnYgIT0gTkdYX0hUVFBfVkFSX05PVF9GT1VORCkgewotICAgICAgICAgICAgdmFsdWUgPSAmdnYtPnRleHQ7CisgICAgICAgIGlmICghdnYtPm5vdF9mb3VuZCkgeworICAgICAgICAgICAgdGV4dC5kYXRhID0gdnYtPmRhdGE7CisgICAgICAgICAgICB0ZXh0LmxlbiA9IHZ2LT5sZW47CisgICAgICAgICAgICB2YWx1ZSA9ICZ0ZXh0OwogICAgICAgICB9CiAgICAgfQogCkBAIC0xODE3LDcgKzE4MTksOCBAQAogCiAgICAgICAgIGlmICgoKnAgPj0gJ2EnICYmICpwIDw9ICd6JykKICAgICAgICAgICAgICB8fCAoKnAgPj0gJzAnICYmICpwIDw9ICc5JykKLSAgICAgICAgICAgICB8fCAqcCA9PSAnJCcgfHwgKnAgPT0gJ3snIHx8ICpwID09ICd9JyB8fCAqcCA9PSAnXycpCisgICAgICAgICAgICAgfHwgKnAgPT0gJyQnIHx8ICpwID09ICd7JyB8fCAqcCA9PSAnfScgfHwgKnAgPT0gJ18nCisgICAgICAgICAgICAgfHwgKnAgPT0gJyInIHx8ICpwID09ICdcJycpCiAgICAgICAgIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CkBAIC0xOTcxLDE5ICsxOTc0LDE4IEBACiB9CiAKIAotc3RhdGljIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgKgotbmd4X2h0dHBfc3NpX2RhdGVfZ210X2xvY2FsX3ZhcmlhYmxlKG5neF9odHRwX3JlcXVlc3RfdCAqciwgdWludHB0cl90IGdtdCkKK3N0YXRpYyBuZ3hfaW50X3QKK25neF9odHRwX3NzaV9kYXRlX2dtdF9sb2NhbF92YXJpYWJsZShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCisgICAgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAqdiwgIHVpbnRwdHJfdCBnbXQpCiB7Ci0gICAgbmd4X2h0dHBfc3NpX2N0eF90ICAgICAgICAgKmN0eDsKLSAgICBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICAqdnY7Ci0gICAgbmd4X3RpbWVfdCAgICAgICAgICAgICAgICAgKnRwOwotICAgIHN0cnVjdCB0bSAgICAgICAgICAgICAgICAgICB0bTsKLSAgICBjaGFyICAgICAgICAgICAgICAgICAgICAgICAgYnVmW05HWF9IVFRQX1NTSV9EQVRFX0xFTl07CisgICAgbmd4X2h0dHBfc3NpX2N0eF90ICAqY3R4OworICAgIG5neF90aW1lX3QgICAgICAgICAgKnRwOworICAgIHN0cnVjdCB0bSAgICAgICAgICAgIHRtOworICAgIGNoYXIgICAgICAgICAgICAgICAgIGJ1ZltOR1hfSFRUUF9TU0lfREFURV9MRU5dOwogCi0gICAgdnYgPSBuZ3hfcGFsbG9jKHItPnBvb2wsIHNpemVvZihuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90KSk7Ci0gICAgaWYgKHZ2ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQorICAgIHYtPnZhbGlkID0gMTsgCisgICAgdi0+bm9fY2FjaGFibGUgPSAwOworICAgIHYtPm5vdF9mb3VuZCA9IDA7CiAKICAgICB0cCA9IG5neF90aW1lb2ZkYXkoKTsKIApAQCAtMTk5MiwxNiArMTk5NCwxNCBAQAogICAgIGlmIChjdHgtPnRpbWVmbXQubGVuID09IHNpemVvZigiJXMiKSAtIDEKICAgICAgICAgJiYgY3R4LT50aW1lZm10LmRhdGFbMF0gPT0gJyUnICYmIGN0eC0+dGltZWZtdC5kYXRhWzFdID09ICdzJykKICAgICB7Ci0gICAgICAgIHZ2LT52YWx1ZSA9IHRwLT5zZWMgKyAoZ210ID8gMCA6IHRwLT5nbXRvZmYpOwotCi0gICAgICAgIHZ2LT50ZXh0LmRhdGEgPSBuZ3hfcGFsbG9jKHItPnBvb2wsIE5HWF9USU1FX1RfTEVOKTsKLSAgICAgICAgaWYgKHZ2LT50ZXh0LmRhdGEgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHYtPmRhdGEgPSBuZ3hfcGFsbG9jKHItPnBvb2wsIE5HWF9USU1FX1RfTEVOKTsKKyAgICAgICAgaWYgKHYtPmRhdGEgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICAgICAgfQogCi0gICAgICAgIHZ2LT50ZXh0LmxlbiA9IG5neF9zcHJpbnRmKHZ2LT50ZXh0LmRhdGEsICIlVCIsIHZ2LT52YWx1ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgLSB2di0+dGV4dC5kYXRhOwotICAgICAgICByZXR1cm4gdnY7CisgICAgICAgIHYtPmxlbiA9IG5neF9zcHJpbnRmKHYtPmRhdGEsICIlVCIsIHRwLT5zZWMgKyAoZ210ID8gMCA6IHRwLT5nbXRvZmYpKQorICAgICAgICAgICAgICAgICAtIHYtPmRhdGE7CisgICAgICAgIHJldHVybiBOR1hfT0s7CiAgICAgfQogCiAgICAgaWYgKGdtdCkgewpAQCAtMjAxMCwyMiArMjAxMCwyMCBAQAogICAgICAgICBuZ3hfbGliY19sb2NhbHRpbWUodHAtPnNlYywgJnRtKTsKICAgICB9CiAKLSAgICB2di0+dmFsdWUgPSB0cC0+c2VjICsgKGdtdCA/IDAgOiB0cC0+Z210b2ZmKTsKLQotICAgIHZ2LT50ZXh0LmxlbiA9IHN0cmZ0aW1lKGJ1ZiwgTkdYX0hUVFBfU1NJX0RBVEVfTEVOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopIGN0eC0+dGltZWZtdC5kYXRhLCAmdG0pOwotICAgIGlmICh2di0+dGV4dC5sZW4gPT0gMCkgewotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB2LT5sZW4gPSBzdHJmdGltZShidWYsIE5HWF9IVFRQX1NTSV9EQVRFX0xFTiwKKyAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSBjdHgtPnRpbWVmbXQuZGF0YSwgJnRtKTsKKyAgICBpZiAodi0+bGVuID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICB9CiAKLSAgICB2di0+dGV4dC5kYXRhID0gbmd4X3BhbGxvYyhyLT5wb29sLCB2di0+dGV4dC5sZW4pOwotICAgIGlmICh2di0+dGV4dC5kYXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgdi0+ZGF0YSA9IG5neF9wYWxsb2Moci0+cG9vbCwgdi0+bGVuKTsKKyAgICBpZiAodi0+ZGF0YSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgfQogCi0gICAgbmd4X21lbWNweSh2di0+dGV4dC5kYXRhLCBidWYsIHZ2LT50ZXh0Lmxlbik7CisgICAgbmd4X21lbWNweSh2LT5kYXRhLCBidWYsIHYtPmxlbik7CiAKLSAgICByZXR1cm4gdnY7CisgICAgcmV0dXJuIE5HWF9PSzsKIH0KIAogCmRpZmYgLS1naXQgYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3NzbF9tb2R1bGUuYyBiL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfc3NsX21vZHVsZS5jCmluZGV4IDA5YmY2M2QuLmQ3NWI5ZTYgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfc3NsX21vZHVsZS5jCisrKyBiL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfc3NsX21vZHVsZS5jCkBAIC04LDYgKzgsNyBAQAogI2luY2x1ZGUgPG5neF9jb3JlLmg+CiAjaW5jbHVkZSA8bmd4X2h0dHAuaD4KIAorCiAjZGVmaW5lIE5HWF9ERUZMQVVUX0NFUlRJRklDQVRFICAgICAgImNlcnQucGVtIgogI2RlZmluZSBOR1hfREVGTEFVVF9DRVJUSUZJQ0FURV9LRVkgICJjZXJ0LnBlbSIKICNkZWZpbmUgTkdYX0RFRkxBVVRfQ0lQSEVSUyAgIkFMTDohQURIOlJDNCtSU0E6K0hJR0g6K01FRElVTTorTE9XOitTU0x2MjorRVhQIgpAQCAtODQsNiArODUsMTMgQEAKICAgICAgIG5neF9odHRwX3NzbF9ub3N1cHBvcnRlZCwgMCwgMCwgbmd4X2h0dHBfc3NsX29wZW5zc2wwOTcgfSwKICNlbmRpZgogCisgICAgeyBuZ3hfc3RyaW5nKCJzc2xfc2Vzc2lvbl90aW1lb3V0IiksCisgICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0NPTkZfVEFLRTEsCisgICAgICBuZ3hfY29uZl9zZXRfc2VjX3Nsb3QsCisgICAgICBOR1hfSFRUUF9TUlZfQ09ORl9PRkZTRVQsCisgICAgICBvZmZzZXRvZihuZ3hfaHR0cF9zc2xfc3J2X2NvbmZfdCwgc2Vzc2lvbl90aW1lb3V0KSwKKyAgICAgIE5VTEwgfSwKKwogICAgICAgbmd4X251bGxfY29tbWFuZAogfTsKIApAQCAtMTQ2LDYgKzE1NCw3IEBACiAgICAgICovCiAKICAgICBzY2YtPmVuYWJsZSA9IE5HWF9DT05GX1VOU0VUOworICAgIHNjZi0+c2Vzc2lvbl90aW1lb3V0ID0gTkdYX0NPTkZfVU5TRVQ7CiAgICAgc2NmLT5wcmVmZXJfc2VydmVyX2NpcGhlcnMgPSBOR1hfQ09ORl9VTlNFVDsKIAogICAgIHJldHVybiBzY2Y7CkBAIC0xNjYsNiArMTc1LDkgQEAKICAgICAgICAgcmV0dXJuIE5HWF9DT05GX09LOwogICAgIH0KIAorICAgIG5neF9jb25mX21lcmdlX3ZhbHVlKGNvbmYtPnNlc3Npb25fdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2LT5zZXNzaW9uX3RpbWVvdXQsIDMwMCk7CisKICAgICBuZ3hfY29uZl9tZXJnZV92YWx1ZShjb25mLT5wcmVmZXJfc2VydmVyX2NpcGhlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldi0+cHJlZmVyX3NlcnZlcl9jaXBoZXJzLCAwKTsKIApAQCAtMjI5LDYgKzI0MSw4IEBACiAgICAgU1NMX0NUWF9zZXRfc2Vzc2lvbl9pZF9jb250ZXh0KGNvbmYtPnNzbC5jdHgsIG5neF9odHRwX3Nlc3Npb25faWRfY3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yobmd4X2h0dHBfc2Vzc2lvbl9pZF9jdHgpIC0gMSk7CiAKKyAgICBTU0xfQ1RYX3NldF90aW1lb3V0KGNvbmYtPnNzbC5jdHgsIGNvbmYtPnNlc3Npb25fdGltZW91dCk7CisKICAgICByZXR1cm4gTkdYX0NPTkZfT0s7CiB9CiAKZGlmZiAtLWdpdCBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfc3NsX21vZHVsZS5oIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9zc2xfbW9kdWxlLmgKaW5kZXggYTcwNTYzNS4uNDIwN2NkZiAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9zc2xfbW9kdWxlLmgKKysrIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9zc2xfbW9kdWxlLmgKQEAgLTIyLDYgKzIyLDggQEAKIAogICAgIG5neF91aW50X3QgICAgICBwcm90b2NvbHM7CiAKKyAgICB0aW1lX3QgICAgICAgICAgc2Vzc2lvbl90aW1lb3V0OworCiAgICAgbmd4X3N0cl90ICAgICAgIGNlcnRpZmljYXRlOwogICAgIG5neF9zdHJfdCAgICAgICBjZXJ0aWZpY2F0ZV9rZXk7CiAKQEAgLTI5LDE0ICszMSw2IEBACiB9IG5neF9odHRwX3NzbF9zcnZfY29uZl90OwogCiAKLW5neF9pbnRfdCBuZ3hfaHR0cF9zc2xfcmVhZChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVfY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSk7Ci1uZ3hfaW50X3Qgbmd4X2h0dHBfc3NsX3NodXRkb3duKG5neF9odHRwX3JlcXVlc3RfdCAqcik7Ci1uZ3hfY2hhaW5fdCAqbmd4X2h0dHBfc3NsX3dyaXRlKG5neF9jb25uZWN0aW9uX3QgKmMsIG5neF9jaGFpbl90ICppbiwKLSAgICBvZmZfdCBsaW1pdCk7Ci0KLXZvaWQgbmd4X2h0dHBfc3NsX2Nsb3NlX2Nvbm5lY3Rpb24oU1NMICpzc2wsIG5neF9sb2dfdCAqbG9nKTsKLQotCiBleHRlcm4gbmd4X21vZHVsZV90ICBuZ3hfaHR0cF9zc2xfbW9kdWxlOwogCiAKZGlmZiAtLWdpdCBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfc3RhdGljX21vZHVsZS5jIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9zdGF0aWNfbW9kdWxlLmMKaW5kZXggMGU5OTVmNS4uYWI3YWM5YyAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9zdGF0aWNfbW9kdWxlLmMKKysrIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9zdGF0aWNfbW9kdWxlLmMKQEAgLTE5NSw3ICsxOTUsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGxhc3QgPSBuZ3hfY3B5bWVtKGxvY2F0aW9uLCByLT51cmkuZGF0YSwgci0+dXJpLmxlbik7CisgICAgICAgICAgICBsYXN0ID0gbmd4X2NvcHkobG9jYXRpb24sIHItPnVyaS5kYXRhLCByLT51cmkubGVuKTsKICAgICAgICAgfQogCiAgICAgICAgICpsYXN0ID0gJy8nOwpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF91c2VyaWRfZmlsdGVyX21vZHVsZS5jIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF91c2VyaWRfZmlsdGVyX21vZHVsZS5jCmluZGV4IDIyMWQzM2IuLjk0YTcwOWIgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfdXNlcmlkX2ZpbHRlcl9tb2R1bGUuYworKysgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3VzZXJpZF9maWx0ZXJfbW9kdWxlLmMKQEAgLTU1LDcgKzU1LDEwIEBACiBzdGF0aWMgdV9jaGFyICpuZ3hfaHR0cF91c2VyaWRfbG9nX3VpZF9zZXQobmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1X2NoYXIgKmJ1ZiwKICAgICBuZ3hfaHR0cF9sb2dfb3BfdCAqb3ApOwogCi1zdGF0aWMgbmd4X2ludF90IG5neF9odHRwX3VzZXJpZF9hZGRfbG9nX2Zvcm1hdHMobmd4X2NvbmZfdCAqY2YpOworc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF91c2VyaWRfYWRkX3ZhcmlhYmxlcyhuZ3hfY29uZl90ICpjZik7CitzdGF0aWMgbmd4X2ludF90IG5neF9odHRwX3VzZXJpZF92YXJpYWJsZShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCisgICAgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAqdiwgdWludHB0cl90IGRhdGEpOworCiBzdGF0aWMgbmd4X2ludF90IG5neF9odHRwX3VzZXJpZF9pbml0KG5neF9jeWNsZV90ICpjeWNsZSk7CiBzdGF0aWMgdm9pZCAqbmd4X2h0dHBfdXNlcmlkX2NyZWF0ZV9jb25mKG5neF9jb25mX3QgKmNmKTsKIHN0YXRpYyBjaGFyICpuZ3hfaHR0cF91c2VyaWRfbWVyZ2VfY29uZihuZ3hfY29uZl90ICpjZiwgdm9pZCAqcGFyZW50LApAQCAtMTU4LDcgKzE2MSw3IEBACiAKIAogbmd4X2h0dHBfbW9kdWxlX3QgIG5neF9odHRwX3VzZXJpZF9maWx0ZXJfbW9kdWxlX2N0eCA9IHsKLSAgICBuZ3hfaHR0cF91c2VyaWRfYWRkX2xvZ19mb3JtYXRzLCAgICAgICAvKiBwcmVjb25maWd1cmF0aW9uICovCisgICAgbmd4X2h0dHBfdXNlcmlkX2FkZF92YXJpYWJsZXMsICAgICAgICAgLyogcHJlY29uZmlndXJhdGlvbiAqLwogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBvc3Rjb25maWd1cmF0aW9uICovCiAKICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjcmVhdGUgbWFpbiBjb25maWd1cmF0aW9uICovCkBAIC0xOTksNiArMjAyLDEwIEBACiB9OwogCiAKK3N0YXRpYyBuZ3hfc3RyX3QgIG5neF9odHRwX3VzZXJpZF9nb3QgPSBuZ3hfc3RyaW5nKCJ1aWRfZ290Iik7CitzdGF0aWMgbmd4X3N0cl90ICBuZ3hfaHR0cF91c2VyaWRfc2V0ID0gbmd4X3N0cmluZygidWlkX3NldCIpOworCisKIHN0YXRpYyBuZ3hfaW50X3QKIG5neF9odHRwX3VzZXJpZF9maWx0ZXIobmd4X2h0dHBfcmVxdWVzdF90ICpyKQogewpAQCAtMzg3LDcgKzM5NCw3IEBACiAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgfQogCi0gICAgcCA9IG5neF9jcHltZW0oY29va2llLCBjb25mLT5uYW1lLmRhdGEsIGNvbmYtPm5hbWUubGVuKTsKKyAgICBwID0gbmd4X2NvcHkoY29va2llLCBjb25mLT5uYW1lLmRhdGEsIGNvbmYtPm5hbWUubGVuKTsKICAgICAqcCsrID0gJz0nOwogCiAgICAgaWYgKGN0eC0+dWlkX2dvdFszXSA9PSAwKSB7CkBAIC00MTcsMTEgKzQyNCw5IEBACiAgICAgICAgIHAgPSBuZ3hfaHR0cF9jb29raWVfdGltZShwLCBuZ3hfdGltZSgpICsgY29uZi0+ZXhwaXJlcyk7CiAgICAgfQogCi0gICAgaWYgKGNvbmYtPmRvbWFpbi5sZW4pIHsKLSAgICAgICAgcCA9IG5neF9jcHltZW0ocCwgY29uZi0+ZG9tYWluLmRhdGEsIGNvbmYtPmRvbWFpbi5sZW4pOwotICAgIH0KKyAgICBwID0gbmd4X2NvcHkocCwgY29uZi0+ZG9tYWluLmRhdGEsIGNvbmYtPmRvbWFpbi5sZW4pOwogCi0gICAgcCA9IG5neF9jcHltZW0ocCwgY29uZi0+cGF0aC5kYXRhLCBjb25mLT5wYXRoLmxlbik7CisgICAgcCA9IG5neF9jb3B5KHAsIGNvbmYtPnBhdGguZGF0YSwgY29uZi0+cGF0aC5sZW4pOwogCiAgICAgc2V0X2Nvb2tpZSA9IG5neF9saXN0X3B1c2goJnItPmhlYWRlcnNfb3V0LmhlYWRlcnMpOwogICAgIGlmIChzZXRfY29va2llID09IE5VTEwpIHsKQEAgLTQ4OSw3ICs0OTQsNyBAQAogCiAgICAgY29uZiA9IG5neF9odHRwX2dldF9tb2R1bGVfbG9jX2NvbmYociwgbmd4X2h0dHBfdXNlcmlkX2ZpbHRlcl9tb2R1bGUpOwogCi0gICAgYnVmID0gbmd4X2NweW1lbShidWYsIGNvbmYtPm5hbWUuZGF0YSwgY29uZi0+bmFtZS5sZW4pOworICAgIGJ1ZiA9IG5neF9jb3B5KGJ1ZiwgY29uZi0+bmFtZS5kYXRhLCBjb25mLT5uYW1lLmxlbik7CiAKICAgICAqYnVmKysgPSAnPSc7CiAKQEAgLTUzMyw3ICs1MzgsNyBAQAogCiAgICAgY29uZiA9IG5neF9odHRwX2dldF9tb2R1bGVfbG9jX2NvbmYociwgbmd4X2h0dHBfdXNlcmlkX2ZpbHRlcl9tb2R1bGUpOwogCi0gICAgYnVmID0gbmd4X2NweW1lbShidWYsIGNvbmYtPm5hbWUuZGF0YSwgY29uZi0+bmFtZS5sZW4pOworICAgIGJ1ZiA9IG5neF9jb3B5KGJ1ZiwgY29uZi0+bmFtZS5kYXRhLCBjb25mLT5uYW1lLmxlbik7CiAKICAgICAqYnVmKysgPSAnPSc7CiAKQEAgLTU0NCwxMCArNTQ5LDI4IEBACiAKIAogc3RhdGljIG5neF9pbnRfdAotbmd4X2h0dHBfdXNlcmlkX2FkZF9sb2dfZm9ybWF0cyhuZ3hfY29uZl90ICpjZikKK25neF9odHRwX3VzZXJpZF9hZGRfdmFyaWFibGVzKG5neF9jb25mX3QgKmNmKQogeworICAgIG5neF9odHRwX3ZhcmlhYmxlX3QgICAgICp2YXI7CiAgICAgbmd4X2h0dHBfbG9nX29wX25hbWVfdCAgKm9wOwogCisgICAgdmFyID0gbmd4X2h0dHBfYWRkX3ZhcmlhYmxlKGNmLCAmbmd4X2h0dHBfdXNlcmlkX2dvdCwgMCk7CisgICAgaWYgKHZhciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgfQorCisgICAgdmFyLT5oYW5kbGVyID0gbmd4X2h0dHBfdXNlcmlkX3ZhcmlhYmxlOworICAgIHZhci0+ZGF0YSA9IG9mZnNldG9mKG5neF9odHRwX3VzZXJpZF9jdHhfdCwgdWlkX2dvdCk7CisKKyAgICB2YXIgPSBuZ3hfaHR0cF9hZGRfdmFyaWFibGUoY2YsICZuZ3hfaHR0cF91c2VyaWRfc2V0LCAwKTsKKyAgICBpZiAodmFyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICB9CisKKyAgICB2YXItPmhhbmRsZXIgPSBuZ3hfaHR0cF91c2VyaWRfdmFyaWFibGU7CisgICAgdmFyLT5kYXRhID0gb2Zmc2V0b2Yobmd4X2h0dHBfdXNlcmlkX2N0eF90LCB1aWRfc2V0KTsKKworCiAgICAgZm9yIChvcCA9IG5neF9odHRwX3VzZXJpZF9sb2dfZm10X29wczsgb3AtPm5hbWUubGVuOyBvcCsrKSB7IC8qIHZvaWQgKi8gfQogICAgIG9wLT5ydW4gPSBOVUxMOwogCkBAIC01NjQsNiArNTg3LDQyIEBACiAKIAogc3RhdGljIG5neF9pbnRfdAorbmd4X2h0dHBfdXNlcmlkX3ZhcmlhYmxlKG5neF9odHRwX3JlcXVlc3RfdCAqciwgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAqdiwKKyAgICB1aW50cHRyX3QgZGF0YSkKK3sKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAqdWlkOworICAgIG5neF9odHRwX3VzZXJpZF9jdHhfdCAgICpjdHg7CisgICAgbmd4X2h0dHBfdXNlcmlkX2NvbmZfdCAgKmNvbmY7CisKKyAgICB2LT52YWxpZCA9IDE7IAorICAgIHYtPm5vX2NhY2hhYmxlID0gMDsKKyAgICB2LT5ub3RfZm91bmQgPSAwOworCisgICAgY3R4ID0gbmd4X2h0dHBfZ2V0X21vZHVsZV9jdHgociwgbmd4X2h0dHBfdXNlcmlkX2ZpbHRlcl9tb2R1bGUpOworCisgICAgdWlkID0gKHVpbnQzMl90ICopICgoY2hhciAqKSBjdHggKyBkYXRhKTsKKworICAgIGlmIChjdHggPT0gTlVMTCB8fCB1aWRbM10gPT0gMCkgeworICAgICAgICB2LT5ub3RfZm91bmQgPSAxOworICAgICAgICByZXR1cm4gTkdYX09LOworICAgIH0KKworICAgIGNvbmYgPSBuZ3hfaHR0cF9nZXRfbW9kdWxlX2xvY19jb25mKHIsIG5neF9odHRwX3VzZXJpZF9maWx0ZXJfbW9kdWxlKTsKKworICAgIHYtPmxlbiA9IGNvbmYtPm5hbWUubGVuICsgc2l6ZW9mKCI9MDAwMDExMTEyMjIyMzMzMzQ0NDQ1NTU1NjY2Njc3NzciKSAtIDE7CisgICAgdi0+ZGF0YSA9IG5neF9wYWxsb2Moci0+cG9vbCwgdi0+bGVuKTsKKyAgICBpZiAodi0+ZGF0YSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgfQorCisgICAgbmd4X3NwcmludGYodi0+ZGF0YSwgIiVWPSUwOFhEJTA4WEQlMDhYRCUwOFhEIiwKKyAgICAgICAgICAgICAgICAmY29uZi0+bmFtZSwgdWlkWzBdLCB1aWRbMV0sIHVpZFsyXSwgdWlkWzNdKTsKKworICAgIHJldHVybiBOR1hfT0s7Cit9CisKKworc3RhdGljIG5neF9pbnRfdAogbmd4X2h0dHBfdXNlcmlkX2luaXQobmd4X2N5Y2xlX3QgKmN5Y2xlKQogewogICAgIG5neF9odHRwX25leHRfaGVhZGVyX2ZpbHRlciA9IG5neF9odHRwX3RvcF9oZWFkZXJfZmlsdGVyOwpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbmd4X2h0dHAuYyBiL3NyYy9odHRwL25neF9odHRwLmMKaW5kZXggODY3YmYzMS4uN2U0ZmFiNyAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbmd4X2h0dHAuYworKysgYi9zcmMvaHR0cC9uZ3hfaHR0cC5jCkBAIC0yNzcsMTkgKzI3NywzMSBAQAogCiAgICAgLyogaW5pdCBsaXN0cyBvZiB0aGUgaGFuZGxlcnMgKi8KIAotICAgIGlmIChuZ3hfYXJyYXlfaW5pdCgmY21jZi0+cGhhc2VzW05HWF9IVFRQX1JFV1JJVEVfUEhBU0VdLmhhbmRsZXJzLAotICAgICAgICAgICAgICAgICAgICAgICBjZi0+cG9vbCwgMSwgc2l6ZW9mKG5neF9odHRwX2hhbmRsZXJfcHQpKSAhPSBOR1hfT0spCisgICAgaWYgKG5neF9hcnJheV9pbml0KCZjbWNmLT5waGFzZXNbTkdYX0hUVFBfUE9TVF9SRUFEX1BIQVNFXS5oYW5kbGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgY2YtPnBvb2wsIDEsIHNpemVvZihuZ3hfaHR0cF9oYW5kbGVyX3B0KSkKKyAgICAgICAgIT0gTkdYX09LKQogICAgIHsKICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgIH0KIAotICAgIGNtY2YtPnBoYXNlc1tOR1hfSFRUUF9SRVdSSVRFX1BIQVNFXS50eXBlID0gTkdYX09LOworICAgIGNtY2YtPnBoYXNlc1tOR1hfSFRUUF9QT1NUX1JFQURfUEhBU0VdLnR5cGUgPSBOR1hfT0s7CisKKworICAgIGlmIChuZ3hfYXJyYXlfaW5pdCgmY21jZi0+cGhhc2VzW05HWF9IVFRQX1NFUlZFUl9SRVdSSVRFX1BIQVNFXS5oYW5kbGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgY2YtPnBvb2wsIDEsIHNpemVvZihuZ3hfaHR0cF9oYW5kbGVyX3B0KSkKKyAgICAgICAgIT0gTkdYX09LKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgIH0KKworICAgIGNtY2YtPnBoYXNlc1tOR1hfSFRUUF9TRVJWRVJfUkVXUklURV9QSEFTRV0udHlwZSA9IE5HWF9PSzsKIAogCiAgICAgLyogdGhlIHNwZWNpYWwgZmluZCBjb25maWcgcGhhc2UgZm9yIGEgc2luZ2xlIGhhbmRsZXIgKi8KIAogICAgIGlmIChuZ3hfYXJyYXlfaW5pdCgmY21jZi0+cGhhc2VzW05HWF9IVFRQX0ZJTkRfQ09ORklHX1BIQVNFXS5oYW5kbGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgY2YtPnBvb2wsIDEsIHNpemVvZihuZ3hfaHR0cF9oYW5kbGVyX3B0KSkgIT0gTkdYX09LKQorICAgICAgICAgICAgICAgICAgICAgICBjZi0+cG9vbCwgMSwgc2l6ZW9mKG5neF9odHRwX2hhbmRsZXJfcHQpKQorICAgICAgICAhPSBOR1hfT0spCiAgICAgewogICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgfQpAQCAtMzA0LDggKzMxNiwxOSBAQAogICAgICpoID0gbmd4X2h0dHBfZmluZF9sb2NhdGlvbl9jb25maWc7CiAKIAorICAgIGlmIChuZ3hfYXJyYXlfaW5pdCgmY21jZi0+cGhhc2VzW05HWF9IVFRQX1JFV1JJVEVfUEhBU0VdLmhhbmRsZXJzLAorICAgICAgICAgICAgICAgICAgICAgICBjZi0+cG9vbCwgMSwgc2l6ZW9mKG5neF9odHRwX2hhbmRsZXJfcHQpKQorICAgICAgICAhPSBOR1hfT0spCisgICAgeworICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgfQorCisgICAgY21jZi0+cGhhc2VzW05HWF9IVFRQX1JFV1JJVEVfUEhBU0VdLnR5cGUgPSBOR1hfT0s7CisKKwogICAgIGlmIChuZ3hfYXJyYXlfaW5pdCgmY21jZi0+cGhhc2VzW05HWF9IVFRQX0FDQ0VTU19QSEFTRV0uaGFuZGxlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgIGNmLT5wb29sLCAxLCBzaXplb2Yobmd4X2h0dHBfaGFuZGxlcl9wdCkpICE9IE5HWF9PSykKKyAgICAgICAgICAgICAgICAgICAgICAgY2YtPnBvb2wsIDQsIHNpemVvZihuZ3hfaHR0cF9oYW5kbGVyX3B0KSkKKyAgICAgICAgIT0gTkdYX09LKQogICAgIHsKICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgIH0KQEAgLTMxNCw3ICszMzcsOCBAQAogCiAKICAgICBpZiAobmd4X2FycmF5X2luaXQoJmNtY2YtPnBoYXNlc1tOR1hfSFRUUF9DT05URU5UX1BIQVNFXS5oYW5kbGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgY2YtPnBvb2wsIDQsIHNpemVvZihuZ3hfaHR0cF9oYW5kbGVyX3B0KSkgIT0gTkdYX09LKQorICAgICAgICAgICAgICAgICAgICAgICBjZi0+cG9vbCwgNCwgc2l6ZW9mKG5neF9odHRwX2hhbmRsZXJfcHQpKQorICAgICAgICAhPSBOR1hfT0spCiAgICAgewogICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgfQpAQCAtMzUzLDYgKzM3Nyw5IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBpZiAobmd4X2h0dHBfdmFyaWFibGVzX2luaXRfdmFycyhjZikgIT0gTkdYX09LKSB7CisgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICB9CiAKICAgICAvKgogICAgICAqIGh0dHB7fSdzIGNmLT5jdHggd2FzIG5lZWRlZCB3aGlsZSB0aGUgY29uZmlndXJhdGlvbiBtZXJnaW5nCmRpZmYgLS1naXQgYS9zcmMvaHR0cC9uZ3hfaHR0cC5oIGIvc3JjL2h0dHAvbmd4X2h0dHAuaAppbmRleCA1YmUzOTM2Li44ZTVhZTU3IDEwMDY0NAotLS0gYS9zcmMvaHR0cC9uZ3hfaHR0cC5oCisrKyBiL3NyYy9odHRwL25neF9odHRwLmgKQEAgLTYyLDYgKzYyLDggQEAKIAogbmd4X2ludF90IG5neF9odHRwX3BhcnNlX3JlcXVlc3RfbGluZShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIG5neF9idWZfdCAqYik7CiBuZ3hfaW50X3Qgbmd4X2h0dHBfcGFyc2VfY29tcGxleF91cmkobmd4X2h0dHBfcmVxdWVzdF90ICpyKTsKK25neF9pbnRfdCBuZ3hfaHR0cF9wYXJzZV91bnNhZmVfdXJpKG5neF9odHRwX3JlcXVlc3RfdCAqciwgbmd4X3N0cl90ICp1cmksCisgICAgbmd4X3N0cl90ICphcmdzLCBuZ3hfdWludF90ICpmbGFncyk7CiBuZ3hfaW50X3Qgbmd4X2h0dHBfcGFyc2VfaGVhZGVyX2xpbmUobmd4X2h0dHBfcmVxdWVzdF90ICpyLCBuZ3hfYnVmX3QgKmIpOwogbmd4X2ludF90IG5neF9odHRwX3BhcnNlX211bHRpX2hlYWRlcl9saW5lcyhuZ3hfYXJyYXlfdCAqaGVhZGVycywKICAgICBuZ3hfc3RyX3QgKm5hbWUsIG5neF9zdHJfdCAqdmFsdWUpOwpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbmd4X2h0dHBfY29yZV9tb2R1bGUuYyBiL3NyYy9odHRwL25neF9odHRwX2NvcmVfbW9kdWxlLmMKaW5kZXggYTEyYTEzNC4uYzIzMDg2MCAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbmd4X2h0dHBfY29yZV9tb2R1bGUuYworKysgYi9zcmMvaHR0cC9uZ3hfaHR0cF9jb3JlX21vZHVsZS5jCkBAIC0yMiw3ICsyMiw2IEBACiAgICAgbmd4X2FycmF5X3QgKmxvY2F0aW9ucywgc2l6ZV90IGxlbik7CiAKIHN0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfY29yZV9wcmVjb25maWd1cmF0aW9uKG5neF9jb25mX3QgKmNmKTsKLXN0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfY29yZV9wb3N0Y29uZmlndXJhdGlvbihuZ3hfY29uZl90ICpjZik7CiBzdGF0aWMgdm9pZCAqbmd4X2h0dHBfY29yZV9jcmVhdGVfbWFpbl9jb25mKG5neF9jb25mX3QgKmNmKTsKIHN0YXRpYyBjaGFyICpuZ3hfaHR0cF9jb3JlX2luaXRfbWFpbl9jb25mKG5neF9jb25mX3QgKmNmLCB2b2lkICpjb25mKTsKIHN0YXRpYyB2b2lkICpuZ3hfaHR0cF9jb3JlX2NyZWF0ZV9zcnZfY29uZihuZ3hfY29uZl90ICpjZik7CkBAIC0zNjgsNyArMzY3LDcgQEAKIAogbmd4X2h0dHBfbW9kdWxlX3QgIG5neF9odHRwX2NvcmVfbW9kdWxlX2N0eCA9IHsKICAgICBuZ3hfaHR0cF9jb3JlX3ByZWNvbmZpZ3VyYXRpb24sICAgICAgICAvKiBwcmVjb25maWd1cmF0aW9uICovCi0gICAgbmd4X2h0dHBfY29yZV9wb3N0Y29uZmlndXJhdGlvbiwgICAgICAgLyogcG9zdGNvbmZpZ3VyYXRpb24gKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwb3N0Y29uZmlndXJhdGlvbiAqLwogCiAgICAgbmd4X2h0dHBfY29yZV9jcmVhdGVfbWFpbl9jb25mLCAgICAgICAgLyogY3JlYXRlIG1haW4gY29uZmlndXJhdGlvbiAqLwogICAgIG5neF9odHRwX2NvcmVfaW5pdF9tYWluX2NvbmYsICAgICAgICAgIC8qIGluaXQgbWFpbiBjb25maWd1cmF0aW9uICovCkBAIC00NDgsNyArNDQ3LDggQEAKICAgICByLT51cmlfY2hhbmdlZCA9IDE7CiAgICAgci0+dXJpX2NoYW5nZXMgPSBOR1hfSFRUUF9NQVhfUkVXUklURV9DWUNMRVMgKyAxOwogCi0gICAgci0+cGhhc2UgPSBOR1hfSFRUUF9SRVdSSVRFX1BIQVNFOworICAgIHItPnBoYXNlID0gKHItPm1haW4gPT0gcikgPyBOR1hfSFRUUF9QT1NUX1JFQURfUEhBU0U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HWF9IVFRQX1NFUlZFUl9SRVdSSVRFX1BIQVNFOwogICAgIHItPnBoYXNlX2hhbmRsZXIgPSAwOwogCiAgICAgbmd4X2h0dHBfY29yZV9ydW5fcGhhc2VzKHIpOwpAQCAtOTkxLDcgKzk5MSw3IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIGxhc3QgPSBuZ3hfY3B5bWVtKHBhdGgtPmRhdGEsIGNsY2YtPnJvb3QuZGF0YSwgY2xjZi0+cm9vdC5sZW4pOworICAgIGxhc3QgPSBuZ3hfY29weShwYXRoLT5kYXRhLCBjbGNmLT5yb290LmRhdGEsIGNsY2YtPnJvb3QubGVuKTsKICAgICBsYXN0ID0gbmd4X2NweXN0cm4obGFzdCwgci0+dXJpLmRhdGEgKyBhbGlhcywgci0+dXJpLmxlbiAtIGFsaWFzICsgMSk7CiAKICAgICByZXR1cm4gbGFzdDsKQEAgLTEwNTQsNyArMTA1NCw3IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgCi0gICAgaWYgKGxlbiA9PSBhdXRoLmxlbikgeworICAgIGlmIChsZW4gPT0gMCB8fCBsZW4gPT0gYXV0aC5sZW4pIHsKICAgICAgICAgci0+aGVhZGVyc19pbi51c2VyLmRhdGEgPSAodV9jaGFyICopICIiOwogICAgICAgICByZXR1cm4gTkdYX0RFQ0xJTkVEOwogICAgIH0KQEAgLTEwNzAsNyArMTA3MCw3IEBACiAKIG5neF9pbnRfdAogbmd4X2h0dHBfc3VicmVxdWVzdChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCi0gICAgbmd4X3N0cl90ICp1cmksIG5neF9zdHJfdCAqYXJncykKKyAgICBuZ3hfc3RyX3QgKnVyaSwgbmd4X3N0cl90ICphcmdzLCBuZ3hfdWludF90IGZsYWdzKQogewogICAgIG5neF9odHRwX3JlcXVlc3RfdCAgICAgICAgICAgICpzcjsKICAgICBuZ3hfaHR0cF9jb3JlX3Nydl9jb25mX3QgICAgICAqY3NjZjsKQEAgLTExMTYsOSArMTExNiwyMSBAQAogCiAgICAgc3ItPnJlcXVlc3RfbGluZSA9IHItPnJlcXVlc3RfbGluZTsKICAgICBzci0+dXJpID0gKnVyaTsKKworICAgIG5neF9sb2dfZGVidWcxKE5HWF9MT0dfREVCVUdfSFRUUCwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICJodHRwIHN1YnJlcXVlc3QgXCIlVlwiIiwgdXJpKTsKKwogICAgIGlmIChhcmdzKSB7CiAgICAgICAgIHNyLT5hcmdzID0gKmFyZ3M7CisKKyAgICAgICAgbmd4X2xvZ19kZWJ1ZzEoTkdYX0xPR19ERUJVR19IVFRQLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgICAgICJodHRwIHN1YnJlcXVlc3QgYXJncyBcIiVWXCIiLCBhcmdzKTsKICAgICB9CisKKyAgICBpZiAoZmxhZ3MgJiBOR1hfSFRUUF9aRVJPX0lOX1VSSSkgeworICAgICAgICBzci0+emVyb19pbl91cmkgPSAxOworICAgIH0KKwogICAgIHNyLT51bnBhcnNlZF91cmkgPSByLT51bnBhcnNlZF91cmk7CiAgICAgc3ItPm1ldGhvZF9uYW1lID0gci0+bWV0aG9kX25hbWU7CiAgICAgc3ItPmh0dHBfcHJvdG9jb2wgPSByLT5odHRwX3Byb3RvY29sOwpAQCAtMTE2Nyw5ICsxMTc5LDYgQEAKICAgICBzci0+ZGlzY2FyZF9ib2R5ID0gci0+ZGlzY2FyZF9ib2R5OwogICAgIHNyLT5tYWluX2ZpbHRlcl9uZWVkX2luX21lbW9yeSA9IHItPm1haW5fZmlsdGVyX25lZWRfaW5fbWVtb3J5OwogCi0gICAgbmd4X2xvZ19kZWJ1ZzEoTkdYX0xPR19ERUJVR19IVFRQLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCi0gICAgICAgICAgICAgICAgICAgImh0dHAgc3VicmVxdWVzdCBcIiVWXCIiLCB1cmkpOwotCiAgICAgbmd4X2h0dHBfaGFuZGxlcihzcik7CiAKICAgICAvKiB0aGUgcmVxdWVzdCBwb29sIG1heSBiZSBhbHJlYWR5IGRlc3Ryb3llZCAqLwpAQCAtMTE5Miw2ICsxMjAxLDkgQEAKICAgICBpZiAoYXJncykgewogICAgICAgICByLT5hcmdzID0gKmFyZ3M7CiAKKyAgICAgICAgbmd4X2xvZ19kZWJ1ZzEoTkdYX0xPR19ERUJVR19IVFRQLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgICAgICJpbnRlcm5hbCByZWRpcmVjdCBhcmdzOiBcIiVWXCIiLCBhcmdzKTsKKwogICAgIH0gZWxzZSB7CiAgICAgICAgIHItPmFyZ3MubGVuID0gMDsKICAgICAgICAgci0+YXJncy5kYXRhID0gTlVMTDsKQEAgLTE2NTcsMTMgKzE2NjksNiBAQAogfQogCiAKLXN0YXRpYyBuZ3hfaW50X3QKLW5neF9odHRwX2NvcmVfcG9zdGNvbmZpZ3VyYXRpb24obmd4X2NvbmZfdCAqY2YpCi17Ci0gICAgcmV0dXJuIG5neF9odHRwX3ZhcmlhYmxlc19pbml0X3ZhcnMoY2YpOwotfQotCi0KIHN0YXRpYyB2b2lkICoKIG5neF9odHRwX2NvcmVfY3JlYXRlX21haW5fY29uZihuZ3hfY29uZl90ICpjZikKIHsKZGlmZiAtLWdpdCBhL3NyYy9odHRwL25neF9odHRwX2NvcmVfbW9kdWxlLmggYi9zcmMvaHR0cC9uZ3hfaHR0cF9jb3JlX21vZHVsZS5oCmluZGV4IDU5ODk2NTUuLmIyYzI1Y2YgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL25neF9odHRwX2NvcmVfbW9kdWxlLmgKKysrIGIvc3JjL2h0dHAvbmd4X2h0dHBfY29yZV9tb2R1bGUuaApAQCAtNDQsOCArNDQsMTAgQEAKIAogCiB0eXBlZGVmIGVudW0gewotICAgIE5HWF9IVFRQX0ZJTkRfQ09ORklHX1BIQVNFID0gMCwKKyAgICBOR1hfSFRUUF9QT1NUX1JFQURfUEhBU0UgPSAwLAogCisgICAgTkdYX0hUVFBfU0VSVkVSX1JFV1JJVEVfUEhBU0UsCisgICAgTkdYX0hUVFBfRklORF9DT05GSUdfUEhBU0UsCiAgICAgTkdYX0hUVFBfUkVXUklURV9QSEFTRSwKIAogICAgIE5HWF9IVFRQX0FDQ0VTU19QSEFTRSwKQEAgLTI2MCw3ICsyNjIsNyBAQAogbmd4X2ludF90IG5neF9odHRwX2F1dGhfYmFzaWNfdXNlcihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpOwogCiBuZ3hfaW50X3Qgbmd4X2h0dHBfc3VicmVxdWVzdChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCi0gICAgbmd4X3N0cl90ICp1cmksIG5neF9zdHJfdCAqYXJncyk7CisgICAgbmd4X3N0cl90ICp1cmksIG5neF9zdHJfdCAqYXJncywgbmd4X3VpbnRfdCBmbGFncyk7CiBuZ3hfaW50X3Qgbmd4X2h0dHBfaW50ZXJuYWxfcmVkaXJlY3Qobmd4X2h0dHBfcmVxdWVzdF90ICpyLAogICAgIG5neF9zdHJfdCAqdXJpLCBuZ3hfc3RyX3QgKmFyZ3MpOwogCmRpZmYgLS1naXQgYS9zcmMvaHR0cC9uZ3hfaHR0cF9oZWFkZXJfZmlsdGVyX21vZHVsZS5jIGIvc3JjL2h0dHAvbmd4X2h0dHBfaGVhZGVyX2ZpbHRlcl9tb2R1bGUuYwppbmRleCAyNTNmYzA2Li5iMTRiM2NmIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9uZ3hfaHR0cF9oZWFkZXJfZmlsdGVyX21vZHVsZS5jCisrKyBiL3NyYy9odHRwL25neF9odHRwX2hlYWRlcl9maWx0ZXJfbW9kdWxlLmMKQEAgLTM1MSwxMiArMzUxLDEyIEBACiAKICAgICAvKiBzdGF0dXMgbGluZSAqLwogICAgIGlmIChyLT5oZWFkZXJzX291dC5zdGF0dXNfbGluZS5sZW4pIHsKLSAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgci0+aGVhZGVyc19vdXQuc3RhdHVzX2xpbmUuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+aGVhZGVyc19vdXQuc3RhdHVzX2xpbmUubGVuKTsKKyAgICAgICAgYi0+bGFzdCA9IG5neF9jb3B5KGItPmxhc3QsIHItPmhlYWRlcnNfb3V0LnN0YXR1c19saW5lLmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICByLT5oZWFkZXJzX291dC5zdGF0dXNfbGluZS5sZW4pOwogCiAgICAgfSBlbHNlIHsKLSAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgbmd4X2h0dHBfc3RhdHVzX2xpbmVzW3N0YXR1c10uZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfc3RhdHVzX2xpbmVzW3N0YXR1c10ubGVuKTsKKyAgICAgICAgYi0+bGFzdCA9IG5neF9jb3B5KGItPmxhc3QsIG5neF9odHRwX3N0YXR1c19saW5lc1tzdGF0dXNdLmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9zdGF0dXNfbGluZXNbc3RhdHVzXS5sZW4pOwogICAgIH0KICAgICAqYi0+bGFzdCsrID0gQ1I7ICpiLT5sYXN0KysgPSBMRjsKIApAQCAtMzc3LDE0ICszNzcsMTQgQEAKICAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgIkNvbnRlbnQtVHlwZTogIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCJDb250ZW50LVR5cGU6ICIpIC0gMSk7CiAgICAgICAgIHAgPSBiLT5sYXN0OwotICAgICAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCByLT5oZWFkZXJzX291dC5jb250ZW50X3R5cGUuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+aGVhZGVyc19vdXQuY29udGVudF90eXBlLmxlbik7CisgICAgICAgIGItPmxhc3QgPSBuZ3hfY29weShiLT5sYXN0LCByLT5oZWFkZXJzX291dC5jb250ZW50X3R5cGUuZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHItPmhlYWRlcnNfb3V0LmNvbnRlbnRfdHlwZS5sZW4pOwogCiAgICAgICAgIGlmIChyLT5oZWFkZXJzX291dC5jaGFyc2V0LmxlbikgewogICAgICAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgIjsgY2hhcnNldD0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCI7IGNoYXJzZXQ9IikgLSAxKTsKLSAgICAgICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsIHItPmhlYWRlcnNfb3V0LmNoYXJzZXQuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHItPmhlYWRlcnNfb3V0LmNoYXJzZXQubGVuKTsKKyAgICAgICAgICAgIGItPmxhc3QgPSBuZ3hfY29weShiLT5sYXN0LCByLT5oZWFkZXJzX291dC5jaGFyc2V0LmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+aGVhZGVyc19vdXQuY2hhcnNldC5sZW4pOwogCiAgICAgICAgICAgICAvKiB1cGRhdGUgci0+aGVhZGVyc19vdXQuY29udGVudF90eXBlIGZvciBwb3NzaWJsZSBsb2dnaW5nICovCiAKQEAgLTQyOCwyOCArNDI4LDI3IEBACiAjZW5kaWYKIAogICAgICAgICAqYi0+bGFzdCsrID0gJzonOyAqYi0+bGFzdCsrID0gJy8nOyAqYi0+bGFzdCsrID0gJy8nOwotICAgICAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCByLT5zZXJ2ZXJfbmFtZS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLT5zZXJ2ZXJfbmFtZS5sZW4pOworICAgICAgICBiLT5sYXN0ID0gbmd4X2NvcHkoYi0+bGFzdCwgci0+c2VydmVyX25hbWUuZGF0YSwgci0+c2VydmVyX25hbWUubGVuKTsKIAogICAgICAgICBpZiAoY2xjZi0+cG9ydF9pbl9yZWRpcmVjdCkgewogI2lmIChOR1hfSFRUUF9TU0wpCiAgICAgICAgICAgICBpZiAoci0+Y29ubmVjdGlvbi0+c3NsKSB7CiAgICAgICAgICAgICAgICAgaWYgKHItPnBvcnQgIT0gNDQzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsIHItPnBvcnRfdGV4dC0+ZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+cG9ydF90ZXh0LT5sZW4pOworICAgICAgICAgICAgICAgICAgICBiLT5sYXN0ID0gbmd4X2NvcHkoYi0+bGFzdCwgci0+cG9ydF90ZXh0LT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+cG9ydF90ZXh0LT5sZW4pOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZQogI2VuZGlmCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYgKHItPnBvcnQgIT0gODApIHsKLSAgICAgICAgICAgICAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgci0+cG9ydF90ZXh0LT5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLT5wb3J0X3RleHQtPmxlbik7CisgICAgICAgICAgICAgICAgICAgIGItPmxhc3QgPSBuZ3hfY29weShiLT5sYXN0LCByLT5wb3J0X3RleHQtPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLT5wb3J0X3RleHQtPmxlbik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgci0+aGVhZGVyc19vdXQubG9jYXRpb24tPnZhbHVlLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHItPmhlYWRlcnNfb3V0LmxvY2F0aW9uLT52YWx1ZS5sZW4pOworICAgICAgICBiLT5sYXN0ID0gbmd4X2NvcHkoYi0+bGFzdCwgci0+aGVhZGVyc19vdXQubG9jYXRpb24tPnZhbHVlLmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICByLT5oZWFkZXJzX291dC5sb2NhdGlvbi0+dmFsdWUubGVuKTsKIAogICAgICAgICAvKiB1cGRhdGUgci0+aGVhZGVyc19vdXQubG9jYXRpb24tPnZhbHVlIGZvciBwb3NzaWJsZSBsb2dnaW5nICovCiAKQEAgLTQ5NywxMSArNDk2LDEwIEBACiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCi0gICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsIGhlYWRlcltpXS5rZXkuZGF0YSwgaGVhZGVyW2ldLmtleS5sZW4pOworICAgICAgICBiLT5sYXN0ID0gbmd4X2NvcHkoYi0+bGFzdCwgaGVhZGVyW2ldLmtleS5kYXRhLCBoZWFkZXJbaV0ua2V5Lmxlbik7CiAgICAgICAgICpiLT5sYXN0KysgPSAnOicgOyAqYi0+bGFzdCsrID0gJyAnIDsKIAotICAgICAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCBoZWFkZXJbaV0udmFsdWUuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2ldLnZhbHVlLmxlbik7CisgICAgICAgIGItPmxhc3QgPSBuZ3hfY29weShiLT5sYXN0LCBoZWFkZXJbaV0udmFsdWUuZGF0YSwgaGVhZGVyW2ldLnZhbHVlLmxlbik7CiAgICAgICAgICpiLT5sYXN0KysgPSBDUjsgKmItPmxhc3QrKyA9IExGOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbmd4X2h0dHBfcGFyc2UuYyBiL3NyYy9odHRwL25neF9odHRwX3BhcnNlLmMKaW5kZXggMzAyY2Q4MS4uMDAwMTI4NiAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbmd4X2h0dHBfcGFyc2UuYworKysgYi9zcmMvaHR0cC9uZ3hfaHR0cF9wYXJzZS5jCkBAIC03NjMsNiArNzYzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgInM6JWQgaW46JyVYZDolYycsIG91dDonJWMnIiwgc3RhdGUsIGNoLCBjaCwgKnUpOwogCiAgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKKwogICAgICAgICBjYXNlIHN3X3VzdWFsOgogICAgICAgICAgICAgc3dpdGNoKGNoKSB7CiAjaWYgKE5HWF9XSU4zMikKQEAgLTgxMCw3ICs4MTEsNiBAQAogICAgICAgICAgICAgc3dpdGNoKGNoKSB7CiAjaWYgKE5HWF9XSU4zMikKICAgICAgICAgICAgIGNhc2UgJ1xcJzoKLSAgICAgICAgICAgICAgICBicmVhazsKICNlbmRpZgogICAgICAgICAgICAgY2FzZSAnLyc6CiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC04MzcsNyArODM3LDYgQEAKICAgICAgICAgICAgIHN3aXRjaChjaCkgewogI2lmIChOR1hfV0lOMzIpCiAgICAgICAgICAgICBjYXNlICdcXCc6Ci0gICAgICAgICAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCiAjZW5kaWYKICAgICAgICAgICAgIGNhc2UgJy8nOgogICAgICAgICAgICAgICAgIHN0YXRlID0gc3dfc2xhc2g7CkBAIC04NjYsNyArODY1LDYgQEAKICAgICAgICAgICAgIHN3aXRjaChjaCkgewogI2lmIChOR1hfV0lOMzIpCiAgICAgICAgICAgICBjYXNlICdcXCc6Ci0gICAgICAgICAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCiAjZW5kaWYKICAgICAgICAgICAgIGNhc2UgJy8nOgogICAgICAgICAgICAgICAgIHN0YXRlID0gc3dfc2xhc2g7CkBAIC05MjMsNiArOTIxLDkgQEAKICAgICAgICAgICAgICAgICBxdW90ZWRfc3RhdGUgPSBzdGF0ZTsKICAgICAgICAgICAgICAgICBzdGF0ZSA9IHN3X3F1b3RlZDsKICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJz8nOgorICAgICAgICAgICAgICAgIHItPmFyZ3Nfc3RhcnQgPSBwOworICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgc3RhdGUgPSBzd191c3VhbDsKICAgICAgICAgICAgICAgICAqdSsrID0gY2g7CkBAIC0xMDAzLDYgKzEwMDQsOTIgQEAKIAogCiBuZ3hfaW50X3QKK25neF9odHRwX3BhcnNlX3Vuc2FmZV91cmkobmd4X2h0dHBfcmVxdWVzdF90ICpyLCBuZ3hfc3RyX3QgKnVyaSwKKyAgICBuZ3hfc3RyX3QgKmFyZ3MsIG5neF91aW50X3QgKmZsYWdzKQoreworICAgIHVfY2hhciAgY2gsICpwOworICAgIHNpemVfdCAgbGVuOworCisgICAgbGVuID0gdXJpLT5sZW47CisgICAgcCA9IHVyaS0+ZGF0YTsKKworICAgIGlmIChsZW4gPT0gMCB8fCBwWzBdID09ICc/JykgeworICAgICAgICBnb3RvIHVuc2FmZTsKKyAgICB9CisKKyAgICBpZiAocFswXSA9PSAnLicgJiYgbGVuID09IDMgJiYgcFsxXSA9PSAnLicgJiYgKHBbMl0gPT0gJy8nCisjaWYgKE5HWF9XSU4zMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHBbMl0gPT0gJ1xcJworI2VuZGlmCisgICAgICAgICkpCisgICAgeworICAgICAgICBnb3RvIHVuc2FmZTsKKyAgICB9CisKKyAgICBmb3IgKCAvKiB2b2lkICovIDsgbGVuOyBsZW4tLSkgeworCisgICAgICAgIGNoID0gKnArKzsKKworICAgICAgICBpZiAoY2ggPT0gJz8nKSB7CisgICAgICAgICAgICBhcmdzLT5sZW4gPSBsZW4gLSAxOworICAgICAgICAgICAgYXJncy0+ZGF0YSA9IHA7CisgICAgICAgICAgICB1cmktPmxlbiAtPSBsZW47CisKKyAgICAgICAgICAgIHJldHVybiBOR1hfT0s7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY2ggPT0gJ1wwJykgeworICAgICAgICAgICAgKmZsYWdzIHw9IE5HWF9IVFRQX1pFUk9fSU5fVVJJOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY2ggIT0gJy8nCisjaWYgKE5HWF9XSU4zMikKKyAgICAgICAgICAgICYmIGNoICE9ICdcXCcKKyNlbmRpZgorICAgICAgICAgICAgKQorICAgICAgICB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChsZW4gPiAyKSB7CisKKyAgICAgICAgICAgIC8qIGRldGVjdCAiLy4uLyIgKi8KKworICAgICAgICAgICAgaWYgKHBbMl0gPT0gJy8nKSB7CisgICAgICAgICAgICAgICAgZ290byB1bnNhZmU7CisgICAgICAgICAgICB9CisKKyNpZiAoTkdYX1dJTjMyKQorCisgICAgICAgICAgICBpZiAocFsyXSA9PSAnXFwnKSB7CisgICAgICAgICAgICAgICAgZ290byB1bnNhZmU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChsZW4gPiAzKSB7CisKKyAgICAgICAgICAgICAgICAvKiBkZXRlY3QgIi8uLi4vIiAqLworCisgICAgICAgICAgICAgICAgaWYgKHBbM10gPT0gJy8nIHx8IHBbM10gPT0gJ1xcJykgeworICAgICAgICAgICAgICAgICAgICBnb3RvIHVuc2FmZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBOR1hfT0s7CisKK3Vuc2FmZToKKworICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19FUlIsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICJ1bnNhZmUgVVJJIFwiJVZcIiB3YXMgZGV0ZWN0ZWQiLCB1cmkpOworCisgICAgcmV0dXJuIE5HWF9FUlJPUjsKK30KKworCituZ3hfaW50X3QKIG5neF9odHRwX3BhcnNlX211bHRpX2hlYWRlcl9saW5lcyhuZ3hfYXJyYXlfdCAqaGVhZGVycywgbmd4X3N0cl90ICpuYW1lLAogICAgIG5neF9zdHJfdCAqdmFsdWUpCiB7CkBAIC0xMDU5LDYgKzExNDYsNyBAQAogICAgICAgICAgICAgcmV0dXJuIGk7CiAKICAgICAgICAgc2tpcDoKKwogICAgICAgICAgICAgd2hpbGUgKHN0YXJ0IDwgZW5kKSB7CiAgICAgICAgICAgICAgICAgY2ggPSAqc3RhcnQrKzsKICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJzsnIHx8IGNoID09ICcsJykgewpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbmd4X2h0dHBfcmVxdWVzdC5jIGIvc3JjL2h0dHAvbmd4X2h0dHBfcmVxdWVzdC5jCmluZGV4IDgyZjY5YzguLmVmNWE0NWYgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL25neF9odHRwX3JlcXVlc3QuYworKysgYi9zcmMvaHR0cC9uZ3hfaHR0cF9yZXF1ZXN0LmMKQEAgLTExMiwxMiArMTEyLDE4IEBACiAgICAgeyBuZ3hfc3RyaW5nKCJLZWVwLUFsaXZlIiksIG9mZnNldG9mKG5neF9odHRwX2hlYWRlcnNfaW5fdCwga2VlcF9hbGl2ZSksCiAgICAgICAgICAgICAgICAgIG5neF9odHRwX3Byb2Nlc3NfaGVhZGVyX2xpbmUgfSwKIAotI2lmIChOR1hfSFRUUF9QUk9YWSkKKyNpZiAoTkdYX0hUVFBfUFJPWFkgfHwgTkdYX0hUVFBfUkVBTElQKQogICAgIHsgbmd4X3N0cmluZygiWC1Gb3J3YXJkZWQtRm9yIiksCiAgICAgICAgICAgICAgICAgIG9mZnNldG9mKG5neF9odHRwX2hlYWRlcnNfaW5fdCwgeF9mb3J3YXJkZWRfZm9yKSwKICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfcHJvY2Vzc19oZWFkZXJfbGluZSB9LAogI2VuZGlmCiAKKyNpZiAoTkdYX0hUVFBfUkVBTElQKQorICAgIHsgbmd4X3N0cmluZygiWC1SZWFsLUlQIiksCisgICAgICAgICAgICAgICAgIG9mZnNldG9mKG5neF9odHRwX2hlYWRlcnNfaW5fdCwgeF9yZWFsX2lwKSwKKyAgICAgICAgICAgICAgICAgbmd4X2h0dHBfcHJvY2Vzc19oZWFkZXJfbGluZSB9LAorI2VuZGlmCisKICNpZiAoTkdYX0hUVFBfSEVBREVSUykKICAgICB7IG5neF9zdHJpbmcoIkFjY2VwdCIpLCBvZmZzZXRvZihuZ3hfaHR0cF9oZWFkZXJzX2luX3QsIGFjY2VwdCksCiAgICAgICAgICAgICAgICAgIG5neF9odHRwX3Byb2Nlc3NfaGVhZGVyX2xpbmUgfSwKQEAgLTE5MCwyMCArMTk2LDIxIEBACiBzdGF0aWMKIHZvaWQgbmd4X2h0dHBfaW5pdF9yZXF1ZXN0KG5neF9ldmVudF90ICpyZXYpCiB7Ci0gICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgaTsKLSAgICBzb2NrbGVuX3QgICAgICAgICAgICAgICAgICBsZW47Ci0gICAgc3RydWN0IHNvY2thZGRyX2luICAgICAgICAgc2luOwotICAgIG5neF9jb25uZWN0aW9uX3QgICAgICAgICAgKmM7Ci0gICAgbmd4X2h0dHBfcmVxdWVzdF90ICAgICAgICAqcjsKLSAgICBuZ3hfaHR0cF9pbl9wb3J0X3QgICAgICAgICppbl9wb3J0OwotICAgIG5neF9odHRwX2luX2FkZHJfdCAgICAgICAgKmluX2FkZHI7Ci0gICAgbmd4X2h0dHBfbG9nX2N0eF90ICAgICAgICAqY3R4OwotICAgIG5neF9odHRwX2Nvbm5lY3Rpb25fdCAgICAgKmhjOwotICAgIG5neF9odHRwX3NlcnZlcl9uYW1lX3QgICAgKnNlcnZlcl9uYW1lOwotICAgIG5neF9odHRwX2NvcmVfc3J2X2NvbmZfdCAgKmNzY2Y7Ci0gICAgbmd4X2h0dHBfY29yZV9sb2NfY29uZl90ICAqY2xjZjsKKyAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgaTsKKyAgICBzb2NrbGVuX3QgICAgICAgICAgICAgICAgICAgbGVuOworICAgIHN0cnVjdCBzb2NrYWRkcl9pbiAgICAgICAgICBzaW47CisgICAgbmd4X2Nvbm5lY3Rpb25fdCAgICAgICAgICAgKmM7CisgICAgbmd4X2h0dHBfcmVxdWVzdF90ICAgICAgICAgKnI7CisgICAgbmd4X2h0dHBfaW5fcG9ydF90ICAgICAgICAgKmluX3BvcnQ7CisgICAgbmd4X2h0dHBfaW5fYWRkcl90ICAgICAgICAgKmluX2FkZHI7CisgICAgbmd4X2h0dHBfbG9nX2N0eF90ICAgICAgICAgKmN0eDsKKyAgICBuZ3hfaHR0cF9jb25uZWN0aW9uX3QgICAgICAqaGM7CisgICAgbmd4X2h0dHBfc2VydmVyX25hbWVfdCAgICAgKnNlcnZlcl9uYW1lOworICAgIG5neF9odHRwX2NvcmVfc3J2X2NvbmZfdCAgICpjc2NmOworICAgIG5neF9odHRwX2NvcmVfbG9jX2NvbmZfdCAgICpjbGNmOworICAgIG5neF9odHRwX2NvcmVfbWFpbl9jb25mX3QgICpjbWNmOwogI2lmIChOR1hfSFRUUF9TU0wpCi0gICAgbmd4X2h0dHBfc3NsX3Nydl9jb25mX3QgICAqc3NjZjsKKyAgICBuZ3hfaHR0cF9zc2xfc3J2X2NvbmZfdCAgICAqc3NjZjsKICNlbmRpZgogCiAjaWYgKE5HWF9TVEFUX1NUVUIpCkBAIC0zNzcsMTMgKzM4NCwyMSBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0KICAgICByLT5jdHggPSBuZ3hfcGNhbGxvYyhyLT5wb29sLCBzaXplb2Yodm9pZCAqKSAqIG5neF9odHRwX21heF9tb2R1bGUpOwogICAgIGlmIChyLT5jdHggPT0gTlVMTCkgewogICAgICAgICBuZ3hfaHR0cF9jbG9zZV9yZXF1ZXN0KHIsIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKKyAgICBjbWNmID0gbmd4X2h0dHBfZ2V0X21vZHVsZV9tYWluX2NvbmYociwgbmd4X2h0dHBfY29yZV9tb2R1bGUpOworCisgICAgci0+dmFyaWFibGVzID0gbmd4X3BjYWxsb2Moci0+cG9vbCwgY21jZi0+dmFyaWFibGVzLm5lbHRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzaXplb2Yobmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCkpOworICAgIGlmIChyLT52YXJpYWJsZXMgPT0gTlVMTCkgeworICAgICAgICBuZ3hfaHR0cF9jbG9zZV9yZXF1ZXN0KHIsIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKICAgICBjLT5zaW5nbGVfY29ubmVjdGlvbiA9IDE7CiAgICAgci0+Y29ubmVjdGlvbiA9IGM7CiAKZGlmZiAtLWdpdCBhL3NyYy9odHRwL25neF9odHRwX3JlcXVlc3QuaCBiL3NyYy9odHRwL25neF9odHRwX3JlcXVlc3QuaAppbmRleCA0MGEzMjhjLi5iMGJiNWQwIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9uZ3hfaHR0cF9yZXF1ZXN0LmgKKysrIGIvc3JjL2h0dHAvbmd4X2h0dHBfcmVxdWVzdC5oCkBAIC00MCw2ICs0MCw4IEBACiAjZGVmaW5lIE5HWF9IVFRQX1BBUlNFX0hFQURFUl9FUlJPUiAgICAgICAgMTMKICNkZWZpbmUgTkdYX0hUVFBfUEFSU0VfSU5WQUxJRF9IRUFERVIgICAgICAxMwogCisjZGVmaW5lIE5HWF9IVFRQX1pFUk9fSU5fVVJJICAgICAgICAgICAgICAgMQorCiAKICNkZWZpbmUgTkdYX0hUVFBfT0sgICAgICAgICAgICAgICAgICAgICAgICAyMDAKICNkZWZpbmUgTkdYX0hUVFBfTk9fQ09OVEVOVCAgICAgICAgICAgICAgICAyMDQKQEAgLTE1MCwxMCArMTUyLDE0IEBACiAKICAgICBuZ3hfdGFibGVfZWx0X3QgICAgICAgICAgICAgICAgICAqa2VlcF9hbGl2ZTsKIAotI2lmIChOR1hfSFRUUF9QUk9YWSkKKyNpZiAoTkdYX0hUVFBfUFJPWFkgfHwgTkdYX0hUVFBfUkVBTElQKQogICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICAgICAgICAgICp4X2ZvcndhcmRlZF9mb3I7CiAjZW5kaWYKIAorI2lmIChOR1hfSFRUUF9SRUFMSVApCisgICAgbmd4X3RhYmxlX2VsdF90ICAgICAgICAgICAgICAgICAgKnhfcmVhbF9pcDsKKyNlbmRpZgorCiAjaWYgKE5HWF9IVFRQX0hFQURFUlMpCiAgICAgbmd4X3RhYmxlX2VsdF90ICAgICAgICAgICAgICAgICAgKmFjY2VwdDsKICAgICBuZ3hfdGFibGVfZWx0X3QgICAgICAgICAgICAgICAgICAqYWNjZXB0X2xhbmd1YWdlOwpAQCAtMzIwLDcgKzMyNiw3IEBACiAgICAgbmd4X2h0dHBfaGFuZGxlcl9wdCAgICAgICAgICAgICAgIGNvbnRlbnRfaGFuZGxlcjsKICAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzX2NvZGU7CiAKLSAgICBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICAgICAgICoqdmFyaWFibGVzOworICAgIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgICAgICAgICp2YXJpYWJsZXM7CiAKICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXRfcmF0ZTsKIApAQCAtMzY2LDYgKzM3MiwxNiBAQAogICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgICAgICAgICBieXBhc3NfY2FjaGU6MTsKICAgICB1bnNpZ25lZCAgICAgICAgICAgICAgICAgICAgICAgICAgbm9fY2FjaGU6MTsKIAorI2lmIChOR1hfSFRUUF9SRUFMSVApCisKKyAgICAvKgorICAgICAqIGluc3RlYWQgb2YgdXNpbmcgdGhlIHJlcXVlc3QgY29udGV4dCBkYXRhIGluIG5neF9odHRwX3JlYWxpcF9tb2R1bGUKKyAgICAgKiB3ZSB1c2UgdGhlIHNpbmdsZSBiaXQgaW4gdGhlIHJlcXVlc3Qgc3RydWN0dXJlCisgICAgICovCisgICAgdW5zaWduZWQgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxpcF9zZXQ6MTsKKworI2VuZGlmCisKICNpZiAwCiAgICAgdW5zaWduZWQgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hhYmxlOjE7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9odHRwL25neF9odHRwX3JlcXVlc3RfYm9keS5jIGIvc3JjL2h0dHAvbmd4X2h0dHBfcmVxdWVzdF9ib2R5LmMKaW5kZXggNjZjN2M2Ny4uNmYwMmYwZCAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbmd4X2h0dHBfcmVxdWVzdF9ib2R5LmMKKysrIGIvc3JjL2h0dHAvbmd4X2h0dHBfcmVxdWVzdF9ib2R5LmMKQEAgLTIyMCwxNCArMjIwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgImh0dHAgY2xpZW50IHJlcXVlc3QgYm9keSByZWN2ICV6Iiwgbik7CiAKICAgICAgICAgaWYgKG4gPT0gTkdYX0FHQUlOKSB7Ci0gICAgICAgICAgICBjbGNmID0gbmd4X2h0dHBfZ2V0X21vZHVsZV9sb2NfY29uZihyLCBuZ3hfaHR0cF9jb3JlX21vZHVsZSk7Ci0gICAgICAgICAgICBuZ3hfYWRkX3RpbWVyKGMtPnJlYWQsIGNsY2YtPmNsaWVudF9ib2R5X3RpbWVvdXQpOwotCi0gICAgICAgICAgICBpZiAobmd4X2hhbmRsZV9yZWFkX2V2ZW50KGMtPnJlYWQsIDApID09IE5HWF9FUlJPUikgewotICAgICAgICAgICAgICAgIHJldHVybiBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBOR1hfQUdBSU47CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChuID09IDApIHsKQEAgLTI1Nyw5ICsyNTAsMjAgQEAKICAgICAgICAgICAgICAgICAgICAiaHR0cCBjbGllbnQgcmVxdWVzdCBib2R5IHJlc3QgJXV6IiwgcmItPnJlc3QpOwogCiAgICAgaWYgKHJiLT5yZXN0KSB7CisgICAgICAgIGNsY2YgPSBuZ3hfaHR0cF9nZXRfbW9kdWxlX2xvY19jb25mKHIsIG5neF9odHRwX2NvcmVfbW9kdWxlKTsKKyAgICAgICAgbmd4X2FkZF90aW1lcihjLT5yZWFkLCBjbGNmLT5jbGllbnRfYm9keV90aW1lb3V0KTsKKworICAgICAgICBpZiAobmd4X2hhbmRsZV9yZWFkX2V2ZW50KGMtPnJlYWQsIDApID09IE5HWF9FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKKyAgICAgICAgfQorCiAgICAgICAgIHJldHVybiBOR1hfQUdBSU47CiAgICAgfQogCisgICAgaWYgKGMtPnJlYWQtPnRpbWVyX3NldCkgeworICAgICAgICBuZ3hfZGVsX3RpbWVyKGMtPnJlYWQpOworICAgIH0KKwogICAgIGlmIChyYi0+dGVtcF9maWxlKSB7CiAKICAgICAgICAgLyogc2F2ZSB0aGUgbGFzdCBwYXJ0ICovCmRpZmYgLS1naXQgYS9zcmMvaHR0cC9uZ3hfaHR0cF9zY3JpcHQuYyBiL3NyYy9odHRwL25neF9odHRwX3NjcmlwdC5jCmluZGV4IGE4MjcyZWMuLjkwNjIwY2QgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL25neF9odHRwX3NjcmlwdC5jCisrKyBiL3NyYy9odHRwL25neF9odHRwX3NjcmlwdC5jCkBAIC0zNCw3ICszNCw3IEBACiB7CiAgICAgdV9jaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaDsKICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU7Ci0gICAgbmd4X2ludF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDsKKyAgICBuZ3hfaW50X3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LCAqcDsKICAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU7CiAgICAgdWludHB0cl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb2RlOwogICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgbiwgYnJhY2tldDsKQEAgLTQyLDYgKzQyLDE1IEBACiAgICAgbmd4X2h0dHBfc2NyaXB0X2NvcHlfY29kZV90ICAgICAgICAgICpjb3B5OwogICAgIG5neF9odHRwX3NjcmlwdF9jb3B5X2NhcHR1cmVfY29kZV90ICAqY29weV9jYXB0dXJlOwogCisgICAgaWYgKHNjLT5mbHVzaGVzICYmICpzYy0+Zmx1c2hlcyA9PSBOVUxMKSB7CisgICAgICAgIG4gPSBzYy0+dmFyaWFibGVzID8gc2MtPnZhcmlhYmxlcyA6IDE7CisgICAgICAgICpzYy0+Zmx1c2hlcyA9IG5neF9hcnJheV9jcmVhdGUoc2MtPmNmLT5wb29sLCBuLCBzaXplb2Yobmd4X3VpbnRfdCkpOworICAgICAgICBpZiAoKnNjLT5mbHVzaGVzID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgICAgIH0KKyAgICB9CisKKwogICAgIGlmICgqc2MtPmxlbmd0aHMgPT0gTlVMTCkgewogICAgICAgICBuID0gc2MtPnZhcmlhYmxlcyAqICgyICogc2l6ZW9mKG5neF9odHRwX3NjcmlwdF9jb3B5X2NvZGVfdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXplb2Yobmd4X2h0dHBfc2NyaXB0X3Zhcl9jb2RlX3QpKQpAQCAtMTY3LDYgKzE3NiwxNSBAQAogICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGlmIChzYy0+Zmx1c2hlcykgeworICAgICAgICAgICAgICAgIHAgPSBuZ3hfYXJyYXlfcHVzaCgqc2MtPmZsdXNoZXMpOworICAgICAgICAgICAgICAgIGlmIChwID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqcCA9IGluZGV4OworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICB2YXJfY29kZSA9IG5neF9odHRwX3NjcmlwdF9hZGRfY29kZSgqc2MtPmxlbmd0aHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfaHR0cF9zY3JpcHRfdmFyX2NvZGVfdCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwpAQCAtMjc2LDYgKzI5NCwyNCBAQAogfQogCiAKK3ZvaWQKK25neF9odHRwX3NjcmlwdF9mbHVzaF9ub19jYWNoYWJsZV92YXJpYWJsZXMobmd4X2h0dHBfcmVxdWVzdF90ICpyLAorICAgIG5neF9hcnJheV90ICppbmRpY2VzKQoreworICAgIG5neF91aW50X3QgIG4sICppbmRleDsKKworICAgIGlmIChpbmRpY2VzKSB7CisgICAgICAgIGluZGV4ID0gaW5kaWNlcy0+ZWx0czsKKyAgICAgICAgZm9yIChuID0gMDsgbiA8IGluZGljZXMtPm5lbHRzOyBuKyspIHsKKyAgICAgICAgICAgIGlmIChyLT52YXJpYWJsZXNbaW5kZXhbbl1dLm5vX2NhY2hhYmxlKSB7CisgICAgICAgICAgICAgICAgci0+dmFyaWFibGVzW2luZGV4W25dXS52YWxpZCA9IDA7CisgICAgICAgICAgICAgICAgci0+dmFyaWFibGVzW2luZGV4W25dXS5ub3RfZm91bmQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisKIHZvaWQgKgogbmd4X2h0dHBfc2NyaXB0X3N0YXJ0X2NvZGUobmd4X3Bvb2xfdCAqcG9vbCwgbmd4X2FycmF5X3QgKipjb2Rlcywgc2l6ZV90IHNpemUpCiB7CkBAIC0zMzUsOCArMzcxLDggQEAKICAgICBjb2RlID0gKG5neF9odHRwX3NjcmlwdF9jb3B5X2NvZGVfdCAqKSBlLT5pcDsKIAogICAgIGlmICghZS0+c2tpcCkgewotICAgICAgICBlLT5wb3MgPSBuZ3hfY3B5bWVtKGUtPnBvcywgZS0+aXAgKyBzaXplb2Yobmd4X2h0dHBfc2NyaXB0X2NvcHlfY29kZV90KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlLT5sZW4pOworICAgICAgICBlLT5wb3MgPSBuZ3hfY29weShlLT5wb3MsIGUtPmlwICsgc2l6ZW9mKG5neF9odHRwX3NjcmlwdF9jb3B5X2NvZGVfdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUtPmxlbik7CiAgICAgfQogCiAgICAgZS0+aXAgKz0gc2l6ZW9mKG5neF9odHRwX3NjcmlwdF9jb3B5X2NvZGVfdCkKQEAgLTM1OSwxMCArMzk1LDE1IEBACiAKICAgICBlLT5pcCArPSBzaXplb2Yobmd4X2h0dHBfc2NyaXB0X3Zhcl9jb2RlX3QpOwogCi0gICAgdmFsdWUgPSBuZ3hfaHR0cF9nZXRfaW5kZXhlZF92YXJpYWJsZShlLT5yZXF1ZXN0LCBjb2RlLT5pbmRleCk7CisgICAgaWYgKGUtPmZsdXNoZWQpIHsKKyAgICAgICAgdmFsdWUgPSBuZ3hfaHR0cF9nZXRfaW5kZXhlZF92YXJpYWJsZShlLT5yZXF1ZXN0LCBjb2RlLT5pbmRleCk7CiAKLSAgICBpZiAodmFsdWUgJiYgdmFsdWUgIT0gTkdYX0hUVFBfVkFSX05PVF9GT1VORCkgewotICAgICAgICByZXR1cm4gdmFsdWUtPnRleHQubGVuOworICAgIH0gZWxzZSB7CisgICAgICAgIHZhbHVlID0gbmd4X2h0dHBfZ2V0X2ZsdXNoZWRfdmFyaWFibGUoZS0+cmVxdWVzdCwgY29kZS0+aW5kZXgpOworICAgIH0KKworICAgIGlmICh2YWx1ZSAmJiAhdmFsdWUtPm5vdF9mb3VuZCkgeworICAgICAgICByZXR1cm4gdmFsdWUtPmxlbjsKICAgICB9CiAKICAgICByZXR1cm4gMDsKQEAgLTM4MCwxMCArNDIxLDE2IEBACiAgICAgZS0+aXAgKz0gc2l6ZW9mKG5neF9odHRwX3NjcmlwdF92YXJfY29kZV90KTsKIAogICAgIGlmICghZS0+c2tpcCkgewotICAgICAgICB2YWx1ZSA9IG5neF9odHRwX2dldF9pbmRleGVkX3ZhcmlhYmxlKGUtPnJlcXVlc3QsIGNvZGUtPmluZGV4KTsKIAotICAgICAgICBpZiAodmFsdWUgJiYgdmFsdWUgIT0gTkdYX0hUVFBfVkFSX05PVF9GT1VORCkgewotICAgICAgICAgICAgZS0+cG9zID0gbmd4X2NweW1lbShlLT5wb3MsIHZhbHVlLT50ZXh0LmRhdGEsIHZhbHVlLT50ZXh0Lmxlbik7CisgICAgICAgIGlmIChlLT5mbHVzaGVkKSB7CisgICAgICAgICAgICB2YWx1ZSA9IG5neF9odHRwX2dldF9pbmRleGVkX3ZhcmlhYmxlKGUtPnJlcXVlc3QsIGNvZGUtPmluZGV4KTsKKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdmFsdWUgPSBuZ3hfaHR0cF9nZXRfZmx1c2hlZF92YXJpYWJsZShlLT5yZXF1ZXN0LCBjb2RlLT5pbmRleCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAodmFsdWUgJiYgIXZhbHVlLT5ub3RfZm91bmQpIHsKKyAgICAgICAgICAgIGUtPnBvcyA9IG5neF9jb3B5KGUtPnBvcywgdmFsdWUtPmRhdGEsIHZhbHVlLT5sZW4pOwogCiAgICAgICAgICAgICBpZiAoZS0+bG9nKSB7CiAgICAgICAgICAgICAgICAgbmd4X2xvZ19kZWJ1ZzEoTkdYX0xPR19ERUJVR19IVFRQLApAQCAtNDQwLDkgKzQ4Nyw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUtPmNhcHR1cmVzW2NvZGUtPm4gKyAxXSAtIGUtPmNhcHR1cmVzW2NvZGUtPm5dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR1hfRVNDQVBFX0FSR1MpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZS0+cG9zID0gbmd4X2NweW1lbShlLT5wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmUtPmxpbmUuZGF0YVtlLT5jYXB0dXJlc1tjb2RlLT5uXV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS0+Y2FwdHVyZXNbY29kZS0+biArIDFdIC0gZS0+Y2FwdHVyZXNbY29kZS0+bl0pOworICAgICAgICAgICAgZS0+cG9zID0gbmd4X2NvcHkoZS0+cG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmUtPmxpbmUuZGF0YVtlLT5jYXB0dXJlc1tjb2RlLT5uXV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLT5jYXB0dXJlc1tjb2RlLT5uICsgMV0gLSBlLT5jYXB0dXJlc1tjb2RlLT5uXSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTQ4Nyw3ICs1MzQsOCBAQAogICAgICAgICBlLT5saW5lID0gci0+dXJpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGUtPnNwLS07Ci0gICAgICAgIGUtPmxpbmUgPSBlLT5zcC0+dGV4dDsKKyAgICAgICAgZS0+bGluZS5sZW4gPSBlLT5zcC0+bGVuOworICAgICAgICBlLT5saW5lLmRhdGEgPSBlLT5zcC0+ZGF0YTsKICAgICB9CiAKICAgICByYyA9IG5neF9yZWdleF9leGVjKGNvZGUtPnJlZ2V4LCAmZS0+bGluZSwgZS0+Y2FwdHVyZXMsIGNvZGUtPm5jYXB0dXJlcyk7CkBAIC01MDIsOSArNTUwLDggQEAKICAgICAgICAgZS0+bmNhcHR1cmVzID0gMDsKIAogICAgICAgICBpZiAoY29kZS0+dGVzdCkgewotICAgICAgICAgICAgZS0+c3AtPnZhbHVlID0gMDsgCi0gICAgICAgICAgICBlLT5zcC0+dGV4dC5sZW4gPSAwOwotICAgICAgICAgICAgZS0+c3AtPnRleHQuZGF0YSA9ICh1X2NoYXIgKikgIiI7CisgICAgICAgICAgICBlLT5zcC0+bGVuID0gMDsKKyAgICAgICAgICAgIGUtPnNwLT5kYXRhID0gKHVfY2hhciAqKSAiIjsKICAgICAgICAgICAgIGUtPnNwKys7CiAKICAgICAgICAgICAgIGUtPmlwICs9IHNpemVvZihuZ3hfaHR0cF9zY3JpcHRfcmVnZXhfY29kZV90KTsKQEAgLTUzMyw5ICs1ODAsOCBAQAogICAgIGUtPm5jYXB0dXJlcyA9IGNvZGUtPm5jYXB0dXJlczsKIAogICAgIGlmIChjb2RlLT50ZXN0KSB7Ci0gICAgICAgIGUtPnNwLT52YWx1ZSA9IDE7IAotICAgICAgICBlLT5zcC0+dGV4dC5sZW4gPSAxOwotICAgICAgICBlLT5zcC0+dGV4dC5kYXRhID0gKHVfY2hhciAqKSAiMSI7CisgICAgICAgIGUtPnNwLT5sZW4gPSAxOworICAgICAgICBlLT5zcC0+ZGF0YSA9ICh1X2NoYXIgKikgIjEiOwogICAgICAgICBlLT5zcCsrOwogCiAgICAgICAgIGUtPmlwICs9IHNpemVvZihuZ3hfaHR0cF9zY3JpcHRfcmVnZXhfY29kZV90KTsKQEAgLTYzNCw3ICs2ODAsNyBAQAogCiAgICAgICAgIGlmIChjb2RlLT5hZGRfYXJncyAmJiByLT5hcmdzLmxlbikgeyAKICAgICAgICAgICAgICplLT5wb3MrKyA9ICh1X2NoYXIpIChjb2RlLT5hcmdzID8gJyYnIDogJz8nKTsKLSAgICAgICAgICAgIGUtPnBvcyA9IG5neF9jcHltZW0oZS0+cG9zLCByLT5hcmdzLmRhdGEsIHItPmFyZ3MubGVuKTsKKyAgICAgICAgICAgIGUtPnBvcyA9IG5neF9jb3B5KGUtPnBvcywgci0+YXJncy5kYXRhLCByLT5hcmdzLmxlbik7CiAgICAgICAgIH0KIAogICAgICAgICBlLT5idWYubGVuID0gZS0+cG9zIC0gZS0+YnVmLmRhdGE7CkBAIC02NjUsNyArNzExLDcgQEAKIAogICAgICAgICBpZiAoY29kZS0+YWRkX2FyZ3MgJiYgci0+YXJncy5sZW4pIHsKICAgICAgICAgICAgICplLT5wb3MrKyA9ICcmJzsKLSAgICAgICAgICAgIGUtPnBvcyA9IG5neF9jcHltZW0oZS0+cG9zLCByLT5hcmdzLmRhdGEsIHItPmFyZ3MubGVuKTsKKyAgICAgICAgICAgIGUtPnBvcyA9IG5neF9jb3B5KGUtPnBvcywgci0+YXJncy5kYXRhLCByLT5hcmdzLmxlbik7CiAgICAgICAgIH0KIAogICAgICAgICByLT5hcmdzLmxlbiA9IGUtPnBvcyAtIGUtPmFyZ3M7CkBAIC03NDEsNyArNzg3LDcgQEAKIAogICAgIGUtPnNwLS07CiAKLSAgICBpZiAoZS0+c3AtPnZhbHVlKSB7CisgICAgaWYgKGUtPnNwLT5sZW4gJiYgZS0+c3AtPmRhdGFbMF0gIT0gJzAnKSB7CiAgICAgICAgIGlmIChjb2RlLT5sb2NfY29uZikgewogICAgICAgICAgICAgZS0+cmVxdWVzdC0+bG9jX2NvbmYgPSBjb2RlLT5sb2NfY29uZjsKICAgICAgICAgICAgIG5neF9odHRwX3VwZGF0ZV9sb2NhdGlvbl9jb25maWcoZS0+cmVxdWVzdCk7CkBAIC03OTQsOCArODQwLDggQEAKIAogICAgIGUtPnBvcyA9IGUtPmJ1Zi5kYXRhOwogCi0gICAgZS0+c3AtPnZhbHVlID0gMDsKLSAgICBlLT5zcC0+dGV4dCA9IGUtPmJ1ZjsKKyAgICBlLT5zcC0+ZGF0YSA9IGUtPmJ1Zi5kYXRhOworICAgIGUtPnNwLT5sZW4gPSBlLT5idWYubGVuOwogICAgIGUtPnNwKys7CiB9CiAKQEAgLTgxMiw5ICs4NTgsOCBAQAogICAgIG5neF9sb2dfZGVidWcwKE5HWF9MT0dfREVCVUdfSFRUUCwgZS0+cmVxdWVzdC0+Y29ubmVjdGlvbi0+bG9nLCAwLAogICAgICAgICAgICAgICAgICAgICJodHRwIHNjcmlwdCB2YWx1ZSIpOwogCi0gICAgZS0+c3AtPnZhbHVlID0gKG5neF91aW50X3QpIGNvZGUtPnZhbHVlOwotICAgIGUtPnNwLT50ZXh0LmxlbiA9IChzaXplX3QpIGNvZGUtPnRleHRfbGVuOwotICAgIGUtPnNwLT50ZXh0LmRhdGEgPSAodV9jaGFyICopIGNvZGUtPnRleHRfZGF0YTsKKyAgICBlLT5zcC0+bGVuID0gY29kZS0+dGV4dF9sZW47CisgICAgZS0+c3AtPmRhdGEgPSAodV9jaGFyICopIGNvZGUtPnRleHRfZGF0YTsKICAgICBlLT5zcCsrOwogfQogCkBAIC04MjMsOCArODY4LDYgQEAKIG5neF9odHRwX3NjcmlwdF9zZXRfdmFyX2NvZGUobmd4X2h0dHBfc2NyaXB0X2VuZ2luZV90ICplKQogewogICAgIG5neF9odHRwX3JlcXVlc3RfdCAgICAgICAgICAqcjsKLSAgICBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICAgKnZhbHVlOwotICAgIG5neF9odHRwX2NvcmVfbWFpbl9jb25mX3QgICAqY21jZjsKICAgICBuZ3hfaHR0cF9zY3JpcHRfdmFyX2NvZGVfdCAgKmNvZGU7CiAKICAgICBuZ3hfbG9nX2RlYnVnMChOR1hfTE9HX0RFQlVHX0hUVFAsIGUtPnJlcXVlc3QtPmNvbm5lY3Rpb24tPmxvZywgMCwKQEAgLTgzNiwzMCArODc5LDEzIEBACiAKICAgICByID0gZS0+cmVxdWVzdDsKIAotICAgIGlmIChyLT52YXJpYWJsZXMgPT0gTlVMTCkgewotICAgICAgICBjbWNmID0gbmd4X2h0dHBfZ2V0X21vZHVsZV9tYWluX2NvbmYociwgbmd4X2h0dHBfY29yZV9tb2R1bGUpOwotCi0gICAgICAgIHItPnZhcmlhYmxlcyA9IG5neF9wY2FsbG9jKHItPnBvb2wsIGNtY2YtPnZhcmlhYmxlcy5uZWx0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2l6ZW9mKG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgKikpOwotICAgICAgICBpZiAoci0+dmFyaWFibGVzID09IE5VTEwpIHsKLSAgICAgICAgICAgIGUtPmlwID0gbmd4X2h0dHBfc2NyaXB0X2V4aXQ7Ci0gICAgICAgICAgICBlLT5zdGF0dXMgPSBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2YWx1ZSA9IG5neF9wYWxsb2Moci0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QpKTsKLSAgICBpZiAodmFsdWUgPT0gTlVMTCkgewotICAgICAgICBlLT5pcCA9IG5neF9odHRwX3NjcmlwdF9leGl0OwotICAgICAgICBlLT5zdGF0dXMgPSBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KICAgICBlLT5zcC0tOwogCi0gICAgKnZhbHVlID0gKmUtPnNwOwotCi0gICAgci0+dmFyaWFibGVzW2NvZGUtPmluZGV4XSA9IHZhbHVlOworICAgIHItPnZhcmlhYmxlc1tjb2RlLT5pbmRleF0ubGVuID0gZS0+c3AtPmxlbjsKKyAgICByLT52YXJpYWJsZXNbY29kZS0+aW5kZXhdLnZhbGlkID0gMTsKKyAgICByLT52YXJpYWJsZXNbY29kZS0+aW5kZXhdLm5vX2NhY2hhYmxlID0gMDsKKyAgICByLT52YXJpYWJsZXNbY29kZS0+aW5kZXhdLm5vdF9mb3VuZCA9IDA7CisgICAgci0+dmFyaWFibGVzW2NvZGUtPmluZGV4XS5kYXRhID0gZS0+c3AtPmRhdGE7CiB9CiAKIApAQCAtODc2LDIwICs5MDIsMjAgQEAKIAogICAgIGUtPmlwICs9IHNpemVvZihuZ3hfaHR0cF9zY3JpcHRfdmFyX2NvZGVfdCk7CiAKLSAgICB2YWx1ZSA9IG5neF9odHRwX2dldF9pbmRleGVkX3ZhcmlhYmxlKGUtPnJlcXVlc3QsIGNvZGUtPmluZGV4KTsKKyAgICB2YWx1ZSA9IG5neF9odHRwX2dldF9mbHVzaGVkX3ZhcmlhYmxlKGUtPnJlcXVlc3QsIGNvZGUtPmluZGV4KTsKIAotICAgIGlmICh2YWx1ZSAmJiB2YWx1ZSAhPSBOR1hfSFRUUF9WQVJfTk9UX0ZPVU5EKSB7Ci0gICAgICAgIG5neF9sb2dfZGVidWcyKE5HWF9MT0dfREVCVUdfSFRUUCwgZS0+cmVxdWVzdC0+Y29ubmVjdGlvbi0+bG9nLCAwLAotICAgICAgICAgICAgICAgICAgICJodHRwIHNjcmlwdCB2YXI6ICV1aSwgXCIlVlwiIiwgdmFsdWUtPnZhbHVlLCAmdmFsdWUtPnRleHQpOworICAgIGlmICh2YWx1ZSAmJiAhdmFsdWUtPm5vdF9mb3VuZCkgeworICAgICAgICBuZ3hfbG9nX2RlYnVnMShOR1hfTE9HX0RFQlVHX0hUVFAsIGUtPnJlcXVlc3QtPmNvbm5lY3Rpb24tPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgImh0dHAgc2NyaXB0IHZhcjogXCIlVlwiIiwgdmFsdWUpOworCiAgICAgICAgICplLT5zcCA9ICp2YWx1ZTsKICAgICAgICAgZS0+c3ArKzsKIAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgZS0+c3AtPnZhbHVlID0gMDsKLSAgICBlLT5zcC0+dGV4dC5sZW4gPSAwOwotICAgIGUtPnNwLT50ZXh0LmRhdGEgPSAodV9jaGFyICopICIiOworICAgIGUtPnNwLT5kYXRhID0gKHVfY2hhciAqKSAiIjsKKyAgICBlLT5zcC0+bGVuID0gMDsKICAgICBlLT5zcCsrOwogfQogCmRpZmYgLS1naXQgYS9zcmMvaHR0cC9uZ3hfaHR0cF9zY3JpcHQuaCBiL3NyYy9odHRwL25neF9odHRwX3NjcmlwdC5oCmluZGV4IDIxNjI1NDIuLmY2N2I1YmUgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL25neF9odHRwX3NjcmlwdC5oCisrKyBiL3NyYy9odHRwL25neF9odHRwX3NjcmlwdC5oCkBAIC0xNCw0NiArMTQsNDkgQEAKIAogCiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgdV9jaGFyICAgICAgICAgICAgICAgICAgICAgICAgICppcDsKLSAgICB1X2NoYXIgICAgICAgICAgICAgICAgICAgICAgICAgKnBvczsKLSAgICBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICAgICAgKnNwOworICAgIHVfY2hhciAgICAgICAgICAgICAgICAgICAgICppcDsKKyAgICB1X2NoYXIgICAgICAgICAgICAgICAgICAgICAqcG9zOworICAgIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgICpzcDsKIAotICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICAgICAgYnVmOwotICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICAgICAgbGluZTsKKyAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgICAgYnVmOworICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICBsaW5lOwogCiAgICAgLyogdGhlIHN0YXJ0IG9mIHRoZSByZXdyaXR0ZW4gYXJndW1lbnRzICovCi0gICAgdV9jaGFyICAgICAgICAgICAgICAgICAgICAgICAgICphcmdzOworICAgIHVfY2hhciAgICAgICAgICAgICAgICAgICAgICphcmdzOwogCi0gICAgdW5zaWduZWQgICAgICAgICAgICAgICAgICAgICAgICBza2lwOjE7Ci0gICAgdW5zaWduZWQgICAgICAgICAgICAgICAgICAgICAgICBxdW90ZToxOwotICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgICAgICAgbG9nOjE7CisgICAgdW5zaWduZWQgICAgICAgICAgICAgICAgICAgIGZsdXNoZWQ6MTsKKyAgICB1bnNpZ25lZCAgICAgICAgICAgICAgICAgICAgc2tpcDoxOworICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgICBxdW90ZToxOworICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgICBsb2c6MTsKIAotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY2FwdHVyZXM7Ci0gICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgICAgICBuY2FwdHVyZXM7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgKmNhcHR1cmVzOworICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICBuY2FwdHVyZXM7CiAKLSAgICBuZ3hfaW50X3QgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLSAgICBuZ3hfaHR0cF9yZXF1ZXN0X3QgICAgICAgICAgICAgKnJlcXVlc3Q7CisgICAgbmd4X2ludF90ICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKyAgICBuZ3hfaHR0cF9yZXF1ZXN0X3QgICAgICAgICAqcmVxdWVzdDsKIH0gbmd4X2h0dHBfc2NyaXB0X2VuZ2luZV90OwogCiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgICBuZ3hfY29uZl90ICAgICAgICAgICAgICAgICAgICAgKmNmOwotICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICAgICAqc291cmNlOwotICAgIG5neF9hcnJheV90ICAgICAgICAgICAgICAgICAgICoqbGVuZ3RoczsKLSAgICBuZ3hfYXJyYXlfdCAgICAgICAgICAgICAgICAgICAqKnZhbHVlczsKKyAgICBuZ3hfY29uZl90ICAgICAgICAgICAgICAgICAqY2Y7CisgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgKnNvdXJjZTsKIAotICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVzOwotICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICAgICAgbmNhcHR1cmVzOwotICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICAgICAgc2l6ZTsKKyAgICBuZ3hfYXJyYXlfdCAgICAgICAgICAgICAgICoqZmx1c2hlczsKKyAgICBuZ3hfYXJyYXlfdCAgICAgICAgICAgICAgICoqbGVuZ3RoczsKKyAgICBuZ3hfYXJyYXlfdCAgICAgICAgICAgICAgICoqdmFsdWVzOwogCi0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICptYWluOworICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICB2YXJpYWJsZXM7CisgICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgIG5jYXB0dXJlczsKKyAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgc2l6ZTsKIAotICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZV9hcmdzOjE7Ci0gICAgdW5zaWduZWQgICAgICAgICAgICAgICAgICAgICAgICBjb21waWxlX251bGw6MTsKLSAgICB1bnNpZ25lZCAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlX2xlbmd0aHM6MTsKLSAgICB1bnNpZ25lZCAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlX3ZhbHVlczoxOworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICptYWluOwogCi0gICAgdW5zaWduZWQgICAgICAgICAgICAgICAgICAgICAgICBhcmdzOjE7CisgICAgdW5zaWduZWQgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVfYXJnczoxOworICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgICBjb21waWxlX251bGw6MTsKKyAgICB1bnNpZ25lZCAgICAgICAgICAgICAgICAgICAgY29tcGxldGVfbGVuZ3RoczoxOworICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZV92YWx1ZXM6MTsKKworICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgICBhcmdzOjE7CiB9IG5neF9odHRwX3NjcmlwdF9jb21waWxlX3Q7CiAKIApAQCAtMTQ5LDYgKzE1Miw4IEBACiAKIG5neF91aW50X3Qgbmd4X2h0dHBfc2NyaXB0X3ZhcmlhYmxlc19jb3VudChuZ3hfc3RyX3QgKnZhbHVlKTsKIG5neF9pbnRfdCBuZ3hfaHR0cF9zY3JpcHRfY29tcGlsZShuZ3hfaHR0cF9zY3JpcHRfY29tcGlsZV90ICpzYyk7Cit2b2lkIG5neF9odHRwX3NjcmlwdF9mbHVzaF9ub19jYWNoYWJsZV92YXJpYWJsZXMobmd4X2h0dHBfcmVxdWVzdF90ICpyLAorICAgIG5neF9hcnJheV90ICppbmRpY2VzKTsKIAogdm9pZCAqbmd4X2h0dHBfc2NyaXB0X3N0YXJ0X2NvZGUobmd4X3Bvb2xfdCAqcG9vbCwgbmd4X2FycmF5X3QgKipjb2RlcywKICAgICBzaXplX3Qgc2l6ZSk7CmRpZmYgLS1naXQgYS9zcmMvaHR0cC9uZ3hfaHR0cF91cHN0cmVhbS5jIGIvc3JjL2h0dHAvbmd4X2h0dHBfdXBzdHJlYW0uYwppbmRleCA2ZWM5OTMzLi40OGFmNmZlIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9uZ3hfaHR0cF91cHN0cmVhbS5jCisrKyBiL3NyYy9odHRwL25neF9odHRwX3Vwc3RyZWFtLmMKQEAgLTY3LDEyICs2NywyMCBAQAogICAgIHVpbnRwdHJfdCBkYXRhKTsKIHN0YXRpYyB1X2NoYXIgKm5neF9odHRwX3Vwc3RyZWFtX2xvZ19zdGF0dXMobmd4X2h0dHBfcmVxdWVzdF90ICpyLAogICAgIHVfY2hhciAqYnVmLCBuZ3hfaHR0cF9sb2dfb3BfdCAqb3ApOworc3RhdGljIHNpemVfdCBuZ3hfaHR0cF91cHN0cmVhbV9sb2dfcmVzcG9uc2VfdGltZV9nZXRsZW4obmd4X2h0dHBfcmVxdWVzdF90ICpyLAorICAgIHVpbnRwdHJfdCBkYXRhKTsKIHN0YXRpYyB1X2NoYXIgKm5neF9odHRwX3Vwc3RyZWFtX2xvZ19yZXNwb25zZV90aW1lKG5neF9odHRwX3JlcXVlc3RfdCAqciwKICAgICB1X2NoYXIgKmJ1Ziwgbmd4X2h0dHBfbG9nX29wX3QgKm9wKTsKIAogc3RhdGljIHVfY2hhciAqbmd4X2h0dHBfdXBzdHJlYW1fbG9nX2Vycm9yKG5neF9odHRwX3JlcXVlc3RfdCAqciwgdV9jaGFyICpidWYsCiAgICAgc2l6ZV90IGxlbik7Ci1zdGF0aWMgbmd4X2ludF90IG5neF9odHRwX3Vwc3RyZWFtX2FkZF9sb2dfZm9ybWF0cyhuZ3hfY29uZl90ICpjZik7CisKK3N0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfdXBzdHJlYW1fYWRkX3ZhcmlhYmxlcyhuZ3hfY29uZl90ICpjZik7CitzdGF0aWMgbmd4X2ludF90IG5neF9odHRwX3Vwc3RyZWFtX3N0YXR1c192YXJpYWJsZShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCisgICAgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAqdiwgdWludHB0cl90IGRhdGEpOworc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF91cHN0cmVhbV9yZXNwb25zZV90aW1lX3ZhcmlhYmxlKG5neF9odHRwX3JlcXVlc3RfdCAqciwKKyAgICBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICp2LCB1aW50cHRyX3QgZGF0YSk7CisKIHN0YXRpYyB2b2lkICpuZ3hfaHR0cF91cHN0cmVhbV9jcmVhdGVfbWFpbl9jb25mKG5neF9jb25mX3QgKmNmKTsKIHN0YXRpYyBjaGFyICpuZ3hfaHR0cF9jb3JlX2luaXRfbWFpbl9jb25mKG5neF9jb25mX3QgKmNmLCB2b2lkICpjb25mKTsKIApAQCAtMTMzLDYgKzE0MSwxMiBAQAogICAgICAgICAgICAgICAgICBuZ3hfaHR0cF91cHN0cmVhbV9jb3B5X211bHRpX2hlYWRlcl9saW5lcywKICAgICAgICAgICAgICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfaGVhZGVyc19vdXRfdCwgY2FjaGVfY29udHJvbCksIDEgfSwKIAorICAgIHsgbmd4X3N0cmluZygiRXhwaXJlcyIpLAorICAgICAgICAgICAgICAgICBuZ3hfaHR0cF91cHN0cmVhbV9wcm9jZXNzX2hlYWRlcl9saW5lLAorICAgICAgICAgICAgICAgICBvZmZzZXRvZihuZ3hfaHR0cF91cHN0cmVhbV9oZWFkZXJzX2luX3QsIGV4cGlyZXMpLAorICAgICAgICAgICAgICAgICBuZ3hfaHR0cF91cHN0cmVhbV9jb3B5X2hlYWRlcl9saW5lLAorICAgICAgICAgICAgICAgICBvZmZzZXRvZihuZ3hfaHR0cF9oZWFkZXJzX291dF90LCBleHBpcmVzKSwgMSB9LAorCiAgICAgeyBuZ3hfc3RyaW5nKCJDb25uZWN0aW9uIiksCiAgICAgICAgICAgICAgICAgIG5neF9odHRwX3Vwc3RyZWFtX2lnbm9yZV9oZWFkZXJfbGluZSwgMCwKICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1faWdub3JlX2hlYWRlcl9saW5lLCAwLCAwIH0sCkBAIC0xNzMsNyArMTg3LDcgQEAKIAogCiBuZ3hfaHR0cF9tb2R1bGVfdCAgbmd4X2h0dHBfdXBzdHJlYW1fbW9kdWxlX2N0eCA9IHsKLSAgICBuZ3hfaHR0cF91cHN0cmVhbV9hZGRfbG9nX2Zvcm1hdHMsICAgICAvKiBwcmVjb25maWd1cmF0aW9uICovCisgICAgbmd4X2h0dHBfdXBzdHJlYW1fYWRkX3ZhcmlhYmxlcywgICAgICAgLyogcHJlY29uZmlndXJhdGlvbiAqLwogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBvc3Rjb25maWd1cmF0aW9uICovCiAKICAgICBuZ3hfaHR0cF91cHN0cmVhbV9jcmVhdGVfbWFpbl9jb25mLCAgICAvKiBjcmVhdGUgbWFpbiBjb25maWd1cmF0aW9uICovCkBAIC0yMDUsMTQgKzIxOSwyNyBAQAogCiBzdGF0aWMgbmd4X2h0dHBfbG9nX29wX25hbWVfdCBuZ3hfaHR0cF91cHN0cmVhbV9sb2dfZm10X29wc1tdID0gewogICAgIHsgbmd4X3N0cmluZygidXBzdHJlYW1fc3RhdHVzIiksIDAsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1fbG9nX3N0YXR1c19nZXRsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1fbG9nX3N0YXR1cyB9LAotICAgIHsgbmd4X3N0cmluZygidXBzdHJlYW1fcmVzcG9uc2VfdGltZSIpLCBOR1hfVElNRV9UX0xFTiArIDQsIE5VTEwsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1fbG9nX3Jlc3BvbnNlX3RpbWUgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX3Vwc3RyZWFtX2xvZ19zdGF0dXNfZ2V0bGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1fbG9nX3N0YXR1cyB9LAorICAgIHsgbmd4X3N0cmluZygidXBzdHJlYW1fcmVzcG9uc2VfdGltZSIpLCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1fbG9nX3Jlc3BvbnNlX3RpbWVfZ2V0bGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1fbG9nX3Jlc3BvbnNlX3RpbWUgfSwKICAgICB7IG5neF9udWxsX3N0cmluZywgMCwgTlVMTCwgTlVMTCwgTlVMTCB9CiB9OwogCiAKK3N0YXRpYyBuZ3hfaHR0cF92YXJpYWJsZV90ICBuZ3hfaHR0cF91cHN0cmVhbV92YXJzW10gPSB7CisKKyAgICB7IG5neF9zdHJpbmcoInVwc3RyZWFtX3N0YXR1cyIpLAorICAgICAgbmd4X2h0dHBfdXBzdHJlYW1fc3RhdHVzX3ZhcmlhYmxlLCAwLCAwLCAwIH0sCisKKyAgICB7IG5neF9zdHJpbmcoInVwc3RyZWFtX3Jlc3BvbnNlX3RpbWUiKSwKKyAgICAgIG5neF9odHRwX3Vwc3RyZWFtX3Jlc3BvbnNlX3RpbWVfdmFyaWFibGUsIDAsIDAsIDAgfSwKKworICAgIHsgbmd4X251bGxfc3RyaW5nLCBOVUxMLCAwLCAwLCAwIH0KK307CisKKwogY2hhciAqbmd4X2h0dHBfdXBzdHJlYW1faGVhZGVyX2Vycm9yc1tdID0gewogICAgICJ1cHN0cmVhbSBzZW50IGludmFsaWQgaGVhZGVyIiwKICAgICAidXBzdHJlYW0gc2VudCB0b28gbG9uZyBoZWFkZXIgbGluZSIKQEAgLTUwOSwyOSArNTM2LDI3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoci0+cmVxdWVzdF9ib2R5KSB7Ci0gICAgICAgIGlmIChyLT5yZXF1ZXN0X2JvZHktPnRlbXBfZmlsZSAmJiByLT5tYWluID09IHIpIHsKKyAgICBpZiAoci0+cmVxdWVzdF9ib2R5ICYmIHItPnJlcXVlc3RfYm9keS0+dGVtcF9maWxlICYmIHItPm1haW4gPT0gcikgewogCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogdGhlIHItPnJlcXVlc3RfYm9keS0+YnVmIGNhbiBiZSByZXVzZWQgZm9yIG9uZSByZXF1ZXN0IG9ubHksCi0gICAgICAgICAgICAgKiB0aGUgc3VicmVxdWVzdHMgc2hvdWxkIGFsbG9jYXRlIHRoZWlyIG93biB0ZW1wb3JheSBidWZzCi0gICAgICAgICAgICAgKi8KKyAgICAgICAgLyoKKyAgICAgICAgICogdGhlIHItPnJlcXVlc3RfYm9keS0+YnVmIGNhbiBiZSByZXVzZWQgZm9yIG9uZSByZXF1ZXN0IG9ubHksCisgICAgICAgICAqIHRoZSBzdWJyZXF1ZXN0cyBzaG91bGQgYWxsb2NhdGUgdGhlaXIgb3duIHRlbXBvcmF5IGJ1ZnMKKyAgICAgICAgICovCiAKLSAgICAgICAgICAgIHUtPm91dHB1dC5mcmVlID0gbmd4X2FsbG9jX2NoYWluX2xpbmsoci0+cG9vbCk7Ci0gICAgICAgICAgICBpZiAodS0+b3V0cHV0LmZyZWUgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIG5neF9odHRwX3Vwc3RyZWFtX2ZpbmFsaXplX3JlcXVlc3QociwgdSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB1LT5vdXRwdXQuZnJlZS0+YnVmID0gci0+cmVxdWVzdF9ib2R5LT5idWY7Ci0gICAgICAgICAgICB1LT5vdXRwdXQuZnJlZS0+bmV4dCA9IE5VTEw7Ci0gICAgICAgICAgICB1LT5vdXRwdXQuYWxsb2NhdGVkID0gMTsKLQotICAgICAgICAgICAgci0+cmVxdWVzdF9ib2R5LT5idWYtPnBvcyA9IHItPnJlcXVlc3RfYm9keS0+YnVmLT5zdGFydDsKLSAgICAgICAgICAgIHItPnJlcXVlc3RfYm9keS0+YnVmLT5sYXN0ID0gci0+cmVxdWVzdF9ib2R5LT5idWYtPnN0YXJ0OwotICAgICAgICAgICAgci0+cmVxdWVzdF9ib2R5LT5idWYtPnRhZyA9IHUtPm91dHB1dC50YWc7CisgICAgICAgIHUtPm91dHB1dC5mcmVlID0gbmd4X2FsbG9jX2NoYWluX2xpbmsoci0+cG9vbCk7CisgICAgICAgIGlmICh1LT5vdXRwdXQuZnJlZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBuZ3hfaHR0cF91cHN0cmVhbV9maW5hbGl6ZV9yZXF1ZXN0KHIsIHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7CisgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KKworICAgICAgICB1LT5vdXRwdXQuZnJlZS0+YnVmID0gci0+cmVxdWVzdF9ib2R5LT5idWY7CisgICAgICAgIHUtPm91dHB1dC5mcmVlLT5uZXh0ID0gTlVMTDsKKyAgICAgICAgdS0+b3V0cHV0LmFsbG9jYXRlZCA9IDE7CisKKyAgICAgICAgci0+cmVxdWVzdF9ib2R5LT5idWYtPnBvcyA9IHItPnJlcXVlc3RfYm9keS0+YnVmLT5zdGFydDsKKyAgICAgICAgci0+cmVxdWVzdF9ib2R5LT5idWYtPmxhc3QgPSByLT5yZXF1ZXN0X2JvZHktPmJ1Zi0+c3RhcnQ7CisgICAgICAgIHItPnJlcXVlc3RfYm9keS0+YnVmLT50YWcgPSB1LT5vdXRwdXQudGFnOwogICAgIH0KIAogICAgIHUtPnJlcXVlc3Rfc2VudCA9IDA7CkBAIC01NzQsMjAgKzU5OSwxOSBAQAogCiAgICAgLyogcmVpbml0IHRoZSBzdWJyZXF1ZXN0J3Mgbmd4X291dHB1dF9jaGFpbigpIGNvbnRleHQgKi8KIAotICAgIGlmIChyLT5yZXF1ZXN0X2JvZHkpIHsKLSAgICAgICAgaWYgKHItPnJlcXVlc3RfYm9keS0+dGVtcF9maWxlICYmIHItPm1haW4gIT0gciAmJiB1LT5vdXRwdXQuYnVmKSB7Ci0KLSAgICAgICAgICAgIHUtPm91dHB1dC5mcmVlID0gbmd4X2FsbG9jX2NoYWluX2xpbmsoci0+cG9vbCk7Ci0gICAgICAgICAgICBpZiAodS0+b3V0cHV0LmZyZWUgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHUtPm91dHB1dC5mcmVlLT5idWYgPSB1LT5vdXRwdXQuYnVmOwotICAgICAgICAgICAgdS0+b3V0cHV0LmZyZWUtPm5leHQgPSBOVUxMOwotCi0gICAgICAgICAgICB1LT5vdXRwdXQuYnVmLT5wb3MgPSB1LT5vdXRwdXQuYnVmLT5zdGFydDsKLSAgICAgICAgICAgIHUtPm91dHB1dC5idWYtPmxhc3QgPSB1LT5vdXRwdXQuYnVmLT5zdGFydDsKKyAgICBpZiAoci0+cmVxdWVzdF9ib2R5ICYmIHItPnJlcXVlc3RfYm9keS0+dGVtcF9maWxlCisgICAgICAgICYmIHItPm1haW4gIT0gciAmJiB1LT5vdXRwdXQuYnVmKQorICAgIHsKKyAgICAgICAgdS0+b3V0cHV0LmZyZWUgPSBuZ3hfYWxsb2NfY2hhaW5fbGluayhyLT5wb29sKTsKKyAgICAgICAgaWYgKHUtPm91dHB1dC5mcmVlID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgICAgIH0KKworICAgICAgICB1LT5vdXRwdXQuZnJlZS0+YnVmID0gdS0+b3V0cHV0LmJ1ZjsKKyAgICAgICAgdS0+b3V0cHV0LmZyZWUtPm5leHQgPSBOVUxMOworCisgICAgICAgIHUtPm91dHB1dC5idWYtPnBvcyA9IHUtPm91dHB1dC5idWYtPnN0YXJ0OworICAgICAgICB1LT5vdXRwdXQuYnVmLT5sYXN0ID0gdS0+b3V0cHV0LmJ1Zi0+c3RhcnQ7CiAgICAgfQogCiAgICAgdS0+b3V0cHV0LmJ1ZiA9IE5VTEw7CkBAIC02OTAsNyArNzE0LDYgQEAKICAgICAgICAgfQogCiAgICAgICAgIGMtPnRjcF9ub3B1c2ggPSBOR1hfVENQX05PUFVTSF9VTlNFVDsKLSAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICAKICAgICBuZ3hfYWRkX3RpbWVyKGMtPnJlYWQsIHUtPmNvbmYtPnJlYWRfdGltZW91dCk7CkBAIC03NTEsNyArNzc0LDggQEAKIHsKICAgICBzc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgIG47CiAgICAgbmd4X2ludF90ICAgICAgICAgICAgICAgICAgICAgICByYzsKLSAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgICAgIGksIGtleTsKKyAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgICAgICAgKnVyaSwgYXJnczsKKyAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgICAgIGksIGtleSwgZmxhZ3M7CiAgICAgbmd4X2xpc3RfcGFydF90ICAgICAgICAgICAgICAgICpwYXJ0OwogICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICAgICAgICAqaDsKICAgICBuZ3hfY29ubmVjdGlvbl90ICAgICAgICAgICAgICAgKmM7CkBAIC05ODIsOSArMTAwNiwyMSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgbmd4X2h0dHBfaW50ZXJuYWxfcmVkaXJlY3QociwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyLT51cHN0cmVhbS0+aGVhZGVyc19pbi54X2FjY2VsX3JlZGlyZWN0LT52YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICB1cmkgPSAmci0+dXBzdHJlYW0tPmhlYWRlcnNfaW4ueF9hY2NlbF9yZWRpcmVjdC0+dmFsdWU7CisgICAgICAgIGFyZ3MubGVuID0gMDsKKyAgICAgICAgYXJncy5kYXRhID0gTlVMTDsKKyAgICAgICAgZmxhZ3MgPSAwOworCisgICAgICAgIGlmIChuZ3hfaHR0cF9wYXJzZV91bnNhZmVfdXJpKHIsIHVyaSwgJmFyZ3MsICZmbGFncykgIT0gTkdYX09LKSB7CisgICAgICAgICAgICBuZ3hfaHR0cF91cHN0cmVhbV9maW5hbGl6ZV9yZXF1ZXN0KHIsIHUsIE5HWF9IVFRQX05PVF9GT1VORCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoZmxhZ3MgJiBOR1hfSFRUUF9aRVJPX0lOX1VSSSkgeworICAgICAgICAgICAgci0+emVyb19pbl91cmkgPSAxOworICAgICAgICB9CisKKyAgICAgICAgbmd4X2h0dHBfaW50ZXJuYWxfcmVkaXJlY3QociwgdXJpLCAmYXJncyk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTEwNTcsNyArMTA5Myw3IEBACiAKICAgICB1LT5oZWFkZXJfc2VudCA9IDE7CiAKLSAgICBpZiAoci0+cmVxdWVzdF9ib2R5LT50ZW1wX2ZpbGUpIHsKKyAgICBpZiAoci0+cmVxdWVzdF9ib2R5ICYmIHItPnJlcXVlc3RfYm9keS0+dGVtcF9maWxlKSB7CiAgICAgICAgIGZvciAoY2wgPSByLT5wb29sLT5jbGVhbnVwOyBjbDsgY2wgPSBjbC0+bmV4dCkgewogICAgICAgICAgICAgaWYgKGNsLT5oYW5kbGVyID09IG5neF9wb29sX2NsZWFudXBfZmlsZSkgewogICAgICAgICAgICAgICAgIGNsZiA9IGNsLT5kYXRhOwpAQCAtMTU4Niw3ICsxNjIyLDcgQEAKIG5neF9odHRwX3Vwc3RyZWFtX2NvcHlfaGVhZGVyX2xpbmUobmd4X2h0dHBfcmVxdWVzdF90ICpyLCBuZ3hfdGFibGVfZWx0X3QgKmgsCiAgICAgbmd4X3VpbnRfdCBvZmZzZXQpCiB7Ci0gICAgbmd4X3RhYmxlX2VsdF90ICAqaG87CisgICAgbmd4X3RhYmxlX2VsdF90ICAqaG8sICoqcGg7CiAKICAgICBobyA9IG5neF9saXN0X3B1c2goJnItPmhlYWRlcnNfb3V0LmhlYWRlcnMpOwogICAgIGlmIChobyA9PSBOVUxMKSB7CkBAIC0xNTk1LDYgKzE2MzEsMTEgQEAKIAogICAgICpobyA9ICpoOwogCisgICAgaWYgKG9mZnNldCkgeworICAgICAgICBwaCA9IChuZ3hfdGFibGVfZWx0X3QgKiopICgoY2hhciAqKSAmci0+aGVhZGVyc19vdXQgKyBvZmZzZXQpOworICAgICAgICAqcGggPSBobzsKKyAgICB9CisKICAgICByZXR1cm4gTkdYX09LOwogfQogCkBAIC0xODE0LDcgKzE4NTUsNyBAQAogCiAgICAgdSA9IHItPnVwc3RyZWFtOwogCi0gICAgaWYgKHUgPT0gTlVMTCkgeworICAgIGlmICh1ID09IE5VTEwgfHwgdS0+c3RhdGVzLm5lbHRzID09IDApIHsKICAgICAgICAgKmJ1ZiA9ICctJzsKICAgICAgICAgcmV0dXJuIGJ1ZiArIDE7CiAgICAgfQpAQCAtMTg0MCw2ICsxODgxLDE4IEBACiB9CiAKIAorc3RhdGljIHNpemVfdAorbmd4X2h0dHBfdXBzdHJlYW1fbG9nX3Jlc3BvbnNlX3RpbWVfZ2V0bGVuKG5neF9odHRwX3JlcXVlc3RfdCAqciwKKyAgICB1aW50cHRyX3QgZGF0YSkKK3sKKyAgICBpZiAoci0+dXBzdHJlYW0pIHsKKyAgICAgICAgcmV0dXJuIHItPnVwc3RyZWFtLT5zdGF0ZXMubmVsdHMgKiAoTkdYX1RJTUVfVF9MRU4gKyA0ICsgMik7CisgICAgfQorCisgICAgcmV0dXJuIDE7Cit9CisKKwogc3RhdGljIHVfY2hhciAqCiBuZ3hfaHR0cF91cHN0cmVhbV9sb2dfcmVzcG9uc2VfdGltZShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVfY2hhciAqYnVmLAogICAgIG5neF9odHRwX2xvZ19vcF90ICpvcCkKQEAgLTE4NTAsNyArMTkwMyw3IEBACiAKICAgICB1ID0gci0+dXBzdHJlYW07CiAKLSAgICBpZiAodSA9PSBOVUxMKSB7CisgICAgaWYgKHUgPT0gTlVMTCB8fCB1LT5zdGF0ZXMubmVsdHMgPT0gMCkgewogICAgICAgICAqYnVmID0gJy0nOwogICAgICAgICByZXR1cm4gYnVmICsgMTsKICAgICB9CkBAIC0xOTA1LDEwICsxOTU4LDIxIEBACiAKIAogc3RhdGljIG5neF9pbnRfdAotbmd4X2h0dHBfdXBzdHJlYW1fYWRkX2xvZ19mb3JtYXRzKG5neF9jb25mX3QgKmNmKQorbmd4X2h0dHBfdXBzdHJlYW1fYWRkX3ZhcmlhYmxlcyhuZ3hfY29uZl90ICpjZikKIHsKKyAgICBuZ3hfaHR0cF92YXJpYWJsZV90ICAgICAqdmFyLCAqdjsKICAgICBuZ3hfaHR0cF9sb2dfb3BfbmFtZV90ICAqb3A7CiAKKyAgICBmb3IgKHYgPSBuZ3hfaHR0cF91cHN0cmVhbV92YXJzOyB2LT5uYW1lLmxlbjsgdisrKSB7CisgICAgICAgIHZhciA9IG5neF9odHRwX2FkZF92YXJpYWJsZShjZiwgJnYtPm5hbWUsIHYtPmZsYWdzKTsKKyAgICAgICAgaWYgKHZhciA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgdmFyLT5oYW5kbGVyID0gdi0+aGFuZGxlcjsKKyAgICAgICAgdmFyLT5kYXRhID0gdi0+ZGF0YTsKKyAgICB9CisKICAgICBmb3IgKG9wID0gbmd4X2h0dHBfdXBzdHJlYW1fbG9nX2ZtdF9vcHM7IG9wLT5uYW1lLmxlbjsgb3ArKykgeyAvKiB2b2lkICovIH0KICAgICBvcC0+cnVuID0gTlVMTDsKIApAQCAtMTkyNCw2ICsxOTg4LDExOCBAQAogfQogCiAKK3N0YXRpYyBuZ3hfaW50X3QKK25neF9odHRwX3Vwc3RyZWFtX3N0YXR1c192YXJpYWJsZShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCisgICAgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAqdiwgdWludHB0cl90IGRhdGEpCit7CisgICAgdV9jaGFyICAgICAgICAgICAgICAgICAgICAgKnA7CisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgIGxlbjsKKyAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgaTsKKyAgICBuZ3hfaHR0cF91cHN0cmVhbV90ICAgICAgICAqdTsKKyAgICBuZ3hfaHR0cF91cHN0cmVhbV9zdGF0ZV90ICAqc3RhdGU7CisKKyAgICB2LT52YWxpZCA9IDE7CisgICAgdi0+bm9fY2FjaGFibGUgPSAwOworICAgIHYtPm5vdF9mb3VuZCA9IDA7CisKKyAgICB1ID0gci0+dXBzdHJlYW07CisKKyAgICBpZiAodSA9PSBOVUxMIHx8IHUtPnN0YXRlcy5uZWx0cyA9PSAwKSB7CisgICAgICAgIHYtPm5vdF9mb3VuZCA9IDE7CisgICAgICAgIHJldHVybiBOR1hfT0s7CisgICAgfQorCisgICAgbGVuID0gdS0+c3RhdGVzLm5lbHRzICogKDMgKyAyKTsKKworICAgIHAgPSBuZ3hfcGFsbG9jKHItPnBvb2wsIGxlbik7CisgICAgaWYgKHAgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgIH0KKworICAgIHYtPmRhdGEgPSBwOworCisgICAgaSA9IDA7CisgICAgc3RhdGUgPSB1LT5zdGF0ZXMuZWx0czsKKworICAgIGZvciAoIDs7ICkgeworICAgICAgICBpZiAoc3RhdGVbaV0uc3RhdHVzID09IDApIHsKKyAgICAgICAgICAgICpwKysgPSAnLSc7CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHAgPSBuZ3hfc3ByaW50ZihwLCAiJXVpIiwgc3RhdGVbaV0uc3RhdHVzKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgrK2kgPT0gdS0+c3RhdGVzLm5lbHRzKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgICpwKysgPSAnLCc7CisgICAgICAgICpwKysgPSAnICc7CisgICAgfQorCisgICAgdi0+bGVuID0gcCAtIHYtPmRhdGE7CisKKyAgICByZXR1cm4gTkdYX09LOworfQorCisKK3N0YXRpYyBuZ3hfaW50X3QKK25neF9odHRwX3Vwc3RyZWFtX3Jlc3BvbnNlX3RpbWVfdmFyaWFibGUobmd4X2h0dHBfcmVxdWVzdF90ICpyLAorICAgIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgKnYsIHVpbnRwdHJfdCBkYXRhKQoreworICAgIHVfY2hhciAgICAgICAgICAgICAgICAgICAgICpwOworICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICBsZW47CisgICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgIGk7CisgICAgbmd4X2h0dHBfdXBzdHJlYW1fdCAgICAgICAgKnU7CisgICAgbmd4X2h0dHBfdXBzdHJlYW1fc3RhdGVfdCAgKnN0YXRlOworCisgICAgdi0+dmFsaWQgPSAxOworICAgIHYtPm5vX2NhY2hhYmxlID0gMDsKKyAgICB2LT5ub3RfZm91bmQgPSAwOworCisgICAgdSA9IHItPnVwc3RyZWFtOworCisgICAgaWYgKHUgPT0gTlVMTCB8fCB1LT5zdGF0ZXMubmVsdHMgPT0gMCkgeworICAgICAgICB2LT5ub3RfZm91bmQgPSAxOworICAgICAgICByZXR1cm4gTkdYX09LOworICAgIH0KKworICAgIGxlbiA9IHUtPnN0YXRlcy5uZWx0cyAqIChOR1hfVElNRV9UX0xFTiArIDQgKyAyKTsKKworICAgIHAgPSBuZ3hfcGFsbG9jKHItPnBvb2wsIGxlbik7CisgICAgaWYgKHAgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgIH0KKworICAgIHYtPmRhdGEgPSBwOworCisgICAgaSA9IDA7CisgICAgc3RhdGUgPSB1LT5zdGF0ZXMuZWx0czsKKworICAgIGZvciAoIDs7ICkgeworICAgICAgICBpZiAoc3RhdGVbaV0uc3RhdHVzID09IDApIHsKKyAgICAgICAgICAgICpwKysgPSAnLSc7CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHAgPSBuZ3hfc3ByaW50ZihwLCAiJWQuJTAzZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVbaV0ucmVzcG9uc2VfdGltZSAvIDEwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVbaV0ucmVzcG9uc2VfdGltZSAlIDEwMDApOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCsraSA9PSB1LT5zdGF0ZXMubmVsdHMpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgKnArKyA9ICcsJzsKKyAgICAgICAgKnArKyA9ICcgJzsKKyAgICB9CisKKyAgICB2LT5sZW4gPSBwIC0gdi0+ZGF0YTsKKworICAgIHJldHVybiBOR1hfT0s7Cit9CisKKwogc3RhdGljIHZvaWQgKgogbmd4X2h0dHBfdXBzdHJlYW1fY3JlYXRlX21haW5fY29uZihuZ3hfY29uZl90ICpjZikKIHsKZGlmZiAtLWdpdCBhL3NyYy9odHRwL25neF9odHRwX3Vwc3RyZWFtLmggYi9zcmMvaHR0cC9uZ3hfaHR0cF91cHN0cmVhbS5oCmluZGV4IGQ2YjRhNjIuLjAyN2RkNDUgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL25neF9odHRwX3Vwc3RyZWFtLmgKKysrIGIvc3JjL2h0dHAvbmd4X2h0dHBfdXBzdHJlYW0uaApAQCAtODMsNyArODMsNyBAQAogCiAgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWE7CiAgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgICAgICB1cmk7Ci0gICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgICAgICpsb2NhdGlvbjsKKyAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uOwogICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICAgICAgdXJsOyAgLyogdXNlZCBpbiBwcm94eV9yZXdyaXRlX2xvY2F0aW9uICovCiB9IG5neF9odHRwX3Vwc3RyZWFtX2NvbmZfdDsKIApkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbmd4X2h0dHBfdmFyaWFibGVzLmMgYi9zcmMvaHR0cC9uZ3hfaHR0cF92YXJpYWJsZXMuYwppbmRleCBlMzk1NDAwLi4yZmMyZTUwIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9uZ3hfaHR0cF92YXJpYWJsZXMuYworKysgYi9zcmMvaHR0cC9uZ3hfaHR0cF92YXJpYWJsZXMuYwpAQCAtMTAsMzQgKzEwLDMyIEBACiAjaW5jbHVkZSA8bmd4X2h0dHAuaD4KIAogCi1zdGF0aWMgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAqCi0gICAgbmd4X2h0dHBfdmFyaWFibGVfcmVxdWVzdChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVpbnRwdHJfdCBkYXRhKTsKLXN0YXRpYyBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICoKLSAgICBuZ3hfaHR0cF92YXJpYWJsZV9oZWFkZXIobmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1aW50cHRyX3QgZGF0YSk7Ci1zdGF0aWMgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAqCi0gICAgbmd4X2h0dHBfdmFyaWFibGVfaGVhZGVycyhuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVpbnRwdHJfdCBkYXRhKTsKLXN0YXRpYyBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICoKLSAgICBuZ3hfaHR0cF92YXJpYWJsZV91bmtub3duX2hlYWRlcihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVpbnRwdHJfdCBkYXRhKTsKLXN0YXRpYyBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICoKLSAgICBuZ3hfaHR0cF92YXJpYWJsZV9ob3N0KG5neF9odHRwX3JlcXVlc3RfdCAqciwgdWludHB0cl90IGRhdGEpOwotc3RhdGljIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgKgotICAgIG5neF9odHRwX3ZhcmlhYmxlX3JlbW90ZV9hZGRyKG5neF9odHRwX3JlcXVlc3RfdCAqciwgdWludHB0cl90IGRhdGEpOwotc3RhdGljIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgKgotICAgIG5neF9odHRwX3ZhcmlhYmxlX3JlbW90ZV9wb3J0KG5neF9odHRwX3JlcXVlc3RfdCAqciwgdWludHB0cl90IGRhdGEpOwotc3RhdGljIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgKgotICAgIG5neF9odHRwX3ZhcmlhYmxlX3NlcnZlcl9hZGRyKG5neF9odHRwX3JlcXVlc3RfdCAqciwgdWludHB0cl90IGRhdGEpOwotc3RhdGljIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgKgotICAgIG5neF9odHRwX3ZhcmlhYmxlX3NlcnZlcl9wb3J0KG5neF9odHRwX3JlcXVlc3RfdCAqciwgdWludHB0cl90IGRhdGEpOwotc3RhdGljIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgKgotICAgIG5neF9odHRwX3ZhcmlhYmxlX2RvY3VtZW50X3Jvb3Qobmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1aW50cHRyX3QgZGF0YSk7Ci1zdGF0aWMgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAqCi0gICAgbmd4X2h0dHBfdmFyaWFibGVfcmVxdWVzdF9maWxlbmFtZShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVpbnRwdHJfdCBkYXRhKTsKLXN0YXRpYyBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICoKLSAgICBuZ3hfaHR0cF92YXJpYWJsZV9yZXF1ZXN0X21ldGhvZChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVpbnRwdHJfdCBkYXRhKTsKLXN0YXRpYyBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICoKLSAgICBuZ3hfaHR0cF92YXJpYWJsZV9yZW1vdGVfdXNlcihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVpbnRwdHJfdCBkYXRhKTsKLXN0YXRpYyBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICoKLSAgICBuZ3hfaHR0cF92YXJpYWJsZV9zZW50KG5neF9odHRwX3JlcXVlc3RfdCAqciwgdWludHB0cl90IGRhdGEpOworc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF92YXJpYWJsZV9yZXF1ZXN0KG5neF9odHRwX3JlcXVlc3RfdCAqciwKKyAgICBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICp2LCB1aW50cHRyX3QgZGF0YSk7CitzdGF0aWMgbmd4X2ludF90IG5neF9odHRwX3ZhcmlhYmxlX2hlYWRlcihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCisgICAgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAqdiwgdWludHB0cl90IGRhdGEpOworc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF92YXJpYWJsZV9oZWFkZXJzKG5neF9odHRwX3JlcXVlc3RfdCAqciwKKyAgICBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICp2LCB1aW50cHRyX3QgZGF0YSk7CitzdGF0aWMgbmd4X2ludF90IG5neF9odHRwX3ZhcmlhYmxlX3Vua25vd25faGVhZGVyKG5neF9odHRwX3JlcXVlc3RfdCAqciwKKyAgICBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICp2LCB1aW50cHRyX3QgZGF0YSk7CitzdGF0aWMgbmd4X2ludF90IG5neF9odHRwX3ZhcmlhYmxlX2hvc3Qobmd4X2h0dHBfcmVxdWVzdF90ICpyLAorICAgIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgKnYsIHVpbnRwdHJfdCBkYXRhKTsKK3N0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfdmFyaWFibGVfcmVtb3RlX2FkZHIobmd4X2h0dHBfcmVxdWVzdF90ICpyLAorICAgIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgKnYsIHVpbnRwdHJfdCBkYXRhKTsKK3N0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfdmFyaWFibGVfcmVtb3RlX3BvcnQobmd4X2h0dHBfcmVxdWVzdF90ICpyLAorICAgIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgKnYsIHVpbnRwdHJfdCBkYXRhKTsKK3N0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfdmFyaWFibGVfc2VydmVyX2FkZHIobmd4X2h0dHBfcmVxdWVzdF90ICpyLAorICAgIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgKnYsIHVpbnRwdHJfdCBkYXRhKTsKK3N0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfdmFyaWFibGVfc2VydmVyX3BvcnQobmd4X2h0dHBfcmVxdWVzdF90ICpyLAorICAgIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgKnYsIHVpbnRwdHJfdCBkYXRhKTsKK3N0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfdmFyaWFibGVfZG9jdW1lbnRfcm9vdChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCisgICAgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAqdiwgdWludHB0cl90IGRhdGEpOworc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF92YXJpYWJsZV9yZXF1ZXN0X2ZpbGVuYW1lKG5neF9odHRwX3JlcXVlc3RfdCAqciwKKyAgICBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICp2LCB1aW50cHRyX3QgZGF0YSk7CitzdGF0aWMgbmd4X2ludF90IG5neF9odHRwX3ZhcmlhYmxlX3JlcXVlc3RfbWV0aG9kKG5neF9odHRwX3JlcXVlc3RfdCAqciwKKyAgICBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICp2LCB1aW50cHRyX3QgZGF0YSk7CitzdGF0aWMgbmd4X2ludF90IG5neF9odHRwX3ZhcmlhYmxlX3JlbW90ZV91c2VyKG5neF9odHRwX3JlcXVlc3RfdCAqciwKKyAgICBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICp2LCB1aW50cHRyX3QgZGF0YSk7CiAKIAogLyoKQEAgLTk1LDggKzkzLDEzIEBACiAgICAgeyBuZ3hfc3RyaW5nKCJyZXF1ZXN0X3VyaSIpLCBuZ3hfaHR0cF92YXJpYWJsZV9yZXF1ZXN0LAogICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfcmVxdWVzdF90LCB1bnBhcnNlZF91cmkpLCAwLCAwIH0sCiAKKyAgICB7IG5neF9zdHJpbmcoInVyaSIpLCBuZ3hfaHR0cF92YXJpYWJsZV9yZXF1ZXN0LAorICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfcmVxdWVzdF90LCB1cmkpLAorICAgICAgTkdYX0hUVFBfVkFSX05PQ0FDSEFCTEUsIDAgfSwKKwogICAgIHsgbmd4X3N0cmluZygiZG9jdW1lbnRfdXJpIiksIG5neF9odHRwX3ZhcmlhYmxlX3JlcXVlc3QsCi0gICAgICBvZmZzZXRvZihuZ3hfaHR0cF9yZXF1ZXN0X3QsIHVyaSksIDAsIDAgfSwKKyAgICAgIG9mZnNldG9mKG5neF9odHRwX3JlcXVlc3RfdCwgdXJpKSwKKyAgICAgIE5HWF9IVFRQX1ZBUl9OT0NBQ0hBQkxFLCAwIH0sCiAKICAgICB7IG5neF9zdHJpbmcoInJlcXVlc3QiKSwgbmd4X2h0dHBfdmFyaWFibGVfcmVxdWVzdCwKICAgICAgIG9mZnNldG9mKG5neF9odHRwX3JlcXVlc3RfdCwgcmVxdWVzdF9saW5lKSwgMCwgMCB9LApAQCAtMTE3LDEwICsxMjAsNiBAQAogCiAgICAgeyBuZ3hfc3RyaW5nKCJyZW1vdGVfdXNlciIpLCBuZ3hfaHR0cF92YXJpYWJsZV9yZW1vdGVfdXNlciwgMCwgMCwgMCB9LAogCi0gICAgeyBuZ3hfc3RyaW5nKCJzZW50IiksIG5neF9odHRwX3ZhcmlhYmxlX3NlbnQsIDAsIDAsIDAgfSwKLQotICAgIHsgbmd4X3N0cmluZygiYXBhY2hlX3NlbnQiKSwgbmd4X2h0dHBfdmFyaWFibGVfc2VudCwgMSwgMCwgMCB9LAotCiAgICAgeyBuZ3hfbnVsbF9zdHJpbmcsIE5VTEwsIDAsIDAsIDAgfQogfTsKIApAQCAtMjMzLDcgKzIzMiw2IEBACiBuZ3hfaHR0cF9nZXRfaW5kZXhlZF92YXJpYWJsZShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIG5neF91aW50X3QgaW5kZXgpCiB7CiAgICAgbmd4X2h0dHBfdmFyaWFibGVfdCAgICAgICAgKnY7Ci0gICAgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAgKnZ2OwogICAgIG5neF9odHRwX2NvcmVfbWFpbl9jb25mX3QgICpjbWNmOwogCiAgICAgY21jZiA9IG5neF9odHRwX2dldF9tb2R1bGVfbWFpbl9jb25mKHIsIG5neF9odHRwX2NvcmVfbW9kdWxlKTsKQEAgLTI0NCwyNyArMjQyLDQyIEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIGlmIChyLT52YXJpYWJsZXMgJiYgci0+dmFyaWFibGVzW2luZGV4XSkgewotICAgICAgICByZXR1cm4gci0+dmFyaWFibGVzW2luZGV4XTsKKyAgICBpZiAoci0+dmFyaWFibGVzW2luZGV4XS5ub3RfZm91bmQgfHwgci0+dmFyaWFibGVzW2luZGV4XS52YWxpZCkgeworICAgICAgICByZXR1cm4gJnItPnZhcmlhYmxlc1tpbmRleF07CiAgICAgfQogCiAgICAgdiA9IGNtY2YtPnZhcmlhYmxlcy5lbHRzOwogCi0gICAgdnYgPSB2W2luZGV4XS5oYW5kbGVyKHIsIHZbaW5kZXhdLmRhdGEpOworICAgIGlmICh2W2luZGV4XS5oYW5kbGVyKHIsICZyLT52YXJpYWJsZXNbaW5kZXhdLCB2W2luZGV4XS5kYXRhKSA9PSBOR1hfT0spIHsKIAotICAgIGlmIChyLT52YXJpYWJsZXMgPT0gTlVMTCkgewotICAgICAgICByLT52YXJpYWJsZXMgPSBuZ3hfcGNhbGxvYyhyLT5wb29sLCBjbWNmLT52YXJpYWJsZXMubmVsdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICopKTsKLSAgICAgICAgaWYgKHItPnZhcmlhYmxlcyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKHZbaW5kZXhdLmZsYWdzICYgTkdYX0hUVFBfVkFSX05PQ0FDSEFCTEUpIHsKKyAgICAgICAgICAgIHItPnZhcmlhYmxlc1tpbmRleF0ubm9fY2FjaGFibGUgPSAxOwogICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICZyLT52YXJpYWJsZXNbaW5kZXhdOwogICAgIH0KIAotICAgIGlmICghKHZbaW5kZXhdLmZsYWdzICYgTkdYX0hUVFBfVkFSX05PQ0FDSEFCTEUpKSB7Ci0gICAgICAgIHItPnZhcmlhYmxlc1tpbmRleF0gPSB2djsKKyAgICByZXR1cm4gTlVMTDsKK30KKworCituZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICoKK25neF9odHRwX2dldF9mbHVzaGVkX3ZhcmlhYmxlKG5neF9odHRwX3JlcXVlc3RfdCAqciwgbmd4X3VpbnRfdCBpbmRleCkKK3sKKyAgICBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICAgKnY7CisKKyAgICB2ID0gJnItPnZhcmlhYmxlc1tpbmRleF07CisKKyAgICBpZiAodi0+dmFsaWQpIHsKKyAgICAgICAgaWYgKCF2LT5ub19jYWNoYWJsZSkgeworICAgICAgICAgICAgcmV0dXJuIHY7CisgICAgICAgIH0KKworICAgICAgICB2LT52YWxpZCA9IDA7CisgICAgICAgIHYtPm5vdF9mb3VuZCA9IDA7CiAgICAgfQogCi0gICAgcmV0dXJuIHZ2OworICAgIHJldHVybiBuZ3hfaHR0cF9nZXRfaW5kZXhlZF92YXJpYWJsZShyLCBpbmRleCk7CiB9CiAKIApAQCAtMjczLDYgKzI4Niw3IEBACiB7CiAgICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgIGksIGtleTsKICAgICBuZ3hfaHR0cF92YXJpYWJsZV90ICAgICAgICAqdjsKKyAgICBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICAqdnY7CiAgICAgbmd4X2h0dHBfY29yZV9tYWluX2NvbmZfdCAgKmNtY2Y7CiAKICAgICBjbWNmID0gbmd4X2h0dHBfZ2V0X21vZHVsZV9tYWluX2NvbmYociwgbmd4X2h0dHBfY29yZV9tb2R1bGUpOwpAQCAtMjkyLDExMyArMzA2LDEzMyBAQAogICAgICAgICAgICAgcmV0dXJuIG5neF9odHRwX2dldF9pbmRleGVkX3ZhcmlhYmxlKHIsIHZba2V5XS5pbmRleCk7CiAKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiB2W2tleV0uaGFuZGxlcihyLCB2W2tleV0uZGF0YSk7CisKKyAgICAgICAgICAgIHZ2ID0gbmd4X3BhbGxvYyhyLT5wb29sLCBzaXplb2Yobmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCkpOworCisgICAgICAgICAgICBpZiAodnYgJiYgdltrZXldLmhhbmRsZXIociwgdnYsIHZba2V5XS5kYXRhKSA9PSBOR1hfT0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdnY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAgICAgfQogCisgICAgdnYgPSBuZ3hfcGFsbG9jKHItPnBvb2wsIHNpemVvZihuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90KSk7CisgICAgaWYgKHZ2ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCiAgICAgaWYgKG5neF9zdHJuY21wKG5hbWUtPmRhdGEsICJodHRwXyIsIDUpID09IDApIHsKLSAgICAgICAgcmV0dXJuIG5neF9odHRwX3ZhcmlhYmxlX3Vua25vd25faGVhZGVyKHIsICh1aW50cHRyX3QpIG5hbWUpOworCisgICAgICAgIGlmIChuZ3hfaHR0cF92YXJpYWJsZV91bmtub3duX2hlYWRlcihyLCB2diwgKHVpbnRwdHJfdCkgbmFtZSkgPT0gTkdYX09LKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdnY7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfRVJSLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCiAgICAgICAgICAgICAgICAgICAidW5rbm93biBcIiVWXCIgdmFyaWFibGUiLCBuYW1lKTsKIAotICAgIHJldHVybiBOR1hfSFRUUF9WQVJfTk9UX0ZPVU5EOworICAgIHZ2LT5ub3RfZm91bmQgPSAxOworCisgICAgcmV0dXJuIHZ2OwogfQogCiAKLXN0YXRpYyBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICoKLW5neF9odHRwX3ZhcmlhYmxlX3JlcXVlc3Qobmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1aW50cHRyX3QgZGF0YSkKK3N0YXRpYyBuZ3hfaW50X3QKK25neF9odHRwX3ZhcmlhYmxlX3JlcXVlc3Qobmd4X2h0dHBfcmVxdWVzdF90ICpyLCBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICp2LAorICAgIHVpbnRwdHJfdCBkYXRhKQogewotICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICpzOwotICAgIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgICp2djsKKyAgICBuZ3hfc3RyX3QgICpzOwogCiAgICAgcyA9IChuZ3hfc3RyX3QgKikgKChjaGFyICopIHIgKyBkYXRhKTsKIAotICAgIGlmIChzLT5kYXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5HWF9IVFRQX1ZBUl9OT1RfRk9VTkQ7CisgICAgaWYgKHMtPmRhdGEpIHsKKyAgICAgICAgdi0+bGVuID0gcy0+bGVuOworICAgICAgICB2LT52YWxpZCA9IDE7CisgICAgICAgIHYtPm5vX2NhY2hhYmxlID0gMDsKKyAgICAgICAgdi0+bm90X2ZvdW5kID0gMDsKKyAgICAgICAgdi0+ZGF0YSA9IHMtPmRhdGE7CisKKyAgICB9IGVsc2UgeworICAgICAgICB2LT5ub3RfZm91bmQgPSAxOwogICAgIH0KIAotICAgIHZ2ID0gbmd4X3BhbGxvYyhyLT5wb29sLCBzaXplb2Yobmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCkpOwotICAgIGlmICh2diA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHZ2LT52YWx1ZSA9IDA7Ci0gICAgdnYtPnRleHQgPSAqczsKLQotICAgIHJldHVybiB2djsKKyAgICByZXR1cm4gTkdYX09LOwogfQogCiAKLXN0YXRpYyBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICoKLW5neF9odHRwX3ZhcmlhYmxlX2hlYWRlcihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVpbnRwdHJfdCBkYXRhKQorc3RhdGljIG5neF9pbnRfdAorbmd4X2h0dHBfdmFyaWFibGVfaGVhZGVyKG5neF9odHRwX3JlcXVlc3RfdCAqciwgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAqdiwKKyAgICB1aW50cHRyX3QgZGF0YSkKIHsKLSAgICBuZ3hfdGFibGVfZWx0X3QgICAgICAgICAgICAqaDsKLSAgICBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICAqdnY7CisgICAgbmd4X3RhYmxlX2VsdF90ICAqaDsKIAogICAgIGggPSAqKG5neF90YWJsZV9lbHRfdCAqKikgKChjaGFyICopIHIgKyBkYXRhKTsKIAotICAgIGlmIChoID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5HWF9IVFRQX1ZBUl9OT1RfRk9VTkQ7CisgICAgaWYgKGgpIHsKKyAgICAgICAgdi0+bGVuID0gaC0+dmFsdWUubGVuOworICAgICAgICB2LT52YWxpZCA9IDE7CisgICAgICAgIHYtPm5vX2NhY2hhYmxlID0gMDsKKyAgICAgICAgdi0+bm90X2ZvdW5kID0gMDsKKyAgICAgICAgdi0+ZGF0YSA9IGgtPnZhbHVlLmRhdGE7CisKKyAgICB9IGVsc2UgeworICAgICAgICB2LT5ub3RfZm91bmQgPSAxOwogICAgIH0KIAotICAgIHZ2ID0gbmd4X3BhbGxvYyhyLT5wb29sLCBzaXplb2Yobmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCkpOwotICAgIGlmICh2diA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHZ2LT52YWx1ZSA9IDA7Ci0gICAgdnYtPnRleHQgPSBoLT52YWx1ZTsKLQotICAgIHJldHVybiB2djsKKyAgICByZXR1cm4gTkdYX09LOwogfQogCiAKLXN0YXRpYyBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICoKLW5neF9odHRwX3ZhcmlhYmxlX2hlYWRlcnMobmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1aW50cHRyX3QgZGF0YSkKK3N0YXRpYyBuZ3hfaW50X3QKK25neF9odHRwX3ZhcmlhYmxlX2hlYWRlcnMobmd4X2h0dHBfcmVxdWVzdF90ICpyLCBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICp2LAorICAgIHVpbnRwdHJfdCBkYXRhKQogewotICAgIHVfY2hhciAgICAgICAgICAgICAgICAgICAgICAqcDsKLSAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgIGk7Ci0gICAgbmd4X2FycmF5X3QgICAgICAgICAgICAgICAgICphOwotICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICAgICoqaDsKLSAgICBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICAgKnZ2OworICAgIHNpemVfdCAgICAgICAgICAgICBsZW47CisgICAgdV9jaGFyICAgICAgICAgICAgKnA7CisgICAgbmd4X3VpbnRfdCAgICAgICAgIGk7CisgICAgbmd4X2FycmF5X3QgICAgICAgKmE7CisgICAgbmd4X3RhYmxlX2VsdF90ICAqKmg7CiAKICAgICBhID0gKG5neF9hcnJheV90ICopICgoY2hhciAqKSByICsgZGF0YSk7CiAKICAgICBpZiAoYS0+bmVsdHMgPT0gMCkgewotICAgICAgICByZXR1cm4gTkdYX0hUVFBfVkFSX05PVF9GT1VORDsKKyAgICAgICAgdi0+bm90X2ZvdW5kID0gMTsKKyAgICAgICAgcmV0dXJuIE5HWF9PSzsKICAgICB9CiAKLSAgICB2diA9IG5neF9wYWxsb2Moci0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QpKTsKLSAgICBpZiAodnYgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICB2di0+dmFsdWUgPSAwOworICAgIHYtPnZhbGlkID0gMTsKKyAgICB2LT5ub19jYWNoYWJsZSA9IDA7CisgICAgdi0+bm90X2ZvdW5kID0gMDsKIAogICAgIGggPSBhLT5lbHRzOwogCiAgICAgaWYgKGEtPm5lbHRzID09IDEpIHsKLSAgICAgICAgdnYtPnRleHQgPSAoKmgpLT52YWx1ZTsKLSAgICAgICAgcmV0dXJuIHZ2OworICAgICAgICB2LT5sZW4gPSAoKmgpLT52YWx1ZS5sZW47CisgICAgICAgIHYtPmRhdGEgPSAoKmgpLT52YWx1ZS5kYXRhOworCisgICAgICAgIHJldHVybiBOR1hfT0s7CiAgICAgfQogCi0gICAgdnYtPnRleHQubGVuID0gKHNpemVfdCkgLSAoc3NpemVfdCkgKHNpemVvZigiOyAiKSAtIDEpOworICAgIGxlbiA9IChzaXplX3QpIC0gKHNzaXplX3QpIChzaXplb2YoIjsgIikgLSAxKTsKIAogICAgIGZvciAoaSA9IDA7IGkgPCBhLT5uZWx0czsgaSsrKSB7Ci0gICAgICAgIHZ2LT50ZXh0LmxlbiArPSBoW2ldLT52YWx1ZS5sZW4gKyBzaXplb2YoIjsgIikgLSAxOworICAgICAgICBsZW4gKz0gaFtpXS0+dmFsdWUubGVuICsgc2l6ZW9mKCI7ICIpIC0gMTsKICAgICB9CiAKLSAgICB2di0+dGV4dC5kYXRhID0gbmd4X3BhbGxvYyhyLT5wb29sLCB2di0+dGV4dC5sZW4pOwotICAgIGlmICh2di0+dGV4dC5kYXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcCA9IG5neF9wYWxsb2Moci0+cG9vbCwgbGVuKTsKKyAgICBpZiAocCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgfQogCi0gICAgcCA9IHZ2LT50ZXh0LmRhdGE7CisgICAgdi0+bGVuID0gbGVuOworICAgIHYtPmRhdGEgPSBwOwogCiAgICAgZm9yIChpID0gMDsgLyogdm9pZCAqLyA7IGkrKykgewotICAgICAgICBwID0gbmd4X2NweW1lbShwLCBoW2ldLT52YWx1ZS5kYXRhLCBoW2ldLT52YWx1ZS5sZW4pOworICAgICAgICBwID0gbmd4X2NvcHkocCwgaFtpXS0+dmFsdWUuZGF0YSwgaFtpXS0+dmFsdWUubGVuKTsKIAogICAgICAgICBpZiAoaSA9PSBhLT5uZWx0cyAtIDEpIHsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtNDA3LDIwICs0NDEsMjAgQEAKICAgICAgICAgKnArKyA9ICc7JzsgKnArKyA9ICcgJzsKICAgICB9CiAKLSAgICByZXR1cm4gdnY7CisgICAgcmV0dXJuIE5HWF9PSzsKIH0KIAogCi1zdGF0aWMgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAqCi1uZ3hfaHR0cF92YXJpYWJsZV91bmtub3duX2hlYWRlcihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVpbnRwdHJfdCBkYXRhKQorc3RhdGljIG5neF9pbnRfdAorbmd4X2h0dHBfdmFyaWFibGVfdW5rbm93bl9oZWFkZXIobmd4X2h0dHBfcmVxdWVzdF90ICpyLAorICAgIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgKnYsIHVpbnRwdHJfdCBkYXRhKQogewogICAgIG5neF9zdHJfdCAgKnZhciA9IChuZ3hfc3RyX3QgKikgZGF0YTsKIAotICAgIHVfY2hhciAgICAgICAgICAgICAgICAgICAgICBjaDsKLSAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgaSwgbjsKLSAgICBuZ3hfbGlzdF9wYXJ0X3QgICAgICAgICAgICAqcGFydDsKLSAgICBuZ3hfdGFibGVfZWx0X3QgICAgICAgICAgICAqaGVhZGVyOwotICAgIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgICp2djsKKyAgICB1X2NoYXIgICAgICAgICAgICBjaDsKKyAgICBuZ3hfdWludF90ICAgICAgICBpLCBuOworICAgIG5neF9saXN0X3BhcnRfdCAgKnBhcnQ7CisgICAgbmd4X3RhYmxlX2VsdF90ICAqaGVhZGVyOwogCiAgICAgcGFydCA9ICZyLT5oZWFkZXJzX2luLmhlYWRlcnMucGFydDsKICAgICBoZWFkZXIgPSBwYXJ0LT5lbHRzOwpAQCAtNDUzLDgwICs0ODcsNzIgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChuICsgNSA9PSB2YXItPmxlbikgewotICAgICAgICAgICAgdnYgPSBuZ3hfcGFsbG9jKHItPnBvb2wsIHNpemVvZihuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90KSk7Ci0gICAgICAgICAgICBpZiAodnYgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgdi0+bGVuID0gaGVhZGVyW2ldLnZhbHVlLmxlbjsKKyAgICAgICAgICAgIHYtPnZhbGlkID0gMTsKKyAgICAgICAgICAgIHYtPm5vX2NhY2hhYmxlID0gMDsKKyAgICAgICAgICAgIHYtPm5vdF9mb3VuZCA9IDA7CisgICAgICAgICAgICB2LT5kYXRhID0gaGVhZGVyW2ldLnZhbHVlLmRhdGE7CiAKLSAgICAgICAgICAgIHZ2LT52YWx1ZSA9IDA7Ci0gICAgICAgICAgICB2di0+dGV4dCA9IGhlYWRlcltpXS52YWx1ZTsKLSAgICAgICAgICAgIHJldHVybiB2djsKKyAgICAgICAgICAgIHJldHVybiBOR1hfT0s7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gTkdYX0hUVFBfVkFSX05PVF9GT1VORDsKKyAgICB2LT5ub3RfZm91bmQgPSAxOworCisgICAgcmV0dXJuIE5HWF9PSzsKIH0KIAogCi1zdGF0aWMgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAqCi1uZ3hfaHR0cF92YXJpYWJsZV9ob3N0KG5neF9odHRwX3JlcXVlc3RfdCAqciwgdWludHB0cl90IGRhdGEpCitzdGF0aWMgbmd4X2ludF90CituZ3hfaHR0cF92YXJpYWJsZV9ob3N0KG5neF9odHRwX3JlcXVlc3RfdCAqciwgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAqdiwKKyAgICB1aW50cHRyX3QgZGF0YSkKIHsKLSAgICBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICAqdnY7Ci0KLSAgICB2diA9IG5neF9wYWxsb2Moci0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QpKTsKLSAgICBpZiAodnYgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICB2di0+dmFsdWUgPSAwOwotCiAgICAgaWYgKHItPmhlYWRlcnNfaW4uaG9zdCkgewotICAgICAgICB2di0+dGV4dC5sZW4gPSByLT5oZWFkZXJzX2luLmhvc3RfbmFtZV9sZW47Ci0gICAgICAgIHZ2LT50ZXh0LmRhdGEgPSByLT5oZWFkZXJzX2luLmhvc3QtPnZhbHVlLmRhdGE7CisgICAgICAgIHYtPmxlbiA9IHItPmhlYWRlcnNfaW4uaG9zdF9uYW1lX2xlbjsKKyAgICAgICAgdi0+ZGF0YSA9IHItPmhlYWRlcnNfaW4uaG9zdC0+dmFsdWUuZGF0YTsKIAogICAgIH0gZWxzZSB7Ci0gICAgICAgIHZ2LT50ZXh0ID0gci0+c2VydmVyX25hbWU7CisgICAgICAgIHYtPmxlbiA9IHItPnNlcnZlcl9uYW1lLmxlbjsKKyAgICAgICAgdi0+ZGF0YSA9IHItPnNlcnZlcl9uYW1lLmRhdGE7CiAgICAgfQogCi0gICAgcmV0dXJuIHZ2OworICAgIHYtPnZhbGlkID0gMTsKKyAgICB2LT5ub19jYWNoYWJsZSA9IDA7CisgICAgdi0+bm90X2ZvdW5kID0gMDsKKworICAgIHJldHVybiBOR1hfT0s7CiB9CiAKIAotc3RhdGljIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgKgotbmd4X2h0dHBfdmFyaWFibGVfcmVtb3RlX2FkZHIobmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1aW50cHRyX3QgZGF0YSkKK3N0YXRpYyBuZ3hfaW50X3QKK25neF9odHRwX3ZhcmlhYmxlX3JlbW90ZV9hZGRyKG5neF9odHRwX3JlcXVlc3RfdCAqciwKKyAgICBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICp2LCB1aW50cHRyX3QgZGF0YSkKIHsKLSAgICBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICAqdnY7CisgICAgdi0+bGVuID0gci0+Y29ubmVjdGlvbi0+YWRkcl90ZXh0LmxlbjsKKyAgICB2LT52YWxpZCA9IDE7CisgICAgdi0+bm9fY2FjaGFibGUgPSAwOworICAgIHYtPm5vdF9mb3VuZCA9IDA7CisgICAgdi0+ZGF0YSA9IHItPmNvbm5lY3Rpb24tPmFkZHJfdGV4dC5kYXRhOwogCi0gICAgdnYgPSBuZ3hfcGFsbG9jKHItPnBvb2wsIHNpemVvZihuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90KSk7Ci0gICAgaWYgKHZ2ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgdnYtPnZhbHVlID0gMDsKLSAgICB2di0+dGV4dCA9IHItPmNvbm5lY3Rpb24tPmFkZHJfdGV4dDsKLQotICAgIHJldHVybiB2djsKKyAgICByZXR1cm4gTkdYX09LOwogfQogCiAKLXN0YXRpYyBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICoKLW5neF9odHRwX3ZhcmlhYmxlX3JlbW90ZV9wb3J0KG5neF9odHRwX3JlcXVlc3RfdCAqciwgdWludHB0cl90IGRhdGEpCitzdGF0aWMgbmd4X2ludF90CituZ3hfaHR0cF92YXJpYWJsZV9yZW1vdGVfcG9ydChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCisgICAgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAqdiwgdWludHB0cl90IGRhdGEpCiB7Ci0gICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgIHBvcnQ7Ci0gICAgc3RydWN0IHNvY2thZGRyX2luICAgICAgICAgKnNpbjsKLSAgICBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICAqdnY7CisgICAgbmd4X3VpbnRfdCAgICAgICAgICAgcG9ydDsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gICpzaW47CiAKLSAgICB2diA9IG5neF9wYWxsb2Moci0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QpKTsKLSAgICBpZiAodnYgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9CisgICAgdi0+bGVuID0gMDsKKyAgICB2LT52YWxpZCA9IDE7CisgICAgdi0+bm9fY2FjaGFibGUgPSAwOworICAgIHYtPm5vdF9mb3VuZCA9IDA7CiAKLSAgICB2di0+dmFsdWUgPSAwOwotICAgIHZ2LT50ZXh0LmxlbiA9IDA7Ci0KLSAgICB2di0+dGV4dC5kYXRhID0gbmd4X3BhbGxvYyhyLT5wb29sLCBzaXplb2YoIjY1NTM1IikgLSAxKTsKLSAgICBpZiAodnYtPnRleHQuZGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgIHYtPmRhdGEgPSBuZ3hfcGFsbG9jKHItPnBvb2wsIHNpemVvZigiNjU1MzUiKSAtIDEpOworICAgIGlmICh2LT5kYXRhID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICB9CiAKICAgICAvKiBBRl9JTkVUIG9ubHkgKi8KQEAgLTUzNywzNCArNTYzLDI1IEBACiAgICAgICAgIHBvcnQgPSBudG9ocyhzaW4tPnNpbl9wb3J0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgIGlmIChwb3J0ID4gMCAmJiBwb3J0IDwgNjU1MzYpIHsKLSAgICAgICAgICAgIHZ2LT52YWx1ZSA9IHBvcnQ7Ci0gICAgICAgICAgICB2di0+dGV4dC5sZW4gPSBuZ3hfc3ByaW50Zih2di0+dGV4dC5kYXRhLCAiJXVpIiwgcG9ydCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gdnYtPnRleHQuZGF0YTsKKyAgICAgICAgICAgIHYtPmxlbiA9IG5neF9zcHJpbnRmKHYtPmRhdGEsICIldWkiLCBwb3J0KSAtIHYtPmRhdGE7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gdnY7CisgICAgcmV0dXJuIE5HWF9PSzsKIH0KIAogCi1zdGF0aWMgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAqCi1uZ3hfaHR0cF92YXJpYWJsZV9zZXJ2ZXJfYWRkcihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVpbnRwdHJfdCBkYXRhKQorc3RhdGljIG5neF9pbnRfdAorbmd4X2h0dHBfdmFyaWFibGVfc2VydmVyX2FkZHIobmd4X2h0dHBfcmVxdWVzdF90ICpyLAorICAgIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgKnYsIHVpbnRwdHJfdCBkYXRhKQogewotICAgIHNvY2tsZW5fdCAgICAgICAgICAgICAgICAgICBsZW47Ci0gICAgbmd4X2Nvbm5lY3Rpb25fdCAgICAgICAgICAgKmM7Ci0gICAgc3RydWN0IHNvY2thZGRyX2luICAgICAgICAgIHNpbjsKLSAgICBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICAqdnY7CisgICAgc29ja2xlbl90ICAgICAgICAgICAgbGVuOworICAgIG5neF9jb25uZWN0aW9uX3QgICAgKmM7CisgICAgc3RydWN0IHNvY2thZGRyX2luICAgc2luOwogCi0gICAgdnYgPSBuZ3hfcGFsbG9jKHItPnBvb2wsIHNpemVvZihuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90KSk7Ci0gICAgaWYgKHZ2ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgdnYtPnZhbHVlID0gMDsKLQotICAgIHZ2LT50ZXh0LmRhdGEgPSBuZ3hfcGFsbG9jKHItPnBvb2wsIElORVRfQUREUlNUUkxFTik7Ci0gICAgaWYgKHZ2LT50ZXh0LmRhdGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB2LT5kYXRhID0gbmd4X3BhbGxvYyhyLT5wb29sLCBJTkVUX0FERFJTVFJMRU4pOworICAgIGlmICh2LT5kYXRhID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICB9CiAKICAgICBjID0gci0+Y29ubmVjdGlvbjsKQEAgLTU3NCwxNjggKzU5MSwxMjYgQEAKICAgICAgICAgaWYgKGdldHNvY2tuYW1lKGMtPmZkLCAoc3RydWN0IHNvY2thZGRyICopICZzaW4sICZsZW4pID09IC0xKSB7CiAgICAgICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfQ1JJVCwgYy0+bG9nLAogICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfc29ja2V0X2Vycm5vLCAiZ2V0c29ja25hbWUoKSBmYWlsZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICAgICAgfQogCiAgICAgICAgIHItPmluX2FkZHIgPSBzaW4uc2luX2FkZHIuc19hZGRyOwogICAgIH0KIAotICAgIHZ2LT50ZXh0LmxlbiA9IG5neF9pbmV0X250b3AoYy0+bGlzdGVuaW5nLT5mYW1pbHksICZyLT5pbl9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnYtPnRleHQuZGF0YSwgSU5FVF9BRERSU1RSTEVOKTsKKyAgICB2LT5sZW4gPSBuZ3hfaW5ldF9udG9wKGMtPmxpc3RlbmluZy0+ZmFtaWx5LCAmci0+aW5fYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHYtPmRhdGEsIElORVRfQUREUlNUUkxFTik7CisgICAgdi0+dmFsaWQgPSAxOworICAgIHYtPm5vX2NhY2hhYmxlID0gMDsKKyAgICB2LT5ub3RfZm91bmQgPSAwOwogCi0gICAgcmV0dXJuIHZ2OworICAgIHJldHVybiBOR1hfT0s7CiB9CiAKIAotc3RhdGljIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgKgotbmd4X2h0dHBfdmFyaWFibGVfc2VydmVyX3BvcnQobmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1aW50cHRyX3QgZGF0YSkKK3N0YXRpYyBuZ3hfaW50X3QKK25neF9odHRwX3ZhcmlhYmxlX3NlcnZlcl9wb3J0KG5neF9odHRwX3JlcXVlc3RfdCAqciwKKyAgICBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICp2LCB1aW50cHRyX3QgZGF0YSkKIHsKLSAgICBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICAqdnY7CisgICAgdi0+bGVuID0gci0+cG9ydF90ZXh0LT5sZW4gLSAxOworICAgIHYtPnZhbGlkID0gMTsKKyAgICB2LT5ub19jYWNoYWJsZSA9IDA7CisgICAgdi0+bm90X2ZvdW5kID0gMDsKKyAgICB2LT5kYXRhID0gci0+cG9ydF90ZXh0LT5kYXRhICsgMTsKIAotICAgIHZ2ID0gbmd4X3BhbGxvYyhyLT5wb29sLCBzaXplb2Yobmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCkpOwotICAgIGlmICh2diA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHZ2LT52YWx1ZSA9IHItPnBvcnQ7Ci0gICAgdnYtPnRleHQubGVuID0gci0+cG9ydF90ZXh0LT5sZW4gLSAxOwotICAgIHZ2LT50ZXh0LmRhdGEgPSByLT5wb3J0X3RleHQtPmRhdGEgKyAxOwotCi0gICAgcmV0dXJuIHZ2OworICAgIHJldHVybiBOR1hfT0s7CiB9CiAKIAotc3RhdGljIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgKgotbmd4X2h0dHBfdmFyaWFibGVfZG9jdW1lbnRfcm9vdChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVpbnRwdHJfdCBkYXRhKQorc3RhdGljIG5neF9pbnRfdAorbmd4X2h0dHBfdmFyaWFibGVfZG9jdW1lbnRfcm9vdChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCisgICAgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAqdiwgdWludHB0cl90IGRhdGEpCiB7Ci0gICAgbmd4X2h0dHBfY29yZV9sb2NfY29uZl90ICAgKmNsY2Y7Ci0gICAgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAgKnZ2OwotCi0gICAgdnYgPSBuZ3hfcGFsbG9jKHItPnBvb2wsIHNpemVvZihuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90KSk7Ci0gICAgaWYgKHZ2ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQorICAgIG5neF9odHRwX2NvcmVfbG9jX2NvbmZfdCAgKmNsY2Y7CiAKICAgICBjbGNmID0gbmd4X2h0dHBfZ2V0X21vZHVsZV9sb2NfY29uZihyLCBuZ3hfaHR0cF9jb3JlX21vZHVsZSk7CiAKLSAgICB2di0+dmFsdWUgPSAwOwotICAgIHZ2LT50ZXh0ID0gY2xjZi0+cm9vdDsKKyAgICB2LT5sZW4gPSBjbGNmLT5yb290LmxlbjsKKyAgICB2LT52YWxpZCA9IDE7CisgICAgdi0+bm9fY2FjaGFibGUgPSAwOworICAgIHYtPm5vdF9mb3VuZCA9IDA7CisgICAgdi0+ZGF0YSA9IGNsY2YtPnJvb3QuZGF0YTsKIAotICAgIHJldHVybiB2djsKKyAgICByZXR1cm4gTkdYX09LOwogfQogCiAKLXN0YXRpYyBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICoKLW5neF9odHRwX3ZhcmlhYmxlX3JlcXVlc3RfZmlsZW5hbWUobmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1aW50cHRyX3QgZGF0YSkKK3N0YXRpYyBuZ3hfaW50X3QKK25neF9odHRwX3ZhcmlhYmxlX3JlcXVlc3RfZmlsZW5hbWUobmd4X2h0dHBfcmVxdWVzdF90ICpyLAorICAgIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgKnYsIHVpbnRwdHJfdCBkYXRhKQogewotICAgIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgICp2djsKKyAgICBuZ3hfc3RyX3QgIHBhdGg7CiAKLSAgICB2diA9IG5neF9wYWxsb2Moci0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QpKTsKLSAgICBpZiAodnYgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICB2di0+dmFsdWUgPSAwOwotCi0gICAgaWYgKG5neF9odHRwX21hcF91cmlfdG9fcGF0aChyLCAmdnYtPnRleHQsIDApID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKG5neF9odHRwX21hcF91cmlfdG9fcGF0aChyLCAmcGF0aCwgMCkgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgIH0KIAogICAgIC8qIG5neF9odHRwX21hcF91cmlfdG9fcGF0aCgpIGFsbG9jYXRlcyBtZW1vcnkgZm9yIHRlcm1pbmF0aW5nICdcMCcgKi8KIAotICAgIHZ2LT50ZXh0Lmxlbi0tOworICAgIHYtPmxlbiA9IHBhdGgubGVuIC0gMTsKKyAgICB2LT52YWxpZCA9IDE7CisgICAgdi0+bm9fY2FjaGFibGUgPSAwOworICAgIHYtPm5vdF9mb3VuZCA9IDA7CisgICAgdi0+ZGF0YSA9IHBhdGguZGF0YTsKIAotICAgIHJldHVybiB2djsKKyAgICByZXR1cm4gTkdYX09LOwogfQogCiAKLXN0YXRpYyBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICoKLW5neF9odHRwX3ZhcmlhYmxlX3JlcXVlc3RfbWV0aG9kKG5neF9odHRwX3JlcXVlc3RfdCAqciwgdWludHB0cl90IGRhdGEpCitzdGF0aWMgbmd4X2ludF90CituZ3hfaHR0cF92YXJpYWJsZV9yZXF1ZXN0X21ldGhvZChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCisgICAgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAqdiwgdWludHB0cl90IGRhdGEpCiB7Ci0gICAgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAgKnZ2OworICAgIGlmIChyLT5tZXRob2RfbmFtZS5kYXRhKSB7CisgICAgICAgIGlmIChyLT51cHN0cmVhbSAmJiByLT51cHN0cmVhbS0+bWV0aG9kLmxlbikgeworICAgICAgICAgICAgdi0+bGVuID0gci0+dXBzdHJlYW0tPm1ldGhvZC5sZW47CisgICAgICAgICAgICB2LT5kYXRhID0gci0+dXBzdHJlYW0tPm1ldGhvZC5kYXRhOwogCi0gICAgaWYgKHItPm1ldGhvZF9uYW1lLmRhdGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTkdYX0hUVFBfVkFSX05PVF9GT1VORDsKLSAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2LT5sZW4gPSByLT5tZXRob2RfbmFtZS5sZW47CisgICAgICAgICAgICB2LT5kYXRhID0gci0+bWV0aG9kX25hbWUuZGF0YTsKKyAgICAgICAgfQogCi0gICAgdnYgPSBuZ3hfcGFsbG9jKHItPnBvb2wsIHNpemVvZihuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90KSk7Ci0gICAgaWYgKHZ2ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgdnYtPnZhbHVlID0gMDsKLQotICAgIGlmIChyLT51cHN0cmVhbSAmJiByLT51cHN0cmVhbS0+bWV0aG9kLmxlbikgewotICAgICAgICB2di0+dGV4dCA9IHItPnVwc3RyZWFtLT5tZXRob2Q7CisgICAgICAgIHYtPnZhbGlkID0gMTsKKyAgICAgICAgdi0+bm9fY2FjaGFibGUgPSAwOworICAgICAgICB2LT5ub3RfZm91bmQgPSAwOwogCiAgICAgfSBlbHNlIHsKLSAgICAgICAgdnYtPnRleHQgPSByLT5tZXRob2RfbmFtZTsKKyAgICAgICAgdi0+bm90X2ZvdW5kID0gMTsKICAgICB9CiAKLSAgICByZXR1cm4gdnY7CisgICAgcmV0dXJuIE5HWF9PSzsKIH0KIAogCi1zdGF0aWMgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAqCi1uZ3hfaHR0cF92YXJpYWJsZV9yZW1vdGVfdXNlcihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVpbnRwdHJfdCBkYXRhKQorc3RhdGljIG5neF9pbnRfdAorbmd4X2h0dHBfdmFyaWFibGVfcmVtb3RlX3VzZXIobmd4X2h0dHBfcmVxdWVzdF90ICpyLAorICAgIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgKnYsIHVpbnRwdHJfdCBkYXRhKQogewotICAgIG5neF9pbnRfdCAgICAgICAgICAgICAgICAgICByYzsKLSAgICBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICAqdnY7CisgICAgbmd4X2ludF90ICByYzsKIAogICAgIHJjID0gbmd4X2h0dHBfYXV0aF9iYXNpY191c2VyKHIpOwogCiAgICAgaWYgKHJjID09IE5HWF9ERUNMSU5FRCkgewotICAgICAgICByZXR1cm4gTkdYX0hUVFBfVkFSX05PVF9GT1VORDsKKyAgICAgICAgdi0+bm90X2ZvdW5kID0gMTsKKyAgICAgICAgcmV0dXJuIE5HWF9PSzsKICAgICB9CiAKICAgICBpZiAocmMgPT0gTkdYX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgIH0KIAotICAgIHZ2ID0gbmd4X3BhbGxvYyhyLT5wb29sLCBzaXplb2Yobmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCkpOwotICAgIGlmICh2diA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KKyAgICB2LT5sZW4gPSByLT5oZWFkZXJzX2luLnVzZXIubGVuOworICAgIHYtPnZhbGlkID0gMTsKKyAgICB2LT5ub19jYWNoYWJsZSA9IDA7CisgICAgdi0+bm90X2ZvdW5kID0gMDsKKyAgICB2LT5kYXRhID0gci0+aGVhZGVyc19pbi51c2VyLmRhdGE7CiAKLSAgICB2di0+dmFsdWUgPSAwOwotICAgIHZ2LT50ZXh0ID0gci0+aGVhZGVyc19pbi51c2VyOwotCi0gICAgcmV0dXJuIHZ2OwotfQotCi0KLXN0YXRpYyBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICoKLW5neF9odHRwX3ZhcmlhYmxlX3NlbnQobmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1aW50cHRyX3QgZGF0YSkKLXsKLSAgICBvZmZfdCAgICAgICAgICAgICAgICAgICAgICAgc2VudDsKLSAgICB1X2NoYXIgICAgICAgICAgICAgICAgICAgICAqcDsKLSAgICBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICAqdnY7Ci0KLSAgICB2diA9IG5neF9wYWxsb2Moci0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QpKTsKLSAgICBpZiAodnYgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBzZW50ID0gci0+Y29ubmVjdGlvbi0+c2VudDsKLQotICAgIGlmIChkYXRhKSB7Ci0gICAgICAgIHNlbnQgLT0gci0+aGVhZGVyX3NpemU7Ci0KLSAgICAgICAgaWYgKHNlbnQgPCAwKSB7Ci0gICAgICAgICAgICBzZW50ID0gMDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHAgPSBuZ3hfcGFsbG9jKHItPnBvb2wsIE5HWF9PRkZfVF9MRU4pOwotICAgIGlmIChwID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgdnYtPnZhbHVlID0gMDsKLSAgICB2di0+dGV4dC5sZW4gPSBuZ3hfc3ByaW50ZihwLCAiJU8iLCBzZW50KSAtIHA7Ci0gICAgdnYtPnRleHQuZGF0YSA9IHA7Ci0KLSAgICByZXR1cm4gdnY7CisgICAgcmV0dXJuIE5HWF9PSzsKIH0KIAogCmRpZmYgLS1naXQgYS9zcmMvaHR0cC9uZ3hfaHR0cF92YXJpYWJsZXMuaCBiL3NyYy9odHRwL25neF9odHRwX3ZhcmlhYmxlcy5oCmluZGV4IGRmMGZjOWUuLjY3Yjc4MWUgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL25neF9odHRwX3ZhcmlhYmxlcy5oCisrKyBiL3NyYy9odHRwL25neF9odHRwX3ZhcmlhYmxlcy5oCkBAIC0xNCwxOCArMTQsMjIgQEAKICNpbmNsdWRlIDxuZ3hfaHR0cC5oPgogCiAKLSNkZWZpbmUgTkdYX0hUVFBfVkFSX05PVF9GT1VORCAgKG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgKikgLTEKLQotCiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgICAgIHZhbHVlOwotICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICAgICB0ZXh0OworICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgICAgbGVuOjI5OworCisgICAgdW5zaWduZWQgICAgICAgICAgICAgICAgICAgICB2YWxpZDoxOworICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgICAgbm9fY2FjaGFibGU6MTsKKyAgICB1bnNpZ25lZCAgICAgICAgICAgICAgICAgICAgIG5vdF9mb3VuZDoxOworCisgICAgdV9jaGFyICAgICAgICAgICAgICAgICAgICAgICpkYXRhOwogfSBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90OwogCisjZGVmaW5lIG5neF9odHRwX3ZhcmlhYmxlKHYpICAgICB7IHNpemVvZih2KSAtIDEsIDEsIDAsIDAsICh1X2NoYXIgKikgdiB9CisKIHR5cGVkZWYgc3RydWN0IG5neF9odHRwX3ZhcmlhYmxlX3MgIG5neF9odHRwX3ZhcmlhYmxlX3Q7CiAKLXR5cGVkZWYgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAqCi0gICAgKCpuZ3hfaHR0cF9nZXRfdmFyaWFibGVfcHQpIChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVpbnRwdHJfdCBkYXRhKTsKK3R5cGVkZWYgbmd4X2ludF90ICgqbmd4X2h0dHBfZ2V0X3ZhcmlhYmxlX3B0KSAobmd4X2h0dHBfcmVxdWVzdF90ICpyLAorICAgIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgKnYsIHVpbnRwdHJfdCBkYXRhKTsKIAogCiAjZGVmaW5lIE5HWF9IVFRQX1ZBUl9DSEFOR0FCTEUgICAxCkBAIC0zNCwxMSArMzgsMTEgQEAKIAogCiBzdHJ1Y3Qgbmd4X2h0dHBfdmFyaWFibGVfcyB7Ci0gICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgbmFtZTsgICAvKiBtdXN0IGJlIGZpcnN0IHRvIGJ1aWxkIHRoZSBoYXNoICovCi0gICAgbmd4X2h0dHBfZ2V0X3ZhcmlhYmxlX3B0ICAgaGFuZGxlcjsKLSAgICB1aW50cHRyX3QgICAgICAgICAgICAgICAgICBkYXRhOwotICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgIGZsYWdzOwotICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgIGluZGV4OworICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICAgIG5hbWU7ICAgLyogbXVzdCBiZSBmaXJzdCB0byBidWlsZCB0aGUgaGFzaCAqLworICAgIG5neF9odHRwX2dldF92YXJpYWJsZV9wdCAgICAgIGhhbmRsZXI7CisgICAgdWludHB0cl90ICAgICAgICAgICAgICAgICAgICAgZGF0YTsKKyAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgICBmbGFnczsKKyAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgICBpbmRleDsKIH07CiAKIApAQCAtNDcsOSArNTEsMTUgQEAKIG5neF9pbnRfdCBuZ3hfaHR0cF9nZXRfdmFyaWFibGVfaW5kZXgobmd4X2NvbmZfdCAqY2YsIG5neF9zdHJfdCAqbmFtZSk7CiBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICpuZ3hfaHR0cF9nZXRfaW5kZXhlZF92YXJpYWJsZShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCiAgICAgbmd4X3VpbnRfdCBpbmRleCk7CituZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICpuZ3hfaHR0cF9nZXRfZmx1c2hlZF92YXJpYWJsZShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCisgICAgbmd4X3VpbnRfdCBpbmRleCk7CisKIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgKm5neF9odHRwX2dldF92YXJpYWJsZShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCiAgICAgbmd4X3N0cl90ICpuYW1lKTsKIAorI2RlZmluZSBuZ3hfaHR0cF9jbGVhcl92YXJpYWJsZShyLCBpbmRleCkgci0+dmFyaWFibGVzMFtpbmRleF0udGV4dC5kYXRhID0gTlVMTDsKKworCiBuZ3hfaW50X3Qgbmd4X2h0dHBfdmFyaWFibGVzX2FkZF9jb3JlX3ZhcnMobmd4X2NvbmZfdCAqY2YpOwogbmd4X2ludF90IG5neF9odHRwX3ZhcmlhYmxlc19pbml0X3ZhcnMobmd4X2NvbmZfdCAqY2YpOwogCmRpZmYgLS1naXQgYS9zcmMvaW1hcC9uZ3hfaW1hcF9hdXRoX2h0dHBfbW9kdWxlLmMgYi9zcmMvaW1hcC9uZ3hfaW1hcF9hdXRoX2h0dHBfbW9kdWxlLmMKaW5kZXggNGI4NTg0ZC4uZGZlMGMyMCAxMDA2NDQKLS0tIGEvc3JjL2ltYXAvbmd4X2ltYXBfYXV0aF9odHRwX21vZHVsZS5jCisrKyBiL3NyYy9pbWFwL25neF9pbWFwX2F1dGhfaHR0cF9tb2R1bGUuYwpAQCAtMTgsNiArMTgsOSBAQAogCiAgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgICAgICBob3N0X2hlYWRlcjsKICAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgICAgICAgIHVyaTsKKyAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcjsKKworICAgIG5neF9hcnJheV90ICAgICAgICAgICAgICAgICAgICAqaGVhZGVyczsKIH0gbmd4X2ltYXBfYXV0aF9odHRwX2NvbmZfdDsKIAogCkBAIC03MCw2ICs3Myw4IEBACiBzdGF0aWMgY2hhciAqbmd4X2ltYXBfYXV0aF9odHRwX21lcmdlX2NvbmYobmd4X2NvbmZfdCAqY2YsIHZvaWQgKnBhcmVudCwKICAgICB2b2lkICpjaGlsZCk7CiBzdGF0aWMgY2hhciAqbmd4X2ltYXBfYXV0aF9odHRwKG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpjbWQsIHZvaWQgKmNvbmYpOworc3RhdGljIGNoYXIgKm5neF9pbWFwX2F1dGhfaHR0cF9oZWFkZXIobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwKKyAgICB2b2lkICpjb25mKTsKIAogCiBzdGF0aWMgbmd4X2NvbW1hbmRfdCAgbmd4X2ltYXBfYXV0aF9odHRwX2NvbW1hbmRzW10gPSB7CkBAIC04OCw2ICs5MywxMyBAQAogICAgICAgb2Zmc2V0b2Yobmd4X2ltYXBfYXV0aF9odHRwX2NvbmZfdCwgdGltZW91dCksCiAgICAgICBOVUxMIH0sCiAKKyAgICB7IG5neF9zdHJpbmcoImF1dGhfaHR0cF9oZWFkZXIiKSwKKyAgICAgIE5HWF9JTUFQX01BSU5fQ09ORnxOR1hfSU1BUF9TUlZfQ09ORnxOR1hfQ09ORl9UQUtFMiwKKyAgICAgIG5neF9pbWFwX2F1dGhfaHR0cF9oZWFkZXIsCisgICAgICBOR1hfSU1BUF9TUlZfQ09ORl9PRkZTRVQsCisgICAgICAwLAorICAgICAgTlVMTCB9LAorCiAgICAgICBuZ3hfbnVsbF9jb21tYW5kCiB9OwogCkBAIC05OTEsMTIgKzEwMDMsMTIgQEAKICAgICB9CiAKICAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCAiR0VUICIsIHNpemVvZigiR0VUICIpIC0gMSk7Ci0gICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgYWhjZi0+dXJpLmRhdGEsIGFoY2YtPnVyaS5sZW4pOworICAgIGItPmxhc3QgPSBuZ3hfY29weShiLT5sYXN0LCBhaGNmLT51cmkuZGF0YSwgYWhjZi0+dXJpLmxlbik7CiAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgIiBIVFRQLzEuMCIgQ1JMRiwKICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoIiBIVFRQLzEuMCIgQ1JMRikgLSAxKTsKIAogICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsICJIb3N0OiAiLCBzaXplb2YoIkhvc3Q6ICIpIC0gMSk7Ci0gICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgYWhjZi0+aG9zdF9oZWFkZXIuZGF0YSwKKyAgICBiLT5sYXN0ID0gbmd4X2NvcHkoYi0+bGFzdCwgYWhjZi0+aG9zdF9oZWFkZXIuZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICBhaGNmLT5ob3N0X2hlYWRlci5sZW4pOwogICAgICpiLT5sYXN0KysgPSBDUjsgKmItPmxhc3QrKyA9IExGOwogCkBAIC0xMDA0LDExICsxMDE2LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCJBdXRoLU1ldGhvZDogcGxhaW4iIENSTEYpIC0gMSk7CiAKICAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCAiQXV0aC1Vc2VyOiAiLCBzaXplb2YoIkF1dGgtVXNlcjogIikgLSAxKTsKLSAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCBzLT5sb2dpbi5kYXRhLCBzLT5sb2dpbi5sZW4pOworICAgIGItPmxhc3QgPSBuZ3hfY29weShiLT5sYXN0LCBzLT5sb2dpbi5kYXRhLCBzLT5sb2dpbi5sZW4pOwogICAgICpiLT5sYXN0KysgPSBDUjsgKmItPmxhc3QrKyA9IExGOwogCiAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgIkF1dGgtUGFzczogIiwgc2l6ZW9mKCJBdXRoLVBhc3M6ICIpIC0gMSk7Ci0gICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgcy0+cGFzc3dkLmRhdGEsIHMtPnBhc3N3ZC5sZW4pOworICAgIGItPmxhc3QgPSBuZ3hfY29weShiLT5sYXN0LCBzLT5wYXNzd2QuZGF0YSwgcy0+cGFzc3dkLmxlbik7CiAgICAgKmItPmxhc3QrKyA9IENSOyAqYi0+bGFzdCsrID0gTEY7CiAKICAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCAiQXV0aC1Qcm90b2NvbDogIiwKQEAgLTEwMjEsMTAgKzEwMzMsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bG9naW5fYXR0ZW1wdCk7CiAKICAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCAiQ2xpZW50LUlQOiAiLCBzaXplb2YoIkNsaWVudC1JUDogIikgLSAxKTsKLSAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCBzLT5jb25uZWN0aW9uLT5hZGRyX3RleHQuZGF0YSwKKyAgICBiLT5sYXN0ID0gbmd4X2NvcHkoYi0+bGFzdCwgcy0+Y29ubmVjdGlvbi0+YWRkcl90ZXh0LmRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+Y29ubmVjdGlvbi0+YWRkcl90ZXh0Lmxlbik7CiAgICAgKmItPmxhc3QrKyA9IENSOyAqYi0+bGFzdCsrID0gTEY7CiAKKyAgICBpZiAoYWhjZi0+aGVhZGVyLmxlbikgeworICAgICAgICBiLT5sYXN0ID0gbmd4X2NvcHkoYi0+bGFzdCwgYWhjZi0+aGVhZGVyLmRhdGEsIGFoY2YtPmhlYWRlci5sZW4pOworICAgIH0KKwogICAgIC8qIGFkZCAiXHJcbiIgYXQgdGhlIGhlYWRlciBlbmQgKi8KICAgICAqYi0+bGFzdCsrID0gQ1I7ICpiLT5sYXN0KysgPSBMRjsKIApAQCAtMTA2NSw2ICsxMDgxLDExIEBACiAgICAgbmd4X2ltYXBfYXV0aF9odHRwX2NvbmZfdCAqcHJldiA9IHBhcmVudDsKICAgICBuZ3hfaW1hcF9hdXRoX2h0dHBfY29uZl90ICpjb25mID0gY2hpbGQ7CiAKKyAgICB1X2NoYXIgICAgICAgICAgICpwOworICAgIHNpemVfdCAgICAgICAgICAgIGxlbjsKKyAgICBuZ3hfdWludF90ICAgICAgICBpOworICAgIG5neF90YWJsZV9lbHRfdCAgKmhlYWRlcjsKKwogICAgIGlmIChjb25mLT5wZWVycyA9PSBOVUxMKSB7CiAgICAgICAgIGNvbmYtPnBlZXJzID0gcHJldi0+cGVlcnM7CiAgICAgICAgIGNvbmYtPmhvc3RfaGVhZGVyID0gcHJldi0+aG9zdF9oZWFkZXI7CkBAIC0xMDczLDYgKzEwOTQsMzQgQEAKIAogICAgIG5neF9jb25mX21lcmdlX21zZWNfdmFsdWUoY29uZi0+dGltZW91dCwgcHJldi0+dGltZW91dCwgNjAwMDApOwogCisgICAgaWYgKGNvbmYtPmhlYWRlcnMgPT0gTlVMTCkgeworICAgICAgICBjb25mLT5oZWFkZXJzID0gcHJldi0+aGVhZGVyczsKKyAgICAgICAgY29uZi0+aGVhZGVyID0gcHJldi0+aGVhZGVyOworICAgIH0KKworICAgIGlmIChjb25mLT5oZWFkZXJzICYmIGNvbmYtPmhlYWRlci5sZW4gPT0gMCkgeworICAgICAgICBsZW4gPSAwOworICAgICAgICBoZWFkZXIgPSBjb25mLT5oZWFkZXJzLT5lbHRzOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29uZi0+aGVhZGVycy0+bmVsdHM7IGkrKykgeworICAgICAgICAgICAgbGVuICs9IGhlYWRlcltpXS5rZXkubGVuICsgMiArIGhlYWRlcltpXS52YWx1ZS5sZW4gKyAyOworICAgICAgICB9CisKKyAgICAgICAgcCA9IG5neF9wYWxsb2MoY2YtPnBvb2wsIGxlbik7CisgICAgICAgIGlmIChwID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGNvbmYtPmhlYWRlci5sZW4gPSBsZW47CisgICAgICAgIGNvbmYtPmhlYWRlci5kYXRhID0gcDsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29uZi0+aGVhZGVycy0+bmVsdHM7IGkrKykgeworICAgICAgICAgICAgcCA9IG5neF9jcHltZW0ocCwgaGVhZGVyW2ldLmtleS5kYXRhLCBoZWFkZXJbaV0ua2V5Lmxlbik7CisgICAgICAgICAgICAqcCsrID0gJzonOyAqcCsrID0gJyAnOworICAgICAgICAgICAgcCA9IG5neF9jcHltZW0ocCwgaGVhZGVyW2ldLnZhbHVlLmRhdGEsIGhlYWRlcltpXS52YWx1ZS5sZW4pOworICAgICAgICAgICAgKnArKyA9IENSOyAqcCsrID0gTEY7CisgICAgICAgIH0KKyAgICB9CisKICAgICByZXR1cm4gTkdYX0NPTkZfT0s7CiB9CiAKQEAgLTEwODcsNyArMTEzNiw3IEBACiAjaWYgKE5HWF9IQVZFX1VOSVhfRE9NQUlOKQogICAgIG5neF91bml4X2RvbWFpbl91cHN0cmVhbV90ICAgdW5peF91cHN0cmVhbTsKICNlbmRpZgotICAgIAorCiAgICAgdmFsdWUgPSBjZi0+YXJncy0+ZWx0czsKIAogICAgIHVybCA9ICZ2YWx1ZVsxXTsKQEAgLTExNDMsMyArMTE5MiwzMiBAQAogCiAgICAgcmV0dXJuIE5HWF9DT05GX09LOwogfQorCisKK3N0YXRpYyBjaGFyICoKK25neF9pbWFwX2F1dGhfaHR0cF9oZWFkZXIobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwgdm9pZCAqY29uZikKK3sgICAKKyAgICBuZ3hfaW1hcF9hdXRoX2h0dHBfY29uZl90ICphaGNmID0gY29uZjsKKworICAgIG5neF9zdHJfdCAgICAgICAgKnZhbHVlOworICAgIG5neF90YWJsZV9lbHRfdCAgKmhlYWRlcjsKKworICAgIGlmIChhaGNmLT5oZWFkZXJzID09IE5VTEwpIHsKKyAgICAgICAgYWhjZi0+aGVhZGVycyA9IG5neF9hcnJheV9jcmVhdGUoY2YtPnBvb2wsIDEsIHNpemVvZihuZ3hfdGFibGVfZWx0X3QpKTsKKyAgICAgICAgaWYgKGFoY2YtPmhlYWRlcnMgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgICAgICB9CisgICAgfQorCisgICAgaGVhZGVyID0gbmd4X2FycmF5X3B1c2goYWhjZi0+aGVhZGVycyk7CisgICAgaWYgKGhlYWRlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICB9CisKKyAgICB2YWx1ZSA9IGNmLT5hcmdzLT5lbHRzOworCisgICAgaGVhZGVyLT5rZXkgPSB2YWx1ZVsxXTsKKyAgICBoZWFkZXItPnZhbHVlID0gdmFsdWVbMl07CisKKyAgICByZXR1cm4gTkdYX0NPTkZfT0s7Cit9CmRpZmYgLS1naXQgYS9zcmMvaW1hcC9uZ3hfaW1hcF9zc2xfbW9kdWxlLmMgYi9zcmMvaW1hcC9uZ3hfaW1hcF9zc2xfbW9kdWxlLmMKaW5kZXggZDY2M2U4OC4uZjkyZGJhNiAxMDA2NDQKLS0tIGEvc3JjL2ltYXAvbmd4X2ltYXBfc3NsX21vZHVsZS5jCisrKyBiL3NyYy9pbWFwL25neF9pbWFwX3NzbF9tb2R1bGUuYwpAQCAtODMsNiArODMsMTIgQEAKICAgICAgIG5neF9pbWFwX3NzbF9ub3N1cHBvcnRlZCwgMCwgMCwgbmd4X2ltYXBfc3NsX29wZW5zc2wwOTcgfSwKICNlbmRpZgogCisgICAgeyBuZ3hfc3RyaW5nKCJzc2xfc2Vzc2lvbl90aW1lb3V0IiksCisgICAgICBOR1hfSU1BUF9NQUlOX0NPTkZ8TkdYX0lNQVBfU1JWX0NPTkZ8TkdYX0NPTkZfVEFLRTEsCisgICAgICBuZ3hfY29uZl9zZXRfc2VjX3Nsb3QsCisgICAgICBOR1hfSU1BUF9TUlZfQ09ORl9PRkZTRVQsCisgICAgICBvZmZzZXRvZihuZ3hfaW1hcF9zc2xfY29uZl90LCBzZXNzaW9uX3RpbWVvdXQpLAorICAgICAgTlVMTCB9LAogCiAgICAgICBuZ3hfbnVsbF9jb21tYW5kCiB9OwpAQCAtMTQwLDYgKzE0Niw3IEBACiAgICAgICovCiAKICAgICBzY2YtPmVuYWJsZSA9IE5HWF9DT05GX1VOU0VUOworICAgIHNjZi0+c2Vzc2lvbl90aW1lb3V0ID0gTkdYX0NPTkZfVU5TRVQ7CiAgICAgc2NmLT5wcmVmZXJfc2VydmVyX2NpcGhlcnMgPSBOR1hfQ09ORl9VTlNFVDsKIAogICAgIHJldHVybiBzY2Y7CkBAIC0xNjAsNiArMTY3LDkgQEAKICAgICAgICAgcmV0dXJuIE5HWF9DT05GX09LOwogICAgIH0KIAorICAgIG5neF9jb25mX21lcmdlX3ZhbHVlKGNvbmYtPnNlc3Npb25fdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2LT5zZXNzaW9uX3RpbWVvdXQsIDMwMCk7CisKICAgICBuZ3hfY29uZl9tZXJnZV92YWx1ZShjb25mLT5wcmVmZXJfc2VydmVyX2NpcGhlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldi0+cHJlZmVyX3NlcnZlcl9jaXBoZXJzLCAwKTsKIApAQCAtMjI1LDYgKzIzNSw4IEBACiAgICAgU1NMX0NUWF9zZXRfc2Vzc2lvbl9pZF9jb250ZXh0KGNvbmYtPnNzbC5jdHgsIG5neF9pbWFwX3Nlc3Npb25faWRfY3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yobmd4X2ltYXBfc2Vzc2lvbl9pZF9jdHgpIC0gMSk7CiAKKyAgICBTU0xfQ1RYX3NldF90aW1lb3V0KGNvbmYtPnNzbC5jdHgsIGNvbmYtPnNlc3Npb25fdGltZW91dCk7CisKICAgICByZXR1cm4gTkdYX0NPTkZfT0s7CiB9CiAKZGlmZiAtLWdpdCBhL3NyYy9pbWFwL25neF9pbWFwX3NzbF9tb2R1bGUuaCBiL3NyYy9pbWFwL25neF9pbWFwX3NzbF9tb2R1bGUuaAppbmRleCBmZDBjY2FkLi4yYWM5ZjExIDEwMDY0NAotLS0gYS9zcmMvaW1hcC9uZ3hfaW1hcF9zc2xfbW9kdWxlLmgKKysrIGIvc3JjL2ltYXAvbmd4X2ltYXBfc3NsX21vZHVsZS5oCkBAIC0yMiw2ICsyMiw4IEBACiAKICAgICBuZ3hfdWludF90ICAgICAgcHJvdG9jb2xzOwogCisgICAgdGltZV90ICAgICAgICAgIHNlc3Npb25fdGltZW91dDsKKwogICAgIG5neF9zdHJfdCAgICAgICBjZXJ0aWZpY2F0ZTsKICAgICBuZ3hfc3RyX3QgICAgICAgY2VydGlmaWNhdGVfa2V5OwogCmRpZmYgLS1naXQgYS9zcmMvb3MvdW5peC9uZ3hfcHJvY2Vzc19jeWNsZS5jIGIvc3JjL29zL3VuaXgvbmd4X3Byb2Nlc3NfY3ljbGUuYwppbmRleCBlMGY5NjdmLi5kZGMxMGM4IDEwMDY0NAotLS0gYS9zcmMvb3MvdW5peC9uZ3hfcHJvY2Vzc19jeWNsZS5jCisrKyBiL3NyYy9vcy91bml4L25neF9wcm9jZXNzX2N5Y2xlLmMKQEAgLTE1LDkgKzE1LDEwIEBACiBzdGF0aWMgdm9pZCBuZ3hfc3RhcnRfZ2FyYmFnZV9jb2xsZWN0b3Iobmd4X2N5Y2xlX3QgKmN5Y2xlLCBuZ3hfaW50X3QgdHlwZSk7CiBzdGF0aWMgdm9pZCBuZ3hfc2lnbmFsX3dvcmtlcl9wcm9jZXNzZXMobmd4X2N5Y2xlX3QgKmN5Y2xlLCBpbnQgc2lnbm8pOwogc3RhdGljIG5neF91aW50X3Qgbmd4X3JlYXBfY2hpbGRzKG5neF9jeWNsZV90ICpjeWNsZSk7Ci1zdGF0aWMgdm9pZCBuZ3hfbWFzdGVyX2V4aXQobmd4X2N5Y2xlX3QgKmN5Y2xlKTsKK3N0YXRpYyB2b2lkIG5neF9tYXN0ZXJfcHJvY2Vzc19leGl0KG5neF9jeWNsZV90ICpjeWNsZSk7CiBzdGF0aWMgdm9pZCBuZ3hfd29ya2VyX3Byb2Nlc3NfY3ljbGUobmd4X2N5Y2xlX3QgKmN5Y2xlLCB2b2lkICpkYXRhKTsKIHN0YXRpYyB2b2lkIG5neF93b3JrZXJfcHJvY2Vzc19pbml0KG5neF9jeWNsZV90ICpjeWNsZSwgbmd4X3VpbnRfdCBwcmlvcml0eSk7CitzdGF0aWMgdm9pZCBuZ3hfd29ya2VyX3Byb2Nlc3NfZXhpdChuZ3hfY3ljbGVfdCAqY3ljbGUpOwogc3RhdGljIHZvaWQgbmd4X2NoYW5uZWxfaGFuZGxlcihuZ3hfZXZlbnRfdCAqZXYpOwogI2lmIChOR1hfVEhSRUFEUykKIHN0YXRpYyB2b2lkIG5neF93YWtldXBfd29ya2VyX3RocmVhZHMobmd4X2N5Y2xlX3QgKmN5Y2xlKTsKQEAgLTE1Niw3ICsxNTcsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKCFsaXZlICYmIChuZ3hfdGVybWluYXRlIHx8IG5neF9xdWl0KSkgewotICAgICAgICAgICAgbmd4X21hc3Rlcl9leGl0KGN5Y2xlKTsKKyAgICAgICAgICAgIG5neF9tYXN0ZXJfcHJvY2Vzc19leGl0KGN5Y2xlKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChuZ3hfdGVybWluYXRlKSB7CkBAIC0yODMsNyArMjg0LDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG5neF9tYXN0ZXJfZXhpdChjeWNsZSk7CisgICAgICAgICAgICBuZ3hfbWFzdGVyX3Byb2Nlc3NfZXhpdChjeWNsZSk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAobmd4X3JlY29uZmlndXJlKSB7CkBAIC02MjgsNyArNjI5LDcgQEAKIAogCiBzdGF0aWMgdm9pZAotbmd4X21hc3Rlcl9leGl0KG5neF9jeWNsZV90ICpjeWNsZSkKK25neF9tYXN0ZXJfcHJvY2Vzc19leGl0KG5neF9jeWNsZV90ICpjeWNsZSkKIHsKICAgICBuZ3hfdWludF90ICBpOwogCkBAIC02NTgsOCArNjU5LDYgQEAKIHN0YXRpYyB2b2lkCiBuZ3hfd29ya2VyX3Byb2Nlc3NfY3ljbGUobmd4X2N5Y2xlX3QgKmN5Y2xlLCB2b2lkICpkYXRhKQogewotICAgIG5neF91aW50X3QgICAgICAgICBpOwotICAgIG5neF9jb25uZWN0aW9uX3QgICpjOwogI2lmIChOR1hfVEhSRUFEUykKICAgICBuZ3hfaW50X3QgICAgICAgICAgbjsKICAgICBuZ3hfZXJyX3QgICAgICAgICAgZXJyOwpAQCAtNzE3LDI2ICs3MTYsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfTk9USUNFLCBjeWNsZS0+bG9nLCAwLCAiZXhpdGluZyIpOwogCi0KLSNpZiAoTkdYX1RIUkVBRFMpCi0gICAgICAgICAgICBuZ3hfdGVybWluYXRlID0gMTsKLQotICAgICAgICAgICAgbmd4X3dha2V1cF93b3JrZXJfdGhyZWFkcyhjeWNsZSk7Ci0jZW5kaWYKLQotICAgICAgICAgICAgaWYgKG5neF9kZWJ1Z19xdWl0KSB7Ci0gICAgICAgICAgICAgICAgbmd4X2RlYnVnX3BvaW50KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiB3ZSBkbyBub3QgZGVzdHJveSBjeWNsZS0+cG9vbCBoZXJlIGJlY2F1c2UgYSBzaWduYWwgaGFuZGxlcgotICAgICAgICAgICAgICogdGhhdCB1c2VzIGN5Y2xlLT5sb2cgY2FuIGJlIGNhbGxlZCBhdCB0aGlzIHBvaW50Ci0gICAgICAgICAgICAgKi8KLQotI2lmIDAKLSAgICAgICAgICAgIG5neF9kZXN0cm95X3Bvb2woY3ljbGUtPnBvb2wpOwotI2VuZGlmCi0gICAgICAgICAgICBleGl0KDApOworICAgICAgICAgICAgbmd4X3dvcmtlcl9wcm9jZXNzX2V4aXQoY3ljbGUpOwogICAgICAgICB9CiAKICAgICAgICAgbmd4X2xvZ19kZWJ1ZzAoTkdYX0xPR19ERUJVR19FVkVOVCwgY3ljbGUtPmxvZywgMCwgIndvcmtlciBjeWNsZSIpOwpAQCAtNzQ2LDQxICs3MjYsNyBAQAogICAgICAgICBpZiAobmd4X3Rlcm1pbmF0ZSkgewogICAgICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX05PVElDRSwgY3ljbGUtPmxvZywgMCwgImV4aXRpbmciKTsKIAotI2lmIChOR1hfVEhSRUFEUykKLSAgICAgICAgICAgIG5neF93YWtldXBfd29ya2VyX3RocmVhZHMoY3ljbGUpOwotI2VuZGlmCi0KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IG5neF9tb2R1bGVzW2ldOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAobmd4X21vZHVsZXNbaV0tPmV4aXRfcHJvY2VzcykgewotICAgICAgICAgICAgICAgICAgICBuZ3hfbW9kdWxlc1tpXS0+ZXhpdF9wcm9jZXNzKGN5Y2xlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGMgPSBjeWNsZS0+Y29ubmVjdGlvbnM7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY3ljbGUtPmNvbm5lY3Rpb25fbjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNbaV0uZmQgIT0gLTEKLSAgICAgICAgICAgICAgICAgICAgJiYgY1tpXS5yZWFkCi0gICAgICAgICAgICAgICAgICAgICYmICFjW2ldLnJlYWQtPmFjY2VwdAotICAgICAgICAgICAgICAgICAgICAmJiAhY1tpXS5yZWFkLT5jaGFubmVsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0FMRVJULCBjeWNsZS0+bG9nLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcGVuIHNvY2tldCAjJWQgbGVmdCBpbiAldWkgY29ubmVjdGlvbiwgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhYm9ydGluZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY1tpXS5mZCwgaSk7Ci0gICAgICAgICAgICAgICAgICAgIG5neF9hYm9ydCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIHdlIGRvIG5vdCBkZXN0cm95IGN5Y2xlLT5wb29sIGhlcmUgYmVjYXVzZSBhIHNpZ25hbCBoYW5kbGVyCi0gICAgICAgICAgICAgKiB0aGF0IHVzZXMgY3ljbGUtPmxvZyBjYW4gYmUgY2FsbGVkIGF0IHRoaXMgcG9pbnQKLSAgICAgICAgICAgICAqLwotCi0jaWYgMAotICAgICAgICAgICAgbmd4X2Rlc3Ryb3lfcG9vbChjeWNsZS0+cG9vbCk7Ci0jZW5kaWYKLQotICAgICAgICAgICAgZXhpdCgwKTsKKyAgICAgICAgICAgIG5neF93b3JrZXJfcHJvY2Vzc19leGl0KGN5Y2xlKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChuZ3hfcXVpdCkgewpAQCAtOTU3LDYgKzkwMyw1NiBAQAogCiAKIHN0YXRpYyB2b2lkCituZ3hfd29ya2VyX3Byb2Nlc3NfZXhpdChuZ3hfY3ljbGVfdCAqY3ljbGUpCit7CisgICAgbmd4X3VpbnRfdCAgICAgICAgIGk7CisgICAgbmd4X2Nvbm5lY3Rpb25fdCAgKmM7CisKKyNpZiAoTkdYX1RIUkVBRFMpCisgICAgbmd4X3Rlcm1pbmF0ZSA9IDE7CisKKyAgICBuZ3hfd2FrZXVwX3dvcmtlcl90aHJlYWRzKGN5Y2xlKTsKKyNlbmRpZgorCisgICAgZm9yIChpID0gMDsgbmd4X21vZHVsZXNbaV07IGkrKykgeworICAgICAgICBpZiAobmd4X21vZHVsZXNbaV0tPmV4aXRfcHJvY2VzcykgeworICAgICAgICAgICAgbmd4X21vZHVsZXNbaV0tPmV4aXRfcHJvY2VzcyhjeWNsZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjID0gY3ljbGUtPmNvbm5lY3Rpb25zOworICAgIGZvciAoaSA9IDA7IGkgPCBjeWNsZS0+Y29ubmVjdGlvbl9uOyBpKyspIHsKKyAgICAgICAgaWYgKGNbaV0uZmQgIT0gLTEKKyAgICAgICAgICAgICYmIGNbaV0ucmVhZAorICAgICAgICAgICAgJiYgIWNbaV0ucmVhZC0+YWNjZXB0CisgICAgICAgICAgICAmJiAhY1tpXS5yZWFkLT5jaGFubmVsKQorICAgICAgICB7CisgICAgICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfQUxFUlQsIGN5Y2xlLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJvcGVuIHNvY2tldCAjJWQgbGVmdCBpbiAldWkgY29ubmVjdGlvbiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiYWJvcnRpbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjW2ldLmZkLCBpKTsKKyAgICAgICAgICAgIG5neF9hYm9ydCgpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG5neF9kZWJ1Z19xdWl0KSB7CisgICAgICAgIG5neF9kZWJ1Z19wb2ludCgpOworICAgIH0KKworICAgIC8qCisgICAgICogd2UgZG8gbm90IGRlc3Ryb3kgY3ljbGUtPnBvb2wgaGVyZSBiZWNhdXNlIGEgc2lnbmFsIGhhbmRsZXIKKyAgICAgKiB0aGF0IHVzZXMgY3ljbGUtPmxvZyBjYW4gYmUgY2FsbGVkIGF0IHRoaXMgcG9pbnQKKyAgICAgKi8KKworI2lmIDAKKyAgICBuZ3hfZGVzdHJveV9wb29sKGN5Y2xlLT5wb29sKTsKKyNlbmRpZgorCisgICAgZXhpdCgwKTsKK30KKworCitzdGF0aWMgdm9pZAogbmd4X2NoYW5uZWxfaGFuZGxlcihuZ3hfZXZlbnRfdCAqZXYpCiB7CiAgICAgbmd4X2ludF90ICAgICAgICAgIG47Cg==