ZGlmZiAtLWdpdCBhL2F1dG8vY2MvZ2NjIGIvYXV0by9jYy9nY2MKaW5kZXggMmU1OTA2YS4uYzVkYjg1OCAxMDA2NDQKLS0tIGEvYXV0by9jYy9nY2MKKysrIGIvYXV0by9jYy9nY2MKQEAgLTQsNyArNCw3IEBACiAKICMgZ2NjIDIuNy4yLjMsIDIuOC4xLCAyLjk1LjQsIGVnY3MtMS4xLjIKICMgICAgIDMuMC40LCAzLjEuMSwgMy4yLjMsIDMuMy4yLCAzLjMuMywgMy4zLjQsIDMuNC4wLCAzLjQuMgotIyAgICAgNC4wLjAKKyMgICAgIDQuMC4wLCA0LjAuMSwgNC4xLjAKIAogCiBOR1hfR0NDX1ZFUj1gJENDIC12IDI+JjEgfCBncmVwICdnY2MgdmVyc2lvbicgMj4mMSBcCkBAIC01Nyw2ICs1NywxMSBAQAogICAgICAgICBDUFVfT1BUPSItbWFyY2g9cGVudGl1bTQiCiAgICAgOzsKIAorICAgIGF0aGxvbikKKyAgICAgICAgIyBvcHRpbWl6ZSBmb3IgQXRobG9uLCBnY2MgMy54CisgICAgICAgIENQVV9PUFQ9Ii1tYXJjaD1hdGhsb24iCisgICAgOzsKKwogICAgIG9wdGVyb24pCiAgICAgICAgICMgb3B0aW1pemUgZm9yIE9wdGVyb24sIGdjYyAzLngKICAgICAgICAgQ1BVX09QVD0iLW1hcmNoPW9wdGVyb24iCmRpZmYgLS1naXQgYS9hdXRvL2NjL2ljYyBiL2F1dG8vY2MvaWNjCmluZGV4IGEwZjY3NmUuLjFjNTljNTUgMTAwNjQ0Ci0tLSBhL2F1dG8vY2MvaWNjCisrKyBiL2F1dG8vY2MvaWNjCkBAIC00LDYgKzQsMTIgQEAKIAogIyBJbnRlbCBDKysgY29tcGlsZXIgNy4xLCA4LjAsIDguMQogCitOR1hfSUNDX1ZFUj1gJENDIC1WIDI+JjEgfCBncmVwICdWZXJzaW9uJyAyPiYxIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICB8IHNlZCAtZSAncy9eLiogVmVyc2lvbiBcKC4qXCkgICBCdWlsZC4qJC9cMS8nYAorCitlY2hvICIgKyBpY2MgdmVyc2lvbjogJE5HWF9JQ0NfVkVSIgorCisKICMgb3B0aW1pemF0aW9ucwogCiBDRkxBR1M9IiRDRkxBR1MgLU8iCkBAIC03Miw4ICs3OCw2IEBACiBDRkxBR1M9IiRDRkxBR1MgLXdkODEwIgogIyBwYXJhbWV0ZXIgd2FzIG5ldmVyIHJlZmVyZW5jZWQKIENGTEFHUz0iJENGTEFHUyAtd2Q4NjkiCi0jICJjYyIgY2xvYmJlciBpZ25vcmVkLCB3YXJuaW5ncyBmb3IgTGl1bngncyBodG9ucygpCi1DRkxBR1M9IiRDRkxBR1MgLXdkMTQ2OSIKIAogIyBTVFVCCiAjIGVudW1lcmF0ZWQgdHlwZSBtaXhlZCB3aXRoIGFub3RoZXIgdHlwZQpAQCAtODYsOCArOTAsMjAgQEAKIENGTEFHUz0iJENGTEFHUyAtd2QxNDE4IgogIyBleHRlcm5hbCBkZWNsYXJhdGlvbiBpbiBwcmltYXJ5IHNvdXJjZSBmaWxlCiBDRkxBR1M9IiRDRkxBR1MgLXdkMTQxOSIKLSMgbm9uLVBPRCBjbGFzcyB0eXBlIHBhc3NlZCB0aHJvdWdoIGVsbGlwc2lzCi1DRkxBR1M9IiRDRkxBR1MgLXdkMTU5NSIKKworY2FzZSAiJE5HWF9JQ0NfVkVSIiBpbgorICAgIDguKikKKyAgICAgICAgIyAiY2MiIGNsb2JiZXIgaWdub3JlZCwgd2FybmluZ3MgZm9yIExpdW54J3MgaHRvbnMoKQorICAgICAgICBDRkxBR1M9IiRDRkxBR1MgLXdkMTQ2OSIKKworICAgICAgICAjIFNUVUIKKyAgICAgICAgIyBub24tUE9EIGNsYXNzIHR5cGUgcGFzc2VkIHRocm91Z2ggZWxsaXBzaXMKKyAgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC13ZDE1OTUiCisgICAgOzsKKworICAgICopCisgICAgOzsKK2VzYWMKIAogIyBzdG9wIG9uIHdhcm5pbmcKIENGTEFHUz0iJENGTEFHUyAtV2Vycm9yIgpkaWZmIC0tZ2l0IGEvYXV0by9tb2R1bGVzIGIvYXV0by9tb2R1bGVzCmluZGV4IGIwMzJmMDUuLmRjY2I3YTcgMTAwNjQ0Ci0tLSBhL2F1dG8vbW9kdWxlcworKysgYi9hdXRvL21vZHVsZXMKQEAgLTUxLDYgKzUxLDEyIEBACiBmaQogCiAKK2lmIFsgJEhUVFAgIT0gWUVTIF07IHRoZW4KKyAgICBoYXZlPU5HWF9DUllQVCAuIGF1dG8vbm9oYXZlCisgICAgQ1JZUFRfTElCPQorZmkKKworCiBpZiBbICRIVFRQX1NTSSA9IFlFUyBdOyB0aGVuCiAgICAgSFRUUF9QT1NUUE9ORT1ZRVMKIGZpCkBAIC0yMTksMTAgKzIyNSwxNCBAQAogZmkKIAogCi1JTUFQX01PRFVMRVM9JElNQVBfTU9EVUxFCi0KIGlmIFsgJElNQVAgPSBZRVMgXTsgdGhlbgogICAgIG1vZHVsZXM9IiRtb2R1bGVzICRJTUFQX01PRFVMRVMiCisKKyAgICBtb2R1bGVzPSIkbW9kdWxlcyAkSU1BUF9BVVRIX0hUVFBfTU9EVUxFIgorICAgIElNQVBfU1JDUz0iJElNQVBfU1JDUyAkSU1BUF9BVVRIX0hUVFBfU1JDUyIKKworICAgIG1vZHVsZXM9IiRtb2R1bGVzICRJTUFQX1BST1hZX01PRFVMRSIKKyAgICBJTUFQX1NSQ1M9IiRJTUFQX1NSQ1MgJElNQVBfUFJPWFlfU1JDUyIKIGZpCiAKIApkaWZmIC0tZ2l0IGEvYXV0by9zb3VyY2VzIGIvYXV0by9zb3VyY2VzCmluZGV4IGU1OTdmOTcuLjA1ODg5ZjMgMTAwNjQ0Ci0tLSBhL2F1dG8vc291cmNlcworKysgYi9hdXRvL3NvdXJjZXMKQEAgLTMzOSw4ICszMzksMTUgQEAKIAogSU1BUF9ERVBTPSJzcmMvaW1hcC9uZ3hfaW1hcC5oIgogCi1JTUFQX01PRFVMRT1uZ3hfaW1hcF9tb2R1bGUKK0lNQVBfTU9EVUxFUz0ibmd4X2ltYXBfbW9kdWxlIG5neF9pbWFwX2NvcmVfbW9kdWxlIgorCiBJTUFQX1NSQ1M9InNyYy9pbWFwL25neF9pbWFwLmMgXAorICAgICAgICAgICBzcmMvaW1hcC9uZ3hfaW1hcF9jb3JlX21vZHVsZS5jIFwKICAgICAgICAgICAgc3JjL2ltYXAvbmd4X2ltYXBfaGFuZGxlci5jIFwKLSAgICAgICAgICAgc3JjL2ltYXAvbmd4X2ltYXBfcGFyc2UuYyBcCi0gICAgICAgICAgIHNyYy9pbWFwL25neF9pbWFwX3Byb3h5LmMiCisgICAgICAgICAgIHNyYy9pbWFwL25neF9pbWFwX3BhcnNlLmMiCisKK0lNQVBfQVVUSF9IVFRQX01PRFVMRT0ibmd4X2ltYXBfYXV0aF9odHRwX21vZHVsZSIKK0lNQVBfQVVUSF9IVFRQX1NSQ1M9InNyYy9pbWFwL25neF9pbWFwX2F1dGhfaHR0cF9tb2R1bGUuYyIKKworSU1BUF9QUk9YWV9NT0RVTEU9Im5neF9pbWFwX3Byb3h5X21vZHVsZSIKK0lNQVBfUFJPWFlfU1JDUz0ic3JjL2ltYXAvbmd4X2ltYXBfcHJveHlfbW9kdWxlLmMiCmRpZmYgLS1naXQgYS9kb2NzL3htbC9uZ2lueC9jaGFuZ2VzLnhtbCBiL2RvY3MveG1sL25naW54L2NoYW5nZXMueG1sCmluZGV4IDQ5MzhkNDYuLjQwYzM4ZGMgMTAwNjQ0Ci0tLSBhL2RvY3MveG1sL25naW54L2NoYW5nZXMueG1sCisrKyBiL2RvY3MveG1sL25naW54L2NoYW5nZXMueG1sCkBAIC05LDYgKzksNzggQEAKIDx0aXRsZSBsYW5nPSJlbiI+bmdpbnggY2hhbmdlbG9nPC90aXRsZT4KIAogCis8Y2hhbmdlcyB2ZXI9IjAuMS4zNSIgZGF0ZT0iMDcuMDYuMjAwNSI+CisKKzxjaGFuZ2UgdHlwZT0iZmVhdHVyZSI+Cis8cGFyYSBsYW5nPSJydSI+CivEydLFy9TJ18Egd29ya2luZ19kaXJlY3RvcnkuCis8L3BhcmE+Cis8cGFyYSBsYW5nPSJlbiI+Cit0aGUgIndvcmtpbmdfZGlyZWN0b3J5IiBkaXJlY3RpdmUuCis8L3BhcmE+Cis8L2NoYW5nZT4KKworPGNoYW5nZSB0eXBlPSJmZWF0dXJlIj4KKzxwYXJhIGxhbmc9InJ1Ij4KK8TJ0sXL1MnXwSBwb3J0X2luX3JlZGlyZWN0LgorPC9wYXJhPgorPHBhcmEgbGFuZz0iZW4iPgordGhlICJwb3J0X2luX3JlZGlyZWN0IiBkaXJlY3RpdmUuCis8L3BhcmE+Cis8L2NoYW5nZT4KKworPGNoYW5nZSB0eXBlPSJidWdmaXgiPgorPHBhcmEgbGFuZz0icnUiPgorxdPMySDawcfPzM/Xz8sgz9TXxdTBIMLcy8XOxMEgzsUg0M/Nxd3BzNPRINcgz8TJziDQwcvF1Cwg1M8KK9DSz8nTyM/Eycwgc2VnbWVudGF0aW9uIGZhdWx0Oworz9vJwsvBINDP0dfJzMHT2CDXIDAuMS4yOS4KKzwvcGFyYT4KKzxwYXJhIGxhbmc9ImVuIj4KK3RoZSBzZWdtZW50YXRpb24gZmF1bHQgd2FzIG9jY3VycmVkIGlmIHRoZSBiYWNrZW5kIHJlc3BvbnNlIGhlYWRlciB3YXMgaW4KK3NldmVyYWwgcGFja2V0czsKK2J1ZyBhcHBlYXJlZCBpbiAwLjEuMjkuCis8L3BhcmE+Cis8L2NoYW5nZT4KKworPGNoYW5nZSB0eXBlPSJidWdmaXgiPgorPHBhcmEgbGFuZz0icnUiPgorxdPMySDC2czPINPLz87GycfV0snSz9fBzs8gws/MxcUgMTAg08XS18XSz9cgyczJINcg08XS18XSxSDOxSDP0MnTwc7BCivEydLFy9TJ18EgImxpc3RlbiIsCivUzyDQ0skg2sHQ1dPLxSDNz8cg0NLPydrPytTJIHNlZ21lbnRhdGlvbiBmYXVsdC4KKzwvcGFyYT4KKzxwYXJhIGxhbmc9ImVuIj4KK2lmIG1vcmUgdGhhbiAxMCBzZXJ2ZXJzIHdlcmUgY29uZmlndXJlZCBvciBzb21lIHNlcnZlciBkaWQgbm90IHVzZSB0aGUKKyJsaXN0ZW4iIGRpcmVjdGl2ZSwgdGhlbiB0aGUgc2VnbWVudGF0aW9uIGZhdWx0IHdhcyBvY2N1cnJlZCBvbiB0aGUgc3RhcnQuCis8L3BhcmE+Cis8L2NoYW5nZT4KKworPGNoYW5nZSB0eXBlPSJidWdmaXgiPgorPHBhcmEgbGFuZz0icnUiPgorxdPMySDP1NfF1CDOxSDQz83F3cHM09Eg188g19LFzcXOztnKIMbByswsCivUzyDNz8cg0NLPydrPytTJIHNlZ21lbnRhdGlvbiBmYXVsdC4KKzwvcGFyYT4KKzxwYXJhIGxhbmc9ImVuIj4KK3RoZSBzZWdtZW50YXRpb24gZmF1bHQgbWlnaHQgb2NjdXIgaWYgdGhlIHJlc3BvbnNlIHdhcyBiaWdnZXIgdGhhbgordGhlIHRlbXBvcmFyeSBmaWxlLgorPC9wYXJhPgorPC9jaGFuZ2U+CisKKzxjaGFuZ2UgdHlwZT0iYnVnZml4Ij4KKzxwYXJhIGxhbmc9InJ1Ij4KK25naW54INfP2tfSwd3BzCDP28nCy9UgNDAwIM7BINrB0NLP09kg18nEwQorPG5vYnI+IkdFVCBodHRwOi8vd3d3LmRvbWFpbi5jb20vdXJpIEhUVFAvMS4wIjwvbm9icj47CivP28nCy8Eg0M/R18nMwdPYINcgMC4xLjI4LgorPC9wYXJhPgorPHBhcmEgbGFuZz0iZW4iPgorbmdpbnggcmV0dXJuZWQgdGhlIDQwMCByZXNwb25zZSBvbiByZXF1ZXN0cyBsaWtlCis8bm9icj4iR0VUIGh0dHA6Ly93d3cuZG9tYWluLmNvbS91cmkgSFRUUC8xLjAiPC9ub2JyPjsKK2J1ZyBhcHBlYXJlZCBpbiAwLjEuMjguCis8L3BhcmE+Cis8L2NoYW5nZT4KKworPC9jaGFuZ2VzPgorCisKIDxjaGFuZ2VzIHZlcj0iMC4xLjM0IiBkYXRlPSIyNi4wNS4yMDA1Ij4KIAogPGNoYW5nZSB0eXBlPSJidWdmaXgiPgpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbmdpbnguYyBiL3NyYy9jb3JlL25naW54LmMKaW5kZXggN2I5OGUxMi4uNGEwMWFjZCAxMDA2NDQKLS0tIGEvc3JjL2NvcmUvbmdpbnguYworKysgYi9zcmMvY29yZS9uZ2lueC5jCkBAIC05NSw2ICs5NSwxMyBAQAogICAgICAgb2Zmc2V0b2Yobmd4X2NvcmVfY29uZl90LCBwaWQpLAogICAgICAgTlVMTCB9LAogCisgICAgeyBuZ3hfc3RyaW5nKCJ3b3JraW5nX2RpcmVjdG9yeSIpLAorICAgICAgTkdYX01BSU5fQ09ORnxOR1hfRElSRUNUX0NPTkZ8TkdYX0NPTkZfVEFLRTEsCisgICAgICBuZ3hfY29uZl9zZXRfc3RyX3Nsb3QsCisgICAgICAwLAorICAgICAgb2Zmc2V0b2Yobmd4X2NvcmVfY29uZl90LCB3b3JraW5nX2RpcmVjdG9yeSksCisgICAgICBOVUxMIH0sCisKICAgICAgIG5neF9udWxsX2NvbW1hbmQKIH07CiAKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL25naW54LmggYi9zcmMvY29yZS9uZ2lueC5oCmluZGV4IDFhMDhjNDIuLjk0YjZkYTMgMTAwNjQ0Ci0tLSBhL3NyYy9jb3JlL25naW54LmgKKysrIGIvc3JjL2NvcmUvbmdpbnguaApAQCAtOCw3ICs4LDcgQEAKICNkZWZpbmUgX05HSU5YX0hfSU5DTFVERURfCiAKIAotI2RlZmluZSBOR0lOWF9WRVIgICAgICAgICAgIm5naW54LzAuMS4zNCIKKyNkZWZpbmUgTkdJTlhfVkVSICAgICAgICAgICJuZ2lueC8wLjEuMzUiCiAKICNkZWZpbmUgTkdJTlhfVkFSICAgICAgICAgICJOR0lOWCIKICNkZWZpbmUgTkdYX05FV1BJRF9FWFQgICAgICIubmV3YmluIgpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbmd4X2Nvbm5lY3Rpb24uYyBiL3NyYy9jb3JlL25neF9jb25uZWN0aW9uLmMKaW5kZXggNDI2ODE1Ny4uZmY5YzE2NCAxMDA2NDQKLS0tIGEvc3JjL2NvcmUvbmd4X2Nvbm5lY3Rpb24uYworKysgYi9zcmMvY29yZS9uZ3hfY29ubmVjdGlvbi5jCkBAIC0xMiw5ICsxMiw4IEBACiBuZ3hfb3NfaW9fdCAgbmd4X2lvOwogCiAKLW5neF9saXN0ZW5pbmdfdCAqbmd4X2xpc3RlbmluZ19pbmV0X3N0cmVhbV9zb2NrZXQobmd4X2NvbmZfdCAqY2YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluX2FkZHJfdCBhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9wb3J0X3QgcG9ydCkKK25neF9saXN0ZW5pbmdfdCAqCituZ3hfbGlzdGVuaW5nX2luZXRfc3RyZWFtX3NvY2tldChuZ3hfY29uZl90ICpjZiwgaW5fYWRkcl90IGFkZHIsIGluX3BvcnRfdCBwb3J0KQogewogICAgIHNpemVfdCAgICAgICAgICAgICAgIGxlbjsKICAgICBuZ3hfbGlzdGVuaW5nX3QgICAgICpsczsKQEAgLTYwLDcgKzU5LDggQEAKIH0KIAogCi1uZ3hfaW50X3Qgbmd4X3NldF9pbmhlcml0ZWRfc29ja2V0cyhuZ3hfY3ljbGVfdCAqY3ljbGUpCituZ3hfaW50X3QKK25neF9zZXRfaW5oZXJpdGVkX3NvY2tldHMobmd4X2N5Y2xlX3QgKmN5Y2xlKQogewogICAgIHNpemVfdCAgICAgICAgICAgICAgIGxlbjsKICAgICBuZ3hfdWludF90ICAgICAgICAgICBpOwpAQCAtMTIxLDcgKzEyMSw4IEBACiB9CiAKIAotbmd4X2ludF90IG5neF9vcGVuX2xpc3RlbmluZ19zb2NrZXRzKG5neF9jeWNsZV90ICpjeWNsZSkKK25neF9pbnRfdAorbmd4X29wZW5fbGlzdGVuaW5nX3NvY2tldHMobmd4X2N5Y2xlX3QgKmN5Y2xlKQogewogICAgIG5neF91aW50X3QgICAgICAgIHRyaWVzLCBmYWlsZWQsIHJldXNlYWRkciwgaTsKICAgICBuZ3hfZXJyX3QgICAgICAgICBlcnI7CkBAIC0yNjEsNyArMjYyLDggQEAKIH0KIAogCi12b2lkIG5neF9jbG9zZV9saXN0ZW5pbmdfc29ja2V0cyhuZ3hfY3ljbGVfdCAqY3ljbGUpCit2b2lkCituZ3hfY2xvc2VfbGlzdGVuaW5nX3NvY2tldHMobmd4X2N5Y2xlX3QgKmN5Y2xlKQogewogICAgIG5neF91aW50X3QgICAgICAgIGk7CiAgICAgbmd4X3NvY2tldF90ICAgICAgZmQ7CkBAIC0zMDksNyArMzExLDggQEAKIH0KIAogCi12b2lkIG5neF9jbG9zZV9jb25uZWN0aW9uKG5neF9jb25uZWN0aW9uX3QgKmMpCit2b2lkCituZ3hfY2xvc2VfY29ubmVjdGlvbihuZ3hfY29ubmVjdGlvbl90ICpjKQogewogICAgIG5neF9zb2NrZXRfdCAgZmQ7CiAKQEAgLTM5OCw3ICs0MDEsOCBAQAogfQogCiAKLW5neF9pbnRfdCBuZ3hfY29ubmVjdGlvbl9lcnJvcihuZ3hfY29ubmVjdGlvbl90ICpjLCBuZ3hfZXJyX3QgZXJyLCBjaGFyICp0ZXh0KQorbmd4X2ludF90CituZ3hfY29ubmVjdGlvbl9lcnJvcihuZ3hfY29ubmVjdGlvbl90ICpjLCBuZ3hfZXJyX3QgZXJyLCBjaGFyICp0ZXh0KQogewogICAgIG5neF91aW50X3QgIGxldmVsOwogCmRpZmYgLS1naXQgYS9zcmMvY29yZS9uZ3hfY29ubmVjdGlvbi5oIGIvc3JjL2NvcmUvbmd4X2Nvbm5lY3Rpb24uaAppbmRleCBiYmNhMzJiLi44ZmI2NzA1IDEwMDY0NAotLS0gYS9zcmMvY29yZS9uZ3hfY29ubmVjdGlvbi5oCisrKyBiL3NyYy9jb3JlL25neF9jb25uZWN0aW9uLmgKQEAgLTE0NCw4ICsxNDQsNyBAQAogCiAKIG5neF9saXN0ZW5pbmdfdCAqbmd4X2xpc3RlbmluZ19pbmV0X3N0cmVhbV9zb2NrZXQobmd4X2NvbmZfdCAqY2YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5fYWRkcl90IGFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5fcG9ydF90IHBvcnQpOworICAgIGluX2FkZHJfdCBhZGRyLCBpbl9wb3J0X3QgcG9ydCk7CiBuZ3hfaW50X3Qgbmd4X3NldF9pbmhlcml0ZWRfc29ja2V0cyhuZ3hfY3ljbGVfdCAqY3ljbGUpOwogbmd4X2ludF90IG5neF9vcGVuX2xpc3RlbmluZ19zb2NrZXRzKG5neF9jeWNsZV90ICpjeWNsZSk7CiB2b2lkIG5neF9jbG9zZV9saXN0ZW5pbmdfc29ja2V0cyhuZ3hfY3ljbGVfdCAqY3ljbGUpOwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbmd4X2N5Y2xlLmggYi9zcmMvY29yZS9uZ3hfY3ljbGUuaAppbmRleCBiMWI1MzQ4Li42ZWQ3NTNhIDEwMDY0NAotLS0gYS9zcmMvY29yZS9uZ3hfY3ljbGUuaAorKysgYi9zcmMvY29yZS9uZ3hfY3ljbGUuaApAQCAtNTcsNiArNTcsOCBAQAogICAgICBuZ3hfdWlkX3QgICAgICAgICAgICAgICAgdXNlcjsKICAgICAgbmd4X2dpZF90ICAgICAgICAgICAgICAgIGdyb3VwOwogCisgICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICB3b3JraW5nX2RpcmVjdG9yeTsKKwogICAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgcGlkOwogICAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgbmV3cGlkOwogCmRpZmYgLS1naXQgYS9zcmMvY29yZS9uZ3hfc3RyaW5nLmMgYi9zcmMvY29yZS9uZ3hfc3RyaW5nLmMKaW5kZXggMDMwN2JiMS4uYWNjNGJkMyAxMDA2NDQKLS0tIGEvc3JjL2NvcmUvbmd4X3N0cmluZy5jCisrKyBiL3NyYy9jb3JlL25neF9zdHJpbmcuYwpAQCAtNzkyLDggKzc5MiwzMCBAQAogICAgICAgICAgIDB4ZmZmZmZmZmYsIC8qIDExMTEgMTExMSAxMTExIDExMTEgIDExMTEgMTExMSAxMTExIDExMTEgKi8KICAgICAgICAgICAweGZmZmZmZmZmICAvKiAxMTExIDExMTEgMTExMSAxMTExICAxMTExIDExMTEgMTExMSAxMTExICovIH07CiAKKyAgICAgICAgICAgICAgICAgICAgICAvKiAiICIsICIiIiwgIiUiLCAiJyIsICUwMC0lMUYsICU3Ri0lRkYgKi8KKworICAgIHN0YXRpYyB1aW50MzJfdCAgIHV0ZltdID0KKyAgICAgICAgeyAweGZmZmZmZmZmLCAvKiAxMTExIDExMTEgMTExMSAxMTExICAxMTExIDExMTEgMTExMSAxMTExICovCisKKyAgICAgICAgICAgICAgICAgICAgICAvKiA/Pj08IDs6OTggNzY1NCAzMjEwICAvLi0sICsqKSggJyYlJCAjIiEgICovCisgICAgICAgICAgMHg4MDAwMDBhZCwgLyogMDAwMCAwMDAwIDAwMDAgMDAwMCAgMDAwMCAwMDAwIDEwMTAgMTEwMSAqLworCisgICAgICAgICAgICAgICAgICAgICAgLyogX15dXCBbWllYIFdWVVQgU1JRUCAgT05NTCBLSklIIEdGRUQgQ0JBQCAqLworICAgICAgICAgIDB4MDAwMDAwMDAsIC8qIDAwMDAgMDAwMCAwMDAwIDAwMDAgIDAwMDAgMDAwMCAwMDAwIDAwMDAgKi8KKworICAgICAgICAgICAgICAgICAgICAgIC8qICB+fXwge3p5eCB3dnV0IHNycXAgIG9ubWwga2ppaCBnZmVkIGNiYWAgKi8KKyAgICAgICAgICAweDgwMDAwMDAwLCAvKiAxMDAwIDAwMDAgMDAwMCAwMDAwICAwMDAwIDAwMDAgMDAwMCAwMDAwICovCisKKyAgICAgICAgICAweDAwMDAwMDAwLCAvKiAwMDAwIDAwMDAgMDAwMCAwMDAwICAwMDAwIDAwMDAgMDAwMCAwMDAwICovCisgICAgICAgICAgMHgwMDAwMDAwMCwgLyogMDAwMCAwMDAwIDAwMDAgMDAwMCAgMDAwMCAwMDAwIDAwMDAgMDAwMCAqLworICAgICAgICAgIDB4MDAwMDAwMDAsIC8qIDAwMDAgMDAwMCAwMDAwIDAwMDAgIDAwMDAgMDAwMCAwMDAwIDAwMDAgKi8KKyAgICAgICAgICAweDAwMDAwMDAwICAvKiAwMDAwIDAwMDAgMDAwMCAwMDAwICAwMDAwIDAwMDAgMDAwMCAwMDAwICovIH07CisKIAogICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgTkdYX0VTQ0FQRV9VVEY6CisgICAgICAgIGVzY2FwZSA9IHV0ZjsKKyAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBOR1hfRVNDQVBFX0hUTUw6CiAgICAgICAgIGVzY2FwZSA9IGh0bWw7CiAgICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbmd4X3N0cmluZy5oIGIvc3JjL2NvcmUvbmd4X3N0cmluZy5oCmluZGV4IGM3MmE3NzYuLmUyZTIwZTEgMTAwNjQ0Ci0tLSBhL3NyYy9jb3JlL25neF9zdHJpbmcuaAorKysgYi9zcmMvY29yZS9uZ3hfc3RyaW5nLmgKQEAgLTEwMCw2ICsxMDAsNyBAQAogI2RlZmluZSBOR1hfRVNDQVBFX1VSSSAgIDAKICNkZWZpbmUgTkdYX0VTQ0FQRV9BUkdTICAxCiAjZGVmaW5lIE5HWF9FU0NBUEVfSFRNTCAgMgorI2RlZmluZSBOR1hfRVNDQVBFX1VURiAgIDMKIAogdWludHB0cl90IG5neF9lc2NhcGVfdXJpKHVfY2hhciAqZHN0LCB1X2NoYXIgKnNyYywgc2l6ZV90IHNpemUsCiAgICAgbmd4X3VpbnRfdCB0eXBlKTsKZGlmZiAtLWdpdCBhL3NyYy9ldmVudC9uZ3hfZXZlbnRfcGlwZS5jIGIvc3JjL2V2ZW50L25neF9ldmVudF9waXBlLmMKaW5kZXggNWQyNjQwNS4uZTE4NjIxMSAxMDA2NDQKLS0tIGEvc3JjL2V2ZW50L25neF9ldmVudF9waXBlLmMKKysrIGIvc3JjL2V2ZW50L25neF9ldmVudF9waXBlLmMKQEAgLTIxMCw2ICsyMTAsMTAgQEAKICAgICAgICAgICAgICAgICBuZ3hfbG9nX2RlYnVnMShOR1hfTE9HX0RFQlVHX0VWRU5ULCBwLT5sb2csIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBpcGUgdGVtcCBvZmZzZXQ6ICVPIiwgcC0+dGVtcF9maWxlLT5vZmZzZXQpOwogCisgICAgICAgICAgICAgICAgaWYgKHJjID09IE5HWF9CVVNZKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIGlmIChyYyA9PSBOR1hfQUdBSU4pIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKG5neF9ldmVudF9mbGFncyAmIE5HWF9VU0VfTEVWRUxfRVZFTlQKICAgICAgICAgICAgICAgICAgICAgICAgICYmIHAtPnVwc3RyZWFtLT5yZWFkLT5hY3RpdmUKQEAgLTYxNyw2ICs2MjEsMTAgQEAKIAogICAgICAgICBuZ3hfbG9nX2RlYnVnMShOR1hfTE9HX0RFQlVHX0VWRU5ULCBwLT5sb2csIDAsICJzaXplOiAleiIsIHNpemUpOwogCisgICAgICAgIGlmIChsbCA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTkdYX0JVU1k7CisgICAgICAgIH0KKwogICAgICAgICBpZiAoY2wpIHsKICAgICAgICAgICAgcC0+aW4gPSBjbDsKICAgICAgICAgICAgKmxsID0gTlVMTDsKZGlmZiAtLWdpdCBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfcHJveHlfbW9kdWxlLmMgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3Byb3h5X21vZHVsZS5jCmluZGV4IDAyMTFkYWIuLjgzNjI1YmUgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfcHJveHlfbW9kdWxlLmMKKysrIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9wcm94eV9tb2R1bGUuYwpAQCAtMTAxMyw2ICsxMDEzLDEwIEBACiAgICAgICAgICAgICByZXR1cm4gTkdYX09LOwogICAgICAgICB9CiAKKyAgICAgICAgaWYgKHJjID09IE5HWF9BR0FJTikgeworICAgICAgICAgICAgcmV0dXJuIE5HWF9BR0FJTjsKKyAgICAgICAgfQorCiAgICAgICAgIC8qIHRoZXJlIHdhcyBlcnJvciB3aGlsZSBhIGhlYWRlciBsaW5lIHBhcnNpbmcgKi8KIAogICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfRVJSLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCmRpZmYgLS1naXQgYS9zcmMvaHR0cC9uZ3hfaHR0cC5jIGIvc3JjL2h0dHAvbmd4X2h0dHAuYwppbmRleCA5NGY3MThkLi4wZmIwNTc1IDEwMDY0NAotLS0gYS9zcmMvaHR0cC9uZ3hfaHR0cC5jCisrKyBiL3NyYy9odHRwL25neF9odHRwLmMKQEAgLTM2MCw3ICszNjAsNyBAQAogICAgICAqIHRvIHF1aWNrbHkgZmluZCB0aGUgc2VydmVyIGNvcmUgbW9kdWxlIGNvbmZpZ3VyYXRpb24gYXQgcnVuLXRpbWUKICAgICAgKi8KIAotICAgIGlmIChuZ3hfYXJyYXlfaW5pdCgmaW5fcG9ydHMsIGNmLT5wb29sLCAxMCwgc2l6ZW9mKG5neF9odHRwX2luX3BvcnRfdCkpCisgICAgaWYgKG5neF9hcnJheV9pbml0KCZpbl9wb3J0cywgY2YtPnBvb2wsIDIsIHNpemVvZihuZ3hfaHR0cF9pbl9wb3J0X3QpKQogICAgICAgICAhPSBOR1hfT0spCiAgICAgewogICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CkBAIC00MzQsNiArNDM0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5hZGRyID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9hZGRyID0gaW5fcG9ydFtwXS5hZGRycy5lbHRzOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0aGUgSU5BRERSX0FOWSBtdXN0IGJlIHRoZSBsYXN0IHJlc29ydApAQCAtNTc4LDcgKzU3OSw3IEBACiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgZm9yIChuID0gMDsgbiA8IGNtY2YtPnNlcnZlcl9uYW1lc19oYXNoOyBuKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5neF9hcnJheV9pbml0KCZpbl9hZGRyW2FdLmhhc2hbbl0sIGNmLT5wb29sLCA1LAorICAgICAgICAgICAgICAgICAgICBpZiAobmd4X2FycmF5X2luaXQoJmluX2FkZHJbYV0uaGFzaFtuXSwgY2YtPnBvb2wsIDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5neF9odHRwX3NlcnZlcl9uYW1lX3QpKSAhPSBOR1hfT0spCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKQEAgLTU5NSw2ICs1OTYsNyBAQAogICAgICAgICAgICAgICAgICAgICBpZiAoc19uYW1lID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBuYW1lID0gaW5fYWRkclthXS5uYW1lcy5lbHRzOwogCiAgICAgICAgICAgICAgICAgICAgICpzX25hbWUgPSBuYW1lW3NdOwogICAgICAgICAgICAgICAgIH0KQEAgLTc0OCw3ICs3NTAsNyBAQAogICAgIG5neF9odHRwX2luX2FkZHJfdCAgKmluX2FkZHI7CiAKICAgICBpZiAoaW5fcG9ydC0+YWRkcnMuZWx0cyA9PSBOVUxMKSB7Ci0gICAgICAgIGlmIChuZ3hfYXJyYXlfaW5pdCgmaW5fcG9ydC0+YWRkcnMsIGNmLT5wb29sLCAxMCwKKyAgICAgICAgaWYgKG5neF9hcnJheV9pbml0KCZpbl9wb3J0LT5hZGRycywgY2YtPnBvb2wsIDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yobmd4X2h0dHBfaW5fYWRkcl90KSkgIT0gTkdYX09LKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwpAQCAtNzk0LDcgKzc5Niw3IEBACiAgICAgbmd4X2h0dHBfc2VydmVyX25hbWVfdCAgKnNlcnZlcl9uYW1lcywgKm5hbWU7CiAKICAgICBpZiAoaW5fYWRkci0+bmFtZXMuZWx0cyA9PSBOVUxMKSB7Ci0gICAgICAgIGlmIChuZ3hfYXJyYXlfaW5pdCgmaW5fYWRkci0+bmFtZXMsIGNmLT5wb29sLCAxMCwKKyAgICAgICAgaWYgKG5neF9hcnJheV9pbml0KCZpbl9hZGRyLT5uYW1lcywgY2YtPnBvb2wsIDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yobmd4X2h0dHBfc2VydmVyX25hbWVfdCkpICE9IE5HWF9PSykKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKQEAgLTgwMiw3ICs4MDQsNyBAQAogICAgIH0KIAogICAgIGlmIChpbl9hZGRyLT53aWxkY2FyZHMuZWx0cyA9PSBOVUxMKSB7Ci0gICAgICAgIGlmIChuZ3hfYXJyYXlfaW5pdCgmaW5fYWRkci0+d2lsZGNhcmRzLCBjZi0+cG9vbCwgMTAsCisgICAgICAgIGlmIChuZ3hfYXJyYXlfaW5pdCgmaW5fYWRkci0+d2lsZGNhcmRzLCBjZi0+cG9vbCwgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfaHR0cF9zZXJ2ZXJfbmFtZV90KSkgIT0gTkdYX09LKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwpAQCAtODM0LDYgKzgzNiw3IEBACiAgICAgICAgIGlmIChuYW1lID09IE5VTEwpIHsKICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgICAgIH0KKyAgICAgICAgc2VydmVyX25hbWVzID0gY3NjZi0+c2VydmVyX25hbWVzLmVsdHM7CiAKICAgICAgICAgKm5hbWUgPSBzZXJ2ZXJfbmFtZXNbaV07CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbmd4X2h0dHBfY29uZmlnLmggYi9zcmMvaHR0cC9uZ3hfaHR0cF9jb25maWcuaAppbmRleCA4OTExMGMwLi5kMDM0MzUxIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9uZ3hfaHR0cF9jb25maWcuaAorKysgYi9zcmMvaHR0cC9uZ3hfaHR0cF9jb25maWcuaApAQCAtOCw3ICs4LDggQEAKICNkZWZpbmUgX05HWF9IVFRQX0NPTkZJR19IX0lOQ0xVREVEXwogCiAKLSNpbmNsdWRlIDxuZ3hfYWxsb2MuaD4KKyNpbmNsdWRlIDxuZ3hfY29uZmlnLmg+CisjaW5jbHVkZSA8bmd4X2NvcmUuaD4KICNpbmNsdWRlIDxuZ3hfaHR0cC5oPgogCiAKZGlmZiAtLWdpdCBhL3NyYy9odHRwL25neF9odHRwX2NvcmVfbW9kdWxlLmMgYi9zcmMvaHR0cC9uZ3hfaHR0cF9jb3JlX21vZHVsZS5jCmluZGV4IDQyYzgyMTEuLjAyNzk1NzkgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL25neF9odHRwX2NvcmVfbW9kdWxlLmMKKysrIGIvc3JjL2h0dHAvbmd4X2h0dHBfY29yZV9tb2R1bGUuYwpAQCAtMzE5LDYgKzMxOSwxMyBAQAogICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfY29yZV9sb2NfY29uZl90LCByZXNldF90aW1lZG91dF9jb25uZWN0aW9uKSwKICAgICAgIE5VTEwgfSwKIAorICAgIHsgbmd4X3N0cmluZygicG9ydF9pbl9yZWRpcmVjdCIpLAorICAgICAgTkdYX0hUVFBfTUFJTl9DT05GfE5HWF9IVFRQX1NSVl9DT05GfE5HWF9IVFRQX0xPQ19DT05GfE5HWF9DT05GX0ZMQUcsCisgICAgICBuZ3hfY29uZl9zZXRfZmxhZ19zbG90LAorICAgICAgTkdYX0hUVFBfTE9DX0NPTkZfT0ZGU0VULAorICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfY29yZV9sb2NfY29uZl90LCBwb3J0X2luX3JlZGlyZWN0KSwKKyAgICAgIE5VTEwgfSwKKwogICAgIHsgbmd4X3N0cmluZygibXNpZV9wYWRkaW5nIiksCiAgICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0NPTkZfRkxBRywKICAgICAgIG5neF9jb25mX3NldF9mbGFnX3Nsb3QsCkBAIC0xMTEzLDEwICsxMTIwLDEwIEBACiBzdGF0aWMgY2hhciAqCiBuZ3hfaHR0cF9jb3JlX3NlcnZlcihuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqY21kLCB2b2lkICpkdW1teSkKIHsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgbTsKICAgICBjaGFyICAgICAgICAgICAgICAgICAgICAgICAqcnY7CiAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgKm1jb25mOwotICAgIG5neF9jb25mX3QgICAgICAgICAgICAgICAgICBzYXZlOworICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICBtOworICAgIG5neF9jb25mX3QgICAgICAgICAgICAgICAgICBwY2Y7CiAgICAgbmd4X2h0dHBfbW9kdWxlX3QgICAgICAgICAgKm1vZHVsZTsKICAgICBuZ3hfaHR0cF9jb25mX2N0eF90ICAgICAgICAqY3R4LCAqaHR0cF9jdHg7CiAgICAgbmd4X2h0dHBfY29yZV9zcnZfY29uZl90ICAgKmNzY2YsICoqY3NjZnA7CkBAIC0xMTg5LDEzICsxMTk2LDEzIEBACiAKICAgICAvKiBwYXJzZSBpbnNpZGUgc2VydmVye30gKi8KIAotICAgIHNhdmUgPSAqY2Y7CisgICAgcGNmID0gKmNmOwogICAgIGNmLT5jdHggPSBjdHg7CiAgICAgY2YtPmNtZF90eXBlID0gTkdYX0hUVFBfU1JWX0NPTkY7CiAKICAgICBydiA9IG5neF9jb25mX3BhcnNlKGNmLCBOVUxMKTsKIAotICAgICpjZiA9IHNhdmU7CisgICAgKmNmID0gcGNmOwogCiAgICAgaWYgKHJ2ICE9IE5HWF9DT05GX09LKSB7CiAgICAgICAgIHJldHVybiBydjsKQEAgLTE2MjIsNiArMTYyOSw3IEBACiAgICAgICAgIGxzLT5wb3J0ID0gKGdldHVpZCgpID09IDApID8gODAgOiA4MDAwOwogI2VuZGlmCiAgICAgICAgIGxzLT5mYW1pbHkgPSBBRl9JTkVUOworICAgICAgICBscy0+ZGVmYXVsdF9zZXJ2ZXIgPSAwOwogICAgIH0KIAogICAgIGlmIChjb25mLT5zZXJ2ZXJfbmFtZXMubmVsdHMgPT0gMCkgewpAQCAtMTcyNiw2ICsxNzM0LDcgQEAKICAgICBsY2YtPmxpbmdlcmluZ190aW1lID0gTkdYX0NPTkZfVU5TRVRfTVNFQzsKICAgICBsY2YtPmxpbmdlcmluZ190aW1lb3V0ID0gTkdYX0NPTkZfVU5TRVRfTVNFQzsKICAgICBsY2YtPnJlc2V0X3RpbWVkb3V0X2Nvbm5lY3Rpb24gPSBOR1hfQ09ORl9VTlNFVDsKKyAgICBsY2YtPnBvcnRfaW5fcmVkaXJlY3QgPSBOR1hfQ09ORl9VTlNFVDsKICAgICBsY2YtPm1zaWVfcGFkZGluZyA9IE5HWF9DT05GX1VOU0VUOwogCiAgICAgcmV0dXJuIGxjZjsKQEAgLTE4MzksNiArMTg0OCw3IEBACiAKICAgICBuZ3hfY29uZl9tZXJnZV92YWx1ZShjb25mLT5yZXNldF90aW1lZG91dF9jb25uZWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldi0+cmVzZXRfdGltZWRvdXRfY29ubmVjdGlvbiwgMCk7CisgICAgbmd4X2NvbmZfbWVyZ2VfdmFsdWUoY29uZi0+cG9ydF9pbl9yZWRpcmVjdCwgcHJldi0+cG9ydF9pbl9yZWRpcmVjdCwgMSk7CiAgICAgbmd4X2NvbmZfbWVyZ2VfdmFsdWUoY29uZi0+bXNpZV9wYWRkaW5nLCBwcmV2LT5tc2llX3BhZGRpbmcsIDEpOwogCiAgICAgaWYgKGNvbmYtPm9wZW5fZmlsZXMgPT0gTlVMTCkgewpAQCAtMTg1Nyw4ICsxODY3LDggQEAKICAgICB1X2NoYXIgICAgICAgICAgICAgKmFkZHI7CiAgICAgbmd4X2ludF90ICAgICAgICAgICBwb3J0OwogICAgIG5neF91aW50X3QgICAgICAgICAgcDsKLSAgICBzdHJ1Y3QgaG9zdGVudCAgICAgKmg7CiAgICAgbmd4X3N0cl90ICAgICAgICAgICphcmdzOworICAgIHN0cnVjdCBob3N0ZW50ICAgICAqaDsKICAgICBuZ3hfaHR0cF9saXN0ZW5fdCAgKmxzOwogCiAgICAgLyoKQEAgLTE4NzQsOSArMTg4NCw5IEBACiAgICAgLyogQUZfSU5FVCBvbmx5ICovCiAKICAgICBscy0+ZmFtaWx5ID0gQUZfSU5FVDsKLSAgICBscy0+ZGVmYXVsdF9zZXJ2ZXIgPSAwOwogICAgIGxzLT5maWxlX25hbWUgPSBjZi0+Y29uZl9maWxlLT5maWxlLm5hbWU7CiAgICAgbHMtPmxpbmUgPSBjZi0+Y29uZl9maWxlLT5saW5lOworICAgIGxzLT5kZWZhdWx0X3NlcnZlciA9IDA7CiAKICAgICBhcmdzID0gY2YtPmFyZ3MtPmVsdHM7CiAgICAgYWRkciA9IGFyZ3NbMV0uZGF0YTsKZGlmZiAtLWdpdCBhL3NyYy9odHRwL25neF9odHRwX2NvcmVfbW9kdWxlLmggYi9zcmMvaHR0cC9uZ3hfaHR0cF9jb3JlX21vZHVsZS5oCmluZGV4IDQ2M2M2YjcuLjE0MDkwYjkgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL25neF9odHRwX2NvcmVfbW9kdWxlLmgKKysrIGIvc3JjL2h0dHAvbmd4X2h0dHBfY29yZV9tb2R1bGUuaApAQCAtMjAsNyArMjAsNyBAQAogICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgIGZpbGVfbmFtZTsKICAgICBuZ3hfaW50X3QgICAgICAgICAgICAgICAgICBsaW5lOwogCi0gICAgdW5zaWduZWQgICAgICAgICAgICAgICAgICAgZGVmYXVsdF9zZXJ2ZXI6MTsKKyAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICBkZWZhdWx0X3NlcnZlcjsgLyogdW5zaWduZWQgIGRlZmF1bHRfc2VydmVyOjE7ICovCiB9IG5neF9odHRwX2xpc3Rlbl90OwogCiAKQEAgLTIwNiw2ICsyMDYsNyBAQAogICAgIG5neF9mbGFnX3QgICAgdGNwX25vcHVzaDsgICAgICAgICAgICAgIC8qIHRjcF9ub3B1c2ggKi8KICAgICBuZ3hfZmxhZ190ICAgIHRjcF9ub2RlbGF5OyAgICAgICAgICAgICAvKiB0Y3Bfbm9kZWxheSAqLwogICAgIG5neF9mbGFnX3QgICAgcmVzZXRfdGltZWRvdXRfY29ubmVjdGlvbjsgLyogcmVzZXRfdGltZWRvdXRfY29ubmVjdGlvbiAqLworICAgIG5neF9mbGFnX3QgICAgcG9ydF9pbl9yZWRpcmVjdDsgICAgICAgIC8qIHBvcnRfaW5fcmVkaXJlY3QgKi8KICAgICBuZ3hfZmxhZ190ICAgIG1zaWVfcGFkZGluZzsgICAgICAgICAgICAvKiBtc2llX3BhZGRpbmcgKi8KIAogICAgIG5neF9hcnJheV90ICAqZXJyb3JfcGFnZXM7ICAgICAgICAgICAgIC8qIGVycm9yX3BhZ2UgKi8KZGlmZiAtLWdpdCBhL3NyYy9odHRwL25neF9odHRwX2hlYWRlcl9maWx0ZXJfbW9kdWxlLmMgYi9zcmMvaHR0cC9uZ3hfaHR0cF9oZWFkZXJfZmlsdGVyX21vZHVsZS5jCmluZGV4IGE0NWYyZTUuLmRhZjZjODUgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL25neF9odHRwX2hlYWRlcl9maWx0ZXJfbW9kdWxlLmMKKysrIGIvc3JjL2h0dHAvbmd4X2h0dHBfaGVhZGVyX2ZpbHRlcl9tb2R1bGUuYwpAQCAtMjU4LDYgKzI1OCw4IEBACiAgICAgICAgIGxlbiArPSBzaXplb2YoIkxhc3QtTW9kaWZpZWQ6IE1vbiwgMjggU2VwIDE5NzAgMDY6MDA6MDAgR01UIiBDUkxGKSAtIDE7CiAgICAgfQogCisgICAgY2xjZiA9IG5neF9odHRwX2dldF9tb2R1bGVfbG9jX2NvbmYociwgbmd4X2h0dHBfY29yZV9tb2R1bGUpOworCiAgICAgaWYgKHItPmhlYWRlcnNfb3V0LmxvY2F0aW9uCiAgICAgICAgICYmIHItPmhlYWRlcnNfb3V0LmxvY2F0aW9uLT52YWx1ZS5sZW4KICAgICAgICAgJiYgci0+aGVhZGVyc19vdXQubG9jYXRpb24tPnZhbHVlLmRhdGFbMF0gPT0gJy8nKQpAQCAtMjcwLDcgKzI3Miw3IEBACiAgICAgICAgICAgICAgICAgICAgKyByLT5zZXJ2ZXJfbmFtZS5sZW4KICAgICAgICAgICAgICAgICAgICArIHItPmhlYWRlcnNfb3V0LmxvY2F0aW9uLT52YWx1ZS5sZW4gKyAyOwogCi0gICAgICAgICAgICBpZiAoci0+cG9ydCAhPSA0NDMpIHsKKyAgICAgICAgICAgIGlmIChjbGNmLT5wb3J0X2luX3JlZGlyZWN0ICYmIHItPnBvcnQgIT0gNDQzKSB7CiAgICAgICAgICAgICAgICAgbGVuICs9IHItPnBvcnRfdGV4dC0+bGVuOwogICAgICAgICAgICAgfQogCkBAIC0yODEsNyArMjgzLDcgQEAKICAgICAgICAgICAgICAgICAgICArIHItPnNlcnZlcl9uYW1lLmxlbgogICAgICAgICAgICAgICAgICAgICsgci0+aGVhZGVyc19vdXQubG9jYXRpb24tPnZhbHVlLmxlbiArIDI7CiAKLSAgICAgICAgICAgIGlmIChyLT5wb3J0ICE9IDgwKSB7CisgICAgICAgICAgICBpZiAoY2xjZi0+cG9ydF9pbl9yZWRpcmVjdCAmJiByLT5wb3J0ICE9IDgwKSB7CiAgICAgICAgICAgICAgICAgbGVuICs9IHItPnBvcnRfdGV4dC0+bGVuOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0yOTEsOCArMjkzLDYgQEAKICAgICAgICAgbGVuICs9IHNpemVvZigiVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWQiIENSTEYpIC0gMTsKICAgICB9CiAKLSAgICBjbGNmID0gbmd4X2h0dHBfZ2V0X21vZHVsZV9sb2NfY29uZihyLCBuZ3hfaHR0cF9jb3JlX21vZHVsZSk7Ci0KICAgICBpZiAoci0+a2VlcGFsaXZlKSB7CiAgICAgICAgIGxlbiArPSBzaXplb2YoIkNvbm5lY3Rpb246IGtlZXAtYWxpdmUiIENSTEYpIC0gMTsKIApAQCAtNDI1LDE4ICs0MjUsMjAgQEAKICAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgci0+c2VydmVyX25hbWUuZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+c2VydmVyX25hbWUubGVuKTsKIAorICAgICAgICBpZiAoY2xjZi0+cG9ydF9pbl9yZWRpcmVjdCkgewogI2lmIChOR1hfSFRUUF9TU0wpCi0gICAgICAgIGlmIChyLT5jb25uZWN0aW9uLT5zc2wpIHsKLSAgICAgICAgICAgIGlmIChyLT5wb3J0ICE9IDQ0MykgewotICAgICAgICAgICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsIHItPnBvcnRfdGV4dC0+ZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLT5wb3J0X3RleHQtPmxlbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZQorICAgICAgICAgICAgaWYgKHItPmNvbm5lY3Rpb24tPnNzbCkgeworICAgICAgICAgICAgICAgIGlmIChyLT5wb3J0ICE9IDQ0MykgeworICAgICAgICAgICAgICAgICAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCByLT5wb3J0X3RleHQtPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHItPnBvcnRfdGV4dC0+bGVuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UKICNlbmRpZgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoci0+cG9ydCAhPSA4MCkgewotICAgICAgICAgICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsIHItPnBvcnRfdGV4dC0+ZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLT5wb3J0X3RleHQtPmxlbik7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHItPnBvcnQgIT0gODApIHsKKyAgICAgICAgICAgICAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgci0+cG9ydF90ZXh0LT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLT5wb3J0X3RleHQtPmxlbik7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9odHRwL25neF9odHRwX3BhcnNlLmMgYi9zcmMvaHR0cC9uZ3hfaHR0cF9wYXJzZS5jCmluZGV4IDAyN2Q5ZWYuLjMwMmNkODEgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL25neF9odHRwX3BhcnNlLmMKKysrIGIvc3JjL2h0dHAvbmd4X2h0dHBfcGFyc2UuYwpAQCAtMTEyLDcgKzExMiw3IEBACiAgICAgICAgIGNhc2Ugc3dfc3BhY2VzX2JlZm9yZV91cmk6CiAKICAgICAgICAgICAgIGMgPSAodV9jaGFyKSAoY2ggfCAweDIwKTsKLSAgICAgICAgICAgIGlmIChjID49ICdhJyAmJiBjIDw9ICdmJykgeworICAgICAgICAgICAgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSB7CiAgICAgICAgICAgICAgICAgci0+c2NoZW1hX3N0YXJ0ID0gcDsKICAgICAgICAgICAgICAgICBzdGF0ZSA9IHN3X3NjaGVtYTsKICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTEzMyw3ICsxMzMsNyBAQAogICAgICAgICBjYXNlIHN3X3NjaGVtYToKIAogICAgICAgICAgICAgYyA9ICh1X2NoYXIpIChjaCB8IDB4MjApOwotICAgICAgICAgICAgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ2YnKSB7CisgICAgICAgICAgICBpZiAoYyA+PSAnYScgJiYgYyA8PSAneicpIHsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIApAQCAtMTcxLDcgKzE3MSw3IEBACiAgICAgICAgIGNhc2Ugc3dfaG9zdDoKIAogICAgICAgICAgICAgYyA9ICh1X2NoYXIpIChjaCB8IDB4MjApOwotICAgICAgICAgICAgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ2YnKSB7CisgICAgICAgICAgICBpZiAoYyA+PSAnYScgJiYgYyA8PSAneicpIHsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIApAQCAtMjE1LDcgKzIxNSw3IEBACiAgICAgICAgIGNhc2Ugc3dfYWZ0ZXJfc2xhc2hfaW5fdXJpOgogCiAgICAgICAgICAgICBjID0gKHVfY2hhcikgKGNoIHwgMHgyMCk7Ci0gICAgICAgICAgICBpZiAoYyA+PSAnYScgJiYgYyA8PSAnZicpIHsKKyAgICAgICAgICAgIGlmIChjID49ICdhJyAmJiBjIDw9ICd6JykgewogICAgICAgICAgICAgICAgIHN0YXRlID0gc3dfY2hlY2tfdXJpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtMjc3LDcgKzI3Nyw3IEBACiAgICAgICAgIGNhc2Ugc3dfY2hlY2tfdXJpOgogCiAgICAgICAgICAgICBjID0gKHVfY2hhcikgKGNoIHwgMHgyMCk7Ci0gICAgICAgICAgICBpZiAoYyA+PSAnYScgJiYgYyA8PSAnZicpIHsKKyAgICAgICAgICAgIGlmIChjID49ICdhJyAmJiBjIDw9ICd6JykgewogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvaHR0cC9uZ3hfaHR0cF9yZXF1ZXN0LmMgYi9zcmMvaHR0cC9uZ3hfaHR0cF9yZXF1ZXN0LmMKaW5kZXggMzdhMTc2YS4uZjA0YzE3ZiAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbmd4X2h0dHBfcmVxdWVzdC5jCisrKyBiL3NyYy9odHRwL25neF9odHRwX3JlcXVlc3QuYwpAQCAtMTcyMiw2ICsxNzIyLDEwIEBACiAgICAgc3NpemVfdCAgICAgICBzaXplOwogICAgIG5neF9ldmVudF90ICAqcmV2OwogCisgICAgaWYgKHItPm1haW4pIHsKKyAgICAgICAgcmV0dXJuIE5HWF9PSzsKKyAgICB9CisKICAgICByZXYgPSByLT5jb25uZWN0aW9uLT5yZWFkOwogCiAgICAgbmd4X2xvZ19kZWJ1ZzAoTkdYX0xPR19ERUJVR19IVFRQLCByZXYtPmxvZywgMCwgImh0dHAgc2V0IGRpc2NhcmQgYm9keSIpOwpkaWZmIC0tZ2l0IGEvc3JjL2ltYXAvbmd4X2ltYXAuYyBiL3NyYy9pbWFwL25neF9pbWFwLmMKaW5kZXggOWZjNWUyNC4uYWEyOGIyZCAxMDA2NDQKLS0tIGEvc3JjL2ltYXAvbmd4X2ltYXAuYworKysgYi9zcmMvaW1hcC9uZ3hfaW1hcC5jCkBAIC0xMyw2ICsxMyw5IEBACiBzdGF0aWMgY2hhciAqbmd4X2ltYXBfYmxvY2sobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwgdm9pZCAqY29uZik7CiAKIAorbmd4X3VpbnRfdCAgbmd4X2ltYXBfbWF4X21vZHVsZTsKKworCiBzdGF0aWMgbmd4X2NvbW1hbmRfdCAgbmd4X2ltYXBfY29tbWFuZHNbXSA9IHsKIAogICAgIHsgbmd4X3N0cmluZygiaW1hcCIpLApAQCAtNDMsMjUgKzQ2LDE0NCBAQAogfTsKIAogCi1zdGF0aWMgY2hhciAqbmd4X2ltYXBfYmxvY2sobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwgdm9pZCAqY29uZikKK3N0YXRpYyBjaGFyICoKK25neF9pbWFwX2Jsb2NrKG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpjbWQsIHZvaWQgKmNvbmYpCiB7Ci0gICAgbmd4X2xpc3RlbmluZ190ICAqbHM7CisgICAgY2hhciAgICAgICAgICAgICAgICAgICAgICAgICpydjsKKyAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgIG0sIG1pLCBzOworICAgIG5neF9jb25mX3QgICAgICAgICAgICAgICAgICAgcGNmOworICAgIG5neF9pbWFwX21vZHVsZV90ICAgICAgICAgICAqbW9kdWxlOworICAgIG5neF9pbWFwX2NvbmZfY3R4X3QgICAgICAgICAqY3R4OworICAgIG5neF9pbWFwX2NvcmVfc3J2X2NvbmZfdCAgICoqY3NjZnA7CisgICAgbmd4X2ltYXBfY29yZV9tYWluX2NvbmZfdCAgICpjbWNmOwogCi0gICAgLyogU1RVQiAqLworICAgIC8qIHRoZSBtYWluIGltYXAgY29udGV4dCAqLwogCi0gICAgbHMgPSBuZ3hfbGlzdGVuaW5nX2luZXRfc3RyZWFtX3NvY2tldChjZiwgMCwgODExMCk7Ci0gICAgaWYgKGxzID09IE5VTEwpIHsKKyAgICBjdHggPSBuZ3hfcGNhbGxvYyhjZi0+cG9vbCwgc2l6ZW9mKG5neF9pbWFwX2NvbmZfY3R4X3QpKTsKKyAgICBpZiAoY3R4ID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgIH0KIAotICAgIGxzLT5iYWNrbG9nID0gLTE7Ci0gICAgbHMtPmFkZHJfbnRvcCA9IDE7Ci0gICAgbHMtPmhhbmRsZXIgPSBuZ3hfaW1hcF9pbml0X2Nvbm5lY3Rpb247Ci0gICAgbHMtPnBvb2xfc2l6ZSA9IDE2Mzg0OwotICAgIC8qIGxzLT5wb3N0X2FjY2VwdF90aW1lb3V0ID0gMDsgKi8KLSAgICBscy0+bG9nID0gY2YtPmN5Y2xlLT5uZXdfbG9nOworICAgICoobmd4X2ltYXBfY29uZl9jdHhfdCAqKikgY29uZiA9IGN0eDsKIAotICAgIC8qICovCisgICAgLyogY291bnQgdGhlIG51bWJlciBvZiB0aGUgaHR0cCBtb2R1bGVzIGFuZCBzZXQgdXAgdGhlaXIgaW5kaWNlcyAqLworCisgICAgbmd4X2ltYXBfbWF4X21vZHVsZSA9IDA7CisgICAgZm9yIChtID0gMDsgbmd4X21vZHVsZXNbbV07IG0rKykgeworICAgICAgICBpZiAobmd4X21vZHVsZXNbbV0tPnR5cGUgIT0gTkdYX0lNQVBfTU9EVUxFKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIG5neF9tb2R1bGVzW21dLT5jdHhfaW5kZXggPSBuZ3hfaW1hcF9tYXhfbW9kdWxlKys7CisgICAgfQorCisKKyAgICAvKiB0aGUgaW1hcCBtYWluX2NvbmYgY29udGV4dCwgaXQgaXMgdGhlIHNhbWUgaW4gdGhlIGFsbCBpbWFwIGNvbnRleHRzICovCisKKyAgICBjdHgtPm1haW5fY29uZiA9IG5neF9wY2FsbG9jKGNmLT5wb29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHZvaWQgKikgKiBuZ3hfaW1hcF9tYXhfbW9kdWxlKTsKKyAgICBpZiAoY3R4LT5tYWluX2NvbmYgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgfQorCisKKyAgICAvKgorICAgICAqIHRoZSBpbWFwIG51bGwgc3J2X2NvbmYgY29udGV4dCwgaXQgaXMgdXNlZCB0byBtZXJnZQorICAgICAqIHRoZSBzZXJ2ZXJ7fXMnIHNydl9jb25mJ3MKKyAgICAgKi8KKworICAgIGN0eC0+c3J2X2NvbmYgPSBuZ3hfcGNhbGxvYyhjZi0+cG9vbCwgc2l6ZW9mKHZvaWQgKikgKiBuZ3hfaW1hcF9tYXhfbW9kdWxlKTsKKyAgICBpZiAoY3R4LT5zcnZfY29uZiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICB9CisKKworICAgIC8qCisgICAgICogY3JlYXRlIHRoZSBtYWluX2NvbmYncywgdGhlIG51bGwgc3J2X2NvbmYncywgYW5kIHRoZSBudWxsIGxvY19jb25mJ3MKKyAgICAgKiBvZiB0aGUgYWxsIGltYXAgbW9kdWxlcworICAgICAqLworCisgICAgZm9yIChtID0gMDsgbmd4X21vZHVsZXNbbV07IG0rKykgeworICAgICAgICBpZiAobmd4X21vZHVsZXNbbV0tPnR5cGUgIT0gTkdYX0lNQVBfTU9EVUxFKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIG1vZHVsZSA9IG5neF9tb2R1bGVzW21dLT5jdHg7CisgICAgICAgIG1pID0gbmd4X21vZHVsZXNbbV0tPmN0eF9pbmRleDsKKworICAgICAgICBpZiAobW9kdWxlLT5jcmVhdGVfbWFpbl9jb25mKSB7CisgICAgICAgICAgICBjdHgtPm1haW5fY29uZlttaV0gPSBtb2R1bGUtPmNyZWF0ZV9tYWluX2NvbmYoY2YpOworICAgICAgICAgICAgaWYgKGN0eC0+bWFpbl9jb25mW21pXSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG1vZHVsZS0+Y3JlYXRlX3Nydl9jb25mKSB7CisgICAgICAgICAgICBjdHgtPnNydl9jb25mW21pXSA9IG1vZHVsZS0+Y3JlYXRlX3Nydl9jb25mKGNmKTsKKyAgICAgICAgICAgIGlmIChjdHgtPnNydl9jb25mW21pXSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICAvKiBwYXJzZSBpbnNpZGUgdGhlIGltYXB7fSBibG9jayAqLworCisgICAgcGNmID0gKmNmOworICAgIGNmLT5jdHggPSBjdHg7CisKKyAgICBjZi0+bW9kdWxlX3R5cGUgPSBOR1hfSU1BUF9NT0RVTEU7CisgICAgY2YtPmNtZF90eXBlID0gTkdYX0lNQVBfTUFJTl9DT05GOworICAgIHJ2ID0gbmd4X2NvbmZfcGFyc2UoY2YsIE5VTEwpOworCisgICAgaWYgKHJ2ICE9IE5HWF9DT05GX09LKSB7CisgICAgICAgICpjZiA9IHBjZjsKKyAgICAgICAgcmV0dXJuIHJ2OworICAgIH0KKworCisgICAgLyogaW5pdCBpbWFwe30gbWFpbl9jb25mJ3MsIG1lcmdlIHRoZSBzZXJ2ZXJ7fXMnIHNydl9jb25mJ3MgKi8KKworICAgIGNtY2YgPSBjdHgtPm1haW5fY29uZltuZ3hfaW1hcF9jb3JlX21vZHVsZS5jdHhfaW5kZXhdOworICAgIGNzY2ZwID0gY21jZi0+c2VydmVycy5lbHRzOworCisgICAgZm9yIChtID0gMDsgbmd4X21vZHVsZXNbbV07IG0rKykgeworICAgICAgICBpZiAobmd4X21vZHVsZXNbbV0tPnR5cGUgIT0gTkdYX0lNQVBfTU9EVUxFKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIG1vZHVsZSA9IG5neF9tb2R1bGVzW21dLT5jdHg7CisgICAgICAgIG1pID0gbmd4X21vZHVsZXNbbV0tPmN0eF9pbmRleDsKKworICAgICAgICAvKiBpbml0IGltYXB7fSBtYWluX2NvbmYncyAqLworCisgICAgICAgIGlmIChtb2R1bGUtPmluaXRfbWFpbl9jb25mKSB7CisgICAgICAgICAgICBydiA9IG1vZHVsZS0+aW5pdF9tYWluX2NvbmYoY2YsIGN0eC0+bWFpbl9jb25mW21pXSk7IAorICAgICAgICAgICAgaWYgKHJ2ICE9IE5HWF9DT05GX09LKSB7CisgICAgICAgICAgICAgICAgKmNmID0gcGNmOworICAgICAgICAgICAgICAgIHJldHVybiBydjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAocyA9IDA7IHMgPCBjbWNmLT5zZXJ2ZXJzLm5lbHRzOyBzKyspIHsKKyAgICAKKyAgICAgICAgICAgIC8qIG1lcmdlIHRoZSBzZXJ2ZXJ7fXMnIHNydl9jb25mJ3MgKi8KKyAgICAKKyAgICAgICAgICAgIGlmIChtb2R1bGUtPm1lcmdlX3Nydl9jb25mKSB7CisgICAgICAgICAgICAgICAgcnYgPSBtb2R1bGUtPm1lcmdlX3Nydl9jb25mKGNmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPnNydl9jb25mW21pXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NjZnBbc10tPmN0eC0+c3J2X2NvbmZbbWldKTsKKyAgICAgICAgICAgICAgICBpZiAocnYgIT0gTkdYX0NPTkZfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgKmNmID0gcGNmOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcnY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogaW1hcHt9J3MgY2YtPmN0eCB3YXMgbmVlZGVkIHdoaWxlIHRoZSBjb25maWd1cmF0aW9uIG1lcmdpbmcgKi8gCisgICAgCisgICAgKmNmID0gcGNmOyAKIAogICAgIHJldHVybiBOR1hfQ09ORl9PSzsKIH0KZGlmZiAtLWdpdCBhL3NyYy9pbWFwL25neF9pbWFwLmggYi9zcmMvaW1hcC9uZ3hfaW1hcC5oCmluZGV4IGNlYzcwOWMuLjM4ZjQ0OTggMTAwNjQ0Ci0tLSBhL3NyYy9pbWFwL25neF9pbWFwLmgKKysrIGIvc3JjL2ltYXAvbmd4X2ltYXAuaApAQCAtMTUsMTAgKzE1LDM5IEBACiAKIAogdHlwZWRlZiBzdHJ1Y3QgewotICAgIG5neF9wZWVyX2Nvbm5lY3Rpb25fdCAgIHVwc3RyZWFtOworICAgIHZvaWQgICAqKm1haW5fY29uZjsKKyAgICB2b2lkICAgKipzcnZfY29uZjsKK30gbmd4X2ltYXBfY29uZl9jdHhfdDsKIAotICAgIG5neF9idWZfdCAgICAgICAgICAgICAgKmJ1ZmZlcjsKLX0gbmd4X2ltYXBfcHJveHlfY3R4X3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBuZ3hfYXJyYXlfdCAgICAgICAgICAgc2VydmVyczsgICAgICAgICAvKiBuZ3hfaW1hcF9jb3JlX3Nydl9jb25mX3QgKi8KK30gbmd4X2ltYXBfY29yZV9tYWluX2NvbmZfdDsKKworCisjZGVmaW5lIE5HWF9JTUFQX1BPUDNfUFJPVE9DT0wgIDAKKyNkZWZpbmUgTkdYX0lNQVBfSU1BUF9QUk9UT0NPTCAgMQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgbmd4X21zZWNfdCAgICAgICAgICAgIHRpbWVvdXQ7CisKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgaW1hcF9jbGllbnRfYnVmZmVyX3NpemU7CisgICAgc2l6ZV90ICAgICAgICAgICAgICAgIHByb3h5X2J1ZmZlcl9zaXplOworCisgICAgbmd4X3VpbnRfdCAgICAgICAgICAgIHByb3RvY29sOworCisgICAgLyogc2VydmVyIGN0eCAqLworICAgIG5neF9pbWFwX2NvbmZfY3R4X3QgICpjdHg7Cit9IG5neF9pbWFwX2NvcmVfc3J2X2NvbmZfdDsKKworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdm9pZCAgICAgICAqKCpjcmVhdGVfbWFpbl9jb25mKShuZ3hfY29uZl90ICpjZik7CisgICAgY2hhciAgICAgICAqKCppbml0X21haW5fY29uZikobmd4X2NvbmZfdCAqY2YsIHZvaWQgKmNvbmYpOworCisgICAgdm9pZCAgICAgICAqKCpjcmVhdGVfc3J2X2NvbmYpKG5neF9jb25mX3QgKmNmKTsKKyAgICBjaGFyICAgICAgICooKm1lcmdlX3Nydl9jb25mKShuZ3hfY29uZl90ICpjZiwgdm9pZCAqcHJldiwgdm9pZCAqY29uZik7Cit9IG5neF9pbWFwX21vZHVsZV90OwogCiAKIHR5cGVkZWYgZW51bSB7CkBAIC0yOCwxNCArNTcsMjcgQEAKIAogCiB0eXBlZGVmIHN0cnVjdCB7CisgICAgbmd4X3BlZXJfY29ubmVjdGlvbl90ICAgdXBzdHJlYW07CisgICAgbmd4X2J1Zl90ICAgICAgICAgICAgICAqYnVmZmVyOworfSBuZ3hfaW1hcF9wcm94eV9jdHhfdDsKKworCit0eXBlZGVmIHN0cnVjdCB7CiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgc2lnbmF0dXJlOyAgICAgICAgIC8qICJJTUFQIiAqLwogCiAgICAgbmd4X2Nvbm5lY3Rpb25fdCAgICAgICAqY29ubmVjdGlvbjsKKwogICAgIG5neF9idWZfdCAgICAgICAgICAgICAgKmJ1ZmZlcjsKIAorICAgIHZvaWQgICAgICAgICAgICAgICAgICAqKmN0eDsKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgKiptYWluX2NvbmY7CisgICAgdm9pZCAgICAgICAgICAgICAgICAgICoqc3J2X2NvbmY7CisKKyAgICBuZ3hfaW1hcF9wcm94eV9jdHhfdCAgICpwcm94eTsKKwogICAgIG5neF9pbWFwX3N0YXRlX2UgICAgICAgIGltYXBfc3RhdGU7CiAKLSAgICBuZ3hfaW1hcF9wcm94eV9jdHhfdCAgICpwcm94eTsKKyAgICB1bnNpZ25lZCAgICAgICAgICAgICAgICBwcm90b2NvbDoxOwogCiAgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgbG9naW47CiAgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgcGFzc3dkOwpAQCAtNzQsMTcgKzExNiwzOCBAQAogCiAjZGVmaW5lIE5HWF9JTUFQX01PRFVMRSAgICAgIDB4NTA0MTRENDkgICAgIC8qICJJTUFQIiAqLwogCi0jZGVmaW5lIE5HWF9JTUFQX1NSVl9DT05GICAgIDB4MDIwMDAwMDAKLSNkZWZpbmUgTkdYX0lNQVBfSU1BUF9DT05GICAgMHgwNDAwMDAwMAotI2RlZmluZSBOR1hfSU1BUF9QT1AzX0NPTkYgICAweDA4MDAwMDAwCisjZGVmaW5lIE5HWF9JTUFQX01BSU5fQ09ORiAgIDB4MDIwMDAwMDAKKyNkZWZpbmUgTkdYX0lNQVBfU1JWX0NPTkYgICAgMHgwNDAwMDAwMAorCisKKyNkZWZpbmUgTkdYX0lNQVBfTUFJTl9DT05GX09GRlNFVCAgb2Zmc2V0b2Yobmd4X2ltYXBfY29uZl9jdHhfdCwgbWFpbl9jb25mKQorI2RlZmluZSBOR1hfSU1BUF9TUlZfQ09ORl9PRkZTRVQgICBvZmZzZXRvZihuZ3hfaW1hcF9jb25mX2N0eF90LCBzcnZfY29uZikKKworCisjZGVmaW5lIG5neF9pbWFwX2dldF9tb2R1bGVfY3R4KHMsIG1vZHVsZSkgICAgIChzKS0+Y3R4W21vZHVsZS5jdHhfaW5kZXhdCisjZGVmaW5lIG5neF9pbWFwX3NldF9jdHgocywgYywgbW9kdWxlKSAgICAgICAgIHMtPmN0eFttb2R1bGUuY3R4X2luZGV4XSA9IGM7CisjZGVmaW5lIG5neF9pbWFwX2RlbGV0ZV9jdHgocywgbW9kdWxlKSAgICAgICAgIHMtPmN0eFttb2R1bGUuY3R4X2luZGV4XSA9IE5VTEw7CisKKworI2RlZmluZSBuZ3hfaW1hcF9nZXRfbW9kdWxlX21haW5fY29uZihzLCBtb2R1bGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKHMpLT5tYWluX2NvbmZbbW9kdWxlLmN0eF9pbmRleF0KKyNkZWZpbmUgbmd4X2ltYXBfZ2V0X21vZHVsZV9zcnZfY29uZihzLCBtb2R1bGUpICAocyktPnNydl9jb25mW21vZHVsZS5jdHhfaW5kZXhdCiAKIAogdm9pZCBuZ3hfaW1hcF9pbml0X2Nvbm5lY3Rpb24obmd4X2Nvbm5lY3Rpb25fdCAqYyk7CiB2b2lkIG5neF9pbWFwX2Nsb3NlX2Nvbm5lY3Rpb24obmd4X2Nvbm5lY3Rpb25fdCAqYyk7CiAKLXZvaWQgbmd4X2ltYXBfcHJveHlfaW5pdChuZ3hfaW1hcF9zZXNzaW9uX3QgKnMpOwotCiBuZ3hfaW50X3Qgbmd4X3BvcDNfcGFyc2VfY29tbWFuZChuZ3hfaW1hcF9zZXNzaW9uX3QgKnMpOwogCiAKKy8qIFNUVUIgKi8KK3ZvaWQgbmd4X2ltYXBfcHJveHlfaW5pdChuZ3hfaW1hcF9zZXNzaW9uX3QgKnMsIG5neF9wZWVyc190ICpwZWVycyk7Cit2b2lkIG5neF9pbWFwX2F1dGhfaHR0cF9pbml0KG5neF9pbWFwX3Nlc3Npb25fdCAqcyk7CisvKiovCisKKworZXh0ZXJuIG5neF91aW50X3QgICAgbmd4X2ltYXBfbWF4X21vZHVsZTsKK2V4dGVybiBuZ3hfbW9kdWxlX3QgIG5neF9pbWFwX2NvcmVfbW9kdWxlOworCisKICNlbmRpZiAvKiBfTkdYX0lNQVBfSF9JTkNMVURFRF8gKi8KZGlmZiAtLWdpdCBhL3NyYy9pbWFwL25neF9pbWFwX2F1dGhfaHR0cF9tb2R1bGUuYyBiL3NyYy9pbWFwL25neF9pbWFwX2F1dGhfaHR0cF9tb2R1bGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTZjNDRiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2ltYXAvbmd4X2ltYXBfYXV0aF9odHRwX21vZHVsZS5jCkBAIC0wLDAgKzEsNDIxIEBACisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIElnb3IgU3lzb2V2CisgKi8KKworCisjaW5jbHVkZSA8bmd4X2NvbmZpZy5oPgorI2luY2x1ZGUgPG5neF9jb3JlLmg+CisjaW5jbHVkZSA8bmd4X2V2ZW50Lmg+CisjaW5jbHVkZSA8bmd4X2V2ZW50X2Nvbm5lY3QuaD4KKyNpbmNsdWRlIDxuZ3hfaW1hcC5oPgorCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBuZ3hfcGVlcnNfdCAgICAgICAgICAgICpwZWVyczsKKworICAgIG5neF9tc2VjX3QgICAgICAgICAgICAgIHRpbWVvdXQ7CisKKyAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICBob3N0X2hlYWRlcjsKKyAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICB1cmk7Cit9IG5neF9pbWFwX2F1dGhfaHR0cF9jb25mX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIG5neF9idWZfdCAgICAgICAgICAgICAgKnJlcXVlc3Q7CisgICAgbmd4X3BlZXJfY29ubmVjdGlvbl90ICAgcGVlcjsKK30gbmd4X2ltYXBfYXV0aF9odHRwX2N0eF90OworCisKK3N0YXRpYyB2b2lkIG5neF9pbWFwX2F1dGhfaHR0cF93cml0ZV9oYW5kbGVyKG5neF9ldmVudF90ICp3ZXYpOworc3RhdGljIHZvaWQgbmd4X2ltYXBfYXV0aF9odHRwX3JlYWRfaGFuZGxlcihuZ3hfZXZlbnRfdCAqcmV2KTsKK3N0YXRpYyB2b2lkIG5neF9pbWFwX2F1dGhfaHR0cF9ibG9ja19yZWFkKG5neF9ldmVudF90ICpyZXYpOworc3RhdGljIHZvaWQgbmd4X2ltYXBfYXV0aF9odHRwX2R1bW15X2hhbmRsZXIobmd4X2V2ZW50X3QgKmV2KTsKK3N0YXRpYyBuZ3hfYnVmX3QgKm5neF9pbWFwX2F1dGhfaHR0cF9jcmVhdGVfcmVxdWVzdChuZ3hfaW1hcF9zZXNzaW9uX3QgKnMsCisgICAgbmd4X2ltYXBfYXV0aF9odHRwX2NvbmZfdCAqYWhjZik7CisKK3N0YXRpYyB2b2lkICpuZ3hfaW1hcF9hdXRoX2h0dHBfY3JlYXRlX2NvbmYobmd4X2NvbmZfdCAqY2YpOworc3RhdGljIGNoYXIgKm5neF9pbWFwX2F1dGhfaHR0cF9tZXJnZV9jb25mKG5neF9jb25mX3QgKmNmLCB2b2lkICpwYXJlbnQsCisgICAgdm9pZCAqY2hpbGQpOworc3RhdGljIGNoYXIgKm5neF9pbWFwX2F1dGhfaHR0cChuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqY21kLCB2b2lkICpjb25mKTsKKworCitzdGF0aWMgbmd4X2NvbW1hbmRfdCAgbmd4X2ltYXBfYXV0aF9odHRwX2NvbW1hbmRzW10gPSB7CisKKyAgICB7IG5neF9zdHJpbmcoImF1dGhfaHR0cCIpLAorICAgICAgTkdYX0lNQVBfTUFJTl9DT05GfE5HWF9JTUFQX1NSVl9DT05GfE5HWF9DT05GX1RBS0UxLAorICAgICAgbmd4X2ltYXBfYXV0aF9odHRwLAorICAgICAgTkdYX0lNQVBfU1JWX0NPTkZfT0ZGU0VULAorICAgICAgMCwKKyAgICAgIE5VTEwgfSwKKworICAgIHsgbmd4X3N0cmluZygiYXV0aF9odHRwX3RpbWVvdXQiKSwKKyAgICAgIE5HWF9JTUFQX01BSU5fQ09ORnxOR1hfSU1BUF9TUlZfQ09ORnxOR1hfQ09ORl9UQUtFMSwKKyAgICAgIG5neF9jb25mX3NldF9tc2VjX3Nsb3QsCisgICAgICBOR1hfSU1BUF9TUlZfQ09ORl9PRkZTRVQsCisgICAgICBvZmZzZXRvZihuZ3hfaW1hcF9hdXRoX2h0dHBfY29uZl90LCB0aW1lb3V0KSwKKyAgICAgIE5VTEwgfSwKKworICAgICAgbmd4X251bGxfY29tbWFuZAorfTsKKworCitzdGF0aWMgbmd4X2ltYXBfbW9kdWxlX3QgIG5neF9pbWFwX2F1dGhfaHR0cF9tb2R1bGVfY3R4ID0geworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSBtYWluIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0IG1haW4gY29uZmlndXJhdGlvbiAqLworCisgICAgbmd4X2ltYXBfYXV0aF9odHRwX2NyZWF0ZV9jb25mLCAgICAgICAgLyogY3JlYXRlIHNlcnZlciBjb25maWd1cmF0aW9uICovCisgICAgbmd4X2ltYXBfYXV0aF9odHRwX21lcmdlX2NvbmYgICAgICAgICAgLyogbWVyZ2Ugc2VydmVyIGNvbmZpZ3VyYXRpb24gKi8KK307CisKKworbmd4X21vZHVsZV90ICBuZ3hfaW1hcF9hdXRoX2h0dHBfbW9kdWxlID0geworICAgIE5HWF9NT0RVTEVfVjEsCisgICAgJm5neF9pbWFwX2F1dGhfaHR0cF9tb2R1bGVfY3R4LCAgICAgICAgLyogbW9kdWxlIGNvbnRleHQgKi8KKyAgICBuZ3hfaW1hcF9hdXRoX2h0dHBfY29tbWFuZHMsICAgICAgICAgICAvKiBtb2R1bGUgZGlyZWN0aXZlcyAqLworICAgIE5HWF9JTUFQX01PRFVMRSwgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vZHVsZSB0eXBlICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdCBtb2R1bGUgKi8KKyAgICBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0IHByb2Nlc3MgKi8KK307CisKKworc3RhdGljIGNoYXIgKm5neF9pbWFwX2F1dGhfaHR0cF9wcm90b2NvbFtdID0geyAicG9wMyIsICJpbWFwIiB9OworCisKK3ZvaWQKK25neF9pbWFwX2F1dGhfaHR0cF9pbml0KG5neF9pbWFwX3Nlc3Npb25fdCAqcykKK3sKKyAgICBuZ3hfaW50X3QgICAgICAgICAgICAgICAgICAgcmM7CisgICAgbmd4X2ltYXBfYXV0aF9odHRwX2N0eF90ICAgKmN0eDsKKyAgICBuZ3hfaW1hcF9hdXRoX2h0dHBfY29uZl90ICAqYWhjZjsKKworICAgIGN0eCA9IG5neF9wY2FsbG9jKHMtPmNvbm5lY3Rpb24tPnBvb2wsIHNpemVvZihuZ3hfaW1hcF9hdXRoX2h0dHBfY3R4X3QpKTsKKyAgICBpZiAoY3R4ID09IE5VTEwpIHsKKyAgICAgICAgbmd4X2ltYXBfY2xvc2VfY29ubmVjdGlvbihzLT5jb25uZWN0aW9uKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGFoY2YgPSBuZ3hfaW1hcF9nZXRfbW9kdWxlX3Nydl9jb25mKHMsIG5neF9pbWFwX2F1dGhfaHR0cF9tb2R1bGUpOworCisgICAgY3R4LT5yZXF1ZXN0ID0gbmd4X2ltYXBfYXV0aF9odHRwX2NyZWF0ZV9yZXF1ZXN0KHMsIGFoY2YpOworICAgIGlmIChjdHgtPnJlcXVlc3QgPT0gTlVMTCkgeworICAgICAgICBuZ3hfaW1hcF9jbG9zZV9jb25uZWN0aW9uKHMtPmNvbm5lY3Rpb24pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbmd4X2ltYXBfc2V0X2N0eChzLCBjdHgsIG5neF9pbWFwX2F1dGhfaHR0cF9tb2R1bGUpOworCisgICAgY3R4LT5wZWVyLnBlZXJzID0gYWhjZi0+cGVlcnM7CisgICAgY3R4LT5wZWVyLmxvZyA9IHMtPmNvbm5lY3Rpb24tPmxvZzsKKyAgICBjdHgtPnBlZXIubG9nX2Vycm9yID0gTkdYX0VSUk9SX0VSUjsKKworICAgIHJjID0gbmd4X2V2ZW50X2Nvbm5lY3RfcGVlcigmY3R4LT5wZWVyKTsKKworICAgIGlmIChyYyA9PSBOR1hfRVJST1IpIHsKKyAgICAgICAgbmd4X2ltYXBfY2xvc2VfY29ubmVjdGlvbihzLT5jb25uZWN0aW9uKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGN0eC0+cGVlci5jb25uZWN0aW9uLT5kYXRhID0gczsKKyAgICBjdHgtPnBlZXIuY29ubmVjdGlvbi0+cG9vbCA9IHMtPmNvbm5lY3Rpb24tPnBvb2w7CisKKyAgICBzLT5jb25uZWN0aW9uLT5yZWFkLT5oYW5kbGVyID0gbmd4X2ltYXBfYXV0aF9odHRwX2Jsb2NrX3JlYWQ7CisgICAgY3R4LT5wZWVyLmNvbm5lY3Rpb24tPnJlYWQtPmhhbmRsZXIgPSBuZ3hfaW1hcF9hdXRoX2h0dHBfcmVhZF9oYW5kbGVyOworICAgIGN0eC0+cGVlci5jb25uZWN0aW9uLT53cml0ZS0+aGFuZGxlciA9IG5neF9pbWFwX2F1dGhfaHR0cF93cml0ZV9oYW5kbGVyOworCisgICAgaWYgKHJjID09IE5HWF9PSykgeworICAgICAgICBuZ3hfaW1hcF9hdXRoX2h0dHBfd3JpdGVfaGFuZGxlcihjdHgtPnBlZXIuY29ubmVjdGlvbi0+d3JpdGUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbmd4X2FkZF90aW1lcihjdHgtPnBlZXIuY29ubmVjdGlvbi0+cmVhZCwgYWhjZi0+dGltZW91dCk7CisgICAgbmd4X2FkZF90aW1lcihjdHgtPnBlZXIuY29ubmVjdGlvbi0+d3JpdGUsIGFoY2YtPnRpbWVvdXQpOworfQorCisKK3N0YXRpYyB2b2lkCituZ3hfaW1hcF9hdXRoX2h0dHBfd3JpdGVfaGFuZGxlcihuZ3hfZXZlbnRfdCAqd2V2KQoreworICAgIHNzaXplX3QgICAgICAgICAgICAgICAgICAgICBuLCBzaXplOworICAgIG5neF9jb25uZWN0aW9uX3QgICAgICAgICAgICpjOworICAgIG5neF9pbWFwX3Nlc3Npb25fdCAgICAgICAgICpzOworICAgIG5neF9pbWFwX2F1dGhfaHR0cF9jdHhfdCAgICpjdHg7CisgICAgbmd4X2ltYXBfYXV0aF9odHRwX2NvbmZfdCAgKmFoY2Y7CisKKyAgICBjID0gd2V2LT5kYXRhOworICAgIHMgPSBjLT5kYXRhOworCisgICAgY3R4ID0gbmd4X2ltYXBfZ2V0X21vZHVsZV9jdHgocywgbmd4X2ltYXBfYXV0aF9odHRwX21vZHVsZSk7CisKKyAgICBuZ3hfbG9nX2RlYnVnMChOR1hfTE9HX0RFQlVHX0lNQVAsIHdldi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICJpbWFwIGF1dGggaHR0cCB3cml0ZSBoYW5kbGVyIik7CisKKyAgICBpZiAod2V2LT50aW1lZG91dCkgeyAgCisgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19FUlIsIHdldi0+bG9nLCBOR1hfRVRJTUVET1VULAorICAgICAgICAgICAgICAgICAgICAgICJhdXRoIGh0dHAgc2VydmVyIHRpbWVkIG91dCIpOworICAgICAgICBuZ3hfaW1hcF9jbG9zZV9jb25uZWN0aW9uKGN0eC0+cGVlci5jb25uZWN0aW9uKTsKKyAgICAgICAgbmd4X2ltYXBfY2xvc2VfY29ubmVjdGlvbihzLT5jb25uZWN0aW9uKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNpemUgPSBjdHgtPnJlcXVlc3QtPmxhc3QgLSBjdHgtPnJlcXVlc3QtPnBvczsKKworICAgIG4gPSBuZ3hfc2VuZChjLCBjdHgtPnJlcXVlc3QtPnBvcywgc2l6ZSk7CisKKyAgICBpZiAobiA9PSBOR1hfRVJST1IpIHsKKyAgICAgICAgbmd4X2ltYXBfY2xvc2VfY29ubmVjdGlvbihjdHgtPnBlZXIuY29ubmVjdGlvbik7CisgICAgICAgIG5neF9pbWFwX2Nsb3NlX2Nvbm5lY3Rpb24ocy0+Y29ubmVjdGlvbik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobiA+IDApIHsKKyAgICAgICAgY3R4LT5yZXF1ZXN0LT5wb3MgKz0gbjsKKworICAgICAgICBpZiAobiA9PSBzaXplKSB7CisgICAgICAgICAgICB3ZXYtPmhhbmRsZXIgPSBuZ3hfaW1hcF9hdXRoX2h0dHBfZHVtbXlfaGFuZGxlcjsKKworICAgICAgICAgICAgaWYgKHdldi0+dGltZXJfc2V0KSB7CisgICAgICAgICAgICAgICAgbmd4X2RlbF90aW1lcih3ZXYpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIXdldi0+dGltZXJfc2V0KSB7CisgICAgICAgIGFoY2YgPSBuZ3hfaW1hcF9nZXRfbW9kdWxlX3Nydl9jb25mKHMsIG5neF9pbWFwX2F1dGhfaHR0cF9tb2R1bGUpOworICAgICAgICBuZ3hfYWRkX3RpbWVyKHdldiwgYWhjZi0+dGltZW91dCk7CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkCituZ3hfaW1hcF9hdXRoX2h0dHBfcmVhZF9oYW5kbGVyKG5neF9ldmVudF90ICpyZXYpCit7CisgICAgbmd4X3BlZXJzX3QgICAgICAgICAgICAgICAgKnBlZXJzOworICAgIG5neF9jb25uZWN0aW9uX3QgICAgICAgICAgKmM7CisgICAgbmd4X2ltYXBfc2Vzc2lvbl90ICAgICAgICAqczsKKyNpZiAwCisgICAgbmd4X2ltYXBfYXV0aF9odHRwX2N0eF90ICAqY3R4OworI2VuZGlmCisKKyAgICBjID0gcmV2LT5kYXRhOworICAgIHMgPSBjLT5kYXRhOworCisjaWYgMAorICAgIGN0eCA9IG5neF9pbWFwX2dldF9tb2R1bGVfY3R4KHMsIG5neF9pbWFwX2F1dGhfaHR0cF9tb2R1bGUpOworI2VuZGlmCisKKyAgICBuZ3hfbG9nX2RlYnVnMChOR1hfTE9HX0RFQlVHX0lNQVAsIHJldi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICJpbWFwIGF1dGggaHR0cCByZWFkIGhhbmRsZXIiKTsKKworICAgIHBlZXJzID0gTlVMTDsKKworICAgIG5neF9pbWFwX3Byb3h5X2luaXQocywgcGVlcnMpOworfQorCisKK3N0YXRpYyB2b2lkCituZ3hfaW1hcF9hdXRoX2h0dHBfYmxvY2tfcmVhZChuZ3hfZXZlbnRfdCAqcmV2KQoreworICAgIG5neF9jb25uZWN0aW9uX3QgICAgICAgICAgKmM7CisgICAgbmd4X2ltYXBfc2Vzc2lvbl90ICAgICAgICAqczsKKyAgICBuZ3hfaW1hcF9hdXRoX2h0dHBfY3R4X3QgICpjdHg7CisKKyAgICBuZ3hfbG9nX2RlYnVnMChOR1hfTE9HX0RFQlVHX0lNQVAsIHJldi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICJpbWFwIGF1dGggaHR0cCBibG9jayByZWFkIik7CisKKyAgICBpZiAobmd4X2hhbmRsZV9yZWFkX2V2ZW50KHJldiwgMCkgPT0gTkdYX0VSUk9SKSB7CisgICAgICAgIGMgPSByZXYtPmRhdGE7CisgICAgICAgIHMgPSBjLT5kYXRhOworCisgICAgICAgIGN0eCA9IG5neF9pbWFwX2dldF9tb2R1bGVfY3R4KHMsIG5neF9pbWFwX2F1dGhfaHR0cF9tb2R1bGUpOworCisgICAgICAgIG5neF9pbWFwX2Nsb3NlX2Nvbm5lY3Rpb24oY3R4LT5wZWVyLmNvbm5lY3Rpb24pOworICAgICAgICBuZ3hfaW1hcF9jbG9zZV9jb25uZWN0aW9uKHMtPmNvbm5lY3Rpb24pOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZAorbmd4X2ltYXBfYXV0aF9odHRwX2R1bW15X2hhbmRsZXIobmd4X2V2ZW50X3QgKmV2KQoreworICAgIG5neF9sb2dfZGVidWcwKE5HWF9MT0dfREVCVUdfSU1BUCwgZXYtPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAiaW1hcCBhdXRoIGh0dHAgZHVtbXkgaGFuZGxlciIpOworfQorCisKK3N0YXRpYyBuZ3hfYnVmX3QgKgorbmd4X2ltYXBfYXV0aF9odHRwX2NyZWF0ZV9yZXF1ZXN0KG5neF9pbWFwX3Nlc3Npb25fdCAqcywKKyAgICBuZ3hfaW1hcF9hdXRoX2h0dHBfY29uZl90ICphaGNmKQoreworICAgIHNpemVfdCAgICAgIGxlbjsKKyAgICBuZ3hfYnVmX3QgICpiOworCisgICAgbGVuID0gc2l6ZW9mKCJHRVQgIikgLSAxICsgYWhjZi0+dXJpLmxlbiArIHNpemVvZigiIEhUVFAvMS4wIiBDUkxGKSAtIDEKKyAgICAgICAgICArIHNpemVvZigiSG9zdDogIikgLSAxICsgYWhjZi0+aG9zdF9oZWFkZXIubGVuICsgc2l6ZW9mKENSTEYpIC0gMQorICAgICAgICAgICsgc2l6ZW9mKCJBdXRoLU1ldGhvZDogcGxhaW4iIENSTEYpIC0gMQorICAgICAgICAgICsgc2l6ZW9mKCJBdXRoLVVzZXI6ICIpIC0gMSArIHMtPmxvZ2luLmxlbiArIHNpemVvZihDUkxGKSAtIDEKKyAgICAgICAgICArIHNpemVvZigiQXV0aC1QYXNzOiAiKSAtIDEgKyBzLT5wYXNzd2QubGVuICsgc2l6ZW9mKENSTEYpIC0gMQorICAgICAgICAgICsgc2l6ZW9mKCJBdXRoLVByb3RvY29sOiBpbWFwIiBDUkxGKSAtIDEKKyAgICAgICAgICArIHNpemVvZigiQ2xpZW50LUlQOiAiKSAtIDEgKyBzLT5jb25uZWN0aW9uLT5hZGRyX3RleHQubGVuCisgICAgICAgICAgICAgICAgKyBzaXplb2YoQ1JMRikgLSAxCisgICAgICAgICAgKyBzaXplb2YoQ1JMRikgLSAxOworCisgICAgYiA9IG5neF9jcmVhdGVfdGVtcF9idWYocy0+Y29ubmVjdGlvbi0+cG9vbCwgbGVuKTsKKyAgICBpZiAoYiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsICJHRVQgIiwgc2l6ZW9mKCJHRVQgIikgLSAxKTsKKyAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCBhaGNmLT51cmkuZGF0YSwgYWhjZi0+dXJpLmxlbik7CisgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgIiBIVFRQLzEuMCIgQ1JMRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoIiBIVFRQLzEuMCIgQ1JMRikgLSAxKTsKKworICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsICJIb3N0OiAiLCBzaXplb2YoIkhvc3Q6ICIpIC0gMSk7CisgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgYWhjZi0+aG9zdF9oZWFkZXIuZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhaGNmLT5ob3N0X2hlYWRlci5sZW4pOworICAgICpiLT5sYXN0KysgPSBDUjsgKmItPmxhc3QrKyA9IExGOworCisgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgIkF1dGgtTWV0aG9kOiBwbGFpbiIgQ1JMRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoIkF1dGgtTWV0aG9kOiBwbGFpbiIgQ1JMRikgLSAxKTsKKworICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsICJBdXRoLVVzZXI6ICIsIHNpemVvZigiQXV0aC1Vc2VyOiAiKSAtIDEpOworICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsIHMtPmxvZ2luLmRhdGEsIHMtPmxvZ2luLmxlbik7CisgICAgKmItPmxhc3QrKyA9IENSOyAqYi0+bGFzdCsrID0gTEY7CisKKyAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCAiQXV0aC1QYXNzOiAiLCBzaXplb2YoIkF1dGgtUGFzczogIikgLSAxKTsKKyAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCBzLT5wYXNzd2QuZGF0YSwgcy0+cGFzc3dkLmxlbik7CisgICAgKmItPmxhc3QrKyA9IENSOyAqYi0+bGFzdCsrID0gTEY7CisKKyAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCAiQXV0aC1Qcm90b2NvbDogIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoIkF1dGgtUHJvdG9jb2w6ICIpIC0gMSk7CisgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgbmd4X2ltYXBfYXV0aF9odHRwX3Byb3RvY29sW3MtPnByb3RvY29sXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoImltYXAiKSAtIDEpOworICAgICpiLT5sYXN0KysgPSBDUjsgKmItPmxhc3QrKyA9IExGOworCisgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgIkNsaWVudC1JUDogIiwgc2l6ZW9mKCJDbGllbnQtSVA6ICIpIC0gMSk7CisgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgcy0+Y29ubmVjdGlvbi0+YWRkcl90ZXh0LmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgcy0+Y29ubmVjdGlvbi0+YWRkcl90ZXh0Lmxlbik7CisgICAgKmItPmxhc3QrKyA9IENSOyAqYi0+bGFzdCsrID0gTEY7CisKKyAgICAvKiBhZGQgIlxyXG4iIGF0IHRoZSBoZWFkZXIgZW5kICovCisgICAgKmItPmxhc3QrKyA9IENSOyAqYi0+bGFzdCsrID0gTEY7CisKKyNpZiAoTkdYX0RFQlVHKQorICAgIHsKKyAgICBuZ3hfc3RyX3QgIGw7CisKKyAgICBsLmxlbiA9IGItPmxhc3QgLSBiLT5wb3M7CisgICAgbC5kYXRhID0gYi0+cG9zOworICAgIG5neF9sb2dfZGVidWcxKE5HWF9MT0dfREVCVUdfSFRUUCwgcy0+Y29ubmVjdGlvbi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICJpbWFwIGF1dGggaHR0cCBoZWFkZXI6XG5cIiVWXCIiLCAmbCk7CisgICAgfQorI2VuZGlmCisKKyAgICByZXR1cm4gYjsKK30KKworCitzdGF0aWMgdm9pZCAqCituZ3hfaW1hcF9hdXRoX2h0dHBfY3JlYXRlX2NvbmYobmd4X2NvbmZfdCAqY2YpCit7ICAgICAgICAgICAKKyAgICBuZ3hfaW1hcF9hdXRoX2h0dHBfY29uZl90ICAqYWhjZjsKKyAgICAgICAgICAgIAorICAgIGFoY2YgPSBuZ3hfcGNhbGxvYyhjZi0+cG9vbCwgc2l6ZW9mKG5neF9pbWFwX2F1dGhfaHR0cF9jb25mX3QpKTsKKyAgICBpZiAoYWhjZiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICB9CisKKyAgICBhaGNmLT50aW1lb3V0ID0gTkdYX0NPTkZfVU5TRVRfTVNFQzsKKworICAgIHJldHVybiBhaGNmOworfQorCisKK3N0YXRpYyBjaGFyICoKK25neF9pbWFwX2F1dGhfaHR0cF9tZXJnZV9jb25mKG5neF9jb25mX3QgKmNmLCB2b2lkICpwYXJlbnQsIHZvaWQgKmNoaWxkKQoreworICAgIG5neF9pbWFwX2F1dGhfaHR0cF9jb25mX3QgKnByZXYgPSBwYXJlbnQ7CisgICAgbmd4X2ltYXBfYXV0aF9odHRwX2NvbmZfdCAqY29uZiA9IGNoaWxkOworCisgICAgaWYgKGNvbmYtPnBlZXJzID09IE5VTEwpIHsKKyAgICAgICAgY29uZi0+cGVlcnMgPSBwcmV2LT5wZWVyczsKKyAgICAgICAgY29uZi0+aG9zdF9oZWFkZXIgPSBwcmV2LT5ob3N0X2hlYWRlcjsKKyAgICAgICAgY29uZi0+dXJpID0gcHJldi0+dXJpOworICAgIH0KKworICAgIG5neF9jb25mX21lcmdlX21zZWNfdmFsdWUoY29uZi0+dGltZW91dCwgcHJldi0+dGltZW91dCwgNjAwMDApOworCisgICAgcmV0dXJuIE5HWF9DT05GX09LOworfQorCisKK3N0YXRpYyBjaGFyICoKK25neF9pbWFwX2F1dGhfaHR0cChuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqY21kLCB2b2lkICpjb25mKQoreyAgIAorICAgIG5neF9pbWFwX2F1dGhfaHR0cF9jb25mX3QgKmFoY2YgPSBjb25mOworCisgICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgICBpOworICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICAqdmFsdWUsICp1cmw7CisgICAgbmd4X2luZXRfdXBzdHJlYW1fdCAgICAgICAgICBpbmV0X3Vwc3RyZWFtOworI2lmIChOR1hfSEFWRV9VTklYX0RPTUFJTikKKyAgICBuZ3hfdW5peF9kb21haW5fdXBzdHJlYW1fdCAgIHVuaXhfdXBzdHJlYW07CisjZW5kaWYKKyAgICAKKyAgICB2YWx1ZSA9IGNmLT5hcmdzLT5lbHRzOworCisgICAgdXJsID0gJnZhbHVlWzFdOworCisgICAgaWYgKG5neF9zdHJuY2FzZWNtcCh1cmwtPmRhdGEsICJ1bml4OiIsIDUpID09IDApIHsKKworI2lmIChOR1hfSEFWRV9VTklYX0RPTUFJTikKKworICAgICAgICBuZ3hfbWVtemVybygmdW5peF91cHN0cmVhbSwgc2l6ZW9mKG5neF91bml4X2RvbWFpbl91cHN0cmVhbV90KSk7CisKKyAgICAgICAgdW5peF91cHN0cmVhbS5uYW1lID0gKnVybDsKKyAgICAgICAgdW5peF91cHN0cmVhbS51cmwgPSAqdXJsOworICAgICAgICB1bml4X3Vwc3RyZWFtLnVyaV9wYXJ0ID0gMTsKKworICAgICAgICBhaGNmLT5wZWVycyA9IG5neF91bml4X3Vwc3RyZWFtX3BhcnNlKGNmLCAmdW5peF91cHN0cmVhbSk7CisgICAgICAgIGlmIChhaGNmLT5wZWVycyA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBhaGNmLT5wZWVycy0+cGVlclswXS51cmlfc2VwYXJhdG9yID0gIjoiOworCisgICAgICAgIGFoY2YtPmhvc3RfaGVhZGVyLmxlbiA9IHNpemVvZigibG9jYWxob3N0IikgLSAxOworICAgICAgICBhaGNmLT5ob3N0X2hlYWRlci5kYXRhID0gKHVfY2hhciAqKSAibG9jYWxob3N0IjsKKyAgICAgICAgYWhjZi0+dXJpID0gdW5peF91cHN0cmVhbS51cmk7CisgICAgCisjZWxzZQorICAgICAgICBuZ3hfY29uZl9sb2dfZXJyb3IoTkdYX0xPR19FTUVSRywgY2YsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIHVuaXggZG9tYWluIHNvY2tldHMgYXJlIG5vdCBzdXBwb3J0ZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9uIHRoaXMgcGxhdGZvcm0iKTsKKyAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgIAorI2VuZGlmCisKKyAgICB9IGVsc2UgeworICAgICAgICBuZ3hfbWVtemVybygmaW5ldF91cHN0cmVhbSwgc2l6ZW9mKG5neF9pbmV0X3Vwc3RyZWFtX3QpKTsKKworICAgICAgICBpbmV0X3Vwc3RyZWFtLm5hbWUgPSAqdXJsOworICAgICAgICBpbmV0X3Vwc3RyZWFtLnVybCA9ICp1cmw7CisgICAgICAgIGluZXRfdXBzdHJlYW0uZGVmYXVsdF9wb3J0X3ZhbHVlID0gODA7CisgICAgICAgIGluZXRfdXBzdHJlYW0udXJpX3BhcnQgPSAxOworCisgICAgICAgIGFoY2YtPnBlZXJzID0gbmd4X2luZXRfdXBzdHJlYW1fcGFyc2UoY2YsICZpbmV0X3Vwc3RyZWFtKTsKKyAgICAgICAgaWYgKGFoY2YtPnBlZXJzID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhaGNmLT5wZWVycy0+bnVtYmVyOyBpKyspIHsKKyAgICAgICAgICAgIGFoY2YtPnBlZXJzLT5wZWVyW2ldLnVyaV9zZXBhcmF0b3IgPSAiOiI7CisgICAgICAgIH0KKworICAgICAgICBhaGNmLT5ob3N0X2hlYWRlciA9IGluZXRfdXBzdHJlYW0uaG9zdF9oZWFkZXI7CisgICAgICAgIGFoY2YtPnVyaSA9IGluZXRfdXBzdHJlYW0udXJpOworICAgIH0KKworICAgIHJldHVybiBOR1hfQ09ORl9PSzsKK30KZGlmZiAtLWdpdCBhL3NyYy9pbWFwL25neF9pbWFwX2NvcmVfbW9kdWxlLmMgYi9zcmMvaW1hcC9uZ3hfaW1hcF9jb3JlX21vZHVsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlNzc1ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvaW1hcC9uZ3hfaW1hcF9jb3JlX21vZHVsZS5jCkBAIC0wLDAgKzEsMjk3IEBACisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIElnb3IgU3lzb2V2CisgKi8KKworCisjaW5jbHVkZSA8bmd4X2NvbmZpZy5oPgorI2luY2x1ZGUgPG5neF9jb3JlLmg+CisjaW5jbHVkZSA8bmd4X2V2ZW50Lmg+CisjaW5jbHVkZSA8bmd4X2ltYXAuaD4KKworCitzdGF0aWMgdm9pZCAqbmd4X2ltYXBfY29yZV9jcmVhdGVfbWFpbl9jb25mKG5neF9jb25mX3QgKmNmKTsKK3N0YXRpYyB2b2lkICpuZ3hfaW1hcF9jb3JlX2NyZWF0ZV9zcnZfY29uZihuZ3hfY29uZl90ICpjZik7CitzdGF0aWMgY2hhciAqbmd4X2ltYXBfY29yZV9tZXJnZV9zcnZfY29uZihuZ3hfY29uZl90ICpjZiwgdm9pZCAqcGFyZW50LAorICAgIHZvaWQgKmNoaWxkKTsKK3N0YXRpYyBjaGFyICpuZ3hfaW1hcF9jb3JlX3NlcnZlcihuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqY21kLAorICAgIHZvaWQgKmNvbmYpOworc3RhdGljIGNoYXIgKm5neF9pbWFwX2NvcmVfbGlzdGVuKG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpjbWQsCisgICAgdm9pZCAqY29uZik7CisKKworc3RhdGljIG5neF9jb25mX2VudW1fdCAgbmd4X2ltYXBfY29yZV9wcm9jb3RvbFtdID0geworICAgIHsgbmd4X3N0cmluZygicG9wMyIpLCBOR1hfSU1BUF9QT1AzX1BST1RPQ09MIH0sCisgICAgeyBuZ3hfc3RyaW5nKCJpbWFwIiksIE5HWF9JTUFQX0lNQVBfUFJPVE9DT0wgfSwKKyAgICB7IG5neF9udWxsX3N0cmluZywgMCB9Cit9OworCisKK3N0YXRpYyBuZ3hfY29tbWFuZF90ICBuZ3hfaW1hcF9jb3JlX2NvbW1hbmRzW10gPSB7CisKKyAgICB7IG5neF9zdHJpbmcoInNlcnZlciIpLAorICAgICAgTkdYX0lNQVBfTUFJTl9DT05GfE5HWF9DT05GX0JMT0NLfE5HWF9DT05GX05PQVJHUywKKyAgICAgIG5neF9pbWFwX2NvcmVfc2VydmVyLAorICAgICAgMCwKKyAgICAgIDAsCisgICAgICBOVUxMIH0sCisKKyAgICB7IG5neF9zdHJpbmcoImxpc3RlbiIpLAorICAgICAgTkdYX0lNQVBfU1JWX0NPTkZ8TkdYX0NPTkZfVEFLRTEsCisgICAgICBuZ3hfaW1hcF9jb3JlX2xpc3RlbiwKKyAgICAgIDAsCisgICAgICAwLAorICAgICAgTlVMTCB9LAorCisgICAgeyBuZ3hfc3RyaW5nKCJwcm90b2NvbCIpLAorICAgICAgTkdYX0lNQVBfU1JWX0NPTkZ8TkdYX0NPTkZfVEFLRTEsCisgICAgICBuZ3hfY29uZl9zZXRfZW51bV9zbG90LAorICAgICAgTkdYX0lNQVBfU1JWX0NPTkZfT0ZGU0VULAorICAgICAgb2Zmc2V0b2Yobmd4X2ltYXBfY29yZV9zcnZfY29uZl90LCBwcm90b2NvbCksCisgICAgICAmbmd4X2ltYXBfY29yZV9wcm9jb3RvbCB9LAorCisgICAgeyBuZ3hfc3RyaW5nKCJpbWFwX2NsaWVudF9idWZmZXIiKSwKKyAgICAgIE5HWF9JTUFQX01BSU5fQ09ORnxOR1hfSU1BUF9TUlZfQ09ORnxOR1hfQ09ORl9UQUtFMSwKKyAgICAgIG5neF9jb25mX3NldF9zaXplX3Nsb3QsCisgICAgICBOR1hfSU1BUF9TUlZfQ09ORl9PRkZTRVQsCisgICAgICBvZmZzZXRvZihuZ3hfaW1hcF9jb3JlX3Nydl9jb25mX3QsIGltYXBfY2xpZW50X2J1ZmZlcl9zaXplKSwKKyAgICAgIE5VTEwgfSwKKworICAgIHsgbmd4X3N0cmluZygicHJveHlfYnVmZmVyIiksCisgICAgICBOR1hfSU1BUF9NQUlOX0NPTkZ8TkdYX0lNQVBfU1JWX0NPTkZ8TkdYX0NPTkZfVEFLRTEsCisgICAgICBuZ3hfY29uZl9zZXRfc2l6ZV9zbG90LAorICAgICAgTkdYX0lNQVBfU1JWX0NPTkZfT0ZGU0VULAorICAgICAgb2Zmc2V0b2Yobmd4X2ltYXBfY29yZV9zcnZfY29uZl90LCBwcm94eV9idWZmZXJfc2l6ZSksCisgICAgICBOVUxMIH0sCisKKyAgICB7IG5neF9zdHJpbmcoInRpbWVvdXQiKSwKKyAgICAgIE5HWF9JTUFQX01BSU5fQ09ORnxOR1hfSU1BUF9TUlZfQ09ORnxOR1hfQ09ORl9UQUtFMSwKKyAgICAgIG5neF9jb25mX3NldF9tc2VjX3Nsb3QsCisgICAgICBOR1hfSU1BUF9TUlZfQ09ORl9PRkZTRVQsCisgICAgICBvZmZzZXRvZihuZ3hfaW1hcF9jb3JlX3Nydl9jb25mX3QsIHRpbWVvdXQpLAorICAgICAgTlVMTCB9LAorCisgICAgICBuZ3hfbnVsbF9jb21tYW5kCit9OworCisKK3N0YXRpYyBuZ3hfaW1hcF9tb2R1bGVfdCAgbmd4X2ltYXBfY29yZV9tb2R1bGVfY3R4ID0geworICAgIG5neF9pbWFwX2NvcmVfY3JlYXRlX21haW5fY29uZiwgICAgICAgIC8qIGNyZWF0ZSBtYWluIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0IG1haW4gY29uZmlndXJhdGlvbiAqLworCisgICAgbmd4X2ltYXBfY29yZV9jcmVhdGVfc3J2X2NvbmYsICAgICAgICAgLyogY3JlYXRlIHNlcnZlciBjb25maWd1cmF0aW9uICovCisgICAgbmd4X2ltYXBfY29yZV9tZXJnZV9zcnZfY29uZiAgICAgICAgICAgLyogbWVyZ2Ugc2VydmVyIGNvbmZpZ3VyYXRpb24gKi8KK307CisKKworbmd4X21vZHVsZV90ICBuZ3hfaW1hcF9jb3JlX21vZHVsZSA9IHsKKyAgICBOR1hfTU9EVUxFX1YxLAorICAgICZuZ3hfaW1hcF9jb3JlX21vZHVsZV9jdHgsICAgICAgICAgICAgIC8qIG1vZHVsZSBjb250ZXh0ICovCisgICAgbmd4X2ltYXBfY29yZV9jb21tYW5kcywgICAgICAgICAgICAgICAgLyogbW9kdWxlIGRpcmVjdGl2ZXMgKi8KKyAgICBOR1hfSU1BUF9NT0RVTEUsICAgICAgICAgICAgICAgICAgICAgICAvKiBtb2R1bGUgdHlwZSAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXQgbW9kdWxlICovCisgICAgTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdCBwcm9jZXNzICovCit9OworCisKK3N0YXRpYyB2b2lkICoKK25neF9pbWFwX2NvcmVfY3JlYXRlX21haW5fY29uZihuZ3hfY29uZl90ICpjZikKK3sgICAgICAgICAgIAorICAgIG5neF9pbWFwX2NvcmVfbWFpbl9jb25mX3QgICpjbWNmOworCisgICAgY21jZiA9IG5neF9wY2FsbG9jKGNmLT5wb29sLCBzaXplb2Yobmd4X2ltYXBfY29yZV9tYWluX2NvbmZfdCkpOworICAgIGlmIChjbWNmID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgIH0KKworICAgIGlmIChuZ3hfYXJyYXlfaW5pdCgmY21jZi0+c2VydmVycywgY2YtPnBvb2wsIDQsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfaW1hcF9jb3JlX3Nydl9jb25mX3QgKikpID09IE5HWF9FUlJPUikKKyAgICB7CisgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gY21jZjsKK30KKworCitzdGF0aWMgdm9pZCAqCituZ3hfaW1hcF9jb3JlX2NyZWF0ZV9zcnZfY29uZihuZ3hfY29uZl90ICpjZikKK3sgICAgICAgICAgIAorICAgIG5neF9pbWFwX2NvcmVfc3J2X2NvbmZfdCAgKmNzY2Y7CisgICAgICAgICAgICAKKyAgICBjc2NmID0gbmd4X3BjYWxsb2MoY2YtPnBvb2wsIHNpemVvZihuZ3hfaW1hcF9jb3JlX3Nydl9jb25mX3QpKTsKKyAgICBpZiAoY3NjZiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICB9CisKKyAgICBjc2NmLT5pbWFwX2NsaWVudF9idWZmZXJfc2l6ZSA9IE5HWF9DT05GX1VOU0VUX1NJWkU7CisgICAgY3NjZi0+cHJveHlfYnVmZmVyX3NpemUgPSBOR1hfQ09ORl9VTlNFVF9TSVpFOworICAgIGNzY2YtPnRpbWVvdXQgPSBOR1hfQ09ORl9VTlNFVF9NU0VDOworICAgIGNzY2YtPnByb3RvY29sID0gTkdYX0NPTkZfVU5TRVRfVUlOVDsKKworICAgIHJldHVybiBjc2NmOworfQorCisKK3N0YXRpYyBjaGFyICoKK25neF9pbWFwX2NvcmVfbWVyZ2Vfc3J2X2NvbmYobmd4X2NvbmZfdCAqY2YsIHZvaWQgKnBhcmVudCwgdm9pZCAqY2hpbGQpCit7CisgICAgbmd4X2ltYXBfY29yZV9zcnZfY29uZl90ICpwcmV2ID0gcGFyZW50OworICAgIG5neF9pbWFwX2NvcmVfc3J2X2NvbmZfdCAqY29uZiA9IGNoaWxkOworCisgICAgbmd4X2NvbmZfbWVyZ2Vfc2l6ZV92YWx1ZShjb25mLT5pbWFwX2NsaWVudF9idWZmZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXYtPmltYXBfY2xpZW50X2J1ZmZlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVfdCkgbmd4X3BhZ2VzaXplKTsKKyAgICBuZ3hfY29uZl9tZXJnZV9zaXplX3ZhbHVlKGNvbmYtPnByb3h5X2J1ZmZlcl9zaXplLCBwcmV2LT5wcm94eV9idWZmZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplX3QpIG5neF9wYWdlc2l6ZSk7CisgICAgbmd4X2NvbmZfbWVyZ2VfbXNlY192YWx1ZShjb25mLT50aW1lb3V0LCBwcmV2LT50aW1lb3V0LCA2MDAwMCk7CisgICAgbmd4X2NvbmZfbWVyZ2VfdW5zaWduZWRfdmFsdWUoY29uZi0+cHJvdG9jb2wsIHByZXYtPnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdYX0lNQVBfSU1BUF9QUk9UT0NPTCk7CisKKyAgICByZXR1cm4gTkdYX0NPTkZfT0s7Cit9CisKKworc3RhdGljIGNoYXIgKgorbmd4X2ltYXBfY29yZV9zZXJ2ZXIobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwgdm9pZCAqY29uZikKK3sKKyAgICBjaGFyICAgICAgICAgICAgICAgICAgICAgICAqcnY7CisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgKm1jb25mOworICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICBtOworICAgIG5neF9jb25mX3QgICAgICAgICAgICAgICAgICBwY2Y7CisgICAgbmd4X2ltYXBfbW9kdWxlX3QgICAgICAgICAgKm1vZHVsZTsKKyAgICBuZ3hfaW1hcF9jb25mX2N0eF90ICAgICAgICAqY3R4LCAqaW1hcF9jdHg7CisgICAgbmd4X2ltYXBfY29yZV9zcnZfY29uZl90ICAgKmNzY2YsICoqY3NjZnA7CisgICAgbmd4X2ltYXBfY29yZV9tYWluX2NvbmZfdCAgKmNtY2Y7CisKKworICAgIGN0eCA9IG5neF9wY2FsbG9jKGNmLT5wb29sLCBzaXplb2Yobmd4X2ltYXBfY29uZl9jdHhfdCkpOworICAgIGlmIChjdHggPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgfQorCisgICAgaW1hcF9jdHggPSBjZi0+Y3R4OworICAgIGN0eC0+bWFpbl9jb25mID0gaW1hcF9jdHgtPm1haW5fY29uZjsKKyAgICAKKyAgICAvKiB0aGUgc2VydmVye30ncyBzcnZfY29uZiAqLworCisgICAgY3R4LT5zcnZfY29uZiA9IG5neF9wY2FsbG9jKGNmLT5wb29sLCBzaXplb2Yodm9pZCAqKSAqIG5neF9pbWFwX21heF9tb2R1bGUpOworICAgIGlmIChjdHgtPnNydl9jb25mID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgIH0KKworICAgIGZvciAobSA9IDA7IG5neF9tb2R1bGVzW21dOyBtKyspIHsKKyAgICAgICAgaWYgKG5neF9tb2R1bGVzW21dLT50eXBlICE9IE5HWF9JTUFQX01PRFVMRSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBtb2R1bGUgPSBuZ3hfbW9kdWxlc1ttXS0+Y3R4OworCisgICAgICAgIGlmIChtb2R1bGUtPmNyZWF0ZV9zcnZfY29uZikgeworICAgICAgICAgICAgbWNvbmYgPSBtb2R1bGUtPmNyZWF0ZV9zcnZfY29uZihjZik7CisgICAgICAgICAgICBpZiAobWNvbmYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY3R4LT5zcnZfY29uZltuZ3hfbW9kdWxlc1ttXS0+Y3R4X2luZGV4XSA9IG1jb25mOworICAgICAgICB9CisgICAgfQorCisgICAgLyogdGhlIHNlcnZlciBjb25maWd1cmF0aW9uIGNvbnRleHQgKi8KKworICAgIGNzY2YgPSBjdHgtPnNydl9jb25mW25neF9pbWFwX2NvcmVfbW9kdWxlLmN0eF9pbmRleF07CisgICAgY3NjZi0+Y3R4ID0gY3R4OworCisgICAgY21jZiA9IGN0eC0+bWFpbl9jb25mW25neF9pbWFwX2NvcmVfbW9kdWxlLmN0eF9pbmRleF07CisKKyAgICBjc2NmcCA9IG5neF9hcnJheV9wdXNoKCZjbWNmLT5zZXJ2ZXJzKTsKKyAgICBpZiAoY3NjZnAgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgfQorCisgICAgKmNzY2ZwID0gY3NjZjsKKworCisgICAgLyogcGFyc2UgaW5zaWRlIHNlcnZlcnt9ICovCisKKyAgICBwY2YgPSAqY2Y7CisgICAgY2YtPmN0eCA9IGN0eDsKKyAgICBjZi0+Y21kX3R5cGUgPSBOR1hfSU1BUF9TUlZfQ09ORjsKKworICAgIHJ2ID0gbmd4X2NvbmZfcGFyc2UoY2YsIE5VTEwpOworCisgICAgKmNmID0gcGNmOworCisgICAgcmV0dXJuIHJ2OworfQorCisKKy8qIEFGX0lORVQgb25seSAqLworCitzdGF0aWMgY2hhciAqCituZ3hfaW1hcF9jb3JlX2xpc3RlbihuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqY21kLCB2b2lkICpjb25mKQoreworICAgIGNoYXIgICAgICAgICAgICAgICAgICplcnI7CisgICAgbmd4X3N0cl90ICAgICAgICAgICAgKnZhbHVlOworICAgIGluX2FkZHJfdCAgICAgICAgICAgICBpbl9hZGRyOworICAgIHN0cnVjdCBob3N0ZW50ICAgICAgICpoOworICAgIG5neF9saXN0ZW5pbmdfdCAgICAgICpsczsKKyAgICBuZ3hfaW5ldF91cHN0cmVhbV90ICAgaW5ldF91cHN0cmVhbTsKKworICAgIHZhbHVlID0gY2YtPmFyZ3MtPmVsdHM7CisKKyAgICBuZ3hfbWVtemVybygmaW5ldF91cHN0cmVhbSwgc2l6ZW9mKG5neF9pbmV0X3Vwc3RyZWFtX3QpKTsKKworICAgIGluZXRfdXBzdHJlYW0udXJsID0gdmFsdWVbMV07CisgICAgaW5ldF91cHN0cmVhbS5wb3J0X29ubHkgPSAxOworCisgICAgZXJyID0gbmd4X2luZXRfcGFyc2VfaG9zdF9wb3J0KCZpbmV0X3Vwc3RyZWFtKTsKKworICAgIGlmIChlcnIpIHsKKyAgICAgICAgbmd4X2NvbmZfbG9nX2Vycm9yKE5HWF9MT0dfRU1FUkcsIGNmLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzIGluIFwiJVZcIiBvZiB0aGUgXCJsaXN0ZW5cIiBkaXJlY3RpdmUiLCBlcnIpOworICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgfQorCisgICAgaWYgKGluZXRfdXBzdHJlYW0uaG9zdC5sZW4pIHsKKyAgICAgICAgaW5ldF91cHN0cmVhbS5ob3N0LmRhdGFbaW5ldF91cHN0cmVhbS5ob3N0Lmxlbl0gPSAnXDAnOworCisgICAgICAgIGluX2FkZHIgPSBpbmV0X2FkZHIoKGNvbnN0IGNoYXIgKikgaW5ldF91cHN0cmVhbS5ob3N0LmRhdGEpOworCisgICAgICAgIGlmIChpbl9hZGRyID09IElOQUREUl9OT05FKSB7CisgICAgICAgICAgICBoID0gZ2V0aG9zdGJ5bmFtZSgoY29uc3QgY2hhciAqKSBpbmV0X3Vwc3RyZWFtLmhvc3QuZGF0YSk7CisgICAgCisgICAgICAgICAgICBpZiAoaCA9PSBOVUxMIHx8IGgtPmhfYWRkcl9saXN0WzBdID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBuZ3hfY29uZl9sb2dfZXJyb3IoTkdYX0xPR19FTUVSRywgY2YsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYW4gbm90IHJlc29sdmUgaG9zdCBcIiVzXCIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4gdGhlIFwibGlzdGVuXCIgZGlyZWN0aXZlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5ldF91cHN0cmVhbS5ob3N0LmRhdGEpOworICAgICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW5fYWRkciA9ICooaW5fYWRkcl90ICopKGgtPmhfYWRkcl9saXN0WzBdKTsKKyAgICAgICAgfQorCisgICAgfSBlbHNlIHsKKyAgICAgICAgaW5fYWRkciA9IElOQUREUl9BTlk7CisgICAgfQorCisKKyAgICBscyA9IG5neF9saXN0ZW5pbmdfaW5ldF9zdHJlYW1fc29ja2V0KGNmLCBpbl9hZGRyLCBpbmV0X3Vwc3RyZWFtLnBvcnQpOworICAgIGlmIChscyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsgCisgICAgfQorCisgICAgbHMtPmJhY2tsb2cgPSAtMTsKKyAgICBscy0+YWRkcl9udG9wID0gMTsKKyAgICBscy0+aGFuZGxlciA9IG5neF9pbWFwX2luaXRfY29ubmVjdGlvbjsKKyAgICBscy0+cG9vbF9zaXplID0gMjU2OworCisgICAgbHMtPmN0eCA9IGNmLT5jdHg7CisKKyAgICAvKiBTVFVCICovCisgICAgbHMtPmxvZyA9IGNmLT5jeWNsZS0+bmV3X2xvZzsKKyAgICAvKiovCisKKyAgICByZXR1cm4gTkdYX0NPTkZfT0s7Cit9CmRpZmYgLS1naXQgYS9zcmMvaW1hcC9uZ3hfaW1hcF9oYW5kbGVyLmMgYi9zcmMvaW1hcC9uZ3hfaW1hcF9oYW5kbGVyLmMKaW5kZXggZjY1ZGI4MS4uYmUyYzlkMSAxMDA2NDQKLS0tIGEvc3JjL2ltYXAvbmd4X2ltYXBfaGFuZGxlci5jCisrKyBiL3NyYy9pbWFwL25neF9pbWFwX2hhbmRsZXIuYwpAQCAtMTIsMzMgKzEyLDM5IEBACiAKIAogc3RhdGljIHZvaWQgbmd4X2ltYXBfaW5pdF9zZXNzaW9uKG5neF9ldmVudF90ICpyZXYpOworCiBzdGF0aWMgdm9pZCBuZ3hfcG9wM19hdXRoX3N0YXRlKG5neF9ldmVudF90ICpyZXYpOwogc3RhdGljIG5neF9pbnRfdCBuZ3hfcG9wM19yZWFkX2NvbW1hbmQobmd4X2ltYXBfc2Vzc2lvbl90ICpzKTsKIAotCi1zdGF0aWMgdV9jaGFyIHBvcDNfZ3JlZXRpbmdbXSA9ICIrT0sgIiBOR0lOWF9WRVIgIiByZWFkeSIgQ1JMRjsKLSNpZiAwCi1zdGF0aWMgdV9jaGFyIGltYXBfZ3JlZXRpbmdbXSA9ICIqIE9LICIgTkdJTlhfVkVSICIgcmVhZHkiIENSTEY7Ci0jZW5kaWYKLQotc3RhdGljIHVfY2hhciBwb3AzX29rW10gPSAiK09LIiBDUkxGOwotc3RhdGljIHVfY2hhciBwb3AzX2ludmFsaWRfY29tbWFuZFtdID0gIi1FUlIgaW52YWxpZCBjb21tYW5kIiBDUkxGOworc3RhdGljIHZvaWQgbmd4X2ltYXBfYXV0aF9zdGF0ZShuZ3hfZXZlbnRfdCAqcmV2KTsKIAogCi12b2lkIG5neF9pbWFwX2luaXRfY29ubmVjdGlvbihuZ3hfY29ubmVjdGlvbl90ICpjKQorc3RhdGljIG5neF9zdHJfdCAgZ3JlZXRpbmdzW10gPSB7CisgICBuZ3hfc3RyaW5nKCIrT0sgIiBOR0lOWF9WRVIgIiByZWFkeSIgQ1JMRiksCisgICBuZ3hfc3RyaW5nKCIqIE9LICIgTkdJTlhfVkVSICIgcmVhZHkiIENSTEYpCit9OworCitzdGF0aWMgdV9jaGFyICBwb3AzX29rW10gPSAiK09LIiBDUkxGOworc3RhdGljIHVfY2hhciAgcG9wM19pbnZhbGlkX2NvbW1hbmRbXSA9ICItRVJSIGludmFsaWQgY29tbWFuZCIgQ1JMRjsKKworCit2b2lkCituZ3hfaW1hcF9pbml0X2Nvbm5lY3Rpb24obmd4X2Nvbm5lY3Rpb25fdCAqYykKIHsKLSAgICB1X2NoYXIgICAqZ3JlZXRpbmc7Ci0gICAgc3NpemVfdCAgIHNpemU7CisgICAgc3NpemVfdCAgICAgICAgICAgICAgICAgICAgc2l6ZTsKKyAgICBuZ3hfaW1hcF9jb25mX2N0eF90ICAgICAgICpjdHg7CisgICAgbmd4X2ltYXBfY29yZV9zcnZfY29uZl90ICAqY3NjZjsKIAotICAgIG5neF9sb2dfZGVidWcwKE5HWF9MT0dfREVCVUdfSU1BUCwgYy0+bG9nLCAwLAotICAgICAgICAgICAgICAgICAgICJpbWFwIGluaXQgY29ubmVjdGlvbiIpOworICAgIG5neF9sb2dfZGVidWcwKE5HWF9MT0dfREVCVUdfSU1BUCwgYy0+bG9nLCAwLCAiaW1hcCBpbml0IGNvbm5lY3Rpb24iKTsKIAogICAgIGMtPmxvZ19lcnJvciA9IE5HWF9FUlJPUl9JTkZPOwogCi0gICAgZ3JlZXRpbmcgPSBwb3AzX2dyZWV0aW5nOwotICAgIHNpemUgPSBzaXplb2YocG9wM19ncmVldGluZykgLSAxOworICAgIGN0eCA9IGMtPmN0eDsKKyAgICBjc2NmID0gbmd4X2ltYXBfZ2V0X21vZHVsZV9zcnZfY29uZihjdHgsIG5neF9pbWFwX2NvcmVfbW9kdWxlKTsKIAotICAgIGlmIChuZ3hfc2VuZChjLCBncmVldGluZywgc2l6ZSkgPCBzaXplKSB7CisgICAgc2l6ZSA9IGdyZWV0aW5nc1tjc2NmLT5wcm90b2NvbF0ubGVuOworCisgICAgaWYgKG5neF9zZW5kKGMsIGdyZWV0aW5nc1tjc2NmLT5wcm90b2NvbF0uZGF0YSwgc2l6ZSkgPCBzaXplKSB7CiAgICAgICAgIC8qCiAgICAgICAgICAqIHdlIHRyZWF0IHRoZSBpbmNvbXBsZXRlIHNlbmRpbmcgYXMgTkdYX0VSUk9SCiAgICAgICAgICAqIGJlY2F1c2UgaXQgaXMgdmVyeSBzdHJhbmdlIGhlcmUKQEAgLTQ5LDcgKzU1LDcgQEAKIAogICAgIGMtPnJlYWQtPmhhbmRsZXIgPSBuZ3hfaW1hcF9pbml0X3Nlc3Npb247CiAKLSAgICBuZ3hfYWRkX3RpbWVyKGMtPnJlYWQsIC8qIFNUVUIgKi8gNjAwMDApOworICAgIG5neF9hZGRfdGltZXIoYy0+cmVhZCwgY3NjZi0+dGltZW91dCk7CiAKICAgICBpZiAobmd4X2hhbmRsZV9yZWFkX2V2ZW50KGMtPnJlYWQsIDApID09IE5HWF9FUlJPUikgewogICAgICAgICBuZ3hfaW1hcF9jbG9zZV9jb25uZWN0aW9uKGMpOwpAQCAtNTcsMTEgKzYzLDE0IEBACiB9CiAKIAotc3RhdGljIHZvaWQgbmd4X2ltYXBfaW5pdF9zZXNzaW9uKG5neF9ldmVudF90ICpyZXYpCitzdGF0aWMgdm9pZAorbmd4X2ltYXBfaW5pdF9zZXNzaW9uKG5neF9ldmVudF90ICpyZXYpCiB7Ci0gICAgc2l6ZV90ICAgICAgICAgICAgICAgc2l6ZTsKLSAgICBuZ3hfY29ubmVjdGlvbl90ICAgICpjOwotICAgIG5neF9pbWFwX3Nlc3Npb25fdCAgKnM7CisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgc2l6ZTsKKyAgICBuZ3hfY29ubmVjdGlvbl90ICAgICAgICAgICpjOworICAgIG5neF9pbWFwX3Nlc3Npb25fdCAgICAgICAgKnM7CisgICAgbmd4X2ltYXBfY29uZl9jdHhfdCAgICAgICAqY3R4OworICAgIG5neF9pbWFwX2NvcmVfc3J2X2NvbmZfdCAgKmNzY2Y7CiAKICAgICBjID0gcmV2LT5kYXRhOwogCkBAIC04MCwxMiArODksMzMgQEAKICAgICBjLT5kYXRhID0gczsKICAgICBzLT5jb25uZWN0aW9uID0gYzsKIAorICAgIHMtPmN0eCA9IG5neF9wY2FsbG9jKGMtPnBvb2wsIHNpemVvZih2b2lkICopICogbmd4X2ltYXBfbWF4X21vZHVsZSk7CisgICAgaWYgKHMtPmN0eCA9PSBOVUxMKSB7CisgICAgICAgIG5neF9pbWFwX2Nsb3NlX2Nvbm5lY3Rpb24oYyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjdHggPSBjLT5jdHg7CisgICAgcy0+bWFpbl9jb25mID0gY3R4LT5tYWluX2NvbmY7CisgICAgcy0+c3J2X2NvbmYgPSBjdHgtPnNydl9jb25mOworCiAgICAgaWYgKG5neF9hcnJheV9pbml0KCZzLT5hcmdzLCBjLT5wb29sLCAyLCBzaXplb2Yobmd4X3N0cl90KSkgPT0gTkdYX0VSUk9SKSB7CiAgICAgICAgIG5neF9pbWFwX2Nsb3NlX2Nvbm5lY3Rpb24oYyk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBzaXplID0gLyogU1RVQjogcG9wMzogMTI4LCBpbWFwOiBjb25maWd1cmFibGUgNEsgZGVmYXVsdCAqLyAxMjg7CisgICAgY3NjZiA9IG5neF9pbWFwX2dldF9tb2R1bGVfc3J2X2NvbmYocywgbmd4X2ltYXBfY29yZV9tb2R1bGUpOworCisgICAgcy0+cHJvdG9jb2wgPSBjc2NmLT5wcm90b2NvbDsKKworICAgIGlmIChjc2NmLT5wcm90b2NvbCA9PSBOR1hfSU1BUF9QT1AzX1BST1RPQ09MKSB7CisgICAgICAgIHNpemUgPSAxMjg7CisgICAgICAgIGMtPnJlYWQtPmhhbmRsZXIgPSBuZ3hfcG9wM19hdXRoX3N0YXRlOworCisgICAgfSBlbHNlIHsKKyAgICAgICAgc2l6ZSA9IGNzY2YtPmltYXBfY2xpZW50X2J1ZmZlcl9zaXplOworICAgICAgICBjLT5yZWFkLT5oYW5kbGVyID0gbmd4X2ltYXBfYXV0aF9zdGF0ZTsKKyAgICB9CiAKICAgICBzLT5idWZmZXIgPSBuZ3hfY3JlYXRlX3RlbXBfYnVmKGMtPnBvb2wsIHNpemUpOwogICAgIGlmIChzLT5idWZmZXIgPT0gTlVMTCkgewpAQCAtOTMsMTMgKzEyMywyMyBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgYy0+cmVhZC0+aGFuZGxlciA9IG5neF9wb3AzX2F1dGhfc3RhdGU7Ci0KLSAgICBuZ3hfcG9wM19hdXRoX3N0YXRlKHJldik7CisgICAgYy0+cmVhZC0+aGFuZGxlcihyZXYpOwogfQogCiAKLXN0YXRpYyB2b2lkIG5neF9wb3AzX2F1dGhfc3RhdGUobmd4X2V2ZW50X3QgKnJldikKK3N0YXRpYyB2b2lkCituZ3hfaW1hcF9hdXRoX3N0YXRlKG5neF9ldmVudF90ICpyZXYpCit7CisgICAgbmd4X2Nvbm5lY3Rpb25fdCAgKmM7CisKKyAgICBjID0gcmV2LT5kYXRhOworCisgICAgbmd4X2ltYXBfY2xvc2VfY29ubmVjdGlvbihjKTsKK30KKworCitzdGF0aWMgdm9pZAorbmd4X3BvcDNfYXV0aF9zdGF0ZShuZ3hfZXZlbnRfdCAqcmV2KQogewogICAgIHVfY2hhciAgICAgICAgICAgICAgKnRleHQ7CiAgICAgc3NpemVfdCAgICAgICAgICAgICAgc2l6ZTsKQEAgLTE5Niw3ICsyMzYsNyBAQAogICAgICAgICAgICAgICAgICAgICBzLT5idWZmZXItPnBvcyA9IHMtPmJ1ZmZlci0+c3RhcnQ7CiAgICAgICAgICAgICAgICAgICAgIHMtPmJ1ZmZlci0+bGFzdCA9IHMtPmJ1ZmZlci0+c3RhcnQ7CiAKLSAgICAgICAgICAgICAgICAgICAgbmd4X2ltYXBfcHJveHlfaW5pdChzKTsKKyAgICAgICAgICAgICAgICAgICAgbmd4X2ltYXBfYXV0aF9odHRwX2luaXQocyk7CiAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogCkBAIC0yNDUsNyArMjg1LDggQEAKIH0KIAogCi1zdGF0aWMgbmd4X2ludF90IG5neF9wb3AzX3JlYWRfY29tbWFuZChuZ3hfaW1hcF9zZXNzaW9uX3QgKnMpCitzdGF0aWMgbmd4X2ludF90CituZ3hfcG9wM19yZWFkX2NvbW1hbmQobmd4X2ltYXBfc2Vzc2lvbl90ICpzKQogewogICAgIHNzaXplX3QgICAgbjsKICAgICBuZ3hfaW50X3QgIHJjOwpAQCAtMjg4LDcgKzMyOSw4IEBACiAKICNpZiAwCiAKLXZvaWQgbmd4X2ltYXBfY2xvc2Vfc2Vzc2lvbihuZ3hfaW1hcF9zZXNzaW9uX3QgKnMpCit2b2lkCituZ3hfaW1hcF9jbG9zZV9zZXNzaW9uKG5neF9pbWFwX3Nlc3Npb25fdCAqcykKIHsKICAgICBuZ3hfbG9nX2RlYnVnMChOR1hfTE9HX0RFQlVHX0lNQVAsIHMtPmNvbm5lY3Rpb24tPmxvZywgMCwKICAgICAgICAgICAgICAgICAgICAiY2xvc2UgaW1hcCBzZXNzaW9uIik7CkBAIC0yOTksNyArMzQxLDggQEAKICNlbmRpZgogCiAKLXZvaWQgbmd4X2ltYXBfY2xvc2VfY29ubmVjdGlvbihuZ3hfY29ubmVjdGlvbl90ICpjKQordm9pZAorbmd4X2ltYXBfY2xvc2VfY29ubmVjdGlvbihuZ3hfY29ubmVjdGlvbl90ICpjKQogewogICAgIG5neF9wb29sX3QgICpwb29sOwogCmRpZmYgLS1naXQgYS9zcmMvaW1hcC9uZ3hfaW1hcF9wcm94eS5jIGIvc3JjL2ltYXAvbmd4X2ltYXBfcHJveHlfbW9kdWxlLmMKc2ltaWxhcml0eSBpbmRleCA3NyUKcmVuYW1lIGZyb20gc3JjL2ltYXAvbmd4X2ltYXBfcHJveHkuYwpyZW5hbWUgdG8gc3JjL2ltYXAvbmd4X2ltYXBfcHJveHlfbW9kdWxlLmMKaW5kZXggMmI2ZTMwZS4uYjNiZWRhZSAxMDA2NDQKLS0tIGEvc3JjL2ltYXAvbmd4X2ltYXBfcHJveHkuYworKysgYi9zcmMvaW1hcC9uZ3hfaW1hcF9wcm94eV9tb2R1bGUuYwpAQCAtMTEsMTkgKzExLDU3IEBACiAjaW5jbHVkZSA8bmd4X2ltYXAuaD4KIAogCit0eXBlZGVmIHN0cnVjdCB7CisgICAgbmd4X2ZsYWdfdCAgZW5hYmxlOworfSBuZ3hfaW1hcF9wcm94eV9jb25mX3Q7CisKKwogc3RhdGljIHZvaWQgbmd4X2ltYXBfcHJveHlfYmxvY2tfcmVhZChuZ3hfZXZlbnRfdCAqcmV2KTsKIHN0YXRpYyB2b2lkIG5neF9pbWFwX3Byb3h5X2F1dGhfaGFuZGxlcihuZ3hfZXZlbnRfdCAqcmV2KTsKIHN0YXRpYyB2b2lkIG5neF9pbWFwX3Byb3h5X2R1bW15X2hhbmRsZXIobmd4X2V2ZW50X3QgKmV2KTsKIHN0YXRpYyBuZ3hfaW50X3Qgbmd4X2ltYXBfcHJveHlfcmVhZF9yZXNwb25zZShuZ3hfaW1hcF9zZXNzaW9uX3QgKnMpOwogc3RhdGljIHZvaWQgbmd4X2ltYXBfcHJveHlfaGFuZGxlcihuZ3hfZXZlbnRfdCAqZXYpOwogc3RhdGljIHZvaWQgbmd4X2ltYXBfcHJveHlfY2xvc2Vfc2Vzc2lvbihuZ3hfaW1hcF9zZXNzaW9uX3QgKnMpOworc3RhdGljIHZvaWQgKm5neF9pbWFwX3Byb3h5X2NyZWF0ZV9jb25mKG5neF9jb25mX3QgKmNmKTsKK3N0YXRpYyBjaGFyICpuZ3hfaW1hcF9wcm94eV9tZXJnZV9jb25mKG5neF9jb25mX3QgKmNmLCB2b2lkICpwYXJlbnQsCisgICAgdm9pZCAqY2hpbGQpOwogCiAKLXZvaWQgbmd4X2ltYXBfcHJveHlfaW5pdChuZ3hfaW1hcF9zZXNzaW9uX3QgKnMpCitzdGF0aWMgbmd4X2NvbW1hbmRfdCAgbmd4X2ltYXBfcHJveHlfY29tbWFuZHNbXSA9IHsKKyAgICB7IG5neF9zdHJpbmcoInByb3h5IiksCisgICAgICBOR1hfSU1BUF9NQUlOX0NPTkZ8TkdYX0lNQVBfU1JWX0NPTkZ8TkdYX0NPTkZfRkxBRywKKyAgICAgIG5neF9jb25mX3NldF9mbGFnX3Nsb3QsCisgICAgICBOR1hfSU1BUF9TUlZfQ09ORl9PRkZTRVQsCisgICAgICBvZmZzZXRvZihuZ3hfaW1hcF9wcm94eV9jb25mX3QsIGVuYWJsZSksCisgICAgICBOVUxMIH0sCisKKyAgICAgIG5neF9udWxsX2NvbW1hbmQKK307CisKKworc3RhdGljIG5neF9pbWFwX21vZHVsZV90ICBuZ3hfaW1hcF9wcm94eV9tb2R1bGVfY3R4ID0geworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSBtYWluIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0IG1haW4gY29uZmlndXJhdGlvbiAqLworCisgICAgbmd4X2ltYXBfcHJveHlfY3JlYXRlX2NvbmYsICAgICAgICAgICAgLyogY3JlYXRlIHNlcnZlciBjb25maWd1cmF0aW9uICovCisgICAgbmd4X2ltYXBfcHJveHlfbWVyZ2VfY29uZiAgICAgICAgICAgICAgLyogbWVyZ2Ugc2VydmVyIGNvbmZpZ3VyYXRpb24gKi8KK307CisKKworbmd4X21vZHVsZV90ICBuZ3hfaW1hcF9wcm94eV9tb2R1bGUgPSB7CisgICAgTkdYX01PRFVMRV9WMSwKKyAgICAmbmd4X2ltYXBfcHJveHlfbW9kdWxlX2N0eCwgICAgICAgICAgICAvKiBtb2R1bGUgY29udGV4dCAqLworICAgIG5neF9pbWFwX3Byb3h5X2NvbW1hbmRzLCAgICAgICAgICAgICAgIC8qIG1vZHVsZSBkaXJlY3RpdmVzICovCisgICAgTkdYX0lNQVBfTU9EVUxFLCAgICAgICAgICAgICAgICAgICAgICAgLyogbW9kdWxlIHR5cGUgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0IG1vZHVsZSAqLworICAgIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXQgcHJvY2VzcyAqLworfTsKKworCit2b2lkCituZ3hfaW1hcF9wcm94eV9pbml0KG5neF9pbWFwX3Nlc3Npb25fdCAqcywgbmd4X3BlZXJzX3QgKnBlZXJzKQogewogICAgIG5neF9pbnRfdCAgICAgICAgICAgICAgcmM7Ci0gICAgbmd4X3BlZXJzX3QgICAgICAgICAgICpwZWVyczsKLSAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gICAgKnNpbjsKICAgICBuZ3hfaW1hcF9wcm94eV9jdHhfdCAgKnA7CiAKICAgICBwID0gbmd4X3BjYWxsb2Mocy0+Y29ubmVjdGlvbi0+cG9vbCwgc2l6ZW9mKG5neF9pbWFwX3Byb3h5X2N0eF90KSk7CkBAIC0zNCw0NCArNzIsMTAgQEAKIAogICAgIHMtPnByb3h5ID0gcDsKIAotICAgIC8qKi8KLQotICAgIHBlZXJzID0gbmd4X3BjYWxsb2Mocy0+Y29ubmVjdGlvbi0+cG9vbCwgc2l6ZW9mKG5neF9wZWVyc190KSk7Ci0gICAgaWYgKHBlZXJzID09IE5VTEwpIHsKLSAgICAgICAgbmd4X2ltYXBfY2xvc2VfY29ubmVjdGlvbihzLT5jb25uZWN0aW9uKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQogICAgIHAtPnVwc3RyZWFtLnBlZXJzID0gcGVlcnM7CiAgICAgcC0+dXBzdHJlYW0ubG9nID0gcy0+Y29ubmVjdGlvbi0+bG9nOwogICAgIHAtPnVwc3RyZWFtLmxvZ19lcnJvciA9IE5HWF9FUlJPUl9FUlI7CiAKLSAgICBzaW4gPSBuZ3hfcGNhbGxvYyhzLT5jb25uZWN0aW9uLT5wb29sLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSk7Ci0gICAgaWYgKHNpbiA9PSBOVUxMKSB7Ci0gICAgICAgIG5neF9pbWFwX2Nsb3NlX2Nvbm5lY3Rpb24ocy0+Y29ubmVjdGlvbik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBwZWVycy0+cGVlclswXS5zb2NrYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKikgc2luOwotICAgIHBlZXJzLT5wZWVyWzBdLnNvY2tsZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKTsKLQotICAgIHNpbi0+c2luX3BvcnQgPSBodG9ucygxMTApOwotI2lmIDEKLSAgICBzaW4tPnNpbl9hZGRyLnNfYWRkciA9IGluZXRfYWRkcigiODEuMTkuNjQuMTAxIik7Ci0gICAgcGVlcnMtPnBlZXJbMF0ubmFtZS5sZW4gPSBzaXplb2YoIjgxLjE5LjY0LjEwMToxMTAiKSAtIDE7Ci0gICAgcGVlcnMtPnBlZXJbMF0ubmFtZS5kYXRhID0gKHVfY2hhciAqKSAiODEuMTkuNjQuMTAxOjExMCI7Ci0jZWxzZQotICAgIHNpbi0+c2luX2FkZHIuc19hZGRyID0gaW5ldF9hZGRyKCI4MS4xOS42OS43MCIpOwotICAgIHBlZXJzLT5wZWVyWzBdLm5hbWUubGVuID0gc2l6ZW9mKCI4MS4xOS42OS43MDoxMTAiKSAtIDE7Ci0gICAgcGVlcnMtPnBlZXJbMF0ubmFtZS5kYXRhID0gKHVfY2hhciAqKSAiODEuMTkuNjkuNzA6MTEwIjsKLSNlbmRpZgotCi0gICAgcGVlcnMtPm51bWJlciA9IDE7Ci0KLSAgICBwZWVycy0+cGVlclswXS5tYXhfZmFpbHMgPSAxOwotICAgIHBlZXJzLT5wZWVyWzBdLmZhaWxfdGltZW91dCA9IDYwOwotICAgIHBlZXJzLT5wZWVyWzBdLndlaWdodCA9IDE7Ci0KICAgICByYyA9IG5neF9ldmVudF9jb25uZWN0X3BlZXIoJnAtPnVwc3RyZWFtKTsKIAogICAgIGlmIChyYyA9PSBOR1hfRVJST1IpIHsKQEAgLTg4LDcgKzkyLDggQEAKIH0KIAogCi1zdGF0aWMgdm9pZCBuZ3hfaW1hcF9wcm94eV9ibG9ja19yZWFkKG5neF9ldmVudF90ICpyZXYpCitzdGF0aWMgdm9pZAorbmd4X2ltYXBfcHJveHlfYmxvY2tfcmVhZChuZ3hfZXZlbnRfdCAqcmV2KQogewogICAgIG5neF9jb25uZWN0aW9uX3QgICAgKmM7CiAgICAgbmd4X2ltYXBfc2Vzc2lvbl90ICAqczsKQEAgLTEwNCw3ICsxMDksOCBAQAogfQogCiAKLXN0YXRpYyB2b2lkIG5neF9pbWFwX3Byb3h5X2F1dGhfaGFuZGxlcihuZ3hfZXZlbnRfdCAqcmV2KQorc3RhdGljIHZvaWQKK25neF9pbWFwX3Byb3h5X2F1dGhfaGFuZGxlcihuZ3hfZXZlbnRfdCAqcmV2KQogewogICAgIHVfY2hhciAgICAgICAgICAgICAgKnA7CiAgICAgbmd4X2ludF90ICAgICAgICAgICAgcmM7CkBAIC0yMDcsMTMgKzIxMywxNSBAQAogfQogCiAKLXN0YXRpYyB2b2lkIG5neF9pbWFwX3Byb3h5X2R1bW15X2hhbmRsZXIobmd4X2V2ZW50X3QgKmV2KQorc3RhdGljIHZvaWQKK25neF9pbWFwX3Byb3h5X2R1bW15X2hhbmRsZXIobmd4X2V2ZW50X3QgKmV2KQogewogICAgIG5neF9sb2dfZGVidWcwKE5HWF9MT0dfREVCVUdfSU1BUCwgZXYtPmxvZywgMCwgImltYXAgcHJveHkgZHVtbXkgaGFuZGxlciIpOwogfQogCiAKLXN0YXRpYyBuZ3hfaW50X3Qgbmd4X2ltYXBfcHJveHlfcmVhZF9yZXNwb25zZShuZ3hfaW1hcF9zZXNzaW9uX3QgKnMpCitzdGF0aWMgbmd4X2ludF90CituZ3hfaW1hcF9wcm94eV9yZWFkX3Jlc3BvbnNlKG5neF9pbWFwX3Nlc3Npb25fdCAqcykKIHsKICAgICB1X2NoYXIgICAgICpwOwogICAgIHNzaXplX3QgICAgIG47CkBAIC0yNjcsNyArMjc1LDggQEAKIH0KIAogCi1zdGF0aWMgdm9pZCBuZ3hfaW1hcF9wcm94eV9oYW5kbGVyKG5neF9ldmVudF90ICpldikKK3N0YXRpYyB2b2lkCituZ3hfaW1hcF9wcm94eV9oYW5kbGVyKG5neF9ldmVudF90ICpldikKIHsKICAgICBzaXplX3QgICAgICAgICAgICAgICBzaXplOwogICAgIHNzaXplX3QgICAgICAgICAgICAgIG47CkBAIC0zODcsMTIgKzM5Niw0NCBAQAogfQogCiAKLXN0YXRpYyB2b2lkIG5neF9pbWFwX3Byb3h5X2Nsb3NlX3Nlc3Npb24obmd4X2ltYXBfc2Vzc2lvbl90ICpzKQorc3RhdGljIHZvaWQKK25neF9pbWFwX3Byb3h5X2Nsb3NlX3Nlc3Npb24obmd4X2ltYXBfc2Vzc2lvbl90ICpzKQogewotICAgIGlmIChuZ3hfY2xvc2Vfc29ja2V0KHMtPnByb3h5LT51cHN0cmVhbS5jb25uZWN0aW9uLT5mZCkgPT0gLTEpIHsKLSAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0FMRVJULCBzLT5jb25uZWN0aW9uLT5sb2csIG5neF9zb2NrZXRfZXJybm8sCi0gICAgICAgICAgICAgICAgICAgICAgbmd4X2Nsb3NlX3NvY2tldF9uICIgZmFpbGVkIik7CisgICAgaWYgKHMtPnByb3h5LT51cHN0cmVhbS5jb25uZWN0aW9uKSB7CisgICAgICAgIG5neF9sb2dfZGVidWcxKE5HWF9MT0dfREVCVUdfSU1BUCwgcy0+Y29ubmVjdGlvbi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAiY2xvc2UgaW1hcCBwcm94eSBjb25uZWN0aW9uOiAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgIHMtPnByb3h5LT51cHN0cmVhbS5jb25uZWN0aW9uLT5mZCk7CisKKyAgICAgICAgbmd4X2Nsb3NlX2Nvbm5lY3Rpb24ocy0+cHJveHktPnVwc3RyZWFtLmNvbm5lY3Rpb24pOwogICAgIH0KIAogICAgIG5neF9pbWFwX2Nsb3NlX2Nvbm5lY3Rpb24ocy0+Y29ubmVjdGlvbik7CiB9CisKKworc3RhdGljIHZvaWQgKgorbmd4X2ltYXBfcHJveHlfY3JlYXRlX2NvbmYobmd4X2NvbmZfdCAqY2YpCit7ICAgICAgICAgICAKKyAgICBuZ3hfaW1hcF9wcm94eV9jb25mX3QgICpwY2Y7CisgICAgICAgICAgICAKKyAgICBwY2YgPSBuZ3hfcGNhbGxvYyhjZi0+cG9vbCwgc2l6ZW9mKG5neF9pbWFwX3Byb3h5X2NvbmZfdCkpOworICAgIGlmIChwY2YgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgfQorCisgICAgcGNmLT5lbmFibGUgPSBOR1hfQ09ORl9VTlNFVDsKKworICAgIHJldHVybiBwY2Y7Cit9CisKKworc3RhdGljIGNoYXIgKgorbmd4X2ltYXBfcHJveHlfbWVyZ2VfY29uZihuZ3hfY29uZl90ICpjZiwgdm9pZCAqcGFyZW50LCB2b2lkICpjaGlsZCkKK3sKKyAgICBuZ3hfaW1hcF9wcm94eV9jb25mX3QgKnByZXYgPSBwYXJlbnQ7CisgICAgbmd4X2ltYXBfcHJveHlfY29uZl90ICpjb25mID0gY2hpbGQ7CisKKyAgICBuZ3hfY29uZl9tZXJnZV9tc2VjX3ZhbHVlKGNvbmYtPmVuYWJsZSwgcHJldi0+ZW5hYmxlLCAwKTsKKworICAgIHJldHVybiBOR1hfQ09ORl9PSzsKK30KZGlmZiAtLWdpdCBhL3NyYy9vcy91bml4L25neF9wcm9jZXNzX2N5Y2xlLmMgYi9zcmMvb3MvdW5peC9uZ3hfcHJvY2Vzc19jeWNsZS5jCmluZGV4IGZmYTlkZmUuLjJhMTY1YmYgMTAwNjQ0Ci0tLSBhL3NyYy9vcy91bml4L25neF9wcm9jZXNzX2N5Y2xlLmMKKysrIGIvc3JjL29zL3VuaXgvbmd4X3Byb2Nlc3NfY3ljbGUuYwpAQCAtODM4LDYgKzgzOCwxNSBAQAogCiAjZW5kaWYKIAorICAgIGlmIChjY2YtPndvcmtpbmdfZGlyZWN0b3J5LmxlbikgeworICAgICAgICBpZiAoY2hkaXIoY2NmLT53b3JraW5nX2RpcmVjdG9yeS5kYXRhKSA9PSAtMSkgeworICAgICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0FMRVJULCBjeWNsZS0+bG9nLCBuZ3hfZXJybm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICJjaGRpcihcIiVzXCIpIGZhaWxlZCIsIGNjZi0+d29ya2luZ19kaXJlY3RvcnkuZGF0YSk7CisgICAgICAgICAgICAvKiBmYXRhbCAqLworICAgICAgICAgICAgZXhpdCgyKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHNpZ2VtcHR5c2V0KCZzZXQpOwogCiAgICAgaWYgKHNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmc2V0LCBOVUxMKSA9PSAtMSkgewo=