Lyogdm1zLWhkci5jIC0tIEJGRCBiYWNrLWVuZCBmb3IgVk1TL1ZBWCAob3BlblZNUy9WQVgpIGFuZAogICBFVkFYIChvcGVuVk1TL0FscGhhKSBmaWxlcy4KICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDUsIDIwMDYsCiAgIDIwMDcsIDIwMDgsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCgogICBIRFIgcmVjb3JkIGhhbmRsaW5nIGZ1bmN0aW9ucwogICBFTUggcmVjb3JkIGhhbmRsaW5nIGZ1bmN0aW9ucwoKICAgRU9NIHJlY29yZCBoYW5kbGluZyBmdW5jdGlvbnMKICAgRUVPTSByZWNvcmQgaGFuZGxpbmcgZnVuY3Rpb25zCgogICBJSEQgcmVjb3JkIGhhbmRsaW5nIGZ1bmN0aW9ucwogICBFSUhEIHJlY29yZCBoYW5kbGluZyBmdW5jdGlvbnMKCiAgIElTRCByZWNvcmQgaGFuZGxpbmcgZnVuY3Rpb25zCiAgIEVJU0QgcmVjb3JkIGhhbmRsaW5nIGZ1bmN0aW9ucwoKICAgSUhTIHJlY29yZCBoYW5kbGluZyBmdW5jdGlvbnMKICAgRUlIUyByZWNvcmQgaGFuZGxpbmcgZnVuY3Rpb25zCgogICBEQkcgcmVjb3JkIGhhbmRsaW5nIGZ1bmN0aW9ucwogICBFREJHIHJlY29yZCBoYW5kbGluZyBmdW5jdGlvbnMKCiAgIFRCVCByZWNvcmQgaGFuZGxpbmcgZnVuY3Rpb25zCiAgIEVUQlQgcmVjb3JkIGhhbmRsaW5nIGZ1bmN0aW9ucwoKICAgRFNUL0RNVCBzZWN0aW9uIGhhbmRsaW5nIGZ1bmN0aW9ucwoKICAgV3JpdHRlbiBieSBLbGF1cyBLImFtcGYgKGtrYWVtcGZAcm1pLmRlKQoKICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLAogICBNQSAwMjExMC0xMzAxLCBVU0EuICAqLwoKI2luY2x1ZGUgInN5c2RlcC5oIgojaW5jbHVkZSAiYmZkLmgiCiNpbmNsdWRlICJiZmR2ZXIuaCIKI2luY2x1ZGUgImJmZGxpbmsuaCIKI2luY2x1ZGUgInNhZmUtY3R5cGUuaCIKI2luY2x1ZGUgImxpYmJmZC5oIgoKI2luY2x1ZGUgInZtcy5oIgoKc3RhdGljIHN0cnVjdCBtb2R1bGUgKm5ld19tb2R1bGUgKGJmZCAqKTsKc3RhdGljIHZvaWQgcGFyc2VfbW9kdWxlCiAgKGJmZCAqLCBzdHJ1Y3QgbW9kdWxlICosIHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgaW50KTsKc3RhdGljIHN0cnVjdCBtb2R1bGUgKmJ1aWxkX21vZHVsZV9saXN0IChiZmQgKik7CnN0YXRpYyBiZmRfYm9vbGVhbiBtb2R1bGVfZmluZF9uZWFyZXN0X2xpbmUKICAoYmZkICosIHN0cnVjdCBtb2R1bGUgKiwgYmZkX3ZtYSwgY29uc3QgY2hhciAqKiwgY29uc3QgY2hhciAqKiwKICAgdW5zaWduZWQgaW50ICopOwpzdGF0aWMgaW50IHZtc19zbHVycF9kZWJ1ZyAoYmZkICopOwoKI2RlZmluZSBTRVRfTU9EVUxFX1BBUlNFRChtKSBcCiAgZG8geyBpZiAoKG0pLT5uYW1lID09IE5VTEwpIChtKS0+bmFtZSA9ICIiOyB9IHdoaWxlICgwKQojZGVmaW5lIElTX01PRFVMRV9QQVJTRUQobSkgKChtKS0+bmFtZSAhPSBOVUxMKQoKCi8qIFJlYWQgJiBwcm9jZXNzIGVtaCByZWNvcmQKICAgcmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IuICAqLwoKaW50Cl9iZmRfdm1zX3NsdXJwX2hkciAoYmZkICphYmZkLCBpbnQgb2JqdHlwZSkKewogIHVuc2lnbmVkIGNoYXIgKnB0cjsKICB1bnNpZ25lZCBjaGFyICp2bXNfcmVjOwogIGludCBzdWJ0eXBlOwoKICB2bXNfcmVjID0gUFJJVih2bXNfcmVjKTsKCiNpZiBWTVNfREVCVUcKICB2bXNfZGVidWcoMiwgIkhEUi9FTUhcbiIpOwojZW5kaWYKCiAgc3dpdGNoIChvYmp0eXBlKQogICAgewogICAgY2FzZSBPQkpfU19DX0hEUjoKICAgICAgc3VidHlwZSA9IHZtc19yZWNbMV07CiAgICAgIGJyZWFrOwogICAgY2FzZSBFT0JKX1NfQ19FTUg6CiAgICAgIHN1YnR5cGUgPSBiZmRfZ2V0bDE2ICh2bXNfcmVjICsgNCkgKyBFVkFYX09GRlNFVDsKICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICBzdWJ0eXBlID0gLTE7CiAgICB9CgojaWYgVk1TX0RFQlVHCiAgdm1zX2RlYnVnKDMsICJzdWJ0eXBlICVkXG4iLCBzdWJ0eXBlKTsKI2VuZGlmCgogIHN3aXRjaCAoc3VidHlwZSkKICAgIHsKICAgIGNhc2UgTUhEX1NfQ19NSEQ6CiAgICAgIC8qIE1vZHVsZSBoZWFkZXIuICAqLwogICAgICBQUklWIChoZHJfZGF0YSkuaGRyX2Jfc3RybHZsID0gdm1zX3JlY1syXTsKICAgICAgUFJJViAoaGRyX2RhdGEpLmhkcl9sX3JlY3NpeiA9IGJmZF9nZXRsMTYgKHZtc19yZWMgKyAzKTsKICAgICAgUFJJViAoaGRyX2RhdGEpLmhkcl90X25hbWUgPSBfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nICh2bXNfcmVjICsgNSk7CiAgICAgIHB0ciA9IHZtc19yZWMgKyA1ICsgdm1zX3JlY1s1XSArIDE7CiAgICAgIFBSSVYgKGhkcl9kYXRhKS5oZHJfdF92ZXJzaW9uID0gX2JmZF92bXNfc2F2ZV9jb3VudGVkX3N0cmluZyAocHRyKTsKICAgICAgcHRyICs9ICpwdHIgKyAxOwogICAgICBQUklWIChoZHJfZGF0YSkuaGRyX3RfZGF0ZSA9IF9iZmRfdm1zX3NhdmVfc2l6ZWRfc3RyaW5nIChwdHIsIDE3KTsKICAgICAgYnJlYWs7CgogICAgY2FzZSBNSERfU19DX0xOTToKICAgICAgUFJJViAoaGRyX2RhdGEpLmhkcl9jX2xubSA9IF9iZmRfdm1zX3NhdmVfc2l6ZWRfc3RyaW5nICh2bXNfcmVjLCBQUklWIChyZWNfc2l6ZSAtIDIpKTsKICAgICAgYnJlYWs7CgogICAgY2FzZSBNSERfU19DX1NSQzoKICAgICAgUFJJViAoaGRyX2RhdGEpLmhkcl9jX3NyYyA9IF9iZmRfdm1zX3NhdmVfc2l6ZWRfc3RyaW5nICh2bXNfcmVjLCBQUklWIChyZWNfc2l6ZSAtIDIpKTsKICAgICAgYnJlYWs7CgogICAgY2FzZSBNSERfU19DX1RUTDoKICAgICAgUFJJViAoaGRyX2RhdGEpLmhkcl9jX3R0bCA9IF9iZmRfdm1zX3NhdmVfc2l6ZWRfc3RyaW5nICh2bXNfcmVjLCBQUklWIChyZWNfc2l6ZSAtIDIpKTsKICAgICAgYnJlYWs7CgogICAgY2FzZSBFTUhfU19DX01IRCArIEVWQVhfT0ZGU0VUOgogICAgICAvKiBNb2R1bGUgaGVhZGVyLiAgKi8KICAgICAgUFJJViAoaGRyX2RhdGEpLmhkcl9iX3N0cmx2bCA9IHZtc19yZWNbNl07CiAgICAgIFBSSVYgKGhkcl9kYXRhKS5oZHJfbF9hcmNoMSAgPSBiZmRfZ2V0bDMyICh2bXNfcmVjICsgOCk7CiAgICAgIFBSSVYgKGhkcl9kYXRhKS5oZHJfbF9hcmNoMiAgPSBiZmRfZ2V0bDMyICh2bXNfcmVjICsgMTIpOwogICAgICBQUklWIChoZHJfZGF0YSkuaGRyX2xfcmVjc2l6ID0gYmZkX2dldGwzMiAodm1zX3JlYyArIDE2KTsKICAgICAgUFJJViAoaGRyX2RhdGEpLmhkcl90X25hbWUgICA9IF9iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgKHZtc19yZWMgKyAyMCk7CiAgICAgIHB0ciA9IHZtc19yZWMgKyAyMCArIHZtc19yZWNbMjBdICsgMTsKICAgICAgUFJJViAoaGRyX2RhdGEpLmhkcl90X3ZlcnNpb24gPV9iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgKHB0cik7CiAgICAgIHB0ciArPSAqcHRyICsgMTsKICAgICAgUFJJViAoaGRyX2RhdGEpLmhkcl90X2RhdGUgPSBfYmZkX3Ztc19zYXZlX3NpemVkX3N0cmluZyAocHRyLCAxNyk7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgRU1IX1NfQ19MTk0gKyBFVkFYX09GRlNFVDoKICAgICAgUFJJViAoaGRyX2RhdGEpLmhkcl9jX2xubSA9IF9iZmRfdm1zX3NhdmVfc2l6ZWRfc3RyaW5nICh2bXNfcmVjLCBQUklWIChyZWNfc2l6ZSAtIDYpKTsKICAgICAgYnJlYWs7CgogICAgY2FzZSBFTUhfU19DX1NSQyArIEVWQVhfT0ZGU0VUOgogICAgICBQUklWIChoZHJfZGF0YSkuaGRyX2Nfc3JjID0gX2JmZF92bXNfc2F2ZV9zaXplZF9zdHJpbmcgKHZtc19yZWMsIFBSSVYgKHJlY19zaXplIC0gNikpOwogICAgICBicmVhazsKCiAgICBjYXNlIEVNSF9TX0NfVFRMICsgRVZBWF9PRkZTRVQ6CiAgICAgIFBSSVYgKGhkcl9kYXRhKS5oZHJfY190dGwgPSBfYmZkX3Ztc19zYXZlX3NpemVkX3N0cmluZyAodm1zX3JlYywgUFJJViAocmVjX3NpemUgLSA2KSk7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgTUhEX1NfQ19DUFI6CiAgICBjYXNlIE1IRF9TX0NfTVRDOgogICAgY2FzZSBNSERfU19DX0dUWDoKICAgIGNhc2UgRU1IX1NfQ19DUFIgKyBFVkFYX09GRlNFVDoKICAgIGNhc2UgRU1IX1NfQ19NVEMgKyBFVkFYX09GRlNFVDoKICAgIGNhc2UgRU1IX1NfQ19HVFggKyBFVkFYX09GRlNFVDoKICAgICAgYnJlYWs7CgogICAgZGVmYXVsdDoKICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7CiAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgcmV0dXJuIDA7Cn0KCi8qIE91dHB1dCByb3V0aW5lcy4gICovCgovKiBNYW51ZmFjdHVyZSBhIFZNUyBsaWtlIHRpbWUgb24gYSB1bml4IGJhc2VkIHN5c3RlbS4KICAgc3RvbGVuIGZyb20gb2JqLXZtcy5jLiAgKi8KCnN0YXRpYyB1bnNpZ25lZCBjaGFyICoKZ2V0X3Ztc190aW1lX3N0cmluZyAodm9pZCkKewogIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHRidWZbMThdOwojaWZuZGVmIFZNUwojaW5jbHVkZSA8dGltZS5oPgoKICBjaGFyICpwbnQ7CiAgdGltZV90IHRpbWViOwoKICB0aW1lICgmIHRpbWViKTsKICBwbnQgPSBjdGltZSAoJnRpbWViKTsKICBwbnRbM10gPSAwOwogIHBudFs3XSA9IDA7CiAgcG50WzEwXSA9IDA7CiAgcG50WzE2XSA9IDA7CiAgcG50WzI0XSA9IDA7CiAgc3ByaW50ZiAoKGNoYXIgKikgdGJ1ZiwgIiUycy0lM3MtJXMgJXMiLAoJICAgcG50ICsgOCwgcG50ICsgNCwgcG50ICsgMjAsIHBudCArIDExKTsKI2Vsc2UKI2luY2x1ZGUgPHN0YXJsZXQuaD4KICBzdHJ1Y3QKICB7CiAgICBpbnQgU2l6ZTsKICAgIHVuc2lnbmVkIGNoYXIgKlB0cjsKICB9IERlc2NyaXB0b3I7CiAgRGVzY3JpcHRvci5TaXplID0gMTc7CiAgRGVzY3JpcHRvci5QdHIgPSB0YnVmOwogIFNZUyRBU0NUSU0gKDAsICZEZXNjcmlwdG9yLCAwLCAwKTsKI2VuZGlmIC8qIG5vdCBWTVMgKi8KCiNpZiBWTVNfREVCVUcKICB2bXNfZGVidWcgKDYsICJ2bXN0aW1lc3RyaW5nOiclcydcbiIsIHRidWYpOwojZW5kaWYKCiAgcmV0dXJuIHRidWY7Cn0KCi8qIFdyaXRlIG9iamVjdCBoZWFkZXIgZm9yIGJmZCBhYmZkLiAgKi8KCmludApfYmZkX3Ztc193cml0ZV9oZHIgKGJmZCAqYWJmZCwgaW50IG9ianR5cGUpCnsKICBhc3ltYm9sICpzeW1ib2w7CiAgdW5zaWduZWQgaW50IHN5bW51bTsKICBpbnQgaGFkX2Nhc2UgPSAwOwogIGludCBoYWRfZmlsZSA9IDA7CiAgY2hhciB2ZXJzaW9uIFsyNTZdOwoKI2lmIFZNU19ERUJVRwogIHZtc19kZWJ1ZyAoMiwgInZtc193cml0ZV9oZHIgKCVwKVxuIiwgYWJmZCk7CiNlbmRpZgoKICBfYmZkX3Ztc19vdXRwdXRfYWxpZ25tZW50IChhYmZkLCAyKTsKCiAgLyogTUhELiAgKi8KICBpZiAob2JqdHlwZSAhPSBPQkpfU19DX0hEUikKICAgIHsKICAgICAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBFT0JKX1NfQ19FTUgsIEVNSF9TX0NfTUhEKTsKICAgICAgX2JmZF92bXNfb3V0cHV0X3Nob3J0IChhYmZkLCBFT0JKX1NfQ19TVFJMVkwpOwogICAgICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgMCk7CiAgICAgIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLCAwKTsKICAgICAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsIE1BWF9PVVRSRUNfU0laRSk7CiAgICB9CgogIGlmIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSAhPSAwKQogICAgewogICAgICAvKiBTdHJpcCBwYXRoIGFuZCBzdWZmaXggaW5mb3JtYXRpb24uICAqLwogICAgICBjaGFyICpmbmFtZSwgKmZvdXQsICpmcHRyOwoKICAgICAgZnB0ciA9IGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpOwogICAgICBmbmFtZSA9IHN0cmR1cCAoZnB0cik7CgogICAgICAvKiBTdHJpcCBWTVMgcGF0aC4gICovCiAgICAgIGZvdXQgPSBzdHJyY2hyIChmbmFtZSwgJ10nKTsKICAgICAgaWYgKGZvdXQgPT0gTlVMTCkKCWZvdXQgPSBzdHJjaHIgKGZuYW1lLCAnOicpOwogICAgICBpZiAoZm91dCAhPSBOVUxMKQoJZm91dCsrOwogICAgICBlbHNlCglmb3V0ID0gZm5hbWU7CgogICAgICAvKiBTdHJpcCBVTklYIHBhdGguICAqLwogICAgICBmcHRyID0gc3RycmNociAoZm91dCwgJy8nKTsKICAgICAgaWYgKGZwdHIgIT0gTlVMTCkKCWZvdXQgPSBmcHRyICsgMTsKCiAgICAgIC8qIFN0cmlwIC5vYmogc3VmZml4LiAgKi8KICAgICAgZnB0ciA9IHN0cnJjaHIgKGZvdXQsICcuJyk7CiAgICAgIGlmIChmcHRyICE9IDAgJiYgc3RyY2FzZWNtcCAoZnB0ciwgIi5PQkoiKSA9PSAwKQoJKmZwdHIgPSAwOwoKICAgICAgLyogQ29udmVydCB0byB1cHBlciBjYXNlIGFuZCB0cnVuY2F0ZSBhdCAzMSBjaGFyYWN0ZXJzLgogICAgICAgICAoVk1TIG9iamVjdCBmaWxlIGZvcm1hdCByZXN0cmljdHMgbW9kdWxlIG5hbWUgbGVuZ3RoIHRvIDMxKS4gICovCiAgICAgIGZwdHIgPSBmb3V0OwogICAgICB3aGlsZSAoKmZwdHIgIT0gMCkKCXsKCSAgKmZwdHIgPSBUT1VQUEVSICgqZnB0cik7CgkgIGZwdHIrKzsKCSAgaWYgKCpmcHRyID09ICc7JyB8fCAoZnB0ciAtIGZvdXQpID49IDMxKQoJICAgICpmcHRyID0gMDsKCX0KICAgICAgX2JmZF92bXNfb3V0cHV0X2NvdW50ZWQgKGFiZmQsIGZvdXQpOwogICAgICBmcmVlIChmbmFtZSk7CiAgICB9CiAgZWxzZQogICAgX2JmZF92bXNfb3V0cHV0X2NvdW50ZWQgKGFiZmQsICJOT05BTUUiKTsKCiAgX2JmZF92bXNfb3V0cHV0X2NvdW50ZWQgKGFiZmQsIEJGRF9WRVJTSU9OX1NUUklORyk7CiAgX2JmZF92bXNfb3V0cHV0X2R1bXAgKGFiZmQsIGdldF92bXNfdGltZV9zdHJpbmcgKCksIEVNSF9EQVRFX0xFTkdUSCk7CiAgX2JmZF92bXNfb3V0cHV0X2ZpbGwgKGFiZmQsIDAsIEVNSF9EQVRFX0xFTkdUSCk7CiAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKCiAgLyogTE1OLiAgKi8KICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsIEVPQkpfU19DX0VNSCwgRU1IX1NfQ19MTk0pOwogIHNucHJpbnRmICh2ZXJzaW9uLCBzaXplb2YgKHZlcnNpb24pLCAiR0FTIEJGRCB2JXMiLCBCRkRfVkVSU0lPTl9TVFJJTkcpOwogIF9iZmRfdm1zX291dHB1dF9kdW1wIChhYmZkLCAodW5zaWduZWQgY2hhciAqKXZlcnNpb24sIHN0cmxlbiAodmVyc2lvbikpOwogIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7CgogIC8qIFNSQy4gICovCiAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBFT0JKX1NfQ19FTUgsIEVNSF9TX0NfU1JDKTsKCiAgZm9yIChzeW1udW0gPSAwOyBzeW1udW0gPCBhYmZkLT5zeW1jb3VudDsgc3ltbnVtKyspCiAgICB7CiAgICAgIHN5bWJvbCA9IGFiZmQtPm91dHN5bWJvbHNbc3ltbnVtXTsKCiAgICAgIGlmIChzeW1ib2wtPmZsYWdzICYgQlNGX0ZJTEUpCgl7CgkgIGlmIChDT05TVF9TVFJORVEgKChjaGFyICopc3ltYm9sLT5uYW1lLCAiPENBU0U6IikpCgkgICAgewoJICAgICAgUFJJViAoZmxhZ19oYXNoX2xvbmdfbmFtZXMpID0gc3ltYm9sLT5uYW1lWzZdIC0gJzAnOwoJICAgICAgUFJJViAoZmxhZ19zaG93X2FmdGVyX3RydW5jKSA9IHN5bWJvbC0+bmFtZVs3XSAtICcwJzsKCgkgICAgICBpZiAoaGFkX2ZpbGUpCgkJYnJlYWs7CgkgICAgICBoYWRfY2FzZSA9IDE7CgkgICAgICBjb250aW51ZTsKCSAgICB9CgoJICBfYmZkX3Ztc19vdXRwdXRfZHVtcCAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikgc3ltYm9sLT5uYW1lLAoJCQkJKGludCkgc3RybGVuIChzeW1ib2wtPm5hbWUpKTsKCSAgaWYgKGhhZF9jYXNlKQoJICAgIGJyZWFrOwoJICBoYWRfZmlsZSA9IDE7Cgl9CiAgICB9CgogIGlmIChzeW1udW0gPT0gYWJmZC0+c3ltY291bnQpCiAgICBfYmZkX3Ztc19vdXRwdXRfZHVtcCAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikgU1RSSU5HX0NPTU1BX0xFTiAoIm5vbmFtZSIpKTsKCiAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKCiAgLyogVFRMLiAgKi8KICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsIEVPQkpfU19DX0VNSCwgRU1IX1NfQ19UVEwpOwogIF9iZmRfdm1zX291dHB1dF9kdW1wIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSBTVFJJTkdfQ09NTUFfTEVOICgiVFRMIikpOwogIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7CgogIC8qIENQUi4gICovCiAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBFT0JKX1NfQ19FTUgsIEVNSF9TX0NfQ1BSKTsKICBfYmZkX3Ztc19vdXRwdXRfZHVtcCAoYWJmZCwKCQkJICh1bnNpZ25lZCBjaGFyICopIkdOVSBCRkQgcG9ydGVkIGJ5IEtsYXVzIEvkbXBmIDE5OTQtMTk5NiIsCgkJCSAzOSk7CiAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKCiAgcmV0dXJuIDA7Cn0KCi8qIFByb2Nlc3MgRU9NL0VFT00gcmVjb3JkCiAgIHJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yLiAgKi8KCmludApfYmZkX3Ztc19zbHVycF9lb20gKGJmZCAqYWJmZCwgaW50IG9ianR5cGUpCnsKICB1bnNpZ25lZCBjaGFyICp2bXNfcmVjOwoKI2lmIFZNU19ERUJVRwogIHZtc19kZWJ1ZygyLCAiRU9NL0VFT01cbiIpOwojZW5kaWYKCiAgdm1zX3JlYyA9IFBSSVYgKHZtc19yZWMpOwoKICBpZiAoKG9ianR5cGUgPT0gT0JKX1NfQ19FT00pCiAgICAgfHwgKG9ianR5cGUgPT0gT0JKX1NfQ19FT01XKSkKICAgIHsKICAgIH0KICBlbHNlCiAgICB7CiAgICAgIFBSSVYgKGVvbV9kYXRhKS5lb21fbF90b3RhbF9scHMKICAgICAgICA9IGJmZF9nZXRsMzIgKHZtc19yZWMgKyBFRU9NX1NfTF9UT1RBTF9MUFMpOwogICAgICBQUklWIChlb21fZGF0YSkuZW9tX3dfY29tY29kID0gYmZkX2dldGwxNiAodm1zX3JlYyArIEVFT01fU19XX0NPTUNPRCk7CiAgICAgIGlmIChQUklWIChlb21fZGF0YSkuZW9tX3dfY29tY29kID4gMSkKCXsKCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJPYmplY3QgbW9kdWxlIE5PVCBlcnJvci1mcmVlICFcbiIpKTsKCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7CgkgIHJldHVybiAtMTsKCX0KICAgICAgUFJJViAoZW9tX2RhdGEpLmVvbV9oYXNfdHJhbnNmZXIgPSBGQUxTRTsKICAgICAgaWYgKFBSSVYgKHJlY19zaXplKSA+IDEwKQoJewoJICAgUFJJViAoZW9tX2RhdGEpLmVvbV9oYXNfdHJhbnNmZXIgPSBUUlVFOwoJICAgUFJJViAoZW9tX2RhdGEpLmVvbV9iX3RmcmZsZyA9IHZtc19yZWNbRUVPTV9TX0JfVEZSRkxHXTsKCSAgIFBSSVYgKGVvbV9kYXRhKS5lb21fbF9wc2luZHgKCSAgICAgPSBiZmRfZ2V0bDMyICh2bXNfcmVjICsgRUVPTV9TX0xfUFNJTkRYKTsKCSAgIFBSSVYgKGVvbV9kYXRhKS5lb21fbF90ZnJhZHIKCSAgICAgPSBiZmRfZ2V0bDMyICh2bXNfcmVjICsgRUVPTV9TX0xfVEZSQURSKTsKCgkgICBhYmZkLT5zdGFydF9hZGRyZXNzID0gUFJJViAoZW9tX2RhdGEpLmVvbV9sX3RmcmFkcjsKCX0KICAgIH0KICByZXR1cm4gMDsKfQoKLyogV3JpdGUgZW9tIHJlY29yZCBmb3IgYmZkIGFiZmQuICAqLwoKaW50Cl9iZmRfdm1zX3dyaXRlX2VvbSAoYmZkICphYmZkLCBpbnQgb2JqdHlwZSkKewojaWYgVk1TX0RFQlVHCiAgdm1zX2RlYnVnICgyLCAidm1zX3dyaXRlX2VvbSAoJXAsICVkKVxuIiwgYWJmZCwgb2JqdHlwZSk7CiNlbmRpZgoKICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsIG9ianR5cGUsIC0xKTsKICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpIChQUklWICh2bXNfbGlua2FnZV9pbmRleCkgPj4gMSkpOwogIF9iZmRfdm1zX291dHB1dF9ieXRlIChhYmZkLCAwKTsJLyogQ29tcGxldGlvbiBjb2RlLiAgKi8KICBfYmZkX3Ztc19vdXRwdXRfYnl0ZSAoYWJmZCwgMCk7CS8qIEZpbGwgYnl0ZS4gICovCgogIGlmIChiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpICE9IChiZmRfdm1hKS0xKQogICAgewogICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKCiAgICAgIHNlY3Rpb24gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5saW5rIik7CiAgICAgIGlmIChzZWN0aW9uID09IDApCgl7CgkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub25yZXByZXNlbnRhYmxlX3NlY3Rpb24pOwoJICByZXR1cm4gLTE7Cgl9CiAgICAgIF9iZmRfdm1zX291dHB1dF9zaG9ydCAoYWJmZCwgMCk7CiAgICAgIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLCAodW5zaWduZWQgbG9uZykgKHNlY3Rpb24tPmluZGV4KSk7CiAgICAgIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLAoJCQkgICAgICh1bnNpZ25lZCBsb25nKSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpKTsKICAgICAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsIDApOwogICAgfQoKICBfYmZkX3Ztc19vdXRwdXRfZW5kIChhYmZkKTsKICByZXR1cm4gMDsKfQoKLyogUmVhZCAmIHByb2Nlc3MgSUhEL0VJSEQgcmVjb3JkLgogICBSZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvciAgKi8KaW50Cl9iZmRfdm1zX3NsdXJwX2loZCAoYmZkICphYmZkLCB1bnNpZ25lZCBpbnQgKmlzZF9vZmZzZXQsCgkJICAgIHVuc2lnbmVkIGludCAqaWhzX29mZnNldCkKewogIHVuc2lnbmVkIGludCBpbWd0eXBlLCBzaXplOwogIGJmZF92bWEgc3ltdnZhOwoKI2lmIFZNU19ERUJVRwogIHZtc19kZWJ1ZyAoOCwgIl9iZmRfdm1zX3NsdXJwX2loZFxuIik7CiNlbmRpZgoKICBzaXplID0gYmZkX2dldGwzMiAoUFJJViAodm1zX3JlYykgKyBFSUhEX1NfTF9TSVpFKTsKICBpbWd0eXBlID0gYmZkX2dldGwzMiAoUFJJViAodm1zX3JlYykgKyBFSUhEX1NfTF9JTUdUWVBFKTsKCiAgaWYgKGltZ3R5cGUgPT0gRUlIRF9TX0tfRVhFKQogICAgYWJmZC0+ZmxhZ3MgfD0gRVhFQ19QOwoKICBzeW12dmEgPSBiZmRfZ2V0bDY0IChQUklWICh2bXNfcmVjKSArIEVJSERfU19RX1NZTVZWQSk7CiAgaWYgKHN5bXZ2YSAhPSAwKQogICAgewogICAgICBQUklWIChzeW12dmEpID0gc3ltdnZhOwogICAgICBhYmZkLT5mbGFncyB8PSBEWU5BTUlDOwogICAgfQoKICAqaXNkX29mZnNldCA9IGJmZF9nZXRsMzIgKFBSSVYgKHZtc19yZWMpICsgRUlIRF9TX0xfSVNET0ZGKTsKICAqaWhzX29mZnNldCA9IGJmZF9nZXRsMzIgKFBSSVYgKHZtc19yZWMpICsgRUlIRF9TX0xfU1lNREJHT0ZGKTsKCiNpZiBWTVNfREVCVUcKICB2bXNfZGVidWcgKDQsICJFSUhEIHJlY29yZCBzaXplICVkIGltZ3R5cGUgJWQgc3ltdnZhIDB4JWxseCBpc2QgJWQgaWhzICVkXG4iLAoJICAgICBzaXplLCBpbWd0eXBlLCBzeW12dmEsICppc2Rfb2Zmc2V0LCAqaWhzX29mZnNldCk7CiNlbmRpZgoKICByZXR1cm4gMDsKfQoKLyogUmVhZCAmIHByb2Nlc3MgSVNEL0VJU0QgcmVjb3JkCiAgIHJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yICAqLwoKaW50Cl9iZmRfdm1zX3NsdXJwX2lzZCAoYmZkICphYmZkLCB1bnNpZ25lZCBpbnQgb2Zmc2V0KQp7CiAgaW50IHNlY3Rpb25fY291bnQgPSAwOwogIHVuc2lnbmVkIGNoYXIgKnA7CiAgdW5zaWduZWQgaW50IHJlY19zaXplOwoKI2lmIFZNU19ERUJVRwogIHZtc19kZWJ1ZyAoOCwgIl9iZmRfdm1zX3NsdXJwX2lzZFxuIik7CiNlbmRpZgoKICBmb3IgKHAgPSBQUklWICh2bXNfcmVjKSArIG9mZnNldDsKICAgICAgIChyZWNfc2l6ZSA9IGJmZF9nZXRsMzIgKHAgKyBFSVNEX1NfTF9FSVNEU0laRSkpICE9IDA7CiAgICAgICBwICs9IHJlY19zaXplKQogICAgewogICAgICB1bnNpZ25lZCBsb25nIGxvbmcgdmFkZHIgPSBiZmRfZ2V0bDY0IChwICsgRUlTRF9TX1FfVklSX0FERFIpOwogICAgICB1bnNpZ25lZCBpbnQgc2l6ZSA9IGJmZF9nZXRsMzIgKHAgKyBFSVNEX1NfTF9TRUNTSVpFKTsKICAgICAgdW5zaWduZWQgaW50IGZsYWdzID0gYmZkX2dldGwzMiAocCArIEVJU0RfU19MX0ZMQUdTKTsKICAgICAgdW5zaWduZWQgaW50IHZibiA9IGJmZF9nZXRsMzIgKHAgKyBFSVNEX1NfTF9WQk4pOwogICAgICBjaGFyICpuYW1lID0gTlVMTDsKICAgICAgYXNlY3Rpb24gKnNlY3Rpb247CiAgICAgIGZsYWd3b3JkIGJmZF9mbGFnczsKCiNpZiBWTVNfREVCVUcKICAgICAgdm1zX2RlYnVnICg0LCAiRUlTRCByZWNvcmQgYXQgMHgleCBzaXplIDB4JXggYWRkciAweCV4IGJmZF9mbGFncyAweCV4IGJsb2NrICVkXG4iLAoJCSBwIC0gUFJJViAodm1zX3JlYyksIHNpemUsIHZhZGRyLCBmbGFncywgdmJuKTsKI2VuZGlmCgogICAgICAvKiBWTVMgY29tYmluZXMgcHNlY3RzIGZyb20gLm9iaiBmaWxlcyBpbnRvIGlzZWN0cyBpbiB0aGUgLmV4ZS4gIFRoaXMKCSBwcm9jZXNzIGRvZXNuJ3QgcHJlc2VydmUgZW5vdWdoIGluZm9ybWF0aW9uIHRvIHJlbGlhYmx5IGRldGVybWluZQoJIHdoYXQncyBpbiBlYWNoIHNlY3Rpb24gd2l0aG91dCBleGFtaW5pbmcgdGhlIGRhdGEuICBUaGlzIGlzCgkgZXNwZWNpYWxseSB0cnVlIG9mIERXQVJGIGRlYnVnIHNlY3Rpb25zLiAgKi8KICAgICAgYmZkX2ZsYWdzID0gU0VDX0FMTE9DOwoKICAgICAgaWYgKGZsYWdzICYgRUlTRF9TX01fRVhFKQoJYmZkX2ZsYWdzIHw9IFNFQ19DT0RFIHwgU0VDX0hBU19DT05URU5UUyB8IFNFQ19MT0FEOwoKICAgICAgaWYgKGZsYWdzICYgRUlTRF9TX01fTk9OU0hSQURSKQoJYmZkX2ZsYWdzIHw9IFNFQ19EQVRBIHwgU0VDX0hBU19DT05URU5UUyB8IFNFQ19MT0FEOwoKICAgICAgaWYgKCEoZmxhZ3MgJiBFSVNEX1NfTV9XUlQpKQoJYmZkX2ZsYWdzIHw9IFNFQ19SRUFET05MWTsKCiAgICAgIGlmIChmbGFncyAmIEVJU0RfU19NX0RaUk8pCgliZmRfZmxhZ3MgfD0gU0VDX0RBVEE7CgogICAgICBpZiAoZmxhZ3MgJiBFSVNEX1NfTV9GSVhVUFZFQykKCWJmZF9mbGFncyB8PSBTRUNfREFUQSB8IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfTE9BRDsKCiAgICAgIGlmIChmbGFncyAmIEVJU0RfU19NX0NSRikKCWJmZF9mbGFncyB8PSBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0xPQUQ7CgogICAgICBpZiAoZmxhZ3MgJiBFSVNEX1NfTV9HQkwpCgl7CgkgIG5hbWUgPSBfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nIChwICsgRUlTRF9TX1RfR0JMTkFNKTsKCSAgYmZkX2ZsYWdzIHw9IFNFQ19DT0ZGX1NIQVJFRF9MSUJSQVJZOwoJICBiZmRfZmxhZ3MgJj0gfihTRUNfQUxMT0MgfCBTRUNfTE9BRCk7Cgl9CiAgICAgIGVsc2UKCXsKCSAgbmFtZSA9IChjaGFyKikgYmZkX2FsbG9jIChhYmZkLCAzMik7CgkgIHNwcmludGYgKG5hbWUsICIkTE9DQUxfJTAzZCQiLCBzZWN0aW9uX2NvdW50KyspOwoJfQoKICAgICAgc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIG5hbWUpOwoKICAgICAgaWYgKCFzZWN0aW9uKQoJcmV0dXJuIC0xOwoKICAgICAgc2VjdGlvbi0+ZmlsZXBvcyA9IHZibiA/IFZNU19CTE9DS19TSVpFICogKHZibiAtIDEpIDogKHVuc2lnbmVkIGludCktMTsKICAgICAgc2VjdGlvbi0+c2l6ZSA9IHNpemU7CiAgICAgIHNlY3Rpb24tPnZtYSA9IHZhZGRyOwoKICAgICAgaWYgKCFiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlY3Rpb24sIGJmZF9mbGFncykpCglyZXR1cm4gLTE7CiAgICB9CgogIHJldHVybiAwOwp9CgovKiBSZWFkICYgcHJvY2VzcyBJSFMvRUlIUyByZWNvcmQKICAgcmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IgICovCmludApfYmZkX3Ztc19zbHVycF9paHMgKGJmZCAqYWJmZCwgdW5zaWduZWQgaW50IG9mZnNldCkKewogIHVuc2lnbmVkIGNoYXIgKnAgPSBQUklWICh2bXNfcmVjKSArIG9mZnNldDsKICB1bnNpZ25lZCBpbnQgZ3N0dmJuID0gYmZkX2dldGwzMiAocCArIEVJSFNfU19MX0dTVFZCTik7CiAgdW5zaWduZWQgaW50IGdzdHNpemUgQVRUUklCVVRFX1VOVVNFRCA9IGJmZF9nZXRsMzIgKHAgKyBFSUhTX1NfTF9HU1RTSVpFKTsKICB1bnNpZ25lZCBpbnQgZHN0dmJuID0gYmZkX2dldGwzMiAocCArIEVJSFNfU19MX0RTVFZCTik7CiAgdW5zaWduZWQgaW50IGRzdHNpemUgPSBiZmRfZ2V0bDMyIChwICsgRUlIU19TX0xfRFNUU0laRSk7CiAgdW5zaWduZWQgaW50IGRtdHZibiA9IGJmZF9nZXRsMzIgKHAgKyBFSUhTX1NfTF9ETVRWQk4pOwogIHVuc2lnbmVkIGludCBkbXRieXRlcyA9IGJmZF9nZXRsMzIgKHAgKyBFSUhTX1NfTF9ETVRCWVRFUyk7CiAgYXNlY3Rpb24gKnNlY3Rpb247CgojaWYgVk1TX0RFQlVHCiAgdm1zX2RlYnVnICg4LCAiX2JmZF92bXNfc2x1cnBfaWhzXG4iKTsKICB2bXNfZGVidWcgKDQsICJFSUhTIHJlY29yZCBnc3R2Ym4gJWQgZ3N0c2l6ZSAlZCBkc3R2Ym4gJWQgZHN0c2l6ZSAlZCBkbXR2Ym4gJWQgZG10Ynl0ZXMgJWRcbiIsCgkgICAgIGdzdHZibiwgZ3N0c2l6ZSwgZHN0dmJuLCBkc3RzaXplLCBkbXR2Ym4sIGRtdGJ5dGVzKTsKI2VuZGlmCgogIGlmIChkc3R2Ym4pCiAgICB7CiAgICAgIGZsYWd3b3JkIGJmZF9mbGFncyA9IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfREVCVUdHSU5HOwoKICAgICAgc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIkRFNUJCIpOwogICAgICBpZiAoIXNlY3Rpb24pCglyZXR1cm4gLTE7CgogICAgICBzZWN0aW9uLT5zaXplID0gZHN0c2l6ZTsKICAgICAgc2VjdGlvbi0+ZmlsZXBvcyA9IFZNU19CTE9DS19TSVpFICogKGRzdHZibiAtIDEpOwoKICAgICAgaWYgKCFiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlY3Rpb24sIGJmZF9mbGFncykpCglyZXR1cm4gLTE7CgogICAgICBQUklWIChkc3Rfc2VjdGlvbikgPSBzZWN0aW9uOwogICAgICBhYmZkLT5mbGFncyB8PSAoSEFTX0RFQlVHIHwgSEFTX0xJTkVOTyk7CiAgICB9CgogIGlmIChkbXR2Ym4pCiAgICB7CiAgICAgIGZsYWd3b3JkIGJmZF9mbGFncyA9IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfREVCVUdHSU5HOwoKICAgICAgc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIkRE1UJCIpOwogICAgICBpZiAoIXNlY3Rpb24pCglyZXR1cm4gLTE7CgogICAgICBzZWN0aW9uLT5zaXplID0gZG10Ynl0ZXM7CiAgICAgIHNlY3Rpb24tPmZpbGVwb3MgPSBWTVNfQkxPQ0tfU0laRSAqIChkbXR2Ym4gLSAxKTsKCiAgICAgIGlmICghYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWN0aW9uLCBiZmRfZmxhZ3MpKQoJcmV0dXJuIC0xOwogICAgfQoKICBpZiAoZ3N0dmJuKQogICAgewogICAgICBmbGFnd29yZCBiZmRfZmxhZ3MgPSBTRUNfSEFTX0NPTlRFTlRTOwoKICAgICAgc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIkR1NUJCIpOwogICAgICBpZiAoIXNlY3Rpb24pCglyZXR1cm4gLTE7CgogICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIFZNU19CTE9DS19TSVpFICogKGdzdHZibiAtIDEpLCBTRUVLX1NFVCkpCgl7CgkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCk7CgkgIHJldHVybiAtMTsKCX0KCiAgICAgIGlmIChfYmZkX3Ztc19zbHVycF9vYmplY3RfcmVjb3JkcyAoYWJmZCkgIT0gMCkKCXJldHVybiAtMTsKCiAgICAgIHNlY3Rpb24tPmZpbGVwb3MgPSBWTVNfQkxPQ0tfU0laRSAqIChnc3R2Ym4gLSAxKTsKICAgICAgc2VjdGlvbi0+c2l6ZSA9IGJmZF90ZWxsIChhYmZkKSAtIHNlY3Rpb24tPmZpbGVwb3M7CgogICAgICBpZiAoIWJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjdGlvbiwgYmZkX2ZsYWdzKSkKCXJldHVybiAtMTsKCiAgICAgIGFiZmQtPmZsYWdzIHw9IEhBU19TWU1TOwogICAgfQoKICByZXR1cm4gMDsKfQoKLyogQnVpbGQgYSBuZXcgbW9kdWxlIGZvciB0aGUgc3BlY2lmaWVkIEJGRC4gICovCgpzdGF0aWMgc3RydWN0IG1vZHVsZSAqCm5ld19tb2R1bGUgKGJmZCAqYWJmZCkKewogIHN0cnVjdCBtb2R1bGUgKm1vZHVsZQogICAgPSAoc3RydWN0IG1vZHVsZSAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBtb2R1bGUpKTsKICBtb2R1bGUtPmZpbGVfdGFibGVfY291bnQgPSAxNjsgLyogQXJiaXRyYXJ5LiAgKi8KICBtb2R1bGUtPmZpbGVfdGFibGUKICAgID0gYmZkX21hbGxvYyAobW9kdWxlLT5maWxlX3RhYmxlX2NvdW50ICogc2l6ZW9mIChzdHJ1Y3QgZmlsZWluZm8pKTsKICByZXR1cm4gbW9kdWxlOwp9CgovKiBQYXJzZSBkZWJ1ZyBpbmZvIGZvciBhIG1vZHVsZSBhbmQgaW50ZXJuYWxpemUgaXQuICAqLwoKc3RhdGljIHZvaWQKcGFyc2VfbW9kdWxlIChiZmQgKmFiZmQsIHN0cnVjdCBtb2R1bGUgKm1vZHVsZSwgdW5zaWduZWQgY2hhciAqcHRyLAoJICAgICAgdW5zaWduZWQgaW50IGxlbmd0aCkKewogIHVuc2lnbmVkIGNoYXIgKm1heHB0ciA9IHB0ciArIGxlbmd0aCwgKnNyY19wdHIsICpwY2xfcHRyOwogIHVuc2lnbmVkIGludCBwcmV2X2xpbnVtID0gMCwgY3Vycl9saW5lbnVtID0gMDsKICBiZmRfdm1hIHByZXZfcGMgPSAwLCBjdXJyX3BjID0gMDsKICBzdHJ1Y3Qgc3JlY2luZm8gKmN1cnJfc3JlYywgKnNyZWM7CiAgc3RydWN0IGxpbmVpbmZvICpjdXJyX2xpbmUsICpsaW5lOwogIHN0cnVjdCBmdW5jaW5mbyAqZnVuY2luZm87CgogIC8qIEluaXRpYWxpemUgdGFibGVzIHdpdGggemVybyBlbGVtZW50LiAgKi8KICBjdXJyX3NyZWMgPSAoc3RydWN0IHNyZWNpbmZvICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IHNyZWNpbmZvKSk7CiAgbW9kdWxlLT5zcmVjX3RhYmxlID0gY3Vycl9zcmVjOwoKICBjdXJyX2xpbmUgPSAoc3RydWN0IGxpbmVpbmZvICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGxpbmVpbmZvKSk7CiAgbW9kdWxlLT5saW5lX3RhYmxlID0gY3Vycl9saW5lOwoKICB3aGlsZSAocHRyIDwgbWF4cHRyKQogICAgewogICAgICAvKiBUaGUgZmlyc3QgYnl0ZSBpcyBub3QgY291bnRlZCBpbiB0aGUgcmVjb3JkZWQgbGVuZ3RoLiAgKi8KICAgICAgaW50IHJlY19sZW5ndGggPSBiZmRfZ2V0bDE2IChwdHIpICsgMTsKICAgICAgaW50IHJlY190eXBlID0gYmZkX2dldGwxNiAocHRyICsgMik7CgojaWYgVk1TX0RFQlVHCiAgICAgIF9iZmRfdm1zX2RlYnVnICgyLCAiRFNUIHJlY29yZDogbGVuZ3RoICVkLCB0eXBlICVkXG4iLAoJCSAgICAgIHJlY19sZW5ndGgsIHJlY190eXBlKTsKI2VuZGlmCgogICAgICBzd2l0Y2ggKHJlY190eXBlKQoJewoJY2FzZSBEU1RfU19DX01PREJFRzoKCSAgbW9kdWxlLT5uYW1lCgkgICAgPSBfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nIChwdHIgKyBEU1RfU19CX01PREJFR19OQU1FKTsKCgkgIGN1cnJfcGMgPSAwOwoJICBwcmV2X3BjID0gMDsKCSAgY3Vycl9saW5lbnVtID0gMDsKCSAgcHJldl9saW51bSA9IDA7CgojaWYgVk1TX0RFQlVHCiAgICAgICAgICBfYmZkX3Ztc19kZWJ1ZyAoMywgIm1vZHVsZTogJXNcbiIsIG1vZHVsZS0+bmFtZSk7CiNlbmRpZgoJICBicmVhazsKCgljYXNlIERTVF9TX0NfTU9ERU5EOgojaWYgVk1TX0RFQlVHCiAgICAgICAgICBfYmZkX3Ztc19kZWJ1ZyAoMywgImVuZCBtb2R1bGVcbiIpOwojZW5kaWYKCSAgYnJlYWs7CgoJY2FzZSBEU1RfU19DX1JUTkJFRzoKCSAgZnVuY2luZm8gPSAoc3RydWN0IGZ1bmNpbmZvICopCgkgICAgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZnVuY2luZm8pKTsKICAgICAgICAgIGZ1bmNpbmZvLT5uYW1lCgkgICAgPSBfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nIChwdHIgKyBEU1RfU19CX1JUTkJFR19OQU1FKTsKCSAgZnVuY2luZm8tPmxvdyA9IGJmZF9nZXRsMzIgKHB0ciArIERTVF9TX0xfUlROQkVHX0FERFJFU1MpOwoJICBmdW5jaW5mby0+bmV4dCA9IG1vZHVsZS0+ZnVuY190YWJsZTsKCSAgbW9kdWxlLT5mdW5jX3RhYmxlID0gZnVuY2luZm87CiAgICAKI2lmIFZNU19ERUJVRwogICAgICAgICAgX2JmZF92bXNfZGVidWcgKDMsICJyb3V0aW5lOiAlcyBhdCAweCV4XG4iLAoJCQkgIGZ1bmNpbmZvLT5uYW1lLCBmdW5jaW5mby0+bG93KTsKI2VuZGlmCgkgIGJyZWFrOwoKCWNhc2UgRFNUX1NfQ19SVE5FTkQ6CgkgIG1vZHVsZS0+ZnVuY190YWJsZS0+aGlnaCA9IG1vZHVsZS0+ZnVuY190YWJsZS0+bG93CgkgICAgKyBiZmRfZ2V0bDMyIChwdHIgKyBEU1RfU19MX1JUTkVORF9TSVpFKSAtIDE7CgoJICBpZiAobW9kdWxlLT5mdW5jX3RhYmxlLT5oaWdoID4gbW9kdWxlLT5oaWdoKQoJICAgIG1vZHVsZS0+aGlnaCA9IG1vZHVsZS0+ZnVuY190YWJsZS0+aGlnaDsKCiNpZiBWTVNfREVCVUcKICAgICAgICAgIF9iZmRfdm1zX2RlYnVnICgzLCAiZW5kIHJvdXRpbmVcbiIpOwojZW5kaWYKCSAgYnJlYWs7CgoJY2FzZSBEU1RfU19DX1BST0xPRzoKI2lmIFZNU19ERUJVRwogICAgICAgICAgX2JmZF92bXNfZGVidWcgKDMsICJwcm9sb2d1ZVxuIik7CiNlbmRpZgoJICBicmVhazsKCgljYXNlIERTVF9TX0NfRVBJTE9HOgojaWYgVk1TX0RFQlVHCiAgICAgICAgICBfYmZkX3Ztc19kZWJ1ZyAoMywgImVwaWxvZ1xuIik7CiNlbmRpZgoJICBicmVhazsKCgljYXNlIERTVF9TX0NfQkxLQkVHOgojaWYgVk1TX0RFQlVHCiAgICAgICAgICBfYmZkX3Ztc19kZWJ1ZyAoMywgImJsb2NrXG4iKTsKI2VuZGlmCgkgIGJyZWFrOwoKCWNhc2UgRFNUX1NfQ19CTEtFTkQ6CiNpZiBWTVNfREVCVUcKICAgICAgICAgIF9iZmRfdm1zX2RlYnVnICgzLCAiZW5kIGJsb2NrXG4iKTsKI2VuZGlmCgkgIGJyZWFrOwoKCWNhc2UgRFNUX1NfQ19TT1VSQ0U6CgkgIHNyY19wdHIgPSBwdHIgKyBEU1RfU19DX1NPVVJDRV9IRUFERVJfU0laRTsKCiNpZiBWTVNfREVCVUcKCSAgX2JmZF92bXNfZGVidWcgKDMsICJzb3VyY2UgaW5mb1xuIik7CiNlbmRpZgoKCSAgd2hpbGUgKHNyY19wdHIgPCBwdHIgKyByZWNfbGVuZ3RoKQoJICAgIHsKCSAgICAgIGludCBjbWQgPSBzcmNfcHRyWzBdLCBjbWRfbGVuZ3RoLCBkYXRhOwoKCSAgICAgIHN3aXRjaCAoY21kKQoJCXsKCQljYXNlIERTVF9TX0NfU1JDX0RFQ0xGSUxFOgoJCSAgewoJCSAgICB1bnNpZ25lZCBpbnQgZmlsZWlkCgkJICAgICAgPSBiZmRfZ2V0bDE2IChzcmNfcHRyICsgRFNUX1NfV19TUkNfREZfRklMRUlEKTsKCQkgICAgY2hhciAqZmlsZW5hbWUKCQkgICAgICA9IF9iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgKHNyY19wdHIKCQkJICArIERTVF9TX0JfU1JDX0RGX0ZJTEVOQU1FKTsKCgkJICAgIHdoaWxlIChmaWxlaWQgPj0gbW9kdWxlLT5maWxlX3RhYmxlX2NvdW50KQoJCSAgICAgIHsKCQkJbW9kdWxlLT5maWxlX3RhYmxlX2NvdW50ICo9IDI7CgkJCW1vZHVsZS0+ZmlsZV90YWJsZQoJCQkgID0gYmZkX3JlYWxsb2MgKG1vZHVsZS0+ZmlsZV90YWJsZSwKCQkJCQkgbW9kdWxlLT5maWxlX3RhYmxlX2NvdW50CgkJCQkJICAgKiBzaXplb2YgKHN0cnVjdCBmaWxlaW5mbykpOwoJCSAgICAgIH0KCgkJICAgIG1vZHVsZS0+ZmlsZV90YWJsZSBbZmlsZWlkXS5uYW1lID0gZmlsZW5hbWU7CgkJICAgIG1vZHVsZS0+ZmlsZV90YWJsZSBbZmlsZWlkXS5zcmVjID0gMTsKCQkgICAgY21kX2xlbmd0aCA9IHNyY19wdHJbRFNUX1NfQl9TUkNfREZfTEVOR1RIXSArIDI7CiNpZiBWTVNfREVCVUcKCQkgICAgX2JmZF92bXNfZGVidWcgKDQsICJEU1RfU19DX1NSQ19ERUNMRklMRTogJWQsICVzXG4iLAoJCQkJICAgIGZpbGVpZCwKCQkJCSAgICBtb2R1bGUtPmZpbGVfdGFibGUgW2ZpbGVpZF0ubmFtZSk7CiNlbmRpZgoJCSAgfQoJCSAgYnJlYWs7CgoJCWNhc2UgRFNUX1NfQ19TUkNfREVGTElORVNfQjoKCQkgIC8qIFBlcmZvcm0gdGhlIGFzc29jaWF0aW9uIGFuZCBzZXQgdGhlIG5leHQgaGlnaGVyIGluZGV4CgkJICAgICB0byB0aGUgbGltaXQuICAqLwoJCSAgZGF0YSA9IHNyY19wdHJbRFNUX1NfQl9TUkNfVU5TQllURV07CgkJICBzcmVjID0gKHN0cnVjdCBzcmVjaW5mbyAqKQoJCSAgICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBzcmVjaW5mbykpOwoJCSAgc3JlYy0+bGluZSA9IGN1cnJfc3JlYy0+bGluZSArIGRhdGE7CgkJICBzcmVjLT5zcmVjID0gY3Vycl9zcmVjLT5zcmVjICsgZGF0YTsKCQkgIHNyZWMtPnNmaWxlID0gY3Vycl9zcmVjLT5zZmlsZTsKCQkgIGN1cnJfc3JlYy0+bmV4dCA9IHNyZWM7CgkJICBjdXJyX3NyZWMgPSBzcmVjOwoJCSAgY21kX2xlbmd0aCA9IDI7CiNpZiBWTVNfREVCVUcKCQkgIF9iZmRfdm1zX2RlYnVnICg0LCAiRFNUX1NfQ19TUkNfREVGTElORVNfQjogJWRcbiIsIGRhdGEpOwojZW5kaWYKCQkgIGJyZWFrOwoKCQljYXNlIERTVF9TX0NfU1JDX0RFRkxJTkVTX1c6CgkJICAvKiBQZXJmb3JtIHRoZSBhc3NvY2lhdGlvbiBhbmQgc2V0IHRoZSBuZXh0IGhpZ2hlciBpbmRleAoJCSAgICAgdG8gdGhlIGxpbWl0LiAgKi8KCQkgIGRhdGEgPSBiZmRfZ2V0bDE2IChzcmNfcHRyICsgRFNUX1NfV19TUkNfVU5TV09SRCk7CgkJICBzcmVjID0gKHN0cnVjdCBzcmVjaW5mbyAqKQoJCSAgICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBzcmVjaW5mbykpOwoJCSAgc3JlYy0+bGluZSA9IGN1cnJfc3JlYy0+bGluZSArIGRhdGE7CgkJICBzcmVjLT5zcmVjID0gY3Vycl9zcmVjLT5zcmVjICsgZGF0YSwKCQkgIHNyZWMtPnNmaWxlID0gY3Vycl9zcmVjLT5zZmlsZTsKCQkgIGN1cnJfc3JlYy0+bmV4dCA9IHNyZWM7CgkJICBjdXJyX3NyZWMgPSBzcmVjOwoJCSAgY21kX2xlbmd0aCA9IDM7CiNpZiBWTVNfREVCVUcKCQkgIF9iZmRfdm1zX2RlYnVnICg0LCAiRFNUX1NfQ19TUkNfREVGTElORVNfVzogJWRcbiIsIGRhdGEpOwojZW5kaWYKCQkgIGJyZWFrOwoKCQljYXNlIERTVF9TX0NfU1JDX0lOQ1JMTlVNX0I6CgkJICBkYXRhID0gc3JjX3B0cltEU1RfU19CX1NSQ19VTlNCWVRFXTsKCQkgIGN1cnJfc3JlYy0+bGluZSArPSBkYXRhOwoJCSAgY21kX2xlbmd0aCA9IDI7CiNpZiBWTVNfREVCVUcKCQkgIF9iZmRfdm1zX2RlYnVnICg0LCAiRFNUX1NfQ19TUkNfSU5DUkxOVU1fQjogJWRcbiIsIGRhdGEpOwojZW5kaWYKCQkgIGJyZWFrOwoKCQljYXNlIERTVF9TX0NfU1JDX1NFVEZJTEU6CgkJICBkYXRhID0gYmZkX2dldGwxNiAoc3JjX3B0ciArIERTVF9TX1dfU1JDX1VOU1dPUkQpOwoJCSAgY3Vycl9zcmVjLT5zZmlsZSA9IGRhdGE7CgkJICBjdXJyX3NyZWMtPnNyZWMgPSBtb2R1bGUtPmZpbGVfdGFibGVbZGF0YV0uc3JlYzsKCQkgIGNtZF9sZW5ndGggPSAzOwojaWYgVk1TX0RFQlVHCgkJICBfYmZkX3Ztc19kZWJ1ZyAoNCwgIkRTVF9TX0NfU1JDX1NFVEZJTEU6ICVkXG4iLCBkYXRhKTsKI2VuZGlmCgkJICBicmVhazsKCgkJY2FzZSBEU1RfU19DX1NSQ19TRVRMTlVNX0w6CgkJICBkYXRhID0gYmZkX2dldGwzMiAoc3JjX3B0ciArIERTVF9TX0xfU1JDX1VOU0xPTkcpOwoJCSAgY3Vycl9zcmVjLT5saW5lID0gZGF0YTsKCQkgIGNtZF9sZW5ndGggPSA1OwojaWYgVk1TX0RFQlVHCgkJICBfYmZkX3Ztc19kZWJ1ZyAoNCwgIkRTVF9TX0NfU1JDX1NFVExOVU1fTDogJWRcbiIsIGRhdGEpOwojZW5kaWYKCQkgIGJyZWFrOwoKCQljYXNlIERTVF9TX0NfU1JDX1NFVExOVU1fVzoKCQkgIGRhdGEgPSBiZmRfZ2V0bDE2IChzcmNfcHRyICsgRFNUX1NfV19TUkNfVU5TV09SRCk7CgkJICBjdXJyX3NyZWMtPmxpbmUgPSBkYXRhOwoJCSAgY21kX2xlbmd0aCA9IDM7CiNpZiBWTVNfREVCVUcKCQkgIF9iZmRfdm1zX2RlYnVnICg0LCAiRFNUX1NfQ19TUkNfU0VUTE5VTV9XOiAlZFxuIiwgZGF0YSk7CiNlbmRpZgoJCSAgYnJlYWs7CgoJCWNhc2UgRFNUX1NfQ19TUkNfU0VUUkVDX0w6CgkJICBkYXRhID0gYmZkX2dldGwzMiAoc3JjX3B0ciArIERTVF9TX0xfU1JDX1VOU0xPTkcpOwoJCSAgY3Vycl9zcmVjLT5zcmVjID0gZGF0YTsKCQkgIG1vZHVsZS0+ZmlsZV90YWJsZVtjdXJyX3NyZWMtPnNmaWxlXS5zcmVjID0gZGF0YTsKCQkgIGNtZF9sZW5ndGggPSA1OwojaWYgVk1TX0RFQlVHCgkJICBfYmZkX3Ztc19kZWJ1ZyAoNCwgIkRTVF9TX0NfU1JDX1NFVFJFQ19MOiAlZFxuIiwgZGF0YSk7CiNlbmRpZgoJCSAgYnJlYWs7CgoJCWNhc2UgRFNUX1NfQ19TUkNfU0VUUkVDX1c6CgkJICBkYXRhID0gYmZkX2dldGwxNiAoc3JjX3B0ciArIERTVF9TX1dfU1JDX1VOU1dPUkQpOwoJCSAgY3Vycl9zcmVjLT5zcmVjID0gZGF0YTsKCQkgIG1vZHVsZS0+ZmlsZV90YWJsZVtjdXJyX3NyZWMtPnNmaWxlXS5zcmVjID0gZGF0YTsKCQkgIGNtZF9sZW5ndGggPSAzOwojaWYgVk1TX0RFQlVHCgkJICBfYmZkX3Ztc19kZWJ1ZyAoNCwgIkRTVF9TX0NfU1JDX1NFVFJFQ19XOiAlZFxuIiwgZGF0YSk7CiNlbmRpZgoJCSAgYnJlYWs7CgoJCWNhc2UgRFNUX1NfQ19TUkNfRk9STUZFRUQ6CgkJICBjbWRfbGVuZ3RoID0gMTsKI2lmIFZNU19ERUJVRwoJCSAgX2JmZF92bXNfZGVidWcgKDQsICJEU1RfU19DX1NSQ19GT1JNRkVFRFxuIik7CiNlbmRpZgoJCSAgYnJlYWs7CgoJCWRlZmF1bHQ6CgkJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oInVua25vd24gc291cmNlIGNvbW1hbmQgJWQiKSwKCQkJCQkgY21kKTsKCQkgIGNtZF9sZW5ndGggPSAyOwoJCSAgYnJlYWs7CgkJfQoKCSAgICAgIHNyY19wdHIgKz0gY21kX2xlbmd0aDsKCSAgICB9CgkgIGJyZWFrOwoKCWNhc2UgRFNUX1NfQ19MSU5FX05VTToKCSAgcGNsX3B0ciA9IHB0ciArIERTVF9TX0NfTElORV9OVU1fSEVBREVSX1NJWkU7CgojaWYgVk1TX0RFQlVHCgkgIF9iZmRfdm1zX2RlYnVnICgzLCAibGluZSBpbmZvXG4iKTsKI2VuZGlmCgoJICB3aGlsZSAocGNsX3B0ciA8IHB0ciArIHJlY19sZW5ndGgpCgkgICAgewoJICAgICAgLyogVGhlIGNvbW1hbmQgYnl0ZSBpcyBzaWduZWQgc28gd2UgbXVzdCBzaWduLWV4dGVuZCBpdC4gICovCgkgICAgICBpbnQgY21kID0gKChzaWduZWQgY2hhciAqKXBjbF9wdHIpWzBdLCBjbWRfbGVuZ3RoLCBkYXRhOwoKCSAgICAgIHN3aXRjaCAoY21kKQoJCXsKCQljYXNlIERTVF9TX0NfREVMVEFfUENfVzoKCQkgIGRhdGEgPSBiZmRfZ2V0bDE2IChwY2xfcHRyICsgRFNUX1NfV19QQ0xJTkVfVU5TV09SRCk7CgkJICBjdXJyX3BjICs9IGRhdGE7CgkJICBjdXJyX2xpbmVudW0gKz0gMTsKCQkgIGNtZF9sZW5ndGggPSAzOwojaWYgVk1TX0RFQlVHCgkJICBfYmZkX3Ztc19kZWJ1ZyAoNCwgIkRTVF9TX0NfREVMVEFfUENfVzogJWRcbiIsIGRhdGEpOwojZW5kaWYKCQkgIGJyZWFrOwoKCQljYXNlIERTVF9TX0NfREVMVEFfUENfTDoKCQkgIGRhdGEgPSBiZmRfZ2V0bDMyIChwY2xfcHRyICsgRFNUX1NfTF9QQ0xJTkVfVU5TTE9ORyk7CgkJICBjdXJyX3BjICs9IGRhdGE7CgkJICBjdXJyX2xpbmVudW0gKz0gMTsKCQkgIGNtZF9sZW5ndGggPSA1OwojaWYgVk1TX0RFQlVHCgkJICBfYmZkX3Ztc19kZWJ1ZyAoNCwgIkRTVF9TX0NfREVMVEFfUENfTDogJWRcbiIsIGRhdGEpOwojZW5kaWYKCQkgIGJyZWFrOwoKCQljYXNlIERTVF9TX0NfSU5DUl9MSU5VTToKCQkgIGRhdGEgPSBwY2xfcHRyW0RTVF9TX0JfUENMSU5FX1VOU0JZVEVdOwoJCSAgY3Vycl9saW5lbnVtICs9IGRhdGE7CgkJICBjbWRfbGVuZ3RoID0gMjsKI2lmIFZNU19ERUJVRwoJCSAgX2JmZF92bXNfZGVidWcgKDQsICJEU1RfU19DX0lOQ1JfTElOVU06ICVkXG4iLCBkYXRhKTsKI2VuZGlmCgkJICBicmVhazsKCgkJY2FzZSBEU1RfU19DX0lOQ1JfTElOVU1fVzoKCQkgIGRhdGEgPSBiZmRfZ2V0bDE2IChwY2xfcHRyICsgRFNUX1NfV19QQ0xJTkVfVU5TV09SRCk7CgkJICBjdXJyX2xpbmVudW0gKz0gZGF0YTsKCQkgIGNtZF9sZW5ndGggPSAzOwojaWYgVk1TX0RFQlVHCgkJICBfYmZkX3Ztc19kZWJ1ZyAoNCwgIkRTVF9TX0NfSU5DUl9MSU5VTV9XOiAlZFxuIiwgZGF0YSk7CiNlbmRpZgoJCSAgYnJlYWs7CgoJCWNhc2UgRFNUX1NfQ19JTkNSX0xJTlVNX0w6CgkJICBkYXRhID0gYmZkX2dldGwzMiAocGNsX3B0ciArIERTVF9TX0xfUENMSU5FX1VOU0xPTkcpOwoJCSAgY3Vycl9saW5lbnVtICs9IGRhdGE7CgkJICBjbWRfbGVuZ3RoID0gNTsKI2lmIFZNU19ERUJVRwoJCSAgX2JmZF92bXNfZGVidWcgKDQsICJEU1RfU19DX0lOQ1JfTElOVU1fTDogJWRcbiIsIGRhdGEpOwojZW5kaWYKCQkgIGJyZWFrOwoKCQljYXNlIERTVF9TX0NfU0VUX0xJTlVNX0lOQ1I6CgkJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKCQkgICAgKF8oIkRTVF9TX0NfU0VUX0xJTlVNX0lOQ1Igbm90IGltcGxlbWVudGVkIikpOwoJCSAgY21kX2xlbmd0aCA9IDI7CgkJICBicmVhazsKCgkJY2FzZSBEU1RfU19DX1NFVF9MSU5VTV9JTkNSX1c6CgkJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKCQkgICAgKF8oIkRTVF9TX0NfU0VUX0xJTlVNX0lOQ1JfVyBub3QgaW1wbGVtZW50ZWQiKSk7CgkJICBjbWRfbGVuZ3RoID0gMzsKCQkgIGJyZWFrOwoKCQljYXNlIERTVF9TX0NfUkVTRVRfTElOVU1fSU5DUjoKCQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQoJCSAgICAoXygiRFNUX1NfQ19SRVNFVF9MSU5VTV9JTkNSIG5vdCBpbXBsZW1lbnRlZCIpKTsKCQkgIGNtZF9sZW5ndGggPSAxOwoJCSAgYnJlYWs7CgoJCWNhc2UgRFNUX1NfQ19CRUdfU1RNVF9NT0RFOgoJCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCgkJICAgIChfKCJEU1RfU19DX0JFR19TVE1UX01PREUgbm90IGltcGxlbWVudGVkIikpOwoJCSAgY21kX2xlbmd0aCA9IDE7CgkJICBicmVhazsKCgkJY2FzZSBEU1RfU19DX0VORF9TVE1UX01PREU6CgkJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKCQkgICAgKF8oIkRTVF9TX0NfRU5EX1NUTVRfTU9ERSBub3QgaW1wbGVtZW50ZWQiKSk7CgkJICBjbWRfbGVuZ3RoID0gMTsKCQkgIGJyZWFrOwoKCQljYXNlIERTVF9TX0NfU0VUX0xJTlVNX0I6CgkJICBkYXRhID0gcGNsX3B0cltEU1RfU19CX1BDTElORV9VTlNCWVRFXTsKCQkgIGN1cnJfbGluZW51bSA9IGRhdGE7CgkJICBjbWRfbGVuZ3RoID0gMjsKI2lmIFZNU19ERUJVRwoJCSAgX2JmZF92bXNfZGVidWcgKDQsICJEU1RfU19DX1NFVF9MSU5VTV9COiAlZFxuIiwgZGF0YSk7CiNlbmRpZgoJCSAgYnJlYWs7CgkKCQljYXNlIERTVF9TX0NfU0VUX0xJTkVfTlVNOgoJCSAgZGF0YSA9IGJmZF9nZXRsMTYgKHBjbF9wdHIgKyBEU1RfU19XX1BDTElORV9VTlNXT1JEKTsKCQkgIGN1cnJfbGluZW51bSA9IGRhdGE7CgkJICBjbWRfbGVuZ3RoID0gMzsKI2lmIFZNU19ERUJVRwoJCSAgX2JmZF92bXNfZGVidWcgKDQsICJEU1RfU19DX1NFVF9MSU5FX05VTTogJWRcbiIsIGRhdGEpOwojZW5kaWYKCQkgIGJyZWFrOwoKCQljYXNlIERTVF9TX0NfU0VUX0xJTlVNX0w6CgkJICBkYXRhID0gYmZkX2dldGwzMiAocGNsX3B0ciArIERTVF9TX0xfUENMSU5FX1VOU0xPTkcpOwoJCSAgY3Vycl9saW5lbnVtID0gZGF0YTsKCQkgIGNtZF9sZW5ndGggPSA1OwojaWYgVk1TX0RFQlVHCgkJICBfYmZkX3Ztc19kZWJ1ZyAoNCwgIkRTVF9TX0NfU0VUX0xJTlVNX0w6ICVkXG4iLCBkYXRhKTsKI2VuZGlmCgkJICBicmVhazsKCgkJY2FzZSBEU1RfU19DX1NFVF9QQzoKCQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQoJCSAgICAoXygiRFNUX1NfQ19TRVRfUEMgbm90IGltcGxlbWVudGVkIikpOwoJCSAgY21kX2xlbmd0aCA9IDI7CgkJICBicmVhazsKCgkJY2FzZSBEU1RfU19DX1NFVF9QQ19XOgoJCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCgkJICAgIChfKCJEU1RfU19DX1NFVF9QQ19XIG5vdCBpbXBsZW1lbnRlZCIpKTsKCQkgIGNtZF9sZW5ndGggPSAzOwoJCSAgYnJlYWs7CgoJCWNhc2UgRFNUX1NfQ19TRVRfUENfTDoKCQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQoJCSAgICAoXygiRFNUX1NfQ19TRVRfUENfTCBub3QgaW1wbGVtZW50ZWQiKSk7CgkJICBjbWRfbGVuZ3RoID0gNTsKCQkgIGJyZWFrOwoKCQljYXNlIERTVF9TX0NfU0VUX1NUTVROVU06CgkJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKCQkgICAgKF8oIkRTVF9TX0NfU0VUX1NUTVROVU0gbm90IGltcGxlbWVudGVkIikpOwoJCSAgY21kX2xlbmd0aCA9IDI7CgkJICBicmVhazsKCgkJY2FzZSBEU1RfU19DX1RFUk06CgkJICBkYXRhID0gcGNsX3B0cltEU1RfU19CX1BDTElORV9VTlNCWVRFXTsKCQkgIGN1cnJfcGMgKz0gZGF0YTsKCQkgIGNtZF9sZW5ndGggPSAyOwojaWYgVk1TX0RFQlVHCgkJICBfYmZkX3Ztc19kZWJ1ZyAoNCwgIkRTVF9TX0NfVEVSTTogJWRcbiIsIGRhdGEpOwojZW5kaWYKCQkgIGJyZWFrOwoKCQljYXNlIERTVF9TX0NfVEVSTV9XOgoJCSAgZGF0YSA9IGJmZF9nZXRsMTYgKHBjbF9wdHIgKyBEU1RfU19XX1BDTElORV9VTlNXT1JEKTsKCQkgIGN1cnJfcGMgKz0gZGF0YTsKCQkgIGNtZF9sZW5ndGggPSAzOwojaWYgVk1TX0RFQlVHCgkJICBfYmZkX3Ztc19kZWJ1ZyAoNCwgIkRTVF9TX0NfVEVSTV9XOiAlZFxuIiwgZGF0YSk7CiNlbmRpZgoJCSAgYnJlYWs7CgoJCWNhc2UgRFNUX1NfQ19URVJNX0w6CgkJICBkYXRhID0gYmZkX2dldGwzMiAocGNsX3B0ciArIERTVF9TX0xfUENMSU5FX1VOU0xPTkcpOwoJCSAgY3Vycl9wYyArPSBkYXRhOwoJCSAgY21kX2xlbmd0aCA9IDU7CiNpZiBWTVNfREVCVUcKCQkgIF9iZmRfdm1zX2RlYnVnICg0LCAiRFNUX1NfQ19URVJNX0w6ICVkXG4iLCBkYXRhKTsKI2VuZGlmCgkJICBicmVhazsKCgkJY2FzZSBEU1RfU19DX1NFVF9BQlNfUEM6CgkJICBkYXRhID0gYmZkX2dldGwzMiAocGNsX3B0ciArIERTVF9TX0xfUENMSU5FX1VOU0xPTkcpOwoJCSAgY3Vycl9wYyA9IGRhdGE7CgkJICBjbWRfbGVuZ3RoID0gNTsKI2lmIFZNU19ERUJVRwoJCSAgX2JmZF92bXNfZGVidWcgKDQsICJEU1RfU19DX1NFVF9BQlNfUEM6IDB4JXhcbiIsIGRhdGEpOwojZW5kaWYKCQkgIGJyZWFrOwoKCQlkZWZhdWx0OgoJCSAgaWYgKGNtZCA8PSAwKQoJCSAgICB7CgkJICAgICAgY3Vycl9wYyAtPSBjbWQ7CgkJICAgICAgY3Vycl9saW5lbnVtICs9IDE7CgkJICAgICAgY21kX2xlbmd0aCA9IDE7CiNpZiBWTVNfREVCVUcKCQkgICAgICBfYmZkX3Ztc19kZWJ1ZyAoNCwgImJ1bXAgcGMgdG8gMHglbGx4IGFuZCBsaW5lIHRvICVkXG4iLAoJCQkJICAgICAgY3Vycl9wYywgY3Vycl9saW5lbnVtKTsKI2VuZGlmCgkJICAgIH0KCQkgIGVsc2UKCQkgICAgewoJCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygidW5rbm93biBsaW5lIGNvbW1hbmQgJWQiKSwKCQkJCQkgICAgIGNtZCk7CgkJICAgICAgY21kX2xlbmd0aCA9IDI7CgkJICAgIH0KCQkgIGJyZWFrOwoJCX0KCgkgICAgICBpZiAoKGN1cnJfbGluZW51bSAhPSBwcmV2X2xpbnVtICYmIGN1cnJfcGMgIT0gcHJldl9wYykKCQkgIHx8IGNtZCA8PSAwCgkJICB8fCBjbWQgPT0gRFNUX1NfQ19ERUxUQV9QQ19MCgkJICB8fCBjbWQgPT0gRFNUX1NfQ19ERUxUQV9QQ19XKQoJCXsKCQkgIGxpbmUgPSAoc3RydWN0IGxpbmVpbmZvICopCgkJICAgIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGxpbmVpbmZvKSk7CgkJICBsaW5lLT5hZGRyZXNzID0gY3Vycl9wYzsKCQkgIGxpbmUtPmxpbmUgPSBjdXJyX2xpbmVudW07CgoJCSAgY3Vycl9saW5lLT5uZXh0ID0gbGluZTsKCQkgIGN1cnJfbGluZSA9IGxpbmU7CgoJCSAgcHJldl9saW51bSA9IGN1cnJfbGluZW51bTsKCQkgIHByZXZfcGMgPSBjdXJyX3BjOwojaWYgVk1TX0RFQlVHCgkJICBfYmZkX3Ztc19kZWJ1ZyAoNCwgIi0+IGNvcnJlbGF0ZSBwYyAweCVsbHggd2l0aCBsaW5lICVkXG4iLAoJCQkJICBjdXJyX3BjLCBjdXJyX2xpbmVudW0pOwojZW5kaWYKCQl9CgoJICAgICAgcGNsX3B0ciArPSBjbWRfbGVuZ3RoOwoJICAgIH0KCSAgYnJlYWs7CgoJY2FzZSAweDE3OiAvKiBVbmRvY3VtZW50ZWQgdHlwZSB1c2VkIGJ5IERFQyBDIHRvIGRlY2xhcmUgZXF1YXRlcy4gICovCiNpZiBWTVNfREVCVUcKCSAgX2JmZF92bXNfZGVidWcgKDMsICJ1bmRvY3VtZW50ZWQgdHlwZSAweDE3XG4iKTsKI2VuZGlmCgkgIGJyZWFrOwoKCWRlZmF1bHQ6CiNpZiBWTVNfREVCVUcKCSAgX2JmZF92bXNfZGVidWcgKDMsICJpZ25vcmluZyByZWNvcmRcbiIpOwojZW5kaWYKCSAgYnJlYWs7CgoJfQoKICAgICAgcHRyICs9IHJlY19sZW5ndGg7CiAgICB9CgogIC8qIEZpbmFsaXplIHRhYmxlcyB3aXRoIEVPTCBtYXJrZXIuICAqLwogIHNyZWMgPSAoc3RydWN0IHNyZWNpbmZvICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IHNyZWNpbmZvKSk7CiAgc3JlYy0+bGluZSA9ICh1bnNpZ25lZCBpbnQpIC0xOwogIHNyZWMtPnNyZWMgPSAodW5zaWduZWQgaW50KSAtMTsKICBjdXJyX3NyZWMtPm5leHQgPSBzcmVjOwoKICBsaW5lID0gKHN0cnVjdCBsaW5laW5mbyAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBsaW5laW5mbykpOwogIGxpbmUtPmxpbmUgPSAodW5zaWduZWQgaW50KSAtMTsKICBsaW5lLT5hZGRyZXNzID0gKGJmZF92bWEpIC0xOwogIGN1cnJfbGluZS0+bmV4dCA9IGxpbmU7CgogIC8qIEFkdmVydGlzZSB0aGF0IHRoaXMgbW9kdWxlIGhhcyBiZWVuIHBhcnNlZC4gIFRoaXMgaXMgbmVlZGVkCiAgICAgYmVjYXVzZSBwYXJzaW5nIGNhbiBiZSBlaXRoZXIgcGVyZm9ybWVkIGF0IG1vZHVsZSBjcmVhdGlvbgogICAgIG9yIGRlZmVycmVkIHVudGlsIGRlYnVnIGluZm8gaXMgY29uc3VtZWQuICAqLwogIFNFVF9NT0RVTEVfUEFSU0VEIChtb2R1bGUpOwp9CgovKiBCdWlsZCB0aGUgbGlzdCBvZiBtb2R1bGVzIGZvciB0aGUgc3BlY2lmaWVkIEJGRC4gICovCgpzdGF0aWMgc3RydWN0IG1vZHVsZSAqCmJ1aWxkX21vZHVsZV9saXN0IChiZmQgKmFiZmQpCnsKICBzdHJ1Y3QgbW9kdWxlICptb2R1bGUsICpsaXN0ID0gTlVMTDsKICBhc2VjdGlvbiAqZG10OwoKICBpZiAoKGRtdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiJERNVCQiKSkpCiAgICB7CiAgICAgIC8qIFdlIGhhdmUgYSBETVQgc2VjdGlvbiBzbyB0aGlzIG11c3QgYmUgYW4gaW1hZ2UuICBQYXJzZSB0aGUKCSBzZWN0aW9uIGFuZCBidWlsZCB0aGUgbGlzdCBvZiBtb2R1bGVzLiAgVGhpcyBpcyBzdWZmaWNpZW50Cgkgc2luY2Ugd2UgY2FuIGNvbXB1dGUgdGhlIHN0YXJ0IGFkZHJlc3MgYW5kIHRoZSBlbmQgYWRkcmVzcwoJIG9mIGV2ZXJ5IG1vZHVsZSBmcm9tIHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KICAgICAgYmZkX3NpemVfdHlwZSBzaXplID0gYmZkX2dldF9zZWN0aW9uX3NpemUgKGRtdCk7CiAgICAgIHVuc2lnbmVkIGNoYXIgKnB0ciwgKmVuZDsKCiAgICAgIHB0ciA9ICh1bnNpZ25lZCBjaGFyICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZSk7CiAgICAgIGlmICghIHB0cikKCXJldHVybiBOVUxMOwoKICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBkbXQsIHB0ciwgMCwgc2l6ZSkpCglyZXR1cm4gTlVMTDsKCiNpZiBWTVNfREVCVUcKICAgICAgX2JmZF92bXNfZGVidWcgKDIsICJETVRcbiIpOwojZW5kaWYKCiAgICAgIGVuZCA9IHB0ciArIHNpemU7CgogICAgICB3aGlsZSAocHRyIDwgZW5kKQoJewoJICAvKiBFYWNoIGhlYWRlciBkZWNsYXJlcyBhIG1vZHVsZSB3aXRoIGl0cyBzdGFydCBvZmZzZXQgYW5kIHNpemUKCSAgICAgb2YgZGVidWcgaW5mbyBpbiB0aGUgRFNUIHNlY3Rpb24sIGFzIHdlbGwgYXMgdGhlIGNvdW50IG9mCgkgICAgIHByb2dyYW0gc2VjdGlvbnMgKGkuZS4gYWRkcmVzcyBzcGFucykgaXQgY29udGFpbnMuICAqLwoJICBpbnQgbW9kYmVnID0gYmZkX2dldGwzMiAocHRyICsgREJHX1NfTF9ETVRfTU9EQkVHKTsKCSAgaW50IHNpemUgPSBiZmRfZ2V0bDMyIChwdHIgKyBEQkdfU19MX0RTVF9TSVpFKTsKCSAgaW50IGNvdW50ID0gYmZkX2dldGwxNiAocHRyICsgREJHX1NfV19ETVRfUFNFQ1RfQ09VTlQpOwoJICBwdHIgKz0gREJHX1NfQ19ETVRfSEVBREVSX1NJWkU7CgojaWYgVk1TX0RFQlVHCgkgIF9iZmRfdm1zX2RlYnVnICgzLCAibW9kdWxlOiBtb2RiZWcgPSAlZCwgc2l6ZSA9ICVkLCBjb3VudCA9ICVkXG4iLAoJCQkgIG1vZGJlZywgc2l6ZSwgY291bnQpOwojZW5kaWYKCgkgIC8qIFdlIGNyZWF0ZSBhICdtb2R1bGUnIHN0cnVjdHVyZSBmb3IgZWFjaCBwcm9ncmFtIHNlY3Rpb24gc2luY2UKCSAgICAgd2Ugb25seSBzdXBwb3J0IGNvbnRpZ3VvdXMgYWRkcmVzc2VzIGluIGEgJ21vZHVsZScgc3RydWN0dXJlLgoJICAgICBBcyBhIGNvbnNlcXVlbmNlLCB0aGUgYWN0dWFsIGRlYnVnIGluZm8gaW4gdGhlIERTVCBzZWN0aW9uIGlzCgkgICAgIHNoYXJlZCBhbmQgY2FuIGJlIHBhcnNlZCBtdWx0aXBsZSB0aW1lczsgdGhhdCBkb2Vzbid0IHNlZW0gdG8KCSAgICAgY2F1c2UgcHJvYmxlbXMgaW4gcHJhY3RpY2UuICAqLwoJICB3aGlsZSAoY291bnQtLSA+IDApCgkgICAgewoJICAgICAgaW50IHN0YXJ0ID0gYmZkX2dldGwzMiAocHRyICsgREJHX1NfTF9ETVRfUFNFQ1RfU1RBUlQpOwoJICAgICAgaW50IGxlbmd0aCA9IGJmZF9nZXRsMzIgKHB0ciArIERCR19TX0xfRE1UX1BTRUNUX0xFTkdUSCk7CgkgICAgICBtb2R1bGUgPSBuZXdfbW9kdWxlIChhYmZkKTsKCSAgICAgIG1vZHVsZS0+bW9kYmVnID0gbW9kYmVnOwoJICAgICAgbW9kdWxlLT5zaXplID0gc2l6ZTsKCSAgICAgIG1vZHVsZS0+bG93ID0gc3RhcnQ7CgkgICAgICBtb2R1bGUtPmhpZ2ggPSBzdGFydCArIGxlbmd0aDsKCSAgICAgIG1vZHVsZS0+bmV4dCA9IGxpc3Q7CgkgICAgICBsaXN0ID0gbW9kdWxlOwoJICAgICAgcHRyICs9IERCR19TX0NfRE1UX1BTRUNUX1NJWkU7CgojaWYgVk1TX0RFQlVHCgkgICAgICBfYmZkX3Ztc19kZWJ1ZyAoNCwgInNlY3Rpb246IHN0YXJ0ID0gMHgleCwgbGVuZ3RoID0gJWRcbiIsCgkJCSAgICAgIHN0YXJ0LCBsZW5ndGgpOwojZW5kaWYKCSAgICB9Cgl9CiAgICB9CiAgZWxzZQogICAgewogICAgICAvKiBXZSBkb24ndCBoYXZlIGEgRE1UIHNlY3Rpb24gc28gdGhpcyBtdXN0IGJlIGFuIG9iamVjdC4gIFBhcnNlCgkgdGhlIG1vZHVsZSByaWdodCBub3cgaW4gb3JkZXIgdG8gY29tcHV0ZSBpdHMgc3RhcnQgYWRkcmVzcyBhbmQKCSBlbmQgYWRkcmVzcy4gICovCiAgICAgIG1vZHVsZSA9IG5ld19tb2R1bGUgKGFiZmQpOwogICAgICBwYXJzZV9tb2R1bGUgKGFiZmQsIG1vZHVsZSwgUFJJViAoZHN0X3NlY3Rpb24pLT5jb250ZW50cywKCQkgICAgUFJJViAoZHN0X3B0cl9lbmQpIC0gUFJJViAoZHN0X3NlY3Rpb24pLT5jb250ZW50cyk7CiAgICAgIGxpc3QgPSBtb2R1bGU7CiAgICB9CgogIHJldHVybiBsaXN0Owp9CgovKiBDYWxjdWxhdGUgYW5kIHJldHVybiB0aGUgbmFtZSBvZiB0aGUgc291cmNlIGZpbGUgYW5kIHRoZSBsaW5lIG5lYXJlc3QKICAgdG8gdGhlIHdhbnRlZCBsb2NhdGlvbiBpbiB0aGUgc3BlY2lmaWVkIG1vZHVsZS4gICovCgpzdGF0aWMgYmZkX2Jvb2xlYW4KbW9kdWxlX2ZpbmRfbmVhcmVzdF9saW5lIChiZmQgKmFiZmQsIHN0cnVjdCBtb2R1bGUgKm1vZHVsZSwgYmZkX3ZtYSBhZGRyLAoJCQkgIGNvbnN0IGNoYXIgKipmaWxlLCBjb25zdCBjaGFyICoqZnVuYywgCgkJCSAgdW5zaWduZWQgaW50ICpsaW5lKQp7CiAgc3RydWN0IGZ1bmNpbmZvICpmdW5jaW5mbzsKICBzdHJ1Y3QgbGluZWluZm8gKmxpbmVpbmZvOwogIHN0cnVjdCBzcmVjaW5mbyAqc3JlY2luZm87CiAgYmZkX2Jvb2xlYW4gcmV0ID0gRkFMU0U7CgogIC8qIFBhcnNlIHRoaXMgbW9kdWxlIGlmIHRoYXQgd2FzIG5vdCBkb25lIGF0IG1vZHVsZSBjcmVhdGlvbi4gICovCiAgaWYgKCEgSVNfTU9EVUxFX1BBUlNFRCAobW9kdWxlKSkKICAgIHsKICAgICAgdW5zaWduZWQgaW50IHNpemUgPSBtb2R1bGUtPnNpemU7CiAgICAgIHVuc2lnbmVkIGludCBtb2RiZWcgPSBQUklWIChkc3Rfc2VjdGlvbiktPmZpbGVwb3MgKyBtb2R1bGUtPm1vZGJlZzsKICAgICAgdW5zaWduZWQgY2hhciAqYnVmZmVyID0gKHVuc2lnbmVkIGNoYXIgKikgYmZkX21hbGxvYyAobW9kdWxlLT5zaXplKTsKCiAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgbW9kYmVnLCBTRUVLX1NFVCkgIT0gMAoJICB8fCBiZmRfYnJlYWQgKGJ1ZmZlciwgc2l6ZSwgYWJmZCkgIT0gc2l6ZSkKCXsKCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX2RlYnVnX3NlY3Rpb24pOwoJICByZXR1cm4gRkFMU0U7Cgl9CgogICAgICBwYXJzZV9tb2R1bGUgKGFiZmQsIG1vZHVsZSwgYnVmZmVyLCBzaXplKTsKICAgICAgZnJlZSAoYnVmZmVyKTsKICAgIH0KCiAgLyogRmluZCBvdXQgdGhlIGZ1bmN0aW9uIChpZiBhbnkpIHRoYXQgY29udGFpbnMgdGhlIGFkZHJlc3MuICAqLwogIGZvciAoZnVuY2luZm8gPSBtb2R1bGUtPmZ1bmNfdGFibGU7IGZ1bmNpbmZvOyBmdW5jaW5mbyA9IGZ1bmNpbmZvLT5uZXh0KQogICAgaWYgKGFkZHIgPj0gZnVuY2luZm8tPmxvdyAmJiBhZGRyIDw9IGZ1bmNpbmZvLT5oaWdoKQogICAgICB7CiAgICAgICAgKmZ1bmMgPSBmdW5jaW5mby0+bmFtZTsKCXJldCA9IFRSVUU7CglicmVhazsKICAgICAgfQoKICAvKiBGaW5kIG91dCB0aGUgc291cmNlIGZpbGUgYW5kIHRoZSBsaW5lIG5lYXJlc3QgdG8gdGhlIGFkZHJlc3MuICAqLwogIGZvciAobGluZWluZm8gPSBtb2R1bGUtPmxpbmVfdGFibGU7IGxpbmVpbmZvOyBsaW5laW5mbyA9IGxpbmVpbmZvLT5uZXh0KQogICAgaWYgKGxpbmVpbmZvLT5uZXh0ICYmIGFkZHIgPCBsaW5laW5mby0+bmV4dC0+YWRkcmVzcykKICAgICAgewoJZm9yIChzcmVjaW5mbyA9IG1vZHVsZS0+c3JlY190YWJsZTsgc3JlY2luZm87IHNyZWNpbmZvID0gc3JlY2luZm8tPm5leHQpCgkgIGlmIChzcmVjaW5mby0+bmV4dCAmJiBsaW5laW5mby0+bGluZSA8IHNyZWNpbmZvLT5uZXh0LT5saW5lKQoJICAgIHsKCSAgICAgIGlmIChzcmVjaW5mby0+c2ZpbGUgPiAwKQoJCXsKCQkgICpmaWxlID0gbW9kdWxlLT5maWxlX3RhYmxlW3NyZWNpbmZvLT5zZmlsZV0ubmFtZTsKCQkgICpsaW5lID0gc3JlY2luZm8tPnNyZWMgKyBsaW5laW5mby0+bGluZSAtIHNyZWNpbmZvLT5saW5lOwoJCX0KCSAgICAgIGVsc2UKCQl7CgkJICAqZmlsZSA9IG1vZHVsZS0+bmFtZTsKCQkgICpsaW5lID0gbGluZWluZm8tPmxpbmU7CgkJfQoJICAgICAgcmV0dXJuIFRSVUU7CgkgICAgfQoKCWJyZWFrOwogICAgICB9CgogIHJldHVybiByZXQ7Cn0KCi8qIFByb3ZpZGVkIGEgQkZELCBhIHNlY3Rpb24gYW5kIGFuIG9mZnNldCBpbnRvIHRoZSBzZWN0aW9uLCBjYWxjdWxhdGUgYW5kCiAgIHJldHVybiB0aGUgbmFtZSBvZiB0aGUgc291cmNlIGZpbGUgYW5kIHRoZSBsaW5lIG5lYXJlc3QgdG8gdGhlIHdhbnRlZAogICBsb2NhdGlvbi4gICovCgpiZmRfYm9vbGVhbgpfYmZkX3Ztc19maW5kX25lYXJlc3RfZHN0X2xpbmUgKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlY3Rpb24sCgkJCQlhc3ltYm9sICoqc3ltYm9scyBBVFRSSUJVVEVfVU5VU0VELAoJCQkJYmZkX3ZtYSBvZmZzZXQsIGNvbnN0IGNoYXIgKipmaWxlLAoJCQkJY29uc3QgY2hhciAqKmZ1bmMsIHVuc2lnbmVkIGludCAqbGluZSkKewogIHN0cnVjdCBtb2R1bGUgKm1vZHVsZTsKCiAgLyogV2hhdCBhZGRyZXNzIGFyZSB3ZSBsb29raW5nIGZvcj8gICovCiAgYmZkX3ZtYSBhZGRyID0gc2VjdGlvbi0+dm1hICsgb2Zmc2V0OwoKICAqZmlsZSA9IE5VTEw7CiAgKmZ1bmMgPSBOVUxMOwogICpsaW5lID0gMDsKCiAgaWYgKFBSSVYgKGRzdF9zZWN0aW9uKSA9PSBOVUxMKQogICAgcmV0dXJuIEZBTFNFOwoKICBpZiAoUFJJViAobW9kdWxlcykgPT0gTlVMTCkKICAgIHsKICAgICAgUFJJViAobW9kdWxlcykgPSBidWlsZF9tb2R1bGVfbGlzdCAoYWJmZCk7CiAgICAgIGlmIChQUklWIChtb2R1bGVzKSA9PSBOVUxMKQogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KCiAgZm9yIChtb2R1bGUgPSBQUklWIChtb2R1bGVzKTsgbW9kdWxlOyBtb2R1bGUgPSBtb2R1bGUtPm5leHQpCiAgICBpZiAoYWRkciA+PSBtb2R1bGUtPmxvdyAmJiBhZGRyIDw9IG1vZHVsZS0+aGlnaCkKICAgICAgcmV0dXJuIG1vZHVsZV9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgbW9kdWxlLCBhZGRyLCBmaWxlLCBmdW5jLCBsaW5lKTsKCiAgcmV0dXJuIEZBTFNFOwp9CgovKiBQcm9jZXNzIEVEQkcvRVRCVCByZWNvcmQuCiAgIFJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yICAqLwoKc3RhdGljIGludAp2bXNfc2x1cnBfZGVidWcgKGJmZCAqYWJmZCkKewogIGlmIChQUklWIChkc3Rfc2VjdGlvbikgPT0gTlVMTCkKICAgIHsKICAgICAgLyogV2UgaGF2ZSBubyB3YXkgdG8gZmluZCBvdXQgYmVmb3JlaGFuZCBob3cgbXVjaCBkZWJ1ZyBpbmZvIHRoZXJlCgkgaXMgaW4gYW4gb2JqZWN0IGZpbGUsIHNvIHBpY2sgYW4gaW5pdGlhbCBhbW91bnQgYW5kIGdyb3cgaXQgYXMKCSBuZWVkZWQgbGF0ZXIuICAqLwogICAgICBmbGFnd29yZCBmbGFncyA9IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfREVCVUdHSU5HIHwgU0VDX1JFTE9DOwogICAgICBhc2VjdGlvbiAqc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIkRFNUJCIpOwogICAgICBpZiAoIXNlY3Rpb24pCglyZXR1cm4gLTE7CiAgICAgIHNlY3Rpb24tPnNpemUgPSAxMDI0OwogICAgICBpZiAoIWJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjdGlvbiwgZmxhZ3MpKQoJcmV0dXJuIC0xOwogICAgICBzZWN0aW9uLT5jb250ZW50cyA9ICgodW5zaWduZWQgY2hhciAqKQoJCQkgICBiZmRfem1hbGxvYyAoc2VjdGlvbi0+c2l6ZSkpOwogICAgICBpZiAoc2VjdGlvbi0+Y29udGVudHMgPT0gTlVMTCkKCXJldHVybiAtMTsKICAgICAgc2VjdGlvbi0+ZmlsZXBvcyA9ICh1bnNpZ25lZCBpbnQpLTE7CiAgICAgIFBSSVYgKGRzdF9zZWN0aW9uKSA9IHNlY3Rpb247CiAgICB9CgogIFBSSVYgKGltYWdlX3NlY3Rpb24pID0gUFJJViAoZHN0X3NlY3Rpb24pOwogIFBSSVYgKGltYWdlX3B0cikgPSBQUklWIChkc3Rfc2VjdGlvbiktPmNvbnRlbnRzOwogCiAgcmV0dXJuIF9iZmRfdm1zX3NsdXJwX3RpciAoYWJmZCwgRU9CSl9TX0NfRVRJUik7Cn0KCi8qIFByb2Nlc3MgREJHL0VEQkcgcmVjb3JkLgogICBSZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvci4gICovCgppbnQKX2JmZF92bXNfc2x1cnBfZGJnIChiZmQgKmFiZmQsIGludCBvYmp0eXBlIEFUVFJJQlVURV9VTlVTRUQpCnsKI2lmIFZNU19ERUJVRwogIF9iZmRfdm1zX2RlYnVnICgyLCAiREJHL0VEQkdcbiIpOwojZW5kaWYKCiAgYWJmZC0+ZmxhZ3MgfD0gKEhBU19ERUJVRyB8IEhBU19MSU5FTk8pOwoKICByZXR1cm4gdm1zX3NsdXJwX2RlYnVnIChhYmZkKTsKfQoKLyogUHJvY2VzcyBUQlQvRVRCVCByZWNvcmQuCiAgIFJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yLiAgKi8KCmludApfYmZkX3Ztc19zbHVycF90YnQgKGJmZCAqYWJmZCwgaW50IG9ianR5cGUgQVRUUklCVVRFX1VOVVNFRCkKewojaWYgVk1TX0RFQlVHCiAgX2JmZF92bXNfZGVidWcgKDIsICJUQlQvRVRCVFxuIik7CiNlbmRpZgoKICBhYmZkLT5mbGFncyB8PSBIQVNfTElORU5POwoKICByZXR1cm4gdm1zX3NsdXJwX2RlYnVnIChhYmZkKTsKfQoKLyogV3JpdGUgREJHL0VEQkcgcmVjb3JkLiAgKi8KCmludApfYmZkX3Ztc193cml0ZV9kYmcgKGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgb2JqdHlwZSBBVFRSSUJVVEVfVU5VU0VEKQp7CiNpZiBWTVNfREVCVUcKICBfYmZkX3Ztc19kZWJ1ZyAoMiwgInZtc193cml0ZV9kYmcgKCVwLCBvYmp0eXBlKVxuIiwgYWJmZCwgb2JqdHlwZSk7CiNlbmRpZgoKICByZXR1cm4gMDsKfQoKLyogV3JpdGUgVEJUL0VUQlQgcmVjb3JkLiAgKi8KCmludApfYmZkX3Ztc193cml0ZV90YnQgKGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgb2JqdHlwZSBBVFRSSUJVVEVfVU5VU0VEKQp7CiNpZiBWTVNfREVCVUcKICBfYmZkX3Ztc19kZWJ1ZyAoMiwgInZtc193cml0ZV90YnQgKCVwLCAlZClcbiIsIGFiZmQsIG9ianR5cGUpOwojZW5kaWYKCiAgcmV0dXJuIDA7Cn0K