LyogbW9kaWZpZWQgYnkgTWFydGluIEhlZGVuZmFsayA8bWhlQHN0YWNrZW4ua3RoLnNlPiBmb3IgdXNlIGluIEN1cmwKICogbGFzdCBtb2RpZmllZCAyMDAwLTA5LTE4CiAqIEV2ZW4gbW9yZSBvYnNjdXJpZmllZCB0byBtZXJnZSBiZXR0ZXIgaW50byBsaWJjdXJsIGJ5IERhbmllbCBTdGVuYmVyZy4KICovCgovKgogKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTkgS3VuZ2xpZ2EgVGVrbmlza2EgSPZnc2tvbGFuCiAqIChSb3lhbCBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwgU3RvY2tob2xtLCBTd2VkZW4pLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKiAKICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwogKiBhcmUgbWV0OgogKiAKICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgogKiAKICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQogKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogKiAKICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgSW5zdGl0dXRlIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycwogKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAqIAogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBJTlNUSVRVVEUgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECiAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQogKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQogKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBJTlNUSVRVVEUgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQogKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAogKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwogKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQogKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCiAqIFNVQ0ggREFNQUdFLgogKi8KCiNpbmNsdWRlICJzZXR1cC5oIgoKI2lmZGVmIEtSQjQKCiNpbmNsdWRlIDxjdXJsL21wcmludGYuaD4KCiNpbmNsdWRlICJzZWN1cml0eS5oIgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPG5ldGRiLmg+CiNpbmNsdWRlICJiYXNlNjQuaCIKLyogVGhlIGxhc3QgI2luY2x1ZGUgZmlsZSBzaG91bGQgYmU6ICovCiNpZmRlZiBNQUxMT0NERUJVRwojaW5jbHVkZSAibWVtZGVidWcuaCIKI2VuZGlmCgojZGVmaW5lIG1pbihhLCBiKSAgICgoYSkgPCAoYikgPyAoYSkgOiAoYikpCgpzdGF0aWMgc3RydWN0IHsKICAgIGVudW0gcHJvdGVjdGlvbl9sZXZlbCBsZXZlbDsKICAgIGNvbnN0IGNoYXIgKm5hbWU7Cn0gbGV2ZWxfbmFtZXNbXSA9IHsKICAgIHsgcHJvdF9jbGVhciwgImNsZWFyIiB9LAogICAgeyBwcm90X3NhZmUsICJzYWZlIiB9LAogICAgeyBwcm90X2NvbmZpZGVudGlhbCwgImNvbmZpZGVudGlhbCIgfSwKICAgIHsgcHJvdF9wcml2YXRlLCAicHJpdmF0ZSIgfQp9OwoKc3RhdGljIGNvbnN0IGNoYXIgKgpsZXZlbF90b19uYW1lKGVudW0gcHJvdGVjdGlvbl9sZXZlbCBsZXZlbCkKewogICAgaW50IGk7CiAgICBmb3IoaSA9IDA7IGkgPCBzaXplb2YobGV2ZWxfbmFtZXMpIC8gc2l6ZW9mKGxldmVsX25hbWVzWzBdKTsgaSsrKQoJaWYobGV2ZWxfbmFtZXNbaV0ubGV2ZWwgPT0gbGV2ZWwpCgkgICAgcmV0dXJuIGxldmVsX25hbWVzW2ldLm5hbWU7CiAgICByZXR1cm4gInVua25vd24iOwp9CgojaWZuZGVmIEZUUF9TRVJWRVIgLyogbm90IHVzZWQgaW4gc2VydmVyICovCnN0YXRpYyBlbnVtIHByb3RlY3Rpb25fbGV2ZWwgCm5hbWVfdG9fbGV2ZWwoY29uc3QgY2hhciAqbmFtZSkKewogICAgaW50IGk7CiAgICBmb3IoaSA9IDA7IGkgPCBzaXplb2YobGV2ZWxfbmFtZXMpIC8gc2l6ZW9mKGxldmVsX25hbWVzWzBdKTsgaSsrKQoJaWYoIXN0cm5jYXNlY21wKGxldmVsX25hbWVzW2ldLm5hbWUsIG5hbWUsIHN0cmxlbihuYW1lKSkpCgkgICAgcmV0dXJuIGxldmVsX25hbWVzW2ldLmxldmVsOwogICAgcmV0dXJuIChlbnVtIHByb3RlY3Rpb25fbGV2ZWwpLTE7Cn0KI2VuZGlmCgojaWZkZWYgRlRQX1NFUlZFUgoKc3RhdGljIHN0cnVjdCBzZWNfc2VydmVyX21lY2ggKm1lY2hzW10gPSB7CiNpZmRlZiBLUkI1CiAgICAmZ3NzX3NlcnZlcl9tZWNoLAojZW5kaWYKI2lmZGVmIEtSQjQKICAgICZrcmI0X3NlcnZlcl9tZWNoLAojZW5kaWYKICAgIE5VTEwKfTsKCnN0YXRpYyBzdHJ1Y3Qgc2VjX3NlcnZlcl9tZWNoICptZWNoOwoKI2Vsc2UKCnN0YXRpYyBzdHJ1Y3Qgc2VjX2NsaWVudF9tZWNoICptZWNoc1tdID0gewojaWZkZWYgS1JCNQogICAgJmdzc19jbGllbnRfbWVjaCwKI2VuZGlmCiNpZmRlZiBLUkI0CiAgICAma3JiNF9jbGllbnRfbWVjaCwKI2VuZGlmCiAgICBOVUxMCn07CgpzdGF0aWMgc3RydWN0IHNlY19jbGllbnRfbWVjaCAqbWVjaDsKCiNlbmRpZgoKaW50CnNlY19nZXRjKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgRklMRSAqRikKewogIGlmKGNvbm4tPnNlY19jb21wbGV0ZSAmJiBjb25uLT5kYXRhX3Byb3QpIHsKICAgIGNoYXIgYzsKICAgIGlmKHNlY19yZWFkKGNvbm4sIGZpbGVubyhGKSwgJmMsIDEpIDw9IDApCiAgICAgIHJldHVybiBFT0Y7CiAgICByZXR1cm4gYzsKICB9IGVsc2UKICAgIHJldHVybiBnZXRjKEYpOwp9CgpzdGF0aWMgaW50CmJsb2NrX3JlYWQoaW50IGZkLCB2b2lkICpidWYsIHNpemVfdCBsZW4pCnsKICAgIHVuc2lnbmVkIGNoYXIgKnAgPSBidWY7CiAgICBpbnQgYjsKICAgIHdoaWxlKGxlbikgewoJYiA9IHJlYWQoZmQsIHAsIGxlbik7CglpZiAoYiA9PSAwKQoJICAgIHJldHVybiAwOwoJZWxzZSBpZiAoYiA8IDApCgkgICAgcmV0dXJuIC0xOwoJbGVuIC09IGI7CglwICs9IGI7CiAgICB9CiAgICByZXR1cm4gcCAtICh1bnNpZ25lZCBjaGFyKilidWY7Cn0KCnN0YXRpYyBpbnQKYmxvY2tfd3JpdGUoaW50IGZkLCB2b2lkICpidWYsIHNpemVfdCBsZW4pCnsKICAgIHVuc2lnbmVkIGNoYXIgKnAgPSBidWY7CiAgICBpbnQgYjsKICAgIHdoaWxlKGxlbikgewoJYiA9IHdyaXRlKGZkLCBwLCBsZW4pOwoJaWYoYiA8IDApCgkgICAgcmV0dXJuIC0xOwoJbGVuIC09IGI7CglwICs9IGI7CiAgICB9CiAgICByZXR1cm4gcCAtICh1bnNpZ25lZCBjaGFyKilidWY7Cn0KCnN0YXRpYyBpbnQKc2VjX2dldF9kYXRhKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwKICAgICAgICAgICAgIGludCBmZCwgc3RydWN0IGtyYjRidWZmZXIgKmJ1ZiwgaW50IGxldmVsKQp7CiAgaW50IGxlbjsKICBpbnQgYjsKCiAgYiA9IGJsb2NrX3JlYWQoZmQsICZsZW4sIHNpemVvZihsZW4pKTsKICBpZiAoYiA9PSAwKQogICAgcmV0dXJuIDA7CiAgZWxzZSBpZiAoYiA8IDApCiAgICByZXR1cm4gLTE7CiAgbGVuID0gbnRvaGwobGVuKTsKICBidWYtPmRhdGEgPSByZWFsbG9jKGJ1Zi0+ZGF0YSwgbGVuKTsKICBiID0gYmxvY2tfcmVhZChmZCwgYnVmLT5kYXRhLCBsZW4pOwogIGlmIChiID09IDApCiAgICByZXR1cm4gMDsKICBlbHNlIGlmIChiIDwgMCkKICAgIHJldHVybiAtMTsKICBidWYtPnNpemUgPSAoKm1lY2gtPmRlY29kZSkoY29ubi0+YXBwX2RhdGEsIGJ1Zi0+ZGF0YSwgbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uLT5kYXRhX3Byb3QsIGNvbm4pOwogIGJ1Zi0+aW5kZXggPSAwOwogIHJldHVybiAwOwp9CgpzdGF0aWMgc2l6ZV90CmJ1ZmZlcl9yZWFkKHN0cnVjdCBrcmI0YnVmZmVyICpidWYsIHZvaWQgKmRhdGEsIHNpemVfdCBsZW4pCnsKICAgIGxlbiA9IG1pbihsZW4sIGJ1Zi0+c2l6ZSAtIGJ1Zi0+aW5kZXgpOwogICAgbWVtY3B5KGRhdGEsIChjaGFyKilidWYtPmRhdGEgKyBidWYtPmluZGV4LCBsZW4pOwogICAgYnVmLT5pbmRleCArPSBsZW47CiAgICByZXR1cm4gbGVuOwp9CgpzdGF0aWMgc2l6ZV90CmJ1ZmZlcl93cml0ZShzdHJ1Y3Qga3JiNGJ1ZmZlciAqYnVmLCB2b2lkICpkYXRhLCBzaXplX3QgbGVuKQp7CiAgICBpZihidWYtPmluZGV4ICsgbGVuID4gYnVmLT5zaXplKSB7Cgl2b2lkICp0bXA7CglpZihidWYtPmRhdGEgPT0gTlVMTCkKCSAgICB0bXAgPSBtYWxsb2MoMTAyNCk7CgllbHNlCgkgICAgdG1wID0gcmVhbGxvYyhidWYtPmRhdGEsIGJ1Zi0+aW5kZXggKyBsZW4pOwoJaWYodG1wID09IE5VTEwpCgkgICAgcmV0dXJuIC0xOwoJYnVmLT5kYXRhID0gdG1wOwoJYnVmLT5zaXplID0gYnVmLT5pbmRleCArIGxlbjsKICAgIH0KICAgIG1lbWNweSgoY2hhciopYnVmLT5kYXRhICsgYnVmLT5pbmRleCwgZGF0YSwgbGVuKTsKICAgIGJ1Zi0+aW5kZXggKz0gbGVuOwogICAgcmV0dXJuIGxlbjsKfQoKaW50CnNlY19yZWFkKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IGZkLCB2b2lkICpidWZmZXIsIGludCBsZW5ndGgpCnsKICAgIHNpemVfdCBsZW47CiAgICBpbnQgcnggPSAwOwoKICAgIGlmKGNvbm4tPnNlY19jb21wbGV0ZSA9PSAwIHx8IGNvbm4tPmRhdGFfcHJvdCA9PSAwKQogICAgICByZXR1cm4gcmVhZChmZCwgYnVmZmVyLCBsZW5ndGgpOwoKICAgIGlmKGNvbm4tPmluX2J1ZmZlci5lb2ZfZmxhZyl7CiAgICAgIGNvbm4tPmluX2J1ZmZlci5lb2ZfZmxhZyA9IDA7CiAgICAgIHJldHVybiAwOwogICAgfQogICAgCiAgICBsZW4gPSBidWZmZXJfcmVhZCgmY29ubi0+aW5fYnVmZmVyLCBidWZmZXIsIGxlbmd0aCk7CiAgICBsZW5ndGggLT0gbGVuOwogICAgcnggKz0gbGVuOwogICAgYnVmZmVyID0gKGNoYXIqKWJ1ZmZlciArIGxlbjsKICAgIAogICAgd2hpbGUobGVuZ3RoKSB7CiAgICAgIGlmKHNlY19nZXRfZGF0YShjb25uLCBmZCwgJmNvbm4tPmluX2J1ZmZlciwgY29ubi0+ZGF0YV9wcm90KSA8IDApCiAgICAgICAgcmV0dXJuIC0xOwogICAgICBpZihjb25uLT5pbl9idWZmZXIuc2l6ZSA9PSAwKSB7CiAgICAgICAgaWYocngpCiAgICAgICAgICBjb25uLT5pbl9idWZmZXIuZW9mX2ZsYWcgPSAxOwogICAgICAgIHJldHVybiByeDsKICAgICAgfQogICAgICBsZW4gPSBidWZmZXJfcmVhZCgmY29ubi0+aW5fYnVmZmVyLCBidWZmZXIsIGxlbmd0aCk7CiAgICAgIGxlbmd0aCAtPSBsZW47CiAgICAgIHJ4ICs9IGxlbjsKICAgICAgYnVmZmVyID0gKGNoYXIqKWJ1ZmZlciArIGxlbjsKICAgIH0KICAgIHJldHVybiByeDsKfQoKc3RhdGljIGludApzZWNfc2VuZChzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBmZCwgY2hhciAqZnJvbSwgaW50IGxlbmd0aCkKewogIGludCBieXRlczsKICB2b2lkICpidWY7CiAgYnl0ZXMgPSAoKm1lY2gtPmVuY29kZSkoY29ubi0+YXBwX2RhdGEsIGZyb20sIGxlbmd0aCwgY29ubi0+ZGF0YV9wcm90LCAmYnVmLCBjb25uKTsKICBieXRlcyA9IGh0b25sKGJ5dGVzKTsKICBibG9ja193cml0ZShmZCwgJmJ5dGVzLCBzaXplb2YoYnl0ZXMpKTsKICBibG9ja193cml0ZShmZCwgYnVmLCBudG9obChieXRlcykpOwogIGZyZWUoYnVmKTsKICByZXR1cm4gbGVuZ3RoOwp9CgppbnQKc2VjX2ZmbHVzaChzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIEZJTEUgKkYpCnsKICBpZihjb25uLT5kYXRhX3Byb3QgIT0gcHJvdF9jbGVhcikgewogICAgaWYoY29ubi0+b3V0X2J1ZmZlci5pbmRleCA+IDApewogICAgICBzZWNfd3JpdGUoY29ubiwgZmlsZW5vKEYpLAogICAgICAgICAgICAgICAgY29ubi0+b3V0X2J1ZmZlci5kYXRhLCBjb25uLT5vdXRfYnVmZmVyLmluZGV4KTsKICAgICAgY29ubi0+b3V0X2J1ZmZlci5pbmRleCA9IDA7CiAgICB9CiAgICBzZWNfc2VuZChjb25uLCBmaWxlbm8oRiksIE5VTEwsIDApOwogIH0KICBmZmx1c2goRik7CiAgcmV0dXJuIDA7Cn0KCmludApzZWNfZmZsdXNoX2ZkKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IGZkKQp7CiAgaWYoY29ubi0+ZGF0YV9wcm90ICE9IHByb3RfY2xlYXIpIHsKICAgIGlmKGNvbm4tPm91dF9idWZmZXIuaW5kZXggPiAwKXsKICAgICAgc2VjX3dyaXRlKGNvbm4sIGZkLAogICAgICAgICAgICAgICAgY29ubi0+b3V0X2J1ZmZlci5kYXRhLCBjb25uLT5vdXRfYnVmZmVyLmluZGV4KTsKICAgICAgY29ubi0+b3V0X2J1ZmZlci5pbmRleCA9IDA7CiAgICB9CiAgICBzZWNfc2VuZChjb25uLCBmZCwgTlVMTCwgMCk7CiAgfQogIHJldHVybiAwOwp9CgppbnQKc2VjX3dyaXRlKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IGZkLCBjaGFyICpidWZmZXIsIGludCBsZW5ndGgpCnsKICBpbnQgbGVuID0gY29ubi0+YnVmZmVyX3NpemU7CiAgaW50IHR4ID0gMDsKICAgICAgCiAgaWYoY29ubi0+ZGF0YV9wcm90ID09IHByb3RfY2xlYXIpCiAgICByZXR1cm4gd3JpdGUoZmQsIGJ1ZmZlciwgbGVuZ3RoKTsKCiAgbGVuIC09ICgqbWVjaC0+b3ZlcmhlYWQpKGNvbm4tPmFwcF9kYXRhLCBjb25uLT5kYXRhX3Byb3QsIGxlbik7CiAgd2hpbGUobGVuZ3RoKXsKICAgIGlmKGxlbmd0aCA8IGxlbikKICAgICAgbGVuID0gbGVuZ3RoOwogICAgc2VjX3NlbmQoY29ubiwgZmQsIGJ1ZmZlciwgbGVuKTsKICAgIGxlbmd0aCAtPSBsZW47CiAgICBidWZmZXIgKz0gbGVuOwogICAgdHggKz0gbGVuOwogIH0KICByZXR1cm4gdHg7Cn0KCmludApzZWNfdmZwcmludGYyKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgRklMRSAqZiwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKQp7CiAgY2hhciAqYnVmOwogIGludCByZXQ7CiAgaWYoY29ubi0+ZGF0YV9wcm90ID09IHByb3RfY2xlYXIpCiAgICByZXR1cm4gdmZwcmludGYoZiwgZm10LCBhcCk7CiAgZWxzZSB7CiAgICBidWYgPSBtYXByaW50ZihmbXQsIGFwKTsKICAgIHJldCA9IGJ1ZmZlcl93cml0ZSgmY29ubi0+b3V0X2J1ZmZlciwgYnVmLCBzdHJsZW4oYnVmKSk7CiAgICBmcmVlKGJ1Zik7CiAgICByZXR1cm4gcmV0OwogIH0KfQoKaW50CnNlY19mcHJpbnRmMihzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIEZJTEUgKmYsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQp7CiAgICBpbnQgcmV0OwogICAgdmFfbGlzdCBhcDsKICAgIHZhX3N0YXJ0KGFwLCBmbXQpOwogICAgcmV0ID0gc2VjX3ZmcHJpbnRmMihjb25uLCBmLCBmbXQsIGFwKTsKICAgIHZhX2VuZChhcCk7CiAgICByZXR1cm4gcmV0Owp9CgppbnQKc2VjX3B1dGMoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgYywgRklMRSAqRikKewogIGNoYXIgY2ggPSBjOwogIGlmKGNvbm4tPmRhdGFfcHJvdCA9PSBwcm90X2NsZWFyKQogICAgcmV0dXJuIHB1dGMoYywgRik7CiAgICAKICBidWZmZXJfd3JpdGUoJmNvbm4tPm91dF9idWZmZXIsICZjaCwgMSk7CiAgaWYoYyA9PSAnXG4nIHx8IGNvbm4tPm91dF9idWZmZXIuaW5kZXggPj0gMTAyNCAvKiBYWFggKi8pIHsKICAgIHNlY193cml0ZShjb25uLCBmaWxlbm8oRiksIGNvbm4tPm91dF9idWZmZXIuZGF0YSwgY29ubi0+b3V0X2J1ZmZlci5pbmRleCk7CiAgICBjb25uLT5vdXRfYnVmZmVyLmluZGV4ID0gMDsKICB9CiAgcmV0dXJuIGM7Cn0KCmludApzZWNfcmVhZF9tc2coc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBjaGFyICpzLCBpbnQgbGV2ZWwpCnsKICAgIGludCBsZW47CiAgICBjaGFyICpidWY7CiAgICBpbnQgY29kZTsKICAgIAogICAgYnVmID0gbWFsbG9jKHN0cmxlbihzKSk7CiAgICBsZW4gPSBiYXNlNjRfZGVjb2RlKHMgKyA0LCBidWYpOyAvKiBYWFggKi8KICAgIAogICAgbGVuID0gKCptZWNoLT5kZWNvZGUpKGNvbm4tPmFwcF9kYXRhLCBidWYsIGxlbiwgbGV2ZWwsIGNvbm4pOwogICAgaWYobGVuIDwgMCkKCXJldHVybiAtMTsKICAgIAogICAgYnVmW2xlbl0gPSAnXDAnOwoKICAgIGlmKGJ1ZlszXSA9PSAnLScpCgljb2RlID0gMDsKICAgIGVsc2UKCXNzY2FuZihidWYsICIlZCIsICZjb2RlKTsKICAgIGlmKGJ1ZltsZW4tMV0gPT0gJ1xuJykKCWJ1ZltsZW4tMV0gPSAnXDAnOwogICAgc3RyY3B5KHMsIGJ1Zik7CiAgICBmcmVlKGJ1Zik7CiAgICByZXR1cm4gY29kZTsKfQoKLyogbW9kaWZpZWQgdG8gcmV0dXJuIGhvdyBtYW55IGJ5dGVzIHdyaXR0ZW4sIG9yIC0xIG9uIGVycm9yICoqKi8KaW50CnNlY192ZnByaW50ZihzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIEZJTEUgKmYsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcCkKewogICAgaW50IHJldCA9IDA7CiAgICBjaGFyICpidWY7CiAgICB2b2lkICplbmM7CiAgICBpbnQgbGVuOwogICAgaWYoIWNvbm4tPnNlY19jb21wbGV0ZSkKCXJldHVybiB2ZnByaW50ZihmLCBmbXQsIGFwKTsKICAgIAogICAgYnVmID0gbWFwcmludGYoZm10LCBhcCk7CiAgICBsZW4gPSAoKm1lY2gtPmVuY29kZSkoY29ubi0+YXBwX2RhdGEsIGJ1Ziwgc3RybGVuKGJ1ZiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubi0+Y29tbWFuZF9wcm90LCAmZW5jLAoJCQkgIGNvbm4pOwogICAgZnJlZShidWYpOwogICAgaWYobGVuIDwgMCkgewoJZmFpbGYoY29ubi0+ZGF0YSwgIkZhaWxlZCB0byBlbmNvZGUgY29tbWFuZC5cbiIpOwoJcmV0dXJuIC0xOwogICAgfQogICAgaWYoYmFzZTY0X2VuY29kZShlbmMsIGxlbiwgJmJ1ZikgPCAwKXsKICAgICAgZmFpbGYoY29ubi0+ZGF0YSwgIk91dCBvZiBtZW1vcnkgYmFzZTY0LWVuY29kaW5nLlxuIik7CiAgICAgIHJldHVybiAtMTsKICAgIH0KI2lmZGVmIEZUUF9TRVJWRVIKICAgIGlmKGNvbW1hbmRfcHJvdCA9PSBwcm90X3NhZmUpCglmcHJpbnRmKGYsICI2MzEgJXNcclxuIiwgYnVmKTsKICAgIGVsc2UgaWYoY29tbWFuZF9wcm90ID09IHByb3RfcHJpdmF0ZSkKCWZwcmludGYoZiwgIjYzMiAlc1xyXG4iLCBidWYpOwogICAgZWxzZSBpZihjb21tYW5kX3Byb3QgPT0gcHJvdF9jb25maWRlbnRpYWwpCglmcHJpbnRmKGYsICI2MzMgJXNcclxuIiwgYnVmKTsKI2Vsc2UKICAgIGlmKGNvbm4tPmNvbW1hbmRfcHJvdCA9PSBwcm90X3NhZmUpCglyZXQgPSBmcHJpbnRmKGYsICJNSUMgJXMiLCBidWYpOwogICAgZWxzZSBpZihjb25uLT5jb21tYW5kX3Byb3QgPT0gcHJvdF9wcml2YXRlKQoJcmV0ID0gZnByaW50ZihmLCAiRU5DICVzIiwgYnVmKTsKICAgIGVsc2UgaWYoY29ubi0+Y29tbWFuZF9wcm90ID09IHByb3RfY29uZmlkZW50aWFsKQoJcmV0ID0gZnByaW50ZihmLCAiQ09ORiAlcyIsIGJ1Zik7CiNlbmRpZgogICAgZnJlZShidWYpOwogICAgcmV0dXJuIHJldDsKfQoKaW50CnNlY19mcHJpbnRmKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgRklMRSAqZiwgY29uc3QgY2hhciAqZm10LCAuLi4pCnsKICAgIHZhX2xpc3QgYXA7CiAgICBpbnQgcmV0OwogICAgdmFfc3RhcnQoYXAsIGZtdCk7CiAgICByZXQgPSBzZWNfdmZwcmludGYoY29ubiwgZiwgZm10LCBhcCk7CiAgICB2YV9lbmQoYXApOwogICAgcmV0dXJuIHJldDsKfQoKLyogZW5kIGNvbW1vbiBzdHVmZiAqLwoKI2lmZGVmIEZUUF9TRVJWRVIKCi8qIHNuaXAgKi8KCiNlbHNlIC8qIEZUUF9TRVJWRVIgKi8KCiNpZiAwCnZvaWQKc2VjX3N0YXR1cyh2b2lkKQp7CiAgICBpZihjb25uLT5zZWNfY29tcGxldGUpewoJcHJpbnRmKCJVc2luZyAlcyBmb3IgYXV0aGVudGljYXRpb24uXG4iLCBtZWNoLT5uYW1lKTsKCXByaW50ZigiVXNpbmcgJXMgY29tbWFuZCBjaGFubmVsLlxuIiwgbGV2ZWxfdG9fbmFtZShjb21tYW5kX3Byb3QpKTsKCXByaW50ZigiVXNpbmcgJXMgZGF0YSBjaGFubmVsLlxuIiwgbGV2ZWxfdG9fbmFtZShkYXRhX3Byb3QpKTsKCWlmKGJ1ZmZlcl9zaXplID4gMCkKCSAgICBwcmludGYoIlByb3RlY3Rpb24gYnVmZmVyIHNpemU6ICVsdS5cbiIsIAoJCSAgICh1bnNpZ25lZCBsb25nKWJ1ZmZlcl9zaXplKTsKICAgIH1lbHNlewoJcHJpbnRmKCJOb3QgdXNpbmcgYW55IHNlY3VyaXR5IG1lY2hhbmlzbS5cbiIpOwogICAgfQp9CiNlbmRpZgoKc3RhdGljIGludApzZWNfcHJvdF9pbnRlcm5hbChzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBsZXZlbCkKewogICAgaW50IHJldDsKICAgIGNoYXIgKnA7CiAgICB1bnNpZ25lZCBpbnQgcyA9IDEwNDg1NzY7CiAgICBzaXplX3QgbnJlYWQ7CgogICAgaWYoIWNvbm4tPnNlY19jb21wbGV0ZSl7CiAgICAgIGluZm9mKGNvbm4tPmRhdGEsICJObyBzZWN1cml0eSBkYXRhIGV4Y2hhbmdlIGhhcyB0YWtlbiBwbGFjZS5cbiIpOwogICAgICByZXR1cm4gLTE7CiAgICB9CgogICAgaWYobGV2ZWwpewogICAgICBmdHBzZW5kZihjb25uLT5kYXRhLT5maXJzdHNvY2tldCwgY29ubiwKICAgICAgICAgICAgICAgIlBCU1ogJXUiLCBzKTsKICAgICAgLyogd2FpdCBmb3IgZmVlZGJhY2sgKi8KICAgICAgbnJlYWQgPSBHZXRMYXN0UmVzcG9uc2UoY29ubi0+ZGF0YS0+Zmlyc3Rzb2NrZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm4tPmRhdGEtPmJ1ZmZlciwgY29ubik7CiAgICAgIGlmKG5yZWFkIDwgMCkKICAgICAgICByZXR1cm4gLypDVVJMRV9PUEVSQVRJT05fVElNRU9VVEVEKi8tMTsKICAgICAgaWYoLypyZXQgIT0gQ09NUExFVEUqL2Nvbm4tPmRhdGEtPmJ1ZmZlclswXSAhPSAnMicpewogICAgICAgIGZhaWxmKGNvbm4tPmRhdGEsICJGYWlsZWQgdG8gc2V0IHByb3RlY3Rpb24gYnVmZmVyIHNpemUuXG4iKTsKICAgICAgICByZXR1cm4gLTE7CiAgICAgIH0KICAgICAgY29ubi0+YnVmZmVyX3NpemUgPSBzOwogICAgICBwID0gc3Ryc3RyKC8qcmVwbHlfc3RyaW5nKi9jb25uLT5kYXRhLT5idWZmZXIsICJQQlNaPSIpOwogICAgICBpZihwKQogICAgICAgIHNzY2FuZihwLCAiUEJTWj0ldSIsICZzKTsKICAgICAgaWYocyA8IGNvbm4tPmJ1ZmZlcl9zaXplKQogICAgICAgIGNvbm4tPmJ1ZmZlcl9zaXplID0gczsKICAgIH0KCiAgICBmdHBzZW5kZihjb25uLT5kYXRhLT5maXJzdHNvY2tldCwgY29ubiwKICAgICAgICAgICAgICJQUk9UICVjIiwgbGV2ZWxbIkNTRVAiXSk7CiAgICAvKiB3YWl0IGZvciBmZWVkYmFjayAqLwogICAgbnJlYWQgPSBHZXRMYXN0UmVzcG9uc2UoY29ubi0+ZGF0YS0+Zmlyc3Rzb2NrZXQsCgkJCSAgICBjb25uLT5kYXRhLT5idWZmZXIsIGNvbm4pOwogICAgaWYobnJlYWQgPCAwKQogICAgICByZXR1cm4gLypDVVJMRV9PUEVSQVRJT05fVElNRU9VVEVEKi8tMTsKICAgIGlmKC8qcmV0ICE9IENPTVBMRVRFKi9jb25uLT5kYXRhLT5idWZmZXJbMF0gIT0gJzInKXsKICAgICAgZmFpbGYoY29ubi0+ZGF0YSwgIkZhaWxlZCB0byBzZXQgcHJvdGVjdGlvbiBsZXZlbC5cbiIpOwogICAgICByZXR1cm4gLTE7CiAgICB9CiAgICAKICAgIGNvbm4tPmRhdGFfcHJvdCA9IChlbnVtIHByb3RlY3Rpb25fbGV2ZWwpbGV2ZWw7CiAgICByZXR1cm4gMDsKfQoKZW51bSBwcm90ZWN0aW9uX2xldmVsCnNldF9jb21tYW5kX3Byb3Qoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBlbnVtIHByb3RlY3Rpb25fbGV2ZWwgbGV2ZWwpCnsKICAgIGVudW0gcHJvdGVjdGlvbl9sZXZlbCBvbGQgPSBjb25uLT5jb21tYW5kX3Byb3Q7CiAgICBjb25uLT5jb21tYW5kX3Byb3QgPSBsZXZlbDsKICAgIHJldHVybiBvbGQ7Cn0KCiNpZiAwCnZvaWQKc2VjX3Byb3QoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQp7CiAgICBpbnQgbGV2ZWwgPSAtMTsKCiAgICBpZihhcmdjIDwgMiB8fCBhcmdjID4gMykKCWdvdG8gdXNhZ2U7CiAgICBpZighc2VjX2NvbXBsZXRlKSB7CglwcmludGYoIk5vIHNlY3VyaXR5IGRhdGEgZXhjaGFuZ2UgaGFzIHRha2VuIHBsYWNlLlxuIik7Cgljb2RlID0gLTE7CglyZXR1cm47CiAgICB9CiAgICBsZXZlbCA9IG5hbWVfdG9fbGV2ZWwoYXJndlthcmdjIC0gMV0pOwogICAgCiAgICBpZihsZXZlbCA9PSAtMSkKCWdvdG8gdXNhZ2U7CiAgICAKICAgIGlmKCgqbWVjaC0+Y2hlY2tfcHJvdCkoY29ubi0+YXBwX2RhdGEsIGxldmVsKSkgewoJcHJpbnRmKCIlcyBkb2VzIG5vdCBpbXBsZW1lbnQgJXMgcHJvdGVjdGlvbi5cbiIsIAoJICAgICAgIG1lY2gtPm5hbWUsIGxldmVsX3RvX25hbWUobGV2ZWwpKTsKCWNvZGUgPSAtMTsKCXJldHVybjsKICAgIH0KICAgIAogICAgaWYoYXJnYyA9PSAyIHx8IHN0cm5jYXNlY21wKGFyZ3ZbMV0sICJkYXRhIiwgc3RybGVuKGFyZ3ZbMV0pKSA9PSAwKSB7CglpZihzZWNfcHJvdF9pbnRlcm5hbChsZXZlbCkgPCAwKXsKCSAgICBjb2RlID0gLTE7CgkgICAgcmV0dXJuOwoJfQogICAgfSBlbHNlIGlmKHN0cm5jYXNlY21wKGFyZ3ZbMV0sICJjb21tYW5kIiwgc3RybGVuKGFyZ3ZbMV0pKSA9PSAwKQoJc2V0X2NvbW1hbmRfcHJvdChsZXZlbCk7CiAgICBlbHNlCglnb3RvIHVzYWdlOwogICAgY29kZSA9IDA7CiAgICByZXR1cm47CiB1c2FnZToKICAgIHByaW50ZigidXNhZ2U6ICVzIFtjb21tYW5kfGRhdGFdIFtjbGVhcnxzYWZlfGNvbmZpZGVudGlhbHxwcml2YXRlXVxuIiwKCSAgIGFyZ3ZbMF0pOwogICAgY29kZSA9IC0xOwp9CiNlbmRpZgoKdm9pZApzZWNfc2V0X3Byb3RlY3Rpb25fbGV2ZWwoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uKQp7CiAgaWYoY29ubi0+c2VjX2NvbXBsZXRlICYmIGNvbm4tPmRhdGFfcHJvdCAhPSBjb25uLT5yZXF1ZXN0X2RhdGFfcHJvdCkKICAgIHNlY19wcm90X2ludGVybmFsKGNvbm4sIGNvbm4tPnJlcXVlc3RfZGF0YV9wcm90KTsKfQoKCmludApzZWNfcmVxdWVzdF9wcm90KHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgY2hhciAqbGV2ZWwpCnsKICBpbnQgbCA9IG5hbWVfdG9fbGV2ZWwobGV2ZWwpOwogIGlmKGwgPT0gLTEpCiAgICByZXR1cm4gLTE7CiAgY29ubi0+cmVxdWVzdF9kYXRhX3Byb3QgPSAoZW51bSBwcm90ZWN0aW9uX2xldmVsKWw7CiAgcmV0dXJuIDA7Cn0KCmludApzZWNfbG9naW4oc3RydWN0IGNvbm5lY3RkYXRhICpjb25uKQp7CiAgICBpbnQgcmV0OwogICAgc3RydWN0IHNlY19jbGllbnRfbWVjaCAqKm07CiAgICBzaXplX3QgbnJlYWQ7CiAgICBzdHJ1Y3QgVXJsRGF0YSAqZGF0YT1jb25uLT5kYXRhOwoKICAgIGZvcihtID0gbWVjaHM7ICptICYmICgqbSktPm5hbWU7IG0rKykgewoJdm9pZCAqdG1wOwoKCXRtcCA9IHJlYWxsb2MoY29ubi0+YXBwX2RhdGEsICgqbSktPnNpemUpOwoJaWYgKHRtcCA9PSBOVUxMKSB7CiAgICAgICAgICBmYWlsZiAoZGF0YSwgInJlYWxsb2MgJXUgZmFpbGVkIiwgKCptKS0+c2l6ZSk7CiAgICAgICAgICByZXR1cm4gLTE7Cgl9Cgljb25uLT5hcHBfZGF0YSA9IHRtcDsKCSAgICAKCWlmKCgqbSktPmluaXQgJiYgKCooKm0pLT5pbml0KShjb25uLT5hcHBfZGF0YSkgIT0gMCkgewoJICAgIGluZm9mKGRhdGEsICJTa2lwcGluZyAlcy4uLlxuIiwgKCptKS0+bmFtZSk7CgkgICAgY29udGludWU7Cgl9CglpbmZvZihkYXRhLCAiVHJ5aW5nICVzLi4uXG4iLCAoKm0pLT5uYW1lKTsKCS8qcmV0ID0gY29tbWFuZCgiQVVUSCAlcyIsICgqbSktPm5hbWUpOyoqKi8KCWZ0cHNlbmRmKGNvbm4tPmRhdGEtPmZpcnN0c29ja2V0LCBjb25uLAogICAgICAgICAgICAgICAgICJBVVRIICVzIiwgKCptKS0+bmFtZSk7CgkvKiB3YWl0IGZvciBmZWVkYmFjayAqLwoJbnJlYWQgPSBHZXRMYXN0UmVzcG9uc2UoY29ubi0+ZGF0YS0+Zmlyc3Rzb2NrZXQsCgkJCQljb25uLT5kYXRhLT5idWZmZXIsIGNvbm4pOwoJaWYobnJlYWQgPCAwKQoJICAgIHJldHVybiAvKkNVUkxFX09QRVJBVElPTl9USU1FT1VURUQqLy0xOwoJaWYoLypyZXQgIT0gQ09OVElOVUUqL2Nvbm4tPmRhdGEtPmJ1ZmZlclswXSAhPSAnMycpewoJICAgIGlmKC8qY29kZSA9PSA1MDQqL3N0cm5jbXAoY29ubi0+ZGF0YS0+YnVmZmVyLCI1MDQiLDMpID09IDApIHsKCQlpbmZvZihkYXRhLAogICAgICAgICAgICAgICAgICAgICAgIiVzIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHNlcnZlci5cbiIsICgqbSktPm5hbWUpOwoJICAgIH0KICAgICAgICAgICAgZWxzZSBpZigvKmNvZGUgPT0gNTM0Ki9zdHJuY21wKGNvbm4tPmRhdGEtPmJ1ZmZlciwiNTM0IiwzKSA9PSAwKSB7CiAgICAgICAgICAgICAgaW5mb2YoZGF0YSwgIiVzIHJlamVjdGVkIGFzIHNlY3VyaXR5IG1lY2hhbmlzbS5cbiIsICgqbSktPm5hbWUpOwoJICAgIH0KICAgICAgICAgICAgZWxzZSBpZigvKnJldCA9PSBFUlJPUiovY29ubi0+ZGF0YS0+YnVmZmVyWzBdID09ICc1JykgewogICAgICAgICAgICAgIGluZm9mKGRhdGEsICJUaGUgc2VydmVyIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgRlRQICIKICAgICAgICAgICAgICAgICAgICAic2VjdXJpdHkgZXh0ZW5zaW9ucy5cbiIpOwogICAgICAgICAgICAgIHJldHVybiAtMTsKCSAgICB9CgkgICAgY29udGludWU7Cgl9CgoJcmV0ID0gKCooKm0pLT5hdXRoKShjb25uLT5hcHBfZGF0YSwgLypob3N0KioqL2Nvbm4pOwoJCglpZihyZXQgPT0gQVVUSF9DT05USU5VRSkKICAgICAgICAgIGNvbnRpbnVlOwoJZWxzZSBpZihyZXQgIT0gQVVUSF9PSyl7CiAgICAgICAgICAvKiBtZWNoYW5pc20gaXMgc3VwcG9zZWQgdG8gb3V0cHV0IGVycm9yIHN0cmluZyAqLwoJICAgIHJldHVybiAtMTsKCX0KCW1lY2ggPSAqbTsKCWNvbm4tPnNlY19jb21wbGV0ZSA9IDE7Cgljb25uLT5jb21tYW5kX3Byb3QgPSBwcm90X3NhZmU7CglicmVhazsKICAgIH0KICAgIAogICAgcmV0dXJuICptID09IE5VTEw7Cn0KCnZvaWQKc2VjX2VuZChzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4pCnsKICAgIGlmIChtZWNoICE9IE5VTEwpIHsKCWlmKG1lY2gtPmVuZCkKCSAgICAoKm1lY2gtPmVuZCkoY29ubi0+YXBwX2RhdGEpOwoJbWVtc2V0KGNvbm4tPmFwcF9kYXRhLCAwLCBtZWNoLT5zaXplKTsKCWZyZWUoY29ubi0+YXBwX2RhdGEpOwoJY29ubi0+YXBwX2RhdGEgPSBOVUxMOwogICAgfQogICAgY29ubi0+c2VjX2NvbXBsZXRlID0gMDsKICAgIGNvbm4tPmRhdGFfcHJvdCA9IChlbnVtIHByb3RlY3Rpb25fbGV2ZWwpMDsKfQoKI2VuZGlmIC8qIEZUUF9TRVJWRVIgKi8KCiNlbmRpZiAvKiBLUkI0ICovCg==